From 5e3c122e6c1fb35ed1a2cb0b76e62a519251fb33 Mon Sep 17 00:00:00 2001 From: Tomasz Fujak Date: Thu, 2 Sep 2010 16:59:16 +0900 Subject: [PATCH] Initial commit --- AUTHORS | 40 + COPYING | 482 + ChangeLog | 14907 +++++++++ ChangeLog.pre-1-2 | 2880 ++ ChangeLog.pre-2-0 | 7225 +++++ ChangeLog.pre-2-10 | 1368 + ChangeLog.pre-2-12 | 738 + ChangeLog.pre-2-14 | 1963 ++ ChangeLog.pre-2-16 | 1794 ++ ChangeLog.pre-2-18 | 1738 + ChangeLog.pre-2-2 | 1502 + ChangeLog.pre-2-20 | 914 + ChangeLog.pre-2-4 | 2042 ++ ChangeLog.pre-2-6 | 1683 + ChangeLog.pre-2-8 | 1483 + HACKING | 34 + INSTALL.in | 122 + MAINTAINERS | 12 + Makefile.am | 152 + Makefile.decl | 61 + Makefile.in | 1215 + NEWS | 3694 +++ NEWS.pre-1-3 | 211 + README | 221 + README.commits | 72 + README.in | 221 + README.win32 | 340 + acglib.m4 | 131 + acinclude.m4 | 452 + aclocal.m4 | 9478 ++++++ autogen.sh | 109 + build/ChangeLog | 591 + build/Makefile.am | 7 + build/Makefile.in | 669 + build/README | 2 + build/win32/Makefile.am | 7 + build/win32/Makefile.in | 669 + build/win32/dirent/Makefile.am | 9 + build/win32/dirent/Makefile.in | 467 + build/win32/dirent/README | 2 + build/win32/dirent/dirent-zip | 19 + build/win32/dirent/dirent.c | 341 + build/win32/dirent/dirent.h | 127 + build/win32/dirent/makefile.msc | 16 + build/win32/dirent/wdirent.c | 3 + build/win32/make.msc | 237 + build/win32/module.defs | 124 + build/win32/vs9/Makefile.am | 17 + build/win32/vs9/Makefile.in | 477 + build/win32/vs9/README.txt | 38 + build/win32/vs9/gio.vcproj | 332 + build/win32/vs9/gio.vcprojin | 234 + build/win32/vs9/glib-genmarshal.vcproj | 161 + build/win32/vs9/glib.sln | 152 + build/win32/vs9/glib.vcproj | 362 + build/win32/vs9/glib.vcprojin | 299 + build/win32/vs9/glib.vsprops | 259 + build/win32/vs9/gmodule.vcproj | 221 + build/win32/vs9/gobject.vcproj | 233 + build/win32/vs9/gobject.vcprojin | 218 + build/win32/vs9/gspawn-win32-helper-console.vcproj | 163 + build/win32/vs9/gspawn-win32-helper.vcproj | 163 + build/win32/vs9/gthread.vcproj | 181 + build/win32/vs9/install.vcproj | 77 + build/win32/vs9/testglib.vcproj | 161 + compile | 143 + config.guess | 1501 + config.h.in | 732 + config.h.win32.in | 819 + config.sub | 1705 + configure | 31407 +++++++++++++++++++ configure.in | 3585 +++ debian/changelog | 1523 + debian/compat | 1 + debian/control | 121 + debian/control.in | 121 + debian/copyright | 52 + debian/docs | 6 + debian/libgio-fam.install | 1 + debian/libglib2.0-0-dbg.links | 1 + debian/libglib2.0-0-refdbg.install | 2 + debian/libglib2.0-0.install | 2 + debian/libglib2.0-0.symbols | 2387 ++ debian/libglib2.0-data.install | 1 + debian/libglib2.0-data.links | 1 + debian/libglib2.0-dbg.install | 1 + debian/libglib2.0-dev.README.Debian | 15 + debian/libglib2.0-dev.install | 12 + debian/libglib2.0-dev.links | 2 + debian/libglib2.0-doc.doc-base.gio | 14 + debian/libglib2.0-doc.doc-base.glib | 12 + debian/libglib2.0-doc.doc-base.gobject | 15 + debian/libglib2.0-doc.install | 1 + debian/libglib2.0-doc.links | 4 + debian/libglib2.0-udeb.install | 2 + debian/lintian-overrides/libglib2.0-0-refdbg | 1 + debian/patches/01_gettext-desktopfiles.patch | 145 + .../patches/02_gettext-desktopfiles-ubuntu.patch | 40 + debian/patches/03_blacklist-directories.patch | 24 + debian/patches/04_homedir_env.patch | 59 + .../60_wait-longer-for-threads-to-die.patch | 26 + debian/patches/series | 5 + debian/rules | 253 + debian/watch | 4 + depcomp | 630 + docs/Makefile.am | 11 + docs/Makefile.in | 729 + docs/debugging.txt | 41 + docs/macros.txt | 81 + docs/reference/AUTHORS | 7 + docs/reference/COPYING | 30 + docs/reference/ChangeLog | 4152 +++ docs/reference/Makefile.am | 3 + docs/reference/Makefile.in | 724 + docs/reference/NEWS | 0 docs/reference/README | 63 + docs/reference/gio/Makefile.am | 125 + docs/reference/gio/Makefile.in | 853 + docs/reference/gio/gio-docs.xml | 170 + docs/reference/gio/gio-overrides.txt | 0 docs/reference/gio/gio-sections.txt | 2077 ++ docs/reference/gio/gio.types | 105 + docs/reference/gio/gvfs-overview.png | Bin 0 -> 48474 bytes docs/reference/gio/html/GAppInfo.html | 1383 + docs/reference/gio/html/GAsyncInitable.html | 552 + docs/reference/gio/html/GAsyncResult.html | 322 + docs/reference/gio/html/GBufferedInputStream.html | 579 + docs/reference/gio/html/GBufferedOutputStream.html | 317 + docs/reference/gio/html/GCancellable.html | 606 + docs/reference/gio/html/GCharsetConverter.html | 267 + docs/reference/gio/html/GConverter.html | 412 + docs/reference/gio/html/GDataInputStream.html | 990 + docs/reference/gio/html/GDataOutputStream.html | 560 + docs/reference/gio/html/GDrive.html | 1412 + docs/reference/gio/html/GEmblem.html | 295 + docs/reference/gio/html/GEmblemedIcon.html | 230 + docs/reference/gio/html/GFile.html | 7337 +++++ docs/reference/gio/html/GFileDescriptorBased.html | 142 + docs/reference/gio/html/GFileEnumerator.html | 538 + docs/reference/gio/html/GFileIOStream.html | 336 + docs/reference/gio/html/GFileIcon.html | 180 + docs/reference/gio/html/GFileInfo.html | 3001 ++ docs/reference/gio/html/GFileInputStream.html | 287 + docs/reference/gio/html/GFileMonitor.html | 375 + docs/reference/gio/html/GFileOutputStream.html | 325 + docs/reference/gio/html/GFilenameCompleter.html | 240 + docs/reference/gio/html/GFilterInputStream.html | 207 + docs/reference/gio/html/GFilterOutputStream.html | 208 + docs/reference/gio/html/GIOModule.html | 283 + docs/reference/gio/html/GIOStream.html | 498 + docs/reference/gio/html/GIcon.html | 352 + docs/reference/gio/html/GInetAddress.html | 717 + docs/reference/gio/html/GInetSocketAddress.html | 220 + docs/reference/gio/html/GInitable.html | 411 + docs/reference/gio/html/GInputStream.html | 822 + docs/reference/gio/html/GLoadableIcon.html | 325 + docs/reference/gio/html/GMemoryInputStream.html | 210 + docs/reference/gio/html/GMemoryOutputStream.html | 363 + docs/reference/gio/html/GMount.html | 1462 + docs/reference/gio/html/GMountOperation.html | 848 + docs/reference/gio/html/GNetworkAddress.html | 287 + docs/reference/gio/html/GNetworkService.html | 272 + docs/reference/gio/html/GOutputStream.html | 1015 + docs/reference/gio/html/GResolver.html | 799 + docs/reference/gio/html/GSeekable.html | 372 + docs/reference/gio/html/GSimpleAsyncResult.html | 984 + docs/reference/gio/html/GSocket.html | 2125 ++ docs/reference/gio/html/GSocketAddress.html | 319 + docs/reference/gio/html/GSocketClient.html | 939 + docs/reference/gio/html/GSocketConnectable.html | 389 + docs/reference/gio/html/GSocketConnection.html | 561 + docs/reference/gio/html/GSocketControlMessage.html | 297 + docs/reference/gio/html/GSocketListener.html | 752 + docs/reference/gio/html/GSocketService.html | 281 + docs/reference/gio/html/GThemedIcon.html | 362 + .../reference/gio/html/GThreadedSocketService.html | 223 + docs/reference/gio/html/GUnixFDList.html | 403 + docs/reference/gio/html/GUnixFDMessage.html | 304 + docs/reference/gio/html/GUnixInputStream.html | 257 + docs/reference/gio/html/GUnixOutputStream.html | 257 + docs/reference/gio/html/GUnixSocketAddress.html | 328 + docs/reference/gio/html/GVfs.html | 294 + docs/reference/gio/html/GVolume.html | 1031 + docs/reference/gio/html/GVolumeMonitor.html | 717 + docs/reference/gio/html/GZlibCompressor.html | 206 + docs/reference/gio/html/GZlibDecompressor.html | 155 + docs/reference/gio/html/api-index-2-18.html | 135 + docs/reference/gio/html/api-index-2-20.html | 133 + docs/reference/gio/html/api-index-2-22.html | 610 + docs/reference/gio/html/api-index-2-24.html | 164 + docs/reference/gio/html/api-index-deprecated.html | 101 + docs/reference/gio/html/api-index-full.html | 2323 ++ docs/reference/gio/html/async.html | 74 + docs/reference/gio/html/ch01.html | 201 + docs/reference/gio/html/ch02.html | 75 + docs/reference/gio/html/ch03.html | 110 + docs/reference/gio/html/ch19.html | 105 + docs/reference/gio/html/ch20.html | 206 + docs/reference/gio/html/ch20s02.html | 71 + docs/reference/gio/html/ch20s03.html | 69 + docs/reference/gio/html/conversion.html | 74 + docs/reference/gio/html/extending-gio.html | 126 + docs/reference/gio/html/extending.html | 71 + .../gio/html/failable_initialization.html | 68 + docs/reference/gio/html/file_mon.html | 63 + docs/reference/gio/html/file_ops.html | 80 + .../gio/html/gio-Desktop-file-based-GAppInfo.html | 358 + docs/reference/gio/html/gio-Extension-Points.html | 458 + docs/reference/gio/html/gio-GContentType.html | 399 + .../gio/html/gio-GConverterInputstream.html | 189 + .../gio/html/gio-GConverterOutputstream.html | 189 + docs/reference/gio/html/gio-GFileAttribute.html | 944 + docs/reference/gio/html/gio-GIOError.html | 354 + docs/reference/gio/html/gio-GIOScheduler.html | 319 + docs/reference/gio/html/gio-GSrvTarget.html | 333 + docs/reference/gio/html/gio-Unix-Mounts.html | 911 + docs/reference/gio/html/gio-hierarchy.html | 137 + docs/reference/gio/html/gio.devhelp | 1235 + docs/reference/gio/html/gio.devhelp2 | 1384 + docs/reference/gio/html/gvfs-overview.png | Bin 0 -> 48474 bytes docs/reference/gio/html/highlevel-socket.html | 77 + docs/reference/gio/html/home.png | Bin 0 -> 654 bytes docs/reference/gio/html/icons.html | 80 + docs/reference/gio/html/index.html | 348 + docs/reference/gio/html/index.sgml | 1796 ++ docs/reference/gio/html/left.png | Bin 0 -> 459 bytes docs/reference/gio/html/migrating.html | 72 + docs/reference/gio/html/networking.html | 87 + docs/reference/gio/html/pt01.html | 69 + docs/reference/gio/html/pt02.html | 323 + docs/reference/gio/html/resolver.html | 77 + docs/reference/gio/html/right.png | Bin 0 -> 472 bytes docs/reference/gio/html/streaming.html | 122 + docs/reference/gio/html/style.css | 257 + docs/reference/gio/html/types.html | 71 + docs/reference/gio/html/up.png | Bin 0 -> 406 bytes docs/reference/gio/html/utils.html | 63 + docs/reference/gio/html/volume_mon.html | 77 + docs/reference/gio/migrating.xml | 162 + docs/reference/gio/overview.xml | 352 + docs/reference/gio/tmpl/extensionpoints.sgml | 134 + docs/reference/gio/tmpl/gappinfo.sgml | 378 + docs/reference/gio/tmpl/gasyncinitable.sgml | 110 + docs/reference/gio/tmpl/gasyncresult.sgml | 62 + docs/reference/gio/tmpl/gbufferedinputstream.sgml | 145 + docs/reference/gio/tmpl/gbufferedoutputstream.sgml | 90 + docs/reference/gio/tmpl/gcancellable.sgml | 147 + docs/reference/gio/tmpl/gcharsetconverter.sgml | 78 + docs/reference/gio/tmpl/gcontenttype.sgml | 122 + docs/reference/gio/tmpl/gconverter.sgml | 69 + docs/reference/gio/tmpl/gconverterinputstream.sgml | 49 + .../reference/gio/tmpl/gconverteroutputstream.sgml | 49 + docs/reference/gio/tmpl/gdatainputstream.sgml | 250 + docs/reference/gio/tmpl/gdataoutputstream.sgml | 153 + docs/reference/gio/tmpl/gdesktopappinfo.sgml | 101 + docs/reference/gio/tmpl/gdrive.sgml | 360 + docs/reference/gio/tmpl/gemblem.sgml | 82 + docs/reference/gio/tmpl/gemblemedicon.sgml | 62 + docs/reference/gio/tmpl/gfile.sgml | 1522 + docs/reference/gio/tmpl/gfileattribute.sgml | 125 + docs/reference/gio/tmpl/gfiledescriptorbased.sgml | 34 + docs/reference/gio/tmpl/gfileenumerator.sgml | 135 + docs/reference/gio/tmpl/gfileicon.sgml | 48 + docs/reference/gio/tmpl/gfileinfo.sgml | 1189 + docs/reference/gio/tmpl/gfileinputstream.sgml | 61 + docs/reference/gio/tmpl/gfileiostream.sgml | 70 + docs/reference/gio/tmpl/gfilemonitor.sgml | 97 + docs/reference/gio/tmpl/gfilenamecompleter.sgml | 69 + docs/reference/gio/tmpl/gfileoutputstream.sgml | 70 + docs/reference/gio/tmpl/gfilterinputstream.sgml | 62 + docs/reference/gio/tmpl/gfilteroutputstream.sgml | 62 + docs/reference/gio/tmpl/gicon.sgml | 74 + docs/reference/gio/tmpl/ginetaddress.sgml | 248 + docs/reference/gio/tmpl/ginetsocketaddress.sgml | 63 + docs/reference/gio/tmpl/ginitable.sgml | 83 + docs/reference/gio/tmpl/ginputstream.sgml | 183 + docs/reference/gio/tmpl/gio-unused.sgml | 0 docs/reference/gio/tmpl/gioerror.sgml | 77 + docs/reference/gio/tmpl/giomodule.sgml | 75 + docs/reference/gio/tmpl/gioscheduler.sgml | 78 + docs/reference/gio/tmpl/giostream.sgml | 128 + docs/reference/gio/tmpl/gloadableicon.sgml | 72 + docs/reference/gio/tmpl/gmemoryinputstream.sgml | 55 + docs/reference/gio/tmpl/gmemoryoutputstream.sgml | 99 + docs/reference/gio/tmpl/gmount.sgml | 352 + docs/reference/gio/tmpl/gmountoperation.sgml | 254 + docs/reference/gio/tmpl/gnetworkaddress.sgml | 74 + docs/reference/gio/tmpl/gnetworkservice.sgml | 78 + docs/reference/gio/tmpl/goutputstream.sgml | 237 + docs/reference/gio/tmpl/gresolver.sgml | 189 + docs/reference/gio/tmpl/gseekable.sgml | 89 + docs/reference/gio/tmpl/gsimpleasyncresult.sgml | 253 + docs/reference/gio/tmpl/gsocket.sgml | 485 + docs/reference/gio/tmpl/gsocketaddress.sgml | 80 + docs/reference/gio/tmpl/gsocketclient.sgml | 234 + docs/reference/gio/tmpl/gsocketconnectable.sgml | 81 + docs/reference/gio/tmpl/gsocketconnection.sgml | 148 + docs/reference/gio/tmpl/gsocketcontrolmessage.sgml | 73 + docs/reference/gio/tmpl/gsocketlistener.sgml | 175 + docs/reference/gio/tmpl/gsocketservice.sgml | 68 + docs/reference/gio/tmpl/gsrvtarget.sgml | 99 + docs/reference/gio/tmpl/gthemedicon.sgml | 95 + .../reference/gio/tmpl/gthreadedsocketservice.sgml | 49 + docs/reference/gio/tmpl/gunixfdlist.sgml | 94 + docs/reference/gio/tmpl/gunixfdmessage.sgml | 77 + docs/reference/gio/tmpl/gunixinputstream.sgml | 72 + docs/reference/gio/tmpl/gunixmounts.sgml | 327 + docs/reference/gio/tmpl/gunixoutputstream.sgml | 72 + docs/reference/gio/tmpl/gunixsocketaddress.sgml | 94 + docs/reference/gio/tmpl/gvfs.sgml | 96 + docs/reference/gio/tmpl/gvolume.sgml | 271 + docs/reference/gio/tmpl/gvolumemonitor.sgml | 192 + docs/reference/gio/tmpl/gzcompressor.sgml | 54 + docs/reference/gio/tmpl/gzdecompressor.sgml | 39 + docs/reference/gio/version.xml.in | 1 + docs/reference/glib/Makefile.am | 110 + docs/reference/glib/Makefile.in | 911 + docs/reference/glib/building.sgml | 585 + docs/reference/glib/changes.sgml | 182 + docs/reference/glib/compiling.sgml | 97 + docs/reference/glib/cross.sgml | 199 + docs/reference/glib/file-name-encodings.png | Bin 0 -> 32141 bytes docs/reference/glib/file-name-encodings.sxd | Bin 0 -> 7006 bytes docs/reference/glib/glib-docs.sgml | 192 + docs/reference/glib/glib-gettextize.1 | 51 + docs/reference/glib/glib-gettextize.xml | 76 + docs/reference/glib/glib-overrides.txt | 307 + docs/reference/glib/glib-sections.txt | 2919 ++ docs/reference/glib/glib.types | 0 docs/reference/glib/gtester-report.1 | 44 + docs/reference/glib/gtester-report.xml | 54 + docs/reference/glib/gtester.1 | 101 + docs/reference/glib/gtester.xml | 120 + docs/reference/glib/gvariant-varargs.xml | 970 + docs/reference/glib/html/api-index-2-10.html | 140 + docs/reference/glib/html/api-index-2-12.html | 206 + docs/reference/glib/html/api-index-2-14.html | 333 + docs/reference/glib/html/api-index-2-16.html | 234 + docs/reference/glib/html/api-index-2-18.html | 98 + docs/reference/glib/html/api-index-2-2.html | 112 + docs/reference/glib/html/api-index-2-20.html | 87 + docs/reference/glib/html/api-index-2-22.html | 150 + docs/reference/glib/html/api-index-2-24.html | 253 + docs/reference/glib/html/api-index-2-4.html | 255 + docs/reference/glib/html/api-index-2-6.html | 261 + docs/reference/glib/html/api-index-2-8.html | 132 + docs/reference/glib/html/api-index-deprecated.html | 226 + docs/reference/glib/html/api-index-full.html | 3987 +++ docs/reference/glib/html/file-name-encodings.png | Bin 0 -> 32141 bytes docs/reference/glib/html/glib-Arrays.html | 848 + .../glib/html/glib-Asynchronous-Queues.html | 799 + .../glib/html/glib-Atomic-Operations.html | 312 + .../html/glib-Automatic-String-Completion.html | 438 + .../glib/html/glib-Balanced-Binary-Trees.html | 800 + docs/reference/glib/html/glib-Base64-Encoding.html | 385 + docs/reference/glib/html/glib-Basic-Types.html | 520 + .../glib/html/glib-Bookmark-file-parser.html | 2006 ++ docs/reference/glib/html/glib-Byte-Arrays.html | 542 + .../glib/html/glib-Byte-Order-Macros.html | 1706 + docs/reference/glib/html/glib-Caches.html | 407 + .../glib/html/glib-Character-Set-Conversion.html | 1191 + .../glib/html/glib-Commandline-option-parser.html | 1603 + docs/reference/glib/html/glib-Data-Checksums.html | 467 + docs/reference/glib/html/glib-Datasets.html | 522 + .../glib/html/glib-Date-and-Time-Functions.html | 2030 ++ .../glib/html/glib-Double-ended-Queues.html | 1251 + .../glib/html/glib-Doubly-Linked-Lists.html | 1354 + .../glib/html/glib-Dynamic-Loading-of-Modules.html | 526 + docs/reference/glib/html/glib-Error-Reporting.html | 862 + docs/reference/glib/html/glib-File-Utilities.html | 1783 ++ docs/reference/glib/html/glib-GVariant.html | 3639 +++ docs/reference/glib/html/glib-GVariantType.html | 1772 ++ .../html/glib-Glob-style-pattern-matching.html | 304 + docs/reference/glib/html/glib-Hash-Tables.html | 1470 + docs/reference/glib/html/glib-Hook-Functions.html | 1386 + .../glib/html/glib-Hostname-Utilities.html | 243 + docs/reference/glib/html/glib-I18N.html | 583 + docs/reference/glib/html/glib-IO-Channels.html | 2165 ++ .../glib/html/glib-Key-value-file-parser.html | 2514 ++ .../reference/glib/html/glib-Keyed-Data-Lists.html | 602 + docs/reference/glib/html/glib-Lexical-Scanner.html | 1481 + .../glib/html/glib-Limits-of-Basic-Types.html | 409 + .../glib/html/glib-Memory-Allocation.html | 1036 + .../glib/html/glib-Memory-Allocators.html | 157 + docs/reference/glib/html/glib-Memory-Chunks.html | 646 + docs/reference/glib/html/glib-Memory-Slices.html | 485 + docs/reference/glib/html/glib-Message-Logging.html | 688 + .../glib/html/glib-Miscellaneous-Macros.html | 989 + .../html/glib-Miscellaneous-Utility-Functions.html | 1493 + docs/reference/glib/html/glib-N-ary-Trees.html | 1434 + .../glib/html/glib-Numerical-Definitions.html | 243 + .../glib-Perl-compatible-regular-expressions.html | 2529 ++ docs/reference/glib/html/glib-Pointer-Arrays.html | 726 + docs/reference/glib/html/glib-Quarks.html | 281 + docs/reference/glib/html/glib-Random-Numbers.html | 578 + .../glib/html/glib-Relations-and-Tuples.html | 488 + docs/reference/glib/html/glib-Sequences.html | 1334 + .../glib/html/glib-Shell-related-Utilities.html | 253 + .../glib/html/glib-Simple-XML-Subset-Parser.html | 1178 + .../glib/html/glib-Singly-Linked-Lists.html | 1166 + .../glib/html/glib-Spawning-Processes.html | 936 + docs/reference/glib/html/glib-Standard-Macros.html | 478 + docs/reference/glib/html/glib-String-Chunks.html | 313 + .../glib/html/glib-String-Utility-Functions.html | 2899 ++ docs/reference/glib/html/glib-Strings.html | 1277 + docs/reference/glib/html/glib-Testing.html | 1677 + .../glib/html/glib-The-Main-Event-Loop.html | 3199 ++ docs/reference/glib/html/glib-Thread-Pools.html | 610 + docs/reference/glib/html/glib-Threads.html | 2986 ++ docs/reference/glib/html/glib-Timers.html | 254 + docs/reference/glib/html/glib-Trash-Stacks.html | 208 + .../glib/html/glib-Type-Conversion-Macros.html | 252 + docs/reference/glib/html/glib-URI-Functions.html | 322 + .../glib/html/glib-Unicode-Manipulation.html | 3307 ++ .../glib/html/glib-Version-Information.html | 159 + .../glib/html/glib-Warnings-and-Assertions.html | 431 + .../html/glib-Windows-Compatibility-Functions.html | 488 + docs/reference/glib/html/glib-building.html | 458 + docs/reference/glib/html/glib-changes.html | 179 + docs/reference/glib/html/glib-compiling.html | 138 + docs/reference/glib/html/glib-core.html | 84 + docs/reference/glib/html/glib-cross-compiling.html | 180 + docs/reference/glib/html/glib-data-types.html | 140 + docs/reference/glib/html/glib-fundamentals.html | 79 + docs/reference/glib/html/glib-gettextize.html | 113 + docs/reference/glib/html/glib-regex-syntax.html | 2415 ++ docs/reference/glib/html/glib-resources.html | 141 + docs/reference/glib/html/glib-running.html | 322 + docs/reference/glib/html/glib-utilities.html | 132 + docs/reference/glib/html/glib.devhelp | 2084 ++ docs/reference/glib/html/glib.devhelp2 | 2556 ++ docs/reference/glib/html/glib.html | 100 + docs/reference/glib/html/gtester-report.html | 92 + docs/reference/glib/html/gtester.html | 151 + .../glib/html/gvariant-format-strings.html | 947 + docs/reference/glib/html/home.png | Bin 0 -> 654 bytes docs/reference/glib/html/index.html | 356 + docs/reference/glib/html/index.sgml | 2718 ++ docs/reference/glib/html/left.png | Bin 0 -> 459 bytes docs/reference/glib/html/mainloop-states.gif | Bin 0 -> 7088 bytes docs/reference/glib/html/right.png | Bin 0 -> 472 bytes docs/reference/glib/html/style.css | 257 + docs/reference/glib/html/tools.html | 61 + docs/reference/glib/html/up.png | Bin 0 -> 406 bytes docs/reference/glib/mainloop-states.eps | 306 + docs/reference/glib/mainloop-states.fig | 65 + docs/reference/glib/mainloop-states.gif | Bin 0 -> 7088 bytes docs/reference/glib/mainloop-states.png | Bin 0 -> 15258 bytes docs/reference/glib/regex-syntax.sgml | 2708 ++ docs/reference/glib/resources.sgml | 115 + docs/reference/glib/running.sgml | 325 + docs/reference/glib/tmpl/allocators.sgml | 45 + docs/reference/glib/tmpl/arrays.sgml | 220 + docs/reference/glib/tmpl/arrays_byte.sgml | 155 + docs/reference/glib/tmpl/arrays_pointer.sgml | 197 + docs/reference/glib/tmpl/async_queues.sgml | 242 + docs/reference/glib/tmpl/atomic_operations.sgml | 191 + docs/reference/glib/tmpl/base64.sgml | 90 + docs/reference/glib/tmpl/bookmarkfile.sgml | 552 + docs/reference/glib/tmpl/byte_order.sgml | 625 + docs/reference/glib/tmpl/caches.sgml | 115 + docs/reference/glib/tmpl/checksum.sgml | 130 + docs/reference/glib/tmpl/completion.sgml | 126 + docs/reference/glib/tmpl/conversions.sgml | 391 + docs/reference/glib/tmpl/datalist.sgml | 185 + docs/reference/glib/tmpl/datasets.sgml | 155 + docs/reference/glib/tmpl/date.sgml | 797 + docs/reference/glib/tmpl/error_reporting.sgml | 523 + docs/reference/glib/tmpl/fileutils.sgml | 498 + docs/reference/glib/tmpl/ghostutils.sgml | 66 + docs/reference/glib/tmpl/glib-unused.sgml | 1037 + docs/reference/glib/tmpl/gregex.sgml | 632 + docs/reference/glib/tmpl/gurifuncs.sgml | 106 + docs/reference/glib/tmpl/gvariant.sgml | 873 + docs/reference/glib/tmpl/gvarianttype.sgml | 455 + docs/reference/glib/tmpl/hash_tables.sgml | 424 + docs/reference/glib/tmpl/hooks.sgml | 467 + docs/reference/glib/tmpl/i18n.sgml | 214 + docs/reference/glib/tmpl/iochannels.sgml | 539 + docs/reference/glib/tmpl/keyfile.sgml | 889 + docs/reference/glib/tmpl/limits.sgml | 250 + docs/reference/glib/tmpl/linked_lists_double.sgml | 384 + docs/reference/glib/tmpl/linked_lists_single.sgml | 326 + docs/reference/glib/tmpl/macros.sgml | 228 + docs/reference/glib/tmpl/macros_misc.sgml | 656 + docs/reference/glib/tmpl/main.sgml | 1061 + docs/reference/glib/tmpl/markup.sgml | 324 + docs/reference/glib/tmpl/memory.sgml | 423 + docs/reference/glib/tmpl/memory_chunks.sgml | 163 + docs/reference/glib/tmpl/memory_slices.sgml | 253 + docs/reference/glib/tmpl/messages.sgml | 297 + docs/reference/glib/tmpl/misc_utils.sgml | 439 + docs/reference/glib/tmpl/modules.sgml | 284 + docs/reference/glib/tmpl/numerical.sgml | 122 + docs/reference/glib/tmpl/option.sgml | 380 + docs/reference/glib/tmpl/patterns.sgml | 86 + docs/reference/glib/tmpl/quarks.sgml | 81 + docs/reference/glib/tmpl/queue.sgml | 432 + docs/reference/glib/tmpl/random_numbers.sgml | 189 + docs/reference/glib/tmpl/relations.sgml | 141 + docs/reference/glib/tmpl/scanner.sgml | 604 + docs/reference/glib/tmpl/sequence.sgml | 384 + docs/reference/glib/tmpl/shell.sgml | 68 + docs/reference/glib/tmpl/spawn.sgml | 195 + docs/reference/glib/tmpl/string_chunks.sgml | 83 + docs/reference/glib/tmpl/string_utils.sgml | 900 + docs/reference/glib/tmpl/strings.sgml | 365 + docs/reference/glib/tmpl/testing.sgml | 646 + docs/reference/glib/tmpl/thread_pools.sgml | 157 + docs/reference/glib/tmpl/threads.sgml | 737 + docs/reference/glib/tmpl/timers.sgml | 85 + docs/reference/glib/tmpl/trash_stack.sgml | 74 + docs/reference/glib/tmpl/trees-binary.sgml | 216 + docs/reference/glib/tmpl/trees-nary.sgml | 431 + docs/reference/glib/tmpl/type_conversion.sgml | 122 + docs/reference/glib/tmpl/types.sgml | 324 + docs/reference/glib/tmpl/unicode.sgml | 886 + docs/reference/glib/tmpl/version.sgml | 71 + docs/reference/glib/tmpl/warnings.sgml | 233 + docs/reference/glib/tmpl/windows.sgml | 137 + docs/reference/glib/version.xml.in | 1 + docs/reference/gobject/Makefile.am | 85 + docs/reference/gobject/Makefile.in | 888 + docs/reference/gobject/glib-genmarshal.1 | 307 + docs/reference/gobject/glib-genmarshal.xml | 347 + docs/reference/gobject/glib-mkenums.1 | 234 + docs/reference/gobject/glib-mkenums.xml | 279 + docs/reference/gobject/gobject-docs.sgml | 147 + docs/reference/gobject/gobject-overrides.txt | 0 docs/reference/gobject/gobject-query.1 | 83 + docs/reference/gobject/gobject-query.xml | 111 + docs/reference/gobject/gobject-sections.txt | 837 + docs/reference/gobject/gobject.cI | 11 + docs/reference/gobject/gobject.types | 6 + docs/reference/gobject/html/GTypeModule.html | 652 + docs/reference/gobject/html/GTypePlugin.html | 461 + docs/reference/gobject/html/api-index-2-10.html | 95 + docs/reference/gobject/html/api-index-2-12.html | 77 + docs/reference/gobject/html/api-index-2-14.html | 75 + docs/reference/gobject/html/api-index-2-18.html | 70 + docs/reference/gobject/html/api-index-2-2.html | 66 + docs/reference/gobject/html/api-index-2-22.html | 70 + docs/reference/gobject/html/api-index-2-24.html | 85 + docs/reference/gobject/html/api-index-2-4.html | 144 + docs/reference/gobject/html/api-index-2-6.html | 68 + docs/reference/gobject/html/api-index-2-8.html | 68 + .../gobject/html/api-index-deprecated.html | 72 + docs/reference/gobject/html/api-index-full.html | 1351 + docs/reference/gobject/html/ch01s02.html | 166 + docs/reference/gobject/html/ch06s03.html | 143 + docs/reference/gobject/html/chapter-gobject.html | 323 + docs/reference/gobject/html/chapter-gtype.html | 293 + docs/reference/gobject/html/chapter-intro.html | 122 + docs/reference/gobject/html/chapter-signal.html | 244 + docs/reference/gobject/html/glib-genmarshal.html | 385 + docs/reference/gobject/html/glib-mkenums.html | 325 + docs/reference/gobject/html/glue.png | Bin 0 -> 12722 bytes .../gobject/html/gobject-Boxed-Types.html | 393 + docs/reference/gobject/html/gobject-Closures.html | 2252 ++ .../html/gobject-Enumeration-and-Flag-Types.html | 830 + .../reference/gobject/html/gobject-GParamSpec.html | 1405 + .../gobject/html/gobject-Generic-values.html | 719 + docs/reference/gobject/html/gobject-Signals.html | 2674 ++ ...gobject-Standard-Parameter-and-Value-Types.html | 5086 +++ .../gobject/html/gobject-The-Base-Object-Type.html | 2438 ++ .../gobject/html/gobject-Type-Information.html | 3802 +++ .../gobject/html/gobject-Value-arrays.html | 419 + .../html/gobject-Varargs-Value-Collection.html | 201 + docs/reference/gobject/html/gobject-memory.html | 264 + .../reference/gobject/html/gobject-properties.html | 300 + docs/reference/gobject/html/gobject-query.html | 147 + docs/reference/gobject/html/gobject.devhelp | 722 + docs/reference/gobject/html/gobject.devhelp2 | 756 + docs/reference/gobject/html/gtype-conventions.html | 173 + .../gobject/html/gtype-instantiable-classed.html | 317 + .../html/gtype-non-instantiable-classed.html | 346 + .../gobject/html/gtype-non-instantiable.html | 106 + docs/reference/gobject/html/home.png | Bin 0 -> 654 bytes .../gobject/html/howto-gobject-chainup.html | 130 + .../reference/gobject/html/howto-gobject-code.html | 116 + .../gobject/html/howto-gobject-construction.html | 143 + .../gobject/html/howto-gobject-destruction.html | 152 + .../gobject/html/howto-gobject-methods.html | 287 + docs/reference/gobject/html/howto-gobject.html | 313 + .../gobject/html/howto-interface-implement.html | 155 + .../gobject/html/howto-interface-properties.html | 197 + docs/reference/gobject/html/howto-interface.html | 190 + docs/reference/gobject/html/howto-signals.html | 151 + docs/reference/gobject/html/index.html | 217 + docs/reference/gobject/html/index.sgml | 734 + docs/reference/gobject/html/left.png | Bin 0 -> 459 bytes docs/reference/gobject/html/pr01.html | 102 + docs/reference/gobject/html/pt01.html | 110 + docs/reference/gobject/html/pt02.html | 96 + docs/reference/gobject/html/pt03.html | 85 + docs/reference/gobject/html/right.png | Bin 0 -> 472 bytes docs/reference/gobject/html/rn01.html | 112 + docs/reference/gobject/html/rn02.html | 77 + docs/reference/gobject/html/signal.html | 407 + docs/reference/gobject/html/style.css | 257 + docs/reference/gobject/html/tools-ginspector.html | 65 + docs/reference/gobject/html/tools-gob.html | 70 + docs/reference/gobject/html/tools-gtkdoc.html | 93 + docs/reference/gobject/html/tools-refdb.html | 85 + docs/reference/gobject/html/tools-vala.html | 73 + docs/reference/gobject/html/up.png | Bin 0 -> 406 bytes docs/reference/gobject/images/glue.png | Bin 0 -> 12722 bytes .../reference/gobject/tmpl/enumerations_flags.sgml | 240 + docs/reference/gobject/tmpl/gboxed.sgml | 153 + docs/reference/gobject/tmpl/gclosure.sgml | 573 + docs/reference/gobject/tmpl/generic_values.sgml | 211 + docs/reference/gobject/tmpl/gobject-unused.sgml | 96 + docs/reference/gobject/tmpl/gparamspec.sgml | 426 + docs/reference/gobject/tmpl/gtype.sgml | 1142 + docs/reference/gobject/tmpl/gtypemodule.sgml | 140 + docs/reference/gobject/tmpl/gtypeplugin.sgml | 113 + docs/reference/gobject/tmpl/objects.sgml | 632 + docs/reference/gobject/tmpl/param_value_types.sgml | 1657 + docs/reference/gobject/tmpl/signals.sgml | 627 + docs/reference/gobject/tmpl/value_arrays.sgml | 127 + docs/reference/gobject/tmpl/value_collection.sgml | 56 + docs/reference/gobject/tut_gobject.xml | 750 + docs/reference/gobject/tut_gsignal.xml | 523 + docs/reference/gobject/tut_gtype.xml | 948 + docs/reference/gobject/tut_howto.xml | 1720 + docs/reference/gobject/tut_intro.xml | 182 + docs/reference/gobject/tut_tools.xml | 132 + docs/reference/gobject/version.xml.in | 1 + gio-2.0-uninstalled.pc.in | 6 + gio-2.0.pc.in | 14 + gio-unix-2.0-uninstalled.pc.in | 6 + gio-unix-2.0.pc.in | 11 + gio/ChangeLog | 5966 ++++ gio/Makefile.am | 494 + gio/Makefile.in | 1692 + gio/abicheck.sh | 13 + gio/fam/Makefile.am | 52 + gio/fam/Makefile.in | 788 + gio/fam/fam-helper.c | 276 + gio/fam/fam-helper.h | 38 + gio/fam/fam-module.c | 54 + gio/fam/gfamdirectorymonitor.c | 153 + gio/fam/gfamdirectorymonitor.h | 54 + gio/fam/gfamfilemonitor.c | 151 + gio/fam/gfamfilemonitor.h | 55 + gio/fen/Makefile.am | 38 + gio/fen/Makefile.in | 772 + gio/fen/fen-data.c | 718 + gio/fen/fen-data.h | 89 + gio/fen/fen-dump.c | 100 + gio/fen/fen-dump.h | 29 + gio/fen/fen-helper.c | 337 + gio/fen/fen-helper.h | 36 + gio/fen/fen-kernel.c | 534 + gio/fen/fen-kernel.h | 54 + gio/fen/fen-missing.c | 121 + gio/fen/fen-missing.h | 38 + gio/fen/fen-node.c | 466 + gio/fen/fen-node.h | 73 + gio/fen/fen-sub.c | 42 + gio/fen/fen-sub.h | 39 + gio/fen/gfendirectorymonitor.c | 150 + gio/fen/gfendirectorymonitor.h | 55 + gio/fen/gfenfilemonitor.c | 149 + gio/fen/gfenfilemonitor.h | 56 + gio/gappinfo.c | 814 + gio/gappinfo.h | 237 + gio/gasynchelper.c | 159 + gio/gasynchelper.h | 61 + gio/gasyncinitable.c | 393 + gio/gasyncinitable.h | 119 + gio/gasyncresult.c | 162 + gio/gasyncresult.h | 73 + gio/gbufferedinputstream.c | 1373 + gio/gbufferedinputstream.h | 123 + gio/gbufferedoutputstream.c | 768 + gio/gbufferedoutputstream.h | 82 + gio/gcancellable.c | 773 + gio/gcancellable.h | 103 + gio/gcharsetconverter.c | 478 + gio/gcharsetconverter.h | 60 + gio/gcontenttype.c | 1675 + gio/gcontenttype.h | 57 + gio/gcontenttypeprivate.h | 36 + gio/gconverter.c | 234 + gio/gconverter.h | 95 + gio/gconverterinputstream.c | 555 + gio/gconverterinputstream.h | 80 + gio/gconverteroutputstream.c | 606 + gio/gconverteroutputstream.h | 80 + gio/gdatainputstream.c | 1252 + gio/gdatainputstream.h | 133 + gio/gdataoutputstream.c | 506 + gio/gdataoutputstream.h | 116 + gio/gdesktopappinfo.c | 2699 ++ gio/gdesktopappinfo.h | 96 + gio/gdrive.c | 871 + gio/gdrive.h | 225 + gio/gdummyfile.c | 754 + gio/gdummyfile.h | 51 + gio/gemblem.c | 363 + gio/gemblem.h | 58 + gio/gemblemedicon.c | 355 + gio/gemblemedicon.h | 62 + gio/gfile.c | 7230 +++++ gio/gfile.h | 1017 + gio/gfileattribute-priv.h | 93 + gio/gfileattribute.c | 1073 + gio/gfileattribute.h | 77 + gio/gfiledescriptorbased.c | 74 + gio/gfiledescriptorbased.h | 63 + gio/gfileenumerator.c | 764 + gio/gfileenumerator.h | 133 + gio/gfileicon.c | 388 + gio/gfileicon.h | 56 + gio/gfileinfo-priv.h | 141 + gio/gfileinfo.c | 2486 ++ gio/gfileinfo.h | 951 + gio/gfileinputstream.c | 473 + gio/gfileinputstream.h | 112 + gio/gfileiostream.c | 677 + gio/gfileiostream.h | 118 + gio/gfilemonitor.c | 731 + gio/gfilemonitor.h | 95 + gio/gfilenamecompleter.c | 520 + gio/gfilenamecompleter.h | 76 + gio/gfileoutputstream.c | 575 + gio/gfileoutputstream.h | 119 + gio/gfilterinputstream.c | 318 + gio/gfilterinputstream.h | 76 + gio/gfilteroutputstream.c | 312 + gio/gfilteroutputstream.h | 76 + gio/gicon.c | 456 + gio/gicon.h | 91 + gio/ginetaddress.c | 871 + gio/ginetaddress.h | 103 + gio/ginetsocketaddress.c | 325 + gio/ginetsocketaddress.h | 69 + gio/ginitable.c | 252 + gio/ginitable.h | 96 + gio/ginputstream.c | 1209 + gio/ginputstream.h | 172 + gio/gio-marshal.list | 6 + gio/gio-querymodules.c | 133 + gio/gio.h | 101 + gio/gio.rc.in | 30 + gio/gio.symbols | 1342 + gio/gioalias.h | 3008 ++ gio/gioaliasdef.c | 3011 ++ gio/gioenums.h | 703 + gio/gioenumtypes.c | 722 + gio/gioenumtypes.c.template | 42 + gio/gioenumtypes.h | 79 + gio/gioenumtypes.h.template | 24 + gio/gioerror.c | 210 + gio/gioerror.h | 48 + gio/giomodule-priv.h | 35 + gio/giomodule.c | 897 + gio/giomodule.h | 132 + gio/gioscheduler.c | 466 + gio/gioscheduler.h | 52 + gio/giostream.c | 614 + gio/giostream.h | 112 + gio/giotypes.h | 339 + gio/gloadableicon.c | 244 + gio/gloadableicon.h | 97 + gio/glocaldirectorymonitor.c | 318 + gio/glocaldirectorymonitor.h | 71 + gio/glocalfile.c | 2411 ++ gio/glocalfile.h | 51 + gio/glocalfileenumerator.c | 391 + gio/glocalfileenumerator.h | 57 + gio/glocalfileinfo.c | 2423 ++ gio/glocalfileinfo.h | 86 + gio/glocalfileinputstream.c | 358 + gio/glocalfileinputstream.h | 63 + gio/glocalfileiostream.c | 115 + gio/glocalfileiostream.h | 60 + gio/glocalfilemonitor.c | 228 + gio/glocalfilemonitor.h | 64 + gio/glocalfileoutputstream.c | 1169 + gio/glocalfileoutputstream.h | 85 + gio/glocalvfs.c | 219 + gio/glocalvfs.h | 46 + gio/gmemoryinputstream.c | 526 + gio/gmemoryinputstream.h | 82 + gio/gmemoryoutputstream.c | 773 + gio/gmemoryoutputstream.h | 97 + gio/gmount.c | 1015 + gio/gmount.h | 242 + gio/gmountoperation.c | 713 + gio/gmountoperation.h | 123 + gio/gmountprivate.h | 35 + gio/gnativevolumemonitor.c | 56 + gio/gnativevolumemonitor.h | 62 + gio/gnetworkaddress.c | 620 + gio/gnetworkaddress.h | 69 + gio/gnetworkingprivate.h | 105 + gio/gnetworkservice.c | 665 + gio/gnetworkservice.h | 69 + gio/goutputstream.c | 1375 + gio/goutputstream.h | 207 + gio/gpollfilemonitor.c | 233 + gio/gpollfilemonitor.h | 50 + gio/gresolver.c | 935 + gio/gresolver.h | 167 + gio/gseekable.c | 179 + gio/gseekable.h | 99 + gio/gsimpleasyncresult.c | 841 + gio/gsimpleasyncresult.h | 125 + gio/gsocket.c | 3168 ++ gio/gsocket.h | 176 + gio/gsocketaddress.c | 330 + gio/gsocketaddress.h | 79 + gio/gsocketaddressenumerator.c | 191 + gio/gsocketaddressenumerator.h | 89 + gio/gsocketclient.c | 1013 + gio/gsocketclient.h | 130 + gio/gsocketconnectable.c | 148 + gio/gsocketconnectable.h | 68 + gio/gsocketconnection.c | 499 + gio/gsocketconnection.h | 91 + gio/gsocketcontrolmessage.c | 216 + gio/gsocketcontrolmessage.h | 105 + gio/gsocketinputstream.c | 257 + gio/gsocketinputstream.h | 58 + gio/gsocketlistener.c | 1156 + gio/gsocketlistener.h | 138 + gio/gsocketoutputstream.c | 259 + gio/gsocketoutputstream.h | 58 + gio/gsocketservice.c | 331 + gio/gsocketservice.h | 88 + gio/gsrvtarget.c | 331 + gio/gsrvtarget.h | 52 + gio/gtcpconnection.c | 382 + gio/gtcpconnection.h | 68 + gio/gthemedicon.c | 526 + gio/gthemedicon.h | 63 + gio/gthreadedresolver.c | 620 + gio/gthreadedresolver.h | 50 + gio/gthreadedsocketservice.c | 278 + gio/gthreadedsocketservice.h | 81 + gio/gunionvolumemonitor.c | 695 + gio/gunionvolumemonitor.h | 49 + gio/gunixconnection.c | 291 + gio/gunixconnection.h | 76 + gio/gunixfdlist.c | 396 + gio/gunixfdlist.h | 89 + gio/gunixfdmessage.c | 318 + gio/gunixfdmessage.h | 78 + gio/gunixinputstream.c | 648 + gio/gunixinputstream.h | 78 + gio/gunixmount.c | 487 + gio/gunixmount.h | 59 + gio/gunixmounts.c | 2196 ++ gio/gunixmounts.h | 102 + gio/gunixoutputstream.c | 604 + gio/gunixoutputstream.h | 77 + gio/gunixresolver.c | 527 + gio/gunixresolver.h | 53 + gio/gunixsocketaddress.c | 400 + gio/gunixsocketaddress.h | 68 + gio/gunixvolume.c | 534 + gio/gunixvolume.h | 60 + gio/gunixvolumemonitor.c | 436 + gio/gunixvolumemonitor.h | 63 + gio/gvfs.c | 255 + gio/gvfs.h | 125 + gio/gvolume.c | 645 + gio/gvolume.h | 211 + gio/gvolumemonitor.c | 396 + gio/gvolumemonitor.h | 151 + gio/gwin32appinfo.c | 669 + gio/gwin32appinfo.h | 50 + gio/gwin32mount.c | 349 + gio/gwin32mount.h | 57 + gio/gwin32resolver.c | 487 + gio/gwin32resolver.h | 49 + gio/gwin32volumemonitor.c | 286 + gio/gwin32volumemonitor.h | 65 + gio/gzlibcompressor.c | 324 + gio/gzlibcompressor.h | 55 + gio/gzlibdecompressor.c | 296 + gio/gzlibdecompressor.h | 54 + gio/inotify/Makefile.am | 37 + gio/inotify/Makefile.in | 762 + gio/inotify/ginotifydirectorymonitor.c | 159 + gio/inotify/ginotifydirectorymonitor.h | 53 + gio/inotify/ginotifyfilemonitor.c | 181 + gio/inotify/ginotifyfilemonitor.h | 54 + gio/inotify/inotify-diag.c | 74 + gio/inotify/inotify-diag.h | 29 + gio/inotify/inotify-helper.c | 275 + gio/inotify/inotify-helper.h | 33 + gio/inotify/inotify-kernel.c | 680 + gio/inotify/inotify-kernel.h | 55 + gio/inotify/inotify-missing.c | 167 + gio/inotify/inotify-missing.h | 35 + gio/inotify/inotify-path.c | 440 + gio/inotify/inotify-path.h | 33 + gio/inotify/inotify-sub.c | 72 + gio/inotify/inotify-sub.h | 39 + gio/libasyncns/Makefile.am | 15 + gio/libasyncns/Makefile.in | 658 + gio/libasyncns/README | 7 + gio/libasyncns/asyncns.c | 1533 + gio/libasyncns/asyncns.h | 163 + gio/libasyncns/g-asyncns.h | 35 + gio/libasyncns/update.sh | 20 + gio/makefile.msc | 267 + gio/makegioalias.pl | 137 + gio/pltcheck.sh | 19 + gio/tests/Makefile.am | 136 + gio/tests/Makefile.in | 970 + gio/tests/buffered-input-stream.c | 141 + gio/tests/contexts.c | 190 + gio/tests/converter-stream.c | 572 + gio/tests/data-input-stream.c | 336 + gio/tests/data-output-stream.c | 289 + gio/tests/desktop-app-info.c | 259 + gio/tests/echo-server.c | 73 + gio/tests/filter-cat.c | 227 + gio/tests/filter-streams.c | 241 + gio/tests/g-file-info.c | 125 + gio/tests/g-file.c | 538 + gio/tests/g-icon.c | 245 + gio/tests/httpd.c | 183 + gio/tests/live-g-file.c | 1225 + gio/tests/memory-input-stream.c | 78 + gio/tests/memory-output-stream.c | 137 + gio/tests/readwrite.c | 293 + gio/tests/resolver.c | 512 + gio/tests/send-data.c | 180 + gio/tests/simple-async-result.c | 130 + gio/tests/sleepy-stream.c | 296 + gio/tests/socket-client.c | 300 + gio/tests/socket-server.c | 309 + gio/tests/srvtarget.c | 158 + gio/tests/unix-fd.c | 197 + gio/tests/unix-streams.c | 256 + gio/win32/Makefile.am | 31 + gio/win32/Makefile.in | 729 + gio/win32/gwin32directorymonitor.c | 250 + gio/win32/gwin32directorymonitor.h | 62 + gio/win32/gwinhttpfile.c | 787 + gio/win32/gwinhttpfile.h | 64 + gio/win32/gwinhttpfileinputstream.c | 179 + gio/win32/gwinhttpfileinputstream.h | 52 + gio/win32/gwinhttpfileoutputstream.c | 187 + gio/win32/gwinhttpfileoutputstream.h | 51 + gio/win32/gwinhttpvfs.c | 459 + gio/win32/gwinhttpvfs.h | 110 + gio/win32/winhttp.h | 248 + gio/xdgmime/Makefile.am | 23 + gio/xdgmime/Makefile.in | 678 + gio/xdgmime/xdgmime.c | 926 + gio/xdgmime/xdgmime.h | 127 + gio/xdgmime/xdgmimealias.c | 184 + gio/xdgmime/xdgmimealias.h | 51 + gio/xdgmime/xdgmimecache.c | 1085 + gio/xdgmime/xdgmimecache.h | 81 + gio/xdgmime/xdgmimeglob.c | 725 + gio/xdgmime/xdgmimeglob.h | 70 + gio/xdgmime/xdgmimeicon.c | 183 + gio/xdgmime/xdgmimeicon.h | 50 + gio/xdgmime/xdgmimeint.c | 191 + gio/xdgmime/xdgmimeint.h | 77 + gio/xdgmime/xdgmimemagic.c | 813 + gio/xdgmime/xdgmimemagic.h | 57 + gio/xdgmime/xdgmimeparent.c | 219 + gio/xdgmime/xdgmimeparent.h | 51 + glib-2.0-uninstalled.pc.in | 9 + glib-2.0.pc.in | 15 + glib-gettextize.in | 188 + glib-zip.in | 76 + glib/Makefile.am | 426 + glib/Makefile.in | 1672 + glib/abicheck.sh | 13 + glib/galias.h | 4449 +++ glib/galiasdef.c | 4452 +++ glib/galloca.h | 63 + glib/garray.c | 1596 + glib/garray.h | 179 + glib/gasyncqueue.c | 666 + glib/gasyncqueue.h | 120 + glib/gatomic-gcc.c | 92 + glib/gatomic.c | 1058 + glib/gatomic.h | 85 + glib/gbacktrace.c | 308 + glib/gbacktrace.h | 68 + glib/gbase64.c | 447 + glib/gbase64.h | 57 + glib/gbitlock.c | 300 + glib/gbitlock.h | 43 + glib/gbookmarkfile.c | 3709 +++ glib/gbookmarkfile.h | 191 + glib/gbsearcharray.h | 303 + glib/gbuffer.c | 207 + glib/gbuffer.h | 88 + glib/gcache.c | 331 + glib/gcache.h | 69 + glib/gchecksum.c | 1461 + glib/gchecksum.h | 86 + glib/gcompletion.c | 472 + glib/gcompletion.h | 77 + glib/gconvert.c | 2130 ++ glib/gconvert.h | 138 + glib/gdataset.c | 1183 + glib/gdataset.h | 122 + glib/gdatasetprivate.h | 44 + glib/gdate.c | 1905 ++ glib/gdate.h | 263 + glib/gdebug.h | 59 + glib/gdir.c | 307 + glib/gdir.h | 52 + glib/gen-script-table.pl | 119 + glib/gen-unicode-tables.pl | 1303 + glib/gerror.c | 389 + glib/gerror.h | 98 + glib/gfileutils.c | 2020 ++ glib/gfileutils.h | 128 + glib/ghash.c | 1461 + glib/ghash.h | 166 + glib/ghook.c | 638 + glib/ghook.h | 181 + glib/ghostutils.c | 769 + glib/ghostutils.h | 40 + glib/gi18n-lib.h | 38 + glib/gi18n.h | 34 + glib/giochannel.c | 2584 ++ glib/giochannel.h | 366 + glib/giounix.c | 645 + glib/giowin32.c | 2244 ++ glib/gkeyfile.c | 3782 +++ glib/gkeyfile.h | 250 + glib/glib-mirroring-tab/Makefile | 11 + glib/glib-mirroring-tab/gen-mirroring-tab.c | 232 + glib/glib-mirroring-tab/packtab.c | 424 + glib/glib-mirroring-tab/packtab.h | 50 + glib/glib-object.h | 41 + glib/glib.h | 97 + glib/glib.py | 252 + glib/glib.rc.in | 30 + glib/glib.symbols | 1888 ++ glib/glibintl.h | 38 + glib/glist.c | 1153 + glib/glist.h | 120 + glib/gmacros.h | 277 + glib/gmain.c | 4172 +++ glib/gmain.h | 304 + glib/gmappedfile.c | 348 + glib/gmappedfile.h | 49 + glib/gmarkup.c | 2785 ++ glib/gmarkup.h | 163 + glib/gmem.c | 1169 + glib/gmem.h | 203 + glib/gmessages.c | 1166 + glib/gmessages.h | 343 + glib/gmirroringtable.h | 901 + glib/gnode.c | 1281 + glib/gnode.h | 288 + glib/gnulib/Makefile.am | 22 + glib/gnulib/Makefile.in | 670 + glib/gnulib/README | 44 + glib/gnulib/asnprintf.c | 40 + glib/gnulib/g-gnulib.h | 50 + glib/gnulib/makefile.msc | 18 + glib/gnulib/printf-args.c | 133 + glib/gnulib/printf-args.h | 142 + glib/gnulib/printf-parse.c | 498 + glib/gnulib/printf-parse.h | 74 + glib/gnulib/printf.c | 154 + glib/gnulib/printf.h | 57 + glib/gnulib/vasnprintf.c | 1081 + glib/gnulib/vasnprintf.h | 61 + glib/goption.c | 2386 ++ glib/goption.h | 370 + glib/gpattern.c | 446 + glib/gpattern.h | 49 + glib/gpoll.c | 430 + glib/gpoll.h | 93 + glib/gprimes.c | 90 + glib/gprimes.h | 51 + glib/gprintf.c | 344 + glib/gprintf.h | 52 + glib/gprintfint.h | 59 + glib/gqsort.c | 287 + glib/gqsort.h | 46 + glib/gquark.h | 52 + glib/gqueue.c | 1013 + glib/gqueue.h | 127 + glib/grand.c | 700 + glib/grand.h | 85 + glib/gregex.c | 2758 ++ glib/gregex.h | 243 + glib/grel.c | 646 + glib/grel.h | 97 + glib/gscanner.c | 1767 ++ glib/gscanner.h | 278 + glib/gscripttable.h | 3012 ++ glib/gsequence.c | 1819 ++ glib/gsequence.h | 128 + glib/gshell.c | 695 + glib/gshell.h | 55 + glib/gslice.c | 1488 + glib/gslice.h | 86 + glib/gslist.c | 1061 + glib/gslist.h | 114 + glib/gspawn-win32-helper-console.c | 2 + glib/gspawn-win32-helper.c | 333 + glib/gspawn-win32.c | 1497 + glib/gspawn-win64-helper-console.c | 2 + glib/gspawn-win64-helper.c | 1 + glib/gspawn.c | 1682 + glib/gspawn.h | 139 + glib/gstdio.c | 825 + glib/gstdio.h | 159 + glib/gstrfuncs.c | 3249 ++ glib/gstrfuncs.h | 267 + glib/gstring.c | 1521 + glib/gstring.h | 178 + glib/gtester-report | 358 + glib/gtester.c | 711 + glib/gtestutils.c | 2029 ++ glib/gtestutils.h | 292 + glib/gthread.c | 2538 ++ glib/gthread.h | 408 + glib/gthreadpool.c | 995 + glib/gthreadpool.h | 114 + glib/gthreadprivate.h | 69 + glib/gtimer.c | 568 + glib/gtimer.h | 65 + glib/gtree.c | 1417 + glib/gtree.h | 91 + glib/gtypes.h | 451 + glib/gunibreak.c | 66 + glib/gunibreak.h | 17919 +++++++++++ glib/gunichartables.h | 13060 ++++++++ glib/gunicode.h | 404 + glib/gunicodeprivate.h | 35 + glib/gunicollate.c | 679 + glib/gunicomp.h | 682 + glib/gunidecomp.c | 535 + glib/gunidecomp.h | 10870 +++++++ glib/guniprop.c | 1302 + glib/gurifuncs.c | 253 + glib/gurifuncs.h | 81 + glib/gutf8.c | 1895 ++ glib/gutils.c | 3573 +++ glib/gutils.h | 490 + glib/gvariant-core.c | 932 + glib/gvariant-core.h | 46 + glib/gvariant-internal.h | 49 + glib/gvariant-parser.c | 2214 ++ glib/gvariant-serialiser.c | 1664 + glib/gvariant-serialiser.h | 66 + glib/gvariant.c | 4147 +++ glib/gvariant.h | 224 + glib/gvarianttype.c | 1494 + glib/gvarianttype.h | 305 + glib/gvarianttypeinfo.c | 873 + glib/gvarianttypeinfo.h | 151 + glib/gwin32.c | 600 + glib/gwin32.h | 114 + glib/libcharset/Makefile.am | 64 + glib/libcharset/Makefile.in | 699 + glib/libcharset/README | 46 + glib/libcharset/codeset.m4 | 21 + glib/libcharset/config.charset | 640 + glib/libcharset/glibc21.m4 | 30 + glib/libcharset/libcharset-glib.patch | 77 + glib/libcharset/libcharset.h | 46 + glib/libcharset/localcharset.c | 465 + glib/libcharset/localcharset.h | 43 + glib/libcharset/make-patch.sh | 28 + glib/libcharset/ref-add.sin | 31 + glib/libcharset/ref-del.sin | 26 + glib/libcharset/update.sh | 33 + glib/libglib-gdb.py.in | 10 + glib/makefile.msc.in | 151 + glib/makegalias.pl | 136 + glib/pcre/COPYING | 5 + glib/pcre/Makefile.am | 66 + glib/pcre/Makefile.in | 734 + glib/pcre/makefile.msc | 30 + glib/pcre/pcre.h | 293 + glib/pcre/pcre_chartables.c | 198 + glib/pcre/pcre_compile.c | 6258 ++++ glib/pcre/pcre_config.c | 128 + glib/pcre/pcre_dfa_exec.c | 2920 ++ glib/pcre/pcre_exec.c | 4998 +++ glib/pcre/pcre_fullinfo.c | 165 + glib/pcre/pcre_get.c | 465 + glib/pcre/pcre_globals.c | 57 + glib/pcre/pcre_info.c | 93 + glib/pcre/pcre_internal.h | 1157 + glib/pcre/pcre_maketables.c | 143 + glib/pcre/pcre_newline.c | 164 + glib/pcre/pcre_ord2utf8.c | 87 + glib/pcre/pcre_refcount.c | 82 + glib/pcre/pcre_study.c | 588 + glib/pcre/pcre_tables.c | 356 + glib/pcre/pcre_try_flipped.c | 137 + glib/pcre/pcre_ucp_searchfuncs.c | 85 + glib/pcre/pcre_valid_utf8.c | 14 + glib/pcre/pcre_version.c | 90 + glib/pcre/pcre_xclass.c | 146 + glib/pcre/ucp.h | 144 + glib/pcre/ucpinternal.h | 92 + glib/pltcheck.sh | 25 + glib/tests/4096-random-bytes | 45 + glib/tests/Makefile.am | 71 + glib/tests/Makefile.in | 783 + glib/tests/array-test.c | 335 + glib/tests/fileutils.c | 508 + glib/tests/gvariant.c | 3741 +++ glib/tests/hostutils.c | 286 + glib/tests/keyfile.c | 1263 + glib/tests/markup-subparser.c | 377 + glib/tests/mem-overflow.c | 108 + glib/tests/option-context.c | 1794 ++ glib/tests/printf.c | 711 + glib/tests/rand.c | 160 + glib/tests/strfuncs.c | 1241 + glib/tests/string.c | 417 + glib/tests/testing.c | 241 + glib/update-pcre/Makefile.am | 10 + glib/update-pcre/Makefile.am-1 | 30 + glib/update-pcre/Makefile.am-2 | 10 + glib/update-pcre/Makefile.in | 523 + glib/update-pcre/digitab.patch | 133 + glib/update-pcre/memory.patch | 87 + glib/update-pcre/pcre_ucp_searchfuncs.c | 130 + glib/update-pcre/pcre_valid_utf8.c | 14 + glib/update-pcre/update.sh | 159 + glib/win_iconv.c | 1956 ++ glibconfig.h.win32.in | 284 + gmodule-2.0-uninstalled.pc.in | 8 + gmodule-2.0.pc.in | 14 + gmodule-export-2.0.pc.in | 14 + gmodule-no-export-2.0-uninstalled.pc.in | 14 + gmodule-no-export-2.0.pc.in | 14 + gmodule/AUTHORS | 1 + gmodule/COPYING | 482 + gmodule/ChangeLog | 1042 + gmodule/Makefile.am | 127 + gmodule/Makefile.in | 837 + gmodule/gmodule-ar.c | 187 + gmodule/gmodule-beos.c | 204 + gmodule/gmodule-dl.c | 168 + gmodule/gmodule-dld.c | 163 + gmodule/gmodule-dyld.c | 154 + gmodule/gmodule-os2.c | 144 + gmodule/gmodule-win32.c | 276 + gmodule/gmodule.c | 686 + gmodule/gmodule.h | 101 + gmodule/gmodule.rc.in | 30 + gmodule/gmodule.symbols | 14 + gmodule/gmoduleconf.h.in | 54 + gmodule/gmoduleconf.h.win32 | 44 + gmodule/makefile.msc.in | 37 + gobject-2.0-uninstalled.pc.in | 7 + gobject-2.0.pc.in | 11 + gobject/ChangeLog | 3973 +++ gobject/Makefile.am | 303 + gobject/Makefile.in | 1428 + gobject/abicheck.sh | 13 + gobject/gatomicarray.c | 169 + gobject/gatomicarray.h | 60 + gobject/gboxed.c | 659 + gobject/gboxed.h | 236 + gobject/gclosure.c | 1226 + gobject/gclosure.h | 251 + gobject/genums.c | 624 + gobject/genums.h | 261 + gobject/glib-genmarshal.1 | 212 + gobject/glib-genmarshal.c | 892 + gobject/glib-mkenums.1 | 169 + gobject/glib-mkenums.in | 511 + gobject/gmarshal.c | 757 + gobject/gmarshal.h | 169 + gobject/gmarshal.list | 47 + gobject/gmarshal.strings | 20 + gobject/gobject-query.c | 230 + gobject/gobject.c | 3231 ++ gobject/gobject.h | 562 + gobject/gobject.py | 305 + gobject/gobject.rc.in | 30 + gobject/gobject.symbols | 448 + gobject/gobjectalias.h | 1117 + gobject/gobjectaliasdef.c | 1120 + gobject/gobjectnotifyqueue.c | 166 + gobject/gparam.c | 1501 + gobject/gparam.h | 410 + gobject/gparamspecs.c | 2397 ++ gobject/gparamspecs.h | 1083 + gobject/gsignal.c | 3440 ++ gobject/gsignal.h | 509 + gobject/gsourceclosure.c | 209 + gobject/gsourceclosure.h | 51 + gobject/gtype-private.h | 41 + gobject/gtype.c | 4576 +++ gobject/gtype.h | 1608 + gobject/gtypemodule.c | 586 + gobject/gtypemodule.h | 263 + gobject/gtypeplugin.c | 210 + gobject/gtypeplugin.h | 134 + gobject/gvalue.c | 559 + gobject/gvalue.h | 159 + gobject/gvaluearray.c | 345 + gobject/gvaluearray.h | 77 + gobject/gvaluecollector.h | 222 + gobject/gvaluetransform.c | 443 + gobject/gvaluetypes.c | 1212 + gobject/gvaluetypes.h | 243 + gobject/libgobject-gdb.py.in | 10 + gobject/makefile.msc.in | 91 + gobject/makegobjectalias.pl | 137 + gobject/marshal-genstrings.pl | 9 + gobject/pltcheck.sh | 17 + gobject/stamp-gmarshal.h | 1 + gobject/testgobject.c | 428 + gobject/tests/Makefile.am | 12 + gobject/tests/Makefile.in | 665 + gobject/tests/dynamictests.c | 235 + gobject/tests/threadtests.c | 215 + gthread-2.0-uninstalled.pc.in | 6 + gthread-2.0.pc.in | 11 + gthread/ChangeLog | 837 + gthread/Makefile.am | 105 + gthread/Makefile.in | 938 + gthread/gthread-impl.c | 377 + gthread/gthread-none.c | 39 + gthread/gthread-posix.c | 467 + gthread/gthread-win32.c | 639 + gthread/gthread.def | 3 + gthread/gthread.rc.in | 30 + gthread/makefile.msc.in | 26 + gthread/tests/1bit-mutex.c | 127 + gthread/tests/Makefile.am | 15 + gthread/tests/Makefile.in | 688 + gtk-doc.make | 224 + install-sh | 520 + ltmain.sh | 8406 +++++ m4macros/Makefile.am | 8 + m4macros/Makefile.in | 573 + m4macros/glib-2.0.m4 | 211 + m4macros/glib-gettext.m4 | 432 + makefile.msc | 28 + missing | 376 + mkinstalldirs | 111 + msvc_recommended_pragmas.h | 31 + po/ChangeLog | 4771 +++ po/LINGUAS | 94 + po/Makefile.in.in | 277 + po/POTFILES.in | 105 + po/af.gmo | Bin 0 -> 4896 bytes po/af.po | 2012 ++ po/am.gmo | Bin 0 -> 653 bytes po/am.po | 2035 ++ po/ar.gmo | Bin 0 -> 40092 bytes po/ar.po | 2135 ++ po/as.gmo | Bin 0 -> 62489 bytes po/as.po | 2136 ++ po/ast.gmo | Bin 0 -> 44970 bytes po/ast.po | 2108 ++ po/az.gmo | Bin 0 -> 10930 bytes po/az.po | 2125 ++ po/be.gmo | Bin 0 -> 19914 bytes po/be.po | 2357 ++ po/be@latin.gmo | Bin 0 -> 35728 bytes po/be@latin.po | 2386 ++ po/bg.gmo | Bin 0 -> 59530 bytes po/bg.po | 2089 ++ po/bn.gmo | Bin 0 -> 69231 bytes po/bn.po | 2089 ++ po/bn_IN.gmo | Bin 0 -> 67046 bytes po/bn_IN.po | 2085 ++ po/bs.gmo | Bin 0 -> 10596 bytes po/bs.po | 2124 ++ po/ca.gmo | Bin 0 -> 47620 bytes po/ca.po | 2241 ++ po/ca@valencia.gmo | Bin 0 -> 40373 bytes po/ca@valencia.po | 2229 ++ po/cs.gmo | Bin 0 -> 43927 bytes po/cs.po | 2070 ++ po/cy.gmo | Bin 0 -> 25655 bytes po/cy.po | 2146 ++ po/da.gmo | Bin 0 -> 43232 bytes po/da.po | 2201 ++ po/de.gmo | Bin 0 -> 46536 bytes po/de.po | 2243 ++ po/dz.gmo | Bin 0 -> 32283 bytes po/dz.po | 2141 ++ po/el.gmo | Bin 0 -> 60368 bytes po/el.po | 2250 ++ po/en@shaw.gmo | Bin 0 -> 63930 bytes po/en@shaw.po | 2055 ++ po/en_CA.gmo | Bin 0 -> 32443 bytes po/en_CA.po | 2144 ++ po/en_GB.gmo | Bin 0 -> 41565 bytes po/en_GB.po | 2155 ++ po/eo.gmo | Bin 0 -> 9875 bytes po/eo.po | 2113 ++ po/es.gmo | Bin 0 -> 46164 bytes po/es.po | 2197 ++ po/et.gmo | Bin 0 -> 42531 bytes po/et.po | 2069 ++ po/eu.gmo | Bin 0 -> 44820 bytes po/eu.po | 2102 ++ po/fa.gmo | Bin 0 -> 21650 bytes po/fa.po | 2140 ++ po/fi.gmo | Bin 0 -> 44942 bytes po/fi.po | 2136 ++ po/fr.gmo | Bin 0 -> 48464 bytes po/fr.po | 2142 ++ po/ga.gmo | Bin 0 -> 10691 bytes po/ga.po | 2026 ++ po/gl.gmo | Bin 0 -> 46548 bytes po/gl.po | 2119 ++ po/glib20.pot | 2012 ++ po/gu.gmo | Bin 0 -> 62068 bytes po/gu.po | 2069 ++ po/he.gmo | Bin 0 -> 40383 bytes po/he.po | 2186 ++ po/hi.gmo | Bin 0 -> 63720 bytes po/hi.po | 2071 ++ po/hr.gmo | Bin 0 -> 15675 bytes po/hr.po | 2117 ++ po/hu.gmo | Bin 0 -> 47068 bytes po/hu.po | 2096 ++ po/hy.gmo | Bin 0 -> 2913 bytes po/hy.po | 2035 ++ po/id.gmo | Bin 0 -> 15593 bytes po/id.po | 2169 ++ po/is.gmo | Bin 0 -> 10034 bytes po/is.po | 2113 ++ po/it.gmo | Bin 0 -> 45780 bytes po/it.po | 2287 ++ po/ja.gmo | Bin 0 -> 49397 bytes po/ja.po | 2169 ++ po/ka.gmo | Bin 0 -> 32223 bytes po/ka.po | 2134 ++ po/kn.gmo | Bin 0 -> 70151 bytes po/kn.po | 2082 ++ po/ko.gmo | Bin 0 -> 48285 bytes po/ko.po | 2184 ++ po/ku.gmo | Bin 0 -> 1107 bytes po/ku.po | 2025 ++ po/lt.gmo | Bin 0 -> 44087 bytes po/lt.po | 2162 ++ po/lv.gmo | Bin 0 -> 10291 bytes po/lv.po | 2122 ++ po/mai.gmo | Bin 0 -> 41277 bytes po/mai.po | 2140 ++ po/mg.gmo | Bin 0 -> 17858 bytes po/mg.po | 2150 ++ po/mk.gmo | Bin 0 -> 46623 bytes po/mk.po | 2168 ++ po/ml.gmo | Bin 0 -> 75041 bytes po/ml.po | 2074 ++ po/mn.gmo | Bin 0 -> 17308 bytes po/mn.po | 2159 ++ po/mr.gmo | Bin 0 -> 62685 bytes po/mr.po | 2060 ++ po/ms.gmo | Bin 0 -> 10220 bytes po/ms.po | 2119 ++ po/nb.gmo | Bin 0 -> 43063 bytes po/nb.po | 2056 ++ po/nds.gmo | Bin 0 -> 4710 bytes po/nds.po | 2010 ++ po/ne.gmo | Bin 0 -> 23563 bytes po/ne.po | 2117 ++ po/nl.gmo | Bin 0 -> 38034 bytes po/nl.po | 2287 ++ po/nn.gmo | Bin 0 -> 33763 bytes po/nn.po | 2140 ++ po/oc.gmo | Bin 0 -> 1249 bytes po/oc.po | 2022 ++ po/or.gmo | Bin 0 -> 65787 bytes po/or.po | 2080 ++ po/pa.gmo | Bin 0 -> 61870 bytes po/pa.po | 2120 ++ po/pl.gmo | Bin 0 -> 46239 bytes po/pl.po | 2120 ++ po/po2tbl.sed.in | 102 + po/ps.gmo | Bin 0 -> 9790 bytes po/ps.po | 2040 ++ po/pt.gmo | Bin 0 -> 44740 bytes po/pt.po | 2219 ++ po/pt_BR.gmo | Bin 0 -> 44569 bytes po/pt_BR.po | 2172 ++ po/ro.gmo | Bin 0 -> 46329 bytes po/ro.po | 2171 ++ po/ru.gmo | Bin 0 -> 60196 bytes po/ru.po | 2100 ++ po/rw.gmo | Bin 0 -> 443 bytes po/rw.po | 2182 ++ po/si.gmo | Bin 0 -> 9251 bytes po/si.po | 2073 ++ po/sk.gmo | Bin 0 -> 21222 bytes po/sk.po | 2140 ++ po/sl.gmo | Bin 0 -> 43611 bytes po/sl.po | 2153 ++ po/sq.gmo | Bin 0 -> 36368 bytes po/sq.po | 2525 ++ po/sr.gmo | Bin 0 -> 56690 bytes po/sr.po | 2128 ++ po/sr@ije.gmo | Bin 0 -> 13747 bytes po/sr@ije.po | 2138 ++ po/sr@latin.gmo | Bin 0 -> 44256 bytes po/sr@latin.po | 2129 ++ po/sv.gmo | Bin 0 -> 43437 bytes po/sv.po | 2229 ++ po/ta.gmo | Bin 0 -> 66878 bytes po/ta.po | 2091 ++ po/te.gmo | Bin 0 -> 66976 bytes po/te.po | 2067 ++ po/th.gmo | Bin 0 -> 67609 bytes po/th.po | 2147 ++ po/tl.gmo | Bin 0 -> 16011 bytes po/tl.po | 2178 ++ po/tr.gmo | Bin 0 -> 41560 bytes po/tr.po | 2087 ++ po/tt.gmo | Bin 0 -> 5257 bytes po/tt.po | 2055 ++ po/uk.gmo | Bin 0 -> 58382 bytes po/uk.po | 2084 ++ po/vi.gmo | Bin 0 -> 48196 bytes po/vi.po | 2071 ++ po/wa.gmo | Bin 0 -> 4486 bytes po/wa.po | 2078 ++ po/xh.gmo | Bin 0 -> 14200 bytes po/xh.po | 2168 ++ po/yi.gmo | Bin 0 -> 13844 bytes po/yi.po | 2127 ++ po/zh_CN.gmo | Bin 0 -> 37744 bytes po/zh_CN.po | 2144 ++ po/zh_HK.gmo | Bin 0 -> 41655 bytes po/zh_HK.po | 2108 ++ po/zh_TW.gmo | Bin 0 -> 41631 bytes po/zh_TW.po | 2108 ++ sanity_check | 40 + tests/Makefile.am | 240 + tests/Makefile.in | 1677 + tests/assert-msg-test.c | 8 + tests/asyncqueue-test.c | 194 + tests/atomic-test.c | 63 + tests/base64-test.c | 138 + tests/bit-test.c | 145 + tests/bookmarkfile-test.c | 188 + tests/bookmarks/fail-01.xbel | 0 tests/bookmarks/fail-02.xbel | 2 + tests/bookmarks/fail-03.xbel | 18 + tests/bookmarks/fail-04.xbel | 21 + tests/bookmarks/fail-05.xbel | 21 + tests/bookmarks/fail-06.xbel | 19 + tests/bookmarks/fail-07.xbel | 21 + tests/bookmarks/fail-08.xbel | 18 + tests/bookmarks/fail-09.xbel | 20 + tests/bookmarks/fail-10.xbel | 21 + tests/bookmarks/fail-11.xbel | 22 + tests/bookmarks/fail-12.xbel | 22 + tests/bookmarks/fail-13.xbel | 22 + tests/bookmarks/fail-14.xbel | 24 + tests/bookmarks/fail-15.xbel | 23 + tests/bookmarks/fail-16.xbel | 24 + tests/bookmarks/fail-17.xbel | 22 + tests/bookmarks/valid-01.xbel | 21 + tests/bookmarks/valid-02.xbel | 15 + tests/bookmarks/valid-03.xbel | 21 + tests/casefold.txt | 1120 + tests/casemap.txt | 3246 ++ tests/checksum-test.c | 676 + tests/child-test.c | 206 + tests/collate/collate-1.file | 9 + tests/collate/collate-1.in | 9 + tests/collate/collate-1.unicode | 9 + tests/collate/collate-2.file | 13 + tests/collate/collate-2.in | 13 + tests/collate/collate-2.unicode | 13 + tests/completion-test.c | 74 + tests/convert-test.c | 662 + tests/cxx-test.C | 10 + tests/date-test.c | 499 + tests/dirname-test.c | 121 + tests/env-test.c | 117 + tests/errorcheck-mutex-test.c | 131 + tests/file-test.c | 180 + tests/gen-casefold-txt.pl | 84 + tests/gen-casemap-txt.pl | 258 + tests/gio-test.c | 445 + tests/gobject/Makefile.am | 101 + tests/gobject/Makefile.in | 982 + tests/gobject/accumulator.c | 227 + tests/gobject/defaultiface.c | 191 + tests/gobject/deftype.c | 59 + tests/gobject/dynamictype.c | 173 + tests/gobject/gvalue-test.c | 374 + tests/gobject/ifacecheck.c | 167 + tests/gobject/ifaceinherit.c | 227 + tests/gobject/ifaceinit.c | 422 + tests/gobject/ifaceproperties.c | 507 + tests/gobject/override.c | 418 + tests/gobject/paramspec-test.c | 220 + tests/gobject/performance-threaded.c | 381 + tests/gobject/performance.c | 729 + tests/gobject/references.c | 281 + tests/gobject/singleton.c | 85 + tests/gobject/testcommon.h | 100 + tests/gobject/testmarshal.c | 127 + tests/gobject/testmarshal.h | 28 + tests/gobject/testmarshal.list | 4 + tests/gobject/testmodule.c | 69 + tests/gobject/testmodule.h | 57 + tests/hash-test.c | 459 + tests/iochannel-test-infile | 5 + tests/iochannel-test.c | 176 + tests/libmoduletestplugin_a.c | 71 + tests/libmoduletestplugin_b.c | 70 + tests/list-test.c | 212 + tests/mainloop-test.c | 438 + tests/makefile.msc.in | 105 + tests/mapping-test.c | 256 + tests/markup-collect.c | 221 + tests/markup-escape-test.c | 132 + tests/markup-test.c | 214 + tests/markups/expected-1 | 37 + tests/markups/expected-10 | 6 + tests/markups/expected-11 | 3 + tests/markups/expected-2 | 51 + tests/markups/expected-3 | 61 + tests/markups/expected-4 | 29 + tests/markups/expected-5 | 4 + tests/markups/expected-6 | 6 + tests/markups/expected-7 | 4 + tests/markups/expected-8 | 5 + tests/markups/expected-9 | 3 + tests/markups/fail-1.gmarkup | 0 tests/markups/fail-10.gmarkup | 2 + tests/markups/fail-11.gmarkup | 4 + tests/markups/fail-12.gmarkup | 1 + tests/markups/fail-13.gmarkup | 1 + tests/markups/fail-14.gmarkup | 2 + tests/markups/fail-15.gmarkup | 3 + tests/markups/fail-16.gmarkup | 1 + tests/markups/fail-17.gmarkup | 1 + tests/markups/fail-18.gmarkup | 1 + tests/markups/fail-19.gmarkup | 1 + tests/markups/fail-2.gmarkup | 1 + tests/markups/fail-20.gmarkup | 1 + tests/markups/fail-21.gmarkup | 1 + tests/markups/fail-22.gmarkup | 1 + tests/markups/fail-23.gmarkup | 2 + tests/markups/fail-24.gmarkup | 1 + tests/markups/fail-25.gmarkup | 1 + tests/markups/fail-26.gmarkup | 1 + tests/markups/fail-27.gmarkup | 1 + tests/markups/fail-28.gmarkup | 1 + tests/markups/fail-29.gmarkup | 1 + tests/markups/fail-3.gmarkup | 49 + tests/markups/fail-30.gmarkup | 1 + tests/markups/fail-31.gmarkup | 1 + tests/markups/fail-32.gmarkup | 1 + tests/markups/fail-33.gmarkup | 1 + tests/markups/fail-34.gmarkup | 1 + tests/markups/fail-35.gmarkup | 1 + tests/markups/fail-36.gmarkup | 1 + tests/markups/fail-37.gmarkup | 1 + tests/markups/fail-38.gmarkup | 1 + tests/markups/fail-39.gmarkup | 1 + tests/markups/fail-4.gmarkup | 1 + tests/markups/fail-40.gmarkup | 1 + tests/markups/fail-5.gmarkup | 2 + tests/markups/fail-6.gmarkup | 2 + tests/markups/fail-7.gmarkup | 2 + tests/markups/fail-8.gmarkup | 2 + tests/markups/fail-9.gmarkup | 2 + tests/markups/valid-1.gmarkup | 9 + tests/markups/valid-10.gmarkup | 6 + tests/markups/valid-11.gmarkup | 2 + tests/markups/valid-2.gmarkup | 49 + tests/markups/valid-3.gmarkup | 10 + tests/markups/valid-4.gmarkup | 8 + tests/markups/valid-5.gmarkup | 2 + tests/markups/valid-6.gmarkup | 4 + tests/markups/valid-7.gmarkup | 2 + tests/markups/valid-8.gmarkup | 1 + tests/markups/valid-9.gmarkup | 2 + tests/memchunks.c | 612 + tests/module-test.c | 202 + tests/node-test.c | 223 + tests/onceinit.c | 274 + tests/patterntest.c | 308 + tests/qsort-test.c | 33 + tests/queue-test.c | 962 + tests/refcount/Makefile.am | 41 + tests/refcount/Makefile.in | 906 + tests/refcount/closures.c | 291 + tests/refcount/objects.c | 158 + tests/refcount/objects2.c | 118 + tests/refcount/properties.c | 255 + tests/refcount/properties2.c | 199 + tests/refcount/signals.c | 284 + tests/regex-test.c | 2122 ++ tests/relation-test.c | 139 + tests/run-assert-msg-test.sh | 45 + tests/run-bookmark-test.sh | 34 + tests/run-collate-tests.sh | 38 + tests/run-markup-tests.sh | 41 + tests/scannerapi.c | 139 + tests/sequence-test.c | 1301 + tests/shell-test.c | 297 + tests/slice-color.c | 178 + tests/slice-concurrent.c | 120 + tests/slice-test.c | 310 + tests/slice-threadinit.c | 166 + tests/slist-test.c | 204 + tests/spawn-test-win32-gui.c | 111 + tests/spawn-test.c | 294 + tests/testgdate.c | 506 + tests/testgdateparser.c | 115 + tests/testglib.c | 1548 + tests/testingbase64.c | 236 + tests/thread-test.c | 402 + tests/threadpool-test.c | 476 + tests/timeloop-basic.c | 235 + tests/timeloop-closure.c | 222 + tests/timeloop.c | 216 + tests/tree-test.c | 246 + tests/type-test.c | 142 + tests/unicode-caseconv.c | 132 + tests/unicode-collate.c | 124 + tests/unicode-encoding.c | 422 + tests/unicode-normalize.c | 210 + tests/uri-test.c | 477 + tests/utf8-pointer.c | 112 + tests/utf8-validate.c | 319 + tests/utf8.txt | 301 + 1739 files changed, 1005359 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 ChangeLog.pre-1-2 create mode 100644 ChangeLog.pre-2-0 create mode 100644 ChangeLog.pre-2-10 create mode 100644 ChangeLog.pre-2-12 create mode 100644 ChangeLog.pre-2-14 create mode 100644 ChangeLog.pre-2-16 create mode 100644 ChangeLog.pre-2-18 create mode 100644 ChangeLog.pre-2-2 create mode 100644 ChangeLog.pre-2-20 create mode 100644 ChangeLog.pre-2-4 create mode 100644 ChangeLog.pre-2-6 create mode 100644 ChangeLog.pre-2-8 create mode 100644 HACKING create mode 100644 INSTALL.in create mode 100644 MAINTAINERS create mode 100644 Makefile.am create mode 100644 Makefile.decl create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 NEWS.pre-1-3 create mode 100644 README create mode 100644 README.commits create mode 100644 README.in create mode 100644 README.win32 create mode 100644 acglib.m4 create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100755 autogen.sh create mode 100644 build/ChangeLog create mode 100644 build/Makefile.am create mode 100644 build/Makefile.in create mode 100644 build/README create mode 100644 build/win32/Makefile.am create mode 100644 build/win32/Makefile.in create mode 100644 build/win32/dirent/Makefile.am create mode 100644 build/win32/dirent/Makefile.in create mode 100644 build/win32/dirent/README create mode 100644 build/win32/dirent/dirent-zip create mode 100644 build/win32/dirent/dirent.c create mode 100644 build/win32/dirent/dirent.h create mode 100644 build/win32/dirent/makefile.msc create mode 100644 build/win32/dirent/wdirent.c create mode 100644 build/win32/make.msc create mode 100644 build/win32/module.defs create mode 100644 build/win32/vs9/Makefile.am create mode 100644 build/win32/vs9/Makefile.in create mode 100644 build/win32/vs9/README.txt create mode 100644 build/win32/vs9/gio.vcproj create mode 100644 build/win32/vs9/gio.vcprojin create mode 100644 build/win32/vs9/glib-genmarshal.vcproj create mode 100644 build/win32/vs9/glib.sln create mode 100644 build/win32/vs9/glib.vcproj create mode 100644 build/win32/vs9/glib.vcprojin create mode 100644 build/win32/vs9/glib.vsprops create mode 100644 build/win32/vs9/gmodule.vcproj create mode 100644 build/win32/vs9/gobject.vcproj create mode 100644 build/win32/vs9/gobject.vcprojin create mode 100644 build/win32/vs9/gspawn-win32-helper-console.vcproj create mode 100644 build/win32/vs9/gspawn-win32-helper.vcproj create mode 100644 build/win32/vs9/gthread.vcproj create mode 100644 build/win32/vs9/install.vcproj create mode 100644 build/win32/vs9/testglib.vcproj create mode 100755 compile create mode 100755 config.guess create mode 100644 config.h.in create mode 100644 config.h.win32.in create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/control.in create mode 100644 debian/copyright create mode 100644 debian/docs create mode 100644 debian/libgio-fam.install create mode 100644 debian/libglib2.0-0-dbg.links create mode 100644 debian/libglib2.0-0-refdbg.install create mode 100755 debian/libglib2.0-0.install create mode 100644 debian/libglib2.0-0.symbols create mode 100644 debian/libglib2.0-data.install create mode 100644 debian/libglib2.0-data.links create mode 100644 debian/libglib2.0-dbg.install create mode 100644 debian/libglib2.0-dev.README.Debian create mode 100644 debian/libglib2.0-dev.install create mode 100755 debian/libglib2.0-dev.links create mode 100644 debian/libglib2.0-doc.doc-base.gio create mode 100644 debian/libglib2.0-doc.doc-base.glib create mode 100644 debian/libglib2.0-doc.doc-base.gobject create mode 100644 debian/libglib2.0-doc.install create mode 100644 debian/libglib2.0-doc.links create mode 100644 debian/libglib2.0-udeb.install create mode 100644 debian/lintian-overrides/libglib2.0-0-refdbg create mode 100644 debian/patches/01_gettext-desktopfiles.patch create mode 100644 debian/patches/02_gettext-desktopfiles-ubuntu.patch create mode 100644 debian/patches/03_blacklist-directories.patch create mode 100644 debian/patches/04_homedir_env.patch create mode 100644 debian/patches/60_wait-longer-for-threads-to-die.patch create mode 100644 debian/patches/series create mode 100755 debian/rules create mode 100644 debian/watch create mode 100755 depcomp create mode 100644 docs/Makefile.am create mode 100644 docs/Makefile.in create mode 100644 docs/debugging.txt create mode 100644 docs/macros.txt create mode 100644 docs/reference/AUTHORS create mode 100644 docs/reference/COPYING create mode 100644 docs/reference/ChangeLog create mode 100644 docs/reference/Makefile.am create mode 100644 docs/reference/Makefile.in create mode 100644 docs/reference/NEWS create mode 100644 docs/reference/README create mode 100644 docs/reference/gio/Makefile.am create mode 100644 docs/reference/gio/Makefile.in create mode 100644 docs/reference/gio/gio-docs.xml create mode 100644 docs/reference/gio/gio-overrides.txt create mode 100644 docs/reference/gio/gio-sections.txt create mode 100644 docs/reference/gio/gio.types create mode 100644 docs/reference/gio/gvfs-overview.png create mode 100644 docs/reference/gio/html/GAppInfo.html create mode 100644 docs/reference/gio/html/GAsyncInitable.html create mode 100644 docs/reference/gio/html/GAsyncResult.html create mode 100644 docs/reference/gio/html/GBufferedInputStream.html create mode 100644 docs/reference/gio/html/GBufferedOutputStream.html create mode 100644 docs/reference/gio/html/GCancellable.html create mode 100644 docs/reference/gio/html/GCharsetConverter.html create mode 100644 docs/reference/gio/html/GConverter.html create mode 100644 docs/reference/gio/html/GDataInputStream.html create mode 100644 docs/reference/gio/html/GDataOutputStream.html create mode 100644 docs/reference/gio/html/GDrive.html create mode 100644 docs/reference/gio/html/GEmblem.html create mode 100644 docs/reference/gio/html/GEmblemedIcon.html create mode 100644 docs/reference/gio/html/GFile.html create mode 100644 docs/reference/gio/html/GFileDescriptorBased.html create mode 100644 docs/reference/gio/html/GFileEnumerator.html create mode 100644 docs/reference/gio/html/GFileIOStream.html create mode 100644 docs/reference/gio/html/GFileIcon.html create mode 100644 docs/reference/gio/html/GFileInfo.html create mode 100644 docs/reference/gio/html/GFileInputStream.html create mode 100644 docs/reference/gio/html/GFileMonitor.html create mode 100644 docs/reference/gio/html/GFileOutputStream.html create mode 100644 docs/reference/gio/html/GFilenameCompleter.html create mode 100644 docs/reference/gio/html/GFilterInputStream.html create mode 100644 docs/reference/gio/html/GFilterOutputStream.html create mode 100644 docs/reference/gio/html/GIOModule.html create mode 100644 docs/reference/gio/html/GIOStream.html create mode 100644 docs/reference/gio/html/GIcon.html create mode 100644 docs/reference/gio/html/GInetAddress.html create mode 100644 docs/reference/gio/html/GInetSocketAddress.html create mode 100644 docs/reference/gio/html/GInitable.html create mode 100644 docs/reference/gio/html/GInputStream.html create mode 100644 docs/reference/gio/html/GLoadableIcon.html create mode 100644 docs/reference/gio/html/GMemoryInputStream.html create mode 100644 docs/reference/gio/html/GMemoryOutputStream.html create mode 100644 docs/reference/gio/html/GMount.html create mode 100644 docs/reference/gio/html/GMountOperation.html create mode 100644 docs/reference/gio/html/GNetworkAddress.html create mode 100644 docs/reference/gio/html/GNetworkService.html create mode 100644 docs/reference/gio/html/GOutputStream.html create mode 100644 docs/reference/gio/html/GResolver.html create mode 100644 docs/reference/gio/html/GSeekable.html create mode 100644 docs/reference/gio/html/GSimpleAsyncResult.html create mode 100644 docs/reference/gio/html/GSocket.html create mode 100644 docs/reference/gio/html/GSocketAddress.html create mode 100644 docs/reference/gio/html/GSocketClient.html create mode 100644 docs/reference/gio/html/GSocketConnectable.html create mode 100644 docs/reference/gio/html/GSocketConnection.html create mode 100644 docs/reference/gio/html/GSocketControlMessage.html create mode 100644 docs/reference/gio/html/GSocketListener.html create mode 100644 docs/reference/gio/html/GSocketService.html create mode 100644 docs/reference/gio/html/GThemedIcon.html create mode 100644 docs/reference/gio/html/GThreadedSocketService.html create mode 100644 docs/reference/gio/html/GUnixFDList.html create mode 100644 docs/reference/gio/html/GUnixFDMessage.html create mode 100644 docs/reference/gio/html/GUnixInputStream.html create mode 100644 docs/reference/gio/html/GUnixOutputStream.html create mode 100644 docs/reference/gio/html/GUnixSocketAddress.html create mode 100644 docs/reference/gio/html/GVfs.html create mode 100644 docs/reference/gio/html/GVolume.html create mode 100644 docs/reference/gio/html/GVolumeMonitor.html create mode 100644 docs/reference/gio/html/GZlibCompressor.html create mode 100644 docs/reference/gio/html/GZlibDecompressor.html create mode 100644 docs/reference/gio/html/api-index-2-18.html create mode 100644 docs/reference/gio/html/api-index-2-20.html create mode 100644 docs/reference/gio/html/api-index-2-22.html create mode 100644 docs/reference/gio/html/api-index-2-24.html create mode 100644 docs/reference/gio/html/api-index-deprecated.html create mode 100644 docs/reference/gio/html/api-index-full.html create mode 100644 docs/reference/gio/html/async.html create mode 100644 docs/reference/gio/html/ch01.html create mode 100644 docs/reference/gio/html/ch02.html create mode 100644 docs/reference/gio/html/ch03.html create mode 100644 docs/reference/gio/html/ch19.html create mode 100644 docs/reference/gio/html/ch20.html create mode 100644 docs/reference/gio/html/ch20s02.html create mode 100644 docs/reference/gio/html/ch20s03.html create mode 100644 docs/reference/gio/html/conversion.html create mode 100644 docs/reference/gio/html/extending-gio.html create mode 100644 docs/reference/gio/html/extending.html create mode 100644 docs/reference/gio/html/failable_initialization.html create mode 100644 docs/reference/gio/html/file_mon.html create mode 100644 docs/reference/gio/html/file_ops.html create mode 100644 docs/reference/gio/html/gio-Desktop-file-based-GAppInfo.html create mode 100644 docs/reference/gio/html/gio-Extension-Points.html create mode 100644 docs/reference/gio/html/gio-GContentType.html create mode 100644 docs/reference/gio/html/gio-GConverterInputstream.html create mode 100644 docs/reference/gio/html/gio-GConverterOutputstream.html create mode 100644 docs/reference/gio/html/gio-GFileAttribute.html create mode 100644 docs/reference/gio/html/gio-GIOError.html create mode 100644 docs/reference/gio/html/gio-GIOScheduler.html create mode 100644 docs/reference/gio/html/gio-GSrvTarget.html create mode 100644 docs/reference/gio/html/gio-Unix-Mounts.html create mode 100644 docs/reference/gio/html/gio-hierarchy.html create mode 100644 docs/reference/gio/html/gio.devhelp create mode 100644 docs/reference/gio/html/gio.devhelp2 create mode 100644 docs/reference/gio/html/gvfs-overview.png create mode 100644 docs/reference/gio/html/highlevel-socket.html create mode 100644 docs/reference/gio/html/home.png create mode 100644 docs/reference/gio/html/icons.html create mode 100644 docs/reference/gio/html/index.html create mode 100644 docs/reference/gio/html/index.sgml create mode 100644 docs/reference/gio/html/left.png create mode 100644 docs/reference/gio/html/migrating.html create mode 100644 docs/reference/gio/html/networking.html create mode 100644 docs/reference/gio/html/pt01.html create mode 100644 docs/reference/gio/html/pt02.html create mode 100644 docs/reference/gio/html/resolver.html create mode 100644 docs/reference/gio/html/right.png create mode 100644 docs/reference/gio/html/streaming.html create mode 100644 docs/reference/gio/html/style.css create mode 100644 docs/reference/gio/html/types.html create mode 100644 docs/reference/gio/html/up.png create mode 100644 docs/reference/gio/html/utils.html create mode 100644 docs/reference/gio/html/volume_mon.html create mode 100644 docs/reference/gio/migrating.xml create mode 100644 docs/reference/gio/overview.xml create mode 100644 docs/reference/gio/tmpl/extensionpoints.sgml create mode 100644 docs/reference/gio/tmpl/gappinfo.sgml create mode 100644 docs/reference/gio/tmpl/gasyncinitable.sgml create mode 100644 docs/reference/gio/tmpl/gasyncresult.sgml create mode 100644 docs/reference/gio/tmpl/gbufferedinputstream.sgml create mode 100644 docs/reference/gio/tmpl/gbufferedoutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gcancellable.sgml create mode 100644 docs/reference/gio/tmpl/gcharsetconverter.sgml create mode 100644 docs/reference/gio/tmpl/gcontenttype.sgml create mode 100644 docs/reference/gio/tmpl/gconverter.sgml create mode 100644 docs/reference/gio/tmpl/gconverterinputstream.sgml create mode 100644 docs/reference/gio/tmpl/gconverteroutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gdatainputstream.sgml create mode 100644 docs/reference/gio/tmpl/gdataoutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gdesktopappinfo.sgml create mode 100644 docs/reference/gio/tmpl/gdrive.sgml create mode 100644 docs/reference/gio/tmpl/gemblem.sgml create mode 100644 docs/reference/gio/tmpl/gemblemedicon.sgml create mode 100644 docs/reference/gio/tmpl/gfile.sgml create mode 100644 docs/reference/gio/tmpl/gfileattribute.sgml create mode 100644 docs/reference/gio/tmpl/gfiledescriptorbased.sgml create mode 100644 docs/reference/gio/tmpl/gfileenumerator.sgml create mode 100644 docs/reference/gio/tmpl/gfileicon.sgml create mode 100644 docs/reference/gio/tmpl/gfileinfo.sgml create mode 100644 docs/reference/gio/tmpl/gfileinputstream.sgml create mode 100644 docs/reference/gio/tmpl/gfileiostream.sgml create mode 100644 docs/reference/gio/tmpl/gfilemonitor.sgml create mode 100644 docs/reference/gio/tmpl/gfilenamecompleter.sgml create mode 100644 docs/reference/gio/tmpl/gfileoutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gfilterinputstream.sgml create mode 100644 docs/reference/gio/tmpl/gfilteroutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gicon.sgml create mode 100644 docs/reference/gio/tmpl/ginetaddress.sgml create mode 100644 docs/reference/gio/tmpl/ginetsocketaddress.sgml create mode 100644 docs/reference/gio/tmpl/ginitable.sgml create mode 100644 docs/reference/gio/tmpl/ginputstream.sgml create mode 100644 docs/reference/gio/tmpl/gio-unused.sgml create mode 100644 docs/reference/gio/tmpl/gioerror.sgml create mode 100644 docs/reference/gio/tmpl/giomodule.sgml create mode 100644 docs/reference/gio/tmpl/gioscheduler.sgml create mode 100644 docs/reference/gio/tmpl/giostream.sgml create mode 100644 docs/reference/gio/tmpl/gloadableicon.sgml create mode 100644 docs/reference/gio/tmpl/gmemoryinputstream.sgml create mode 100644 docs/reference/gio/tmpl/gmemoryoutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gmount.sgml create mode 100644 docs/reference/gio/tmpl/gmountoperation.sgml create mode 100644 docs/reference/gio/tmpl/gnetworkaddress.sgml create mode 100644 docs/reference/gio/tmpl/gnetworkservice.sgml create mode 100644 docs/reference/gio/tmpl/goutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gresolver.sgml create mode 100644 docs/reference/gio/tmpl/gseekable.sgml create mode 100644 docs/reference/gio/tmpl/gsimpleasyncresult.sgml create mode 100644 docs/reference/gio/tmpl/gsocket.sgml create mode 100644 docs/reference/gio/tmpl/gsocketaddress.sgml create mode 100644 docs/reference/gio/tmpl/gsocketclient.sgml create mode 100644 docs/reference/gio/tmpl/gsocketconnectable.sgml create mode 100644 docs/reference/gio/tmpl/gsocketconnection.sgml create mode 100644 docs/reference/gio/tmpl/gsocketcontrolmessage.sgml create mode 100644 docs/reference/gio/tmpl/gsocketlistener.sgml create mode 100644 docs/reference/gio/tmpl/gsocketservice.sgml create mode 100644 docs/reference/gio/tmpl/gsrvtarget.sgml create mode 100644 docs/reference/gio/tmpl/gthemedicon.sgml create mode 100644 docs/reference/gio/tmpl/gthreadedsocketservice.sgml create mode 100644 docs/reference/gio/tmpl/gunixfdlist.sgml create mode 100644 docs/reference/gio/tmpl/gunixfdmessage.sgml create mode 100644 docs/reference/gio/tmpl/gunixinputstream.sgml create mode 100644 docs/reference/gio/tmpl/gunixmounts.sgml create mode 100644 docs/reference/gio/tmpl/gunixoutputstream.sgml create mode 100644 docs/reference/gio/tmpl/gunixsocketaddress.sgml create mode 100644 docs/reference/gio/tmpl/gvfs.sgml create mode 100644 docs/reference/gio/tmpl/gvolume.sgml create mode 100644 docs/reference/gio/tmpl/gvolumemonitor.sgml create mode 100644 docs/reference/gio/tmpl/gzcompressor.sgml create mode 100644 docs/reference/gio/tmpl/gzdecompressor.sgml create mode 100644 docs/reference/gio/version.xml.in create mode 100644 docs/reference/glib/Makefile.am create mode 100644 docs/reference/glib/Makefile.in create mode 100644 docs/reference/glib/building.sgml create mode 100644 docs/reference/glib/changes.sgml create mode 100644 docs/reference/glib/compiling.sgml create mode 100644 docs/reference/glib/cross.sgml create mode 100644 docs/reference/glib/file-name-encodings.png create mode 100644 docs/reference/glib/file-name-encodings.sxd create mode 100644 docs/reference/glib/glib-docs.sgml create mode 100644 docs/reference/glib/glib-gettextize.1 create mode 100644 docs/reference/glib/glib-gettextize.xml create mode 100644 docs/reference/glib/glib-overrides.txt create mode 100644 docs/reference/glib/glib-sections.txt create mode 100644 docs/reference/glib/glib.types create mode 100644 docs/reference/glib/gtester-report.1 create mode 100644 docs/reference/glib/gtester-report.xml create mode 100644 docs/reference/glib/gtester.1 create mode 100644 docs/reference/glib/gtester.xml create mode 100644 docs/reference/glib/gvariant-varargs.xml create mode 100644 docs/reference/glib/html/api-index-2-10.html create mode 100644 docs/reference/glib/html/api-index-2-12.html create mode 100644 docs/reference/glib/html/api-index-2-14.html create mode 100644 docs/reference/glib/html/api-index-2-16.html create mode 100644 docs/reference/glib/html/api-index-2-18.html create mode 100644 docs/reference/glib/html/api-index-2-2.html create mode 100644 docs/reference/glib/html/api-index-2-20.html create mode 100644 docs/reference/glib/html/api-index-2-22.html create mode 100644 docs/reference/glib/html/api-index-2-24.html create mode 100644 docs/reference/glib/html/api-index-2-4.html create mode 100644 docs/reference/glib/html/api-index-2-6.html create mode 100644 docs/reference/glib/html/api-index-2-8.html create mode 100644 docs/reference/glib/html/api-index-deprecated.html create mode 100644 docs/reference/glib/html/api-index-full.html create mode 100644 docs/reference/glib/html/file-name-encodings.png create mode 100644 docs/reference/glib/html/glib-Arrays.html create mode 100644 docs/reference/glib/html/glib-Asynchronous-Queues.html create mode 100644 docs/reference/glib/html/glib-Atomic-Operations.html create mode 100644 docs/reference/glib/html/glib-Automatic-String-Completion.html create mode 100644 docs/reference/glib/html/glib-Balanced-Binary-Trees.html create mode 100644 docs/reference/glib/html/glib-Base64-Encoding.html create mode 100644 docs/reference/glib/html/glib-Basic-Types.html create mode 100644 docs/reference/glib/html/glib-Bookmark-file-parser.html create mode 100644 docs/reference/glib/html/glib-Byte-Arrays.html create mode 100644 docs/reference/glib/html/glib-Byte-Order-Macros.html create mode 100644 docs/reference/glib/html/glib-Caches.html create mode 100644 docs/reference/glib/html/glib-Character-Set-Conversion.html create mode 100644 docs/reference/glib/html/glib-Commandline-option-parser.html create mode 100644 docs/reference/glib/html/glib-Data-Checksums.html create mode 100644 docs/reference/glib/html/glib-Datasets.html create mode 100644 docs/reference/glib/html/glib-Date-and-Time-Functions.html create mode 100644 docs/reference/glib/html/glib-Double-ended-Queues.html create mode 100644 docs/reference/glib/html/glib-Doubly-Linked-Lists.html create mode 100644 docs/reference/glib/html/glib-Dynamic-Loading-of-Modules.html create mode 100644 docs/reference/glib/html/glib-Error-Reporting.html create mode 100644 docs/reference/glib/html/glib-File-Utilities.html create mode 100644 docs/reference/glib/html/glib-GVariant.html create mode 100644 docs/reference/glib/html/glib-GVariantType.html create mode 100644 docs/reference/glib/html/glib-Glob-style-pattern-matching.html create mode 100644 docs/reference/glib/html/glib-Hash-Tables.html create mode 100644 docs/reference/glib/html/glib-Hook-Functions.html create mode 100644 docs/reference/glib/html/glib-Hostname-Utilities.html create mode 100644 docs/reference/glib/html/glib-I18N.html create mode 100644 docs/reference/glib/html/glib-IO-Channels.html create mode 100644 docs/reference/glib/html/glib-Key-value-file-parser.html create mode 100644 docs/reference/glib/html/glib-Keyed-Data-Lists.html create mode 100644 docs/reference/glib/html/glib-Lexical-Scanner.html create mode 100644 docs/reference/glib/html/glib-Limits-of-Basic-Types.html create mode 100644 docs/reference/glib/html/glib-Memory-Allocation.html create mode 100644 docs/reference/glib/html/glib-Memory-Allocators.html create mode 100644 docs/reference/glib/html/glib-Memory-Chunks.html create mode 100644 docs/reference/glib/html/glib-Memory-Slices.html create mode 100644 docs/reference/glib/html/glib-Message-Logging.html create mode 100644 docs/reference/glib/html/glib-Miscellaneous-Macros.html create mode 100644 docs/reference/glib/html/glib-Miscellaneous-Utility-Functions.html create mode 100644 docs/reference/glib/html/glib-N-ary-Trees.html create mode 100644 docs/reference/glib/html/glib-Numerical-Definitions.html create mode 100644 docs/reference/glib/html/glib-Perl-compatible-regular-expressions.html create mode 100644 docs/reference/glib/html/glib-Pointer-Arrays.html create mode 100644 docs/reference/glib/html/glib-Quarks.html create mode 100644 docs/reference/glib/html/glib-Random-Numbers.html create mode 100644 docs/reference/glib/html/glib-Relations-and-Tuples.html create mode 100644 docs/reference/glib/html/glib-Sequences.html create mode 100644 docs/reference/glib/html/glib-Shell-related-Utilities.html create mode 100644 docs/reference/glib/html/glib-Simple-XML-Subset-Parser.html create mode 100644 docs/reference/glib/html/glib-Singly-Linked-Lists.html create mode 100644 docs/reference/glib/html/glib-Spawning-Processes.html create mode 100644 docs/reference/glib/html/glib-Standard-Macros.html create mode 100644 docs/reference/glib/html/glib-String-Chunks.html create mode 100644 docs/reference/glib/html/glib-String-Utility-Functions.html create mode 100644 docs/reference/glib/html/glib-Strings.html create mode 100644 docs/reference/glib/html/glib-Testing.html create mode 100644 docs/reference/glib/html/glib-The-Main-Event-Loop.html create mode 100644 docs/reference/glib/html/glib-Thread-Pools.html create mode 100644 docs/reference/glib/html/glib-Threads.html create mode 100644 docs/reference/glib/html/glib-Timers.html create mode 100644 docs/reference/glib/html/glib-Trash-Stacks.html create mode 100644 docs/reference/glib/html/glib-Type-Conversion-Macros.html create mode 100644 docs/reference/glib/html/glib-URI-Functions.html create mode 100644 docs/reference/glib/html/glib-Unicode-Manipulation.html create mode 100644 docs/reference/glib/html/glib-Version-Information.html create mode 100644 docs/reference/glib/html/glib-Warnings-and-Assertions.html create mode 100644 docs/reference/glib/html/glib-Windows-Compatibility-Functions.html create mode 100644 docs/reference/glib/html/glib-building.html create mode 100644 docs/reference/glib/html/glib-changes.html create mode 100644 docs/reference/glib/html/glib-compiling.html create mode 100644 docs/reference/glib/html/glib-core.html create mode 100644 docs/reference/glib/html/glib-cross-compiling.html create mode 100644 docs/reference/glib/html/glib-data-types.html create mode 100644 docs/reference/glib/html/glib-fundamentals.html create mode 100644 docs/reference/glib/html/glib-gettextize.html create mode 100644 docs/reference/glib/html/glib-regex-syntax.html create mode 100644 docs/reference/glib/html/glib-resources.html create mode 100644 docs/reference/glib/html/glib-running.html create mode 100644 docs/reference/glib/html/glib-utilities.html create mode 100644 docs/reference/glib/html/glib.devhelp create mode 100644 docs/reference/glib/html/glib.devhelp2 create mode 100644 docs/reference/glib/html/glib.html create mode 100644 docs/reference/glib/html/gtester-report.html create mode 100644 docs/reference/glib/html/gtester.html create mode 100644 docs/reference/glib/html/gvariant-format-strings.html create mode 100644 docs/reference/glib/html/home.png create mode 100644 docs/reference/glib/html/index.html create mode 100644 docs/reference/glib/html/index.sgml create mode 100644 docs/reference/glib/html/left.png create mode 100644 docs/reference/glib/html/mainloop-states.gif create mode 100644 docs/reference/glib/html/right.png create mode 100644 docs/reference/glib/html/style.css create mode 100644 docs/reference/glib/html/tools.html create mode 100644 docs/reference/glib/html/up.png create mode 100644 docs/reference/glib/mainloop-states.eps create mode 100644 docs/reference/glib/mainloop-states.fig create mode 100644 docs/reference/glib/mainloop-states.gif create mode 100644 docs/reference/glib/mainloop-states.png create mode 100644 docs/reference/glib/regex-syntax.sgml create mode 100644 docs/reference/glib/resources.sgml create mode 100644 docs/reference/glib/running.sgml create mode 100644 docs/reference/glib/tmpl/allocators.sgml create mode 100644 docs/reference/glib/tmpl/arrays.sgml create mode 100644 docs/reference/glib/tmpl/arrays_byte.sgml create mode 100644 docs/reference/glib/tmpl/arrays_pointer.sgml create mode 100644 docs/reference/glib/tmpl/async_queues.sgml create mode 100644 docs/reference/glib/tmpl/atomic_operations.sgml create mode 100644 docs/reference/glib/tmpl/base64.sgml create mode 100644 docs/reference/glib/tmpl/bookmarkfile.sgml create mode 100644 docs/reference/glib/tmpl/byte_order.sgml create mode 100644 docs/reference/glib/tmpl/caches.sgml create mode 100644 docs/reference/glib/tmpl/checksum.sgml create mode 100644 docs/reference/glib/tmpl/completion.sgml create mode 100644 docs/reference/glib/tmpl/conversions.sgml create mode 100644 docs/reference/glib/tmpl/datalist.sgml create mode 100644 docs/reference/glib/tmpl/datasets.sgml create mode 100644 docs/reference/glib/tmpl/date.sgml create mode 100644 docs/reference/glib/tmpl/error_reporting.sgml create mode 100644 docs/reference/glib/tmpl/fileutils.sgml create mode 100644 docs/reference/glib/tmpl/ghostutils.sgml create mode 100644 docs/reference/glib/tmpl/glib-unused.sgml create mode 100644 docs/reference/glib/tmpl/gregex.sgml create mode 100644 docs/reference/glib/tmpl/gurifuncs.sgml create mode 100644 docs/reference/glib/tmpl/gvariant.sgml create mode 100644 docs/reference/glib/tmpl/gvarianttype.sgml create mode 100644 docs/reference/glib/tmpl/hash_tables.sgml create mode 100644 docs/reference/glib/tmpl/hooks.sgml create mode 100644 docs/reference/glib/tmpl/i18n.sgml create mode 100644 docs/reference/glib/tmpl/iochannels.sgml create mode 100644 docs/reference/glib/tmpl/keyfile.sgml create mode 100644 docs/reference/glib/tmpl/limits.sgml create mode 100644 docs/reference/glib/tmpl/linked_lists_double.sgml create mode 100644 docs/reference/glib/tmpl/linked_lists_single.sgml create mode 100644 docs/reference/glib/tmpl/macros.sgml create mode 100644 docs/reference/glib/tmpl/macros_misc.sgml create mode 100644 docs/reference/glib/tmpl/main.sgml create mode 100644 docs/reference/glib/tmpl/markup.sgml create mode 100644 docs/reference/glib/tmpl/memory.sgml create mode 100644 docs/reference/glib/tmpl/memory_chunks.sgml create mode 100644 docs/reference/glib/tmpl/memory_slices.sgml create mode 100644 docs/reference/glib/tmpl/messages.sgml create mode 100644 docs/reference/glib/tmpl/misc_utils.sgml create mode 100644 docs/reference/glib/tmpl/modules.sgml create mode 100644 docs/reference/glib/tmpl/numerical.sgml create mode 100644 docs/reference/glib/tmpl/option.sgml create mode 100644 docs/reference/glib/tmpl/patterns.sgml create mode 100644 docs/reference/glib/tmpl/quarks.sgml create mode 100644 docs/reference/glib/tmpl/queue.sgml create mode 100644 docs/reference/glib/tmpl/random_numbers.sgml create mode 100644 docs/reference/glib/tmpl/relations.sgml create mode 100644 docs/reference/glib/tmpl/scanner.sgml create mode 100644 docs/reference/glib/tmpl/sequence.sgml create mode 100644 docs/reference/glib/tmpl/shell.sgml create mode 100644 docs/reference/glib/tmpl/spawn.sgml create mode 100644 docs/reference/glib/tmpl/string_chunks.sgml create mode 100644 docs/reference/glib/tmpl/string_utils.sgml create mode 100644 docs/reference/glib/tmpl/strings.sgml create mode 100644 docs/reference/glib/tmpl/testing.sgml create mode 100644 docs/reference/glib/tmpl/thread_pools.sgml create mode 100644 docs/reference/glib/tmpl/threads.sgml create mode 100644 docs/reference/glib/tmpl/timers.sgml create mode 100644 docs/reference/glib/tmpl/trash_stack.sgml create mode 100644 docs/reference/glib/tmpl/trees-binary.sgml create mode 100644 docs/reference/glib/tmpl/trees-nary.sgml create mode 100644 docs/reference/glib/tmpl/type_conversion.sgml create mode 100644 docs/reference/glib/tmpl/types.sgml create mode 100644 docs/reference/glib/tmpl/unicode.sgml create mode 100644 docs/reference/glib/tmpl/version.sgml create mode 100644 docs/reference/glib/tmpl/warnings.sgml create mode 100644 docs/reference/glib/tmpl/windows.sgml create mode 100644 docs/reference/glib/version.xml.in create mode 100644 docs/reference/gobject/Makefile.am create mode 100644 docs/reference/gobject/Makefile.in create mode 100644 docs/reference/gobject/glib-genmarshal.1 create mode 100644 docs/reference/gobject/glib-genmarshal.xml create mode 100644 docs/reference/gobject/glib-mkenums.1 create mode 100644 docs/reference/gobject/glib-mkenums.xml create mode 100644 docs/reference/gobject/gobject-docs.sgml create mode 100644 docs/reference/gobject/gobject-overrides.txt create mode 100644 docs/reference/gobject/gobject-query.1 create mode 100644 docs/reference/gobject/gobject-query.xml create mode 100644 docs/reference/gobject/gobject-sections.txt create mode 100644 docs/reference/gobject/gobject.cI create mode 100644 docs/reference/gobject/gobject.types create mode 100644 docs/reference/gobject/html/GTypeModule.html create mode 100644 docs/reference/gobject/html/GTypePlugin.html create mode 100644 docs/reference/gobject/html/api-index-2-10.html create mode 100644 docs/reference/gobject/html/api-index-2-12.html create mode 100644 docs/reference/gobject/html/api-index-2-14.html create mode 100644 docs/reference/gobject/html/api-index-2-18.html create mode 100644 docs/reference/gobject/html/api-index-2-2.html create mode 100644 docs/reference/gobject/html/api-index-2-22.html create mode 100644 docs/reference/gobject/html/api-index-2-24.html create mode 100644 docs/reference/gobject/html/api-index-2-4.html create mode 100644 docs/reference/gobject/html/api-index-2-6.html create mode 100644 docs/reference/gobject/html/api-index-2-8.html create mode 100644 docs/reference/gobject/html/api-index-deprecated.html create mode 100644 docs/reference/gobject/html/api-index-full.html create mode 100644 docs/reference/gobject/html/ch01s02.html create mode 100644 docs/reference/gobject/html/ch06s03.html create mode 100644 docs/reference/gobject/html/chapter-gobject.html create mode 100644 docs/reference/gobject/html/chapter-gtype.html create mode 100644 docs/reference/gobject/html/chapter-intro.html create mode 100644 docs/reference/gobject/html/chapter-signal.html create mode 100644 docs/reference/gobject/html/glib-genmarshal.html create mode 100644 docs/reference/gobject/html/glib-mkenums.html create mode 100644 docs/reference/gobject/html/glue.png create mode 100644 docs/reference/gobject/html/gobject-Boxed-Types.html create mode 100644 docs/reference/gobject/html/gobject-Closures.html create mode 100644 docs/reference/gobject/html/gobject-Enumeration-and-Flag-Types.html create mode 100644 docs/reference/gobject/html/gobject-GParamSpec.html create mode 100644 docs/reference/gobject/html/gobject-Generic-values.html create mode 100644 docs/reference/gobject/html/gobject-Signals.html create mode 100644 docs/reference/gobject/html/gobject-Standard-Parameter-and-Value-Types.html create mode 100644 docs/reference/gobject/html/gobject-The-Base-Object-Type.html create mode 100644 docs/reference/gobject/html/gobject-Type-Information.html create mode 100644 docs/reference/gobject/html/gobject-Value-arrays.html create mode 100644 docs/reference/gobject/html/gobject-Varargs-Value-Collection.html create mode 100644 docs/reference/gobject/html/gobject-memory.html create mode 100644 docs/reference/gobject/html/gobject-properties.html create mode 100644 docs/reference/gobject/html/gobject-query.html create mode 100644 docs/reference/gobject/html/gobject.devhelp create mode 100644 docs/reference/gobject/html/gobject.devhelp2 create mode 100644 docs/reference/gobject/html/gtype-conventions.html create mode 100644 docs/reference/gobject/html/gtype-instantiable-classed.html create mode 100644 docs/reference/gobject/html/gtype-non-instantiable-classed.html create mode 100644 docs/reference/gobject/html/gtype-non-instantiable.html create mode 100644 docs/reference/gobject/html/home.png create mode 100644 docs/reference/gobject/html/howto-gobject-chainup.html create mode 100644 docs/reference/gobject/html/howto-gobject-code.html create mode 100644 docs/reference/gobject/html/howto-gobject-construction.html create mode 100644 docs/reference/gobject/html/howto-gobject-destruction.html create mode 100644 docs/reference/gobject/html/howto-gobject-methods.html create mode 100644 docs/reference/gobject/html/howto-gobject.html create mode 100644 docs/reference/gobject/html/howto-interface-implement.html create mode 100644 docs/reference/gobject/html/howto-interface-properties.html create mode 100644 docs/reference/gobject/html/howto-interface.html create mode 100644 docs/reference/gobject/html/howto-signals.html create mode 100644 docs/reference/gobject/html/index.html create mode 100644 docs/reference/gobject/html/index.sgml create mode 100644 docs/reference/gobject/html/left.png create mode 100644 docs/reference/gobject/html/pr01.html create mode 100644 docs/reference/gobject/html/pt01.html create mode 100644 docs/reference/gobject/html/pt02.html create mode 100644 docs/reference/gobject/html/pt03.html create mode 100644 docs/reference/gobject/html/right.png create mode 100644 docs/reference/gobject/html/rn01.html create mode 100644 docs/reference/gobject/html/rn02.html create mode 100644 docs/reference/gobject/html/signal.html create mode 100644 docs/reference/gobject/html/style.css create mode 100644 docs/reference/gobject/html/tools-ginspector.html create mode 100644 docs/reference/gobject/html/tools-gob.html create mode 100644 docs/reference/gobject/html/tools-gtkdoc.html create mode 100644 docs/reference/gobject/html/tools-refdb.html create mode 100644 docs/reference/gobject/html/tools-vala.html create mode 100644 docs/reference/gobject/html/up.png create mode 100644 docs/reference/gobject/images/glue.png create mode 100644 docs/reference/gobject/tmpl/enumerations_flags.sgml create mode 100644 docs/reference/gobject/tmpl/gboxed.sgml create mode 100644 docs/reference/gobject/tmpl/gclosure.sgml create mode 100644 docs/reference/gobject/tmpl/generic_values.sgml create mode 100644 docs/reference/gobject/tmpl/gobject-unused.sgml create mode 100644 docs/reference/gobject/tmpl/gparamspec.sgml create mode 100644 docs/reference/gobject/tmpl/gtype.sgml create mode 100644 docs/reference/gobject/tmpl/gtypemodule.sgml create mode 100644 docs/reference/gobject/tmpl/gtypeplugin.sgml create mode 100644 docs/reference/gobject/tmpl/objects.sgml create mode 100644 docs/reference/gobject/tmpl/param_value_types.sgml create mode 100644 docs/reference/gobject/tmpl/signals.sgml create mode 100644 docs/reference/gobject/tmpl/value_arrays.sgml create mode 100644 docs/reference/gobject/tmpl/value_collection.sgml create mode 100644 docs/reference/gobject/tut_gobject.xml create mode 100644 docs/reference/gobject/tut_gsignal.xml create mode 100644 docs/reference/gobject/tut_gtype.xml create mode 100644 docs/reference/gobject/tut_howto.xml create mode 100644 docs/reference/gobject/tut_intro.xml create mode 100644 docs/reference/gobject/tut_tools.xml create mode 100644 docs/reference/gobject/version.xml.in create mode 100644 gio-2.0-uninstalled.pc.in create mode 100644 gio-2.0.pc.in create mode 100644 gio-unix-2.0-uninstalled.pc.in create mode 100644 gio-unix-2.0.pc.in create mode 100644 gio/ChangeLog create mode 100644 gio/Makefile.am create mode 100644 gio/Makefile.in create mode 100755 gio/abicheck.sh create mode 100644 gio/fam/Makefile.am create mode 100644 gio/fam/Makefile.in create mode 100644 gio/fam/fam-helper.c create mode 100644 gio/fam/fam-helper.h create mode 100644 gio/fam/fam-module.c create mode 100644 gio/fam/gfamdirectorymonitor.c create mode 100644 gio/fam/gfamdirectorymonitor.h create mode 100644 gio/fam/gfamfilemonitor.c create mode 100644 gio/fam/gfamfilemonitor.h create mode 100644 gio/fen/Makefile.am create mode 100644 gio/fen/Makefile.in create mode 100644 gio/fen/fen-data.c create mode 100644 gio/fen/fen-data.h create mode 100644 gio/fen/fen-dump.c create mode 100644 gio/fen/fen-dump.h create mode 100644 gio/fen/fen-helper.c create mode 100644 gio/fen/fen-helper.h create mode 100644 gio/fen/fen-kernel.c create mode 100644 gio/fen/fen-kernel.h create mode 100644 gio/fen/fen-missing.c create mode 100644 gio/fen/fen-missing.h create mode 100644 gio/fen/fen-node.c create mode 100644 gio/fen/fen-node.h create mode 100644 gio/fen/fen-sub.c create mode 100644 gio/fen/fen-sub.h create mode 100644 gio/fen/gfendirectorymonitor.c create mode 100644 gio/fen/gfendirectorymonitor.h create mode 100644 gio/fen/gfenfilemonitor.c create mode 100644 gio/fen/gfenfilemonitor.h create mode 100644 gio/gappinfo.c create mode 100644 gio/gappinfo.h create mode 100644 gio/gasynchelper.c create mode 100644 gio/gasynchelper.h create mode 100644 gio/gasyncinitable.c create mode 100644 gio/gasyncinitable.h create mode 100644 gio/gasyncresult.c create mode 100644 gio/gasyncresult.h create mode 100644 gio/gbufferedinputstream.c create mode 100644 gio/gbufferedinputstream.h create mode 100644 gio/gbufferedoutputstream.c create mode 100644 gio/gbufferedoutputstream.h create mode 100644 gio/gcancellable.c create mode 100644 gio/gcancellable.h create mode 100644 gio/gcharsetconverter.c create mode 100644 gio/gcharsetconverter.h create mode 100644 gio/gcontenttype.c create mode 100644 gio/gcontenttype.h create mode 100644 gio/gcontenttypeprivate.h create mode 100644 gio/gconverter.c create mode 100644 gio/gconverter.h create mode 100644 gio/gconverterinputstream.c create mode 100644 gio/gconverterinputstream.h create mode 100644 gio/gconverteroutputstream.c create mode 100644 gio/gconverteroutputstream.h create mode 100644 gio/gdatainputstream.c create mode 100644 gio/gdatainputstream.h create mode 100644 gio/gdataoutputstream.c create mode 100644 gio/gdataoutputstream.h create mode 100644 gio/gdesktopappinfo.c create mode 100644 gio/gdesktopappinfo.h create mode 100644 gio/gdrive.c create mode 100644 gio/gdrive.h create mode 100644 gio/gdummyfile.c create mode 100644 gio/gdummyfile.h create mode 100644 gio/gemblem.c create mode 100644 gio/gemblem.h create mode 100644 gio/gemblemedicon.c create mode 100644 gio/gemblemedicon.h create mode 100644 gio/gfile.c create mode 100644 gio/gfile.h create mode 100644 gio/gfileattribute-priv.h create mode 100644 gio/gfileattribute.c create mode 100644 gio/gfileattribute.h create mode 100644 gio/gfiledescriptorbased.c create mode 100644 gio/gfiledescriptorbased.h create mode 100644 gio/gfileenumerator.c create mode 100644 gio/gfileenumerator.h create mode 100644 gio/gfileicon.c create mode 100644 gio/gfileicon.h create mode 100644 gio/gfileinfo-priv.h create mode 100644 gio/gfileinfo.c create mode 100644 gio/gfileinfo.h create mode 100644 gio/gfileinputstream.c create mode 100644 gio/gfileinputstream.h create mode 100644 gio/gfileiostream.c create mode 100644 gio/gfileiostream.h create mode 100644 gio/gfilemonitor.c create mode 100644 gio/gfilemonitor.h create mode 100644 gio/gfilenamecompleter.c create mode 100644 gio/gfilenamecompleter.h create mode 100644 gio/gfileoutputstream.c create mode 100644 gio/gfileoutputstream.h create mode 100644 gio/gfilterinputstream.c create mode 100644 gio/gfilterinputstream.h create mode 100644 gio/gfilteroutputstream.c create mode 100644 gio/gfilteroutputstream.h create mode 100644 gio/gicon.c create mode 100644 gio/gicon.h create mode 100644 gio/ginetaddress.c create mode 100644 gio/ginetaddress.h create mode 100644 gio/ginetsocketaddress.c create mode 100644 gio/ginetsocketaddress.h create mode 100644 gio/ginitable.c create mode 100644 gio/ginitable.h create mode 100644 gio/ginputstream.c create mode 100644 gio/ginputstream.h create mode 100644 gio/gio-marshal.list create mode 100644 gio/gio-querymodules.c create mode 100644 gio/gio.h create mode 100644 gio/gio.rc.in create mode 100644 gio/gio.symbols create mode 100644 gio/gioalias.h create mode 100644 gio/gioaliasdef.c create mode 100644 gio/gioenums.h create mode 100644 gio/gioenumtypes.c create mode 100644 gio/gioenumtypes.c.template create mode 100644 gio/gioenumtypes.h create mode 100644 gio/gioenumtypes.h.template create mode 100644 gio/gioerror.c create mode 100644 gio/gioerror.h create mode 100644 gio/giomodule-priv.h create mode 100644 gio/giomodule.c create mode 100644 gio/giomodule.h create mode 100644 gio/gioscheduler.c create mode 100644 gio/gioscheduler.h create mode 100644 gio/giostream.c create mode 100644 gio/giostream.h create mode 100644 gio/giotypes.h create mode 100644 gio/gloadableicon.c create mode 100644 gio/gloadableicon.h create mode 100644 gio/glocaldirectorymonitor.c create mode 100644 gio/glocaldirectorymonitor.h create mode 100644 gio/glocalfile.c create mode 100644 gio/glocalfile.h create mode 100644 gio/glocalfileenumerator.c create mode 100644 gio/glocalfileenumerator.h create mode 100644 gio/glocalfileinfo.c create mode 100644 gio/glocalfileinfo.h create mode 100644 gio/glocalfileinputstream.c create mode 100644 gio/glocalfileinputstream.h create mode 100644 gio/glocalfileiostream.c create mode 100644 gio/glocalfileiostream.h create mode 100644 gio/glocalfilemonitor.c create mode 100644 gio/glocalfilemonitor.h create mode 100644 gio/glocalfileoutputstream.c create mode 100644 gio/glocalfileoutputstream.h create mode 100644 gio/glocalvfs.c create mode 100644 gio/glocalvfs.h create mode 100644 gio/gmemoryinputstream.c create mode 100644 gio/gmemoryinputstream.h create mode 100644 gio/gmemoryoutputstream.c create mode 100644 gio/gmemoryoutputstream.h create mode 100644 gio/gmount.c create mode 100644 gio/gmount.h create mode 100644 gio/gmountoperation.c create mode 100644 gio/gmountoperation.h create mode 100644 gio/gmountprivate.h create mode 100644 gio/gnativevolumemonitor.c create mode 100644 gio/gnativevolumemonitor.h create mode 100644 gio/gnetworkaddress.c create mode 100644 gio/gnetworkaddress.h create mode 100644 gio/gnetworkingprivate.h create mode 100644 gio/gnetworkservice.c create mode 100644 gio/gnetworkservice.h create mode 100644 gio/goutputstream.c create mode 100644 gio/goutputstream.h create mode 100644 gio/gpollfilemonitor.c create mode 100644 gio/gpollfilemonitor.h create mode 100644 gio/gresolver.c create mode 100644 gio/gresolver.h create mode 100644 gio/gseekable.c create mode 100644 gio/gseekable.h create mode 100644 gio/gsimpleasyncresult.c create mode 100644 gio/gsimpleasyncresult.h create mode 100644 gio/gsocket.c create mode 100644 gio/gsocket.h create mode 100644 gio/gsocketaddress.c create mode 100644 gio/gsocketaddress.h create mode 100644 gio/gsocketaddressenumerator.c create mode 100644 gio/gsocketaddressenumerator.h create mode 100644 gio/gsocketclient.c create mode 100644 gio/gsocketclient.h create mode 100644 gio/gsocketconnectable.c create mode 100644 gio/gsocketconnectable.h create mode 100644 gio/gsocketconnection.c create mode 100644 gio/gsocketconnection.h create mode 100644 gio/gsocketcontrolmessage.c create mode 100644 gio/gsocketcontrolmessage.h create mode 100644 gio/gsocketinputstream.c create mode 100644 gio/gsocketinputstream.h create mode 100644 gio/gsocketlistener.c create mode 100644 gio/gsocketlistener.h create mode 100644 gio/gsocketoutputstream.c create mode 100644 gio/gsocketoutputstream.h create mode 100644 gio/gsocketservice.c create mode 100644 gio/gsocketservice.h create mode 100644 gio/gsrvtarget.c create mode 100644 gio/gsrvtarget.h create mode 100644 gio/gtcpconnection.c create mode 100644 gio/gtcpconnection.h create mode 100644 gio/gthemedicon.c create mode 100644 gio/gthemedicon.h create mode 100644 gio/gthreadedresolver.c create mode 100644 gio/gthreadedresolver.h create mode 100644 gio/gthreadedsocketservice.c create mode 100644 gio/gthreadedsocketservice.h create mode 100644 gio/gunionvolumemonitor.c create mode 100644 gio/gunionvolumemonitor.h create mode 100644 gio/gunixconnection.c create mode 100644 gio/gunixconnection.h create mode 100644 gio/gunixfdlist.c create mode 100644 gio/gunixfdlist.h create mode 100644 gio/gunixfdmessage.c create mode 100644 gio/gunixfdmessage.h create mode 100644 gio/gunixinputstream.c create mode 100644 gio/gunixinputstream.h create mode 100644 gio/gunixmount.c create mode 100644 gio/gunixmount.h create mode 100644 gio/gunixmounts.c create mode 100644 gio/gunixmounts.h create mode 100644 gio/gunixoutputstream.c create mode 100644 gio/gunixoutputstream.h create mode 100644 gio/gunixresolver.c create mode 100644 gio/gunixresolver.h create mode 100644 gio/gunixsocketaddress.c create mode 100644 gio/gunixsocketaddress.h create mode 100644 gio/gunixvolume.c create mode 100644 gio/gunixvolume.h create mode 100644 gio/gunixvolumemonitor.c create mode 100644 gio/gunixvolumemonitor.h create mode 100644 gio/gvfs.c create mode 100644 gio/gvfs.h create mode 100644 gio/gvolume.c create mode 100644 gio/gvolume.h create mode 100644 gio/gvolumemonitor.c create mode 100644 gio/gvolumemonitor.h create mode 100644 gio/gwin32appinfo.c create mode 100644 gio/gwin32appinfo.h create mode 100644 gio/gwin32mount.c create mode 100644 gio/gwin32mount.h create mode 100644 gio/gwin32resolver.c create mode 100644 gio/gwin32resolver.h create mode 100644 gio/gwin32volumemonitor.c create mode 100644 gio/gwin32volumemonitor.h create mode 100644 gio/gzlibcompressor.c create mode 100644 gio/gzlibcompressor.h create mode 100644 gio/gzlibdecompressor.c create mode 100644 gio/gzlibdecompressor.h create mode 100644 gio/inotify/Makefile.am create mode 100644 gio/inotify/Makefile.in create mode 100644 gio/inotify/ginotifydirectorymonitor.c create mode 100644 gio/inotify/ginotifydirectorymonitor.h create mode 100644 gio/inotify/ginotifyfilemonitor.c create mode 100644 gio/inotify/ginotifyfilemonitor.h create mode 100644 gio/inotify/inotify-diag.c create mode 100644 gio/inotify/inotify-diag.h create mode 100644 gio/inotify/inotify-helper.c create mode 100644 gio/inotify/inotify-helper.h create mode 100644 gio/inotify/inotify-kernel.c create mode 100644 gio/inotify/inotify-kernel.h create mode 100644 gio/inotify/inotify-missing.c create mode 100644 gio/inotify/inotify-missing.h create mode 100644 gio/inotify/inotify-path.c create mode 100644 gio/inotify/inotify-path.h create mode 100644 gio/inotify/inotify-sub.c create mode 100644 gio/inotify/inotify-sub.h create mode 100644 gio/libasyncns/Makefile.am create mode 100644 gio/libasyncns/Makefile.in create mode 100644 gio/libasyncns/README create mode 100644 gio/libasyncns/asyncns.c create mode 100644 gio/libasyncns/asyncns.h create mode 100644 gio/libasyncns/g-asyncns.h create mode 100644 gio/libasyncns/update.sh create mode 100644 gio/makefile.msc create mode 100755 gio/makegioalias.pl create mode 100755 gio/pltcheck.sh create mode 100644 gio/tests/Makefile.am create mode 100644 gio/tests/Makefile.in create mode 100644 gio/tests/buffered-input-stream.c create mode 100644 gio/tests/contexts.c create mode 100644 gio/tests/converter-stream.c create mode 100644 gio/tests/data-input-stream.c create mode 100644 gio/tests/data-output-stream.c create mode 100644 gio/tests/desktop-app-info.c create mode 100644 gio/tests/echo-server.c create mode 100644 gio/tests/filter-cat.c create mode 100644 gio/tests/filter-streams.c create mode 100644 gio/tests/g-file-info.c create mode 100644 gio/tests/g-file.c create mode 100644 gio/tests/g-icon.c create mode 100644 gio/tests/httpd.c create mode 100644 gio/tests/live-g-file.c create mode 100644 gio/tests/memory-input-stream.c create mode 100644 gio/tests/memory-output-stream.c create mode 100644 gio/tests/readwrite.c create mode 100644 gio/tests/resolver.c create mode 100644 gio/tests/send-data.c create mode 100644 gio/tests/simple-async-result.c create mode 100644 gio/tests/sleepy-stream.c create mode 100644 gio/tests/socket-client.c create mode 100644 gio/tests/socket-server.c create mode 100644 gio/tests/srvtarget.c create mode 100644 gio/tests/unix-fd.c create mode 100644 gio/tests/unix-streams.c create mode 100644 gio/win32/Makefile.am create mode 100644 gio/win32/Makefile.in create mode 100644 gio/win32/gwin32directorymonitor.c create mode 100644 gio/win32/gwin32directorymonitor.h create mode 100644 gio/win32/gwinhttpfile.c create mode 100644 gio/win32/gwinhttpfile.h create mode 100644 gio/win32/gwinhttpfileinputstream.c create mode 100644 gio/win32/gwinhttpfileinputstream.h create mode 100644 gio/win32/gwinhttpfileoutputstream.c create mode 100644 gio/win32/gwinhttpfileoutputstream.h create mode 100644 gio/win32/gwinhttpvfs.c create mode 100644 gio/win32/gwinhttpvfs.h create mode 100644 gio/win32/winhttp.h create mode 100644 gio/xdgmime/Makefile.am create mode 100644 gio/xdgmime/Makefile.in create mode 100644 gio/xdgmime/xdgmime.c create mode 100644 gio/xdgmime/xdgmime.h create mode 100644 gio/xdgmime/xdgmimealias.c create mode 100644 gio/xdgmime/xdgmimealias.h create mode 100644 gio/xdgmime/xdgmimecache.c create mode 100644 gio/xdgmime/xdgmimecache.h create mode 100644 gio/xdgmime/xdgmimeglob.c create mode 100644 gio/xdgmime/xdgmimeglob.h create mode 100644 gio/xdgmime/xdgmimeicon.c create mode 100644 gio/xdgmime/xdgmimeicon.h create mode 100644 gio/xdgmime/xdgmimeint.c create mode 100644 gio/xdgmime/xdgmimeint.h create mode 100644 gio/xdgmime/xdgmimemagic.c create mode 100644 gio/xdgmime/xdgmimemagic.h create mode 100644 gio/xdgmime/xdgmimeparent.c create mode 100644 gio/xdgmime/xdgmimeparent.h create mode 100644 glib-2.0-uninstalled.pc.in create mode 100644 glib-2.0.pc.in create mode 100644 glib-gettextize.in create mode 100755 glib-zip.in create mode 100644 glib/Makefile.am create mode 100644 glib/Makefile.in create mode 100755 glib/abicheck.sh create mode 100644 glib/galias.h create mode 100644 glib/galiasdef.c create mode 100644 glib/galloca.h create mode 100644 glib/garray.c create mode 100644 glib/garray.h create mode 100644 glib/gasyncqueue.c create mode 100644 glib/gasyncqueue.h create mode 100644 glib/gatomic-gcc.c create mode 100644 glib/gatomic.c create mode 100644 glib/gatomic.h create mode 100644 glib/gbacktrace.c create mode 100644 glib/gbacktrace.h create mode 100644 glib/gbase64.c create mode 100644 glib/gbase64.h create mode 100644 glib/gbitlock.c create mode 100644 glib/gbitlock.h create mode 100644 glib/gbookmarkfile.c create mode 100644 glib/gbookmarkfile.h create mode 100644 glib/gbsearcharray.h create mode 100644 glib/gbuffer.c create mode 100644 glib/gbuffer.h create mode 100644 glib/gcache.c create mode 100644 glib/gcache.h create mode 100644 glib/gchecksum.c create mode 100644 glib/gchecksum.h create mode 100644 glib/gcompletion.c create mode 100644 glib/gcompletion.h create mode 100644 glib/gconvert.c create mode 100644 glib/gconvert.h create mode 100644 glib/gdataset.c create mode 100644 glib/gdataset.h create mode 100644 glib/gdatasetprivate.h create mode 100644 glib/gdate.c create mode 100644 glib/gdate.h create mode 100644 glib/gdebug.h create mode 100644 glib/gdir.c create mode 100644 glib/gdir.h create mode 100755 glib/gen-script-table.pl create mode 100755 glib/gen-unicode-tables.pl create mode 100644 glib/gerror.c create mode 100644 glib/gerror.h create mode 100644 glib/gfileutils.c create mode 100644 glib/gfileutils.h create mode 100644 glib/ghash.c create mode 100644 glib/ghash.h create mode 100644 glib/ghook.c create mode 100644 glib/ghook.h create mode 100644 glib/ghostutils.c create mode 100644 glib/ghostutils.h create mode 100644 glib/gi18n-lib.h create mode 100644 glib/gi18n.h create mode 100644 glib/giochannel.c create mode 100644 glib/giochannel.h create mode 100644 glib/giounix.c create mode 100644 glib/giowin32.c create mode 100644 glib/gkeyfile.c create mode 100644 glib/gkeyfile.h create mode 100644 glib/glib-mirroring-tab/Makefile create mode 100644 glib/glib-mirroring-tab/gen-mirroring-tab.c create mode 100644 glib/glib-mirroring-tab/packtab.c create mode 100644 glib/glib-mirroring-tab/packtab.h create mode 100644 glib/glib-object.h create mode 100644 glib/glib.h create mode 100644 glib/glib.py create mode 100644 glib/glib.rc.in create mode 100644 glib/glib.symbols create mode 100644 glib/glibintl.h create mode 100644 glib/glist.c create mode 100644 glib/glist.h create mode 100644 glib/gmacros.h create mode 100644 glib/gmain.c create mode 100644 glib/gmain.h create mode 100644 glib/gmappedfile.c create mode 100644 glib/gmappedfile.h create mode 100644 glib/gmarkup.c create mode 100644 glib/gmarkup.h create mode 100644 glib/gmem.c create mode 100644 glib/gmem.h create mode 100644 glib/gmessages.c create mode 100644 glib/gmessages.h create mode 100644 glib/gmirroringtable.h create mode 100644 glib/gnode.c create mode 100644 glib/gnode.h create mode 100644 glib/gnulib/Makefile.am create mode 100644 glib/gnulib/Makefile.in create mode 100644 glib/gnulib/README create mode 100644 glib/gnulib/asnprintf.c create mode 100644 glib/gnulib/g-gnulib.h create mode 100644 glib/gnulib/makefile.msc create mode 100644 glib/gnulib/printf-args.c create mode 100644 glib/gnulib/printf-args.h create mode 100644 glib/gnulib/printf-parse.c create mode 100644 glib/gnulib/printf-parse.h create mode 100644 glib/gnulib/printf.c create mode 100644 glib/gnulib/printf.h create mode 100644 glib/gnulib/vasnprintf.c create mode 100644 glib/gnulib/vasnprintf.h create mode 100644 glib/goption.c create mode 100644 glib/goption.h create mode 100644 glib/gpattern.c create mode 100644 glib/gpattern.h create mode 100644 glib/gpoll.c create mode 100644 glib/gpoll.h create mode 100644 glib/gprimes.c create mode 100644 glib/gprimes.h create mode 100644 glib/gprintf.c create mode 100644 glib/gprintf.h create mode 100644 glib/gprintfint.h create mode 100644 glib/gqsort.c create mode 100644 glib/gqsort.h create mode 100644 glib/gquark.h create mode 100644 glib/gqueue.c create mode 100644 glib/gqueue.h create mode 100644 glib/grand.c create mode 100644 glib/grand.h create mode 100644 glib/gregex.c create mode 100644 glib/gregex.h create mode 100644 glib/grel.c create mode 100644 glib/grel.h create mode 100644 glib/gscanner.c create mode 100644 glib/gscanner.h create mode 100644 glib/gscripttable.h create mode 100644 glib/gsequence.c create mode 100644 glib/gsequence.h create mode 100644 glib/gshell.c create mode 100644 glib/gshell.h create mode 100644 glib/gslice.c create mode 100644 glib/gslice.h create mode 100644 glib/gslist.c create mode 100644 glib/gslist.h create mode 100644 glib/gspawn-win32-helper-console.c create mode 100644 glib/gspawn-win32-helper.c create mode 100644 glib/gspawn-win32.c create mode 100644 glib/gspawn-win64-helper-console.c create mode 100644 glib/gspawn-win64-helper.c create mode 100644 glib/gspawn.c create mode 100644 glib/gspawn.h create mode 100644 glib/gstdio.c create mode 100644 glib/gstdio.h create mode 100644 glib/gstrfuncs.c create mode 100644 glib/gstrfuncs.h create mode 100644 glib/gstring.c create mode 100644 glib/gstring.h create mode 100755 glib/gtester-report create mode 100644 glib/gtester.c create mode 100644 glib/gtestutils.c create mode 100644 glib/gtestutils.h create mode 100644 glib/gthread.c create mode 100644 glib/gthread.h create mode 100644 glib/gthreadpool.c create mode 100644 glib/gthreadpool.h create mode 100644 glib/gthreadprivate.h create mode 100644 glib/gtimer.c create mode 100644 glib/gtimer.h create mode 100644 glib/gtree.c create mode 100644 glib/gtree.h create mode 100644 glib/gtypes.h create mode 100644 glib/gunibreak.c create mode 100644 glib/gunibreak.h create mode 100644 glib/gunichartables.h create mode 100644 glib/gunicode.h create mode 100644 glib/gunicodeprivate.h create mode 100644 glib/gunicollate.c create mode 100644 glib/gunicomp.h create mode 100644 glib/gunidecomp.c create mode 100644 glib/gunidecomp.h create mode 100644 glib/guniprop.c create mode 100644 glib/gurifuncs.c create mode 100644 glib/gurifuncs.h create mode 100644 glib/gutf8.c create mode 100644 glib/gutils.c create mode 100644 glib/gutils.h create mode 100644 glib/gvariant-core.c create mode 100644 glib/gvariant-core.h create mode 100644 glib/gvariant-internal.h create mode 100644 glib/gvariant-parser.c create mode 100644 glib/gvariant-serialiser.c create mode 100644 glib/gvariant-serialiser.h create mode 100644 glib/gvariant.c create mode 100644 glib/gvariant.h create mode 100644 glib/gvarianttype.c create mode 100644 glib/gvarianttype.h create mode 100644 glib/gvarianttypeinfo.c create mode 100644 glib/gvarianttypeinfo.h create mode 100644 glib/gwin32.c create mode 100644 glib/gwin32.h create mode 100644 glib/libcharset/Makefile.am create mode 100644 glib/libcharset/Makefile.in create mode 100644 glib/libcharset/README create mode 100644 glib/libcharset/codeset.m4 create mode 100755 glib/libcharset/config.charset create mode 100644 glib/libcharset/glibc21.m4 create mode 100644 glib/libcharset/libcharset-glib.patch create mode 100644 glib/libcharset/libcharset.h create mode 100644 glib/libcharset/localcharset.c create mode 100644 glib/libcharset/localcharset.h create mode 100755 glib/libcharset/make-patch.sh create mode 100644 glib/libcharset/ref-add.sin create mode 100644 glib/libcharset/ref-del.sin create mode 100755 glib/libcharset/update.sh create mode 100644 glib/libglib-gdb.py.in create mode 100644 glib/makefile.msc.in create mode 100755 glib/makegalias.pl create mode 100644 glib/pcre/COPYING create mode 100644 glib/pcre/Makefile.am create mode 100644 glib/pcre/Makefile.in create mode 100644 glib/pcre/makefile.msc create mode 100644 glib/pcre/pcre.h create mode 100644 glib/pcre/pcre_chartables.c create mode 100644 glib/pcre/pcre_compile.c create mode 100644 glib/pcre/pcre_config.c create mode 100644 glib/pcre/pcre_dfa_exec.c create mode 100644 glib/pcre/pcre_exec.c create mode 100644 glib/pcre/pcre_fullinfo.c create mode 100644 glib/pcre/pcre_get.c create mode 100644 glib/pcre/pcre_globals.c create mode 100644 glib/pcre/pcre_info.c create mode 100644 glib/pcre/pcre_internal.h create mode 100644 glib/pcre/pcre_maketables.c create mode 100644 glib/pcre/pcre_newline.c create mode 100644 glib/pcre/pcre_ord2utf8.c create mode 100644 glib/pcre/pcre_refcount.c create mode 100644 glib/pcre/pcre_study.c create mode 100644 glib/pcre/pcre_tables.c create mode 100644 glib/pcre/pcre_try_flipped.c create mode 100644 glib/pcre/pcre_ucp_searchfuncs.c create mode 100644 glib/pcre/pcre_valid_utf8.c create mode 100644 glib/pcre/pcre_version.c create mode 100644 glib/pcre/pcre_xclass.c create mode 100644 glib/pcre/ucp.h create mode 100644 glib/pcre/ucpinternal.h create mode 100755 glib/pltcheck.sh create mode 100644 glib/tests/4096-random-bytes create mode 100644 glib/tests/Makefile.am create mode 100644 glib/tests/Makefile.in create mode 100644 glib/tests/array-test.c create mode 100644 glib/tests/fileutils.c create mode 100644 glib/tests/gvariant.c create mode 100644 glib/tests/hostutils.c create mode 100644 glib/tests/keyfile.c create mode 100644 glib/tests/markup-subparser.c create mode 100644 glib/tests/mem-overflow.c create mode 100644 glib/tests/option-context.c create mode 100644 glib/tests/printf.c create mode 100644 glib/tests/rand.c create mode 100644 glib/tests/strfuncs.c create mode 100644 glib/tests/string.c create mode 100644 glib/tests/testing.c create mode 100644 glib/update-pcre/Makefile.am create mode 100644 glib/update-pcre/Makefile.am-1 create mode 100644 glib/update-pcre/Makefile.am-2 create mode 100644 glib/update-pcre/Makefile.in create mode 100644 glib/update-pcre/digitab.patch create mode 100644 glib/update-pcre/memory.patch create mode 100644 glib/update-pcre/pcre_ucp_searchfuncs.c create mode 100644 glib/update-pcre/pcre_valid_utf8.c create mode 100644 glib/update-pcre/update.sh create mode 100644 glib/win_iconv.c create mode 100644 glibconfig.h.win32.in create mode 100644 gmodule-2.0-uninstalled.pc.in create mode 100644 gmodule-2.0.pc.in create mode 100644 gmodule-export-2.0.pc.in create mode 100644 gmodule-no-export-2.0-uninstalled.pc.in create mode 100644 gmodule-no-export-2.0.pc.in create mode 100644 gmodule/AUTHORS create mode 100644 gmodule/COPYING create mode 100644 gmodule/ChangeLog create mode 100644 gmodule/Makefile.am create mode 100644 gmodule/Makefile.in create mode 100644 gmodule/gmodule-ar.c create mode 100644 gmodule/gmodule-beos.c create mode 100644 gmodule/gmodule-dl.c create mode 100644 gmodule/gmodule-dld.c create mode 100644 gmodule/gmodule-dyld.c create mode 100644 gmodule/gmodule-os2.c create mode 100644 gmodule/gmodule-win32.c create mode 100644 gmodule/gmodule.c create mode 100644 gmodule/gmodule.h create mode 100644 gmodule/gmodule.rc.in create mode 100644 gmodule/gmodule.symbols create mode 100644 gmodule/gmoduleconf.h.in create mode 100644 gmodule/gmoduleconf.h.win32 create mode 100644 gmodule/makefile.msc.in create mode 100644 gobject-2.0-uninstalled.pc.in create mode 100644 gobject-2.0.pc.in create mode 100644 gobject/ChangeLog create mode 100644 gobject/Makefile.am create mode 100644 gobject/Makefile.in create mode 100755 gobject/abicheck.sh create mode 100644 gobject/gatomicarray.c create mode 100644 gobject/gatomicarray.h create mode 100644 gobject/gboxed.c create mode 100644 gobject/gboxed.h create mode 100644 gobject/gclosure.c create mode 100644 gobject/gclosure.h create mode 100644 gobject/genums.c create mode 100644 gobject/genums.h create mode 100644 gobject/glib-genmarshal.1 create mode 100644 gobject/glib-genmarshal.c create mode 100644 gobject/glib-mkenums.1 create mode 100755 gobject/glib-mkenums.in create mode 100644 gobject/gmarshal.c create mode 100644 gobject/gmarshal.h create mode 100644 gobject/gmarshal.list create mode 100644 gobject/gmarshal.strings create mode 100644 gobject/gobject-query.c create mode 100644 gobject/gobject.c create mode 100644 gobject/gobject.h create mode 100644 gobject/gobject.py create mode 100644 gobject/gobject.rc.in create mode 100644 gobject/gobject.symbols create mode 100644 gobject/gobjectalias.h create mode 100644 gobject/gobjectaliasdef.c create mode 100644 gobject/gobjectnotifyqueue.c create mode 100644 gobject/gparam.c create mode 100644 gobject/gparam.h create mode 100644 gobject/gparamspecs.c create mode 100644 gobject/gparamspecs.h create mode 100644 gobject/gsignal.c create mode 100644 gobject/gsignal.h create mode 100644 gobject/gsourceclosure.c create mode 100644 gobject/gsourceclosure.h create mode 100644 gobject/gtype-private.h create mode 100644 gobject/gtype.c create mode 100644 gobject/gtype.h create mode 100644 gobject/gtypemodule.c create mode 100644 gobject/gtypemodule.h create mode 100644 gobject/gtypeplugin.c create mode 100644 gobject/gtypeplugin.h create mode 100644 gobject/gvalue.c create mode 100644 gobject/gvalue.h create mode 100644 gobject/gvaluearray.c create mode 100644 gobject/gvaluearray.h create mode 100644 gobject/gvaluecollector.h create mode 100644 gobject/gvaluetransform.c create mode 100644 gobject/gvaluetypes.c create mode 100644 gobject/gvaluetypes.h create mode 100644 gobject/libgobject-gdb.py.in create mode 100644 gobject/makefile.msc.in create mode 100755 gobject/makegobjectalias.pl create mode 100644 gobject/marshal-genstrings.pl create mode 100755 gobject/pltcheck.sh create mode 100644 gobject/stamp-gmarshal.h create mode 100644 gobject/testgobject.c create mode 100644 gobject/tests/Makefile.am create mode 100644 gobject/tests/Makefile.in create mode 100644 gobject/tests/dynamictests.c create mode 100644 gobject/tests/threadtests.c create mode 100644 gthread-2.0-uninstalled.pc.in create mode 100644 gthread-2.0.pc.in create mode 100644 gthread/ChangeLog create mode 100644 gthread/Makefile.am create mode 100644 gthread/Makefile.in create mode 100644 gthread/gthread-impl.c create mode 100644 gthread/gthread-none.c create mode 100644 gthread/gthread-posix.c create mode 100644 gthread/gthread-win32.c create mode 100644 gthread/gthread.def create mode 100644 gthread/gthread.rc.in create mode 100644 gthread/makefile.msc.in create mode 100644 gthread/tests/1bit-mutex.c create mode 100644 gthread/tests/Makefile.am create mode 100644 gthread/tests/Makefile.in create mode 100644 gtk-doc.make create mode 100755 install-sh create mode 100755 ltmain.sh create mode 100644 m4macros/Makefile.am create mode 100644 m4macros/Makefile.in create mode 100644 m4macros/glib-2.0.m4 create mode 100644 m4macros/glib-gettext.m4 create mode 100644 makefile.msc create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 msvc_recommended_pragmas.h create mode 100644 po/ChangeLog create mode 100644 po/LINGUAS create mode 100644 po/Makefile.in.in create mode 100644 po/POTFILES.in create mode 100644 po/af.gmo create mode 100644 po/af.po create mode 100644 po/am.gmo create mode 100644 po/am.po create mode 100644 po/ar.gmo create mode 100644 po/ar.po create mode 100644 po/as.gmo create mode 100644 po/as.po create mode 100644 po/ast.gmo create mode 100644 po/ast.po create mode 100644 po/az.gmo create mode 100644 po/az.po create mode 100644 po/be.gmo create mode 100644 po/be.po create mode 100644 po/be@latin.gmo create mode 100644 po/be@latin.po create mode 100644 po/bg.gmo create mode 100644 po/bg.po create mode 100644 po/bn.gmo create mode 100644 po/bn.po create mode 100644 po/bn_IN.gmo create mode 100644 po/bn_IN.po create mode 100644 po/bs.gmo create mode 100644 po/bs.po create mode 100644 po/ca.gmo create mode 100644 po/ca.po create mode 100644 po/ca@valencia.gmo create mode 100644 po/ca@valencia.po create mode 100644 po/cs.gmo create mode 100644 po/cs.po create mode 100644 po/cy.gmo create mode 100644 po/cy.po create mode 100644 po/da.gmo create mode 100644 po/da.po create mode 100644 po/de.gmo create mode 100644 po/de.po create mode 100644 po/dz.gmo create mode 100644 po/dz.po create mode 100644 po/el.gmo create mode 100644 po/el.po create mode 100644 po/en@shaw.gmo create mode 100644 po/en@shaw.po create mode 100644 po/en_CA.gmo create mode 100644 po/en_CA.po create mode 100644 po/en_GB.gmo create mode 100644 po/en_GB.po create mode 100644 po/eo.gmo create mode 100644 po/eo.po create mode 100644 po/es.gmo create mode 100644 po/es.po create mode 100644 po/et.gmo create mode 100644 po/et.po create mode 100644 po/eu.gmo create mode 100644 po/eu.po create mode 100644 po/fa.gmo create mode 100644 po/fa.po create mode 100644 po/fi.gmo create mode 100644 po/fi.po create mode 100644 po/fr.gmo create mode 100644 po/fr.po create mode 100644 po/ga.gmo create mode 100644 po/ga.po create mode 100644 po/gl.gmo create mode 100644 po/gl.po create mode 100644 po/glib20.pot create mode 100644 po/gu.gmo create mode 100644 po/gu.po create mode 100644 po/he.gmo create mode 100644 po/he.po create mode 100644 po/hi.gmo create mode 100644 po/hi.po create mode 100644 po/hr.gmo create mode 100644 po/hr.po create mode 100644 po/hu.gmo create mode 100644 po/hu.po create mode 100644 po/hy.gmo create mode 100644 po/hy.po create mode 100644 po/id.gmo create mode 100644 po/id.po create mode 100644 po/is.gmo create mode 100644 po/is.po create mode 100644 po/it.gmo create mode 100644 po/it.po create mode 100644 po/ja.gmo create mode 100644 po/ja.po create mode 100644 po/ka.gmo create mode 100644 po/ka.po create mode 100644 po/kn.gmo create mode 100644 po/kn.po create mode 100644 po/ko.gmo create mode 100644 po/ko.po create mode 100644 po/ku.gmo create mode 100644 po/ku.po create mode 100644 po/lt.gmo create mode 100644 po/lt.po create mode 100644 po/lv.gmo create mode 100644 po/lv.po create mode 100644 po/mai.gmo create mode 100644 po/mai.po create mode 100644 po/mg.gmo create mode 100644 po/mg.po create mode 100644 po/mk.gmo create mode 100644 po/mk.po create mode 100644 po/ml.gmo create mode 100644 po/ml.po create mode 100644 po/mn.gmo create mode 100644 po/mn.po create mode 100644 po/mr.gmo create mode 100644 po/mr.po create mode 100644 po/ms.gmo create mode 100644 po/ms.po create mode 100644 po/nb.gmo create mode 100644 po/nb.po create mode 100644 po/nds.gmo create mode 100644 po/nds.po create mode 100644 po/ne.gmo create mode 100644 po/ne.po create mode 100644 po/nl.gmo create mode 100644 po/nl.po create mode 100644 po/nn.gmo create mode 100644 po/nn.po create mode 100644 po/oc.gmo create mode 100644 po/oc.po create mode 100644 po/or.gmo create mode 100644 po/or.po create mode 100644 po/pa.gmo create mode 100644 po/pa.po create mode 100644 po/pl.gmo create mode 100644 po/pl.po create mode 100644 po/po2tbl.sed.in create mode 100644 po/ps.gmo create mode 100644 po/ps.po create mode 100644 po/pt.gmo create mode 100644 po/pt.po create mode 100644 po/pt_BR.gmo create mode 100644 po/pt_BR.po create mode 100644 po/ro.gmo create mode 100644 po/ro.po create mode 100644 po/ru.gmo create mode 100644 po/ru.po create mode 100644 po/rw.gmo create mode 100644 po/rw.po create mode 100644 po/si.gmo create mode 100644 po/si.po create mode 100644 po/sk.gmo create mode 100644 po/sk.po create mode 100644 po/sl.gmo create mode 100644 po/sl.po create mode 100644 po/sq.gmo create mode 100644 po/sq.po create mode 100644 po/sr.gmo create mode 100644 po/sr.po create mode 100644 po/sr@ije.gmo create mode 100644 po/sr@ije.po create mode 100644 po/sr@latin.gmo create mode 100644 po/sr@latin.po create mode 100644 po/sv.gmo create mode 100644 po/sv.po create mode 100644 po/ta.gmo create mode 100644 po/ta.po create mode 100644 po/te.gmo create mode 100644 po/te.po create mode 100644 po/th.gmo create mode 100644 po/th.po create mode 100644 po/tl.gmo create mode 100644 po/tl.po create mode 100644 po/tr.gmo create mode 100644 po/tr.po create mode 100644 po/tt.gmo create mode 100644 po/tt.po create mode 100644 po/uk.gmo create mode 100644 po/uk.po create mode 100644 po/vi.gmo create mode 100644 po/vi.po create mode 100644 po/wa.gmo create mode 100644 po/wa.po create mode 100644 po/xh.gmo create mode 100644 po/xh.po create mode 100644 po/yi.gmo create mode 100644 po/yi.po create mode 100644 po/zh_CN.gmo create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.gmo create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.gmo create mode 100644 po/zh_TW.po create mode 100755 sanity_check create mode 100644 tests/Makefile.am create mode 100644 tests/Makefile.in create mode 100644 tests/assert-msg-test.c create mode 100644 tests/asyncqueue-test.c create mode 100644 tests/atomic-test.c create mode 100644 tests/base64-test.c create mode 100644 tests/bit-test.c create mode 100644 tests/bookmarkfile-test.c create mode 100644 tests/bookmarks/fail-01.xbel create mode 100644 tests/bookmarks/fail-02.xbel create mode 100644 tests/bookmarks/fail-03.xbel create mode 100644 tests/bookmarks/fail-04.xbel create mode 100644 tests/bookmarks/fail-05.xbel create mode 100644 tests/bookmarks/fail-06.xbel create mode 100644 tests/bookmarks/fail-07.xbel create mode 100644 tests/bookmarks/fail-08.xbel create mode 100644 tests/bookmarks/fail-09.xbel create mode 100644 tests/bookmarks/fail-10.xbel create mode 100644 tests/bookmarks/fail-11.xbel create mode 100644 tests/bookmarks/fail-12.xbel create mode 100644 tests/bookmarks/fail-13.xbel create mode 100644 tests/bookmarks/fail-14.xbel create mode 100644 tests/bookmarks/fail-15.xbel create mode 100644 tests/bookmarks/fail-16.xbel create mode 100644 tests/bookmarks/fail-17.xbel create mode 100644 tests/bookmarks/valid-01.xbel create mode 100644 tests/bookmarks/valid-02.xbel create mode 100644 tests/bookmarks/valid-03.xbel create mode 100644 tests/casefold.txt create mode 100644 tests/casemap.txt create mode 100644 tests/checksum-test.c create mode 100644 tests/child-test.c create mode 100644 tests/collate/collate-1.file create mode 100644 tests/collate/collate-1.in create mode 100644 tests/collate/collate-1.unicode create mode 100644 tests/collate/collate-2.file create mode 100644 tests/collate/collate-2.in create mode 100644 tests/collate/collate-2.unicode create mode 100644 tests/completion-test.c create mode 100644 tests/convert-test.c create mode 100644 tests/cxx-test.C create mode 100644 tests/date-test.c create mode 100644 tests/dirname-test.c create mode 100644 tests/env-test.c create mode 100644 tests/errorcheck-mutex-test.c create mode 100644 tests/file-test.c create mode 100755 tests/gen-casefold-txt.pl create mode 100755 tests/gen-casemap-txt.pl create mode 100644 tests/gio-test.c create mode 100644 tests/gobject/Makefile.am create mode 100644 tests/gobject/Makefile.in create mode 100644 tests/gobject/accumulator.c create mode 100644 tests/gobject/defaultiface.c create mode 100644 tests/gobject/deftype.c create mode 100644 tests/gobject/dynamictype.c create mode 100644 tests/gobject/gvalue-test.c create mode 100644 tests/gobject/ifacecheck.c create mode 100644 tests/gobject/ifaceinherit.c create mode 100644 tests/gobject/ifaceinit.c create mode 100644 tests/gobject/ifaceproperties.c create mode 100644 tests/gobject/override.c create mode 100644 tests/gobject/paramspec-test.c create mode 100644 tests/gobject/performance-threaded.c create mode 100644 tests/gobject/performance.c create mode 100644 tests/gobject/references.c create mode 100644 tests/gobject/singleton.c create mode 100644 tests/gobject/testcommon.h create mode 100644 tests/gobject/testmarshal.c create mode 100644 tests/gobject/testmarshal.h create mode 100644 tests/gobject/testmarshal.list create mode 100644 tests/gobject/testmodule.c create mode 100644 tests/gobject/testmodule.h create mode 100644 tests/hash-test.c create mode 100644 tests/iochannel-test-infile create mode 100644 tests/iochannel-test.c create mode 100644 tests/libmoduletestplugin_a.c create mode 100644 tests/libmoduletestplugin_b.c create mode 100644 tests/list-test.c create mode 100644 tests/mainloop-test.c create mode 100644 tests/makefile.msc.in create mode 100644 tests/mapping-test.c create mode 100644 tests/markup-collect.c create mode 100644 tests/markup-escape-test.c create mode 100644 tests/markup-test.c create mode 100644 tests/markups/expected-1 create mode 100644 tests/markups/expected-10 create mode 100644 tests/markups/expected-11 create mode 100644 tests/markups/expected-2 create mode 100644 tests/markups/expected-3 create mode 100644 tests/markups/expected-4 create mode 100644 tests/markups/expected-5 create mode 100644 tests/markups/expected-6 create mode 100644 tests/markups/expected-7 create mode 100644 tests/markups/expected-8 create mode 100644 tests/markups/expected-9 create mode 100644 tests/markups/fail-1.gmarkup create mode 100644 tests/markups/fail-10.gmarkup create mode 100644 tests/markups/fail-11.gmarkup create mode 100644 tests/markups/fail-12.gmarkup create mode 100644 tests/markups/fail-13.gmarkup create mode 100644 tests/markups/fail-14.gmarkup create mode 100644 tests/markups/fail-15.gmarkup create mode 100644 tests/markups/fail-16.gmarkup create mode 100644 tests/markups/fail-17.gmarkup create mode 100644 tests/markups/fail-18.gmarkup create mode 100644 tests/markups/fail-19.gmarkup create mode 100644 tests/markups/fail-2.gmarkup create mode 100644 tests/markups/fail-20.gmarkup create mode 100644 tests/markups/fail-21.gmarkup create mode 100644 tests/markups/fail-22.gmarkup create mode 100644 tests/markups/fail-23.gmarkup create mode 100644 tests/markups/fail-24.gmarkup create mode 100644 tests/markups/fail-25.gmarkup create mode 100644 tests/markups/fail-26.gmarkup create mode 100644 tests/markups/fail-27.gmarkup create mode 100644 tests/markups/fail-28.gmarkup create mode 100644 tests/markups/fail-29.gmarkup create mode 100644 tests/markups/fail-3.gmarkup create mode 100644 tests/markups/fail-30.gmarkup create mode 100644 tests/markups/fail-31.gmarkup create mode 100644 tests/markups/fail-32.gmarkup create mode 100644 tests/markups/fail-33.gmarkup create mode 100644 tests/markups/fail-34.gmarkup create mode 100644 tests/markups/fail-35.gmarkup create mode 100644 tests/markups/fail-36.gmarkup create mode 100644 tests/markups/fail-37.gmarkup create mode 100644 tests/markups/fail-38.gmarkup create mode 100644 tests/markups/fail-39.gmarkup create mode 100644 tests/markups/fail-4.gmarkup create mode 100644 tests/markups/fail-40.gmarkup create mode 100644 tests/markups/fail-5.gmarkup create mode 100644 tests/markups/fail-6.gmarkup create mode 100644 tests/markups/fail-7.gmarkup create mode 100644 tests/markups/fail-8.gmarkup create mode 100644 tests/markups/fail-9.gmarkup create mode 100644 tests/markups/valid-1.gmarkup create mode 100644 tests/markups/valid-10.gmarkup create mode 100644 tests/markups/valid-11.gmarkup create mode 100644 tests/markups/valid-2.gmarkup create mode 100644 tests/markups/valid-3.gmarkup create mode 100644 tests/markups/valid-4.gmarkup create mode 100644 tests/markups/valid-5.gmarkup create mode 100644 tests/markups/valid-6.gmarkup create mode 100644 tests/markups/valid-7.gmarkup create mode 100644 tests/markups/valid-8.gmarkup create mode 100644 tests/markups/valid-9.gmarkup create mode 100644 tests/memchunks.c create mode 100644 tests/module-test.c create mode 100644 tests/node-test.c create mode 100644 tests/onceinit.c create mode 100644 tests/patterntest.c create mode 100644 tests/qsort-test.c create mode 100644 tests/queue-test.c create mode 100644 tests/refcount/Makefile.am create mode 100644 tests/refcount/Makefile.in create mode 100644 tests/refcount/closures.c create mode 100644 tests/refcount/objects.c create mode 100644 tests/refcount/objects2.c create mode 100644 tests/refcount/properties.c create mode 100644 tests/refcount/properties2.c create mode 100644 tests/refcount/signals.c create mode 100644 tests/regex-test.c create mode 100644 tests/relation-test.c create mode 100755 tests/run-assert-msg-test.sh create mode 100755 tests/run-bookmark-test.sh create mode 100755 tests/run-collate-tests.sh create mode 100755 tests/run-markup-tests.sh create mode 100644 tests/scannerapi.c create mode 100644 tests/sequence-test.c create mode 100644 tests/shell-test.c create mode 100644 tests/slice-color.c create mode 100644 tests/slice-concurrent.c create mode 100644 tests/slice-test.c create mode 100644 tests/slice-threadinit.c create mode 100644 tests/slist-test.c create mode 100644 tests/spawn-test-win32-gui.c create mode 100644 tests/spawn-test.c create mode 100644 tests/testgdate.c create mode 100644 tests/testgdateparser.c create mode 100644 tests/testglib.c create mode 100644 tests/testingbase64.c create mode 100644 tests/thread-test.c create mode 100644 tests/threadpool-test.c create mode 100644 tests/timeloop-basic.c create mode 100644 tests/timeloop-closure.c create mode 100644 tests/timeloop.c create mode 100644 tests/tree-test.c create mode 100644 tests/type-test.c create mode 100644 tests/unicode-caseconv.c create mode 100644 tests/unicode-collate.c create mode 100644 tests/unicode-encoding.c create mode 100644 tests/unicode-normalize.c create mode 100644 tests/uri-test.c create mode 100644 tests/utf8-pointer.c create mode 100644 tests/utf8-validate.c create mode 100644 tests/utf8.txt diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..17814ca --- /dev/null +++ b/AUTHORS @@ -0,0 +1,40 @@ +Below are just a few of the people who have contributed +to GLib. Please don't mail these people about problems you +have with GTK+; see the README file for information about +filing bugs and submitting patches. + +GLib-2.0 Team +------------- +Hans Breuer +Matthias Clasen +Tor Lillqvist +Tim Janik +Havoc Pennington +Ron Steinke +Owen Taylor +Sebastian Wilhelmi + +GLib-1.2 Team +------------- +Shawn T. Amundson +Jeff Garzik +Raja R Harinath +Tim Janik +Elliot Lee +Tor Lillqvist +Paolo Molaro +Havoc Pennington +Manish Singh +Owen Taylor +Sebastian Wilhelmi + +The random number generator "Mersenne Twister", which is used by GLib, +was developed and originally coded by: +Makoto Matsumoto +Takuji Nishimura + +Original Authors +---------------- +Peter Mattis +Spencer Kimball +Josh MacDonald diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..bf50f20 --- /dev/null +++ b/COPYING @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 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..4ba9c4e --- /dev/null +++ b/ChangeLog @@ -0,0 +1,14907 @@ +commit 5ba8043f1217b338e220f0c6b427e58e28c241e8 +Author: Matthias Clasen +Date: Fri Mar 26 11:15:49 2010 -0400 + + Third try to get this right... + + docs/reference/gio/gio-sections.txt | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit f6532620bc2439641b31a5df1d15489121fe918d +Author: Matthias Clasen +Date: Fri Mar 26 11:05:28 2010 -0400 + + And another one... + + NEWS | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 7c8a1081651d4d17823ac8c6a35d3a60c85c81ac +Author: Matthias Clasen +Date: Fri Mar 26 11:05:02 2010 -0400 + + Fix a typo + + gio/giomodule.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 55e44a67e6bc4bf09d4de85ad64627a02595d07f +Author: Matthias Clasen +Date: Fri Mar 26 10:39:56 2010 -0400 + + Bump version to 2.24.0 + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 8ee5ded1e9098adb54005851c09e38cf24bb6a32 +Author: Matthias Clasen +Date: Fri Mar 26 10:39:33 2010 -0400 + + Updates + + NEWS | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +commit 6cce575a25abc8157873d070bb317d66a225485a +Author: Matthias Clasen +Date: Fri Mar 26 10:24:06 2010 -0400 + + Fix a typo + + docs/reference/gio/gio-sections.txt | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 78b764f325c12a518e5bcc06771347da06d5ea68 +Author: Matthias Clasen +Date: Fri Mar 26 10:19:57 2010 -0400 + + More doc fixups + + gio/giomodule.h | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +commit 81e2aa941bbfd02bf1b6235da12834d282ceda0c +Author: Matthias Clasen +Date: Fri Mar 26 10:11:46 2010 -0400 + + Some more doc cleanups + + docs/reference/gio/gio-sections.txt | 2 + + docs/reference/gobject/gobject-sections.txt | 2 +- + docs/reference/gobject/tmpl/gobject-unused.sgml | 9 +++++ + gobject/gtype.c | 37 + +++------------------- + 4 files changed, 17 insertions(+), 33 deletions(-) + +commit c4ea7d58f78ca946fe84718386f9f888b5f93520 +Author: Matthias Clasen +Date: Fri Mar 26 09:30:25 2010 -0400 + + Small doc addition + + gio/gconverter.h | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 431840a44e1ec799c974c7ea626c3164ec9dc2bb +Author: Matthias Clasen +Date: Fri Mar 26 09:22:58 2010 -0400 + + Add g_io_module_query to docs + + docs/reference/gio/gio-sections.txt | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 6e77ee097100dc3fd695a6dad8811253cea23436 +Author: Matthias Clasen +Date: Fri Mar 26 09:01:48 2010 -0400 + + Correct the error handling in splice_stream_with_progress + + We need to get out of both loops, so a simple 'break' doesn't cut it. + Bugs 613748 and 613923 + + gio/gfile.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +commit 409a3a61ece7bbdacbf2469eb7b86c3aa3c44653 +Author: Ryan Lortie +Date: Fri Mar 26 08:01:51 2010 -0500 + + GVariant: Stop lexing format strings at : + + Lets us parse this successfully: {%s: %s}. + + glib/gvariant-parser.c | 7 ++++--- + glib/tests/gvariant.c | 1 + + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit df67a0662b0c20ab58f992fc114a48039e7fb9e0 +Author: Maxim V. Dziumanenko +Date: Fri Mar 26 11:42:19 2010 +0200 + + Updated Ukrainian translation + + po/uk.po | 992 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 490 insertions(+), 502 deletions(-) + +commit fd448dd7ceeb4be93f2cfea54a78e0564a3718f0 +Author: Ryan Lortie +Date: Tue Mar 23 10:01:53 2010 -0500 + + Add doc note about read_until() inconsistency. + + See bug 584284 for more information. + + gio/gdatainputstream.c | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit a6c57591c0928fee3d3f026289972024bd2b00ec +Author: Ryan Lortie +Date: Tue Mar 23 09:17:15 2010 -0500 + + Support &s as key of dict entry in format string + + Partial fix for bug 613618. + + glib/gvariant.c | 26 ++++++++++++++++++-------- + glib/tests/gvariant.c | 7 +++++++ + 2 files changed, 25 insertions(+), 8 deletions(-) + +commit 816990a0118f33ae280846ac040803ce58979162 +Author: Ryan Lortie +Date: Tue Mar 23 09:06:52 2010 -0500 + + GVariant: Removing mentions of &a from docs + + This isn't supported anymore (for the time being...) + + Partial fix for bug 613618. + + docs/reference/glib/gvariant-varargs.xml | 19 +------------------ + 1 files changed, 1 insertions(+), 18 deletions(-) + +commit 35059f2c0415fbd521632d29ecb91e8c93545e0e +Author: Christian Dywan +Date: Tue Mar 23 11:59:43 2010 +0100 + + Correct typo of libray/ library in GObject tutorial + + Fixes bug #613667 + + docs/reference/gobject/tut_gtype.xml | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit ace9a25fb39781a01a78c8e9aa1c58a51224e8b8 +Author: Ryan Lortie +Date: Mon Mar 22 11:59:08 2010 -0500 + + Bug 613601 - buglet in dup_close_on_exec_fd() + + Fix copy/paste error and 'or' FD_CLOEXEC into the existing flags + instead + of just setting it outright. + + gio/gunixfdlist.c | 9 +++++++-- + 1 files changed, 7 insertions(+), 2 deletions(-) + +commit 440713e393cf99e29f716f5f634d4bc4ce0e281c +Author: Tor Lillqvist +Date: Mon Mar 22 15:53:47 2010 +0200 + + Filter out gatomic-gcc.c from the VS project sources + + Instead, explicitly include gatomic.c. + + build/win32/vs9/glib.vcprojin | 1 + + glib/Makefile.am | 6 ++++-- + 2 files changed, 5 insertions(+), 2 deletions(-) + +commit 365fd70f263b99646cef7a5335282fd3f1efb520 +Author: Tor Lillqvist +Date: Mon Mar 22 15:33:38 2010 +0200 + + Make config.h.win32 match what the configure script produces + + config.h.win32.in | 76 + ++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 files changed, 73 insertions(+), 3 deletions(-) + +commit 580ecb32d9af4a7c8a00076a23d82d9729131361 +Author: Inaki Larranaga Murgoitio +Date: Mon Mar 22 12:34:25 2010 +0100 + + Updated Basque language + + po/eu.po | 92 + +++++++++++++++++++++++++------------------------------------- + 1 files changed, 37 insertions(+), 55 deletions(-) + +commit e2434fd2d659f976febc3abe08abe82149447d46 +Author: Clytie +Date: Mon Mar 22 21:33:36 2010 +1030 + + Updated Vietnamese translation + + po/vi.po | 1454 + ++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 715 insertions(+), 739 deletions(-) + +commit db83dd27c571e34e2974a4cff560fdfb255c2bf2 +Author: Ryan Lortie +Date: Sun Mar 21 20:12:18 2010 -0500 + + Drop { } for favour of { 0, }. + + glib/gvariant-parser.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 468bbbfce1736259ae75bd27847b5b25332ada5c +Author: Ryan Lortie +Date: Sun Mar 21 20:07:45 2010 -0500 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 0afc140712a7c6b7cf2179626370b33ca930dea2 +Author: Ryan Lortie +Date: Sun Mar 21 20:06:39 2010 -0500 + + 2.23.6 + + NEWS | 41 + + docs/reference/glib/tmpl/glib-unused.sgml | 67 ++ + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/version.sgml | 68 -- + po/af.po | 951 ++++++++++++------------ + po/am.po | 80 +- + po/ar.po | 80 +- + po/as.po | 80 +- + po/ast.po | 80 +- + po/az.po | 80 +- + po/be.po | 80 +- + po/be@latin.po | 80 +- + po/bg.po | 80 +- + po/bn.po | 80 +- + po/bn_IN.po | 80 +- + po/bs.po | 80 +- + po/ca.po | 80 +- + po/ca@valencia.po | 80 +- + po/cs.po | 942 ++++++++++++------------ + po/cy.po | 80 +- + po/da.po | 80 +- + po/de.po | 80 +- + po/dz.po | 80 +- + po/el.po | 942 ++++++++++++------------ + po/en@shaw.po | 80 +- + po/en_CA.po | 80 +- + po/en_GB.po | 80 +- + po/eo.po | 80 +- + po/es.po | 80 +- + po/et.po | 80 +- + po/eu.po | 80 +- + po/fa.po | 80 +- + po/fi.po | 952 ++++++++++++------------ + po/fr.po | 80 +- + po/ga.po | 80 +- + po/gl.po | 951 ++++++++++++------------ + po/gu.po | 80 +- + po/he.po | 80 +- + po/hi.po | 80 +- + po/hr.po | 80 +- + po/hu.po | 80 +- + po/hy.po | 80 +- + po/id.po | 80 +- + po/is.po | 80 +- + po/it.po | 80 +- + po/ja.po | 80 +- + po/ka.po | 80 +- + po/kn.po | 80 +- + po/ko.po | 80 +- + po/ku.po | 80 +- + po/lt.po | 80 +- + po/lv.po | 80 +- + po/mai.po | 80 +- + po/mg.po | 80 +- + po/mk.po | 80 +- + po/ml.po | 80 +- + po/mn.po | 80 +- + po/mr.po | 80 +- + po/ms.po | 80 +- + po/nb.po | 80 +- + po/nds.po | 1187 + +++++++++++++---------------- + po/ne.po | 80 +- + po/nl.po | 80 +- + po/nn.po | 80 +- + po/oc.po | 80 +- + po/or.po | 80 +- + po/pa.po | 970 ++++++++++++------------ + po/pl.po | 80 +- + po/ps.po | 80 +- + po/pt.po | 80 +- + po/pt_BR.po | 80 +- + po/ro.po | 948 ++++++++++++------------ + po/ru.po | 80 +- + po/rw.po | 80 +- + po/si.po | 80 +- + po/sk.po | 80 +- + po/sl.po | 80 +- + po/sq.po | 80 +- + po/sr.po | 950 ++++++++++++------------ + po/sr@ije.po | 80 +- + po/sr@latin.po | 961 ++++++++++++------------ + po/sv.po | 80 +- + po/ta.po | 80 +- + po/te.po | 80 +- + po/th.po | 80 +- + po/tl.po | 80 +- + po/tr.po | 80 +- + po/tt.po | 80 +- + po/uk.po | 80 +- + po/vi.po | 80 +- + po/wa.po | 80 +- + po/xh.po | 80 +- + po/yi.po | 80 +- + po/zh_CN.po | 80 +- + po/zh_HK.po | 80 +- + po/zh_TW.po | 80 +- + 96 files changed, 8192 insertions(+), 8303 deletions(-) + +commit 5620f96305ee276ac758de989589a93de89ed40a +Author: Ryan Lortie +Date: Sun Mar 21 14:17:21 2010 -0500 + + silence some false-alarm uninitialised warnings + + glib/gvariant-parser.c | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit 6f330383974bb235d7050ebef61426541823c33a +Author: Ryan Lortie +Date: Sun Mar 21 14:04:07 2010 -0500 + + gtk-doc fixups + + docs/reference/glib/glib-sections.txt | 2 +- + docs/reference/gobject/gobject-sections.txt | 2 ++ + glib/ghash.c | 4 ++-- + glib/gvariant-parser.c | 7 +++++++ + 4 files changed, 12 insertions(+), 3 deletions(-) + +commit c5a1c95b1f991db6700a204e5d41c8cc650c7d42 +Author: Ryan Lortie +Date: Sun Mar 21 13:46:09 2010 -0500 + + GVariant docs fixes + + glib/gvariant-parser.c | 16 +++++++++++++++- + glib/gvariant.h | 6 +++--- + 2 files changed, 18 insertions(+), 4 deletions(-) + +commit 5c419c300b43b4e3ac462761dda4360ed1c5de9b +Author: Ryan Lortie +Date: Sun Mar 21 13:07:36 2010 -0500 + + gitignore for win32 build stuff + + .gitignore | 1 + + build/win32/vs9/.gitignore | 3 +++ + 2 files changed, 4 insertions(+), 0 deletions(-) + +commit bf4dbdbf0e1a3ac4349980942b9e91056ce7e448 +Author: Ryan Lortie +Date: Sun Mar 21 12:31:46 2010 -0500 + + merge GVariant parser + + docs/reference/glib/glib-sections.txt | 7 + + glib/Makefile.am | 1 + + glib/glib.symbols | 7 + + glib/gvariant-parser.c | 2185 + +++++++++++++++++++++++++++++++++ + glib/gvariant.c | 28 +- + glib/gvariant.h | 13 + + glib/tests/gvariant.c | 249 ++++- + 7 files changed, 2473 insertions(+), 17 deletions(-) + +commit 2a209cb2516999c4d2f08368c720f7506acde9a5 +Author: Ryan Lortie +Date: Sun Mar 21 12:54:36 2010 -0500 + + make check / makedistcheck fixes + + configure.in | 1 - + gobject/gobject.symbols | 2 ++ + 2 files changed, 2 insertions(+), 1 deletions(-) + +commit 3369548130bdd02534f2a6c6e7baa1f29375a41d +Author: Tor Lillqvist +Date: Sun Mar 21 16:54:11 2010 +0200 + + Add new headers to be installed the VS "install" project + + Yeah, we should generate the list of headers to install from the + corresponding Makefile.am files, like the lists of source files to + compile. + + build/win32/vs9/glib.vsprops | 9 +++++++++ + 1 files changed, 9 insertions(+), 0 deletions(-) + +commit 226cc663e40606e9749a368e9d2b2e61d9a9d532 +Author: Tor Lillqvist +Date: Sun Mar 21 16:11:49 2010 +0200 + + Avoid much of duplication in lists of source files + + Don't keep the lists of source files for libglib, libgobject and + libgio in the VS project files in addition to the canonical location, + the corresponding Makefile.am files. + + Instead, generate the corresponding .vcproj files at make dist time + using the C preprocessor, from template files called .vcprojin. We + still list explicitly in the .vcprojin files some of the + Windows-specific source files, and the sources files of gnulib and + pcre. + + build/win32/vs9/Makefile.am | 3 + + build/win32/vs9/README.txt | 3 +- + build/win32/vs9/gio.vcproj | 608 + -------------------------------------- + build/win32/vs9/gio.vcprojin | 234 +++++++++++++++ + build/win32/vs9/glib.vcproj | 570 + ----------------------------------- + build/win32/vs9/glib.vcprojin | 298 +++++++++++++++++++ + build/win32/vs9/gobject.vcproj | 281 ------------------ + build/win32/vs9/gobject.vcprojin | 218 ++++++++++++++ + gio/Makefile.am | 11 +- + glib/Makefile.am | 11 +- + gobject/Makefile.am | 11 +- + 11 files changed, 785 insertions(+), 1463 deletions(-) + +commit 504b8b8f0125dcba530d4f34c4beaaa129cc5d85 +Author: Tor Lillqvist +Date: Sun Mar 21 14:50:45 2010 +0200 + + Avoid struct stat issues with MSVC + + gio/giomodule.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit 28b025de962a798fa7a9fb9adbfdfcc4852fddec +Author: Tor Lillqvist +Date: Sun Mar 21 13:33:44 2010 +0200 + + Drop empty Tool elements from the project files for clarity + + Makes the files appear a bit simpler when edited manually. + + build/win32/vs9/gio.vcproj | 12 ------------ + build/win32/vs9/glib-genmarshal.vcproj | 12 ------------ + build/win32/vs9/glib.vcproj | 12 ------------ + build/win32/vs9/gmodule.vcproj | 12 ------------ + build/win32/vs9/gobject.vcproj | 12 ------------ + build/win32/vs9/gspawn-win32-helper-console.vcproj | 12 ------------ + build/win32/vs9/gspawn-win32-helper.vcproj | 12 ------------ + build/win32/vs9/gthread.vcproj | 12 ------------ + build/win32/vs9/testglib.vcproj | 12 ------------ + 9 files changed, 0 insertions(+), 108 deletions(-) + +commit 2ab76c5b3610faa20dfae2550688ab0d6620b29b +Author: Tor Lillqvist +Date: Sun Mar 21 11:22:06 2010 +0200 + + Make the GVariant code compile with a non-gcc compiler + + In particular, tested with Microsoft Visual C 2008. + + glib/gvariant-core.c | 2 +- + glib/gvariant-serialiser.c | 28 ++++++++++++++-------------- + glib/gvariant.c | 8 ++++++-- + glib/gvarianttypeinfo.c | 22 ++++++++++++---------- + 4 files changed, 33 insertions(+), 27 deletions(-) + +commit dc51eff2a9ca234fbb09c7b94c4643ea3750d80d +Author: Tor Lillqvist +Date: Sat Mar 20 13:32:37 2010 +0200 + + Update with new source files and dependencies + + build/win32/vs9/gio.vcproj | 36 + ++++++++++++++++++++++++++++++++---- + build/win32/vs9/glib.sln | 1 + + build/win32/vs9/glib.vcproj | 21 +++++++++++++++++++++ + build/win32/vs9/gobject.vcproj | 4 ++++ + 4 files changed, 58 insertions(+), 4 deletions(-) + +commit 782de94c587cc3eed53653443439b62aaee19200 +Author: Tor Lillqvist +Date: Sat Mar 20 13:31:55 2010 +0200 + + Drop the unmaintained vs8 project files from dist + + build/win32/Makefile.am | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 77cc740243e9f55603d833f129e999f8824a18f1 +Author: Tommi Vainikainen +Date: Sat Mar 20 00:01:00 2010 +0200 + + Updated Finnish translation + + po/fi.po | 1052 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 512 insertions(+), 540 deletions(-) + +commit 34d0db361ea514c026c54f14853120d601e1d0b5 +Author: A S Alam +Date: Fri Mar 19 08:18:41 2010 +0530 + + update Punjabi Translation + + po/pa.po | 1041 + ++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 512 insertions(+), 529 deletions(-) + +commit bedaa8027537378c8b7fec68acb422eac44f240e +Author: Nikos Bakaoukas +Date: Fri Mar 19 00:10:07 2010 +0200 + + Updated Greek translation for glib + + po/el.po | 1117 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 559 insertions(+), 558 deletions(-) + +commit 6243b1eb5f8f55abc8c05a18d7dfbdd7968fab50 +Author: Dumitru Mișu Moldovan +Date: Thu Mar 18 22:47:55 2010 +0200 + + Updated Romanian translation + + po/ro.po | 964 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 482 insertions(+), 482 deletions(-) + +commit 3628f7815d13d8b495cd27ce49f3c15372f23cfb +Author: Nils-Christoph Fiedler +Date: Thu Mar 18 13:54:17 2010 +0100 + + Updated LowGerman translation + + po/nds.po | 98 + ++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 49 insertions(+), 49 deletions(-) + +commit 41383b303c0bb54da68bbf5500b5e2d9e552ab69 +Author: Sebastian Dröge +Date: Wed Mar 17 15:11:00 2010 +0100 + + Bug 612502 - Add support for class private data + + This adds the two new functions g_type_add_class_private() + and g_type_class_get_private() and a convenience macro + for the getter G_TYPE_CLASS_GET_PRIVATE(). + + gobject/gtype.c | 118 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + gobject/gtype.h | 21 ++++++++++ + 2 files changed, 137 insertions(+), 2 deletions(-) + +commit 2295ba857f09fa58c6e61ec4147536021055bbf6 +Author: Benjamin Otte +Date: Tue Mar 16 16:34:50 2010 +0100 + + The fallback parameter to g_convert_with_fallback() should be const + + This patch makes it so. + + glib/gconvert.c | 2 +- + glib/gconvert.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 751feb916ab2f0cd74839233101fc0b9d2fb994c +Author: Ryan Lortie +Date: Mon Mar 15 17:45:02 2010 -0400 + + Bug 612502 - build fails on glib/tests/gvariant.c + + Fix two problems caught by Tim Rice. + + - non-constant expression used as array size + - arithmetic on void * + + glib/tests/gvariant.c | 9 ++++----- + 1 files changed, 4 insertions(+), 5 deletions(-) + +commit 1953b4087f2852e43c0a4dd46bfbd6228135cf70 +Author: Christian Persch +Date: Sun Feb 7 13:39:10 2010 +0100 + + Use static assert over runtime assert if possible + + We can test the these at compile time. Bug #609231. + + glib/gmappedfile.c | 19 ++++++++++--------- + glib/gvariant.c | 13 ++++++++----- + 2 files changed, 18 insertions(+), 14 deletions(-) + +commit 24aeaebc48a5636c2f5391de646225d1e471f7ba +Author: Nils-Christoph Fiedler +Date: Mon Mar 15 14:18:48 2010 +0100 + + Added LowGerman translation + + po/nds.po | 2135 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 2135 insertions(+), 0 deletions(-) + +commit 2b1b1563a0119de94d2ec0d05f1db493872852dc +Author: Nils-Christoph Fiedler +Date: Mon Mar 15 14:18:43 2010 +0100 + + Added LowGerman translation + + po/LINGUAS | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 7e4d88b290589a2a91d90b084751002c246564d6 +Author: Ryan Lortie +Date: Sun Mar 14 22:27:06 2010 -0400 + + gvariant test: Remove unused variable + + glib/tests/gvariant.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 9f16c70c16ec90be209fdaa120d2810f4128f2f0 +Author: Petr Kovar +Date: Mon Mar 15 02:30:27 2010 +0100 + + Update Czech translation + + po/cs.po | 948 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 478 insertions(+), 470 deletions(-) + +commit 9dea0253a3ded0e32daa33f11850797109018326 +Author: Ryan Lortie +Date: Sun Mar 14 15:55:48 2010 -0400 + + GVariant: add loading, byteswapping, normalisation + + docs/reference/glib/glib-sections.txt | 4 + + glib/glib.symbols | 5 + + glib/gvariant-core.c | 61 +++++++++- + glib/gvariant.c | 207 + +++++++++++++++++++++++++++++++++ + glib/gvariant.h | 10 ++ + glib/tests/gvariant.c | 72 ++++++++++++ + 6 files changed, 355 insertions(+), 4 deletions(-) + +commit 1ac590b7f728d4a029a354be9aad24863badba02 +Author: Ryan Lortie +Date: Sun Mar 14 13:04:43 2010 -0400 + + GBuffer: very small cosmetic fix to header file + + glib/gbuffer.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 056feef60b79e867190697f2d26e3ac7edf903a5 +Author: Ryan Lortie +Date: Sat Mar 13 19:55:56 2010 -0500 + + GVariantIter: expand the size of the dummy struct + + Will allow for some nice tricks in the future. + + glib/gvariant.c | 4 ++-- + glib/gvariant.h | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit f552689058c27ccebaf4271c4a5afc4197b74a8f +Author: Colin Walters +Date: Sat Mar 13 18:11:31 2010 -0500 + + [GDesktopAppInfo] New function g_desktop_app_info_get_filename + + This allows access to the full file path, where possible. + + https://bugzilla.gnome.org/show_bug.cgi?id=612832 + + docs/reference/gio/gio-sections.txt | 1 + + gio/gdesktopappinfo.c | 17 +++++++++++++++++ + gio/gdesktopappinfo.h | 2 ++ + gio/gio.symbols | 1 + + 4 files changed, 21 insertions(+), 0 deletions(-) + +commit 1be8ad35144d34de99b6153cbbfa8f9add46888b +Author: Thomas Kristensen +Date: Sun Mar 14 11:47:17 2010 +0200 + + Close the socket event in finalizer instead of in close method + + There might be a GSource attached to a GMainContext, about to be + removed by a + pending cancellation. Deleting the handle too early will trigger a + g_warning in + the "select()" call in GMainContext. Attached patch fixes this + by deferring + destruction of WSAEVENT object until GSocket's finalize(). + + Patch from bug #612702. + + Signed-off-by: Tor Lillqvist + + gio/gsocket.c | 14 ++++++-------- + 1 files changed, 6 insertions(+), 8 deletions(-) + +commit 6c5d2798f600a0536306e1c67b2e26e2c6eff006 +Author: Fran Diéguez +Date: Sat Mar 13 21:00:44 2010 +0100 + + Update Galician translation + + po/gl.po | 974 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 480 insertions(+), 494 deletions(-) + +commit 31cf766e647b46cd28cc6d2405c729d06063680d +Author: Friedel Wolff +Date: Sat Mar 13 20:48:05 2010 +0100 + + Add Afrikaans translation + + po/LINGUAS | 1 + + po/af.po | 2015 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 2016 insertions(+), 0 deletions(-) + +commit 62a133f55dcd5626e9583aabc2d95926936a8475 +Author: Javier Jardón +Date: Fri Mar 12 20:37:04 2010 +0100 + + Improve the documentation about single include exceptions + + Also, reenable the compiling Glib application section + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=612736 + + docs/reference/glib/compiling.sgml | 9 +++++++++ + docs/reference/glib/glib-docs.sgml | 1 + + 2 files changed, 10 insertions(+), 0 deletions(-) + +commit 5b19345246aa179788b09b7a82702e79f9d815d8 +Author: Ryan Lortie +Date: Fri Mar 12 15:38:47 2010 -0500 + + Bug 610858 - gvariant test fails sometimes + + NaN floating point values get mangled when passing across the function + call ABI on x86 so avoid using them to get rid of spurious failures. + + Reported by Christian Persch and reliably reproduced by Emilio Pozuelo + Monfort. + + glib/tests/gvariant.c | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +commit a57522deae75264bade35eae8826cda2771530c6 +Author: Tor Lillqvist +Date: Fri Mar 12 10:42:43 2010 +0200 + + The SO_KEEPALIVE value seems to actually be a char on Windows + + Do still use a BOOL variable, but initialize it to FALSE before the + getsockopt(), and drop the assertion on Windows. Should fix bug + + gio/gsocket.c | 10 +++++++++- + 1 files changed, 9 insertions(+), 1 deletions(-) + +commit 1caaa4f591ead74f0a146d73155f9cfb65899bed +Author: Javier Jardón +Date: Wed Mar 10 05:06:50 2010 +0100 + + [docs] Don't reference deprecated functions + + Use g_io_add_watch(), g_io_add_watch_full() and + g_source_remove() instead the deprecated gtk_input_add_full(), + gtk_input_remove(), gdk_input_add(), gdk_input_add_full() and + gdk_input_remove() + + glib/giochannel.c | 5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +commit 95d42761a9fff5813db46a41bc2ec6c86a2eb947 +Author: MiloÅ¡ Popović +Date: Tue Mar 9 20:29:43 2010 +0100 + + Updated Serbian translations + + po/sr.po | 1017 + +++++++++++++++++++++++++++---------------------------- + po/sr@latin.po | 1028 + ++++++++++++++++++++++++++++---------------------------- + 2 files changed, 1013 insertions(+), 1032 deletions(-) + +commit a85b9c4badf22777b1b099befcd9e033afa45dbf +Author: Ryan Lortie +Date: Tue Mar 9 13:34:00 2010 -0500 + + 'default: g_assert_not_reached();' to silence GCC + + Closes bug #612327 reported by Claudio Saavedra. + + glib/gvariant-serialiser.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 89fa967ba1c72081a1698d35e6c10c99190b612d +Author: Dagobert Michelsen +Date: Tue Mar 9 15:02:57 2010 +0100 + + Use G_STRFUNC instead of explicit gcc-only __PRETTY_FUNC__ + + glib/gvariant.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c69e6fd837cb92d0c7050d8ea2d0f98b6f70fbe8 +Author: Behdad Esfahbod +Date: Mon Mar 8 14:28:23 2010 -0500 + + Cosmetic + + glib/gmem.h | 18 ++++++++++-------- + 1 files changed, 10 insertions(+), 8 deletions(-) + +commit f6166be24d6c43ccbaf80439aefe8eff83e7843d +Author: Ryan Lortie +Date: Mon Mar 8 11:53:36 2010 -0500 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c58ce0e60c1a243df6326c26cf7d255d3af4ab2d +Author: Ryan Lortie +Date: Mon Mar 8 11:48:14 2010 -0500 + + 2.23.5 + + NEWS | 50 ++ + po/am.po | 93 ++-- + po/ar.po | 98 ++-- + po/as.po | 98 ++-- + po/ast.po | 98 ++-- + po/az.po | 98 ++-- + po/be.po | 102 +++-- + po/be@latin.po | 102 +++-- + po/bg.po | 942 ++++++++++++++++++------------------- + po/bn.po | 98 ++-- + po/bn_IN.po | 98 ++-- + po/bs.po | 98 ++-- + po/ca.po | 952 +++++++++++++++++++------------------- + po/ca@valencia.po | 98 ++-- + po/cs.po | 97 ++-- + po/cy.po | 98 ++-- + po/da.po | 953 +++++++++++++++++++------------------- + po/de.po | 955 +++++++++++++++++++------------------- + po/dz.po | 98 ++-- + po/el.po | 98 ++-- + po/en@shaw.po | 98 ++-- + po/en_CA.po | 98 ++-- + po/en_GB.po | 942 ++++++++++++++++++------------------- + po/eo.po | 97 ++-- + po/es.po | 951 +++++++++++++++++++------------------- + po/et.po | 477 +++++++++++++++++++- + po/eu.po | 1005 ++++++++++++++++++++------------------- + po/fa.po | 98 ++-- + po/fi.po | 98 ++-- + po/fr.po | 950 +++++++++++++++++++------------------- + po/ga.po | 94 ++-- + po/gl.po | 97 ++-- + po/gu.po | 98 ++-- + po/he.po | 98 ++-- + po/hi.po | 98 ++-- + po/hr.po | 98 ++-- + po/hu.po | 1021 ++++++++++++++++++++-------------------- + po/hy.po | 94 ++-- + po/id.po | 98 ++-- + po/is.po | 98 ++-- + po/it.po | 955 +++++++++++++++++++------------------- + po/ja.po | 98 ++-- + po/ka.po | 98 ++-- + po/kn.po | 98 ++-- + po/ko.po | 97 ++-- + po/ku.po | 93 ++-- + po/lt.po | 942 ++++++++++++++++++------------------- + po/lv.po | 97 ++-- + po/mai.po | 98 ++-- + po/mg.po | 98 ++-- + po/mk.po | 98 ++-- + po/ml.po | 98 ++-- + po/mn.po | 98 ++-- + po/mr.po | 98 ++-- + po/ms.po | 98 ++-- + po/nb.po | 942 ++++++++++++++++++------------------- + po/ne.po | 98 ++-- + po/nl.po | 98 ++-- + po/nn.po | 98 ++-- + po/oc.po | 93 ++-- + po/or.po | 98 ++-- + po/pa.po | 98 ++-- + po/pl.po | 942 ++++++++++++++++++------------------- + po/ps.po | 94 ++-- + po/pt.po | 952 +++++++++++++++++++------------------- + po/pt_BR.po | 942 ++++++++++++++++++------------------- + po/ro.po | 97 ++-- + po/ru.po | 942 ++++++++++++++++++------------------- + po/rw.po | 98 ++-- + po/si.po | 98 ++-- + po/sk.po | 98 ++-- + po/sl.po | 1324 + +++++++++++++++++++++++++--------------------------- + po/sq.po | 98 ++-- + po/sr.po | 98 ++-- + po/sr@ije.po | 98 ++-- + po/sr@latin.po | 98 ++-- + po/sv.po | 1353 + ++++++++++++++++++++++++++--------------------------- + po/ta.po | 98 ++-- + po/te.po | 98 ++-- + po/th.po | 97 ++-- + po/tl.po | 98 ++-- + po/tr.po | 98 ++-- + po/tt.po | 93 ++-- + po/uk.po | 98 ++-- + po/vi.po | 98 ++-- + po/wa.po | 98 ++-- + po/xh.po | 98 ++-- + po/yi.po | 97 ++-- + po/zh_CN.po | 98 ++-- + po/zh_HK.po | 968 +++++++++++++++++++------------------- + po/zh_TW.po | 953 +++++++++++++++++++------------------- + 91 files changed, 13883 insertions(+), 13260 deletions(-) + +commit f9d8d70396978ae201ce79708f7cd69cf6f93399 +Author: Ryan Lortie +Date: Mon Mar 8 11:29:27 2010 -0500 + + gtk-doc: ignore gvariant-internal.h + + docs/reference/glib/Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 929a2e1ae10083d647a77dd36c17071e7fac1593 +Author: Ryan Lortie +Date: Mon Mar 8 11:25:37 2010 -0500 + + Add gvariant-varargs.xml to the distribution + + docs/reference/glib/Makefile.am | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 6393ca443af7f588275aa6ee8b051bb1d41394e8 +Author: Ryan Lortie +Date: Mon Mar 8 10:54:23 2010 -0500 + + distcheck: add gvariant-internal.h to SOURCES + + glib/Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 75f761bcaa66c82d132c9e3d8cdfcb8ee0971eb6 +Author: Ryan Lortie +Date: Mon Mar 8 10:30:59 2010 -0500 + + GVariant variable arguments, tests, cleanups + + Merge GVariant variable arguments support and put it under tests. + + Also, remove the hack of the test case directly '#include'ing .c files + from glib/. Instead, create a non-installed gvariant-internal.h that + the tests can include and make the symbols in it visible on the symbol + table of the shared library. These symbols (as they are present in no + installed header files) are not part of the API of GLib. + + Increase test coverage in a few other areas. + + docs/reference/glib/glib-docs.sgml | 1 + + docs/reference/glib/glib-sections.txt | 11 + + docs/reference/glib/gvariant-varargs.xml | 987 +++++++++++++++++++++ + glib/glib.symbols | 48 +- + glib/gvariant-internal.h | 49 + + glib/gvariant-serialiser.c | 4 + + glib/gvariant-serialiser.h | 9 - + glib/gvariant.c | 1397 + ++++++++++++++++++++++++++---- + glib/gvariant.h | 18 + + glib/gvarianttypeinfo.c | 11 +- + glib/gvarianttypeinfo.h | 10 +- + glib/tests/gvariant.c | 773 ++++++++++++++++- + 12 files changed, 3110 insertions(+), 208 deletions(-) + +commit 8cd5c94f42fb362e1620368e805d50e3804e7bc2 +Author: Alexander Larsson +Date: Mon Mar 8 12:03:40 2010 +0100 + + Add pregenerated ids for TRASH_ORIG_PATH and TRASH_DELETION_DATE + + This fixes the build for me + + gio/gfileinfo-priv.h | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit fe4839dbb8358b65d19370114dc9d43cc71e6773 +Author: Piotr Drąg +Date: Mon Mar 8 10:51:11 2010 +0100 + + Updated Polish translation + + po/pl.po | 951 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 479 insertions(+), 472 deletions(-) + +commit 826abbefcee6c7f64ed8c21d9a2671f9cd0be089 +Author: Matthias Clasen +Date: Mon Mar 8 00:36:00 2010 -0500 + + Add defines for trash::orig-path and trash::deletion-date + + See bug 612107. + + gio/gfileinfo.c | 30 ++++++++++++++++-------------- + gio/gfileinfo.h | 24 ++++++++++++++++++++++++ + 2 files changed, 40 insertions(+), 14 deletions(-) + +commit 96d105906ef267b687ee6fbe085a791f3b17afc6 +Author: Priit Laes +Date: Mon Mar 8 00:16:23 2010 -0500 + + Fix run-assert-msg-test to work with libtool-2.2.x. + + tests/run-assert-msg-test.sh | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +commit 0a51b58e0776f2d5a82a5346ab81fb50ee75f9f4 +Author: Matthias Clasen +Date: Mon Mar 8 00:12:33 2010 -0500 + + Minor doc clarification + + Mention g_realloc() as a possible function to use with + g_memory_output_stream_new(). Bug 612041. + + gio/gmemoryoutputstream.c | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +commit 42f042d5fb381151a999e38740720e9244caa6da +Author: Matthias Clasen +Date: Mon Mar 8 00:04:11 2010 -0500 + + Minor doc clarification + + Spell out that g_utf8_strlen() behaves like strlen() wrt. to + termination. Bug 612040. + + glib/gutf8.c | 15 ++++++++------- + 1 files changed, 8 insertions(+), 7 deletions(-) + +commit 485077e9ce78ad2b55bdb471b57dc9fe21259922 +Author: Duarte Loreto +Date: Mon Mar 8 02:31:12 2010 +0000 + + Updated Portuguese translation + + po/pt.po | 29 +++++++++++++++++------------ + 1 files changed, 17 insertions(+), 12 deletions(-) + +commit 9dd6c60fbfc742eb08a5b5b27986395ed439fbc1 +Author: Matthias Clasen +Date: Sun Mar 7 17:42:25 2010 -0500 + + Plug a memleak in g_io_modules_scan_all_in_directory + + ...and at the same time, fix a malloc<>g_free mismatch. + Patch by Caolan McNamara, bug 611897 + + gio/giomodule.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 5f424088f5bdf041d5653f5f2aa310150155f58c +Author: Jorge González +Date: Sun Mar 7 11:49:58 2010 +0100 + + Updated Spanish translation + + po/es.po | 963 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 484 insertions(+), 479 deletions(-) + +commit a9d57e990b878d2b602b247dba676cd257426e23 +Author: Ryan Lortie +Date: Sun Mar 7 03:02:08 2010 -0500 + + .gitignore mem-overflow test + + glib/tests/.gitignore | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit dfcee5865b7c677db722640dec5e34a8e89b4d07 +Author: Ryan Lortie +Date: Sun Mar 7 02:15:37 2010 -0500 + + gtk-doc: ignore GBuffer + + docs/reference/glib/Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit a1b9743e1816c5269029e8ae2e21e8950c411f5c +Author: Ryan Lortie +Date: Sat Mar 6 23:21:27 2010 -0500 + + Bug 608196 - Overflow-safe g_new family + + Remove the macros for the g_malloc_n family -- calls directly to those + functions now always go directly to those functions. + + Reimplement the macros for g_new and friends. + + Remove the branch that checked for calling g_new() with a constant + n_structs == 1. With the struct size always known this case will + now be + caught under the case that does the inline multiplication and the + multiplication by 1 will be optimised away. + + glib/gmem.c | 8 ----- + glib/gmem.h | 83 + +++++++++++++++++++++++++---------------------------------- + 2 files changed, 35 insertions(+), 56 deletions(-) + +commit 01ef92178b9978b7491bbb3397de9ee08e38af20 +Author: Alexander Shopov +Date: Sat Mar 6 20:22:49 2010 +0200 + + Updated Bulgarian translation + + po/bg.po | 13 ++++++------- + 1 files changed, 6 insertions(+), 7 deletions(-) + +commit 7fa6d67bdb3b4d467931d88e7c5ba38481df8bab +Author: Gil Forcada +Date: Sat Mar 6 13:34:27 2010 +0100 + + Updated Catalan translation + + po/ca.po | 18 ++++++++++-------- + 1 files changed, 10 insertions(+), 8 deletions(-) + +commit 3d98c449b1638a4dc242279737c36fa3e37cb8ce +Author: Stefan Kost +Date: Sat Mar 6 14:15:25 2010 +0200 + + gsignal: improve g_signal_new docs. + + Using 0 for class_offset is only a means to be able to add signal + when running + out of slots in the lass structure. + + gobject/gsignal.c | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +commit fa32ee56109e295f3dae95c8bbdf98a99f1bc66e +Author: Stefan Kost +Date: Sat Mar 6 13:36:38 2010 +0200 + + docs: exchange "Subversion" with "source code repository" + + Fixes the outdated reference. + + docs/reference/gobject/tut_gsignal.xml | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit ada60fd83fdd4fa694d8d872ea7cbe14b09cbfcc +Author: Luca Ferretti +Date: Sat Mar 6 01:05:40 2010 +0100 + + Updated Italian translation + + po/it.po | 1036 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 518 insertions(+), 518 deletions(-) + +commit bed0e3f14020bce9ea4eabfe846abb2b4cdfc83e +Author: Daniel Nylander +Date: Sat Mar 6 00:28:38 2010 +0100 + + Updated Swedish translation + + po/sv.po | 1391 + +++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 707 insertions(+), 684 deletions(-) + +commit 54e830100de02d49d11842e9464511f160c8fbbc +Author: Fridrich Strba +Date: Fri Mar 5 23:15:45 2010 +0100 + + Adding new defines first appeared in 2.22 into glibconfig.h.win32.in + + glibconfig.h.win32.in | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +commit 0772298b9bc43af10ddb53f63e2c6faca6371a82 +Author: Claude Paroz +Date: Fri Mar 5 22:32:07 2010 +0100 + + Updated French translation + + po/fr.po | 964 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 483 insertions(+), 481 deletions(-) + +commit 6949099124ddd6bed660c146a42800402b5807ea +Author: Gabor Kelemen +Date: Fri Mar 5 22:03:27 2010 +0100 + + Updated Hungarian translation + + po/hu.po | 87 + +++++++++++++++++++++++-------------------------------------- + 1 files changed, 33 insertions(+), 54 deletions(-) + +commit 0edd7cb8a10388e22cd6b3a37295a6ffddf7e693 +Author: Ryan Lortie +Date: Fri Mar 5 15:52:38 2010 -0500 + + undef the proper macros to avoid warning message + + glib/tests/mem-overflow.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit a3420d8713d6b5425b80f30e5cb61e88bb9d46e2 +Author: Behdad Esfahbod +Date: Fri Mar 5 15:48:08 2010 -0500 + + Add makegalias.pl dep on galias.h and co + + glib/Makefile.am | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 4882be674326f85aaef479ba2aa6b63565f818b3 +Author: Leonid Kanter +Date: Fri Mar 5 15:49:12 2010 +0200 + + update Russian translation + + po/ru.po | 81 + +++++++++++++++++++++++++++++++++++++++----------------------- + 1 files changed, 51 insertions(+), 30 deletions(-) + +commit 24768ebd8f3a792a091f5583ab301424f84d77d3 +Author: Matej Urbančič +Date: Fri Mar 5 14:32:01 2010 +0100 + + Updated Slovenian translation + + po/sl.po | 1338 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 697 insertions(+), 641 deletions(-) + +commit 7026365db22a12b7606bf1e2defac803b359cf68 +Author: Ryan Lortie +Date: Fri Mar 5 06:10:01 2010 -0500 + + g_variant_get_strv: support objects and signatures + + glib/gvariant.c | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + +commit 118d59ba15324b49ab9f8b61332364148102d3fd +Author: Ryan Lortie +Date: Fri Mar 5 06:09:38 2010 -0500 + + GVariant: fix some refcounting issues + + glib/gvariant.c | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +commit 3297185f3962bd73714c376c101c891897b999b4 +Author: Ivar Smolin +Date: Fri Mar 5 13:08:05 2010 +0200 + + Estonian translation updated + + po/et.po | 489 + ++------------------------------------------------------------ + 1 files changed, 10 insertions(+), 479 deletions(-) + +commit 6c58d5f8aeb420bd95caaf6ec62be60b47c819b7 +Author: Gintautas Miliauskas +Date: Fri Mar 5 11:16:33 2010 +0200 + + Updated Lithuanian translation. + + po/lt.po | 22 ++++++++++++---------- + 1 files changed, 12 insertions(+), 10 deletions(-) + +commit e0fff9a057dffc795146d5baa9a9e186587344b5 +Author: Philip Withnall +Date: Thu Mar 4 23:54:07 2010 +0000 + + Updated British English translation + + po/en_GB.po | 19 +++++++++++-------- + 1 files changed, 11 insertions(+), 8 deletions(-) + +commit e583d05374fc26de0e52ea20722254cdb081b23c +Author: Kjartan Maraas +Date: Thu Mar 4 22:57:03 2010 +0100 + + Updated Norwegian bokmÃ¥l translation + + po/nb.po | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 1b1af2fa240f96fda5361784d1d80a94fae5752c +Author: Kjartan Maraas +Date: Thu Mar 4 22:56:37 2010 +0100 + + Updated Norwegian bokmÃ¥l translation + + po/nb.po | 12 ++++++++---- + 1 files changed, 8 insertions(+), 4 deletions(-) + +commit fe3c945a3fe15b6d4b1177c20f88ac7441d5dca9 +Author: Mario Blättermann +Date: Thu Mar 4 22:02:43 2010 +0100 + + Updated German translation + + po/de.po | 128 + ++++++++++++++++++++++++++++++++++---------------------------- + 1 files changed, 70 insertions(+), 58 deletions(-) + +commit 983fd35c7c38ab54b2e39e25102990184377fbb3 +Author: Inaki Larranaga Murgoitio +Date: Thu Mar 4 21:31:54 2010 +0100 + + Updated Basque language + + po/eu.po | 8 ++++++-- + 1 files changed, 6 insertions(+), 2 deletions(-) + +commit 976cce06fc863496a595240ceb6af07b90d41313 +Author: Jonh Wendell +Date: Thu Mar 4 17:13:56 2010 -0300 + + Updated Brazilian Portuguese translation + + po/pt_BR.po | 958 + ++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 484 insertions(+), 474 deletions(-) + +commit 7504095de09756efec4bc39225986c5db10d6ace +Author: Jonh Wendell +Date: Thu Mar 4 17:03:13 2010 -0300 + + Mark a string for translation + + gio/gfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 766183c079192d8fb71044770456c8c9662bd5db +Author: Claudio Saavedra +Date: Thu Mar 4 19:18:12 2010 +0200 + + Remove GUtf8InputStream leftover in docs + + Fixes build. + + docs/reference/gio/gio.types | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit f3425cc38dae31b815db1038dcaac29848840409 +Author: Behdad Esfahbod +Date: Thu Mar 4 10:38:31 2010 -0500 + + Fix galias build breakage with g_malloc_n macros + + glib/gmem.c | 15 +++++++++------ + 1 files changed, 9 insertions(+), 6 deletions(-) + +commit c423c3a9c951a64b2c3d3eea67e15fce752a2bd0 +Author: Christian Dywan +Date: Thu Mar 4 11:02:31 2010 +0100 + + Add licence headers to gnativevolumemonitor.c/h + + Fixes bug #609531 + + gio/gnativevolumemonitor.c | 22 ++++++++++++++++++++++ + gio/gnativevolumemonitor.h | 22 ++++++++++++++++++++++ + 2 files changed, 44 insertions(+), 0 deletions(-) + +commit 343cbf25c7104f782b9d0070cb623c7605dab646 +Author: Behdad Esfahbod +Date: Tue Feb 2 23:48:42 2010 -0500 + + Bug 608196 - Overflow-safe g_new family + + New public API: + + g_malloc_n + g_malloc0_n + g_realloc_n + g_try_malloc_n + g_try_malloc0_n + g_try_realloc_n + + docs/reference/glib/glib-sections.txt | 6 ++ + docs/reference/glib/tmpl/memory.sgml | 82 ++++++++++++++++++++++++- + glib/glib.symbols | 6 ++ + glib/gmem.c | 95 + ++++++++++++++++++++++++++++- + glib/gmem.h | 92 +++++++++++++++++++++++----- + glib/tests/Makefile.am | 3 + + glib/tests/mem-overflow.c | 108 + +++++++++++++++++++++++++++++++++ + glib/tests/printf.c | 2 +- + glib/tests/rand.c | 2 +- + 9 files changed, 375 insertions(+), 21 deletions(-) + +commit 373f3d8b52ca8b08de0af6062eb284c2a7a856d9 +Author: Felix Riemann +Date: Wed Feb 24 12:54:17 2010 +0100 + + Fix API docs for GZlibCompressor and GZlibDecompressor + + Corrects the general descriptions and makes the signals and + implemented + interfaces appear. + + docs/reference/gio/gio-sections.txt | 4 ++-- + gio/gzlibcompressor.c | 4 ++-- + gio/gzlibdecompressor.c | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +commit 560f5187432fc890725c5bb5c74a0997affb888c +Author: Ryan Lortie +Date: Wed Mar 3 11:36:52 2010 -0500 + + GVariantBuilder: loosen assertion check + + Don't check that a GVariantBuilder is fully-valid for use when + performing refcounting operations, as these operations may be occuring + after the builder has already been cleared. + + glib/gvariant.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit 9a886135c80233a5a40071189df7693151201954 +Author: Dan Winship +Date: Wed Mar 3 08:35:32 2010 -0500 + + GResolver: fix Windows 2000 workaround + + Move the include from gwin32resolver.c to + gnetworkingprivate.h, since gthreadedresolver.c needs it too. + + https://bugzilla.gnome.org/show_bug.cgi?id=611696 + + gio/gnetworkingprivate.h | 8 ++++++++ + gio/gwin32resolver.c | 8 -------- + 2 files changed, 8 insertions(+), 8 deletions(-) + +commit 67ba99f7abfba0d24719950b55e88024acfc91ae +Author: Kjartan Maraas +Date: Wed Mar 3 13:49:10 2010 +0100 + + Updated Norwegian bokmÃ¥l translation + + po/nb.po | 955 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 479 insertions(+), 476 deletions(-) + +commit fe6e278a870c7b2a3e76ba9ef17a9b99a4c0c474 +Author: Ryan Lortie +Date: Wed Mar 3 03:37:37 2010 -0500 + + GVariantBuilder: allow for stack allocation + + docs/reference/glib/glib-sections.txt | 2 + + glib/glib.symbols | 6 +- + glib/gvariant.c | 553 + ++++++++++++++++++++------------- + glib/gvariant.h | 13 +- + glib/tests/gvariant.c | 13 +- + 5 files changed, 352 insertions(+), 235 deletions(-) + +commit bb0808638c5b4bac11355bc94434d35e76b53364 +Author: Gabor Kelemen +Date: Tue Mar 2 17:18:52 2010 +0100 + + Updated Hungarian translation + + po/hu.po | 1030 + ++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 507 insertions(+), 523 deletions(-) + +commit 2927c5e0c628dfe97f2649661db703a30dbebd8b +Author: Inaki Larranaga Murgoitio +Date: Tue Mar 2 12:39:33 2010 +0100 + + Updated Basque language + + po/eu.po | 1035 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 504 insertions(+), 531 deletions(-) + +commit 277b9717da6261d089772684669bc55c5a0e911b +Author: Paolo Borelli +Date: Mon Mar 1 10:24:43 2010 +0100 + + Remove utf8inputstream leftovers in a few other places + + docs/reference/gio/gio-docs.xml | 1 - + docs/reference/gio/gio-sections.txt | 18 ------------------ + gio/giotypes.h | 1 - + po/POTFILES.in | 1 - + 4 files changed, 0 insertions(+), 21 deletions(-) + +commit 2bfddf162e686c750beb2af2e4cb2e8d8d523440 +Author: Alexander Larsson +Date: Mon Mar 1 09:56:02 2010 +0100 + + Remove GUtf8InputStream for now + + It turns out that the way this worked did not work out for the current + main usecase (gedit) due to issues with how this is best integrated + with GtkTextView. So, in order to not have to support an unused + non-ideal + API forever we remove this before its been in a stable release. + + The basic feature seems to have some utility though, so we hope for it + to eventually return in a better form. + + gio/Makefile.am | 2 - + gio/gio.h | 1 - + gio/gio.symbols | 7 - + gio/gutf8inputstream.c | 327 + ----------------------------------------- + gio/gutf8inputstream.h | 80 ---------- + gio/tests/Makefile.am | 4 - + gio/tests/utf8-input-stream.c | 252 ------------------------------- + 7 files changed, 0 insertions(+), 673 deletions(-) + +commit c47e1949e215126c70503843ebb7759449160212 +Author: Gil Forcada +Date: Sun Feb 28 18:55:54 2010 +0100 + + Updated Catalan translation + + po/ca.po | 1009 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 506 insertions(+), 503 deletions(-) + +commit 92d4cfbd1584847ea689146c57f3c79282813ae3 +Author: Chao-Hsiung Liao +Date: Sat Feb 27 20:40:04 2010 +0800 + + Updated Traditional Chinese translation(Hong Kong and Taiwan) + + po/zh_HK.po | 965 + ++++++++++++++++++++++++++++++----------------------------- + po/zh_TW.po | 950 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 962 insertions(+), 953 deletions(-) + +commit a3c7406cce2af55aea4ffdf1ceb8b828f5ef3219 +Author: Ryan Lortie +Date: Thu Feb 25 18:09:23 2010 -0500 + + GVariantTypeInfo: fix thread safety bug + + Issue caught by Michael Meeks. This patch based on his. + + GVariantTypeInfo was dropping the reference count on the TypeInfo + structure before removing it from the hash table. This means that + another thread could come along and grab the value from the hash table + in the meantime. + + Solve this by holding the lock on the table before dropping the + reference. + + Also: move the hash table initialisation inside of the lock to remove + the standard double-initialisation race plus a more insidious issue + caused by the fact that we free the hash table once it becomes empty. + + glib/gvarianttypeinfo.c | 12 +++++++----- + 1 files changed, 7 insertions(+), 5 deletions(-) + +commit 43b6c2b8f5a9000373b448eca7edea2e3dad4248 +Author: Duarte Loreto +Date: Thu Feb 25 02:03:17 2010 +0000 + + Updated Portuguese translation + + po/pt.po | 1030 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 514 insertions(+), 516 deletions(-) + +commit 24decf7658368ebcae012d82224627668485137a +Author: Bruce Cowan +Date: Wed Feb 24 15:28:15 2010 +0000 + + Updated British English translation + + po/en_GB.po | 1014 + ++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 508 insertions(+), 506 deletions(-) + +commit cf07bb353433234268b599d11afc0b0245fdddae +Author: Leonid Kanter +Date: Wed Feb 24 10:49:16 2010 +0200 + + Update Russian translation by Yuri Kozlov + + po/ru.po | 1188 + ++++++++++++++++++++++++++++---------------------------------- + 1 files changed, 538 insertions(+), 650 deletions(-) + +commit a495a2122d404fdf2c6cf5e3aa0524cf0437ec30 +Author: Saleem Abdulrasool +Date: Tue Feb 23 15:28:51 2010 -0800 + + include gio.h, not giotypes.h + + Including giotypes.h in gfiledescriptor.h causes a compilation + failure for users + of the header as giotypes.h may not be included directly. + + gio/gfiledescriptorbased.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 8413dfda9b71ff671a92df2c1d3451fb7c0b2085 +Author: Gintautas Miliauskas +Date: Tue Feb 23 23:45:09 2010 +0200 + + Updated Lithuanian translation. + + po/lt.po | 1179 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 587 insertions(+), 592 deletions(-) + +commit ec0e3089c0e80219ad6e7806b27363ac9c990462 +Author: Ask H. Larsen +Date: Tue Feb 23 22:25:51 2010 +0100 + + Updated Danish translation + + po/da.po | 1018 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 510 insertions(+), 508 deletions(-) + +commit 1903c229a267611a2624409371390a472d97ad4c +Author: Mario Blättermann +Date: Tue Feb 23 22:23:36 2010 +0100 + + Updated German translation + + po/de.po | 1013 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 505 insertions(+), 508 deletions(-) + +commit 2940285002c3504fb49fb7388d2265b464c92dcc +Author: Ryan Lortie +Date: Tue Feb 23 12:49:08 2010 -0500 + + .gitignore gcov output (*.gcov, *.gcno, *.gcda) + + .gitignore | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit cecf61d1c3e8ff07b1595641bad85fb9f9b03ddf +Author: Edward Hervey +Date: Mon Dec 7 11:23:55 2009 +0100 + + gobject: Don't use G_PARAM_SPEC_VALUE_TYPE when we know the pspec + is valid + + https://bugzilla.gnome.org/show_bug.cgi?id=605667 + + gobject/gobject.c | 26 +++++++++++++------------- + 1 files changed, 13 insertions(+), 13 deletions(-) + +commit a7cc500d3829db1a8757ae940db09869b78bdca8 +Author: Emilio Pozuelo Monfort +Date: Tue Feb 23 18:19:16 2010 +0100 + + Test for unexisting files in $TMP and not in $HOME + + Some buildd environments have an unwritable $HOME, which makes the + test that looks for an unexisting file there fail. Use $TMP instead, + which should be more reliable. + + https://bugzilla.gnome.org/show_bug.cgi?id=610860 + + gio/tests/readwrite.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 355246579ee08753e80bef5d31816a6ef52da73b +Author: Alexander Shopov +Date: Tue Feb 23 09:30:39 2010 +0200 + + Updated Bulgarian translation + + po/bg.po | 973 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 488 insertions(+), 485 deletions(-) + +commit 1f66523ad325c301d9caf7130b99d3fd74940338 +Author: Ryan Lortie +Date: Tue Feb 23 02:00:11 2010 -0500 + + Fix backward logic in g_return_if_fail(). + + glib/gvariant.c | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +commit 360b9b540ee5e88de01a4c8aaf16c84f6cf23dc8 +Author: Ryan Lortie +Date: Tue Feb 23 01:59:57 2010 -0500 + + GVariant: Improve test coverage. + + glib/tests/gvariant.c | 253 + +++++++++++++++++++++++++++++++++++++++++++++++-- + 1 files changed, 245 insertions(+), 8 deletions(-) + +commit 202d7d37d6ce066291504276810c350c9a3feb7a +Author: Emilio Pozuelo Monfort +Date: Fri Feb 19 19:00:02 2010 +0100 + + Don't fail a couple of tests when running as root + + root can access and write to a directory when it doesn't have + exec and write permissions respectively. So expect the tests that + check that to succeed rather than to fail when running as root. + + https://bugzilla.gnome.org/show_bug.cgi?id=552912 + + gio/tests/live-g-file.c | 18 ++++++++++++++++-- + 1 files changed, 16 insertions(+), 2 deletions(-) + +commit 4535683b3f42b6840e01bd94fe6ea792b0ebeecf +Author: Alexander Larsson +Date: Mon Feb 22 12:37:16 2010 +0100 + + Keep metadata when files are renamed and trashed + + This fixes https://bugzilla.gnome.org/show_bug.cgi?id=609813 + + gio/glocalfile.c | 18 ++++++++++++++++-- + 1 files changed, 16 insertions(+), 2 deletions(-) + +commit 515434bdcb63073d62b424c4b352a9d509cee5e6 +Author: Ryan Lortie +Date: Mon Feb 22 00:39:01 2010 -0500 + + GVariantIter, GVariantBuilder + + docs/reference/glib/glib-sections.txt | 22 + + docs/reference/glib/tmpl/glib-unused.sgml | 67 -- + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/version.sgml | 68 ++ + glib/glib.symbols | 18 + + glib/gvariant.c | 1387 + +++++++++++++++++++++++------ + glib/gvariant.h | 36 + + glib/gvarianttype.c | 17 + + glib/gvarianttype.h | 1 + + 9 files changed, 1295 insertions(+), 326 deletions(-) + +commit b9d728474ebc51c0d4ff46cb44d97134730174fc +Author: Ryan Lortie +Date: Sun Feb 21 19:39:33 2010 -0500 + + Remove redudant check for direct #include gslice.h + + This was added before we had a standardised header check and not + removed + when the standard check was added. + + glib/gslice.c | 2 ++ + glib/gslice.h | 4 ---- + 2 files changed, 2 insertions(+), 4 deletions(-) + +commit 0a1ce31b6e8d3a7683ae5164d51e325d3669f53f +Author: Matthias Clasen +Date: Sun Feb 21 21:38:33 2010 -0500 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 7fea53a4a290f1cd2c052320b21ee3405e1ed605 +Author: Matthias Clasen +Date: Sun Feb 21 21:37:33 2010 -0500 + + 2.23.4 + + po/am.po | 115 +++--- + po/ar.po | 115 +++--- + po/as.po | 115 +++--- + po/ast.po | 115 +++--- + po/az.po | 115 +++--- + po/be.po | 116 +++--- + po/be@latin.po | 116 +++--- + po/bg.po | 115 +++--- + po/bn.po | 115 +++--- + po/bn_IN.po | 115 +++--- + po/bs.po | 115 +++--- + po/ca.po | 115 +++--- + po/ca@valencia.po | 115 +++--- + po/cs.po | 942 +++++++++++++++++++------------------- + po/cy.po | 115 +++--- + po/da.po | 115 +++--- + po/de.po | 956 +++++++++++++++++++------------------- + po/dz.po | 115 +++--- + po/el.po | 115 +++--- + po/en@shaw.po | 115 +++--- + po/en_CA.po | 115 +++--- + po/en_GB.po | 115 +++--- + po/eo.po | 115 +++--- + po/es.po | 951 +++++++++++++++++++------------------- + po/et.po | 477 +++++++++++++++++++- + po/eu.po | 115 +++--- + po/fa.po | 115 +++--- + po/fi.po | 115 +++--- + po/fr.po | 115 +++--- + po/ga.po | 115 +++--- + po/gl.po | 942 +++++++++++++++++++------------------- + po/gu.po | 115 +++--- + po/he.po | 115 +++--- + po/hi.po | 115 +++--- + po/hr.po | 115 +++--- + po/hu.po | 115 +++--- + po/hy.po | 115 +++--- + po/id.po | 115 +++--- + po/is.po | 115 +++--- + po/it.po | 115 +++--- + po/ja.po | 115 +++--- + po/ka.po | 115 +++--- + po/kn.po | 115 +++--- + po/ko.po | 952 +++++++++++++++++++------------------- + po/ku.po | 115 +++--- + po/lt.po | 115 +++--- + po/lv.po | 115 +++--- + po/mai.po | 115 +++--- + po/mg.po | 115 +++--- + po/mk.po | 115 +++--- + po/ml.po | 115 +++--- + po/mn.po | 115 +++--- + po/mr.po | 115 +++--- + po/ms.po | 115 +++--- + po/nb.po | 115 +++--- + po/ne.po | 115 +++--- + po/nl.po | 116 +++--- + po/nn.po | 115 +++--- + po/oc.po | 115 +++--- + po/or.po | 115 +++--- + po/pa.po | 115 +++--- + po/pl.po | 942 +++++++++++++++++++------------------- + po/ps.po | 115 +++--- + po/pt.po | 115 +++--- + po/pt_BR.po | 115 +++--- + po/ro.po | 954 +++++++++++++++++++------------------- + po/ru.po | 115 +++--- + po/rw.po | 116 +++--- + po/si.po | 115 +++--- + po/sk.po | 115 +++--- + po/sl.po | 1323 + +++++++++++++++++++++++++---------------------------- + po/sq.po | 119 +++--- + po/sr.po | 115 +++--- + po/sr@ije.po | 115 +++--- + po/sr@latin.po | 115 +++--- + po/sv.po | 115 +++--- + po/ta.po | 115 +++--- + po/te.po | 115 +++--- + po/th.po | 115 +++--- + po/tl.po | 115 +++--- + po/tr.po | 115 +++--- + po/tt.po | 115 +++--- + po/uk.po | 115 +++--- + po/vi.po | 115 +++--- + po/wa.po | 115 +++--- + po/xh.po | 115 +++--- + po/yi.po | 115 +++--- + po/zh_CN.po | 115 +++--- + po/zh_HK.po | 960 +++++++++++++++++++------------------- + po/zh_TW.po | 945 +++++++++++++++++++------------------- + 90 files changed, 10110 insertions(+), 9327 deletions(-) + +commit 9a08cd5b042a1550cd446724e1ce71ff5379ed2b +Author: Matthias Clasen +Date: Sun Feb 21 20:28:34 2010 -0500 + + More distcheck fixes + + glib/Makefile.am | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit ef497e8e64100f672509b8398a9805677ce80bcb +Author: Matthias Clasen +Date: Sun Feb 21 20:11:33 2010 -0500 + + Fix some distcheck issues + + glib/Makefile.am | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 3983418c25037dd01fea4b7a52eecdc703535d78 +Author: Matthias Clasen +Date: Sun Feb 21 19:55:02 2010 -0500 + + Fix up GFileDescriptorBased docs + + docs/reference/gio/gio-docs.xml | 1 + + docs/reference/gio/gio-sections.txt | 13 +++++++++++++ + docs/reference/gio/gio.types | 1 + + gio/gfiledescriptorbased.c | 4 ++-- + 4 files changed, 17 insertions(+), 2 deletions(-) + +commit 03fc92784d0ba995883fa2cbae96531ff3db8672 +Author: Matthias Clasen +Date: Sun Feb 21 19:48:22 2010 -0500 + + Add indices for 2.24 additions + + docs/reference/glib/glib-docs.sgml | 4 ++++ + docs/reference/gobject/gobject-docs.sgml | 4 ++++ + 2 files changed, 8 insertions(+), 0 deletions(-) + +commit 80a160c7c6c1028febfda3d5bf3b557406a9555c +Author: Matthias Clasen +Date: Sun Feb 21 19:46:57 2010 -0500 + + Small doc fixes + + docs/reference/glib/glib-sections.txt | 5 +++++ + docs/reference/gobject/gobject-sections.txt | 2 ++ + 2 files changed, 7 insertions(+), 0 deletions(-) + +commit 2de84d65943c29b86c24f2da9c9e7ca094e9c3a6 +Author: Matthias Clasen +Date: Sun Feb 21 19:42:37 2010 -0500 + + Fix up make check + + gio/gfiledescriptorbased.c | 2 ++ + gio/gio.symbols | 13 ++++++++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit fd751cc2a2906bf4fd19cadacf202de9819247c4 +Author: Matthias Clasen +Date: Sun Feb 21 19:17:50 2010 -0500 + + More updates + + NEWS | 8 +++++++- + 1 files changed, 7 insertions(+), 1 deletions(-) + +commit e0e57fd97d156e860f1211887b6f302c68c86202 +Author: Matthias Clasen +Date: Sun Feb 21 17:59:15 2010 -0500 + + Fix a doc typo. + + Reported in bug 608063 by Дилян Палаузов. + + glib/goption.h | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +commit dcdc409cd88f6d47eb54a7eee528be6c8667d394 +Author: Matthias Clasen +Date: Sun Feb 21 16:29:15 2010 -0500 + + Fix the large array test to work + + Fix by Sven Herzberg, bug 568760 + + glib/tests/array-test.c | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +commit 21080a33e12e87144e0534cd18b3699a9dbc2f36 +Author: Matthias Clasen +Date: Sun Feb 21 16:12:35 2010 -0500 + + Add missign single include guards + + Reported in bug 609530. patch by Christian Dywan. + + gio/gcharsetconverter.h | 4 ++++ + gio/gnativevolumemonitor.h | 4 ++++ + gio/gzlibcompressor.h | 4 ++++ + gio/gzlibdecompressor.h | 4 ++++ + 4 files changed, 16 insertions(+), 0 deletions(-) + +commit dd7bd61c5301f92408ccb420a5bbd094faa863c3 +Author: Matthias Clasen +Date: Sun Feb 21 16:04:21 2010 -0500 + + Documentation improvement + + Document the size requirements on output buffer in + g_base64_encode_close. + Patch by Christian Persch, bug 609564. + + glib/gbase64.c | 8 ++++++-- + 1 files changed, 6 insertions(+), 2 deletions(-) + +commit 6c1a914d511b9a94fbeb3e30d93608c3f537c0a7 +Author: Matthias Clasen +Date: Sun Feb 21 15:55:10 2010 -0500 + + Fix build on Solaris 8 + + System header fun. See bug 610131. + + configure.in | 2 +- + gio/libasyncns/asyncns.c | 5 +++++ + 2 files changed, 6 insertions(+), 1 deletions(-) + +commit de6914a46a0af720de3df34539e61973e9d4446b +Author: Matthias Clasen +Date: Sun Feb 21 15:32:08 2010 -0500 + + Add a pointer to G_DEFINE_INTERFACE + + docs/reference/gobject/tut_gtype.xml | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit ecb45f43824cdae003cf1280eb0c13039619d6b5 +Author: Matthias Clasen +Date: Sun Feb 21 15:28:04 2010 -0500 + + Fix an oversight + + _Always_ explicitly compare strcmp to 0... this was pointed out in + bug 610484 by Christian Persch. + + glib/gvariant.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 19e438556cd0d958b34cd9a63bd528d680d77c45 +Author: Matthias Clasen +Date: Sun Feb 21 15:19:06 2010 -0500 + + Updates + + NEWS | 30 ++++++++++++++++++++++++++++++ + 1 files changed, 30 insertions(+), 0 deletions(-) + +commit e377a6f4816ceef23a730c6e431d9ccbb052e7f0 +Author: Fran Diéguez +Date: Sat Feb 20 22:22:04 2010 +0100 + + Updated Galician Translation + + po/gl.po | 119 + ++++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 62 insertions(+), 57 deletions(-) + +commit af22e5739ba89a9795f046ddaf00a506b77c5a8e +Author: Piotr Drąg +Date: Sat Feb 20 22:20:04 2010 +0100 + + Updated Polish translation + + po/pl.po | 1097 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 552 insertions(+), 545 deletions(-) + +commit 5047fd7f688dc0a3e4c148864f63961389bc83f9 +Author: Colin Walters +Date: Fri Feb 19 16:06:22 2010 -0500 + + [gutf8.c] Add a bit of documentation to UNICODE_VALID + + glib/gutf8.c | 18 +++++++++++++++++- + 1 files changed, 17 insertions(+), 1 deletions(-) + +commit ed3c914cdbdd02d1af6d2f6a3a3f3a9fdc8dc1c2 +Author: Ryan Lortie +Date: Fri Feb 19 10:42:53 2010 -0500 + + Merge the main public API of GVariant + + docs/reference/glib/glib-sections.txt | 60 +- + glib/Makefile.am | 1 + + glib/glib.symbols | 56 + + glib/gvariant-core.c | 18 + + glib/gvariant.c | 1858 + +++++++++++++++++++++++++++++++++ + glib/gvariant.h | 95 ++- + glib/tests/gvariant.c | 179 +++- + 7 files changed, 2259 insertions(+), 8 deletions(-) + +commit afa5dc0c6d9e1aa9b6e057d93562e6ee5796bf46 +Author: Petr Kovar +Date: Thu Feb 18 20:07:56 2010 +0100 + + Update Czech translation + + po/cs.po | 947 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 480 insertions(+), 467 deletions(-) + +commit 48f74cab395044a07e1220440cdc816db01b9984 +Author: Christian Kellner +Date: Thu Feb 18 15:49:58 2010 +0100 + + Move event support in the inotify backend + + This adds support for G_FILE_MONITOR_SEND_MOVED events when + requested by + the user to the inotify backend. Last part to fix bug #547890. + Based heavily on a patch by Martyn Russel . + + gio/inotify/ginotifydirectorymonitor.c | 7 +++- + gio/inotify/ginotifyfilemonitor.c | 9 +++++- + gio/inotify/inotify-helper.c | 49 + ++++++++++++++++++++++++++++---- + gio/inotify/inotify-kernel.c | 4 +- + gio/inotify/inotify-path.c | 18 +++++++++++ + gio/inotify/inotify-path.h | 8 ++-- + gio/inotify/inotify-sub.c | 6 ++- + gio/inotify/inotify-sub.h | 3 +- + 8 files changed, 86 insertions(+), 18 deletions(-) + +commit 239af977126a4a4b6c68cb43e0876847c7ce2211 +Author: Christian Kellner +Date: Thu Feb 18 15:43:45 2010 +0100 + + GLocalFileMonitor: Support for GFileMonitorFlags + + Evaluate and remember GFileMonitorFlags. This is a part of move + event support for fs-monitoring (bug #547890). + + gio/glocalfilemonitor.c | 28 +++++++++++++++++++++++++--- + gio/glocalfilemonitor.h | 1 + + 2 files changed, 26 insertions(+), 3 deletions(-) + +commit 41956b237601a1c5ded0ba5e8821b9f5d09278be +Author: Christian Kellner +Date: Thu Feb 18 15:40:13 2010 +0100 + + Move event support for fs-monitoring: Event & flag + + Add a G_FILE_MONITOR_SEND_MOVED flag indicating the API user + wants to receive the new G_FILE_MOINOTR_EVENT_MOVED event + instead of single CREATED/DELETED events. + First part of bug #547890. + + gio/gioenums.h | 12 ++++++++++-- + 1 files changed, 10 insertions(+), 2 deletions(-) + +commit a5dc1af0a230ecfca2dac7fa0dcdf8359537a9f6 +Author: Ivar Smolin +Date: Thu Feb 18 11:46:06 2010 +0200 + + Estonian translation updated + + po/et.po | 511 + +++----------------------------------------------------------- + 1 files changed, 21 insertions(+), 490 deletions(-) + +commit e1cc5a5fecc1847a6080435fc8a40f2d8d534bbb +Author: Mario Blättermann +Date: Wed Feb 17 09:00:04 2010 +0100 + + Updated German translation + + po/de.po | 1022 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 515 insertions(+), 507 deletions(-) + +commit 63a6666ab7a54c9584b6579e323301f3528e86b3 +Author: Benjamin Otte +Date: Wed Feb 17 08:45:28 2010 +0100 + + Make g_type_interface_prerequisites() only return one instantiable + type + + Previously, the code had a heisenbug and could potentially return + superclasses, too. In fact, it was based on the behavior of malloc. + + https://bugzilla.redhat.com/show_bug.cgi?id=554678 + + gobject/gtype.c | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +commit 9fdbae9344a04479ccb601ebd4ae2c709e7856d9 +Author: Matej Urbančič +Date: Tue Feb 16 12:38:11 2010 +0100 + + Updated Slovenian translation + + po/sl.po | 163 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 84 insertions(+), 79 deletions(-) + +commit b899bfc7415ec76ef563de3fc945b84675357464 +Author: Ryan Lortie +Date: Mon Feb 15 19:11:58 2010 -0500 + + GVariant: create child instance from its own data + + also: white-space fix in the serialiser + + glib/gvariant-core.c | 8 ++++++-- + glib/gvariant-serialiser.c | 1 - + 2 files changed, 6 insertions(+), 3 deletions(-) + +commit 7fb9d536c0c89800f745ea2c05380efd8f371bf1 +Author: Changwoo Ryu +Date: Tue Feb 16 03:42:19 2010 +0900 + + Updated Korean translation + + po/ko.po | 1032 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 517 insertions(+), 515 deletions(-) + +commit 68505d5a9f0b2cbacee4eafa3ba754612f052a5f +Author: Jorge González +Date: Mon Feb 15 17:54:26 2010 +0100 + + Updated Spanish translation + + po/es.po | 958 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 483 insertions(+), 475 deletions(-) + +commit 36d29e06f9459ce28206d212667aee3adc1fd780 +Author: Fran Diéguez +Date: Mon Feb 15 17:10:21 2010 +0100 + + Updated Galician Translation + + po/gl.po | 1259 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 641 insertions(+), 618 deletions(-) + +commit bb4f63d6390fe5efd183f259e5bd891f89de9e24 +Author: Christian Kellner +Date: Sun Feb 7 17:23:38 2010 +0100 + + GFile: Support for splice(2) in copy_fallback + + The (linux specific) system call splice can be + used to transfer data between file descriptors + whitout copying them into user space. + See bug #604086 for additional details. + + configure.in | 1 + + gio/gfile.c | 187 + ++++++++++++++++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 170 insertions(+), 18 deletions(-) + +commit 28f90db1edf938c04f0b5c8a2f54f8add50db234 +Author: Christian Kellner +Date: Sun Feb 7 17:18:06 2010 +0100 + + GLocalFileOutputStream: Implement GFileDescriptorBased + + Also convert GLocalFileIOStream to use the new interface to obtain + the file descriptor. + + gio/glocalfileiostream.c | 3 ++- + gio/glocalfileoutputstream.c | 30 +++++++++++++++++++++++------- + gio/glocalfileoutputstream.h | 1 - + 3 files changed, 25 insertions(+), 9 deletions(-) + +commit 670f6210ced672eb9c8a500b3dd6cfd22346472b +Author: Christian Kellner +Date: Sun Feb 7 17:17:44 2010 +0100 + + GLocalFileInputStream: Implement GFileDescriptorBased + + gio/glocalfileinputstream.c | 22 +++++++++++++++++++++- + 1 files changed, 21 insertions(+), 1 deletions(-) + +commit 4536a4adbc290f56f3686dec0c8e05c15049a602 +Author: Christian Kellner +Date: Sun Feb 7 14:51:01 2010 +0100 + + GFileDescriptorBased: New interface + + New interface for file descriptor based io object. The interface + is only exported on unix based systems. See bug 604086. + + gio/Makefile.am | 3 ++ + gio/gfiledescriptorbased.c | 72 + ++++++++++++++++++++++++++++++++++++++++++++ + gio/gfiledescriptorbased.h | 63 ++++++++++++++++++++++++++++++++++++++ + gio/giotypes.h | 1 + + 4 files changed, 139 insertions(+), 0 deletions(-) + +commit 3840151012b6ed01bfa9aada2914cce974398d0d +Author: Chao-Hsiung Liao +Date: Mon Feb 15 19:15:38 2010 +0800 + + Updated Traditional Chinese translation(Hong Kong and Taiwan) + + po/zh_HK.po | 1028 + +++++++++++++++++++++++++++++------------------------------ + po/zh_TW.po | 1015 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 1015 insertions(+), 1028 deletions(-) + +commit b37da7134b127e6c92e7002150077515dc7d42b4 +Author: Alexander Larsson +Date: Mon Feb 15 10:13:10 2010 +0100 + + Set result_uncertain in win32 g_content_type_guess implementation + + Fixes bug #609143 + + gio/gcontenttype.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 83c6087dcc2168cc41db3a328bbd30341ac3955b +Author: Lucian Grijincu +Date: Sat Feb 13 19:35:42 2010 +0200 + + Updated Romanian translation + + po/ro.po | 1025 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 510 insertions(+), 515 deletions(-) + +commit e66d66c5559f4f0423d015a4d006f170dcb5d582 +Author: Ryan Lortie +Date: Thu Feb 11 16:52:20 2010 -0500 + + GVariant: lock before freeing, to avoid assert + + glib/gvariant-core.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit fd3923aba2f827b47c54edc9728c953b9520fa52 +Author: Benjamin Otte +Date: Thu Feb 11 21:08:57 2010 +0100 + + Move offsets array from interface data member to TypeNode + + We need to assign offsets when the interface is not yet instantiated. + + gobject/gtype.c | 12 ++++++------ + 1 files changed, 6 insertions(+), 6 deletions(-) + +commit 61b649cffd26c3feafe4158da01ebb1394a1b574 +Author: Benjamin Otte +Date: Thu Feb 11 21:05:41 2010 +0100 + + Move prerequisites out of _prot struct + + Also fix the naming (including typo) + + gobject/gtype.c | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +commit 1e6b18422563bc428e17e8a4e3c84dac8ed02ab2 +Author: Ryan Lortie +Date: Wed Feb 10 13:59:14 2010 -0500 + + add performance tests to gitignore + + tests/gobject/.gitignore | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 3e30e8a87e18952e9c26c0d05f5c336a110f2bed +Author: Ryan Lortie +Date: Wed Feb 10 11:29:12 2010 -0500 + + make tests not dynamic link against /lib/libglib + + For some reason, even though the tests are linked against + libgobject.la + and libgobject.la mentions libglib.la as a dependency, the tests are + running against the system glib instead of the in-tree one. + + Adding the libglib.la file as an explicit LDFLAG fixes it. + + tests/gobject/Makefile.am | 8 +++++++- + 1 files changed, 7 insertions(+), 1 deletions(-) + +commit 1e655eb02c6cadee45a28df359327ce9fb41c6a5 +Author: Ryan Lortie +Date: Wed Feb 10 11:13:06 2010 -0500 + + merge GVariant + + docs/reference/glib/Makefile.am | 7 +- + docs/reference/glib/glib-docs.sgml | 1 + + docs/reference/glib/glib-sections.txt | 18 + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/gobject/gobject-sections.txt | 2 + + glib/Makefile.am | 4 + + glib/glib.h | 1 + + glib/glib.symbols | 13 + + glib/gvariant-core.c | 855 + +++++++++++++++++++++++++++ + glib/gvariant-core.h | 46 ++ + glib/gvariant.h | 47 ++ + gobject/gboxed.c | 27 + + gobject/gboxed.h | 18 + + gobject/gobject.symbols | 2 + + 14 files changed, 1039 insertions(+), 3 deletions(-) + +commit 2afe2325c4c9e42dab8ebfed11b86d24715837e0 +Author: Matej Urbančič +Date: Wed Feb 10 16:34:53 2010 +0100 + + Updated Slovenian translation + + po/sl.po | 1352 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 701 insertions(+), 651 deletions(-) + +commit 243e340d6edde4d7ae1c45b3041489332f83a6d5 +Author: Matthias Clasen +Date: Tue Feb 9 10:35:01 2010 -0500 + + bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 1831ff2d30ee837179d9d79d9dbf36016564e0f0 +Author: Matthias Clasen +Date: Tue Feb 9 10:20:37 2010 -0500 + + 2.23.3 + + po/am.po | 250 ++++++----- + po/ar.po | 254 ++++++----- + po/as.po | 254 ++++++----- + po/ast.po | 254 ++++++----- + po/az.po | 253 ++++++----- + po/be.po | 263 ++++++----- + po/be@latin.po | 260 ++++++----- + po/bg.po | 254 ++++++----- + po/bn.po | 254 ++++++----- + po/bn_IN.po | 254 ++++++----- + po/bs.po | 253 ++++++----- + po/ca.po | 254 ++++++----- + po/ca@valencia.po | 254 ++++++----- + po/cs.po | 940 +++++++++++++++++++------------------- + po/cy.po | 254 ++++++----- + po/da.po | 254 ++++++----- + po/de.po | 254 ++++++----- + po/dz.po | 253 ++++++----- + po/el.po | 254 ++++++----- + po/en@shaw.po | 254 ++++++----- + po/en_CA.po | 254 ++++++----- + po/en_GB.po | 254 ++++++----- + po/eo.po | 251 ++++++----- + po/es.po | 955 +++++++++++++++++++------------------- + po/et.po | 254 ++++++----- + po/eu.po | 255 ++++++----- + po/fa.po | 253 ++++++----- + po/fi.po | 254 ++++++----- + po/fr.po | 950 +++++++++++++++++++------------------- + po/ga.po | 251 ++++++----- + po/gl.po | 254 ++++++----- + po/gu.po | 254 ++++++----- + po/he.po | 254 ++++++----- + po/hi.po | 254 ++++++----- + po/hr.po | 253 ++++++----- + po/hu.po | 254 ++++++----- + po/hy.po | 251 ++++++----- + po/id.po | 253 ++++++----- + po/is.po | 253 ++++++----- + po/it.po | 254 ++++++----- + po/ja.po | 254 ++++++----- + po/ka.po | 254 ++++++----- + po/kn.po | 254 ++++++----- + po/ko.po | 254 ++++++----- + po/ku.po | 250 ++++++----- + po/lt.po | 254 ++++++----- + po/lv.po | 251 ++++++----- + po/mai.po | 254 ++++++----- + po/mg.po | 253 ++++++----- + po/mk.po | 254 ++++++----- + po/ml.po | 254 ++++++----- + po/mn.po | 253 ++++++----- + po/mr.po | 254 ++++++----- + po/ms.po | 253 ++++++----- + po/nb.po | 940 +++++++++++++++++++------------------- + po/ne.po | 253 ++++++----- + po/nl.po | 256 ++++++----- + po/nn.po | 254 ++++++----- + po/oc.po | 249 ++++++----- + po/or.po | 254 ++++++----- + po/pa.po | 254 ++++++----- + po/pl.po | 254 ++++++----- + po/ps.po | 253 ++++++----- + po/pt.po | 254 ++++++----- + po/pt_BR.po | 940 +++++++++++++++++++------------------- + po/ro.po | 254 ++++++----- + po/ru.po | 258 ++++++----- + po/rw.po | 253 ++++++----- + po/si.po | 254 ++++++----- + po/sk.po | 253 ++++++----- + po/sl.po | 1340 + ++++++++++++++++++++++++++--------------------------- + po/sq.po | 256 ++++++----- + po/sr.po | 254 ++++++----- + po/sr@ije.po | 253 ++++++----- + po/sr@latin.po | 254 ++++++----- + po/sv.po | 254 ++++++----- + po/ta.po | 254 ++++++----- + po/te.po | 254 ++++++----- + po/th.po | 21 +- + po/tl.po | 253 ++++++----- + po/tr.po | 254 ++++++----- + po/tt.po | 250 ++++++----- + po/uk.po | 254 ++++++----- + po/vi.po | 254 ++++++----- + po/wa.po | 253 ++++++----- + po/xh.po | 253 ++++++----- + po/yi.po | 251 ++++++----- + po/zh_CN.po | 254 ++++++----- + po/zh_HK.po | 254 ++++++----- + po/zh_TW.po | 254 ++++++----- + 90 files changed, 15161 insertions(+), 11981 deletions(-) + +commit f570cf99b32d65633082f451a41d3336de0ec005 +Author: Matthias Clasen +Date: Tue Feb 9 09:16:23 2010 -0500 + + Doc cleanups + + docs/reference/glib/Makefile.am | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit a68c0cde8f3b3ca7aa581843a65e43fcc2b11409 +Author: Matthias Clasen +Date: Tue Feb 9 08:46:50 2010 -0500 + + Updates + + NEWS | 26 ++++++++++++++++++++++++++ + 1 files changed, 26 insertions(+), 0 deletions(-) + +commit bd6a88aef70cb93d79580c00dae420c4a4729f1e +Author: Ryan Lortie +Date: Mon Feb 8 00:43:17 2010 -0500 + + gstrfuncs.h: needs gmacros.h for G_BEGIN_DECLS + + glib/gstrfuncs.h | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 0be1a4fb973e6a10c12ad9d67344281ccee5ce7e +Author: Theppitak Karoonboonyanan +Date: Mon Feb 8 09:57:37 2010 +0700 + + Updated Thai translation. + + po/th.po | 276 + +++++++++++++++++++++++++++++++++++--------------------------- + 1 files changed, 155 insertions(+), 121 deletions(-) + +commit e04c9c699c1ca181419d3d325aade70cf3e14763 +Author: Ryan Lortie +Date: Sun Feb 7 15:41:21 2010 -0500 + + add missing #include "config.h" + + glib/gbuffer.c | 2 ++ + glib/gurifuncs.c | 2 ++ + glib/gvariant-serialiser.c | 2 ++ + glib/gvarianttype.c | 2 ++ + glib/gvarianttypeinfo.c | 2 ++ + 5 files changed, 10 insertions(+), 0 deletions(-) + +commit 218c691ca33f556033535fa43a39b65cd2276282 +Author: Ryan Lortie +Date: Sun Feb 7 03:14:28 2010 -0500 + + remove #include from some .c files + + include individual headers instead + + glib/gurifuncs.c | 9 +++++++-- + glib/gvarianttypeinfo.c | 5 ++++- + 2 files changed, 11 insertions(+), 3 deletions(-) + +commit ea2917b01f045d8e7ede4824039d462203af3290 +Author: Ryan Lortie +Date: Sun Feb 7 03:08:08 2010 -0500 + + gurifuncs.c: #include "string.h" -> + + glib/gurifuncs.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 9f303375736edbb6c7d39f339b89be14d621fd8e +Author: Ryan Lortie +Date: Sun Feb 7 02:52:07 2010 -0500 + + GVariantTypeInfo: free hash table when not in use + + glib/gvarianttypeinfo.c | 7 ++++++- + 1 files changed, 6 insertions(+), 1 deletions(-) + +commit 80538aba7ea8f9a05ea1a6a66eb202a4ccfe4b5f +Author: Ryan Lortie +Date: Thu Feb 4 21:18:53 2010 -0500 + + merge the GVariant serialiser + + glib/Makefile.am | 2 + + glib/gvariant-serialiser.c | 1656 + ++++++++++++++++++++++++++++++++++++++++++++ + glib/gvariant-serialiser.h | 75 ++ + glib/tests/gvariant.c | 1245 +++++++++++++++++++++++++++++++++ + 4 files changed, 2978 insertions(+), 0 deletions(-) + +commit eea6042f5f4db2f123763097ac2fd4738cef24ee +Author: Ryan Lortie +Date: Fri Feb 5 12:37:43 2010 -0500 + + GMappedFile: minimal changes to support GBuffer + + Just reorganise the GMappedFile struct to be binary compatible with + GBuffer. If GBuffer becomes public later then we can revisit this. + + glib/gmappedfile.c | 46 +++++++++++++++++++++++++++++++--------------- + 1 files changed, 31 insertions(+), 15 deletions(-) + +commit 3f4b7f6d37cd0036f65c31eeee033d650072561e +Author: Ryan Lortie +Date: Sat Feb 6 10:18:07 2010 -0500 + + add private GBuffer type + + glib/Makefile.am | 2 + + glib/gbuffer.c | 205 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + glib/gbuffer.h | 88 +++++++++++++++++++++++ + 3 files changed, 295 insertions(+), 0 deletions(-) + +commit 813d0d17a65be2ecb5961a96630d11a195ce6a67 +Author: Tim-Philipp Müller +Date: Fri Feb 5 01:14:20 2010 +0000 + + Don't leak filename in g_io_modules_scan_all_in_directory + + https://bugzilla.gnome.org/show_bug.cgi?id=608159 + + gio/giomodule.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 4adde81771f5a4471a568a409a38fd9162d49418 +Author: Hans Breuer +Date: Sat Feb 6 13:22:39 2010 +0100 + + Fix inconsistent line-endings + + Apparently CRLF (windows format) was checked in from Linux + causing modified by checkout under windows. See: + http://help.github.com/dealing-with-lineendings/ + http://mail.gnome.org/archives/gtk-devel-list/2009-July/msg00041.html + + po/be.po | 400 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 200 insertions(+), 200 deletions(-) + +commit 00b55e2bc7cb7f4ff7adb3b40e1b41becce6cba1 +Author: Tor Lillqvist +Date: Sat Feb 6 10:40:03 2010 +0200 + + Drop empty elements from the VS9 vcproj files + + Dunno if this makes sense, if one lets VS edit the it will put them + back anyway. But it's more pleasing to the eye. + + build/win32/vs9/gio.vcproj | 50 ----- + build/win32/vs9/glib-genmarshal.vcproj | 50 ----- + build/win32/vs9/glib.vcproj | 230 + +++++--------------- + build/win32/vs9/gmodule.vcproj | 50 ----- + build/win32/vs9/gobject.vcproj | 50 ----- + build/win32/vs9/gspawn-win32-helper-console.vcproj | 50 ----- + build/win32/vs9/gspawn-win32-helper.vcproj | 50 ----- + build/win32/vs9/gthread.vcproj | 50 ----- + build/win32/vs9/testglib.vcproj | 50 ----- + 9 files changed, 60 insertions(+), 570 deletions(-) + +commit 10cd6df4a8b947b3b2b68891c779f5318b46e8de +Author: Jonh Wendell +Date: Fri Feb 5 11:09:26 2010 -0300 + + Updated Brazilian Portuguese translation + + po/pt_BR.po | 1005 + +++++++++++++++++++++++++++++++---------------------------- + 1 files changed, 523 insertions(+), 482 deletions(-) + +commit 5e753d6abcad6040a6fd25f5ac34d5dab4f7ae22 +Author: Ryan Lortie +Date: Thu Feb 4 20:27:11 2010 -0500 + + rename test: gvarianttype -> gvariant + + More test cases will be added to this file. + + glib/tests/.gitignore | 2 +- + glib/tests/Makefile.am | 4 +- + glib/tests/gvariant.c | 1041 + +++++++++++++++++++++++++++++++++++++++++++++ + glib/tests/gvarianttype.c | 1041 + --------------------------------------------- + 4 files changed, 1044 insertions(+), 1044 deletions(-) + +commit 9a990cea0cfc7357000e30f3c24030fed2ff4708 +Author: Petr Kovar +Date: Thu Feb 4 23:54:15 2010 +0100 + + Update Czech translation + + po/cs.po | 1012 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 521 insertions(+), 491 deletions(-) + +commit 762e18d8cebf907e51aed14298525048f7c9e015 +Author: Tor Lillqvist +Date: Thu Feb 4 19:57:38 2010 +0200 + + Further work on VS9 project files + + build/win32/vs9/README.txt | 16 ++++++++++++---- + build/win32/vs9/glib.vsprops | 32 ++++++++++++++++++++++++++++++-- + build/win32/vs9/install.vcproj | 8 ++++---- + 3 files changed, 46 insertions(+), 10 deletions(-) + +commit 021643cda4f9b13fd72e898165744e9aefb346cd +Author: Tor Lillqvist +Date: Thu Feb 4 19:54:50 2010 +0200 + + Clarify use of struct stat on Windows + + gio/glocalfile.c | 23 ++++++++++++++--------- + gio/glocalfileinfo.c | 10 ++++++---- + glib/gstdio.c | 24 +++++++++++++++++++----- + glib/gstdio.h | 37 +++++++++++++++++++++++++++++++++++++ + 4 files changed, 76 insertions(+), 18 deletions(-) + +commit 5589d2b45567a0b35e8d8f55f20b1e381c53ca04 +Author: Tor Lillqvist +Date: Thu Feb 4 19:20:08 2010 +0200 + + Internally use the _stati64 API explicitly on Windows + + Avoids warnings and confusion when compiling with MSVC. + + glib/giowin32.c | 24 ++++++++++-------------- + glib/gkeyfile.c | 5 ++--- + glib/gmappedfile.c | 5 ++--- + 3 files changed, 14 insertions(+), 20 deletions(-) + +commit 05291c0d11f269dedacde62e767b75976c27bd33 +Author: Tor Lillqvist +Date: Thu Feb 4 15:24:56 2010 +0200 + + Enable libtool compatible DLL naming in the VS9 projects + + build/win32/vs9/gio.vcproj | 8 ++++---- + build/win32/vs9/glib.vcproj | 8 ++++---- + build/win32/vs9/glib.vsprops | 28 +++++++++++++++++++++++++++- + build/win32/vs9/gmodule.vcproj | 8 ++++---- + build/win32/vs9/gobject.vcproj | 8 ++++---- + build/win32/vs9/gthread.vcproj | 8 ++++---- + 6 files changed, 47 insertions(+), 21 deletions(-) + +commit bfd60d8835149ede901b52f42d2a56c8ec6e7f77 +Author: Ryan Lortie +Date: Thu Feb 4 09:06:56 2010 -0500 + + GVariantType test case: assert all memory freed + + Make sure we've freed all TypeInfos at the end of the test. + + glib/tests/gvarianttype.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 6d6d7a8bb2c58b4cce7031e68d31978b2f83e6ff +Author: Ryan Lortie +Date: Thu Feb 4 09:04:32 2010 -0500 + + GVariantTypeInfo tweaks + + 1) always emit ending type FIXED for fixed sized items + + The serialiser needs to know if it dealing with a fixed sized item + in case the serialised data is corrupt and the item has the wrong + size. + + 2) add a macro that will be used by test cases to check that all + memory has been freed. + + glib/gvarianttypeinfo.c | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +commit cb7dfdc1943c016fe05c67ccedf653bfb7bc3891 +Author: Tor Lillqvist +Date: Thu Feb 4 15:00:15 2010 +0200 + + Use inherited properties in all configurations in gmodule, too + + build/win32/vs9/gmodule.vcproj | 9 +++------ + 1 files changed, 3 insertions(+), 6 deletions(-) + +commit 79eb03aa4f6f75c7049a3c5b11cb83fea0685b88 +Author: Tor Lillqvist +Date: Thu Feb 4 14:51:56 2010 +0200 + + Use README.txt instead of README for Windows developer friendliness + + build/win32/vs9/Makefile.am | 2 +- + build/win32/vs9/README | 29 ----------------------------- + build/win32/vs9/README.txt | 29 +++++++++++++++++++++++++++++ + 3 files changed, 30 insertions(+), 30 deletions(-) + +commit ec1944781589fdb15d61b2b251d51bd7e4617832 +Author: Tor Lillqvist +Date: Thu Feb 4 14:50:36 2010 +0200 + + Update README for VS9 build + + build/win32/vs9/README | 33 +++++++++++++++++++++++++++++---- + 1 files changed, 29 insertions(+), 4 deletions(-) + +commit 9d444f7b12fff6b7f9e6ba4a2667ab293af793eb +Author: Tor Lillqvist +Date: Thu Feb 4 14:36:23 2010 +0200 + + Refactor VS9 project files + + Factor out common parts into a vsprops file. Drop empty elements for + tools that aren't used. + + build/win32/vs9/Makefile.am | 9 +- + build/win32/vs9/gio.vcproj | 184 + +++---------------- + build/win32/vs9/glib-genmarshal.vcproj | 138 +------------- + build/win32/vs9/glib.vcproj | 194 + +++----------------- + build/win32/vs9/glib.vsprops | 196 + ++++++++++++++++++++ + build/win32/vs9/gmodule.vcproj | 173 + ++---------------- + build/win32/vs9/gobject.vcproj | 178 + ++---------------- + build/win32/vs9/gspawn-win32-helper-console.vcproj | 142 +-------------- + build/win32/vs9/gspawn-win32-helper.vcproj | 142 +-------------- + build/win32/vs9/gthread.vcproj | 150 +-------------- + build/win32/vs9/install.vcproj | 164 + +---------------- + build/win32/vs9/testglib.vcproj | 142 +-------------- + 12 files changed, 319 insertions(+), 1493 deletions(-) + +commit 241c7f476d8867d4d380c655d15a8963152a1fa0 +Author: Tor Lillqvist +Date: Thu Feb 4 14:35:04 2010 +0200 + + Don't use deprecated g_win32 API + + tests/testglib.c | 24 ------------------------ + 1 files changed, 0 insertions(+), 24 deletions(-) + +commit 3f3c163aa2ddbfb756b556b70901d2a58b1313d9 +Author: Tor Lillqvist +Date: Thu Feb 4 00:37:13 2010 +0200 + + Put a version info resource also in the gio DLL + + Also, distribute gio/gio.rc(.in). + + configure.in | 1 + + gio/Makefile.am | 18 +++++++++++++++++- + gio/gio.rc.in | 2 +- + 3 files changed, 19 insertions(+), 2 deletions(-) + +commit 154a5314be98b22cb3171721d40cb9c4e6d5f102 +Author: Tor Lillqvist +Date: Thu Feb 4 00:11:44 2010 +0200 + + Update copyright years + + glib/glib.rc.in | 2 +- + gmodule/gmodule.rc.in | 2 +- + gobject/gobject.rc.in | 2 +- + gthread/gthread.rc.in | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 33b011ce7d9415d60493595bbfe14dbc02c2d201 +Author: Krzesimir Nowak +Date: Wed Jan 13 18:40:17 2010 +0100 + + Add checks for NULL pointer in arrays. + + Fixes: Bug 599197 - array ref and unref functions crash on NULL + array. + + * garray.c: Added safety guards to all public functions, which did + not have them earlier. Now when NULL is passed to them, they will + issue a warning and return, instead of segfaulting. + + glib/garray.c | 21 +++++++++++++++++++++ + 1 files changed, 21 insertions(+), 0 deletions(-) + +commit 2b121c02efc13f4b8c6c771b33a2363a21e7757f +Author: River Tarnell +Date: Wed Feb 3 17:31:02 2010 +0100 + + properly guard the includes + + Fixes: Bug 604967 - 2.22.3 libasyncns build fails on HP-UX 11.11 + + * gio/libasyncns/asyncns.c: properly guard the includes of + sys/select.h + and sys/time.h + + gio/libasyncns/asyncns.c | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +commit e62e7227bf6d97215b697fd9a1d7b4a5addd70cb +Author: Tor Lillqvist +Date: Wed Feb 3 18:09:28 2010 +0200 + + Fix the "install" VS9 project + + Install also ghostutils.h. Don't bother mentioning any pointless + PreprocessorDefinitions for the "install" project, as all it does is + copy files. + + build/win32/vs9/install.vcproj | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit 0ac2277b490dae967b7a5083966610cffe8582e1 +Author: Ryan Lortie +Date: Tue Feb 2 23:38:20 2010 -0500 + + GVariantTypeInfo changes + + - rename 'type' in MemberInfo to 'type_info' + - add 'ending_type' field to MemberInfo + - document how to find the ending + + glib/gvarianttypeinfo.c | 23 ++++++++++++++++------- + glib/gvarianttypeinfo.h | 21 ++++++++++++++++++++- + glib/tests/gvarianttype.c | 6 +++--- + 3 files changed, 39 insertions(+), 11 deletions(-) + +commit 1de58ef708fb1972445a65e184e1579f0d0bbaaf +Author: Tor Lillqvist +Date: Tue Feb 2 21:24:45 2010 +0200 + + Link with dnsapi.lib also in 32-bit builds + + build/win32/vs9/gio.vcproj | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 57d3e4cba3a0a273d93a25356801080d710d926e +Author: Tor Lillqvist +Date: Tue Feb 2 21:23:27 2010 +0200 + + Include also testglib.vcproj in tarball + + build/win32/vs9/Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit cf0e4c33fa8a7efdc62d52cad0d7dc9135dccdf8 +Author: Philip Withnall +Date: Tue Feb 2 10:41:00 2010 +0000 + + Don't use a compiler keyword as a variable name + + Appease the MS C++ compiler by using _val instead of __value as + a variable + name in G_VALUE_COLLECT_INIT. + + Problem found by Haakon Sporsheim . + Re-closes: bgo#608602 + + gobject/gvaluecollector.h | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +commit e2bc5c21122b0a0703524a37df6cef43577a46f7 +Author: Ryan Lortie +Date: Mon Feb 1 18:30:57 2010 -0500 + + g_bit_lock: remove double variable declarations + + Remove double declaration of local static variables used for futex + emulation. + + Problem found by Haakon Sporsheim . + + glib/gbitlock.c | 3 --- + 1 files changed, 0 insertions(+), 3 deletions(-) + +commit 27a080537efdb8660c62445427b53fc29735f304 +Author: Dan Winship +Date: Mon Feb 1 18:11:43 2010 -0500 + + ghostutils: Fix a crash and add some tests + + https://bugzilla.gnome.org/show_bug.cgi?id=608743 + + glib/ghostutils.c | 13 ++++++++++++- + glib/tests/hostutils.c | 19 +++++++++++++++++++ + 2 files changed, 31 insertions(+), 1 deletions(-) + +commit 3443f47ddf520b044997d5b09b95dec692e34ae5 +Author: Ryan Lortie +Date: Sun Jan 31 14:30:08 2010 -0500 + + G{Byte,Ptr,}Array: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 3 + + docs/reference/glib/tmpl/arrays.sgml | 339 -------------- + docs/reference/glib/tmpl/arrays_byte.sgml | 211 --------- + docs/reference/glib/tmpl/arrays_pointer.sgml | 308 ------------- + glib/garray.c | 629 + ++++++++++++++++++++++++++ + 5 files changed, 632 insertions(+), 858 deletions(-) + +commit 501a2906d3208440a74bebe8736ea39b3f5b5947 +Author: Ryan Lortie +Date: Sun Jan 31 13:07:16 2010 -0500 + + GList, GSList: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 2 + + docs/reference/glib/tmpl/linked_lists_double.sgml | 467 + --------------------- + docs/reference/glib/tmpl/linked_lists_single.sgml | 394 + ----------------- + glib/glist.c | 154 +++++++ + glib/gslist.c | 113 +++++ + 5 files changed, 269 insertions(+), 861 deletions(-) + +commit c8c5c5a991b384964d0650d7fec02663dddc9035 +Author: Ryan Lortie +Date: Sun Jan 31 01:26:49 2010 -0500 + + remove trailing whitespace breaking .gitignore + + docs/reference/glib/tmpl/.gitignore | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 4bdf7d12a8ef7e027dced8d0da46986c2009180e +Author: Ryan Lortie +Date: Sun Jan 31 00:39:40 2010 -0500 + + GIOChannel: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/iochannels.sgml | 666 + ------------------------------ + glib/giochannel.c | 196 +++++++++ + glib/giounix.c | 36 ++ + glib/giowin32.c | 52 +++ + 5 files changed, 285 insertions(+), 666 deletions(-) + +commit 4353151449fedf8e018c07ae4d196652a39f0528 +Author: Ryan Lortie +Date: Sun Jan 31 00:27:28 2010 -0500 + + GTree, GNode: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 2 + + docs/reference/glib/tmpl/trees-binary.sgml | 250 -------------- + docs/reference/glib/tmpl/trees-nary.sgml | 501 + ---------------------------- + glib/gnode.c | 116 +++++++ + glib/gtree.c | 67 ++++ + 5 files changed, 185 insertions(+), 751 deletions(-) + +commit d81506a154ba387e339dfb5ff6acddac1e4866c5 +Author: Ryan Lortie +Date: Sun Jan 31 00:18:09 2010 -0500 + + GThreadPool: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/thread_pools.sgml | 202 + ---------------------------- + glib/gthreadpool.c | 50 +++++++ + 3 files changed, 51 insertions(+), 202 deletions(-) + +commit c471468ca477b44c1c14038951f720fd1ca26070 +Author: Ryan Lortie +Date: Sun Jan 31 00:16:14 2010 -0500 + + GRelation: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/relations.sgml | 204 + ------------------------------- + glib/grel.c | 162 ++++++++++++++++++++++++ + 3 files changed, 163 insertions(+), 204 deletions(-) + +commit 21a6b69f4fe85948e6e97650ccdd6e280098a790 +Author: Ryan Lortie +Date: Sun Jan 31 00:10:58 2010 -0500 + + GCache: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/caches.sgml | 162 + ---------------------------------- + glib/gcache.c | 134 ++++++++++++++++++++++++++++ + 3 files changed, 135 insertions(+), 162 deletions(-) + +commit fa7cafae5cfea880a1d6cfc82b000eecd34534e1 +Author: Ryan Lortie +Date: Sun Jan 31 00:05:48 2010 -0500 + + GChecksum: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/checksum.sgml | 145 + -------------------------------- + glib/gchecksum.c | 22 +++++ + 3 files changed, 23 insertions(+), 145 deletions(-) + +commit 5ee096636b3e603863e0935c2e7ff107b4d72f63 +Author: Ryan Lortie +Date: Sun Jan 31 00:03:33 2010 -0500 + + GCompletion: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/completion.sgml | 158 + ------------------------------ + glib/gcompletion.c | 122 +++++++++++++++++++++++ + 3 files changed, 123 insertions(+), 158 deletions(-) + +commit 75b3bd99e1a219fdd8d8f0be5a9fdddfda120ace +Author: Christian Dywan +Date: Mon Feb 1 12:37:23 2010 +0100 + + Fix typo in introduction to threads in Glib + + glib/gthread.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit f25e756ab65fef3bd793aaf234a82b4a82d19d67 +Author: Kjartan Maraas +Date: Sun Jan 31 19:57:59 2010 +0100 + + Updated Norwegian bokmÃ¥l translation + + po/nb.po | 965 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 504 insertions(+), 461 deletions(-) + +commit aa67c725e1bde15c900b65c1971771ec084cef20 +Author: Philip Withnall +Date: Sun Jan 31 16:15:32 2010 +0000 + + Fix shadowing of G_VALUE_COLLECT variables in G_VALUE_COLLECT_INIT + + Closes: bgo#608602 + + gobject/gvaluecollector.h | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +commit 6d52d34dff51676bdfa42d09c26c683304275c39 +Author: Ryan Lortie +Date: Sat Jan 30 23:34:19 2010 -0500 + + data{list,sets}, quarks: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 3 + + docs/reference/glib/tmpl/datalist.sgml | 244 ------------------ + docs/reference/glib/tmpl/datasets.sgml | 212 ---------------- + docs/reference/glib/tmpl/quarks.sgml | 124 --------- + glib/gdataset.c | 428 + +++++++++++++++++++++++++++++++- + 5 files changed, 429 insertions(+), 582 deletions(-) + +commit c7000fcfecca109a9f35c8c2e4e56d3a63cf5bd6 +Author: Ryan Lortie +Date: Sat Jan 30 23:10:34 2010 -0500 + + GPattern: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/patterns.sgml | 124 + -------------------------------- + glib/gpattern.c | 103 ++++++++++++++++++++++++++ + 3 files changed, 104 insertions(+), 124 deletions(-) + +commit 84572f81bfc2696390625e814d0200cbb26220cb +Author: Ryan Lortie +Date: Sat Jan 30 23:04:52 2010 -0500 + + String chunks: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/string_chunks.sgml | 108 + --------------------------- + glib/gstring.c | 35 +++++++++ + 3 files changed, 36 insertions(+), 108 deletions(-) + +commit 4431ac5dda5a3f130c9eb8f41445c883d960fe4c +Author: Ryan Lortie +Date: Sat Jan 30 22:58:43 2010 -0500 + + Move allocator and memchunk docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 2 + + docs/reference/glib/tmpl/allocators.sgml | 57 ----- + docs/reference/glib/tmpl/memory_chunks.sgml | 331 + ------------------------- + glib/gmem.c | 353 + +++++++++++++++++++++++++++ + glib/gtimer.c | 3 +- + 5 files changed, 357 insertions(+), 389 deletions(-) + +commit 3a161ee8f34f8c5861075a4b0d52730f7ba5bec0 +Author: Ryan Lortie +Date: Sat Jan 30 22:19:29 2010 -0500 + + GSequence: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/sequence.sgml | 432 + -------------------------------- + glib/gsequence.c | 69 +++++ + 3 files changed, 70 insertions(+), 432 deletions(-) + +commit 0ab7bb4b18908813b484514b8d2f597d962dd3c7 +Author: Ryan Lortie +Date: Sat Jan 30 22:15:35 2010 -0500 + + GShell: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/shell.sgml | 68 + ----------------------------------- + glib/gshell.c | 22 +++++++++++ + 3 files changed, 23 insertions(+), 68 deletions(-) + +commit f6482a1eaa10f6e21536776ca667980ccd9e5f77 +Author: Ryan Lortie +Date: Sat Jan 30 22:12:22 2010 -0500 + + GTimer: move docs from tmpl to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/timers.sgml | 110 + ---------------------------------- + glib/gtimer.c | 91 +++++++++++++++++++++++++++- + 3 files changed, 91 insertions(+), 111 deletions(-) + +commit d87712d3e6d3975b2c0a5fb436b8b8d3e009a3e1 +Author: Ryan Lortie +Date: Sat Jan 30 21:55:03 2010 -0500 + + Fix up gthread.c documentation + + The last incomplete commit got pushed accidentally. This finishes + it up. + + glib/gthread.c | 214 + +++++++++++++++++++++++++++++++++++++++----------------- + 1 files changed, 151 insertions(+), 63 deletions(-) + +commit 0f246e28ca6651b7b40a5a5668b45729226ca177 +Author: Ryan Lortie +Date: Sat Jan 30 20:15:25 2010 -0500 + + merge GVariantTypeInfo + + glib/Makefile.am | 2 + + glib/gvarianttypeinfo.c | 841 + +++++++++++++++++++++++++++++++++++++++++++++ + glib/gvarianttypeinfo.h | 140 ++++++++ + glib/tests/gvarianttype.c | 429 ++++++++++++++++++++++- + 4 files changed, 1392 insertions(+), 20 deletions(-) + +commit 4c58a85dd1eb89fe45b8fc5730291238c057d63e +Author: Ryan Lortie +Date: Sat Jan 30 16:00:51 2010 -0500 + + Revert accidental commit "dirt" + + This reverts commit c46bc6ba1fc8c5045c9a93b95e78e81936e2d954. + + docs/reference/glib/Makefile.am | 1 - + docs/reference/glib/glib-sections.txt | 2 + + docs/reference/glib/tmpl/glib-unused.sgml | 847 + ++--------------------------- + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/version.sgml | 68 --- + 5 files changed, 44 insertions(+), 879 deletions(-) + +commit f411e23043a5f97010ee12895f78a779df43b3dd +Author: Ryan Lortie +Date: Sat Jan 30 14:06:12 2010 -0500 + + GIO: Remove trailing "." from Since: tags in docs + + Typing "Since: 2.22." results in the creation of an + api-index-2.22..xml + file (ie: the last '.' is taken to be part of the version number). + + gio/gfileinfo.h | 4 ++-- + gio/gsocket.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit c46bc6ba1fc8c5045c9a93b95e78e81936e2d954 +Author: Ryan Lortie +Date: Sat Jan 30 13:00:01 2010 -0500 + + dirt + + docs/reference/glib/Makefile.am | 1 + + docs/reference/glib/glib-sections.txt | 2 - + docs/reference/glib/tmpl/glib-unused.sgml | 847 + +++++++++++++++++++++++++++-- + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/version.sgml | 68 +++ + 5 files changed, 879 insertions(+), 44 deletions(-) + +commit 6857767b8600a361188f75e62c086ed7d7c06d7c +Author: Ryan Lortie +Date: Sat Jan 30 12:32:09 2010 -0500 + + move threads docs to .c + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/threads.sgml | 1801 + --------------------------------- + glib/gthread.c | 1492 +++++++++++++++++++++++++++- + 3 files changed, 1475 insertions(+), 1819 deletions(-) + +commit 4234481855b8bef92d594421977a2aa130ac3ad6 +Author: Ryan Lortie +Date: Sat Jan 30 13:29:23 2010 -0500 + + GIOChannel: fill in missing docs + + docs/reference/glib/tmpl/iochannels.sgml | 22 +++++++++++----------- + 1 files changed, 11 insertions(+), 11 deletions(-) + +commit 7b6c8a56059657073f56dbc2a9d04acde2588349 +Author: Ryan Lortie +Date: Sat Jan 30 12:30:53 2010 -0500 + + g_strlcpy doc: small fixup + + prevent the from getting sucked in as part of the Returns: + + glib/gstrfuncs.c | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit 522dafe126ed814a1699238142fbc12b7f55b0b6 +Author: Ryan Lortie +Date: Sat Jan 30 12:13:50 2010 -0500 + + gbitlock: fix gtkdoc brokenness + + glib/gbitlock.c | 1 + + glib/gbitlock.h | 6 +++--- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit d51b6c471ab13348077630e8f7a3a480b3d266f0 +Author: Ryan Lortie +Date: Sat Jan 30 01:00:50 2010 -0500 + + GRand: move docs from tmpl to inline comments + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/random_numbers.sgml | 206 + -------------------------- + glib/grand.c | 64 ++++++++ + 3 files changed, 65 insertions(+), 206 deletions(-) + +commit 3de141b8d5d410a87481a2dec1bb3227464d97c8 +Author: Jorge González +Date: Sat Jan 30 12:37:00 2010 +0100 + + Updated Spanish translation + + po/es.po | 984 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 514 insertions(+), 470 deletions(-) + +commit 2f4bc34b324505cc6b196a9793b71e8455fe8540 +Author: Ryan Lortie +Date: Sat Jan 30 00:00:48 2010 -0500 + + gvarianttype: fix a trivial missing const + + glib/gvarianttype.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 1d55cfb51e03f4ba23191df4625ca62d3624652e +Author: Ryan Lortie +Date: Fri Jan 29 23:56:04 2010 -0500 + + don't #include from other public headers + + fix up some problems that were hidden by that + + glib/glib.symbols | 6 ++++-- + glib/gtestutils.c | 1 + + glib/gtestutils.h | 6 +++++- + glib/gurifuncs.c | 1 + + glib/gurifuncs.h | 2 +- + glib/gvarianttype.c | 1 + + 6 files changed, 13 insertions(+), 4 deletions(-) + +commit 71b14dedd8fa7b141e1496ba0b727996f6808579 +Author: Claude Paroz +Date: Fri Jan 29 22:52:58 2010 +0100 + + Updated French translation + + po/fr.po | 1008 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 514 insertions(+), 494 deletions(-) + +commit a4f5a3705b7df850cac0313853f8f95b5cfe24df +Author: Andre Klapper +Date: Fri Jan 29 22:33:06 2010 +0100 + + Update POTFILES.in to make l10n.gnome.org happy + + po/POTFILES.in | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +commit 6aa73f03eb14188b71b91c647442488e776a4952 +Author: Ryan Lortie +Date: Thu Jan 28 22:43:51 2010 -0500 + + improve gitignore + + .gitignore | 3 +++ + glib/.gitignore | 4 ++++ + gmodule/.gitignore | 1 + + gobject/.gitignore | 1 + + gthread/.gitignore | 1 + + po/.gitignore | 1 + + tests/.gitignore | 2 ++ + 7 files changed, 13 insertions(+), 0 deletions(-) + +commit c73d2818432956aaedb12886ea0011847b7d030e +Author: Ryan Lortie +Date: Thu Jan 28 22:36:48 2010 -0500 + + GHash: move docs from tmpl to inline comments + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/hash_tables.sgml | 489 + ----------------------------- + glib/ghash.c | 114 +++++++ + glib/ghash.h | 17 +- + 4 files changed, 130 insertions(+), 491 deletions(-) + +commit fe89b2ea293cbcd02de2cba1834e03eee0190cdc +Author: Ryan Lortie +Date: Thu Jan 28 19:12:55 2010 -0500 + + Since: markers for g_bit_*lock() + + glib/gbitlock.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 40eae351b1a95626f49ea042e5f5e9824c171c50 +Author: Ryan Lortie +Date: Thu Jan 28 18:41:19 2010 -0500 + + Bug 548967 - 1 bit mutex lock: add tests + + Add a test case for the new API. + + Always check the emulated futex(2) implementation, even on systems + with + futex support. + + configure.in | 1 + + glib/gbitlock.c | 4 ++ + gthread/Makefile.am | 3 + + gthread/tests/.gitignore | 2 + + gthread/tests/1bit-mutex.c | 127 + ++++++++++++++++++++++++++++++++++++++++++++ + gthread/tests/Makefile.am | 15 +++++ + 6 files changed, 152 insertions(+), 0 deletions(-) + +commit 669b0f2d6b5ef3a4924a1402d569c4e38e4fb41c +Author: Ryan Lortie +Date: Thu Jan 28 11:32:07 2010 -0500 + + Bug 548967 - 1 bit mutex lock + + Add support for a mutex lock that consumes only one bit of storage + inside of an integer on systems that support futexes. Futex is + emulated + (at a higher cost) on systems that don't have it -- but only in the + contended case. + + configure.in | 26 +++ + docs/reference/glib/glib-sections.txt | 5 + + glib/Makefile.am | 2 + + glib/gbitlock.c | 292 + +++++++++++++++++++++++++++++++++ + glib/gbitlock.h | 43 +++++ + glib/glib.h | 1 + + glib/glib.symbols | 8 + + glib/gthread.c | 1 + + glib/gthreadprivate.h | 1 + + 9 files changed, 379 insertions(+), 0 deletions(-) + +commit 595cad2531ac8bb4a4954337931134cb304088df +Author: Ryan Lortie +Date: Thu Jan 28 12:39:46 2010 -0500 + + glib docs: Delete and ignore empty .tmpl files + + docs/reference/glib/tmpl/.gitignore | 4 + + docs/reference/glib/tmpl/ghostutils.sgml | 64 ------------------ + docs/reference/glib/tmpl/gurifuncs.sgml | 104 + ------------------------------ + 3 files changed, 4 insertions(+), 168 deletions(-) + +commit b0a0ac51cb7e628f90b8293c098a6a1a26425301 +Author: Ryan Lortie +Date: Wed Jan 27 21:30:26 2010 -0500 + + Return NULL from g_mapped_file_get_contents() + + In the case of an empty file, return NULL instead of "". This means + that the return result of g_mapped_file_get_contents() will always be + page-aligned. + + README.in | 5 +++++ + glib/gmappedfile.c | 6 ++++-- + 2 files changed, 9 insertions(+), 2 deletions(-) + +commit 2a19bb7699c13e6d7cc5761d9285617e6b2b51f7 +Author: Matej Urbančič +Date: Wed Jan 27 13:16:13 2010 +0100 + + Updated Slovenian translation + + po/sl.po | 1315 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 682 insertions(+), 633 deletions(-) + +commit 082ff883b64ca39a197b7fccb520f0b5fa707e8a +Author: Behdad Esfahbod +Date: Tue Jan 26 16:12:20 2010 -0500 + + Improve type documentation + + docs/reference/glib/tmpl/types.sgml | 31 + +++++++++++++++++++------------ + 1 files changed, 19 insertions(+), 12 deletions(-) + +commit 7d6af08777d4762ec17bfe8a4fa6eb83ba8d6f36 +Author: Christian Dywan +Date: Tue Jan 26 20:45:40 2010 +0100 + + Add gtk-doc comments with Since tags to GMemoryOutputStream properties + + gio/gmemoryoutputstream.c | 35 +++++++++++++++++++++++++++++++++++ + 1 files changed, 35 insertions(+), 0 deletions(-) + +commit b0d2f344a68abcc14558c0363ffbe5bfdcba2a66 +Author: Javier Jardón +Date: Tue Jan 26 19:15:48 2010 +0100 + + [glib/gvarianttype] Move some documentation to header file + + Also, change G_VARIANT_TYPE(str) for G_VARIANT_TYPE(type_string) + so It's correctly documented now. + + glib/gvarianttype.c | 23 ----------------------- + glib/gvarianttype.h | 30 ++++++++++++++++++++++++++---- + 2 files changed, 26 insertions(+), 27 deletions(-) + +commit 3c66490503534eccdd9d3082684ca5c9abf89c0c +Author: Javier Jardón +Date: Tue Jan 26 19:00:41 2010 +0100 + + [glib/gvariantype] Added missing "Since: 2.24" tag + + glib/gvarianttype.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 3658727cfa0eca8c66bc2cdff46992099caf0acd +Author: Martin Pitt +Date: Tue Jan 26 11:22:31 2010 +0100 + + always use our own internal assertion message symbol + + Re-using glibc's __abort_msg symbol causes linking problems, since + the symbol + is declared private. Always use our own__glib_abort_msg symbol + to store + assertion messages, to avoid compatibility and linking problems. + + Also fix the test case to work with out of tree builds (such as "make + distcheck"), and re-enable it. + + https://bugzilla.gnome.org/show_bug.cgi?id=594872 + + configure.in | 14 -------------- + glib/gtestutils.c | 26 +++++++++----------------- + tests/Makefile.am | 2 +- + tests/run-assert-msg-test.sh | 17 +++++------------ + 4 files changed, 15 insertions(+), 44 deletions(-) + +commit e84a3f824855419c361ebc9f2e04768f96c6f3b9 +Author: Matthias Clasen +Date: Mon Jan 25 14:16:09 2010 -0500 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 079c980ecabf42ee9d0a061f9a11b078c6394225 +Author: Matthias Clasen +Date: Mon Jan 25 14:14:14 2010 -0500 + + 2.23.2 + + po/am.po | 42 +- + po/ar.po | 45 ++- + po/as.po | 45 ++- + po/ast.po | 1355 + ++++++++++++++++++++++++++--------------------------- + po/az.po | 42 +- + po/be.po | 42 +- + po/be@latin.po | 45 ++- + po/bg.po | 921 ++++++++++++++++++------------------ + po/bn.po | 1256 + +++++++++++++++++++++++-------------------------- + po/bn_IN.po | 45 ++- + po/bs.po | 42 +- + po/ca.po | 45 ++- + po/ca@valencia.po | 45 ++- + po/cs.po | 45 ++- + po/cy.po | 42 +- + po/da.po | 45 ++- + po/de.po | 45 ++- + po/dz.po | 42 +- + po/el.po | 45 ++- + po/en@shaw.po | 45 ++- + po/en_CA.po | 45 ++- + po/en_GB.po | 45 ++- + po/eo.po | 42 +- + po/es.po | 929 ++++++++++++++++++------------------ + po/et.po | 484 +++++++++++++++++++- + po/eu.po | 996 ++++++++++++++++++++------------------- + po/fa.po | 42 +- + po/fi.po | 45 ++- + po/fr.po | 45 ++- + po/ga.po | 42 +- + po/gl.po | 45 ++- + po/gu.po | 45 ++- + po/he.po | 45 ++- + po/hi.po | 45 ++- + po/hr.po | 42 +- + po/hu.po | 45 ++- + po/hy.po | 42 +- + po/id.po | 42 +- + po/is.po | 42 +- + po/it.po | 45 ++- + po/ja.po | 45 ++- + po/ka.po | 42 +- + po/kn.po | 45 ++- + po/ko.po | 45 ++- + po/ku.po | 42 +- + po/lt.po | 45 ++- + po/lv.po | 42 +- + po/mai.po | 45 ++- + po/mg.po | 42 +- + po/mk.po | 45 ++- + po/ml.po | 45 ++- + po/mn.po | 42 +- + po/mr.po | 45 ++- + po/ms.po | 42 +- + po/nb.po | 925 ++++++++++++++++++------------------ + po/ne.po | 42 +- + po/nl.po | 45 ++- + po/nn.po | 45 ++- + po/oc.po | 42 +- + po/or.po | 45 ++- + po/pa.po | 45 ++- + po/pl.po | 45 ++- + po/ps.po | 42 +- + po/pt.po | 45 ++- + po/pt_BR.po | 45 ++- + po/ro.po | 45 ++- + po/ru.po | 45 ++- + po/rw.po | 42 +- + po/si.po | 42 +- + po/sk.po | 42 +- + po/sl.po | 45 ++- + po/sq.po | 47 ++- + po/sr.po | 45 ++- + po/sr@ije.po | 42 +- + po/sr@latin.po | 45 ++- + po/sv.po | 1323 + ++++++++++++++++++++++++++-------------------------- + po/ta.po | 45 ++- + po/te.po | 45 ++- + po/th.po | 45 ++- + po/tl.po | 42 +- + po/tr.po | 45 ++- + po/tt.po | 42 +- + po/uk.po | 939 +++++++++++++++++++------------------ + po/vi.po | 45 ++- + po/wa.po | 42 +- + po/xh.po | 42 +- + po/yi.po | 42 +- + po/zh_CN.po | 45 ++- + po/zh_HK.po | 45 ++- + po/zh_TW.po | 45 ++- + 90 files changed, 7008 insertions(+), 5674 deletions(-) + +commit 975aea7bce39a2909607c6c40c2c0c945169b0c6 +Author: Matthias Clasen +Date: Mon Jan 25 14:13:48 2010 -0500 + + Disable yet another failing test that was recently added... + + tests/Makefile.am | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit f13804f68e37c597533644e671d38229e80b917a +Author: Matthias Clasen +Date: Mon Jan 25 12:46:35 2010 -0500 + + Minor docs update + + docs/reference/gio/gio-sections.txt | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit bc4f3904f27652b844f9786ba2b243a5ea3368b5 +Author: Matthias Clasen +Date: Mon Jan 25 12:43:10 2010 -0500 + + Another few failing tests disabled + + gio/tests/filter-streams.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 305c9c6de5436b35fc3929d4c4ff3f29c00d8678 +Author: Matthias Clasen +Date: Mon Jan 25 12:29:09 2010 -0500 + + Disable a failing test, tsk, tsk. + + glib/tests/array-test.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 81f186d1e55621622fc3a29f43522a8d5494edde +Author: Matthias Clasen +Date: Mon Jan 25 12:00:06 2010 -0500 + + Mention GVariant + + NEWS | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit e0d1124bd9bc516daaa84c94fee39decf9acc1d8 +Author: Matthias Clasen +Date: Mon Jan 25 11:57:47 2010 -0500 + + Updates + + NEWS | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 53 insertions(+), 0 deletions(-) + +commit b4c0b10658bb77f14005a117d5abdb620fec4068 +Author: Ryan Lortie +Date: Mon Jan 25 11:31:56 2010 -0500 + + add testcase for GVariantType + + glib/tests/.gitignore | 1 + + glib/tests/Makefile.am | 3 + + glib/tests/gvarianttype.c | 650 + +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 654 insertions(+), 0 deletions(-) + +commit 0ccb288da103890dcf89ceda75fb8b488077a1de +Author: Ryan Lortie +Date: Mon Jan 25 11:26:27 2010 -0500 + + merge GVariantType + + GVariantType is the type system for GVariant + + docs/reference/glib/glib-docs.sgml | 1 + + docs/reference/glib/glib-sections.txt | 68 ++ + glib/Makefile.am | 2 + + glib/glib.h | 1 + + glib/glib.symbols | 34 + + glib/gvarianttype.c | 1495 + +++++++++++++++++++++++++++++++++ + glib/gvarianttype.h | 282 +++++++ + 7 files changed, 1883 insertions(+), 0 deletions(-) + +commit 11d4e59712b5a19c9847facf6da79946c9bd24aa +Author: Benjamin Otte +Date: Wed Jan 20 21:06:30 2010 +0100 + + Move the boxed private type data to TypeNode + + This way we don't need to keep a custom array that we bsearch on (and + that isn't threadsafe) but can use the gtype.c machinery that is + threadsafe. And fast, too! + + https://bugzilla.gnome.org/show_bug.cgi?id=554887 + + gobject/Makefile.am | 5 ++- + gobject/gboxed.c | 72 + +++------------------------------------------- + gobject/gtype-private.h | 41 ++++++++++++++++++++++++++ + gobject/gtype.c | 45 +++++++++++++++++++++++++++++ + 4 files changed, 95 insertions(+), 68 deletions(-) + +commit ac666d2ae35b86c0d92ae70a0fb77b9df91035d1 +Author: Benjamin Otte +Date: Wed Jan 20 20:02:24 2010 +0100 + + Put calls to registered copy/free functions into separate functions + + This eases cleaning up these functions. + + One optimization in value_set_internal() was lost in the process. It + shouldn't cause too many issues when all is said and done. + + https://bugzilla.gnome.org/show_bug.cgi?id=554887 + + gobject/gboxed.c | 97 + +++++++++++++++++------------------------------------ + 1 files changed, 31 insertions(+), 66 deletions(-) + +commit 4ecf8655b315f9da3d108356c8f39394300deae3 +Author: Alexander Shopov +Date: Mon Jan 25 11:58:18 2010 +0200 + + Updated Bulgarian translation + + po/bg.po | 974 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 490 insertions(+), 484 deletions(-) + +commit d819c8e486c9aaa2602d93fdd5cd1743d5a46624 +Author: Matthias Clasen +Date: Sun Jan 24 20:50:51 2010 -0500 + + Typo fixes + + gio/gsimpleasyncresult.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit cd59feff775e3cf9b15190dd6d75c4e6b98336e8 +Author: Jamil Ahmed +Date: Sun Jan 24 22:54:12 2010 +0600 + + Updated Bengali translation + + po/bn.po | 1295 + +++++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 691 insertions(+), 604 deletions(-) + +commit e71dcb204e3be3c0129c0782f3b5420be47fb2ef +Author: Ryan Lortie +Date: Sat Jan 23 01:07:46 2010 -0500 + + gio: .gitignore gio-querymodules + + gio/.gitignore | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit c8fc3112f910b544ace0e1cb14d47555b38be6d8 +Author: Ryan Lortie +Date: Fri Jan 22 20:18:58 2010 -0500 + + Bug 448888 - don't init g_slice for always-malloc + + glib/gslice.c | 16 +++++++++++++--- + 1 files changed, 13 insertions(+), 3 deletions(-) + +commit 7693b0af445645f09e55ed7cebe0051c3d1fdd8d +Author: Alberto Garcia +Date: Wed Jan 20 18:53:08 2010 +0100 + + [tests] Remove C++ style comments + + It makes the IBM XL C Compiler (the 'native' non-free compiler + on the AIX 5.3 and 6.1 platform) stop compiling with syntax error. + + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=581300 + + Signed-off-by: Javier Jardón + + gobject/tests/threadtests.c | 8 ++++---- + tests/slice-concurrent.c | 2 +- + tests/slice-test.c | 2 +- + 3 files changed, 6 insertions(+), 6 deletions(-) + +commit 6c3551fedb7bfde716fa00cfcbba00ca987c2a79 +Author: Dan Winship +Date: Mon Jan 18 09:46:19 2010 -0500 + + [configure] More -lresolv-checking-fixing + + https://bugzilla.gnome.org/show_bug.cgi?id=586150 + + configure.in | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + +commit 914120b9701650ccf7bede1907b69b521ca43236 +Author: Benjamin Otte +Date: Mon Jan 18 14:03:16 2010 +0100 + + Ensure values are memset to 0 when calling G_VALUE_COLLECT_INIT() + + The reason we need to enforce this is that the GTypeValueTable + documentation explicitly states that memory is memset to 0 when the + value_init function is called. + + https://bugzilla.gnome.org/show_bug.cgi?id=603590 + + gobject/gobject.c | 2 +- + gobject/gsignal.c | 4 ++-- + gobject/gvaluecollector.h | 3 +-- + 3 files changed, 4 insertions(+), 5 deletions(-) + +commit 956b3b507d03b6d10f8bef34b3775a409c5ba9ee +Author: Dan Winship +Date: Wed Jan 13 11:24:28 2010 -0500 + + [configure] Fix res_query check for OS X + + https://bugzilla.gnome.org/show_bug.cgi?id=586150 + + configure.in | 36 +++++++++++++++++++----------------- + gio-2.0.pc.in | 2 +- + 2 files changed, 20 insertions(+), 18 deletions(-) + +commit a6ab4b78725f6376c04f7fb2eb6cbf9a56387253 +Author: Javier Jardón +Date: Tue Nov 17 21:15:15 2009 +0100 + + Upgrade to version 0.8 of libasyncns + + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=602240 + + gio/libasyncns/asyncns.c | 94 + +++++++++++++++++++++++++++----------------- + gio/libasyncns/g-asyncns.h | 16 +------ + 2 files changed, 61 insertions(+), 49 deletions(-) + +commit fe23567c436612e7a167c1681d6cb69392769fb7 +Author: Inaki Larranaga Murgoitio +Date: Wed Jan 13 17:29:39 2010 +0100 + + Updated Basque language + + po/eu.po | 1044 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 512 insertions(+), 532 deletions(-) + +commit b577c207a5279667801c44d8f1d9469ca431478b +Author: Kjartan Maraas +Date: Wed Jan 13 16:20:56 2010 +0100 + + Updated Norwegian bokmÃ¥l translation + + po/nb.po | 937 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 477 insertions(+), 460 deletions(-) + +commit 7448eb71c3ac85a08c8f0fceaf9747e6298ae5c9 +Author: Sven Herzberg +Date: Wed Jan 13 14:47:58 2010 +0100 + + properly abort instead of looping infinitely + + Fixes: Bug 568760 - nautilus freezes due to a bug in garray.c:322 + + * glib/garray.c: increase the size of potential return values by + using an unsigned result; properly check if we still handle + valid size + proposals, return the original request if there's no usable + size left + * tests/array-test.c: reproduce the error condition of the bug report + + glib/garray.c | 18 ++++++++++-------- + glib/tests/array-test.c | 24 ++++++++++++++++++++++++ + 2 files changed, 34 insertions(+), 8 deletions(-) + +commit 820181a5de46da070d7792128fe148b51fc79a20 +Author: Alexander Larsson +Date: Wed Jan 13 10:25:52 2010 +0100 + + Fix docs in previous commit + + gobject/gvaluecollector.h | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 3c5e1fd903ce18efe51672074e01d1637c4bc0b2 +Author: Alexander Larsson +Date: Wed Jan 13 10:24:09 2010 +0100 + + Remove additional thread support in performance test + + We're always enabling threads now so this is not needed. + + tests/gobject/performance.c | 6 ------ + tests/gobject/run-performance.sh | 3 +-- + 2 files changed, 1 insertions(+), 8 deletions(-) + +commit 40bf3aa5d2fd9d2aa6244ce8023ad1eed3bf0383 +Author: Edward Hervey +Date: Wed Dec 2 11:50:02 2009 +0100 + + gobject: Use new G_VALUE_COLLECT_INIT variant + + Makes g_object_new_valist 20% to 30% faster (against 2321e5a). + + Profiled against the pan newsreader which uses a variant of simple + and complex object creation. + + https://bugzilla.gnome.org/show_bug.cgi?id=603590 + + gobject/gobject.c | 10 ++++------ + 1 files changed, 4 insertions(+), 6 deletions(-) + +commit 0f25115ffc887110993f6947f9907a85374933d3 +Author: Edward Hervey +Date: Wed Dec 2 11:49:49 2009 +0100 + + gsignal: Use new G_VALUE_COLLECT_INIT variant + + Makes g_signal_emit_valist from 15% to 20% faster. + + Results reported from profiling the pan newsreader which uses + a variant + of simple and complex signal emissions (i.e no args or various args) + + https://bugzilla.gnome.org/show_bug.cgi?id=603590 + + gobject/gsignal.c | 20 ++++++++------------ + 1 files changed, 8 insertions(+), 12 deletions(-) + +commit 546fc0ca331c8d1b3393fe218a697b6a1a1c1072 +Author: Edward Hervey +Date: Wed Dec 2 11:48:18 2009 +0100 + + gvaluecollector: Add variant of G_VALUE_COLLECT for most used cases. + + Most callers of G_VALUE_COLLECT previously had to initialize the + GValue + and then G_VALUE_COLLECT would still go through a cleanup phase. + + The new variant allows passing a unitialized GValue along with a GType + and speedup the initialization/collection process. + + https://bugzilla.gnome.org/show_bug.cgi?id=603590 + + gobject/gvaluecollector.h | 44 + ++++++++++++++++++++++++++++++++++++-------- + 1 files changed, 36 insertions(+), 8 deletions(-) + +commit 3bb404f13329dbd6c67f777e5a6d9228716ab440 +Author: Alexander Larsson +Date: Tue Jan 12 21:55:15 2010 +0100 + + Mention thread changes in NEWS + + README.in | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +commit 94b8613b5ffefadb5c82424bd1f3083ff11fa811 +Author: Alexander Larsson +Date: Tue Jan 12 21:28:23 2010 +0100 + + Use unconditional thread calls in gio and gobject + + If threads are available we always enable threads in gobject, which + means all gio/gobject code can enable the unconditional thread calls. + + This is a minor optimization since we avoid a bunch of unnecessary + is-threads-enabled checks. + + https://bugzilla.gnome.org/show_bug.cgi?id=606775 + + configure.in | 1 + + gio/Makefile.am | 5 +++++ + gobject/Makefile.am | 5 +++++ + 3 files changed, 11 insertions(+), 0 deletions(-) + +commit de5c708e0b3d257388d3a5d09c80806d27069c88 +Author: Alexander Larsson +Date: Tue Jan 12 21:26:52 2010 +0100 + + Make thread calls unconditional if G_THREADS_MANDATORY is set + + Since gobject now initialized threads unconditionally if threads are + available it makes no sense to have each thread operation + conditionally check if threads are enables, so allow this to be + avoided. + + https://bugzilla.gnome.org/show_bug.cgi?id=606775 + + glib/gthread.h | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit fa2bced1f30f93443ef43ce8b5b1e437cd07168c +Author: Alexander Larsson +Date: Tue Jan 12 21:22:45 2010 +0100 + + Enable threads in g_type_init() + + This means threads will be supported for all gobject + libraries/applications + and initialized early enough to not cause any problems. + + This solves the problem of libraries needing threadsafety. Previosly + they just called g_threads_init() anyway, which often works but + sometimes + breaks in unexpected ways. + + See this thread for more details: + http://mail.gnome.org/archives/gtk-devel-list/2009-November/msg00208.html + + https://bugzilla.gnome.org/show_bug.cgi?id=606775 + + docs/reference/glib/tmpl/threads.sgml | 8 ++++++++ + gobject-2.0-uninstalled.pc.in | 2 +- + gobject-2.0.pc.in | 2 +- + gobject/Makefile.am | 2 +- + gobject/gtype.c | 9 ++++++++- + 5 files changed, 19 insertions(+), 4 deletions(-) + +commit 0df3ca8f9bbb624b219ecdb25d3fe8aa4a51d953 +Author: Alexander Larsson +Date: Tue Jan 12 21:16:59 2010 +0100 + + Relax g_thread_init() requirements + + We now allow g_thread_init(NULL) to be called after other glib calls + (with + some minor limitations). This is mainly a documentation change as this + really was already possible. + + We also allow g_thread_init() to be called multiple times. Only the + first call actually initializes the threading system, further calls + are ignored (but print a warning if the argument is not NULL). + + https://bugzilla.gnome.org/show_bug.cgi?id=606775 + + docs/reference/glib/tmpl/threads.sgml | 55 + +++++++++++--------------------- + gthread/gthread-impl.c | 7 +++- + 2 files changed, 25 insertions(+), 37 deletions(-) + +commit 74ad124cfba3278c385d177a527f19574fda9670 +Author: Alexander Larsson +Date: Tue Jan 12 13:09:10 2010 +0100 + + Implement lazy loading of fam plugin + + gio/fam/Makefile.am | 15 ++++++++++++++- + gio/fam/fam-module.c | 11 +++++++++++ + 2 files changed, 25 insertions(+), 1 deletions(-) + +commit 57b771235e8e548ba3bb68a49ae4f016072ee89f +Author: Alexander Larsson +Date: Tue Jan 12 13:11:22 2010 +0100 + + Add gio-querymodule program + + This can be used to update the giomodule.cache file in directories + with + giomodules in order to support lazy module loading. + + gio/Makefile.am | 10 ++++ + gio/gio-querymodules.c | 133 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 143 insertions(+), 0 deletions(-) + +commit 682b3da99b1766b3dda0ee5978040e11108e063c +Author: Alexander Larsson +Date: Tue Jan 12 11:57:17 2010 +0100 + + Use the new lazy loading of modules for gio modules + + gio/giomodule.c | 30 +++++++++++------------------- + 1 files changed, 11 insertions(+), 19 deletions(-) + +commit 488bede191081f035f24f7c3e55a86bc8ee2d7ae +Author: Alexander Larsson +Date: Tue Jan 12 11:36:12 2010 +0100 + + Add support for lazy loading of giomodules + + Adds an optional query method to giomodules which should return all + possible extension points the module may implement. + + Then we add a new call g_io_modules_scan_all_in_directory() similar to + g_io_modules_load_all_in_directory() that doesn't return all loaded + modules, thus allowing lazy loading. + + In g_io_modules_scan_all_in_directory we look for an optional + giomodule.cache file and use the information in that to avoid + loading modules until they are needed for an extension point. + + gio/gio.symbols | 1 + + gio/giomodule.c | 211 + +++++++++++++++++++++++++++++++++++++++++++++++++------ + gio/giomodule.h | 31 ++++++++ + 3 files changed, 222 insertions(+), 21 deletions(-) + +commit 6aa1aef5562b2db9777ad17183427dbbb88599b2 +Author: Ignacio Casal Quinteiro +Date: Tue Jan 12 12:54:49 2010 +0100 + + Flush gcharsetconverter when needed. + + This patch fixes bug #605686. + + gio/gcharsetconverter.c | 53 + +++++++++++++++++++++++++++------------------- + 1 files changed, 31 insertions(+), 22 deletions(-) + +commit f4ccd96ea1a137eb0c533f177ff87290a84ee0d5 +Author: Kamal Mostafa +Date: Fri Jan 1 20:36:28 2010 -0800 + + g_object_new(): skip varargs for simple calls + + g_object_new() avoids useless varargs processing for simple calls + with no + properties. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=605883 + + gobject/gobject.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit 8c293b0ae0f3d7a404b3249872a1591313467b4f +Author: Daniel Nylander +Date: Sat Jan 9 16:43:35 2010 +0100 + + Updated Swedish translation + + po/sv.po | 1354 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 691 insertions(+), 663 deletions(-) + +commit e61fed47b39265056dc2f9f5c3c5a6fc14bc0bf2 +Author: Jorge González +Date: Thu Jan 7 20:26:48 2010 +0100 + + Updated Spanish translation + + po/es.po | 950 + +++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 483 insertions(+), 467 deletions(-) + +commit 37716bd00a7911de545ebca3dc7a248503eaf46e +Author: Hiroyuki Ikezoe +Date: Thu Jan 7 19:33:39 2010 +0900 + + Use GCC atomic builtin operations. + + Fix for bug #531902. + + configure.in | 211 + ++++++++++++++++++++++++++++------------------------ + glib/Makefile.am | 8 ++- + glib/gatomic-gcc.c | 92 +++++++++++++++++++++++ + 3 files changed, 214 insertions(+), 97 deletions(-) + +commit 7211f7f8eb6845b010f45dd9084f67f80af40412 +Author: Stefan Kost +Date: Thu Jan 7 10:47:20 2010 +0200 + + docs: switch to xi:inbclude for the content to save some more seconds + + docs/reference/gobject/gobject-docs.sgml | 77 +++------- + docs/reference/gobject/tut_gobject.xml | 3 + + docs/reference/gobject/tut_gsignal.xml | 3 + + docs/reference/gobject/tut_gtype.xml | 5 +- + docs/reference/gobject/tut_howto.xml | 21 ++- + docs/reference/gobject/tut_intro.xml | 3 + + docs/reference/gobject/tut_tools.xml | 221 + +++++++++++++++-------------- + 7 files changed, 163 insertions(+), 170 deletions(-) + +commit 00db5238d9cdd1034f39749cac2d7b18df4b231c +Author: Stefan Kost +Date: Thu Jan 7 11:31:24 2010 +0200 + + docs: switch to xi:inbclude for the content to save some more seconds + + docs/reference/glib/building.sgml | 4 + + docs/reference/glib/changes.sgml | 4 + + docs/reference/glib/compiling.sgml | 4 + + docs/reference/glib/cross.sgml | 4 + + docs/reference/glib/glib-docs.sgml | 231 + +++++++++++---------------------- + docs/reference/glib/regex-syntax.sgml | 4 + + docs/reference/glib/resources.sgml | 4 + + docs/reference/glib/running.sgml | 4 + + 8 files changed, 103 insertions(+), 156 deletions(-) + +commit d01e2527ce59b5daac2b63a6ac0074cbec8bebe5 +Author: Stefan Kost +Date: Thu Jan 7 10:22:14 2010 +0200 + + docs: use xi:include to use the generated indexes if available. + + This works transparantly for people with new enough gtk-doc + (>=1.11) and + significantly improves the build time. + + docs/reference/gio/gio-docs.xml | 19 ++++++--- + docs/reference/glib/glib-docs.sgml | 62 + ++++++++++++++++++----------- + docs/reference/gobject/gobject-docs.sgml | 54 + ++++++++++++++++---------- + 3 files changed, 84 insertions(+), 51 deletions(-) + +commit 4c55b45162a3a76ca6c1d1c450ea667eeb7bae44 +Author: Haakon Sporsheim +Date: Thu Jan 7 10:12:13 2010 +0200 + + Don't do pointer arithmetics on void* + + For instance MSVC doesn't like that. + + Signed-off-by: Tor Lillqvist + + gobject/gatomicarray.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 759fbac7b765e3ef3df4e64e534c99d45526bdd3 +Author: Matthias Clasen +Date: Wed Jan 6 17:37:11 2010 -0500 + + Add properties to GMemoryOutputStream + + This helps bindings. Patch by Krzysztof Kosiński. See bug 605733. + + gio/gmemoryoutputstream.c | 308 + +++++++++++++++++++++++++++----------- + gio/gmemoryoutputstream.h | 6 +- + gio/tests/memory-output-stream.c | 37 +++++ + 3 files changed, 260 insertions(+), 91 deletions(-) + +commit f2d8f6287d6e3fcb9e58402c2051d557f7e41632 +Author: Matthias Clasen +Date: Wed Jan 6 13:23:48 2010 -0500 + + Fix the filename roundtrip check + + The check was always failing because the code was comparing + the wrong strings. Reported in bug 605977. + + gio/glocalfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit baf20e09842a97c2d7925dff5ff9c6d35e36b27d +Author: Ryan Lortie +Date: Tue Jan 5 18:49:23 2010 -0500 + + GUnixFDMessage: fix a small typo in an extra check + + In the deserialise function, GUnixFDMessage was comparing 'level' to + both SOL_SOCKET and SCM_RIGHTS. It is correct to compare 'type' to + SCM_RIGHTS. The code passed tests only because: + + 1) it's a "should always be OK" double-check + + 2) SOL_SOCKET and SCM_RIGHTS, by chance, both have the value '1' on + Linux systems. + + gio/gunixfdmessage.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit b00c6d7fb5798b4e528554e1221a553ab95506ed +Author: Matthias Clasen +Date: Tue Jan 5 18:18:55 2010 -0500 + + Fix a memleak + + An early exit in expand_application_parameters forgot to free + a GString. Reported by Steve Grubb. + + gio/gdesktopappinfo.c | 14 ++++++++------ + 1 files changed, 8 insertions(+), 6 deletions(-) + +commit 6cee86a3efc98333282218f8eb1e0149a7cd703d +Author: Matthias Clasen +Date: Tue Jan 5 18:16:37 2010 -0500 + + Fix an off-by-one error + + Reported by Steve Grubb. + + gio/gcontenttype.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 95889d19275fd0f8f47f6c7f0e5b37861aa28497 +Author: Maxim V. Dziumanenko +Date: Tue Jan 5 16:53:01 2010 +0200 + + Update Ukrainian translation + + po/uk.po | 948 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 474 insertions(+), 474 deletions(-) + +commit e8ccfd1bb2e17037d54440290b718bd19567a2e4 +Author: Haakon Sporsheim +Date: Tue Jan 5 11:28:43 2010 +0200 + + Avoid compilation warning from MSVC + + Signed-off-by: Tor Lillqvist + + glib/gutils.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit d13c552dafe93e819e9c17bb68f46c33c9e97b10 +Author: Piotr Eljasiak +Date: Tue Jan 5 00:48:02 2010 +0100 + + Fix a typo in the docs + + glib/gmarkup.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c4600066a60e4ade006eeba196e560232f26116a +Author: Xandru Armesto Fernandez +Date: Mon Jan 4 22:10:47 2010 +0100 + + Added asturian language + + po/LINGUAS | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 4655e85081f1fe62a0dd01342dab2109d2979b16 +Author: Xandru Armesto Fernandez +Date: Mon Jan 4 22:10:29 2010 +0100 + + Updated asturian translations + + po/ast.po | 2084 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 2084 insertions(+), 0 deletions(-) + +commit 3f5fb1ee9c2e3c09bc21913f02c1797550acdcea +Author: Javier Jardón +Date: Sun Jan 3 23:34:26 2010 +0100 + + [docs] Fix @title usage in "Enumeration and flags types" section + + gobject/genums.c | 6 ++---- + 1 files changed, 2 insertions(+), 4 deletions(-) + +commit a91514ba1946ee048d9b2ddb049bc7dff5998940 +Author: Matthias Clasen +Date: Sat Jan 2 19:50:55 2010 -0500 + + Document that various functions ref GSimpleAsyncResult + + Patch by Will Thompson, see bug 602417. + + gio/gsimpleasyncresult.c | 220 + ++++++++++++++++++++++++---------------------- + 1 files changed, 113 insertions(+), 107 deletions(-) + +commit f58fa6934315bc83d57a6d63ae1f9ca08dd9731b +Author: Matthias Clasen +Date: Sat Jan 2 19:44:26 2010 -0500 + + Document that _finish() must be called at most once. + + The patch was provided by Will Thompson in bug 602417. + + gio/gasyncresult.c | 22 +++++++++++----------- + 1 files changed, 11 insertions(+), 11 deletions(-) + +commit 74af99b860db66d6e32ed12c54016246e60be99a +Author: Matthias Clasen +Date: Sat Jan 2 19:35:08 2010 -0500 + + Fix a typo + + ...and some whitespace fixes. Pointed out by Will Thompson in + bug 602417. + + gio/gasyncresult.c | 69 + ++++++++++++++++++++++++++------------------------- + 1 files changed, 35 insertions(+), 34 deletions(-) + +commit 0542e6dbf9b817a3ad4f0dbf4b85177536e11277 +Author: Pablo Castellano +Date: Sun Jan 3 01:23:53 2010 +0100 + + Updated .gitignore files + + glib/.gitignore | 1 + + gobject/.gitignore | 1 + + 2 files changed, 2 insertions(+), 0 deletions(-) + +commit ab799115defeab7771f3cb5cd0c88eba0d73558a +Author: Matthias Clasen +Date: Sat Jan 2 19:17:37 2010 -0500 + + Don't return anything from a void function + + Sun C doesn't like it. Reported in bug 604824. + + gio/gconverter.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 05af612943b4f34b63e4bfcb7dc7bbab6725417b +Author: Ivar Smolin +Date: Sat Jan 2 22:42:01 2010 +0200 + + Updating Estonian translation + + po/et.po | 490 + ++------------------------------------------------------------ + 1 files changed, 15 insertions(+), 475 deletions(-) + +commit 32f79f55ef287bf505ff434f13d79d89f3630bb2 +Author: Paolo Borelli +Date: Thu Dec 31 12:42:41 2009 +0100 + + Bug 604457 - gutf8inputstream.c: increasing unknown size pointer + + gio/gutf8inputstream.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 73ca6f70199353c22bf2d6aa99d5cd1eaea76702 +Author: Javier Jardón +Date: Mon Dec 28 02:04:01 2009 +0100 + + [docs] Fix 'Deprecated' tag on some win32 functions + + Fix g_win32_get_package_installation_directory() and + g_win32_get_package_installation_subdirectory_utf8() + + glib/gwin32.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 85e00d3a9433a5f83f9897c832fa00e4e0540e2c +Author: Javier Jardón +Date: Thu Dec 24 05:05:21 2009 +0100 + + [docs] Fix 'Deprecated' tag in g_date_set_time() + + glib/gdate.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit da66897950431870390f8dc3f798e24f23ffb8c8 +Author: Martin Pitt +Date: Tue Dec 22 11:09:20 2009 +0100 + + Support storing assertion messages into core dump + + Crash interception/debugging systems like Apport or ABRT capture + core dumps for + later crash analysis. However, if a program exits with an assertion + failure, + the core dump is not useful since the assertion message is only + printed to + stderr. + + glibc recently got a patch which stores the message of assert() + into the + __abort_msg global variable. + (http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=48dcd0ba) + That works fine for programs which actually use the standard C + assert() macro. + + This patch adds the same functionality for glib's assertion tests. If + we are + building against a glibc which already has __abort_msg (2.11 and + later, or + backported above git commit), use that, otherwise put it into our + own field + __glib_assert_msg. + + Usage: + + $ cat test.c + #include + + int main() { + g_assert(1 < 0); + return 0; + } + + $ ./test + **ERROR:test.c:5:main: assertion failed: (1 < 0) + Aborted (Core dumped) + + $ gdb --batch --ex 'print (char*) __abort_msg' ./test core + [...] + $1 = 0x93bf028 "ERROR:test.c:5:main: assertion failed: (1 < 0)" + + https://bugzilla.gnome.org/show_bug.cgi?id=594872 + + configure.in | 14 ++++++++++++ + glib/gtestutils.c | 23 ++++++++++++++++++++ + tests/.gitignore | 1 + + tests/Makefile.am | 6 +++- + tests/assert-msg-test.c | 8 +++++++ + tests/run-assert-msg-test.sh | 48 + ++++++++++++++++++++++++++++++++++++++++++ + 6 files changed, 98 insertions(+), 2 deletions(-) + +commit e9ab9eaff66b62c9653b90cca2eaf1d142f716a1 +Author: Theppitak Karoonboonyanan +Date: Tue Dec 22 23:39:21 2009 +0700 + + Updated Thai translation. + + po/th.po | 35 +++++++++++++++-------------------- + 1 files changed, 15 insertions(+), 20 deletions(-) + +commit 8202728f067c5d418f4fcc5172a990aa1c68312b +Author: Tor Lillqvist +Date: Tue Dec 22 00:46:12 2009 +0200 + + Install gio-unix-2.0.pc only on Unix + + The gio-unix-2.0 headers are installed only on Unix anyway. + + Makefile.am | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +commit dba6cef3c9c29314c20a122647c23b12329025dc +Author: Javier Jardón +Date: Mon Dec 21 23:04:43 2009 +0100 + + [docs] Fix G_DEFINE_INTERFACE "Since" tag + + This symbol is available since Glib 2.24, not 2.20. + + gobject/gtype.h | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit e7488ca85721b05181f699f4e8b12098077ce210 +Author: Behdad Esfahbod +Date: Fri Jun 5 23:28:17 2009 -0400 + + [gobject] Grow gvalue transform array exponentially + + Bug 589176 - Grow gvalue transform array exponentially + + Reduces about 180 realloc calls during g_type_init(). + + gobject/gvalue.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 88261680f518c3c701154504011f778866d6dc2a +Author: Matthias Clasen +Date: Mon Dec 21 10:56:03 2009 -0500 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit d7bdc48c2618cbc6b99c161592fd59c92d28d1c8 +Author: Matthias Clasen +Date: Mon Dec 21 10:54:11 2009 -0500 + + 2.23.1 + + po/am.po | 80 +++--- + po/ar.po | 80 +++--- + po/as.po | 80 +++--- + po/az.po | 80 +++--- + po/be.po | 80 +++--- + po/be@latin.po | 80 +++--- + po/bg.po | 80 +++--- + po/bn.po | 80 +++--- + po/bn_IN.po | 80 +++--- + po/bs.po | 80 +++--- + po/ca.po | 80 +++--- + po/ca@valencia.po | 80 +++--- + po/cs.po | 80 +++--- + po/cy.po | 917 + ++++++++++++++++++++++++++-------------------------- + po/da.po | 80 +++--- + po/de.po | 80 +++--- + po/dz.po | 80 +++--- + po/el.po | 80 +++--- + po/en@shaw.po | 80 +++--- + po/en_CA.po | 80 +++--- + po/en_GB.po | 80 +++--- + po/eo.po | 80 +++--- + po/es.po | 80 +++--- + po/et.po | 465 ++++++++++++++++++++++++++- + po/eu.po | 80 +++--- + po/fa.po | 80 +++--- + po/fi.po | 80 +++--- + po/fr.po | 80 +++--- + po/ga.po | 80 +++--- + po/gl.po | 80 +++--- + po/gu.po | 80 +++--- + po/he.po | 930 + ++++++++++++++++++++++++++--------------------------- + po/hi.po | 80 +++--- + po/hr.po | 80 +++--- + po/hu.po | 80 +++--- + po/hy.po | 80 +++--- + po/id.po | 80 +++--- + po/is.po | 80 +++--- + po/it.po | 80 +++--- + po/ja.po | 80 +++--- + po/ka.po | 80 +++--- + po/kn.po | 80 +++--- + po/ko.po | 80 +++--- + po/ku.po | 80 +++--- + po/lt.po | 80 +++--- + po/lv.po | 80 +++--- + po/mai.po | 80 +++--- + po/mg.po | 80 +++--- + po/mk.po | 80 +++--- + po/ml.po | 80 +++--- + po/mn.po | 80 +++--- + po/mr.po | 80 +++--- + po/ms.po | 80 +++--- + po/nb.po | 917 + ++++++++++++++++++++++++++-------------------------- + po/ne.po | 80 +++--- + po/nl.po | 80 +++--- + po/nn.po | 80 +++--- + po/oc.po | 80 +++--- + po/or.po | 80 +++--- + po/pa.po | 80 +++--- + po/pl.po | 80 +++--- + po/ps.po | 80 +++--- + po/pt.po | 80 +++--- + po/pt_BR.po | 80 +++--- + po/ro.po | 80 +++--- + po/ru.po | 80 +++--- + po/rw.po | 80 +++--- + po/si.po | 80 +++--- + po/sk.po | 80 +++--- + po/sl.po | 80 +++--- + po/sq.po | 80 +++--- + po/sr.po | 80 +++--- + po/sr@ije.po | 80 +++--- + po/sr@latin.po | 80 +++--- + po/sv.po | 80 +++--- + po/ta.po | 80 +++--- + po/te.po | 80 +++--- + po/th.po | 80 +++--- + po/tl.po | 80 +++--- + po/tr.po | 80 +++--- + po/tt.po | 80 +++--- + po/uk.po | 80 +++--- + po/vi.po | 127 ++++---- + po/wa.po | 80 +++--- + po/xh.po | 80 +++--- + po/yi.po | 80 +++--- + po/zh_CN.po | 80 +++--- + po/zh_HK.po | 80 +++--- + po/zh_TW.po | 80 +++--- + 89 files changed, 5260 insertions(+), 4816 deletions(-) + +commit ad1580e516fd481eaa1c6bb9134c1c11a517e824 +Author: Matthias Clasen +Date: Mon Dec 21 10:02:07 2009 -0500 + + Update release notes + + README.in | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + +commit 7af2609a44f26b8a6e65601fc2fa6f7453ff73c5 +Author: Matthias Clasen +Date: Mon Dec 21 09:59:24 2009 -0500 + + Updates + + NEWS | 37 +++++++++++++++++++++++++++++++++++++ + 1 files changed, 37 insertions(+), 0 deletions(-) + +commit 52405a6b5dcaa1e8e6268192760ee6e11939a3b5 +Author: Iestyn Pryce +Date: Mon Dec 21 14:57:15 2009 +0000 + + Updated Welsh translation + + po/cy.po | 99 + +++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 47 insertions(+), 52 deletions(-) + +commit 71d508776efc69e2ee97b424bbeb25d3ced38ac8 +Author: Matthias Clasen +Date: Mon Dec 21 09:21:54 2009 -0500 + + Remove comment as well + + glib/tests/option-context.c | 4 ---- + 1 files changed, 0 insertions(+), 4 deletions(-) + +commit 7db8b92b979b2f95268d42eecf9dc7a361e6f5d1 +Author: Matthias Clasen +Date: Mon Dec 21 09:11:23 2009 -0500 + + Revert the g_set_prgname change + + This change breaks our API and causes warnings from essentially + all applications. + See bug 563627. + + glib/gutils.c | 11 ++--------- + glib/tests/option-context.c | 2 -- + 2 files changed, 2 insertions(+), 11 deletions(-) + +commit 473fd041324931cc1267e354408475058611d740 +Author: Iestyn Pryce +Date: Sun Dec 20 12:03:19 2009 +0000 + + Updated Welsh translation + + po/cy.po | 1114 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 561 insertions(+), 553 deletions(-) + +commit ccd33a4043008f2927df6988bfe623341afb91f9 +Author: Behdad Esfahbod +Date: Sat Dec 19 11:46:19 2009 +0100 + + Bug 501166 - Warning message says IA__g_type_init instead of + g_type_init + + gobject/gtype.c | 24 ++++++++++++------------ + 1 files changed, 12 insertions(+), 12 deletions(-) + +commit 991702494946bdfcea958c6bd421b51867ea7545 +Author: Javier Jardón +Date: Tue Dec 15 21:15:41 2009 +0100 + + G_DEFINE_INTERFACE_* documentation is not generated + + Fix the documentation: Replace "@Since:" with "Since:" + + https://bugzilla.gnome.org/show_bug.cgi?id=604645 + + gobject/gtype.h | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 046e521b4f08a88c889620225faea7284356eb23 +Author: Kamal Mostafa +Date: Fri Dec 18 10:34:05 2009 -0800 + + Fix typo "Performace" in gtester-report Details pop-up window + + glib/gtester-report | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit f74c0e257fef1b6304294d34130e74b591b14acf +Author: Dan Winship +Date: Fri Dec 18 12:27:36 2009 +0100 + + update .gitignores + + gio/tests/.gitignore | 26 +++++++++++++++----------- + gobject/tests/.gitignore | 1 + + 2 files changed, 16 insertions(+), 11 deletions(-) + +commit 28d91b5bb6f0543c259976d8338a7b4d95054dd3 +Author: Dan Winship +Date: Fri Dec 18 10:26:09 2009 +0100 + + Fix UnixWare build by not using "sa_len" as a variable name + + https://bugzilla.gnome.org/show_bug.cgi?id=604875 + + gio/gnetworkingprivate.h | 2 +- + gio/gresolver.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 50741f2fb2db13ef236974e676d1b6472c3aef5c +Author: Nguyễn Thái Ngọc Duy +Date: Fri Dec 18 15:00:54 2009 +0700 + + vi.po: updated Vietnamese translation + + po/vi.po | 412 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 197 insertions(+), 215 deletions(-) + +commit 3f41e31bf974f6abaeb28264654d6b46b87b7428 +Author: Gian Mario Tagliaretti +Date: Tue Dec 15 23:49:18 2009 +0100 + + Remove wrong file imports, only gio/gio.h should be included + + gio/gunixconnection.h | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit a0bcd63304c683d54e1d55203922a58de672b8f6 +Author: Tor Lillqvist +Date: Mon Dec 14 03:16:55 2009 +0200 + + Don't check for headers we include unconditionally + + Don't bother checking for winsock2.h and mswsock.h in the configure + script as we include these unconditionally when building for Windows + anyway. + + config.h.win32.in | 3 --- + configure.in | 2 +- + 2 files changed, 1 insertions(+), 4 deletions(-) + +commit 8dc200db043fb7251baed6e346a7c5542a24a7b9 +Author: Tor Lillqvist +Date: Mon Dec 14 03:09:46 2009 +0200 + + Check for and use it if present + + Should help bug #603527 if glib is built in an environment that has + . + + config.h.win32.in | 7 +++++++ + configure.in | 2 +- + gio/gwin32resolver.c | 8 ++++++++ + 3 files changed, 16 insertions(+), 1 deletions(-) + +commit cdf00a6a9b98574dd4a06779de43612b9c8fa42a +Author: Paolo Borelli +Date: Tue Dec 8 17:05:09 2009 +0100 + + Add unit tests for some more methods + + gio/tests/buffered-input-stream.c | 83 + ++++++++++++++++++++++++++++++++++++- + 1 files changed, 82 insertions(+), 1 deletions(-) + +commit 4fbbe190b7cbfd271bbb18428bc103ebffa41112 +Author: Alexander Larsson +Date: Mon Dec 7 22:00:51 2009 +0100 + + Remove default implementation of async filter steam ops + + Not only is the default implementation broken (it causes infinite + recursion + as seen in bug #603982), but its also worthless. If we just fall + back on the + default stream operations we automatically get async version based on + the sync filter stream operations, which is what we want. + + gio/gfilterinputstream.c | 185 + +-------------------------------------------- + gio/gfilteroutputstream.c | 173 + ------------------------------------------ + 2 files changed, 2 insertions(+), 356 deletions(-) + +commit 8a6d5e203eb22dad7e197f33b8c7d96f72be4bea +Author: Paolo Borelli +Date: Sun Dec 6 15:45:37 2009 +0100 + + Fix makefile typo + + gio/Makefile.am | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 568cd48365a8c8ffa6fc25d5282ec92de6e2ff31 +Author: Paolo Borelli +Date: Sat Nov 28 23:39:48 2009 +0100 + + Add GUtf8InputStream - Bug #603270 + + Add a filter input stream that performs utf8 validation. + + docs/reference/gio/gio-docs.xml | 1 + + docs/reference/gio/gio-sections.txt | 18 ++ + docs/reference/gio/gio.types | 1 + + gio/Makefile.am | 2 + + gio/gio.h | 1 + + gio/gio.symbols | 7 + + gio/giotypes.h | 1 + + gio/gutf8inputstream.c | 327 + +++++++++++++++++++++++++++++++++++ + gio/gutf8inputstream.h | 80 +++++++++ + gio/tests/Makefile.am | 4 + + gio/tests/utf8-input-stream.c | 252 +++++++++++++++++++++++++++ + 11 files changed, 694 insertions(+), 0 deletions(-) + +commit c20280b41bc084793e2baa094dc03dc9d1d75f8b +Author: Yair Hershkovitz +Date: Sun Dec 6 08:41:49 2009 +0200 + + Updated Hebrew translation + + po/he.po | 961 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 481 insertions(+), 480 deletions(-) + +commit efb594b7d49e5058de621f1253671ec192eae695 +Author: Kjartan Maraas +Date: Fri Dec 4 21:18:32 2009 +0100 + + Updated Norwegian bokmÃ¥l translation. + + po/nb.po | 951 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 476 insertions(+), 475 deletions(-) + +commit 2321e5aed07154761223bb124770beba56700e41 +Author: Matthew W. S. Bell +Date: Wed Dec 2 01:48:30 2009 +0100 + + Initialise variable in g_time_val_from_iso8601() + + The function does not initialise the struct tm, + giving it improper values of tm_isdst making the result + an hour out. + + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=603540 + + glib/gtimer.c | 7 ++++--- + 1 files changed, 4 insertions(+), 3 deletions(-) + +commit 3d8035f799f632f196d914fde02dc052b7944581 +Author: Jeroen Nijhof +Date: Tue Dec 1 19:42:09 2009 +0100 + + [gio] Remove some commas at end of enumerator list + + Fixes https://bugzilla.gnome.org/show_bug.cgi?id=603476 + + gio/gioenums.h | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit 39cd766e8ef6901c097fdf2d3148fdc952f06b0e +Author: Dan Winship +Date: Tue Dec 1 10:42:58 2009 +0100 + + Use G_DEFINE_INTERFACE in gio + + Note: Since we export types with Iface in the name rather than + Interface we have to use some typedefs to make this work. New + interfaces should probably use Interface as the public name. + + gio/gappinfo.c | 45 +------------ + gio/gasyncresult.c | 44 +------------ + gio/gdesktopappinfo.c | 44 +------------ + gio/gdrive.c | 175 + ++++++++++++++++++------------------------------- + gio/gfile.c | 46 +------------ + gio/gicon.c | 44 +------------ + gio/gloadableicon.c | 45 +------------ + gio/gmount.c | 143 ++++++++++++++-------------------------- + gio/gseekable.c | 38 +---------- + gio/gvolume.c | 103 ++++++++--------------------- + 10 files changed, 164 insertions(+), 563 deletions(-) + +commit 91d96350a7eed2e2acfc0c254b6dfc4e6fe81a8b +Author: Dan Winship +Date: Tue Dec 1 10:33:12 2009 +0100 + + Add G_DEFINE_INTERFACE + + This is a macro similar to G_DEFINE_TYPE but it lets you define + interfaces rather than classes. + + For discussion, see bug #320482 + + docs/reference/gobject/gobject-sections.txt | 2 + + gobject/gtype.h | 70 + ++++++++++++++++++++++++++- + gobject/tests/threadtests.c | 30 ----------- + 3 files changed, 70 insertions(+), 32 deletions(-) + +commit 74a970f754bbffcc9f0a3fa6dd9977a8640544c8 +Author: Ryan Lortie +Date: Mon Nov 30 19:50:21 2009 -0500 + + Add byteswap macros for gsize/gssize. + + configure.in | 5 ++ + docs/reference/glib/glib-sections.txt | 12 +++++ + docs/reference/glib/tmpl/byte_order.sgml | 72 + ++++++++++++++++++++++++++++++ + glib/gtypes.h | 5 ++ + glibconfig.h.win32.in | 4 ++ + 5 files changed, 98 insertions(+), 0 deletions(-) + +commit 2a78adc5e3f5b33e92cc55570397da24e062aa24 +Author: Benjamin Otte +Date: Thu Oct 8 20:01:15 2009 +0200 + + Only add object to list new objects when it has a custom constructor + + This works around the need to take a custom mutex twice and add the + object to a GSList of objects that are currently in construction + for the + common case. Only when the constructor is overwritten do we use the + previous behavior and allow things like singleton objects. + + The only slightly incompatible change is that previously, it was ok to + call g_object_set() on construct-only properties while the object was + initialized. This will now fail. If that behavior is needed, setting a + custom constructor that just chains up will reenable this + functionality. + + https://bugzilla.gnome.org/show_bug.cgi?id=557151 + + gobject/gobject.c | 26 ++++++++++++++++++-------- + 1 files changed, 18 insertions(+), 8 deletions(-) + +commit f0f32a7ef0f7ae8cdd2aa2992d2e116dd7b602fe +Author: Benjamin Otte +Date: Thu Sep 24 15:04:20 2009 +0200 + + Remove more read locks usage + + g_type_default_interface_peek() and g_type_value_table_peek() + don't need + to acquire read locks anymore when they test the refcount instead of + node->data. + + gobject/gtype.c | 15 ++++----------- + 1 files changed, 4 insertions(+), 11 deletions(-) + +commit 5cac5c828b9d56ed0b1932deb7364d6ba926eb96 +Author: Benjamin Otte +Date: Thu Sep 24 14:57:19 2009 +0200 + + Make g_type_class_peek[_static]() not take any locks + + By replacing a check for node->data with a check for + NODE_REFCOUNT(node) + these functions don't require a read lock anymore. + + gobject/gtype.c | 8 ++------ + 1 files changed, 2 insertions(+), 6 deletions(-) + +commit 83ee0d947d7c103e975be0fc4e62415ad7d57571 +Author: Edward Hervey +Date: Thu Sep 24 13:19:46 2009 +0200 + + gobject/tests: New test for dynamic class creation/destruction + + Starts 100 threads which ref/unref a dynamic class to test the recent + changes to class init/uninit. + + gobject/tests/Makefile.am | 4 +- + gobject/tests/dynamictests.c | 235 + ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 238 insertions(+), 1 deletions(-) + +commit 35c376a8a6be94f6fd5c22164a5e0968f4d3e26e +Author: Edward Hervey +Date: Thu Sep 24 12:42:49 2009 +0200 + + Add type_data_ref_U() and use it in g_type_class_ref() + + The function returns TRUE if the type was previously initialized + and can + be easily reused. It returns FALSE and does not take a reference + if the + type is not referenced yet. + + g_type_class_ref() uses this to avoid taking locks in the common path, + which speeds up object creation a lot - in particular in multithreaded + applications. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 62 + +++++++++++++++++++++++++++++++++++++----------------- + 1 files changed, 42 insertions(+), 20 deletions(-) + +commit 5160175656797fde6b301b0d832b692052b96e3e +Author: Edward Hervey +Date: Thu Sep 24 12:29:25 2009 +0200 + + Reorganize g_type_class_ref() + + Moves the first check out of the lock, as it's not required. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 19 ++++++++----------- + 1 files changed, 8 insertions(+), 11 deletions(-) + +commit 00a4470ad07551f3629029892b819c18d8902f2f +Author: Benjamin Otte +Date: Thu Sep 24 12:26:53 2009 +0200 + + Make ClassData->init_state atomic + + This is necessary to make g_type_class_ref() lockless. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + Also includes fix for: + + https://bugzilla.gnome.org/show_bug.cgi?id=587892 + + gobject/gtype.c | 24 +++++++++++++----------- + 1 files changed, 13 insertions(+), 11 deletions(-) + +commit 4c243b1cba6e94658e68c3e4b188d0d784ed7463 +Author: Edward Hervey +Date: Thu Sep 24 11:45:13 2009 +0200 + + Make type_data_unref_U not take locks in the common case + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 19 ++++++++++++------- + 1 files changed, 12 insertions(+), 7 deletions(-) + +commit 5e7dba0501f4af4ac5427bbf1227ba5cb026cffa +Author: Edward Hervey +Date: Thu Sep 24 11:38:49 2009 +0200 + + Make all accesses of Node->ref_count atomic + + This does not change any locking behavior at all, it just replaces + simple getters/setters of the variable with atomic versions. + + The ref_count variable was kept as unsigned, even though that requires + casting for all operations, to mirror GObject->refcount. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 11 +++++------ + 1 files changed, 5 insertions(+), 6 deletions(-) + +commit 2ec989902b2800d150bbb2cf6c3b6924f43ed736 +Author: Edward Hervey +Date: Thu Sep 24 11:19:58 2009 +0200 + + type_data_unref_Wm => type_data_unref_U + + Make the type unref function not hold any locks when called. This + makes it easier to optimize it to be atomic later. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 37 ++++++++++++++----------------------- + 1 files changed, 14 insertions(+), 23 deletions(-) + +commit b163759320ddfce0276b20bb453de70919aeeff3 +Author: Benjamin Otte +Date: Thu Sep 24 11:16:10 2009 +0200 + + Add a NODE_REFCOUNT getter + + This is useful when moving the code to be atomic. + It also will make that patch smaller. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 39 +++++++++++++++++++-------------------- + 1 files changed, 19 insertions(+), 20 deletions(-) + +commit 170423f924950728cec21a784787aa43b0be71bc +Author: Edward Hervey +Date: Thu Sep 24 10:44:17 2009 +0200 + + Move setting the refcount to the end of the function + + This is a safety feature for when making it atomic later. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit f8d24e849533e0e43cd7c9cf9a9692e4779c0472 +Author: Edward Hervey +Date: Thu Sep 24 10:16:48 2009 +0200 + + Pass the TypeNode to type_data_last_unref_Wm() + + Previously the GType was looked up just for calling the function + Also moves the unref functions together in the code. + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 57 + ++++++++++++++++++++++++++---------------------------- + 1 files changed, 27 insertions(+), 30 deletions(-) + +commit 718b476c4474e5c9e973046ef555ffcb9bfd38a1 +Author: Edward Hervey +Date: Thu Sep 24 10:03:14 2009 +0200 + + Move ref_count from TypeNode->data to TypeNode + + https://bugzilla.gnome.org/show_bug.cgi?id=585375 + + gobject/gtype.c | 48 ++++++++++++++++++++++++------------------------ + 1 files changed, 24 insertions(+), 24 deletions(-) + +commit 69961d27a13b2083d864884b40c861c5e97a5c12 +Author: Alexander Larsson +Date: Wed Sep 9 16:42:32 2009 +0200 + + Implement O(1) interface lookups + + Currently interface lookups are do a binary search over all the + interfaces + an object implements. Its possible to do this lookup in constant + time using for + instance the gcj algorighm described at: + http://gcc.gnu.org/ml/java/1999-q3/msg00377.html + + This is an implementation of that based on GAtomicArray. + + gobject/gtype.c | 185 + +++++++++++++++++++++++++++++++++++++++++++++---------- + 1 files changed, 151 insertions(+), 34 deletions(-) + +commit 8f27a5e62129672f5c17b140ca854fd2307a9734 +Author: Alexander Larsson +Date: Wed Sep 9 16:51:28 2009 +0200 + + Implement lock free interface lookup + + We implement lock free interface lookup by moving the n_ifaces + counter into memory pointed to by TypeNode->iface_entries, and + then updating this in RCU-style by always copying it, modifying + the copy and then when the modification is done replace the old + pointer with g_atomic_pointer_set. + + There is one additional complexity when freeing the old memory, + since the old memory region can be in use. To handle this we + don't free such memory, but put it on a free list and reuse it + later. This means that lock-free lookups must be able to + handle the memory being modified in random ways without crashing, + and at the end we verify that the memory didn't change and the + transaction is ok. + + With this infrastructure the patch then implements a lock-free + version of type_lookup_iface_entry_L called type_lookup_iface_vtable_I + and use it in: g_type_interface_peek, g_type_interface_peek_parent + and type_node_check_conformities_UorL. + + Using the performance tests from bug 557100 shows that the general + performance difference is negligible, but the lack of a lock for each + type check and interface vfunc call should greatly enhance threaded + scalability. + + gobject/gtype.c | 329 + ++++++++++++++++++++++++++++++++++--------------------- + 1 files changed, 204 insertions(+), 125 deletions(-) + +commit 75ce4741f9a7a26098a77407de9b4cc2b985a254 +Author: Alexander Larsson +Date: Wed Sep 9 16:47:44 2009 +0200 + + Add GAtomicArray for RCU-style lockless updates + + This adds supports for a lock-less a non-shrinking growable array. + You can use it to do reads using no locks, as long as your read-code + can handle that during the read transaction the object can be modified + by another writer (but it will not change size or be freed), and you + can only trust the result once the transaction has finished + successfully. + + This doesn't free things like RCU normally does, instead it pushes the + memory on a free list that is reused for other atomic arrays. + + gobject/Makefile.am | 3 +- + gobject/gatomicarray.c | 169 + ++++++++++++++++++++++++++++++++++++++++++++++++ + gobject/gatomicarray.h | 60 +++++++++++++++++ + 3 files changed, 231 insertions(+), 1 deletions(-) + +commit f55752b10cc29090550005e16e9e7f72c5c060fa +Author: Ivar Smolin +Date: Mon Nov 30 13:08:18 2009 +0200 + + Updating Estonian translation + + po/et.po | 479 + ++------------------------------------------------------------ + 1 files changed, 10 insertions(+), 469 deletions(-) + +commit 8df6191a322d6b412448aa5618daf68c4e0ab3da +Author: Matthias Clasen +Date: Mon Nov 30 00:11:10 2009 -0500 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 2532707ce420623acaf7f1fc0bd3670bb3a8a86b +Author: Matthias Clasen +Date: Mon Nov 30 00:09:36 2009 -0500 + + 2.23.0 + + docs/reference/glib/tmpl/glib-unused.sgml | 67 ++ + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/version.sgml | 68 -- + po/am.po | 282 ++++--- + po/ar.po | 285 ++++--- + po/as.po | 287 ++++--- + po/az.po | 282 ++++--- + po/be.po | 283 ++++--- + po/be@latin.po | 286 ++++--- + po/bg.po | 287 ++++--- + po/bn.po | 287 ++++--- + po/bn_IN.po | 287 ++++--- + po/bs.po | 282 ++++--- + po/ca.po | 917 ++++++++++---------- + po/ca@valencia.po | 285 ++++--- + po/cs.po | 287 ++++--- + po/cy.po | 282 ++++--- + po/da.po | 287 ++++--- + po/de.po | 287 ++++--- + po/dz.po | 282 ++++--- + po/el.po | 286 ++++--- + po/en@shaw.po | 966 +++++++++++---------- + po/en_CA.po | 285 ++++--- + po/en_GB.po | 287 ++++--- + po/eo.po | 282 ++++--- + po/es.po | 930 ++++++++++---------- + po/et.po | 492 +++++++++++- + po/eu.po | 287 ++++--- + po/fa.po | 282 ++++--- + po/fi.po | 287 ++++--- + po/fr.po | 287 ++++--- + po/ga.po | 282 ++++--- + po/gl.po | 941 +++++++++++---------- + po/gu.po | 287 ++++--- + po/he.po | 287 ++++--- + po/hi.po | 287 ++++--- + po/hr.po | 282 ++++--- + po/hu.po | 287 ++++--- + po/hy.po | 282 ++++--- + po/id.po | 282 ++++--- + po/is.po | 282 ++++--- + po/it.po | 287 ++++--- + po/ja.po | 287 ++++--- + po/ka.po | 282 ++++--- + po/kn.po | 287 ++++--- + po/ko.po | 287 ++++--- + po/ku.po | 282 ++++--- + po/lt.po | 285 ++++--- + po/lv.po | 282 ++++--- + po/mai.po | 285 ++++--- + po/mg.po | 282 ++++--- + po/mk.po | 285 ++++--- + po/ml.po | 287 ++++--- + po/mn.po | 282 ++++--- + po/mr.po | 287 ++++--- + po/ms.po | 282 ++++--- + po/nb.po | 943 +++++++++++---------- + po/ne.po | 282 ++++--- + po/nl.po | 285 ++++--- + po/nn.po | 285 ++++--- + po/oc.po | 282 ++++--- + po/or.po | 287 ++++--- + po/pa.po | 287 ++++--- + po/pl.po | 287 ++++--- + po/ps.po | 282 ++++--- + po/pt.po | 287 ++++--- + po/pt_BR.po | 951 +++++++++++---------- + po/ro.po | 287 ++++--- + po/ru.po | 287 ++++--- + po/rw.po | 282 ++++--- + po/si.po | 282 ++++--- + po/sk.po | 285 ++++--- + po/sl.po | 1282 + +++++++++++++--------------- + po/sq.po | 288 ++++--- + po/sr.po | 287 ++++--- + po/sr@ije.po | 282 ++++--- + po/sr@latin.po | 287 ++++--- + po/sv.po | 1332 + ++++++++++++++--------------- + po/ta.po | 287 ++++--- + po/te.po | 287 ++++--- + po/th.po | 287 ++++--- + po/tl.po | 282 ++++--- + po/tr.po | 287 ++++--- + po/tt.po | 282 ++++--- + po/uk.po | 287 ++++--- + po/vi.po | 285 ++++--- + po/wa.po | 282 ++++--- + po/xh.po | 282 ++++--- + po/yi.po | 282 ++++--- + po/zh_CN.po | 285 ++++--- + po/zh_HK.po | 287 ++++--- + po/zh_TW.po | 287 ++++--- + 92 files changed, 16991 insertions(+), 14691 deletions(-) + +commit 310e2e7291ba716755e538a6fe286a0072b39ef1 +Author: Matthias Clasen +Date: Sun Nov 29 22:57:00 2009 -0500 + + More updates + + NEWS | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 8907bfee863e969bc68de749a45f34d7f7f21699 +Author: Matthias Clasen +Date: Sun Nov 29 22:54:16 2009 -0500 + + Fix up GIO docs + + docs/reference/gio/gio-docs.xml | 31 +++++---- + docs/reference/gio/gio-sections.txt | 113 + ++++++++++++++++++++++++++++++++ + docs/reference/gio/gio.types | 9 +++ + gio/fen/fen-data.c | 4 - + gio/gappinfo.h | 1 + + gio/gcharsetconverter.c | 31 +++++++++- + gio/gconverterinputstream.c | 13 ++++- + gio/gconverterinputstream.h | 2 +- + gio/gconverteroutputstream.c | 13 ++++- + gio/gconverteroutputstream.h | 2 +- + gio/gdummyfile.c | 6 -- + gio/gioenums.h | 6 +- + gio/glocaldirectorymonitor.c | 7 -- + gio/glocalfile.c | 6 -- + gio/glocalfileinputstream.c | 6 -- + gio/glocalfilemonitor.c | 7 -- + gio/gunionvolumemonitor.c | 9 +-- + gio/gunixvolume.c | 120 + ++++++++++++++------------------- + gio/gunixvolumemonitor.c | 12 ---- + gio/gwin32mount.c | 2 +- + gio/gwin32volumemonitor.c | 6 +- + gio/win32/gwinhttpfile.c | 4 +- + gio/win32/gwinhttpfileinputstream.c | 4 +- + gio/win32/gwinhttpfileoutputstream.c | 4 +- + gio/win32/gwinhttpvfs.c | 2 +- + 25 files changed, 261 insertions(+), 159 deletions(-) + +commit 80bda52b57440b66752df6aa4078e3a723b3a990 +Author: Matthias Clasen +Date: Sun Nov 29 21:19:10 2009 -0500 + + Fix dynamictype test to build + + tests/gobject/dynamictype.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit 06c71ba399adc22c4f327876bac50bbd1a6dfcf4 +Author: Matthias Clasen +Date: Sun Nov 29 20:55:25 2009 -0500 + + Fix 'make check' in gio + + gio/gio.symbols | 430 + +++++++++++++++++++++++++++++-------------------------- + gio/pltcheck.sh | 2 +- + 2 files changed, 225 insertions(+), 207 deletions(-) + +commit a4a69df105e57a37fbb2b14275f262613aff1071 +Author: Matthias Clasen +Date: Sun Nov 29 20:48:52 2009 -0500 + + Remove filter-cat from TEST_PROGS + + Since it is not intended to be run as part of make check. + + gio/tests/Makefile.am | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + +commit 12939c54f93ddc61c02b592ced931fb30d797fe8 +Author: Matthias Clasen +Date: Sun Nov 29 20:47:51 2009 -0500 + + Disable a broken test + + One of the option context tests relied on the ability to + call g_set_pgrname() more than once. Thats no longer possible + (without incurring a warning that wrecks the test). + + glib/tests/option-context.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 31be5a93402ca596bb1bc5d872ef437c51ac6d12 +Author: David Planella +Date: Sun Nov 29 19:27:45 2009 +0100 + + Updated Catalan translations, with some corrections from Carles + Ferrando + + po/ca.po | 964 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 497 insertions(+), 467 deletions(-) + +commit e7992b7b06df986bd36dd745a4cca2661e77f497 +Author: Paolo Borelli +Date: Sun Nov 29 15:14:10 2009 +0100 + + Fix return type of g_converter_[in|out]put_stream. + + Fixes bug #603265 + + gio/gconverterinputstream.c | 8 ++++---- + gio/gconverterinputstream.h | 4 ++-- + gio/gconverteroutputstream.c | 10 +++++----- + gio/gconverteroutputstream.h | 4 ++-- + gio/tests/converter-stream.c | 30 +++++++++++++----------------- + 5 files changed, 26 insertions(+), 30 deletions(-) + +commit bd2a9f7ebb12fde7ea4dcf38d252bfea519970e4 +Author: Jorge González +Date: Sat Nov 28 13:26:38 2009 +0100 + + Updated Spanish translation + + po/es.po | 24 +++++++++--------------- + 1 files changed, 9 insertions(+), 15 deletions(-) + +commit 35d440535fecaacce228089b91873afc6c5e069a +Author: Matthias Clasen +Date: Sat Nov 28 01:59:12 2009 -0500 + + Updates + + NEWS | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 60 insertions(+), 0 deletions(-) + +commit 43149aafe04027bf7f91abb05df64afafc5ed4c4 +Author: Matthias Clasen +Date: Sat Nov 28 01:30:27 2009 -0500 + + Bump version to 2.23.0 + + configure.in | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit 92a766c74380f7511b0f0c2ea04059133ff8fd73 +Author: Matej Urbančič +Date: Fri Nov 27 13:33:16 2009 +0100 + + Updated Slovenian translation + + po/sl.po | 213 + +++++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 114 insertions(+), 99 deletions(-) + +commit 56653e930feebd36cf36523669f3bcad59ad3dc2 +Author: Jorge González +Date: Fri Nov 27 01:37:49 2009 +0100 + + Updated Spanish translation + + po/es.po | 171 + ++++++++++++++++++++++++++++++++++++-------------------------- + 1 files changed, 99 insertions(+), 72 deletions(-) + +commit 8586b636c7a0162f7b06e00c6a563eeaf24cab46 +Author: Ryan Lortie +Date: Thu Nov 26 12:15:04 2009 -0500 + + Bug 589631 - enclose literals with double quotes + + Improve strings for purpose of translation. + + Based on a patch from Leonardo Ferreira Fontenelle. + + gio/gmount.c | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +commit 09b1b6414b6aa001733fa7897f48970cb3cf258a +Author: Christian Kellner +Date: Fri Oct 9 15:06:44 2009 +0200 + + Add "default location" support to GMount + + The "default location" of the given mount is a path that reflects + the main entry point for the user (e.g. the home directory, or the + root of the volume). + + https://bugzilla.gnome.org/show_bug.cgi?id=561998 + + gio/gmount.c | 31 +++++++++++++++++++++++++++++++ + gio/gmount.h | 3 +++ + 2 files changed, 34 insertions(+), 0 deletions(-) + +commit 2b2195bf68bf68837dc9f6b4765d3716694f42b3 +Author: Alexander Larsson +Date: Thu Nov 26 16:05:07 2009 +0100 + + Pass in the right device to vfs->local_file_add_info for symlinks + + We used to pass the path for the symlink, but the device of the target + which is wrong and breaks metadata access. + + https://bugzilla.gnome.org/show_bug.cgi?id=593809 + + gio/glocalfileinfo.c | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +commit 96f41b62836810563c4f69ba6d053e91c638728a +Author: Mures Andone +Date: Tue Nov 10 14:59:31 2009 +0200 + + Fixed bug 91 (GIO monitoring not working due to bad assert) + + https://bugzilla.gnome.org/show_bug.cgi?id=593856 + + gio/inotify/ginotifydirectorymonitor.c | 10 ++++++++-- + gio/inotify/ginotifyfilemonitor.c | 10 ++++++++-- + 2 files changed, 16 insertions(+), 4 deletions(-) + +commit 97db31fa14d2556a649d1d66a0dfc1792c5908d7 +Author: Will Thompson +Date: Fri Nov 20 13:01:17 2009 +0000 + + Apply English pedantry to GAsyncInitable's docs + + • "asynchronous" was misspelled as "asyncronous" in various places; + • punctuation was missing; + • g_async_initable_new_async() had a stray "and"; + • references to g_async_initable_new_finish() were missing a "the". + + https://bugzilla.gnome.org/show_bug.cgi?id=602417 + + gio/gasyncinitable.c | 38 +++++++++++++++++++------------------- + 1 files changed, 19 insertions(+), 19 deletions(-) + +commit 08d33b81ee4addefa6c5fac6894111d09f90951b +Author: Alexander Larsson +Date: Thu Nov 26 13:15:11 2009 +0100 + + Remove unused variable + + gio/gzlibdecompressor.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit b35fa1994d6607376136716c133dd88433706ee8 +Author: Alexander Larsson +Date: Thu Nov 26 12:30:14 2009 +0100 + + Cast iface_init to GInterfaceInitFunc + + This is in line with what all other type define macros do. + + https://bugzilla.gnome.org/show_bug.cgi?id=508157 + + gobject/gtypemodule.h | 2 +- + tests/gobject/dynamictype.c | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +commit 36646f46ab07dec3d5a2ce0c9ba1932587528ca8 +Author: Alexander Larsson +Date: Thu Nov 26 11:54:44 2009 +0100 + + Add test for G_IMPLEMENT_INTERFACE_DYNAMIC + + tests/gobject/dynamictype.c | 53 + +++++++++++++++++++++++++++++++++++++++--- + 1 files changed, 49 insertions(+), 4 deletions(-) + +commit 7d51c96e5e39e8f3b403884f286ef781f0c952d6 +Author: Alexander Larsson +Date: Tue Nov 24 09:53:15 2009 +0100 + + Add G_IMPLEMENT_INTERFACE_DYNAMIC + + Convenience macro to easy interface addition for dynamic types. + + https://bugzilla.gnome.org/show_bug.cgi?id=508157 + + docs/reference/gobject/gobject-sections.txt | 1 + + gobject/gtypemodule.h | 27 + ++++++++++++++++++++++++--- + 2 files changed, 25 insertions(+), 3 deletions(-) + +commit b3156508c49f5274805de1d0d9bc5a69f43de1e9 +Author: Christian Persch +Date: Sat May 24 21:00:11 2008 +0200 + + Add TB and PB cases to g_format_size_for_display + + glib/gfileutils.c | 32 +++++++++++++++++++++++++------- + 1 files changed, 25 insertions(+), 7 deletions(-) + +commit 1ffedec41f01b2cac9ecd9664cec1867e5d1ebb0 +Author: Tor Lillqvist +Date: Wed Nov 25 12:57:10 2009 +0200 + + Remove fuzzy marker from header, which crashed my msgfmt + + po/en@shaw.po | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 3d7edc137e447456b7cd6b9df8b6257454c43a5d +Author: Ryan Lortie +Date: Wed Nov 11 22:40:28 2009 -0500 + + Bug 601637 - add GUnixFDList + + change GUnixFDMessage to contain a GUnixFDList. + + add test case for GUnixFDMessage and GUnixFDList. + + update docs. + + docs/reference/gio/gio-docs.xml | 1 + + docs/reference/gio/gio-sections.txt | 23 ++ + docs/reference/gio/gio.types | 1 + + gio/Makefile.am | 2 + + gio/gunixfdlist.c | 391 + +++++++++++++++++++++++++++++++++++ + gio/gunixfdlist.h | 89 ++++++++ + gio/gunixfdmessage.c | 193 +++++++++++------- + gio/gunixfdmessage.h | 7 +- + gio/tests/Makefile.am | 5 +- + gio/tests/unix-fd.c | 197 ++++++++++++++++++ + 10 files changed, 835 insertions(+), 74 deletions(-) + +commit e5a98502be13e9f9561106577ecbc736211ca692 +Author: Alexander Larsson +Date: Tue Nov 24 13:31:33 2009 +0100 + + Update gio.symbols with new functions + + gio/gio.symbols | 53 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 53 insertions(+), 0 deletions(-) + +commit b7c4aa61523adfe79991051edf2d0128fd0e5222 +Author: Alexander Larsson +Date: Tue Nov 24 13:31:10 2009 +0100 + + Export g_charset_converter_get_num_fallbacks in header + + gio/gcharsetconverter.h | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 2af69f4135253573ccc3a14f0cb9555bdba6ac3b +Author: Alexander Larsson +Date: Tue Nov 24 13:02:05 2009 +0100 + + Fix GZlibCompressorFormat names + + What used to be called RAW is really the zlib header format. + There is a real "raw" format, so rename the default and add a + RAW type. + + gio/gioenums.h | 8 +++++--- + gio/gzlibcompressor.c | 12 ++++++++++-- + gio/gzlibdecompressor.c | 9 +++++++-- + gio/tests/filter-cat.c | 4 ++-- + 4 files changed, 24 insertions(+), 9 deletions(-) + +commit 85501f5ffabe59ac38daf4d29990a7d5cd949c31 +Author: Ryan Lortie +Date: Wed Nov 11 23:31:12 2009 -0500 + + Bug 591214 - Warnings building gcancellable.o + + - check for EINTR on read() and write() calls + - remove unused 'priv' variable + + gio/gcancellable.c | 33 ++++++++++++++++++++++++++------- + 1 files changed, 26 insertions(+), 7 deletions(-) + +commit 48e2a570439373882cf755567e1d147bc5dd50e5 +Author: Ryan Lortie +Date: Fri Nov 20 12:54:35 2009 -0600 + + Bug 598712 - can't detect text file with backspace + + looks_like_text(): Allow '\b' to appear in text files. + + gio/gcontenttype.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +commit 230745a350fea524f899c6319a7c529fd82bd377 +Author: Alexander Larsson +Date: Wed Nov 18 16:07:16 2009 +0100 + + Add filter-cat test for GConverter streams + + gio/tests/Makefile.am | 4 + + gio/tests/filter-cat.c | 227 + ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 231 insertions(+), 0 deletions(-) + +commit 92b9218cbf8cbc594c3a067b2dc09730416df85f +Author: Alexander Larsson +Date: Fri Nov 20 12:04:31 2009 +0100 + + Add GZlibCompressor + + gio/Makefile.am | 2 + + gio/gio.h | 1 + + gio/giotypes.h | 1 + + gio/gzlibcompressor.c | 316 + +++++++++++++++++++++++++++++++++++++++++++++++++ + gio/gzlibcompressor.h | 51 ++++++++ + 5 files changed, 371 insertions(+), 0 deletions(-) + +commit 38c3eb14e42da8ca2d55918be048cf1729591486 +Author: Alexander Larsson +Date: Thu Nov 19 17:20:20 2009 +0100 + + Add GZlibDecompressor for zlib decompression + + gio/Makefile.am | 2 + + gio/gio.h | 1 + + gio/gioenums.h | 15 +++ + gio/giotypes.h | 1 + + gio/gzlibdecompressor.c | 292 + +++++++++++++++++++++++++++++++++++++++++++++++ + gio/gzlibdecompressor.h | 50 ++++++++ + 6 files changed, 361 insertions(+), 0 deletions(-) + +commit 8cb1252d92e5cfea3804ef27edc01cac5b044ff3 +Author: Alexander Larsson +Date: Thu Nov 19 17:16:29 2009 +0100 + + Add zlib dependency to gio + + Will be used by compression APIs + + configure.in | 11 +++++++++++ + gio-2.0.pc.in | 1 + + gio/Makefile.am | 1 + + 3 files changed, 13 insertions(+), 0 deletions(-) + +commit fce2873641ffe20834722ad33894c91b2e4b6c32 +Author: Alexander Larsson +Date: Fri Oct 23 19:59:03 2009 +0200 + + Add test for converter streams + + gio/tests/Makefile.am | 4 + + gio/tests/converter-stream.c | 576 + ++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 580 insertions(+), 0 deletions(-) + +commit 7f8991596be1f17bd71c367bef630423f0a83c35 +Author: Alexander Larsson +Date: Mon Nov 23 15:03:57 2009 +0100 + + Add GConverterOutputStream + + This allows for conversion when saving + + gio/Makefile.am | 2 + + gio/gconverteroutputstream.c | 595 + ++++++++++++++++++++++++++++++++++++++++++ + gio/gconverteroutputstream.h | 80 ++++++ + gio/gio.h | 1 + + gio/giotypes.h | 1 + + 5 files changed, 679 insertions(+), 0 deletions(-) + +commit afe3324fcac8ea2a6b6007c938d7974aa923c0d3 +Author: Alexander Larsson +Date: Mon Nov 23 15:02:50 2009 +0100 + + Add g_output_stream_is_closing + + Need this to check how we're flushing when closing a converter + output stream. + + gio/goutputstream.c | 29 ++++++++++++++++++++++++++++- + gio/goutputstream.h | 1 + + 2 files changed, 29 insertions(+), 1 deletions(-) + +commit 848e0bf760ea7326420669e90ef6675786dea702 +Author: Alexander Larsson +Date: Thu Oct 22 22:50:52 2009 +0200 + + Add GConverterInputStream + + Read and convert data from an input stream + + gio/Makefile.am | 2 + + gio/gconverterinputstream.c | 544 + +++++++++++++++++++++++++++++++++++++++++++ + gio/gconverterinputstream.h | 80 +++++++ + gio/gio.h | 1 + + gio/giotypes.h | 1 + + 5 files changed, 628 insertions(+), 0 deletions(-) + +commit 134e9bd84f6311e8b18fe69ce8df030561aa12d9 +Author: Alexander Larsson +Date: Mon Nov 23 16:19:08 2009 +0100 + + Add fallback mode to GCharsetConverter + + gio/gcharsetconverter.c | 75 + ++++++++++++++++++++++++++++++++++++++++++++-- + gio/gcharsetconverter.h | 3 ++ + 2 files changed, 74 insertions(+), 4 deletions(-) + +commit 4b8382823e0f03b59d07473f708f1892dcd743dc +Author: Alexander Larsson +Date: Wed Oct 21 21:25:36 2009 +0200 + + Add GCharsetConverter + + gio/Makefile.am | 2 + + gio/gcharsetconverter.c | 373 + +++++++++++++++++++++++++++++++++++++++++++++++ + gio/gcharsetconverter.h | 52 +++++++ + gio/gio.h | 1 + + gio/giotypes.h | 1 + + 5 files changed, 429 insertions(+), 0 deletions(-) + +commit 0d86b25f91aeff168474280f4f5e03df779afc6d +Author: Alexander Larsson +Date: Wed Nov 18 13:14:13 2009 +0100 + + Add GConverter interface + + This is an interface for stateful conversions of data. Its a generic + interface suitable for things like IConv, compression, decompression, + and regexp replacement. + + gio/Makefile.am | 2 + + gio/gconverter.c | 234 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + gio/gconverter.h | 94 ++++++++++++++++++++++ + gio/gio.h | 1 + + gio/gioenums.h | 34 ++++++++ + gio/giotypes.h | 1 + + 6 files changed, 366 insertions(+), 0 deletions(-) + +commit 110133135dabfb2ac829abe7bf84d95baf92a61a +Author: Alexander Larsson +Date: Tue Oct 20 14:12:31 2009 +0200 + + Add G_IO_ERROR_PARTIAL_INPUT and G_IO_ERROR_INVALID_DATA errors + + These are needed for GConverter + + gio/gioenums.h | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +commit 04d83e8e503a07e7b4279227c8f992ddf7c6ef4e +Author: Cody Russell +Date: Mon Nov 23 07:48:14 2009 -0600 + + gtester should fail even if -k is passed + + glib/gtester.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 874efeb8ea7b822cfba254421e76b331815782cb +Author: Vladimir Melo +Date: Mon Nov 23 08:36:06 2009 -0500 + + Updated Brazilian Portuguese translation. + + po/pt_BR.po | 928 + ++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 469 insertions(+), 459 deletions(-) + +commit 56eee6759ba04ad970d2bb356a27de13d79ea575 +Author: Ryan Lortie +Date: Fri Nov 20 14:40:58 2009 -0600 + + Remove #include "glocalfile.h" from GFile + + It might give somebody the wrong idea. =) + + gio/gfile.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit ec79146572aece95c7bc032b486e6a57015ee6e4 +Author: Benjamin Otte +Date: Fri Nov 20 16:47:09 2009 +0100 + + Fix thread-safety + + The n_children variable can be written when locked, while the n_supers + variable is read at any time. As they both share the same bytes, + accessing them is not threadsafe. + This patch puts them into different bytes. + + Thanks to Xan Lopez and valgrind for noticing this. + + gobject/gtype.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit ba2b2bbca2b747d704ae62e99fc7d216f82111ff +Author: Juan A. Suarez Romero +Date: Fri Nov 20 16:46:41 2009 +0100 + + priv variable should only be used in win32 code + + gio/gcancellable.c | 44 +++++++++++++++++++++++--------------------- + 1 files changed, 23 insertions(+), 21 deletions(-) + +commit 8e2fa44953f1f92afdb198bb3ff8b98bb4cf6699 +Author: Ryan Lortie +Date: Thu Nov 19 10:19:01 2009 -0600 + + g_socket_listener_add_any_inet_port is Since 2.24 + + accidentally committed an old patch without updating. + + gio/gsocketlistener.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c005878ae7e429dd51f6be3d9a22b430c8155221 +Author: Ryan Lortie +Date: Mon Jun 15 14:07:13 2009 -0400 + + Bug 585566 - GSocketListener API issues + + Add a new function, g_socket_listener_add_any_inet_port(), to + deal with + the desired use case. + + docs/reference/gio/gio-sections.txt | 1 + + gio/gio.symbols | 1 + + gio/gsocketlistener.c | 225 + +++++++++++++++++++++++++++++++++++ + gio/gsocketlistener.h | 3 + + 4 files changed, 230 insertions(+), 0 deletions(-) + +commit 77baa70eda24be0049d09123e4b81b1f03817110 +Author: Christian Dywan +Date: Thu Nov 19 09:58:43 2009 -0600 + + Bug 600550 - (...) doesn't treat arguments properly + + Add some additional checking to g_app_info_create_from_commandline to + make it handle strange inputs more elegantly. + + gio/gdesktopappinfo.c | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +commit 3257e8ebe470fce6b2eb935589f18d509336a227 +Author: Vincent Untz +Date: Wed Nov 18 16:37:47 2009 -0600 + + Bug 600620 - Add g_app_info_get_display_name() + + This new API can make use of X-GNOME-FullName in .desktop files, + to have + the full name of applications. + + gio/gappinfo.c | 27 +++++++++++++++++++++++++++ + gio/gappinfo.h | 2 ++ + gio/gdesktopappinfo.c | 20 ++++++++++++++++++++ + 3 files changed, 49 insertions(+), 0 deletions(-) + +commit 9681d7e75f2d1296a890bfa64b3478ea7025df62 +Author: Ryan Lortie +Date: Wed Nov 18 18:43:30 2009 -0600 + + Bug 595138 - GFile not robust with invalid input + + Improve handling of g_file_query_default_handler() when called on an + invalid GFile (ie: one created with an invalid URI). + + gio/gfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 5d97ea298672880ee80964c07b9cf31d604c3df9 +Author: Ryan Lortie +Date: Tue Nov 17 20:41:48 2009 -0600 + + Bug 600141 - Add -pthread to gmodule pkg-config + + It is not generally permissible to dlopen() libpthread into a program + that is not already linked with threading support. The most + common case + of this happening is when GIO opens Gvfs (which includes DBus, which + links against libpthread). + + Since gmodule is the way that most users cause this problem for + themselves and since the easiest workaround is to link the program + with + -pthread, the best fix for the issue is to add -pthread to the gmodule + pkg-config. + + gmodule-2.0-uninstalled.pc.in | 4 ++-- + gmodule-2.0.pc.in | 4 ++-- + gmodule-export-2.0.pc.in | 4 ++-- + gmodule-no-export-2.0-uninstalled.pc.in | 4 ++-- + gmodule-no-export-2.0.pc.in | 4 ++-- + 5 files changed, 10 insertions(+), 10 deletions(-) + +commit 983a717fa6431d67ce9d765c1714f77ecb0b02fa +Author: Ryan Lortie +Date: Thu Nov 12 01:37:27 2009 -0500 + + Bug 535159 - g_file_has_parent + + - add a g_file_has_parent() function as a wrapper around + g_file_get_parent() + + docs/reference/gio/gio-sections.txt | 1 + + gio/gfile.c | 43 + +++++++++++++++++++++++++++++++++++ + gio/gfile.h | 2 + + gio/gio.symbols | 1 + + 4 files changed, 47 insertions(+), 0 deletions(-) + +commit ba0a6e1911ee581f1d651a7a05bab789c760ef3c +Author: Javier Jardón +Date: Mon Nov 16 00:29:39 2009 +0100 + + Fix compilation warning: Initialize the variable + + gio/tests/unix-streams.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c6243026ed61698a797ce1b731760e4f0497ad97 +Author: Javier Jardón +Date: Mon Nov 16 00:33:07 2009 +0100 + + Fix compilation warning: Remove unused function + + gio/xdgmime/xdgmimecache.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 00a331f970dfd49e1f9dc5ed3b42a9dd41d530ce +Author: Javier Jardón +Date: Mon Nov 16 00:22:03 2009 +0100 + + Fix compilation warning: cast to (GCompareFunc) + + gio/gdesktopappinfo.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 18b3ff33afad10dfac7dfdf3025313490f8313cc +Author: Javier Jardón +Date: Sun Nov 15 05:51:45 2009 +0100 + + Don't mention g_utf32_to_utf8() and g_utf8_to_utf32() + + These functions doesn't exist. + Suggest to use g_ucs4_to_utf8/g_utf8_to_ucs4 to produce the UTF-8 + representation of a gunichar + + This fix bug: https://bugzilla.gnome.org/show_bug.cgi?id=601874 + + docs/reference/glib/tmpl/unicode.sgml | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 96bf69d4cc4077a986c9b2c398356e9d543d88bd +Author: Javier Jardón +Date: Sun Nov 15 23:58:23 2009 +0100 + + Suggest the use of G_STRFUNC + + Suggest G_STRFUNC in the documentation of the deprecated functions + G_GNUC_PRETTY_FUNCTION and G_GNUC_FUNCTION + + docs/reference/glib/tmpl/macros_misc.sgml | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 6b7b7a76020e76370e416d794eceb99937b9ed33 +Author: Ryan Lortie +Date: Wed Nov 11 23:48:06 2009 -0500 + + Bug 587300 - g_cancellable_disconnect deadlock + + add documentation to clarify that a deadlock is the expected case for + calling this function from a signal handler + + gio/gcancellable.c | 9 ++++++--- + 1 files changed, 6 insertions(+), 3 deletions(-) + +commit 3d09b8e09c07ebb3bae4074f946c5da8d643d247 +Author: Ryan Lortie +Date: Wed Nov 11 23:21:48 2009 -0500 + + Bug 591216 - Warning building resolver.o + + check result of write system call to quiet compiler warning + + gio/tests/resolver.c | 5 ++++- + 1 files changed, 4 insertions(+), 1 deletions(-) + +commit 78e8b39b49ce47a80e70319ffaf548cda177a746 +Author: Ryan Lortie +Date: Wed Nov 11 22:20:11 2009 -0500 + + GSocket.receive_message: fix bogus allocation math + + gio/gsocket.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit 409cdb8d13225125c12f7b56293b6dd397086c29 +Author: Kjartan Maraas +Date: Wed Nov 11 20:09:53 2009 +0100 + + Updated Norwegian bokmÃ¥l translation. + + po/nb.po | 929 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 466 insertions(+), 463 deletions(-) + +commit e5b20a3364b831a19b6cf99f67f803da3a6b6e6b +Author: Tor Lillqvist +Date: Tue Nov 10 14:19:59 2009 +0200 + + Include all of share/gtk-doc/html to get also the gio docs + + Also add -D switches to not pointlessly include entries for + directories + in the zip files. + + glib-zip.in | 9 ++++----- + 1 files changed, 4 insertions(+), 5 deletions(-) + +commit 6e86c9a6aa977331c6bd47b726aaf34398a5ad37 +Author: Tor Lillqvist +Date: Tue Nov 10 01:37:13 2009 +0200 + + Avoid gcc warning about redeclaration of atexit() on MinGW + + glib/gutils.h | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit a9c4320e813aa80343ed5826c51be456a5683f5f +Author: Daniel Nylander +Date: Sun Nov 8 22:04:51 2009 +0100 + + Updated Swedish translation + + po/sv.po | 1307 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 668 insertions(+), 639 deletions(-) + +commit e9915ee7bdde49a7c6c2c0592b96f60cf31b8383 +Author: Fran Diéguez +Date: Sat Nov 7 14:40:58 2009 +0100 + + Updated Galician Translation + + po/gl.po | 918 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 465 insertions(+), 453 deletions(-) + +commit ee116a6b1c60343aafd5b10e11798adbeed0d555 +Author: Jorge González +Date: Fri Nov 6 21:51:28 2009 +0100 + + Updated Spanish translation + + po/es.po | 927 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 467 insertions(+), 460 deletions(-) + +commit 6c315c77895e7e64c5dfb08cc223ff442f924e00 +Author: Ivar Smolin +Date: Fri Nov 6 18:15:29 2009 +0200 + + Updating Estonian translation + + po/et.po | 21 ++++++++------------- + 1 files changed, 8 insertions(+), 13 deletions(-) + +commit fc0b5d735ed06fd09f6f6169965ea427d43c241b +Author: Matej Urbančič +Date: Fri Nov 6 14:58:44 2009 +0100 + + Updated Slovenian translation + + po/sl.po | 1316 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 686 insertions(+), 630 deletions(-) + +commit ef6117f78d036b956d3fe91f6a3748f64499f4c1 +Author: Stéphane Démurget +Date: Sun Oct 25 11:14:36 2009 +0100 + + Bug 324930 - Nicer message for EPERM on symlink + + Introduced a more precise error message for EPERM when symlinking to + a local filesystem. + + EPERM on symlink means symlinking is not supported by the underlying + fs so it is not the general meaning of EPERM which roughly translates + to 'Operation not permitted'. + + gio/glocalfile.c | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit 3c57a6c7ccb38efb8fb3ecf12e9f66f113ffde19 +Author: Tor Lillqvist +Date: Wed Nov 4 23:59:18 2009 +0200 + + Don't call WSAEventSelect() on -1 + + If g_io_win32_sock_close() has been called on a socket channel, don't + later in g_io_win32_free() call WSAEventSelect() on its fd which has + been set to -1. + + glib/giowin32.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 0d6b1ab42a6a9026743f197f03264afdbac7fb7b +Author: Paolo Bonzini +Date: Tue Nov 3 18:38:58 2009 +0200 + + Don't run system("touch conf.glibtest)" in the AM_PATH_GLIB_2_0 macro + + Just use the C library instead to create the file. Helps building + using Wine. Not that I think we want to endorse that, but accepting + this minimal patch doesn't hurt. From bug #590016. + + Signed-off-by: Tor Lillqvist + + m4macros/glib-2.0.m4 | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit f6276add355388738f856201c400d1c43cedcaf2 +Author: Tor Lillqvist +Date: Tue Nov 3 18:21:19 2009 +0200 + + Improve descriptive comment text + + glibconfig.h.win32.in | 8 ++++++-- + 1 files changed, 6 insertions(+), 2 deletions(-) + +commit 9c292a831fac91dfe17158e3379d6ef4ad351c76 +Author: Hib Eris +Date: Tue Nov 3 15:06:29 2009 +0200 + + Fix check for C++ compiler when cross-compiling + + Use AC_CHECK_TOOLS instead of AC_CHECK_PROGS. Patch from bug #577711. + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit b64ee1f02098d229ff16df9dfebdc3e3f3d76687 +Author: Carlo Bramini +Date: Tue Nov 3 14:26:25 2009 +0200 + + Make g_file_test() behave on Windows more like as on POSIX + + Patch from bug #572252. + + glib/gfileutils.c | 19 +++++++++++++------ + 1 files changed, 13 insertions(+), 6 deletions(-) + +commit 22d026d34492b27a531bc60e6edc10eec1aa61be +Author: Thomas Thurman +Date: Sat Oct 31 02:49:31 2009 -0400 + + Shavian translation + + po/LINGUAS | 1 + + po/en@shaw.po | 1968 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 1969 insertions(+), 0 deletions(-) + +commit 4288ad76922da01d1f452c6c257e97008b16aaf0 +Author: Benjamin Otte +Date: Wed Oct 28 19:18:20 2009 +0100 + + Properly nul-terminate return values from g_convert() + + The patch ensures that multibyte character sets are properly + nul-terminated. This is an issue because the documentation claims to + return a "nul-terminated" string and users of the API assume that + means + a proper nul-termination in the resulting character set. + + I looked at Pidgin and GStreamer code and found at least 3 cases where + this was happening. + + This patch also reverts the documentation change from + 5a633f82dbbce067c56fba0ee372fd341b76368d as that is now no longer + necessary. + + glib/gconvert.c | 44 ++++++++++++++++++++------------------------ + 1 files changed, 20 insertions(+), 24 deletions(-) + +commit 5a633f82dbbce067c56fba0ee372fd341b76368d +Author: Benjamin Otte +Date: Tue Oct 27 21:07:13 2009 +0100 + + Clarify documentation about g_convert() nul-terminated returns + + THere is effectively no nul-termination for multibyte characters. + + glib/gconvert.c | 22 ++++++++++++++++------ + 1 files changed, 16 insertions(+), 6 deletions(-) + +commit f3fbf37dd899de5d7bd61d86bed8aada479f564a +Author: Matthias Clasen +Date: Sun Oct 25 02:56:13 2009 -0400 + + Avoid a warning + + gio/gfile.c | 11 +++++++---- + 1 files changed, 7 insertions(+), 4 deletions(-) + +commit e63262d49d40a36060613fb1d0ed468ca5dddc19 +Author: Matthias Clasen +Date: Sun Oct 25 02:55:46 2009 -0400 + + Don't give up too early when collecting mime types + + Since returning exactly one match has special significance, don't + give up matching before we've found at least 2 types. Also, make + sure that we don't return the same mime type more than once. + Bug 541236. + + gio/xdgmime/xdgmimecache.c | 67 + ++++++++++++++++++++++++++++++++------------ + gio/xdgmime/xdgmimeglob.c | 43 +++++++++++++++++++++++++--- + 2 files changed, 87 insertions(+), 23 deletions(-) + +commit 3dab24828edd8ebfd6d6c8bb20c181fc0d5650a1 +Author: Sven Herzberg +Date: Fri Oct 23 14:49:38 2009 +0200 + + make sure g_set_prgname() gets called only once + + * glib/gutils.c: copy the call-once statement from + g_set_application_name(); + Fixes Bug #563627: g_get_prgname() threadsafety + + glib/gutils.c | 13 ++++++++++--- + 1 files changed, 10 insertions(+), 3 deletions(-) + +commit d105f431b0b684ed47e1c23ca283e38e522ce545 +Author: Tor Lillqvist +Date: Fri Oct 23 00:46:50 2009 +0300 + + Fix GWin32DirectoryMonitor + + GWin32DirectoryMonitor was quite broken, but nobody had apparently + noticed, or at least not filed any bug. Only now with a bleeding edge + GTK+ file chooser does the code get exercised in common programs like + gtk-demo or GIMP, apparently. Bug #598899. + + gio/win32/gwin32directorymonitor.c | 67 + ++++++++++++++++++++++++++--------- + 1 files changed, 50 insertions(+), 17 deletions(-) + +commit 8eebc189440693922e23298a761189cfbe71f796 +Author: Cody Russell +Date: Wed Oct 14 21:24:30 2009 -0500 + + GTypeModule derived class unref does not unload plugin + + Correctly unref the pclass. Patch by Chris Wilson and Tim Janik. + + https://bugzilla.gnome.org/show_bug.cgi?id=350200 + + gobject/gtype.c | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +commit e95a3b0576fc9426441956e4053791e197d4f421 +Author: Tomas Bzatek +Date: Tue Oct 13 16:21:42 2009 +0200 + + Documentation fixes + + docs/reference/gio/gio-sections.txt | 1 + + gio/gfileattribute.c | 1 + + gio/gfileinfo.h | 5 +++-- + 3 files changed, 5 insertions(+), 2 deletions(-) + +commit 443674faaa0c6c79492732fd56360faeca06e9ab +Author: Tor Lillqvist +Date: Mon Oct 12 00:18:48 2009 +0300 + + Construct the gio module directory pathname at run-time on Windows + + gio/giomodule.c | 33 +++++++++++++++++++++++++++++++++ + 1 files changed, 33 insertions(+), 0 deletions(-) + +commit 2a3710872f8bfc1c95dc8044c92c9ce020adad40 +Author: Alexander Larsson +Date: Thu Oct 8 11:59:23 2009 +0200 + + xdgmime: sort glob hits with larger weight first + + Higher weight is more important, so return these first meaning + they will be used as the default. + + gio/xdgmime/xdgmimecache.c | 2 +- + gio/xdgmime/xdgmimeglob.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit d9b87676fa8f0340a9baa2001ae912192e12d4c6 +Author: Ivar Smolin +Date: Thu Oct 8 09:56:25 2009 +0300 + + Updating Estonian translation + + po/et.po | 477 + ++------------------------------------------------------------ + 1 files changed, 11 insertions(+), 466 deletions(-) + +commit 3daaa459e332c62972c8792453e0a841157ecf11 +Author: Matthias Clasen +Date: Wed Oct 7 10:31:19 2009 -0400 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit f814174371cbc61404012720c49485bc4d66feba +Author: Matthias Clasen +Date: Wed Oct 7 10:29:32 2009 -0400 + + 2.22.2 + + NEWS | 6 +- + build/win32/Makefile.am | 9 +- + po/am.po | 2 +- + po/ar.po | 2 +- + po/as.po | 2 +- + po/az.po | 2 +- + po/be.po | 2 +- + po/be@latin.po | 2 +- + po/bg.po | 2 +- + po/bn.po | 2 +- + po/bn_IN.po | 2 +- + po/bs.po | 2 +- + po/ca.po | 2 +- + po/ca@valencia.po | 2 +- + po/cs.po | 2 +- + po/cy.po | 2 +- + po/da.po | 2 +- + po/de.po | 2 +- + po/dz.po | 2 +- + po/el.po | 2 +- + po/en_CA.po | 2 +- + po/en_GB.po | 2 +- + po/eo.po | 2 +- + po/es.po | 2 +- + po/et.po | 2 +- + po/eu.po | 2 +- + po/fa.po | 2 +- + po/fi.po | 2 +- + po/fr.po | 2 +- + po/ga.po | 2 +- + po/gl.po | 2 +- + po/gu.po | 2 +- + po/he.po | 2 +- + po/hi.po | 2 +- + po/hr.po | 2 +- + po/hu.po | 2 +- + po/hy.po | 2 +- + po/id.po | 2 +- + po/is.po | 2 +- + po/it.po | 2 +- + po/ja.po | 2 +- + po/ka.po | 2 +- + po/kn.po | 2 +- + po/ko.po | 2 +- + po/ku.po | 2 +- + po/lt.po | 2 +- + po/lv.po | 2 +- + po/mai.po | 2 +- + po/mg.po | 2 +- + po/mk.po | 2 +- + po/ml.po | 2 +- + po/mn.po | 2 +- + po/mr.po | 2 +- + po/ms.po | 2 +- + po/nb.po | 2 +- + po/ne.po | 2 +- + po/nl.po | 2 +- + po/nn.po | 2 +- + po/oc.po | 2 +- + po/or.po | 2 +- + po/pa.po | 2 +- + po/pl.po | 2 +- + po/ps.po | 2 +- + po/pt.po | 2 +- + po/pt_BR.po | 2 +- + po/ro.po | 2 +- + po/ru.po | 909 + +++++++++++++++++++++++------------------------ + po/rw.po | 2 +- + po/si.po | 2 +- + po/sk.po | 2 +- + po/sl.po | 2 +- + po/sq.po | 2 +- + po/sr.po | 6 +- + po/sr@ije.po | 2 +- + po/sr@latin.po | 17 +- + po/sv.po | 2 +- + po/ta.po | 2 +- + po/te.po | 2 +- + po/th.po | 2 +- + po/tl.po | 2 +- + po/tr.po | 2 +- + po/tt.po | 2 +- + po/uk.po | 2 +- + po/vi.po | 2 +- + po/wa.po | 2 +- + po/xh.po | 2 +- + po/yi.po | 2 +- + po/zh_CN.po | 2 +- + po/zh_HK.po | 2 +- + po/zh_TW.po | 2 +- + 90 files changed, 553 insertions(+), 564 deletions(-) + +commit 3d76112aed79b590b79899e46610ce7b2ecffc53 +Author: Matthias Clasen +Date: Wed Oct 7 09:28:19 2009 -0400 + + Updates + + NEWS | 19 ++++++++++++++++++- + 1 files changed, 18 insertions(+), 1 deletions(-) + +commit 855deaa5780bfef3f6e8b3a41d00d6c7e40ca406 +Author: Cody Russell +Date: Tue Oct 6 12:27:12 2009 -0400 + + g_object_unref racy condition can lead to crash + + Store whether the object has a toggleref before decrementing the + refcount to prevent race condition when two threads simultaneously + try to unref an object with a refcount of 2. + Patch by Antoine Tremblay. + + https://bugzilla.gnome.org/show_bug.cgi?id=551706 + + gobject/gobject.c | 12 +++++++++--- + 1 files changed, 9 insertions(+), 3 deletions(-) + +commit afa0db59df9b28d9ae8da9539f629165cc8490f3 +Author: Leonid Kanter +Date: Tue Oct 6 11:52:48 2009 +0300 + + Updated Russian translation by + + po/ru.po | 1072 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 533 insertions(+), 539 deletions(-) + +commit 68b1ca04433846b68141a72029ed67ae117a7e94 +Author: Edward Hervey +Date: Sat Oct 3 12:37:36 2009 +0200 + + gobject/gtype.h: Fix _G_TYPE_CVH macro. Fixes #597194 + + If __val doesn't exist, we shouldn't do any other checks. + + gobject/gtype.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 1937765f9f9052a870cfd924b18e08aa8901a8f2 +Author: Alexander Larsson +Date: Wed Aug 19 17:24:16 2009 +0200 + + Add fast path for construction with no params + + This avoids a bunch of code and makes construction of simple objects + faster. + + Object construction performance improvement: + Non-Threaded Threaded + Simple: 14% 5% + Complex: -1.1% -2.2% + + Other tests stable. + + https://bugzilla.gnome.org/show_bug.cgi?id=557100 + + gobject/gobject.c | 14 +++++++++++++- + 1 files changed, 13 insertions(+), 1 deletions(-) + +commit ffc625ec9bcc4b2d34921940c07b28d244f2257a +Author: Alexander Larsson +Date: Wed Aug 19 17:22:32 2009 +0200 + + Don't freeze/thaw notification during construction if no properties + + If the class has no properties there could be no notification anyway. + This is an important optimization for construction of simple objects. + + Object construction performance improvement: + Non-Threaded Threaded + Simple: 84% 91% + Complex: -1.4% -0.6% + + Other tests stable. + + https://bugzilla.gnome.org/show_bug.cgi?id=557100 + + gobject/gobject.c | 37 +++++++++++++++++++++++++------------ + 1 files changed, 25 insertions(+), 12 deletions(-) + +commit 302d13a757c164346883841ce040208906894b71 +Author: Alexander Larsson +Date: Fri Oct 2 19:27:48 2009 +0200 + + Add a check that no properties are added after a class is derived + + We can't support that, because that would cause the + CLASS_HAS_PROPS_FLAG + class flag to not be correct. + + gobject/gobject.c | 14 ++++++++++++++ + 1 files changed, 14 insertions(+), 0 deletions(-) + +commit 39a1fe5782c15873ab18b8d3d76adfcbd70dc6dd +Author: Alexander Larsson +Date: Wed Aug 19 17:21:18 2009 +0200 + + Add GObjectClass flag CLASS_HAS_PROPS_FLAG + + This is set if a class or any of its parents have installed any + properties. + + https://bugzilla.gnome.org/show_bug.cgi?id=557100 + + gobject/gobject.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 301d52d858b8e7d4b804b893dc2f740aaa0d5aa5 +Author: Alexander Larsson +Date: Wed Aug 19 17:17:41 2009 +0200 + + Add flags member for GObjectClass + + https://bugzilla.gnome.org/show_bug.cgi?id=557100 + + gobject/gobject.h | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +commit af017accc55aff3d6f28df0a41724e93fca71ff4 +Author: Alexander Larsson +Date: Wed Aug 19 15:48:19 2009 +0200 + + Allocate GObjectNotifyQueue with g_slice instead of abusing g_list + + This is both cleaner and faster (it avoids function calls and + zeroing the memory twice). + + Object construction performance improvement: + Non-Threaded Threaded + Simple: 11% 1.3% + Complex: 8% 6% + + Other tests stable. + + https://bugzilla.gnome.org/show_bug.cgi?id=557100 + + gobject/gobjectnotifyqueue.c | 9 ++------- + 1 files changed, 2 insertions(+), 7 deletions(-) + +commit f4d9789fcfc4c9be497414d6c65476adb9d20236 +Author: Alexander Larsson +Date: Wed Sep 9 17:08:57 2009 +0200 + + Add gobject performance tests for threaded code + + This measures how much things like lock contention affects the gobject + code. + + tests/gobject/Makefile.am | 2 + + tests/gobject/performance-threaded.c | 381 + ++++++++++++++++++++++++++++++++++ + 2 files changed, 383 insertions(+), 0 deletions(-) + +commit b1f94af095bde6a9a695ce7b19425a62288ee0ee +Author: Alexander Larsson +Date: Thu Aug 20 14:34:51 2009 +0200 + + Add performance tests for GObject primitives + + These are basic performance test for a couple of basic gobject + primitives: + + * construction of simple objects. Simple is a bare gobject derived + class with no properties, signals or interfaces. + + * construction of complex objects. Complex is a gobject subclass + with construct properties, normal properties, signals, and + implements an interface. + + * run-time type check of complex objects + + * signal emissions + + Lots of care is taken to try to make the results reproducible. Each + test is run for multible "rounds", where we try to make each round be + "not too short" in order to be significant wrt timer accuracy, but + also "not to long" to make the probability of some other random event + happening on the system (interrupts, other process scheduled, etc) + during the round less likely. + The current target round time is 4 msecs, which was picked without + rigour, but seems small wrt e.g. scheduler time. + + For each test we then run the calculated round size for 60 seconds, + and then report the performance based on the minimal time of one + round. The model here is that any random stuff that happens during a + round can only slow it down, there is nothing that can make it go + faster, so the minimal time is the best estimate of how fast one round + goes. + + The result is not ideal, even on a "idle" system the results vary + from round to round, but the variation seems to be less than 1%. + So, any performance difference reported by this test over 1% is + probably statistically significant. + + Additionally the tests can be run with or without threads being + initialized. The script tests/gobject/run-performance.sh makes + it easy to produce a performance report for the current checkout. + + https://bugzilla.gnome.org/show_bug.cgi?id=557100 + + tests/gobject/Makefile.am | 2 + + tests/gobject/performance.c | 735 + ++++++++++++++++++++++++++++++++++++++ + tests/gobject/run-performance.sh | 7 + + 3 files changed, 744 insertions(+), 0 deletions(-) + +commit 07ad638adff596ccd4bc2ec003be692059210357 +Author: Alexander Larsson +Date: Fri Oct 2 12:54:18 2009 +0200 + + remove xdgmime test + + This is getting diverged from the xdgmime copy and we don't need + it here. + + gio/xdgmime/Makefile.am | 5 - + gio/xdgmime/test-mime.c | 196 + ----------------------------------------------- + 2 files changed, 0 insertions(+), 201 deletions(-) + +commit c7c0bcef893ca99609b102b42be5f871b9524a92 +Author: Alexander Larsson +Date: Fri Oct 2 12:06:25 2009 +0200 + + xdgmime - Correct the range checks for magic matching + + gio/xdgmime/xdgmimecache.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 2624e7d6c6ddc5ad93caa7ce609092b6b54cb6d2 +Author: Alexander Larsson +Date: Fri Oct 2 12:06:15 2009 +0200 + + Remove unnecessary includes + + gio/xdgmime/xdgmimecache.c | 1 - + gio/xdgmime/xdgmimeglob.c | 1 - + 2 files changed, 0 insertions(+), 2 deletions(-) + +commit e1643fd76daf66ccffd9e6818e4f4ec8272e2a51 +Author: Alexander Larsson +Date: Fri Oct 2 09:49:51 2009 +0200 + + xdgmime - support the new case sensitive flag + + gio/xdgmime/xdgmimecache.c | 86 + +++++++++++++++++++++++++++++++++---------- + gio/xdgmime/xdgmimeglob.c | 88 + +++++++++++++++++++++++++++++++++++-------- + 2 files changed, 137 insertions(+), 37 deletions(-) + +commit 7c27df1feeea1d6ab8b927285cecc4ac34db8b06 +Author: Alexander Larsson +Date: Fri Oct 2 09:48:35 2009 +0200 + + xdgmime - support cache files with minor version 2 + + gio/xdgmime/xdgmimecache.c | 10 ++++++++-- + 1 files changed, 8 insertions(+), 2 deletions(-) + +commit ce239a010e29c91f683dae354060f6ec6213e148 +Author: Alexander Larsson +Date: Fri Oct 2 09:46:33 2009 +0200 + + Read the new glob2 format with case sensitive flags + + gio/xdgmime/xdgmime.c | 4 +- + gio/xdgmime/xdgmimeglob.c | 83 + ++++++++++++++++++++++++++++++++------------ + gio/xdgmime/xdgmimeglob.h | 6 ++- + 3 files changed, 66 insertions(+), 27 deletions(-) + +commit 5e4a895bb37271169cb8c055d9ce1e3efe6ca525 +Author: Tor Lillqvist +Date: Fri Oct 2 12:43:21 2009 +0300 + + Drop the VS8 project files from tarballs as they are unmaintained + + build/win32/Makefile.am | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit e5734fb87563181ee9f1f2827cb49d81e8ea28a7 +Author: Pierre A. Joye +Date: Fri Oct 2 12:34:44 2009 +0300 + + Update VS9 project files to fix build + + From bug #596784 + + build/win32/vs9/gio.vcproj | 110 + +++++++++++++++++++++++++++- + build/win32/vs9/glib.vcproj | 10 ++- + build/win32/vs9/gmodule.vcproj | 2 +- + build/win32/vs9/gobject.vcproj | 2 +- + build/win32/vs9/gspawn-win32-helper.vcproj | 2 +- + build/win32/vs9/gthread.vcproj | 2 +- + build/win32/vs9/install.vcproj | 4 +- + 7 files changed, 122 insertions(+), 10 deletions(-) + +commit e9fe53980b0ce8480c483774961b93388f3a55fe +Author: Matthias Clasen +Date: Tue Sep 29 23:06:45 2009 -0400 + + Fix --runtime-libdir option + + For stable releases, it needs to take LT_REVISION into account, not + hardcode 0. + + gio/Makefile.am | 4 ++-- + glib/Makefile.am | 4 ++-- + gmodule/Makefile.am | 4 ++-- + gobject/Makefile.am | 4 ++-- + gthread/Makefile.am | 4 ++-- + 5 files changed, 10 insertions(+), 10 deletions(-) + +commit eeaf8c51209cbd11573adf6f6ba0d34f85920b1f +Author: Matthias Clasen +Date: Tue Sep 29 22:07:04 2009 -0400 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit fffc3d41bd0968c37fd3edddf35a555fe91151d3 +Author: Matthias Clasen +Date: Tue Sep 29 22:05:27 2009 -0400 + + 2.22.1 + + po/am.po | 58 ++-- + po/ar.po | 61 ++-- + po/as.po | 61 ++-- + po/az.po | 58 ++-- + po/be.po | 59 ++-- + po/be@latin.po | 61 ++-- + po/bg.po | 61 ++-- + po/bn.po | 932 + ++++++++++++++++++++++++++-------------------------- + po/bn_IN.po | 61 ++-- + po/bs.po | 58 ++-- + po/ca.po | 61 ++-- + po/ca@valencia.po | 61 ++-- + po/cs.po | 61 ++-- + po/cy.po | 59 ++-- + po/da.po | 61 ++-- + po/de.po | 61 ++-- + po/dz.po | 59 ++-- + po/el.po | 61 ++-- + po/en_CA.po | 61 ++-- + po/en_GB.po | 61 ++-- + po/eo.po | 58 ++-- + po/es.po | 61 ++-- + po/et.po | 61 ++-- + po/eu.po | 61 ++-- + po/fa.po | 59 ++-- + po/fi.po | 61 ++-- + po/fr.po | 61 ++-- + po/ga.po | 60 ++-- + po/gl.po | 61 ++-- + po/gu.po | 61 ++-- + po/he.po | 937 + ++++++++++++++++++++++++++--------------------------- + po/hi.po | 61 ++-- + po/hr.po | 58 ++-- + po/hu.po | 61 ++-- + po/hy.po | 58 ++-- + po/id.po | 59 ++-- + po/is.po | 58 ++-- + po/it.po | 61 ++-- + po/ja.po | 61 ++-- + po/ka.po | 59 ++-- + po/kn.po | 61 ++-- + po/ko.po | 61 ++-- + po/ku.po | 58 ++-- + po/lt.po | 61 ++-- + po/lv.po | 58 ++-- + po/mai.po | 61 ++-- + po/mg.po | 59 ++-- + po/mk.po | 61 ++-- + po/ml.po | 61 ++-- + po/mn.po | 59 ++-- + po/mr.po | 61 ++-- + po/ms.po | 58 ++-- + po/nb.po | 61 ++-- + po/ne.po | 59 ++-- + po/nl.po | 61 ++-- + po/nn.po | 61 ++-- + po/oc.po | 59 ++-- + po/or.po | 61 ++-- + po/pa.po | 61 ++-- + po/pl.po | 61 ++-- + po/ps.po | 61 ++-- + po/pt.po | 61 ++-- + po/pt_BR.po | 61 ++-- + po/ro.po | 61 ++-- + po/ru.po | 61 ++-- + po/rw.po | 58 ++-- + po/si.po | 59 ++-- + po/sk.po | 60 ++-- + po/sl.po | 61 ++-- + po/sq.po | 61 ++-- + po/sr.po | 61 ++-- + po/sr@ije.po | 58 ++-- + po/sr@latin.po | 61 ++-- + po/sv.po | 61 ++-- + po/ta.po | 61 ++-- + po/te.po | 61 ++-- + po/th.po | 61 ++-- + po/tl.po | 59 ++-- + po/tr.po | 61 ++-- + po/tt.po | 59 ++-- + po/uk.po | 61 ++-- + po/vi.po | 61 ++-- + po/wa.po | 58 ++-- + po/xh.po | 59 ++-- + po/yi.po | 58 ++-- + po/zh_CN.po | 61 ++-- + po/zh_HK.po | 61 ++-- + po/zh_TW.po | 61 ++-- + 88 files changed, 3278 insertions(+), 3765 deletions(-) + +commit 82c6bf7d8c6abeda6dff80e5b754411398232cc3 +Author: Matthias Clasen +Date: Tue Sep 29 21:16:53 2009 -0400 + + Updates + + NEWS | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +commit 0c88408218050b9a239e90d6585731aeb1a1c181 +Author: MiloÅ¡ Popović +Date: Wed Sep 30 03:05:31 2009 +0000 + + Updated Serbian translation + + po/sr.po | 3 --- + po/sr@latin.po | 3 --- + 2 files changed, 0 insertions(+), 6 deletions(-) + +commit b0adce8ab454c2c8e8da47019d510eac405e2452 +Author: MiloÅ¡ Popović +Date: Wed Sep 30 03:04:05 2009 +0000 + + Updated Serbian translation + + po/sr@latin.po | 11 +++++------ + 1 files changed, 5 insertions(+), 6 deletions(-) + +commit b38f091b99adf4326001d5218d9e52bd1df8d800 +Author: MiloÅ¡ Popović +Date: Wed Sep 30 03:02:15 2009 +0000 + + Updated Serbian translation + + po/sr.po | 279 + +++++++++++++++++++++++++++++--------------------------- + po/sr@latin.po | 273 + ++++++++++++++++++++++++++++--------------------------- + 2 files changed, 283 insertions(+), 269 deletions(-) + +commit 0c652dc66e09a358c738492e0eb857fef56c6254 +Author: Matthias Clasen +Date: Tue Sep 29 20:57:45 2009 -0400 + + Don't mark test files for translation + + As pointed out in bug 596064 + + po/POTFILES.in | 1 - + po/POTFILES.skip | 1 + + 2 files changed, 1 insertions(+), 1 deletions(-) + +commit 6555e0171d6f9619b0f49109868fe99162ffbb72 +Author: Matthias Clasen +Date: Tue Sep 29 20:52:26 2009 -0400 + + Fix mime_info_cache_dir_add_desktop_entries + + This function tried to avoid adding duplicate entries, but failed + due to using the wrong search function. See bug 595972. + + gio/gdesktopappinfo.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 2f93bea177a980b8ae750c07f3b269c9bea7ac25 +Author: Matthias Clasen +Date: Tue Sep 29 20:45:26 2009 -0400 + + Avoid a C99ism + + Move a variable declaration to the beginning of the block; see + bug 596561. Also remove a pointless register declaration. + + glib/gmessages.c | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit 442dadf3118cf3e2e9617461eb045f61483d58fc +Author: Matthias Clasen +Date: Tue Sep 29 20:39:39 2009 -0400 + + Improve docs for g_utf16_to_utf8 + + Document that g_utf16_to_utf8 does not validate the resulting + UTF-8 string. See bug 596314. + + glib/gutf8.c | 16 +++++++++++----- + 1 files changed, 11 insertions(+), 5 deletions(-) + +commit 5fdb169b72b749218766e507deab491c5f5b0d9e +Author: Matthias Clasen +Date: Tue Sep 29 20:33:39 2009 -0400 + + Clarify docs of g_async_result_get_source_object + + It returns a new reference. Reported in bug 596748 + + gio/gasyncresult.c | 11 ++++++----- + 1 files changed, 6 insertions(+), 5 deletions(-) + +commit 90e1308809805691713edf8f651e80a063f9b66f +Author: Alexander Larsson +Date: Tue Sep 29 11:25:13 2009 +0200 + + Avoid critical error in thread check if source is destroyed + + The source can be destroyed by the time we complete the result, and + then the g_source_get_context(current_source) call will cause + a critical error. We check for the source being destroyed and avoid + the check in that case. + + This means we miss the right-thread check in this case, but thats + merely a helper, so this is not critical. + + gio/gsimpleasyncresult.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 10c7b3a17e00283907139a19f1c6054f85a5d3a8 +Author: Jamil Ahmed +Date: Tue Sep 29 04:01:37 2009 +0700 + + Updated Bengali translation + + po/bn.po | 1967 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 951 insertions(+), 1016 deletions(-) + +commit 6f1ce483eb136159f42b7dde3aa4466ba3e874c1 +Author: Alexander Larsson +Date: Mon Sep 28 15:55:44 2009 +0200 + + Always report metadata on the path, not symlink target + + Metadata are really part of the pathname, not the target file + (as they are stored by pathname, and for many metadata like icon + position + etc make not sense using the target data). So, even if nofollow + is not specified we should not follow links for metadata. + + Ideally this should be implemented in the metadata extension in gvfs, + but the extension API does not allow this, so we do it in gio. + + See https://bugzilla.gnome.org/show_bug.cgi?id=593809 + + gio/glocalfileinfo.c | 11 +---------- + 1 files changed, 1 insertions(+), 10 deletions(-) + +commit 70027bf0928e7960c3ff78ce4a92aaad20ee899e +Author: Alexander Larsson +Date: Fri Sep 25 09:50:49 2009 +0200 + + Fix up cast in gdb macros + + We need to actually assign the casted value somewhere. + + glib/glib.py | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit e657dee578cc7b70c6a33fcb626e5d5aed4d82f3 +Author: Alexander Larsson +Date: Fri Sep 25 09:49:49 2009 +0200 + + Use right soname for gdb autoloaded python files + + We need to look at LT_REVISION too to get the right filename. + This was just hardcoded to zero before which is obviously wrong. + + glib/Makefile.am | 2 +- + gobject/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 660035479bc6583abc311cd4d43136fa447a95d6 +Author: Yaron Shahrabani +Date: Fri Sep 25 10:39:58 2009 +0300 + + Updated Hebrew translation + + po/he.po | 933 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 469 insertions(+), 464 deletions(-) + +commit cc95c60c69af5e25e9c9eae11f68ba2436a0e6b0 +Author: Matthias Clasen +Date: Thu Sep 24 10:26:46 2009 -0400 + + Fix location of gdb macros + + These files need to be put in a location that corresponds to the + location of the libraries, so we need to take the runtime-libdir + path into account. + + configure.in | 4 +++- + glib/Makefile.am | 4 ++-- + gobject/Makefile.am | 4 ++-- + 3 files changed, 7 insertions(+), 5 deletions(-) + +commit dcee4d4a66112a357626a6e2b1f749a24e41068a +Author: Matthias Clasen +Date: Tue Sep 22 17:10:32 2009 -0400 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit cc4970cf9426ae4c929ccd859585a29fb9d243c8 +Author: Josselin Mouette +Date: Wed Sep 23 18:39:45 2009 +0200 + + Fall back to inotify_init if inotify_init1 does not work + + This fixes monitoring failing to work when glib is built on a 2.6.27+ + kernel but run on an older one. + + http://bugs.debian.org/544354 + https://bugzilla.gnome.org/show_bug.cgi?id=593775 + + gio/inotify/inotify-kernel.c | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +commit 1a4763e6ef8e4da2a5118a00ce567e00704979cd +Author: Tor Lillqvist +Date: Wed Sep 23 09:33:48 2009 +0300 + + Parse libtoolize --version more carefully + + Some recent versions of libtoolize output a version blurb like: + libtoolize (GNU libtool 1.3110 2009-07-01) 2.2.7a + Don't get confused by the numbers inside the parens. + + autogen.sh | 5 ++++- + 1 files changed, 4 insertions(+), 1 deletions(-) + +commit 4c633ff0b58db039a29801d5039cc2756db90bbb +Author: Matthias Clasen +Date: Tue Sep 22 16:57:08 2009 -0400 + + 2.22.0 + + README.in | 2 +- + docs/reference/glib/tmpl/glib-unused.sgml | 67 -- + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/main.sgml | 7 + + docs/reference/glib/tmpl/testing.sgml | 21 + + docs/reference/glib/tmpl/version.sgml | 68 ++ + glib/Makefile.am | 9 +- + gobject/Makefile.am | 10 +- + po/am.po | 188 ++-- + po/ar.po | 188 ++-- + po/as.po | 219 +++--- + po/az.po | 188 ++-- + po/be.po | 188 ++-- + po/be@latin.po | 188 ++-- + po/bg.po | 915 ++++++++++---------- + po/bn.po | 188 ++-- + po/bn_IN.po | 965 +++++++++++---------- + po/bs.po | 188 ++-- + po/ca.po | 925 ++++++++++---------- + po/ca@valencia.po | 188 ++-- + po/cs.po | 915 ++++++++++---------- + po/cy.po | 188 ++-- + po/da.po | 925 ++++++++++---------- + po/de.po | 188 ++-- + po/dz.po | 188 ++-- + po/el.po | 1332 + ++++++++++++++--------------- + po/en_CA.po | 188 ++-- + po/en_GB.po | 925 ++++++++++---------- + po/eo.po | 188 ++-- + po/es.po | 923 ++++++++++---------- + po/et.po | 188 ++-- + po/eu.po | 188 ++-- + po/fa.po | 188 ++-- + po/fi.po | 925 ++++++++++---------- + po/fr.po | 188 ++-- + po/ga.po | 188 ++-- + po/gl.po | 920 ++++++++++---------- + po/gu.po | 947 ++++++++++---------- + po/he.po | 188 ++-- + po/hi.po | 944 ++++++++++---------- + po/hr.po | 188 ++-- + po/hu.po | 188 ++-- + po/hy.po | 188 ++-- + po/id.po | 188 ++-- + po/is.po | 188 ++-- + po/it.po | 188 ++-- + po/ja.po | 188 ++-- + po/ka.po | 188 ++-- + po/kn.po | 968 +++++++++++---------- + po/ko.po | 188 ++-- + po/ku.po | 188 ++-- + po/lt.po | 188 ++-- + po/lv.po | 188 ++-- + po/mai.po | 188 ++-- + po/mg.po | 188 ++-- + po/mk.po | 188 ++-- + po/ml.po | 979 +++++++++++----------- + po/mn.po | 188 ++-- + po/mr.po | 947 ++++++++++---------- + po/ms.po | 188 ++-- + po/nb.po | 917 ++++++++++---------- + po/ne.po | 188 ++-- + po/nl.po | 188 ++-- + po/nn.po | 188 ++-- + po/oc.po | 188 ++-- + po/or.po | 956 +++++++++++---------- + po/pa.po | 943 ++++++++++---------- + po/pl.po | 1339 + ++++++++++++++--------------- + po/ps.po | 188 ++-- + po/pt.po | 188 ++-- + po/pt_BR.po | 188 ++-- + po/ro.po | 926 ++++++++++---------- + po/ru.po | 188 ++-- + po/rw.po | 188 ++-- + po/si.po | 188 ++-- + po/sk.po | 188 ++-- + po/sl.po | 1280 + +++++++++++++-------------- + po/sq.po | 188 ++-- + po/sr.po | 931 ++++++++++---------- + po/sr@ije.po | 188 ++-- + po/sr@latin.po | 942 ++++++++++---------- + po/sv.po | 188 ++-- + po/ta.po | 950 ++++++++++---------- + po/te.po | 956 +++++++++++---------- + po/th.po | 188 ++-- + po/tl.po | 188 ++-- + po/tr.po | 188 ++-- + po/tt.po | 188 ++-- + po/uk.po | 917 ++++++++++---------- + po/vi.po | 188 ++-- + po/wa.po | 188 ++-- + po/xh.po | 188 ++-- + po/yi.po | 188 ++-- + po/zh_CN.po | 926 ++++++++++---------- + po/zh_HK.po | 938 ++++++++++---------- + po/zh_TW.po | 923 ++++++++++---------- + 96 files changed, 19793 insertions(+), 19818 deletions(-) + +commit 9203da305b1c840ebafe7d95f2e937348be0f333 +Author: Matthias Clasen +Date: Tue Sep 22 12:36:50 2009 -0400 + + some doc updates + + docs/reference/glib/glib-sections.txt | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 3413e758eb4fb15559e9da1b38efd59fcca81401 +Author: Matthias Clasen +Date: Tue Sep 22 10:37:05 2009 -0400 + + Updates + + NEWS | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 50 insertions(+), 0 deletions(-) + +commit 74326a38658ebb9dbd59c9d8899a0bbb646301e5 +Author: Matthias Clasen +Date: Tue Sep 22 09:41:04 2009 -0400 + + Set version to 2.22.0 + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 01ccc9e3bac498e714087b2be543442aa2eadcaa +Author: Matej Urbančič +Date: Tue Sep 22 12:21:02 2009 +0200 + + Updated Slovenian translation + + po/sl.po | 9 ++++----- + 1 files changed, 4 insertions(+), 5 deletions(-) + +commit 1c46514d5e072f3baee0145798e023610e895ab2 +Author: Matej Urbančič +Date: Tue Sep 22 12:15:38 2009 +0200 + + Updated Slovenian translation + + po/sl.po | 1439 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 740 insertions(+), 699 deletions(-) + +commit c755a7fd11ca5f865f6ccd477e0f4db3799161fa +Author: Mart Raudsepp +Date: Sun Sep 13 04:42:33 2009 +0300 + + gio: Fix some typos in G*AppInfo documentation + + gio/gappinfo.c | 10 +++++----- + gio/gappinfo.h | 4 ++-- + gio/gdesktopappinfo.c | 8 ++++---- + 3 files changed, 11 insertions(+), 11 deletions(-) + +commit 924f1bc528b212aab91adf608ef32e41b67f3298 +Author: Mart Raudsepp +Date: Sun Sep 13 00:20:01 2009 +0300 + + Accept -? for glib-mkenums. + + Commit 789e260638d tried to add support for -?, but there is a typo + and instead -h was added when already present instead of -? for one + of the cases. + It works without this corrections, because all unrecognized options + trigger usage showing as well, but this is more correct. + + This was bug 556706 originally. + + gobject/glib-mkenums.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 6c061da2a232d8c817d9744a234ceee7b87b3dd8 +Author: Mart Raudsepp +Date: Sat Sep 12 19:49:01 2009 +0300 + + gio: Fix a Since tag to actually show up in new API of 2.20 indeces + + Typo made in e05426062 + + gio/gdatainputstream.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 7feb4c3631a0745b3696454630be3aa3365d1067 +Author: Nguyễn Thái Ngọc Duy +Date: Tue Sep 22 09:59:13 2009 +0700 + + po/vi.po: fix type "thoạt" + + po/vi.po | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit a830fbd62c05193982c72a375251b2202986152f +Author: Alexander Larsson +Date: Mon Sep 21 15:36:45 2009 +0200 + + Document new gdb macros + + docs/reference/glib/running.sgml | 34 + ++++++++++++++++++++++++++++++++++ + 1 files changed, 34 insertions(+), 0 deletions(-) + +commit 42320706c4dd6a4517a402dc5da5c27dfc6a5356 +Author: Alexander Larsson +Date: Mon Sep 21 15:21:52 2009 +0200 + + Add gforeach gdb command + + glib/glib.py | 84 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 84 insertions(+), 0 deletions(-) + +commit 2b8943237f137f287b0b0854f80198de54fd26ea +Author: Alexander Larsson +Date: Mon Sep 21 12:26:23 2009 +0200 + + Add pretty printer for hashtables + + glib/glib.py | 64 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 64 insertions(+), 0 deletions(-) + +commit 2e8768d9a556afd2b2e6c974dcbcf24fee5ba6ff +Author: Alexander Larsson +Date: Mon Sep 21 11:06:39 2009 +0200 + + Add pretty printing for GList and GSList + + glib/glib.py | 77 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 77 insertions(+), 0 deletions(-) + +commit efe9169234e226f594b4254618f35a139338c35f +Author: Alexander Larsson +Date: Fri Sep 18 17:15:32 2009 +0200 + + Initial support for gdb python macros + + This includes support for gobject pointer pretty printing and + signal frame compression in backtraces. + + https://bugzilla.gnome.org/show_bug.cgi?id=595619 + + glib/Makefile.am | 13 ++- + glib/glib.py | 27 ++++ + glib/libglib-gdb.py.in | 10 ++ + gobject/Makefile.am | 12 ++- + gobject/gobject.py | 305 + ++++++++++++++++++++++++++++++++++++++++++ + gobject/libgobject-gdb.py.in | 10 ++ + 6 files changed, 375 insertions(+), 2 deletions(-) + +commit 18af48ba9a347e2041c4986aaaac73fdd5386de3 +Author: Chao-Hsiung Liao +Date: Mon Sep 21 20:54:02 2009 +0800 + + Updated Traditional Chinese translation(Hong Kong and Taiwan) + + po/zh_HK.po | 945 + +++++++++++++++++++++++++++++------------------------------ + po/zh_TW.po | 930 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 938 insertions(+), 937 deletions(-) + +commit 652f47fd2a9544e07cd6cbc5ca0d31d21c1ccd34 +Author: Petr Kovar +Date: Sun Sep 20 22:26:17 2009 +0200 + + Updated Czech translation + + po/cs.po | 921 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 464 insertions(+), 457 deletions(-) + +commit 5b30a46da4eadbd620f34e66e7b981f2dfe91a4f +Author: Ani +Date: Sun Sep 20 21:04:45 2009 +0530 + + Updated Malayalam Translations + + po/ml.po | 150 + +++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 76 insertions(+), 74 deletions(-) + +commit 7a010ac2d409fc7ea849034ca7a5bda150ee0fad +Author: Gil Forcada +Date: Sat Sep 19 18:04:56 2009 +0200 + + Updated Catalan translation + + po/ca.po | 1088 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 540 insertions(+), 548 deletions(-) + +commit 80f66b114193d3c1b5a5c5d4f34b01cba53208ca +Author: Paolo Borelli +Date: Sat Sep 19 10:21:36 2009 +0200 + + Fix build with srcdir != builddir, bug #594597 + + gio/win32/Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 8b3853b8a1cc94767c5391808274f931a48f6cbb +Author: Matthias Clasen +Date: Fri Sep 18 19:16:11 2009 -0400 + + Reduce false positives in static analysis + + Tools like clang fail to recognize that stanzas like + g_return_if_fail (GTK_IS_FOO (w)) guarantee w != NULL. By minimally + rewriting the type-checking macros, we can avoid these false + positives. + + gobject/gtype.h | 12 +++++++++--- + 1 files changed, 9 insertions(+), 3 deletions(-) + +commit 53fc10d2695f917db530c9a3f166e45be59d1d3a +Author: Matthias Clasen +Date: Wed Sep 9 00:18:23 2009 -0400 + + Fix a lot of clang complaints + + Mostly dead assignments. + + gio/gbufferedoutputstream.c | 9 ++------- + gio/gdatainputstream.c | 7 +------ + gio/gdummyfile.c | 5 +---- + gio/ginputstream.c | 16 +++++----------- + gio/giostream.c | 4 ---- + gio/glocalfile.c | 20 ++++++++------------ + gio/glocalfileinputstream.c | 4 ---- + gio/goutputstream.c | 34 +++++++++++++++------------------- + gio/gunixinputstream.c | 4 ---- + gio/gunixoutputstream.c | 4 ---- + glib/gfileutils.c | 3 +-- + glib/gkeyfile.c | 3 +-- + glib/gregex.c | 6 +----- + 13 files changed, 35 insertions(+), 84 deletions(-) + +commit 04d632ccf59ce0491261ff87b3867012cb56d8bf +Author: Dumitru Mișu Moldovan +Date: Fri Sep 18 00:17:32 2009 +0300 + + Updated Romanian translation + + po/ro.po | 1086 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 536 insertions(+), 550 deletions(-) + +commit 3bfba7924c94aa3a3bcc14e6eeee4fa691108dd0 +Author: MiloÅ¡ Popović +Date: Thu Sep 17 17:58:52 2009 +0000 + + Updated Serbian translation + + po/sr.po | 1381 + +++++++++++++++++++++++++++---------------------------- + po/sr@latin.po | 1392 + +++++++++++++++++++++++++++----------------------------- + 2 files changed, 1351 insertions(+), 1422 deletions(-) + +commit dd7f660fb7b059d16cea6e33550a14ca2625c813 +Author: krishnababu k +Date: Thu Sep 17 21:18:57 2009 +0530 + + Updated Telugu Translation + + po/te.po | 960 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 475 insertions(+), 485 deletions(-) + +commit 256662ddbaec90688c1725d504efc1248eacb7e1 +Author: ifelix +Date: Thu Sep 17 15:50:19 2009 +0530 + + Updated Tamil Translations + + po/ta.po | 961 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 477 insertions(+), 484 deletions(-) + +commit 78c548b506db0527335011ce92558bc1a9d5ebf0 +Author: Fran Diéguez +Date: Wed Sep 16 16:15:05 2009 +0200 + + UPdated Galician Translation + + po/gl.po | 946 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 472 insertions(+), 474 deletions(-) + +commit d88b6a3d60f0f84cf192c1b4093a0ae2362d7f02 +Author: Runa Bhattacharjee +Date: Tue Sep 15 18:31:49 2009 +0530 + + Updated Bengali India Translations + + po/bn_IN.po | 1097 + +++++++++++++++++++++++++++++------------------------------ + 1 files changed, 536 insertions(+), 561 deletions(-) + +commit 011592af55d980cfb21c51f5d4bcdd09cce865ec +Author: Manoj Kumar Giri +Date: Tue Sep 15 16:22:41 2009 +0530 + + Upadted Oriya Translation + + po/or.po | 964 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 477 insertions(+), 487 deletions(-) + +commit ddc85a8b0242407c6234bbe2ebc49b873bf02396 +Author: Theppitak Karoonboonyanan +Date: Tue Sep 15 14:29:36 2009 +0700 + + Updated Thai translation. + + po/th.po | 5 ++--- + 1 files changed, 2 insertions(+), 3 deletions(-) + +commit 3a240a7f718a44724008d35123c6f7b98abc896a +Author: Amitakhya Phukan +Date: Tue Sep 15 12:48:50 2009 +0530 + + Updating Assamese translations. + + po/as.po | 42 ++++++++++++++++-------------------------- + 1 files changed, 16 insertions(+), 26 deletions(-) + +commit ef5e66c330cdc3f8d93ba33a0dfe251f98883204 +Author: Kjartan Maraas +Date: Mon Sep 14 00:16:51 2009 +0200 + + Update Norwegian bokmÃ¥l translation. + + po/nb.po | 924 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 465 insertions(+), 459 deletions(-) + +commit 220bde833af1bba3e535f727173b84a362374399 +Author: Aron Xu +Date: Sun Sep 13 15:09:29 2009 +0800 + + Updated Simplified Chinese translation. + + po/zh_CN.po | 1082 + +++++++++++++++++++++++++++++------------------------------ + 1 files changed, 540 insertions(+), 542 deletions(-) + +commit 7e514b6efaf6daae23c09a1e13ed65d2d8aa8008 +Author: A S Alam +Date: Sun Sep 13 08:58:57 2009 +0530 + + Updating Translation for Punjabi + + po/pa.po | 956 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 474 insertions(+), 482 deletions(-) + +commit e1957bd71c999ba5189a7fe94880647e84fa6357 +Author: Ask H. Larsen +Date: Sun Sep 13 03:16:47 2009 +0200 + + Updated Danish translation + + po/da.po | 930 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 467 insertions(+), 463 deletions(-) + +commit 6366015decc608a74e2019ccb0d39dbc6e3f06ba +Author: Bruce Cowan +Date: Sat Sep 12 20:04:29 2009 +0100 + + Updated British English translation + + po/en_GB.po | 1120 + +++++++++++++++++++++++++++++------------------------------ + 1 files changed, 556 insertions(+), 564 deletions(-) + +commit a92f10d712b6278364e02178c873a084bfbf9e19 +Author: Tommi Vainikainen +Date: Sat Sep 12 19:10:57 2009 +0300 + + Updated Finnish translation + + po/fi.po | 930 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 467 insertions(+), 463 deletions(-) + +commit 410305255d0acfa5e105a444cdf8b302b31b94a2 +Author: Tor Lillqvist +Date: Sat Sep 12 01:57:46 2009 +0300 + + Remove old crap for fetching the "build" directory from svn + + autogen.sh | 17 ----------------- + 1 files changed, 0 insertions(+), 17 deletions(-) + +commit 866731776651e04178a6cc1e78d244384a890d1a +Author: Sjoerd Simons +Date: Wed Sep 2 17:48:09 2009 +0100 + + Fix GNetworkAddress skipping addresses when enumerating + + g_network_address_address_enumerator_next_finish takes the first + item of the + address list and moves the pointer to the next one, so we shouldn't + do the same + in g_network_address_address_enumerator_next_async function + + Fixes bug #593941 + + gio/gnetworkaddress.c | 5 ----- + 1 files changed, 0 insertions(+), 5 deletions(-) + +commit cdd04f36cac838f92826cbf415868100a4007741 +Author: Richard Hughes +Date: Wed Sep 2 19:15:38 2009 +0100 + + Make the error const for g_simple_async_result_set_from_error + + gio/gsimpleasyncresult.c | 2 +- + gio/gsimpleasyncresult.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 11477609d1f2782fd4bbb3022d2ec46983930c6a +Author: James Hunt +Date: Thu Sep 10 17:18:13 2009 +0100 + + g_socket_send_message() fails due to invalid sendmsg(2) params. + + g_socket_send_message() and g_socket_send_to() fail with ENOBUFS or + EFAULT due to the fact that if no "address" argument is specified to + g_socket_send_message, when g_socket_send_message() calls sendmsg(2), + the 2nd parameter to sendmsg ("const struct msghdr *msg") contains + uninitialized values. The fix is simple - initialize msg.msg_name to + NULL and msg.msg_msg_namelen to 0. + + https://bugzilla.gnome.org/show_bug.cgi?id=594759 + + gio/gsocket.c | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +commit 29baa5eebdce27d10c6f36ae8ad4fbc77d04f291 +Author: Rajesh Ranjan +Date: Fri Sep 11 16:00:29 2009 +0530 + + hindi update by Rajesh Ranjan + + po/hi.po | 948 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 471 insertions(+), 477 deletions(-) + +commit 9dc9b39284b78b63fad4a713ab6ea4154d4e8ff5 +Author: Ani +Date: Fri Sep 11 12:18:50 2009 +0530 + + Updated Malayalam Translations + + po/ml.po | 976 + ++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 480 insertions(+), 496 deletions(-) + +commit c3bbec5213d1e77253fd2cef67d6838041bb2f1f +Author: Maxim V. Dziumanenko +Date: Fri Sep 11 01:48:56 2009 +0300 + + Updated Ukrainian translation + + po/uk.po | 1104 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 520 insertions(+), 584 deletions(-) + +commit 278ac0a45d2b677a0928b1c31b3e20a4c265ffb0 +Author: Christian Dywan +Date: Thu Sep 10 16:40:11 2009 +0200 + + Bug 579050 Allow making selected critical and warning messages + non-fatal + + Implement g_test_log_set_fatal_handler which is a function similar to + g_log_set_default_handler but for use in unit tests where certain + errors have to be ignored because it is not possible to fix or avoid + them otherwise. A unit test is added. + + glib/glib.symbols | 3 +++ + glib/gmessages.c | 47 + +++++++++++++++++++++++++++++++++++++++++++++-- + glib/gtestutils.c | 1 + + glib/gtestutils.h | 21 +++++++++++++++++++++ + glib/tests/testing.c | 27 +++++++++++++++++++++++++++ + 5 files changed, 97 insertions(+), 2 deletions(-) + +commit 4b1217b7e0e8d2e7e4187e8b328e10ad72066392 +Author: Shankar Prasad +Date: Thu Sep 10 12:26:13 2009 +0530 + + Updated Kannada(kn) translation + + po/kn.po | 973 + ++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 479 insertions(+), 494 deletions(-) + +commit 664dd256654b5def0bd6cdd5e3918bba78fedd52 +Author: Kostas Papadimas +Date: Wed Sep 9 18:38:12 2009 +0300 + + Updated Greek translation. + + po/el.po | 1391 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 708 insertions(+), 683 deletions(-) + +commit 593cd7a683c267e9e02e3d0b8bc653a253f17df5 +Author: Sweta Kothari +Date: Wed Sep 9 16:54:43 2009 +0530 + + Updated Gujarati Translations + + po/gu.po | 952 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 472 insertions(+), 480 deletions(-) + +commit f393e805874db16334c5c4f4aa7fa1c73964ca34 +Author: Dan Winship +Date: Tue Sep 8 11:19:13 2009 -0400 + + Clarify g_ptr_array_set_size() docs re: free_func + + docs/reference/glib/tmpl/arrays_pointer.sgml | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +commit eadd2ce7fff83f86c4803aa5e2e251f554639bb6 +Author: Alexander Shopov +Date: Tue Sep 8 07:41:28 2009 +0300 + + Updated Bulgarian translation + + po/bg.po | 926 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 466 insertions(+), 460 deletions(-) + +commit bc1dd5cf11dc920ff44d51051e1e695b0b8ea421 +Author: Dan Winship +Date: Sun Sep 6 13:54:50 2009 -0400 + + Call element_free_func when shrinking array with g_ptr_array_set_size + + glib/garray.c | 8 ++------ + glib/tests/array-test.c | 4 +++- + 2 files changed, 5 insertions(+), 7 deletions(-) + +commit 9a29f087e76fd01188cff73ce1dfe802bd815b15 +Author: Sandeep Shedmake +Date: Mon Sep 7 19:14:52 2009 +0530 + + Updated Marathi Translations + + po/mr.po | 952 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 472 insertions(+), 480 deletions(-) + +commit 8af494d987b7482865439f882d1375767b57732f +Author: Alexander Larsson +Date: Mon Sep 7 12:50:58 2009 +0200 + + Avoid reading uninitialized memory + + If the statfs call fails, don't look at the result. + + gio/glocalfile.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 06de24f430d4b43733dec63ca0b840d129a716e2 +Author: Alexander Larsson +Date: Mon Sep 7 10:25:14 2009 +0200 + + Remove warning in g_simple_async_result_complete + + This warning hits code that uses GSimpleAsyncResult outside of a + mainloop as a helper object. For instance EggDBus does this. + Since the bugs this warning would fix are pretty easy to spot + and since EggDBus is deployed already we just remove the + "called from outside main loop" warning. + + However, we need to keep the "called from wrong context" warning + as that is very helpful when debugging misuse of the new multiple + main context code. + + gio/gsimpleasyncresult.c | 2 -- + 1 files changed, 0 insertions(+), 2 deletions(-) + +commit 034d516160ffacbb805ad28cfdb848134f26c1dc +Author: Matthias Clasen +Date: Mon Sep 7 03:28:35 2009 -0400 + + Another dead assignment + + gio/gmemoryoutputstream.c | 6 +----- + 1 files changed, 1 insertions(+), 5 deletions(-) + +commit 6cda9bfb02314fff5e994a80164be16c67d14253 +Author: Matthias Clasen +Date: Mon Sep 7 03:14:15 2009 -0400 + + Remove a dead initialization + + gio/gthemedicon.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 30645bd0a584137585d572b37f39d2904bba0a8f +Author: Matthias Clasen +Date: Mon Sep 7 03:12:06 2009 -0400 + + Remove a dead increment + + gio/glocalfileinfo.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 0d1ffbf361503ac1f8236673f400e0f317635930 +Author: Matthias Clasen +Date: Mon Sep 7 03:10:01 2009 -0400 + + Remove another dead assignment + + gio/gdatainputstream.c | 4 +--- + 1 files changed, 1 insertions(+), 3 deletions(-) + +commit f2c8572d8490544496934612854a86fecbaf99ba +Author: Matthias Clasen +Date: Mon Sep 7 03:07:22 2009 -0400 + + Remmove a dead assignment. + + Spotted by clang. + + gio/gbufferedinputstream.c | 4 +--- + 1 files changed, 1 insertions(+), 3 deletions(-) + +commit 1ec32c403bac36ca9f72e82c23b14045bc323931 +Author: Matthias Clasen +Date: Mon Sep 7 03:02:58 2009 -0400 + + Move a assignment to the relevant #ifdef branch + + Dead code spotted by clang. + + gio/gcancellable.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit e67c3cf2b0251acfca74d680d9b4c2b7547c61a7 +Author: Matthias Clasen +Date: Mon Sep 7 03:01:02 2009 -0400 + + Remove dead code + + gio/gvolumemonitor.c | 4 ---- + 1 files changed, 0 insertions(+), 4 deletions(-) + +commit 80fd5ed402bf57a3c5cbd90eecc3f58f3f06bc08 +Author: Matthias Clasen +Date: Mon Sep 7 02:50:51 2009 -0400 + + Don't evaluate an uninitialized value + + Bug found by clang. + + gio/gdesktopappinfo.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 7ea8a2a86326b6f5f0f62a334fdd307d6526f782 +Author: Tomasz Dominikowski +Date: Sun Sep 6 14:20:45 2009 +0200 + + Updated Polish translation + + po/pl.po | 1346 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 687 insertions(+), 659 deletions(-) + +commit 93fbae22d4d6fddf69c2b7276f24fcc3cfcf0403 +Author: Takayuki KUSANO +Date: Sat Sep 5 22:34:58 2009 +0900 + + Update Japanese translation + + po/ja.po | 7 +++---- + 1 files changed, 3 insertions(+), 4 deletions(-) + +commit 6b406dda7b3061bd890878823fbafe2c6ffc019a +Author: Jorge González +Date: Sat Sep 5 13:47:41 2009 +0200 + + Updated Spanish translation + + po/es.po | 930 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 465 insertions(+), 465 deletions(-) + +commit e77b8278841d89f9e2c82e09b844a472496ab43e +Author: Matthias Clasen +Date: Fri Sep 4 21:20:09 2009 -0400 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 296d481c7e5de27175e68ff7645975442a449fc5 +Author: Matthias Clasen +Date: Fri Sep 4 21:19:02 2009 -0400 + + 2.21.6 + + po/am.po | 75 ++-- + po/ar.po | 75 ++-- + po/as.po | 957 ++++++++++++++++++++------------------- + po/az.po | 75 ++-- + po/be.po | 77 ++-- + po/be@latin.po | 77 ++-- + po/bg.po | 75 ++-- + po/bn.po | 75 ++-- + po/bn_IN.po | 75 ++-- + po/bs.po | 75 ++-- + po/ca.po | 75 ++-- + po/ca@valencia.po | 75 ++-- + po/cs.po | 918 +++++++++++++++++++------------------- + po/cy.po | 75 ++-- + po/da.po | 75 ++-- + po/de.po | 925 +++++++++++++++++++------------------- + po/dz.po | 75 ++-- + po/el.po | 76 ++-- + po/en_CA.po | 75 ++-- + po/en_GB.po | 75 ++-- + po/eo.po | 75 ++-- + po/es.po | 75 ++-- + po/et.po | 464 +++++++++++++++++++- + po/eu.po | 978 ++++++++++++++++++++------------------- + po/fa.po | 75 ++-- + po/fi.po | 75 ++-- + po/fr.po | 920 +++++++++++++++++++------------------- + po/ga.po | 75 ++-- + po/gl.po | 75 ++-- + po/gu.po | 75 ++-- + po/he.po | 75 ++-- + po/hi.po | 75 ++-- + po/hr.po | 75 ++-- + po/hu.po | 134 ++++--- + po/hy.po | 75 ++-- + po/id.po | 75 ++-- + po/is.po | 75 ++-- + po/it.po | 923 +++++++++++++++++++------------------- + po/ja.po | 75 ++-- + po/ka.po | 75 ++-- + po/kn.po | 971 ++++++++++++++++++++------------------- + po/ko.po | 75 ++-- + po/ku.po | 75 ++-- + po/lt.po | 75 ++-- + po/lv.po | 75 ++-- + po/mai.po | 75 ++-- + po/mg.po | 75 ++-- + po/mk.po | 75 ++-- + po/ml.po | 974 ++++++++++++++++++++------------------- + po/mn.po | 75 ++-- + po/mr.po | 950 ++++++++++++++++++++------------------- + po/ms.po | 75 ++-- + po/nb.po | 918 +++++++++++++++++++------------------- + po/ne.po | 75 ++-- + po/nl.po | 75 ++-- + po/nn.po | 75 ++-- + po/oc.po | 74 ++-- + po/or.po | 109 +++-- + po/pa.po | 75 ++-- + po/pl.po | 75 ++-- + po/ps.po | 75 ++-- + po/pt.po | 925 +++++++++++++++++++------------------- + po/pt_BR.po | 925 +++++++++++++++++++------------------- + po/ro.po | 75 ++-- + po/ru.po | 75 ++-- + po/rw.po | 75 ++-- + po/si.po | 75 ++-- + po/sk.po | 75 ++-- + po/sl.po | 75 ++-- + po/sq.po | 76 ++-- + po/sr.po | 75 ++-- + po/sr@ije.po | 75 ++-- + po/sr@latin.po | 75 ++-- + po/sv.po | 1312 + ++++++++++++++++++++++++++--------------------------- + po/ta.po | 950 ++++++++++++++++++++------------------- + po/te.po | 959 ++++++++++++++++++++------------------- + po/th.po | 75 ++-- + po/tl.po | 75 ++-- + po/tr.po | 922 +++++++++++++++++++------------------- + po/tt.po | 75 ++-- + po/uk.po | 75 ++-- + po/vi.po | 75 ++-- + po/wa.po | 75 ++-- + po/xh.po | 75 ++-- + po/yi.po | 75 ++-- + po/zh_CN.po | 75 ++-- + po/zh_HK.po | 75 ++-- + po/zh_TW.po | 75 ++-- + 88 files changed, 11117 insertions(+), 10197 deletions(-) + +commit 05c2aeaf33ad1ff3447d57a361abdb238b8f822b +Author: Matthias Clasen +Date: Fri Sep 4 20:41:25 2009 -0400 + + Add a Since: tag + + glib/gfileutils.c | 20 +++++++++++--------- + 1 files changed, 11 insertions(+), 9 deletions(-) + +commit 2ae69f5124022d93dfc0e39964bbf68eb1f61245 +Author: Matthias Clasen +Date: Fri Sep 4 20:26:26 2009 -0400 + + Updates + + NEWS | 35 +++++++++++++++++++++++++++++++++++ + 1 files changed, 35 insertions(+), 0 deletions(-) + +commit 4114f1214c65f0a142678bf98b1d8e4da43bf665 +Author: Benjamin Otte +Date: Thu Sep 3 15:39:57 2009 +0200 + + Bug 594034 - Use g_mkstemp_full() when creating the replacement file + + Previous code used g_mkstemp(). But when using + G_FILE_CREATE_REPLACE_DESTINATION, no attempt was made to ensure + proper + mode and flags of the created temporary file. The visible issue + was that + the file was always created with mode 0600 as opposed to using 0666. + (The invisible issue was that O_RDWR was used instead of O_WRONLY.) + + docs/reference/glib/tmpl/glib-unused.sgml | 67 + ++++++++++++++++++++++++++++ + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/misc_utils.sgml | 7 +++ + docs/reference/glib/tmpl/version.sgml | 68 + ----------------------------- + gio/glocalfileoutputstream.c | 2 +- + 5 files changed, 77 insertions(+), 72 deletions(-) + +commit 24bec5c5bd64eb829a433e4c1e8d34dc25879a64 +Author: Benjamin Otte +Date: Thu Sep 3 15:36:37 2009 +0200 + + Bug 594034 - Add g_mkstemp_full() + + This function exposes more variables than g_mkstemp() and therefor + allows more flexibility when creating temporary files. + The intended use is gio's code for g_file_replace() (see next patch) + + docs/reference/glib/glib-sections.txt | 1 + + docs/reference/glib/tmpl/fileutils.sgml | 11 +++++++ + glib/gfileutils.c | 44 + ++++++++++++++++++++++++------- + glib/gfileutils.h | 3 ++ + glib/glib.symbols | 1 + + 5 files changed, 50 insertions(+), 10 deletions(-) + +commit 16ddefea15ceeded936c53aa1b867eb53d7d97f3 +Author: Ivar Smolin +Date: Fri Sep 4 18:58:00 2009 +0300 + + Updating Estonian translation + + po/et.po | 472 + ++------------------------------------------------------------ + 1 files changed, 9 insertions(+), 463 deletions(-) + +commit c642965b234cdc9959c79d2fd3019f63a0520fad +Author: Christian Kirbach +Date: Fri Sep 4 15:16:04 2009 +0200 + + Updated German translation + + po/de.po | 1185 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 592 insertions(+), 593 deletions(-) + +commit c77fd0bb04f612e7d16d48379cc3ec835c8d5fa2 +Author: Daniel Nylander +Date: Fri Sep 4 06:31:34 2009 +0200 + + Updated Swedish translation + + po/sv.po | 1316 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 672 insertions(+), 644 deletions(-) + +commit 7628e1b4773142fc89f2365069c3e5a59ffb15ab +Author: Claude Paroz +Date: Fri Sep 4 00:07:40 2009 +0200 + + Updated French translation + + po/fr.po | 924 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 464 insertions(+), 460 deletions(-) + +commit 5a66c4bdb76b853b05baf7b01c8e2be49022c8a6 +Author: Fábio Nogueira +Date: Wed Sep 2 12:28:59 2009 -0400 + + Updated Brazilian Portuguese translation. + + po/pt_BR.po | 933 + ++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 472 insertions(+), 461 deletions(-) + +commit de125e51a04a5ebdc652fb4e611a5bd1ba57c210 +Author: Inaki Larranaga Murgoitio +Date: Wed Sep 2 18:19:27 2009 +0200 + + Updated Basque language + + po/eu.po | 982 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 484 insertions(+), 498 deletions(-) + +commit ff9b29ce5b7d8bd20d4527e2e364b68ebce01c75 +Author: Gabor Kelemen +Date: Wed Sep 2 18:05:23 2009 +0200 + + Hungarian translation updated + + po/hu.po | 335 + +++++++++++++++++++++---------------------------------------- + 1 files changed, 115 insertions(+), 220 deletions(-) + +commit f2320a40f1d356ba7f15e592c03018ba2b42c4bd +Author: Duarte Loreto +Date: Tue Sep 1 23:34:41 2009 +0100 + + Updated Portuguese translation + + po/pt.po | 929 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 469 insertions(+), 460 deletions(-) + +commit f783515323963d2f9011cab5b6b2e767fe790425 +Author: Luca Ferretti +Date: Tue Sep 1 23:47:14 2009 +0200 + + Updated Italian translation + + po/it.po | 30 +++++++++++++++++------------- + 1 files changed, 17 insertions(+), 13 deletions(-) + +commit 3826963e65d8c4c68bcd3e4066505f63ef734b95 +Author: Benjamin Otte +Date: Tue Sep 1 21:53:35 2009 +0200 + + Use lchmod instead of stat + chown if available + + Fallout of the NOFLOOW_SYMLINKS fix from bug 593406 + + configure.in | 2 +- + gio/glocalfileinfo.c | 10 +++++++--- + 2 files changed, 8 insertions(+), 4 deletions(-) + +commit 48e0af0157f52ac12b904bd92540432a18b139c7 +Author: Benjamin Otte +Date: Tue Sep 1 21:26:08 2009 +0200 + + Bug 593406 - Permissions set to 777 after copying via Nautilus + + Only fail to set the permissions when the actual file is a symlink. + The previous fix failed for every file when NOFOLLOW_SYMLINKS was set. + + gio/glocalfileinfo.c | 21 ++++++++++++++++----- + 1 files changed, 16 insertions(+), 5 deletions(-) + +commit bb7852e34b1845e516290e1b45a960a345ee8a43 +Author: Benjamin Otte +Date: Tue Sep 1 20:36:31 2009 +0200 + + Only do the chmod NOFOLLOW_SYMLINK checks with HAVE_SYMLINK + + gio/glocalfileinfo.c | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +commit 8212aadac79d70153d880fe1f21914a2b491dca3 +Author: Dan Winship +Date: Tue Sep 1 09:37:48 2009 -0400 + + g_time_val_from_iso8601: handle timezoneless dates + + per ISO 8601:2004 4.2.5.2 + + Based on a patch from Andy Shevchenko + http://bugzilla.gnome.org/show_bug.cgi?id=589491 + + glib/gtimer.c | 18 +++++++++++++----- + tests/testglib.c | 21 +++++++++++++++++++++ + 2 files changed, 34 insertions(+), 5 deletions(-) + +commit fc44bf40a4eff8e122b223e97ee5efcbc548be03 +Author: Benjamin Otte +Date: Tue Sep 1 12:48:55 2009 +0200 + + Fix gtk-doc syntax + + gio/gcancellable.c | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +commit e695c0932f5d02f3b222f0b7a3de1f8c00ba7b81 +Author: Benjamin Otte +Date: Tue Sep 1 11:54:48 2009 +0200 + + Bug 593406 - Permissions set to 777 after copying via Nautilus + + When doing a g_file_copy() with nofollow-symlinks (to copy a link for + example), the later copying of the file attributes copies the source + links 777 attributes to the target's attributes. As chmod affects the + symlink target, this would cause such copies to always set the + target to + 777 mode. + + This patch makes setting the mode with nofollow-symlinks fail with + NOT_SUPPORTED. + + The aforementioned g_file_copy() will still succeed, because it + ignores + errors of the attribute copy. + + gio/glocalfileinfo.c | 12 ++++++++++-- + 1 files changed, 10 insertions(+), 2 deletions(-) + +commit e967a47117d3b8fdb3e5c786e9069872d8e787c4 +Author: Kjartan Maraas +Date: Tue Sep 1 10:52:07 2009 +0200 + + Update Norwegian bokmÃ¥l translation. + + po/nb.po | 920 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 464 insertions(+), 456 deletions(-) + +commit c433158e8676424ede4e396b6d4bf22d5210634b +Author: Sandeep Shedmake +Date: Mon Aug 31 20:47:13 2009 +0530 + + Updated Marathi Translations + + po/mr.po | 68 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 34 insertions(+), 34 deletions(-) + +commit c59dbb4ddfb824c022087d15d75d3f5de1c032cc +Author: Sandeep Shedmake +Date: Mon Aug 31 20:29:16 2009 +0530 + + Updated Marathi Translations + + po/mr.po | 1145 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 528 insertions(+), 617 deletions(-) + +commit ee8e145472c9b90e89d568710b9672bb20ada524 +Author: krishnababu k +Date: Mon Aug 31 19:41:54 2009 +0530 + + Updated Telugu Translations + + po/te.po | 1185 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 547 insertions(+), 638 deletions(-) + +commit 3a7560b00a8846150be4d9d2113f352ff1ebcc7a +Author: Shankar Prasad +Date: Mon Aug 31 13:34:44 2009 +0530 + + Updated Kannada(kn) translation + + po/kn.po | 1188 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 546 insertions(+), 642 deletions(-) + +commit 31924b19806e31f38eff86d4e43248bec989fd3a +Author: Rodrigo L. M. Flores +Date: Sun Aug 30 19:41:47 2009 -0300 + + Updated Brazilian Portuguese mailing list address. + + po/pt_BR.po | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit f2b8b6911235358d25b79d75f98d81b5062afe33 +Author: Petr Kovar +Date: Sat Aug 29 21:05:19 2009 +0200 + + Updated Czech translation + + po/cs.po | 1141 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 532 insertions(+), 609 deletions(-) + +commit c47dca4cfe51b9376c364ae13a444a6529afed8f +Author: Matthias Clasen +Date: Thu Aug 27 23:40:16 2009 -0400 + + Re-commit 30b8774f7f3f7f329af6b041b6c86bad14717534 + + Turns out Alex had agreed to this. + + gio/giomodule.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 2889f1b8a322b0657f3c08a4f7e235e4c2c0f348 +Author: Matthias Clasen +Date: Thu Aug 27 23:02:08 2009 -0400 + + Use the saved errno value + + Bug 591995 + + gio/glocalfileoutputstream.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 3ba64e72cf40b81f472aa784498c3a97ef434c94 +Author: Matthias Clasen +Date: Thu Aug 27 22:59:05 2009 -0400 + + Read /dev/urandom unbuffered + + To avoid wasting entropy. Bug 593232. + + glib/grand.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 3a47f48311d44e690c381f816fd1fa71eed20189 +Author: Matthias Clasen +Date: Thu Aug 27 22:51:53 2009 -0400 + + Revert "add a "gsettings-backend" extension point to GIO" + + This reverts commit 30b8774f7f3f7f329af6b041b6c86bad14717534. + + gio/giomodule.c | 3 --- + 1 files changed, 0 insertions(+), 3 deletions(-) + +commit 30b8774f7f3f7f329af6b041b6c86bad14717534 +Author: Ryan Lortie +Date: Thu Aug 27 13:45:48 2009 -0400 + + add a "gsettings-backend" extension point to GIO + + gio/giomodule.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit df981f82a097f9a2f2739ec410fa928168b749f6 +Author: Luca Ferretti +Date: Wed Aug 26 22:04:58 2009 +0200 + + Updated Italian translation + + po/it.po | 7 +++---- + 1 files changed, 3 insertions(+), 4 deletions(-) + +commit 71b684b9cfe76d522a306993dba13fbcc52d0d73 +Author: Luca Ferretti +Date: Wed Aug 26 15:32:23 2009 +0200 + + Updated Italian translation + + po/it.po | 963 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 482 insertions(+), 481 deletions(-) + +commit 884c789ef5e074a2241d1b813847156db1cecdb0 +Author: Amitakhya Phukan +Date: Wed Aug 26 17:34:17 2009 +0530 + + Updating Assamese translations + + po/as.po | 1105 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 542 insertions(+), 563 deletions(-) + +commit 195abb97ff019d0fe7b50a9635830835933be7ae +Author: Ani +Date: Wed Aug 26 15:18:57 2009 +0530 + + Updated Malayalam Translations + + po/ml.po | 1196 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 550 insertions(+), 646 deletions(-) + +commit 6c1466a2d21820f2df189a258b0c124e7144ba12 +Author: ifelix +Date: Tue Aug 25 14:10:56 2009 +0530 + + Updated Tamil Translations + + po/ta.po | 1178 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 546 insertions(+), 632 deletions(-) + +commit 64b49c9087e8120489a0032d596c8837cbe014f9 +Author: Manoj Kumar Giri +Date: Tue Aug 25 12:14:41 2009 +0530 + + Updated Oriya Translation + + po/or.po | 176 + +++++++++++++++++++++++++++----------------------------------- + 1 files changed, 77 insertions(+), 99 deletions(-) + +commit 24c31a79e1af916fe195e52c79ff8be558e4e848 +Author: Baris Cicek +Date: Tue Aug 25 00:38:34 2009 +0300 + + Updated Turkish translation. + + po/tr.po | 1151 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 534 insertions(+), 617 deletions(-) + +commit ef5aef582eb33fd29fe5ec427ef5d236656b8046 +Author: Luca Ferretti +Date: Mon Aug 24 21:28:11 2009 +0200 + + Fix bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 83d3242d127ca61d94846341ab491bbe988d2b95 +Author: Matthias Clasen +Date: Mon Aug 24 14:15:13 2009 -0400 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 106cd06ff38fef0356961e1d2eaffaa022035b13 +Author: Matthias Clasen +Date: Mon Aug 24 14:13:49 2009 -0400 + + 2.21.5 + + po/am.po | 120 +++--- + po/ar.po | 120 +++--- + po/as.po | 120 +++--- + po/az.po | 120 +++--- + po/be.po | 120 +++--- + po/be@latin.po | 120 +++--- + po/bg.po | 918 +++++++++++++++++----------------- + po/bn.po | 120 +++--- + po/bn_IN.po | 120 +++--- + po/bs.po | 120 +++--- + po/ca.po | 120 +++--- + po/ca@valencia.po | 918 +++++++++++++++++----------------- + po/cs.po | 120 +++--- + po/cy.po | 120 +++--- + po/da.po | 923 +++++++++++++++++----------------- + po/de.po | 120 +++--- + po/dz.po | 120 +++--- + po/el.po | 120 +++--- + po/en_CA.po | 120 +++--- + po/en_GB.po | 120 +++--- + po/eo.po | 120 +++--- + po/es.po | 921 +++++++++++++++++----------------- + po/et.po | 463 +++++++++++++++++- + po/eu.po | 988 +++++++++++++++++++------------------ + po/fa.po | 120 +++--- + po/fi.po | 923 +++++++++++++++++----------------- + po/fr.po | 120 +++--- + po/ga.po | 921 +++++++++++++++++----------------- + po/gl.po | 918 +++++++++++++++++----------------- + po/gu.po | 945 ++++++++++++++++++----------------- + po/he.po | 120 +++--- + po/hi.po | 942 ++++++++++++++++++----------------- + po/hr.po | 120 +++--- + po/hu.po | 120 +++--- + po/hy.po | 120 +++--- + po/id.po | 120 +++--- + po/is.po | 120 +++--- + po/it.po | 921 +++++++++++++++++----------------- + po/ja.po | 64 ++-- + po/ka.po | 120 +++--- + po/kn.po | 120 +++--- + po/ko.po | 931 +++++++++++++++++----------------- + po/ku.po | 120 +++--- + po/lt.po | 120 +++--- + po/lv.po | 120 +++--- + po/mai.po | 120 +++--- + po/mg.po | 120 +++--- + po/mk.po | 120 +++--- + po/ml.po | 120 +++--- + po/mn.po | 120 +++--- + po/mr.po | 120 +++--- + po/ms.po | 120 +++--- + po/nb.po | 920 +++++++++++++++++----------------- + po/ne.po | 120 +++--- + po/nl.po | 120 +++--- + po/nn.po | 120 +++--- + po/oc.po | 120 +++--- + po/or.po | 120 +++--- + po/pa.po | 961 ++++++++++++++++++----------------- + po/pl.po | 919 +++++++++++++++++----------------- + po/ps.po | 120 +++--- + po/pt.po | 927 +++++++++++++++++----------------- + po/pt_BR.po | 923 +++++++++++++++++----------------- + po/ro.po | 120 +++--- + po/ru.po | 120 +++--- + po/rw.po | 120 +++--- + po/si.po | 120 +++--- + po/sk.po | 120 +++--- + po/sl.po | 120 +++--- + po/sq.po | 120 +++--- + po/sr.po | 120 +++--- + po/sr@ije.po | 120 +++--- + po/sr@latin.po | 120 +++--- + po/sv.po | 1436 + ++++++++++++++++++++++++++--------------------------- + po/ta.po | 120 +++--- + po/te.po | 921 +++++++++++++++++----------------- + po/th.po | 120 +++--- + po/tl.po | 120 +++--- + po/tr.po | 120 +++--- + po/tt.po | 120 +++--- + po/uk.po | 120 +++--- + po/vi.po | 120 +++--- + po/wa.po | 120 +++--- + po/xh.po | 120 +++--- + po/yi.po | 120 +++--- + po/zh_CN.po | 120 +++--- + po/zh_HK.po | 936 +++++++++++++++++----------------- + po/zh_TW.po | 921 +++++++++++++++++----------------- + 88 files changed, 14418 insertions(+), 13942 deletions(-) + +commit eadef0325aefb68ae0747a7dbca7d6fca4130da2 +Author: Matthias Clasen +Date: Mon Aug 24 13:34:06 2009 -0400 + + Documentation fixes + + docs/reference/gio/gio-sections.txt | 5 +++++ + docs/reference/glib/glib-sections.txt | 1 + + gio/gfileinfo.c | 2 ++ + 3 files changed, 8 insertions(+), 0 deletions(-) + +commit d1cbb96428f316b77bd31686c7d9b0b96a40bc6e +Author: Matthias Clasen +Date: Mon Aug 24 12:21:08 2009 -0400 + + Updates + + NEWS | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 46 insertions(+), 0 deletions(-) + +commit 002da02df8927e1aa5979347402a6fc378dd172f +Author: Carles Ferrando +Date: Mon Aug 24 18:38:33 2009 +0200 + + Minor update to Catalan (Valencian) translation + + po/ca@valencia.po | 1005 + ++++++++++++++++++++++++++--------------------------- + 1 files changed, 488 insertions(+), 517 deletions(-) + +commit 2e0656063b2c2633ca0caaa9b2e119c3eaee37cf +Author: Rajesh Ranjan +Date: Mon Aug 24 16:52:25 2009 +0530 + + hindi updated by Rajesh Ranjan + + po/hi.po | 1176 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 545 insertions(+), 631 deletions(-) + +commit 4a5e71b847729341243df2f2a2cd0a8284f4b099 +Author: Sweta Kothari +Date: Mon Aug 24 14:23:56 2009 +0530 + + Updated Gujarati Translations + + po/gu.po | 1175 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 543 insertions(+), 632 deletions(-) + +commit 90f9eb6e40b6d8c37ca51467f915507ed6ceddc2 +Author: Duarte Loreto +Date: Sun Aug 23 14:59:14 2009 +0100 + + Updated Portuguese translation + + po/pt.po | 1088 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 540 insertions(+), 548 deletions(-) + +commit feedeb1d12fa490a8685fd00b492fdc054e07883 +Author: Changwoo Ryu +Date: Sun Aug 23 00:50:28 2009 +0900 + + Update Korean translation + + po/ko.po | 1126 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 558 insertions(+), 568 deletions(-) + +commit 8ef30758d56b21aa20c23e5c90a78142183003ed +Author: Christian Persch +Date: Thu Aug 20 15:13:43 2009 +0200 + + Preserve errno + + When using errno in g_set_error with _(), preserve errno. Bug #592457. + + glib/gconvert.c | 22 +++++++++++++++------- + glib/gdir.c | 13 +++++++++---- + glib/gspawn-win32.c | 9 ++++++--- + glib/gspawn.c | 27 +++++++++++++++++++-------- + 4 files changed, 49 insertions(+), 22 deletions(-) + +commit feff29aefc75459bc1b39235cb0e842fbf0fa2b4 +Author: A S Alam +Date: Sat Aug 22 06:15:29 2009 +0530 + + Update Punjabi after Review + + po/pa.po | 1094 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 527 insertions(+), 567 deletions(-) + +commit a568b054adf4abadfaa1bad293d484771d57f333 +Author: Tommi Vainikainen +Date: Fri Aug 21 23:43:53 2009 +0300 + + Updated Finnish translation + + po/fi.po | 1278 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 635 insertions(+), 643 deletions(-) + +commit 956996ddaa82ca5cfeb8e70191ef6b7716186a7c +Author: Takayuki KUSANO +Date: Fri Aug 21 00:15:12 2009 +0900 + + Update Japanese translation. + + po/ja.po | 233 + ++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 115 insertions(+), 118 deletions(-) + +commit 2a880831edc4c22ed5ada05a31ab8a4f24b7d3e1 +Author: Tomasz Dominikowski +Date: Thu Aug 20 11:55:03 2009 +0200 + + Updated Polish translation + + po/pl.po | 1421 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 659 insertions(+), 762 deletions(-) + +commit cd5bd15987b573a436e715e59b0c651e50534bc1 +Author: Dan Winship +Date: Wed Aug 19 12:12:06 2009 -0400 + + Use MSG_NOSIGNAL in GSocket if it's available + + Even though we ignore SIGPIPE, gdb will still stop when the process + receives one, which sometimes confuses people into thinking the app + has crashed (eg, bug 578984, bug 590420), and is annoying anyway. So + use MSG_NOSIGNAL if it's there. + + http://bugzilla.gnome.org/show_bug.cgi?id=591378 + + gio/gsocket.c | 14 ++++++++++++-- + 1 files changed, 12 insertions(+), 2 deletions(-) + +commit 021dd960cf9c02b0ea59cbfa1db603d3f9a467f0 +Author: Dan Winship +Date: Wed Aug 19 12:07:53 2009 -0400 + + Re-run res_init() when resolv.conf changes + + libc caches the contents of resolv.conf, so if it changes (eg, because + the network state changed), we need re-run res_init(). + + http://bugzilla.gnome.org/show_bug.cgi?id=584246 + + gio/gnetworkingprivate.h | 4 ++ + gio/gresolver.c | 68 + +++++++++++++++++++++++++++++++++++++++++++ + gio/gresolver.h | 9 +++++- + gio/gunixresolver.c | 72 + +++++++++++++++++++++++++++++++-------------- + gio/tests/resolver.c | 3 ++ + 5 files changed, 132 insertions(+), 24 deletions(-) + +commit 6db03d73a45bc0acae0bb96849733bf0ab7ad454 +Author: Benjamin Otte +Date: Tue Aug 11 18:50:28 2009 +0200 + + When creating a pipe for a cancelled cancellable, write to it + + Includes (untested) fix for win32 that calls SetEvent() in that case. + + gio/gcancellable.c | 8 ++++++-- + 1 files changed, 6 insertions(+), 2 deletions(-) + +commit faae032ad0579acf756e8848ebedbfda69d5b3be +Author: Benjamin Otte +Date: Tue Aug 11 15:12:20 2009 +0200 + + Use g_cancellable_release_fd() + + Part of: Bug 591388 - number of GCancellables available is too + limited + + gio/gsocket.c | 10 +++++++++- + gio/gunixinputstream.c | 3 ++- + gio/gunixoutputstream.c | 1 + + 3 files changed, 12 insertions(+), 2 deletions(-) + +commit e2c97292c21dbb57d34d812cf48b331ca5cf0d60 +Author: Benjamin Otte +Date: Tue Aug 11 15:04:43 2009 +0200 + + Implement g_cancellable_release_fd() + + Part of: Bug 591388 - number of GCancellables available is too + limited + + gio/gcancellable.c | 77 + +++++++++++++++++++++++++++++++++++++++------------- + 1 files changed, 58 insertions(+), 19 deletions(-) + +commit 63426886ff4066fefbeaf2e6b08a6c04b39a7890 +Author: Benjamin Otte +Date: Tue Aug 11 14:52:56 2009 +0200 + + Add g_cancellable_release_fd() + + This patch only adds the function. The function is a NOP. + See the API documentation for a rationale. + + Part of: Bug 591388 - number of GCancellables available is too + limited + + docs/reference/gio/gio-sections.txt | 1 + + gio/gcancellable.c | 30 ++++++++++++++++++++++++++++++ + gio/gcancellable.h | 1 + + gio/ginputstream.c | 2 +- + gio/gio.symbols | 1 + + 5 files changed, 34 insertions(+), 1 deletions(-) + +commit bb8e4f06ab1a0ada2c8835284ec5f853378694e2 +Author: Benjamin Otte +Date: Thu Aug 13 20:19:15 2009 +0200 + + Bug 591714 – Figure out failure handling for + g_cancellable_make_pollfd() + + Make g_cancellable_make_pollfd() return a gboolean that indicates + its error + status. Update the code that calls this function accordingly. + + gio/gcancellable.c | 38 +++++++++++++++++++++++++------------- + gio/gcancellable.h | 2 +- + gio/gsocket.c | 19 ++++++------------- + gio/gunixinputstream.c | 3 +-- + gio/gunixoutputstream.c | 3 +-- + 5 files changed, 34 insertions(+), 31 deletions(-) + +commit a0e3b4ae8447f0831397384a54f4be276e84764b +Author: Og B. Maciel +Date: Tue Aug 18 23:09:12 2009 -0400 + + Updated Brazilian Portuguese translation. + + po/pt_BR.po | 19 +++++++------------ + 1 files changed, 7 insertions(+), 12 deletions(-) + +commit 981d14e85ccf8d1dc721bd44e030728eff9b2501 +Author: Benjamin Otte +Date: Thu Aug 6 18:17:32 2009 +0200 + + Improve documentation for g_error_matches() + + glib/gerror.c | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +commit a6ac4e90d5ab6a311aab545745ceb3e375bf65a4 +Author: Benjamin Otte +Date: Mon Jul 27 18:48:11 2009 +0200 + + Fix multiple returns in gtk-doc comment + + gio/gsocketservice.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 8f6d26e9647db4e5f2336319e1b0ae439f54b75d +Author: Dan Winship +Date: Mon Aug 17 13:20:49 2009 -0400 + + g_inet_socket_address_to_native: properly zero out sockaddr_in6 + + gio/ginetsocketaddress.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit aa5293612f2eb0a6a02fbf74eb56bbf05faba8df +Author: Ask H. Larsen +Date: Sun Aug 16 19:10:50 2009 +0200 + + Updated Danish translation + + po/da.po | 1090 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 544 insertions(+), 546 deletions(-) + +commit 2db41f3df58a3d926da2a4afa7014118db2913e2 +Author: Mattias Põldaru +Date: Sat Aug 15 08:21:01 2009 +0300 + + Updating Estonian translation + + po/et.po | 11 +++++++---- + 1 files changed, 7 insertions(+), 4 deletions(-) + +commit 406c3aa019a6ce51534f170fd5b82108382a4c6f +Author: Shixin Zeng +Date: Fri Aug 14 23:21:12 2009 +0300 + + [Win32] Avoid superfluous '/' from g_file_resolve_relative_path() + + Patch from bug #591532. + + gio/win32/gwinhttpfile.c | 16 +++++++++++++--- + 1 files changed, 13 insertions(+), 3 deletions(-) + +commit 1b298d6a1bc3b4e5c1c701f26e3981cdae4b89eb +Author: Tor Lillqvist +Date: Fri Aug 14 22:59:47 2009 +0300 + + Avoid gcc warning on Windows + + Avoid "function declaration isn't a prototype" warnings from gcc 4.4 + in the Windows-specific code. + + glib/gutils.h | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit c24f6e55276fac68b08df34b0d350f65afe994d9 +Author: Frédéric Péters +Date: Fri Aug 14 21:00:41 2009 +0200 + + Update GLIB_CHECK_COMPILE_WARNINGS macro to work with Autoconf 2.64 + + Quoting its NEWS file: "The m4sh macros AS_IF and AS_CASE can now be + used in shell lists. The responsibility for supplying a trailing + newline now belongs to the call site, but since most users did not add + dnl, this generally results in fewer empty lines in configure." + + http://bugzilla.gnome.org/show_bug.cgi?id=591840 + + acglib.m4 | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit eae6bdd397ef94a6f7c1a3e42c750b948a659fd2 +Author: Priit Laes +Date: Fri Aug 14 22:09:18 2009 +0300 + + Updating Estonian translation + + po/et.po | 118 + +++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 56 insertions(+), 62 deletions(-) + +commit 37dbffe7d8b0f0985f9c4d37d5df604d81ff0bd0 +Author: krishnababu k +Date: Fri Aug 14 16:56:09 2009 +0530 + + Updated Telugu Translations + + po/te.po | 921 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 461 insertions(+), 460 deletions(-) + +commit 8b117b225e426b73c8fb2abc2ac5e56ed739ac96 +Author: Alexander Shopov +Date: Thu Aug 13 07:12:29 2009 +0300 + + Updated Bulgarian translation + + po/bg.po | 1140 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 529 insertions(+), 611 deletions(-) + +commit 4f8dfc6282cc29430775e1ebd2652d67c08b1a6c +Author: Henrique P Machado +Date: Tue Aug 11 23:40:09 2009 -0300 + + Updated Brazilian Portuguese translation. + + po/pt_BR.po | 1087 + +++++++++++++++++++++++++++++------------------------------ + 1 files changed, 542 insertions(+), 545 deletions(-) + +commit d20a188b1250ab3cf211d684429127d99378e886 +Author: Alexander Larsson +Date: Tue Aug 11 20:22:51 2009 +0200 + + Only fsync if the existing file is > 0 bytes + + This means we don't sync in the case where we created an (empty) + temp file and now replace it with the data. + + This fixes (among other things) the performance of trashing files. + + glib/gfileutils.c | 51 + ++++++++++++++++++++++++++++----------------------- + 1 files changed, 28 insertions(+), 23 deletions(-) + +commit 79a70dc80056859f10b39c711ee43389e8c32a7f +Author: Luca Ferretti +Date: Tue Aug 11 01:27:08 2009 +0200 + + Updated Italian translation + + po/it.po | 1079 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 536 insertions(+), 543 deletions(-) + +commit c18bcd6e8e385628e55166eabbd93d5c87c82da0 +Author: Antón Méixome +Date: Mon Aug 10 16:26:46 2009 +0200 + + Updated Galician translation + + po/gl.po | 129 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 60 insertions(+), 69 deletions(-) + +commit a465508e2d3d52b919ccbf9f2c5bd90395922904 +Author: Craig Loftus +Date: Thu Jul 23 20:24:22 2009 +0100 + + Migrate gbase64 docs from SGML template to inline comments + + Fixes bug #589649. + + Signed-off-by: David King + + docs/reference/glib/tmpl/base64.sgml | 105 + ---------------------------------- + glib/gbase64.c | 20 +++++++ + 2 files changed, 20 insertions(+), 105 deletions(-) + +commit 32c84729f5dac30170cf20aa44e6857a44e5349f +Author: Inaki Larranaga Murgoitio +Date: Mon Aug 10 13:57:21 2009 +0200 + + Updated Basque language + + po/eu.po | 1209 + ++++++++++++++++++++++++++++---------------------------------- + 1 files changed, 551 insertions(+), 658 deletions(-) + +commit f2d779aa0f5ba676fa8715710cebd2607cb339a3 +Author: Antón Méixome +Date: Sun Aug 9 16:35:09 2009 +0200 + + Updated Galician Translation + + po/gl.po | 1105 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 514 insertions(+), 591 deletions(-) + +commit f04a35e43bece5e51061dcef2ebc6dd6204a1c1b +Author: Matthias Clasen +Date: Fri Jul 17 20:34:16 2009 -0400 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 5827f6674282d627efbb9c68d32577470d722192 +Author: Seán de Búrca +Date: Sat Aug 8 01:53:34 2009 -0600 + + Updated Irish translation + + po/ga.po | 1125 + ++++++++++++++++++++++++++++++-------------------------------- + 1 files changed, 545 insertions(+), 580 deletions(-) + +commit 93d40918c59981f863d31a10d9f66a2a9b3177ff +Author: Philip Withnall +Date: Sat Aug 1 16:46:02 2009 +0100 + + Added clarification to mutex free functions + + Clarified that it is A Bad Idea to free a mutex when it's locked. + + docs/reference/glib/tmpl/threads.sgml | 12 ++++++++++++ + 1 files changed, 12 insertions(+), 0 deletions(-) + +commit faccd7fdf3edb8416aacc0191fdb6c5b2965ac6d +Author: Ivar Smolin +Date: Wed Aug 5 13:29:26 2009 +0300 + + Updating Estonian translation + + po/et.po | 513 + ++++---------------------------------------------------------- + 1 files changed, 27 insertions(+), 486 deletions(-) + +commit 405823aeea24fb2ce8d47e0c09e46607117fd27f +Author: Kjartan Maraas +Date: Mon Aug 3 00:16:54 2009 +0200 + + Updated Norwegian bokmÃ¥l translation. + + po/nb.po | 54 +++++++++++++++++++++++++----------------------------- + 1 files changed, 25 insertions(+), 29 deletions(-) + +commit 882e36106d7a5d04c29af87e4e9f7aa4bc3d5e08 +Author: Dan Winship +Date: Thu Jul 30 11:18:35 2009 -0400 + + Fix a bad void return. #588901 + + gio/gtcpconnection.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit f34b1f024feb57e6eb78728d46ff2bbf2ca19453 +Author: Dan Winship +Date: Wed Jul 29 22:35:07 2009 -0400 + + Conditionalize portability #includes in g-asyncns.h + + http://bugzilla.gnome.org/show_bug.cgi?id=589988 + + gio/libasyncns/g-asyncns.h | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 81de534cf73b63add07ff93d851824da80eb4280 +Author: Daniel Nylander +Date: Tue Jul 28 01:59:05 2009 +0200 + + Updated Swedish translation + + po/sv.po | 1547 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 782 insertions(+), 765 deletions(-) + +commit 45067ab9e97de0992acd4004d6e4de957d6c28f4 +Author: Dan Winship +Date: Thu Jul 23 16:27:01 2009 -0400 + + Fix leaks in GSocketClient and GThreadedResolver + + Also update gio/tests/send-data.c to test async connection, and free + more stuff in several tests to make leaks easier to see. + + gio/gsocketclient.c | 3 +++ + gio/gthreadedresolver.c | 6 +++++- + gio/tests/send-data.c | 25 +++++++++++++++++++++---- + gio/tests/socket-client.c | 2 ++ + gio/tests/socket-server.c | 1 + + 5 files changed, 32 insertions(+), 5 deletions(-) + +commit 66ff2542d32c93226a28ad1d0a60e83884b26910 +Author: Kjartan Maraas +Date: Wed Jul 22 18:58:57 2009 +0200 + + Updated Norwegian bokmÃ¥l translation. + + po/nb.po | 987 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 492 insertions(+), 495 deletions(-) + +commit aac978ec7240cdab768c1d66c0e9a94c714dff43 +Author: Tristan Van Berkom +Date: Tue Jul 21 12:58:39 2009 -0400 + + Added clarification to GArray->len documentation + + Clarify that GArray->len does not include the possible + terminating zero element. + + docs/reference/glib/tmpl/arrays.sgml | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 4654a7d593aed9ab0e131abe250e7e488283c24f +Author: Lin Ma +Date: Tue Jul 21 10:45:25 2009 +0800 + + Fixed a missing head which will cause crashes for 64bit applications + + Without that head, the returned pointer will be truncated to 32bit, + then + causes crashes for 64bit applications. + + gio/fen/fen-helper.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit ba6be2035d9bd43b1a873492e189d0bccbd20178 +Author: Behdad Esfahbod +Date: Fri Jun 5 23:24:28 2009 -0400 + + [gbsearcharray] Use malloc() instead of realloc(NULL,...) + + glib/gbsearcharray.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit dfda26d1a980e6e096d93ecfec8f59872b80dee4 +Author: Benjamin Otte +Date: Mon Jul 20 14:29:32 2009 +0200 + + Propagate the right error + + gio/gsocketclient.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 2cf3e2ed275f8502e1a20195290fa18ebe489216 +Author: Jorge González +Date: Sun Jul 19 13:15:06 2009 +0200 + + Updated Spanish translation + + po/es.po | 1035 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 515 insertions(+), 520 deletions(-) + +commit 555aa2d28db4f72373d9cfec4045ea1d0f45bb46 +Author: Theppitak Karoonboonyanan +Date: Sun Jul 19 16:33:06 2009 +0700 + + Updated Thai translation. + + po/th.po | 169 + ++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 78 insertions(+), 91 deletions(-) + +commit f8d1201248cceab59bb971f4906a73f2b0eb0b96 +Author: Chao-Hsiung Liao +Date: Sat Jul 18 21:09:14 2009 +0800 + + Updated Traditional Chinese translation(Hong Kong and Taiwan) + + po/zh_HK.po | 1051 + +++++++++++++++++++++++++++++------------------------------ + po/zh_TW.po | 1036 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 1038 insertions(+), 1049 deletions(-) + +commit 9c278ded7d9a4db91dbe96aeb13b6cbb7841525b +Author: Matthias Clasen +Date: Fri Jul 17 20:31:28 2009 -0400 + + 2.21.4 + + docs/reference/glib/tmpl/trees-binary.sgml | 17 + + po/am.po | 228 ++++- + po/ar.po | 234 +++++- + po/as.po | 234 +++++- + po/az.po | 233 ++++- + po/be.po | 250 +++++- + po/be@latin.po | 250 +++++- + po/bg.po | 234 +++++- + po/bn.po | 232 ++++- + po/bn_IN.po | 234 +++++- + po/bs.po | 233 ++++- + po/ca.po | 237 +++++- + po/ca@valencia.po | 237 +++++- + po/cs.po | 234 +++++- + po/cy.po | 232 ++++- + po/da.po | 237 +++++- + po/de.po | 234 +++++- + po/dz.po | 232 ++++- + po/el.po | 240 +++++- + po/en_CA.po | 234 +++++- + po/en_GB.po | 237 +++++- + po/eo.po | 232 ++++- + po/es.po | 1026 ++++++++++++--------- + po/et.po | 234 +++++- + po/eu.po | 234 +++++- + po/fa.po | 233 ++++- + po/fi.po | 234 +++++- + po/fr.po | 939 ++++++++++--------- + po/ga.po | 229 ++++- + po/gl.po | 234 +++++- + po/gu.po | 234 +++++- + po/he.po | 948 +++++++++---------- + po/hi.po | 234 +++++- + po/hr.po | 229 ++++- + po/hu.po | 234 +++++- + po/hy.po | 229 ++++- + po/id.po | 232 ++++- + po/is.po | 233 ++++- + po/it.po | 234 +++++- + po/ja.po | 234 +++++- + po/ka.po | 230 ++++- + po/kn.po | 234 +++++- + po/ko.po | 234 +++++- + po/ku.po | 228 ++++- + po/lt.po | 234 +++++- + po/lv.po | 232 ++++- + po/mai.po | 233 +++++- + po/mg.po | 229 ++++- + po/mk.po | 234 +++++- + po/ml.po | 234 +++++- + po/mn.po | 233 ++++- + po/mr.po | 234 +++++- + po/ms.po | 233 ++++- + po/nb.po | 1026 ++++++++++++-------- + po/ne.po | 229 ++++- + po/nl.po | 242 +++++- + po/nn.po | 234 +++++- + po/oc.po | 228 ++++- + po/or.po | 234 +++++- + po/pa.po | 234 +++++- + po/pl.po | 234 +++++- + po/ps.po | 230 ++++- + po/pt.po | 237 +++++- + po/pt_BR.po | 234 +++++- + po/ro.po | 234 +++++- + po/ru.po | 234 +++++- + po/rw.po | 245 +++++- + po/si.po | 230 ++++- + po/sk.po | 231 ++++- + po/sl.po | 234 +++++- + po/sq.po | 285 ++++++- + po/sr.po | 233 ++++- + po/sr@ije.po | 235 ++++- + po/sr@latin.po | 233 ++++- + po/sv.po | 1406 + ++++++++++++++++------------ + po/ta.po | 234 +++++- + po/te.po | 234 +++++- + po/th.po | 237 +++++- + po/tl.po | 232 ++++- + po/tr.po | 234 +++++- + po/tt.po | 231 ++++- + po/uk.po | 1024 ++++++++++++-------- + po/vi.po | 234 +++++- + po/wa.po | 233 ++++- + po/xh.po | 233 ++++- + po/yi.po | 232 ++++- + po/zh_CN.po | 234 +++++- + po/zh_HK.po | 1041 ++++++++++++--------- + po/zh_TW.po | 1026 ++++++++++++--------- + 89 files changed, 21688 insertions(+), 5524 deletions(-) + +commit 4e273d4650621ea095dda5a5e3f1bac4ee8299ae +Author: Matthias Clasen +Date: Fri Jul 17 19:01:47 2009 -0400 + + Updates + + NEWS | 19 +++++++++++++++++++ + 1 files changed, 19 insertions(+), 0 deletions(-) + +commit e845e09524fb3be058688050e97f976b11a247dc +Author: Yair Hershkovitz +Date: Fri Jul 17 22:53:56 2009 +0300 + + Updated Hebrew translation + + po/he.po | 1062 + +++++++++++++++++++++++++++++++++++++------------------------- + 1 files changed, 633 insertions(+), 429 deletions(-) + +commit e4bf2ac41d605a2bd3c858790a0fe36b86bcf7d9 +Author: Martin Nordholts +Date: Fri Jul 17 16:49:53 2009 +0200 + + Support silent build rules with automake 1.11 + + Support silent build rules, requires at least automake-1.11. Enable by + either passing --enable-silent-rules to configure or passing V=0 to + make. Bug #588863. + + configure.in | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit ad0c04c6e9e2ef16dce2e29aeba51f9a7ae8477c +Author: Claude Paroz +Date: Tue Jul 14 22:39:31 2009 +0200 + + Updated French translation + + po/fr.po | 1134 + ++++++++++++++++++++++++++++++++++---------------------------- + 1 files changed, 620 insertions(+), 514 deletions(-) + +commit 9bc208835760823f2fac4e406973d6387805416e +Author: Claude Paroz +Date: Tue Jul 14 18:54:58 2009 +0200 + + Add missing files in POTFILES.in + + po/POTFILES.in | 21 +++++++++++++++++++++ + 1 files changed, 21 insertions(+), 0 deletions(-) + +commit d439c22e0ff7cec437cdc4037f7621c762ea3181 +Author: Kjartan Maraas +Date: Mon Jul 13 11:20:09 2009 +0200 + + Updated Norwegian bokmÃ¥l translation. + + po/nb.po | 855 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 424 insertions(+), 431 deletions(-) + +commit e2844da68adb626f20ff9d02d51ca4259f56d55d +Author: Chao-Hsiung Liao +Date: Sun Jul 12 15:19:23 2009 +0800 + + Updated Traditional Chinese translation(Hong Kong and Taiwan) + + po/zh_HK.po | 917 + +++++++++++++++++++++++++++++------------------------------ + po/zh_TW.po | 890 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 898 insertions(+), 909 deletions(-) + +commit f7f16dc3a2da52183053c5cc0967f7fa6547f65a +Author: Matthias Clasen +Date: Fri Jul 10 22:33:03 2009 -0400 + + Remove outdated paragraph + + We no longer use PATCH or API keywords. + + README.in | 6 +----- + 1 files changed, 1 insertions(+), 5 deletions(-) + +commit 7ba9674d719af6eaa4e7e661be34732215bdfe38 +Author: Matthias Clasen +Date: Fri Jul 10 13:13:18 2009 -0400 + + Avoid some compiler warnings. + + gobject/gtype.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 91925d2cf040730f89935a39c0d7aef3b4eb59dd +Author: Matthias Clasen +Date: Fri Jul 10 13:11:28 2009 -0400 + + Another possible error code clash, yay + + glib/gstrfuncs.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c23536cefeacc72d03ad8a83f315758d751cb127 +Author: Matthias Clasen +Date: Fri Jul 10 11:18:31 2009 -0400 + + Improve g_str_equal docs + + Add a reference to g_strcmp0(), cf. bug 587938. + + glib/gstring.c | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +commit 6f48065958e24927c84f2983f746e39a3212998c +Author: Benjamin Otte +Date: Thu Jul 9 15:34:00 2009 +0200 + + Fix a typo in GRegex documentation + + docs/reference/glib/tmpl/gregex.sgml | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit c6884a7ec9999b6041dcad8ff3f7c7d93c55c0d2 +Author: Maxim V. Dziumanenko +Date: Thu Jul 9 10:51:15 2009 +0300 + + Updated Ukrainian translation + + po/uk.po | 912 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 454 insertions(+), 458 deletions(-) + +commit 4cecb335f4b1d8e39c9402788fb37b7173187dd0 +Author: Jorge González +Date: Tue Jul 7 22:34:35 2009 +0200 + + Updated Spanish translation + + po/es.po | 852 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 425 insertions(+), 427 deletions(-) + +commit 593ea5f6b08c6fb297c1faffed3ada8fb2d95c66 +Author: Ryan Lortie +Date: Tue Jul 7 21:29:46 2009 +0100 + + Ensure GTree is consistent after _destroy() + + See comment #9 on bug 587773 + + glib/gtree.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 7d2bb5f1b1ce0289628b12d98369f3fca92cde24 +Author: Daniel Nylander +Date: Tue Jul 7 19:46:59 2009 +0200 + + Updated Swedish translation + + po/sv.po | 1263 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 635 insertions(+), 628 deletions(-) + +commit 474ba7dbc37e352d39c0057bd2a31504828dde36 +Author: Tor Lillqvist +Date: Tue Jul 7 14:37:45 2009 +0300 + + Make it compile on Windows. + + Surround a symlink-related code snippet with ifdef S_ISLNK. + + gio/glocalfileinfo.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 10ba0c2e5c6ed069420ec926c1094331c44fb71e +Merge: eff73c9 8792d86 +Author: Ryan Lortie +Date: Tue Jul 7 09:45:31 2009 +0100 + + Merge branch 'tree-refcount' + +commit eff73c95e8bb971ccc134e79c15f73ea5a237d30 +Author: Matthias Clasen +Date: Mon Jul 6 00:33:49 2009 -0400 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 400959ddbdddaed22cfd7e898a4414730ecb3ec4 +Author: Matthias Clasen +Date: Mon Jul 6 00:31:47 2009 -0400 + + 2.21.3 + + docs/reference/glib/tmpl/conversions.sgml | 9 - + docs/reference/glib/tmpl/gurifuncs.sgml | 9 + + docs/reference/gobject/glib-mkenums.1 | 11 +- + po/am.po | 195 +++-- + po/ar.po | 199 +++-- + po/as.po | 199 +++-- + po/az.po | 195 +++-- + po/be.po | 195 +++-- + po/be@latin.po | 199 +++-- + po/bg.po | 199 +++-- + po/bn.po | 195 +++-- + po/bn_IN.po | 199 +++-- + po/bs.po | 195 +++-- + po/ca.po | 199 +++-- + po/ca@valencia.po | 199 +++-- + po/cs.po | 199 +++-- + po/cy.po | 195 +++-- + po/da.po | 199 +++-- + po/de.po | 199 +++-- + po/dz.po | 195 +++-- + po/el.po | 199 +++-- + po/en_CA.po | 199 +++-- + po/en_GB.po | 199 +++-- + po/eo.po | 195 +++-- + po/es.po | 859 +++++++++++---------- + po/et.po | 447 +++++++++++- + po/eu.po | 199 +++-- + po/fa.po | 195 +++-- + po/fi.po | 199 +++-- + po/fr.po | 199 +++-- + po/ga.po | 195 +++-- + po/gl.po | 199 +++-- + po/gu.po | 199 +++-- + po/he.po | 1182 + ++++++++++++++--------------- + po/hi.po | 199 +++-- + po/hr.po | 195 +++-- + po/hu.po | 199 +++-- + po/hy.po | 195 +++-- + po/id.po | 195 +++-- + po/is.po | 195 +++-- + po/it.po | 199 +++-- + po/ja.po | 199 +++-- + po/ka.po | 195 +++-- + po/kn.po | 199 +++-- + po/ko.po | 199 +++-- + po/ku.po | 195 +++-- + po/lt.po | 199 +++-- + po/lv.po | 195 +++-- + po/mai.po | 199 +++-- + po/mg.po | 195 +++-- + po/mk.po | 199 +++-- + po/ml.po | 199 +++-- + po/mn.po | 195 +++-- + po/mr.po | 199 +++-- + po/ms.po | 195 +++-- + po/nb.po | 199 +++-- + po/ne.po | 195 +++-- + po/nl.po | 204 +++-- + po/nn.po | 199 +++-- + po/oc.po | 195 +++-- + po/or.po | 199 +++-- + po/pa.po | 199 +++-- + po/pl.po | 199 +++-- + po/ps.po | 195 +++-- + po/pt.po | 199 +++-- + po/pt_BR.po | 199 +++-- + po/ro.po | 199 +++-- + po/ru.po | 199 +++-- + po/rw.po | 195 +++-- + po/si.po | 195 +++-- + po/sk.po | 199 +++-- + po/sl.po | 199 +++-- + po/sq.po | 203 +++-- + po/sr.po | 195 +++-- + po/sr@ije.po | 195 +++-- + po/sr@latin.po | 195 +++-- + po/sv.po | 199 +++-- + po/ta.po | 199 +++-- + po/te.po | 199 +++-- + po/th.po | 199 +++-- + po/tl.po | 195 +++-- + po/tr.po | 199 +++-- + po/tt.po | 195 +++-- + po/uk.po | 199 +++-- + po/vi.po | 199 +++-- + po/wa.po | 195 +++-- + po/xh.po | 195 +++-- + po/yi.po | 195 +++-- + po/zh_CN.po | 199 +++-- + po/zh_HK.po | 199 +++-- + po/zh_TW.po | 199 +++-- + 91 files changed, 11231 insertions(+), 8078 deletions(-) + +commit 3d1e8127788d8d406dd7e5d7feaae6d47110f087 +Author: Matthias Clasen +Date: Mon Jul 6 00:00:42 2009 -0400 + + Document support_thread_contexts + + gio/gfile.h | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit d5a51305196ac44b1c9f9edcb93aa688821f60f2 +Author: Matthias Clasen +Date: Sun Jul 5 23:55:00 2009 -0400 + + Minor doc fix + + glib/gerror.c | 107 + ++++++++++++++++++++++++++++----------------------------- + 1 files changed, 53 insertions(+), 54 deletions(-) + +commit 563c55bb7176e3fad5ea39061feb8406e5968ef3 +Author: Matthias Clasen +Date: Sun Jul 5 23:38:09 2009 -0400 + + Fix a segfault in g_cancellable_cancel + + gio/gcancellable.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 66e9b50b2ccf7498a55f0608cca31bc8cfad741d +Author: Matthias Clasen +Date: Sun Jul 5 22:55:26 2009 -0400 + + Updates + + NEWS | 35 +++++++++++++++++++++++++++++++++++ + 1 files changed, 35 insertions(+), 0 deletions(-) + +commit 5694ab7642c9ba6fbb85424e71d1c42c17661dd1 +Author: Matthias Clasen +Date: Sun Jul 5 22:49:24 2009 -0400 + + Revert "Move gio tests from gio/tests/ to tests/gio/" + + This reverts commit 2262d76b33094304ece0d0d9cd5920682599a49b. + + Move GIO tests back to where they belong. + + configure.in | 2 +- + gio/Makefile.am | 2 + + gio/tests/.gitignore | 24 + + gio/tests/Makefile.am | 119 ++++ + gio/tests/buffered-input-stream.c | 60 ++ + gio/tests/contexts.c | 190 ++++++ + gio/tests/data-input-stream.c | 336 ++++++++++ + gio/tests/data-output-stream.c | 289 +++++++++ + gio/tests/desktop-app-info.c | 259 ++++++++ + gio/tests/echo-server.c | 73 +++ + gio/tests/filter-streams.c | 239 ++++++++ + gio/tests/g-file-info.c | 125 ++++ + gio/tests/g-file.c | 538 ++++++++++++++++ + gio/tests/g-icon.c | 245 ++++++++ + gio/tests/httpd.c | 183 ++++++ + gio/tests/live-g-file.c | 1211 + +++++++++++++++++++++++++++++++++++++ + gio/tests/live-g-file.txt | 27 + + gio/tests/memory-input-stream.c | 78 +++ + gio/tests/memory-output-stream.c | 100 +++ + gio/tests/readwrite.c | 293 +++++++++ + gio/tests/resolver.c | 506 ++++++++++++++++ + gio/tests/send-data.c | 163 +++++ + gio/tests/simple-async-result.c | 130 ++++ + gio/tests/sleepy-stream.c | 296 +++++++++ + gio/tests/socket-client.c | 298 +++++++++ + gio/tests/socket-server.c | 308 ++++++++++ + gio/tests/srvtarget.c | 158 +++++ + gio/tests/unix-streams.c | 256 ++++++++ + tests/Makefile.am | 2 +- + tests/gio/.gitignore | 24 - + tests/gio/Makefile.am | 119 ---- + tests/gio/buffered-input-stream.c | 60 -- + tests/gio/contexts.c | 190 ------ + tests/gio/data-input-stream.c | 336 ---------- + tests/gio/data-output-stream.c | 289 --------- + tests/gio/desktop-app-info.c | 259 -------- + tests/gio/echo-server.c | 73 --- + tests/gio/filter-streams.c | 239 -------- + tests/gio/g-file-info.c | 125 ---- + tests/gio/g-file.c | 538 ---------------- + tests/gio/g-icon.c | 245 -------- + tests/gio/httpd.c | 183 ------ + tests/gio/live-g-file.c | 1211 + ------------------------------------- + tests/gio/live-g-file.txt | 27 - + tests/gio/memory-input-stream.c | 78 --- + tests/gio/memory-output-stream.c | 100 --- + tests/gio/readwrite.c | 293 --------- + tests/gio/resolver.c | 506 ---------------- + tests/gio/send-data.c | 163 ----- + tests/gio/simple-async-result.c | 130 ---- + tests/gio/sleepy-stream.c | 296 --------- + tests/gio/socket-client.c | 298 --------- + tests/gio/socket-server.c | 308 ---------- + tests/gio/srvtarget.c | 158 ----- + tests/gio/unix-streams.c | 256 -------- + 55 files changed, 6508 insertions(+), 6506 deletions(-) + +commit 8de4be69a9013e3bce57c0a004e1eada4155f623 +Author: Matthias Clasen +Date: Sun Jul 5 22:35:55 2009 -0400 + + Move comment to the right place + + gio/gvfs.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit aa065346d3230d5facd45ad1e4d50ceae206773f +Author: Matthias Clasen +Date: Sun Jul 5 22:26:11 2009 -0400 + + Register ids for new file attributes + + gio/gfileinfo-priv.h | 12 ++++++++---- + gio/gfileinfo.c | 4 ++++ + 2 files changed, 12 insertions(+), 4 deletions(-) + +commit f043439d7897d3f538dcb2a2d9be9fd7a34ec948 +Author: Matthias Clasen +Date: Sun Jul 5 22:24:14 2009 -0400 + + Ignore gfileinfo-priv.h + + docs/reference/gio/Makefile.am | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 99a1c47343d09ab0485c2377e5c8c53e847d84dd +Author: David Zeuthen +Date: Sun Jul 5 21:59:38 2009 -0400 + + Allow interaction when unmounting mounts + + For details, see bug 587482. The new api: + + - Provide new _with_operation() variants of all unmount and eject + methods + + - Add GMountOperation::show-processes signal + - this can be used to show processes blocking an unmount operation + + - Deprecate all unmount and eject methods + + - Add g_drive_can_start_degraded() method + - this is to avoid auto-starting degraded drives + + - Make g_drive_stop() resp. g_file_stop_mountable() take a + GMountOperation + - these ops were recently added and not yet public API so it's fine + to change how they work + + - Provide a way to poll mountable files, e.g. g_file_poll_mountable() + + - Add some missing file attributes for mountable files + - G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE + - needed for the GDU Nautilus extensions to format a volume + - G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED: + - mimics g_drive_can_start_degraded() + - G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL: + - mimics g_drive_can_poll_for_media() + - G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC + - mimics g_drive_is_media_check_automatic() + + docs/reference/gio/Makefile.am | 2 + + docs/reference/gio/gio-docs.xml | 5 +- + docs/reference/gio/gio-sections.txt | 19 +++ + gio/gdrive.c | 124 ++++++++++++++- + gio/gdrive.h | 32 ++++- + gio/gfile.c | 305 + ++++++++++++++++++++++++++++++++++- + gio/gfile.h | 66 ++++++++ + gio/gfileinfo.h | 43 +++++- + gio/gio-marshal.list | 1 + + gio/gio.symbols | 47 ++++-- + gio/gmount.c | 186 +++++++++++++++++++++- + gio/gmount.h | 48 ++++++- + gio/gmountoperation.c | 76 +++++++-- + gio/gmountoperation.h | 6 +- + gio/gvolume.c | 89 ++++++++++ + gio/gvolume.h | 23 +++ + 16 files changed, 1027 insertions(+), 45 deletions(-) + +commit c85ff0c75004736d5c8798e3b47a47e0fc67ac70 +Author: Benjamin Otte +Date: Sun Jul 5 21:34:39 2009 +0200 + + [gio] minor improvements to g_cancellable_cancel() + + - make this function not crash when cancellable is NULL + - avoid locking when the cancellable has already been cancelled + + gio/gcancellable.c | 24 ++++++++++++------------ + 1 files changed, 12 insertions(+), 12 deletions(-) + +commit 8a2e617e41e3f605ea0206832f0c2f346bfe008e +Author: Yaron Shahrabani +Date: Sun Jul 5 18:06:57 2009 +0300 + + Updated Hebrew translation + + po/he.po | 1186 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 613 insertions(+), 573 deletions(-) + +commit 8792d862db4f61317a45dfe07f7b51e5ccf6741b +Author: Ryan Lortie +Date: Sun Jul 5 12:30:54 2009 +0100 + + GTree: switch to GSlice, add refcounts (#587773) + + docs/reference/glib/glib-sections.txt | 2 + + glib/glib.symbols | 2 + + glib/gtree.c | 88 + +++++++++++++++++++++++++++------ + glib/gtree.h | 2 + + 4 files changed, 79 insertions(+), 15 deletions(-) + +commit 18e0bcf02f99a2d4bb35f46369cf4b9237291ef1 +Author: Christian Persch +Date: Fri Jul 3 21:20:11 2009 +0200 + + Add @basename@ substitution to glib-mkenums + + Move man page addition to the right place. Bug #587307. + + docs/reference/gobject/glib-mkenums.xml | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit 6d1474e7f1f6e964d8db377fe732b9273cf17a84 +Author: Christian Persch +Date: Mon Jun 29 15:28:22 2009 +0200 + + Add @basename@ substitution to glib-mkenums + + Since @filename@ contains the full filename as given to the + glib-mkenum + command, possibly including path elements (e.g. when using a + non-srcdir + build), it is unsuitable to use in a #include statement in the + generated + file if one wants to distribute it. This patch adds @basename@ which + expands to the base name of the input filename. Bug #587307. + + gobject/glib-mkenums.1 | 3 +++ + gobject/glib-mkenums.in | 9 +++++++++ + 2 files changed, 12 insertions(+), 0 deletions(-) + +commit dfd83f419c30d7d97c0e223e428c2e12c58199d3 +Author: Mattias Põldaru +Date: Thu Jul 2 05:23:26 2009 +0300 + + Updating Estonian translation + + po/et.po | 94 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 47 insertions(+), 47 deletions(-) + +commit 29e6525b1e5b51323681af156a0641d69fc9fa87 +Author: Dan Winship +Date: Wed Jul 1 13:52:49 2009 -0400 + + Two "make check" fixes for late changes to the thread-context patch + + g_simple_async_result_complete() now checks that it's being run from + the correct main loop, so tests/gio/simple-async-result was failing, + because it called it from outside any main loop. (And gio's pltcheck + was failing because I hadn't added g_main_current_source() to it.) + + gio/pltcheck.sh | 2 +- + tests/gio/simple-async-result.c | 37 + ++++++++++++++++++++++++++++++------- + 2 files changed, 31 insertions(+), 8 deletions(-) + +commit 2262d76b33094304ece0d0d9cd5920682599a49b +Author: Benjamin Otte +Date: Wed Jul 1 19:03:19 2009 +0200 + + Move gio tests from gio/tests/ to tests/gio/ + + This avoids getting tests built every time when working on libgio and + running make in the gio/ directory. + + configure.in | 2 +- + gio/Makefile.am | 2 - + gio/tests/.gitignore | 24 - + gio/tests/Makefile.am | 119 ---- + gio/tests/buffered-input-stream.c | 60 -- + gio/tests/contexts.c | 190 ------ + gio/tests/data-input-stream.c | 336 ---------- + gio/tests/data-output-stream.c | 289 --------- + gio/tests/desktop-app-info.c | 259 -------- + gio/tests/echo-server.c | 73 --- + gio/tests/filter-streams.c | 239 -------- + gio/tests/g-file-info.c | 125 ---- + gio/tests/g-file.c | 538 ---------------- + gio/tests/g-icon.c | 245 -------- + gio/tests/httpd.c | 183 ------ + gio/tests/live-g-file.c | 1211 + ------------------------------------- + gio/tests/live-g-file.txt | 27 - + gio/tests/memory-input-stream.c | 78 --- + gio/tests/memory-output-stream.c | 100 --- + gio/tests/readwrite.c | 293 --------- + gio/tests/resolver.c | 506 ---------------- + gio/tests/send-data.c | 163 ----- + gio/tests/simple-async-result.c | 107 ---- + gio/tests/sleepy-stream.c | 296 --------- + gio/tests/socket-client.c | 298 --------- + gio/tests/socket-server.c | 308 ---------- + gio/tests/srvtarget.c | 158 ----- + gio/tests/unix-streams.c | 256 -------- + tests/Makefile.am | 2 +- + tests/gio/.gitignore | 24 + + tests/gio/Makefile.am | 119 ++++ + tests/gio/buffered-input-stream.c | 60 ++ + tests/gio/contexts.c | 190 ++++++ + tests/gio/data-input-stream.c | 336 ++++++++++ + tests/gio/data-output-stream.c | 289 +++++++++ + tests/gio/desktop-app-info.c | 259 ++++++++ + tests/gio/echo-server.c | 73 +++ + tests/gio/filter-streams.c | 239 ++++++++ + tests/gio/g-file-info.c | 125 ++++ + tests/gio/g-file.c | 538 ++++++++++++++++ + tests/gio/g-icon.c | 245 ++++++++ + tests/gio/httpd.c | 183 ++++++ + tests/gio/live-g-file.c | 1211 + +++++++++++++++++++++++++++++++++++++ + tests/gio/live-g-file.txt | 27 + + tests/gio/memory-input-stream.c | 78 +++ + tests/gio/memory-output-stream.c | 100 +++ + tests/gio/readwrite.c | 293 +++++++++ + tests/gio/resolver.c | 506 ++++++++++++++++ + tests/gio/send-data.c | 163 +++++ + tests/gio/simple-async-result.c | 107 ++++ + tests/gio/sleepy-stream.c | 296 +++++++++ + tests/gio/socket-client.c | 298 +++++++++ + tests/gio/socket-server.c | 308 ++++++++++ + tests/gio/srvtarget.c | 158 +++++ + tests/gio/unix-streams.c | 256 ++++++++ + 55 files changed, 6483 insertions(+), 6485 deletions(-) + +commit 65cc5d895ae125b09f2403761f434fd78ef05af7 +Author: Dan Winship +Date: Tue Jun 16 20:22:58 2009 -0400 + + Support g_main_context_push_thread_default() in gio + + GFile allows for the possibility that external implementations may not + support thread-default contexts yet, via + g_file_supports_thread_contexts(). GVolumeMonitor is not yet + thread-default-context aware. + + Add a test program to verify that basic gio async ops work correctly + in non-default contexts. + + http://bugzilla.gnome.org/show_bug.cgi?id=579984 + + gio/gdummyfile.c | 2 + + gio/gfile.c | 25 ++++++ + gio/gfile.h | 3 + + gio/gfilemonitor.c | 26 +++++-- + gio/gio.symbols | 1 + + gio/gioscheduler.c | 29 ++++--- + gio/glocalfile.c | 2 + + gio/gsimpleasyncresult.c | 62 ++++++++++---- + gio/gsocketclient.c | 2 +- + gio/gsocketinputstream.c | 2 +- + gio/gsocketlistener.c | 2 +- + gio/gsocketoutputstream.c | 2 +- + gio/gtcpconnection.c | 2 +- + gio/gunixinputstream.c | 4 +- + gio/gunixmount.c | 4 +- + gio/gunixoutputstream.c | 4 +- + gio/gunixresolver.c | 207 + ++++++++++++++++++++++++++++++--------------- + gio/gunixvolume.c | 4 +- + gio/gvolumemonitor.c | 7 ++- + gio/gwin32resolver.c | 4 +- + gio/tests/.gitignore | 1 + + gio/tests/Makefile.am | 10 ++- + gio/tests/contexts.c | 190 + +++++++++++++++++++++++++++++++++++++++++ + 23 files changed, 474 insertions(+), 121 deletions(-) + +commit 4363f1932f1be4474a81d5b9cf8a58c91b682868 +Author: Dan Winship +Date: Thu Jun 4 21:59:15 2009 -0400 + + Add g_main_context_push_thread_default() etc + + This allows applications to use async methods from other threads, or + in multiple independent main loops. + + http://bugzilla.gnome.org/show_bug.cgi?id=579984 + + docs/reference/glib/glib-sections.txt | 5 + + docs/reference/glib/tmpl/main.sgml | 24 ++++++ + glib/glib.symbols | 3 + + glib/gmain.c | 144 + ++++++++++++++++++++++++++++++++- + glib/gmain.h | 5 + + 5 files changed, 177 insertions(+), 4 deletions(-) + +commit 90381ecdbd73197ebdfaf58fdeccf267454d53d7 +Author: Dan Winship +Date: Fri Jun 19 10:30:14 2009 -0400 + + Use low-level GSource methods in a few more places + + (in preparation for thread-default context support) + + gio/gfilemonitor.c | 23 ++++++++++++++--------- + gio/gunixmount.c | 26 ++++++++++++++++++++++---- + gio/gunixvolume.c | 26 ++++++++++++++++++++++---- + gio/gwin32resolver.c | 18 ++++++++++++------ + gio/pltcheck.sh | 2 +- + 5 files changed, 71 insertions(+), 24 deletions(-) + +commit 28a39fab5ac720daf5927c85c3eba2e23f5ac38c +Author: Dan Winship +Date: Tue Jun 16 20:21:29 2009 -0400 + + Remove some unused code + + gio/gasynchelper.c | 35 ----------------------------------- + 1 files changed, 0 insertions(+), 35 deletions(-) + +commit 70e8eed6acfa33f74d7772f3ec54997daf102be4 +Author: Dan Winship +Date: Tue Jun 23 12:01:34 2009 -0400 + + Fix GResolver for g_simple_async_result_set_op_res_gpointer change + + Previously, re-setting the pointer value would cause the old + GDestroyNotify to be lost; now it causes it to be run. + + http://bugzilla.gnome.org/show_bug.cgi?id=587415 + + gio/gresolver.c | 11 ++++------- + 1 files changed, 4 insertions(+), 7 deletions(-) + +commit d589da7e86947542790aa0137dc12499a4fe1a3b +Author: Benjamin Otte +Date: Tue Jun 30 20:33:19 2009 +0200 + + Bug 587434 – regression tests fail + + make this test not only compile, but also run successfully with mad + CFLAGS. + + gio/tests/data-output-stream.c | 138 + +++++++++++++++++++-------------------- + 1 files changed, 67 insertions(+), 71 deletions(-) + +commit 80561f9718873bf02d5c938d92672bc20d99b82d +Author: Benjamin Otte +Date: Tue Jun 30 19:08:46 2009 +0200 + + Bug 587434 – regression tests fail + + I missed one s/tmpfile/tmp_file/ which caused crashes. + + gio/tests/readwrite.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 53beca955e016fb9ef4e80d223d059bc5e51dd41 +Author: Dan Winship +Date: Tue Jun 23 17:42:01 2009 -0400 + + Add GCancellables to GSocket ops + + Currently, to implement cancellability correctly, all synchronous + calls to GSocket must be preceded by a g_socket_condition_wait() call, + (even though GSocket does this internally as well) and all + asynchronous calls must do occasional manual + g_cancellable_is_cancelled() checks. Since it's trivial to do these + checks inside GSocket instead, and we don't particularly want to + encourage people to use the APIs non-cancellably, move the + cancellation support into GSocket and simplify the existing callers. + + http://bugzilla.gnome.org/show_bug.cgi?id=586797 + + gio/gsocket.c | 74 + ++++++++++++++++++++++++++++++++------------- + gio/gsocket.h | 8 +++++ + gio/gsocketclient.c | 4 +- + gio/gsocketinputstream.c | 27 ++++++---------- + gio/gsocketlistener.c | 32 ++++++++----------- + gio/gsocketoutputstream.c | 27 ++++++---------- + gio/gtcpconnection.c | 21 ++----------- + gio/gunixconnection.c | 8 ++--- + gio/tests/socket-client.c | 14 +++++--- + gio/tests/socket-server.c | 13 +++++--- + 10 files changed, 119 insertions(+), 109 deletions(-) + +commit fc2b3ee560e29b4ef6e70928b0be75d833d75aec +Author: Benjamin Otte +Date: Mon Jun 29 18:32:09 2009 +0200 + + remove unused label + + complained about by -Wall + + gio/gtcpconnection.c | 3 --- + 1 files changed, 0 insertions(+), 3 deletions(-) + +commit afd63c32814869489f812d6738de027ce113957d +Author: Benjamin Otte +Date: Mon Jun 29 18:24:08 2009 +0200 + + fix warnings from gcc compilation with my mad CFLAGS + + gio/tests/data-input-stream.c | 32 +++++++++++-------- + gio/tests/data-output-stream.c | 66 + ++++++++++++++++++++-------------------- + gio/tests/desktop-app-info.c | 4 +- + gio/tests/g-file.c | 16 +++++----- + gio/tests/httpd.c | 2 +- + gio/tests/live-g-file.c | 22 ++++++++----- + gio/tests/readwrite.c | 40 ++++++++++++------------ + gio/tests/resolver.c | 6 ++-- + gio/tests/sleepy-stream.c | 24 ++++++++------- + gio/tests/socket-server.c | 6 ++-- + gio/tests/srvtarget.c | 3 +- + gio/tests/unix-streams.c | 4 +- + 12 files changed, 119 insertions(+), 106 deletions(-) + +commit 4b8ad50fc4463d72862d29a8802b5982e66c0fc2 +Author: Benjamin Otte +Date: Mon Jun 29 15:28:08 2009 +0200 + + add g_file_attribute_set_*_by_id() and use them + + This patch and the previous ones fixes the performance issues noted in + Bug 587089 – lookup_attribute() takes too much CPU + It increases performance for querying attributes by ~15% in my tests. + + gio/gfileinfo-priv.h | 36 +++++++++- + gio/gfileinfo.c | 183 + +++++++++++++++++++++++++++++++++++++------------- + gio/glocalfileinfo.c | 96 +++++++++++++------------- + 3 files changed, 217 insertions(+), 98 deletions(-) + +commit bd198e5e45282886ea2bad14e987c7c01b163cb3 +Author: Benjamin Otte +Date: Mon Jun 29 14:13:14 2009 +0200 + + export and use _g_file_attribute_matcher_matches_id() + + gio/gfileinfo-priv.h | 5 +++ + gio/gfileinfo.c | 13 +++---- + gio/glocalfileinfo.c | 95 + +++++++++++++++++++++++++------------------------ + 3 files changed, 58 insertions(+), 55 deletions(-) + +commit ceba40c27d5166a07a0925d2e158ca1809cc1ce3 +Author: Benjamin Otte +Date: Mon Jun 29 13:55:22 2009 +0200 + + add private header with attribute ids + + attribute ids are generated when the attribute hash is + initialized. This + way we can guarantee that the ids match every time. + + gio/Makefile.am | 1 + + gio/gfileinfo-priv.h | 99 + ++++++++++++++++++++++++++++++++++++++++++++++++++ + gio/gfileinfo.c | 79 +++++++++++++++++++++++++++++++++++++++- + 3 files changed, 178 insertions(+), 1 deletions(-) + +commit 2620c23577a73fa454298014680f4de46a69e7bb +Author: Benjamin Otte +Date: Mon Jun 29 13:33:50 2009 +0200 + + split lookup_attribute() into two functions + + gio/gfileinfo.c | 65 + +++++++++++++++++++++++++++++++----------------------- + 1 files changed, 37 insertions(+), 28 deletions(-) + +commit 66cebd72925406910f99c0fd826b8307c2a4814c +Author: Benjamin Otte +Date: Mon Jun 29 13:21:08 2009 +0200 + + split attribute hash initialization into its own function + + gio/gfileinfo.c | 22 ++++++++++++---------- + 1 files changed, 12 insertions(+), 10 deletions(-) + +commit 49172a71aacdd855918b614f3d61fa5b9248fb85 +Author: Christian Dywan +Date: Sun Jun 28 02:45:50 2009 +0200 + + Display '-h' in --help output and accept '-h' and -?' + + '-h' is the preferred short version of '--help' now and displayed + in '--help' but for backwards compatibility '-?' is still supported. + + If existing code uses '-h' for something else, GOptionContext will + not override it. + + Fixes bug 556706. + + glib/goption.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- + 1 files changed, 42 insertions(+), 7 deletions(-) + +commit 09c3f6dd4b456adbbda6818e5bb1227af045e8d8 +Author: Jani Monoses +Date: Sat Jun 27 11:03:47 2009 +0300 + + Fix C++ warnings in g_error() code + + Put space before ending semicolon in for(;;) ; to avoid C++ build + warnings. + Closes bug 586928. + + glib/gmessages.h | 10 ++++++---- + 1 files changed, 6 insertions(+), 4 deletions(-) + +commit 160c39a9af8f7b6a475c1b005a807ccefc2ff7c1 +Author: Matthias Clasen +Date: Fri Jun 26 23:18:17 2009 -0400 + + Move some uri functions to a better place + + docs/reference/glib/glib-sections.txt | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 35911ae00f5348ea4a60d66db25d70a1c45c9c43 +Author: Matthias Clasen +Date: Fri Jun 26 23:09:35 2009 -0400 + + Fix a typo + + docs/reference/glib/building.sgml | 84 + ++++++++++++++++++------------------ + 1 files changed, 42 insertions(+), 42 deletions(-) + +commit e7a258692c7ae3d9075d9ae1926c08c7ec771f04 +Author: Tom Parker +Date: Fri Jun 26 22:43:31 2009 -0400 + + Add NULL to end of g_filename_complete_get_completions() return value + + g_filename_complete_get_completions() return value is meant to be a + g_strfreev-compatible array i.e. NULL-terminated. However, pointer + arrays + aren't automagically NULL-terminated. This fixes bug 586868 + + gio/gfilenamecompleter.c | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +commit 657d0ad9183fe4410e736d20a17a70fb7d6ad6c0 +Author: Ivar Smolin +Date: Fri Jun 26 10:39:25 2009 +0300 + + Updating Estonian translation + + po/et.po | 446 + +++----------------------------------------------------------- + 1 files changed, 17 insertions(+), 429 deletions(-) + +commit d884e509db1ab6a6d388313d28b7b07cebb3dfc0 +Author: Alexander Larsson +Date: Thu Jun 25 09:18:01 2009 +0200 + + Allow setting G_FILE_ATTRIBUTE_TYPE_INVALID attributes in GFileInfo + + This is used to unset an attribute in g_file_set_attributes_from_info. + + gio/gfileattribute.c | 7 +++++++ + gio/gfileinfo.c | 2 +- + 2 files changed, 8 insertions(+), 1 deletions(-) + +commit 019e8c808f48e93f81fcb8e9e8d73a43b087cc87 +Author: Matthias Clasen +Date: Wed Jun 24 23:07:15 2009 -0400 + + Add a note about g_simple_async_result_set_op_res_pointer change + + README.in | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit b0dc7afd2ace91f5dca37af8de7b40ba45993ed0 +Author: Richard Hughes +Date: Fri Jun 19 10:16:22 2009 +0100 + + Allow GCancellable to be subclassed by adding a private structure + + gio/gcancellable.c | 114 + +++++++++++++++++++++++++++++++++------------------- + gio/gcancellable.h | 9 ++++ + 2 files changed, 81 insertions(+), 42 deletions(-) + +commit 0ccd18bc83c5e6eff77940a61cc9b31a88dd1851 +Author: David Zeuthen +Date: Mon Jun 22 15:33:41 2009 -0400 + + Bug 586675 – Runtime library location + + Introduce an option to specify the runtime location for libraries via + a relative path to libdir. + + Signed-off-by: David Zeuthen + + configure.in | 11 +++++++++++ + docs/reference/glib/building.sgml | 21 +++++++++++++++++++++ + docs/reference/glib/tmpl/fileutils.sgml | 17 +++++++++++++++++ + gio/Makefile.am | 9 +++++++++ + glib/Makefile.am | 9 +++++++++ + gmodule/Makefile.am | 9 +++++++++ + gobject/Makefile.am | 9 +++++++++ + gthread/Makefile.am | 8 ++++++++ + 8 files changed, 93 insertions(+), 0 deletions(-) + +commit 7662c86611bf44175f18ec6eb66f159040ac73c5 +Author: Alexander Larsson +Date: Thu Jun 18 09:05:27 2009 +0200 + + Add extension point for adding metadata for local files + + This adds a local_file_add_info vfunc to GVfs that vfs implementations + can override to add metadata for local files. + + gio/glocalfile.c | 75 +++++++++++++++++++++--------- + gio/glocalfileenumerator.c | 2 + + gio/glocalfileinfo.c | 108 + +++++++++++++++++++++++++++++++++++++++----- + gio/glocalfileinfo.h | 3 + + gio/gvfs.h | 26 +++++++++-- + 5 files changed, 175 insertions(+), 39 deletions(-) + +commit 9a6146f54cdc085a42095b930066853dbb4e0c67 +Author: Alexander Larsson +Date: Tue Jun 23 11:30:14 2009 +0200 + + Add g_file_info_set_attribute_status + + Required for gvfs implementation for set_attribures_from_info. + + gio/gfileinfo.c | 36 ++++++++++++++++++++++++++++++++++++ + gio/gfileinfo.h | 3 +++ + gio/gio.symbols | 1 + + 3 files changed, 40 insertions(+), 0 deletions(-) + +commit becf4186e6289c0ab5d762f1cdf88517f4adc9f5 +Author: Alexander Larsson +Date: Tue Jun 23 11:29:16 2009 +0200 + + Add g_file_info_has_namespace + + Need this to quickly see if we should set attributes from + this GFileInfo in metadata extension. + + gio/gfileinfo.c | 36 ++++++++++++++++++++++++++++++++++++ + gio/gfileinfo.h | 2 ++ + gio/gio.symbols | 1 + + 3 files changed, 39 insertions(+), 0 deletions(-) + +commit 0ed9201ad2051c33f5d049754bd8a1644d19ab7c +Author: Alexander Larsson +Date: Mon Jun 22 19:25:32 2009 +0200 + + Add string vector attribute type to GFileInfo + + This is needed for the new metadata backend since nautilus has a + string-list metadata type, and we want to use this for nautilus. + + gio/gfileattribute-priv.h | 4 +++ + gio/gfileattribute.c | 52 + +++++++++++++++++++++++++++++++++++++++++++++ + gio/gfileinfo.c | 51 + ++++++++++++++++++++++++++++++++++++++++++++ + gio/gfileinfo.h | 5 ++++ + gio/gio.symbols | 2 + + gio/gioenums.h | 4 ++- + 6 files changed, 117 insertions(+), 1 deletions(-) + +commit c1ab6454feb4447b8ef7ce6a0eb0fb38bae186df +Author: Alexander Larsson +Date: Tue Jun 23 15:07:00 2009 +0200 + + Copy namespaces correctly in g_file_copy_attributes + + File attribute namespaces are delimited with "::", but + build_attribute_list_for_copy only used ":", so we didn't copy + any writable namespaces. + + gio/gfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit e9b4f7a3bcfefc266fc575e401f07a2a4c2ce8f6 +Author: Jorge Gonzalez +Date: Sun Jun 21 11:13:20 2009 +0200 + + Updated Spanish translation + + po/es.po | 836 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 417 insertions(+), 419 deletions(-) + +commit 440bf5bee50a0abca990d69ce12fc2a844bda95c +Author: Matthias Clasen +Date: Fri Jun 19 23:44:29 2009 -0400 + + Use pipe2 when available + + This avoids a small window for races between pipe and fdset. + Reported in bug 579933 by Thiago Macieira. + + configure.in | 11 ++--------- + glib/gmain.c | 20 +++++++++++++++----- + 2 files changed, 17 insertions(+), 14 deletions(-) + +commit 854a43a3cd5cb8cc97b66d6f8f661e2a7096acda +Author: Matthias Clasen +Date: Fri Jun 19 23:18:09 2009 -0400 + + Fix build on mingw + + Mingw does not have sys/uio.h. This was reported in bug 585937. + + Author: Matthias Clasen + + configure.in | 1 + + gio/gsocket.c | 2 ++ + 2 files changed, 3 insertions(+), 0 deletions(-) + +commit 4c791f49e58688d1b8948d083c1780cab9d26e93 +Author: Ryan Lortie +Date: Thu Jun 18 15:00:01 2009 -0400 + + GMappedFile: add refcounting, switch to GSlice + + - add g_mapped_file_ref() and g_mapped_file_unref(). + - deprecate g_mapped_file_free(). + - move to GSlice for allocating the GMappedFile struct. + + docs/reference/glib/glib-sections.txt | 2 + + glib/glib.symbols | 4 ++ + glib/gmappedfile.c | 73 + +++++++++++++++++++++++++++------ + glib/gmappedfile.h | 5 ++ + 4 files changed, 71 insertions(+), 13 deletions(-) + +commit 8cb481fd5ff44c7e82f59948567ad0b417297555 +Author: Alexander Larsson +Date: Thu Jun 18 19:43:46 2009 +0200 + + Use io_prio as mainloop prio for async-emulation (#579449) + + I'm not sure why we used the elaborate formula to convert the + io-priority + to the priority of the mainloop idle when emulating async i/o + with idles. + However, it causes the default io priority to be less than the normal + idle prio, so the i/o won't be scheduled if there is an idle + outstanding. + + There is really no great mapping to use here, doing blocking i/o in an + idle of any prio is generally bad and apps doing a lot of async + i/o should + initialize threads. However, if we use the io-priority directly we + at least + avoid the starvation problem above and make things easier to + understand. + + gio/gioscheduler.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 9fba81288424cd7ef45e28565fa878c93a962c17 +Author: Benjamin Otte +Date: Thu Jun 18 15:28:41 2009 +0200 + + Revert "clarify documentation" + + This reverts commit d218cf0f670e4c40acb47ab5b5761ea0c68e0594. + This has been fixed in the code, so no need to keep the updated docs. + + gio/gsocketlistener.c | 3 +-- + 1 files changed, 1 insertions(+), 2 deletions(-) + +commit 835c03a5c1c980490543ad5d1fe426a1e5a62af9 +Author: Benjamin Otte +Date: Thu Jun 18 15:27:12 2009 +0200 + + syntax fix in documentation + + gio/gfileenumerator.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit cf95d07691ec2202400f340f1c63aca11f0790c1 +Author: Benjamin Otte +Date: Tue Jun 16 15:18:11 2009 +0200 + + fix typo in documentation + + gio/gfileenumerator.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit d218cf0f670e4c40acb47ab5b5761ea0c68e0594 +Author: Benjamin Otte +Date: Fri Jun 12 17:45:27 2009 +0200 + + clarify documentation + + gio/gsocketlistener.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit f4a64cb068cfe309e968d1db9fae4fade6d87e8a +Author: Matthias Clasen +Date: Mon Jun 15 13:27:40 2009 -0400 + + Bump version to 2.21.3 + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 785787fd6cd4b7c0120ae64ec839cfb0353c4af2 +Author: Matthias Clasen +Date: Mon Jun 15 13:25:43 2009 -0400 + + 2.21.2 + + po/am.po | 180 ++++++----- + po/ar.po | 186 +++++++----- + po/as.po | 182 ++++++----- + po/az.po | 180 ++++++----- + po/be.po | 180 ++++++----- + po/be@latin.po | 189 +++++++------ + po/bg.po | 182 ++++++----- + po/bn.po | 180 ++++++----- + po/bn_IN.po | 867 + +++++++++++++++++++++++++++-------------------------- + po/bs.po | 180 ++++++----- + po/ca.po | 187 ++++++------ + po/ca@valencia.po | 187 ++++++------ + po/cs.po | 183 +++++++----- + po/cy.po | 180 ++++++----- + po/da.po | 187 ++++++------ + po/de.po | 187 ++++++------ + po/dz.po | 180 ++++++----- + po/el.po | 182 ++++++----- + po/en_CA.po | 187 ++++++------ + po/en_GB.po | 187 ++++++------ + po/eo.po | 180 ++++++----- + po/es.po | 182 ++++++----- + po/et.po | 182 ++++++----- + po/eu.po | 182 ++++++----- + po/fa.po | 180 ++++++----- + po/fi.po | 187 ++++++------ + po/fr.po | 182 ++++++----- + po/ga.po | 191 +++++++------ + po/gl.po | 187 ++++++------ + po/gu.po | 182 ++++++----- + po/he.po | 187 ++++++------ + po/hi.po | 182 ++++++----- + po/hr.po | 181 ++++++----- + po/hu.po | 182 ++++++----- + po/hy.po | 180 ++++++----- + po/id.po | 180 ++++++----- + po/is.po | 180 ++++++----- + po/it.po | 182 ++++++----- + po/ja.po | 182 ++++++----- + po/ka.po | 179 ++++++----- + po/kn.po | 182 ++++++----- + po/ko.po | 185 ++++++------ + po/ku.po | 180 ++++++----- + po/lt.po | 189 +++++++------ + po/lv.po | 180 ++++++----- + po/mai.po | 182 ++++++----- + po/mg.po | 180 ++++++----- + po/mk.po | 189 +++++++------ + po/ml.po | 182 ++++++----- + po/mn.po | 180 ++++++----- + po/mr.po | 182 ++++++----- + po/ms.po | 180 ++++++----- + po/nb.po | 831 + ++++++++++++++++++++++++++------------------------- + po/ne.po | 180 ++++++----- + po/nl.po | 189 +++++++------ + po/nn.po | 187 ++++++------ + po/oc.po | 185 ++++++------ + po/or.po | 182 ++++++----- + po/pa.po | 182 ++++++----- + po/pl.po | 183 +++++++----- + po/ps.po | 180 ++++++----- + po/pt.po | 187 ++++++------ + po/pt_BR.po | 187 ++++++------ + po/ro.po | 183 +++++++----- + po/ru.po | 189 +++++++------ + po/rw.po | 180 ++++++----- + po/si.po | 180 ++++++----- + po/sk.po | 189 +++++++------ + po/sl.po | 191 +++++++------ + po/sq.po | 191 +++++++------ + po/sr.po | 180 ++++++----- + po/sr@ije.po | 180 ++++++----- + po/sr@latin.po | 180 ++++++----- + po/sv.po | 187 ++++++------ + po/ta.po | 182 ++++++----- + po/te.po | 182 ++++++----- + po/th.po | 185 ++++++------ + po/tl.po | 180 ++++++----- + po/tr.po | 185 ++++++------ + po/tt.po | 180 ++++++----- + po/uk.po | 183 +++++++----- + po/vi.po | 181 ++++++----- + po/wa.po | 180 ++++++----- + po/xh.po | 180 ++++++----- + po/yi.po | 180 ++++++----- + po/zh_CN.po | 185 ++++++------ + po/zh_HK.po | 185 ++++++------ + po/zh_TW.po | 185 ++++++------ + 88 files changed, 9416 insertions(+), 8034 deletions(-) + +commit 0fbeab452072cdf2dc7d1dd0356fa0d9f71fa0ac +Author: Matthias Clasen +Date: Mon Jun 15 12:57:21 2009 -0400 + + Add g_setenv + + gio/pltcheck.sh | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 90229908a13c02a024a86e4eaf96a6ba8dac57af +Author: Matthias Clasen +Date: Mon Jun 15 12:26:41 2009 -0400 + + Update for 2.21.2 + + NEWS | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 47 insertions(+), 0 deletions(-) + +commit fae755e0568472a2c37e6a9d0ad0fde809749a1f +Author: David Zeuthen +Date: Mon Jun 15 10:53:41 2009 -0400 + + Bug 585591 – Starting/stopping drives + + Add API for starting/stopping drives. This new API will enable + GVolumeMonitor and GVfs implementations to add support for the + following features + + 1. Powering down external hard disk enclosures / drives + + 2. Starting/stopping multi-disk devices (such as RAID/btrfs/ZFS) + + 3. Connecting/disconnecting iSCSI devices + + 4. Reacting to the user pressing e.g. the "remove drive" button on + a IBM/Lenovo Ultrabay: http://www.thinkwiki.org/wiki/Ultrabay + + See the bug for the corresponding GVfs and Nautilus changes. + + docs/reference/gio/gio-sections.txt | 16 ++ + gio/gdrive.c | 259 + ++++++++++++++++++++++++++++++++++- + gio/gdrive.h | 57 ++++++++ + gio/gfile.c | 179 ++++++++++++++++++++++++ + gio/gfile.h | 41 ++++++ + gio/gfileinfo.h | 31 ++++ + gio/gio.symbols | 13 ++ + gio/gioenums.h | 39 ++++++ + gio/gunionvolumemonitor.c | 12 ++ + gio/gvolumemonitor.c | 18 +++ + gio/gvolumemonitor.h | 5 +- + 11 files changed, 666 insertions(+), 4 deletions(-) + +commit bb4f7c48f9510c1fd96de067cd8f18cd41b1a1f0 +Author: Ondrej Jirman +Date: Sat May 30 08:23:46 2009 +0200 + + Fix incorrect freeing of thread pool in GThreadedSocketService + (#584255) + + gio/gthreadedsocketservice.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 31cb0bdcb0f334ad904e088acb3a417452a4d67f +Author: Alexander Larsson +Date: Mon Jun 15 15:43:39 2009 +0200 + + Emit changed in g_socket_listener_add_socket, not in add_address + + This way we emit this signal when add_socket is called from another + place than add_address too. + + gio/gsocketlistener.c | 7 ++++--- + 1 files changed, 4 insertions(+), 3 deletions(-) + +commit a640695f1609805a0fe745d35c2055a984410bb5 +Author: Alexander Larsson +Date: Mon Jun 15 15:42:38 2009 +0200 + + Ref the passed in socket in g_socket_listener_add_socket (#585599) + + gio/gsocketlistener.c | 23 ++++++++++++++++++----- + 1 files changed, 18 insertions(+), 5 deletions(-) + +commit 67de6cba508d7f2e0c310527667df2efcf4a543a +Author: Alexander Larsson +Date: Mon Jun 15 14:23:57 2009 +0200 + + Add bound address out-argument to g_socket_listener_add_address + (#585566) + + This is very useful when binding to "any" port. + + gio/gsocketlistener.c | 20 ++++++++++++++++++++ + gio/gsocketlistener.h | 1 + + 2 files changed, 21 insertions(+), 0 deletions(-) + +commit 91bdccff7544ee19d329ec73db02fd5f11c617fd +Author: Alexander Larsson +Date: Mon Jun 15 13:18:22 2009 +0200 + + Add g_reload_user_special_dirs_cache (#541276) + + This is useful for nautilus that changes the xdg-user-dirs files. + + glib/glib.symbols | 1 + + glib/gutils.c | 53 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + glib/gutils.h | 1 + + 3 files changed, 55 insertions(+), 0 deletions(-) + +commit 740ae3aa29cc50f588fb3ac47f6125acbccd20b6 +Author: Alexander Larsson +Date: Mon Jun 15 12:25:43 2009 +0200 + + Avoid unnecessary work if mount watching not specified (#585360) + + If G_FILE_MONITOR_WATCH_MOUNTS isn't specified, don't do all the work + when the mtab changes. + + gio/glocaldirectorymonitor.c | 29 +++++++++++++++++++++++++---- + gio/glocaldirectorymonitor.h | 1 + + 2 files changed, 26 insertions(+), 4 deletions(-) + +commit 129eb074823101102611690f053ffa246bb7784d +Author: Matthias Clasen +Date: Mon Jun 15 01:45:34 2009 -0400 + + Support special icons for xdg user dirs + + The icon names are folder-documents, folder-download, folder-music, + folder-pictures, folder-publicshare, folder-templates, folder-videos. + See bug 541276. + + gio/glocalfileinfo.c | 18 ++++++++++++++++-- + 1 files changed, 16 insertions(+), 2 deletions(-) + +commit 50a7f530557e35c6dfc543d969c0369d53d45a87 +Author: Matthias Clasen +Date: Mon Jun 15 01:12:50 2009 -0400 + + Don't use deprecated GLib api + + Fixes bug 585673. + + gio/tests/resolver.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 2553df615d21e68d52f1e0b45ac8b70622d2881e +Author: Matthias Clasen +Date: Mon Jun 15 01:09:25 2009 -0400 + + Refer to the correct gcc deprecation options + + This oversight was pointed out in bug 585520. + + docs/reference/glib/tmpl/macros_misc.sgml | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 2c5ac901d95f28db1edad2807f842396c594a49e +Author: Matthias Clasen +Date: Mon Jun 15 01:03:54 2009 -0400 + + Fix some typos in list documentation + + This fixes bug 585726. + + docs/reference/glib/tmpl/linked_lists_double.sgml | 4 ++-- + docs/reference/glib/tmpl/linked_lists_single.sgml | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit b0bba8520acd423785075ba67e6e4b644fce765f +Author: Matthias Clasen +Date: Mon Jun 15 00:52:43 2009 -0400 + + Extract strings from g_dngettext too + + There is one occurrence of this in glib, which we currently miss. + See bug 585717. + + po/Makefile.in.in | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit 642e9c75400cc12f0fad26e3f3df5ac6a39e0822 +Author: Matthias Clasen +Date: Mon Jun 15 00:45:55 2009 -0400 + + Fix the icon property implementation + + Turns out both the setter and the getter were broken... + Fixes bug 585676. + + gio/gemblem.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit b533a944ffc83ad90cd8b6fba00f4e0bebcd0741 +Author: Matthias Clasen +Date: Mon Jun 15 00:38:34 2009 -0400 + + Trivial formatting fixes + + gio/gemblem.c | 63 + ++++++++++++++++++++++++++++----------------------------- + 1 files changed, 31 insertions(+), 32 deletions(-) + +commit ce4aa6253eea2b24c0e4a99f9a1d7f31b9cec979 +Author: Matthias Clasen +Date: Sun Jun 14 23:55:12 2009 -0400 + + Include sys/uio.h for struct iovec + + This fixes the build on OS X, bug 585280. + + gio/gsocket.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 8a3a3d797e7ef3b66c917c1c0a2ec47300bbf661 +Author: Matthias Clasen +Date: Sun Jun 14 22:26:52 2009 -0400 + + Use inotify_init1 when available + + To avoid leaking the inotify fd. Fixes bug 585478. + + configure.in | 1 + + gio/inotify/inotify-kernel.c | 9 +++++++-- + 2 files changed, 8 insertions(+), 2 deletions(-) + +commit 4dbc2074bc857464e64549fac2b7403c4e9566c1 +Author: Ryan Lortie +Date: Sun Jun 14 13:58:35 2009 -0400 + + Add GNIO test cases to .gitignore + + gio/tests/.gitignore | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +commit cb1a6092405b2f6d9b82e7c1b757951d695c5fe6 +Author: Ryan Lortie +Date: Fri Jun 12 13:01:04 2009 -0400 + + Bug 585575 – g_socket_listener_add_inet_port() + + Change the logic in g_socket_listener_add_inet_port() as per the + reasoning in the bug report. + + - If the OS supports neither IPv6 or IPv4, fail. + - If the OS supports only IPv6, do that. + - If the OS supports only IPv4, do that. + - If the OS supports IPv6 and IPv6 "speaks" IPv4 then bind it + and be done. + - If the OS supports IPv6 and IPv6 doesn't "speak" IPv4 then + create an additional socket for IPv4. + - If binding any socket fails then fail the entire call. + + Also, remove the ability to call this function with port == 0. This + is a useless thing to do anyway since you have no way to know what + port number was actually allocated. We should have a separate + function to deal with this. + + gio/gsocketlistener.c | 164 + +++++++++++++++++++++++++++++++++++++----------- + 1 files changed, 126 insertions(+), 38 deletions(-) + +commit f7d756f5b6c9975452e57ac6f41ff69d9f456739 +Author: Ryan Lortie +Date: Fri Jun 12 12:21:07 2009 -0400 + + add g_socket_speaks_ipv4() + + Partial fix for Bug 585575. + + docs/reference/gio/gio-sections.txt | 1 + + gio/gio.symbols | 1 + + gio/gsocket.c | 48 + +++++++++++++++++++++++++++++++++++ + gio/gsocket.h | 1 + + 4 files changed, 51 insertions(+), 0 deletions(-) + +commit fd22781b184529c2a838272b76d71b4b498366ba +Author: Benjamin Otte +Date: Fri Jun 12 15:57:51 2009 +0200 + + make all APIs that take inet port arguments take a guint16 + + gio/gsocketclient.c | 4 ++-- + gio/gsocketclient.h | 4 ++-- + gio/gsocketlistener.c | 2 +- + gio/gsocketlistener.h | 6 +++--- + 4 files changed, 8 insertions(+), 8 deletions(-) + +commit 3e3e3c29469f03ec7f141b2522accdb7c2acd59d +Author: Benjamin Otte +Date: Fri Jun 12 15:57:12 2009 +0200 + + don't make strings const when they are not + + gets rid of compiler warnings + + gio/gdesktopappinfo.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit a402875de1d8956c90a940f8309733040cda5afb +Author: Matthias Clasen +Date: Thu Jun 11 12:41:16 2009 -0400 + + Fix an oversight in the previous commit + + We don't want to unset DISPLAY etc, if none is specified in the + app launch context. + + gio/gdesktopappinfo.c | 4 ---- + 1 files changed, 0 insertions(+), 4 deletions(-) + +commit 6224d3d2ecdbc3cacfdb8213de3cf53d6dfc8580 +Author: Matthias Clasen +Date: Wed Jun 10 23:50:45 2009 -0400 + + Fix g_string_chunk_insert_len to accept nuls + + Contrary to what the documentation says, g_string_chunk_insert_len + was stopping at the first nul. Also add a test. Fixes bug 585088. + + glib/gstring.c | 54 + ++++++++++++++++++++++++-------------------------- + glib/tests/string.c | 23 +++++++++++++++++++++ + 2 files changed, 49 insertions(+), 28 deletions(-) + +commit 9e43937d03443d6e8f63ea2c75c0fd54aaa124b3 +Author: Matthias Clasen +Date: Wed Jun 10 23:28:32 2009 -0400 + + Include sys/types.h in gunixfdmessage.c + + As recommended in 'man socket'. Fixes bug 585281. + + gio/gunixfdmessage.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit d3d81f74c5c227fb17494c0388ede1e83557a7e1 +Author: Matthias Clasen +Date: Wed Jun 10 16:20:51 2009 -0400 + + Make setting DISPLAY work + + And remove a bunch of grotty code to manipulate an environment + array at the same time. Instead, simply call setenv in the child_setup + function. + + gio/gdesktopappinfo.c | 232 + ++++++++++-------------------------------------- + 1 files changed, 49 insertions(+), 183 deletions(-) + +commit 83ae249a2efc6f6445b5655cc16841ee2f9d3f75 +Author: Matthias Clasen +Date: Wed Jun 10 16:20:38 2009 -0400 + + Support automake 1.11 + + autogen.sh | 10 +++++++--- + 1 files changed, 7 insertions(+), 3 deletions(-) + +commit ff2532aead7a73ca92d0b8a964d143c69e78c6cd +Author: Kjartan Maraas +Date: Wed Jun 10 09:43:33 2009 +0200 + + Updated Norwegian bokmÃ¥l translation. + + po/nb.po | 903 + +++++++++++++++++++++++++++++--------------------------------- + 1 files changed, 419 insertions(+), 484 deletions(-) + +commit 74a3c71dcfb8f15692efd572670d28cb04caa868 +Author: Dan Winship +Date: Tue Jun 9 09:32:43 2009 -0400 + + Revert part of fix for old OS X that broke the compile on current OS X + + http://bugzilla.gnome.org/show_bug.cgi?id=584574 + + gio/libasyncns/g-asyncns.h | 8 +------- + 1 files changed, 1 insertions(+), 7 deletions(-) + +commit 059ec81c9e88ee5ec67aafd135714754ea5b9552 +Author: Michael Meeks +Date: Tue Jun 9 11:31:42 2009 +0100 + + move start_element emission out into a new (inlined) function, so + the alloca'd memory is released on return, rather than slowly blowing + the stack. + + glib/gmarkup.c | 76 + +++++++++++++++++++++++++++++++------------------------- + 1 files changed, 42 insertions(+), 34 deletions(-) + +commit ced88fd0de4aedb537552561582875b427081eeb +Author: Benjamin Otte +Date: Tue Jun 9 10:54:22 2009 +0200 + + Bug 585189 – g_cancellable_reset() must be called in same thread ... + + ... as g_cancellable_cancel() + Rework a g_critical() that would (rarely) trigger when _reset() was + called in a thread different from _cancel() by making _reset() + wait for + the cancel function to be finished the same way + g_cancellable_disconnect() uses. + + gio/gcancellable.c | 8 ++++---- + 1 files changed, 4 insertions(+), 4 deletions(-) + +commit 7d4b7063057a9473491141e4d26fbcec17bb83ec +Author: Runa Bhattacharjee +Date: Tue Jun 9 11:48:53 2009 +0530 + + Updated Bengali India Translations + + po/bn_IN.po | 982 + +++++++++++++++++++++++++++------------------------------- + 1 files changed, 457 insertions(+), 525 deletions(-) + +commit 139af6f70032cad02b3cd965521c0c0cdb0dc8cf +Author: Benjamin Otte +Date: Mon Jun 8 17:29:22 2009 +0200 + + update the overview image of the gio docs + + The old image was confusing and after some discussions in #nautilus we + made a new one. + + docs/reference/gio/gvfs-overview.odg | Bin 10542 -> 17772 bytes + docs/reference/gio/gvfs-overview.png | Bin 49138 -> 48474 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +commit 74fd3e734f3b6e7702ee1a859855ef6bd1c28ef9 +Author: Benjamin Otte +Date: Mon Jun 8 15:29:57 2009 +0200 + + typo in documentation + + gio/gsocketconnection.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 29a4a0a44dc09dabe071a989da2500b2bc143cbd +Author: Benjamin Otte +Date: Mon Jun 8 15:27:12 2009 +0200 + + only query file info in g_file_copy() when we need it + + The default implementation of g_file_copy() checked the size of + the file + to copy to give useful progress updates unconditionally. This + can cause + long delays on 1-connection FTP servers while it tries to open + a second + connection before it returns EBUSY. This patch makes this query only + happen when we actually send progress updates. + + gio/gfile.c | 34 +++++++++++++++++++--------------- + 1 files changed, 19 insertions(+), 15 deletions(-) + +commit 0bb5739f323396b40bbe6470c505606ea265afa0 +Author: Alexander Larsson +Date: Mon Jun 1 22:09:21 2009 +0200 + + Reformat g_themed_icon_get_names return type to make gtk-doc work + + Seems the gtk-doc scanner needs "const gchar* const *" to work, + so switching + to that. + + gio/gthemedicon.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit ce6fbd623115c88cfdf0f5ed36b01cca201ba78e +Author: Dan Winship +Date: Thu May 28 15:27:04 2009 -0400 + + Fix multiple bugs in g_srv_target_list_sort() + + In particular, targets with weight 0 should be very UNlikely to be + selected, not very likely, as they were before. However, even ignoring + that bug in the logic, there was an additional bug (swapping list + items would cause the 0-weight items to get re-ordered incorrectly + anyway), and the code contained several fencepost errors. + + This patch also adds gio/tests/srvtarget.c, which confirms that for a + sample list of targets, we now generate all possible correct random + sortings and no incorrect sortings, and the correct sortings occur in + roughly the expected proportions (though if the current code is + still wrong, those proportions may be wrong as well). + + http://bugzilla.gnome.org/show_bug.cgi?id=583398 + + gio/gsrvtarget.c | 92 +++++++++++++--------------- + gio/tests/Makefile.am | 6 ++- + gio/tests/srvtarget.c | 157 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 205 insertions(+), 50 deletions(-) + +commit 1ca91a212503e64a150c78cdb9ce0489efaa7a59 +Author: Dan Winship +Date: Sat May 23 21:49:47 2009 -0300 + + Clarify some GSocket docs + + gio/gsocket.c | 218 + +++++++++++++++++++++++++++++++-------------------------- + 1 files changed, 120 insertions(+), 98 deletions(-) + +commit 5b3d62a7a6d4354b1588dd94f477c44bd15f1753 +Author: Dan Winship +Date: Mon Apr 27 17:35:04 2009 -0400 + + Misc networking build fixes + + http://bugzilla.gnome.org/show_bug.cgi?id=580301 + http://bugzilla.gnome.org/show_bug.cgi?id=584176 + + gio/gnetworkaddress.c | 8 +------- + gio/gnetworkingprivate.h | 8 +++++++- + gio/gresolver.c | 2 +- + gio/gsocket.c | 8 +------- + gio/gsocketcontrolmessage.c | 5 +---- + gio/gunixresolver.c | 1 - + gio/gunixsocketaddress.c | 2 -- + gio/libasyncns/g-asyncns.h | 17 +++++++++++++++++ + 8 files changed, 28 insertions(+), 23 deletions(-) + +commit 85816117e3da8c8751bb9c12f93580c9910ec8da +Author: Tor Lillqvist +Date: Mon Jun 1 14:04:49 2009 +0300 + + Bump _WIN32_WINNT to 0x0501 + + Needed to get prototypes for getaddrinfo() and friends on mingw. + + gio/gnetworkingprivate.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 4a50bab276cdbde6387c0dd07666de1879e2d6c9 +Author: Hans Breuer +Date: Sat May 30 15:33:14 2009 +0200 + + Define fstat() for msvc build + + glib/giowin32.c | 4 ++++ + glib/gkeyfile.c | 4 ++++ + glib/gmappedfile.c | 5 +++++ + 3 files changed, 13 insertions(+), 0 deletions(-) + +commit 75ef01824803c70f42d412c19d4e61904702e461 +Author: Hans Breuer +Date: Sat May 30 15:29:23 2009 +0200 + + Updated msvc build files + + README.win32 | 13 ++++-- + config.h.win32.in | 3 + + gio/makefile.msc | 82 ++++++++++++++++------------------ + gio/win32/makefile.msc | 35 +++++++++++++++ + glib/makefile.msc.in | 114 + ++++++++++++++++++++++++++---------------------- + glibconfig.h.win32.in | 5 ++ + tests/makefile.msc.in | 39 ++++++++-------- + 7 files changed, 172 insertions(+), 119 deletions(-) + +commit 780185449fadcbc5d79d9dea245067c16f475a92 +Author: Hans Breuer +Date: Sat May 30 15:24:06 2009 +0200 + + Version resource template for gio + + gio/gio.rc.in | 30 ++++++++++++++++++++++++++++++ + 1 files changed, 30 insertions(+), 0 deletions(-) + +commit 73dbe591fb9ae98aab6902cf213132e2ad99c88c +Author: Hans Breuer +Date: Sat May 30 15:18:02 2009 +0200 + + Handle EAI_NODATA==EAI_NONAME in win32 SDK + + gio/gresolver.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit cbca0ac5d92df015902b3fd8a9086a29b20bc6f9 +Author: Hans Breuer +Date: Sat May 30 15:14:01 2009 +0200 + + Include io.h for write() on win32 + + gio/gcancellable.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 136793cc5e5e808c82d21664c0ba96c95c8f7075 +Author: Hans Breuer +Date: Sat May 30 15:08:29 2009 +0200 + + Simplified for pre-built package use + + build/win32/make.msc | 120 + ++++++++++++++++++++++++++++++++++------------ + build/win32/module.defs | 29 ++++++++---- + 2 files changed, 108 insertions(+), 41 deletions(-) + +commit f4e89ab87702d220babc4d18ec8450e351d3c06e +Author: Hans Breuer +Date: Sat May 30 15:02:14 2009 +0200 + + Replace FIXME with proper SDK version define + + gio/gnetworkingprivate.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 661bb521d126480606e12a15f722069eeddfc306 +Author: Matthias Clasen +Date: Thu May 28 23:50:48 2009 -0400 + + Bump version + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 33a2f5a21212a62e96ba8f5691a51d512a8925bd +Author: Matthias Clasen +Date: Thu May 28 23:44:48 2009 -0400 + + Release 2.21.1 + + docs/reference/glib/tmpl/glib-unused.sgml | 67 --- + docs/reference/glib/tmpl/macros_misc.sgml | 6 +- + docs/reference/glib/tmpl/types.sgml | 2 + + docs/reference/glib/tmpl/version.sgml | 68 +++ + po/am.po | 203 ++++---- + po/ar.po | 203 ++++---- + po/as.po | 203 ++++---- + po/az.po | 203 ++++---- + po/be.po | 207 ++++---- + po/be@latin.po | 206 ++++---- + po/bg.po | 205 ++++---- + po/bn.po | 203 ++++---- + po/bn_IN.po | 203 ++++---- + po/bs.po | 203 ++++---- + po/ca.po | 204 ++++---- + po/ca@valencia.po | 815 + +++++++++++++++-------------- + po/cs.po | 204 ++++---- + po/cy.po | 204 ++++---- + po/da.po | 204 ++++---- + po/de.po | 205 ++++---- + po/dz.po | 203 ++++---- + po/el.po | 204 ++++---- + po/en_CA.po | 203 ++++---- + po/en_GB.po | 203 ++++---- + po/eo.po | 203 ++++---- + po/es.po | 815 + ++++++++++++++--------------- + po/et.po | 203 ++++---- + po/eu.po | 205 ++++---- + po/fa.po | 203 ++++---- + po/fi.po | 203 ++++---- + po/fr.po | 205 ++++---- + po/ga.po | 203 ++++---- + po/gl.po | 205 ++++---- + po/gu.po | 203 ++++---- + po/he.po | 203 ++++---- + po/hi.po | 203 ++++---- + po/hr.po | 204 ++++---- + po/hu.po | 205 ++++---- + po/hy.po | 203 ++++---- + po/id.po | 205 ++++---- + po/is.po | 203 ++++---- + po/it.po | 205 ++++---- + po/ja.po | 203 ++++---- + po/ka.po | 203 ++++---- + po/kn.po | 203 ++++---- + po/ko.po | 203 ++++---- + po/ku.po | 203 ++++---- + po/lt.po | 204 ++++---- + po/lv.po | 203 ++++---- + po/mai.po | 203 ++++---- + po/mg.po | 205 ++++---- + po/mk.po | 205 ++++---- + po/ml.po | 203 ++++---- + po/mn.po | 203 ++++---- + po/mr.po | 204 ++++---- + po/ms.po | 203 ++++---- + po/nb.po | 204 ++++---- + po/ne.po | 203 ++++---- + po/nl.po | 205 ++++---- + po/nn.po | 203 ++++---- + po/oc.po | 203 ++++---- + po/or.po | 234 +++++---- + po/pa.po | 203 ++++---- + po/pl.po | 205 ++++---- + po/ps.po | 203 ++++---- + po/pt.po | 203 ++++---- + po/pt_BR.po | 205 ++++---- + po/ro.po | 203 ++++---- + po/ru.po | 204 ++++---- + po/rw.po | 203 ++++---- + po/si.po | 203 ++++---- + po/sk.po | 205 ++++---- + po/sl.po | 205 ++++---- + po/sq.po | 204 ++++---- + po/sr.po | 203 ++++---- + po/sr@ije.po | 203 ++++---- + po/sr@latin.po | 203 ++++---- + po/sv.po | 204 ++++---- + po/ta.po | 203 ++++---- + po/te.po | 203 ++++---- + po/th.po | 203 ++++---- + po/tl.po | 204 ++++---- + po/tr.po | 203 ++++---- + po/tt.po | 203 ++++---- + po/uk.po | 204 ++++---- + po/vi.po | 204 ++++---- + po/wa.po | 203 ++++---- + po/xh.po | 204 ++++---- + po/yi.po | 203 ++++---- + po/zh_CN.po | 203 ++++---- + po/zh_HK.po | 203 ++++---- + po/zh_TW.po | 203 ++++---- + 92 files changed, 10246 insertions(+), 9069 deletions(-) + +commit 479c45564a7010dad0742912506e1dff9b61fdd5 +Author: Matthias Clasen +Date: Thu May 28 23:06:24 2009 -0400 + + Update NEWS once more + + NEWS | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 62abf79be2f7133d4c14aa89a04ac7261e00b9f0 +Author: Matthias Clasen +Date: Thu May 28 14:40:04 2009 -0400 + + Another pedantic docs fix + + gio/gsocket.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit d32226da6d4ff565aebd41b5f126d625dc42816b +Author: Alexander Larsson +Date: Thu May 28 15:34:07 2009 +0200 + + Ref the right type in g_socket_control_message_deserialize + + We were not looking at the right type at all due to a typo. + + gio/gsocketcontrolmessage.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 390549f6c4968b14ce4a141781f1131f6a09eafe +Author: Alexander Larsson +Date: Thu May 28 15:33:52 2009 +0200 + + Document g_socket_control_message_deserialize + + gio/gsocketcontrolmessage.c | 18 +++++++++++++----- + 1 files changed, 13 insertions(+), 5 deletions(-) + +commit dbe7408a5c06b4e88cf2605a24b0949adc02446c +Author: Shixin Zeng +Date: Thu May 28 12:52:23 2009 +0300 + + Fix string length bugs in GWinHttpFile (#580347) + + gio/win32/gwinhttpfile.c | 10 +++++----- + 1 files changed, 5 insertions(+), 5 deletions(-) + +commit a859f883cf939b1010c3783ad34879b2ba897bfe +Author: Matthias Clasen +Date: Thu May 28 00:30:21 2009 -0400 + + Fix make check + + gio/ginetsocketaddress.c | 2 +- + gio/gnetworkaddress.c | 2 +- + gio/gnetworkservice.c | 2 +- + gio/gsocketconnectable.c | 2 +- + gio/gsocketcontrolmessage.c | 2 +- + gio/gsocketinputstream.c | 5 +++++ + gio/gsocketoutputstream.c | 7 +++++++ + gio/gthreadedsocketservice.c | 2 +- + gio/gunixfdmessage.c | 2 +- + gio/gunixsocketaddress.c | 2 +- + gio/pltcheck.sh | 2 +- + 11 files changed, 21 insertions(+), 9 deletions(-) + +commit a39670dade8d68062a9ed2a3695b68945f34c5a5 +Author: Matthias Clasen +Date: Thu May 28 00:08:42 2009 -0400 + + Update for 2.21.1 + + NEWS | 40 ++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 40 insertions(+), 0 deletions(-) + +commit 576839adbe9a72903fd435d24dbbb7826c691fcc +Author: Matthias Clasen +Date: Wed May 27 22:44:31 2009 -0400 + + Fix references to nonexisting functions + + gio/gasyncinitable.c | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit 06144900ec87effb99c94e2d8369ca270d024bf1 +Author: Matthias Clasen +Date: Wed May 27 18:20:08 2009 -0400 + + Documentation and coding style fixups + + Lots of pedanic changes. + + docs/reference/gio/gio-sections.txt | 18 ++-- + docs/reference/gio/gio.types | 1 + + gio/gasyncinitable.c | 165 ++++++++++++----------- + gio/gfile.c | 155 +++++++++++----------- + gio/ginetaddress.c | 165 ++++++++++++++++++----- + gio/ginetsocketaddress.c | 28 +++-- + gio/ginitable.c | 22 ++-- + gio/ginitable.h | 3 +- + gio/gioenums.h | 48 +++++--- + gio/giostream.c | 132 +++++++++--------- + gio/giotypes.h | 15 +- + gio/gnetworkaddress.c | 44 ++++--- + gio/gnetworkaddress.h | 16 +- + gio/gnetworkservice.c | 32 +++-- + gio/gresolver.c | 6 +- + gio/gresolver.h | 2 +- + gio/gsocket.c | 247 + +++++++++++++++++++---------------- + gio/gsocketaddress.c | 17 ++- + gio/gsocketaddressenumerator.c | 34 +++--- + gio/gsocketaddressenumerator.h | 2 +- + gio/gsocketclient.c | 106 ++++++++------- + gio/gsocketclient.h | 16 +- + gio/gsocketconnectable.c | 4 +- + gio/gsocketconnectable.h | 4 +- + gio/gsocketconnection.c | 102 ++++++++------- + gio/gsocketconnection.h | 26 ++-- + gio/gsocketcontrolmessage.c | 39 ++++-- + gio/gsocketlistener.c | 116 ++++++++-------- + gio/gsocketservice.c | 35 +++--- + gio/gsocketservice.h | 2 +- + gio/gsrvtarget.c | 4 +- + gio/gtcpconnection.c | 30 +++-- + gio/gthreadedsocketservice.c | 24 ++-- + gio/gunixconnection.c | 20 ++-- + gio/gunixconnection.h | 2 +- + gio/gunixfdmessage.c | 43 ++++--- + gio/gunixfdmessage.h | 6 +- + gio/gunixsocketaddress.c | 4 +- + 38 files changed, 964 insertions(+), 771 deletions(-) + +commit eecbbb0a20a114b4a2c6759aa108940902c8961c +Author: Matthias Clasen +Date: Wed May 27 12:07:13 2009 -0400 + + Fix the an index title + + docs/reference/gio/gio-docs.xml | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 00151ec0e1ea5c6b8be13c70a8808bc0ff380e3b +Author: Matthias Clasen +Date: Wed May 27 12:01:14 2009 -0400 + + Fix a locking problem in g_main_context_iterate() + + We failed to ensure that the context is locked on every exit of + the function. This fixes bug 583324. + + glib/gmain.c | 15 ++++++--------- + 1 files changed, 6 insertions(+), 9 deletions(-) + +commit 209a662c2fb664bed2bf4e26bbda784ca7c0739d +Author: Hans Breuer +Date: Wed May 27 15:12:31 2009 +0300 + + Correct reference and implement close_fn (#578769) + + Do proper referencing and unreferencing of + GWinHttpFileInputStream::file and + GWinHttpFileInputStream::file::vfs. Implement + GWinHttpFileInputStream::close_fn. + + gio/win32/gwinhttpfile.c | 5 ++++- + gio/win32/gwinhttpfileinputstream.c | 23 ++++++++++++++++++++++- + 2 files changed, 26 insertions(+), 2 deletions(-) + +commit 623f99dc3dee7712da4ac209ba445b2199b2963c +Author: Alexander Larsson +Date: Wed May 27 11:11:37 2009 +0200 + + Add required defines on solaris for GSocket to build (#582856) + + Turns out that the msg_control and related things are not defined + in the + system headers unless you define some _XOPEN_SOURCE things. + + configure.in | 8 ++++++++ + 1 files changed, 8 insertions(+), 0 deletions(-) + +commit f99be75ff9d62f8e8e4e8850e34fe1020e58cb8c +Author: Alexander Larsson +Date: Mon May 25 15:46:35 2009 +0200 + + Remove mention of non-existing calls from docs + + The docs mentions a separate seekable API for the various file streams + which don't actually exists. Change this to refer to the generic + GSeekable calls. + + gio/gfileinputstream.c | 10 ++++------ + gio/gfileiostream.c | 14 +++++++------- + gio/gfileoutputstream.c | 17 ++++++++--------- + 3 files changed, 19 insertions(+), 22 deletions(-) + +commit 3c0feca7f109c68e8c2a278875e576b18966d299 +Author: Alexander Larsson +Date: Mon May 25 12:47:12 2009 +0200 + + Don't end enum with comma (#583663) + + This is valid C but breaks C++, so don't put it in headers. + + gio/gioenums.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit c93c98732aefb8472c94e75fea36f4924c7c746c +Author: Alexander Larsson +Date: Mon May 25 12:46:03 2009 +0200 + + Don't return something from a void function (#583408) + + gio/gsocketcontrolmessage.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit ce171195d99c57e895bb02c7b324c811f958a91f +Author: Alexander Larsson +Date: Mon May 25 11:33:56 2009 +0200 + + Add g_inet_address_get_native_size (#583205) + + This can be used to get the size of g_inet_address_to_bytes(). + + docs/reference/gio/gio-sections.txt | 1 + + gio/ginetaddress.c | 22 +++++++++++++++++++++- + gio/ginetaddress.h | 2 ++ + gio/gio.symbols | 1 + + 4 files changed, 25 insertions(+), 1 deletions(-) + +commit fb70c6420b63a17bed11b594dd7255df08424fec +Author: Miquel Esplà +Date: Mon May 25 00:23:58 2009 +0200 + + Added Valencian-Catalan translation + + po/LINGUAS | 1 + + po/ca@valencia.po | 1939 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 1940 insertions(+), 0 deletions(-) + +commit bde3e9c3549bc74bdd2061945f2647fdd8aa3b77 +Author: Jorge Gonzalez +Date: Sat May 23 20:00:22 2009 +0200 + + Updated Spanish translation + + po/es.po | 29 +++++++++++++++++++---------- + 1 files changed, 19 insertions(+), 10 deletions(-) + +commit 37bd225d7b28e12fd78344d07e656cc2ff0d8d75 +Author: Christian Persch +Date: Tue May 27 23:45:08 2008 +0200 + + Fix grammar in error message + + Bug #583198. + + glib/gkeyfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 76ebe6c069b7fb1d09e6b95172185b325a3bb28e +Author: Christian Persch +Date: Sat May 24 20:51:07 2008 +0200 + + Plug a mem leak + + Bug #583196. + + glib/tests/keyfile.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit fc9a888b8cb8b16f093caa5d5faf4057fad1c0ef +Author: Christian Persch +Date: Tue Jan 27 20:39:37 2009 +0100 + + Add G_G[U]INTPTR_FORMAT and G_GINTPTR_MODIFIER + + Add macros for printf formatting for g[u]intptr. Bug 569376. + + configure.in | 16 ++++++++++++++++ + docs/reference/glib/glib-sections.txt | 3 +++ + docs/reference/glib/tmpl/macros_misc.sgml | 26 + ++++++++++++++++++++++++++ + docs/reference/glib/tmpl/types.sgml | 12 ++++++++++++ + 4 files changed, 57 insertions(+), 0 deletions(-) + +commit d046bfe577f71b45b40d8b0592409c88945bb934 +Author: Christian Persch +Date: Tue Jan 27 19:54:27 2009 +0100 + + Document g[u]intptr + + Bug 569375. + + docs/reference/glib/glib-sections.txt | 4 ++++ + docs/reference/glib/tmpl/types.sgml | 19 ++++++++++++++++++- + 2 files changed, 22 insertions(+), 1 deletions(-) + +commit 54b43229f4d6c3bf456f7b910bc00722a4f956d8 +Author: Christian Persch +Date: Mon Apr 20 13:46:09 2009 +0200 + + Use g_error_new_valist instead of a private copy of it + + gio/gsimpleasyncresult.c | 19 +------------------ + 1 files changed, 1 insertions(+), 18 deletions(-) + +commit 01b79d67ef0294dd633ccb0998a6d9053772da05 +Author: Yeti +Date: Mon Apr 20 13:22:17 2009 +0200 + + Make g_error_new_valist public + + Bug #569024. + + docs/reference/glib/glib-sections.txt | 1 + + docs/reference/glib/tmpl/error_reporting.sgml | 12 ++++++++++++ + glib/gerror.c | 16 +++++++++++++++- + glib/gerror.h | 6 ++++++ + glib/glib.symbols | 1 + + 5 files changed, 35 insertions(+), 1 deletions(-) + +commit 14d53dcfa8a781a79bd61f50bb73c4a1b3b7857e +Author: Alexander Larsson +Date: Wed May 20 16:28:20 2009 +0200 + + Fix connect on win32 + + We should not wait before calling connect for non-blocking connect. + Also, use the right error code for the nonblocking pending case + on win32. + + gio/gsocket.c | 7 +------ + 1 files changed, 1 insertions(+), 6 deletions(-) + +commit bb66fdcce32fedb31ddba2a5aaa4cd1c8f0cdc9e +Author: Alexander Larsson +Date: Wed May 20 15:59:11 2009 +0200 + + Fix build on win32 + + gio/gsocket.c | 18 +++++++++++------- + 1 files changed, 11 insertions(+), 7 deletions(-) + +commit c897cca601fdf9a91f214a33af33a812680b983e +Author: Alexander Larsson +Date: Wed May 20 15:58:28 2009 +0200 + + Don't add unix specific APIs on win32 + + gio/gio.symbols | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit 5a46e4d1406da1a319e421e908aec768760ef139 +Author: Alexander Larsson +Date: Wed May 20 14:55:14 2009 +0200 + + Clarify g_cancellable_push_current docs wrt cancellable being NULL + (#575013) + + gio/gcancellable.c | 22 +++++++++++----------- + 1 files changed, 11 insertions(+), 11 deletions(-) + +commit ab29e09dac547c501892cac8cd64721c3f157f00 +Author: Alexander Larsson +Date: Wed May 20 14:46:51 2009 +0200 + + Don't dereference identifier_type if it is NULL (#579558) + + gio/gunixvolume.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit d0d10e847f3ea347d651714050a8bafd5332e2cb +Author: Robert Bragg +Date: Wed May 6 09:20:43 2009 +0100 + + Take a reference on the gio file monitors while signaling pending + file changes + + It was possible for a signal handler to remove the last reference and + dispose the monitor. If there were remaining pending_file_changes + they + tried to dereference the disposed monitor. + + This patch simply calls g_object_{ref,unref} around the loop that + signals + the changes. + + gio/gfilemonitor.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 6a9df8256aaccd717aaa7582c704093d727699fe +Author: Alexander Larsson +Date: Wed May 20 14:17:27 2009 +0200 + + Use G_GSSIZE_FORMAT where needed (#577884) + + gio/tests/live-g-file.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 7498049a1683db50805b9a9a580b62bb748918f4 +Author: Sjoerd Simons +Date: Wed May 20 13:59:50 2009 +0200 + + Propagate errors from g_network_service_address_enumerator_next_async + in its _finish function + + gio/gnetworkservice.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 2be66c0458aca37fef8337692fe5b5fe20bc5ccb +Author: Jonathon Jongsma +Date: Tue May 19 00:10:57 2009 -0500 + + Typedef GResolverClass in the standard way + + It's a bit lame, but some of our C++ wrapping scripts expect objects + to be + typedefed like: + typedef struct _FooClass FooClass; + struct {} _FooClass; + + Rather than: + typedef struct {} FooClass; + + Functionally they're the same, but the former makes our lives easier + in the + short term + + gio/gresolver.h | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +commit cb7a300e3136c9d1ee397a4c740513b8a0f21968 +Author: Alexander Larsson +Date: Wed May 20 13:49:47 2009 +0200 + + Don't return something from void function (#583229) + + g_async_initable_init_async is void, don't return something from it. + + gio/gasyncinitable.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 1cbdd2495dcc06eb11c3ef9207aae07acb7c4ba7 +Author: Christian Persch +Date: Tue May 27 23:44:35 2008 +0200 + + Preserve errno when using g_set_error with _() and g_strerror() + + gio/glocalfileoutputstream.c | 2 +- + glib/gspawn.c | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +commit 80cfd099f3c9fa23b2a21c77e3698f1c4ac94b06 +Author: Christian Persch +Date: Tue May 19 15:03:14 2009 +0200 + + Use g_set_error_literal + + Bug #583206. + + gio/gsocket.c | 20 ++++++++++---------- + gio/gsocketclient.c | 8 ++++---- + gio/gunixconnection.c | 4 ++-- + 3 files changed, 16 insertions(+), 16 deletions(-) + +commit c20b8d4d53a4e90f0e822276f6fbd94d52ff3c85 +Author: Alexander Larsson +Date: Wed May 20 13:37:55 2009 +0200 + + Check that close_fn is not %NULL before calling (#578499) + + Some streams have no close function, so this caused a crash. + + gio/ginputstream.c | 13 ++++++++----- + gio/giostream.c | 11 +++++++---- + gio/goutputstream.c | 18 +++++++++++------- + 3 files changed, 26 insertions(+), 16 deletions(-) + +commit 0a280dadec8394dd198c8cea0bc288d92c9c6ffd +Author: Stefan Kost +Date: Tue May 19 14:33:25 2009 +0300 + + docs: fix typo + + glib/gsequence.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 9033b37589fcdf42d10025ea9e4d0dfc2c018bf4 +Author: Sjoerd Simons +Date: Wed May 20 12:41:50 2009 +0200 + + Add helper functions for connecting to service (#583061) + + docs/reference/gio/gio-sections.txt | 3 + + gio/gio.symbols | 3 + + gio/gsocketclient.c | 93 + +++++++++++++++++++++++++++++++++++ + gio/gsocketclient.h | 15 ++++++ + 4 files changed, 114 insertions(+), 0 deletions(-) + +commit 25800ed4a393f7edbea179aa86907079a58fd097 +Author: Dan Winship +Date: Sun May 17 20:44:54 2009 -0400 + + Ignore SIGPIPE when using GSocket + + http://bugzilla.gnome.org/show_bug.cgi?id=583001 + + gio/gsocket.c | 15 +++++++++++++++ + 1 files changed, 15 insertions(+), 0 deletions(-) + +commit 2ea22d8f46c21de6fc1eb012f258a3cfcda36752 +Author: Alexander Larsson +Date: Wed May 20 12:14:04 2009 +0200 + + Remove non-existing parameter from docs + + g_unix_socket_address_abstract_names_supported has no address argument + + gio/gunixsocketaddress.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 9d36c86f8a0c759625753c4a9a02e0cfbf123a4b +Author: Alexander Larsson +Date: Wed May 20 12:10:33 2009 +0200 + + Add missing symbols to gio.symbols + + gio/gio.symbols | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 9346f461f32375a34d2829d949dce8284c21654f +Author: Alexander Larsson +Date: Wed May 20 12:07:30 2009 +0200 + + Add missing types to gio.types + + docs/reference/gio/gio.types | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 5cd86fbda662defa03709a9277b25784d953541e +Author: Alexander Larsson +Date: Wed May 20 12:01:29 2009 +0200 + + Remove protocol names, instead use an enum with common protocols + + The whole protocol name thing is pretty weird. The getprotobyname + functions + seem to only specify one mapping for name <-> ids, so all + families/types + must use the same values. Plus the values used for the protocols are + standardized by IANA, so are always the same. + + So, we drop using names for protocols, intead introducing an enum with + a few commonly availible and used protocols. + + docs/reference/gio/#gio-unused.txt# | 100 +++++++++++++++++++++++ + docs/reference/gio/aa | 74 +++++++++++++++++ + docs/reference/gio/b | 77 ++++++++++++++++++ + docs/reference/gio/bb | 77 ++++++++++++++++++ + docs/reference/gio/gio-sections.txt | 5 +- + gio/gio.symbols | 4 +- + gio/gioenums.h | 24 ++++++ + gio/gsocket.c | 148 + ++++++---------------------------- + gio/gsocket.h | 7 +- + gio/gsocketclient.c | 40 ++++----- + gio/gsocketclient.h | 4 +- + gio/gsocketconnection.c | 2 +- + gio/gsocketlistener.c | 15 ++-- + gio/gsocketlistener.h | 2 +- + gio/gtcpconnection.c | 8 +- + gio/gunixconnection.c | 2 +- + 16 files changed, 417 insertions(+), 172 deletions(-) + +commit 6d01593b061afb52d22891a371fb29f42d4d62cc +Author: Alexander Larsson +Date: Wed May 20 11:30:43 2009 +0200 + + Clarify "current condition" in g_socket_create_source docs + + gio/gsocket.c | 6 ++++-- + 1 files changed, 4 insertions(+), 2 deletions(-) + +commit 80881826447a10b5ae3c08c9a88440eba75bcd05 +Author: Alexander Larsson +Date: Wed May 20 11:28:27 2009 +0200 + + Actually implement max_threads for GThreadedSocketService + + gio/gthreadedsocketservice.c | 73 + ++++++++++++++++++++++++++++++++++++++---- + 1 files changed, 66 insertions(+), 7 deletions(-) + +commit 053f9e72b12b9b5ab5571da9f4cd0b9b13f41e62 +Author: Alexander Larsson +Date: Wed May 20 11:19:47 2009 +0200 + + Add support for graceful disconnect to GTcpConnection + + docs/reference/gio/gio-sections.txt | 2 + + gio/gio.symbols | 2 + + gio/gtcpconnection.c | 331 + +++++++++++++++++++++++++++++++++++ + gio/gtcpconnection.h | 6 +- + gio/tests/send-data.c | 49 +++++- + 5 files changed, 386 insertions(+), 4 deletions(-) + +commit f061765e54b81a92f4ce901016964ea4c31d77e0 +Author: Alexander Larsson +Date: Wed May 20 11:18:34 2009 +0200 + + Call sync close function directly in async implementation + + The g_io_stream_wrapper fails since there is already an outstanding + operation (the async close). + + gio/gsocketconnection.c | 6 +++++- + 1 files changed, 5 insertions(+), 1 deletions(-) + +commit fdfdec36d0d0044513db25872132bd42d392f748 +Author: Alexander Larsson +Date: Tue May 19 13:44:11 2009 +0200 + + Add send-data, a g_socket_client test case + + gio/tests/Makefile.am | 6 ++- + gio/tests/send-data.c | 120 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 125 insertions(+), 1 deletions(-) + +commit 18373cfbe85dc8398ae1e66748721400a08b32a8 +Author: Alexander Larsson +Date: Tue May 19 12:06:29 2009 +0200 + + Set the listen backlog before calling listen. + + If we set it after it won't be used. + + gio/gsocketlistener.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 64383fa3d92b636e8fc977743de1c8f513d08dd2 +Author: Alexander Larsson +Date: Tue May 19 11:53:42 2009 +0200 + + Fix g_unix_socket_address_abstract_names_supported docs + + The previous description was a cut-n-paste from another function. + + gio/gunixsocketaddress.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 0ffe7221934623f60e07d3b733d170ce94d26dd5 +Author: Alexander Larsson +Date: Tue May 19 11:52:33 2009 +0200 + + Add g_socket_shutdown + + docs/reference/gio/gio-sections.txt | 1 + + gio/gio.symbols | 1 + + gio/gsocket.c | 73 + +++++++++++++++++++++++++++++++++++ + gio/gsocket.h | 4 ++ + 4 files changed, 79 insertions(+), 0 deletions(-) + +commit 03441e724a6b6d0b115fa5b2d9fbeefaa1fd2faa +Author: Alexander Larsson +Date: Tue May 19 11:27:07 2009 +0200 + + Document GOutputVector and GInputVector + + docs/reference/gio/gio-sections.txt | 2 ++ + gio/giotypes.h | 23 +++++++++++++++++------ + 2 files changed, 19 insertions(+), 6 deletions(-) + +commit e1a4389cbc549b0db39ec692f2fde5c20579362c +Author: Alexander Larsson +Date: Tue May 19 10:57:58 2009 +0200 + + Rename g_socket_check_pending_error to g_socket_check_connect_result + + This is only used for connect anyway, and this describes the operation + better. + + docs/reference/gio/gio-sections.txt | 2 +- + gio/gio.symbols | 2 +- + gio/gsocket.c | 12 ++++++------ + gio/gsocket.h | 2 +- + gio/gsocketclient.c | 2 +- + 5 files changed, 10 insertions(+), 10 deletions(-) + +commit bcba61c951c0a81326e2065ae81352ae2cbca6bb +Author: Alexander Larsson +Date: Tue May 19 10:47:55 2009 +0200 + + Update docs on listen backlog + + Mention g_socket_set_listen_backlog in g_socket_listen. + Explain that listen backlock needs to be set before calling + listen. Also verify this with a g_return_if_fail. + + gio/gsocket.c | 10 ++++++++++ + 1 files changed, 10 insertions(+), 0 deletions(-) + +commit 69130db81a0b174bb072f458e8c1b1cd6bc1a0c9 +Author: Alexander Larsson +Date: Tue May 19 10:40:27 2009 +0200 + + Read socket state in g_socket_get_local/remote_address + + Previously we saved the location in various places which is + unnecessary + and sometimes even wrong. For instance, we saved the address we + bound to + which may not have the final port set. + + gio/gsocket.c | 88 + ++++++++++++++------------------------------ + gio/gsocketconnection.c | 2 + + gio/tests/socket-server.c | 1 + + 3 files changed, 31 insertions(+), 60 deletions(-) + +commit f8cd1c530488c0b56634fab049ac775d094e9e58 +Author: Alexander Larsson +Date: Tue May 19 10:16:32 2009 +0200 + + Clean up refereces to @protocol_id in g_socket_new docs + + This was not fully updated from the protocol to protocol_id change. + + gio/gsocket.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 3756ddb0eea8cef31e9aaad53eb6aa7d24a80fde +Author: Alexander Larsson +Date: Mon May 18 23:24:13 2009 +0200 + + Ignore error when setting SO_REUSEADDR + + The main error would be "not supported" which could happen for e.g. + unix domain sockets, we don't really care, as this is mainly something + for TCP to help out a bit. + + gio/gsocket.c | 13 ++++--------- + 1 files changed, 4 insertions(+), 9 deletions(-) + +commit f24c7fa9cbf2e0caa08a48ef64141d7ea50105aa +Author: Alexander Larsson +Date: Mon May 18 21:30:33 2009 +0200 + + Add support for abstract unix socket addresses + + docs/reference/gio/gio-sections.txt | 5 + + gio/gsocketaddress.c | 3 + + gio/gunixsocketaddress.c | 300 + ++++++++++++++++++++++++++++------- + gio/gunixsocketaddress.h | 9 +- + 4 files changed, 262 insertions(+), 55 deletions(-) + +commit d8bdc3e5678498996efe618bec32b8ae43ca8b39 +Author: Alexander Larsson +Date: Mon May 18 14:10:07 2009 +0200 + + Add GError to g_socket_address_to_native + + This is nice for some callers so they can report an error. + It is also required to support opional address types like + abstract paths for unix domain sockets. + + gio/ginetsocketaddress.c | 23 +++++++++++++++++++---- + gio/gresolver.c | 2 +- + gio/gsocket.c | 11 +++++++---- + gio/gsocketaddress.c | 13 +++++++++---- + gio/gsocketaddress.h | 6 ++++-- + gio/gunixsocketaddress.c | 9 +++++++-- + 6 files changed, 47 insertions(+), 17 deletions(-) + +commit eefd7cd8db5c7749212e7c9861a84eb3e34be1ee +Author: Jorge Gonzalez +Date: Mon May 18 20:19:05 2009 +0200 + + Updated Spanish translation + + po/es.po | 815 + ++++++++++++++++++++++++++++++++------------------------------ + 1 files changed, 415 insertions(+), 400 deletions(-) + +commit 6ea86cc57f1b8b8c7acc4e08ece8baef5f28a53a +Author: Alexander Larsson +Date: Mon May 18 13:02:11 2009 +0200 + + Update the docs for the new network APIs + + This imports the network APIs into the gio reference docs, and cleans + up a bunch of gtk-doc warnings and documentation issues. + + docs/reference/gio/gio-docs.xml | 43 +++- + docs/reference/gio/gio-sections.txt | 350 + ++++++++++++++++++++++++++++- + docs/reference/gio/gio.types | 20 ++- + docs/reference/gio/overview.xml | 28 +++ + docs/reference/glib/tmpl/glib-unused.sgml | 67 ++++++ + docs/reference/glib/tmpl/macros_misc.sgml | 5 +- + docs/reference/glib/tmpl/version.sgml | 68 ------ + gio/gasyncinitable.c | 7 +- + gio/gfile.c | 2 +- + gio/gfile.h | 9 + + gio/gfileenumerator.c | 2 +- + gio/gfileiostream.c | 10 +- + gio/ginetsocketaddress.c | 2 +- + gio/ginitable.c | 9 +- + gio/gioenums.h | 5 +- + gio/giostream.c | 9 +- + gio/giotypes.h | 2 + + gio/gmount.c | 2 +- + gio/gmount.h | 1 + + gio/gsocket.c | 4 +- + gio/gsocket.h | 5 - + gio/gsocketclient.c | 25 +- + gio/gsocketclient.h | 8 +- + gio/gsocketconnection.c | 17 ++- + gio/gsocketconnection.h | 2 +- + gio/gsocketlistener.c | 10 +- + gio/gsocketservice.c | 3 +- + gio/gthemedicon.c | 6 +- + gio/gunixconnection.c | 2 +- + gio/gunixsocketaddress.c | 2 +- + 30 files changed, 575 insertions(+), 150 deletions(-) + +commit e1afc6e79b9526d68eff0f218ac98a6f0e323513 +Author: Alexander Larsson +Date: Mon May 18 11:30:48 2009 +0200 + + Remove gtk-doc warnings + + Some code was using gtk-doc comment blocks for non-gtk-doc contents, + just + turn it into ordinary comments. + + gio/fen/fen-kernel.c | 2 +- + gio/inotify/inotify-helper.c | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 822abda451c9999ac4e1cf3b8d5649ebebbb5ee4 +Author: Alexander Larsson +Date: Mon May 18 11:29:11 2009 +0200 + + Add more internal headers for gtk-doc to ignore + + This gives less bogus output in gio-unused.txt + + docs/reference/gio/Makefile.am | 38 + +++++++++++++++++++++++--------------- + 1 files changed, 23 insertions(+), 15 deletions(-) + +commit c3f4e0162714f4712edcf51fa1502c8187faf5c0 +Author: Alexander Larsson +Date: Mon May 18 11:27:49 2009 +0200 + + Make all non-static functions start with underscore + + We don't want to export a lot of non-namespaced internal symbols. + + gio/fen/fen-data.c | 158 + ++++++++++++++++++++-------------------- + gio/fen/fen-data.h | 28 ++++---- + gio/fen/fen-dump.c | 2 +- + gio/fen/fen-helper.c | 76 ++++++++++---------- + gio/fen/fen-helper.h | 6 +- + gio/fen/fen-kernel.c | 22 +++--- + gio/fen/fen-kernel.h | 14 ++-- + gio/fen/fen-missing.c | 10 +- + gio/fen/fen-missing.h | 4 +- + gio/fen/fen-node.c | 38 +++++----- + gio/fen/fen-node.h | 22 +++--- + gio/fen/fen-sub.c | 4 +- + gio/fen/fen-sub.h | 4 +- + gio/fen/gfendirectorymonitor.c | 16 ++-- + gio/fen/gfenfilemonitor.c | 16 ++-- + gio/fen/libfen_la-fen-dump.loT | 7 ++ + 16 files changed, 217 insertions(+), 210 deletions(-) + +commit 66d49b8bdeed9bac71acda847d8cbe0203dd5ba4 +Author: Alexander Larsson +Date: Mon May 18 09:28:26 2009 +0200 + + Remove g_socket_set/get_reuse_address from header + + These functions have been removed. + + gio/gsocket.h | 3 --- + 1 files changed, 0 insertions(+), 3 deletions(-) + +commit 13cb01176291a8baa171da8dcb9f679b274af450 +Author: Alexander Larsson +Date: Mon May 18 08:47:10 2009 +0200 + + Add max_threads argument to g_threaded_socket_service_new + + gio/gthreadedsocketservice.c | 4 +++- + gio/gthreadedsocketservice.h | 2 +- + gio/tests/echo-server.c | 2 +- + gio/tests/httpd.c | 2 +- + 4 files changed, 6 insertions(+), 4 deletions(-) + +commit 5b683af237f1c5dac62c83e11459d46799ba6ecf +Author: Paul Pogonyshev +Date: Sun May 17 15:17:57 2009 +0300 + + Fix error message in set_mtime_atime() + + Bug #578786. + + gio/glocalfileinfo.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 34e74378c9fc99a3dc75eb9680bb00cb784029bb +Author: Alexander Larsson +Date: Fri May 15 21:34:14 2009 +0200 + + Add test apps for highlevel socket classes + + echo-server - simple echo server + httpd - simple http server + + gio/tests/Makefile.am | 10 +++- + gio/tests/echo-server.c | 73 +++++++++++++++++++ + gio/tests/httpd.c | 183 + +++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 265 insertions(+), 1 deletions(-) + +commit 67df7d43e926702290280578cd6b89fee7302d72 +Author: Alexander Larsson +Date: Fri May 15 21:27:54 2009 +0200 + + Add references to highlevel classes in GSocket docs + + gio/gsocket.c | 8 +++----- + 1 files changed, 3 insertions(+), 5 deletions(-) + +commit ce8361217c1c9bd458eab55554a77d24210235cc +Author: Alexander Larsson +Date: Fri May 15 21:26:24 2009 +0200 + + Import all the highlevel socket classes from gnio + + gio/Makefile.am | 22 +- + gio/gio-marshal.list | 1 + + gio/gio.h | 8 +- + gio/gio.symbols | 82 ++++ + gio/giotypes.h | 50 +++ + gio/gsocketclient.c | 912 + ++++++++++++++++++++++++++++++++++++++++++ + gio/gsocketclient.h | 115 ++++++ + gio/gsocketconnection.c | 474 ++++++++++++++++++++++ + gio/gsocketconnection.h | 91 +++++ + gio/gsocketinputstream.c | 259 ++++++++++++ + gio/gsocketinputstream.h | 58 +++ + gio/gsocketlistener.c | 815 +++++++++++++++++++++++++++++++++++++ + gio/gsocketlistener.h | 134 ++++++ + gio/gsocketoutputstream.c | 259 ++++++++++++ + gio/gsocketoutputstream.h | 58 +++ + gio/gsocketservice.c | 330 +++++++++++++++ + gio/gsocketservice.h | 88 ++++ + gio/gtcpconnection.c | 67 +++ + gio/gtcpconnection.h | 64 +++ + gio/gthreadedsocketservice.c | 215 ++++++++++ + gio/gthreadedsocketservice.h | 81 ++++ + gio/gunixconnection.c | 293 ++++++++++++++ + gio/gunixconnection.h | 77 ++++ + 23 files changed, 4550 insertions(+), 3 deletions(-) + +commit 2597e3adc37ce342972e995444f4417e0aa6fb5d +Author: Alexander Larsson +Date: Fri May 15 20:58:27 2009 +0200 + + Remove unused variable + + gio/glocalfileoutputstream.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 4ade78fc3d242b58d57d92944c16ba7ef4614b2c +Author: Alexander Larsson +Date: Fri May 15 20:43:02 2009 +0200 + + Include stdlib.h to avoid warning + + Fixes a "implicit declaration of function ‘strtol’" warning + + gio/gnetworkaddress.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit d3a2c457cb55730181c04c8d6d1f611ee555c250 +Author: Alexander Larsson +Date: Fri May 15 20:42:04 2009 +0200 + + Forgot to return the allocated data in async_op_wrapper_new + + gio/gfileiostream.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit a48fc532519b849498c8b75dde578caf0c270b23 +Author: Alexander Larsson +Date: Fri May 15 10:42:28 2009 +0200 + + Make cancellable pipe fds close-on-exec + + GCancellable is purely an in-process thing, so ensure that no + cancellable + fds accidentally leak to child processes. + + gio/gcancellable.c | 16 ++++++++++++++++ + 1 files changed, 16 insertions(+), 0 deletions(-) + +commit 23424e7bcb93abe805394d11e8b32beb7571e87c +Author: Alexander Larsson +Date: Fri May 15 10:28:30 2009 +0200 + + Add padding to new classes + + gio/gsocketcontrolmessage.h | 9 +++++++++ + gio/gunixfdmessage.h | 6 ++++++ + 2 files changed, 15 insertions(+), 0 deletions(-) + +commit 8f67f47e05a9244d86d9661caa73e5a2fc573e55 +Author: Alexander Larsson +Date: Fri May 15 10:08:18 2009 +0200 + + Add test apps for GSocket API + + gio/tests/Makefile.am | 10 ++- + gio/tests/socket-client.c | 294 + +++++++++++++++++++++++++++++++++++++++++++ + gio/tests/socket-server.c | 304 + +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 607 insertions(+), 1 deletions(-) + +commit a258ec3b5bf0a0b2ab1cb1dce8ce715c3895bdaa +Author: Alexander Larsson +Date: Fri May 15 10:05:55 2009 +0200 + + Fix deadlock in threaded resolver + + When you're using the threaded resolver and using a sync call + without a cancellable the resolve_sync forgot to unlock the + initial req->mutex lock, leading to a deadlock when unrefing + the request. + + gio/gthreadedresolver.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit f662e7e86bc27102948683c0925815efefb43bbc +Author: Alexander Larsson +Date: Fri May 15 09:10:23 2009 +0200 + + Store protocol by id, add lookup function for name + + We want to use the protocol id for lookup in the GSocketConnection + code, so we expose it. We also make GSocket store the protocol + as an int for less memory use and to allow platform specific protocols + to be specified. + + Also added g_socket_protocol_id_lookup_by_name() to allow the higher + level code to specify the name by string, and + g_socket_get_protocol_name() + to get it. + + gio/gio.symbols | 4 +- + gio/gsocket.c | 178 + +++++++++++++++++++++++++++++++++++++++++-------------- + gio/gsocket.h | 6 +- + 3 files changed, 141 insertions(+), 47 deletions(-) + +commit bd87df9e73272c72a1f45cc606d010e8c4961363 +Author: Alexander Larsson +Date: Thu May 14 16:58:47 2009 +0200 + + Make GSocketSourceFunc return the GSocket + + This is very useful when you have multiple sockets with sources. + + gio/gasynchelper.c | 38 +++++++++++++++++++++++++++++--------- + gio/gasynchelper.h | 14 +++++++++++--- + gio/giotypes.h | 8 +++++--- + gio/gsocket.c | 8 +++++--- + 4 files changed, 50 insertions(+), 18 deletions(-) + +commit 7ffdc91f513d6b91d060df6e3ad3401ef23e968d +Author: Alexander Larsson +Date: Thu May 14 16:19:07 2009 +0200 + + Set optlen before calling getsockopt + + We were sometimes failing in g_socket_check_pending_error because + we were not setting optlen on input and it was sometimes randomly + less than sizeof(int). + + gio/gsocket.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 145cec3c93d5ba0c22d35aaf341b3713cadc0e14 +Author: Alexander Larsson +Date: Thu May 14 15:26:37 2009 +0200 + + Import GInitable, GSocket and dependencies from gnio + + This adds: + GInitable - failable object constructor interface + GAsyncInitable - async failable object constructor interface + GSocket - Platform independent lowlevel berkely socket style object + GSocketControlMessage - For passing control messages over GSocket + GUnixFDMessage - unix fd passing socket control message + + Some changes were done during the import from gnio to make things + work in glib. For instance, types were moved to other headers, header + file boiler plate were updated to glib style and gio.symbols stuff + was added. + + configure.in | 16 + + gio/Makefile.am | 10 + + gio/gasyncinitable.c | 383 ++++++ + gio/gasyncinitable.h | 119 ++ + gio/ginitable.c | 251 ++++ + gio/ginitable.h | 95 ++ + gio/gio.h | 4 + + gio/gio.symbols | 81 ++ + gio/gioenums.h | 46 +- + gio/gioerror.c | 6 + + gio/giotypes.h | 59 + + gio/gsocket.c | 2970 + +++++++++++++++++++++++++++++++++++++++++++ + gio/gsocket.h | 172 +++ + gio/gsocketcontrolmessage.c | 200 +++ + gio/gsocketcontrolmessage.h | 96 ++ + gio/gunixfdmessage.c | 259 ++++ + gio/gunixfdmessage.h | 67 + + 17 files changed, 4833 insertions(+), 1 deletions(-) + +commit 33c00e5c33dfe612e5d8757dd07e4c3acae30acc +Author: Alexander Larsson +Date: Thu May 14 10:53:53 2009 +0200 + + Add g_network_address_parse + + This is useful if you want to allow users to specify + the hostname and optionally a port. + + configure.in | 3 + + gio/gio.symbols | 1 + + gio/gnetworkaddress.c | 164 + +++++++++++++++++++++++++++++++++++++++++++++++++ + gio/gnetworkaddress.h | 12 +++- + 4 files changed, 176 insertions(+), 4 deletions(-) + +commit 80a484ad2c2495134a87a35f8ac936e8e75c311a +Author: Alexander Larsson +Date: Thu May 14 15:32:55 2009 +0200 + + Add the new GFile ops to gio.symbols + + This adds all the symbols related to GFile GIOStream support that was + recently added. + + gio/gio.symbols | 9 +++++++++ + 1 files changed, 9 insertions(+), 0 deletions(-) + +commit ed0821856533e63bee4f7da54f1a9e6e0b1f12e9 +Author: Alexander Larsson +Date: Wed May 13 13:06:58 2009 +0200 + + Add tests for local GIOStream GFile ops + + gio/tests/Makefile.am | 4 + + gio/tests/readwrite.c | 293 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 297 insertions(+), 0 deletions(-) + +commit 14d58d51a325797aee3b53fb4e0ba76ca0adc3f5 +Author: Alexander Larsson +Date: Wed May 13 13:03:47 2009 +0200 + + Local file implementation of GFileIOStream and ops + + This implements all the GIOStream file ops for local files. + We use the "fallback to output stream" for all GFileIOStream ops. + Some helpers stuff was added to the local input and output streams + so they could be reused. + + gio/Makefile.am | 2 + + gio/glocalfile.c | 67 ++++++++++++++++++++++ + gio/glocalfileinputstream.c | 12 ++++ + gio/glocalfileinputstream.h | 5 +- + gio/glocalfileiostream.c | 114 +++++++++++++++++++++++++++++++++++++ + gio/glocalfileiostream.h | 60 ++++++++++++++++++++ + gio/glocalfileoutputstream.c | 127 + +++++++++++++++++++++++++++++++++++++----- + gio/glocalfileoutputstream.h | 14 +++++ + 8 files changed, 385 insertions(+), 16 deletions(-) + +commit 7a2d4889b50c5edd3f483c6e037faec1e093ab13 +Author: Alexander Larsson +Date: Wed May 13 13:00:26 2009 +0200 + + Add GIOStream operations to GFile + + g_file_open_readwrite, g_file_create_readwrite, + g_file_replace_readwrite + and async variants, with default implementations using threads. + + gio/gfile.c | 666 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + gio/gfile.h | 83 ++++++++ + 2 files changed, 749 insertions(+), 0 deletions(-) + +commit bd0b8c60c231c72588d69dfb2018d2e418517f7f +Author: Alexander Larsson +Date: Tue May 12 16:59:36 2009 +0200 + + Add GFileIOStream class + + This is similar to GFileInputStream and GFileOutputStream for + GIOStreams. + The default implementations chain to the Output stream. + + gio/Makefile.am | 2 + + gio/gfileiostream.c | 671 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + gio/gfileiostream.h | 118 +++++++++ + gio/gio.h | 1 + + gio/gio.symbols | 10 + + gio/giostream.c | 3 - + gio/giotypes.h | 1 + + 7 files changed, 803 insertions(+), 3 deletions(-) + +commit 6d0bebb7df1129bb78cdd526e1b44c91b61321dd +Author: Alexander Larsson +Date: Tue May 12 19:31:19 2009 +0200 + + Add comment about lifecycle issues for GIOStreams + + gio/giostream.c | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit 05f544c59191ea7eab076fbb77a2e3648d52e167 +Author: Alexander Larsson +Date: Tue May 12 16:30:15 2009 +0200 + + Import GIOStream from gnio + + Based on gnio rev 84516a5f544d8d5f3da368a83844e84eca8ef771 + + gio/Makefile.am | 2 + + gio/gio.h | 1 + + gio/gio.symbols | 15 ++ + gio/giostream.c | 607 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + gio/giostream.h | 112 ++++++++++ + gio/giotypes.h | 1 + + 6 files changed, 738 insertions(+), 0 deletions(-) + +commit 1ecfae6a71b10cda9b3fa1e8f38bb22db01fb0af +Author: Alexander Larsson +Date: Tue May 12 19:53:24 2009 +0200 + + Remove close in finalize, we do it in dispose + + This is not needed, and in fact it may be a bad idea to call + it from finalize anyway since the object isn't fully alive then. + + gio/ginputstream.c | 3 --- + 1 files changed, 0 insertions(+), 3 deletions(-) + +commit 2bbb85633f30da2a7b79b518ca7821cde475cb3a +Author: Alexander Larsson +Date: Tue May 12 13:57:52 2009 +0200 + + Remove not actually used member "cancelled" + + gio/goutputstream.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +commit 0030935d041f26e461aca6583927ea0cceb166bb +Author: Tor Lillqvist +Date: Tue May 12 14:54:12 2009 +0300 + + Make glibconfig.h.win32.in match the generated one. + + Add G_GOFFSET_MODIFIER, G_GOFFSET_FORMAT and G_GOFFSET_CONSTANT. + + glibconfig.h.win32.in | 5 +++++ + 1 files changed, 5 insertions(+), 0 deletions(-) + +commit b3e4b761f465a8cb0948bd6381ad832a0a47436a +Author: Alexander Larsson +Date: Wed May 6 13:26:17 2009 +0200 + + Fix gcancellable.c build on non-win32 + + I forgot to add #ifdef G_OS_WIN32 in one place, sorry. + + gio/gcancellable.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit e10edefff1308cad307d954b17163538a3c7f20a +Author: Alexander Larsson +Date: Wed May 6 13:10:58 2009 +0200 + + Simplify GCancellable support on win32 + + There is no need to have a GIOChannel in the GPollFD in + g_cancellable_create_pollfd. All we need is an Event object that + we signal when cancelling and reset when resetting. + + Also, supporting g_cancellable_get_fd on Windows using _pipe is + useless + as it doesn't work with any corresponding poll() function, so + just don't + support that on win32. + + I tested this with the cancellation support in GSocket from gnio. + + gio/gcancellable.c | 56 + ++++++++++++++++++++++++--------------------------- + 1 files changed, 26 insertions(+), 30 deletions(-) + +commit 2fff3026efbaf7e480d1a166c7166c44c6643567 +Author: Paul Pogonyshev +Date: Mon May 4 22:32:35 2009 +0300 + + Don't try to ref NULL pointer in g_desktop_app_info_dup() + + Fixes bug #573246. + + gio/gdesktopappinfo.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit d89cc0d7cbad8b6904931440e579e291ce81780d +Author: Carlos Garnacho +Date: Tue May 5 14:45:18 2009 -0400 + + Add a GMount::pre-unmount signal + + This is the per-mount analogon to GVolumeMonitor::mount-pre-unmount. + + gio/gmount.c | 16 ++++++++++++++++ + gio/gmount.h | 3 +++ + gio/gunixmount.c | 2 ++ + 3 files changed, 21 insertions(+), 0 deletions(-) + +commit 4ecec3b1c2d335b1e26b209fc7e2b77013ece795 +Author: Manoj Kumar Giri +Date: Tue May 5 12:34:44 2009 +0530 + + Updated Oriya Translation. + + po/or.po | 111 + +++++++++---------------------------------------------------- + 1 files changed, 17 insertions(+), 94 deletions(-) + +commit 757f9281d7aac1254a156136440b4df4fa52e3a1 +Author: Matthias Clasen +Date: Sun May 3 18:08:01 2009 -0400 + + Bump version to 2.21.1 + + configure.in | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit a28215fa909ef315e596ebd0b41132730aef909d +Author: Matthias Clasen +Date: Sun May 3 18:04:31 2009 -0400 + + Release 2.21.0 + + docs/reference/gio/gio-docs.xml | 3 + + docs/reference/glib/glib-docs.sgml | 3 + + docs/reference/gobject/gobject-docs.sgml | 3 + + gio/gcancellable.c | 58 +- + gio/gresolver.c | 37 +- + gio/gsrvtarget.c | 16 +- + gio/gthreadedresolver.c | 10 +- + gio/gunixresolver.c | 2 +- + po/am.po | 226 +++----- + po/ar.po | 286 +++++----- + po/as.po | 300 +++++----- + po/az.po | 276 ++++------ + po/be.po | 302 +++++------ + po/be@latin.po | 306 +++++------ + po/bg.po | 307 +++++----- + po/bn.po | 271 ++++----- + po/bn_IN.po | 291 +++++----- + po/bs.po | 276 ++++------ + po/ca.po | 915 + +++++++++++++++--------------- + po/cs.po | 801 + +++++++++++++------------- + po/cy.po | 274 ++++----- + po/da.po | 304 +++++----- + po/de.po | 312 +++++------ + po/dz.po | 272 ++++----- + po/el.po | 306 +++++----- + po/en_CA.po | 289 +++++----- + po/en_GB.po | 300 +++++----- + po/eo.po | 270 ++++----- + po/es.po | 806 + +++++++++++++------------- + po/et.po | 402 +++++++++++++- + po/eu.po | 310 +++++------ + po/fa.po | 276 ++++------ + po/fi.po | 304 +++++----- + po/fr.po | 312 +++++------ + po/ga.po | 244 +++----- + po/gl.po | 306 +++++----- + po/gu.po | 296 +++++----- + po/he.po | 300 +++++----- + po/hi.po | 296 +++++----- + po/hr.po | 272 ++++----- + po/hu.po | 305 +++++----- + po/hy.po | 228 +++----- + po/id.po | 280 ++++------ + po/is.po | 273 ++++----- + po/it.po | 309 +++++------ + po/ja.po | 305 +++++----- + po/ka.po | 272 ++++----- + po/kn.po | 302 +++++----- + po/ko.po | 308 +++++------ + po/ku.po | 210 +++----- + po/lt.po | 304 +++++----- + po/lv.po | 276 ++++------ + po/mai.po | 286 +++++----- + po/mg.po | 276 ++++------ + po/mk.po | 281 ++++----- + po/ml.po | 300 +++++----- + po/mn.po | 276 ++++------ + po/mr.po | 298 +++++----- + po/ms.po | 276 ++++------ + po/nb.po | 302 +++++----- + po/ne.po | 274 ++++----- + po/nl.po | 319 +++++------ + po/nn.po | 278 ++++----- + po/oc.po | 209 +++----- + po/or.po | 296 +++++----- + po/pa.po | 296 +++++----- + po/pl.po | 304 +++++----- + po/ps.po | 919 + ++++++++++++++---------------- + po/pt.po | 305 +++++----- + po/pt_BR.po | 304 +++++----- + po/ro.po | 307 +++++----- + po/ru.po | 312 +++++------ + po/rw.po | 276 ++++----- + po/si.po | 253 ++++----- + po/sk.po | 279 ++++----- + po/sl.po | 300 +++++----- + po/sq.po | 328 +++++------ + po/sr.po | 271 ++++----- + po/sr@ije.po | 282 ++++------ + po/sr@latin.po | 271 ++++----- + po/sv.po | 304 +++++----- + po/ta.po | 298 +++++----- + po/te.po | 296 +++++----- + po/th.po | 296 +++++----- + po/tl.po | 284 ++++------ + po/tr.po | 304 +++++----- + po/tt.po | 238 +++----- + po/uk.po | 300 +++++------ + po/vi.po | 302 +++++----- + po/wa.po | 255 ++++----- + po/xh.po | 278 ++++------ + po/yi.po | 273 ++++----- + po/zh_CN.po | 296 +++++----- + po/zh_HK.po | 296 +++++----- + po/zh_TW.po | 296 +++++----- + 95 files changed, 12758 insertions(+), 14748 deletions(-) + +commit 4e694faa332a6ef4c576176b568a7f74e142103a +Author: Paul Pogonyshev +Date: Mon May 4 00:55:35 2009 +0300 + + Fix g_input_stream_skip_async() documentation + + Remove mention of inexisting argument. Spotted in relation to bug + 581229. + + gio/ginputstream.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit f33a484b4a1a14902dc1789c2e023fbcd4136098 +Author: Matthias Clasen +Date: Sun May 3 17:10:16 2009 -0400 + + Fix up tests forgotten in Michaels commit + + When Michael cleaned up after my fumbled commit of his gmarkup + optimizations, he fumbled himself and forgot to fix up the tests... + + tests/markups/fail-36.gmarkup | Bin 13 -> 42 bytes + 1 files changed, 0 insertions(+), 0 deletions(-) + +commit 008ae16d75b2f6e908258d883d8b1c98a98bd648 +Author: Matthias Clasen +Date: Sun May 3 16:58:22 2009 -0400 + + Add new functions + + docs/reference/gobject/gobject-sections.txt | 6 ++++++ + 1 files changed, 6 insertions(+), 0 deletions(-) + +commit d1e6e194cc30744e47067378eb338f7d5a0f1e2b +Author: Petr Kovar +Date: Sun May 3 18:34:35 2009 +0200 + + Updated Czech translation + + po/cs.po | 1013 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 503 insertions(+), 510 deletions(-) + +commit b3fc55cc4e5b578acc0a06e164c29fe43d060b10 +Author: Ivar Smolin +Date: Sun May 3 12:03:46 2009 +0300 + + Updating Estonian translation + + po/et.po | 550 + +++++--------------------------------------------------------- + 1 files changed, 37 insertions(+), 513 deletions(-) + +commit 3f06ddd8cdfa7f4ebf09ef24db7dad5270be36df +Author: Matthias Clasen +Date: Sat May 2 23:17:29 2009 -0400 + + Match up parameter names to help gtk-doc + + gio/gcancellable.h | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 2e4855ec4b611b9a17c466f4d26a694480f80ad6 +Author: Matthias Clasen +Date: Sat May 2 23:02:41 2009 -0400 + + Add bug references + + NEWS | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit 2e4b51aeb3bd5fa1fda52946e2d43fc8e7a28b4e +Author: Matthias Clasen +Date: Sat May 2 22:59:02 2009 -0400 + + Plug a memory leak in g_simple_async_result_set_op_res_gpointer + + Fixes bug 579272. + + gio/gsimpleasyncresult.c | 15 +++++++++++++-- + 1 files changed, 13 insertions(+), 2 deletions(-) + +commit 79ef3d32643519ae9c9710acf0c56b54ff540dc3 +Author: Matthias Clasen +Date: Sat May 2 22:44:52 2009 -0400 + + Correct g_utf8_to_utf16 docs + + As pointed out in bug 580932, len is counting bytes here. + + glib/gutf8.c | 12 ++++++------ + 1 files changed, 6 insertions(+), 6 deletions(-) + +commit 2dfce324220bf7e1ea5ca465a74e58cf8146b808 +Author: Matthias Clasen +Date: Sat May 2 22:41:19 2009 -0400 + + Accept NULL as empty string list + + Fixes bug 580656. + + glib/gkeyfile.c | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit a4ac1b0552785dfb2d323eb41c6d3875b214989b +Author: Matthias Clasen +Date: Sat May 2 22:36:15 2009 -0400 + + Fix reference to g_strtoull + + As pointed out in bug 580546, that function does not exit. + + docs/reference/glib/tmpl/macros_misc.sgml | 5 +++-- + 1 files changed, 3 insertions(+), 2 deletions(-) + +commit fab0506f5f983dcad8f4c44dbef6fbc1f8fd1b3b +Author: Matthias Clasen +Date: Sat May 2 22:30:19 2009 -0400 + + Update NEWS + + NEWS | 38 ++++++++++++++++++++++++++++++++++++++ + 1 files changed, 38 insertions(+), 0 deletions(-) + +commit ff104337d9e95f6e933f3d77a5a24e462c4713cf +Author: Matthias Clasen +Date: Sat May 2 21:58:30 2009 -0400 + + Bump version to 2.21.0 + + configure.in | 6 +++--- + 1 files changed, 3 insertions(+), 3 deletions(-) + +commit dc02797c1e386d72ff24268cc23c19352e8cef6f +Author: Jorge Gonzalez +Date: Fri May 1 20:20:01 2009 +0200 + + Updated Spanish translation + + po/es.po | 1021 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 509 insertions(+), 512 deletions(-) + +commit 92ac8d165eae438164cffce01fe92cdcf6488970 +Author: Dan Winship +Date: Fri May 1 10:08:52 2009 -0400 + + Misc warning fixes + + glib/pcre/pcre_ucp_search_funcs.c, glib/pcre/pcre_valid_utf8.c: add + back missing config.h includes, and this time add them to the copies + in glib/update-pcre/ too so they don't get lost again on the next PCRE + update. + + glib/garray.c, glib/gbase64.c: fix signed/unsigned pointer casts + + gio/xdgmime/xdgmimeglob.c: remove unused variable + + gio/tests/live-g-file.c: fix printf args on x86_64 + + tests/Makefile.am, tests/regex-test.c: remove redundant -DENABLE_REGEX + + gio/tests/live-g-file.c | 4 ++-- + gio/xdgmime/xdgmimeglob.c | 1 - + glib/garray.c | 2 +- + glib/gbase64.c | 2 +- + glib/pcre/pcre_ucp_searchfuncs.c | 4 ++++ + glib/pcre/pcre_valid_utf8.c | 1 + + glib/update-pcre/pcre_ucp_searchfuncs.c | 4 ++++ + glib/update-pcre/pcre_valid_utf8.c | 1 + + tests/Makefile.am | 9 +-------- + tests/regex-test.c | 2 ++ + 10 files changed, 17 insertions(+), 13 deletions(-) + +commit 36cb01f447b2401195e3c6b577f490e868363630 +Author: Dan Winship +Date: Fri May 1 10:08:23 2009 -0400 + + Add README and INSTALL to .gitignore since they are autogenerated + + .gitignore | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +commit 83699774fa669abfbc5c5c3dc9265308246bd4f6 +Author: Michael Meeks +Date: Fri May 1 15:23:23 2009 +0100 + + Patch originally committed only to the ChangeLog & tests ... + + Bug 572508 – gmarkup speedup ... + + * glib/gmarkup.c: Various optimizations: do less allocations + by + keeping a pool of GStrings, do in-place unescaping, avoid + redundant + utf-8 validation. + + glib/gmarkup.c | 1129 + +++++++++++++++++++++++--------------------------------- + 1 files changed, 455 insertions(+), 674 deletions(-) + +commit d8029ca9bc24bcff7f33c973ef13fae7e6fab904 +Author: Alexander Larsson +Date: Thu Apr 30 10:46:37 2009 +0200 + + Ensure g_inet_address_get_type() call is not optimized away + + Yet another place where the get_type call can be optimized away due + to the G_GNUC_CONST attribute. Use a volatile variable to ensure + its not. + + gio/gresolver.c | 4 +++- + 1 files changed, 3 insertions(+), 1 deletions(-) + +commit 97fe421518139dcb3477209d3d3c3b6744f54153 +Author: David King +Date: Wed Apr 29 15:58:35 2009 +0200 + + Fix ginetaddress.c compile on Linux + + The GType type definition belongs outside the G_OS_WIN32 typedef. + + gio/ginetaddress.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 402847c8878a6bf839facdf7a91f096769ebc609 +Author: David Zeuthen +Date: Wed Apr 29 11:15:20 2009 -0400 + + Bug 580450 – Reference counting and boxed types for arrays + + Add reference counting and boxed types for GArray, GByteArray and + GPtrArray. + + Signed-off-by: Matthias Clasen + + docs/reference/glib/glib-sections.txt | 9 + + docs/reference/glib/tmpl/arrays.sgml | 41 ++++- + docs/reference/glib/tmpl/arrays_byte.sgml | 23 ++- + docs/reference/glib/tmpl/arrays_pointer.sgml | 64 ++++++- + glib/garray.c | 253 + ++++++++++++++++++++++++-- + glib/garray.h | 10 + + glib/glib.symbols | 9 + + glib/tests/array-test.c | 172 +++++++++++++++++ + gobject/gboxed.c | 33 ++++ + gobject/gboxed.h | 27 +++ + gobject/gobject.symbols | 3 + + 11 files changed, 616 insertions(+), 28 deletions(-) + +commit d80e12104f139def9bea28a510bf1d7c103e20f9 +Author: Alexander Larsson +Date: Wed Apr 29 12:19:57 2009 +0200 + + Ensure we're actually initializing the winsock library + + It turns out that just calling g_inet_address_get_type() isn't + enough, since its marked G_GNUC_CONST, so the call is optimized + away. If we assign the return value to a volatile location we ensure + it is called. + + gio/ginetaddress.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 49dfb50afc9400779c0be02ea3c285780b42c928 +Author: David Zeuthen +Date: Sat Apr 25 22:41:07 2009 -0400 + + Bug 580453 – Hash and equal functions for gint64 and gdouble + + docs/reference/glib/glib-sections.txt | 4 ++ + docs/reference/glib/tmpl/hash_tables.sgml | 38 ++++++++++++++ + glib/ghash.c | 13 +++-- + glib/ghash.h | 8 +++ + glib/glib.symbols | 4 ++ + glib/gutils.c | 78 + +++++++++++++++++++++++++++++ + 6 files changed, 139 insertions(+), 6 deletions(-) + +commit 5a368d469a2441d7d77d78fe104dc3560093ebac +Author: Jordi Mas i Hernandez +Date: Sun Apr 26 20:18:38 2009 +0200 + + Minor fixes to Catalan translation + + po/ca.po | 922 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 457 insertions(+), 465 deletions(-) + +commit 61f130015bbbbc99ce0189cca1c95f7e2e735202 +Author: paul +Date: Sun Apr 26 13:16:34 2009 -0400 + + Fix socket-related configure tests on old platforms + + include in case doesn't. #580299 + + configure.in | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +commit 7c9caecfebf7d15899fe361324c414fbfc7b1317 +Author: Dan Winship +Date: Sun Apr 26 12:18:42 2009 -0400 + + Fix the networking stuff on (current) OS X + + OS X's headers split up the current and old (BIND 4) nameserver stuff + slightly differently than Linux does, but explicitly including + arpa/nameser_compat.h does the right thing on both. Part of #580301 + + gio/ginetaddress.c | 3 +++ + gio/gnetworkingprivate.h | 6 ++++-- + 2 files changed, 7 insertions(+), 2 deletions(-) + +commit 9a15da50e4d10794c35e4b638b7ab521be671a6e +Author: Dan Winship +Date: Sun Apr 26 09:59:28 2009 -0400 + + Fix ginetaddress.c compile on Solaris + + In glibc, IN6_IS_ADDR_UNSPECIFIED() et al. cast their argument to a + uint32_t*, so it doesn't matter whether you pass them the in6_addr + itself (which is what you're supposed to do) or one of its union + members (which is what we were actually doing). Solaris's macro + accesses the in6_addr fields directly though, and so only works if you + pass the actual in6_addr. #580194. + + gio/ginetaddress.c | 20 ++++++++++---------- + 1 files changed, 10 insertions(+), 10 deletions(-) + +commit 491a036d8480f4d710ef601a27a57b559b0a46d7 +Author: Johan Bilien +Date: Wed Apr 22 19:09:34 2009 +0100 + + Fix translation from GIO's file attr to xattr attributes + + Bug 579862 – requesting xattr::foo ends up calling getxattr(..., + user.:foo,...) + + The patch makes sure we escape xattr::, not xattr:, before adding + user. + and calling getxattr. + + gio/glocalfileinfo.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit a9c33dbd7aeeb715677d619cbddc0d621872cc43 +Author: Christian Persch +Date: Wed Apr 22 15:12:37 2009 +0200 + + Use P_ for translatable param spec strings + + Translatable param spec strings should be annotated with P_() + instead of + plain _(). Bug #579830. + + gio/gfileicon.c | 4 +- + gio/ginetaddress.c | 48 + +++++++++++++++++++++++----------------------- + gio/gsocketaddress.c | 4 +- + gio/gthemedicon.c | 12 +++++----- + gio/gunixinputstream.c | 8 +++--- + gio/gunixoutputstream.c | 8 +++--- + gio/gunixsocketaddress.c | 4 +- + 7 files changed, 44 insertions(+), 44 deletions(-) + +commit 9a3d18d2a652f9f1567e09bdb1055e6cb462f710 +Author: Dan Winship +Date: Mon Dec 29 13:38:28 2008 -0500 + + GResolver wrappers: GNetworkAddress, GNetworkService, + GSocketConnectable + + Higher-level wrappers around GResolver. GSocketConnectable provides an + interface for synchronously or asynchronously iterating multiple + socket addresses, with GNetworkAddress and GNetworkService providing + interfaces based on hostname and SRV record resolution. + Part of #548466. + + docs/reference/gio/gio-docs.xml | 3 + + docs/reference/gio/gio-sections.txt | 71 ++++ + docs/reference/gio/gio.types | 4 + + gio/Makefile.am | 8 + + gio/gio.h | 4 + + gio/gio.symbols | 35 ++ + gio/giotypes.h | 4 + + gio/gnetworkaddress.c | 462 ++++++++++++++++++++++++ + gio/gnetworkaddress.h | 65 ++++ + gio/gnetworkservice.c | 658 + +++++++++++++++++++++++++++++++++++ + gio/gnetworkservice.h | 69 ++++ + gio/gresolver.c | 12 + + gio/gsocketaddress.c | 90 +++++- + gio/gsocketaddressenumerator.c | 191 ++++++++++ + gio/gsocketaddressenumerator.h | 89 +++++ + gio/gsocketconnectable.c | 148 ++++++++ + gio/gsocketconnectable.h | 68 ++++ + gio/gsrvtarget.c | 7 +- + gio/tests/.gitignore | 1 + + gio/tests/resolver.c | 141 +++++++- + 20 files changed, 2121 insertions(+), 9 deletions(-) + +commit c94d3f92885456e1dc9e2fb27b709017f29d04ce +Author: Dan Winship +Date: Mon Dec 29 12:53:47 2008 -0500 + + Add GResolver, a glib-ish interface to DNS + + GResolver provides asynchronous (and synchronous-but-cancellable) APIs + for resolving hostnames, reverse-resolving IP addresses back to + hostnames, and resolving SRV records. Part of #548466. + + configure.in | 25 + + docs/reference/gio/Makefile.am | 6 +- + docs/reference/gio/gio-docs.xml | 2 + + docs/reference/gio/gio-sections.txt | 52 ++ + docs/reference/gio/gio.types | 1 + + gio/Makefile.am | 18 +- + gio/ginetaddress.c | 7 +- + gio/gio.h | 2 + + gio/gio.symbols | 57 ++ + gio/gioenums.h | 14 + + gio/giotypes.h | 4 +- + gio/gnetworkingprivate.h | 32 + + gio/gresolver.c | 855 ++++++++++++++++++++ + gio/gresolver.h | 159 ++++ + gio/gsrvtarget.c | 334 ++++++++ + gio/gsrvtarget.h | 52 ++ + gio/gthreadedresolver.c | 617 ++++++++++++++ + gio/gthreadedresolver.h | 50 ++ + gio/gunixresolver.c | 433 ++++++++++ + gio/gunixresolver.h | 53 ++ + gio/gwin32resolver.c | 481 +++++++++++ + gio/gwin32resolver.h | 49 ++ + gio/libasyncns/Makefile.am | 15 + + gio/libasyncns/README | 7 + + gio/libasyncns/asyncns.c | 1498 + +++++++++++++++++++++++++++++++++++ + gio/libasyncns/asyncns.h | 163 ++++ + gio/libasyncns/g-asyncns.h | 28 + + gio/libasyncns/update.sh | 20 + + gio/pltcheck.sh | 2 +- + gio/tests/.gitignore | 1 + + gio/tests/Makefile.am | 8 +- + gio/tests/resolver.c | 377 +++++++++ + 32 files changed, 5412 insertions(+), 10 deletions(-) + +commit 68fc0556275edf6e63a3242841f2981a42ee11cb +Author: Dan Winship +Date: Fri Dec 12 13:13:55 2008 -0500 + + Add network address and socket types + + Types and methods for dealing with IPv4 and IPv6 addresses (and UNIX + domain socket addresses under UNIX). This does not include code for + actual socket I/O. + + Originally from "gnio". Much of the code was written by Christian + Kellner, Samuel Cormier-Iijima, and Ryan Lortie. + + Part of #548466. + + configure.in | 28 ++ + docs/reference/gio/gio-docs.xml | 7 + + docs/reference/gio/gio-sections.txt | 91 +++++ + docs/reference/gio/gio.types | 4 + + gio/Makefile.am | 11 +- + gio/ginetaddress.c | 747 + +++++++++++++++++++++++++++++++++++ + gio/ginetaddress.h | 101 +++++ + gio/ginetsocketaddress.c | 306 ++++++++++++++ + gio/ginetsocketaddress.h | 69 ++++ + gio/gio.h | 3 + + gio/gio.symbols | 51 +++ + gio/gioenums.h | 20 + + gio/giotypes.h | 5 + + gio/gnetworkingprivate.h | 53 +++ + gio/gsocketaddress.c | 233 +++++++++++ + gio/gsocketaddress.h | 77 ++++ + gio/gunixsocketaddress.c | 206 ++++++++++ + gio/gunixsocketaddress.h | 61 +++ + glibconfig.h.win32.in | 3 + + 19 files changed, 2075 insertions(+), 1 deletions(-) + +commit 6a3b4fa05ac996566e7b8037edf80d0f06fa2a90 +Author: Dan Winship +Date: Mon Dec 29 09:00:17 2008 -0500 + + Add hostname-related utilities in glib/ghostutils.h + + Functions for converting between UTF-8 IDNs (Internationalized Domain + Names) and their ASCII-Compatible Encodings, plus a function to + recognize + IP addresses. Part of #548466. + + docs/reference/glib/glib-docs.sgml | 2 + + docs/reference/glib/glib-sections.txt | 13 + + docs/reference/glib/tmpl/ghostutils.sgml | 64 +++ + glib/Makefile.am | 2 + + glib/ghostutils.c | 758 + ++++++++++++++++++++++++++++++ + glib/ghostutils.h | 40 ++ + glib/glib.h | 1 + + glib/glib.symbols | 10 + + glib/tests/.gitignore | 1 + + glib/tests/Makefile.am | 3 + + glib/tests/hostutils.c | 267 +++++++++++ + 11 files changed, 1161 insertions(+), 0 deletions(-) + +commit dda20bccbfc2a560c13532612382712c17717085 +Author: Stefan Kost +Date: Tue Apr 21 23:21:28 2009 +0300 + + goption: format section docs according to gtk-doc rules and fixes + broken xml + + glib/goption.c | 25 +++++++++---------------- + 1 files changed, 9 insertions(+), 16 deletions(-) + +commit 57bd24dc4907e6959f953be0759b946c16c78386 +Author: Stefan Kost +Date: Tue Apr 14 11:32:59 2009 +0300 + + goption: document that some option args need to be freed by the callee + + Option arguments where the result is stored in a string or string + array need to + be freed by the owner of the option group. Fixes #578363. + + glib/goption.c | 3 +++ + glib/goption.h | 5 +++++ + 2 files changed, 8 insertions(+), 0 deletions(-) + +commit 2026c232b3437ff0f1222b6b045379ca273393e8 +Author: Stefan Kost +Date: Tue Apr 14 11:23:25 2009 +0300 + + goption: move docs from tmpl folder to inline comments + + docs/reference/glib/tmpl/.gitignore | 1 + + docs/reference/glib/tmpl/option.sgml | 603 + ---------------------------------- + glib/goption.c | 113 +++++++ + glib/goption.h | 204 ++++++++++++- + glib/gtypes.h | 13 + + 5 files changed, 330 insertions(+), 604 deletions(-) + +commit 0f48f804b665943a2fd848ab6efbe913003daa82 +Author: Alexander Larsson +Date: Mon Apr 20 13:14:32 2009 +0200 + + Use g_cancellable_connect/disconnect + + Use the new cancellable helper functions to avoid races. (#572844) + + gio/gasynchelper.c | 9 ++++----- + 1 files changed, 4 insertions(+), 5 deletions(-) + +commit 0001014c378636e5848f4b3d8f38fc7a84c33b22 +Author: Alexander Larsson +Date: Mon Apr 20 13:12:08 2009 +0200 + + Add helpers for connecting/disconnecting to cancelled signal + + There are race conditions when connecting and disconnecting from the + "cancelled" signal on GCancellable which you need to do when + implementing cancellable operations. This adds helper functions that + avoid these races and mentions these races in the docs. (#572844) + + docs/reference/gio/gio-sections.txt | 2 + + gio/gcancellable.c | 214 + ++++++++++++++++++++++++++++------- + gio/gcancellable.h | 6 + + gio/gio.symbols | 2 + + 4 files changed, 183 insertions(+), 41 deletions(-) + +commit c17d4dd117db554e501a18a41de53734f7f87003 +Author: zabeeh khan +Date: Fri Apr 17 11:27:38 2009 +0530 + + Pashto Translation committed as per the request made by Zabeeh Khan + on the gnome-i18n list + + po/ps.po | 870 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 437 insertions(+), 433 deletions(-) + +commit b85834c22369579d1bea86b392594d0b912a5858 +Author: Matthias Clasen +Date: Sat Apr 11 18:10:24 2009 -0400 + + Bump version + + configure.in | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 2c1dc529e8d9b1ab2d8ccb8abb1efed836584616 +Author: Matthias Clasen +Date: Thu Apr 9 21:34:49 2009 -0400 + + Add a note about handling non-hal backends + + gio/gvolume.c | 14 ++++++++++---- + 1 files changed, 10 insertions(+), 4 deletions(-) + +commit 6e11246cc828217fd04a23f16b67db11333523f9 +Author: Matthias Clasen +Date: Thu Apr 9 18:47:28 2009 -0400 + + Release GLib 2.20.1 + + po/am.po | 154 ++++---- + po/ar.po | 839 ++++++++++++++++++++-------------------- + po/as.po | 871 ++++++++++++++++++++-------------------- + po/az.po | 154 ++++---- + po/be.po | 156 ++++---- + po/be@latin.po | 156 ++++---- + po/bg.po | 836 +++++++++++++++++++-------------------- + po/bn.po | 154 ++++---- + po/bn_IN.po | 154 ++++---- + po/bs.po | 154 ++++---- + po/ca.po | 836 +++++++++++++++++++-------------------- + po/cs.po | 154 ++++---- + po/cy.po | 154 ++++---- + po/da.po | 837 +++++++++++++++++++-------------------- + po/de.po | 836 +++++++++++++++++++-------------------- + po/dz.po | 154 ++++---- + po/el.po | 863 ++++++++++++++++++++-------------------- + po/en_CA.po | 154 ++++---- + po/en_GB.po | 836 +++++++++++++++++++-------------------- + po/eo.po | 154 ++++---- + po/es.po | 841 ++++++++++++++++++++-------------------- + po/et.po | 154 ++++---- + po/eu.po | 894 +++++++++++++++++++++--------------------- + po/fa.po | 154 ++++---- + po/fi.po | 154 ++++---- + po/fr.po | 836 +++++++++++++++++++-------------------- + po/ga.po | 154 ++++---- + po/gl.po | 836 +++++++++++++++++++-------------------- + po/gu.po | 154 ++++---- + po/he.po | 154 ++++---- + po/hi.po | 154 ++++---- + po/hr.po | 154 ++++---- + po/hu.po | 905 ++++++++++++++++++++++--------------------- + po/hy.po | 154 ++++---- + po/id.po | 154 ++++---- + po/is.po | 154 ++++---- + po/it.po | 839 ++++++++++++++++++++-------------------- + po/ja.po | 836 +++++++++++++++++++-------------------- + po/ka.po | 154 ++++---- + po/kn.po | 880 +++++++++++++++++++++-------------------- + po/ko.po | 154 ++++---- + po/ku.po | 154 ++++---- + po/lt.po | 836 +++++++++++++++++++-------------------- + po/lv.po | 154 ++++---- + po/mai.po | 154 ++++---- + po/mg.po | 154 ++++---- + po/mk.po | 154 ++++---- + po/ml.po | 886 +++++++++++++++++++++--------------------- + po/mn.po | 154 ++++---- + po/mr.po | 154 ++++---- + po/ms.po | 154 ++++---- + po/nb.po | 836 +++++++++++++++++++-------------------- + po/ne.po | 154 ++++---- + po/nl.po | 154 ++++---- + po/nn.po | 154 ++++---- + po/oc.po | 154 ++++---- + po/or.po | 871 ++++++++++++++++++++-------------------- + po/pa.po | 868 +++++++++++++++++++++-------------------- + po/pl.po | 836 +++++++++++++++++++-------------------- + po/ps.po | 154 ++++---- + po/pt.po | 154 ++++---- + po/pt_BR.po | 836 +++++++++++++++++++-------------------- + po/ro.po | 154 ++++---- + po/ru.po | 836 +++++++++++++++++++-------------------- + po/rw.po | 154 ++++---- + po/si.po | 154 ++++---- + po/sk.po | 154 ++++---- + po/sl.po | 1165 + ++++++++++++++++++++++++++---------------------------- + po/sq.po | 156 ++++---- + po/sr.po | 154 ++++---- + po/sr@ije.po | 154 ++++---- + po/sr@latin.po | 154 ++++---- + po/sv.po | 1203 + +++++++++++++++++++++++++++---------------------------- + po/ta.po | 888 ++++++++++++++++++++--------------------- + po/te.po | 154 ++++---- + po/th.po | 154 ++++---- + po/tl.po | 154 ++++---- + po/tr.po | 154 ++++---- + po/tt.po | 154 ++++---- + po/uk.po | 154 ++++---- + po/vi.po | 154 ++++---- + po/wa.po | 154 ++++---- + po/xh.po | 154 ++++---- + po/yi.po | 154 ++++---- + po/zh_CN.po | 839 ++++++++++++++++++++-------------------- + po/zh_HK.po | 154 ++++---- + po/zh_TW.po | 154 ++++---- + 87 files changed, 17103 insertions(+), 16510 deletions(-) + +commit 009689e09b0cd9cc0a322d1361940183330bada6 +Author: Matthias Clasen +Date: Thu Apr 9 17:43:59 2009 -0400 + + Update for 2.20.1 + + NEWS | 44 ++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 44 insertions(+), 0 deletions(-) + +commit e68a35689fbcbab965b6631882381309cb0a20d8 +Author: Matthias Clasen +Date: Thu Apr 9 14:56:49 2009 -0400 + + Fix G_DEFINE_TYPE_EXTENDED docs + + Make the docs for G_DEFINE_TYPE_EXTENDED match the actual + definition of the macro. (#577985) + + gobject/gtype.h | 71 + ++++++++++++++++++++++++++---------------------------- + 1 files changed, 34 insertions(+), 37 deletions(-) + +commit 856632c496d15f3f273d567b521a2b06afc32721 +Author: Gian Mario Tagliaretti +Date: Thu Apr 9 14:35:36 2009 -0400 + + Fix a typo in GFile docs + + Fixed function name in GFile docs from g_set_display_name to + g_file_set_display_name so that gtk-doc can link correctly. (#578002) + + gio/gfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit 950de29d0e9720ce0979a84530130e27a3a59f74 +Author: Kenneth Nielsen +Date: Thu Apr 9 13:49:00 2009 +0200 + + Updated Danish translation\n\nUpdated Danish translation by Kenneth + Nielsen. + + po/da.po | 156 + +++++++++++++++++++++++++++++++++---------------------------- + 1 files changed, 84 insertions(+), 72 deletions(-) + +commit efc2cdbfc981754db361f49c30c8ee24ac0c769e +Author: Peter Kjellerstedt +Date: Wed Apr 8 10:26:11 2009 -0400 + + Fix parsing of timezones + + Make g_time_val_from_iso8601 handle timezones with minutes correctly; + also accept comma as a fraction separator. (#578369) + + glib/gtimer.c | 6 +++--- + tests/testglib.c | 18 +++++++++++++++++- + 2 files changed, 20 insertions(+), 4 deletions(-) + +commit d0cf7b38780b0832fc904f75eb387aa61eb2f76e +Author: Alexander Larsson +Date: Wed Apr 8 09:12:02 2009 +0200 + + Only mark regular files as backup files + + Apps don't generally create backup directories, etc. So, if the file + ends with ~ but is not a regular file shouldn't be considered a backup + file. (#573673) + + gio/glocalfileinfo.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +commit 85a795b9bae44b973de1443f98728b21b78c68ae +Author: Funda Wang +Date: Sun Apr 5 11:05:47 2009 +0800 + + Updated Simplified Chinese translation from Ray Wang + + + po/zh_CN.po | 87 + ++++++++++++++++++++++++++++++++++------------------------- + 1 files changed, 50 insertions(+), 37 deletions(-) + +commit 7fd870830806def730341a328389f8b5df49fab4 +Author: Thanos Lefteris +Date: Fri Apr 3 20:12:27 2009 +0100 + + Updated Greek translation + + Signed-off-by: Simos Xenitellis + + po/el.po | 238 + ++++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 125 insertions(+), 113 deletions(-) + +commit e6e82c51a64ca263877f730cc7531454d5430b77 +Author: Matthias Clasen +Date: Fri Apr 3 00:35:43 2009 -0400 + + Move hex_digits to rodata + + Turn a string into a constant array. + + gio/gfileattribute.c | 260 + ++++++++++++++++++++++++-------------------------- + 1 files changed, 126 insertions(+), 134 deletions(-) + +commit 25ff8ee7486c7bdf1612d3554fc1d7d91daedfa6 +Author: Matthias Clasen +Date: Fri Apr 3 00:23:54 2009 -0400 + + Don't lie about ext4 filesystems + + When returning a filesystem type id, say "ext3/ext4" instead of + "ext3", + since both use the same superblock magic, so we can't discriminate + them without more work. + + gio/glocalfile.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +commit e8a42bb81c46204a86259e44aa9698658487e64a +Author: Paolo Borelli +Date: Fri Apr 3 00:04:39 2009 -0400 + + Regex leak on error path + + Don't leak the GRegex struct when g_regex_new() fails. + + glib/gregex.c | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +commit 82a5f787d68fd7d6ae973634694cebd43f126552 +Author: Matthias Clasen +Date: Thu Apr 2 23:57:59 2009 -0400 + + Update requirements + + Mention that the mimetype-functionality of GIO reqires + update-mime-database + and update-desktop-database at runtime. (#577128) + + INSTALL.in | 32 +++++++++++++++---------- + README.in | 74 + ++++++++++++++++++++++++++++++------------------------------ + 2 files changed, 56 insertions(+), 50 deletions(-) + +commit 20774c566393af28e5123322abb8e35840ff0e5a +Author: Matthias Clasen +Date: Thu Apr 2 23:42:29 2009 -0400 + + Add a rule to generate ChangeLog + + We use the same rule pango uses to create a ChangeLog file with + the help of git-log. The format is somewhat different from traditional + ChangeLog, but it contains the relevant information. + + Makefile.am | 22 ++++++++++++++++++++-- + 1 files changed, 20 insertions(+), 2 deletions(-) + +commit b7f9a1ac8337c546f9db9b7ee9ff437b256c75d8 +Author: Matthias Clasen +Date: Thu Apr 2 23:14:54 2009 -0400 + + Rename ChangeLog to ChangeLog.pre-2-20 + + Rename ChangeLog to prevent old habits from luring me into adding + entries there. Also, this makes room for autogenerating a ChangeLog + at make dist. + + ChangeLog | 914 + ---------------------------------------------------- + ChangeLog.pre-2-20 | 914 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 914 insertions(+), 914 deletions(-) + +commit b160405aa0a66f3eb771af43b6d0000d076d045b +Author: Matthias Clasen +Date: Thu Apr 2 23:13:35 2009 -0400 + + remove generated files + + README and INSTALL are generated files, no need to keep them + under source control. + + INSTALL | 116 ------------------------------------- + README | 199 + --------------------------------------------------------------- + 2 files changed, 0 insertions(+), 315 deletions(-) + +commit 1ce74b0dd34222b201369e5aff53b27182db7b66 +Author: Alexander Larsson +Date: Thu Apr 2 19:01:56 2009 +0200 + + On trash, if rename fails with EXDEV, return G_IO_ERROR_NOT_SUPPORTED + + Sometimes it seems like the trash dir and the file are on the same + filesystem but the rename fails with EXDEV anyway (can happen + e.g. with bind mounts or multiple mounts of the same device). In this + case we want to return the right error so that apps can fallback to + regular delete. + + gio/glocalfile.c | 19 ++++++++++++++----- + 1 files changed, 14 insertions(+), 5 deletions(-) + +commit 20df6b6e888a1aed596c8c60ed7427708a56a453 +Author: Tobias Mueller +Date: Wed Apr 1 21:51:00 2009 -0400 + + Mark glib_gettext as string translation function + + Make glib_gettext with G_GNUC_FORMAT to avoid warnings with + -Wformat -Wformat-nonliteral. + Signed-off-by: Matthias Clasen + + glib/glib.symbols | 2 +- + glib/glibintl.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 86aa49594feac9797ab87b83e198147aff4171fa +Author: Hagen Schink +Date: Wed Apr 1 21:30:51 2009 -0400 + + fix a typo in g_io_channel_flush docs + + Refer to the correct return values. + + Signed-off-by: Matthias Clasen + + glib/giochannel.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +commit 785bed2e18c18842f07ada42af2ec80cf18aca70 +Author: Matthias Clasen +Date: Tue Mar 31 19:39:16 2009 -0400 + + Update README files to refer to git + + Update various README files to refer to git instead of svn. + Add a README.commits that is pretty much a copy of the same file + in GTK+. Also discontinue ChangeLog files. + + ChangeLog | 6 ++++ + HACKING | 8 ++-- + Makefile.am | 1 + + README | 76 + +++++++++++++++++++++++----------------------- + README.commits | 72 + +++++++++++++++++++++++++++++++++++++++++++ + docs/reference/ChangeLog | 6 ++++ + gio/ChangeLog | 6 ++++ + gmodule/ChangeLog | 6 ++++ + gobject/ChangeLog | 6 ++++ + gthread/ChangeLog | 6 ++++ + po/ChangeLog | 6 ++++ + 11 files changed, 157 insertions(+), 42 deletions(-) + +commit b5ef6da3c31ad1067b88f7edd53c5d48fe7f73c1 +Author: Manoj Kumar Giri +Date: Mon Mar 30 08:53:32 2009 +0000 + + Added entries for Oriya language Translation updation. + + svn path=/trunk/; revision=8023 + + po/ChangeLog | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit b6a7cd609a1d0012ff07d62e04115830c68972e0 +Author: Manoj Kumar Giri +Date: Mon Mar 30 08:52:25 2009 +0000 + + Updated Oriya Translation. + + svn path=/trunk/; revision=8022 + + po/or.po | 876 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 443 insertions(+), 433 deletions(-) + +commit a6ebda3d690098e28319dc391fb82a281f9113e8 +Author: Matthias Clasen +Date: Sun Mar 29 19:08:57 2009 +0000 + + Copy a va_list when using it multiple times. Reported by Wim Lewis. + + * glib/gmessages.c (g_logv): Copy a va_list when using it + multiple times. Reported by Wim Lewis. + + + svn path=/trunk/; revision=8021 + + ChangeLog | 8 ++++++++ + glib/gmessages.c | 15 ++++++++++++--- + 2 files changed, 20 insertions(+), 3 deletions(-) + +commit dabbea65c61c402ed63fba0c36a419e4d4abdf46 +Author: Carlos Garnacho +Date: Thu Mar 26 13:59:02 2009 +0000 + + Bug 575270 – GVolumeMonitor::mount-pre-unmount not being emitted + + 2009-03-26 Carlos Garnacho + + Bug 575270 – GVolumeMonitor::mount-pre-unmount not being + emitted + + * gunixmount.c (eject_unmount_cb) (eject_unmount_do_cb) + (eject_unmount_do): Emit ::mount-pre-unmount and wait + 500msec before + actually trying to unmount. + + + svn path=/trunk/; revision=8020 + + gio/ChangeLog | 8 ++++++++ + gio/gunixmount.c | 52 + ++++++++++++++++++++++++++++++++++------------------ + 2 files changed, 42 insertions(+), 18 deletions(-) + +commit 3476bfe846b663049b393e43d272a06883b3fe7d +Author: Gintautas Miliauskas +Date: Thu Mar 26 13:52:46 2009 +0000 + + Updated Lithuanian translation. + + 2009-03-26 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + + + + svn path=/trunk/; revision=8019 + + po/ChangeLog | 4 + + po/lt.po | 842 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 433 insertions(+), 413 deletions(-) + +commit 618617acfcc8bbbb0b563e5744218be213660cbb +Author: Shankar Prasad +Date: Thu Mar 26 05:35:36 2009 +0000 + + updated kn.po + + svn path=/trunk/; revision=8018 + + po/kn.po | 90 + ++++++++++++++++++++++++++++++++++++------------------------- + 1 files changed, 53 insertions(+), 37 deletions(-) + +commit 32f7e122b1c80171db3ce84ff8947a24d50e0e5a +Author: Shankar Prasad +Date: Thu Mar 26 05:31:33 2009 +0000 + + updated kn.po + + svn path=/trunk/; revision=8017 + + po/ChangeLog | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit d487ef7c2f13c66d2784a2d5371021c3c3043e12 +Author: Nickolay V. Shmyrev +Date: Fri Mar 20 22:29:22 2009 +0000 + + Updated Russian translation. + + 2009-03-21 Nickolay V. Shmyrev + + * ru.po: Updated Russian translation. + + + svn path=/trunk/; revision=8016 + + po/ChangeLog | 4 +++ + po/ru.po | 77 + +++++++++++++++++++++++++++++++++------------------------- + 2 files changed, 48 insertions(+), 33 deletions(-) + +commit edfe4405e05d832ff2449a54bf4938d964d3ae44 +Author: Kostas Papadimas +Date: Wed Mar 18 15:49:52 2009 +0000 + + Updated Greek Translation by Fotis Tsamis. + + svn path=/trunk/; revision=8015 + + po/ChangeLog | 4 ++ + po/el.po | 145 + ++++++++++++++++++++++++++++----------------------------- + 2 files changed, 75 insertions(+), 74 deletions(-) + +commit fdcaf9381e3f084d9ddf1ffd0c35873602950151 +Author: Djihed Afifi +Date: Wed Mar 18 09:20:03 2009 +0000 + + Updated Arabic translation + + svn path=/trunk/; revision=8014 + + po/ChangeLog | 4 + + po/ar.po | 843 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 434 insertions(+), 413 deletions(-) + +commit 11554d40ca7b0d8691a0a0d93b34bffef29276f0 +Author: Amitakhya Phukan +Date: Wed Mar 18 06:31:05 2009 +0000 + + Updated assamese translations + + svn path=/trunk/; revision=8013 + + po/ChangeLog | 4 + + po/as.po | 873 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 445 insertions(+), 432 deletions(-) + +commit 07b2a7a5ad6818a692e41e9003f2a849f7220b66 +Author: Gabor Kelemen +Date: Wed Mar 18 00:05:58 2009 +0000 + + Translation updated. + + 2009-03-18 Gabor Kelemen + + * hu.po: Translation updated. + + + svn path=/trunk/; revision=8012 + + po/ChangeLog | 4 + + po/hu.po | 911 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 457 insertions(+), 458 deletions(-) + +commit 8df23d2283b56b181c4ebac9a74d9ea980efb1ba +Author: Ryan Lortie +Date: Tue Mar 17 23:03:33 2009 +0000 + + trivial spelling/whitespace fixes + + svn path=/trunk/; revision=8011 + + ChangeLog | 18 +++++++++--------- + glib/gmain.c | 2 +- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit 1d1fba442fd7e605288fe92809c59d58b0b8f186 +Author: Colin Walters +Date: Tue Mar 17 21:59:18 2009 +0000 + + Bug 575708 - runaway inotify madness ... + + 2009-03-17 Colin Walters + + Bug 575708 - runaway inotify madness ... + + * gfilemonitor.c: Queue up events in a local list and + fire one idle, instead of queuing lots of individual + idles which has bad performance behavior. + + + svn path=/trunk/; revision=8010 + + gio/ChangeLog | 8 +++++ + gio/gfilemonitor.c | 78 + ++++++++++++++++++++++++++++++++++++++------------- + 2 files changed, 66 insertions(+), 20 deletions(-) + +commit 044733e2a0d5b3192c38b35611b9de4364c6c810 +Author: Tomasz Dominikowski +Date: Tue Mar 17 17:02:00 2009 +0000 + + Updated Polish translation + + 2009-03-17 Tomasz Dominikowski + + * pl.po: Updated Polish translation + + svn path=/trunk/; revision=8009 + + po/ChangeLog | 4 + + po/pl.po | 844 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 434 insertions(+), 414 deletions(-) + +commit bbb1d85d7233bff2dae91a5cf06600a28e91cec0 +Author: Inaki Larranaga Murgoitio +Date: Tue Mar 17 16:49:22 2009 +0000 + + Updated Basque translation. + + 2009-03-17 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + + + svn path=/trunk/; revision=8008 + + po/ChangeLog | 4 + + po/eu.po | 894 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 451 insertions(+), 447 deletions(-) + +commit 2ff422d461faec17797f498afd82d23bd3ea8f2e +Author: Ani Peter +Date: Tue Mar 17 15:41:14 2009 +0000 + + Updated Malayalam Translation + + svn path=/trunk/; revision=8007 + + po/ChangeLog | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +commit ad9afec76fa198fd2edc56d5fcb834fd2c9577bc +Author: Ani Peter +Date: Tue Mar 17 15:41:04 2009 +0000 + + Updated Malayalam Translation + + svn path=/trunk/; revision=8006 + + po/ml.po | 892 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 448 insertions(+), 444 deletions(-) + +commit 4ed58e576ea15bb84b4b1b461f8f8deea3a09d50 +Author: Ignacio Casal Quinteiro +Date: Tue Mar 17 14:12:26 2009 +0000 + + Updated Galician translation + + svn path=/trunk/; revision=8005 + + po/ChangeLog | 4 +++ + po/gl.po | 84 + ++++++++++++++++++++++++++++++++------------------------- + 2 files changed, 51 insertions(+), 37 deletions(-) + +commit ebf52321606815d09a8a25f6778eae205531a1cb +Author: Gil Forcada Codinachs +Date: Tue Mar 17 13:52:09 2009 +0000 + + Updated Catalan translation + + svn path=/trunk/; revision=8004 + + po/ChangeLog | 4 + + po/ca.po | 842 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 433 insertions(+), 413 deletions(-) + +commit ae38feb249df9a5dc4b9ecc85c55d13f256c7477 +Author: Takeshi AIHANA +Date: Tue Mar 17 13:20:20 2009 +0000 + + Update Japanese translation. + + 2009-03-17 Takeshi AIHANA + + * ja.po: Update Japanese translation. + + svn path=/trunk/; revision=8003 + + po/ChangeLog | 4 + + po/ja.po | 842 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 433 insertions(+), 413 deletions(-) + +commit fab272e104ac536fea40501594eef457955c50b8 +Author: Hendrik Richter +Date: Tue Mar 17 12:08:42 2009 +0000 + + Updated German translation. + + 2009-03-17 Hendrik Richter + + * de.po: Updated German translation. + + svn path=/trunk/; revision=8002 + + po/ChangeLog | 4 +++ + po/de.po | 80 + +++++++++++++++++++++++++++++++++------------------------ + 2 files changed, 50 insertions(+), 34 deletions(-) + +commit b54278668e432f67cbc3ed8e167fce14cd44d3e8 +Author: Alexander Shopov +Date: Tue Mar 17 12:06:18 2009 +0000 + + Updated Bulgarian translation by Alexander Shopov + + 2009-03-17 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + + svn path=/trunk/; revision=8001 + + po/ChangeLog | 5 +++ + po/bg.po | 79 + +++++++++++++++++++++++++++++++++------------------------- + 2 files changed, 50 insertions(+), 34 deletions(-) + +commit a3fe42808174f1593559cfdcd581a4791d139f72 +Author: Alexander Larsson +Date: Tue Mar 17 11:21:37 2009 +0000 + + fix attributes argument of query_info methods to be "const char *". + + 2009-03-17 Alexander Larsson + + * glocalfileinputstream.c: + * glocalfileoutputstream.c: + fix attributes argument of query_info methods to + be "const char *". + + + svn path=/trunk/; revision=8000 + + gio/ChangeLog | 7 +++++++ + gio/glocalfileinputstream.c | 4 ++-- + gio/glocalfileoutputstream.c | 4 ++-- + 3 files changed, 11 insertions(+), 4 deletions(-) + +commit 6cdd01bfcc10af04c05ccd90669e49551d6872a3 +Author: Claude Paroz +Date: Tue Mar 17 08:22:23 2009 +0000 + + Updated French translation. + + 2009-03-17 Claude Paroz + + * fr.po: Updated French translation. + + svn path=/trunk/; revision=7999 + + po/ChangeLog | 4 + + po/fr.po | 844 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 435 insertions(+), 413 deletions(-) + +commit e9de4af6761a150ad1e4cf50838e034cb8d51c78 +Author: Kjartan Maraas +Date: Tue Mar 17 08:18:12 2009 +0000 + + Updated Norwegian bokmÃ¥l translation. + + 2009-03-17 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + + svn path=/trunk/; revision=7998 + + po/ChangeLog | 4 + + po/nb.po | 844 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 434 insertions(+), 414 deletions(-) + +commit 1269ae29a1d43284894601bf090bada778bc8b4f +Author: Jorge Gonzalez Gonzalez +Date: Mon Mar 16 22:11:32 2009 +0000 + + Updated Spanish translation + + svn path=/trunk/; revision=7997 + + po/ChangeLog | 4 + + po/es.po | 851 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 439 insertions(+), 416 deletions(-) + +commit 2506375ebe0a72aa02f80551db2a5dfd12a4fcde +Author: miloc +Date: Mon Mar 16 21:11:22 2009 +0000 + + Updated Italian translation + + svn path=/trunk/; revision=7996 + + po/ChangeLog | 4 + + po/it.po | 845 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 435 insertions(+), 414 deletions(-) + +commit 47500e19d2ec122f282e293c10f2ff4e64ae39bf +Author: Og B. Maciel +Date: Mon Mar 16 20:53:27 2009 +0000 + + Updated Brazilian Portuguese translation. + + svn path=/trunk/; revision=7995 + + po/ChangeLog | 5 + + po/pt_BR.po | 846 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 436 insertions(+), 415 deletions(-) + +commit f008bf64d078c6d94193608a5ce3d285c59f6406 +Author: Daniel Nylander +Date: Mon Mar 16 19:01:51 2009 +0000 + + sv.po: Updated Swedish translation + + svn path=/trunk/; revision=7994 + + po/ChangeLog | 4 + + po/sv.po | 1209 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 625 insertions(+), 588 deletions(-) + +commit 669cb756888d9aedaee419b9e705869a1cecffe6 +Author: Matej Urbančič +Date: Mon Mar 16 18:35:43 2009 +0000 + + Updated Slovenian translation + + svn path=/trunk/; revision=7993 + + po/sl.po | 1171 + +++++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 618 insertions(+), 553 deletions(-) + +commit 8b96ff36f14a55d990660f33d1163eab680ff780 +Author: Philip Withnall +Date: Mon Mar 16 18:21:34 2009 +0000 + + Updated British English translation. + + 2009-03-16 Philip Withnall + + * en_GB.po: Updated British English translation. + + + svn path=/trunk/; revision=7992 + + po/ChangeLog | 4 + + po/en_GB.po | 840 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 432 insertions(+), 412 deletions(-) + +commit 6cff88ba18b3bc0d118308f109840cb163dcea03 +Author: Alexander Larsson +Date: Mon Mar 16 16:03:13 2009 +0000 + + Bug 575555 – Use fsync() when replacing files to avoid data loss on + + 2009-03-16 Alexander Larsson + + Bug 575555 – Use fsync() when replacing files to avoid data + loss on crash + + * configure.in: + Look for fsync(). + + * glib/gfileutils.c: + (write_to_temp_file): + fsync temp file if destination file exists + + 2009-03-16 Alexander Larsson + + Bug 575555 – Use fsync() when replacing files to avoid data + loss on crash + + * glocalfileoutputstream.c: + (g_local_file_output_stream_close): + (_g_local_file_output_stream_replace): + fsync temp file before closing if replacing target file + + + + svn path=/trunk/; revision=7991 + + ChangeLog | 11 +++++++++ + configure.in | 1 + + gio/ChangeLog | 9 +++++++ + gio/glocalfileoutputstream.c | 26 +++++++++++++++++++++ + glib/gfileutils.c | 51 + ++++++++++++++++++++++++++++++++++++++--- + 5 files changed, 94 insertions(+), 4 deletions(-) + +commit 0b66e52e0b0fbd0101bfbf0e1ef04421d8d7d189 +Author: Kostas Papadimas +Date: Mon Mar 16 15:54:50 2009 +0000 + + Updated Greek Translation by Fotis Tsamis. + + svn path=/trunk/; revision=7990 + + po/ChangeLog | 4 + + po/el.po | 931 + ++++++++++++++++++++++++++++------------------------------ + 2 files changed, 450 insertions(+), 485 deletions(-) + +commit 593718fd8cabe8e0a726d9b083ef80d6ec5e879b +Author: Alexander Shopov +Date: Mon Mar 16 10:55:58 2009 +0000 + + Updated Bulgarian translation by Alexander Shopov + + 2009-03-16 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + + svn path=/trunk/; revision=7989 + + po/ChangeLog | 5 + + po/bg.po | 838 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 426 insertions(+), 417 deletions(-) + +commit d421cf697c7c8800e070ba81de22e45b5382684b +Author: Shankar Prasad +Date: Mon Mar 16 10:31:10 2009 +0000 + + Updated kn.po + + svn path=/trunk/; revision=7988 + + po/ChangeLog | 4 + + po/kn.po | 1004 + ++++++++++++++++++++++++++++------------------------------ + 2 files changed, 483 insertions(+), 525 deletions(-) + +commit dada55618e7d2fe2526eb01e72ec5ce3cc071846 +Author: Amanpreet Singh Alam +Date: Mon Mar 16 02:33:40 2009 +0000 + + updating for Gnome Punjabi Translation by A S Alam + + svn path=/trunk/; revision=7987 + + po/pa.po | 907 + +++++++++++++++++++++++++++++++------------------------------- + 1 files changed, 451 insertions(+), 456 deletions(-) + +commit b3e22d022950ce13cc6cb88d0044693d951572eb +Author: Hendrik Richter +Date: Sun Mar 15 18:19:44 2009 +0000 + + Updated German translation. + + 2009-03-15 Hendrik Richter + + * de.po: Updated German translation. + + svn path=/trunk/; revision=7986 + + po/ChangeLog | 4 + + po/de.po | 920 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 466 insertions(+), 458 deletions(-) + +commit a79594b51723b64b548ceb5b5b60666ecd080c85 +Author: Felix I +Date: Sun Mar 15 08:35:41 2009 +0000 + + tamil translation updated + + svn path=/trunk/; revision=7985 + + po/ChangeLog | 4 + + po/ta.po | 1327 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 683 insertions(+), 648 deletions(-) + +commit 98346a15946fbec3a5206153e0fc809ed1cacaf4 +Author: Nickolay V. Shmyrev +Date: Sat Mar 14 19:14:18 2009 +0000 + + Updated Russian translation by Yuriy Penkin. + + 2009-03-14 Nickolay V. Shmyrev + + * ru.po: Updated Russian translation by Yuriy Penkin. + + + svn path=/trunk/; revision=7984 + + po/ChangeLog | 4 + + po/ru.po | 885 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 448 insertions(+), 441 deletions(-) + +commit 516a19767d0db4d575872832c1e51323e46edc99 +Author: Kostas Papadimas +Date: Sat Mar 14 16:12:38 2009 +0000 + + Updated Greek Translation by Jennie Petoumenou. + + svn path=/trunk/; revision=7983 + + po/ChangeLog | 4 + + po/el.po | 1721 + ++++++++++++++++++++++++++++++---------------------------- + 2 files changed, 881 insertions(+), 844 deletions(-) + +commit 4175a8546e642ee041f92693536fd907a3fd79b3 +Author: Aron Xu +Date: Sat Mar 14 11:31:29 2009 +0000 + + Updated Simplified Chinese translations by Deng Xiyue + + + svn path=/trunk/; revision=7982 + + po/zh_CN.po | 853 + ++++++++++++++++++++++++++++++----------------------------- + 1 files changed, 429 insertions(+), 424 deletions(-) + +commit 1dcdbf5974812685c1b8a03c36d6217fe44ffbca +Author: Kenneth Nielsen +Date: Sat Mar 14 03:48:26 2009 +0000 + + Updated Danish translation + + svn path=/trunk/; revision=7981 + + po/ChangeLog | 4 + + po/da.po | 884 + +++++++++++++++++++++++++++++----------------------------- + 2 files changed, 448 insertions(+), 440 deletions(-) + +commit 4e9abf266574d854b0495c1b13d956c00019ac87 +Author: Ignacio Casal Quinteiro +Date: Fri Mar 13 18:28:21 2009 +0000 + + Updated Galician translation + + svn path=/trunk/; revision=7980 + + po/ChangeLog | 4 + + po/gl.po | 1075 + +++++++++++++++++++++++++++++---------------------------- + 2 files changed, 551 insertions(+), 528 deletions(-) + +commit 622f01012030fcba31ee2a68920873ac06bb62e4 +Author: Kristian Rietveld +Date: Fri Mar 13 09:22:57 2009 +0000 + + when defaulting to the only item in the array, check if this is + indeed the + + 2009-03-13 Kristian Rietveld + + * gsignal.c (signal_lookup_closure): when defaulting to the only + item in the array, check if this is indeed the default closure. + (patch by Tim Janik). + + + svn path=/trunk/; revision=7979 + + gobject/ChangeLog | 6 ++++++ + gobject/gsignal.c | 9 ++++++--- + 2 files changed, 12 insertions(+), 3 deletions(-) + +commit 621ef866b14af56865eb65062c271ba3d06cfe7d +Author: Matthias Clasen +Date: Fri Mar 13 05:45:53 2009 +0000 + + Bump version + + svn path=/trunk/; revision=7978 + + ChangeLog | 4 ++++ + configure.in | 4 ++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 5a8a224ff0ca193fe797c45ef54e5ed6466bfbb7 +Author: Matthias Clasen +Date: Fri Mar 13 05:44:11 2009 +0000 + + 2.20.0 + + svn path=/trunk/; revision=7976 + + ChangeLog | 6 + + INSTALL | 4 +- + README | 2 +- + configure.in | 4 +- + docs/reference/ChangeLog | 4 + + docs/reference/glib/gtester-report.1 | 4 +- + docs/reference/glib/gtester.1 | 4 +- + docs/reference/gobject/glib-genmarshal.1 | 4 +- + docs/reference/gobject/glib-mkenums.1 | 4 +- + docs/reference/gobject/gobject-query.1 | 4 +- + gio/ChangeLog | 4 + + gmodule/ChangeLog | 4 + + gobject/ChangeLog | 4 + + gthread/ChangeLog | 4 + + po/ChangeLog | 4 + + po/am.po | 72 +- + po/ar.po | 72 +- + po/as.po | 997 + ++++++++++++++------------ + po/az.po | 72 +- + po/be.po | 72 +- + po/be@latin.po | 72 +- + po/bg.po | 72 +- + po/bn.po | 72 +- + po/bn_IN.po | 869 +++++++++++----------- + po/bs.po | 72 +- + po/ca.po | 72 +- + po/cs.po | 829 +++++++++++----------- + po/cy.po | 72 +- + po/da.po | 72 +- + po/de.po | 72 +- + po/dz.po | 72 +- + po/el.po | 72 +- + po/en_CA.po | 72 +- + po/en_GB.po | 72 +- + po/eo.po | 72 +- + po/es.po | 72 +- + po/et.po | 72 +- + po/eu.po | 72 +- + po/fa.po | 72 +- + po/fi.po | 72 +- + po/fr.po | 72 +- + po/ga.po | 72 +- + po/gl.po | 72 +- + po/gu.po | 72 +- + po/he.po | 72 +- + po/hi.po | 862 +++++++++++----------- + po/hr.po | 72 +- + po/hu.po | 72 +- + po/hy.po | 72 +- + po/id.po | 72 +- + po/is.po | 72 +- + po/it.po | 832 +++++++++++----------- + po/ja.po | 829 +++++++++++----------- + po/ka.po | 72 +- + po/kn.po | 72 +- + po/ko.po | 72 +- + po/ku.po | 72 +- + po/lt.po | 829 +++++++++++----------- + po/lv.po | 72 +- + po/mai.po | 72 +- + po/mg.po | 72 +- + po/mk.po | 72 +- + po/ml.po | 881 ++++++++++++----------- + po/mn.po | 72 +- + po/mr.po | 853 +++++++++++----------- + po/ms.po | 72 +- + po/nb.po | 72 +- + po/ne.po | 72 +- + po/nl.po | 72 +- + po/nn.po | 72 +- + po/oc.po | 72 +- + po/or.po | 864 +++++++++++----------- + po/pa.po | 72 +- + po/pl.po | 829 +++++++++++----------- + po/ps.po | 72 +- + po/pt.po | 72 +- + po/pt_BR.po | 72 +- + po/ro.po | 856 +++++++++++----------- + po/ru.po | 72 +- + po/rw.po | 72 +- + po/si.po | 72 +- + po/sk.po | 72 +- + po/sl.po | 1158 + ++++++++++++++---------------- + po/sq.po | 72 +- + po/sr.po | 72 +- + po/sr@ije.po | 72 +- + po/sr@latin.po | 72 +- + po/sv.po | 72 +- + po/ta.po | 72 +- + po/te.po | 103 ++-- + po/th.po | 72 +- + po/tl.po | 72 +- + po/tr.po | 72 +- + po/tt.po | 72 +- + po/uk.po | 72 +- + po/vi.po | 72 +- + po/wa.po | 72 +- + po/xh.po | 72 +- + po/yi.po | 72 +- + po/zh_CN.po | 72 +- + po/zh_HK.po | 72 +- + po/zh_TW.po | 72 +- + 102 files changed, 8495 insertions(+), 8412 deletions(-) + +commit 3c34e435754bbe4b5d0871603408d8e1bf9f5c19 +Author: Matthias Clasen +Date: Fri Mar 13 04:09:21 2009 +0000 + + Updates + + svn path=/trunk/; revision=7975 + + ChangeLog | 4 ++++ + NEWS | 28 ++++++++++++++++++++++++++++ + 2 files changed, 32 insertions(+), 0 deletions(-) diff --git a/ChangeLog.pre-1-2 b/ChangeLog.pre-1-2 new file mode 100644 index 0000000..e5b481a --- /dev/null +++ b/ChangeLog.pre-1-2 @@ -0,0 +1,2880 @@ +Sun Feb 21 22:11:51 CST 1999 Shawn T. Amundson + + * Released GLib 1.2.0 + + * AUTHORS: updated + +Wed Feb 24 00:08:42 CST 1999 Shawn T. Amundson + + * *.[ch]: inserted additional note to look for ChangeLog and + AUTHORS file for a log of modifications. + +Sun Feb 21 14:01:00 1999 Dr Mike + + * Made specfile generated, tweaked slightly + +Thu Feb 18 08:24:12 1999 Tim Janik + + * gmem.c (g_realloc): plugged a memory leak, reported by Koen D'Hondt + on 15 Oct 1998. allocate inital block from realloc. + +1999-02-17 Elliot Lee + + * glib.spec: Do --enable-debug=no for the .rpm's. + +Wed Feb 17 17:04:06 1999 Tor Lillqvist + + * config.h.win32: Must define HAVE_PTHREAD_GETSPECIFIC_POSIX. + +Tue Feb 16 14:08:59 CST 1999 Shawn T. Amundson + + * NEWS + README + INSTALL + config.h.win32 + configure.in + glib.spec + glibconfig.h.win32 + docs/glib-config.1: version=1.1.16 + + * Released GLib 1.1.16 + +1999-02-15 Sebastian Wilhelmi + + * glib.h, glibconfig.h.win32, configure.in: Changed signature of + all g_static_mutex_* functions to take a pointer rather than the + struct itself. This is not an issue at the moment, because those + funcs are really macros, but is it un'G'ish and might fall on our + feet in the future. + +Mon Feb 15 07:45:54 1999 Tim Janik + + * configure.in (--enable-debug): default to yes for development trees. + +Mon Feb 15 06:18:58 1999 Tim Janik + + * glib.h: return guints instead of gints for g_hash_table_size + and g_hash_table_foreach_remove. + +Wed Feb 10 12:01:42 1999 Tim Janik + + * configure.in: don't reset G_MODULE_IMPL, so it can be overridden + from the command line. + +1999-02-10 Sebastian Wilhelmi + + * glib.h: s/G_LOCK_DECLARE/G_LOCK_DEFINE/ throuhout glib. Added + G_LOCK_EXTERN macro to declare a lock externally. + +Wed Feb 10 06:20:30 1999 Tim Janik + + * gmutex.c (g_static_private_set): invoke destroy notifier when + overwriting values, initialize new array fields with NULL. + (g_static_private_free_data): do not skip destroy notification for + data == NULL. + + * gutils.c (g_direct_equal): compare pointer values directly instead + of just their guint values which is a loosing conversion for + sizeof(gpointer)==8 systems. + (g_get_any_init): restructured code so we don't use endless loops like + while (1), which boil down to an ugly alias for goto. + strip ,.* from the real name. + +February 9, 1999 sopwith@redhat.com + + . glist.c, gnode.c, gslist.c: allocate pools of 128 items instead + of 1024 items. + +1999-02-08 Sebastian Wilhelmi + + * configure.in, acconfig.h: Changed the test for getpwuid_r to + exclude those systems (i.e. IRIX), that set ENOSYS after the call. + Test, if pthread_getspecific is posix like or something different, + as on PCThreads. + +Sun Feb 7 21:56:00 1999 Owen Taylor + + * gmem.c (g_mem_profile): Copy all elements + of the allocations[] array, including the last. + (Pointed out by "Matthew W. Samsonoff" ) + +1999-02-05 Sebastian Wilhelmi + + * configure.in: Make the error message in case of a broken thread + system a bit more informative. + + * gutils.c (g_get_any_init): Changed the error logic again, now + only leaving the memory doubling loop, when success is reached or + when the user isn't found or when the buffer is 32k big, + additionally now getpwuid will be run, if getpwuid_r didn't work + out properly. A warning is issued however. + +Thu Feb 04 20:42:24 1999 Tor Lillqvist + + * glibconfig.h.win32 config.h.win32: Update GLIB_MICRO_VERSION. + +1999-02-04 Christopher Blizzard + + * glib.spec (Packager): Change my email address + +Thu Feb 4 01:45:01 PST 1999 Shawn T. Amundson + + * ChangeLog + NEWS + README + configure.in + glib.spec + docs/glib-config.1: version=1.1.15 + + * Released GLib 1.1.15 + +Tue Feb 02 00:08:54 1999 Tor Lillqvist + + * gmessages.c (g_log_default_handler): (Win32:) Don't call + ensure_stdout_valid (which would open an unneeded console window) + if we're calling a logging function. Define ensure_stdout_valid + as an empty macro on Unix. + + * gutils.c (g_get_any_init): (Win32:) Trust HOME first if defined, + then try HOMEDRIVE and HOMEPATH. + +Mon Feb 1 19:04:28 1999 Owen Taylor + + * gmain.c (g_main_iterate): Release the main_loop + lock around calls to prepare() and check() so + that we are not holding the main loop lock + over user code. + +1999-01-30 Sebastian Wilhelmi + + * configure.in: Moved the check for MT safe function variants + after the determination of the MT cflags and use them there. + +1999-01-29 Sebastian Wilhelmi + + * configure.in: Fixed typo. Now HPUX 11 thread system detection + should work. + + * gutils.c (g_get_any_init): Changed initial bufsize to 64. Should + solve some problems out there. + +Wed Jan 27 23:21:50 CST 1999 Shawn T. Amundson + + * INSTALL + NEWS + README + configure.in + glib.spec + docs/glib-config.1: version=1.1.14 + + * Released GLib 1.1.14 + +1999-01-28 Sebastian Wilhelmi + + * configure.in: Simplified configure.in test for posix threads, + systems, that provide /usr/include/pthread.h should also have the + posix thread library. This is to avoid writing down all the tests + twice. New test for thread system on HPUX 11. Info from Matt + Nottingham . + +Wed Jan 27 20:39:49 PST 1999 Manish Singh + + * acinclude.m4: Xsed isn't valid here, don't use it + + * ltmain.sh + * ltconfig: better file magic regexp for Linux libs + + * gmodule/Makefile.am: arg, noinst_LTLIBRARIES doesn't make shared + libs, revert my previous change to this file + + * docs/texinfo.tex: add it so automake doesn't whine + +Wed Jan 27 01:57:19 1999 Tim Janik + + * configure.in (G_MODULE_HAVE_DLERROR): applied patch from Andrej + Borsenkow to also check for dlsym() in system + libraries and -ldl, to catch systems that provide dlopen() in libc + and dlsym() in libdl. this is at least the case for Reliant UNIX + 5.44 (labeling itself as SINIX). + +Tue Jan 26 13:39:22 PST 1999 Manish Singh + + * configure.in: don't use backquotes in warning text + +1999-01-26 Sebastian Wilhelmi + + * gdate.c (g_date_set_time): Removed the #warning about MT + unsafety without localtime_r. + + * configure.in: Moved it here. + +Mon Jan 25 10:07:53 1999 Raph Levien + + * configure.in: (#define G_THREADS_IMPL...) Changed the #define, + adding the G_THREADS_IMPL_ prefix to $g_threads_impl_def because + it looked wrong to me and was breaking gimp compile. + +Mon Jan 25 15:34:43 1999 Timur Bakeyev + + * configure.in, gstrfuncs.c: Inverted logic of NO_SYS_SYGLIST_DECL - + now it's normal (see 1999-01-19 Josh MacDonald). Also, remove from + #include wrapper NO_SYS_SYGLIST - *sys_syglist[] declara- + tion hides there. + +1999-01-25 Sebastian Wilhelmi + + * configure.in: Do not use the thread libs, when searching for + some functions, as this might require glib to always be linked + with the thread libs on some platforms. + + * gutils.c (g_get_any_init): Don't set errno to zero and use it + only as the error code, if the function returned a value less + 0. It might happen, that the call succeeds, even though the errno + is set during the call (i.e. it first looks for a passwd file, + which is not found). Submitted by Michael Natterer + . BTW: Sorry for all the mess with that + `getpwuid_r' change, but it had to be done once. + +Sun Jan 24 10:33:30 1999 Tim Janik + + * gutils.c (g_get_any_init): reverted raja's changes, since they leaked + a struct passwd contents buffer and for the rest mostly substituted a + while loop with a bunch of gotos. + restored the getpwuid() code to what we had after my recent clean ups + ("Sat Jan 23 02:14:28 1999 Tim Janik"), module yosh's recent changes. + to feature solaris behaviour of directly returning errno, we don't + modify error anymore if it's > 0 and simply reset errno. + don't reset g_home_dir for !NATIVE_WIN32 && !NATIVE_WIN32. + +1999-01-24 Raja R Harinath + + * gutils.c + (g_get_any_init) [HAVE_GETPWUID_R && HAVE_GETPWUID_R_POSIX]: + Hopefully got the error handling for `getpwuid_r' right. + (g_get_any_init) [HAVE_GETPWUID_R && !HAVE_GETPWUID_R_POSIX]: + Fix typo (change `pw == NULL' to `pw != NULL'). + +Sun Jan 24 00:36:22 EST 1999 Jeff Garzik + + * ghash.c: + - Revert previous "fix" (which really just did things a + different way). + - (g_hash_table_remove): Don't need to support multiple values + for a single key. + + * tests/hash-test.c: + Add test where hash function always returns a single value. + Add beginnings of tests for g_hash_table_foreach[_remove] and + g_hash_table_remove. + +Sat Jan 23 20:40:06 PST 1999 Manish Singh + + * gutils.c: removed the #warning about MT without getpwuid_r + + * configure.in: and moved it here + +Sat Jan 23 22:45:59 1999 Jeff Garzik + + * ghash.c (g_hash_table_lookup_node, g_hash_table_lookup, + g_hash_table_insert, g_hash_table_remove, + g_hash_table_lookup_extended): + - Fixed bug that overwrote nodes in hash buckets instead of + adding them to the hash bucket node list. + Hash tables now work as advertised. + + (g_hash_table_resize): + - Use g_new0 instead of manual init. + - Space out code a bit for readability. + + (g_hash_nodes_destroy): + - Replaced "if (!hash_node) return;" with + "if (hash_node) {do stuff}". + Testing takes up less code space than explicit call to + 'return' before end of function. (look at gcc -S) + + Updated module header copyright to 1999. + New module macro G_HASH_BUCKET for (table,key)->bucket lookups. + + * tests/hash-test.c: + - Add two new tests, one with strings as the keys and values, and + one with ints as the keys and values. Tests indirect (strings) + and direct (ints) hashing. + - Cleanup unused junk left over from testglib.c. + - Converted a g_print call to g_assert_not_reached. + - Updated copyright to 1999. + + * testglib.c, tests/string-test.c: + - Init 'tmp_string' var to NULL, silencing uninit-var warning. + +1999-01-23 Raja R Harinath + + * gutils.c (g_get_any_init) [HAVE_GETPWUID_R]: + Rewrite not to look at `errno' if library call succeeds, since + `errno' is not reset to 0. + +Sat Jan 23 16:17:04 1999 Tor Lillqvist + + * glibconfig.h.win32: Update the magic values for + pthread_mutex_t size and initializer bytes to match the + latest version of pthreads for Win32. + +Sat Jan 23 02:14:28 1999 Tim Janik + + * gutils.c (g_get_any_init): cleaned up the errno mess for + GETPWUID. we especially don't want to g_error() out here! + the warning for G_THREADS_ENABLED and !HAVE_GETPWUID_R isn't + gcc related. + if !HAVE_PWD_H and !NATIVE_WIN32, g_free the home dir before + resetting it to NULL, why are we doing this anyways? + reordered code a bit so we always provide defaults (except + for g_home_dir). + +Thu Jan 21 12:40:11 EST 1999 Jeff Garzik + + * tests/{Makefile.am, string-test.c, strfunc-test.c}: + Separate string and strfunc tests, working towards goal of + having separate test for each of the GLib modules. + Add a couple GString length tests. + +Thu Jan 21 09:36:05 EST 1999 Jeff Garzik + + * configure.in: + Use AC_PREREQ not AC_REQUIRE for autoconf version test. + +1999-01-21 Sebastian Wilhelmi + + * gutils.c (g_get_any_init): Changed error handling again, as the + error is not always set in errno, it is the return value on some + systems. What an evil world. + +Thu Jan 21 05:35:20 1999 Tor Lillqvist + + * gstrfuncs.c: Include signal.h only when the signal names will be + needed. + +Wed Jan 20 22:09:59 EST 1999 Mandrake + + * configure.in / Makefile.am : made some adjustments for automake 1.4 + and autoconf 2.13 (per suggestions made by Raja R Harinath + ) + +Wed Jan 20 20:33:14 EST 1999 Mandrake + + * autogen.sh: automake 1.4 and libtool 1.2d notices. + (maybe I'll write an actual test for automake 1.4 later) + +Wed Jan 20 15:05:25 PST 1999 Manish Singh + + * HACKING: new file + + * Makefile.am: since we require automake 1.4 now, ditch the build + top-level first and just use SUBDIRS + + * gmodule/Makefile.am: use noinst_LTLIBRARIES instead of overriding + the install rule + +Wed Jan 20 16:16:01 EST 1999 Jeff Garzik + + * gutils.c (g_get_any_init): + Revert previous patch, move error value set line down to proper + place. Caught by Elliot Lee . + +Wed Jan 20 20:48:58 GMT 1999 Adam D. Moss + + * gutils.c (g_get_any_init): All gtk apps were broken + here on my setup. I changed the error to a warning to at + least get things limping. + +1999-01-20 Sebastian Wilhelmi + + * gutils.c (g_get_any_init): Use getpwuid_r with the right + signature, if available. + + * configure.in, acconfig.h: Test for existance of getpwuid_r and + its signature. + +Tue Jan 19 20:52:43 1999 Tor Lillqvist + + * Makefile.am (EXTRA_DIST): Add new Win32 files. + + * README.win32: Describe the conditional compilation macros. + + * makefile.lcc: Removed. + +1999-01-19 Sebastian Wilhelmi + + * configure.in: Moved test for localtime_r and rand_r to a place + after the determination of the G_THREAD_LIBS and use them for + finding those functions, necessary on systems with a different C + library libc_r for threaded progs, like FreeBSD 2.2.x. Info from + Timur Bakeyev . + +Tue Jan 19 00:44:24 1999 Josh MacDonald + + * gstrfuncs.c (g_strsignal): The "extern char* sys_siglist" + declaration breaks systems with different declarations, like + mine (FreeBSD). So, I added a configuration variable to decide + whether the declaration is neccesary. Change also appears on + line 275 of configure.in. + +Sun Jan 17 17:13:54 CST 1999 Shawn T. Amundson + + * Released GLib 1.1.13 + + * README: + INSTALL: + docs/glib-config: ver=1.1.13 + +Mon Jan 18 00:02:46 1999 Tim Janik + + * NEWS: updates for 1.1.13. + +Sun Jan 17 17:15:59 1999 Tim Janik + + * gtree.c (g_tree_traverse): removed assertion about rtree->root being + NULL, so this function can be applied to unpopulated trees as well, fix + provided by Simon Kagedal . + +Sun Jan 17 11:17:19 1999 Christopher Blizzard + + * glib.spec: add packager address + +Sun Jan 17 11:10:05 1999 Christopher Blizzard + + * glib.spec: increment version number to 1.1.13 + +Sun Jan 17 16:14:03 1999 Tim Janik + + * glib.h (g_error): if !defined (G_LOG_DOMAIN) define G_LOG_DOMAIN as + ((gchar*) 0) instead of ((void*) 0) to silence egcs C++ mode, reported + by Seth Alves . + +Sun Jan 17 14:13:52 1999 Tim Janik + + * glib.h: added a define G_HOOK_DEFERRED_DESTROY, to substitute a noop + GHookList.hook_destroy function. + + * ghook.c (g_hook_destroy_link): don't really call hook_destroy if it + is G_HOOK_DEFERRED_DESTROY. for the case where we invoke hook->destroy() + we now clean up the hook completely afterwards, i.e. data, func and + destroy are immediately set to NULL and hook_free can't play with that + values anymore. + + * gmain.c (g_source_add): set hook_destroy to G_HOOK_DEFERRED_DESTROY, + instead of using an ugly _noop() hack, this is to avoid an uneccessary + function invocation. set hook_free to g_source_destroy_func, this way + we always invoke the destroy notifiers for user_data and source_data + after execution of dispatch(). thus, g_source_destroy_func() will always + be called within the main_loop lock (this wasn't really assured + before), and can release and reaquire the look around destroy notifier + invocation. + +Sun Jan 17 11:01:40 1999 Tor Lillqvist + + * config.h.win32 glibconfig.h.win32: Increment version number here + also. + +Sun Jan 17 05:12:17 1999 Tim Janik + + * configure.in: incremented version number to 1.1.13, bin age 0, + interface age 0. + + * glib.h: added hook_destroy member to struct _GHookList. + + * ghook.c (g_hook_destroy_link): if the hook_list defines a hook_destroy + function, use that to marshal hook destruction notifiers. + + * gmain.c: removed g_source_free_func and added g_source_destroy_func, + which marshalls the user_data and source_data destructors of sources + outside of the main_loop lock. + removed GIdleData struct since its sole member callback can be passed + as source_data directly. + added a gboolean return value to all g_source_remove* functions, + indicating whether the source could be removed, because these functions + don't issue warnings upon unseccessful removals themselves. this way at + least the caller gets a chance to warn upon failing removals. + (g_main_iterate): set in_check_or_prepare around calls to check() or + prepare(). + (g_main_pending): simply return FALSE if called from within check() or + prepare(). + (g_main_iteration): issue a warning if called from within check() or + prepare() and bail out with FALSE. + (g_main_run): likewise. + (g_source_remove_by_funcs_user_data): new function to remove sources by + user data and function table. + (g_idle_remove_by_data): new function to really remove idles only, since + g_source_remove_by_user_data would remove timeouts or other sources as + well. + +1999-01-16 Tor Lillqvist + + * Merge in current Win32 version: + + * README.win32: More text. + + * config.h.win32 glibconfig.h.win32: Update to match the + corresponding generated files on Unix. + + * makefile.msc: Update with new source files, and gthread + library. Use the compiler flag -MD instead of using -D_DLL and + /nodefaultlib:libc msvcrt.lib in the link phase. + + * glib.def: Update to include new functions, drop removed ones. + + * glib.h: Add comments about main loop and polling on Win32. (In + general, it's only for the GIMP's use.) Add Win32 IO Channel + functions. Remove the obsoleted old IO Channel stuff (which was + in #if 0 already). + + * giowin32.c: New file. + + * gmain.c: Include config.h, conditionalize + inclusion. Add g_poll implementation for Win32 (only for the + GIMP's needs for now, it's hard or even impossible to be as clean + and generic as on Unix). Implement g_get_current_time on Win32. If + threads aren't supported, don't try to wake up main thread's + loop. On Win32, use a semaphore and not a pipe to wake up the main + loop. + + * gmessages.c: On Win32, allocate a console window if the standard + output handle is invalid before writing to stdout, and reopen stdout + to that console window. + + * giochannel.c: Conditionalize unistd.h inclusion. Some indentation + cleanup. + + * gstrfuncs.c: Include . + + * gutils.c: On Win32, also check the HOMEDRIVE and HOMEPATH + environment variables. + +Sun Jan 17 01:06:38 1999 Timur Bakeyev + + * configure.in: Add support for FreeBSD 2.2.x macro _THREAD_SAFE. + +Wed Jan 13 11:27:24 PST 1999 Manish Singh + + * glib.h: don't use inline for !__GNUC__ case with g_warning, + g_error, and g_message wrappers since some compilers throw + away arguments in this case + +Tue Jan 12 21:59:14 PST 1999 Manish Singh + + * acinclude.m4 + * ltconfig + * ltmain.sh: upgrade to libtool 1.2d (with fixes for irix6 and osf) + + * testglib.c: removed unused cruft + +Tue Jan 12 09:57:06 PST 1999 Manish Singh + + * gdate.c: #warning isn't portable, check for gcc + +1999-01-12 Sebastian Wilhelmi + + * gdate.c: Include config.h to get HAVE_LOCALTIME_R macro. + + * configure.in: Moved function check back to the place, they've + been before. + +1999-01-11 Jeff Garzik + + * gstrfuncs.c: + Do not use vasprintf. + + * configure.in, glib.h, testglib.c, tests/.cvsignore, + tests/Makefile.am, tests/alloca-test.c: + Do not use alloca. + +1999-01-11 Sebastian Wilhelmi + + * configure.in: Test for localtime_r only after including the + right MT enabling CFLAGS (i.e. -D_REENTRANT on most systems). + + * configure.in: Find right thread system on DG/UX. Thanks to Marc + J. Fraioli for hint. Finally removed the + stuff for -fstack-check, that didnt work anyway. + + * gdate.c (g_date_set_time): Emit warning, if no localtime_r + function is available on thread enabled systems. Define ptm only, + if really needed, and assert on it. + +Sat Jan 9 15:08:44 1999 Jeff Garzik + + * testglib.c: + Make all aux functions static. + + * tests/Makefile.am, tests/dirname-test.c, tests/type-test.c: + New tests dirname-test and type-test, from testglib. + +Sat Jan 9 13:53:00 1999 Jeff Garzik + + * configure.in: + Add checks for vasprintf, localtime_r. + + * gdate.c (g_date_set_time): + Use localtime if localtime_r is not available. + + * gstrfuncs.c (g_strdup_vprintf): + Use glibc vasprintf if possible; it's a bit faster than using + GLib routines, and makes output code a bit smaller. + + * acconfig.h: + Remove HAVE_VSNPRINTF and HAVE_VPRINTF. autoheader picks these + up automatically and puts them in config.h.in. + +Thu Jan 7 15:14:08 1999 Owen Taylor + + * gmain.c (g_source_free_func): Call the source-specific + free function when the hook is freed not when it + is destroyed; this fixes a bug where a timeout destroyed + from itself would access already freed data. + +1999-01-07 Sebastian Wilhelmi + + * gutils.c (g_get_any_init): Here we must replace getpwuid by + getpwuid_r, but as I do not know how for now, I just made a FIXME + note ;-) + + * gdate.c (g_date_set_time): localtime --> localtime_r to make it + thread safe. + + * configure.in: We do not need to check for broken solaris mutex + intitializer any longer. Provide a macro to show the used thread + implementation. Not nice, but this is needed until thread support + is completed here inside glib. + +Tue Jan 5 12:23:52 PST 1999 Manish Singh + + * configure.in: ditch whitespace before GLIB_SYSDEFS #includes, + the # needs to be in column 1 + + * gthread/testgthread.c: cleanups + + * tests/node-test.c: #include unistd.h for exit() + +1999-01-04 Andrew T. Veliath + + * glib.h (g_array_insert_val): fix macro to be shorthand of + g_array_insert_vals. + +Mon Jan 4 15:35:29 PST 1999 Manish Singh + + * acglib.m4: some echos interpret \n's and some don't. Deal with + accordingly. + +Mon Jan 4 20:58:50 1999 Tim Janik + + * gscanner.c: eliminated extraneous "register" qualifiers in variable + declarations. + + * gmain.c: #undef events and revents which may have been defined in + sys/poll.h for SVR3,4 compatibility on some AIX systems. fix been + provided by Philippe Defert . + +Mon Jan 4 14:38:11 1999 Tim Janik + + * glib.h: adjusted the g_strdup_a, g_strndup_a and g_strconcat3_a macros + so their arguments get only evaluated once. changed g_strconcat3_a to + have the same semantics as g_strconcat, i.e. if a certain argument is + NULL, the rest of the parameter list is skipped. + + * tests/alloca-test.c: removed #if/#endif G_HAVE_ALLOCA, we need to be + able to compile on all systems. added test for g_strconcat() semantics. + + * we need a alloca() replacement for !G_HAVE_ALLOCA rsn! + +Mon Jan 4 02:58:13 CST 1999 Shawn T. Amundson + + * Released GLib 1.1.12 + + * INSTALL: + NEWS: + README: + configure.in: + glib.spec: + docs/glib-config.1: version=1.1.12 + + * tests/Makefile.am: fixed so it works properly with + builddir and srcdir. + +Sun Jan 3 01:38:14 EST 1999 Jeff Garzik + + * tests/Makefile.am: + add array-test.c, tree-test.c + + * tests/array-test.c, tests/tree-test.c: + New module, tests array family + + * tests/hash-test.c, tests/list-test.c, tests/slist-test.c, + tests/string-test.c, tests/node-test.c: + Clean out cruft left over from testglib. + +Sat Jan 2 22:42:25 EST 1999 Jeff Garzik + + * Makefile.am, configure.in, tests/*: + Added 'make check' tests, based on testglib code. + +Sat Jan 2 19:52:45 EST 1999 Jeff Garzik + + * glib.h, testglib.c: + Added g_alloca, g_new_a, g_new0_a macros. + +Sat Jan 2 16:45:44 EST 1999 Jeff Garzik + + * testglib.c: Added g_strdup_printf check. + +Fri Jan 1 21:58:40 EST 1999 Jeff Garzik + + * glib.h: + (g_strdup_a, g_strndup_a): Handle NULL strings like g_strdup. + s/g_strconcat_a/g_strconcat3_a/ to reflect fixed number of args + + * testglib.c: + Added g_strdup, g_strconcat checks. + Added str==NULL checks for alloca string macros. + s/g_strconcat_a/g_strconcat3_a/ + +Fri Jan 1 18:30:41 PST 1999 Manish Singh + + * testglib.c: made the alloca tests follow the testglib style + + * Makefile.am: minor cleanups, mostly cosmetic + +Fri Jan 1 20:43:19 EST 1999 Jeff Garzik + + * glib.h: added g_strndup_a macro + + * testglib.c: + Added tests for new alloca-based string routines. + Reformatted a couple strings. + +Sat Jan 2 02:20:59 1999 Tim Janik + + * ghook.c: + (g_hook_list_invoke): + (g_hook_list_invoke_check): + (g_hook_list_marshal_check): + (g_hook_list_marshal): avoid unneccessary extra hook referencing (the + explicit hook referencing became unneccessarry with my changes from + Mon Dec 21 21:48:29 1998). + + * gmain.c (g_main_iterate): fixed reference counting leaks with + premature loop aborts. + +Fri Jan 1 22:47:44 1999 Tim Janik + + * gscanner.c (g_scanner_unexp_token): handle G_TOKEN_IDENTIFIER_NULL + as G_TOKEN_IDENTIFIER. + +Fri Jan 1 17:09:19 EST 1999 Jeff Garzik + + * configure.in, glib.h: + Added two new alloca-based function macros, g_strdup_a and + g_strconcat_a. These are stack-based and much faster than + their g_malloc-based counterparts. Kudos to Ulrich Drepper + for help on this one. + +Wed Dec 30 18:24:57 CST 1998 Shawn T. Amundson + + * Released GLib 1.1.11 + + * INSTALL: + NEWS: + README: + configure.in: + docs/glib-config.1: version=1.1.11 + +1998-12-30 Raja R Harinath + + * glib.h (G[U]INT64_FROM_{LE,BE}): + Define to G[U]INT64_TO_{LE,BE}, not G[U]INT32_TO_{LE,BE}. + +Fri Dec 25 19:56:33 PST 1998 Manish Singh + + * acglib.m4 + * configure.in: provide defaults for POLL sysdefs, simple enums + don't work with bitwise logic. Reported by Daniel Skarda + <0rfelyus@atrey.karlin.mff.cuni.cz> + +Wed Dec 23 00:43:25 CST 1998 Shawn T. Amundson + + * INSTALL: + NEWS: + README: + configure.in: + docs/glib-config.1: version=1.1.10 + +Wed Dec 23 04:18:11 1998 George Lebl + + * gmain.c: (g_get_current_time) don't cast to timeval since + timeval is for some reason not always a struct of longs, weird + +Tue Dec 22 10:32:11 1998 Tim Janik + + * ghook.c (g_hook_first_valid): fixed buglet that could cause bogus + warnings. + +Mon Dec 21 21:48:29 1998 Tim Janik + + * glib.h: + * gmain.c: there was a reference count race for hooks during invocation + loops. since all (known) hook loop implementations, do currently start + out with g_hook_first_valid() and iterate with g_hook_next_valid(), + g_hook_first_valid() will now return a referenced hook, and + g_hook_next_valid() will "eat" that, and eventually transfer it to + the next hook. unfortunately this requires g_hook_next_valid() + to take the hook_list as additional argument. + + * gmain.c (g_main_iterate): adjusted callers of g_hook_next_valid(). + +Mon Dec 21 03:48:04 1998 Tim Janik + + * gmain.c (g_main_iterate): default initialize source_timeout with -1 + so we have a sane timeout value if (*prpare) doesn't set it. + +Sat Dec 19 16:56:02 1998 Owen Taylor + + * glib.h gmain.c (G_PRIORITY_LOW): Add #defines defining + scale of priorities. + +Sat Dec 19 16:56:02 1998 Owen Taylor + + * gmain.c (g_main_poll): Allocate space for pollfd's + _after_ adding poll wake-up-pipe record. + + * gmain.c (g_main_add_poll): Changed name + of internal function g_main_add_poll_unlocked() + back from the non-sensical g_main_add_unlocking_poll(). + +Sat Dec 19 06:25:55 1998 Tim Janik + + * glib.m4: fixed a minor bug that would let configures bail out + if the MODULES argument contained newlines. + + * acglib.m4: new file to be included by configure.in. it holds + special GLIB_ autoconfiguration macros, eventually some of the + easier ones should be moved into glib.m4, e.g. GLIB_IF_VAR_EQ, + GLIB_STR_CONTAINS or GLIB_ADD_TO_VAR. + +Sat Dec 19 04:27:17 1998 Tim Janik + + * fixed up sys/poll.h and sys/types.h inclusions. + +Sat Dec 19 03:10:50 1998 Tim Janik + + * fixed up gthread includes, cleaned up glibconfig.h a little bit. + +Fri Dec 18 12:51:39 1998 Owen Taylor + + * gmain.c: Fix errors in computation of timeout + expiration times > 1sec. + +1998-12-18 Sebastian Wilhelmi + + * configure.in (have_threads): Changed the last pthread_cond_init + to pthread_attr_init. + +Fri Dec 18 00:03:17 1998 Tim Janik + + * glib.h: + * gmain.c: + (g_main_is_running): new function to check whether a main loop has been + quitted. + (g_main_new): added a gboolean argument to determine whether the loop + should be considered initially running or not. however, g_main_run () + will still reset the main loops running state to TRUE upon initial + entrance. + + * gmain.c: + (g_main_iterate): documented this function's purpose in 5 steps. + for step 2), flag sources as G_SOURCE_READY even if !dispatch and + check G_SOURCE_READY prior to (*prepare), so we don't call (*prepare) + on them multiple times. + +Thu Dec 17 23:43:47 1998 Tim Janik + + * gmain.c (g_main_add_poll): reordered arguments, so GPollFD* comes + first, (sorry Snorfle, i should have let you know in the first + place). + (g_main_dispatch): stack G_HOOK_FLAG_IN_CALL flags. call source's + destructor when destroying a source. + +1998-12-17 Sebastian Wilhelmi + + * garray.c (g_ptr_array_remove_index): Fixed size in g_memmove, + reported by Alexander Larsson . + + * gmem.c: Fixed bug, that made compile fail for -DENABLE_MEM_PROFILE. + +Wed Dec 16 23:04:26 CST 1998 Shawn T. Amundson + + * Released GLib 1.1.9 + + * INSTALL: + NEWS: + README: + configure.in: + glib.spec: + docs/glib-config.1: version=1.1.9 + +Wed Dec 16 22:32:13 CST 1998 Shawn T. Amundson + + * glib.h: + giounix.c: s/g_main_poll_add/g_main_remove_add/g + s/g_main_poll_remove/g_main_remove_poll/g + s/g_main_poll_add_unlocking/g_main_add_unlocking_poll/g + (from Tim Janik) + +Wed Dec 16 20:04:10 PST 1998 Manish Singh + + * configure.in: check for pthread_attr_init in all cases, du4 + needs this since most of the other functions are just #defines + +Thu Dec 17 04:10:49 1998 Tim Janik + + * glib.h (G_LOCK_DECLARE_*): if !G_THREADS_ENABLED, eat the + trailing semicolon with a bogus function declaration, instead + of with a bogus variable declarations, so we avoid unused + variable warnings. + +Wed Dec 16 07:49:16 PST 1998 Shawn T. Amundson + + * Released GLib 1.1.8 (CVS tag is GLIB_1_1_8a) + +1998-12-16 Sebastian Wilhelmi + + * giounix.c (g_io_channel_unix_get_fd): Fixed small bug. + +1998-12-16 Joel Becker + + * glib.h, gscanner.c: changed func_data to user_data in + g_scanner_scope_symbol_foreach and associated friends, because + AIX headers #define func_data. + +1998-12-16 Sebastian Wilhelmi + + * configure.in: Fixed stupid bug, that made + g_static_mutex_lock(*mutex) not work as expected. + + * docs/glib-config.1: Updated to reflect the existence of gthread. + + * gmain.c (g_main_poll_add_unlocking): Changed + g_main_poll_add_unlocked to g_main_poll_add_unlocking to match + semantic, (indeed, main_loop must be locked, when calling this + function). Removed the unlocking from the end of that function, as + that is not right. Made a 'HOLDS' comment above the function. + +Wed Dec 16 03:16:58 1998 Tim Janik + + * configure.in: version bump to 1.1.8, binary age 0, interface age 0. + + * glib.h: changed g_lock() to G_LOCK(), g_unlock() to G_UNLOCK() and + g_trylock() to G_TRYLOCK(), since these are macros that expand to + nothing with --disable-threads. + changed G_LOCK_DEFINE() to G_LOCK_DECLARE() and introduced + G_LOCK_DECLARE_STATIC() to achive the results of static G_LOCK_DECLARE(). + changed semantics of g_thread_supported to g_thread_supported() so it + can be used as a function like g_module_supported(). the actuall + definition is still a macro that expands into a variable for + performance reasons though. + various indentation and coding style cleanups. + + * configure.in: added --enable-threads that defaults to yes. + + * gmutex.c: changed tests g_thread_supported to g_thread_supported (), + changed variable settings of g_thread_supported + to g_threads_got_initialized. + + garray.c: + gcache.c: + gdataset.c: + gdate.c: + ghash.c: + glist.c: + gmain.c: + gnode.c: + gslist.c: + gstring.c: + gtree.c: + gutils.c: + changed s/g_lock/G_LOCK/, s/g_unlock/G_UNLOCK/, + s/static G_LOCK_DEFINE/G_LOCK_DECLARE_STATIC/. + +Tue Dec 15 23:16:05 CST 1998 Shawn T. Amundson + + * INSTALL: + NEWS: + README + configure.in: + glib.spec: + docs/glib-config.1: Incremented version + +Wed Dec 16 22:29:48 1998 Joel Becker + + * configure.in: fixed the AIX thread checking. + Just an error on the wildcard. BTW, -D_THREAD_SAFE + is correct for AIX. + +Wed Dec 16 02:02:48 1998 Tim Janik + + * glib-config.in (lib_glib): fixed library and flag ordering for + --libs + +Tue Dec 15 17:17:46 1998 Owen Taylor + + * glib.h giounix.c giochannel.c: Use an "inheritance" + scheme for IO channel memory allocation.h + +1998-12-15 Havoc Pennington + + * gdate.c (g_date_prepare_to_parse): Solaris has a broken strftime + that produced garbage output for the test date I was using to + set up the parser. So use a different date that Solaris seems + to like. + +1998-12-15 Sebastian Wilhelmi + + * configure.in: Dont complain, if --without-threads or + --with-threads=none is supplied; Test for pthread_attr_init + instead of pthread_cond_init, if threads seems to be supported by + standard glib. (CFLAGS): Use G_THREAD_CFLAGS for compiling of glib + as well. + + * glib.h, gmutex.c: Changed private to private_key to avoid + problems when compiling with under C++. + +1998-12-15 Jeff Garzik + + * configure.in: + bugfixes, correctly support --without-threads and friends + + * gthread/testgthread.c: corrected 64-bitness problem + +Tue Dec 15 10:40:09 1998 Owen Taylor + + * gnode.c glist.c gslist.c: Make sure all + calls to g_node_validate_allocator are within + current_allocator lock, so we have consistency + on that point. (Should not really matter, + but this way we match the comments) + + * glist.c (g_list_free_1): Removed some lines + that should never have been committed. (For + debugging) + +1998-12-11 Sebastian Wilhelmi + + * gthread/gthread-nspr.c, configure.in: Added new default thread + implementation on top of the mozilla nspr library. + + * gmem.c, gmessaged.c, gthread/gthread.c, gthread/gthread-*.c: + Changed GStaticMutex and GStaticPrivate in gmem.c and gmessages.c + into GMutex and GPrivate resp. to make error reporting and use of + gmem possible in most (not all, though) gthread functions. Also + initialized the modules via new init functions. + + * configure.in: Fixed syntax bug in definition of type + GStaticMutex. + + * gthread/testgthread.c: Updated to work with nspr, but see note + there for remaining problems. + +1998-12-10 Sebastian Wilhelmi + + * gmutex.c, glib.h: Now abort, if a mutex/cond/private is + allocated before the thread system is set up. + + * gthread/gthread.c (g_thread_init): Removed g_thread_try_init(), + as it is not necessary. Changed the error message. Corrected logic + for g_thread_use_default_impl. + + * gmutex.c (g_mutex_init): Keep the thread private data array + after calling g_thread_init(). + +1998-12-09 Sebastian Wilhelmi + + * gthread/testgthread.c (new_thread): Now also working for posix + threads; (wait_thread): Now a better implementation, that does not + use 100% CPU. + + * Made the thread related code follow GNU coding standard. + + * Made a comment (HOLDS:) above each function, that expects the + given locks to be held. + + * Changed try_lock to trylock throughout. + + * glib.c: Eventually removed the #if 0'ed code for old GStaticMutex. + + * glib.c: Corrected g_trylock macro for G_DEBUG_LOCKS. + + * gmain.c (g_main_poll_add_unlocked): first take a new poll record + form the poll_free_list. + + * gmem.c, gstrfuncs.c, gutils.c: Made it MT safe. + + * gthraed/*.c: Added copyright headers. + + * gthread/gthread-solaris.c: do not use g_log for errors, as g_log + uses these module and endless recursions might happen, just use a + plain fprintf(stderr,...). + + * gthread/gthread.c (g_thread_try_init): Call g_mutex_init(). + + * gthread/testgthread.c: updated test program. + +Tue Dec 8 18:49:56 1998 Owen Taylor + + * Start at adding thread-safety. (mostly work + of Sebastian Wilhelmi ) + + - configure.in now looks for a system thread implementation. + Currently support is included for POSIX threads + and Solaris threads. The default support is built + into a separate library -lgthread. + + - The thread implementation can be modified by passing + a vector of functions g_thread_init(). + + - The default or supplied functions are used to + implement a small set of thread functions for + mutexes, condition variables, and thread-private + data. + + - GLib now uses these functions to provide thread + safety. (In the sense that all global static + data is locked... individual structures must still + be locked by the caller.) + +Sat Dec 12 19:08:59 1998 Tim Janik + + * configure.in: always define G_HAVE_INLINE if __cplusplus is + defined, reported by Wan-Teh Chang . + +Thu Dec 10 21:49:39 CST 1998 Shawn T. Amundson + + * Released GLib 1.1.7 + + * INSTALL: + NEWS: + README: + configure.in: + glib.spec: + docs/glib-config.1: Increased version to 1.1.7 + +Wed Dec 9 22:44:44 EST 1998 Joel Becker + + * Removed #define of G_COMPILED_WITH_DEBUGGING from glibconfig.h + It shouldn't be there, and it was causing a double #define. + (config.h defines it also) + +Tue Dec 8 12:18:38 CST 1998 Shawn T. Amundson + + * Released GLib 1.1.6 + + * NEWS: updated + +Mon Dec 7 23:10:41 PST 1998 Manish Singh + + * gmain.c: fixes to #undef HAVE_POLL case + +1998-12-02 Havoc Pennington + + * gdate.c (g_date_set_month): If Julian is valid, we have to + update the dmy representation before setting the components + of it. + (g_date_set_day): Same. + (g_date_set_year): Same. + +1998-12-02 Havoc Pennington + + * testgdate.c, testgdateparser.c: Two new files. This is kind of + ugly code, but I want to go ahead and make the tests available. + It isn't contaminating any other code. :-) Since one of these + is interactive and the other takes a while to run, I've kept + them separate from testglib for now. + * Makefile.am: Build gdate test programs. + +1998-12-02 Havoc Pennington + + * gdate.c (g_date_valid): Rely on GDate::dmy and GDate::Julian + flags, rather than re-checking the validity of the actual + values. This should be the correct behavior, the old way was + leftover cruft. + + * glib.h, gdate.c: Changed MDY to DMY throughout. + +Sat Nov 28 12:53:47 1998 Owen Taylor + + * Makefile.am configure.in acconfig.h giochannel.c + glib.h glist.c gmain.c gutils.c: + + - Revised GIOChannel to provide a generic virtual-function + based interface. + - Added unix fd-based GIOChannel's + - Added generic main-loop abstraction + - Added timeouts and idle functions using main-loop abstraction. + +1998-12-02 Sebastian Wilhelmi + + * glib.h: + * gdate.c: changed `gpointer struct_tm_p' parameter of + g_date_to_struct_tm back to `struct tm *tm' and forward declared + `struct tm' in glib.h; yes, this is nice, we still need not + include time.h. + +Tue Dec 1 23:01:44 CST 1998 Shawn T. Amundson + + * INSTALL: + NEWS: + README: + glib.spec: + docs/glib-config.1: Incremented versions to 1.1.6. + +Wed Dec 2 02:10:59 1998 Tim Janik + + * gdate.c: s/time_t/GTime/ and s/g_print/g_message/ + include time.h. + + * glib.h: removed #include , changed time_t paramter of + g_date_set_time() to time_t, changed struct tm parameter of + g_date_to_struct_tm to `gpointer struct_tm_p'. yes, this is not + nice, but including time.h actually breaks a bunch of code. + + * incremented GLib version to 1.1.6. + +1998-11-30 Havoc Pennington + + * gdate.c: New file, implements calendrical calculations. + + * glib.h: Added declarations for GDate module. + +Mon Nov 30 07:12:10 1998 Tim Janik + + * glib.h: + * ghook.c: added g_hook_list_marshal_check() to eventually destroy + hooks after they got marshalled. + +Sun Nov 29 17:31:43 EST 1998 Jeff Garzik + + * configure.in, Makefile.am, gmodule/Makefile.am: + Put -DFOO stuff into Makefile.am INCLUDES. + +Sun Nov 29 14:17:09 PST 1998 Manish Singh + + * configure.in: put debug -DFOO stuff into CPPFLAGS, not CFLAGS, + so CFLAGS can be overridden at make time properly + +Sat Nov 28 01:23:25 1998 Tim Janik + + * ghash.c: implemented incremental freezing facility. + +Thu Nov 26 01:36:20 1998 Tim Janik + + * glib.h: + * ghash.c: reverted the g_hash_table_set_key_freefunc() addition, + since it's to specialized and needs to be resolved in a generic + fashion. + +Tue Nov 24 18:57:59 PST 1998 Manish Singh + + * applied glib-tml-981120-0, change log appended below. + + * glibconfig.h.win32: passthrough 64-bit constants unchanged, VC++ + infers them + +Fri Nov 20 22:26:43 1998 Tor Lillqvist + + * glib.h: Moved MSC pragmas from glib.h to glibconfig.h.win32. + peer_offset field in WIN32 part of GIOChannel removed, need_wakeups + added. Added "extern" to __declspec(dllimport). + + * gutils.c: Initialise need_wakeups. + + * glibconfig.h.win32: Pragmas moved here. Define G_GINT64_CONSTANT. + + * gmodule/gmodule.def: Added g_module_build_path. + + * gscanner.c: (g_scanner_cur_value) Move initailisation of v + to before its use. + + * glib.def: Added g_(s)list_sort. + + * makefile.msc: A few more comments. + +Tue Nov 24 14:05:47 EST 1998 Michael K. Johnson + + * glib.h: added GFreeFunc and g_hash_table_set_key_freefunc() + prototype. + * ghash.c: added g_hash_table_set_key_freefunc() implementation. + Modified the prototypes of the functions g_hash_node_destroy() and + g_hash_nodes_destroy(), and changed the functions that call them + to match the new definitions. + This changes no external interfaces, and should create no binary + or source incompatibilities. It does add a member to the + GHashTable structure. + +Tue Nov 24 09:40:00 1998 Tim Janik + + * glib.h: removed the GListAllocator type and its g_*_allocator_*() + function variants (which weren't working anyways) in favour of a + generic GAllocator type. new functions: + g_allocator_new, g_allocator_free, g_slist_push_allocator, + g_slist_pop_allocator, g_list_push_allocator, g_list_pop_allocator, + g_node_push_allocator and g_node_pop_allocator. + + * gstring.c: removed bogus slist allocator code. + * gtree.c: maintain own list of free tree nodes and don't waste + GSLists for that, removed bogus slist allocator code. + * glist.c: use GAllocators for node allocation. + * gslist.c: use GAllocators for node allocation. + * gnode.c: use GAllocators for node allocation. + + * gdataset.c: cleanups wrt automatic initialization. + +Mon Nov 23 10:03:58 1998 Owen Taylor + + * glib.h garray.[ch]: added g_array_insert_vals() to + insert elements at an arbitrary index, and + g_array_insert_val() macro. + +Sun Nov 22 17:07:03 1998 Tim Janik + + * glib.h: + * gslist.c: new function g_slist_copy() to duplicate a list with all its + data pointers. + * glist.c: new function g_list_copy. + +Sat Nov 21 14:57:39 CST 1998 Shawn T. Amundson + + * INSTALL: + NEWS: + README: + configure.in: + glib.spec: Updated to version 1.1.5 + + * Released GLib 1.1.5 + +Wed Nov 18 1998 Elliot Lee + + * gdataset.c: There was a code path into g_data_set_internal + through a function (g_datalist_id_set_full). Neither function + checked for g_dataset_init having been run, but + g_data_set_internal used the memchunk. I added + a check into g_data_set_internal so it will do the + initialization if needed. (There's probably a better way.) + +Mon Nov 16 07:48:06 1998 Tim Janik + + * glib.h (g_bit_nth_msf): fixed off-by-one error, so we don't waste + a loop iteration if (-1) was passed, reported by Andreas Bombe + . + +Fri Nov 13 15:17:34 1998 Owen Taylor + + * glist.c gslist.c glib.h: Added g_list_sort() and + g_slist_sort() to merge sort GLists and GSLists. + Submitted by Sven Over + over a year ago! + + * testglib.c: Test the new sort functions. + +Wed Nov 11 23:23:22 EST 1998 Jeff Garzik + + * Makefile.am : INCLUDES is the right way to add to CFLAGS, not + DEFS. Also there are bugs with '+=' in makefiles. + Got rid of DEFS line by moving G_LOG_DOMAIN setting into INCLUDES. + Removed redundant -I from INCLUDES. + +Wed Nov 11 18:11:24 EST 1998 Gregory McLean + + * docs/*.sgml : Batch of new documentation that should be easier + to maintain and extend. Plus generate whatever sort of doc file + you would like. I didn't change the Makefile stuff as I'm not sure + what default doc type people want. Oh and this is all DocBook format. + Enjoy! + +Tue Nov 10 17:12:45 PST 1998 Manish Singh + + * configure.in: use __extension__ for long long on gcc >= 2.8 and + egcs, and provide a G_GINT64_CONSTANT wrapper so -ansi -pedantic + compiles clean. + + * glib.h: make the endian x86 asm __const__ so the compiler can do + better optimizations. Also remove the cc clobber, these shouldn't + be changing condition codes. Ditch some redundant casts. Add an + optimization for 64-bit endian conversions in x86. Use constant + wrapper for the generic method. + + * testglib.c: use constant wrappers for 64-bit constants + +1998-11-04 Phil Schwan + + * configure.in: Added 'strncasecmp' to the list of functions to be + searched for. + * glib.h: Added a prototype for 'g_strncasecmp' + * gstrfuncs.c: (g_strncasecmp) new function modeled closely after + 'g_strcasecmp' + +Wed Nov 4 15:06:44 PST 1998 Manish Singh + + * config.h.win32 (new file) + * glibconfig.h.win32 + * glib.def + * makefile.msc: applied glib-tml-981104, win32 sync + +1998-11-03 Sebastian Wilhelmi + + * glib.h: + * garray.c: + (g_array_remove_index): new function for removing an entry from an + array while preserving the order + (g_array_remove_index_fast): new function for removing an entry + from an array. the order might be distorted + (g_ptr_array_remove_index_fast, g_ptr_array_remove_fast): new + functions; working similiar to the above. (they have the semantic + of the old g_ptr_array_remove[_index] functions) + (g_ptr_array_remove_index, g_ptr_array_remove): new semantic. now + the order of the elements in the array is not changed + (g_byte_array_remove_index, g_byte_array_remove_index_fast): new + functions; byte_array wrapper for g_array_remove_index[_fast] + +Sun Nov 1 23:00:18 PST 1998 Manish Singh + + * glib.h + * configure.in: endian macros defined using the glibconfig.h + mechanism now + + * ghook.c: casts for GHookFunc and GHookCheckFunc to avoid warnings + +Sat Oct 31 20:14:22 PST 1998 Manish Singh + + * applied glib-tml-981101-1 patch from Tor Lillqvist (ChangeLog + entry appended below) + + * testglib.c + * gstrfuncs.c + * glib.h: use G_HAVE_GINT64, since HAVE_GINT64 is gone + + * gmessages.c + * gscanner.c: #include in here too, for HAVE_UNISTD_H + +1998-11-01 Tor Lillqvist + + * glib.def: Added the new functions. + + * gutils.c: + (g_getenv): Better implementation on Win32. No loop necessary. + (g_get_any_init): Use P_tmpdir if defined as tmp directory. Don't + set home dir always to NULL on Win32. Don't use tmp directory as + last resort home directory, but return NULL if no home + directory is known (application must check). + + * makefile.msc: Better touch command, just COPYing a single file + sets the timestamp from that file, which isn't what touching should + do. + +1998-10-31 Raja R Harinath + + Land glib-rrh-19981025-0.patch. + * Makefile.am (glibconfig.h): New rule. + (stamp-gc-h): New rule. Generate `glibconfig.h'. + * configure.in (AM_CONFIG_HEADER): It is now `config.h'. + (HAVE_BROKEN_WCTYPE): On Solaris, look for iswalnum in -lw before + concluding "broken wctype". + (glibconfig.h): Use AC_OUTPUT_COMMANDS to put generation code into + config.status. + * glib.h: Remove a lot of tests and defines. All these have been + moved to `configure.in (glibconfig.h)'. + * gerror.c: Include . + * gmem.c: Likewise. + * gstrfuncs.c: Likewise. + * gutils.c: Likewise. + +Sat Oct 31 05:08:26 1998 Tim Janik + + * glib.h: removed old G_ENUM(), G_FLAGS(), G_NV() and G_SV() macros. + added macros G_STRUCT_OFFSET(), G_STRUCT_MEMBER_P() and + G_STRUCT_MEMBER() for handling structure fields through their offsets. + (struct _GHookList): added a hook_free function member, that can be used + to free additional fields in derived hook structures. + g_hook_free(): if hook_list->hook_free != NULL, call this function prior + to freeing the hook. (this functionality should have been there in the + first place, it just got forgotten as an implementation detail). + +Wed Oct 28 00:49:32 PST 1998 Manish Singh + + * glib.h: G_BREAKPOINT for alpha from Robert Wilhelm + + +Tue Oct 27 07:25:53 1998 Tim Janik + + * glib.h: + * gscanner.c: + (g_scanner_sync_file_offset): new function for file input. + rewind the filedescriptor to the current buffer position and blow + the file read ahead buffer. usefull for third party uses of our + filedescriptor, which hooks onto the current scanning position. + (this became neccessary with the implementation of buffered + reads). + (g_scanner_input_file): + (g_scanner_input_text): automatically blow the read ahead buffer. + (g_scanner_get_char): blow the read ahead buffer when the end of + input is reached, i.e. a '\000' char is read. + +Tue Oct 27 00:27:31 PST 1998 Manish Singh + + * glib.h: get rid of duplicate #g_htonl and friends in the + NATIVE_WIN32 part + +Mon Oct 26 22:42:01 PST 1998 Manish Singh + + * glibconfig.h.win32 + * gutils.c + * makefile.msc: win32 patch from Tor Lillqvist (glib-tml-981027-0), + fixes some minor win32 buglets + +Mon Oct 26 22:12:03 PST 1998 Manish Singh + + * glib.h: reimplemented the endian stuff, using inline asm + for x86. #define g_htonl and friends. + + * testglib.c: new tests for the endian stuff + + * configure.in: care for AIX in gmodule linker flags test (from + Joel Becker ). Check $host_os for linux + instead of existance of /usr/include/linux + + * gutils.c: buh-bye evil warning. Thou hast been #ifdef'd out + of thine existance! + +Tue Oct 27 03:00:50 1998 Tim Janik + + * glib.h: removed dummy structure definitions for struct _GCache, + _GTree, _GTimer, _GMemChunk, _GListAllocator and _GStringChunk. + + * gutils.c: implement glib's inline functions _after_ all include + statements have been processed. + removed Tor's MAXPATHLEN check since there already was one supplied + further down in this file. + (LibMain): special cased the #ifdef __LCC__ case for NATIVE_WIN32, + since lcc maybe used on other platforms as well. why in hell is this + stuff required? + (g_get_any_init): for windows, if the user name is supplied, use it as + realname also. + in general, if there is no homedir specified, use the tmpdir that + we already figured. + + * gtimer.c (g_timer_elapsed): changed a g_assert() statement to + g_return_if_fail(). + + * applied glib-tml-981020-0.patch for WIN32 portability, added some + comments and g_return_if_fail() statements, minor indentation fixes. + ChangeLog entry from Tor Lillqvist is appended. + + * glib.h (struct dirent): use lower case structure members. + + * glib.h: + * makefile.lcc: + * makefile.msc: + s/COMPILING_GLIB/GLIB_COMPILATION/ + +1998-10-20: Tor Lillqvist + + * README.win32 glib.def gmodule.def + * glibconfig.h.win32 gmodule/gmoduleconf.h.win32: + New files for the Windows port. The .def files list exported + symbols for the Microsoft linker and compatibles. + + * configure.in: + Added checks for some platform-dependent headers: pwd.h sys/param.h + sys/select.h sys/time.h sys/times.h unistd.h, and the function lstat. + + * gerror.c: + Conditionalized inclusion of system-dependent headers. Changes + for Windows: no gdb to do a stack trace. Just call abort(). + + * glib.h: + Changes for Windows: + + Added macros G_DIR_SEPARATOR, G_DIR_SEPARATOR_S for + platform-dependent file name syntax elements. Added macros + G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S for + platform-dependent search path syntax conventions. + + Added pragmas for Microsoft C to make it more pedantic. + + Marked GLib's global variables for export from DLL. + + Added the function g_strescape that escapes backslashes. + + Added functions g_path_is_absolute and g_path_skip_root to + handle platform-dependent file name syntax. + + Added the function g_getenv that expands environment variables + that contain references to other environment variables, as is + typical on Windows NT. + + Added the GIOChannel structure which is used to encapsulate the + IPC mechanism used by the GIMP's plug-ins, and possibly other + things later. On Unix a GIOChannel encapsulates just a file + descriptor. On Windows it contains a file handle from _pipe() and a + few other things related to the implementation of gdk_input_add + and GIMP plug-in communication. Subject to change. + + Removed duplicate declarations of the version variables. + + For the Microsoft compiler, declare own implementation of + ftruncate and the functions. + + * gmem.c: + Define a symbolic name for the profiling table size. + + * gmessages.c: + Conditionalized inclusion of unistd.h. On Windows, output using + stdio to stdout. + + * gscanner.c: + Conditionalized inclusion of unistd.h. Added changes for + Microsoft C. Added CR to the skipped character set. Added small + workaround for MSC compiler bug in g_scanner_cur_value. + + * gstrfuncs.c: + Added the function g_strescape, which escapes the backslash + character. Needed especially when printing Windows filenames. + + * gtimer.c: + Conditionalized inclusion of unistd.h and sys/time.h. Added + implementations for Windows. + + * gutils.c: + Conditionalized inclusion of platform-dependent headers. Use + the platform-independent file name syntax macros. + Conditionalize code on platform-dependent features. Added the + functions g_path_is_absolute g_path_skip_root and g_getenv. + Added the GIOChannel-related functions. Added + compiler-dependent Unix compatibility functions for Windows. + + * makefile.lcc makefile.msc: + New files. Compiler-specific makefiles for LCC-Win32 and + Microsoft C. Only Microsoft C is actually supported currently. + + * testglib.c: + Added pathname check cases for Windows. Added workaround for + bug in the Microsoft runtime library. Improved some tests a bit. + +Sun Oct 25 01:24:01 CST 1998 Shawn T. Amundson + + * Released GLib 1.1.4 + + * docs/Makefile.am: + * docs/.cvsignore + * docs/glib-config.1: + * docs/glib.texi: Moved docs from gtk and created glib-config.1 + from gtk-config.1 in gtk + + * configure.in: + * Makefile.am: + * sanity_check: added in docs directory, change rule 'release' + to 'snapshot' and created a new 'release' rule for doing the + distribution. Added in a 'sanity' rule. + + * NEWS: + * README: + * INSTALL: Updated for the release + +Sun Oct 25 07:30:10 1998 Tim Janik + + * gscanner.c: + (g_scanner_peek_next_char): + (g_scanner_get_char): no more characters are available if read() returns + anything less than 1, not only on 0 return. + + * glib.h: + * gstrfuncs.c: final API cleanup of string arrays to suit sopwith's + argument order requirements. + (g_strsplit): renamed from g_str_array_split(). + (g_strjoinv): renamed from g_str_array_joinv(), string array is + now passed as last parameter. removed `const' qualifier from string + array pointer (again). + (g_strjoin): new function from sopwith to concatenate strings with + an additional seperator. + (g_strfreev): renamed from g_str_array_free. + +Sat Oct 24 22:23:04 PDT 1998 Manish Singh + + * gnode.c: small fix to g_node_children_foreach to make it work right. + From Paco Moya + +Wed Oct 21 19:22:58 1998 Tim Janik + + * configure.in (G_MODULE_HAVE_DLERROR): reverted part of the changes + from Sebastian Wilhelmi (1998-10-20). don't specify a specific loading + behaviour (i.e. RTLD_NOW) when we are not sure whether it is supplied. + changed the return value from (!f2 && f1) to (!f2 || f1) so we default + to not needing an underscore. reverted the extra plugin.c building, + because .lo files are not ELF libraries, this can't work. This needs + further investigation on Solaris... + +Wed Oct 21 17:03:05 1998 Tim Janik + + * glib.h: + * gstrfuncs.c: API cleanups of the new g_str* functions for consistency + with the existing naming scheme for g_str* functions. grouped the g_str* + functions that will return a newly allocated string seperatedly. all of + the in_place arguments were skipped, the caller is supposed to pass a + g_strdup()ed string if he wants to retrive a new copy. indentation and + coding style fixups. added some g_return_if_fail() statements. + string array functions are prefixed with g_str_array_. + (g_strdelimit): return the modified string like all other g_str* + functions, that operate in place. + (g_strchug): renamed from g_str_chug(), removed in_place argument. + (g_strchomp): renamed from g_str_chomp(), removed in_place argument. + (g_strstrip): renamed from g_str_strip(), removed in_place argument. + (g_str_array_join): renamed from g_strconcatv(), since it actually + operates on a string array and has totaly different semantics from + g_strconcat(). check for separator != NULL, don't segfault if the first + string is NULL. removed the `const' from the string array that's passed, + so users can operate on gchar** string arrays. + (g_str_array_split): renamed from g_str_split() because we actually + produce a string array. reimplemented this function for efficiency. + removed macro aliases g_str_joinv and g_str_join. + +1998-10-20 Elliot Lee + + * glib.h, gstrfuncs.c: Move string join/split/free routines from + libgnome/gnome-string, rename, and add g_str_chug. + +1998-10-20 Sebastian Wilhelmi + + * configure.in: made the check for needed _ in module's func-names + work on solaris. (G_MODULE_NEED_USCORE must be set outside + AC_CACHE_VAL, dlopen(0,0) refused to work on solaris). + +Tue Oct 20 03:32:58 PDT 1998 Manish Singh + + * configure.in + * acconfig.h: added test for endianness + + * glib.h: #define endian macros for system and some conversions + between byte order + +Thu Oct 8 06:47:27 1998 Tim Janik + + * glib.h: + * gdataset.c: removed functions g_dataset_id_set_destroy and + g_datalist_id_set_destroy and macros g_dataset_set_destroy and + g_datalist_set_destroy. + added new functions g_dataset_id_remove_no_notify and + g_datalist_id_remove_no_notify plus associated macros + g_dataset_remove_no_notify and g_datalist_remove_no_notify, which + will remove a certain data portion without invocation of its destroy + notifier, this should only be used in very controled circumstances. + +Wed Oct 7 05:31:24 1998 Tim Janik + + * glib.h: + removed the #pragma } statement after extern "C" {. use + (c-set-offset 'inextern-lang 0) to fixup emacs cc-mode indentation. + + * glib.h: + * ghook.c: API and code cleanups. changed the G_HOOK_ACTIVE and + G_HOOK_IN_CALL enum vals to G_HOOK_FLAG_ACTIVE and G_HOOK_FLAG_IN_CALL. + changed the G_HOOK_IS_ACTIVE() and G_HOOK_IS_IN_CALL() macros to + G_HOOK_ACTIVE() and G_HOOK_IN_CALL(). + fixed the g_hook_find* functions, so they iterate over non-active + hooks as well. + (g_hook_first_valid): + (g_hook_next_valid): added an extra argument gboolean may_be_in_call, + which indicates whether G_HOOK_IN_CALL() hooks are considered valid + or not. these two functions are meant as iterators for the hook list + invocation, so they need to a) provide functionality to implement + may_recurse bahaviour and b) only walk active hooks. + +Tue Oct 6 14:29:47 1998 Tim Janik + + * gmem.c (g_malloc0): fixed memory offsett when ENABLE_MEM_CHECK is + defined and ENABLE_MEM_PROFILE is not (patch from Martin Pool + ). + +Sat Oct 3 01:18:10 1998 Tim Janik + + * glib.h: + * ghook.c: + (g_hook_list_invoke): + (g_hook_list_invoke): + (g_hook_list_marshal): properly handle the first valid hook to call, + it maybe IN_CALL already. + (g_hook_list_marshal): minor name change. + +Fri Oct 2 23:21:21 1998 Tim Janik + + * glib.h: + * ghook.c: renamed GHook.id to GHook.hook_id so we don't get troubles + with ObjC which reserves "id" as a keyword (Raja R Harinath + ). + +Wed Sep 30 10:53:03 1998 Tim Janik + + * Makefile.am: added ghook.c. + + * glib.h: + * ghook.c: generic callback maintenance functions. + + * glib.h: define G_GNUC_UNUSED. + +Fri Sep 25 00:04:37 1998 Tim Janik + + * configure.in: version bump to 1.1.4, binary age 0, interface age 0. + + * glib.h (struct _GScanner): dumped peeked_char and text_len in favour + of *text_end and *buffer for buffered read()s. + + * gscanner.c: changed peeking and retrival of next character so we + have buffered reads. fixed minor bug with number parsing error + reporting. made some static!!! variables local ones (why did we use + static temporary variables in the lowlevel tokenization code anyways?). + +Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson + + * Released GLib 1.1.3 + +Mon Sep 21 07:43:13 1998 Tim Janik + + * glib.h: added g_renew() which works as g_new() for g_realloc(). + +Mon Sep 21 02:22:12 1998 Tim Janik + + * NEWS file update for upcoming release of GLib + GModule + version 1.1.3, binary age 0, interface age 0. (GModule uses + the same version numbers as GLib.) + + * glib.h: swap the inclusion of of float.h and limits.h to work + around a egcs 1.1 oddity on Solaris 2.5.1 (fix provided by + Per Abrahamsen ). + + * glib.h: + * gscanner.c: renamed the GValue union to GTokenValue, this should + not affect source compatibility in most cases. + + * ghash.c: added some g_return_if_fail() statements. make + g_hash_table_lookup_node() an inline function so we save an extra + function invocation on lookups. + +Sun Sep 20 18:21:46 1998 Owen Taylor + + * ltmain.sh: Patch to libtool-1.2b to make --disable-static + work. + +Sun Sep 20 02:09:44 1998 Josh MacDonald + + * glib.h: New function g_hash_table_foreach_remove is similar to + g_hash_table_foreach, but the callback's return value indicates + whether to remove the element (if TRUE) or not (if FALSE). + Returns the number of elements deleted. + +Fri Sep 18 11:31:50 PDT 1998 Manish Singh + + * glib.h + * gstrfuncs.c: added g_memdup implementation + +Fri Sep 18 18:46:14 1998 Tim Janik + + * glib.h: + * gdataset.c: make the datalists a safe type (not using a generic + gpointer) by expecting a GData* argument in the g_datalist functions. + provide g_dataset_foreach() and g_datalist_foreach() functions that + allow a GDataForeachFunc function to walk the data lists. + (g_dataset_destroy_internal): made this function truely reentrant (i.e. + can be called from within destroy notifiers as well). + the *_foreach functions are _not_ reentrant (unless all the other + dataset and datalist functions). + +Fri Sep 18 03:41:20 1998 Tim Janik + + * gtree.c (g_tree_new): check for key_compare_func != NULL (reported + by Michal Kara). + +Thu Sep 17 18:55:46 PDT 1998 Manish Singh + + * config.h.in: removed from repository + + * install-sh + * missing + * mkinstalldirs: updated to latest automake version + +Thu Sep 17 06:36:25 1998 Tim Janik + + * glib.h: + * gdataset.c: implemented g_datalist_* along the lines of g_dataset, + but operates on an opaque gpointer *datalist; pointer, e.g. for the + implementation of GtkObject named data. + we cache a certain portion of the already freed data entries now, to + gain a slight performance improve with data reallocation. + +Tue Sep 15 14:57:30 1998 Owen Taylor + + * Makefile.am glib-config.in l*: Update to libtool-1.2b, + change library versioning scheme to drop LT_RELEASE + from the -l line, while keeping it in the soname. + +Fri Sep 11 02:11:46 1998 Tim Janik + + * glib.h: explicitely include the prototypes for inline functions + to cure gcc warnings for -Wmissing-prototypes. + +Wed Sep 9 02:52:04 PDT 1998 Manish Singh + + * configure.in: added -posix check for NeXTStep + +Tue Sep 8 05:04:06 1998 Tim Janik + + * glib.h: abandon the use of ATEXIT(), we keep the fallback + macros for backwards compatibility. people ought to use g_atexit(). + + * gutils.c (g_atexit): new function to take over the implementation + of ATEXIT. this function is guarranteed to succeed, similar to + g_malloc(). + +Mon Sep 7 20:07:38 PDT 1998 Manish Singh + + * configure.in: comment the -std1 check and save LIBS properly + +Mon Sep 7 07:53:21 1998 Tim Janik + + * configure.in: check for all three inline keywords individually. + + * glib.h: inlining hassle. for compilers that don't allow the `inline' + keyword, mostly because of strict ANSI C compliance or dumbness, we try + to fall back to either `__inline__' or `__inline'. + we define G_CAN_INLINE, if the compiler seems to be actually *capable* + to do function inlining, in which case inline function bodys do make + sense. we also define G_INLINE_FUNC to properly export the function + prototypes if no inlinig can be performed. we special case most of the + stuff, so inline functions can have a normal implementation by defining + G_INLINE_FUNC to extern and G_CAN_INLINE to 1. + + * ltconfig: (compiler PIC flag test): special case linux for non + aout systems to honour lcc's position independant code (cases + "linux*aout)" and "linux*)" got added). (this needs to go into + libtool which does an advanced test, checking for __LCC__). + + * autogen.sh: take $CC=lcc into account by invoking automake with + --include-deps so lcc isn't scared by gcc's auto-dependancy + generation code. care about $ACLOCAL_FLAGS. optionally feature + autoheader. + + * minor fixups in other places to cure some of lcc's warnings. + +Sun Sep 6 19:08:53 PDT 1998 Manish Singh + + * configure.in: added -std1 check for ANSI compliance (from gtk) + +Sun Sep 6 12:31:50 PDT 1998 Manish Singh + + * glib.h: provide proper ATEXIT behavior on NeXTStep by !atexit + +Sat Sep 5 18:03:36 1998 Tom Tromey + + * gutils.c (GLIB_INLINE): Define. + * glib.h (GLIB_INLINE): New define. + (g_bit_nth_msf): Use it. Also, add prototype. + (g_bit_storage): Likewise. + (g_bit_storage): Likewise. + +Sat Sep 5 04:40:02 1998 Tim Janik + + * glib.h: + (g_chunk_new0): use g_mem_chunk_alloc0() to allocate the memchunk, + so the correct size of the memchunk is allocated with 0's and not + a memory portion of the size of the desired type. + + * gmem.c: new function g_mem_chunk_alloc0() which will initialize + a memory area allocated with g_mem_chunk_alloc() with 0's. + +Wed Sep 2 19:13:28 1998 Owen Taylor + + * garray.c glib.h (g_array_[ap/pre]pend_vals): make + data argument const. + +Wed Aug 26 06:32:40 1998 Tim Janik + + * glib.h: + * gstrfuncs.c: new function g_strnfill() to return a new string + of specified length, filled with a specific character. + +Tue Sep 1 23:46:31 1998 Josh MacDonald + + * testglib.c (main): Update the array tests. Reduce the number of + iterations for the prepend test from 10000 to 100 since it is + O(n^2) and was taking longer than I would like to wait. + + * garray.c: I've worked on the GArray interface, mostly. It was + seriously broken before and I hate to do it, but this is going to + break some code. It is important to do this now, because more and + more people are starting to use glib and the interface was both + broken and inconsistent. First, rename the _truncate functions of + both the GArray and GPtrArray classes to _set_size, since this + function can also be used to extend the arrays. GArray now + accepts two more initialization arguments: clear and element_size. + Instead of providing the type to each access function, the array + now stores the element size. Clear, if set, causes the library to + zero element's memory as the array expands. The major broken-ness + here was that array->len was in bytes, not elements. Now, since + the array knows its element size, array->len is correct and I have + removed the g_array_length macro. The only macro which now + accepts the type as an argument is g_array_index, which casts the + element to the right type--this interface does not change. The + append and prepend functions simply need the types removed. + g_ptr_array_remove_index now returns the removed element. + + * gprimes.c (g_spaced_primes_closest): Move this function out of + ghash.c and rename it from g_hash_closest_prime. Fix the primes + so that they are actually prime (they weren't all -- isn't that + nice?). + +Mon Aug 24 02:08:56 1998 Tim Janik + + * glib.h: + * gstring.c: + * gstrfuncs.c: + (g_vsprintf): removed this function which was not publically + exported in glib.h. to export it, it should have been named + differently in the first place, since its semantics differ from + vsprintf(). apart from that, it was a possible cause for + problems since it worked on a previously allocated memory area and + was used in a lot places of glib. exporting it would have been a + guararant for problems with threaded programs. + (g_printf_string_upper_bound): exported this function to return + a string size, guarranteed to be big enough to hold the fully + expanded format+args string. added 'q', 'L' and 'll' flag handling. + in fact, the newly allocated area is in most cases much bigger than + required. + (g_strdup_vprintf()): new function returning a newly allocated string + containing the contents of *format and associated args (size is + calculated with g_printf_string_upper_bound()). + (g_strdup_printf): new function which wraps g_strdup_vprintf(). + + * configure.in: check for va_copy() or __va_copy() alternatively. + check whether va_lists can be copyied by value. + + * glib.h: provide a definition for G_VA_COPY. + + * glib.h: + * gmessages.c: + (g_logv): + (g_vsnprintf): + pass va_lists by value, not by reference, since this causes problems + on platforms that implement va_list as as arrays. internaly, use + G_VA_COPY (new_arg, org_arg); va_end (new_arg); to produce a second + va_list variable, if multiple passes are required. changed all + callers. + + * glib.h: + * gerror.h: + renamed g_debug() to g_on_error_query(), cleaned up a bit. + renamed g_stack_trace() to g_on_error_stack_trace() since both + functions cluttered different namespaces. + there is an appropriate comment in glib.h now that explains the + unix and gdb specific dependencies of both functions. + removed g_attach_process(). + g_on_error_stack_trace() should probably be handled with caution, + i've seem several different linux versions (2.0.x) become unstable + after invocation of this function. + +1998-08-18: Elliot Lee + + * In gmem.c, add the ability to exclude memory chunks from the + memory profiling information. + +Tue Aug 18 18:23:09 PDT 1998 Manish Singh + + * glib.h + * gstrfuncs.c: added g_strndup + +Tue Aug 18 04:40:17 1998 Tim Janik + + * glib.h: + * gmessages.c: new function g_log_set_always_fatal() to set an + additional fatal_mask for log levels that are considered to be fatal + globally (required by gtk). since this mask is not domain-associated, + it is restricted to the log levels, introduced by glib itself. + + * gmem.c: + * grel.c: + * gtree.c (g_tree_node_check): + don't use g_print() calls for informational/debugging output, + but log all this stuff through g_log() with G_LOG_LEVEL_INFO. + libraries shouldn't use printf(), g_print() or g_printerr() at all. + +Tue Aug 18 02:46:44 1998 Tim Janik + + + * glib.h (__STRICT_ANSI__): if __STRICT_ANSI__ is defined, make + `inline' a noop, since strict ANSI rules don't permit `inline'. + +Mon Aug 17 15:21:42 1998 Tim Janik + + * grel.c: made private functions static. + +Sun Aug 16 23:23:46 CDT 1998 Shawn T. Amundson + + * gmodule/Makefile.am: added gmodule-dl.c and gmodule-dld.c to + EXTRA_DIST + * glib.spec: version = 1.1.3 + +Mon Aug 17 01:46:14 1998 Tim Janik + + * glib.m4: feature an extra MODULES parameter, so glib-config can + be invoked with the "gmodule" argument. + + * glib.h: changed the log level to G_LOG_LEVEL_CRITICAL for all + g_return*_if_fail statements, and made them issue a message + like "assertion `%s' failed". + + * gmessages.c (g_logv): ugh, don't pass log_domain as NULL to + g_log_find_domain. + +Sun Aug 16 20:28:27 1998 Tim Janik + + * version bump to 1.1.3, binary age 0, interface age 0. + + * glib.h: be nice to platforms that don't have gint64 and don't + issue #warning on every compilation. since glib doesn't require + gint64 itself, packages that need gint64 should test for this + themselves. + + * glib.h: + * gutils.c: added a new function g_vsnprintf(). + +Sun Aug 16 Elliot Lee + + glib.h: #error out if we don't recognize the SIZEOF_VOID_P + #warning if no gint64 + +Fri Aug 14 16:41:53 1998 Tim Janik + + * glib.h: added static inline functions for bit mask tests: + g_bit_nth_lsf, g_bit_nth_msf and g_bit_storage. + +Fri Aug 13 14:23:37 1998 Tim Janik + + * glib.h: + * gmessages.c: + revised the message handling system, which is now based on a new + mechanism g_log*. most of the assertment macros got adapted to + feature the new g_log() call with an additional specification of + the log level in a preprocessor macro G_LOG_DOMAIN. if G_LOG_DOMAIN + is undefined upon the includion of glib.h, it'll be defined with a + value of (NULL) and thus preserves the original bahaviour for + warning and error messages. the message handler setting functions + for g_warning, g_error and g_message are only provided for backwards + compatibility and might get removed somewhen. + + * Makefile.am: feature the G_LOG_DOMAIN macro to set the log domain + to "GLib" upon compilation. we currently have to add this definition + to the DEFS variable. + * testglib.c: we need an ugly #undef G_LOG_DOMAIN at the start + of this file currently, since automake doesn't support per target + _CFLAGS yet. + + * glib.h: changed some gints to gbooleans, made a few const corrections, + removed some superfluous G_STMT_START{}G_STMT_END wrappers, added some + in other required places. + + * gnode.c: + (g_node_prepend): + (g_node_insert_before): + (g_node_insert): + (g_node_append_data): + (g_node_prepend_data): + (g_node_insert_data_before): + (g_node_insert_data): + (g_node_append): + return (node), so these macros/functions can be usefully chained with + g_node_new(). + +Mon Aug 10 17:56:11 PDT 1998 Manish Singh + + * glib.h: it's GTime now, and it's back! + +Mon Aug 10 02:17:19 1998 Tim Janik + + * Makefile.am: minor hack to cause SUBDIRS (gmodule) to be build + last. we do this by making all-recursive-am depend on all-am. + +Sun Aug 9 15:56:11 1998 Tim Janik + + * configure.in: added GModule checks. generate files in gmodule/. + * glib-config.in: support library specifications `glib' and `gmodule'. + * Makefile.am: feature the gmodule/ subdir. + +Wed Aug 5 10:04:29 PDT 1998 Shawn T. Amundson + + * Released GLib 1.1.2 + +Wed Aug 05 01:15:36 1998 George Lebl + + * testglib.c: fix 64-bitness in g_prints, sizeof doesn't + seem to return int so I cast it for printing, probably + just cosmetic + +Tue Aug 4 19:54:06 PDT 1998 Shawn T. Amundson + + * Released GLib 1.1.1 + +Tue Aug 4 15:17:54 1998 Tim Janik + + * configure.in: version bump to 1.1.1, binary age 1, interface age 0. + * NEWS: updates. + * README: updates. + * INSTALL: updates and fixes. + * COPYING: include the GNU LGPL, rather than shipping an empty file. + * AUTHORS: listed original authors here, and added people who made + significant improvements to glib. + + * glib.h: + * gutils.c: implement g_get_current_dir() which returns a newly + allocated string, instead of a g_getcwd() variant that operates + on a static buffer. + export glib_interface_age and glib_binary_age. + as a convenience, macro definitions have been added for + g_node_insert_data, g_node_insert_data_before, g_node_append_data and + g_node_prepend_data. + + * testglib.c: minor cleanups, print current dir. + +Mon Aug 3 16:02:26 1998 Tim Janik + + * glib.h: + * gnode.c: change order of gpointer data; field in struct _GNode to + be partly binary compatible with GList and GSList. + +1998-08-03 Sebastian Wilhelmi + + * garray.c (g_ptr_array_remove_index): bugfix: index check for + array has been wrong. + +Fri Jul 31 22:17:05 1998 Tim Janik + + * testglib.c (g_node_test): added a GNode test. + +Fri Jul 31 09:08:16 1998 Tim Janik + + * Makefile.am: compile gnode.c. + + * glib.h: + * gnode.c: added implementation of n-way trees. + + * gtree.c (g_tree_traverse): added a warning to the switch() statement + which says that G_LEVEL_ORDER is not implemented. + +Mon Jul 27 00:17:30 CDT 1998 Shawn T. Amundson + + * Released GLib 1.1.0 + +Mon Jul 27 01:02:27 1998 Tim Janik + + * glib.h: #if 0'ed out the GTime definition, until it is definitively + needed. #if 0'ed out the g_getcwd() version, because it is the wrong + implementation. + +Sat Jul 25 16:09:00 1998 Mark Crichton + + * glib.h: gtime changed to g_time. gtime is used in + /usr/include/time.h in NetBSD, causing multiple headaches. + If this isn't the right way of fixing it.... ;) + +Thu Jul 23 00:29:14 1998 Tim Janik + + * glib.h: + * gscanner.c: new functions to make a scanner scope sensitive wrt + symbol lookups. + g_scanner_scope_foreach_symbol, g_scanner_scope_lookup_symbol, + g_scanner_scope_remove_symbol, g_scanner_scope_add_symbol and + g_scanner_set_scope. + g_scanner_add_symbol, g_scanner_remove_symbol and + g_scanner_foreach_symbol are now aliases for scope 0. + +Mon Jul 20 23:05:34 1998 George Lebl + + * glib.h: typo fixed for alphas for gint64 + +Tue Jul 14 09:05:18 1998 Tim Janik + + * glib.h: + * gutils.c: new fuction g_dirname() which returns a newlly + allocated string. + +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + +Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko + + * glib.h: + * ghash.c: Renamed g_hash_table_lookup_full to + g_hash_table_lookup_extended to conform with naming conventions. + +Tue Jul 7 03:18:58 EEST 1998 Lauri Alanko + + * glib.h: + * ghash.c: Generic cleanup, added a function: + (g_hash_table_lookup_full): Return whether the lookup succeeded, + and also retrieve the key and value. This allows one to + distinguish between failed lookup and finding a NULL, and also + allows one to free a key in the hash. + +Mon Jul 6 10:12:05 PDT 1998 Manish Singh + + * ltconfig: fix for properly detecting shared lib support on + SunPro cc (taken from libtool 1.2.a) + +Sat Jul 4 13:38:52 PDT 1998 Manish Singh + + * glib.h: added g_array_length + +Tue Jun 30 11:58:25 1998 Tim Janik + + * gscanner.c (g_scanner_unexp_token): take symbol_2_token into + account. react on valid/invalid string pairs. + +Sat Jun 27 21:55:46 PDT 1998 Manish Singh + + * glib.m4: ftp.glib.org -> ftp.gtk.org, since glib.org isn't + ours. ;) + +Fri Jun 19 03:11:02 1998 Tim Janik + + * gdataset.c: removed g_dataset_try_key, g_dataset_force_id and + g_dataset_retrive_key in favour of GQuarks. + a GQuark is an numeric id wich is associated with a certain string. + (g_quark_try_string): try to get the quark associated with this string, + if the lookup failed return 0. + (g_quark_from_string): get the associated quark for a string, if there + isn't currently a GQuark associated with this string, then allocate a + new quark and return that. + (g_quark_from_static_string): like the above function, but the string + isn't strdup()ed to save memory. + (g_quark_to_string): get the string that is associated with a certain + GQuark. + + * gdataset.c (g_dataset_id_set_data_full): invoke the destroy function + _after_ the new data has been setup. + +Thu Jun 18 02:35:21 1998 Owen Taylor + + * glib.h: Changed messages for g_return_[val]_if_fail to + be somewhat more clear: assertion "blah" failed. + +1998-06-18 Federico Mena Quintero + + * testglib.c (main): Use GINT_TO_POINTER casts to remove compiler + warnings. + + * grel.c: #include + +Fri Jun 12 15:39:06 1998 Tim Janik + + * glib.h (GScanner): cleanups of the structure fields (binary + incompatible). + +Fri Jun 12 00:39:28 1998 Josh MacDonald + + * glib.h: add new hash and equal functions g_int_*. complement + g_direct_hash with g_direct_equal. + + * grel.c: new file, GRelations implement tuples of N-N mappings. + A comment in glib.h briefly describes the interface. + + * ghash.c: new function, g_hash_table_size + + * glib.h: new typedefs, gsize, gssize, gtime. + + * garray.c: new functions implementing a simplified GArray. This + GPtrArray is an array of gpointers and has functions to add and + remove elements, much like java.lang.Vector. + + * garray.c: new functions for the single-byte special case of + GArray. The functions g_byte_array* operate on arrays of bytes. + Internally, a GArray is used. + + * testglib.c: tests for g_ptr_array, g_byte_array, and g_relation... + +1998-06-11 Federico Mena Quintero + + * gdataset.c: #include + +Thu Jun 11 04:15:31 1998 Tim Janik + + * glib.h: + * gdataset.c: new function g_dataset_retrive_key. adjusted prealloc + sizes, to take up less space on initial allocation. + +1998-06-10 Raja R Harinath + + * acinclude.m4: New file. Contains `libtool.m4' from libtool-1.2, + the version from which glib's libtool forked. Needed for people + who use post-1.2 alphas of libtool. + * configure.in (enable_mem_check, enable_mem_profile): Replace + `echo -n' with AC_MSG_CHECKING. + (fd_set): Explain test for `fd_set' better. + +Wed Jun 10 19:29:51 1998 Owen Taylor + + * Makefile.am glib.m4 configure.in: + + Moved out from GTK+; added AM_PATH_GLIB macro. + +Wed Jun 10 12:56:07 1998 Owen Taylor + + * glib.h: renamed g_const_pointer => gconstpointer + +Tue Jun 9 17:47:33 1998 Owen Taylor + + * glib.h: Remove #error - HP/UX. + +Sat May 23 19:00:01 1998 Owen Taylor + [ Combination of: + gtk-rrh-980412-0.patch (Raja R Harinath ) + gtk-jbuhler-980516-0 (Jeremy Buhler ) ] + + * glib.h ghash.c gstring.c gdataset.c gutils.c: + - Added new typedef g_const_pointer; expunged all incorrect + uses of 'const gpointer'. + - Fixed up warnings that that created, + - Changed GHashFunc and GCompareFunc to take g_const_pointer + arguments. (Necessary, but will cause warnings in existing + code until fixed) + - Added other new const in harmless positions. + +Mon Jun 8 01:06:47 1998 Tim Janik + + * glib.h: added enum-helper macros for code generation. + added G_BREAKPOINT(). + +Sat Jun 6 14:09:22 PDT 1998 Manish Singh + + * gmem.c: commented out MEM_PROFILE and MEM_CHECK, causing weird + problems + +Wed Jun 3 06:19:42 1998 Tim Janik + + * glib.h (g_chunk_new0): convenience macro, for allocating small chunks + like g_chunk_new() with additional 0 initialization. + +Mon Jun 1 04:43:27 1998 Tim Janik + + * ghash.c (g_hash_table_insert): wrote a comment describing why + a hash node's key should not also get replaced when overriding + previous entries. + +Tue May 26 18:30:06 1998 Tim Janik + + * glib.h (g_string_sized_new): new function to controll the preallocated + size of a GString. + + * glib.h (g_strreversed): new function to reverse a string. + +Mon May 18 22:14:39 1998 Owen Taylor +(Yasuhiro SHIRASAKI : gtk-joke-980517-0.patch) + + * gutils.c: Restored a missing prototype for g_vsprintf. + +Wed May 20 05:02:26 1998 Tim Janik + + * glib.h: conditionally define NULL, FALSE and TRUE. + (g_mem_chunk_create): new convenience macro as a short hand for + g_mem_chunk_new(). + (g_chunk_free): new convenience macro to be consistent with g_chunk_new. + +Tue, 19 May 1998 09:00:02 +0200 Paolo Molaro + + * gcompletion.c: generic functions for completion... + +Sun May 17 10:48:27 1998 Tim Janik + + * gscanner.c (g_scanner_unexp_token): provide usefull default + specifications for identifier_spec and symbol_spec. + + * glib.h: new functions g_slist_nth_data and g_list_nth_data to return + the data of the nth element in the list. + +Fri May 15 22:31:49 1998 Tim Janik + + * gscanner.c (g_scanner_unexp_token): removed spurious va_end(args) + that for some reason didn't produce a compiler warning on my machine + (is va_end defined to nothing for i386?). + +Fri May 15 12:32:08 1998 rodo + + * gscanner.c: replaced some snprintf with g_snprintf + +Fri May 15 00:56:59 1998 Tim Janik + + * glib.h: further support for gcc function attributes: G_GNUC_FORMAT, + G_GNUC_NORETURN and G_GNUC_CONST. + + * gscanner.c (g_scanner_stat_mode): changed stat() to lstat(). + (g_scanner_msg_handler): "\n" at end of line! + (g_scanner_foreach_symbol): new function to iterate over the symbol + table (GScanner does value-wrapping). + +Thu May 14 04:14:12 1998 Tim Janik + + * glib.h: typedef gint gboolean; + this is needed to provide portability with big-endian platforms (e.g. + try sizeof(bool) for c++ on big-endians - it's 4). + this is also needed to maintain some_union.d_gint==some_union.d_gboolean. + plus, gint to gboolean casts and vice versa need to be possible without + loss. + +Tue May 12 19:22:58 1998 Owen Taylor + + * glib/glib.h: Added macros G[U]INT_TO_POINTER() and + GPOINTER_TO_[U]INT for storing small integers integers + inside pointers. + + * glib/testglib.c: Print sizeof() results + as g_print("%ld", (glong)sizeof(foo)), to deal with + size_t being long on Alpha's. + +Tue May 12 16:54:15 1998 Owen Taylor + (James A : gtk-jamesa-980511-4.patch) + + * glib.h gstring.c gmessages.c: Added some missing + const to arguments. + + * gutils.c (g_strsignal.c): Added missing return statements. + +Mon May 11 21:11:54 1998 Owen Taylor + + * gutils.c gmessages.c: Moved g_error, g_warning, g_message and + g_print from gutils.c to new file gmessages.c, to avoid having to + include in gutils.c which was causing problems for the + g_strsignal implementation on FreeBSD boxes. + +Mon May 11 09:53:43 1998 Tim Janik + + * configure.in: preserve automake CFLAGS. + + * Makefile.am: fully rename the created library to libglib-1.1.la. + this means we need to change certain portions of the Makefile.am on + major/minor version bumps. + + * ltmain.sh: the -release option is not required anymore. + + * glib.h: provide G_GNUC_FUNCTION and G_GNUC_PRETTY_FUNCTION to + avoid conditionals. unconditionally define NULL, TRUE, FALSE, MAX, + MIN, ABS and CLAMP, these macros might be screwed from other headers. + +Mon May 11 01:44:10 1998 Tim Janik + + * gdataset.c: new file, gdatasets implement the object data + mechanism from GtkObject. a generic data pointer is associated with + a certain location and a key id. + +Sat May 9 20:08:12 1998 Owen Taylor + + * glib/gmem.c: Experimentally restore GMemChunk + to its primeval state - where mem areas are + freed incrementally instead of searching the tree + every time a mem area is completely empty. Also, + always keep one mem chunk around. (Reduced calls + to malloc() a lot, but doesn't really improve + performance significiantly) + +Thu May 7 08:17:28 1998 Tim Janik + + * glib.h (G_GNUC_PRINTF): + (G_GNUC_SCANF): macros to facilitate the printf/scanf format argument + checking of gcc. + + * gstring.c: const corrections, string!=NULL checks at function entry. + (g_string_down): new function for tolower(3) conversion. + (g_string_up): new function for toupper(3) conversion. + + * gutils.c: const corrections. + (g_strdown): g_string_down() counterpart. + (g_strup): g_string_up() counterpart. + + * gscanner.c (g_scanner_unexp_token): + (g_scanner_error): + (g_scanner_warn): new functions to let a scanner put out warnings + or errors, especially to react on unexpected tokens. + + * gslist.c: + (g_slist_index): find out about about the position of a + certain data pointer. + (g_slist_position): find out about about the position of a + certain node. + + * glist.c: + (g_list_index): find out about about the position of a + certain data pointer. + +Thu May 7 05:14:19 1998 Tim Janik + + * ltmain.sh: added a new commandline flag -postfix similar to -release, + but will immediately change the library name. + + * Makefile.am: specify -postfix and -version-info + + * configure.in: version bump to 1.1.0. added GLIB_INTERFACE_AGE and + GLIB_BINARY_AGE. calculate LT_* variables for libtool. + +Fri May 1 16:36:08 1998 Owen Taylor + + * gutils.c: (g_strcasecmp). Check for isupper before + taking tolower, and account for macroized tolower. + + * gutils.c (g_error): Check for recursion. + +1998-04-27 Elliot Lee + + * glist.c (g_list_position): New function to find the position of + a link in a list - should be the inverse of g_list_nth(), but + haven't tested it so poof. + +Thu Apr 30 21:41:30 1998 Owen Taylor + + * gstring.c : Check arguments more carefully, + (gtk-draco-980423-1.patch; ramsey@rhrk.uni-kl.de) + +Tue Apr 7 19:36:48 1998 Owen Taylor + + * gutils.c (g_direct_compare): Removed, because that's what + a NULL comparison function means. And it wasn't 64 bit safe. + +Mon Apr 6 18:43:25 1998 Tim Janik + + * gscanner.c (g_scanner_get_token_ll): fixed a bug that caused floats + of the format ".xxx" to be parsed as "xxx". + +Fri Apr 3 20:36:35 1998 Owen Taylor + + * gutils.c (g_parse_debug_string): Make debug string + parsine case-insensitive + +Fri Apr 3 17:03:18 PST 1998 Manish Singh + + * gstring.c: corrected possible overrun when inserting into + GStrings (thanks Elrond) + +Fri Apr 3 18:05:45 1998 Owen Taylor + + * testglib.c: Removed literal german from strings + to appease SGI compiler. + +Thu Mar 26 20:47:21 1998 Owen Taylor + + * configure.in glib glibconfig.h.in: Add test for atexit/on_exit - + use on_exit if atexit not found in definition of ATEXIT. + +Wed Mar 25 15:23:37 1998 Owen Taylor + + * Makefile.am: Switched glibconfig.h rule from HEADERS + to DATA, so that it is not added to DISTFILES + +Wed Mar 18 22:27:08 PST 1998 Manish Singh + + * garray.c: g_rarray_truncate length done correctly + +Sun Mar 15 07:13:34 1998 Tim Janik + + * gutils.c: changed *_handler variables to be named glib_*_handler, + so you can easily access them from gdb. + +Sat Mar 14 17:47:43 1998 Owen Taylor + + * Makefile.am: Don't refer to current directory as $(top_builddir) + to avoid confusing non-gmakes + +Sat Mar 14 01:37:35 1998 Owen Taylor + + * Makefile.am (configincludedir): Moved glibconfig.h to + $(pkglibdir)/include + +Tue Mar 10 02:03:12 1998 Tim Janik + + * gscanner.c (g_scanner_destroy_symbol_table_entry): new function to + free symbol table entries upon destruction + (gtk-gronlund-980309-0.patch.gz). + +Mon Mar 9 15:02:21 1998 Tim Janik + + * glib.h: changed *_length functions to return guint. + changed *_nth functions to take guint as argument. + + * glist.c: adapted g_list_length and g_list_length. + + * gslist.c: adapted g_slist_length and g_slist_length. + +Mon Mar 2 17:51:18 1998 Owen Taylor + + * glib.h gutils.c : changed g_strcasecmp + to take gchar* not guchar* + + * testglib.c: Remove trailing ; after functions + +Sun Mar 1 19:04:40 1998 Owen Taylor + + * glib.h gstring.c: Added g_string_insert[_c]() + and g_string_erase(). + + From: Stefan Wille <1wille@vsys1.informatik.uni-hamburg.de> + +Mon Feb 16 23:05:06 1998 Owen Taylor + + * glist.c (g_list_insert_sorted): Changed function + so elements are always inserted, even if they compare + equal with another. + +Thu Feb 12 22:48:11 1998 Owen Taylor + + * gstring.c glib.h: removed deprecated g_string_equal + and g_string_hash. + +Tue Feb 10 13:04:36 1998 Owen Taylor + + * configure.in: Add check to see if the C library's + iswalnum can actually be used. (Not true for + Linux libc-5.4.38) + +Sat Feb 7 11:48:09 1998 Owen Taylor + + * gstring.c gutils.c: added some additional consts in + appropriate places to remove a warning + +Sat Feb 7 11:15:54 1998 Owen Taylor + + * gutils.c: include for tolower() + +Fri Jan 30 23:57:17 PST 1998 Manish Singh + + * added and autoconfigured in a new utility function + g_strcasecmp + +Wed Jan 28 23:53:27 PST 1998 Manish Singh + + * glist.c + * gslist.c + * testglib.c: the sort functions compared backwards. Fixed + * glib.h: list iterator macros now check for NULL pointers + +Tue Jan 27 09:46:57 PST 1998 Manish Singh + + * gstring.c: g_string_prepend and g_string_prepend_c had + interchanged src and dest parameters for g_memmove. Fixed. + +Tue Jan 27 01:38:52 PST 1998 Manish Singh + + * gslist.c: fixed a really, really lame error. g_slist_insert + didn't hook the data in! Reworked the routine to reflect the + functionality of g_list + +Wed Jan 21 01:13:25 1998 Tim Janik + + * Applied patch from (Raja R Harinath ) + to add function g_snprintf. + * configure.in (AC_CHECK_FUNCS): Check for vsnprintf. + * glib.h: Add prototype for g_snprintf. + * glibconfig.h.in: Add HAVE_VSNPRINTF. + * gutils.c (g_snprintf): new function. + +Sat Jan 17 23:52:40 1998 Owen Taylor + + * gstring.{c,h} gscanner.c: + renamed g_string_equal => g_str_equal + renamed g_string_hash => g_str_hash + And const corrected. Old functions left in for now. + +Fri Jan 9 20:03:46 1998 Tim Janik + + * gutils.c (g_strerror): changed message for EAGAIN from + "no more processes" to "try again" since EAGAIN is used with + functions else than fork(). + + * gscanner.c (g_scanner_get_token_ll): use strtol() instead of + strtoul() to avoid conflicts with solaris. + + * merged the glib portions from Jan 2 to Jan 7 out of gtk+/ChangeLog + into this file. + +Wed Jan 7 02:14:30 PST 1998 Manish Singh + + * glib.h: + * glist.c: + * gslist.c: + * testglib.c: Added g_[s]list_insert_sorted function + and appropriate tests in testglib + +Sat Jan 3 20:23:25 1998 Owen Taylor + + * glib.h: Changed guint32 -> guint for bitfields. + (Bitfields must be int or unsigned int?) + +Fri Jan 2 23:52 PST 1998 Jay Painter + + * glib_pre1.h: + * glib_pre2.h: + * glib.h: reverted glibconfig.h and glib.h files back to the + way they were before my ugly hack. + + * gscanner.c: removed inlines from clist and gscanner + +Tue Dec 23 02:49:51 1997 Tim Janik + + * gscanner.c: new file for GScanner: Flexible lexical scanner for + general purpose. + * glib_pre2.h: added GScanner includes. added g_strconcat and g_strtod. + gutils.c (g_strconcat): new function for string concatenation of NULL + terminated parameter list. + (g_strtod): new function to perform best string to double conversion + with or without consideration of the current locale. + +Mon Dec 15 19:33:58 1997 Tim Janik + + * glist.c: minor optimizations: + (g_list_append): `if' optimized for common code path, commented out + unneccessary `assert', saved one variable assignment. + (g_list_prepend): saved two (conditioned) variable assignment. + (g_list_insert): saved one (conditioned) variable assignment, + saved one variable assignment. + (g_list_remove): `if' optimized for common code path, saved two + variable assignments by using `g_list_free_1' (which is even + faster) instead of `g_list_free'. + (g_list_reverse): saved allocation of one variable, saved one + variable assignment. + +Wed Dec 10 23:27:20 1997 Tim Janik + + * glib_pre1.h: + * glib_pre2.h: + * glib.h: this file now gets concatenated by makeglib_h from + glib_pre1.h and glib_pre2.h to merge in glibconfig.h wich got + created by configure (done by Jay Painter). + + * glib_pre2.h: the g_assert*() and g_return_*_fail() macros + are wrapped by G_STMT_START and G_STMT_END now, to avoid conflicts + when used within if (...) g_macro(); else ... conditionals. + +Tue Dec 17 13:14:07 1996 Peter Mattis + + * glib.h: Changed 'g_return_if_fail' and 'g_return_val_if_fail' to + not call 'g_string' but to simply stringify the + expression. Calling 'g_string' causes the expression to be + expanded which is undesired. + +Sun Dec 1 01:30:48 1996 Peter Mattis + + * Started ChangeLog diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 new file mode 100644 index 0000000..5eb3071 --- /dev/null +++ b/ChangeLog.pre-2-0 @@ -0,0 +1,7225 @@ +Fri Mar 8 10:58:28 2002 Owen Taylor + + * ======== Released 2.0.0 ======== + +Fri Mar 8 10:20:46 2002 Owen Taylor + + * NEWS: Final updates for 2.0.0 + + * glib/gstrfuncs.c: Convert the results of strerror() + and strsignal() to UTF-8. + + * glib/gconvert.c glib/gdir.c glib/giochannel.c glib/giounix.c + glib/giowin32.c: Use g_strerror(), not strerror(). + +Fri Mar 8 00:15:29 2002 Owen Taylor + + * README.in: Updates. + + * README.in: Add warnings about current encoding problems with .po + files and error logging functions. + + * configure.in: Check for bind_textdomain_codeset(). + + * glib/gutils.c (_glib_gettext): Call + bind_textdomain_codeset, if present. + + * INSTALL.in: Some updates. + + * AUTHORS: Updates. + + * Makefile.am (EXTRA_DIST): Remove TODO.xml from EXTRA_DIST. + + * docs/Makefile.am (EXTRA_DIST): Remove Changes-2.0.txt + from EXTRA_DIST. + +2002-03-06 Sebastian Wilhelmi + + * configure.in: Fixed recognition of dce. Do not use -lc_r on + OpenBSD and FreeBSD. Instead use -pthread. Move scheduling + parameter check to after the case..esac block for finding the + right thread libs. (#73686) + +Tue Mar 5 19:41:02 2002 Owen Taylor + + * GTK+-2.0.0 rc1 + +2002-03-05 Matthias Clasen + + * glib/gmain.c (g_source_set_priority): Finish docs. + (#67064) + +Tue Mar 5 00:38:54 2002 Owen Taylor + + * glib/gutils.c (g_get_any_init): Where we have + getpwuid[_r], use that in preference to $HOME, and + only check $HOME as a fallback if getpwuid fails. + (#2311) + +Sun Mar 3 21:09:24 2002 Owen Taylor + + * configure.in: Default to --disable-gtk-doc, to avoid + Jade setup hassles. + + * autogen.sh: Add --enable-gtk-doc. + + * configure.in: Default to --disable-static to go + along with Pango, GTK+ where we need to do that for + bin-compat reasons. + + * Makefile.am: Add a slightly modified distcheck rule + that passes --enable-gtk-doc to the configure inside. + (So that 'make dist' succeeds inside.) + + * configure.in *.pc.in **/Makefile.am m4macros/glib-2.0.m4 + tests/makefile.mingw.in: Switch everything over to + glib-2.0. + +Sun Mar 3 02:30:05 2002 Tim Janik + + * glib/gscanner.h (_GScannerConfig): added padding. + + * glib/ghook.h (struct _GHook): add two padding pointers. + +Thu Feb 28 11:13:49 2002 Owen Taylor + + * glib/gshell.c (g_shell_unquote): Fix memory leak. + (#72990, Paolo Maggi) + +2002-02-28 Sven Neumann + + * m4macros/glib-2.0.m4: nicer output of configure --help. + +2002-02-27 Daniel Elstner + + * glib/gdate.c (g_date_strftime): Remove the shortcut + for UTF-8 locales to ensure consistent behaviour. Fix + handling of the strftime return value, and avoid looping + if strftime is buggy and constantly returns 0. Always + return 0 if the output buffer was to small. (#72544) + +Tue Feb 26 21:44:01 2002 Owen Taylor + + * config.status config.guess: Remove these files + from CVS so we more-or-less current versions from + automake --add-missing. (Reported by Finlay Dobbie, + #60342) + +2002-02-26 Matthias Clasen + + * docs/debugging.txt, gobject/glib-genmarshal.c, + gobject/glib-genmarshal.1, gobject/Makefile.am, gobject/gtype.c: + Remove references to gruntime. This includes renaming the test + program testgruntime to testgobject and the debug envvar + GRUNTIME_DEBUG to GOBJECT_DEBUG. (#50877) + +Tue Feb 26 14:56:31 2002 Owen Taylor + + * glib-2.0.pc.in: Reorder @INTL_LIBS@ and @ICONV_LIBS@ in case + -lintl depends on -licon. (Miroslaw Dobrzanski-Neumann #72708) + +Mon Feb 25 23:01:53 2002 Owen Taylor + + * configure.in acconfig.h config.h.win32.in + glib/gconvert.c: Check for iconv_* in -liconv + as well as libiconv_* in -liconv since AIX ships + the system iconv in a separate library. + Patch from Miroslaw Dobrzanski-Neumann (#72569) + +Mon Feb 25 22:46:29 2002 Owen Taylor + + * glib/gdebug.h: Fix trailing , in enumeration + Miroslaw Dobrzanski-Neumann (#72574) + +Mon Feb 25 21:58:01 2002 Owen Taylor + + * glib/guniprop.c (g_unichar_toupper/lower): Account + for some characters having now uppercase/lowercase + equivalents in code, docs. (#65416) + +Mon Feb 25 16:31:09 2002 Owen Taylor + + * glib/gshell.c (tokenize_command_line): Fix quoting + of \' sequence (#72548, Christian Rose) + +2002-02-24 Tor Lillqvist + + * README.win32: Edits. + + * config.h.win32.in: Add (as undefined) HAVE_UNSETENV, + _FILE_OFFSET_BITS and _LARGE_FILES, just for completeness. + + * glibconfig.h.win32.in: Add the gcc-2.95.x undef of + G_HAVE_ISO_VARARGS. + +Sat Feb 23 21:36:51 2002 Owen Taylor + + * configure.in: 1.3.15, binary, interface age 0. + + * NEWS: Updated. + +Sat Feb 23 14:54:13 2002 Owen Taylor + + * glib/giochannel.h (struct _GIOChannel): Add a little bit + of padding. + + * glib/gmain.h (struct _GSource): Add a little bit of padding. + +2002-02-21 Matthias Clasen + + * glib/gdebug.h: New header containing GTK_DEBUG-style debugging + support for GLib. Currently only the fatal_warnings debug option exists. + + * glib/gmessages.c (g_log_msg_prefix_init): New one-shot function + for parsing G_MESSAGES_PREFIXED. + (_g_debug_init): New one-shot function for parsing G_DEBUG. + (g_log_write_prefix): Use g_log_msg_prefix_init(). + (g_messages_init): Use g_log_msg_prefix_init() and _g_debug_init(). + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gdebug.h. + +Wed Feb 20 22:35:42 2002 Owen Taylor + + Fixes from Miroslaw Dobrzanski-Neumann (#71963) + + * glib/giounix.c (g_io_channel_new_file): Fix trailing comma + in enum. + + * configure.in: Check for unsetenv. + + * test/uri-test.c: Fall back to trying putenv(VARNAME) if + unsetenv isn't present. + +2002-02-20 Daniel Elstner + + * glib/gstring.[ch] (g_string_erase): Use gssize instead of + gsize as type of the pos and len arguments. (#71964) + +2002-02-20 Simos Xenitellis + + * configure.in: Added el to ALL_LINGUAS (Greek language). + +2002-02-19 Tor Lillqvist + + * glib/gspawn-win32.c: Include first here, too. Use + g_io_channel_read_chars() instead of (deprecated) + g_io_channel_read(). Set encoding to NULL for the channels used + for the pipes from the child. + + * glib/giowin32.c (buffer_read): Do return G_IO_STATUS_EOF when + EOF has been reached. Otherwise, with the above change to + gspawn-win32.c, spawn-test hangs. + +Mon Feb 18 20:18:23 2002 Owen Taylor + + * glib/libcharset/Makefile.am (EXTRA_DIST): Remove + charset.alias from EXTRA_DIST; we don't want the + charset.alias from the make distcheck machine + on the target system!. (#70974, reported by + Ryan Lovett) + +Mon Feb 18 12:40:36 2002 Owen Taylor + + * configure.in: Turn off ISO varargs support for gcc-2.95 + since it causes problems with ANSI and we we have GNUC + varargs. (#70024, reported by Morten Welinder, fix from + James Henstridge) + +Sun Feb 17 11:37:06 2002 Owen Taylor + + * 1.3.14 + + * glib/glibintl.h: Error out of config.h wasn't included + rather than including it, since config.h must be the + first thing included. + + * glib/gconvert.c glib/gmarkup.c glib/gshell.c glib/gspawn.c + glib/gunibreak.c glib/gunidecomp.c glib/guniprop.c: + Include config.h as the first thing. (#71704, Morten + Welinder) + +Fri Feb 15 11:41:42 2002 Owen Taylor + + * configure.in: 1.3.14, binary age 0, interface age 0. + +Fri Feb 15 10:41:51 2002 Owen Taylor + + * NEWS: Updated. + + * configure.in: Require autoconf-2.52, run AC_SYS_LARGEFILE. + (#71410, Sven Neumann) + + * glib/giounix.c glib/giowin32.c glib/giochannel.[ch]: + Change offset type for g_io_channel_seek[_position] to + gint64. + +2002-02-15 Sebastian Wilhelmi + + * tests/thread-test.c: Do not assume, that after + g_usleep(G_USEC_PER_SEC) the newly started thread began + running. Spotted by Miroslaw Dobrzanski-Neumann + . Make the test_g_static_rw_lock_thread threads + wait a random time. Make the test_g_static_rw_lock test run 5 + seconds, not 1. + +2002-02-14 Tor Lillqvist + + * glib/gmessages.c (g_logv): Use the #if branch with + G_BREAKPOINT() also on Win32. Remove the separate __asm int 3 for + MSVC, G_BREAKPOINT() does exactly that. + +2002-02-14 James Henstridge + + * m4macros/glib-gettext.m4: add third argument to the AC_DEFINE + calls, so users of the macro don't need to add entries to + acconfig.h in their package. + +2002-02-13 Havoc Pennington + + * glib/gmain.c (g_main_context_check): never dispatch sources of + mixed priority, because while iterating over the dispatch array a + new source with more priority may be added, while a source with + less priority remains in the dispatch array + +2002-02-11 Darin Adler + + * glib/gmessages.h: Use "if (expr) { } else" as I meant to in the + first place. The other form can trigger warnings in some compilers + that suspect a ";" after "if (expr)" is an error. + +2002-02-11 Manish Singh + + * glib/gmessages.h: need statement terminators for the if clauses for + the preceding change. + +2002-02-11 Darin Adler + + * glib/gmessages.h: Use "if (expr) else" rather than + "if (!(expr))" so the parentheses don't disable the gcc + warnings about = vs. ==. + +2002-02-11 jacob berkman + + * glib/gmarkup.h (g_markup_error_quark): match the signature in + the implementation + +2002-02-10 Hans Breuer + + * glib/gfileutils.c : no sym links on win32, no lstat in msvcrt + + * tests/makefile.msc.in : added uri-test + +2002-02-09 Darin Adler + + * glib/gmarkup.c: (xml_isspace): New. + (skip_spaces): g_unichar_isspace -> xml_isspace + * glib/gstrfuncs.c: (g_ascii_strtod): isspace -> g_ascii_isspace + isxdigit -> g_ascii_isxdigit, isdigit -> g_ascii_isdigit + +2002-02-09 Matthias Clasen + + * tests/markups/valid-4.gmarkup: Test attribute value delimiters. + + * glib/gmarkup.c (g_markup_parse_context_parse): Support + ' and " as attribute value delimiters. (#70677) + +2002-02-09 Sebastian Wilhelmi + + * configure.in: Make --disable-threads work again. (#71034) + +Fri Feb 8 23:52:27 2002 Owen Taylor + + * gobject/gvaluetransform.c: Register transformations for + gint64, guint64. (#70780, patch from Andy Wingo) + + * configure.in: Handle missing G_GINT64_FORMAT, + G_GUINT64_FORMAT ... harder to require GNU libc than GCC. + + * NEWS: Some cleanups that I had setting around. + +2002-02-08 Darin Adler + + * glib/gconvert.h: Make hostname parameter const char *. + * glib/gconvert.c: (g_unescape_uri_string): Added a new + "ASCII must not be escaped" feature, and some missing error + checking. + (is_escalphanum): New. + (is_escalpha): New. + (hostname_validate): New. + (g_filename_from_uri): Don't allow hostnames to include + escaped ASCII, validate hostnames with the new + hostname_validate. + (g_filename_to_uri): Validate hostnames with the new + hostname_validate. + + * tests/uri-test.c: Updated tests to reflect the hostname + validation changes above. + + * glib/gdate.c: (g_date_fill_parse_tokens): Remove the + include and do isdigit -> g_ascii_isdigit. + +Fri Feb 8 12:32:14 2002 Owen Taylor + + * tests/hash-test.c (second_hash_test): Fix access to + freed memory in test case (Miroslaw Dobrzanski-Neumann). + Re-enable and debug some commented out code. + +2002-02-08 Michael Natterer + + * glib/gdir.c: g_dir_open: added g_return_val_if_fail() to prevent + us from calling opendir(NULL) (which simply crashes). + +2002-02-08 Sebastian Wilhelmi + + * glib/gfileutils.c (g_file_test): Extended documentation. + +2002-02-07 Sebastian Wilhelmi + + * glib/gfileutils.c (g_file_test): Do not follow symbolic links + for G_FILE_TEST_SYMLINK. Also fixed the correct "OR"-behaviour for + G_FILE_TEST_IS_EXECUTABLE and G_FILE_TEST_EXISTS. (#60048) + +2002-02-07 Changwoo Ryu + + * configure.in (ALL_LINGUAS): Added "ko". + +Wed Feb 6 14:44:18 2002 Owen Taylor + + * glib/gmain.c (g_main_context_prepare): Handle + NULL entries (already dispatched) in pending_dispatches array + (pointed out by Manish Singh) + +Tue Feb 5 17:13:02 2002 Owen Taylor + + * glib/gmain.c (g_main_context_prepare): Unref pending + dispatches when discarding them. + +2002-02-04 Sebastian Wilhelmi + + * glib/gthread.c (g_thread_create_full): Delay allocation until + after all g_return_val_if_fail (). + + * glib/gthread.h: Make depth member guint for cosmetic reasons. + + * glib/gthread.c: (g_static_rec_mutex_unlock_full): depth should + be unsigned. All that spotted by Jörgen Viksell + + +2002-02-02 Manish Singh + + * glib/gmain.c + * glib/gtree.c: remove references to deprecated functions in docs + and warning message. + +2002-01-31 jacob berkman + + * glib-gettextize.in: + * m4macros/glib-gettext.m4 (AM_GLIB_GNU_GETTEXT): remove + references to po2tbl + +2002-01-29 Matthias Clasen + + * glib/gmarkup.c (g_markup_parse_context_parse): Change the + order in which some error conditions are checked to improve + error messages. (#69646) + +Tue Jan 29 15:04:31 2002 Owen Taylor + + * 1.3.13 + + * tests/shell-test.c: Workaround for MSVC bugs. (#61064) + +Tue Jan 29 14:06:22 2002 Owen Taylor + + * NEWS: Update to include last change. + +2002-01-21 Jeffrey Stedfast + + * glib/gconvert.c (open_converter): Rewritten to cache iconv + conversion descriptors. On at least some Unix systems like + Solaris, iconv_open() must dlopen the necessary charset modules in + order to setup the descriptor. This can take a major toll on + performace if you are constantly opening and closing conversion + descriptors for the same charset conversions over and over. + (g_convert_with_fallback): Use close_converter() rather than + g_iconv_close() since open_converter() now caches iconv + descriptors. + +Tue Jan 29 11:18:44 2002 Owen Taylor + + * NEWS: Updated. + + * configure.in: Micro == 13, binary age, interface age 0. + [ binary breakage was return type of g_signal_connect_object(), + probably could have used binary age == 0, but a little safer not to.] + + * configure.in: Remove configure warning. + +2002-01-28 Havoc Pennington + + * glib/gmarkup.c (add_attribute): NULL-terminate + context->attr_values so g_strfreev() is safe. + Would previously crash if parsing was ended prior + to ending the start tag. + (g_markup_parse_context_parse): add a couple assertions + +2002-01-28 Havoc Pennington + + * glib/gmacros.h: get rid of warning here + +Mon Jan 28 17:56:10 2002 Owen Taylor + + * glib/gmacros.h: Only use __FUNCTION__, __PRETTY_FUNCTION__ for + G_GNUC_FUNCTION, G_GNUC_PRETTY_FUNCTION, G_STRLOC when __GNUC__ < + 3, since in 3.0.3 the semantics of these functions were changed in + an incompatible way. (#69097) + +2002-01-28 Ron Steinke + + * glib/giochannel.c: Some documentation fixes/elaborations + I really should have gotten in a long time ago + +2002-01-24 Sven Neumann + + * glib/gutf8.c (g_utf8_to_utf16): removed an empty line in the + inline documentation that confused gtk-doc. + +2002-01-23 Laszlo Peter + + * glib/gmessages.c (g_printf_string_upper_bound): return 1 more + for the trailing '\0' when using vsnprintf. (#69474) + +2002-01-23 Tor Lillqvist + + * glib/gconvert.c: (strdup_len): Not used on Windows, don't even + compile it then. + + (acceptable): Improve comments for the _acceptable_ table: put + each ASCII char above the hex number for it. + + (g_escape_file_uri): On Windows, turn backslashes in the file name + into plain ("forward") slashes. + + (g_filename_from_uri): On Windows, don't return the hostname + "localhost", because we can not be 100% sure it will be recognized + in all cases anyway, so simpler to turn it into a null + hostname. + + Change slashes in the filename into backslashes, as that is the + more canonical separator. + + Recognize drive letters (either followed by a colon or a vertical + bar, as used by some browsers), and if the filename part starts + with a such, don't include any (back)slash. + + Don't drop any extra leading slash in the filename on Unix. + + (g_filename_to_uri): On Windows, if the hostname is "localhost", + don't use it, for consistency with g_filename_from_uri(). + + * tests/uri-test.c: Change accordingly, so that all tests pass on + Windows. Unix, too, I hope, though I couldn't check that now. + + (main): Unset the G_BROKEN_FILENAMES environment variable on Unix, + as some tests require that filenames are in UTF-8. Is unsetenv() + portable? + + These changes should fix bugs #59387, #59652, #59657 and #59658. + +2002-01-22 Sebastian Wilhelmi + + * configure.in: Get the right multithread option for GCC 3.0 and + later on AIX. (#67583) + +2002-01-21 Jeffrey Stedfast + + * glib/gconvert.c (g_convert_with_fallback): If g_convert fails, + set bytes_written to 0 and close the iconv descriptor that was + opened a few lines above. On a successful return, calculate + bytes_written to be outp - dest instead of outp - str. + +2002-01-16 Sven Neumann + + * acinclude.m4 + * m4macros/glib-gettext.m4: removed the --disable-nls option. You + can't disable Native Language Support since we rely on it. + + * configure.in: nicer --help output. + +Tue Jan 8 11:33:28 2002 Owen Taylor + + * docs/Makefile.am (EXTRA_DIST): Add text files to EXTRA_DIST. + (#68239, Matthias Clasen) + +2002-01-07 Zbigniew Chyla + + * configure.in (ALL_LINGUAS): Added pl. + +2002-01-05 Hans Breuer + + * glibconfig.h.win32.in + msvc_recommended_pragmas.h (new file) : moved warning to + error pragmas to their own file to not force 'good practice' + programming in downstream libs and apps. Instead the new header + will be used by -FImsvc_recommended_pragmas.h in gnome/cvs + makefile.msc + * */makefile.msc.in : use -FImsvc_recommended_pragmas.h + + * makefile.am : add msvc_recommended_pragmas.h to EXTRA_DIST + +2001-12-31 Tor Lillqvist + + * glib/gutils.c (g_get_any_init): (Win32) Use longer buffer for + user name. + +Sat Dec 29 15:07:21 2001 Owen Taylor + + * glib/gspawn.c (script_execute): Copy trailing NULL + into new ARGV array. (#67673) + +2001-12-28 Sven Neumann + + * glib/gmessages.c: only include printf_string_upper_bound() if + HAVE_C99_VSNPRINTF is not defined. + +2001-12-27 Duarte Loreto + + * configure.in: Added portuguese to ALL_LINGUAS + +Sat Dec 22 12:08:56 2001 Owen Taylor + + * configure.in: 1.3.12, binary, interface age 0. + + * NEWS: Updated. + +2001-12-21 Tor Lillqvist + + * config.h.win32.in: Add (undefined) HAVE_C99_VSNPRINTF. + + * glibconfig.h.win32.in: Add definition of G_HAVE_GROWING_STACK. + + * tests/Makefile.am: Rename the progs_LDADD, thread_LDADD and + module_LDADD Make macros to progs_ldadd, thread_ldadd and + module_ldadd. Newer automakes reserve macros named *_LDADD for + the use as LDADDs for targets it knows. + + * glib/giowin32.c: (struct _GIOWin32Watch): 'callback' wasn't used + here, either. + +2001-12-21 Matthias Clasen + + * glib/gfileutils.c (g_file_get_contents): Remove FIXME. (#67063) + +2001-12-19 Mark McLoughlin + + * glib/gscanner.c: (g_scanner_unexp_token): fix segfaults. + +2001-12-20 Michael Meeks + + * glib/giounix.c (struct _GIOUnixWatch): kill 'callback' + +Wed Dec 19 23:09:07 2001 Owen Taylor + + * glib/gconvert.c (g_iconv_open): SGML doc fix. + +Tue Dec 18 21:11:10 2001 Tim Janik + + * configure.in: add configure check to determine G_HAVE_GROWING_STACK. + +2001-12-16 Havoc Pennington + + * glib/gfileutils.c (get_contents_regfile): use g_try_malloc and + return error on not-enough-memory + (get_contents_stdio): ditto + +2001-12-17 Matthias Clasen + + * glib/gspawn.c, glib/gspawn-win32.c: Use , not . + +2001-12-15 Matthias Clasen + + * glib/gshell.c, glib/gspawn.c, glib/gspawn-win32.c, glib/gerror.c, + glib/gfileutils.c, glib/ghash.c, glib/gmain.c, glib/gasyncqueue.c, + glib/gtree.c: Minor markup fixes. + +2001-12-14 Havoc Pennington + + * glib/gshell.c (g_shell_parse_argv): note on how to free returned + vector + +2001-12-08 Havoc Pennington + + * glib/gspawn.c (fork_exec_with_pipes): include argv[0] in error + message about failure to exec + +2001-12-13 Matthias Clasen + + * glib/gconvert.c, glib/giochannel.c, glib/gmain.c, + glib/gwin32.c: Revert mistaken change: it is UNIX, not Unix. + +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + +2001-12-12 Matthias Clasen + + This fixes #60543: + + * glib/gutils.c (g_snprintf, g_vsnprintf): Switch to C99-[v]snprintf(). + + * tests/strfunc-test.c: Add some tests for g_snprintf(). + +2001-12-12 Matthias Clasen + + * glib/gconvert.c, glib/grand.c, glib/ghash.c, + glib/gthreadpool.c, glib/gtree.c: Documentation fixes. + +Mon Dec 10 14:08:39 2001 HideToshi Tajima + + * glib/libcharset/config.charset (os): + add ISO8859-3 for Solaris. (#66174) + +2001-12-10 Sven Neumann + + * gobject/gvalue.c (g_value_register_transform_func): perform an exact + match on the two types instead of using transform_func_lookup(). + +2001-12-09 Christopher Blizzard + + * glib/gmessages.h: Add pragma that will prevent warnings when you + are not using -std=99 and newer gcc compilers. Patch from Red + Hat's gtk+ 1.2 rpm. + +2001-12-06 Darin Adler + + * glib/gmacros.h: Do the same for "pure". + +2001-12-06 Matthias Clasen + + The following patch corrects some function attributes. (#61780) + + * glib/ghash.h (g_int_equal, g_int_hash): These are not const. + + * glib/glibintl.h (_glib_gettext): Add G_GNUC_FORMAT(1). + + * glib/gmacros.h: Use reserved symbols in function attribute macros. + +2001-12-06 Matthias Clasen + + The following patch avoids manual printf()-format parsing + if a C99-conforming vsnprintf() is available. (#55106) + + * acinclude.m4 (AC_FUNC_VSNPRINTF_C99): New macro to test for a + C99 conforming vsnprintf. + + * configure.in: Use AC_FUNC_VSNPRINTF_C99. + + * glib/gmessages.c (g_printf_string_upper_bound): Use C99 vsnprintf(). + +2001-12-05 Sven Neumann + + * glib/gtree.c (g_tree_foreach): mention the fact that the tree is + traversed in sorted order. + +2001-12-03 Manish Singh + + * tests/module-test.c: g_module_symbol takes a gpointer *, not just + a gpointer + + * tests/libmoduletestplugin_a.c: here too + +2001-11-29 Havoc Pennington + + * glib/gtree.c (g_tree_foreach): + * glib/ghash.c (g_hash_table_foreach): + + Add notes about how you shouldn't modify these data structures as + you iterate over them. + +Thu Nov 29 11:16:03 2001 Owen Taylor + + * HACKING: Update (#65721, Dave Neary) + +2001-11-28 Sebastian Wilhelmi + + * glib/gdate.c: Fixed wrong order in conversion. + +Wed Nov 28 18:34:22 2001 Owen Taylor + + * glib/gmain.[ch]: Rename (private) GSource.id and + id parameter to g_main_context_find_source_by_id() + to avoid problems with Objective C where 'id' is + a keyword. (#65616) + +2001-11-28 Daniel Elstner + + * glib/gutf8.c (utf8_skip_data): In order to avoid infinite loops + on invalid UTF-8 strings, change the skip count for 0xfe and 0xff + from 0 to 1. + +2001-11-28 Sebastian Wilhelmi + + * configure.in: Always call GLIB_SIZEOF(..., system_thread). Fixes + #65624. + +2001-11-28 Tor Lillqvist + + * glibconfig.h.win32.in: Add GLIB_SIZEOF_SIZE_T here, too. + +2001-11-27 Dan Winship + + * configure.in (G_MODULE_LDFLAGS): Set this from libtool rather + than hardcoding values for certain platforms. + + * glib/libcharset/config.charset: Add a rule for NetBSD. + + * glib/libcharset/localcharset.c (_g_locale_get_charset_aliases): + If LIBCHARSET_ALIAS_DIR is set, look for charset.aliases there. + + * tests/Makefile.am (TESTS_ENVIRONMENT): set LIBCHARSET_ALIAS_DIR + so we don't depend on charset.aliases having been installed + +2001-11-26 Matthias Clasen + + * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly. + + * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation. + + * glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343) + + * glib/gtree.c (g_tree_traverse): Explain the deprecation in + some detail. + +Mon Nov 26 09:42:24 2001 Tim Janik + + * configure.in: provide GLIB_SIZEOF_SIZE_T. + +2001-11-26 Jesus Bravo Alvarez + + * configure.in: Added gl (Galician) to ALL_LINGUAS + +2001-11-23 Hans Breuer + + * glib/makefile.msc.in : added -Zm400 to DEPCFLAGS to avoid : + gunidecomp.h(5846) : fatal error C1076: compiler limit : + internal heap limit reached; use /Zm to specify a higher limit + + * glibconfig.h.win32.in : added recommended pragma list for + msvc again. They are an invaluable help of letting the + compiler catch bugs. + +Thu Nov 22 13:56:55 2001 Owen Taylor + + * Version 1.3.11 + +Thu Nov 22 13:14:18 2001 Owen Taylor + + * configure.in (GLIB_MICRO_VERSION): Version 11, + interface, binary age 0. + + * NEWS: Updated. + + * tests/Makefile.am (libmoduletestplugin_[ab]_la_LDFLAGS): + Add dummy -rpath argument. On some (but not all) platforms, + libtool will only build a convenience library without this. + (#63486, Dan Winship) + + * Makefile.am (EXTRA_DIST): Add README.in, INSTALL.in - + autoconf-2.5x checks for 'make dist' in the tarball + when you make distcheck. + + * glib/Makefile.am (EXTRA_DIST): Distribute + makefile.msc/mingw.in, glib.rc.in. + + * tests/patterntest.c: Include string.h. + + * glib/gpattern.c (g_utf8_reverse): doc parsing fix. + +Thu Nov 22 02:50:18 2001 Tim Janik + + * NEWS: merged with gobject/NEWS. + +2001-11-21 Tor Lillqvist + + * glib/makefile.mingw.in (DEFINES): Set G_LOG_DOMAIN as in + Makefile.am. + +Tue Nov 20 20:54:25 2001 Owen Taylor + + * glib/gunidecomp.[ch] glib/gen-unicode-tables.pl: Patch + from Andrew Taylor to optimize the decomposition table + to eliminate relocations and save space. (#64982) + +2001-11-18 Hans Breuer + + * glib/glib.def : + * glib/makefile.msc.in : remove g_log_domain_glib usage/export + + * tests/makefile.msc.in : add iochannel-test + +Sat Nov 17 17:21:57 2001 Owen Taylor + + * glib/Makefile.am glib/*.c glib/gmessages.h: Get + rid of g_log_domain_glib variable in favor of just + using a string constant. + +Sat Nov 17 14:10:35 2001 Owen Taylor + + * glib/gbsearcharray.h: Include gtypes.h not gobject/gtype.h + + * glib/glib-object.h gobject/*.h: Prevent headers from + being included directly except when compiling GObject. + + * gobject/gvaluecollector.h: Include glib-object.h so that + this file can be included directly, since we don't + include it _from_ glib-object.h. + + * gobject/gtype.c: Remove struct _GValue hack since we + now include glib/gvaluecollector.h which simply pulls in + glib-object.h. + +2001-11-15 Matthias Clasen + + * glib/giochannel.c: Documentation fixes. + +2001-11-15 Takayuki KUSANO + + * configure.in: Added "ja" to ALL_LINGUAS. + +2001-11-15 Michael Meeks + + * glib/giounix.c (g_io_channel_unix_new): set the fd + before using it. + +2001-11-15 Tor Lillqvist + + * tests/makefile.{mingw,msc}.in (TESTS): Add back mainloop-test + here, too. + + * tests/Makefile.am: Remove leftover comment that claimed + mainloop-test is removed. + +2001-11-14 Matthias Clasen + + * glib/gpattern.c: add UTF-8 support. + + * tests/patterntest.c: add UTF-8 and equality tests. + +Wed Nov 14 07:34:24 2001 Tim Janik + + * glib/galloca.h (g_newa): provide g_newa(ctype, count) on top of + g_alloca() like we provide g_new() on top of g_malloc(). + +Tue Nov 13 21:25:35 2001 Owen Taylor + + * glib/{gen-unicode-tables.pl,gunibreak.c,gunibreak.h, + gunichartables.h, gunicomp.h, gunidecomp.[ch], + guniprop.c}: Patch from Andrew Taylor to improve + tables and reduce relocations by using indices + rather than pointers. (#64433) + + * tests/unicode-normalize.c (main): Fix for changes + to g_strsplit(). + +2001-11-12 Darin Adler + + * glib/gstrfuncs.c: (g_strsplit): Fix max_tokens == 1 case to + match documentation. + * tests/strfunc-test.c: (main): Add tests. + + * tests/.cvsignore: Recently-added test. + +Mon Nov 12 03:01:28 2001 Tim Janik + + * glib/gscanner.c (g_scanner_eof): G_TOKEN_ERROR is also an end + of stream condition. + +2001-11-10 Tor Lillqvist + + * glib-zip.in (DEVZIP): Also share/glib-2.0. + +2001-11-09 Tor Lillqvist + + * glib/gwin32.c (g_win32_getlocale): Add a couple of languages + that have LANG_* codes in newest headers, just for completeness. + +2001-11-08 Wang Jian + + * configure.in(ALL_LINGUAS): Added zh_CN for Simplified Chinese. + +2001-11-08 Tor Lillqvist + + * glib/gwin32.c: Don't define LANG_AZERI etc in case those aren't + defined in the headers (MSVC 5.0). + (g_win32_getlocale): Instead, surround uses of those with + #ifdef. Those MSVC 5.0 users that want to build a GLib that + recognizes those languages should download the Platform SDK and + use the headers from it. + +2001-11-07 Peter Williams + + * glib/gdir.c (g_dir_read_name): Return NULL when done reading. + +2001-11-06 Tor Lillqvist + + * glib/Makefile.am (gspawn_win32_helper_LDFLAGS): Use -mwindows. + +2001-11-05 Tor Lillqvist + + * README.win32: Minor edits. + + * glib-zip.in: Build separate runtime and developer packages. + + * glib/libcharset/config.charset (os): Don't need to match mingw + after all, the charset.alias file isn't even used on Win32... (see + localcharset.c). + + * glib/makefile.mingw.in: Add gdir. + + * glib/glib.def: Add g_dir_* entry points. + +Sun Nov 4 20:45:21 2001 Owen Taylor + + * configure.in (CFLAGS): Add check for dirent.h + + * glib/glib.h glib/Makefile.am: Add gdir. + + * glib/gdir.c (g_dir_close): Couple of small tweaks + now that it is actually compiling... + +Sun Nov 4 20:29:31 2001 Owen Taylor + + * glib/gdir.[ch]: Indentation fixes, some rewriting of docs to + conform to gtk-doc standard. + + * glib/gdir.[ch] (g_dir_close): Remove the boolean + return value. What would you do if closing failed? + What would the user do if you printed a warning + message "closing directory %s failed"? + +2001-11-04 Hans Breuer + + * glib/gdir.[hc] : (new files) simplified wrapper around dirent + functions to improve portability of downstream libs/apps + * glib/makefile.msc.in : use them + * glib/glib.def : export them + * config.h.win32.in : needing HAVE_DIRENT_H defined + +2001-11-04 Tor Lillqvist + + * tests/Makefile.am: On Win32, create separate .exp file for + module-test.o and link with that. Otherwise the GNU linker doesn't + export the g_clash_func. + +2001-11-03 Hans Breuer + + * glib/giowin32.c : static correctness + + * glib/gwin32.c : some more #if defined (SUBLANG_* ... + (g_win32_get_package_installation_subdirectory) use g_build_filename + instead of duplicating its logic + + * glib/glib.def : removed duplicates, added mising, removed + compat cruft + +Fri Nov 2 19:54:16 2001 Tim Janik + + * glib/gbacktrace.h (G_BREAKPOINT): remove public signal.h include. + +Thu Nov 1 21:48:43 2001 Owen Taylor + + * tests/mainloop-test.c (recurser_idle): Recurse + with may_block = FALSE, so we don't get into + the pathology where the recurser_idle recurses + for 10 iterations, and the only thing that is + running is the recurser idle, which adds + another recursion for each of those 10 iterations + and.... + + * tests/mainloop-test.c (create_crawler): Fix race + condition where a crawler source could be destroyed + before it was added to the crawler array. + + * test/Makefile.am: Add mainloop-test back. + +2001-11-01 Marius Andreiana + + * configure.in: Added ro (Romanian) to ALL_LINGUAS + +2001-10-31 Havoc Pennington + + * glib/gmain.c (g_main_loop_run): fix to the locking so we don't + hang + +2001-10-31 Sebastian Wilhelmi + + * configure.in: Make --with-threads=none mean, that we want thread + support, but no default thread implementation. This also was the + original intention, but disapeared around 1998... So it doesn't + seem to be the most requested feature, but we went far to make it + possible in the code, so I resurrected this feature. + + * INSTALL.in: Describe the --enable-gc-friendly, --disable-threads + and --with-threads options of configure. + + * glib/gmain.c (g_main_context_acquire, g_main_context_release, + g_main_context_wait): Use the right conditional (G_THREADS_ENABLED + instead of G_THREAD_ENABLED). Also remove wrong + return-statement. Unfortunately mainloop-test still does fail. Many + thanks to Andrea Fazekas for spotting + this. (#63455) + +2001-10-31 Matthias Clasen + + * gobject/gsourceclosure.c (g_source_set_closure): Fix documentation. + +2001-10-30 Tor Lillqvist + + * glib-zip.in: New file, used to build distribution packages for + Windows. + + * configure.in: Expand it. + + * Makefile.am: Distribute it. + + * config.h.win32.in: Update to match currently produced config.h + +2001-10-29 Daniel Egger + + * glib/gbacktrace.h: Fix non-Intel/-Alpha version of the + G_BREAKPOINT macro to include and use SIGTRAP. + + * glib/gmessages.c: Conditionalise definition of args2 + depending on the definition of HAVE_VSNPRINTF to avoid + compiler warning. + + * gobject/testgruntime.c + * tests/patterntest.c: Include to avoid warnings. + +Mon Oct 29 11:29:37 2001 Owen Taylor + + * m4macros/glib-2.0.m4: Don't try to use PKG_CONFIG + when we didn't find it. (#62944, Eric Lemings) + + * m4macros/glib-2.0.m4: Fix problem with spaces around = + sign in assignment. (#63209, Arkadiusz Miskiewicz) + +Mon Oct 29 10:59:36 2001 Owen Taylor + + * configure.in: Check for path to Perl, add gobject/glib-mkenums + to AC_OUTPUT. (#63093, Dan Winship) + +Mon Oct 29 10:55:12 2001 Owen Taylor + + * glib/libcharset/Makefile.am (EXTRA_DIST): Dist + ref-add.sin, ref-del.sin. (#63092, Dan Winship) + +2001-10-29 Sebastian Wilhelmi + + * glib/gmain.c (g_main_loop_quit): Conditionalize thread related + calls. (#63091) + +2001-10-28 Tor Lillqvist + + * glib/glib.def: Add missing g_pattern_match_simple and + g_pattern_spec_equal. + + * glib/gwin32.c (g_win32_get_package_installation_subdirectory): + Set separator correctly. + + * glib/libcharset/config.charset (os): Match also mingw*. + + * tests/testglib.c (main): (Wibn32): Print the lib/locale + subdirectory, as that is what actually gets used. + +Wed Oct 24 11:10:54 2001 Owen Taylor + + * configure.in: Version 1.3.10, interface age, binary age = 0. + + * NEWS: Updates + +2001-10-26 Tor Lillqvist + + * configure.in: Don't default to win32 thread implementation on + Cygwin. The gthread-win32 implementation really is for Win32 with + MS runtime only. Let configure find pthreads when configuring for + Cygwin. + + * README.win32: Updates. + + * glib/glib.def: Update. + + * tests/makefile.mingw.in + * tests/makefile.msc.in: Remove mainloop-test here, too. Add ../* + to PATH before running tests to find DLLs. Separate the + interactive tests, don't run them in the check target. + + * */makefile.msc.in: Include make.msc from GLib's build directory. + +Thu Oct 25 12:01:41 2001 Owen Taylor + + * tests/Makefile.am: Temporarily remove mainloop-test, since it + prevents distcheck. + +2001-10-24 Alex Larsson + + * docs/reference/glib/glib-sections.txt: + Add g_strtod & co. + + * docs/reference/glib/tmpl/string_utils.sgml: + Add docs for G_ASCII_DTOSTR_BUF_SIZE. + + * glib/gstrfuncs.[ch]: + Added g_ascii_strtod, g_ascii_dtostr and g_ascii_formatd. + + * tests/Makefile.am: + * tests/strtod-test.c: + Add tests for g_ascii_strtod & co. + +2001-10-23 Tor Lillqvist + + * config.h.win32.in: Typo: GLIB_MICRO_VERSION and + GLIB_MINOR_VERSION were swapped. + + * glib/gutils.h: Remove G_HARDCODED_PATH_WRAPPER, Owen didn't like + it. + + * glib/gutils.c: Instead, expand it on Win32 as + _glib_get_locale_dir(), and #define GLIB_LOCALE_DIR as a call to + it. + +2001-10-23 Tor Lillqvist + + * config.h.win32.in: Typo. + + * glibconfig.h.win32.in: Minor update to correspond to what + configure now generates. + + * glib/Makefile.am: (Win32): If we have built the MSVC import + library, install it. Install the gcc import library. Also support + uninstall. + + * glib/gutils.h: Add macros G_WIN32_DLLMAIN_FOR_DLL_NAME and + G_HARDCODED_PATH_WRAPPER. These are used to avoid hardcoding path + names into Windows DLLs. + + * glib/gutils.c: Use them for GLIB_LOCALE_DIR. + + * glib/gwin32.c (get_package_directory_from_module): Plug a small + memory leak. Minor code reordering. + (g_win32_get_package_installation_subdirectory): Allow empty subdir. + +2001-10-19 Tor Lillqvist + + * configure.in: Fix test for lib.exe. Can't set ms_librarian + before calling AC_CHECK_PROG, as it doesn't actually check + anything if the result variable has been preset... + +2001-10-19 Sebastian Wilhelmi + + * glib/gutils.c (g_set_prgname, g_get_prgname): Use another LOCK + for g_prgname to avoid deadlocking. (#62606) + +2001-10-19 Tor Lillqvist + + * configure.in: Check also ac_cv_sizeof___int64 when requiring a + 64-bit type. + +2001-10-17 HideToshi Tajima + + * glib/gconvert.c (g_iconv_open): + Fix a typo: to_codeset => from_codeset. + (#58195, #55152) + +Fri Oct 12 18:24:02 2001 Tim Janik + + * glib/gpattern.[hc]: make struct _GPatternSpec and GMatchType + private. + (g_pattern_equal): new function to return equality of two patterns + (required because GPatternSpec is private now). + (g_pattern_spec_new): fix bug wrg wildcard counting which produced + incorrect pattern specs (discovered by Matthias Clasen). + optimized code so we just keep one compiled pattern string now. + correctly canonicalize patterns. reduce string walks, optimize + decision about MATCH_ALL vs. MATCH_ALL_TAIL. + (g_pattern_match_string): call just g_pattern_match() with NULL + reversed string. + (g_pattern_match): allow NULL reversed strings now, reverse_dup + strings on demand. + + * tests/patterntest.c (test_compilation): added an extended testcase + for pattern matching from Matthias Clasen . + +2001-10-11 Raja R Harinath + + * configure.in (ac_cv_sizeof_long_long): Avoid '==' and '-a' in + 'test's. + +Wed Oct 10 20:07:36 2001 Joshua N Pritikin + + * glib/gmessages.c glib/gtypes.h: Remove G_HAVE_GINT64 + conditionalization. + +Wed Oct 10 17:34:15 2001 Joshua N Pritikin + + * configure.in: Un-conditionalize and require a 64-bit integer + type. + +2001-10-04 Raja R Harinath + + * configure.in: Avoid 'test -a'. + +2001-10-05 Matthias Clasen + + * glib/gwin32.c: Documentation update. + +2001-10-04 Havoc Pennington + + * glib/libcharset/Makefile.am (EXTRA_DIST): add config.charset + +2001-10-03 Tor Lillqvist + + * glib/gutils.c (Win32) (DllMain): New function (DLL entry point) + to tuck away actual DLL name. + (GLIB_LOCALE_DIR) Use actual DLL name, instead of assuming one + naming convention for DLLs. + + * glib/glib.def: g_string_append_printf. + +2001-10-02 Matthias Clasen + + * glib/gstrfuncs.c, glib/giochannel.c: documentation update. + + * glib/gqueue.c: add documentation. + +2001-10-02 Sven Neumann + + * glib/gstring.h (g_string_sprintfa): let the compatibility definition + point to the new name g_string_append_printf(). + +2001-10-01 Alex Larsson + + * glib/gconvert.[ch]: + Convert G_CONVERT_ERROR_NOT_ABSOLUTE_FILE_URI and + G_CONVERT_ERROR_INVALID_URI to G_CONVERT_ERROR_BAD_URI. + + * tests/uri-test.c: + Update tests + +Mon Oct 1 16:01:24 2001 Owen Taylor + + * glib/gstring.[ch] glib/grel.c: Rename g_string_printfa() + to g_string_append_printf(). (#61041, Havoc Pennington.) + +2001-10-01 Tor Lillqvist + + * glib/gwin32.c: Documentation cleanups. (#61487) + +2001-10-01 Matthias Clasen + + * glib/gscanner.h (GScannerMsgFunc): make third argument + a gboolean. + (g_scanner_add_symbol, g_scanner_remove_symbol, + g_scanner_foreach_symbol): mark these + G_DISABLE_DEPRECATED. (#61469) + + * glib/gscanner.c (g_scanner_msg_handler): make third + argument gboolean. (#61468) + +2001-10-01 Sven Neumann + + * glib/gconvert.c + * glib/gspawn-win32.c + * glib/gspawn.c: some minor documentation fixes. + +2001-09-29 Alexander Larsson + + * configure.in: + Add build/win32/dirent/Makefile to the list of makefiles + +2001-09-30 Tor Lillqvist + + * glib/gwin32.c + * glib/gwin32.h + * glib/glib.def: Remove own implementation of dirent + functions. Instead, gcc (mingw) users should go ahead and use the + included with the mingw gcc, and the dirent functions + included in libmingw32, while MSVC users can use the same (public + domain) code, extracted from mingw-runtime sources and placed in + build/win32/dirent.[ch]. + + * glib/gwin32.c (get_package_directory_from_module, + g_win32_get_package_installation_directory): Use static lock to + protect static hash table. + +Sat Sep 29 02:33:14 2001 George Lebl + + * tests/testglib.c (main): cast the string size to gulong and use %lu + for printing to avoid 64bit issues + + * glib/gstrfuncs.[ch] (g_ascii_strncasecmp): Change the 'n' argument + to gsize instead guint. + +Fri Sep 28 19:41:32 2001 Owen Taylor + + * glib/libcharset/* configure.in: Fix macros from libcharset + to work with autoconf-2.5x. (From Laszlo Peter.) + +2001-09-27 Matthias Clasen + + * glib/gstring.c: Fix inline docs for g_string_prepend_unichar. + +2001-09-29 Abel Cheung + + * configure.in: Add quotes around test values. This fixes a minor + annoying warning if platform is not win32. + +2001-09-27 Manish Singh + + * glib/grand.c (g_rand_new): fix typo (#if->#ifdef) so it compiles + again. + +2001-09-24 Bruno Haible + + * glib/gwin32.c (g_win32_getlocale): When the sublangid is + SUBLANG_DEFAULT, return the locale of the language's main country, + not a country-neutral locale. E.g. "en_US" instead of "en". Add + handling of LANG_SORBIAN. Fix typo for SUBLANG_CHINESE_SIMPLIFIED + (China == CN, CH == Switzerland). Ignore empty environment + variable values. + +2001-09-28 Tor Lillqvist + + * glib/makefile.{mingw,msc}.in: Add localcharset.o. Just copy the + source file from libcharset and compile in this directory. + + * glib/giochannel.c: Mark rest of g_set_error strings for + translation, too. + + * glib/giowin32.c: Add some debugging output functions, call them + when debugging. + (create_events, g_io_win32_msg_write): Free message fetched with + g_win32_error_message (). + (g_io_win32_check): Indentation fixes. + (g_io_win32_fd_read,g_io_win32_sock_read): Don't always return + G_IO_STATUS_NORMAL. Do return G_IO_STATUS_EOF if we got 0 bytes, + like on Unix. This helps making the test programs run + successfully. + + * glib/gmain.c (g_poll): Return the code ifdeffed out with + TEST_WITHOUT_THIS. Can't remember why it was ifdeffed out. Things + seem to work as previously with the code in place. Especially + spawn-test didn't work with the code ifdeffed out (Bug#61067). + + * glib/grand.c (g_rand_new): Don't try to use /dev/urandom unless + on Unix. + + * glib/gspawn-win32-helper.c (WinMain): Remove Sleep(10000) + accidentally left in. + +Thu Sep 27 14:26:57 2001 Owen Taylor + + * glib/gstrfuncs.c (g_ascii_strup/down): Use gssize to + match the header. (Reported by Elliot Lee.) + +Wed Sep 26 22:34:12 2001 Owen Taylor + + Fixes for #58195, based on some ideas from Hidetosh Tajima. + + * aclibcharset.m4 glib/libcharset: Add Bruno Haible's + portable-current charset detection code from libiconv. + + * glib/gutf8.c (g_utf8_get_charset_internal): Rewrite + to use _g_locale_charset(). + + * glib/gutf8.c (_g_charset_get_aliases): Private functions + to get aliases from libcharset for a particular canonical + name. + + * glib/gconvert.c: If loading a charset fails, try + aliases to look for fallbacks. + +2001-09-26 Matthias Clasen + + * gmem.c (g_mem_is_system_malloc): Return !vtable_set. + +2001-09-26 Tor Lillqvist + + * configure.in: Retract my change earlier today. Don't preset + autoconf variables in a try to match both mingw and MSVC. Instead, + he who packages a prebuilt GLib developer distribution for Win32 + runs configure twice: once for mingw, once for MSVC, and then uses + diff -D on the glibconfig.h files to generate a suitably ifdeffed + glibconfig.h for distribution that suits both compilers. (Ditto + for config.h, although that file wouldn't be distributed in a + developer package, but in a source package for Win32 users who + want to build GLib but can't use configure.) + + * glibconfig.h.win32.in + * config.h.win32.in: Generated by using diff -D as described above. + + * tests/makefile.mingw.in (.c.exe): Correct name of gthread (import) + library. + +Wed Sep 26 15:33:37 2001 Owen Taylor + + * Makefile.am po/Makefile.in.in: Fix distclean to + remove some extra files. #60993, Ben Gertzfield + +Wed Sep 26 14:37:52 2001 Owen Taylor + + * glib/gen-unicode-tables.pl glib/guniprop.c + glib/{gunibreak,gunichartables,gunidecomp}.h: + Patch from Andrew Taylor to make much of the unicode + table data const so that it can be made read-only + and shared. + +Wed Sep 26 12:41:05 2001 Owen Taylor + + * glib/gstrfuncs.c (g_strdup_vprintf): Copy if + !g_mem_is_system_malloc, not the other way around. + (Found by James Antill.) + +Wed Sep 26 11:00:31 2001 Owen Taylor + + * glib/gstrfuncs.c (g_strnfill): Use memset; might be + faster if someone used this for a biiig string. + (Suggestion from Jakub Jelinek) + +2001-09-26 Tor Lillqvist + + * configure.in: (Win32:) Move the Win32 check closer to the start, + after the BeOS checks. Preset some autoconf variables so that + configure won't find those few headers and functions that gcc + (mingw) pretends to implement (even if the actual C library + doesn't), but MSVC doesn't. This because I want the same config.h + and glibconfig.h to be usable both from gcc and MSVC (as they use + the same C library). Some other minor hackery for this purpose. + + * glibconfig.h.win32.in + * config.h.win32.in: Use versions generated by configure (and + hand-edited slightly). + +2001-09-25 Darin Adler + + * glib/gtree.h: Use gboolean for return value of GTraverseFunc. + +Tue Sep 25 11:34:22 2001 Owen Taylor + + * configure.in: Version 1.3.9 (binary, interface == 0) + + * glib/gstrfuncs.c (g_ascii_strdown): Change g_ascii_strup/strdown + to take a 'len' argument to match g_utf8_strup/strdown. This + hopefully will also make it more obvious that they duplicate + the string rather than acting like g_strup/strdown. + (Suggestion from Matthias Clasen, #59550) + +2001-09-25 Tor Lillqvist + + * configure.in: More Win32 automake macros. For .def files: + GLIB_DEF, GMODULE_DEF, GOBJECT_DEF and GTHREAD_DEF. For .exp + files: TESTGMODULE_EXP (for programs that need to export symbols, + just testgmodule here). A new conditional, MS_LIB_AVAILABLE to + test whether the Microsoft librarian ("ar") is available to build + MS import libraries. + + * glib/Makefile.am + * gmodule/Makefile.am: Use above. New rule to build MS import + library. + + * glib/makefile.msc.in + * tests/makefile.msc.in + * tests/makefile.mingw.in: Use same DLL and import library names as + libtool. + +2001-09-24 Matthias Clasen + + * glib/gutf8.c, glib/gunibreak.c, glib/gunicollate.c, + glib/gunidecomp.c, glib/guniprop.c: Inline doc consistency fixes. + +2001-09-24 Stanislav Visnovsky + + * configure.in: Added "sk" to ALL_LINGUAS. + +2001-09-22 Hans Breuer + + * glib/giowin32.c : simply setting is_readable and is_writeable + to TRUE does make Gimp plug-ins work again. Still no API known + to request this info on Win32 (see #57690) + +2001-09-21 Hans Breuer + + * makefile.msc : added rule for glibconfig.h + + * glib/giowin32.c (g_io_channel_new_file) : always open + in binary mode (fix for #57695) + + * glib/glib.def : updated externals + + * glib/gwin32.c : re-added LANG_* and SUBLANG_* definitions, + which are missing from the msvc 5.0 win32 sdk + + * glib/makefile.msc.in : added gbsearcharry + +Thu Sep 20 20:33:45 2001 Owen Taylor + + * Rename g_mem_vtable_is_set() to g_mem_is_system_malloc(). + +2001-09-20 Tor Lillqvist + + * glib/gutils.c (g_path_is_absolute): (Win32:) Accept also forward + slashes. (But still don't accept them in the other functions + here. This is a thorny issue. Windows in fact does treat / like \ + on input (at least as local directory separators, dunno about + server/share separators). But GLib only has the one + G_DIR_SEPARATOR value, that apps should scan for, and use when + building pathnames. To properly fix this would require totally + abstracting pathnames, and don't having any path name scanning and + building in applications at all. Fat chance.) + (GLIB_LOCALE_DIR): Redefine only on "pure" Win32, not Cygwin. Use + subdirectory "share\locale", as on Unix. + + * glib/gwin32.c: Don't need to define those langiage and + sublanguage constants here, current mingw (w32api) headers have + them. + + * glib/glib.def: Add a few missing entry points. + + * tests/testglib.c (main): Use same name for DLL as libtool does. + Use G_DIR_SEPARATOR in g_path_get_basename tests. + +Wed Sep 19 16:35:22 2001 Owen Taylor + + * glib/gmain.c (g_main_context_find_source_by[_funcs]_user_data): + Fix handling of user data when locating sources. + (#60414, Katsuhiro Okuno) + +Wed Sep 19 14:17:31 2001 Owen Taylor + + Patch from Matthias Clasen (#59806) + + * configure.in: Check for vasprintf(). + + * glib/gmem.[ch]: Add g_mem_vtable_is_set() to be used + for efficiency hacks to avoid extra copies when not + needed. + + * glib/gstrfuncs.c: Use vasprintf() to implement + g_strdup_printf() when available. + + * glib/gmessages.c (g_logv): Avoid using + printf_string_upper_bound() when we have have vsnprintf. + + * glib/gmessages.c (printf_string_upper_bound): Don't + segfault when warning about positional parameters. + +Wzed Sep 19 14:05:27 2001 Owen Taylor + + * glib/{gcache.c,gmem.c,grel.c,gstring.c,gtimer.c,gtree}: + Patch from Darin Adler to remove GReal* structures in + favor of simple opaque typedefs in cases where there + were no non-private members. (#59693) + +Wed Sep 19 13:03:38 2001 Owen Taylor + + * glib/giochannel.c (g_io_channel_read/write_chars): Handle NUL + bytes_written, bytes_read. (Suggested by Joshua N Pritikin, #59550) + +Wed Sep 19 12:49:11 2001 Owen Taylor + + * glib/gutils.c (g_get_any_init): Handle failure of + sysconf and pick a fixed size buffer. (Happens on Cygwin + #60242) + +Wed Sep 19 11:23:41 2001 Owen Taylor + + * configure.in: Error out if gettext support is not found. (#59386) + +2001-09-19 Sebastian Wilhelmi + + * glib/gthread.h (GThreadFunctions): Add thread_equal function to + allow for platform defined function to compare two threads. + + * glib/gthread.c: Use g_thread_functions_for_glib_use.thread_equal + when non-NULL instead of ==. + +Wed Sep 19 10:44:25 2001 Tim Janik + + * Released 1.3.8. + +Tue Sep 18 22:57:33 2001 Tim Janik + + * configure.in (GLIB_MICRO_VERSION): up version number to 1.3.8, + interface age 0, binary age 0. + + * NEWS: updates. + +Tue Sep 18 18:23:02 2001 Owen Taylor + + Fixes for compilation on Solaris (#59026, Frank Belew) + + * glib/gqsort.c (g_qsort_with_data): Use g_alloca(). + + * glib/giochannel.c (g_io_channel_read_to_end): Fix use + of ternary on left-hand-side. + + * configure.in: Handle the ac_cv_working_alloca_h variable + set by autoconf-2.5x. + +Tue Sep 11 18:50:44 2001 Owen Taylor + + * m4macros/glib-gettext.m4 acinclude.m4: Remove commented + out sections for clarity. + +Tue Sep 18 18:19:33 2001 Tim Janik + + * tests/testglib.c: add simple test for g_path_get_basename(). + + * glib/gfileutils.c (g_file_open_tmp): + * glib/gstrfuncs.c (g_strerror): scratch erroneous usages + of "illegal". + +2001-09-18 Tor Lillqvist + + * glib/gmain.c + * glib/giowin32.c: Mark the _funcs tables for export. + + * glib/glib.def: Add here, too. + + * glib/gwin32.c (get_package_directory_from_module): No reason to + check for the module being in a bin or lib directory only when + module_name is non-NULL. + + * glib/gwin32.c (g_win32_get_package_installation_directory): + Check first in HKEY_CURRENT_USER, then in HKEY_LOCAL_MACHINE. + +2001-09-17 Darin Adler + + * tests/strfunc-test.c: (main): Change so that it works + on platforms where isalpha is a macro only, without the + corresponding function that the C standard requires. + Also eliminate the multiple lists of ctype functions. + + * tests/.cvsignore: Ignore the new test. + +2001-09-17 Tor Lillqvist + + * configure.in: Add variable for LT_CURRENT minus LT_AGE (the + suffix used by libtool on Win32 for DLLs). Set variables for the + compiled resource files on Windows. Handle the native Win32 + threads gmodule. + + * glib/Makefile.am + * gmodule/Makefile.am + * gobject/Makefile.am: (Win32) Add hacks to link in the object + file produced from the resource file. Use the lt-compile-resource + script from the build module. The non-hack way would be to teach + libtool, autoconf and automake about .rc files (which are a kind + of source code, after all, that gets compiled to object + files). But then there would be problems with those who don't have + bleeding edge auto* and libtool. + + * glib/glib.def + * gobject/gobject.def: Updates. + + * glib/glib.rc.in + * gmodule/gmodule.rc.in + * gobject/gobject.rc.in + * gthread/gthread.rc.in: Update InternalName and OriginalFilename to + match libtool's naming convention for DLLs. + + * glib/gutils.c: Ditto when constructing the DLL name in the + definition for GLIB_LOCALE_DIR. + + * glib/makefile.mingw.in + * gmodule/makefile.mingw.in + * gobject/makefile.mingw.in + * gthread/makefile.mingw.in: Update import library names. + +Fri Sep 14 20:34:27 2001 Matthias Clasen + + * glib/gconvert.c (g_filename_from_uri): Replace `is contains' + by `contains' in two error messages. (#60395) + +2001-09-10 Ron Steinke + + * glib/giochannel.h glib/giochannel.c: Added a length argument + to g_io_channel_[set,get]_line_term(), allowing embeded nulls + and binary safe line termination strings + + * glib/giochannel.c: Got rid of a compile warning in + g_io_channel_write_chars() + +Mon Sep 10 17:13:36 2001 Tim Janik + + * glib/gmessages.h: got rid of g_set_error_handler(), + g_set_warning_handler(), g_set_message_handler(). + +Mon Sep 10 11:42:58 2001 Owen Taylor + + * glib/gutf8.c glib/gstring.c glib/gfileutils.c glib/gmain.c: + Doc fixes. + +Sat Sep 8 17:14:51 2001 Owen Taylor + + * glib/gfileutils.[ch]: Add g_build_path(), + g_build_filename(), to create separated paths, + suppressing duplicate separators, from varargs + lists. + + * tests/strfunc-test.c: Add tests for g_build_path(), + g_build_filename(). + +Sat Sep 8 14:11:53 2001 Owen Taylor + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add + gbsearcharray.[ch]. + + * glib/glib-object.h: Remove include of gbsearcharray. + +Mon Sep 3 23:29:51 2001 Owen Taylor + + * Version 1.3.7 + + * Makefile.am (EXTRA_DIST): Distribute po/po2tbl.sed.in + + * Makefile.am: Remove references to glib.rc[.in] + + * NEWS: Various additions. + +2001-09-04 Tor Lillqvist + + * README.win32: Update. Don't mention pthreads. + + * build-dll: Remove, moved to the build module. + + * glibconfig.h.win32.in: Don't mention pthreds here, either. + + * glib/gstrfuncs.c: Mark the correct variable for export from DLL. + + * glib/giowin32.c (g_io_win32_msg_create_watch): Owen forgot to + rename the win32_watch_funcs variable here, too. + + * */makefile.mingw.in: Don't use version number in import library + name. Use whole version number in DLL name. Use build-dll from the + build module. + +Tue Sep 4 01:50:24 2001 Tim Janik + + * NEWS: updates for 1.3.7 release. + +Mon Aug 27 14:56:12 2001 Owen Taylor + + * glib/gmain.h: Add closure_marshal/closure_callback + fields to GSourceFuncs for use by g_source_set_closure(). + + * glib/gmain.c glib/giounix.c glib/giowin32.c + glib/gmain.h: Export the SourceFuncs vtables so GObject + can use them to figure out closure callbacks/marshallers + for the default source types. + +Sun Sep 2 13:05:53 2001 Owen Taylor + + * glib/gstrfuncs.c (g_strchomp): Replace some uses + of isspace() with g_ascii_isspace(). + + * glib/gutf8.c glib/gunicode.h glib/gstrfuncs.[ch]: Add + extra indirections to g_utf8_skip and g_ascii_table to + avoid great whopping copy relocs. + +Sun Sep 2 11:10:42 2001 Owen Taylor + + * glib/gen-unicode-tables.pl glib/gunicomp.h + glib/gunichartables.h glib/giounix.c: Fix some variables that + should have been static. + +2001-08-30 Sebastian Wilhelmi + + * glib/gthread.h, glib/gthread.c: Add 'want_to_read' to + GStaticRWLock to avoid calling g_cond_broadcast, when no one is + waiting. + + * glib/gmain.c (g_main_context_add_poll_unlocked): Don't free + cached_poll_array, when adding new poll's. This is taken care for + in g_main_context_iterate. + +2001-08-30 Tor Lillqvist + + After being away for about five months, I'm back working on + this... For now, still using same build setup for Win32. Probably + will change to not including version numbers in the import library + names, though. (But the DLL names would still include them, + possibly even also the micro version number.) That would be more + Unix-like. Also, will have to check out newest mingw tool versions + to see if the build-dll script now can be retired. + + * makefile.mingw + * makefile.msc: New files, no need to generate from .in as + they don't contain references to automake variables. + + * makefile.mingw.in + * makefile.msc.in: Removed. + + * glib.rc.in: Remove + * glib/glib.rc.in: Moved here. + + * Makefile.am + * glib/Makefile.am: Corresponding changes. + + * glib/glib.def: Fix typo, add new entries. + + * glib/gspawn-win32-helper.c: More debugging. Doesn't work + currently (or then it never has on Win2k, which I now use?) + + * glib/gstrfuncs.c + * glib/gstrfuncs.h: Mark g_ascii_table for export/import on Win32. + + * */makefile.mingw.in: Reflect new location of glib library. + +2001-08-30 Michael Natterer + + * glib/giochannel.h: (struct GIOChannel): "gboolean foo : 1" + results in TRUE being -1 once assigned, use "guint foo : 1" + instead. + +2001-08-27 Darin Adler + + * glib/gconvert.h: + * glib/gconvert.c: (g_filename_from_uri): + Updated name of error from G_CONVERT_ERROR_NOT_LOCAL_FILE to + G_CONVERT_ERROR_NOT_ABSOLUTE_FILE_URI. + + * tests/.cvsignore: + * tests/uri-test.c: + Added a lot more test for the new URI functions, including a + number that seem to indicate some minor bugs. + +2001-08-26 Alex Larsson + + * glib/gconvert.[ch] (g_filename_from_uri, + g_filename_to_uri): New functions to convert + between local pahtnames and file: uris. + + * tests/Makefile.am: + * tests/uri-test.c: + Tests for the new functions. + +2001-08-25 Alexander Larsson + + * glib/gstrfuncs.[ch]: + * docs/reference/glib/glib-overrides.txt: + * docs/reference/glib/glib-sections.txt: + * docs/reference/glib/tmpl/string_utils.sgml: + Implement and document g_ascii_isxxx. + + * tests/strfunc-test.c: + Add tests for g_ascii_isxxx + + * glib/guniprop.c (g_unichar_ispunct): + include symbols, not just punctuation. + (g_unichar_isspace): Vertical tab is not + considered whitespace. + + * tests/shell-test.c: + Output errors on stderr + +2001-08-24 Alexander Larsson + + * glib/gconvert.[ch] (g_convert_with_iconv): + New function, doing the same as g_convert but taking + a GIConv argument. The old g_convert is just + a call to this with a newly opened GIConv. + +2001-08-24 Darin Adler + + * tests/shell-test.c: (check_string_result): Fix bad indenting. + I figured I should fix this since I just pointed Alex here to + look at this as an example. + +2001-08-24 Ron Steinke + + * glib/giochannel.c: Matthias Clasen's fix for + the buffer corruption bug by setting outbuf _after_ + the call to g_string_set_size() + + * glib/giochannel.c: kept the buffers from perpetually + growing by subtracting 1 from allocated_len in the calculation + of available space to account for the null at the end of the + buffer + + * glib/giochannel.c: fixed g_io_channel_write_chars() + to not write more than space_in_buf bytes for the UTF-8 case + +Fri Aug 24 11:15:46 2001 Owen Taylor + + * glib/gstrfuncs.c docs/Changes-2.0.txt: Patch from Darin + Adler to restore Glib-1.2 handling of empty strings, + and to fix off-by-one with @max_tokens. (#57663). + Doc improvements. + + * tests/strfunc-test.c: Change tests to correspond to + new behavior of g_strsplit(). + +Thu Aug 23 11:09:58 2001 Owen Taylor + + * glib/ghash.c (g_hash_table_foreach_remove_or_steal): + Patch from Josh Pritikin to fix reversed key and value destroy + functions. (#59433) + + * glib/giochannel.h (struct _GIOChannel): Mark structure + /*< private >*/ + +Thu Aug 23 16:14:17 2001 Tim Janik + + * glib/gmacros.h (G_GNUC_NO_INSTRUMENT): new macro. + +2001-08-21 Abel Cheung + + * configure.in: Added "zh_TW" to ALL_LINGUAS. + +2001-08-20 Sven Neumann + + * Makefile.am: added po to SUBDIRS + +Sun Aug 19 21:32:39 2001 Owen Taylor + + * glib/ghash.c: Eliminate use of floating point when + determining if the hash table needs to be resized, + and also factor out the test from g_hash_table_resize() + to save function calls for the common case. + (#59124) + + * glib/gmain.c (g_main_context_query): Document the + return value. + +2001-08-19 Darin Adler + + * glib/gshell.c: (g_shell_quote): Added missing \ character. + + * tests/shell-test.c: (check_string_result), (test_shell_unquote), + (main): Added tests for g_shell_quote and g_shell_unquote. + +2001-08-19 Fatih Demir + + * configure.in: Added "ta" to the languages list. + +2001-08-19 Havoc Pennington + + * glib/gshell.c (g_shell_unquote): add comment about shell quoting + rules to the docs. + +2001-08-16 Ron Steinke + + * glib/giounix.c: fixed an error in setting close_on_unref + in g_io_channel_new_file () + +2001-08-16 Ron Steinke + + * glib/giochannel.c glib/glib.def glib/giochannel.h: Added + new functions g_io_channel_[set,get]_close_on_unref () + + * glib/giochannel.c: glib/giochannel.h: Documentation fixes + + * glib/giochannel.c: Fixed g_io_channel_write_chars () + so that bytes_written is always set to an appropriate + value when it returns + + * glib/giounix.c: changed g_io_channel_get_flags () to + set the is_readable and is_writeable flags cached + by the channel + +Wed Aug 15 11:09:56 2001 Tim Janik + + * Makefile.am: let the generated .pc files depend on config.status, + so they get correctly remade. + +Sun Aug 12 21:05:13 2001 Tim Janik + + * glib/gmessages.h: fix g_return_if_fail, g_assert and friends to + have a body for G_DISABLE_CHECKS and G_DISABLE_ASSERT. + fixes #58873. + +2001-08-12 Ron Steinke + + * glib/giochannel.c: safer handling of errno, fixed + a bug in an assert + +Sun Aug 12 10:09:00 2001 Owen Taylor + + * tests/iochannel-test.c (main): Find test case for + srcdir != builddir, miscellaneous cleanups. + + * tests/Makefile.am (EXTRA_DIST): Distribute casefold.txt, + casemap.txt iochannel-test-infile. + + * glib-2.0-uninstalled.pc.in: Fix for move of glib files + into subdir. (Pointed out by Steve Baker) + +Sat Aug 4 01:04:08 2001 Tim Janik + + * glib/gscanner.c (g_scanner_unexp_token): fix INT and FLOAT warnings + for invalid token values. + +2001-08-10 Ron Steinke + + * glib/giochannel.c: Fixed a "sense of comparison" bug, + added an assert to check when g_io_channels_read_chars () + is looping endlessly due to encoded_read_buf being corrupted. + +2001-08-06 Sven Neumann + + * glib/gutils.[ch]: added new function g_nullify_pointer(). + +2001-08-05 Ron Steinke + + * glib/giochannel.c glib/giochannel.c glib/glib.def + docs/reference/glib/glib-sections.txt: Added new functions + g_io_channel_[read,write]_unichar () + + * glib/giochannel.h: Finally remembered to remove the + old error message G_IO_CHANNEL_ERROR_PCHAR_FLUSH + + * glib/giochannel.c: Some fixes to g_io_channel_fill_buffer () + and g_io_channel_write_chars () + +2001-08-05 Ron Steinke + + * glib/giochannel.c: Replaced the local use_buf variable with a macro + in most places. This allows us to check some things without worrying + whether we have allocated the read buffers yet, and allows us to allocate + the buffers later in some cases. + + * glib/giochannel.c: Introduced a MAX_CHAR_SIZE macro, which is + supposed to be greater than or equal to the length in bytes + of the longest character in any encoding. This is necessary + to get the minimum buffer size for successful writing. + + * glib/giochannel.c: Fixed g_io_channel_set_encoding () so + that it just prints a warning if partial_write_buf isn't + empty instead of failing. + + * glib/giochannel.c: Fixed several functions so they can accept + NULL parameters for pointers to return values. + + * glib/giochannel.c: Altered the error handling for + g_io_channel_read_chars () to only return an error if + it doesn't have any buffered data. + + * glib/giochannel.c: Rewrote g_io_channel_write_chars () + to fix the error handling and remove duplicate sections + of code. + + * glib/giounix.c: Fixed g_io_channel_new_file () to + call fstat () to set the is_seekable flag, in case someone + uses it on a FIFO. + +Sun Aug 5 08:25:30 2001 Owen Taylor + + * glib/gmacros.h: Include stddef.h so that we use + the system's definition of NULL. (#54730) + +2001-08-04 Alexander Larsson + + * win32-fixup.pl: + Hacky script to fix up your .msc.in files on windows. + Dunno if this is a good solution yet. + + * build/win32/module.defs: + Back down libiconv version to 1.3, since that is what tor distributes. + + * glib/glib.def: + Update + + * gobject/makefile.msc.in: + build gobject-query.exe and gmarshal.strings, add libiconv dependency to linklines. + + * gobject/marshal-genstrings.pl: + New file. perl script to generate gmarshal.strings. + +2001-08-03 Ron Steinke + + * glib/giochannel.c: Fixed g_io_channel_seek_position() + so that G_SEEK_CUR can be used with UTF-8 encoding + + * glib/giochannel.c: Changed test to decide whether + use_buf is encoded_read_buf or read_buf from + "if (channel->do_encode)" to "if (channel->encoding)" to + fix bug 58472 + + * tests/iochannel-test.c: Fixed so it doesn't output + double newlines + + * glib/giochannel.c: Fixed g_io_channel_fill_buffer() + so that encoded_read_buf is created for UTF-8 encoding + +2001-08-03 Darin Adler + + * tests/strfunc-test.c: (strv_check), (main): + Improve strfunc test to test the split function in a way that + demonstrates its idiosyncrasies. + * tests/.cvsignore: + +2001-08-03 Sven Neumann + + * configure.in: beautified configure help output. + + * glib/gtree.c: changed help for g_tree_insert(); it was misleading. + +Fri Aug 3 10:20:10 2001 Owen Taylor + + * glib/guniprop.c (g_unichar_xdigit_value): Fix computation + (Fix from Cesar Rincon) + +2001-08-01 Christopher James Lahey + + * glib/gutf8.c (g_utf8_find_prev_char): Made g_utf8_find_prev_char + able to return the first character of a string. + +2001-07-31 Ron Steinke + + * glib/giochannel.h: Committed this file, which is where + the changes in my previous changelog entry happened, + not giochannel.c + +2001-07-31 Sven Neumann + + * glib/gmem.c: declare gboolean vtable_set static. + +2001-07-30 Ron Steinke + + * glib/giochannel.c docs/reference/glib/glib-sections.txt + tests/iochannel-test.c: removed G_IO_CHANNEL_*_LINE_TERM macros + + * glib/giochannel.c put /**/ and /**/ tags in + the GIOChannel structure + + +2001-07-30 Sebastian Wilhelmi + + * configure.in: #undef inline before testing whether it works to + avoid false positives. Patch from Garry R. Osgood + . Fixes bug #58272. + + * gmodule/gmodule.c (parse_libtool_archive): build the library + name ourselfs ... so we can load the library specified and not + mangle any name not beggining in 'lib'. Patch from Michael Meeks + . Fixes bug #58226. + +2001-07-29 Ron Steinke + + * glib/giochannel.c: Matthias Classen's patch to give + g_io_channel_flush() the correct sense when testing + whether the buffer is empty + * glib/giounix.c: Matthias Classen's patch to set + the mode of a file created with g_io_channel_new_file() + +Sun Jul 29 16:08:17 2001 Tim Janik + + * glib/gscanner.[hc]: removed deprecated g_scanner_stat_mode(). + + * glib/gscanner.c (g_scanner_msg_handler): by default, print scanner + errors and warnings to stderr. + +2001-07-27 Sebastian Wilhelmi + + * glib/gtypes.h: Use G_GNUC_EXTENSION instead of + __extension__. Patch from Pavel Roskin . + +2001-07-26 Darin Adler + + * configure.in: + * m4macros/glib-2.0.m4: + Update location of pkgconfig from sourceforge.net to new + location at freedeskop.org. + +2001-07-26 Michael Natterer + + * gobject/glib-genmarshal.c: added a "release_check" to the + OutArgument structure, which, if present, gets integrated in the + marshaller code and protects us from stuff like + g_object_unref(NULL) on marshaller return values. + +2001-07-23 Padraig O'Briain + + * gobject/gobjectnotifyqueue.c: fix unconditional check of + first GParamSpec in g_object_notify_queue_thaw(); prevent + property notification being lost + +2001-07-23 Ron Steinke + + * glib/giochannel.c: fixed g_io_channel_seek_position() so that + G_SEEK_CUR works for UTF-8 channel encoding, and unallocated + converters are not flushed after the seek; fixed + g_io_channel_get_buffer_condition() so that G_IO_IN is only + set if the read buffer contains at least one full character + +2001-07-23 Sven Neumann + + * Makefile.am: removed glib.def from EXTRA_DIST ... + * glib/Makefile.am: ... and added it here. + +2001-07-22 Hans Breuer + + * glib/giochannel.c (g_io_channel_get_buffer_condition) : make + the code actually have an effect (Use |= to set bits). Not + absolutely sure if is the right one. + + * glib/giowin32.c (g_io_win32_) : don't modify + watch->condition but restored the previous behaviour. + Now gio-test as well as The Gimp work again ... + +2001-07-21 Hans Breuer + + * glib/giowin32.c (g_io_channel_new_file) : set the + corresponding p(ermission)mode of the file when creating, + otherwise a wronly file couldn't be overwritten (at least + not on Win9x). + +2001-07-21 Hans Breuer + + * glib/giowin32.c : intial implementation of new API functions. + Not sure if it behaves as intended ... + + * glib.def : removed, glib/glib.def is the file used since moved + * glib/glib.def : updated + + * tests/makefile.msc : added iochannel-test + +Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke + + * glib/giochannel.c: API changes, fixes to + error handling, some internal restructuring + * glib/giochannel.h: API changes, documentation for + elements in GIOChannel structure + * glib/giounix.c: Matched API changes, implemented + backend to set is_readable, is_writeable, is_seekable + flags, added a test to catch large values of count + for which the behavior of write() is undefined + * glib/giowin32.c: Changed to match new prototypes for + io_close() and io_seek(), removed references to + G_IO_STATUS_INTR, set is_seekable flag in channel + creation functions + * glib.def: Renamed g_channel_error_quark() and + g_channel_error_from_errno() to g_io_channel_error_quark() and + g_io_channel_error_from_errno(); added new functions + g_io_channel_get_buffered() and g_io_channel_set_buffered() + * docs/reference/glib/glib-sections.txt: Modified iochannel + section to reflect new functions and API changes + * tests/iochannel-test.c: Fixed to work with API changes + * tests/iochannel-test-infile: New file; input file + for iochannel-test + * tests/unicode-collate.c tests/unicode-normalize.c: + Changed G_IO_FILE_MODE_READ to "r" to match API change + +Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke + + * gobject/glib-genmarshal.c: modified to create header files + using G_[BEGIN,END]_DECLS instead of #ifdef __cplusplus ... + +Fri Jul 20 14:11:29 2001 Owen Taylor + + * glib/gutf8.c glib/gunidecomp.c: s/size_t/gsize/ to match + prototypes. + +Thu Jul 19 16:05:21 2001 Owen Taylor + + * glib/gcompletion.c (g_completion_complete): Fix memory + leak and dubious list manipulation. (Found by + Ron Koerner, #53408) + + * glib/gfileutils.c (get_contents_stdio): Call fclose() + on FILE * on error. (#57057) + +2001-07-20 Hans Breuer + + * glib/glib/giowin32.c : make it compile again + + * glib/glib.def : updated exports + + * glib/makefile.msc.in : + * glib/makefile.mingw.in : + * tests/makefile.msc.in : reflect glib move + + * tests/mainloop-test.c : #include for _pipe() + + * tests/gio-test.c : casts for strict compiler settings + + * makefile.msc.in : new master makefile reflecting the glib + move. The '.in' isn't really needed anymore, because there + is no version number in it + +2001-07-19 Darin Adler + + * glib/gstrfuncs.c: (g_ascii_strdown), (g_ascii_strup): Add + missing const. + (g_strsplit): Add g_return_val_if_fail for case of empty + delimiter, which can result in an infinite loop otherwise. + * glib/gstrfuncs.h: Add missing const. + * tests/.cvsignore: Ignore a generated file. + + * tests/array-test.c: + * tests/dirname-test.c: + * tests/hash-test.c: + * tests/list-test.c: + * tests/node-test.c: + * tests/relation-test.c: + * tests/shell-test.c: + * tests/slist-test.c: + * tests/spawn-test.c: + * tests/strfunc-test.c: + * tests/string-test.c: + * tests/testglib.c: + * tests/tree-test.c: + * tests/type-test.c: + Add an #undef G_DISABLE_ASSERT so all tests will assert even if + asserts are disabled inside glib itself. + +Fri Jul 13 19:20:06 2001 Owen Taylor + + * glib/gstring.c (g_string_insert/append/prepend_unichar): + Add functions to insert a unichar as UTF-8, since this + is reasonably common. + + * glib/gutf8.c glib/gunicode.h (g_utf8_get_char_validated): + New function exposing iterating through possibly invalid/incomplete + UTF-8 to unicode to the outside world. + + * glib/gutf8.c (g_utf8_get_char_extended): Fix max_len argument + to be gssize, not gsize. + +2001-07-17 Kjartan Maraas + + * configure.in: Added "nn" to ALL_LINGUAS. + +2001-07-17 Sebastian Wilhelmi + + * glib/gmain.c: Add some assertions. Simplify and fix + g_main_context_release(). Fix some locking bugs in + g_main_loop_run(). + +2001-07-12 Mark Murnane + + * glib/gmessages.c: Changed prototype of printf_string_upper_bound + to return gsize. Now matches the actual function body. + + * glib/gstrfuncs.c (g_strrstr_len): Changed type of parameter #2 + from gint to gssize. Now matches the prototype in gstrfuncs.h. + +2001-07-11 Darin Adler + + * .cvsignore: Add some generated files. + + * glib/gmain.c: (g_main_context_iterate): Comment out cruft + after #endif to avoid gcc warning. + * gmodule/gmodule.c: (g_module_set_error_unduped): Remove + const from type to avoid gcc warning. + * gobject/gsignal.c: (g_signal_emitv): ifdef variable used + only if G_ENABLE_DEBUG to avoid gcc warning. + * gobject/gtype.c: (type_iface_vtable_init_Wm), + (type_iface_vtable_finalize_Wm): ifdef call needed only + if !G_DISABLE_ASSERT to avoid gcc warning. + * tests/testglib.c: (main): ifdef call needed only if + !G_DISABLE_ASSERT to avoid gcc warning. Maybe later we + should make the test to #undef G_DISABLE_ASSERT. + * tests/unicode-collate.c: Add include of to + avoid gcc warning. + +Wed Jul 11 11:13:50 2001 Owen Taylor + + * glib/Makefile.am (libglib_1_3_la_SOURCES): Add gunicomp.h + (Reported by Sven Neumann). + + * glib/guniprop.c (g_utf8_str/updown) glib/gunicollate.c + (g_utf8_collate_key): Fix shadowing problems reported by + many (D. Adler, S. Neumann, M. Murmane, L. Peter) + +Fri Jul 6 00:02:41 2001 Tim Janik + + * glib/gmessages.c (printf_string_upper_bound): fix negative exponent + handling (numbers<0). + + * glib/gutils.h (g_bit_storage): take a gulong as argument. + same for g_bit_nth_lsf() and g_bit_nth_msf() as mask. + +2001-07-08 Martin Baulig + + * tests/unicode-normalize.c, tests/unicode-collate.c: + Reflect latest g_io_channel_new_file() API changes, use + G_IO_FILE_MODE_READ instead of "r". + +Fri Jul 6 22:34:32 2001 Owen Taylor + + * glib/gunicode.h glib/gunidecomp.c glib/guniprop.c + glib/gunicollate.c: Add length arguments to + g_utf8_{strup,strdown,casefold,collate_key}. + + * glib/gdate.c: Fix for above. + +2001-07-06 Pablo Saratxaga + + * configure.in: added Basque (eu) to ALL_LINGUAS + +Mon Jul 2 19:48:52 2001 Andrew Lanoix + + *giowin32.c: g_source_remove()ing an socket iochannel closes + the socket when it should not. Patch by Peter Zelezny + + + *giowin32.c: Fix a few typos + +Mon Jul 2 16:03:21 2001 Owen Taylor + + * glib/giochannel.c (g_io_channel_get_buffer_condition): Fix. + + * glib/giunix.c: Fix prepare/check/dispatch for watches. + + * tests/unicode-normalize.c: #include + +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + +Sun Jul 1 20:16:25 2001 Owen Taylor + + * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS + rather than a custom macro. + + * glib/gen-unicode-tables.pl: Adapt to changes in table + formats for Unicode 3.1 + + * glib/gunicode.h glib/guniprop.c glib/gunichartables.h + glib/gen-unicode-tables.pl: Add case conversion functions + g_utf8_casefold, g_utf8_strup, g_utf8_strdown. + + * tests/unicode-caseconv.c tests/gen-casefold-txt.pl + tests/gen-casemap-txt.pl tests/casefold.txt + tests/casemap.txt: Test cases for case conversion. + + * glib/gunicode.h glib/gunidecomp.[ch] glib/gunicomp.h + glib/gen-unicode-tables.pl: Add function to do Unicode + normalization g_utf8_normalize(). + + * tests/unicode-normalize.c: Test program for case conversion. + + * glib/gunicode.h glib/gunicollate.c: Add collation functions + g_utf8_collate, g_utf8_collate_key. + + * test/unicode-collate.c: Test program for collation. + + * glib/gdate.c (g_date_fill_parse_tokens): Fix uninitialized + variable. + + * glib/gdate.c (g_date_strftime) docs/Changes-2.0.txt: + Make work with UTF-8 even if the locale isn't UTF-8 based. + Still somewhat of broken, if the format string contains + characters not representable in the current locale, will warn + and not work. + + * glib/gdate.c: Use UTF-8 normalization and casefolding. + +Sat Jun 30 16:03:16 2001 Owen Taylor + + * glib/giowin32.c glib/giounix.c glib/gmain.[ch]: + Rename GSourceFuncs::destroy to GSourceFuncs::finalize. + (#56858) + +Sat Jun 30 15:49:10 2001 Owen Taylor + + * glib/gmain.[ch]: (Mostly patch from Sebastian Wilhemi) + Make some changes to the way that GMainContext works: + + - a GMainContext is no longer associated with a single + thread, but any thread can acquire ownership + of thread and iterate. + + - There is a facility g_main_context_wait() for + non-owner-threads to wait either for ownership + or for a condition to be broadcast. + + - For efficiency, GMainLoop just piggybacks of + of the loops mutex / condition instead of + having a separate mutex/condition for each + GMainLoop. + + * glib/gthread.[ch]: Remove hacks to store the thread's + GMainContext in the GThread structures, since we + no longer have the GMainContext <=> GThread correspondence. + + * glib/gmain.[ch]: Make g_main_context_wakeup() public + so someone could completely duplicate GMainLoop + with the public API. + + * tests/mainloop-test: Fix up to the new API. Decidedly + doesn't work at the moment, but that may be the IO + channel changes, or preexisting locking problems. + +Sat Jun 30 13:18:28 2001 Owen Taylor + + * glib/gstrfuncs.c glib/gstring.h: Try compiling + before committing, why don't you? Simple fixes + for my stupid typos. + +Sat Jun 30 12:49:26 2001 Owen Taylor + + Patch from Darin Adler (#54166) + + * glib/gstrfuncs.[ch]: Add ascii-only, locale-insensitive + g_ascii_to[lower/upper], g_ascii_str[down/up], + g_ascii_is[upper/lower] and deprecate the locale-affected + versions which break for UTF-8, etc. Make + g_ascii_strup/strdown duplicating, + not in-place for consistency with UTF-8 functions. + + * glib/gstring.[ch]: Add ascii-only, locale-insensitive + g_string_ascii_[down/up], and deprecate the locale-affected + versions which break for UTF-8, etc. + + * glib/gutils.c glib/gwin32.c test/testglib.c: Use + the g_ascii_* functions where appropriate. + +Fri Jun 29 13:36:39 2001 Owen Taylor + + * glib/gstring.[ch] (g_string_set_size): Add function to + allow setting the length of a string greater than the + current length (for buffering usage) + + * glib/gstring.[ch]: Expose string->allocated_len, since + that is useful when using GString simply as a buffer. + (Renamed from string->alloc) + + * glib/giochannel.[ch] glib/giounix.c glib/giowin32.c: + Major patch from Hidetoshi Tajima and Ron Steinke + reworking GIOChannel to have: + + - Buffering + - Sane and useful error reporting + - Streaming encoding conversion with iconv + - Convenience functions to read by lines or + an entire file. + + Also fix remaining 64 bit cleanliness issues. + + * tests/iochannel-test.c tests/Makefile.am: Test case + for IO channel streaming conversion. Still needs + some fixing up. + +Thu Jun 28 16:57:44 2001 Tim Janik + + * configure.in (GLIB_MICRO_VERSION): up version number to 1.3.7, + interface age 0, binary age 0. + +2001-06-27 Kjartan Maraas + + * glib/gmarkup.c: Fix a typo. + +2001-06-27 Sebastian Wilhelmi + + * Makefile.am, configure.in: Removed glib-config-2.0, as we have + pkg-config now. + + * glib/Makefile.am: Added -I$(top_srcdir) for builddir != srcdir. + + * Makefile.am: Removed gen-unicode-tables.pl from EXTRA_DIST. + +Tue Jun 26 11:43:46 2001 Owen Taylor + + * configure.in Makefile.am *.[ch] glib/*.[ch] glib/Makefile.am: + Move glib library into a subdirectory, make all GLib include + files include as + + * tests/testglib.c tests/testgdate.c tests/testgdateparser.c + tests/timeloop.c tests/timeloop-basic.c: Move all tests into + the tests/ subdirectory. + +Sat Jun 23 17:34:38 2001 Tim Janik + + * gmessages.c (g_logv): use G_BREAKPOINT() instead of raise(5). + +Wed Jun 20 12:00:54 2001 Owen Taylor + + Changes for 64-bit cleanliness, loosely based on patch + from Mark Murnane. + + * gconvert.c (g_convert/g_convert_with_fallback): Remove + workarounds for since-fixed GNU libc bugs. Minor + doc fix. + + * gconvert.[ch]: Change gint to gsize/gssize as + appropriate. + + * gconvert.c (g_locale/filename_to/from_utf8): Fix incorrect + computation of bytes_read / bytes_written. + + * gfileutils.[ch] (g_file_get_contents): Make length + out parameter 'gsize *len'. + + * ghook.c (g_hook_compare_ids): Don't compare a + and b as 'a - b'. + + * gmacros.h (GSIZE_TO_POINTER): Add GPOINTER_TO_SIZE, + GSIZE_TO_POINTER. + + * gmain.c (g_timeout_prepare): Rewrite to avoid + overflows. (Fixes bug when system clock skews + backwards more than 24 days.) + + * gmarkup.[ch]: Make lengths passed to callbacks + gsize, length for g_markup_parse-context_parse(), + g_markup_escape_text() gssize. + + * gmessages.[ch] (g_printf_string_upper_bound): Change + return value to gsize. + + * gmessages.c (printf_string_upper_bound): Remove + a ridiculous use of 'inline' on a 300 line function. + + * gstring.[ch]: Represent size of string as a gsize, + not gint. Make parameters to functions take gsize, + or gssize where -1 is allowed. + + * gstring.c (g_string_erase): Make + g_string_erase (string, pos, -1) a synonym for + g_string_truncate for consistency with other G* + APIs. + + * gstrfuncs.[ch]: Make all functions taking a string + length, take a gsize, or gssize if -1 is allowed. + (g_strstr_len, g_strrstr_len). Also fix some boundary + conditions in g_str[r]str[_len]. + + * gutf8.c tests/unicode-encoding.c: Make parameters that + are byte lengths gsize, gssize as appropriate. Make + character offsets, other counts, glong. + + * gasyncqueue.c gcompletion.c + timeloop.c timeloop-basic.c gutils.c gspawn.c. + Small 64 bit cleanliness fixups. + + * glist.c (g_list_sort2, g_list_sort_real): Fix functions + that should have been static. + + * gdate.c (g_date_fill_parse_tokens): Fix extra + declaration that was shadowing another. + + * tests/module-test.c: Include string.h + +Mon Jun 18 15:43:29 2001 Owen Taylor + + * gutf8.c (g_get_charset): Make argument + G_CONST_RETURN char **. + +2001-06-22 Andrew Lanoix + + *giowin32.c: Debug and partial rewrite of async socket code + on windows, which fixes major MT issues. Some test code kindly + provided by wroberts1@home.com. + +Thu Jun 14 14:09:46 2001 Owen Taylor + + * gstrfuncs.c (g_strconcat): Fix a use of strcat that + wasn't replaced with g_stpcpy in the original + stpcpy-for-efficiency patch. + +2001-06-11 Havoc Pennington + + * NEWS: updated + + * configure.in (GLIB_MICRO_VERSION): increment version to 1.3.6 + +2001-06-08 Alex Larsson + + * gstrfuncs.[ch]: + Added new functions g_strstr_len, g_strrstr and g_strrstr_len + + * tests/strfunc-test.c: + Add some tests for the new functions. + + * gunicode.h: + * gutf8.c: + Add length argument to g_utf8_strchr and g_utf8_strrchr. + +2001-06-08 Havoc Pennington + + * gspawn.c: support G_SPAWN_FILE_AND_ARGV_ZERO specifying that + the vector passed in to g_spawn_* contains a filename to + execute in argv[0] then the actual argv begins at argv + 1. + Kind of a lame hack, but this isn't something you commonly want + to do, and avoids adding more function arguments. + +2001-06-08 Pablo Saratxaga + + * configure.in: Added Azeri (az) to ALL_LINGUAS + +2001-06-08 Sebastian Wilhelmi + + * docs/Makefile.am, configure.in: Remove docs/glib-config.1.in. + + * gthread-2.0-uninstalled.pc.in (Cflags): Add @G_THREAD_CFLAGS@. + +2001-06-07 Havoc Pennington + + * m4macros/glib-2.0.m4: subst GLIB_GENMARSHAL, GOBJECT_QUERY, + GLIB_MKENUMS variables + + * gmodule-2.0.pc.in: add gmodule_supported variable + + * glib-2.0.pc.in: add glib_genmarshal, gobject_query, + glib_mkenums variables + + * configure.in: put G_MODULE_SUPPORTED value into + .pc files + + * autogen.sh: support AUTOGEN_SUBDIR_MODE + + * Makefile.am: add -uninstalled.pc.in to EXTRA_DIST + +2001-06-07 Sebastian Wilhelmi + + * configure.in: Look for nanosleep function. + + * gtimer.c: Use nanosleep for g_usleep, when found. + + * gtimer.c, gtimer.h: Add g_time_val_add function. Closes #54271. + + * gasyncqueue.c: Documentation updates. + + * gthreadpool.c: Use g_time_val_add now that we have it. + +2001-06-01 Jon Trowbridge + + * gdate.c (g_date_update_julian): Changed to take a const + argument, and then to cast out const. + (g_date_update_dmy): Changed to take a const argument, and then + cast out const. + (g_date_get_weekday): Changed argument to be const. + (g_date_get_month): Changed argument to be const. + (g_date_get_year): Changed argument to be const. + (g_date_get_day): Changed argument to be const. + (g_date_get_julian): Changed argument to be const. + (g_date_get_day_of_year): Changed argument to be const. + (g_date_get_monday_week_of_year): Changed argument to be const. + (g_date_get_sunday_week_of_year): Changed argument to be const. + (g_date_compare): Changed arguments to be const. + (g_date_to_struct_tm): Changed GDate argument to be const. + (g_date_strftime): Changed GDate argument to be const. + (g_date_clamp): Added. The equivalent of the CLAMP macro for + GDates. + (g_date_order): Added. Ensure that the first GDate argument + preceeds the second, swapping them if necessary. + (g_date_days_between): Added. Computes the (signed) number of days + between two dates. + +Mon Jun 4 16:02:57 2001 Owen Taylor + + * gstrfuncs.c (g_strup/strdown): to match g_strcasecmp, + check if it is lower/upper before converting to upper/lower + [ not required by ISO... ] (#55682, Jon Trowbridge) + +Mon Jun 4 15:59:15 2001 Owen Taylor + + * gunicode.h: Make a bit more standalone by adding include + of gerror.h. #54543. + + * gunicode.h: Change size_t to g_size. (Ugh) + +2001-05-31 Sebastian Wilhelmi + + * grand.h (g_random_boolean, g_rand_boolean): Fix to stupid bug in + g_random_boolean, also both functions now return 1 or 0 instead of + 1<<15 or 0. + + * tests/rand-test.c: Extended testcases. + + * configure.in: Remove G_HAVE_ISO_CXX_VARARGS and + G_HAVE_ISO_C_VARARGS and define G_HAVE_ISO_VARARGS directly + guarded by #if(n)def __cplusplus. + +2001-05-30 Sebastian Wilhelmi + + * gthread-2.0.pc.in: Add @G_THREAD_CFLAGS@ to Cflags. + +Tue May 29 18:17:11 2001 Owen Taylor + + * autogen.sh (have_libtool): Fix GNU sedism + +2001-05-29 Sebastian Wilhelmi + + * tests/Makefile.am, tests/qsort-test.c: Add test case for the + g_qsort_with_data func. It works. This fixes bug #52605. + + * tests/Makefile.am, tests/cxx-test.C: Now that we check for a C++ + compiler in configure.in anyway, I added a test, that the GLib + headers can be inclued into a C++ program. This fixes bug #52605. + + * configure.in: Don't bail out, if no C++ compiler is + found. Define G_HAVE_ISO_VARARGS only if appropriate. + + * gmessages.h: Thus we can revert the previous patch. + +2001-05-29 James Henstridge + + * gmessages.h: "#ifdef G_HAVE_ISO_VARARGS" will always succeed + even when we don't have ISO vararg support. Changed to + "#if G_HAVE_ISO_VARARGS". + +Mon May 28 11:40:34 2001 Owen Taylor + + * configure.in: Check for __VARARGS__ separately for C and C++. + +2001-05-28 Sebastian Wilhelmi + + * configure.in: Fix typo. + +Sun May 27 05:09:18 2001 Tim Janik + + * gmain.c (g_main_context_prepare): unlock context when bailing + out with a warning. + (g_main_context_check): same here. + + * gmain.c (g_main_context_check): before returning due to + changed pollfds, unlock context. + +Thu May 24 21:24:16 CEST 2001 Paolo Molaro + + * gmarkup.c: back out change by mitch@convergence.de and apply patch in + bug id #52067 that fixes the same problem in a more complete manner. + This fixes also a segfault for a malformed XML file and adds a new + test case. + +2001-05-24 Hans Breuer + + * grel.c : reflect renaming of g_string_sprintfa to g_string_printfa + + * makefile.msc.in : create an additional static lib to be used from + (at least) glib-genmarshal + +2001-05-23 Sebastian Wilhelmi + + * garray.c (g_array_remove_index_fast): Tiny speed improvement + suggested by noon@users.sourceforge.net. + +2001-05-22 Sebastian Wilhelmi + + * config.h.win32.in: Removed POSIX_*. Defined G_THREAD_SOURCE to + "gthread-win32.c". + + * glibconfig.h.win32.in: Define G_HAVE_ISO_VARARGS for gcc, don't + know about MSC. Define G_THREADS_IMPL_WIN32 instead of + G_THREADS_IMPL_POSIX and define the right static mutex macros and + types. + + * glib.def: g_thread_create renamed to g_thread_create_full. + + * gthread.c: memcpy is not necessary here. We can simply use + struct assignment. + + * gmessages.c: Fix compilation error on win32. Added + GFileDescriptor, wich is gint on Unix and FILE* on win32. + +2001-05-21 Andrew Lanoix + + *giowin32.c: G_IO_WIN32_WINDOWS_MESSAGES channels + not handled correctly in g_io_win32_check() + +Sun May 20 10:47:47 2001 Owen Taylor + + * configure.in: Fix some problems in writing out varargs + tests in configure.in + +Fri May 18 10:52:23 2001 Owen Taylor + + * configure.in gmessages.h: Use compile checks for ISO C99 and GNU + extension varargs macros syntax and store result in glibconfig.h + (G_HAVE_ISO_VARARGS, G_HAVE_GNUC_VARARGS) rather than relying + on checking predefined macros. + +2001-05-18 Michael Natterer + + * gmarkup.c: don't g_strdup()/g_free() all parsed attributes and + their values twice but simply copy the string pointers from the + GMarkupAttribute struct to the string arrays before passing them + to start_element(). + +2001-05-18 Sebastian Wilhelmi + + * gthread.c, gthread.h: Renamed g_thread_create to + g_thread_create_full and added macro g_thread_create, which omits + 'stack_size', 'bound' and 'priority' parameters. Also removed + 'bound' from GThread struct. + + * gthreadpool.h, gthreadpool.c: Adapted GThreadPool to the above + changes. GThreadPool lost the 'priority' and 'bound' + members. g_thread_pool_new the 'stack_size', 'bound' and + 'priority' parameters. + + * tests/mainloop-test.c, tests/thread-test.c, + tests/threadpool-test.c: Adapted to the above changes. + + * gmem.c (g_mem_profile): Fixed mutex deadlock. + +2001-05-17 Sebastian Wilhelmi + + * makefile.mingw.in: Add gpattern.o to objects. + + * glib.def: Export g_thread_exit as well. + + * Makefile.am: Fix BUILT_EXTRA_DIST exporting. + +Sun May 13 10:31:17 2001 Owen Taylor + + * glib/Makefile.am gobject/Makefile.am gmodule/Makefile.am: + Add inter-library dependencies. + + * acinclude.m4: Remove libtool macros. + + * autogen.sh: Require libtool-1.4, automake-1.4p1. + +2001-05-15 Havoc Pennington + + * configure.in (AC_OUTPUT): m4macros/Makefile + + * m4macros/Makefile.am, m4macros/glib-2.0.m4, + m4macros/glib-gettext.m4: + m4 files moved here on server, Makefile.am added + + This is so you can aclocal -I m4macros while avoiding acinclude.m4 + + * Makefile.am: add m4macros subdir, remove references to glib-2.0.m4 + +2001-05-14 Havoc Pennington + + * gutf8.c (g_utf8_get_char): fix docs; they said we validated + the UTF-8, but we can't possibly detect partial chars since + there's no length arg here, so trying to use this function + on invalid UTF-8 is a bad idea. + +Thu May 10 23:21:30 2001 Owen Taylor + + * gmessages.c (g_log_write_prefix): Avoid using stdio + to be as robust as possible in out-of-memory. + + * gmessages.c (g_log_default_handler): Remove some dead + code. + + * gutils.c (g_parse_debug_string): Fix to avoid mallocs. + +Fri May 11 18:25:23 2001 Tim Janik + + * gdataset.c: + (g_dataset_foreach): + (g_datalist_foreach): make these safe against removal of the + current element. + +2001-05-10 Havoc Pennington + + * gmessages.c (g_log_write_prefix): change env variable to + G_MESSAGES_PREFIXED, suggested by Tim + +Thu May 10 15:19:01 2001 Tim Janik + + * gscanner.c (g_scanner_key_hash): use g_str_hash() algorithm + to generate hashes. + + * gmem.c (standard_calloc): free() doesn't return a value + (Mark Murnane). + +2001-04-26 Havoc Pennington + + * configure.in: Get rid of --enable-msg-prefix + + * gmessages.c: make whether to prefix the messages with + appname/pid a runtime setting, not a compile-time setting. Change + default to include prefix for debug/warning/error type messages. + +2001-05-09 Sebastian Wilhelmi + + * gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and + 'thread_func' to 'func' to make it more consistent with the rest + of GLib. + + * gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public + members of GThreadPool to the private ones. Renamed 'thread_func' + to 'func' as above. Moved up 'user_data' in g_thead_pool_new + argument list and in GThreadPool struct. + +Tue May 8 15:33:31 2001 Tim Janik + + * gcompletion.h: removed #include sneaked in by + sopwith in november. + +2001-05-08 Sebastian Wilhelmi + + * gmain.c, gthread.c, gthread.h: Moved func and arg members from + GRealThread to GThread, such that they can be accessed by the + user. + + * gthread.c, gthread.h: Due to popular demand (Tim being the + populus here ;-) threads now have a 'return value', which is + returned by g_thread_join and is either the return of the topmost + thread function or the value given to g_thread_exit. + + * gthreadpool.c, tests/mainloop-test.c, tests/thread-test.c: + Adapted to the above change. + +2001-01-06 Hans Breuer + + * glib.def : don't try to export g_strcpy, it is g_stpcpy; + updated and added some tweaking for functions which got + renamed recently, to avoid the update hassle if it can + simply be done compatible. Should vanish if there is a + stable version for win32. + +Fri May 4 11:49:18 2001 Owen Taylor + + * Released 1.3.5 + + * NEWS: Updated + + * configure.in (GLIB_MICRO_VERSION): Up version to 1.3.5, + interface/binary age 0. + +2001-05-04 Sven Neumann + + * ghash.c: fixed a typo in a comment. + + * gtree.[ch]: added new functions g_tree_new_full(), g_tree_replace(), + g_tree_steal() and g_tree_foreach() to adapt GTree to the GHashTable + API. Moved comments into the C file. + + * docs/reference/glib/glib-sections.txt + * docs/reference/glib/tmpl/glib-unused.sgml + * docs/reference/glib/tmpl/hash_tables.sgml + * docs/reference/glib/tmpl/linked_lists_double.sgml + * docs/reference/glib/tmpl/linked_lists_single.sgml + * docs/reference/glib/tmpl/macros_misc.sgml + * docs/reference/glib/tmpl/trees-binary.sgml: updated documentation + +Thu May 3 06:38:28 2001 Owen Taylor + + * g[s]list.c (g_[s]list_foreach) docs/Changes-2.0.txt: Make + foreach() safe against removal of the _current_ element. While + this could break some code, the new behavior is consistent with + the rest of GLib/GTK+ and probably is what people expect in most + cases. (Suggested by Paul Kuykendall, #50071) + +Wed May 2 11:10:22 2001 Owen Taylor + + * gutf8.c (g_utf8_to_ucs4_fast): Fix read past end of the string. + (#50404, fix from Jonas Borgström) + +Sun Apr 29 00:37:34 2001 Tim Janik + + * ghook.[hc]: made hook ids a gulong. + +2001-04-20 Dan Winship + + * configure.in: Add a check for the Darwin dynamic linker. Use + AC_TRY_LINK when checking for "nonposix getpwuid_r" so it notices + "no getpwuid_r" correctly. + + * testglib.c (main): Make template[] bigger to prevent an overrun. + Remove an unused variable. Initialize error to NULL. + + * tests/gio-test.c (main): Add a cast to prevent a warning when + size_t is a long. + + * tests/type-test.c (main): Add an #ifdef to prevent a warning + when G_HAVE_GINT64 is defined and G_GINT64_FORMAT isn't. + +2001-04-19 Sebastian Wilhelmi + + * ghash.c, ghash.h: Remove definition of g_hash_table_freeze and + g_hash_table_thaw. Instead added G_DISABLE_DEPRECATED-guarded + macros to ghash.h to go along the lines of the standard. + + * gscanner.c, gscanner.h: Dito for g_scanner_freeze_symbol_table + and g_scanner_thaw_symbol_table. + + * gutils.c, gutils.h: Dito for g_dirname. g_basename is still + defined in gutils.c, but declared ing gutils.h only + G_DISABLE_DEPRECATED-guarded. + + * configure.in: Removed bashism in test for the pkg-config + version. + + * configure.in: Rewrote test for multithread flag. Now uses + localtime_r, which hopefully has a consistent prototype across + different platforms. Also it uses a clever double EGREP trick + instead of compiling, which could give false positives. Thanks to + Dan Winship for the hint. + +Wed Apr 18 17:35:38 2001 Owen Taylor + + * gutils.c (_glib_gettext): Add missing static pointed + out by Michael Meeks. + +Wed Apr 18 09:37:07 2001 Owen Taylor + + * MAINTAINERS: Removed. Keeping README, README.cvs-commits + HACKING, and AUTHORS up to date is plenty without extra + random files that someone thought a module should have. + (Actually, I believe this was used for debbugs in the past.) + +Tue Apr 17 11:47:07 2001 Owen Taylor + + * Released 1.3.4 + + * NEWS: Updated + +Tue Apr 17 10:43:36 2001 Owen Taylor + + * gstrfuncs.c: Define _GNU_SOURCE for stpcpy + + * tests/mainloop-test.c (main): Wait for all threads + to start before beginning tests. + +2001-04-17 Sebastian Wilhelmi + + * gthreadpool.c (g_thread_pool_thread_proxy): Until now every + thread pool always had at least one tread waiting to avoid + switching overhead in case a new task would be added soon after + one finished. This however means a big waste of threads, if many + mostly inactive thread pools are involved. Now such a waiting + thread will only wait for half a second (This value is of course + very randomly picked) and go to the global threadpool afterwards. + +Mon Apr 16 12:04:52 2001 Owen Taylor + + * configure.in: Remove warnings about conflicts with the + stable version. + + * glib-2.0.m4: Fix some of the error text to be halfway + up to date. + + * README.in INSTALL.in: Add these to generate README, INSTAL + (as in the stable branch). Update. + + * HACKING: Update. + +2001-04-16 Havoc Pennington + + * gqsort.c: docs + + * gfileutils.c: docs + + * gwin32.c: docs fixes + + * gconvert.c: docs + + * guniprop.c: docs + + * gutf8.c: docs + +2001-04-16 Havoc Pennington + + * glib-2.0.m4: put AC_PATH_PROG(pkg-config) before "Checking for + glib" so the output looks right + +2001-03-23 Havoc Pennington + + * gutils.c (g_parse_debug_string): make GDebugKeys argument + const + +2001-04-14 Hans Breuer + + * glib.def : + * makefile.msc.in : updated + + * gpattern.c : include "gutils.h" to resolve the inline hassle + +2001-04-11 Alexander Larsson + + * glib-2.0.m4: Pass pkg-config options + before the other args so it works even if + POSIXLY_CORRECT is set. + +Mon Apr 9 18:57:44 2001 Tim Janik + + * configure.in: increment version to 1.3.4 (binary 0, interface 0). + +2001-04-05 Christian Rose + + * configure.in: Added sv to ALL_LINGUAS. + +Wed Apr 4 09:18:55 2001 Tim Janik + + * Released GLib-1.3.3. + +Tue Apr 3 20:22:59 2001 Tim Janik + + * NEWS: updates. + + * NEWS.pre-1-3: take over old news. + +Tue Apr 3 12:38:16 2001 Owen Taylor + + * glib-config-2.0.in: Exit with an error message that you + should use pkg-config instead. + + * configure.in (PACKAGE): Require pkg-config. + + * tests/Makefile.am (EXTRA_DIST): Add utf8.txt. + + * configure.in (GLIB_MICRO_VERSION): Up MICRO to 3, + leave interface/binary at 0. + +Tue Apr 3 13:46:22 2001 Tim Janik + + * glist.[hc]: added g_list_nth_prev() which walks ->prev instead + of ->next. + + * gpattern.[hc]: added shell-style pattern matching code from beast, + derived from the gtk_pattern_*() code, but with a couple of bug fixes + and a number of optimizations. + +2001-04-03 Sebastian Wilhelmi + + * gthreadpool.c: Added documentation. + + * gthreadpool.c: The global thread pool now also is seperated for + bound and unbound threads. Only threads with standard stack size + go to the global pool. g_thread_pool_new now protects the global + setup of inform_mutex etc. with a lock. Fixed some typos. Unlock + the queue after g_thread_pool_wakeup_and_stop_all in the proxy. + +2001-04-02 Sebastian Wilhelmi + + * gmain.c: Use the new GRealThread member "context" instead of a + GStaticPrivate to store the thread specific main loop context. + + * gthread.c: Added "context" member to GRealThread and updated + g_thread_create, g_thread_self and g_thread_cleanup accordingly. + + * gthread.c, gthread.h: Removed the functions + g_static_private_(get|set)_for_thread and adapted + g_static_private_(get|set) and g_static_private_free + accordingly. This fixes Bug #51435. + +2001-03-30 Sven Neumann + + * ghash.[ch] + * docs/reference/glib/tmpl/hash_tables.sgml: added new functions + g_hash_table_new_full, g_hash_table_replace, g_hash_table_steal and + g_hash_table_foreach_steal. Moved most docs out of the template + file into the C file. Please proofread the new documentation. + +2001-03-29 Tor Lillqvist + + * glib.def: Updates. + * tests/makefile.mingw.in + * tests/makefile.msc.in: Add module-test rules. + +Mon Mar 26 14:14:53 2001 Owen Taylor + + * Makefile.am (INCLUDES): -DG_DISABLE_DEPRECATED + + * gmain.h timeloop.c: Surround the cruftiest stuff with + #ifndef G_DISABLE_DEPRECATED. + + * gcompat.h gdate.h: Move compat defines back to + gdate.h, surround with #ifndef G_DISABLE_DEPRECATED. + Remove gcompat.h. + +Mon Mar 26 13:34:50 2001 Owen Taylor + + [ Patch from DindinX , added docs ] + + * gstrfuncs.c, gstrfuncs.h: Add g_stpcpy () for platform that + don't have stpcpy (). + * gstrfuncs.c (g_strjoin, g_strjoinv, g_strconcat): + use g_stpcpy () so these functions run much faster. + * config.h.win32.in, glib.def: add reference to g_stpcpy () + * configure.in: Add a test for the stpcpy () function. + +2001-03-20 Havoc Pennington + + * gutf8.c (g_utf8_strlen): rewrite, based on bug #52328 from + Anders + +2001-03-19 Havoc Pennington + + * gutf8.c (g_unichar_validate): added this function + +2001-03-18 Tor Lillqvist + + * gspawn-win32.c (SETUP_DEBUG): Add braces to silence gcc -Wall. + + * gspawn-win32-helper.c (write_no_error): Remove unused function. + + * tests/makefile.mingw.in (module-test.exe): Add rules for + building module-test. + +Wed Mar 14 18:46:54 2001 Tim Janik + + * gscanner.[hc]: removed archaic gpointer derived_data; relict and + added a GData member instead. + + * glist.[hc]: added g_list_remove_all(). + + * gslist.[hc]: added g_slist_remove_all(). + +Sat Mar 17 19:54:51 2001 Owen Taylor + + * timeloop.c: Reorder headers to make FreeBSD happy. + +2001-03-13 Tor Lillqvist + + From Edward M. Lee : + + * gdate.c (g_date_set_parse): add support for dates that in the + form "Wed Mar 14 2001". Running testgdate on cygwin requires this. + +Fri Mar 9 18:01:43 2001 Tim Janik + + * gscanner.[hc]: made config arg to g_scanner_new() const. + +2001-03-12 Tor Lillqvist + + * tests/Makefile.am (libmoduletestplugin_b_la_LIBADD, + libmoduletestplugin_b_la_LIBADD): Link with the libgmodule la only + on Win32. + +2001-03-10 Tor Lillqvist + + * glibconfig.h.win32.in: Define G_PLATFORM_WIN32 here, too. + + * tests/Makefile.am: Use the _LIBADD dependency on libglib only on + Win32. + +2001-03-09 Tor Lillqvist + + * README.win32: Update with some information about using configure + and libtool. + +2001-03-09 Hans Breuer + + * gobject/gobject.def : updated + +2001-03-08 Tor Lillqvist + + * glib.def + * gobject/gobject.def + * gobject/makefile.mingw.in: Update. + +2001-03-08 Sven Neumann + + * gtree.[ch]: + * docs/reference/glib/tmpl/trees-binary.sgml: added new function + g_tree_lookup_extended(). + +Thu Mar 8 16:23:34 2001 Tim Janik + + * ghook.[hc]: destruction cleanup. there's one + ->finalize_hook member in the hooklist now that gets + called when a hook should be destroyed, that's it. + that function is guarranteed to be called only when + all ref_counts to the hook vanished, thus also when + the hook is not in call. + +2001-03-08 Sebastian Wilhelmi + + * configure.in (FLAG_DOES_NOT_WORK): Fix typo and thus bug #51862. + +Wed Mar 7 09:32:06 2001 Tim Janik + + * glib-object.h: add gvaluearray.h. + + * gstring.[hc]: fixup naming of g_string_sprint*. + + * gtypes.h: fixed GCompareDataFunc naming. + +2001-03-07 Christian Meyer + + * configure.in: Added de (German) to ALL_LINGUAS. + +2001-03-02 Christophe Merlet + + * configure.in: Added fr (French) to ALL_LINGUAS. + +2001-03-01 Tor Lillqvist + + * gutils.c (g_path_is_absolute): (Win32) Remove test for initial + double backslash (UNC path), this will of course be matched by the + test for an initial G_DIR_SEPARATOR right up front. Silly me. + (g_find_program_in_path): Implement on Win32. Append the + executable file name suffixes from PATHEXT in turn while looking + for the program. + (g_find_program_in_path): If the program we are looking for is a + relative path in a subdirectory, don't do any path search. + (g_get_any_init): (Win32) Also look for the USERPROFILE env var + indicating the home directory equivalent. + (g_find_program_in_path): (Win32): Use MAXPATHLEN, not PATH_MAX + which isn't defined with MSVC. + + * testglib.c (main): Test g_find_program_in_path() on Win32 by + looking for more.com and regedit. + + * glib.def: Add g_find_program_in_path. + +2001-02-26 Sebastian Wilhelmi + + * gthreadpool.c (g_thread_pool_thread_proxy): Make + max_unused_threads work for -1 as well. + +2001-02-23 Sebastian Wilhelmi + + * gthread.h (struct _GThread): Change the order to match the order + in g_thread_create(). + + * gthread.c (g_static_rec_mutex_lock_full): Also do the right + thing (behave like 'depth' calls to g_static_rec_mutex_lock) for a + mutex, that is already locked. + +Thu Feb 22 10:31:36 2001 Owen Taylor + + * gmain.c (g_source_remove_poll): Add missing implementation + of g_source_remove_poll. (Pointed out by Stefan Westerfeld) + +2001-02-21 Tor Lillqvist + + * gutils.c (g_find_program_in_path): Implement on Win32. + + Cygwin support contributed by Stefan Ondrejicka + . Hopefully I got it all in while simultaneously + adding support for auto*/libtool for mingw. + + * Makefile.am: Changes for auto* support on Cygwin and Win32. Do + still distribute the hand-written makefiles and *.win32.in files, + though. Use GIO, GSPAWN and PLATFORMDEP macros set by configure. + Use -no-undefined. Pass -export-symbols glib.def to libtool. + + * configure.in: Define G_PLATFORM_WIN32 on both pure Win32 (mingw) + and Cygwin. Add AC_CYGWIN, AC_EXEEXT and AC_LIBTOOL_WIN32_DLL + calls for Cygwin and mingw support. Check for %I64u guint64 + format (in MS C library). Set G_MODULE_IMPL on mingw and + Cygwin. Use ac_object and ac_exeext. Set GIO, GSPAWN, PLATFORMDEP + and G_LIBS_EXTRA. Compile timeloop only on Unix. Define OS_WIN32 + automake conditional on Win32. + + * glib.h: Include gwin32.h also on Cygwin. + + * gfileutils.c (get_contents_posix): Use O_BINARY (defined as 0 on + Unix) for Cygwin's sake. + + * gtimer.c (GETTIME): Reduce #ifdefs, use a macro GETTIME(). + + * gconvert.c + * gthread.c + * gutf8.c + * gutils.c: For code needed both on Cygwin and native Win32, + test for G_PLATFORM_WIN32. + + * gmarkup.h: Use G_BEGIN_DECLS and G_END_DECLS. + + * gtypes.h: Refine GLIB_VAR definition. Also check for DLL_EXPORT + in case compiling a static library on Win32 or Cygwin. + + * gwin32.c: No on Cygwin. No need for ftruncate() or + dirent emulation on Cygwin. + (get_package_directory_from_module) Convert return value from + GetModuleFileName() to POSIX path on Cygwin. + + * tests/Makefile.am (progs_LDADD): Link with libglib, libgthread + and libgmodule as appropriate. Use -no-undefined. + + * gbacktrace.c: Move #ifdefs around a bit on Win32. + +2001-02-21 Tor Lillqvist + + * gshell.c (unquote_string_inplace): Make static. + + * gthread.h: Include gtypes.h to be sure to get GLIB_VAR + definition, remove definition from here. + + * gunicode.h: Remove duplicate GLIB_VAR definition from here, too. + + * gutils.c: (Win32) Use USERPROFILE as home dir if present. On + Win2k, HOMEDRIVE and HOMEPATH aren't reliable. + + * Makefile.am (INCLUDES): Add -DGLIB_COMPILATION. + + * makefile.mingw.in: Remove install target, Windows isn't Unix. + (DEFINES): Add -DDLL_EXPORT. + + * testgdate.c + * testgdateparser.c + * testglib.c: Undefine GLIB_COMPILATION. + + * testglib.c: Make some vars static. Add Cygwin path tests. + + * glib.def: Updates. + + * .cvsignore + * */.cvsignore: Ignore also .obj, .dll, .lib and .exe files. + +2001-02-19 Hans Breuer + + * glib/glib.def, gobject/gobject.def : added nissing symbols + + * gobject/makefile.msc : updated + + * glib/gmessages.c : call the "debug interrupt" before exiting the + program, if build with msvc as debug version. Which gives the opportunity + to see the callstack, etc. + + * glib/gthread.c : thread->pid is only defined #ifdef + G_THREAD_USE_PID_SURROGATE + +Mon Feb 19 07:32:38 2001 Tim Janik + + * glib-config-2.0.in (lib_glib): my name is glib-config-2.0! + don't exit with errorcode!=0 for --help or -h. + + * Makefile.am: + * configure.in: build glib-config-2.0. + +2001-02-17 Havoc Pennington + + * gthread.c: include string.h + + Applied patch from Soeren Sandmann: + + * testglib.c: const fixes + + * gwin32.h: format cleanups + + * gutils.c (g_atexit): constify a variable + (g_find_program_in_path): constification + (g_basename): G_CONST_RETURN + (g_path_skip_root): G_CONST_RETURN + (g_getenv): G_CONST_RETURN + (g_get_user_name): G_CONST_RETURN + (g_get_real_name): G_CONST_RETURN + (g_get_home_dir): G_CONST_RETURN + (g_get_tmp_dir): G_CONST_RETURN + (g_get_prgname): G_CONST_RETURN + (_glib_gettext): G_CONST_RETURN + + * gunicode.h: formatting cleanups + + * gstrfuncs.c (g_strerror): G_CONST_RETURN + (g_strsignal): G_CONST_RETURN + + * gspawn.c (g_execute): const on variables + + * gmessages.c (printf_string_upper_bound): fix const on a variable + + * gmem.c (g_mem_chunk_new): make the "name" arg const + (struct _GRealMemChunk): make the "name" field const + + * gfileutils.c (g_file_open_tmp): store const return in a const + gchar* variable + + * gdataset.c (g_quark_to_string): G_CONST_RETURN + +Sat Feb 17 07:26:33 2001 Tim Janik + + * configure.in (G_MODULE_HAVE_DLERROR): add check for broken RTLD_GLOBAL + (on OSF1 V5.0). + +2001-02-15 Sebastian Wilhelmi + + * acconfig.h, configure.in: Reverted the changes necessary to + enlarge the system thread for G_THREAD_USE_PID_SURROGATE. + + * gthread.c: Now implement G_THREAD_USE_PID_SURROGATE in gthread.c + instead of gthread/gthread-posix.c. While the latter has the + advantage, that it is conceptually cleaner, it makes + g_thread_self_posix_impl _very_ slow and that hurts + GStaticRecMutex and other things. So the new version is less + clean, but faster. + +2001-02-09 Havoc Pennington + + * gconvert.c (g_convert): don't overwrite errors + + * gerror.c (g_set_error): improve warning message if an error is + overwritten + (g_propagate_error): ditto + +2001-02-13 Sebastian Wilhelmi + + * gthread.c, gthread.h: Added functions g_static_rec_mutex_init, + g_static_rec_mutex_free, g_static_private_init, + g_static_private_free, g_static_rw_lock_init to allow the usage of + all those types dynamically. (g_static_rw_lock_free already + existed). Aditionally freed static_private indeces are reused + now. Untill now the array would just grow if you would use more + and more static_private. That required adding a slist of all + running threads, which could potentially be of good use later. It + is not exported however. Renamed a LOCK and small indentation + fixes. + + * tests/thread-test.c: Test the new static_private index freing + and reusing feature. + +Mon Feb 12 15:01:09 2001 Owen Taylor + + * configure.in (gtk_doc_min_version): Add check for gtk-doc version. + +2001-02-10 Tor Lillqvist + + * gtypes.h + * gutils.h: Move GLIB_VAR definition from gutils.h to gtypes.h + + * glib.def + * gmem.h: Mark glib_mem_profiler_table for export. + + * gwin32.c (get_package_directory_from_module): Don't store + address of local variable in hashtable. + +2001-02-08 Fatih Demir + + * configure.in: Added "tr" to ALL_LINGUAS. + +2001-02-04 Tor Lillqvist + + * gwin32.c (g_win32_getlocale): Use "nn" for Nynorsk, as nn.po + files are appearing now. If the sublanguage starts with '@', don't + use a '_' separator. South Africa is 'ZA', not 'SA'. + +Sun Feb 4 07:38:32 2001 Tim Janik + + * docs/debugging.txt: s/glib_trap_/g_trap_/. add comments on + g_trap_instance_signals, g_trace_instance_signals and + GRUNTIME_DEBUG. + + * gmem.c: s/glib_trap_/g_trap_/. + +2001-02-04 Tor Lillqvist + + * tests/Makefile.am (thread_LDADD): Change order of libs, + put progs_LDADD last. Needed for cygwin, says jbdoll@kepri.re.kr. + +2001-02-02 Tor Lillqvist + + * giochannel.h + * giowin32.c + * gmain.c: Stylistic cleanups. Use G_STRLOC in g_warning() calls. + + * glib.def: Add missing functions. + +2001-02-01 Sebastian Wilhelmi + + * gthread.c, gthread.h: Added g_static_mutex_init to allow + initialization of a GStaticMutex, that can not be initialized with + G_STATIC_MUTEX_INIT, for example in allocated structures. + +Wed Jan 31 13:46:58 2001 Owen Taylor + + * acinclude.m4 glib-gettext.m4: Fix problem with --disable-nls. + +2001-01-31 Tor Lillqvist + + * glibconfig.h.win32.in: Corresponding change as below to + GStaticMutex. + +2001-01-30 Sebastian Wilhelmi + + * gthread.c, gthread.h: Added g_static_mutex_free to allow using + GStaticMutexes with limited lifetime without leaking. + + * configure.in: GStaticMutex doesn't have to provide extra space + for debugging information for G_ERRORCHECK_MUTEXES, as then the + non-default implementation (runtime_mutex) is used anyway. + + * gthread.h (g_cond_wait): Added debug information for + g_mutex_free calls, if G_ERRORCHECK_MUTEXES is defined. + +2001-01-29 Tor Lillqvist + + * glibconfig.h.win32.in: Use the same GMutex structure as the + configure-generated glibconfig.h does. + + * gstrfuncs.c (g_strsignal): Declare strsignal() on Cygwin, too, + says jbdoll@kepri.re.kr. + +2001-01-29 Sebastian Wilhelmi + + * gthread.c: Broadcast the condition, if there are waiting + readers, as all might read at the same time. Only signal the + writer thread, if there are no more readers. + +2001-01-25 Tor Lillqvist + + * makefile.mingw.in + * */makefile.mingw.in: Protect the rule to rebuild makefile.mingw + if makefile.mingw.in has changed with a check if said .in file + exists. (This rule is mainly a convenience for yours truly.) + + * giowin32.c: Socket support rewritten. It was utterly broken, and + untested in fact. We still do use a thread for each socket being + watched, but instead of blocking in recv() (which of course was + plain stupid for sockets being listen()ed on in a server-type + application), we block in select(). The read method for sockets + calls recv(). It is now possible for the application to call + accept(), recv() or send() in the callback, just like on + Unix. Tested with code kindly provided by Andrew Lanoix. + + Rename g_io_channel_win32_new_stream_socket() to + g_io_channel_win32_new_socket() as it isn't restricted to stream + sockets. + + * gmain.c (g_poll): Related changes in the Win32 version of + g_poll(). When polling for messages, always do a PeekMessage() + first. We used to miss messages if several were posted between + calls to g_poll(). + + * giochannel.h: Improve Win32-related comments. + + * gutf8.c: (Win32) Include for sprintf. + + * tests/gio-test.c: (Win32) Add tests for polling for Windows + messages. + + * tests/makefile.mingw.in: Remove superfluous compilation command + line. + +2001-01-23 Alex Larsson + + * gmain.c (g_source_callback_unref): Free the callback + (g_source_set_callback): Initialize the callback refcount + +2001-01-20 Tor Lillqvist + + * gutils.c (g_get_codeset): (Win32) Even if g_get_codeset() is + currently commented out from gutils.h, fix it to return the same + CP%d value as g_get_charset(). + +2001-01-19 Kjartan Maraas + + * gconvert.c: Fix typo. + * gfileutils.c: Same here. + * configure.in: Added no to ALL_LINGUAS + +2001-01-17 Tor Lillqvist + + * gwin32.c (g_win32_getlocale, g_win32_error_message): Add doc + comments. + (g_win32_get_package_installation_directory): Add one parameter, + the name of a DLL in the package. Add possibility to use that to + deduce the installation directory if not entered into the + Registry. Make the return value dynamically allocated. + (g_win32_get_package_installation_subdirectory): New convenience + function. + + * gutils.c (GLIB_LOCALE_DIR) + * gwin32.h: Adapt accordingly. + + * testglib.c (main): Adapt tests accordingly. + +Tue Jan 16 23:20:38 2001 Owen Taylor + + * gutils.c glibintl.h: Optimize for size rather than speed by + making _() always call _glib_gettext() instead of conditionally + calling gettext() or _glib_gettext_init. glib only uses translated + strings in slow error handling code anyways. + + * glibintl.h: g'ify types. + + * Makefile.am: include glibintl.h in _SOURCES + +2001-01-17 Tor Lillqvist + + * config.h.win32.in: Define ENABLE_NLS and GETTEXT_PACKAGE. + + * makefile.mingw.in + * makefile.msc.in: Use the GNU intl library. + + * gwin32.c (g_win32_get_package_installation_directory): New + function. To be used by various GLib-using packages to get their + installation directory, which should be stored in the Registry by + some installer. + + * gwin32.h: Declare it. + + * testglib.c (main): Test it. + + * gutils.c: On Win32, define GLIB_LOCALE_DIR using + g_win32_get_package_installation_directory(). + + * glib.def: Update. + +Mon Jan 15 21:39:06 2001 Owen Taylor + + * glib-2.0.pc.in (Libs) glib-config-2.0.in: Add @INTLLIBS@. + +Mon Jan 15 21:12:49 2001 Owen Taylor + + * configure.in acconfig.h glibintl.h gutils.c + po/{Makefile.in.in,POTFILES.in,po2tbl.in}: Add gettext + support. + + * glib-gettext.m4 acinclude.m4: Clean up the GTK+ gettext macros + some more and put them in this file, though they also need + to be included in acinclude.m4 due to the brokeness of + aclocal. + + * gspawn.c gspawn-win32.c gutf8.c gconvert.c gfileutils.c + gshell.c: Remove dummy _() #defines, include glibintl.m4. + +2001-01-09 Tor Lillqvist + + * giowin32.c: Rework the changes needed to pass mainloop-test. Now + we don't need to call TerminateThread() after all, which is a + relief, as the docs have a BIG RED WARNING SIGN about using that + API. Instead, when closing a fd channel that has a reader thread + running, just mark it as non-running and additionally mark the fd + as ripe for closing. When the reader thread hopefully eventually + gets something (and EOF or some actual data), it will note that it + shouldn't be running, break out of the loop, and close the fd. + + The socket channel closing code should probably be changed + similarily, but that will have to wait until I have a test case. + + (g_pipe_readable_msg, g_io_channel_win32_new_pipe, + g_io_channel_win32_new_pipe_with_wakeups, + g_io_channel_win32_pipe_request_wakeups, + g_io_channel_win32_pipe_readable): Remove these, have been + obsolete for some time. + + * gutils.c (g_basename, g_dirname): Don't warn about deprecation + on Win32. Code written for GLib 1.2 doesn't have much choice but + to use GLib >= 1.3 on Win32. + + * glib.def: Update. + +2001-01-09 Sebastian Wilhelmi + + * gmem.c: Made g_profile_mutex a GMutex* instead of + G_LOCK_DEFINE_STATIC to avoid deadlock for thread implementations + without native static mutexes. Contruct g_profile_mutex in + g_mem_init(). + +2001-01-06 Tor Lillqvist + + * gconvert.c (g_locale_to_utf8, g_locale_from_utf8): Get len using + strlen() if arg is negative in the Win32 code, too. + + * giowin32.c: Changes necessary to be able to run + mainloop-test. We can't close the fd that our (internal) reader + thread is sitting doing a blocking read() from. We must terminate + the thread first. Keep track of thread handle, and close it when + thread is dying. Start reader thread with the lower-level + CreateThread() instead of _beginthreadex() from the C runtime, in + order to be able to use TerminateThread(). Hopefuly this isn't + harmful. + + * glib.def: Update. + + * tests/makefile.{mingw,msc}.in (TESTS): Add mainloop-test and + unicode-encoding. + + * tests/mainloop-test.c: Portability: , need + on Win32. + + * tests/unicode-encoding.c (process): Add missing "line" argument + to fail(). On Win32, convert UTF-16LE, as libiconv'c ivonf always + converts to UTF-16BE if we ask for unspecific UTF-16. + (main) Handle also '\r'. + +Fri Jan 5 11:25:42 2001 Owen Taylor + + * configure.in (PACKAGE): move $enable_debug down below + checks for GCC to avoid setting CFLAGS prematurely, + change checks to avoid adding -g twice. + + * gutf8.c (g_ucs4_to_utf8): Support len < 0 to mean + 0 termination. + + * gutf8.c (g_utf8_to_ucs4): Terminate result with 0. + + * tests/mainloop-test.c (main): Fix uses of + g_main_loop_destroy(). + + * tests/unicode-encoding.c tests/Makefile.am tests/utf8.txt: + Tests for unicode-conversion code. + + * gconvert.c (g_convert, g_convert_with_fallback): work around + a couple of GNU libc bugs. + + * gconvert.[ch] (g_{locale,filename}_{to,from}_utf8): Standardize + arguments to match g_convert(). Document. + + * gunicode.[ch]: + - Implement conversion functions to and from UTF-16 + - Standardize unicode conversion functions on prototype like + g_convert. + - Add a lot of error checking to unicode conversion functions. + + * gunicode.[ch] (g_utf8_to_ucs4_fast): Add fast, non-checking + variant of g_utf8_to_ucs4. + + * gutf8.c (g_utf8_validate): + - add g_return_if_fail (str != NULL). + - add checks for overlong strings, non-valid Unicode characters (>= 110000) + and single surrogates. + +2001-01-05 Tor Lillqvist + + * testglib.c (main): Add test for g_path_skip_root(). + + * gfileutils.c (g_file_open_tmp): (Win32:) Look also for (illegal) + forward slashes in the template. + + * gutils.c (g_path_skip_root): On Win32, skip the \\server\share + part of UNC paths. On all platforms, skip several initial + slashes. Add a few comments. + (g_get_any_init): On Win32, in case HOME is Unix-style with + (forward) slashes (some other applications apparently set it up + this way, convert to backslashed form. + + * configure.in (glib_os): Remove stray 'v'. Add case for mingw, + although using configure for mingw surely doesn't work yet. + + * glib.def: Update. + +2001-01-02 Havoc Pennington + + * configure.in: remove glib-config-2.0 + + * Makefile.am: remove glib-config-2.0 + +2001-01-03 Havoc Pennington + + * tests/Makefile.am (INCLUDES): -I$(top_srcdir)/gmodule, + fix from Michael Meeks + + * Makefile.am (INCLUDES): DISABLE was spelled wrong + +Wed Jan 3 14:10:49 2001 Owen Taylor + + * gmain.[ch]: Switch GMainLoop to be ref/unref, use to + make dropping reference to running loop safe. + +Wed Dec 13 20:41:49 2000 Owen Taylor + + * gmain.c (g_source_unref_internal): Unref callback->cb_data + if it was still set when the source is freed. (Usually, this + will be done by g_source_destroy.) + +2001-01-02 Dan Winship + + * garray.h (g_array_append_val, g_array_prepend_val, + g_array_insert_val): Use parentheses around an argument to make + these cause an error if you pass a non-lvalue for the value, + rather than silently doing the wrong thing. + +2000-12-29 Tor Lillqvist + + * glibconfig.h.win32.in: Add GLIB_SIZEOF_VOID_P and GLIB_SIZEOF_LONG. + + * glib.def: Update. + + * {.,*}/makefile.{mingw,msc}.in: Add -DG_ENABLE_DEBUG. + +Fri Dec 29 14:53:18 2000 Tim Janik + + * configure.in: we can't grow _cv_ variables by using a backticked + expr that refers back to the variable (glib_cv_sizeof_system_thread for + G_THREAD_USE_PID_SURROGATE), that'd keep the variable growing every time + it's evaluated. quantum states, anyone?) + +Thu Dec 28 10:21:46 2000 Tim Janik + + * gmem.[hc]: got rid of outdated dmalloc support. provide g_try_malloc() + and g_try_realloc() which _may_ fail and return NULL. + nuked g_mem_check(), provided GMemVTable for memory function + virtualization, alterable at program startup with g_mem_set_vtable(). + provided glib_mem_profiler_table and g_mem_profile() to support limited + profiling information out of the box (uses mprotect() for free()ed areas + on linux). + provide globally visible G_MEM_ALIGN. + buncha cleanups. + + * docs/macros.txt: file to get a clue about the various configuration + macros. + + * docs/debugging.txt: explain debugging traps. + + * configure.in: got rid of --enable-mem-check and --enable-mem-profile, + define GLIB_SIZEOF_VOID_P and GLIB_SIZEOF_LONG. check malloc prototypes + and define SANE_MALLOC_PROTOS is we can use them. + + + * gutils.c, gscanner.c: fix up compatibility warnings, use g_message(). + +2000-12-27 Tor Lillqvist + + * README.win32: Update. + +2000-12-25 Tor Lillqvist + + * gmessages.c: (Win32) Use a MessageBox for fatal + messages. Collect eror message into a buffer, and display that. + + * glib.def: Update. + + * glibconfig.h.win32.in: Update. Remove unused wchar and wctype + macros, add G_MODULE_SUFFIX. + +2000-12-24 Ali Abdin + + * Makefile.am, gcompat.h, glib.h: New gcompat.h header file + as recommended by Havoc. + + * gdate.c, gdate.h, testgdate.c, + docs/reference/glib/glib-sections.txt, + docs/reference/glib/tmpl/date.sgml, tests/date-test.c: Rename some + of the gdate functions to use the '_get' in their name. Patch + reviewed by Havoc. + +2000-12-22 Sebastian Wilhelmi + + * configure.in: Determine the suffix of the shared librarries for + this system. This is done analogous to + ltconfig.sh. G_MODULE_SUFFIX in glibconfig.h is set to either + "sl", "dll", or (most often) "so". + + * tests/Makefile.am, tests/module-test.c, + tests/libmoduletestplugin_a.c, tests/libmoduletestplugin_b.c: + Added new testcase for gmodule. This is mostly copied from + gmodule/testgmodule.c, but unlike that is is quiet. (Why BTW are + some tests that verbose, not to say loquacious...) + +2000-12-19 Sebastian Wilhelmi + + * grand.c: Updated G_RAND_DOUBLE_TRANSFORM to be more + accurate. Redid g_rand_double() such that it returns 52 bits after + the point instead of 32 as before. That OTOH requires calling + g_rand_int() twice. Overhauled g_rand_int_range(), which is easier + now thanks to the new precision of g_rand_double(). Thanks to + Sverre Johansen for the hint. + + * grand.h: Added g_rand_boolean() and g_random_boolean() + macros. While they could be omitted due to extreme simplicity, + they make intention clearer in code and are therefore good to have. + + * grand.c, grand.h: Renamed all 'min' and 'max' parameters to' + begin' and 'end' resp. to avoid making people think, that 'max' is + included in the interval. 'end' now isn't, whereas 'begin' + is. That's similar to the use in the STL. + + * gslist.c, glist.c: Ok, I'm a moron. When I originally + implemented ENABLE_GC_FRIENDLY, I forgot to include config.h into + the affected files. Now that Alex did that for those two, + inevitable typos surfaced, which are now fixed. + + * garray.c, ghash.c, gqueue.c, gtree.c: Include config.h as well, + as ENABLE_GC_FRIENDLY should be known. + +2000-12-19 Alexander Larsson + + * configure.in: + Added --disable-mem-pools option. + + * glist.c: + * gslist.c: + * gnode.c: + * gmem.c: + Disable free list and memory chunks if DISABLE_MEM_POOLS is defined. + +2000-12-17 Tor Lillqvist + + * gutf8.c (g_utf8_get_charset_internal): (Win32) Use GetACP to get + the current ANSI codepage. + + * gunicode.h: Add comment that the static string g_get_charset + sets the parameter to point to should be copied in case the + charset might be changed later in the program. + +2000-12-14 Tor Lillqvist + + * makefile.{mingw,msc}.in: No need to -DGSPAWN_HELPER when + compiling gspawn-win32-helper any longer. + + * giowin32.c (g_io_win32_dispatch): Warn if no callback. Call + callback correctly. + (g_io_win32_create_watch): Fix typo. + (g_io_win32_fd_create_watch): Ditto. + (g_io_channel_unix_new): If it is a file descriptor (i.e., a Unix + fd lookalike provided by the C library), call + g_io_channel_win32_new_fd(). If it is a socket (from WinSock), + call g_io_cahnnel_win32_new_stream_socket(). Hopefully sockets and + fds don't overlap. TODO: Implement also datagram sockets. + (g_io_channel_win32_poll): Call g_main_context_get_poll_func(). + + * gcompletion.h: Include only on Unix. Is this + inclusion really needed here? OTOH, do include , for + size_t. + + * gmessages.c: (Win32) Don't define a function called "write" that + might clash with the prototype from , use a #define. + + * glib.def: Update. + + * gmain.c (g_source_add_poll): Don't return a value from void + function. + (g_main_context_get_poll_func): Compile also for non-Win32, as + presumably was intended. The result var is a GPollFunc, not a + GPollFunc*. Return the result! + +2000-12-13 Havoc Pennington + + * gconvert.c (open_converter): make static + + * gutf8.c (g_utf8_validate): Simplify logic a bit, maybe + speeding it up - now we just return FALSE if we had to bail out + for any reason before getting to the end of the string, as defined + by a nul byte if len was -1, defined by the len otherwise. This + also fixes a bug where nul bytes were not treated as invalid + when the length was specified. + +2000-12-12 Havoc Pennington + + * gmain.c (g_main_context_destroy): don't try to use thread stuff + unless G_THREADS_ENABLED + (g_main_context_query): ditto + (g_main_context_check): ditto + (g_main_loop_quit): ditto + +Tue Dec 12 18:58:22 2000 Tim Janik + + * ghash.c (g_hash_table_remove): return whether a value + got removed. + +Tue Dec 12 15:18:10 2000 Owen Taylor + + * gmain.[ch]: Revert unauthorized changes. + +2000-12-12 Elliot Lee + + * gmain.c, gmain.h (g_main_context_new, g_main_context_destroy): + GMainContext useful in implementing some additional styles of + main loop usage. To do this, however, Joe Hacker needs to be able + to create/destroy GMainContext's at will. This is just an export + of existing functionality, rather than any new functionality. + + They are listed in the "Low level functions for implementing custom + main loops" section of the header file, to avoid confusing people. + +Sun Dec 10 10:47:11 2000 Owen Taylor + + * gmain.c (g_source_destroy_internal): Remove pollfds + from the context here, not when actually freeing the + source. + + * gmain.c (g_source_unref_internal): Free source list + and source, call source->source_funcs->destroy(). + + * giochannel.c: Unreference io_channel properly. + +Thu Dec 7 15:22:30 2000 Owen Taylor + + * tests/mainloop-test.c (recurser_start): Add a bunch + of unrefs. + + * gmain.c (g_source_attach): Reference the source + when adding (pointed out by Elliot) + +2000-12-08 Raja R Harinath + + * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): + Rename from GLIB_DIVERT_BEFORE_HELP. + Update to track autoconf 2.49b. + * configure.in: Reflect above change. + (AC_EGREP_HEADER): Rename from really obselete AC_HEADER_EGREP. + (debug_default): Replace "if test `expr ...`" with "case". + + * tests/Makefile.am (TESTS): Rearrange into other variables, and + include run-markup-tests.sh. + (TESTS_ENVIRONMENT): New. Pass $srcdir to tests. + (noinst_PROGRAMS): Rename to ... + (check_PROGRAMS): ... this. 'automake' ensures that these are + built before running the tests. + * tests/run-markup-tests.sh: Support $srcdir != $builddir. + +2000-12-08 Havoc Pennington + + * tests/Makefile.am (TESTS): move markup-test to noinst_PROGRAMS; + it isn't a proper test, the proper test would be + run-markup-tests.sh, but that can't go in tests, so we need + a manual make check rule. Didn't do that yet. + +2000-12-07 Raja R Harinath + + * gmain.h: Don't put anything after an #endif. + * gmain.c: Likewise. + +2000-12-06 Havoc Pennington + + * tests/strfunc-test.c (main): add g_strdupv test + + * gstrfuncs.c (g_strdupv): Add a function to copy + an array of strings + +Tue Dec 5 12:23:04 2000 Owen Taylor + + * gmain.[hc]: Major change in API for creating sources + to handle multiple main loops (GMainContext *). + + GSources are now exposed as GSource * and implemented + with structure derivation. + + * giochannel.[ch]: Changed vtable for GIOChannel to correspond + to the new mainloop API, add g_io_channel_create_watch(). + + * gtypes.h: Move GTimeVal here. + + * gthread.h: Remove gmain.h include to avoid circularity. + + * giounix.c: Update for new GMain API. + + * giowin32.c: Update for new GMain API. (No check for + proper compilation or working.) + + * timeloop.c timeloop-basic.c: A benchmarking program for + the main loop comparing the main loop against a + hand-written (timeloop-basic.c) variant. + + * tests/mainloop-test.c: New torture test of mainloop. + + * docs/Changes-2.0.txt: Started. Added text about + changes to GMain. + + * gmain.c (g_main_add_poll_unlocked): Initial fd->revents + to zero. (#8482, Benjamin Kahn) + +2000-12-01 Tor Lillqvist + + * {.,*}/makefile.msc.in: Include make.msc from GLib's build subdir. + + * makefile.{mingw,msc}.in (glib_OBJECTS): Add gunibreak. + + * glib.def: Update correspondingly. + +2000-11-21 Havoc Pennington + + * gmacros.h: Provide G_CONST_RETURN which is 'const' by default, + and nothing when G_DISABLE_CONST_RETURNS is defined. + +2000-11-29 Havoc Pennington + + * gunidecomp.c (COMBINING_CLASS): + s/UNICODE_LAST_CHAR/G_UNICODE_LAST_CHAR/ + + * gunichartables.h: Update for data in Unicode 3.0.1 + + * gunidecomp.h: Ditto + + * gunicode.h (GUnicodeBreakType): Enum for line break properties + (g_unichar_break_type): Get the break property for a char + + * gunibreak.h: Autogenerated line break property tables + + * gunibreak.c (g_unichar_break_type): added + + * Makefile.am (EXTRA_DIST): dist gen-unicode-tables.pl + + * Makefile.am (libglib_1_3_la_SOURCES): Add gunibreak.h, gunibreak.c + + * gen-unicode-tables.pl: Include the script to update the unicode + char tables + +2000-11-28 Elliot Lee + + * gmarkup.c: Fix warnings. + + * guniprop.c, gunidecomp.c: Make warnings go away by using + GPOINTER_TO_INT() instead of (int). + + * gcompletion.[ch]: Add g_completion_set_compare(), + to allow (for example) using case-insensitive completion. + +2000-11-28 Tor Lillqvist + + Patches by Hans Breuer: + + * gspawn-win32.c: Move the code for gspawn-win32-helper to its own + file. + + * makefile.{mingw,msc}.in: Change accordingly. + + * gspawn-win32-helper.c: New file. + + * Makefile.am (EXTRA_DIST): Add it. + + * gmarkup.c (find_current_text_end): Fix assertion not to check an + uninitialised variable. + +2000-11-28 Sebastian Wilhelmi + + * gthread.c: Set the thread data before locking the mutex, because + the locking call might use g_thread_self (). + + * gthread.h: Do only show the location of the locking/unlocking + for -DG_ERRORCHECK_MUTEXES and not the name of the mutex. Add the + errorcheck capability for g_cond_wait and g_cond_timed_wait as + well. + +2000-11-27 Havoc Pennington + + * gthread.h: Add void in empty function arg list + +2000-11-22 Tor Lillqvist + + * makefile.{mingw,msc}.in: Add gqsort. + + * glib.def: Update. + +2000-11-21 Sebastian Wilhelmi + + * configure.in: Add a surrogate for thread priorities using PID + niceness for systems with no thread priorities and different PIDs + for threads of the same process (most notably: Linux). Define + G_THREAD_USE_PID_SURROGATE in that case, as used by + gthread-posix.c. Also make the system thread bigger by + sizeof (long) to contain the thread's PID. + + * gfileutils.c: Include stdlib.h for mkstemp prototype. + + * gthread.c: Add priority range checks to the affected functions. + + * gthreadpool.c: Remove unused variable. + +Mon Nov 20 18:55:17 2000 Jonathan Blandford + + * gtree.[hc]: Patch from David Benson to add + user_data support to gtree functions. + +Mon Nov 13 18:35:52 2000 Jonathan Blandford + + * gtypes.h (GCompareFuncData): new func type to let you use user + data when comparing nodes. + + * gslist.c (g_list_sort_with_data): new function to sort with + user_data. + + * glist.c (g_list_sort_with_data): new function to sort with + user_data. + + * garray.[ch]: Added convenience functions to sort arrays. + +2000-11-16 Havoc Pennington + + * guniprop.c (g_unichar_isspace): Use a switch here, maybe helps + the compiler optimize things. Also, ' ' is a SPACE_SEPARATOR, + so don't special case it. + +2000-11-17 Tor Lillqvist + + * glib.def: Add g_trash_stack entry points. + +Fri Nov 17 15:43:00 2000 Owen Taylor + + * Released 1.3.2 + + * NEWS: Update. + + * tests/Makefile.am (dist-hook): Add code to distribute + markup test files. + +2000-11-15 Sebastian Wilhelmi + + * configure.in: Check for the sched.h header and include it on + gthread/gthread-posix.c if available. + + * configure.in: Add -D_POSIX4_DRAFT_SOURCE to + GTHREAD_COMPILE_IMPL_DEFINES. Also add -D_POSIX4A_DRAFT10_SOURCE + to G_THREAD_CFLAGS. Really deploy GTHREAD_COMPILE_IMPL_DEFINES, + when searching for thread libs. Look for sched_* functions in + -lrte as well. All of that is necessary on DG/UX. + + * configure.in: Use AC_TRY_COMPILE instead of AC_EGREP_HEADERS in + various places to make it work more reliable, to make it accept + macros instead of functions etc. + + * configure.in: Replace some NULL's for checks with 0 to make it + work without stdio.h everywhere. + + * configure.in, gutils.c: changed the test for getpwuid_r to first + test for a posix version and then for a non-posix version. No code + change in gutils.c. Again this change deals better with getpwuid_r + being a macro and not a function. Most of the above with kind help + from Tethys . This fixes Bug #13403. + +2000-11-14 Tor Lillqvist + + * gwin32.h: Make #endif comment match #ifdef. + +Mon Nov 13 14:00:20 2000 Owen Taylor + + * configure.in: Up version to 1.3.2 + + * gconvert.h (enum GConvertError): Remove trailing , + + * gfileutils.c (g_file_open_tmp): Fix comment to + properly describe return value. + +2000-11-13 Tor Lillqvist + + * config.h.win32.in: Add USE_LIBICONV. + + * gconvert.c: Check G_OS_WIN32 only after including glib.h. + + * glib.def: Update. + +2000-11-13 Sebastian Wilhelmi + + * gthread.c (g_static_rec_mutex_*): Made recursive mutexes also + work when the thread system is not (yet) initialized. + +Sun Nov 12 18:34:32 2000 Owen Taylor + + * gconvert.[ch]: Create wrapper functions for iconv() + so that we can transparently use the native iconv, + libiconv, or (in the future) a mini-iconv included + with glib. + + * glib-config-2.0.in glib-2.0.pc.in: Include @ICONV_LIBS@ + + * INSTALL: Added note about libiconv. + + * configure.in: Add checks for libiconv from pango. If + EILSEQ is not defined in errno.h add define for it into + glibconfig.h so g_iconv can use it. (Note, recompiling + from a system without EILSEQ to a system with EILSEQ + will break binary compatibility) + +2000-11-12 Robert Brady + + * gstrfuncs.c, gstrfuncs.h: Remove g_filename_{to,from}_utf8 + + * gconvert.c, gconvert.h: Add g_filename_{to,from}_utf8 and + g_locale_{to.from}_utf8. The locale_ variant honours + nl_langinfo(CODESET), the filename_ variant uses UTF-8 unless + asked otherwise. + + (g_convert): Add G_CONVERT_ERROR_PARTIAL_INPUT error, if bytesread + != length and no bytesread pointer passed. + +Sun Nov 12 15:29:53 2000 Owen Taylor + + * gfileutils.[ch]: template is a reserved word in + C++ s/template/tmpl/. + +2000-11-11 Havoc Pennington + + * gmarkup.c (g_markup_parse_context_parse): Handle a long stream + of bytes containing no UTF-8 character starts + +2000-11-11 Tor Lillqvist + + * glib.def: Add missing entry points. + + * gfileutils.c (g_mkstemp): Improve chance to generate unique + names with less effort a bit. + + * gfileutils.h: Add g_file_open_tmp() declaration. + + * testglib.c: Include on Win32. + + * makefile.mingw.in: Correct the way to invoke sub-makes. + +Sun Nov 5 13:20:54 2000 Owen Taylor + + * glib-object.h: Add gtypemodule.h + +2000-11-11 Tor Lillqvist + + * gfileutils.c (g_file_open_tmp): New function, suggested by Havoc + earlier this month. + (g_mkstemp): Use only one case for letters in temp file name, as + this will be used on systems with case-insensitive file systems. + + * testglib.c (main): Test g_mkstemp() and g_file_open_tmp(). + +2000-11-09 Sebastian Wilhelmi + + * gthreadpool.c: Don't take other threads with other priorities + into account as changing the priority is highly + unportable. (Actually using it at all already is unportable, but + even sometimes where that works, changing priority is not + possible). + +2000-11-05 Havoc Pennington + + * gmarkup.h: rename G_MARKUP_FOO to + G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG + + * gmarkup.c: don't start doc comments with "Returns" + +2000-11-05 Havoc Pennington + + * gmarkup.c: inline docs + (unescape_text): properly check strtoul for failure. + + * gerror.c (g_propagate_error): Free the src error if the dest + location is NULL - I'm pretty sure that's what this function was + supposed to do. + +2000-11-05 Havoc Pennington + + * gutils.c (g_find_program_in_path): cleanup docs, sync param + names to those in the header + + * gfileutils.c (g_mkstemp): clean up docs + + * gshell.h: sync param names with param names in .c file + + * gfileutils.h (enum GFileTest): remove trailing comma from last + member, confuses gtk-doc + + * gmarkup.h: s/GMarkupErrorType/GMarkupError/g; to follow + convention + +2000-11-02 Sebastian Wilhelmi + + * gasyncqueue.c: Added documentation for asyncronous queues. + + * gspawn.c: Include sys/select.h (some platforms need it for + select). + + * gspawn.c: Changed unportable __FUNCTION__ to the verbatim + function name. + +2000-10-31 Tor Lillqvist + + * gutils.c + * gutils.h + * gfileutils.c + * gfileutils.h: Actually, g_mkstemp() is better suited in gfileutils. + +2000-10-30 Tor Lillqvist + + * configure.in: Check for mkstemp. + + * gutils.c (g_mkstemp): New function. If HAVE_MKSTEMP, just call + it, otherwise use code lifted from glibc. + + * gutils.h: Declare it. + + * glib.def: Here, too. Plus two missing functions. + +2000-10-30 Sebastian Wilhelmi + + * gcache.h, gcache.c, ghash.h, ghash.c, grel.c, grel.h, gtypes.h: + Introduced new function type GEqualFunc to return TRUE for equal + params. This is now used instead of GCompareFunc (which should + work akin to strcmp) here. This kind of fixes Bug #14412. Note + that technically GCompareFunc and GEqualFunc are still the same + types, as gint == gboolean. + + * ghash.h, gutils.c: g_int_equal and g_direct_equal now return + gboolean to be really become GEqualFunc. + + * gscanner.c, testglib.c, tests/hash-test.c: Some tiny changes to + follow the above change. + +2000-10-27 Tor Lillqvist + + * makefile.{mingw,msc}.in (glib_OBJECTS): Add gmarkup. + + * glib.def: Add missing functions. + + * tests/makefile.{mingw,msc}.in (TESTS): Add markup-test. + +2000-10-24 Havoc Pennington + + * gmarkup.h, gmarkup.c: New module to parse a simple + markup language + + * Makefile.am: add gmarkup.h, gmarkup.c + + * tests/Makefile.am: add markup-test + + * gstring.h (g_string_new_len): new function to create a string + with a length + (g_string_new): avoid a gratuitous realloc + +2000-10-26 Tor Lillqvist + + * makefile.{mingw,msc}.in: Cosmetics. + +2000-10-26 Sebastian Wilhelmi + + * gstrfuncs.c (g_strsplit): When the string is ended by a + delimiter, return an extra empty string just like for a delimiter + at the start of the string. This makes the function behave more + consistent and also fixes Bug #15026. + +Tue Oct 24 22:09:14 2000 Tim Janik + + * glib-object.h: added newly added gobject/ headers. + + * gmesage.c: print g_message() output to stderr instead of stdout. + +2000-10-23 Sebastian Wilhelmi + + * configure.in: Use one = instead of two, which is plainly wrong. + +2000-10-19 Tor Lillqvist + + * makefile.msc.in: Pass -DGSPAWN_HELPER when building it. Link + with user32.lib. + + * gspawn-win32.c + * gfileutils.c: Make them compile with picky MSVC. + + * gwin32.h: New file. Move Win32-only stuff that isn't related to + GIOChannels here from giochannel.h. + + * Makefile.am: Add it here. + + * giochannel.h: Move stuff to gwin32.h. + + * glib.h: On Win32, include gwin32.h. + +Mon Sep 11 10:03:24 2000 Owen Taylor + + * glib.h convert.c (g_convert_with_fallback): Change + ERROR_OTHER to ERROR_FAILED, add some dummy marking with _(). + + * docs/reference/glib/glib-sections.txt + docs/reference/glib/glib-docs.sgml Update for g_convert, + g_unicode_validate. + +2000-10-16 Tor Lillqvist + + * glibconfig.h.win32.in: Remove alloca stuff from here. galloca.h + takes care of it, correctly. + + * giowin32.c (reader_thread): Some more debugging output. + (g_io_channel_win32_poll): Remove unused vars. + + * gfileutils.c: Changes for Win32, with no unistd.h and no + S_ISLNK(). + + * gspawn-win32.c: Implementation of the g_spwan_* functions for + Win32. Due to the general non-Unixness of Win32, much of the + functionality that is relatively clean to implement on Unix, is + hard to do on Win32. We must use a separate helper program to + change directory, close extra file descriptors, redirect the std + ones, as needed, and only then start the child process. No child + process pid can be returned, unfortunately. Or if we used + CreateProcess directly, it probably could. (Now we use the spawnv* + functions from msvcrt.) + + * Makefile.am (EXTRA_DIST): Add gspawn-win32.c + + * glib.def: Add new entry points. + + * glib.def + * giowin32.c: Remove g_io_channel_win32_wait_for_condition(), + g_io_channel_win32_poll() subsumes it. + + * gbacktrace.h: G_BREAKPOINT for MSVC (on the ix86). + + * gwin32.c (g_win32_getlocale): Use "sp" for + LANG_CROATIAN+SUBLANG_SERBIAN_LATIN. + + * makefile.{mingw,msc}.in (glib_OBJECTS): Add new files. + Add gspawn-win32-helper.exe rule. + + * tests/makefile.{mingw,msc}.in (TESTS): Add shell-test and + spawn-test. + + * tests/spawn-test.c: (run_tests): On Win32, don't try to run + /bin/sh, but ipconfig (no special significance in choosing that, + just a program that outputs something to stdout). + +2000-10-15 Raja R Harinath + + Remove need for acconfig.h, and misc. cleanups. + * acglib.m4 (GLIB_SIZEOF): Add 'autoheader' comment to + AC_DEFINE_UNQUOTED. + (GLIB_BYTE_CONTENTS): Likewise. + + * configure.in: Add 'autoheader' comments to all AC_DEFINE(...) + and AC_DEFINE_UNQUOTED(...) lines. + Replace AC_MSG_CHECKING/AC_CACHE_VAL with AC_CACHE_CHECK. + (AM_PROG_LIBTOOL): Move after AC_PROG_CC. + + * acconfig.h: Empty out. + + * Makefile.am (BUILT_EXTRA_DIST): New variable. List 'dist'able + files that are created in the builddir. + (dist-hook): Handle those files. + (libglib_1_3_la_SOURCES): Remove @ALLOCA@. @ALLOCA@ should only + be used in an _LDADD or _LIBADD, since it expands (if necessary) + to 'alloca.o'. + + * tests/Makefile.am (BUILT_EXTRA_DIST): New variable. + (dist-hook): Handle $(BUILT_EXTRA_DIST). + +2000-10-13 Sebastian Wilhelmi + + * grand.c: Added inline documentation. + + * gtypes.h, gnode.h, gutils.h: Readded GFreeFunc, + g_node_insert_after and g_find_program_in_path resp., which + mysteriously disappeared during the glib.h dissection. + +2000-10-12 Sebastian Wilhelmi + + * glibconfig.h.win32.in: Adapted accordingly to header separation + and GLIB_HAVE_ALLOCA_H renaming. + + * Makefile.am: Added the new headers to glibinclude_HEADERS. + + * glib.h: Forgot to include gerror.h. + + * glib.h, galloca.h, garray.h, gasyncqueue.h, gbacktrace.h, + gcache.h, gcompletion.h, gconvert.h, gdataset.h, gdate.h, ghash.h, + ghook.h, giochannel.h, glist.h , gmacros.h, gmain.h, gmem.h, + gmessages.h, gnode.h, gprimes.h, gquark.h, gqueue.h, grand.h, + grel.h, gscanner.h, gslist.h, gstrfuncs.h, gstring.h, gthread.h, + gthreadpool.h, gtimer.h, gtree.h, gtypes.h, gutils.h: Split glib.h + into many header files mostly according to the resp. *.c-files. + + * gmacros.h: Added G_BEGIN_DECLS and G_END_DECLS to mean: 'in case + of C++: extern "C" { ... }' analogous to glibc __BEGIN_DECLS and + __END_DECLS. + + * configure.in, gerror.h, gfileutils.h, gshell.h, gspawn.h, + gunicode.h, : Changed guard-macro names to something more + consistent. + + * configure.in, *.h: Use G_BEGIN_DECLS and G_END_DECLS. + + * configure.in: Defined GLIB_HAVE_ALLOCA_H instead of including + alloca.h in glibconfig.h, GLIB_HAVE_ALLOCA_H is used in glib.h. + + * configure.in: Removed cruft from old threading code. + +2000-10-09 Raja R Harinath + + Work with beta autoconf 2.50. + * configure.in (GLIB_MAJOR_VERSION): Use GLIB_DIVERT_BEFORE_HELP + instead of AC_DIVERT_PUSH(),AC_DIVERT_POP. + (AC_CHECK_HEADERS): Remove redundant AC_DEFINE(HAVE_...). + (REALLOC_0_WORKS): Move AC_DEFINE outside AC_CACHE_VAL. + (dlopen): Quote nested AC_CHECK_... calls. + + * acglib.m4 (GLIB_TR_SH, GLIB_TR_CPP): Utility macros copied from + beta autoconf 2.50. + (GLIB_DIVERT_BEFORE_HELP): New macro that works both with autoconf + 2.13 and beta autoconf 2.50. + (GLIB_SIZEOF, GLIB_BYTECONTENTS): Use GLIB_TR_*. + + * Makefile.am (CONFIGURE_DEPENDENCIES): Use this to specify + that 'configure' depends on acglib.m4. + +2000-10-09 Havoc Pennington + + * Makefile.am, tests/Makefile.am: Add new files. + + * tests/spawn-test.c, tests/shell-test.c: new tests for + the shell/spawn stuff + + * gutils.c (g_find_program_in_path): convert a relative + program name into an absolute pathname to an existing + executable + + * gspawn.h, gspawn.c: New fork/exec API + + * gshell.h, gshell.c: Shell-related utilities, at the moment + simply routines to parse argv and quote/unquote strings + + * guniprop.c (g_unichar_isspace): Return TRUE for the + ASCII space characters isspace() returns TRUE for. + + * gfileutils.c (g_file_get_contents): Convenience function + to slurp entire file into a string and return it. Partially + written by Joel Becker. + (g_file_test): file test function + +2000-10-06 Tor Lillqvist + + * makefile.msc.in: Revamp to be like makefile.mingw.in, make + the MSVC build actually work again. + + * gmodule/makefile.msc.in + * gobject/makefile.msc.in + * gthread/makefile.msc.in: New files, like their mingw counterparts. + + * gmodule/Makefile.am + * gobject/Makefile.am + * gthread/Makefile.am: Make and distribute them. + + * */makefile.mingw.in: Allow override of GLib version number from + the build/win32/module.defs file. + + * glib.def: Add new entry point. + + * tests/gio-test.c (main): Fix the Win32-only code to use current + API, g_io_channel_win32_make_pollfd() and g_io_channel_win32_poll(). + + Fixes from Hans Breuer: + + * glib.h (struct DIR): Keep the last readdir result cached inside + the DIR struct, to enable several DIRs being open simultaneously. + + * gwin32.c (g_win32_readdir): Use the above instead of static. + + * giowin32.c (g_io_channel_win32_make_pollfd): Insert cast to keep + MSVC happy. + +2000-10-05 Sebastian Wilhelmi + + * glib.h: Changed alloca stuff a bit: when we have a working + alloca.h, we're not messing with alloca any further. Should fix a + bug reported by Bernd Demian . + +2000-09-29 Jonathan Blandford + + * gnode.c (g_node_insert_after): Added function to keep symmetry + with g_node_insert_before. + +2000-09-29 Martin Baulig + + Several minor ANSI C fixes. + + Added missing casts: + * gdate.c (g_date_fill_parse_tokens): `s = (guchar *) str'. + * gmain.c (g_idle_dispatch): `func = (GSourceFunc) source_data'. + (g_idle_add_full): `(gpointer) function' in call to g_source_add(). + * gstrfuncs.c (g_strdown): `s = (guchar *) string' and + `return (gchar *) string'. + (g_strup): Likewise. + (g_strchug): `start = (guchar*) string' in 1st for() argument; + `strlen ((gchar *) start)' in call to g_memmove(). + * gstring.c (g_string_down): `s = (guchar *) string->str'. + (g_string_up): Likewise. + * gthreadpool.c (stop_this_thread_marker): + `(gpointer) &g_thread_pool_new'. + * gunidecomp.h (decomp_table[]): Cast all the strings to + `unsigned char *'. + + Put text following #endif into comments: + * gmain.c: here. + +2000-09-29 Sebastian Wilhelmi + + * configure.in, glib.h: Added errorcheck mutexes. These are + activated through the preprocessor symbol + G_ERRORCHECK_MUTEXES. Need to add an extra word to StaticMutex in + order to achieve this. g_(static_)mutex_* functions instrument the + mutex operations with mutex name and location, when compiled with + -DG_ERRORCHECK_MUTEXES. g_thread_init activates the errorcheck + mutexes, when compiled with -DG_ERRORCHECK_MUTEXES. + +2000-09-28 Havoc Pennington + + * glib.h (GThreadPriority): fix indentation + (GConvertError): generic error is conventionally called + _FAILED rather than _OTHER, at least at the moment, + according to GError docs in docs/reference. + + * gconvert.c: s/_OTHER/_FAILED/ + +2000-09-28 Sebastian Wilhelmi + + * configure.in: Adjusted the test for an unimplemented + getpwuid_r. Info from Michael Pruett. This is just a forward + merge from glib-1-2. + + * configure.in: Moved determination of G_THREAD_FLAGS before + G_THREAD_LIBS. Check for UnixWare systems and set the right cflags + and libs there (it needs -Kthread for the native compiler and + -pthread for gcc). Thanks to Boyd Lynn Gerber + for the info. + + * configure.in: Fail immediately, when no thread library is found, + instead of continuing searching for rt libs etc. Changed almost + all occurances of $enable_threads to $have_threads, as that's, + what we want. + + * tests/threadpool-test.c: Define vars inside the guard to avoid + warnings. + + * configure.in, tests/type-test.c: Some platforms support 64 bit + 'long long', but you can not printf or scanf them. In that case, + don't define G_G{UINT|INT}64_FORMAT. Changed the type-test program + to reflect that. + + * gutils.c (g_get_current_dir): max_len can't be initialized + statically as it might call a function. So do it at first call. + +Tue Sep 26 2000 Elliot Lee + + * glib.h: Add G_GNUC_PURE macro (but don't use it anywhere). + +Mon Sep 25 2000 Elliot Lee + + * garray.c, glib.h, gmem.c: Add a few missing G_GNUC_CONST's. + +2000-09-21 Tor Lillqvist + + * makefile.mingw.in: Add gconvert.o. Use libiconv. + + * config.h.win32.in: Define HAVE_GETCWD. + + * glib.def: Add new entry points. + +2000-09-21 Sebastian Wilhelmi + + * configure.in: The last released automake (1.4) still requires + AM_PROG_LIBTOOL instead of AC_PROG_LIBTOOL, so use that for the + time being. + +2000-09-19 Sebastian Wilhelmi + + * acconfig.h, configure.in, gutils.c: Test for the existence of + getcwd, and use it only when found. + + * glib.h: Only use the gcc-variable-macro-argument-extension for + gcc >= 2.4. Both patches from Jonas Oberg . + +Mon Sep 18 10:58:21 2000 Owen Taylor + + * gutf8.c: Implement g_ucs4_to_utf8 which was in + the header file but not implemented. + +Sun Sep 17 2000 Elliot Lee + + * glib.h configure.in: Define g_alloca() as an + alloca-that-works-anywhere. + + * gconvert.c: Fix warnings which could have caused problems on + 64-bit platforms. + +Sun Sep 10 12:37:40 2000 Owen Taylor + + * glib.h gconvert.c (g_convert): Havoc Pennington's implementation + of convenient character set conversion using iconv, with + the addition of GError. We probably need a fallback that + just does conversions between, say UTF-8,16,32 and ISO-8859-1 + for targets without iconv at all. + + Also add g_convert_with_fallback() to take care of conversions + where we accept some loss going to the target encoding. + +2000-09-10 Havoc Pennington + + * gutf8.c (g_utf8_validate): Add this function. + +Sat Sep 9 18:50:42 2000 Owen Taylor + + * gstrfuncs.c (g_strescape): Add a missing g_return_if_fail(). + +Mon Aug 21 03:57:46 2000 Tim Janik + + * glib.h (G_BREAKPOINT): for non-i386 and non-alpha, or non gcc, + implement BREAKPOINT() as raise (5 /* SIGTRAP */); + + * glib.h: provide user-definable switch G_IMPLEMENT_INLINES, + to turn on compilation of inline function implementations provided + in header files with extern linkage. + wrap inline function implementations into ifdef __G_UTILS_C__, so we + really only compile them for gutils.c and not also into arbitrary user + code that wants to make use of G_IMPLEMENT_INLINES. + adjusted comment apropriately. + + * gutils.c: to turn on compilation of inline functions, provide + #define G_IMPLEMENT_INLINES 1 and #define __G_UTILS_C__. + +2000-09-06 Havoc Pennington + + * gerror.c: docs + + * docs/reference/glib/tmpl/error_reporting.sgml: docs + +Wed Sep 6 10:28:34 2000 Owen Taylor + + * guniprop.c gunicode.h gutf8.c: Some inline docs fixes. + +2000-09-06 Sebastian Wilhelmi + + * glib.h, gtimer.c, tests/thread-test.c: + s/G_MICROSEC/G_USEC_PER_SEC/ + + * glib.h: Removed G_G{U}{SHORT|INT|LONG}_FORMAT from glib.h, as + they are really superfluous. + +Tue Sep 5 20:16:27 2000 Owen Taylor + + * configure.in docs/Makefile.am: Add gtk-doc checks + for newly added docs/reference/ subdir. + +2000-09-05 Sebastian Wilhelmi + + * gthread.c (g_thread_error_quark): Don't use a G_LOCK, as it + isn't necessary. + +2000-09-01 Sebastian Wilhelmi + + * gstring.c (g_string_free): Use g_return_val_if_fail instead of + g_return_if_fail, as the function now is supposed to return + something. + + * gerror.c, gerror.h (g_propagte_error): Added function + g_propagte_error to hand over local errors to the calling + function. + + * glib.h: Include gerror.h before it is used for some g_thread_* + functions. + + * gthread.c, gthreadpool.c, glib.h: Enable error reporting for + thread creation, namely for g_thread_create, g_thread_pool_new, + g_thread_pool_push and g_thread_pool_set_max_threads. + + * tests/thread-test.c, tests/threadpool-test.c: Adapted + accordingly. + +2000-08-31 Tor Lillqvist + + * glib.h + * glib.def + * giowin32.c (g_io_channel_win32_make_pollfd): New function, to + make a GPollFD from a GIOChannel. Creates the events and starts + the reader thread if necessary. + + * glib.h + * giowin32.c (g_io_channel_win32_poll): No use for separate + condition parameter. + + * gmain.c (g_get_current_time): (Win32): Simplify, use + GetSystemTimeAsFileTime(). + +2000-08-27 Tor Lillqvist + + * giowin32.c (g_io_channel_win32_poll): New function, otherwise + like g_io_channel_win32_wait_for_condition(), but accept several + GPollFDs. + (g_io_channel_win32_wait_for_condition): Call + g_io_channel_win32_poll(). + + * glib.h: Declare g_io_channel_win32_poll(). + + * gwin32.c (g_win32_error_message): Don't believe return value + from FormatMessage. + +2000-08-25 Elliot Lee + + * glib.h, gunicode.h, gmodule/gmodule.h: + Mark the following functions G_GNUC_CONST (to allow optimization) + because their results are a function of only their parameters: + g_int_hash, g_int_equal, g_direct_hash, g_direct_equal, + g_quark_to_string, g_date_is_leap_year, g_date_days_in_month, + g_date_monday_weeks_in_year, g_date_sunday_weeks_in_year, + g_spaced_primes_closest, g_unichar_is*, g_unichar_to*, + g_unichar_*digit_value, g_unichar_type + +2000-08-21 Elliot Lee + + * gobject/Makefile.am, gobject/gobject-query.c, + gobject/gparamspecs.c: Fix inclusion of config.h + +Mon Aug 21 14:46:23 2000 Owen Taylor + + * tests/gio-test.c: Fix a couple of trivial bugs that + were causing warnings. + +Mon Aug 21 14:39:36 2000 Owen Taylor + + * glib.h: Use C99 varargs macros where possible + (check __STDC_VERSION__), otherwise, on gcc, use an alternate + form of gcc varargs which is more likely + to be supported going forward. (Based on some code + from Raja Harinath) + +2000-08-17 Darin Adler + + * glib.h: + * garray.c: (g_array_free), (g_ptr_array_free), + (g_byte_array_free): Return the data left behind. + * gstring.c: (g_string_free): Return the data left behind. + + Changed the free calls that leave data behind so they + return a pointer to the left-behind data, NULL if told not + to leave anything behind. This makes these calls easier + to use correctly, without any incompatible API change for + callers that don't know about the return value. Of course, + it would be even clearer if the free calls weren't dual-purpose + in the first place. + +2000-08-12 Tor Lillqvist + + * giowin32.c: Some indentation and spacing fixes. Add some more + logging. + (g_io_win32_add_watch): New function, with common code from + g_io_win32_fd_add_watch and g_io_win32_sock_add_watch. Don't start + more than one reader thread for a GIOChannel. We should obviously + have just one reader thread reading a file descriptor or socket. + +2000-08-10 Havoc Pennington + + * gthread-2.0.pc.in (Cflags): don't duplicate glib Cflags + + * gmodule-2.0.pc.in (Cflags): don't duplicate glib Cflags + + * gobject-2.0.pc.in (Cflags): don't duplicate Cflags from glib + itself + +2000-08-10 Havoc Pennington + + * glib-2.0.pc.in (Cflags): Look in glib-2.0/include for + glibconfig.h + +2000-08-07 Tor Lillqvist + + * tests/gio-test.c (shutdown_source): New function, that calls + g_source_remove(). Check return value of g_source_remove(), and + decrement running subprocess counter only if g_source_remove() + actually did remove the source. + + (recv_message): Call shutdown_source() on EOF condition. Return + FALSE on G_IO_HUP and G_IO_ERR condition. Fix printf format typo. + +Sun Aug 6 20:06:02 2000 Tim Janik + + * gmessages.c (g_log_domain_check_free): keep *last updated while + running through the domain list, so we don't screw up the removal, + patch provided by Gady Kozma . + +Sun Aug 6 20:03:41 2000 Tim Janik + + * gmessages.c (g_log_remove_handler): keep *last updated while running + through the handler list, so we don't screw up the removal. + +Sun Jul 30 16:54:13 2000 Owen Taylor + + * gunicode.h: Fix stray character + + * gutf8.c (g_unichar_to_utf8): Allow outbuf to be NULL, in + which case we just compute the length. + +2000-07-31 Havoc Pennington + + * Makefile.am (EXTRA_DIST): forgot to add .pc.in to EXTRA_DIST + +2000-07-31 Havoc Pennington + + * glib-2.0.pc.in, gobject-2.0.pc.in, gmodule-2.0.pc.in, + gobject-2.0.pc.in: pkg-config data files + + * Makefile.am: Install/dist the .pc files + + * configure.in: Output the .pc files + +2000-07-31 Tor Lillqvist + + * giowin32.c (buffer_read): The code didn't compile (must + have been sleepy when committing). "return" instead of "break" + + (g_io_win32_fd_add_watch): Cannot check if the file descriptor is + readable by calling ReadFile to read zero bytes. ReadFile blocks + on NT even if trying to read nothing at all. So, don't check if + file descriptor is readable; assume this function isn't called + otherwise. + +Sun Jul 30 10:44:16 2000 Tim Janik + + * gmain.c (g_get_current_time): fix tor's recent changes which + got rid of a required variable in the non-windows path. + +2000-07-30 Tor Lillqvist + + Finally, a new and improved IO Channel and condition watch + implementation for Win32. Based on code provided by Craig Setera. + + When watching file descriptors, for which there is no select() + like functionality on Win32 that would work on all Win32 platforms + for all types of file descriptors (including anonymous pipes), we + start a new thread that blocks while trying to read from the file + descriptor. When the read returns, a Win32 Event is signalled that + the polling routine eventually notices. Meanwhile, the data being + read is stored in a circular buffer, from where the IO channel's + read() method picks it up. + + If the buffer fills up the reading thread has to wait for space + becoming available. For this another Win32 Event is used. The IO + Channel's read() method signals this when it has read some data + out of the buffer. + + The separate reader thread(s), and the circular buffer(s) with + associated events mean lots of possibilities for fun parallelism + errors. But it seems to work OK, i.e. GIMP runs. + + * gmain.c: Small changes to the Win32 polling function. + (g_main_win32_get_poll_func): New function. Perhaps it would be a + good idea to provide this on all platforms. + + * giowin32.c: The bulk of the new implementation. + (g_io_channel_win32_wait_for_condition): New function. To be used + where on Unix one does a select() on the channel's fd, like + libgimp's gimp_extension_process(). Could be provided on all + platforms. + + * glib.h: Update documentation for IO Channels on Win32. Remove + the declarations for the as of now obsolete old functions related + to IO Channels for pipes with "wakeup" messages. + + * glib.def: Some new functions. + + * tests/gio-test.c: New file, to test GIOChannel and main loop. + + * tests/Makefile.am + * tests/makefile.mingw.in: Add it. + + (Later the same night:) + + * giowin32.c: Compile in the debugging code all the time, but only + output debug messages if told so. Add (unadvertised) function to + turn on/off debug messages for a channel. + + (buffer_read): Don't loop. It is expected behaviour to return a + short read occasionally, for instance when reading from + pipes. It's the calling code that should loop if it *knows* how + much the writer has written. + + * tests/gio-test.c: Correct the program's name in the output. + (recv_message): Loop calling g_io_channel_read() (in a new + function read_all()) until we have all the bytes we want (that we + know the writer has written/will write). + +Thu Jul 27 05:15:11 2000 Tim Janik + + * gstrfuncs.c (g_strlcpy, g_strlcat): completed tor's fix + to cover both #ifdef branches. + +2000-07-26 Tor Lillqvist + + * gstrfuncs.c (g_strlcpy, g_strlcat): Return 0 on error, not NULL. + + * glib.def: Add g_strlcpy, g_strlcat. + + * glibconfig.h.win32.in: Add gsize and gssize. + +Wed Jul 26 12:59:31 2000 Tim Janik + + * *.[hc]: applied patch from Andreas Persenius that + updates the license headers to the GNU Lesser General Public License, + as well as updating the copyright year to 2000. + +Wed Jul 26 05:47:48 2000 Tim Janik + + * configure.in: + * testglib.c: + * gstrfuncs.c: + * glib.h: added g_strlcat() and g_strlcpy() wrappers, supplied by + David Wheeler : + + * glib.h, gstrfuncs.c: added g_strlcpy and g_strlcat to support + safe manipulation of fixed-length string buffers. + These functions were originally developed by Todd Miller to simplify + development of security-related programs, and + are available on many (but not all) Unix-like systems, + including OpenBSD, FreeBSD, and Solaris. See + ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3 + and http://www.openbsd.org/security.html. + If there's a strlcpy/strlcat on the system, it's called, otherwise + an implementation is provided. + + * testglib.c: Added tests for g_strlcpy, g_strlcat. + +Wed Jul 26 05:03:24 2000 Tim Janik + + * acglib.m4 (GLIB_SIZEOF): include and if + STDC_HEADERS is defined. + + * glib.h: + * glibconfig.h: define gsize and gssize in terms of GLIB_SIZEOF_SIZE_T + + * glib.h (g_return_if_reached): applied darin's fix for copy'n + paste error in the macro implementation. + +Wed Jul 26 00:46:03 2000 Tim Janik + + * glib.h: applied patch from Darin Adler which + supplies g_return_if_reached(), g_return_val_if_reached() and + g_critical(). + +2000-07-22 Tor Lillqvist + + * build-dll: Fix resource handling, the resource file got left out + from the DLL after all... Remove the WIN32APIHEADERS, not needed + with current windres. + + * glib.def: Add new functions. + +2000-07-20 Sebastian Wilhelmi + + * gutils.c, glib.h: Mark the functions g_basename and g_dirname + deprecated. They will issue an warning once, when compiled with + G_ENABLE_DEBUG, but continue to work as before. Instead the + functions g_path_get_basename and g_path_get_dirname should be + used, which BOTH return newly allocated memory, that has to freed + by g_free. The new g_path_get_basename now strips trailing slashes + from the path. This fixes #5097. For discussion see + http://mail.gnome.org/pipermail/gtk-devel-list/2000-April/003139.html + + * gwin32.c, testglib.c, tests/dirname-test.c: Use the new + functions instead of the old ones. + + * ghash.c, gscanner.c, glib.h: Mark the functions + g_hash_table_freeze, g_hash_table_thaw and thus + g_scanner_freeze_symbol_table and g_scanner_thaw_symbol_table + deprecated. They will issue an warning once, when compiled with + G_ENABLE_DEBUG. This fixes Bug #3883. For discussion see + http://mail.gnome.org/pipermail/gtk-devel-list/2000-April/003139.html + +2000-07-19 Sebastian Wilhelmi + + * configure.in, glib.h: glibconfig.h and glib.h now include files + outside of the extern "C" block. Makes some C++ compiler + happy. Reported by Denis Vakatov . + +Sat Jul 15 23:49:03 2000 Owen Taylor + + * glib/glib.texi: Remove incomplete start of info file - + real docs are in RDP. + +Sat Jul 15 22:44:22 2000 Owen Taylor + + * configure.in: Add build/Makefile and + build/win32/Makefile to AC_OUTPUT() so things build + again. + +Sat Jul 15 09:11:46 2000 Tim Janik + + * gstrfuncs.c (g_strncasecmp): fixed an off by 0 error (yeah, + the function went off when the while (n--) loop failed due to + n==0 ;), reported by Jean-Louis HAMEL . + +2000-07-15 Tor Lillqvist + + * Makefile.am (SUBDIRS): Include the "build" module in GLib, too, + to make it more self-contained. If your CVS client doesn't + automatically get it, do a cvs get build in glib. + + * */makefile.mingw.in: Include make.mingw from build in the glib + source directory. + +Fri Jul 14 16:26:35 2000 Owen Taylor + + * Release 1.3.1 + +Fri Jul 14 12:22:49 2000 Owen Taylor + + * configure.in Makefile.am glib-config.m4 glib.m4: Move + glib-config to glib-config-2.0 move glib.m4 to + glib-2.0.m4 + + * Makefile.am gobject/Makefile.am gmodule/Makefile.am + gthread/Makefile.am tests/Makefile.am: Change + library names to libglib-1.3.la, etc, so that we + can distinguish glib-1.2 and glib-2.0 on the linkline. + + * Makefile.am gobject/Makefile.am gmodule/Makefile.am: + Move include files into /usr/include/glib-2.0. + +Thu Jul 6 18:54:49 2000 Owen Taylor + + * docs/Makefile.am (EXTRA_DIST): Remove info files + from the build. + +2000-07-14 Tor Lillqvist + + * glib.def: Add g_error functions. + + * makefile.mingw.in: Add gbacktrace.o. + + * gbacktrace.c: No need to include . + +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + +Sun Jul 9 21:20:45 2000 Owen Taylor + + * gunicode.h: Include stddef.h instead of stdlib.h + +2000-07-08 Tor Lillqvist + + * glib.h (GLIB_VAR): Rename the GUTILS_C_VAR macro to GLIB_VAR. + + * gunicode.h: Mark the g_utf8_skip array with GLIB_VAR. + + * glib.def: Add two missing entry points. + +Thu Jul 6 15:35:28 2000 Owen Taylor + + * Release 1.3.1 + + * Makefile.am (EXTRA_DIST): Dist fixes. + + * configure.in: Moderate the warnings just a little bit. + +2000-07-05 Tor Lillqvist + + * README.win32: Update. + +Mon Jul 3 17:58:02 2000 Owen Taylor + + * gutf8.c (g_utf8_get_charset_internal): Fix up + to correspond to configure.in checks. + +Mon Jul 3 17:18:19 2000 Owen Taylor + + * glib.h: Comment g_get_codeset() out of the header file + temporarily. (Very similar to g_get_charset(), need + to resolve the two.) + +2000-07-01 Tor Lillqvist + + * glib.def: Add new entry points. + + * makefile.{mingw,msc}.in: Add the new Unicode object files. + +Thu Jun 29 15:57:28 2000 Owen Taylor + + * NEWS: updated + + * Makefile.am: added snapcheck target to go along with snapshot + + * gstring.c glib.h (g_string_hash): Add g_string_hash to + go along with g_string_equal. + +Tue Jun 27 12:40:23 EDT 2000 David A. Wheeler + + * glib.h: Added g_string_equal for comparing GStrings; + changed g_str_equal so it returns gboolean (instead of gint). + + * gstring.c: Modified GString implementation to support embedded + ASCII NUL ('\0') characters, and implemented g_string_equal. + + * testglib.c tests/string-test.c: Added tests for g_string_equal + and tests for proper handling of embedded ASCII NUL characters. + +Wed Jun 28 22:52:00 2000 Owen Taylor + + * Makefile.am (libglib_la_SOURCES): Fix + gunichartable.h => gunichartables.h. (From Eric Limings) + +Fri Jun 23 17:20:26 2000 Tim Janik + + * glib.h: define gstring in terms of gchar*. this typedef reflects + the type name of the primitive G_TYPE_STRING in the gobject module. + +Wed Jun 21 12:09:03 2000 Owen Taylor + + * gunicode.h gutf8.c guniprop.c gunidecomp.[ch] gunichartables.h + Makefile.am glib.h: Initial pass at adding unicode support + functions. A few things still need to be implemented, a bit + of cleanup needs to be done, tests need to be added, and + the docs need to be finished, but this should allow replacing + most or all use of libunicode. + +2000-06-06 Tor Lillqvist + + * giowin32.c (g_io_channel_win32_pipe_readable): If we are + watching the same pipe for different conditions (with different + callbacks), check them all. Only call the callback for G_IO_IN + from here. (This bug popped up when a watch for G_IO_ERR|G_IO_HUP + was added to gimplib.) + +2000-05-30 Tor Lillqvist + + * gutils.c (g_locale_get_codeset): Implement on Win32. + + * glib.def: Add g_get_codeset. + + * tests/Makefile.am (EXTRA_DIST): makefile.cygwin* has been + renamed to makefile.mingw*. + +Tue May 30 16:01:32 2000 Owen Taylor + + * glib.h gutils.c: Move the g_locale_get_codeset() up in the + header file to correspond to to comments about memory + management. Rename to g_get_codeset() to avoid + polluting the g_locale_* namespace, which probably + would have g_locale_get_codeset (GLocale *locale). + Add a doc comment. + +Mon May 29 14:10:35 2000 Owen Taylor + + * gutils.c (g_locale_get_codeset): Add function to get the + codeset name for the current locale. + + * configure.in acconfig.h: Add check for nl_langinfo(CODESET); + +Fri May 19 11:39:29 2000 Tim Janik + + * gutils.c (g_snprintf): + (g_vsnprintf): added argument assertments. + + * gstring.c (g_string_assign): added argument assertments. + (g_string_truncate): make len a guint. + +Fri May 19 09:00:44 2000 Tim Janik + + * gmem.c (g_free): fixed SIZEOF_LONG==4 assumption with + ENABLE_MEM_CHECK, from Art Haas . + + * gslist.c (g_slist_reverse): shut up compiler. + + * gscanner.c (g_scanner_get_token_ll): removed inline assignment. + + * garray.c: remove index>=0 checks for unsigned indices. + + * gmain.c (g_idle_prepare): timeout assignment fix. + + * gtree.c (g_tree_node_rotate_right): shut up compiler. + +2000-05-13 Tor Lillqvist + + * makefile.mingw.in + * tests/makefile.mingw.in + * build-dll: Rename makefile.cygwin(.in) to + makefile.mingw(.in), which better describes what it is. Move the + build of gmodule, gthread and gobject DLLs to makefiles in those + directories. Move resource file handling and build number bump to + build-dll, where it sits much cleaner. + + * README.win32 + * Makefile.am (EXTRA_DIST): Update accordingly. + + * glib.h: Add G_PI, G_PI_2, G_PI_4, G_E, G_LN2, G_LN10 and + G_SQRT2. M_PI etc aren't necessarily in in strict ISO C + implementations. + + * glib.def: Add g_strcanon. + + * gtree.c (g_tree_node_rotate_left): Remove unused variables. + + * gwin32.c (g_win32_opendir): Remove unneeded statement. + +Thu May 4 02:04:46 2000 Tim Janik + + * configure.in (STRIP_DUMMY): some Make 3.79 $(strip ) versions are + broken and require an empty arg, give it to them. + +Fri Apr 28 23:54:35 2000 Tim Janik + + * setup things for a new sub-library libgobject: + + * Makefile.am (SUBDIRS): added gobject + + * glib-config.in: feature -lgobject. + + * configure.in (AC_OUTPUT): generate gobject/Makefile. + + * glib.m4 (AM_PATH_GLIB): feature gobject module. + + * glib.spec.in: added %{prefix}/lib/libgobject-1.3.so.* + +Fri Apr 28 21:41:49 2000 Tim Janik + + * glib.h: added G_STRLOC macro. + G_STRUCT_OFFSET(): signedness corrections. + (G_CSET_DIGITS): list 0-9. + * gscanner.c (g_scanner_config_template): use G_CSET_DIGITS. + + * glib.h: + * gstrfuncs.c: + (g_strdown): + (g_strup): + (g_strreverse): return the modified string instead of void, so + calls to these functions can be nested. + (g_strcanon): new function, canonicalizes string according to + a given character set. + +Fri Apr 28 19:45:16 2000 Tim Janik + + * gasyncqueue.c (g_async_queue_unref): get rid of an unused variable. + +Wed May 10 19:52:44 2000 Owen Taylor + + * glib.m4: Print found version when test succeeds. + +2000-05-04 Tor Lillqvist + + * makefile.cygwin.in + * tests/makefile.cygwin.in: Include the common makefile snippet + from ../build/win32. + + Maybe CVSROOT/modules should be changed so that the 'build' module + is included within the glib module (and gtk+, and gimp, and maybe + others later), in the same way as the 'macros' module is included + in lots of GNOME CVS modules? + +2000-05-02 Tor Lillqvist + + * glib.def: Add new functions. + + * makefile.{cygwin,msc}.in (glib_OBJECTS): Add new object files. + + * tests/makefile.{cygwin,msc}.in: Add thread pool-test. + +2000-04-28 Sebastian Wilhelmi + + * gasyncqueue.c: New File implementing an asynchronous queue to be + used for asynchronous inter-thread communication. + + * gthreadpool.c: New File implementing a thread pool to be used + for distributing work among several threads. + + * glib.h: Added the type and function declarations for these two + types. + + * tests/threadpool-test.c: New File implementing a test for the + thread pool. This also checks the asynchronous queue underlying + the thread pool. + + * tests/Makefile.am: Changed accordingly. + +2000-04-26 Sebastian Wilhelmi + + * configure.in: Look for both pthread_create and pthread_join in + the thread library. Some systems define one of them, but not both + in libc. Arghh. Now we really start a thread and join it later and + check, whether the thread to actually ran. + + * glib.h, gcache.c, gtree.c: Changed the 'value' parameter of + g_cache_remove from gpointer to gconstpointer. Dito for the 'key' + parameter of g_tree_lookup and g_tree_remove and the 'data' + parameter of g_tree_search. This function now takes a function of + type GCompareFunc instead of GSearchFunc. This fixes Bug + #8267. Thanks to Juan Toledo for + pointing that out. + + * glib.h: Removed declaration of GSearchFunc. + + * gmem.c: s/GSearchFunc/GCompareFunc/. + +2000-04-19 Tor Lillqvist + + * glib.def: Update entry point list. + +2000-04-19 Sebastian Wilhelmi + + * glib.h (G_TRYLOCK): Made the debugging G_TRYLOCK call also work + for compilers with funny G_STMT_(START|END) macros. + + * tests/thread-test.c: Implemented a check for that. + + * gutils.c (g_getenv): Changed the win32 part of this function to + be thread safe and to make the returned environment string + persistent to match the UN*X behavior. This is again a response to + Bug #8983. + + * glib.h (G_LOCK_NAME): Removed parentheses around the lock name, + as that seems to cause problems for some compilers and really + isn't necessary. + +Wed Apr 19 08:32:32 2000 Tim Janik + + * gscanner.c (g_scanner_new): make sure that + scanner->config->cset_skip_characters is "" instead of NULL, so we + don't segfault further on. + +2000-04-18 Sebastian Wilhelmi + + * glib.h, glist.h, gslist.h: Changed the 'data' parameters from + gpointer to gconstpointer for the functions + g_(list|slist)_(remove|find|find_custom|index), as they do not + change this parameter. This fixes bug #4836. + + * glib.h: Changed comment for g_getenv to reflect, that the + returned memory must not be freed. Fixes bug #8983. + +2000-04-17 Sebastian Wilhelmi + + * configure.in, acconfig.h: Add configure test for garbage + collector friendliness for GLib. If enabled, ENABLE_GC_FRIENDLY + will be defined. + + * garray.c, ghash.c, glist.c, gmain.c, gmem.c, gnode.c, gqueue.c, + gslist.c, gtree.c: If ENABLE_GC_FRIENDLY is defined, NULLify all + memory released by the user, but cached by GLib. This lets a + garbage collector have a more correct view of the actually used + memory. + + * garray.c, glib.h: Added g_(array|ptr_array|byte_array)_sized_new + functions, that reserve a certain amount of memeory for the array + at creation time to avoid reallocation. Fixes bug #6707 from + Charles Kerr . + + * glib.h, gqueue.c, tests/queue-test.c (main): Renamed + g_queue_create to g_queue_new in conformance to all other GLib + data types. + +2000-04-07 Sebastian Wilhelmi + + * grand.c (g_rand_new): Fixed bug. Thanks to Marko Kreen + for reporting that. + +2000-03-26 Tor Lillqvist + + * README.win32: Tell about using the mingw-based gcc, which is + much easier than modifying the cygwin gcc to product mingw code + for the msvcrt runtime. + + * makefile.cygwin.in (WIN32APIHEADERS): Kludge to make it work + with a "pure" mingw gcc, too. + +2000-03-24 Sebastian Wilhelmi + + * garray.c: Made GArray behave correctly. Now zero_terminated + really means, that the element array->data[array->len] exists and + is zeroed, and clear means that any unassigned elements obtained + through g_array_set_size (the only way to get unassigned elements + AFAICT) are zeroed. Added some macros to make the code more + obvoius. Also made GPtrArray zero elements after + g_ptr_array_set_size. This is done in a portbale way (assignment + of NULL instead of just memsetting it to zero), though that might + be more portability than we actually want. + + * Makefile.am, gthread/Makefile.am, gmodule/Makefile.am, + tests/Makefile.am: Added various win32 related *.in files to + EXTRA_DIST to let 'make distcheck' procude all the corresponding + files, which it silently fails to do currently. + +2000-03-23 Sebastian Wilhelmi + + * configure.in: After finding the right thread library (containing + e.g. pthread_create) we now search for the right realtime library + (containing e.g. sched_get_priority_max). Makes the output of the + thread related libraries correct. + + * gtimer.c (g_usleep): The current implementation of g_usleep + (simply calling select) doesn't work reliable for multi-threaded + programs on some platforms (bad omen for the main loop....), so I + changed the implementation for thread-using programs to wait for a + GCond for the specified amount of time (NB: sleep and usleep are + not MT-safe in general, because they often use signals). + +Wed Mar 22 16:49:57 2000 Owen Taylor + + * gmem.c (g_mem_chunk_area_compare): Fix indentation. + +2000-03-22 Elliot Lee + + * gmem.c (g_mem_chunk_area_compare): Fix 64-bitness bug in + comparing two pointers more than 4G apart. + +2000-03-22 Tor Lillqvist + + * gutils.c: Move Win32-only includes after inclusion of glib.h, so + that G_OS_WIN32 is defined. + + * glibconfig.h.win32.in: Add GSystemThread. + +2000-03-22 Sebastian Wilhelmi + + * gutils.c (g_get_current_dir): Ok, Marcus Brinkmann + convinced me, that 128 KB + path length might not be enough for the HURD. So I changed the + loop to at least avoid an integer overflow, which could happen at + beyond 2GB size ;-) + + * configure.in: Test for sched_yield as the native yield function + first. Corrected typo g_thread_sleep -> g_usleep. Corrected + message for the pthread_create test. Negative Priorities are + allowed (and used on Solaris), so consider + sched_get_priority_min failed only if it returns -1, not <0. Check + for sched_get_priority_min also in -lrt, if not found in -lpthread + alone and add -lrt to G_THREAD_LIBS then. Remove special case + handling of priorities for older solaris versions and posix + threads. Thanks to Wan-Teh Chang for suggesting + some of those changes. + + * config.guess, config.sub, ltconfig, ltmain.sh: + Upgrade to libtool 1.3.4. + +2000-03-21 Sebastian Wilhelmi + + * glib.h, configure.in, gutils.h: always define G_GNUC_EXTENSION, + even when not needed by GLib. That's actually also the way, the + GLib reference manual describes that macro. Therefore I had to + remove the lonesome #include in gutils.c, which + doesn't seem to be needed there however. This change should make + Ben Gertzfield happy. + + * gutils.c: Furthermore two warnings in gutils.c were voided, + which crept in due to my last change. + + * gutils.c (g_get_current_dir): Allocate only up to 128KB for a + pathname. While this is an arbitrary value just like 2048, it + seems to be enough (after all, even 4GB is an arbitrary value). + +2000-03-20 Sebastian Wilhelmi + + * gmain.c (g_main_poll): Warn in case of an error during the call + to poll(2). Closes Bug#7564 as reported by David Helder + . + + * gutils.c (g_get_current_dir): Make g_get_current_dir work on + systems with unlimited pathname length like the HURD (It worked + there before, but only for pathes shorter than 2048). Closes + Bug#4525 as reported by Marcus Brinkmann + . + +2000-03-17 Sebastian Wilhelmi + + * giounix.c (g_io_unix_write, g_io_unix_read): Interpret EINTR as + G_IO_ERROR_AGAIN. + +2000-03-17 Sebastian Wilhelmi + + * configure.in: Added the missing POSIX_NO_YIELD and + POSIX_NO_PRIORITIES warning messages. + + * configure.in: Use AC_TRY_RUN instead of AC_TRY_LINK, to test for + real thread support. On solaris pthread_create can be linked to + even in -lc, but it doesn't work then. + + * configure.in: Don't use priorities for threads, when the + minimal/maximal priorities couldn't be determined at configure + time. + + * configure.in, gthread.c: Always define GSystemThread in + glibconfig.h to represent a system thread. + + * configure.in: Do not use native recursive threads, when + possibe. We use some features, that they do not expose (namely the + depth counter). + + * glib.h, gthread.c: Redefined GStaticRecMutex. The functions are + now implemented in a different way, which should be way + faster. Alsothere are now functions g_static_rec_mutex_unlock_full + and g_static_rec_mutex_lock_full to leave/enter a recursive mutex + completly. + + * gthread.c (g_thread_self): Do not test the system_thread to be + non-zero to speed things up. + + * gthread.c (g_mutex_init): Therefore set the system_thread of the + main thread here. + + * tests/thread-test.c: Rerun all tests once again, but this time + we fool the system into thinking, that the available thread system + is not native, but userprovided. + +2000-03-13 Sebastian Wilhelmi + + * gqueue.c (g_queue_push_tail_link, g_queue_push_head_link): We + want the next and prev pointer of the inserted link to be NULL. + +2000-03-06 Sebastian Wilhelmi + + * configure.in: Another small change to the pthread_.. search + pattern. Should work *now* for AIX. + +2000-03-04 Tor Lillqvist + + * gwin32.c (g_win32_error_message): New function that returns the + message string for a Win32 error code. + + * glib.h: Declare it. + + * glib.def: Export it, plus g_node_copy. + +2000-03-03 Sebastian Wilhelmi + + * configure.in: Make the search for pthread_attr_... prototypes + find names at the start of a line also, like it is on AIX. Thanks + to Valdis Kletnieks for the info. + +Wed Mar 1 10:39:39 2000 Tim Janik + + * gslist.c (g_slist_reverse): minor optimization. + + * testglib.c (g_node_test): added a couple of tests for + g_node_copy(). + + * glib.h: + * gnode.c (g_node_copy): new function to copy subtrees, + supplied by dbsears@ix.netcom.com. + changed iterator to walk the children list backwards, so + we get down from O(n^2) to O(n). + + * gnode.c (g_node_first_sibling): applied patch from + dbsears@ix.netcom.com to optimize access if node->parent + is present. + + * gutils.c (g_get_any_init): backed out HAVE_PW_GECOS check around + assignment of g_real_name, sicne HAVE_PW_GECOS is never defined and + thus breaks the original code. + + * merged changes from 1.2.7. + +Fri Jan 28 11:37:41 2000 Owen Taylor + + Bug #4156 - Changes vaguely modelled after Scott Gifford's patch + + * gtimer.c (g_timer_elapsed): Never report negative times - + clip times to 0. + + * gmain.c (g_timeout_prepare): Guard against unexpected + clock shifts by never setting a timeout of more than + data->interval msecs. + +2000-02-27 Tor Lillqvist + + * glib.def: Add new functions. + +2000-02-23 Tor Lillqvist + + * README.win32: Add a missing step to the setup instructions for + gcc-2.95.2. Thanks to Arnaud Charlet. + + * glib.def: Add missing entry point. + +2000-02-18 Sebastian Wilhelmi + + * configure.in: Changed GCC version test to also accept major + versions > 2. Thanks to Ben Gertzfield for + pointing this out. + +Thu Feb 17 12:53:44 2000 Tim Janik + + * gstring.c: changed g_str_hash() to a 31 bit version based on + a submission by Karl Nelson and hand optimized ad absurdum by + various people ;) + + * gstring.c: applied patch from havoc for new gstring functions, + added some more sanity checks, coding style fixups. + +2000-02-13 Havoc Pennington + + * tests/string-test.c (main): Add tests for the new GString + features + + * testglib.c (main): Add tests for the new GString features + + * gstring.c (g_string_insert_len): New function; insert + a given length of string at a given position. + (g_string_append): reimplement in terms of g_string_insert_len + (g_string_append_len): new function + (g_string_insert_c): accept -1 for "pos" arg to mean "append" + (g_string_append_c): reimplement in terms of g_string_insert_c + (g_string_prepend): reimplement in terms of g_string_insert_len + (g_string_prepend_len): new function + (g_string_prepend_c): reimplement in terms of g_string_insert_c + (g_string_insert): reimplement in terms of g_string_insert_len + + * glib.h: Declare g_string_insert_len, g_string_append_len, + g_string_prepend_len + +Sun Feb 13 08:16:47 2000 Tim Janik + + * configure.in: wtf??? someone destroyed the configure.in, reverting to + an older version from Feb 4 which apears to still work. + +2000-02-07 Tor Lillqvist + + * gmodule.rc.in gthread.rc.in: Move to corresponding subdirectories. + + * Makefile.am + * gmodule/Makefile.am + * gthread/Makefile.am: Change accordingly. + + * makefile.cygwin: Corresponding changes, some cleanup. + +2000-02-05 Tor Lillqvist + + * glib.rc.in gmodule.rc.in gthread.rc.in: New files, for putting + version info in the DLLs on Win32. + + * Makefile.am: Generate corresponding *.rc files and distribute + them. + + * makefile.cygwin.in: Add rules to automatically bump a "build + number" in the version info in the rc files each time the DLL is + built. But do this only for the person who releases binaries. If + others build the DLLs, the build number is set to zero. + +Fri Feb 4 19:36:05 2000 Tim Janik + + * glib.h: + * gdataset.c: return stolen data from g_datalist_id_remove_no_notify() + and g_dataset_id_remove_no_notify() to avoid second lookup for common + use. + +2000-02-01 Tor Lillqvist + + * glib.h + * gstrfuncs.c (g_filename_to_utf8, g_filename_from_utf8): New + functions for conversion between UTF-8 and the encoding expected + by C runtime functions like open() and stat(), and returned by + readdir(). + + Implement them on Win32 where we use the system "ANSI" codepage, + which might be single-byte or double-byte. On Unix, just skip the + issue for now and provide dummy implementations that return a copy + of the argument. + + * README.win32 + * build-dll + * glib.def: Minor updates. + +Wed Jan 26 05:24:38 2000 Tim Janik + + * glib.h: + * gmain.c: s/current_time/dispatch_time/ for the dispatch() handlers. + refetch the current time after invocation of poll() to cover up for + the time spent in that function call. + +Fri Jan 21 10:18:24 2000 Owen Taylor + + * glib.h (G_N_ELEMENTS): Added G_N_ELEMENTS macro to determine + the number of elements in an array. + +Sun Jan 9 13:28:36 2000 Tim Janik + + * gstrfuncs.c (g_strtod): correctly fetch the current locale, + fix from owen. + +1999-12-16 Tor Lillqvist + + * gmodule/gmodule-win32.c: Use FormatMessage to translate system + error codes into textual messages. + +1999-11-25 Sebastian Wilhelmi + + * glib.h (G_TRYLOCK): This of course should return TRUE in a + program with a thread-disabled GLib. + +1999-11-18 Tor Lillqvist + + * glib.def: g_strjoin was missing. + +1999-11-16 Sebastian Wilhelmi + + * acconfig.h, config.h.win32.in, configure.in: Renamed + GLIB_SIZEOF_PTHREAD_T to GLIB_SIZEOF_SYSTEM_THREAD to reflect + changed meaning. + + * configure.in: Cope with systems, that have a pthread_t type, + that is not a pointer. Hint from Karl Nelson + . Define GLIB_SIZEOF_SYSTEM_THREAD to 4 + for Solaris. Cope with systems, that have no default mutex + initialize, like obviously most DCE systems. + + * glib.h, gthread.c: Changed the prototype of thread_create and + thread_self to return the system thread into provided memory + instead of a return value. This is necessary, as HPUX has a + pthread_t, that is bigger than the biggest integral type there. + + * gthread.c: system_thread is no longer a pointer, but an memory + area of size GLIB_SIZEOF_SYSTEM_THREAD. Changed the + zeroinitialization and the tests for zeroness accordingly. + +1999-11-09 Sebastian Wilhelmi + + * configure.in: Create docs/glib-config.1 from + docs/glib-config.1.in. Makes 'make distcheck' happy (and me too). + + * glib-config.1: Removed from CVS, as it is a generated file. + +1999-11-08 Sebastian Wilhelmi + + * configure.in: Make the test for getpwuid_r work on newer AIX + versions, too. Still works on Solaris and Linux. Patch from Craig + Rodrigues . + +1999-11-08 Tor Lillqvist + + * gwin32.c (g_win32_getlocale): Look at env vars LC_ALL, LC_CTYPE + and LANG first. Some refinements to the sublanguage logic. + +1999-11-04 Tor Lillqvist + + * makefile.{cygwin,msc}.in: Add gwin32 object. Add rule to make .i + (preprocessed source) files. + +1999-11-01 Tor Lillqvist + + * glib.h + * glib.def: Rename Win32-only functions from gwin_* to g_win32_* + to match the GLib naming conventions. + + * gutils.c + * gwin32.c + * testglib.c + * Makefile.am: Move the Win32-only functions to the new + file gwin32.c + +1999-10-31 Tor Lillqvist + + * gutils.c (gwin_getlocale): New Win32-specific function, returns + a Unixish current locale string (en, zh_TW etc). + + * glib.h: Declare it. + + * glib.def: Export it. + + * testglib.c: Test it. + + * gmessages.c (Win32: ensure_stdout_valid): Some improvements, + make sure we don't call AllocConsole several times, which I think + has happened. + +Sun Oct 31 18:55:01 1999 ape@spacetec.no (Asbjorn Pettersen) + + * gcache.c (g_cache_remove): Test if node is NULL. + If not tested, GIMP's script-fu will crash. + +Sun Oct 17 18:11:40 1999 Tim Janik + + * gdataset.c (g_data_set_internal): remove g_dataset_global_lock around + destroy() notification here as well. + +1999-10-15 Sebastian Wilhelmi + + * gdataset.c (g_datalist_clear_i): Avoid Freezing, when g_datalist + is called recursivly. Reported by Ola Andersson . + +Tue Oct 12 14:17:12 1999 Tim Janik + + * glib.h: removed useless g_string(x) macro that cluttered the namespace + and was just a poor wrapper around the cpp '#' symbol, use #x if you + need to work around this. + added new macro G_STRINGIFY(arg) that will convert arg to a string, + no matter whether it contains macros or not. + +1999-10-12 Tor Lillqvist + + * config.h.win32.in: Define the new GLIB_SIZEOF_* constants here, + too. + + * glib.h: Small Win32 comments improvement. + +Tue Oct 12 12:16:12 1999 Tim Janik + + * gmessages.c (g_printf_string_upper_bound): completly new + implementation for printf string upper bounds calculation. + we handle all glibc 2.1 format specifiers now, except for positional + parameters (%nn$...) and wide char strings, plus some obscure upper + case variants of the standard conversions. this fixes a lot of + bugs in the old code, i.e. + - NULL format strings + - floats with exponents >+24 + - %G + - precision specifications in general + - negative field widths + - %p for SIZEOF_VOID_P > 4 platforms + we now issue warnigns in places where the old code would have + caused buffer overruns anyways. warnings are suppressed when invoked + from glogv(), to avoid infinite recursions if someone passes a log + message that comes with really obscure format specifications. + +Tue Oct 12 11:49:00 1999 Tim Janik + + * gstrfuncs.c: nuked old g_printf_string_upper_bound() version. + +Tue Oct 12 03:34:40 1999 Tim Janik + + * glib.h: added GFloatIEEE754 and GDoubleIEEE754 unions to access sign, + mantissa and exponent of IEEE floats and doubles (required by the new + version of g_printf_string_upper_bound). the unions are endian specific, + we handle G_LITTLE_ENDIAN and G_BIG_ENDIAN as of currently. ieee floats + and doubles are supported (used for storage) by at least intel, ppc and + sparc, reference: + http://twister.ou.edu/workshop.docs/common-tools/numerical_comp_guide/ncg_math.doc.html + +Mon Oct 11 18:01:49 1999 Tim Janik + + * configure.in: added additional checks to figure sizes of size_t, + ptrdiff_t and intmax_t (required by g_printf_string_upper_bound). + +Wed Oct 6 12:44:23 PDT 1999 Manish Singh + + * configure.in: blah. use G_WITH_CYGWIN instead of G_HAVE_CYGWIN + +1999-10-05 Tor Lillqvist + + * glib.h: (Win32) Drop the mapping of POSIX function names to the + underscored versions, it's unnecessary after all. With MSVC we get + them from oldnames.lib, with gcc-2.95 and mingw32 from + -lmoldname-msvc. Add comment about what headers to include for + prototypes. + + * glibconfig.h.win32.in: Don't define WIN32 and NATIVE_WIN32. + + * gerror.c (g_on_error_query): (Win32) Slightly increased verbosity. + + * build-dll: Don't strip. + + * tests/string-test.c tests/dirname-test.c: Use G_OS_WIN32. + + * glib.def: Add g_thread_use_default_impl. + +Sun Oct 3 19:46:55 PDT 1999 Manish Singh + + * configure.in: use G_HAVE_CYGWIN instead of G_OS_FEATURE_CYGWIN + +Sun Oct 3 19:25:42 PDT 1999 Manish Singh + + * acconfig.h + * configure.in + * glibconfig.h.win32: G_OS_FOO #defines. I *think* I got the cygwin + and beos stuff right, but I haven't tested it. The respective + porters should fix any screwups + + * glib.h + * gerror.c + * gmain.c + * gmessages.c + * gscanner.c + * gthread.c + * gtimer.c + * gutils.c + * testglib.c: use G_OS stuff + +Wed Sep 22 01:53:18 1999 Tim Janik + + * glib.h (NULL): define NULL as (0L) if __cplusplus is defined, to + avoid "ANSI C++ forbids implicit conversion from `void *' in argument + passing" errors upon NULL usage in C++ programs (gcc-2.95 is on crack + for erroring out on this, instead of just issueing a warning). + + * glib.h (g_trash_stack_pop): use uncasted NULL again. + +Fri Sep 17 10:24:45 1999 Tim Janik + + * gmem.c (g_mem_chunk_compute_size) (g_mem_chunk_new): applied + patch from Soeren Sandmann , to force mem + chunk's area sizes to be a multitiple of atom_size, and to + eliminate the MAX_MEM_AREA restriction of 65536 bytes. we also + catch cases where users pass an area size < atom size with a + return_if_fail statement now (which is ok, because previously this + lead to memory corruption anyways). + +Thu Sep 16 13:19:54 1999 Tim Janik + + * glib.h (g_trash_stack_pop): add explicit (GTrashStack*) cast for NULL + pointer to cure ANSI C++ error. + +Mon Sep 13 23:25:59 1999 Tim Janik + + * gmessages.c (g_logv): in case we have to abort the program, + debugging is enabled and we are not called recursively, try + to abort with raise (SIGTRAP) first, so developers may ignore + certain failure conditions during debugging stage. + +Thu Aug 26 15:09:36 1999 Tim Janik + + * Makefile.am: + * gmodule/Makefile.am: + * gthread/Makefile.am: added --export-dynamic so we can load dynmic + modules, (required, according to the libtool 1.3.3 docu). + +1999-07-23 Sebastian Wilhelmi + + * grand.c (g_rand_new): Use /dev/urandom, as it doesn't block, + which /dev/random might do. Do not XOR the time, when getting the + seed form /dev/urandom, as this is good itself. Prevent the + initial seed from being zero, which causes the PRNG to produce + only zeros. Hints from Colin Plumb . + +1999-08-17 Tor Lillqvist + + * glib.h (g_trash_stack_push): Add a cast. + + * gslist.c + * glist.c: Make the inline functions static inline, and add + separate extern wrappers. Not all compilers produce callable entry + points for inline functions, even if gcc does. + +Sun Aug 15 02:47:14 1999 Tim Janik + + * glib.h (g_trash_stack_pop): eliminate memset() call, since string.h + has not neccessarily been included prior to glib.h. + +Mon Aug 2 21:03:10 1999 Tim Janik + + * configure.in: added --enable-msg-prefix option. + + * gmessages.c (g_log_default_handler): feature "prg_name (pid:%u): " + if --enable-msg-prefix was selected (use "(process:%u): " if + g_get_prgname () returns NULL, along the lines of g_on_error_query). + +1999-08-03 Tor Lillqvist + + * glib.h + * gstrfuncs.c + * tests/strfunc-test.c: Rename g_strccpy to g_strcompress and + g_strecpy to g_strescape per Tim Janik's suggestion. Dropped the + destination parameter, always g_malloc a new string. Fix bug in + g_strcompress, octal digits were gobbled up without limit, should + use max three. + + Sources that use g_strescape must have ifdefs to be compilable + both with GLib 1.2 and 1.3. + +Sat Jul 31 17:52:03 PDT 1999 Manish Singh + + * glib.h + * gstrfuncs.c: the #define for g_strescape interfered with the + compilation of the function, so just remove the function and + note that it's deprecated in the header + +1999-08-01 Tor Lillqvist + + * gstrfuncs.c (g_strccpy, g_strecpy): New functions. + + * glib.h: Declare and document them. Define the deprecated + g_strescape as a macro that calls g_strecpy. + + * tests/strfunc-test.c (main): Test them. + + * makefile.{cygwin,msc}.in + * tests/makefile.{cygwin,msc}.in: Remove gstack and its test + program. + + * glib.def: Additions and removals. + + * README.win32: Improve gcc build instructions. + + * build-dll: Also build import library for MSVC. + +Sat Jul 24 20:11:35 1999 Tim Janik + + * merged GLib 1.3.0 with glib-1.2.3 from Fri Jul 16 22:18:36. + * incorporated proposed cleanups from gtk-devel-list. + + * bumped version number to GLib-1.3.1 + + * glib.h: + * gqueue.c: + * gstring.c: + * glist.c: + removed string tokenisation (we got g_strsplit() and g_strjoin() + already) and readline functions. + s/g_list_delete/g_list_delete_link. + implemented g_slist_delete_link. + removed notion of g_ATEXIT() macro in glib.h, this is an *internal* + macro, g_atexit() is provided for public consumption. + added GTrashStack inline utility functions. + reimplement double eneded queues. + removed GStack implementation, people can use a queue or a (singly) + linked list for this task. + deprecated g_strescape(), we need the SunOS variants here. + + * gdate.c: added DEBUG_MSG() macro to wrap old messages. + + * *.*: CVS merges. + + * upgrade to libtool 1.3.3. + +1999-07-21 Tor Lillqvist + + Win32: With the latest gcc (2.95, pre-release), we can have binary + compatibility with MSVC by using the switch -fnative-struct. No + longer build DLLs with .gcc in the name when using gcc. + + * README.win32: Renew gcc build instructions. + + * build-dll: Comments change, handle also .a files. + + * makefile.cygwin.in + * tests/makefile.cygwin.in: Remove .gcc from DLL name. + +1999-07-13 Tor Lillqvist + + * README.win32: Correct URL for mingw runtime sources. + + * build-dll: Combine commands with &&. + + * glib.h: Map also rmdir() and hypot() for MSVCRT library. + + * makefile.cygwin.in + * tests/makefile.cygwin.in: New DLL naming style. GCC-compiled DLLs are + now called *.gcc.dll, to avoid binary incompatibilities with + MSVC-compiled versions. + + * makefile.msc.in: Cosmetics. + +1999-07-07 Sebastian Wilhelmi + + * configure.in: Test for pthread_join rather than for + pthread_create to determine the right thread-lib. Makes it work on + mips-sgi-irix6.5. Hitn from to Jari Vuoksenranta + . + +1999-07-02 Tor Lillqvist + + * README.win32: Note about need to fix another bug in the mingw32 + headers. + + * makefile.msc.in: Debugging turned on via an nmake variable, + no need to edit the makefile. + +1999-07-01 Sebastian Wilhelmi + + * configure.in, acconfig.h, gutils.c: Added a g_memmove + replacement for platforms without memmove, where bcopy can't + handle overlapping copies and the corresponding checks, which is + taken form the PERL Configure routine. + + * glib.h: Updated the commentary about g_memmove to be right and + more GLib-like. + + * configure.in: Removed test for rand_r, as it isn't used anymore. + +1999-06-30 Sebastian Wilhelmi + + * glib.h, grand.c: Finally removed the g_random_normal and + g_rand_normal functions. + +1999-06-28 Tor Lillqvist + + * glib.def: Add missing export of g_strncasecmp. + +1999-06-21 Jose Mercado + + * glib.spec.in: Changed version number (1.1->1.3) in files section + to allow rpm to build packages again. + +1999-06-21 Tor Lillqvist + + * README.win32: Update the pthreads snapshot version we want. + Advice how to hand-expand the makefile.*.in files. + + * config.h.win32.in: Define values needed by Sebastian Wilhelmi's + new thread stuff. + + * glib.def: Add new functions. + + * glibconfig.h.win32.in: Update the pthreads snapshot version. + Fix typo. + + * gthread.c: Include config.h, guard inclusion of unistd.h. When + using gcc on Win32, g_thread_functions_for_glib_use must be marked + for export here, too. + + * gtimer.c: Implement g_usleep on native Win32 using Sleep (which + only has millisecond granularity, though). + + * makefile.cygwin.in + * makefile.msc.in: Update pthreads snapshot version. File + name changes. Remove testgthread. + + * tests/makefile.cygwin.in + * tests/makefile.msc.in: Add thread-test. Link with gthread lib. + +1999-06-18 Jeff Garzik + + * tests/Makefile.am: Re-order tests in alpha order. + +1999-06-18 Sebastian Wilhelmi + + * configure.in: Changed test for pthread_attr_setstacksize from + AC_TRY_COMPILE to AC_TRY_LINK. + +1999-06-17 Sebastian Wilhelmi + + * configure.in, acglib.m4, acconfig.h, glib.h, gthread.c: + Completed the thread support in GLib. Thread creation, + prioritizing threads, yielding, joining threads as well as + reader/writer locks and recursive mutexes are now in place. Please + test heavily on your platform. It is so far tested on + Linux/i386/pthreads, Solaris/Sparc/pthreads and + Solaris/Sparc/solaristhreads. + + * gtimer.c, glib.h: Implement g_usleep (gulong microseconds) for + thread safe sleeping. (sleep() is not MT-safe at all!) + + * gutils.c: Avoid compiler warning. + + * tests/Makefile.am, tests/thread-test.c: New program to test some + aspects of the thread implementation. + + * gthread.c, Makefile.am: Renamed from gmutex.c to reflect the + change of content. + + * configure.in: Purged all appearances of nspr. + +Wed Jun 2 11:42:46 PDT 1999 Manish Singh + + * acinclude.m4 + * config.guess + * config.status + * ltconfig + * ltmain.sh: upgrade to libtool 1.3.2 (BeOS changes merged) + +1999-05-29 Tor Lillqvist + + * gstrfuncs.c (g_strescape): Backslashify also '"' characters. + + * glib.h: Document g_strescape. + +1999-05-12 Tor Lillqvist + + * glib.h (Win32): Map fileno to _fileno for mingw32. Map fstat to + _fstat. + + * README.win32: Advice also to remove -lmoldname in the + patch to the egcs-1.1.2 spec file. + +Wed May 12 00:23:55 CDT 1999 Shawn T. Amundson + + * gmodule/Makefile.am: Another small fix. + +1999-05-08 Tor Lillqvist + + * Makefile.am tests/Makefile.am: Correct rules for making the + win32-related files that are made from corresponding .in files. + Is there a cleaner way than explicitly writing rules that invoke + config.status? + +Fri Jul 16 22:18:36 PDT 1999 Manish Singh + + * ltconfig + * ltmain.sh: upgrade to libtool 1.3.3 + +1999-06-18 Sebastian Wilhelmi + + * gdate.c, gstrfuncs.c, gstring.c: Fixed the use of the + is..... and to..... macros, which take unsigned chars, not chars! + Thanks to Morten Welinder for pointing this out. + +Thu Jun 3 16:30:31 PDT 1999 Manish Singh + + * gerror.c (g_on_error_query): check isatty() before querying so + we don't loop endlessly + +Sat May 29 11:16:29 PDT 1999 Manish Singh + + * acinclude.m4 + * config.guess + * config.status + * ltconfig + * ltmain.sh: upgrade to libtool 1.3.2 + +1999-05-26 Sebastian Wilhelmi + + * gmain.c: provide a poll prototype for SunOS, as they do not do + it self. Hint from Christian Parg . + +Tue May 25 12:23:07 1999 Owen Taylor + + * gstrfuncs.c (g_strchug): Use g_memmove() not memmove(). + (Reported by Charles Levert ) + +Mon May 10 22:03:52 CDT 1999 Shawn T. Amundson + + * Released GLib 1.2.3 + +1999-05-08 Tor Lillqvist + + * Makefile.am tests/Makefile.am: Correct rules for making the + win32-related files that are made from corresponding .in files. + Is there a cleaner way than explicitly writing rules that invoke + config.status? + +Sat May 1 10:18:01 PDT 1999 Manish Singh + + * acinclude.m4 + * config.guess + * config.status + * ltconfig + * ltmain.sh: upgrade to libtool 1.3 + +1999-04-30 Tor Lillqvist + + * Makefile.am: Don't distribute glibconfig.h.win32.in, but + glibconfig.h.win32. Generate it when making a dist. Also generate + makefile.msc and config.h.win32 from corresponding .in files when + making dist. + + * configure.in: Also substitute @GLIB_INTERFACE_AGE@ and + @GLIB_BINARY_AGE@ (needed in config.h.win32). + + * glibconfig.h.win32.in: Use static mutex structure and initial + value corresponding to the 1999-04-07 snapshot of pthreads-win32. + + * tests/Makefile.am: Distribute makefile.msc. Generate it when + making dist. + + * tests/makefile.msc.in: New file. + + * tests/node-test.c: Include for exit(). + +Thu Apr 29 02:16:36 1999 Tim Janik + + * gstrfuncs.c: minor code cleanups. + +Tue Apr 27 13:11:29 1999 Owen Taylor + + * gmain.c (g_main_poll): Mask out ERR HUP and NVAL from + the events field so we don't give IRIX fits. + +Tue Apr 20 08:42:22 1999 Tim Janik + + * gscanner.c (g_scanner_unexp_token): behave conservative with + G_TOKEN_IDENTIFIER_NULL and always assume scanner->value.v_string + to be "null" in that case. + +1999-04-20 Havoc Pennington + + * gutils.c (g_vsnprintf): When using the vsnprintf() + implementation, '\0'-terminate the resulting string + and return its length rather than -1. + +Mon Apr 19 13:42:21 1999 Owen Taylor + + * gmain.c (g_main_iterate): Added missing + #ifdef G_THREADS_ENABLED. (I never liked G_THREADS_ENABLED in + the first place!) + +1999-04-18 Havoc Pennington + + * gutils.c (g_snprintf): When using the vsnprintf() + implementation, '\0'-terminate the resulting string + and return its length rather than -1. + +Fri Apr 16 06:52:07 1999 Tim Janik + + * gscanner.c (g_scanner_unexp_token): feature G_TOKEN_EOF as a valid + expected token as well, so we get "- expected end of file" instead of + "- expected (unknown) token <0>". + +Tue Apr 13 16:16:14 CDT 1999 Shawn T. Amundson + + * Released GLib 1.2.2 + +1999-04-12 Elliot Lee + + * g_strchug(): s/strcpy/memmove/ + +1999-04-12 Sebastian Wilhelmi + + * configure.in: Adjusted the test for an unimplemented + getpwuid_r. Info from Michael Pruett . + +Sun Apr 11 15:07:34 1999 Tim Janik + + * configure.in: bumped versin number to GLib 1.2.2, interface 2, + binary 2. + + * NEWS: updates. + +Sun Apr 11 14:37:06 1999 Tim Janik + + * gstrfuncs.c (g_strcasecmp): always check for s1, s2 != NULL. + +Sat Apr 10 19:30:50 1999 Tim Janik + + * glib.h: removed braces around inline strings for the G_GNUC_FUNCTION + and G_GNUC_PRETTY_FUNCTION macros, so the macros can be used for + compile time string concatenation. + +Thu Apr 8 19:53:19 1999 Owen Taylor + + * gmain.c (g_main_iterate): Check for two threads + calling g_main_iterate at once. + + * gmain.c: If the set of poll file descriptors changes + during a call to poll(), abort that call, and start + a new poll. My test program still segfaults + obscurely on glibc 2.0 (in read()!!!), but now it works on + glibc 2.1, so I'll blame something else for the other segfault. + +1999-03-31 Sebastian Wilhelmi + + * configure.in: Fixed slight bug, that made configure hang on some + systems. Please do not merge this into 1.3 branch. It's taken care + of differently there. Info from J. Rhett Aultman + + +Wed Mar 24 21:23:47 CST 1999 Shawn T. Amundson + + * Released GLib 1.2.1 + + * README: + INSTALL: + NEWS: + sanity_check: updated + + * glibconfig.h.win32.in: + Makefile.am: + docs/glib-config.1.in: + docs/Makefile.am: Added files used to generate new files. + + * glibconfig.h.win32: + docs/glib-config.1: Removed, now generated. + + * configure.in: Added to output now-generated files. + +Tue Mar 23 13:43:39 PST 1999 Manish Singh + + * giounix.c: add user_data param to check and prepare functions + +Mon Mar 22 03:54:43 1999 Tim Janik + + * glib.h: + * gmain.c: add user_data to the GSource ->check and ->prepare + functions, so it can be used to e.g. pass a GPollFd. + (g_main_poll): only add poll records with an events mask != 0 to the + fd_array. don't even bother calling poll_func() if fds=timeout=0. + added debugging printouts around poll_func() invocation that can be + enabled with #define G_MAIN_POLL_DEBUG. + +Fri Mar 19 16:29:50 PST 1999 Manish Singh + + * acinclude.m4 + * config.guess + * config.sub + * ltconfig + * ltmain.sh: upgrade to libtool 1.2f + + * autogen.sh: libtool is not required to autogen glib + + * acconfig.h: remove WITH_SYMBOL_UNDERSCORE (not explictly + needed) + +1999-03-18 Sebastian Wilhelmi + + * gmem.c: Fixed another stupid fault of mine: Did + s/g_static_/g_private_/g + +Wed Mar 17 03:17:42 1999 Tim Janik + + * configure.in bumped versin number to GLib 1.2.1, interface 1, + binary 1. + + * NEWS: updates. + + * glib.h: added GLIB_CHECK_VERSION() macro similar to + GTK_CHECK_VERSION(). + +Sun Mar 14 17:50:35 1999 Tim Janik + + * gmem.c (g_mem_chunk_*): changed a bunch of g_assert() statements + to g_return_if_fail(). + (g_mem_profile): + (g_mem_chunk_print): + (g_mem_chunk_info): removed some extraneous "\n"s at the end of the log + messages. + + * gtimer.c (g_timer_*): changed a bunch of g_assert() statements + to g_return_if_fail(). + * grel.c (g_*): changed a bunch of g_assert() statements to + g_return_if_fail() and added some extra ones to check relation != NULL. + +1999-03-12 Sebastian Wilhelmi + + * configure.in: Also accept _Pctime_r instead of ctime_r, while + seraching for the right `_REENTRANT' flag. This is for Digital + UNIX 4.0d. Thanks to Sascha Brawer . + +Tue Mar 9 23:25:50 1999 Tim Janik + + * configure.in: check for working realloc (NULL,). + * gmem.c (g_realloc): use malloc() for initial allocation on systems + where realloc(NULL,) will not work (this is the case on SunOS, reported + by Tom Geiger). + +Mon Mar 8 07:42:08 1999 Tim Janik + + * ghook.c (g_hook_unref): when !hook_list->is_setup, wrap the + flag around the call to g_hook_free() to avoid spurious + warnings (happens during destruction phase). + +1999-03-03 Sebastian Wilhelmi + + * glibconfig.h.win32, config.h.win32: Moved G_THREADS_IMPL_POSIX + from config.h.win32 to glibconfig.h.win32 + + * acconfig.h, configure.in, config.h.win32: Added test for DCE + versions of mutex_trylock and cond_timedwait. The win32 versions + are posix, aren't they? + +1999-03-02 Sebastian Wilhelmi + + * gmem.c: Fixed a stupid cut'n'paste error of mine. Thanks to + Friedrich Dominicus + +1999-03-01 Sebastian Wilhelmi + + * gutils.c (g_get_any_init): Fixed yet another bloody + implementation of getpwuid_r on AIX. Thanks to Olaf Dietsche + . I would like a configure + test better than that, but have no idea, how to do that easily. + +Sun Feb 21 22:11:51 CST 1999 Shawn T. Amundson + + * Released GLib 1.2.0 + + * AUTHORS: updated + +Wed Feb 24 00:08:42 CST 1999 Shawn T. Amundson + + * *.[ch]: inserted additional note to look for ChangeLog and + AUTHORS file for a log of modifications. + +Sun Feb 21 14:01:00 1999 Dr Mike + + * Made specfile generated, tweaked slightly + +Sat May 8 06:00:17 CDT 1999 Shawn T. Amundson + + * configure.in + gmodule/Makefile.am + gthread/Makefile.am: Better testing reveals better + methods. Fixes for BeOS. + +Sat May 8 01:52:29 CDT 1999 Shawn T. Amundson + + * configure.in + gerror.c + gmain.c + gstrfuncs.c + gutils.c + ltconfig + ltmain.sh + gmodule/Makefile.am + gmodule/gmodule.c + gmodule/gmoduleconf.h.in + gmodule/gmodule-beos.c + gthread/Makefile.am: Port to BeOS by myself and Richard Offer. + +1999-05-06 Tor Lillqvist + + * makefile.msc.in makefile.cygwin.in glibconfig.h.win32.in + config.h.win32.in tests/makefile.msc.in tests/makefile.cygwin.in: + New files, used to generate corresponding non-.in files when + making a dist. This is just so the version numbers will be kept in + synch automatically. + + * configure.in: Also substitute @GLIB_MAJOR_VERSION@, + @GLIB_MINOR_VERSION@, and @GLIB_INTERFACE_AGE@. + + * Makefile.am tests/Makefile.am: Also distribute makefile.cygwin. + + * gerror.c (g_on_error_query): On Win32, put up a MessageBox and + then exit. + + * glib.def: Add a couple of functions. + +Sat May 1 10:26:20 PDT 1999 Manish Singh + + * acinclude.m4 + * config.guess + * config.status + * ltconfig + * ltmain.sh: upgrade to libtool 1.3 + +1999-04-25 Tor Lillqvist + + * README.win32: More editing. + * build-dll: Use gcc, not ld to link. + * glib.h: On native Win32 use _unlink(). + * gscanner.c: Use corrent NATIVE_WIN32 feature test macro, + not _MSC_VER. + * gstring.c: Include on Win32 for _read prototype. + * gutils.c: Remove old IO channel code (was in #if 0). + * makefile.cygwin: Don't need to link with kernel32 and msvcrt + explicitly, they are included anyway. + +1999-04-24 Tor Lillqvist + + Support added for building using a GNU toolchain on Win32, + i.e. gcc -mno-cygwin on cygwin (a.k.a. mingw32, using egcs-1.1.2). + + * README.win32: Updated. + * build-dll makefile.cygwin tests/makefile.cygwin: New files. + * glib.h glib.def glibconfig.h.win32: Slight updates. + * gmain.c: No need to include and on Win32. + * gmain.c gutils.c testglib.c tests/string-test.c: Test for + NATIVE_WIN32, not _MSC_VER. + * gmutex.c: Must declare g_thread_functions_for_glib_use as + exported (using the GUTILS_C_VAR macro). + * gutils.c gmodule/libgplugin_[ab].c: LibMain not needed. + * gmodule/gmoduleconf.h.win32: Need underscore with gcc. + * gthread/gthread.c: With gcc on Win32, must use memcpy to assign + value of g_thread_functions_for_glib_use (?). + * makefile.msc tests/makefile.msc: Cosmetics. + +Fri Apr 23 14:29:25 BST 1999 Tony Gale + + * glib.h: Fix typo in g_string_ncasecmp macro (by me). + Add b_string_strncasecmp macro. + +1999-04-22 Sebastian Wilhelmi + + * gutils.c (g_get_any_init): use sysconf (_SC_GETPW_R_SIZE_MAX) as + the new initinal bufsize for getpwuid_r on systems, that support + this. Hint from Holger Duerer . + +Sat Apr 17 20:55:13 BST 1999 Tony Gale + + * glib.h, gstring.c: Add new g_string functions for reading + from file/socket descriptors, and tokenising strings. + + Added various g_string macros. + +Tue Apr 13 23:28:32 1999 Tor Lillqvist + + * README.win32: Mention the tests directory. + + * glib.def: Add the functions from grand.c. + + * glibconfig.h.win32: Add unsigned max values, and the format + strings. + + * makefile.msc: Add grand. + + * tests/{date-test,node-test}.c: Include for exit(). + + * tests/makefile.msc: New file. + +1999-04-12 Sebastian Wilhelmi + + * glib.h: Moved struct declaration up. Style fixes. + + * grand.c: Style fixes. Only try to open /dev/random once. + + * tests/rand-test.c (main): New tests; Slight bug fix. + +1999-04-09 Sebastian Wilhelmi + + * grand.c, tests/rand-test.c: New files to implement the Mersenne + Twister Pseudo Random Number Generator. + + * glib.h, AUTHORS, Makefile.am, tests/Makefile.am: Changed + accordingly. + +Thu Apr 8 21:12:30 CDT 1999 Shawn T. Amundson + + * Released GLib 1.3.0 + +1999-03-30 Sebastian Wilhelmi + + * configure.in: Added a check for the right format to printf and + scanf long longs. It is %qi instead of %lli on FreeBSD for + whatever reason. + +1999-03-28 Raja R Harinath + + * Makefile.am (glibconfig.h): Make sure `glibconfig.h' exists + after the rule is fired. + (install-exec-local): Install glibconfig.h only if the contents + are different from the currently installed glibconfig.h. + +1999-03-26 Raja R Harinath + + * Makefile.am (configexecincludedir): Rename from + configincludedir so that glibconfig.h will be installed + as part of `make install-exec'. + +Thu Mar 25 22:45:47 1999 Tor Lillqvist + + * config.h.win32: Update version numbers. + + * glibconfig.h.win32: Update version numbers and pthreads-win32- + related magic values. + + * README.win32: Some improvements. + + * makefile.msc: Add gqueue and gstack. Correct version number. + +Fri Mar 19 16:29:50 PST 1999 Manish Singh + + * acinclude.m4 + * config.guess + * config.sub + * ltconfig + * ltmain.sh: upgrade to libtool 1.2f + + * autogen.sh: libtool is not required to autogen glib + + * acconfig.h: remove WITH_SYMBOL_UNDERSCORE (not explictly + needed) + +1999-03-18 Jeff Garzik + + * glib.def: Add new g_list, g_stack, g_queue functions. + +1999-03-18 Sebastian Wilhelmi + + * configure.in: added new AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES) + to hold various defines to get the right thread implementation on + different platforms. Also look in -ldce for pthread_create. Should + make it work on HP-UX 10.x. Information from "D. Emilio Grimaldo + Tunon" . + +1999-03-17 Jeff Garzik + + * gstack.c, gqueue.c: + Add copyright, clean up code a bit. + +1999-03-17 Sebastian Wilhelmi + + * configure.in: Added missing values for G_MAXU(SHORT|INT|LONG) on + platforms with only /usr/include/values.h. + + * acconfig.h: Removed unnecessary macros. + + * glibconfig.h.win32, config.h.win32: Moved G_THREADS_IMPL_POSIX + from config.h.win32 to glibconfig.h.win32. Taken from glib 1.2 + branch. + + * configure.in: Also accept _Pctime_r instead of ctime_r, while + seraching for the right `_REENTRANT' flag. This is for Digital + UNIX 4.0d. Taken from glib 1.2 branch. + +Wed Mar 17 03:14:56 1999 Tim Janik + + * glib.h: added GLIB_CHECK_VERSION() macro similar to + GTK_CHECK_VERSION(). + +Wed Mar 17 01:46:28 1999 Tim Janik + + * merges from glib-1-2: + +Sun Mar 14 17:50:35 1999 Tim Janik + + * gmem.c (g_mem_chunk_*): changed a bunch of g_assert() statements + to g_return_if_fail(). + (g_mem_profile): + (g_mem_chunk_print): + (g_mem_chunk_info): removed some extraneous "\n"s at the end of the log + messages. + + * gtimer.c (g_timer_*): changed a bunch of g_assert() statements + to g_return_if_fail(). + * grel.c (g_*): changed a bunch of g_assert() statements to + g_return_if_fail() and added some extra ones to check relation != NULL. + +Tue Mar 9 23:25:50 1999 Tim Janik + + * configure.in: check for working realloc (NULL,). + * gmem.c (g_realloc): use malloc() for initial allocation on systems + where realloc(NULL,) will not work (this is the case on SunOS, reported + by Tom Geiger). + +Mon Mar 8 07:42:08 1999 Tim Janik + + * ghook.c (g_hook_unref): when !hook_list->is_setup, wrap the + flag around the call to g_hook_free() to avoid spurious + warnings (happens during destruction phase). + +1999-03-02 Sebastian Wilhelmi + + * gmem.c: Fixed a stupid cut'n'paste error of mine. Thanks to + Friedrich Dominicus + +1999-03-16 Timur Bakeyev + + * configure.in: Fix problem with pthread_create in libc, as running + "gcc test.c -l " is not legal. + +1999-03-16 Sebastian Wilhelmi + + * tests/type-test.c: Added a test for the + G_(U)?INT(16|32|64)_FORMAT and G_(MIN|MAX|MAXU)(SHORT|INT|LONG) + macros. + + * configure.in: Removed G_(U)?INT8_FORMAT again, as it can't be + used for scanf. + + * configure.in: Added the macros G_MAXU(SHORT|INT|LONG). I do not + know how to handle these on platforms with /usr/include/values.h, + but without /usr/include/limits.h. Please someone add this. + + +1999-03-15 Sebastian Wilhelmi + + * configure.in: Added the macros G_(U)?INT(8|16|32|64)_FORMAT to + use for printf and (much more important) scanf format strings for + the corresponding GLib types. + + * glib.h Added G_(U)?(SHORT|INT|LONG)_FORMAT for consistency. It + however makes no sense to also provide G_(FLOAT|DOUBLE)_FORMAT, as + they are different for printf (f for both) and scanf (f for float, + lf for double). Defining G_INT_FORMAT makes sense however, as we + might want to define gint to something different than int someday + in the future. Idea from Sascha Brawer . + +1999-03-14 Jeff Garzik + + * gdate.c: + Commented out debugging output. + + * tests/Makefile.am, tests/date-test.c: + Added test of the GDate module, based closely on testgdate.c. + + * tests/Makefile.am: + Bugfix - compile tests with @GLIB_DEBUG_FLAGS@. + +1999-03-14 Raja R Harinath + + * configure.in (glibconfig.h): Remove widechar tests and defines. + (fd_set): Change the grep for `fd_mask' to search for `fd_set'. + * gerror.c (fd_mask): Remove conditional typedef. It is not used + elsewhere in the file. + * gmain.c (fd_mask): Likewise. + +1999-03-12 Sebastian Wilhelmi + + * configure.in: Test for posix threads first, then for dce threads. + +1999-03-11 Sebastian Wilhelmi + + * configure.in: Revamped the thread configure stuff. Now dce + threads (old posix draft) are recogniced. This is necessary, + because dce threads are in fact working quite differently from + posix threads. Also changed the conditions for checking for MT + safe functions a bit, because G_THREADS_IMPL_NONE still have to + compile thread safe. NOTE: Please do not commit my change to + glib-1-2/{acconfig.h,configure.in,config.h.win32} from 1999-03-03, + as the current change will take care of that too. + +Tue Mar 9 14:37:32 1999 Jeff Garzik + + * Makefile.am, glib.h, gstack.c, gqueue.c, + tests/Makefile.am, tests/queue-test.c, tests/stack-test.c: + Added stack, queue ADTs and related tests. + + * glib.h, glist.c: + New g_list_delete() function. + +Sat Mar 6 11:03:08 1999 Asbjorn Pettersen + + * gutils.c (g_get_any_init): add OS/2 changes. + change '\\' in HOME to '/'. + +1999-03-03 Josh MacDonald + + * glib.def: g_spaced_primes_closest was omitted here, so I + couldn't build Xdelta on Windows. + +1999-03-01 Sebastian Wilhelmi + + * gutils.c (g_get_any_init): Fixed yet another bloody + implementation of getpwuid_r on AIX. Thanks to Olaf Dietsche + . I would like a configure + test better than that, but have no idea, how to do that easily. + +Sat Feb 27 01:18:47 1999 Tim Janik + + * ChangeLog: moved old ChangeLog to ChangeLog.pre-1-2, and started + new one. + + * configure.in: set glib version to 1.3.0. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 new file mode 100644 index 0000000..b2074b9 --- /dev/null +++ b/ChangeLog.pre-2-10 @@ -0,0 +1,1368 @@ +2006-03-23 Matthias Clasen + + Retroactively branch for 2.10 before the last commit. + + * glib/gtimer.c: Change to "Since 2.12". + +2006-03-23 Emmanuele Bassi + + * configure.in: Check for timegm. + + * glib/gtimer.h: + * glib/gtimer.c: + * glib/glib.symbols: + * docs/reference/glib/glib-sections.txt: Added g_time_val_to_iso8601 + and g_time_val_from_iso8601, to convert a GTimeVal to and from an + ISO 8601 encoded date. + + * tests/testglib.c: Added test cases for g_time_val_to_iso8601() + and g_time_val_from_iso8601() functions. + +2006-03-20 Vladimer Sichinava + + * configure.in: Added "ka" (Georgian) to ALL_LINGUAS + +2006-03-20 Matthias Clasen + + * glib/gmem.c (profiler_log): use standard_calloc to allocate + the profile_data. (#335209, Chris Wilson) + + * glib/gmain.c (g_main_context_unref): Avoid a deadlock. + (#335207, Chris Wilson) + + Minor optimizations (#335216, Chris Wilson): + + * glib/gasyncqueue.c (g_async_queue_pop_intern_unlocked): Use + g_queue_peek_tail_link instead of g_queue_peek_tail. + + * glib/glist.c: + * glib/gslist.c: Avoid some memset calls. + +2006-03-19 Matthias Clasen + + * MAINTAINERS: Add this, at the request of the GNOME sysadmin team. + +2006-03-15 Matthias Clasen + + * glib/goption.c (g_option_context_parse): Only set the prgname + if it hasn't been set before. (#334611, Chong Kai Xiong) + +2006-03-14 Matthias Clasen + + * glib/gutils.c (g_parse_debug_string): Don't read past the + end of the string. (#334471, Morten Welinder) + + * tests/testglib.c (test_g_parse_debug_string): Add testss + for g_parse_debug_string. + + * glib/goption.c (parse_short_option): Don't create the + option_name twice. (#334519, Chris Wilson) + +2006-03-13 Anders Carlsson + + * configure.in: Revert fix for #322476, it breaks module loading + since libtool on darwin makes shared modules use .so and shared + libraries use .dylib. The fix breaks shared module loading everywhere + in GTK+. + +2006-03-02 Marcus Brinkmann + + Implement watches for GIOChannels for write file descriptors on + Win32 (#333098). + + * glib/giowin32.c (GIOWin32Channel): Add a new direction field. + (read_thread): Initialize direction. + (write_thread): New function. + (buffer_write): New function. + (g_io_win32_prepare): Handle the G_IO_WIN32_FILE_DESC case for the + write direction. + (g_io_win32_fd_write): Call buffer_write() if there is a writer + thread. + (g_io_win32_fd_close): Set space_avail_event for writer threads. + (g_io_win32_fd_create_watch): Create the writer thread if + condition is G_IO_OUT. + (g_io_channel_win32_make_pollfd): Likewise here. + +2006-03-09 Matthias Clasen + + * Makefile.am: Add ChangeLog.pre-2.8 to EXTRA_DIST. + +2006-03-08 Tor Lillqvist + + * glibconfig.h.win32.in: Add G_GUINT64_CONSTANT. + +2006-03-07 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.10.1 === + + * NEWS: Updates. + + * glib/gutf8.c (_g_charset_get_aliases): Match the prototype + in gconvert.c to fix build problems in NetBSD. (#333651, + Julio M. Merino Vidal) + +2006-03-06 Anders Carlsson + + * configure.in: + Make .dylib the shared library suffix on darwin. + (#322476, Vladimir Panov) + +2006-03-06 Anders Carlsson + + * configure.in: + Skip checking thread flags on Darwin. Fix suggested by Manish Singh. + (#314794, Gregor Riepl) + +2006-03-01 Tor Lillqvist + + * glib/gutils.c (g_listenv): Separate implementation on Win32: Use + the wide character API on NT-based Windows. Return UTF-8 strings. + + * glib/glib.symbols: Don't mark g_listenv as PRIVATE, as that + meant it wasn't present in the import library. PRIVATE is used + only for the backwards-compatibility DLL ABI stability hacks. + +2006-02-24 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.10.0 === + + * README.in: Mention the slice allocator and GInitiallyUnowned. + + * NEWS: Updates + + * configure.in: Bump version to 2.10.0 + + * tests/utf8-pointer.c: Add tests for g_utf8_strlen(). + + * glib/gutf8.c: Fix boundary cases in g_utf8_strlen(). + (#332435) + +2006-02-23 Kjartan Maraas + + * tests/completion-test.c: (main): Plug leaks reported by + valgrind. + * tests/convert-test.c: (test_iconv_state), (test_one_half): + Same. + * tests/patterntest.c: (test_compilation): Same + * tests/shell-test.c: (do_argv_test): Same. + * tests/unicode-caseconv.c: (main): Same. + * tests/uri-test.c: (run_to_uri_tests): Same. + Closes bug #332093. + +2006-02-19 Martyn Russell + + * tests/asyncqueue-test.c: + * tests/list-test.c: + * tests/slist-test.c: Updated to test _sort, _sort_with_data, + _insert_sorted and _insert_sorted_with_data API. + +2006-02-18 Matthias Clasen + + * tests/gobject/Makefile.am: Add paramspec-test + + * tests/gobject/paramspec-test.c: Some GParamSpec tests. + + * tests/gobject/gvalue-test.c: Add more tests. + +2006-02-17 Kang Jeong-Hee + + * glib/gutf8.c (g_utf8_find_prev_char): Correct documentation typo. + +2006-02-15 Sebastian Wilhelmi + + * glib/gthreadpool.c: Fix deadlock when signalling the thread + which freed a thread pool (#331110, Chris Wilson). + +Tue Feb 14 17:00:43 2006 Tim Janik + + * glib/gslice.c: only define _XOPEN_SOURCE to 600 to get at + posix_memalign() in case we actually are going to use it, because + we detected a compliant implementation (#328997). + + * configure.in (enable_included_printf): don't include malloc.h when + testing for posix_memalign() funcitonality, since this may break the + test on some systems (#328997). + +2006-02-14 Matthias Clasen + + * glib/gstrfuncs.c: Improve docs. + +2006-02-11 Matthias Clasen + + * configure.in: Bump version + +2006-02-10 Matthias Clasen + + * === Released 2.9.6 === + + * NEWS: Updates + +2006-01-31 Behdad Esfahbod + + * docs/reference/glib/tmpl/relations.sgml (g_relation_insert): Specify + the type of varargs arguments. (bug #317679) + +2006-01-31 Matthias Clasen + + * autogen.sh: Touch README and INSTALL here to pacify + automake. (#329124, Kjartan Maraas, Tim Janik) + +Tue Jan 31 16:45:03 2006 Tim Janik + + * glib/gdataset.c: carry out all dtalist pointer accesses atomically, + some missing cases where pointed out by Sebastian Wilhelmi. + +Tue Jan 31 12:33:48 2006 Tim Janik + + * configure.in: generate build/win32/vs8/Makefile, to fix build breakage. + +2006-01-30 David Schleef + + * glib/grand.c: Update URL + +2006-01-29 Sven Herzberg + + * docs/reference/gobject/tmpl/param_value_types.sgml: tell how to + create container classes which are as flexible as a GValue is + +2006-01-27 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.9.5 === + + * glib/glib.symbols: Add g_mem_gc_friendly as an exported + variable. + + * NEWS: Updates + +2006-01-26 Matthias Clasen + + * glib/gmem.c (g_mem_init_nomessage): Fix C99isms. (#328705, + Kazuki Iwamoto) + +Wed Jan 25 19:16:57 2006 Tim Janik + + * fixed buglets reported by Jens Granseuer in #328254. + + * configure.in: free the memory allocated in posix_memalign() tests. + + * glib/gslice.c: spelling fixes. + +Wed Jan 25 16:39:18 2006 Tim Janik + + * glib/gslice.c: honour g_mem_gc_friendly settings when freeing + slices, make sure g_mem_gc_friendly is properly initialized. + + * gmem.[hc]: ensure g_mem_gc_friendly is initialized from G_DEBUG upon + the first allocation. applied some branching optimizations. + + * docs/macros.txt: reflected --enable-gc-friendly change and + described ENABLE_GC_FRIENDLY_DEFAULT as well as G_DEBUG=gc-friendly. + + * configure.in: changed --enable-gc-friendly=yes to define + ENABLE_GC_FRIENDLY_DEFAULT. + + * glib/garray.c: changed ENABLE_GC_FRIENDLY macro #ifdef-s to + if (G_UNLIKELY (g_mem_gc_friendly)). + + * glib/gtree.c: + * glib/ghash.c: removed ENABLE_GC_FRIENDLY code which is now taken + care of by g_slice_free1(). + + * tests/slice-test.c: fixed leaks, reported by Kjartan Maraas. + +Tue Jan 24 17:49:36 2006 Tim Janik + + * glib/gslice.c: only use posix_memalign() if it's known to work, + revert to memalign() otherwise. + + * configure.in: check for broken posix_memalign() implementations + to fix #328254. + +2006-01-24 Matthias Clasen + + * tests/unicode-encoding.c: Use UTF-16LE as target encoding + on all little-endian systems. (#143380, Marc Moorcroft) + +2006-01-23 Matthias Clasen + + * configure.in: Change the shared libary extension for hpux-ia64 + to so. (#328253, The Written Word) + +Mon Jan 23 17:30:33 2006 Tim Janik + + * glib/gutils.c (_g_getenv_nomalloc): wiped out all the wonderfull + G_OS_WIN32 code i wrote ;-[) after tml told me windows has getenv() + as well. + +Mon Jan 23 16:46:20 2006 Tim Janik + + * glib/gslice.c (slice_config_init): initialize GSlice config from + G_SLICE environment variable. we support G_SLICE=always-malloc + currently, which forces all g_slice_*() allocations to use the system + malloc instead. + + * glib/gutils.c: + g_parse_debug_string(): added a note about not using g_malloc() here. + _g_getenv_nomalloc(): getenv() variant that doesn't use g_malloc or + g_slice. contains only guesswork in the WIN32 branch. + +2006-01-18 Matthias Clasen + + * Bump version + + * === Released 2.9.4 === + + * NEWS: Updates + +2006-01-17 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_get_groups): Correct a g_new0() + call. (#327421, Morten Welinder) + +2006-01-17 Sebastian Wilhelmi + + * glib/gthreadpool.c: To avoid deadlocks get rid of the settings + G_LOCK. Use the unused_thread_queue lock instead. Change + g_thread_pool_thread_proxy such that threads only wait on + non-exlusive pools for at most a 1/2 second. Do not reorder tasks + due to superfluous tasks. Global tasks wait at most for + max-idle-time milliseconds. Make sure, that no task is woken up + twice for the same event via a wakeup_serial. This fixes #324228. + + * tests/threadpool-test.c: Adapt test accordingly. Do not pass + invalid NULL into the thread pools. This as well fixes #327290. + +2006-01-16 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.9.3 === + + * NEWS: Updates + + * glib/gthread.h (g_static_mutex_get_mutex_impl_shortcut): + Rework the strict aliasing fix to not break C++, pointed + out by Murray Cumming. + + * glib/gasyncqueue.c (g_async_queue_push_sorted_unlocked): + Signal waiting threads, problem noticed by Christian Kellner. + +2006-01-16 Matthias Clasen + + Fix bug 326747, Alberto Ruiz: + + * glib/gconvert.c (make_valid_utf8): Change this function to + replace unknown characters by the Unicode replacement character + instead of '?', and don't append "(invalid encoding)". + (g_filename_display_name, g_filename_display_basename): Document + how to determine if the filename was in an invalid encoding. + +2006-01-14 Matthias Clasen + + * glib/gtree.c: Replace the simple recursive implementation + by a nonrecursive, threaded implementation by Maurizio + Monge. (#169285) + +2006-01-12 Matthias Clasen + + * tests/asyncqueue-test.c (main): Fix the + assert to not always trigger. (#326558, + Daichi Kawahata) + +2006-01-11 Matthias Clasen + + * tests/convert-test.c: Don't test items_read and + items_written in error cases where it is not set. + + * tests/asyncqueue-test.c: Set error to NULL. + +2006-01-08 Matthias Clasen + + * glib/gtree.c: Break some long lines. + + * tests/tree-test.c: Add more tests. + + * glib/gslice.c: Include config.h first, pointed out + by Bogdan Nicula. + +2005-12-20 Sven Herzberg + + * docs/reference/gobject/tmpl/gtype.sgml: explain that + G_TYPE_INSTANCE_GET_CLASS() does behave different during + initialization + +2006-01-06 Matthias Clasen + + * glib/gslice.c: Only define _XOPEN_SOURCE if we know + that we have posix_memalign(). (#323937, Bogdan Nicula) + +2006-01-05 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.9.2 === + +2006-01-05 Hans Breuer + + * glib/makefile.msc.in : added gslice.obj + +2006-01-05 Matthias Clasen + + * NEWS: Updates + + * glib/gmain.c: Clarify the documentation of source ids + a bit. (#325874, Dan Williams) + + * configure.in: Fix another strict aliasing problem. + + * glib/gthreadpool.c: Avoid use of varargs macro. (#325864, + Kazuki IWAMOTO) + +2006-01-04 Manish Singh + + * glib/glib.symbols + * glib/gstdio.h: don't macroized g_access, g_chdir, and g_unlink + either, since they have the same issue as g_rmdir. (Related to + bug #325249) + +Wed Jan 4 13:33:25 2006 Tim Janik + + * glib/gslice.c (magazine_cache_pop_magazine): don't reverse chunk + order when creating magazines, so we hand out chunks with ascending + adresses. + +2006-01-04 Abel Cheung + + * configure.in: Added "ml" "zh_HK" to ALL_LINGUAS. + +2006-01-03 Martyn Russell + + * docs/reference/glib/glib-sections.txt: + * glib/glib.symbols: + * glib/gthreadpool.[ch]: + - Added new API g_thread_pool_get_idle_time() and + g_thread_pool_set_idle_time(). (#324228). + + * tests/threadpool-test.c: + - Updated test case to do thread pool sorting, thread pool with + no sorting and a thread pool with idle thread timeouts. + +2006-01-03 Matthias Clasen + + * glib/gmain.h: Add new functions here, too. + + * glib/glib.symbols: Add new functions. + +2005-12-20 Michael Meeks + + * glib/gmain.c (g_main_context_is_owner): new method + to determine if the current thread is the owner of the + context. + +2006-01-02 Matthias Clasen + + * glib/glib.symbols: + * glib/gstdio.h: + * glib/gstdio.c (g_rmdir): Don't provide g_rmdir() as a macro + expanding to rmdir, since rmdir is not declared in a portable + system header we can include in gstdio.h. (#325249, Jani Monoses) + +2006-01-01 Tor Lillqvist + + * glib/gspawn-win32.c (g_spawn_sync_utf8): Set the GIOChannels for + stdout and stderr to unbuffered. Otherwise the giochannel layer + will try to read from them regardless whether the + g_io_channel_win32_poll() call here has indicated + readability or not. (#325310) + +2005-12-29 Matthias Clasen + + * glib/gutils.c (glib_check_version): Fix a copy-and-paste error + in the docs. (#325273, Declan Naughton) + +2005-12-27 Manish Singh + + * tests/run-collate-tests.sh: use LC_ALL instead of LC_COLLATE, to + make sure we really override things. + +2005-12-27 Matthias Clasen + + Fix #316221, Michal Benes, Stanislav Brabec; + + * configure.in: Fix a strict aliasing problem in + g_static_mutex_get_mutex(). + * glib/gthread.h: ...and in + g_static_mutex_get_mutex_impl_shortcut(). + + * glib/gdatasetprivate.h: Add a cast to silence compiler + warnings. (#321978, Andrew Paprocki) + + Partial fix for bug #323937, Bogdan Nicula. + + * configure.in: Check for malloc.h + * glib/gslice.c: Don't include malloc.h unconditionally. + +2005-12-27 Manish Singh + + * tests/run-collate-tests.sh: export LC_COLLATE so it takes. + (#324950, Dan Yefimov) + +2005-12-26 Matthias Clasen + + * glib/gslice.c: On Win32, include process.h (#325015, Kazuki + Iwamoto) + +2005-12-25 Matthias Clasen + + * AUTHORS: Update my email + + * tests/slice-test.c: Fix C99isms. (#324950, Dan Yefimov) + +2005-12-21 Matthias Clasen + + * README.in: Add some notes on when 'make check' may fail. + +2005-12-20 Matthias Clasen + + * glib/glib.symbols: + * glib/gthreadpool.h: + * glib/gthreadpool.c (g_thread_pool_set_sort_function): New function + to sort tasks pushed into a threadpool. (#324479, Martyn Russell) + + * tests/threadpool-test.c: Test this. + +Tue Dec 20 18:14:14 2005 Tim Janik + + * glib/gslice.[hc]: added mem_error() and mem_assert() to test and + handle errors without depending on gmessage.c which might not be + setup when the error occours. + removed G_SLICE_CONFIG_ALWAYS_FREE config option, fixed the code so + always freeing can be achieved by adjusting the working set time to + 0 with G_SLICE_CONFIG_WORKING_SET_MSECS. + added G_SLICE_CONFIG_COLOR_INCREMENT to test different color increments + (mainly 0 and 1). reduced the minimum block size to 128 bytes, to + minimize wastage if small amounts of differently sized structrues are + allocated, this does come at a performance cost of roughly 5% though. + fixed up block alignment calculation, so it works for varying + block sizes. only use strerror() not g_strerror() since the latter + depends on working GQuark and GSlice. + mem_error(): implemented in terms of fprintf and vfprintf. + + * tests/slice-color.c: new program to test cache colorization effects. + + * tests/slice-test.c: trade G_SLICE_CONFIG_ALWAYS_FREE for 0 duration + G_SLICE_CONFIG_WORKING_SET_MSECS. + +2005-12-17 Matthias Clasen + + * glib/goption.c (parse_short_option): Set an error in all + failure cases. (#324332, Tim-Philipp Müller) + +2005-12-17 Sebastian Wilhelmi + + * glib/gatomic.c: Fix memory barrier position in g_atomic_int_get + and g_atomic_pointer_get. Add g_atomic_int_set and + g_atomic_pointer_set implementations for the !DEFINE_WITH_MUTEXES && + G_ATOMIC_OP_MEMORY_BARRIER_NEEDED case, as well as defining them + as functions (additionally to the macros in the header) for the + !G_ATOMIC_OP_MEMORY_BARRIER_NEEDED case. + +2005-12-16 Matthias Clasen + + * glib/gmem.c (g_allocator_new): Don't return a pointer to + a const struct, since apps expect to be able to modify it. + (#324179, J. Ali Harlow) + +Tue Dec 13 10:13:32 2005 Tim Janik + + * glib/gatomic.h: added g_atomic_pointer_set() and g_atomic_int_set() + for systems where the initialization of atomic variables requires a + write memory barrier. + +2005-12-09 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.9.1 === + +2005-12-09 Alexander Larsson + + * glib/glist.h: + * glib/gslist.h: + Use G_GNUC_WARN_UNUSED_RESULT on list functions that return + the whole list. + +2005-12-08 Matthias Clasen + + * NEWS: Updates + +2005-12-07 Martyn Russell + + * glib/gasyncqueue.c: + - Call g_queue_insert_sorted() instead of duplicating the code. + - Call g_queue_sort() instead of duplicating the code. + - Invert sort function results to make sure the same sort function + gives the same results across glist, gslist, gqueue and + gasyncqueue. + + * tests/asyncqueue-test.c: + - Updated the sort function to reflect the example in the + documentation for gasyncqueue.c. + +2005-12-07 Martyn Russell + + * docs/reference/glib/glib-sections.txt: + * docs/reference/glib/tmpl/linked_lists_double.sgml: + * docs/reference/glib/tmpl/linked_lists_single.sgml: + * glib/glist.[ch]: + * glib/gslist.[ch]: + - Added g_list_insert_sorted_with_data () and + g_slist_insert_sorted_with_data (). + - Removed the extra check in g_list_sort() and g_slist_sort() for + GCompareDataFunc vs. GCompareFunc. + +2005-12-07 Tor Lillqvist + + * glib-gettextize.in: Look up prefix at run-time on Win32, + assuming the standard directory structure with glib-gettextize in + $prefix/bin. + +2005-12-06 Matthias Clasen + + * glib/gmem.h: Exempt GTK+ from the mem chunk deprecation, since + we need GTK+ 2.8 to compile against GLib 2.10. + +2005-12-05 Manish Singh + + * tests/run-collate-test.sh: set LC_COLLATE, not LANG, to be sure + to override any user settings. + +2005-12-05 Matthias Clasen + + * configure.in: Revert an accidential commit + +2005-12-05 Matthias Clasen + + * glib/gutf8.c: Documentation updates. (#323291, Morten Welinder) + + * tests/Makefile.am (TESTS_ENVIRONMENT): + * tests/gobject/Makefile.am (TESTS_ENVIRONMENT): Set + MALLOC_CHECK_ and MALLOC_PERTURB_ + + * tests/run-collate-tests.sh: Run the collation tests explicitly + in en_US locale. (#320463) + + * glib/gmem.h: Really deprecate GMemChunk. + + * glib/gdate.c: + * glib/gutils.c: + * glib/gtree.c: + * glib/gstring.c: + * glib/giochannel.c: + * glib/gstrfuncs.c: Add versioned deprecation docs. + +2005-12-05 Martyn Russell + + * docs/reference/glib/glib-sections.txt: + * glib/gasyncqueue.[ch]: + - Added support for sorting async queues by with _push_sorted(), + _push_sorted_unlocked(), _sort() and _sort_unlocked() (#323047). + + * tests/Makefile.am: + * tests/asyncqueue-test.c: + - Added test case for gasyncqueue.c + +Mon Dec 5 15:53:20 2005 Tim Janik + + * glib/gslice.c: implement chain walking for arbitrary ->next pointer + offsets in g_slice_free_chain_with_offset() based on a patch by behdad + in bug 323178. moved time consuming logic from g_slice_free() out of + the inner loop, so g_slice_free_chain_with_offset() provides a real + performance benefit over g_slice_free1() now. + + * glib/gslice.h: renamed g_slice_free_chain() to + g_slice_free_chain_with_offset(). implemented g_slice_free_chain() as + a type-safe macro as suggested in bug 323178. + simplified the macro implementation of g_slice_free() and implemented + it in a type safe manner for all compliers as suggested by Morten + Welinder . + + * glib/gmain.c: + * glib/glist.c: + * glib/gslist.c: + * glib/glib.symbols: s/g_slice_free_chain/g_slice_free_chain_with_offset/ + +2005-12-05 Matthias Clasen + + * glib/gasyncqueue.c: Add some docs. + + * tests/libmoduletestplugin_a.c: Fix compiler warnings. + + * glib/gatomic.c: In the ia64 implementation, use + __sync builtin without _si or _di suffix. (#321229, + Stanislav Brabec, patch by Andreas Schwab) + +2005-12-04 Behdad Esfahbod + + * glib/gslice.h: Remove comma at the end of enum. + +2005-12-04 Matthias Clasen + + Handle multiple user names with the same UID better. + (#319535, Laszlo Peter) + + * glib/gutils.c (g_get_any_init_do): When determining user + data, first look up $LOGNAME. If the UID doesn't match + getuid(), fall back to the current behaviour of looking + up the user data based on getuid(). + +2005-12-04 Matthias Clasen + + * glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro + to make gcc warn if a function result is ignored. (#145466, + Arjan van de Ven, Alex Larsson) + + * glib/gmem.h: Add the new attribute to g_realloc and + g_try_realloc. + +2005-12-03 Matthias Clasen + + * glib/glib.symbols: + * glib/gcache.h: Deprecate g_cache_value_foreach. (#322956, + Nicolas Caniart) + + * glib/gmappedfile.c: Make mapping of empty files + work. (#321530) + + * glib/gfileutils.c: Don't fork a new process just to + fix the permissions of the created temp file. (#321318, + Alexis S. L. Carvalho) + +2005-12-02 Matthias Clasen + + * README.in: Add a note about Solaris threads. + + * glib/gspawn.c: + * configure.in: Remove support for Solaris threads. + (#136971, Sebastian Wilhelmi, patch by Andrew Paprocki) + +2005-12-02 Matthias Clasen + + * configure.in: Define G_GUINT64_CONSTANT in analogy to + G_GINT64_CONSTANT. (#322568, Andrew Paprocki) + +2005-12-02 Matthias Clasen + + * glib/gslice.c: Win32 portability fixes and C99ism removal, + pointed out by Kazuki Iwamoto. (#323052) + +2005-12-02 Matthias Clasen + + * glib/gatomic.c (g_atomic_int_add): Add a missing volatile for + the IA64 implementation. + +Fri Dec 2 16:18:09 2005 Tim Janik + + * glib/gslice.c: some naming and type size fixups. + +Fri Dec 2 13:08:58 2005 Tim Janik + + * glib/gslice.h (g_slice_free): reworked GCC-specific type-safe macro + variant into something less verbose, but digestible for gcc-3.4. + +Fri Dec 2 10:55:07 2005 Tim Janik + + * tests/slice-test.c: extended to perform the benchmarking on the old + memchunk code if 'O' is selected. + + * tests/memchunks.c: new file which contains the old GLib mem chunks + implementation with prefix old_mem_chunk_. + + * tests/Makefile.am: added memchunks.c + +Fri Dec 2 00:16:59 2005 Tim Janik + + * glib/gslice.c: improved gettimeofday() timer resolution by maintaining + acceptable load distribution of the syscall. + (allocator_get_magazine_threshold): reduce minimum/single-thread magazine + sizes to approximately page_size/2.5 to avoid excessive startup allocations. + +2005-12-01 Matthias Clasen + + * tests/gobject/ifacecheck.c (test_iface_base_init): Don't + double-free base interface members. + + * tests/Makefile.am: Remove duplicate variable. + +Thu Dec 1 17:32:46 2005 Tim Janik + + * glib/gslice.[hc]: new slice allocator implementation. + + * tests/slice-test.c: added random slice allocation test. + + * glib/gthread.[hc]: removed newly added private thread mem API. + + * glib/gthreadinit.h: + * glib/gmessages.c: + * glib/gthread.c: + * glib/gmem.c: divided glib threading initialisation into three phases, + initialisation where private keys and messaging are not available (only + needed by gmem.c), initialisation without messaging but private keys + available (gslice.c, gmessage.c), and full fledged initialisers that + server the rest of glib. initialisation functions got renamed to reflect + the limitations of their corresponding phases. + + * glib/gmem.c: removed memchunk code, defer allocations to + g_slice_* instead. + + * glib/gmem.[hc]: removed g_slice_* skeletons. + + * glib/glib.symbols: added g_slice_* symbols. + + * configure.in: check for availability of posix_memalign(3), memalign(3) + and valloc(3). + + * glib/Makefile.am: added gslice.[hc]. + +2005-12-01 Tor Lillqvist + + * glib/gstdio.c (g_stat): In the Win32 implementation, strip + trailing slash(es) for non-root folders. stat() fails if non-root + folders are specified with trailing slashes. It's too much hassle + to demand that callers strip such slashes themselves, especially + as it is easy to get it wrong and strip the slash of a root + folder. + (g_rename): On NT-based Windows, use MoveFileEx() with + MOVEFILE_REPLACE_EXISTING to better match Unix behaviour. + +2005-11-28 Matthias Clasen + + Fix G_STMT_START / G_STMT_END on Solaris. (#321972, + Andrew Paprocki) + + * configure.in: Check whether do { } while (0) works. + + * glib/gmacros.h: Use do { } while (0) for G_STMT_START / + G_STMT_END if it works. + +2005-11-28 Matthias Clasen + + * glib/gthread.c (g_static_rw_lock_wait, g_static_rw_lock_signal): + * glib/gnode.c (g_node_depth_traverse_level): + * glib/gmem.c (g_allocator_new): + * glib/ghash.c (g_hash_table_unref, g_hash_table_destroy) + (g_hash_table_foreach_remove_or_steal): Silence compiler + warnings. + +2005-11-27 Matthias Clasen + + * glib/gunicollate.c (g_utf8_collate_key_for_filename): + Don't read beyond len. (#322520, Christian Persch) + +Wed Nov 23 17:34:01 2005 Tim Janik + + * glib/gdataset.c: access datalist flags via atomic pointer access + functions, instead of acquiring the dataset lock. this is faster and + also matches the atomic pointer readouts in gdatalistprivate.h and + direct pointer modifications required by gobject.c. + +Wed Nov 23 13:35:31 2005 Tim Janik + + * glib/gdataset.c: streamlined initialization code somewhat, + removed GData node cache. + +2005-11-22 Matthias Clasen + + * glib/ghash.c (g_hash_table_ref): + (g_hash_table_unref): Mark these as new API. + + Avoid double locking in g_intern_string (#322133, + Benedikt Meurer) + + * glib/gdataset.c (g_quark_from_string_internal): New + internal function which factors out common parts of + g_quark_from[_static]_string. + (g_quark_from_string, g_quark_from_static_string): + Use g_quark_from_string_internal. + (g_intern_string, g_intern_static_string): Use + g_quark_from_string_internal, and only take the + lock once. + (g_quark_new): Don't store the strings shifted by -1 + in the g_quarks array. + (g_quark_to_string): Adapt to the previous change. + +Tue Nov 22 14:04:26 2005 Tim Janik + + * glib/ghash.h: + * glib/ghash.c: + g_hash_table_new_full(): create hash tables with a ref count of 1. + g_hash_table_ref(): atomically ref_count+=1 + g_hash_table_unref(): atomically ref_count-=1, destroys hash table + when refcount reaches 0. + g_hash_table_destroy(): just destroy keys and values, unref by 1. + g_hash_table_insert(): + g_hash_table_replace(): assert ref_count>0. + + * glib/gatomic.h: + * glib/gatomic.c: added 'volatile' qualifier to all atomic pointer and + integer pointers. + +2005-11-20 Behdad Esfahbod + + * glib/guniprop.c (g_unichar_get_mirror_char): Remove unused + variables. (#321984, Andrew Paprocki) + +2005-11-18 Matthias Clasen + + * configure.in: Bump version + +2005-11-17 Matthias Clasen + + * === Released 2.9.0 === + + * glib/glib.symbols: Updates + + * glib/gutf8.c (g_utf8_offset_to_pointer): Add some performance + hints to the docs. (Paolo Borelli) + + * NEWS: Updates + + * glib/gthread.c (g_thread_foreach): Mark as new api. + + * README.in: Updates. + + * glib/glib.symbols: + * glib/gdate.h: + * glib/gdate.c (g_date_set_time_t): + (g_date_set_time_val): Add functions to set a date from + a time_t and from a GTimeVal. + (g_date_set_time): Deprecate. (#314067, Roger Leigh) + + * tests/Makefile.am: + * tests/utf8-pointer.c: Unit tests for g_utf8_pointer_to_offset + and g_utf8_offset_to_pointer. + + * glib/gutf8.c (g_utf8_pointer_to_offset) + (g_utf8_offset_to_pointer): Handle negative offsets, and use + "stutter stepping" for going backwards. (#320638, Larry + Ewing) + + * glib/gbacktrace.c: + * glib/gdate.c: + * glib/gthread.c: const correctness fixes, found + by Arjan van de Ven and gcc. + +2005-11-16 Behdad Esfahbod + + * docs/reference/glib/tmpl/unicode.sgml: Correct typo on mentioning + @G_UNICODE_BREAK_UNKNOWN that should be #G_UNICODE_BREAK_UNKNOWN. + +2005-11-09 Behdad Esfahbod + + * glib/guniprop.c: Use bit hacks instead when checking a general + category value against multiple values. + + * glib/gutf8.c: Change ISO10646 to Unicode in docs. + +2005-11-10 Simos Xenitellis + + * configure.in: Added tt (Tatar) to ALL_LINGUAS. + +2005-11-05 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_set_flags): Don't call g_warning(). + (#320688) Instead set error and return failure. + +2005-11-07 Matthias Clasen + + * glib/gmain.c (g_main_dispatch): Don't call cb_funcs->unref + while holding the context lock. (#320886, Andy Wingo) + +2005-11-07 Billy Biggs + + * tests/refcount/Makefile.am: Add a missing reference to libglib + in the LDADD for this test. + +2005-11-07 Matthias Clasen + + * glib/gmem.c (g_allocator_new): We need to set n_preallocs to a + nonzero value, otherwise GTK+ 2.8 breaks when compiled against + GLib 2.9. (#320755, Luca Ferretti) + +2005-11-04 Matthias Clasen + + * glib/Makefile.am: Apply a patch from Behdad Esfahbod to + use a faster lookup table for g_unichar_get_mirror_char(). + * glib/gmirroringtable.h: The new table. + * glib/gunichartables.h: Remove bidi_mirroring_table. + * glib/gen-unicode-tables.pl: Don't generate the mirroring + table. + * glib/glib-mirroring-tab/*: Sources for the program + which generated gmirroringtable.h. + + * glib/glist.c: Avoid some code duplication. + + * glib/gscanner.h: Include gdataset.h. (#320322) + + * glib/gdebug.h: add new GDebugFlag for fatal_criticals + * glib/gmessages.c: (_g_debug_init): handle G_DEBUG=fatal_criticals, + to help find critical warnings in applications. (#320017, + Vincent Untz) + +2005-11-02 Tor Lillqvist + + * glib/glib.symbols: Remove large amount of trailing whitespace + from one line. Remove #ifdef G_UNDEFINED from around + g_hash_table_new and g_hash_table_new_full symbols, what was the + purpose of that? Add the g_slice functions. + +Tue Nov 1 16:24:20 2005 Tim Janik + + * glib/gmem.[hc]: prepared deprecation of GMemChunk and GAllocator. + added g_slice_*() API to allocate and cache small bits of memory. + an actuall allocator implementation for g_slice_*() is still pending. + + * glib/gthread.[hc]: changes from a patch by Matthias Clasen. + changed GRealThread list to use in-structure *next; fields instead + of GSList, in order for thread iteration to not depenend on g_slice_*() + indirectly. + _g_thread_mem_private_get(): + _g_thread_mem_private_set(): added accessors for private memory, + needed because the ordinary GPrivate implementation relies on GArray + and GSList and therefore indirectly on working g_slice_*() allocations. + + * glib/gthread.[hc]: + g_thread_foreach(): new public API function to loop over all existing threads. + + * glib/gdataset.c: + * glib/gstring.c: + * glib/gcache.c: + * glib/garray.c: + * glib/gqueue.c: + * glib/gslist.c: + * glib/glist.c: + * glib/ghash.c: + * glib/gtree.c: + * glib/ghook.c: + * glib/gmain.c: + * glib/gnode.c: + removed GAllocator and free list usages and accompanying locks. + use g_slice_*() API to allocate and cache small bits of memory. + + * glib/ghook.h: removed GMemChunk field from public API. + + * glib/gslist.h: + * glib/glist.h: deprecate allocator API, provide _free1() for consistency. + + * glib/gnode.h: deprecate allocator API. + + * glib/gmain.c: reordered GPollRec fields so g_slice_free_chain() can + be used for poll rec lists. + + * glib/grel.c: removed mem chunk usage, and allocated tuples via g_slice_*(). + g_relation_destroy(): free all tuples from the all_tuples hash table, + this effectively maintains the life time track keeping of tuples. + g_relation_delete_tuple(): free tuples which are removed from the + all_tuples hash table. this fixes a temporary leak that was present + in the memchunk code until the destruction of the relation. + +2005-10-29 Matthias Clasen + + * tests/convert-test.c: Add some tests for conversions between + UTF-8, UCS-4 and UTF-16. + + * glib/gutf8.c (g_utf8_to_ucs4, g_utf8_to_utf16): Fix handling + of len == -1, noticed by Morten Welinder. + +2005-10-27 Erdal Ronahi + + * configure.in: Added ku (Kurdish) to ALL_LINGUAS + +2005-10-26 Matthias Clasen + + * glib/gutf8.c (g_ucs4_to_utf8): Don't set items_read twice + in the error case, and add some documentation. (#319806, Morten + Welinder) + +2005-10-19 Manish Singh + + * configure.in: Use AC_CHECK_FUNCS for _NSGetEnviron, to get the + config.h symbol automatically. Fixes bug #313731. + +2005-10-19 Tor Lillqvist + + * glib/gwin32.c (g_win32_get_package_installation_directory): + Return a g_strdup()ed copy of the value stored in the hash table, + so that it can be g_free()d without leaving a dangling pointer in + the hash table. (#319232) + +2005-10-06 Matthias Clasen + + * glib/gunicollate.c (g_utf8_collate_key_for_filename): Handle + all-zero sequences correctly. (#317930, Sebastien Bacher) + +2005-10-05 Matthias Clasen + + * glib/gmarkup.c (g_markup_escape_text): Doc addition + + * Makefile.am: Add Collation tests. + + * tests/collate/*: Inputs and expected outputs for collation tests. + + * tests/run-collate-tests.sh: Script to run collation tests. + + * tests/unicode-collate.c (main): Rework slightly to make + it usable in unit tests. Also test g_utf8_collate_key_for_filename(). + +2005-10-01 Behdad Esfahbod + + * docs/reference/glib/tmpl/unicode.sgml: + * glib/gen-unicode-tables.pl: + * glib/gunibreak.h: + * glib/gunichartables.h: + * glib/gunicode.h: + * tests/casefold.txt: + * tests/casemap.txt: Updated to Unicode 4.1. There are five new + GUnicodeBreakType types. That may break some applications, like + Pango <= 1.10. + +2005-09-26 Matthias Clasen + + * glib/gstrfuncs.c (g_ascii_strtoull): Add details to the + docs. (#314393, Matthew F. Barnes) + + * glib/glib.symbols: + * glib/gprintf.h: Remove g_snprintf() and g_vsnprintf(), since + they are already declared in glib.h. This doesn't break documented + use of gprintf.h, but should probably be pointed out in the + release notes for 2.10. (#314232, Behdad Esfahbod) + +Tue Sep 20 13:16:04 2005 Tim Janik + + * glib/gpattern.c (g_pattern_ph_match): applied significant recursion + complexity optimization, based on a patch from Matthias Clasen. + + * tests/patterntest.c: more tests, mostly from matthias. + +2005-09-20 Matthias Clasen + + * glib/gqueue.c (g_queue_insert_sorted): Correct the docs. + (#316703, Mark Drago) + +Mon Sep 19 17:23:23 2005 Tim Janik + + * glib/gpattern.c: applied a patch from matthias which checks on the + upper bound of GPatternSpec length to optimize matches. + cosmetic fixups. + + * tests/patterntest.c: added more match cases. + +2005-09-16 Tor Lillqvist + + * glib/gstrfuncs.c (g_ascii_strcasecmp, g_ascii_strncasecmp): Add + warning to doc comment that these functions should not be used on + encodings like CP932. + +2005-09-14 Matthias Clasen + + * tests/keyfile-test.c: Add a test for grup names of length 1. + + * glib/gkeyfile.c (g_key_file_line_is_group): Accept group names + of length 1. (#316309) + +2005-09-12 Matthias Clasen + + * glib/gmarkup.c (g_markup_escape_text): Clarify docs. + +2005-09-11 Sebastian Wilhelmi + + * tests/refcount/Makefile.am (INCLUDES): Link the the refcount + tests to the system thread library $(G_THREAD_LIBS). Fixes #313744 + and #314217. + +2005-09-11 Kjartan Maraas + + * glib/gmain.c: (g_child_watch_prepare), (g_child_watch_check), + (child_watch_helper_thread): Remove some dead code. Closes + bug #315278. + +2005-09-07 Tor Lillqvist + + * glib/Makefile.am: Create also a console version of the + gspawn-win32-helper program, gspawn-win32-helper-console.exe. + It's otherwise identical to gspawn-win32-helper.exe, except marked + as a console application (linked without the -mwindows option). + + * glib/gspawn-win32.c (do_spawn_directly, do_spawn_with_pipes): + Drop the dont_wait parameter. Its truth value correlated 100% with + the NULLness of the exit_status parameter anyway, so it's enough + to check whether exit_status is NULL. Invert the sense of the + dont_return_handle parameter and rename it to do_return_handle, to + make the code easier to read by avoiding double negations. + + (g_spawn_sync_utf8, g_spawn_async_with_pipes_utf8): Modify calls + to do_spawn_with_pipes() accordingly. + + (do_spawn_with_pipes): If we have a console, use the console + version of the helper program, otherwise use the GUI one. This + avoids extra console windows opening up in some situations. (In + case a console application uses the GUI gspawn-win32-helper.exe to + spawn another console application we would get a separate console + for the spawned console application). + + * glib-zip.in: Distribute also gspawn-win32-helper-console.exe. + +2005-09-05 Matthias Clasen + + * glib/gmappedfile.c (g_mapped_file_new): Report an error + if the file is too large. (#315275, Kjartan Maraas) + + * glib/gkeyfile.c (g_key_file_load_from_fd): The return value + of read() is signed. (#315273, Kjartan Maraas) + +2005-08-31 Tor Lillqvist + + * glib/gutils.h: Wrapping atexit() is a bad idea on Windows, where + the EXE and each DLL have their own atexit function chains. + + #define g_atexit as atexit instead. This means it has a + better chance of doing what the caller wants. For instance, + gtkhtml calls g_atexit() registering a function in gtkhtml + itself. This caused a crash when g_atexit() was implemented as a + function in the GLib DLL. The gtkhtml DLL was already unloaded by + the time the GLib DLL got unloaded. + + * glib/gutils.c: #undef the #define mentioned above, to also get a + real g_atexit() into the DLL for backward compatibility. Document + the Windows behaviour of g_atexit(), and document the varying ways + atexit() can behave in the context of dynamically loaded modules + on Unix. + +2005-08-31 Matthias Clasen + + * glib/glib.symbols: + * glib/gquark.h: + * glib/gdataset.c: Add string interning functions. + +2005-08-28 Matthias Clasen + + * glib/giochannel.c: Unify some near-duplicate strings. (#314654, + Clytie Siddall) + +2005-08-26 Matthias Clasen + + * configure.in: Bump version to 2.9.0 + +2005-08-25 Tor Lillqvist + + Make also the g_spawn*() functions take parameters in the GLib + file name encoding, i.e. UTF-8, on Windows. Has no impact on Unix + API or ABI. Like the other GLib API that was earlier changed to + use UTF-8 on Windows, the names of the functions that take UTF-8 + have _utf8 suffixes added by using preprocessor macros in the + header file. The old names are kept for functions with the old + behaviour, taking parameters in the system codepage, for DLL ABI + stability. + + * glib/gspawn.h: On Win32 add the suffix _utf8 to the names of the + g_spawn*() functions. + + * glib/gspawn-win32.c: Use wide-char API on NT-based + Windows. Convert parameters from UTF-8 to wide chars (NT) or + system codepage (Win9x) and call the C library _wspawn*() or + spawn*() functions respectvely. Add DLL ABI stability versions + that take parameters in the system codepage. + + * glib/gspawn-win32-helper.c: On NT-based Windows use the + wide-char versions of argv and envp, and use wide-char API to + change directory and spawn the program to run. Remove the verbose + debugging output, it was too complex to modify for the wide-char + features. (Just add temporary debugging printouts if needed, no + need to have them permanently in the source.) + + * glib/gspawn.c: Corresponding documentation updates. + + * glib/glib.symbols: Corresponding changes: Mark the ABI stability + symbols as PRIVATE, add the new _utf8-suffixed ones. + +2005-08-24 Stepan Kasal + + * glib/gtypes.h (G_MININT64): Cast the constant to gint64; it is + guint64 otherwise and that can produce warnings about comparison + between signed and unsigned. + +2005-08-23 Matthias Clasen + + * glib/gutils.c: Fix the crt_externs.h include. + +2005-08-23 Stepan Kasal + + * NEWS: Fix spelling of my first name. + +2005-08-23 Matthias Clasen + + * Bump version + + * === Released 2.8.1 === + + * NEWS: Updates + +2005-08-20 Hans Breuer + + * glib/makefile.msc.in : link with ws2_32.lib + +2005-08-18 Tor Lillqvist + + * configure.in: Check for + + * glib/gbacktrace.c: Include on if HAVE_SYS_WAIT_H. + +2005-08-18 Ross Burton + + * glib/gstring.c: + Optimise single-character insertions. + + * glib/gutf8.c: + Note copied code. + + * tests/string-test.c: + Add tests for new optimisation, and fix a leak. + +2005-08-17 Matthias Clasen + + * configure.in: Check for crt_externs.h and _NSGetEnviron. + + * glib/gutils.c: On Darwin, include crt-externs.h and + define environ using _NSGetEnviron(). (#313731) + +2005-08-16 Stepan Kasal + + * glib/gutils.c (g_get_any_init): Move the body of the big if... + (g_get_any_init_do): ... to this new function. + (g_get_any_init): Declare as inline. + (g_get_any_init_locked): New inline function, does the locking. + Make use of these two throughout the code. + +2005-08-15 Matthias Clasen + + * glib/gbacktrace.c (g_on_error_stack_trace): Wait for + the child process and then simply return. This makes + The "S" option work as documented in g_on_error_query(). + (#313125, Matthew F. Barnes) + + * glib/gunicode.h: Update the link to Unicode category + values. (#313369, Behnam Esfahbod) + + * glib/gqueue.c (g_queue_find_custom): Clarify docs + a little. (#311727, Tristan van Berkom) + + * glib/abicheck.sh, gobject/abicheck.sh: Make the + check work on ia64 too, where some symbols ended up + in yet another section. + diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 new file mode 100644 index 0000000..b88cdd2 --- /dev/null +++ b/ChangeLog.pre-2-12 @@ -0,0 +1,738 @@ +2006-08-22 Matthias Clasen + + * Branch for 2.12 + +2006-08-20 Tor Lillqvist + + * glib/gnulib/vasnprintf.c (vasnprintf): Fix crash when printing + large 64-bit values on Win32 using the %I64x format. (#351034, + Neil Piercy) + +Wed Aug 16 13:59:07 2006 Tim Janik + + * tests/gobject/Makefile.am: + * tests/gobject/singleton.c: added test program which demonstrates + and checks singleton construction. + +2006-08-15 Matthias Clasen + + * glib/gbookmarkfile.c (g_bookmark_file_get_groups): + * glib/gmain.c (g_source_is_destroyed): Add Since tags. + * glib/gkeyfile.c (g_key_file_get_double_list): Fix + Since tag. (#351583, Brian Cameron) + + * configure.in: Bump version + + * === Released 2.12.2 === + + * NEWS: Updates + +2006-08-08 Emmanuele Bassi + + * glib/gbookmarkfile.c (g_bookmark_file_remove_group) + (g_bookmark_file_set_app_info): Plug a couple of leaks + when removing data from a bookmark. + +2006-08-05 Matthias Clasen + + * glib/gbookmarkfile.c (find_file_in_data_dirs): Correct the + grammar of an error message. (#349792, Jakub Friedl) + + * glib/gkeyfile.c (g_key_file_to_data): Don't insert unnecessary + newlines in keyfiles. (#349825, Chris Wilson) + + * glib/guniprop.c (g_unichar_toupper, g_unichar_tolower) + (real_toupper, real_tolower): If a character can't be converted, + don't replace it with a NUL byte, but leave it unchanged. + (#348491, Nikolai Weibull) + + * tests/unicode-caseconv.c: Adapt to this change. + + * tests/unicode-caseconv.c (main): Add a comment to point out + a quirk in the test data that we are working around here. + +2006-07-31 Behdad Esfahbod + + * glib/guniprop.c (g_unichar_isxdigit): Make it only accept those + characters that we accept i g_unichar_xdigit_value(), i.e. don't + accept non-decimal digits. (#347842, Nikolai Weibull) + +2006-07-31 Behdad Esfahbod + + * glib/gunidecomp.c (_g_utf8_normalize_wc): Update to reflect Unicode + PR #29 (#348694, Nikolai Weibull) + + * tests/unicode-normalize.c (encode), (test_form): Make output more + useful, reporting the unexpected output of the test. + +2006-07-24 Tor Lillqvist + + * tests/slice-test.c: Use g_get_current_time() insted of + gettimeofday(). + +2006-07-22 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.12.1 === + + * glib/gconvert.c: Fix the prototype of _g_charset_get_aliases. + (#346494, Thomas Klausner) + + * NEWS: Updates + +2006-07-21 Behdad Esfahbod + + * glib/gmirroringtable.h: Updated to Unicode Character Database 5.0.0. + +2006-07-20 Matthias Clasen + + * glib/guniprop.c (real_toupper, real_tolower): Small optimization. + (#348011, Nikolai Weibull) + +2006-07-19 Behdad Esfahbod + + * glib/gunibreak.h: + * glib/gunichartables.h: + * glib/gunicomp.h: + * glib/gunidecomp.h: + Update to final Unicode Character Database 5.0.0. (#336281) + +2006-07-06 Behdad Esfahbod + + * glib/gutils.c (g_parse_debug_string): When matching debug flag keys, + ignore case and accept any of comma, colon, semicolon, space, and tab + as separators. Also, match dash with underscore. + +2006-07-05 Matthias Clasen + + * glib/gbase64.c: Fix typos in the docs. (#346660, Mark + Drago) + +2006-07-03 Runa Bhattacharjee + + * configure.in: Added Bengali India (bn_IN) in ALL_LINGUAS. + +2006-07-02 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.12.0 === + +2006-06-30 Matthias Clasen + + * NEWS: Updates + + * configure.in: Set version to 2.12.0 + +2006-06-20 Matthias Clasen + + * glib/gtimer.c (mktime_utc): Fix an off-by-2 error + in the leap year calculation. (#344905, Dan Winship) + + * tests/testglib.c (main): Change the test data for + the g_time_val_from_iso8601 tests to expose an off-by-2 + error in the leap year calculation. + + * configure.in: Bump version + + * === Released 2.11.4 === + + * NEWS: Updates + +2006-06-16 Matthias Clasen + + * tests/file-test.c (test_mkstemp): Add tests. + + * glib/gfileutils.c (g_mkstemp): Allow the XXXXXX to occur + inside the template, not just at the end. + +2006-06-14 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_to_data): Separate groups by + an empty line (#344868, Christian Persch) + +2006-06-14 Tor Lillqvist + + * glib/gutils.c (g_listenv): Add Windows notes to doc comment. + +2006-06-12 Emmanuele Bassi + + * glib/gbookmarkfile.h: + * glib/gbookmarkfile.c (g_bookmark_file_remove_item): Return + a boolean instead of void. + + * tests/bookmarkfile-test.c (test_modify): Add a test case + for g_bookmark_file_remove_item(). + +2006-06-12 Matthias Clasen + + * Bump version + + * === Released 2.11.3 === + + * NEWS: Updates + +2006-06-09 Emmanuele Bassi + + * glib/gbookmarkfile.c (g_bookmark_file_remove_application): Use + an empty string to pass the test in set_app_info. + + (g_bookmark_file_move_item): Remove the old item from the + look up table; return success in case of empty target. + +2006-06-08 Tor Lillqvist + + * glib/gunicollate.c (msc_strxfrm_wrapper): Workaround for bug in + strxfrm() in Microsoft's newer C runtimes. (#343919, Kazuki + Iwamoto) + +2006-06-05 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.11.2 === + + * configure.in: Set interface age to 0. + + * NEWS: Updates + + * glib/gmain.c: Fix some doc formatting issues. + + * glib/gstrfuncs.c: Revert accidental commit. + + * glib/gmain.c (get_dispatch): Don't leak the + dispatch struct. (#321886) + + * tests/strtod-test.c: Add some tests involving + leading whitespace. + + * glib/gstrfuncs.c (g_ascii_formatd): Skip leading + whitespace. (#343899, Øystein Johansen) + +2006-06-01 Matthias Clasen + + * glib/gmain.h: + * glib/gmain.c: Add three new functions, + g_main_current_source, g_source_set_funcs and + g_source_is_destroyed, that will be necessary to + solve thread-safety issues with idles in GTK+. + (#321886, Chris Wilson) + +2006-06-01 Matthias Clasen + + * glib/giochannel.c (g_io_channel_write_chars): Avoid + running in an assertion with small writes. (#343566, Chris + Wilson) + + * tests/iochannel-test.c: Add a testcase for small writes. + + * glib/glib.symbols: + * glib/ghash.h: + * glib/ghash.c: Add g_hash_table_{remove,steal}_all to + remove all nodes from a hash table. (#168538, Matt Barnes) + +2006-06-01 Behdad Esfahbod + + * glib/gkeyfile.c (g_key_file_to_data), + (g_key_file_parse_value_as_comment), + (g_key_file_parse_comment_as_value): + * glib/gscanner.c (g_scanner_get_token_ll): Cleanup. Use return + value of g_string_free(...). (#343548, Chris Wilson) + +2006-05-28 Matthias Clasen + + * glib/gmarkup.c (g_markup_parse_context_parse): + Don't use g_str_has_{prefix,suffix} here. + +2006-05-28 Matthias Clasen + + * glib/gmarkup.h: Add a GMarkupParseFlags flag for + treating CDATA as text. + + * glib/gmarkup.c (g_markup_parse_context_parse): + Implement it here. + +2006-05-28 Matthias Clasen + + * tests/markups/expected-*: Output that test-markup + is expected to produce when run on the valid gmarkup + examples. + + * tests/markup-test.c: Only dump the results of the + first, unchunked parse, to compare it against the expected + output. + + * tests/run-markup-tests.sh: For valid examples, compare + the output of test-markup against the corresponding + expected- file. + +2006-05-24 Matthias Clasen + + * configure.in: Don't compile timeloop on Minix. + (Leonard den Ottolander) + +2006-05-22 Sebastian Wilhelmi + + * glib/gthread.c (g_thread_init_glib): Run _g_atomic_thread_init + as the first of the full fledged initializers to allow the later + to potentially use atomic ints (which they currently do + not). (#342563, Peter Kjellerstedt) + +2006-05-16 Matthias Clasen + + * tests/Makefile.am: + * tests/strtoll-test.c: Add tests for g_ascii_strtoll() + and g_ascii_strtoull(). + + * glib/glib.symbols: + * glib/gstrfuncs.h: + * glib/gstrfuncs.c (g_ascii_strtoll): New function to + parse signed 64bit integers like strtoll does. + + * glib/goption.c (parse_int64): Use g_ascii_strtoll(), + since strtoll() is C99 and not available on some + systems. (#341826, Kazuki Iwamoto) + +2006-05-15 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.11.1 === + + * NEWS: Updates + +2006-05-13 Matthias Clasen + + * glib/grel.c: Fix several cases of deref-before-NULL-check. + (#341191, Pascal Terjan) + + * glib/glib.symbols: + * glib/goption.h: + * glib/goption.c: Allow optional summary and description + texts before and after the option descriptions, and add + a way to translate them. (#336120, Behdad Esfahbod) + +2006-05-12 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_sock_set_flags): Implement + setting/clearing G_IO_FLAG_NONBLOCK for channels attached to + sockets. (#341192) + (g_io_win32_unimpl_set_flags): set_flags method for the + unimplemented case. + +2006-05-11 Bastien Nocera + + * glib/goption.c: (parse_int64), (parse_arg), (free_changes_list): + * glib/goption.h: + * tests/option-test.c: (arg_test6), (main): add an int64 type for + GOption (G_OPTION_ARG_INT64) (#341237) + +2006-05-10 Sebastian Wilhelmi + + * glib/gthread.h, gthread/gthread-impl.c: Make the magic and + location arguments to the error-checking-mutex functions const and + do not write to them, as we might not own them. Clean up the + error-checking-mutex code quite a bit. (#335198, Chris Wilson) + + * glib/gthread.c: Use g_atomic_pointer_set instead of old + homegrown version now that we have it. (#335198, Chris Wilson) + + * gthread/gthread-posix.c, gthread/gthread-win32.c: Prevent + calling into g_cond_wait resp. g_mutex_lock/unlock directly to + avoid recursions into the errorcheking mutex code (and out of + principle anyway). (#335198, Chris Wilson) + + * tests/errorcheck-mutex-test.c: Adapt to GLib coding standards. + +2006-05-09 Sebastian Wilhelmi + + * glib/gthreadinit.h: Renamed to glib/gthreadprivate.h and moved + system thread identifier comparision and assignment macros from + glib/gthread.c to glib/gthreadprivate.h. + + * glib/Makefile.am, glib/gatomic.c, glib/gconvert.c, glib/gmain.c, + glib/gmem.c, glib/gmessages.c, glib/grand.c, glib/gslice.c, + glib/gthread.c, glib/gutils.c, gthread/gthread-impl.c: Use + glib/gthreadprivate.h instead of glib/gthreadinit.h. + + * gthread/gthread-impl.c: Use GSystemThread instead of GThread for + owner determination. (#311043, jylefort@FreeBSD.org) + + * tests/Makefile.am, tests/errorcheck-mutex-test: New test program + to test for all checked violations. + + * glib/gprintf.c, glib/gspawn-win32.c, glib/gutf8.c, + gthread/gthread-impl.c, gthread/gthread-posix.c, + gthread/gthread-win32.c: Use canonical include form for internal + headers. config.h is always there. + + * Remove obsolete gthread/gthread-solaris.c. + +2006-05-08 Matthias Clasen + + * tests/convert-test.c (test_one_half): Use encoding names which + may work better on Solaris. (#340434, Alessandro Vesely) + + * tests/keyfile-test.c (test_number): Add some tests for + invalid floating point numbers. + + * glib/gkeyfile.c (g_key_file_parse_value_as_double): Return + an error for the empty string. (#339105, Morten Welinder) + + * glib/gscanner.c (g_scanner_config_template): Make const, + noticed by Kjartan Maraas. + +2006-05-06 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_set_string_list) + (g_key_file_set_locale_string_list): Fix invalid memory + reads. (#340816, Nick Treleaven) + +2006-05-04 Alexander Larsson + + * glib/gbase64.c: (g_base64_decode_step): + Fix OOB write (#340538) + +2006-05-03 Matthias Clasen + + * tests/base64-test.c: Add some more tests. + + * glib/gbase64.c (g_base64_decode_step): Avoid writing + beyond the guaranteed lenght of the output buffer, if + there is padding. + + * tests/base64-test.c (test_incremental): Use malloced memory + instead of stack-allocated, so that MALLOC_CHECK_=2 catches + the OOB write... + + * glib/gbookmarkfile.c (g_bookmark_file_load_from_data): Remove + an overzealous return_if_fail check that causes make check to + fail. + +2006-05-02 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.11.0 === + + * NEWS: Updates + + * tests/casemap.txt: + * tests/casefold.txt: Regenerate from Unicode 5.0 data. + + * glib/guniprop.c: Make interval_compare static. + +Tue May 2 15:00:00 2006 Tim Janik + + * tests/gobject/deftype.c: added test code from Behdad Esfahbod, + see #337128. + +Tue May 2 14:18:25 2006 Tim Janik + + * glib/goption.c (g_option_context_parse): fixed leak in short + option parsing. rewrote parts of the code to be more concise to + enhance readability. fixed exaggerated uses of strlen. + +2006-04-28 Behdad Esfahbod + + * glib/guniprop.c: #include + +2006-04-27 Matthias Clasen + + * glib/glib.symbols: Add g_unichar_iswide_cjk. + * glib/guniprop.c: Add a "Since: 2.12". + + * NEWS: Updates + +2006-04-27 Behdad Esfahbod + + * docs/reference/glib/glib-sections.txt, + * glib/gunicode.h glib/guniprop.c: Implement g_unichar_iswide_cjk(). + (#105626) + +2006-04-27 Matthias Clasen + + * glib/gbookmarkfile.c (g_bookmark_file_set_description) + (g_bookmark_file_set_title, g_bookmark_file_set_icon): + Remove some special-casing of empty string which led to + dangling pointers. (#339337, Morten Welinder) + (expand_exec_line): Don't use printf() needlessly, handle + trailing '%' gracefully. (#339338, Morten Welinder) + (is_element_full): Silence the compiler. + (g_bookmark_file_dump, bookmark_metadata_dump): + (bookmark_app_info_dump): Escape strings before dumping + them in xml. (#339340, Morten Welinder) + +2006-04-27 Behdad Esfahbod + + * glib/gunibreak.h, glib/gunichartables.h: Regenerated using + Unicode Character Database 5.0 beta. + +2006-04-26 Matthias Clasen + + * glib/grand.c (g_rand_new): Don't repeat a failed fclose() + call, since that invokes undefined behaviour. (Coverity) + +2006-04-25 Matthias Clasen + + * glib/gbookmarkfile.c (is_element_full): Avoid a possible + NULL dereference (found by Coverity), also avoid some + pointless strdups. + + * tests/keyfile-test.c (test_comments): Add a test for + the previous change. + + * glib/gkeyfile.c (g_key_file_lookup_group_node): Remove + redundant code. + (g_key_file_get_group_comment): Don't dereference before + checking for NULL. (#338572, Coverity, Pascal Terjan) + +2006-04-19 Matthias Clasen + + * glib/gdataset.c: Add some missing Since: 2.8 tags. + +2006-04-19 Tor Lillqvist + + * glib/gatomic.c: Adapt to the changed prototype of + InterlockedCompareExchange() in newer SDKs. Use + InterlockedCompareExchangePointer() when applicable. (#155884, + John Ehresman) + +2006-04-18 Matthias Clasen + + * glib/gkeyfile.h: + * glib/glib.symbols: + * glib/gkeyfile.c: Add api to get and set doubles and + lists of doubles. (#164719, Maurizio Monge, Dom Lachowicz) + + * tests/keyfile-test.c: Add tests for new api. + + * glib/gkeyfile.c (g_key_file_add_group): Accept duplicate + groups. (#157877, Sebastien Bacher) + + * tests/keyfile-test.c: Add tests for duplicate key and + duplicate group handling. + +2006-04-17 Matthias Clasen + + * glib/gcompletion.c (g_completion_complete_utf8): Make passing + NULL for new_prefix work as documented. (#338845, Yevgen Muntyan) + + * tests/completion-test.c: Test that passing NULL for + new_prefix in g_completion_complete_utf8 works. + +2006-04-17 Kjartan Maraas + + * configure.in: Remove obsolete entry for no_NO. + * po/no.po: And the translation. + +2006-04-16 Matthias Clasen + + * glib/gdate.c (g_date_fill_parse_tokens): Avoid an array + overrun. (Coverity, fix by Pascal Terjan) + +2006-04-12 Bastien Nocera + + reviewed by: Matthias Clasen + + * glib/gconvert.c: add more details about which RFC is concerned + when using g_filename_to_uri (#337553) + +2006-04-12 Matthias Clasen + + * glib/goption.c (parse_arg): Add an assert to make it + clear when value can be NULL. + +2006-04-07 Martyn Russell + + * tests/threadpool-test.c: (test_thread_stop_unused): Removed an + assertion which can fail and is not a critical test. + +2006-04-07 Hans Breuer + + * glib/makefile.msc.in : added gbase64.obj and derive the static libs + name from auto* variables + * glib/makefile.msc.in : link user32.lib for MessageBox() + +2006-04-07 Martyn Russell + + * glib/gasyncqueue.[ch]: Added private API + _g_async_queue_get_mutex so that g_thread_pool_free() can use the + async queue mutex. + + * glib/gthreadpool.c: Make sure + g_thread_pool_stop_unused_threads() actually stops unused threads + and global limits (like max idle time and max unused threads) can + be set without creating a thread pool first. Fixed #335215 (patch + from Chris Wilson). + + * tests/threadpool-test.c: Added two new tests, tests setting + global limits before creating a thread pool. The second test + makes sure unused threads are actually stopped when using the + g_thread_pool_stop_unused_threads(). + +2006-04-05 Matthias Clasen + + * glib/gnulib/vasnprintf.c (vasnprintf): Make + long long printing work if snprintf is not + available. (#332841, Michael McDonald) + +2006-04-05 Behdad Esfahbod + + * tests/option-test.c: Check the return value of g_get_prgname for + NULL before passing to strcmp. + + * tests/slice-test.c: Report the correct name in Usage summary. + +2006-04-05 Matthias Clasen + + * tests/run-collate-tests.sh: Fix up shell script. + + * tests/option-test.c (arg_test5): Skip the test if + setting the locale fails. + (empty_test1): Reset prgname before the test. + + * tests/Makefile.am: Arrange for run-bookmark-test.sh + to be run by make check. + + * tests/utf8-pointer.c: + * tests/tree-test.c: Silence warnings. + +2006-04-04 Matthias Clasen + + * glib/glib.symbols: + * glib/gbase64.[hc]: Add G_GNUC_MALLOC where + appropriate, use glib types. + +2006-04-04 Alexander Larsson + + * glib/Makefile.am: + * glib/gbase64.[ch]: + * glib/glib.symbols: + Add base64 encode/decode functions + + * glib/glib.h: + Include gbase64.h + + * tests/Makefile.am: + * tests/base64-test.c: + Tests for base64 functions + +2006-04-04 Matthias Clasen + + * glib/gdate.c: Move short_month_names and long_month_names + to bss. + + * glib/gspawn-win32.c (g_spawn_error_quark): + * glib/gspawn.c (g_spawn_error_quark): + * glib/gshell.c (g_shell_error_quark): + * glib/gmarkup.c (g_markup_error_quark): + * glib/goption.c (g_option_error_quark): + * glib/gkeyfile.c (g_key_file_error_quark): + * glib/giochannel.c (g_io_channel_error_quark): + * glib/gfileutils.c (g_file_error_quark): + * glib/gconvert.c (g_convert_error_quark): + * glib/gbookmarkfile.c (g_bookmark_file_error_quark): + * glib/gthread.c (g_thread_error_quark): No point in making + the error path fast by caching quarks. + + * glib/gbookmarkfile.c: Make the parser struct const. + +2006-04-04 Behdad Esfahbod + + * glib/gbookmarkfile.c: Fix accidentally broken build. + +2006-04-03 Matthias Clasen + + * glib/gbookmarkfile.c: Don't include sys/time.h (#337027, + Kazuki IWAMOTO) + +2006-03-31 Tor Lillqvist + + * glib/gstdio.c (g_remove): Revert change below. It wasn't a good + idea after all, says the original bug reporter. See bug for + discussion. + +2006-03-30 Tor Lillqvist + + * glib/gstdio.c (g_remove): [Win32] call rmdir() only if remove() + fails with errno set to ENOENT, to leave errno set to EACCESS if + that is the problem. (#334799, Yevgen Muntyan) + +2006-03-30 Matthias Clasen + + * glib/gbookmarkfile.c (g_bookmark_file_get_app_info): Sync + the parameter names with the .h files, otherwise gtk-doc + misbehaves. + +2006-03-27 Emmanuele Bassi + + * tests/.cvsignore: Add bookmarkfile-test to the ignored files. + +2006-03-27 Emmanuele Bassi + + * tests/Makefile.am: + * tests/bookmarkfile-test.c: + * tests/run-bookmark-test.sh: + * tests/bookmarks/*.xbel: Add test suite for GBookmarkFile. + +2006-03-27 Emmanuele Bassi + + * docs/reference/glib/glib-docs.sgml: + * docs/reference/glib/glib-sections.txt: + * docs/reference/glib/tmpl/bookmarkfile.sgml: Add documentation for + GBookmarkFile to GLib's reference guide. + +2006-03-27 Emmanuele Bassi + + * glib/glib.h: + * glib/gbookmarkfile.h + * glib/gbookmarkfile.c: Add GBookmarkFile, a parser for files + containing bookmarks stored using the Desktop Bookmark + specification. Fixes bug #327662. + + * glib/glib.symbols: + * glib/Makefile.am: + * glib/makefile.msc.in: + * glib/makefile.mingw.in: Build glue for GBookmarkFile. + +2006-03-27 Dom Lachowicz + + * tests/option-test.c: Copy-and-paste error slipped into test5. Enable + test5, as per Matthias' comments in bug 329548#c11. + + Change a gboolean to an int. Fixes bug #329789. + + * configure.in: Bump version number to 2.11.0 + +2006-03-27 Matthias Clasen + + Add support for floating point numbers to goption. + (#329548, Behdad Esfahbod, patch by Antoine Dopffer and + Dom Lachowicz) + + * glib/goption.h: + * glib/goption.c: Support double arguments. + + * tests/option-test.c: Test double arguments.` + +2006-03-26 Matthias Clasen + + * glib/goption.c (g_option_context_new): Improve the description + of parameter_string in the docs. (#336085, Claudio Saavedra) + +2006-03-24 Martyn Russell + + * glib/gthreadpool.c: Updated the documentation to explain that + when the maximum threads is > 1 the sort functionality is not 100% + accurate due to the ramdom nature of the scheduler choosing which + threads to execute. Fixes bug #334943. + + * tests/threadpool-test.c: Disabled the debugging by default and + fixed the sort test to set the maximum threads to 1 to guarantee + the thread entry function is called in order. + +2006-03-23 Matthias Clasen + + === Branch for 2.10 === diff --git a/ChangeLog.pre-2-14 b/ChangeLog.pre-2-14 new file mode 100644 index 0000000..3a94a19 --- /dev/null +++ b/ChangeLog.pre-2-14 @@ -0,0 +1,1963 @@ +2007-11-07 Matthias Clasen + + === Branch for 2.14 === + +2007-11-07 Matthias Clasen + + * glib/gspawn.c (g_spawn_async_with_pipes): Slightly improve + the wording of the docs. (#492677, Areg Beketovski) + +2007-11-07 Matthias Clasen + + * glib/pcre/Makefile.am: Add an include to fix builddir != srcdir + builds. (#494602, Yevgen Muntyan) + +2007-11-07 Tor Lillqvist + + * glib/update-pcre/notdll.patch: Not needed, just use -DPCRE_STATIC. + + * glib/update-pcre/Makefile.am: Drop notdll.patch. + + * glib/update-pcre/Makefile.am-1 + * glib/update-pcre/update.sh + * glib/pcre/Makefile.am + * glib/Makefile.am: Use -DPCRE_STATIC. + + * tests/gio-test.c + * tests/mainloop-test.c + * tests/spawn-test.c: #define pipe(fds) _pipe(fds, 4096, + _O_BINARY) on Windows + + * tests/regex-test.c (test_expand): Don't print NULL with %s. + +2007-11-07 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.14.3 === + + * NEWS: Updates + +2007-11-06 Matthias Clasen + + * glib/pcre/*: Update the internal copy of PCRE to 7.4 + +2007-10-22 Tor Lillqvist + + * glib/gutils.c (_glib_gettext): Plug small one-time leak on + Windows. (#488068, Daniel Atallah) + +2007-10-21 Behdad Esfahbod + + * glib/gdate.c (g_date_strftime): + * glib/gmain.c (g_main_context_check): + * glib/gregex.c (g_match_info_fetch_all), (g_regex_split_full): + * glib/gthread.c (g_once_init_enter_impl), (g_once_init_leave): + * glib/gthread.h: + * glib/gutf8.c (g_utf16_to_utf8), (g_utf16_to_ucs4): + * tests/errorcheck-mutex-test.c (lock_locked_mutex), + (trylock_locked_mutex), (unlock_unlocked_mutex), + (free_locked_mutex), (wait_on_unlocked_mutex), + (wait_on_otherwise_locked_mutex), (timed_wait_on_unlocked_mutex), + (timed_wait_on_otherwise_locked_mutex): + Fix warnings from sparse. (#487491, Kjartan Maraas) + +2007-10-17 Matthias Clasen + + * configure.in: Bump version + +2007-10-16 Matthias Clasen + + * === Released 2.14.2 === + + * NEWS: Updates + + * configure.in: Check for sys/resource.h + + * glib/gspawn.c: Improve the fdwalk implementation on Linux + to only walk over actually open file descriptors. (#469231, + Lennart Poettering) + +2007-10-13 Sven Herzberg + + Reviewed by Tim Janik. + + Created marshallers that don't throw gcc warnings when compiling with + -WUnused (fixes #359165). + + * gobject/glib-genmarshal.c: decorate return_value and invocation_hint + with G_GNUC_UNUSED + +2007-10-04 Tor Lillqvist + + * glibconfig.h.win32.in: Always define G_CAN_INLINE. Even MSVC6 is + capable of inlining. (#483337, Steve Lhomme) + +2007-09-19 Behdad Esfahbod + + * glib/ghook.c (g_hook_free): Check for NULL finalizer. (#476849, Areg + Beketovski) + +2007-09-19 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.14.1 === + +2007-09-16 Matthias Clasen + + * glib/gutils.h (GUserDirectory): Fix doc formatting. + * glib/gmain.c (g_main_depth): Fix doc formatting. + +2007-09-16 Matthias Clasen + + * configure.in: Replace -pthread by -lpthread for + Freebsd, too. (#475619, Roy Marples) + +2007-09-16 Matthias Clasen + + * configure.in: When compiling against system pcre, + add a private dependency to the pc file. This should + fix static builds with system pcre. (#475923) + + * glib-2.0.pc.in: Add a Requires.private line + +2007-09-16 Matthias Clasen + + * NEWS: Updates + +2007-09-14 15:07:28 Tim Janik + + * glib/gutf8.c (g_utf8_strreverse): applied fix for bug #476840. + + * tests/utf8-pointer.c (test_misc): added test for g_utf8_strreverse(). + +2007-09-11 Marco Barisione + + * glib/Makefile.am: + * configure.in: propagate the pcre flags to libglib and not to all + parts of glib. (#475854, dmacks@netspace.org) + + * configure.in: fix a typo in the previous commit. (#475854, comment + #4) + +2007-09-11 Matthias Clasen + + * configure.in: Define G_ATOMIC_ARM. + + * glib/gatomic.c: Add Arm implementation of atomic + operations. (#457601, Jussi Laako) + +2007-09-10 Marco Barisione + + * glib/gregex.c: define PCRE_ERROR_NULLWSLIMIT if it's not defined by + PCRE, has PCRE 7.3 removed this definition. (#475474) + * configure.in: bump PCRE requirement to version 7.2. + * glib/gregex.c: use pcre_get_stringnumber() in + get_matched_substring_number() if G_REGEX_DUPNAMES was not set. + (#444765, Yevgen Muntyan) + * glib/gregex.c: change the type of ref_count from guint to gint, so + we can remove some ugly casts. + +2007-09-05 Behdad Esfahbod + + * glib/gregex.c: Fix header inclusion. (#473879, Peter Kjellerstedt) + +Wed Aug 29 12:08:40 2007 Tim Janik + + * glib/gthread.h (g_once_init_enter): fixed compiler warning about + loosing volatile qualifier, bug #457641. + +2007-08-24 Michael Natterer + + * glib/gslice.[ch]: make g_slice_copy() take a gconstpointer + instead of a gpointer. + +2007-08-22 Cody Russell + + * glib/gprintf.c: Document all printf functions to use + "bytes" terminology rather than "characters". (#469051) + +2007-08-20 Behdad Esfahbod + + * glib/guniprop.c: Document that g_unichar_get_script() is + equivalent to pango_script_for_unichar(). + +2007-08-20 Behdad Esfahbod + + * glib/gmappedfile.c: + * glib/gregex.c: + * glib/gstdio.c: + Fix typos (#468694). + +2007-08-14 Cody Russell + + * gobject/gsignal.c: g_type_default_interface_ref() was not + ensuring working g_signal_list_ids. Added checks for + !G_TYPE_IS_INTERFACE (itype). + (#465625, by some guy who calls himself Yeti) + +Tue Aug 14 02:06:10 2007 Tim Janik + + * glib/gthread.c (g_once_init_enter_impl): prevent race covered + by g_once_init_enter(), by checking for previous initializations + before entering initialisation branch. + + * tests/onceinit.c: added multi-thread/multi-initializer stress test + using unoptimized g_once_init_enter_impl(). + +Mon Aug 13 14:30:15 2007 Tim Janik + + * tests/onceinit.c (main): fixed array size typo. + +Mon Aug 13 14:21:44 2007 Tim Janik + + * tests/onceinit.c: test g_once_init_*() before and after + g_thread_init() and test concurrency resolution. + +Mon Aug 13 14:18:22 2007 Tim Janik + + * glib/gthread.c (g_thread_create_full): prevent linking a freed + GThread structure into global thread list in error cases. + +2007-08-08 Matthias Clasen + + * glib/gmarkup.c (append_escaped_text): Handle restricted + characters by converting them to numeric character + entities. (#464145, Andreas Monitzer) + + * tests/markup-escape-test.c: Add tests for restricted + characters and numeric character entities. + +2007-08-08 Matthias Clasen + + * glib/glib.symbols: + * glib/Makefile.am: + * glib/abicheck.sh: Make it work regardless of --enable-debug + +2007-08-08 Tristan Van Berkom + + * docs/reference/gobject/tmpl/gparamspec.sgml: Fixed minor typo in docs. + +2007-08-07 Matthias Clasen + + * MAINTAINERS: Update for new format regulations + +2007-08-03 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.14.0 === + + * NEWS: Updates + + * configure.in: Bump version to 2.14.0 + +2007-08-03 Matthias Clasen + + * glib/gregex.c: Revert the J handling change, + since it doesn't work. + +2007-08-03 Matthias Clasen + + * glib/gregex.c: Fix a C99ism. (#462549, Kazuki IWAMOTO) + +2007-08-03 Matthias Clasen + + * glib/gregex.c: Handle J changes in the pattern + correctly. (#444765, Yevgen Muntyan) + +2007-08-03 Pramod Raghavendra + + * configure.in: Added kn to ALL_LINGUAS + +2007-08-01 Tor Lillqvist + + * glib/update-pcre/notdll.patch: Update so it applies again. + + * glib/pcre/pcre.h: Corresponding change. + + * glib/gutils.c (get_special_folder): Drop leftover use of a + union. + + * glibconfig.h.win32.in: Update to match what configure produces. + +2007-07-31 Matthias Clasen + + * glib/pcre/*: Update the internal PCRE to 7.2 + +2007-07-31 Matthias Clasen + + * glib/pltcheck.sh: Fix some glitches + + * glib/gregex.c: Remove debug spew + +2007-07-21 Matthias Clasen + + * glib/gunidecomp.c: + * glib/gregex.c: + * glib/gstring.c: Various doc cleanups. + +2007-07-20 Alexander Larsson + + * configure.in: + Add goffset type (64bit file size) + Add G_MAXSSIZE and G_MINSSIZE + +2007-07-20 Matthias Clasen + + * glib/glib.symbols: Fix the build. + +2007-07-19 Behdad Esfahbod + + * glib/glib.symbols: + * glib/gunicode.h: + * glib/gunicodeprivate.h: + * glib/gunidecomp.c (g_unichar_combining_class): + * glib/guniprop.c (has_more_above): + Make g_unichar_combining_class() public. (#453998) + +Fri Jul 13 01:01:46 2007 Tim Janik + + * glib/gthread.[hc]: more atomic ops pointer cast fixes. this time it'll + work with atomic op macros *and* atomic op functions. + +Fri Jul 13 00:50:40 2007 Tim Janik + + * glib/gthread.[hc]: fixed missing pointer casts when using atomic ops. + +2007-07-12 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.7 === + + * NEWS: Updates + +Thu Jul 12 17:31:08 2007 Tim Janik + + * tests/slice-concurrent.c: beautified output somewhat. fixed long + sleeps by reducing sleep accumulating and using randomized re-scheduling + (which works on UP and SMP). increased possible blocksizes. + +Thu Jul 12 17:26:05 2007 Tim Janik + + * tests/slice-concurrent.c: added GSLice test from Stefan Westerfeld, + bug #433314. + +Thu Jul 12 15:46:40 2007 Tim Janik + + * glib/gslice.c: migrate per-thread magazine caches from single-thread + scenario to first thread using GSlice after g_thread_init(); based on + a patch by Tor Lillqvist, fixes #331853. + removed warning about g_thread_init() being called after other glib + functions (in particular g_slice* calls), because GSlice can cope + with this now and the rest of glib is believed to cope as well. + + * tests/slice-threadinit.c: new test program which tests GSlice working + across g_thread_init() calls. + +2007-07-10 Matthias Clasen + + * glib/pltcheck.sh: Add g_once_init_enter to the whitelist of + symbols allowed to have a local PLT entry, to fix 'make check'. + +Tue Jul 10 12:24:35 2007 Tim Janik + + * glib/gthread.[hc]: implemented g_once_init_enter(), + g_once_init_enter_impl() and g_once_init_leave(), based on a patch by + Antoine Tremblay, fixes #65041. + adapted exported inline function mechanism from gutils.[hc] for inlining + g_once_init_enter_impl() in gthread.[hc]. + +2007-07-09 Matthias Clasen + + * NEWS: Updates + +2007-07-09 Loïc Minier + + * tests/refcount/closures.c: (main): Output newlines after thousand + iterations of the inner-loop of the closures test; this helps having + smaller lines and continuously outputting new lines. (#447048). + +2007-07-09 Ryan Lortie + + * glib/gfileutils.c (write_to_temp_file): save errno to prevent it + being clobbered by call to g_filename_display_name(). Bug #453796. + +2007-07-09 Matthias Clasen + + * m4macros/glib-gettext.m4: Fix a small problem with + msgfmt -c detection. (#341988, Laszlo Peter) + +2007-07-07 Matthias Clasen + + * glib/gmarkup.c (g_markup_parse_context_end_parse): Handle + all states. (#454473) + +2007-07-06 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_check): When WSAEnumNetworkEvents() + signals FD_CONNECT that means that the connection attempt + finished, either successfully or failed. Test explicitly whether + the connnection succeeded and set either G_IO_OUT if it did, + G_IO_ERR|G_IO_HUP if it failed. + + Make sure we never set both G_IO_OUT and G_IO_HUP simultaneously + because in Unix poll(2) POLLOUT and POLLHUP are mutually + exclusive. + + Ignore whether the caller wants to watch G_IO_HUP or not. Always + select for FD_CLOSE because Unix poll(2) also ignores whether + POLLHUP in set the requested events bitmask or not. + +Fri Jun 29 2007 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.6 === + + * NEWS: Updates + +Mon Jun 25 16:43:13 2007 Tim Janik + + * glib/ghash.c: g_hash_table_find(), g_hash_table_foreach(): + document performance caveats for linear order searches. + +2007-06-22 Mathias Hasselmann + + * glib/gstring.c: Use memcpy in g_string_append_vprintf (#57693). + +2007-06-18 Mathias Hasselmann + + * glib/gstring.c: Restore old behaviour of + g_string_append_vprintf: g_vasprintf seems to be faster + than g_printf_string_upper_bound (#57693). + +2007-06-18 Matthias Clasen + + * glib/gutils.c (g_get_home_dir): Add some motivation. + +2007-06-18 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.5 === + + * NEWS: Updates + +2007-06-18 Emmanuele Bassi + + * glib/gmain.h: + * glib/gmain.c: + * glib/glib.symbols: Add g_timeout_add_seconds_full() variant + to g_timeout_add_seconds(), accepting a destroy notification + function and a priority. (#448819) + +2007-06-17 Matthias Clasen + + * glib/gutils (g_get_current_dir): Prevent segfaults on + long paths. (#447935, Robby Griffin) + +2007-06-17 Behdad Esfahbod + + * glib/gdataset.c (g_quark_from_string), + (g_quark_from_static_string): Accept NULL and return GQuark + value of zero. (#446859) + +2007-06-16 Mathias Hasselmann + + * glib/gstring.c: Correctly use g_printf_string_upper_bound + in g_string_append_vprintf. Fixes #447933. + +2007-06-15 Sebastian Wilhelmi + + * docs/reference/glib/tmpl/threads.sgml: Extended the comments on + those functions, that are NOOPs, before g_thread_init() has been + called. (#447583) + + * glib/gthread.c (g_static_mutex_free): Clarified comment to + remind myself, that calling g_static_mutex_free() before + g_thread_init() is safe. + +2007-06-15 Cody Russell + + * docs/reference/gobject/tmpl/gboxed.sgml: + * docs/reference/gobject/gobject-sections.txt: + * glib/gregex.c: + * gobject/gboxed.[ch]: + * gobject/gobject.symbols: Added GRegex boxed type. + (#445065, Carlos Garnacho) + +2007-06-15 Sebastian Wilhelmi + + * glib/gregex.c: Replaced & by & in to make + gtk-doc happy. + +2007-06-14 Ryan Lortie + + * docs/reference/glib/glib-sections.txt: + * glib/glib/symbols: + * glib/gstring.[ch] (g_string_printf_internal): Improve + performance by removing the use of an intermediate g_malloc'd + buffer. Rename to g_string_append_vprintf, document, and expose + along with g_string_vprintf as new public API (#57693). + +2007-06-15 Mathias Hasselmann + + * build, tests/string-test.c, glib/glib.symbols, + glib/gstring.c, glib/gstring.h: Introduce g_string_overwrite(_len)? + for overwriting parts of strings (#368686, Samuel Cormier-Iijima) + +2007-06-14 Cody Russell + + * gobject/gtype.c (g_type_class_add_private): Check for 0-sized + private data. (#443869) + +2007-06-14 Matthias Clasen + + * glib/gmain.c (g_timeout_add_seconds): Fix doc typos. (#447534, + Vincent Untz) + +2007-06-13 Behdad Esfahbod + + * glib/pltcheck.sh: Whitelist g_atomic_{int,pointer}_[gs]et() as + we don't alias them intentionally. (#354522) + +2007-06-13 Sven Neumann + + * glib/gslice.[ch] added g_slice_copy() and g_slice_dup() (#442029). + + * glib/glib.symbols: updated. + +2007-06-12 Behdad Esfahbod + + * glib/gunicode.h: Add more G_GNUC_CONST and G_GNUC_PURE. + +2007-06-11 Emmanuele Bassi + + * glib/gutils.c (maybe_expire_user_special_dirs), + (g_get_user_special_dir): Remove the cache expiration logic: it + makes g_get_user_special_dir() not thread-safe. Document the fact + that on some platform the value might be changed by the user and + that GLib won't be able to reflect the change. + +2007-06-11 Tor Lillqvist + + * glib/gwin32.c (g_win32_get_package_installation_directory) + (g_win32_get_package_installation_subdirectory): Update doc + comments. Mention that it is not recommeded to use the Registry + features. + +2007-06-06 Tor Lillqvist + + * glib/gutils.c: Add definitions for more CSIDL_* constants in + case missing from headers. Use CSIDL_PERSONAL instead of + CSIDL_MYDOCUMENTS as CSIDL_MYDOCUMENTS seems to be a new thing + that doesn't work in XP SP2 even. + +2007-06-06 Matthias Clasen + + * glib/gutils.c (g_get_user_special_dir): Fall back to + $HOME/Desktop for the DESKTOP directory, like + xdg_user_dir_lookup() does. + +2007-06-05 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.4 === + + * NEWS: Updates + +2007-06-05 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_is_key_name): + (g_key_file_is_group_name): Don't assume the string is + valid UTF-8, since it may be user data. (#444161, Ben Combee) + +2007-06-05 Behdad Esfahbod + + * glib/gutf8.c: Add not to g_utf8_get_char_validated() about + nul-terminated strings. + +2007-06-05 Matthias Clasen + + * glib/gutils.c (g_get_user_special_dir): Don't deadlock + when running with threads. (#444121, Christian Persch) + +2007-06-05 Vincent Untz + + * glib/goption.c: (g_option_context_get_help): don't replace the usage + line with the description for optional parameters, but append the + description. (#444130) + +2007-06-04 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.3 === + + * NEWS: Updates + +2007-06-04 Matthias Clasen + + Add support for a number of special directories, as + defined by the xdg-user-dirs specification. (#432651, + Bastien Nocera, Emmanuele Bassi, Michael Natterer) + + * glib/glib.symbols: + * glib/gutils.[hc]: Add the GUserDirectory enum and + g_get_user_special_dir(), with implementations based + on the xdg-user-dirs spec and on native interfaces + for Win32 and Carbon. + + * configure.in: Add Carbon checks. + + * tests/tetsglib.c: Test g_get_user_special_dir(). + +2007-06-03 Yevgen Muntyan + + * glib/gregex.c: fixed g_regex_fetch_named* for cases when (?J) + is used inside a pattern (#442265, comment #12). + * tests/regex-test.c: Test it. + +2007-06-03 Matthias Clasen + + * NEWS: Updates + +2007-06-03 Yevgen Muntyan + + Some API additions and changes (#442265). + + * glib/gregex.c: + * glib/gregex.h: new functions: g_regex_ref(), g_regex_unref() which + replaces g_regex_free(); g_match_info_get_regex(), g_match_info_get_string(); + g_regex_check_replacement(). + Made g_match_info_expand_references() accept NULL; changed GRegexEvalCallback + to take only arguments which are likely to be actualy used. + + * docs/reference/glib/glib-sections.txt: + * glib/glib.symbols: Added new functions. + + * tests/regex-test.c: Test them. + + * docs/reference/glib/tmpl/gregex.sgml: Updated GRegexEvalCallback docs. + +2007-05-31 Matthias Clasen + + * README.win32: Fix a typo. (#423708, Olivier Delhomme) + +2007-05-30 Dan Winship + + * glib/gkeyfile.h: add defines for desktop file handling. #339225, + original patch from Vincent Untz. + +2007-05-29 Cody Russell + + * configure.in: Fix a sed script that doesn't correctly detect + i586-mingw32-gcc-3.4 compiler, and was causing -Wno-pointer-sign + errors when building with that compiler. (#440896, Yevgen Muntyan) + +2007-05-29 Marco Barisione + + * glib/gregex.c: Fix g_regex_fetch_named() and + g_regex_fetch_named_pos() when G_REGEX_DUPNAMES is used (#434358, + Yevgen Muntyan and #419376, Marco Barisione, patch by Yevgen Muntyan) + +2007-05-25 Behdad Esfahbod + + * glib/guniprop.c (g_unichar_iswide), (g_unichar_iswide_cjk): + Update to Markus Kuhn's updated wcwidth for Unicode 5.0. + +2007-05-22 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.2 === + + * README.in: + * NEWS: Updates + +2007-05-18 Matthias Clasen + + * configure.in: Try again to move the compiler-dependency + of G_GNUC_INTERNAL to runtime. + +2007-05-18 Matthias Clasen + + * configure.in: Don't let PERL_PATH be ''. (#356769, Joseph Sacco) + +2007-05-17 Michael Natterer + + * configure.in: hotfix: revert last change to fix the build on OS X. + +2007-05-17 Matthias Clasen + + * glib/goption.c (g_option_context_set_translate_func): Fix + a doc typo. (#439232, Vincent Untz) + +2007-05-17 Matthias Clasen + + * configure.in: Move the compiler-dependency in the G_GNUC_INTERNAL + definition from configure-time to runtime (of the compiler). + (#438869, Damien Carbery) + + * glib/gdebug.h: + * glib/gmessages.h: + * glib/gunicodeprivate.h: + * glib/gthreadprivate.h: Move G_GNUC_INTERNAL before function + declarations to fix compilation with sun studio. (#438873, + Damien Carbery) + +2007-05-14 Matthias Clasen + + * glib/gslice.h: + * glib/gslice.c: + * glib/glib.symbols: Make g_slice_debug_tree_statistics() + debug-only functionality again. + +2007-05-14 Christian Persch + + * docs/reference/glib/tmpl/string_utils.sgml: Improve g_strerror and + g_strsignal docs. Bug #438293. + +2007-05-13 Tor Lillqvist + + * glib/gwin32.h: Drop the pipe() macro. Defining macros outside of + its namespace that look like POSIX functions is not GLib's + business in my opinion. This means pipe()-using code that has + relied on this definition will need changing to call _pipe() on + Windows, and make the decision itself on what size pipe buffer to + use, and whether to use text or binary mode, and whether the pipe + handles should be inheritable or not. + + * glib/gspawn-win32.c (make_pipe): Use _pipe() instead of pipe(). + +2007-05-11 Matthias Clasen + + * glib/goption.c: Allow G_OPTION_ARG_CALLBACK for + G_OPTION_REMAINING. (#437297, Dave Benson) + + * tests/option-test.c: Add a test for this. + +2007-05-04 Dan Winship + + * glib/gkeyfile.c (g_key_file_get_boolean) + (g_key_file_get_boolean_list, g_key_file_get_integer) + (g_key_file_get_integer_list, g_key_file_get_double) + (g_key_file_get_double_list): Document the error return values + rather than calling them undefined. #435885. + +2007-05-03 Behdad Esfahbod + + * glib/glib.symbols: + * glib/gunicode.h: + * glib/guniprop.c (g_unichar_ismark): + Add g_unichar_ismark(). Patch from Yevgen Muntyan. Fixes #339991. + +2007-05-03 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.1 === + +2007-05-02 Matthias Clasen + + * tests/threadpool-test.c: Stop unused threads before + the last test, to make the test terminate reliably. + + * NEWS: Updates + +2007-05-02 Marco Barisione + + * glib/gregex.c: Made more clear that the string passed to the match + functions cannot be freed before using g_match_info_fetch() and + similar functions, and fixed a typo. + +2007-04-30 Matthias Clasen + + * glib/glib.symbols: + * glib/gregex.[hc]: Add g_regex_get_max_backref() and + g_regex_get_capture_count(). (#419371, Marco Barisione) + +2007-04-30 Matthias Clasen + + * glib/glib.symbols: + * glib/gregex.[hc]: Split GRegex into GRegex and GMatchInfo. + (#419368, Marco Barisione) + + * tests/regex-test.c: Adapt. + +2007-04-30 Chris Wilson + + * glib/gbookmarkfile.c (g_bookmark_file_get_app_info): + Include the gshell.h header file (to define g_shell_[un]quote) + and correct the order of the arguments to g_propagate_error(), as + spotted by gcc. + +2007-04-29 Emmanuele Bassi + + * glib/gbookmarkfile.c: + (g_bookmark_file_set_app_info): Quote the passed command line... + + (g_bookmark_file_get_app_info): ... and unquote it when giving it + back. (#432274) + +2007-04-27 Matthias Clasen + + * glib/gstrfuncs.c: small coding style cleanups. + +2007-04-27 Chris Wilson + + * glib/gregex.h: Remove trailing comma at end of enumerator list. + +2007-04-27 Tor Lillqvist + + * glib/gstdio.c (g_mkdir): Document that the mode argument is + ignored on Windows + (g_stat): Document that st_mode is mostly useless on Windows. + +2007-04-25 Paolo Borelli + + * glib/gstrfuncs.c (g_strsplit): small cleanup. (#433387) + +2007-04-24 Matthias Clasen + + * glib/glib.symbols: + * glib/goption.h: + * glib/goption.c (g_option_context_get_help): New function to + get the formatted help string. (#336089, Dom Lachowicz) + +2007-04-24 Michael Natterer + + * tests/gobject/paramspec-test.c: test all GParamSpecString + validations with static and allocated strings. + +2007-04-19 William Jon McCann + + * glib/gkeyfile.[ch]: (find_file_in_data_dirs), + (g_key_file_load_from_dirs), (g_key_file_load_from_data_dirs): + Add g_key_file_load_from_dirs for looking through a search + path for a key-file. (#355334) + +2007-04-15 Tor Lillqvist + + * build: Include the build module using the svn:externals + mechanism. + + * Makefile.am + * configure: Add the references to build back. + +2007-04-11 Matthias Clasen + + * glib/gspawn.c (g_spawn_async): Fix a doc typo. (#427285, + Jochen Baier) + +2007-04-11 Emmanuele Bassi + + * glib/ghash.[ch]: Add g_hash_table_get_keys() and + g_hash_table_get_values(), API to retrieve the keys + and values inside an hash table in list form. (#413133) + + * glib/glib.symbols: Update symbols. + + * tests/hash-test.c: Exercise newly added functions. + +2007-04-11 Matthias Clasen + + * configure.in: Use CFLAGS/LDFLAGS in addition to + PCRE_CFLAGS/PCRE_LIBS when checking system PCRE. (#421607, + Paul Jarc) + +2007-03-27 Emmanuele Bassi + + * glib/gdate.h: Remove old comment and forward declaration of + struct tm: gdate.h includes time.h now. + +2007-03-23 Matthias Clasen + + * tests/gobject/Makefile.am: Handle $RANDOM missing. (#356843, + Paul Jarc) + +2007-03-22 Matthias Clasen + + * glib/guniprop.c: Fix corner-cases of upper/lowercase conversion. + (#418217, Denis Jacquerye) + +2007-03-22 Chris Wilson + + * glib/gkeyfile.c: Track whether the last key=value pair in a group + is a blank line and during to_data() only insert a new blank line + betweens group in its absence. This allows the beautification of the + GKeyFile and prevents newlines being inserted indefinitely. (#420686) + + * tests/keyfile-test.c (test_reload_idempotency): Test that after a + single beautification pass, g_key_file_to_data() does not alter its + input data. + +2007-03-21 Matthias Clasen + + * glib/pcre/Makefile.am: Make builddir != srcdir work. (#419900) + +2007-03-19 Paolo Borelli + + * glib/gutf8.c (fast_validate_len): remove unneeded checks. + +2007-03-18 Matthias Clasen + + * glib/gregex.c: Cosmetic fixes + +2007-03-17 Marco Barisione + + * glib/update-pcre/table-reduction.patch: + * glib/update-pcre/make_utt.py: + * glib/update-pcre/utt.patch: Add forgotten files + + * glib/update-pcre/update.sh: Call python directly instead of relying + on shebang. Also copy the changes from glib/pcre/makefile.msc to this + file + +2007-03-17 Hans Breuer + + * glib/makefile.msc.in glib/pcre/makefile.msc + glib/update-pcre/update.sh : define PCRE_STATIC to reflect the + inclusion of pcre as LIB, not stand-alone DLL. Also set NEWLINE=-1 + to match any newline by default, use of ../../build/win32/make.msc + + * glib/gregex.h : minimal includes of instead of + + * glib/gnulib/makefile.msc : make use of ../../build/win32/make.msc + + * tests/regex-test.c(verbose): don't pass a string containing '%' + as first parameter to g_print () + (test_match) : for the unexpected case output pattern and string + escaped + + * tests/child-test.c tests/slice-color.c : fix c99ism + * tests/slice-test.c : fix c99ism and gccism + * tests/mapping-test.c tests/base-64-tests.c : don't + #include unconditionally + * tests/option-test.c : use G_GINT64_CONSTANT() instead of direct LL + + * tests/makefile.msc.in : more tests build + +2007-03-17 Matthias Clasen + + * glib/gsequence.[hc]: + * glib/glib.symbols: + * tests/sequence-test.c: Move the consistency + checks to the test. + +2007-03-16 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.13.0 === + + * NEWS: Updates + +2007-03-16 Matthias Clasen + + * glib/glib.symbols: + * glib/gsequence.h: Add the test function to the header, + since it is exported. + + * glib/gbase64.c (g_base64_decode): Warn if the input + is too short. (#418862, Halton Huo) + +Fri Mar 16 11:24:51 2007 Tim Janik + + * glib/gscanner.[hc]: reverted premature commit which broke + GScanner ABI and API, #415323. + +2007-03-16 Chris Wilson + + * glib/gkeyfile.c: Convert to GSlice and check for redundant + clears. (#418637) + +2007-03-15 Matthias Clasen + + * glib/gscanner.[hc]: Revert recent changes that break + existing users of GScanner. + +2007-03-15 Matthias Clasen + + * glib/gscanner.c (g_scanner_get_token_ll): Fix a typo + in the last commit. (#415323, Richard Hult) + +2007-03-15 Tor Lillqvist + + * glib/gnulib/Makefile.am (INCLUDES): Add -I$(top_srcdir)/glib so + that gregex.h finds . + + * glib/update-pcre/Makefille.am-1: Add -DGLIB_COMPILATION so that + we don't think g_ascii_table is dllimport. + + * glib/pcre/Makefile.am: Corresponding change. + + * glib/update-pcre/notdll.patch: New file. Drop + dllimport/dllexport magic for the pcre symbols. + + * glib/update-pcre/Makefile.am: Dist it. + + * glib/update-pcre/update.sh: Apply notdll.patch. + + * glib/pcre/pcre.h: Corresponding change. + +2007-03-15 Tor Lillqvist + + * glib/gtypes.h: Add comment to avoid misleading people with the + large number of digits in G_PI etc. (#404338) + +2007-03-15 Tor Lillqvist + + * config.h.win32.in: Update to match what configure produces. + +2007-03-15 Marco Barisione + + Add GRegex for regular expression matching. (#50075) + + * configure.in: Handle GRegex compilation. + + * glib/gregex.c: + * glib/gregex.h: Code for GRegex. + + * glib/Makefile.am: + * glib/makefile.msc.in: Updated makefiles. + + * glib/pcre/*: Internal copy of PCRE. + + * glib/update-pcre/*: Stuff to automatically update the internal PCRE + to a newer version. + + * tests/regex-test.c: + * tests/Makefile.am: + * tests/makefile.msc.in: Add tests for GRegex. + +2007-03-15 Chris Wilson + + * glib/gmain.c (g_main_dispatch): Replace a + g_slist_prepend/g_slist_remove pair with an on-stack link + and open coding. (#416094) + +2007-03-15 Matthias Clasen + + Fix two glitches in the Unicode case conversion + functions (#418217, Denis Jacquerye) + + * glib/guniprop.c (g_unichar_toupper): Handle zero entries + in special_case_table correctly. + (g_unichar_totitle): Fall back to g_unichar_toupper. + +2007-03-15 Matthias Clasen + + * glib/gscanner.[hc]: Some optimizations, use a lookup + table for character classes, pre-allocate GStrings with + reasonable sizes. (#415323, Charlie Brej) + +2007-03-14 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_get_double): Fix a + small typo. (#417847, Bobby Jack) + +2007-03-08 Matthias Clasen + + * glib/gstrfuncs.c (g_strtoll): Return negative values. + (#416062) + + * tests/strtoll-test.c: Add more testcases. + +2007-03-06 Matthias Clasen + + * glib/gstring.c (g_str_equal): Clarify docs. (#364026, + Bastian Nocera) + +2007-03-06 Matthew Barnes + + * glib/gqueue.h: + * glib/gqueue.c: Add G_QUEUE_INIT, g_queue_init(), and + g_queue_clear() to better support statically allocated + queues. (#413244) + +2007-03-06 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_parse_value_as_boolean): + Remove a NULL check that didn't do any good. (#360904, + Paolo Borelli) + +2007-03-06 Matthias Clasen + + * glib/gmarkup.c (g_markup_parse_context_parse): Report + more accurate position for invalid UTF-8. (#350802, + Simon Budig) + +2007-03-06 Matthias Clasen + + * glib/gbase64.c: Add NULL checks to the base64 + functions that take pointers. (#399611, Martyn Russell) + +2007-03-06 Matthias Clasen + + Work with Solaris gettext (#341988, Laszlo Peter) + + * m4macros/glib-gettext.m4: Make GLIB_WITH_NLS define + MSGFMT_OPTS if msgfmt supports -c. + + * po/Makefile.in.in: Use MSGFMT_OPTS when calling + msgfmt. + +2007-03-06 Matthias Clasen + + * tests/Makefile.am: Apply a patch by Loïc Minier + to fix building with -Wl,-z,defs. (#149144) + +2007-03-03 Thierry Randrianiriana + + * po/mg.po: Added Malagasy translation. + * configure.in: Added Malagasy 'mg' to ALL_LINGUAS + +2007-03-01 Ihar Hrachyshka + * configure.in: Added be@latin to ALL_LINGUAS. + +2007-02-17 Tor Lillqvist + + * glib/gdate.c (win32_strftime_helper): New Win32-only + function. Use the wide character Win32 API to do the work of + strftime(): GetThreadLocale(), GetLocaleInfoW(), GetDateFormatW() + and GetTimeFormatW(). + (g_date_strftime): On Windows use win32_strftime_helper() + instead of strftime() to avoid codepage issues with strftime(). + Unfortunately using wcsftime() would not help either. (#404832) + +2007-02-16 Soren Sandmann + + * tests/sequence-test.c: For move, test moving between two + sequences. Add test for swap. + + * glib/gsequence.c: Replace splay tree with a treap. + (check_node): Add checks for the treap invariants. + +2007-02-10 Hans Breuer + + * glib/makefile.msc.in : added gsequence.obj + +Fri Feb 9 17:46:18 2007 Søren Sandmann + + * glib/gsequence.c (g_sequence_get_end_iter): Remove assertion. + * glib/gsequence.c (is_end): Return TRUE if the iter doesn't have + a parent. + * glib/gsequence.c: Fix grammar of comment. + * glib/gsequence.c (node_update_fields): Use a temporary variable + for the n_nodes. + +2007-02-07 Soren Sandmann + + * tests/sequence-test.c (compare_items): Force an arbitrary order + on otherwise identical items. + + * glib/gsequence.c: Add comment discussing splay trees vs. other trees. + * glib/gsequence.c (is_end): Add fast path for the common case + when the node is not actually the end node. + +2007-02-05 Soren Sandmann + + * glib/gsequence.c (g_sequence_sort_iter): Don't prohibit access + until after the g_sequence_move_range() call. Bug 404759, + Christian Persch. + + * tests/sequence-test.c: Formatting fix. + +2007-02-03 Soren Sandmann + + * glib/gsequence.c (struct _GSequence): Add a new 'real_sequence' + field. + (g_sequence_new): Initialize real_sequence to the sequence + (g_sequence_sort_iter): Set real_sequence of the temporary + sequence to the real sequence. + (g_sequence_sort_changed_iter): Same + (g_sequence_insert_sorted_iter): Same + (g_sequence_search_iter): Same + (g_sequence_iter_get_sequence): Return real_sequence + + * tests/sequence-test.c (compare_iters): Insert assertions that + the iters point to the sequence being manipulated. + +2007-02-03 Soren Sandmann + + * glib/gsequence.[ch]: New files implementing GSequence, a list + implemented using a binary tree. + * glib/glib.h, glib/glib.symbols: Update for GSequence. + * docs/reference: Add documentation for GSequence + * tests: Add sequence-test.c, a thorough test of all of + the GSequence API. + +2007-01-30 Matthias Clasen + + * glib/glib.symbols: + * glib/gslice.h: + * glib/gslice.c: Don't make ABI depend on G_ENABLE_DEBUG, + just add an empty g_slice_debug_tree_statistics () implementation + in the !G_ENABLE_DEBUG case. + +2007-01-26 Matthias Clasen + + * configure.in: Define G_GNUC_INTERNAL for Sun Studio + as __hidden. (#342981, Brian Cameron) + + * glib/gconvert.c: + * glib/gutf8.c: Move G_GNUC_INTERNAL uses to the right + spot. + +2007-01-26 Matthias Clasen + + * gmem.c: + * gslice.c: + * gmessages.c: + * gutils.c: Make some structs which are used only once + non-static. + +2007-01-24 Benjamin Otte + + * glib/gprintf.c (g_sprintf): Clarify the documentation + regarding overflows (wording by Jan Schmidt) + +2007-01-23 Roozbeh Pournader + + * README: Remove mention of no-longer-existing PATCH + keyword in bugzilla. (#396899) + +2007-01-23 Matthias Clasen + + * glib/gutf8.c (g_utf8_get_char_validated): Clarify + the behaviour is max_len is zero. (#400044, + Benjamin Dauvergne) + +2007-01-23 Matthias Clasen + + * glib/goption.c (print_help): Use bitwise & + when operating on flags. (#399971, Jon Oberheide) + +2007-01-19 Matthias Clasen + + Some file list updates (#398069, Owen Taylor) + + * docs/Changes-2.0.txt + * docs/reference/README.cvs-commits + * glib.spec.in: Remove obsolete files + + * tests/Makefile.am: + * glib/libcharset/Makefile.am: + * gobject/Makefile.am: + * Makefile.am: Add some missing files to EXTRA_DIST + + * tests/timeloop-basic.c: Make it build + * HACKING: Small updates + +2007-01-18 Matthias Clasen + + * glib/gdate.c (g_date_set_time): Fix a typo. (#398203, + Owen Taylor) + +2007-01-17 Tor Lillqvist + + * config.h.win32.in + * glib/galloca.h + * glib/gbacktrace.h + * glib/gwin32.c + * glibconfig.h.win32.in + * README.win32: More minor tweaks for Digital Mars + compiler. (#346808, Serhat Sevki Dincer) + +2007-01-17 Tor Lillqvist + + * glib-zip.in: DLLs are always installed in "bin" with current + libtool, drop unnecessary logic to check where they are. Include + also the COPYING file. + +2007-01-17 Tor Lillqvist + + * glib/galloca.h: Use also with Digital Mars compiler + on Win32. (#346808, Serhat Sevki Dincer) + +2007-01-16 Matthias Clasen + + * glib/gthread.h: + * glib/gthread.c: + * glib/glib.symbols: Revert an accidental ABI break by + moving gettime out of the GThreadFunctions struct and making + it a separate variable. (#397139, Joe Marcus Clarke) + + * gthread/*.c: Adapt. + +2007-01-16 Tor Lillqvist + + * glib/gthread.c (gettime): GetSystemTimeAsFileTime() returns 100s + of nanoseconds since 1601, so offset to Unix epoch (1970) and + multiply by 100 to get nanoseconds which is what we want. + +2007-01-15 Tor Lillqvist + + * glib/gmain.h (struct _GPollFD): Fix mistake in my last commit. + +2005-01-15 Matthias Clasen + + * glib/giochannel.c: + * glib/gbookmarkfile.c: Remove redundant NULL-checks. + (#369668, Morten Welinder) + +2005-01-15 Matthias Clasen + + * glib/gthread.c: + * gthread/gthread-posix.c: Correct the gettime calculations + once more. (#395203, Chris Wilson) + +2007-01-15 Tor Lillqvist + + * glib/gmain.h (struct _GPollFD): Prepare for potential Win64 + build: Use gint64 for the fd field on Win64, as we want to be able + to store a HANDLE in it. (#395422) (Other changes will surely also + be necessary when building on Win64, at least in giowin32.c.) + +2007-01-15 Tor Lillqvist + + * glib/gwin32.c (g_win32_getlocale): Simplify greatly. Instead of + hardcoding a large switch statement, just ask Windows for the + ISO639 and ISO3166 codes. Tack on @Latn or @Cyrl for those + languages which can alternatively be written in Latin or + Cyrillic. Fixes #395419. + +2007-01-12 Matthias Clasen + + * glib/gkeyfile.c: Rework the handling of invalid + keys/groups again. We are back to being liberal about + what we accept, and only reject things that would lead + to non-rereadable keyfiles. + + * tests/keyfile-test.c: Adapt tests. + +2007-01-12 Matthias Clasen + + * glib/gutils.c (g_get_home_dir): Clarify docs. (#394687, + Marc Brockschmidt) + +2007-01-12 Matthias Clasen + + * glib/gthread.c: Include windows.h and fix + include order. (#394258, Kazuki Iwamoto) + +2007-01-12 Matthias Clasen + + * configure.in: Make G_GNUC_INTERNAL a no-op for + gcc 2.95. (#329031, David Schleef, Marc Brockschmidt) + +2007-01-12 Matthias Clasen + + * gthread/gthread-posix.c: + * glib/gtimer.c: + * glib/gthread.c: Fix errors in the recently moved + time calculations. (#395203, Chris Wilson) + +2007-01-10 Matthias Clasen + + * configure.in: Actually link gthread against librt. + (#394641, Marco Pesenti Gritti) + +2007-01-10 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_is_key_name): Grr, allow '*' in keys, + too. (#394262) + +2007-01-09 Behdad Esfahbod + + * glib/gutils.h: Use a more optimized g_bit_storage() when gcc is + available. (#371670, Daniel Elstner) + +2007-01-08 Matthias Clasen + + * gthread/gthread-posix.c (g_thread_impl_init): Don't + use _SC_MONOTONIC_CLOCK unless USE_CLOCK_GETTIME is + defined. (#394150) + +2007-01-07 Matthias Clasen + + Don't link glib against libpthread. (#393812) + + * configure.in: Link gthread against librt, not glib itself. + + * glib/gthread.h: + * glib/gthread.c: Add a new thread function, gettime. + + * glib/gtimer.c: Use gettime instead of directly working with + the various system interfaces. + + * gthread/gthread-impl.c: + * gthread/gthread-posix.c: + * gthread/gthread-win32.c: Implement gettime. + +2007-01-07 Matthias Clasen + + * m4macros/glib-2.0.m4: Use PKG_PROG_PKG_CONFIG. (#392636, + Yevgen Muntyan) + +2007-01-07 Tor Lillqvist + + * glib/giowin32.c: Handle GIOChannels for file descriptors + connected to the console separately. This would typically be the + fd 0, 1, or 2 (if not redirected) in a console application. For + such fds we don't need a separate thread, as console HANDLEs are + waitable objects. (#359202, Michiel de Hoon) + +2007-01-04 Behdad Esfahbod + + * tests/bit-test.c (builtin_bit_nth_lsf1), (builtin_bit_nth_lsf2), + (builtin_bit_nth_msf): Fix tests on x86_64. + +2007-01-03 Behdad Esfahbod + + * glib/goption.c (_g_unichar_get_width), (_g_utf8_strwidth), + (calculate_max_length), (print_entry), (print_help): Take zerowidth + and double-width chars into consideration when computing width of a + string. Also fix another bug in width computation. (#346955) + + * glib/guniprop.c (g_unichar_iszerowidth): Fix typo. It was not + working correctly. + +2007-01-03 Behdad Esfahbod + + * glib/glib.symbols: + * glib/gunicode.h: + * glib/guniprop.c: Add g_unichar_iszerowidth(). (#347645) + +2007-01-03 Behdad Esfahbod + + * glib/gutils.h: Fix bug in g_bit_nth_lsf (#371631) and use + __builtin_clzl for g_bit_storage if available (#371670). + + * tests/Makefile.am: + * tests/bit-test.c: New test, to test g_bit_* operations against + naive and builtin implementations. + +2007-01-02 Behdad Esfahbod + + * configure.in: Avoid more warnings from running libtool --config. + (#391364) + +2007-01-03 Michael Natterer + + * removed all .cvsignore files. SVN doesn't need them. + +2007-01-02 Emmanuele Bassi + + * glib/gbookmarkfile.c (expand_exec_line): Add support for + expanding the desktop entry spec variables %U (list of URIs) + and %F (list of filenames), so that using the command line + from the Exec and TryExec key of a desktop entry file works + as intended. + +2007-01-02 Matthias Clasen + + * configure.in: Avoid warnings from running libtool --config. + (#391364, Loïc Minier) + +2007-01-02 Matthias Clasen + + * glib/gbookmarkfile.c (g_bookmark_file_get_app_info): + Return an error if the uri is bad. (#391370, Maciej Piechotka) + +2007-01-02 Matthias Clasen + + * glib/glib.symbols: Guard g_slice_debug_tree_statistics + by G_ENABLE_DEBUG. (#390940, Kazuki Iwamoto) + +2007-01-02 Michael Natterer + + * configure.in + * Makefile.am: remove references to build/ until a proper decision + has been made what to do with it. + +2007-01-01 Matthias Clasen + + * glib-gettextize.in: Silence autoconf warnings about + datarootdir. (#391367, Loïc Minier) + +2006-12-31 Matthias Clasen + + * glib/gslice.c: Fix some C99isms. (#390913, Kazuki Iwamoto) + +Fri Dec 29 13:28:07 2006 Tim Janik + + * glib/gslice.c: turned detection of too late g_thread_init() calls + into a warning. this is a temporary work-around for some head-room + to fix affected programs, memory corruption still occours regardless. + +2006-12-29 Matthias Clasen + + * tests/gobject/Makefile.am: + * tests/gobject/dynamictype.c: New test for dynamic type + registration macros. + +Thu Dec 28 21:14:45 2006 Tim Janik + + * glib/gslice.c: removed pthread-dependant debugging bits, the code + was already converted to GMutex. this obsoletes Tor's recent fixups. + +2006-12-28 Tor Lillqvist + + * glib/gutils.h (G_WIN32_DLLMAIN_FOR_DLL_NAME) + * glib/gutils.c (get_windows_directory_root): : Use only the wide + character API here, too. + + * glib/gslice.c: Make it compile on Win32 without pthreads: Use a + Win32 critical section instead. + + * glib/gmessages.c (g_logv): On Win32, if we get a fatal error + message while being debugged we break into the debugger with + G_BREAKPOINT(). Don't call abort() if the user is foolhardy enough + to continue after the breakpoint. The user presumably knows what + he is doing and deserves what he gets. (#376645, Andreas Köhler) + +Thu Dec 28 12:50:31 2006 Tim Janik + + * glib/gslice.h, glib/gslice.c: implemented static debugging + hash-tree to validate slice adresses and sizes with G_SLICE=debug-blocks. + use abort() to exit in mem_error() to allow catching of these in gdb. + abort programs with a descriptive error message if g_thread_init() is + called after GSlice was in use. previously this just silently corrupted + the magazines. + + * glib/ghash.c (struct _GHashNode): reordered fields to keep 8-byte + pointer alignment on 64bit systems and request smaller slice sizes + on 32bit systems. + + * tests/slice-test.c: support '~' option flag to introduce slice + allocation/release corruption with a significant probability. this + allowes testing of G_SLICE=debug-blocks. + +2006-12-27 Matthias Clasen + + * glib/gconvert.[hc]: + * glib/gfileutils.c: + * glib/giochannel.c: + * glib/goption.c: + * glib/gspawn.c: + * glib/gunicollate.c: + * glib/gutils.c: + * tests/timeloop-basic.c: + Consistently use gsize rather than size_t. (#333310, + Morten Welinder) + +2006-12-27 Matthias Clasen + + * configure.in: Use AC_CACHE_CHECK for the nl_langinfo + check. (#304517, Lőrinczy Zsigmond) + +2006-12-27 Tor Lillqvist + + * glib/gwin32.h + * glib/gwin32.c (get_package_directory_from_module) + (g_win32_get_package_installation_directory) + (g_win32_get_package_installation_subdirectory): Add const to + gchar* arguments. (#384523, Yevgen Muntyan) + +2006-12-27 Ryan Lortie + + * glib/ghash.c: cache the value of the hash function + in the GHashNode. this speeds up resizing the hash + table and it also allows a slight optimisation on + lookups. (#388332) + +2006-12-27 Matthias Clasen + + * glib/gunicollate.c (g_utf8_collate_key): Don't modify + the current locale. (#389300) + +2006-12-26 Matthias Clasen + + * glib/gutf8.c: Add hints for locale-dependent interfaces. + * glib/gconvert.c: Add hints for locale-dependent interfaces. + + * glib/gconvert.c (g_get_filename_charsets): Improve + formatting of docs. + +2006-12-26 Behdad Esfahbod + + * configure.in: Use libtool to determine shared library suffix. + (#357245) + +2006-12-24 Matthias Clasen + + * tests/run-collate-tests.sh: + * tests/unicode-collate.c: Silently skip tests if + we can't set LC_COLLATE to en_US. (#336438) + +2006-12-19 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_is_key_name): Accept + '/', '+' and '.' in key names, since gnome-vfs uses + mime types as keys in some cache. + + * tests/keyfile-test.c: Tests for the above. + +2006-12-18 Matthias Clasen + + * configure.in: Fix the broken poll test. (#387260, + Christian Persch) + + * glib/gmain.c (child_watch_helper_thread): Readd a + return which was removed as dead code a while ago. + icc may consider it dead, but gcc doesn't like non-void + functions without a return... (#354707) + + * tests/Makefile.am: Try a different fix for bug 346373. + +2006-12-18 Matthias Clasen + + Fix bug 161288: + + * configure.in: Check for wcslen. + + * glib/gnulib/vasnprintf.c: Handle wcslen missing. + +2006-12-18 Matthias Clasen + + * glib/gkeyfile.c: Accept '@' in locale names. + + * glib/gkeyfile.c: Tighten up the check for allowed + key and group names. (#343191, Tommi Komulainen) + + * tests/keyfile-test.c: Test handling of key and group names. + + * tests/Makefile.am: Don't use $RANDOM if the shell doesn't + have it. (#346373, Thomas Klausner) + +2006-12-17 Behdad Esfahbod + + * glib/gstring.c: Improve docs about string functions taking a + length. (#378727) + +2006-12-17 Matthias Clasen + + * glib/gconvert.c: + * glib/gutf8.c (_g_charset_get_aliases): Put the G_GNUC_INTERNAL + where gcc doesn't complain about it. + + * glib/ghash.c: Make ref_count an int to avoid compiler + warnings. + + * configure.in: Use AC_LANG_SOURCE for the clock test. + + * glib/gthreadpool.h: + * glib/gthreadpool.c (g_thread_pool_free): Don't use "wait" + as parameter name. (#379207, Christian Biere) + + * glib/gspawn.c: Refer to g_child_watch_add() in addition + to waitpid(). + + * glib/gstrfuncs.c (g_strndup, g_strnfill): Move docs + inline, and improve wording. (#372598, Behdad Esfahbod) + + * glib/gspawn.c: Add some pointers to the gdk_spawn_ + variants. (#338134, Federico Mena Quintero) + + * configure.in: Make montonic clock test work again. Does + AC_COMPILE_IFELSE not get confdefs ? Also, move the clock + tests below the thread checks to fix #364663. + + * tests/run-markup-tests.sh: Don't use diff -u (#380801, + Marek Rouchal) + + * glib/gspawn.c: Fix the recent fdwalk()-related changes + to not break mapping-test. (#286838, Marco Barisione) + + * glib/gstring.c (g_string_chunk_new): Don't shadow size. + (#386760, Kazuki IWAMOTO) + +2006-12-16 Matthias Clasen + + * glib/gstring.c: Move more documentation inline. + + * configure.in: Use AC_COMPILE_IFELSE for the monotonic + clock test. (#362918, Han-Wen Nienhuys, Jeremy Lainé) + + * glib/gstring.c: Move documentation inline. + +2006-12-15 Matthias Clasen + + * glib/giochannel.h: Make ref_count a gint to avoid + compiler warnings. (#321977, Andrew Paprocki) + + * configure.in: On Solaris, set CFLAGS and LDFLAGS that + work both with Sun cc and gcc. (#315061, Lazlo Peter) + + * glib/gspawn.c: Undefine READ_OK to fix the build on + old versions of Darwin. (#327800) + + * glib/glib.symbols: + * glib/gstring.[hc] (g_string_chunk_clear): Add a function + for clearing a GStringChunk. (#364608, Matt Barnes) + + * glib/guniprop.c (interval_compare): Avoid a compiler + warning. + + * glib/gspawn.c (do_exec): Call set_cloexec() with + the right parameters. (#386252, Guillaume Desmottes) + +2006-12-15 Matthias Clasen + + Fix #357585, Padraig O'Briain. + + * configure.in: Check for fdwalk. + + * glib/gspawn.c (do_exec): Use fdwalk() to close all + file descriptors. + + * glib/gspawn.c (fdwalk): Fallback implementation of + fdwalk. + +2006-12-14 Matthias Clasen + + * glib/gconvert.c (open_converter): Don't use alloca + and avoid allocating memory for small keys that are + already cached. (#172406, Morten Welinder) + + * glib/gmain.c (g_child_watch_add_full): Improve the docs. + (#345569, Tim-Philipp Müller) + + * glib/gkeyfile.c (g_key_file_add_group): If the group + is already there, make it current. (#385910, Joe Halliwell) + + * tests/keyfile-test.c: Add a test for duplicate groups/keys. + +2006-12-13 Matthias Clasen + + * m4macros/glib-gettext.m4: Require AC_CANONICAL_HOST in + GLIB_WITH_NLS. (#385132, Laszlo Peter) + +2006-12-12 Matthias Clasen + + * configure.in: Add a check for broken poll on Mac OS X. + + * glib/gmain.c: Use poll emulation on OS X. (#302672, Toby Peterson, + patch by Dave Vasilevsky) + +2006-12-11 Matthias Clasen + + * glib/gatomic.c: Don't use local numeric labels in + inline assembler on AIX. (#316434, Hans Rosenfeld) + + * glib/gunicode.h (g_utf8_next_char): Cast to const char *, + not char *. (#138153, Nikolai Weibull) + +Wed Nov 22 16:09:13 2006 Tim Janik + + * glib/gmacros.h: added G_GNUC_MAY_ALIAS, suggested by Mathias + Hasselmann in bug #335341, fixes bug #335853. + +2006-11-15 Matthias Clasen + + * m4macros/glib-gettext.m4: Apply a patch from James + Henstridge for compatibility with automake 2.60 (#343825) + +2006-11-14 Behdad Esfahbod + + * sanity_check: Replace bash-specific == with sh-understood =. + Fixes bug #373864. + +2006-11-05 Hans Breuer + + * glib/makefile.msc.in : glib/ version not the gobject/ + one I accidentially commited. Fixes bug #371074. + +2006-11-05 Tor Lillqvist + + * makefile.mingw + * gmodule/makefile.mingw.in + * glib/makefile.mingw.in + * gobject/makefile.mingw.in + * gthread/makefile.mingw.in + * tests/makefile.mingw.in: Remove from CVS. Haven't been + maintained or distributed for long. + +2006-10-26 Pascal Terjan + + * glib/libcharset/localcharset.c: Fix small leak on failed + realloc in _g_locale_get_charset_aliases (#338582) + +2006-10-16 Behdad Esfahbod + + * glib/gnulib/Makefile.am: Add $(GLIB_DEBUG_FLAGS). (#362543, + Peter Kjellerstedt) + +2006-10-15 Sebastian Wilhelmi + + * tests/Makefile.am: Compile errorcheck-mutex-test with thread + libraries explicitly. (#74748, Javier Villavicencio) + +2006-10-08 Matthias Clasen + + Add a way to obtain Unicode script information. (#348348, + Marco Barisione) + + * glib/glib.symbols: + * glib/gunicode.h: Add GUnicodeScript enumeration and + g_unichar_get_script. + + * glib/guniprop.c: Implement g_unichar_get_script. + + * glib/gscripttable.h: Generated private header containing + script tables. + + * glib/gen-script-table.pl: Script to generate gscripttable.h. + + * glib/Makefile.am: Update + +2006-10-08 Matthias Clasen + + * tests/run-markup-tests.sh: Small portability fix. (#347944, + Dan McMahill) + +2006-10-07 Tor Lillqvist + + * glib/gwin32.c (get_package_directory_from_module) + (g_win32_get_package_installation_directory): g_strdup the keys + that we are passed before adding them to the hash tables, to guard + against the caller freeing them. (#355955, Andreas Köhler) + +2006-10-06 Matthias Clasen + + * glib/gtimer.c: Fix a typo. (#359190) + +2006-10-02 Behdad Esfahbod + + * glib/Makefile.am: + * gobject/Makefile.am: + Include pltcheck.sh in EXTRA_DIST, and remove redefinition of TESTS. + (#358966) + +2006-10-01 Matthias Clasen + + * glib/gtimer.c (g_usleep): Use nsleep to implement + g_usleep on AIX. (#321974, Andrew Paprocki) + + * configure.in: Check for nsleep + + * glib/gmain.c: Fix typos in doc comments. + (#358421, Tom Tromey) + +2006-09-30 Matthias Clasen + + * glib/pltcheck.sh: A script to check PLT entries. + * glib/Makefile.am (TESTS): Run pltcheck.sh + + * glib/*: Fix includes to correct some issues with + PLT entries. (#354522, Behdad Esfahbod) + +2006-09-17 Hans Breuer + + * glib/makefile.msc.in gobject/makefile.msc.in : better filtering + of G_GNUC_* stuff when generating .def files. Now also works with + newer (less tolerant) linkers, e.g. from vc2500e + +2006-09-10 Matthias Clasen + + * glib/gbacktrace.c: Assume string.h is available. + (#354523, Behdad Esfahbod) + + * configure.in: Bump version to 2.13.0 + + * glib/glib.symbols: + * glib/gmain.[hc]: Add functions to create approximate + timeouts. (#353942, Arjan van de Ven) + + * glib/gstdio.c (g_rename): Initialize save_errno. + (#355206, Mike Edenfield) + +2006-09-03 Matthias Clasen + + * glib/gerror.c: Allocate GErrors using the slice allocator. + (#354054, Matt Barnes) + +2006-09-02 Matthias Clasen + + * glib/gtimer.c: Forgotten HAVE_CLOCK_GETTIME. + +2006-09-02 Tor Lillqvist + + * glib/gutils.c (g_get_any_init_do): Correct C99ism (mixed + declarations and code) in Win32 ifdef branch. (#353903, Mike + Edenfield) + +2006-09-01 Abel Cheung + + * configure.in: Added 'dz' 'hy' to ALL_LINGUAS. + +2006-09-01 Matthias Clasen + + * configure.in: Check for CLOCK_MONOTONIC. + + * glib/gtimer.c: Only use clock_gettime if we + have a monotonic clock. + +2006-08-31 Matthias Clasen + + * configure.in: Add missing includes to a few test + programs. (#353580, Chris Wilson) + +2006-08-30 Matthias Clasen + + * glib/gmarkup.c (g_markup_vprintf_escaped): Don't call + va_end on caller-provided va_args. (#353584, Chris Wilson) + +2006-08-29 Tor Lillqvist + + Remove support for Windows 9x/ME, as will be done also in Pango + and GTK+. GTK+ hasn't worked on Win9x since 2.6 or 2.8 anyway, so + it's pretty pointless to keep the Win9x code in here either. If + somebody is interested, the code can always be found in older GLib + versions, and in CVS. + + * glib/gdir.c + * glib/gfileutils.c + * glib/gspawn-win32-helper.c + * glib/gspawn-win32.c + * glib/gstdio.c + * glib/gutils.c + * glib/gwin32.c + * glib/gwin32.h: Remove the G_WIN32_IS_NT_BASED() and + G_WIN32_HAVE_WIDECHAR_API() tests and their false (Win9x) + branches, and any variables or static functions used only by the + Win9x branches. + + * glib/gwin32.c (g_win32_windows_version_init): Call g_error() if + run on Win9x. + +2006-08-27 Matthias Clasen + + * configure.in: Fix pthread compiler flag detection. + + * glib/gtimer.c: Use Posix monotonic clocks instead of + gettimeofday when available. (#336114, William Jon McCann) + +2006-08-26 Matthias Clasen + + * glib/gutils.h: + * glib/gscanner.c: Fix some typos. (#351741, Kjartan Maraas) + +2006-08-25 Matthias Clasen + + * configure.in: Fix the pthread compiler flag detection. + + * glib/gunicode.h: + * glib/gutf8.c (_g_utf8_make_valid): Rename make_valid_utf8 + from gconvert.c, move it to gutf8.c, and export it privately. + + * glib/gconvert.c (g_filename_display_name): Adjust callers. + + * glib/gkeyfile.c: Use _g_utf8_make_valid() in a number of + places to ensure error messages are valid UTF-8. (#351853, + Simon Budig) + +2006-08-22 Matthias Clasen + + * Branch for 2.12 diff --git a/ChangeLog.pre-2-16 b/ChangeLog.pre-2-16 new file mode 100644 index 0000000..310bb59 --- /dev/null +++ b/ChangeLog.pre-2-16 @@ -0,0 +1,1794 @@ +2008-03-12 Sebastian Dröge + + Bug 316221 - G_LOCK warns about breaking strict-aliasing rules + + * configure.in: + * glib/gthread.h: Prevent the compiler from warning about breaking + strict-aliasing rules when using gcc 4.3 and G_LOCK on C sources. + +2008-03-12 Tor Lillqvist + + Bug 520914 - win_iconv doesn't support UCS-2 + + * glib/win_iconv.c: Make UCS-2 just an alias for + UTF-16. Technically this is wrong of course, but shouldn't matter + an awful lot in practice. + +2008-03-11 Murray Cumming + + Bug 521591 – g_markup_parse_context_parse() creates GError message that + is invalid UTF8. + + * glib/gmarkup.c (set_error): Make sure that the GError::message is + valid UTF-8 even if it is complaining about invalid UTF-8 in the + markup text, using _g_utf8_make_valid(). + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + + * configure.in: Bump version + + * NEWS: Updates + + * glib/pcre/*: Update the internal copy of PCRE to 7.6, this time + for real. + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + + * NEWS: Updates + + * configure.in: Bump version to 2.16.0 + +2008-03-10 Matthias Clasen + + * glib/gslist.c: Fix a doc typo + +2008-03-10 Matthias Clasen + + * glib/giochannel.c (g_io_channle_set_encoding): Fix confusing + error message. (#521028, Peter Kjellerstedt) + +2008-03-10 Matthias Clasen + + * tests/testglib.c: Still set the udddocs and uddpubshare + variables for the verbose case. + +2008-03-07 Alexander Larsson + + * configure.in: + Look for struct statfs.f_fstypename + +2008-03-07 Tor Lillqvist + + * README.win32: Updates. + +2008-03-05 Tor Lillqvist + + * glib/glib.symbols: Remove g_uri_get_scheme. + +2008-03-04 Alexander Larsson + + * glib/gurifuncs.c: + Remove deprecated symbols we kept for one release. + +2008-03-03 Matthias Clasen + + * glib/gutils.h: Add a version of G_INLINE_FUNC for + __GNUC__ && __GNUC_STDC_INLINE__, patch by Jakub Jelinek + +2008-03-03 Tor Lillqvist + + * glib/gspawn-win32.c (read_helper_report): Must set the GError + also in the unexpected EOF case. + (do_spawn_with_pipes): Must protect also new_argv[0]. + +2008-03-01 Benjamin Otte + + * glib/glist.c: + fix last commit. + +2008-02-29 Matthias Clasen + + * glib/gslist.c: + * glib/glist.c: Move docs inline, and improve the + g_[s]list_delete_link docs. (#519352, Owen Taylor) + +2008-02-29 Tor Lillqvist + + * glib/win_iconv.c (name_to_codepage): Add some GNU libiconv + compatibility: Recognize "" and "char" as aliases for the current + locale's charset. (We use the system ANSI codepage as returned by + GetACP().) Recognize "wchar_t" as an alias for UTF-16LE. + +2008-02-27 Matthew Barnes + + * glib/gchecksum.[ch] (g_checksum_update), + (g_compute_checksum_for_string): Make 'length' parameter + signed to accomodate passing negative lengths. (#510855) + +2008-02-26 Tor Lillqvist + + * glib/gmain.c (g_poll): Further patch by Vlad Grecescu: Drop the + code path that called WaitMessage(), as WaitMessage() doesn't + offer any chance for APCs to run. Instead just use the code path + with MsgWaitForMultipleObjectsEx() even for the + wait-only-for-messages case. (#517484) + +2008-02-25 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.15.6 === + + * NEWS: Updates + +2008-02-25 Matthias Clasen + + * glib/gtestfuncs.c: Add Since: markers to docs. (#518556, + Jerry Yu) + +2008-02-25 Alexander Larsson + + * glib/glib.symbols: + * glib/gurifuncs.[ch]: + Rename g_uri_get_scheme to g_uri_parse_scheme. + Keep g_uri_get_scheme() symbol for this + unstable release to avoid breaking to many apps. + +2008-02-24 Tor Lillqvist + + * glib/gutils.c (_glib_get_installation_directory): New internal function. + + * glib/gspawn-win32.c: When spawning the helper process, use an + explicit full path. (#518292) + + * glib/gspawn-win32.c + * glib/gspawn-win32-helper.c: Fix race condition when using the + helper process. This seems to fix #510664. + + When the helper process writes the handle of the actual started + user process to the parent process, it must be duplicated in the + parent process with DuplicateHandle() so that it is a valid handle + in that process. However, if the helper process has happened to + exit before the DuplicateHandle() call, the duplication will + fail. Thus we must synchronise the helper process's exit. Use + another pipe for this. + + Take care not to inherit the writing end of this pipe to the + helper process. Also, in the helper process, take care not to + inherit either of the pipes used for communication with the parent + process to the started user process. + +2008-02-24 Tor Lillqvist + + * glib/gmain.c (g_poll) [Win32]: Use alertable wait functions so + that I/O completion routines or user-mode Asynchronous Procedure + Calls can be run. (#517484, Vlad Grecescu) + +2008-02-24 Tor Lillqvist + + * glib/gwin32.c + (g_win32_get_package_installation_directory_of_module): New + function. Supersedes g_win32_get_package_installation_directory() + and g_win32_get_package_installation_directory(). + + It makes more sense to have the function for this functionality + take a HMODULE as parameter instead of DLL name. The typical use + scenario has been to have a DllMain() function that retrieves the + full pathname for the DLL in question, and saves just the basename + of that. Then later code passes that saved dll basename to + g_win32_get_package_installation_directory(), which retrieves the + corresponding DLL handle, and then retrieves its full + pathname. (Which DLlMain() already had.) It is less convoluted to + have a DllMain() that just saves the DLL handle, and then when + needed call this function to get the corresponding installation + folder. + + (get_package_directory_from_module): Use + g_win32_get_package_installation_directory_of_module(). + + (g_win32_get_package_installation_directory) + (g_win32_get_package_installation_subdirectory): Mention these + functions will be deprecated and recommend using + g_win32_get_package_installation_directory_of_module() instead. + + * glib/gwin32.h: Declare + g_win32_get_package_installation_directory_of_module(). + + * glib/glib.symbols: Add it. + + * glib/gutils.h: Mention G_WIN32_DLLMAIN_FOR_DLL_NAME() will be + deprecated in the future. + + * glib/gutils.c: Drop use of G_WIN32_DLLMAIN_FOR_DLL_NAME(). Use a + minimal DllMain() instead that just saves the DLL handle. + (g_win32_get_system_data_dirs_for_module, _glib_get_locale_dir) + (get_module_share_dir): Use + g_win32_get_package_installation_directory_of_module(). + +2008-02-23 Matthias Clasen + + * NEWS: Updates + +2008-02-23 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_get_string_list): Return + NULL when the key is not found. (#513171, Дилян Палаузов) + +2008-02-23 Matthias Clasen + + * tests/testglib.c: Don't test user directories for being + non-null. (#517084, Yevgen Muntyan) + +2008-02-22 Matthias Clasen + + * glib/gasyncqueue.c: + * glib/gtestutils.c: Documentation fixes + +2008-02-21 Tor Lillqvist + + * glib/gutf8.c (g_get_charset) + * glib/gconvert.c (g_locale_from_utf8): Clarify character set + issues on Windows. + +2008-02-20 Tor Lillqvist + + * glib/gtestutils.c (g_test_trap_fork) [Win32]: Change the + g_error() to g_message() to avoid stopping on warnings. At least + now testglib runs to completion and the old tests in it get + exercised even if the newfangled ones don't. + (g_test_trap_assertions) [Win32]: Bypass on Windows. + +2008-02-17 Marco Barisione + + * glib/gregex.c: (translate_compile_error), (g_regex_new): Avoid some + useless casts from const gchar * to gchar *. (#516597, patch by + Yevgen Muntyan) + +2008-02-17 Marco Barisione + + * glib/gregex.c: (match_info_new), (g_match_info_next): Don't return + duplicate matches when matching empty strings. (#515944) + * tests/regex-test.c: Add tests. + +2008-02-17 Hans Breuer + + * glib/gutils.c : define CSIDL_MYPICTURES if not available + * gthread/gthread-win32.c : use G_STRFUNC instead of compiler + specific __FUNCTION__ + +2008-02-13 Tor Lillqvist + + * glib/gwin32.c: Doc change: Deprecate passing anything but NULL + for the "package" parameter to + g_win32_get_package_installation_directory() and + g_win32_get_package_installation_subdirectory(). + +2008-02-11 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.15.5 === + + * NEWS: Updates + +2008-02-11 Matthias Clasen + + * glib/gtestutils.h: Make the g_test_add macro work with + gcc 4.3 + + * tests/gobject/paramspec-test.c: Adapt to recent changes in + GParamGType initialization. + +2008-02-10 Matthias Clasen + + * glib/gtestutils.c: Fix a typo in the docs. + +2008-02-09 Matthias Clasen + + * configure.in: Check for getmntent_r. + +2008-02-09 Matthias Clasen + + * Makefile.decl: /bin/ksh can't handle a for-loop with no + arguments, so add a "." for when $(SUBDIRS) is empty. + + * glib/tests/option-context.c: + * glib/tests/testing.c: + * gthread/gthread-posix.c: + * tets/testingbase64.c: + * glib/gtester.c: + * glib/gsequence.c: Portability fixes. (#515154) + +2008-02-07 Tor Lillqvist + + * configure.in: Unfortunately the mingw implementations of + C99-style snprintf and vsnprintf don't seem to be quite good + enough, at least not in mingw-runtime-3.14. I don't know exactly + what the problem is, but it is related to floating point + formatting and decimal point vs. comma, and the symptoms show up + in some dialogs in GIMP, presumably also elsewhere. The simple + tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't + rigorous enough to notice, though. So preset + ac_cv_func_vsnprintf_c99 and ac_cv_func_snprintf_c99 to "no". + +2008-02-07 12:58:54 Tim Janik + + * Makefile.am: fixed build order to build gobject after gmodule gthread + so gobject tests can be threaded. + +2008-02-07 Ryan Lortie + + * glib/gmessages.h (g_error): add for(;;); after the g_log call so + that GCC stops issuing false warnings about reachability Bug #514920 + +2008-02-06 Matthias Clasen + + * glib/pcre/*: Update the internal copy of PCRE to 7.6 + +2008-02-06 Behdad Esfahbod + + * glib/pltcheck.sh: Skip g_bit_*(). Inline functions may end up with + a local plt if the compiler doesn't support what we want. Bug #514702 + +2008-02-06 Murray Cumming + + * glib/gconvert.c: + * glib/pcre/pcre_internal.h: Fixed some minor typos in documentation. + +2008-02-06 Christian Persch + + * gio/gdesktopappinfo.c: (ensure_dir): + * gio/glocalfile.c: (g_local_file_query_filesystem_info), + (g_local_file_read), (g_local_file_delete), (g_local_file_trash), + (g_local_file_move): + * gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get), + (_g_local_file_info_get_from_fd), (set_unix_mode), + (set_unix_uid_gid), (set_symlink), (set_mtime_atime): + * gio/glocalfileinputstream.c: (g_local_file_input_stream_read), + (g_local_file_input_stream_skip), + (g_local_file_input_stream_close), + (g_local_file_input_stream_seek): + * gio/glocalfileoutputstream.c: (g_local_file_output_stream_write), + (g_local_file_output_stream_close), + (g_local_file_output_stream_seek), + (g_local_file_output_stream_truncate), (copy_file_data), + (handle_overwrite_open): + * gio/gunixinputstream.c: (g_unix_input_stream_read), + (g_unix_input_stream_close), (read_async_cb), (close_async_cb): + * gio/gunixoutputstream.c: (g_unix_output_stream_write), + (g_unix_output_stream_close), (write_async_cb), (close_async_cb): Save + errno before calling other funcs that potentially alter it. Bug + #514766. + +2008-02-05 18:42:42 Tim Janik + + * configure.in: generate gobject/tests/Makefile. + +2008-02-05 Tor Lillqvist + + * glib-zip.in: Include the gio import library and gio-2.0.pc in + the developer zipfile. + +2008-02-02 Jonathon Jongsma + + * gio/gbufferedoutputstream.c: + * gio/gbufferedoutputstream.h: modify the new_sized() constructor to take a + gsize param instead of guint to match the GBufferedInputStream constructor. + +2008-02-03 Hans Breuer + + * **/makefile.msc.in : update + +2008-02-03 Sebastian Dröge + + * configure.in: Check for gmtime_r. Missing part of bug #511807. + +2008-02-01 Yannig Marchegay + + * configure.in: Add oc since oc.po is back. + +2008-01-31 Michael Natterer + + * glib/gmem.c: use %G_GSIZE_FORMAT instead of %lu since sizes have + changed from gulong to gsize in this file. + +2008-01-30 Johan Dahlin + + * configure.in: Remove oc since oc.po is gone. + +2008-01-30 Wouter Bolsterlee + + * glib/gchecksum.c: + * glib/gtestutils.c: + * glib/gutils.c: + + Fixed gtk-doc warnings by updating the documentation of + various functions. + +2008-01-29 14:58:31 Tim Janik + + * glib/gmem.[hc]: changed size argument type from gulong to gsize as + discussed on gtk-devel-list: + http://mail.gnome.org/archives/gtk-devel-list/2007-March/msg00062.html + this should be ABI compatible on all platforms except win64 for which + no ABI binding port exists yet. + +2008-01-29 Sebastian Wilhelmi + + * tests/threadpool-test.c (test_thread_pools): Grab + thread_counter_pools LOCK when increasing + leftover_task_counter. Fixes race in test. (#512624, Simon Murray) + +2008-01-28 Matthias Clasen + + * configure.in: Bump version + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + + * NEWS: Updates + +2008-01-28 Matthias Clasen + + * configure.in: Check for gmtime_r. + * glib/gtimer.c: Use gmtime_r when available. (#511807, + Sebastian Dröge) + +2008-01-27 Matthias Clasen + + * glib/gnode.[hc]: Move docs inline. (#316260, Philippe Blain) + +2008-01-27 Matthias Clasen + + * glib/gutf8.c (g_utf8_strreverse): Document limitations + of this function. (#487909, Peter Moulder) + +2008-01-27 Matthias Clasen + + * glib/goption.c (group_list_has_visible_entries): + Removed unused variable is_main_group. (#512381, + Wouter Bolsterlee) + +2008-01-27 Matthias Clasen + + * glib/gmacros.h: Deprecate G_GNUC_(PRETTY)_FUNCTION. Bug #409360. + +2008-01-27 Matthias Clasen + + * m4macros/glib-gettext.m4: Remove AC_CANONICAL_HOST from + GLIB_WITH_NLS again. (#385132) + +2008-01-27 Matthias Clasen + + * configure.in: Fix the pcre Unicode test to work with + LDFLAGS=-Wl,--as-needed. (#484261, Mark Lee) + +2008-01-27 Murray Cumming + + * gio/gfile.c: (g_file_replace_contents), + (g_file_replace_contents_finish): Document that the new_etags output + gchar* should be freed. + +2008-01-25 Loïc Minier + + * glib/goption.c: (group_has_visible_entries), + (group_list_has_visible_entires), (g_option_context_get_help): Pass + context down the implementation to check for the main_group. + Bug #510292. + * glib/tests/option-context.c: + Don't set G_OPTION_FLAG_IN_MAIN in main_entries + (group_captions): only create group when actually adding it to the + context; add an exit(0) to make sure the test succeeds. + +2008-01-23 Jens Granseuer + + * glib/gtestutils.c: (g_test_trap_fork): + * glib/tests/testing.c: (test_assertions): Only declare variables at + the beginning of a code block. Bug #511654. + +2008-01-21 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.15.3 === + +2008-01-21 Tor Lillqvist + + * glib-zip.in: Add the gio DLL to the runtime zipfile. + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + + * NEWS: Updates + +2008-01-20 Murray Cumming + + * glib/gchecksum.c: (g_checksum_update): Accept -1 for the data + length if the data is a null-terminated string. Bug #510855. + +2008-01-21 Alexander Larsson + + * configure.in: + Only check for sys/inotify.h (see gio/ChangeLog) + +2008-01-18 16:51:23 Tim Janik + + * glib/gutils.h: don't define __GNUC_PREREQ which is not in the glib + namespace. for gcc, define G_INLINE_FUNC to "static inline" as with + all other C compilers, because newer GCC versions incompatibly + changed "extern inline" semantics. + +2008-01-18 Murray Cumming + + * glib/gfileutils.c: + * glib/gsequence.c: + * glib/gstring.c: Fixed some minor typos in the documentation. + +2008-01-16 Dan Winship + + * glib/gchecksum.c (md5_sum_update): Fix another bug (which + doesn't affect the results, but may cause it to read bad memory). + +2008-01-15 Alexander Larsson + + * glib/gurifuncs.c: + Clarify docs for g_uri_unescape_string() (#508773) + +2008-01-14 Dan Winship + + * m4macros/glib-2.0.m4: Support gio in AM_PATH_GLIB_2_0 (#509465) + +2008-01-15 Dan Winship + + * glib/gchecksum.c (md5_sum_update): fix this; the previous code + gave the wrong md5sum when called in certain ways with buffers + larger than 64 bytes. + (g_checksum_update): remove the unnecessary "length > 1" + restriction + + * tests/checksum-test.c: Rewrite this to be much more exhaustive + (and in particular to test the md5_sum_update bugfix). + +2008-01-14 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.15.2 === + + * NEWS: Updates + +2008-01-14 Alexander Larsson + + * glib/gurifuncs.c: + Clarify docs for g_uri_escape_string (#508773) + +2008-01-12 Andre Klapper + + * configure.in: ALL_LINGUAS: remove line breaks from previous + commit to get damned-lies stats correct again. Add Sinhala (si). + +2008-01-11 Matthias Clasen + + * glib/gtestutils.c: Fix a docs typo + +2008-01-11 12:55:19 Tim Janik + + * tests/testingbase64.c: added g_base64_encode()/g_base64_decode() + test case by Asbjoern Pettersen. fixed up coding style. + +2008-01-11 09:00:28 Tim Janik + + * glib/Makefile.am (install-exec-hook): use mv/sed/rm on a temporary + file instead of "sed -i" which is not portable enough. + +2008-01-08 Alexander Larsson + + * tests/cxx-test.C: + Add gio/gio.h include to check for c++ problems. + +2008-01-07 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.15.1 === + +2008-01-07 Alexander Larsson + + * configure.in: + Add gio/test/Makefile to AC_CONFIG_FILES + +2008-01-07 Matthias Clasen + + * NEWS: Updates + +2008-01-06 Matthias Clasen + + * glib/gregex.c: Add a translator comment (#503051, + Pedro de Medeiros) + +2008-01-06 Matthias Clasen + + * glib/gutils.h: Cope with gcc 4.3 changed 'extern inline' + semantics. (#315437, patch by Loïc Minier) + +2008-01-06 Matthias Clasen + + * glib/gspawn.c (fdwalk): Don't set open_max to + RLIM_INFINITY. (#495589, Tommi Komulainen) + +2008-01-06 Matthias Clasen + + * README.in, INSTALL.in: Document new dependencies. + +2008-01-06 Matthias Clasen + + * gio-2.0.pc.in, gio-2.0-uninstalled.pc.in: Require glib-2.0 + (#507628) + +2008-01-04 Mathias Hasselmann + + Resolve 64 bit-shift bug in g_markup_collect_attributes. + Spotted by Lieven van der Heide. + + * glib/gmarkup.c: Use G_GUINT64_CONSTANT in bit-shift. + +2008-01-02 Alvaro Lopez Ortega + + * gio/gunixmount.c (g_unix_mount_unmount, g_unix_mount_eject): + These void functions were trying to return a value. It was causing + the compilation to fail. + +2008-01-02 Alvaro Lopez Ortega + + * glib/ghash.c (g_hash_table_replace, g_hash_table_insert): These + functions prototype defines its output as void, and therefore they + should not return any value. This patch fixes a compilation error: + the "return" clauses were incompatible with the functions prototype. + +2007-12-31 Matthias Clasen + + * glib/gslice.c: Remove C99 comments + +2007-12-24 Matthias Clasen + + * glib/gtestutils.h: + * glib/glib.symbols: Mark assertion functions as G_GNUC_NORETURN. + (#506461, Sebastian Dröge) + +2007-12-24 Matthias Clasen + + * glib/gtestutils.c: Include sys/time.h. (#505258) + +2007-12-22 Mathias Hasselmann + + Do not show empty groups in --help output. Initial patch from Yevgen + Muntyan. (#504142) + + * glib/goption.c: Do not show empty groups in --help output. + * glib/tests/Makefile.am: Add option-context.c + * glib/tests/option-context.c: Test skipping of empty groups. + +2007-12-22 Matthias Clasen + + * glib/gkeyfile.c: Remove wrong documentation about start group + handling. (#476856, Areg Beketovski) + +2007-12-21 18:02:30 Tim Janik + + * glib/Makefile.am: use "sed -i.bak && rm -f .bak" + syntax for install-exec-hook, which seems to be the only "sed -i" + variant that is portable across linux and MacOS. + +2007-12-21 Matthias Clasen + + * glib/gtestutils.h: Bring up to GLib coding standards: remove + C99 comments, trailing commas in enumerations and extra ; after + G_BEGIN/END_DECLS. Among other things, this makes xulrunner build + against GLib 2.15. + + * glib/gtester.c: More of the same + +2007-12-09 Hans Breuer + + * tests/gio-ls.c : adapt to recent api changes + * tests/testglib.c : variable declaration at the beginning of a block + + (Lieven van der Heide, #503602) + * win32-fixup.pl : process *.rc.in as well; substitute + LT_CURRENT_MINUS_AGE + * glib/makefile.msc.in : alphabetic sorting of OBJECTS + +2007-12-20 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.15.0 === + + * NEWS: Updates + + * glib/Makefile.am: Fix make dist + +2007-12-20 16:34:04 Tim Janik + + * glib/gtester-report: commented class definitions. moved HTML character + escaping out of javascript. fixed string->bool conversions. added performance + results to test case "Details" window. + +2007-12-20 Matthias Clasen + + * glib/gchecksum.[hc] (g_checksum_new): Return NULL when + the checksum_type is unknown. (#501853) + +2007-12-20 Christian Persch + + * glib/gchecksum.c (g_checksum_new): Use g_slice_new0, to fix + "conditional jump or move depends on uninitialised value(s)" error + from valgrind. Bug #504527. + +2007-12-20 15:17:04 Tim Janik + + * Makefile.decl: generate HTML reports for test-report perf-report full-report. + +2007-12-20 15:03:51 Tim Janik + + * glib/gtester-report: new python script that generates an HTML + unit test report from the XML files generated by gtester. + + * glib/Makefile.am: install gtester-report in $bindir and configure + it upon installation (version number and python shebang). + +2007-12-19 Matthias Clasen + + * glib/glib.symbols: Add g_async_queue_new_full + +2007-12-19 20:30:18 Tim Janik + + * glib/gtestutils.c: capture g_log() messages and send to gtester. + also, send assertion messages to gtester. + + * glib/gtester.c: add error messages to output log file. + force child poll loop to abort if waitpid() signaled child exit, + eventhough the child's report file descriptor wasn't closed. + +2007-12-19 Christian Persch + + * glib/gchecksum.c: (g_checksum_type_get_length), + (g_checksum_get_digest): + * glib/gchecksum.h: + * glib/glib.symbols: + * tests/checksum-test.c: (test_checksum): Add + g_checksum_type_get_length, and change g_checksum_get_digest to use a + provided buffer instead of returning allocated memory. Bug #501853. + +2007-12-19 Emmanuele Bassi + + * glib/gtimer.c (g_time_val_from_iso8601): Fix the date validation + check. (#503029) + + * tests/testglib.c (various_string_tests): Add an invalid date + for testing the above fix. + +2007-12-19 Alexander Larsson + + * glib/gfileutils.[ch]: + * glib/glib.symbols: + Rename g_format_file_size_for_display to g_format_size_for_display. + +2007-12-18 Tim-Philipp Müller + + * docs/reference/glib/glib-sections.txt: + * glib/gasyncqueue.c: (g_async_queue_new), (g_async_queue_new_full), + (g_async_queue_unref): + * glib/gasyncqueue.h: add g_async_queue_new_full() which takes a + GDestroyNotify function to free any remaining queue items when the + queue is destroyed after the final atomic unref (#367550). + +2007-12-18 13:45:23 Tim Janik + + * glib/gtestutils.[hc]: added g_test_trap_assert_stdout_unmatched() and + g_test_trap_assert_stderr_unmatched(), based on a suggestion by Mathias + Hasselmann. reworked g_test_trap_assertions() to use flags to encode + assertion semantics, fixes #504227. + +2007-12-16 Mathias Hasselmann + + * glib/gutils.c: + Allow NULL strings in g_parse_debug_string. (#503862, Matthew Barnes) + +2007-12-14 Matthias Clasen + + * glib/glib.symbols: + * glib/ghash.[hc]: Add hash table iterators. (#500507, + Jean-Yves Lefort) + + * tests/hash-test.c: Test iterators. + +2007-12-13 Mathias Hasselmann + + Give exmples in error message unsupported case-changing escape + sequences. (503222) + + * glib/gregex.c: Add examples to error message for PCRE-ERR37. + +2007-12-13 Bastien Nocera + + * glib/gtimer.c: (g_time_val_from_iso8601): + Don't try to parse dates that start with anything but a + digit, a plus or a minus sign, as those can't be valid + ISO8601 dates (Closes: #503029) + +2007-12-13 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_clear): Free group_hash. + (#503420, Christian Persch) + +2007-12-12 16:06:11 Tim Janik + + * tests/testglib.c: split up tests and reworked code to use + the new test framework. + + * tests/Makefile.am: added testglib to TEST_PROGS. + +2007-12-11 Rahul Bhalerao + + * configure.in: Added entry for Marathi Translations + +2007-12-10 Matthias Clasen + + * glib/glib.h: Include gurifuncs.h + +2007-12-10 Benjamin Otte + + * glib/garray.h: use an intermediate cast to void * in g_array_index() + to not trigger cast alignment warnings, fixes #502927. + +2007-12-10 15:08:59 Tim Janik + + * let g_warn_if_fail replace g_assert as discussed here: + http://mail.gnome.org/archives/gtk-devel-list/2007-October/msg00089.html + + * fix bug #502498: Test framework assertion failures should follow + gcc error format. + + * gmessages.h, gmessages.c: deprecated g_assert_warning() which is + unused now. removed g_assert*() definitions whcih are provided by + gtestutils.h now. added g_warn_if_reached() and g_warn_if_fail() + which are recommended as g_assert/g_assert_not_reached replacements + for non-test programs. + added g_warn_message() to implement g_warn_*() macros. + use emacs-next-error friendly formatting for file:line: for warnings. + + * gtestutils.h, gtestutils.c: use emacs-next-error friendly formatting. + implement g_assert_not_reached() with g_assertion_message() and + g_assert() in terms of g_assertion_message_expr() so we'll be able to + provide assertion messages in test logs. + + * gkeyfile.c, gbookmarkfile.c: changed g_assert*() to g_warn_if_fail() + or g_return_if_fail() where suitable. + + * gio/: changed g_assert to g_warn_if_fail. + +2007-12-10 13:02:08 Tim Janik + + * glib/gtestutils.c (g_assertion_message_cmpnum): applied patch by Tommi + Komulainen to fix int64 printouts, fixes #502511. + +2007-12-10 Matthias Clasen + + * glib/gstrfuncs.h: + * glib/gstrfuncs.c (g_dpgettext): Change prototype to take + msgctxtid + offset instead of two strings, to avoid duplication + of string constants if the compiler/linker don't perform constant + suffix merging. (#502590, Christian Persch) + + * glib/gi18n.h: + * glib/gi18n-lib.h: Adapt the definitions of C_() and Q_(). + +2007-12-09 Hans Breuer + + * tests/gio-ls.c : (new file) a test program emulating some of 'ls' + * tests/makefile.msc.in : build it (currently on win32) + + * **/makefile.msc glib/makefile.msc.in : removed -GD to compile + with msvc9 (vs2008) with less complains + + * glibconfig.h.win32.in : #define G_HAVE_ISO_VARARGS 1 for + msv8 (vs2005) and above + + * glib/gfileutils.c : s/stricmp/_stricmp/ + * msvc_recommended_pragmas.h : work around Microsoft's premature + attempt to deprecate the C-Library + + * tests/makefile.msc.in : added checksum-test + +2007-12-08 Christian Persch + + * gio/glocalfileinfo.c: (get_thumbnail_attributes): Add forgotten + #ifdef G_OS_WIN32 to fix the build on linux. + +2007-12-08 Hans Breuer + + * glib/makefile.msc.in : build gchecksum.obj + +2007-12-06 Mathias Hasselmann + + * glib/ghash.c: Call destroy notify when destroying + the hash table in g_hash_table_unref. + +2007-12-06 13:29:00 Tim Janik + + * glib/gtester.c (child_report_cb): detect non-blocking fd EOF + by read()==0 following poll(), needed on MacOS. + +2007-12-06 Mathias Hasselmann + + * glib/gunidecomp.c: Mention g_utf8_normalize() + returns NULL on invalid string. (#501997) + +2007-12-06 Mathias Hasselmann + + * glib/gerror.c: Improve wording for g_propagate_error docs. + +2007-12-06 09:27:42 Tim Janik + + * tests/scannerapi.c: added new scanner test from #501654, by + Patrick Hulin with various modifications. + reworked coding style, adapted to new testing framework, fixed + token parser test and use a forked sub process to test + g_scanner_error() output messages. + +2007-12-05 17:58:18 Tim Janik + + * glib/gtester.c: added -m=thorough support to gtester. + +2007-12-05 17:21:05 Tim Janik + + * glib/glib/gtestutils.c: print out random seed for verbose tests, + also adapted test result reporting slightly in verbose mode to allow + custom debugging output. support "thorough" as test mode alis for "slow". + + * glib/glib/gtestutils.h: added g_test_thorough(). + + * glib/glib/gtester.c: print out the last random seed when tests fail. + added result attribute to test case status logging to easily spot + failing tests in log files. disabled debugging output when skipping tests. + +2007-12-05 11:43:22 Tim Janik + + * glib/gtestutils.[hc]: added g_test_add_data_func() to pass data + into tests. allow data arguments for fixture tests. + + * glib/gtestutils.c: fixed fatal log flag setup, so tests really abort + upon criticals/warnings/errors. + + * glib/tests/testing.c: test test_data arguments. + + * glib/gtester.c: some prototype fixups. + +2007-12-05 Tor Lillqvist + + * glib/win_iconv.c: Add "shift-jis" as an alternative spelling of + "shift_jis". + +2007-12-05 Ryan Lortie + + * autogen.sh: for the benefit of git users, checkout build/ if it is + missing + * .gitignore: but after that, ignore it. + +2007-12-05 Ryan Lortie + + * glib/ghash.c: ungtk-docify some comments for internal functions + +2007-12-04 Emmanuele Bassi + + * gio/glocalfileinfo.c: Replace the copy-and-paste MD5 digest + generation with GChecksum. + +2007-12-04 Emmanuele Bassi + + * glib/gchecksum.[ch]: Add GChecksum, a generic wrapper around + various hashing algorithms. At the moment, the MD5, SHA-1 and + SHA-256 algorithms are supported. (#443648) + + * glib/glib.h: + * glib/Makefile.am: + * glib/glib.symbols: Build glue for GChecksum + + * tests/Makefile.am + * tests/checksum-test.c: Add test suite for GChecksum. + +2007-12-03 Ryan Lortie + + * glib/ghash.c: no code changes; add comments to document the internal + functions. + +2007-12-03 Ryan Lortie + + * glib/ghash.c: no code changes; reorder functions to remove the need + for forward declarations. + +2007-12-03 Ryan Lortie + + * glib/ghash.c (g_hash_table_lookup_node, + g_hash_table_lookup_extended, g_hash_table_insert_internal, + g_hash_node_new): improve clarity in some functions + +2007-12-03 Ryan Lortie + + * glib/ghash.c: rename 'node' to 'node_ptr' where appropriate + +2007-12-03 Ryan Lortie + + * glib/ghash.c: convert G_HASH_TABLE_RESIZE() macro to inline function + +2007-12-03 Ryan Lortie + + * glib/glib.symbols (glib_gettext): remove stray (duplicate) entry + from file to fix the build + +2007-12-03 Behdad Esfahbod + + * glib/gnulib/Makefile.am: Fix EXTRA_DIST automake warnings. (#501107) + +2007-12-03 Hans Breuer + + * glib/glib.symbols : added glib_gettext (in use by gio) + * makefile.msc : also try building gio + + * glib/gmarkup.c : use G_GUINT64_CONSTANT() to avoid + 'bad suffix on number' + * glib/gtestutils.c : declare cariable at the beginning of the block, + include for G_OS_WIN32 + * makefile.msc.in : add gurifuncs and gtestutils + +2007-12-03 Ryan Lortie + + * glib/ghash.c: create a common function for the many places where all + nodes in the table are removed (remove_all, steal_all, destroy, unref, + etc...) + +2007-12-03 Ryan Lortie + + * tests/hash-test.c (second_hash_test): fix memory leak, add a few + extra sanity tests. + +2007-12-03 Matthias Clasen + + * glib/gkeyfile.c: Don't call g_get_language_names() per-key. + (#500638, Michael Meeks) + +2007-12-03 Marco Barisione + + * glib/gregex.c: + * glib/gregex.h: Add new error codes for when compilation fails and + make compilation error translatable. (#482313, Morten Welinder) + +2007-12-03 Matthias Clasen + + * glib/gkeyfile.c: Add a hash table to speed up group lookups, + which GKeyFile does quite a lot. + +2007-12-03 Alexander Larsson + + * configure.in: + Add xattr checks for OSX style API (#500506) + +2007-12-03 Ryan Lortie + + * glib/ghash.c: merge more common code into functions. Vastly + simplify loop logic in g_hash_table_foreach_remove_or_steal(). + +2007-12-01 Behdad Esfahbod + + * Makefile.am: Don't descend into build/. (#500875) + +2007-11-28 Matthias Clasen + + * glib/gmarkup.h: + * glib/gmarkup.c: + * glib/gerror.c: Add Since: tags to new API, other doc improvements. + +2007-11-28 Matthias Clasen + + * glib/gurifuncs.c: Some doc cleanups + +2007-11-28 Matthias Clasen + + * glib/gtestutils.c: Fix up some doc comments, avoid C99 comments + + * glib/gconvert.c: De-doc-commentify static functions to + shut up gtk-doc. + + * glib/gutils.c: Fix the glib_gettext doc comment. + +2007-11-28 Tor Lillqvist + + * config.h.win32.in: Update to match what configure produces. + +2007-11-28 Alexander Larsson + + * glib/gstring.c (g_string_append_uri_escaped): + Move this function before g_string_append_c so that + we avoid the plt call due to the undefinf of g_string_append_c + +2007-11-28 Emmanuele Bassi + + * gio/Makefile.am: Remove makegioalias.pl from the marshal files + and avoid it being cleaned up when running make clean. + +2007-11-28 Alexander Larsson + + * glib/glib.symbols: + Add in the new symbols + + * glib/gurifuncs.c: + Use the aliases framework + + * glib/glibintl.h: + * glib/gutils.c: + Make the alias stuff work now that glib_gettext + is exported to libgio. + +2007-11-27 Ryan Lortie + + * glib/ghash.c (g_hash_table_insert, g_hash_table_replace, + g_hash_table_insert_internal): insert/replace were identical except + for a single line. Replace both with a common function. + +2007-11-27 Alexander Larsson + + * gio/Makefile.am: + * gio/gurifuncs.[ch]: + * glib/Makefile.am: + * glib/gstring.[ch]: + * glib/gurifuncs.[ch]: + Moved gurifuncs from gio to glib + +2007-11-27 Alexander Larsson + + * gio/gfileinfo.[ch]: + * glib/gfileutils.[ch]: + Move g_format_file_size_for_display from gio to glib + +2007-11-27 Alexander Larsson + + * configure.in: + Allow configuration of gio-module-dir + + * gio-2.0.pc.in: + Export giomodules location as giomodule variable + +2007-11-26 Matthias Clasen + + * tests/markup-collect.c: Add some tests for invalid booleans + +2007-11-26 Ryan Lortie + + Add new function g_markup_collect_attributes (bug #496847). + + * glib/glib.symbols: add g_markup_collect_attributes + + * docs/reference/glib/glib-sections.txt: + * glib/gmarkup.h: + * glib/gmarkup.c: add g_markup_collect_attributes and new enumerated + type GMarkupCollectType. Add new error code + G_MARKUP_ERROR_MISSING_ATTRIBUTE that is thrown by the attribute + collector. + +2007-11-27 Tor Lillqvist + + * glib/win_iconv.c: Some improvements, being upstreamed. + (must_use_null_useddefaultchar): New function, checks for those + codepages for which one must pass a NULL lpUsedDefaultChar pointer + to WideCharToMultiByte(). + (kernel_wctomb): Use it. + (kernel_wctomb): Return with E2BIG immediately if bufsize is zero. + +2007-11-27 Tor Lillqvist + + * glib/gutils.c (_glib_get_locale_dir) [Win32]: Use either + lib/locale or share/locale depending on which one is in + GLIB_LOCALE_DIR. When the configury recognizes GNU gettext (based + on the _nl_msg_cat_cntr variable, eek), share/locale gets used. + + * glib-zip.in: Likewise, look for message catalogs either in + lib/locale or share/locale. + +2007-11-26 Matthias Clasen + + * gio/gfileattribute.c: Fix up a doc comment. + +2007-11-26 Alexander Larsson + + * Makefile.am: + * configure.in: + * gio-2.0-uninstalled.pc.in: + * gio-2.0.pc.in: + * gio-unix-2.0-uninstalled.pc.in: + * gio-unix-2.0.pc.in: + * gio/ + * docs/reference/gio + Merged gio-standalone into glib. + + * glib/glibintl.h: + * glib/gutils.c: + Export glib_gettext so that gio can use it + Add P_ (using same domain for now) + Add I_ as g_intern_static_string + +2007-11-26 Tor Lillqvist + + * glib/win_iconv.c: ISO8859-1 is CP28591, not CP1252. + +2007-11-26 Tor Lillqvist + + Implement #491549: On Windows, always use the native API for + character set conversions instead of GNU libiconv. Almost all + codesets supported by GNU libiconv exist as Windows codepages. + One missing feature is the "C99" and "JAVA" pseudo codesets, but I + doubt that is worth worrying about. + + * glib/win_iconv.c: New file. iconv() implementation for + Windows. Placed in the public domain by Yukihiro Nakadaira + . From + http://yukihiro.nakadaira.googlepages.com/win_iconv.zip, his + 2007-11-17 version. + + * glib/gconvert.c: Include win_iconv.c on Windows. + + * glib/Makefile.am: Add win_iconv.c to EXTRA_DIST. + + * configure.in: Bypass iconv checks on Windows. + +2007-11-25 Tor Lillqvist + + * glib/gtestutils.c: Add conditionals for non-Unix. Just g_error() + unless G_OS_UNIX for now. + +2007-11-25 Matthias Clasen + + * configure.in: Require gtk-doc 1.8. + + * glib/gasyncqueue.c: + * glib/gdate.c: + * glib/gfileutils.c: + * glib/gmain.c: + * glib/gmarkup.c: + * glib/gregex.c: + * glib/gtestutils.c: + * glib/gutils.c: Use gtk-doc abbreviations for + examples in doc comments. + +2007-11-24 Matthias Clasen + + * */Makefile.am: Replace INCLUDES by AM_CPPFLAGS, other + cleanups. + +2007-11-24 Matthias Clasen + + * tests/base64-test.c: Fix a memory overrun. + +2007-11-24 Matthias Clasen + + * glib/gutils.c: Remove leftover ENABLE_NLS #ifdefs. + +2007-11-23 Matthias Clasen + + * glib/gbase64.c (g_base64_encode): Don't refuse to encode + a single byte. (Milan Crha) + + * tests/base64-test.c: Test encoding short strings. + +2007-11-23 Matthias Clasen + + * glib/gi18n-lib.h: + * glib/gi18n.h: Define a two-argument macro C_() for marking + translatable strings with context and implement C_() and Q_() + using g_dpgettext(). (#142676, Morten Welinder) + + * glib/glib.symbols: + * glib/gstrfuncs.[hc]: Implement g_dpgettext(). + +2007-11-23 Matthias Clasen + + * glib/goption.c: Use g_print to print out --help text in + locale encoding. (#469551, Takao Fujiwara) + +2007-11-22 Matthias Clasen + + * glib/gkeyfile.c: Set length out param in list-returning functions + to 0 when returning NULL. (#498728, Christian Persch) + +2007-11-21 21:06:47 Tim Janik + + * Makefile.decl: initialize automake variables EXTRA_DIST and + TEST_PROGS for unconditional appending via += in other makefiles. + define recursive test targets: test, test-report, perf-report, + full-report, as described here: + http://mail.gnome.org/archives/gtk-devel-list/2007-November/msg00000.html + + * Makefile.am: + * build/win32/vs8/Makefile.am, build/win32/dirent/Makefile.am: + * build/win32/Makefile.am, build/Makefile.am: + * docs/Makefile.am, docs/reference/Makefile.am: + * docs/reference/glib/Makefile.am, docs/reference/gobject/Makefile.am: + * gmodule/Makefile.am, tests/Makefile.am: + * tests/refcount/Makefile.am, tests/gobject/Makefile.am: + * glib/update-pcre/Makefile.am, glib/libcharset/Makefile.am: + * glib/tests/Makefile.am, glib/pcre/Makefile.am: + * glib/gnulib/Makefile.am, gobject/Makefile.am, m4macros/Makefile.am: + * gthread/Makefile.am, glib/Makefile.am: + include $(top_srcdir)/Makefile.decl, adapted EXTRA_DIST assignments. + + * glib/tests/Makefile.am: removed example testing rules. + + * glib/tests/testing.c: conditionalized performance and slow tests. + + * glib/gtestutils.h: + * glib/gtestutils.c: work around g_test_config_vars not changing its + exported value after value assignments, aparently due to symbol aliases. + + * glib/gtester.c: fixed off-by-one error which produced junk in logs. + + * configure.in: check for python >= 2.4 and provide $PYTHON for scripts. + +Tue Nov 20 15:59:55 2007 +0100 Tim Janik + + Renamed gtestframework to gtestutils. + + * glib/glib.h: + * glib/Makefile.am: added gtestutils.h to public includes. + + * glib/gtestutils.c: include gtestutils.h. + + * glib/gtestutils.h: + * glib/glib.symbols: + * glib/tests/testing.c: renamed gtestframework to gtestutils. + + * glib/gtestframework.h: renamed to gtestutils.h. + + * glib/gtestframework.c: renamed to gtestutils.c. + +Tue Nov 20 15:29:34 2007 +0100 Tim Janik + + glib/gtestframework.c: g_test_init(): make warnings and criticals fatal for all test programs. + +Wed Nov 14 20:35:05 2007 +0100 Tim Janik + + gtestframework.c: added test API documentation by Sven Herzberg and Tim Janik. + +Wed Nov 14 19:10:28 2007 +0100 Tim Janik + + gtestframework.[hc]: implemented g_test_queue_destroy() and g_test_queue_unref(). + +Fri Nov 9 12:28:52 2007 +0100 Tim Janik + + Added g_test_bug() and related API. + + * gtester.c: handle G_TEST_LOG_MESSAGE and test test message API. + + * gtestframework.h, gtestframework.c: added test message API and convenience + API to send test messages about bug URLs. + +Fri Nov 9 11:35:11 2007 +0100 Tim Janik + + Added API to access test framework configuration. + + * gtestframework.h, gtestframework.c: export testing configuration to test + programs with g_test_quick(), g_test_perf(), g_test_verbose(), g_test_quiet(). + +Thu Nov 8 17:55:09 2007 +0100 Tim Janik + + gtester: implemented logic to handle failing tests, self tests, and validate XML reports. + + * gtester.c: terminate when tests failed. keep XML valid when test cases fail. + restart test binaries when tests fail, resuming after the last processed test. + support --gtester-selftest to run gtester itself as test program. + support --test-arg= to pass args along to test programs. added + main_selftest() which does a simplistic fixture test. fail if exit + code of test programs is not 0. + + * gtestframework.h: added G_TEST_LOG_SKIP_CASE test log message type. + + * gtestframework.c: support --GTestSkipCount= to skip a number of tests. + + * tests/Makefile.am: added test-report: for demonstration purposes. + added gtester-xmllint-check: and hooked it up into check:, this rule calls + gtester as test program, running it's selftest, and then uses xmllint to + validate the generate XML test log file. + +Thu Nov 8 14:51:37 2007 +0100 Tim Janik + + gtester: implemented XML logging. + + * glib/gtester.c: log test messages to XML output file. beautified normal test + result output. + + * glib/gtestframework.c: fixed GTimer leak. + + * glib/tests/Makefile.am: start gtester with --verbose. + +Thu Nov 8 12:33:31 2007 +0100 Tim Janik + + tests/Makefile.am: execute test programs with gtester, add test: to check: + +Thu Nov 8 12:18:51 2007 +0100 Tim Janik + + Fixed PLT symbol exports for gtestframework.h. + + * glib/glib.symbols: added all exported gtestframework.h symbols. + + * glib/gtestframework.c: include galias.h, galiasdef.c, define __G_TESTFRAMEWORK_C__. + +Thu Nov 8 11:31:12 2007 +0100 Tim Janik + + glib/gtester.c: fixed debugging flag. + +Wed Nov 7 17:56:26 2007 +0100 Tim Janik + + fixed bogus unistd.h include. + +Wed Nov 7 17:53:30 2007 +0100 Tim Janik + + Implemented test log IPC. + + * gtester.c: read and decode log messages from test binary child processes. + fixed GIOChannel and child watch handling to process all messages and avoid + hangs. pass --verbose and --quiet on to children, default to --quiet. + + * gtestframework.h: export g_test_log_type_name(). + + * gtestframework.c: send test log to --GTestLogFD= if given, removed + bogus -o-option. + +Tue Nov 6 20:07:44 2007 +0100 Tim Janik + + gtester.c: support test case listing through gtester. + +Tue Nov 6 20:01:06 2007 +0100 Tim Janik + + gtestframework.c: fixed testpath matches for automatic root suite. + +Tue Nov 6 19:50:33 2007 +0100 Tim Janik + + gtester.c: adapted to become a rudimentary test binary launcher. + + * gtester.c: increased read buffer size to match common unix pipe buffer size. + added argument parsing and usage. changed io handling to capture and replicate + stdout. fixed io handlers to be cleaned up when the child process exits (catch + G_IO_ERR | G_IO_HUP). we now use pending/iteration instead of a main loop + structure, to keep running until the child process exits and all io has been + processed. launch the test binaries given on the command line. don't quit when + a child couldn't be launched but --keep-going was specified. + +Tue Nov 6 17:11:37 2007 +0100 Tim Janik + + Integrated gtester program into build process. + + * Makefile.am: build and install gtester binary. + + * gtester.c: fixed up coding style and removed hard wired test coded. + +Tue Nov 6 16:12:32 2007 +0100 Sven Herzberg + + glib/gtester.c:Small -Wall fix + +Tue Nov 6 16:05:06 2007 +0100 Sven Herzberg + + glib/gtester.c:Implemented nonblocking reading properly now + +Mon Nov 5 13:53:23 2007 +0100 Sven Herzberg + + glib/gtester.c:Quit the application when the output is parsed completely, not just the process finished + +Mon Nov 5 12:00:16 2007 +0100 Sven Herzberg + + glib/gtester.c:Read the output of the child process + +Mon Nov 5 11:50:59 2007 +0100 Sven Herzberg + + glib/gtester.c:Use g_spawn_async_with_pipes() + +Mon Nov 5 11:50:08 2007 +0100 Sven Herzberg + + glib/gtester.c:Spawn a process async and quit gtester after the child process exited + +Mon Nov 5 11:30:45 2007 +0100 Sven Herzberg + + glib/gtester.c:Added a first revision of gtester + +Tue Nov 6 16:47:06 2007 +0100 Tim Janik + + Implemented test log serialization. + + * glib/gtestframework.h: added g_test_log*() API. + + * glib/gtestframework.c: implement test log serialization. + +Tue Nov 6 14:24:54 2007 +0100 Tim Janik + + Implemented test logging basics. + + * glib/gtestframework.c: added --debug-log and --verbose, implemented + test information logging. + + * testing.c: test g_test_maximized_result() and g_test_minimized_result(). + +Tue Nov 6 11:52:14 2007 +0100 Tim Janik + + Implemented g_test_timer*(). + + * gtestframework.c: implemented g_test_timer*(). + + * tests/testing.c: added a g_test_timer*() test. + +Mon Nov 5 18:28:24 2007 +0100 Tim Janik + + Implemented support for testpaths. + + * gtestframework.c: implemented g_test_add_vtable() and g_test_add_func(). + + * tests/testing.c: use g_test_add() and g_test_add_func() to majorly simplify main(). + +Mon Nov 5 15:56:42 2007 +0100 Tim Janik + + testing.c: added tests for the g_test_rand*() API. + +Mon Nov 5 15:55:38 2007 +0100 Tim Janik + + Implemented g_test_rand*(). + + * gtestframework.h: fixed g_assert_cmp*() to evaluate arguments only once. + added g_assert_cmpuint(). completed g_test_rand*() to cover bits, ints, + doubles and ranges. + + * gtestframework.c: fixed "--seed" option and implemented g_test_rand*(). + +Mon Nov 5 15:51:43 2007 +0100 Tim Janik + + testing.c: added tests for g_assert_cmphex() and forked test traps. + +Mon Nov 5 15:10:18 2007 +0100 Tim Janik + + Implemented g_test_trap_fork() API. + + * gtestframework.h: added g_assert_cmphex(). reworked g_test_trap*() API. + + * gtestframework.c: implemented g_test_trap_fork() API. + +Thu Nov 1 15:05:07 2007 +0100 Tim Janik + + * glib/gtestframework.c: + + that match a given test path. + (g_test_run_suite): run suite only if it matches the existing test paths. + + * glib/tests/testing.c: minor rename. + +Thu Nov 1 13:45:55 2007 +0100 Tim Janik + + GTest framework started. + + * glib/gtestframework.h: testing framework API as proposed on gtk-devel-list. + includes elaborate assertions, performance report functions, test traps, + test timer, test random numbers, teardoiwn garbage collection functions + and general test case / test suite management APIs. + + * glib/gtestframework.c: first test framework implementation. already covers + some test suite management APIs and assertion message implementations. + + * glib/tests/testing.c: test program for the testing framework. + + * glib/tests/Makefile.am: complie testing.c as test. run all tests as part of + make test:. + +Wed Oct 31 15:42:48 2007 +0100 Tim Janik + + glib/Makefile.am: build tests/ subdir after building libglib. + +Tue Oct 30 16:17:32 2007 +0100 Tim Janik + + Fixed up internal 'g_test*' names. + + * refcount/signals.c: + * refcount/objects.c: + * refcount/objects2.c: + * refcount/closures.c: + * refcount/properties.c: + * refcount/properties2.c: changed namespace prefix from g_test_* to my_test_* + to not clash with newly introduced g_test* API in glib. + +Tue Oct 30 14:41:26 2007 +0100 Tim Janik + + Added gtestframework.[hc] and glib/tests/. + +2007-11-20 Sven Neumann + + * glib/gerror.c (g_error_add_prefix): use g_strconcat() instead of + g_strjoin() to concatenate two strings. + +2007-11-19 Marco Barisione + + * glib/gregex.c: When the compilation of a pattern fails in the error + message use the character offset and not the byte offset. + + * glib/gregex.c: Pass an unsigned long instead of an int to + pcre_fullinfo() to avoid problems on 64-bit systems (#498113, Kouhei + Sutou) + +2007-11-19 10:30:33 Tim Janik + + * configure.in: updated version number to 2.15.0 for development. + +2007-11-18 Matthias Clasen + + * glib/gbase64.c: Documentation improvements. (#496518, + Stefan Schulze Frielinghaus) + +2007-11-18 Matthias Clasen + + * configure.in: Check whether assembler supports numerical local + labels. + + * glib/gatomic.c: Fix powerpc implementation of atomic ops for + platforms where the assembler doesn't support numerical local + labels. (#445362) + +2007-11-15 Ryan Lortie + + * docs/reference/glib/tmpl/markup.sgml: + * glib/gmarkup.h: + * glib/gmarkup.c: new flag G_MARKUP_PREFIX_ERROR_POSITION to cause the + parser to prepend location information (ie: "Error on line %d, char + %d:") to errors generated by the GMarkupParser callbacks. + + Closes #496046. + +2007-11-15 Ryan Lortie + + * docs/reference/glib/glib-sections.txt: + * glib/glib.symbols: + * glib/gerror.h: + * glib/gerror.c: new functions g_prefix_error and + g_propagate_prefixed_error. + +2007-11-13 Cody Russell + + * docs/reference/gobject/gobject-docs.sgml: + * docs/reference/gobject/tut_gsignal.xml: + * docs/reference/gobject/tut_gtype.xml: + * docs/reference/gobject/tut_intro.xml: + * docs/reference/gobject/tut_tools.xml: + * docs/reference/gobject/tut_howto.xml: + * docs/reference/gobject/tut_gobject.xml: Documentation fixes. + Recommend macro type names such as NAUTILUS_TYPE_WINDOW (not + NAUTILUS_WINDOW_TYPE). Fixed text which erroneously stated that + superclass initializers don't run when an object is + instantiated. Fixed numerous spelling mistakes. Minor grammar + edits. (#490637, Adam Dingle) + +2007-11-09 Matthias Clasen + + * glib/gkeyfile.c: Coding style cleanups and doc + improvements. (#491979, #491982, Areg Beketovski) + +2007-11-09 Matthias Clasen + + * glib/giochannel.c: Coding style cleanups and doc + improvements. (#491975, Areg Beketovski) + +2007-11-09 Matthias Clasen + + * glib/gmain.c (g_main_context_iteration): Improve the + docs. (#491974, Areg Beketovski) + +2007-11-09 Matthias Clasen + + * glib/gdate.c: Coding style fixes. + +2007-11-09 Matthias Clasen + + * configure.in: Add AM_PROG_CC_C_O. + + * Makefile.am: Remove the install-exec-local hook and use + configexecincludedir_DATA instead, in an attempt to avoid + automake 1.9 <> 1.10 incompatibilities. + + * glib/Makefile.am: Rename MIRRORING_TAB_SOURCES, since + automake 1.10 complains. + +2007-11-09 Matthias Clasen + + * glib/gspawn.c (g_spawn_sync): Improve the docs. (#491968, + Areg Beketovski) + +2007-11-08 Matthias Clasen + + * glib/gmain.c (g_main_context_release): + (g_main_context_acquire): + (g_main_context_new): Fix the doc wording. (#491957, + #491965, #491966, Areg Beketovski) + +2007-11-08 Matthias Clasen + + * glib/gutils.c (g_set_application_name): Add a missing + since tag. (#464259, Mark Doliner) + +2007-11-08 Matthias Clasen + + * glib/goption.c (g_option_context_new): Improve the docs. + (#436293, Vincent Untz) + +2007-11-08 Matthias Clasen + + * glib/gmain.c (g_main_loop_quit): Expand the docs + a bit. (#317775, Søren Sandmann) + +2007-11-08 Matthias Clasen + + * autogen.sh: Accept automake 1.10, too + + * mkinstalldirs: Temporarily add this script, to fix building + from svn. + + * Makefile.am: Use MKDIRS_P instead of mkinstalldirs, add + ChangeLog.pre-2-14 and mkinstalldirs to EXTRA_DIST. + +2007-11-08 Matthias Clasen + + * glib/gmarkup.h: Include gslist.h. Pointed out by Michael Natterer. + +2007-11-08 Matthias Clasen + + * glib/gconvert.c (g_convert_with_iconv): Try harder to reset + shift state with AIX iconv(). (#467537) + +2007-11-08 Matthias Clasen + + * configure.in: + * m4macros/glib-2.0.m4: Require pkg-config 0.16 in configure + and in AM_PATH_GLIB_2_0 to be consistent with the use of + PKG_PROG_PKG_CONFIG which was introduced in 0.16. (#418778, + Loïc Minier) + +2007-11-08 Matthias Clasen + + * glib/gstrfuncs.c (g_parse_long_long): Don't leave + out parameters uninitialized. (#490061, Benjamin Otte) + +2007-11-07 Matthias Clasen + + * glib/gmain.c (g_main_context_unref): Don't leak the + condvar. (#479724, Areg Beketovski) + +2007-11-07 Matthias Clasen + + * glib/glib.symbols: + * glib/gmarkup.[hc] (g_markup_parse_context_get_element_stack): + New function, to get the stack of open elements. (#452887, + Ryan Lortie) + +2007-11-07 Matthias Clasen + + * glib/gkeyfile.[hc]: Make some functions that take + a GError return boolean instead of void. (#375651, Matt Barnes) + +2007-11-07 Matthias Clasen + + * autogen.sh: Use automake 1.9 + + * acinclude.m4: + * configure.in: Move some inter-*.m4 includes from + configure.in to acinclude.m4 to avoid warnings when + using automake 1.9. (#449937) + +2007-11-07 Matthias Clasen + + === Branch for 2.14 === diff --git a/ChangeLog.pre-2-18 b/ChangeLog.pre-2-18 new file mode 100644 index 0000000..e07ae27 --- /dev/null +++ b/ChangeLog.pre-2-18 @@ -0,0 +1,1738 @@ +2008-09-17 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.18.1 === + + * NEWS: Updates + +2008-09-16 Tor Lillqvist + + * glib/gtimer.c (g_time_val_to_iso8601): time_t is 64 bits in all + the newer Microsoft C libraries, not just 64-bit ones. So to avoid + crash if compiled with newer MSVSes, use a separate time_t + variable in all cases on Windows. + + * glib/gbacktrace.h: Define G_BREAKPOINT() also for 64-bit MSVC, + using the __debugbreak() intrinsic. + +2008-09-15 Behdad Esfahbod + + * configure.in: Fix description of module shared library suffix. + +2008-09-15 Tor Lillqvist + + * config.h.win32.in: Update to match what the configure script + produces. Just for uniformity, only commented out parts affected. + +2008-09-13 Tor Lillqvist + + * glib/gutils.h + * glib/gwin32.h: Deprecate G_WIN32_DLLMAIN_FOR_DLL_NAME(), + g_win32_get_package_installation_directory() and + g_win32_get_package_installation_subdirectory() as their + documentation has warned for a while. Sorry that I forgot to do + this before 2.18.0. + + * glib/gwin32.c (g_win32_get_package_installation_directory): + Print a warning if a non-NULL package parameter is passed to this + function, as that is deprecated usage, as the documentation says. + +2008-09-11 Matthias Clasen + + Bug 548321 – is not included in gi18n-lib.h + + * glib/gi18n.h: + * glib/gi18n-lib.h: Include string.h, since strlen is used in + the macros. Pointed out by Ignacio Casal Quinteiro + +2008-09-10 Matthias Clasen + + Bug 551731 – g_date_set_time[_t] docs should mention what timezone + + * glib/gdate.c (g_date_set_time, g_date_set_time_t): Documentation + improvements proposed by Owen Taylor. + +2008-09-10 Matthias Clasen + + Bug 551410 – gtestutils.c: using printf without prototype + + * glib/gtestutils.c: Include stdio.h. Pointed out by Kazuki Iwamoto. + +2008-09-09 Matthias Clasen + + Bug 551228 – G_STRFUNC on recent Sun compiler should be expanded to + __func__ rather than '???' + + * glib/gmacros.h: Don't use glibconfig.h defines in gmacros.h, + as the comment up top says. Instead look at __STDC_VERSION__. + Problem reported by Lin Ma. + +2008-09-09 Matthias Clasen + + Bug 523463 – Core dump in gmain.c:2482:IA__g_main_context_check() + + * glib/gmain.c (g_main_context_check): Be robust against setting + event fields on the fly, as e.g. happens in linc. Tracked down + by Paul Smith, fix proposed by Owen Taylor. + +2008-09-08 Christian Dywan + + Bug 550433 – g_test_init doesn't recognize --help + + * glib/gtestutils.c (parse_args): Add detailed --help output + +2008-09-02 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.18.0 === + +2008-09-02 Ryan Lortie + + Bug 549771 – improved .gitignore for glib + + * docs/reference/.gitignore: + * docs/reference/gio/.gitignore: + * docs/reference/gobject/tmpl/.gitignore: + * gio/.gitignore: + * gio/tests/.gitignore: + * glib/.gitignore: + * glib/libcharset/.gitignore: + * glib/tests/.gitignore: + * gmodule/.gitignore: + * gobject/.gitignore: + * gobject/tests/.gitignore: + * po/.gitignore: + * tests/.gitignore: new files + * .gitignore: remove 'build' (since it's part of glib now), add more + useful things. + +2008-09-02 Matthias Clasen + + * NEWS: Updates + + * configure.in: Bump version to 2.18.0 + +2008-09-02 Matthias Clasen + + Bug 550104 – trivial documentation fix for g_get_home_dir + + * glib/gutils.c (g_get_home_dir): Fix up the docs. + +2008-09-02 Michael Natterer + + * glib/gchecksum.c (g_checksum_reset): add + g_return_if_fail (checksum != NULL) + +2008-09-01 Paolo Borelli + + Bug 550040 - Move GString, rand and printf tests to the unit test + framework + + * tests/printf-test.c: + * tests/rand-test.c: + * tests/string-test.c: + Removed + + * glib/tests/printf.c: + * glib/tests/rand.c: + * glib/tests/string.c: + Added + + * tests/Makefile.am: + * glib/tests/Makefile.am: + Updated for the above + +2008-08-31 Emmanuele Bassi + + Bug 550096 – GBookmarkFile parser is not forward compatible + + * glib/gbookmarkfile.c: + (parse_bookmark_element), (parse_application_element), + (parse_mime_type_element), (parse_icon_element): Relax the + attributes checking of the GBookmarkFile parser for the + attributes that the desktop bookmark file specification + defines and controls. This allows adding new attributes to + the existing elements in newer versions without breaking the + parser in older ones. + +2008-08-28 Ryan Lortie + + Fixup for test case in previous commit. + + * glib/tests/strfuncs.c: don't fail if we can't open the test data. + This happens if $(builddir) != $(srcdir) (like when doing 'make + distcheck'). Quick workaround for now until #549783 can be fixed. + +2008-08-28 Ryan Lortie + + Bug 548612 – g_strstr_len() should use memmem when available + + * glib/gstrfuncs.c (g_strstr_len): fix off-by-one memory access error + * glib/tests/strfuncs.c (test_bounds): add some new test cases that + would catch problems like this + * glib/tests/4096-random-bytes: test data for the previous + * glib/tests/Makefile.am: add previous to EXTRA_DIST + +2008-08-28 Ryan Lortie + + [REVERT] Bug 548612 – g_strstr_len() should use memmem when available + + * configure.in: + * glib/gstrfuncs.c (g_strstr_len): revert use of memmem (see bug) + +2008-08-28 Matthias Clasen + + * configure.in: Change libselinux detection to not link libglib + against it. + +2008-08-28 Michael Natterer + + * glib/gstrfuncs.c (g_parse_long_long): make "endptr" const since + it's always a pointer into the const string passed. Remove some + casting to (gchar*) in this function. + + (g_ascii_strtoull) + (g_ascii_strtoll): cast "endptr" to (const gchar**) here when + passing it to above function. + +2008-08-28 Bastien Nocera + + Bug 548612 – g_strstr_len() should use memmem when available + + * glib/tests/strfuncs.c (test_strstr): + * tests/string-test.c (main): Patch by Paolo Borelli + to move the tests to the right place, + and add more tests + + * glib/gstrfuncs.c (g_strstr_len): Fix problem with memmem ignoring + nul-terminators in strings, and using the haystack_len instead + +2008-08-28 Bastien Nocera + + Bug 548612 – g_strstr_len() should use memmem when available + + * configure.in: detect whether memmem is available in the C library + * glib/gstrfuncs.c (g_strstr_len): use memmem for g_strstr_len() if + available in it's available, as it could be optimised by the C library + * tests/string-test.c (main): Add a few tests for g_strstr_len() + +2008-08-27 Tor Lillqvist + + * glib/giowin32.c: Stylistic changes. Plug an unlikely memory leak + that occurred in create_thread() if closing the thread handle + failed. Add more error messages to g_io_win32_free() that are + printed only when debugging. Plug handle leak, a socket channel's + event was never closed. + +2008-08-27 Tor Lillqvist + + * config.h.win32.in: Should not define HAVE_DIRENT_H when + compiling with MSVC, as the only file which checks HAVE_DIRENT_H + is gdir.c, and that includes the dirent.h and wdirent.c from + build/win32/dirent explicitly anyway when being compiled with + MSVC. + +2008-08-22 Björn Lindqvist + + Bug 523939 – Example program for GValue + + * gobject/gvalue.c: Add code example that demonstrates GValue's + features. + +2008-08-21 Tor Lillqvist + + * glib/giowin32.c: Minor comment improvements. Improve run-time + warning messages. Drop some #if 0 code. Don't bother compiling the + binary compatibility g_io_channel_win32_new_stream_socket() + function that has not been mentioned in any header since 2.0 on + Win64. + + * glib/glib.symbols: Mark it, too, private, and don't export it on + Win64. + +2008-08-21 Tor Lillqvist + + * glib/gmain.c: Rework the g_poll() implementation on Windows to + match poll() semantics more closely. This makes the test program + in bug #468910 behave better and doesn't seem to break anything + else. + + If polling several GPollFDs, i.e. messages and/or waitable + handles, first check if one or several of them are in the + signalled state right away, with timeout zero. Return indication + for all that are in that case. To check if several handles are + signalled, we have to call the WaitForMultipleObjectsEx() function + repeatedly, each time removing the handle it indicated was + signalled last time, until WAIT_TIMEOUT is returned. + + If not, then poll with timeout and indicate only the single one + that the Win32 wait function tells us as before. + + Remove unnecessary ifdefs, as we always have G_MAIN_POLL_DEBUG + defined on Windows. + + Initialise g_main_poll_debug in g_main_context_new() so we have it + before testing it in one case. + + Don't put several copies of a handle in the array of handles to + wait for. The documentation says this is not allowed, although it + did seem to work fine in practise. But do as the documentation + says anyway. + +2008-08-20 Tor Lillqvist + + Bug 500246 - Bug fixes for giowin32 + + * glib/giowin32.c (read_thread) (write_thread): Change the nbytes + variables to signed. + (g_io_channel_win32_make_pollfd): Fix an obvious error in the file + descriptor case leftover after the patch from bug #333098 on + 2006-03-02. Thanks to Marcus Brinkmann. + +2008-08-20 Tor Lillqvist + + Bug 324234 - Using g_io_add_watch_full() to wait for connect() to + return on a non-blocking socket returns prematurely + + Bug 548278 - Async GETs connections are always terminated + unexpectedly on Windows + + * glib/giowin32.c: Add one more state variable to the + GIOWin32Channel struct, ever_writable. Initialise it to FALSE, set + to TRUE when the WSAEventSelect() indicates FD_WRITE, and never + reset to FALSE. + + Don't do the WSASetEvent() in g_io_win32_prepare() unless + ever_writable is TRUE. Don't automatically indicate G_IO_OUT in + g_io_win32_check() unless ever_writable is TRUE. + + This fixes the behaviour of the test case program in bug #548278, + and the "Testcase for the spurious OUT event bug" in bug + #324234. It also doesn't seem to break anything. Not that there is + any exhaustive test suite... + + Add a comment with a list of bugs that are related to the code in + this file. + +2008-08-18 Matthias Clasen + + * configure.in: Bump version + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +2008-08-17 Sven Neumann + + * NEWS: mention GWinHttpVfs. + +2008-08-16 Matthias Clasen + + * NEWS: Updates + +2008-08-15 12:41:26 Tim Janik + + * glib/gtestutils.c: changed assertion messages, so older emacsen + can also detect failing source file and line, fixes: + Bug 502498 – Test framework assertion failures should follow gcc error format + +2008-08-14 Matthias Clasen + + Bug 547832 – gtk+-2.12.11 fails to build - AC_PROG_MMAP too strict, + and unnecessary + + * configure.in: Be a little bit more forgiving when checking + for mmap. Patch by Peter O'Gorman + +2008-08-13 Matthias Clasen + + Bug 547337 – G_DISABLE_DEPRECATED breaks tests build + + * tests/testglib.c: Protect deprecated API by ifdefs. + Patch by Kalle Vahlman + +2008-08-13 Matthias Clasen + + Bug 547637 – unconditional #include of sys/statfs.h in configure + impedes detection of statfs things if non-existant + + * configure.in: Protect the statfs.h include by guards. + +2008-08-12 Federico Mena Quintero + + * glib/gi18n-lib.h: In the #error about having to define + GETTEXT_PACKAGE, add a hint about a possibly-missing config.h. + +2008-08-11 Behdad Esfahbod + + Bug 547200 – g_utf8_find_next_char() issues + + * glib/gutf8.c: Improve wording about @end arguments in str funcs. + +2008-08-10 Behdad Esfahbod + + * glib/gutf8.c: Fix docs to use "nul-terminated" consistently. + +2008-08-08 Ryan Lortie + + Fix 'fail' markup test cases to -not- be valid XML 1.1. + + * tests/markups/fail-32.gmarkup: change  to � since the + former is no longer a failure. + +2008-08-08 Ryan Lortie + + Bug 546876 - Modify GMarkup parser to accept  ..  + + * glib/gmarkup.c: previously the parser only accepted character + references for \t \n and \r (as per XML 1.0); now it accepts all + of  .. . + +2008-08-07 Tor Lillqvist + + * configure.in: Output comment clarifying GPid semantics to + glibconfig.h. + + * glibconfig.h.win32.in: Ditto here. + +2008-08-04 Matthias Clasen + + Bug 546329 – API docs for g_utf8_normalize() are incorrect + + * glib/gunidecomp.c: Remove inaccurate information about + g_utf8_collate() from g_utf8_normalize() docs. + Pointed out by Sven Neumann. + +2008-08-04 Tor Lillqvist + + * glibconfig.h.win32.in: Make the union _GSystemThread::data array + 8 bytes on Win64. Not that it matters as the union contains a + pointer also anyway, but for equivalence with the configure- + generated glibconfig.h + +2008-08-04 Tor Lillqvist + + * glib/gmain.c (g_get_current_time): MSDN says: "Do not cast a + pointer to a FILETIME structure to either a LARGE_INTEGER* or + __int64* value because it can cause alignment faults on 64-bit + Windows." So don't do that then. Indeed the code did work randomly + on Win64 when compiled with optimisation. + +2008-08-04 Tor Lillqvist + + * glib/giowin32.c + * glib/gmain.c + * glib/gspawn-win32.c + * glib/gspawn-win32-helper.c: Change gssize casts introduced on + 2008-07-28 to gintptr casts now that we have that. gssize is as + such the same as gintptr on both 32- and 64-bit Windows, but the + gintptr name indicates that it is used to hold pointers, i.e. also + HANDLEs. + + * tests/testglib.c: Avoid warning on Win64 by using gintptr cast + instead if long cast. + +2008-08-04 Matthias Clasen + + * configure.in: Bump version + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.17.5 === + + * NEWS: Updates + +2008-08-02 Tor Lillqvist + + * glibconfig.h.win32.in: Add gintptr and guintptr typedefs here, + too, appropriately ifdeffed for 32/64 bit, gcc/MSVC. Add 64-bit + versions of GPOINTER_TO_INT(), GPOINTER_TO_UINT() and vice versa, + too. + +2008-08-01 Matthias Clasen + + * NEWS: Updates + +2008-08-01 Matthias Clasen + + Bug 545798 – "Since: 2.18" mark is missing in g_set_error_literal + documentation + + * glib/gerror.c (g_set_error_literal): Add a Since: marker. + Pointed out by Kouhei Sutou + +2008-07-30 Tor Lillqvist + + Bug 545485 - Implicit declaration of utime() + + * glib/gstdio.c: Include on POSIX. + +2008-07-28 Tor Lillqvist + + * configure.in: Output to glibconfig.h typedefs for gintptr as the + signed integer type that can hold a pointer, and guintptr as the + corresponding unsigned type. These types are portable equivalents + to intptr_t and uintptr_t which are not available in all + compilers. + + For all current platforms, they will presumably end up as the same + types as gssize and gsize, but in theory size_t can be smaller + than intptr_t. Also, the intended use case for gintptr and + guintptr is different from that of gssize and gsize. As the name + indicates, gintptr is for when one wants an integer type that can + hold a pointer, and gsize is for when one wants an integer type + that can hold the value of the sizeof operator. + +2008-07-28 Matthias Clasen + + Bug 544465 – gmarkup makes it hard to use pre-rolled parsers + + * glib/glib.symbols: + * glib/gmarkup.[hc]: Add g_markup_context_get_user_data. + Patch by Ryan Lortie + +2008-07-28 Tor Lillqvist + + * glib-zip.in: Message catalogs should always get installed into + share/locale nowadays, don't bother with the convoluted logic + checking if they are in lib/locale instead. Put the correct helper + programs in the zipfile. + +2008-07-28 Tor Lillqvist + + Fix problems on 64-bit Windows. Avoid warnings, some of which + indicated actual problems, some which were just annoyances. + + Where casts to an integer type are needed for pointers, use + gssize. Technically intptr_t would be the more proper type, but we + still want to be compilable with MSVS6 and 7 which don't have + intptr_t. MSVS8 and 9 do have intptr_t, but in , not + . + + Use %p to print out handles. Use gssize casts when assigning + GPollFD::fd fields. + + Use G_GSIZE_FORMAT when printing size_t values. + + * configure.in: Define automake conditional G_OS_WIN32_X64 which + is true on Win64. + + * glib/giochannel.h: Use slightly different prototype for + g_io_channel_win32_new_messages() on Win64 with gsize instead of + guint. + + * glib/giowin32.c + * glib/gmain.c + * glib/gspawn-win32.c + * tests/testglib.c: Generic changes as described above. + + * glib/gmain.h: Don't bother mentioning GIMP in comment. + + * glib/grel.c (tuple_hash_2): Use all bits of pointer. + + * glib/gspawn-win32.c + * glib/gspawn-win32-helper.c: Use gssize types in the + communication between parent and helper process, so that we can + pass process handles, which are pointers, also on Win64. + + * glib/gtimer.c (g_time_val_to_iso8601): time_t is 64 bits on + Win64 so we can't pass the address of a GTimeVal::tv_sec which is + a long directly to gmtime(). On the other hand, changing + GTimeVal::tv_sec to be a gint64 on Win64 is not really feasible + either, as that would then require changes in much code that uses + GTimeVals. + + * glib/gspawn-win32.c + * glib/Makefile.am: Call the helper programs + gspawn-win64-helper.exe and gspawn-win64-helper-console.exe on + Win64, to avoid potential risk of running a 32-bit version of the + helper. + +2008-07-27 Tor Lillqvist + + * glib/glib.symbols + * glib/gconvert.c + * glib/gdir.c + * glib/gfileutils.c + * glib/giowin32.c + * glib/gspawn-win32.c + * glib/gutils.c + * glib/gwin32.c: Bypass the Windows "ABI compatibility" symbols on + _WIN64. As there hasn't been any widely deployed 64-bit Windows + builds of the really old GLib (pre-2.8.1) versions those refer to, + there is no need to have the "ABI compatibility" versions in the + DLL. + + * glib/makegalias.pl: Handle #ifndef _WIN64: Just output it, too. + +2008-07-27 Tor Lillqvist + + * configure.in: Set LIB_EXE_MACHINE_FLAG to either X86 or X64 on + Windows. AC_SUBST it. + + * glib/Makefile.am (glib-2.0.lib): Pass appropriate -machine flag + to lib.exe. + +2008-07-25 15:47:08 Tim Janik + + * glib/tests/testing.c (test_random_conversions): added new sample + test to prepare for extended range random tests. + +2008-07-24 Tor Lillqvist + + * glib/gdir.c: Include for FILENAME_MAX on newer mingw + installations. + +2008-07-24 Tor Lillqvist + + * glib/gslice.c (smc_notify_free): Use G_GSIZE_FORMAT instead of + the C99 "zu". + +2008-07-24 Tor Lillqvist + + * configure.in: Must output the GLIB_USING_SYSTEM_PRINTF to + glibconfig.h using the same two phase code as for the other + defines in it. Can't check enable_included_printf directly in the + shell code that is the first argument to AC_CONFIG_COMMANDS(). + + Preset glib_cv_stack_grows=no on Windows to help + cross-compilation. + + * configure.in: Enhancements for 64-bit Windows: + + Handle also size_t being larger than long. It is long long + a.k.a. __int64 on the LLP64 Win64. + + Set glib_void_p and glib_long correctly. Their assignments were + crossed. It hasn't mattered on LP64 platforms like all (?) 64-bit + UNIXes, but on the LLP Win64 it was wrong. + + * glibconfig.h.win32.in: Check also _WIN64. + +2008-07-24 Tor Lillqvist + + * glibconfig.h.win32.in: Patch for 64-bit Windows from Richard + Hult. + +2008-07-23 Matthias Clasen + + 544088 – option_test_LDADD is left in tests/Makefile.am + + * tests/Makefile.am: Remove leftovers. + Noticed by Hiroyuki Ikezoe + +2008-07-22 Mathias Hasselmann + + Set LANG variable for group caption tests to get reproducable results. + + * glib/tests/option-context.c (group_captions()): + Set LANG variable to C in the forked process to get reproducable. + Don't silence the forked process in --verbose mode to support + debugging. + +2008-07-21 Matthias Clasen + + * configure.in: Fix detection of struct statfs fields. + +2008-07-21 Matthias Clasen + + * configure.in: Bump version + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + + * configure.in: Bump version + + * NEWS: Updates + +2008-07-21 Emmanuele Bassi + + * glib/gtimer.c (g_time_val_to_iso8601): Use the right format + string to get leading zeros when converting to ISO 8601. (Sven + Herzberg) + +2008-07-21 Emmanuele Bassi + + * glib/gbookmarkfile.c: + (bookmark_app_info_new): Do not set the timestamp value + using time(), as it will be overwritten anyway. (#535223, + Michael Meeks) + + (parse_application_element), + (bookmark_app_info_dump): Support the "modified" attribute, + which takes an ISO-formatted string instead of a Unix time + stamp, to keep the number of g_strdup_printf() calls to a + minimum. + + * glib/gtimer.c: + (g_time_val_to_iso8601): Do not use strftime(): we know + the format and contents of the ISO 8601 date format we + use. + + * tests/bookmarks/valid-03.xbel: Add a test file for the + modified attribute. + +2008-07-19 Matthias Clasen + + * glib/tests/Makefile.am: + * glib/tests/array-test.c: Move array tests here. + + * tests/Makefile.am: + * tests/array-test.c: Removed. + +2008-07-20 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_prepare): Patch from Yu Kuan that + makes watched sockets behave much better. See gtk-devel-list + archives from May for the (unfortunately rather meager) + discussion. This patch fixes the presented simple test program, + which reasonably could be expected to work. + +2008-07-18 Matthias Clasen + + * NEWS: Updates + +2008-07-18 Matthias Clasen + + Bug 536996 – Missing noop i18n macro equivalent to C_ + + * glib/glib.symbols: + * glib/gstrfuncs.[hc]: Add g_dpgettext2() which is a + variant of g_dpgettext() taking context and id as separate + arguments. + + * glib/gi18n-lib.h: + * glib/gi18n.h: Add an NC_() macro that is to C_() as N_() + is to _(). + +2008-07-18 Matthias Clasen + + * tests/Makefile.am: + * tests/keyfile-test.c: + * tests/option-test.c: Remove + * glib/tests/option-context.c: Add all GOptionContext tests here. + * glib/tests/keyfile.c: Add all GKeyFile tests here. + +2008-07-16 Matthias Clasen + + Bug 334234 – "printf" format error + + * glib/gslice.c (mem_error): Avoid a warning when printing a pid_t. + Pointed out by Morten Welinder. + +2008-07-16 Matthias Clasen + + Bug 406120 – g_ascii_strtod + + * glib/gstrfuncs.c (g_ascii_strtod): Document that this + function does accept localized infinities and nans. Reported + by Morten Welinder. + +2008-07-16 Matthias Clasen + + Bug 482413 - get_contents_stdio -- overflow and memory corruption + + * glib/gfileutils.c (get_contents_stdio): Detect overflow and + error out. Reported by Morten Welinder. + +2008-07-16 Matthias Clasen + + Bug 542332 – small fix for error message in GMarkup + + * glib/gmarkup.c: Improve an error message. + Patch by Ryan Lortie + +2008-07-14 Matthias Clasen + + Bug 428048 – 2 of 51 tests fail on Solaris + + * tests/iochannel-test.c: Ignore the error if iconv doesn't + support EUC-JP. + +2008-07-14 Matthias Clasen + + * tests/option-test.c: Print error messages when something fails. + +2008-07-14 Matthias Clasen + + Bug 467707 – test_iconv_state() in tests/convert-test.c fails on AIX 5.3 + + * tests/convert-test.c (test_iconv_state): Skip this test if + CP1255 is not supported. + +2008-07-10 Ryan Lortie + + * docs/reference/glib/glib-sections.txt: + * glib/glib.symbols: + * glib/gmarkup.c: + * glib/gmarkup.h: add functions g_markup_parse_context_{push,pop} in + order to provide some small hooks on which to build easy-to-use + subparsers. + + * glib/tests/Makefile: add new test + * glib/tests/markup-subparser.c: new test for subparsers + + Fixes bug #337518. + +2008-07-05 Matthias Clasen + + Bug 528317 – GRegex does not allow recursion limit + + * glib/pcre/Makefile.am: Set a sane default recursion limit + of 8192 instead of 1000000. + Patch by Mart Raudsepp. + +2008-07-04 Behdad Esfahbod + + Bug 541507 – Ambiguous description of assigned characters in the Glib + Unicode Manipulation reference + + * glib/guniprop.c + (g_unichar_isgraph): Return true for PrivateUse too. + (g_unichar_isprint): Return true for PrivateUse too. + (g_unichar_isdefined): Return false for Surrogate. + +2008-07-04 Michael Natterer + + Bug 541208 – Functions to easily install and use signals without + class struct slot + + * tests/gobject/override.c: added tests for the new gsignal + overriding and chaining APIs. + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-07-02 Matthias Clasen + + * configure.in: Better endianness fix. From Tomas Mraz. + +2008-07-02 Matthias Clasen + + * NEWS: Updates + +2008-07-02 Colin Walters + + * gio/gcontenttype.c: Use UNLOCK to unlock, not LOCK. + +2008-07-02 Matthias Clasen + + * configure.in: Add a check for structfs.f_bavail + +2008-07-02 Matthias Clasen + + * glib/gmain.c (g_get_current_time): Add a g_return_val_if_fail + check in both versions. Proposed by Patrik Olsson in bug 540545. + +2008-07-02 Matthias Clasen + + * configure.in: Workaround AC_C_BIGENDIAN breakage in autoconf 2.61. + Add a _cv_ to some variable names, since autoconf wants it. + +2008-06-30 Matthias Clasen + + * glib/pcre/pcre_compile.c: Apply fix for CVE-2008-2371 to + fix a heap-based buffer overflow. + +2008-06-29 Björn Lindqvist + + Bug 539626 – Update docstrings for g_object_freeze_notify and + g_object_thaw_notify + + * gobject/gobject.c: Explain how the freeze count works. + +2008-06-26 Cody Russell + + * configure.in: Add #define GLIB_USING_SYSTEM_PRINTF + to glibconfig.h, which specifies if GLib is using + the system printf functions for g_print*(). + (#539999, by Tim-Philipp Müller) + +2008-06-24 Paolo Borelli + + Bug 539770 - migrate gstrfunc unit tests to gtest + + * tests/strfunc-test.c: + * tests/testglib.c: + * tests/strtoll-test.c: + * tests/strtod-test.c: + * tests/string-test.c: + * tests/Makefile.am: + Removed old tests. + + * glib/tests/fileutils.c: + * glib/tests/strfuncs.c: + * glib/tests/Makefile.am: + Added all the old tests migrated to the new unit test framework + and add new unit tests for some of the functions. + +2008-06-23 Kristian Rietveld + + * gobject/glib-mkenums.in: introduce an ENUMPREFIX substitution. + + * gio/gioenumtypes.h.template: use @ENUMPREFIX@ instead of + hard coding "G" as prefix. + +2008-06-22 Stefan Kost + + * glib/gurifuncs.c: + Fix markup in comment. + +2008-06-21 Johan Dahlin + + * *.[ch]: Include "config.h" instead of + Command used: + find -name \*.[ch]|xargs perl -p -i -e 's/^#include /#include "config.h"/g' + Rubberstamped by Mitch + +2008-06-20 Sebastian Dröge + + Bug 316221 - G_LOCK warns about breaking strict-aliasing rules + + * configure.in: + * glib/gthread.h: Revert previous patch as it doesn't improve the + situation and results in other warnings. + +2008-06-16 Christian Persch + + Bug 539123 – annotate g_d[n]gettext with G_GNUC_FORMAT + + * glib/gstrfuncs.h: + * glib/glib.symbols: Annotate some functions with G_GNUC_FORMAT. + +2008-06-19 Tor Lillqvist + + Bug 539074 - Cannot get exit status with g_spawn_command_line_sync() + + * glib/gspawn-win32-helper.c (main): Write also the exit status of + the spawned process to the error report pipe. Patch by Hiroyuki + Ikezoe. + +2008-06-19 Matthias Clasen + + Bug 535949 – annotate g_strip_context and g_dpgettext with + G_GNUC_FORMAT + + * glib/gstrfuncs.h: + * glib/glib.symbols: Annotate some functions with G_GNUC_FORMAT. + Patch by Christian Persch + +2008-06-19 Matthias Clasen + + Bug 539067 – The document g_io_channel_win32_new_fd() says that "Your + code should call only g_io_channel_read()." but gio_channel_read() is + deprecated + + * glib/giochannel.h: Fix a reference in a comment + Patch by Hiroyuki Ikezoe + +2008-06-18 Matthias Clasen + + Bug 537635 – Corrections and improvements to + g_time_val_from_iso8601()/g_time_val_to_iso8601() + + * glib/gtimer.c (g_time_val_from_iso8601): set tv_usec to 0 rather + than 1 when a fraction of a second is not specified + (g_time_val_from_iso8601): calculate a fraction of a second + correctly even in case it does not happen to consist of exactly + six digits; do not allow random data after the ISO 8601 string, + only whitespace + (make g_time_val_to_iso8601): support fractions of a second + Patch by Peter Kjellerstedt + + * tests/testglib.c: Update to match + +2008-06-16 Christian Persch + + * glib/gbookmarkfile.c + * glib/gconvert.c + * glib/gfileutils.c + * glib/giochannel.c + * glib/giounix.c + * glib/giowin32.c + * glib/gkeyfile.c + * glib/gregex.c + * glib/gshell.c + * glib/gspawn-win32.c + * glib/gutf8.c: Use g_set_error_literal where appropriate. Patch from + bug #535947. + +2008-06-16 Christian Persch + + * docs/reference/glib/glib-sections.txt: + * glib/gerror.c: + * glib/gerror.h: + * glib/glib.symbols: Add g_set_error_literal. Bug #535947. + +2008-06-16 Michael Natterer + + * glib/goption.c (dgettext_swapped): changed return value to + const gchar* to fix warning. + +2008-06-14 Matthias Clasen + + * glib/gtestutils.c: Move docs around + + * glib/gchecksum.h: Add docs. + +2008-06-13 Matthias Clasen + + Bug 538119 – glib's mainloop leaks a pipe to sub-processes + + * glib/gmain.c (g_main_context_init_pipe): Don't leak the + pipes to child processes. Patch by Thiago Macieira. + +2008-06-13 Hans Breuer + + * glib/gstrfuncs.c : to get the default translation target on + win32 use g_win32_get_locale() instead of setlocale(LS_MESSAGES,NULL) + Fixes bug #538044 + + * glib/makefile.msc.in gio/makefile.msc : updated + +2008-06-12 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.17.2 === + + * configure.in: Fix LINGUAS conversion + +2008-06-12 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.17.1 === + +2008-06-12 Matthias Clasen + + * glib/gtestutils.c: Documentation fixups + +2008-06-11 Matthias Clasen + + * glib/glist.c: Tiny doc fix + +2008-06-11 Matthias Clasen + + * NEWS: Updates + +2008-06-11 Behdad Esfahbod + + Bug 503071 – Application direction changes to right to left even if + theres no translation + + * glib/gi18n-lib.h: + * glib/glib.symbols: + * glib/gstrfuncs.h: + * glib/gstrfuncs.c: + Add new functions g_dgettext() and g_dngettext(). + + * glib/gutils.c (glib_gettext): + * glib/gfileutils.c (g_format_size_for_display): + * glib/goption.c (dgettext_swapped): + Use the new functions. + +2008-06-11 Matthias Clasen + + Bug 502511 – g_assert_cmphex prints invalid message + + * glib/gtestutils.c (g_assertion_message_cmpnum): Actually print + hex numbers in hex. + Pointed out by Tor Lillqvist + +2008-06-11 Matthias Clasen + + Bug 338162 – [PATCH] Use po/LINGUAS + + * po/LINGUAS: New file + * po/Makefile.in.in: Dist LINGUAS + * configure.in: Use po/LINUAS + Patch by Thomas Andersen + +2008-06-11 Matthias Clasen + + Bug 314453 – Nautilus crashes in Solaris when browsing the attached + file + + * glib/gunicollate.c (g_utf8_collate_key): Handle strfxrm returning + -1 a little better. Problem pointed out by Takao Fujiwara + +2008-06-11 Matthias Clasen + + Bug 529321 – make check fails in glib/pcre + + * glib/pcre/Makefile.am: include Makefile.decl to fix 'make check'. + Patch by Hiroyuki Ikezoe + +2008-06-11 Tor Lillqvist + + * glib/giowin32.c: g_win32_error_message() works fine for the + Winsock WSA* error codes, too, so drop the winsock_error_message() + function. + +2008-06-11 Matthias Clasen + + Bug 455215 – g_get_user_special_dir: no reference about + G_USER_DIRECTORY_DOWNLOAD fallback to $HOME/Desktop if + xdg-user-dirs is not in use + + * glib/gutils.c (g_get_user_special_dir): Improve the docs. + Proposed by Luca Ferretti + +2008-06-11 Matthias Clasen + + Bug 498732 – g_key_file_to_data cannot fail + + * glib/gkeyfile.c (g_key_file_to_data): Improve the docs. + Proposed by Christian Persch + +2008-06-11 Ross Burton + + Bug 511367 - add g_file_make_directory_with_parents. + + * gio/gfile.c: + * gio/gfile.h: + * gio/gio.symbols: Add g_file_make_directory_with_parents. + +2008-06-11 Sebastian Dröge + + Bug 531900 – Use __builtin_offsetof for G_STRUCT_OFFSET if building + with gcc 4.0 or newer + + * glib/gmacros.h: Use __builtin_offsetof for G_STRUCT_OFFSET if + building with gcc 4.0 or newer. + +2008-06-11 Tor Lillqvist + + * glib/gmain.c + * glib/gspawn.c: Clarify what a "child pid" is in the doc + comments. + +2008-06-10 Matthias Clasen + + Bug 536158 – also bump GHashTable version when a node is removed via + g_hash_table_iter_remove()/g_hash_table_iter_steal() + + * glib/ghash.c (iter_remove_or_steal): Bump the hash table + version. Patch by Jean-Yves Lefort + +2008-06-07 Tor Lillqvist + + * glib/gstdio.c (g_access): Define X_OK if necessary (MSVC). + +2008-06-02 Yevgen Muntyan + + Bug 531403 – g_utf8_collate broken on Mac. + + * glib/gunicollate.c: (g_utf8_collate): use UCCompareTextDefault; + (collate_key_to_string), (carbon_collate_key_with_collator), + (carbon_collate_key), (carbon_collate_key_for_filename): new + functions using Carbon API to get collate key for g_utf8_collate_key() + and g_utf8_collate_key_for_filename(); + (g_utf8_collate_key), (g_utf8_collate_key_for_filename): use those. + +2008-05-30 Michael Natterer + + Bug 535628 - test/patterntest.c still includes gpattern.h + directly. + + * tests/patterntest.c: don't include "glib/gpattern.h" directly. + Patch from Hiroyuki Ikezoe. + +2008-05-30 Tor Lillqvist + + Bug 535625 - alias.h:2648: error: 'utime' undeclared here (not in + a function) + + * glib/glib.symbols: Move g_utime inside #if !defined(G_OS_UNIX) + || defined(G_STDIO_NO_WRAP_ON_UNIX). + +2008-05-30 Tor Lillqvist + + * glib/gstdio.c (g_access) [Win32]: Mask out X_OK to avoid problem + on Vista. X_OK was just ignored by access() in earlier Microsoft C + libraries. (Which is fine as executability has little meaning on + Windows.) The one on Vista returns an error if X_OK is passed. + +2008-05-29 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c: Add g_utime(). No need to include + in gstdio.h, just use a forward struct declaration. + + * glib/glib.symbols: Add it. + +2008-05-29 Tor Lillqvist + + * glib/gnulib/printf-args.c (printf_fetchargs): wint_t is short on + Windows, and gcc warns: "wint_t is promoted to int when passed + through ... (so you should pass int not wint_t to va_arg)." And + indeed g_print("%C", L'a') crashes. So do as gcc says then. + +2008-05-28 Michael Natterer + + * configure.in: add G_DISABLE_SINGLE_INCLUDES to CPPFLAGS + globally. + + * glib/tests/option-context.c + * glib/tests/testing.c + * tests/testingbase64.c: don't include + +2008-05-27 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.17.0 === + +2008-05-27 Matthias Clasen + + * README.in: Add a note about G_DISABLE_SINGLE_HEADERS. + + * NEWS: Updates + +2008-05-27 Matthias Clasen + + * tests/casemap.txt: + * tests/casefold.txt: Update for Unicode 5.1 + +2008-05-27 Matthias Clasen + + * Revert the patch for bug 527214 and related changes. GTimer + is supposed to work without threads. + +2008-05-27 simon.zheng + + * configure.in: Fix #533369. Check whether memeber statvfs.f_basetype + available or not. + +2008-05-27 Matthias Clasen + + * glib/pcre/*: Update to PCRE 7.7 + +2008-05-26 Matthias Clasen + + * glib/gchecksum.c: Add Since: tag to g_checksum_reset + + * glib/glib.symbols: Add g_checksum_reset + +2008-05-25 Matthias Clasen + + Bug 534137 – Typo in g_spawn_async_with_pipes doc + + * glib/gspawn.c: Fix a typo in the docs, pointed out by Ted Percival. + +2008-05-25 Tor Lillqvist + + Bug 534319 - GLib's .pc files could use Libs.private + + * glib-2.0-uninstalled.pc.in + * glib-2.0.pc.in + * gmodule-2.0-uninstalled.pc.in + * gmodule-2.0.pc.in + * gmodule-export-2.0.pc.in + * gmodule-no-export-2.0.pc.in: Move ICONV_LIBS and G_MODULE_LIBS + to Libs.private. + +2008-05-24 Matthias Clasen + + * glib/gfileutils.c (g_file_open_tmp): Small documention addition. + +2008-05-22 10:49:37 Tim Janik + + * glib/gmacros.h: implement G_STMT_START and G_STMT_END with + do{}while(0), which is believed to be widely portable, fixes: + Bug 519026 - G_STMT_START/G_STMT_END test a non-existent preprocessor symbol + +2008-05-20 Behdad Esfahbod + + Bug 501651 – Update glib/libcharset + + * configure.in: + * glib/libcharset/Makefile.am: + * glib/libcharset/README: + * glib/libcharset/codeset.m4: + * glib/libcharset/config.charset: + * glib/libcharset/glibc21.m4: + * glib/libcharset/libcharset-glib.patch: + * glib/libcharset/libcharset.h: + * glib/libcharset/localcharset.c (_g_locale_get_charset_aliases), + (_g_locale_charset_raw): + * glib/libcharset/localcharset.h: + * glib/libcharset/make-patch.sh: + * glib/libcharset/ref-add.sin: + * glib/libcharset/ref-del.sin: + * glib/libcharset/update.sh: + Update libcharset to the one shipped with libiconv-0.12. + +2008-05-20 Behdad Esfahbod + + Bug 459905 – Bug in wcwidth data + Bug 534085 – g_unichar_iswide_cjk() has a totally wrong table + * glib/guniprop.c (g_unichar_iswide), (g_unichar_iswide_cjk): + Regenrate wide and wide_cjk tables from Unicode 5.1.0 data directly. + Not using Markus Kuhn's tables anymore. + +2008-05-20 14:31:18 Tim Janik + + * reverted recent unapproved changes by Yair Hershkovitz, regarding: + Bug 503071 – Application direction changes to right to left even if theres no translation. + +2008-05-20 Tor Lillqvist + + * configure.in: Don't need memory barriers when using a non-gcc + compiler on Windows either. + +2008-05-19 Tor Lillqvist + + * glib/gdir.c: Include the dirent.h and wdirent.c from + ../build/win32/dirent directly here when compiling with MSVC and + without HAVE_DIRENT_H. + +2008-05-19 Hans Breuer + + * glib/makefile.msc : added gi18n.c + +2008-05-19 Tor Lillqvist + + * glib/Makefile.am: #define HELPER_CONSOLE in + gspawn-win32-helper-console.c + + * glib/gspawn-win32-helper.c: Compile a main() instead of + WinMain() if HELPER_CONSOLE is defined. MSVC insists on a console + application having a main(). + +2008-05-18 Matthias Clasen + + Bug 527214 – g_timer_elapsed() returns random values. + + * glib/gtimer.c (g_timer_new()): + Print warning if g_thread_init() has not been called yet. + Patch by Mathias Hasselmann + +2008-05-12 Jeffrey Stedfast + + * glib/gchecksum.c (g_checksum_reset): New function to reset the + state of a GChecksum. + (g_checksum_new): Call g_checksum_reset() instead of duplicating + code. + +2008-05-17 Matthias Clasen + + Bug 528667 – Typos in testing module documentation + + * glib/gtestutils.c: Fix typos in the documentation. + +2008-05-17 Tor Lillqvist + + * glib/giowin32.c: Make debugging printout more compact and add + more information to it. No changes to actual functionality. + + * glib/gmain.c: Improve debugging printouts. When + G_MAIN_POLL_DEBUG is defined, we check for an environment variable + of the same name to decide whether to print out debugging + information or not. G_MAIN_POLL_DEBUG is always defined on Windows + as there is more often a need to debug this stuff there. On Unix + the definition has to be uncommented (or done on the compile + command line). + +2008-05-17 Tor Lillqvist + + * build: Don't include the "build" module with svn:externals any + longer. Instead add the still relevant directories and files from + it for real here in GLib. + +2008-05-17 Yair Hershkovitz + + * glib/glib.symbols: + * glib/gi18n.h: Added g_disable_setlocale(). + + * glib/gi18n.c: Added g_disable_setlocale() API to disable setting + the locale in g_i18n_init(). Dont disable translations if textdomain + was not set before calling g_i18n_init(). Dont disable translations if + the locale is "C". + +2008-05-16 Tor Lillqvist + + * config.h.win32.in: Update to match the configure-produced one. + +2008-05-14 Michael Natterer + + * glib/gatomic.c: #include "config.h" before using G_ATOMIC_ARM. + +2008-05-13 Kjartan Maraas + + * glib/gi18n.c: #include to fix the build. + +2008-05-12 Yair Hershkovitz + + * glib/gi18n.c (g_i18n_init): Coding convention fix. Space between + a function name and its opening parenthesis. + +2008-05-12 Tor Lillqvist + + * glib/glib.symbols: Add g_i18n_init. + +2008-05-12 Tor Lillqvist + + Bug 530457 - G_USER_DIRECTORY_DOWNLOAD folder improperly mapped + + * glib/gutils.c (load_user_special_dirs): When running on Vista or + later, use SHGetKnownFolderPath() to get the FOLDERID_Downloads + folder for G_USER_DIRECTORY_DOWNLOAD, and FOLDERID_Public for + G_USER_DIRECTORY_PUBLIC_SHARE. + +2008-05-11 Yair Hershkovitz + + Bug 503071 - Application direction changes to right to left even if + theres no translation. + + * glib/gi18n.c: g_i18n_init() for initializing the glib i18n, + checking if a translation is available for the calling app. wrappers for + gettext, dgettext and dpgettext to check first if the application + should be translated. + + * glib/gi18n.h: symbol declaration for gettext wrappers. + + * glib/gi18n-lib.h: include gi18n.h instead of libintl.h. + + * glib/gstrfuncs.c: moved g_dpgettext() to glib/gi18n.c. + + * glib/gutils.c: use g_dgettext() instead of dgettext(). + + * glib/glibintl.h: include gi18n.h. + + * glib.symbols: added gettext wrappers. + + * glib/Makefile.am: added gi18n.c. + +2008-05-05 Michael Natterer + + * glib/glib.h: #define __GLIB_H_INSIDE__ around including + everything. + + * glib/*.h: check for that define instead of __G_LIB_H__ if + G_DISABLE_SINGLE_INCLUDES is defined. + + * glib/gdatasetprivate.h: #include instead of + + +2008-05-02 13:24:13 Tim Janik + + * glib/gmain.c: renamed GMainDispatch.dispatching_sources to be more + descriptive and distinguishable within the source file. + +2008-04-21 Tor Lillqvist + + Bug 528752 - Win32 build and SSL not working + + This bug report against libsoup points out an issue with the use + of bitfields in the GIOChannel struct that should really be taken + care of here in GLib. + + * configure.in: Add Autoconf variable GLIB_EXTRA_CFLAGS which will + contain the -mms-bitfields flag on Windows. + + * glib-2.0.pc.in: Add it to Cflags. + +2008-04-21 Tor Lillqvist + + * configure.in + * */Makefile.am: More work on enabling static building on + Windows. When building statically: Also define + GOBJECT_STATIC_COMPILATION in glibconfig.h so that also the + variables in gparamspecs.h get declared without any + dllimport/dllexport decorations. Don't install .def files which + obviously have no meaning for static libraries. Don't create MS + import libraries. Don't do any resource object files. + +2008-04-18 17:40:58 Tim Janik + + * tests/testglib.c: fixed gstdio.h include. + + * tests/Makefile.am: properly list testglib.c SOURCES. + +2008-04-17 Emmanuele Bassi + + * glib/gchecksum.c: + (sha_byte_reverse): Use the macro GLib provides for byte-swapping + as it can be optimized. + + (g_checksum_update): Fix a compiler warning. + +2008-04-15 Mukund Sivaraman + + * gio/gfile.c: Fixed typos in gtk-doc comments. + +2008-04-10 Mathias Hasselmann + + Bug 519137 – g_slice_dup macro needs cast for 64-bit platform + + * glib/gslice.h (g_slice_copy): Apply type casts needed + for proper compilation on 64-bit platforms. + +2008-04-09 Federico Mena Quintero + + * glib/gbookmarkfile.c (bookmark_metadata_free): Don't leak + the apps_by_name hash table if the applications list is empty. + +2008-04-08 Behdad Esfahbod + + * glib/gunicode.h: Add ISO 15924 code comments for new scripts. + +2008-04-07 Matthias Clasen + + Bug 491554 – Update to Unicode 5.1.0 + + * glib/gunichartables.h: + * glib/gunicode.h: + * glib/gunibreak.h: + * glib/gmirroringtable.h: + * glib/gscripttable.h: + * glib/gen-script-table.pl: Update to Unicode 5.1.0. Patch by + Behdad Esfahbod + +2008-04-07 Matthias Clasen + + Bug 526619 – make test-report crash + + * glib/gtester.c: Allocate enough space for argv. Patch by + Hiroyuki Ikezoe + +2008-04-04 Matthias Clasen + + * glib/gmain.c: Make the fix for bug 448943 work. + +2008-04-04 Tor Lillqvist + + * configure.in: Make sure we don't build both shared and static at + the same time on Windows. Put a #define for + GLIB_STATIC_COMPILATION into glibconfig.h in the static case, so + that the use of variables from libglib gets the GLIB_VAR macro in + gtypes.h automatically correct. This means that a shared and + static build of GLib can't be installed in the same prefix on + Windows, which sucks a bit. But with variables in the GLib API, + there isn't much we can do otherwise. The alternative would be to + force the developer who compiles against a statically built GLib + to use -DGLIB_STATIC_COMPILATION. + + * glibconfig.h.win32.in: Define GLIB_STATIC_COMPILATION here also, + if needed. + +2008-04-03 Tor Lillqvist + + * configure.in: Don't enforce shared library build only on + Windows. It might well make sense to build static libraries in + some use cases. + + * glib/gutils.c: Don't compile the DllMain if building libglib + statically. Also in that case don't return NULL from + _glib_get_installation_directory(), but return the installation + directory of the program's .exe file. + +2008-04-03 Tor Lillqvist + + Bug 525972 - UCS-4 not in the new win_iconv implementation + + * glib/win_iconv.c: Add UCS-4. Also add spelling of UCS-2 without + the hyphen. + +2008-04-03 Matthias Clasen + + Bug 448943 – g_timeout_add_seconds() problems + + * glib/gmain.c (g_timeout_set_expiration): Prevent expiration + time going negative. Reported by Cody Russell, analyzed by + Olivier Crete, patch by Sjoerd Simons. + +2008-04-03 Matthias Clasen + + Bug 525674 – A typo in gmarkup.c + + * glib/gmarkup.c (g_markup_parse_context_get_element_stack): Fix + the docs, reported by Hiroyuki Ikezoe + +2008-04-03 Matthias Clasen + + Bug 525732 – Error in documentation for g_list_first + + * glib/glist.c (g_list_first): Fix the docs, reported by + Salvatore Iovene + +2008-04-02 Tor Lillqvist + + Bug 524314 - g_convert() on Win32 implicitly converts full width + alphanumerics into half width + + * glib/win_iconv.c: Update from Yukihiro Nakadaira. Use + WC_NO_BEST_FIT_CHARS flag for WideCharToMultiByte() unless the + //translit flag was suffixed to the codeset name. + + * glib/gconvert.c: Include win_iconv.c earlier so that its + definition of WINVER before it includes is used. + +2008-03-31 Tor Lillqvist + + * glib/gmain.c (g_poll): Improve fix for #525192 below: Use + SleepEx() so that the sleep is alertable. Thanks to John + Ehresman. + +2008-03-31 Tor Lillqvist + + * glib/gwin32.c + (g_win32_get_package_installation_directory_of_module): Fix Cygwin + breakage. Patch by Lieven van der Heide. + +2008-03-31 10:39:17 Tim Janik + + * glib/gutils.h: reapply inlining fix from r6333 to fix: + Bug 522292 – Gives warnings in glib/gutils.h with GCC in C99 mode + and again: + Bug 315437 – extern inline -> static inline + +2008-03-31 Tor Lillqvist + + Bug 525192 - 100% CPU if run main loop with no IO sources + + * glib/gmain.c (g_poll) [Win32]: Patch by Neil Roberts. + +2008-03-30 Matthias Clasen + + * glib/gtester.c: Don't use ARG_MAX. (#522335, patch by + Samuel Thibault, adapted by Sebastian Dröge) + +2008-03-30 Matthias Clasen + + * glib/gmacros.h: Add macros wrapping the gcc alloc_size + function attribute. (#523019, Rodrigo Moya) + + * glib/gmem.h: + * glib/gslice.h: + * glib/gstrfuncs.h: Use the new attribute where appropriate. + +2008-03-30 Matthias Clasen + + * glib/glibintl.h: + * glib/gstrfuncs.c: + * glib/gutils.c: Simple fixes to help building GLib on + embedded systems without NLS. (#524350, Peter Kjellerstedt) + +2008-03-30 Matthias Clasen + + * glib/ghash.c: Fix the build with -DG_DISABLE_ASSERT. + (#525060, Arfrever Frehtes Taifersar Arahesis) + +2008-03-30 Matthias Clasen + + * glib/gthread.h: Replace occurrances of G_GNUC_PRETTY_FUNCTION + by G_STRFUNC. (#524344, Peter Kjellerstedt) + +2008-03-30 Matthias Clasen + + * glib/gtestutils.c: Fix a doc typo. (#524742, Hiroyuki Ikezoe) + +2008-03-22 Claudio Saavedra + + Bug 523877 – gbookmarkfile: avoid using g_string_append_printf() and + other optimizations + + * glib/gbookmarkfile.c: (bookmark_metadata_dump), + (bookmark_item_dump), (g_bookmark_file_dump), (expand_exec_line): + Replace all calls to g_string_append_printf with g_strconcat () or + g_string_append () where appropriate, to reduce the file creation time. + Also, use g_string_sized_new () with an appropriate buffer size instead + of g_string_new (NULL), to reduce time spent in memory reallocation. + (#523877, Claudio Saavedra, Emmanuele Bassi) + +2008-03-22 Emmanuele Bassi + + Bug 518160 - replace two g_strdup_printf calls in GBookmarkFile + + * glib/gbookmarkfile.c (is_element_full): Compare the fragments + instead of building two strings; this avoids two g_strdup_printf() + per namespaced element enountered. (#518160, Felix Riemann) + +2008-03-20 Alexander Larsson + + * configure.in: + Final fixes for struct statfs.f_fstypename checks (OpenBSD). (#521045) + Patch from ephraim_owns@hotmail.com + +2008-03-19 Tor Lillqvist + + Bug 523298 - win_iconv can't convert from UTF-8 to GB18030 (or vice versa) + + * glib/win_iconv.c: Fixes for code page 54936 (GB18030) + (mbtowc_flags): New function. Check if a code page is one of those + for which the dwFlags parameter to MultiByteToWideChar() must be + zero. Return 0 or MB_ERR_INVALID_CHARS. + (mbcs_mblen): New function for multi-byte (more than two bytes for + some characters) code pages. Only handles 54936 for now. + (make_csconv): Use it for 54936. + (kernel_mbtowc): Use mbtowc_flags(). + +2008-03-18 Sebastian Dröge + + Bug 522292 - Gives warnings in glib/gutils.h with GCC in C99 mode + + * glib/gutils.h: Use "__attribute__ ((__gnu_inline__))" for inlining + if either __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__ are defined. In + gcc version prior to 4.3 no correct C99-inline was implemented which + has semantic differences to GNU inline. + +2008-03-16 Tor Lillqvist + + * configure.in: Don't bother defining Autoconf variables for + glib.def, gmodule.def, gobject.def and gthread.def when this can + be handled easily in */Makefile.am which are the only files that + use them. Remove also TESTGMODULE_EXP which isn't used at all. + + * glib/Makefile.am: Corrsponding change. + +2008-03-14 Michael Natterer + + * glib/*.h: make it possible to disable single-file includes by + defining G_DISABLE_SINGLE_INCLUDES when building against GLib. + Approved by Tim Janik. + + * glib/glib.h: include . + + * glib/gi18n.h + * glib/gi18n-lib.h + * glib/gprintf.h: include so the above works when these + files are included without including first. + +2008-03-14 Alexander Larsson + + * configure.in: + Add required includes for f_fstypename member check. + +2008-03-14 Alexander Larsson + + * configure.in: + Added checks for FEN (Solaris File Event Notification) + +2008-03-13 Tor Lillqvist + + * glib-zip.in: Add lib/gio-2.0.lib and lib/gio-2.0.def. + +2008-03-12 Tor Lillqvist + + * configure.in: Expand gio/win32/Makefile. + +2008-03-12 Matthias Clasen + + * configure.in: Bump version to 2.17.0 + + * ChangeLog.pre-2-16: rotate ChangeLog + + * === branch for 2.16 === diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 new file mode 100644 index 0000000..f91ac7e --- /dev/null +++ b/ChangeLog.pre-2-2 @@ -0,0 +1,1502 @@ +Fri Dec 20 10:45:29 2002 Owen Taylor + + * === Released 2.2.0 === + + * INSTALL.in: --enable-included-printf, not --enable-trio. + (Matthias Clasen) + +Fri Dec 20 09:52:15 2002 Owen Taylor + + * INSTALL.in: Document --enable-trio, --disable-mempools, + --enable-debug. Include docs on cross compilation. + + * NEWS: Update. + + * configure.in: Version 2.2.0, interface age 0. + +Fri Dec 20 09:37:27 2002 Owen Taylor + + * gthread/gthread-impl.c (g_thread_init): Call g_main_thread_init() + after setting g_threads_got_initialized. (#101624, + Alceste Scalas, Sebastian Wilhelmi) + +Wed Dec 18 16:19:08 2002 Manish Singh + + * glib/gtypes.h: new endian asm for ia64 and x86_64, general + reorg and clean up. New implementation of GUINT16_SWAP_LE_BE_CONSTANT() + that should optimize better. (#101318) + +2002-12-17 Tor Lillqvist + + Improvement based on suggestion by Thorsten Maerz: + + * glib/giowin32.c (struct _GIOWin32Channel): Don't need thread_handle. + + (create_thread): We can close thread handle right away, it isn't + used for anything. + + (read_thread, select_thread): Thus, don't close it here. + + Fix #57690, partial fix for #57689: + + * glib/giowin32.c (g_io_win32_set_flags): Don't set the GError, + instead call g_warning(). + + (g_io_win32_fd_get_flags_internal): New function, sets the + is_readable, is_writeable and is_seekable flags based on the + actual access modes of the underlying Win32 HANDLE, by trying + Win32 ReadFile() and WriteFile() of zero bytes, and + PeekNamedPipe(). Should work for disk files and pipes. For devices + (consoles) unfortunately not. + + (g_io_win32_fd_get_flags): Don't set the + G_IO_FLAG_IS_{READ,WRITE}ABLE flags, g_io_channel_get_flags() + already does. Call g_io_win32_fd_get_flags_internal() to set the + is_* flags. + + (g_io_win32_msg_get_flags, g_io_win32_sock_get_flags): Splice the + generic g_io_win32_get_flags() into these specific functions, as + they need to do different things. Not implemented yet, though. + + (g_io_channel_win32_new_fd_internal): New function, to avoid + duplicate fstat() calls. Most code from g_io_channel_win32_new_fd() + moved here. Call g_io_win32_fd_get_flags_internal() to set the + is_* flags. + + (g_io_channel_win32_new_fd, g_io_channel_unix_new): Call + g_io_channel_win32_new_fd_internal(). + + (g_io_win32_no_seek): Remove. Don't set is_seekable for those + channel types. + +Mon Dec 16 17:31:50 2002 Owen Taylor + + * === Released 2.1.5 === + + * configure.in: Version 2.1.5, interface age 2. + + * NEWS: Updated. + +Mon Dec 16 14:58:33 2002 Owen Taylor + + * configure.in: Add a hack to mostly deal with + problems in support of -pthread and -lpthread; + pass -lpthread (for linux) or -Wc,-pthread (for + other platforms) to libtool when linking libgthread. + (#100697) + +2002-12-16 Tor Lillqvist + + * glib/gspawn-win32.c (do_spawn): Fix potential heap + corruption. Sometimes called g_free() on string literal. + +Sun Dec 15 19:51:58 2002 Owen Taylor + + * m4macros/glib-gettext.m4: AC_SUBST() DATADIRNAME, not + DATADIR. + +Sun Dec 15 19:22:58 2002 Owen Taylor + + * m4macros/glib-gettext.m4: Restore a missing AC_SUBST() + for DATADIRNAME. (Found by Kjartan Maraas) + +Sun Dec 15 11:24:29 2002 Owen Taylor + + * m4macros/glib-gettext.m4: Actually set INTLLIBS + when needed. (Reported by Tor Lillqvist) + +2002-12-15 Tor Lillqvist + + * glib/glib.def: Add g_rand_init. + + * config.h.win32.in: Slight update to match what is currently + produced by configure. + +Sat Dec 14 21:24:04 2002 Owen Taylor + + * glib/gutils.c (g_get_any_init): HP-UX 10 xshares the + same non-posix getpwuid_r signature as AIX. + (#100756, Kai Poitschke) + +Sat Dec 14 21:10:57 2002 Owen Taylor + + * glib/gthread.h: Mark the contents of the strucures + in this file /*< private >*/ + + * glib/gthread.[ch]: Rename the 'write' field of the + structure to 'have_writer' to avoid any possible + conflict with system headers. (#90549, Morten Welinder) + +Sat Dec 14 20:11:41 2002 Owen Taylor + + * glib/libcharset/{localcharset.[ch] libcharset-glib.patch} + glib/gutf8.c: Break _g_locale_charset() into two pieces + - a fast "raw" piece, and a slow "unalias pieces". + Always call the "raw" piece, and call the unalias bit + if it changes. Use a per-thread cache. (#79529) + +2002-12-15 Matthias Clasen + + * configure.in: Set TRIO_LIBS when building with trio. + + * glib-2.0.pc.in (Libs): Add @TRIO_LIBS@. + + * glib/trio/Makefile.am (libtrio_la_LIBADD): Use @TRIO_LIBS@. + + * glib/trio/glibtrio.h: New file, redefining all trio symbols to + fall into the _G/_g_ private glib namespace. + + * glib/trio/Makefile.am (libtrio_la_SOURCES): Add glibtrio.h + + * glib/trio/trionan.c: + * glib/trio/triostr.c: + * glib/trio/trio.c: Include glibtrio.h + + * glib/gprintfint.h: + * glib/trio/trionan.c: + * glib/trio/triostr.c: + * glib/trio/trio.c: Include glibtrio.h + +Fri Dec 13 17:10:21 2002 Manish Singh + + * glib/gscanner.c (g_scanner_unexp_token): Fix typo. Missing '%' + in my last commit. + +Thu Dec 12 23:08:29 2002 Owen Taylor + + Fixes from Johannes Stezenbach + + * configure.in: When adding extra libraries to $LIBS for + tests, always put them at the front, since that's how + they'll be used in the actual Makefiles. + + * configure.in: Add a couple of missing ','s in AC_LINK_IFELSE() + + * m4macros/glib-gettext.m4: Remove a stray setting of $LIBS. + +Thu Dec 12 20:46:26 2002 Owen Taylor + + * configure.in: Allow not setting glib_cv_long_long_format + when cross-compiling since we assume other things that + will cause us to pull in Trio anyways. + + * configure.in: long_long_format is always ll for trio. + + * configure.in: Error out if --disable-trio is specified + but the C library doesn't have the necessary features. + +2002-12-13 Matthias Clasen + + * glib/trio/Makefile.am (libtrio_la_LIBADD): Add -lm for pow(). + + * tests/string-test.c: Add a test for positional parameters in + g_snprintf(). + +Thu Dec 12 14:58:55 2002 Manish Singh + + * configure.in: pull in trio if host printf doesn't have a known + way of printing 64-bit ints. + + * glib/gmacros.h: remove extra whitespace at the end + + * glib/gscanner.c (g_scanner_unexp_token): use G_GUINT64_FORMAT + instead of hardcoding "%llu" + + * tests/testglib.c: remove obsolete conditionals using G_HAVE_GINT64, + we always have it now. + + * tests/type-test.c: same as above, and for G_G[U]INT64_FORMAT as + well. + +Thu Dec 12 13:52:58 2002 Owen Taylor + + * m4macros/glib-gettext.m4: AC_PREREQ(2.53) here; convinces + Debian's wrappers to use the right autoconf for atk, etc. + (Reported by Jody Goldberg) + +2002-12-11 Tor Lillqvist + + * glib/gtimer.c (g_timer_elapsed): Fix off-by-one error. (#100853) + + * glib/gfileutils.c (g_file_test): Bypass extra test for root on + Win32. + + * glib/glib.def: Add g_{get,set}_application_name. + +Wed Dec 11 17:53:34 2002 Owen Taylor + + * === Released 2.1.4 === + + * NEWS: Updates. + +Wed Dec 11 17:49:15 2002 Owen Taylor + + * m4macros/glib-gettext.m4: Unset + ac_cv_func_bind_textdomain_codeset before calling + AC_CHECK_FUNCS(bind_textdomain_codeset) again. + + * configure.in: Remove duplicate call to + AC_CHECK_FUNCS(bind_textdomain_codeset) + +2002-12-11 Pauli Virtanen + + * configure.in: Added "fi" to ALL_LINGUAS. + +Wed Dec 11 17:00:20 2002 Owen Taylor + + * acglib.m4 (ac_compile): Add GLIB_ASSERT_SET() as + a helper for adding "must be set when cross-compiling" + errors. + + * configure.in: For all cached variables without defaults, + error out if they aren't set. + +Wed Dec 11 15:52:01 2002 Owen Taylor + + * configure.in: Also assume AC_LINK_IFELSE() is + OK when cross-compiling for the libs checks, and for + the sched_get_priority_min() check. + + * configure.in: Add cached value glib_cv_use_pid_surrogate. + +Wed Dec 11 15:10:25 2002 Owen Taylor + + * configure.in: Factor out repeated thread test into + a m4_define(); when cross-compiling, assume that + AC_LINK_IFELSE() is good enough for thinking that + -pthread[s] is OK. (More of #58786) + + * m4macros/glib-gettext.m4: Fix typo. (Manish Singh) + +Wed Dec 11 14:28:50 2002 Owen Taylor + + * configure.in: Version 2.1.4, interface age 1. + + * m4macros/glib-gettext.m4: Major rewrite; remove leftovers + from building intl/, prefer libintl if both libc and libintl + have dgettext and libintl also has bind_textdomain_codeset(). + (#70627) + + * configure.in acinclude.m4: Use an include to avoid having + to duplicate the gettext macros between glib-gettext.m4 + and acinclude.m4. + + * m4macros/glib-gettext.m4: Do some tricks so that configure.in + can use macros under hidden names, but aclocal will still + find them when installed. + + * m4macros/glib-gettext.m4: Add AM_GLIB_DEFINE_LOCALEDIR + to encapsulate install location of catalog files. + + * m4macros/glib-gettext.m4 (AM_GLIB_DEFINE_LOCALEDIR): + Fix bug where if --prefix wasn't set on the configure line, + GLib would look for translations in NONE/share/locale. + +Wed Dec 11 11:11:44 2002 Owen Taylor + + * glib/grand.c: Include string.h, supress a warning. + +2002-12-10 Sebastian Wilhelmi + + * glib/grand.c (g_rand_int_range): Improve generation of + pseudo-random integers. (#99720, Morten Welinder ) + + * README.in, docs/reference/glib/running.sgml, + docs/reference/glib/tmpl/random_numbers.sgml, + docs/reference/glib/changes.sgml: Added notes about the new + algorithm. + +2002-12-09 Sebastian Wilhelmi + + * configure.in: use 0 instead of $defattr, as it isn't defined + anymore on platforms using -pthread and linux, where this is used, + only uses 0 anyway and not "pthread_attr_default". + +Sun Dec 8 23:36:12 2002 Owen Taylor + + * glib/gfileutils.c (g_file_test): Guard against + the POSIX allowed behavior where access (file, X_OK) + succeeds for uid==0 when no executable bits are set. + + * glib/gfileutils.c (g_file_test): Add doc notes + about the possibility of race conditions, and the + fact that EXISTS and IS_EXECUTABLE give results + for the real uid not the effective user ID. + (#81854, Morten Welinder.) + +Fri Dec 6 14:34:42 2002 Owen Taylor + + Avoid literal UTF-8. (Allow it to build with + IRIX cc, #72757, Tomas Ogren) + + * tests/patterntest.c (main): Convert literal + iso-8859-1 high bit characters in tests to + string escapes. + + * glib/gunichartable.h glib/gen-unicode-tables.pl: + Use hex \xMN escapes rather than literal UTF-8 + for casefold tables. + + * configure.in: AC_PREREQ(2.53). needed for recent + GLIB_SIZEOF() changes. + +Fri Dec 6 12:40:00 2002 Owen Taylor + + * glib/libcharset/Makefile.am (EXTRA_DIST): Don't + distribute ref-add/del.sed., fixing problem with + srcdir != destdir. (#99813, Phuc LeHong) + +Fri Dec 6 12:31:30 2002 Owen Taylor + + * configure.in: chmod 0755 scripts in AC_OUTPUT(), since + install -c won't necessarily do that. (#74376, Martin + Gansser, Joshua Weage) + +Thu Dec 5 16:05:55 2002 Owen Taylor + + * configure.in: Use AC_LINK_IFELSE(), not AC_TRY_RUN() + for va_copy(), __va_copy() checks. + + * configure.in: When there is a reasonable default, + provide that in the 3rd argument of AC_TRY_RUN(), + instead of just leaving the 3rd argument empty. + +2002-12-05 Matthias Clasen + + * glib/gstrfuncs.c (g_strncasecmp): Break long deprecation + info into two paragraphs. + +Thu Dec 5 15:43:46 2002 Owen Taylor + + * configure.in: Fix multiple problems with the programs + in the argument of AC_TRY_RUN() having preprocessor + defines not in the first column. + +Thu Dec 5 15:24:14 2002 Owen Taylor + + Start of fixes for cross-compilation. Based on + patches from Dimi Shahbaz, Dan Kegel, Johannes Stezenbach, + Amy Lin. (#58786) + + * configure.in: Don't run the Digital-Unix 4 -std1 check + when cross_compiling. + + * configure.in: Use AC_TRY_COMPILE() rather than + AC_TRY_RUN() for inline checks. (Daniel Egger) + + * configure.in: use AC_CHECK_SIZEOF rather than + GLIB_SIZEOF for size_t. Remove unused checks for + size of ptrdiff_t/intmax_t. + + * acglib.m4: Resync GLIB_SIZEOF of to the current + AC_CHECK_SIZEOF, which handles cross-compilation. + + * acglib.m4: Remove no longer needed GLIB_SYSDEFS(), + add GLIB_CHECK_VALUE() as a wrapper around the + amazing _AC_COMPUTE_INT() autoconf 2.5x internal. + + * configure.in: Redo the POLL* value checks in a + cross-compilation friendly way. + +Thu Dec 5 15:28:37 2002 Owen Taylor + + * glib/gtimer.c: Include glibconfig.h early so + that we include when needed. + + * glib/gstrfuncs.c: Fix typo. + +Tue Dec 3 21:10:28 2002 Owen Taylor + + * configure.in: Add 3rd argument to remaining AC_DEFINES(), + so we can get rid of acconfig.h. (#76334, Daniel Egger) + + * acconfig.h: Removed. + +Tue Dec 3 20:22:27 2002 Owen Taylor + + * glib/*.c: Patch from Sven Neumann to make the + include order consistent. (#71704) + +2002-12-03 Matthias Clasen + + * configure.in: Check that strlcpy behaves as per the OpenBSD + man page before wrapping it. (#53933) + +2002-12-03 Frederic Crozat + + * glib/gunicollate.c: (g_utf8_collate_key): + Fix typo from previous commit + +Tue Dec 3 01:05:00 2002 James M. Cape + + * glib/gunicollate.c (g_utf8_collate, g_utf8_collate_key): + Check for NULL before doing anything. + +Mon Dec 2 16:34:13 2002 Owen Taylor + + * === Released 2.1.3 === + + * NEWS: Updated. + + [ Unmerged change from stable from May 16 ] + + * autogen.sh: Remove check for GNU gettext, since it + was causing problems for Solaris CVS builds. + (#81885, Hidetoshi Tajima.) + +Tue Nov 26 09:51:43 2002 Owen Taylor + + * glib/gstrfuncs.c (g_strchomp): Avoid non-ANSI pointer + comparison. (#54344, Morten Welinder) + + * tests/strfunc-test.c (main): Add tests for strchomp(). + +2002-11-30 Ole Laursen + + * configure.in: Added "da" to ALL_LINGUAS. + +2002-11-29 Matthias Clasen + + * glib/gstrfuncs.c (g_ascii_strtoull): It is a 2.2 addition. + + * glib/gtimer.c (g_time_val_add): Adjust to changed parameter names. + + * glib/gutils.c (g_get_application_name): Mark as 2.2. addition. + + * glib/gstrfuncs.c (g_ascii_strtoull): Mark as 2.0.7 addition. + +2002-11-28 Matthias Clasen + + * glib/gutils.c: + * glib/gtree.c: + * glib/gstring.c: + * glib/gstrfuncs.c: + * glib/giochannel.c: Move some docs inline, and add deprecation + information. To see the list of affected functions, grep for + "Deprecated:". + + * configure.in: Fix the definitions around printf: either we use + system printf in which case HAVE_VASPRINTF, HAVE_C99_VSNPRINTF and + HAVE_UNIX98_PRINTF have already been determined by earlier tests, + or we use the included printf, in which case we know that these + three can be defined as 1. (#99826) + + * glib/gutf8.c (g_utf8_strreverse): + * glib/gstrfuncs.c (g_str_has_suffix): + (g_str_has_prefix): + * glib/gprintf.c (g_printf): + (g_fprintf): + (g_sprintf): + (g_vprintf): + (g_vfprintf): + (g_vsprintf): + * glib/gmarkup.c (g_markup_parse_context_get_element): + Mark as 2.2 API additions. + + * configure.in: Fix the gtk-doc version check. + +2002-11-27 Matthias Clasen + + * glib/gmessages.h: Use G_LIKELY without surrounding parentheses + in g_assert() and g_return_[val]_if_fail() so that we always trigger + the gcc warning about "assignment used as truth value". + + * glib/gmacros.h: Always put parentheses in G_LIKELY and G_UNLIKELY. + +2002-11-26 Matthias Clasen + + * glib/gmessages.h: Only use G_LIKELY in g_assert() and + g_return_[val]_if_fail() if it is actually doing something. + +2002-11-26 Sebastian Wilhelmi + + * glib/grand.c, gthread/gthread-impl.c, tests/rand-test.c: + Changed the seeding algorithm. Old behaviour can be achived by + setting envvar G_RANDOM_VERSION to "2.0". (#99262) + + * docs/reference/glib/glib-docs.sgml, + docs/reference/glib/Makefile.am: Renamed + docs/reference/glib/changes-2.0.sgml to + docs/reference/glib/changes.sgml and added section for changes + from 2.0 to 2.2 (Also corrected 1.0 to 1.2). + + * README.in, docs/reference/glib/running.sgml, + docs/reference/glib/tmpl/random_numbers.sgml, + docs/reference/glib/changes.sgml: Added notes about the new + seeding algorithm. + + * configure.in: Make CPPFLAGS, not CFLAGS, include + G_THREAD_CFLAGS. CFLAGS is used while linking too and thus GLib + programs would link to the threads library on some platforms. Also + fixed a bug manifesting through this change. (#77981) + +2002-11-26 Matthias Clasen + + * glib/gmacros.h: Fix the non-gcc-3.x definitions of G_LIKELY + and G_UNLIKELY. (Reported by Dan Mills) + +2002-11-25 Matthias Clasen + + * glib/gfileutils.c (g_build_path): + (g_build_filename): Document that the varargs must be + NULL-terminated. (#99510) + + * glib/gmessages.h (g_assert): + (g_return_if_fail): + (g_return_val_if_fail): Remove the (no longer effective) empty + if-branch. + + * glib/gmacros.h: Change the definition of G_LIKELY, so that + g_return_if_fail() and friends still trigger a gcc warning if + the expr is an assignment. + +2002-11-23 Matthias Clasen + + * configure.in: Generate docs/reference/*/version.xml. + + * glib/gdir.h: Add Copyright notice. + +2002-11-22 Sebastian Wilhelmi + + * configure.in: Fixed typo: PTHREAD_PRIO_MIN -> + PTHREAD_PRIO_MAX. (Laurent Vivier, #99293) + +Fri Nov 22 09:39:09 2002 Owen Taylor + + * glib/gmacros.h: Remove broken G_HIDDEN_SYMBOL + definition which wasn't supposed to be committed + at all. + +Thu Nov 21 16:19:21 2002 Owen Taylor + + * glib/ghash.c: Patch from Morten Welinder to + make ghash.c properly obey DISABLE_MEM_POOLS. (#96600) + +Thu Nov 21 14:09:44 2002 Owen Taylor + + * glib/gmacros.h: Add G_GNUC_DEPRECATED. (Tom Tromey, + #87969) + +2002-11-21 Tor Lillqvist + + * config.h.win32.in: Update to match what is currently produced by + autotools. + + * configure.in: Remove superfluous spaces on two shell variable + assignment lines. Don't define HAVE_GOOD_PRINTF as 0 if we don't + have a good printf, it is tested with #ifdef. + + * glib/glib.def: Add new functions. + + * glib/Makefile.am: If !HAVE_GOOD_PRINTF, add libtrio.la to LIBADD + and DEPENDENCIES. + + * glib/glib.rc.in + * gmodule/gmodule.rc.in + * gobject/gobject.rc.in + * gthread/gthread.rc.in + * {glib,gmodule,gobject,gthread}/makefile.{mingw,msc}.in: + Hardcode 2.0 in the names, as that is what Makefile.am does. + +2002-11-21 Matthias Clasen + + Include a printf implementation supporting C99 snprintf and SUS + positional parameters: (#79488) + + * glib/gstrfuncs.c: + * glib/gspawn-win32.c: + * glib/gscanner.c: + * glib/gconvert.c: + * glib/gbacktrace.c: Use _g_printf wrappers. + + * glib/gutils.c (g_vsnprintf): Simplify, since we can assume C99 + snprintf semantics now. + + * glib/gmessages.c (printf_string_upper_bound): No longer needed, + since we can assume C99 snprintf semantics now. + (g_logv): Simplify. + + * acinclude.m4 (AC_FUNC_PRINTF_UNIX98): New macro to check wether + printf supports SUS positional parameters. + + * configure.in: New option --enable-included-printf to force + compilation of trio; otherwise trio is compiled if the system + printf misses either C99 snprintf semantics of SUS positional + parameters. + + * glib/Makefile.am (SUBDIRS): Conditionally compile trio. + (libglib_2_0_la_SOURCES): Add gprintf.c and gprintfint.h. + (glibsubinclude_HEADERS): Add gprintf.h. + + * glib/gprintfint.h: New private wrapping either system printf + or trio printf variants in _g_printf wrappers for use inside glib. + + * glib/gprintf.h: New public header declaring g_printf variants. + * glib/gprintf.c: Corresponding implementations. + + * glib/trio/*: New directory, containing the trio-1.9 sources. + +2002-11-20 Matthias Clasen + + * glib/gmessages.h (g_return_if_fail): + (g_return_val_if_fail): Use G_LIKELY. (#69022) + + * glib/gmacros.h (G_LIKELY): + (G_UNLIKELY): New macros for hinting the compiler about the + expected result of expressions. For gcc 3.x, define these + using __builtin_expect. (#69022) + +Tue Nov 19 14:38:18 2002 Owen Taylor + + * glib/gstrfuncs.c (g_ascii_strtoull): Fix + strtull/strtoull type in docs (#99012, Morten + Welinder.) Add copyright information for code + taken from GNU libc. + +2002-11-18 Tor Lillqvist + + * glib/gspawn-win32.c (do_spawn_with_pipes): Do handle + G_SPAWN_DO_NOT_REAP_CHILD after all, similarily as on Unix. If the + flag is not set, don't call DuplicateHandle() on the handle + returned by the helper process, and set the "child pid" returned + to the called to zero. Close the handle to the helper process in + all cases. + + * glib/gspawn.c (g_spawn_async_with_pipes): Document Windows + behaviour of G_SPAWN_DO_NOT_REAP_CHILD. + +2002-11-18 Tor Lillqvist + + [Win32] Fix the asynchronous g_spawn* to return the process handle + of the started program properly. (Note: not the process id. The + spawn*() functions in the C runtime return the created process's + handle. There doesn't seem to be any way to get the process id of + a child process if you have the handle. But then, the process + handle usually is more useful anyway.) + + * glib/gspawn-win32-helper.c (WinMain): If the spawning of the + child process succeeded, and if asynchronous spawn (P_NOWAIT), + write the result handle up to the parent process, waiting to read + it in do_spawn_with_pipes(). + + * glib/gspawn-win32.c (do_spawn): Use return value from spawning + the helper. If it is -1 the helper wasn't found or couldn't be run + for some reason. Otherwise it is the helper's process handle. + + (g_spawn_async_with_pipes): Pass the child_pid parameter on to + do_spawn_with_pipes(). + + (do_spawn_with_pipes): Take also a child_pid parameter. If + do_spawn() returned -1, fail immediately. Otherwise make the + handle passed to us by the helper process into a handle valid in + this process by calling DuplicateHandle(). + +2002-11-17 Tor Lillqvist + + * glib/gspawn-win32.c (g_spawn_async_with_pipes): Ignore the + G_SPAWN_DO_NOT_REAP_CHILD flag, can't be meaninfully implemented + on Windows, at least not now. Always pass dont_wait as TRUE to + do_spawn_with_pipes(). The semantics of the dont_wait parameter is + very different from the semantics of the intermediate_child + parameter to fork_exec_with_pipes() in the Unix version. This + fixes a serious bug, g_spawn_async() in fact behaved + synchronously. + + (do_spawn_with_pipes, do_spawn): Rename from + fork_exec_with_pipes() and do_exec(), those names were from the + Unix bersion, and misleading. + + (close_and_invalidate): Don't try to close invalid fds. + + * glib/gspawn.c (g_spawn_async_with_pipes): Add warning about + Windows behaviour. There is no fork(), so the child_setup() + function is in fact called in the parent. + + * glib/gspawn-win32-helper.c (WinMain): Insert spaces in argv + debugging output. + + * tests/spawn-test-win32-gui.c: New file. Test program to be + linked as a GUI application. Behaves differently depending on how + invoked (by spawn-test). + + * tests/spawn-test.c (run_tests): On Win32, run the + spawn-test-win32-gui program, too, in several ways, synchronously + and asynchronously. + + * tests/Makefile.am: Corresponding change. + +Fri Nov 8 19:44:20 2002 Soeren Sandmann + + * docs/reference/glib/tmpl/arrays.sgml: + * docs/reference/glib/tmpl/arrays_byte.sgml: + * docs/reference/glib/tmpl/arrays_pointer.sgml: + * docs/reference/glib/tmpl/date.sgml: + * docs/reference/glib/tmpl/linked_lists_double.sgml: + * docs/reference/glib/tmpl/linked_lists_single.sgml: + * docs/reference/glib/tmpl/main.sgml: + * docs/reference/glib/tmpl/queue.sgml: + * docs/reference/glib/tmpl/random_numbers.sgml: + * docs/reference/glib/tmpl/relations.sgml: + * docs/reference/glib/tmpl/scanner.sgml: + * docs/reference/gobject/tmpl/gtype.sgml: + * docs/reference/gobject/tmpl/value_arrays.sgml glib/garray.h: + * glib/gdate.h glib/giochannel.h glib/glist.h glib/gmain.c: + * glib/gmain.h glib/gqueue.c glib/gqueue.h glib/grand.c glib/grand.h: + * glib/grel.h glib/gslist.h glib/gtimer.h gobject/gvaluearray.h: + + Trivial s/foo/foo_/ fixes to make includable with + -Wshadow without warnings (#91680) + +Thu Nov 7 19:32:26 2002 Owen Taylor + + * glib/gutils.[ch] (g_set/get_application_name): + Patch from Havoc Pennington to add functions for + setting and getting a human readable application + name. + + * configure.in: Up to version 2.1.3, since we'll + need to depend on last addition for GTK+. + +2002-11-06 Tor Lillqvist + + * glib/glib.def: Add g_main_thread_init. + +2002-11-06 Matthias Clasen + + * glib/gstrfuncs.c (g_str_has_suffix): + (g_str_has_prefix): Minor doc markup fix. + +Mon Nov 4 10:45:48 2002 Owen Taylor + + * configure.in: Add -DG_DISABLE_CAST_CHECKS for + everything but --enable-debug. + + * configure.in: Require pkg-config 0.14. (#97553) + +Mon Nov 4 14:41:48 2002 Owen Taylor + + * glib/gbsearcharray.c: Include config.h + so DISABLE_MEMPOOLS actually has an effect. + (#96437, Morten Welinder) + + * tests/uri-test.c: Include + +2002-11-03 Dmitry G. Mastrukov + + * configure.in: Added Belarusian to ALL_LINGUAS + +2002-11-02 Daniel Elstner + + * glib/giochannel.c (g_io_channel_write_chars): Fix left_len + calculation in the from UTF-8 to UTF-8 case: left_len should + be the number of bytes left in the input buffer rather than + channel->write_buf. (#96373) + +2002-10-27 Tor Lillqvist + + * configure.in (G_MODULE_LDFLAGS): Don't set on Win32, only causes + trouble. + + * glib/gmain.c (g_poll): Fix for bug reported by Herman Bloggs + (http://mail.gnome.org/archives/gtk-devel-list/2002-October/msg00101.html) + and others. We waited for events only for GPollFDs whose events + field had G_IO_IN set. We need to wait also for events for + GPollFDs that have just G_IO_OUT set. Non-blocking sockets in the + process of being connect()ed are one such case. Also silence a + couple of gcc warnings. + +Fri Oct 18 13:41:30 2002 Manish Singh + + * glib/giochannel.c (g_io_channel_read_line_backend): avoid + creating negative values out of unsigned values using MAX, + check to see if the result would be positive before doing + the calculation. + +Tue Oct 15 15:28:47 2002 Manish Singh + + * tests/iochannel-test.c: use gsize instead of int where appropriate + (64-bit cleanliness fix). Removed leftover line_term cruft. + +Tue Oct 15 15:07:45 2002 Manish Singh + + * gmodule/Makefile.am gobject/Makefile.am gthread/Makefile.am: + add -DG_DISABLED_DEPRECATED + + * tests/gio-test.c tests/mainloop-test.c tests/string-test.c + tests/testglib.c test/tree-test.c tests/unicode-collate.c + tests/unicode-normalize.c: Deprecation cleanup + +Mon Oct 14 15:51:05 2002 Owen Taylor + + * glib/gdate.c (g_date_fill_parse_tokens): Fix a memory + leak. (#94550, Sebastian Rittau) + +Mon Oct 14 15:36:11 2002 Owen Taylor + + * glib/gcompletion.[ch] (g_completion_complete): Make + prefix argument const. (#91662, Gustavo Carneiro) + +Mon Oct 14 15:32:14 2002 Owen Taylor + + * tests/mainloop-test.c (adder_response): Fix a minor memory + leak. + +Sat Oct 12 21:30:41 2002 Tim Janik + + * merged up from glib-2-0: + + * glib/gstrfuncs.c (g_ascii_strtod): fix comment. + (g_ascii_strtoull): new function, acting like strtoull(3) in the C + locale. + + * glib/gscanner.[hc]: fix 32bit issues with integer parsing and + support storing 64bit values in GTokenValue by + using g_ascii_strtoull(). + +Sat Oct 12 12:34:22 2002 Soeren Sandmann + + * glib/gtree.c (g_tree_search), glib/gspawn.c + (g_spawn_async_with_pipes): + + Documentation fixes: #71778, Owen Taylor; #85095, Bill Janssen, + Owen Taylor. + +Thu Oct 10 23:27:02 2002 Tim Janik + + * glib/gscanner.c (g_scanner_msg_handler): if input_name is NULL, + print out "" instead of completely skipping input specification + and thusly loosing error line information. + +Sun Sep 29 12:15:44 2002 Manish Singh + + * tests/mainloop-test.c: use gsize instead of int where appropriate + (64-bit cleanliness fix) + +2002-09-29 Tor Lillqvist + + * configure.in: Instead of forcing -fnative-struct into CFLAGS + when using gcc for Win32, check for gcc version 3.x which uses + -mms-bitfields instead. Also check if either of these switches is + actually available at all, and warn if not. Thanks to Soren + Andersen for the inspiration. + + * HACKING: Say we require autoconf 2.52 as that is what + configure.in does. + +2002-09-23 Arvind Samptur + * glib/gspawn.c (fork_exec_with_pipes) : when the child fails + we need to reap it to avoid a zombie. This would + happen in case of g_spawn_sync. Fixes #92658 + +2002-09-20 Matthias Clasen + + * glib/gscanner.c (g_scanner_msg_handler): Don't print + scanner->input_name when it is NULL. (#93752) + +2002-09-06 Havoc Pennington + + * autogen.sh: automake 1.4 + +2002-09-01 Soeren Sandmann + + * docs/reference/glib/tmpl/datalist.sgml, glib/gmain.c: + + Documentation fixes: (#75255, Martin Schulze; #76104, Daryll Strauss) + +2002-08-26 Tor Lillqvist + + * configure.in (G_LIBS_EXTRA): Don't link with -lwsock32 on + Cygwin (#91696, Masahiro Sakai). + +Tue Aug 20 16:01:03 2002 HideToshi Tajima + + * glib/gconvert.c (strdup_len): validate 'len' argument properly + for the case that input string is not null-terminated. (#91222) + +2002-08-10 Gustavo Noronha Silva + + * configure.in: added pt_BR to ALL_LINGUAS + +2002-08-07 Matthias Clasen + + * glib/gmarkup.c (g_markup_parse_context_get_element): + Use g_return_val_if_fail, no g_return_if_fail. + +2002-08-06 Sebastian Wilhelmi + + * glib/gthread.c: Set the normal PID surrogate priority according + to getpid() to avoid errors for niced processes. (#86116) + + * gthread/gthread-impl.c, gthread/gthread-posix.c, + gthread/gthread-solaris.c: Do the same for the posix/dce + implementation. Solaris still needs to set priority of the main + thread, because all unbound threads will schedule according to + that value and it defaults to 0 (the minimal value). + + * glib/gmain.c: Factor out g_main_context_init_pipe from + g_main_context_new to initialize the wakeup pipe of a + context. Call that function from g_main_context_new if threads are + initialized and for all contexts when threads are initialized + in g_main_thread_init. (#86872) + + * gthread/gthread-impl.c: Call g_main_thread_init. (#86872) + +Thu Jul 25 14:23:15 2002 Owen Taylor + + * glib/gfileutils.c: Clarify the behavior of g_build_path() + for empty elements and for leading and trailing copies + of the separator in the docs. + + * glib/gfileutils.c: Fix problems with leading elements + consisting only of "/" characters. (#85928, Guillaume Chazarain) + + * tests/strfunc-test.c (main): Add more test cases + for g_build_filename(). + +2002-07-26 Matthias Clasen + + * glib/gunicode.h: + * glib/gutf8.c (g_utf8_strreverse): New function to revert + a utf8 string. + * glib/gpattern.c (g_utf8_reverse): Gone, replaced by + g_utf8_strreverse. (#87725) + +Thu Jul 25 20:57:20 2002 Owen Taylor + + * glib/giochannel.c (g_io_channel_read_line): Fix + docs for @str_return to conform to the main docs + and the implementation as to whether the terminator + is included. (#87964, Jacob Berkman) + +Thu Jul 25 19:52:41 2002 Owen Taylor + + * glib/guniprop.c (real_tolower): Handle the + end of the string properly when max_len is set. + (#88545, Morten Welinder.) Rename the next_t + variable to next_type to make cc-mode happy. + + * glib/gconvert.c (g_iconv_open): Fix missing + label from previous commit. + +Thu Jul 25 19:41:03 2002 Owen Taylor + + * glib/giochannel.c (g_io_channel_get_flags): Fix + incorrect return value in g_return_val_if_fail + (#85545, David L. Cooper II) + +Thu Jul 25 19:12:43 2002 Owen Taylor + + * glib/giochannel.c (g_io_channel_set_encoding): Clarify + that only one of the conditions listed in the docs + need to be true, not all of them. (#87176, + Sebastian Rittau) + + * glib/giochannel.c (g_io_channel_read_line): Fix + description of the return value. (#87754, Manuel Clos) + +Thu Jul 25 19:02:53 2002 Owen Taylor + + * glib/gmain.c (g_timeout_add): Remove reference + in the docs to @notify parameter. (#87768, + Manuel Clos) + +Thu Jul 25 17:57:07 2002 Owen Taylor + + * glib/gconvert.c (g_iconv_open): Document the + (GIConv)-1 return value on failure. (#87559, + Jarek Dukat) + + * glib/gconvert.c (g_iconv_open): Fix potential + problems with the assumption that (GIConv)(iconv_t)-1 + is the same as (GIConv)-1. + +2002-07-15 Matthias Clasen + + * glib/gmarkup.h: + * glib/gmarkup.c (g_markup_parse_context_get_element): New + function to get the currently open element. (#70448) + +2002-07-04 Sebastian Wilhelmi + + * tests/*.c: Added #undef G_DISABLE_ASSERT and #undef G_LOG_DOMAIN + throughout the files, which didn't already have them. (#87312) + +2002-07-03 Sebastian Wilhelmi + + * configure.in: Made the thread flags determination tests first + check for the canonical form -pthread[s], then for other + possibilities. Also recognize some more platforms. Modeled after + patch from Miroslaw Dobrzanski-Neumann + (#77981). + + * configure.in: Fixed bugs in posix thread priority + resolution. Also added AIX priorities. Fix from + Laurent Vivier . (#82599) + + * gthread/gthread-solaris.c: Use thr_min_stack() instead of + sysconf (_SC_THREAD_STACK_MIN). if stack_size is 0 on entry to + g_thread_create_solaris_impl, also pass 0 to thr_create. Otherwise + the stack might be to small for any nontrivial thread. Discovered + on intel-solaris by Rajkumar Sivasamy . + +2002-07-03 Anders Carlsson + + * configure.in: Add a forgotten trailing ` in the + GLIB_BINARY_AGE expression. Also fixup LT_CURRENT. + +2002-07-02 Sebastian Wilhelmi + + * configure.in: Set binary age to 0 to make it compile. + + * configure.in: Improve checks for dce/posix threads to also do + the right thing, if the thread functions are not declared in + pthread.h. Idea from Miroslaw Dobrzanski-Neumann + in #77981. + +2002-07-01 Anders Carlsson + + * configure.in: Up version to 2.1.0. + +2002-07-01 Sebastian Wilhelmi + + * glib/garray.h: Add parenthesis to protect macro + argument. Spotted by Sam Couter . (#86826) + +2002-06-28 Sebastian Wilhelmi + + * glib/gmessages.h (g_assert, g_assert_not_reached, + g_return_if_fail, g_return_val_if_fail): In case of + G_DISABLE_ASSERT replace "G_STMT_START{ }G_STMT_END" with + "G_STMT_START{ (void)0; }G_STMT_END", because the former chokes + gcc prior to 3.0. (#86664) + +2002-06-26 Yanko Kaneti + + * configure.in: (ALL_LINGUAS) Added Bulgarian (bg). + +Thu Jun 13 16:12:04 2002 Owen Taylor + + * glib/gmain.c (struct _GTimeoutSource): Make + interval unsigned to match g_timeout_source_new(). + (#82624, Tim Janik.) + + * glib/gmain.c (g_timeout_prepare): Add some + extra gymnastics to avoid signed/unisgned integer + overflows. + +Thu Jun 13 15:57:46 2002 Owen Taylor + + * INSTALL.in: Add a note about the deficiency + of Tru64 iconv. (#81699, Manuel Op de Coul) + +Tue Jun 11 17:03:39 2002 Owen Taylor + + * tests/patterntest.c (test_compilation) + * glib/gmem.c (profiler_try_realloc): A couple + of 64-bit printf format fix from George Lebl. + (#82817) + + * glib/gconvert.c (open_converter): Fix gsize/gint + mixup for g_iconv() arguments. (#83270, + David L. Cooper II) + +2002-06-03 Matthias Clasen + + * glib/gwin32.c (g_win32_get_package_installation_directory): + Replace homegrown "hash" entity by standard ISO entity "num". + +2002-05-26 Matthias Clasen + + * glib/gmain.c: Remove references to nonexisting functions + g_source_set_callback_closure(), g_source_poll(), g_source_add() + from docs. + + * glib/gdir.c (g_dir_open): Typo fix in docs. + + * glib/gasyncqueue.c (g_async_queue_lock): + (g_async_queue_unref_and_unlock): Fix markup to avoid erroneous + s in docs. + + * glib/gwin32.c: Escape #'s leading to erroneous s in docs. + + * glib/gtree.c: Replace some occurances of Gtree by GTree in docs. + + * glib/gstring.c (g_string_insert_unichar): Typo fix in docs. + +2002-05-23 Havoc Pennington + + * glib/gspawn.c (fork_exec_with_pipes): on success, close the + pipes from the child. Fix from Tim. + +2002-05-22 jacob berkman + + * m4macros/glib-gettext.m4 (AM_GLIB_WITH_NLS): fix tyop + +Wed May 22 15:40:47 2002 Owen Taylor + + * README.in: Remove notes about now-fixed-bugs. + + * m4macros/glib-gettext.m4 acinclude.m4: Get rid + of AC_MSG_NOTICE() usage, since some broken systems + (Hi Debian!) might not be using autoconf-2.5x for + downstream packages even though we require it for + glib itself. + + * INSTALL.in: Add a note about installing extra + converters for Solaris. + + * glib/gutils.h (g_bit_nth_msf): Fix termination + condition. (#82582, Paolo Molaro) + +Tue May 21 15:51:17 2002 Owen Taylor + + * configure.in: $with_libiconv, not $with_iconv. + +Mon May 20 18:02:46 2002 Owen Taylor + + * configure.in: Move iconv tests before gettext + checks. (#81999) + + * m4macros/glib-gettext.m4 acinclude.m4: If we can't + link to gettext, try adding in -liconv. (#80076, + Boyd Lynn Gerber) + + * m4macros/glib-gettext.m4 acinclude.m4: Suppress + warnings about xgettext not being GNU gettext when + libintl wasn't found at all. + (#79016, Andrew P. Lentvorski, Jr.) + +2002-05-21 Matthias Clasen + + * glib/gmarkup.c (g_markup_parse_context_parse): Added + proper support for CDATA sections. + +2002-05-20 jacob berkman + + * glib/gdir.c: include sys/types.h before dirent.h to build on + darwin (fixes #72859) + +Mon May 20 15:35:59 2002 Owen Taylor + + * glib/gfileutils.c (get_contents_regfile): Fix double + close of file descriptor on error. (#82139, Wayne Schuller) + + * glib/gspawn.c (close_and_invalidate): Don't close + fd's that have already been closed. (Fix from Michael + Meeks, #81959) + + * glib/giochannel.c (g_io_channel_close): If not flushing, + dump the contents of the write buffers, so we won't try + to write them to an invalid fd later. (Patch from Ron Steinke, + fixing #78290, Andreas Persenius.) + +2002-05-18 Matthias Clasen + + * tests/markups/fail-36.gmarkup: + * tests/markups/fail-35.gmarkup: + * tests/markups/valid-8.gmarkup: + * tests/markups/valid-7.gmarkup: + * tests/markups/valid-6.gmarkup: + * tests/markups/valid-5.gmarkup: New testcases. + + * tests/markup-test.c (passthrough_handler): + (text_handler): Don't ignore the text_len parameter. + + * glib/gmarkup.c (find_current_text_end): Don't hang on embedded + nuls. (#81977) + (g_markup_parse_context_parse): Fix passthrough handling to + correctly skip processing instructions, comments, doctype + declarations and CDATA marked sections. (#81977) + +Sat May 18 00:21:51 2002 Tim Janik + + [merged from stable] + + * glib/gscanner.c (g_scanner_unexp_token): fix missing cases for + expected_token. + +2002-05-17 Tor Lillqvist + + * config.h.win32.in: Match new additions in a configure-produced + config.h. + + * glibconfig.h.win32.in: gssize and gsize as in a + configure-produced glibconfig.h. + + * glib/glib.def: Add new functions. + +Thu May 16 12:24:00 2002 Owen Taylor + + * acinclude.m4 m4macros/glib-gettext.m4: Incorporate + AM_LC_MESSAGES, AM_PATH_PROG_WITH_TEST as AM_GLIB_* to avoid + dependencies on gettext m4 files. (#81885, Hidetoshi Tajima.) + +2002-05-14 Alex Larsson + + * glib/gstrfuncs.c: + * glib/gstrfuncs.h: + New functions g_str_has_suffix and g_str_has_prefix. + + * tests/string-test.c: (main): + Test the new functions. + +Mon May 13 23:20:00 2002 Owen Taylor + + * autogen.sh (have_gettext): Add a check for GNU gettext. + (Pointed out by Dan Winship in #59386.) + +Mon May 13 11:55:33 2002 Owen Taylor + + * configure.in acglib.m4: If sizeof(int) == sizeof(long) + run compilation tests to determine which way gsize should + be defined. (#74413, reported by Miroslaw Dobrzanski-Neumann) + +Mon May 13 11:42:23 2002 Owen Taylor + + * glib/libcharset/*: Update from libcharset CVS. + Includes additional encodings for Solaris (#80396, + Qingjiang Yuan) + + * configure.in: Add getc_unlocked to CHECK_FUNCS(). + + * glib/gmessages.c (strdup_convert): If + g_convert_with_fallback() fails, print the error + message to stderr the first time, then return + the original string. (#78197) + +2002-05-10 Naba Kumar + + * configure.in: Added "hi" to ALL_LINGUAS. + +2002-05-08 Michael Natterer + + * configure.in: fixed yesterdays fix for cross compiling: simply + check the variable "cross_compiling" which gets set by autoconf. + +2002-05-07 Matthias Clasen + + * glib/gmarkup.c (unescape_text): Report unfinished entity + references as errors rather than running into an assert. (#80441) + +2002-05-07 Michael Natterer + + * configure.in: added a new conditional CROSS_COMPILING which + indicates ($build != $host). If it is set, look for + glib-genmarshal in PATH. Error out if it was not found. + +Tue May 7 11:24:22 2002 Owen Taylor + + Fixes for #79347, Ron Arts. + + * glib/gqsort.c (g_qsort_with_data): Handle 0 elements, + don't g_return_if_fail(). + + * tests/qsort-test.c (main): Add a 0 element test. + + * glib/garray.c (g_[ptr_]array_sort_with[_data]): + Remove invalid assertions that array->pdata != NULL .. + it's NULL for 0 elements which is a valid case. + +Mon May 6 16:00:41 2002 Owen Taylor + + * glib/gbacktrace.h: Exclude OSF from alpha definition + of G_BREAKPOINT(), since the assembler apparently + doesn't support bpt. (#77852, Gareth Pierce) [from stable] + +Mon May 6 11:48:08 2002 Owen Taylor + + [ merged from stable ] + + * Makefile.am (EXTRA_DIST): Add ChangeLog.pre-2-0 (#78641) + + * m4macros/glib-2.0.m4: save CFLAGS/LIBS properly when + compiling "what went wrong" test case. (#79330) + + * m4macros/glib-2.0.m4: Remove reference to editing + pkg-config script. (From Jim Gettys) + + * configure.in: (Look for dyld interfaces before dlopen() + since OS X can have both. Patch from Jacob Berkman, + #80438) + +2002-05-01 jacob berkman + + * configure.in: fix typo on 64-bit printf formatting string + configure message (fixes #80389) + +2002-04-29 Pablo Saratxaga + + * configure.in: Added Vietnamese (vi) to ALL_LINGUAS + +2002-04-19 Tor Lillqvist + + * glib/gspawn.c (g_spawn_command_line_sync): Add Windows-specific + note to the gtk-doc comment. + + * glib/gspawn-win32.c: Remove the copy-pasted gtk-doc comment + blocks. It's enough to have them in gspawn.c. + +2002-04-18 Sebastian Wilhelmi + + * gthread/gthread-impl.c (g_thread_init): Fixed typo. (#78985) + +2002-04-13 Sebastian Wilhelmi + + * glib/gthreadpool.c (g_thread_pool_thread_proxy): Unlock the pool + for all threads leaving it. (#78348) + +2002-04-11 Matthias Clasen + + * tests/patterntest.c: Remove manual UTF-8 -> Latin1 conversion for + stuff fed to g_print. + +2002-04-08 Sebastian Wilhelmi + + * tests/gio-test.c, tests/markup-test.c: Use gsize instead of + gint. From Miroslaw Dobrzanski-Neumann + . (#77982) + +2002-04-08 Stanislav Brabec + + * cs.po: Added Czech (cs) to ALL_LINGUAS. + +2002-03-31 Hasbullah Bin Pit + + * configure.in: Added Malay (ms)to ALL_LINGUAS. + +2002-03-29 Tor Lillqvist + + * glib/glib.def: Add g_convert_init. + +Thu Mar 28 18:25:14 2002 Owen Taylor + + * Released 2.0.1 + + * configure.in: Version 2.0.1, interface, binary age 1. + +Thu Mar 28 18:22:53 2002 Owen Taylor + + * README: Remove warning about g_print, etc, encoding. + + * NEWS: Updates. + + * glib/gmessages.c (g_log_default_handler): Use %lu + (plus a cast) when printing out pid_t arguments. + (#76770, Morten Welinder) + + * glib/gstrfuncs.c (g_strdup_vprintf): Check the + result of vasprintf(), return NULL on failure. + (#76802, Akira Tagoh) + + * tests/testglib.c (TEST): Supress a warning with + some GCC versions. + +Thu Mar 28 20:31:51 2002 Tim Janik + + * glib/gmessages.c: + (g_print): + (g_printerr): convert prtinf() strings to local charset + when writing them to stdout or stderr. + +Wed Mar 27 18:42:22 2002 Tim Janik + + * gmessages.[hc]: + major cleanups. introduced _g_log_fallback_handler() to handle + recursive messages which really doesn't call any GLib functions. + this allowes the default handler to use normal GLib functions and + also fixes user supplied log level handlers. + fixed locking issues, based on a patch from Sebastian Willhelmi, + attached to #74356. translate log messages from UTF-8, based + on the same patch. save fatal and recursion flags across flag + loop. use new integer format code from above patch. + move GLib functions out of locked mutex state to avoid deadlocks. + move the level prefix and filedescriptor logic into mklevel_prefix(). + move _g_debug_init() into a place where we can figure and handle + recursion. + +Mon Mar 25 18:13:06 2002 Owen Taylor + + * glib/gtypes.h (GUINT*_SWAP_LE_BE_X86): Remove __const__ + qualifier from __asm__ statements... GCC since at least + 2.96 has assumed no side effects automaticaly, and gcc-3.1 + will warn about this usage. (#73308, Cody Russell) + +Fri Mar 22 17:59:27 2002 Owen Taylor + + * glib/gmem.c (g_mem_chunk_reset): Fix problem where + if g_mem_chunk_reset() is called on an alloc-only + memchunk, then a useles GTree was created. + +Wed Mar 20 18:20:21 2002 Owen Taylor + + * glib/gconvert.c (open_converter): Try to work around segfaults + on Solaris if NULL is passed for outbuf... supposedly gchar + *outbuf = NULL... &outbuf works. (#74336, Lauri Alanko) + +Wed Mar 20 11:17:32 2002 Owen Taylor + + * glib/gfileutils.c (get_contents_regfile): Close the + file descriptor. (#75507, Matthias Clasen) + +Wed Mar 20 11:00:59 2002 Owen Taylor + + * configure.in: Use $PKG_CONFIG, not pkg-config. + (LEE Sau Dan, #75572) + +2002-03-20 Sven Neumann + + * glib/ghash.c (g_hash_table_resize): avoid repeated call of + g_spaced_primes_closest() by moving it out of the CLAMP macro + (spotted by Salmaso Raffaele). + +2002-03-17 Tor Lillqvist + + * README.win32: Add MSVC-specific text by Hans Breuer. + +2002-03-16 Tor Lillqvist + + * glib/giowin32.c: Some debugging output formatting changes. The + following changes fix a problem with buffered GIOChannels, noticed + with the help of Owen's test program, thanks! (#59969) + (g_io_win32_prepare): Return value that takes the buffer condition + into account, like g_io_unix_prepare() does. + (g_io_win32_check): Ditto, like g_io_unix_check(). + (g_io_win32_dispatch): Ditto, like g_io_unix_dispatch(). + +Thu Mar 14 17:37:45 2002 Owen Taylor + + * glib/giochannel.c (g_io_channel_write_chars): Fix some + gsize/gint mismatches. (#74422, Miroslaw Dobrzanski-Neumann) + +2002-03-14 Sebastian Wilhelmi + + * glib/gmessages.c: Fixed threading issues brought up by + #74577. Make g_log_find_domain, g_log_domain_new, + g_log_domain_check_free and g_log_domain_get_handler require being + called with g_messages_lock held and remove all internal locking + in them. Then added proper locking to g_log_set_handler, + g_log_remove_handler and g_logv. Problem spotted by Miroslaw + Dobrzanski-Neumann . (#74577) + +2002-03-13 Erwann Chenede + * glib/gconvert.c + glib/gen-unicode-tables.pl + glib/gunidecomp.h : fixed cast/type problems to + avoid warnings (with forte compiler) (#73898) + +2002-03-12 Alexander Larsson + + * glib/gconvert.c: + Cache getenv("G_BROKEN_FILENAMES") in have_broken_filenames() and + use instead. Add g_convert_init() that calls have_broken_filenames() + + * gthread/gthread-impl.c: + Have g_thread_init call g_convert_init. + +2002-03-11 Matthias Clasen + + * glib/gstrfuncs.c (g_strtod): + (g_ascii_strtod): + (g_ascii_dtostr): + (g_ascii_formatd): Doc formatting fixes. + diff --git a/ChangeLog.pre-2-20 b/ChangeLog.pre-2-20 new file mode 100644 index 0000000..4ca68de --- /dev/null +++ b/ChangeLog.pre-2-20 @@ -0,0 +1,914 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-29 Matthias Clasen + + Bug 577137 – g_logv() will crash if given format args and multiple + log levels + + * glib/gmessages.c (g_logv): Copy a va_list when using it + multiple times. Reported by Wim Lewis. + +2009-03-16 Alexander Larsson + + Bug 575555 – Use fsync() when replacing files to avoid data loss on crash + + * configure.in: + Look for fsync(). + + * glib/gfileutils.c: + (write_to_temp_file): + fsync temp file if destination file exists + +2009-03-13 Matthias Clasen + + * configure.in: Bump version + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + + * configure.in: Bump version to 2.20.0 + +2009-03-13 Matthias Clasen + + * NEWS: Updates + +2009-03-12 Matthias Clasen + + * glib/gbase64.c: Avoid integer overflows in the base64 + functions. Fixes CVE-2008-4316 + +2009-03-11 Stef Walter + + * glib/gchecksum.c: Document and guarantee hex digests will + be returned in lower case. Fixes bug #574019 + +2009-03-02 Matthias Clasen + + * configure.in: Bump version + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * configure.in: Bump version + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-03-02 Matthias Clasen + + * NEWS: Updates + +2009-03-01 Matthias Clasen + + Bug 572508 – gmarkup speedup ... + + * glib/gmarkup.c: Various optimizations: do less allocations by + keeping a pool of GStrings, do in-place unescaping, avoid redundant + utf-8 validation. Patch by Michael Meeks + + * tests/markups/fail-36.gmarkup: Adapt + +2009-03-01 Matthias Clasen + + * glib/gthread.c: Fix docs. + +2009-03-01 Matthias Clasen + + * tests/slice-threadinit.c: Change one magazine size from 77 to 81 + to make distcheck work on x86-64. + +2009-02-27 Tor Lillqvist + + Bug 167569 - g_string_append_printf crashes on win32 when used + with a NULL argument + + * glib/gnulib/vasnprintf.c (vasnprintf): Add workaround for buggy + programs. Patch by Owen. + +2009-02-23 Paolo Borelli + + * glib/gutf8.c (_g_utf8_make_valid): + sanity check the input paramter. + +2009-02-23 Tor Lillqvist + + Bug 570501 - g_win32_get_system_data_dirs uses invalid conversion + of function pointer to object pointer + + * glib/gutils.c (g_win32_get_system_data_dirs_for_module): Change + the type of the function's parameter to be explicitly a function + pointer. + + * glib/gutils.h (_g_win32_get_system_data_dirs): Modify + declaration and the only caller, the inline + _g_win32_get_system_data_dirs(), accordingly. Add comments + pointing out these are internal GLib functions. + +2009-02-22 Matthias Clasen + + Bug 572151 – “it's” and “its” confused in docs and comments + + * Fix "it's" vs "its" confusion throughout the source. Patch + by Will Thompson. + +2009-02-22 Matthias Clasen + + Bug 572464 – Doc for g_file_get_contents + + * glib/gfileutils.c (g_file_get_contents): Improve docs. Pointed + out by Øystein Johansen. + +2009-02-22 Matthias Clasen + + Bug 572672 – glib/gthread.c: argument is different type + + * glib/gthread.c (g_once_init_leave): Add a necessary cast back. + Pointed out by Kazuki Iwamoto. + +2009-02-17 Matthias Clasen + + * configure.in: Bump version + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-17 Matthias Clasen + + Fix strict aliasing warnings and viiolations to make GLib and + GLib users buildable with gcc 4.4. Patch by Jakub Jelinek. + + * glib/gatomic.[hc]: Add G_GNUC_MAY_ALIAS to pointer arguments, + fix macro versions to only operate on objects of the same size. + + * glib/gdataset.c: + * glib/gthread.[hc]: + * glib/gdatasetprivate.h: Remove unnecessary casts in + g_atomic_pointer_get calls. + +2009-02-16 Matthias Clasen + + * configure.in: Bump version + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-16 Matthias Clasen + + * NEWS: Updates + +2009-02-13 Mathias Hasselmann + + Add note about g_utf8_offset_to_pointer() not checking string + boundaries. + + * glib/gutf8.c (g_utf8_offset_to_pointer()): See summary. + +2999-02-11 Matthias Clasen + + Bug 523742 – Use noinst for non-installable libraries + + * tests/Makefile.am: use noninst_LTLIBRARIES for noninstalled + libraries.Patch by Björn Lindqvist + +2009-02-06 Murray Cumming + + * gio/gfilterinputstream.c: + * gio/gfilteroutputstream.c: Correct the grammar in some property + documentation. + * gio/gdatainputstream.c: + * glib/gregex.c: Correct the spelling of + occurrence in documentation. + +2009-02-02 Matthias Clasen + + * configure.in: Bump version + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-02-02 Matthias Clasen + + * configure.in: Bump version + +2009-01-31 Matthias Clasen + + * NEWS: Updates + +2009-01-31 Matthias Clasen + + Bug 569105 – g_time_val_to_iso8601() assumes time_t==long + + * glib/gtimer.c (g_time_val_to_iso8601): Pass a time_t* to gmtime(). + Pointed out by Matthias Drochner. + +2009-01-27 Christian Persch + + * configure.in: + * docs/reference/glib/glib-sections.txt: + * docs/reference/macros_misc.sgml: + * docs/reference/glib/tmpl/types.sgml: Add + G_GOFFSET_FORMAT and friends. Bug #563141. + +2009-01-23 Stefan Kost + + * docs/reference/glib/Makefile.am: + Add SCAN_OPTIONS=--ignore-decorators="GLIB_VAR" to Makefile.am to fix + on problem with the doc build. + +2009-01-21 Tor Lillqvist + + * glib/gwin32.c (g_win32_locale_filename_from_utf8): Drop the code + in the else branch of #if GLIB_CHECK_VERSION (2, 19, 0). Drop + unused variables. + +2009-01-20 Matthias Clasen + + Bug 568294 – A wrong reference in the description of + g_bookmark_file_add_application() + + * glib/gbookmarkfile.c (g_bookmark_file_add_application): + Fix a typo in the docs. Pointed out by Takeshi Aihana + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-18 Matthias Clasen + + * glib/gstrfuncs.c (g_strdup_printf): Fix a doc typo. + +2009-01-18 Matthias Clasen + + * NEWS: Updates + +2009-01-18 Matthias Clasen + + Bug 512779 – --disable-regex breaks compilation + + * configure.in: Define an ENABLE_REGEX macro + + * gobject/gboxed.c: Don't refer to g_regex_ref if ENABLE_REGEX + is not defined. + +2009-01-18 Matthias Clasen + + * glib/gbsearcharray.h: Quell some compiler warnings. + +2009-01-18 Matthias Clasen + + * glib/pcre: Update to PCRE 7.8 + +2009-01-17 Matthias Clasen + + Bug 567977 – textdomain() macro should not return NULL when + ENABLE_NLS is not set + + * glib/glibintl.h: If !ENABLE_NLS, make textomain() macro + return "messages" in case of a NULL argument. Patch by + Peter Kjellerstedt. + +2009-01-17 Matthias Clasen + + Bug 567838 – G_STRUCT_OFFSETOF fails to compile under icc 9.1 + + * glib/gmacros.h (G_STRUCT_OFFSETOF): Use offsetof instead of + __builtin_offsetof, for icc's sake. Proposed by Hrvoje Niksic. + +2009-01-13 Matthias Clasen + + Bug 564728 Add function to decode base64 encoded data in place + + * glib/glib.symbols: + * glib/gbase64.[hc] (g_base64_decode_inplace): New convenience + API to decode in place, overwriting the input string. Patch by + Sebastian Dröge. + +2009-01-12 Matthias Clasen + + * glib/gtestutils.c (g_strcmp0): Be more explicit about the NULL + handling in the docs. + +2009-01-12 Tor Lillqvist + + * glib/goption.c (parse_arg): Guard against a mis-written + GOptionArgFunc that has returned FALSE but not set the GError. + +2009-01-10 Matthias Clasen + + Bug 566573 – g_match_info_fetch_pos docs + + * glib/gregex.c: Mention that positions are in bytes. + Proposed by Christian Persch. + +2009-01-10 Matthias Clasen + + Bug 566569 – gregex docs clarification + + * glib/gregex.c: Copy the warning about @string to all + relevant docs. Proposed by Christian Persch + +2009-01-09 Tor Lillqvist + + Bug 567138 - get_package_directory_from_module() does not free its + lock when failing + + * glib/gwin32.c (get_package_directory_from_module): Obvious fix. + +2009-01-05 Matthias Clasen + + * configure.in: Bump version + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + + * NEWS: Updates + +2009-01-05 Dan Winship + + * glib/tests/.gitignore: update + + * tests/.gitignore: update, sort + + * tests/gobject/.gitignore: add + +2009-01-05 Tor Lillqvist + + Bug 566348 - g_file_open_tmp uses the wrong g_mkstemp on win32 + + * glib/gfileutils.c: Move the binary compatibility versions of + g_file_test(), g_file_get_contents(), g_mkstemp() and + g_file_open_tmp() last in the file. Remove the restriction that + the XXXXXX is last in the template in the binary compatibility + version of g_mkstemp(). Thanks to Morten Welinder and Jody + Goldberg. + +2009-01-03 Matthias Clasen + + * NEWS: Updates + +2009-01-02 Matthias Clasen + + * glib/gregex.c: Add an example to the g_regex_replace_eval() docs. + +2009-01-02 Matthias Clasen + + * glib/gstrfuncs.c: Move docs inline, adding references to g_free() + where appropriate. + +2009-01-02 Matthias Clasen + + Bug 564210 – SUN Studio 12 has supported visibility attribute + + * configure.in: Use visibility attribute for new enough sun cc. + Patch by Chris Wang + +2008-12-30 Matthias Clasen + + Bug 565905 – There is no named g_context_group_set_translation_domain() + in GOption command line parser + + * glib/goption.c: Fix a wrong reference in the docs, reported by + Takeshi Aihana. + +2008-12-30 Matthias Clasen + + * glib/gspawn.c: + * glib/gthread.c: + * glib/goption.c: + * glib/gmain.c: + * glib/gkeyfile.c: + * glib/gfileutils.c: + * glib/gdate.c: + * glib/garray.c: + * glib/gbookmarkfile.c: + * glib/gbacktrace.c: Fix some compiler warnings. + +2008-12-19 Tor Lillqvist + + * glib/glib.symbols: Add g_thread_get_initialized here, + too. Surround g_test_config_vars with ifdef INCLUDE_VARIABLES. + +2008-12-18 Mike Kestner + + Bug 560676 - function access for g_threads_supported + + * glib/gthreads.c (g_thread_get_initialized): new accessor for + g_threads_supported macro. + * glib/gthreads.h: add g_thread_get_initialized + +2008-12-15 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.19.3 === + +2008-12-13 Matthias Clasen + + * NEWS: Updates + +2008-12-12 Dan Winship + + * glib/pltcheck.sh: make this work on x86_64 + +2008-12-12 Behdad Esfahbod + + * glib/guniprop.c: Improve g_unichar_iswide_cjk() docs. + +2008-12-07 Matthias Clasen + + Bug 508021 – Add support for the CRIS and CRISv32 architectures + + * configure.in: + * glib/gatomic.c: Add an implementation for the CRIS and CRISv32 + architectures, by Peter Kjellerstedt + +2008-12-02 Matthias Clasen + + * glib/gkeyfile.c: Some more documentation additions. + +2008-12-01 Matthias Clasen + + * configure.in: Bump version + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * configure.in: Bump version + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + + * NEWS: Updates + +2008-11-28 Behdad Esfahbod + + Bug 562639 – g_parse_debug_flags() parsing "help" + + * glib/gutils.c (g_parse_debug_string): Print available keys if + string is "help". + +2008-11-28 Behdad Esfahbod + + Bug 562638 – GDebugKey key member should be const + + * glib/gutils.h: Change GDebugKey key member from gchar * to + const gchar *. + +2008-11-28 Matthias Clasen + + Bug 547264 – Missing "no flags" flag + + * glib/gregex.c: Mention 0 as value for 'no flags' in some places.. + Pointed out by Bastien Nocera + +2008-11-28 Matthias Clasen + + Bug 562544 – g_key_file_get_string and g_key_file_get_value + documentation does not explain the difference + + * glib/gkeyfile.c (g_key_file_get_string): Explain the difference + to g_key_file_get_value(). Pointed out by Mart Raudsepp. + +2008-11-28 Matthias Clasen + + * glib/gkeyfile.c: Refer to @locale parameters as locale identifier + in docs. + +2008-11-28 Matthias Clasen + + Bug 557603 – carbon check output misplaced + + * configure.in: Call AC_PROG_CPP early to avoid it messing up + carbon check output. Fix proposed by Christian Persch + +2008-11-28 Matthias Clasen + + Bug 559110 – Do not include libintl.h after glibintl.h + + * glib/glibintl.h: Define bind_textdomain_codeset in the DISABLE_NLS + branch. Patch by Peter Kjellerstedt. + + * glib/gutil.c: Don't include libintl.h directly. + +2008-11-28 Matthias Clasen + + Bug 562378 – callback return value not respected for callback option + with no arg + + * glib/goption.c (parse_long_option): Return the parse_arg return + value even for no-arg callbacks. Patch by Christian Persch + + * glib/tests/option-context.c: Add a test for a callback which + returns FALSE. + +2008-11-23 Christian Persch + + Bug 559413 – g_option_group_set_error_hook docs buglet + + * glib/goption.c: Doc fix. + +2008-11-23 Christian Persch + + Bug 560568 – gkeyfile docs buglet + + * glib/gkeyfile.c: Clarify the docs. + +2008-11-23 Christian Persch + + Bug 560569 – gkeyfile doesn't use the set list_separator in some cases + + * glib/gkeyfile.c: (g_key_file_get_locale_string_list), + (g_key_file_set_locale_string_list), (g_key_file_set_integer_list), + (g_key_file_set_double_list): Use the key file's list separator character, + not the default one. + + * glib/tests/keyfile.c: (test_lists), (test_reload_idempotency): Test + this. + +2008-11-21 Christophe Fergeau + + Bug 561212 – GFileReadMoreCallback API doc refers to non-existant function + + * gio/giotypes.h: fix name of function referred to in + GFileReadMoreCallback API documentation + +2008-11-21 Matthias Clasen + + * configure.in: Bump gtk-doc dependency to 1.11 for + nicer index-generation. + +2008-11-14 Matthias Clasen + + * NEWS: Updates + +2008-11-04 Christian Dywan + + Bug 558672 – NULL key lookup using g_hash_table_lookup_extended() + + * glib/ghash.c: + Clarify g_hash_table_lookup_extended + +2008-11-02 Tor Lillqvist + + * configure.in: Expand also build/win32/vs9/Makefile. + +2008-10-31 Christian Dywan + + Bug 558513 – g_warn_if_fail FIXME in gtestutils + + * glib/gtestutils.c (g_test_log_send): + Turn g_assert into g_warn_if_fail as advised + +2008-10-31 Grahame Bowland + + Bug 558185 – 'parent' variable in g_local_file_get_child_for_display_name() + hits g_object_unref(NULL) assertion + + * gio/glocalfile.c: + - remove unused variable. Patch by Matt Johnston + +2008-10-29 16:11:14 Tim Janik + + * glib/gmacros.h: added G_PASTE() and G_STATIC_ASSERT(), based on + patches by Christian Persch and Christian Dywan. Fixes: + Bug 558381 - Add support for compile time assertions + +2008-10-27 Joseph Pingenot + + * glib/ghash.c: changed "#GHashTableIterator" to "#GHashTableIter" + in the documentation-comments above g_hash_table_foreach_remove() + and g_hash_table_foreach_steal() to correctly name and link to + GHashTableIter. This affects the GNOME documentation website + as well, so further steps are likely necessary beyond this subproject.. + +2008-10-23 Matthias Clasen + + Bug 557210 – g_compute_checksum_for_* asserts with less than 2 bytes + + * glib/gchecksum.c (g_compute_checksum_for_data): Accept + lengths < 2. Patch by Tommi Komulainen + + * tests/checksum-test.c: Add a test for this + +2008-10-23 Matthias Clasen + + Bug 556921 – gpoll.h breaks hal compilation + + * glib/gpoll.h: Include gtypes.h. Pointed out by Anis Elleuch + +2008-10-20 Christian Persch + + Bug 557087 – mem leak in g_content_types_get_registered + + * gio/gcontenttype.c: Plug a mem leak. + +2008-10-19 Michael Natterer + + Bug 556186 – gpoll.h breaks gmain.h inclusion + + * glib/gpoll.h: different fix: disallow direct inclusion + unconditionally again but make an exception if included from + gmain.h to maintain compatibility. + +2008-10-16 Matthias Clasen + + * configure.in: Bump version to 2.19.1 + + * === Released 2.19.0 === + + * NEWS: Updates + +2008-10-14 Christian Persch + + Bug 556186 – gpoll.h breaks gmain.h inclusion + + * glib/gpoll.h: Only disallow direct inclusion when + G_DISABLE_SINGLE_INCLUDES is defined. + +2008-10-13 Sven Herzberg + + Bug 556101 – static mutex yields warnings with g++ + Reviewed by Tim Janik + + * configure.in: added an intermediate cast to gpointer + +2008-10-13 Christian Persch + + Bug 555311 – format not a string literal and no format arguments + + * glib/gmarkup.c: + * glib/gshell.c: Use literal errors where appropriate. + +2008-10-10 Behdad Esfahbod + + Bug 551355 – [PATCH] Make glib build with libtool 2.2 + + * autogen.sh: Accept libtool 2.2. We are moving towards having + it working. + +2008-10-10 Behdad Esfahbod + + * configure.in: With libtool 2.x, regenerate libtool early. + Based on bug 552107, patch by Patryk Zawadzki + +2008-10-10 Matthias Clasen + + Bug 554557 – Patch to fix gcc warnings about missing format + specifiers + + * glib/gmarkup.c: + * glib/gshell.c: + * glib/grel.c: Fix gcc warnings. Patch by Kjartan Maraas + +2008-10-10 Matthias Clasen + + Bug 552861 – glib-2.0.m4 calls system(3) without storing its result + + * m4macros/glib-2.0.m4: Cosmetic change to make -Werror happy. + Patch by Andreas Köhler + +2008-10-08 Christian Persch + + Bug 555313 – GFileAttribute boxed type get_type function should + use usual get_type pattern + + * gio/gfileattribute.c (g_file_attribute_info_list_get_type): Use + g_once_init_enter/leave. + +2008-10-08 Christian Persch + + Bug 555314 – mem leak in gmarkup + + * glib/gmarkup.c: (g_markup_parse_context_parse): Plug a mem leak. + +2008-10-08 Tor Lillqvist + + Bug 554790 - g_convert() misbehaves with winiconv versions + + * glib/win_iconv.c (kernel_mbtowc): If converting from ASCII, + explicitly check for and reject 8bit chars. MultiByteToWideChar() + doesn't, at least not on XP. + +2008-10-06 Matthias Clasen + + * glib/gtypes.h: Properly include gmacros.h + +2008-10-06 Behdad Esfahbod + + Bug 555309 – giochannel breaks on error + Patch from Christian Persch + + * glib/giounix.c (g_io_unix_read), (g_io_unix_write), + (g_io_unix_seek), (g_io_unix_close), (g_io_unix_set_flags): + Don't shadow err. Oops! + +2008-10-06 Christophe Fergeau + + Bug 555224 – Improve g_format_size_for_display doc + + * glib/gfileutils.c: change g_format_size_for_display API doc to + explicitly say that the returned string has to be freed. Change + spelling of "newly allocated" to "newly-allocated" in g_file_read_link + API doc to be more consistent with what is done in that file. + +2008-10-01 David Zeuthen + + * README.in: Add "Notes about glib 2.20" section detailing the + ramifications of the patch from bug #528670. + +2008-09-30 Behdad Esfahbod + + Bug 554092 – glib doesn't return G_FILE_ERROR_NOENT et al on OS X + + * glib/giounix.c (g_io_unix_read), (g_io_unix_write), + (g_io_unix_seek), (g_io_unix_close), (g_io_unix_set_flags), + (g_io_unix_get_flags), (g_io_channel_new_file): + Like mclasen says: "well, thats the way errno works..., + save it or loose it". Save errno. + +2008-09-30 Tor Lillqvist + + * Makefile.decl + * glib/tests/Makefile.am: Bypass gtester related stuff on Windows. + +2008-09-30 Tor Lillqvist + + * glib/gprintf.c + * glib/gnulib/vasnprintf.c: Don't define _GNU_SOURCE on Windows, + as _GNU_SOURCE has unintended side effects when compiling against + newest mingw headers. + +2008-09-26 Dan Winship + + Bug 553447 – g_assert_no_error() + + * glib/gtestutils.h (g_assert_no_error, g_assert_error): Macros to + assert that a GError is not set, or else is set to a particular + error. + + * glib/gtestutils.c (g_assertion_message_error): utility for + those macros + + * glib/tests/keyfile.c: + * tests/asyncqueue-test.c: + * tests/bookmarkfile-test.c: + * tests/convert-test.c: + * tests/file-test.c: Use g_assert_error/g_assert_no_error + +2008-09-26 Dan Winship + + * glib/gthreadpool.c (wakeup_thread_marker): make this a "const + gpointer" rather than a gconstpointer to avoid warnings later + + * glib/pcre/pcre_ucp_searchfuncs.c: + * glib/pcre/pcre_valid_utf8.c: #include "config.h" + + * glib/tests/printf.c (test_d): fool gcc into not warning about + some printf format strings that we know are dubious + +2008-09-26 Matthias Clasen + + Bug 553857 – gbacktrace.h requires signal.h + + * glib/gbacktrace.h: Include signal.h for raise(). + Pointed out by Sebastien Bacher + +2008-09-26 Matthias Clasen + + Bug 553724 – python interpretter path not patched in correctly + + * glib/Makefile.am: Fix the sed magic to replace python. + +2008-09-26 Matthias Clasen + + * glib/gmain.c: Add some more docs. + + * glib/giochannel.c: Move more docs inline, and improve them + on the way. + +2008-09-25 Tor Lillqvist + + Bug 553820 - gpoll.c: undeclared identifier + + * glib/gmain.c + * glib/gpoll.c: Make the g_poll() function non-static also on + Windows. Prefix an underscore to the g_main_poll_debug variable + and make it non-static in gmain.c so that it can be used in + gpoll.c. Add back missing variable declaration. + +2008-09-25 Tor Lillqvist + + * glib/gspawn-win32.c (do_spawn_with_pipes) (do_spawn_directly): + Just ignore the child_setup function, never call it. The is no + situation in which it could be useful on Windows. Do print a + warning, like before. + + * glib/gspawn.c (g_spawn_async_with_pipes): Corresponding change + in documentation. + +2008-09-24 Sven Herzberg + + Be a little more explcit in the docs. Includes Owen's requested + changes. + + * glib/gmain.c: improved documentation for g_source_attach() and + g_source_destroy() + +2008-09-23 Michael Natterer + + * glib/glib.h: #include + + * glib/gpoll.h: #error out if gpoll.h is included directly. + + * glib/gpoll.c: remove trailing whitespace. + +2008-09-23 Dan Winship + + * glib/gpoll.[ch] (g_poll): Move this out of gmain.c and make it part + of the public API. (Part of Bug 505361 - gunixinputstream.c assumes + poll() available.) + +2008-09-23 Tor Lillqvist + + * glib/gmain.c (poll_rest) [Win32]: Fix embarrassing bug: I was + passing an incorrect third parameter to memmove(), had forgotten + to multiply by the size of the table entry. Just use a for loop + instead, clearer. Odd I didn't notice when testing this code. + +2008-09-19 Hans Petter Jansson + + Rewrite most of GHashTable to use open addressing with quadratic + probing instead of chaining. This has the potential to reduce memory + fragmentation significantly, while being slightly faster due to + better locality and no need to call alloc/free functions for nodes. + Benchmarks suggest it also uses less memory overall. + + * glib/ghash.c (prime_mod): Table of suitable primes for + initial-probe distribution. + (g_hash_table_set_shift): New function. + (g_hash_table_find_closest_shift): New function. + (g_hash_table_set_shift_from_size): New function. + (g_hash_table_lookup_node_for_insertion): New function. + (g_hash_table_lookup_node): Rewritten to return node index instead of + pointer, use quadratic probe on flat table, and not return insertion + data. The latter saves some computation for read-only lookups. + (g_hash_table_remove_node): Rewrite to take a pointer directly to the + node structure to remove, and clear that. Remove unlinking code. + (g_hash_table_remove_all_nodes): Rewrite to not clear nodes + individually, but en masse using memset () after potentially calling + notify functions. + (iter_remove_or_steal): Use new data structure and algorithm. Vastly + simplified - now just a call to g_hash_table_remove_node (). + (g_hash_table_resize): New resize code, re-indexing with new prime + and cleaning up tombstones. + (g_hash_table_maybe_resize): Table may hold 8 buckets minimum, no less + than 1/4 load excluding tombstones, and no more than 15/16 load + including tombstones. These numbers are the results of a lot of + benchmarking with multiple complex applications, and should not be + changed lightly. + (g_hash_table_iter_next) + (g_hash_table_lookup) + (g_hash_table_lookup_extended) + (g_hash_table_insert_internal) + (g_hash_table_remove_internal) + (g_hash_table_foreach_remove_or_steal) + (g_hash_table_foreach) + (g_hash_table_find) + (g_hash_table_get_keys) + (g_hash_table_get_values): Use new data structure and algorithm, + fairly trivial changes. + +2008-09-19 Tor Lillqvist + + * glib-zip.in: Look for man pages in share/man. + + * glib/gutils.c (_glib_get_dll_directory) + * glib/gspawn-win32.c (do_spawn_with_pipes): Be a bit less + restrictive, look for the helper programs in the same folder where + the GLib DLL is, not necessarily in a "bin" subfolder of the top + GLib installation folder. + +2008-09-18 Matthias Clasen + + * configure.in: Bump version to 2.19.0 + + * ChangeLog.pre-2-18: rotate ChangeLog + + * === branch for 2.18 === diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 new file mode 100644 index 0000000..73ae096 --- /dev/null +++ b/ChangeLog.pre-2-4 @@ -0,0 +1,2042 @@ +Tue Mar 16 11:50:56 2004 Owen Taylor + + * === Released 2.4.0 === + + * configure.in: Version 2.4.0, interface age 0. + + * README.in: Updates + + * NEWS: Updates + +Sun Mar 14 13:56:48 2004 Owen Taylor + + * glib/gmessages.c (escape_string): Handle invalid + UTF-8. (#131218, patch from Matthias Clasen) + +Sun Mar 14 13:23:36 2004 Owen Taylor + + * glib/gspawn.c: Use fork1() not fork for + G_THREADS_IMPL_SOLARIS. (#136971, Sebastian Wilhelmi) + +Sun Mar 14 12:58:30 2004 Owen Taylor + + * glib/gmain.c: if _POLL_EMUL_H is defined, undefine + HAVE_POLL to prefer our own poll() emulation to the + lame OS/X one. (#136956, Manish Singh) + +Sat Mar 13 23:30:53 2004 Owen Taylor + + * glib/gmacros.h (G_STMT_START): Add __extension__ + to G_STMT_START to quite gcc -pedantic. (#131899, + Olivier Biot) + +Sat Mar 13 23:18:45 2004 Owen Taylor + + * tests/env-test.c (main): Remove critical log handler; + we can't trigger g_return_if_fails() in our test suite + even silently, because the user could have compiled + with --disable-debug. #if 0 the tests for + g_setenv/g_unsetenv with a "foo=bar" variable name. + (#136709, reported by Frédéric L. W. Meunier) + +Sat Mar 13 23:10:35 2004 Owen Taylor + + Some warning fixes for the Sun compiler (Reported by + David L. Cooper II, #136401) + + * glib/giochannel.c (g_io_channel_read): Return + G_IO_ERROR_NONE, not G_IO_STATUS_NORMAL, since hte + function returns a GIOError. + + * glib/guniprop.c: Fix some guchar/gchar confusion + with special_case_table. + +Fri Mar 12 15:30:58 2004 Manish Singh + + * glib/gbacktrace.h: ia32's G_BREAKPOINT() implementation works on + amd64 too. Enable it. + +Fri Mar 12 15:21:22 2004 Manish Singh + + * glib/gatomic.c: Non-optimizing compile fails for two asm + statements on PowerPC. Use generic implementaton for those + cases. Spotted by Christof Petig , + fix by Sebastian Wilhelmi. Bug #137006 has a possible alternate + solution, but we'll be conservative for now. + +Thu Mar 11 02:05:13 2004 Matthias Clasen + + * glib/gmain.c (g_main_depth): Remove an extra semicolon. + Spotted by Kjartan Maraas. + +2004-03-10 Tor Lillqvist + + * glib/gspawn-win32.c + * glib/gspawn-win32-helper.c: Implement + G_SPAWN_FILE_AND_ARGV_ZERO. (#136792, Bruce Hochstetler) + + * tests/spawn-test.c + * tests/spawn-test-win32-gui.c: Test it. + +Tue Mar 9 09:16:11 2004 Owen Taylor + + * === Released 2.3.6 === + + * configure.in: Version 2.3.6, interface age 1. + + * NEWS: Updates + +2004-03-09 Sebastian Wilhelmi + + * tests/child-test.c: Do not run the g_child_watch_* test + multi-threaded, as that doesn't work on linux prior 2.6. Fixes + #136539. + +2004-03-08 Alastair McKinstry + + * configure.in: Added "ga" (Irish) to ALL_LINGUAS. + +2004-03-07 Danilo Å egan + + * configure.in: Added "sr@ije" to ALL_LINGUAS. + +2003-03-07 Hans Breuer + + * glib/gspawn-win32.c : (GPid)shortcut_spawn_retval which + doesn't improve the implementation at all, it just make it + compile with msvc ... + + * glib/makefile.msc.in : build gatomic.c (now really:) + +2004-03-06 Tor Lillqvist + + * README.win32: Update. + + * configure.in + * Makefile.am + * */Makefile.am: Drop the hand-written makefile.mingw(.in) + files. They haven't been maintained in a long time. As several + people have managed to build GLib for Win32 using the + autoconfiscation mechanism, there is no real reason to even try to + maintain the hand-written mingw makefiles. + +2004-03-05 Sebastian Wilhelmi + + * glib/gatomic.c: Fix infinite recursion for + G_MEMORY_BARRIER_NEEDED and DEFINE_WITH_MUTEXES by using a GMutex + instead of G_DEFINE_LOCK. The mutex is allocated by the new + function _g_atomic_thread_init. Fixes #136284. + + * glib/gthreadinit.h, glib/gthread.c: Declare and call + _g_atomic_thread_init during thread system initialization. + +2004-03-05 Tor Lillqvist + + * glib/glib.def: Add g_main_depth. (#136221, Cedric Gustin) + +2004-03-04 Guntupalli Karunakar + + * configure.in: Added "pa" (Punjabi) to ALL_LINGUAS. + +2004-03-04 Sebastian Wilhelmi + + * glib/gmain.c: Use the atomic integer operations for GMainContext + and GMainLoop reference counting. + + * glib/gmain.c: Hold the main_context_list lock, when iterating + the list. Only call g_main_context_wakeup for positive reference + count. + +2004-03-03 Tor Lillqvist + + * glibconfig.h.win32.in: Update to match a configure-generated + glibconfig.h. Specifically: Remove G_{MIN,MAX,MAXU}INT64 + definitions (now in gtypes.h). Remove g_once and + g_static_mutex_get_mutex_impl_shortcut definitions (now in + gthread.h). + + * tests/child-test.c: Use a macro GPID_FORMAT for the format to + print GPid in (%p on Win32, %d on Unix). Maybe configure.in should + place that in glibconfig.h? + + Print verbose error message if CreateProcess() fails. + + Don't close the child handle until in the child watch callback. + + Don't try to run /bin/true on Win32. Run ipconfig instead (just to + pick a program that should exist on all Window boxes). + +2004-03-02 Sebastian Wilhelmi + + * glib/gatomic.c: Fixed missing definition for ppc code. Fix by + Mark McLoughlin . + +Mon Mar 1 16:49:51 2004 Owen Taylor + + * === Released 2.3.5 === + + * configure.in: Version 2.3.5, interface ago 0. + + * NEWS: Some further updates. + +Mon Mar 1 15:49:09 2004 Owen Taylor + + * glib/gmain.c (check_for_child_exited): Don't + call waitpid() on a source that has already exited. + + * glib/gmain.c (g_child_watch_check): Return TRUE + only if the child actually exited. + +Mon Mar 1 15:39:57 2004 Owen Taylor + + Patch from J. Ali Harlow + + * configure.in: Use void * not HANDLE for GPid on win32. + + * glib/gspawn.[ch] glib/gspawn-win32.[ch] glib/glib.def: + Add g_spawn_close_pid(). + + * glib/gspawn.[ch]: Make g_spawn functions take + GPid * instead if int * (GPid == int on unix, will + produce compile warnings until fixed on Win32.) + + * tests/child-test.c: Make the test a little more + inappropriately verbose. + + * glib/gmain.c: Add some documentation warnings about + not closing @pid while the source is active. + +Mon Mar 1 20:32:06 2004 Tim Janik + + * autogen.sh: + - exit with $? instead of 1 in case of failure + - exit with $? if ./configure failed + (that's so autogen.sh && make lines work) + - removed --enable-gtk-doc option + - added $AUTOGEN_CONFIGURE_ARGS + +Mon Mar 1 09:17:32 2004 Owen Taylor + + * glib/gmain.c (g_main_depth): Clarify doc comment. + +2004-03-01 Sebastian Wilhelmi + + * glib/gatomic.c: Define g_atomic_(int|pointer)_get only for + G_ATOMIC_OP_MEMORY_BARRIER_NEEDED. Spotted by Hans Breuer. + +Sun Feb 29 21:42:47 2004 Owen Taylor + + * glib/gmain.c: Fix leftover references to + g_main_context_depth() in docs. + +Sun Feb 29 21:34:34 2004 Owen Taylor + + * glib/gmain.[ch]: Add g_main_depth() (Request from + Tim Janik and Stefan Westerfeld) + +Mon Mar 1 00:26:11 2004 Matthias Clasen + + * NEWS: Update for 2.3.4 + +2003-02-29 Hans Breuer + + * glib/gatomic.c : added win32 api based implementation + for G_PLATFORM_WIN32, !__GNUC__ + + * glb/glib.def : change to g_atomi_* no _fallback + +2004-02-29 Sebastian Wilhelmi + + * configure.in, glib/gatomic.c, glib/gatomic.h: Moved the + assembler functions from gatomic.h to gatomic.c, which makes for + better maintainability. Also use gint instead of gint32 to be able + to use reference counting for ABI-fixed structures with + gint/guint. + + * glib/gthread.h: Adapted accordingly. + + * tests/atomic-test.c: Updated to test for G_MAXINT and G_MININT. + +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + +Fri Feb 27 22:13:22 2004 Matthias Clasen + + * glib/gqueue.c: Trivial doc changes. + +Fri Feb 27 21:58:20 2004 Matthias Clasen + + * glib/ghash.c (g_hash_table_find): Add "Since: 2.4" + +2004-02-27 Sebastian Wilhelmi + + * glib/gasyncqueue.c, glib/gasyncqueue.h: Use + g_atomic_int_(inc|dec_and_test) for reference + counting. g_async_queue_unref_and_unlock and + g_async_queue_ref_locked is deprecated, but still there to + preserve ABI. + + * glib/gasyncqueue.c, glib/gasyncqueue.h: Reading access to + ref_count only with g_atomic_int_get(). + +Fri Feb 27 02:00:34 2004 Matthias Clasen + + * acglib.m4: quote AC_DEFUN macro names so automake + 1.8 won't whine at us. (#134882) + +Fri Feb 27 01:44:41 2004 Matthias Clasen + + * glib/gdate.c: Translate from locale era to AD in + g_date_set_parse(). (#133400, Theppitak Karoonboonyanan) + +Fri Feb 27 00:46:29 2004 Matthias Clasen + + * glib/gstrfuncs.c (g_strerror): Don't modify errno. (#116617, + Balazs Scheidler) + +2004-02-26 Sebastian Wilhelmi + + * glib/gatomic.h: Fix the !G_THREADS_ENABLED case. + + * tests/child-test.c (main): Only run, if threads are enabled. + + * glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for + !G_THREADS_ENABLED + + * glib/gthread.h: Define g_once and + g_static_mutex_get_mutex_impl_shortcut in terms of + G_MEMORY_BARRIER, if defined and if we can inline. + + * configure.in: Remove double checked locking feature check. + + * configure.in, config.h.win32.in, glib/gthread.c: Removed the PID + niceness surrogate for thread priorities as requested by Tim. It + does more harm than good. + + * glib/gatomic.c, glib/gatomic.h: New files to implement atomic + operations for different platforms. Fixes bug #63621. + + * glib/glib.h: Include gatomic.h. + + * configure.in: Add test for assembler routines for atomic operations. + + * glib/Makefile.am: Add gatomic.c, gatomic.h. + + * tests/Makefile.am, tests/atomic-test.c: Unit test for atomic + operations. + +2003-02-26 Hans Breuer + + * glib/glib.def : added g_hash_table_find and a + bunch of g_queue_* + + * glib/gmain.c : make it compile on win32, + child_wake_up_pipe replaced by semaphore like it is done + for the other wake_up_pipe + + * config.h.win32.in : added HAVE_INT64_AND_I64 + * glibconfig.h.win32.in : G_MAXSIZE .. G_M??INT64, + and typedef for GPid + + * test/env-test.c : don't let the local log function + collide in namespace with standard C + +2004-02-25 Sebastian Wilhelmi + + * configure.in, glib/gthread.c: For the PID thread priorities + surrogate use gettid instead of getpid. This also works with nptl + (on linux-2.6), as well as with linuxthreads (on linux-2.4). + +2004-02-24 Sebastian Wilhelmi + + * glib/grand.c: Add Since: 2.4, where due + +Tue Feb 24 14:09:21 2004 Owen Taylor + + * === Released 2.3.3 === + + * configure.in: Version 2.3.3, interface age 0. + +Mon Feb 23 22:24:00 2004 Matthias Clasen + + * NEWS: Start of 2.3.3 section. + +Sun Feb 22 02:32:14 2004 Matthias Clasen + + * configure.in: Set the gmodule suffix to 'a' for aix and + use the aix gmodule implementation. (#85930, Laurent Vivier) + +Sun Feb 22 00:47:04 2004 Matthias Clasen + + * glib/gnode.c (g_node_copy_deep): New function to deep-copy a + GNode and its children. (#93464, James M. Cape) + +Sat Feb 21 15:42:39 2004 Soeren Sandmann + + * glib/gqueue.c: Some documentation fixes. + +Sat Feb 21 13:45:08 2004 Soeren Sandmann + + * glib/gqueue.[ch]: Extend GQueue API to match the GList + API. (#78414). + + * tests/queue-test.c: Update test suite to cover the new API. + +Fri Feb 20 03:02:05 2004 Tim Janik + + * glib/ghash.[hc]: applied patch from #131937 with slight + renames. provides g_hash_table_find(). + +Fri Feb 20 02:39:03 2004 Tim Janik + + * applied patch from David Schleef which implements + a G_MODULE_BIND_LOCAL flag to g_module_open() to disable global + symbol registration. + +Thu Feb 19 18:40:01 2004 Tim Janik + + * glib/gstring.[hc]: for G_CAN_INLINE environments, inline + g_string_append_c() for efficiency. (vaguely based on #118707). + +Wed Feb 18 23:57:42 2004 Matthias Clasen + + * glib/gmain.c: Include signal.h for SIGCHLD. (#134622, Damien + Carbery) + +2004-02-18 Sebastian Wilhelmi + + * glib/gasyncqueue.c: Lazy creation of GCond. Only + signal GCond, if threads are waiting. + + * glib/gmain.c (g_main_context_new): Set context->wake_up_pipe + only for G_THREADS_ENABLED. + +Sat Feb 14 11:05:26 2004 Manish Singh + + * configure.in: Remove unnecessary STRIP_* definitions, and GNU + make check. Really fixes #134102. + +Sat Feb 14 02:11:08 2004 Matthias Clasen + + * configure.in: Make the check for GNU make work when MAKE is a + full path. (#134102, Julio M. Merino Vidal) + +Sat Feb 14 02:08:03 2004 Matthias Clasen + + * configure.in: Suppress xsltproc and xmlcatalog checks + if enable_man=no. (#134091, Julio M. Merino Vidal) + +Sat Feb 14 01:21:34 2004 Matthias Clasen + + * glib/gmain.h: + * glib/gmain.c (g_child_watch_source_new): + * glib/gmain.c (g_child_watch_add): + * glib/gmain.c (g_child_watch_add_full): Wrap waitpid() as a + GSource. This is a partial implementation of the "Unix signal + source". (#50296, Jonathan R. Blandford) + + * configure.in: Add the necessary configury to typedef GPid + appropriately. + + * tests/Makefile.am: + * tests/child-test.c: Test child_watch sources. + +Sat Feb 7 15:02:01 2004 Manish Singh + + * tests/type-test.c: Fix broken test for gsize formats. + +2004-02-05 Robert Sedak + + * configure.in: Added "hr" (Croatian) to ALL_LINGUAS. + +Wed Feb 4 17:58:51 2004 Manish Singh + + * glib/gcompletion.h: Add prototype for g_completion_complete_utf8(). + + * tests/completion-test.c: #include + +2004-02-05 Tor Lillqvist + + * glib/glib.def: Add g_completion_complete_utf8. + +Thu Feb 5 01:19:12 2004 Matthias Clasen + + * tests/file-test.c (test_mkstemp): Weaken an g_assert() to a + g_warning(), since apparently nothing in Posix forces mkstemp() + to reject templates without any X's. (#133397) + +Thu Feb 5 00:56:28 2004 Matthias Clasen + + * glib/gcompletion.c (g_completion_complete_utf8): New function which + works like g_completion_complete(), but strips a trailing incomplete + UTF-8 character from the prefix. (#133313, Theppitak Karoonboonyanan) + + * tests/completion-test.c (main): Some GCompletion tests. + + * tests/Makefile.am: Add completion-test. + +2004-02-01 Tor Lillqvist + + * glib/glib.def: Add g_strsplit_set. + +Sat Jan 31 03:13:56 2004 Matthias Clasen + + * glib/garray.c (g_byte_array_remove_range): Don't return FALSE + from a pointer function. (#131472, Morten Welinder) + +2004-01-30 Noah Levitt + + * glib/gunicomp.h: + * glib/gunidecomp.c: + * glib/gen-unicode-tables.pl: Size compose_table correctly. (#123421, + Simon Josefsson) + + * glib/gen-unicode-tables.pl: Get rid of some new warnings from perl + 5.8.1. + +Tue Jan 27 18:45:47 2004 Manish Singh + + * m4macros/glib-2.0.m4 + * m4macros/glib-gettext.m4: quote AC_DEFUN macro names so automake + 1.8 won't whine at us. + +Wed Jan 28 01:39:21 2004 Matthias Clasen + + * glib/gstrfuncs.h: + * glib/gstrfuncs.c (g_strsplit_set): New function, a cross + between g_strsplit() and strtok(). (#88329, Soeren Sandmann) + + * tests/strfunc-test.c (main): Add g_strsplit_set() tests. + +Fri Jan 23 22:49:52 2004 Matthias Clasen + + * glib/gutils.c (g_get_any_init): Sigh, protect against + pw->pw_gecos being "" as well. (#132317, Kaj-Michael Lang) + +2004-01-23 Tor Lillqvist + + * glib/glib.def: Add new functions. + + * glib/grand.c: Don't include unless + HAVE_UNISTD_H. Include on G_OS_WIN32. + (g_rand_new): Use getppid() only on G_OS_UNIX. + +Thu Jan 22 15:16:11 2004 Owen Taylor + + * === Released 2.3.2 === + +Thu Jan 22 13:55:44 2004 Owen Taylor + + * glib/gtimer.c: Add g_timer_continue(). + (#98536, Tim-Philipp Müller) + + * configure.in: Version 2.3.2, interface age 0. + + * NEWS: tweak, finish. + +Thu Jan 22 20:50:55 2004 Matthias Clasen + + * glib/gutils.c (g_get_any_init): Protect against + pw->pw_gecos being NULL. + +Thu Jan 22 00:41:34 2004 Matthias Clasen + + * glib/gutils.c (g_get_any_init): Don't treat the Win32 + user name like a gecos field, and when extracting a real + name from a gecos field, replace '&' by the capitalized + user name (a traditional passwd feature). + (#118973, reported by Soeren Boll Overgaard) + +Tue Jan 20 22:31:22 2004 Matthias Clasen + + * NEWS: Start of 2.3.2 section. + +Fri Jan 16 21:45:56 2004 Matthias Clasen + + * glib/gstring.c (g_string_ascii_up): Forgot to fix this one. + +Thu Jan 15 22:35:04 2004 Matthias Clasen + + * glib/gstring.c (g_string_up): + * glib/gstring.c (g_string_down): + * glib/gstring.c (g_string_ascii_down): Move initialization of + variables after g_return_val_if_fail. (#131564, Olivier Poncet) + +Sun Jan 11 16:13:20 2004 Manish Singh + + * configure.in: Add G_MAXSIZE, define in terms of G_MAXUfoo. + + * tests/type-test.c: Add test for G_MAXSIZE. + + * glibconfig.h.win32.in: Cleanup, add some missing bits. + +Sun Jan 11 16:05:35 2004 Manish Singh + + * glib/giounix.c: #define _POSIX_SOURCE for SSIZE_MAX. Fixes #128853. + +Sat Jan 10 00:11:12 2004 Manish Singh + + * glib/gutils.h (g_bit_nth_lsf,g_bit_nth_msf): 64-bit cleanliness + fixes. + + * docs/reference/glib/tmpl/misc_utils.sgml: update to reflect the + above take gulongs now. My docs suck, someone should revisit it. + +Fri Dec 19 11:49:21 2003 George Lebl + + * glib/grand.c + glib/grand.h (g_rand_new) (g_rand_new_with_seed) + (g_rand_new_with_seed_array) (g_rand_set_seed_array): Add + the init_by_array functionality from the reference implementation + of the mersenne twister (mt19937ar.c) and change the naming + to fit with the rest of the grand API. New functions are + g_rand_new_with_seed_array, g_rand_set_seed_array. This is only + reliable/tested for the 2.2 version of the seeding as that's what + the reference implementation uses. Also modify g_rand_new to + get 4 longs from /dev/urandom since that will always be available + anyway and we get more entropy and if /dev/urandom is unavailable + use also 4 longs for seeding using secs, usecs, getpid and getppid. + For version 2.0 use only a simple seed again but be more careful + about seeding with secs/usecs in this case. + + * glib/grand.c + glib/grand.h (g_rand_copy): Add g_rand_copy function to copy the + current state of the random number generator. + + * glib/grand.c (g_rand_new): Add testing for EINTR when reading + from /dev/urandom + + * tests/rand-test.c: add testing of the array seeding stuff against + the reference implementation, plus add statistical sanity check + to see that the values outputted are truly kind of random. And + check that g_rand_copy truly copies the state by checking a few + terms. + +Tue Jan 6 15:38:30 2004 Owen Taylor + + * glib/gutils.h: Check defined (__OPTIMIZE__) not + __OPTIMIZE__. (Zack Rusin) + +2003-12-30 Murray Cumming + + * gobject/glib-mkenums.in: Added a lowercase_name option, to be used + next to the enum declaration, where the flag option is already used, + when it is not possible to guess where to put the underscores in the + _get_type() function name, for instance for GNOMEVFSURIHide. + +Fri Dec 26 02:03:58 2003 Matthias Clasen + + * glib/garray.[hc] (g_ptr_array_foreach): New function to + call a function for each element of a GPtrArray. (#114790) + + * tests/array-test.c (main): Add a test for g_ptr_array_foreach(). + +Sun Dec 21 22:57:58 2003 Matthias Clasen + + * m4macros/glib-gettext.m4: Quote macro names to support + reading the file multiple times. (#125537) + +Sun Dec 21 22:42:42 2003 Matthias Clasen + + * glib/gmem.c (g_mem_chunk_destroy): Fix the locking of the + mem_chunks list. (#127096, Balazs Scheidler) + +2003-12-14 Hans Breuer + + * glib/gfileutils.c : make g_file_test(,G_FILE_TEST_IS_EXECUTABLE) + return something useful on win32, too. + +2003-12-13 Hans Breuer + + * glib/gconvert.c : get_filename_charset() needs to + return false for filenames not encoded in utf-8, + which is always true on win32 + + * glibconfig.h.win32.in : (u)int64 modifier isn't the + gcc 'll' but always the msvcrt one 'I64' + + * glib/glib.def : updated + +Thu Dec 11 10:31:21 2003 Manish Singh + + * glib/gmacros.h: change #elif with no expression to #else in + G_STRFUNC definition. Thanks to Damien Carbery, fixes #129101. + +Mon Dec 8 12:02:40 2003 Owen Taylor + + * === Released 2.3.1 === + + * NEWS: Further updates for 2.3.1. + +Fri Dec 5 12:09:13 2003 Manish Singh + + * glib/gunidecomp.c (_g_utf8_normalize_wc): fix gint/gsize confusion. + +2003-12-04 Noah Levitt + + * glib/gunidecomp.c: Add hangul composition and decomposition to + unicode normalization. (#100456) + + * tests/unicode-normalize.c: Test hangul. + +Tue Dec 2 02:29:41 2003 Matthias Clasen + + Fix for #103710, Mark Jones: + + * glib/gtypes.h (G_MAXINT64): Define G_{MIN,MAX,MAXU}INT{8,16,32,64}. + * configure.in: Don't put G_{MIN,MAX,MAXU}INT64 in glibconfig.h. + +Thu Nov 27 17:04:08 2003 Tim Janik + + * glib/gstrfuncs.c (g_strconcat): handle NULL arguments + gracefully. + + * glib/gmacros.h: defined G_STRFUNC, which (pretty) prints the + current function (since G_STRLOC and G_GNUC_*FUNCTION became + unusable with gcc-3.0). + +Wed Nov 26 16:45:16 2003 Roozbeh Pournader + + * glib/gstrfuncs.c: Fixed a bad pointer comparison in + g_ascii_strtod that came up in fa_IR locale (#126640, Behdad + Esfahbod). + + * tests/strtod-test.c: Fixed the tests to catch the above. + +Sat Nov 22 14:16:51.15 2003 Andrew Lanoix + + * glib/giowin32.c: Bind inter-thread comminication + sockets to INADDR_LOOPBACK instead of INADDR_ANY. + +Thu Nov 20 15:09:40 2003 Manish Singh + + * configure.in: Added G_GSIZE_FORMAT and friends + + * tests/printf-test.c + * tests/testglib.c + * tests/type-test.c: Add tests for the above. + +Mon Nov 17 17:28:10 2003 Manish Singh + + * tests/thread-test.c (test_g_thread_once): Use GUINT_TO_POINTER + for g_thread_create data. + +Sat Nov 15 23:00:57 2003 Matthias Clasen + + * glib/guniprop.c (g_utf8_casefold): Add a NULL check + to be consistent with the other g_utf8_ functions. (#121618, + Tim-Philipp Müller) + +2003-11-15 Tor Lillqvist + + * tests/makefile.msc.in: Fix for MSVC build: Skip strtod-test, use + correct glib libraries, with 2.0 in the names. (#126906, John + Ehresman) + +Sat Nov 15 00:46:14 2003 Matthias Clasen + + * configure.in: Don't blindly set glib_cv_long_long_format to + "ll" when using the included printf. As long as the native + printf supports 64bit printing, use the native format. + (#119525, Tor Lillqvist) + +Fri Nov 14 00:28:46 2003 Matthias Clasen + + * glib/gi18n.h: + * glib/gi18n-lib.h: Also define bind_textdomain_codeset() in + the #ifndef ENABLE_NLS case. + +Wed Nov 12 15:06:27 2003 Owen Taylor + + * configure.in: Version 2.3.1, interface age 0. + + * NEWS: Update for 2.3.1. + +2003-11-07 Mark McLoughlin + + * glib/gconvert.c: (get_filename_charset): re-work to + retain a copy of the cached charset rather than the + actual return value from g_get_charset (which may + change). Also, re-initialize the cache if it does + change. See bug #126454. + +Thu Nov 6 00:04:46 2003 Matthias Clasen + + * glib/gconvert.c (get_filename_charset): Replacement for + have_broken_filenames() which consults the environment variable + G_FILENAME_ENCODINGS in addition to G_BROKEN_FILENAMES. + * glib/gconvert.c (g_filename_from_utf8): + * glib/gconvert.c (g_filename_to_utf8): + * glib/gconvert.c (_g_convert_thread_init): Use + get_filename_charset() instead of have_broken_filenames(). + +Wed Nov 5 22:05:19 2003 Matthias Clasen + + * glib/gi18n-lib.h: + * glib/gi18n.h: New headers defining common gettext-support + macros. + + * glib/Makefile.am (glibsubinclude_HEADERS): Add gi18n.h + and gi18n-lib.h. + + * glib/gstrfuncs.h: + * glib/gstrfuncs.c (g_strip_context): Auxiliary function for + the implementation of Q_(). + +2003-11-05 Morten Welinder + + * glib/garray.c (g_ptr_array_remove_range): Make it compile. + (#119337, self.) + + * glib/gstring.c (g_string_insert_len): Handle the case where the + to-be-inserted string is a substring of the target string. + (g_string_assign): Handle "s = s;". + (#114260, self.) + +Sun Nov 2 01:47:31 2003 Matthias Clasen + + Fix 64bit printing for MSVC builds (#119292, Hans Breuer): + + * configure.in (HAVE_INT64_AND_I64): Define for MSVC to + include support for printing __int64 with format %I64 in + the gnulib printf wrappers. + * glib/gnulib/printf-args.h (enum arg_type): Add TYPE_INT64 + and TYPE_UINT64. + * glib/gnulib/printf-args.h (struct argument): Add a_int64 and + a_uint64 members. + * glib/gnulib/printf-args.c (printf_fetchargs): Support + TYPE_INT64 and TYPE_UINT64. + * glib/gnulib/printf-parse.c (printf_parse): Parse I64 format + modifier and map formats to TYPE_INT64. + * glib/gnulib/vasnprintf.c (vasnprintf): Print TYPE_INT64 with + format modifier I64. + * glib/gnulib/README: Document the __int64 support. + +Sat Nov 1 08:45:38 2003 Owen Taylor + + * glib/gmain.c (g_main_context_iterate): Set the + return value from the result of g_main_context_check() + (after we poll) rather than g_main_context_prepare. + (#121675, Padraig O'Briain) + +Fri Oct 31 00:13:53 2003 Matthias Clasen + + * configure.in: Remove the semicolon from the definition of + g_once(), so that GPOINTER_TO_INT (g_once (...)) works. + +Tue Oct 28 23:38:30 2003 Matthias Clasen + + * tests/printf-test.c: Change the %e tests to not check for + actual string equality, but rather equality under g_ascii_strtod(), + since the number of leading digits in the exponent seems to + be not exactly prescribed by SUS. + +Fri Oct 24 17:09:04 2003 Owen Taylor + + * === Released 2.3.0 === + + * NEWS: Small update. + +2003-10-24 Tor Lillqvist + + * configure.in: Force shared library (DLL) only on Windows. + (I don't think that is controversial?) Remove unnecessary + AC_LIBTOOL_WIN32_DLL. Don't use -D_REENTRANT on + Win32, it is not used by mingw or MSVC headers. + + * config.h.win32.in + * glibconfig.h.win32.in: Match what configure produces. + + * glib/gconvert.c + * glib/gutils.c: Mark a couple of functions and variables that + aren't public as static. + + * glib/gnulib/g-gnulib.h: Undef HAVE_SNPRINTF before (re)defining + it potentially differently, to silence compiler. + + * glib/glib.def: Add some missing entries. + + * tests/gobject/Makefile.am (LDADD): Reorder, put libgobject after + libtestgobject. + + * tests/gobject/ifaceproperties.c (main): NULL-terminate arg list + to g_object_set() and _get(). + +Thu Oct 23 12:38:24 2003 Owen Taylor + + * tests/gobject/Makefile.am (dist-hook): Remove + and extra backslash. + + * tests/gobject/Makefile.am (EXTRA_DIST): Add + testmarshal.list. + + * glib/Makefile.am (libglib_2_0_la_SOURCES): Add + missing gunicode-private.h. + + * tests/testglib.c (main): Fix a warning. + + * tests/gobject/ifaceinherit.c: Remove check that + wasn't supposed to work (adding an interface already + added to the derived class to the base class), + fix a bug. + +Wed Oct 22 23:41:03 2003 Matthias Clasen + + * NEWS: Update for 2.3.0. + +Tue Oct 14 17:44:38 2003 Owen Taylor + + * tests/gobject/ifaceproperties.c: Test for interface + properties and GParamSpecOverride. + +Wed Oct 8 23:40:26 2003 Matthias Clasen + + * glib/gmarkup.c (g_markup_printf_escaped): + (g_markup_vprintf_escaped): Document as 2.4 additions. + (unescape_text): Implement newline and whitespace normalization + according to the XML specification. (#123919) + (g_markup_escape_text): Document whitespace (non)handling. + +2003-10-05 Matthias Clasen + + * configure.in: Make the various printf feature test macros + reflect the system printf, even when using the included printf. + In particular, don't force HAVE_C99_SNPRINTF, since g-gnulib.h + needs that test result. (#122973) + + * glib/gprintf.c (g_vasprintf): Don't rely on HAVE_VASPRINTF, + directly check for _g_vasprintf. + + * glib/gprintfint.h (_g_vasprintf): Only define _g_vasprintf() + if vasprintf() is available. + + * glib/gnulib/printf.c (_g_gnulib_vfprintf): Don't write + trailing nul to the file. (#122973) + + * acinclude.m4 (AC_FUNC_VSNPRINTF_C99): Make the test + detect non-C99-compliance of AIX 5.1 and Solaris + vsnprintf(). (#122496) + +Thu Oct 2 01:15:46 2003 Owen Taylor + + * tests/gobject/ifacecheck.c: Test case for + g_type_add_interface_check(). + + * tests/gobject/ifaceinit.c: Add #undef G_DISABLE_ASSERT. + +Thu Oct 2 01:11:39 2003 Owen Taylor + + * tests/gobject/ifaceinherit.c: Remove some tests that + were testing things that weren't supposed to work; add + a test for adding an interface first to the child class, + then to the parent class. + +Thu Oct 2 00:02:55 2003 Owen Taylor + + * tests/gobject/Makefile.am test/gobject/ifaceinherit.c: + Tests of interface inheritance and overriding. + +2003-09-30 Tor Lillqvist + + * glib/gspawn-win32.c (do_spawn): Call protect_argv() in + do_spawn() instead of in do_spawn_with_pipes() so that we can use + the original argv[0] as the program file name parameter to + spawnv() in the shortcut (doing without helper process) + code. Fixes problem if GIMP 1.3 was installed in a path with + spaces in the name. + +Tue Sep 30 15:31:16 2003 Soeren Sandmann + + * glib/guniprop.c (has_more_above): make the argument const to + get rid of warning + + * glib/garray.c (g_byte_array_remove_range): insert cast to get + rid of warning + +2003-09-29 Tor Lillqvist + + * tests/testglib.c (main): Use hardcoded name for DLL, as there is + no reliable way to determine it at compile or run time anyway. + +2003-09-29 Matthias Clasen + + * glib/guniprop.c (g_unichar_get_mirror_char): Add "Since: 2.4" + to docs. + +Thu Sep 25 15:43:08 2003 Owen Taylor + + * tests/gobject/testmodule.[ch] test/gobject/Makefile.am: + Dummy dynamic type module for testing type plugin code + and dynamic types. + + * test/gobject/defaultiface.c: Test of + g_type_default_interface_ref() and friends. + +2003-09-28 Gediminas Paulauskas + + * configure.in: Added lt to ALL_LINGUAS. + +2003-09-25 Tor Lillqvist + + * glib/glib.def: Remove g_bsearch_array_* entries that don't exist + any longer. (ABI change?) + +Thu Sep 25 15:01:37 2003 Owen Taylor + + * tests/Makefile.am (SUBDIRS): Add gobject/. + +Fri Sep 12 16:26:21 2003 Owen Taylor + + * tests/gobject/ configure.in: New directory, framework + for automated GObject tests. + + * tests/gobject/override.c: Move testoverride.c + here, automate. + + * tests/gobject/ifaceinit.c: Move testifaceinit.c here. + + * tests/gobject/accumulator.c: Test signal accumulators, + including g_signal_accumulator_true_handled. + +2003-09-12 Noah Levitt + + * glib/gen-unicode-tables.pl: Take a directory where to look for the + unicode files on the command line instead of 7 individual files. + +2003-09-12 Noah Levitt + + * glib/gen-unicode-tables.pl: + * glib/gunichartables.h: + * glib/gunicode.h: + * glib/guniprop.c: Add g_unichar_get_mirror_char. (#114749) + +Thu Sep 11 20:11:05 2003 Owen Taylor + + * glib/gmarkup.c: Add g_markup_printf_escaped(), + g_markup_vprintf_escaped(). + + * tests/markup-escape-test.c (main): Test for + g_markup_escape_text(), g_markup_printf_escaped(). + +2003-09-10 Noah Levitt + + * glib/gunicodeprivate.h: + * glib/gunicollate.c: + * glib/gunidecomp.c: + * glib/guniprop.c: + * tests/casemap.txt: + * tests/gen-casemap-txt.pl: Unicode 4.0 special casing. (#114681) + + * glib/gunicodeprivate.h: Use a private header instead of extern + function declarations (_g_utf8_normalize_wc, + _g_unichar_combining_class). + +Mon Sep 8 00:31:10 2003 Stefan Westerfeld + + * glib/gbsearcharray.h: inserted casts for C++. + +2003-08-28 Matthias Clasen + + * tests/patterntest.c (verbose): Fix a C99ism. (#120821, Thomas + Klausner) + +2003-08-25 Tor Lillqvist + + * glib/giowin32.c (read_thread): Avoid UNLOCKing the critical + section twice, which might cause a hang. (#120653) + + * glib/giowin32.c (g_io_channel_unix_new): Warn if fd is both a + valid file descriptor and socket. + +Mon Aug 25 12:34:36 2003 Owen Taylor + + * glib/gmessages.c: Escape control characters in g_logv() output. + (#108287, Christian Biere) + +Mon Aug 25 12:17:20 2003 Owen Taylor + + * glib/gmain.c (g_main_context_unref_and_unlock): + When DISABLE_MEM_POOLS is set, loop through and free + the poll records explicitely, since g_mem_chunk_destroy() + won't do it. (#118121, Morten Welinder) + +2003-08-22 Samúel Jón Gunnarsson + + * is.po: Added "is" to ALL_LINGUAS. + +2003-08-19 Tor Lillqvist + + * glib/gmessages.c (g_logv): [Win32] Make the fatal error message + box easier to notice with MB_SETFOREGROUND. Also use MB_ICONERROR + to get a nice stop-sign icon. + +Tue Aug 19 09:42:06 2003 Owen Taylor + + * m4macros/glib-gettext.m4: Add $INTLLIBS to $LIBS + temporarily, not -lintl. (Problem with fix for + #119171, pointed out by James Henstridge) + +Tue Aug 19 03:55:29 2003 Tim Janik + + * glib/gbsearcharray.h: license change, no restrictions are made + in the new license at all, the implmentation is simply provided + "as is" to allow copy-pasting the code into any third-party app. + naturally, the implementation is self-contained within the header + file to allow this. + default to non-shrinking behaviour, allow users to request shrinking + via G_BSEARCH_ARRAY_AUTO_SHRINK. + creation, deletion functions are now named g_bsearch_array_create() + and g_bsearch_array_free(). + fixed const in prototypes, removed cruft. + (g_bsearch_array_insert): take only three arguments, do nothing if the + node to insert is already there. + (g_bsearch_array_replace): insert or replace if the node is already + there. + (g_bsearch_array_remove): remove nodes by index, the index of a node + can be found via g_bsearch_array_get_index(). + removed other g_bsearch_array_remove*() variants. + (g_bsearch_array_lookup): minor optimizations. + (g_bsearch_array_lookup_sibling): return nodes on mismatches. + + * glib/gbsearcharray.c: removed. + +2003-08-16 Tor Lillqvist + + Fix #117925 (Dov Grobgeld): + + * glib/gutils.c (g_find_program_in_path, g_basename, + g_path_get_basename, g_path_is_absolute, g_path_skip_root, + g_path_get_dirname, g_get_any_init): On Win32, look also for + slashes ('/') as pathname separators. + + * glib/gfileutils.c (g_file_open_tmp): Ditto. If the template + contains a pathname separator, include the actual one in the error + message, instead of always the canonical one. + + (g_build_filename): Separate implementation on Win32 that looks + for either slash or backslash. Document Unix/Windows differences. + + * tests/testglib.c + * tests/strfunc-test.c: Test above functionality on Win32. + +2003-08-15 Tor Lillqvist + + * glib/gmain.c (g_poll): [Win32] Don't exceed handle array + bounds. Warn if there would be too many handles to wait + for. (WaitForMultipleObjects() has a relatively low limit of 64 + handles. The Win32 IO channel code should be fixed not to need to + wait for one handle per file or socket being watched. Later.) + +2003-08-13 Tor Lillqvist + + * glib/Makefile.am + * gmodule/Makefile.am + * gobject/Makefile.am + * gthread/Makefile.am: Use srcdir also in references to the .def + files. (#118885, Jeff Bonggren) + +2003-08-12 Tor Lillqvist + + * glib/gconvert.c (g_locale_from_utf8): Drop the Win32-specific + implementation. It used WideCharToMultiByte(), which is broken as + it stores unconvertable characters as fallback characters + (question marks) in the destination string without being able to + tell how much of the conversion succeeded. Using g_convert() like + on Unix is better and simpler. (#117872) + + (g_locale_to_utf8): No need for the Win32-specific implementation + here, either. + + (have_broken_filenames): Define as TRUE on Win32. + + (g_filename_to_utf8, g_filename_from_utf8): Drop Win32 ifdefs. As + have_broken_filenames() now is defined TRUE on Win32, works as + before. + +2003-08-11 Matthias Clasen + + * acinclude.m4: Copy newer versions of JH_CHECK_XML_CATALOG and + JH_PATH_XML_CATALOG from gtk-doc to enable configuring without + xmlcatalog in PATH. (#119115) + +2003-08-10 Tor Lillqvist + + * glib/gutils.c (g_getenv): Don't use a cache of variable name to + value mappings on Win32, as that breaks g_setenv() and + g_unsetenv(). Only call ExpandEnvironmentStrings() if necessary, + and in that case return a quarkified string. It is still + questionable how necessary expanding embedded environment variable + references is. Possibly the whole Win32-specific g_getenv() + implementation could be removed. (#119520) + +2003-08-08 Tor Lillqvist + + * glib/glib.def: Add g_once_impl. + + * glib/gutils.c (g_setenv): Fix syntax error in the !HAVE_SETENV + case. + +2003-08-08 Matthias Clasen + + * tests/env-test.c (main): Remove a test for getenv() behaviour + which isn't specified by SUS and doesn't work on Solaris. + +2003-08-07 Matthias Clasen + + * tests/env-test.c: Add tests for '=' in names and values. + + * glib/gutils.c (g_setenv, g_unsetenv): Check that the variable + name doesn't contain '='. Add a declaration for environ. (#119338) + + * acinclude.m4: Tighten the snprintf() test to check behaviour on + zero-size buffers. (#106091) + + * tests/patterntest.c: Specify test strings in UTF-8, remove all + charset conversion. Replace the NOISY define by a cmdline arg + --noisy. (#115757) + +Thu Aug 7 15:01:09 2003 Owen Taylor + + * m4macros/glib-gettext.m4: Set $LIBS to include + -lintl when checking for dcgettext and + _nl_msg_cat_cntr. (Tim Mooney, #119171) + +Thu Aug 7 14:15:44 2003 Owen Taylor + + * glib/gmain.c (g_idle_source_new): Make the default priority + for idle sources G_PRIORITY_DEFAULT_IDLE as anybody would + expect and document that. (#114461, reported by Andy Wingo) + +2003-08-06 Noah Levitt + + * tests/casemap.txt: + * tests/gen-casemap-txt.pl: Add test for special case not at inital + position in the string, the bug just fixed. (#118957) + +2003-08-05 Noah Levitt + + * glib/guniprop.c: Get rid of "len" parameter to output_special_case + and output_marks, and make them work more like g_unichar_to_utf8, + fixing a bug in the process. (#118957) + +2003-08-05 Hans Breuer + + * glib/gnulib/makefile.msc : (new file) for msvc build + + * glib/gnulib/vasnprintf.c : use glib/galloc.h + + * glib/gnulib/printf.h : #include for FILE* + + * glib/makefile.msc.in : replace trio with gnulib + + * glib/glib.def : updated externals + + * glib/guniprop.c : fix for guniprop.c(582) : error C2082: + redefinition of formal parameter 'len' + +2003-08-04 Noah Levitt + + * tests/unicode-normalize.c: We do handle > BMP now, so test it. + +2003-07-31 Noah Levitt + + * tests/file-test.c: s/g_read_link/g_file_read_link/ (#118727) + +2003-07-31 Noah Levitt + + * tests/unicode-encoding.c: Return nonzero exit status if the test + fails. (#118729) + +2003-07-31 Noah Levitt + + * tests/utf8.txt: Change instances of U+10ffff to U+10fffd, since that + is the last valid unicode character. Add check that U+10ffff is + NOTUNICODE. (#118730) + +2003-07-30 Noah Levitt + + * glib/gen-unicode-tables.pl: + * glib/gunibreak.c: + * glib/gunibreak.h: + * glib/gunichartables.h: + * glib/gunicode.h: + * glib/gunicomp.h: + * glib/gunidecomp.c: + * glib/gunidecomp.h: + * glib/guniprop.c: + * tests/casefold.txt: + * tests/casemap.txt: + * tests/gen-casefold-txt.pl: + * tests/gen-casemap-txt.pl: Update Unicode data to 4.0. (#107974) + +2003-07-31 Tor Lillqvist + + * glib/gspawn-win32.c: When possible, manage without the helper + process. (Part of the enhancements outlined in #98737.) Speeds up + GIMP 1.3's first-time-run plug-in query phase a lot. + + Plug a file descriptor (and thus Win32 handle) leak: close the + read end of the child error report pipe after use. + +2003-07-30 Matthias Clasen + + * glib/gutils.c (g_unsetenv): Use same argument name as in header, + to pacify gtk-doc. + (g_getenv): Move docs inline, add comment about lifespan of return + value. + + * glib-2.0.pc.in (Libs): Remove forgotten @TRIO_LIBS@. (#118616, + Noah Levitt) + + * glib/gfileutils.[hc]: Rename g_read_link() to g_file_read_link() + to better match the remaining file utilities in the g_file_ + namespace and to better separate it from readlink(). This is + hopefully no problem as the function is just 2 days old. + +2003-07-29 Matthias Clasen + + * glib/gqsort.[hc] (g_qsort_with_data): + * glib/gconvert.[hc] (g_filename_to_uri, g_filename_from_uri): + * glib/gfileutils.[hc] (g_mkstemp, g_file_open_tmp): Use gchar, + gint, gsize instead of char, int, size_t in the interface for + consistency. (#118567) + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf + understands %llu; rename enable_trio to enable_included_printf; + add misc. tests needed for gnulib vasnprintf(); define + G_GINT{16,32,64}_MODIFIER in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): + AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, + gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and + trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ + functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched + to live in the _g_gnulib namespace, use g_malloc instead of + malloc, and support long long printing even if system printf + doesn't. For more details, see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + +2003-07-28 Matthias Clasen + + * glib/gfileutils.h: + * glib/gfileutils.c: New function g_read_link(). (#72545) + + * configure.in: Check for setenv, unsetenv, readlink and symlink. + + * tests/file-test.c (test_readlink): Test for g_read_link() (only + on systems supporting symbolic links). + + * tests/env-test.c: New test for g_{get,set,unset}env(). + + * tests/Makefile.am (test_programs): Add env-test. + + * glib/gutils.h: + * glib/gutils.c: New functions g_setenv() and g_unsetenv(). (#100763) + +2003-07-26 Matthias Clasen + + * tests/printf-test.c: New test, tests printf behaviour. This was + already mentioned in Makefile.am by accident. + + * tests/file-test.c: New test, currently contains mkstemp tests + copied from testglib.c. + + * tests/Makefile.am (test_programs): Add file-test. + + * glib/gprintf.c: Fix all g_return_val_if_fail () checks to return + -1 on error to match the behaviour of the stdio printf() family. + + * glib/garray.h: + * glib/garray.c (g_{,byte,pointer}_remove_range): New functions to + remove a range of elements from an array. (#94879, Nalin Dahyabhai) + + * glib/gmessages.c (g_logv): Remove the 1024 char limit in the + common (non-recursive) case. + +2003-07-25 Matthias Clasen + + * glib/gwin32.c: + * glib/gutf8.c: + * glib/gunicollate.c: + * glib/gtree.c: + * glib/gspawn.c: + * glib/gmain.c: + * glib/giochannel.c: + * glib/gfileutils.c: + * glib/gerror.c: + * glib/gconvert.c: + * glib/gasyncqueue.c: + * glib/gmem.c: Remove some explicit Docbook markup which is no + longer necessary since gtk-doc does the right thing. + + * glib/gutf8.c (g_utf8_get_char_validated): Work around gtk-doc stupidity. + +2003-07-20 Hans Breuer + + * glib/trio/makefile.msc : (new file) for msvc build + + * glib/glib.def : removed some duplicated entries + + * glib/gscanner.c : add same workaround for MSVC(5.0) + which does not allow to cast an uint64 to float. + Same as in gvaluetransform.c + Also move #include behind inclusion of "glib.h" + which defines the needed G_OS_WIN32 + + * glib/makefile.msc.in : added gprintf.obj, trio\trio.lib + as well as shell32.lib + + * tests/spawn-test.c : include on win32 + +2003-07-12 Matthias Clasen + + * glib/gprintf.c: Doc additions. + +2003-07-10 Joel Brich + + * configure.in: Added "eo" to ALL_LINGUAS. + +Wed Jul 9 16:27:26 2003 Manish Singh + + * glib/gmain.c (g_main_context_unref_and_unlock): check if + context->poll_chunk is set before trying to destroy it. For example, + this can happen if no sources are added to a context before it is + freed. + +2003-07-09 Morten Welinder + + * glib/gprintf.c (g_vasprintf): Avoid var declaration after + statement. + +2003-07-09 Matthias Clasen + + Support for one-time initialization functions. (#69668, Sebastian + Wilhelmi) + + * configure.in: Check whether double checked locking is safe, + define g_once() in glibconfig.h accordingly. + * glib/gthread.h: Add GOnce, GOnceStatus, G_ONCE_INIT and g_once_impl. + * glib/gthread.c (g_once_impl): Fallback implementation using a + mutex if double checked locking is unsafe. + * tests/thread-test.c: Add tests for g_once(). + +2003-07-02 Matthias Clasen + + * glib/gstrfuncs.c (g_strfreev): Move docs inline, document behavior + for NULL. (#116439, Steve Chaplin) + +2003-06-25 Abigail Brady + + * glib/gconvert.c (g_convert_with_fallback): Use C99 style \uxxxx + and \Uxxxxyyyy escapes instead for fallback instead of perl-style + \X{xxxx} ones, fixing bug #114284. + +2003-06-25 Tor Lillqvist + + * glib/giowin32.c (g_io_channel_unix_new): Pass real &optval and + &optlen to getsockopt() instead of NULL. Don't remember why I + thought that NULL could be used (as we don't actually use the + returned value for anything), the Platform SDK documentation + doesn't imply so. + +2003-06-19 Matthias Clasen + + * glib/gutils.c (g_path_get_basename): Move the documentation + inline and add details. (#108505) + +2003-06-18 Matthias Clasen + + * acinclude.m4 (JH_PATH_XML_CATALOG, JH_CHECK_XML_CATALOG): New + macros to check for XML catalog contents and path, borrowed from + gtk-doc. + + * configure.in: New option --enable-man to enable regeneration of + man pages from Docbook, if the necessary tools are found. + +2003-06-17 Matthias Clasen + + * acinclude.m4 (JH_PATH_XML_CATALOG, JH_CHECK_XML_CATALOG): New + macros to check for XML catalog contents and path, borrowed from + gtk-doc. + + * configure.in: New option --enable-man to enable regeneration of + man pages from Docbook, if the necessary tools are found. + +2003-06-15 Tor Lillqvist + + * glib-zip.in (DLLDIR): Test where the DLLs actually are. + + * README.win32: Point to FSF's binary Win32 distributions of + libiconv and gettext-runtime. + +2003-06-11 Tor Lillqvist + + * glib-zip.in (DEVZIP): libtool 1.5 installs DLLs in the bin + subdirectory, so get them from there. + + * glib/gwin32.c (g_win32_getlocale): Use "sr@Latn" and "sr" in the + same way as the po files for Serbian in Latin and Cyrillic script. + +2003-06-11 Sebastian Wilhelmi + + * configure.in: Remove false &. Spotted by Albert Chin + . + +2003-06-08 Tor Lillqvist + + * glib/giowin32.c: Fix indentation and spacing. Use + INADDR_LOOPBACK instead of inet_addr("127.0.0.1") and + gethostbyaddr(). + +Sat Jun 6 16:18:10 2003 Andrew Lanoix + + * glib/giowin32.c: Resolved thread deadlocks in socket + ichannel code to support Add-Cancel-Add watch functionality + on windows. Also cleaned up socket error handling to not + segfault and do the right thing. + +Fri Jun 6 10:24:23 2003 Hidetoshi Tajima + + * m4macros/glib-gettext.m4: Test for Solaris native gettext + in libc, seeing if it supports GNU catalog format (#85217). + +Thu Jun 5 23:40:31 2003 Owen Taylor + + * glib/gmain.c: When dispatching a source that is + !CAN_RECURSE, temporarily remove any file descriptors + that that source has registered from the main loop, to keep + recursive main loops from busy-waiting if input + becomes available on one of those file descriptors. + (#112222, Christian Krause) + + * glib/gmain.c (g_source_set_priority): Properly + remove the source from the context's source list + and reinsert it sorted, rather than simply setting + source->next/prev to NULL! (#114274) + +2003-06-06 Matthias Clasen + + * glib/gstring.c (g_string_append_printf_internal): Use + g_vasprintf() and g_string_append_len(), thus enabling embedded + nuls in the result of g_string_printf(). (#92492, Owen Taylor) + + * tests/string-test.c: Add a test for embedded nuls in the + result of g_string_printf(). + + * glib/gprintf.[ch]: Synchronize argument names with headers and docs. + (g_vasprintf): An implementation of vasprintf(), code was lifted + from g_strdup_vprintf(). (#112365) + + * glib/gstrfuncs.c (g_strdup_vprintf): Just use g_vasprintf(). + +2003-06-05 Tor Lillqvist + + * glib/giochannel.h + * glib/gmain.h: Remove bogus (Win32-only) declaration of + g_main_poll_win32_msg_add(). No such function exists. + + * glib/gmain.c (g_poll) [Win32]: Use g_win32_error_message() for + better warning messages. + +2003-06-04 Noah Levitt + + * glib/gunidecomp.h (combine): Fix typo (#114375). Also, make the + function static. + +2003-06-03 Sebastian Wilhelmi + + * configure.in: Test for pthread_setschedparam. If not existant, + disable priorities. (#104718) + +Mon Jun 2 14:18:21 2003 Owen Taylor + + Patch from Jeffrey Stedfast (#104825) + + * glib/gspawn.c (read_data): Don't read() into '&buf', while this + is technically okay - it is clearer as just 'buf'. + (write_all): New helper function that handles write() interrupts. + (write_err_and_exit): Use write_all() instead of write(). + (fork_exec_with_pipes): Same here. + +Sun Jun 1 09:42:36 2003 Owen Taylor + + * glib/giochannel.c (g_io_error_get_from_g_error): Put + the g_return_val_if_fail() in the right place. + +Fri May 31 1:17:45 2003 Ray Strode + + * glib/giochannel.c (g_io_channel_error_from_errno): + Fix typo: should be G_IO_ERROR_UNKNOWN not + G_ERROR_ERROR_UNKNOWN + +Fri May 30 19:23:47 2003 Owen Taylor + + * glib/gstrfuncs.c (g_ascii_strncasecmp) + * glib/gstrfuncs.c (g_ascii_strcasecmp): Use TOLOWER() + macro instead of g_ascii_tolower() (#107138) + +Fri May 30 19:09:25 2003 Owen Taylor + + * m4macros/glib-gettext.m4: Backport better handling + of ALL_LINGUAS from gettext.m4. (#103808, Andras Salamon) + +Fri May 30 18:46:05 2003 Owen Taylor + + * m4macros/glib-gettext.m4: expand $exec_prefix as + well as $prefix. (#107290, reported by Morten Welinder, + patch from Raja Harinath) + +Fri May 30 17:24:23 2003 Owen Taylor + + * glib-gettextize.in: Quote $srcdir to handle $srcdir + with spaces (#107850, Evan Martin) + +Fri May 30 16:48:26 2003 Owen Taylor + + * glib/giochannel.c (g_io_channel_error_from_errno): + Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, + since close() can return EINTR. (#11842, Balazs Scheidler) + +Fri May 30 15:51:43 2003 Owen Taylor + + * glib/giochannel.c (g_io_error_get_from_g_error): + Do a g_return_val_if_fail() on err == NULL to be a + bit more robuts on buggy IO channel implementations. + (#113396, Dan Winship) + +Tue May 27 19:56:35 2003 Owen Taylor + + * glib/gmacros.h: __PRETTY_FUNCTION__ was made a non-token + before gcc-3.0.0 for C++. (Fix from Martin Kretzschmar, + #113797) + +2003-05-28 Matthias Clasen + + * tests/patterntest.c: Remain silent when sucessful. + + * tests/Makefile.am: Add patterntest to make check. (113143) + +2003-05-27 Matthias Clasen + + * glib/gstrfuncs.c (g_strdup): Use memcpy instead of + strcpy. (#106988, Christian Biere) + +2003-05-27 Matthias Clasen + + * glib/gstrfuncs.c (g_strdup): Use memcpy instead of + strcpy. (#106988, Christian Biere) + +2003-05-23 Noah Levitt + + * glib/gutf8.c: Fix typo in UNICODE_VALID (related to #107427). + +2003-05-23 Noah Levitt + + * glib/guniprop.c: Remove stale comment. + +2003-05-22 Noah Levitt + + * glib/guniprop.c: Update g_unichar_iswide to Unicode 4.0 (#113404). + +2003-05-21 Noah Levitt + + * glib/guniprop.c: Fix obscure typo in case conversion routine + (#113469). + +Tue May 20 14:14:55 2003 Manish Singh + + * configure.in: wrap 64-bit MIN/MAX limit constants in + G_GINT64_CONSTANT. Fixes bug #108699. + +2003-05-19 Noah Levitt + + * glib/gunibreak.c: Fix cut-and-pasto: g_unichar_break_type should + return G_UNICODE_BREAK_UNKNOWN if the character is greater than + G_UNICODE_LAST_CHAR. + +2003-05-19 Noah Levitt + + * glib/glist.c: Remove unused function g_list_sort2 (bug #113203). + +2003-05-19 Noah Levitt + + * glib/gunidecomp.c: Fix off-by-one error in + g_unicode_canonical_ordering (bug #113260). + +2003-05-19 Arafat Medini + + * ar.po: Added ar to ALL_LINGUAS + +2003-05-17 Telsa Gwynne + + * configure.in: Added cy to ALL_LINGUAS + +2003-05-05 Matthias Clasen + + * glib/gstrfuncs.c (g_ascii_dtostr): + (g_ascii_formatd): + (g_ascii_strtod): Some doc fixes. (#111805) + +2003-05-05 Christian Rose + + * configure.in: Added sr and sr@Latn to ALL_LINGUAS. + +Thu Apr 24 19:12:05 2003 Owen Taylor + + * autogen.sh (have_libtool): Accept libtool-1.5. (#111483) + +2003-04-09 Matthias Clasen + + * INSTALL: + * INSTALL.in: Remove list of configuration flags, since these + are already documented in docs/reference/glib/building.sgml. + +2003-04-08 Matthias Clasen + + * INSTALL: Move Cross-compliation information to reference manual. + +Mon Apr 7 13:40:28 2003 Owen Taylor + + * glib/gmain.c (g_main_loop_run): When waiting for + the main loop to be freed up, wait on either + !loop->is_running or got_ownership, not both. + (Caused gtk_dialog_run() not to work in other + threads, reported by Jean-Yves Lefort) + +2003-04-07 Matthias Clasen + + * glib/gutf8.c (g_utf8_strlen): Warn if p == NULL && max != 0. + (#110087) + +2003-04-01 Tor Lillqvist + + * glib/glib.def: Add g_string_chunk_insert_len. + +2003-04-01 Matthias Clasen + + * glib/gstring.[hc] (g_string_chunk_insert_len): New function, to + insert possible non-nul-terminated byte sequences into a string + chunk. (#96279) + (g_string_chunk_insert): Implement in terms of + g_string_chunk_insert_len() now. + +2003-03-30 Matthias Clasen + + * glib/gstring.c (g_string_new): Optimize the common cases + (init == NULL or init == "") a bit. + * glib/gmarkup.c, glib/gmessages.c, glib/gscanner.c, + glib/gshell.c, glib/gspawn-win32-helper.c, glib/gspawn-win32.c, + glib/gspawn.c, gobject/gvaluetransform.c: replace uses of + g_string_new ("") by g_string_new (NULL). (#106973, Morten Welinder) + + * glib/gutf8.c (UNICODE_VALID): Update to Unicode 3.1 and optimize + a bit. (#107427, Noah Lewitt) + + * glib/libcharset/config.charset: Add cp1251 support for Solaris. + (#104738, Hidetoshi Tajima) + + * glib/gconvert.c (UnsafeCharacterSet): Get rid of + UNSAFE_DOS_PATH. + (acceptable): Align with RFC2396. (#59653) + + * tests/uri-test.c: Adjust to the changes above. + +2003-03-26 Christian Rose + + * configure.in: Added "yi" to ALL_LINGUAS. + +2003-03-19 Matthias Clasen + + * glib/giochannel.c (g_io_channel_read_to_end): Fix docs. + +2003-03-19 Anders Carlsson + + * configure.in: Bump version to 2.3.0 + +2003-03-14 Sebastian Wilhelmi + + * glib/gthread.c: Do not define function g_thread_init_glib, if + not G_THREADS_ENABLED. It's not called bu g_thread_init() then, + but calls other, in that case undefined functions. + +2003-03-06 Matthias Clasen + + * glib/gmain.c (g_main_context_find_source_by_id): + (g_main_context_find_source_by_funcs_user_data): Fix FALSE/NULL + confusion. (#107646, Morten Welinder) + +2003-03-01 James Henstridge + + * autogen.sh: require automake 1.7. Add calls to libtoolize and + gtkdocize. Clean up some of the error messages. + + * configure.in: move version declaration to the top of the file + (before AC_INIT), using M4 macros. + GLIB_AC_DIVERT_BEFORE_HELP() calls no longer necessary, due to use + of M4 macro expansion in help messages instead. + Convert AC_ARG_WITH/AC_ARG_ENABLE calls to use AC_HELP_STRING to + format help strings. Use quadrigraphs to get square brackets to + show correctly. + Replace gtk-doc checks with a call to GTK_DOC_CHECK() macro. + Use AC_CONFIG_COMMANDS([glibconfig.h], ...) to output + glibconfig.h, so that "./config.status glibconfig.h" works. + Add an extra AC_CONFIG_FILES call listing other files we want + generated by config.status protected by an "if false" block. This + way automake generates the rules needed to rebuild the files for + us. + Add quotes in various places. + + * docs/reference/*/Makefile.am: convert to use the common + gtk-doc.make file. This localises the complexity to a single + makefile fragment maintained with gtk-doc itself. + + * */Makefile.am: remove unneeded rules to build win32 files with + config.status. Automake now does this for us. + Replace instances of @FOO@ with $(FOO) where appropriate -- this + allows automake to do a better job checking the makefile. + Add some files to DISTCLEANFILES where appropriate + + * Makefile.am: use the DISTCHECK_CONFIGURE_FLAGS variable to + ensure that --enable-gtk-doc is passed to configure during a + distcheck. Remove the custom distcheck, since the standard one + will now do. + + * gobject/Makefile.am: switch to BUILT_SOURCES, since that now + works. + +2003-02-26 Matthias Clasen + + * glib/gstrfuncs.c (g_strdup_vprintf): Use g_strndup, not + g_strdup, since we know the length in advance. + + * glib/gunidecomp.c (g_unicode_canonical_decomposition): Use + g_malloc instead of directly using malloc. + +2003-02-25 Tor Lillqvist + + * glib/glib.def: Add a couple of missing entries, thanks to Cedric + Gustin. Thread initialization function changes according to + Sebastian Wilhelmi's changes below (2003-02-14). + +2003-02-24 Matthias Clasen + + * glib/gdir.c (g_dir_read_name): Clarify documentation. + +2003-02-18 Sebastian Wilhelmi + + * configure.in: Make glib_thread_test not unnecessarily convert + between int and void*. (#106278). Let main return int. + + * configure.in: Add an argument to specify the default thread + attribute to glib_thread_test. Disappeared somewhere between 2.0 + and 2.2. + +2003-02-14 Sebastian Wilhelmi + + Fixes for #101264 and #99372: + + * glib/gconvert.h, glib/gmain.c, glib/gmem.c, glib/gmessages.c, + glib/grand.c: Include gthreadinit.h and rename the thread + initialization functions a bit and let them start with _, so that + later we can stop exporting them. + + * glib/gmem.c, glib/gmessages.c: Move the g_private_new() calls to + new functions. They have to be called after setting + g_threads_got_initialized to TRUE (see #101264). + + * glib/gthread.c: Include gthreadinit.h. Renamed g_mutex_init() to + g_thread_init_glib(). Call the thread initialization functions + (which are not allowed to call g_private_new), then set + g_threads_got_initialized to TRUE, then call the other thread + initialization functions (which must not call anything but + g_private_new()). + + * glib/gthreadinit.h: New private header to cleanly declare all + thread initialization functions. + + * gthread/gthread-impl.c: Include gthreadinit.h. In + g_thread_init() just call g_thread_init_glib(), which in turn calls the + other functions (see #99372). + + * glib/Makefile.am: Added gthreadinit.h. + +2003-02-12 Sebastian Wilhelmi + + * configure.in: Make GLib recognize Tru64Unix thread system. (#103020) + +2003-02-11 Tor Lillqvist + + * Makefile.am (EXTRA_DIST): Include ChangeLog.pre-2-2. + + * glib-zip.in: Include also the gtk-doc/html documentation in the + developer package. + + * README.win32: Updates. + +2003-02-11 Sebastian Wilhelmi + + * AUTHORS: Changed my e-mail address. + * glib/grand.c: Removed my e-mail address. + +2003-02-10 Mohammad DAMT + + * po/id.po: Added Indonesian translation + * configure.in: Added "id" to ALL_LINGUAS + +2003-02-06 Matthias Clasen + + * glib/gmessages.h: + * glib/gmem.h: + * glib/ghash.h: + * glib/gasyncqueue.h: + * glib/garray.h: + * glib/ghook.h: + * glib/gtypes.h: Fix a bunch of typos in header comments. + (#102422, Morten Welinder) + +2003-02-04 Tor Lillqvist + + * glib/giowin32.c (g_io_channel_unix_new): Fix typo: Should be + SOCKET_ERROR, not SO_ERROR. Noticed by Daniel Kaufmann. + + Merge from stable branch: + + Fix for bug #104014, reported by Alex Shaduri: + + * glib/gspawn-win32.c (protect_argv): New function. Add + double-quotes around argv elements that need it, and escape + embedded double-quotes with backslash. + (do_spawn_with_pipes) Call protect_argv(). + + * glib/gspawn-win32-helper.c (WinMain): Call protect_argv(). + + * glib/gspawn.c (g_spawn_async_with_pipes): Document argument + vector vs. command line details on Win32. + (g_spawn_command_line_sync): Improve documentation about + backslashes in the command line on Windows. + +Thu Jan 30 16:45:13 2003 Owen Taylor + + * Makefile.am: Remove references to glib.spec. + (#102231) + + * configure.in: Don't generate glib.spec. + +Tue Jan 28 16:08:56 2003 Owen Taylor + + * m4macros/glib-gettext.m4: If msgfmt isn't found, + unset gt_cv_have_gettext. (#102552, Tim Mooney) + +Tue Jan 28 15:18:24 2003 Owen Taylor + + * autogen.sh (have_automake): Fix version in complaint + message about automake. (#104366, Rich Burridge) + +2003-01-22 Pablo Saratxaga + + * configure.in: Added Bengali (bn) to ALL_LINGUAS + +2003-01-21 Christian Rose + + * configure.in: Added "mn" to ALL_LINGUAS. + +2003-01-20 Pablo Saratxaga + + * configure.in: Added Farsi (fa), Italian (it), Latvian (lv), + Macedonian (mk) to ALL_LINGUAS + +2003-01-16 Daniel Yacob + + * configure.in: added am to ALL_LINGUAS + +2003-01-12 Tor Lillqvist + + * glib/glib.def: Add some missing entries. Thanks to Kenichi SUTO. + +2003-01-05 Tor Lillqvist + + * README.win32: Updates. + + * configure.in: Don't use -lm in TRIO_LIBS on Windows, with no + libm. (Mingw has a dummy libm.a, but the .pc file should be + useable by MSVC users, too.) + +2003-01-25 Ron Steinke + + (Ancient, binary compatible fixes found sitting in my tree) + + * Added early checks for count == 0 and buf == NULL in g_io_channel_read() + + * Better error message for EFAULT in g_io_channel_error_from_errno() + +2003-01-04 Tor Lillqvist + + * Makefile.am (BUILT_EXTRA_DIST): Don't distribute glib-zip. + + * {glib,gmodule,gobject,gthread}/Makefile.am: + [Win32] Install also the .def files, to help users generate + import libraries for other compilers. Uninstall, too. + + * glib-zip.in: Include .def files from above. + + * glib/giowin32.c (g_io_win32_fd_get_flags_internal): Don't claim + broken pipes are unreadable. (Well, they are, but read() handles + it, and treats it like EOF.) + +Thu Jan 2 16:19:15 2003 Manish Singh + + * configure.in: use AC_COMPILE_IFELSE instead of AC_TRY_COMPILE for + tests for inline keywords. Fixes #101976. + +2003-01-02 Tor Lillqvist + + * glib/gwin32.h: Correct the comment telling what headers have + the declarations of some POSIXish functions. + + * glib/giowin32.c (g_io_win32_fd_get_flags_internal): Fix braino: + The checks for readability/writeability were backwards. + +2003-01-01 Tor Lillqvist + + * glib/gmessages.c (ensure_stderr_valid): New function, parallel + to ensure_stdout_valid(). #defined as empty on Unix. Move the + alloc_console_called static flag inside these two functions. + (ensure_stdout_valid, ensure_stderr_valid): Check the C stdout and + stderr streams for validity, instead of what GetStdHandle() returns. + (mklevel_prefix): Do use either stderr or stdout on Windows, + too. Otherwise g_warning() messages (that are just warnings, by + definition) will get mixed with proper stdout output. Noticed in + GIMP's gimpconfig-dump. + (strdup_convert, mklevel_prefix, g_printerr): Call + ensure_stderr_valid() before trying to use stderr. + (g_logv): [Win32] Convert message to current codepage before + display with MessageBox(). + +2002-12-28 Tõivo Leedjärv + + * configure.in: Added et to ALL_LINGUAS. + diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 new file mode 100644 index 0000000..41a9f78 --- /dev/null +++ b/ChangeLog.pre-2-6 @@ -0,0 +1,1683 @@ +2004-12-16 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.6.0 === + +2004-12-15 Alexander Larsson + + * glib/gconvert.c: (g_filename_display_basename): + Fix spelling + Add g_return_val_if_fail. + + * glib/glib.symbols: + Add g_filename_display_basename + +2004-12-15 Alexander Larsson + + * glib/gconvert.[ch]: + Add g_filename_display_basename. + +2004-12-14 Matthias Clasen + + * README.in: Updates + + * NEWS: Updates. + + * configure.in: Set version to 2.6.0 + +2004-12-13 Tor Lillqvist + + * NEWS: Update. + + * glib/glib.symbols + * glib/gstdio.[ch]: Add g_rmdir(). + +2004-12-13 Matthias Clasen + + * NEWS: Updates + +2004-12-12 Tor Lillqvist + + * glib/glib.symbols + * glib/gconvert.[ch]: Implement Windows DLL ABI stability also for + g_filename_{to,from}_uri(). + +2004-12-11 Tor Lillqvist + + * glib/gstdio.c (g_rename, g_unlink, g_remove): Add doc comments + about Windows restrictions on renaming and removing. + + (g_remove): Mimic POSIX remove() on Windows: Try also to rmdir if + removal as a file fails. Document this. + + * glib/gstdio.h: Clarify comment about file name encoding on + Windows. + + * glib/gspawn-win32.c: Fix #157255. Also some refactoring of this + still very ugly source file. + +2004-12-09 Matthias Clasen + + * glib/goption.c (print_help): Don't print help options + if the options of a specific group have been + requested. (#160645, Glynn Foster) + +2004-12-07 Matthias Clasen + + * glib/gutils.c (g_get_language_names): Update the returned + value after locale changes. (#160271, Christian Persch) + (_g_utils_thread_init): Initialize the language name cache + before going threaded. + + * glib/gthread.c (g_thread_init_glib): Call _g_utils_thread_init(). + + * glib/gthreadinit.h: Add _g_utils_thread_init(). + +2004-12-06 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_finalize): Fix a write to freed + memory: Unlock the channel's mutex before unrefing the channel. + +2004-12-06 Matthias Clasen + + * configure.in: Remove a no longer needed hack for + libtool < 1.5.2. (#100697, Owen Taylor, Sebastian Wilhelmi) + +2004-12-05 Tor Lillqvist + + * glib/glib.symbols + * glib/gwin32.[hc]: Implement DLL ABI stability also for + g_win32_get_package_installation_directory()) and + g_win32_get_package_installation_subdirectory(). + + * glib/Makefile.am (install-libtool-import-lib): Remove the DLL + binary compatibilty entries from the import library. They aren't + used by newly compiled code, so no need to have them in the import + library. (The "PRIVATE" keyword in the .def file is supposed to do + this, but not implemented in the GNU linker yet.) + +2004-12-04 Matthias Clasen + + * glib/gqueue.c (g_queue_link_index): Return -1 if queue is + NULL. (#159530, Philippe Blain) + +2004-12-02 Matthias Clasen + + * configure.in: Bump version. + + * === Released 2.5.7 === + +2004-12-02 Matthias Clasen + + * glib/glib.symbols: Protect the the various push/pop allocator + functions by #ifndef DISABLE_MEM_POOLS. (#160215, Frederic Crozat) + + * glib/makegalias.pl: Support #ifndef'ed sections. + + * glib/gutils.c (g_get_system_config_dirs): Don't forget to + initialize g_system_config_dirs. (#160213, Frederic Crozat) + +Wed Dec 1 17:04:37 2004 Manish Singh + + * glib/gstring.h (g_string_append_c_inline): actually enable (and + fix up the length test). + +2004-11-30 Tor Lillqvist + + * glib/Makefile.am (glib.def): gcc -E complains "linker input file + unused because linking not done" if told to preprocess the + glib.symbols file. Use '-' and redirection to pass it as standard + input instead. + +2004-11-30 Matthias Clasen + + * NEWS: Updates + +2004-11-30 Tor Lillqvist + + * glib/gspawn-win32-helper.c (WinMain): Also check errno to detect + true errors from spawn*(). (#157258, reported by Bruce Hochstetler) + +2004-11-29 Matthias Clasen + + * glib/gmacros.h (G_GNUC_MALLOC): Define empty for gcc 2.95. + + * glib/gmarkup.c (unescape_text_state_after_charref_hash): + Avoid a strndup() here, noticed by Morten Welinder. + +2004-11-29 Matthias Clasen + + * glib/gmarkup.c: Remove leftover noinline attributes. + (is_name_start_char, is_name_char): Avoid possible reads + beyond the end of g_ascii_table. + + * glib/Makefile.am: Use the perl found by configure. (#149826, + Morten Welinder) + +Sun Nov 28 13:13:56 2004 Manish Singh + + * glib/abicheck.sh: filter G_GNUC before PRIVATE so $ is still true. + + * tests/utf8-validate.c: cast pointer math to gint for error print + message. + +Sun Nov 28 12:07:29 2004 Manish Singh + + * tests/utf8-validate.c: minor comment fix. + +2004-11-28 Matthias Clasen + + * glib/gconvert.h: + * glib/gkeyfile.h: + * glib/gmem.h: + * glib/gstrfuncs.h: + * glib/gunicode.h: + * glib/gutils.h: Mark functions with G_GNUC_MALLOC when appropriate. + + * glib/glib.symbols: Add G_GNUC_MALLOC annotations. + + * glib/gmacros.h (G_GNUC_MALLOC): Add a macro for + __attribute__((__malloc__)). (#61780) + +2004-11-28 Tor Lillqvist + + * glib/gutils.[hc] + * glib/glib.symbols: [Win32] Make also g_get_user_name() and + g_get_real() name return UTF-8. As for the similar changes to fix + #101792, for DLL ABI stability we use preprocessor defines to get + the new UTF-8 versions, and keep the old names for versions + returning strings in the system codepage. + + Fix g_get_tmp_dir() and g_get_home_dir() to actually return UTF-8 + as was intended in the fix for bug #101792. (#159664, noticed by + Robert Ögren) + +2004-11-28 Matthias Clasen + + * glib/gmarkup.c: Optimizations; don't scan the entire text + in find_current_text_end(), split unescape_text() into multiple + functions. (#159001, Havoc Pennington) + +2004-11-27 Matthias Clasen + + * glib/gspawn.c (g_spawn_async_with_pipes): Update the @flags + documentation with references to GChildWatch and + g_spawn_close_pid(). (#136255, noted by Owen Taylor) + +2004-11-26 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_parse_value_as_string): + Don't access invalid memory address if p wasn't + increased. (#159557, Frederic Crozat) + +2004-11-25 Matthias Clasen + + * tests/strtod-test.c (main): Add a testcase for the previous fix. + + * glib/gstrfuncs.c (g_ascii_strtod): Make it work again for floats + starting with a decimal point, like .75 (#156421, Hans Breuer) + +Thu Nov 25 14:02:43 2004 Manish Singh + + * glib/abicheck.sh: filter out G_GNUC stuff when doing the compare. + + * glib/gmessages.c (g_assert_warning): call abort() at the end, so + gcc doesn't warn. + +2004-11-25 Kjartan Maraas + + * configure.in: Add «nb» to ALL_LINGUAS. + +2004-11-24 Tor Lillqvist + + * glib/gwin32.c (g_win32_error_message, + get_package_directory_from_module, + g_win32_get_package_installation_directory, + g_win32_get_package_installation_subdirectory): Use wide character + API when available. Document that string parameters and return + values are in UTF-8. + +2004-11-24 Matthias Clasen + + * glib/gutf8.c: Replace g_utf8_validate() with an + optimized version, and clarify the docs a bit. (#159131, + Owen Taylor) + + * tests/Makefile.am (test_programs): Add utf8-validate. + + * tests/utf8-validate.c: Unit tests for g_utf8_validate(). + +2004-11-23 Matthias Clasen + + * glib/goption.h: Don't mark g_option_error_quark() as const, + to be consistent with all the other error_quark functions. + (technically they are const, but since these are called only + in error paths, giving the compiler better optimization + opportunities doesn't matter much) + +2004-11-23 Matthias Clasen + + Fix a problem with the PLT reduction changes which caused the + internal aliases to lose all attributes. + + * glib/glib.symbols: Add attribute annotations. + * glib/makegalias.pl: Keep attribute annotations, but strip PRIVATE. + * glib/Makefile.am (glib.def): Strip attribute annotations, but keep + PRIVATE. + +2004-11-21 Hans Breuer + + * **/makefile.msc : updated + +2004-11-16 Matthias Clasen + + * m4macros/glib-2.0.m4 (AM_PATH_GLIB_2_0): Support gmodule-no-export. + + * Makefile.am (EXTRA_DIST): + * configure.in (AC_CONFIG_FILES): Add gmodule-no-export-2.0.pc.in + + * gmodule-no-export-2.0.pc.in: Add a variants of gmodule-2.0.pc.in + which doesn't add -Wl,--export-dynamic, since Pango or GTK+ don't + need it. (#125627, Owen Taylor) + +2004-11-17 Matthias Clasen + + * glib/gkeyfile.c: Define S_ISREG() on windows, since it + is not present there. (#158469, Kazuki IWAMOTO) + +2004-11-15 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_load_from_fd): Use S_ISREG(), since + S_IFMT and S_IFREG are apprarently missing on some systems (they + are SUS, but not Posix). (#158263) + +2004-11-12 Matthias Clasen + + * configure.in: Bump version. + + * === Released 2.5.6 === + +2004-11-11 J. Ali Harlow + + * gobject/Makefile.am: + * glib/Makefile.am (gtk.def): Use embedded tab rather than '\t' + escape sequence. (#157951) + +2004-11-10 Tor Lillqvist + + * glib/gconvert.c (g_get_filename_charsets): Fix typo in doc + comment. + +2004-11-10 Matthias Clasen + + * NEWS: Updates + +Mon Nov 8 10:45:50 2004 Manish Singh + + * glib/gasyncqueue.c + * glib/ghook.c + * glib/giochannel.c: g_return_if_fail -> g_return_val_if_fail + + * glib/gmain.c: Ditto, plus also make g_main_context_ref() actually + return the passed in pointer. + +2004-11-08 Matthias Clasen + + * glib/gnode.h (enum GTraverseFlags): Add G_TRAVERSE_LEAVES + and G_TRAVERSE_NON_LEAVES as alternative names for + G_TRAVERSE_LEAFS and G_TRAVERSE_NON_LEAFS, which are + grammatically brutal. (#138853, Morten Welinder) + + * glib/gasyncqueue.[hc]: + * glib/ghook.[hc]: + * glib/gmain.[hc]: + * glib/giochannel.[hc]: Make g_io_channel_ref(), + g_main_context_ref(), g_hook_ref(), g_async_queue_ref() + return the passed in pointer. (#151663, Manish Singh) + + * glib/gmain.c: Initialize child_watch_count to 1, so + that we don't miss the very first child if it exits + before we set up the child watch. In that case we had + previously source->count == child_watch_count == 0, + causing g_child_watch_check() to skip the waitpid() + call. (#154827, Gustavo Carneiro) + + * glib/gmain.c (g_child_watch_source_init_single) + (g_child_watch_source_init_multi_threaded): Use sigaction() + instead of signal(). (#136867, Jonas Jonsson, patch by + Archana Shah) + +2004-11-07 Matthias Clasen + + * glib/gutils.c (g_get_any_init): Work around an bug + in Mac OS < 10.3. (#156446, Dave MacLachlan) + +2004-11-06 Tor Lillqvist + + * glibconfig.h.win32.in: Cosmetics: move the G_GNUC_INTERNAL + define to the same place where it is in a configure-generated + glibconfig.h + +2004-11-05 Matthias Clasen + + * tests/strtod-test.c: Portability fixes and extra sanity + checks. (#157453, Morten Welinder) + +2004-11-04 Matthias Clasen + + * glib/gstrfuncs.c (g_ascii_strtod): Handle numbers like + 1e1, nan, -infinity. Also try harder to preserve errno. + (#156421, Morten Welinder) + + * tests/strtod-test.c: Add testcases. + +2004-11-04 Tor Lillqvist + + * glib/goption.h (enum GOptionFlags): Add G_OPTION_FLAG_REVERSE, + to reverse the sense of a G_OPTION_ARG_NONE (boolean) option. + + * glib/goption.c (parse_arg): Obey the above flag. + + * glib/gconvert.c (g_filename_display_name): Document that the + result is guaranteed to be non-NULL. + + * glib/gfileutils.c (get_contents_stdio, get_contents_regfile, + get_contents_posix, get_contents_win32, g_file_open_tmp, + g_file_read_link): Use g_filename_display_name() for error + messages. + (g_mkstemp): Document that the template should be in the GLib file + name encoding. + (g_file_open_tmp): Ditto. Also document that the actual name + returned is also in the GLib file name encoding. + +2004-11-02 Matthias Clasen + + * glib/gconvert.c (g_filename_display_name): New function + to convert a filename to a UTF-8 string for display + purposes. (requested by Alex Larsson) + + * glib/gconvert.c (g_get_filename_charsets): New function + to return the encodings which are tried when converting a + filename to UTF-8. (#151465, François Gagné) + +2004-11-02 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.5.5 === + + * NEWS: Updates + +2004-11-02 Matthias Clasen + + * glib/glib.symbols: Add new functions. + + * glib/gconvert.c: Fix doc comment for + g_get_filename_charsets(). + + * glib/gconvert.c (g_filename_display_name): New function to + convert a filename to a UTF-8 string for display purposes. + (g_get_filename_charsets): New function to return the + encodings which are tried when converting a filename to + UTF-8. + + * glib/goption.c (g_option_context_parse): Document that + this function may not return. + +2004-11-01 Matthias Clasen + + * glib/gutils.h: Make gtkdoc-scan happy by removing spaces + between gchar and *. + +2004-11-01 Tor Lillqvist + + * glib/gstdio.c (g_lstat): Implement correctly also on Unix + systems without lstat(). (#157038, Morten Welinder) + +2004-11-01 Ray Strode + + * glib/gkeyfile.c: + (g_key_file_get_locale_string): don't return an + error if we come across a value with invalid utf8 or + if we don't find a translated string. Just fallback + to the untranslated string (Mark McLoughlin, bug + #156790). + + * glib/gkeyfile.c: + (g_key_file_init), (g_key_file_clear): track the + actual start GKeyFileGroup rather than just its name + (g_key_file_parse_group): allow add_group() to + update the start group. + (g_key_file_remove_group_node): update the start + group if it gets removed (Mark McLoughlin, bug + #156790). + + * glib/gkeyfile.c: + (g_key_file_parse_string_as_value): Don't escape + tabs and spaces in the middle of key values. + +2004-11-01 Matthias Clasen + + * glib/gconvert.c: + * glib/gdebug.h + * glib/gutils.c + * gobject/gtype.c + * gthread/gthread-posix.c + * tests/timeloop-closure.c + * tests/timeloop.c: Fix sparse warnings. (#157014, Kjartan Maraas) + +2004-11-01 Matthias Clasen + + * glib/goption.c: Documentation updates. + + Handle conflicts between options in different groups. (#156808) + + * glib/goption.c (g_option_context_parse): When a long option does not + match exactly, try to parse it as --group-option. + (g_option_context_add_group): Warn if a group name conflict occurs. + + * glib/goption.c (print_help): Print out the effective options, ie + don't print shadowed short options, and for long options print + --group-option instead of --option if appropriate. + +2004-10-31 Matthias Clasen + + * glib/gwin32.c: Add bits of markup to g_win32_get_windows_version() + docs. + +2004-10-31 Tor Lillqvist + + * glib/gwin32.c: Document g_win32_get_windows_version(). + + * glib/gstdio.[ch]: Add g_lstat(). + +2004-10-29 Matthias Clasen + + * glib/goption.c: Doc additions. + + * glib/goption.c (parse_arg): Convert filenames to UTF-8 on + Windows. + +2004-10-29 Hans Breuer + + * glibconfig.h */makefile.msc.in : updated [and finally fixed my + script to produce ready to go de-in(ed) files, w/o autotools] + + * */*.rc.in : updated copyrights to 2004 + + * glib/gutils.c : some CSIDL_* defines lacking from older SDK; + use the same fallback mecahnism as on *NIX where ever applicable + +2004-10-29 Matthias Clasen + + * tests/option-test.c: Add tests for the handling of + non-option arguments, "--" and G_OPTION_REMAINING. + + * glib/goption.[hc]: #define G_OPTION_REMAINING, which is + a special long option name, which can be used for an option + in the main group which collects the non-option arguments. + It must be of type G_OPTION_ARG_STRING_ARRAY or + G_OPTION_ARG_FILENAME_ARRAY. If the main group doesn't contain + an option whose name is G_OPTION_REMAINING, the non-option + arguments are left behind in argv as before. + + * glib/goption.c: Add documentation. + +2004-10-28 Matthias Clasen + + * glib/gmessages.h: Mark g_assert_warning as G_GNUC_NORETURN, + to avoid compiler warnings. (#156767, Owen Taylor) + +2004-10-29 Tor Lillqvist + + * glib/gstdio.c: Include also for mkdir() prototype + with MSVC. [156727, Kazuki IWAMOTO] + + * glib/giochannel.h (g_io_channel_new_file): Redefine also + g_io_channel_new_file to the UTF-8 version on Win32. [156725, + Kazuki IWAMOTO) + +2004-10-28 Ray Strode + + * glib/gkeyfile.c + (find_file_in_data_dirs): clean up a leak (#156652, + Morten Welinder) + (g_key_file_load_from_fd): propagate fstat() error + conditions and retry read on EAGAIN (#156647, Morten + Welinder). Return error if file is NOT regular, not if + it is regular (bug introduced from last commited bug + fix). + (g_key_file_load_from_data_dirs): allocate enough space + for the terminating NULL. + +2004-10-28 Ray Strode + + * glib/gkeyfile.c: Don't use S_ISREG macro (#156728, + Kazuki IWAMOTO) + +2004-10-28 Matthias Clasen + + * glib/gstdio.c: Include galias.h before glib.h (#156697, + Christophe Fergeau) + + * glib/gkeyfile.c: Add a missing "Since: 2.6" comment. + +2004-10-28 Tor Lillqvist + + * glib/gstdio.c: Include glib.h early to get G_OS_WIN32. Include + errno.h for errno. + + * glib/gkeyfile.c: Include gstdio.h and use g_open(). + +2004-10-27 Ray Strode + + * glib/gkeyfile.c: + (g_key_file_load_from_fd), + (g_key_file_load_from_file): + Move file is regular check to load_from_file to use + fstat() instead of race prone g_file_test(). Don't + clear/init until needed. Change error messages to be + more consistent. + (g_key_file_load_from_data), + (g_key_file_load_from_data_dirs), + (g_key_file_parse_data), + (g_key_file_get_value), + (g_key_file_get_string), + (g_key_file_set_string), + (g_key_file_get_string_list), + (g_key_file_set_string_list), + (g_key_file_set_locale_string), + (g_key_file_get_locale_string), + (g_key_file_set_locale_string_list), + (g_key_file_get_boolean), + (g_key_file_set_boolean), + (g_key_file_get_boolean_list), + (g_key_file_set_boolean_list), + (g_key_file_get_integer), + (g_key_file_get_integer_list), + (g_key_file_set_integer_list), + (g_key_file_remove_key): + Add more g_return_*if_fail checks for public functions. + +2004-10-27 Matthias Clasen + + * configure.in: Bump version. + + * === Released 2.5.4 === + +2004-10-27 Matthias Clasen + + * glib/abicheck.sh: Strip Win32 specific defs file syntax. + + * NEWS: Updates. + +2004-10-27 Matthias Clasen + + Introduce the idea of a filename encoding, which is + *literally* the filename encoding on Unix. On Windows, + use the Unicode name converted to UTF-8. (#101792, + Tor Lillqvist, Owen Taylor) + + * glib/gdir.[hc]: + * glib/gconvert.[hc]: + * glib/gfileutils.[hc]: + * glib/gutils.[hc]: + * glib/giowin32.c: On Windows, keep old ABI versions + of GLib pathname api for DLL ABI stability. Use different + names for the new-style UTF-8 versions. Hide this through + a #define. + + * glib/gstdio.[hc]: New files containing wrappers for + POSIX pathname api. + + * glib/glib.symbols: Add new symbols. + + * glib/makegalias.pl: Drop Win32 specific .def syntax, + include gstdio.h + +2004-10-27 Matthias Clasen + + * glib/gkeyfile.c: Fix includes. (#156500, #156499, + Kazuki IWAMOTO) + + * glib/Makefile.am (galias.h): Fix srcdir != builddir + builds. (#156447, Thomas Fitzsimmons) + +2004-10-26 Gora Mohanty + + * configure.in: Added 'or' to ALL_LINGUAS. + +2004-10-26 Matthias Clasen + + * glib/gkeyfile.c: Include galias.h. + + * glib/gkeyfile.c (g_key_file_parse_value_as_comment): + Don't compare strings and chars. + + * glib/glib.symbols: Add new symbols. + + * glib/gkeyfile.c (g_key_file_new): Fix docs. + + * glib/gkeyfile.h: Use the same parameter names as in + the implementation and the docs. + + * glib/gwin32.c (g_win32_get_windows_version): Make this + function thread-safe in the GLib style. + * glib/gthreadinit.h: + * glib/gwin32.c (_g_win32_thread_init): New function to + initialize the version. + * glib/gthread.c (g_thread_init_glib): Call + _g_win32_thread_init() from here. + +2004-10-26 Ray Strode + + * glib/gkeyfile.c: Add Matthias to "Written by" lines + (GKeyFileGroup): add field to hold comments about groups + (g_key_file_load_from_fd): return TRUE on success and + FALSE on failure. Don't close fd's opened by other + parent function. + (g_key_file_load_from_file): run FILE_IS_REGULAR test + before trying to open file, to save an fd from being + leaked (would probably be better to use fstat()). Close + fd when done with it. Return TRUE on success and FALSE + on failure. + (g_key_file_load_from_data): Return TRUE on success and + FALSE on failure. + (g_key_file_load_from_data_dirs): remove superfluous + const modifier. Return TRUE on success and FALSE on + failure. Stop trying to load files when one succeeds. + (g_key_file_parse_key_value_pair): don't validate input + for UTF-8 until users uses a getter that does + validation. Don't leak copy of start_group_name. + (g_key_file_to_data): serialize new comment field for + groups. + (g_key_file_get_keys): Remove convenience code to let + NULL group mean start group. Get rid of unneeded NULL + check before g_strdup. + (g_key_file_get_groups): Reverse groups list before + sending to user because it is maintained in backward + order internally. + (g_key_file_get_value), + (g_key_file_set_value): add g_return checks at top of + public functions. + (g_key_file_get_string), + (g_key_file_get_string_list): validate key value is UTF-8. + (g_key_file_[sg]et_*comment): new functions for + setting/getting comments + (g_key_file_remove_comment): new function to remove + comment block + (g_key_file_remove_key_value_pair_node): new function to + pull a key-value pair out of the list and free it. + (g_key_file_remove_group_node): call + g_key_file_remove_key_value_pair_node instead of + freeing the list immediately to get better statistics + for approximate_size. + (g_key_file_remove_group): use lookup_group_node instead + of lookup_group to prevent a g_list_find call. + (g_key_file_add_key): report group also when unable to + find key. + (g_key_file_lookup_group_node): new function to make + getting the group node from a group name easier. + (g_key_file_lookup_group): use lookup_group_node under + the hood. + (g_key_file_lookup_key_value_pair_node): new function to + make getting the key-value pair from a group and key + name eaiser. + (g_key_file_parse_comment_as_value): new function to add '#' to the + beginning of every line. + (g_key_file_parse_value_as_comment): new function that + attempts to be the inverse of comment as value. + +2004-10-26 Matthias Clasen + + * glib/gutils.c: + * glib/gkeyfile.c: Don't include ctype.h needlessly. (#156424, + Morten Welinder) + + * tests/strtod-test.c (test_string): Improve error reporting. + +Mon Oct 25 15:05:18 2004 Manish Singh + + * autogen.sh: rm autom4te.cache, since it might interfere with + differing autoconf versions. + + * tests/child-test.c: use GINT_TO_POINTER for g_child_watch_add + user data. + + * glib/gfileutils.c: G_IS_DIR_SEPARATOR is defined in gutils.h now, + don't redefine it here. + +2004-10-24 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_remove_group_node): Don't + destroy the lookup map if it is NULL. + +2004-10-23 Matthias Clasen + + * glib/gasyncqueue.c, glib/gatomic.c, glib/gdate.c, + glib/giochannel.c, glib/gmain.c, glib/gspawn.c, + glib/libcharset/localcharset.c: Apply a patch to fix + sparse warnings. (#154696, Kjartan Maraas) + + * glib/gnulib/g-gnulib.h: Undef libc functions before defining + them, since they may also be macros. (#155177, Andrea Campi) + + * glib/gkeyfile.h: + * glib/gkeyfile.c: Add a parser for desktop entries and + similar files with a .ini-like syntax. (#139974, Ray Strode) + + * glib/glib.h: Include gkeyfile.h + + * glib/Makefile.am (libglib_2_0_la_SOURCES): Add gkeyfile.c + (glibsubinclude_HEADERS): Add gkeyfile.h + + * glib/gutils.c (_g_compute_locale_variants): Make this + non-static and use it in gkeyfile.c + +2004-10-22 Matthias Clasen + + * tests/uri-test.c (run_uri_list_tests): Add some + uri list tests.c. + + * glib/gconvert.h: + * glib/gconvert.c (g_uri_list_extract_uris): New function to + split a text/uri-list data into individual uris and strip comments. + +2004-10-20 Matthias Clasen + + * glib/goption.c (get_change): Don't return the wrong + change. (#155856, Lucas Rocha) + +2004-10-17 Matthias Clasen + + * glib/gutils.h (G_IS_DIR_SEPARATOR): + * glib/gutils.c: Make public. (#155589, Tim-Philipp Müller) + +2004-10-08 Matthias Clasen + + * glib/gmain.c (g_child_watch_add_full): + * glib/gmain.c (g_child_watch_add): Document that GLib supports only + a single callback per pid. (#154828, Gustavo Carneiro) + +2004-10-06 Matthias Clasen + + * glib/gfileutils.c: Fix some C99isms. (#154676, Kjartan Maraas) + +2004-10-05 Anders Carlsson + + * glib/goption.c: (g_option_context_parse): + Add check for if argc is 0. + + * tests/option-test.c: (empty_test3), (main): + Add test case. + +2004-10-05 Matthias Clasen + + * NEWS: Update + +2004-10-04 Matthias Clasen + + * glib/gmem.c (g_mem_set_vtable): Only set vtable_set if the + vtable is set. (#154352, Philippe Blain) + +2004-10-03 Anders Carlsson + + * glib/goption.c: (parse_arg): + Set arg_data on filenames. (Discovered by Mats-Ola Persson). + + * tests/option-test.c: (arg_test3), (ignore_test3), (main): + Add test for filename args. + +2004-10-01 Tor Lillqvist + + * glib/goption.c (g_option_context_parse): Use + g_path_get_basename() instead of strrchr(), so that either slash + is accepted on Windows. + +2004-09-30 Matthias Clasen + + * glib/gfileutils.c: Convert filenames to UTF-8 before + putting them in GErrors. (#154078, Morten Welinder) + +2004-09-29 Matthias Clasen + + * glib/glib.symbols: Add g_assert_warning. + + * glib/gmessages.h: + * glib/gmessages.c (g_assert_warning): Treat g_assert + in the same way as g_return_if_fail and move the string + constants into a helper function, which also takes + care of removing the "IA__" prefix from internal aliases. + + * glib/gmessages.h: Move the declaration of + g_return_if_fail_warning() out of the ifdefs, so that + building with G_DISABLE_ASSERT works. + +2004-09-27 Murray Cumming + + * glib/goptions.[h|c], glib/glib.symbols: Rename + g_context_option_error_quark() to g_option_error_quark(), because that + is consistent with normal naming conventions, and what bindings expect. + +.2004-09-26 Matthias Clasen + + Fix #153649, Hidetaka Iwai: + + * glib/goption.c (parse_long_option): Don't forget to set parsed + to TRUE when parsing a long ARG_NONE option. + (free_changes_list): Fix the memory management for string + and filename arrays. + +2004-09-22 Tor Lillqvist + + * glib/gmessages.c: [Win32] Don't ever open a console + window. (Which we used to do if standard output or standard error + are invalid, as they are for GUI applications.) These console + windows that open up unexpectedly have caused endless amounts of + confusion among end-users. (#141102, #151175) + + Don't output the process id on Windows. Only output the program + name. If not set with g_set_prgname(), fetch the application + executable's name and use that. + +Mon Sep 20 00:35:14 2004 Matthias Clasen + + * glib/gutf8.c (g_utf16_to_utf8): Add a note explaining how to + convert UTF-16 byte stream of ambiguous endianness. (#152954, + Linus Walleij) + +Mon Sep 20 00:17:37 2004 Matthias Clasen + + * tests/option-test.c (error_test3_post_parse): + * tests/option-test.c (error_test2_post_parse): + * tests/option-test.c (error_test1_post_parse): Don't call + g_set_error () with a NULL format. (#153103, Robert Ögren) + +Mon Sep 20 00:13:48 2004 Matthias Clasen + + Make GOption remove long options completely. (#153113, Robert Ögren) + + * glib/goption.c (parse_long_option): Fix a wrong index. + + * tests/option-test.c (ignore_test3): Test handling of unknown + options some more. + +Sun Sep 19 23:56:15 2004 Matthias Clasen + + * glib/goption.c (g_option_context_parse): Call error_func + on error, not post_parse_func again. (#153107, Robert Ögren) + +Sun Sep 19 23:52:35 2004 Matthias Clasen + + * glib/gmessages.c (mklevel_prefix): + * glib/gmessages.c (g_logv): Fix the types of some variables + to be GLogLevelFlags instead of guint. (#153042, Philippe Blain) + +2004-09-18 Matthias Clasen + + * Version bump + + * === Released 2.5.3 === + +2004-09-17 Matthias Clasen + + * NEWS: More updates. + +Thu Sep 16 18:42:46 2004 Manish Singh + + * glib/abicheck.sh: don't hardcode lengths for cut, instead split on + the third field. + +Thu Sep 16 18:15:32 2004 Manish Singh + + * glib/gstrfuncs.c (g_strncasecmp): Make it take a guint for number + of characters, instead of a gsize. Technically this is incorrect, + but this makes it match the prototype, and this is a deprecated + function anyway. + +2004-09-16 Matthias Clasen + + * glib/Makefile.am (EXTRA_DIST): Add abicheck.sh + +Thu Sep 16 02:03:15 2004 Matthias Clasen + + Implement the same PLT reduction technique used in GTK+: + + * glib/glib.symbols: Master list of symbols + + * glib/makegalias.pl: Perl script which creates galias.h + + * glib/abicheck.sh: Compares actual exports against glib.symbols + + * glib/glib.def: Removed. This file is now generated from + glib.symbols + + * glib/Makefile.am: Add rules to generate galias.h and glib.def, + and add abicheck.sh to TESTS. Don't export _-prefixed symbols. + + * configure.in: Add --disable-visibility to suppress the + use of ELF visibility attributes. + + * glib/*.c: Include galias.h + +2004-09-15 Tor Lillqvist + + * glib/gwin32.c (g_win32_error_message): Convert message to + UTF-8. Technically this breaks API, but the actual use cases in + gdk/win32 have assumed it is UTF-8 anyway. Fix + documentation. (#152618, Kazuki Iwamoto) + + * glib/gwin32.h: Don't define ftruncate as a macro. Was never a + good idea, and it clashes with newest mingw headers, which have a + ftruncate implementation as an inline function. Thanks to Dominik R. + + * glib/gwin32.c (g_win32_ftruncate): Simplify implementation, just + call _chsize() in the C library. + +2004-09-15 Matthias Clasen + + * NEWS: Update. + +2004-09-09 Matthias Clasen + + * glib/gmessages.c (g_return_if_fail_warning): Strip the + prefix "IA__" from function names, since that is what + GTK+ uses for the PLT-reduction aliases. + +Thu Sep 9 13:52:26 2004 Owen Taylor + + * glib/gmessages.c (g_return_if_fail_warning): + Include implementation of g_return_if_fail_internal(). + +Thu Sep 9 10:37:41 2004 Owen Taylor + + * glib/gmessages.h (g_return_[val_]if_fail): Use + a helper function to reduce code size; omit FILE/LINE + when we have __PRETTY_FUNCTION__. + +2004-09-09 Matthias Clasen + + * glib/gutils.c (g_get_home_dir): Remove a misleading comment. + +Thu Sep 9 00:10:40 2004 Matthias Clasen + + * glib/gstrfuncs.h: + * glib/gstrfuncs.c (g_strv_length): Add a function to + calculate the length of a NULL-terminated string + array. (#150455, Tim-Philipp Müller) + + * tests/strfunc-test.c (main): Add a test for g_strv_length(). + +2004-09-08 Tor Lillqvist + + * glib/gutils.c (guess_category_value): On Win32, as last resort + call g_win32_getlocale() to get the current thread locale. There + usually aren't any POSIXish LANG or LC_* environment variables + present on Windows machines. + + * glib/glib.def: Add g_get_language_names. + +2004-09-07 Matthias Clasen + + * glib/gutils.h: + * glib/gutils.c (g_get_language_names): Add a function to + return a list of applicable locale names. (#95587, + Hidetoshi Tajima) + (guess_category_value, compute_locale_variants): + (explode_locale, unalias_lang, read_aliases): Helper + functions for g_get_language_names() + + * tests/testglib.c (main): Show the results of + g_get_language_names() + +Sun Sep 5 01:46:11 2004 Matthias Clasen + + * glib/glib.def: + * glib/gmessages.h: + * glib/gmessages.c (g_log_set_default_handler): New + function to install an alternate default log + handler. (#66387, Darin Adler) + +2004-09-03 Tor Lillqvist + + * glib/glib.def: Update. + +Wed Sep 1 20:22:39 2004 Matthias Clasen + + * glib/gdate.h: + * glib/gdate.c (g_date_get_iso8601_week_of_year): Add + a function to calculate the ISO 8601 week number of + a date. (#92579, Niklas Lundell) + +2004-09-01 Anders Carlsson + + * glib/goption.c: (g_option_context_parse): + Set program name before calling the pre-parse hooks. + +2004-09-01 Anders Carlsson + + * glib/goption.c: (g_option_context_free), (print_help), + (g_option_context_parse): + Handle option contexts without a main group. + + * tests/option-test.c: (empty_test2), (main): + Add test case for that. + +2004-08-30 Anders Carlsson + + * glib/goption.c: (g_option_context_parse): + Set prgname to if argc and argv are NULL. + + * tests/option-test.c: (empty_test1), (main): + Add test case for that. + +Sun Aug 29 23:58:38 2004 Matthias Clasen + + * glib/ghash.c (g_hash_table_lookup): Point to + g_hash_table_lookup_extended() for differentiation between + not-found and value-is-NULL. (#150960, Morten Welinder) + +2004-08-27 Matthias Clasen + + Fix #151193, Stepan Kasal: + + * glib/gfileutils.c (g_file_error_from_errno): + * glib/gfileutils.h (enum GFileError): Add G_FILE_ERROR_NOSYS. + +Fri Aug 27 00:45:41 2004 Matthias Clasen + + * glib/goption.c (g_option_context_parse): Set the program name + from argv[0], noticed by Masatake YAMATO. + +2004-08-26 Tor Lillqvist + + * tests/testglib.c (main): Test the new XDG basedir functions. + +2004-08-25 Tor Lillqvist + + * glib/gwin32.c (g_win32_get_windows_version): New + function. Returns the Windows version code like GetVersion(), + except that one can pretend to be running on Win9x by setting the + G_WIN32_PRETEND_WIN9X environment variable. This is mainly for + debugging purposed. + + * glib/gwin32.h: Declare it. Define macros G_WIN32_WINDOWS_IS_NT_BASED + and G_WIN32_HAVE_WIDECHAR_API to test Windows features at run-time. + +2004-08-25 Matthias Clasen + + * configure.in: Post-release version bump. + + * === Released 2.5.2 === + +Wed Aug 25 00:25:08 2004 Matthias Clasen + + * NEWS: Update for 2.5.2 + +2004-08-25 Tor Lillqvist + + Win32 equivalences of the XDG folders + + * glib/gutils.c (get_special_folder): New function, calls + SHGetSpecialFolderLocation() to get path to places like the My + Documents folder. + (g_get_any_init): Use CSIDL_PROFILE as HOME if not + overridden by env vars. + (g_get_user_data_dir): Use CSIDL_PERSONAL. + (g_get_user_config_dir): Use CSIDL_APPDATA. + (g_get_user_cache_dir): Use CSIDL_INTERNET_CACHE. Debatable... + (g_get_system_data_dirs): Use CSIDL_COMMON_APPDATA and + CSIDL_COMMON_DOCUMENTS. + (g_get_system_config_dirs): Use CSIDL_COMMON_APPDATA. + + * configure.in: Add -lole32 to G_LIBS_EXTRA for mingw. + + * glib/glib.def: Add the new functions. + +Mon Aug 23 16:16:35 2004 Manish Singh + + * glib/goption.c (g_option_group_add_entries): remove unused + variable. + +Mon Aug 23 01:35:18 2004 Matthias Clasen + + * glib/gutils.c (g_get_user_cache_dir): + * glib/gutils.c (g_get_user_config_dir): + * glib/gutils.c (g_get_user_data_dir): Don't call g_get_home_dir() + while holding the g_utils_global lock, simply use g_home_dir. + (#150695, Jody Goldberg) + +2004-08-21 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_finalize): Tell select_thread to + break out of its loop. Prevents a thread leak. (#147392, Peter + Zelezny) + + * glib/gunicollate.c (g_utf8_collate_key): Guard against bogus + return value from strxfrm(). For instance Microsoft's strxfrm() + returns INT_MAX on errors. (#141124) + +2004-08-19 Tor Lillqvist + + * glib/gunicollate.c (g_utf8_collate, g_utf8_collate_key): Correct + source and destination charset parameter order in g_convert() + call. (#150394, possibly also #141124) + +2004-08-20 Jon K Hellan + + * glib/goption.h: Remove trailing commas. + +2004-08-17 Matthias Clasen + + * configure.in: Check for all four values of the + visibility attribute; gcc 2.96 seems to miss + "default". (#150379, Vincent Noel) + +2004-08-16 Christian Rose + + * configure.in: Added "bs" to ALL_LINGUAS. + +2004-08-11 Ray Strode + + * docs/reference/glib/glib-sections.txt: + * glib/gutils.[ch] (g_get_user_data_dir), + (g_get_user_config_dir), (g_get_user_cache_dir), + (g_get_system_data_dirs), (g_get_system_config_dirs): + Add new XDG basedir API (bug 139973). + +2004-08-10 Matthias Clasen + + * glib/gmacros.h: Remove G_GNUC_INTERNAL from here. + * configure.in: Check whether the visibility attribute + works and define G_HAVE_GNUC_VISIBILITY and + G_GNUC_INTERNAL in glibconfig.h correspondingly. + +Mon Aug 9 17:37:56 2004 Matthias Clasen + + * glib/gmacros.h (G_GNUC_INTERNAL): Define empty if gcc is too old. + +2004-08-06 Hans Breuer + + * glib/makefile.msc.in glib/glib.def : updated + + * glib/gutils.c : avoid 'inconsitent dll linkage' by not + defining extern char** environ with msvc + +2004-08-06 Matthias Clasen + + * m4macros/glib-gettext.m4: Require ngettext. (#123847, + Danilo Segan) + +Thu Aug 5 20:53:00 2004 Ray Strode + + * glib/gutils.h (g_get_codeset): strdup result so caller + doesn't free internally managed memory. + +2004-08-04 Tor Lillqvist + + * glib/glib.def: Add glib_check_version. + + * config.h.win32.in: Update to match what configure produces. Add + the G_ATOMIC_*. Define G_ATOMIC_I486 when compiling with gcc. Move + HAVE_INT64_AND_I64 to where the configure script puts it. Add + HAVE_INTTYPES_H_WITH_UINTMAX. Define intmax_t as __int64 for MSVC. + +Tue Aug 3 16:19:44 2004 Matthias Clasen + + * glib/goption.c: Mark user visible strings for translation. + +Tue Aug 3 15:50:55 2004 Matthias Clasen + + * glib/goption.[hc]: Pedantically use g types throughout. + +Tue Aug 3 14:58:20 2004 Matthias Clasen + + * glib/gutils.h: + * glib/gutils.c (glib_check_version): New function to + check the version of GLib at runtime. (#149175, Michael Natterer) + +2004-08-03 Anders Carlsson + + * glib/goption.h: + * glib/gtypes.h: + Move GTranslateFunc to gtypes.h + +2004-08-02 Anders Carlsson + + * glib/Makefile.am: + * glib/glib.h: + * glib/goption.c: + * glib/goption.h: + * tests/.cvsignore: + * tests/Makefile.am: + * tests/option-test.c: + Add GOption. + +2004-08-02 Matthias Clasen + + * glib/gmacros.h: Add a G_GNUC_INTERNAL macro to mark function + declarations as internal and avoid PLT indirections for + them. (#145465, Arjan van de Ven) + + * glib/gunicodeprivate.h: + * glib/gthreadinit.h: + * glib/gmessages.h: + * glib/gdebug.h: + * glib/gconvert.c: Use G_GNUC_INTERNAL for _g_charset_get_aliases(), + _g_debug_init(), _g_log_fallback_handler(), _g_mem_thread_init(), + _g_messages_thread_init(), _g_convert_thread_init(), + _g_rand_thread_init(), _g_main_thread_init(), _g_atomic_thread_init(), + _g_mem_thread_private_init(), _g_messages_thread_private_init(), + _g_utf8_normalize_wc() and _g_unichar_combining_class(). + + * glib/gatomic.c: Include gthreadinit.h here to see the declaration + for _g_atomic_thread_init(). + +Sun Aug 1 13:19:18 2004 Manish Singh + + * tests/uri-test.c: move newline printing from run_from_uri_tests() + to run_roundtrip_tests(). + +2004-08-01 Matthias Clasen + + * Post-release version bump + + * === Released 2.5.1 === + +Sat Jul 31 23:17:05 2004 Matthias Clasen + + * NEWS: Updates. + +Sat Jul 31 20:33:07 2004 Matthias Clasen + + * tests/shell-test.c: Include a test involving consecutive + backslashes followed by a non-escaped doublequote. + + * glib/gshell.c (tokenize_command_line): Count consecutive + backslashes mod 2 to detect escaped doubleqotes. (#127306) + +2004-07-30 Matthias Clasen + + * glib/gconvert.c (g_unescape_uri_string): Don't validate + for UTF-8 here. (#148420, Robert Ögren) + + * tests/uri-test.c (run_roundtrip_tests): Add tests for + roundtrip compatibility. Going from filename to uri and + back should always give you the same filename back. + +2004-07-28 Matthias Clasen + + * tests/markups/valid-{9,10,11}.gmarkup: + * tests/markups/fail-{37,38,39}.gmarkup: Tests for handling + of whitespace inside tags. + + * glib/gmarkup.c (enum GMarkupParseState): Add + STATE_AFTER_ATTRIBUTE_NAME and STATE_AFTER_CLOSE_TAG_NAME. + (g_markup_parse_context_parse): Accept whitespace between + attribute names, '=' and attribute values and between + close tag name and '>'. (#148646, Hiroyuki Ikezoe) + +Tue Jul 27 02:01:31 2004 Matthias Clasen + + * glib/gstrfuncs.c (g_strsplit_set): s/g_strsplit/g_strsplit_set/ + as well. + +Sat Jul 24 17:50:07 2004 Soeren Sandmann + + * glib/gstrfuncs.c (g_strsplit_set): + s/g_strtokenize/g_strsplit_set/ in docs. + +Fri Jul 23 10:37:50 2004 Matthias Clasen + + * tests/type-test.c (main): Actually test G_MAXSIZE with + a gsize variable. + +2004-07-21 Matthias Clasen + + Fix #132858, Sven Neumann, patch by James Henstridge: + + * glib-gettextize.in: modify so that mkinstalldirs will + get installed into auxdir. + + * Makefile.am (gettext_SCRIPTS): install mkinstalldirs. + +2004-07-21 Matthias Clasen + + Fix #147651, reported by Oliver Guntermann: + + * glib/gprintfint.h (_g_vasprintf): Don't wrap vasprintf(), + _g_gnulib_vasprintf() in a macro, since they behave + differently wrt. to memory allocation. + + * glib/gprintf.c (g_vasprintf): Instead, differentiate + here between the three cases: system vasprintf(), + _g_gnulib_vasprintf(), no vasprintf(). + +2004-07-20 Crispin Flowerday + + * NEWS: Fix a typo in my name + +Tue Jul 20 04:31:40 2004 Soeren Sandmann + + * configure.in: Bump version number + +Sun Jul 18 19:40:30 2004 Soeren Sandmann + + * === Released 2.5.0 === + + * Makefile.am (BUILT_EXTRA_DIST): move gtk-doc.make here. + +Sun Jul 18 01:40:28 2004 Matthias Clasen + + * NEWS: Updates for 2.5.0 + +Mon Jul 12 00:02:40 2004 Matthias Clasen + + * glib/gi18n-lib.h: Remove the ENABLE_NLS check here as well. + +2004-07-09 Matthias Clasen + + * glib/gdir.c (g_dir_open): Convert filename to UTF-8 + before using it in the error message. (#146054, Federico + Mena Quintero) + +Thu Jul 8 00:54:32 2004 Matthias Clasen + + * glib/gi18n.h: Remove the ENABLE_NLS check, since GLib can't + be built without anyway. (#135899, Murray Cumming) + +Mon Jul 5 18:50:27 2004 Matthias Clasen + + * glib/gmessages.h (g_debug): Complete the g_log() + family. (#135730, Sven Herzberg) + +Mon Jul 5 18:42:30 2004 Matthias Clasen + + * glib/gnulib/Makefile.am (INCLUDES): Add top_srcdir to + make srcdir != . work. (#145166, Kaz Sasayama) + +Sun Jul 4 01:52:18 2004 Matthias Clasen + + * configure.in: Use a small test library instead of + libpthread.so for testing RTLD_GLOBAL brokenness. (#139567, + Julio M. Merino Vidal) + +2004-07-02 Sebastian Wilhelmi + + * glib/gatomic.c: Rename __asm to __asm__ and __volatile to + __volatile__ to make the file consistent. Spotted by Benoit + Carpentier . + +2004-07-01 John Ehresman + + * glib/giowin32.c (g_io_channel_win32_init, g_io_win32_free) + Initialize reset_send & reset_recv fields and don't close + sockets unless they were created. (#145153) + +Fri Jun 11 22:56:46 2004 Matthias Clasen + + * glib/gscanner.c (g_scanner_get_token_ll): Ignore a + missing newline at EOF for single line comments. + (#83674, Sven Neumann) + +Thu Jun 10 23:38:02 2004 Matthias Clasen + + * tests/printf-test.c (TEST): Actually set any_failed on + failure. (#143552, Philippe Blain) + +2004-06-09 Federico Mena Quintero + + * tests/uri-test.c (to_uri_tests): Fix expected results (ha ha) + for URIs that *should* have been invalid, or viceversa. + (from_uri_tests): Likewise. + +2004-06-07 Federico Mena Quintero + + Fixes #140532. + + * glib/gconvert.c (is_asciialphanum): Renamed from + is_escalphanum(); ensures that this is an ASCII character. + (is_asciiescalpha): Renamed from is_escalpha(). + (hostname_validate): Use the two functions above. + (g_filename_to_uri): Don't convert the filename to UTF-8. + (g_filename_from_uri): Don't convert the filename from UTF-8. + +Mon Jun 7 22:25:24 2004 Matthias Clasen + + * tests/run-markup-tests.sh: Default to silence, but support + a -v argument to get the old output back. + +2004-06-06 Tor Lillqvist + + * glib/gutils.c (g_get_any_init): Check home for being + NULL. (#143812, Ivan Wong) + +Sun Jun 6 15:23:00 2004 Pawan Chitrakr + + * configure.in: Added "ne" (Nepali) in ALL_LINGUAS + +Fri Jun 4 19:26:47 2004 Manish Singh + + * glib/galloca.h: cpp #directives should always have the "#" in the + first column of the the line. Do that for "#pragma alloca". Fixes + bug #143744. + +Wed Jun 2 00:57:16 2004 Matthias Clasen + + * glib/gtypes.h: Use higher precision for the mathematical + constants. (#141941, Morten Welinder) + +Tue Jun 1 22:01:40 2004 Matthias Clasen + + * glib/gmarkup.c (advance_char): Fix an off-by-one error + in g_markup_parse_context_parse(). (#142794, Morten Welinder) + +Sun May 16 23:23:29 2004 Matthias Clasen + + Merged from 2.4: + + * glib/gcompletion.c (g_completion_add_items): + (g_completion_remove_items): Remove unnecessary + checks. (#142559, Morten Welinder) + +2004-05-15 Tor Lillqvist + + * glib/gutils.c (g_get_any_init): [Win32] Only believe HOME if it + is an absolute path and exists. (#138618) + +2004-05-14 Tor Lillqvist + + * glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string + for precision correctly. (#142400) + + For backward compatibility with the Trio implementation, make "ll" + format modifer work on Win32, too. Change into "I64" before + passing to the system printf. (#142433) + + * tests/printf-test.c (main): Add tests for the above. + +2004-05-10 Matthias Clasen + + Merge from 2.4: + + * glib/gmain.c (block_source, unblock_source): Make these + static. (#142230, Morten Welinder) + +2004-05-10 Tor Lillqvist + + * glib/giowin32.c (g_win32_print_gioflags): Remove two duplicated + lines. Thanks to Benoît Carpentier. + +Sun May 9 02:04:14 2004 Matthias Clasen + + Merge from 2.4: + + * glib/guniprop.c (g_utf8_casefold): Avoid an unnecessary + memleak. (#141998, Nikolai Weibull) + +Sat May 8 23:02:26 2004 Matthias Clasen + + Merge from 2.4: + + * glib/gutils.h: Remove vestigial g_get_codeset(). + * glib/gutils.c (g_get_codeset): Call g_get_charset(). + (#137703, Owen Taylor) + +2004-05-06 Matthias Clasen + + * configure.in: Bump version number to 2.5.0. + +Wed May 5 23:35:44 2004 Matthias Clasen + + * glib/gconvert.c (g_filename_from_uri): Quote the file + scheme to mark it as untranslatable. String change. + (#133144, Danilo Segan) + +2004-05-03 Pablo Saratxaga + + * configure.in: Added Walloon (wa) to ALL_LINGUAS + +Sun May 2 03:51:59 2004 Manish Singh + + * glib/gtypes.h: check for __pentium4__ when deciding whether to + use bswap for GUINT32_SWAP_LE_BE_IA32(). Fixes bug #141620. + +2004-05-01 Hans Breuer + + * glib/gnulib/Makefile.am : added makefile.msc to EXTRA_DIST + fixes #141563, Steve Lhomme + +2004-04-30 Matthias Clasen + + * === Released 2.4.1 === + + * configure.in: Version 2.4.1, interface age 1. + + * NEWS: Updates + +2004-04-25 Tor Lillqvist + + * glib/gwin32.c (g_win32_get_package_installation_subdirectory): + Plug memory leak. (#140770, John Ehresman) + +2004-04-23 Matthias Clasen + + * glib/libcharset/localcharset.c (_g_locale_get_charset_aliases): + Reinstate LIBCHARSET_ALIAS_DIR support which got lost at some + point. (#139134, Piotr Klaban) + + * glib/gconvert.c (open_converter): Don't call g_strerror() here, + since it can lead to infinite recursion. (#139133, Piotr Klaban) + +2004-04-22 Matthias Clasen + + * tests/testglib.c (main): Trivial warning fix. (#140345) + + * tests/queue-test.c (main): Add some tests for off-by-one errors. + + * glib/gqueue.c (g_queue_pop_nth_link): Fix an off-by-one + error. (#139703, Philippe Blain) + + * tests/testglib.c (main): Add testcases for g_message() involving + non-printable and unsafe characters. + + * glib/gmessages.c (escape_string): Don't assume that + string->str remains unchanged over g_string_insert() + calls. (#139030, Christophe Saout) + + * glib/gstrfuncs.c (g_ascii_strtod): Fix problems when a + locale-specific decimal separator directly follows a + number. (#138424, Nickolay V. Shmyrev) + + * tests/strtod-test.c (main): Add some more testcases. + + * glib/gmain.c (g_main_context_query): Only set time_is_current to + FALSE if context->timeout is not zero. (#137795, Christian Krause) + +2004-04-21 Matthias Clasen + + * tests/printf-test.c (main): Comment out a nonessential testcase + which fails on HP-UX. (#136283, Jonas Jonsson) + +2004-04-15 Matthias Clasen + + * tests/patterntest.c (main): Add tests for the empty pattern. + + * glib/gpattern.c (g_pattern_spec_new): Don't read and write out + of bounds when the pattern is empty. (#140032, Stanislav Brabec, + Stefan Fent) + +2004-04-10 Tor Lillqvist + + * glib/gwin32.c (g_win32_getlocale): Add new language and + sublanguage codes, from GNU gettext. (#137958) + + * glib/giowin32.c + * glib/gmain.c + * glib/gstrfuncs.c + * glib/gthread.c: Decorating variable definitions with + __declspec(dllexport) causes problems on Cygwin build, and isn't + really needed for a native Win32 build with mingw or MSVC, so + remove. (#138402, Roger Leigh) + + * glib/libcharset/localcharset.c: Use Win32-specific code also on + Cygwin. + * tests/uri-test.c: Don't assume that local filenames are in UTF-8 + on Cygwin, either. (#138412, Roger Leigh) + +2004-04-08 Guntupalli Karunakar + + * configure.in: Added "gu" (Gujarati) to ALL_LINGUAS. + +2004-04-03 Tor Lillqvist + + * configure.in: Remove AC_CYGWIN, obsolete. Don't let pthreads be + found on Cygwin, they don't work. (#138401, Roger Leigh) + +2004-03-31 Tor Lillqvist + + * tests/spawn-test-win32-gui.c: Minor Cygwin fix. (#138405, Roger + Leigh) + + * tests/unicode-encoding.c (process): Use UTF-16LE explicitly also + on Cygwin. (#138423, Roger Leigh) + +2004-03-30 Adam Weinberger + + * configure.in: Added en_CA to ALL_LINGUAS. + +2004-03-21 Tor Lillqvist + + * glib/gutils.c (g_path_get_dirname): Fix Win32 behaviour in some + cases where a drive letter is present. For 'a:' or 'a:foo', return + 'a:.'. This is mostly just for consistency with the behaviour + without a drive letter. But very important is to for 'a:\foo' or + 'a:\', return 'a:\', and not 'a:'. (Ditto for forward slashes + instead of backslashes.) (#137316) + + * tests/dirname-test.c (main): More complete testing on Win32. If + a test fails, include expected and actual result in error message. + +Fri Mar 19 15:21:09 2004 Owen Taylor + + * glib/gmain.c: Fix the accidental revert of the + fixes from #112222 that happened when the GChildWatch + code was added. (Caught by Christian Persch) + +Fri Mar 19 11:07:06 2004 Owen Taylor + + * tests/atomic-test.c (main): Make computation + of "biggest_pointer" vaguely more portable. + (#137498, Jonas Jonsson) + +2004-03-16 Tor Lillqvist + + * configure.in: Define HAVE_INT64_AND_I64 also in the mingw (gcc + on Win32) case, where the 64-bit type is called long long, but the + system printf/scanf format modifier for 64-bit integers is still I64. + +2004-03-16 Gareth Owen + + * configure.in: Added en_GB to ALL_LINGUAS + diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 new file mode 100644 index 0000000..999078c --- /dev/null +++ b/ChangeLog.pre-2-8 @@ -0,0 +1,1483 @@ +2005-08-12 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.8.0 === + + * NEWS: Updates + +2005-08-12 Tim-Philipp Müller + + * gobject/genums.c: (g_flags_get_first_value): Special-case flag + value of 0. Instead of returning the first random GFlagsValue + we come across, return the GFlagsValue for 0 if it exists or + NULL if it does not exist. Never return the GFlagsValue for 0 + if the requested flags value is nonzero. + +2005-08-12 Matthias Clasen + + * configure.in: Bump version to 2.8.0 + +2005-08-11 Tor Lillqvist + + * glib/gutils.c (g_get_any_init): Use "localhost" as fallback for + g_get_host_name(), not "unknown". + +2005-08-10 Stepan Kasal + + Fix typos: Invokation --> Invocation (in various places) + +2005-08-10 Matthias Clasen + + * glib/gfileutils.c (g_build_path_va, g_build_pathname_va): + Take a va_list*, not a va_list, to avoid compiler warnings + about uninitialized variables. + +2005-08-09 Matthias Clasen + + * tests/gobject/Makefile.am (test_programs): Add it here. + + * tests/gobject/gvalue-test.c: Beginning of a test suite + for GValue. + + * NEWS: Updates + +2005-08-08 Matthias Clasen + + * glib/gutils.c (_g_compute_locale_variants): Initialize + variables to not make gcc nervous. + +2005-08-08 Manish Singh + + * glib/abicheck.sh: remove stray -V option to grep so it actually + works. + +2005-08-08 Matthias Clasen + + * tests/convert-test.c: Enable the endianness test. + + * glib/gconvert.c: Make the caching of iconv descriptors + optional. + + * configure.in: Add an --enable-iconv-cache option, and + default to disabling iconv caching on new enough glibc. + Somebody with access to Solaris systems will need to test + if opening/closing of iconv descriptors is enough of + a performance problem to warrant the caching on that + platform. Note that the caching is causing correctness + problems in some corner cases, thus turning it off + is desirable unless it has severe performance implications. + + * tests/convert-test.c: Add a test for + endianness handling. + +2005-08-08 Sunil Mohan Adapa + + * configure.in: Added "te" to ALL_LINGUAS. + +2005-08-08 Matthias Clasen + + * tests/Makefile.am: Add convert-test here. + + * tests/convert-test.c: Add the beginning of a testsuite + for g_convert() and friends. + +2005-08-06 Matthias Clasen + + * glib/glib.symbols: Include glib_on_error_halt. + + * glib/abicheck.sh: Also check exported variables. + +2005-08-05 Manish Singh + + * tests/refcount/closures.c: remove unused n_threads variable. + +2005-08-05 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.7 === + + * NEWS: Updates + +2005-08-04 Matthias Clasen + + * glib/glib.symbols: + * glib/gatomic.[hc]: Always export g_atomic_int_get and + g_atomic_pointer_get as functions, even if we have macros, + to avoid changing the ABI depending on configuration. + + * glib/gatomic.c: Fix the s390 implementations of + g_atomic_pointer_compare_and_exchange. + +2005-08-04 Tor Lillqvist + + * glib/gstdio.h: Move the G_BEGIN_DECLS/G_END_DECLS pair outside + the #if/#else/#endif block. Otherwise we had G_BEGIN_DECLS without + matching G_END_DECLS on Unix, and G_END_DECLS without matching + G_BEGIN_DECLS on Win32. + +2005-08-03 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.6 === + + * NEWS: Updates + +2005-08-03 Ross Burton + + * docs/reference/glib/tmpl/windows.sgml: + Add a long description, pointing people at Cygwin for a complete + Unix library. + + * glib/gutils.c: + Document return value of g_get_host_name(). + +2005-08-03 Matthias Clasen + + * glib/gatomic.c: Add native atomic operations + for s390. + + * configure.in: ... and use them on s390. + +2005-08-03 Ross Burton + + * glib/gstdio.c: + Fix DocBook tag typo. (#311966) + +2005-08-03 Matthias Clasen + + * glib/gstdio.h: Add G_BEGIN_DECLS/G_END_DECLS. (#312424) + +2005-08-02 Matthias Clasen + + * glib/gconvert.c (g_convert_with_iconv): Don't go in an + infinite loop if the input text ends in an incomplete multibyte + character. (#312402, Sebastien Bacher) + + * Bump version + + * === Released 2.7.5 === + + * NEWS: Updates + +2005-08-02 Matthias Clasen + + * glib/gconvert.c (g_convert_with_iconv, g_convert_with_fallback): + Cleanup converter state after the conversion. Document streaming + conversion pitfalls. (#311337) + +2005-08-02 Tor Lillqvist + + * tests/refcount/objects.c + * tests/refcount/properties.c + * tests/refcount/signals.c: Use g_usleep() instead of sleep() for + portability. + +Mon Aug 1 23:33:47 2005 Tim Janik + + * tests/refcount/closures.c: test high contention on closure + reference counts to trigger and catch non-atomic updates. + + * tests/refcount/objects.c: + * tests/refcount/objects2.c: + * tests/refcount/properties.c: + * tests/refcount/properties2.c: + * tests/refcount/signals.c: + fixed up test and threading fundamentals. variables accessed from all + threads need to be volatile. context switches are enforced by using + g_thread_yield(), not g_usleep(1) which may result in busy waits on + some platforms. for testcode, always consider all warnings and + critical messages fatal. issue the currently running program on + stdout. improved progress indicators. + + * tests/refcount/properties.c: + * tests/refcount/objects.c: + don't overdo the number of testing threads to keep the testing machine + usable, 2 threads can produce as much contention as 20 if executing the + same code. + + * tests/refcount/signals.c: only start 1 thread per object. GObject + doesn't provide mutually exclusive object access, but only mutually + exclusive reference count modification. + + * tests/Makefile.am: added closures test. + +2005-08-01 Tor Lillqvist + + * tests/uri-test.c: Make it pass on Win32. + (from_uri_tests[]): Take into consideration that on Win32 we don't + return "localhost" hostnames. + (safe_strcmp_filename): New function that considers slash and + backslash equal on Win32. + (safe_strcmp_hostname): New function that considers "localhost" + equal NULL on Win32. + (run_roundtrip_tests): Use safe_strcmp_filename() and + safe_strcmp_hostname(). + +Sun Jul 31 01:50:20 2005 Tim Janik + + * glib/gdataset.c: + moved G_DATALIST_*_POINTER() macros here, because proper use requires + the global g_dataset_global mutex to be acquired. + g_datalist_id_get_data(): + g_datalist_unset_flags(): + g_datalist_set_flags(): properly acquire and release dataset mutex. + + * glib/gdatasetprivate.h: implement G_DATALIST_GET_FLAGS() via atomic + pointer access to account for memory barriers. moved all other macros. + +2005-07-26 Matthias Clasen + + * glib/goption.c: Include glibintl.h, not gi18n.h, noticed + by Dan Winship. + + * configure.in: Try -mt as compiler flag for threads, needed + for the HP C compiler on HP-UX. (#163051, Paul Cornett) + + * glib/ghash.c (g_hash_table_foreach): Fix a typo in the + docs. (#311569, Ross Burton) + +2005-07-21 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.4 === + + * NEWS: Updates + +2005-07-20 Manish Singh + + * tests/refcount/signals.c: use G_CALLBACK for signal connections. + +2005-07-20 Matthias Clasen + + * glib/gthreadpool.c (g_thread_pool_free): Don't get + stuck in here if immediate is TRUE. (#310954, + Hong Jen Yee) + + * tests/threadpool-test.c (main): Test immediate == TRUE. + +2005-07-20 Tor Lillqvist + + * glib/gutils.h (g_win32_get_system_data_dirs): Make this an + inline function. Define it only if G_CAN_INLINE and not + C++. (#173098) + +2005-07-19 Matthias Clasen + + * glib/gstring.c (g_string_chunk_insert_len): Avoid + an unnecessary strlen if len is -1. (#169692, + Benoit Dejean) + + * glib/gatomic.c (g_atomic_pointer_compare_and_exchange): + Fix g_atomic_pointer_compare_and_exchange on sparc64. + (#167572, Gert Doering) + +2005-07-15 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.3 === + +2005-07-15 Matthias Clasen + + * tests/Makefile.am (SUBDIRS): Add tests/refcount + + * configure.in: Add tests/refcount + + * tests/refcount/properties.c: Test property changes + from multiple threads. + + * tests/refcount/signals.c: Test signal emission from + multiple threads. + + * tests/refcount/objects.c: Test refcounting from + multiple threads. + + * tests/refcount/objects2.c: + * tests/refcount/properties2.c: Tests to measure the + overhead of threadsafe refcounting. + + * glib/giochannel.c (g_io_channel_ref, g_io_channel_unref): + Use atomic operations to make refcounting + threadsafe. (#166020, Wim Taymans) + + * NEWS: Updates + +2005-07-14 Matthias Clasen + + * tests/spawn-test.c: + * tests/uri-test.c: + * tests/thread-test.c: + * tests/queue-test.c: + * tests/mainloop-test.c: + * tests/iochannel-test.c: + * tests/gio-test.c: + * tests/child-test.c: Make the tests silent on success. + +2005-07-13 Matthias Clasen + + * glib/gfileutils.c (g_mkdir_with_parents): Fix a + typo. (#310243, Richard Laager) + + * glib/goption.c (g_option_group_add_entries): Warn if a + short name is not acceptable. + +2005-07-12 Matthias Clasen + + * glib/goption.h (G_OPTION_FLAG_NOALIAS): + * glib/goption.c: Add and implement a new flag + to turn off the automatic - prefixing + for conflict resolution of long option names. (#171840, + Adam McLaurin) + + All optional callback arguments (#308886, Pawel + Sliwowski) + + * glib/goption.h (G_OPTION_FLAG_OPTIONAL_ARG): + * glib/goption.c: Add and implement a new flag + to indicate that a callback *optionally* takes another + argument. + + * tests/option-test.c: Add tests for optional arguments. + +2005-07-12 Matthias Clasen + + * glib/gthread.c (g_static_rec_mutex_lock_full): Don't lock + if depth is zero. (#310148, Wim Taymans) + +2005-07-10 Matthias Clasen + + * glib/gutils.c (g_listenv): Ignore anomalous environment + entries which are not of the form variable=value. (#309859, + Morten Welinder) + +2005-07-09 Tor Lillqvist + + * glib/giowin32.c: Totally rewritten socket channel + implementation. See discussion in bug #147392. + + * configure.in: Don't use autoconf variables for the resource + object files on Win32 any longer. Instead handle that in the + Makefile.am files. Check for windres. + + * glibconfig.h.win32.in: Minor tuning to match the + configure-produced glibconfig.h closely. + + * glib/Makefile.am: Don't use the scripts in build/win32 to + compile glib.rc into a resource object file. (This means we lose + the build number increment magic, but I doubt it was that useful + anyway.) Instead use windres directly. To pass the normal .o file + produced by windres through libtool, which wants .lo files, pass + it directly to the linker using a -Wl option. + + * glib/glib.rc.in: Thus replace BUILDNUMBER with 0. + +2005-07-08 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.2 === + + * NEWS: Updates + +2005-07-07 Matthias Clasen + + * configure.in: Make the size_t size detection work on AIX. + (#309725) + +2005-07-06 Matthias Clasen + + * configure.in: Require a newer gtk-doc. + +2005-07-01 Hans Breuer + + * glib/gmessages.c : include for getpid() + * glib/gmappedfile.c : include for close() etc. + * glib/makefile.msc.in : add gmappedfile.obj + +2005-07-01 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_get_key_comment): + (g_key_file_get_top_comment): Don't reverse the order of multiline + comments. + (g_key_file_get_group_comment): Actually get the group comment. + + * tests/keyfile-test.c (test_comments): Test that comments are + handled properly. (#309263, Mikael Magnusson) + +2005-06-30 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.1 === + +2005-06-30 Matthias Clasen + + * glib/gstring.c (g_str_hash): Fix portability issues. + (#307064, Morten Welinder) + + Apply a patch which may make GLib work on BeOS again. + (#309157, Kian Duffy) + + * glib/gmain.c: Update the BeOS includes. + + * glib/gstdio.c: + * glib/gutils.c (g_find_program_in_path): + * glib/gbacktrace.c (g_on_error_stack_trace): Use the UNIX + implementation on BeOS, as well. + + * configure.in: Don't put glib 1.0 into G_MODULE_LIBS, even + on BeOS. + + * NEWS: Updates + +2005-06-26 Tor Lillqvist + + * glib/Makefile.am: libtool installs/uninstalls the import + library, no need to do it ourselves. Do still install/uninstall + the .def file, though. + + * glib/gmappedfile.c: Add Win32 implementation. + (g_mapped_file_free): Don't mention writable shared mappings in + the doc comment. Free the GMappedFile struct. + + * tests/mapping-test.c (main): No kill() or SIGUSR1 on Win32, use + a flag file instead to stop the child. Use g_usleep() instead of + sleep(). + +2005-06-24 Matthias Clasen + + Add an mmap() wrapper called GMappedFile. (#148218, + David Schleef, Behdad Esfahbod) + + * glib/gmappedfile.[hc]: New files. + + * configure.in: Check for mmap. + + * glib/Makefile.am: Add new files. + + * glib/glib.symbols: Add new functions. + + * glib/glib.h: Include gmappedfile.h + + * tests/mapping-test.c: Tests for GMappedFile. + + * tests/Makefile.am: Add new file. + + * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Add --enable-man. + +2005-06-24 Tor Lillqvist + + * glib/Makefile.am (install-libtool-import-lib): Current GNU tools + do understand the PRIVATE keyword. + + * glib/gfileutils.c (g_mkdir_with_parents): Return error with + EINVAL also for empty pathnames. + (g_build_pathname_va): Fix typo. + +Thu Jun 23 15:52:08 2005 Manish Singh + + * glib/gfileutils.c: g_build_filename_va is only use in the G_OS_WIN32 + case, so compile it conditionally. + +2005-06-23 Matthias Clasen + + * tests/keyfile-test.c (test_group_remove): Don't leak + memory here. + + * glib/gkeyfile.c (g_key_file_load_from_data_dirs): Don't + leak output_path. (#308546, Kjartan Maraas) + + * glib/glib.symbols: + * glib/gfileutils.h: + * glib/gfileutils.c (g_build_pathv, g_build_filenamev): + Variants of g_build_path() and g_build_filename() + which take a string array instead of varargs. + (#149092, Todd A. Fisher) + + * tests/strfunc-test.c: Add tests for g_build_pathv() + and g_build_filenamev(). + +2005-06-22 Tor Lillqvist + + * glib/gfileutils.c + * glib/gfileutils.h + * glib/glib.symbols + * tests/testglib.c: Rename g_makepath() to g_mkdir_with_parents(). + +2005-06-22 Matthias Clasen + + * glib/goption.c (parse_short_option, parse_long_option): + Pass the option name also in the NO_ARG case. (#308602, + Masatake YAMATO) + (parse_arg): Properly store changes for arrays. (#308528, + Roger Leigh) + +2005-06-22 Tor Lillqvist + + * glib/gfileutils.c (g_makepath): New function. Creates a + directory including intermediate parent directories as + needed. (#60509) + + * glib/gfileutils.h: Declare it. + + * glib/gutils.c (g_get_host_name): New function. Returns the + machine's name, or one of its names. Document that it is + best-effort only, and not guaranteed to be unique or anything. + (g_get_any_init): Get the host name here. On Unix use + gethostname(), on Windows use GetComputerName(). (#5200) + + * glib/gutils.h: Declare it. + + * glib/glib.symbols: Add new functions. + + * tests/testglib.c: Test g_makepath() and g_get_host_name(). + +2005-06-18 Matthias Clasen + + * glib/goption.h: + * glib/goption.c: Add G_OPTION_FLAG_NO_ARG and + G_OPTION_FLAG_FILENAME to allow greater control of + G_OPTION_ARG_CALLBACK options. (#302632, Dan Winship) + + * tests/option-test.c: test callback args + +2005-06-14 Theppitak Karoonboonyanan + + * configure.in: Added 'th' (Thai) to ALL_LINGUAS. + +2005-06-10 Matthias Clasen + + * configure.in: Bump version + + * === Released 2.7.0 === + + * NEWS: Updates + +2005-06-09 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_parse_value_as_integer): Better + error checking. (#306389, Morten Welinder) + + * glib/goption.c (parse_int): Set errno to 0 before calling + strtol. (#306388, Morten Welinder) + +2005-06-09 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c + * glib/glib.symbols: Add a chdir() wrapper, too. + + * glib/glib.symbols: Add g_win32_locale_filename_from_utf8(). + + * glib/gwin32.c (g_win32_locale_filename_from_utf8): Clarify doc + comment. + +2005-06-08 Tor Lillqvist + + * glib/gutils.c (get_windows_directory_root): New helper function + on Win32, returns the root of the drive (or possibly share) where + the Windows directory is. (In the case of Terminal Server sessions + the Windows directory is a per-user folder.) + (g_get_any_init): Use get_windows_directory_root() as last resort + for both temp directory and home directory. g_get_home_dir() now + never returns NULL on Win32. Don't look at HOMEDRIVE and + HOMEPATH. HOME, USERPROFILE, CSIDL_PROFILE and Windows directory + drive root should be enough. + +2005-06-08 Matthias Clasen + + * glib/glib.symbols: + * glib/gunicode.h: + * glib/gunicollate.c (g_utf8_collate_key_for_filename): + New function to calculate collation keys which are more + suitable for sorting filenames. (#172690, Ole Laursen) + +Fri May 27 17:18:00 2005 Manish Singh + + * glib/goption.c (parse_short_option): initialize option_name + before using it. + +2005-05-27 Matthias Clasen + + * glib/goption.c (parse_short_option, parse_long_option): + Return an error if an option is missing its argument. (#305576, + Björn Lindqvist) + + * tests/option-test.c (missing_arg_test): Add a testcase. + +Wed May 25 15:33:51 2005 Manish Singh + + * glib/goption.c (print_help): rest_description should be const. + +2005-05-25 Matthias Clasen + + * glib/gunidecomp.c (combine_hangul): Don't eat Hangul + when normalizing. (#301742, reported by Christian Biere, + patch by Noah Levitt) + +2005-05-24 Matthias Clasen + + * glib/goption.c (print_help): If the remaining argument + has an arg_description, display the synopsis as + PROGNAME [OPTION...] REST (#305346, Noah Levitt) + +2005-05-20 Federico Mena Quintero + + Merged from glib-2-6: + + * glib/gspawn.c (g_spawn_command_line_sync): Clarify the meaning + of exit_status(); it's not the return code from the child, but + rather the waitpid() status. + +2005-05-18 Matthias Clasen + + * glib/gunidecomp.c: Correct the end of the Hangul + Syllables range, from 0xd7af to 0xd7a3, in several + places. (#301984, Changwoo Ryu) + +2005-05-17 Matthias Clasen + + * tests/tree-test.c (main): Check the return values of + g_tree_remove(). + + * glib/gtree.c (g_tree_remove, g_tree_steal): Return + a boolean indicating wether the key was found. (#302545, + Matthew F. Barnes) + +2005-05-06 Brian Cameron + + * configure.in, gmodule-no-export-2.0-uninstalled.pc.in, + Makefile.am: Added gmodule-no-export-2.0-uninstalled.pc.in + to allow building of other libraries like pango when + glib is uninstalled. + +2005-05-06 Matthias Clasen + + * tests/option-test.c: Add a testcase. + + * glib/goption.c (g_option_context_parse): Treat '-' + on its own as a non-option argument. (#168008, Tim Musson, + Thomas Leonard and others) + +2005-05-05 Owen Taylor + + * glib/gdataset.[ch] glib/gdatasetprivate.h: Add + g_datalist_set/unset_flags(), g_datalist_get_flags() functions + to squeeze some bits into a GDataSet... this is needed for + efficient implementation of toggle references in GObject. + + * tests/gobject/references.c tests/gobject/Makefile.am: + Add a test case for weak and toggle references. + + * glib/gfileutils.[ch]: Rename g_file_replace() back + to g_file_set_contents(). + + * glib/glib.symbols: Update. + +2005-05-02 Matthias Clasen + + * glib/gstring.c (g_str_equal, g_str_hash): Move docs + inline. + +2005-05-01 Matthias Clasen + + * glib/ghash.h: Rename some parameters to make gtk-doc + happy. + + * glib/gutils.c: + * glib/gwin32.c: + * glib/gstdio.c: Fix some typos, mark new API as "Since 2.8". + +2005-04-29 Matthias Clasen + + * glib/gtree.c: Clarify some docs. (#302062, Matthew F. Barnes) + +2005-04-28 Matthias Clasen + + * glib/gstrfuncs.c (g_strcompress): Warn and don't crash + when meeting a trailing \\. (#301373, Benjamin Otte) + +2005-04-27 Tor Lillqvist + + * glib/gconvert.c (open_converter, g_convert_with_iconv): Don't + call g_set_error() unless the GError pointer is non-NULL. This + avoids infinite recursion problems in certain rare situations on + Windows, when g_locale_from_utf8() is called from + _glib_get_locale_dir() after the change below. It's the + _glib_gettext() calls to translate error messages that are + parameters to g_set_error() that cause the recursion, not + g_set_error() itself. + + * glib/gwin32.c (g_win32_locale_filename_from_utf8): New + function. Converts a filename to the system codepage, and if a + straight conversion isn't possible (because the filename contains + characters not in the system codepage), try looking up the + filename (which should refer to an existing file for this to + succeed) with short (8.3) pathname components. + + * glib/gutils.c (_glib_get_locale_dir): No need to cache the + result, this function is normally called only once. Return the + path to the locale directory in system codepage, not UTF-8. The + path is passed to bindtextdomain(), which doesn't use UTF-8 file + names. Use g_win32_locale_filename_from_utf8(). (#301772) + + Don't do run-time lookup of message catalog directory on + Cygwin. Cygwin is supposed to look and feel like Unix, and on Unix + we use paths fixed at configure time. + +2005-04-19 Tor Lillqvist + + * glib/gutils.h: Minor comment improvement. + +2005-04-18 Tor Lillqvist + + * glib/gfileutils.c: No on Win32. Definition of + save_errno was missing in one place. + +Sat Apr 16 20:15:44 2005 Soeren Sandmann + + * glib/gfileutils.c (g_file_replace): Save the errno in various + places + + * glib/gfileutils.c (set_umask_permissions): Fork a child and do + chmod() to the umask() permissions there. + +2005-04-10 Matthias Clasen + + * glib/gmessages.h (g_debug): Use G_LOG_LEVEL_DEBUG in + both definitions. (#300071, Tommi Komulainen) + +2005-04-09 Tor Lillqvist + + * glib/gutils.c: Include on Win32 for getpid(). (#173094) + +2005-04-08 Tor Lillqvist + + * glib/gstdio.h + * glib/gstdio.c + * glib/glib.symbols (g_access, g_chmod, g_creat): Wrap also + access(), chmod() and creat(). (#169623, #171285) + +2005-04-08 Tor Lillqvist + + Improve g_get_system_data_dirs() on Windows. A library that calls + g_get_system_data_dirs() might be installed in a different + top-level prefix than GLib or the application being run. + + * glib/gutils.h (g_win32_get_system_data_dirs): New static + function defined in this header. Calls + g_win32_get_system_data_dirs_for_module() passing the address of + itself as parameter. g_get_system_data_dirs() is #defined as this + function. + + * glib/gutils.c (g_win32_get_system_data_dirs_for_module): New + function. If the address parameter is non-NULL, the corresponding + module's installation location is used for one of the returned + path names, in addition to the COMMON_APPDATA, COMMON_DOCUMENTS, + glib top-level and application top-level folders. + (g_get_system_data_dirs): Now just for backward compatibility on + Win32. Just call g_win32_get_system_data_dirs_for_module(NULL). + + * glib/glib.symbols: Add g_win32_get_system_data_dirs_for_module. + + * glib/gutils.c (read_aliases): Not used on Windows. + (unalias_lang): Don't do anything on Windows, there is no + /usr/share/locale/locale.alias file.. + +Thu Apr 7 22:51:15 2005 + + * glib/gutils.c (g_get_system_data_dirs): Declare glib_top_share_dir + and exe_top_share_dir only in G_OS_WIN32. + +2005-04-08 Tor Lillqvist + + * glib/gutils.c (g_get_system_data_dirs): After investigating more + closely the actual use cases of this function, I understand better + what it needs to do on Windows. In addition to the Windows + COMMON_APPDATA and COMMON_DOCUMENTS folders, also return the + "share" subfolders of GLib's installation location and the + application .exe's installation location, hoping that either + matches what the function's caller is looking for. + + * glib/gutils.h (G_WIN32_DLLMAIN_FOR_DLL_NAME): Use wide char API + if available, and store dll name in UTF-8. + +2005-04-05 Matthias Clasen + + * glib/gfileutils.c (get_contents_stdio): Avoid memory + leaks in borderline cases. (#172612, Morten Welinder) + +2005-04-04 Matthias Clasen + + * glib/gconvert.c: Clarify docs in some places. (#172404, + Morten Welinder) + +2005-04-03 Matthias Clasen + + * glib/gutils.h: Undef G_CAN_INLINE if G_IMPLEMENT_INLINES is + defined. This was the pre-2.6 behaviour, and without it, + G_IMPLEMENT_INLINES cannot be used in multiple .c files + at all. (#165852, Dave Benson) + +2005-04-01 Matthias Clasen + + * glib/gmain.c (g_child_watch_source_new): Add a note regarding + waitpid(-1). + (g_child_watch_source_init_multi_threaded): + (g_child_watch_source_init_single): Don't use SA_RESTART, + since it causes problems on at least one platform. (#168352) + +2005-03-30 Steve Murphy + + * configure.in: Added "rw" to ALL_LINGUAS. + +2005-03-30 Sven Neumann + + * glib/gfileutils.c (get_contents_stdio): handle the unlikely case + that no bytes are read from the file and allocate an empty string. + +2005-03-30 Tor Lillqvist + + * glib/giowin32.c (g_io_win32_fd_get_flags_internal): Always claim + file descriptors open to devices are readable, since we can't + know. fstat() doesn't give any useful information. (#145326) + +2005-03-29 Tor Lillqvist + + * glib/gmain.c (g_poll): [Win32] If the event fired, assign + f->revents=f->events. We can't know whether the upper layer using + the event actually is readable, writeable or what, so say that all + the conditions hold. Remove the ResetEvent() call that has been + ifdeffed out anyway for a long time. Remove an "#ifdef 1" and + #endif pair of lines, that code is not optional. + (g_get_current_time): [Win32] Use GetSystemTimeAsFileTime() + instead of time() and GetTickCount(). Much simpler. + +2005-03-28 Matthias Clasen + + * tests/date-test.c: + * tests/testgdate.c: Add tests for + g_date_get_iso8601_week_of_year(). + + * glib/gdate.c (g_date_get_iso8601_week_of_year): + Fix the calculation. (#169858, Jon-Kare Hellan) + +2005-03-27 Tor Lillqvist + + * configure.in: Apparently AC_LIBTOOL_WIN32_DLL isn't deprecated + after all, and in fact necessary with HEAD libtool. + +2005-03-23 Tor Lillqvist + + * glib/gutils.c (g_getenv): [Win32] Fix corner case bug when + environment variable value is exactly one character. + +2005-03-21 Matthias Clasen + + * glib/glib.symbols: Add g_try_malloc0 + + * glib/gmem.h: Add g_try_new, g_try_new0, g_try_renew and + g_try_malloc0. (#169611, Stefan Kost) + + * glib/gmem.c: Implement g_try_malloc0. + +2005-03-20 Tor Lillqvist + + * glib/gspawn-win32.c (do_spawn_with_pipes): Close the process + handle if the caller doesn't want it also in the case without a + helper process. + (g_spawn_sync): Don't ask for a child pid which we don't need. + + * glib/gtimer.c: On Win32, use GetSystemTimeAsFileTime() instead + of GetTickCount(). (#159507) + + * glib/gmessages.c (g_log_default_handler) + * glib/gutils.c (g_get_prgname): Move the Win32 code that asks the + program name from the system to g_get_prgname(). Do output the pid + also on Win32 (useful in case there are several instances of the + same program running). + + * tests/testglib.c (main): Print more detailled output from the + timer tests. Don't print home directory twice. Test + g_win32_error_message(). + + * tests/spawn-test.c (run_tests): On Win32, run netstat instead of + ipconfig. On Windows XP collecting output from ipconfig doesn't + seem to work for some reason. + +2005-03-18 Hans Breuer + + * glib/makefile.msc.in : handle galiasdef.c (although completely + useless for msvc build) + + * glib/gbacktrace.c glib/gmessage.c : need at least _WIN_VER 0x0401 + for IsDebuggerPresent() + +2005-03-17 Matthias Clasen + + * glib/gkeyfile.c: Update the documentation, reflecting the + fact that the special case for !group_name --> start_group + got removed. (#170566, Tim-Philipp Müller) + +2005-03-15 Matthias Clasen + + * glib/goption.c (g_option_context_set_main_group): Warn + if there already is a main group. (#170445, Jeff Franks) + +Sun Mar 13 22:01:17 2005 Manish Singh + + * tests/array-test.c: delete a bunch of dead code. + +Sun Mar 13 21:28:47 2005 Manish Singh + + * glib/gdataset.c: remove spurious IA prefix from g_quark_try_string. + +2005-03-13 Matthias Clasen + + * glib/gatomic.c: + * glib/gcache.c: Small fixes to the previous commit. + +2005-03-13 Matthias Clasen + + Make PLT-reduction work with gcc4, and don't include + everything in galias.h: + + * glib/glib.symbols: Group symbols by header and source file. + * glib/makegalias.pl: Protect definitions by the same + preprocessor symbols used to guard the headers. Move + the alias declarations to a separate file which is + produced when calling makegalias.pl -def + * glib/Makefile.am (galiasdef.c): Add a rule to generate this + file. + * glib/*.c: Include galias.h after the other GLib headers, + include galiasdef.c at the bottom. + + * glib/glib.symbols: Add g_listenv and g_file_replace. + +Fri Mar 11 23:51:12 2005 Soeren Sandmann + + * glib/gfileutils.c (write_to_temp_file): Don't try and generate + a dotfile from the name -- it doesn't work with absolute + paths. Also make documentation indicate that symlinks will be + overwritten. Both pointed out by Alexis S. L. Carvalho. + +2005-03-11 Matthias Clasen + + * m4macros/glib-gettext.m4: Avoid stupid compiler complaints + about precision loss. + +2005-03-10 Matthias Clasen + + * glib/gdate.c: Remove a lot of pointless g_return_if_fail() + checks. (#169859, Morten Welinder) + +2005-03-10 Sven Neumann + + * tests/file-test.c: include . + +2005-03-10 Sven Neumann + + * glib/gfileutils.c (get_contents_stdio): delay memory allocation + until after the first read. Saves a bunch of reallocs. Also + increased the buffer size to 4096 bytes. (bug #165954) + + * tests/file-test.c (test_get_contents): added a (very basic) test + for g_file_get_contents(). + +Wed Mar 9 19:06:45 2005 Manish Singh + + * glib/glib.symbols: Add g_file_replace. + +2005-03-09 Matthias Clasen + + * configure.in: Bump version + +2005-03-09 Sven Neumann + + * glib/gfileutils.c (g_file_replace): avoid unnecessary filename + conversions. + +2005-03-09 Tor Lillqvist + + * glib/gutils.c (g_get_user_data_dir, g_get_user_config_dir, + g_get_user_cache_dir, g_get_system_data_dirs, + g_get_system_config_dirs): [Win32] Don't leak return value from + get_special_folder(). (#169348, Daniel Atallah) Guard against + g_home_dir being NULL, use g_tmp_dir/g_user_name in that case. + +Tue Mar 8 15:46:54 2005 Søren Sandmann + + * glib/gfileutils.c (g_file_replace): New API. A function to + atomically create a file. + +2005-03-08 Matthias Clasen + + * glib/glib.symbols: Add the new attributes here too. + + * glib/gmacros.h: Define G_GNUC_NULL_TERMINATED. + (#164706, Marc Meissner) + + * glib/gstrfuncs.h: + * glib/gfileutils.h: Use G_GNUC_NULL_TERMINATED where + appropriate. + + * glib/goption.c (parse_int): Fix an error message. + (#168751, Hazael Maldonado Torres) + +2005-03-07 Matthias Clasen + + * glib/gdebug.h: Small cleanup (use G_BEGIN/END_DECLS). + (#168474, Fabricio Barros Cabral) + +2005-03-07 Matthias Clasen + + * glib/gutils.c (g_find_program_in_path): Mark the last + paragraph of the docs as Windows-specific. (#169433) + +2005-03-06 Matthias Clasen + + * glib/gmarkup.c: Add G_GNUC_PRINTF attribute + to set_error. + (g_markup_parse_context_end_parse): Fix an + error message, noticed by Tim Janik. + +2005-02-24 Tor Lillqvist + + * glib/Makefile.am (BUILT_EXTRA_DIST): Don't distribute + glib.def. (#167496, J. Ali Harlow) + + * glib/gfileutils.c (get_contents_win32): Use g_fopen(). (#168341, + Daniel Atallah) + +2005-02-23 Matthias Clasen + + * configure.in: Don't forget to set G_THREAD_LIBS_FOR_GTHREAD + on non-linux platforms. (#168177, Michael Banck) + + * tests/keyfile-test.c (test_locale_string): Set LANGUAGE + instead of LC_ALL to shield against LANGUAGE being set in + the environment. (#168311, Suren A. Chilingaryan) + +Tue Feb 22 22:03:38 2005 Manish Singh + + * glib/gstdio.h: On G_OS_UNIX, simple #define g_open and co. as + aliases for their respective C library functions, instead of + using the function wrappers. This avoids library users having to + care about matching large file support with whatever glib has been + built with. Fixes bug #167942. + + * glib/gstdio.c + * glib/abicheck.sh + * glib/glib.symbols + * glib/makegalias.pl: Logic to make the gstdio wrappers still + available for compatibility, but not used in new code. + +Tue Feb 22 18:33:07 2005 Manish Singh + + * glib/gtimer.c (g_usleep): Simplify the loop for the fix below. + +2005-02-20 Matthias Clasen + + * glib/gqueue.c (g_queue_new): Use a memchunk for + sizeof(GQueue)-sized chunks. (#167984, Fabrício Barros Cabral) + + * glib/gtimer.c (g_usleep): Fix usage of + nanosleep(). (#163039, Bastien Nocera) + +2005-02-16 Adi Attar + + * configure.in: Added "xh" to ALL_LINGUAS. + +2005-02-11 Tor Lillqvist + + * glib/giowin32.c: Include winsock2.h before windows.h, to avoid + compilation errors with MSVC. (#167105) + +2005-02-10 Matthias Clasen + + * glib/goption.c (print_help): Take main group options into + account when calculating column size. (#166921) + (g_option_context_parse): Accept -? as documented. (#166977) + +2005-02-09 Matthias Clasen + * glib/gkeyfile.c (find_file_in_data_dirs): Don't leak path + here. (#166801, Kjartan Maraas) + +2005-02-08 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_parse_value_as_string): Don't + write out of bounds. + + * glib/goption.c (g_option_context_parse): Fix a + one-too-short memory allocation. (#166609, Nicolas Laurent) + + * tests/Makefile.am (TESTS_ENVIRONMENT): Add tests with + MALLOC_CHECK_. + + * tests/option-test.c: Add a test for unkown short options. + +2005-02-07 Matthias Clasen + + * glib/glib.symbols: + * glib/gutils.h: + * glib/gutils.c (g_listenv): New function to list all + environment variables. (#166327, Hans Petter Jansson) + +2005-02-07 Tor Lillqvist + + * glib-zip.in: Add gmodule-no-export-2.0.pc. + +Sun Feb 6 21:59:09 2005 Manish Singh + + * glib/abicheck.sh: feed the contents of config.h and glibconfig.h + into the preprocessor, since glib.symbols could need #defines + from them. + +Sun Feb 6 12:09:55 2005 Manish Singh + + * glib/gatomic.c: Don't use matching constraints for asm mem + parameters. This makes the code match with current glibc, and + quiets some warnings with gcc 3.4. + +2005-02-05 Tor Lillqvist + + * configure.in (G_LIBS_EXTRA) + * glib/giowin32.c: I think we can include and link + with -lws2_32. Only Windows 95 originally didn't have Winsock 2, + and it's available as an update for it. Not that we use any actual + Winsock 2 -only features, but still, simpler to link directly with + ws2_32.dll instead of going through wsock32.dll. + + * glib/gfileutils.c (g_file_get_contents): In the Win32 ABI + stability version, call g_file_get_contents_utf8(), not + itself. (#166386, Bill Skaggs) + +2005-02-04 Matthias Clasen + + * configure.in: Remove the --enable-ansi option (#160469) + + * configure.in: Define a HAVE_GNUC_VISIBILITY automake + conditional. + + * glib/Makefile.am (TESTS): Only check the abi if + the compiler supports visibility, otherwise we + know there will be (harmless) extra symbols. + (#166181, Ed Avis) + +2005-02-02 Tor Lillqvist + + * glib/gwin32.h: Remove unnecessary MSVC-only typedef for + pid_t. (#165910) GLib does not pretend to be a POSIX emulation + library. + + * glib/gstdio.c: In the Win32 part of all functions, handle + invalid UTF-8 more robustly. Don't pass the resulting NULL + wide-char or codepage strings on to C library functions, but bail + out early. (#166084) + + * glib/gfileutils.c: Don't use potentially incorrect errno in + several places. (#165951) + (g_mkstemp): Set errno appropriately. + +2005-02-02 Matthias Clasen + + * glib/gutils.c: Move doc comments inline. + + * glib/ghash.h: Adjust some argument names. + + * configure.in: Give meaningful names to g_memmove() + arguments. + +2005-02-01 Matthias Clasen + + * tests/keyfile-test.c (test_key_remove): Add test case for + key removal. + + * glib/gkeyfile.c (g_key_file_remove_key): Actually remove + the key from the list of pairs. (#165980, David Hoover) + + * glib/gkeyfile.c: Doc clarifications. (#165907, Vincent Untz) + + * tests/keyfile-test.c (test_group_remove): Add test case for + group removal. + + * glib/gkeyfile.c (g_key_file_remove_group): Don't segfault + if the group doesn't exist. (#165887, Mathias Hasselmann) + +2005-01-30 Matthias Clasen + + * tests/keyfile-test.c: Some more unit tests. + +2005-01-28 Christian Rose + + * configure.in: Added "tl" to ALL_LINGUAS. + +2005-01-24 Matthias Clasen + + * tests/run-markup-tests.sh: Let $srcdir default to . + + * tests/markups/fail-40.gmarkup: Add a test with a long entity + name. + + * glib/gmarkup.c (unescape_text_state_inside_entity_name): Don't + copy the entity name into a short buffer of fixed length. Instead, + compare it in place with strncmp(), and do a full strdup() in the + error path. (#165100, Simon Budig) + +2005-01-22 Tor Lillqvist + + * glib/gdate.c (g_date_set_time): Don't g_assert that localtime() + returns non-NULL. It does return NULL at least on Win32 if you + pass it a negative time_t, which although wrong, shouldn't cause + an application to abort. Instead return 2000-01-01 as a default + date. Print a warning unless G_DISABLE_CHECKS. (#164622) + +2005-01-20 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_parse_value_as_integer): Don't + interpret leading zeros as octal. The specification requires + %f parsing, and %f doesn't allow octal. + + * tests/keyfile-test.c: Add some more tests. + + * glib/gkeyfile.c (g_key_file_get_keys): Return keys in + the order found in the file, rather than the opposite. + (g_key_file_parse_value_as_string): Fix error reporting. + +2005-01-19 Matthias Clasen + + * glib/gkeyfile.c (g_key_file_parse_data): Accept \r\n as + line end. (#163030, Bastian Nocera) + (g_key_file_load_from_data): Make -1 work as a size. + + * tests/keyfile-test.c: Some unit tests for the keyfile + parser. + + * tests/Makefile.am (test_programs): Add keyfile-test. + +2005-01-19 Tor Lillqvist + + * glib/gbacktrace.c (g_on_error_stack_trace): On Win32 call + G_BREAKPOINT() if being debugged. + + * glib/gmessages.c (g_logv): For fatal messages on Win32, use + G_BREAKPOINT() also without G_ENABLE_DEBUG, but only if being + debugged. Suggestion by Ulf Lamping. + +2005-01-18 Matthias Clasen + + * glib/gqsort.c: Don't include alloca.h. It is not needed, + and does not exist on win32. (#164468, Kazuki IWAMOTO) + + * glib/gkeyfile.c (g_key_file_get_boolean_list): Fix a + sparse warning. (#164467, Kjartan Maraas) + +2005-01-17 Matthias Clasen + + * glib/gconvert.c (g_get_filename_charsets): Don't crash + if G_FILENAME_ENCODING is empty. (#164330, Pawel Sakowski) + +2005-01-15 Tor Lillqvist + + * configure.in: sh portability fix. Use "test" and not [. + (#163144, Robert Ögren) + +2005-01-13 Matthias Clasen + + * glib/gqsort.c: Sync to glibc. (#133994, Morten Welinder, + patch by Kjartan Maraas) + +2005-01-11 Owen Taylor + + * configure.in: Add gmodule-export-2.0.pc to AC_CONFIG_FILES. + + * glib/Makefile.am gobject/Makefile.am gthread/Makefile.am: + Use grep | head -n 1 instead of grep -m 1 which doesn't work + with slightly older versions of GNU grep in + install-libtool-import-lib rule. + +2005-01-11 Matthias Clasen + + * glib/gdir.c (g_dir_open): Typo fix. + +2005-01-10 Owen Taylor + + * Makefile.am (EXTRA_DIST): Add missing ChangeLog.pre* + +2005-01-09 Hans Breuer + + * glib/gfileutils.c : make it compile with mvc6 default sdk, + (#define INVALID_FILE_ATTRIBUTES, FILE_ATTRIBUTE_DEVICE) + +2005-01-09 Tor Lillqvist + + * glib/gwin32.c: Include also wchar.h for wcslen on + Cygwin. + (g_win32_error_message): Fix cast. (#163133, Roger Leigh) + + * glib/gfileutils.c: Include on Windows for + prototypes. (#163390, Kazuki Iwamoto) + +2005-01-07 Matthias Clasen + + * NEWS: Typo fixes. + + * configure.in: Bump version + + * === Released 2.6.1 === + +2005-01-07 Matthias Clasen + + * configure.in: + * Makefile.am: Generate and distribute gmodule-export-2.0.pc, + which is currently just a copy of gmodule-2.0.pc, but makes + it explicit that it adds --export-dynamic. + + * gmodule-export-2.0.pc.in: Copy of gmodule-2.0.pc.in. + +2005-01-06 Tor Lillqvist + + * glib/Makefile.am + * gobject/Makefile.am: glib.def and gobject.def are generated, not + in $(srcdir). (#163143, J. Ali Harlow) + + * configure.in + * glib/Makefile.am + * gobject/Makefile.am: Win32 cross-compilation fixes. (#163144, + J. Ali Harlow) + +2005-01-05 Matthias Clasen + + * glib/gutils.h: Simplify the inlining magic to make it + work at Oh zero. (#162990, Kalpesh Shah) + +2005-01-04 Tor Lillqvist + + * glib/guniprop.c (get_locale_type): Use g_win32_getlocale() + instead of setlocale() on Windows. setlocale() returns strings + like "Turkish_Turkey". + +2005-01-04 Matthias Clasen + + Fix the inlining magic. (#157536, Jens Hatlak, and + #149907, Morten Welinder) + + * configure.in: Define G_CAN_INLINE in glibconfig.h + + * glib/gutils.h: Streamline the inlining magic a bit, + don't use extern when implementing the non-inlined + version. + +2005-01-03 Matthias Clasen + + * glib/gutils.c (g_find_program_in_path): Don't return + directories. (#160738, Tommi Komulainen) + + * glib/gfileutils.c (g_file_get_contents): Clarify the + documentation. (#162251, Mariano Suárez-Alvarez) + +2005-01-02 Matthias Clasen + + * glib/gutils.c (g_setenv, g_unsetenv): Clarify the + docs. (#162747, Crispin Flowerday) + +2005-01-01 J. Ali Harlow + + * configure.in: Don't use AC_TRY_RUN to test for long long format + when using the MSVCRT.DLL runtime since we know the answer anyway + and it causes some mild inconvience when cross compiling. + + * README.win32: Add a reference to the cross compiling section + of the reference manual. + + * docs/reference/glib/cross.sgml: MinGW uses MSVCRT.DLL which + requires %I64i instead of %lli. (#161306) + +2005-01-01 Tor Lillqvist + + * glib/gutils.c: Make the g_getenv() ABI backward compatibility + wrapper more robust. + +2005-01-01 Tor Lillqvist + + * glib/glib.symbols + * glib/gutils.h + * glib/gutils.c: Make also g_getenv(), g_setenv(), g_unsetenv() + and g_find_program_in_path() take and return UTF-8 strings on + Win32. Implement DLL ABI backward compatility for them, too. Move + all the DLL ABI stability wrappers to the end of the file. Use + wide character API when available in inner_find_program_in_path(). + + * glib/gfileutils.c: With the UTF-8ness of g_getenv() above, just + use g_getenv() to get PATHEXT. (Yeah, it's probably overdoing it + to consider somebody actually having anything else than ASCII + in PATHEXT, but...) + +2004-12-31 Tor Lillqvist + + * glib/gfileutils.c (g_file_test): Rewrite the Win32 version to + use GetFileAttributes() instead of stat(). stat() is unreliable + for corner cases like '\\server\share' or '.\'. Part of fixing + #161797. When testing for executability, in addition to the fixed + set of executable file name extensions also check the PATHEXT + environment variable. + +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_get_current_dir): In the Win32 version, use + GetCurrentDirectory() directly for simpler buffer length + management. I don't trust getcwd() getting it right all the time. + +2004-12-30 Matthias Clasen + + * glib/gfileutils.c (g_file_test): Typo fix. + +2004-12-30 Tor Lillqvist + + * glib/gutils.c (g_path_skip_root): Require UNC paths to start + with exactly two slashes. + (g_get_current_dir): Use wide character API when available. + (g_path_get_dirname): Handle UNC paths better. Part of fix for + #161797. + +2004-12-27 Matthias Clasen + + * configure.in: Add an OS_LINUX conditional. + + * glib/Makefile.am (TESTS): Only check the ABI on + linux, since the shell script is not portable, and libtool + deficiencies may distort the ABI on other platforms. (#161741) + +2004-12-21 Matthias Clasen + + * glib/goption.c (print_entry): Don't show + the special G_OPTION_REMAINING entry. (#161934, + Matthew F. Barnes) + +2004-12-20 Tor Lillqvist + + * glib/gconvert.c (g_locale_to_utf8, g_filename_to_uri): Improve + docs. + +2004-12-20 Matthias Clasen + + * tests/option-test.c: Add some tests for '--' + stripping. + + * glib/goption.c (g_option_context_parse): Don't + strip '--' if it would be needed by a second option + parser. (#161701) + + * glib/gunicollate.c (g_utf8_collate): Make docs + more accurate. (#161683, Marcin Krzyzanowski) + +2004-12-19 Matthias Clasen + + * glib/goption.c (g_option_context_parse): Call + post-parse hooks also if argv is NULL. (#161668, + Marcin Krzyzanowski) + diff --git a/HACKING b/HACKING new file mode 100644 index 0000000..e7e2fc5 --- /dev/null +++ b/HACKING @@ -0,0 +1,34 @@ +If you want to hack on the GLib project, you'll need to have the +following packages installed: + + - GNU autoconf 2.54 + - GNU automake 1.7 + - GNU libtool 1.4 + - GNU gettext 0.10.40 + - gtk-doc + +These should be available by ftp from ftp.gnu.org or any of the +fine GNU mirrors. Beta software can be found at alpha.gnu.org. + +To compile a CVS version of glib on your system, you will need to take +several steps to setup the tree for compilation. You can do all these +steps at once by running: + + cvsroot/glib# ./autogen.sh + +Basically this does the following for you: + + cvsroot/glib# aclocal; automake; autoconf + + The above commands create the "configure" script. Now you + can run the configure script in cvsroot/glib to create all + the Makefiles. + +Before running autogen.sh or configure, make sure you have libtool +in your path. + +Note that autogen.sh runs configure for you. If you wish to pass +options like --prefix=/usr to configure you can give those options +to autogen.sh and they will be passed on to configure. + +For information about submitting patches see the README file. diff --git a/INSTALL.in b/INSTALL.in new file mode 100644 index 0000000..03c0398 --- /dev/null +++ b/INSTALL.in @@ -0,0 +1,122 @@ +Simple install procedure +======================== + + % gzip -cd glib-@GLIB_VERSION@.tar.gz | tar xvf - # unpack the sources + % cd glib-@GLIB_VERSION@ # change to the toplevel directory + % ./configure # run the `configure' script + % make # build GLIB + + [ Become root if necessary ] + % rm -rf /install-prefix/include/glib.h /install-prefix/include/gmodule.h + % make install # install GLIB + +Requirements +============ + +GLib-2.0 requires pkg-config, which is tool for tracking the +compilation flags needed for 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.) Information about pkg-config can be found at: + + http://www.freedesktop.org/software/pkgconfig/ + +GNU make (http://www.gnu.org/software/make) is also recommended. + +In order to implement conversions between character sets, +GLib requires an implementation of the standard iconv() routine. +Most modern systems will have a suitable implementation, however +many older systems lack an iconv() implementation. On such systems, +you must install the libiconv library. This can be found at: + + http://www.gnu.org/software/libiconv/ + +If your system has an iconv implementation but you want to use +libiconv instead, you can pass the --with-libiconv option to +configure. This forces libiconv to be used. + +Note that if you have libiconv installed in your default include +search path (for instance, in /usr/local/), but don't enable +it, you will get an error while compiling GLib because the +iconv.h that libiconv installs hides the system iconv. + +If you are using the native iconv implementation on Solaris +instead of libiconv, you'll need to make sure that you have +the converters between locale encodings and UTF-8 installed. +At a minimum you'll need the SUNWuiu8 package. You probably +should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and +SUNWkiu8 packages. + +The native iconv on Compaq Tru64 doesn't contain support for +UTF-8, so you'll need to use GNU libiconv instead. (When +using GNU libiconv for GLib, you'll need to use GNU libiconv +for GNU gettext as well.) This probably applies to related +operating systems as well. + +Finally, for message catalog handling, GLib requires an implementation +of gettext(). If your system doesn't provide this functionality, +you should use the libintl library from the GNU gettext package, +available from: + + http://www.gnu.org/software/gettext/ + + +Support for extended attributes and SELinux in GIO requires +libattr and libselinux. + +Some of the mimetype-related functionality in GIO requires the +update-mime-database and update-desktop-database utilities, which +are part of shared-mime-info and desktop-file-utils, respectively. + + +The Nitty-Gritty +================ + +Complete information about installing GLib can be found +in the file: + + docs/reference/glib/html/glib-building.html + +Or online at: + + http://developer.gnome.org/doc/API/2.0/glib/glib-building.html + + +Installation directories +======================== + +The location of the installed files is determined by the --prefix +and --exec-prefix options given to configure. There are also more +detailed flags to control individual directories. However, the +use of these flags is not tested. + +One particular detail to note, is that the architecture-dependent +include file glibconfig.h is installed in: + + $exec_prefix/lib/glib/include/ + +if you have a version in $prefix/include, this is out of date +and should be deleted. + +.pc files for the various libraries are installed in +$exec_prefix/lib/pkgconfig to provide information when compiling +other packages that depend on GLib. If you set PKG_CONFIG_PATH +so that it points to this directory, then you can get the +correct include flags and library flags for compiling a GLib +application with: + + pkg-config --cflags glib-2.0 + pkg-config --libs glib-2.0 + + +Cross-compiling GLib +==================== + +Information about cross-compilation of GLib can be found +in the file: + + docs/reference/glib/html/glib-cross-compiling.html + +Or online at: + + http://library.gnome.org/devel/glib/stable/glib-cross-compiling.html diff --git a/MAINTAINERS b/MAINTAINERS new file mode 100644 index 0000000..0bb46dc --- /dev/null +++ b/MAINTAINERS @@ -0,0 +1,12 @@ +Matthias Clasen +E-mail: mclasen@redhat.com +Userid: matthiasc + +Tim Janik +E-mail: timj@gtk.org +Userid: timj + +Note that a lot of people are contributing to GLib, and some parts of it +are technically maintained by others. The email addresses listed above are +meant as contacts for administrative questions such as cvs accounts. Other +questions are best directed to the mailing list gtk-devel-list@gnome.org. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..708b16b --- /dev/null +++ b/Makefile.am @@ -0,0 +1,152 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AUTOMAKE_OPTIONS = 1.7 + +SUBDIRS = . m4macros glib gmodule gthread gobject gio tests po docs +DIST_SUBDIRS = $(SUBDIRS) build + +bin_SCRIPTS = glib-gettextize + +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=g_log_domain_glib \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED \ + -DGLIB_COMPILATION + +EXTRA_DIST += \ + ChangeLog.pre-2-20 \ + ChangeLog.pre-2-18 \ + ChangeLog.pre-2-16 \ + ChangeLog.pre-2-14 \ + ChangeLog.pre-2-12 \ + ChangeLog.pre-2-10 \ + ChangeLog.pre-2-8 \ + ChangeLog.pre-2-6 \ + ChangeLog.pre-2-4 \ + ChangeLog.pre-2-2 \ + ChangeLog.pre-2-0 \ + ChangeLog.pre-1-2 \ + glib-zip.in \ + NEWS.pre-1-3 \ + acglib.m4 \ + sanity_check \ + README.commits \ + README.in \ + INSTALL.in \ + README.win32 \ + HACKING \ + MAINTAINERS \ + autogen.sh \ + Makefile.decl \ + mkinstalldirs \ + makefile.msc \ + glibconfig.h.win32.in \ + msvc_recommended_pragmas.h \ + config.h.win32.in \ + po/po2tbl.sed.in \ + glib-2.0.pc.in \ + gobject-2.0.pc.in \ + gmodule-2.0.pc.in \ + gmodule-export-2.0.pc.in \ + gmodule-no-export-2.0.pc.in \ + gthread-2.0.pc.in \ + gio-2.0.pc.in \ + gio-unix-2.0.pc.in \ + glib-2.0-uninstalled.pc.in \ + gobject-2.0-uninstalled.pc.in \ + gmodule-2.0-uninstalled.pc.in \ + gthread-2.0-uninstalled.pc.in \ + gmodule-no-export-2.0-uninstalled.pc.in \ + gio-2.0-uninstalled.pc.in \ + gio-unix-2.0-uninstalled.pc.in + + +# These may be in the builddir too +BUILT_EXTRA_DIST = \ + README \ + INSTALL \ + ChangeLog \ + glibconfig.h.win32 \ + config.h.win32 \ + gtk-doc.make + +configexecincludedir = $(libdir)/glib-2.0/include +configexecinclude_DATA = glibconfig.h + +uninstall-local: + rm -f $(DESTDIR)$(configexecincludedir)/glibconfig.h + +CONFIGURE_DEPENDENCIES = acglib.m4 + +BUILT_SOURCES = stamp-gc-h #note: not glibconfig.h +glibconfig.h: stamp-gc-h + @if test -f glibconfig.h; then :; \ + else rm -f stamp-gc-h; $(MAKE) stamp-gc-h; fi +stamp-gc-h: config.status + cd $(top_builddir) && $(SHELL) ./config.status glibconfig.h + echo timestamp > stamp-gc-h + +ChangeLog: + @echo Creating $@ + @if test -d "$(srcdir)/.git"; then \ + (GIT_DIR=$(top_srcdir)/.git ./missing --run git log GLIB_2_20_0^^.. --stat) | fmt --split-only > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ + (test -f $@ || echo git-log is required to generate this file >> $@)); \ + else \ + test -f $@ || \ + (echo A git checkout and git-log is required to generate ChangeLog >&2 && \ + echo A git checkout and git-log is required to generate this file >> $@); \ + fi + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = glib-2.0.pc gobject-2.0.pc gmodule-2.0.pc gmodule-export-2.0.pc gmodule-no-export-2.0.pc gthread-2.0.pc gio-2.0.pc + +if OS_UNIX +pkgconfig_DATA += gio-unix-2.0.pc +endif + +$(pkgconfig_DATA): config.status + +# install mkinstalldirs for glib-gettextize's benefit +gettextdir = $(datadir)/glib-2.0/gettext +gettext_SCRIPTS = mkinstalldirs + +# build documentation when doing distcheck +DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man + +DISTCLEANFILES = glibconfig-sysdefs.h glibconfig.h stamp-gc-h config.lt + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + fi + +.PHONY: files release sanity snapshot ChangeLog + +files: + @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ + echo $$p; \ + done + +release: + rm -rf .deps */.deps + cd docs && make glib.html + $(MAKE) distcheck + +sanity: + ./sanity_check $(VERSION) + +snapshot: + $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"` + +snapcheck: + $(MAKE) distcheck distdir=$(PACKAGE)-snap`date +"%Y%m%d"` + +dist-hook: $(BUILT_EXTRA_DIST) + files='$(BUILT_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 diff --git a/Makefile.decl b/Makefile.decl new file mode 100644 index 0000000..cbc0da1 --- /dev/null +++ b/Makefile.decl @@ -0,0 +1,61 @@ +# GLIB - Library of useful C routines + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +if OS_UNIX + @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} + @ for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done +endif + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..f8265b4 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,1215 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + +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@ +DIST_COMMON = README $(am__configure_deps) $(srcdir)/INSTALL.in \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/README.in $(srcdir)/config.h.in \ + $(srcdir)/config.h.win32.in \ + $(srcdir)/gio-2.0-uninstalled.pc.in $(srcdir)/gio-2.0.pc.in \ + $(srcdir)/gio-unix-2.0-uninstalled.pc.in \ + $(srcdir)/gio-unix-2.0.pc.in \ + $(srcdir)/glib-2.0-uninstalled.pc.in $(srcdir)/glib-2.0.pc.in \ + $(srcdir)/glib-gettextize.in $(srcdir)/glib-zip.in \ + $(srcdir)/glibconfig.h.win32.in \ + $(srcdir)/gmodule-2.0-uninstalled.pc.in \ + $(srcdir)/gmodule-2.0.pc.in $(srcdir)/gmodule-export-2.0.pc.in \ + $(srcdir)/gmodule-no-export-2.0-uninstalled.pc.in \ + $(srcdir)/gmodule-no-export-2.0.pc.in \ + $(srcdir)/gobject-2.0-uninstalled.pc.in \ + $(srcdir)/gobject-2.0.pc.in \ + $(srcdir)/gthread-2.0-uninstalled.pc.in \ + $(srcdir)/gthread-2.0.pc.in $(top_srcdir)/Makefile.decl \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + compile config.guess config.sub depcomp install-sh ltmain.sh \ + missing mkinstalldirs +@OS_UNIX_TRUE@am__append_1 = gio-unix-2.0.pc +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +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 = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = glib-2.0.pc glib-2.0-uninstalled.pc \ + gmodule-2.0.pc gmodule-export-2.0.pc gmodule-no-export-2.0.pc \ + gmodule-2.0-uninstalled.pc \ + gmodule-no-export-2.0-uninstalled.pc gthread-2.0.pc \ + gthread-2.0-uninstalled.pc gobject-2.0.pc \ + gobject-2.0-uninstalled.pc gio-2.0.pc gio-unix-2.0.pc \ + gio-2.0-uninstalled.pc gio-unix-2.0-uninstalled.pc glib-zip \ + glib-gettextize INSTALL README config.h.win32 \ + glibconfig.h.win32 +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__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gettextdir)" \ + "$(DESTDIR)$(configexecincludedir)" \ + "$(DESTDIR)$(pkgconfigdir)" +SCRIPTS = $(bin_SCRIPTS) $(gettext_SCRIPTS) +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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 +DATA = $(configexecinclude_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 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +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" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = ChangeLog.pre-2-20 ChangeLog.pre-2-18 ChangeLog.pre-2-16 \ + ChangeLog.pre-2-14 ChangeLog.pre-2-12 ChangeLog.pre-2-10 \ + ChangeLog.pre-2-8 ChangeLog.pre-2-6 ChangeLog.pre-2-4 \ + ChangeLog.pre-2-2 ChangeLog.pre-2-0 ChangeLog.pre-1-2 \ + glib-zip.in NEWS.pre-1-3 acglib.m4 sanity_check README.commits \ + README.in INSTALL.in README.win32 HACKING MAINTAINERS \ + autogen.sh Makefile.decl mkinstalldirs makefile.msc \ + glibconfig.h.win32.in msvc_recommended_pragmas.h \ + config.h.win32.in po/po2tbl.sed.in glib-2.0.pc.in \ + gobject-2.0.pc.in gmodule-2.0.pc.in gmodule-export-2.0.pc.in \ + gmodule-no-export-2.0.pc.in gthread-2.0.pc.in gio-2.0.pc.in \ + gio-unix-2.0.pc.in glib-2.0-uninstalled.pc.in \ + gobject-2.0-uninstalled.pc.in gmodule-2.0-uninstalled.pc.in \ + gthread-2.0-uninstalled.pc.in \ + gmodule-no-export-2.0-uninstalled.pc.in \ + gio-2.0-uninstalled.pc.in gio-unix-2.0-uninstalled.pc.in +TEST_PROGS = +AUTOMAKE_OPTIONS = 1.7 +SUBDIRS = . m4macros glib gmodule gthread gobject gio tests po docs +DIST_SUBDIRS = $(SUBDIRS) build +bin_SCRIPTS = glib-gettextize +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=g_log_domain_glib \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED \ + -DGLIB_COMPILATION + + +# These may be in the builddir too +BUILT_EXTRA_DIST = \ + README \ + INSTALL \ + ChangeLog \ + glibconfig.h.win32 \ + config.h.win32 \ + gtk-doc.make + +configexecincludedir = $(libdir)/glib-2.0/include +configexecinclude_DATA = glibconfig.h +CONFIGURE_DEPENDENCIES = acglib.m4 +BUILT_SOURCES = stamp-gc-h #note: not glibconfig.h +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = glib-2.0.pc gobject-2.0.pc gmodule-2.0.pc \ + gmodule-export-2.0.pc gmodule-no-export-2.0.pc gthread-2.0.pc \ + gio-2.0.pc $(am__append_1) + +# install mkinstalldirs for glib-gettextize's benefit +gettextdir = $(datadir)/glib-2.0/gettext +gettext_SCRIPTS = mkinstalldirs + +# build documentation when doing distcheck +DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man +DISTCLEANFILES = glibconfig-sysdefs.h glibconfig.h stamp-gc-h config.lt +all: $(BUILT_SOURCES) config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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; \ + $(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 +glib-2.0.pc: $(top_builddir)/config.status $(srcdir)/glib-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +glib-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/glib-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gmodule-2.0.pc: $(top_builddir)/config.status $(srcdir)/gmodule-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gmodule-export-2.0.pc: $(top_builddir)/config.status $(srcdir)/gmodule-export-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gmodule-no-export-2.0.pc: $(top_builddir)/config.status $(srcdir)/gmodule-no-export-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gmodule-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gmodule-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gmodule-no-export-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gmodule-no-export-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gthread-2.0.pc: $(top_builddir)/config.status $(srcdir)/gthread-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gthread-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gthread-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gobject-2.0.pc: $(top_builddir)/config.status $(srcdir)/gobject-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gobject-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gobject-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gio-2.0.pc: $(top_builddir)/config.status $(srcdir)/gio-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gio-unix-2.0.pc: $(top_builddir)/config.status $(srcdir)/gio-unix-2.0.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gio-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gio-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gio-unix-2.0-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gio-unix-2.0-uninstalled.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +glib-zip: $(top_builddir)/config.status $(srcdir)/glib-zip.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +glib-gettextize: $(top_builddir)/config.status $(srcdir)/glib-gettextize.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +INSTALL: $(top_builddir)/config.status $(srcdir)/INSTALL.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +README: $(top_builddir)/config.status $(srcdir)/README.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +config.h.win32: $(top_builddir)/config.status $(srcdir)/config.h.win32.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +glibconfig.h.win32: $(top_builddir)/config.status $(srcdir)/glibconfig.h.win32.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files +install-gettextSCRIPTS: $(gettext_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(gettextdir)" || $(MKDIR_P) "$(DESTDIR)$(gettextdir)" + @list='$(gettext_SCRIPTS)'; test -n "$(gettextdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(gettextdir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(gettextdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-gettextSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(gettext_SCRIPTS)'; test -n "$(gettextdir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(gettextdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gettextdir)" && rm -f $$files + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-configexecincludeDATA: $(configexecinclude_DATA) + @$(NORMAL_INSTALL) + test -z "$(configexecincludedir)" || $(MKDIR_P) "$(DESTDIR)$(configexecincludedir)" + @list='$(configexecinclude_DATA)'; test -n "$(configexecincludedir)" || 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)$(configexecincludedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(configexecincludedir)" || exit $$?; \ + done + +uninstall-configexecincludeDATA: + @$(NORMAL_UNINSTALL) + @list='$(configexecinclude_DATA)'; test -n "$(configexecincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(configexecincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(configexecincludedir)" && rm -f $$files +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|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files + +# 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 -9 -c >$(distdir).tar.bz2 + $(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 -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) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + 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.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" \ + $(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: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { 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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(SCRIPTS) $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gettextdir)" "$(DESTDIR)$(configexecincludedir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +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-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-gettextSCRIPTS install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binSCRIPTS install-configexecincludeDATA + +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-binSCRIPTS uninstall-configexecincludeDATA \ + uninstall-gettextSCRIPTS uninstall-local \ + uninstall-pkgconfigDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + check-am ctags-recursive install install-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am check-local clean \ + clean-generic clean-libtool ctags ctags-recursive dist \ + dist-all dist-bzip2 dist-gzip dist-hook dist-lzma dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-local distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS \ + install-configexecincludeDATA install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-gettextSCRIPTS 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-binSCRIPTS uninstall-configexecincludeDATA \ + uninstall-gettextSCRIPTS uninstall-local \ + uninstall-pkgconfigDATA + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +uninstall-local: + rm -f $(DESTDIR)$(configexecincludedir)/glibconfig.h +glibconfig.h: stamp-gc-h + @if test -f glibconfig.h; then :; \ + else rm -f stamp-gc-h; $(MAKE) stamp-gc-h; fi +stamp-gc-h: config.status + cd $(top_builddir) && $(SHELL) ./config.status glibconfig.h + echo timestamp > stamp-gc-h + +ChangeLog: + @echo Creating $@ + @if test -d "$(srcdir)/.git"; then \ + (GIT_DIR=$(top_srcdir)/.git ./missing --run git log GLIB_2_20_0^^.. --stat) | fmt --split-only > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ + (test -f $@ || echo git-log is required to generate this file >> $@)); \ + else \ + test -f $@ || \ + (echo A git checkout and git-log is required to generate ChangeLog >&2 && \ + echo A git checkout and git-log is required to generate this file >> $@); \ + fi + +$(pkgconfig_DATA): config.status + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + fi + +.PHONY: files release sanity snapshot ChangeLog + +files: + @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ + echo $$p; \ + done + +release: + rm -rf .deps */.deps + cd docs && make glib.html + $(MAKE) distcheck + +sanity: + ./sanity_check $(VERSION) + +snapshot: + $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"` + +snapcheck: + $(MAKE) distcheck distdir=$(PACKAGE)-snap`date +"%Y%m%d"` + +dist-hook: $(BUILT_EXTRA_DIST) + files='$(BUILT_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 + +# 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..ad9d10a --- /dev/null +++ b/NEWS @@ -0,0 +1,3694 @@ +Overview of Changes from GLib 2.23.6 to GLib 2.24.0 +=================================================== + +* Bug fixes: + 613601 buglet in dup_close_on_exec_fd + 584284 g_data_input_stream_read_until_async behaves confusingly + 613748 Write errors in middle of copy cause hang + 613923 splice_stream_with_progress: wrong error handling + 613667 Typo in GObject documentation + 613618 gvariant format string docs unclear + +* Translation updates: + Basque + Ukrainian + Vietnamese + + +Overview of Changes from GLib 2.23.5 to GLib 2.23.6 +=================================================== + +* Class private data: + - support for private data associated with a GTypeClass + +* GVariant merge is now complete: + - loading functions and parser merged + +* Windows improvements: + - socket fixes + - various build improvements + - removal of GCC/C99isms in favour of portable code + - drop unmaintained Visual Studio 8 support + +* Minor API addition: + - g_desktop_app_info_get_filename() + +* Bugs fixed: + 521707 Class private data + 612502 build fails on glib/tests/gvariant.c + 612832 [GDesktopAppInfo] New function g_desktop_app_info_get_filename + 612702 [PATCH] Fix GSocket-related crash on Windows + 612736 Improve the documentation about single include + 610858 gvariant test fails sometimes + 612327 uninitialized variable + +* New translations: + Afrikaans + LowGerman + +* Updated translations: + Czech + Finnish + Galician + Greek + Punjabi + Romanian + Serbian + + +Overview of Changes from GLib 2.23.4 to GLib 2.23.5 +=================================================== + +* New API addition: g_malloc_n() and friends used to implement an + overflow-safe family of g_new() macros. + +* GVariant: + - GVariantBuilder and GVariantIter are now merged. + - The variable arguments API is now merged. + - The parser will be in a future release. + +* GIO: + - Remove GUtf8InputStream (which never appeared in a stable release) + for now since it doesn't satisfy the needs of its main intended use + case. We hope to reimplement this feature in a better form in a + future release. + +* Bugs fixed: + 609531 missing licence headers + 612107 Missing G_FILE_ATTRIBUTE_TRASH_ORIG_PATH + 611897 g_io_modules_scan_all_in_directory leaks + 608196 Overflow-safe g_new family + 611696 gio uses GetAddrInfo which requires special handing on windows 2k + 605667 Don't use G_PARAM_SPEC_VALUE_TYPE when we know the pspec is valid + 610860 test_g_file_open_readwrite fails if $HOME is unwritable + 552912 glib-2.18 /live-g-file/test_copy_move failed when run as root + 609813 Renaming a file discards file notes + +* Updated translations: + Basque + Brazilian Portuguese + British English + Bulgarian + Catalan + Danish + Estonian + French + German + Hungarian + Italian + Lithuanian + Norwegian bokmÃ¥l + Portuguese + Russian + Slovenian + Spanish + Swedish + Traditional Chinese + + +Overview of Changes from GLib 2.23.3 to GLib 2.23.4 +=================================================== + +* GVariant: The core of GVariant has been merged now, with some + API still to follow. + +* GIO: + - There is a new interface GFileDescriptorBased for file descriptor + based IO. GLocalFile{Input,Output}Stream implement it + - Use splice(2) to transfer data between file descriptors without + extraneous copies + - Add a way to request move events from file monitors + +* Bugs fixed: + 609143 *result_uncertain is never assigned in g_content_type_guess + 604086 Use splice(2) when doing local file copies + 547890 No move events for GFileMonitorEvent? + 568760 nautilus freezes due to a bug in garray.c:322 + 609962 Add info about the use of G_DEFINE_INTERFACE + 609564 g_base64_encode_close docs should mention outbuf size... + 610484 g_variant_equal bug + 610131 libasyncns does not compile on Solaris 8 + 609530 missing single header include guards + +* Updated translations: + Czech + Estonian + Galician + German + Korean + Polish + Slovenian + Spanish + Traditional Chinese + + +Overview of Changes from GLib 2.23.2 to GLib 2.23.3 +=================================================== + +* GLib now has a facility for locks that consume only one bit of + storage inside an integer: g_bit_lock() + +* GVariant: The serializer has been merged, with more API to follow + +* Bugs fixed + 548967 1 bit mutex lock + 604967 2.22.3 libasyncns build fails on HP-UX 11.11 + 608602 G_VALUE_COLLECT_INIT variables shadow those in G_VALUE_COLLECT + 608743 Crash in g_hostname_to_ascii visiting certain website in epiphany + 599197 array ref and unref functions crash on NULL array. + 608159 mem leak in g_io_modules_scan_all_in_directory + +* Translation updates + Brazilian Portuguese + Czech + French + Norwegian bokmÃ¥l + Slovenian + Spanish + Thai + + +Overview of Changes from GLib 2.23.1 to GLib 2.23.2 +=================================================== + +* We are now using gcc builtins for atomic operations when available + +* g_assert() grew the ability to store assertions in core dumps + +* GIO supports lazy loading of GIO modules, and there is a new + gio-querymodule utility that goes along with this. + Packagers will need to adapt to this. + +* Threading changes: + - The requirements for g_thread_init() have been relaxed slightly, + it can be called multiple times, and does not have to be the first + call. + - GObject now links to GThread and threads are enabled automatically + when g_type_init() is called. + - Thread-safety issues with boxed types in GObject have been fixed. + +* GObject: + - Another bunch of performance work has landed + +* GVariant: + - GVariantType has been merged, with the rest of the GVariant + API to follow. + +* Bugs fixed: + 568760 nautilus freezes due to a bug in garray.c:322 + 602417 Document lifecycles of GSimpleAsyncResult and friends + 604824 crash in Epiphany: Selecting my Slashdot bo... + 448888 don't init g_slice for always-malloc + 531902 Use GCC atomic buildins for g_atomic* + 554887 boxed type registration is not thread safe + 586150 unresolved symbols when building glib 2.21.2 on OS X Tiger + 589176 row gvalue transform array exponentially + 594872 Support storing assertion messages into core dump + 602240 Upgrade libasyncns to 0.8 + 603590 Speed up G_VALUE_COLLECT + 604457 gutf8inputstream.c: increasing unknown size pointer + 605686 GCharsetConverter doesn't flush + 605733 g_memory_output_stream_new violates GObject standards + 605883 g_object_new() processes varargs even when there are none + 605977 invalid utf-8 conversion in g_local_file_get_parse_name(... + 606775 Enable threads by default in gobject + +* Translation updates: + Asturian + Basque + Bengali + Bulgarian + Estonian + Norwegian bokmÃ¥l + Spanish + Thai + Ukrainian + + +Overview of Changes from GLib 2.23.0 to GLib 2.23.1 +=================================================== + +* GObject performance work has landed: + - Construction of simple objects is much faster + - Interface lookup is lock-free and constant-time now + - Reduced locking overhead when dealing with types + +* GType now has a G_DEFINE_INTERFACE convenience macro + +* GIO gained GUtf8InputStream, an input stream that + performs utf-8 validation + +* GLib now has byte-swap macros for gsize and gssize + +* Bugs fixed: +557151 Determining the newly_constructed boolean in gobject.c... +557100 Performance improvements for GObjectClasses that don't... +501166 Warning message says IA__g_type_init instead of g_type_init +585375 Performance and Contention problems with g_type_class_ref... +587892 Race in GType when instantiating the same class for the... +603270 Input Stream validating utf8 +603476 gioenums.h:62: error: comma at end of enumerator list +603540 g_time_val_from_iso8601 uses uninitialised variable +603982 Stack overflow when reading file async with filter +604645 G_DEFINE_INTERFACE_* documentation is not generated +604875 Use of sa_len conflicts with system header +320482 provide G_DEFINE_TYPE like macros for interfaces + +* Updated translations: + Estonian + Hebrew + Norwegian bokmÃ¥l + Vietnamese + Welsh + + +Overview of Changes from GLib 2.22.x to GLib 2.23.0 +=================================================== + +* GIO: + - GConverter: a generic interface for stateful conversions of data, + suitable for charset conversion, compression, decompression, regexp + replacement. Concrete implementations are GCharsetConverter, + GZlibCompressor and GZlibDecompressor. GConverterInputStream, + GConverterOutputStream are stream implementations that convert data + while loading or saving it. + - GMounts can now have a 'default location': a path that reflects + the main entry point for the user (e.g. the home directory). + - As a consequence of the compression support, GIO depends on zlib now. + +* GObject: + - G_IMPLEMENT_INTERFACE_DYNAMIC: a convenience macro for adding + interfaces to dynamic types. + +* GModule: + - The -pthread flag has been added to all gmodule .pc files, because + it is not generally permissible to load modules that are linked + against libpthread if the program has not been compiled with threading + support. + +* Bugs fixed: + 601637 GUnixFDMessage should contain a GUnixFDList + 585566 GSocketListener API issues + 572252 Bug in g_file_test() function. + 600550 g_app_info_create_from_commandline doesn't treat arguments properly + 541236 not detecting exact content type + 350200 [PATCH] GTypeModule derived class unref does not unload plugin + 589631 Please enclose literal values with double quotes + 577711 cross compile check for g++ broken + 600620 Support X-GNOME-FullName in GAppInfo + 598899 GWin32DirectoryMonitor is broken + 593809 Nautilus does not restore the position of the icons on the desktop... + 563627 g_get_prgname() threadsafety + 600141 Add -pthread to gmodule pkg-config + 593856 file and directory monitors don't work when glib is compiled... + 324930 Nautilus should disallow copying of symlink to FAT drive early + 587300 Deadlock when calling g_cancellable_disconnect in a... + 595138 GFile not robust with invalid input + 591216 Warning building resolver.o + 590016 Does not compile under MinGW32 + Wine + 591214 Warnings building gcancellable.o + 561998 Have specific entry points (paths) for mounts... + 508157 Add G_IMPLEMENT_INTERFACE_DYNAMIC + 535159 g_file_has_parent + +* Updated translations: + Brazilian Portuguese + Catalan + Estonian + Galician + Norwegian bokmÃ¥l + Shavian + Slovenian + Spanish + Swedish + + +Overview of Changes from GLib 2.22.1 to GLib 2.22.2 +=================================================== + +* GIO: + - Support case-sensitive globs in the shared mime database, + including support for the newer cache format that allows these. + Case-sensitive globs have been introduced in shared-mime-info + version 0.70 + +* GObject: + - Speed up creation of simple objects + +* Bugs fixed: + 597194 Typo in _G_TYPE_CVH macro + +* Updated translations: + Russian + + +Overview of Changes from GLib 2.22.0 to GLib 2.22.1 +=================================================== + +* Bugs fixed: + 596064 Test file marked for translation + 595972 possibly invalid search in mime_info_cache_dir_add_... + 596561 C99 style of declaration of variable in gmessages.c + 596314 g_utf16_to_utf8 returns an invalid UTF8 string + 596748 g_async_result_get_source_object returns a new ref + 593809 Nautilus does not restore the position of the icons... + 593775 uses inotify_init1 unconditionally + +* Updated translations: + Bengali + Hebrew + + +Overview of Changes from GLib 2.21.6 to GLib 2.22.0 +=================================================== + +* Add gdb python macros to make gobject debugging more pleasant + +* Bugs fixed: + 579050 Allow making selected critical and warning messages non-fatal + 594759 g_socket_send_message fails due to invalid sendmsg params + 593941 GNetworkAddress skipping addresses when enumerating + 594597 Fix build with srcdir != builddir + 595619 Include gdb pretty printers + +* Changes that might affect bindings: + - The error parameter of g_simple_async_result_set_from_error has been + made const. + +* Updated translations: + Assamese + Bengali India + British English + Bulgarian + Catalan + Czech + Danish + Finnish + Galician + Greek + Gujarati + Hindi + Japanese + Kannada + Malayalam + Marathi + Norwegian bokmÃ¥l + Oriya + Polish + Punjabi + Romanian + Serbian + Simplified Chinese + Slovenian + Spanish + Tamil + Telugu + Thai + Traditional Chinese + Ukrainian + Vietnamese + + +Overview of Changes from GLib 2.21.5 to GLib 2.21.6 +=================================================== + +* Minor API additions: + g_mkstemp_full is a variant of g_mkstemp that allows to specify flags + and permissions + +* Bugs fixed: + 593232 g_rand_new: read no more than requested from /dev/urandom + 591995 use saved errno + 589491 g_time_val_from_iso8601 doesn't handle some cases + 593406 Permissions set to 777 after copying via Nautilus + 594034 Add g_mkstemp_full() + +* Updated translations: + Assamese + Basque + Brazilian Portuguese + Czech + Estonian + French + German + Hungarian + Italian + Kannada + Malayalam + Marathi + Norwegian bokmÃ¥l + Oriya + Portuguese + Swedish + Tamil + Turkish + + +Overview of Changes from GLib 2.21.4 to GLib 2.21.5 +=================================================== + +* A performance problem with trashing of many files has been fixed + +* GResolver now invalidates the libc resolv.conf cache as needed + +* Minor api additions: + - g_cancellable_make_pollfd returns a boolean now. And there is a + new function g_cancellable_release_fd that can be used to released + the resources used by a GCancellable. + +* Bugs fixed: + 589988 Compilation error on Solaris 9 (missing stdint.h) + 588901 gtcpconnection.c won't compile + 584246 GResolver needs to call res_init() when network state changes + 591714 Figure out failure handling for g_cancellable_make_pollfd() + 591532 redundent '/' returned from g_file_resolve_relative_path + 591378 Use MSG_NOSIGNAL in GSocket if it's available + 589649 API documentation migration for Base64 Encoding + 591840 configure fails with autoconf 2.64 + +* Updated translations: + Basque + Brazilian Portuguese + Bulgarian + Danish + Estonian + Finnish + Galician + Gujarati + Hndi + Irish + Japanese + Korean + Norwegian bokmÃ¥l + Polish + Portuguese + Punjabi + Spanish + Swedish + Telugu + Traditional Chinese + Thai + + +Overview of Changes from GLib 2.21.3 to GLib 2.21.4 +=================================================== + +* GTree is now refcounted + +* Bugs fixed: + 587938 Undocumented limitation for g_str_equal + 587773 refcounts for GTree + +* Updated translations: + French + Hebrew + Norwegian bokmÃ¥l + Spanish + Swedish + Traditional Chinese + Ukrainian + + +Overview of Changes from GLib 2.21.2 to GLib 2.21.3 +=================================================== + +* GMappedFile is refcounted now + +* Mainloop: It is now possible to set per-thread default contexts, + with g_main_context_push_thread_default. + +* glib-mkenums supports a @basename@ substitution, in addition + to @filename@. + +* GIO: + - Vfs implementations can support storing of per-file metadata. + - GCancellable can now be subclassed. + - Unmount and eject methods now optionally allow interaction, via + variants that take a GMountOperation object. + +* Bugs fixed: + 556706 Inconsistent help arguments -h, -? + 579449 FileChoosers no longer work if an idle handler is active + 579933 mainloop FD_CLOEXEC has a race condition + 579984 alternate GMainContext support + 585937 gio/gsocket.c (glib 2.21.2) does not compile (Windows/mingw) + 586675 Runtime library location + 586797 Add GCancellables to GSocket ops + 586868 g_filename_complete_get_completions doesn't always return... + 587415 g_resolver_lookup_by_name_finish returns a freed list + 587434 regression tests fail, at least on x86_64 + 586928 Avoid g++ warning in g_error() + +* Updated translations: + Estonian + Hebrew + + +Overview of Changes from GLib 2.21.1 to GLib 2.21.2 +=================================================== + +* GIO: + - g_socket_speaks_ipv4 is a new function to check if a socket can + speak IPv4. + - g_socket_listener_add_address gained a new effective_address out + parameter. + - GIO now returns special icons for XDG user directories, by the + name folder-music, folder-documents, etc. + - GIO gained support for starting/stopping of drives, which can be used + in connection with external hard disk enclosures, disk arrays, iSCSI + devices, etc. See g_file_start/stop_mountable. + +* GLib: + - g_reload_user_special_dirs_cache is a new function to force GLib to + reload the XDG user directory mapping from disk. + +* Bug fixes: + 584574 glib compile failure on Mac OS X with gunixresolver.c and... + 585566 GSocketListener API issues + 584255 Incorrect freeing of thread pool in GThreadedSocketService + 585088 g_string_chunk_insert_len stops at nul bytes + 585360 Monitor fontconfig configuration files using gio causes m... + 580103 Terminal starts on Display :0.0 when started on :0.1 in D... + 580301 network: a few issues on old darwin + 583398 SRV weight sorting is incorrect + 584176 build fixes on FreeBSD + 585189 g_cancellable_reset() must be called in same thread as g_... + 585280 compilation dies on gio/gsocket.c, needs sys/uio.h to con... + 585281 gio/gunixfdmessage.c needs sys/types.h for platforms that... + 585478 don't leak the inotify fd + 585575 g_socket_listener_add_inet_port() doesn't do the right thing + 585599 g_socket_listener_add_socket() consumes the socket + 585676 GEmblem doesn't reference its 'icon' if that is set as a ... + 585717 "bytes" nautilus translation to french is not shown in th... + 541276 XDG directories should have their own icons + 585726 Grammatical error in GList documentation + 585520 Wrong warning option in documentation + 585673 GNOME Goal: Remove deprecated glib symbols + 585591 Starting/stopping drives + +* Updated translations: + Bengali India + Norwegian bokmÃ¥l + + +Overview of Changes from GLib 2.21.0 to GLib 2.21.1 +=================================================== + +* GIO: + - Support for network IO has been added, including a low-level + socket API and a high-level API for network connections and + services. + - Support for read-write access with GIOStream and its subclasses. + - GMount gained a pre-unmount signal. + +* Bug fixes: + 576104Implement GMount::pre-unmount + 578769 implement GWinHttpFileInputStream::close_fn + 582856 gsocket.c doesn't compile on Solaris + 569375 g[u]intptr undocumented + 573246 [FIX] g_desktop_app_info_dup() can access NULL pointer + 575013 g_cancellable_push_current() does not allow NULL + 577884 live-g-file.c:461: error: format ‘%d’ expects type ... + 578499 g_output_stream_splice and stream closing with gnio strea... + 579558 Application employing gvfs crashes with only libgvfscommo... + 583001 SIGPIPE (grr!) + 583061 Please add convenience function to connect to machines by... + 583198 typo in error message + 583206 use g_set_error_literal where appropriate + 583229 void function g_async_initable_init_async returns value + 583324 locking problem in g_main_context_iterate() + 583408 void function g_socket_control_message_serialize returns ... + 578786 wrong and confusing error message + 583205 g_inet_address_to_bytes has no length outparam + 583196 mem leak in keyfile test + 583663 GSocketType enum ends with a comma + 569024 Make g_error_new_valist public + 569376 missing G_G[U]INTPTR_FORMAT + 580347 off-by-1 bug in GWinHttpFile + +* Updated translations: + Oriya + Spanish + Valencian-Catalan + + +Overview of Changes from GLib 2.20.x to GLib 2.21.0 +=================================================== + +* GIO: + - New helper functions g_cancellable_connect/disconnect to avoid + race conditions when connecting to the "cancelled" signal on + GCancellable. + - New types and methods for dealing with IPv4 and IPv6 addresses (and + UNIX domain socket addresses under UNIX). This does not include code + for actual socket I/O. + - GResolver provides asynchronous and cancellable APIs for resolving + hostnames, reverse lookup of IP addresses and resolving SRV records. + +* Glib now provides hash and comparison functions for int64 and double + types, suitable for use with GHashTable. + +* GArray, GPtrArray and GByteArray can be ref counted now, and have + boxed types. + +* Bugs fixed: + 572844 Helper for GCancellable::cancelled connect/disconnect + 578363 goption docs should be improved + 548466 async/cancellable DNS resolver + 579830 param spec strings should use P_() + 579862 requesting xattr::foo ends up calling getxattr(..., user... + 580453 Hash and equal functions for gint64 and gdouble + 580450 Reference counting and boxed types for arrays + 580194 gresolver doesn't build on Solaris + 580301 network: a few issues on old darwin + 580299 network: include sys/types.h before sys/socket.h to insur... + 572508 gmarkup speedup + 580546 g_strtoull() referenced in documentation... + 580656 g_key_file_set_string_list erroneously asserts list != NULL + 579272 leaks in g_simple_async_result_set_op_res_gpointer + + +* Updated translations: + Catalan (ca) + Pashto (ps) + Spanish (es) + + +Overview of Changes from GLib 2.20.0 to GLib 2.20.1 +=================================================== + +* Bug fixes: + 575555 Use fsync() when replacing files to avoid data loss on + 575708 runaway inotify madness + 575270 GVolumeMonitor::mount-pre-unmount not being emitted + 577128 glib make check Failed to execute child process... + 573673 Always show "backup" directories + 578369 g_time_val_from_iso8601() parses timezones incorrectly + 578002 Fix a small typo in GFile docs + 578017 G_DEFINE_TYPE_EXTENDED docs + +* Updated translations: + Arabic + Assamese + Basque + Bularian + Brazilian Portuguese + British English + Catalan + Danish + French + Galician + German + Greek + Hungarian + Italian + Japanese + Kannada + Lithuanian + Malayalam + Norwegian bokmÃ¥l + Oriya + Polish + Punjabi + Russian + Simplified Chinese + Slovenian + Spanish + Swedish + Tamil + + +Overview of Changes from GLib 2.19.9 to GLib 2.20.0 +=================================================== + +* Base64 support: Avoid integer overflows. CVE-2008-4316 + +* Bugs fixed: + 574019 GChecksum: document and guarantee hex characters in lower case + 573454 Unable copy/move files to directories symlinked to gvfs share + 561172 gnome-open fails on local URIs with anchors + 573970 crash in gunixvolumemonitor:update_mounts when unmounting + 573843 g_get_current_dir returns non-absolute path + +* Updated translations: + Assamese (as) + Bengali (bn_IN) + Czech (cs) + Hindi (hi) + Italian (it) + Japanese (ja) + Lithuanian (lt) + Malayalam (ml) + Marathi (mr) + Oriya (or) + Polish (pl) + Romanian (ro) + Telugu (te) + + +Overview of Changes from GLib 2.19.8 to GLib 2.19.9 +=================================================== + +* GMarkup: + - Considerable speedup + +* GIO + - Add G_FILE_CREATE_REPLACE_DESTINATION flag to allow replacing + the destination of a copying operation as if it did not exit before. + - Be more careful when classifying files as desktop files + - Support desktop file key X-GIO-NoFuse which disables the use + of fuse pathnames for %u and %U arguments + +* Bugs fixed: + 572672 glib/gthread.c: argument is different type + 572464 Doc for g_file_get_contents + 572151 “it's” and “its” confused in docs and comments + 570501 g_win32_get_system_data_dirs uses invalid conversion... + 167569 g_string_append_printf crashes on win32 when used... + 572508 gmarkup speedup + 560564 Replacing a symlink with its linked file truncates... + 549298 impossible to copy files with p (pipe) flag + 543183 Clarify docs for g_file_has_prefix + 540461 g_memory_output_stream_get_data_size() doesn't behave... + 573462 GEmblemedIcon leak + 573421 Clarify message format in GMountOperation + 573658 Deadlock in giomodule.c + 556706 Inconsistent help arguments -h, -? + 573527 Wrong shell to run config.status in Makefile.in.in + 573128 A couple of typos in GObject documentation + +* Updated translations: + Catalan (ca) + British English (en_GB) + Spanish (es) + Basque (eu) + Finnish (fi) + French (fr) + Gujarati (gu) + Hebrew (he) + Hungarian (hu) + Korean (ko) + Maithili (mai) + Norwegian bokmÃ¥l (nb) + Dutch (nl) + Portugese (pt) + Swedish (sv) + Thai (th) + Traditional Chinese (zh_HK) + Traditional Chinese (zh_TW) + + +Overview of Changes from GLib 2.19.7 to GLib 2.19.8 +=================================================== + +* GIO: Fix missing exports of new API + +* Fix strict aliasing warnings and violations to make Glib work + with gcc 4.4 + + +Overview of Changes from GLib 2.19.6 to GLib 2.19.7 +=================================================== + +* GIO + - GFile gained an attribute for the actual file size in bytes + - GMountOperation gained an "aborted' signal that allows to abort + a mount operation from the backend side + +* Bugs fixed: + 523742 Use noinst for non-installable libraries + 566747 URIs opened with firefox %u load as local files + 541225 Can't compile gio on AIX duplicate case value in gioerror.c + 571598 GAsyncResult with NULL gobject + 505042 add file attribute for actually used file size in bytes + +* Updates translations: + Basque (eu) + Gujarati (gu) + Italian (it) + Japanese (ja) + Norwegian bokmÃ¥l (nb) + Dutch (nl) + Portugese (pt) + Thai (th) + Vietnamese (vi) + + +Overview of Changes from GLib 2.19.5 to GLib 2.19.6 +=================================================== + +* New format macro to print goffset data: G_OFFSET_FORMAT + +* GIO: + - Add a GFilter{Input,Output}Stream::close-base-stream properties which + determine whether the base stream will be closed when the filter stream + is finalized. + - g_data_input_stream_read_line and ..._read_until have asynchronous + variants now. + +* Bugs fixed: + 568294 A wrong reference in the description of g_bookmark_file_... + 563141 RFE: define G_OFFSET_FORMAT + 569105 g_time_val_to_iso8601() assumes time_t==long + 568394 dropping the last reference to a stream filter closes... + 568741 g_buffered_input_stream_fill_async doesn't work + 568723 g_buffered_input_stream_fill_async doesn't take count == -1 + 568575 _async functions for GDataInputStream + +* Updated translations: + Bulgarian (bg) + Finnish (fi) + Hungarian (hu) + Oriya (or) + Swedish (sv) + Traditional Chinese (zh_HK) + Traditional Chinese (zy_TW) + + +Overview of Changes from GLib 2.19.4 to GLib 2.19.5 +=================================================== + +* Update included PCRE to 7.8 + +* g_base64_decode_inplace: New function to do base64 decoding in place + +* Bugs fixed: + 567138 get_package_directory_from_module() does not free ... + 566569 gregex docs clarification + 566573 g_match_info_fetch_pos docs + 564728 Add function to decode base64 encoded data in place + 567838 G_STRUCT_OFFSETOF fails to compile under icc 9.1 + 567977 textdomain() macro should not return NULL ... + 512779 --disable-regex breaks compilation + 566770 error code 0 for Too many open files is useless + 565484 g_content_type_guess passes non-UTF8 text to XDG ... + +* Updated translations: + Catalan (ca) + Spanish (es) + Italian (it) + Swedish (sv) + + +Overview of Changes from GLib 2.19.3 to GLib 2.19.4 +=================================================== + +* GIO: + - Use O_NOATIME when sniffing mimetypes + - Add a convenience method to check if a GSimpleAsyncResult + is valid + +* Bugs fixed: + 560676 function access for g_threads_supported + 565905 There is no g_context_group_set_translation_domain + 564210 SUN Studio 12 has supported visibility attribute + 565136 GObject's "notify" signal parameters are wrong in gtk-doc + 565831 error in interface creation sample + 566348 g_file_open_tmp uses the wrong g_mkstemp on win32 + 566064 Add NOATIME flag to query_info_flags + 566170 g_async_result_verify_source_object + +* Updated translations: + Spanish (es) + Norwegian bokmÃ¥l (nb) + Brazilian Portugese (pt_BR) + Simplified Chinese (zh_CN) + + +Overview of Changes from GLib 2.19.1 to GLib 2.19.3 +=================================================== + +* Bugs fixed: + 508021 Add support for the CRIS and CRISv32 architectures + 526320 should not list mounts that the user doesn't have permission to use + 558458 Cannot build gio tests on Solaris using SUN cc + 555465 GUnix{Input,Output}Stream lacks fd/close_fd_at_close property + 558298 Hide ecryptfs mounts + 515777 incorrect date&time on copy + 562452 Ensure we return G_IO_ERROR_CANCELLED if cancelling + g_simple_async_result_run_in_thread + 473150 g_type_module_use inconsistently increases the use + counter in case of error + 563150 G_GU?INT*_MODIFIER/FORMAT docs + 563156 Document printing and scanning gunichar values + +* Updated translations: + Hebrew (he) + Italian (it) + + +Overview of Changes from GLib 2.19.0 to GLib 2.19.1 +=================================================== + +* GIO: + - g_icon_to_string, g_icon_new_for_string: GIcon serialization support + - G_FILE_ATTRIBUTE_PREVIEW_ICON: new file attribute for preview images + - g_app_info_get_commandline: new function to get the full commandline + - g_mount_shadow, g_mount_unshadow, g_mount_is_shadowed: New functions + to 'shadow' mounts (i.e. hide them from the UI when they already + have a different representation, like a bookmark) + +* Bugs fixed: + 556186 gpoll.h breaks gmain.h inclusion + 557087 mem leak in g_content_types_get_registered + 556921 gpoll.h breaks hal compilation + 557210 g_compute_checksum_for_* asserts with less than 2 bytes + 558381 Add support for compile time assertions + 558185 'parent' variable in g_local_file_get_child_for_display_name() + hits g_object_unref(NULL) assertion + 558513 g_warn_if_fail FIXME in gtestutils + 558672 NULL key lookup using g_hash_table_lookup_extended() + 555740 gicon serialization + 557182 preview functionality + 528320 Incorrect icons displayed for files with custom mimetype icons + 556910 Memory leak: sub + 557592 Missing include in gwinhttpfile.c + 556415 Crash on Windows 2000 in g_winhttp_vfs_init() + 555935 Clarify the mechanism of overwriting properties + 552776 ac_cv_func_posix_getgrgid_r not mentioned + 559448 GObject Reference Manual (typo) + 561212 GFileReadMoreCallback API doc refers to non-existant function + 560569 gkeyfile doesn't use the set list_separator in some cases + 560568 gkeyfile docs buglet + 559413 g_option_group_set_error_hook docs buglet + 562378 callback return value not respected for callback option + with no arg + 559110 Do not include libintl.h after glibintl.h + 557603 carbon check output misplaced + 562544 g_key_file_get_string and g_key_file_get_value + documentation does not explain the difference + 547264 Missing "no flags" flag + 562638 GDebugKey key member should be const + 562639 g_parse_debug_flags() parsing "help" + 562549 g_byte_array_free should tell how free data + 559452 GObject Reference Manual (typo) + 559462 GObject Reference Manual (typo) + 559517 GObject Reference Manual (typo) + 562538 GObject interface tutorial shouldn't finalise with + "Please forget everything" + 561352 Leak of icon description + 561375 Leaks mountpoint description + 561807 inotify_sub.c: dup_dirname() fails to remove trailing '/' + 562393 g_buffered_input_stream_read_byte broken if data available + 541715 win32 : patch for warnings and signature problems in recent code + 547481 g_data_input_stream_read_line behaves not as stated in the docs + 548163 Nautilus displays wrong error message for too long file names + 559633 gtk_image_new_from_gicon does not always work for .desktop files + 555486 – No way to recover command line from GAppInfo + +* Translation updates: + Spanish (es) + Ukrainian (uk) + + +Overview of Changes from GLib 2.18.1 to GLib 2.19.0 +=================================================== + +* Rewrite GHashTable to use open addressing with quadratic probing instead + of chaining. This has the potential to reduce memory fragmentation + significantly, while being slightly faster due to better locality and + no need to call alloc/free functions for nodes. Benchmarks suggest it + also uses less memory overall. + +* Make g_poll available as public api + +* New macros g_assert_error and g_assert_no_error to assert + that a GError is set or unset + +* g_cancellable_make_pollfd: New method to make a GPollFD for a cancellable + +* g_app_info_can_delete, g_app_info_delete, g_app_info_reset_type_associations: + New functions to clean up app infos and content types + +* When launching applications, always pass fuse file:// uris when possible, + and let gio convert such uris back to gio uris. + +* Bugs fixed: + 505361 gunixinputstream.c assumes poll() available + 509446 portable blocking gio cancellation + 553820 gpoll.c: undeclared identifier + 553724 python interpretter path not patched in correctly + 553857 gbacktrace.h requires signal.h + 553447 g_assert_no_error() + 554092 glib doesn't return G_FILE_ERROR_NOENT et al on OS X + 528670 Always pass file:/// uri's in GAppLaunchContext + 555224 Improve g_format_size_for_display doc + 555309 giochannel breaks on error + 554790 g_convert() misbehaves with winiconv versions + 555314 mem leak in gmarkup + 555313 GFileAttribute boxed type get_type function should... + 552861 glib-2.0.m4 calls system(3) without storing its result + 554557 Patch to fix gcc warnings about missing format specifiers + 552107 Small libtool fixes + 551355 Make glib build with libtool 2.2 + 555311 format not a string literal and no format arguments + 556101 static mutex yields warnings with g++ + 556186 gpoll.h breaks gmain.h inclusion + 526456 Open addressing in GHashTable + 553426 cancellable clarifications + 545350 GAppInfo deletion + 545351 Reset associations for content type + 552168 volume's mount not mounted after g_volume_mount_finish + 554970 segfault when update-desktop-database is not available... + 554745 GFileAttributeInfoList should be boxed + 555121 Improved build-time handling of gio module-dir + 555711 Wrong fallback order of mimetype icons + 555331 Deprecate adoption of mounts + 556335 make check fails in abicheck.sh + 556334 Warning when building without selinux support + 556422 g_file_enumerator_next_file: unclear... + +* Updated translations: + Arabic (ar) + Danish (da) + Polish (pl) + Brazilian Portugese (pt_BR) + Romanian (ro) + Russian (ru) + + +Overview of Changes from GLib 2.18.0 to GLib 2.18.1 +=================================================== + +* Bugs fixed: + 550433 g_test_init doesn't recognize --help + 523463 Core dump in gmain.c:2482:IA__g_main_context_check + 551228 G_STRFUNC on recent Sun compiler should be expanded... + 551410 gtestutils.c: using printf without prototype + 551731 g_date_set_time[_t] docs should mention what timezone + 548321 is not included in gi18n-lib.h + 551149 xdgmime mem leak + 550647 synchronous pipe I/O when reading mount reply + 551887 Docs for g_desktop_app_info_new_from_filename aren't... + 551681 g_content_type_guess() too naive with filenames + 552352 g_app_info_launch doesn't work if "Path" key... + 551408 gmodule.def generated to builddir... + 552359 g_file_info_get_icon should return GThemedIcon, and... + +* Updated translations: + Arabic (ar) + Bengali India (bn_IN) + British English (en_GB) + Hindi (hi) + Croatian (hr) + Korean (ko) + Oriya (or) + Turkish (tr) + Telugu (te) + + +Overview of Changes from GLib 2.17.7 to GLib 2.18.0 +=================================================== + +* Win32: + - rework the g_poll() implementation to match poll() semantics more closely + +* Bugs fixed: + 324234 Using g_io_add_watch_full() to wait for connect() to return... + 548278 Async GETs connections are always terminated unexpectedly... + 500246 Bug fixes for giowin32 + 523939 Example program for GValue + 550096 GBookmarkFile parser is not forward compatible + 550040 Move GString, rand and printf tests to the unit test framework + 550104 trivial documentation fix for g_get_home_dir + 548988 g_file_replace fails on Windows when the target file exists + 550059 Wrong docs for g_emblemed_icon_add_emblem + 548800 Missing a g_object_get_type function + 550056 Missing documentation for g_emblemed_icon_get_emblems + +* Updated translations: + Bulgarian (bg) + Czech (cs) + German (de) + Estonian (et) + Basque (eu) + French (fr) + Hebrew (he) + Hungarian (hu) + Italian (it) + Japanese (ja) + Lithuanian (lt) + Maithili (mai) + Dutch (nl) + Swedish (sv) + Thai (th) + Ukrainian (uk) + Vietnamese (vi) + + +Overview of Changes from GLib 2.17.6 to GLib 2.17.7 +=================================================== + +* More fixes for 64-bit Windows + +* GIO + - Add a vfs implementation for HTTP and HTTPS URIs on Windows + +* Bugs fixed: + 546329 API docs for g_utf8_normalize() are incorrect + 546876 Modify GMarkup parser to accept  ..  + 547200 g_utf8_find_next_char() issues + 547637 unconditional #include of sys/statfs.h in configure + 547337 G_DISABLE_DEPRECATED breaks tests build + 547832 gtk+-2.12.11 fails to build - AC_PROG_MMAP too strict + 502498 Test framework assertion failures should follow gcc + 546371 Improve docs re g_file_monitor + 546483 GThemedIcon:use-default-fallbacks is not readable without... + 546132 GFileIcon is bindings-unfriendly + 542156 zfs mount in home directory shown on nautilus desktop + 535124 umask 002 not being applied for new directories... + 547080 g_file_copy leaks expected errors + 546582 Callbacks from GFileMonitor present a GFile... + 547262 Missing link in the docs + +* Updated translations: + Arabic (ar) + Catalan (ca) + Spanish (es) + Basque (eu) + Finnish (fi) + Galician (gl) + Hebrew (he) + Marathi (mr) + Norwegian bokmÃ¥l (nb) + Portugese (pt) + Brazilian Portugese (pt_BR) + Swedish (sv) + Thai (th) + + +Overview of Changes from GLib 2.17.4 to GLib 2.17.6 +=================================================== + +* Fix problems on 64-bit Windows + +* g_markup_context_get_user_data: New function to access + the user_data outside of callbacks + +* GIO + - g_mount_guess_content_type_sync: synchronous version of + g_mount_guess_content_type + - GEmblem: A GIcon implementation that adds emblem-related + metadata to icons + - GEmblemedIcon: A GIcon implementation that can add emblems + to icons + +* Bugs fixed: + 544088 option_test_LDADD is left in tests/Makefile.am + 544465 gmarkup makes it hard to use pre-rolled parsers + 545485 Implicit declaration of utime() + 545798 "Since: 2.18" mark is missing in g_set_error_literal... + 544140 fam-helper 64-bit issue + 529694 SELinux context setting support + 545157 wrong/no list of "open with" applications for .cc... + 545203 gfile.c: argument is different type + 545457 gdmsetup crashed with SIGSEGV in g_unix_mount_guess... + 544177 Fix trivial cut and paste error in documentation + 545395 Language tweak for g_value_set_string* docs + 541036 Gnumeric crashes when trying to open Desktop... + 546079 leak in xdgmime + 545395 Language tweak for g_value_set_string* docs + 546017 Don't copy attributes when copying a symlink + +* Updated translations: + Arabic (ar) + Estonian (et) + Galician (gl) + Italian (it) + Japanese (ja) + Korean (ko) + Norwegian bokmÃ¥l (nb) + Pashto (ps) + Portugese (pt) + + +Overview of Changes from GLib 2.17.3 to GLib 2.17.4 +=================================================== + +* GIO: + - New API to handle content types: g_mount_guess_content_type, + g_content_type_guess_for_tree. + - Export the eject-button signal on the volume monitor class + - New API to enable out-of-process volume monitors: + g_volume_get_activation_root + +* GObject: + - New API to handle signals without slots in the class structure: + g_signal_new_class_handler, g_signal_override_class_handler + +* Internationalization: + - Add an NC_ macro that is a no-op equivalent of C_ + +* GMarkup: + - Add two new functions g_markup_parse_context_push, + g_markup_parse_context_pop to support "subparsers" + +* Bugs fixed: + 541208 Functions to easily install and use signals without... + 541507 Ambiguous description of assigned characters in the... + 543040 async reading on dummy file will crash on GIO_USE_VFS=local + 543560 enable gio-FEN back-end warnings on Solaris will crash... + 528317 GRegex does not allow recursion limit + 337518 GMarkup: Subparser support + 541794 drive-eject-button signal + 541793 activation root for volumes + 467707 test_iconv_state() in tests/convert-test.c fails on AIX 5.3 + 428048 2 of 51 tests fail on Solaris + 542332 small fix for error message in GMarkup + 482413 get_contents_stdio -- overflow and memory corruption + 406120 g_ascii_strtod + 334234 "printf" format error + 536996 Missing noop i18n macro equivalent to C_ + 540616 mem leak in filechooser button + 539229 gobject-query calls itself query + 521589 [RFC] gobject documentation should mention Vala + 543168 Description of G_SLICE=debug-blocks discourages its use + 543220 Case collision on gio-extension-points.html + 530759 update the gobject tutorial to the XXI century + 535223 gbookmark file inefficiency ... + 543504 crash in Epiphany Web Browser: Opening local file + +* Updated translation: + German (de) + Estonian (et) + Pashto (ps) + Albanian (sq) + Thai (th) + Traditional Chinese (zh_HK) + Traditional Chinese (zh_TW) + + +Overview of Changes from GLib 2.17.1 to GLib 2.17.3 +=================================================== + +* PCRE + - fix for CVE-2008-2371 + +* Bugs fixed: + 538119 glib's mainloop leaks a pipe to sub-processes + 537635 Corrections and improvements to g_time_val_{to,from}_iso8601 + 539067 The document g_io_channel_win32_new_fd() says... + 535949 annotate g_strip_context and g_dpgettext with G_GNUC_FORMAT + 539123 annotate g_d[n]gettext with G_GNUC_FORMAT + 539074 Cannot get exit status with g_spawn_command_line_sync + 316221 G_LOCK warns about breaking strict-aliasing rules + 539770 migrate gstrfunc unit tests to gtest + 539626 Update docstrings for g_object_freeze_notify and g_object_thaw_notify + 538044 unconditional use of LC_MESSAGES + 540545 Monotonic time and timer offset + 535947 want g_set_error_literal + 539999 glibconfig.h: add GLIB_USING_SYSTEM_PRINTF + 536252 GFileEnumerator should allow access to the containing GFile + 538362 Get Win32 icons back in the file chooser + 540802 g_list_prepend doesn't concat lists + 540423 unrecoverable error after g_seekable_truncate + 538836 make check failure on PPC and ALPHA: pltcheck.sh on g_atomic_pointer_get + 539090 g_content_type_from_mime_type() should unalias + 540331 g_file_append_to () documentation: can return NULL + 534639 add g_desktop_app_info_new_from_keyfile + 536733 gio build failure on Irix + 536160 Add g_file_monitor() + 538127 FileChooser broken on win32 + 531476 /live-g-file/test_traverse_structure test fails on Mac HFS+ + 538564 gio should have gio-types.h + 540047 glib-genmarshal.c: '#include ' is too before + +Updated translations: + Korean (ko) + Occitan (oc) + + +Overview of Changes from GLib 2.17.0 to GLib 2.17.1 +=================================================== + +* New function: g_utime(), a gstdio wrapper for utime() + +* New functions: g_dgettext() and g_dngettext(), wrappers + for corresponding gettext functions with added functionaliy + +* Support the latest version of the shared-mime spec, including + icons for mime types + +* New function: g_themed_icon_prepend_name() + +* Bugs fixed: + 535418 Please document which glib version defines goffset + 528715 Misprint in the description of the interface g_type_class_add_private + 528714 Misprint in the description of the interface g_param_spec_flags + 537260 Doc bug in G_TYPE_INSTANCE_GET_CLASS() + 530527 Misprint in the description of the interface + g_cclosure_marshal_VOID__FLAGS + 530526 Misprint in the description of the fields 'class_init' and + 'class_finalize' of the structure GTypeInfo + 528719 Improvement to the documentation of the "g_object_connect" interface + 528172 gtk_signal_handlers_unblock_* functions return value + amount of matched signals, not amount of actually unblocked + 528717 Misprint in the description of the parameter 'type_id' for + the interface g_type_register_fundamental + 528716 Misprint in the description of the parameter 'iface_data' for + the callback types GInterfaceInitFunc and GInterfaceFinalizeFunc + 537555 GObject instantiation not thread safe + 537546 'desktop' shortcut in file chooser looks like a generic folder + 537392 Additional colon in xattr name + 536641 Filesystem querying in gio does not list AFS and autofs file systems + 528600 g_dummy_file_get_parent("scheme://example.com/") + 503071 Application direction changes to right to left even if theres no + translation + 502511 g_assert_cmphex prints invalid message + 338162 Use po/LINGUAS + 314453 Nautilus crashes in Solaris when browsing the attached file + 529321 make check fails in glib/pcre + 455215 g_get_user_special_dir: no reference about G_USER_DIRECTORY_DOWNLOAD + fallback to $HOME/Desktop if xdg-user-dirs is not in use + 498732 g_key_file_to_data cannot fail + 511367 add g_file_make_directory_with_parents + 531900 Use __builtin_offsetof for G_STRUCT_OFFSET if building with + gcc 4.0 or newer + 536158 also bump GHashTable version when a node is removed via + g_hash_table_iter_remove()/g_hash_table_iter_steal() + 531403 g_utf8_collate broken on Mac + 535628 test/patterntest.c still includes gpattern.h directly + 535625 alias.h:2648: error: 'utime' undeclared here (not in a function) + +* Translation updates: + Arabic (ar) + German (de) + Italian (it) + Norwegian bokmÃ¥l (nb) + Thai (th) + + +Overview of Changes from GLib 2.16.x to GLib 2.17.0 +=================================================== + +* Update to Unicode 5.1 + +* Update included libcharset to the one shipped with libiconv 0.12 + +* Update included PCRE to 7.7 + +* Enforce that only toplevel headers are directly included. + This is turned on by default for GObject and GIO. To turn + it on for GLib, define G_DISABLE_SINGLE_INCLUDES. + +* Fix library version of GIO. GLib 2.16 shipped with libgio-2.0.so.0.0.0 + +* On Solaris, use FEN for file monitoring in GIO + +* Use the GIO_EXTRA_MODULES environment variable to find + additional GIO modules + +* G_GNUC_ALLOC_SIZE: New macro that wraps the gcc alloc_size + function attribute + +* g_checksum_reset: New function to reset the state of a GChecksum + +* g_unix_mount_monitor_set_rate_limit: New function to limit the + rate at which events are reported + +* g_file_query_file_type: New utility function to query the type of + a file + +* g_memory_output_stream_get_data_size: New function to obtain the + size of the written data. + +* Bugs fixed: + 522292 Gives warnings in glib/gutils.h with GCC in C99 mode + 523298 win_iconv can't convert from UTF-8 to GB18030 (or vice versa) + 518160 replace two g_strdup_printf calls in GBookmarkFile + 523877 gbookmarkfile: avoid using g_string_append_printf() and + other optimizations + 525192 100% CPU if run main loop with no IO sources + 315437 extern inline -> static inline + 524314 g_convert() on Win32 implicitly converts full width + alphanumerics into half width + 525732 Error in documentation for g_list_first + 525674 A typo in gmarkup.c + 448943 g_timeout_add_seconds() problems + 525972 UCS-4 not in the new win_iconv implementation + 526619 make test-report crash + 491554 Update to Unicode 5.1.0 + 519137 g_slice_dup macro needs cast for 64-bit platform + 528752 Win32 build and SSL not working + 530457 G_USER_DIRECTORY_DOWNLOAD folder improperly mapped + 528667 Typos in testing module documentation + 459905 Bug in wcwidth data + 534085 g_unichar_iswide_cjk() has a totally wrong table + 501651 Update glib/libcharset + 519026 G_STMT_START/G_STMT_END test a non-existent preprocessor symbol + 534319 GLib's .pc files could use Libs.private + 534137 Typo in g_spawn_async_with_pipes doc + 517419 gio win32 directory monitor + 526796 Wrong order of arguments in g_file_copy's fallback + 530196 _g_local_file_has_trash_dir() doesn't handle st_dev == 0 + 532965 Should not return filesystem::free for certain file systems + 525553 fix typo and nitpicking in GArray documentation + 526572 Missing * in declaration of parent_class in Object + Destruction section of GObject Reference Manual + 528648 Extra >s in Object Construction section + 535021 g_param_spec_internal documentation should + describe purpose of nick and blurb + 521513 Firefox crash when using file picker + 528433 gdesktopappinfo snafu ... + 533369 API g_file_info_get_attribute_string () unables to get "... + 521045 glib f_fstypename miscellany + 521672 compile error + 521946 control rate limit on GUnixMountMonitor + 522335 Fails to build: glib/gtester.c:276: error: 'ARG_MAX' unde... + 523015 Implement sliding window based upload operation + 523019 Use new GCC 4 feature + 523338 list nfs4 as a nfs mount type + 524350 Make glib build without NLS again + 524579 g_file_copy reports wrong total on progress callback for ... + 524742 A typo in gtestutils.c. + 524950 Minor documentation typos. + 525866 the user directory should not be considered as a mount to... + 526320 should not list mounts that the user doesn't have permiss... + 527132 nautilus crash when making ftp connection + 532852 CRITICAL **: totem_pl_parser_parse_with_base: assertion `... + 534759 Build failure in gio + 534764 Typo in error produced by g_file_make_directory + 521851 Redudant tests in gunixmounts.c + 524344 glib/gthread.h still use G_GNUC_PRETTY_FUNCTION + 525060 glib fails to build with -DG_DISABLE_ASSERT in CPPFLAGS o... + 534177 Invalid description of the interface g_cclosure_marshal_S... + 520715 Add GFile method g_file_query_file_type + 523039 nautilus can't access to trash/computer/network if gvfs i... + +* Updated translations: + Arabic (ar) + Bulgarian (bg) + Catalan (ca) + Czech (cs) + Greek (el) + Candian English (en_CA) + British English (en_GB) + Spanish (es) + Estonian (et) + Basque (eu) + Galician (gl) + Hebrew (he) + Hungarian (hu) + Japanese (ja) + Lithuanian (lt) + Norwegian bokmÃ¥l (nb) + Dutch (nl) + Occitan (oc) + Portugese (pt) + Russian (ru) + Slovak (sk) + Albanian (sq) + Swedish (sv) + Turkish (tr) + Vietnamese (vi) + + +Overview of Changes from GLib 2.16.0 to GLib 2.16.1 +=================================================== + +* Fix a crash in g_themed_icon_new + +* Update the included PCRE to 7.6 + + +Overview of Changes from GLib 2.15.6 to GLib 2.16.0 +=================================================== + +* Fix the definition of G_INLINE_FUNC to work with gcc 4.3.0 + +* GIO: + - Add missing GMountMountFlags argument to g_unix_volume_mount + - Fix the adopt_orphan_mount vfunc to take a volume monitor + reference + - Add properties to GThemedIcon for bindings sake + +* Bugs fixed: + 520484 gvfsd-trash crashed with SIGSEGV in g_path_is_absolute() + 510855 g_checksum_update(): Take -1 for length. + 517676 g_themed_icon_new*() do more than call g_object_new(). + 518816 should handle rmdir returning EEXIST correctly + 519352 g_[s]list_delete_link() docs + 519489 Fixes for sparse warnings in gio + 520169 add monitor argument to vfunc for GVolumeMonitor + 520700 Add type check in g_file_query_exists + 521145 FILE_READ_ONLY_VOLUME not present on Mingw32 + 518720 No MIME type for empty files + 521013 in documentation, goffset doesn't say "Since 2.x" + 521028 Missleading error messages from g_io_channel_set_encoding() + 517484 GMainLoop could set the thread "Alertable" for APCs to be... + +* Updated translations: + Assamese (as) + Bengali India (bn_IN) + Czech (cs) + German (de) + Spanish (es) + Estonian (et) + Finnish (fi) + French (fr) + Gujarati (gu) + Italian (it) + Lithuanian (lt) + Malayalam (ml) + Marathi (mr) + Norwegian bokmÃ¥l (nb) + Romanian (ro) + Russian (ru) + Slovak (sk) + Ukrainian (uk) + + +Overview of Changes from GLib 2.15.5 to GLib 2.15.6 +=================================================== + +* GIO: + - New file attributes: trash::item-count, filesystem::use-preview + - Rename g_file_contains_file to g_file_has_prefix + - g_file_query_filesystem_info grew async variants + - g_themed_icon_append_name: new convenience function + - g_content_type_get_icon is implemented now + - Only show mounts in /media and ~ + - g_file_contains_file has been renamed to g_file_has_prefix + +* Win32: + - g_win32_get_package_installation_directory_of_module: new function + which supersedes g_win32_get_package_installation_directory + - Use alertable wait functions so that I/O completion routines or + user-mode Asynchronous Procedure Calls can be run + - Fix race conditions in g_spawn implementation on win32 + +* Other: + - g_uri_get_scheme has been renamed go g_uri_parse_scheme + +* Updated translations: + Arabic (ar) + Belarusian Latin (be@latin) + Catalan (ca) + British English (en_GB) + Finnish (fi) + Galician (gl) + Hebrew (he) + Italian (it) + Kannada (kn) + Norwegian bokmÃ¥l (nb) + Dutch (nl) + Brazilian Portugese (pt_BR) + Vietnamese (vi) + + +Overview of Changes from GLib 2.15.4 to GLib 2.15.5 +=================================================== + +* Update the included PCRE to 7.6 + +* GIO: + - g_volume_should_automount: new function to determine if a volume + should be mounted automatically + - g_file_query_default_handler: new convenience function to get + the default handler for a file + - g_app_info_launch_default_for_uri new convenience function to + launch the default handler for a URI + - Use mimeapps.list and defaults.list as discussed on xdg list + recently + - g_app_info_get_default_for_uri_scheme has a real implementation + now (gvfs provides a GConf-based implementation) + - There is the beginning of a test suite + - standard::description: new file attribute + - GMountMountFlags flags argument added to mount calls + +* GObject: + - class initialization is now threadsafe + +* Updated translations: + Arabic (ar) + Catalan (ca) + Spanish (es) + Basque (eu) + Italian (it) + Japanese (ja) + Kannada (kn) + Korean (ko) + Macedonian (mk) + Occitan (oc) + Portugese (pt) + Brazilian Portugese (pt_BR) + Swedish (sv) + Thai (th) + + +Overview of Changes from GLib 2.15.3 to GLib 2.15.4 +=================================================== + +* G_GNUC_PRETTY_FUNCTION has been deprecated + +* GIO: + - g_file_copy has an async variant now + - Drives and volumes now have API to get identifiers + like Hal UDIs or UUIDs. + - There is now a registration API to let modules register + extensions they provide, such as volume monitor implementations + +* Bugs fixed: + 511807 g_time_val_to_iso8601() uses MT-unsafe gmtime() function + 316260 [patch] Doc patches for gnode (2.8.1) + 385132 solaris gettext support fix + 484261 ./configure check for system PCRE unicode support fails w... + 510292 GOption main help not shown + 511580 Implement g_file_copy_async + 511654 Compile errors due to C99 constructs + 487909 g_utf8_strreverse and combining marks + 512381 unused variable 'is_main_group' + +* Updated translations: + Arabic (ar) + Belarusian (be) + Czech (cz) + Spanish (es) + French (fr) + Galician (gl) + Portugese (pt) + Russian (ru) + Swedish (sv) + Thai (th) + + +Overview of Changes from GLib 2.15.2 to GLib 2.15.3 +=================================================== + +* GChecksum: + - g_checksum_update can accept nul-terminated strings + - The MD5 implementation works correctly on buffers + that are longer than 64 bytes + +* GIO: + - Don't include a copy of the inotify headers, rely on system headers + - g_file_find_enclosing_mount has an async variant now + - Reduntant seek API on file streams has been removed + +* Bugs fixed: + 508602 gmemory{in|out}putstream.c: unknown pointer size + 508771 There is no g_file_test/exists() for GFile + 508773 g_uri_escape_string() documentation unclear. + 509465 AM_PATH_GLIB_2_0 doesn't support gio + 509626 async functions: Document allowed NULL callback? + 509990 GSeekable documentation unclear + 510448 No inotify support on ARM or SH5 + 510855 g_checksum_update(): Take -1 for length. + +* Updated translations: + Basque (eu) + Marathi (mr) + Swedish (sv) + Ukrainian (uk) + + +Overview of Changes from GLib 2.15.1 to GLib 2.15.2 +=================================================== + +* GIO: + - Mount operation API change: unhandled methods get reported via + the reply, rather than by the signal emission return value + - File monitor API change: Add a GError argument to g_file_monitor_file + - g_unix_mount_guess_should_display(): new function + +* Bugs fixed: + 508224 [PATCH] FAM backend crashes due to double free + 508074 GAsyncResult documentation suggests g_freeing it. + 508108 GFile documentation slightly unclear. + 508309 rpc_pipefs mount points should be hidden + 508378 GFileInfo documentation implies that it changes attribute... + 508719 g_file_get_relative_path fails if parent is root + 508773 g_uri_escape_string() documentation unclear. + +* Updated translations: + Arabic (ar) + Spanish (es) + Hebrew (he) + Italian (it) + Korean (ko) + Turkish (tr) + + +Overview of Changes from GLib 2.15.0 to GLib 2.15.1 +=================================================== + + * Portability fixes: + - Assertion functions are marked as noreturn again + - Handling of inline functions has been fixed to work with gcc 4.3 + - C99 comments have been removed from headers + - The nonportable sed -i option is no longer used + + * GIO: + - Clarified the semantics of g_app_info_get_all() + - API for memory input and output streams has been changed a bit + - GDirectoryMonitor has been removed; GFileMonitor can monitor + files and directories now + + * Bugs fixed: + 504829 Invalid environment passed to g_spawn_async in g_desktop_... + 505258 crash in Users and Groups: Adding a user + 505815 g_content_types_get_registered should not g_free keys + 491218 g_timer_new() doesn't initialize timer->end + 315437 extern inline -> static inline + 476856 Inconsistency between standard and implementation of the ... + 480122 g_module_open fails to open modules with ".la" extension + 495589 gspawn.c failing to set FD_CLOEXEC + 500273 doesn't build with --disable-visibility + 504142 Do not show empty groups in --help output + 504879 giofam incorrectly linked + 505042 add file attribute for actually used file size in bytes + 505058 xattr namespace docs + 505674 Misprint in the definition of the macro G_CCLOSURE_SWAP_DATA + 505730 Fails to build on OSX 10.4: _NSGetEnviron not declared + 505887 older darwin lacks lchown + 506374 gmemoryinputstream api + 506461 Conversion of g_assert_not_reached() and friends into fun... + 503051 Small bug in glib interface + 506395 Updates to GIO documentation + 507628 Missing .pc entry for gio linking against glib + 505195 [patch] typo in g_try_new0 docs + 507822 g{file,directory}monitor changes signal problem + 506377 gmemoryoutputstream write implementation + 507835 bug in gunixinputstream + + * Updated translations: + Arabic (ar) + Belarusian Latin (be@latin) + Spanish (es) + Basque (eu) + Irish (ga) + Hebrew (he) + Occitan (oc) + Vietnamese (vi) + + +Overview of Changes from GLib 2.14.x to GLib 2.15.0 +=================================================== + +Major new features: + + * GIO: a VFS API, designed to replace GnomeVFS. The GIO implementation + in GLib has support for local filesystems. The new, separate gvfs + module contains various backend implementations (cifs, ftp, sftp, + http, ...) + + * GChecksum: provides various hash algorithms, such as MD5, SHA-1 + and SHA-256 + + * GTest: a test framework + +Smaller additions: + + * GHash: + - GHash has iterators, as an alternative to g_hash_table_foreach + + * GMarkup: + - g_markup_parse_context_get_element_stack: New function to + get the stack of open elements + - G_MARKUP_PREFIX_ERROR_POSITION: New flag to improve error + reporting + - g_markup_collect_attributes: Convenience function for handling + attributes + +* GKeyFile: + - Functions that take a GError now return a boolean to indicate + success, instead of void + - Various performance improvements + +* GAsyncQueue: + - g_async_queue_new_full: new function that allows to specify + a free function for leftover elements + +* GError: + - g_prefix_error and g_propagate_prefixed_error: New functions + to ease error propagation + +* Internationalization: + - C_: A new 2-argument variant of the Q_() macro + - Use native character set conversion API on Windows + +* GLib builds with automake 1.10 + +* Bugs fixed: + 455725 specific combination of g_utf8_strlen and g_pattern_match... + 467537 g_convert_with_iconv() not resetting iconv() state correc... + 497033 Commandline option parser should warn about missing optio... + 504527 gchecksum: Conditional jump or move depends on uninitiali... + 445362 Non-numeric local labels in gatomic.c are causing linker ... + 482313 gregex: no way to tell why compilation failed + 317775 main loops continues to run after g_main_loop_quit() has ... + 418778 Insufficient pkg-config version requirement + 436293 g_option_context_new() doc should mention that the string... + 466557 glib-mkenums shifts ARGV[0] to undefined + 468882 GKeyFile doesn't accept "True" as a true boolean value + 469551 application --help messages are garbaged on none UTF-8 lo... + 479724 Memory leak upon calling "g_main_loop_run" in the seconda... + 490061 outptrs uninitialized after g_parse_long_long + 490637 gobject documentation patch + 495294 glib-genmarshal prints warnings but returns 0 + 496046 option to prefix location of errors for GMarkup + 498113 tests/regex-test fails on 64bit environment + 500506 Fails to build on OSX 10.4 + 500638 gkeyfile speedup ... + 500875 Make check fails as there is no "test" target for "build"... + 502511 g_assert_cmphex prints invalid message + 502927 g_array_index triggers cast aligment warning + 503029 g_time_val_from_iso8601 parse non-ISO8601 dates + 503222 Need context to translate + 503420 gkeyfile leaks a hash table + 503470 Fix build when builddir != srcdir + 504227 Inverse variant for g_test_trap_assert_stdout, g_test_tra... + 71704 file include order + 491957 Misprint in the specification of the interface "g_main_co... + 491959 Misprint in description of the structure "GThreadPool" + 491965 Mistype in the specification of the function "g_hook_list... + 491966 Misprint in the specification of the interface "g_main_co... + 491968 The documentation does not mention the restriction for th... + 491970 The documentation for the interface "g_date_clamp" is inc... + 491974 The documentation of the interface "g_main_context_iterat... + 491975 The documentation for the interfaces "g_io_channel_read_u... + 491979 Misprint in the description of the interfaces g_key_file_... + 491982 Misprint in the description of the interface "g_key_file_... + 501107 EXTRA_DIST automake warnings + 501997 g_utf8_normalize() returns NULL on invalid string + 502590 C_/g_dpgettext efficiency + 464259 g_set_application_name() docs should say "Since 2.2" + 496518 gbase64.c API doc clarification + 498728 g_key_file_get_*_list should set length to 0 when returni... + 500361 Improve docs for g_array_free() and g_ptr_array_free() + 501853 g_checksum_get_digest docs + 503862 Allow NULL strings in g_parse_debug_string() + 142676 Q_ + 367550 Add g_async_queue_new_full() with GDestroyNotify function + 375651 Minor enhancements to GKeyFile API + 443648 MD5 digest support + 449937 Upgrade auto* sources to be clean under automake1.9 + 452887 gmarkup context "get element" function is useless when ca... + 491549 [PATCH] Eliminate libiconv dependency on Windows + 500507 GHashTableIter API + +* Translation updates + Belarusian Latin (be@latin) + Czech (cs) + German (de) + Spanish (es) + Esperanto (et) + French (fr) + Korean (ko) + Marathi (mr) + Norwegian bokmÃ¥l (nb) + Brazilian Portugese (pt_BR) + Slovenian (sl) + Swedish (sv) + + +Overview of Changes from GLib 2.14.2 to GLib 2.14.3 +=================================================== + +* Update PCRE to 7.4 + +* Bugs fixed: + 487491 Fix some warnings from sparse + 488068 Small (one-time) memory leak in glib_gettext initialization + 493688 TYPE macro "_get_type ()" is documented wrong + +* Updated translations: + Arabic (ar) + Belarusian Latin (be@latin) + Estonian (et) + Irish (ga) + Slovenian (sl) + + +Overview of Changes from GLib 2.14.1 to GLib 2.14.2 +=================================================== + +* Bugs fixed: + 476849 Invocation of the interface "g_hook_free" fails in certai... + 359165 marshallers can throw warnings with -Wunused + 477957 more discussion on g_value_set_object vs. g_value_take_ob... + 478459 G_DEFINE_DYNAMIC_TYPE_EXTENDED doesn't work with G_IMPLEM... + 483337 inline is disabled for MSVC when compiling C code + 478349 Broken link to gettext website + 469231 g_spawn optimization for setting all open fds to CLOEXEC + +* Updated translations: +Arabic (ar) +Galician (gl) +Hebrew (he) +Korean (ko) + + +Overview of Changes from GLib 2.14.0 to GLib 2.14.1 +=================================================== + +* Bugs fixed: + 476840 Invocation of the interface "g_utf8_strreverse" crashes f... + 444765 Fix FIXME in gregex.c when new pcre is out + 464145 g_markup_escape_text Produces Invalid XML + 465625 g_type_default_interface_ref() does not ensure working g_... + 466768 Clearify that comments can be put anywhere in a Key-file. + 474229 The GError documentation should give convention for the G... + 474899 G_BREAKPOINT() docs inaccurate + 475854 Overuse of -lpcre when using system pcre + 473879 Incorrect includes in gregex.c + 468694 Typoes in documentation + 469051 g_snprintf () talks about characters where it probably me... + 457601 Missing arch specific atomic implementation + 475923 Missing pcre flags when static-linking against glib + 475619 glibthread-2.0.la does not list -lpthread + +* Updated translations: + Bulgarian (bg) + Catalan (ca) + Danish (da) + German (de) + Canadian English (en_CA) + British English (en_GB) + Spanish (es) + Estonian (et) + Finnish (fi) + French (fr) + Gujarati (gu) + Hungarian (hu) + Italian (it) + Georgian (ka) + Kannada (kn) + Lithuanian (lt) + Makedonian (mk) + Norwegian (nb) + Dutch (nl) + Polish (pl) + Portugese (pt) + Brazilian Portugese (pt_BR) + Romanian (ro) + Russian (ru) + Albanian (sq) + Serbian (sr, sr@Latn) + Swedish (sv) + Tamil (ta) + Thai (th) + Ukrainian (uk) + Vietnamese (vi) + + +Overview of Changes from GLib 2.13.7 to GLib 2.14.0 +=================================================== + +* Last-minute API additions: + - Make g_unichar_combining_class public + - Add goffset type, add G_MAXSSIZE and G_MINSSIZE + +* Update PCRE to 7.2 + +* Bugs fixed: + 453998 Make _g_unichar_combining_class() public + 462549 gregex.c: variable is declared at middle of block + 417068 g_file_test doc inconsistency + +* Updated translations: + Assamese (as) + Basque (eu) + Kannada (kn) + Malayalam (ml) + Dutch (nl) + Polish (pl) + Brazilian Portugese (pt_BR) + Turkish (tr) + + +Overview of Changes from GLib 2.13.6 to GLib 2.13.7 +=================================================== + +* The memory corruption warning from the slice allocator that + occurred when threads were initialized after the slice allocator + has been removed, as the slice allocator now works fine + in this scenario. + +* New functions g_once_init_enter() and g_once_init_leave() make + it easier to write threadsafe one-time initialization functions + +* Bugs fixed: + 454473 Simple XML Subset Parser terminates on invalid XML + 445813 g_module_open error, add file name + 453796 errno gets clobbered by g_filename_display_name + 341988 don't use "-c" with msgfmt in Makefile.in.in + 447048 Please produce slightly more output during long tests + 454785 GModule documentation lists same block of code twice. + 454786 GModule documentation lists same paragraph twice. + 383155 small docs quirks in gobject/closure API documentation + 65041 _get_type() functions aren't thread safe + +* Updated translations + Assamese (as) + Spanish (es) + Gujarati (gu) + Japanese (ja) + Korean (ko) + Macedonian (mk) + + +Overview of Changes from GLib 2.13.5 to GLib 2.13.6 +=================================================== + +* Reintroduce a GType typedef whose removal in 2.13.5 + caused trouble for C++ bindings + +* Bugs fixed: + 450216 docs not explicit enough about g_free() + 451459 g_type_register_static_simple calls g_type_register_static + +* Updated translations + Norwegian bokmÃ¥l (nb) + Sinhala (si) + + +Overview of Changes from GLib 2.13.4 to GLib 2.13.5 +=================================================== + +* xdg-user-dirs support: + - the Desktop directory is guaranteed to be defined + - user-dirs.dirs is no longer reloaded on changes + +* Slice allocator: + - new api to duplicate slices + +* Regular expression support: + - GRegex is a boxed type now + +* Bugs fixed: + 44793 make check failing in trunk + 354522 Small problem with PLT hiding 6 symbols + 363986 glib 2.12.4 does not compile with SGI IDO cc + 443869 g_type_class_add_private doesn't warn when adding 0-sized... + 446859 Legitimately return 0 for g_quark_from_string(NULL) + 447534 Small typo in g_timeout_add_seconds() doc + 447583 GStaticRWLock + 447935 g_get_current_dir SIGSEGV on long path + 448260 CLAMP has surprising result if low > high + 57693 g_string_vprintf() + 442029 add g_slice_dup() + 445065 Add GRegex boxed type + 448819 Add full version of g_timeout_add_seconds() + +* Updated translations: + Swedish (sv) + Oriya (or) + Hebrew (he) + Spanish (es) + Estonian (et) + + +Overview of Changes from GLib 2.13.3 to GLib 2.13.4 +=================================================== + +* Bugs fixed: + 444121 g_get_user_special_dir deadlocks + 444161 invalid UTF8 in key name shows up as valgrind error in g_... + 444130 g_option_context_get_help() is broken when there's a desc... + + +Overview of Changes from GLib 2.13.2 to GLib 2.13.3 +=================================================== + +* GKeyFile: + - Added defines for easier handling of desktop files + +* Unicode support: + - Update g_unichar_iswide_cjk for Unicode 5.0 + +* Regular expression support: + - GRegex structs can now be ref-counted + - Some new functions for dealing with incremental + replacement have been added + - The GRegexEvalCallback signature has been changed + +* g_get_user_special_dir() has been added to support + xdg-user-dirs + +* Bugs fixed: + 419376 Functions using named subpatterns behave inconsistently w... + 434358 g_regex_fetch_named() and g_regex_fetch_named_pos() are b... + 423708 typo in the README.win32 file see patch below + 339225 Add new defines for easier handling of .desktop files + 442265 API additions/changes for GRegex + 432651 Add a glib-ish xdg_user_dir_lookup + +* Updated translations: + Estonian (et) + Norwegian bokmÃ¥l (nb) + + +Overview of Changes from GLib 2.13.1 to GLib 2.13.2 +=================================================== + +* Unicode support: + - Add g_unichar_ismark() + +* GOption: + - Allow to use callbacks for remaining args + +* Updated translations: + Belarusian Latin (be@latin) + British English (en_GB) + Galician (gl) + Norwegian bokmÃ¥l (nb) + Oriya (or) + Spanish (es) + Thai (th) + + +Overview of Changes from GLib 2.13.0 to GLib 2.13.1 +=================================================== + +* GRegex: + - Portability fixes + - Split into immutable GRegex and GMatchInfo + - Add g_regex_get_max_backref() and g_regex_get_capture_count() + to obtain information about the compiled regex + +* GKeyFile: + - Fix roundtrip problems + - Add g_key_file_load_from_dirs() + +* Unicode support: + - Fix corner cases in case conversion routines + +* GOption: + - Add a function to get the formatted help string + +* GHash: + - Add new functions g_hash_table_get_keys() and + g_hash_table_get_values() to retrieve the keys and + values in list form + +* Updated transations: + Simplified Chinese (zh_CN) + Arabic (ar) + + +Overview of Changes from GLib 2.12 to GLib 2.13.0 +================================================= + +* Add GSequence, a list that is implemented using + a balanced binary tree. + +* Add GRegex, an implementation of Perl regular expressions, + based on PCRE. + +* Use Posix monotonic clocks instead of gettimeofday() + for GTimer when available. + +* Support static initialization of GQeues with G_QUEUE_INIT, + g_queue_init() and g_queue_clear(). + +* Add g_string_chunk_clear() for clearing a + GStringChunk. + +* Add g_unichar_get_script() to obtain Unicode + script information. + +* Add g_unichar_iszerowidth() to obtain information + about zero-width characters. + +* Add G_GNUC_MAY_ALIAS which wraps the gcc may_alias + type attribute. + +* G_GNUC_INTERNAL has a working definition for the + Sun Studio compiler. This requires the macro to + be positioned before the function declaration. + +* The slice allocator can produce detailed debugging + information with G_SLICE=debug-blocks. + +* Modules support G_DEBUG flags resident-modules and + bind-now-modules. + +* Add G_DEFINE_DYNAMIC_TYPE() to make it easier + to define types in modules. + +* Bug fixes: too many to list them in detail here. + +* New and updated translations (be,bg,bn,ca,cs,de, + en_CA,en_GB,et,fa,fr,he,hu,it,ja,ku,lt,mg,mk,ml, + nb,ne,nn,pt,pt_BR,ro,sr,sr@Latn,sv,ta,uk,vi,zh_CN, + zh_HK,zh_TW) + + +Overview of Changes from GLib 2.12.1 to GLib 2.12.2 +=================================================== + +* Unicode updates: + - Normalization is following Unicode TR #29 + - g_unichar_isxdigit() only accept characters + for which g_unichar_xdigit_value() returns a value + - g_unichar_toupper and g_unichar_tolower leave + unconvertable characters in place instead of + replacing them by NUL + +* Bugs fixed + 348491 g_utf8_strup() and g_utf8_strdown() returns + string with NUL bytes + 349825 GKeyFile always inserts a newline before a group + 347842 g_unichar_isxdigit() is too general about what + it considers a digit + 348694 g_utf8_normalize() hasn't been updated to PR #29 + 348785 Hint about G_DEBUG in Message Logging docs + 349792 Wrong english string (UI) + 349952 gparamspecs.c uses gcc feature + +* Translation updates (ca,cs,de,dz,es,eu,fi,gu,ko, + nl,pl,tr,uk,zh_HK,zh_TW) + + +Overview of Changes from GLib 2.12.0 to GLib 2.12.1 +=================================================== + +* Update to final Unicode Character Database 5.0.0 + +* Bugs fixed: + 346660 issues with base64 api documentation / g_base64_decode_cl... + 348136 Coverity reports allocation of wrong size CID #2839 + 336281 Update to UCD 5.0 + 346197 g_date_strftime %F option doesnt work for win32 + 348011 Small optimization to real_toupper() + 246494 prototype mismatch in glib/gconvert.c + +* New and updated translations (bg,bn_IN,ca,dz,eu,fi, + fr,he,it,ja,mk,or,pt) + + +Overview of Changes from GLib 2.11.4 to GLib 2.12 +================================================= + +* Bugs fixed: + 344905 leap-year bug in g_time_val_from_iso8601 w/o HAVE_TIMEGM + +* Updated translations (cy,nb,nl) + + +Overview of Changes from GLib 2.11.3 to GLib 2.11.4 +=================================================== + +* GBookmarkFile: + - g_bookmark_file_remove_item returns a boolean + +* g_mkstemp accepts the XXXXXX in the middle of + the template + +* Bugs fixed: + 344868 g_key_file_to_data should separate groups + +* Updated translations (de,es,fr,gu,hi,ko,th) + + +Overview of Changes from GLib 2.11.2 to GLib 2.11.3 +=================================================== + +* GBookmarkFile: + - g_bookmark_file_move_item: Return TRUE in case of + an empty target + +* Bugs fixed: + 343919 gunicollate.c: strxfrm bug on VC8 + +* Updated translations (fi) + +Overview of Changes from GLib 2.11.1 to GLib 2.11.2 +=================================================== + +* Add g_ascii_stroll to parse signed 64bit integers + +* GMarkup: add a flag to treat CDATA as text + +* GHashTable: add functions to remove all entries + +* GMainLoop: add functions to find the currently + running source, and determine if it is destroyed + +* Bug fixes: + 342563 g_atomic_thread_init() needs to be called before + other _g_*_thread_init() functions + 343548 Potential use after free in callers of g_string_free() + 168538 Wish: Clearing contents of GHashTables + 321886 GTK+ cannot be reliably used in multi-threaded + applications + 341826 goption.c: 'strtoll' is C99's function + 343899 g_ascii_formatd dosn't work as expected for all + format strings + 317793 Make GEnumValue strings const + 337129 Compile warnings in G_IMPLEMENT_INTERFACE + 303622 What is G_TYPE_CHAR? + +* Updated translations (bg,dz,eu,gl,ja,ko,nl,th,vi) + + +Overview of Changes from GLib 2.11.0 to GLib 2.11.1 +=================================================== + +* GOption + - Support 64-bit integers + - Allow optional text before and after the options + in help output + +* Bug fixes: + 340538 gbase64-test writes OOB + 340816 GKeyFile set_string_list invalid memory reads + 339105 g_key_file_parse_value_as_double + 340434 convert-test.c fails (function test_one_half) + 311043 Memory leaks (and potential infinite loops) + when using G_ERRORCHECK_MUTEXES + 335198 Error checking mutexes are fubar + 341237 Add a G_OPTION_ARG_INT64 + 341192 g_io_channel_set_flags not implemented on win32 + 336120 Allow adding description before/after GOption + --help output body + 341191 misplaced check in g_relation_delete + 340530 mismatched calloc / g_free in win32 threads + +* Updated translation (es) + +Overview of Changes from GLib 2.10.x to GLib 2.11.0 +=================================================== + +* GBookmarkFile: a parser for files containing bookmarks + stored using the Desktop Bookmark specification. + +* Base64 encoding support + +* Unicode 5.0 support + +* GOption supports floating point numbers + +* GKeyFile supports floating point numbers + +* Bug fixes: + 155884 gatomic.c should be based on new SDK + 157877 update-desktop-database doesn't handle duplicate entries + 164719 keyfile parser doesn't support floats + 327662 Import BookmarkFile from libegg + 329548 Add G_OPTION_ARG_DOUBLE + 329789 option-test.c type confusion + 332841 Segmentation Fault when %llu is passed to vasnprintf and + HAVE_SNPRINTF is not defined + 333879 gthread/gthread-win32.c: IsDebuggerPresent needs '#define + _WIN32_WINDOWS 0x0401' + 333916 g_timer_elapsed docs should mention that microseconds + may be NULL + 334440 dlerror() portability issue causes crash on (old) a.out + NetBSD platform + 334646 goption + error out params + 334799 g_remove() must check return value of remove() + 334943 make check FAIL: threadpool-test + 335215 Some breakages with GThreadPool + 336085 g_option_context_new parameter lacks better explanation + 336677 Documentation for g_object_ref_sink() is incorrect + 337027 gbookmarkfile.c: sys/time.h include error + 337553 Wrong escaping of URIs + 338572 Dereferencing NULL value in g_key_file_get_group_comment + 338845 g_completion_complete_utf8 crashes when NULL is passed to it + 339337 g_bookmark_file_set_description + 339338 gbookmarkfile.c, function expand_exec_line + 339340 gbookmarkfile.c, function bookmark_app_info_dump + +* Translation updates (bg,en_GB,et,gl,gu,he,hi,ka,nb,nl,nn, + or,pt_BR,ro,tr,vi,zh_CN) + + +Overview of Changes from GLib 2.10.0 to GLib 2.10.1 +=================================================== + +* Bugs fixed: + 314794 Broken pthread detection on Darwin [Gregor Riepl] + 322476 Missing check for .dylib [Vladimir Panov] + 333651 Inconsistent _g_charset_get_aliases prototype [Julio + M. Merino Vidal] + 333761 GInitiallyUnowned breaks application code [Sven Herzberg] + +* Win32 changes: + - Fix g_listenv() implementation. + - Allow up to 100 GPrivate structs + +* Translation updates (fr,hu,lt,pl,sv) + + +Overview of Changes from GLib 2.9.6 to GLib 2.10.0 +================================================== + +* Bugs fixed: + 328997 64bit pointer trunction in glib slab-allocator + [Pascal Hofstee] + 331110 g_cond_broadcast(inform_cond) without holding + inform_mutex [Chris Wilson, Sebastian Wilhelmi] + 332093 Fix some leaks in the tests [Kjartan Maraas] + 332435 g_utf8_strlen returns wrong value if a maximum + number of bytes to check is specified + [Matthias Clasen] + 331367 gslice requires more POSIX-like semantics for + GPrivate destructors [Tor Lillqvist] + +* Documentation improvements [Matthias, Kang Jeong-Hee, + Tor Lillqvist, Stefan Kost] + +* Translation updates (el,eu,ka,uk) + +Overview of Changes from GLib 2.9.5 to GLib 2.9.6 +================================================= + +* Bugs fixed: + 329124 distclean removes README [Kjartan Maraas, Tim Janik] + 317679 GRelation field type not documented [Behdad Esfahbod] + 329123 Typo in GTime docs [Kjartan Maraas] + +* Documentation improvements [Sven Herzberg, David + Schleef, Kjartan Maraas, Behdad Esfahbod] + +* Translation updates (cs,cy,it,ko,pt,sq,sr,sr@Latn,ru + +Overview of Changes from GLib 2.9.4 to GLib 2.9.5 +================================================= + +* Memory management: + Runtime debugging support: The slice allocator + can be turned off by setting G_SLICE=always-malloc + in the environment. Zeroing of freed memory can + now be turned on at runtime by setting + G_DEBUG=gc-friendly in the environment. [Tim Janik] + +* Bugs fixed: + 328253 HP-UX/IA-64 uses ".so" as default shared library + extension [Albert Chin] + 143380 unicode-encoding test fails converting to UTF-16 + with libiconv [Marc Moorcroft] + 328254 Build breakage (GSlice) [Jens Ganseuer] + 328705 C99ism in glib/gmem.c [Kazuki Iwamoto] + +* Translation updates (da,et,zh_CN) + +Overview of Changes from GLib 2.9.3 to GLib 2.9.4 +================================================= + +* Type system: + Fix a problem with g_object_compat_control() which + can lead to segfaults in GTK+ applications on 64bit + platforms. + +* Thread suppport: + Unused threads now fall back to the global pool after + 500 milliseconds, where they wait for another + max-idle-time milliseconds. [Sebastian Wilhelmi] + +* Fix a memory allocation problem in GKeyFile. [Morten + Welinder] + + +Overview of Changes from GLib 2.9.2 to GLib 2.9.3 +================================================= + +* GTree: + - Replace the simple recursive implementation by + a nonrecursive, threaded one [Maurizio Monge] + +* Change g_filename_display_name and + g_filename_display_basename to use the Unicode + replacement character U+FFFD instead of a question + mark, and don't append "(invalid encoding)" [Matthias] + +* Documentation improvements [Sven Herzberg, Federico + Mena Quintero, Stefan Kost] + +* Bugs fixed: + 323937 gslice.c in glib 2.9.1 doesn't build on Mac OS X + [Bogdan Nicula] + 326558 Some test failures on IRIX 6.5 [Daichi Kawahata] + 169285 "threaded" tree implementation for GTree + [Maurizio Monge] + 326747 g_filename_display_basename adds (invalid encoding) + [Alberto Ruiz] + +Other contributors: Christian Kellner, Murray Cumming + +New and updated translations (bg,ca,de,es,et,gu,ja,nl,th,vi) + + +Overview of Changes from GLib 2.9.1 to GLib 2.9.2 +================================================= + +* Memory management: + - Add tests for cache colorization [Tim Janik] + - Minimize space consumption if small amounts of differently + sized slices are allocated, at a small performance cost. [Tim] + +* Thread support: + - Add g_atomic_pointer_set() and g_atomic_int_set() [Tim Janik, + Sebastian Wilhelmi] + - Add g_thread_pool_set_sort_function() to allow sorting the + tasks of a threadpool. [Martyn Russell] + - Add g_thread_pool_set_idle_time() to allow unused threads + to exit after a certain time. [Martyn] + +* Type system: + - introduce a new type GInitiallyUnowned, which has an initial + floating reference. [Tim] + - Add support for GType parameters. [Matthias] + +* Main loop: + - Add g_main_context_is_owner() to determine if the current + thread is the owner of the context. [Michael Meeks] + +* Provide g_access(), g_chdir(), g_unlink(), g_rmdir() as + wrapper functions instead of macros. [Manish Singh] + +* Documentation improvements [Tim, Matthias, Federico Mena Quintero, + Stefan Kasal, Dan Williams] + +* New and updated translations (en_CA,fi,fr,gl,ml,nb,no,zh_HK,zh_TW) + +* Bugs fixed: + 324179 g_allocator_new() returns pointer to const dummy which Gtk+ 2.8 + tries to modify [J. Ali Harlow] + 324332 g_option_context_parse() returns false without setting error + [Tim-Philipp Müller] + 324950 GLIB 2.9.1 testcase errors [Dan Yefimov] + 325015 gslice.c: process.h is needed on Windows [Kazuki Iwamoto] + 321978 G_DATALIST_GET_FLAGS() macro is not casting datalist to + gpointer [Andrew Paprocki] + 316221 G_LOCK warns about breaking strict-aliasing [Michal Benes, + Stanislav Brabec] + 325273 Error in documentation for glib_check_version () [Declan Naughton] + 325310 g_spawn_sync hangs when catching both stdout and + stderr [Tor Lillqvist] + 325249 gcc warning when using g_rmdir from [Jani Monoses] + 325864 glib/gthreadpool.c:"#define debug(...)" is C99 [Kazuki Iwamoto] + 325874 Should say somewhere that source IDs are > 0 [Dan Williams] + 325438 a typo (compatability) [Stefan Kasal] + 323937 gslice.c in glib 2.9.1 doesn't build on Mac OS X [Bogdan Nicula] + + +Overview of Changes from GLib 2.9.0 to GLib 2.9.1 +================================================= + +* Memory management + - The slice allocator is implemented [Tim Janik] + - g_slice_free_chain() has been renamed to + g_slice_free_chain_with_offset() [Tim, Behdad Esfahbod] + - Mem chunks are deprecated [Matthias Clasen] + +* Data structures + - Hash tables are refcounted, and have a boxed type [Tim] + +* Thread support + - Support for Solaris threads has been removed + [Sebastian Wilhelmi, Andrew Paprocki] + - g_async_queue_sort(), g_async_queue_push_sorted() have + been added to allow GAsyncQueue to be used as a priority + queue, together with the corresponding _unlocked + variants [Martyn Russell] + +* GObject: + - The concept of a floating initial reference has been + moved from GtkObject to GObject [Tim] + +* Win32 changes: + - Make g_rename() replace existing files [Tor Lillqvist] + +* Misc new API: + - G_GUINT64_CONSTANT macro to define guint64 + constants [Andrew Paprocki] + - G_GNUC_WARN_UNUSED_RESULT macro to instruct the + compiler to emit a warning if the value returned + by a function is ignored. [Arjan van de Ven, Alex Larsson] + - GList and GSList now have sort functions which take an + extra user data argument [Martyn Russell] + - g_param_spec_ref_sink() has been added for consistency [Tim] + +* $LOGNAME is respected when determining user data. [Laszlo Peter] + +* Other changes and bug fixes [Tim, Matthias, Behdad, + Christian Persch, Benedikt Meurer, Andrew Paprocki, + Kazuki Iwamoto, Alexis S. L. Carvalho, Stanislav Brabec, + Andreas Schwab, Kalle Vahlman] + +* Documentation + - Deprecation warnings carry version information [Matthias] + - The slice allocator has been documented [Matthias, Tim] + - Other improvements [Morten Welinder] + +Overview of Changes from GLib 2.8.x to GLib 2.9.0 +================================================= +* Unicode support: + - The Unicode tables have been updated to Unicode 4.1, + adding several new values to the GUnicodeBreakType + enumeration. This breaks Pango <= 1.10 + [Behdad Esfahbod] + - The various Unicode character predicate functions + (g_unichar_isalpha, g_unichar_isdigit,...) have + been optimized + [Behdad] + - g_utf8_pointer_to_offset, g_utf8_offset_to_pointer: + These functions handle negative offsets now, and + going backwards in g_utf8_offset_to_pointer uses + "stutter stepping". + [Larry Ewing, Matthias Clasen] + +* Memory management: + - Mem chunks are no longer used internally in GLib and + GObject. GMemChunk will be deprecated in GLib 2.10 + - All APIs based on GAllocator (g_list_push/pop_allocator, + and similar push/pop_allocator functions for other + data structures) have been deprecated, since they + never worked as intended. + - The g_slice_* functions have been added as a + new API for fast allocation of small memory blocks. + The implementation in GLib 2.9.0 is just a simple + wrapper around malloc. GLib 2.10 will have an + efficient and scalable implementation. + [Tim Janik, Matthias] + +* Pattern matching: + - g_pattern_match has been optimized to avoid + unnecessary recursion. + [Tim, Matthias] + +* g_intern_string, g_intern_static_string: + - New functions to intern strings. These are now used + by GObject to avoid duplicating static strings + [Matthias] + +* g_thread_foreach: + - New function to iterate over all GThreads + [Tim, Matthias] + +* g_date_set_time_t, g_date_set_time_val: + - New functions to set a GDate from a time_t or + GTimeVal value. g_date_set_time has been deprecated + in favor of these. + [Roger Leigh] + +* g_snprintf and g_vsnprintf: + - These functions are no longer declared in gprintf.h, + since they are in glib.h + [Matthias] + +Overview of Changes from GLib 2.8.0 to GLib 2.8.1 +================================================= +* Optimize single-character insertions in GString [Ross Burton] +* Fix build problems on OS X +* Fix build problems on Win32 [Tor Lillqvist, Hans Breuer] +* Other bug fixes [Matthew F. Barnes, Stepan Kasal] +* Documentation improvements [Tristan van Berkom, Behnam + Esfahbod, Gustavo Carneiro, Stepan Kasal, Matthias] +* New and updated translations (ca,cy,ko,ro,uk) + +Overview of Changes from GLib 2.7.7 to GLib 2.8.0 +================================================= +* Make g_value_transform() handle enum values + correctly on ppc64. [Michael Lorenz] + (Third-party code accessing enumeration values + in GValues should also be changed to access + v_long, not v_int, in order to work on bigendian + 64bit machines.) +* Make g_flags_get_first_value() handle a value + of 0 meaningfully. [Tim-Philipp Müller] + +Overview of Changes from GLib 2.7.6 to GLib 2.7.7 +================================================= +* Make atomic operations on s390 work [Matthias] +* Fix C++ guards in gstdio.h [Tor Lillqvist] + +Overview of Changes from GLib 2.7.5 to GLib 2.7.6 +================================================= +* Add native implementations of atomic operations + on s390 [Matthias] +* Make atomic reference counting of closures + work on s390 [Matthias] +* Avoid an infinite loop in g_convert_with_iconv(). + [Sebastian Bacher] +* Documentation improvements [Ross Burton] + +Overview of Changes from GLib 2.7.4 to GLib 2.7.5 +================================================= +* Thread-related changes + - Fix build issues on HP-UX [Paul Cornett] + - Threadsafe access to flags stored in datasets [Tim Janik] + - Fix several issues with atomic refcounting for + closures, objects and paramspecs [Tim] + - Improve tests for atomic refcounting changes [Tim] +* Fix handling of stateful encodings in g_convert_* [Matthias] +* Fix translation of GOption help output [Dan Winship] +* Catch format errors in translations. This may cause + "make check" to fail when using older versions + of gettext [Matthias] +* Win32 bug fixes [Tor Lillqvist] +* Documentation improvements [Ross Burton, Jochen Baier, + Matthias, Tim] +* New and updated translations (de,fi,gu,pl,pt,tr,zh_TW) + +Overview of Changes from GLib 2.7.3 to GLib 2.7.4 +================================================= +* Fix g_atomic_pointer_compare_and_exchange + on Sparc64 [Gert Doering] +* Fix a hang in g_thread_pool_free. [Hong Jen Yee] +* Win32 bug fixes [Tor Lillquist] +* Other bug fixes [Benoit Dejean, Manish Singh] +* Documentation improvements [Bryan Silverthorn, + Callum McKenzie] +* New and updated translations (de,lt,sq,zh_CN) + +Overview of Changes from GLib 2.7.2 to GLib 2.7.3 +================================================= +* GOption + - Allow callbacks with optional arguments [Pawel Sliwowski] + - Allow to turn off the automatic long option name + disambiguation [Adam McLaurin] + - Only allow printable ASCII as short option names [Matthias] +* Win32 + - Build fixes [Tor Lillqvist] + - Rewrite iochannel socket implementation [Tor] +* GObject + - Threadsafety improvements; in particular, refcounting + of objects is done atomically now. [Wim Taymans, Tim Janik] +* Bug fixes [Morten Welinder, Matthias, Wim Taymans] +* Documentation improvements [Richard Laager, Matthias] +* New and improved translations (bf,cs,hu,nb,nl,no) + +Overview of Changes from GLib 2.7.1 to GLib 2.7.2 +================================================= +* Win32 build fixes [Hans Breuer] +* Bug fixes [Mikael Magnusson] +* Documentation improvements [Matthias Clasen] +* New and updated translations (en_CA,es,et,ja,sr,sr@Latn,zh_TW) + +Overview of Changes from GLib 2.7.0 to GLib 2.7.1 +================================================= +* GOption + - Allow callback arguments without parameters [Dan Winship] +* GMappedFile: an mmap wrapper [David Schleef, Behdad Esfahbod] +* Misc new functions: + - g_get_host_name [Tor Lillqvist] + - g_mkdir_with_parents [Tor] + - g_build_pathv, g_build_filenamev [Todd A. Fisher, + Matthias Clasen] +* Bug fixes [Roger Leigh, Masatake YAMATO, Kjartan Maraas, + Manish Singh, Tor, Murray Cumming, Kian Duffy, Morten Welinder] +* Documentation improvements [Hong Gang XU, Dan Winship, Matthias] +* New and updated translations (bg,cs,da,en_CA,es,et,nb,nl,no, + sk,th,zh_TW) + +Overview of Changes from GLib 2.6.x to GLib 2.7.0 +================================================= +* GKeyFile + - Add unit tests [Matthias Clasen, Suren A. Chilingaryan] + - Accept \r\n as line end [Bastian Nocera] + - Don't interpret leading zeros as octal numbers. [Matthias] + - Make key and group removal work [David Hoover, Matthias Hasselmann] +* GOption + - Improve formatting of --help output [Matthias, Noah Levitt] + - Accept -? [Matthias] + - Warn about duplicate main groups [Jeff Franks] + - Treat '-' as non-option argument [Tim Musson, Thomas Leonard] + - Report missing arguments as errors [Björn Lindqvist] + - Add a boxed type for GDate [Tim-Philipp Müller] +* GTree + - g_tree_remove() and g_tree_steal() return status information [Matthew F. Barnes] +* Stdio wrappers + - Work regardless of large file support [Manish Singh] + - Add g_access(), g_chmod(), g_creat(), g_chdir [Tor Lillqvist] +* GObject + - Implement "toggle references" to help language bindings [Owen Taylor] + - Allow to mark names, nicks and blurbs of pspecs as static [Ben Maurer, Matthias] + - Make pspec lookup a bit faster [Morten Welinder] +* Add g_listenv() to list all set environment variables [Hans Petter Jansson] +* Add g_file_set_contents() to atomically write a file. [Søren Sandmann, + Sven Neumann, Manish, Alexis S. L. Carvalho] +* Add g_try_malloc(), g_try_new(), g_try_new0() and g_try_renew() [Stefan Kost] +* Add g_utf8_collate_key_for_filename() to sort filenames taking + extensions and numeric suffixes into account. [Ole Laursen, Alex Larsson] +* Add G_GNUC_NULL_TERMINATED to mark varargs function with + NULL-terminated argument lists. [Marc Meissner] +* Win32 changes + - Improved debugability [Ulf Lamping, Hans Breuer] + - Make filename handling more robust [Tor, Billy Skaggs] + - Improve g_get_system_data_dirs() [Tor] + - Use more precise timers [Tor] + - Build fixes [Kazuki Iwamoto, Hans, Tor, Robert Ögren] +* Other bug fixes [Roger Leigh, Owen, Matthias, Morten, Kjartan Maraas, + Pawel Sakowski, Tor, Simon Budig, Ed Avis, Manish, Nicolas Laurent, + Bastien, Fabrício Barros Cabral, Michael Banck, Daniel Atallah, + J. Ali Harlow, Tim Janik, Hazael Maldonado Torres, Sven, Jon-Kare Hellan, + Dave Benson, Tommi Komulainen, Benjamin Otte, Brian Cameron, Changwoo Ryu, + Christian Biere, Noah, Benoît Carpentier] +* Documentation improvements [Vincent Untz, Matthias, Tim-Philipp Müller, + Morten, Matthew, Federico Mena Quintero, Sebastian Bacher, Oliver Sessink, + Stefan, Jared Lash, Tor, Owen, Daniel Vaillard, Mathieu Lacage] +* New and updated translations (ca,cs,da,el,en_CA,en_GB,es,et,eu,fa,fr,gl, + hu,id,it,lt,mn,ne,nl,pl,pt,pt_BR,ro,rw,sk,sq,sr,sr@Latn,tl,uk,xh,zh_CN) + +Overview of Changes from GLib 2.6.0 to GLib 2.6.1 +================================================= +* GOption + - Make gtk_init(NULL, NULL) work again [Marcin Krzyzanowski] + - Improve handling of -- [Matthias Clasen] + - Don't show G_OPTION_REMAINING in --help output [Matthew F. Barnes] +* g_find_program_in_path() doesn't return directories [Tommi Komulainen] +* Add gmodule-export-2.0.pc [Matthias] +* Win32 changes + - Improve hangling of UNC paths [Tor Lillqvist] + - g_getenv(), g_setenv(), g_unsetenv(), g_find_program_in_path() + take and return UTF-8 now [Tor] + - Make g_file_test() work more reliably, and use PATHEXT + when check for executables [Tor] + - Build and cross-compilation fixes [J. Ali Harlow] +* Other bug fixes [Jens Hatlak, Morten Welinder, + Tor, Kalpesh Shah, Adrian Bunk] +* Documentation improvements [Marcin Krzyzanowski, Tor, Crispin + Flowerday, Mariano Suárez-Alvarez, Christian Biere, Danny Milo, + Vincent Untz, Bastien Nocera] +* New and updated translations (cy,de,nl,ru,sq,sv) + +Overview of Changes from GLib 2.4.x to GLib 2.6.0 +================================================= + +* Major new APIs + - GOption, a commandline option parser + - GKeyFile, a parser/editor for the .ini like files + - Functions to support the XDG basedir specification + - Wrappers for common POSIX pathname functions to handle filename + encodings consistently. On Windows, these use UTF-8. + +* Miscellaneous new functions + - g_filename_display_name() converts filenames in displayable UTF-8 strings + - g_uri_list_extract_uris() splits uri lists + - g_date_get_iso8601_week_of_year() gets ISO 8601 week numbers + - g_log_set_default_handler() installs an alternate default log handler + - g_get_language_names() obtains a list of applicable locale names + - g_strv_length() calculates the length of NULL-terminated string arrays + - g_win32_get_windows_version() determines the Windows version + - G_GNUC_INTERNAL marks functions as non-exported + - glib_check_version() checks the GLib version at runtime + - g_debug() completes the family of logging functions + +* Performance improvements + - Optimize g_utf8_validate() + - Optimize g_markup_parse_context_parse() + - Reduce signal connection complexity from O(n) to O(1) + - Get rid of many PLT entries for internally used exported symbols + - Reduce code size by removing literal strings from g_return_if_fail() + +* Other changes + - On Windows, GLib functions that take file name arguments now require + those to be in UTF-8. Functions that return file names return UTF-8. + - Use higher precision for mathematical constants + - Don't convert to/from UTF-8 in g_filename_to_uri/g_filename_from_uri + - Support ll as printf format modifier for long long on all platforms + - Clean up the ABI and enforce the list of exported symbols + - Add a .pc file for using gmodule in libraries + - Require ngettext + +Overview of Changes from GLib 2.5.7 to GLib 2.6.0 +================================================= +* GOption: Don't list help options if group-specific + options have been requested [Glynn Foster] +* Make g_get_language_names() track locale changes [Christian Persch] +* Win32 bug fixes [Tor Lillqvist] +* Bug fixes [Philippe Blain, Owen Taylor, Sebastian Wilhelmi] +* New and updated translations (da,es,ja,lt,zh_CN) +Bugs fixed: 159530,100697,160271,160645,157255 + +Overview of Changes from GLib 2.5.6 to GLib 2.5.7 +================================================= +* Optimize g_utf8_validate() [Owen Taylor, Matthias Clasen] +* Optimize g_markup_parse_context_parse() [Havoc Pennington, + Morten Welinder] +* Reduce signal connection complexity from O(n) to O(1) + [Sven Neumann] +* Add a .pc file for using gmodule in libraries [Owen] +* Add G_GNUC_MALLOC to mark functions returning newly + allocated memory [Matthias] +* Win32 bug fixes [Hans Breuer, Tor Lillqvist, Robert Ögren, + Bruce Hochstetler] +* Bug fixes [Kazuki IWAMOTO, Matthias, Manish Singh, Morten, + Frederic Crozat, Tor] +* Documentation improvements [Matthias, Tor, Owen] +* New and updated translations (cs,da,de,en_CA,en_GB,es,nb,nl,sq,zh_CN) + +Overview of Changes from GLib 2.5.5 to GLib 2.5.6 +================================================= +* GOption + - Add G_OPTION_FLAG_REVERSE to allow options + which unset a boolean variable [Tor Lillqvist] +* GChildWatch + - Use sigaction instead of signal [Jonas Jonnson, + Archana Shah] + - Make the very first SIGCHLD work [Gustavo Carneiro] +* Bug fixes [Morten Welinder, Tor, David MacLachlan, + Manish Singh, J. Ali Harlow] +* Documentation improvements [Matthias Clasen, Tor] +* Updated translations (da,ja,tr,zh_CN) + +Overview of Changes from GLib 2.5.4 to GLib 2.5.5 +================================================= +* GKeyFile + - Cleanups, add more error checking [Ray Strode] + - Fall back to the untranslated string when getting + locale strings [Mark McLoughlin] +* GOption + - Document GOption [Matthias Clasen] + - Better support for rest arguments [Owen Taylor, Matthias] + - Handle conflicts between groups [Matthias] +* Add g_lstat() to the stdio wrappers [Tor Lillqvist] +* Add g_filename_display_name() to convert filenames + in displayable UTF-8 strings [Alex Larsson, Matthias] +* Win32 bug fixes [Kazuki IWAMOTO, Hans Breuer, Tor] +* Bug fixes [Christophe Fergeau, Morten Welinder, + Owen, Kjartan Maraas, Mark] +* Documentation improvements [Matthias, Tor] + +Overview of Changes from GLib 2.5.3 to GLib 2.5.4 +================================================= +Add GKeyFile, a parser/editor for the .ini like files used in various + freedesktop.org specifications. [Ray Strode] +Make the handling of filename encodings consistent across all + GLib functions, introduce wrappers for common POSIX + functions which accept the same filename encoding. [Tor Lillqvist, + Owen Taylor] +GOption + - Rename g_context_option_error_quark() to a more language-binding + friendly name [Murray Cumming] + - Accept backslashes in filenames on Win32 [Tor Lillqvist] +* Strip the internal aliasing prefix IA__ from function names in + assertions [Matthias Clasen] +* Add a function to split uri lists. [Matthias] +* Win32 bug fixes + - Don't open console windows [Tor] +* Other bug fixes [Philippe Blain, Robert Ögren, Hidetaka Iwai, Matthias, + Morten Welinder, Mats-Ola Persson, Tor, Nickolay V. Shmyrev, Kjartan Maraas, + Anders Carlsson, Tim-Philipp Müller, Lucas Rocha, Andrea Campi, Manish + Singh, Thomas Fitzsimmons, Kazuki IWAMOTO] +* Documentation improvements [Matthias, Linus Walleij, Nickolay, Philippe, + Adam Hooper, Gustavo Carneiro] +* New and updated translations (cs,en_CA,en_GB,ja,nb,nl,or,sr,sr@Latn,sq) + +Overview of Changes from GLib 2.5.2 to GLib 2.5.3 +================================================= +* GOption + - set the program name from argv[0] [Masatake YAMATO] + - make contexts work without a main group [Anders Carlsson] +* Performance + - Get rid of many PLT entries for internally used exported symbols, + and clean up the ABI at the same time and make make check check the + list of exported symbols. [Matthias Clasen] +* Add API to get ISO 8601 week numbers [Niklas Lundell] +* Add API to install an alternate default log handler [Darin Adler] +* Add API to obtain a list of applicable locale names [Hidetoshi Tajima] +* Reduce code size bloat by removing literal strings from + the g_return_if_fail() macros [Owen Taylor] +* Add g_strv_length [Tim-Philipp Müller] +* Win32 changes + - Add API to determine the Windows version [Tor Lillqvist] +* Other bug fixes [Stepan Kasal, Anders, Tor, Kazuki Iwamoto, + Manish Singh] +* Documentation improvements [Morten Welinder, Matthias] +* New and updated translations (es,nn,ro) + +Overview of Changes from GLib 2.5.1 to GLib 2.5.2 +================================================= +* Add G_GNUC_INTERNAL macro [Arjan van de Ven] +* Add GOption, a commandline option parser [Anders Carlsson] +* Add glib_check_version [Michael Natterer] +* Add XDG basedir API [Ray Strode] +* Require ngettext [Danilo Segan] +* Bug fixes [Manish Singh, Ray Strode, Vincent Noel, + Jon-Kare Hellan, Jody Goldberg] +* Win32 bug fixes [Tor Lillqvist, Hans Breuer, Peter Zelezny] +* Documentation improvements [Matthias Clasen, Vincent Untz, Christian Persch] +* New and updated translations (bs,eu,fi,gu,ne,pa) + +Overview of Changes from GLib 2.5.0 to GLib 2.5.1 +================================================= + +* Bug fixes [Oliver Guntermann, Sven Neumann, James + Henstridge, Hiroyuki Ikezoe, Matthias Clasen, Robert + Ögren, Tommi Komulainen] +* Documentation improvements [Soeren Sandmann, + Christophe Fergeau, Danek Duvall] +* New and updated translations (eu,hi) + +Overview of Changes from GLib 2.4.1 to GLib 2.5.0 +================================================= + +* New functions g_debug [Sven Herzberg] +* Use higher precision for mathematical constants [Morten + Welinder] +* Don't convert to/from UTF-8 in g_filename_{to,from}_uri + [Federico Mena Quintero] +* Win32 + - Handle empty digit string in printf() functions + correctly [Tor Lillqvist] + - Support ll as format modifier for long long [Tor] + - Be more careful about HOME [Tor, Ivan Wong] + - Bug fixes [John Ehresman] +* Miscellaneous bug and portability fixes [Danilo Segan, + Owen Taylor, Nikolai Weibull, Benoît Carpentier, Morten + Welinder, Manish Singh, Sven Neumann, Julio M. Merino Vidal, + Kaz Sasayama, Murray Cumming, Federico, Mariano Suarez-Alvarez] +* Documentation updates [Matthias Clasen, Crispin Flowerday, + Tommi Komulainen, Federico Mena Quintero, Ed Griffiths] +* New and updated translations (ja,ne,no,wa) + +Overview of Changes from GLib 2.4.0 to GLib 2.4.1 +================================================= + +* Win32 bug fixes [Tor Lillqvist, Roger Leigh, John Ehresman] +* Miscellaneous bug and portability fixes [Owen Taylor, + Matthias Clasen, Jonas Jonsson, Christian Krause, + Nickolay V. Shmyrev, Christophe Saout, Philippe Blain, + Piotr Klaban] +* Documentation updates [Matthias] +* New and updated translations (ca,cs,cy,el,en_CA,en_GB,es,eu,fi, + fr,gu,he,id,nl,pt,pl,ru,sr,sr@ije,sr@Latn,sv,uk) + +Overview of Changes from GLib 2.3.6 to GLib 2.4.0 +================================================= + +* Handle invalid-UTF-8 in g_log() properly [Matthias Clasen] +* Win32 bug fixes [Tor Lillqvist, Bruce Hochstetler] +* Miscellaneous bug and portability fixes [Olivier Biot, David L. Cooper II, + Kjartan Maraas, Frédéric L. W. Meunier, Christof Petig, Manish Singh, + Sebastian Wilhelmi] +* Documentation updates [Owen] +* Updated translations (hr,ro) + +Overview of Changes from GLib 2.3.5 to GLib 2.3.6 +================================================= + +* GAtomic bug fixes [Sebastian Wilhelmi, Mark McLoughlin] +* GMain threading fixes and improvements [Sebastian] +* Win32 [Tor Lillqvist] + - restore some symbols extraneously exported from gobject to maintain ABI compatibility + - Misc build improvements and fixes [Tor, Cedric Gustin, Hans Breuer] +* Documentation updates [Sebastian, Takeshi AIHANA, Matthias, Sven Herzberg] +* New and updated translations (be,es,fi,ga,pa,sr@ije,zh_CN) + +Overview of Changes from GLib 2.3.3 to GLib 2.3.5 +================================================= + +* Make glib-mkenums parse initializers with macros. [Matthias Clasen, muppet] +* Respect locale era in g_date_set_parse(). [Theppitak Karoonboonyanan] +* Add atomic operations and use it for the async queue and + gonce implementation. [Sebastian Wilhelmi] +* Documentation improvements [Sebastian, Matthias, Sven Herzberg] +* Add g_main_depth() for finding the recursion depth of the main + loop [Owen Taylor, Tim Janik, Stefan Westerfeld] +* Add g_spawn_close_pid(), needed on win32 [J. Ali] +* Win32 fixes. [Hans Breuer, J. Ali Harlow] +* Misc bugfixes [Sebastian, Matthias, Balazs Scheidler, Owen] +* Updated translations (cy,et,ga,sq) + +Overview of Changes from GLib 2.3.2 to GLib 2.3.3 +================================================= + +* Add a native AIX gmodule implementation. [Laurent Vivier] +* Add g_node_copy_deep(). [James M. Cape, Matthias Clasen] +* Extend GQueue API to match the GList API. [Soeren Sandmann] +* Add g_hash_table_find(). [Tim Janik] +* Add a G_MODULE_BIND_LOCAL flag. [David Schleef] +* Inline g_string_append_c() when possible. [Owen Taylor, Tim] +* Wrap waitpid() as a GSource. [Jonathan R. Blandford] +* Add g_completion_complete_utf8(). [Theppitak Karoonboonyanan, + Matthias] +* Add g_strsplit_set(). [Soeren] +* Documentation improvements. [Vincent Untz, Sebastian Wilhelmi, + Soeren, Matthias] +* Win32 build fixes. [Tor Lillqvist] +* Misc bugfixes [Manish Singh, Noah Levitt, Simon Josefsson, + Morten Welinder, Damien Carbery, Julio M. Merino Vidal, Sebastian, + Matthias] +* Updated translations (nn,cs,it,ko,sq,ms,az,hr,uk,sr,sr@Latn,sq,ta) + +Overview of Changes from GLib 2.3.1 to GLib 2.3.2 +================================================= + +* Add G_MAXSIZE. [Manish Singh] +* Add g_rand_new_with_seed_array(), g_rand_set_seed_array(), + implementing the init-by-array functionality of the + original mersenne twister. Add g_rand_copy(). Improve seeding. + [George Lebl] +* Add a lowercase_name option to glib-mkenums. [Murray Cumming] +* Add g_ptr_array_foreach(). [Matthias Clasen] +* Add g_timer_continue(). [Tim-Philipp Müller] +* Fix a threadsafety issue in mem chunks. [Matthias, Balazs Scheidler] +* Fix g_filename_{to,from}_utf8() on Win32 and improve + g_file_test() there too [Hans Breuer] +* Add a boxed type for NULL-terminated string arrays. [Matthias] +* Add G_DEFINE_TYPE() plus variants to ease the constuction + of GObject boilerplate code. [Tim Janik] +* Support & in password GECOS field [Matthias, Soeren Boll Overgaard] +* Documentation improvements [Matthias, Manish] +* Win32 build fixes [Hans] +* Misc bug fixes [Damien Carbery, Matthias, Manish, Olivier Poncet, + Zack Rusin] +* Updated translations (ar,de,fa,ga,mn,nn,no,sq) + +Overview of Changes from GLib 2.3.0 to GLib-2.3.1 +================================================= + +* Add glib/gi18n.h and glib/gi18n-lib.h for common + gettext support, including a Q_() macro for translation + with context [Matthias Clasen] +* Add a more flexible G_FILENAME_ENCODING variable + as a replacement for G_BROKEN_FILENAMES [Matthias] +* Fix the return value g_main_context_iterate() for + newly ready sources [Padraig O'Briain] +* Handle Hangul composition for normalization [Noah Levitt] +* Add G_{MIN,MAX,MAXU}INT{8,16,32}. [Mark Jones, Matthias] +* Add G_GSIZE_FORMAT/G_SSIZE_FORMAT [Manish Singh] +* Add G_STRFUNC as a portable wrapper for __func__ [Tim Janik] +* Documentation improvements [Matthias] +* GObject [Tim Janik] + - Support '-' in g_signal_connect()/disconnect() names + like 'swapped-signal'. + - Add g_type_class_peek_static() and use to optimize + g_object_new() for static types [Tim] + - Allow setting construct-only properties from within + init() implementations + - Enforce readability/writeability in g_object_set/get() +* Fix bug with g_ascii_strtod and multi-byte separator. + [Behdad Esfahbod, Roozbeh Pournader] +* Misc bug fixes [Matthias, John Ehresman, Andrew Lanoix, + Tor Lillqvist, Mark McLoughlin, Tim-Philipp Müller, Manish, + Morten Welinder] +* Updated translations (ca,cs,da,es,fr,ja,nn,no,pt,ru) + +Overview of Changes from GLib 2.2.x to GLib-2.3.0 +================================================= + +* Replace Trio printf by gnulib vasnprintf [Matthias Clasen] +* Update Unicode data to Unicode 4.0 [Noah Levitt] +* Support XML-safe formatted output with + g_markup_[v]printf_escaped [Owen Taylor] +* Add g_file_read_link to read symbolic links [Matthias] +* Add g_unichar_get_mirror_char to obtain the + mirrored variant of a character [Noah] +* Support for one-time initialization functions. + [Sebastian Wilhelmi] +* Miscellaneous API additions: g_vasprintf + g_string_chunk_insert_len, g_setenv, g_unsetenv [Matthias] +* Docs improvements [Matthias] +* Add support instance-private data on classed types + [Mark McLoughlin, Tim Janik, Owen] +* Optimize signal emissions [Soeren Sandmann, Tim] +* Support a "default vtable" per interface [Tim] +* Add support for properties on interfaces [Owen, Tim] +* Miscellaneous API additions: g_value_take_string(), + g_value_take_param(), g_value_take_object(), + g_value_take_boxed(). [Matthias] +* Win32 build fixes [Tor Lillqvist] + +Overview of Changes from GLib 2.1.5 to GLib-2.2.0 +================================================= + +* Fix a problem with g_thread_init() on 64-bit problems + [Alceste Scalas, Sebastian Wilhelmi] +* Add assembly implementations of byteswap macros + for ia64 and x86_64. [Manish Singh] +* IOChannel fixes for Win32 [Tor Lillqvist, Thorsten Maerz] +* Updated translations (bg,ca,es,da,fi,lv,ru,sk) + +Overview of Changes from GLib 2.1.4 to GLib-2.1.5 +================================================= + +* Win32 bug fixes [Tor Lillqvist] +* Various post-rewrite fixes for glib-gettext.m4 [Owen Taylor, + Jody Goldberg, Kjartan Maraas, Johannes Stezenbach] +* Ensure we have a GUINT64_FORMAT by pulling in Trio + if necessary [Manish Singh] +* Further Trio build fixes [Matthias Clasen, Owen] +* Hack around gcc, libtool issues with -pthread [Owen] +* Docs improvements [Matthias] +* Bug and portability fixes +* Updated and new translations (bg,de,fi,fr,sq,fr) + +Other contributors: Kai Poitschke, Morten Welinder + +Overview of Changes from GLib 2.1.3 to GLib-2.1.4 +================================================= + +* autoconf changes to make it possible to cross compile + GLib. [Owen Taylor, Dan Kegel, Amy Lin, Dimi Shahbaz, + Johannes Stezenbach] +* Use libintl when it has bind_textdomain_codeset() and + GLib doesn't. [Owen] +* Improve generation of pseudo-random integers [Morten Welinder, + Sebastian Wilhelmi] +* Avoid literal UTF-8 in favor of octal escapes [Owen, Tomas Ogren] +* Cleanup include order [Sven Neumann] +* autoconf cleanups and bug fixes [Daniel, Matthias Clasen, Owen] +* Doc fixes and additions [Matthias] + +Other contributors: James M. Cape, Frederic Crozat, Martin Gansser, + Phuc LeHong, Manish Singh, Joshua Weage, Morten Welinder + +Overview of Changes from GLib 2.0.x to GLib-2.1.x +================================================= + +* Add copy of the Trio library to build and use for printf() when + system printf isn't good enough. Add g_printf()/etc. [Matthias Clasen] +* Add g_str_has_suffix()/g_str_has_prefix() [Alex Larsson] +* Add g_markup_parse_context_get_element() [Matthias] +* Add g_utf8_strreverse [Matthias] +* Add g_ascii_strtoull() [Tim Janik] +* Support scanning of 64-bit values with GScanner [Tim] +* Add g_set/get_application_name() [Havoc Pennington] +* Add G_LIKELY()/G_UNLIKELY() macros for hinting branch probabilities. + Use for g_return_if_fail(). [Matthias Clasen] +* Add G_GNUC_DEPRECATED macro [Tom Tromey] +* Improve the seeding algorithm of GRandom to avoid problems + with certain pathological seeds. Support G_RANDOM_VERSION=2.0 + environment variable. [Sebastian Wilhelmi] +* Improve thread configure checks, use -pthread where applicable + [Sebastian] +* Improve handlng of thread priorities [Sebastian] +* Fix up parameter names that might shadow functions from + system headers [Soeren Sandmann] +* Clean up usage of deprecated functions [Manish Singh] +* Docs fixes and improvements. In particular, include "Since" information. + [Matthias, Soeren, Martin Schulze, Daryll Strauss, Bill Janssen, + Owen Taylor, Morten Welinder]. + +Overview of Changes in GLib 2.0.7 +================================= + +* Fix C++ warnings in gtype.h [Dom Lachowicz] +* Fix g_type_fundamental_next() [Tim Janik] +* Fix various missing includes of config.h [Morten Welinder] +* Handle main loop initialization before g_thread_init [Sebastian Wilhelmi] +* Various 64-bit fixes [Manish Singh] +* Fix GPoll on Win32 [Tor Lillqvist, Herman Bloggs] +* Fix bug with buffering on UTF-8 IOChannels [Daniel Elstner] +* Misc bug and build fixes [Soren Andersen, Gustavo Carneiro, Tor, + Tim, Havoc Pennington, Matthias Clasen, Sebastian Rittau, + Masahiro Sakai, Arvind Samptur, HideToshi Tajima, Owen Taylor] +* Updated and new translations (be,cs,de,*fa,it,lv,pt_BR,tr) + +Overview of Changes in GLib 2.0.6 +================================= + +* Fix problem with interface prerequisites [Jon Trowbridge, Dave Camp] +* Clean up debug spew from GObject [Anders Carlsson] +* Compiler warning fixes [David L. Cooper II] +* Fix some problems with g_build_path() [Guillaume Chazarain, Owen Taylor] +* Fixes for --disable-debug [Sebastian Wilhelmi] +* Threading fixes [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann, + Rajkumar Sivasamy, Laurent Vivier] +* Documentation fixes [Jacob Berkman, Manuel Clos, Jared Dukat, + Sebastian Rittau, Linus Welleij] +* Misc bug fixes [Anders Carlsson, Sam Couter, Morten Welinder, Owen] +* Updated translations (bg,ko,vi) + +Overview of Changes in GLib 2.0.5 +================================= + +* Fix problem with interface prerequisites [Jon Trowbridge, Dave Camp] +* Clean up debug spew from GObject [Anders Carlsson] +* Compiler warning fixes [David L. Cooper II] +* Fix some problems with g_build_path() [Guillaume Chazarain, Owen Taylor] +* Fixes for --disable-debug [Sebastian Wilhelmi] +* Threading fixes [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann, + Rajkumar Sivasamy, Laurent Vivier] +* Documentation fixes [Jacob Berkman, Manuel Clos, Jared Dukat, + Sebastian Rittau, Linus Welleij] +* Misc bug fixes [Anders Carlsson, Sam Couter, Morten Welinder, Owen] +* Updated translations (bg,ko,vi) + +Overview of Changes in GLib 2.0.4 +================================= + +* Fix some 64-bit problems. (George Lebl, David L. Cooper II) +* Add note about Tru64 iconv to INSTALL. (Manuel Op de Coul) +* Fix problem with timouts > MAXINT. (Tim Janik, Owen Taylor) +* Updated translations (ca,es,fr,ja,gl,ms,nl,pl,pt,ru) + +Overview of Changes in GLib 2.0.3 +================================= + +* Handle sorting 0-length arrays (Ron Arts) +* Threading fixes (Sebastian Wilhelmi) +* Portability fixes (Miroslaw Dobrzanski-Neumann, Jacob Berkman, Gareth Pierce, + Sebastian, Qingjiang Yuan) +* Various fixes for glib-2.0.m4. (Jim Gettys, others.) +* Locate right glib-genmarshal when cross-compiling. (Mitch Natterer) +* Win32 fixes (Tor Lillqvist) +* Try to fix g_get_charset() related segfaults. (Owen) +* Fixes for gettext detection. (Dan Winship, HideToshi Tajima, Boyd Lynn Gerber, + Andrew P. Lentvorski, Jr.) +* Fix g_scanner_unexp_token() (Tim Janik, Sven Neumann) +* g_markup fixes. (Matthias Clasen.) +* Bug fixes and cleanups (Daniel Elstner, Matthias, Laszlo Peter, Morten Welinder, + Wayne Schuller) + +Overview of Changes in GLib 2.0.1 +================================= + +* Portability fixes for Sun's Forte compiler [Erwann Chenede] +* Performance improvements for GObject parameter lookup, + g_filename_to/from_utf8() [Alex Larsson] +* Actually check interface prerequisites [Matthias Clasen, + Miroslaw Dobrzanski-Neumann] +* Fix problem with glib-mkenums taking huge amounts of stack. [Owen Taylor] +* Fix g_signal_handlers_disconnect_by_func() for C++ [Damien Sandras] +* Fixes for g_log() and threading. + [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann, Tim Janik] +* Make g_print(), g_printerr(), g_warning(), etc, convert from + UTF-8 to the encoding of the locale [Sebastian Wilhelmi, Tim] +* Fixes for GIOChannel on windows. [Tor Lillqvist] +* Fix gsize/gint mismatches in giochannel.c [Miroslaw Dobrzanski-Neumann] +* Fix file descriptor leak in g_file_get_contents() [Matthias] +* Workaround iconv() problems on older Solaris [Lauri Alanko] +* Fix warnings with gcc-3.1 about asm const [Cody Russel] +* Minor bug fixes. + +Other contributors: Hans Breuer, LEE Sau Dan, Sven Neumann, Salmaso Raffaele, + Akira Tagoh, Morten Welinder + + +Overview of Changes in GLib 2.0.0 +================================= + +* Thread portability fixes [Sebastian Wilhelmi] +* Documentation updates [Owen Taylor] +* Make g_strerror(), g_strsignal() properly return UTF-8, + call bind_text_domain_codeset() so that error strings + are in UTF-8 as well. [Owen, Tor Lillqvist] + +Overview of Changes in GLib 2.0.0 rc1: +====================================== + +* Win32 fixes [Tor Lillqvist] +* Portability fixes [Finlay Dobbie, Miroslaw Dobrzanski-Neumann] +* Fix up g_date_strftime [Daniel Elstner] +* Add some structure padding [Tim Janik] +* Make g_get_homedir() prefer the users home directory to $HOME + +Other contributors: Matthias Clasen, Paolo Maggi, Christian Rose + +Overview of Changes in GLib 1.3.15: +=================================== + +* Speed up marshalers by using private access to GValue + [Anders Carlsson, Tim Janik] +* Reduce GValue to 2 elements [Tim] +* Add G_DEBUG environment variable, G_DEBUG=fatal_warnings [Matthias Clasen] +* Fixes for AIX compilation [Miroslaw Dobrzanski-Neumann] +* Add padding to various structures [Owen Taylor, Tim] +* Win32 fixes [Tor Lillqvist] + +Other contributors: James Henstridge, Ryan Lovett, Morten Welinder, + Daniel Elstner + +Overview of Changes in GLib 1.3.14: +=================================== + +* Register value transformations for gint64, guint64 [Andy Wingo] +* Build with large-file support [Sven Neumann, Owen Taylor] +* Fix handling of hostnames in URI's [Darin Adler] +* Main loop bug fixes [Havoc Pennington, Owen] +* Doc fixes and improvements [Manish Singh, Tim Janik] +* Support ' as attribute delimiters in GMarkup [Matthias Clasen] +* Win32 fixes [Hans Breuer, Tor Lillqvist] +* Threading bug and build fixes [Sebastian Wilhelmi, Miroslaw Dobrzanski-Neumann] +* Miscellaneous bug fixes + +Other contributors: Matthias Clasen, James Henstridge, Mitch Natterer, + Morten Welinder. + +Overview of Changes in GLib 1.3.13: +=================================== + +* Fix g_filename_to/from_uri for Win32 [Tor Lillqvist, Darin Adler] +* Miscellaneous win32 fixes [Tor, Hans Breuer] +* Fix thread options for gcc on AIX [Jerome Zago, Sebastian Wilhelmi] +* Documentation improvements [Ron Steinke, Matthias, Sebastian] +* Cache iconv converters as used by g_convert() [Jeffrey Stedfast] +* Bug fixes [Sven Neumann, Owen Taylor, Matthias Clasen, Jeffrey, + Laszlo Peter, Havoc Pennington, Tim Janik] + +Overview of Changes in GLib 1.3.12: +=================================== + +* Implement closure chaining, fixing up API (Tim Janik) +* Closure chaining test case (James Henstridge) +* Make GType long not int where both are equal width (Tim) +* Win32 fixes and improvements (Hans Breuer, Tor Lillqvist) +* Fixes for NetBSD. (Dan Winship) +* Use snprintf() for g_printf_string_upper_bound() where possible. (Matthias Clasen) +* Save space for GBSearchArray (Tim Janik) +* Documentation improvements. (Matthias, Sven Neumann, Havoc Pennington) + +Other contributors: Darin Adler, Chris Blizzard, Anders Carlson, Daniel Elstner, Michael Meeks, + Mark McLoughlin, Dave Neary, Manish Singh, Owen Taylor, HideToshi Tajima, + Sebastian Wilhelmi. + + +Overview of Changes in GLib 1.3.11: +=================================== + +* Win32 fixes [Hans Breuer, Tor Lillqvist] +* Documentation improvements [Matthias Clasen] +* Portable directory handling API [Hans] +* Threading fixes [Sebastian Wilhelmi, Havoc Pennington] +* Fix excess relocations in Unicode tables [Andrew Taylor] +* Fix gpattern for UTF-8 [Matthias Clasen] +* Support overriding class closures [Tim Janik] +* Support for derivation from G_TYPE_POINTER [Owen Taylor] +* Hide pointers to type information inside GType to reduce locking + [Alex Larsson, Tim] +* Adds check for direct inclusion of gobject/*.h [Owen] +* GObject API cleanups [Tim] + +Other contributors: Darin Adler, Jacob Berkman, Daniel Egger, Eric Lemings, + Michael Meeks, Mark McLoughlin, Arkadiusz Miskiewicz, Dan Winship + + +Overview of Changes in GLib 1.3.10: +=================================== + +* Many Win32 fixes and improvements [Tor Lillqvist] +* Documentation improvements [Matthias Clasen] +* g_string_printfa() renamed to g_string_append_printf() +* Use libcharset from libiconv to implement charset detection + more portably. [Owen Taylor, Hidetoshi Tajima] +* Add 64 bit type support to GObject [Joshua Pritikin, Mathieu Lacage, Owen] +* Make support for 64 bit integers a requirement [Joshua] +* GPattern improvements [Tim Janik, Matthias] +* Locale independent g_ascii_strtod / g_ascii_dtostr [Alex Larsson] +* Many bug fixes and minor tweaks. + +Other Contributors: Darin Adler, Jakub Jelinek, James Antill, Andrew Taylor, + Ben Gertzfield, Elliot Lee, Manish Singh, Abel Cheung, Laszlo Peter, + Sven Neumann, George Lebl, Raja Harinath, Sebastian Wilhelmi, + Jacob Berkman + + +Overview of Changes in GLib 1.3.9: +================================== + +* Fixes for comparison of threads [Sebastian Wilhelmi] +* Use vasprintf() when possible for g_strdup_printf [Matthias Clasen] +* Win32 fixes [Tor Lillqvist, Hans Breuer] +* Add a len argument to g_ascii_strup/strdown +* Bug, portability fixes, cleanups. + +Other Contributors: Darin Adler, Katsuhiro Okuno, Joshua N. Pritikin + + +Overview of Changes in GLib 1.3.8: +================================== + +* Documentation updates [Owen] +* Made GType interfaces overridable in derived types +* Many win32 fixes [Tor Lillqvist] +* Miscellaneous cleanups and fixes + +Other contributors: + Darin Adler, Matthias Clasen, Ron Steinke, Hans Breuer, Alex Larsson + + +Overview of Changes in GLib 1.3.7: +================================== + +* Integrate GClosure support into the main loop [Owen Taylor] +* More GSignal convenience functions (macros) [Sven Neumann, Tim Janik] +* Introduced weak references for GObject [James Henstridge, Sven, Tim] +* Minor hash table optimizations +* Main loop and threading improvements [Sebastian Wilhelmi] +* Added g_ascii_* functions to be used for locale insensitive UTF-8 + compliant code instead of old string functions [Darin Adler, Alex Larsson] +* Add functions for Unicode case-conversion, normalization, and + collation [Owen]* GString improvements [Owen] +* Reworked the GIOChannel code [Hidetoshi Tajima, Ron Steinke] +* Removed glib-config-2.0 in favour of pkgconfig [Sebastian] +* Make code 64bit clean [Mark Murnane] +* More G_CONST_RETURN fixes +* Many improvements to the win32 code [Tor Lillqvist, Hans Breuer] +* Miscellaneous bug and API fixes + +Other contributors: + Michael Natterer, Christopher James Lahey, Padraig O'Briain, + Matthias Clasen, Josh Pritikin, Steve Baker, Cesar Rincon, Garry R. Osgood, + Michael Meeks, Laszlo Peter, Martin Baulig, Kjartan Maraas, Andrew Lanoix, + Peter Williams + + +Overview of Changes in GLib 1.3.6: +================================== + +* Threads have a "return value" from g_thread_join +* Removed ability to adjust thread stack size +* Prefix warnings with progname/PID by default, change toggle for this to + be an env variable G_MESSAGES_PREFIXED not a compile-time option +* GMarkup speedups +* GDate const, convenience fixups +* Include test cases that headers are compilable by C++ compiler +* Add ability to spawn processes with argv[0] != executable path. +* g_strstr_len, g_strrstr, g_strrstr_len +* Add length argument to g_utf8_strchr and g_utf8_strrchr. +* Misc bug fixes + + +Overview of Changes in GLib 1.3.5: +================================== + +* Added an installed glib-mkenums Perl program for parsing enumeration + declarations from header files. +* Mark some additional deprecated functions. +* Bug and Portability fixes + + +Overview of Changes in GLib 1.3.4: +================================== + +* Efficiency improvements for GThreadPool +* A few bug fixes +* Build fixes +* Documentation improvements + + +Overview of Changes in GLib 1.3.3: +================================== + +GLib: + +* More user_data support in various functions. +* Main loop API revamps to support per-thread main loops. +* Unicode handling improvements. +* Implemented debugging traps. +* G_CONST_RETURN specification all over the place. +* Various new small utility functions. +* Random number generator precision improvements. +* New configure option --disable-mem-pools. +* Many Win32 improvements. +* Added g_try_malloc() friends varinats. +* Many documentation improvements. +* Many threading improvements, support for dynamic allocation + of static mutexes. +* GHookLIst API cleanups. +* Improved format support of GDate parser. +* String function speed improvements with new g_stpcpy(). +* Hashtable API additions. +* New GPatternSpec for shell-style pattern matching (from GtkPatternSpec). +* Optimizations, cleanups, bug fixes. + +GObject: + +* Added many convenience functions. +* GClosure and GParamSpec use float/sink ref-counting scheme now. +* Reworked property change notification. +* Binary searchable array cleanups, so it's widely usable now. +* Added static content keeping for some GValue types. +* Support for statically scoped signal parameters. +* Extinguished property trailer args in set/get interface. +* Added support for abstract types. +* G_CONST_RETURN specification all over the place. +* Split parameter exchange functionality into value transforms + and parameter conversions. +* Added signal emission hooks and signal accumulators. +* Added interface prerequisites to support is_a (interface, object) + relations. +* Implemented GValueArray. +* New types, boxed: G_TYPE_VALUE, G_TYPE_CLOSURE, G_TYPE_GSTRING + GParamSpecs: G_TYPE_PARAM_PARAM, G_TYPE_PARAM_POINTER, G_TYPE_PARAM_CLOSURE, + G_TYPE_VALUE_ARRAY, G_TYPE_PARAM_UNICHAR, G_TYPE_PARAM_VALUE_ARRAY. +* Varrags value collection improvements. +* Implemented debugging traps. +* Made things thread-safe. +* Many documentation improvements. +* Many cleanups, optimizations and bug fixes. + + +Overview of Changes in GLib 1.3.2: +================================== + +GLib: + +* Win32 build improvements [Tor] +* Improvements to error reporting + (g_critical(), g_return_if_reached()) [Darin] +* Add g_strlcpy/g_strlcat [David Wheeler] +* New IO channel implementation for Win32 [Tor] +* Make g_array_free, g_string_free return pointer to memory requested + not to be freed. [Darin] +* Added GError based error reporting for thread functions. [Sebastian] +* Moved reference docs into GLib distribution. [Owen] +* Added g_convert() for doing convenient character set conversions based + on iconv. (GLib now requires libiconv or a native iconv.) [Havoc/Owen] +* Various Unicode handling additions (g_ucs4_to_utf8, g_utf8_validate(), + g_{locale,filename}_{to,from}_utf8) [Robert/Havoc/Owen] +* Portability fixes for threading. [Sebastian] +* Added convenient functions for launching new processes (g_spawn_*), + and shell quoting/unquoting functions. [Havoc] +* Split glib.h into many headers. [Sebastian] +* Added a simple callback-based parser for XML-like files (GMarkup). [Havoc] +* Fixed confusions between comparison functions that return <0, 0, >0 + and equaility functions that return FALSE,TRUE. [Sebastian] +* Added safe/portable temporary file manipulation functions. [Tor] +* autoconf improvements. [Raja] +* Many documentation improvements. +* Bug fixes. + +GObject: + +* Added boxed and pointer types. [Tim/Jonathan] +* Added callback abstraction (GClosure) [Tim] +* Added signal system (GSignal) [Tim] +* Make GTypePlugin an interface [Tim] +* Added GTypeModule - a simple GTypePlugin instantiation [Owen] +* Bug fixes. + + +What's new in GLib 1.3.1: +========================= + +* New GObject library added including object system based on + the GTK+ object system. +* Functions for getting the properties of Unicode characters, + computing the canonical decomposition and ordering combining + characters aand manipulating UTF-8 string manipulation based + on libunicode. +* GString now properly handles embedded nuls. +* Multiple fixes from the 1.2.x branch. +* Upgrade to libtool 1.3.3 +* Full thread support (thread creation and destruction). +* BeOS port, BeOS dynamic modules. +* Many improvements to the Windows ports. +* Improvements to the OS/2 port, OS/2 module support. +* Double ended queue implementation. +* GLib macros for printf() formatting, e.g. G_GULONG_FORMAT = "lu" +* New configure option --enable-msg-prefix to prefix messages, warnings + et ceteri with the program name and the process id. +* New thread-safe random number generator Mersenne Twister. +* g_strcompress() added, g_strescape() had a slight API change, and + more tightly defined semantics. +* the g_string(x) macro has been removed, #x may be used instead. + +* bugs fixed: diff --git a/NEWS.pre-1-3 b/NEWS.pre-1-3 new file mode 100644 index 0000000..1aa4f4e --- /dev/null +++ b/NEWS.pre-1-3 @@ -0,0 +1,211 @@ +Overview of Changes in GLib 1.2.1: + +* g_realloc() fix for SunOS (please report further problems). +* Continued the never ending fix vendetta regarding getpwuid(), + this time AIX has been the culprit. +* Upgrade to libtool 1.2f +* Miscellaneous other buglets fixed. + +What's new in GLib 1.2.0 (since GLib 1.0.x): + +* GLib is distributed seperatedly from Gtk+ +* Win32 Portability +* Threading support +* GModule mechanism (implemented in an extra library) which wraps dynamic + object code loading facilities in a portable manner +* GIOChannel structure to encapsulate the IPC mechanism +* GQuarks and datasets +* GRelations for n-way mapping of certain data +* An n-way tree implementation +* GDate functionality for calendar date manipulations +* GAllocator type and associated functions +* Added generic callback maintenance functions (ghook) +* Generic functions for TAB completions +* Endian defines (G_*_ENDIAN) +* g_log() mechanism for logging of messages at different log levels +* Generic main-loop mechanism +* New glib-config helper script +* Many more API extensions + +Overview of Changes in GLib 1.1.16: + +* Allocate smaller pools of memory for glists, gslists, gnodes +* Bug Fixes + +Overview of Changes in GLib 1.1.15: + +* HPUX 11 thread system detection should now work +* Release the main loop lock around calls to prepare() and + check() so it is not held over user code +* A few Win32 fixups + +Overview of Changes in GLib 1.1.14: + +* Check for dlsym() in system libraries and -dl +* FreeBSD portability fixes +* Random bug fixes and autoconf/automake changes + +Overview of Changes in GLib 1.1.13: + +* Removed alloca() based function and macro variants again. +* Improved thread related configure tests. +* GSource destruction fixups. +* Fixed up idle function removal based on user_data pointer. +* Advanced Win32 portability. +* Enforced GSource's check(), prepare() and dispatch() constrains, + loop recursions may only happen from dispatch(), and check() as well + as prepare() are called while the main_loop lock is being held. +* GLib development now requires GNU autoconf 2.13, GNU automake 1.4 + and GNU libtool 1.2d. +* Lots of random portability and bug fixes. + +Overview of Changes in GLib 1.1.12: + +* Added alloca functions/macros: g_strdup_a, g_strconcat3_a, g_alloca, + g_new_a, g_new0_a +* New tests structure. Type 'make check' on your system to run them. +* Avoid unnecessary extra hook referencing in g_hook_list_marshal + +Overview of Changes in GLib 1.1.11: + +* provide defaults for POLL sysdefs +* g_main_is_running: new function to check whether a main loop has been quitted +* a few other enhancement/fixes + +Overview of Changes in GLib 1.1.9: + +* Check for pthread_attr_init in all cases, Digital Unix 4 requires this +* For G_LOCK_DECLARE_*, if !G_THREADS_ENABLED, eat trailing semicolon better +* Changed g_main_poll_(add|remove) to g_main_(add|remove)_poll + +Overview of Changes in GLib 1.1.8: + +* Added threading support + - The ability to specify a set of functions to be used for + locking at runtime. + - Default implementations of locking functions for pthreads, + Solaris threads, and (experimentally) NSPR. + - All static variables should now properly locked. + - Enhancements to the generic main-loop mechanism to be thread-safe. + (It is used for the main-loop in GTK+ as of GTK+-1.1.8) +* Portability fixes. + +Overview of Changes in GLib 1.1.7: + +* Removed multiple define from glibconfig.h + +Overview of Changes in GLib 1.1.6: + +* New GDate functionality for calendar date manipulations (g_date_*) +* New GAllocator type and associated functions +* New functions g_slist_copy and g_list_copy to duplicate a list with all + its data pointers. +* New function g_array_insert_vals and new macro g_array_insert_val to + insert elements at an arbitrary index +* GAllocators used for glist, gslist, gnode node allocations +* Incremental freezing in ghash +* New function g_hook_list_marshal_check to eventually destroy hooks after + they got marshalled +* Revised GIOChannel to provide generic virtual-function based interface +* Added generic main-loop abstraction +* Removed GListAllocator type and its g_*_allocator_*() function variants +* Bug fixes + +Overview of Changes in GLib 1.1.5: + +* Win32 portability +* GIOChannel structure to encapsulate the IPC mechanism +* Reimplemented endian stuff, using inline asm for x86 +* New functions: + - g_strescape: escapes backslashes + - g_path_is_absolute and g_path_skip_root + - g_getenv: expands environment variables that contain references + to other environment variables + - g_scanner_sync_file_offset: rewind the filedescriptor to the current + buffer position and blow the file read ahead buffer + - g_array_remove_index: remove an entry, preserving the order + - g_array_remove_index_fast: remove an entry, order might be distorted + - g_ptr_array_remove: remove an entry, preserving the order + - g_ptr_array_remove_fast: remove an entry, order might be distorted + - g_byte_array_remove_index: wrapper for g_array_remove_index + - g_byte_array_remove_index_fast: wrapper for g_array_remove_index_fast + - g_strncasecmp: modeled closely after g_strcasecmp + - g_list_sort, g_slist_sort: to merge sort GLists and GSLists +* New macros: + - G_DIR_SEPARATOR, G_DIR_SEPARATOR_S: platform-dependant file name + syntax elements + - G_SEARCHPATH_SEPARATOR, G_SEARCHPATH_SEPARATOR_S: platform-dependant + search path syntax conventions + - G_STRUCT_OFFSET, G_STRUCT_MEMBER_P, G_STRUCT_MEMBER: for handling + structure fields through their offsets +* Removed G_ENUM, G_FLAGS, G_NV, and G_SV macros +* Bug fixes + +Overview of Changes in GLib 1.1.4: + +* Added generic callback maintenance functions (ghook) +* New endian defines (G_*_ENDIAN) +* New string join/split/free routines +* Fixes + +Overview of Changes in GLib 1.1.3: + +* New GModule mechanism (implemented in an extra library) which wraps dynamic + object code loading facilities in a portable manner. +* glib-config features extra "glib" (old behaviour remains) and "gmodule" + (add libgmodule.so to the --libs output) arguments now. this can also + be specified as fourth argument to the AM_PATH_GLIB() macro. +* Overhaul of the `inline' autoconfiguration stuff, so inlining should be + sufficiently supported on all systems that allow inlining now. +* New g_log() mechanism for logging of messages at different log levels, + associated with certain log domains (define -DG_LOG_DOMAIN for your library). +* New inline functions for bit masks tests. +* GNode macros (and functions) now return the newly allocated node. +* New macro G_VA_COPY() to work around va_list copying oddities on some + platforms. the non-static g_vsprintf() function vanished in favour of + a publically exported g_strdup_vprintf(). + People that used the former g_vsprintf() would definitely want to read the + associated ChangeLog entries (grep for printf). +* New utility functions: + g_strndup(), g_on_error_query(), g_on_error_stack_trace(), g_strdup_printf(), + g_strdup_vprintf(), g_printf_string_upper_bound(), g_spaced_primes_closest(), + g_strnfill(), g_memdup(). +* Overhaul of the array implementations, this contains some source incompatible + changes. Again, the ChangeLog is much more informative (grep for garray.c). +* The internals of the g_dataset mechanism are now exported through the + new g_datalist_* API (this is also the underlying implementation for the + keyed data of GtkObjects). +* New function g_atexit(), use of the ATEXIT() macro is discouraged. +* Better configure checks for ansi compliance. +* Libtool update to version 1.2b. +* Lotsa bug fixes and cleanups as always ;) + +Overview of Changes in GLib 1.1.2: + +* Fixed packaging mistake which occured in 1.1.1 +* fix 64-bitness in g_prints in glibtest + +What is new in GLib 1.1.1: + +* An n-way tree implementation is provided now, based on the GNode structure. +* Bugfix for pointer arrays. + +What is new in GLib 1.1.0: + +* GLib is distributed seperatedly from Gtk+ now and uses a sophisticated + shared library versioning scheme to deal with interface and binary + incompatibilities. +* There is a glib-config helper script installed now. +* Fixups all over the place. +* gboolean is now a gint, not a gchar anymore. +* API extensions for GList and GSList. +* New g_str*() functions for simple string handling. +* GScanner extensions for scope, warning and error handling. +* Minor performance improvements for GMemChunks. +* Implementations of GQuarks and datasets (similar to GtkObjects data + mechansim, but works for generic memory locations). +* More convenience macros for GNU C function arguments. +* Const correction all over the place, including a new pointer type + gconstpointer. +* Generic functions for TAB completions. +* GRelations for n-way mapping of certain data. diff --git a/README b/README new file mode 100644 index 0000000..94a3c2a --- /dev/null +++ b/README @@ -0,0 +1,221 @@ +General Information +=================== + +This is GLib version @GLIB_VERSION@. GLib is the low-level core +library that forms the basis for projects such as GTK+ and GNOME. It +provides data structure handling for C, portability wrappers, and +interfaces for such runtime functionality as an event loop, threads, +dynamic loading, and an object system. + +The official ftp site is: + ftp://ftp.gtk.org/pub/glib + +The official web site is: + http://www.gtk.org/ + +Information about mailing lists can be found at + http://www.gtk.org/mailinglists.html + +To subscribe: mail -s subscribe gtk-list-request@gnome.org < /dev/null +(Send mail to gtk-list-request@gnome.org with the subject "subscribe") + +Installation +============ + +See the file 'INSTALL' + +Notes about GLib 2.24 +===================== + +* It is now allowed to call g_thread_init(NULL) multiple times, and + to call glib functions before g_thread_init(NULL) is called + (although the later is mainly a change in docs as this worked before + too). See the GThread reference documentation for the details. + +* GObject now links to GThread and threads are enabled automatically + when g_type_init() is called. + +* GObject no longer allows to call g_object_set() on construct-only properties + while an object is being initialized. If this behavior is needed, setting a + custom constructor that just chains up will re-enable this functionality. + +* GMappedFile on an empty file now returns NULL for the contents instead of + returning an empty string. The documentation specifically states that code + may not rely on nul-termination here so any breakage caused by this change + is a bug in application code. + +Notes about GLib 2.22 +===================== + +* Repeated calls to g_simple_async_result_set_op_res_gpointer used + to leak the data. This has been fixed to always call the provided + destroy notify. + +Notes about GLib 2.20 +===================== + +* The functions for launching applications (e.g. g_app_info_launch() + + friends) now passes a FUSE file:// URI if possible (requires gvfs + with the FUSE daemon to be running and operational). With gvfs 2.26, + FUSE file:// URIs will be mapped back to gio URIs in the GFile + constructors. The intent of this change is to better integrate + POSIX-only applications, see bug #528670 for the rationale. The + only user-visible change is when an application needs to examine an + URI passed to it (e.g. as a positional parameter). Instead of + looking at the given URI, the application will now need to look at + the result of g_file_get_uri() after having constructed a GFile + object with the given URI. + +Notes about GLib 2.18 +===================== + +* The recommended way of using GLib has always been to only include the + toplevel headers glib.h, glib-object.h and gio.h. GLib enforces this by + generating an error when individual headers are directly included. + To help with the transition, the enforcement is not turned on by + default for GLib headers (it is turned on for GObject and GIO). + To turn it on, define the preprocessor symbol G_DISABLE_SINGLE_INCLUDES. + +Notes about GLib 2.16 +===================== + +* GLib now includes GIO, which adds optional dependencies against libattr + and libselinux for extended attribute and SELinux support. Use + --disable-xattr and --disable-selinux to build without these. + +Notes about GLib 2.10 +===================== + +* The functions g_snprintf() and g_vsnprintf() have been removed from + the gprintf.h header, since they are already declared in glib.h. This + doesn't break documented use of gprintf.h, but people have been known + to include gprintf.h without including glib.h. + +* The Unicode support has been updated to Unicode 4.1. This adds several + new members to the GUnicodeBreakType enumeration. + +* The support for Solaris threads has been retired. Solaris has provided + POSIX threads for long enough now to have them available on every + Solaris platform. + +* 'make check' has been changed to validate translations by calling + msgfmt with the -c option. As a result, it may fail on systems with + older gettext implementations (GNU gettext < 0.14.1, or Solaris gettext). + 'make check' will also fail on systems where the C compiler does not + support ELF visibility attributes. + +* The GMemChunk API has been deprecated in favour of a new 'slice + allocator'. See the g_slice documentation for more details. + +* A new type, GInitiallyUnowned, has been introduced, which is + intended to serve as a common implementation of the 'floating reference' + concept that is e.g. used by GtkObject. Note that changing the + inheritance hierarchy of a type can cause problems for language + bindings and other code which needs to work closely with the type + system. Therefore, switching to GInitiallyUnowned should be done + carefully. g_object_compat_control() has been added to GLib 2.8.5 + to help with the transition. + +Notes about GLib 2.6.0 +====================== + +* GLib 2.6 introduces the concept of 'GLib filename encoding', which is the + on-disk encoding on Unix, but UTF-8 on Windows. All GLib functions + returning or accepting pathnames have been changed to expect + filenames in this encoding, and the common POSIX functions dealing + with pathnames have been wrapped. These wrappers are declared in the + header which must be included explicitly; it is not + included through . + + On current (NT-based) Windows versions, where the on-disk file names + are Unicode, these wrappers use the wide-character API in the C + library. Thus applications can handle file names containing any + Unicode characters through GLib's own API and its POSIX wrappers, + not just file names restricted to characters in the system codepage. + + To keep binary compatibility with applications compiled against + older versions of GLib, the Windows DLL still provides entry points + with the old semantics using the old names, and applications + compiled against GLib 2.6 will actually use new names for the + functions. This is transparent to the programmer. + + When compiling against GLib 2.6, applications intended to be + portable to Windows must take the UTF-8 file name encoding into + consideration, and use the gstdio wrappers to access files whose + names have been constructed from strings returned from GLib. + +* Likewise, g_get_user_name() and g_get_real_name() have been changed + to return UTF-8 on Windows, while keeping the old semantics for + applications compiled against older versions of GLib. + +* The GLib uses an '_' prefix to indicate private symbols that + must not be used by applications. On some platforms, symbols beginning + with prefixes such as _g will be exported from the library, on others not. + In no case can applications use these private symbols. In addition to that, + GLib+ 2.6 makes several symbols private which were not in any installed + header files and were never intended to be exported. + +* To reduce code size and improve efficiency, GLib, when compiled + with the GNU toolchain, has separate internal and external entry + points for exported functions. The internal names, which begin with + IA__, may be seen when debugging a GLib program. + +* On Windows, GLib no longer opens a console window when printing + warning messages if stdout or stderr are invalid, as they are in + "Windows subsystem" (GUI) applications. Simply redirect stdout or + stderr if you need to see them. + +* The child watch functionality tends to reveal a bug in many + thread implementations (in particular the older LinuxThreads + implementation on Linux) where it's not possible to call waitpid() + for a child created in a different thread. For this reason, for + maximum portability, you should structure your code to fork all + child processes that you want to wait for from the main thread. + +* A problem was recently discovered with g_signal_connect_object(); + it doesn't actually disconnect the signal handler once the object being + connected to dies, just disables it. See the API docs for the function + for further details and the correct workaround that will continue to + work with future versions of GLib. + +How to report bugs +================== + +Bugs should be reported to the GNOME bug tracking system. +(http://bugzilla.gnome.org, product glib.) You will need +to create an account for yourself. + +In the bug report please include: + +* Information about your system. For instance: + + - What operating system and version + - For Linux, what version of the C library + + And anything else you think is relevant. + +* How to reproduce the bug. + + If you can reproduce it with one of the test programs that are built + in the tests/ subdirectory, that will be most convenient. Otherwise, + please include a short test program that exhibits the behavior. + As a last resort, you can also provide a pointer to a larger piece + of software that can be downloaded. + +* If the bug was a crash, the exact text that was printed out + when the crash occured. + +* Further information such as stack traces may be useful, but + is not necessary. + +Patches +======= + +Patches should also be submitted to bugzilla.gnome.org. If the +patch fixes an existing bug, add the patch as an attachment +to that bug report. + +Otherwise, enter a new bug report that describes the patch, +and attach the patch to that bug report. + +Patches should be in unified diff form. (The -up option to GNUdiff.) diff --git a/README.commits b/README.commits new file mode 100644 index 0000000..5345964 --- /dev/null +++ b/README.commits @@ -0,0 +1,72 @@ +GLib is part of the GNOME git repository. At the current time, any +person with write access to the GNOME repository, can make changes to +GLib. This is a good thing, in that it encourages many people to work +on GLib, and progress can be made quickly. However, GLib is a fairly +large and complicated package that many other things depend on, so to +avoid unnecessary breakage, and to take advantage of the knowledge +about GLib that has been built up over the years, we'd like to ask +people committing to GLib to follow a few rules: + +0) Ask first. If your changes are major, or could possibly break existing + code, you should always ask. If your change is minor and you've + been working on GLib for a while it probably isn't necessary + to ask. But when in doubt, ask. Even if your change is correct, + somebody may know a better way to do things. + + If you are making changes to GLib, you should be subscribed + to gtk-devel-list@gnome.org. (Subscription address: + gtk-devel-list-request@gnome.org.) This is a good place to ask + about intended changes. + + #gtk+ on GIMPNet (irc.gimp.org, irc.us.gimp.org, irc.eu.gimp.org, ...) + is also a good place to find GTK+ developers to discuss changes with, + however, email to gtk-devel-list is the most certain and preferred + method. + +1) Ask _first_. + +2) With git, we no longer maintain a ChangeLog file, but you are expected + to produce a meaningful commit message. Changes without a sufficient + commit message will be reverted. See below for the expected format + of commit messages. + +Notes: + +* When developing larger features or complicated bug fixes, it is + advisable to work in a branch in your own cloned GLib repository. + You may even consider making your repository publically available + so that others can easily test and review your changes. + +* The expected format for git commit messages is as follows: + +=== begin example commit === +Short explanation of the commit + +Longer explanation explaining exactly what's changed, whether any +external or private interfaces changed, what bugs were fixed (with bug +tracker reference if applicable) and so forth. Be concise but not too brief. +=== end example commit === + + - Always add a brief description of the commit to the _first_ line of + the commit and terminate by two newlines (it will work without the + second newline, but that is not nice for the interfaces). + + - First line (the brief description) must only be one sentence and + should start with a capital letter unless it starts with a lowercase + symbol or identifier. Don't use a trailing period either. Don't exceed + 72 characters. + + - The main description (the body) is normal prose and should use normal + punctuation and capital letters where appropriate. Normally, for patches + sent to a mailing list it's copied from there. + + - When committing code on behalf of others use the --author option, e.g. + git commit -a --author "Joe Coder " and --signoff. + + +Owen Taylor +13 Aug 1998 +17 Apr 2001 + +Matthias Clasen +31 Mar 2009 diff --git a/README.in b/README.in new file mode 100644 index 0000000..94a3c2a --- /dev/null +++ b/README.in @@ -0,0 +1,221 @@ +General Information +=================== + +This is GLib version @GLIB_VERSION@. GLib is the low-level core +library that forms the basis for projects such as GTK+ and GNOME. It +provides data structure handling for C, portability wrappers, and +interfaces for such runtime functionality as an event loop, threads, +dynamic loading, and an object system. + +The official ftp site is: + ftp://ftp.gtk.org/pub/glib + +The official web site is: + http://www.gtk.org/ + +Information about mailing lists can be found at + http://www.gtk.org/mailinglists.html + +To subscribe: mail -s subscribe gtk-list-request@gnome.org < /dev/null +(Send mail to gtk-list-request@gnome.org with the subject "subscribe") + +Installation +============ + +See the file 'INSTALL' + +Notes about GLib 2.24 +===================== + +* It is now allowed to call g_thread_init(NULL) multiple times, and + to call glib functions before g_thread_init(NULL) is called + (although the later is mainly a change in docs as this worked before + too). See the GThread reference documentation for the details. + +* GObject now links to GThread and threads are enabled automatically + when g_type_init() is called. + +* GObject no longer allows to call g_object_set() on construct-only properties + while an object is being initialized. If this behavior is needed, setting a + custom constructor that just chains up will re-enable this functionality. + +* GMappedFile on an empty file now returns NULL for the contents instead of + returning an empty string. The documentation specifically states that code + may not rely on nul-termination here so any breakage caused by this change + is a bug in application code. + +Notes about GLib 2.22 +===================== + +* Repeated calls to g_simple_async_result_set_op_res_gpointer used + to leak the data. This has been fixed to always call the provided + destroy notify. + +Notes about GLib 2.20 +===================== + +* The functions for launching applications (e.g. g_app_info_launch() + + friends) now passes a FUSE file:// URI if possible (requires gvfs + with the FUSE daemon to be running and operational). With gvfs 2.26, + FUSE file:// URIs will be mapped back to gio URIs in the GFile + constructors. The intent of this change is to better integrate + POSIX-only applications, see bug #528670 for the rationale. The + only user-visible change is when an application needs to examine an + URI passed to it (e.g. as a positional parameter). Instead of + looking at the given URI, the application will now need to look at + the result of g_file_get_uri() after having constructed a GFile + object with the given URI. + +Notes about GLib 2.18 +===================== + +* The recommended way of using GLib has always been to only include the + toplevel headers glib.h, glib-object.h and gio.h. GLib enforces this by + generating an error when individual headers are directly included. + To help with the transition, the enforcement is not turned on by + default for GLib headers (it is turned on for GObject and GIO). + To turn it on, define the preprocessor symbol G_DISABLE_SINGLE_INCLUDES. + +Notes about GLib 2.16 +===================== + +* GLib now includes GIO, which adds optional dependencies against libattr + and libselinux for extended attribute and SELinux support. Use + --disable-xattr and --disable-selinux to build without these. + +Notes about GLib 2.10 +===================== + +* The functions g_snprintf() and g_vsnprintf() have been removed from + the gprintf.h header, since they are already declared in glib.h. This + doesn't break documented use of gprintf.h, but people have been known + to include gprintf.h without including glib.h. + +* The Unicode support has been updated to Unicode 4.1. This adds several + new members to the GUnicodeBreakType enumeration. + +* The support for Solaris threads has been retired. Solaris has provided + POSIX threads for long enough now to have them available on every + Solaris platform. + +* 'make check' has been changed to validate translations by calling + msgfmt with the -c option. As a result, it may fail on systems with + older gettext implementations (GNU gettext < 0.14.1, or Solaris gettext). + 'make check' will also fail on systems where the C compiler does not + support ELF visibility attributes. + +* The GMemChunk API has been deprecated in favour of a new 'slice + allocator'. See the g_slice documentation for more details. + +* A new type, GInitiallyUnowned, has been introduced, which is + intended to serve as a common implementation of the 'floating reference' + concept that is e.g. used by GtkObject. Note that changing the + inheritance hierarchy of a type can cause problems for language + bindings and other code which needs to work closely with the type + system. Therefore, switching to GInitiallyUnowned should be done + carefully. g_object_compat_control() has been added to GLib 2.8.5 + to help with the transition. + +Notes about GLib 2.6.0 +====================== + +* GLib 2.6 introduces the concept of 'GLib filename encoding', which is the + on-disk encoding on Unix, but UTF-8 on Windows. All GLib functions + returning or accepting pathnames have been changed to expect + filenames in this encoding, and the common POSIX functions dealing + with pathnames have been wrapped. These wrappers are declared in the + header which must be included explicitly; it is not + included through . + + On current (NT-based) Windows versions, where the on-disk file names + are Unicode, these wrappers use the wide-character API in the C + library. Thus applications can handle file names containing any + Unicode characters through GLib's own API and its POSIX wrappers, + not just file names restricted to characters in the system codepage. + + To keep binary compatibility with applications compiled against + older versions of GLib, the Windows DLL still provides entry points + with the old semantics using the old names, and applications + compiled against GLib 2.6 will actually use new names for the + functions. This is transparent to the programmer. + + When compiling against GLib 2.6, applications intended to be + portable to Windows must take the UTF-8 file name encoding into + consideration, and use the gstdio wrappers to access files whose + names have been constructed from strings returned from GLib. + +* Likewise, g_get_user_name() and g_get_real_name() have been changed + to return UTF-8 on Windows, while keeping the old semantics for + applications compiled against older versions of GLib. + +* The GLib uses an '_' prefix to indicate private symbols that + must not be used by applications. On some platforms, symbols beginning + with prefixes such as _g will be exported from the library, on others not. + In no case can applications use these private symbols. In addition to that, + GLib+ 2.6 makes several symbols private which were not in any installed + header files and were never intended to be exported. + +* To reduce code size and improve efficiency, GLib, when compiled + with the GNU toolchain, has separate internal and external entry + points for exported functions. The internal names, which begin with + IA__, may be seen when debugging a GLib program. + +* On Windows, GLib no longer opens a console window when printing + warning messages if stdout or stderr are invalid, as they are in + "Windows subsystem" (GUI) applications. Simply redirect stdout or + stderr if you need to see them. + +* The child watch functionality tends to reveal a bug in many + thread implementations (in particular the older LinuxThreads + implementation on Linux) where it's not possible to call waitpid() + for a child created in a different thread. For this reason, for + maximum portability, you should structure your code to fork all + child processes that you want to wait for from the main thread. + +* A problem was recently discovered with g_signal_connect_object(); + it doesn't actually disconnect the signal handler once the object being + connected to dies, just disables it. See the API docs for the function + for further details and the correct workaround that will continue to + work with future versions of GLib. + +How to report bugs +================== + +Bugs should be reported to the GNOME bug tracking system. +(http://bugzilla.gnome.org, product glib.) You will need +to create an account for yourself. + +In the bug report please include: + +* Information about your system. For instance: + + - What operating system and version + - For Linux, what version of the C library + + And anything else you think is relevant. + +* How to reproduce the bug. + + If you can reproduce it with one of the test programs that are built + in the tests/ subdirectory, that will be most convenient. Otherwise, + please include a short test program that exhibits the behavior. + As a last resort, you can also provide a pointer to a larger piece + of software that can be downloaded. + +* If the bug was a crash, the exact text that was printed out + when the crash occured. + +* Further information such as stack traces may be useful, but + is not necessary. + +Patches +======= + +Patches should also be submitted to bugzilla.gnome.org. If the +patch fixes an existing bug, add the patch as an attachment +to that bug report. + +Otherwise, enter a new bug report that describes the patch, +and attach the patch to that bug report. + +Patches should be in unified diff form. (The -up option to GNUdiff.) diff --git a/README.win32 b/README.win32 new file mode 100644 index 0000000..f5623d2 --- /dev/null +++ b/README.win32 @@ -0,0 +1,340 @@ +Tor Lillqvist +Hans Breuer + +The general parts, and the section about gcc and autoconfiscated build +are by Tor Lillqvist. The sections about MSVC build is by Hans Breuer. + +General +======= + +For prebuilt binaries (DLLs and EXEs) and developer packages (headers, +import libraries) of GLib, Pango, GTK+ etc for Windows, go to +http://www.gtk.org/download-windows.html . They are for "native" +Windows meaning they use the Win32 API and Microsoft C runtime library +only. No POSIX (Unix) emulation layer like Cygwin in involved. + +To build GLib on Win32, you can use either gcc ("mingw") or the +Microsoft compiler and tools. For the latter, MSVC6 and later have +been used successfully. Also the Digital Mars C/C++ compiler have been +used. + +People have also successfully cross-compiled GLib for Win32 from Linux +using the cross-mingw packages. + +Note that to just *use* GLib on Windows, there is no need to build it +yourself. + +On Windows setting up a correct build environment can be quite a task, +especially if you are used to just type "./configure; make" on Linux, +and expect things to work as smoothly on Windows. + +The following preprocessor macros are to be used for conditional +compilation related to Win32 in GLib-using code: + +- G_OS_WIN32 is defined when compiling for native Win32, without + any POSIX emulation, other than to the extent provided by the + bundled Microsoft C library (msvcr*.dll). + +- G_WITH_CYGWIN is defined if compiling for the Cygwin + environment. Note that G_OS_WIN32 is *not* defined in that case, as + Cygwin is supposed to behave like Unix. G_OS_UNIX *is* defined by a GLib + for Cygwin. + +- G_PLATFORM_WIN32 is defined when either G_OS_WIN32 or G_WITH_CYGWIN + is defined. + +These macros are defined in glibconfig.h, and are thus available in +all source files that include . + +Additionally, there are the compiler-specific macros: +- __GNUC__ is defined when using gcc +- _MSC_VER is defined when using the Microsoft compiler +- __DMC__ is defined when using the Digital Mars C/C++ compiler + +G_OS_WIN32 implies using the Microsoft C runtime, normally +msvcrt.dll. GLib is not known to work with the older crtdll.dll +runtime, or the static Microsoft C runtime libraries libc.lib and +libcmt.lib. It apparently does work with the debugging version of +msvcrt.dll, msvcrtd.dll. If compiled with Microsoft compilers newer +than MSVC6, it also works with their compiler-specific runtimes, like +msvcr70.dll or msvcr80.dll. Please note that it's non totally clear if +you would be allowed by the license to distrubute a GLib linked to +msvcr70.dll or msvcr80.dll, as those are not part of the operating +system, but of the MSVC product. msvcrt.dll is part of Windows. + +Building software that use GLib or GTK+ +======================================= + +Building software that just *uses* GLib or GTK+ also require to have +the right compiler set up the right way. If you intend to use gcc, +follow the relevant instructions below in that case, too. + +Tor uses gcc with the -mms-bitfields flag which means that in order to +use the prebuilt DLLs (especially of GTK+), if you compile your code +with gcc, you *must* also use that flag. This flag means that the +struct layout rules are identical to those used by MSVC. This is +essential if the same DLLs are to be usable both from gcc- and +MSVC-compiled code. Such compatibility is desirable. + +When using the prebuilt GLib DLLs that use msvcrt.dll from code that +uses other C runtimes like for example msvcr70.dll, one should note +that one cannot use such GLib API that take or returns file +descriptors. On Windows, a file descriptor (the small integer as +returned by open() and handled by related functions, and included in +the FILE struct) is an index into a table local to the C runtime +DLL. A file descriptor in one C runtime DLL does not have the same +meaning in another C runtime DLL. + +Building GLib +============= + +Again, first decide whether you really want to do this. + +Before building GLib you must also have a GNU gettext-runtime +developer package. Get prebuilt binaries of gettext-runtime from +http://www.gtk.org/download-windows.html . + +Autoconfiscated build (with gcc) +================================ + +Tor uses gcc 3.4.5 and the rest of the mingw utilities, including MSYS +from www.mingw.org. Somewhat earlier or later versions of gcc +presumably also work fine. + +Using Cygwin's gcc with the -mno-cygwin switch is not recommended. In +theory it should work, but Tor hasn't tested that lately. It can +easily lead to confusing situations where one mixes headers for Cygwin +from /usr/include with the headers for native software one really +should use. Ditto for libraries. + +If you want to use mingw's gcc, install gcc, win32api, binutils and +MSYS from www.mingw.org. + +Tor invokes configure using: + +CC='gcc -mtune=pentium3 -mthreads' CPPFLAGS='-I/opt/gnu/include' \ + LDFLAGS='-L/opt/gnu/lib -Wl,--enable-auto-image-base' CFLAGS=-O2 \ + ./configure --disable-gtk-doc --prefix=$TARGET + +The /opt/gnu mentioned contains the header files for GNU and (import) +libraries for GNU libintl. The build scripts used to produce the +prebuilt binaries are included in the "dev" packages. + +Please note that the ./configure mechanism should not blindly be used +to build a GLib to be distributed to other developers because it +produces a compiler-dependent glibconfig.h. For instance, the typedef +for gint64 is long long with gcc, but __int64 with MSVC. + +Except for this and a few other minor issues, there shouldn't be any +reason to distribute separate GLib headers and DLLs for gcc and MSVC6 +users, as the compilers generate code that uses the same C runtime +library. + +The DLL generated by either compiler is binary compatible with the +other one. Thus one either has to manually edit glibconfig.h +afterwards, or use the supplied glibconfig.h.win32 which has been +produced by running configure twice, once using gcc and once using +MSVC, and merging the resulting files with diff -D. + +For MSVC7 and later (Visual C++ .NET 2003, Visual C++ 2005, Visual C++ +2008 etc) it is preferred to use specific builds of GLib DLLs that use +the same C runtime as the code that uses GLib. Such DLLs should be +named differently than the ones that use msvcrt.dll. + +For GLib, the DLL is called libglib-2.0-0.dll, and the import +libraries libglib-2.0.dll.a and glib-2.0.lib. Note that the "2.0" is +part of the "basename" of the library, it is not something that +libtool has added. The -0 suffix is added by libtool and is the value +of "LT_CURRENT - LT_AGE". The 0 is *not* part of the version number of +GLib, although, for GLib 2.x.0, it happens to be the same. The +LT_CURRENT - LT_AGE value will on purpose be kept as zero as long as +binary compatibility is maintained. For the gory details, see +configure.in and libtool documentation. + +Cross-compiling +=============== + +It is possible to build GLib using a cross compiler. See +docs/reference/glib/html/glib-cross-compiling.html (part of the GLib +reference manual) for more information. + +Building with MSVC +================== + +If you are building from a GIT snapshot, you will not have all +makefile.msc files. You should copy the corresponding makefile.msc.in +file to that name, and replace any @...@ strings with the correct +value (or use the python script de-in.py from http://hans.breuer.org/gtk/de-in.py). + +This is done automatically when an official GLib source distribution +package is built, so if you get GLib from a source distribution +package, there should be makefile.msc files ready to use (possibly after some +editing). + +The hand-written makefile.msc files, and the stuff in the "build" +subdirectory, produce DLLs and import libraries that match what the +so-called autoconfiscated build produces. + +All the MSVC makefiles are for the command line build with nmake. If +you want to use the VC-UI you can simply create wrapper .dsp makefiles +(read the VC docs how to do so). + +Some modules may require Perl to auto-generate files. The goal (at +least Hans's) is to not require any more tools. Of course you need +the Microsoft Platform SDK in a recent enough - but not too recent - version. +The last PSDK for Visual Studio 6 is: + http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm +At least install the Core SDK, maybe also the "Tablet PC SDK". + + +Build with: + +nmake -f makefile.msc + or +nmake -f makefile.msc DEBUG=1 + +[ + The former will create 'release' versions of the DLLs. If you + plan to distribute you DLLs please use this command. The latter + will create DLLs with debug information _and_ link them with + msvcrtd.dll instead of msvcrt.dll. + Beware: There are known problems with mixing DLLs in one + application, which are build against different runtimes. + Especially the index-to-file mapping used by 'unix-style' file + operation - _open() _pipe() etc. - breaks sometimes in strange + ways (for example the Gimp plug-in communication). +] + +Required libraries (not build from svn) +------------------ + libintl (gnu-intl), + +are available pre-built from the website mentioned above. + +Versioning +---------- +Instead of the Unix and auto* way of tracking versions and resolving +dependencies (configure; make; make install) involving autoconf, +automake, libtool and friends the MSVC build uses a different +approach. + +The core of it's versioning is the file build/win32/module.defs. +It contains entries of the form MODULE_VER, e.g.: + + GLIB_VER = 2.0 + LIBICONV_VER = 1.3 + +and the placement of these modules defined as MODULE, e.g.: + + GLIB = $(TOP)/glib + LIBICONV = $(TOP)/libiconv-$(LIBICONV_VER) + +whereas TOP is defined as the relative path from the respective +module directory to your top build directory. Every makefile.msc +needs to define TOP before including the common make file part +make.msc, which than includes module.defs, like: + +TOP = ../.. +!INCLUDE $(TOP)/glib/build/win32/make.msc + +(Taken from gtk+/gdk/makefile.msc) + +With this provision it is possible to create almost placement +independent makefiles without requiring to 'install' the libraries and +headers into a common place (as it is done on Unix, and as Tor does +when producing his zipfiles with prebuilt GLib, GTK+ etc). + +Special Files +------------- + config.h.win32.in : @XXX_MAJOR_VERSION@ needs to be replaced by +the current version/build number. The resulting file is to be saved +as 'config.h.win32'. This should be automatically done if a package +gets build on the Unix platform. + + makefile.msc.in : @XXX_MAJOR_VERSION@ to be replaced. Save as +makefile.msc. + + .def : every function which should be used from the outside of +a dll needs to be marked for 'export'. It is common that one needs to change +these files after some api changes occured. If there are variables to be +exported another mechanism is needed, like : + + #ifdef G_OS_WIN32 + # ifdef GDK_COMPILATION + # define GDKVAR __declspec(dllexport) + # else + # define GDKVAR extern __declspec(dllimport) + # endif + #else + # define GDKVAR extern + #endif + + + +Directory Structure +------------------- +all modules should be build in a common directory tree otherwise you +need to adapt the file 'module.defs'. They are listed here in increasing +dependencies order. + + + | + +- glib + | | + | +- build : [this module lives in the SVN root dir] + | | +- win32 + | | .\module.defs : defines (relative) locations of the headers + | | and libs and version numbers to be include + | | in dll names + | | .\make.msc : include by almost every 'makefile.msc' + | | + | | .\README.WIN32 : more information how to build + | | .\glibconfig.h.win32.in : similar to config.h.win32.in + | | .\makefile.msc : master makefile, sub dir makefiles should work + | | + | +- glib + | +- gmodule + | +- gthread : does _not_ depend on pthread anymore + | +- gobject + | + +- pango + | +- pango : 'native' build does not require extra libs and + | | includes the minimal required text renderer + | | (there is also a currently slightly broken FreeType2 + | | based implementation for win32) + | +- modules (not yet build) + | + +- atk + | +- atk + | .\makefile.msc : build here + | + +- gtk+ + | | .\config.h.win32 : for all the below + | | + | +- gdk-pixbuf + | | .\gdk_pixbuf.rc.in : version resource for the DLLs. Needs + | | to be converted (filled with version info) + | | as described above. + | | + | +- gdk + | | | .\makefile.msc : some auto-generation is needed to build in the + | | | in the subdirectory + | | +- win32 + | | + | +- gtk + + | + +- gimp + | .\makefile.msc : master makefile to build The Gimp. The makefiles + | from the sub dirs should work stand alone, but than + | the user needs to know the build order + + | + +- dia : additionally depends on libart_lgpl (in SVN) + | and libxml2 ( see http://www.xmlsoft.org/ ) + +- lib + +- app + +- objects + +- plug-ins + +- python + diff --git a/acglib.m4 b/acglib.m4 new file mode 100644 index 0000000..4778bfa --- /dev/null +++ b/acglib.m4 @@ -0,0 +1,131 @@ +## Portability defines that help interoperate with classic and modern autoconfs +ifdef([AC_TR_SH],[ +define([GLIB_TR_SH],[AC_TR_SH([$1])]) +define([GLIB_TR_CPP],[AC_TR_CPP([$1])]) +], [ +define([GLIB_TR_SH], + [patsubst(translit([[$1]], [*+], [pp]), [[^a-zA-Z0-9_]], [_])]) +define([GLIB_TR_CPP], + [patsubst(translit([[$1]], + [*abcdefghijklmnopqrstuvwxyz], + [PABCDEFGHIJKLMNOPQRSTUVWXYZ]), + [[^A-Z0-9_]], [_])]) +]) + +# GLIB_AC_DIVERT_BEFORE_HELP(STUFF) +# --------------------------------- +# Put STUFF early enough so that they are available for $ac_help expansion. +# Handle both classic (<= v2.13) and modern autoconf +AC_DEFUN([GLIB_AC_DIVERT_BEFORE_HELP], +[ifdef([m4_divert_text], [m4_divert_text([NOTICE],[$1])], + [ifdef([AC_DIVERT], [AC_DIVERT([NOTICE],[$1])], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl +$1 +AC_DIVERT_POP()])])]) + +dnl GLIB_IF_VAR_EQ (ENV_VAR, VALUE [, EQUALS_ACTION] [, ELSE_ACTION]) +AC_DEFUN([GLIB_IF_VAR_EQ],[ + case "$[$1]" in + "[$2]"[)] + [$3] + ;; + *[)] + [$4] + ;; + esac +]) +dnl GLIB_STR_CONTAINS (SRC_STRING, SUB_STRING [, CONTAINS_ACTION] [, ELSE_ACTION]) +AC_DEFUN([GLIB_STR_CONTAINS],[ + case "[$1]" in + *"[$2]"*[)] + [$3] + ;; + *[)] + [$4] + ;; + esac +]) +dnl GLIB_ADD_TO_VAR (ENV_VARIABLE, CHECK_STRING, ADD_STRING) +AC_DEFUN([GLIB_ADD_TO_VAR],[ + GLIB_STR_CONTAINS($[$1], [$2], [$1]="$[$1]", [$1]="$[$1] [$3]") +]) + +# GLIB_SIZEOF (INCLUDES, TYPE, ALIAS) +# --------------------------------------------------------------- +# The definition here is based of that of AC_CHECK_SIZEOF +AC_DEFUN([GLIB_SIZEOF], +[AS_LITERAL_IF([$3], [], + [AC_FATAL([$0: requires literal arguments])])dnl +AC_CACHE_CHECK([size of $2], AS_TR_SH([glib_cv_sizeof_$3]), +[ # The cast to unsigned long 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. + _AC_COMPUTE_INT([(long) (sizeof ($2))], + [AS_TR_SH([glib_cv_sizeof_$3])], + [AC_INCLUDES_DEFAULT([$1])], + [AC_MSG_ERROR([cannot compute sizeof ($2), 77])]) +])dnl +AC_DEFINE_UNQUOTED(GLIB_TR_CPP(glib_sizeof_$3), $AS_TR_SH([glib_cv_sizeof_$3]), + [The size of $3, as computed by sizeof.]) +])# GLIB_SIZEOF + +dnl GLIB_BYTE_CONTENTS (INCLUDES, TYPE, ALIAS, N_BYTES, INITIALIZER) +AC_DEFUN([GLIB_BYTE_CONTENTS], +[pushdef([glib_ByteContents], GLIB_TR_SH([glib_cv_byte_contents_$3]))dnl +AC_CACHE_CHECK([byte contents of $5], glib_ByteContents, +[AC_TRY_RUN([#include +$1 +main() +{ + static $2 tv = $5; + char *p = (char*) &tv; + int i; + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + for (i = 0; i < $4; i++) + fprintf(f, "%s%d", i?",":"", *(p++)); + fprintf(f, "\n"); + exit(0); +}], + [glib_ByteContents=`cat conftestval` dnl'' +], + [glib_ByteContents=no], + [glib_ByteContents=no])]) +AC_DEFINE_UNQUOTED(GLIB_TR_CPP(glib_byte_contents_$3), [$[]glib_ByteContents], + [Byte contents of $3]) +popdef([glib_ByteContents])dnl +]) + +# GLIB_CHECK_VALUE(SYMBOL, INCLUDES, ACTION-IF-FAIL) +# --------------------------------------------------------------- +AC_DEFUN([GLIB_CHECK_VALUE], +[AC_CACHE_CHECK([value of $1], AS_TR_SH([glib_cv_value_$1]), + [_AC_COMPUTE_INT([$1], AS_TR_SH([glib_cv_value_$1]), [$2], [$3])]) +])dnl + +# GLIB_CHECK_COMPILE_WARNINGS(PROGRAM, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# --------------------------------------------------------------------- +# Try to compile PROGRAM, check for warnings +m4_define([GLIB_CHECK_COMPILE_WARNINGS], +[m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl +rm -f conftest.$ac_objext +glib_ac_compile_save="$ac_compile" +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' +AS_IF([_AC_EVAL_STDERR($ac_compile) && + AC_TRY_COMMAND([(if test -s conftest.err; then false ; else true; fi)])], + [$2], + [echo "$as_me: failed program was:" >&AS_MESSAGE_LOG_FD +cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD +m4_ifvaln([$3],[$3])dnl]) +ac_compile="$glib_ac_compile_save" +rm -f conftest.$ac_objext conftest.err m4_ifval([$1], [conftest.$ac_ext])[]dnl +])# GLIB_CHECK_COMPILE_WARNINGS + +# GLIB_ASSERT_SET(VARIABLE) +# ------------------------- +AC_DEFUN([GLIB_ASSERT_SET], +[if test "x${$1+set}" != "xset" ; then + AC_MSG_ERROR($1 [must be set in cache file when cross-compiling.]) +fi +])dnl diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 0000000..cac7f21 --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,452 @@ +dnl @synopsis AC_FUNC_VSNPRINTF_C99 +dnl +dnl Check whether there is a vsnprintf() function with C99 semantics installed. +dnl +AC_DEFUN([AC_FUNC_VSNPRINTF_C99], +[AC_CACHE_CHECK(for C99 vsnprintf, + ac_cv_func_vsnprintf_c99, +[AC_TRY_RUN( +[#include +#include + +int +doit(char * s, ...) +{ + char buffer[32]; + va_list args; + int r; + + va_start(args, s); + r = vsnprintf(buffer, 5, s, args); + va_end(args); + + if (r != 7) + exit(1); + + /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf() + implementation. The above will return 7 but if you replace + the size of the buffer with 0, it borks! */ + va_start(args, s); + r = vsnprintf(buffer, 0, s, args); + va_end(args); + + if (r != 7) + exit(1); + + exit(0); +} + +int +main(void) +{ + doit("1234567"); + exit(1); +}], ac_cv_func_vsnprintf_c99=yes, ac_cv_func_vsnprintf_c99=no, ac_cv_func_vsnprintf_c99=no)]) +dnl Note that the default is to be pessimistic in the case of cross compilation. +dnl If you know that the target has a C99 vsnprintf(), you can get around this +dnl by setting ac_func_vsnprintf_c99 to yes, as described in the Autoconf manual. +if test $ac_cv_func_vsnprintf_c99 = yes; then + AC_DEFINE(HAVE_C99_VSNPRINTF, 1, + [Define if you have a version of the vsnprintf function + with semantics as specified by the ISO C99 standard.]) +fi +])# AC_FUNC_VSNPRINTF_C99 + + +dnl @synopsis AC_FUNC_SNPRINTF_C99 +dnl +dnl Check whether there is a snprintf() function with C99 semantics installed. +dnl +AC_DEFUN([AC_FUNC_SNPRINTF_C99], +[AC_CACHE_CHECK(for C99 snprintf, + ac_cv_func_snprintf_c99, +[AC_TRY_RUN( +[#include +#include + +int +doit() +{ + char buffer[32]; + va_list args; + int r; + + r = snprintf(buffer, 5, "1234567"); + + if (r != 7) + exit(1); + + r = snprintf(buffer, 0, "1234567"); + + if (r != 7) + exit(1); + + r = snprintf(NULL, 0, "1234567"); + + if (r != 7) + exit(1); + + exit(0); +} + +int +main(void) +{ + doit(); + exit(1); +}], ac_cv_func_snprintf_c99=yes, ac_cv_func_snprintf_c99=no, ac_cv_func_snprintf_c99=no)]) +dnl Note that the default is to be pessimistic in the case of cross compilation. +dnl If you know that the target has a C99 snprintf(), you can get around this +dnl by setting ac_func_snprintf_c99 to yes, as described in the Autoconf manual. +if test $ac_cv_func_snprintf_c99 = yes; then + AC_DEFINE(HAVE_C99_SNPRINTF, 1, + [Define if you have a version of the snprintf function + with semantics as specified by the ISO C99 standard.]) +fi +])# AC_FUNC_SNPRINTF_C99 + + +dnl @synopsis AC_FUNC_PRINTF_UNIX98 +dnl +dnl Check whether the printf() family supports Unix98 %n$ positional parameters +dnl +AC_DEFUN([AC_FUNC_PRINTF_UNIX98], +[AC_CACHE_CHECK(whether printf supports positional parameters, + ac_cv_func_printf_unix98, +[AC_TRY_RUN( +[#include + +int +main (void) +{ + char buffer[128]; + + sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3); + if (strcmp ("2 3 1", buffer) == 0) + exit (0); + exit (1); +}], ac_cv_func_printf_unix98=yes, ac_cv_func_printf_unix98=no, ac_cv_func_printf_unix98=no)]) +dnl Note that the default is to be pessimistic in the case of cross compilation. +dnl If you know that the target printf() supports positional parameters, you can get around +dnl this by setting ac_func_printf_unix98 to yes, as described in the Autoconf manual. +if test $ac_cv_func_printf_unix98 = yes; then + AC_DEFINE(HAVE_UNIX98_PRINTF, 1, + [Define if your printf function family supports positional parameters + as specified by Unix98.]) +fi +])# AC_FUNC_PRINTF_UNIX98 + +# Checks the location of the XML Catalog +# Usage: +# JH_PATH_XML_CATALOG([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# Defines XMLCATALOG and XML_CATALOG_FILE substitutions +AC_DEFUN([JH_PATH_XML_CATALOG], +[ + # check for the presence of the XML catalog + AC_ARG_WITH([xml-catalog], + AC_HELP_STRING([--with-xml-catalog=CATALOG], + [path to xml catalog to use]),, + [with_xml_catalog=/etc/xml/catalog]) + jh_found_xmlcatalog=true + XML_CATALOG_FILE="$with_xml_catalog" + AC_SUBST([XML_CATALOG_FILE]) + AC_MSG_CHECKING([for XML catalog ($XML_CATALOG_FILE)]) + if test -f "$XML_CATALOG_FILE"; then + AC_MSG_RESULT([found]) + else + jh_found_xmlcatalog=false + AC_MSG_RESULT([not found]) + fi + + # check for the xmlcatalog program + AC_PATH_PROG(XMLCATALOG, xmlcatalog, no) + if test "x$XMLCATALOG" = xno; then + jh_found_xmlcatalog=false + fi + + if $jh_found_xmlcatalog; then + ifelse([$1],,[:],[$1]) + else + ifelse([$2],,[AC_MSG_ERROR([could not find XML catalog])],[$2]) + fi +]) + +# Checks if a particular URI appears in the XML catalog +# Usage: +# JH_CHECK_XML_CATALOG(URI, [FRIENDLY-NAME], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +AC_DEFUN([JH_CHECK_XML_CATALOG], +[ + AC_REQUIRE([JH_PATH_XML_CATALOG],[JH_PATH_XML_CATALOG(,[:])])dnl + AC_MSG_CHECKING([for ifelse([$2],,[$1],[$2]) in XML catalog]) + if $jh_found_xmlcatalog && \ + AC_RUN_LOG([$XMLCATALOG --noout "$XML_CATALOG_FILE" "$1" >&2]); then + AC_MSG_RESULT([found]) + ifelse([$3],,,[$3 +])dnl + else + AC_MSG_RESULT([not found]) + ifelse([$4],, + [AC_MSG_ERROR([could not find ifelse([$2],,[$1],[$2]) in XML catalog])], + [$4]) + fi +]) + + +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([bh_C_SIGNED], +[ + AC_CACHE_CHECK([for signed], bh_cv_c_signed, + [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) + if test $bh_cv_c_signed = no; then + AC_DEFINE(signed, , + [Define to empty if the C compiler doesn't support this keyword.]) + fi +]) + + +# longlong.m4 serial 4 +dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([jm_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1LL; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the 'long long' type.]) + fi +]) + + +# longdouble.m4 serial 1 (gettext-0.11.6) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether the compiler supports the 'long double' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_LONGDOUBLE], +[ + AC_CACHE_CHECK([for long double], gt_cv_c_long_double, + [if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + AC_TRY_COMPILE([ + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + ], , + gt_cv_c_long_double=yes, gt_cv_c_long_double=no) + fi]) + if test $gt_cv_c_long_double = yes; then + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) + fi +]) + + + +# wchar_t.m4 serial 1 (gettext-0.11.6) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wchar_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WCHAR_T], +[ + AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) + if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) + fi +]) + + +# wint_t.m4 serial 1 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wint_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WINT_T], +[ + AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, + [AC_TRY_COMPILE([#include + wint_t foo = (wchar_t)'\0';], , + gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) + if test $gt_cv_c_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) + fi +]) + + +# intmax_t.m4 serial 1 +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define intmax_t to 'long' or 'long long' +# if it is not already defined in or . + +AC_DEFUN([jm_AC_TYPE_INTMAX_T], +[ + dnl For simplicity, we assume that a header file defines 'intmax_t' if and + dnl only if it defines 'uintmax_t'. + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + else + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + fi +]) + +dnl An alternative would be to explicitly test for 'intmax_t'. + +AC_DEFUN([gt_AC_TYPE_INTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, + [AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif +], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) + if test $gt_cv_c_intmax_t = yes; then + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + else + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + fi +]) + + +# stdint_h.m4 serial 3 (gettext-0.11.6) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_stdint_h=yes, + jm_ac_cv_header_stdint_h=no)]) + if test $jm_ac_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) + + +# inttypes_h.m4 serial 5 (gettext-0.11.6) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_inttypes_h=yes, + jm_ac_cv_header_inttypes_h=no)]) + if test $jm_ac_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) + + +m4_include(acglib.m4)dnl +m4_include(glib/libcharset/codeset.m4)dnl +m4_include(glib/libcharset/glibc21.m4)dnl +m4_include(m4macros/glib-gettext.m4)dnl diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..618d37f --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,9478 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 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. + +# 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.65],, +[m4_warning([this file was generated for autoconf 2.65. +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'.])]) + +dnl -*- mode: autoconf -*- + +# serial 1 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + 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]))]) + 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"]) +]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 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 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 56 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_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 + +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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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 +_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_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])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 +_LT_PROG_ECHO_BACKSLASH + +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 + +# Sed substitution that helps us do robust quoting. It backslashifies +# 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' + +# 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_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 "X$][$1" | $Xsed -e "$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 "X$" | $Xsed -e "$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' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_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]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +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) 2008 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. +if test "$no_create" != yes; then + 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) +fi +])# 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + 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)], + [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 + + +# _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([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)]) +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], []) + + +# _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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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" + ]) + 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" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# 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 + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _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=echo + _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 +# ----------------------- +# 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. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# 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 + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _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 __oline__ "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 + ;; +sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +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 \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_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_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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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; + ;; + + 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 + ;; + + 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"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$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 __oline__ "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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + 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:__oline__: $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:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 +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 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # 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 -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +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 + 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 + 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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + 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,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + 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 + ;; + 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 + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + 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 + 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 + ;; + +freebsd1*) + dynamic_linker=no + ;; + +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[[123]]*) 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 + 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 + 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' + ;; + +interix[[3-9]]*) + 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' + 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 + 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 Linux ELF. +linux* | k*bsd*-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' + 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 + 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], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # 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;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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' + ;; + +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 + 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 + 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 + 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 + 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 + 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 + 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([], [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 + +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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + 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 + ;; + +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]) 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 Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + 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_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_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. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + 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:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $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:__oline__: 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_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-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 + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _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([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};"\ +" /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 + + # 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 +#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. */ +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_save_LIBS="$LIBS" + lt_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_save_LIBS" + CFLAGS="$lt_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 + +_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_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)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +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)= + ;; + 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 + ;; + 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) + 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*) + # IBM XL 8.0 on PPC + _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*) + ;; + *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*) + # 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' + ;; + + 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 + 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) + 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' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # 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*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _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)='-Wl,' + ;; + *Sun\ F*) + # 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)='' + ;; + 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*) + _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_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# 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]) + +# +# 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_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' + 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 + 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")) && ([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*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + 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_flag_spec_ld, $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 + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = 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 + *\ [[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.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_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(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/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + 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 + ;; + + 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) + 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= + 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$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]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + 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; $ECHO \"$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*) + # 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)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_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 $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + 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 $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' + 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 $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 + ;; + + 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 $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 + + 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 + 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")) && ([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 + 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 + _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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 + _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' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _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. + _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 `$ECHO "X$deplibs" | $Xsed -e '\''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(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + 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 + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $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 -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 -fPIC ${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 -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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_flag_spec_ld, $1)='+b $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 -a "$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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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' + ;; + *) + _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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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*) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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_MSG_CHECKING([whether -lc should be explicitly linked in]) + $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_TAGVAR(archive_cmds_need_lc, $1)=no + else + _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* + AC_MSG_RESULT([$_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_flag_spec_ld], [1], + [[If ld is used when linking, 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([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_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([], [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_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +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 +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _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], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +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_flag_spec_ld, $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(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_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++"} + 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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -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 "\-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 + _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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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 + _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' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _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*) + # _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(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 + ;; + 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 + ;; + + freebsd[[12]]*) + # 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*) + ;; + + 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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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; $ECHO "X$list" | $Xsed' + ;; + *) + 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) + 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; $ECHO "X$list" | $Xsed' + + _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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # 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; $ECHO \"$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='echo' + + # 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=echo + 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*) + # 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='echo' + + # 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 -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 -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 "\-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 "\-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(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 + 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_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 +# 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 +]) +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 $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 + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p 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 + ;; + + *.$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 + +# 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*) + # 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_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _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_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_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_flag_spec_ld, $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(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 + CC=${F77-"f77"} + 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" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _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_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_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_flag_spec_ld, $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(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 + CC=${FC-"f95"} + 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" +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_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +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 + +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" +])# _LT_LANG_GCJ_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_GCC=$GCC +GCC= +CC=${RC-"windres"} +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" +])# _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_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_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"}, \ + = c,a/b,, \ + && 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_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) + +# Helper functions for option handling. -*- 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 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], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [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], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [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. + +# Generated from ltversion.in. + +# serial 3017 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3017]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3017' +_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 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 4 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_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +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])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# 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)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +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. +# +# +# Similar to PKG_CHECK_MODULES, make sure that the first instance of +# this or PKG_CHECK_MODULES is called, or make sure 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_ifval([$2], [$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`], + [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 + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[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 +])], + [AC_MSG_RESULT([no]) + $4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[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 .])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MODULES + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 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. + +# 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.1], [], + [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.1])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 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. + +# 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 +# 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 10 + +# 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'. + 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 + ;; + 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='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])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 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. + +# 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 +# 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 am_maintainer_other 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 +]) + +# Copyright (C) 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_PROG_CC_C_O +# -------------- +# Like AC_PROG_CC_C_O, but changed for automake. +AC_DEFUN([AM_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC_C_O])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +dnl Make sure AC_PROG_CC is never called again, or it will override our +dnl setting of CC. +m4_define([AC_PROG_CC], + [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) +]) + +# 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 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. + +# 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 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_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) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 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. + +# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# --------------------------------------------------------------------------- +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. +# +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. +# +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). +# +# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. +AC_DEFUN([AM_PATH_PYTHON], + [ + dnl Find a Python interpreter. Python versions prior to 2.0 are not + dnl supported. (2.0 was released on October 16, 2000). + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], + [python python2 python3 python3.0 python2.5 python2.4 python2.3 python2.2 dnl +python2.1 python2.0]) + + m4_if([$1],[],[ + dnl No version check is needed. + # Find any Python interpreter. + if test -z "$PYTHON"; then + AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) + fi + am_display_PYTHON=python + ], [ + dnl A version check is needed. + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + AC_MSG_CHECKING([whether $PYTHON version >= $1]) + AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], + [AC_MSG_RESULT(yes)], + [AC_MSG_ERROR(too old)]) + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + AC_CACHE_CHECK([for a Python interpreter with version >= $1], + [am_cv_pathless_PYTHON],[ + for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do + test "$am_cv_pathless_PYTHON" = none && break + AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) + done]) + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + ]) + + if test "$PYTHON" = :; then + dnl Run any user-specified action, or abort. + m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) + else + + dnl Query Python for its version number. Getting [:3] seems to be + dnl the best way to do this; it's what "site.py" does in the standard + dnl library. + + AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], + [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`]) + AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST([PYTHON_PREFIX], ['${prefix}']) + AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}']) + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], + [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) + AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) + + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behavior + dnl is more consistent with lispdir.m4 for example. + dnl Query distutils for this directory. distutils does not exist in + dnl Python 1.5, so we fall back to the hardcoded directory if it + dnl doesn't work. + AC_CACHE_CHECK([for $am_display_PYTHON script directory], + [am_cv_python_pythondir], + [if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null || + echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + ]) + AC_SUBST([pythondir], [$am_cv_python_pythondir]) + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + + AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) + dnl Query distutils for this directory. distutils does not exist in + dnl Python 1.5, so we fall back to the hardcoded directory if it + dnl doesn't work. + AC_CACHE_CHECK([for $am_display_PYTHON extension module directory], + [am_cv_python_pyexecdir], + [if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null || + echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + ]) + AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + + AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) + + dnl Run any user-specified action. + $2 + fi + +]) + + +# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# --------------------------------------------------------------------------- +# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +# Run ACTION-IF-FALSE otherwise. +# This test uses sys.hexversion instead of the string equivalent (first +# word of sys.version), in order to cope with versions such as 2.2c1. +# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). +AC_DEFUN([AM_PYTHON_CHECK_VERSION], + [prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] +sys.exit(sys.hexversion < minverhex)" + AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) + +# Copyright (C) 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. + +# 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) 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 1 + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# (`yes' being less verbose, `no' or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], +[ --enable-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0')]) +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 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. + +# 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 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_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 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. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} 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/autogen.sh b/autogen.sh new file mode 100755 index 0000000..358371b --- /dev/null +++ b/autogen.sh @@ -0,0 +1,109 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir +PROJECT=GLib +TEST_TYPE=-f +FILE=glib/glib.h + +DIE=0 + +have_libtool=false +if libtoolize --version < /dev/null > /dev/null 2>&1 ; then + libtool_version=`libtoolize --version | + head -1 | + sed -e 's/^\(.*\)([^)]*)\(.*\)$/\1\2/g' \ + -e 's/^[^0-9]*\([0-9.][0-9.]*\).*/\1/'` + case $libtool_version in + 1.4*|1.5*|2.2*) + have_libtool=true + ;; + esac +fi +if $have_libtool ; then : ; else + echo + echo "You must have libtool 1.4 installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at http://ftp.gnu.org/gnu/libtool/" + DIE=1 +fi + +(gtkdocize --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have gtk-doc installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnome.org/pub/GNOME/sources/gtk-doc/" + DIE=1 +} + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/" + DIE=1 +} + +if automake-1.11 --version < /dev/null > /dev/null 2>&1 ; then + AUTOMAKE=automake-1.11 + ACLOCAL=aclocal-1.11 +else if automake-1.10 --version < /dev/null > /dev/null 2>&1 ; then + AUTOMAKE=automake-1.10 + ACLOCAL=aclocal-1.10 +else if automake-1.9 --version < /dev/null > /dev/null 2>&1 ; then + AUTOMAKE=automake-1.9 + ACLOCAL=aclocal-1.9 +else + echo + echo "You must have automake 1.9.x, 1.10.x or 1.11.x installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at http://ftp.gnu.org/gnu/automake/" + DIE=1 +fi +fi +fi + +if test "$DIE" -eq 1; then + exit 1 +fi + +test $TEST_TYPE $FILE || { + echo "You must run this script in the top-level $PROJECT directory" + exit 1 +} + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + if test -z "$*"; then + echo "I am going to run ./configure with no arguments - if you wish " + echo "to pass any to it, please specify them on the $0 command line." + fi +fi + +rm -rf autom4te.cache + +# README and INSTALL are required by automake, but may be deleted by clean +# up rules. to get automake to work, simply touch these here, they will be +# regenerated from their corresponding *.in files by ./configure anyway. +touch README INSTALL + +$ACLOCAL $ACLOCAL_FLAGS || exit $? + +libtoolize --force || exit $? +gtkdocize || exit $? + +autoheader || exit $? + +$AUTOMAKE --add-missing || exit $? +autoconf || exit $? +cd $ORIGDIR || exit $? + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + $srcdir/configure --enable-maintainer-mode $AUTOGEN_CONFIGURE_ARGS "$@" || exit $? + + echo + echo "Now type 'make' to compile $PROJECT." +fi diff --git a/build/ChangeLog b/build/ChangeLog new file mode 100644 index 0000000..bbe0569 --- /dev/null +++ b/build/ChangeLog @@ -0,0 +1,591 @@ +2009-01-13 Tor Lillqvist + + * win32/vs8/README + * win32/vs9/README: New files. Mention this VS solution and + projects are experimental and that https://code.launchpad.net/oah + might be a better choice. + + * win32/vs8/Makefile.am + * win32/vs9/Makefile.am (EXTRA_DIST): Add the READMEs and two + missing vcproj files. + +2008-11-02 Tor Lillqvist + + * win32/Makefile.am (SUBDIRS): Add vs9. + +2008-11-02 Tor Lillqvist + + Bug 558153 - Patch for .def files generation + + * win32/{vs8,vs9}/*.vcproj: Add " around paths, making it + possible to compile in a directory containing spaces. .def files + generation is done for every configuration not only the "Debug" + ones. + + Patch by Guillaume Duhamel. + +2008-09-16 Tor Lillqvist + + * win32/vs9: New folder. Project files for use with MSVS9. Based + on the MSVS8 project files is win32/vs8. Four configurations: + Debug|Win32, Release|Win32, Debug|x64 and Release|x64. DLL names + simplified to of the style glib-2-vs9.dll. + +2008-09-15 Tor Lillqvist + + * win32/vs8/*.vcproj: Update to match the Makefile.am files. Drop + G*_EXPORTS from PreprocessorDefinitions, nothing looks for such + macros. Add G_DISABLE_DEPRECATED. + + Don't use Detect64BitPortabilityProblems as those warnings are + misleading. They don't take into consideration ifdefs in + glibconfig.h and elsewhere for _WIN64. + + Add PCRE_STATIC for glib to avoid exporting the pcre + functions. Add DLL_EXPORT to glib to export also the GLIB_VAR + variables that aren't mentioned in glib.symbols. Add G_LOG_DOMAIN + for gobject. + + Drop the "win32" part from under "dependencies" so that the same + project files can be used also for 64-bit compilation by just + having a different "dependencies" folder containing 64-bit + packages instead. At least, I hope it will work out some way like + that. MSVS project files really are a pain to maintain. Much + information is typically copied for four different configurations + "Debug|Win32", "Release|Win32", "Debug|x64" and "Release|x64" + instead of having common stuff listed just once and only different + parametrisations. Or am I missing something? + + Make the "Release" configuration work, too. Use correct character + set for the gspawn-win32-helper programs. Use correct subsystem + for the non-console one. + +2008-08-27 Tor Lillqvist + + * win32/vs8/*.vcproj: Add "win32" directory level to the + references to the dependencies folder (which each actual user of + the project file probably needs to edit anyway depending on their + directory structure). Add missing files, remove nonexistent files. + + * win32/vs8/glib.vcproj: Don't needlessly copy localcharset.c, but + compile it where it is in libcharset. Drop dirent as gdir.c + includes dirent.h and wdirent.c directly. Handle also + G_GNUC_FORMAT in the custom build step for glib.symbols. + +2008-08-02 Tor Lillqvist + + Bug 545954 - 64-bit issue in dirent + + * win32/dirent/dirent.h: Use __int64 for the dd_handle on 64-bit + Windows. (Would use intptr_t, but that is not available before + MSVS8, and we want to keep this compilable also with MSVS6 and 7, + I think.) Thanks to Richard Hult. + +2008-05-19 Tor Lillqvist + + * win32/dirent/dirent.c: Include dirent.h with doublequotes so + that it is searched from this same folder first. + +2008-05-19 Tor Lillqvist + + * win32/vs8/gspawn-win32-helper.vcproj + * win32/vs8/gspawn-win32-helper-console.vcproj: New files. Build + these two executables. + + * win32/vs8/*.vcproj: Compile as C and not C++. + + * win32/vs8/glib-genmarshal.vcproj: Use MBS and not Unicode. (What + this setting really means is just that we don't define the UNICODE + and _UNICODE macros when compiling; it has no effect on what APIs + the code might use.) Use the same IntermediateDirectory as the + other projects. + + * win32/vs8/glib.sln: Add the gspawn-win32-helper and gspawn-win32-helper projects. + +2008-05-17 Tor Lillqvist + + * "build" is no longer include into GLib through + svn:externals. The relevant directories and files have been svn + add'ed to GLib (trunk) instead. + +2008-05-16 Tor Lillqvist + + * win32/vs8/glib.vcproj: Add gi18n.c. + + * win32/vs8/gio.vcproj: Add gwin32directorymonitor.c. + + * win32/vs8/glib-genmarshal.vcproj: Put also glib-genmarshal.exe + in the "bin" folder. + +2008-04-23 Tor Lillqvist + + Bug 529391 - Update of vs8 build files for Glib 2.16 + + * win32/vs8/*: Update from Danel Atallah. + +2008-03-12 Tor Lillqvist + + * MAINTAINERS: Add. + + * win32/make.mingw: Remove this since long unused and obsolete + file from SVN. + + * win32/make.msc: Don't mention it here either then. + +2007-04-15 Tor Lillqvist + + * .cvsignore + * win32/.cvsignore + * win32/dirent/.cvsignore + * win32/vs8/.cvsignore: Remove. + +2006-10-14 Tor Lillqvist + + * win32/vs8/gmodule.vcproj + * win32/vs8/gobject.vcproj + * win32/vs8/gthread.vcproj: Updates by Mike Edenfield. (#354124) + +2006-09-02 Tor Lillqvist + + * win32/vs8/glib.vcproj: Update from Mike Edenfield. + +2006-02-08 Tor Lillqvist + + * win32/vs8/glib-genmarshal.vcproj: New file: Visual Studio + project file for glib-genmarshal.exe, by Sergey Scobich. + + * win32/vs8/Makefile.am + * win32/vs8/glib.sln: Add it. + +2006-01-31 Tor Lillqvist + + * win32/Makefile.am (EXTRA_DIST): Drop the obsolete shell scripts + and make.mingw. + + * win32/vs8/*: Visual Studio 2005 project files for GLib + contributed by Sergey Scobich. (#328691) + + * win32/Makefile.am (SUBDIRS): Add vs8. + + * win32/make.msc (LINKDEBUG): Use /nodefaultlib:msvcrt.lib when + debugging. (#329325, Timo Linna) + +2005-09-01 Tor Lillqvist + + * win32/cl-wrapper.c: Again spent some hours hacking on this. Now + the compilation phase of building libglib autoconfiscated using + CC=cl-wrapper seems to work. But problems in the linking phase, + for instance -Wl,--whole-archive isn't implemented, and I don't + think link.exe even has a such feature to include all of a + library. Argh. To implement -Wl,--whole-archive, would need to + extract the library contents into a temp directory and link with + all the resulting object files. Sigh. + +2005-07-09 Tor Lillqvist + + * README: When using auto*/libtool/gcc to build GLib, Pango and + GTK+, the scripts to compile resource files in build/win32 are no + longer used. Still here in case somebody wants to have a look, + though. + +2005-02-06 Hans Breuer + + * win32/make.msc win32/module.defs : updated to include Cairo, + gnome-canvas, gnome-print(ui), libart, pangoft2, libxml2, libxslt + +2004-12-29 Tor Lillqvist + + * win32/cl-wrapper.c: More hacking. Implement -idirafter + correctly, amending the INCLUDE environment variable. Ignore + -lm. Error if multiple -o options. Copy input libs called foo.a to + foo.temp.lib so that link knows what they are. Remove dead + code. Link with same default libraries as mingw's gcc. Use + indirect command line file if command line is too long. + +2004-12-12 Tor Lillqvist + + * win32/cl-wrapper.c: Hack more on this. Using MSVC is necessary + if one wants to use tools like Purify or BoundsChecker. + +2004-08-11 Tor Lillqvist + + * win32/dirent/dirent.[ch]: Update from mingw-runtime-3.3. + Implements both normal and wide-char versions. + + * win32/dirent/wdirent.c: New file. + + * win32/dirent/Makefile.am (EXTRA_DIST): Add wdirent.c. + +2004-05-01 Hans Breuer + + * win32/make.msc : -DG_ENABLE_DEBUG=1 for debug builds + (#141335, John Ehresman) + +2004-03-05 Federico Mena Quintero + + Fix #136082, patch by Morten Welinder. + + * win32/cl-wrapper.c: #include + * win32/dirent/dirent.c: Likewise. + +2004-01-24 Tor Lillqvist + + * win32/compile-resource + * win32/lt-compile-resource: Use /bin/sh instead of /bin/bash, as + MSYS doesn't come with any /bin/bash. When compiling with + --enable-static and --disable-shared flag, libtool creates *.lo + files as scripts, but the *.o files are in "." and not in + ".libs". Thanks to Fridrich Strba. + +2003-11-15 Tor Lillqvist + + * win32/dirent/makefile.msc: Improve. (#126913, John Ehresman) + +2003-08-08 Tor Lillqvist + + * win32/cl-wrapper.c: Fix bug in environment variable + handling. Support --version flag. Prefix double quotes in -I and + -D parameters with backslash. + +2003-06-06 Tor Lillqvist + + * win32(compile-resource (resfile): Support a WINDRES environment + variable. (#112387, J. Ali Harlow) + +2002-09-28 Tor Lillqvist + + * win32/make.mingw: Add libxml2 CFLAGS and LIBS + (suggestion by Steffen Macke). + +2002-09-17 Tor Lillqvist + + * win32/compile-resource: Return failure (implicitly, as the + return status of the last command executed) if m4 or windres + fails. Thanks to charlet@act-europe.fr (#93373). + +2002-09-13 Tor Lillqvist + + * win32/lt-compile-resource: Argh. With some libtool versions, or + when the moon is in a certain phase, libtool creates the actual + object files as .lo files. Otherwise .lo files are small scripts + (which is what lt-compile-resource has always thought until now). + Add an ugly hack that tries to determine which kind of .lo files are + used, and act correspondingly. + +2002-09-10 Tor Lillqvist + + * win32/module.defs: Remove GTK_VER which was misleading and + unused. Ditto for GTKGLAREA_VER. Add comment about taking this + stuff with a very big grain of salt. + +2002-03-27 Tor Lillqvist + + * win32/module.defs + * win32/make.msc + * win32/make.mingw: Try to make up-to-date with GLib 2.0, ATK 1.0, + Pango 1.0 and GTK+ 2.0. This stuff is starting to feel more and + more quaint, though. Remove the FriBiDi references, Pango uses its + own mini-fribidi version. Use the names GTK2_CFLAGS and _LIBS also in + make.mingw, not GTKCURRENT_*. + +2001-12-05 Tor Lillqvist + + * win32/make.mingw (LIBICONV_LIBS): Fix typo: pkg-config --libs, + not --cflags. Thanks to Victor Secarin. + + * win32/build-dll: Don't call dirname blindly on $0 which might be + a Windows-style (drive letter, backslashes) pathname. Thanks to + Victor Secarin. Remove mention of Platform SDK, it doesn't + include the linker any longer. + +2001-10-31 Tor Lillqvist + + * win32/make.mingw (TIFF_LIBS): We can use same import library for + non-LZW and LZW-enabled versions. Just let the user decide which + DLL to use. + +2001-10-30 Tor Lillqvist + + * win32/make.mingw: Use pkg-config for more stuff. The + corresponding .pc files are included in the new packages on + www.gimp.org/win32/new-downloads.html. + + * win32/dirent/dirent-zip: New file, script to package a developer + package of dirent.h and dirent.lib. + + * win32/dirent/Makefile.am (EXTRA_DIST): Add it. + +2001-10-24 Tor Lillqvist + + * win32/make.mingw: Also try to include module.defs from the build + subdirectory of GLib. + + * win32/make.msc: When DEBUG, use -Zi, otherwise -Zi. Always use + /machine:ix86. + +2001-10-23 Tor Lillqvist + + * win32/cl-wrapper.c: Various changes. I don't actually use this + to build with libtool and MSVC, only to run configure for MSVC. At + least for now. + + * win32/make.mingw: Use pkg-config to get CFLAGS and LIBS for GLib + and GTK. + + * win32/make.msc: Use GDK and GTK import library names now + produced in gtk-1-3-win32-production. + +2001-10-10 Tor Lillqvist + + * win32/module.defs (PNG): Use libpng 1.2.0. + + * win32/lt-compile-resource: Mkdir .libs if not there already. + +2001-09-30 Tor Lillqvist + + * win32/build-dll: Comment clarification. + + * win32/Makefile.am: Add dirent subdirectory. + + * win32/dirent/*: New files. The (public domain) dirent + implementation from the mingw runtime, for MSVC users. + + * win32/make.msc (DIRENT_CFLAGS,DIRENT_LIBS): Point to + build/win32/dirent in the GLib sources. Hmm. + (CC): Remove duplicate $(OPTIMIZE), already in CFLAGS. + +2001-09-28 Tor Lillqvist + + * win32/make.mingw + * win32/make.msc: Separate the compiler program names into + an Make macro of its own (CCOMPILER and CXXCOMPILER). + + * win32/cl-wrapper.c: New file. A program that accepts Unix-like C + compiler command line arguments, and runs the Microsoft C compiler + (cl) after transforming the arguments to cl's syntax. This program + can be used when using the auto*/configure mechanism to build + software with MSVC. + +2001-09-25 Tor Lillqvist + + * win32/module.defs: Do define GLIB_VER after all. (Do use it in + (import) library names, like it is on Unix.) + + * win32/make.mingw + * win32/make.msc: Some comments added. Use GLIB_VER in GLib + (import) library names. + +2001-09-17 Tor Lillqvist + + * win32/build-dll: Invocation changed. We now expect a version + info like libtool's -version-info parameter. The intention is to + produce the same name DLL as libtool would, i.e. use "current - + age" as the DLL name suffix. + + * win32/compile-resource: New file, containing the part of + build-dll that compiles the resource file, if available. + + * win32/lt-compile-resource: New file, invokes compile-resource, + placing the resulting .o file in the .libs subdirectory, and + handcrafts a "libtool object" for it. + + * win32/Makefile.am: Distribute new files. + + * win32/make.mingw: Add COMPILE_RESOURCE. + +Tue Sep 4 01:46:15 2001 Owen Taylor + + * win32/Makefile.am (EXTRA_DIST): Add build-dll, on + the assumption it isn't going to get distributed otherwise. + +2001-09-01 Tor Lillqvist + + * win32/build-dll: Move here from GLib. Use gcc -shared instead of + the multiple pass gcc+dlltool method. Don't include the version + number in the import library names. + + * win32/make.mingw + * win32/make.msc: Correspondingly, remove the version number parts + from (some) import library names. (Just a start, more to follow.) + + * win32/module.defs: In fact, no need to know the versions at all + for stuff that doesn't include it as part of the directory name. + +2001-01-06 Hans Breuer + + * win32/module.defs : renamed GTKCURRENT to GTK2 and some + version number updates + + * win32/make.msc : added GTK2_CFLAGS and GTK2_LIBS, now used + by CVS HEAD Gimp. Minor updates, + +2001-05-22 Sebastian Wilhelmi + + * win32/make.mingw: Redid CFLAGS. + + * win32/make.mingw (CXX): Removed PTHREAD defs. Added -O2 -Wall to + compile flags. + +2001-01-06 Hans Breuer + + * win32/make.msc win32/module.defs : added ATK, + adapted Pango version + +2001-03-19 Tor Lillqvist + + * win32/module.defs (GLIB_GENMARSHAL): Add macro for glib-genmarshal. + +2001-02-17 Tor Lillqvist + + * win32/make.{mingw,msc} (INTL_LIBS): Call the import library just + libintl, not gnu-intl, for consistency with Unix conventions. (The + DLL is still called gnu-intl.dll, using such a generic name as + just "intl.dll" would be asking for trouble.) + +2001-01-28 Tor Lillqvist + + * win32/module.defs + * win32/make.mingw + * win32/make.msc : Use libiconv 1.5.1. Use libiconv's import + library as built by its Makefile.msvc, without any version + number. Use the same convention for the GNU-style import library. + +2000-12-27 Tor Lillqvist + + * win32/make.{mingw,msc} (TIFF_LIBS): Provide separate TIFF_LZW + and TIFF_NOLZW. + +2000-12-21 Tor Lillqvist + + * win32/*: Add version number for FreeType2. We need the FT2 + library built as a DLL, and append the vesion number to its name, + too. + +2000-12-20 Tor Lillqvist + + * win32/module.defs (FRIBIDI_VER): Use FriBidi 0.1.15. + +2000-12-14 Tor Lillqvist + + * win32/make.msc: Split C runtime flag (-MD or -MDd) to a separate + macro. + +2000-11-15 Tor Lillqvist + + * win32/module.defs (PANGO_VER): Update Pango version to 0.13. + +2000-10-22 Tor Lillqvist + + * win32/make.msc (PANGO_LIBS): Include version in Pango lib names. + +2000-10-07 Tor Lillqvist + + * win32/make.msc: Improve to be more useable. + +2000-09-12 Tor Lillqvist + + * win32/make.{mingw,msc}: Add PTHREAD_LIBS and PTHREAD_CFLAGS. + +2000-08-24 Tor Lillqvist + + * win32/module.defs: Add separate version number for gdk-pixbuf. + + * win32/make.mingw: Add C++ defs. + +2000-08-20 Tor Lillqvist + + * win32/*: Remove FREETYPE2_20000624, not needed any + longer by gimp-freetype. + + * win32/make.mingw: Add rule to produce assembler source. + + * win32/make.msc: Fix syntax error. Add CFLAGS. + +2000-08-05 Tor Lillqvist + + * win32/module.defs + * win32/make.{mingw,msc}: Rename the FreeType2 snapshot from 2000-06-24 + (used by gimp-freetype). Use the name "FreeType2" for the current + FreeType2. + +2000-07-30 Tor Lillqvist + + * win32/module.defs + * win32/make.mingw + * win32/make.msc: Rename XML to LIBXML. Use version 0.14 of + it. Add LIBXML_CFLAGS and _LIBS. Add GTKCURRENT referring the + current CVS GTK+ (nonworking on Win32). + +2000-07-25 Tor Lillqvist + + * win32/make.mingw (PANGO_LIBS): Typo. + +2000-07-21 Tor Lillqvist + + * win32/*: Reorder stuff to be in alphabetical order of package + names. Add GtkGLArea. Add path to OpenGL headers. + +2000-07-18 Tor Lillqvist + + * win32/module.defs (FRIBIDI_VER) + * win32/make.{mingw,msc} (FRIBIDI_LIBS): Use correct version + of FriBidi. + +2000-07-15 Tor Lillqvist + + * win32/make.mingw + * win32/make.msc + * win32/module.defs: Add Pango. + +2000-07-10 Tor Lillqvist + + * win32/module.defs: + * win32/make.msc: New files. Factor out common stuff to module.defs. + make.msc is for nmake and MSVC. Thanks to Hans Breuer. + + * win32/Makefile.am: Add them to EXTRA_DIST. + + * win32/make.mingw: Move part to module.defs. Ugly hack to find + module.defs. + +2000-07-02 Tor Lillqvist + + * win32/make.mingw: Addd FriBidi and libiconv. Add USRDIR for + headers and libs that are "installed". + +2000-06-07 Tor Lillqvist + + * win32/make.mingw: Clarify where this stuff should be located. + + * Makefile.am + * win32/Makefile.am: New files. Only set SUBDIRS and EXTRA_DIST. + +2000-05-29 Tor Lillqvist + + * win32/make.mingw: Add gmodule directory to GLib includes. Use + freetype2 directory called just that. + +2000-05-13 Tor Lillqvist + + * README: Remove the original README text. + + * win32/make.mingw: Define macros for CFLAGS and LIBS of GLib, + GTk+, intl, freetype2, zlib, libjpeg, libtiff and GIMP. Remove the + WIN32APIHEADERS, that is now taken care of in glib/build-dll. + +2000-05-05 Tor Lillqvist + + * win32/make.mingw: Add GIMP_VER. Add path to GIMP and freetype2 + sources. + +2000-05-04 Tor Lillqvist + + * ChangeLog: Start ChangeLog. + + * README: Change purpose of this directory. + + * win32/make.mingw: New file. + + * build.inf + * cvs.py + * write.py: Remove. diff --git a/build/Makefile.am b/build/Makefile.am new file mode 100644 index 0000000..8a834e7 --- /dev/null +++ b/build/Makefile.am @@ -0,0 +1,7 @@ +SUBDIRS = \ + win32 + +EXTRA_DIST = \ + README \ + ChangeLog + diff --git a/build/Makefile.in b/build/Makefile.in new file mode 100644 index 0000000..d3fbbfb --- /dev/null +++ b/build/Makefile.in @@ -0,0 +1,669 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ +subdir = build +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + ChangeLog +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = \ + win32 + +EXTRA_DIST = \ + README \ + ChangeLog + +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) --gnu build/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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/README b/build/README new file mode 100644 index 0000000..8b95fd5 --- /dev/null +++ b/build/README @@ -0,0 +1,2 @@ +Now this directory is private to GLib. Only the files relevant to GLib +are left. See the separate "build" module in GNOME SVN for history. diff --git a/build/win32/Makefile.am b/build/win32/Makefile.am new file mode 100644 index 0000000..06f04e4 --- /dev/null +++ b/build/win32/Makefile.am @@ -0,0 +1,7 @@ +SUBDIRS = \ + dirent \ + vs9 + +EXTRA_DIST = \ + make.msc \ + module.defs diff --git a/build/win32/Makefile.in b/build/win32/Makefile.in new file mode 100644 index 0000000..d75f9ca --- /dev/null +++ b/build/win32/Makefile.in @@ -0,0 +1,669 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ +subdir = build/win32 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = \ + dirent \ + vs9 + +EXTRA_DIST = \ + make.msc \ + module.defs + +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) --gnu build/win32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu build/win32/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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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/win32/dirent/Makefile.am b/build/win32/dirent/Makefile.am new file mode 100644 index 0000000..87b5216 --- /dev/null +++ b/build/win32/dirent/Makefile.am @@ -0,0 +1,9 @@ +EXTRA_DIST = \ + README \ + dirent.c \ + dirent.h \ + wdirent.c \ + makefile.msc \ + dirent-zip + + diff --git a/build/win32/dirent/Makefile.in b/build/win32/dirent/Makefile.in new file mode 100644 index 0000000..083d238 --- /dev/null +++ b/build/win32/dirent/Makefile.in @@ -0,0 +1,467 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ +subdir = build/win32/dirent +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + README \ + dirent.c \ + dirent.h \ + wdirent.c \ + makefile.msc \ + dirent-zip + +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) --gnu build/win32/dirent/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu build/win32/dirent/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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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/win32/dirent/README b/build/win32/dirent/README new file mode 100644 index 0000000..e31ac1f --- /dev/null +++ b/build/win32/dirent/README @@ -0,0 +1,2 @@ +This is dirent from mingw-runtime-3.3, separated for MSVC user's +benefit. diff --git a/build/win32/dirent/dirent-zip b/build/win32/dirent/dirent-zip new file mode 100644 index 0000000..7301987 --- /dev/null +++ b/build/win32/dirent/dirent-zip @@ -0,0 +1,19 @@ +#!/bin/sh + +# Build developer package for the dirent library. + +ZIP=/tmp/dirent.zip + +mkdir -p dist/include dist/lib +cp dirent.h dist/include +cp dirent.lib dist/lib + +(cd dist +rm $ZIP +zip $ZIP -@ < + * Significantly revised and rewinddir, seekdir and telldir added by Colin + * Peters + * + */ + +#include +#include +#include +#include +#include + +#include "dirent.h" + +#define WIN32_LEAN_AND_MEAN +#include /* for GetFileAttributes */ + +#include + +#ifdef _UNICODE +#define _tdirent _wdirent +#define _TDIR _WDIR +#define _topendir _wopendir +#define _tclosedir _wclosedir +#define _treaddir _wreaddir +#define _trewinddir _wrewinddir +#define _ttelldir _wtelldir +#define _tseekdir _wseekdir +#else +#define _tdirent dirent +#define _TDIR DIR +#define _topendir opendir +#define _tclosedir closedir +#define _treaddir readdir +#define _trewinddir rewinddir +#define _ttelldir telldir +#define _tseekdir seekdir +#endif + +#define SUFFIX _T("*") +#define SLASH _T("\\") + + +/* + * opendir + * + * Returns a pointer to a DIR structure appropriately filled in to begin + * searching a directory. + */ +_TDIR * +_topendir (const _TCHAR *szPath) +{ + _TDIR *nd; + unsigned int rc; + _TCHAR szFullPath[MAX_PATH]; + + errno = 0; + + if (!szPath) + { + errno = EFAULT; + return (_TDIR *) 0; + } + + if (szPath[0] == _T('\0')) + { + errno = ENOTDIR; + return (_TDIR *) 0; + } + + /* Attempt to determine if the given path really is a directory. */ + rc = GetFileAttributes (szPath); + if (rc == (unsigned int)-1) + { + /* call GetLastError for more error info */ + errno = ENOENT; + return (_TDIR *) 0; + } + if (!(rc & FILE_ATTRIBUTE_DIRECTORY)) + { + /* Error, entry exists but not a directory. */ + errno = ENOTDIR; + return (_TDIR *) 0; + } + + /* Make an absolute pathname. */ + _tfullpath (szFullPath, szPath, MAX_PATH); + + /* Allocate enough space to store DIR structure and the complete + * directory path given. */ + nd = (_TDIR *) malloc (sizeof (_TDIR) + (_tcslen(szFullPath) + _tcslen (SLASH) + + _tcslen(SUFFIX) + 1) * sizeof(_TCHAR)); + + if (!nd) + { + /* Error, out of memory. */ + errno = ENOMEM; + return (_TDIR *) 0; + } + + /* Create the search expression. */ + _tcscpy (nd->dd_name, szFullPath); + + /* Add on a slash if the path does not end with one. */ + if (nd->dd_name[0] != _T('\0') && + nd->dd_name[_tcslen (nd->dd_name) - 1] != _T('/') && + nd->dd_name[_tcslen (nd->dd_name) - 1] != _T('\\')) + { + _tcscat (nd->dd_name, SLASH); + } + + /* Add on the search pattern */ + _tcscat (nd->dd_name, SUFFIX); + + /* Initialize handle to -1 so that a premature closedir doesn't try + * to call _findclose on it. */ + nd->dd_handle = -1; + + /* Initialize the status. */ + nd->dd_stat = 0; + + /* Initialize the dirent structure. ino and reclen are invalid under + * Win32, and name simply points at the appropriate part of the + * findfirst_t structure. */ + nd->dd_dir.d_ino = 0; + nd->dd_dir.d_reclen = 0; + nd->dd_dir.d_namlen = 0; + memset (nd->dd_dir.d_name, 0, FILENAME_MAX); + + return nd; +} + + +/* + * readdir + * + * Return a pointer to a dirent structure filled with the information on the + * next entry in the directory. + */ +struct _tdirent * +_treaddir (_TDIR * dirp) +{ + errno = 0; + + /* Check for valid DIR struct. */ + if (!dirp) + { + errno = EFAULT; + return (struct _tdirent *) 0; + } + + if (dirp->dd_stat < 0) + { + /* We have already returned all files in the directory + * (or the structure has an invalid dd_stat). */ + return (struct _tdirent *) 0; + } + else if (dirp->dd_stat == 0) + { + /* We haven't started the search yet. */ + /* Start the search */ + dirp->dd_handle = _tfindfirst (dirp->dd_name, &(dirp->dd_dta)); + + if (dirp->dd_handle == -1) + { + /* Whoops! Seems there are no files in that + * directory. */ + dirp->dd_stat = -1; + } + else + { + dirp->dd_stat = 1; + } + } + else + { + /* Get the next search entry. */ + if (_tfindnext (dirp->dd_handle, &(dirp->dd_dta))) + { + /* We are off the end or otherwise error. + _findnext sets errno to ENOENT if no more file + Undo this. */ + DWORD winerr = GetLastError(); + if (winerr == ERROR_NO_MORE_FILES) + errno = 0; + _findclose (dirp->dd_handle); + dirp->dd_handle = -1; + dirp->dd_stat = -1; + } + else + { + /* Update the status to indicate the correct + * number. */ + dirp->dd_stat++; + } + } + + if (dirp->dd_stat > 0) + { + /* Successfully got an entry. Everything about the file is + * already appropriately filled in except the length of the + * file name. */ + dirp->dd_dir.d_namlen = _tcslen (dirp->dd_dta.name); + _tcscpy (dirp->dd_dir.d_name, dirp->dd_dta.name); + return &dirp->dd_dir; + } + + return (struct _tdirent *) 0; +} + + +/* + * closedir + * + * Frees up resources allocated by opendir. + */ +int +_tclosedir (_TDIR * dirp) +{ + int rc; + + errno = 0; + rc = 0; + + if (!dirp) + { + errno = EFAULT; + return -1; + } + + if (dirp->dd_handle != -1) + { + rc = _findclose (dirp->dd_handle); + } + + /* Delete the dir structure. */ + free (dirp); + + return rc; +} + +/* + * rewinddir + * + * Return to the beginning of the directory "stream". We simply call findclose + * and then reset things like an opendir. + */ +void +_trewinddir (_TDIR * dirp) +{ + errno = 0; + + if (!dirp) + { + errno = EFAULT; + return; + } + + if (dirp->dd_handle != -1) + { + _findclose (dirp->dd_handle); + } + + dirp->dd_handle = -1; + dirp->dd_stat = 0; +} + +/* + * telldir + * + * Returns the "position" in the "directory stream" which can be used with + * seekdir to go back to an old entry. We simply return the value in stat. + */ +long +_ttelldir (_TDIR * dirp) +{ + errno = 0; + + if (!dirp) + { + errno = EFAULT; + return -1; + } + return dirp->dd_stat; +} + +/* + * seekdir + * + * Seek to an entry previously returned by telldir. We rewind the directory + * and call readdir repeatedly until either dd_stat is the position number + * or -1 (off the end). This is not perfect, in that the directory may + * have changed while we weren't looking. But that is probably the case with + * any such system. + */ +void +_tseekdir (_TDIR * dirp, long lPos) +{ + errno = 0; + + if (!dirp) + { + errno = EFAULT; + return; + } + + if (lPos < -1) + { + /* Seeking to an invalid position. */ + errno = EINVAL; + return; + } + else if (lPos == -1) + { + /* Seek past end. */ + if (dirp->dd_handle != -1) + { + _findclose (dirp->dd_handle); + } + dirp->dd_handle = -1; + dirp->dd_stat = -1; + } + else + { + /* Rewind and read forward to the appropriate index. */ + _trewinddir (dirp); + + while ((dirp->dd_stat < lPos) && _treaddir (dirp)) + ; + } +} diff --git a/build/win32/dirent/dirent.h b/build/win32/dirent/dirent.h new file mode 100644 index 0000000..237665b --- /dev/null +++ b/build/win32/dirent/dirent.h @@ -0,0 +1,127 @@ +/* + * DIRENT.H (formerly DIRLIB.H) + * This file has no copyright assigned and is placed in the Public Domain. + * This file is a part of the mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within the package. + * + */ +#ifndef _DIRENT_H_ +#define _DIRENT_H_ + +#include +#include + +#ifndef RC_INVOKED + +#ifdef __cplusplus +extern "C" { +#endif + +struct dirent +{ + long d_ino; /* Always zero. */ + unsigned short d_reclen; /* Always zero. */ + unsigned short d_namlen; /* Length of name in d_name. */ + char d_name[FILENAME_MAX]; /* File name. */ +}; + +#ifdef _WIN64 +#define INTPTR __int64 +#else +#define INTPTR long +#endif + +/* + * This is an internal data structure. Good programmers will not use it + * except as an argument to one of the functions below. + * dd_stat field is now int (was short in older versions). + */ +typedef struct +{ + /* disk transfer area for this dir */ + struct _finddata_t dd_dta; + + /* dirent struct to return from dir (NOTE: this makes this thread + * safe as long as only one thread uses a particular DIR struct at + * a time) */ + struct dirent dd_dir; + + /* _findnext handle */ + INTPTR dd_handle; + + /* + * Status of search: + * 0 = not started yet (next entry to read is first entry) + * -1 = off the end + * positive = 0 based index of next entry + */ + int dd_stat; + + /* given path for dir with search pattern (struct is extended) */ + char dd_name[1]; +} DIR; + +DIR* __cdecl opendir (const char*); +struct dirent* __cdecl readdir (DIR*); +int __cdecl closedir (DIR*); +void __cdecl rewinddir (DIR*); +long __cdecl telldir (DIR*); +void __cdecl seekdir (DIR*, long); + + +/* wide char versions */ + +struct _wdirent +{ + long d_ino; /* Always zero. */ + unsigned short d_reclen; /* Always zero. */ + unsigned short d_namlen; /* Length of name in d_name. */ + wchar_t d_name[FILENAME_MAX]; /* File name. */ +}; + +/* + * This is an internal data structure. Good programmers will not use it + * except as an argument to one of the functions below. + */ +typedef struct +{ + /* disk transfer area for this dir */ + struct _wfinddata_t dd_dta; + + /* dirent struct to return from dir (NOTE: this makes this thread + * safe as long as only one thread uses a particular DIR struct at + * a time) */ + struct _wdirent dd_dir; + + /* _findnext handle */ + INTPTR dd_handle; + + /* + * Status of search: + * 0 = not started yet (next entry to read is first entry) + * -1 = off the end + * positive = 0 based index of next entry + */ + int dd_stat; + + /* given path for dir with search pattern (struct is extended) */ + wchar_t dd_name[1]; +} _WDIR; + + + +_WDIR* __cdecl _wopendir (const wchar_t*); +struct _wdirent* __cdecl _wreaddir (_WDIR*); +int __cdecl _wclosedir (_WDIR*); +void __cdecl _wrewinddir (_WDIR*); +long __cdecl _wtelldir (_WDIR*); +void __cdecl _wseekdir (_WDIR*, long); + + +#ifdef __cplusplus +} +#endif + +#endif /* Not RC_INVOKED */ + +#endif /* Not _DIRENT_H_ */ diff --git a/build/win32/dirent/makefile.msc b/build/win32/dirent/makefile.msc new file mode 100644 index 0000000..00f2e34 --- /dev/null +++ b/build/win32/dirent/makefile.msc @@ -0,0 +1,16 @@ +TOP = ..\..\..\.. + +!INCLUDE $(TOP)\glib\build\win32\make.msc + +dirent_OBJECTS = dirent.obj wdirent.obj + +INCLUDES = -I. + +all : dirent.lib + +dirent.lib : $(dirent_OBJECTS) + lib /out:dirent.lib /nodefaultlib $(dirent_OBJECTS) + +clean:: + del /f $(dirent_OBJECTS) + del /f dirent.lib diff --git a/build/win32/dirent/wdirent.c b/build/win32/dirent/wdirent.c new file mode 100644 index 0000000..098d854 --- /dev/null +++ b/build/win32/dirent/wdirent.c @@ -0,0 +1,3 @@ +#define _UNICODE 1 +#define UNICODE 1 +#include "dirent.c" diff --git a/build/win32/make.msc b/build/win32/make.msc new file mode 100644 index 0000000..3b534ea --- /dev/null +++ b/build/win32/make.msc @@ -0,0 +1,237 @@ +# Note that this file is hardly maintained, hardly usable without +# manual editing, and not really part of a recommended way to build +# GLib and related software with Microsoft's compilers. Only a few +# persons use a build setup that involves this file. + +# Common makefile definitions for building GLib, GTk+, and various +# software that use these libraries with msvc on Win32 + +# Debug builds shoud link with msvcrtd release build with msvcrt. +!IFNDEF DEBUG +# Full optimization: +OPTIMIZE = -Ox +# release with debug +OPTIMIZE = -Zi -DG_ENABLE_DEBUG=1 +CRUNTIME = -MD +LINKDEBUG = /OPT:REF +!ELSE +# Debugging: +OPTIMIZE = +CRUNTIME = -MDd +DEBUGINFO = -Zi -DG_ENABLE_DEBUG=1 +LINKDEBUG = /debug /nodefaultlib:msvcrt.lib +!ENDIF + +LDFLAGS = /link /machine:ix86 $(LINKDEBUG) + +!IFNDEF TOP +TOP = .. +!ENDIF + +!IFNDEF PERL +PERL = perl +!ENDIF + +XSLTPROC = d:\gnome-0\xsltproc + +# paths and version numbers +!INCLUDE $(TOP)\glib\build\win32\module.defs + +################ +# CFLAGS and LIBS for the packages in module.defs. +# In alphabetical order. + +# Note that these CFLAGS and LIBS refer to stuff in "source" +# directories. This is for historical reasons, and only useable if you +# have the GLib, Pango, etc sources. If you use the prebuilt developer +# packages, you should fix these to instead refer to the place where +# you unzipped the developer packages. Easiest of all, run pkg-config +# --cflags gtk+-2.0 (for instance), and paste its output as the +# definition of GTK2_CFLAGS. Etc. + +ATK_CFLAGS = -I $(ATK) +ATK_LIBS = $(ATK)\atk\atk-$(ATK_VER).lib +BABL_CFLAGS = -I $(BABL) +BABL_LIBS = $(BABL)\babl\babl-1.0.lib + +# force inclusion of the _right_ cairoversion.h even when using without installation +CAIRO_CFLAGS = -FI $(CAIRO)\cairo-version.h -I $(CAIRO)\src -I $(CAIRO) +CAIRO_LIBS = $(CAIRO)\src\libcairo.lib + +DIRENT_CFLAGS = -I $(GLIB)\build\win32\dirent +DIRENT_LIBS = $(GLIB)\build\win32\dirent\dirent.lib + +!IFNDEF EXIF +EXIF_CFLAGS = -I $(DEVTOP)\include +EXIF_LIBS = $(DEVTOP)\lib\exif.lib +EXIF = 1 +!ENDIF + +# Don't know if Freetype2, FriBiDi and some others actually can be +# built with MSVC, but one can produce an import library even if the +# DLL was built with gcc. +!IFDEF FREETYPE2 +FREETYPE2_CFLAGS = -I $(FREETYPE2)\include +FREETYPE2_LIBS = $(FREETYPE2)\obj\freetype-$(FREETYPE2_VER).lib +!ELSE +FREETYPE2_CFLAGS = -I $(DEVTOP)\include -I $(DEVTOP)\include\freetype2 +FREETYPE2_LIBS = $(DEVTOP)\lib\freetype6.lib +!ENDIF + +!IFNDEF FONTCONFIG +FONTCONFIG_CFLAGS = -I $(DEVTOP)\include +FONTCONFIG_LIBS = $(DEVTOP)\lib\fontconfig.lib +!ENDIF + +GDK_PIXBUF_CFLAGS = -I $(GDK_PIXBUF) +GDK_PIXBUF_LIBS = $(GTK2)\gdk-pixbuf\gdk_pixbuf-$(GDK_PIXBUF_VER).lib + +GIMP_CFLAGS = -I $(GIMP) +GIMP_PLUGIN_LIBS = $(GIMP)\libgimp\gimp-$(GIMP_VER).lib $(GIMP)\libgimp\gimpui-$(GIMP_VER).lib + +# overide definition to use it as callable path +GLIB = $(TOP)\glib + +GLIB_CFLAGS = -I $(GLIB) -I $(GLIB)\glib -I $(GLIB)\gmodule $(INTL_CFLAGS) +GLIB_LIBS = $(GLIB)\glib\glib-$(GLIB_VER).lib $(GLIB)\gmodule\gmodule-$(GLIB_VER).lib $(GLIB)\gobject\gobject-$(GLIB_VER).lib $(GLIB)\gio\gio-$(GLIB_VER).lib +GTHREAD_LIBS = $(GLIB)\gthread\gthread-$(GLIB_VER).lib + +!IFNDEF GDK_PIXBUF +GDK_PIXBUF_CFLAGS = $(GTK2_CFLAGS) +GDK_PIXBUF_LIBS = $(GTK2_LIBS) +!ENDIF + +GNOMECANVAS_CFLAGS = -I $(GNOMECANVAS) +GNOMECANVAS_LIBS = $(GNOMECANVAS)\libgnomecanvas\libgnomecanvas-$(GNOMECANVAS_VER).lib + +GNOMEPRINT_CFLAGS = -I $(GNOMEPRINT) +GNOMEPRINT_LIBS = $(GNOMEPRINT)\libgnomeprint\gnome-print-$(GNOMEPRINT_VER).lib + +GNOMEPRINTUI_CFLAGS = -I $(GNOMEPRINTUI) +GNOMEPRINTUI_LIBS = $(GNOMEPRINTUI)\libgnomeprintui\gnome-printui-$(GNOMEPRINTUI_VER).lib + +GTK_CFLAGS = -I$(GTK)\gdk -I$(GTK)\gdk -I$(GTK) +GTK_LIBS = $(GTK)\gtk\gtk.lib $(GTK)\gdk\gdk.lib + +GTK2_CFLAGS = $(GLIB_CFLAGS) $(ATK_CFLAGS) -I$(GTK2)\gdk -I$(GTK2)\gdk -I$(GTK2) -I$(PANGO) -I$(ATK) $(CAIRO_CFLAGS) +GTK2_LIBS = $(GTK2)\gtk\gtk-win32-$(GTK2_VER).lib $(GTK2)\gdk\gdk-win32-$(GTK2_VER).lib $(GTK2)\gdk-pixbuf\gdk_pixbuf-$(GTK2_VER).lib $(PANGO_LIBS) + +GTKGLAREA_CFLAGS = -I $(GTKGLAREA) +GTKGLAREA_LIBS = $(GTKGLAREA)\gtkgl\gtkgl-$(GTKGLAREA_VER).lib + +GTKSOURCEVIEW_CFLAGS = -I $(GTKSOURCEVIEW) +GTKSOURCEVIEW_LIBS = $(GTKSOURCEVIEW)\gtksourceview\gtksourceview.lib + +LIBART_CFLAGS = -I$(LIBART)\.. -FIlibart_lgpl/art_config.h +LIBART_LIBS = $(LIBART)\art_lgpl_2.lib + +!IFNDEF INTL +INTL_CFLAGS = -I $(DEVTOP)\include +INTL_LIBS = $(DEVTOP)\lib\intl.lib +!ELSE +INTL_CFLAGS = -I $(INTL) +INTL_LIBS = $(INTL)\intl.lib +!ENDIF + +!IFDEF LCMS +LCMS_CFLAGS = -DLCMS_DLL -I $(LCMS)\include +LCMS_LIBS = $(LCMS)\Projects\VC6\Release\lcms.lib +!ENDIF + +LIBICONV_CFLAGS = -I $(LIBICONV)\include +LIBICONV_LIBS = $(LIBICONV)\lib\iconv.lib + +LIBXML_CFLAGS = -I $(LIBXML) +LIBXML_LIBS = $(LIBXML)\xml-$(LIBXML_VER).lib + +LIBXML2_CFLAGS = $(LIBICONV_CFLAGS) -I $(LIBXML2)\include +LIBXML2_LIBS = $(LIBXML2)\libxml2.lib + +LIBXSLT_CFLAGS = -I $(LIBXSLT) +LIBXSLT_LIBS = $(LIBXSLT)\libxslt\libxslt.lib + +LCMS_CFLAGS = -I $(LCMS)\include -DLCMS_DLL +LCMS_LIBS = $(LCMS)\Projects\VC6\Release\lcms.lib + +!IFNDEF JPEG +JPEG_CFLAGS = -I $(DEVTOP)\include +JPEG_LIBS = $(DEVTOP)\lib\jpeg.lib +!ELSE +JPEG_CFLAGS = -I $(JPEG) +JPEG_LIBS = $(JPEG)\libjpeg.lib +!ENDIF + +OPENGL_CFLAGS = # None needed, headers bundled with the compiler +OPENGL_LIBS = opengl32.lib lglu32.lib + +PANGO_CFLAGS = -I $(PANGO) +PANGO_LIBS = $(PANGO)\pango\pango-$(PANGO_VER).lib +PANGOCAIRO_LIBS = $(PANGO_LIBS) $(PANGO)\pango\pangocairo-$(PANGO_VER).lib +PANGOWIN32_LIBS = $(PANGO_LIBS) $(PANGO)\pango\pangowin32-$(PANGO_VER).lib +PANGOFT2_LIBS = $(PANGO_LIBS) $(PANGO)\pango\pangoft2-$(PANGO_VER).lib + +!IFDEF PNG +PNG_CFLAGS = -I $(PNG) $(ZLIB_CFLAGS) +PNG_LIBS = $(PNG)\projects\visualc6\Win32_LIB_Release\libpng.lib $(ZLIB_LIBS) +!ELSE +PNG_CFLAGS = -I $(DEVTOP)\include $(ZLIB_CFLAGS) +PNG_LIBS = $(DEVTOP)\lib\libpng.lib $(ZLIB_LIBS) +!ENDIF + +RSVG_CFLAGS = -I $(RSVG)\.. +RSVG_LIBS = $(RSVG)\librsvg-2.lib + +SVG_CFLAGS = -I $(SVG)\src +SVG_LIBS = $(SVG)\src\libsvg-$(SVG_VER).lib + +!IFDEF TIFF +TIFF_CFLAGS = -I $(TIFF)\libtiff +# Use single import library for both libtiff DLL versions (with or +# without LZW code). The user selects which DLL to use. +TIFF_LIBS = $(TIFF)\libtiff\libtiff.lib $(JPEG_LIBS) $(ZLIB_LIBS) user32.lib +!ELSE +TIFF_CFLAGS = -I $(DEVTOP)\include +TIFF_LIBS = $(DEVTOP)\lib\libtiff.lib +!ENDIF + +VIPS_CFLAGS = -I $(VIPS)/include +VIPS_LIBS = $(VIPS)/libsrc/vips.lib + +!IFDEF ZLIB +ZLIB_CFLAGS = -I $(ZLIB) +ZLIB_LIBS = $(ZLIB)\projects\visualc6\Win32_LIB_Release\zlib.lib +!ELSE +ZLIB_CFLAGS = -I $(DEVTOP)\include +ZLIB_LIBS = $(DEVTOP)\lib\zdll.lib +!ENDIF + +################ +# Compiler to use. + +CCOMPILER = cl +CC = $(CCOMPILER) $(OPTIMIZE) $(CRUNTIME) -W3 -nologo + +################ +# The including makefile should define INCLUDES, DEFINES and +# DEPCFLAGS. INCLUDES are the includes related to the module being +# built. DEFINES similarly. DEPCFLAGS should be set to a set of +# GLIB_CFLAGS, GTK_CFLAGS etc corresponding to what other modules we +# depend on. + +CFLAGS = $(OPTIMIZE) $(DEBUGINFO) $(INCLUDES) $(DEFINES) $(DEPCFLAGS) +# make cl/wcl386 compatible (c99 and cdecl) +#OPTIMIZE = -Ox +#CFLAGS = /passwopts:-za99 /passwopts:-ecc $(DEBUGINFO) $(INCLUDES) $(DEFINES) $(DEPCFLAGS) +.c.i : + $(CC) $(CFLAGS) -E $< >$@ + +# The default target should be "all" + +default: all + +clean:: + -del *.obj *.res *.i *.exe *.dll *.lib *.err *.map *.exp *.lk1 *.mk1 *.ilk *.manifest + -del *.pdb + +# Needed by hacker rule to make makefile.msc from makefile.msc.in: +SED = e:\cygwin\bin\sed diff --git a/build/win32/module.defs b/build/win32/module.defs new file mode 100644 index 0000000..1745c62 --- /dev/null +++ b/build/win32/module.defs @@ -0,0 +1,124 @@ +# Note that this file is hardly maintained, hardly usable without +# manual editing, and not really part of a recommended way to build +# GLib and related software with Microsoft's compilers. Only a few +# persons use a build setup that involves this file. + +# This file is included by makefiles for both GNU Make (for gcc +# (mingw) builds, and NMAKE (for MSVC builds). + +MODULE_DEFS_INCLUDED=1 + +# fallback if a specifc library is not contained in TOP (i.e. not self-compiled) +DEVTOP=$(TOP)\..\other\dev + +################ +# The version macros define what versions of libraries to use. + +# The version numbers are defined unconditionally. If you want to +# produce a newer version of one of these libraries, the new number +# should be defined in the specific project makefile _after_ including +# this file (or make.{mingw,msc}). These version numbers are used in +# the names of some import libraries. + +# Please note that there are two (or three) ways to build the GLib +# (and GTK+ etc) libraries on Win32: Either using the same +# auto*/configure mechanism to generate makefiles as on Unix, and +# libtool to handle DLL creation. This currently only works for gcc, +# and even then it is hellish to set up to work 100% correctly. For +# people using that, this file is totally irrelevant. + +# Or, use hand-written makefiles, either for MSVC (these are called +# makefile.msc and maintained by Hans Breuer), or for gcc +# (makefile.mingw, by Tor Lillqvist). Only for GLib are the +# makefile.mingw files believed to be up-to-date, for other modules +# they have been left to rot after Tor started using the +# autoconfiscated way of building. + +# The stuff here uses the same name for (import) libraries as on Unix, +# as libtool uses those, and the semi-official developer packages are +# built using libtool. + +ATK_VER = 1.0 +CAIRO_VER = 1.4 +FREETYPE2_VER = 2.0 +GIMP_VER = 1.2 +GDK_PIXBUF_VER = 2.0 +GLIB_VER = 2.0 +GTKGLAREA_VER = 1.2.2 +GTK2_VER = 2.0 +LIBGLADE_VER = 0.14 +LIBICONV_VER = 1.7 +LIBXML_VER = 1.8.7 +LIBXML2_VER = 2.4.2 +PANGO_VER = 1.0 +POPT_VER = 1.4 +SVG_VER = 0.1 +RSVG_VER = 2.4 + +################ +# Locations of various source directories. TOP is defined in make.{mingw,msc} + +# First stuff that is in the GNOME CVS repository. +# In alphabetical order. + +ATK = $(TOP)/atk +BABL = $(TOP)/babl +CAIRO = d:\devel\from-svn\other\cairo-1.8.4 +GIMP = $(TOP)/gimp +GEGL = $(TOP)/gegl +GLIB = $(TOP)/glib +GNOMECANVAS = $(TOP)\libgnomecanvas +GNOMECANVAS_VER = 2.9 + +# GTK+ 1.3.0, gtk-1-3-win32-production branch. Rename directory +# to gtk+p after initial checkout from CVS. +GTK = $(TOP)/gtk+p +# GTK+ 2.0 +GTK2 = $(TOP)/gtk+ +GTKSOURCEVIEW = $(TOP)/gtksourceview +GNOMEPRINT = $(TOP)\libgnomeprint +GNOMEPRINT_VER = 2.8 +LIBGLADE = $(TOP)/libglade +LIBXML = $(TOP)/libxml-$(LIBXML_VER) +LIBXML2 = $(TOP)/libxml2 +#PANGO = $(TOP)/pango-1-8 +PANGO = $(TOP)/pango + +GNOMEPRINTUI = $(TOP)\libgnomeprintui +GNOMEPRINTUI_VER = 2.2 + +# Aux programs +GLIB_GENMARSHAL = $(GLIB)/gobject/glib-genmarshal + +# Stuff from other places. + +# Note this was is specific to what tml happened to have on his disk +# at some time in history. To really be able to recompile something +# that uses for instance libjpeg, you should download a suitable +# binary "developer" distribution of it, unpack it into some location, +# and edit this file correspondingly. You should not take the versions +# mentioned here too literally, use the latest version you can find, +# or the ones the current GTK+ 2.0 for Windows uses. + +#FREETYPE2 = $(TOP)/freetype2 +GTKEXTRA = $(TOP)/gtk+extra +GTKGLAREA = $(TOP)/gtkglarea +#INTL = d:/devel/from-svn/other/intl-tml +JPEG = d:/devel/from-svn/other/jpeg-6b +LCMS = d:/devel/other/lcms-1.15 +LIBART = $(TOP)/libart_lgpl +LIBICONV = $(TOP)/libiconv-$(LIBICONV_VER) +LIBXSLT = $(TOP)/libxslt +#PNG = d:/devel/from-svn/other/lpng1224 +RSVG = $(TOP)\librsvg +SVG = $(TOP)\libsvg +#TIFF = d:/devel/from-svn/other/tiff-3.7.2 +#ZLIB = d:/devel/from-svn/other/zlib123 + +# Headers from Microsoft's PlatformSDK (that aren't present in +# mingw) are needed by a just a few packages when compiling with gcc. +# This is just where tml has it installed. +PLATFORMSDK = i:/src/psdk + +# +WTKIT = d:/devel/from-svn/other\wtkit126 diff --git a/build/win32/vs9/Makefile.am b/build/win32/vs9/Makefile.am new file mode 100644 index 0000000..e9b379f --- /dev/null +++ b/build/win32/vs9/Makefile.am @@ -0,0 +1,17 @@ +EXTRA_DIST = \ + README.txt \ + glib.sln \ + glib.vsprops \ + glib.vcproj \ + glib.vcprojin \ + glib-genmarshal.vcproj \ + gspawn-win32-helper-console.vcproj \ + gspawn-win32-helper.vcproj \ + gmodule.vcproj \ + gobject.vcproj \ + gobject.vcprojin \ + gthread.vcproj \ + gio.vcproj \ + gio.vcprojin \ + testglib.vcproj \ + install.vcproj diff --git a/build/win32/vs9/Makefile.in b/build/win32/vs9/Makefile.in new file mode 100644 index 0000000..ee8e402 --- /dev/null +++ b/build/win32/vs9/Makefile.in @@ -0,0 +1,477 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ +subdir = build/win32/vs9 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = \ + README.txt \ + glib.sln \ + glib.vsprops \ + glib.vcproj \ + glib.vcprojin \ + glib-genmarshal.vcproj \ + gspawn-win32-helper-console.vcproj \ + gspawn-win32-helper.vcproj \ + gmodule.vcproj \ + gobject.vcproj \ + gobject.vcprojin \ + gthread.vcproj \ + gio.vcproj \ + gio.vcprojin \ + testglib.vcproj \ + install.vcproj + +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) --gnu build/win32/vs9/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu build/win32/vs9/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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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/win32/vs9/README.txt b/build/win32/vs9/README.txt new file mode 100644 index 0000000..43f1334 --- /dev/null +++ b/build/win32/vs9/README.txt @@ -0,0 +1,38 @@ +Note that all this is rather experimental. + +This VS9 solution and the projects it includes are intented to be used +in a GLib source tree unpacked from a tarball. In a git checkout you +first need to use some Unix-like environment or manual work to expand +the .in files needed, mainly config.h.win32.in into config.h.win32 and +glibconfig.h.win32.in into glibconfig.h.win32. You will also need to +expand the .vcprojin files here into .vcproj files. + +The only external dependency is proxy-libintl. Fetch the latest +proxy-libintl-dev zipfile from +http://ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/ for 32-bit +builds, and correspondingly +http://ftp.gnome.org/pub/GNOME/binaries/win64/dependencies/ for 64-bit +builds. Set up the source tree as follows under some arbitrary top +folder : + +\glib\ +\vs9\ + +*this* file you are now reading is thus located at +\glib\\build\win32\vs9\README. + + is either Win32 or x64, as in VS9 project files. + +You should unpack the proxy-libintl-dev zip file into +\vs9\, so that for instance libintl.h end up at +\vs9\\include\libintl.h. + +The "install" project will copy build results and headers into their +appropriate location under \vs9\. For instance, +built DLLs go into \vs9\\bin, built LIBs into +\vs9\\lib and GLib headers into +\vs9\\include\glib-2.0. This is then from where +project files higher in the stack are supposed to look for them, not +from a specific GLib source tree. + +--Tor Lillqvist diff --git a/build/win32/vs9/gio.vcproj b/build/win32/vs9/gio.vcproj new file mode 100644 index 0000000..38ca507 --- /dev/null +++ b/build/win32/vs9/gio.vcproj @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gio.vcprojin b/build/win32/vs9/gio.vcprojin new file mode 100644 index 0000000..1772c46 --- /dev/null +++ b/build/win32/vs9/gio.vcprojin @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "libgio.sourcefiles" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib-genmarshal.vcproj b/build/win32/vs9/glib-genmarshal.vcproj new file mode 100644 index 0000000..7b39d85 --- /dev/null +++ b/build/win32/vs9/glib-genmarshal.vcproj @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib.sln b/build/win32/vs9/glib.sln new file mode 100644 index 0000000..1196284 --- /dev/null +++ b/build/win32/vs9/glib.sln @@ -0,0 +1,152 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib", "glib.vcproj", "{12BCA020-EABF-429E-876A-A476BC9C10C0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmodule", "gmodule.vcproj", "{4214047C-F5C1-40B3-8369-5DCED8C32770}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gobject", "gobject.vcproj", "{F172EFFC-E30F-4593-809E-DB2024B1E753}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C} = {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gthread", "gthread.vcproj", "{C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib-genmarshal", "glib-genmarshal.vcproj", "{BD12E835-5C52-4E5D-8234-1C579F33E27A}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gio", "gio.vcproj", "{F3D1583C-5613-4809-BD98-7CC1C1276F92}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {4214047C-F5C1-40B3-8369-5DCED8C32770} = {4214047C-F5C1-40B3-8369-5DCED8C32770} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gspawn-win32-helper", "gspawn-win32-helper.vcproj", "{289240E7-E167-47CE-A20C-58D852E520BA}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gspawn-win32-helper-console", "gspawn-win32-helper-console.vcproj", "{E40E8A7E-7CAE-4659-9B8B-BC38898E3074}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testglib", "testglib.vcproj", "{64E09909-5599-40C0-B808-27F55F7B823C}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "install", "install.vcproj", "{2093D218-190E-4194-9421-3BA7CBF33B10}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {BD12E835-5C52-4E5D-8234-1C579F33E27A} = {BD12E835-5C52-4E5D-8234-1C579F33E27A} + {F3D1583C-5613-4809-BD98-7CC1C1276F92} = {F3D1583C-5613-4809-BD98-7CC1C1276F92} + {4214047C-F5C1-40B3-8369-5DCED8C32770} = {4214047C-F5C1-40B3-8369-5DCED8C32770} + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074} = {E40E8A7E-7CAE-4659-9B8B-BC38898E3074} + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C} = {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C} + {289240E7-E167-47CE-A20C-58D852E520BA} = {289240E7-E167-47CE-A20C-58D852E520BA} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + EndProjectSection +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 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug|Win32.ActiveCfg = Debug|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug|Win32.Build.0 = Debug|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug|x64.ActiveCfg = Debug|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug|x64.Build.0 = Debug|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release|Win32.ActiveCfg = Release|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release|Win32.Build.0 = Release|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release|x64.ActiveCfg = Release|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release|x64.Build.0 = Release|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug|Win32.ActiveCfg = Debug|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug|Win32.Build.0 = Debug|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug|x64.ActiveCfg = Debug|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug|x64.Build.0 = Debug|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release|Win32.ActiveCfg = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release|Win32.Build.0 = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release|x64.ActiveCfg = Release|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release|x64.Build.0 = Release|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug|Win32.ActiveCfg = Debug|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug|Win32.Build.0 = Debug|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug|x64.ActiveCfg = Debug|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug|x64.Build.0 = Debug|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release|Win32.ActiveCfg = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release|Win32.Build.0 = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release|x64.ActiveCfg = Release|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release|x64.Build.0 = Release|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug|Win32.ActiveCfg = Debug|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug|Win32.Build.0 = Debug|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug|x64.ActiveCfg = Debug|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug|x64.Build.0 = Debug|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release|Win32.ActiveCfg = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release|Win32.Build.0 = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release|x64.ActiveCfg = Release|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release|x64.Build.0 = Release|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug|Win32.ActiveCfg = Debug|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug|Win32.Build.0 = Debug|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug|x64.ActiveCfg = Debug|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug|x64.Build.0 = Debug|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release|Win32.ActiveCfg = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release|Win32.Build.0 = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release|x64.ActiveCfg = Release|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release|x64.Build.0 = Release|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug|Win32.ActiveCfg = Debug|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug|Win32.Build.0 = Debug|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug|x64.ActiveCfg = Debug|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug|x64.Build.0 = Debug|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release|Win32.ActiveCfg = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release|Win32.Build.0 = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release|x64.ActiveCfg = Release|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release|x64.Build.0 = Release|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug|Win32.ActiveCfg = Debug|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug|Win32.Build.0 = Debug|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug|x64.ActiveCfg = Debug|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug|x64.Build.0 = Debug|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release|Win32.ActiveCfg = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release|Win32.Build.0 = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release|x64.ActiveCfg = Release|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release|x64.Build.0 = Release|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug|Win32.ActiveCfg = Debug|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug|Win32.Build.0 = Debug|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug|x64.ActiveCfg = Debug|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug|x64.Build.0 = Debug|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release|Win32.ActiveCfg = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release|Win32.Build.0 = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release|x64.ActiveCfg = Release|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release|x64.Build.0 = Release|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug|Win32.ActiveCfg = Debug|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug|Win32.Build.0 = Debug|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug|x64.ActiveCfg = Debug|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug|x64.Build.0 = Debug|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release|Win32.ActiveCfg = Release|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release|Win32.Build.0 = Release|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release|x64.ActiveCfg = Release|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release|x64.Build.0 = Release|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug|Win32.ActiveCfg = Debug|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug|Win32.Build.0 = Debug|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug|x64.ActiveCfg = Debug|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug|x64.Build.0 = Debug|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release|Win32.ActiveCfg = Release|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release|Win32.Build.0 = Release|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release|x64.ActiveCfg = Release|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/win32/vs9/glib.vcproj b/build/win32/vs9/glib.vcproj new file mode 100644 index 0000000..abc19d7 --- /dev/null +++ b/build/win32/vs9/glib.vcproj @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib.vcprojin b/build/win32/vs9/glib.vcprojin new file mode 100644 index 0000000..fc7e88e --- /dev/null +++ b/build/win32/vs9/glib.vcprojin @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "libglib.sourcefiles" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib.vsprops b/build/win32/vs9/glib.vsprops new file mode 100644 index 0000000..af95dc8 --- /dev/null +++ b/build/win32/vs9/glib.vsprops @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gmodule.vcproj b/build/win32/vs9/gmodule.vcproj new file mode 100644 index 0000000..c8af99c --- /dev/null +++ b/build/win32/vs9/gmodule.vcproj @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gobject.vcproj b/build/win32/vs9/gobject.vcproj new file mode 100644 index 0000000..f465d1f --- /dev/null +++ b/build/win32/vs9/gobject.vcproj @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gobject.vcprojin b/build/win32/vs9/gobject.vcprojin new file mode 100644 index 0000000..9f64f2f --- /dev/null +++ b/build/win32/vs9/gobject.vcprojin @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "libgobject.sourcefiles" + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gspawn-win32-helper-console.vcproj b/build/win32/vs9/gspawn-win32-helper-console.vcproj new file mode 100644 index 0000000..71ff28f --- /dev/null +++ b/build/win32/vs9/gspawn-win32-helper-console.vcproj @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gspawn-win32-helper.vcproj b/build/win32/vs9/gspawn-win32-helper.vcproj new file mode 100644 index 0000000..2d1cfff --- /dev/null +++ b/build/win32/vs9/gspawn-win32-helper.vcproj @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gthread.vcproj b/build/win32/vs9/gthread.vcproj new file mode 100644 index 0000000..66db8d0 --- /dev/null +++ b/build/win32/vs9/gthread.vcproj @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/install.vcproj b/build/win32/vs9/install.vcproj new file mode 100644 index 0000000..6f30f58 --- /dev/null +++ b/build/win32/vs9/install.vcproj @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/testglib.vcproj b/build/win32/vs9/testglib.vcproj new file mode 100644 index 0000000..850abbc --- /dev/null +++ b/build/win32/vs9/testglib.vcproj @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/compile b/compile new file mode 100755 index 0000000..c0096a7 --- /dev/null +++ b/compile @@ -0,0 +1,143 @@ +#! /bin/sh +# Wrapper for compilers which do not understand `-c -o'. + +scriptversion=2009-10-06.20; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software +# Foundation, Inc. +# Written by Tom Tromey . +# +# 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. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand `-c -o'. +Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file `INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; +esac + +ofile= +cfile= +eat= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as `compile cc -o foo foo.c'. + # So we strip `-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no `-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # `.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use `[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# 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/config.guess b/config.guess new file mode 100755 index 0000000..dc84c68 --- /dev/null +++ b/config.guess @@ -0,0 +1,1501 @@ +#! /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 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. 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 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 tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + 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'` + exit ;; + 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:*:[456]) + 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:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-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*: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 ;; + 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 + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-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 or32-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 ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-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 ;; + 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 ;; +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..a809bed --- /dev/null +++ b/config.h.in @@ -0,0 +1,732 @@ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* define if asm blocks can use numeric local labels */ +#undef ASM_NUMERIC_LABELS + +/* poll doesn't work on devices */ +#undef BROKEN_POLL + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Whether to disable memory pools */ +#undef DISABLE_MEM_POOLS + +/* Whether to enable GC friendliness by default */ +#undef ENABLE_GC_FRIENDLY_DEFAULT + +/* always defined to indicate that i18n is enabled */ +#undef ENABLE_NLS + +/* include GRegex */ +#undef ENABLE_REGEX + +/* Define the gettext package to be used */ +#undef GETTEXT_PACKAGE + +/* Define to the GLIB binary age */ +#undef GLIB_BINARY_AGE + +/* Byte contents of gmutex */ +#undef GLIB_BYTE_CONTENTS_GMUTEX + +/* Define to the GLIB interface age */ +#undef GLIB_INTERFACE_AGE + +/* Define the location where the catalogs will be installed */ +#undef GLIB_LOCALE_DIR + +/* Define to the GLIB major version */ +#undef GLIB_MAJOR_VERSION + +/* Define to the GLIB micro version */ +#undef GLIB_MICRO_VERSION + +/* Define to the GLIB minor version */ +#undef GLIB_MINOR_VERSION + +/* The size of gmutex, as computed by sizeof. */ +#undef GLIB_SIZEOF_GMUTEX + +/* The size of system_thread, as computed by sizeof. */ +#undef GLIB_SIZEOF_SYSTEM_THREAD + +/* alpha atomic implementation */ +#undef G_ATOMIC_ALPHA + +/* arm atomic implementation */ +#undef G_ATOMIC_ARM + +/* cris atomic implementation */ +#undef G_ATOMIC_CRIS + +/* crisv32 atomic implementation */ +#undef G_ATOMIC_CRISV32 + +/* i486 atomic implementation */ +#undef G_ATOMIC_I486 + +/* ia64 atomic implementation */ +#undef G_ATOMIC_IA64 + +/* powerpc atomic implementation */ +#undef G_ATOMIC_POWERPC + +/* s390 atomic implementation */ +#undef G_ATOMIC_S390 + +/* sparcv9 atomic implementation */ +#undef G_ATOMIC_SPARCV9 + +/* x86_64 atomic implementation */ +#undef G_ATOMIC_X86_64 + +/* Have inline keyword */ +#undef G_HAVE_INLINE + +/* Have __inline keyword */ +#undef G_HAVE___INLINE + +/* Have __inline__ keyword */ +#undef G_HAVE___INLINE__ + +/* Source file containing theread implementation */ +#undef G_THREAD_SOURCE + +/* A 'va_copy' style function */ +#undef G_VA_COPY + +/* 'va_lists' cannot be copies as values */ +#undef G_VA_COPY_AS_ARRAY + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_NAMESER_COMPAT_H + +/* Define to 1 if you have the `atexit' function. */ +#undef HAVE_ATEXIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_ATTR_XATTR_H + +/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +#undef HAVE_BIND_TEXTDOMAIN_CODESET + +/* Define if you have a version of the snprintf function with semantics as + specified by the ISO C99 standard. */ +#undef HAVE_C99_SNPRINTF + +/* Define if you have a version of the vsnprintf function with semantics as + specified by the ISO C99 standard. */ +#undef HAVE_C99_VSNPRINTF + +/* define to 1 if Carbon is available */ +#undef HAVE_CARBON + +/* Define to 1 if you have the `chown' function. */ +#undef HAVE_CHOWN + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + +/* Have nl_langinfo (CODESET) */ +#undef HAVE_CODESET + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRT_EXTERNS_H + +/* Define to 1 if you have the `dcgettext' function. */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* define for working do while(0) macros */ +#undef HAVE_DOWHILE_MACROS + +/* Define to 1 if you have the `endmntent' function. */ +#undef HAVE_ENDMNTENT + +/* Define to 1 if you have the `endservent' function. */ +#undef HAVE_ENDSERVENT + +/* Define if we have FAM */ +#undef HAVE_FAM + +/* Define to 1 if you have the header file. */ +#undef HAVE_FAM_H + +/* Define if we have FAMNoExists in fam */ +#undef HAVE_FAM_NO_EXISTS + +/* Define to 1 if you have the `fchmod' function. */ +#undef HAVE_FCHMOD + +/* Define to 1 if you have the `fchown' function. */ +#undef HAVE_FCHOWN + +/* Define to 1 if you have the `fdwalk' function. */ +#undef HAVE_FDWALK + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLOAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FSTAB_H + +/* Define to 1 if you have the `fsync' function. */ +#undef HAVE_FSYNC + +/* we have the futex(2) system call */ +#undef HAVE_FUTEX + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getc_unlocked' function. */ +#undef HAVE_GETC_UNLOCKED + +/* Define to 1 if you have the `getgrgid' function. */ +#undef HAVE_GETGRGID + +/* Define to 1 if you have the `getmntent_r' function. */ +#undef HAVE_GETMNTENT_R + +/* Define to 1 if you have the `getmntinfo' function. */ +#undef HAVE_GETMNTINFO + +/* Define to 1 if you have the `getprotobyname_r' function. */ +#undef HAVE_GETPROTOBYNAME_R + +/* Define to 1 if you have the `getpwuid' function. */ +#undef HAVE_GETPWUID + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define to 1 if you have the `gmtime_r' function. */ +#undef HAVE_GMTIME_R + +/* define to use system printf */ +#undef HAVE_GOOD_PRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_GRP_H + +/* Define to 1 if you have the `hasmntopt' function. */ +#undef HAVE_HASMNTOPT + +/* Define to 1 if you have the `inotify_init1' function. */ +#undef HAVE_INOTIFY_INIT1 + +/* define to support printing 64-bit integers with format I64 */ +#undef HAVE_INT64_AND_I64 + +/* Define if you have the 'intmax_t' type in or . */ +#undef HAVE_INTMAX_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if exists, doesn't clash with , and + declares uintmax_t. */ +#undef HAVE_INTTYPES_H_WITH_UINTMAX + +/* Define if you have and nl_langinfo(CODESET). */ +#undef HAVE_LANGINFO_CODESET + +/* Define to 1 if you have the `lchmod' function. */ +#undef HAVE_LCHMOD + +/* Define to 1 if you have the `lchown' function. */ +#undef HAVE_LCHOWN + +/* Define if your file defines LC_MESSAGES. */ +#undef HAVE_LC_MESSAGES + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the `link' function. */ +#undef HAVE_LINK + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `localtime_r' function. */ +#undef HAVE_LOCALTIME_R + +/* Define if you have the 'long double' type. */ +#undef HAVE_LONG_DOUBLE + +/* Define if you have the 'long long' type. */ +#undef HAVE_LONG_LONG + +/* define if system printf can print long long */ +#undef HAVE_LONG_LONG_FORMAT + +/* Define to 1 if you have the `lstat' function. */ +#undef HAVE_LSTAT + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memalign' function. */ +#undef HAVE_MEMALIGN + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_MNTENT_H + +/* Have a monotonic clock */ +#undef HAVE_MONOTONIC_CLOCK + +/* Define to 1 if you have the `nanosleep' function. */ +#undef HAVE_NANOSLEEP + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Have non-POSIX function getgrgid_r */ +#undef HAVE_NONPOSIX_GETGRGID_R + +/* Have non-POSIX function getpwuid_r */ +#undef HAVE_NONPOSIX_GETPWUID_R + +/* Define to 1 if you have the `nsleep' function. */ +#undef HAVE_NSLEEP + +/* Define to 1 if you have the `on_exit' function. */ +#undef HAVE_ON_EXIT + +/* Define to 1 if you have the `pipe2' function. */ +#undef HAVE_PIPE2 + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Have POSIX function getgrgid_r */ +#undef HAVE_POSIX_GETGRGID_R + +/* Have POSIX function getpwuid_r */ +#undef HAVE_POSIX_GETPWUID_R + +/* Define to 1 if you have the `posix_memalign' function. */ +#undef HAVE_POSIX_MEMALIGN + +/* Have function pthread_attr_setstacksize */ +#undef HAVE_PTHREAD_ATTR_SETSTACKSIZE + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_PWD_H + +/* Define to 1 if you have the `readlink' function. */ +#undef HAVE_READLINK + +/* Define to 1 if you have the header file. */ +#undef HAVE_SCHED_H + +/* Define to 1 if libselinux is available */ +#undef HAVE_SELINUX + +/* Define to 1 if you have the header file. */ +#undef HAVE_SELINUX_SELINUX_H + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `setmntent' function. */ +#undef HAVE_SETMNTENT + +/* Define to 1 if you have the `setresuid' function. */ +#undef HAVE_SETRESUID + +/* Define to 1 if you have the `setreuid' function. */ +#undef HAVE_SETREUID + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the `splice' function. */ +#undef HAVE_SPLICE + +/* Define to 1 if you have the `statfs' function. */ +#undef HAVE_STATFS + +/* Define to 1 if you have the `statvfs' function. */ +#undef HAVE_STATVFS + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define if exists, doesn't clash with , and declares + uintmax_t. */ +#undef HAVE_STDINT_H_WITH_UINTMAX + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `stpcpy' function. */ +#undef HAVE_STPCPY + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* 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 + +/* Have functions strlcpy and strlcat */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the `strsignal' function. */ +#undef HAVE_STRSIGNAL + +/* Define to 1 if `f_bavail' is a member of `struct statfs'. */ +#undef HAVE_STRUCT_STATFS_F_BAVAIL + +/* Define to 1 if `f_fstypename' is a member of `struct statfs'. */ +#undef HAVE_STRUCT_STATFS_F_FSTYPENAME + +/* Define to 1 if `f_basetype' is a member of `struct statvfs'. */ +#undef HAVE_STRUCT_STATVFS_F_BASETYPE + +/* Define to 1 if `st_atimensec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_ATIMENSEC + +/* Define to 1 if `st_atim.tv_nsec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC + +/* Define to 1 if `st_blksize' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLKSIZE + +/* Define to 1 if `st_blocks' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLOCKS + +/* Define to 1 if `st_ctimensec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_CTIMENSEC + +/* Define to 1 if `st_ctim.tv_nsec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC + +/* Define to 1 if `st_mtimensec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_MTIMENSEC + +/* Define to 1 if `st_mtim.tv_nsec' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC + +/* Define to 1 if you have the `symlink' function. */ +#undef HAVE_SYMLINK + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_INOTIFY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MNTCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MNTTAB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MOUNT_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_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* found fd_set in sys/select.h */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATVFS_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_SYSCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VFSTAB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VMOUNT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_XATTR_H + +/* Define to 1 if you have the `timegm' function. */ +#undef HAVE_TIMEGM + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if your printf function family supports positional parameters as + specified by Unix98. */ +#undef HAVE_UNIX98_PRINTF + +/* Define to 1 if you have the `unsetenv' function. */ +#undef HAVE_UNSETENV + +/* Define to 1 if you have the `utimes' function. */ +#undef HAVE_UTIMES + +/* Define to 1 if you have the `valloc' function. */ +#undef HAVE_VALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_VALUES_H + +/* Define to 1 if you have the `vasprintf' function. */ +#undef HAVE_VASPRINTF + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define if you have the 'wchar_t' type. */ +#undef HAVE_WCHAR_T + +/* Define to 1 if you have the `wcslen' function. */ +#undef HAVE_WCSLEN + +/* Define if you have the 'wint_t' type. */ +#undef HAVE_WINT_T + +/* Have a working bcopy */ +#undef HAVE_WORKING_BCOPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_WSPIAPI_H + +/* Define to 1 if xattr is available */ +#undef HAVE_XATTR + +/* Define to 1 if xattr API uses XATTR_NOFOLLOW */ +#undef HAVE_XATTR_NOFOLLOW + +/* Define to 1 if you have the `_NSGetEnviron' function. */ +#undef HAVE__NSGETENVIRON + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Do we cache iconv descriptors */ +#undef NEED_ICONV_CACHE + +/* didn't find fd_set */ +#undef NO_FD_SET + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* global 'sys_errlist' not found */ +#undef NO_SYS_ERRLIST + +/* global 'sys_siglist' not found */ +#undef NO_SYS_SIGLIST + +/* global 'sys_siglist' not declared */ +#undef NO_SYS_SIGLIST_DECL + +/* 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 + +/* Maximum POSIX RT priority */ +#undef POSIX_MAX_PRIORITY + +/* define if posix_memalign() can allocate any size */ +#undef POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS + +/* Minimum POSIX RT priority */ +#undef POSIX_MIN_PRIORITY + +/* The POSIX RT yield function */ +#undef POSIX_YIELD_FUNC + +/* whether realloc (NULL,) works */ +#undef REALLOC_0_WORKS + +/* Define if you have correct malloc prototypes */ +#undef SANE_MALLOC_PROTOS + +/* The size of `char', as computed by sizeof. */ +#undef SIZEOF_CHAR + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* The size of `__int64', as computed by sizeof. */ +#undef SIZEOF___INT64 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Number of arguments to statfs() */ +#undef STATFS_ARGS + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Using GNU libiconv */ +#undef USE_LIBICONV_GNU + +/* Using a native implementation of iconv in a separate library */ +#undef USE_LIBICONV_NATIVE + +/* using the system-supplied PCRE library */ +#undef USE_SYSTEM_PCRE + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* 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 + +/* Needed to get declarations for msg_control and msg_controllen on Solaris */ +#undef _XOPEN_SOURCE + +/* Needed to get declarations for msg_control and msg_controllen on Solaris */ +#undef _XOPEN_SOURCE_EXTENDED + +/* Needed to get declarations for msg_control and msg_controllen on Solaris */ +#undef __EXTENSIONS__ + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to long or long long if and don't define. */ +#undef intmax_t + +/* Define to empty if the C compiler doesn't support this keyword. */ +#undef signed + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/config.h.win32.in b/config.h.win32.in new file mode 100644 index 0000000..df30e82 --- /dev/null +++ b/config.h.win32.in @@ -0,0 +1,819 @@ +/* config.h.win32.in Merged from two versions generated by configure for gcc and MSVC. */ +/* config.h. Generated by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* define if asm blocks can use numeric local labels */ +/* #undef ASM_NUMERIC_LABELS */ + +/* poll doesn't work on devices */ +#define BROKEN_POLL 1 + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Whether to disable memory pools */ +/* #undef DISABLE_MEM_POOLS */ + +/* Whether to enable GC friendliness by default */ +/* #undef ENABLE_GC_FRIENDLY_DEFAULT */ + +/* always defined to indicate that i18n is enabled */ +#define ENABLE_NLS 1 + +/* include GRegex */ +#define ENABLE_REGEX /**/ + +/* Define the gettext package to be used */ +#define GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" + +/* Define to the GLIB binary age */ +#define GLIB_BINARY_AGE @GLIB_BINARY_AGE@ + +/* Byte contents of gmutex */ +/* #undef GLIB_BYTE_CONTENTS_GMUTEX */ + +/* Define to the GLIB interface age */ +#define GLIB_INTERFACE_AGE @GLIB_INTERFACE_AGE@ + +/* Define the location where the catalogs will be installed */ +#define GLIB_LOCALE_DIR "NONE/share/locale" + +/* Define to the GLIB major version */ +#define GLIB_MAJOR_VERSION @GLIB_MAJOR_VERSION@ + +/* Define to the GLIB micro version */ +#define GLIB_MICRO_VERSION @GLIB_MICRO_VERSION@ + +/* Define to the GLIB minor version */ +#define GLIB_MINOR_VERSION @GLIB_MINOR_VERSION@ + +/* The size of gmutex, as computed by sizeof. */ +/* #undef GLIB_SIZEOF_GMUTEX */ + +/* The size of system_thread, as computed by sizeof. */ +#define GLIB_SIZEOF_SYSTEM_THREAD 4 + +/* alpha atomic implementation */ +/* #undef G_ATOMIC_ALPHA */ + +/* arm atomic implementation */ +/* #undef G_ATOMIC_ARM */ + +/* cris atomic implementation */ +/* #undef G_ATOMIC_CRIS */ + +/* crisv32 atomic implementation */ +/* #undef G_ATOMIC_CRISV32 */ + +/* i486 atomic implementation */ +#ifndef _MSC_VER +#define G_ATOMIC_I486 1 +#endif /* _MSC_VER */ + +/* ia64 atomic implementation */ +/* #undef G_ATOMIC_IA64 */ + +/* powerpc atomic implementation */ +/* #undef G_ATOMIC_POWERPC */ + +/* s390 atomic implementation */ +/* #undef G_ATOMIC_S390 */ + +/* sparcv9 atomic implementation */ +/* #undef G_ATOMIC_SPARCV9 */ + +/* x86_64 atomic implementation */ +/* #undef G_ATOMIC_X86_64 */ + +/* Have inline keyword */ +#ifndef _MSC_VER +#define G_HAVE_INLINE 1 +#else /* _MSC_VER */ +/* #undef G_HAVE_INLINE */ +#endif /* _MSC_VER */ + +/* Have __inline keyword */ +#define G_HAVE___INLINE 1 + +/* Have __inline__ keyword */ +#if !defined(_MSC_VER) && !defined(__DMC__) +#define G_HAVE___INLINE__ 1 +#else /* _MSC_VER or __DMC__ */ +/* #undef G_HAVE___INLINE__ */ +#endif /* _MSC_VER or __DMC__ */ + +/* Source file containing theread implementation */ +#define G_THREAD_SOURCE "gthread-win32.c" + +/* A 'va_copy' style function */ +#ifndef _MSC_VER +#define G_VA_COPY va_copy +#else /* _MSC_VER */ +/* #undef G_VA_COPY */ +#endif /* _MSC_VER */ + +/* 'va_lists' cannot be copies as values */ +/* #undef G_VA_COPY_AS_ARRAY */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +/* #undef HAVE_ALLOCA_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ARPA_NAMESER_COMPAT_H */ + +/* Define to 1 if you have the `atexit' function. */ +#define HAVE_ATEXIT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ATTR_XATTR_H */ + +/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 + +/* Define if you have a version of the snprintf function with semantics as + specified by the ISO C99 standard. */ +/* #undef HAVE_C99_SNPRINTF */ + +/* Define if you have a version of the vsnprintf function with semantics as + specified by the ISO C99 standard. */ +/* #undef HAVE_C99_VSNPRINTF */ + +/* define to 1 if Carbon is available */ +/* #undef HAVE_CARBON */ + +/* Define to 1 if you have the `chown' function. */ +/* #undef HAVE_CHOWN */ + +/* Define to 1 if you have the `clock_gettime' function. */ +/* #undef HAVE_CLOCK_GETTIME */ + +/* Have nl_langinfo (CODESET) */ +/* #undef HAVE_CODESET */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CRT_EXTERNS_H */ + +/* Define to 1 if you have the `dcgettext' function. */ +#define HAVE_DCGETTEXT 1 + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +#define HAVE_DIRENT_H 1 +#else +/* #undef HAVE_DIRENT_H */ +#endif + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* define for working do while(0) macros */ +#define HAVE_DOWHILE_MACROS 1 + +/* Define to 1 if you have the `endmntent' function. */ +/* #undef HAVE_ENDMNTENT */ + +/* Define to 1 if you have the `endservent' function. */ +/* #undef HAVE_ENDSERVENT */ + +/* Define if we have FAM */ +/* #undef HAVE_FAM */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_FAM_H */ + +/* Define if we have FAMNoExists in fam */ +/* #undef HAVE_FAM_NO_EXISTS */ + +/* Define to 1 if you have the `fchmod' function. */ +/* #undef HAVE_FCHMOD */ + +/* Define to 1 if you have the `fchown' function. */ +/* #undef HAVE_FCHOWN */ + +/* Define to 1 if you have the `fdwalk' function. */ +/* #undef HAVE_FDWALK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_FLOAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_FSTAB_H */ + +/* Define to 1 if you have the `fsync' function. */ +/* #undef HAVE_FSYNC */ + +/* we have the futex(2) system call */ +/* #undef HAVE_FUTEX */ + +/* Define to 1 if you have the `getcwd' function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the `getc_unlocked' function. */ +/* #undef HAVE_GETC_UNLOCKED */ + +/* Define to 1 if you have the `getgrgid' function. */ +/* #undef HAVE_GETGRGID */ + +/* Define to 1 if you have the `getmntent_r' function. */ +/* #undef HAVE_GETMNTENT_R */ + +/* Define to 1 if you have the `getmntinfo' function. */ +/* #undef HAVE_GETMNTINFO */ + +/* Define to 1 if you have the `getprotobyname_r' function. */ +/* #undef HAVE_GETPROTOBYNAME_R */ + +/* Define to 1 if you have the `getpwuid' function. */ +/* #undef HAVE_GETPWUID */ + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#define HAVE_GETTEXT 1 + +/* Define to 1 if you have the `gmtime_r' function. */ +/* #undef HAVE_GMTIME_R */ + +/* define to use system printf */ +/* #undef HAVE_GOOD_PRINTF */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GRP_H */ + +/* Define to 1 if you have the `hasmntopt' function. */ +/* #undef HAVE_HASMNTOPT */ + +/* Define to 1 if you have the `inotify_init1' function. */ +/* #undef HAVE_INOTIFY_INIT1 */ + +/* define to support printing 64-bit integers with format I64 */ +#define HAVE_INT64_AND_I64 1 + +/* Define if you have the 'intmax_t' type in or . */ +#ifndef _MSC_VER +#define HAVE_INTMAX_T 1 +#else /* _MSC_VER */ +/* #undef HAVE_INTMAX_T */ +#endif /* _MSC_VER */ + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +#define HAVE_INTTYPES_H 1 +#else /* _MSC_VER */ +/* #undef HAVE_INTTYPES_H */ +#endif /* _MSC_VER */ + +/* Define if exists, doesn't clash with , and + declares uintmax_t. */ +#ifndef _MSC_VER +#define HAVE_INTTYPES_H_WITH_UINTMAX 1 +#else /* _MSC_VER */ +/* #undef HAVE_INTTYPES_H_WITH_UINTMAX */ +#endif /* _MSC_VER */ + +/* Define if you have and nl_langinfo(CODESET). */ +/* #undef HAVE_LANGINFO_CODESET */ + +/* Define to 1 if you have the `lchmod' function. */ +/* #undef HAVE_LCHMOD */ + +/* Define to 1 if you have the `lchown' function. */ +/* #undef HAVE_LCHOWN */ + +/* Define if your file defines LC_MESSAGES. */ +/* #undef HAVE_LC_MESSAGES */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the `link' function. */ +/* #undef HAVE_LINK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if you have the `localtime_r' function. */ +/* #undef HAVE_LOCALTIME_R */ + +/* Define if you have the 'long double' type. */ +#define HAVE_LONG_DOUBLE 1 + +/* Define if you have the 'long long' type. */ +#ifndef _MSC_VER +#define HAVE_LONG_LONG 1 +#else /* _MSC_VER */ +/* #undef HAVE_LONG_LONG */ +#endif /* _MSC_VER */ + +/* define if system printf can print long long */ +#define HAVE_LONG_LONG_FORMAT 1 + +/* Define to 1 if you have the `lstat' function. */ +/* #undef HAVE_LSTAT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memalign' function. */ +/* #undef HAVE_MEMALIGN */ + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mmap' function. */ +/* #undef HAVE_MMAP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MNTENT_H */ + +/* Have a monotonic clock */ +/* #undef HAVE_MONOTONIC_CLOCK */ + +/* Define to 1 if you have the `nanosleep' function. */ +/* #undef HAVE_NANOSLEEP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETDB_H */ + +/* Have non-POSIX function getgrgid_r */ +/* #undef HAVE_NONPOSIX_GETGRGID_R */ + +/* Have non-POSIX function getpwuid_r */ +/* #undef HAVE_NONPOSIX_GETPWUID_R */ + +/* Define to 1 if you have the `nsleep' function. */ +/* #undef HAVE_NSLEEP */ + +/* Define to 1 if you have the `on_exit' function. */ +/* #undef HAVE_ON_EXIT */ + +/* Define to 1 if you have the `pipe2' function. */ +/* #undef HAVE_PIPE2 */ + +/* Define to 1 if you have the `poll' function. */ +/* #undef HAVE_POLL */ + +/* Have POSIX function getgrgid_r */ +/* #undef HAVE_POSIX_GETGRGID_R */ + +/* Have POSIX function getpwuid_r */ +/* #undef HAVE_POSIX_GETPWUID_R */ + +/* Define to 1 if you have the `posix_memalign' function. */ +/* #undef HAVE_POSIX_MEMALIGN */ + +/* Have function pthread_attr_setstacksize */ +/* #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE */ + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#define HAVE_PTRDIFF_T 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PWD_H */ + +/* Define to 1 if you have the `readlink' function. */ +/* #undef HAVE_READLINK */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SCHED_H */ + +/* Define to 1 if libselinux is available */ +/* #undef HAVE_SELINUX */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SELINUX_SELINUX_H */ + +/* Define to 1 if you have the `setenv' function. */ +/* #undef HAVE_SETENV */ + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if you have the `setmntent' function. */ +/* #undef HAVE_SETMNTENT */ + +/* Define to 1 if you have the `setresuid' function. */ +/* #undef HAVE_SETRESUID */ + +/* Define to 1 if you have the `setreuid' function. */ +/* #undef HAVE_SETREUID */ + +/* Define to 1 if you have the `snprintf' function. */ +#ifndef _MSC_VER +#define HAVE_SNPRINTF 1 +#ifdef __DMC__ +#define snprintf _snprintf +#endif +#else /* _MSC_VER */ +/* #undef HAVE_SNPRINTF */ +#endif /* _MSC_VER */ + +/* Define to 1 if you have the `splice' function. */ +/* #undef HAVE_SPLICE */ + +/* Define to 1 if you have the `statfs' function. */ +/* #undef HAVE_STATFS */ + +/* Define to 1 if you have the `statvfs' function. */ +/* #undef HAVE_STATVFS */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +#define HAVE_STDINT_H 1 +#else /* _MSC_VER */ +/* #undef HAVE_STDINT_H */ +#endif /* _MSC_VER */ + +/* Define if exists, doesn't clash with , and + declares uintmax_t. */ +#ifndef _MSC_VER +#define HAVE_STDINT_H_WITH_UINTMAX 1 +#else /* _MSC_VER */ +/* #undef HAVE_STDINT_H_WITH_UINTMAX */ +#endif /* _MSC_VER */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `stpcpy' function. */ +/* #undef HAVE_STPCPY */ + +/* Define to 1 if you have the `strcasecmp' function. */ +#if !defined(_MSC_VER) && !defined(__DMC__) +#define HAVE_STRCASECMP 1 +#else /* _MSC_VER or __DMC__ */ +/* #undef HAVE_STRCASECMP */ +#endif /* _MSC_VER or __DMC__ */ + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#if !defined(_MSC_VER) && !defined(__DMC__) +#define HAVE_STRINGS_H 1 +#else /* _MSC_VER or __DMC__ */ +/* #undef HAVE_STRINGS_H */ +#endif /* _MSC_VER or __DMC__ */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Have functions strlcpy and strlcat */ +/* #undef HAVE_STRLCPY */ + +/* Define to 1 if you have the `strncasecmp' function. */ +#if !defined(_MSC_VER) && !defined(__DMC__) +#define HAVE_STRNCASECMP 1 +#else /* _MSC_VER or __DMC__ */ +/* #undef HAVE_STRNCASECMP */ +#endif /* _MSC_VER or __DMC__ */ + +/* Define to 1 if you have the `strndup' function. */ +/* #undef HAVE_STRNDUP */ + +/* Define to 1 if you have the `strsignal' function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define to 1 if `f_bavail' is member of `struct statfs'. */ +/* #undef HAVE_STRUCT_STATFS_F_BAVAIL */ + +/* Define to 1 if `f_fstypename' is member of `struct statfs'. */ +/* #undef HAVE_STRUCT_STATFS_F_FSTYPENAME */ + +/* Define to 1 if `f_basetype' is member of `struct statvfs'. */ +/* #undef HAVE_STRUCT_STATVFS_F_BASETYPE */ + +/* Define to 1 if `st_atimensec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_ATIMENSEC */ + +/* Define to 1 if `st_atim.tv_nsec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC */ + +/* Define to 1 if `st_blksize' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_BLKSIZE */ + +/* Define to 1 if `st_blocks' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_BLOCKS */ + +/* Define to 1 if `st_ctimensec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_CTIMENSEC */ + +/* Define to 1 if `st_ctim.tv_nsec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC */ + +/* Define to 1 if `st_mtimensec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_MTIMENSEC */ + +/* Define to 1 if `st_mtim.tv_nsec' is member of `struct stat'. */ +/* #undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC */ + +/* Define to 1 if you have the `symlink' function. */ +/* #undef HAVE_SYMLINK */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_INOTIFY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MNTCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MNTTAB_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MOUNT_H */ + +/* Define to 1 if you have the header file. */ +#if !defined(_MSC_VER) && !defined(__DMC__) +#define HAVE_SYS_PARAM_H 1 +#else /* _MSC_VER or __DMC__ */ +/* #undef HAVE_SYS_PARAM_H */ +#endif /* _MSC_VER or __DMC__ */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_POLL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PRCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_RESOURCE_H */ + +/* found fd_set in sys/select.h */ +/* #undef HAVE_SYS_SELECT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_STATFS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_STATVFS_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. */ +/* #undef HAVE_SYS_SYSCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_TIMES_H */ + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +#define HAVE_SYS_TIME_H 1 +#else /* _MSC_VER */ +/* #undef HAVE_SYS_TIME_H */ +#endif /* _MSC_VER */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UIO_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_VFSTAB_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_VFS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_VMOUNT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_WAIT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_XATTR_H */ + +/* Define to 1 if you have the `timegm' function. */ +/* #undef HAVE_TIMEGM */ + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +#define HAVE_UNISTD_H 1 +#else /* _MSC_VER */ +/* #undef HAVE_UNISTD_H */ +#endif /* _MSC_VER */ + +/* Define if your printf function family supports positional parameters as + specified by Unix98. */ +/* #undef HAVE_UNIX98_PRINTF */ + +/* Define to 1 if you have the `unsetenv' function. */ +/* #undef HAVE_UNSETENV */ + +/* Define to 1 if you have the `utimes' function. */ +/* #undef HAVE_UTIMES */ + +/* Define to 1 if you have the `valloc' function. */ +/* #undef HAVE_VALLOC */ + +/* Define to 1 if you have the header file. */ +#if !defined(_MSC_VER) && !defined(__DMC__) +#define HAVE_VALUES_H 1 +#else /* _MSC_VER or __DMC__ */ +/* #undef HAVE_VALUES_H */ +#endif /* _MSC_VER or __DMC__ */ + +/* Define to 1 if you have the `vasprintf' function. */ +#define HAVE_VASPRINTF 1 + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#ifndef _MSC_VER +#define HAVE_VSNPRINTF 1 +#ifdef __DMC__ +#define vsnprintf _vsnprintf +#endif +#else /* _MSC_VER */ +/* #undef HAVE_VSNPRINTF */ +#endif /* _MSC_VER */ + +/* Define if you have the 'wchar_t' type. */ +#define HAVE_WCHAR_T 1 + +/* Define to 1 if you have the `wcslen' function. */ +#define HAVE_WCSLEN 1 + +/* Define if you have the 'wint_t' type. */ +#define HAVE_WINT_T 1 + +/* Have a working bcopy */ +/* #undef HAVE_WORKING_BCOPY */ + +/* Define to 1 if you have the header file. */ +#ifndef _MSC_VER +/* #undef HAVE_WSPIAPI_H */ +#else +#define HAVE_WSPIAPI_H 1 +#endif + +/* Define to 1 if xattr is available */ +/* #undef HAVE_XATTR */ + +/* Define to 1 if xattr API uses XATTR_NOFOLLOW */ +/* #undef HAVE_XATTR_NOFOLLOW */ + +/* Define to 1 if you have the `_NSGetEnviron' function. */ +/* #undef HAVE__NSGETENVIRON */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Do we cache iconv descriptors */ +#define NEED_ICONV_CACHE 1 + +/* didn't find fd_set */ +#define NO_FD_SET 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* global 'sys_errlist' not found */ +#define NO_SYS_ERRLIST 1 + +/* global 'sys_siglist' not found */ +#define NO_SYS_SIGLIST 1 + +/* global 'sys_siglist' not declared */ +#define NO_SYS_SIGLIST_DECL 1 + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=glib" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "glib" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "glib @GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@.@GLIB_MICRO_VERSION@" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "glib" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@.@GLIB_MICRO_VERSION@" + +/* Maximum POSIX RT priority */ +/* #undef POSIX_MAX_PRIORITY */ + +/* define if posix_memalign() can allocate any size */ +/* #undef POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS */ + +/* Minimum POSIX RT priority */ +/* #undef POSIX_MIN_PRIORITY */ + +/* The POSIX RT yield function */ +/* #undef POSIX_YIELD_FUNC */ + +/* whether realloc (NULL,) works */ +#define REALLOC_0_WORKS 1 + +/* Define if you have correct malloc prototypes */ +#ifndef _MSC_VER +#define SANE_MALLOC_PROTOS 1 +#else /* _MSC_VER */ +/* #undef SANE_MALLOC_PROTOS */ +#endif /* _MSC_VER */ + +/* The size of `char', as computed by sizeof. */ +#define SIZEOF_CHAR 1 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 4 + +/* The size of `long long', as computed by sizeof. */ +#ifndef _MSC_VER +#define SIZEOF_LONG_LONG 8 +#else /* _MSC_VER */ +#define SIZEOF_LONG_LONG 0 +#endif /* _MSC_VER */ + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 4 + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P 4 + +/* The size of `__int64', as computed by sizeof. */ +#define SIZEOF___INT64 8 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Number of arguments to statfs() */ +/* #undef STATFS_ARGS */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Using GNU libiconv */ +/* #undef USE_LIBICONV_GNU */ + +/* Using a native implementation of iconv in a separate library */ +#define USE_LIBICONV_NATIVE 1 + +/* using the system-supplied PCRE library */ +/* #undef USE_SYSTEM_PCRE */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +/* #undef WORDS_BIGENDIAN */ + +/* 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 */ + +/* Needed to get declarations for msg_control and msg_controllen on Solaris */ +/* #undef _XOPEN_SOURCE */ + +/* Needed to get declarations for msg_control and msg_controllen on Solaris */ +/* #undef _XOPEN_SOURCE_EXTENDED */ + +/* Needed to get declarations for msg_control and msg_controllen on Solaris */ +/* #undef __EXTENSIONS__ */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to long or long long if and don't define. */ +/* #undef intmax_t */ + +/* Define to empty if the C compiler doesn't support this keyword. */ +/* #undef signed */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..2a55a50 --- /dev/null +++ b/config.sub @@ -0,0 +1,1705 @@ +#! /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 +# Free Software Foundation, Inc. + +timestamp='2009-11-20' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . 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 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-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/'` + ;; + *) + 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 \ + | 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 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | 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 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | 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 | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-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-* \ + | 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-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | 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-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | 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-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | 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-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | 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 + ;; + 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) + 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'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + 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-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + 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) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + 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 + ;; + 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 + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tile*) + basic_machine=tile-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 + ;; + 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* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -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 + ;; + -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 + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + 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..df09121 --- /dev/null +++ b/configure @@ -0,0 +1,31407 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.65 for glib 2.24.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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. +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" + 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. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$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=glib +$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 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=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&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'" + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +$* +_LT_EOF + exit 0 +fi + +# 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 + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# 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='glib' +PACKAGE_TARNAME='glib' +PACKAGE_VERSION='2.24.0' +PACKAGE_STRING='glib 2.24.0' +PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=glib' +PACKAGE_URL='' + +ac_unique_file="glib/glib.h" +# 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_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +ENABLE_MAN_FALSE +ENABLE_MAN_TRUE +XMLCATALOG +XML_CATALOG_FILE +XSLTPROC +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 +HTML_DIR +GTKDOC_MKPDF +GTKDOC_REBASE +GTKDOC_CHECK +GLIB_GENMARSHAL +CROSS_COMPILING_FALSE +CROSS_COMPILING_TRUE +G_LIBS_EXTRA +PCRE_WARN_CFLAGS +PCRE_REQUIRES +PCRE_LIBS +PCRE_CFLAGS +USE_SYSTEM_PCRE_FALSE +USE_SYSTEM_PCRE_TRUE +ENABLE_REGEX_FALSE +ENABLE_REGEX_TRUE +HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE +HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE +G_THREAD_LIBS_EXTRA +G_THREAD_LIBS_FOR_GTHREAD +G_THREAD_LIBS +G_THREAD_CFLAGS +HAVE_THREADS_FALSE +HAVE_THREADS_TRUE +GTHREAD_COMPILE_IMPL_DEFINES +PLATFORM_WIN32_FALSE +PLATFORM_WIN32_TRUE +ENABLE_TIMELOOP_FALSE +ENABLE_TIMELOOP_TRUE +PLATFORMDEP +XATTR_LIBS +HAVE_FAM_FALSE +HAVE_FAM_TRUE +FAM_LIBS +HAVE_FEN_FALSE +HAVE_FEN_TRUE +HAVE_INOTIFY_FALSE +HAVE_INOTIFY_TRUE +SELINUX_LIBS +GIO_MODULE_DIR +GIO +GSPAWN +GLIB_DEBUG_FLAGS +G_MODULE_NEED_USCORE +G_MODULE_BROKEN_RTLD_GLOBAL +G_MODULE_HAVE_DLERROR +G_MODULE_LDFLAGS +G_MODULE_PLUGIN_LIBS +G_MODULE_LIBS_EXTRA +G_MODULE_LIBS +G_MODULE_IMPL +G_MODULE_SUPPORTED +HAVE_GOOD_PRINTF_FALSE +HAVE_GOOD_PRINTF_TRUE +LIBASYNCNS_LIBADD +HAVE_SUNSTUDIO_VISIBILITY_FALSE +HAVE_SUNSTUDIO_VISIBILITY_TRUE +HAVE_GNUC_VISIBILITY_FALSE +HAVE_GNUC_VISIBILITY_TRUE +ALLOCA +OS_WIN32_AND_DLL_COMPILATION_FALSE +OS_WIN32_AND_DLL_COMPILATION_TRUE +GLIB_WIN32_STATIC_COMPILATION_DEFINE +CXXCPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +lt_ECHO +AR +LN_S +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +ICONV_LIBS +GETTEXT_PACKAGE +MKINSTALLDIRS +POSUB +POFILES +PO_IN_DATADIR_FALSE +PO_IN_DATADIR_TRUE +INTLLIBS +INSTOBJEXT +GMOFILES +DATADIRNAME +CATOBJEXT +CATALOGS +XGETTEXT +GMSGFMT +MSGFMT_OPTS +MSGFMT +USE_NLS +CONFIG_STATUS_DEPENDENCIES +ZLIB_LIBS +GLIBC21 +EGREP +GREP +pkgpyexecdir +pyexecdir +pkgpythondir +pythondir +PYTHON_PLATFORM +PYTHON_EXEC_PREFIX +PYTHON_PREFIX +PYTHON_VERSION +PYTHON +PERL_PATH +REBUILD +INDENT +PERL +GLIB_EXTRA_CFLAGS +PKG_CONFIG +HAVE_CXX_FALSE +HAVE_CXX_TRUE +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +CXXFLAGS +ac_ct_CXX +CXX +HAVE_GLIB_RUNTIME_LIBDIR_FALSE +HAVE_GLIB_RUNTIME_LIBDIR_TRUE +ABS_GLIB_RUNTIME_LIBDIR +GLIB_RUNTIME_LIBDIR +DISABLE_MEM_POOLS +LIBTOOL_EXPORT_OPTIONS +MS_LIB_AVAILABLE_FALSE +MS_LIB_AVAILABLE_TRUE +ms_librarian +RANLIB +NM +WINDRES +OS_CARBON_FALSE +OS_CARBON_TRUE +OS_LINUX_FALSE +OS_LINUX_TRUE +OS_UNIX_FALSE +OS_UNIX_TRUE +OS_WIN32_X64_FALSE +OS_WIN32_X64_TRUE +OS_WIN32_FALSE +OS_WIN32_TRUE +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +LIB_EXE_MACHINE_FLAG +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +LT_CURRENT_MINUS_AGE +LT_AGE +LT_REVISION +LT_CURRENT +LT_RELEASE +GLIB_BINARY_AGE +GLIB_INTERFACE_AGE +GLIB_VERSION +GLIB_MICRO_VERSION +GLIB_MINOR_VERSION +GLIB_MAJOR_VERSION +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +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_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_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_debug +enable_gc_friendly +enable_mem_pools +enable_threads +enable_rebuilds +enable_visibility +with_runtime_libdir +enable_largefile +with_libiconv +enable_iconv_cache +enable_static +enable_shared +with_pic +enable_fast_install +with_gnu_ld +enable_libtool_lock +enable_included_printf +with_gio_module_dir +enable_selinux +enable_fam +enable_xattr +with_threads +enable_regex +with_pcre +with_html_dir +enable_gtk_doc +enable_gtk_doc_html +enable_gtk_doc_pdf +enable_man +with_xml_catalog +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +PKG_CONFIG +PCRE_CFLAGS +PCRE_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=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 glib 2.24.0 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/glib] + --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] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of glib 2.24.0:";; + 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-silent-rules less verbose build output (undo: `make V=1') + --disable-silent-rules verbose build output (undo: `make V=0') + --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-debug=[no/minimum/yes] + turn on debugging [default=minimum] + --enable-gc-friendly turn on garbage collector friendliness [default=no] + --disable-mem-pools disable all glib memory pools + --enable-threads turn on basic thread support [default=yes] ([=no] + will override --with-threads) + --disable-rebuilds disable all source autogeneration rules + --disable-visibility don't use ELF visibility attributes + --disable-largefile omit support for large files + --enable-iconv-cache=[yes/no/auto] + cache iconv descriptors [default=auto] + --enable-static[=PKGS] build static libraries [default=no] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-included-printf + use included printf [default=auto] + --disable-selinux build without selinux support + --disable-fam build without enabling fam for file system monitoring + --disable-xattr build without xattr support + --disable-regex disable the compilation of GRegex + --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-man regenerate man pages from Docbook [default=no] + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-runtime-libdir=RELPATH + Install runtime libraries relative to libdir + --with-libiconv=[no/gnu/native] + use the libiconv library + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-gio-module-dir=PATH + Load gio modules from this directory + [LIBDIR/gio/modules] + --with-threads=[none/posix/dce/win32] + specify a thread implementation to use + --with-pcre=[internal/system] + specify whether to use the internal or the + system-supplied PCRE library + --with-html-dir=PATH path to installed docs + --with-xml-catalog=CATALOG + path to xml catalog to use + +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 + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + PKG_CONFIG path to pkg-config utility + PCRE_CFLAGS C compiler flags for PCRE, overriding pkg-config + PCRE_LIBS linker flags for PCRE, 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 +glib configure 2.24.0 +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# 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; } >/dev/null && { + 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_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_cxx_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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.$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;} +( cat <<\_ASBOX +## ------------------------------------------------------------------- ## +## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=glib ## +## ------------------------------------------------------------------- ## +_ASBOX + ) | 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# 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; test "x$as_lineno_stack" = x && { as_lineno=; 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_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; } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_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_cxx_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# 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 &5 +$as_echo_n "checking for $2.$3... " >&6; } +if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +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=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_member + +# 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type +cat >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 glib $as_me 2.24.0, which was +generated by GNU Autoconf 2.65. 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 + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + 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 + ac_site_file1=$CONFIG_SITE +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" + 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 + +# 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 + + + + + +# Save this value here, since automake will set cflags later +cflags_set=${CFLAGS+set} + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done +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. + + +# 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 test "${ac_cv_path_install+set}" = set; 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 test "${ac_cv_prog_STRIP+set}" = set; 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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 test "${ac_cv_path_mkdir+set}" = set; 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 test "${ac_cv_prog_AWK+set}" = set; 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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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='glib' + VERSION='2.24.0' + + +# 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. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +# Specify a configuration file +ac_config_headers="$ac_config_headers config.h" + + +# Support silent build rules, requires at least automake-1.11. Enable +# by either passing --enable-silent-rules to configure or passing V=0 +# to make +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in +yes) AM_DEFAULT_VERBOSITY=0;; +no) AM_DEFAULT_VERBOSITY=1;; +*) AM_DEFAULT_VERBOSITY=1;; +esac +AM_BACKSLASH='\' + + +GLIB_MAJOR_VERSION=2 +GLIB_MINOR_VERSION=24 +GLIB_MICRO_VERSION=0 +GLIB_INTERFACE_AGE=0 +GLIB_BINARY_AGE=2400 +GLIB_VERSION=2.24.0 + + + + + + + + + +$as_echo "#define GLIB_MAJOR_VERSION 2" >>confdefs.h + + +$as_echo "#define GLIB_MINOR_VERSION 24" >>confdefs.h + + +$as_echo "#define GLIB_MICRO_VERSION 0" >>confdefs.h + + +$as_echo "#define GLIB_INTERFACE_AGE 0" >>confdefs.h + + +$as_echo "#define GLIB_BINARY_AGE 2400" >>confdefs.h + + +# libtool versioning +LT_RELEASE=2.24 +LT_CURRENT=2400 +LT_REVISION=0 +LT_AGE=2400 +LT_CURRENT_MINUS_AGE=0 + + + + + + + +{ $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 + + + +# 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 test "${ac_cv_build+set}" = set; 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 test "${ac_cv_host+set}" = set; 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 for the BeOS" >&5 +$as_echo_n "checking for the BeOS... " >&6; } +case $host in + *-*-beos*) + glib_native_beos="yes" + ;; + *) + glib_native_beos="no" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_native_beos" >&5 +$as_echo "$glib_native_beos" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32" >&5 +$as_echo_n "checking for Win32... " >&6; } +LIB_EXE_MACHINE_FLAG=X86 +case "$host" in + *-*-mingw*) + glib_native_win32=yes + glib_pid_type='void *' + glib_cv_stack_grows=no + # Unfortunately the mingw implementations of C99-style snprintf and vsnprintf + # don't seem to be quite good enough, at least not in mingw-runtime-3.14. + # (Sorry, I don't know exactly what is the problem, but it is related to + # floating point formatting and decimal point vs. comma.) + # The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't + # rigorous enough to notice, though. + # So preset the autoconf cache variables. + ac_cv_func_vsnprintf_c99=no + ac_cv_func_snprintf_c99=no + case "$host" in + x86_64-*-*) + LIB_EXE_MACHINE_FLAG=X64 + ;; + esac + ;; + *) + glib_native_win32=no + glib_pid_type=int + ;; +esac +case $host in + *-*-linux*) + glib_os_linux=yes + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_native_win32" >&5 +$as_echo "$glib_native_win32" >&6; } + + + +glib_have_carbon=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Mac OS X Carbon support" >&5 +$as_echo_n "checking for Mac OS X Carbon support... " >&6; } +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='\' +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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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_set_status 77 +as_fn_error "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 test "${ac_cv_objext+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. + 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 + ;; + 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 +{ $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 test "${ac_cv_prog_CPP+set}" = set; 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.$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.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $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.$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.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $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 + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + glib_have_carbon=yes +fi +rm -f conftest.err conftest.$ac_ext + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_have_carbon" >&5 +$as_echo "$glib_have_carbon" >&6; } + + if test "$glib_native_win32" = "yes"; 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 + OS_UNIX_TRUE= + OS_UNIX_FALSE='#' +else + OS_UNIX_TRUE='#' + OS_UNIX_FALSE= +fi + + if test "$glib_os_linux" = "yes"; then + OS_LINUX_TRUE= + OS_LINUX_FALSE='#' +else + OS_LINUX_TRUE='#' + OS_LINUX_FALSE= +fi + + if test "$glib_have_carbon" = "yes"; then + OS_CARBON_TRUE= + OS_CARBON_FALSE='#' +else + OS_CARBON_TRUE='#' + OS_CARBON_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 test "${ac_cv_prog_WINDRES+set}" = set; 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 test "${ac_cv_prog_ac_ct_WINDRES+set}" = set; 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 test "${ac_cv_prog_NM+set}" = set; 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 test "${ac_cv_prog_ac_ct_NM+set}" = set; 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 test "${ac_cv_prog_RANLIB+set}" = set; 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 test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 test "${ac_cv_prog_ms_librarian+set}" = set; 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 + + +if test "$glib_native_win32" != yes; then + # libtool option to control which symbols are exported + # right now, symbols starting with _ are not exported + LIBTOOL_EXPORT_OPTIONS='-export-symbols-regex "^g.*"' +else + # We currently use .def files on Windows + LIBTOOL_EXPORT_OPTIONS= +fi + + +if test "x$glib_have_carbon" = "xyes"; then + +$as_echo "#define HAVE_CARBON 1" >>confdefs.h + + LDFLAGS="$LDFLAGS -framework Carbon" +fi + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +else + enable_debug=minimum +fi + + +# Check whether --enable-gc_friendly was given. +if test "${enable_gc_friendly+set}" = set; then : + enableval=$enable_gc_friendly; +else + enable_gc_friendly=no +fi + +# Check whether --enable-mem_pools was given. +if test "${enable_mem_pools+set}" = set; then : + enableval=$enable_mem_pools; +else + disable_mem_pools=no +fi + +# Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then : + enableval=$enable_threads; +else + enable_threads=yes +fi + +# Check whether --enable-rebuilds was given. +if test "${enable_rebuilds+set}" = set; then : + enableval=$enable_rebuilds; +else + enable_rebuilds=yes +fi + +# Check whether --enable-visibility was given. +if test "${enable_visibility+set}" = set; then : + enableval=$enable_visibility; +else + enable_visibility=yes +fi + + +if test "x$enable_threads" != "xyes"; then + enable_threads=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable garbage collector friendliness" >&5 +$as_echo_n "checking whether to enable garbage collector friendliness... " >&6; } +if test "x$enable_gc_friendly" = "xyes"; then + +$as_echo "#define ENABLE_GC_FRIENDLY_DEFAULT 1" >>confdefs.h + + { $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}: checking whether to disable memory pools" >&5 +$as_echo_n "checking whether to disable memory pools... " >&6; } +if test "x$disable_mem_pools" = "xno"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + +$as_echo "#define DISABLE_MEM_POOLS 1" >>confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi + + +# Check whether --with-runtime-libdir was given. +if test "${with_runtime_libdir+set}" = set; then : + withval=$with_runtime_libdir; +else + with_runtime_libdir="" +fi + +GLIB_RUNTIME_LIBDIR="$with_runtime_libdir" +ABS_GLIB_RUNTIME_LIBDIR="`readlink -f $libdir/$with_runtime_libdir`" + + + if test "x$with_runtime_libdir" != "x"; then + HAVE_GLIB_RUNTIME_LIBDIR_TRUE= + HAVE_GLIB_RUNTIME_LIBDIR_FALSE='#' +else + HAVE_GLIB_RUNTIME_LIBDIR_TRUE='#' + HAVE_GLIB_RUNTIME_LIBDIR_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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. + 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 + ;; + 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 +{ $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 test "${ac_cv_prog_CPP+set}" = set; 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.$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.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $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.$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.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $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 + + +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$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 +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { 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_CXX="$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_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="gcc" + 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 + CXX=$ac_ct_CXX + fi +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$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 +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { 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_CXX="$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_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + 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 + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# 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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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_cxx_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_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_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_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +depcc="$CXX" 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 test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. + 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_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + 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 + ;; + 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_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +class a { int b; } c; + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + CXX= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$CXX" != ""; then + HAVE_CXX_TRUE= + HAVE_CXX_FALSE='#' +else + HAVE_CXX_TRUE='#' + HAVE_CXX_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 + + +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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_CC+set}" = set; 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. + 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 + ;; + 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 + +if test "x$CC" != xcc; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 +$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 +$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +fi +set dummy $CC; ac_cc=`$as_echo "$2" | + sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +# Make sure it works both with $CC and with simple cc. +# We do the test twice because some compilers refuse to overwrite an +# existing .o file with -o, though they will create one. +ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' +rm -f conftest2.* +if { { 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; } && + test -f conftest2.$ac_objext && { { 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 + eval ac_cv_prog_cc_${ac_cc}_c_o=yes + if test "x$CC" != xcc; then + # Test first that cc exists at all. + if { ac_try='cc -c conftest.$ac_ext >&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_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' + rm -f conftest2.* + if { { 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; } && + test -f conftest2.$ac_objext && { { 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 + # cc works too. + : + else + # cc exists but doesn't like -o. + eval ac_cv_prog_cc_${ac_cc}_c_o=no + fi + fi + fi +else + eval ac_cv_prog_cc_${ac_cc}_c_o=no +fi +rm -f core conftest* + +fi +if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; 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; } + +$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h + +fi + +# FIXME: we rely on the cache variable name because +# there is no other way. +set dummy $CC +am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` +eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o +if test "$am_t" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi + + + + +# 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 test "${ac_cv_sys_largefile_CC+set}" = set; 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 test "${ac_cv_sys_file_offset_bits+set}" = set; 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 test "${ac_cv_sys_large_files+set}" = set; 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 + + +# +# Find 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 test "${ac_cv_path_PKG_CONFIG+set}" = set; 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 + + test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" + ;; +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 + + +if test x$PKG_CONFIG = xno ; then + as_fn_error "*** pkg-config not found. See http://www.freedesktop.org/software/pkgconfig/" "$LINENO" 5 +fi + +if $PKG_CONFIG --atleast-pkgconfig-version 0.16 ; then + : +else + as_fn_error "*** pkg-config too old; version 0.16 or better required." "$LINENO" 5 +fi + +if test "x$enable_debug" = "xyes"; then + if test x$cflags_set != xset ; then + case " $CFLAGS " in + *[\ \ ]-g[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -g" ;; + esac + fi + + GLIB_DEBUG_FLAGS="-DG_ENABLE_DEBUG" +else + GLIB_DEBUG_FLAGS="-DG_DISABLE_CAST_CHECKS" + + if test "x$enable_debug" = "xno"; then + GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS" + fi +fi + +if test "x$enable_visibility" = "xno"; then + GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DDISABLE_VISIBILITY" +fi + +# Ensure MSVC-compatible struct packing convention is used when +# compiling for Win32 with gcc. +# What flag to depends on gcc version: gcc3 uses "-mms-bitfields", while +# gcc2 uses "-fnative-struct". +if test x"$glib_native_win32" = xyes; then + if test x"$GCC" = xyes; then + msnative_struct='' + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get MSVC-compatible struct packing" >&5 +$as_echo_n "checking how to get MSVC-compatible struct packing... " >&6; } + if test -z "$ac_cv_prog_CC"; then + our_gcc="$CC" + else + our_gcc="$ac_cv_prog_CC" + fi + case `$our_gcc --version | sed -e 's,\..*,.,' -e q` in + 2.) + if $our_gcc -v --help 2>/dev/null | grep fnative-struct >/dev/null; then + msnative_struct='-fnative-struct' + fi + ;; + *) + if $our_gcc -v --help 2>/dev/null | grep ms-bitfields >/dev/null; then + msnative_struct='-mms-bitfields' + fi + ;; + esac + if test x"$msnative_struct" = x ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no way" >&5 +$as_echo "no way" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: produced libraries might be incompatible with MSVC-compiled code" >&5 +$as_echo "$as_me: WARNING: produced libraries might be incompatible with MSVC-compiled code" >&2;} + else + CFLAGS="$CFLAGS $msnative_struct" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${msnative_struct}" >&5 +$as_echo "${msnative_struct}" >&6; } + fi + fi +fi +GLIB_EXTRA_CFLAGS="${msnative_struct}" + + + + +# define a MAINT-like variable REBUILD which is set if Perl +# and awk are found, so autogenerated sources can be rebuilt +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 test "${ac_cv_prog_AWK+set}" = set; 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 + +for ac_prog in perl5 perl +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 test "${ac_cv_prog_PERL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PERL"; then + ac_cv_prog_PERL="$PERL" # 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_PERL="$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 +PERL=$ac_cv_prog_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PERL" && break +done + +# We would like indent, but don't require it. +# Extract the first word of "indent", so it can be a program name with args. +set dummy indent; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_INDENT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$INDENT"; then + ac_cv_prog_INDENT="$INDENT" # 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_INDENT="indent" + $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 +INDENT=$ac_cv_prog_INDENT +if test -n "$INDENT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INDENT" >&5 +$as_echo "$INDENT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +REBUILD=\# +if test "x$enable_rebuilds" = "xyes" && \ + test -n "$PERL" && \ + $PERL -e 'exit !($] >= 5.002)' > /dev/null 2>&1 && \ + test -n "$AWK" ; then + REBUILD= +fi + + +# Need full path to Perl for glib-mkenums +# +if test "x$PERL" != x ; then + # Extract the first word of "$PERL", so it can be a program name with args. +set dummy $PERL; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PERL_PATH+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PERL_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL_PATH="$PERL_PATH" # 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_PERL_PATH="$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 +PERL_PATH=$ac_cv_path_PERL_PATH +if test -n "$PERL_PATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_PATH" >&5 +$as_echo "$PERL_PATH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test "x$PERL_PATH" = x ; then + PERL_PATH="/usr/bin/env perl" +fi + + +# Need suitable python path for greport + + + + + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version >= 2.4" >&5 +$as_echo_n "checking whether $PYTHON version >= 2.4... " >&6; } + prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '2.4'.split('.'))) + [0, 0, 0] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] +sys.exit(sys.hexversion < minverhex)" + if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 + ($PYTHON -c "$prog") >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + as_fn_error "too old" "$LINENO" 5 +fi + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 2.4" >&5 +$as_echo_n "checking for a Python interpreter with version >= 2.4... " >&6; } +if test "${am_cv_pathless_PYTHON+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + for am_cv_pathless_PYTHON in python python2 python3 python3.0 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do + test "$am_cv_pathless_PYTHON" = none && break + prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '2.4'.split('.'))) + [0, 0, 0] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] +sys.exit(sys.hexversion < minverhex)" + if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 + ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then : + break +fi + done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 +$as_echo "$am_cv_pathless_PYTHON" >&6; } + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. +set dummy $am_cv_pathless_PYTHON; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PYTHON+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # 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_PYTHON="$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 +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +$as_echo "$PYTHON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + + + if test "$PYTHON" = :; then + PYTHON="/usr/bin/env python2.4" + else + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 +$as_echo_n "checking for $am_display_PYTHON version... " >&6; } +if test "${am_cv_python_version+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 +$as_echo "$am_cv_python_version" >&6; } + PYTHON_VERSION=$am_cv_python_version + + + + PYTHON_PREFIX='${prefix}' + + PYTHON_EXEC_PREFIX='${exec_prefix}' + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 +$as_echo_n "checking for $am_display_PYTHON platform... " >&6; } +if test "${am_cv_python_platform+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 +$as_echo "$am_cv_python_platform" >&6; } + PYTHON_PLATFORM=$am_cv_python_platform + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5 +$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; } +if test "${am_cv_python_pythondir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$prefix" = xNONE + then + am_py_prefix=$ac_default_prefix + else + am_py_prefix=$prefix + fi + am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null || + echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"` + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) + am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 +$as_echo "$am_cv_python_pythondir" >&6; } + pythondir=$am_cv_python_pythondir + + + + pkgpythondir=\${pythondir}/$PACKAGE + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5 +$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; } +if test "${am_cv_python_pyexecdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$exec_prefix" = xNONE + then + am_py_exec_prefix=$am_py_prefix + else + am_py_exec_prefix=$exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null || + echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"` + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) + am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages + ;; + esac + ;; + esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 +$as_echo "$am_cv_python_pyexecdir" >&6; } + pyexecdir=$am_cv_python_pyexecdir + + + + pkgpyexecdir=\${pyexecdir}/$PACKAGE + + + + fi + + + + + + +if test x"$glib_native_win32" = xyes; then + with_libiconv=native +else + +# Check whether --with-libiconv was given. +if test "${with_libiconv+set}" = set; then : + withval=$with_libiconv; +else + with_libiconv=maybe +fi + + + found_iconv=no + case $with_libiconv in + maybe) + # Check in the C library first + ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open" +if test "x$ac_cv_func_iconv_open" = x""yes; then : + with_libiconv=no; found_iconv=yes +fi + + # Check if we have GNU libiconv + if test $found_iconv = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5 +$as_echo_n "checking for libiconv_open in -liconv... " >&6; } +if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liconv $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 libiconv_open (); +int +main () +{ +return libiconv_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_iconv_libiconv_open=yes +else + ac_cv_lib_iconv_libiconv_open=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_iconv_libiconv_open" >&5 +$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; } +if test "x$ac_cv_lib_iconv_libiconv_open" = x""yes; then : + with_libiconv=gnu; found_iconv=yes +fi + + fi + # Check if we have a iconv in -liconv, possibly from vendor + if test $found_iconv = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 +$as_echo_n "checking for iconv_open in -liconv... " >&6; } +if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liconv $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 iconv_open (); +int +main () +{ +return iconv_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_iconv_iconv_open=yes +else + ac_cv_lib_iconv_iconv_open=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_iconv_iconv_open" >&5 +$as_echo "$ac_cv_lib_iconv_iconv_open" >&6; } +if test "x$ac_cv_lib_iconv_iconv_open" = x""yes; then : + with_libiconv=native; found_iconv=yes +fi + + fi + ;; + no) + ac_fn_c_check_func "$LINENO" "iconv_open" "ac_cv_func_iconv_open" +if test "x$ac_cv_func_iconv_open" = x""yes; then : + with_libiconv=no; found_iconv=yes +fi + + ;; + gnu|yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv_open in -liconv" >&5 +$as_echo_n "checking for libiconv_open in -liconv... " >&6; } +if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liconv $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 libiconv_open (); +int +main () +{ +return libiconv_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_iconv_libiconv_open=yes +else + ac_cv_lib_iconv_libiconv_open=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_iconv_libiconv_open" >&5 +$as_echo "$ac_cv_lib_iconv_libiconv_open" >&6; } +if test "x$ac_cv_lib_iconv_libiconv_open" = x""yes; then : + with_libiconv=gnu; found_iconv=yes +fi + + ;; + native) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 +$as_echo_n "checking for iconv_open in -liconv... " >&6; } +if test "${ac_cv_lib_iconv_iconv_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liconv $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 iconv_open (); +int +main () +{ +return iconv_open (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_iconv_iconv_open=yes +else + ac_cv_lib_iconv_iconv_open=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_iconv_iconv_open" >&5 +$as_echo "$ac_cv_lib_iconv_iconv_open" >&6; } +if test "x$ac_cv_lib_iconv_iconv_open" = x""yes; then : + with_libiconv=native; found_iconv=yes +fi + + ;; + esac + + if test "x$found_iconv" = "xno" ; then + as_fn_error "*** No iconv() implementation found in C library or libiconv" "$LINENO" 5 + fi +fi + +{ $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 test "${ac_cv_path_GREP+set}" = set; 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 test "${ac_cv_path_EGREP+set}" = set; 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 whether we are using the GNU C Library 2.1 or newer" >&5 +$as_echo_n "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } +if test "${ac_cv_gnu_library_2_1+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Lucky GNU user" >/dev/null 2>&1; then : + ac_cv_gnu_library_2_1=yes +else + ac_cv_gnu_library_2_1=no +fi +rm -f conftest* + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 +$as_echo "$ac_cv_gnu_library_2_1" >&6; } + + GLIBC21="$ac_cv_gnu_library_2_1" + + +# Check whether --enable-iconv-cache was given. +if test "${enable_iconv_cache+set}" = set; then : + enableval=$enable_iconv_cache; +else + enable_iconv_cache=auto +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Whether to cache iconv descriptors" >&5 +$as_echo_n "checking Whether to cache iconv descriptors... " >&6; } +case $enable_iconv_cache in + auto) + if test $ac_cv_gnu_library_2_1 = yes; then + enable_iconv_cache=no + else + enable_iconv_cache=yes + fi + ;; + yes|no) + ;; + *) as_fn_error "Value given to --enable-iconv-cache must be one of yes, no or auto" "$LINENO" 5 + ;; +esac + +if test $enable_iconv_cache = yes; then + +$as_echo "#define NEED_ICONV_CACHE 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_iconv_cache" >&5 +$as_echo "$enable_iconv_cache" >&6; } + + +found_zlib=no +{ $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 test "${ac_cv_header_stdc+set}" = set; 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 + +# 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 +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 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 test "${ac_cv_lib_z_inflate+set}" = set; 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" = x""yes; then : + 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" = x""yes; then : + found_zlib=yes +fi + + +fi + + +if test "x$found_zlib" = "xno" ; then + as_fn_error "*** Working zlib library and headers not found ***" "$LINENO" 5 +fi +ZLIB_LIBS='-lz' + + +ALL_LINGUAS="`grep -v '^#' "$srcdir/po/LINGUAS" | tr '\n' ' '`" +CONFIG_STATUS_DEPENDENCIES='$(top_srcdir)/po/LINGUAS' + + + for ac_header in locale.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALE_H 1 +_ACEOF + +fi + +done + + if test $ac_cv_header_locale_h = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 +$as_echo_n "checking for LC_MESSAGES... " >&6; } +if test "${am_cv_val_LC_MESSAGES+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return LC_MESSAGES + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_val_LC_MESSAGES=yes +else + am_cv_val_LC_MESSAGES=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 +$as_echo "$am_cv_val_LC_MESSAGES" >&6; } + if test $am_cv_val_LC_MESSAGES = yes; then + +$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h + + fi + fi + USE_NLS=yes + + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" +if test "x$ac_cv_header_libintl_h" = x""yes; then : + gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 +$as_echo_n "checking for ngettext in libc... " >&6; } +if test "${gt_cv_func_ngettext_libc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ +return !ngettext ("","", 1) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_ngettext_libc=yes +else + gt_cv_func_ngettext_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 +$as_echo "$gt_cv_func_ngettext_libc" >&6; } + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 +$as_echo_n "checking for dgettext in libc... " >&6; } +if test "${gt_cv_func_dgettext_libc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ +return !dgettext ("","") + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gt_cv_func_dgettext_libc=yes +else + gt_cv_func_dgettext_libc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 +$as_echo "$gt_cv_func_dgettext_libc" >&6; } + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + for ac_func in bind_textdomain_codeset +do : + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 +_ACEOF + +fi +done + + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 +$as_echo_n "checking for bindtextdomain in -lintl... " >&6; } +if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 bindtextdomain (); +int +main () +{ +return bindtextdomain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_bindtextdomain=yes +else + ac_cv_lib_intl_bindtextdomain=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_intl_bindtextdomain" >&5 +$as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } +if test "x$ac_cv_lib_intl_bindtextdomain" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 +$as_echo_n "checking for ngettext in -lintl... " >&6; } +if test "${ac_cv_lib_intl_ngettext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 ngettext (); +int +main () +{ +return ngettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_ngettext=yes +else + ac_cv_lib_intl_ngettext=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_intl_ngettext" >&5 +$as_echo "$ac_cv_lib_intl_ngettext" >&6; } +if test "x$ac_cv_lib_intl_ngettext" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 +$as_echo_n "checking for dgettext in -lintl... " >&6; } +if test "${ac_cv_lib_intl_dgettext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $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 dgettext (); +int +main () +{ +return dgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_dgettext=yes +else + ac_cv_lib_intl_dgettext=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_intl_dgettext" >&5 +$as_echo "$ac_cv_lib_intl_dgettext" >&6; } +if test "x$ac_cv_lib_intl_dgettext" = x""yes; then : + gt_cv_func_dgettext_libintl=yes +fi + +fi + +fi + + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 +$as_echo_n "checking if -liconv is needed to use gettext... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 +$as_echo_n "checking for ngettext in -lintl... " >&6; } +if test "${ac_cv_lib_intl_ngettext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl -liconv $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 ngettext (); +int +main () +{ +return ngettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_ngettext=yes +else + ac_cv_lib_intl_ngettext=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_intl_ngettext" >&5 +$as_echo "$ac_cv_lib_intl_ngettext" >&6; } +if test "x$ac_cv_lib_intl_ngettext" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 +$as_echo_n "checking for dcgettext in -lintl... " >&6; } +if test "${ac_cv_lib_intl_dcgettext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl -liconv $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 dcgettext (); +int +main () +{ +return dcgettext (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_intl_dcgettext=yes +else + ac_cv_lib_intl_dcgettext=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_intl_dcgettext" >&5 +$as_echo "$ac_cv_lib_intl_dcgettext" >&6; } +if test "x$ac_cv_lib_intl_dcgettext" = x""yes; then : + gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv +else + : +fi + +else + : +fi + + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + for ac_func in bind_textdomain_codeset +do : + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_BIND_TEXTDOMAIN_CODESET 1 +_ACEOF + +fi +done + + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + +$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MSGFMT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case "$MSGFMT" in + /*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then + ac_cv_path_MSGFMT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 +$as_echo "$MSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + for ac_func in dcgettext +do : + ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" +if test "x$ac_cv_func_dcgettext" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DCGETTEXT 1 +_ACEOF + +fi +done + + MSGFMT_OPTS= + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 +$as_echo_n "checking if msgfmt accepts -c... " >&6; } + cat >conftest.foo <<_ACEOF + +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +_ACEOF +if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 + ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + MSGFMT_OPTS=-c; { $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; } +echo "$as_me: failed input was:" >&5 +sed 's/^/| /' conftest.foo >&5 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_GMSGFMT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # 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_GMSGFMT="$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_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT +if test -n "$GMSGFMT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 +$as_echo "$GMSGFMT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XGETTEXT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case "$XGETTEXT" in + /*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 +$as_echo "$XGETTEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + CATOBJEXT=.gmo + DATADIRNAME=share +else + case $host in + *-*-solaris*) + ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" +if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : + CATOBJEXT=.gmo + DATADIRNAME=share +else + CATOBJEXT=.mo + DATADIRNAME=lib +fi + + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + +fi + + + + if test "$gt_cv_have_gettext" = "yes" ; then + +$as_echo "#define ENABLE_NLS 1" >>confdefs.h + + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 +$as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + ac_config_commands="$ac_config_commands default-1" + + + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + + + + + + + + + + + + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 +$as_echo_n "checking for catalogs to be installed... " >&6; } + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 +$as_echo "$LINGUAS" >&6; } + fi + + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + + +if test "$gt_cv_have_gettext" != "yes" ; then + as_fn_error " +*** You must have either have gettext support in your C library, or use the +*** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html +" "$LINENO" 5 +fi + +LIBS="$INTLLIBS $LIBS" + +GETTEXT_PACKAGE=glib20 + + +cat >>confdefs.h <<_ACEOF +#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" +_ACEOF + + +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +glib_save_datarootdir="$datarootdir" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +datarootdir=`eval echo "${datarootdir}"` +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +datarootdir="$glib_save_datarootdir" + +cat >>confdefs.h <<_ACEOF +#define GLIB_LOCALE_DIR "$localedir" +_ACEOF + + + + +if test x"$glib_native_win32" != xyes; then + if test x$with_libiconv != xno ; then + case " $INTLLIBS " in + *[\ \ ]-liconv[\ \ ]*) ;; + *) ICONV_LIBS="-liconv" ;; + esac + fi +fi + + +case $with_libiconv in + gnu) + +$as_echo "#define USE_LIBICONV_GNU 1" >>confdefs.h + + ;; + native) + +$as_echo "#define USE_LIBICONV_NATIVE 1" >>confdefs.h + + ;; +esac + +# 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=no +fi + + + + + + + + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AS+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # 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_AS="${ac_tool_prefix}as" + $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 +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AS+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # 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_AS="as" + $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_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="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 + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + 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 test "${ac_cv_prog_DLLTOOL+set}" = set; 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 test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; 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 + + 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 test "${ac_cv_prog_OBJDUMP+set}" = set; 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 test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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 + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +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.2.6b' +macro_revision='1.3017' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +{ $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 test "${ac_cv_path_SED+set}" = set; 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 test "${ac_cv_path_FGREP+set}" = set; 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 test "${lt_cv_path_LD+set}" = set; 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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 test "${lt_cv_path_NM+set}" = set; 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 "$ac_tool_prefix"; then + for ac_prog in "dumpbin -symbols" "link -dump -symbols" + 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 test "${ac_cv_prog_DUMPBIN+set}" = set; 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 -symbols" "link -dump -symbols" +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 test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; 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 + + + 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 test "${lt_cv_nm_interface+set}" = set; 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:10315: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:10318: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:10321: 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; } + +{ $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 + +# 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 test "${lt_cv_sys_max_cmd_len+set}" = set; 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; + ;; + + 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 + ;; + + 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"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$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"}, \ + = c,a/b,, \ + && 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 for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; 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 + 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 test "${ac_cv_prog_OBJDUMP+set}" = set; 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 test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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 test "${lt_cv_deplibs_check_method+set}" = set; 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. + if ( 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 + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + 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 + ;; + +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]) 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 Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + 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_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}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; 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}ar" + $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 + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; 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="ar" + $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 + + 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 +else + AR="$ac_cv_prog_AR" +fi + +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru + + + + + + + + + + + +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 test "${ac_cv_prog_STRIP+set}" = set; 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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 test "${ac_cv_prog_RANLIB+set}" = set; 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 test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 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 test "${lt_cv_sys_global_symbol_pipe+set}" = set; 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};"\ +" /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 + + # 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 +#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. */ +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_save_LIBS="$LIBS" + lt_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_save_LIBS" + CFLAGS="$lt_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 + + + + + + + + + + + + + + + + + + + + + + +# 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 11523 "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 test "${lt_cv_cc_needs_belf+set}" = set; 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 + ;; +sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;; + *) + 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" + + + 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 test "${ac_cv_prog_DSYMUTIL+set}" = set; 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 test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; 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 test "${ac_cv_prog_NMEDIT+set}" = set; 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 test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; 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 test "${ac_cv_prog_LIPO+set}" = set; 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 test "${ac_cv_prog_ac_ct_LIPO+set}" = set; 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 test "${ac_cv_prog_OTOOL+set}" = set; 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 test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; 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 test "${ac_cv_prog_OTOOL64+set}" = set; 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 test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; 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 test "${lt_cv_apple_cc_single_mod+set}" = set; 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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 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 test "${lt_cv_ld_exported_symbols_list+set}" = set; 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; } + 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" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +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" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$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 +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { 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_CXX="$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_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + 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 + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# 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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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_cxx_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_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_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_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. + 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_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + 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 + ;; + 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_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $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; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # 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_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err 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_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # 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_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err 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_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +_lt_caught_CXX_error=yes; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + + + + +# Set options + + + + enable_dlopen=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 --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # 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 test "${lt_cv_objdir+set}" = set; 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 + +# Sed substitution that helps us do robust quoting. It backslashifies +# 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' + +# 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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "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 test "${lt_cv_path_MAGIC_CMD+set}" = set; 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 test "${lt_cv_path_MAGIC_CMD+set}" = set; 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 + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + { $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 test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; 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:13275: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13279: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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= + +{ $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 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' + ;; + + 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 + 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) + 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' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # 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*) + # IBM XL C 8.0/Fortran 10.1 on PPC + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # 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='' + ;; + 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*) + 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}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + + + + + + +# +# 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 test "${lt_cv_prog_compiler_pic_works+set}" = set; 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:13614: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13618: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_static_works+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:13719: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13723: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:13774: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13778: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_flag_spec_ld= + 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 + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = 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 + *\ [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.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_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' + 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/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + 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 + ;; + + 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) + 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= + 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$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]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + 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; $ECHO \"$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*) + # 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= + hardcode_libdir_flag_spec_ld='-rpath $libdir' + archive_cmds='$LD -shared $libobjs $deplibs $compiler_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 $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $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' + 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 $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 + ;; + + 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 $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = 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 + 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")) && (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 + 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. + 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 + } + }' +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 "$aix_libpath"; then + 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; 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. + 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 + } + }' +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 "$aix_libpath"; then + 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + 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. + 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 `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + 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=echo + 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 + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -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 -fPIC ${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 -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${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_flag_spec_ld='+b $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 -a "$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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${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' + ;; + *) + archive_cmds='$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 + 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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. + 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) {} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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*) + 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 ${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 ${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; } + $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 + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + 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 + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # 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 -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # 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; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +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 + 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 + 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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + 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,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + 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 + ;; + 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 + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + 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 + 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 + ;; + +freebsd1*) + dynamic_linker=no + ;; + +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[123]*) 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 + 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 + 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' + ;; + +interix[3-9]*) + 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' + 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 + 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 Linux ELF. +linux* | k*bsd*-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' + 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 + 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 : + 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 + + # 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # 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;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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' + ;; + +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 + 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 + 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 + 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 + 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 + 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 + 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dld_shl_load+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_svld_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_dld_dld_link+set}" = set; 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" = x""yes; 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 test "${lt_cv_dlopen_self+set}" = set; 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 16144 "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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + 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 test "${lt_cv_dlopen_self_static+set}" = set; 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 16240 "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 + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + 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_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$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. + + + + + + +# 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 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* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + 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++"} + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + + 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_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# 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 test "${lt_cv_path_LD+set}" = set; 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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 + + + + + + + + # 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 + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${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 + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + 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. + archive_cmds_CXX='$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 "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $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; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=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. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${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 + hardcode_direct_CXX=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_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + 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 + + export_dynamic_flag_spec_CXX='${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_CXX=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_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$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. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +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 "$aix_libpath"; then + 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${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_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$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 + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$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... + archive_expsym_cmds_CXX='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 + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_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=echo + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="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_CXX="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}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$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}" + archive_expsym_cmds_CXX="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 + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + gnu*) + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=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 + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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 + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=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 + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$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; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${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 + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${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_CXX='$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_CXX='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++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-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. + archive_cmds_CXX='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' + archive_expsym_cmds_CXX='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; $ECHO "X$list" | $Xsed' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$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."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$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 + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5]* | *pgcpp\ [1-5]*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + old_archive_cmds_CXX='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 | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$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 + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$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 + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # 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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='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 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=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='echo' + + # 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. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=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*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + ld_shlibs_CXX=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. + archive_cmds_CXX='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' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='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 "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # 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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # 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 "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='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' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=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?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # 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. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$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. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -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 "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='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 "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$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. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$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 + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$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... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_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 + # 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 $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 + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p 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 "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${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 "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$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 "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +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. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +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 + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # 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 + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $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; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-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_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-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_CXX='-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 + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + 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_prog_compiler_pic_CXX=-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_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-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_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--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 + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+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_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-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_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + + + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -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:18196: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:18200: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $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 test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=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:18295: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:18299: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_CXX=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_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=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:18347: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:18351: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_CXX=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_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = 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; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + 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 + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX 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; } + $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_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 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 + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +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 + 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 + 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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + 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,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + 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="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + 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 + ;; + 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 + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + 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_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + 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 + ;; + +freebsd1*) + dynamic_linker=no + ;; + +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[123]*) 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 + 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 + 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' + ;; + +interix[3-9]*) + 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' + 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 + 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 Linux ELF. +linux* | k*bsd*-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' + 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 + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + 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 + + # 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # 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;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $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' + ;; + +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 + 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 + 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 + 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 + 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 + 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 + 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_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != 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, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = 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 + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + 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_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_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;} +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +## -------------------- ## +## 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. +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 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=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&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" "$LINENO" 5 + + +} # 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 +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="\ +glib config.lt 2.24.0 +configured by $0, generated by GNU Autoconf 2.65. + +Copyright (C) 2008 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' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +AS='`$ECHO "X$AS" | $Xsed -e "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "X$DLLTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +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 \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +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_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +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 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="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Assembler program. +AS=$AS + +# DLL creation program. +DLLTOOL=$DLLTOOL + +# Object dumper program. +OBJDUMP=$OBJDUMP + +# 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 + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# 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 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# 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 + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# 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 + +# 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 + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# 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 + +# 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 + +# 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 + +# 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 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# 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 + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# 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 + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# 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 + +# 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 + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# 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_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# 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_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# 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_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + +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. +if test "$no_create" != yes; then + 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 +fi + + + +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac +fi + +CPPFLAGS="$CPPFLAGS -DG_DISABLE_SINGLE_INCLUDES" + +if test "$glib_native_win32" = "yes"; then + if test x$enable_static = xyes -a x$enable_shared = xyes; then + as_fn_error "Can not build both shared and static at the same time on Windows." "$LINENO" 5 + fi + if test x$enable_static = xyes; then + glib_win32_static_compilation=yes + GLIB_WIN32_STATIC_COMPILATION_DEFINE="#define GLIB_STATIC_COMPILATION 1 +#define GOBJECT_STATIC_COMPILATION 1" + + fi +fi + if test x$glib_native_win32 = xyes -a x$glib_win32_static_compilation != xyes; then + OS_WIN32_AND_DLL_COMPILATION_TRUE= + OS_WIN32_AND_DLL_COMPILATION_FALSE='#' +else + OS_WIN32_AND_DLL_COMPILATION_TRUE='#' + OS_WIN32_AND_DLL_COMPILATION_FALSE= +fi + + +if test $cross_compiling != yes ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra flags to get ANSI library prototypes" >&5 +$as_echo_n "checking for extra flags to get ANSI library prototypes... " >&6; } + glib_save_LIBS=$LIBS + LIBS="$LIBS -lm" + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main (void) { return (log(1) != log(1.)); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } +else + glib_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -std1" + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main (void) { return (log(1) != log(1.)); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -std1" >&5 +$as_echo "-std1" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + CFLAGS=$glib_save_CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No ANSI prototypes found in library. (-std1 didn't work.)" >&5 +$as_echo "$as_me: WARNING: No ANSI prototypes found in library. (-std1 didn't work.)" >&2;} + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$glib_save_LIBS +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra flags for POSIX compliance" >&5 +$as_echo_n "checking for extra flags for POSIX compliance... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +DIR *dir; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } +else + glib_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -posix" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +DIR *dir; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: -posix" >&5 +$as_echo "-posix" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 +$as_echo "" >&6; } + CFLAGS=$glib_save_CFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine POSIX flag. (-posix didn't work.)" >&5 +$as_echo "$as_me: WARNING: Could not determine POSIX flag. (-posix didn't work.)" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +# Checks for header files. +{ $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 test "${ac_cv_header_stdc+set}" = set; 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 + + +# Checks for library functions. +for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VPRINTF 1 +_ACEOF + +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = x""yes; then : + +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h + +fi + +fi +done + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +$as_echo_n "checking for working alloca.h... " >&6; } +if test "${ac_cv_working_alloca_h+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_working_alloca_h=yes +else + ac_cv_working_alloca_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +$as_echo "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +$as_echo_n "checking for alloca... " >&6; } +if test "${ac_cv_func_alloca_works+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_alloca_works=yes +else + ac_cv_func_alloca_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +$as_echo "$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +$as_echo "#define C_ALLOCA 1" >>confdefs.h + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +if test "${ac_cv_os_cray+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +$as_echo "$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; 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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +$as_echo_n "checking stack direction for C alloca... " >&6; } +if test "${ac_cv_c_stack_direction+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + return find_stack_direction () < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 +else + ac_cv_c_stack_direction=-1 +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_c_stack_direction" >&5 +$as_echo "$ac_cv_c_stack_direction" >&6; } +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + +for ac_func in mmap posix_memalign memalign valloc fsync pipe2 +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in atexit on_exit timegm gmtime_r +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# 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 char" >&5 +$as_echo_n "checking size of char... " >&6; } +if test "${ac_cv_sizeof_char+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_char" = 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_set_status 77 +as_fn_error "cannot compute sizeof (char) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_char=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 +$as_echo "$ac_cv_sizeof_char" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_CHAR $ac_cv_sizeof_char +_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 short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_short" = 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_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_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 long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = 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_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_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 int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = 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_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_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 void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if test "${ac_cv_sizeof_void_p+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_void_p" = 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_set_status 77 +as_fn_error "cannot compute sizeof (void *) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_void_p=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +$as_echo "$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_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 long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if test "${ac_cv_sizeof_long_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = 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_set_status 77 +as_fn_error "cannot compute sizeof (long long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_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 __int64" >&5 +$as_echo_n "checking size of __int64... " >&6; } +if test "${ac_cv_sizeof___int64+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" "$ac_includes_default"; then : + +else + if test "$ac_cv_type___int64" = 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_set_status 77 +as_fn_error "cannot compute sizeof (__int64) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof___int64=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5 +$as_echo "$ac_cv_sizeof___int64" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF___INT64 $ac_cv_sizeof___int64 +_ACEOF + + + +if test x$ac_cv_sizeof_long = x8 || test x$ac_cv_sizeof_long_long = x8 || test x$ac_cv_sizeof___int64 = x8 ; then + : +else + as_fn_error " +*** GLib requires a 64 bit type. You might want to consider +*** using the GNU C compiler. +" "$LINENO" 5 +fi + +if test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8; then + # long long is a 64 bit integer. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format to printf and scanf a guint64" >&5 +$as_echo_n "checking for format to printf and scanf a guint64... " >&6; } + if test "${glib_cv_long_long_format+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + for format in ll q I64; do + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main() + { + long long b, a = -0x3AFAFAFAFAFAFAFALL; + char buffer[1000]; + sprintf (buffer, "%${format}u", a); + sscanf (buffer, "%${format}u", &b); + exit (b!=a); + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_long_long_format=${format} + break +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + done +fi + + if test -n "$glib_cv_long_long_format"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: %${glib_cv_long_long_format}u" >&5 +$as_echo "%${glib_cv_long_long_format}u" >&6; } + +$as_echo "#define HAVE_LONG_LONG_FORMAT 1" >>confdefs.h + + if test x"$glib_cv_long_long_format" = xI64; then + +$as_echo "#define HAVE_INT64_AND_I64 1" >>confdefs.h + + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } + fi +elif test x$ac_cv_sizeof___int64 = x8; then + # __int64 is a 64 bit integer. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format to printf and scanf a guint64" >&5 +$as_echo_n "checking for format to printf and scanf a guint64... " >&6; } + # We know this is MSVCRT.DLL, and what the formats are + glib_cv_long_long_format=I64 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: %${glib_cv_long_long_format}u" >&5 +$as_echo "%${glib_cv_long_long_format}u" >&6; } + +$as_echo "#define HAVE_LONG_LONG_FORMAT 1" >>confdefs.h + + +$as_echo "#define HAVE_INT64_AND_I64 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + + +SANE_MALLOC_PROTOS=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if malloc() and friends prototypes are gmem.h compatible" >&5 +$as_echo_n "checking if malloc() and friends prototypes are gmem.h compatible... " >&6; } +glib_save_CFLAGS=$CFLAGS +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -Werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + void* (*my_calloc_p) (size_t, size_t) = calloc; + void* (*my_malloc_p) (size_t) = malloc; + void (*my_free_p) (void*) = free; + void* (*my_realloc_p) (void*, size_t) = realloc; + my_calloc_p = 0; + my_malloc_p = 0; + my_free_p = 0; + my_realloc_p = 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +$as_echo "#define SANE_MALLOC_PROTOS 1" >>confdefs.h + + SANE_MALLOC_PROTOS=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SANE_MALLOC_PROTOS" >&5 +$as_echo "$SANE_MALLOC_PROTOS" >&6; } +CFLAGS=$glib_save_CFLAGS + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for growing stack pointer" >&5 +$as_echo_n "checking for growing stack pointer... " >&6; } +if test "${glib_cv_stack_grows+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + volatile int *a = 0, *b = 0; + void foo (void); + int main () { volatile int y = 7; a = &y; foo (); return b > a; } + void foo (void) { volatile int x = 5; b = &x; } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_stack_grows=no + +else + glib_cv_stack_grows=yes + +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: $glib_cv_stack_grows" >&5 +$as_echo "$glib_cv_stack_grows" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __inline" >&5 +$as_echo_n "checking for __inline... " >&6; } +if test "${glib_cv_has__inline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + __inline int foo () { return 0; } + int main () { return foo (); } + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glib_cv_has__inline=yes + +else + glib_cv_has__inline=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_has__inline" >&5 +$as_echo "$glib_cv_has__inline" >&6; } +case x$glib_cv_has__inline in +xyes) +$as_echo "#define G_HAVE___INLINE 1" >>confdefs.h + +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __inline__" >&5 +$as_echo_n "checking for __inline__... " >&6; } +if test "${glib_cv_has__inline__+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + __inline__ int foo () { return 0; } + int main () { return foo (); } + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glib_cv_has__inline__=yes + +else + glib_cv_has__inline__=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_has__inline__" >&5 +$as_echo "$glib_cv_has__inline__" >&6; } +case x$glib_cv_has__inline__ in +xyes) +$as_echo "#define G_HAVE___INLINE__ 1" >>confdefs.h + +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${glib_cv_hasinline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #undef inline + inline int foo () { return 0; } + int main () { return foo (); } + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glib_cv_hasinline=yes + +else + glib_cv_hasinline=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_hasinline" >&5 +$as_echo "$glib_cv_hasinline" >&6; } +case x$glib_cv_hasinline in +xyes) +$as_echo "#define G_HAVE_INLINE 1" >>confdefs.h + +esac + +# if we can use inline functions in headers +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if inline functions in headers work" >&5 +$as_echo_n "checking if inline functions in headers work... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) +# undef inline +# define inline __inline__ +#elif !defined (G_HAVE_INLINE) +# undef inline +# if defined (G_HAVE___INLINE__) +# define inline __inline__ +# elif defined (G_HAVE___INLINE) +# define inline __inline +# endif +#endif + +int glib_test_func2 (int); + +static inline int +glib_test_func1 (void) { + return glib_test_func2 (1); +} + +int +main (void) { + int i = 1; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + g_can_inline=yes +else + g_can_inline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_can_inline" >&5 +$as_echo "$g_can_inline" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working do while(0) macros" >&5 +$as_echo_n "checking for working do while(0) macros... " >&6; } +if test "${g_cv_support_dowhile_macros+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + #define STMT_START do + #define STMT_END while(0) + #define STMT_TEST STMT_START { i = 0; } STMT_END + int main(void) { int i = 1; STMT_TEST; return i; } + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + g_cv_support_dowhile_macros=yes +else + g_cv_support_dowhile_macros=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_cv_support_dowhile_macros" >&5 +$as_echo "$g_cv_support_dowhile_macros" >&6; } +if test x$g_cv_support_dowhile_macros = xyes; then + +$as_echo "#define HAVE_DOWHILE_MACROS 1" >>confdefs.h + +fi + +# check for flavours of varargs macros +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 varargs macros in C" >&5 +$as_echo_n "checking for ISO C99 varargs macros in C... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +int a(int p1, int p2, int p3); +#define call_a(...) a(1,__VA_ARGS__) +call_a(2,3); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + g_have_iso_c_varargs=yes +else + g_have_iso_c_varargs=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_iso_c_varargs" >&5 +$as_echo "$g_have_iso_c_varargs" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 varargs macros in C++" >&5 +$as_echo_n "checking for ISO C99 varargs macros in C++... " >&6; } +if test "$CXX" = ""; then + g_have_iso_cxx_varargs=no +else + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +int a(int p1, int p2, int p3); +#define call_a(...) a(1,__VA_ARGS__) +call_a(2,3); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + g_have_iso_cxx_varargs=yes +else + g_have_iso_cxx_varargs=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_iso_cxx_varargs" >&5 +$as_echo "$g_have_iso_cxx_varargs" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUC varargs macros" >&5 +$as_echo_n "checking for GNUC varargs macros... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +int a(int p1, int p2, int p3); +#define call_a(params...) a(1,params) +call_a(2,3); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + g_have_gnuc_varargs=yes +else + g_have_gnuc_varargs=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_gnuc_varargs" >&5 +$as_echo "$g_have_gnuc_varargs" >&6; } + +# check for GNUC visibility support +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUC visibility attribute" >&5 +$as_echo_n "checking for GNUC visibility attribute... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +void +__attribute__ ((visibility ("hidden"))) + f_hidden (void) +{ +} +void +__attribute__ ((visibility ("internal"))) + f_internal (void) +{ +} +void +__attribute__ ((visibility ("protected"))) + f_protected (void) +{ +} +void +__attribute__ ((visibility ("default"))) + f_default (void) +{ +} +int main (int argc, char **argv) +{ + f_hidden(); + f_internal(); + f_protected(); + f_default(); + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext +glib_ac_compile_save="$ac_compile" +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&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; } && + { ac_try='(if test -s conftest.err; then false ; else true; fi)' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + g_have_gnuc_visibility=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +g_have_gnuc_visibility=no +fi +ac_compile="$glib_ac_compile_save" +rm -f conftest.$ac_objext conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_gnuc_visibility" >&5 +$as_echo "$g_have_gnuc_visibility" >&6; } + if test x$g_have_gnuc_visibility = xyes; then + HAVE_GNUC_VISIBILITY_TRUE= + HAVE_GNUC_VISIBILITY_FALSE='#' +else + HAVE_GNUC_VISIBILITY_TRUE='#' + HAVE_GNUC_VISIBILITY_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether using Sun Studio C compiler" >&5 +$as_echo_n "checking whether using Sun Studio C compiler... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined(__SUNPRO_C) || (__SUNPRO_C >= 0x550) +#else +# include "error: this is not Sun Studio." +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + g_have_sunstudio_visibility=yes +else + g_have_sunstudio_visibility=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $g_have_sunstudio_visibility" >&5 +$as_echo "$g_have_sunstudio_visibility" >&6; } + if test x$g_have_sunstudio_visibility = xyes; then + HAVE_SUNSTUDIO_VISIBILITY_TRUE= + HAVE_SUNSTUDIO_VISIBILITY_FALSE='#' +else + HAVE_SUNSTUDIO_VISIBILITY_TRUE='#' + HAVE_SUNSTUDIO_VISIBILITY_FALSE= +fi + + +# check for bytesex stuff + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +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 + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +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 + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +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_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + +if test x$ac_cv_c_bigendian = xuniversal ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +#if __BYTE_ORDER == __BIG_ENDIAN +#else +#error Not a big endian. +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +#if __BYTE_ORDER == __LITTLE_ENDIAN +#else +#error Not a little endian. +#endif + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=no + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine endianness." >&5 +$as_echo "$as_me: WARNING: Could not determine endianness." >&2;} +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 + + +# check for header files +for ac_header in dirent.h float.h limits.h pwd.h grp.h sys/param.h sys/poll.h sys/resource.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in sys/time.h sys/times.h sys/wait.h unistd.h values.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in sys/select.h sys/types.h stdint.h inttypes.h sched.h malloc.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in sys/vfs.h sys/mount.h sys/vmount.h sys/statfs.h sys/statvfs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in mntent.h sys/mnttab.h sys/vfstab.h sys/mntctl.h sys/sysctl.h fstab.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in sys/uio.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_UIO_H 1 +_ACEOF + +fi + +done + + +# check for structure fields +ac_fn_c_check_member "$LINENO" "struct stat" "st_mtimensec" "ac_cv_member_struct_stat_st_mtimensec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtimensec" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_MTIMENSEC 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim.tv_nsec" "ac_cv_member_struct_stat_st_mtim_tv_nsec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtim_tv_nsec" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_atimensec" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_ctimensec" "ac_cv_member_struct_stat_st_ctimensec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_ctimensec" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_CTIMENSEC 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_ctim.tv_nsec" "ac_cv_member_struct_stat_st_ctim_tv_nsec" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_ctim_tv_nsec" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC 1 +_ACEOF + + +fi + +ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "#include +#include +#include +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +" +if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "#include +#include +#include +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +" +if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STAT_ST_BLOCKS 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct statfs" "f_fstypename" "ac_cv_member_struct_statfs_f_fstypename" "#include +#include +#include +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +" +if test "x$ac_cv_member_struct_statfs_f_fstypename" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STATFS_F_FSTYPENAME 1 +_ACEOF + + +fi +ac_fn_c_check_member "$LINENO" "struct statfs" "f_bavail" "ac_cv_member_struct_statfs_f_bavail" "#include +#include +#include +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +" +if test "x$ac_cv_member_struct_statfs_f_bavail" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STATFS_F_BAVAIL 1 +_ACEOF + + +fi + +# struct statvfs.f_basetype is available on Solaris but not for Linux. +ac_fn_c_check_member "$LINENO" "struct statvfs" "f_basetype" "ac_cv_member_struct_statvfs_f_basetype" "#include +" +if test "x$ac_cv_member_struct_statvfs_f_basetype" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_STATVFS_F_BASETYPE 1 +_ACEOF + + +fi + + +# Checks for libcharset + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 +$as_echo_n "checking for nl_langinfo and CODESET... " >&6; } +if test "${am_cv_langinfo_codeset+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char* cs = nl_langinfo(CODESET); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + am_cv_langinfo_codeset=yes +else + am_cv_langinfo_codeset=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 +$as_echo "$am_cv_langinfo_codeset" >&6; } + if test $am_cv_langinfo_codeset = yes; then + +$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2.1 or newer" >&5 +$as_echo_n "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } +if test "${ac_cv_gnu_library_2_1+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Lucky GNU user" >/dev/null 2>&1; then : + ac_cv_gnu_library_2_1=yes +else + ac_cv_gnu_library_2_1=no +fi +rm -f conftest* + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 +$as_echo "$ac_cv_gnu_library_2_1" >&6; } + + GLIBC21="$ac_cv_gnu_library_2_1" + + +for ac_header in stddef.h stdlib.h string.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_func in setlocale +do : + ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" +if test "x$ac_cv_func_setlocale" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETLOCALE 1 +_ACEOF + +fi +done + + +# check additional type sizes +# 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 test "${ac_cv_sizeof_size_t+set}" = set; 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_set_status 77 +as_fn_error "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 + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the appropriate definition for size_t" >&5 +$as_echo_n "checking for the appropriate definition for size_t... " >&6; } + +case $ac_cv_sizeof_size_t in + $ac_cv_sizeof_short) + glib_size_type=short + ;; + $ac_cv_sizeof_int) + glib_size_type=int + ;; + $ac_cv_sizeof_long) + glib_size_type=long + ;; + $ac_cv_sizeof_long_long) + glib_size_type='long long' + ;; + $ac_cv_sizeof__int64) + glib_size_type='__int64' + ;; + *) as_fn_error "No type matching size_t in size" "$LINENO" 5 + ;; +esac + +if test $ac_cv_sizeof_size_t = $ac_cv_sizeof_int && + test $ac_cv_sizeof_size_t = $ac_cv_sizeof_long ; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if defined(_AIX) && !defined(__GNUC__) +#pragma options langlvl=stdc89 +#endif +#include +int main () +{ + size_t s = 1; + unsigned int *size_int = &s; + return (int)*size_int; +} + +_ACEOF +rm -f conftest.$ac_objext +glib_ac_compile_save="$ac_compile" +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&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; } && + { ac_try='(if test -s conftest.err; then false ; else true; fi)' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + glib_size_type=int +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if defined(_AIX) && !defined(__GNUC__) +#pragma options langlvl=stdc89 +#endif +#include +int main () +{ + size_t s = 1; + unsigned long *size_long = &s; + return (int)*size_long; +} + +_ACEOF +rm -f conftest.$ac_objext +glib_ac_compile_save="$ac_compile" +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext' +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&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; } && + { ac_try='(if test -s conftest.err; then false ; else true; fi)' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + glib_size_type=long +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +ac_compile="$glib_ac_compile_save" +rm -f conftest.$ac_objext conftest.err conftest.$ac_ext +fi +ac_compile="$glib_ac_compile_save" +rm -f conftest.$ac_objext conftest.err conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsigned $glib_size_type" >&5 +$as_echo "unsigned $glib_size_type" >&6; } + +# Check for some functions +for ac_func in lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in chown lchmod lchown fchmod fchown link statvfs statfs utimes getgrgid getpwuid +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in getmntent_r setmntent endmntent hasmntopt getmntinfo +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +# Check for high-resolution sleep functions +for ac_func in nanosleep nsleep +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_func in splice +do : + ac_fn_c_check_func "$LINENO" "splice" "ac_cv_func_splice" +if test "x$ac_cv_func_splice" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SPLICE 1 +_ACEOF + +fi +done + + +for ac_header in crt_externs.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "crt_externs.h" "ac_cv_header_crt_externs_h" "$ac_includes_default" +if test "x$ac_cv_header_crt_externs_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CRT_EXTERNS_H 1 +_ACEOF + +fi + +done + +for ac_func in _NSGetEnviron +do : + ac_fn_c_check_func "$LINENO" "_NSGetEnviron" "ac_cv_func__NSGetEnviron" +if test "x$ac_cv_func__NSGetEnviron" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE__NSGETENVIRON 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 vsnprintf" >&5 +$as_echo_n "checking for C99 vsnprintf... " >&6; } +if test "${ac_cv_func_vsnprintf_c99+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_vsnprintf_c99=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +doit(char * s, ...) +{ + char buffer[32]; + va_list args; + int r; + + va_start(args, s); + r = vsnprintf(buffer, 5, s, args); + va_end(args); + + if (r != 7) + exit(1); + + /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf() + implementation. The above will return 7 but if you replace + the size of the buffer with 0, it borks! */ + va_start(args, s); + r = vsnprintf(buffer, 0, s, args); + va_end(args); + + if (r != 7) + exit(1); + + exit(0); +} + +int +main(void) +{ + doit("1234567"); + exit(1); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_vsnprintf_c99=yes +else + ac_cv_func_vsnprintf_c99=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_vsnprintf_c99" >&5 +$as_echo "$ac_cv_func_vsnprintf_c99" >&6; } +if test $ac_cv_func_vsnprintf_c99 = yes; then + +$as_echo "#define HAVE_C99_VSNPRINTF 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf supports positional parameters" >&5 +$as_echo_n "checking whether printf supports positional parameters... " >&6; } +if test "${ac_cv_func_printf_unix98+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_printf_unix98=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ + char buffer[128]; + + sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3); + if (strcmp ("2 3 1", buffer) == 0) + exit (0); + exit (1); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_printf_unix98=yes +else + ac_cv_func_printf_unix98=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_printf_unix98" >&5 +$as_echo "$ac_cv_func_printf_unix98" >&6; } +if test $ac_cv_func_printf_unix98 = yes; then + +$as_echo "#define HAVE_UNIX98_PRINTF 1" >>confdefs.h + +fi + + +# Internet address families +if test $glib_native_win32 = yes; then + glib_inet_includes=" +#include + " +else + glib_inet_includes=" +#include +#include + " +fi + +glib_failed=false +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking value of AF_INET" >&5 +$as_echo_n "checking value of AF_INET... " >&6; } +if test "${glib_cv_value_AF_INET+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "AF_INET" "glib_cv_value_AF_INET" "$glib_inet_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_AF_INET" >&5 +$as_echo "$glib_cv_value_AF_INET" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking value of AF_INET6" >&5 +$as_echo_n "checking value of AF_INET6... " >&6; } +if test "${glib_cv_value_AF_INET6+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "AF_INET6" "glib_cv_value_AF_INET6" "$glib_inet_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_AF_INET6" >&5 +$as_echo "$glib_cv_value_AF_INET6" >&6; } + +# winsock defines this even though it doesn't support it +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking value of AF_UNIX" >&5 +$as_echo_n "checking value of AF_UNIX... " >&6; } +if test "${glib_cv_value_AF_UNIX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "AF_UNIX" "glib_cv_value_AF_UNIX" "$glib_inet_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_AF_UNIX" >&5 +$as_echo "$glib_cv_value_AF_UNIX" >&6; } + +if $glib_failed ; then + as_fn_error "Could not determine values for AF_INET* constants" "$LINENO" 5 +fi + +glib_failed=false +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking value of MSG_PEEK" >&5 +$as_echo_n "checking value of MSG_PEEK... " >&6; } +if test "${glib_cv_value_MSG_PEEK+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "MSG_PEEK" "glib_cv_value_MSG_PEEK" "$glib_inet_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_MSG_PEEK" >&5 +$as_echo "$glib_cv_value_MSG_PEEK" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking value of MSG_OOB" >&5 +$as_echo_n "checking value of MSG_OOB... " >&6; } +if test "${glib_cv_value_MSG_OOB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "MSG_OOB" "glib_cv_value_MSG_OOB" "$glib_inet_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_MSG_OOB" >&5 +$as_echo "$glib_cv_value_MSG_OOB" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking value of MSG_DONTROUTE" >&5 +$as_echo_n "checking value of MSG_DONTROUTE... " >&6; } +if test "${glib_cv_value_MSG_DONTROUTE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "MSG_DONTROUTE" "glib_cv_value_MSG_DONTROUTE" "$glib_inet_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_MSG_DONTROUTE" >&5 +$as_echo "$glib_cv_value_MSG_DONTROUTE" >&6; } + +if $glib_failed ; then + as_fn_error "Could not determine values for MSG_* constants" "$LINENO" 5 +fi + +for ac_func in getprotobyname_r endservent +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +for ac_header in netdb.h wspiapi.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# For gio/libasyncns +if test $glib_native_win32 = no; then + for ac_func in strndup setresuid setreuid +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + for ac_header in sys/prctl.h arpa/nameser_compat.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query" >&5 +$as_echo_n "checking for res_query... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +int +main () +{ +res_query("test", 0, 0, (void *)0, 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; } +else + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +int +main () +{ +res_query("test", 0, 0, (void *)0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: in -lresolv" >&5 +$as_echo "in -lresolv" >&6; } + LIBASYNCNS_LIBADD="-lresolv" +else + LIBS="-lbind $save_libs" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +res_query("test", 0, 0, (void *)0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: in -lbind" >&5 +$as_echo "in -lbind" >&6; } + LIBASYNCNS_LIBADD="-lbind" +else + as_fn_error "not found" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$save_libs" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi + +case $host in + *-*-solaris* ) + +$as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h + + +$as_echo "#define _XOPEN_SOURCE 2" >>confdefs.h + + +$as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + ;; +esac + +if test "$ac_cv_func_statfs" = yes ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking number of arguments to statfs()" >&5 +$as_echo_n "checking number of arguments to statfs()... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #ifdef HAVE_SYS_PARAM_H + #include + #endif + #ifdef HAVE_SYS_VFS_H + #include + #endif + #ifdef HAVE_SYS_MOUNT_H + #include + #endif + #ifdef HAVE_SYS_STATFS_H + #include + #endif +int +main () +{ +struct statfs st; + statfs(NULL, &st); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 2" >&5 +$as_echo "2" >&6; } + +$as_echo "#define STATFS_ARGS 2" >>confdefs.h + +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #ifdef HAVE_SYS_PARAM_H + #include + #endif + #ifdef HAVE_SYS_VFS_H + #include + #endif + #ifdef HAVE_SYS_MOUNT_H + #include + #endif + #ifdef HAVE_SYS_STATFS_H + #include + #endif +int +main () +{ +struct statfs st; + statfs(NULL, &st, sizeof (st), 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: 4" >&5 +$as_echo "4" >&6; } + +$as_echo "#define STATFS_ARGS 4" >>confdefs.h + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } + as_fn_error "unable to determine number of arguments to statfs()" "$LINENO" 5 +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 + +# +# Check whether to use an included printf +# + +# Check whether --enable-included-printf was given. +if test "${enable_included_printf+set}" = set; then : + enableval=$enable_included_printf; enable_included_printf="$enableval" +fi + + +need_included_printf=no +if test "x$enable_included_printf" = "xyes" ; then + need_included_printf=yes +fi +if test "$ac_cv_func_vsnprintf_c99" != "yes" ; then + need_included_printf=yes +fi +if test "$ac_cv_func_printf_unix98" != "yes" ; then + need_included_printf=yes +fi +if test "x$ac_cv_sizeof_long_long" = "x8" && + test -z "$glib_cv_long_long_format" ; then + need_included_printf=yes +fi + +if test "x$enable_included_printf" = "xno" && + test "x$need_included_printf" = "xyes" ; then + as_fn_error " +*** Your C library's printf doesn't appear to have the features that +*** GLib needs, but you specified --enable-included-printf=no." "$LINENO" 5 +fi + +enable_included_printf=$need_included_printf + + if test "$enable_included_printf" != "yes"; then + HAVE_GOOD_PRINTF_TRUE= + HAVE_GOOD_PRINTF_FALSE='#' +else + HAVE_GOOD_PRINTF_TRUE='#' + HAVE_GOOD_PRINTF_FALSE= +fi + +if test "$enable_included_printf" != "yes" ; then + +$as_echo "#define HAVE_GOOD_PRINTF 1" >>confdefs.h + +else + if test -z "$glib_cv_long_long_format" ; then + glib_cv_long_long_format="ll" + fi + $as_echo "#define HAVE_VASPRINTF 1" >>confdefs.h + +fi + +# Checks needed for gnulib vasnprintf + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed" >&5 +$as_echo_n "checking for signed... " >&6; } +if test "${bh_cv_c_signed+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +signed char x; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + bh_cv_c_signed=yes +else + bh_cv_c_signed=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bh_cv_c_signed" >&5 +$as_echo "$bh_cv_c_signed" >&6; } + if test $bh_cv_c_signed = no; then + +$as_echo "#define signed /**/" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 +$as_echo_n "checking for long long... " >&6; } +if test "${ac_cv_type_long_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +long long ll = 1LL; int i = 63; +int +main () +{ +long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_type_long_long=yes +else + ac_cv_type_long_long=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long" >&5 +$as_echo "$ac_cv_type_long_long" >&6; } + if test $ac_cv_type_long_long = yes; then + +$as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double" >&5 +$as_echo_n "checking for long double... " >&6; } +if test "${gt_cv_c_long_double+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_long_double=yes +else + gt_cv_c_long_double=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_long_double" >&5 +$as_echo "$gt_cv_c_long_double" >&6; } + if test $gt_cv_c_long_double = yes; then + +$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 +$as_echo_n "checking for wchar_t... " >&6; } +if test "${gt_cv_c_wchar_t+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + wchar_t foo = (wchar_t)'\0'; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_wchar_t=yes +else + gt_cv_c_wchar_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 +$as_echo "$gt_cv_c_wchar_t" >&6; } + if test $gt_cv_c_wchar_t = yes; then + +$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 +$as_echo_n "checking for wint_t... " >&6; } +if test "${gt_cv_c_wint_t+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + wint_t foo = (wchar_t)'\0'; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gt_cv_c_wint_t=yes +else + gt_cv_c_wint_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 +$as_echo "$gt_cv_c_wint_t" >&6; } + if test $gt_cv_c_wint_t = yes; then + +$as_echo "#define HAVE_WINT_T 1" >>confdefs.h + + 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" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_PTRDIFF_T 1 +_ACEOF + + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 +$as_echo_n "checking for inttypes.h... " >&6; } +if test "${jm_ac_cv_header_inttypes_h+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +uintmax_t i = (uintmax_t) -1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + jm_ac_cv_header_inttypes_h=yes +else + jm_ac_cv_header_inttypes_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_inttypes_h" >&5 +$as_echo "$jm_ac_cv_header_inttypes_h" >&6; } + if test $jm_ac_cv_header_inttypes_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_INTTYPES_H_WITH_UINTMAX 1 +_ACEOF + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 +$as_echo_n "checking for stdint.h... " >&6; } +if test "${jm_ac_cv_header_stdint_h+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main () +{ +uintmax_t i = (uintmax_t) -1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + jm_ac_cv_header_stdint_h=yes +else + jm_ac_cv_header_stdint_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_stdint_h" >&5 +$as_echo "$jm_ac_cv_header_stdint_h" >&6; } + if test $jm_ac_cv_header_stdint_h = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H_WITH_UINTMAX 1 +_ACEOF + + fi + + + + + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + +cat >>confdefs.h <<_ACEOF +#define intmax_t $ac_type +_ACEOF + + else + +$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h + + fi + +for ac_func in snprintf wcslen +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 snprintf" >&5 +$as_echo_n "checking for C99 snprintf... " >&6; } +if test "${ac_cv_func_snprintf_c99+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_snprintf_c99=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +doit() +{ + char buffer[32]; + va_list args; + int r; + + r = snprintf(buffer, 5, "1234567"); + + if (r != 7) + exit(1); + + r = snprintf(buffer, 0, "1234567"); + + if (r != 7) + exit(1); + + r = snprintf(NULL, 0, "1234567"); + + if (r != 7) + exit(1); + + exit(0); +} + +int +main(void) +{ + doit(); + exit(1); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_snprintf_c99=yes +else + ac_cv_func_snprintf_c99=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_snprintf_c99" >&5 +$as_echo "$ac_cv_func_snprintf_c99" >&6; } +if test $ac_cv_func_snprintf_c99 = yes; then + +$as_echo "#define HAVE_C99_SNPRINTF 1" >>confdefs.h + +fi + + +# Check if bcopy can be used for overlapping copies, if memmove isn't found. +# The check is borrowed from the PERL Configure script. +if test "$ac_cv_func_memmove" != "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether bcopy can handle overlapping copies" >&5 +$as_echo_n "checking whether bcopy can handle overlapping copies... " >&6; } +if test "${glib_cv_working_bcopy+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + int main() { + char buf[128], abc[128], *b; + int len, off, align; + bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36); + for (align = 7; align >= 0; align--) { + for (len = 36; len; len--) { + b = buf+align; bcopy(abc, b, len); + for (off = 1; off <= len; off++) { + bcopy(b, b+off, len); bcopy(b+off, b, len); + if (bcmp(b, abc, len)) return(1); + } + } + } + return(0); + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_working_bcopy=yes +else + glib_cv_working_bcopy=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: $glib_cv_working_bcopy" >&5 +$as_echo "$glib_cv_working_bcopy" >&6; } + + if test "x${glib_cv_working_bcopy+set}" != "xset" ; then + as_fn_error "glib_cv_working_bcopy must be set in cache file when cross-compiling." "$LINENO" 5 +fi + + if test "$glib_cv_working_bcopy" = "yes"; then + +$as_echo "#define HAVE_WORKING_BCOPY 1" >>confdefs.h + + fi +fi + +# Check for sys_errlist +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys_errlist" >&5 +$as_echo_n "checking for sys_errlist... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +extern char *sys_errlist[]; +extern int sys_nerr; +sys_errlist[sys_nerr-1][0] = 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_ok=yes +else + glib_ok=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_ok" >&5 +$as_echo "$glib_ok" >&6; } +if test "$glib_ok" = "no"; then + +$as_echo "#define NO_SYS_ERRLIST 1" >>confdefs.h + +fi + +# Check for sys_siglist +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys_siglist" >&5 +$as_echo_n "checking for sys_siglist... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +extern char *sys_siglist[]; +exit (sys_siglist[0]); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_ok=yes +else + glib_ok=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_ok" >&5 +$as_echo "$glib_ok" >&6; } +if test "$glib_ok" = "no"; then + +$as_echo "#define NO_SYS_SIGLIST 1" >>confdefs.h + +fi + +# Check for sys_siglist decl (see Tue Jan 19 00:44:24 1999 in changelog) +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys_siglist declaration" >&5 +$as_echo_n "checking for sys_siglist declaration... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + +strlen (sys_siglist[0]); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glib_ok=yes +else + glib_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_ok" >&5 +$as_echo "$glib_ok" >&6; } +if test "$glib_ok" = "no"; then + +$as_echo "#define NO_SYS_SIGLIST_DECL 1" >>confdefs.h + +fi + +# Check if needs to be included for fd_set +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fd_set" >&5 +$as_echo_n "checking for fd_set... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +fd_set readMask, writeMask; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gtk_ok=yes +else + gtk_ok=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if test "$gtk_ok" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, found in sys/types.h" >&5 +$as_echo "yes, found in sys/types.h" >&6; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "fd_set" >/dev/null 2>&1; then : + gtk_ok=yes +fi +rm -f conftest* + + if test "$gtk_ok" = "yes"; then + # *** FIXME: give it a different name + +$as_echo "#define HAVE_SYS_SELECT_H 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, found in sys/select.h" >&5 +$as_echo "yes, found in sys/select.h" >&6; } + else + +$as_echo "#define NO_FD_SET 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether realloc (NULL,) will work" >&5 +$as_echo_n "checking whether realloc (NULL,) will work... " >&6; } +if test "${glib_cv_sane_realloc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then : + glib_cv_sane_realloc=yes +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main() { + return realloc (0, sizeof (int)) == 0; + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_sane_realloc=yes +else + glib_cv_sane_realloc=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: $glib_cv_sane_realloc" >&5 +$as_echo "$glib_cv_sane_realloc" >&6; } +if test x$glib_cv_sane_realloc = xyes; then + +$as_echo "#define REALLOC_0_WORKS 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo (CODESET)" >&5 +$as_echo_n "checking for nl_langinfo (CODESET)... " >&6; } +if test "${glib_cv_langinfo_codeset+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char *codeset = nl_langinfo (CODESET); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glib_cv_langinfo_codeset=yes +else + glib_cv_langinfo_codeset=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_langinfo_codeset" >&5 +$as_echo "$glib_cv_langinfo_codeset" >&6; } +if test x$glib_cv_langinfo_codeset = xyes; then + +$as_echo "#define HAVE_CODESET 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a compliant posix_memalign() implementation" >&5 +$as_echo_n "checking for a compliant posix_memalign() implementation... " >&6; } +if test "${glib_cv_compliant_posix_memalign+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + glib_cv_compliant_posix_memalign=0 + if test "$ac_cv_func_posix_memalign" = "yes" ; then + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE 600 + #include /* posix_memalign() should be defined here */ + /* some systems break if #include used */ + static void test_memalign (size_t boundary, size_t size) { + void *mem = 0; + if (posix_memalign (&mem, boundary, size) != 0 || !mem) + exit (1); + else + free (mem); + } + int main() { + test_memalign ( 128, 128 - 2 * sizeof (void*)); + test_memalign ( 256, 256 - 2 * sizeof (void*)); + test_memalign ( 512, 512 - 2 * sizeof (void*)); + test_memalign ( 1024, 1024 - 2 * sizeof (void*)); + test_memalign ( 2048, 2048 - 2 * sizeof (void*)); + test_memalign ( 4096, 4096 - 2 * sizeof (void*)); + test_memalign ( 8192, 8192 - 2 * sizeof (void*)); + test_memalign (16384, 16384 - 2 * sizeof (void*)); + test_memalign (32768, 32768 - 2 * sizeof (void*)); + exit (0); /* success */ + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_compliant_posix_memalign=1 +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 + +if test "$glib_cv_compliant_posix_memalign" = "1"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Check for strlcpy +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenBSD strlcpy/strlcat" >&5 +$as_echo_n "checking for OpenBSD strlcpy/strlcat... " >&6; } +if test "${glib_cv_have_strlcpy+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + +if test "$cross_compiling" = yes; then : + glib_cv_have_strlcpy=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int main() { + char p[10]; + (void) strlcpy (p, "hi", 10); + if (strlcat (p, "bye", 0) != 3) + return 1; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_have_strlcpy=yes +else + glib_cv_have_strlcpy=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: $glib_cv_have_strlcpy" >&5 +$as_echo "$glib_cv_have_strlcpy" >&6; } +if test "$glib_cv_have_strlcpy" = "yes"; then + +$as_echo "#define HAVE_STRLCPY 1" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an implementation of va_copy()" >&5 +$as_echo_n "checking for an implementation of va_copy()... " >&6; } +if test "${glib_cv_va_copy+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + va_copy (args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { + f (0, 42); + return 0; + } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_cv_va_copy=yes +else + glib_cv_va_copy=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_va_copy" >&5 +$as_echo "$glib_cv_va_copy" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an implementation of __va_copy()" >&5 +$as_echo_n "checking for an implementation of __va_copy()... " >&6; } +if test "${glib_cv___va_copy+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + __va_copy (args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { + f (0, 42); + return 0; + } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_cv___va_copy=yes +else + glib_cv___va_copy=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv___va_copy" >&5 +$as_echo "$glib_cv___va_copy" >&6; } + +if test "x$glib_cv_va_copy" = "xyes"; then + g_va_copy_func=va_copy +else if test "x$glib_cv___va_copy" = "xyes"; then + g_va_copy_func=__va_copy +fi +fi + +if test -n "$g_va_copy_func"; then + +cat >>confdefs.h <<_ACEOF +#define G_VA_COPY $g_va_copy_func +_ACEOF + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether va_lists can be copied by value" >&5 +$as_echo_n "checking whether va_lists can be copied by value... " >&6; } +if test "${glib_cv_va_val_copy+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then : + glib_cv_va_val_copy=yes +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + args2 = args1; + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { + f (0, 42); + return 0; + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_va_val_copy=yes +else + glib_cv_va_val_copy=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: $glib_cv_va_val_copy" >&5 +$as_echo "$glib_cv_va_val_copy" >&6; } + +if test "x$glib_cv_va_val_copy" = "xno"; then + +$as_echo "#define G_VA_COPY_AS_ARRAY 1" >>confdefs.h + +fi + +G_MODULE_LIBS= +G_MODULE_LIBS_EXTRA= +G_MODULE_PLUGIN_LIBS= +if test x"$glib_native_win32" = xyes; then + G_MODULE_LDFLAGS= +else + export SED + G_MODULE_LDFLAGS=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` +fi +G_MODULE_NEED_USCORE=0 +G_MODULE_BROKEN_RTLD_GLOBAL=0 +G_MODULE_HAVE_DLERROR=0 +if test -z "$G_MODULE_IMPL"; then + case "$host" in + *-*-mingw*|*-*-cygwin*) G_MODULE_IMPL=G_MODULE_IMPL_WIN32 ;; + esac +fi +if test -z "$G_MODULE_IMPL"; then + case "$host" in + *-*-aix*) G_MODULE_IMPL=G_MODULE_IMPL_AR ;; + esac +fi +if test -z "$G_MODULE_IMPL"; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = x""yes; then : + ac_fn_c_check_func "$LINENO" "dlsym" "ac_cv_func_dlsym" +if test "x$ac_cv_func_dlsym" = x""yes; then : + G_MODULE_IMPL=G_MODULE_IMPL_DL +fi + +fi + +fi +if test -z "$G_MODULE_IMPL" && test "x$glib_native_beos" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for load_image in -lroot" >&5 +$as_echo_n "checking for load_image in -lroot... " >&6; } +if test "${ac_cv_lib_root_load_image+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lroot $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 load_image (); +int +main () +{ +return load_image (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_root_load_image=yes +else + ac_cv_lib_root_load_image=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_root_load_image" >&5 +$as_echo "$ac_cv_lib_root_load_image" >&6; } +if test "x$ac_cv_lib_root_load_image" = x""yes; then : + G_MODULE_LIBS="-lbe -lroot -lglib-2.0 " + G_MODULE_LIBS_EXTRA="-L\$(top_builddir_full)/.libs" + G_MODULE_PLUGIN_LIBS="-L\$(top_builddir_full)/gmodule/.libs -lgmodule" + G_MODULE_IMPL=G_MODULE_IMPL_BEOS +fi + +fi +if test -z "$G_MODULE_IMPL"; then + ac_fn_c_check_func "$LINENO" "NSLinkModule" "ac_cv_func_NSLinkModule" +if test "x$ac_cv_func_NSLinkModule" = x""yes; then : + G_MODULE_IMPL=G_MODULE_IMPL_DYLD + G_MODULE_NEED_USCORE=1 +fi + +fi +if test -z "$G_MODULE_IMPL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 +$as_echo_n "checking for dlsym in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlsym+set}" = set; 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 dlsym (); +int +main () +{ +return dlsym (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlsym=yes +else + ac_cv_lib_dl_dlsym=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_dlsym" >&5 +$as_echo "$ac_cv_lib_dl_dlsym" >&6; } +if test "x$ac_cv_lib_dl_dlsym" = x""yes; then : + G_MODULE_LIBS=-ldl + G_MODULE_IMPL=G_MODULE_IMPL_DL +fi + +fi + +fi +if test -z "$G_MODULE_IMPL"; then + { $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 test "${ac_cv_lib_dld_shl_load+set}" = set; 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" = x""yes; then : + G_MODULE_LIBS=-ldld + G_MODULE_IMPL=G_MODULE_IMPL_DLD +fi + +fi +if test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL"; then + LIBS_orig="$LIBS" + LDFLAGS_orig="$LDFLAGS" + LIBS="$G_MODULE_LIBS $LIBS" + LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS" + echo "void glib_plugin_test(void) { }" > plugin.c + ${SHELL} ./libtool --mode=compile ${CC} -shared \ + -export-dynamic -o plugin.o plugin.c 2>&1 >/dev/null + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RTLD_GLOBAL brokenness" >&5 +$as_echo_n "checking for RTLD_GLOBAL brokenness... " >&6; } +if test "${glib_cv_rtldglobal_broken+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then : + glib_cv_rtldglobal_broken=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifndef RTLD_GLOBAL +# define RTLD_GLOBAL 0 +#endif +#ifndef RTLD_LAZY +# define RTLD_LAZY 0 +#endif +int glib_plugin_test; +int main () { + void *handle, *global, *local; + global = &glib_plugin_test; + handle = dlopen ("./.libs/plugin.o", RTLD_GLOBAL | RTLD_LAZY); + if (!handle) return 0; + local = dlsym (handle, "glib_plugin_test"); + return global == local; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_rtldglobal_broken=no +else + glib_cv_rtldglobal_broken=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + rm -f plugin.c plugin.o plugin.lo .libs/plugin.o + rmdir .libs 2>/dev/null + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_rtldglobal_broken" >&5 +$as_echo "$glib_cv_rtldglobal_broken" >&6; } + if test "x$glib_cv_rtldglobal_broken" = "xyes"; then + G_MODULE_BROKEN_RTLD_GLOBAL=1 + else + G_MODULE_BROKEN_RTLD_GLOBAL=0 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for preceeding underscore in symbols" >&5 +$as_echo_n "checking for preceeding underscore in symbols... " >&6; } +if test "${glib_cv_uscore+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int glib_underscore_test (void) { return 42; } + int main() { + void *f1 = (void*)0, *f2 = (void*)0, *handle; + handle = dlopen ((void*)0, 0); + if (handle) { + f1 = dlsym (handle, "glib_underscore_test"); + f2 = dlsym (handle, "_glib_underscore_test"); + } return (!f2 || f1); + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_uscore=yes +else + glib_cv_uscore=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + rm -f plugin.c plugin.$ac_objext plugin.lo + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_uscore" >&5 +$as_echo "$glib_cv_uscore" >&6; } + if test "x${glib_cv_uscore+set}" != "xset" ; then + as_fn_error "glib_cv_uscore must be set in cache file when cross-compiling." "$LINENO" 5 +fi + + if test "x$glib_cv_uscore" = "xyes"; then + G_MODULE_NEED_USCORE=1 + else + G_MODULE_NEED_USCORE=0 + fi + + LDFLAGS="$LDFLAGS_orig" + ac_fn_c_check_func "$LINENO" "dlerror" "ac_cv_func_dlerror" +if test "x$ac_cv_func_dlerror" = x""yes; then : + G_MODULE_HAVE_DLERROR=1 +else + G_MODULE_HAVE_DLERROR=0 +fi + + LIBS="$LIBS_orig" +fi +if test -z "$G_MODULE_IMPL"; then + G_MODULE_IMPL=0 + G_MODULE_SUPPORTED=false +else + G_MODULE_SUPPORTED=true +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the suffix of module shared libraries" >&5 +$as_echo_n "checking for the suffix of module shared libraries... " >&6; } +export SED +shrext_cmds=`./libtool --config | grep '^shrext_cmds='` +eval $shrext_cmds +module=yes eval std_shrext=$shrext_cmds +# chop the initial dot +glib_gmodule_suffix=`echo $std_shrext | sed 's/^\.//'` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: .$glib_gmodule_suffix" >&5 +$as_echo ".$glib_gmodule_suffix" >&6; } +# any reason it may fail? +if test "x$glib_gmodule_suffix" = x; then + as_fn_error "Cannot determine shared library suffix from libtool" "$LINENO" 5 +fi + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gspawn implementation" >&5 +$as_echo_n "checking for gspawn implementation... " >&6; } +case "$host" in + *-*-mingw*) + GSPAWN=gspawn-win32.lo + ;; + *) + GSPAWN=gspawn.lo + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSPAWN" >&5 +$as_echo "$GSPAWN" >&6; } + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIOChannel implementation" >&5 +$as_echo_n "checking for GIOChannel implementation... " >&6; } +case "$host" in + *-*-mingw*) + GIO=giowin32.lo + ;; + *) + GIO=giounix.lo + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $GIO" >&5 +$as_echo "$GIO" >&6; } + + + + +# Check whether --with-gio-module-dir was given. +if test "${with_gio_module_dir+set}" = set; then : + withval=$with_gio_module_dir; +else + with_gio_module_dir='${libdir}/gio/modules' +fi + +GIO_MODULE_DIR=$with_gio_module_dir + + +# Check whether --enable-selinux was given. +if test "${enable_selinux+set}" = set; then : + enableval=$enable_selinux; +fi + +msg_selinux=no +SELINUX_LIBS= +if test "x$enable_selinux" != "xno"; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for is_selinux_enabled in -lselinux" >&5 +$as_echo_n "checking for is_selinux_enabled in -lselinux... " >&6; } +if test "${ac_cv_lib_selinux_is_selinux_enabled+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lselinux $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 is_selinux_enabled (); +int +main () +{ +return is_selinux_enabled (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_selinux_is_selinux_enabled=yes +else + ac_cv_lib_selinux_is_selinux_enabled=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_selinux_is_selinux_enabled" >&5 +$as_echo "$ac_cv_lib_selinux_is_selinux_enabled" >&6; } +if test "x$ac_cv_lib_selinux_is_selinux_enabled" = x""yes; then : + for ac_header in selinux/selinux.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "selinux/selinux.h" "ac_cv_header_selinux_selinux_h" "$ac_includes_default" +if test "x$ac_cv_header_selinux_selinux_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SELINUX_SELINUX_H 1 +_ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lgetfilecon_raw in -lselinux" >&5 +$as_echo_n "checking for lgetfilecon_raw in -lselinux... " >&6; } +if test "${ac_cv_lib_selinux_lgetfilecon_raw+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lselinux $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 lgetfilecon_raw (); +int +main () +{ +return lgetfilecon_raw (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_selinux_lgetfilecon_raw=yes +else + ac_cv_lib_selinux_lgetfilecon_raw=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_selinux_lgetfilecon_raw" >&5 +$as_echo "$ac_cv_lib_selinux_lgetfilecon_raw" >&6; } +if test "x$ac_cv_lib_selinux_lgetfilecon_raw" = x""yes; then : + +$as_echo "#define HAVE_SELINUX 1" >>confdefs.h + + SELINUX_LIBS="-lselinux" + msg_selinux=yes +fi + + +fi + +done + + +fi + +fi + + +inotify_support=no +for ac_header in sys/inotify.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/inotify.h" "ac_cv_header_sys_inotify_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_inotify_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_INOTIFY_H 1 +_ACEOF + + inotify_support=yes + for ac_func in inotify_init1 +do : + ac_fn_c_check_func "$LINENO" "inotify_init1" "ac_cv_func_inotify_init1" +if test "x$ac_cv_func_inotify_init1" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_INOTIFY_INIT1 1 +_ACEOF + +fi +done + + +fi + +done + + + if test "$inotify_support" = "yes"; then + HAVE_INOTIFY_TRUE= + HAVE_INOTIFY_FALSE='#' +else + HAVE_INOTIFY_TRUE='#' + HAVE_INOTIFY_FALSE= +fi + + +fen_support=no +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifndef PORT_SOURCE_FILE +#error "Please upgrade to Nevada 72 or above to suppoert FEN" +#endif +int main() { return 0; } +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + fen_support=yes + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + if test "$fen_support" = "yes"; then + HAVE_FEN_TRUE= + HAVE_FEN_FALSE='#' +else + HAVE_FEN_TRUE='#' + HAVE_FEN_FALSE= +fi + + + +should_disable_fam=no + +# Check whether --enable-fam was given. +if test "${enable_fam+set}" = set; then : + enableval=$enable_fam; + if test "x$enable_fam" = "xno"; then + should_disable_fam=yes + echo "Not building FAM support" + fi + + +fi + +fam_support=no +FAM_LIBS= +if test "x$should_disable_fam" = "xno"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FAMOpen in -lfam" >&5 +$as_echo_n "checking for FAMOpen in -lfam... " >&6; } +if test "${ac_cv_lib_fam_FAMOpen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfam $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 FAMOpen (); +int +main () +{ +return FAMOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_fam_FAMOpen=yes +else + ac_cv_lib_fam_FAMOpen=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_fam_FAMOpen" >&5 +$as_echo "$ac_cv_lib_fam_FAMOpen" >&6; } +if test "x$ac_cv_lib_fam_FAMOpen" = x""yes; then : + for ac_header in fam.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "fam.h" "ac_cv_header_fam_h" "$ac_includes_default" +if test "x$ac_cv_header_fam_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FAM_H 1 +_ACEOF + +$as_echo "#define HAVE_FAM /**/" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FAMNoExists in -lfam" >&5 +$as_echo_n "checking for FAMNoExists in -lfam... " >&6; } +if test "${ac_cv_lib_fam_FAMNoExists+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfam $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 FAMNoExists (); +int +main () +{ +return FAMNoExists (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_fam_FAMNoExists=yes +else + ac_cv_lib_fam_FAMNoExists=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_fam_FAMNoExists" >&5 +$as_echo "$ac_cv_lib_fam_FAMNoExists" >&6; } +if test "x$ac_cv_lib_fam_FAMNoExists" = x""yes; then : + +$as_echo "#define HAVE_FAM_NO_EXISTS /**/" >>confdefs.h + +fi + + FAM_LIBS="-lfam" + fam_support=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** FAM support will not be built (header files not found) ***" >&5 +$as_echo "$as_me: WARNING: *** FAM support will not be built (header files not found) ***" >&2;} +fi + +done + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** FAM support will not be built (FAM library not found) ***" >&5 +$as_echo "$as_me: WARNING: *** FAM support will not be built (FAM library not found) ***" >&2;} +fi + + +fi + if test "$fam_support" = "yes"; then + HAVE_FAM_TRUE= + HAVE_FAM_FALSE='#' +else + HAVE_FAM_TRUE='#' + HAVE_FAM_FALSE= +fi + + + +# Check whether --enable-xattr was given. +if test "${enable_xattr+set}" = set; then : + enableval=$enable_xattr; +fi + +msg_xattr=no +XATTR_LIBS= +if test "x$enable_xattr" != "xno"; then + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getxattr in -lc" >&5 +$as_echo_n "checking for getxattr in -lc... " >&6; } +if test "${ac_cv_lib_c_getxattr+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $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 getxattr (); +int +main () +{ +return getxattr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_c_getxattr=yes +else + ac_cv_lib_c_getxattr=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_c_getxattr" >&5 +$as_echo "$ac_cv_lib_c_getxattr" >&6; } +if test "x$ac_cv_lib_c_getxattr" = x""yes; then : + for ac_header in sys/xattr.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/xattr.h" "ac_cv_header_sys_xattr_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_xattr_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_XATTR_H 1 +_ACEOF + +$as_echo "#define HAVE_XATTR 1" >>confdefs.h + + msg_xattr=yes +fi + +done + + +fi + + + if test "x$msg_xattr" != "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getxattr in -lattr" >&5 +$as_echo_n "checking for getxattr in -lattr... " >&6; } +if test "${ac_cv_lib_attr_getxattr+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lattr $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 getxattr (); +int +main () +{ +return getxattr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_attr_getxattr=yes +else + ac_cv_lib_attr_getxattr=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_attr_getxattr" >&5 +$as_echo "$ac_cv_lib_attr_getxattr" >&6; } +if test "x$ac_cv_lib_attr_getxattr" = x""yes; then : + for ac_header in attr/xattr.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "attr/xattr.h" "ac_cv_header_attr_xattr_h" "$ac_includes_default" +if test "x$ac_cv_header_attr_xattr_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ATTR_XATTR_H 1 +_ACEOF + +$as_echo "#define HAVE_XATTR 1" >>confdefs.h + + XATTR_LIBS="-lattr" + msg_xattr=yes +fi + +done + + +fi + + fi + + if test "x$msg_xattr" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XATTR_NOFOLLOW" >&5 +$as_echo_n "checking for XATTR_NOFOLLOW... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #ifdef HAVE_SYS_TYPES_H + #include + #endif + #ifdef HAVE_SYS_XATTR_H + #include + #elif HAVE_ATTR_XATTR_H + #include + #endif + +int +main () +{ +ssize_t len = getxattr("", "", NULL, 0, 0, XATTR_NOFOLLOW); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + +$as_echo "#define HAVE_XATTR_NOFOLLOW 1" >>confdefs.h + + { $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 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform-dependent source" >&5 +$as_echo_n "checking for platform-dependent source... " >&6; } +case "$host" in + *-*-cygwin*|*-*-mingw*) + PLATFORMDEP=gwin32.lo + ;; + *) + PLATFORMDEP= + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PLATFORMDEP" >&5 +$as_echo "$PLATFORMDEP" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile timeloop" >&5 +$as_echo_n "checking whether to compile timeloop... " >&6; } +case "$host" in + *-*-cygwin*|*-*-mingw*|*-*-minix) + enable_timeloop=no + ;; + *) + enable_timeloop=yes + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_timeloop" >&5 +$as_echo "$enable_timeloop" >&6; } + if test x$enable_timeloop = xyes; then + ENABLE_TIMELOOP_TRUE= + ENABLE_TIMELOOP_FALSE='#' +else + ENABLE_TIMELOOP_TRUE='#' + ENABLE_TIMELOOP_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if building for some Win32 platform" >&5 +$as_echo_n "checking if building for some Win32 platform... " >&6; } +case "$host" in + *-*-mingw*|*-*-cygwin*) + platform_win32=yes + ;; + *) + platform_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 + + + + +# Check whether --with-threads was given. +if test "${with_threads+set}" = set; then : + withval=$with_threads; if test "x$with_threads" = x; then + want_threads=yes + else + want_threads=$with_threads + fi +else + want_threads=yes +fi + +if test "x$enable_threads" = "xno"; then + want_threads=no +fi + + +THREAD_NO_IMPLEMENTATION="You do not have any known thread system on your + computer. GLib will not have a default thread implementation." + +FLAG_DOES_NOT_WORK="I can't find the MACRO to enable thread safety on your + platform (normally it's "_REENTRANT"). I'll not use any flag on + compilation now, but then your programs might not work. + Please provide information on how it is done on your system." + +LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation + " + +LIBS_NOT_FOUND_2=". Please choose another thread implementation or + provide information on your thread implementation. + You can also run 'configure --disable-threads' + to compile without thread support." + +FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)' + functions will not be MT-safe during their first call because + there is no working 'getpwuid_r' on your system." + +FUNC_NO_LOCALTIME_R="the 'g_date_set_time' function will not be MT-safe + because there is no 'localtime_r' on your system." + +POSIX_NO_YIELD="I can not find a yield functions for your platform. A rather + crude surrogate will be used. If you happen to know a + yield function for your system, please inform the GLib + developers." + +POSIX_NO_PRIORITIES="I can not find the minimal and maximal priorities for + threads on your system. Thus threads can only have the default + priority. If you happen to know these main/max + priorities, please inform the GLib developers." + +AIX_COMPILE_INFO="AIX's C compiler needs to be called by a different name, when + linking threaded applications. As GLib cannot do that + automatically, you will get an linkg error everytime you are + not using the right compiler. In that case you have to relink + with the right compiler. Ususally just '_r' is appended + to the compiler name." + + +# have_threads=no means no thread support +# have_threads=none means no default thread implementation + +have_threads=no +if test "x$want_threads" = xyes || test "x$want_threads" = xposix \ + || test "x$want_threads" = xdce; then + # -D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE is for DG/UX + # -U_OSF_SOURCE is for Digital UNIX 4.0d + GTHREAD_COMPILE_IMPL_DEFINES="-D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE -U_OSF_SOURCE" + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + if test "x$have_threads" = xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + have_threads=posix +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test "x$have_threads" = xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_mutex_t m; + pthread_mutex_init (&m, pthread_mutexattr_default); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + have_threads=dce +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + # Tru64Unix requires -pthread to find pthread.h. See #103020 + CPPFLAGS="$CPPFLAGS -pthread" + if test "x$have_threads" = xno; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + have_threads=posix +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + CPPFLAGS="$glib_save_CPPFLAGS" +fi +if test "x$want_threads" = xyes || test "x$want_threads" = xwin32; then + case $host in + *-*-mingw*) + have_threads=win32 + ;; + esac +fi +if test "x$want_threads" = xnone; then + have_threads=none +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread implementation" >&5 +$as_echo_n "checking for thread implementation... " >&6; } + +if test "x$have_threads" = xno && test "x$want_threads" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none available" >&5 +$as_echo "none available" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $THREAD_NO_IMPLEMENTATION" >&5 +$as_echo "$as_me: WARNING: $THREAD_NO_IMPLEMENTATION" >&2;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_threads" >&5 +$as_echo "$have_threads" >&6; } +fi + + + +G_THREAD_LIBS= +G_THREAD_LIBS_EXTRA= +G_THREAD_CFLAGS= + + + + + +if test x"$have_threads" != xno; then + + if test x"$have_threads" = xposix; then + # First we test for posix, whether -pthread or -pthreads do the trick as + # both CPPFLAG and LIBS. + # One of them does for most gcc versions and some other platforms/compilers + # too and could be considered as the canonical way to go. + case $host in + *-*-cygwin*|*-*-darwin*) + # skip cygwin and darwin -pthread or -pthreads test + ;; + *-solaris*) + # These compiler/linker flags work with both Sun Studio and gcc + # Sun Studio expands -mt to -D_REENTRANT and -lthread + # gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread + G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS" + G_THREAD_LIBS="-lpthread -lthread" + ;; + *) + for flag in pthread pthreads mt; do + glib_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$flag" + if test "$cross_compiling" = yes; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int check_me = 0; +void* func(void* data) {check_me = 42; return &check_me;} +int main() + { pthread_t t; + void *ret; + pthread_create (&t, 0, func, 0); + pthread_join (t, &ret); + return (check_me != 42 || ret != &check_me); +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_flag_works=yes +else + glib_flag_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int check_me = 0; +void* func(void* data) {check_me = 42; return &check_me;} +int main() + { pthread_t t; + void *ret; + pthread_create (&t, 0, func, 0); + pthread_join (t, &ret); + return (check_me != 42 || ret != &check_me); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_flag_works=yes +else + glib_flag_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 + + CFLAGS="$glib_save_CFLAGS" + if test $glib_flag_works = yes ; then + G_THREAD_CFLAGS=-$flag + G_THREAD_LIBS=-$flag + break; + fi + done + ;; + esac + fi + + if test x"$G_THREAD_CFLAGS" = x; then + + # The canonical -pthread[s] does not work. Try something different. + + case $host in + *-aix*) + if test x"$GCC" = xyes; then + # GCC 3.0 and above needs -pthread. + # Should be coverd by the case above. + # GCC 2.x and below needs -mthreads + G_THREAD_CFLAGS="-mthreads" + G_THREAD_LIBS=$G_THREAD_CFLAGS + else + # We are probably using the aix compiler. Normaly a + # program would have to be compiled with the _r variant + # of the corresponding compiler, but we as GLib cannot + # do that: but the good news is that for compiling the + # only difference is the added -D_THREAD_SAFE compile + # option. This is according to the "C for AIX User's + # Guide". + G_THREAD_CFLAGS="-D_THREAD_SAFE" + fi + ;; + *-dg-dgux*) # DG/UX + G_THREAD_CFLAGS="-D_REENTRANT -D_POSIX4A_DRAFT10_SOURCE" + ;; + *-osf*) + # So we are using dce threads. posix threads are already + # catched above. + G_THREAD_CFLAGS="-threads" + G_THREAD_LIBS=$G_THREAD_CFLAGS + ;; + *-sysv5uw7*) # UnixWare 7 + # We are not using gcc with -pthread. Catched above. + G_THREAD_CFLAGS="-Kthread" + G_THREAD_LIBS=$G_THREAD_CFLAGS + ;; + *-mingw*) + # No flag needed when using MSVCRT.DLL + G_THREAD_CFLAGS="" + ;; + *) + G_THREAD_CFLAGS="-D_REENTRANT" # good default guess otherwise + ;; + esac + + fi + + # if we are not finding the localtime_r function, then we probably are + # not using the proper multithread flag + + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" + + # First we test, whether localtime_r is declared in time.h + # directly. Then we test whether a macro localtime_r exists, in + # which case localtime_r in the test program is replaced and thus + # if we still find localtime_r in the output, it is not defined as + # a macro. + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]" >/dev/null 2>&1; then : + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + localtime_r(a,b) +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]" >/dev/null 2>&1; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $FLAG_DOES_NOT_WORK" >&5 +$as_echo "$as_me: WARNING: $FLAG_DOES_NOT_WORK" >&2;} +fi +rm -f conftest* + +fi +rm -f conftest* + + + CPPFLAGS="$glib_save_CPPFLAGS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking thread related cflags" >&5 +$as_echo_n "checking thread related cflags... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $G_THREAD_CFLAGS" >&5 +$as_echo "$G_THREAD_CFLAGS" >&6; } + CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" +fi + + +mutex_has_default=no +case $have_threads in + posix|dce) + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + if test x"$G_THREAD_LIBS" = x; then + case $host in + *-aix*) + # We are not using gcc (would have set G_THREAD_LIBS) and thus + # probably using the aix compiler. + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $AIX_COMPILE_INFO" >&5 +$as_echo "$as_me: WARNING: $AIX_COMPILE_INFO" >&2;} + ;; + *) + G_THREAD_LIBS=error + glib_save_LIBS="$LIBS" + for thread_lib in "" pthread pthread32 pthreads thread dce; do + if test x"$thread_lib" = x; then + add_thread_lib="" + IN="" + else + add_thread_lib="-l$thread_lib" + IN=" in -l$thread_lib" + fi + if test x"$have_threads" = xposix; then + defattr=0 + else + defattr=pthread_attr_default + fi + + LIBS="$add_thread_lib $glib_save_LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create/pthread_join$IN" >&5 +$as_echo_n "checking for pthread_create/pthread_join$IN... " >&6; } + if test "$cross_compiling" = yes; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int check_me = 0; +void* func(void* data) {check_me = 42; return &check_me;} +int main() + { pthread_t t; + void *ret; + pthread_create (&t, $defattr, func, 0); + pthread_join (t, &ret); + return (check_me != 42 || ret != &check_me); +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_result=yes +else + glib_result=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int check_me = 0; +void* func(void* data) {check_me = 42; return &check_me;} +int main() + { pthread_t t; + void *ret; + pthread_create (&t, $defattr, func, 0); + pthread_join (t, &ret); + return (check_me != 42 || ret != &check_me); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_result=yes +else + glib_result=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_result" >&5 +$as_echo "$glib_result" >&6; } + + if test "$glib_result" = "yes" ; then + G_THREAD_LIBS="$add_thread_lib" + break + fi + done + if test "x$G_THREAD_LIBS" = xerror; then + as_fn_error "$LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2" "$LINENO" 5 + fi + LIBS="$glib_save_LIBS" + ;; + esac + fi + + glib_save_LIBS="$LIBS" + for thread_lib in "" rt rte; do + if test x"$thread_lib" = x; then + add_thread_lib="" + IN="" + else + add_thread_lib="-l$thread_lib" + IN=" in -l$thread_lib" + fi + LIBS="$add_thread_lib $glib_save_LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_get_priority_min$IN" >&5 +$as_echo_n "checking for sched_get_priority_min$IN... " >&6; } + if test "$cross_compiling" = yes; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main() { + errno = 0; + return sched_get_priority_min(SCHED_OTHER)==-1 + && errno != 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_result=yes +else + glib_result=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main() { + errno = 0; + return sched_get_priority_min(SCHED_OTHER)==-1 + && errno != 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_result=yes +else + glib_result=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_result" >&5 +$as_echo "$glib_result" >&6; } + + if test "$glib_result" = "yes" ; then + G_THREAD_LIBS="$G_THREAD_LIBS $add_thread_lib" + posix_priority_min="sched_get_priority_min(SCHED_OTHER)" + posix_priority_max="sched_get_priority_max(SCHED_OTHER)" + break + fi + done + LIBS="$glib_save_LIBS" + mutex_has_default=yes + mutex_default_type='pthread_mutex_t' + mutex_default_init='PTHREAD_MUTEX_INITIALIZER' + mutex_header_file='pthread.h' + if test "x$have_threads" = "xposix"; then + g_threads_impl="POSIX" + else + g_threads_impl="DCE" + have_threads="posix" + fi + + CPPFLAGS="$glib_save_CPPFLAGS" + ;; + win32) + g_threads_impl="WIN32" + ;; + none|no) + g_threads_impl="NONE" + ;; + *) + g_threads_impl="NONE" + G_THREAD_LIBS=error + ;; +esac + +if test "x$G_THREAD_LIBS" = xerror; then + as_fn_error "$LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2" "$LINENO" 5 +fi + +case $host in + *-*-beos*) + G_THREAD_LIBS="-lbe -lroot -lglib-2.0 " + G_THREAD_LIBS_EXTRA="-L\$(top_builddir_full)/.libs" + ;; + *) + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking thread related libraries" >&5 +$as_echo_n "checking thread related libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $G_THREAD_LIBS" >&5 +$as_echo "$G_THREAD_LIBS" >&6; } + + +if test x"$have_threads" != xno; then + glib_save_LIBS="$LIBS" + # we are not doing the following for now, as this might require glib + # to always be linked with the thread libs on some platforms. + # LIBS="$LIBS $G_THREAD_LIBS" + for ac_func in localtime_r gmtime_r +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" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + if test "$ac_cv_header_pwd_h" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix getpwuid_r" >&5 +$as_echo_n "checking for posix getpwuid_r... " >&6; } +if test "${ac_cv_func_posix_getpwuid_r+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main () { + char buffer[10000]; + struct passwd pwd, *pwptr = &pwd; + int error; + errno = 0; + error = getpwuid_r (0, &pwd, buffer, + sizeof (buffer), &pwptr); + return (error < 0 && errno == ENOSYS) + || error == ENOSYS; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_posix_getpwuid_r=yes +else + ac_cv_func_posix_getpwuid_r=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_posix_getpwuid_r" >&5 +$as_echo "$ac_cv_func_posix_getpwuid_r" >&6; } + if test "x${ac_cv_func_posix_getpwuid_r+set}" != "xset" ; then + as_fn_error "ac_cv_func_posix_getpwuid_r must be set in cache file when cross-compiling." "$LINENO" 5 +fi + + if test "$ac_cv_func_posix_getpwuid_r" = yes; then + +$as_echo "#define HAVE_POSIX_GETPWUID_R 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nonposix getpwuid_r" >&5 +$as_echo_n "checking for nonposix getpwuid_r... " >&6; } +if test "${ac_cv_func_nonposix_getpwuid_r+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char buffer[10000]; + struct passwd pwd; + getpwuid_r (0, &pwd, buffer, + sizeof (buffer)); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_nonposix_getpwuid_r=yes +else + ac_cv_func_nonposix_getpwuid_r=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_nonposix_getpwuid_r" >&5 +$as_echo "$ac_cv_func_nonposix_getpwuid_r" >&6; } + if test "x${ac_cv_func_nonposix_getpwuid_r+set}" != "xset" ; then + as_fn_error "ac_cv_func_nonposix_getpwuid_r must be set in cache file when cross-compiling." "$LINENO" 5 +fi + + if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then + +$as_echo "#define HAVE_NONPOSIX_GETPWUID_R 1" >>confdefs.h + + fi + fi + fi + if test "$ac_cv_header_grp_h" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix getgrgid_r" >&5 +$as_echo_n "checking for posix getgrgid_r... " >&6; } +if test "${ac_cv_func_posix_getgrgid_r+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = 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 "cannot run test program while cross compiling +See \`config.log' for more details." "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main () { + char buffer[10000]; + struct group grp, *grpptr = &grp; + int error; + errno = 0; + error = getgrgid_r (0, &grp, buffer, + sizeof (buffer), &grpptr); + return (error < 0 && errno == ENOSYS) + || error == ENOSYS; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_posix_getgrgid_r=yes +else + ac_cv_func_posix_getgrgid_r=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_posix_getgrgid_r" >&5 +$as_echo "$ac_cv_func_posix_getgrgid_r" >&6; } + if test "x${ac_cv_func_posix_getgrgid_r+set}" != "xset" ; then + as_fn_error "ac_cv_func_posix_getgrgid_r must be set in cache file when cross-compiling." "$LINENO" 5 +fi + + if test "$ac_cv_func_posix_getgrgid_r" = yes; then + +$as_echo "#define HAVE_POSIX_GETGRGID_R 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nonposix getgrgid_r" >&5 +$as_echo_n "checking for nonposix getgrgid_r... " >&6; } +if test "${ac_cv_func_nonposix_getgrgid_r+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char buffer[10000]; + struct group grp; + getgrgid_r (0, &grp, buffer, + sizeof (buffer)); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_nonposix_getgrgid_r=yes +else + ac_cv_func_nonposix_getgrgid_r=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_nonposix_getgrgid_r" >&5 +$as_echo "$ac_cv_func_nonposix_getgrgid_r" >&6; } + if test "x${ac_cv_func_nonposix_getgrgid_r+set}" != "xset" ; then + as_fn_error "ac_cv_func_nonposix_getgrgid_r must be set in cache file when cross-compiling." "$LINENO" 5 +fi + + if test "$ac_cv_func_nonposix_getgrgid_r" = yes; then + +$as_echo "#define HAVE_NONPOSIX_GETGRGID_R 1" >>confdefs.h + + fi + fi + fi + LIBS="$G_THREAD_LIBS $LIBS" + if test x"$have_threads" = xposix; then + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5 +$as_echo_n "checking size of pthread_t... " >&6; } +if test "${glib_cv_sizeof_system_thread+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # The cast to unsigned long 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. + if ac_fn_c_compute_int "$LINENO" "(long) (sizeof (pthread_t))" "glib_cv_sizeof_system_thread" "#include +"; then : + +else + as_fn_error "cannot compute sizeof (pthread_t), 77" "$LINENO" 5 +fi + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_sizeof_system_thread" >&5 +$as_echo "$glib_cv_sizeof_system_thread" >&6; } +cat >>confdefs.h <<_ACEOF +#define GLIB_SIZEOF_SYSTEM_THREAD $glib_cv_sizeof_system_thread +_ACEOF + + + # This is not AC_CHECK_FUNC to also work with function + # name mangling in header files. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_attr_setstacksize" >&5 +$as_echo_n "checking for pthread_attr_setstacksize... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_attr_t t; pthread_attr_setstacksize(&t,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_PTHREAD_ATTR_SETSTACKSIZE 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 minimal/maximal thread priority" >&5 +$as_echo_n "checking for minimal/maximal thread priority... " >&6; } + if test x"$posix_priority_min" = x; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + PX_PRIO_MIN +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "PX_PRIO_MIN" >/dev/null 2>&1; then : + +else + + posix_priority_min=PX_PRIO_MIN + posix_priority_max=PX_PRIO_MAX +fi +rm -f conftest* + + fi + if test x"$posix_priority_min" = x; then + # AIX + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + PTHREAD_PRIO_MIN +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "PTHREAD_PRIO_MIN" >/dev/null 2>&1; then : + +else + + posix_priority_min=PTHREAD_PRIO_MIN + posix_priority_max=PTHREAD_PRIO_MAX +fi +rm -f conftest* + + fi + if test x"$posix_priority_min" = x; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + PRI_OTHER_MIN +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "PRI_OTHER_MIN" >/dev/null 2>&1; then : + +else + + posix_priority_min=PRI_OTHER_MIN + posix_priority_max=PRI_OTHER_MAX +fi +rm -f conftest* + + fi + if test x"$posix_priority_min" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none found" >&5 +$as_echo "none found" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $POSIX_NO_PRIORITIES" >&5 +$as_echo "$as_me: WARNING: $POSIX_NO_PRIORITIES" >&2;} + posix_priority_min=-1 + posix_priority_max=-1 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $posix_priority_min/$posix_priority_max" >&5 +$as_echo "$posix_priority_min/$posix_priority_max" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_setschedparam" >&5 +$as_echo_n "checking for pthread_setschedparam... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_t t; pthread_setschedparam(t, 0, 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; } + +cat >>confdefs.h <<_ACEOF +#define POSIX_MIN_PRIORITY $posix_priority_min +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define POSIX_MAX_PRIORITY $posix_priority_max +_ACEOF + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $POSIX_NO_PRIORITIES" >&5 +$as_echo "$as_me: WARNING: $POSIX_NO_PRIORITIES" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + posix_yield_func=none + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix yield function" >&5 +$as_echo_n "checking for posix yield function... " >&6; } + for yield_func in sched_yield pthread_yield_np pthread_yield \ + thr_yield; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +$yield_func() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + posix_yield_func="$yield_func" + break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + if test x"$posix_yield_func" = xnone; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none found" >&5 +$as_echo "none found" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $POSIX_NO_YIELD" >&5 +$as_echo "$as_me: WARNING: $POSIX_NO_YIELD" >&2;} + posix_yield_func="g_usleep(1000)" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $posix_yield_func" >&5 +$as_echo "$posix_yield_func" >&6; } + posix_yield_func="$posix_yield_func()" + fi + +cat >>confdefs.h <<_ACEOF +#define POSIX_YIELD_FUNC $posix_yield_func +_ACEOF + + CPPFLAGS="$glib_save_CPPFLAGS" + + elif test x"$have_threads" = xwin32; then + # It's a pointer to a private struct + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct _GThreadData *" >&5 +$as_echo_n "checking size of struct _GThreadData *... " >&6; } +if test "${glib_cv_sizeof_system_thread+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # The cast to unsigned long 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. + if ac_fn_c_compute_int "$LINENO" "(long) (sizeof (struct _GThreadData *))" "glib_cv_sizeof_system_thread" "$ac_includes_default"; then : + +else + as_fn_error "cannot compute sizeof (struct _GThreadData *), 77" "$LINENO" 5 +fi + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_sizeof_system_thread" >&5 +$as_echo "$glib_cv_sizeof_system_thread" >&6; } +cat >>confdefs.h <<_ACEOF +#define GLIB_SIZEOF_SYSTEM_THREAD $glib_cv_sizeof_system_thread +_ACEOF + + + fi + + LIBS="$glib_save_LIBS" + + # now spit out all the warnings. + if test "$ac_cv_func_posix_getpwuid_r" != "yes" && + test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $FUNC_NO_GETPWUID_R" >&5 +$as_echo "$as_me: WARNING: $FUNC_NO_GETPWUID_R" >&2;} + fi + if test "$ac_cv_func_localtime_r" != "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $FUNC_NO_LOCALTIME_R" >&5 +$as_echo "$as_me: WARNING: $FUNC_NO_LOCALTIME_R" >&2;} + fi +fi + +if test x"$glib_cv_sizeof_system_thread" = x; then + # use a pointer as a fallback. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if test "${glib_cv_sizeof_system_thread+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # The cast to unsigned long 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. + if ac_fn_c_compute_int "$LINENO" "(long) (sizeof (void *))" "glib_cv_sizeof_system_thread" "$ac_includes_default"; then : + +else + as_fn_error "cannot compute sizeof (void *), 77" "$LINENO" 5 +fi + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_sizeof_system_thread" >&5 +$as_echo "$glib_cv_sizeof_system_thread" >&6; } +cat >>confdefs.h <<_ACEOF +#define GLIB_SIZEOF_SYSTEM_THREAD $glib_cv_sizeof_system_thread +_ACEOF + + +fi + +# +# Hack to deal with: +# +# a) GCC < 3.3 for Linux doesn't include -lpthread when +# building shared libraries with linux. +# b) FreeBSD doesn't do this either. +# +case $host in + *-*-freebsd*|*-*-linux*) + G_THREAD_LIBS_FOR_GTHREAD="`echo $G_THREAD_LIBS | sed s/-pthread/-lpthread/`" + ;; + *) + G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS" + ;; +esac + + if test "$have_threads" != "none"; then + HAVE_THREADS_TRUE= + HAVE_THREADS_FALSE='#' +else + HAVE_THREADS_TRUE='#' + HAVE_THREADS_FALSE= +fi + + +cat >>confdefs.h <<_ACEOF +#define G_THREAD_SOURCE "gthread-$have_threads.c" +_ACEOF + + + + + + +if test $mutex_has_default = yes ; then + glib_save_CPPFLAGS="$CPPFLAGS" + glib_save_LIBS="$LIBS" + LIBS="$G_THREAD_LIBS $LIBS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of $mutex_default_type" >&5 +$as_echo_n "checking size of $mutex_default_type... " >&6; } +if test "${glib_cv_sizeof_gmutex+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # The cast to unsigned long 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. + if ac_fn_c_compute_int "$LINENO" "(long) (sizeof ($mutex_default_type))" "glib_cv_sizeof_gmutex" "#include <$mutex_header_file> +"; then : + +else + as_fn_error "cannot compute sizeof ($mutex_default_type), 77" "$LINENO" 5 +fi + + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_sizeof_gmutex" >&5 +$as_echo "$glib_cv_sizeof_gmutex" >&6; } +cat >>confdefs.h <<_ACEOF +#define GLIB_SIZEOF_GMUTEX $glib_cv_sizeof_gmutex +_ACEOF + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking byte contents of $mutex_default_init" >&5 +$as_echo_n "checking byte contents of $mutex_default_init... " >&6; } +if test "${glib_cv_byte_contents_gmutex+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + glib_cv_byte_contents_gmutex=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$mutex_header_file> +main() +{ + static $mutex_default_type tv = $mutex_default_init; + char *p = (char*) &tv; + int i; + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + for (i = 0; i < $glib_cv_sizeof_gmutex; i++) + fprintf(f, "%s%d", i?",":"", *(p++)); + fprintf(f, "\n"); + exit(0); +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_byte_contents_gmutex=`cat conftestval` +else + glib_cv_byte_contents_gmutex=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: $glib_cv_byte_contents_gmutex" >&5 +$as_echo "$glib_cv_byte_contents_gmutex" >&6; } + +cat >>confdefs.h <<_ACEOF +#define GLIB_BYTE_CONTENTS_GMUTEX $glib_cv_byte_contents_gmutex +_ACEOF + + + if test x"$glib_cv_byte_contents_gmutex" = xno; then + mutex_has_default=no + fi + CPPFLAGS="$glib_save_CPPFLAGS" + LIBS="$glib_save_LIBS" +fi + +for ac_func in clock_gettime +do : + ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" +if test "x$ac_cv_func_clock_gettime" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETTIME 1 +_ACEOF + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 +$as_echo_n "checking for clock_gettime in -lrt... " >&6; } +if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $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 clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_gettime=yes +else + ac_cv_lib_rt_clock_gettime=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_rt_clock_gettime" >&5 +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } +if test "x$ac_cv_lib_rt_clock_gettime" = x""yes; then : + + $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + + G_THREAD_LIBS="$G_THREAD_LIBS -lrt" + G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS_FOR_GTHREAD -lrt" + +fi + + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for monotonic clocks" >&5 +$as_echo_n "checking for monotonic clocks... " >&6; } +if test "${glib_cv_monotonic_clock+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main() { +#if !(defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 && defined(CLOCK_MONOTONIC)) + #error No monotonic clock +#endif + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + glib_cv_monotonic_clock=yes +else + glib_cv_monotonic_clock=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_monotonic_clock" >&5 +$as_echo "$glib_cv_monotonic_clock" >&6; } +if test "$glib_cv_monotonic_clock" = "yes"; then + +$as_echo "#define HAVE_MONOTONIC_CLOCK 1" >>confdefs.h + +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use assembler code for atomic operations" >&5 +$as_echo_n "checking whether to use assembler code for atomic operations... " >&6; } + +glib_cv_gcc_has_builtin_atomic_operations=no +if test x"$GCC" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GCC supports build-in atomic intrinsics" >&5 +$as_echo_n "checking whether GCC supports build-in atomic intrinsics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +int i; + __sync_synchronize (); + __sync_bool_compare_and_swap (&i, 0, 1); + __sync_fetch_and_add (&i, 1); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + glib_cv_gcc_has_builtin_atomic_operations=yes +else + glib_cv_gcc_has_builtin_atomic_operations=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_gcc_has_builtin_atomic_operations" >&5 +$as_echo "$glib_cv_gcc_has_builtin_atomic_operations" >&6; } + if test $glib_cv_gcc_has_builtin_atomic_operations = yes; then + glib_memory_barrier_needed=yes + else + case $host_cpu in + i386) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } + glib_memory_barrier_needed=no + ;; + i?86) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: i486" >&5 +$as_echo "i486" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_I486 1 +_ACEOF + + glib_memory_barrier_needed=no + ;; + sparc*) + SPARCV9_WARNING="Try to rerun configure with CFLAGS='-mcpu=v9', + when you are using a sparc with v9 instruction set (most + sparcs nowadays). This will make the code for atomic + operations much faster. The resulting code will not run + on very old sparcs though." + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + main () + { + int tmp1, tmp2, tmp3; + __asm__ __volatile__("casx [%2], %0, %1" + : "=&r" (tmp1), "=&r" (tmp2) : "r" (&tmp3)); + } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: sparcv9" >&5 +$as_echo "sparcv9" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_SPARCV9 1 +_ACEOF + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $SPARCV9_WARNING" >&5 +$as_echo "$as_me: WARNING: $SPARCV9_WARNING" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + glib_memory_barrier_needed=yes + ;; + alpha*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: alpha" >&5 +$as_echo "alpha" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_ALPHA 1 +_ACEOF + + glib_memory_barrier_needed=yes + ;; + x86_64) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: x86_64" >&5 +$as_echo "x86_64" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_X86_64 1 +_ACEOF + + glib_memory_barrier_needed=no + ;; + powerpc*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: powerpc" >&5 +$as_echo "powerpc" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_POWERPC 1 +_ACEOF + + glib_memory_barrier_needed=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asm supports numbered local labels" >&5 +$as_echo_n "checking whether asm supports numbered local labels... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + __asm__ __volatile__ ("1: nop\n" + " bne- 1b") + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + +cat >>confdefs.h <<_ACEOF +#define ASM_NUMERIC_LABELS 1 +_ACEOF + + { $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 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ;; + ia64) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ia64" >&5 +$as_echo "ia64" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_IA64 1 +_ACEOF + + glib_memory_barrier_needed=yes + ;; + s390|s390x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: s390" >&5 +$as_echo "s390" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_S390 1 +_ACEOF + + glib_memory_barrier_needed=no + ;; + arm*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: arm" >&5 +$as_echo "arm" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_ARM 1 +_ACEOF + + glib_memory_barrier_needed=no + ;; + crisv32*|etraxfs*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: crisv32" >&5 +$as_echo "crisv32" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_CRISV32 1 +_ACEOF + + glib_memory_barrier_needed=no + ;; + cris*|etrax*) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cris" >&5 +$as_echo "cris" >&6; } + +cat >>confdefs.h <<_ACEOF +#define G_ATOMIC_CRIS 1 +_ACEOF + + glib_memory_barrier_needed=no + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } + glib_memory_barrier_needed=yes + ;; + esac + fi +else + if test $glib_native_win32 = yes; then + # For Windows but not using gcc. No barriers needed then either. + glib_memory_barrier_needed=no + fi +fi + + if test $glib_cv_gcc_has_builtin_atomic_operations = yes; then + HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE= + HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE='#' +else + HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE='#' + HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for futex(2) system call" >&5 +$as_echo_n "checking for futex(2) system call... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + /* it's not like this actually runs or anything... */ + syscall (SYS_futex, NULL, FUTEX_WAKE, FUTEX_WAIT); + 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_FUTEX test \"\$have_futex\" = \"yes\"" >>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 + + +glib_poll_includes=" +#include +#include +" + +if test $ac_cv_header_sys_types_h = yes && + test $ac_cv_header_sys_poll_h = yes ; then + glib_failed=false + { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLIN" >&5 +$as_echo_n "checking value of POLLIN... " >&6; } +if test "${glib_cv_value_POLLIN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "POLLIN" "glib_cv_value_POLLIN" "$glib_poll_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLIN" >&5 +$as_echo "$glib_cv_value_POLLIN" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLOUT" >&5 +$as_echo_n "checking value of POLLOUT... " >&6; } +if test "${glib_cv_value_POLLOUT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "POLLOUT" "glib_cv_value_POLLOUT" "$glib_poll_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLOUT" >&5 +$as_echo "$glib_cv_value_POLLOUT" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLPRI" >&5 +$as_echo_n "checking value of POLLPRI... " >&6; } +if test "${glib_cv_value_POLLPRI+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "POLLPRI" "glib_cv_value_POLLPRI" "$glib_poll_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLPRI" >&5 +$as_echo "$glib_cv_value_POLLPRI" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLERR" >&5 +$as_echo_n "checking value of POLLERR... " >&6; } +if test "${glib_cv_value_POLLERR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "POLLERR" "glib_cv_value_POLLERR" "$glib_poll_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLERR" >&5 +$as_echo "$glib_cv_value_POLLERR" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLHUP" >&5 +$as_echo_n "checking value of POLLHUP... " >&6; } +if test "${glib_cv_value_POLLHUP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "POLLHUP" "glib_cv_value_POLLHUP" "$glib_poll_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLHUP" >&5 +$as_echo "$glib_cv_value_POLLHUP" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking value of POLLNVAL" >&5 +$as_echo_n "checking value of POLLNVAL... " >&6; } +if test "${glib_cv_value_POLLNVAL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "POLLNVAL" "glib_cv_value_POLLNVAL" "$glib_poll_includes"; then : + +else + glib_failed=true +fi + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_value_POLLNVAL" >&5 +$as_echo "$glib_cv_value_POLLNVAL" >&6; } + + if $glib_failed ; then + as_fn_error "Could not determine values for POLL* constants" "$LINENO" 5 + fi +else + glib_cv_value_POLLIN=1 + glib_cv_value_POLLOUT=4 + glib_cv_value_POLLPRI=2 + glib_cv_value_POLLERR=8 + glib_cv_value_POLLHUP=16 + glib_cv_value_POLLNVAL=32 +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll" >&5 +$as_echo_n "checking for broken poll... " >&6; } +if test "$cross_compiling" = yes; then : + broken_poll="no (cross compiling)" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #ifdef HAVE_SYS_POLL_H + #include + #endif + int main(void) { + struct pollfd fds[1]; + int fd; + fd = open("/dev/null", 1); + fds[0].fd = fd; + fds[0].events = POLLIN; + fds[0].revents = 0; + if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) { + exit(1); /* Does not work for devices -- fail */ + } + exit(0); + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + broken_poll=no +else + broken_poll=yes + +$as_echo "#define BROKEN_POLL 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $broken_poll" >&5 +$as_echo "$broken_poll" >&6; } + +PCRE_REQUIRED_VERSION=7.2 + +# Check if we should compile GRegex +# Check whether --enable-regex was given. +if test "${enable_regex+set}" = set; then : + enableval=$enable_regex; case "${enableval}" in + yes) enable_regex=true ;; + no) enable_regex=false ;; + *) as_fn_error "bad value ${enableval} for --enable-regex" "$LINENO" 5 ;; +esac +else + enable_regex=true +fi + + + if $enable_regex; then + ENABLE_REGEX_TRUE= + ENABLE_REGEX_FALSE='#' +else + ENABLE_REGEX_TRUE='#' + ENABLE_REGEX_FALSE= +fi + + +if test x$enable_regex = xtrue; then + +$as_echo "#define ENABLE_REGEX /**/" >>confdefs.h + + # Check if we should use the internal or the system-supplied pcre + +# Check whether --with-pcre was given. +if test "${with_pcre+set}" = set; then : + withval=$with_pcre; +fi + + + if test "x$with_pcre" = xsystem; then + USE_SYSTEM_PCRE_TRUE= + USE_SYSTEM_PCRE_FALSE='#' +else + USE_SYSTEM_PCRE_TRUE='#' + USE_SYSTEM_PCRE_FALSE= +fi + + + if test "x$with_pcre" = xsystem; then + + +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 test "${ac_cv_path_PKG_CONFIG+set}" = set; 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 test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; 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 + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCRE" >&5 +$as_echo_n "checking for PCRE... " >&6; } + +if test -n "$PCRE_CFLAGS"; then + pkg_cv_PCRE_CFLAGS="$PCRE_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre >= \$PCRE_REQUIRED_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libpcre >= $PCRE_REQUIRED_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PCRE_CFLAGS=`$PKG_CONFIG --cflags "libpcre >= $PCRE_REQUIRED_VERSION" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$PCRE_LIBS"; then + pkg_cv_PCRE_LIBS="$PCRE_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre >= \$PCRE_REQUIRED_VERSION\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libpcre >= $PCRE_REQUIRED_VERSION") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PCRE_LIBS=`$PKG_CONFIG --libs "libpcre >= $PCRE_REQUIRED_VERSION" 2>/dev/null` +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +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 + PCRE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libpcre >= $PCRE_REQUIRED_VERSION" 2>&1` + else + PCRE_PKG_ERRORS=`$PKG_CONFIG --print-errors "libpcre >= $PCRE_REQUIRED_VERSION" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$PCRE_PKG_ERRORS" >&5 + + as_fn_error "Package requirements (libpcre >= $PCRE_REQUIRED_VERSION) were not met: + +$PCRE_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 PCRE_CFLAGS +and PCRE_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}: 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 PCRE_CFLAGS +and PCRE_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 + PCRE_CFLAGS=$pkg_cv_PCRE_CFLAGS + PCRE_LIBS=$pkg_cv_PCRE_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + : +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Unicode support in PCRE" >&5 +$as_echo_n "checking for Unicode support in PCRE... " >&6; } +if test "${glib_cv_pcre_has_unicode+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + glib_save_CFLAGS="$CFLAGS" + glib_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PCRE_CFLAGS" LIBS="$PCRE_LIBS" + if test "$cross_compiling" = yes; then : + glib_cv_pcre_has_unicode=yes +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + int main () { + int support; + pcre_config (PCRE_CONFIG_UTF8, &support); + if (!support) + return 1; + pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &support); + if (!support) + return 1; + return 0; + } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + glib_cv_pcre_has_unicode=yes +else + glib_cv_pcre_has_unicode=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + CFLAGS="$glib_save_CFLAGS" + LIBS="$glib_save_LIBS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glib_cv_pcre_has_unicode" >&5 +$as_echo "$glib_cv_pcre_has_unicode" >&6; } + if test "$glib_cv_pcre_has_unicode" = "no"; then + as_fn_error "*** The system-supplied PCRE does not support Unicode properties or UTF-8." "$LINENO" 5 + fi + + + +$as_echo "#define USE_SYSTEM_PCRE /**/" >>confdefs.h + + PCRE_REQUIRES=libpcre + + else + # If using gcc 4 pass -Wno-pointer-sign when compiling the internal PCRE + if test x"$GCC" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler understands -Wno-pointer-sign" >&5 +$as_echo_n "checking whether compiler understands -Wno-pointer-sign... " >&6; } + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wno-pointer-sign" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + PCRE_WARN_CFLAGS="$PCRE_WARN_CFLAGS -Wno-pointer-sign" + { $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 +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + fi + fi + +else + if false]; then + USE_SYSTEM_PCRE_TRUE= + USE_SYSTEM_PCRE_FALSE='#' +else + USE_SYSTEM_PCRE_TRUE='#' + USE_SYSTEM_PCRE_FALSE= +fi + +fi + + +case $host in + *-*-cygwin*) + G_LIBS_EXTRA="-luser32 -lkernel32" + ;; + *-*-mingw*) + G_LIBS_EXTRA="-lws2_32 -lole32" + ;; + *) + G_LIBS_EXTRA="" + ;; +esac + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EILSEQ" >&5 +$as_echo_n "checking for EILSEQ... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ + +int error = EILSEQ; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + have_eilseq=yes +else + have_eilseq=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext; +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_eilseq" >&5 +$as_echo "$have_eilseq" >&6; } + + + if test $cross_compiling = yes; then + CROSS_COMPILING_TRUE= + CROSS_COMPILING_FALSE='#' +else + CROSS_COMPILING_TRUE='#' + CROSS_COMPILING_FALSE= +fi + + +if test $cross_compiling = yes; then + # Extract the first word of "glib-genmarshal", so it can be a program name with args. +set dummy glib-genmarshal; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_GLIB_GENMARSHAL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $GLIB_GENMARSHAL in + [\\/]* | ?:[\\/]*) + ac_cv_path_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # 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_GLIB_GENMARSHAL="$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_GLIB_GENMARSHAL" && ac_cv_path_GLIB_GENMARSHAL="no" + ;; +esac +fi +GLIB_GENMARSHAL=$ac_cv_path_GLIB_GENMARSHAL +if test -n "$GLIB_GENMARSHAL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5 +$as_echo "$GLIB_GENMARSHAL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x$GLIB_GENMARSHAL = xno; then + as_fn_error "Could not find a glib-genmarshal in your PATH" "$LINENO" 5 + 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 test "${ac_cv_path_GTKDOC_CHECK+set}" = set; 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 test "${ac_cv_path_GTKDOC_REBASE+set}" = set; 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 test "${ac_cv_path_GTKDOC_MKPDF+set}" = set; 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.11\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.11") 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.11 installed to build $PACKAGE_NAME" "$LINENO" 5 +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 + + + +# Check whether --enable-man was given. +if test "${enable_man+set}" = set; then : + enableval=$enable_man; enable_man=yes +else + enable_man=no +fi + + +if test "${enable_man}" != no; then +# Extract the first word of "xsltproc", so it can be a program name with args. +set dummy xsltproc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XSLTPROC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $XSLTPROC in + [\\/]* | ?:[\\/]*) + ac_cv_path_XSLTPROC="$XSLTPROC" # 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_XSLTPROC="$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 +XSLTPROC=$ac_cv_path_XSLTPROC +if test -n "$XSLTPROC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 +$as_echo "$XSLTPROC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test -z "$XSLTPROC"; then + enable_man=no + fi + + + # check for the presence of the XML catalog + +# Check whether --with-xml-catalog was given. +if test "${with_xml_catalog+set}" = set; then : + withval=$with_xml_catalog; +else + with_xml_catalog=/etc/xml/catalog +fi + + jh_found_xmlcatalog=true + XML_CATALOG_FILE="$with_xml_catalog" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML catalog ($XML_CATALOG_FILE)" >&5 +$as_echo_n "checking for XML catalog ($XML_CATALOG_FILE)... " >&6; } + if test -f "$XML_CATALOG_FILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + else + jh_found_xmlcatalog=false + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + fi + + # check for the xmlcatalog program + # Extract the first word of "xmlcatalog", so it can be a program name with args. +set dummy xmlcatalog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XMLCATALOG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $XMLCATALOG in + [\\/]* | ?:[\\/]*) + ac_cv_path_XMLCATALOG="$XMLCATALOG" # 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_XMLCATALOG="$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_XMLCATALOG" && ac_cv_path_XMLCATALOG="no" + ;; +esac +fi +XMLCATALOG=$ac_cv_path_XMLCATALOG +if test -n "$XMLCATALOG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLCATALOG" >&5 +$as_echo "$XMLCATALOG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$XMLCATALOG" = xno; then + jh_found_xmlcatalog=false + fi + + if $jh_found_xmlcatalog; then + : + else + : + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DocBook XML DTD V4.1.2 in XML catalog" >&5 +$as_echo_n "checking for DocBook XML DTD V4.1.2 in XML catalog... " >&6; } + if $jh_found_xmlcatalog && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$XMLCATALOG --noout \"\$XML_CATALOG_FILE\" \"-//OASIS//DTD DocBook XML V4.1.2//EN\" >&2"; } >&5 + ($XMLCATALOG --noout "$XML_CATALOG_FILE" "-//OASIS//DTD DocBook XML V4.1.2//EN" >&2) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + enable_man=no + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DocBook XSL Stylesheets in XML catalog" >&5 +$as_echo_n "checking for DocBook XSL Stylesheets in XML catalog... " >&6; } + if $jh_found_xmlcatalog && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$XMLCATALOG --noout \"\$XML_CATALOG_FILE\" \"http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl\" >&2"; } >&5 + ($XMLCATALOG --noout "$XML_CATALOG_FILE" "http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl" >&2) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + enable_man=no + fi + +fi + + if test x$enable_man != xno; then + ENABLE_MAN_TRUE= + ENABLE_MAN_FALSE='#' +else + ENABLE_MAN_TRUE='#' + ENABLE_MAN_FALSE= +fi + + + +ac_config_commands="$ac_config_commands glibconfig.h" + + +ac_config_files="$ac_config_files glib-2.0.pc glib-2.0-uninstalled.pc gmodule-2.0.pc gmodule-export-2.0.pc gmodule-no-export-2.0.pc gmodule-2.0-uninstalled.pc gmodule-no-export-2.0-uninstalled.pc gthread-2.0.pc gthread-2.0-uninstalled.pc gobject-2.0.pc gobject-2.0-uninstalled.pc gio-2.0.pc gio-unix-2.0.pc gio-2.0-uninstalled.pc gio-unix-2.0-uninstalled.pc glib-zip glib-gettextize Makefile build/Makefile build/win32/Makefile build/win32/dirent/Makefile build/win32/vs9/Makefile glib/Makefile glib/libcharset/Makefile glib/gnulib/Makefile glib/pcre/Makefile glib/update-pcre/Makefile glib/tests/Makefile gmodule/Makefile gmodule/gmoduleconf.h gobject/Makefile gobject/glib-mkenums gobject/tests/Makefile gthread/Makefile gthread/tests/Makefile gio/Makefile gio/xdgmime/Makefile gio/inotify/Makefile gio/libasyncns/Makefile gio/fen/Makefile gio/fam/Makefile gio/win32/Makefile gio/tests/Makefile po/Makefile.in docs/Makefile docs/reference/Makefile docs/reference/glib/Makefile docs/reference/glib/version.xml docs/reference/gobject/Makefile docs/reference/gobject/version.xml docs/reference/gio/Makefile docs/reference/gio/version.xml tests/Makefile tests/gobject/Makefile tests/refcount/Makefile m4macros/Makefile" + + +ac_config_commands="$ac_config_commands chmod-scripts" + + +# we want to invoke this macro solely so that the config.status script +# and automake generated makefiles know about these generated files. +# They are only needed to distcheck the package +if false; then + ac_config_files="$ac_config_files INSTALL README config.h.win32 glibconfig.h.win32 glib/makefile.msc glib/glib.rc gmodule/makefile.msc gmodule/gmodule.rc gobject/makefile.msc gobject/gobject.rc gthread/makefile.msc gthread/gthread.rc gio/gio.rc tests/makefile.msc" + +fi + +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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + 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= +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 "${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 "${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 "${OS_UNIX_TRUE}" && test -z "${OS_UNIX_FALSE}"; then + as_fn_error "conditional \"OS_UNIX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_LINUX_TRUE}" && test -z "${OS_LINUX_FALSE}"; then + as_fn_error "conditional \"OS_LINUX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_CARBON_TRUE}" && test -z "${OS_CARBON_FALSE}"; then + as_fn_error "conditional \"OS_CARBON\" 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 "${HAVE_GLIB_RUNTIME_LIBDIR_TRUE}" && test -z "${HAVE_GLIB_RUNTIME_LIBDIR_FALSE}"; then + as_fn_error "conditional \"HAVE_GLIB_RUNTIME_LIBDIR\" 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__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_CXX_TRUE}" && test -z "${HAVE_CXX_FALSE}"; then + as_fn_error "conditional \"HAVE_CXX\" 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__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OS_WIN32_AND_DLL_COMPILATION_TRUE}" && test -z "${OS_WIN32_AND_DLL_COMPILATION_FALSE}"; then + as_fn_error "conditional \"OS_WIN32_AND_DLL_COMPILATION\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GNUC_VISIBILITY_TRUE}" && test -z "${HAVE_GNUC_VISIBILITY_FALSE}"; then + as_fn_error "conditional \"HAVE_GNUC_VISIBILITY\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SUNSTUDIO_VISIBILITY_TRUE}" && test -z "${HAVE_SUNSTUDIO_VISIBILITY_FALSE}"; then + as_fn_error "conditional \"HAVE_SUNSTUDIO_VISIBILITY\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +if test -z "${HAVE_GOOD_PRINTF_TRUE}" && test -z "${HAVE_GOOD_PRINTF_FALSE}"; then + as_fn_error "conditional \"HAVE_GOOD_PRINTF\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_INOTIFY_TRUE}" && test -z "${HAVE_INOTIFY_FALSE}"; then + as_fn_error "conditional \"HAVE_INOTIFY\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_FEN_TRUE}" && test -z "${HAVE_FEN_FALSE}"; then + as_fn_error "conditional \"HAVE_FEN\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_FAM_TRUE}" && test -z "${HAVE_FAM_FALSE}"; then + as_fn_error "conditional \"HAVE_FAM\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_TIMELOOP_TRUE}" && test -z "${ENABLE_TIMELOOP_FALSE}"; then + as_fn_error "conditional \"ENABLE_TIMELOOP\" 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 "${HAVE_THREADS_TRUE}" && test -z "${HAVE_THREADS_FALSE}"; then + as_fn_error "conditional \"HAVE_THREADS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE}" && test -z "${HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE}"; then + as_fn_error "conditional \"HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${ENABLE_REGEX_TRUE}" && test -z "${ENABLE_REGEX_FALSE}"; then + as_fn_error "conditional \"ENABLE_REGEX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SYSTEM_PCRE_TRUE}" && test -z "${USE_SYSTEM_PCRE_FALSE}"; then + as_fn_error "conditional \"USE_SYSTEM_PCRE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${USE_SYSTEM_PCRE_TRUE}" && test -z "${USE_SYSTEM_PCRE_FALSE}"; then + as_fn_error "conditional \"USE_SYSTEM_PCRE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then + as_fn_error "conditional \"CROSS_COMPILING\" 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 "${ENABLE_MAN_TRUE}" && test -z "${ENABLE_MAN_FALSE}"; then + as_fn_error "conditional \"ENABLE_MAN\" 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. +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 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=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&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 glib $as_me 2.24.0, which was +generated by GNU Autoconf 2.65. 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="\\ +glib config.status 2.24.0 +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 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=$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"` ;; + 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' +enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' +AS='`$ECHO "X$AS" | $Xsed -e "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "X$DLLTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' +macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' +macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' +pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' +host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' +host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' +host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' +build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' +build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' +build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' +SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' +Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' +GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' +EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' +FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' +LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' +NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' +LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' +ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' +exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' +lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' +reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' +AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' +STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' +RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' +compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' +GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' +SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' +ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' +need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' +LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' +libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' +need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' +version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' +runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' +libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' +soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' +finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' +old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' +striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' +predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' +postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +AR \ +AR_FLAGS \ +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 \ +SHELL \ +ECHO \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_wl \ +lt_prog_compiler_pic \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +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_flag_spec_ld \ +hardcode_libdir_separator \ +fix_srcfile_path \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_flag_spec_ld_CXX \ +hardcode_libdir_separator_CXX \ +fix_srcfile_path_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$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 \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX; do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` + ;; +esac + +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' + + + + +# Note that if two cases are the same, case goes with the first one. +# Note also that this is inside an AC_OUTPUT_COMMAND. We do not depend +# on variable expansion in case labels. Look at the generated config.status +# for a hint. + +if test "x${ac_cv_working_alloca_h+set}" = xset ; then + glib_header_alloca_h="$ac_cv_working_alloca_h" +else + glib_header_alloca_h="$ac_cv_header_alloca_h" +fi + +case xyes in +x$ac_cv_header_float_h) + glib_float_h=yes + glib_mf=FLT_MIN glib_Mf=FLT_MAX + glib_md=DBL_MIN glib_Md=DBL_MAX + ;; +x$ac_cv_header_values_h) + glib_values_h=yes + glib_mf=MINFLOAT glib_Mf=MAXFLOAT + glib_md=MINDOUBLE glib_Md=MAXDOUBLE + ;; +esac + +case xyes in +x$ac_cv_header_limits_h) + glib_limits_h=yes + glib_ms=SHRT_MIN glib_Ms=SHRT_MAX glib_Mus=USHRT_MAX + glib_mi=INT_MIN glib_Mi=INT_MAX glib_Mui=UINT_MAX + glib_ml=LONG_MIN glib_Ml=LONG_MAX glib_Mul=ULONG_MAX + ;; +x$ac_cv_header_values_h) + glib_values_h=yes + glib_ms=MINSHORT glib_Ms=MAXSHORT glib_Mus="(((gushort)G_MAXSHORT)*2+1)" + glib_mi=MININT glib_Mi=MAXINT glib_Mui="(((guint)G_MAXINT)*2+1)" + glib_ml=MINLONG glib_Ml=MAXLONG glib_Mul="(((gulong)G_MAXLONG)*2+1)" + ;; +esac + +if test x$ac_cv_header_sys_poll_h = xyes ; then + glib_sys_poll_h=yes +fi + +if test x$enable_included_printf = xyes ; then + glib_included_printf=yes +fi + +case 2 in +$ac_cv_sizeof_short) + gint16=short + gint16_modifier='"h"' + gint16_format='"hi"' + guint16_format='"hu"' + ;; +$ac_cv_sizeof_int) + gint16=int + gint16_modifier='""' + gint16_format='"i"' + guint16_format='"u"' + ;; +esac +case 4 in +$ac_cv_sizeof_short) + gint32=short + gint32_modifier='"h"' + gint32_format='"hi"' + guint32_format='"hu"' + ;; +$ac_cv_sizeof_int) + gint32=int + gint32_modifier='""' + gint32_format='"i"' + guint32_format='"u"' + ;; +$ac_cv_sizeof_long) + gint32=long + gint32_modifier='"l"' + gint32_format='"li"' + guint32_format='"lu"' + ;; +esac +case 8 in +$ac_cv_sizeof_int) + gint64=int + gint64_modifier='""' + gint64_format='"i"' + guint64_format='"u"' + glib_extension= + gint64_constant='(val)' + guint64_constant='(val)' + ;; +$ac_cv_sizeof_long) + gint64=long + gint64_modifier='"l"' + gint64_format='"li"' + guint64_format='"lu"' + glib_extension= + gint64_constant='(val##L)' + guint64_constant='(val##UL)' + ;; +$ac_cv_sizeof_long_long) + gint64='long long' + if test -n "$glib_cv_long_long_format"; then + gint64_modifier='"'$glib_cv_long_long_format'"' + gint64_format='"'$glib_cv_long_long_format'i"' + guint64_format='"'$glib_cv_long_long_format'u"' + fi + glib_extension='G_GNUC_EXTENSION ' + gint64_constant='(G_GNUC_EXTENSION (val##LL))' + guint64_constant='(G_GNUC_EXTENSION (val##ULL))' + ;; +$ac_cv_sizeof___int64) + gint64='__int64' + if test -n "$glib_cv_long_long_format"; then + gint64_modifier='"'$glib_cv_long_long_format'"' + gint64_format='"'$glib_cv_long_long_format'i"' + guint64_format='"'$glib_cv_long_long_format'u"' + fi + glib_extension= + gint64_constant='(val##i64)' + guint64_constant='(val##ui64)' + ;; +esac +glib_size_t=$ac_cv_sizeof_size_t +glib_size_type_define="$glib_size_type" +glib_void_p=$ac_cv_sizeof_void_p +glib_long=$ac_cv_sizeof_long + +case "$glib_size_type" in +short) + gsize_modifier='"h"' + gsize_format='"hu"' + gssize_format='"hi"' + glib_msize_type='SHRT' + ;; +int) + gsize_modifier='""' + gsize_format='"u"' + gssize_format='"i"' + glib_msize_type='INT' + ;; +long) + gsize_modifier='"l"' + gsize_format='"lu"' + gssize_format='"li"' + glib_msize_type='LONG' + ;; +"long long"|__int64) + gsize_modifier='"I64"' + gsize_format='"I64u"' + gssize_format='"I64i"' + glib_msize_type='INT64' + ;; +esac + +gintbits=`expr $ac_cv_sizeof_int \* 8` +glongbits=`expr $ac_cv_sizeof_long \* 8` +gsizebits=`expr $ac_cv_sizeof_size_t \* 8` + +case $ac_cv_sizeof_void_p in +$ac_cv_sizeof_int) + glib_intptr_type_define=int + gintptr_modifier='""' + gintptr_format='"i"' + guintptr_format='"u"' + glib_gpi_cast='' + glib_gpui_cast='' + ;; +$ac_cv_sizeof_long) + glib_intptr_type_define=long + gintptr_modifier='"l"' + gintptr_format='"li"' + guintptr_format='"lu"' + glib_gpi_cast='(glong)' + glib_gpui_cast='(gulong)' + ;; +$ac_cv_sizeof_long_long) + glib_intptr_type_define='long long' + gintptr_modifier='"I64"' + gintptr_format='"I64i"' + guintptr_format='"I64u"' + glib_gpi_cast='(gint64)' + glib_gpui_cast='(guint64)' + ;; +$ac_cv_sizeof___int64) + glib_intptr_type_define=__int64 + gintptr_modifier='"I64"' + gintptr_format='"I64i"' + guintptr_format='"I64u"' + glib_gpi_cast='(gint64)' + glib_gpui_cast='(guint64)' + ;; +*) + glib_unknown_void_p=yes + ;; +esac + + +case xyes in +x$ac_cv_func_atexit) + glib_atexit=" +#ifdef NeXT /* @#%@! NeXTStep */ +# define g_ATEXIT(proc) (!atexit (proc)) +#else +# define g_ATEXIT(proc) (atexit (proc)) +#endif" + ;; +x$ac_cv_func_on_exit) + glib_atexit=" +#define g_ATEXIT(proc) (on_exit ((void (*)(int, void*))(proc), NULL))" + ;; +esac + +case xyes in +x$ac_cv_func_memmove) + glib_memmove=' +#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END' + ;; +x$glib_cv_working_bcopy) + glib_memmove=" +/* memmove isn't available, but bcopy can copy overlapping memory regions */ +#define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END" + ;; +*) + glib_memmove=" +/* memmove isn't found and bcopy can't copy overlapping memory regions, + * so we have to roll our own copy routine. */ +void g_memmove (void* dest, const void * src, unsigned long len);" + ;; +esac + +glib_defines=" +#define GLIB_MAJOR_VERSION $GLIB_MAJOR_VERSION +#define GLIB_MINOR_VERSION $GLIB_MINOR_VERSION +#define GLIB_MICRO_VERSION $GLIB_MICRO_VERSION +" + +case xyes in +x$glib_cv_va_copy) glib_vacopy='#define G_VA_COPY va_copy' ;; +x$glib_cv___va_copy) glib_vacopy='#define G_VA_COPY __va_copy' ;; +*) glib_vacopy='' +esac + +if test x$glib_cv_va_val_copy = xno; then + glib_vacopy="\$glib_vacopy +#define G_VA_COPY_AS_ARRAY 1" +fi + +if test x$glib_cv_hasinline = xyes; then + glib_inline='#define G_HAVE_INLINE 1' +fi +if test x$glib_cv_has__inline = xyes; then + glib_inline="\$glib_inline +#define G_HAVE___INLINE 1" +fi +if test x$glib_cv_has__inline__ = xyes; then + glib_inline="\$glib_inline +#define G_HAVE___INLINE__ 1" +fi + +g_have_gnuc_varargs=$g_have_gnuc_varargs +g_have_iso_c_varargs=$g_have_iso_c_varargs +g_have_iso_cxx_varargs=$g_have_iso_cxx_varargs + +g_can_inline=$g_can_inline +g_have_gnuc_visibility=$g_have_gnuc_visibility +g_have_sunstudio_visibility=$g_have_sunstudio_visibility + +if test x$ac_cv_c_bigendian = xyes; then + g_byte_order=G_BIG_ENDIAN + g_bs_native=BE + g_bs_alien=LE +else + g_byte_order=G_LITTLE_ENDIAN + g_bs_native=LE + g_bs_alien=BE +fi + +g_pollin=$glib_cv_value_POLLIN +g_pollout=$glib_cv_value_POLLOUT +g_pollpri=$glib_cv_value_POLLPRI +g_pollhup=$glib_cv_value_POLLHUP +g_pollerr=$glib_cv_value_POLLERR +g_pollnval=$glib_cv_value_POLLNVAL + +g_af_unix=$glib_cv_value_AF_UNIX +g_af_inet=$glib_cv_value_AF_INET +g_af_inet6=$glib_cv_value_AF_INET6 + +g_msg_peek=$glib_cv_value_MSG_PEEK +g_msg_oob=$glib_cv_value_MSG_OOB +g_msg_dontroute=$glib_cv_value_MSG_DONTROUTE + +g_stack_grows=$glib_cv_stack_grows + +g_have_eilseq=$have_eilseq + +case x$have_threads in +xno) g_enable_threads_def="#undef";; +*) g_enable_threads_def="#define";; +esac + +g_threads_impl_def=$g_threads_impl + +g_mutex_has_default="$mutex_has_default" +g_mutex_sizeof="$glib_cv_sizeof_gmutex" +g_system_thread_sizeof="$glib_cv_sizeof_system_thread" +g_mutex_contents="$glib_cv_byte_contents_gmutex" + +g_memory_barrier_needed="$glib_memory_barrier_needed" + +g_module_suffix="$glib_gmodule_suffix" + +g_pid_type="$glib_pid_type" +case $host in + *-*-beos*) + glib_os="#define G_OS_BEOS" + ;; + *-*-cygwin*) + glib_os="#define G_OS_UNIX +#define G_PLATFORM_WIN32 +#define G_WITH_CYGWIN" + ;; + *-*-mingw*) + glib_os="#define G_OS_WIN32 +#define G_PLATFORM_WIN32" + ;; + *) + glib_os="#define G_OS_UNIX" + ;; +esac +glib_static_compilation="" +if test x$glib_win32_static_compilation = xyes; then + glib_static_compilation="#define GLIB_STATIC_COMPILATION 1 +#define GOBJECT_STATIC_COMPILATION 1" +fi + + +_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" ;; + "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "glibconfig.h") CONFIG_COMMANDS="$CONFIG_COMMANDS glibconfig.h" ;; + "glib-2.0.pc") CONFIG_FILES="$CONFIG_FILES glib-2.0.pc" ;; + "glib-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES glib-2.0-uninstalled.pc" ;; + "gmodule-2.0.pc") CONFIG_FILES="$CONFIG_FILES gmodule-2.0.pc" ;; + "gmodule-export-2.0.pc") CONFIG_FILES="$CONFIG_FILES gmodule-export-2.0.pc" ;; + "gmodule-no-export-2.0.pc") CONFIG_FILES="$CONFIG_FILES gmodule-no-export-2.0.pc" ;; + "gmodule-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gmodule-2.0-uninstalled.pc" ;; + "gmodule-no-export-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gmodule-no-export-2.0-uninstalled.pc" ;; + "gthread-2.0.pc") CONFIG_FILES="$CONFIG_FILES gthread-2.0.pc" ;; + "gthread-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gthread-2.0-uninstalled.pc" ;; + "gobject-2.0.pc") CONFIG_FILES="$CONFIG_FILES gobject-2.0.pc" ;; + "gobject-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gobject-2.0-uninstalled.pc" ;; + "gio-2.0.pc") CONFIG_FILES="$CONFIG_FILES gio-2.0.pc" ;; + "gio-unix-2.0.pc") CONFIG_FILES="$CONFIG_FILES gio-unix-2.0.pc" ;; + "gio-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gio-2.0-uninstalled.pc" ;; + "gio-unix-2.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gio-unix-2.0-uninstalled.pc" ;; + "glib-zip") CONFIG_FILES="$CONFIG_FILES glib-zip" ;; + "glib-gettextize") CONFIG_FILES="$CONFIG_FILES glib-gettextize" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "build/Makefile") CONFIG_FILES="$CONFIG_FILES build/Makefile" ;; + "build/win32/Makefile") CONFIG_FILES="$CONFIG_FILES build/win32/Makefile" ;; + "build/win32/dirent/Makefile") CONFIG_FILES="$CONFIG_FILES build/win32/dirent/Makefile" ;; + "build/win32/vs9/Makefile") CONFIG_FILES="$CONFIG_FILES build/win32/vs9/Makefile" ;; + "glib/Makefile") CONFIG_FILES="$CONFIG_FILES glib/Makefile" ;; + "glib/libcharset/Makefile") CONFIG_FILES="$CONFIG_FILES glib/libcharset/Makefile" ;; + "glib/gnulib/Makefile") CONFIG_FILES="$CONFIG_FILES glib/gnulib/Makefile" ;; + "glib/pcre/Makefile") CONFIG_FILES="$CONFIG_FILES glib/pcre/Makefile" ;; + "glib/update-pcre/Makefile") CONFIG_FILES="$CONFIG_FILES glib/update-pcre/Makefile" ;; + "glib/tests/Makefile") CONFIG_FILES="$CONFIG_FILES glib/tests/Makefile" ;; + "gmodule/Makefile") CONFIG_FILES="$CONFIG_FILES gmodule/Makefile" ;; + "gmodule/gmoduleconf.h") CONFIG_FILES="$CONFIG_FILES gmodule/gmoduleconf.h" ;; + "gobject/Makefile") CONFIG_FILES="$CONFIG_FILES gobject/Makefile" ;; + "gobject/glib-mkenums") CONFIG_FILES="$CONFIG_FILES gobject/glib-mkenums" ;; + "gobject/tests/Makefile") CONFIG_FILES="$CONFIG_FILES gobject/tests/Makefile" ;; + "gthread/Makefile") CONFIG_FILES="$CONFIG_FILES gthread/Makefile" ;; + "gthread/tests/Makefile") CONFIG_FILES="$CONFIG_FILES gthread/tests/Makefile" ;; + "gio/Makefile") CONFIG_FILES="$CONFIG_FILES gio/Makefile" ;; + "gio/xdgmime/Makefile") CONFIG_FILES="$CONFIG_FILES gio/xdgmime/Makefile" ;; + "gio/inotify/Makefile") CONFIG_FILES="$CONFIG_FILES gio/inotify/Makefile" ;; + "gio/libasyncns/Makefile") CONFIG_FILES="$CONFIG_FILES gio/libasyncns/Makefile" ;; + "gio/fen/Makefile") CONFIG_FILES="$CONFIG_FILES gio/fen/Makefile" ;; + "gio/fam/Makefile") CONFIG_FILES="$CONFIG_FILES gio/fam/Makefile" ;; + "gio/win32/Makefile") CONFIG_FILES="$CONFIG_FILES gio/win32/Makefile" ;; + "gio/tests/Makefile") CONFIG_FILES="$CONFIG_FILES gio/tests/Makefile" ;; + "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; + "docs/reference/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/Makefile" ;; + "docs/reference/glib/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/glib/Makefile" ;; + "docs/reference/glib/version.xml") CONFIG_FILES="$CONFIG_FILES docs/reference/glib/version.xml" ;; + "docs/reference/gobject/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/gobject/Makefile" ;; + "docs/reference/gobject/version.xml") CONFIG_FILES="$CONFIG_FILES docs/reference/gobject/version.xml" ;; + "docs/reference/gio/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/gio/Makefile" ;; + "docs/reference/gio/version.xml") CONFIG_FILES="$CONFIG_FILES docs/reference/gio/version.xml" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/gobject/Makefile") CONFIG_FILES="$CONFIG_FILES tests/gobject/Makefile" ;; + "tests/refcount/Makefile") CONFIG_FILES="$CONFIG_FILES tests/refcount/Makefile" ;; + "m4macros/Makefile") CONFIG_FILES="$CONFIG_FILES m4macros/Makefile" ;; + "chmod-scripts") CONFIG_COMMANDS="$CONFIG_COMMANDS chmod-scripts" ;; + "INSTALL") CONFIG_FILES="$CONFIG_FILES INSTALL" ;; + "README") CONFIG_FILES="$CONFIG_FILES README" ;; + "config.h.win32") CONFIG_FILES="$CONFIG_FILES config.h.win32" ;; + "glibconfig.h.win32") CONFIG_FILES="$CONFIG_FILES glibconfig.h.win32" ;; + "glib/makefile.msc") CONFIG_FILES="$CONFIG_FILES glib/makefile.msc" ;; + "glib/glib.rc") CONFIG_FILES="$CONFIG_FILES glib/glib.rc" ;; + "gmodule/makefile.msc") CONFIG_FILES="$CONFIG_FILES gmodule/makefile.msc" ;; + "gmodule/gmodule.rc") CONFIG_FILES="$CONFIG_FILES gmodule/gmodule.rc" ;; + "gobject/makefile.msc") CONFIG_FILES="$CONFIG_FILES gobject/makefile.msc" ;; + "gobject/gobject.rc") CONFIG_FILES="$CONFIG_FILES gobject/gobject.rc" ;; + "gthread/makefile.msc") CONFIG_FILES="$CONFIG_FILES gthread/makefile.msc" ;; + "gthread/gthread.rc") CONFIG_FILES="$CONFIG_FILES gthread/gthread.rc" ;; + "gio/gio.rc") CONFIG_FILES="$CONFIG_FILES gio/gio.rc" ;; + "tests/makefile.msc") CONFIG_FILES="$CONFIG_FILES tests/makefile.msc" ;; + + *) 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$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 -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# 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 {' >"$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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$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 $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; 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="$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 "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 >"$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 "$tmp/subs.awk" >$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' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$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 "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$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 "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$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 +} + ;; + "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac ;; + "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 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="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Assembler program. +AS=$AS + +# DLL creation program. +DLLTOOL=$DLLTOOL + +# Object dumper program. +OBJDUMP=$OBJDUMP + +# 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 + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# 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 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# 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 + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# 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 + +# 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 + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that does not interpret backslashes. +ECHO=$lt_ECHO + +# 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 + +# 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 + +# 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 + +# 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 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# 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 + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# 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 + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# 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 + +# 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 + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# 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 () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# 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_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}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $* )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# 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 () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -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 file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + + +# 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 "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[^=]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$@"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1+=\$2" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$1=\$$1\$2" +} + +_LT_EOF + ;; + esac + + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# 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_CXX + +# If ld is used when linking, flag to hardcode \$libdir into a binary +# during linking. This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# 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_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# 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_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + "glibconfig.h":C) + outfile=glibconfig.h-tmp + cat > $outfile <<\_______EOF +/* glibconfig.h + * + * This is a generated file. Please modify 'configure.in' + */ + +#ifndef __G_LIBCONFIG_H__ +#define __G_LIBCONFIG_H__ + +#include + +_______EOF + + if test x$glib_limits_h = xyes; then + echo '#include ' >> $outfile + fi + if test x$glib_float_h = xyes; then + echo '#include ' >> $outfile + fi + if test x$glib_values_h = xyes; then + echo '#include ' >> $outfile + fi + if test "$glib_header_alloca_h" = "yes"; then + echo '#define GLIB_HAVE_ALLOCA_H' >> $outfile + fi + if test x$glib_sys_poll_h = xyes; then + echo '#define GLIB_HAVE_SYS_POLL_H' >> $outfile + fi + if test x$glib_included_printf != xyes; then + echo " +/* Specifies that GLib's g_print*() functions wrap the + * system printf functions. This is useful to know, for example, + * when using glibc's register_printf_function(). + */" >> $outfile + echo '#define GLIB_USING_SYSTEM_PRINTF' >> $outfile + fi + + cat >> $outfile <<_______EOF + +G_BEGIN_DECLS + +#define G_MINFLOAT $glib_mf +#define G_MAXFLOAT $glib_Mf +#define G_MINDOUBLE $glib_md +#define G_MAXDOUBLE $glib_Md +#define G_MINSHORT $glib_ms +#define G_MAXSHORT $glib_Ms +#define G_MAXUSHORT $glib_Mus +#define G_MININT $glib_mi +#define G_MAXINT $glib_Mi +#define G_MAXUINT $glib_Mui +#define G_MINLONG $glib_ml +#define G_MAXLONG $glib_Ml +#define G_MAXULONG $glib_Mul + +_______EOF + + + ### this should always be true in a modern C/C++ compiler + cat >>$outfile <<_______EOF +typedef signed char gint8; +typedef unsigned char guint8; +_______EOF + + + if test -n "$gint16"; then + cat >>$outfile <<_______EOF +typedef signed $gint16 gint16; +typedef unsigned $gint16 guint16; +#define G_GINT16_MODIFIER $gint16_modifier +#define G_GINT16_FORMAT $gint16_format +#define G_GUINT16_FORMAT $guint16_format +_______EOF + fi + + + if test -n "$gint32"; then + cat >>$outfile <<_______EOF +typedef signed $gint32 gint32; +typedef unsigned $gint32 guint32; +#define G_GINT32_MODIFIER $gint32_modifier +#define G_GINT32_FORMAT $gint32_format +#define G_GUINT32_FORMAT $guint32_format +_______EOF + fi + + cat >>$outfile <<_______EOF +#define G_HAVE_GINT64 1 /* deprecated, always true */ + +${glib_extension}typedef signed $gint64 gint64; +${glib_extension}typedef unsigned $gint64 guint64; + +#define G_GINT64_CONSTANT(val) $gint64_constant +#define G_GUINT64_CONSTANT(val) $guint64_constant +_______EOF + + if test x$gint64_format != x ; then + cat >>$outfile <<_______EOF +#define G_GINT64_MODIFIER $gint64_modifier +#define G_GINT64_FORMAT $gint64_format +#define G_GUINT64_FORMAT $guint64_format +_______EOF + else + cat >>$outfile <<_______EOF +#undef G_GINT64_MODIFIER +#undef G_GINT64_FORMAT +#undef G_GUINT64_FORMAT +_______EOF + fi + + cat >>$outfile <<_______EOF + +#define GLIB_SIZEOF_VOID_P $glib_void_p +#define GLIB_SIZEOF_LONG $glib_long +#define GLIB_SIZEOF_SIZE_T $glib_size_t + +_______EOF + + cat >>$outfile <<_______EOF +typedef signed $glib_size_type_define gssize; +typedef unsigned $glib_size_type_define gsize; +#define G_GSIZE_MODIFIER $gsize_modifier +#define G_GSSIZE_FORMAT $gssize_format +#define G_GSIZE_FORMAT $gsize_format + +#define G_MAXSIZE G_MAXU$glib_msize_type +#define G_MINSSIZE G_MIN$glib_msize_type +#define G_MAXSSIZE G_MAX$glib_msize_type + +typedef gint64 goffset; +#define G_MINOFFSET G_MININT64 +#define G_MAXOFFSET G_MAXINT64 + +#define G_GOFFSET_MODIFIER G_GINT64_MODIFIER +#define G_GOFFSET_FORMAT G_GINT64_FORMAT +#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val) + +_______EOF + + if test -z "$glib_unknown_void_p"; then + cat >>$outfile <<_______EOF + +#define GPOINTER_TO_INT(p) ((gint) ${glib_gpi_cast} (p)) +#define GPOINTER_TO_UINT(p) ((guint) ${glib_gpui_cast} (p)) + +#define GINT_TO_POINTER(i) ((gpointer) ${glib_gpi_cast} (i)) +#define GUINT_TO_POINTER(u) ((gpointer) ${glib_gpui_cast} (u)) + +typedef signed $glib_intptr_type_define gintptr; +typedef unsigned $glib_intptr_type_define guintptr; + +#define G_GINTPTR_MODIFIER $gintptr_modifier +#define G_GINTPTR_FORMAT $gintptr_format +#define G_GUINTPTR_FORMAT $guintptr_format +_______EOF + else + echo '#error SIZEOF_VOID_P unknown - This should never happen' >>$outfile + fi + + + + cat >>$outfile <<_______EOF +$glib_atexit +$glib_memmove +$glib_defines +$glib_os +$glib_static_compilation + +$glib_vacopy + +#ifdef __cplusplus +#define G_HAVE_INLINE 1 +#else /* !__cplusplus */ +$glib_inline +#endif /* !__cplusplus */ + +#ifdef __cplusplus +#define G_CAN_INLINE 1 +_______EOF + + if test x$g_can_inline = xyes ; then + cat >>$outfile <<_______EOF +#else /* !__cplusplus */ +#define G_CAN_INLINE 1 +_______EOF + fi + + cat >>$outfile <<_______EOF +#endif + +_______EOF + + if test x$g_have_iso_c_varargs = xyes ; then + cat >>$outfile <<_______EOF +#ifndef __cplusplus +# define G_HAVE_ISO_VARARGS 1 +#endif +_______EOF + fi + if test x$g_have_iso_cxx_varargs = xyes ; then + cat >>$outfile <<_______EOF +#ifdef __cplusplus +# define G_HAVE_ISO_VARARGS 1 +#endif +_______EOF + fi + if test x$g_have_gnuc_varargs = xyes ; then + cat >>$outfile <<_______EOF + +/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi + * is passed ISO vararg support is turned off, and there is no work + * around to turn it on, so we unconditionally turn it off. + */ +#if __GNUC__ == 2 && __GNUC_MINOR__ == 95 +# undef G_HAVE_ISO_VARARGS +#endif + +#define G_HAVE_GNUC_VARARGS 1 +_______EOF + fi + + case x$g_stack_grows in + xyes) echo "#define G_HAVE_GROWING_STACK 1" >>$outfile ;; + *) echo "#define G_HAVE_GROWING_STACK 0" >>$outfile ;; + esac + + + echo >>$outfile + if test x$g_have_eilseq = xno; then + cat >>$outfile <<_______EOF +#ifndef EILSEQ +/* On some systems, like SunOS and NetBSD, EILSEQ is not defined. + * The correspondence between this and the corresponding definition + * in libiconv is essential. + */ +# define EILSEQ ENOENT +#endif +_______EOF + + fi + + if test x$g_have_gnuc_visibility = xyes; then + cat >>$outfile <<_______EOF +#define G_HAVE_GNUC_VISIBILITY 1 +_______EOF + fi + cat >>$outfile <<_______EOF +#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) +#define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +#define G_GNUC_INTERNAL __hidden +#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY) +#define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) +#else +#define G_GNUC_INTERNAL +#endif +_______EOF + + + echo >>$outfile + if test x$g_mutex_has_default = xyes; then + cat >>$outfile <<_______EOF +$g_enable_threads_def G_THREADS_ENABLED +#define G_THREADS_IMPL_$g_threads_impl_def +typedef struct _GStaticMutex GStaticMutex; +struct _GStaticMutex +{ + struct _GMutex *runtime_mutex; + union { + char pad[$g_mutex_sizeof]; + double dummy_double; + void *dummy_pointer; + long dummy_long; + } static_mutex; +}; +#define G_STATIC_MUTEX_INIT { NULL, { { $g_mutex_contents} } } +#define g_static_mutex_get_mutex(mutex) \\ + (g_thread_use_default_impl ? ((GMutex*)(gpointer) ((mutex)->static_mutex.pad)) : \\ + g_static_mutex_get_mutex_impl_shortcut (&((mutex)->runtime_mutex))) +_______EOF + else + cat >>$outfile <<_______EOF +$g_enable_threads_def G_THREADS_ENABLED +#define G_THREADS_IMPL_$g_threads_impl_def +typedef struct _GMutex* GStaticMutex; +#define G_STATIC_MUTEX_INIT NULL +#define g_static_mutex_get_mutex(mutex) \\ + (g_static_mutex_get_mutex_impl_shortcut (mutex)) +_______EOF + fi + + cat >>$outfile <<_______EOF +/* This represents a system thread as used by the implementation. An + * alien implementaion, as loaded by g_thread_init can only count on + * "sizeof (gpointer)" bytes to store their info. We however need more + * for some of our native implementations. */ +typedef union _GSystemThread GSystemThread; +union _GSystemThread +{ + char data[$g_system_thread_sizeof]; + double dummy_double; + void *dummy_pointer; + long dummy_long; +}; +_______EOF + if test x"$g_memory_barrier_needed" != xno; then + echo >>$outfile + echo "#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1" >>$outfile + fi + + echo >>$outfile + g_bit_sizes="16 32 64" + for bits in $g_bit_sizes; do + cat >>$outfile <<_______EOF +#define GINT${bits}_TO_${g_bs_native}(val) ((gint${bits}) (val)) +#define GUINT${bits}_TO_${g_bs_native}(val) ((guint${bits}) (val)) +#define GINT${bits}_TO_${g_bs_alien}(val) ((gint${bits}) GUINT${bits}_SWAP_LE_BE (val)) +#define GUINT${bits}_TO_${g_bs_alien}(val) (GUINT${bits}_SWAP_LE_BE (val)) +_______EOF + done + + cat >>$outfile <<_______EOF +#define GLONG_TO_LE(val) ((glong) GINT${glongbits}_TO_LE (val)) +#define GULONG_TO_LE(val) ((gulong) GUINT${glongbits}_TO_LE (val)) +#define GLONG_TO_BE(val) ((glong) GINT${glongbits}_TO_BE (val)) +#define GULONG_TO_BE(val) ((gulong) GUINT${glongbits}_TO_BE (val)) +#define GINT_TO_LE(val) ((gint) GINT${gintbits}_TO_LE (val)) +#define GUINT_TO_LE(val) ((guint) GUINT${gintbits}_TO_LE (val)) +#define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val)) +#define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val)) +#define GSIZE_TO_LE(val) ((gsize) GUINT${gsizebits}_TO_LE (val)) +#define GSSIZE_TO_LE(val) ((gssize) GINT${gsizebits}_TO_LE (val)) +#define GSIZE_TO_BE(val) ((gsize) GUINT${gsizebits}_TO_BE (val)) +#define GSSIZE_TO_BE(val) ((gssize) GINT${gsizebits}_TO_BE (val)) +#define G_BYTE_ORDER $g_byte_order + +#define GLIB_SYSDEF_POLLIN =$g_pollin +#define GLIB_SYSDEF_POLLOUT =$g_pollout +#define GLIB_SYSDEF_POLLPRI =$g_pollpri +#define GLIB_SYSDEF_POLLHUP =$g_pollhup +#define GLIB_SYSDEF_POLLERR =$g_pollerr +#define GLIB_SYSDEF_POLLNVAL =$g_pollnval + +#define G_MODULE_SUFFIX "$g_module_suffix" + +/* A GPid is an abstraction for a process "handle". It is *not* an + * abstraction for a process identifier in general. GPid is used in + * GLib only for descendant processes spawned with the g_spawn* + * functions. On POSIX there is no "process handle" concept as such, + * but on Windows a GPid is a handle to a process, a kind of pointer, + * not a process identifier. + */ +typedef $g_pid_type GPid; + +#define GLIB_SYSDEF_AF_UNIX $g_af_unix +#define GLIB_SYSDEF_AF_INET $g_af_inet +#define GLIB_SYSDEF_AF_INET6 $g_af_inet6 + +#define GLIB_SYSDEF_MSG_OOB $g_msg_oob +#define GLIB_SYSDEF_MSG_PEEK $g_msg_peek +#define GLIB_SYSDEF_MSG_DONTROUTE $g_msg_dontroute + +G_END_DECLS + +#endif /* GLIBCONFIG_H */ +_______EOF + + + if cmp -s $outfile glibconfig.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: glibconfig.h is unchanged" >&5 +$as_echo "$as_me: glibconfig.h is unchanged" >&6;} + rm -f $outfile + else + mv $outfile glibconfig.h + fi + ;; + "chmod-scripts":C) chmod 0755 glib-zip +chmod 0755 glib-gettextize +chmod 0755 gobject/glib-mkenums ;; + + 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 $? +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 + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..3e2f677 --- /dev/null +++ b/configure.in @@ -0,0 +1,3585 @@ +# Process this file with autoconf to produce a configure script. +# require autoconf 2.54 +AC_PREREQ(2.54) + +dnl *********************************** +dnl *** include special GLib macros *** +dnl *********************************** + +m4_define(glib_configure_in) + +# +# The following version number definitions apply to GLib, GModule, GObject, +# GThread and GIO as a whole, so if changes occurred in any of them, they are +# all treated with the same interface and binary age. +# +# Making releases: +# glib_micro_version += 1; +# glib_interface_age += 1; +# glib_binary_age += 1; +# if any functions have been added, set glib_interface_age to 0. +# if backwards compatibility has been broken, +# set glib_binary_age _and_ glib_interface_age to 0. +# +m4_define([glib_major_version], [2]) +m4_define([glib_minor_version], [24]) +m4_define([glib_micro_version], [0]) +m4_define([glib_interface_age], [0]) +m4_define([glib_binary_age], + [m4_eval(100 * glib_minor_version + glib_micro_version)]) +m4_define([glib_version], + [glib_major_version.glib_minor_version.glib_micro_version]) + +# libtool version related macros +m4_define([glib_lt_release], [glib_major_version.glib_minor_version]) +m4_define([glib_lt_current], + [m4_eval(100 * glib_minor_version + glib_micro_version - glib_interface_age)]) +m4_define([glib_lt_revision], [glib_interface_age]) +m4_define([glib_lt_age], [m4_eval(glib_binary_age - glib_interface_age)]) +m4_define([glib_lt_current_minus_age], + [m4_eval(glib_lt_current - glib_lt_age)]) + +# if the minor version number is odd, then we want debugging. Otherwise +# we only want minimal debugging support. +m4_define([glib_debug_default], + [m4_if(m4_eval(glib_minor_version % 2), [1], [yes], [minimum])])dnl + + +AC_INIT(glib, [glib_version], + [http://bugzilla.gnome.org/enter_bug.cgi?product=glib]) + +AC_CONFIG_SRCDIR([glib/glib.h]) + +# Save this value here, since automake will set cflags later +cflags_set=${CFLAGS+set} + +AM_INIT_AUTOMAKE([no-define]) + +# Specify a configuration file +AM_CONFIG_HEADER([config.h]) + +# Support silent build rules, requires at least automake-1.11. Enable +# by either passing --enable-silent-rules to configure or passing V=0 +# to make +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([no])]) + +GLIB_MAJOR_VERSION=glib_major_version +GLIB_MINOR_VERSION=glib_minor_version +GLIB_MICRO_VERSION=glib_micro_version +GLIB_INTERFACE_AGE=glib_interface_age +GLIB_BINARY_AGE=glib_binary_age +GLIB_VERSION=glib_version + +AC_SUBST(GLIB_MAJOR_VERSION) +AC_SUBST(GLIB_MINOR_VERSION) +AC_SUBST(GLIB_MICRO_VERSION) +AC_SUBST(GLIB_VERSION) +AC_SUBST(GLIB_INTERFACE_AGE) +AC_SUBST(GLIB_BINARY_AGE) + +AC_DEFINE(GLIB_MAJOR_VERSION, [glib_major_version], + [Define to the GLIB major version]) +AC_DEFINE(GLIB_MINOR_VERSION, [glib_minor_version], + [Define to the GLIB minor version]) +AC_DEFINE(GLIB_MICRO_VERSION, [glib_micro_version], + [Define to the GLIB micro version]) +AC_DEFINE(GLIB_INTERFACE_AGE, [glib_interface_age], + [Define to the GLIB interface age]) +AC_DEFINE(GLIB_BINARY_AGE, [glib_binary_age], + [Define to the GLIB binary age]) + +# libtool versioning +LT_RELEASE=glib_lt_release +LT_CURRENT=glib_lt_current +LT_REVISION=glib_lt_revision +LT_AGE=glib_lt_age +LT_CURRENT_MINUS_AGE=glib_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 Initialize maintainer mode +AM_MAINTAINER_MODE + +AC_CANONICAL_HOST + +AC_MSG_CHECKING([for the BeOS]) +case $host in + *-*-beos*) + glib_native_beos="yes" + ;; + *) + glib_native_beos="no" + ;; +esac +AC_MSG_RESULT([$glib_native_beos]) + +dnl + +AC_MSG_CHECKING([for Win32]) +LIB_EXE_MACHINE_FLAG=X86 +case "$host" in + *-*-mingw*) + glib_native_win32=yes + glib_pid_type='void *' + glib_cv_stack_grows=no + # Unfortunately the mingw implementations of C99-style snprintf and vsnprintf + # don't seem to be quite good enough, at least not in mingw-runtime-3.14. + # (Sorry, I don't know exactly what is the problem, but it is related to + # floating point formatting and decimal point vs. comma.) + # The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't + # rigorous enough to notice, though. + # So preset the autoconf cache variables. + ac_cv_func_vsnprintf_c99=no + ac_cv_func_snprintf_c99=no + case "$host" in + x86_64-*-*) + LIB_EXE_MACHINE_FLAG=X64 + ;; + esac + ;; + *) + glib_native_win32=no + glib_pid_type=int + ;; +esac +case $host in + *-*-linux*) + glib_os_linux=yes + ;; +esac + +AC_MSG_RESULT([$glib_native_win32]) + +AC_SUBST(LIB_EXE_MACHINE_FLAG) + +glib_have_carbon=no +AC_MSG_CHECKING([for Mac OS X Carbon support]) +AC_TRY_CPP([ +#include +#include +], glib_have_carbon=yes) + +AC_MSG_RESULT([$glib_have_carbon]) + +AM_CONDITIONAL(OS_WIN32, [test "$glib_native_win32" = "yes"]) +AM_CONDITIONAL(OS_WIN32_X64, [test "$LIB_EXE_MACHINE_FLAG" = "X64"]) +AM_CONDITIONAL(OS_UNIX, [test "$glib_native_win32" != "yes"]) +AM_CONDITIONAL(OS_LINUX, [test "$glib_os_linux" = "yes"]) +AM_CONDITIONAL(OS_CARBON, [test "$glib_have_carbon" = "yes"]) + +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]) + +if test "$glib_native_win32" != yes; then + # libtool option to control which symbols are exported + # right now, symbols starting with _ are not exported + LIBTOOL_EXPORT_OPTIONS='-export-symbols-regex "^g.*"' +else + # We currently use .def files on Windows + LIBTOOL_EXPORT_OPTIONS= +fi +AC_SUBST(LIBTOOL_EXPORT_OPTIONS) + +if test "x$glib_have_carbon" = "xyes"; then + AC_DEFINE(HAVE_CARBON, 1, [define to 1 if Carbon is available]) + LDFLAGS="$LDFLAGS -framework Carbon" +fi + + +dnl declare --enable-* args and collect ac_help strings +AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@], + [turn on debugging @<:@default=glib_debug_default@:>@]),, + enable_debug=glib_debug_default) + +AC_ARG_ENABLE(gc_friendly, + [AC_HELP_STRING([--enable-gc-friendly], + [turn on garbage collector friendliness [default=no]])],, + [enable_gc_friendly=no]) +AC_ARG_ENABLE(mem_pools, + [AC_HELP_STRING([--disable-mem-pools], + [disable all glib memory pools])],, + [disable_mem_pools=no]) +AC_ARG_ENABLE(threads, + [AC_HELP_STRING([--enable-threads], + [turn on basic thread support [default=yes] +([=no] will override --with-threads)])],, + [enable_threads=yes]) +AC_ARG_ENABLE(rebuilds, + [AC_HELP_STRING([--disable-rebuilds], + [disable all source autogeneration rules])],, + [enable_rebuilds=yes]) +AC_ARG_ENABLE(visibility, + [AC_HELP_STRING([--disable-visibility], + [don't use ELF visibility attributes])],, + [enable_visibility=yes]) + +if test "x$enable_threads" != "xyes"; then + enable_threads=no +fi + +AC_MSG_CHECKING([whether to enable garbage collector friendliness]) +if test "x$enable_gc_friendly" = "xyes"; then + AC_DEFINE(ENABLE_GC_FRIENDLY_DEFAULT, 1, [Whether to enable GC friendliness by default]) + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +AC_MSG_CHECKING([whether to disable memory pools]) +if test "x$disable_mem_pools" = "xno"; then + AC_MSG_RESULT([no]) +else + AC_DEFINE(DISABLE_MEM_POOLS, [1], [Whether to disable memory pools]) + AC_SUBST(DISABLE_MEM_POOLS) + AC_MSG_RESULT([yes]) +fi + +dnl location to install runtime libraries, e.g. ../../lib to install +dnl to /lib if libdir is /usr/lib +AC_ARG_WITH(runtime-libdir, + [AC_HELP_STRING([--with-runtime-libdir=RELPATH], + [Install runtime libraries relative to libdir])], + [], + [with_runtime_libdir=""]) +GLIB_RUNTIME_LIBDIR="$with_runtime_libdir" +ABS_GLIB_RUNTIME_LIBDIR="`readlink -f $libdir/$with_runtime_libdir`" +AC_SUBST(GLIB_RUNTIME_LIBDIR) +AC_SUBST(ABS_GLIB_RUNTIME_LIBDIR) +AM_CONDITIONAL(HAVE_GLIB_RUNTIME_LIBDIR, [test "x$with_runtime_libdir" != "x"]) + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_CPP + +dnl Check for a working C++ compiler, but do not bail out, if none is found. +AC_CHECK_TOOLS(CXX, [$CCC c++ g++ gcc CC cxx cc++ cl], [gcc]) +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_TRY_COMPILE(,[class a { int b; } c;], ,CXX=) +AM_CONDITIONAL(HAVE_CXX, [test "$CXX" != ""]) +AC_LANG_RESTORE + +AM_PROG_CC_STDC +AM_PROG_CC_C_O +AC_PROG_INSTALL + +AC_SYS_LARGEFILE + +# +# Find pkg-config +# +AC_PATH_PROG(PKG_CONFIG, [pkg-config], [no]) +if test x$PKG_CONFIG = xno ; then + AC_MSG_ERROR([*** pkg-config not found. See http://www.freedesktop.org/software/pkgconfig/]) +fi + +if $PKG_CONFIG --atleast-pkgconfig-version 0.16 ; then + : +else + AC_MSG_ERROR([*** pkg-config too old; version 0.16 or better required.]) +fi + +if test "x$enable_debug" = "xyes"; then + if test x$cflags_set != xset ; then + case " $CFLAGS " in + *[[\ \ ]]-g[[\ \ ]]*) ;; + *) CFLAGS="$CFLAGS -g" ;; + esac + fi + + GLIB_DEBUG_FLAGS="-DG_ENABLE_DEBUG" +else + GLIB_DEBUG_FLAGS="-DG_DISABLE_CAST_CHECKS" + + if test "x$enable_debug" = "xno"; then + GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS" + fi +fi + +if test "x$enable_visibility" = "xno"; then + GLIB_DEBUG_FLAGS="$GLIB_DEBUG_FLAGS -DDISABLE_VISIBILITY" +fi + +# Ensure MSVC-compatible struct packing convention is used when +# compiling for Win32 with gcc. +# What flag to depends on gcc version: gcc3 uses "-mms-bitfields", while +# gcc2 uses "-fnative-struct". +if test x"$glib_native_win32" = xyes; then + if test x"$GCC" = xyes; then + msnative_struct='' + AC_MSG_CHECKING([how to get MSVC-compatible struct packing]) + if test -z "$ac_cv_prog_CC"; then + our_gcc="$CC" + else + our_gcc="$ac_cv_prog_CC" + fi + case `$our_gcc --version | sed -e 's,\..*,.,' -e q` in + 2.) + if $our_gcc -v --help 2>/dev/null | grep fnative-struct >/dev/null; then + msnative_struct='-fnative-struct' + fi + ;; + *) + if $our_gcc -v --help 2>/dev/null | grep ms-bitfields >/dev/null; then + msnative_struct='-mms-bitfields' + fi + ;; + esac + if test x"$msnative_struct" = x ; then + AC_MSG_RESULT([no way]) + AC_MSG_WARN([produced libraries might be incompatible with MSVC-compiled code]) + else + CFLAGS="$CFLAGS $msnative_struct" + AC_MSG_RESULT([${msnative_struct}]) + fi + fi +fi +GLIB_EXTRA_CFLAGS="${msnative_struct}" +AC_SUBST(GLIB_EXTRA_CFLAGS) + +AC_EXEEXT + +# define a MAINT-like variable REBUILD which is set if Perl +# and awk are found, so autogenerated sources can be rebuilt +AC_PROG_AWK +AC_CHECK_PROGS(PERL, [perl5 perl]) +# We would like indent, but don't require it. +AC_CHECK_PROG(INDENT, indent, indent) +REBUILD=\# +if test "x$enable_rebuilds" = "xyes" && \ + test -n "$PERL" && \ + $PERL -e 'exit !($] >= 5.002)' > /dev/null 2>&1 && \ + test -n "$AWK" ; then + REBUILD= +fi +AC_SUBST(REBUILD) + +# Need full path to Perl for glib-mkenums +# +if test "x$PERL" != x ; then + AC_PATH_PROG(PERL_PATH, [$PERL]) +fi +if test "x$PERL_PATH" = x ; then + PERL_PATH="/usr/bin/env perl" +fi +AC_SUBST(PERL_PATH) + +# Need suitable python path for greport +AM_PATH_PYTHON(2.4,,PYTHON="/usr/bin/env python2.4") + + +dnl *********************** +dnl *** Tests for iconv *** +dnl *********************** +dnl +dnl We do this before the gettext checks, to avoid distortion + +dnl On Windows we use a native implementation + +if test x"$glib_native_win32" = xyes; then + with_libiconv=native +else + AC_ARG_WITH(libiconv, + [AC_HELP_STRING([--with-libiconv=@<:@no/gnu/native@:>@], + [use the libiconv library])],, + [with_libiconv=maybe]) + + found_iconv=no + case $with_libiconv in + maybe) + # Check in the C library first + AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes]) + # Check if we have GNU libiconv + if test $found_iconv = "no"; then + AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes]) + fi + # Check if we have a iconv in -liconv, possibly from vendor + if test $found_iconv = "no"; then + AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes]) + fi + ;; + no) + AC_CHECK_FUNC(iconv_open, [with_libiconv=no; found_iconv=yes]) + ;; + gnu|yes) + AC_CHECK_LIB(iconv, libiconv_open, [with_libiconv=gnu; found_iconv=yes]) + ;; + native) + AC_CHECK_LIB(iconv, iconv_open, [with_libiconv=native; found_iconv=yes]) + ;; + esac + + if test "x$found_iconv" = "xno" ; then + AC_MSG_ERROR([*** No iconv() implementation found in C library or libiconv]) + fi +fi + +gl_GLIBC21 +AC_ARG_ENABLE(iconv-cache, + [AC_HELP_STRING([--enable-iconv-cache=@<:@yes/no/auto@:>@], + [cache iconv descriptors [default=auto]])],, + [enable_iconv_cache=auto]) + +AC_MSG_CHECKING([Whether to cache iconv descriptors]) +case $enable_iconv_cache in + auto) + if test $ac_cv_gnu_library_2_1 = yes; then + enable_iconv_cache=no + else + enable_iconv_cache=yes + fi + ;; + yes|no) + ;; + *) AC_MSG_ERROR([Value given to --enable-iconv-cache must be one of yes, no or auto]) + ;; +esac + +if test $enable_iconv_cache = yes; then + AC_DEFINE(NEED_ICONV_CACHE,1,[Do we cache iconv descriptors]) +fi + +AC_MSG_RESULT($enable_iconv_cache) + + +dnl +dnl zlib support +dnl +found_zlib=no +AC_CHECK_LIB(z, inflate, [AC_CHECK_HEADER(zlib.h, found_zlib=yes)]) + +if test "x$found_zlib" = "xno" ; then + AC_MSG_ERROR([*** Working zlib library and headers not found ***]) +fi +ZLIB_LIBS='-lz' +AC_SUBST(ZLIB_LIBS) +dnl +dnl gettext support +dnl + +ALL_LINGUAS="`grep -v '^#' "$srcdir/po/LINGUAS" | tr '\n' ' '`" +AC_SUBST([CONFIG_STATUS_DEPENDENCIES],['$(top_srcdir)/po/LINGUAS']) +GLIB_GNU_GETTEXT + +if test "$gt_cv_have_gettext" != "yes" ; then + AC_MSG_ERROR([ +*** You must have either have gettext support in your C library, or use the +*** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html +]) +fi + +LIBS="$INTLLIBS $LIBS" + +GETTEXT_PACKAGE=glib20 +AC_SUBST(GETTEXT_PACKAGE) +AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, ["$GETTEXT_PACKAGE"], + [Define the gettext package to be used]) + +GLIB_DEFINE_LOCALEDIR(GLIB_LOCALE_DIR) + +dnl +dnl Now we are done with gettext checks, figure out ICONV_LIBS +dnl + +if test x"$glib_native_win32" != xyes; then + if test x$with_libiconv != xno ; then + case " $INTLLIBS " in + *[[\ \ ]]-liconv[[\ \ ]]*) ;; + *) ICONV_LIBS="-liconv" ;; + esac + fi +fi +AC_SUBST(ICONV_LIBS) + +case $with_libiconv in + gnu) + AC_DEFINE(USE_LIBICONV_GNU, 1, [Using GNU libiconv]) + ;; + native) + AC_DEFINE(USE_LIBICONV_NATIVE, 1, [Using a native implementation of iconv in a separate library]) + ;; +esac + +dnl Initialize libtool +AM_DISABLE_STATIC +AC_LIBTOOL_WIN32_DLL +AM_PROG_LIBTOOL +dnl when using libtool 2.x create libtool early, because it's used in configure +m4_ifdef([LT_OUTPUT], [LT_OUTPUT]) + + +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[[\ \ ]]-Wall[[\ \ ]]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac +fi + +CPPFLAGS="$CPPFLAGS -DG_DISABLE_SINGLE_INCLUDES" + +if test "$glib_native_win32" = "yes"; then + if test x$enable_static = xyes -a x$enable_shared = xyes; then + AC_MSG_ERROR([Can not build both shared and static at the same time on Windows.]) + fi + if test x$enable_static = xyes; then + glib_win32_static_compilation=yes + GLIB_WIN32_STATIC_COMPILATION_DEFINE="#define GLIB_STATIC_COMPILATION 1 +#define GOBJECT_STATIC_COMPILATION 1" + AC_SUBST(GLIB_WIN32_STATIC_COMPILATION_DEFINE) + fi +fi +AM_CONDITIONAL(OS_WIN32_AND_DLL_COMPILATION, [test x$glib_native_win32 = xyes -a x$glib_win32_static_compilation != xyes]) + +dnl +dnl DU4 native cc currently needs -std1 for ANSI mode (instead of K&R) +dnl +if test $cross_compiling != yes ; then + AC_MSG_CHECKING([for extra flags to get ANSI library prototypes]) + glib_save_LIBS=$LIBS + LIBS="$LIBS -lm" + AC_TRY_RUN([#include + int main (void) { return (log(1) != log(1.)); }], + AC_MSG_RESULT(none needed), + glib_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -std1" + AC_TRY_RUN([#include + int main (void) { return (log(1) != log(1.)); }], + AC_MSG_RESULT(-std1), + AC_MSG_RESULT() + CFLAGS=$glib_save_CFLAGS + AC_MSG_WARN( + [No ANSI prototypes found in library. (-std1 didn't work.)]) + ) + ) + LIBS=$glib_save_LIBS +fi + +dnl NeXTStep cc seems to need this +AC_MSG_CHECKING([for extra flags for POSIX compliance]) +AC_TRY_COMPILE([#include ], [DIR *dir;], + AC_MSG_RESULT(none needed), + glib_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -posix" + AC_TRY_COMPILE([#include ], [DIR *dir;], + AC_MSG_RESULT(-posix), + AC_MSG_RESULT() + CFLAGS=$glib_save_CFLAGS + AC_MSG_WARN([Could not determine POSIX flag. (-posix didn't work.)]))) + +# Checks for header files. +AC_HEADER_STDC + +# Checks for library functions. +AC_FUNC_VPRINTF +AC_FUNC_ALLOCA +AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2) +AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r) + +AC_CHECK_SIZEOF(char) +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(void *) +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(__int64) + +if test x$ac_cv_sizeof_long = x8 || test x$ac_cv_sizeof_long_long = x8 || test x$ac_cv_sizeof___int64 = x8 ; then + : +else + AC_MSG_ERROR([ +*** GLib requires a 64 bit type. You might want to consider +*** using the GNU C compiler. +]) +fi + +if test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8; then + # long long is a 64 bit integer. + AC_MSG_CHECKING(for format to printf and scanf a guint64) + AC_CACHE_VAL(glib_cv_long_long_format,[ + for format in ll q I64; do + AC_TRY_RUN([#include + int main() + { + long long b, a = -0x3AFAFAFAFAFAFAFALL; + char buffer[1000]; + sprintf (buffer, "%${format}u", a); + sscanf (buffer, "%${format}u", &b); + exit (b!=a); + } + ], + [glib_cv_long_long_format=${format} + break], + [],[:]) + done]) + if test -n "$glib_cv_long_long_format"; then + AC_MSG_RESULT(%${glib_cv_long_long_format}u) + AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long]) + if test x"$glib_cv_long_long_format" = xI64; then + AC_DEFINE(HAVE_INT64_AND_I64,1,[define to support printing 64-bit integers with format I64]) + fi + else + AC_MSG_RESULT(none) + fi +elif test x$ac_cv_sizeof___int64 = x8; then + # __int64 is a 64 bit integer. + AC_MSG_CHECKING(for format to printf and scanf a guint64) + # We know this is MSVCRT.DLL, and what the formats are + glib_cv_long_long_format=I64 + AC_MSG_RESULT(%${glib_cv_long_long_format}u) + AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long]) + AC_DEFINE(HAVE_INT64_AND_I64,1,[define to support printing 64-bit integers with format I64]) +fi + +dnl long doubles were not used, and a portability problem +dnl AC_C_LONG_DOUBLE +AC_C_CONST + +dnl ok, here we try to check whether the systems prototypes for +dnl malloc and friends actually match the prototypes provided +dnl by gmem.h (keep in sync). i currently only know how to check +dnl this reliably with gcc (-Werror), improvements for other +dnl compilers are apprechiated. +SANE_MALLOC_PROTOS=no +AC_MSG_CHECKING([if malloc() and friends prototypes are gmem.h compatible]) +glib_save_CFLAGS=$CFLAGS +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -Werror" + AC_TRY_COMPILE([#include ], [ + void* (*my_calloc_p) (size_t, size_t) = calloc; + void* (*my_malloc_p) (size_t) = malloc; + void (*my_free_p) (void*) = free; + void* (*my_realloc_p) (void*, size_t) = realloc; + my_calloc_p = 0; + my_malloc_p = 0; + my_free_p = 0; + my_realloc_p = 0; + ], + AC_DEFINE(SANE_MALLOC_PROTOS, 1, + [Define if you have correct malloc prototypes]) + SANE_MALLOC_PROTOS=yes) +fi +AC_MSG_RESULT($SANE_MALLOC_PROTOS) +CFLAGS=$glib_save_CFLAGS + +dnl +dnl check in which direction the stack grows +dnl +AC_CACHE_CHECK([for growing stack pointer],glib_cv_stack_grows,[ + AC_TRY_RUN([ + volatile int *a = 0, *b = 0; + void foo (void); + int main () { volatile int y = 7; a = &y; foo (); return b > a; } + void foo (void) { volatile int x = 5; b = &x; } + ], + glib_cv_stack_grows=no + , + glib_cv_stack_grows=yes + ,) +]) + +dnl AC_C_INLINE is useless to us since it bails out too early, we need to +dnl truely know which ones of `inline', `__inline' and `__inline__' are +dnl actually supported. +AC_CACHE_CHECK([for __inline],glib_cv_has__inline,[ + AC_COMPILE_IFELSE([ + __inline int foo () { return 0; } + int main () { return foo (); } + ], + glib_cv_has__inline=yes + , + glib_cv_has__inline=no + ,) +]) +case x$glib_cv_has__inline in +xyes) AC_DEFINE(G_HAVE___INLINE,1,[Have __inline keyword]) +esac +AC_CACHE_CHECK([for __inline__],glib_cv_has__inline__,[ + AC_COMPILE_IFELSE([ + __inline__ int foo () { return 0; } + int main () { return foo (); } + ], + glib_cv_has__inline__=yes + , + glib_cv_has__inline__=no + ,) +]) +case x$glib_cv_has__inline__ in +xyes) AC_DEFINE(G_HAVE___INLINE__,1,[Have __inline__ keyword]) +esac +AC_CACHE_CHECK([for inline], glib_cv_hasinline,[ + AC_COMPILE_IFELSE([ + #undef inline + inline int foo () { return 0; } + int main () { return foo (); } + ], + glib_cv_hasinline=yes + , + glib_cv_hasinline=no + ,) +]) +case x$glib_cv_hasinline in +xyes) AC_DEFINE(G_HAVE_INLINE,1,[Have inline keyword]) +esac + +# if we can use inline functions in headers +AC_MSG_CHECKING(if inline functions in headers work) +AC_LINK_IFELSE([ +#if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) +# undef inline +# define inline __inline__ +#elif !defined (G_HAVE_INLINE) +# undef inline +# if defined (G_HAVE___INLINE__) +# define inline __inline__ +# elif defined (G_HAVE___INLINE) +# define inline __inline +# endif +#endif + +int glib_test_func2 (int); + +static inline int +glib_test_func1 (void) { + return glib_test_func2 (1); +} + +int +main (void) { + int i = 1; +}],[g_can_inline=yes],[g_can_inline=no]) +AC_MSG_RESULT($g_can_inline) + +dnl *** check for working do while(0) macros *** +AC_CACHE_CHECK([for working do while(0) macros], g_cv_support_dowhile_macros, [ + AC_TRY_COMPILE([],[ + #define STMT_START do + #define STMT_END while(0) + #define STMT_TEST STMT_START { i = 0; } STMT_END + int main(void) { int i = 1; STMT_TEST; return i; }], + [g_cv_support_dowhile_macros=yes], + [g_cv_support_dowhile_macros=no], + [g_cv_support_dowhile_macros=yes]) +]) +if test x$g_cv_support_dowhile_macros = xyes; then + AC_DEFINE(HAVE_DOWHILE_MACROS, 1, [define for working do while(0) macros]) +fi + +# check for flavours of varargs macros +AC_MSG_CHECKING(for ISO C99 varargs macros in C) +AC_TRY_COMPILE([],[ +int a(int p1, int p2, int p3); +#define call_a(...) a(1,__VA_ARGS__) +call_a(2,3); +],g_have_iso_c_varargs=yes,g_have_iso_c_varargs=no) +AC_MSG_RESULT($g_have_iso_c_varargs) + +AC_MSG_CHECKING(for ISO C99 varargs macros in C++) +if test "$CXX" = ""; then +dnl No C++ compiler + g_have_iso_cxx_varargs=no +else + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([],[ +int a(int p1, int p2, int p3); +#define call_a(...) a(1,__VA_ARGS__) +call_a(2,3); +],g_have_iso_cxx_varargs=yes,g_have_iso_cxx_varargs=no) + AC_LANG_C +fi +AC_MSG_RESULT($g_have_iso_cxx_varargs) + +AC_MSG_CHECKING(for GNUC varargs macros) +AC_TRY_COMPILE([],[ +int a(int p1, int p2, int p3); +#define call_a(params...) a(1,params) +call_a(2,3); +],g_have_gnuc_varargs=yes,g_have_gnuc_varargs=no) +AC_MSG_RESULT($g_have_gnuc_varargs) + +# check for GNUC visibility support +AC_MSG_CHECKING(for GNUC visibility attribute) +GLIB_CHECK_COMPILE_WARNINGS([ +void +__attribute__ ((visibility ("hidden"))) + f_hidden (void) +{ +} +void +__attribute__ ((visibility ("internal"))) + f_internal (void) +{ +} +void +__attribute__ ((visibility ("protected"))) + f_protected (void) +{ +} +void +__attribute__ ((visibility ("default"))) + f_default (void) +{ +} +int main (int argc, char **argv) +{ + f_hidden(); + f_internal(); + f_protected(); + f_default(); + return 0; +} +],g_have_gnuc_visibility=yes,g_have_gnuc_visibility=no) +AC_MSG_RESULT($g_have_gnuc_visibility) +AM_CONDITIONAL(HAVE_GNUC_VISIBILITY, [test x$g_have_gnuc_visibility = xyes]) + +AC_MSG_CHECKING([whether using Sun Studio C compiler]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#if defined(__SUNPRO_C) || (__SUNPRO_C >= 0x550) +#else +# include "error: this is not Sun Studio." +#endif +]], [[]])], [ g_have_sunstudio_visibility=yes ], [ g_have_sunstudio_visibility=no ]) +AC_MSG_RESULT($g_have_sunstudio_visibility) +AM_CONDITIONAL(HAVE_SUNSTUDIO_VISIBILITY, [test x$g_have_sunstudio_visibility = xyes]) + +# check for bytesex stuff +AC_C_BIGENDIAN +if test x$ac_cv_c_bigendian = xuniversal ; then +AC_TRY_COMPILE([#include ], [#if __BYTE_ORDER == __BIG_ENDIAN +#else +#error Not a big endian. +#endif], + ac_cv_c_bigendian=yes + ,AC_TRY_COMPILE([#include ], [#if __BYTE_ORDER == __LITTLE_ENDIAN +#else +#error Not a little endian. +#endif], + ac_cv_c_bigendian=no + ,AC_MSG_WARN([Could not determine endianness.]))) +fi + + +# check for header files +AC_CHECK_HEADERS([dirent.h float.h limits.h pwd.h grp.h sys/param.h sys/poll.h sys/resource.h]) +AC_CHECK_HEADERS([sys/time.h sys/times.h sys/wait.h unistd.h values.h]) +AC_CHECK_HEADERS([sys/select.h sys/types.h stdint.h inttypes.h sched.h malloc.h]) +AC_CHECK_HEADERS([sys/vfs.h sys/mount.h sys/vmount.h sys/statfs.h sys/statvfs.h]) +AC_CHECK_HEADERS([mntent.h sys/mnttab.h sys/vfstab.h sys/mntctl.h sys/sysctl.h fstab.h]) +AC_CHECK_HEADERS([sys/uio.h]) + +# check for structure fields +AC_CHECK_MEMBERS([struct stat.st_mtimensec, struct stat.st_mtim.tv_nsec, struct stat.st_atimensec, struct stat.st_atim.tv_nsec, struct stat.st_ctimensec, struct stat.st_ctim.tv_nsec]) +AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_blocks, struct statfs.f_fstypename, struct statfs.f_bavail],,, [#include +#include +#include +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif]) +# struct statvfs.f_basetype is available on Solaris but not for Linux. +AC_CHECK_MEMBERS([struct statvfs.f_basetype],,, [#include ]) + +# Checks for libcharset +AM_LANGINFO_CODESET +gl_GLIBC21 +AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) +AC_CHECK_FUNCS(setlocale) + +# check additional type sizes +AC_CHECK_SIZEOF(size_t) + +dnl Try to figure out whether gsize, gssize should be long or int +AC_MSG_CHECKING([for the appropriate definition for size_t]) + +case $ac_cv_sizeof_size_t in + $ac_cv_sizeof_short) + glib_size_type=short + ;; + $ac_cv_sizeof_int) + glib_size_type=int + ;; + $ac_cv_sizeof_long) + glib_size_type=long + ;; + $ac_cv_sizeof_long_long) + glib_size_type='long long' + ;; + $ac_cv_sizeof__int64) + glib_size_type='__int64' + ;; + *) AC_MSG_ERROR([No type matching size_t in size]) + ;; +esac + +dnl If int/long are the same size, we see which one produces +dnl warnings when used in the location as size_t. (This matters +dnl on AIX with xlc) +dnl +if test $ac_cv_sizeof_size_t = $ac_cv_sizeof_int && + test $ac_cv_sizeof_size_t = $ac_cv_sizeof_long ; then + GLIB_CHECK_COMPILE_WARNINGS([ +#if defined(_AIX) && !defined(__GNUC__) +#pragma options langlvl=stdc89 +#endif +#include +int main () +{ + size_t s = 1; + unsigned int *size_int = &s; + return (int)*size_int; +} + ],glib_size_type=int, + [GLIB_CHECK_COMPILE_WARNINGS([ +#if defined(_AIX) && !defined(__GNUC__) +#pragma options langlvl=stdc89 +#endif +#include +int main () +{ + size_t s = 1; + unsigned long *size_long = &s; + return (int)*size_long; +} + ],glib_size_type=long)]) +fi + +AC_MSG_RESULT(unsigned $glib_size_type) + +# Check for some functions +AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd vasprintf setenv unsetenv getc_unlocked readlink symlink fdwalk) +AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link statvfs statfs utimes getgrgid getpwuid) +AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getmntinfo) +# Check for high-resolution sleep functions +AC_CHECK_FUNCS(nanosleep nsleep) +AC_CHECK_FUNCS(splice) + +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNCS(_NSGetEnviron) + +AC_FUNC_VSNPRINTF_C99 +AC_FUNC_PRINTF_UNIX98 + +# Internet address families +if test $glib_native_win32 = yes; then + glib_inet_includes=[" +#include + "] +else + glib_inet_includes=[" +#include +#include + "] +fi + +glib_failed=false +GLIB_CHECK_VALUE(AF_INET, $glib_inet_includes, glib_failed=true) +GLIB_CHECK_VALUE(AF_INET6, $glib_inet_includes, glib_failed=true) +# winsock defines this even though it doesn't support it +GLIB_CHECK_VALUE(AF_UNIX, $glib_inet_includes, glib_failed=true) +if $glib_failed ; then + AC_MSG_ERROR([Could not determine values for AF_INET* constants]) +fi + +glib_failed=false +GLIB_CHECK_VALUE(MSG_PEEK, $glib_inet_includes, glib_failed=true) +GLIB_CHECK_VALUE(MSG_OOB, $glib_inet_includes, glib_failed=true) +GLIB_CHECK_VALUE(MSG_DONTROUTE, $glib_inet_includes, glib_failed=true) +if $glib_failed ; then + AC_MSG_ERROR([Could not determine values for MSG_* constants]) +fi + +AC_CHECK_FUNCS(getprotobyname_r endservent) +AC_CHECK_HEADERS([netdb.h wspiapi.h]) + +# For gio/libasyncns +if test $glib_native_win32 = no; then + AC_CHECK_FUNCS(strndup setresuid setreuid) + AC_CHECK_HEADERS(sys/prctl.h arpa/nameser_compat.h) + + # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 + AC_MSG_CHECKING([for res_query]) + AC_TRY_LINK([#include +#include +#include +#include ], + [res_query("test", 0, 0, (void *)0, 0);], + [AC_MSG_RESULT([yes])], + [save_libs="$LIBS" + LIBS="-lresolv $LIBS" + AC_TRY_LINK([#include +#include +#include +#include ], + [res_query("test", 0, 0, (void *)0, 0);], + [AC_MSG_RESULT([in -lresolv]) + LIBASYNCNS_LIBADD="-lresolv"], + [LIBS="-lbind $save_libs" + AC_TRY_LINK([#include ], + [res_query("test", 0, 0, (void *)0, 0);], + [AC_MSG_RESULT([in -lbind]) + LIBASYNCNS_LIBADD="-lbind"], + [AC_MSG_ERROR(not found)])]) + LIBS="$save_libs"]) + AC_SUBST(LIBASYNCNS_LIBADD) +fi + +case $host in + *-*-solaris* ) + AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, Needed to get declarations for msg_control and msg_controllen on Solaris) + AC_DEFINE(_XOPEN_SOURCE, 2, Needed to get declarations for msg_control and msg_controllen on Solaris) + AC_DEFINE(__EXTENSIONS__, 1, Needed to get declarations for msg_control and msg_controllen on Solaris) + ;; +esac + +dnl +dnl if statfs() takes 2 arguments (Posix) or 4 (Solaris) +dnl +if test "$ac_cv_func_statfs" = yes ; then + AC_MSG_CHECKING([number of arguments to statfs()]) + AC_TRY_COMPILE([#include + #ifdef HAVE_SYS_PARAM_H + #include + #endif + #ifdef HAVE_SYS_VFS_H + #include + #endif + #ifdef HAVE_SYS_MOUNT_H + #include + #endif + #ifdef HAVE_SYS_STATFS_H + #include + #endif], [struct statfs st; + statfs(NULL, &st);],[ + AC_MSG_RESULT([2]) + AC_DEFINE(STATFS_ARGS, 2, [Number of arguments to statfs()])],[ + AC_TRY_COMPILE([#include + #ifdef HAVE_SYS_PARAM_H + #include + #endif + #ifdef HAVE_SYS_VFS_H + #include + #endif + #ifdef HAVE_SYS_MOUNT_H + #include + #endif + #ifdef HAVE_SYS_STATFS_H + #include + #endif], [struct statfs st; + statfs(NULL, &st, sizeof (st), 0);],[ + AC_MSG_RESULT([4]) + AC_DEFINE(STATFS_ARGS, 4, [Number of arguments to statfs()])],[ + AC_MSG_RESULT(unknown) + AC_MSG_ERROR([unable to determine number of arguments to statfs()])])]) +fi + +# +# Check whether to use an included printf +# + +AC_ARG_ENABLE(included-printf, + [AC_HELP_STRING([--enable-included-printf], + [use included printf [default=auto]])], + enable_included_printf="$enableval") + +need_included_printf=no +if test "x$enable_included_printf" = "xyes" ; then + need_included_printf=yes +fi +if test "$ac_cv_func_vsnprintf_c99" != "yes" ; then + need_included_printf=yes +fi +if test "$ac_cv_func_printf_unix98" != "yes" ; then + need_included_printf=yes +fi +if test "x$ac_cv_sizeof_long_long" = "x8" && + test -z "$glib_cv_long_long_format" ; then + need_included_printf=yes +fi + +if test "x$enable_included_printf" = "xno" && + test "x$need_included_printf" = "xyes" ; then + AC_MSG_ERROR([ +*** Your C library's printf doesn't appear to have the features that +*** GLib needs, but you specified --enable-included-printf=no.]) +fi + +enable_included_printf=$need_included_printf + +AM_CONDITIONAL(HAVE_GOOD_PRINTF, test "$enable_included_printf" != "yes") +if test "$enable_included_printf" != "yes" ; then + AC_DEFINE(HAVE_GOOD_PRINTF,1,[define to use system printf]) +else + if test -z "$glib_cv_long_long_format" ; then + glib_cv_long_long_format="ll" + fi + AC_DEFINE(HAVE_VASPRINTF,1) +fi + +# Checks needed for gnulib vasnprintf +bh_C_SIGNED +jm_AC_TYPE_LONG_LONG +gt_TYPE_LONGDOUBLE +gt_TYPE_WCHAR_T +gt_TYPE_WINT_T +AC_TYPE_SIZE_T +AC_CHECK_TYPES(ptrdiff_t) +jm_AC_TYPE_INTMAX_T +AC_CHECK_FUNCS([snprintf wcslen]) +AC_FUNC_SNPRINTF_C99 + +# Check if bcopy can be used for overlapping copies, if memmove isn't found. +# The check is borrowed from the PERL Configure script. +if test "$ac_cv_func_memmove" != "yes"; then + AC_CACHE_CHECK(whether bcopy can handle overlapping copies, + glib_cv_working_bcopy,[AC_TRY_RUN([ + int main() { + char buf[128], abc[128], *b; + int len, off, align; + bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36); + for (align = 7; align >= 0; align--) { + for (len = 36; len; len--) { + b = buf+align; bcopy(abc, b, len); + for (off = 1; off <= len; off++) { + bcopy(b, b+off, len); bcopy(b+off, b, len); + if (bcmp(b, abc, len)) return(1); + } + } + } + return(0); + }],glib_cv_working_bcopy=yes,glib_cv_working_bcopy=no)]) + + GLIB_ASSERT_SET(glib_cv_working_bcopy) + if test "$glib_cv_working_bcopy" = "yes"; then + AC_DEFINE(HAVE_WORKING_BCOPY,1,[Have a working bcopy]) + fi +fi + +# Check for sys_errlist +AC_MSG_CHECKING(for sys_errlist) +AC_TRY_LINK(, [ +extern char *sys_errlist[]; +extern int sys_nerr; +sys_errlist[sys_nerr-1][0] = 0; +], glib_ok=yes, glib_ok=no) +AC_MSG_RESULT($glib_ok) +if test "$glib_ok" = "no"; then + AC_DEFINE(NO_SYS_ERRLIST,1,[global 'sys_errlist' not found]) +fi + +# Check for sys_siglist +AC_MSG_CHECKING(for sys_siglist) +AC_TRY_LINK(, [ +extern char *sys_siglist[]; +exit (sys_siglist[0]); +], glib_ok=yes, glib_ok=no) +AC_MSG_RESULT($glib_ok) +if test "$glib_ok" = "no"; then + AC_DEFINE(NO_SYS_SIGLIST,1,[global 'sys_siglist' not found]) +fi + +# Check for sys_siglist decl (see Tue Jan 19 00:44:24 1999 in changelog) +AC_MSG_CHECKING(for sys_siglist declaration) +AC_TRY_COMPILE([#include ], [ +strlen (sys_siglist[0]); +], glib_ok=yes, glib_ok=no) +AC_MSG_RESULT($glib_ok) +if test "$glib_ok" = "no"; then + AC_DEFINE(NO_SYS_SIGLIST_DECL,1,[global 'sys_siglist' not declared]) +fi + +# Check if needs to be included for fd_set +AC_MSG_CHECKING([for fd_set]) +AC_TRY_COMPILE([#include ], + [fd_set readMask, writeMask;], gtk_ok=yes, gtk_ok=no) +if test "$gtk_ok" = "yes"; then + AC_MSG_RESULT([yes, found in sys/types.h]) +else + AC_EGREP_HEADER(fd_set, sys/select.h, gtk_ok=yes) + if test "$gtk_ok" = "yes"; then + # *** FIXME: give it a different name + AC_DEFINE(HAVE_SYS_SELECT_H,1,[found fd_set in sys/select.h]) + AC_MSG_RESULT([yes, found in sys/select.h]) + else + AC_DEFINE(NO_FD_SET,1,[didn't find fd_set]) + AC_MSG_RESULT(no) + fi +fi + +dnl *** check for sane realloc() *** +AC_CACHE_CHECK([whether realloc (NULL,) will work],glib_cv_sane_realloc,[ + AC_TRY_RUN([#include + int main() { + return realloc (0, sizeof (int)) == 0; + }], + [glib_cv_sane_realloc=yes], + [glib_cv_sane_realloc=no], + [glib_cv_sane_realloc=yes]) +]) +if test x$glib_cv_sane_realloc = xyes; then + AC_DEFINE(REALLOC_0_WORKS,1,[whether realloc (NULL,) works]) +fi + +dnl Check for nl_langinfo and CODESET +AC_CACHE_CHECK([for nl_langinfo (CODESET)],glib_cv_langinfo_codeset,[ + AC_TRY_COMPILE([#include ], + [char *codeset = nl_langinfo (CODESET);], + [glib_cv_langinfo_codeset=yes], + [glib_cv_langinfo_codeset=no])]) +if test x$glib_cv_langinfo_codeset = xyes; then + AC_DEFINE(HAVE_CODESET,1,[Have nl_langinfo (CODESET)]) +fi + +dnl **************************************** +dnl *** posix_memalign *** +dnl **************************************** +AC_MSG_CHECKING(for a compliant posix_memalign() implementation) +AC_CACHE_VAL(glib_cv_compliant_posix_memalign,[ + glib_cv_compliant_posix_memalign=0 + if test "$ac_cv_func_posix_memalign" = "yes" ; then + AC_TRY_RUN([ + #define _XOPEN_SOURCE 600 + #include /* posix_memalign() should be defined here */ + /* some systems break if #include used */ + static void test_memalign (size_t boundary, size_t size) { + void *mem = 0; + if (posix_memalign (&mem, boundary, size) != 0 || !mem) + exit (1); + else + free (mem); + } + int main() { + test_memalign ( 128, 128 - 2 * sizeof (void*)); + test_memalign ( 256, 256 - 2 * sizeof (void*)); + test_memalign ( 512, 512 - 2 * sizeof (void*)); + test_memalign ( 1024, 1024 - 2 * sizeof (void*)); + test_memalign ( 2048, 2048 - 2 * sizeof (void*)); + test_memalign ( 4096, 4096 - 2 * sizeof (void*)); + test_memalign ( 8192, 8192 - 2 * sizeof (void*)); + test_memalign (16384, 16384 - 2 * sizeof (void*)); + test_memalign (32768, 32768 - 2 * sizeof (void*)); + exit (0); /* success */ + } + ], + [glib_cv_compliant_posix_memalign=1], [], [:]) + : + fi + ]) +if test "$glib_cv_compliant_posix_memalign" = "1"; then + AC_MSG_RESULT(yes) + AC_DEFINE(POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS, 1, [define if posix_memalign() can allocate any size]) +else + AC_MSG_RESULT(no) +fi + + +dnl **************************************** +dnl *** strlcpy/strlcat *** +dnl **************************************** +# Check for strlcpy +AC_CACHE_CHECK([for OpenBSD strlcpy/strlcat],glib_cv_have_strlcpy,[ +AC_TRY_RUN([#include +#include +int main() { + char p[10]; + (void) strlcpy (p, "hi", 10); + if (strlcat (p, "bye", 0) != 3) + return 1; + return 0; +}], glib_cv_have_strlcpy=yes, + glib_cv_have_strlcpy=no, + glib_cv_have_strlcpy=no)]) +if test "$glib_cv_have_strlcpy" = "yes"; then + AC_DEFINE(HAVE_STRLCPY,1,[Have functions strlcpy and strlcat]) +fi + + +dnl ********************** +dnl *** va_copy checks *** +dnl ********************** +dnl we currently check for all three va_copy possibilities, so we get +dnl all results in config.log for bug reports. +AC_CACHE_CHECK([for an implementation of va_copy()],glib_cv_va_copy,[ + AC_LINK_IFELSE([#include +#include + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + va_copy (args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { + f (0, 42); + return 0; + }], + [glib_cv_va_copy=yes], + [glib_cv_va_copy=no]) +]) +AC_CACHE_CHECK([for an implementation of __va_copy()],glib_cv___va_copy,[ + AC_LINK_IFELSE([#include +#include + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + __va_copy (args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { + f (0, 42); + return 0; + }], + [glib_cv___va_copy=yes], + [glib_cv___va_copy=no]) +]) + +if test "x$glib_cv_va_copy" = "xyes"; then + g_va_copy_func=va_copy +else if test "x$glib_cv___va_copy" = "xyes"; then + g_va_copy_func=__va_copy +fi +fi + +if test -n "$g_va_copy_func"; then + AC_DEFINE_UNQUOTED(G_VA_COPY,$g_va_copy_func,[A 'va_copy' style function]) +fi + +AC_CACHE_CHECK([whether va_lists can be copied by value],glib_cv_va_val_copy,[ + AC_TRY_RUN([#include +#include + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + args2 = args1; + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { + f (0, 42); + return 0; + }], + [glib_cv_va_val_copy=yes], + [glib_cv_va_val_copy=no], + [glib_cv_va_val_copy=yes]) +]) + +if test "x$glib_cv_va_val_copy" = "xno"; then + AC_DEFINE(G_VA_COPY_AS_ARRAY,1, ['va_lists' cannot be copies as values]) +fi + +dnl *********************** +dnl *** g_module checks *** +dnl *********************** +G_MODULE_LIBS= +G_MODULE_LIBS_EXTRA= +G_MODULE_PLUGIN_LIBS= +if test x"$glib_native_win32" = xyes; then + dnl No use for this on Win32 + G_MODULE_LDFLAGS= +else + export SED + G_MODULE_LDFLAGS=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` +fi +dnl G_MODULE_IMPL= don't reset, so cmd-line can override +G_MODULE_NEED_USCORE=0 +G_MODULE_BROKEN_RTLD_GLOBAL=0 +G_MODULE_HAVE_DLERROR=0 +dnl *** force native WIN32 shared lib loader +if test -z "$G_MODULE_IMPL"; then + case "$host" in + *-*-mingw*|*-*-cygwin*) G_MODULE_IMPL=G_MODULE_IMPL_WIN32 ;; + esac +fi +dnl *** force native AIX library loader +dnl *** dlopen() filepath must be of the form /path/libname.a(libname.so) +if test -z "$G_MODULE_IMPL"; then + case "$host" in + *-*-aix*) G_MODULE_IMPL=G_MODULE_IMPL_AR ;; + esac +fi +dnl *** dlopen() and dlsym() in system libraries +if test -z "$G_MODULE_IMPL"; then + AC_CHECK_FUNC(dlopen, + [AC_CHECK_FUNC(dlsym, + [G_MODULE_IMPL=G_MODULE_IMPL_DL],[])], + []) +fi +dnl *** load_image (BeOS) +if test -z "$G_MODULE_IMPL" && test "x$glib_native_beos" = "xyes"; then + AC_CHECK_LIB(root, load_image, + [G_MODULE_LIBS="-lbe -lroot -lglib-2.0 " + G_MODULE_LIBS_EXTRA="-L\$(top_builddir_full)/.libs" + G_MODULE_PLUGIN_LIBS="-L\$(top_builddir_full)/gmodule/.libs -lgmodule" + G_MODULE_IMPL=G_MODULE_IMPL_BEOS], + []) +fi +dnl *** NSLinkModule (dyld) in system libraries (Darwin) +if test -z "$G_MODULE_IMPL"; then + AC_CHECK_FUNC(NSLinkModule, + [G_MODULE_IMPL=G_MODULE_IMPL_DYLD + G_MODULE_NEED_USCORE=1], + []) +fi +dnl *** dlopen() and dlsym() in libdl +if test -z "$G_MODULE_IMPL"; then + AC_CHECK_LIB(dl, dlopen, + [AC_CHECK_LIB(dl, dlsym, + [G_MODULE_LIBS=-ldl + G_MODULE_IMPL=G_MODULE_IMPL_DL],[])], + []) +fi +dnl *** shl_load() in libdld (HP-UX) +if test -z "$G_MODULE_IMPL"; then + AC_CHECK_LIB(dld, shl_load, + [G_MODULE_LIBS=-ldld + G_MODULE_IMPL=G_MODULE_IMPL_DLD], + []) +fi +dnl *** additional checks for G_MODULE_IMPL_DL +if test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL"; then + LIBS_orig="$LIBS" + LDFLAGS_orig="$LDFLAGS" + LIBS="$G_MODULE_LIBS $LIBS" + LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS" +dnl *** check for OSF1/5.0 RTLD_GLOBAL brokenness + echo "void glib_plugin_test(void) { }" > plugin.c + ${SHELL} ./libtool --mode=compile ${CC} -shared \ + -export-dynamic -o plugin.o plugin.c 2>&1 >/dev/null + AC_CACHE_CHECK([for RTLD_GLOBAL brokenness], + glib_cv_rtldglobal_broken,[ + AC_TRY_RUN([ +#include +#ifndef RTLD_GLOBAL +# define RTLD_GLOBAL 0 +#endif +#ifndef RTLD_LAZY +# define RTLD_LAZY 0 +#endif +int glib_plugin_test; +int main () { + void *handle, *global, *local; + global = &glib_plugin_test; + handle = dlopen ("./.libs/plugin.o", RTLD_GLOBAL | RTLD_LAZY); + if (!handle) return 0; + local = dlsym (handle, "glib_plugin_test"); + return global == local; +} ], + [glib_cv_rtldglobal_broken=no], + [glib_cv_rtldglobal_broken=yes], + [glib_cv_rtldglobal_broken=no]) + rm -f plugin.c plugin.o plugin.lo .libs/plugin.o + rmdir .libs 2>/dev/null + ]) + if test "x$glib_cv_rtldglobal_broken" = "xyes"; then + G_MODULE_BROKEN_RTLD_GLOBAL=1 + else + G_MODULE_BROKEN_RTLD_GLOBAL=0 + fi +dnl *** check whether we need preceeding underscores + AC_CACHE_CHECK([for preceeding underscore in symbols], + glib_cv_uscore,[ + AC_TRY_RUN([#include + int glib_underscore_test (void) { return 42; } + int main() { + void *f1 = (void*)0, *f2 = (void*)0, *handle; + handle = dlopen ((void*)0, 0); + if (handle) { + f1 = dlsym (handle, "glib_underscore_test"); + f2 = dlsym (handle, "_glib_underscore_test"); + } return (!f2 || f1); + }], + [glib_cv_uscore=yes], + [glib_cv_uscore=no], + []) + rm -f plugin.c plugin.$ac_objext plugin.lo + ]) + GLIB_ASSERT_SET(glib_cv_uscore) + if test "x$glib_cv_uscore" = "xyes"; then + G_MODULE_NEED_USCORE=1 + else + G_MODULE_NEED_USCORE=0 + fi + + LDFLAGS="$LDFLAGS_orig" +dnl *** check for having dlerror() + AC_CHECK_FUNC(dlerror, + [G_MODULE_HAVE_DLERROR=1], + [G_MODULE_HAVE_DLERROR=0]) + LIBS="$LIBS_orig" +fi +dnl *** done, have we got an implementation? +if test -z "$G_MODULE_IMPL"; then + G_MODULE_IMPL=0 + G_MODULE_SUPPORTED=false +else + G_MODULE_SUPPORTED=true +fi + +AC_MSG_CHECKING(for the suffix of module shared libraries) +export SED +shrext_cmds=`./libtool --config | grep '^shrext_cmds='` +eval $shrext_cmds +module=yes eval std_shrext=$shrext_cmds +# chop the initial dot +glib_gmodule_suffix=`echo $std_shrext | sed 's/^\.//'` +AC_MSG_RESULT(.$glib_gmodule_suffix) +# any reason it may fail? +if test "x$glib_gmodule_suffix" = x; then + AC_MSG_ERROR(Cannot determine shared library suffix from libtool) +fi + +AC_SUBST(G_MODULE_SUPPORTED) +AC_SUBST(G_MODULE_IMPL) +AC_SUBST(G_MODULE_LIBS) +AC_SUBST(G_MODULE_LIBS_EXTRA) +AC_SUBST(G_MODULE_PLUGIN_LIBS) +AC_SUBST(G_MODULE_LDFLAGS) +AC_SUBST(G_MODULE_HAVE_DLERROR) +AC_SUBST(G_MODULE_BROKEN_RTLD_GLOBAL) +AC_SUBST(G_MODULE_NEED_USCORE) +AC_SUBST(GLIB_DEBUG_FLAGS) + +dnl ********************** +dnl *** g_spawn checks *** +dnl ********************** + +AC_MSG_CHECKING(for gspawn implementation) +case "$host" in + *-*-mingw*) + GSPAWN=gspawn-win32.lo + ;; + *) + GSPAWN=gspawn.lo + ;; +esac +AC_MSG_RESULT($GSPAWN) +AC_SUBST(GSPAWN) + +dnl ************************* +dnl *** GIOChannel checks *** +dnl ************************* + +AC_MSG_CHECKING(for GIOChannel implementation) +case "$host" in + *-*-mingw*) + GIO=giowin32.lo + ;; + *) + GIO=giounix.lo + ;; +esac +AC_MSG_RESULT($GIO) +AC_SUBST(GIO) + +dnl ********************************* +dnl *** Directory for GIO modules *** +dnl ********************************* + +AC_ARG_WITH(gio-module-dir, + [AC_HELP_STRING([--with-gio-module-dir=PATH], + [Load gio modules from this directory [LIBDIR/gio/modules]])], + [], + [with_gio_module_dir='${libdir}/gio/modules']) +GIO_MODULE_DIR=$with_gio_module_dir +AC_SUBST(GIO_MODULE_DIR) + +dnl ********************************** +dnl *** Check for libselinux (GIO) *** +dnl ********************************** +AC_ARG_ENABLE(selinux, [ --disable-selinux build without selinux support]) +msg_selinux=no +SELINUX_LIBS= +if test "x$enable_selinux" != "xno"; then + + AC_CHECK_LIB(selinux, is_selinux_enabled, + [AC_CHECK_HEADERS(selinux/selinux.h, + [AC_CHECK_LIB(selinux, lgetfilecon_raw, + [AC_DEFINE(HAVE_SELINUX, 1, [Define to 1 if libselinux is available]) + SELINUX_LIBS="-lselinux" + msg_selinux=yes]) + ]) + ]) +fi +AC_SUBST(SELINUX_LIBS) + +dnl ***************************** +dnl ** Check for inotify (GIO) ** +dnl ***************************** +inotify_support=no +AC_CHECK_HEADERS([sys/inotify.h], +[ + inotify_support=yes + AC_CHECK_FUNCS(inotify_init1) +]) + +AM_CONDITIONAL(HAVE_INOTIFY, [test "$inotify_support" = "yes"]) + +dnl ********************************* +dnl ** Check for Solaris FEN (GIO) ** +dnl ********************************* +fen_support=no +AC_COMPILE_IFELSE([ +#include +#ifndef PORT_SOURCE_FILE +#error "Please upgrade to Nevada 72 or above to suppoert FEN" +#endif +int main() { return 0; } ], +[ + fen_support=yes +],) + +AM_CONDITIONAL(HAVE_FEN, [test "$fen_support" = "yes"]) + +dnl **************************** +dnl *** Checks for FAM (GIO) *** +dnl **************************** + +should_disable_fam=no + +AC_ARG_ENABLE(fam, [ --disable-fam build without enabling fam for file system monitoring], + [ + if test "x$enable_fam" = "xno"; then + should_disable_fam=yes + echo "Not building FAM support" + fi + ] + ) +fam_support=no +FAM_LIBS= +if test "x$should_disable_fam" = "xno"; then +AC_CHECK_LIB(fam, FAMOpen, + [AC_CHECK_HEADERS(fam.h, + [AC_DEFINE(HAVE_FAM, [], [Define if we have FAM]) + AC_CHECK_LIB(fam, FAMNoExists, + AC_DEFINE(HAVE_FAM_NO_EXISTS, [], [Define if we have FAMNoExists in fam])) + FAM_LIBS="-lfam"] + fam_support=yes, + AC_MSG_WARN(*** FAM support will not be built (header files not found) ***))], + AC_MSG_WARN(*** FAM support will not be built (FAM library not found) ***)) +AC_SUBST(FAM_LIBS) +fi +AM_CONDITIONAL(HAVE_FAM, [test "$fam_support" = "yes"]) + + +dnl ***************************** +dnl *** Check for xattr (GIO) *** +dnl ***************************** +AC_ARG_ENABLE(xattr, [ --disable-xattr build without xattr support]) +msg_xattr=no +XATTR_LIBS= +if test "x$enable_xattr" != "xno"; then + +dnl either glibc or libattr can provide xattr support + +dnl for both of them, we check for getxattr being in +dnl the library and a valid xattr header. + +dnl try glibc + AC_CHECK_LIB(c, getxattr, + [AC_CHECK_HEADERS(sys/xattr.h, + [AC_DEFINE(HAVE_XATTR, 1, [Define to 1 if xattr is available]) + msg_xattr=yes]) + ]) + + if test "x$msg_xattr" != "xyes"; then +dnl failure. try libattr + AC_CHECK_LIB(attr, getxattr, + [AC_CHECK_HEADERS(attr/xattr.h, + [AC_DEFINE(HAVE_XATTR, 1, [Define to 1 if xattr is available]) + XATTR_LIBS="-lattr" + msg_xattr=yes]) + ]) + fi + + if test "x$msg_xattr" = "xyes"; then + AC_MSG_CHECKING([for XATTR_NOFOLLOW]) + AC_TRY_COMPILE([ + #include + #ifdef HAVE_SYS_TYPES_H + #include + #endif + #ifdef HAVE_SYS_XATTR_H + #include + #elif HAVE_ATTR_XATTR_H + #include + #endif + ], + [ssize_t len = getxattr("", "", NULL, 0, 0, XATTR_NOFOLLOW);], + [ + AC_DEFINE([HAVE_XATTR_NOFOLLOW], [1], [Define to 1 if xattr API uses XATTR_NOFOLLOW]) + AC_MSG_RESULT([yes]) + ], + [AC_MSG_RESULT([no])] + ) + fi + +fi +AC_SUBST(XATTR_LIBS) + +dnl **************************************** +dnl *** platform dependent source checks *** +dnl **************************************** + +AC_MSG_CHECKING(for platform-dependent source) +case "$host" in + *-*-cygwin*|*-*-mingw*) + PLATFORMDEP=gwin32.lo + ;; + *) + PLATFORMDEP= + ;; +esac +AC_MSG_RESULT($PLATFORMDEP) +AC_SUBST(PLATFORMDEP) + +AC_MSG_CHECKING([whether to compile timeloop]) +case "$host" in + *-*-cygwin*|*-*-mingw*|*-*-minix) + enable_timeloop=no + ;; + *) + enable_timeloop=yes + ;; +esac +AC_MSG_RESULT($enable_timeloop) +AM_CONDITIONAL(ENABLE_TIMELOOP, test x$enable_timeloop = xyes) + +AC_MSG_CHECKING([if building for some Win32 platform]) +case "$host" in + *-*-mingw*|*-*-cygwin*) + platform_win32=yes + ;; + *) + platform_win32=no + ;; +esac +AC_MSG_RESULT($platform_win32) +AM_CONDITIONAL(PLATFORM_WIN32, test x$platform_win32 = xyes) + +dnl *********************** +dnl *** g_thread checks *** +dnl *********************** + +AC_ARG_WITH(threads, + [AC_HELP_STRING([--with-threads=@<:@none/posix/dce/win32@:>@], + [specify a thread implementation to use])], + [if test "x$with_threads" = x; then + want_threads=yes + else + want_threads=$with_threads + fi], + [want_threads=yes]) +if test "x$enable_threads" = "xno"; then + want_threads=no +fi + +dnl error and warning message +dnl ************************* + +THREAD_NO_IMPLEMENTATION="You do not have any known thread system on your + computer. GLib will not have a default thread implementation." + +FLAG_DOES_NOT_WORK="I can't find the MACRO to enable thread safety on your + platform (normally it's "_REENTRANT"). I'll not use any flag on + compilation now, but then your programs might not work. + Please provide information on how it is done on your system." + +LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation + " + +LIBS_NOT_FOUND_2=". Please choose another thread implementation or + provide information on your thread implementation. + You can also run 'configure --disable-threads' + to compile without thread support." + +FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)' + functions will not be MT-safe during their first call because + there is no working 'getpwuid_r' on your system." + +FUNC_NO_LOCALTIME_R="the 'g_date_set_time' function will not be MT-safe + because there is no 'localtime_r' on your system." + +POSIX_NO_YIELD="I can not find a yield functions for your platform. A rather + crude surrogate will be used. If you happen to know a + yield function for your system, please inform the GLib + developers." + +POSIX_NO_PRIORITIES="I can not find the minimal and maximal priorities for + threads on your system. Thus threads can only have the default + priority. If you happen to know these main/max + priorities, please inform the GLib developers." + +AIX_COMPILE_INFO="AIX's C compiler needs to be called by a different name, when + linking threaded applications. As GLib cannot do that + automatically, you will get an linkg error everytime you are + not using the right compiler. In that case you have to relink + with the right compiler. Ususally just '_r' is appended + to the compiler name." + +dnl determination of thread implementation +dnl *************************************** + +# have_threads=no means no thread support +# have_threads=none means no default thread implementation + +have_threads=no +if test "x$want_threads" = xyes || test "x$want_threads" = xposix \ + || test "x$want_threads" = xdce; then + # -D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE is for DG/UX + # -U_OSF_SOURCE is for Digital UNIX 4.0d + GTHREAD_COMPILE_IMPL_DEFINES="-D_POSIX4_DRAFT_SOURCE -D_POSIX4A_DRAFT10_SOURCE -U_OSF_SOURCE" + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + if test "x$have_threads" = xno; then + AC_TRY_COMPILE([#include ], + [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;], + have_threads=posix) + fi + if test "x$have_threads" = xno; then + AC_TRY_COMPILE([#include ], + [pthread_mutex_t m; + pthread_mutex_init (&m, pthread_mutexattr_default);], + have_threads=dce) + fi + # Tru64Unix requires -pthread to find pthread.h. See #103020 + CPPFLAGS="$CPPFLAGS -pthread" + if test "x$have_threads" = xno; then + AC_TRY_COMPILE([#include ], + [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;], + have_threads=posix) + fi + CPPFLAGS="$glib_save_CPPFLAGS" +fi +if test "x$want_threads" = xyes || test "x$want_threads" = xwin32; then + case $host in + *-*-mingw*) + have_threads=win32 + ;; + esac +fi +if test "x$want_threads" = xnone; then + have_threads=none +fi + +AC_MSG_CHECKING(for thread implementation) + +if test "x$have_threads" = xno && test "x$want_threads" != xno; then + AC_MSG_RESULT(none available) + AC_MSG_WARN($THREAD_NO_IMPLEMENTATION) +else + AC_MSG_RESULT($have_threads) +fi + + +dnl determination of G_THREAD_CFLAGS +dnl ******************************** + +G_THREAD_LIBS= +G_THREAD_LIBS_EXTRA= +G_THREAD_CFLAGS= + +dnl +dnl Test program for basic POSIX threads functionality +dnl +m4_define([glib_thread_test],[ +#include +int check_me = 0; +void* func(void* data) {check_me = 42; return &check_me;} +int main() + { pthread_t t; + void *ret; + pthread_create (&t, $1, func, 0); + pthread_join (t, &ret); + return (check_me != 42 || ret != &check_me); +}]) + +dnl +dnl Test program for sched_get_priority_min() +dnl +m4_define([glib_sched_priority_test],[ +#include +#include +int main() { + errno = 0; + return sched_get_priority_min(SCHED_OTHER)==-1 + && errno != 0; +}]) + +if test x"$have_threads" != xno; then + + if test x"$have_threads" = xposix; then + # First we test for posix, whether -pthread or -pthreads do the trick as + # both CPPFLAG and LIBS. + # One of them does for most gcc versions and some other platforms/compilers + # too and could be considered as the canonical way to go. + case $host in + *-*-cygwin*|*-*-darwin*) + # skip cygwin and darwin -pthread or -pthreads test + ;; + *-solaris*) + # These compiler/linker flags work with both Sun Studio and gcc + # Sun Studio expands -mt to -D_REENTRANT and -lthread + # gcc expands -pthreads to -D_REENTRANT -D_PTHREADS -lpthread + G_THREAD_CFLAGS="-D_REENTRANT -D_PTHREADS" + G_THREAD_LIBS="-lpthread -lthread" + ;; + *) + for flag in pthread pthreads mt; do + glib_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -$flag" + AC_TRY_RUN(glib_thread_test(0), + glib_flag_works=yes, + glib_flag_works=no, + [AC_LINK_IFELSE(glib_thread_test(0), + glib_flag_works=yes, + glib_flag_works=no)]) + CFLAGS="$glib_save_CFLAGS" + if test $glib_flag_works = yes ; then + G_THREAD_CFLAGS=-$flag + G_THREAD_LIBS=-$flag + break; + fi + done + ;; + esac + fi + + if test x"$G_THREAD_CFLAGS" = x; then + + # The canonical -pthread[s] does not work. Try something different. + + case $host in + *-aix*) + if test x"$GCC" = xyes; then + # GCC 3.0 and above needs -pthread. + # Should be coverd by the case above. + # GCC 2.x and below needs -mthreads + G_THREAD_CFLAGS="-mthreads" + G_THREAD_LIBS=$G_THREAD_CFLAGS + else + # We are probably using the aix compiler. Normaly a + # program would have to be compiled with the _r variant + # of the corresponding compiler, but we as GLib cannot + # do that: but the good news is that for compiling the + # only difference is the added -D_THREAD_SAFE compile + # option. This is according to the "C for AIX User's + # Guide". + G_THREAD_CFLAGS="-D_THREAD_SAFE" + fi + ;; + *-dg-dgux*) # DG/UX + G_THREAD_CFLAGS="-D_REENTRANT -D_POSIX4A_DRAFT10_SOURCE" + ;; + *-osf*) + # So we are using dce threads. posix threads are already + # catched above. + G_THREAD_CFLAGS="-threads" + G_THREAD_LIBS=$G_THREAD_CFLAGS + ;; + *-sysv5uw7*) # UnixWare 7 + # We are not using gcc with -pthread. Catched above. + G_THREAD_CFLAGS="-Kthread" + G_THREAD_LIBS=$G_THREAD_CFLAGS + ;; + *-mingw*) + # No flag needed when using MSVCRT.DLL + G_THREAD_CFLAGS="" + ;; + *) + G_THREAD_CFLAGS="-D_REENTRANT" # good default guess otherwise + ;; + esac + + fi + + # if we are not finding the localtime_r function, then we probably are + # not using the proper multithread flag + + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" + + # First we test, whether localtime_r is declared in time.h + # directly. Then we test whether a macro localtime_r exists, in + # which case localtime_r in the test program is replaced and thus + # if we still find localtime_r in the output, it is not defined as + # a macro. + + AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include ], , + [AC_EGREP_CPP([[^a-zA-Z1-9_]localtime_r[^a-zA-Z1-9_]], [#include + localtime_r(a,b)], + AC_MSG_WARN($FLAG_DOES_NOT_WORK))]) + + CPPFLAGS="$glib_save_CPPFLAGS" + + AC_MSG_CHECKING(thread related cflags) + AC_MSG_RESULT($G_THREAD_CFLAGS) + CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS" +fi + +dnl determination of G_THREAD_LIBS +dnl ****************************** + +mutex_has_default=no +case $have_threads in + posix|dce) + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + if test x"$G_THREAD_LIBS" = x; then + case $host in + *-aix*) + # We are not using gcc (would have set G_THREAD_LIBS) and thus + # probably using the aix compiler. + AC_MSG_WARN($AIX_COMPILE_INFO) + ;; + *) + G_THREAD_LIBS=error + glib_save_LIBS="$LIBS" + for thread_lib in "" pthread pthread32 pthreads thread dce; do + if test x"$thread_lib" = x; then + add_thread_lib="" + IN="" + else + add_thread_lib="-l$thread_lib" + IN=" in -l$thread_lib" + fi + if test x"$have_threads" = xposix; then + defattr=0 + else + defattr=pthread_attr_default + fi + + LIBS="$add_thread_lib $glib_save_LIBS" + + AC_MSG_CHECKING(for pthread_create/pthread_join$IN) + AC_TRY_RUN(glib_thread_test($defattr), + glib_result=yes, + glib_result=no, + [AC_LINK_IFELSE(glib_thread_test($defattr), + glib_result=yes, + glib_result=no)]) + AC_MSG_RESULT($glib_result) + + if test "$glib_result" = "yes" ; then + G_THREAD_LIBS="$add_thread_lib" + break + fi + done + if test "x$G_THREAD_LIBS" = xerror; then + AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2) + fi + LIBS="$glib_save_LIBS" + ;; + esac + fi + + glib_save_LIBS="$LIBS" + for thread_lib in "" rt rte; do + if test x"$thread_lib" = x; then + add_thread_lib="" + IN="" + else + add_thread_lib="-l$thread_lib" + IN=" in -l$thread_lib" + fi + LIBS="$add_thread_lib $glib_save_LIBS" + + AC_MSG_CHECKING(for sched_get_priority_min$IN) + AC_TRY_RUN(glib_sched_priority_test, + glib_result=yes, + glib_result=no, + [AC_LINK_IFELSE(glib_sched_priority_test, + glib_result=yes, + glib_result=no)]) + AC_MSG_RESULT($glib_result) + + if test "$glib_result" = "yes" ; then + G_THREAD_LIBS="$G_THREAD_LIBS $add_thread_lib" + posix_priority_min="sched_get_priority_min(SCHED_OTHER)" + posix_priority_max="sched_get_priority_max(SCHED_OTHER)" + break + fi + done + LIBS="$glib_save_LIBS" + mutex_has_default=yes + mutex_default_type='pthread_mutex_t' + mutex_default_init='PTHREAD_MUTEX_INITIALIZER' + mutex_header_file='pthread.h' + if test "x$have_threads" = "xposix"; then + g_threads_impl="POSIX" + else + g_threads_impl="DCE" + have_threads="posix" + fi + AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES) + CPPFLAGS="$glib_save_CPPFLAGS" + ;; + win32) + g_threads_impl="WIN32" + ;; + none|no) + g_threads_impl="NONE" + ;; + *) + g_threads_impl="NONE" + G_THREAD_LIBS=error + ;; +esac + +if test "x$G_THREAD_LIBS" = xerror; then + AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2) +fi + +case $host in + *-*-beos*) + G_THREAD_LIBS="-lbe -lroot -lglib-2.0 " + G_THREAD_LIBS_EXTRA="-L\$(top_builddir_full)/.libs" + ;; + *) + ;; +esac + +AC_MSG_CHECKING(thread related libraries) +AC_MSG_RESULT($G_THREAD_LIBS) + +dnl check for mt safe function variants and some posix functions +dnl ************************************************************ + +if test x"$have_threads" != xno; then + glib_save_LIBS="$LIBS" + # we are not doing the following for now, as this might require glib + # to always be linked with the thread libs on some platforms. + # LIBS="$LIBS $G_THREAD_LIBS" + AC_CHECK_FUNCS(localtime_r gmtime_r) + if test "$ac_cv_header_pwd_h" = "yes"; then + AC_CACHE_CHECK([for posix getpwuid_r], + ac_cv_func_posix_getpwuid_r, + [AC_TRY_RUN([ +#include +#include +int main () { + char buffer[10000]; + struct passwd pwd, *pwptr = &pwd; + int error; + errno = 0; + error = getpwuid_r (0, &pwd, buffer, + sizeof (buffer), &pwptr); + return (error < 0 && errno == ENOSYS) + || error == ENOSYS; +} ], + [ac_cv_func_posix_getpwuid_r=yes], + [ac_cv_func_posix_getpwuid_r=no])]) + GLIB_ASSERT_SET(ac_cv_func_posix_getpwuid_r) + if test "$ac_cv_func_posix_getpwuid_r" = yes; then + AC_DEFINE(HAVE_POSIX_GETPWUID_R,1, + [Have POSIX function getpwuid_r]) + else + AC_CACHE_CHECK([for nonposix getpwuid_r], + ac_cv_func_nonposix_getpwuid_r, + [AC_TRY_LINK([#include ], + [char buffer[10000]; + struct passwd pwd; + getpwuid_r (0, &pwd, buffer, + sizeof (buffer));], + [ac_cv_func_nonposix_getpwuid_r=yes], + [ac_cv_func_nonposix_getpwuid_r=no])]) + GLIB_ASSERT_SET(ac_cv_func_nonposix_getpwuid_r) + if test "$ac_cv_func_nonposix_getpwuid_r" = yes; then + AC_DEFINE(HAVE_NONPOSIX_GETPWUID_R,1, + [Have non-POSIX function getpwuid_r]) + fi + fi + fi + if test "$ac_cv_header_grp_h" = "yes"; then + AC_CACHE_CHECK([for posix getgrgid_r], + ac_cv_func_posix_getgrgid_r, + [AC_TRY_RUN([ +#include +#include +int main () { + char buffer[10000]; + struct group grp, *grpptr = &grp; + int error; + errno = 0; + error = getgrgid_r (0, &grp, buffer, + sizeof (buffer), &grpptr); + return (error < 0 && errno == ENOSYS) + || error == ENOSYS; +} ], + [ac_cv_func_posix_getgrgid_r=yes], + [ac_cv_func_posix_getgrgid_r=no])]) + GLIB_ASSERT_SET(ac_cv_func_posix_getgrgid_r) + if test "$ac_cv_func_posix_getgrgid_r" = yes; then + AC_DEFINE(HAVE_POSIX_GETGRGID_R,1, + [Have POSIX function getgrgid_r]) + else + AC_CACHE_CHECK([for nonposix getgrgid_r], + ac_cv_func_nonposix_getgrgid_r, + [AC_TRY_LINK([#include ], + [char buffer[10000]; + struct group grp; + getgrgid_r (0, &grp, buffer, + sizeof (buffer));], + [ac_cv_func_nonposix_getgrgid_r=yes], + [ac_cv_func_nonposix_getgrgid_r=no])]) + GLIB_ASSERT_SET(ac_cv_func_nonposix_getgrgid_r) + if test "$ac_cv_func_nonposix_getgrgid_r" = yes; then + AC_DEFINE(HAVE_NONPOSIX_GETGRGID_R,1, + [Have non-POSIX function getgrgid_r]) + fi + fi + fi + LIBS="$G_THREAD_LIBS $LIBS" + if test x"$have_threads" = xposix; then + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + dnl we might grow sizeof(pthread_t) later on, so use a dummy name here + GLIB_SIZEOF([#include ], pthread_t, system_thread) + # This is not AC_CHECK_FUNC to also work with function + # name mangling in header files. + AC_MSG_CHECKING(for pthread_attr_setstacksize) + AC_TRY_LINK([#include ], + [pthread_attr_t t; pthread_attr_setstacksize(&t,0)], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE,1, + [Have function pthread_attr_setstacksize])], + [AC_MSG_RESULT(no)]) + AC_MSG_CHECKING(for minimal/maximal thread priority) + if test x"$posix_priority_min" = x; then + AC_EGREP_CPP(PX_PRIO_MIN,[#include + PX_PRIO_MIN],,[ + posix_priority_min=PX_PRIO_MIN + posix_priority_max=PX_PRIO_MAX]) + fi + if test x"$posix_priority_min" = x; then + # AIX + AC_EGREP_CPP(PTHREAD_PRIO_MIN,[#include + PTHREAD_PRIO_MIN],,[ + posix_priority_min=PTHREAD_PRIO_MIN + posix_priority_max=PTHREAD_PRIO_MAX]) + fi + if test x"$posix_priority_min" = x; then + AC_EGREP_CPP(PRI_OTHER_MIN,[#include + PRI_OTHER_MIN],,[ + posix_priority_min=PRI_OTHER_MIN + posix_priority_max=PRI_OTHER_MAX]) + fi + if test x"$posix_priority_min" = x; then + AC_MSG_RESULT(none found) + AC_MSG_WARN($POSIX_NO_PRIORITIES) + posix_priority_min=-1 + posix_priority_max=-1 + else + AC_MSG_RESULT($posix_priority_min/$posix_priority_max) + AC_MSG_CHECKING(for pthread_setschedparam) + AC_TRY_LINK([#include ], + [pthread_t t; pthread_setschedparam(t, 0, NULL)], + [AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED(POSIX_MIN_PRIORITY,$posix_priority_min,[Minimum POSIX RT priority]) + AC_DEFINE_UNQUOTED(POSIX_MAX_PRIORITY,$posix_priority_max,[Maximum POSIX RT priority])], + [AC_MSG_RESULT(no) + AC_MSG_WARN($POSIX_NO_PRIORITIES)]) + fi + posix_yield_func=none + AC_MSG_CHECKING(for posix yield function) + for yield_func in sched_yield pthread_yield_np pthread_yield \ + thr_yield; do + AC_TRY_LINK([#include ], + [$yield_func()], + [posix_yield_func="$yield_func" + break]) + done + if test x"$posix_yield_func" = xnone; then + AC_MSG_RESULT(none found) + AC_MSG_WARN($POSIX_NO_YIELD) + posix_yield_func="g_usleep(1000)" + else + AC_MSG_RESULT($posix_yield_func) + posix_yield_func="$posix_yield_func()" + fi + AC_DEFINE_UNQUOTED(POSIX_YIELD_FUNC,$posix_yield_func,[The POSIX RT yield function]) + CPPFLAGS="$glib_save_CPPFLAGS" + + elif test x"$have_threads" = xwin32; then + # It's a pointer to a private struct + GLIB_SIZEOF(,struct _GThreadData *, system_thread) + fi + + LIBS="$glib_save_LIBS" + + # now spit out all the warnings. + if test "$ac_cv_func_posix_getpwuid_r" != "yes" && + test "$ac_cv_func_nonposix_getpwuid_r" != "yes"; then + AC_MSG_WARN($FUNC_NO_GETPWUID_R) + fi + if test "$ac_cv_func_localtime_r" != "yes"; then + AC_MSG_WARN($FUNC_NO_LOCALTIME_R) + fi +fi + +if test x"$glib_cv_sizeof_system_thread" = x; then + # use a pointer as a fallback. + GLIB_SIZEOF(,void *, system_thread) +fi + +# +# Hack to deal with: +# +# a) GCC < 3.3 for Linux doesn't include -lpthread when +# building shared libraries with linux. +# b) FreeBSD doesn't do this either. +# +case $host in + *-*-freebsd*|*-*-linux*) + G_THREAD_LIBS_FOR_GTHREAD="`echo $G_THREAD_LIBS | sed s/-pthread/-lpthread/`" + ;; + *) + G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS" + ;; +esac + +AM_CONDITIONAL(HAVE_THREADS, [test "$have_threads" != "none"]) +AC_DEFINE_UNQUOTED(G_THREAD_SOURCE,"gthread-$have_threads.c", + [Source file containing theread implementation]) +AC_SUBST(G_THREAD_CFLAGS) +AC_SUBST(G_THREAD_LIBS) +AC_SUBST(G_THREAD_LIBS_FOR_GTHREAD) +AC_SUBST(G_THREAD_LIBS_EXTRA) + +dnl ********************************************** +dnl *** GDefaultMutex setup and initialization *** +dnl ********************************************** +dnl +dnl if mutex_has_default = yes, we also got +dnl mutex_default_type, mutex_default_init and mutex_header_file +if test $mutex_has_default = yes ; then + glib_save_CPPFLAGS="$CPPFLAGS" + glib_save_LIBS="$LIBS" + LIBS="$G_THREAD_LIBS $LIBS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + GLIB_SIZEOF([#include <$mutex_header_file>], + $mutex_default_type, + gmutex) + GLIB_BYTE_CONTENTS([#include <$mutex_header_file>], + $mutex_default_type, + gmutex, + $glib_cv_sizeof_gmutex, + $mutex_default_init) + if test x"$glib_cv_byte_contents_gmutex" = xno; then + mutex_has_default=no + fi + CPPFLAGS="$glib_save_CPPFLAGS" + LIBS="$glib_save_LIBS" +fi + +AC_CHECK_FUNCS(clock_gettime, [], [ + AC_CHECK_LIB(rt, clock_gettime, [ + AC_DEFINE(HAVE_CLOCK_GETTIME, 1) + G_THREAD_LIBS="$G_THREAD_LIBS -lrt" + G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS_FOR_GTHREAD -lrt" + ]) +]) + +AC_CACHE_CHECK(for monotonic clocks, + glib_cv_monotonic_clock,AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include +#include +int main() { +#if !(defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK >= 0 && defined(CLOCK_MONOTONIC)) + #error No monotonic clock +#endif + return 0; +} +]])],glib_cv_monotonic_clock=yes,glib_cv_monotonic_clock=no)) +if test "$glib_cv_monotonic_clock" = "yes"; then + AC_DEFINE(HAVE_MONOTONIC_CLOCK,1,[Have a monotonic clock]) +fi + + +dnl ******************************** +dnl *** g_atomic_* tests for gcc *** +dnl ******************************** + +AC_MSG_CHECKING([whether to use assembler code for atomic operations]) + +glib_cv_gcc_has_builtin_atomic_operations=no +if test x"$GCC" = xyes; then + AC_MSG_CHECKING([whether GCC supports build-in atomic intrinsics]) + AC_TRY_LINK([], + [int i; + __sync_synchronize (); + __sync_bool_compare_and_swap (&i, 0, 1); + __sync_fetch_and_add (&i, 1); + ], + [glib_cv_gcc_has_builtin_atomic_operations=yes], + [glib_cv_gcc_has_builtin_atomic_operations=no]) + + AC_MSG_RESULT($glib_cv_gcc_has_builtin_atomic_operations) + if test $glib_cv_gcc_has_builtin_atomic_operations = yes; then + glib_memory_barrier_needed=yes + else + case $host_cpu in + i386) + AC_MSG_RESULT([none]) + glib_memory_barrier_needed=no + ;; + i?86) + AC_MSG_RESULT([i486]) + AC_DEFINE_UNQUOTED(G_ATOMIC_I486, 1, + [i486 atomic implementation]) + glib_memory_barrier_needed=no + ;; + sparc*) + SPARCV9_WARNING="Try to rerun configure with CFLAGS='-mcpu=v9', + when you are using a sparc with v9 instruction set (most + sparcs nowadays). This will make the code for atomic + operations much faster. The resulting code will not run + on very old sparcs though." + + AC_LINK_IFELSE([[ + main () + { + int tmp1, tmp2, tmp3; + __asm__ __volatile__("casx [%2], %0, %1" + : "=&r" (tmp1), "=&r" (tmp2) : "r" (&tmp3)); + }]], + AC_MSG_RESULT([sparcv9]) + AC_DEFINE_UNQUOTED(G_ATOMIC_SPARCV9, 1, + [sparcv9 atomic implementation]), + AC_MSG_RESULT([no]) + AC_MSG_WARN([[$SPARCV9_WARNING]])) + glib_memory_barrier_needed=yes + ;; + alpha*) + AC_MSG_RESULT([alpha]) + AC_DEFINE_UNQUOTED(G_ATOMIC_ALPHA, 1, + [alpha atomic implementation]) + glib_memory_barrier_needed=yes + ;; + x86_64) + AC_MSG_RESULT([x86_64]) + AC_DEFINE_UNQUOTED(G_ATOMIC_X86_64, 1, + [x86_64 atomic implementation]) + glib_memory_barrier_needed=no + ;; + powerpc*) + AC_MSG_RESULT([powerpc]) + AC_DEFINE_UNQUOTED(G_ATOMIC_POWERPC, 1, + [powerpc atomic implementation]) + glib_memory_barrier_needed=yes + AC_MSG_CHECKING([whether asm supports numbered local labels]) + AC_TRY_COMPILE( + ,[ + __asm__ __volatile__ ("1: nop\n" + " bne- 1b") + ],[ + AC_DEFINE_UNQUOTED(ASM_NUMERIC_LABELS, 1, [define if asm blocks can use numeric local labels]) + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + ]) + ;; + ia64) + AC_MSG_RESULT([ia64]) + AC_DEFINE_UNQUOTED(G_ATOMIC_IA64, 1, + [ia64 atomic implementation]) + glib_memory_barrier_needed=yes + ;; + s390|s390x) + AC_MSG_RESULT([s390]) + AC_DEFINE_UNQUOTED(G_ATOMIC_S390, 1, + [s390 atomic implementation]) + glib_memory_barrier_needed=no + ;; + arm*) + AC_MSG_RESULT([arm]) + AC_DEFINE_UNQUOTED(G_ATOMIC_ARM, 1, + [arm atomic implementation]) + glib_memory_barrier_needed=no + ;; + crisv32*|etraxfs*) + AC_MSG_RESULT([crisv32]) + AC_DEFINE_UNQUOTED(G_ATOMIC_CRISV32, 1, + [crisv32 atomic implementation]) + glib_memory_barrier_needed=no + ;; + cris*|etrax*) + AC_MSG_RESULT([cris]) + AC_DEFINE_UNQUOTED(G_ATOMIC_CRIS, 1, + [cris atomic implementation]) + glib_memory_barrier_needed=no + ;; + *) + AC_MSG_RESULT([none]) + glib_memory_barrier_needed=yes + ;; + esac + fi +else + if test $glib_native_win32 = yes; then + # For Windows but not using gcc. No barriers needed then either. + glib_memory_barrier_needed=no + fi +fi + +AM_CONDITIONAL(HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS, + [test $glib_cv_gcc_has_builtin_atomic_operations = yes]) + +dnl ************************ +dnl ** Check for futex(2) ** +dnl ************************ +AC_MSG_CHECKING([for futex(2) system call]) +AC_COMPILE_IFELSE([ +#include +#include +#include + +int +main (void) +{ + /* it's not like this actually runs or anything... */ + syscall (SYS_futex, NULL, FUTEX_WAKE, FUTEX_WAIT); + return 0; +} +], +[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_FUTEX, [test "$have_futex" = "yes"], + [we have the futex(2) system call]) +], +[ + AC_MSG_RESULT(no) +]) + +dnl **************************************** +dnl *** GLib POLL* compatibility defines *** +dnl **************************************** + +glib_poll_includes=[" +#include +#include +"] + +if test $ac_cv_header_sys_types_h = yes && + test $ac_cv_header_sys_poll_h = yes ; then + glib_failed=false + GLIB_CHECK_VALUE(POLLIN, $glib_poll_includes, glib_failed=true) + GLIB_CHECK_VALUE(POLLOUT, $glib_poll_includes, glib_failed=true) + GLIB_CHECK_VALUE(POLLPRI, $glib_poll_includes, glib_failed=true) + GLIB_CHECK_VALUE(POLLERR, $glib_poll_includes, glib_failed=true) + GLIB_CHECK_VALUE(POLLHUP, $glib_poll_includes, glib_failed=true) + GLIB_CHECK_VALUE(POLLNVAL, $glib_poll_includes, glib_failed=true) + if $glib_failed ; then + AC_MSG_ERROR([Could not determine values for POLL* constants]) + fi +else + glib_cv_value_POLLIN=1 + glib_cv_value_POLLOUT=4 + glib_cv_value_POLLPRI=2 + glib_cv_value_POLLERR=8 + glib_cv_value_POLLHUP=16 + glib_cv_value_POLLNVAL=32 +fi + +AC_MSG_CHECKING([for broken poll]) +AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include + #include + #ifdef HAVE_SYS_POLL_H + #include + #endif + int main(void) { + struct pollfd fds[1]; + int fd; + fd = open("/dev/null", 1); + fds[0].fd = fd; + fds[0].events = POLLIN; + fds[0].revents = 0; + if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) { + exit(1); /* Does not work for devices -- fail */ + } + exit(0); + }]])], + [broken_poll=no], + [broken_poll=yes + AC_DEFINE(BROKEN_POLL,1,[poll doesn't work on devices])], + [broken_poll="no (cross compiling)"]) +AC_MSG_RESULT($broken_poll) + +dnl ********************* +dnl *** GRegex checks *** +dnl ********************* +PCRE_REQUIRED_VERSION=7.2 + +# Check if we should compile GRegex +AC_ARG_ENABLE(regex, AC_HELP_STRING([--disable-regex], + [disable the compilation of GRegex]), +[case "${enableval}" in + yes) enable_regex=true ;; + no) enable_regex=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-regex) ;; +esac], +[enable_regex=true]) + +AM_CONDITIONAL(ENABLE_REGEX, $enable_regex) + +if test x$enable_regex = xtrue; then + AC_DEFINE(ENABLE_REGEX, [], [include GRegex]) + # Check if we should use the internal or the system-supplied pcre + AC_ARG_WITH(pcre, + [AC_HELP_STRING([--with-pcre=@<:@internal/system@:>@], + [specify whether to use the internal or the + system-supplied PCRE library])]) + + AM_CONDITIONAL(USE_SYSTEM_PCRE, [test "x$with_pcre" = xsystem]) + + if test "x$with_pcre" = xsystem; then + PKG_CHECK_MODULES(PCRE, + libpcre >= $PCRE_REQUIRED_VERSION) + AC_CACHE_CHECK([for Unicode support in PCRE],glib_cv_pcre_has_unicode,[ + glib_save_CFLAGS="$CFLAGS" + glib_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PCRE_CFLAGS" LIBS="$PCRE_LIBS" + AC_TRY_RUN([#include + int main () { + int support; + pcre_config (PCRE_CONFIG_UTF8, &support); + if (!support) + return 1; + pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &support); + if (!support) + return 1; + return 0; + }], + glib_cv_pcre_has_unicode=yes, + glib_cv_pcre_has_unicode=no, + glib_cv_pcre_has_unicode=yes) + CFLAGS="$glib_save_CFLAGS" + LIBS="$glib_save_LIBS" + ]) + if test "$glib_cv_pcre_has_unicode" = "no"; then + AC_MSG_ERROR([*** The system-supplied PCRE does not support Unicode properties or UTF-8.]) + fi + AC_SUBST(PCRE_CFLAGS) + AC_SUBST(PCRE_LIBS) + AC_DEFINE(USE_SYSTEM_PCRE, [], [using the system-supplied PCRE library]) + PCRE_REQUIRES=libpcre + AC_SUBST(PCRE_REQUIRES) + else + # If using gcc 4 pass -Wno-pointer-sign when compiling the internal PCRE + if test x"$GCC" = xyes; then + AC_MSG_CHECKING([whether compiler understands -Wno-pointer-sign]) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Wno-pointer-sign" + AC_TRY_COMPILE([],[],[PCRE_WARN_CFLAGS="$PCRE_WARN_CFLAGS -Wno-pointer-sign" + AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)]) + CFLAGS="$save_CFLAGS" + fi + fi + AC_SUBST(PCRE_WARN_CFLAGS) +else + AM_CONDITIONAL(USE_SYSTEM_PCRE, false]) +fi + +dnl ********************** +dnl *** Win32 API libs *** +dnl ********************** + +case $host in + *-*-cygwin*) + G_LIBS_EXTRA="-luser32 -lkernel32" + ;; + *-*-mingw*) + G_LIBS_EXTRA="-lws2_32 -lole32" + ;; + *) + G_LIBS_EXTRA="" + ;; +esac +AC_SUBST(G_LIBS_EXTRA) + +dnl If the system doesn't define EILSEQ, we should define EILSEQ ourselves +dnl since we need it for g_iconv() + +AC_MSG_CHECKING([for EILSEQ]) +AC_TRY_COMPILE([ +#include +], +[ +int error = EILSEQ; +], have_eilseq=yes, have_eilseq=no); +AC_MSG_RESULT($have_eilseq) + +dnl ****************************************************************** +dnl *** Look for glib-genmarshal in PATH if we are cross-compiling *** +dnl ****************************************************************** + +AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes) + +if test $cross_compiling = yes; then + AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal, no) + if test x$GLIB_GENMARSHAL = xno; then + AC_MSG_ERROR(Could not find a glib-genmarshal in your PATH) + fi +fi + +dnl ************************** +dnl *** Checks for gtk-doc *** +dnl ************************** + +GTK_DOC_CHECK([1.11]) + +AC_ARG_ENABLE(man, + [AC_HELP_STRING([--enable-man], + [regenerate man pages from Docbook [default=no]])],enable_man=yes, + enable_man=no) + +if test "${enable_man}" != no; then +dnl +dnl Check for xsltproc +dnl +AC_PATH_PROG([XSLTPROC], [xsltproc]) + if test -z "$XSLTPROC"; then + enable_man=no + fi + + dnl check for DocBook DTD and stylesheets in the local catalog. + JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.1.2//EN], + [DocBook XML DTD V4.1.2],,enable_man=no) + JH_CHECK_XML_CATALOG([http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl], + [DocBook XSL Stylesheets],,enable_man=no) +fi + +AM_CONDITIONAL(ENABLE_MAN, test x$enable_man != xno) + +dnl ****************************** +dnl *** output the whole stuff *** +dnl ****************************** + +dnl this section will only be run if config.status is invoked with no +dnl arguments, or with "glibconfig.h" as an argument. +AC_CONFIG_COMMANDS([glibconfig.h], +[ + outfile=glibconfig.h-tmp + cat > $outfile <<\_______EOF +/* glibconfig.h + * + * This is a generated file. Please modify 'configure.in' + */ + +#ifndef __G_LIBCONFIG_H__ +#define __G_LIBCONFIG_H__ + +#include + +_______EOF + + if test x$glib_limits_h = xyes; then + echo '#include ' >> $outfile + fi + if test x$glib_float_h = xyes; then + echo '#include ' >> $outfile + fi + if test x$glib_values_h = xyes; then + echo '#include ' >> $outfile + fi + if test "$glib_header_alloca_h" = "yes"; then + echo '#define GLIB_HAVE_ALLOCA_H' >> $outfile + fi + if test x$glib_sys_poll_h = xyes; then + echo '#define GLIB_HAVE_SYS_POLL_H' >> $outfile + fi + if test x$glib_included_printf != xyes; then + echo " +/* Specifies that GLib's g_print*() functions wrap the + * system printf functions. This is useful to know, for example, + * when using glibc's register_printf_function(). + */" >> $outfile + echo '#define GLIB_USING_SYSTEM_PRINTF' >> $outfile + fi + + cat >> $outfile <<_______EOF + +G_BEGIN_DECLS + +#define G_MINFLOAT $glib_mf +#define G_MAXFLOAT $glib_Mf +#define G_MINDOUBLE $glib_md +#define G_MAXDOUBLE $glib_Md +#define G_MINSHORT $glib_ms +#define G_MAXSHORT $glib_Ms +#define G_MAXUSHORT $glib_Mus +#define G_MININT $glib_mi +#define G_MAXINT $glib_Mi +#define G_MAXUINT $glib_Mui +#define G_MINLONG $glib_ml +#define G_MAXLONG $glib_Ml +#define G_MAXULONG $glib_Mul + +_______EOF + + + ### this should always be true in a modern C/C++ compiler + cat >>$outfile <<_______EOF +typedef signed char gint8; +typedef unsigned char guint8; +_______EOF + + + if test -n "$gint16"; then + cat >>$outfile <<_______EOF +typedef signed $gint16 gint16; +typedef unsigned $gint16 guint16; +#define G_GINT16_MODIFIER $gint16_modifier +#define G_GINT16_FORMAT $gint16_format +#define G_GUINT16_FORMAT $guint16_format +_______EOF + fi + + + if test -n "$gint32"; then + cat >>$outfile <<_______EOF +typedef signed $gint32 gint32; +typedef unsigned $gint32 guint32; +#define G_GINT32_MODIFIER $gint32_modifier +#define G_GINT32_FORMAT $gint32_format +#define G_GUINT32_FORMAT $guint32_format +_______EOF + fi + + cat >>$outfile <<_______EOF +#define G_HAVE_GINT64 1 /* deprecated, always true */ + +${glib_extension}typedef signed $gint64 gint64; +${glib_extension}typedef unsigned $gint64 guint64; + +#define G_GINT64_CONSTANT(val) $gint64_constant +#define G_GUINT64_CONSTANT(val) $guint64_constant +_______EOF + + if test x$gint64_format != x ; then + cat >>$outfile <<_______EOF +#define G_GINT64_MODIFIER $gint64_modifier +#define G_GINT64_FORMAT $gint64_format +#define G_GUINT64_FORMAT $guint64_format +_______EOF + else + cat >>$outfile <<_______EOF +#undef G_GINT64_MODIFIER +#undef G_GINT64_FORMAT +#undef G_GUINT64_FORMAT +_______EOF + fi + + cat >>$outfile <<_______EOF + +#define GLIB_SIZEOF_VOID_P $glib_void_p +#define GLIB_SIZEOF_LONG $glib_long +#define GLIB_SIZEOF_SIZE_T $glib_size_t + +_______EOF + + cat >>$outfile <<_______EOF +typedef signed $glib_size_type_define gssize; +typedef unsigned $glib_size_type_define gsize; +#define G_GSIZE_MODIFIER $gsize_modifier +#define G_GSSIZE_FORMAT $gssize_format +#define G_GSIZE_FORMAT $gsize_format + +#define G_MAXSIZE G_MAXU$glib_msize_type +#define G_MINSSIZE G_MIN$glib_msize_type +#define G_MAXSSIZE G_MAX$glib_msize_type + +typedef gint64 goffset; +#define G_MINOFFSET G_MININT64 +#define G_MAXOFFSET G_MAXINT64 + +#define G_GOFFSET_MODIFIER G_GINT64_MODIFIER +#define G_GOFFSET_FORMAT G_GINT64_FORMAT +#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val) + +_______EOF + + if test -z "$glib_unknown_void_p"; then + cat >>$outfile <<_______EOF + +#define GPOINTER_TO_INT(p) ((gint) ${glib_gpi_cast} (p)) +#define GPOINTER_TO_UINT(p) ((guint) ${glib_gpui_cast} (p)) + +#define GINT_TO_POINTER(i) ((gpointer) ${glib_gpi_cast} (i)) +#define GUINT_TO_POINTER(u) ((gpointer) ${glib_gpui_cast} (u)) + +typedef signed $glib_intptr_type_define gintptr; +typedef unsigned $glib_intptr_type_define guintptr; + +#define G_GINTPTR_MODIFIER $gintptr_modifier +#define G_GINTPTR_FORMAT $gintptr_format +#define G_GUINTPTR_FORMAT $guintptr_format +_______EOF + else + echo '#error SIZEOF_VOID_P unknown - This should never happen' >>$outfile + fi + + + + cat >>$outfile <<_______EOF +$glib_atexit +$glib_memmove +$glib_defines +$glib_os +$glib_static_compilation + +$glib_vacopy + +#ifdef __cplusplus +#define G_HAVE_INLINE 1 +#else /* !__cplusplus */ +$glib_inline +#endif /* !__cplusplus */ + +#ifdef __cplusplus +#define G_CAN_INLINE 1 +_______EOF + + if test x$g_can_inline = xyes ; then + cat >>$outfile <<_______EOF +#else /* !__cplusplus */ +#define G_CAN_INLINE 1 +_______EOF + fi + + cat >>$outfile <<_______EOF +#endif + +_______EOF + + if test x$g_have_iso_c_varargs = xyes ; then + cat >>$outfile <<_______EOF +#ifndef __cplusplus +# define G_HAVE_ISO_VARARGS 1 +#endif +_______EOF + fi + if test x$g_have_iso_cxx_varargs = xyes ; then + cat >>$outfile <<_______EOF +#ifdef __cplusplus +# define G_HAVE_ISO_VARARGS 1 +#endif +_______EOF + fi + if test x$g_have_gnuc_varargs = xyes ; then + cat >>$outfile <<_______EOF + +/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi + * is passed ISO vararg support is turned off, and there is no work + * around to turn it on, so we unconditionally turn it off. + */ +#if __GNUC__ == 2 && __GNUC_MINOR__ == 95 +# undef G_HAVE_ISO_VARARGS +#endif + +#define G_HAVE_GNUC_VARARGS 1 +_______EOF + fi + + case x$g_stack_grows in + xyes) echo "#define G_HAVE_GROWING_STACK 1" >>$outfile ;; + *) echo "#define G_HAVE_GROWING_STACK 0" >>$outfile ;; + esac + + + echo >>$outfile + if test x$g_have_eilseq = xno; then + cat >>$outfile <<_______EOF +#ifndef EILSEQ +/* On some systems, like SunOS and NetBSD, EILSEQ is not defined. + * The correspondence between this and the corresponding definition + * in libiconv is essential. + */ +# define EILSEQ ENOENT +#endif +_______EOF + + fi + + if test x$g_have_gnuc_visibility = xyes; then + cat >>$outfile <<_______EOF +#define G_HAVE_GNUC_VISIBILITY 1 +_______EOF + fi + cat >>$outfile <<_______EOF +#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590) +#define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +#define G_GNUC_INTERNAL __hidden +#elif defined (__GNUC__) && defined (G_HAVE_GNUC_VISIBILITY) +#define G_GNUC_INTERNAL __attribute__((visibility("hidden"))) +#else +#define G_GNUC_INTERNAL +#endif +_______EOF + + + echo >>$outfile + if test x$g_mutex_has_default = xyes; then + cat >>$outfile <<_______EOF +$g_enable_threads_def G_THREADS_ENABLED +#define G_THREADS_IMPL_$g_threads_impl_def +typedef struct _GStaticMutex GStaticMutex; +struct _GStaticMutex +{ + struct _GMutex *runtime_mutex; + union { + char pad[[$g_mutex_sizeof]]; + double dummy_double; + void *dummy_pointer; + long dummy_long; + } static_mutex; +}; +#define G_STATIC_MUTEX_INIT { NULL, { { $g_mutex_contents} } } +#define g_static_mutex_get_mutex(mutex) \\ + (g_thread_use_default_impl ? ((GMutex*)(gpointer) ((mutex)->static_mutex.pad)) : \\ + g_static_mutex_get_mutex_impl_shortcut (&((mutex)->runtime_mutex))) +_______EOF + else + cat >>$outfile <<_______EOF +$g_enable_threads_def G_THREADS_ENABLED +#define G_THREADS_IMPL_$g_threads_impl_def +typedef struct _GMutex* GStaticMutex; +#define G_STATIC_MUTEX_INIT NULL +#define g_static_mutex_get_mutex(mutex) \\ + (g_static_mutex_get_mutex_impl_shortcut (mutex)) +_______EOF + fi + + cat >>$outfile <<_______EOF +/* This represents a system thread as used by the implementation. An + * alien implementaion, as loaded by g_thread_init can only count on + * "sizeof (gpointer)" bytes to store their info. We however need more + * for some of our native implementations. */ +typedef union _GSystemThread GSystemThread; +union _GSystemThread +{ + char data[[$g_system_thread_sizeof]]; + double dummy_double; + void *dummy_pointer; + long dummy_long; +}; +_______EOF + if test x"$g_memory_barrier_needed" != xno; then + echo >>$outfile + echo "#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1" >>$outfile + fi + + echo >>$outfile + g_bit_sizes="16 32 64" + for bits in $g_bit_sizes; do + cat >>$outfile <<_______EOF +#define GINT${bits}_TO_${g_bs_native}(val) ((gint${bits}) (val)) +#define GUINT${bits}_TO_${g_bs_native}(val) ((guint${bits}) (val)) +#define GINT${bits}_TO_${g_bs_alien}(val) ((gint${bits}) GUINT${bits}_SWAP_LE_BE (val)) +#define GUINT${bits}_TO_${g_bs_alien}(val) (GUINT${bits}_SWAP_LE_BE (val)) +_______EOF + done + + cat >>$outfile <<_______EOF +#define GLONG_TO_LE(val) ((glong) GINT${glongbits}_TO_LE (val)) +#define GULONG_TO_LE(val) ((gulong) GUINT${glongbits}_TO_LE (val)) +#define GLONG_TO_BE(val) ((glong) GINT${glongbits}_TO_BE (val)) +#define GULONG_TO_BE(val) ((gulong) GUINT${glongbits}_TO_BE (val)) +#define GINT_TO_LE(val) ((gint) GINT${gintbits}_TO_LE (val)) +#define GUINT_TO_LE(val) ((guint) GUINT${gintbits}_TO_LE (val)) +#define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val)) +#define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val)) +#define GSIZE_TO_LE(val) ((gsize) GUINT${gsizebits}_TO_LE (val)) +#define GSSIZE_TO_LE(val) ((gssize) GINT${gsizebits}_TO_LE (val)) +#define GSIZE_TO_BE(val) ((gsize) GUINT${gsizebits}_TO_BE (val)) +#define GSSIZE_TO_BE(val) ((gssize) GINT${gsizebits}_TO_BE (val)) +#define G_BYTE_ORDER $g_byte_order + +#define GLIB_SYSDEF_POLLIN =$g_pollin +#define GLIB_SYSDEF_POLLOUT =$g_pollout +#define GLIB_SYSDEF_POLLPRI =$g_pollpri +#define GLIB_SYSDEF_POLLHUP =$g_pollhup +#define GLIB_SYSDEF_POLLERR =$g_pollerr +#define GLIB_SYSDEF_POLLNVAL =$g_pollnval + +#define G_MODULE_SUFFIX "$g_module_suffix" + +/* A GPid is an abstraction for a process "handle". It is *not* an + * abstraction for a process identifier in general. GPid is used in + * GLib only for descendant processes spawned with the g_spawn* + * functions. On POSIX there is no "process handle" concept as such, + * but on Windows a GPid is a handle to a process, a kind of pointer, + * not a process identifier. + */ +typedef $g_pid_type GPid; + +#define GLIB_SYSDEF_AF_UNIX $g_af_unix +#define GLIB_SYSDEF_AF_INET $g_af_inet +#define GLIB_SYSDEF_AF_INET6 $g_af_inet6 + +#define GLIB_SYSDEF_MSG_OOB $g_msg_oob +#define GLIB_SYSDEF_MSG_PEEK $g_msg_peek +#define GLIB_SYSDEF_MSG_DONTROUTE $g_msg_dontroute + +G_END_DECLS + +#endif /* GLIBCONFIG_H */ +_______EOF + + + if cmp -s $outfile glibconfig.h; then + AC_MSG_NOTICE([glibconfig.h is unchanged]) + rm -f $outfile + else + mv $outfile glibconfig.h + fi +],[ + +# Note that if two cases are the same, case goes with the first one. +# Note also that this is inside an AC_OUTPUT_COMMAND. We do not depend +# on variable expansion in case labels. Look at the generated config.status +# for a hint. + +if test "x${ac_cv_working_alloca_h+set}" = xset ; then + glib_header_alloca_h="$ac_cv_working_alloca_h" +else + glib_header_alloca_h="$ac_cv_header_alloca_h" +fi + +case xyes in +x$ac_cv_header_float_h) + glib_float_h=yes + glib_mf=FLT_MIN glib_Mf=FLT_MAX + glib_md=DBL_MIN glib_Md=DBL_MAX + ;; +x$ac_cv_header_values_h) + glib_values_h=yes + glib_mf=MINFLOAT glib_Mf=MAXFLOAT + glib_md=MINDOUBLE glib_Md=MAXDOUBLE + ;; +esac + +case xyes in +x$ac_cv_header_limits_h) + glib_limits_h=yes + glib_ms=SHRT_MIN glib_Ms=SHRT_MAX glib_Mus=USHRT_MAX + glib_mi=INT_MIN glib_Mi=INT_MAX glib_Mui=UINT_MAX + glib_ml=LONG_MIN glib_Ml=LONG_MAX glib_Mul=ULONG_MAX + ;; +x$ac_cv_header_values_h) + glib_values_h=yes + glib_ms=MINSHORT glib_Ms=MAXSHORT glib_Mus="(((gushort)G_MAXSHORT)*2+1)" + glib_mi=MININT glib_Mi=MAXINT glib_Mui="(((guint)G_MAXINT)*2+1)" + glib_ml=MINLONG glib_Ml=MAXLONG glib_Mul="(((gulong)G_MAXLONG)*2+1)" + ;; +esac + +if test x$ac_cv_header_sys_poll_h = xyes ; then + glib_sys_poll_h=yes +fi + +if test x$enable_included_printf = xyes ; then + glib_included_printf=yes +fi + +case 2 in +$ac_cv_sizeof_short) + gint16=short + gint16_modifier='"h"' + gint16_format='"hi"' + guint16_format='"hu"' + ;; +$ac_cv_sizeof_int) + gint16=int + gint16_modifier='""' + gint16_format='"i"' + guint16_format='"u"' + ;; +esac +case 4 in +$ac_cv_sizeof_short) + gint32=short + gint32_modifier='"h"' + gint32_format='"hi"' + guint32_format='"hu"' + ;; +$ac_cv_sizeof_int) + gint32=int + gint32_modifier='""' + gint32_format='"i"' + guint32_format='"u"' + ;; +$ac_cv_sizeof_long) + gint32=long + gint32_modifier='"l"' + gint32_format='"li"' + guint32_format='"lu"' + ;; +esac +case 8 in +$ac_cv_sizeof_int) + gint64=int + gint64_modifier='""' + gint64_format='"i"' + guint64_format='"u"' + glib_extension= + gint64_constant='(val)' + guint64_constant='(val)' + ;; +$ac_cv_sizeof_long) + gint64=long + gint64_modifier='"l"' + gint64_format='"li"' + guint64_format='"lu"' + glib_extension= + gint64_constant='(val##L)' + guint64_constant='(val##UL)' + ;; +$ac_cv_sizeof_long_long) + gint64='long long' + if test -n "$glib_cv_long_long_format"; then + gint64_modifier='"'$glib_cv_long_long_format'"' + gint64_format='"'$glib_cv_long_long_format'i"' + guint64_format='"'$glib_cv_long_long_format'u"' + fi + glib_extension='G_GNUC_EXTENSION ' + gint64_constant='(G_GNUC_EXTENSION (val##LL))' + guint64_constant='(G_GNUC_EXTENSION (val##ULL))' + ;; +$ac_cv_sizeof___int64) + gint64='__int64' + if test -n "$glib_cv_long_long_format"; then + gint64_modifier='"'$glib_cv_long_long_format'"' + gint64_format='"'$glib_cv_long_long_format'i"' + guint64_format='"'$glib_cv_long_long_format'u"' + fi + glib_extension= + gint64_constant='(val##i64)' + guint64_constant='(val##ui64)' + ;; +esac +glib_size_t=$ac_cv_sizeof_size_t +glib_size_type_define="$glib_size_type" +glib_void_p=$ac_cv_sizeof_void_p +glib_long=$ac_cv_sizeof_long + +case "$glib_size_type" in +short) + gsize_modifier='"h"' + gsize_format='"hu"' + gssize_format='"hi"' + glib_msize_type='SHRT' + ;; +int) + gsize_modifier='""' + gsize_format='"u"' + gssize_format='"i"' + glib_msize_type='INT' + ;; +long) + gsize_modifier='"l"' + gsize_format='"lu"' + gssize_format='"li"' + glib_msize_type='LONG' + ;; +"long long"|__int64) + gsize_modifier='"I64"' + gsize_format='"I64u"' + gssize_format='"I64i"' + glib_msize_type='INT64' + ;; +esac + +gintbits=`expr $ac_cv_sizeof_int \* 8` +glongbits=`expr $ac_cv_sizeof_long \* 8` +gsizebits=`expr $ac_cv_sizeof_size_t \* 8` + +case $ac_cv_sizeof_void_p in +$ac_cv_sizeof_int) + glib_intptr_type_define=int + gintptr_modifier='""' + gintptr_format='"i"' + guintptr_format='"u"' + glib_gpi_cast='' + glib_gpui_cast='' + ;; +$ac_cv_sizeof_long) + glib_intptr_type_define=long + gintptr_modifier='"l"' + gintptr_format='"li"' + guintptr_format='"lu"' + glib_gpi_cast='(glong)' + glib_gpui_cast='(gulong)' + ;; +$ac_cv_sizeof_long_long) + glib_intptr_type_define='long long' + gintptr_modifier='"I64"' + gintptr_format='"I64i"' + guintptr_format='"I64u"' + glib_gpi_cast='(gint64)' + glib_gpui_cast='(guint64)' + ;; +$ac_cv_sizeof___int64) + glib_intptr_type_define=__int64 + gintptr_modifier='"I64"' + gintptr_format='"I64i"' + guintptr_format='"I64u"' + glib_gpi_cast='(gint64)' + glib_gpui_cast='(guint64)' + ;; +*) + glib_unknown_void_p=yes + ;; +esac + + +case xyes in +x$ac_cv_func_atexit) + glib_atexit=" +#ifdef NeXT /* @#%@! NeXTStep */ +# define g_ATEXIT(proc) (!atexit (proc)) +#else +# define g_ATEXIT(proc) (atexit (proc)) +#endif" + ;; +x$ac_cv_func_on_exit) + glib_atexit=" +#define g_ATEXIT(proc) (on_exit ((void (*)(int, void*))(proc), NULL))" + ;; +esac + +case xyes in +x$ac_cv_func_memmove) + glib_memmove=' +#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END' + ;; +x$glib_cv_working_bcopy) + glib_memmove=" +/* memmove isn't available, but bcopy can copy overlapping memory regions */ +#define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END" + ;; +*) + glib_memmove=" +/* memmove isn't found and bcopy can't copy overlapping memory regions, + * so we have to roll our own copy routine. */ +void g_memmove (void* dest, const void * src, unsigned long len);" + ;; +esac + +glib_defines=" +#define GLIB_MAJOR_VERSION $GLIB_MAJOR_VERSION +#define GLIB_MINOR_VERSION $GLIB_MINOR_VERSION +#define GLIB_MICRO_VERSION $GLIB_MICRO_VERSION +" + +case xyes in +x$glib_cv_va_copy) glib_vacopy='#define G_VA_COPY va_copy' ;; +x$glib_cv___va_copy) glib_vacopy='#define G_VA_COPY __va_copy' ;; +*) glib_vacopy='' +esac + +if test x$glib_cv_va_val_copy = xno; then + glib_vacopy="\$glib_vacopy +#define G_VA_COPY_AS_ARRAY 1" +fi + +if test x$glib_cv_hasinline = xyes; then + glib_inline='#define G_HAVE_INLINE 1' +fi +if test x$glib_cv_has__inline = xyes; then + glib_inline="\$glib_inline +#define G_HAVE___INLINE 1" +fi +if test x$glib_cv_has__inline__ = xyes; then + glib_inline="\$glib_inline +#define G_HAVE___INLINE__ 1" +fi + +g_have_gnuc_varargs=$g_have_gnuc_varargs +g_have_iso_c_varargs=$g_have_iso_c_varargs +g_have_iso_cxx_varargs=$g_have_iso_cxx_varargs + +g_can_inline=$g_can_inline +g_have_gnuc_visibility=$g_have_gnuc_visibility +g_have_sunstudio_visibility=$g_have_sunstudio_visibility + +if test x$ac_cv_c_bigendian = xyes; then + g_byte_order=G_BIG_ENDIAN + g_bs_native=BE + g_bs_alien=LE +else + g_byte_order=G_LITTLE_ENDIAN + g_bs_native=LE + g_bs_alien=BE +fi + +g_pollin=$glib_cv_value_POLLIN +g_pollout=$glib_cv_value_POLLOUT +g_pollpri=$glib_cv_value_POLLPRI +g_pollhup=$glib_cv_value_POLLHUP +g_pollerr=$glib_cv_value_POLLERR +g_pollnval=$glib_cv_value_POLLNVAL + +g_af_unix=$glib_cv_value_AF_UNIX +g_af_inet=$glib_cv_value_AF_INET +g_af_inet6=$glib_cv_value_AF_INET6 + +g_msg_peek=$glib_cv_value_MSG_PEEK +g_msg_oob=$glib_cv_value_MSG_OOB +g_msg_dontroute=$glib_cv_value_MSG_DONTROUTE + +g_stack_grows=$glib_cv_stack_grows + +g_have_eilseq=$have_eilseq + +case x$have_threads in +xno) g_enable_threads_def="#undef";; +*) g_enable_threads_def="#define";; +esac + +g_threads_impl_def=$g_threads_impl + +g_mutex_has_default="$mutex_has_default" +g_mutex_sizeof="$glib_cv_sizeof_gmutex" +g_system_thread_sizeof="$glib_cv_sizeof_system_thread" +g_mutex_contents="$glib_cv_byte_contents_gmutex" + +g_memory_barrier_needed="$glib_memory_barrier_needed" + +g_module_suffix="$glib_gmodule_suffix" + +g_pid_type="$glib_pid_type" +case $host in + *-*-beos*) + glib_os="#define G_OS_BEOS" + ;; + *-*-cygwin*) + glib_os="#define G_OS_UNIX +#define G_PLATFORM_WIN32 +#define G_WITH_CYGWIN" + ;; + *-*-mingw*) + glib_os="#define G_OS_WIN32 +#define G_PLATFORM_WIN32" + ;; + *) + glib_os="#define G_OS_UNIX" + ;; +esac +glib_static_compilation="" +if test x$glib_win32_static_compilation = xyes; then + glib_static_compilation="#define GLIB_STATIC_COMPILATION 1 +#define GOBJECT_STATIC_COMPILATION 1" +fi +]) + +AC_CONFIG_FILES([ +glib-2.0.pc +glib-2.0-uninstalled.pc +gmodule-2.0.pc +gmodule-export-2.0.pc +gmodule-no-export-2.0.pc +gmodule-2.0-uninstalled.pc +gmodule-no-export-2.0-uninstalled.pc +gthread-2.0.pc +gthread-2.0-uninstalled.pc +gobject-2.0.pc +gobject-2.0-uninstalled.pc +gio-2.0.pc +gio-unix-2.0.pc +gio-2.0-uninstalled.pc +gio-unix-2.0-uninstalled.pc +glib-zip +glib-gettextize +Makefile +build/Makefile +build/win32/Makefile +build/win32/dirent/Makefile +build/win32/vs9/Makefile +glib/Makefile +glib/libcharset/Makefile +glib/gnulib/Makefile +glib/pcre/Makefile +glib/update-pcre/Makefile +glib/tests/Makefile +gmodule/Makefile +gmodule/gmoduleconf.h +gobject/Makefile +gobject/glib-mkenums +gobject/tests/Makefile +gthread/Makefile +gthread/tests/Makefile +gio/Makefile +gio/xdgmime/Makefile +gio/inotify/Makefile +gio/libasyncns/Makefile +gio/fen/Makefile +gio/fam/Makefile +gio/win32/Makefile +gio/tests/Makefile +po/Makefile.in +docs/Makefile +docs/reference/Makefile +docs/reference/glib/Makefile +docs/reference/glib/version.xml +docs/reference/gobject/Makefile +docs/reference/gobject/version.xml +docs/reference/gio/Makefile +docs/reference/gio/version.xml +tests/Makefile +tests/gobject/Makefile +tests/refcount/Makefile +m4macros/Makefile +]) + +AC_CONFIG_COMMANDS([chmod-scripts], +[chmod 0755 glib-zip +chmod 0755 glib-gettextize +chmod 0755 gobject/glib-mkenums]) + +# we want to invoke this macro solely so that the config.status script +# and automake generated makefiles know about these generated files. +# They are only needed to distcheck the package +if false; then + AC_CONFIG_FILES([ + INSTALL + README + config.h.win32 + glibconfig.h.win32 + glib/makefile.msc + glib/glib.rc + gmodule/makefile.msc + gmodule/gmodule.rc + gobject/makefile.msc + gobject/gobject.rc + gthread/makefile.msc + gthread/gthread.rc + gio/gio.rc + tests/makefile.msc + ]) +fi + +AC_OUTPUT diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..0b21d7d --- /dev/null +++ b/debian/changelog @@ -0,0 +1,1523 @@ +glib2.0 (2.24.0-3slp2) unstable; urgency=low + + * Remove udeb from debian/control file + + -- Eunok Kim Fri, 11 Jun 2010 22:26:36 +0900 + +glib2.0 (2.24.0-2slp2) unstable; urgency=low + + * Package version update + + -- Eunok Kim Fri, 11 Jun 2010 10:41:29 +0900 + +glib2.0 (2.24.0-1slp2) unstable; urgency=low + + * Update glib2.0 to 2.24.0 + + -- Eunok Kim Thu, 10 Jun 2010 15:45:32 +0900 + +glib2.0 (2.22.3-3slp2) unstable; urgency=low + + * Changing verion naming rul + + -- Boram Park Wed, 24 Mar 2010 21:33:16 +0900 + +glib2.0 (2.22.3-2) unstable; urgency=low + + * Change debian/control.in, debian/rules, debian/libglib2.0-0.install and + debian/libglib2.0-dev.links files. + + -- Doyoun Kang Thu, 10 Dec 2009 16:41:27 +0900 + +glib2.0 (2.22.3-1) unstable; urgency=low + + [ Loïc Minier ] + * -refdbg package is section/prio debug/extra. + * Add note to NOT use -Wl,--as-needed as it might drop a critical -lpthread + link in gio (which dlopen()s gvfs); see + mid:<1257999019.21780.15.camel@marzipan>. + + [ Sebastian Dröge ] + * New upstream bugfix release: + + debian/patches/90_mimetype-sorting.patch: + - Dropped, merged upstream. + + -- Sebastian Dröge Tue, 01 Dec 2009 16:36:30 +0100 + +glib2.0 (2.22.2-2) unstable; urgency=low + + * debian/patches/90_mimetype-sorting.patch: + + Fix sorting of mimetypes by weight. Highest weight means most + important, not the other way around. Patch from upstream GIT. + + -- Sebastian Dröge Thu, 08 Oct 2009 18:34:23 +0200 + +glib2.0 (2.22.2-1) unstable; urgency=low + + [ Emilio Pozuelo Monfort ] + * Move libglib2.0-data to section libs. Closes: #549079. + + [ Sebastian Dröge ] + * New upstream bugfix release. + + -- Sebastian Dröge Thu, 08 Oct 2009 12:48:51 +0200 + +glib2.0 (2.22.1-1) unstable; urgency=low + + * New upstream bugfix release: + + debian/patches/10_inotify_init1.patch, + debian/patches/30_metadata_symlinks.patch: + - Dropped, merged upstream. + + -- Sebastian Dröge Wed, 30 Sep 2009 08:17:57 +0200 + +glib2.0 (2.22.0-2) unstable; urgency=low + + * Don’t install Python GDB macros for now, they only work with an + experimental GDB branch. + * 30_metadata_symlinks.patch: stolen upstream. Get metadata to work + with symbolic links. Closes: #548142. + + -- Josselin Mouette Wed, 30 Sep 2009 01:02:11 +0200 + +glib2.0 (2.22.0-1) unstable; urgency=low + + [ Josselin Mouette ] + * Move libglib-2.0.so.0 to /lib so that DeviceKit (and other potential + sources) can work without having /usr mounted. + * 11_chmod_symlinks.patch: new patch. Fix potential security issue + when manipulating symlink permissions. Thanks Arand Nash for the + heads up. + + [ Sebastian Dröge ] + * New upstream stable release: + + debian/patches/11_chmod_symlinks.patch: + - Dropped, merged upstream. + + debian/libglib2.0-0.symbols, + debian/rules: + - Update for the new version. + + -- Sebastian Dröge Wed, 23 Sep 2009 05:04:37 +0200 + +glib2.0 (2.21.6-1) experimental; urgency=low + + [ Josselin Mouette ] + * 10_inotify_init1.patch: fall back on inotify_init when inotify_init1 + does not work, as happens with kernel versions < 2.6.27. + Closes: #544354. + + [ Sebastian Dröge ] + * New upstream development release: + + debian/libglib2.0-0.symbols: + - Update for the new version. + + debian/rules: + - Update SHVER to 2.21.6. + * debian/control.in: + + Updated Standards-Version to 3.8.3, no additional changes needed. + + -- Sebastian Dröge Sat, 05 Sep 2009 07:15:58 +0200 + +glib2.0 (2.21.5-1) experimental; urgency=low + + * New upstream development release: + + debian/libglib2.0-0.symbols: + - Update for the new version. + + debian/rules: + - Update SHVER to 2.21.5. + * debian/control.in: + + Updated Standards-Version to 3.8.2, no additional changes needed. + + -- Sebastian Dröge Tue, 25 Aug 2009 18:38:51 +0200 + +glib2.0 (2.21.4-1) experimental; urgency=low + + * New upstream development release: + + debian/rules: + - Include check-dist.mk to prevent accidental uploads to unstable. + - Update shlib version to 2.21.4. + + debian/libglib2.0-0.symbols: + - Update for the API additions. + * debian/control.in: + + Updated Standards-Version to 3.8.1, no additional changes needed. + + -- Sebastian Dröge Tue, 21 Jul 2009 09:35:33 +0200 + +glib2.0 (2.20.4-1) unstable; urgency=low + + * New upstream bugfix release. + + -- Sebastian Dröge Sat, 27 Jun 2009 09:56:08 +0200 + +glib2.0 (2.20.3-1) unstable; urgency=low + + [ Josselin Mouette ] + * Only build the libgio-fam package for hurd and kfreebsd, it is + totally useless under Linux. + * Make it recommend gamin for kqueue support. + * Make libgamin-dev the primary build-dependency. Closes: #526219. + + [ Sebastian Dröge ] + * New upstream bugfix release. + + -- Sebastian Dröge Mon, 01 Jun 2009 15:35:40 +0200 + +glib2.0 (2.20.1-2) unstable; urgency=low + + * Add refdbg package: libglib2.0-0-refdbg. (Closes: #525915) + + -- Jonny Lamb Tue, 28 Apr 2009 15:11:27 +0100 + +glib2.0 (2.20.1-1) unstable; urgency=low + + * New upstream bugfix release: + + 10_log_valist.patch, dropped. + + -- Sebastian Dröge Sat, 11 Apr 2009 17:00:43 +0200 + +glib2.0 (2.20.0-3) unstable; urgency=low + + * Fix debug package section. + * 10_log_valist.patch: new patch, stolen upstream. Copy a va_list + before using it twice. Closes: #520484. + + -- Josselin Mouette Thu, 09 Apr 2009 20:11:52 +0200 + +glib2.0 (2.20.0-2) unstable; urgency=low + + * Remove 02_usr_share_gnome_applications.patch, now gnome-session sets + XDG_DATA_DIRS accordingly. + + -- Josselin Mouette Thu, 19 Mar 2009 22:59:34 +0100 + +glib2.0 (2.20.0-1) unstable; urgency=low + + * New upstream stable release. + * Upload to unstable, remove check-dist include. + This won't block any transitions because of symbol files. + * debian/libglib2.0-0.symbols, + debian/rules: + + Update for the API changes. + + -- Sebastian Dröge Sat, 14 Mar 2009 10:53:26 +0100 + +glib2.0 (2.19.10-1) experimental; urgency=low + + * New upstream development release. + + -- Sebastian Dröge Mon, 02 Mar 2009 16:04:08 +0100 + +glib2.0 (2.19.8-2) experimental; urgency=low + + * debian/patches/01_gettext-desktopfiles.patch, + debian/patches/02_gettext-desktopfiles-ubuntu.patch: + + Updated from the Ubuntu package, thanks to Martin Pitt for the changes: + - 01_gettext-desktopfiles.patch: Merge OpenSUSE's and our patch: + - Now prefers inline translations over gettext translations, which + fixes a few corner cases (like renaming .desktop files on the + user's desktop), is more in line with the recent gconf patch, + and more palatable for upstream inclusion. + - Use X-GNOME-Gettext-Domain, for preparing upstream inclusion. + - Forwarded upstream now. + - Add 02_gettext-desktopfiles-ubuntu.patch: Provide backwards + compatibility for 01_gettext-desktopfiles.patch for + X-{Debian,Ubuntu}-Gettext-Domain. The latter was changed to use + X-GNOME-, so this is necessary until all our .desktop files are + converted. + + -- Sebastian Dröge Tue, 24 Feb 2009 16:08:05 +0100 + +glib2.0 (2.19.8-1) experimental; urgency=low + + * New upstream development release. + + -- Sebastian Dröge Fri, 20 Feb 2009 10:38:44 +0100 + +glib2.0 (2.19.7-1) experimental; urgency=low + + * New development release + + -- Gustavo Noronha Silva Tue, 17 Feb 2009 01:43:04 -0300 + +glib2.0 (2.19.6-1) experimental; urgency=low + + * New development release + * debian/libglib2.0-0.symbols: + - updated with new symbols + + -- Gustavo Noronha Silva Sun, 15 Feb 2009 23:58:22 -0300 + +glib2.0 (2.18.4-2) unstable; urgency=low + + * Release to unstable + * debian/rules: + - bump SHVER, since we are already forcing a 2.18.0 dependecy on the + symbols introduced in the development versions + * debian/control.in: + - added Homepage and Vcs-* control fields + + -- Gustavo Noronha Silva Sun, 15 Feb 2009 13:00:43 -0300 + +glib2.0 (2.18.4-1) experimental; urgency=low + + [ Josselin Mouette ] + * 04_homedir_env.patch: new patch. Handle the G_HOME environment + variable, to override the passwd entry. This will allow to fix + various kinds of build failures due to restricted build + environments. + + [ Sebastian Dröge ] + * New upstream bugfix release. + + -- Sebastian Dröge Sat, 10 Jan 2009 14:21:55 +0100 + +glib2.0 (2.18.3-1) experimental; urgency=low + + * New upstream bugfix release. + + -- Sebastian Dröge Mon, 24 Nov 2008 10:07:47 +0100 + +glib2.0 (2.18.2-1) experimental; urgency=low + + [ Loic Minier ] + * Suffix the Debian specific pcre bdep with "~" to allow backports and make + lintian happy. + * Update doc-base entries for new doc-base secttions: use Programming/C + instead of Apps/Programming. + * Use uppercase GNOME in doc-base description of glib. + * Recommend shared-mime-info for content-type guessing API; see + GNOME #554563. + * Pass -k to make check. + + [ Sebastian Dröge ] + * New upstream bugfix release. + + -- Sebastian Dröge Sun, 19 Oct 2008 13:26:48 +0200 + +glib2.0 (2.18.1-1) experimental; urgency=low + + * New upstream bugfix release. + * debian/libglib2.0-0.symbols: + + Updated all 2.17 symbols to 2.18.0 to get dependencies on the stable + versions. + + -- Sebastian Dröge Sun, 21 Sep 2008 15:31:15 +0200 + +glib2.0 (2.18.0-1) experimental; urgency=low + + * New upstream stable release, with API addition. + - Update symbols file for new g_object_get_type() symbol and drop + g_slice_debug_tree_statistics() which shouldn't have been exported in + the first place. + - Refresh patches 01_gettext-desktopfiles, + 02_usr_share_gnome_applications, and 03_blacklist-directories to apply + cleanly. + + -- Loic Minier Wed, 03 Sep 2008 00:51:29 +0200 + +glib2.0 (2.17.7-1) experimental; urgency=low + + * New upstream development release, the new API might still change: + + debian/rules, + debian/libglib2.0-0.symbols: + - Updated for the new symbols. + + -- Sebastian Dröge Mon, 18 Aug 2008 16:04:30 +0200 + +glib2.0 (2.17.6-1) experimental; urgency=low + + * New upstream development release, the new API might still change: + + debian/rules, + debian/libglib2.0-0.symbols: + - Updated for the new symbols. + + -- Sebastian Dröge Mon, 04 Aug 2008 19:54:44 +0200 + +glib2.0 (2.17.4-1) experimental; urgency=low + + [ Loic Minier ] + * List back m68k in arches where we could make the testsuite fatal, + following the update on GNOME #481575. + * Document why testsuite is currently completely disabled (fails when + there's no writable $HOME). + + [ Sebastian Dröge ] + * New upstream development release, the new API might still change: + + debian/rules, + debian/libglib2.0-0.symbols: + - Updated for the new symbols. + + debian/patches/90_gio-nautilus-crash.patch: + - Dropped, merged upstream. + + -- Sebastian Dröge Tue, 22 Jul 2008 11:17:05 +0200 + +glib2.0 (2.17.3-2) experimental; urgency=low + + * debian/patches/90_gio-nautilus-crash.patch: + + Patch from upstream SVN to fix a crash in nautilus 2.22. + + -- Sebastian Dröge Sat, 05 Jul 2008 16:57:05 +0200 + +glib2.0 (2.17.3-1) experimental; urgency=low + + * New upstream development release, the new API might still change: + + debian/rules, + debian/libglib2.0-0.symbols: + - Updated for the new symbols. + * debian/control.in: + + Updated Standards-Version to 3.8.0, no additional changes needed. + + -- Sebastian Dröge Thu, 03 Jul 2008 11:21:17 +0200 + +glib2.0 (2.17.2-1) experimental; urgency=low + + * New upstream development release, the new API might still change: + + debian/rules, + debian/libglib2.0-0.symbols: + - Updated for the new symbols. + + -- Sebastian Dröge Tue, 17 Jun 2008 09:18:10 +0200 + +glib2.0 (2.17.0-1) experimental; urgency=low + + [ Josselin Mouette ] + * debian/rules: don't compress .sgml and .devhelp files. + + [ Loic Minier ] + * Fix broken second dh_strip invocation which was not only acting on the + udeb but also on binary packages (-s -pUDEB should have been -pUDEB). + + [ Sebastian Dröge ] + * New upstream development release, the new API might still change. + * debian/rules: + + Include check-dist.mk to prevent accidental uploads to unstable. + + Bump SHVER to 2.17.0. + + Pass -c4 to dh_makeshlibs. + * debian/libglib2.0-0.symbols: + + Update symbols. + + -- Sebastian Dröge Wed, 28 May 2008 10:40:30 +0200 + +glib2.0 (2.16.3-2) unstable; urgency=low + + * debian/rules: Don't add the debug symbols of the udeb in the -dbg package. + Makes the debugging info actually usefull again (Closes: #468093) + + -- Sjoerd Simons Fri, 11 Apr 2008 22:58:03 +0200 + +glib2.0 (2.16.3-1) unstable; urgency=low + + [ Sjoerd Simons ] + * debian/patches/70_g_timeout_seconds_fix.patch + + Added. Fix a rare case where a timeout from g_timeout_add_seconds() is + never triggered. See http://bugzilla.gnome.org/show_bug.cgi?id=448943 + + [ Sebastian Dröge ] + * New upstream bugfix release: + + debian/patches/70_g_timeout_seconds_fix.patch: + - Dropped, merged upstream. + + -- Sebastian Dröge Tue, 08 Apr 2008 12:02:07 +0200 + +glib2.0 (2.16.2-1) unstable; urgency=low + + [ Loic Minier ] + * Drop nautilus conflicts as it triggers a bug in the APT resolver on + dist-upgrade. + * Update patch 01_gettext-desktopfiles with a newer version taken from the + Ubuntu package. + * Update and enable patch 01_gettext-desktopfiles to also look for + X-Debian-Gettext-Domain if X-Ubuntu-Gettext-Domain isn't present. + + [ Sebastian Dröge ] + * New upstream bugfix release: + + Fixes FTBFS on hurd/i386 (Closes: #472129). + + debian/patches/04_nfs4.patch, + debian/patches/80_static-mutex-aliasing-warnings.patch, + debian/patches/81_c99-inline-warnings.patch: + - Dropped, merged upstream. + + -- Sebastian Dröge Tue, 01 Apr 2008 07:40:48 +0200 + +glib2.0 (2.16.1-2) unstable; urgency=low + + [ Josselin Mouette ] + * 02_usr_share_gnome_applications.patch: ported from GnomeVFS. Use + /usr/share/gnome/applications/defaults.list to obtain the defaults + for MIME mapping. Currently this file is still shipped by GnomeVFS. + Closes: #469504. + * 03_blacklist-directories.patch: ported from GnomeVFS. Blacklist more + FHS directories that are commonly found as Unix mount points, + including those necessary for live-initramfs. + * 04_nfs4.patch: ported from GnomeVFS. Support for nfs4 filesystems. + + [ Sebastian Dröge ] + * 80_static-mutex-aliasing-warnings.patch: Prevent warnings about + breaking strict-aliasing rules when using G_LOCK(). + See http://bugzilla.gnome.org/show_bug.cgi?id=316221 + * 81_c99-inline-warnings.patch: Fix warnings when using G_INLINE_FUNC + in C99 mode (Closes: #470796). + See http://bugzilla.gnome.org/show_bug.cgi?id=522292 + * Don't ship the old changelogs and news to save some space. + + -- Sebastian Dröge Fri, 14 Mar 2008 10:13:09 +0100 + +glib2.0 (2.16.1-1) unstable; urgency=low + + * New upstream bugfix release. + + -- Sebastian Dröge Tue, 11 Mar 2008 04:41:30 +0100 + +glib2.0 (2.16.0-1) unstable; urgency=low + + * New upstream stable release: + + debian/rules: + - Update shlibs version to 2.16.0. + - Drop check-dist include, upload to unstable. + + debian/libglib2.0-0.symbols: + - Updated symbols for the new version. + + -- Sebastian Dröge Mon, 10 Mar 2008 19:23:55 +0100 + +glib2.0 (2.15.6-1) experimental; urgency=low + + * New upstream release: + + debian/rules: + - Update shlibs version to 2.15.6. + + debian/libglib2.0-0.symbols: + - Updated symbols for the new version. + + -- Sebastian Dröge Tue, 26 Feb 2008 06:22:28 +0100 + +glib2.0 (2.15.5-1) experimental; urgency=low + + * New upstream release: + + debian/patches/02_fam-helper.patch: + - Dropped, merged upstream. + + debian/patches/60_wait-longer-for-threads-to-die.patch: + - Updated to apply cleanly again. + + debian/libglib2.0-0.symbols: + - Update symbols for 2.15.5. + + -- Sebastian Dröge Tue, 12 Feb 2008 06:08:39 +0100 + +glib2.0 (2.15.4-1) experimental; urgency=low + + [ Loic Minier ] + * Add a gio gtk-doc symlink. + * Add a doc-base file for gio. + + [ Sebastian Dröge ] + * New upstream release: + + debian/libglib2.0-0.symbols: + - Update symbols for 2.15.4. + + debian/rules: + - Update API version to 2.15.4. + * debian/patches/02_fam-helper.patch: + + Fix build failure when building with FAM and not gamin. See BGO #509419 + and BGO #512384 for more details. + + -- Sebastian Dröge Tue, 29 Jan 2008 12:14:08 +0100 + +glib2.0 (2.15.3-1) experimental; urgency=low + + * New upstream release. + * debian/rules, + debian/libglib2.0-0.symbols: + + Update shlibs and all unstable symbols to 2.15.3. + + -- Sebastian Dröge Tue, 22 Jan 2008 11:54:42 +0100 + +glib2.0 (2.15.2-3) experimental; urgency=low + + [ Loic Minier ] + * Bump up dpkg-dev build-dep to >= 1.14.13 for Build-Depends-Package; thanks + Raphaël Hertzog. + * Drop duplicate dpkg-dev bdep. + * Let libglib2.0-dev depends on ${shlibs:Depends}; thanks Niko Tyni. + + [ Sebastian Dröge ] + * debian/libgio-fam.install: + + Fix path where we install the GIO FAM plugin. It shouldn't be + /usr/lib/gio/gio but /usr/lib/gio. Thanks to Sedat Dilek for reporting. + + -- Sebastian Dröge Mon, 21 Jan 2008 08:58:33 +0100 + +glib2.0 (2.15.2-2) experimental; urgency=low + + * debian/rules: + + Disable selinux for the udeb until we have a libselinux1 udeb. + + -- Sebastian Dröge Thu, 17 Jan 2008 11:50:11 +0100 + +glib2.0 (2.15.2-1) experimental; urgency=low + + [ Sebastian Dröge ] + * New upstream development release, the new API may still change + incompatibly; API additions: + + Drop patch 67_gcc43-inline.patch, merged upstream. + * Include check-dist again to prevent accidental uploads to unstable. + * Disable testsuite for now. + * Bump shlibs to 2.15.2. + * Add build dependencies for GIO and add libgio-fam package that contains + a GIO file/directory monitoring module that uses fam. + * debian/rules, + debian/libglib2.0-0.symbols, + debian/control.in: + + Add a symbol file for GLib, generated from 2.12.4, 2.14.3, 2.15.2. + This is handled by dh_makeshlibs. Require dpkg-dev (>= 1.14.8) for this. + * debian/control.in: + + Recommend python on the -dev package for the gtester-report utility. + * debian/shlibs.local: + + Dropped as pcre is fixed now since 7.4-1 (Closes: #450796). + + [ Loic Minier ] + * Build-dep on gtk-doc-tools to prevent a spurious warning from + gtk-doc.make: "/bin/sh: line 11: test: !=: unary operator expected". + * Build udeb against system pcre again (now that it provides an udeb); bump + up libpcre build-dep to >= 7.4-1 (Closes: #443067). + + -- Sebastian Dröge Tue, 15 Jan 2008 15:30:20 +0100 + +glib2.0 (2.14.4-2) unstable; urgency=low + + * debian/rules: + + Make testsuite failures on sparc non-fatal too as the + threadpool-test fails there too, most probably of some + timing related bug. See BGO #481573. + + -- Sebastian Dröge Thu, 29 Nov 2007 11:45:57 +0100 + +glib2.0 (2.14.4-1) unstable; urgency=low + + [ Loic Minier ] + * Fix disabled patch name 01_gettext-desktopfiles in series. + + [ Josselin Mouette ] + * Conflict against nautilus < 2.20 according to + http://bugzilla.gnome.org/show_bug.cgi?id=440988#c182 + + [ Sebastian Dröge ] + * New upstream bugfix release. + + -- Sebastian Dröge Sun, 25 Nov 2007 14:37:34 +0100 + +glib2.0 (2.14.3-1) unstable; urgency=high + + [ Sebastian Dröge ] + * debian/shlibs.local: + + Override libpcre3's shlibs to require at least pcre 7.2 (See: #449289). + + [ Loic Minier ] + * New upstream stable release; bug fixes and security update. + - SECURITY: Update the internal copy of PCRE to 7.4, fixes CVE-2007-4767; + the internal copy is used for the udeb. + - Drop relibtoolizing patch, 70_relibtoolize, as upstream prepared this + tarball with libtool 1.5.24. + + -- Loic Minier Sat, 10 Nov 2007 19:59:04 +0100 + +glib2.0 (2.14.2-1) unstable; urgency=low + + * Add GNOME bug id to 70_relibtoolize. + * New upstream stable release; no API change. + * Add lpia to the list of arches on which testsuite failures are fatal. + + -- Loic Minier Wed, 17 Oct 2007 17:19:16 +0200 + +glib2.0 (2.14.1-5) unstable; urgency=low + + * Add a relibtoolizing patch, 70_relibtoolize, to get some hurd-i386 fixes + in libtool; see Debian #445001. + + -- Loic Minier Sun, 07 Oct 2007 16:52:44 +0200 + +glib2.0 (2.14.1-4) unstable; urgency=low + + * Document that testsuite failure aren't fatal on m68k due to GNOME #481575. + * Disable testsuite on arm, mips, powerpc; see GNOME #481573; mipsel was + already disabled because its testsuite results were unknown in + experimental. + * Document that testsuite failure is disabled on hppa, hurd, kfreebsd-amd64, + kfreebsd-i386 due to Debian #428674. + + -- Loic Minier Sat, 29 Sep 2007 13:56:18 +0200 + +glib2.0 (2.14.1-3) unstable; urgency=medium + + * Only build the standards debs against the system PCRE, i.e. build the udeb + against the builtin PCRE until pcre3 provides an udeb. + + -- Loic Minier Tue, 18 Sep 2007 21:35:30 +0200 + +glib2.0 (2.14.1-2) unstable; urgency=low + + * debian/control.in, + debian/rules: + + Build against the system PCRE instead of the supplied one. + + -- Sebastian Dröge Mon, 17 Sep 2007 09:41:48 +0200 + +glib2.0 (2.14.1-1) unstable; urgency=low + + [ Loic Minier ] + * Mention I added 90_fix-abi-check-with-debug in 2.14.0-1 + + [ Sebastian Dröge ] + * New upstream major stable release, without API changes. + * debian/patches/90_fix-abi-check-with-debug.patch: + + Dropped, merged upstream. + + -- Sebastian Dröge Mon, 17 Sep 2007 06:35:29 +0200 + +glib2.0 (2.14.0-2) unstable; urgency=low + + * Upload to unstable; drop check-dist include. + + -- Loic Minier Tue, 21 Aug 2007 09:05:30 +0200 + +glib2.0 (2.14.0-1) experimental; urgency=low + + * Fix double --host/--build flags to configure. + * Update patch 67_gcc43-inline to also fix the headers for GCC 4.2. + * New upstream major stable release; API additions. + - Bump up shlibs to >= 2.14.0. + - Drop patch 90_from_svn_fix_missing_pointer_casting, merged upstream. + - New patch, 90_fix-abi-check-with-debug, fixes build of testsuite in + debug mode; from SVN. + + -- Loic Minier Mon, 20 Aug 2007 21:54:07 +0200 + +glib2.0 (2.13.7-3) experimental; urgency=low + + * debian/patches/90_from_svn_fix_missing_pointer_casting.patch: + - patch from SVN, "fixed missing pointer casts when using atomic ops." + (Closes: #434853) + + -- Sebastien Bacher Fri, 27 Jul 2007 16:14:13 +0200 + +glib2.0 (2.13.7-2) experimental; urgency=low + + * Bump shlibs to 2.13.7. + + -- Loic Minier Wed, 25 Jul 2007 16:09:27 +0200 + +glib2.0 (2.13.7-1) experimental; urgency=low + + * Drop "libtool_is_fool" snippet patching hardcode_libdir_flag_spec and + archive_cmds which is probably dangerous with newer libtools. + * Fix flavor name in a comment of debian/rules. + * Use -s instead of -a in arch-specific dh_* calls. + * New upstream development release; some API additions. + - Drop patch 60_output-lines-during-tests, merged upstream. + * New patch, 60_wait-longer-for-threads-to-die, to wait 5 seconds instead of + one for threads to die in the threadpool test; hopefully fixes hppa and + kfreebsd testsuite failures; see #428674 and #431720. + * Don't make testsuite failures fatal on hppa; closes: #431720. + + -- Loic Minier Thu, 12 Jul 2007 21:37:47 +0200 + +glib2.0 (2.13.6-1) experimental; urgency=low + + * Don't pass -L to dh_shlibdeps as the shlibs.local trick is enough and this + can result in duplicate deps; closes: #317461. + * Set myself as maintainer. + * Cleanups. + * Make the testsuite failures fatal on arches which passed the testsuite + with 2.13.5 in experimental (currently: alpha amd64 arm hppa i386 ia64 + mips powerpc s390); closes: #291486. + * Don't run the testsuite when cross-compiling. + * New upstream development release; only API change is to change back the + definition of GType for C++ to be gulong. + + -- Loic Minier Mon, 02 Jul 2007 10:21:34 +0200 + +glib2.0 (2.13.5-1) experimental; urgency=low + + * New upstream release + - Bump shlibs to >= 2.13.5, as the API was changed + + -- Marc 'HE' Brockschmidt Tue, 19 Jun 2007 16:14:16 +0200 + +glib2.0 (2.13.4-2) experimental; urgency=low + + * New patch, 67_gcc43-inline, fixes FTBFS of apps using glib with GCC 4.3 + which uses C99 where the meaning of "inline" changed; patch was adapted + from patches in GNOME #315437 and Gentoo #156475; closes: #416863. + + -- Loic Minier Sat, 16 Jun 2007 18:49:57 +0200 + +glib2.0 (2.13.4-1) experimental; urgency=low + + * Also honor parallel=n in DEB_BUILD_OPTIONS. + * New upstream release series; these are development releases, the new API + may still change incompatibly. + - Target at experimental; include check-dist. + - Bump up shlibs to >= 2.13.4. + * New patch but disabled, 01_gettext-desktopfiles, permits overriding the + gettext domain when desktop files have such a field; found in the Ubuntu + package. + + -- Loic Minier Wed, 13 Jun 2007 10:52:27 +0200 + +glib2.0 (2.12.12-1) unstable; urgency=low + + * Fix description of the -dbg package. + * New upstream release. + + -- Loic Minier Thu, 03 May 2007 19:14:33 +0200 + +glib2.0 (2.12.11-3) unstable; urgency=medium + + * Initialize CFLAGS to -Wall -g; pass debian/rules' CFLAGS and LDFLAGS to + configure, doh! + * Track all stable versions in watch file. + * Wrap build-deps and deps. + * Add ${misc:Depends}. + * New patch 60_output-lines-during-tests, outputs newlines after thousand + iterations of the inner-loop of the closures test to avoid the timeout on + mips and mipsel buildds. + + -- Loic Minier Thu, 12 Apr 2007 16:13:46 +0200 + +glib2.0 (2.12.11-2) unstable; urgency=low + + * Run "make check" test suite for the deb flavor except if DEB_BUILD_OPTIONS + contains the "nocheck" keyword; ignore failures. + * Include the new uploaders.mk from gnome-pkg-tools instead of duplicating + its logic; build-dep on gnome-pkg-tools >= 0.11. + * Drop useless version computations. + * Add support for DEB_BUILD_OPTIONS_PARALLEL. + * Upload to unstable; drop check-dist include. + + -- Loic Minier Wed, 11 Apr 2007 10:35:43 +0200 + +glib2.0 (2.12.11-1) experimental; urgency=medium + + * New upstream release; no API change. + + -- Loic Minier Fri, 9 Mar 2007 22:02:25 +0100 + +glib2.0 (2.12.10-1) experimental; urgency=low + + * Include the new check-dist Makefile to prevent accidental uploads to + unstable; bump build-dep on gnome-pkg-tools to >= 0.10. + * New upstream release; no API change. + - Rewrite and cleanup the build-system completely to build a set of + flavors; drop obsolete targets; drop obsolete files; switch from + tar-in-tar and sys-build to regular source and quilt patching; + build-depend on quilt; drop DEB_USE_DBS_TARBALL_LAYOUT; create stampdir + when necessary; switch from dh_movefiles and dh_installdirs to + dh_install. + - Drop patch 000_glib-link; merged upstream. + * Bump up Debhelper compatibility level to 5. + * Only ship README.Debian in libglib2.0-dev. + * Empty dependency_libs in the *.la files of libglib2.0-dev. + * Override shlibs for the inter-shlibdeps before computing them. + * Use >= ${source:Version} and ${binary:Version} for inder-deps; build-dep + on dpkg-dev >= 1.13.19. + * Fix --dbg-package name. + * Use make vars for package names. + * Tune udeb description. + * Clean /usr/share/doc symlinks generation and move to dh_link generated + links. + * Cleanup list of invoked dh_* commands. + + -- Loic Minier Thu, 8 Mar 2007 18:51:27 +0100 + +glib2.0 (2.12.9-2) experimental; urgency=low + + * Bump shlibs to >= 2.12.9. + * Avoir overwriting the *.la files of the main build with the *.la files of + the udeb build; fixes "old_library" in *.la files; thanks Tim Dijkstra; + closes: #297741. + + -- Loic Minier Sat, 20 Jan 2007 09:13:40 +0100 + +glib2.0 (2.12.9-1) experimental; urgency=low + + * Add a get-orig-source target to retrieve the upstream tarball. + * New upstream releases; no API change. + - Fixes documentation of g_key_file_set_string_list(); closes: #405028. + - Avoids spewing warnings with gcc 2.95; closes: #303124. + - Drop patch 009_accept-space-in-key-names; merged and adapted upstream. + + -- Loic Minier Wed, 17 Jan 2007 08:55:27 +0100 + +glib2.0 (2.12.7-1) experimental; urgency=low + + * New upstream release; no API change; translation updates, bug fixes, + build fixes. + - Target at experimental for now. + - Drop patch 010_restore-old-key-file-syntax-support, merged and adapted + upstream. + + -- Loic Minier Fri, 5 Jan 2007 12:24:38 +0100 + +glib2.0 (2.12.6-2) unstable; urgency=medium + + * New patch, 010_restore-old-key-file-syntax-support, reverts strict group + names and key names checks introduced between glib 2.12.4 and 2.12.6; + instead of failing, critical warnings are output; updates the relevant + tests as well; closes: #404888. + * New patch, 009_accept-space-in-key-names, adds support for space in key + names (independently of 010_restore-old-key-file-syntax-support); updates + and add relevant tests as well; closes: #404888 as well. + + -- Loic Minier Sun, 31 Dec 2006 20:43:23 +0100 + +glib2.0 (2.12.6-1) unstable; urgency=low + + * New upstream release; no API or ABI change. + - Fixes file-type detection in nautilus; closes: #404015. + + -- Loic Minier Thu, 21 Dec 2006 09:46:30 +0100 + +glib2.0 (2.12.5-3) unstable; urgency=low + + * Upload to unstable. + + -- Loic Minier Wed, 20 Dec 2006 17:27:25 +0100 + +glib2.0 (2.12.5-2) experimental; urgency=low + + * Upload to unstable. + + -- Loic Minier Wed, 20 Dec 2006 08:50:56 +0100 + +glib2.0 (2.12.5-1) experimental; urgency=low + + * Add cross-reference in 2.12.4-2. + * New upstream release; no API or ABI change. + - Target at experimental for now. + - Drop patch 011_glib-gettext-datarootdir, merged upstream. + * Drop patch 010_glib2.0.kfreebsd-amd64, is not needed anymore and seems to + have been at the wrong level anyway. + * Review and comment on the usefulness of patch 000_glib-link. + + -- Loic Minier Tue, 19 Dec 2006 08:52:26 +0100 + +glib2.0 (2.12.4-2) unstable; urgency=low + + * New patch, 011_glib-gettext-datarootdir, to compute datarootdir + appropriately for AM_GLIB_DEFINE_LOCALEDIR; GNOME #343825; + closes: #370282. + + -- Loic Minier Thu, 16 Nov 2006 10:14:52 +0100 + +glib2.0 (2.12.4-1) unstable; urgency=low + + * New upstream release; no API changes. + + -- Loic Minier Mon, 2 Oct 2006 10:39:57 +0200 + +glib2.0 (2.12.3-2) unstable; urgency=low + + * Upload to unstable + + [ Loic Minier] + * Merge 2.10.3-3. + + -- Sebastien Bacher Wed, 13 Sep 2006 13:16:29 +0200 + +glib2.0 (2.12.3-1) experimental; urgency=low + + * New upstream release; no public API changes. + * Broaden the -data dep on the lib to permit bin NMUs. + + -- Loic Minier Wed, 30 Aug 2006 22:12:02 +0200 + +glib2.0 (2.12.2-1) experimental; urgency=low + + * New upstream release; no API changes. + + -- Loic Minier Mon, 21 Aug 2006 12:30:24 +0200 + +glib2.0 (2.12.1-1) experimental; urgency=low + + * New upstream release. + * Sync with overrides and set udeb's Priority to optional instead of extra. + * Bump up Standards-Version to 3.7.2. + + -- Loic Minier Mon, 7 Aug 2006 22:08:21 +0200 + +glib2.0 (2.12.0-1) experimental; urgency=low + + * New upstream version: + Major new features include: + * The Unicode support has been updated to Unicode 5. + * GBookmarkFile: a parser for files containing bookmarks + stored using the Desktop Bookmark specification + * Base64 encoding support + * debian/rules: + - updated shver number + * debian/watch: + - updated + + -- Sebastien Bacher Mon, 3 Jul 2006 10:46:21 +0200 + +glib2.0 (2.10.3-3) unstable; urgency=low + + * debian/patches/999_ia64_atomic_ops_broken.patch: + - dropped, it's not required with the new gcc and it was breaking the build + (Closes: #376260) + + [ Loic Minier ] + * Sync with overrides and set udeb's Priority to optional instead of extra. + + -- Sebastien Bacher Wed, 12 Jul 2006 19:09:21 +0200 + +glib2.0 (2.10.3-2) unstable; urgency=medium + + * Re-add changes from 2.10.2-2 that were lost in the wild + (closes: #361697). + + -- Josselin Mouette Mon, 26 Jun 2006 19:54:17 +0200 + +glib2.0 (2.10.3-1) unstable; urgency=low + + * New upstream version: + Bugs fixed: + - g_completion_complete_utf8 crashes when NULL is passed to it + - update-desktop-database doesn't handle duplicate entries + (Closes: #298668) + - Dereferencing NULL value in g_key_file_get_group_comment + - GKeyFile set_string_list invalid memory reads + - The GObject tutorial say g_object_(un)ref is _not_ thread-safe + - Fix a memory leak in GOption + + -- Sebastien Bacher Sat, 27 May 2006 12:54:17 +0200 + +glib2.0 (2.10.2-2) unstable; urgency=low + + * debian/control.in, debian/rules: + - patch by Frans Pop + - Add support for udeb dependency resolution in shlibs file + (Closes: #361697). + - Simplify debian/rules by making use of udeb support in debhelper. + * debian/control.in: + - clarify the description for the -data package (Closes: #362316), + change suggested Robert Bihlmeyer + + -- Sebastien Bacher Fri, 28 Apr 2006 00:03:41 +0200 + +glib2.0 (2.10.2-1) unstable; urgency=low + + * New upstream version: + - Missing check for .dylib + - Segmentation Fault when %llu is passed to vasnprintf and HAVE_SNPRINTF + is not defined + - Add support for write FDs to GIOChannel + - Memleak in goption.c::parse_short_option + - g_parse_debug_string reads beyond buffer + - g_option_context_parse() should not set program name to '' if + it is already set + - g_main_context_unref calls g_source_destroy_internal with incorrect + arguments + - Slight performance gains (GList, GAsyncQueue) + - Use of unitialised memory in g_mem_profile + - make check FAIL: threadpool-test + - g_option_context_new parameter lacks better explanation + - Some breakages with GThreadPool + - gthread/gthread-win32.c: IsDebuggerPresent needs + '#define _WIN32_WINDOWS 0x0401' + - dlerror() portability issue causes crash on (old) a.out NetBSD platform + - g_timer_elapsed docs should mention that microseconds may be NULL + - goption + error out params + - Documentation should not reference G_HAVE_GINT64, as it's deprecated. + * debian/patches/010_glib2.0.kfreebsd-amd64.patch: + - patch by Aurelien Jarno , fix build on kfreebsd-amd64 + (Closes: #355953) + * debian/rules: + - use "-g" for CFLAGS, makes -dbg package useful again + change by Fabio M. Di Nitto on the Ubuntu package: + * Make sure to pass CFLAGS to configure. + * Generalize DEB_BUILD_ARCH. + + -- Sebastien Bacher Fri, 7 Apr 2006 23:23:14 +0200 + +glib2.0 (2.10.1-2) unstable; urgency=low + + [ Sjoerd Simons ] + * Upload to unstable + * Document udeb changes that Josselin did in an earlier experimental + package. + * debian/patches/999_ia64_atomic_ops_broken.patch + + Added. Uses atomic builtins that gcc-4.0 know on ia64, instead of those + for gcc-4.1. (Patch by LaMont Jones from the ubuntu package) + * Updated debian/watch to use download.gnome.org + + [ Josselin Mouette ] + * Set the conflict with pango < 1.11, that's where the breakage lies. + * Add a XC-Package-Type header to the udeb and set the priority to extra. + [debian/control.in] + + -- Sjoerd Simons Sun, 19 Mar 2006 12:41:21 +0100 + +glib2.0 (2.10.1-1) experimental; urgency=low + + * New upstream release (bugfixes, translation updates). + * [debian/rules] Bring priority parameter for dpkg-distaddfile for the udeb + in line with control.in . + + Josselin Mouette : + * Conflict with pango < 1.10 to avoid breakage caused by the unicode + changes. + + -- J.H.M. Dassen (Ray) Sat, 11 Mar 2006 13:53:16 +0100 + +glib2.0 (2.10.0-1) experimental; urgency=low + + * New upstream release. + + -- Josselin Mouette Mon, 6 Mar 2006 00:32:27 +0100 + +glib2.0 (2.8.6-1) unstable; urgency=medium + + * New upstream release (bugfixes, translation updates). + + -- J.H.M. Dassen (Ray) Wed, 18 Jan 2006 20:30:26 +0100 + +glib2.0 (2.8.5-1) unstable; urgency=low + + * New upstream release (bugfixes, translation updates, + g_object_compat_control() added). + * [debian/rules] Bumped shver to 2.8.5 to reflect the API change. + + -- J.H.M. Dassen (Ray) Thu, 5 Jan 2006 21:22:36 +0100 + +glib2.0 (2.8.4-2) unstable; urgency=high + + * Fix shlibs deps that crept in the amd64 package, thanks Kurt Roeckx for + all the fish. (Closes: #339685) + - Cleanup and clarify upstream version calculations. + - Drop dh_makeshlibs -a call as only one package ships shlibs and already + has a separate call. + - Drop useless shlibs.local generation. + - Call dh_shlibdeps with cleaner arguments. + [debian/rules] + * Fix "fakeroot debian/rules clean" by following find calls with a .svn + filter. + [debian/scripts/lib] + * Fix quoting of unfix.source.patch:START and FAILED messages. + [debian/scripts/messages] + * Clarify Copyright versus License and update upstream URL. + [debian/copyright] + + -- Loic Minier Sun, 20 Nov 2005 10:36:26 +0100 + +glib2.0 (2.8.4-1) unstable; urgency=low + + * New upstream version. + + -- Sebastien Bacher Tue, 15 Nov 2005 16:22:08 +0100 + +glib2.0 (2.8.3-1) unstable; urgency=medium + + * New upstream release (fix an error that crept in with a change to + glib-mkenums in 2.8.2, documentation improvements, translation updates). + + -- J.H.M. Dassen (Ray) Mon, 3 Oct 2005 20:52:26 +0200 + +glib2.0 (2.8.2-1) unstable; urgency=medium + + * New upstream release (bug fixes, documentation improvements, translation + updates). + + -- J.H.M. Dassen (Ray) Sun, 2 Oct 2005 09:31:27 +0200 + +glib2.0 (2.8.1-1) unstable; urgency=medium + + * New (for Debian) upstream version (bug fixes, documentation improvements, + translation updates). + * [debian/control.in] Bumped Standards-Version. + * [debian/copyright] Updated FSF's address. + + -- J.H.M. Dassen (Ray) Sat, 24 Sep 2005 13:45:47 +0200 + +glib2.0 (2.8.1-0ubuntu1) breezy; urgency=low + + * New upstream version. + * debian/watch: + - updated. + + -- Sebastien Bacher Tue, 23 Aug 2005 12:05:20 +0200 + +glib2.0 (2.8.0-1) unstable; urgency=low + + * New upstream version. + * debian/rules: + - updated the shlibs. + + -- Sebastien Bacher Sat, 13 Aug 2005 14:14:00 +0200 + +glib2.0 (2.7.3-1) experimental; urgency=low + + * New upstream version. + + -- Sebastien Bacher Fri, 15 Jul 2005 23:42:37 +0200 + +glib2.0 (2.7.2-1) experimental; urgency=low + + * New upstream version. + + -- Sebastien Bacher Fri, 8 Jul 2005 22:07:59 +0200 + +glib2.0 (2.7.1-1) experimental; urgency=low + + * New upstream version. + * debian/rules: + - updated the shlib. + + -- Sebastien Bacher Fri, 1 Jul 2005 19:43:05 +0200 + +glib2.0 (2.7.0-1) experimental; urgency=low + + * New upstream version: + * GKeyFile: + - add unit tests. + - accept \r\n as line end. + - don't interpret leading zeros as octal numbers. + - make key and group removal work. + * GOption: + - improve formatting of --help output. + - accept -?. + - warn about duplicate main groups. + - treat '-' as non-option argument. + - report missing arguments as errors. + - add a boxed type for GDate. + * GTree: + - g_tree_remove() and g_tree_steal() return status information. + * Stdio wrappers: + - work regardless of large file support. + - add g_access(), g_chmod(), g_creat(), g_chdir. + * GObject: + - implement "toggle references" to help language bindings. + - allow to mark names, nicks and blurbs of pspecs as static. + - make pspec lookup a bit faster. + * add g_listenv() to list all set environment variables. + * add g_file_set_contents() to atomically write a file. + * add g_try_malloc(), g_try_new(), g_try_new0() and g_try_renew(). + * add g_utf8_collate_key_for_filename() to sort filenames taking + extensions and numeric suffixes into account. + * add G_GNUC_NULL_TERMINATED to mark varargs function with + NULL-terminated argument lists. + * documentation improvements. + * new and updated translations. + * debian/rules: + - updated the shlibs. + * debian/watch: + - updated. + + -- Sebastien Bacher Tue, 21 Jun 2005 12:15:47 +0200 + +glib2.0 (2.6.5-1) unstable; urgency=low + + * New upstream release again bringing a number of bugfixes, improved + documentation and updated translations, including + gthread-posix.c (g_thread_create_posix_impl): Allow setstacksize to + fail. (GNOME #304790, Michael Banck) (Closes: #312382) + * [debian/patches/000_glib-link.patch] Updated. + + -- J.H.M. Dassen (Ray) Fri, 10 Jun 2005 21:14:42 +0200 + +glib2.0 (2.6.4-1) unstable; urgency=low + + * New upstream release bringing a number of bugfixes, improved + documentation and updated translations. + + -- J.H.M. Dassen (Ray) Wed, 6 Apr 2005 22:16:44 +0200 + +glib2.0 (2.6.3-1) unstable; urgency=low + + * New upstream release. + + -- Sebastien Bacher Mon, 28 Feb 2005 09:38:38 +0100 + +glib2.0 (2.6.2-1) unstable; urgency=low + + * New upstream release. + + -- Sebastien Bacher Sat, 5 Feb 2005 19:23:59 +0100 + +glib2.0 (2.6.1-3) unstable; urgency=low + + * debian/rules: + - use "-plibglib$(apiver)-udeb", fix the libglib2.0-0-dbg package. + + -- Sebastien Bacher Sun, 23 Jan 2005 22:24:21 +0100 + +glib2.0 (2.6.1-2) unstable; urgency=low + + * Upload to unstable. + * debian/control.in: + - rename libglib2.0-dbg to libglib2.0-0-dbg. + - set myself as maintainer. + * debian/rules: + - use dh_strip to make the debug package. + + -- Sebastien Bacher Sun, 16 Jan 2005 12:59:21 +0100 + +glib2.0 (2.6.1-1) experimental; urgency=low + + * New upstream release. + + -- Sebastien Bacher Sat, 8 Jan 2005 14:44:05 +0100 + +glib2.0 (2.6.0-1) experimental; urgency=low + + * New upstream release. + * debian/rules: + - updated the shlibs. + * debian/watch: + - updated. + + -- Sebastien Bacher Mon, 27 Dec 2004 16:15:36 +0100 + +glib2.0 (2.4.8-1) unstable; urgency=medium + + * New upstream bugfix release. + + -- J.H.M. Dassen (Ray) Sat, 4 Dec 2004 18:52:44 +0100 + +glib2.0 (2.4.7-1) unstable; urgency=medium + + * New upstream bugfix release. + * [debian/patches/000_glib-link.patch] Updated. + * [debian/patches/001_translations.patch] Dropped. + + -- J.H.M. Dassen (Ray) Fri, 8 Oct 2004 22:27:49 +0200 + +glib2.0 (2.4.6-4) unstable; urgency=medium + + * [debian/patches/001_translations.patch] Updated translations from CVS and + relibtoolise to use new translations. + * [debian/rules] Fixed udeb naming on Hurd. + + -- J.H.M. Dassen (Ray) Fri, 8 Oct 2004 12:43:09 +0200 + +glib2.0 (2.4.6-3) unstable; urgency=medium + + Colin Watson : (Closes: #274053) + * [debian/rules] binary-arch depends on binary-arch-udeb. + * [debian/rules] Strip udeb! + + -- J.H.M. Dassen (Ray) Wed, 29 Sep 2004 19:39:22 +0200 + +glib2.0 (2.4.6-2) unstable; urgency=medium + + * [debian/patches/001_translations.patch] Updated translations from CVS. + * [debian/rules] Tightened "shver" to tighten shlibs, as some + incompatibilities with older versions turned up with gconf. + (Closes: #265659) + + -- J.H.M. Dassen (Ray) Tue, 24 Aug 2004 18:50:04 +0200 + +glib2.0 (2.4.6-1) unstable; urgency=medium + + * New upstream bugfix release. + + -- J.H.M. Dassen (Ray) Sun, 15 Aug 2004 18:34:27 +0200 + +glib2.0 (2.4.5-2) unstable; urgency=low + + * debian/patches/000_glib-link.patch: + - patch from Jurij Smakov to link with all the libs + (Closes: #263130). + + -- Sebastien Bacher Tue, 3 Aug 2004 18:03:53 +0200 + +glib2.0 (2.4.5-1) unstable; urgency=low + + * New upstream release. + + -- Sebastien Bacher Sun, 1 Aug 2004 17:31:43 +0200 + +glib2.0 (2.4.4-1) unstable; urgency=low + + * New upstream release. + - remove spaces before "#pragma alloca" (Closes: #250667). + + -- Sebastien Bacher Fri, 16 Jul 2004 18:44:31 +0200 + +glib2.0 (2.4.2-1) unstable; urgency=low + + * New upstream release. + + -- Sebastien Bacher Sat, 5 Jun 2004 00:51:01 +0200 + +glib2.0 (2.4.1-2) unstable; urgency=low + + * Upload in unstable. + * GNOME Team Upload. + * J.H.M. Dassen (Ray) : + + [debian/rules] Make the linker work a bit harder so dynamic loading can + be done faster; safety measure: ensure the build aborts when the library + still has references to undefined symbols. + + -- Sebastien Bacher Sat, 22 May 2004 14:18:23 +0200 + +glib2.0 (2.4.1-1) experimental; urgency=low + + * New upstream release. + * GNOME Team Upload. + * debian/rules: + - updated shlib version to 2.4.1. + + -- Sebastien Bacher Sun, 2 May 2004 12:47:25 +0200 + +glib2.0 (2.4.0-2) experimental; urgency=low + + * Akira TAGOH + - debian/rules: + - bumped shlib version to 2.4.0. + + -- Akira TAGOH Wed, 24 Mar 2004 09:12:31 +0900 + +glib2.0 (2.4.0-1) experimental; urgency=low + + * New upstream release. + * debian/rules: + - doh. don't claim the newer shlibs. + * debian/control: + - added Uploaders to maintain as team. + - added gnome-pkg-tools to Build-Depends. + * debian/docs: + - added old ChangeLog and NEWS files. + + -- Akira TAGOH Wed, 17 Mar 2004 21:18:00 +0900 + +glib2.0 (2.2.3-1) unstable; urgency=low + + * "Welcome back my laptop PC!" release. + * New upstream release. + * debian/control: + - bumped Standards-Version to 3.6.1.0. + + -- Akira TAGOH Mon, 1 Sep 2003 02:29:14 +0900 + +glib2.0 (2.2.2-1) unstable; urgency=low + + * New upstream release. + - Fix portability problems with G_MIN/MAX_INT64 (closes: Bug#195302) + * debian/control: + - bumped Standards-Version to 3.5.10.0. + - changed the sections for libglib2.0-dev and libglib2.0-dbg to libdevel. + * debian/compat: + - use it instead of DH_COMPAT. + + -- Akira TAGOH Tue, 10 Jun 2003 18:44:01 +0900 + +glib2.0 (2.2.1-3) unstable; urgency=low + + * debian/control: + - rename libglib2.0-0-udeb to libglib2.0-udeb. + - delete Recommends line from libglib2.0-udeb. (closes: Bug#183749) + - add Provides: libglib2.0-0 for libglib2.0-udeb. + * debian/libglib2.0-udeb.files: + - contain the libraries and locale data. + + -- Akira TAGOH Sat, 8 Mar 2003 02:46:19 +0900 + +glib2.0 (2.2.1-2) unstable; urgency=low + + * debian/rules: + - create the symlinks on /usr/share/gtk-doc/html. (closes: Bug#183504) + - changed DH_COMPAT to 4. + * debian/control: + - add libglib2.0-0-udeb package for debian-installer. + + -- Akira TAGOH Thu, 6 Mar 2003 01:14:44 +0900 + +glib2.0 (2.2.1-1) unstable; urgency=low + + * New upstream release. + * debian/control: + - needed pkg-config (>= 0.14.0). + - add autotools-dev to Build-Depends. + + -- Akira TAGOH Tue, 4 Feb 2003 01:02:20 +0900 + +glib2.0 (2.2.0-2) unstable; urgency=low + + * close to be fixed in the upstream release. (closes: Bug#173508) + + -- Akira TAGOH Tue, 7 Jan 2003 17:22:20 +0900 + +glib2.0 (2.2.0-1) unstable; urgency=low + + * New upstream release. + * debian/control: + bumped Standards-Version to 3.5.8. + + -- Akira TAGOH Wed, 25 Dec 2002 13:46:08 +0900 + +glib2.0 (2.0.7-1) unstable; urgency=low + + * New upstream release. + * debian/control: + - changed libc6-dev to libc6-dev | libc-dev in -dev's Depends. + - bumped Standards-Version and depends debhelper (>> 4). + - add libgtk2.0-doc to Suggests for -doc. + * debian/rules: + - add symlink to fix the missing symlink for gtk. but this release doesn't + include the hyperlink for gtk+ (closes: Bug#162845) + - support noopt option for DEB_BUILD_OPTIONS. + + -- Akira TAGOH Tue, 5 Nov 2002 17:06:50 +0900 + +glib2.0 (2.0.6-1) unstable; urgency=low + + * New upstream release. + * debian/rules: removed --enable-debug option. conform to the default value + now. (closes: Bug#151815) + * debian/patches/000_glib2.0-garray.patch: removed because it's merged by + the upstream. + + -- Akira TAGOH Sun, 4 Aug 2002 16:05:03 +0900 + +glib2.0 (2.0.4-3) unstable; urgency=low + + * debian/patches/000_glib2.0-garray.patch: + applied to fix g_ptr_array_index() macro. (closes: Bug#150521) + + -- Akira TAGOH Sat, 29 Jun 2002 19:46:51 +0900 + +glib2.0 (2.0.4-2) unstable; urgency=low + + * debian/libglib2.0-doc.doc-base.gobject: fix the dupplicated title. + (closes: Bug#150040) + + -- Akira TAGOH Sun, 16 Jun 2002 23:27:38 +0900 + +glib2.0 (2.0.4-1) unstable; urgency=low + + * New upstream release. + + -- Akira TAGOH Sun, 16 Jun 2002 03:33:22 +0900 + +glib2.0 (2.0.3-1) unstable; urgency=low + + * New upstream release. + + -- Akira TAGOH Wed, 29 May 2002 00:49:56 +0900 + +glib2.0 (2.0.1-2) unstable; urgency=low + + * debian/scripts/vars.build: fix bashism. + * debian/README.Debian: add static link issue. + * debian/rules: add --enable-static. (closes: Bug#142198) + + -- Akira TAGOH Thu, 11 Apr 2002 19:25:17 +0900 + +glib2.0 (2.0.1-1) unstable; urgency=low + + * New upstream release. + + -- Akira TAGOH Sat, 30 Mar 2002 16:23:54 +0900 + +glib2.0 (2.0.0-1) unstable; urgency=low + + * Initial Release. + + -- Akira TAGOH Tue, 12 Mar 2002 02:32:11 +0900 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..3530d82 --- /dev/null +++ b/debian/control @@ -0,0 +1,121 @@ +Source: glib2.0 +Section: libs +Priority: optional +Maintainer: Sanghyun Park , Wonsik Jung , Boram Park , Eunok Kim +Build-Depends: debhelper (>> 5.0.22), + pkg-config (>= 0.14.0), + gettext, + autotools-dev, + gnome-pkg-tools (>= 0.11), + quilt, + zlib1g-dev, + gtk-doc-tools +Standards-Version: 3.8.3 + +Package: libglib2.0-0 +Section: libs +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + zlib1g +Recommends: libglib2.0-data, + shared-mime-info +Conflicts: libpango1.0-0 (<< 1.11) +Description: The GLib library of C routines + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared libraries. + +Package: libglib2.0-dev +Section: libdevel +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + libglib2.0-0 (= ${binary:Version}), + zlib1g-dev, + pkg-config (>= 0.14.0) +Recommends: python +Suggests: libglib2.0-doc +Replaces: libglib1.3-dev +Conflicts: libglib1.3-dev +Description: Development files for the GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package is needed to compile programs against libglib2.0-0, + as only it includes the header files and static libraries (optionally) + needed for compiling. + +Package: libglib2.0-0-dbg +Section: debug +Priority: extra +Architecture: any +Depends: ${misc:Depends}, + libglib2.0-0 (= ${binary:Version}) +Conflicts: libglib2.0-dbg +Replaces: libglib2.0-dbg +Description: The GLib libraries and debugging symbols + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains detached debugging symbols. + . + Most people will not need this package. + +Package: libglib2.0-data +Architecture: all +Depends: ${misc:Depends}, + libglib2.0-0 (>= ${source:Version}) +Replaces: libglib1.3, + libglib1.3-data +Conflicts: libglib1.3-data +Description: Common files for GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package is needed for the runtime libraries to display messages in + languages other than English. + +Package: libglib2.0-doc +Section: doc +Architecture: all +Depends: ${misc:Depends} +Replaces: libglib1.3-doc +Conflicts: libglib1.3-doc +Suggests: libgtk2.0-doc +Description: Documentation files for the GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the HTML documentation for the GLib library + in /usr/share/doc/libglib2.0-doc/ . + +Package: libgio-fam +Architecture: hurd-i386 kfreebsd-i386 kfreebsd-amd64 +Depends: ${shlibs:Depends} +Recommends: gamin +Description: GLib Input, Output and Streaming Library (fam module) + GIO is the input, output and streaming API of GLib. This package + provides a fam file and directory monitoring backend for it. + +Package: libglib2.0-0-refdbg +Section: debug +Priority: extra +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + libglib2.0-0 (= ${binary:Version}) +Description: The GLib library of C routines - refdbg library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared library built with + --disable-visibility so that it can be used with refdbg, a GObject + refcount debugger. diff --git a/debian/control.in b/debian/control.in new file mode 100644 index 0000000..9f60970 --- /dev/null +++ b/debian/control.in @@ -0,0 +1,121 @@ +Source: glib@APIVER@ +Section: libs +Priority: optional +Maintainer: Sanghyun Park , Wonsik Jung , Boram Park , Eunok Kim +Build-Depends: debhelper (>> 5.0.22), + pkg-config (>= 0.14.0), + gettext, + autotools-dev, + gnome-pkg-tools (>= 0.11), + quilt, + zlib1g-dev, + gtk-doc-tools +Standards-Version: 3.8.3 + +Package: @SHARED_PKG@ +Section: libs +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + zlib1g +Recommends: @DATA_PKG@, + shared-mime-info +Conflicts: libpango1.0-0 (<< 1.11) +Description: The GLib library of C routines + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared libraries. + +Package: @DEV_PKG@ +Section: libdevel +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + @SHARED_PKG@ (= ${binary:Version}), + zlib1g-dev, + pkg-config (>= 0.14.0) +Recommends: python +Suggests: @DOC_PKG@ +Replaces: libglib1.3-dev +Conflicts: libglib1.3-dev +Description: Development files for the GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package is needed to compile programs against @SHARED_PKG@, + as only it includes the header files and static libraries (optionally) + needed for compiling. + +Package: @DEBUG_PKG@ +Section: debug +Priority: extra +Architecture: any +Depends: ${misc:Depends}, + @SHARED_PKG@ (= ${binary:Version}) +Conflicts: libglib2.0-dbg +Replaces: libglib2.0-dbg +Description: The GLib libraries and debugging symbols + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains detached debugging symbols. + . + Most people will not need this package. + +Package: @DATA_PKG@ +Architecture: all +Depends: ${misc:Depends}, + @SHARED_PKG@ (>= ${source:Version}) +Replaces: libglib1.3, + libglib1.3-data +Conflicts: libglib1.3-data +Description: Common files for GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package is needed for the runtime libraries to display messages in + languages other than English. + +Package: @DOC_PKG@ +Section: doc +Architecture: all +Depends: ${misc:Depends} +Replaces: libglib1.3-doc +Conflicts: libglib1.3-doc +Suggests: libgtk2.0-doc +Description: Documentation files for the GLib library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the HTML documentation for the GLib library + in /usr/share/doc/@DOC_PKG@/ . + +Package: libgio-fam +Architecture: hurd-i386 kfreebsd-i386 kfreebsd-amd64 +Depends: ${shlibs:Depends} +Recommends: gamin +Description: GLib Input, Output and Streaming Library (fam module) + GIO is the input, output and streaming API of GLib. This package + provides a fam file and directory monitoring backend for it. + +Package: @REFDBG_PKG@ +Section: debug +Priority: extra +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + @SHARED_PKG@ (= ${binary:Version}) +Description: The GLib library of C routines - refdbg library + GLib is a library containing many useful C routines for things such + as trees, hashes, lists, and strings. It is a useful general-purpose + C library used by projects such as GTK+, GIMP, and GNOME. + . + This package contains the shared library built with + --disable-visibility so that it can be used with refdbg, a GObject + refcount debugger. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..cc56b18 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,52 @@ +This package was debianized by Akira TAGOH on +Thu, 7 Mar 2002 01:05:25 +0900. + +It was downloaded from . + +Original Authors +---------------- +Peter Mattis +Spencer Kimball +Josh MacDonald + +Please do not mail the original authors asking questions about this +version of GLib. + +GLib Team +--------- +Shawn T. Amundson +Jeff Garzik +Raja R Harinath +Tim Janik +Elliot Lee +Tor Lillqvist +Paolo Molaro +Havoc Pennington +Manish Singh +Owen Taylor +Sebastian Wilhelmi + +The random number generator "Mersenne Twister", which is used by GLib, +was developed and originally coded by: +Makoto Matsumoto +Takuji Nishimura + +License: + + This package 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 of the License, or (at your option) any later version. + + This package 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 package; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Debian systems, the complete text of the GNU Lesser General +Public License can be found in `/usr/share/common-licenses/LGPL'. + diff --git a/debian/docs b/debian/docs new file mode 100644 index 0000000..f7891b8 --- /dev/null +++ b/debian/docs @@ -0,0 +1,6 @@ +NEWS +NEWS.pre-1-3 +README +ChangeLog.pre-1-2 +ChangeLog.pre-2-0 +ChangeLog.pre-2-2 diff --git a/debian/libgio-fam.install b/debian/libgio-fam.install new file mode 100644 index 0000000..8838850 --- /dev/null +++ b/debian/libgio-fam.install @@ -0,0 +1 @@ +debian/install/deb/usr/lib/gio usr/lib diff --git a/debian/libglib2.0-0-dbg.links b/debian/libglib2.0-0-dbg.links new file mode 100644 index 0000000..77caf81 --- /dev/null +++ b/debian/libglib2.0-0-dbg.links @@ -0,0 +1 @@ +usr/share/doc/libglib2.0-0 usr/share/doc/libglib2.0-0-dbg diff --git a/debian/libglib2.0-0-refdbg.install b/debian/libglib2.0-0-refdbg.install new file mode 100644 index 0000000..bc30077 --- /dev/null +++ b/debian/libglib2.0-0-refdbg.install @@ -0,0 +1,2 @@ +debian/install/refdbg/usr/lib/libgobject*.so* usr/lib/refdbg +debian/lintian-overrides/libglib2.0-0-refdbg usr/share/lintian/overrides diff --git a/debian/libglib2.0-0.install b/debian/libglib2.0-0.install new file mode 100755 index 0000000..130e371 --- /dev/null +++ b/debian/libglib2.0-0.install @@ -0,0 +1,2 @@ +debian/install/deb/usr/lib/libglib-*.so.* usr/lib +debian/install/deb/usr/lib/libg{object,module,thread,io}-*.so.* usr/lib diff --git a/debian/libglib2.0-0.symbols b/debian/libglib2.0-0.symbols new file mode 100644 index 0000000..af20599 --- /dev/null +++ b/debian/libglib2.0-0.symbols @@ -0,0 +1,2387 @@ +libgio-2.0.so.0 libglib2.0-0 #MINVER# +* Build-Depends-Package: libglib2.0-dev + g_app_info_add_supports_type@Base 2.16.0 + g_app_info_can_delete@Base 2.20.0 + g_app_info_can_remove_supports_type@Base 2.16.0 + g_app_info_create_flags_get_type@Base 2.16.0 + g_app_info_create_from_commandline@Base 2.16.0 + g_app_info_delete@Base 2.20.0 + g_app_info_dup@Base 2.16.0 + g_app_info_equal@Base 2.16.0 + g_app_info_get_all@Base 2.16.0 + g_app_info_get_all_for_type@Base 2.16.0 + g_app_info_get_commandline@Base 2.20.0 + g_app_info_get_default_for_type@Base 2.16.0 + g_app_info_get_default_for_uri_scheme@Base 2.16.0 + g_app_info_get_description@Base 2.16.0 + g_app_info_get_executable@Base 2.16.0 + g_app_info_get_icon@Base 2.16.0 + g_app_info_get_id@Base 2.16.0 + g_app_info_get_name@Base 2.16.0 + g_app_info_get_type@Base 2.16.0 + g_app_info_launch@Base 2.16.0 + g_app_info_launch_default_for_uri@Base 2.16.0 + g_app_info_launch_uris@Base 2.16.0 + g_app_info_remove_supports_type@Base 2.16.0 + g_app_info_reset_type_associations@Base 2.20.0 + g_app_info_set_as_default_for_extension@Base 2.16.0 + g_app_info_set_as_default_for_type@Base 2.16.0 + g_app_info_should_show@Base 2.16.0 + g_app_info_supports_files@Base 2.16.0 + g_app_info_supports_uris@Base 2.16.0 + g_app_launch_context_get_display@Base 2.16.0 + g_app_launch_context_get_startup_notify_id@Base 2.16.0 + g_app_launch_context_get_type@Base 2.16.0 + g_app_launch_context_launch_failed@Base 2.16.0 + g_app_launch_context_new@Base 2.16.0 + g_ask_password_flags_get_type@Base 2.16.0 + g_async_initable_get_type@Base 2.22.0 + g_async_initable_init_async@Base 2.22.0 + g_async_initable_init_finish@Base 2.22.0 + g_async_initable_new_async@Base 2.22.0 + g_async_initable_new_finish@Base 2.22.0 + g_async_initable_new_valist_async@Base 2.22.0 + g_async_initable_newv_async@Base 2.22.0 + g_async_result_get_source_object@Base 2.16.0 + g_async_result_get_type@Base 2.16.0 + g_async_result_get_user_data@Base 2.16.0 + g_buffered_input_stream_fill@Base 2.16.0 + g_buffered_input_stream_fill_async@Base 2.16.0 + g_buffered_input_stream_fill_finish@Base 2.16.0 + g_buffered_input_stream_get_available@Base 2.16.0 + g_buffered_input_stream_get_buffer_size@Base 2.16.0 + g_buffered_input_stream_get_type@Base 2.16.0 + g_buffered_input_stream_new@Base 2.16.0 + g_buffered_input_stream_new_sized@Base 2.16.0 + g_buffered_input_stream_peek@Base 2.16.0 + g_buffered_input_stream_peek_buffer@Base 2.16.0 + g_buffered_input_stream_read_byte@Base 2.16.0 + g_buffered_input_stream_set_buffer_size@Base 2.16.0 + g_buffered_output_stream_get_auto_grow@Base 2.16.0 + g_buffered_output_stream_get_buffer_size@Base 2.16.0 + g_buffered_output_stream_get_type@Base 2.16.0 + g_buffered_output_stream_new@Base 2.16.0 + g_buffered_output_stream_new_sized@Base 2.16.0 + g_buffered_output_stream_set_auto_grow@Base 2.16.0 + g_buffered_output_stream_set_buffer_size@Base 2.16.0 + g_cancellable_cancel@Base 2.16.0 + g_cancellable_connect@Base 2.22.0 + g_cancellable_disconnect@Base 2.22.0 + g_cancellable_get_current@Base 2.16.0 + g_cancellable_get_fd@Base 2.16.0 + g_cancellable_get_type@Base 2.16.0 + g_cancellable_is_cancelled@Base 2.16.0 + g_cancellable_make_pollfd@Base 2.22.0 + g_cancellable_new@Base 2.16.0 + g_cancellable_pop_current@Base 2.16.0 + g_cancellable_push_current@Base 2.16.0 + g_cancellable_release_fd@Base 2.22.0 + g_cancellable_reset@Base 2.16.0 + g_cancellable_set_error_if_cancelled@Base 2.16.0 + g_content_type_can_be_executable@Base 2.16.0 + g_content_type_equals@Base 2.16.0 + g_content_type_from_mime_type@Base 2.18.0 + g_content_type_get_description@Base 2.16.0 + g_content_type_get_icon@Base 2.16.0 + g_content_type_get_mime_type@Base 2.16.0 + g_content_type_guess@Base 2.16.0 + g_content_type_guess_for_tree@Base 2.18.0 + g_content_type_is_a@Base 2.16.0 + g_content_type_is_unknown@Base 2.16.0 + g_content_types_get_registered@Base 2.16.0 + g_data_input_stream_get_byte_order@Base 2.16.0 + g_data_input_stream_get_newline_type@Base 2.16.0 + g_data_input_stream_get_type@Base 2.16.0 + g_data_input_stream_new@Base 2.16.0 + g_data_input_stream_read_byte@Base 2.16.0 + g_data_input_stream_read_int16@Base 2.16.0 + g_data_input_stream_read_int32@Base 2.16.0 + g_data_input_stream_read_int64@Base 2.16.0 + g_data_input_stream_read_line@Base 2.16.0 + g_data_input_stream_read_line_async@Base 2.20.0 + g_data_input_stream_read_line_finish@Base 2.20.0 + g_data_input_stream_read_uint16@Base 2.16.0 + g_data_input_stream_read_uint32@Base 2.16.0 + g_data_input_stream_read_uint64@Base 2.16.0 + g_data_input_stream_read_until@Base 2.16.0 + g_data_input_stream_read_until_async@Base 2.20.0 + g_data_input_stream_read_until_finish@Base 2.20.0 + g_data_input_stream_set_byte_order@Base 2.16.0 + g_data_input_stream_set_newline_type@Base 2.16.0 + g_data_output_stream_get_byte_order@Base 2.16.0 + g_data_output_stream_get_type@Base 2.16.0 + g_data_output_stream_new@Base 2.16.0 + g_data_output_stream_put_byte@Base 2.16.0 + g_data_output_stream_put_int16@Base 2.16.0 + g_data_output_stream_put_int32@Base 2.16.0 + g_data_output_stream_put_int64@Base 2.16.0 + g_data_output_stream_put_string@Base 2.16.0 + g_data_output_stream_put_uint16@Base 2.16.0 + g_data_output_stream_put_uint32@Base 2.16.0 + g_data_output_stream_put_uint64@Base 2.16.0 + g_data_output_stream_set_byte_order@Base 2.16.0 + g_data_stream_byte_order_get_type@Base 2.16.0 + g_data_stream_newline_type_get_type@Base 2.16.0 + g_desktop_app_info_get_is_hidden@Base 2.16.0 + g_desktop_app_info_get_type@Base 2.16.0 + g_desktop_app_info_lookup_get_default_for_uri_scheme@Base 2.16.0 + g_desktop_app_info_lookup_get_type@Base 2.16.0 + g_desktop_app_info_new@Base 2.16.0 + g_desktop_app_info_new_from_filename@Base 2.16.0 + g_desktop_app_info_new_from_keyfile@Base 2.18.0 + g_desktop_app_info_set_desktop_env@Base 2.16.0 + g_drive_can_eject@Base 2.16.0 + g_drive_can_poll_for_media@Base 2.16.0 + g_drive_can_start@Base 2.22.0 + g_drive_can_start_degraded@Base 2.22.0 + g_drive_can_stop@Base 2.22.0 + g_drive_eject@Base 2.16.0 + g_drive_eject_finish@Base 2.16.0 + g_drive_eject_with_operation@Base 2.22.0 + g_drive_eject_with_operation_finish@Base 2.22.0 + g_drive_enumerate_identifiers@Base 2.16.0 + g_drive_get_icon@Base 2.16.0 + g_drive_get_identifier@Base 2.16.0 + g_drive_get_name@Base 2.16.0 + g_drive_get_start_stop_type@Base 2.22.0 + g_drive_get_type@Base 2.16.0 + g_drive_get_volumes@Base 2.16.0 + g_drive_has_media@Base 2.16.0 + g_drive_has_volumes@Base 2.16.0 + g_drive_is_media_check_automatic@Base 2.16.0 + g_drive_is_media_removable@Base 2.16.0 + g_drive_poll_for_media@Base 2.16.0 + g_drive_poll_for_media_finish@Base 2.16.0 + g_drive_start@Base 2.22.0 + g_drive_start_finish@Base 2.22.0 + g_drive_start_flags_get_type@Base 2.22.0 + g_drive_start_stop_type_get_type@Base 2.22.0 + g_drive_stop@Base 2.22.0 + g_drive_stop_finish@Base 2.22.0 + g_emblem_get_icon@Base 2.18.0 + g_emblem_get_origin@Base 2.18.0 + g_emblem_get_type@Base 2.18.0 + g_emblem_new@Base 2.18.0 + g_emblem_new_with_origin@Base 2.18.0 + g_emblem_origin_get_type@Base 2.18.0 + g_emblemed_icon_add_emblem@Base 2.18.0 + g_emblemed_icon_get_emblems@Base 2.18.0 + g_emblemed_icon_get_icon@Base 2.18.0 + g_emblemed_icon_get_type@Base 2.18.0 + g_emblemed_icon_new@Base 2.18.0 + g_file_append_to@Base 2.16.0 + g_file_append_to_async@Base 2.16.0 + g_file_append_to_finish@Base 2.16.0 + g_file_attribute_info_flags_get_type@Base 2.16.0 + g_file_attribute_info_list_add@Base 2.16.0 + g_file_attribute_info_list_dup@Base 2.16.0 + g_file_attribute_info_list_get_type@Base 2.20.0 + g_file_attribute_info_list_lookup@Base 2.16.0 + g_file_attribute_info_list_new@Base 2.16.0 + g_file_attribute_info_list_ref@Base 2.16.0 + g_file_attribute_info_list_unref@Base 2.16.0 + g_file_attribute_matcher_enumerate_namespace@Base 2.16.0 + g_file_attribute_matcher_enumerate_next@Base 2.16.0 + g_file_attribute_matcher_matches@Base 2.16.0 + g_file_attribute_matcher_matches_only@Base 2.16.0 + g_file_attribute_matcher_new@Base 2.16.0 + g_file_attribute_matcher_ref@Base 2.16.0 + g_file_attribute_matcher_unref@Base 2.16.0 + g_file_attribute_status_get_type@Base 2.16.0 + g_file_attribute_type_get_type@Base 2.16.0 + g_file_copy@Base 2.16.0 + g_file_copy_async@Base 2.16.0 + g_file_copy_attributes@Base 2.16.0 + g_file_copy_finish@Base 2.16.0 + g_file_copy_flags_get_type@Base 2.16.0 + g_file_create@Base 2.16.0 + g_file_create_async@Base 2.16.0 + g_file_create_finish@Base 2.16.0 + g_file_create_flags_get_type@Base 2.16.0 + g_file_create_readwrite@Base 2.22.0 + g_file_create_readwrite_async@Base 2.22.0 + g_file_create_readwrite_finish@Base 2.22.0 + g_file_delete@Base 2.16.0 + g_file_dup@Base 2.16.0 + g_file_eject_mountable@Base 2.16.0 + g_file_eject_mountable_finish@Base 2.16.0 + g_file_eject_mountable_with_operation@Base 2.22.0 + g_file_eject_mountable_with_operation_finish@Base 2.22.0 + g_file_enumerate_children@Base 2.16.0 + g_file_enumerate_children_async@Base 2.16.0 + g_file_enumerate_children_finish@Base 2.16.0 + g_file_enumerator_close@Base 2.16.0 + g_file_enumerator_close_async@Base 2.16.0 + g_file_enumerator_close_finish@Base 2.16.0 + g_file_enumerator_get_container@Base 2.18.0 + g_file_enumerator_get_type@Base 2.16.0 + g_file_enumerator_has_pending@Base 2.16.0 + g_file_enumerator_is_closed@Base 2.16.0 + g_file_enumerator_next_file@Base 2.16.0 + g_file_enumerator_next_files_async@Base 2.16.0 + g_file_enumerator_next_files_finish@Base 2.16.0 + g_file_enumerator_set_pending@Base 2.16.0 + g_file_equal@Base 2.16.0 + g_file_find_enclosing_mount@Base 2.16.0 + g_file_find_enclosing_mount_async@Base 2.16.0 + g_file_find_enclosing_mount_finish@Base 2.16.0 + g_file_get_basename@Base 2.16.0 + g_file_get_child@Base 2.16.0 + g_file_get_child_for_display_name@Base 2.16.0 + g_file_get_parent@Base 2.16.0 + g_file_get_parse_name@Base 2.16.0 + g_file_get_path@Base 2.16.0 + g_file_get_relative_path@Base 2.16.0 + g_file_get_type@Base 2.16.0 + g_file_get_uri@Base 2.16.0 + g_file_get_uri_scheme@Base 2.16.0 + g_file_has_prefix@Base 2.16.0 + g_file_has_uri_scheme@Base 2.16.0 + g_file_hash@Base 2.16.0 + g_file_icon_get_file@Base 2.16.0 + g_file_icon_get_type@Base 2.16.0 + g_file_icon_new@Base 2.16.0 + g_file_info_clear_status@Base 2.16.0 + g_file_info_copy_into@Base 2.16.0 + g_file_info_dup@Base 2.16.0 + g_file_info_get_attribute_as_string@Base 2.16.0 + g_file_info_get_attribute_boolean@Base 2.16.0 + g_file_info_get_attribute_byte_string@Base 2.16.0 + g_file_info_get_attribute_data@Base 2.16.0 + g_file_info_get_attribute_int32@Base 2.16.0 + g_file_info_get_attribute_int64@Base 2.16.0 + g_file_info_get_attribute_object@Base 2.16.0 + g_file_info_get_attribute_status@Base 2.16.0 + g_file_info_get_attribute_string@Base 2.16.0 + g_file_info_get_attribute_stringv@Base 2.22.0 + g_file_info_get_attribute_type@Base 2.16.0 + g_file_info_get_attribute_uint32@Base 2.16.0 + g_file_info_get_attribute_uint64@Base 2.16.0 + g_file_info_get_content_type@Base 2.16.0 + g_file_info_get_display_name@Base 2.16.0 + g_file_info_get_edit_name@Base 2.16.0 + g_file_info_get_etag@Base 2.16.0 + g_file_info_get_file_type@Base 2.16.0 + g_file_info_get_icon@Base 2.16.0 + g_file_info_get_is_backup@Base 2.16.0 + g_file_info_get_is_hidden@Base 2.16.0 + g_file_info_get_is_symlink@Base 2.16.0 + g_file_info_get_modification_time@Base 2.16.0 + g_file_info_get_name@Base 2.16.0 + g_file_info_get_size@Base 2.16.0 + g_file_info_get_sort_order@Base 2.16.0 + g_file_info_get_symlink_target@Base 2.16.0 + g_file_info_get_type@Base 2.16.0 + g_file_info_has_attribute@Base 2.16.0 + g_file_info_has_namespace@Base 2.22.0 + g_file_info_list_attributes@Base 2.16.0 + g_file_info_new@Base 2.16.0 + g_file_info_remove_attribute@Base 2.16.0 + g_file_info_set_attribute@Base 2.16.0 + g_file_info_set_attribute_boolean@Base 2.16.0 + g_file_info_set_attribute_byte_string@Base 2.16.0 + g_file_info_set_attribute_int32@Base 2.16.0 + g_file_info_set_attribute_int64@Base 2.16.0 + g_file_info_set_attribute_mask@Base 2.16.0 + g_file_info_set_attribute_object@Base 2.16.0 + g_file_info_set_attribute_status@Base 2.22.0 + g_file_info_set_attribute_string@Base 2.16.0 + g_file_info_set_attribute_stringv@Base 2.22.0 + g_file_info_set_attribute_uint32@Base 2.16.0 + g_file_info_set_attribute_uint64@Base 2.16.0 + g_file_info_set_content_type@Base 2.16.0 + g_file_info_set_display_name@Base 2.16.0 + g_file_info_set_edit_name@Base 2.16.0 + g_file_info_set_file_type@Base 2.16.0 + g_file_info_set_icon@Base 2.16.0 + g_file_info_set_is_hidden@Base 2.16.0 + g_file_info_set_is_symlink@Base 2.16.0 + g_file_info_set_modification_time@Base 2.16.0 + g_file_info_set_name@Base 2.16.0 + g_file_info_set_size@Base 2.16.0 + g_file_info_set_sort_order@Base 2.16.0 + g_file_info_set_symlink_target@Base 2.16.0 + g_file_info_unset_attribute_mask@Base 2.16.0 + g_file_input_stream_get_type@Base 2.16.0 + g_file_input_stream_query_info@Base 2.16.0 + g_file_input_stream_query_info_async@Base 2.16.0 + g_file_input_stream_query_info_finish@Base 2.16.0 + g_file_io_stream_get_etag@Base 2.22.0 + g_file_io_stream_get_type@Base 2.22.0 + g_file_io_stream_query_info@Base 2.22.0 + g_file_io_stream_query_info_async@Base 2.22.0 + g_file_io_stream_query_info_finish@Base 2.22.0 + g_file_is_native@Base 2.16.0 + g_file_load_contents@Base 2.16.0 + g_file_load_contents_async@Base 2.16.0 + g_file_load_contents_finish@Base 2.16.0 + g_file_load_partial_contents_async@Base 2.16.0 + g_file_load_partial_contents_finish@Base 2.16.0 + g_file_make_directory@Base 2.16.0 + g_file_make_directory_with_parents@Base 2.18.0 + g_file_make_symbolic_link@Base 2.16.0 + g_file_monitor@Base 2.18.0 + g_file_monitor_cancel@Base 2.16.0 + g_file_monitor_directory@Base 2.16.0 + g_file_monitor_emit_event@Base 2.16.0 + g_file_monitor_event_get_type@Base 2.16.0 + g_file_monitor_file@Base 2.16.0 + g_file_monitor_flags_get_type@Base 2.16.0 + g_file_monitor_get_type@Base 2.16.0 + g_file_monitor_is_cancelled@Base 2.16.0 + g_file_monitor_set_rate_limit@Base 2.16.0 + g_file_mount_enclosing_volume@Base 2.16.0 + g_file_mount_enclosing_volume_finish@Base 2.16.0 + g_file_mount_mountable@Base 2.16.0 + g_file_mount_mountable_finish@Base 2.16.0 + g_file_move@Base 2.16.0 + g_file_new_for_commandline_arg@Base 2.16.0 + g_file_new_for_path@Base 2.16.0 + g_file_new_for_uri@Base 2.16.0 + g_file_open_readwrite@Base 2.22.0 + g_file_open_readwrite_async@Base 2.22.0 + g_file_open_readwrite_finish@Base 2.22.0 + g_file_output_stream_get_etag@Base 2.16.0 + g_file_output_stream_get_type@Base 2.16.0 + g_file_output_stream_query_info@Base 2.16.0 + g_file_output_stream_query_info_async@Base 2.16.0 + g_file_output_stream_query_info_finish@Base 2.16.0 + g_file_parse_name@Base 2.16.0 + g_file_poll_mountable@Base 2.22.0 + g_file_poll_mountable_finish@Base 2.22.0 + g_file_query_default_handler@Base 2.16.0 + g_file_query_exists@Base 2.16.0 + g_file_query_file_type@Base 2.18.0 + g_file_query_filesystem_info@Base 2.16.0 + g_file_query_filesystem_info_async@Base 2.16.0 + g_file_query_filesystem_info_finish@Base 2.16.0 + g_file_query_info@Base 2.16.0 + g_file_query_info_async@Base 2.16.0 + g_file_query_info_finish@Base 2.16.0 + g_file_query_info_flags_get_type@Base 2.16.0 + g_file_query_settable_attributes@Base 2.16.0 + g_file_query_writable_namespaces@Base 2.16.0 + g_file_read@Base 2.16.0 + g_file_read_async@Base 2.16.0 + g_file_read_finish@Base 2.16.0 + g_file_replace@Base 2.16.0 + g_file_replace_async@Base 2.16.0 + g_file_replace_contents@Base 2.16.0 + g_file_replace_contents_async@Base 2.16.0 + g_file_replace_contents_finish@Base 2.16.0 + g_file_replace_finish@Base 2.16.0 + g_file_replace_readwrite@Base 2.22.0 + g_file_replace_readwrite_async@Base 2.22.0 + g_file_replace_readwrite_finish@Base 2.22.0 + g_file_resolve_relative_path@Base 2.16.0 + g_file_set_attribute@Base 2.16.0 + g_file_set_attribute_byte_string@Base 2.16.0 + g_file_set_attribute_int32@Base 2.16.0 + g_file_set_attribute_int64@Base 2.16.0 + g_file_set_attribute_string@Base 2.16.0 + g_file_set_attribute_uint32@Base 2.16.0 + g_file_set_attribute_uint64@Base 2.16.0 + g_file_set_attributes_async@Base 2.16.0 + g_file_set_attributes_finish@Base 2.16.0 + g_file_set_attributes_from_info@Base 2.16.0 + g_file_set_display_name@Base 2.16.0 + g_file_set_display_name_async@Base 2.16.0 + g_file_set_display_name_finish@Base 2.16.0 + g_file_start_mountable@Base 2.22.0 + g_file_start_mountable_finish@Base 2.22.0 + g_file_stop_mountable@Base 2.22.0 + g_file_stop_mountable_finish@Base 2.22.0 + g_file_supports_thread_contexts@Base 2.22.0 + g_file_trash@Base 2.16.0 + g_file_type_get_type@Base 2.16.0 + g_file_unmount_mountable@Base 2.16.0 + g_file_unmount_mountable_finish@Base 2.16.0 + g_file_unmount_mountable_with_operation@Base 2.22.0 + g_file_unmount_mountable_with_operation_finish@Base 2.22.0 + g_filename_completer_get_completion_suffix@Base 2.16.0 + g_filename_completer_get_completions@Base 2.16.0 + g_filename_completer_get_type@Base 2.16.0 + g_filename_completer_new@Base 2.16.0 + g_filename_completer_set_dirs_only@Base 2.16.0 + g_filesystem_preview_type_get_type@Base 2.16.0 + g_filter_input_stream_get_base_stream@Base 2.16.0 + g_filter_input_stream_get_close_base_stream@Base 2.20.0 + g_filter_input_stream_get_type@Base 2.16.0 + g_filter_input_stream_set_close_base_stream@Base 2.20.0 + g_filter_output_stream_get_base_stream@Base 2.16.0 + g_filter_output_stream_get_close_base_stream@Base 2.20.0 + g_filter_output_stream_get_type@Base 2.16.0 + g_filter_output_stream_set_close_base_stream@Base 2.20.0 + g_icon_equal@Base 2.16.0 + g_icon_get_type@Base 2.16.0 + g_icon_hash@Base 2.16.0 + g_icon_new_for_string@Base 2.20.0 + g_icon_to_string@Base 2.20.0 + g_inet_address_get_family@Base 2.22.0 + g_inet_address_get_is_any@Base 2.22.0 + g_inet_address_get_is_link_local@Base 2.22.0 + g_inet_address_get_is_loopback@Base 2.22.0 + g_inet_address_get_is_mc_global@Base 2.22.0 + g_inet_address_get_is_mc_link_local@Base 2.22.0 + g_inet_address_get_is_mc_node_local@Base 2.22.0 + g_inet_address_get_is_mc_org_local@Base 2.22.0 + g_inet_address_get_is_mc_site_local@Base 2.22.0 + g_inet_address_get_is_multicast@Base 2.22.0 + g_inet_address_get_is_site_local@Base 2.22.0 + g_inet_address_get_native_size@Base 2.22.0 + g_inet_address_get_type@Base 2.22.0 + g_inet_address_new_any@Base 2.22.0 + g_inet_address_new_from_bytes@Base 2.22.0 + g_inet_address_new_from_string@Base 2.22.0 + g_inet_address_new_loopback@Base 2.22.0 + g_inet_address_to_bytes@Base 2.22.0 + g_inet_address_to_string@Base 2.22.0 + g_inet_socket_address_get_address@Base 2.22.0 + g_inet_socket_address_get_port@Base 2.22.0 + g_inet_socket_address_get_type@Base 2.22.0 + g_inet_socket_address_new@Base 2.22.0 + g_initable_get_type@Base 2.22.0 + g_initable_init@Base 2.22.0 + g_initable_new@Base 2.22.0 + g_initable_new_valist@Base 2.22.0 + g_initable_newv@Base 2.22.0 + g_input_stream_clear_pending@Base 2.16.0 + g_input_stream_close@Base 2.16.0 + g_input_stream_close_async@Base 2.16.0 + g_input_stream_close_finish@Base 2.16.0 + g_input_stream_get_type@Base 2.16.0 + g_input_stream_has_pending@Base 2.16.0 + g_input_stream_is_closed@Base 2.16.0 + g_input_stream_read@Base 2.16.0 + g_input_stream_read_all@Base 2.16.0 + g_input_stream_read_async@Base 2.16.0 + g_input_stream_read_finish@Base 2.16.0 + g_input_stream_set_pending@Base 2.16.0 + g_input_stream_skip@Base 2.16.0 + g_input_stream_skip_async@Base 2.16.0 + g_input_stream_skip_finish@Base 2.16.0 + g_io_error_enum_get_type@Base 2.16.0 + g_io_error_from_errno@Base 2.16.0 + g_io_error_quark@Base 2.16.0 + g_io_extension_get_name@Base 2.16.0 + g_io_extension_get_priority@Base 2.16.0 + g_io_extension_get_type@Base 2.16.0 + g_io_extension_point_get_extension_by_name@Base 2.16.0 + g_io_extension_point_get_extensions@Base 2.16.0 + g_io_extension_point_get_required_type@Base 2.16.0 + g_io_extension_point_implement@Base 2.16.0 + g_io_extension_point_lookup@Base 2.16.0 + g_io_extension_point_register@Base 2.16.0 + g_io_extension_point_set_required_type@Base 2.16.0 + g_io_extension_ref_class@Base 2.16.0 + g_io_module_get_type@Base 2.16.0 + g_io_module_new@Base 2.16.0 + g_io_modules_load_all_in_directory@Base 2.16.0 + g_io_scheduler_cancel_all_jobs@Base 2.16.0 + g_io_scheduler_job_send_to_mainloop@Base 2.16.0 + g_io_scheduler_job_send_to_mainloop_async@Base 2.16.0 + g_io_scheduler_push_job@Base 2.16.0 + g_io_stream_clear_pending@Base 2.22.0 + g_io_stream_close@Base 2.22.0 + g_io_stream_close_async@Base 2.22.0 + g_io_stream_close_finish@Base 2.22.0 + g_io_stream_get_input_stream@Base 2.22.0 + g_io_stream_get_output_stream@Base 2.22.0 + g_io_stream_get_type@Base 2.22.0 + g_io_stream_has_pending@Base 2.22.0 + g_io_stream_is_closed@Base 2.22.0 + g_io_stream_set_pending@Base 2.22.0 + g_loadable_icon_get_type@Base 2.16.0 + g_loadable_icon_load@Base 2.16.0 + g_loadable_icon_load_async@Base 2.16.0 + g_loadable_icon_load_finish@Base 2.16.0 + g_local_directory_monitor_get_type@Base 2.16.0 + g_local_file_monitor_get_type@Base 2.16.0 + g_memory_input_stream_add_data@Base 2.16.0 + g_memory_input_stream_get_type@Base 2.16.0 + g_memory_input_stream_new@Base 2.16.0 + g_memory_input_stream_new_from_data@Base 2.16.0 + g_memory_output_stream_get_data@Base 2.16.0 + g_memory_output_stream_get_data_size@Base 2.18.0 + g_memory_output_stream_get_size@Base 2.16.0 + g_memory_output_stream_get_type@Base 2.16.0 + g_memory_output_stream_new@Base 2.16.0 + g_mount_can_eject@Base 2.16.0 + g_mount_can_unmount@Base 2.16.0 + g_mount_eject@Base 2.16.0 + g_mount_eject_finish@Base 2.16.0 + g_mount_eject_with_operation@Base 2.22.0 + g_mount_eject_with_operation_finish@Base 2.22.0 + g_mount_get_drive@Base 2.16.0 + g_mount_get_icon@Base 2.16.0 + g_mount_get_name@Base 2.16.0 + g_mount_get_root@Base 2.16.0 + g_mount_get_type@Base 2.16.0 + g_mount_get_uuid@Base 2.16.0 + g_mount_get_volume@Base 2.16.0 + g_mount_guess_content_type@Base 2.18.0 + g_mount_guess_content_type_finish@Base 2.18.0 + g_mount_guess_content_type_sync@Base 2.18.0 + g_mount_is_shadowed@Base 2.20.0 + g_mount_mount_flags_get_type@Base 2.16.0 + g_mount_operation_get_anonymous@Base 2.16.0 + g_mount_operation_get_choice@Base 2.16.0 + g_mount_operation_get_domain@Base 2.16.0 + g_mount_operation_get_password@Base 2.16.0 + g_mount_operation_get_password_save@Base 2.16.0 + g_mount_operation_get_type@Base 2.16.0 + g_mount_operation_get_username@Base 2.16.0 + g_mount_operation_new@Base 2.16.0 + g_mount_operation_reply@Base 2.16.0 + g_mount_operation_result_get_type@Base 2.16.0 + g_mount_operation_set_anonymous@Base 2.16.0 + g_mount_operation_set_choice@Base 2.16.0 + g_mount_operation_set_domain@Base 2.16.0 + g_mount_operation_set_password@Base 2.16.0 + g_mount_operation_set_password_save@Base 2.16.0 + g_mount_operation_set_username@Base 2.16.0 + g_mount_remount@Base 2.16.0 + g_mount_remount_finish@Base 2.16.0 + g_mount_shadow@Base 2.20.0 + g_mount_unmount@Base 2.16.0 + g_mount_unmount_finish@Base 2.16.0 + g_mount_unmount_flags_get_type@Base 2.16.0 + g_mount_unmount_with_operation@Base 2.22.0 + g_mount_unmount_with_operation_finish@Base 2.22.0 + g_mount_unshadow@Base 2.20.0 + g_native_volume_monitor_get_type@Base 2.16.0 + g_network_address_get_hostname@Base 2.22.0 + g_network_address_get_port@Base 2.22.0 + g_network_address_get_type@Base 2.22.0 + g_network_address_new@Base 2.22.0 + g_network_address_parse@Base 2.22.0 + g_network_service_get_domain@Base 2.22.0 + g_network_service_get_protocol@Base 2.22.0 + g_network_service_get_service@Base 2.22.0 + g_network_service_get_type@Base 2.22.0 + g_network_service_new@Base 2.22.0 + g_output_stream_clear_pending@Base 2.16.0 + g_output_stream_close@Base 2.16.0 + g_output_stream_close_async@Base 2.16.0 + g_output_stream_close_finish@Base 2.16.0 + g_output_stream_flush@Base 2.16.0 + g_output_stream_flush_async@Base 2.16.0 + g_output_stream_flush_finish@Base 2.16.0 + g_output_stream_get_type@Base 2.16.0 + g_output_stream_has_pending@Base 2.16.0 + g_output_stream_is_closed@Base 2.16.0 + g_output_stream_set_pending@Base 2.16.0 + g_output_stream_splice@Base 2.16.0 + g_output_stream_splice_async@Base 2.16.0 + g_output_stream_splice_finish@Base 2.16.0 + g_output_stream_splice_flags_get_type@Base 2.16.0 + g_output_stream_write@Base 2.16.0 + g_output_stream_write_all@Base 2.16.0 + g_output_stream_write_async@Base 2.16.0 + g_output_stream_write_finish@Base 2.16.0 + g_password_save_get_type@Base 2.16.0 + g_resolver_error_get_type@Base 2.22.0 + g_resolver_error_quark@Base 2.22.0 + g_resolver_free_addresses@Base 2.22.0 + g_resolver_free_targets@Base 2.22.0 + g_resolver_get_default@Base 2.22.0 + g_resolver_get_type@Base 2.22.0 + g_resolver_lookup_by_address@Base 2.22.0 + g_resolver_lookup_by_address_async@Base 2.22.0 + g_resolver_lookup_by_address_finish@Base 2.22.0 + g_resolver_lookup_by_name@Base 2.22.0 + g_resolver_lookup_by_name_async@Base 2.22.0 + g_resolver_lookup_by_name_finish@Base 2.22.0 + g_resolver_lookup_service@Base 2.22.0 + g_resolver_lookup_service_async@Base 2.22.0 + g_resolver_lookup_service_finish@Base 2.22.0 + g_resolver_set_default@Base 2.22.0 + g_seekable_can_seek@Base 2.16.0 + g_seekable_can_truncate@Base 2.16.0 + g_seekable_get_type@Base 2.16.0 + g_seekable_seek@Base 2.16.0 + g_seekable_tell@Base 2.16.0 + g_seekable_truncate@Base 2.16.0 + g_simple_async_report_error_in_idle@Base 2.16.0 + g_simple_async_report_gerror_in_idle@Base 2.16.0 + g_simple_async_result_complete@Base 2.16.0 + g_simple_async_result_complete_in_idle@Base 2.16.0 + g_simple_async_result_get_op_res_gboolean@Base 2.16.0 + g_simple_async_result_get_op_res_gpointer@Base 2.16.0 + g_simple_async_result_get_op_res_gssize@Base 2.16.0 + g_simple_async_result_get_source_tag@Base 2.16.0 + g_simple_async_result_get_type@Base 2.16.0 + g_simple_async_result_is_valid@Base 2.20.0 + g_simple_async_result_new@Base 2.16.0 + g_simple_async_result_new_error@Base 2.16.0 + g_simple_async_result_new_from_error@Base 2.16.0 + g_simple_async_result_propagate_error@Base 2.16.0 + g_simple_async_result_run_in_thread@Base 2.16.0 + g_simple_async_result_set_error@Base 2.16.0 + g_simple_async_result_set_error_va@Base 2.16.0 + g_simple_async_result_set_from_error@Base 2.16.0 + g_simple_async_result_set_handle_cancellation@Base 2.16.0 + g_simple_async_result_set_op_res_gboolean@Base 2.16.0 + g_simple_async_result_set_op_res_gpointer@Base 2.16.0 + g_simple_async_result_set_op_res_gssize@Base 2.16.0 + g_socket_accept@Base 2.22.0 + g_socket_address_enumerator_get_type@Base 2.22.0 + g_socket_address_enumerator_next@Base 2.22.0 + g_socket_address_enumerator_next_async@Base 2.22.0 + g_socket_address_enumerator_next_finish@Base 2.22.0 + g_socket_address_get_family@Base 2.22.0 + g_socket_address_get_native_size@Base 2.22.0 + g_socket_address_get_type@Base 2.22.0 + g_socket_address_new_from_native@Base 2.22.0 + g_socket_address_to_native@Base 2.22.0 + g_socket_bind@Base 2.22.0 + g_socket_check_connect_result@Base 2.22.0 + g_socket_client_connect@Base 2.22.0 + g_socket_client_connect_async@Base 2.22.0 + g_socket_client_connect_finish@Base 2.22.0 + g_socket_client_connect_to_host@Base 2.22.0 + g_socket_client_connect_to_host_async@Base 2.22.0 + g_socket_client_connect_to_host_finish@Base 2.22.0 + g_socket_client_connect_to_service@Base 2.22.0 + g_socket_client_connect_to_service_async@Base 2.22.0 + g_socket_client_connect_to_service_finish@Base 2.22.0 + g_socket_client_get_family@Base 2.22.0 + g_socket_client_get_local_address@Base 2.22.0 + g_socket_client_get_protocol@Base 2.22.0 + g_socket_client_get_socket_type@Base 2.22.0 + g_socket_client_get_type@Base 2.22.0 + g_socket_client_new@Base 2.22.0 + g_socket_client_set_family@Base 2.22.0 + g_socket_client_set_local_address@Base 2.22.0 + g_socket_client_set_protocol@Base 2.22.0 + g_socket_client_set_socket_type@Base 2.22.0 + g_socket_close@Base 2.22.0 + g_socket_condition_check@Base 2.22.0 + g_socket_condition_wait@Base 2.22.0 + g_socket_connect@Base 2.22.0 + g_socket_connectable_enumerate@Base 2.22.0 + g_socket_connectable_get_type@Base 2.22.0 + g_socket_connection_factory_create_connection@Base 2.22.0 + g_socket_connection_factory_lookup_type@Base 2.22.0 + g_socket_connection_factory_register_type@Base 2.22.0 + g_socket_connection_get_local_address@Base 2.22.0 + g_socket_connection_get_remote_address@Base 2.22.0 + g_socket_connection_get_socket@Base 2.22.0 + g_socket_connection_get_type@Base 2.22.0 + g_socket_control_message_deserialize@Base 2.22.0 + g_socket_control_message_get_level@Base 2.22.0 + g_socket_control_message_get_msg_type@Base 2.22.0 + g_socket_control_message_get_size@Base 2.22.0 + g_socket_control_message_get_type@Base 2.22.0 + g_socket_control_message_serialize@Base 2.22.0 + g_socket_create_source@Base 2.22.0 + g_socket_family_get_type@Base 2.22.0 + g_socket_get_blocking@Base 2.22.0 + g_socket_get_family@Base 2.22.0 + g_socket_get_fd@Base 2.22.0 + g_socket_get_keepalive@Base 2.22.0 + g_socket_get_listen_backlog@Base 2.22.0 + g_socket_get_local_address@Base 2.22.0 + g_socket_get_protocol@Base 2.22.0 + g_socket_get_remote_address@Base 2.22.0 + g_socket_get_socket_type@Base 2.22.0 + g_socket_get_type@Base 2.22.0 + g_socket_is_closed@Base 2.22.0 + g_socket_is_connected@Base 2.22.0 + g_socket_listen@Base 2.22.0 + g_socket_listener_accept@Base 2.22.0 + g_socket_listener_accept_async@Base 2.22.0 + g_socket_listener_accept_finish@Base 2.22.0 + g_socket_listener_accept_socket@Base 2.22.0 + g_socket_listener_accept_socket_async@Base 2.22.0 + g_socket_listener_accept_socket_finish@Base 2.22.0 + g_socket_listener_add_address@Base 2.22.0 + g_socket_listener_add_inet_port@Base 2.22.0 + g_socket_listener_add_socket@Base 2.22.0 + g_socket_listener_close@Base 2.22.0 + g_socket_listener_get_type@Base 2.22.0 + g_socket_listener_new@Base 2.22.0 + g_socket_listener_set_backlog@Base 2.22.0 + g_socket_msg_flags_get_type@Base 2.22.0 + g_socket_new@Base 2.22.0 + g_socket_new_from_fd@Base 2.22.0 + g_socket_protocol_get_type@Base 2.22.0 + g_socket_receive@Base 2.22.0 + g_socket_receive_from@Base 2.22.0 + g_socket_receive_message@Base 2.22.0 + g_socket_send@Base 2.22.0 + g_socket_send_message@Base 2.22.0 + g_socket_send_to@Base 2.22.0 + g_socket_service_get_type@Base 2.22.0 + g_socket_service_is_active@Base 2.22.0 + g_socket_service_new@Base 2.22.0 + g_socket_service_start@Base 2.22.0 + g_socket_service_stop@Base 2.22.0 + g_socket_set_blocking@Base 2.22.0 + g_socket_set_keepalive@Base 2.22.0 + g_socket_set_listen_backlog@Base 2.22.0 + g_socket_shutdown@Base 2.22.0 + g_socket_speaks_ipv4@Base 2.22.0 + g_socket_type_get_type@Base 2.22.0 + g_srv_target_copy@Base 2.22.0 + g_srv_target_free@Base 2.22.0 + g_srv_target_get_hostname@Base 2.22.0 + g_srv_target_get_port@Base 2.22.0 + g_srv_target_get_priority@Base 2.22.0 + g_srv_target_get_type@Base 2.22.0 + g_srv_target_get_weight@Base 2.22.0 + g_srv_target_list_sort@Base 2.22.0 + g_srv_target_new@Base 2.22.0 + g_tcp_connection_get_graceful_disconnect@Base 2.22.0 + g_tcp_connection_get_type@Base 2.22.0 + g_tcp_connection_set_graceful_disconnect@Base 2.22.0 + g_themed_icon_append_name@Base 2.16.0 + g_themed_icon_get_names@Base 2.16.0 + g_themed_icon_get_type@Base 2.16.0 + g_themed_icon_new@Base 2.16.0 + g_themed_icon_new_from_names@Base 2.16.0 + g_themed_icon_new_with_default_fallbacks@Base 2.16.0 + g_themed_icon_prepend_name@Base 2.18.0 + g_threaded_resolver_get_type@Base 2.22.0 + g_threaded_socket_service_get_type@Base 2.22.0 + g_threaded_socket_service_new@Base 2.22.0 + g_unix_connection_get_type@Base 2.22.0 + g_unix_connection_receive_fd@Base 2.22.0 + g_unix_connection_send_fd@Base 2.22.0 + g_unix_fd_message_append_fd@Base 2.22.0 + g_unix_fd_message_get_type@Base 2.22.0 + g_unix_fd_message_new@Base 2.22.0 + g_unix_fd_message_steal_fds@Base 2.22.0 + g_unix_input_stream_get_close_fd@Base 2.20.0 + g_unix_input_stream_get_fd@Base 2.20.0 + g_unix_input_stream_get_type@Base 2.16.0 + g_unix_input_stream_new@Base 2.16.0 + g_unix_input_stream_set_close_fd@Base 2.20.0 + g_unix_is_mount_path_system_internal@Base 2.16.0 + g_unix_mount_at@Base 2.16.0 + g_unix_mount_compare@Base 2.16.0 + g_unix_mount_free@Base 2.16.0 + g_unix_mount_get_device_path@Base 2.16.0 + g_unix_mount_get_fs_type@Base 2.16.0 + g_unix_mount_get_mount_path@Base 2.16.0 + g_unix_mount_guess_can_eject@Base 2.16.0 + g_unix_mount_guess_icon@Base 2.16.0 + g_unix_mount_guess_name@Base 2.16.0 + g_unix_mount_guess_should_display@Base 2.16.0 + g_unix_mount_is_readonly@Base 2.16.0 + g_unix_mount_is_system_internal@Base 2.16.0 + g_unix_mount_monitor_get_type@Base 2.16.0 + g_unix_mount_monitor_new@Base 2.16.0 + g_unix_mount_monitor_set_rate_limit@Base 2.18.0 + g_unix_mount_point_compare@Base 2.16.0 + g_unix_mount_point_free@Base 2.16.0 + g_unix_mount_point_get_device_path@Base 2.16.0 + g_unix_mount_point_get_fs_type@Base 2.16.0 + g_unix_mount_point_get_mount_path@Base 2.16.0 + g_unix_mount_point_guess_can_eject@Base 2.16.0 + g_unix_mount_point_guess_icon@Base 2.16.0 + g_unix_mount_point_guess_name@Base 2.16.0 + g_unix_mount_point_is_loopback@Base 2.16.0 + g_unix_mount_point_is_readonly@Base 2.16.0 + g_unix_mount_point_is_user_mountable@Base 2.16.0 + g_unix_mount_points_changed_since@Base 2.16.0 + g_unix_mount_points_get@Base 2.16.0 + g_unix_mounts_changed_since@Base 2.16.0 + g_unix_mounts_get@Base 2.16.0 + g_unix_output_stream_get_close_fd@Base 2.20.0 + g_unix_output_stream_get_fd@Base 2.20.0 + g_unix_output_stream_get_type@Base 2.16.0 + g_unix_output_stream_new@Base 2.16.0 + g_unix_output_stream_set_close_fd@Base 2.20.0 + g_unix_resolver_get_type@Base 2.22.0 + g_unix_socket_address_abstract_names_supported@Base 2.22.0 + g_unix_socket_address_get_is_abstract@Base 2.22.0 + g_unix_socket_address_get_path@Base 2.22.0 + g_unix_socket_address_get_path_len@Base 2.22.0 + g_unix_socket_address_get_type@Base 2.22.0 + g_unix_socket_address_new@Base 2.22.0 + g_unix_socket_address_new_abstract@Base 2.22.0 + g_vfs_get_default@Base 2.16.0 + g_vfs_get_file_for_path@Base 2.16.0 + g_vfs_get_file_for_uri@Base 2.16.0 + g_vfs_get_local@Base 2.16.0 + g_vfs_get_supported_uri_schemes@Base 2.16.0 + g_vfs_get_type@Base 2.16.0 + g_vfs_is_active@Base 2.16.0 + g_vfs_parse_name@Base 2.16.0 + g_volume_can_eject@Base 2.16.0 + g_volume_can_mount@Base 2.16.0 + g_volume_eject@Base 2.16.0 + g_volume_eject_finish@Base 2.16.0 + g_volume_eject_with_operation@Base 2.22.0 + g_volume_eject_with_operation_finish@Base 2.22.0 + g_volume_enumerate_identifiers@Base 2.16.0 + g_volume_get_activation_root@Base 2.18.0 + g_volume_get_drive@Base 2.16.0 + g_volume_get_icon@Base 2.16.0 + g_volume_get_identifier@Base 2.16.0 + g_volume_get_mount@Base 2.16.0 + g_volume_get_name@Base 2.16.0 + g_volume_get_type@Base 2.16.0 + g_volume_get_uuid@Base 2.16.0 + g_volume_monitor_adopt_orphan_mount@Base 2.16.0 + g_volume_monitor_get@Base 2.16.0 + g_volume_monitor_get_connected_drives@Base 2.16.0 + g_volume_monitor_get_mount_for_uuid@Base 2.16.0 + g_volume_monitor_get_mounts@Base 2.16.0 + g_volume_monitor_get_type@Base 2.16.0 + g_volume_monitor_get_volume_for_uuid@Base 2.16.0 + g_volume_monitor_get_volumes@Base 2.16.0 + g_volume_mount@Base 2.16.0 + g_volume_mount_finish@Base 2.16.0 + g_volume_should_automount@Base 2.16.0 +libglib-2.0.so.0 libglib2.0-0 #MINVER# +* Build-Depends-Package: libglib2.0-dev + g_access@Base 2.12.0 + g_allocator_free@Base 2.12.0 + g_allocator_new@Base 2.12.0 + g_array_append_vals@Base 2.12.0 + g_array_free@Base 2.12.0 + g_array_get_element_size@Base 2.22.0 + g_array_insert_vals@Base 2.12.0 + g_array_new@Base 2.12.0 + g_array_prepend_vals@Base 2.12.0 + g_array_ref@Base 2.22.0 + g_array_remove_index@Base 2.12.0 + g_array_remove_index_fast@Base 2.12.0 + g_array_remove_range@Base 2.12.0 + g_array_set_size@Base 2.12.0 + g_array_sized_new@Base 2.12.0 + g_array_sort@Base 2.12.0 + g_array_sort_with_data@Base 2.12.0 + g_array_unref@Base 2.22.0 + g_ascii_digit_value@Base 2.12.0 + g_ascii_dtostr@Base 2.12.0 + g_ascii_formatd@Base 2.12.0 + g_ascii_strcasecmp@Base 2.12.0 + g_ascii_strdown@Base 2.12.0 + g_ascii_strncasecmp@Base 2.12.0 + g_ascii_strtod@Base 2.12.0 + g_ascii_strtoll@Base 2.12.0 + g_ascii_strtoull@Base 2.12.0 + g_ascii_strup@Base 2.12.0 + g_ascii_table@Base 2.12.0 + g_ascii_tolower@Base 2.12.0 + g_ascii_toupper@Base 2.12.0 + g_ascii_xdigit_value@Base 2.12.0 + g_assert_warning@Base 2.12.0 + g_assertion_message@Base 2.16.0 + g_assertion_message_cmpnum@Base 2.16.0 + g_assertion_message_cmpstr@Base 2.16.0 + g_assertion_message_error@Base 2.20.0 + g_assertion_message_expr@Base 2.16.0 + g_async_queue_length@Base 2.12.0 + g_async_queue_length_unlocked@Base 2.12.0 + g_async_queue_lock@Base 2.12.0 + g_async_queue_new@Base 2.12.0 + g_async_queue_new_full@Base 2.16.0 + g_async_queue_pop@Base 2.12.0 + g_async_queue_pop_unlocked@Base 2.12.0 + g_async_queue_push@Base 2.12.0 + g_async_queue_push_sorted@Base 2.12.0 + g_async_queue_push_sorted_unlocked@Base 2.12.0 + g_async_queue_push_unlocked@Base 2.12.0 + g_async_queue_ref@Base 2.12.0 + g_async_queue_ref_unlocked@Base 2.12.0 + g_async_queue_sort@Base 2.12.0 + g_async_queue_sort_unlocked@Base 2.12.0 + g_async_queue_timed_pop@Base 2.12.0 + g_async_queue_timed_pop_unlocked@Base 2.12.0 + g_async_queue_try_pop@Base 2.12.0 + g_async_queue_try_pop_unlocked@Base 2.12.0 + g_async_queue_unlock@Base 2.12.0 + g_async_queue_unref@Base 2.12.0 + g_async_queue_unref_and_unlock@Base 2.12.0 + g_atexit@Base 2.12.0 + g_atomic_int_add@Base 2.12.0 + g_atomic_int_compare_and_exchange@Base 2.12.0 + g_atomic_int_exchange_and_add@Base 2.12.0 + g_atomic_int_get@Base 2.12.0 + g_atomic_int_set@Base 2.12.0 + g_atomic_pointer_compare_and_exchange@Base 2.12.0 + g_atomic_pointer_get@Base 2.12.0 + g_atomic_pointer_set@Base 2.12.0 + g_base64_decode@Base 2.12.0 + g_base64_decode_inplace@Base 2.20.0 + g_base64_decode_step@Base 2.12.0 + g_base64_encode@Base 2.12.0 + g_base64_encode_close@Base 2.12.0 + g_base64_encode_step@Base 2.12.0 + g_basename@Base 2.12.0 + g_bit_nth_lsf@Base 2.12.0 + g_bit_nth_msf@Base 2.12.0 + g_bit_storage@Base 2.12.0 + g_blow_chunks@Base 2.12.0 + g_bookmark_file_add_application@Base 2.12.0 + g_bookmark_file_add_group@Base 2.12.0 + g_bookmark_file_error_quark@Base 2.12.0 + g_bookmark_file_free@Base 2.12.0 + g_bookmark_file_get_added@Base 2.12.0 + g_bookmark_file_get_app_info@Base 2.12.0 + g_bookmark_file_get_applications@Base 2.12.0 + g_bookmark_file_get_description@Base 2.12.0 + g_bookmark_file_get_groups@Base 2.12.0 + g_bookmark_file_get_icon@Base 2.12.0 + g_bookmark_file_get_is_private@Base 2.12.0 + g_bookmark_file_get_mime_type@Base 2.12.0 + g_bookmark_file_get_modified@Base 2.12.0 + g_bookmark_file_get_size@Base 2.12.0 + g_bookmark_file_get_title@Base 2.12.0 + g_bookmark_file_get_uris@Base 2.12.0 + g_bookmark_file_get_visited@Base 2.12.0 + g_bookmark_file_has_application@Base 2.12.0 + g_bookmark_file_has_group@Base 2.12.0 + g_bookmark_file_has_item@Base 2.12.0 + g_bookmark_file_load_from_data@Base 2.12.0 + g_bookmark_file_load_from_data_dirs@Base 2.12.0 + g_bookmark_file_load_from_file@Base 2.12.0 + g_bookmark_file_move_item@Base 2.12.0 + g_bookmark_file_new@Base 2.12.0 + g_bookmark_file_remove_application@Base 2.12.0 + g_bookmark_file_remove_group@Base 2.12.0 + g_bookmark_file_remove_item@Base 2.12.0 + g_bookmark_file_set_added@Base 2.12.0 + g_bookmark_file_set_app_info@Base 2.12.0 + g_bookmark_file_set_description@Base 2.12.0 + g_bookmark_file_set_groups@Base 2.12.0 + g_bookmark_file_set_icon@Base 2.12.0 + g_bookmark_file_set_is_private@Base 2.12.0 + g_bookmark_file_set_mime_type@Base 2.12.0 + g_bookmark_file_set_modified@Base 2.12.0 + g_bookmark_file_set_title@Base 2.12.0 + g_bookmark_file_set_visited@Base 2.12.0 + g_bookmark_file_to_data@Base 2.12.0 + g_bookmark_file_to_file@Base 2.12.0 + g_build_filename@Base 2.12.0 + g_build_filenamev@Base 2.12.0 + g_build_path@Base 2.12.0 + g_build_pathv@Base 2.12.0 + g_byte_array_append@Base 2.12.0 + g_byte_array_free@Base 2.12.0 + g_byte_array_new@Base 2.12.0 + g_byte_array_prepend@Base 2.12.0 + g_byte_array_ref@Base 2.22.0 + g_byte_array_remove_index@Base 2.12.0 + g_byte_array_remove_index_fast@Base 2.12.0 + g_byte_array_remove_range@Base 2.12.0 + g_byte_array_set_size@Base 2.12.0 + g_byte_array_sized_new@Base 2.12.0 + g_byte_array_sort@Base 2.12.0 + g_byte_array_sort_with_data@Base 2.12.0 + g_byte_array_unref@Base 2.22.0 + g_cache_destroy@Base 2.12.0 + g_cache_insert@Base 2.12.0 + g_cache_key_foreach@Base 2.12.0 + g_cache_new@Base 2.12.0 + g_cache_remove@Base 2.12.0 + g_cache_value_foreach@Base 2.12.0 + g_chdir@Base 2.12.0 + g_checksum_copy@Base 2.16.0 + g_checksum_free@Base 2.16.0 + g_checksum_get_digest@Base 2.16.0 + g_checksum_get_string@Base 2.16.0 + g_checksum_new@Base 2.16.0 + g_checksum_reset@Base 2.18.0 + g_checksum_type_get_length@Base 2.16.0 + g_checksum_update@Base 2.16.0 + g_child_watch_add@Base 2.12.0 + g_child_watch_add_full@Base 2.12.0 + g_child_watch_funcs@Base 2.12.0 + g_child_watch_source_new@Base 2.12.0 + g_chmod@Base 2.12.0 + g_clear_error@Base 2.12.0 + g_completion_add_items@Base 2.12.0 + g_completion_clear_items@Base 2.12.0 + g_completion_complete@Base 2.12.0 + g_completion_complete_utf8@Base 2.12.0 + g_completion_free@Base 2.12.0 + g_completion_new@Base 2.12.0 + g_completion_remove_items@Base 2.12.0 + g_completion_set_compare@Base 2.12.0 + g_compute_checksum_for_data@Base 2.16.0 + g_compute_checksum_for_string@Base 2.16.0 + g_convert@Base 2.12.0 + g_convert_error_quark@Base 2.12.0 + g_convert_with_fallback@Base 2.12.0 + g_convert_with_iconv@Base 2.12.0 + g_creat@Base 2.12.0 + g_datalist_clear@Base 2.12.0 + g_datalist_foreach@Base 2.12.0 + g_datalist_get_flags@Base 2.12.0 + g_datalist_id_get_data@Base 2.12.0 + g_datalist_id_remove_no_notify@Base 2.12.0 + g_datalist_id_set_data_full@Base 2.12.0 + g_datalist_init@Base 2.12.0 + g_datalist_set_flags@Base 2.12.0 + g_datalist_unset_flags@Base 2.12.0 + g_dataset_destroy@Base 2.12.0 + g_dataset_foreach@Base 2.12.0 + g_dataset_id_get_data@Base 2.12.0 + g_dataset_id_remove_no_notify@Base 2.12.0 + g_dataset_id_set_data_full@Base 2.12.0 + g_date_add_days@Base 2.12.0 + g_date_add_months@Base 2.12.0 + g_date_add_years@Base 2.12.0 + g_date_clamp@Base 2.12.0 + g_date_clear@Base 2.12.0 + g_date_compare@Base 2.12.0 + g_date_days_between@Base 2.12.0 + g_date_free@Base 2.12.0 + g_date_get_day@Base 2.12.0 + g_date_get_day_of_year@Base 2.12.0 + g_date_get_days_in_month@Base 2.12.0 + g_date_get_iso8601_week_of_year@Base 2.12.0 + g_date_get_julian@Base 2.12.0 + g_date_get_monday_week_of_year@Base 2.12.0 + g_date_get_monday_weeks_in_year@Base 2.12.0 + g_date_get_month@Base 2.12.0 + g_date_get_sunday_week_of_year@Base 2.12.0 + g_date_get_sunday_weeks_in_year@Base 2.12.0 + g_date_get_weekday@Base 2.12.0 + g_date_get_year@Base 2.12.0 + g_date_is_first_of_month@Base 2.12.0 + g_date_is_last_of_month@Base 2.12.0 + g_date_is_leap_year@Base 2.12.0 + g_date_new@Base 2.12.0 + g_date_new_dmy@Base 2.12.0 + g_date_new_julian@Base 2.12.0 + g_date_order@Base 2.12.0 + g_date_set_day@Base 2.12.0 + g_date_set_dmy@Base 2.12.0 + g_date_set_julian@Base 2.12.0 + g_date_set_month@Base 2.12.0 + g_date_set_parse@Base 2.12.0 + g_date_set_time@Base 2.12.0 + g_date_set_time_t@Base 2.12.0 + g_date_set_time_val@Base 2.12.0 + g_date_set_year@Base 2.12.0 + g_date_strftime@Base 2.12.0 + g_date_subtract_days@Base 2.12.0 + g_date_subtract_months@Base 2.12.0 + g_date_subtract_years@Base 2.12.0 + g_date_to_struct_tm@Base 2.12.0 + g_date_valid@Base 2.12.0 + g_date_valid_day@Base 2.12.0 + g_date_valid_dmy@Base 2.12.0 + g_date_valid_julian@Base 2.12.0 + g_date_valid_month@Base 2.12.0 + g_date_valid_weekday@Base 2.12.0 + g_date_valid_year@Base 2.12.0 + g_dgettext@Base 2.18.0 + g_dir_close@Base 2.12.0 + g_dir_open@Base 2.12.0 + g_dir_read_name@Base 2.12.0 + g_dir_rewind@Base 2.12.0 + g_direct_equal@Base 2.12.0 + g_direct_hash@Base 2.12.0 + g_dngettext@Base 2.18.0 + g_double_equal@Base 2.22.0 + g_double_hash@Base 2.22.0 + g_dpgettext2@Base 2.18.0 + g_dpgettext@Base 2.16.0 + g_error_copy@Base 2.12.0 + g_error_free@Base 2.12.0 + g_error_matches@Base 2.12.0 + g_error_new@Base 2.12.0 + g_error_new_literal@Base 2.12.0 + g_error_new_valist@Base 2.22.0 + g_file_error_from_errno@Base 2.12.0 + g_file_error_quark@Base 2.12.0 + g_file_get_contents@Base 2.12.0 + g_file_open_tmp@Base 2.12.0 + g_file_read_link@Base 2.12.0 + g_file_set_contents@Base 2.12.0 + g_file_test@Base 2.12.0 + g_filename_display_basename@Base 2.12.0 + g_filename_display_name@Base 2.12.0 + g_filename_from_uri@Base 2.12.0 + g_filename_from_utf8@Base 2.12.0 + g_filename_to_uri@Base 2.12.0 + g_filename_to_utf8@Base 2.12.0 + g_find_program_in_path@Base 2.12.0 + g_fopen@Base 2.12.0 + g_format_size_for_display@Base 2.16.0 + g_fprintf@Base 2.12.0 + g_free@Base 2.12.0 + g_freopen@Base 2.12.0 + g_get_application_name@Base 2.12.0 + g_get_charset@Base 2.12.0 + g_get_codeset@Base 2.12.0 + g_get_current_dir@Base 2.12.0 + g_get_current_time@Base 2.12.0 + g_get_filename_charsets@Base 2.12.0 + g_get_home_dir@Base 2.12.0 + g_get_host_name@Base 2.12.0 + g_get_language_names@Base 2.12.0 + g_get_prgname@Base 2.12.0 + g_get_real_name@Base 2.12.0 + g_get_system_config_dirs@Base 2.12.0 + g_get_system_data_dirs@Base 2.12.0 + g_get_tmp_dir@Base 2.12.0 + g_get_user_cache_dir@Base 2.12.0 + g_get_user_config_dir@Base 2.12.0 + g_get_user_data_dir@Base 2.12.0 + g_get_user_name@Base 2.12.0 + g_get_user_special_dir@Base 2.14.0 + g_getenv@Base 2.12.0 + g_hash_table_destroy@Base 2.12.0 + g_hash_table_find@Base 2.12.0 + g_hash_table_foreach@Base 2.12.0 + g_hash_table_foreach_remove@Base 2.12.0 + g_hash_table_foreach_steal@Base 2.12.0 + g_hash_table_get_keys@Base 2.14.0 + g_hash_table_get_values@Base 2.14.0 + g_hash_table_insert@Base 2.12.0 + g_hash_table_iter_get_hash_table@Base 2.16.0 + g_hash_table_iter_init@Base 2.16.0 + g_hash_table_iter_next@Base 2.16.0 + g_hash_table_iter_remove@Base 2.16.0 + g_hash_table_iter_steal@Base 2.16.0 + g_hash_table_lookup@Base 2.12.0 + g_hash_table_lookup_extended@Base 2.12.0 + g_hash_table_new@Base 2.12.0 + g_hash_table_new_full@Base 2.12.0 + g_hash_table_ref@Base 2.12.0 + g_hash_table_remove@Base 2.12.0 + g_hash_table_remove_all@Base 2.12.0 + g_hash_table_replace@Base 2.12.0 + g_hash_table_size@Base 2.12.0 + g_hash_table_steal@Base 2.12.0 + g_hash_table_steal_all@Base 2.12.0 + g_hash_table_unref@Base 2.12.0 + g_hook_alloc@Base 2.12.0 + g_hook_compare_ids@Base 2.12.0 + g_hook_destroy@Base 2.12.0 + g_hook_destroy_link@Base 2.12.0 + g_hook_find@Base 2.12.0 + g_hook_find_data@Base 2.12.0 + g_hook_find_func@Base 2.12.0 + g_hook_find_func_data@Base 2.12.0 + g_hook_first_valid@Base 2.12.0 + g_hook_free@Base 2.12.0 + g_hook_get@Base 2.12.0 + g_hook_insert_before@Base 2.12.0 + g_hook_insert_sorted@Base 2.12.0 + g_hook_list_clear@Base 2.12.0 + g_hook_list_init@Base 2.12.0 + g_hook_list_invoke@Base 2.12.0 + g_hook_list_invoke_check@Base 2.12.0 + g_hook_list_marshal@Base 2.12.0 + g_hook_list_marshal_check@Base 2.12.0 + g_hook_next_valid@Base 2.12.0 + g_hook_prepend@Base 2.12.0 + g_hook_ref@Base 2.12.0 + g_hook_unref@Base 2.12.0 + g_hostname_is_ascii_encoded@Base 2.22.0 + g_hostname_is_ip_address@Base 2.22.0 + g_hostname_is_non_ascii@Base 2.22.0 + g_hostname_to_ascii@Base 2.22.0 + g_hostname_to_unicode@Base 2.22.0 + g_iconv@Base 2.12.0 + g_iconv_close@Base 2.12.0 + g_iconv_open@Base 2.12.0 + g_idle_add@Base 2.12.0 + g_idle_add_full@Base 2.12.0 + g_idle_funcs@Base 2.12.0 + g_idle_remove_by_data@Base 2.12.0 + g_idle_source_new@Base 2.12.0 + g_int64_equal@Base 2.22.0 + g_int64_hash@Base 2.22.0 + g_int_equal@Base 2.12.0 + g_int_hash@Base 2.12.0 + g_intern_static_string@Base 2.12.0 + g_intern_string@Base 2.12.0 + g_io_add_watch@Base 2.12.0 + g_io_add_watch_full@Base 2.12.0 + g_io_channel_close@Base 2.12.0 + g_io_channel_error_from_errno@Base 2.12.0 + g_io_channel_error_quark@Base 2.12.0 + g_io_channel_flush@Base 2.12.0 + g_io_channel_get_buffer_condition@Base 2.12.0 + g_io_channel_get_buffer_size@Base 2.12.0 + g_io_channel_get_buffered@Base 2.12.0 + g_io_channel_get_close_on_unref@Base 2.12.0 + g_io_channel_get_encoding@Base 2.12.0 + g_io_channel_get_flags@Base 2.12.0 + g_io_channel_get_line_term@Base 2.12.0 + g_io_channel_init@Base 2.12.0 + g_io_channel_new_file@Base 2.12.0 + g_io_channel_read@Base 2.12.0 + g_io_channel_read_chars@Base 2.12.0 + g_io_channel_read_line@Base 2.12.0 + g_io_channel_read_line_string@Base 2.12.0 + g_io_channel_read_to_end@Base 2.12.0 + g_io_channel_read_unichar@Base 2.12.0 + g_io_channel_ref@Base 2.12.0 + g_io_channel_seek@Base 2.12.0 + g_io_channel_seek_position@Base 2.12.0 + g_io_channel_set_buffer_size@Base 2.12.0 + g_io_channel_set_buffered@Base 2.12.0 + g_io_channel_set_close_on_unref@Base 2.12.0 + g_io_channel_set_encoding@Base 2.12.0 + g_io_channel_set_flags@Base 2.12.0 + g_io_channel_set_line_term@Base 2.12.0 + g_io_channel_shutdown@Base 2.12.0 + g_io_channel_unix_get_fd@Base 2.12.0 + g_io_channel_unix_new@Base 2.12.0 + g_io_channel_unref@Base 2.12.0 + g_io_channel_write@Base 2.12.0 + g_io_channel_write_chars@Base 2.12.0 + g_io_channel_write_unichar@Base 2.12.0 + g_io_create_watch@Base 2.12.0 + g_io_watch_funcs@Base 2.12.0 + g_key_file_error_quark@Base 2.12.0 + g_key_file_free@Base 2.12.0 + g_key_file_get_boolean@Base 2.12.0 + g_key_file_get_boolean_list@Base 2.12.0 + g_key_file_get_comment@Base 2.12.0 + g_key_file_get_double@Base 2.12.0 + g_key_file_get_double_list@Base 2.12.0 + g_key_file_get_groups@Base 2.12.0 + g_key_file_get_integer@Base 2.12.0 + g_key_file_get_integer_list@Base 2.12.0 + g_key_file_get_keys@Base 2.12.0 + g_key_file_get_locale_string@Base 2.12.0 + g_key_file_get_locale_string_list@Base 2.12.0 + g_key_file_get_start_group@Base 2.12.0 + g_key_file_get_string@Base 2.12.0 + g_key_file_get_string_list@Base 2.12.0 + g_key_file_get_value@Base 2.12.0 + g_key_file_has_group@Base 2.12.0 + g_key_file_has_key@Base 2.12.0 + g_key_file_load_from_data@Base 2.12.0 + g_key_file_load_from_data_dirs@Base 2.12.0 + g_key_file_load_from_dirs@Base 2.14.0 + g_key_file_load_from_file@Base 2.12.0 + g_key_file_new@Base 2.12.0 + g_key_file_remove_comment@Base 2.12.0 + g_key_file_remove_group@Base 2.12.0 + g_key_file_remove_key@Base 2.12.0 + g_key_file_set_boolean@Base 2.12.0 + g_key_file_set_boolean_list@Base 2.12.0 + g_key_file_set_comment@Base 2.12.0 + g_key_file_set_double@Base 2.12.0 + g_key_file_set_double_list@Base 2.12.0 + g_key_file_set_integer@Base 2.12.0 + g_key_file_set_integer_list@Base 2.12.0 + g_key_file_set_list_separator@Base 2.12.0 + g_key_file_set_locale_string@Base 2.12.0 + g_key_file_set_locale_string_list@Base 2.12.0 + g_key_file_set_string@Base 2.12.0 + g_key_file_set_string_list@Base 2.12.0 + g_key_file_set_value@Base 2.12.0 + g_key_file_to_data@Base 2.12.0 + g_list_alloc@Base 2.12.0 + g_list_append@Base 2.12.0 + g_list_concat@Base 2.12.0 + g_list_copy@Base 2.12.0 + g_list_delete_link@Base 2.12.0 + g_list_find@Base 2.12.0 + g_list_find_custom@Base 2.12.0 + g_list_first@Base 2.12.0 + g_list_foreach@Base 2.12.0 + g_list_free@Base 2.12.0 + g_list_free_1@Base 2.12.0 + g_list_index@Base 2.12.0 + g_list_insert@Base 2.12.0 + g_list_insert_before@Base 2.12.0 + g_list_insert_sorted@Base 2.12.0 + g_list_insert_sorted_with_data@Base 2.12.0 + g_list_last@Base 2.12.0 + g_list_length@Base 2.12.0 + g_list_nth@Base 2.12.0 + g_list_nth_data@Base 2.12.0 + g_list_nth_prev@Base 2.12.0 + g_list_pop_allocator@Base 2.12.0 + g_list_position@Base 2.12.0 + g_list_prepend@Base 2.12.0 + g_list_push_allocator@Base 2.12.0 + g_list_remove@Base 2.12.0 + g_list_remove_all@Base 2.12.0 + g_list_remove_link@Base 2.12.0 + g_list_reverse@Base 2.12.0 + g_list_sort@Base 2.12.0 + g_list_sort_with_data@Base 2.12.0 + g_listenv@Base 2.12.0 + g_locale_from_utf8@Base 2.12.0 + g_locale_to_utf8@Base 2.12.0 + g_log@Base 2.12.0 + g_log_default_handler@Base 2.12.0 + g_log_remove_handler@Base 2.12.0 + g_log_set_always_fatal@Base 2.12.0 + g_log_set_default_handler@Base 2.12.0 + g_log_set_fatal_mask@Base 2.12.0 + g_log_set_handler@Base 2.12.0 + g_logv@Base 2.12.0 + g_lstat@Base 2.12.0 + g_main_context_acquire@Base 2.12.0 + g_main_context_add_poll@Base 2.12.0 + g_main_context_check@Base 2.12.0 + g_main_context_default@Base 2.12.0 + g_main_context_dispatch@Base 2.12.0 + g_main_context_find_source_by_funcs_user_data@Base 2.12.0 + g_main_context_find_source_by_id@Base 2.12.0 + g_main_context_find_source_by_user_data@Base 2.12.0 + g_main_context_get_poll_func@Base 2.12.0 + g_main_context_get_thread_default@Base 2.22.0 + g_main_context_is_owner@Base 2.12.0 + g_main_context_iteration@Base 2.12.0 + g_main_context_new@Base 2.12.0 + g_main_context_pending@Base 2.12.0 + g_main_context_pop_thread_default@Base 2.22.0 + g_main_context_prepare@Base 2.12.0 + g_main_context_push_thread_default@Base 2.22.0 + g_main_context_query@Base 2.12.0 + g_main_context_ref@Base 2.12.0 + g_main_context_release@Base 2.12.0 + g_main_context_remove_poll@Base 2.12.0 + g_main_context_set_poll_func@Base 2.12.0 + g_main_context_unref@Base 2.12.0 + g_main_context_wait@Base 2.12.0 + g_main_context_wakeup@Base 2.12.0 + g_main_current_source@Base 2.12.0 + g_main_depth@Base 2.12.0 + g_main_loop_get_context@Base 2.12.0 + g_main_loop_is_running@Base 2.12.0 + g_main_loop_new@Base 2.12.0 + g_main_loop_quit@Base 2.12.0 + g_main_loop_ref@Base 2.12.0 + g_main_loop_run@Base 2.12.0 + g_main_loop_unref@Base 2.12.0 + g_malloc0@Base 2.12.0 + g_malloc@Base 2.12.0 + g_mapped_file_free@Base 2.12.0 + g_mapped_file_get_contents@Base 2.12.0 + g_mapped_file_get_length@Base 2.12.0 + g_mapped_file_new@Base 2.12.0 + g_mapped_file_ref@Base 2.22.0 + g_mapped_file_unref@Base 2.22.0 + g_markup_collect_attributes@Base 2.16.0 + g_markup_error_quark@Base 2.12.0 + g_markup_escape_text@Base 2.12.0 + g_markup_parse_context_end_parse@Base 2.12.0 + g_markup_parse_context_free@Base 2.12.0 + g_markup_parse_context_get_element@Base 2.12.0 + g_markup_parse_context_get_element_stack@Base 2.16.0 + g_markup_parse_context_get_position@Base 2.12.0 + g_markup_parse_context_get_user_data@Base 2.18.0 + g_markup_parse_context_new@Base 2.12.0 + g_markup_parse_context_parse@Base 2.12.0 + g_markup_parse_context_pop@Base 2.18.0 + g_markup_parse_context_push@Base 2.18.0 + g_markup_printf_escaped@Base 2.12.0 + g_markup_vprintf_escaped@Base 2.12.0 + g_match_info_expand_references@Base 2.14.0 + g_match_info_fetch@Base 2.14.0 + g_match_info_fetch_all@Base 2.14.0 + g_match_info_fetch_named@Base 2.14.0 + g_match_info_fetch_named_pos@Base 2.14.0 + g_match_info_fetch_pos@Base 2.14.0 + g_match_info_free@Base 2.14.0 + g_match_info_get_match_count@Base 2.14.0 + g_match_info_get_regex@Base 2.14.0 + g_match_info_get_string@Base 2.14.0 + g_match_info_is_partial_match@Base 2.14.0 + g_match_info_matches@Base 2.14.0 + g_match_info_next@Base 2.14.0 + g_mem_chunk_alloc0@Base 2.12.0 + g_mem_chunk_alloc@Base 2.12.0 + g_mem_chunk_clean@Base 2.12.0 + g_mem_chunk_destroy@Base 2.12.0 + g_mem_chunk_free@Base 2.12.0 + g_mem_chunk_info@Base 2.12.0 + g_mem_chunk_new@Base 2.12.0 + g_mem_chunk_print@Base 2.12.0 + g_mem_chunk_reset@Base 2.12.0 + g_mem_gc_friendly@Base 2.12.0 + g_mem_is_system_malloc@Base 2.12.0 + g_mem_profile@Base 2.12.0 + g_mem_set_vtable@Base 2.12.0 + g_memdup@Base 2.12.0 + g_mkdir@Base 2.12.0 + g_mkdir_with_parents@Base 2.12.0 + g_mkstemp@Base 2.12.0 + g_mkstemp_full@Base 2.22.0 + g_node_child_index@Base 2.12.0 + g_node_child_position@Base 2.12.0 + g_node_children_foreach@Base 2.12.0 + g_node_copy@Base 2.12.0 + g_node_copy_deep@Base 2.12.0 + g_node_depth@Base 2.12.0 + g_node_destroy@Base 2.12.0 + g_node_find@Base 2.12.0 + g_node_find_child@Base 2.12.0 + g_node_first_sibling@Base 2.12.0 + g_node_get_root@Base 2.12.0 + g_node_insert@Base 2.12.0 + g_node_insert_after@Base 2.12.0 + g_node_insert_before@Base 2.12.0 + g_node_is_ancestor@Base 2.12.0 + g_node_last_child@Base 2.12.0 + g_node_last_sibling@Base 2.12.0 + g_node_max_height@Base 2.12.0 + g_node_n_children@Base 2.12.0 + g_node_n_nodes@Base 2.12.0 + g_node_new@Base 2.12.0 + g_node_nth_child@Base 2.12.0 + g_node_pop_allocator@Base 2.12.0 + g_node_prepend@Base 2.12.0 + g_node_push_allocator@Base 2.12.0 + g_node_reverse_children@Base 2.12.0 + g_node_traverse@Base 2.12.0 + g_node_unlink@Base 2.12.0 + g_nullify_pointer@Base 2.12.0 + g_on_error_query@Base 2.12.0 + g_on_error_stack_trace@Base 2.12.0 + g_once_impl@Base 2.12.0 + g_once_init_enter@Base 2.14.0 + g_once_init_enter_impl@Base 2.14.0 + g_once_init_leave@Base 2.14.0 + g_open@Base 2.12.0 + g_option_context_add_group@Base 2.12.0 + g_option_context_add_main_entries@Base 2.12.0 + g_option_context_free@Base 2.12.0 + g_option_context_get_description@Base 2.12.0 + g_option_context_get_help@Base 2.14.0 + g_option_context_get_help_enabled@Base 2.12.0 + g_option_context_get_ignore_unknown_options@Base 2.12.0 + g_option_context_get_main_group@Base 2.12.0 + g_option_context_get_summary@Base 2.12.0 + g_option_context_new@Base 2.12.0 + g_option_context_parse@Base 2.12.0 + g_option_context_set_description@Base 2.12.0 + g_option_context_set_help_enabled@Base 2.12.0 + g_option_context_set_ignore_unknown_options@Base 2.12.0 + g_option_context_set_main_group@Base 2.12.0 + g_option_context_set_summary@Base 2.12.0 + g_option_context_set_translate_func@Base 2.12.0 + g_option_context_set_translation_domain@Base 2.12.0 + g_option_error_quark@Base 2.12.0 + g_option_group_add_entries@Base 2.12.0 + g_option_group_free@Base 2.12.0 + g_option_group_new@Base 2.12.0 + g_option_group_set_error_hook@Base 2.12.0 + g_option_group_set_parse_hooks@Base 2.12.0 + g_option_group_set_translate_func@Base 2.12.0 + g_option_group_set_translation_domain@Base 2.12.0 + g_parse_debug_string@Base 2.12.0 + g_path_get_basename@Base 2.12.0 + g_path_get_dirname@Base 2.12.0 + g_path_is_absolute@Base 2.12.0 + g_path_skip_root@Base 2.12.0 + g_pattern_match@Base 2.12.0 + g_pattern_match_simple@Base 2.12.0 + g_pattern_match_string@Base 2.12.0 + g_pattern_spec_equal@Base 2.12.0 + g_pattern_spec_free@Base 2.12.0 + g_pattern_spec_new@Base 2.12.0 + g_poll@Base 2.20.0 + g_prefix_error@Base 2.16.0 + g_print@Base 2.12.0 + g_printerr@Base 2.12.0 + g_printf@Base 2.12.0 + g_printf_string_upper_bound@Base 2.12.0 + g_propagate_error@Base 2.12.0 + g_propagate_prefixed_error@Base 2.16.0 + g_ptr_array_add@Base 2.12.0 + g_ptr_array_foreach@Base 2.12.0 + g_ptr_array_free@Base 2.12.0 + g_ptr_array_new@Base 2.12.0 + g_ptr_array_new_with_free_func@Base 2.22.0 + g_ptr_array_ref@Base 2.22.0 + g_ptr_array_remove@Base 2.12.0 + g_ptr_array_remove_fast@Base 2.12.0 + g_ptr_array_remove_index@Base 2.12.0 + g_ptr_array_remove_index_fast@Base 2.12.0 + g_ptr_array_remove_range@Base 2.12.0 + g_ptr_array_set_free_func@Base 2.22.0 + g_ptr_array_set_size@Base 2.12.0 + g_ptr_array_sized_new@Base 2.12.0 + g_ptr_array_sort@Base 2.12.0 + g_ptr_array_sort_with_data@Base 2.12.0 + g_ptr_array_unref@Base 2.22.0 + g_qsort_with_data@Base 2.12.0 + g_quark_from_static_string@Base 2.12.0 + g_quark_from_string@Base 2.12.0 + g_quark_to_string@Base 2.12.0 + g_quark_try_string@Base 2.12.0 + g_queue_clear@Base 2.14.0 + g_queue_copy@Base 2.12.0 + g_queue_delete_link@Base 2.12.0 + g_queue_find@Base 2.12.0 + g_queue_find_custom@Base 2.12.0 + g_queue_foreach@Base 2.12.0 + g_queue_free@Base 2.12.0 + g_queue_get_length@Base 2.12.0 + g_queue_index@Base 2.12.0 + g_queue_init@Base 2.14.0 + g_queue_insert_after@Base 2.12.0 + g_queue_insert_before@Base 2.12.0 + g_queue_insert_sorted@Base 2.12.0 + g_queue_is_empty@Base 2.12.0 + g_queue_link_index@Base 2.12.0 + g_queue_new@Base 2.12.0 + g_queue_peek_head@Base 2.12.0 + g_queue_peek_head_link@Base 2.12.0 + g_queue_peek_nth@Base 2.12.0 + g_queue_peek_nth_link@Base 2.12.0 + g_queue_peek_tail@Base 2.12.0 + g_queue_peek_tail_link@Base 2.12.0 + g_queue_pop_head@Base 2.12.0 + g_queue_pop_head_link@Base 2.12.0 + g_queue_pop_nth@Base 2.12.0 + g_queue_pop_nth_link@Base 2.12.0 + g_queue_pop_tail@Base 2.12.0 + g_queue_pop_tail_link@Base 2.12.0 + g_queue_push_head@Base 2.12.0 + g_queue_push_head_link@Base 2.12.0 + g_queue_push_nth@Base 2.12.0 + g_queue_push_nth_link@Base 2.12.0 + g_queue_push_tail@Base 2.12.0 + g_queue_push_tail_link@Base 2.12.0 + g_queue_remove@Base 2.12.0 + g_queue_remove_all@Base 2.12.0 + g_queue_reverse@Base 2.12.0 + g_queue_sort@Base 2.12.0 + g_queue_unlink@Base 2.12.0 + g_rand_copy@Base 2.12.0 + g_rand_double@Base 2.12.0 + g_rand_double_range@Base 2.12.0 + g_rand_free@Base 2.12.0 + g_rand_int@Base 2.12.0 + g_rand_int_range@Base 2.12.0 + g_rand_new@Base 2.12.0 + g_rand_new_with_seed@Base 2.12.0 + g_rand_new_with_seed_array@Base 2.12.0 + g_rand_set_seed@Base 2.12.0 + g_rand_set_seed_array@Base 2.12.0 + g_random_double@Base 2.12.0 + g_random_double_range@Base 2.12.0 + g_random_int@Base 2.12.0 + g_random_int_range@Base 2.12.0 + g_random_set_seed@Base 2.12.0 + g_realloc@Base 2.12.0 + g_regex_check_replacement@Base 2.14.0 + g_regex_error_quark@Base 2.14.0 + g_regex_escape_string@Base 2.14.0 + g_regex_get_capture_count@Base 2.14.0 + g_regex_get_max_backref@Base 2.14.0 + g_regex_get_pattern@Base 2.14.0 + g_regex_get_string_number@Base 2.14.0 + g_regex_match@Base 2.14.0 + g_regex_match_all@Base 2.14.0 + g_regex_match_all_full@Base 2.14.0 + g_regex_match_full@Base 2.14.0 + g_regex_match_simple@Base 2.14.0 + g_regex_new@Base 2.14.0 + g_regex_ref@Base 2.14.0 + g_regex_replace@Base 2.14.0 + g_regex_replace_eval@Base 2.14.0 + g_regex_replace_literal@Base 2.14.0 + g_regex_split@Base 2.14.0 + g_regex_split_full@Base 2.14.0 + g_regex_split_simple@Base 2.14.0 + g_regex_unref@Base 2.14.0 + g_relation_count@Base 2.12.0 + g_relation_delete@Base 2.12.0 + g_relation_destroy@Base 2.12.0 + g_relation_exists@Base 2.12.0 + g_relation_index@Base 2.12.0 + g_relation_insert@Base 2.12.0 + g_relation_new@Base 2.12.0 + g_relation_print@Base 2.12.0 + g_relation_select@Base 2.12.0 + g_reload_user_special_dirs_cache@Base 2.22.0 + g_remove@Base 2.12.0 + g_rename@Base 2.12.0 + g_return_if_fail_warning@Base 2.12.0 + g_rmdir@Base 2.12.0 + g_scanner_cur_line@Base 2.12.0 + g_scanner_cur_position@Base 2.12.0 + g_scanner_cur_token@Base 2.12.0 + g_scanner_cur_value@Base 2.12.0 + g_scanner_destroy@Base 2.12.0 + g_scanner_eof@Base 2.12.0 + g_scanner_error@Base 2.12.0 + g_scanner_get_next_token@Base 2.12.0 + g_scanner_input_file@Base 2.12.0 + g_scanner_input_text@Base 2.12.0 + g_scanner_lookup_symbol@Base 2.12.0 + g_scanner_new@Base 2.12.0 + g_scanner_peek_next_token@Base 2.12.0 + g_scanner_scope_add_symbol@Base 2.12.0 + g_scanner_scope_foreach_symbol@Base 2.12.0 + g_scanner_scope_lookup_symbol@Base 2.12.0 + g_scanner_scope_remove_symbol@Base 2.12.0 + g_scanner_set_scope@Base 2.12.0 + g_scanner_sync_file_offset@Base 2.12.0 + g_scanner_unexp_token@Base 2.12.0 + g_scanner_warn@Base 2.12.0 + g_sequence_append@Base 2.14.0 + g_sequence_foreach@Base 2.14.0 + g_sequence_foreach_range@Base 2.14.0 + g_sequence_free@Base 2.14.0 + g_sequence_get@Base 2.14.0 + g_sequence_get_begin_iter@Base 2.14.0 + g_sequence_get_end_iter@Base 2.14.0 + g_sequence_get_iter_at_pos@Base 2.14.0 + g_sequence_get_length@Base 2.14.0 + g_sequence_insert_before@Base 2.14.0 + g_sequence_insert_sorted@Base 2.14.0 + g_sequence_insert_sorted_iter@Base 2.14.0 + g_sequence_iter_compare@Base 2.14.0 + g_sequence_iter_get_position@Base 2.14.0 + g_sequence_iter_get_sequence@Base 2.14.0 + g_sequence_iter_is_begin@Base 2.14.0 + g_sequence_iter_is_end@Base 2.14.0 + g_sequence_iter_move@Base 2.14.0 + g_sequence_iter_next@Base 2.14.0 + g_sequence_iter_prev@Base 2.14.0 + g_sequence_move@Base 2.14.0 + g_sequence_move_range@Base 2.14.0 + g_sequence_new@Base 2.14.0 + g_sequence_prepend@Base 2.14.0 + g_sequence_range_get_midpoint@Base 2.14.0 + g_sequence_remove@Base 2.14.0 + g_sequence_remove_range@Base 2.14.0 + g_sequence_search@Base 2.14.0 + g_sequence_search_iter@Base 2.14.0 + g_sequence_set@Base 2.14.0 + g_sequence_sort@Base 2.14.0 + g_sequence_sort_changed@Base 2.14.0 + g_sequence_sort_changed_iter@Base 2.14.0 + g_sequence_sort_iter@Base 2.14.0 + g_sequence_swap@Base 2.14.0 + g_set_application_name@Base 2.12.0 + g_set_error@Base 2.12.0 + g_set_error_literal@Base 2.18.0 + g_set_prgname@Base 2.12.0 + g_set_print_handler@Base 2.12.0 + g_set_printerr_handler@Base 2.12.0 + g_setenv@Base 2.12.0 + g_shell_error_quark@Base 2.12.0 + g_shell_parse_argv@Base 2.12.0 + g_shell_quote@Base 2.12.0 + g_shell_unquote@Base 2.12.0 + g_slice_alloc0@Base 2.12.0 + g_slice_alloc@Base 2.12.0 + g_slice_copy@Base 2.14.0 + g_slice_free1@Base 2.12.0 + g_slice_free_chain_with_offset@Base 2.12.0 + g_slice_get_config@Base 2.12.0 + g_slice_get_config_state@Base 2.12.0 + g_slice_set_config@Base 2.12.0 + g_slist_alloc@Base 2.12.0 + g_slist_append@Base 2.12.0 + g_slist_concat@Base 2.12.0 + g_slist_copy@Base 2.12.0 + g_slist_delete_link@Base 2.12.0 + g_slist_find@Base 2.12.0 + g_slist_find_custom@Base 2.12.0 + g_slist_foreach@Base 2.12.0 + g_slist_free@Base 2.12.0 + g_slist_free_1@Base 2.12.0 + g_slist_index@Base 2.12.0 + g_slist_insert@Base 2.12.0 + g_slist_insert_before@Base 2.12.0 + g_slist_insert_sorted@Base 2.12.0 + g_slist_insert_sorted_with_data@Base 2.12.0 + g_slist_last@Base 2.12.0 + g_slist_length@Base 2.12.0 + g_slist_nth@Base 2.12.0 + g_slist_nth_data@Base 2.12.0 + g_slist_pop_allocator@Base 2.12.0 + g_slist_position@Base 2.12.0 + g_slist_prepend@Base 2.12.0 + g_slist_push_allocator@Base 2.12.0 + g_slist_remove@Base 2.12.0 + g_slist_remove_all@Base 2.12.0 + g_slist_remove_link@Base 2.12.0 + g_slist_reverse@Base 2.12.0 + g_slist_sort@Base 2.12.0 + g_slist_sort_with_data@Base 2.12.0 + g_snprintf@Base 2.12.0 + g_source_add_poll@Base 2.12.0 + g_source_attach@Base 2.12.0 + g_source_destroy@Base 2.12.0 + g_source_get_can_recurse@Base 2.12.0 + g_source_get_context@Base 2.12.0 + g_source_get_current_time@Base 2.12.0 + g_source_get_id@Base 2.12.0 + g_source_get_priority@Base 2.12.0 + g_source_is_destroyed@Base 2.12.0 + g_source_new@Base 2.12.0 + g_source_ref@Base 2.12.0 + g_source_remove@Base 2.12.0 + g_source_remove_by_funcs_user_data@Base 2.12.0 + g_source_remove_by_user_data@Base 2.12.0 + g_source_remove_poll@Base 2.12.0 + g_source_set_callback@Base 2.12.0 + g_source_set_callback_indirect@Base 2.12.0 + g_source_set_can_recurse@Base 2.12.0 + g_source_set_funcs@Base 2.12.0 + g_source_set_priority@Base 2.12.0 + g_source_unref@Base 2.12.0 + g_spaced_primes_closest@Base 2.12.0 + g_spawn_async@Base 2.12.0 + g_spawn_async_with_pipes@Base 2.12.0 + g_spawn_close_pid@Base 2.12.0 + g_spawn_command_line_async@Base 2.12.0 + g_spawn_command_line_sync@Base 2.12.0 + g_spawn_error_quark@Base 2.12.0 + g_spawn_sync@Base 2.12.0 + g_sprintf@Base 2.12.0 + g_stat@Base 2.12.0 + g_static_mutex_free@Base 2.12.0 + g_static_mutex_get_mutex_impl@Base 2.12.0 + g_static_mutex_init@Base 2.12.0 + g_static_private_free@Base 2.12.0 + g_static_private_get@Base 2.12.0 + g_static_private_init@Base 2.12.0 + g_static_private_set@Base 2.12.0 + g_static_rec_mutex_free@Base 2.12.0 + g_static_rec_mutex_init@Base 2.12.0 + g_static_rec_mutex_lock@Base 2.12.0 + g_static_rec_mutex_lock_full@Base 2.12.0 + g_static_rec_mutex_trylock@Base 2.12.0 + g_static_rec_mutex_unlock@Base 2.12.0 + g_static_rec_mutex_unlock_full@Base 2.12.0 + g_static_rw_lock_free@Base 2.12.0 + g_static_rw_lock_init@Base 2.12.0 + g_static_rw_lock_reader_lock@Base 2.12.0 + g_static_rw_lock_reader_trylock@Base 2.12.0 + g_static_rw_lock_reader_unlock@Base 2.12.0 + g_static_rw_lock_writer_lock@Base 2.12.0 + g_static_rw_lock_writer_trylock@Base 2.12.0 + g_static_rw_lock_writer_unlock@Base 2.12.0 + g_stpcpy@Base 2.12.0 + g_str_equal@Base 2.12.0 + g_str_has_prefix@Base 2.12.0 + g_str_has_suffix@Base 2.12.0 + g_str_hash@Base 2.12.0 + g_strcanon@Base 2.12.0 + g_strcasecmp@Base 2.12.0 + g_strchomp@Base 2.12.0 + g_strchug@Base 2.12.0 + g_strcmp0@Base 2.16.0 + g_strcompress@Base 2.12.0 + g_strconcat@Base 2.12.0 + g_strdelimit@Base 2.12.0 + g_strdown@Base 2.12.0 + g_strdup@Base 2.12.0 + g_strdup_printf@Base 2.12.0 + g_strdup_vprintf@Base 2.12.0 + g_strdupv@Base 2.12.0 + g_strerror@Base 2.12.0 + g_strescape@Base 2.12.0 + g_strfreev@Base 2.12.0 + g_string_append@Base 2.12.0 + g_string_append_c@Base 2.12.0 + g_string_append_len@Base 2.12.0 + g_string_append_printf@Base 2.12.0 + g_string_append_unichar@Base 2.12.0 + g_string_append_uri_escaped@Base 2.16.0 + g_string_append_vprintf@Base 2.14.0 + g_string_ascii_down@Base 2.12.0 + g_string_ascii_up@Base 2.12.0 + g_string_assign@Base 2.12.0 + g_string_chunk_clear@Base 2.14.0 + g_string_chunk_free@Base 2.12.0 + g_string_chunk_insert@Base 2.12.0 + g_string_chunk_insert_const@Base 2.12.0 + g_string_chunk_insert_len@Base 2.12.0 + g_string_chunk_new@Base 2.12.0 + g_string_down@Base 2.12.0 + g_string_equal@Base 2.12.0 + g_string_erase@Base 2.12.0 + g_string_free@Base 2.12.0 + g_string_hash@Base 2.12.0 + g_string_insert@Base 2.12.0 + g_string_insert_c@Base 2.12.0 + g_string_insert_len@Base 2.12.0 + g_string_insert_unichar@Base 2.12.0 + g_string_new@Base 2.12.0 + g_string_new_len@Base 2.12.0 + g_string_overwrite@Base 2.14.0 + g_string_overwrite_len@Base 2.14.0 + g_string_prepend@Base 2.12.0 + g_string_prepend_c@Base 2.12.0 + g_string_prepend_len@Base 2.12.0 + g_string_prepend_unichar@Base 2.12.0 + g_string_printf@Base 2.12.0 + g_string_set_size@Base 2.12.0 + g_string_sized_new@Base 2.12.0 + g_string_truncate@Base 2.12.0 + g_string_up@Base 2.12.0 + g_string_vprintf@Base 2.14.0 + g_strip_context@Base 2.12.0 + g_strjoin@Base 2.12.0 + g_strjoinv@Base 2.12.0 + g_strlcat@Base 2.12.0 + g_strlcpy@Base 2.12.0 + g_strncasecmp@Base 2.12.0 + g_strndup@Base 2.12.0 + g_strnfill@Base 2.12.0 + g_strreverse@Base 2.12.0 + g_strrstr@Base 2.12.0 + g_strrstr_len@Base 2.12.0 + g_strsignal@Base 2.12.0 + g_strsplit@Base 2.12.0 + g_strsplit_set@Base 2.12.0 + g_strstr_len@Base 2.12.0 + g_strtod@Base 2.12.0 + g_strup@Base 2.12.0 + g_strv_length@Base 2.12.0 + g_test_add_data_func@Base 2.16.0 + g_test_add_func@Base 2.16.0 + g_test_add_vtable@Base 2.16.0 + g_test_bug@Base 2.16.0 + g_test_bug_base@Base 2.16.0 + g_test_config_vars@Base 2.16.0 + g_test_create_case@Base 2.16.0 + g_test_create_suite@Base 2.16.0 + g_test_get_root@Base 2.16.0 + g_test_init@Base 2.16.0 + g_test_log_buffer_free@Base 2.16.0 + g_test_log_buffer_new@Base 2.16.0 + g_test_log_buffer_pop@Base 2.16.0 + g_test_log_buffer_push@Base 2.16.0 + g_test_log_msg_free@Base 2.16.0 + g_test_log_set_fatal_handler@Base 2.22.0 + g_test_log_type_name@Base 2.16.0 + g_test_maximized_result@Base 2.16.0 + g_test_message@Base 2.16.0 + g_test_minimized_result@Base 2.16.0 + g_test_queue_destroy@Base 2.16.0 + g_test_queue_free@Base 2.16.0 + g_test_rand_double@Base 2.16.0 + g_test_rand_double_range@Base 2.16.0 + g_test_rand_int@Base 2.16.0 + g_test_rand_int_range@Base 2.16.0 + g_test_run@Base 2.16.0 + g_test_run_suite@Base 2.16.0 + g_test_suite_add@Base 2.16.0 + g_test_suite_add_suite@Base 2.16.0 + g_test_timer_elapsed@Base 2.16.0 + g_test_timer_last@Base 2.16.0 + g_test_timer_start@Base 2.16.0 + g_test_trap_assertions@Base 2.16.0 + g_test_trap_fork@Base 2.16.0 + g_test_trap_has_passed@Base 2.16.0 + g_test_trap_reached_timeout@Base 2.16.0 + g_thread_create_full@Base 2.12.0 + g_thread_error_quark@Base 2.12.0 + g_thread_exit@Base 2.12.0 + g_thread_foreach@Base 2.12.0 + g_thread_functions_for_glib_use@Base 2.12.0 + g_thread_get_initialized@Base 2.20.0 + g_thread_gettime@Base 2.14.0 + g_thread_init_glib@Base 2.12.0 + g_thread_join@Base 2.12.0 + g_thread_pool_free@Base 2.12.0 + g_thread_pool_get_max_idle_time@Base 2.12.0 + g_thread_pool_get_max_threads@Base 2.12.0 + g_thread_pool_get_max_unused_threads@Base 2.12.0 + g_thread_pool_get_num_threads@Base 2.12.0 + g_thread_pool_get_num_unused_threads@Base 2.12.0 + g_thread_pool_new@Base 2.12.0 + g_thread_pool_push@Base 2.12.0 + g_thread_pool_set_max_idle_time@Base 2.12.0 + g_thread_pool_set_max_threads@Base 2.12.0 + g_thread_pool_set_max_unused_threads@Base 2.12.0 + g_thread_pool_set_sort_function@Base 2.12.0 + g_thread_pool_stop_unused_threads@Base 2.12.0 + g_thread_pool_unprocessed@Base 2.12.0 + g_thread_self@Base 2.12.0 + g_thread_set_priority@Base 2.12.0 + g_thread_use_default_impl@Base 2.12.0 + g_threads_got_initialized@Base 2.12.0 + g_time_val_add@Base 2.12.0 + g_time_val_from_iso8601@Base 2.12.0 + g_time_val_to_iso8601@Base 2.12.0 + g_timeout_add@Base 2.12.0 + g_timeout_add_full@Base 2.12.0 + g_timeout_add_seconds@Base 2.14.0 + g_timeout_add_seconds_full@Base 2.14.0 + g_timeout_funcs@Base 2.12.0 + g_timeout_source_new@Base 2.12.0 + g_timeout_source_new_seconds@Base 2.14.0 + g_timer_continue@Base 2.12.0 + g_timer_destroy@Base 2.12.0 + g_timer_elapsed@Base 2.12.0 + g_timer_new@Base 2.12.0 + g_timer_reset@Base 2.12.0 + g_timer_start@Base 2.12.0 + g_timer_stop@Base 2.12.0 + g_trash_stack_height@Base 2.12.0 + g_trash_stack_peek@Base 2.12.0 + g_trash_stack_pop@Base 2.12.0 + g_trash_stack_push@Base 2.12.0 + g_tree_destroy@Base 2.12.0 + g_tree_foreach@Base 2.12.0 + g_tree_height@Base 2.12.0 + g_tree_insert@Base 2.12.0 + g_tree_lookup@Base 2.12.0 + g_tree_lookup_extended@Base 2.12.0 + g_tree_new@Base 2.12.0 + g_tree_new_full@Base 2.12.0 + g_tree_new_with_data@Base 2.12.0 + g_tree_nnodes@Base 2.12.0 + g_tree_ref@Base 2.22.0 + g_tree_remove@Base 2.12.0 + g_tree_replace@Base 2.12.0 + g_tree_search@Base 2.12.0 + g_tree_steal@Base 2.12.0 + g_tree_traverse@Base 2.12.0 + g_tree_unref@Base 2.22.0 + g_try_malloc0@Base 2.12.0 + g_try_malloc@Base 2.12.0 + g_try_realloc@Base 2.12.0 + g_tuples_destroy@Base 2.12.0 + g_tuples_index@Base 2.12.0 + g_ucs4_to_utf16@Base 2.12.0 + g_ucs4_to_utf8@Base 2.12.0 + g_unichar_break_type@Base 2.12.0 + g_unichar_combining_class@Base 2.14.0 + g_unichar_digit_value@Base 2.12.0 + g_unichar_get_mirror_char@Base 2.12.0 + g_unichar_get_script@Base 2.14.0 + g_unichar_isalnum@Base 2.12.0 + g_unichar_isalpha@Base 2.12.0 + g_unichar_iscntrl@Base 2.12.0 + g_unichar_isdefined@Base 2.12.0 + g_unichar_isdigit@Base 2.12.0 + g_unichar_isgraph@Base 2.12.0 + g_unichar_islower@Base 2.12.0 + g_unichar_ismark@Base 2.14.0 + g_unichar_isprint@Base 2.12.0 + g_unichar_ispunct@Base 2.12.0 + g_unichar_isspace@Base 2.12.0 + g_unichar_istitle@Base 2.12.0 + g_unichar_isupper@Base 2.12.0 + g_unichar_iswide@Base 2.12.0 + g_unichar_iswide_cjk@Base 2.12.0 + g_unichar_isxdigit@Base 2.12.0 + g_unichar_iszerowidth@Base 2.14.0 + g_unichar_to_utf8@Base 2.12.0 + g_unichar_tolower@Base 2.12.0 + g_unichar_totitle@Base 2.12.0 + g_unichar_toupper@Base 2.12.0 + g_unichar_type@Base 2.12.0 + g_unichar_validate@Base 2.12.0 + g_unichar_xdigit_value@Base 2.12.0 + g_unicode_canonical_decomposition@Base 2.12.0 + g_unicode_canonical_ordering@Base 2.12.0 + g_unlink@Base 2.12.0 + g_unsetenv@Base 2.12.0 + g_uri_escape_string@Base 2.16.0 + g_uri_list_extract_uris@Base 2.12.0 + g_uri_parse_scheme@Base 2.16.0 + g_uri_unescape_segment@Base 2.16.0 + g_uri_unescape_string@Base 2.16.0 + g_usleep@Base 2.12.0 + g_utf16_to_ucs4@Base 2.12.0 + g_utf16_to_utf8@Base 2.12.0 + g_utf8_casefold@Base 2.12.0 + g_utf8_collate@Base 2.12.0 + g_utf8_collate_key@Base 2.12.0 + g_utf8_collate_key_for_filename@Base 2.12.0 + g_utf8_find_next_char@Base 2.12.0 + g_utf8_find_prev_char@Base 2.12.0 + g_utf8_get_char@Base 2.12.0 + g_utf8_get_char_validated@Base 2.12.0 + g_utf8_normalize@Base 2.12.0 + g_utf8_offset_to_pointer@Base 2.12.0 + g_utf8_pointer_to_offset@Base 2.12.0 + g_utf8_prev_char@Base 2.12.0 + g_utf8_skip@Base 2.12.0 + g_utf8_strchr@Base 2.12.0 + g_utf8_strdown@Base 2.12.0 + g_utf8_strlen@Base 2.12.0 + g_utf8_strncpy@Base 2.12.0 + g_utf8_strrchr@Base 2.12.0 + g_utf8_strreverse@Base 2.12.0 + g_utf8_strup@Base 2.12.0 + g_utf8_to_ucs4@Base 2.12.0 + g_utf8_to_ucs4_fast@Base 2.12.0 + g_utf8_to_utf16@Base 2.12.0 + g_utf8_validate@Base 2.12.0 + g_utime@Base 2.18.0 + g_vasprintf@Base 2.12.0 + g_vfprintf@Base 2.12.0 + g_vprintf@Base 2.12.0 + g_vsnprintf@Base 2.12.0 + g_vsprintf@Base 2.12.0 + g_warn_message@Base 2.16.0 + glib_binary_age@Base 2.12.0 + glib_check_version@Base 2.12.0 + glib_gettext@Base 2.16.0 + glib_interface_age@Base 2.12.0 + glib_major_version@Base 2.12.0 + glib_mem_profiler_table@Base 2.12.0 + glib_micro_version@Base 2.12.0 + glib_minor_version@Base 2.12.0 + glib_on_error_halt@Base 2.12.0 +libgmodule-2.0.so.0 libglib2.0-0 #MINVER# +* Build-Depends-Package: libglib2.0-dev + g_module_build_path@Base 2.12.0 + g_module_close@Base 2.12.0 + g_module_error@Base 2.12.0 + g_module_make_resident@Base 2.12.0 + g_module_name@Base 2.12.0 + g_module_open@Base 2.12.0 + g_module_supported@Base 2.12.0 + g_module_symbol@Base 2.12.0 +libgobject-2.0.so.0 libglib2.0-0 #MINVER# +* Build-Depends-Package: libglib2.0-dev + g_array_get_type@Base 2.22.0 + g_boxed_copy@Base 2.12.0 + g_boxed_free@Base 2.12.0 + g_boxed_type_register_static@Base 2.12.0 + g_byte_array_get_type@Base 2.22.0 + g_cclosure_marshal_BOOLEAN__FLAGS@Base 2.12.0 + g_cclosure_marshal_STRING__OBJECT_POINTER@Base 2.12.0 + g_cclosure_marshal_VOID__BOOLEAN@Base 2.12.0 + g_cclosure_marshal_VOID__BOXED@Base 2.12.0 + g_cclosure_marshal_VOID__CHAR@Base 2.12.0 + g_cclosure_marshal_VOID__DOUBLE@Base 2.12.0 + g_cclosure_marshal_VOID__ENUM@Base 2.12.0 + g_cclosure_marshal_VOID__FLAGS@Base 2.12.0 + g_cclosure_marshal_VOID__FLOAT@Base 2.12.0 + g_cclosure_marshal_VOID__INT@Base 2.12.0 + g_cclosure_marshal_VOID__LONG@Base 2.12.0 + g_cclosure_marshal_VOID__OBJECT@Base 2.12.0 + g_cclosure_marshal_VOID__PARAM@Base 2.12.0 + g_cclosure_marshal_VOID__POINTER@Base 2.12.0 + g_cclosure_marshal_VOID__STRING@Base 2.12.0 + g_cclosure_marshal_VOID__UCHAR@Base 2.12.0 + g_cclosure_marshal_VOID__UINT@Base 2.12.0 + g_cclosure_marshal_VOID__UINT_POINTER@Base 2.12.0 + g_cclosure_marshal_VOID__ULONG@Base 2.12.0 + g_cclosure_marshal_VOID__VOID@Base 2.12.0 + g_cclosure_new@Base 2.12.0 + g_cclosure_new_object@Base 2.12.0 + g_cclosure_new_object_swap@Base 2.12.0 + g_cclosure_new_swap@Base 2.12.0 + g_closure_add_finalize_notifier@Base 2.12.0 + g_closure_add_invalidate_notifier@Base 2.12.0 + g_closure_add_marshal_guards@Base 2.12.0 + g_closure_get_type@Base 2.12.0 + g_closure_invalidate@Base 2.12.0 + g_closure_invoke@Base 2.12.0 + g_closure_new_object@Base 2.12.0 + g_closure_new_simple@Base 2.12.0 + g_closure_ref@Base 2.12.0 + g_closure_remove_finalize_notifier@Base 2.12.0 + g_closure_remove_invalidate_notifier@Base 2.12.0 + g_closure_set_marshal@Base 2.12.0 + g_closure_set_meta_marshal@Base 2.12.0 + g_closure_sink@Base 2.12.0 + g_closure_unref@Base 2.12.0 + g_date_get_type@Base 2.12.0 + g_enum_complete_type_info@Base 2.12.0 + g_enum_get_value@Base 2.12.0 + g_enum_get_value_by_name@Base 2.12.0 + g_enum_get_value_by_nick@Base 2.12.0 + g_enum_register_static@Base 2.12.0 + g_flags_complete_type_info@Base 2.12.0 + g_flags_get_first_value@Base 2.12.0 + g_flags_get_value_by_name@Base 2.12.0 + g_flags_get_value_by_nick@Base 2.12.0 + g_flags_register_static@Base 2.12.0 + g_gstring_get_type@Base 2.12.0 + g_gtype_get_type@Base 2.12.0 + g_hash_table_get_type@Base 2.12.0 + g_initially_unowned_get_type@Base 2.12.0 + g_io_channel_get_type@Base 2.12.0 + g_io_condition_get_type@Base 2.12.0 + g_object_add_toggle_ref@Base 2.12.0 + g_object_add_weak_pointer@Base 2.12.0 + g_object_class_find_property@Base 2.12.0 + g_object_class_install_property@Base 2.12.0 + g_object_class_list_properties@Base 2.12.0 + g_object_class_override_property@Base 2.12.0 + g_object_compat_control@Base 2.12.0 + g_object_connect@Base 2.12.0 + g_object_disconnect@Base 2.12.0 + g_object_force_floating@Base 2.12.0 + g_object_freeze_notify@Base 2.12.0 + g_object_get@Base 2.12.0 + g_object_get_data@Base 2.12.0 + g_object_get_property@Base 2.12.0 + g_object_get_qdata@Base 2.12.0 + g_object_get_type@Base 2.18.0 + g_object_get_valist@Base 2.12.0 + g_object_interface_find_property@Base 2.12.0 + g_object_interface_install_property@Base 2.12.0 + g_object_interface_list_properties@Base 2.12.0 + g_object_is_floating@Base 2.12.0 + g_object_new@Base 2.12.0 + g_object_new_valist@Base 2.12.0 + g_object_newv@Base 2.12.0 + g_object_notify@Base 2.12.0 + g_object_ref@Base 2.12.0 + g_object_ref_sink@Base 2.12.0 + g_object_remove_toggle_ref@Base 2.12.0 + g_object_remove_weak_pointer@Base 2.12.0 + g_object_run_dispose@Base 2.12.0 + g_object_set@Base 2.12.0 + g_object_set_data@Base 2.12.0 + g_object_set_data_full@Base 2.12.0 + g_object_set_property@Base 2.12.0 + g_object_set_qdata@Base 2.12.0 + g_object_set_qdata_full@Base 2.12.0 + g_object_set_valist@Base 2.12.0 + g_object_steal_data@Base 2.12.0 + g_object_steal_qdata@Base 2.12.0 + g_object_thaw_notify@Base 2.12.0 + g_object_unref@Base 2.12.0 + g_object_watch_closure@Base 2.12.0 + g_object_weak_ref@Base 2.12.0 + g_object_weak_unref@Base 2.12.0 + g_param_spec_boolean@Base 2.12.0 + g_param_spec_boxed@Base 2.12.0 + g_param_spec_char@Base 2.12.0 + g_param_spec_double@Base 2.12.0 + g_param_spec_enum@Base 2.12.0 + g_param_spec_flags@Base 2.12.0 + g_param_spec_float@Base 2.12.0 + g_param_spec_get_blurb@Base 2.12.0 + g_param_spec_get_name@Base 2.12.0 + g_param_spec_get_nick@Base 2.12.0 + g_param_spec_get_qdata@Base 2.12.0 + g_param_spec_get_redirect_target@Base 2.12.0 + g_param_spec_gtype@Base 2.12.0 + g_param_spec_int64@Base 2.12.0 + g_param_spec_int@Base 2.12.0 + g_param_spec_internal@Base 2.12.0 + g_param_spec_long@Base 2.12.0 + g_param_spec_object@Base 2.12.0 + g_param_spec_override@Base 2.12.0 + g_param_spec_param@Base 2.12.0 + g_param_spec_pointer@Base 2.12.0 + g_param_spec_pool_insert@Base 2.12.0 + g_param_spec_pool_list@Base 2.12.0 + g_param_spec_pool_list_owned@Base 2.12.0 + g_param_spec_pool_lookup@Base 2.12.0 + g_param_spec_pool_new@Base 2.12.0 + g_param_spec_pool_remove@Base 2.12.0 + g_param_spec_ref@Base 2.12.0 + g_param_spec_ref_sink@Base 2.12.0 + g_param_spec_set_qdata@Base 2.12.0 + g_param_spec_set_qdata_full@Base 2.12.0 + g_param_spec_sink@Base 2.12.0 + g_param_spec_steal_qdata@Base 2.12.0 + g_param_spec_string@Base 2.12.0 + g_param_spec_types@Base 2.12.0 + g_param_spec_uchar@Base 2.12.0 + g_param_spec_uint64@Base 2.12.0 + g_param_spec_uint@Base 2.12.0 + g_param_spec_ulong@Base 2.12.0 + g_param_spec_unichar@Base 2.12.0 + g_param_spec_unref@Base 2.12.0 + g_param_spec_value_array@Base 2.12.0 + g_param_type_register_static@Base 2.12.0 + g_param_value_convert@Base 2.12.0 + g_param_value_defaults@Base 2.12.0 + g_param_value_set_default@Base 2.12.0 + g_param_value_validate@Base 2.12.0 + g_param_values_cmp@Base 2.12.0 + g_pointer_type_register_static@Base 2.12.0 + g_ptr_array_get_type@Base 2.22.0 + g_regex_get_type@Base 2.14.0 + g_signal_accumulator_true_handled@Base 2.12.0 + g_signal_add_emission_hook@Base 2.12.0 + g_signal_chain_from_overridden@Base 2.12.0 + g_signal_chain_from_overridden_handler@Base 2.18.0 + g_signal_connect_closure@Base 2.12.0 + g_signal_connect_closure_by_id@Base 2.12.0 + g_signal_connect_data@Base 2.12.0 + g_signal_connect_object@Base 2.12.0 + g_signal_emit@Base 2.12.0 + g_signal_emit_by_name@Base 2.12.0 + g_signal_emit_valist@Base 2.12.0 + g_signal_emitv@Base 2.12.0 + g_signal_get_invocation_hint@Base 2.12.0 + g_signal_handler_block@Base 2.12.0 + g_signal_handler_disconnect@Base 2.12.0 + g_signal_handler_find@Base 2.12.0 + g_signal_handler_is_connected@Base 2.12.0 + g_signal_handler_unblock@Base 2.12.0 + g_signal_handlers_block_matched@Base 2.12.0 + g_signal_handlers_destroy@Base 2.12.0 + g_signal_handlers_disconnect_matched@Base 2.12.0 + g_signal_handlers_unblock_matched@Base 2.12.0 + g_signal_has_handler_pending@Base 2.12.0 + g_signal_list_ids@Base 2.12.0 + g_signal_lookup@Base 2.12.0 + g_signal_name@Base 2.12.0 + g_signal_new@Base 2.12.0 + g_signal_new_class_handler@Base 2.18.0 + g_signal_new_valist@Base 2.12.0 + g_signal_newv@Base 2.12.0 + g_signal_override_class_closure@Base 2.12.0 + g_signal_override_class_handler@Base 2.18.0 + g_signal_parse_name@Base 2.12.0 + g_signal_query@Base 2.12.0 + g_signal_remove_emission_hook@Base 2.12.0 + g_signal_stop_emission@Base 2.12.0 + g_signal_stop_emission_by_name@Base 2.12.0 + g_signal_type_cclosure_new@Base 2.12.0 + g_source_set_closure@Base 2.12.0 + g_strdup_value_contents@Base 2.12.0 + g_strv_get_type@Base 2.12.0 + g_type_add_class_cache_func@Base 2.12.0 + g_type_add_interface_check@Base 2.12.0 + g_type_add_interface_dynamic@Base 2.12.0 + g_type_add_interface_static@Base 2.12.0 + g_type_check_class_cast@Base 2.12.0 + g_type_check_class_is_a@Base 2.12.0 + g_type_check_instance@Base 2.12.0 + g_type_check_instance_cast@Base 2.12.0 + g_type_check_instance_is_a@Base 2.12.0 + g_type_check_is_value_type@Base 2.12.0 + g_type_check_value@Base 2.12.0 + g_type_check_value_holds@Base 2.12.0 + g_type_children@Base 2.12.0 + g_type_class_add_private@Base 2.12.0 + g_type_class_peek@Base 2.12.0 + g_type_class_peek_parent@Base 2.12.0 + g_type_class_peek_static@Base 2.12.0 + g_type_class_ref@Base 2.12.0 + g_type_class_unref@Base 2.12.0 + g_type_class_unref_uncached@Base 2.12.0 + g_type_create_instance@Base 2.12.0 + g_type_default_interface_peek@Base 2.12.0 + g_type_default_interface_ref@Base 2.12.0 + g_type_default_interface_unref@Base 2.12.0 + g_type_depth@Base 2.12.0 + g_type_free_instance@Base 2.12.0 + g_type_from_name@Base 2.12.0 + g_type_fundamental@Base 2.12.0 + g_type_fundamental_next@Base 2.12.0 + g_type_get_plugin@Base 2.12.0 + g_type_get_qdata@Base 2.12.0 + g_type_init@Base 2.12.0 + g_type_init_with_debug_flags@Base 2.12.0 + g_type_instance_get_private@Base 2.12.0 + g_type_interface_add_prerequisite@Base 2.12.0 + g_type_interface_get_plugin@Base 2.12.0 + g_type_interface_peek@Base 2.12.0 + g_type_interface_peek_parent@Base 2.12.0 + g_type_interface_prerequisites@Base 2.12.0 + g_type_interfaces@Base 2.12.0 + g_type_is_a@Base 2.12.0 + g_type_module_add_interface@Base 2.12.0 + g_type_module_get_type@Base 2.12.0 + g_type_module_register_enum@Base 2.12.0 + g_type_module_register_flags@Base 2.12.0 + g_type_module_register_type@Base 2.12.0 + g_type_module_set_name@Base 2.12.0 + g_type_module_unuse@Base 2.12.0 + g_type_module_use@Base 2.12.0 + g_type_name@Base 2.12.0 + g_type_name_from_class@Base 2.12.0 + g_type_name_from_instance@Base 2.12.0 + g_type_next_base@Base 2.12.0 + g_type_parent@Base 2.12.0 + g_type_plugin_complete_interface_info@Base 2.12.0 + g_type_plugin_complete_type_info@Base 2.12.0 + g_type_plugin_get_type@Base 2.12.0 + g_type_plugin_unuse@Base 2.12.0 + g_type_plugin_use@Base 2.12.0 + g_type_qname@Base 2.12.0 + g_type_query@Base 2.12.0 + g_type_register_dynamic@Base 2.12.0 + g_type_register_fundamental@Base 2.12.0 + g_type_register_static@Base 2.12.0 + g_type_register_static_simple@Base 2.12.0 + g_type_remove_class_cache_func@Base 2.12.0 + g_type_remove_interface_check@Base 2.12.0 + g_type_set_qdata@Base 2.12.0 + g_type_test_flags@Base 2.12.0 + g_type_value_table_peek@Base 2.12.0 + g_value_array_append@Base 2.12.0 + g_value_array_copy@Base 2.12.0 + g_value_array_free@Base 2.12.0 + g_value_array_get_nth@Base 2.12.0 + g_value_array_get_type@Base 2.12.0 + g_value_array_insert@Base 2.12.0 + g_value_array_new@Base 2.12.0 + g_value_array_prepend@Base 2.12.0 + g_value_array_remove@Base 2.12.0 + g_value_array_sort@Base 2.12.0 + g_value_array_sort_with_data@Base 2.12.0 + g_value_copy@Base 2.12.0 + g_value_dup_boxed@Base 2.12.0 + g_value_dup_object@Base 2.12.0 + g_value_dup_param@Base 2.12.0 + g_value_dup_string@Base 2.12.0 + g_value_fits_pointer@Base 2.12.0 + g_value_get_boolean@Base 2.12.0 + g_value_get_boxed@Base 2.12.0 + g_value_get_char@Base 2.12.0 + g_value_get_double@Base 2.12.0 + g_value_get_enum@Base 2.12.0 + g_value_get_flags@Base 2.12.0 + g_value_get_float@Base 2.12.0 + g_value_get_gtype@Base 2.12.0 + g_value_get_int64@Base 2.12.0 + g_value_get_int@Base 2.12.0 + g_value_get_long@Base 2.12.0 + g_value_get_object@Base 2.12.0 + g_value_get_param@Base 2.12.0 + g_value_get_pointer@Base 2.12.0 + g_value_get_string@Base 2.12.0 + g_value_get_type@Base 2.12.0 + g_value_get_uchar@Base 2.12.0 + g_value_get_uint64@Base 2.12.0 + g_value_get_uint@Base 2.12.0 + g_value_get_ulong@Base 2.12.0 + g_value_init@Base 2.12.0 + g_value_peek_pointer@Base 2.12.0 + g_value_register_transform_func@Base 2.12.0 + g_value_reset@Base 2.12.0 + g_value_set_boolean@Base 2.12.0 + g_value_set_boxed@Base 2.12.0 + g_value_set_boxed_take_ownership@Base 2.12.0 + g_value_set_char@Base 2.12.0 + g_value_set_double@Base 2.12.0 + g_value_set_enum@Base 2.12.0 + g_value_set_flags@Base 2.12.0 + g_value_set_float@Base 2.12.0 + g_value_set_gtype@Base 2.12.0 + g_value_set_instance@Base 2.12.0 + g_value_set_int64@Base 2.12.0 + g_value_set_int@Base 2.12.0 + g_value_set_long@Base 2.12.0 + g_value_set_object@Base 2.12.0 + g_value_set_object_take_ownership@Base 2.12.0 + g_value_set_param@Base 2.12.0 + g_value_set_param_take_ownership@Base 2.12.0 + g_value_set_pointer@Base 2.12.0 + g_value_set_static_boxed@Base 2.12.0 + g_value_set_static_string@Base 2.12.0 + g_value_set_string@Base 2.12.0 + g_value_set_string_take_ownership@Base 2.12.0 + g_value_set_uchar@Base 2.12.0 + g_value_set_uint64@Base 2.12.0 + g_value_set_uint@Base 2.12.0 + g_value_set_ulong@Base 2.12.0 + g_value_take_boxed@Base 2.12.0 + g_value_take_object@Base 2.12.0 + g_value_take_param@Base 2.12.0 + g_value_take_string@Base 2.12.0 + g_value_transform@Base 2.12.0 + g_value_type_compatible@Base 2.12.0 + g_value_type_transformable@Base 2.12.0 + g_value_unset@Base 2.12.0 +libgthread-2.0.so.0 libglib2.0-0 #MINVER# +* Build-Depends-Package: libglib2.0-dev + g_thread_init@Base 2.12.0 + g_thread_init_with_errorcheck_mutexes@Base 2.12.0 diff --git a/debian/libglib2.0-data.install b/debian/libglib2.0-data.install new file mode 100644 index 0000000..362af39 --- /dev/null +++ b/debian/libglib2.0-data.install @@ -0,0 +1 @@ +debian/install/deb/usr/share/locale usr/share diff --git a/debian/libglib2.0-data.links b/debian/libglib2.0-data.links new file mode 100644 index 0000000..908ece5 --- /dev/null +++ b/debian/libglib2.0-data.links @@ -0,0 +1 @@ +usr/share/doc/libglib2.0-0 usr/share/doc/libglib2.0-data diff --git a/debian/libglib2.0-dbg.install b/debian/libglib2.0-dbg.install new file mode 100644 index 0000000..75989d4 --- /dev/null +++ b/debian/libglib2.0-dbg.install @@ -0,0 +1 @@ +debian/install/deb/usr/lib/debug/lib*.so* usr/lib/debug diff --git a/debian/libglib2.0-dev.README.Debian b/debian/libglib2.0-dev.README.Debian new file mode 100644 index 0000000..b36c218 --- /dev/null +++ b/debian/libglib2.0-dev.README.Debian @@ -0,0 +1,15 @@ +GLib2.0 for Debian +------------------- + +Static libraries issue: +Right now glib2.0 provides some static libraries. If your application +uses g_module* functions or other libraries uses g_module* functions and +your application link it, Please don't statically link this libraries. +You may get some strange proglem between static-linked application and +dynamic-loaded modules, g_module* provides the feature for dynamically +loading some modules. +This is well-known bug, so please don't file a bug report. + + + -- Akira TAGOH , Thu, 11 Apr 2002 19:28:50 +0900 + diff --git a/debian/libglib2.0-dev.install b/debian/libglib2.0-dev.install new file mode 100644 index 0000000..d5b6639 --- /dev/null +++ b/debian/libglib2.0-dev.install @@ -0,0 +1,12 @@ +debian/install/deb/usr/include/* usr/include +debian/install/deb/usr/lib/lib*.{la,a} usr/lib +debian/install/deb/usr/lib/libg{object,module,thread,io}*.so usr/lib +debian/install/deb/usr/lib/glib-2.0 usr/lib +debian/install/deb/usr/lib/pkgconfig usr/lib +debian/install/deb/usr/share/aclocal usr/share +debian/install/deb/usr/share/glib-2.0/gettext usr/share/glib-2.0 +debian/install/deb/usr/share/man/man1/glib-genmarshal.1* usr/share/man/man1 +debian/install/deb/usr/share/man/man1/glib-mkenums.1* usr/share/man/man1 +debian/install/deb/usr/share/man/man1/gobject-query.1* usr/share/man/man1 +debian/install/deb/usr/share/man/man1/glib-gettextize.1* usr/share/man/man1 +debian/install/deb/usr/bin usr diff --git a/debian/libglib2.0-dev.links b/debian/libglib2.0-dev.links new file mode 100755 index 0000000..aa0e890 --- /dev/null +++ b/debian/libglib2.0-dev.links @@ -0,0 +1,2 @@ +usr/share/doc/libglib2.0-0 usr/share/doc/libglib2.0-dev +usr/lib/libglib-2.0.so.0 usr/lib/libglib-2.0.so diff --git a/debian/libglib2.0-doc.doc-base.gio b/debian/libglib2.0-doc.doc-base.gio new file mode 100644 index 0000000..72ffc95 --- /dev/null +++ b/debian/libglib2.0-doc.doc-base.gio @@ -0,0 +1,14 @@ +Document: gio +Title: GIO (GLib) Reference Manual +Author: Damon Chaplin et al. +Abstract: GIO is striving to provide a modern, easy-to-use VFS API that sits at + the right level in the library stack. The goal is to overcome the shortcomings + of GnomeVFS and provide an API that is so good that developers prefer it over + raw POSIX calls. Among other things that means using GObject. It also means + not cloning the POSIX API, but providing higher-level, document-centric + interfaces. +Section: Programming/C + +Format: HTML +Index: /usr/share/doc/libglib2.0-doc/gio/index.html +Files: /usr/share/doc/libglib2.0-doc/gio/*.html diff --git a/debian/libglib2.0-doc.doc-base.glib b/debian/libglib2.0-doc.doc-base.glib new file mode 100644 index 0000000..d611198 --- /dev/null +++ b/debian/libglib2.0-doc.doc-base.glib @@ -0,0 +1,12 @@ +Document: glib +Title: GLib Reference Manual +Author: Damon Chaplin et al. +Abstract: The GLib C library is used in GTK+ and GNOME + programs as a general-purpose set of functions for hash, tree, list, + and string operations, which C is oddly lacking whatsoever in any + of its standard libraries. +Section: Programming/C + +Format: HTML +Index: /usr/share/doc/libglib2.0-doc/glib/index.html +Files: /usr/share/doc/libglib2.0-doc/glib/*.html diff --git a/debian/libglib2.0-doc.doc-base.gobject b/debian/libglib2.0-doc.doc-base.gobject new file mode 100644 index 0000000..adcc6f0 --- /dev/null +++ b/debian/libglib2.0-doc.doc-base.gobject @@ -0,0 +1,15 @@ +Document: gobject +Title: GObject (GLib) Reference Manual +Author: Damon Chaplin et al. +Abstract: Most modern programming languages come with their own native object + systems and additional fundamental algorithmic language constructs. + Just as GLib serves as an implementation of such fundamental + types and algorithms (linked lists, hash tables and so forth), the + GLib Object System provides the required implementations of a + flexible extensible and intentionally easy to map (into other + languages) object oriented framework for C. +Section: Programming/C + +Format: HTML +Index: /usr/share/doc/libglib2.0-doc/gobject/index.html +Files: /usr/share/doc/libglib2.0-doc/gobject/*.html diff --git a/debian/libglib2.0-doc.install b/debian/libglib2.0-doc.install new file mode 100644 index 0000000..19e5907 --- /dev/null +++ b/debian/libglib2.0-doc.install @@ -0,0 +1 @@ +debian/install/deb/usr/share/doc/libglib2.0-doc usr/share/doc diff --git a/debian/libglib2.0-doc.links b/debian/libglib2.0-doc.links new file mode 100644 index 0000000..b4b66f0 --- /dev/null +++ b/debian/libglib2.0-doc.links @@ -0,0 +1,4 @@ +usr/share/doc/libgtk2.0-doc/gtk usr/share/doc/libglib2.0-doc/gtk +usr/share/doc/libglib2.0-doc/gio usr/share/gtk-doc/html/gio +usr/share/doc/libglib2.0-doc/glib usr/share/gtk-doc/html/glib +usr/share/doc/libglib2.0-doc/gobject usr/share/gtk-doc/html/gobject diff --git a/debian/libglib2.0-udeb.install b/debian/libglib2.0-udeb.install new file mode 100644 index 0000000..e10e3e7 --- /dev/null +++ b/debian/libglib2.0-udeb.install @@ -0,0 +1,2 @@ +debian/install/udeb/usr/lib/lib*.so.* usr/lib +debian/install/udeb/usr/share/locale usr/share diff --git a/debian/lintian-overrides/libglib2.0-0-refdbg b/debian/lintian-overrides/libglib2.0-0-refdbg new file mode 100644 index 0000000..622f0a2 --- /dev/null +++ b/debian/lintian-overrides/libglib2.0-0-refdbg @@ -0,0 +1 @@ +libglib2.0-0-refdbg binary: unstripped-binary-or-object diff --git a/debian/patches/01_gettext-desktopfiles.patch b/debian/patches/01_gettext-desktopfiles.patch new file mode 100644 index 0000000..76b4ee4 --- /dev/null +++ b/debian/patches/01_gettext-desktopfiles.patch @@ -0,0 +1,145 @@ +# Description: If a .desktop file does not have inline translations, fall back to calling gettext. +# Ubuntu: https://launchpad.net/bugs/3935 +# Upstream: http://bugzilla.gnome.org/show_bug.cgi?id=569829 +Index: glib2.0-2.19.5/glib/gkeyfile.c +=================================================================== +--- glib2.0-2.19.5.orig/glib/gkeyfile.c 2009-01-30 15:34:03.000000000 +0100 ++++ glib2.0-2.19.5/glib/gkeyfile.c 2009-01-30 15:34:32.000000000 +0100 +@@ -83,6 +83,7 @@ + GKeyFileFlags flags; + + gchar **locales; ++ gchar *gettext_domain; + }; + + typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair; +@@ -209,6 +210,7 @@ + key_file->list_separator = ';'; + key_file->flags = 0; + key_file->locales = g_strdupv ((gchar **)g_get_language_names ()); ++ key_file->gettext_domain = NULL; + } + + static void +@@ -228,6 +230,12 @@ + key_file->parse_buffer = NULL; + } + ++ if (key_file->gettext_domain) ++ { ++ g_free (key_file->gettext_domain); ++ key_file->gettext_domain = NULL; ++ } ++ + tmp = key_file->groups; + while (tmp != NULL) + { +@@ -448,6 +456,11 @@ + return FALSE; + } + ++ key_file->gettext_domain = g_key_file_get_string (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, ++ NULL); ++ + return TRUE; + } + +@@ -554,6 +567,11 @@ + return FALSE; + } + ++ key_file->gettext_domain = g_key_file_get_string (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, ++ NULL); ++ + return TRUE; + } + +@@ -1662,6 +1680,8 @@ + GError *key_file_error; + gchar **languages; + gboolean free_languages = FALSE; ++ gboolean try_gettext = FALSE; ++ const gchar *msg_locale; + gint i; + + g_return_val_if_fail (key_file != NULL, NULL); +@@ -1692,6 +1712,23 @@ + free_languages = FALSE; + } + ++ /* we're only interested in gettext translation if we don't have a ++ * translation in the .desktop file itself and if the key is one of the keys ++ * we know we want to translate: Name, GenericName, Comment. Blindly doing ++ * this for all keys can give strange result for the icons, since the Icon is ++ * a locale string in the spec, eg. We also only get translation in the mo ++ * file if the requested locale is the LC_MESSAGES one. Ideally, we should do ++ * more and change LC_MESSAGES to use the requested locale, but there's no ++ * guarantee it's installed on the system and it might have some ++ * side-effects. Since this is a corner case, let's ignore it. */ ++ ++ msg_locale = setlocale (LC_MESSAGES, NULL); ++ try_gettext = msg_locale && key_file->gettext_domain && ++ strcmp (group_name, G_KEY_FILE_DESKTOP_GROUP) == 0 && ++ (strcmp (key, G_KEY_FILE_DESKTOP_KEY_NAME) == 0 || ++ strcmp (key, G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME) == 0 || ++ strcmp (key, G_KEY_FILE_DESKTOP_KEY_COMMENT) == 0); ++ + for (i = 0; languages[i]; i++) + { + candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]); +@@ -1708,6 +1745,39 @@ + translated_value = NULL; + } + ++ /* Fallback to gettext */ ++ if (try_gettext && !translated_value) ++ { ++ gchar *orig_value = g_key_file_get_string (key_file, group_name, key, NULL); ++ ++ if (orig_value) ++ { ++ gboolean codeset_set; ++ const gchar *translated; ++ gboolean has_gettext; ++ ++ codeset_set = bind_textdomain_codeset (key_file->gettext_domain, "UTF-8") != NULL; ++ translated = NULL; ++ ++ translated = g_dgettext (key_file->gettext_domain, ++ orig_value); ++ has_gettext = translated != orig_value; ++ ++ g_free (orig_value); ++ ++ if (has_gettext) ++ { ++ if (codeset_set) ++ translated_value = g_strdup (translated); ++ else ++ translated_value = g_locale_to_utf8 (translated, ++ -1, NULL, NULL, NULL); ++ } ++ else ++ translated_value = NULL; ++ } ++ } ++ + /* Fallback to untranslated key + */ + if (!translated_value) +Index: glib2.0-2.19.5/glib/gkeyfile.h +=================================================================== +--- glib2.0-2.19.5.orig/glib/gkeyfile.h 2009-01-30 15:34:03.000000000 +0100 ++++ glib2.0-2.19.5/glib/gkeyfile.h 2009-01-30 15:34:32.000000000 +0100 +@@ -240,6 +240,7 @@ + #define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY "StartupNotify" + #define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass" + #define G_KEY_FILE_DESKTOP_KEY_URL "URL" ++#define G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN "X-GNOME-Gettext-Domain" + + #define G_KEY_FILE_DESKTOP_TYPE_APPLICATION "Application" + #define G_KEY_FILE_DESKTOP_TYPE_LINK "Link" diff --git a/debian/patches/02_gettext-desktopfiles-ubuntu.patch b/debian/patches/02_gettext-desktopfiles-ubuntu.patch new file mode 100644 index 0000000..b493861 --- /dev/null +++ b/debian/patches/02_gettext-desktopfiles-ubuntu.patch @@ -0,0 +1,40 @@ +# Description: Provide backwards compatibility for 01_gettext-desktopfiles.patch for X-{Debian,Ubuntu}-Gettext-Domain +# UbuntuSpecific: 01_gettext-desktopfiles.patch was changed to use X-GNOME-, so this is necessary until all our .desktop files are converted +Index: glib2.0-2.19.5/glib/gkeyfile.c +=================================================================== +--- glib2.0-2.19.5.orig/glib/gkeyfile.c 2009-01-30 15:53:09.000000000 +0100 ++++ glib2.0-2.19.5/glib/gkeyfile.c 2009-01-30 15:55:46.000000000 +0100 +@@ -460,6 +460,16 @@ + G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, + NULL); ++ if (!key_file->gettext_domain) ++ key_file->gettext_domain = g_key_file_get_string (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ "X-Ubuntu-Gettext-Domain", ++ NULL); ++ if (!key_file->gettext_domain) ++ key_file->gettext_domain = g_key_file_get_string (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ "X-Debian-Gettext-Domain", ++ NULL); + + return TRUE; + } +@@ -571,6 +581,16 @@ + G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, + NULL); ++ if (!key_file->gettext_domain) ++ key_file->gettext_domain = g_key_file_get_string (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ "X-Ubuntu-Gettext-Domain", ++ NULL); ++ if (!key_file->gettext_domain) ++ key_file->gettext_domain = g_key_file_get_string (key_file, ++ G_KEY_FILE_DESKTOP_GROUP, ++ "X-Debian-Gettext-Domain", ++ NULL); + + return TRUE; + } diff --git a/debian/patches/03_blacklist-directories.patch b/debian/patches/03_blacklist-directories.patch new file mode 100644 index 0000000..fb386a7 --- /dev/null +++ b/debian/patches/03_blacklist-directories.patch @@ -0,0 +1,24 @@ +--- glib2.0-2.18.0.orig/gio/gunixmounts.c 2008-09-02 17:09:19.000000000 +0200 ++++ glib2.0-2.18.0/gio/gunixmounts.c 2008-09-03 00:53:29.000000000 +0200 +@@ -221,6 +221,8 @@ + "/home", + "/lib", + "/lib64", ++ "/live/cow", ++ "/live/image", + "/media", + "/mnt", + "/opt", +@@ -231,7 +233,12 @@ + "/usr", + "/usr/local", + "/var", ++ "/var/crash", ++ "/var/local", ++ "/var/log", + "/var/log/audit", /* https://bugzilla.redhat.com/show_bug.cgi?id=333041 */ ++ "/var/mail", ++ "/var/run", + "/var/tmp", /* https://bugzilla.redhat.com/show_bug.cgi?id=335241 */ + "/proc", + "/sbin", diff --git a/debian/patches/04_homedir_env.patch b/debian/patches/04_homedir_env.patch new file mode 100644 index 0000000..84768a9 --- /dev/null +++ b/debian/patches/04_homedir_env.patch @@ -0,0 +1,59 @@ +Index: glib-2.18.3/docs/reference/glib/running.sgml +=================================================================== +--- glib-2.18.3.orig/docs/reference/glib/running.sgml 2008-11-26 12:01:53.559365436 +0100 ++++ glib-2.18.3/docs/reference/glib/running.sgml 2008-11-26 12:25:58.155366255 +0100 +@@ -194,6 +194,22 @@ variables like LANG, + + ++ ++ <envar>G_HOME</envar> ++ ++ ++ For various reasons, GLib applications ignore the HOME ++ environment variable on Unix systems and will use the user directory ++ as specified by the passwd entry, which is more ++ reliable. ++ ++ ++ The G_HOME environment variable will override any ++ other setting for the home directory. It is not meant for daily usage, ++ but it is useful in testing or building environments. ++ ++ ++ + + + +Index: glib-2.18.3/glib/gutils.c +=================================================================== +--- glib-2.18.3.orig/glib/gutils.c 2008-11-26 11:50:38.607861683 +0100 ++++ glib-2.18.3/glib/gutils.c 2008-11-26 12:00:29.035360081 +0100 +@@ -1520,11 +1520,14 @@ g_get_any_init_do (void) + } + #endif /* !G_OS_WIN32 */ + ++ g_home_dir = g_strdup (g_getenv ("G_HOME")); ++ + #ifdef G_OS_WIN32 + /* We check $HOME first for Win32, though it is a last resort for Unix + * where we prefer the results of getpwuid(). + */ +- g_home_dir = g_strdup (g_getenv ("HOME")); ++ if (!g_home_dir) ++ g_home_dir = g_strdup (g_getenv ("HOME")); + + /* Only believe HOME if it is an absolute path and exists */ + if (g_home_dir) +@@ -1820,6 +1823,11 @@ g_get_real_name (void) + * homedir = g_get_home_dir (); + * ]| + * ++ * However, to allow changing this value for testing and development ++ * purposes, the value of the G_HOME environment ++ * variable, if set, will override the passwd ++ * entry. ++ * + * Returns: the current user's home directory + */ + G_CONST_RETURN gchar* diff --git a/debian/patches/60_wait-longer-for-threads-to-die.patch b/debian/patches/60_wait-longer-for-threads-to-die.patch new file mode 100644 index 0000000..02fe9ff --- /dev/null +++ b/debian/patches/60_wait-longer-for-threads-to-die.patch @@ -0,0 +1,26 @@ +--- glib/tests/threadpool-test.c.old 2008-02-12 06:11:21.000000000 +0100 ++++ glib/tests/threadpool-test.c 2008-02-12 06:11:52.000000000 +0100 +@@ -5,8 +5,8 @@ + + #include + +-#define DEBUG_MSG(x) +-/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ ++/* #define DEBUG_MSG(x) */ ++#define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); + + #define WAIT 5 /* seconds */ + #define MAX_THREADS 10 +@@ -124,10 +124,10 @@ + DEBUG_MSG (("[unused] stopping unused threads")); + g_thread_pool_stop_unused_threads (); + +- DEBUG_MSG (("[unused] waiting ONE second for threads to die")); ++ DEBUG_MSG (("[unused] waiting FIVE second for threads to die")); + + /* Some time for threads to die. */ +- g_usleep (G_USEC_PER_SEC); ++ g_usleep (5 * G_USEC_PER_SEC); + + DEBUG_MSG (("[unused] stopped idle threads, %d remain, %d threads still exist", + g_thread_pool_get_num_unused_threads (), diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..d144e2e --- /dev/null +++ b/debian/patches/series @@ -0,0 +1,5 @@ +01_gettext-desktopfiles.patch +02_gettext-desktopfiles-ubuntu.patch +03_blacklist-directories.patch +04_homedir_env.patch +60_wait-longer-for-threads-to-die.patch diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..0523017 --- /dev/null +++ b/debian/rules @@ -0,0 +1,253 @@ +#!/usr/bin/make -f + +#DISABLE_UPDATE_UPLOADERS := 1 +#include /usr/share/gnome-pkg-tools/1/rules/uploaders.mk +#-include /usr/share/gnome-pkg-tools/1/rules/gnome-get-source.mk + +GNOME_MODULE := glib + +STAMP_DIR := debian/stampdir + +PATCH_DIR := debian/patches + +# rules in this debian/rules Makefile can be built concurrently as well as +# upstream rules in Makefile; all $(MAKE) invocations will inherit this flag, +# if you recurse into debian/rules ($(MAKE) +# -f debian/rules in rules), you need to pass a flag to avoid adding "-jX" when +# the childs encounters this line +DEB_BUILD_OPTIONS_PARALLEL ?= $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +MAKEFLAGS += $(if $(DEB_BUILD_OPTIONS_PARALLEL),-j$(DEB_BUILD_OPTIONS_PARALLEL)) + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE = $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +#DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +# Debian architectures +DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) +DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH) + + +CFLAGS += -Wall -g -O$(if $(findstring noopt,$(DEB_BUILD_OPTIONS)),0,2) + +# Ensure the build aborts when there are still references to undefined +# symbols +LDFLAGS += -Wl,-z,defs + +# NB: do NOT use -Wl,--as-needed to build glib; for instance the link to +# pthread is carefully crafted to allow dlopen()ing pthread-using libs; see +# http://mid.gmane.org/1257999019.21780.15.camel@marzipan + +# Make the linker work a bit harder so dynamic loading can be done faster +LDFLAGS += -Wl,-O1 + +APIVER := 2.0 +SONAME := 0 +SHVER := 2.24.0 + +# package names +SHARED_PKG := libglib$(APIVER)-$(SONAME) +DATA_PKG := libglib$(APIVER)-data +DEV_PKG := libglib$(APIVER)-dev +UDEB_PKG := libglib$(APIVER)-udeb +DOC_PKG := libglib$(APIVER)-doc +DEBUG_PKG := $(SHARED_PKG)-dbg +REFDBG_PKG := libglib$(APIVER)-$(SONAME)-refdbg + +# list of flavors we build; each gets a builddir, a configure pass (configure +# args are defined below), a build pass, and an install pass (in two steps) +# Note: the "deb" flavor is required +FLAVORS := deb udeb refdbg + +# list of flavors to run the test suite on +CHECK_FLAVORS := $(filter deb, $(FLAVORS)) + +# list of arches on which testsuite failures are fatal +# XXX testsuite failures currently disabled as testsuite fails everywhere when +# $HOME isn't writable +CHECK_SUPPORTED_ARCHES := +# CHECK_SUPPORTED_ARCHES := alpha amd64 i386 ia64 lpia m68k s390 +# testsuite is known to fail on hppa, hurd, kfreebsd-amd64, kfreebsd-i386; see +# Debian #428674 +# testsuite is known to fail on arm, mips, mipsel, powerpc, sparc; see GNOME #481573 + +# build dir for the current flavor; this is only expanded in flavor specific +# targets +# Note: dh_clean will rm -rf debian/tmp, hence all builds +builddir = $(buildbasedir)/$* +buildbasedir = $(CURDIR)/debian/build + +# install dir for the current flavor; this is only expanded in flavor specific +# targets +installdir = $(installbasedir)/$* +installbasedir = $(CURDIR)/debian/install + +# configure flags +common_configure_flags := \ + --prefix=/usr \ + --mandir=\$${prefix}/share/man \ + --infodir=\$${prefix}/share/info \ + --with-html-dir=\$${prefix}/share/doc/$(DOC_PKG) +ifeq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE)) + common_configure_flags += --build=$(DEB_BUILD_GNU_TYPE) +else + common_configure_flags += --build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) +endif +deb_configure_flags := $(common_configure_flags) \ + --enable-static +udeb_configure_flags := $(common_configure_flags) \ + --disable-selinux +refdbg_configure_flags := $(common_configure_flags) \ + --disable-visibility \ + --enable-debug=yes + +$(STAMP_DIR)/patch-stamp: + dh_testdir + # backup the original files to restore them in the clean target + -test -r config.sub && cp config.sub config.sub.orig + -test -r config.guess && cp config.guess config.guess.orig + # apply patches + QUILT_PATCHES=$(PATCH_DIR) \ + quilt --quiltrc /dev/null push -a || test $$? = 2 + -test -r /usr/share/misc/config.sub && \ + cp -f /usr/share/misc/config.sub config.sub + -test -r /usr/share/misc/config.guess && \ + cp -f /usr/share/misc/config.guess config.guess + -mkdir -p $(STAMP_DIR) + touch $@ + +patch: $(STAMP_DIR)/patch-stamp + +$(STAMP_DIR)/configure-stamp-%: $(STAMP_DIR)/patch-stamp + dh_testdir + mkdir -p $(builddir) + cd $(builddir) && \ + CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \ + $(CURDIR)/configure $($*_configure_flags) + touch $@ + mv /usr/lib/libdl.so /usr/lib/libdl.so.tmp + ln -sf /lib/libdl.so.2 /usr/lib/libdl.so + +configure: $(addprefix $(STAMP_DIR)/configure-stamp-, $(FLAVORS)) + +$(STAMP_DIR)/build-stamp-%: $(STAMP_DIR)/configure-stamp-% + dh_testdir + LD_LIBRARY_PATH=$(builddir)/glib/.libs:$(builddir)/gmodule/.libs:$(builddir)/gobject/.libs:$(builddir)/gthread/.libs:$(LD_LIBRARY_PATH) \ + $(MAKE) -C $(builddir) + touch $@ + +build: $(addprefix $(STAMP_DIR)/build-stamp-, $(FLAVORS)) + +maybe_ignore_check_failure = $(if $(filter ,$(CHECK_SUPPORTED_ARCHES)),-) + +$(STAMP_DIR)/check-stamp-%: $(STAMP_DIR)/build-stamp-% + dh_testdir +ifeq ($(filter $(DEB_BUILD_ARCH),$(CHECK_SUPPORTED_ARCHES)),$(DEB_BUILD_ARCH)) + # testsuite failures are fatal + LD_LIBRARY_PATH=$(builddir)/glib/.libs:$(builddir)/gmodule/.libs:$(builddir)/gobject/.libs:$(builddir)/gthread/.libs:$(LD_LIBRARY_PATH) \ + $(MAKE) -k -C $(builddir) check +else + # testsuite failures are ignored + -LD_LIBRARY_PATH=$(builddir)/glib/.libs:$(builddir)/gmodule/.libs:$(builddir)/gobject/.libs:$(builddir)/gthread/.libs:$(LD_LIBRARY_PATH) \ + $(MAKE) -k -C $(builddir) check +endif + touch $@ + +check: $(addprefix $(STAMP_DIR)/check-stamp-, $(CHECK_FLAVORS)) + +$(STAMP_DIR)/install-stamp-%: $(STAMP_DIR)/build-stamp-% + mkdir -p $(installdir) + $(MAKE) -C $(builddir) install DESTDIR=$(installdir) + touch $@ + +install: $(addprefix $(STAMP_DIR)/install-stamp-, $(FLAVORS)) + +debian/control: + dh_testdir + sed \ + -e "s#@SONAME@#$(SONAME)#g" \ + -e "s#@APIVER@#$(APIVER)#g" \ + -e "s#@VERSION@#$(VERSION)#g" \ + -e "s#@SHARED_PKG@#$(SHARED_PKG)#g" \ + -e "s#@DATA_PKG@#$(DATA_PKG)#g" \ + -e "s#@DEV_PKG@#$(DEV_PKG)#g" \ + -e "s#@UDEB_PKG@#$(UDEB_PKG)#g" \ + -e "s#@DOC_PKG@#$(DOC_PKG)#g" \ + -e "s#@DEBUG_PKG@#$(DEBUG_PKG)#g" \ + -e "s#@GNOME_TEAM@#$(UPLOADERS)#g" \ + -e "s#@REFDBG_PKG@#$(REFDBG_PKG)#g" \ + $@.in >$@ + +clean: debian/control + dh_testdir + dh_testroot + # remove install and build dirs + rm -rf $(installbasedir) + rm -rf $(buildbasedir) + # restore files from backup (before unpatching) + -test -r config.sub.orig && mv -f config.sub.orig config.sub + -test -r config.guess.orig && mv -f config.guess.orig config.guess + # unapply patches, if any + QUILT_PATCHES=$(PATCH_DIR) \ + quilt --quiltrc /dev/null pop -a -R || test $$? = 2 + -rm -rf .pc + -rm -rf $(STAMP_DIR) + dh_clean + +ifeq ($(DEB_BUILD_ARCH),$(DEB_HOST_ARCH)) +maybe_check = $(if $(findstring nocheck,$(DEB_BUILD_OPTIONS)),,check) +else +# can't run the testsuite when cross-compiling +maybe_check = +endif + +maybe_check = + +binary-indep: build $(maybe_check) install + dh_testdir + dh_testroot + dh_install -i + dh_installchangelogs -i -N$(DATA_PKG) ChangeLog + dh_installdocs -N$(DATA_PKG) -i NEWS README + dh_link -i + dh_compress -i -X.sgml -X.devhelp + dh_fixperms -i + dh_installdeb -i + dh_gencontrol -i + dh_md5sums -i + dh_builddeb -i + +binary-arch: build $(maybe_check) install + dh_testdir + dh_testroot + dh_install -s + # empty the dependency_libs in the *.la files + sed -i -e "/dependency_libs/ s/'.*'/''/" debian/$(DEV_PKG)/usr/lib/*.la + dh_installchangelogs -s -N$(DEV_PKG) -N$(DEBUG_PKG) \ + ChangeLog + dh_installdocs -s -N$(DEV_PKG) -N$(DEBUG_PKG) NEWS README + dh_link -s + dh_strip -s --dbg-package=$(DEBUG_PKG) -N$(UDEB_PKG) -N$(REFDBG_PKG) + dh_strip -p$(UDEB_PKG) + dh_compress -s -X.sgml -X.devhelp + dh_fixperms -s + dh_makeshlibs -p$(SHARED_PKG) \ + -V "$(SHARED_PKG) (>= $(SHVER))" \ + --add-udeb="$(UDEB_PKG)" -- -c4 + dh_installdeb -s + # override shlibs for libraries from this source before computing + # dependencies of packages generated from this source; we already have + # inter-dependencies expressed manually in the control file, we do not + # need the shlibs to add duplicates + sed -nr -e 's/(([^ ]+: )?([^ ]+) ([^ ]+)) .*/\1/p' \ + debian/*/DEBIAN/shlibs \ + >debian/shlibs.local + dh_shlibdeps -s -ldebian/$(SHARED_PKG)/usr/lib + -rm -f debian/shlibs.local + dh_gencontrol -s + dh_md5sums -s + dh_builddeb -s + +binary: binary-indep binary-arch +.PHONY: patch configure build check install clean binary-indep binary-arch binary debian/control diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..7900f46 --- /dev/null +++ b/debian/watch @@ -0,0 +1,4 @@ +version=2 +http://download.gnome.org/sources/glib/([\d\.]+)[02468]/ \ + glib-(.*)\.tar\.gz \ + debian uupdate diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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 outputing 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 + +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. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. 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" + ;; + +#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" + cat < "$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..2349f44 --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,11 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +SUBDIRS = reference + +EXTRA_DIST += debugging.txt macros.txt + +files: + @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ + echo $$p; \ + done diff --git a/docs/Makefile.in b/docs/Makefile.in new file mode 100644 index 0000000..8570187 --- /dev/null +++ b/docs/Makefile.in @@ -0,0 +1,729 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = docs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = debugging.txt macros.txt +TEST_PROGS = +SUBDIRS = reference +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu docs/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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) check-am \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am check-local 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 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +files: + @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ + echo $$p; \ + 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/debugging.txt b/docs/debugging.txt new file mode 100644 index 0000000..8ab2028 --- /dev/null +++ b/docs/debugging.txt @@ -0,0 +1,41 @@ + +Traps (G_BREAKPOINT) and traces for the debuging +================================================ + +Some code portions contain trap variables that can be set during +debugging time if G_ENABLE_DEBUG has been defined upon compilation +(use the --enable-debug=yes option to configure for this, macros.txt +covers more details). +Such traps lead to immediate code halts to examine the current +program state and backtrace. +Currently, the following trap variables exist: + +static volatile gulong g_trap_free_size; +static volatile gulong g_trap_realloc_size; +static volatile gulong g_trap_malloc_size; + If set to a size > 0, g_free(), g_realloc() and g_malloc() + respectively, will be intercepted if the size matches the + size of the corresponding memory block to free/reallocate/allocate. + This will only work with g_mem_set_vtable (glib_mem_profiler_table) + upon startup though, because memory profiling is required to match + on the memory block sizes. +static volatile GObject *g_trap_object_ref; + If set to a valid object pointer, ref/unref will be intercepted + with G_BREAKPOINT (); +static volatile gpointer *g_trap_instance_signals; +static volatile gpointer *g_trace_instance_signals; + If set to a valid instance pointer, debugging messages + will be spewed about emissions of signals on this instance. + For g_trap_instance_signals matches, the emissions will + also be intercepted with G_BREAKPOINT (); + +Environment variables for debugging +=================================== +When G_ENABLE_DEBUG was defined upon compilation, the GObject library +supports an environment variable GOBJECT_DEBUG that can be set to a +combination of the flags passed in to g_type_init() (currently +"objects" and "signals") to trigger debugging messages about +object bookkeeping and signal emissions during runtime. + + +2000/02/04 Tim Janik diff --git a/docs/macros.txt b/docs/macros.txt new file mode 100644 index 0000000..8b42029 --- /dev/null +++ b/docs/macros.txt @@ -0,0 +1,81 @@ + + +GLib's configure options and corresponding macros +================================================= + +--enable-debug=no + -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS +--enable-debug=minimum [default for stable branches] + none +--enable-debug=yes [default for development branches] + -DG_ENABLE_DEBUG -g +--enable-gc-friendly=yes + #define ENABLE_GC_FRIENDLY_DEFAULT 1 +--disable-mem-pools=yes + #define DISABLE_MEM_POOLS 1 + +Besides these, there are some local feature specific options, but my main +focus here is to concentrate on macros that affect overall GLib behaviour +and/or third party code. + + +Notes on GLib's internal and global macros +========================================== + + +ENABLE_GC_FRIENDLY_DEFAULT + Newly allocated memory that isn't directly initialized, as well + as memory being freed should be reset to 0. The point here is to + allow memory checkers and similar programs that use bohem GC alike + algorithms to produce more accurate results. + This can also be accomplished by setting the environment variable + G_DEBUG=gc-friendly. +DISABLE_MEM_POOLS + Many small chunks of memory are often allocated via collective pools + in GLib and are cached after release to speed up reallocations. + For sparse memory systems this behaviour is often inferior, so + memory pools can be disabled to avoid excessive caching and force + atomic maintenance of chunks through the g_malloc/g_free. + Code currently affected by this macro: + - GList, GSList, GNode allocations + - GMemChunks become basically non-effective + - GSignal disables all caching (potentially very slow) + - GType doesn't honour the GTypeInfo n_preallocs field anymore + - the GBSearchArray flag G_BSEARCH_ALIGN_POWER2 becomes non-functional +G_DISABLE_ASSERT + The g_assert() and g_assert_not_reached() become non-functional + with this define. The motivation is to speed up end-user apps by + avoiding expensive checks. + This macro can affect third-party code. --enable-debug=no will only + disable the assertion macros for GLib itself, but third-party code + that passes -DG_DISABLE_ASSERT to the compiler upon its own build + will end up with the non-functional variants after including glib.h + as well. + NOTE: Code inside the assertion macros should not have side effects + that affect the operation of the program. +G_DISABLE_CHECKS + This macro is similar to G_DISABLE_ASSERT, it affects third-party + code as mentioned above and the NOTE about G_DISABLE_ASSERT applies + too. The macros that become non-functional here are + g_return_if_fail(), g_return_val_if_fail(), g_return_if_reached() and + g_return_val_if_reached(). + Additionally the glib_mem_profiler_table and g_mem_profile() from + gmem.h become non-functional if this macro is supplied. + This macro also switches off certain checks in the GSignal code. +G_ENABLE_DEBUG + Quite a bit of additional debugging code is compiled into GLib for this + macro, and since it is a globally visible define, third-party code may + be affected by it similar to G_DISABLE_ASSERT. + The additional code executed/compiled for this macro currently involve: + - extra validity checks for GDate + - memory profiling traps in gmem.c (consult debugging.txt for details) + - BREAKPOINT abortion for fatal log levels in gmessage.c instead of + plain abort() to allow debuggers trapping and overriding them + - added verbosity of gscanner.c to catch deprecated code paths + - added verbosity of gutils.c to catch deprecated code paths + - object ref/unref traps (consult debugging.txt) and object bookkeeping + in gobject.c + - extra validity checks in gsignal.c + + +2000/12/28 Tim Janik diff --git a/docs/reference/AUTHORS b/docs/reference/AUTHORS new file mode 100644 index 0000000..64f46b7 --- /dev/null +++ b/docs/reference/AUTHORS @@ -0,0 +1,7 @@ +Damon Chaplin and others. + +See: + + http://www.gtk.org/rdp/status.html + +for a complete list. diff --git a/docs/reference/COPYING b/docs/reference/COPYING new file mode 100644 index 0000000..df952d3 --- /dev/null +++ b/docs/reference/COPYING @@ -0,0 +1,30 @@ +This work may be reproduced and distributed in whole or in part, in +any medium, physical or electronic, so as long as this copyright +notice remains intact and unchanged on all copies. Commercial +redistribution is permitted and encouraged, but you may not +redistribute, in whole or in part, under terms more restrictive than +those under which you received it. If you redistribute a modified or +translated version of this work, you must also make the source code to +the modified or translated version available in electronic form +without charge. However, mere aggregation as part of a larger work +shall not count as a modification for this purpose. + +All code examples in this work are placed into the public domain, +and may be used, modified and redistributed without restriction. + +BECAUSE THIS WORK IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE WORK, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE WORK "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. SHOULD THE WORK PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY REPAIR OR CORRECTION. + +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 WORK 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 +WORK, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog new file mode 100644 index 0000000..9295bc8 --- /dev/null +++ b/docs/reference/ChangeLog @@ -0,0 +1,4152 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-03-01 Matthias Clasen + + Bug 573128 – A couple of typos in GObject documentation + + * gobject/tut_gobject.xml: Fix some typos. Reported by Dimitri Vorbiev + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-06 Stefan Kost + + * gio/gio-docs.xml: + * glib/glib-docs.sgml: + * gobject/gobject-docs.sgml: + Add online urls for library.gnome.org. This allows other docs to do + gtkdoc-rebase --online --html-dir=html + before publishing docs and have working xrefs. + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-13 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/base64.sgml: Mention g_base64_decode_inplace + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + +2009-01-02 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Move most function docs inline. + +2009-01-01 Matthias Clasen + + Bug 565831 – error in interface creation sample + + * gobject/tut_howto.xml: Fix an example. Pointed out by + Jens Georg. + +2008-12-15 Matthias Clasen + + * === Released 2.19.3 === + +2008-12-08 Matthias Clasen + + * gio/gio-sections.txt: Add new functions + +2008-12-07 Behdad Esfahbod + + Bug 563156 – Document printing and scanning gunichar values + + * glib/tmpl/unicode.sgml: Document printing and scanning gunichar + values. + +2008-12-07 Behdad Esfahbod + + Bug 563150 – G_GU?INT*_MODIFIER/FORMAT docs + + * glib/tmpl/glib-unused.sgml: + * glib/tmpl/macros_misc.sgml: + * glib/tmpl/types.sgml: + Update docs to mention scanning as well as printing. + Cross reference these from their respective types. + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + +2008-12-01 Alexander Larsson + + Reviewed by NOBODY (OOPS!). + + * gio/gio-sections.txt: + +2008-11-30 Matthias Clasen + + * glib/running.sgml: Mention all and help special options in + debug envvars. + +2008-11-30 Matthias Clasen + + Bug 562538 – GObject interface tutorial shouldn't finalise with + "Please forget everything" + + * gobject/tut_gtype.xml: Remove the questionable closing sentence + and all references to private functions. Pointed out by Christian + Dywan. + +2008-11-28 Matthias Clasen + + Bug 559452 – GObject Reference Manual (typo) + Bug 559462 – GObject Reference Manual (typo) + Bug 559517 – GObject Reference Manual (typo) + + * gobject/tut_howto.xml: + * gobject/tut_gsignal.xml: + * gobject/tut_gobject.xml: Fix typos, found by Andrew Feren. + +2008-11-28 Matthias Clasen + + * gio/gio-sections.txt: Add g_app_info_get_commandline + +2008-11-28 Matthias Clasen + + * glib/tmpl/keyfile.sgml: Explain locale identifiers in + more detail + +2008-11-28 Matthias Clasen + + Bug 562549 – g_byte_array_free should tell how free data + + * glib/tmpl/arrays_byte.sgml: Improve docs, proposed by + Guillaume Desmottes + +2008-11-21 Matthias Clasen + + * glib/Makefile.am: + * gobject/Makefile.am: + * gio/Makefile.am: Use a new gtk-doc feature to generate + much nicer indices. + +2008-11-14 Matthias Clasen + + * glib/glib-sections.txt: Add G_STATIC_ASSERT and friends + +2008-11-14 Matthias Clasen + + * gio/gio-sections.txt: Add G_FILE_ATTRIBUTE_PREVIEW_ICON + +2008-11-10 Behdad Esfahbod + + Bug 559448 – GObject Reference Manual (typo) + + * gobject/tut_gobject.xml: Fix typo. + +2008-11-03 Matthias Clasen + + Bug 552776 – ac_cv_func_posix_getgrgid_r not mentioned + + * glib/cross.sgml: Mention ac_cv_func_posix_getgrgid_r. + +2008-10-29 16:04:38 Tim Janik + + * glib/tmpl/macros_misc.sgml: Clarified/added docs for + G_STRINGIFY, G_PASTE and G_STATIC_ASSERT, based on + patches from Christian Persch and Christian Dywan. + +2008-10-21 Alexander Larsson + + * gio/gio-sections.txt: + Update with new symbolse + +2008-10-16 Matthias Clasen + + * === Released 2.19.0 === + + * gio/gio-sections.txt: Add new api + + * gobject/gobject-docs.sgml: + * gio/gio-docs.xml: Add new indexes + +2008-10-16 Matthias Clasen + + * glib/Makefile.am: Don't specify multiple directories in + DOC_SOURCE_DIR. It doesn't work. + +2008-09-26 Dan Winship + + * glib/tmpl/testing.sgml: Fix lots of typos, document + g_assert_error() and g_assert_no_error() + +2008-09-26` Matthias Clasen + + * glib/tmpl/iochannel.sgml: Move more docs inline + +2008-09-17 Matthias Clasen + + * === Released 2.18.1 === + +2008-09-15 Matthias Clasen + + Bug 552359 – g_file_info_get_icon should return GThemedIcon, and + g_themed_icon_get_names shold be documented ? + + * gio/gio-sections.txt: Add g_themed_icon_get_names. + +2008-09-12 Matthias Clasen + + * glib/tmpl/modules.sgml: Reinstate docs that somehow got lost. + +2008-09-02 Matthias Clasen + + * === Released 2.18.0 === + +2008-09-02 Matthias Clasen + + * gobject/gobject-sections.txt: Add g_object_get_type + +2008-09-02 Matthias Clasen + + Bug 550056 – Missing documentation for g_emblemed_icon_get_emblems + + * gio/gio-sections.txt: Add some missing GEmblem functions. + Noticed by Cosmio Cecchi + +2008-08-27 Matthias Clasen + + * glib/tmpl/i18n.sgml: Add hint about intltool to NC_() docs. + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +2008-08-16 Matthias Clasen + + * gio/gio-sections.txt: Fix a typo + +2008-08-15 Tor Lillqvist + + * glib/tmpl/threads.sgml: Add an exception: g_mem_set_vtable() may + be called before g_thread_init(). + +2008-08-15 Tor Lillqvist + + * glib/tmpl/threads.sgml: Warn about the consequences of not + calling g_thread_init() first, if it will be called at all. Advice + calling it if using random GLib-based libraries. + +2008-08-11 Matthias Clasen + + Bug 547262 – Missing link in the docs + + * glib/tmpl/gregex.sgml: Fix a reference. + Pointed out by Bastien Nocera + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * gio/gio.types: + * gio/gio-docs.xml: + * gio/gio-sections.txt: Add Gemblem + +2008-08-04 Matthias Clasen + + * === Released 2.17.5 === + +2008-08-04 Matthias Clasen + + * gobject/gobject-docs.sgml: Add a 2.18 index + +2008-08-01 Matthias Clasen + + * gio/gio-sections.txt: Add some more GEmblemedIcon things. + + * glib/tmpl/testing.sgml: Fix a typo. Noticed by Marek Kasik. + +2008-07-28 Matthias Clasen + + * glib/glib-sections.txt: Add g_markup_context_get_user_data + +2008-07-28 Matthias Clasen + + * gio/gio-sections.txt: + * gio/gio-docs.xml: Add GEmblemedIcon + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + +2008-07-18 Matthias Clasen + + * gobject/gobject-sections.txt: Add new signal api. + +2008-07-18 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/i18n.sgml: Add new gettext stuff + +2008-07-18 Matthias Clasen + + Bug 530759 – update the gobject tutorial to the XXI century + + * gobject/*: Some updates to the tutorial. Patch by Emmanuele + Bassi. + +2008-07-18 Matthias Clasen + + * gio/gio-sections.txt: Add g_content_type_guess_for_tree + +2008-07-16 Matthias Clasen + + Bug 543220 – Case collision on gio-extension-points.html + + Reported by Ryan Schmidt + * gio/overview.xml: Rename id to avoid filename conflict. + +2008-07-16 Matthias Clasen + + Bug 543168 – Description of G_SLICE=debug-blocks discourages its use + + * glib/running.sgml: Improve docs of G_SLICE=debug-blocks. + Patch by Alessandro Vesely. + +2008-07-08 Matthias Clasen + + * gio/gio-sections.txt: Add new GMount functions + +2008-07-05 Matthias Clasen + + Bug 521589 – [RFC] gobject documentation should mention Vala + + * gobject/tut_tools.xml: Add a reference to Vala. + Patch by Marc-Andre Lureau. + +2008-07-05 Matthias Clasen + + * glib/glib-sections.txt: Move g_strcmp0 to a more appropriate + place in the docs. + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-07-02 Matthias Clasen + + * gio/gio-sections.txt: Add g_desktop_app_info_new_from_keyfile + and g_file_monitor + +2008-07-01 Matthias Clasen + + * gio/gio.types: Add missing types. Pointed out by David Zeuthen. + +2008-06-24 Michael Natterer + + * glib/Makefile.am + * gobject/Makefile.am: don't comment out the include of + Makefile.decl just because there are no tests. It needs to be + included in each Makefile.am or make check will fail. + +2008-06-22 Stefan Kost + + * glib/Makefile.am: + * gobject/Makefile.am: + Unify the Makefiles. In glib only scan glib folders. + +2008-06-16 Ross Burton + + * gio/gio-sections.txt: + Add g_file_enumerator_get_container. + +2008-06-14 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GNUC_MAY_ALIAS + + * glib/tmpl/testing.sgml: Move docs around, and add more + + * glib/tmpl/unicode.sgml: Document break types + + * glib/tmpl/hash_tables.sgml: Add docs for GHashTableIter + +2008-06-12 Matthias Clasen + + * === Released 2.17.2 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.1 === + +2008-06-12 Matthias Clasen + + * gio/gio-sections.txt: Add some new symbols + +2008-06-12 Matthias Clasen + + * glib/running.sgml: Remove mention of G_WIN32_PRETEND_WIN9X + +2008-06-12 Ross Burton + + * gio/gio-sections.txt: + Add g_file_make_directory_with_parents. + +2008-06-12 Matthias Clasen + + * glib/glib-sections.txt: Testing documentation fixups + +2008-06-12 Matthias Clasen + + * glib/gtester.xml: + * glib/gtester.1: + * glib/gtester-report.xml: + * glib/gtester-report.1: + * glib/glib-docs.sgml: + * glib/Makefile.am: Add gtester, gtester-report man pages + +2008-06-11 Behdad Esfahbod + + * glib/glib-sections.txt: Add g_dgettext() and g_dngettext(). + +2008-06-11 Matthias Clasen + + Bug 535418 – Please document which glib version defines goffset + + * glib/tmpl/types.sgml: Add a Since tag for goffset + Proposed by Holger Berndt + +2008-06-11 Matthias Clasen + + Bug 528715 – Misprint in the description of the interface + g_type_class_add_private + + * glib/tmpl/macros_misc.sgml: + * gobject/tmpl/gclosure.sgml: + * gobject/tmpl/gtype.sgml: Fix typos + Noticed by Areg Beketovski + +2008-06-11 Matthias Clasen + + Bug 528714 – Misprint in the description of the interface + g_param_spec_flags + + * gobject/tmpl/param_value_types.sgml: Fix a typo. + Pointed out by Areg Beketovski + +2008-06-11 Matthias Clasen + + Bug 537260 – Doc bug in G_TYPE_INSTANCE_GET_CLASS() + + * gobject/tmpl/gtype.sgml: Fix unclear parameter descriptions. + Pointed out by Behdad Esfahbod + +2008-06-11 Matthias Clasen + + Bug 530527 – Misprint in the description of the interface + g_cclosure_marshal_VOID__FLAGS + + * gobject/tmpl/gclosure.sgml: Fix a duplication. + Noticed by Areg Beketovski + +2008-06-11 Matthias Clasen + + Bug 530526 – Misprint in the description of the fields 'class_init' + and 'class_finalize' of the structure GTypeInfo + + * gobject/tmpl/gtype.sgml: Improve GTypeInfo docs + Proposed by Areg Beketovski + +2008-06-11 Matthias Clasen + + Bug 528719 – Improvement to the documentation of the + "g_object_connect" interface + + * gobject/tmpl/objects.sgml: Improve the documentation of + g_object_connect. Proposed by Areg Bketovski + +2008-06-11 Matthias Clasen + + Bug 528172 – gtk_signal_handlers_unblock_* functions return value + amount of matched signals, not amount of actually unblocked. + + * gobject/tmpl/signals.sgml: Fix documentation of return value + of functions that operate on matched signal handlers. + +2008-06-11 Matthias Clasen + + Bug 528717 – Misprint in the description of the parameter + 'type_id' for the interface g_type_register_fundamental + + * gobject/tmpl/gtype.sgml: Remove references to GTypeFundamentals + Pointed out by Areg Beketovski + +2008-06-11 Matthias Clasen + + Bug 528716 – Misprint in the description of the parameter + 'iface_data' for the callback types GInterfaceInitFunc and + GInterfaceFinalizeFunc + + * gobject/tmpl/gtype.sgml: Fix description of parameters + for GInterface{Init/Finalize}Func. + Pointed out by Areg Beketovski + +2008-06-10 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: Document G_PARAM_STATIC_NICK + +2008-06-10 Matthias Clasen + + * gio/gio-sections.txt: Add g_themed_icon_prepend_name + +2008-06-10 14:06:34 Tim Janik + + * gobject/tmpl/gtype.sgml: fixed documentation regarding type checking + macros that do and do not issue warnings. + +2008-05-28 Matthias Clasen + + * glib/glib-docs.sgml: + * gio/gio-docs.sgml: Add indexes of 2.18 additions + +2008-05-27 Matthias Clasen + + * === Released 2.17.0 === + +2008-05-27 Matthias Clasen + + * glib/compiling.sgml: Document G_DISABLE_SINGLE_INCLUDES + +2008-05-27 Michael Natterer + + * glib/tmpl/gurifuncs.sgml + * glib/tmpl/testing.sgml: new files. + + * glib/tmpl/unicode.sgml + * glib/tmpl/macros_misc.sgml + * glib/tmpl/checksum.sgml: regenerated. + + * Updated lots of svn:ignore all over the place. + +2008-05-27 Matthias Clasen + + Bug 535021 – g_param_spec_internal documentation should + describe purpose of nick and blurb + + * gobject/tmpl/gparamspec.sgml: Explain nicks and blurbs + some more. + +2008-05-26 Matthias Clasen + + * glib/glib-docs.sgml: Add 2.18 index + + * glib/glib-sections.txt: Add g_checksum_reset + +2008-05-25 Matthias Clasen + + * gobject/tmpl/gclosure.sgml: Fix docs for + g_cclosure_marshal_STRING__OBJECT_POINTER. (#534177, Areg Beketovski) + +2008-05-18 Matthias Clasen + + Bug 527214 – g_timer_elapsed() returns random values. + + * docs/reference/glib/tmpl/timers.sgml: + Add notes regarding gthreads dependency. + Patch by Mathias Hasselmann + +2008-05-17 Matthias Clasen + + * gio/gio-sections.txt: Add new api + +2008-05-17 Matthias Clasen + + Bug 528648 – Extra >s in Object Construction section... + + * gobject/tut_howto.xml: Fix a formatting glitch + +2008-05-14 Tor Lillqvist + + * glib/tmpl/spawn.sgml: Don't mention fork()/exec() in the short + description. fork()/exec() is an implementation detail on Unix. + +2008-04-07 Matthias Clasen + + * glib/tmpl/unicode.sgml: Updates for Unicode 5.1 + +2008-04-07 Matthias Clasen + + Bug 526572 – Missing * in declaration of parent_class in Object + Destruction section of GObject Reference Manual + + * gobject/tut_howto.xml: Add missing *. + +2008-04-03 Matthias Clasen + + Bug 525553 – fix typo and nitpicking in GArray documentation + + * glib/tmpl/arrays.sgml: Correct an index in an example, + pointed out by Paul Bolle + +2008-03-30 Matthias Clasen + + * gio/gio-sections.txt: Add g_file_query_file_type. + +2008-03-30 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/macros-misc.sgml: Document G_GNUC_ALLOC_SIZE + macros + +2008-03-28 A. Walton + + * gio/overview.xml: + Document GIO_EXTRA_MODULES, fixes a small typo. + +2008-03-19 Matthias Clasen + + * gio/overview.xml: Document GVS_DISABLE_FUSE. + +2008-03-12 Benjamin Otte + + * gio/gio-sections.txt: + g_file_contains_file() doesn't exist anymore + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + +2008-03-10 Matthias Clasen + + * glib/tmpl/linked_lists_double.sgml: + * glib/tmpl/linked_lists_single.sgml: Remove docs that have + been inlined. + +2008-03-10 Matthias Clasen + + * glib/tmpl/types.sgml: Add a Since marker for goffset (#521013, + Charles Kerr) + +2008-02-29 Matthias Clasen + + * glib/tmpl/linked_lists_double.sgml: Move docs inline + +2008-02-25 Matthias Clasen + + * === Released 2.15.6 === + +2008-02-23 Matthias Clasen + + * gio/gio-sections.txt: Updates + +2008-02-21 Tor Lillqvist + + * glib/running.sgml: Clarify character set issues on Windows. + +2008-02-13 Ryan Lortie + + * gio/gio-sections.txt: add G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT + +2008-02-12 Matthias Clasen + + * gio/migration.xml: Add a note about mime monitoring + +2008-02-11 Matthias Clasen + + * === Released 2.15.5 === + +2008-02-11 Matthias Clasen + + * gio/gio-docs.xml: + * gio/gio-sections.txt: + * gio/overview.xml: Documentation additions + +2008-02-10 Philip Withnall + + * glib/tmpl/modules.sgml: Improve the documentation for + the G_MODULE_EXPORT macro. (#514470) + +2008-02-09 Matthias Clasen + + * glib/tmpl/i18n.sgml: Improve the documentation for the + N_() macro. (#514053, Tommi Vainikainen) + +2008-01-29 Christian Persch + + * glib/tmpl/macros_misc.sgml: G_GNUC_[PRETTY_]FUNCTION are + deprecated since 2.16, not 2.14. + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + +2008-01-27 Matthias Clasen + + * glib/tmpl/trees-nary.sgml: Move docs inline + +2008-01-27 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GNUC_(PRETTY)_FUNCTION + as deprecated. + +2008-01-24 Matthias Clasen + + * gio/migration.xml: Some more + +2008-01-23 Matthias Clasen + + * gio/migration.xml: Add something on trash handling + and some very sketchy information on gnome_vfs_xfer + +2008-01-23 Matthias Clasen + + * gio/overview.xml: Document environment + variables used by GIO. + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + +2008-01-20 Matthias Clasen + + * gio/gio-sections.txt: Additions + +2008-01-14 Matthias Clasen + + * === Released 2.15.2 === + +2008-01-11 Matthias Clasen + + * glib/*: Hook up gtestutils docs. + +2008-01-08 Alexander Larsson + + * gio/gio-docs.xml: + * gio/migrating.xml: + Remove GDirectoryMonitor refernces + +008-01-07 Matthias Clasen + + * === Released 2.15.1 === + +2008-01-07 Matthias Clasen + + * glib/glib-sections.txt: + * gio/gio-sections.txt: Update to api changes + +2008-01-06 Matthias Clasen + + * glib/building.sgml: Document new dependencies and + configure options. + +2007-12-31 Wouter Bolsterlee + + * gio/migrating.xml: Fixed invalid XML entity + +2007-12-31 Wouter Bolsterlee + + * glib/tmpl/macros_misc.sgml: Fixed typo + +2007-12-30 Matthias Clasen + + * gio/Makefile.am: + * gio/gio-sections.txt: Updates + +2007-12-29 Matthias Clasen + + * glib/tmpl/spawn.sgml: Add a warning about allowed functions + between fork() and exec(). + +2007-12-24 Benjamin Otte + + * glib/tmpl/timers.sgml: Add a warning about g_thread_init + invalidating timers. (#491218) + +2007-12-24 Mathias Hasselmann + + Fix typo in g_try_new0 docs (#505195, Felix Riemann). + + * docs/reference/glib/tmpl/memory.sgml: Reference + n_structs, instead of non-existant n_counts argument. + +2007-12-22 Matthias Clasen + + * gobject/tmpl/gtypemodule.sgml: Fix a typo + +2007-12-20 Matthias Clasen + + * === Released 2.15.0 === + +2007-12-19 Alexander Larsson + + * gio/migrating.xml: + * gio/overview.xml: + Some minor fixes and additions. + +2007-12-17 Matthias Clasen + + * gio: Flesh out the overview and migration docs. + +2007-12-17 Matthias Clasen + + * gio/migration.xml: Stub of a migration chapter + * gio/overview.xml: Stub of an overview + * gio/gvfs-overview.{odg,png}: Overview diagram taken + from Alex Guadec slides. + + * gio/Makefile.am: + * gio/gio-docs.xml: Include these + +2007-12-17 Matthias Clasen + + * gio/gio-sections.txt: Updates + +2007-12-14 Matthias Clasen + + * glib/tmpl/hash_tables.sgml: + * glib/glib-sections.txt: Add hash iterator functions + +2007-12-10 Matthias Clasen + + * gio/gio-sections.txt: + * gio/gio-docs.xml: + * gio/gio.types: Add gdesktopappinfo + +2007-12-10 Bastien Nocera + + * glib/tmpl/keyfile.sgml: Mention the difference + in handling booleans between GKeyFile and .INI files + (Closes: #468882) + +2007-12-10 Alexander Larsson + + * gio/Makefile.am: + Remove more internal headers. + + * gio/gio-sections.txt: + Update for changes + +2007-12-10 Matthias Clasen + + * gio/Makefile.am: Ignore gioalias.h + * gio/gio-sections.txt: Updates + +2007-12-07 Behdad Esfahbod + + * glib/tmpl/date.sgml: Fix tiny grammar typo. + +2007-12-04 Emmanuele Bassi + + * glib/glib-sections.txt: Add GChecksum public API. + + * glib/tmpl/checksum.sgml: + * glib/glib-docs.sgml: Add the checksums API page. + +2007-11-29 Behdad Esfahbod + + Bug 500361 – Improve docs for g_array_free() and g_ptr_array_free() + + * glib/tmpl/arrays.sgml: + * glib/tmpl/arrays_pointer.sgml: + Document how to free the return value. + +2007-11-28 Matthias Clasen + + * gio/gio-sections.txt: More cleanup + + * gio/gio.types: Remove internal types + +2007-11-27 Matthias Clasen + + * gio/gio-sections.txt: Remove nonexisting functions + +2007-11-27 Matthias Clasen + + * gio/gio-sections.txt: Some additions + +2007-11-27 Matthias Clasen + + * gio/gio-sections.txt: + * gio/gio-docs.xml: + * gio/gio.types: Update for api changes + +2007-11-26 Alexander Larsson + + * Makefile.am: + * gio/Makefile.am: + * gio/gio-docs.xml: + * gio/gio-sections.txt: + * gio/gio.types: + * gio/version.xml.in: + Add gio docs + +2007-11-23 Matthias Clasen + + * glib/tmpl/i18n.sgml: + * glib/glib-sections.txt: Add g_dpgettext(), C_() + +2007-11-18 Matthias Clasen + + * glib/tmpl/option.sgml: Update the example to demonstrate + error handling. (#497033, Matti Katila) + +2007-11-09 Matthias Clasen + + * glib/tmpl/patterns.sgml: Add a warning about strlen vs + g_utf8_strlen. (#455725, Michael Rasmussen) + + * glib/tmpl/date.sgml: Add a footnote explaining leap years. + (#491982, Areg Beketovski) + + * glib/tmpl/date.sgml: Improve g_date_clamp docs. (#491970, + Areg Beketovski) + +2007-11-08 Matthias Clasen + + * glib/tmpl/memory.sgml + * glib/tmpl/hooks.sgml: Cleanups and fixes + +2007-11-08 Matthias Clasen + + * glib/tmpl/thread_pools.sgml: Fix the GThreadPool docs. + (#491959, Areg Beketovski) + +2007-11-07 Matthias Clasen + + * glib/glib-sections.txt: Add g_markup_parse_context_get_element_stack + +2007-11-07 Matthias Clasen + + * glib/building.sgml: Fix a typo + +2007-11-07 Matthias Clasen + + * === Released 2.14.3 === + +2007-11-05 Mathias Hasselmann + + * docs/reference/gobject/tut_gtype.xml: Use correct naming conventions + when explaining maman_bar_get_type(). (#493688) Mention G_DEFINE_TYPE. + +2007-10-16 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: Small update (#477704, Ross Burton) + +2007-10-16 Matthias Clasen + + * === Released 2.14.2 === + +2007-10-16 Matthias Clasen + + * gobject/tmpl/param_value_types.sgml: Add some discussion on + g_value_set_object() vs g_value_take_object(). (#477957, Davyd + Madeley) + +2007-09-19 Behdad Esfahbod + + * glib/building.sgml: Fix gettext URL. (#478349, kraai ftbfs.org) + +2007-09-19 Matthias Clasen + + * === Released 2.14.1 === + +2007-09-16 Matthias Clasen + + * glib/Makefile.am: Remove reference to trio + +2007-09-11 Matthias Clasen + + * glib/tmpl/error_reporting.sgml: Add an example. (#474229, + Rob Bradford) + +2007-09-09 Behdad Esfahbod + + * glib/tmpl/warnings.sgml: Improve G_BREAKPOINT docs. (#474899) + +2007-09-05 Behdad Esfahbod + + * glib/tmpl/glib-unused.sgml: + * glib/tmpl/macros_misc.sgml: + * glib/tmpl/main.sgml: + * gobject/tmpl/gparamspec.sgml: + +Tue Aug 28 19:04:12 2007 Tim Janik + + * glib/tmpl/memory_slices.sgml: clarified alignment + expectations for g_slice_alloc(). + +2007-08-20 Behdad Esfahbod + + * glib/tmpl/unicode.sgml: Document that GUnicodeScript is + interchangeable with PangoScript. + +2007-08-20 Behdad Esfahbod + + * glib/tmpl/spawn.sgml: + Fix typos (#468694). + +2007-08-15 Mikael Hallendal + + * glib/tmpl/keyfile.sgml: Clearify that only comments can precede + groups in Key-files. (#466768) + +2007-08-03 Matthias Clasen + + * === Released 2.14.0 === + +2007-07-21 Matthias Clasen + + * glib/glib-sections.txt: Additions + +2007-07-21 Matthias Clasen + + * glib/tmpl/fileutils.sgml: Fix an inaccuracy in the + G_FILE_TEST_IS_REGULAR docs, pointed out by + Vincent Untz. (#417068) + +2007-07-20 Matthias Clasen + + * glib/tmpl/limits.sgml: + * glib/tmpl/types.sgml: + * glib/glib-sections.txt: Add new functions + +2007-07-19 Behdad Esfahbod + + * glib/glib-sections.txt: + +2007-07-12 Matthias Clasen + + * === Released 2.13.7 === + +Thu Jul 12 18:28:47 2007 Tim Janik + + * gobject/tmpl/gtype.sgml: fixed g_type_name() docs to forbid passing in + invalid type IDs. + +Thu Jul 12 15:45:27 2007 Tim Janik + + * glib/tmpl/threads.sgml: document major caveat of g_private_set/g_private_get, + i.e. not retaining private data across g_thread_init. + +Tue Jul 10 13:11:55 2007 Tim Janik + + * glib/tmpl/types.sgml: corrected descriptions of gsize and gssize. + +Tue Jul 10 13:04:03 2007 Tim Janik + + * minor docu build fixes. + +Tue Jul 10 12:31:04 2007 Tim Janik + + * glib/tmpl/threads.sgml: document g_once_init_enter and g_once_init_leave. + +2007-07-09 Matthias Clasen + + * tmpl/modules.sgml: Remove duplicate paragraph. + (#45786, Ruben Vermeersch) + + * tmpl/modules.sgml: Remove duplicate code from + an example. (#454785, Ruben Vermeersch) + +Mon Jul 9 10:23:53 2007 Tim Janik + + * gobject/tmpl/gclosure.sgml: GClosure docu fixes from Guillaume + Cottenceau, #383155. + +Fri Jun 29 2007 Matthias Clasen + + * === Released 2.13.6 === + +Wed Jun 27 11:43:01 2007 Tim Janik + + * gobject/tmpl/gtype.sgml (initializers): typo fix, #451459. + +2007-06-23 Emmanuele Bassi + + * glib/tmpl/memory.sgml: Add a clarification about pairing the + memory allocation and free functions, and not mix system's + malloc/free with the corresponding GLib ones. (#450216, Hubert + Figuiere) + +2007-06-18 Matthias Clasen + + * === Released 2.13.5 === + +2007-06-18 Emmanuele Bassi + + * glib/glib-sections.txt: Add g_timeout_add_seconds_full(). + +2007-06-17 Behdad Esfahbod + + * glib/tmpl/quarks.sgml: + +2007-06-16 Emmanuele Bassi + + * glib/tmpl/macros.sgml: Document the undefined behaviour of + CLAMP() if low > high. (#448260) + +2007-06-13 Sven Neumann + + * glib/glib-sections.txt + * glib/tmpl/memory_slices.sgml: document g_slice_copy() and + g_slice_dup(). + +2007-06-13 Matthias Clasen + + * glib/tmpl/warnings.sgml: Add some verbiage about + intended use cases for the g_return macros, inspired + by a bugzilla comment by Havoc Pennington. + +2007-06-05 Matthias Clasen + + * === Released 2.13.4 === + +2007-06-04 Matthias Clasen + + * === Released 2.13.3 === + +2007-06-04 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/misc_utils.sgml: Add g_get_special_user_dir() + and GUserDirectory. + +2007-05-30 Matthias Clasen + + * glib/tmpl/i18n.sgml: Add some hints about + xgettext invokation. + +2007-05-30 Dan Winship + + * glib/glib-sections.txt: + * glib/tmpl/keyfile.sgml: add G_KEY_FILE_DESKTOP_* macros + +2007-05-26 Matthias Clasen + + * gobject/tmpl/objects.sgml: Fix a typo + +2007-05-22 Matthias Clasen + + * === Released 2.13.2 === + +2007-05-17 Matthias Clasen + + * glib/tmpl/messages.sgml: Fix a typo (#436547, + Guillaume Desmottes) + +2007-05-14 Matthias Clasen + + * glib/running.sgml: Document g_slice_debug_tree_statistics + as debug-only functionality. + +2007-05-11 Matthias Clasen + + * glib/tmpl/option.sgml: Document new G_OPTION_ARG_REMAINING + functionality. + +2007-05-03 Behdad Esfahbod + + * glib/glib-sections.txt: + * glib/tmpl/messages.sgml: + Add g_unichar_ismark(). + +2007-05-03 Matthias Clasen + + * === Released 2.13.1 === + +2007-04-30 Matthias Clasen + + * glib/glib-sections.txt: Add new regex functions + +2007-04-30 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/gregex.sgml: Update for the GRegex/GMatchInfo + split. + +2007-04-24 Matthias Clasen + + * glib/glib-sections.txt: Add g_option_context_get_help. + +2007-04-11 Emmanuele Bassi + + * glib/glib-sections.txt: Add new hash functions. + +2007-04-02 Ryan Lortie + + * gobject/tmpl/objects.sgml: Document ->constructed(). + +2007-03-18 Matthias Clasen + + * glib/tmpl/thread_pools.sgml: + * glib/tmpl/strings.sgml: + * glib/tmpl/string_chunks.sgml: + * glib/tmpl/spawn.sgml: + * glib/tmpl/patterns.sgml: + * glib/tmpl/modules.sgml: + * glib/tmpl/memory_slices.sgml: + * glib/tmpl/memory.sgml: + * glib/tmpl/gregex.sgml: Trivial cleanups + +2007-03-16 Matthias Clasen + + * === Released 2.13.0 === + +Fri Mar 16 16:04:42 2007 Tim Janik + + * glib/tmpl/scanner.sgml: some fixups, mention that changing scanner + config during the parsing phase is supported behavior. + +2007-03-15 Marco Barisione + + Add GRegex for regular expression matching. (#50075) + + * glib/Makefile.am: + * glib/glib-docs.sgml: + * glib/glib-sections.txt: + * glib/tmpl/glib-unused.sgml: + * glib/regex-syntax.sgml: + * glib/tmpl/gregex-unused.sgml: + * glib/tmpl/gregex.sgml: Add GRegex. + + * glib/building.sgml: Document build options for GRegex. + +2007-03-14 Stefan Kost + + * gobject/tmpl/gparamspec.sgml: + Readd docs for G_PARAM_STATIC_NICK and add docs for new + G_PARAM_STATIC_STRINGS (fixes #418021). + +2007-03-06 Matthias Clasen + + * glib/tmpl/threads.sgml: Document G_ERRORCHECK_MUTEXES. (#412145) + + * glib/tmpl/trees-nary.sgml: Fix a typo in the docs for + g_node_first_child(). (#409395, Vincent Untz) + +2007-02-11 Stefan Kost + + * gobject/tut_gobject.xml: + * gobject/tut_gsignal.xml: + * gobject/tut_gtype.xml: + * gobject/tut_howto.xml: + * gobject/tut_intro.xml: + * gobject/tut_tools.xml: + Format XML to be more editable. Describe Interfaces better. Add a + footnote at first occurance of 'maman_'. + +2007-02-08 Stefan Kost + + * gobject/tut_gobject.xml: + * gobject/tut_gsignal.xml: + * gobject/tut_gtype.xml: + * gobject/tut_howto.xml: + * gobject/tut_tools.xml: + Unify spelling of GObject and GType. Improve some wording. Update the + usage of private data. Make tables use row-spans and add id's to them. + +2007-01-30 Matthias Clasen + + * gobject/tmpl/gsignal.sgml: Correct a typo. + (#401994, Mariano Suarez-Alvarez) + +2007-01-26 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GNUC_INTERNAL + support for Sun Studio. + +2007-01-23 Matthias Clasen + + * gobject/tmpl/objects.sgml: Document + g_object_class_override_property as 2.4 addition (#399940, + Ian Turner) + +2007-01-17 Behdad Esfahbod + + * glib/tmpl/macros_misc.sgml: Put back G_GNUC_HAVE_VISIBILITY + doc that was removed accidentally. + +2007-01-15 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml; Document G_PARAM_STATIC_NICK. + (#396564, Vincent Untz) + +2007-01-12 Matthias Clasen + + * glib/tmpl/keyfile.sgml: Small clarifications. + +2007-01-03 Behdad Esfahbod + + * glib/glib-sections.txt: Add g_unichar_iszerowidth. + + * glib/tmpl/glib-unused.sgml: + * glib/tmpl/keyfile.sgml: + * glib/tmpl/macros_misc.sgml: + * glib/tmpl/messages.sgml: + * glib/tmpl/unicode.sgml: + Template changes. + +2007-01-02 Matthias Clasen + + * glib/running.sgml: Remove C99ism from example. + +2006-12-31 Matthias Clasen + + * glib/tmpl/threads.sgml: Fix whitespace. (#391116) + +2006-12-28 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Updates + + * gobject/tmpl/gtypemodule.sgml: Document dynamic type + registration macros. + + * gobject/gobject-docs.sgml: Add "Since 2.14" index + * gobject/gobject-sections.txt: Add dynamic type macros + +2006-12-28 Matthias Clasen + + * gobject/tmpl/objects.sgml: Clarify a detail about + g_object_set_data_full. (#343750, Christian Neumair) + +Wed Dec 27 15:56:53 2006 Tim Janik + + * glib/tmpl/memory_slices.sgml: + * glib/running.sgml: document G_SLICE=debug-blocks. + +2006-12-27 Matthias Clasen + + * glib/running.sgml: + * glib/tmpl/option.sgml: + * glib/tmpl/date.sgml: Add hints for locale-dependent functions. + +2006-12-18 Matthias Clasen + + * glib/tmpl/keyfile.sgml: Small clarification (#369908, + Tapani Pälli) + +2006-12-17 Matthias Clasen + + * glib/tmpl/spawn.sgml: Refer to g_child_watch_add() in addition + to waitpid(). + + * gobject/tmpl/objects.sgml: Expand GObject::notify + documentation. (#381722, Nickolay V. Shmyrev) + + * gobject/tmpl/gparamspec.sgml: Add canonical-parameter-name id. + +2006-12-15 Matthias Clasen + + * glib/glib-docs.sgml: Add a "Since 2.14" section. + + * glib/glib-sections.txt: Add g_string_chunk_clear. + +2006-12-14 Matthias Clasen + + * gobject/*.xml: s/Gnome/GNOME/g (#352156, Guillaume Desmottes) + + * glib/tmpl/keyfile.sgml: Clarify the behaviour + wrt. to duplicate keys and groups. + +2006-12-13 Matthias Clasen + + * glib/tmpl/modules.sgml: Point out that valid symbols may be NULL. + +2006-10-08 Matthias Clasen + + * glib/tmpl/unicode.sgml: Document GUnicodeType. + +2006-10-08 Matthias Clasen + + * glib/glib-sections.txt: Add g_unichar_get_script() and + GUnicodeScript. + + * glib/tmpl/unicode.sgml: Document GUnicodeScript + + * gobject/tmpl/enumerations_flags.sgml: Add a hint about + the requirement that enum and flags values must be static. + +2006-10-01 Matthias Clasen + + * glib/tmpl/option.sgml: Improve example. (#367625, Ross Burton) + +Mon Sep 11 14:57:46 2006 Tim Janik + + * glib/running.sgml: documented G_DEBUG flags resident-modules + and bind-now-modules, patch by Christian Persch on bug #345099. + +2006-09-10 Matthias Clasen + + * glib/glib-sections.txt: Add new functions + +2006-08-28 Matthias Clasen + + * glib/compiling.sgml: Add a note about G_DISABLE_DEPRECATED. + (#353172, Matt Barnes) + +Wed Aug 16 13:55:39 2006 Tim Janik + + * glib/tmpl/trash_stack.sgml: added notes about complexity. + +2006-08-15 Matthias Clasen + + * === Released 2.12.2 === + +2006-08-10 Josh Parsons + + * gobject/tmpl/gtype.sgml: + * glib/tmpl/threads.sgml: Style and grammar fixes. + +2006-08-05 Matthias Clasen + + * glib/tmpl/messages.sgml: Add some hints + about making warnings fatal. (#348785, Matt + Barnes) + +2006-07-22 Matthias Clasen + + * === Released 2.12.1 === + +2006-07-20 Tor Lillqvist + + * glib/tmpl/date.sgml: Improve doc for + g_date_strftime(). (#346197) + +2006-07-05 Matthias Clasen + + * glib/tmpl/base64.sgml: Remove bogus reference + to nonexisting function. (#346660, Mark Drago) + +2006-07-02 Matthias Clasen + + * === Released 2.12.0 === + +2006-06-20 Matthias Clasen + + * === Released 2.11.4 === + +2006-06-12 Matthias Clasen + + * === Released 2.11.3 === + +2006-06-05 Matthias Clasen + + * === Released 2.11.2 === + +2006-06-01 Matthias Clasen + + * glib/glib-sections.txt: Add new hash table functions. + Add new g_source functions. + +Wed May 31 11:35:48 2006 Tim Janik + + * gobject/tmpl/gtype.sgml (Note): amend G_TYPE_CHAR according to #303622. + +2006-05-28 Matthias Clasen + + * glib/tmpl/markup.sgml: Document G_MARKUP_TREAT_CDATA_AS_TEXT. + +2006-05-16 Matthias Clasen + + * glib/glib-sections.txt: Add g_ascii_strtoll + +2006-05-15 Matthias Clasen + + * === Released 2.11.1 === + +2006-05-13 Matthias Clasen + + * glib/glib-sections.txt: Document new api. + +2006-05-11 Bastien Nocera + + * glib/tmpl/option.sgml: add documentation for G_OPTION_ARG_INT64 + +2006-05-10 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Updates + +2006-05-02 Matthias Clasen + + * === Released 2.11.0 === + +2006-05-02 Matthias Clasen + + * gobject/tmpl/gtypemodule.sgml: Document a little + pitfall with the last unref for an object. + +2006-04-27 Matthias Clasen + + * glib/tmpl/unicode.sgml: Mention that GLib 2.12 will + support UCD 5.0. + +2006-04-21 Matthias Clasen + + * gobject/gobject-sections.txt: + * gobject/tmpl/objects.sgml: + * gobject/tmpl/gtype.sgml: Additions + + * glib/glib-docs.sgml: + * gobject/gobject-docs.sgml: Add 2.12 indices. + + * gobject/tmpl/gtype.sgml: Document g_type_register_static_simple + +2006-04-19 Matthias Clasen + + * gobject/tmpl/objects.sgml: Add some missing Since: 2.8 tags + +2006-04-18 Matthias Clasen + + * glib/glib-sections.txt: Add new keyfile api + +2006-04-18 Matthias Clasen + + * gobject/tut_gobject.xml: Say that ref/unref are thread-safe now. + (#322883, Christophe Fergeau) + +2006-04-05 Matthias Clasen + + * gobject/tmpl/signals.sgml: Document class_offset 0. + and that class_closure may be NULL. + +2006-04-04 Matthias Clasen + + * glib/glib-sections.txt: + * glib/glib-docs.sgml: Add Base64 section + +2006-04-03 Matthias Clasen + + * gobject/tmpl/objects.sgml: Add some verbiage to + g_object_ref_sink_docs. (#336677) + +2006-03-30 Matthias Clasen + + * gobject/tmpl/objects.sgml: Update the floating docs wrt + to GInitiallyUnowned. + + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/objects.sgml: + * gobject/tmpl/gtype.sgml: Additions + + * glib/tmpl/messages.sgml: Cleanup + + * glib/tmpl/memory_slices.sgml: Adapt to a parameter name change + + * glib/tmpl/linked_lists_double.sgml: Document g_list_free1 + +2006-03-27 Matthias Clasen + + * glib/tmpl/option.sgml: Document floating point arguments + +Fri Mar 24 15:22:04 2006 Tim Janik + + * glib/tmpl/atomic_operations.sgml: some wording fixups. + +2006-03-20 Matthias Clasen + + * glib/tmpl/types.sgml: Document G_HAVE_GINT64 as deprecated. + (#335294, Richard Laager) + +2006-03-15 Matthias Clasen + + * glib/tmpl/option.sgml: Hint that @error should + be set in error cases. (#334646, Christian Persch) + +2006-03-09 Matthias Clasen + + * glib/templ/timers.sgml: Mention that the second + parameter of g_timer_elapsed can be NULL (#333916, + Christian Neumair) + +2006-03-07 Matthias Clasen + + * === Released 2.10.1 === + +2006-02-24 Matthias Clasen + + * === Released 2.10.0 === + +2006-02-22 Stefan Kost + + * gobject/tmpl/gtype.sgml: + add @since: for _add_private, _GET_PRIVATE + * gobject/tut_gobject.xml: + fix example to use ->priv and not ->private + * gobject/tut_howto.xml: + fix g_type_class_add_private example + +2006-02-14 Tor Lillqvist + + * glib/tmpl/iochannels.sgml: Document some Windows-specific issues. + + * glib/glib-sections.txt: Move three Windows-specific functions + that now are documented from being Private to the correct section. + +2006-02-10 Matthias Clasen + + * === Released 2.9.6 === + +2006-02-10 Matthias Clasen + + * glib/tmpl/date.sgml: Fix a typo (#329123, Kjartan Maraas) + +2006-01-27 Matthias Clasen + + * === Released 2.9.5 === + +2006-01-27 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/memory.sgml: Document g_mem_gc_friendly. + +2006-01-26 Matthias Clasen + + * gobject/tut_tools.xml: Mention g_trap_object_ref + + * glib/running.sgml: Add g_trap variables to the index. + Mention conditional breakpoints as an alternative. + +Wed Jan 25 17:32:22 2006 Tim Janik + + * glib/tmpl/memory_slices.sgml: link to G_DEBUG/G_SLICE where appropriate. + +Wed Jan 25 17:12:47 2006 Tim Janik + + * glib/running.sgml: documented G_SLICE=always-malloc and + G_DEBUG=gc-friendly. added anchors for each env var. + +2006-01-18 Matthias Clasen + + * === Released 2.9.4 === + +2006-01-18 Matthias Clasen + + * glib/tmpl/scanner.sgml: Add a note explaining peculiarities + of peek_token wrt to scope changes. (#307922) + +2006-01-17 Matthias Clasen + + * glib/tmpl/memory.sgml: Add a note about casting the results + of g_new() and g_new0(). + +2006-01-16 Matthias Clasen + + * === Released 2.9.3 === + +2006-01-12 Federico Mena Quintero + + * glib/file-name-encodings.sxd: Replaced with the correct file. + + * glib/file-name-encodings.png: Huh? This was a 6-byte file. + Replaced it with the correct one. + +2006-01-07 Stefan Kost + + * gobject/tut_gtype.xml: + fix internal link, little XXX cleanup + +2006-01-05 Matthias Clasen + + * === Released 2.9.2 === + +2006-01-03 Matthias Clasen + + * glib/glib-sections.txt: Add new API + +2006-01-02 Stepan Kasal + + * glib/glib-docs.sgml (glib-Windows-Compatability-Functions): Rename + (glib-Windows-Compatibility-Functions): , ie. s/Compata/Compati/ + * glib/glib-sections.txt: s/Compata/Compati/ + +2005-12-24 Matthias Clasen + + * gobject/gobject-sections.txt: + * gobject/tmpl/param_value_types.sgml: Document GType + paramspecs + +2005-12-20 Matthias Clasen + + * glib/glib-sections.txt: add g_thread_pool_set_sort_function. + +2005-12-19 Matthias Clasen + + * glib/tmpl/*.sgml: Update versioned deprecation + + * gobject/tmpl/gboxed.sgml: Document G_TYPE_HASH_TABLE. + + * glib/glib-sections.txt: Add g_list_free1 + + * glib/glib-overrides.txt: Remove G_THREADS_IMPL_SOLARIS + +2005-12-14 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/atomic_operations.sgml: Document new atomic + operations. + +2005-12-14 Federico Mena Quintero + + * glib/building.sgml: Clarify exactly what happens when you use --enable-gc-friendly. + +Mon Dec 12 15:31:41 2005 Tim Janik + + * gobject/tmpl/objects.sgml: corrected floating reference documentation. + +2005-12-09 Matthias Clasen + + * === Released 2.9.1 === + +2005-12-07 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: + * gobject/tmpl/gtype.sgml: Document n_preallocs as + ignored. + +2005-12-05 Matthias Clasen + + * glib/glib-sections.txt: Updates + + * glib/tmpl/memory_slices.sgml: Fix a small formatting + problem. + + * glib/tmpl/trees-nary.sgml: + * glib/tmpl/linked_lists_single.sgml: + * glib/tmpl/linked_lists_double.sgml: + * glib/tmpl/caches.sgml: + * glib/tmpl/strings.sgml: + * glib/tmpl/scanner.sgml: + * glib/tmpl/main.sgml: Add versioned deprecation. + +Mon Dec 5 15:53:37 2005 Tim Janik + + * glib/tmpl/memory_slices.sgml: updates to new g_slice API + and minor fixes. + +2005-12-05 Matthias Clasen + + * gobject/tmpl/generic_values.sgml: + * glib/tmpl/trees-nary.sgml: + * glib/tmpl/linked_lists_double.sgml: + * glib/tmpl/linked_lists_single.sgml: + * glib/tmpl/memory_chunks.sgml: + * glib/tmpl/allocators.sgml: + * glib/tmpl/macros_misc.sgml: Updates + + * glib/Makefile.am: Ignore gmirroringtable.h + +2005-12-04 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GNUC_WARN_UNUSED_RESULT. + +2005-12-03 Matthias Clasen + + * glib/tmpl/caches.sgml: Document g_cache_value_foreach + as deprecated; document g_cache_key_foreach more thorougly + + * glib/glib-sections.txt: + * glib/tmpl/linked_lists_single.sgml: Add g_slist_free1. + + * glib/tmpl/memory_chunks.sgml: Document GMemChunk + as deprecated. + + * glib/glib-docs.sgml: + * glib/glib-sections.txt: + * glib/tmpl/memory_slices.sgml: Document the slice + allocator. + +2005-12-02 Matthias Clasen + + * glib/building.sgml: + * glib/tmpl/threads.sgml: + * glib/glib-sections.txt: Remove G_THREADS_IMPL_SOLARIS + + * glib/tmpl/types.sgml: Document G_GUINT64_CONSTANT. + +2005-11-27 Matthias Clasen + + * gobject/gobject-sections.txt: + * gobject/tmpl/gboxed.sgml: Add g_object_ref_sink, + g_object_is_floating, g_param_spec_ref_sink, + G_TYPE_HASH_TABLE + +2005-11-22 Matthias Clasen + + * glib/glib-sections.txt: Add g_hash_table_ref + and g_hash_table_unref + +2005-11-17 Matthias Clasen + + * === Released 2.9.0 === + +2005-11-17 Matthias Clasen + + * glib/tmpl/date.sgml: + * glib/glib-sections.txt: Add g_date_set_time_t, + g_date_set_time_val and g_thread_foreach + +2005-11-08 Matthias Clasen + + * glib/tmpl/threads.sgml: Improve GOnce docs. + (#320950, Christophe Fergeau) + +2005-11-04 Matthias Clasen + + * glib/running.sgml: Document fatal_criticals. + +2005-10-26 Matthias Clasen + + * gobject/gobject-sections.txt: + * gobject/tmpl/generic_values.sgml: Document g_value_set_instance(), + (#319885, Milosz Derezynski) + +2005-10-26 Matthias Clasen + + * glib/tmpl/unicode.sgml: Add a footnote about surrogate + pairs. (#317683, Behdad Esfahbod) + +2005-10-05 Matthias Clasen + + * glib/compiling.sgml: Document gmodule-no-export-2.0 + +2005-10-01 Davyd Madeley + + * glib/tmpl/string_utils.sgml: Minor documentation improvements for + g_strchug, g_strchomp and g_strstrip. Brought forward from glib-2-8. + +2005-08-31 Matthias Clasen + + * glib/tmpl/quarks.sgml: + * glib/glib-sections.txt: Add string interning functions. + +2005-08-30 Matthias Clasen + + * glib/tmpl/arrays.sgml: + * glib/tmpl/arrays_pointer.sgml: + * glib/tmpl/arrays_byte.sgml: Enhance sort() documentation. + (#314839, Behdad Esfahbod) + +2005-08-26 Matthias Clasen + + * glib/glib-docs.sgml: + * gobject/gobject-docs.sgml: Add indices for new + symbols in 2.10 + + Improvements pointed out by Behdad Esfahbod (#314460): + + * glib/tmpl/strings.sgml: Fix up some character/byte + sloppyness. + + * glib/tmpl/iochannels.sgml: Don't mention deprecated + functions in the introduction. + +2005-08-23 Matthias Clasen + + * === Released 2.8.1 === + +2005-08-22 Matthias Clasen + + * glib/tmpl/date.sgml: Point out time_t vs GTime pitfalls. + +2005-08-15 Matthias Clasen + + * glib/glib-gettexttize.xml: + * gobject/glib-genmarshal.xml: + * gobject/glib-mkenums.xml: Fix some trivial + formatting problems. (#313099, Stepan Kasal) + + * glib/tmpl/modules.sgml: Document that file_name can + be NULL. (#313143, Gustavo Carneiro) + + * glib/tmpl/linked_lists_single.sgml: + * glib/tmpl/linked_lists_double.sgml: Clarify docs + a little. (#311727, Tristan van Berkom) + +2005-08-12 Matthias Clasen + + * === Released 2.8.0 === + +2005-08-10 Stepan Kasal + + Fix typos: Invokation --> Invocation (in various places) + + * glib/tmpl/error_reporting.sgml: Fix a typo. + * gobject/tut_howto.xml: Several typos and stylistic changes. + +2005-08-05 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: + * glib/tmpl/types.sgml: + * glib/tmpl/option.sgml: Small fixes. + + * gobject/tmpl/generic_values.sgml: Small fixes + +2005-08-05 Matthias Clasen + + * === Released 2.7.7 === + +2005-08-03 Matthias Clasen + + * === Released 2.7.6 === + +2005-08-02 Matthias Clasen + + * === Released 2.7.5 === + +Sat Jul 30 23:40:35 2005 Tim Janik + + * glib/tmpl/datalist.sgml: + * glib/tmpl/datalset.sgml: document non-thread-safety for + _foreach() functions. + +2005-07-26 Matthias Clasen + + * glib/tmpl/arrays.sgml: One more improvement. + +2005-07-25 Matthias Clasen + + * glib/tmpl/arrays.sgml: Add some details. (#311310, + Jochen Baier) + +2005-07-21 Matthias Clasen + + * === Released 2.7.4 === + +2005-07-20 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Add some discouraging + comments to the G_INLINE_FUNC macros. (#310836, + Callum McKenzie) + +2005-07-19 Matthias Clasen + + * glib/tmpl/byte_order.sgml: Add docs for #307047, + Bryan Silverthorn. + +2005-07-15 Matthias Clasen + + * === Released 2.7.3 === + +2005-07-13 Matthias Clasen + + * glib/glib-overrides.txt: Add G_VA_COPY + + * glib/tmpl/option.sgml: Document that short names must + be printable ASCII characters != '-'. + +2005-07-08 Matthias Clasen + + * === Released 2.7.2 === + +2005-07-08 Matthias Clasen + + * gobject/gobject-docs.sgml: + * glib/glib-docs.sgml: Add the "new in 2.8" index. + +2005-07-05 Matthias Clasen + + * gobject/tmpl/objects.sgml: Add an example + for using a custom constructor. + +2005-06-30 Matthias Clasen + + * === Released 2.7.1 === + +2005-06-29 Matthias Clasen + + * glib/tmpl/threads.sgml: + * glib/tmpl/option.sgml: + * glib/tmpl/fileutils.sgml: + * glib/tmpl/iochannels.sgml: + * glib/tmpl/hooks.sgml: + * glib/tmpl/misc_utils.sgml: + * glib/tmpl/date.sgml: + * glib/glib-sections.txt: Updates + +2005-06-24 Matthias Clasen + + * glib/glib-sections.txt: Add GMappedFile functions. + +2005-06-18 Matthias Clasen + + * glib/tmpl/option.sgml (GOptionFlags): document + G_OPTION_FLAG_NO_ARG and G_OPTION_FLAG_FILENAME (Dan Winship) + +2005-06-16 Mathieu Lacage + + * gobject/tut_gtype.xml: fix typo reported by Hong Gang XU. + +2005-06-10 Matthias Clasen + + * === Released 2.7.0 === + +2005-06-09 Matthias Clasen + + * glib/glib-sections.txt: Add g_chdir + + * glib/tmpl/threads.sgml: Document that stack size + will be ignored if the underlying thread implementation + doesn't support stack sizes. + +2005-06-07 Matthias Clasen + + * glib/glib-sections.txt: Add g_utf8_collate_key_for_filename. + +2005-05-25 Mathieu Lacage + + * gobject/tut_*.xml: fix lots of typos, + some of which were reported by Leonardo Boshell. + +2005-05-23 Matthias Clasen + + * glib/tmpl/threads.sgml: Point out exceptions to the + general GLib data structure locking rules. + +2005-05-20 Matthias Clasen + + * glib/tmpl/threads.sgml: Add a paragraph about thread + safety of GLib data structures. + + * glib/compiling.sgml: Update an example from 1.3 to 2.x + +2005-05-13 Matthias Clasen + + * gobject/glib-genmarshal.1: + * gobject/glib-genmarshal.xml: Mention 64bit integer + types. + +2005-05-10 Matthias Clasen + + * glib/tmpl/markup.sgml: Fix sloppy language, pointed out by + Daniel Vaillard. + +2005-05-09 Matthias Clasen + + * gobject/tmpl/value_collection.sgml: + * gobject/tmpl/gboxed.sgml: + * gobject/tmpl/enumerations_flags.sgml: + * gobject/tmpl/objects.sgml: Add long descriptions. + +2005-05-05 Owen Taylor + + * glib/Makefile.am glib/glib-sections.txt gobject/gobject-sections.txt: + Update + + * gobject/tmpl/objects.sgml: Document toggle-references. + +2005-05-02 Matthias Clasen + + * glib/tmpl/hash_tables.sgml: Move some docs inline. + + * glib/tmpl/windows.sgml: + * gobject/tmpl/signals.sgml: + * gobject/tmpl/generic_values.sgml: + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/value_arrays.sgml: + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/gtypemodule.sgml: + * gobject/tmpl/enumerations_flags.sgml: Small additions. + +2005-05-01 Matthias Clasen + + * glib/tmpl/completions.sgml: Document + strncmp_func. + + glib/glib-sections.txt: Add new API. + +2005-04-29 Matthias Clasen + + * gobject/tmpl/gboxed.sgml: + * gobject/gobject-sections.txt: Add G_TYPE_DATE. + +2005-04-23 Stefan Kost + + * gobject/tut_gtype.xml: + * gobject/tut_howto.xml: + all interface examples use 'interface' instead of 'class' + +2005-04-22 Stefan Kost + + * gobject/Makefile.am: + * gobject/gobject-docs.sgml: + * gobject/tut_gobject.xml: + * gobject/tut_gsignal.xml: + * gobject/tut_gtype.xml: + * gobject/tut_howto.xml: + * gobject/tut_intro.xml: + * gobject/tut_tools.xml: + merged in docs form the gobject tutorial + +2005-03-29 Matthias Clasen + + * glib/tmpl/arrays_pointer.sgml: Clarify the docs for + g_ptr_array_free and g_ptr_array_remove_range. (#170148, + #170149, Jared Lash) + +2005-03-29 Tor Lillqvist + + * glib/tmpl/spawn.sgml: Add Win32 warnings regarding the child + setup function. + +2005-03-21 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/memory.sgml: Document g_try_new, g_try_new0 + and g_try_renew, g_try_malloc0. + +2005-03-20 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: Document G_PARAM_SPEC_STATIC_ + flags. + +2005-03-08 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/macros_misc.sgml: Document G_GNUC_NULL_TERMINATED. + +2005-03-07 Matthias Clasen + + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/gparamspec.sgml: Apply patches by + Stefan Kost to document naming restrictions. (#167614) + +2005-02-10 Matthias Clasen + + * glib/tmpl/option.sgml: Fix a typo. (#166985) + +2005-02-07 Matthias Clasen + + * glib/glib-sections.txt: Add g_listenv. + +2005-02-04 Matthias Clasen + + * glib/tmpl/linked_lists_double.sgml: + * glib/tmpl/linked_lists_single.sgml: Add a note + regarding inefficiency of repeated appends. (#166271, + Olivier Sessink) + +2005-02-03 Matthias Clasen + + * glib/tmpl/quarks.sgml: Add a warning against + using g_quark_from_static_string() in dynamically + loaded modules. + +2005-02-02 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: + * glib/tmpl/hash_tables.sgml: Move some doc + comments inline. + +2005-01-16 Matthias Clasen + + * gobject/tmpl/enumerations_flags.sgml: Fix an + example. (#164269, Sebastien Bacher) + +2005-01-07 Matthias Clasen + + * === Released 2.6.1 === + +2005-01-06 Matthias Clasen + + * glib/tmpl/keyfile.sgml: Add hint about group name + case sensitivity. (#163029, Bastien Nocera) + +2005-01-04 Matthias Clasen + + * gobject/tmpl/signals.sgml: Small addition. (#145158, + Mariano Su??rez-Alvarez) + +2004-12-20 Matthias Clasen + + * gobject/tmpl/signals.sgml: Fix a typo. (#161713, + Vincent Untz) + +2004-12-17 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: Clarify g_get_prgname docs. + (#161480, Danny Milo) + +2004-12-16 Matthias Clasen + + * glib/tmpl/version.sgml: Improve wording. (#161484, + Christian Biere) + + * === Released 2.6.0 === + +2004-12-15 Matthias Clasen + + * glib/glib-sections.txt: Add g_rmdir + +2004-12-15 Alexander Larsson + + * glib/glib-sections.txt: + Add g_filename_display_basename + +2004-12-15 Matthias Clasen + + * gobject/tmpl/generic_values.sgml: Document some return + values. (#161345, Stefan Kost) + +2004-12-02 Matthias Clasen + + * === Released 2.5.7 === + +2004-12-02 Matthias Clasen + + * glib/building.sgml: + * glib/tmpl/linked_lists_single.sgml: + * glib/tmpl/linked_lists_double.sgml: + * glib/tmpl/trees-nary.sgml: Add some warnings regarding + --disable-mem-pools. + +2004-12-01 Matthias Clasen + + * glib/tmpl/iochannels.sgml: Fix a typo. (#160162, Tom Copeland) + +2004-11-30 Matthias Clasen + + * glib/building.sgml: Document --enable-man and --disable-visibility. + +2004-11-28 Tor Lillqvist + + * glib/tmpl/misc_utils.sgml: Document encoding of g_get_user_name(), + g_get_real_name(), g_get_tmp_dir() and g_get_current_dir(). + +2004-11-28 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GNUC_MALLOC. + + * glib/glib-sections.txt: Add G_GNUC_MALLOC + +2004-11-12 Matthias Clasen + + * === Released 2.5.6 === + +2004-11-08 Matthias Clasen + + * glib/tmpl/trees-nary.sgml: Document G_TRAVERSE_LEAVES and + G_TRAVERSE_NON_LEAVES + + * glib/tmpl/hooks.sgml: + * glib/tmpl/iochannels.sgml: Updates + +2004-11-04 Tor Lillqvist + + * glib/tmpl/windows.sgml: Improve G_WIN32_HAVE_WIDECHAR_API + documentation. + + * glib/tmpl/option.sgml: Document G_OPTION_FLAG_REVERSE. + +2004-11-02 Matthias Clasen + + * === Released 2.5.5 === + +2004-11-02 Matthias Clasen + + * glib/glib-sections.txt: Add g_get_filename_charsets and + g_filename_display_name. + +2004-11-01 Matthias Clasen + + * glib/tmpl/option.sgml: Updates + +2004-10-31 Matthias Clasen + + * glib/tmpl/windows.sgml: Document G_WIN32_IS_NT_BASED, + G_WIN32_HAVE_WIDECHAR_API. + + * glib/glib-sections.txt: Add g_lstat + + * glib/running.sgml: Document G_WIN32_PRETEND_WIN9X. + +2004-10-29 Matthias Clasen + + * glib/tmpl/option.sgml: Add an example. + + * glib/glib-sections.txt: Add G_OPTION_REMAINING + + * glib/tmpl/option.sgml: Add docs. + +2004-10-28 Matthias Clasen + + * glib/tmpl/keyfile.sgml: Add some introductory notes. + +2004-10-27 Matthias Clasen + + * === Released 2.5.4 === + +2004-10-27 Matthias Clasen + + * glib/tmpl/fileutils.sgml: Add some intro. + +2004-10-26 Matthias Clasen + + * gobject/gobject-docs.sgml: Add an index for 2.6 additions. + + * gobject/gobject-sections.txt: Additions. + + * gobject/Makefile.am (IGNORE_HFILES): Add gobjectalias.h + + * glib/tmpl/main.sgml: Document GChildWatchFunc + + * glib/tmpl/keyfile.sgml: New template. + + * glib/glib-sections.txt: Additions. + + * glib/tmpl/macros_misc.sgml: Document some more of + the macros. + +2004-10-25 Matthias Clasen + + * glib/glib-docs.sgml: Add GKeyFile section, add + index for 2.6 additions. + +2004-10-23 Matthias Clasen + + * gobject/tmpl/gtype.sgml (GTypeInterfaceCheckData): + Rename first parameter. + + * glib/glib-sections.txt: Add GKeyFile section. + +2004-10-17 Matthias Clasen + + * glib/tmpl/macros.sgml: + * glib/glib-sections.txt: Document G_IS_DIR_SEPARATOR. + +2004-10-05 Matthias Clasen + + * gobject/tmpl/objects.sgml: Improve the docs for + g_object_get_property(). (#153424, Stefan Kost) + +2004-10-03 Matthias Clasen + + * gobject/tmpl/signals.sgml: Improve docs for + g_signal_add_emission_hook. (#154299, Nickolay V. Shmyrev) + +2004-09-20 Matthias Clasen + + * glib/tmpl/messages.sgml: Correct the docs for the default log + handler wrt to which messages go to stderr. (#153041, Philippe Blain) + +Sun Sep 19 23:15:17 2004 Matthias Clasen + + * glib/tmpl/patterns.sgml: Point to g_utf8_strreverse() for + reversing UTF-8 strings. (#153091, Adam Hooper) + +2004-09-18 Matthias Clasen + + * === Released 2.5.3 === + +2004-09-16 Matthias Clasen + + * glib/Makefile.am: Ignore galias.h + + * glib/glib-sections.txt: Updates. + +2004-09-09 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: Add a hint about $HOME to the + docs of g_get_home_dir(). + +Thu Sep 9 00:11:19 2004 Matthias Clasen + + * glib/glib-sections.txt: Add g_strv_length(). + +2004-09-07 Matthias Clasen + + * glib/glib-sections.txt: Add g_get_language_names(). + +Mon Sep 6 01:56:13 2004 Matthias Clasen + + * glib/tmpl/messages.sgml: Remove excess markup and fix a markup + error. + +Sun Sep 5 01:44:23 2004 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/messages.sgml: Document g_log_set_default_handler(). + +Wed Sep 1 20:27:59 2004 Matthias Clasen + + * glib/glib-sections.txt: Add g_date_get_iso8601_week_of_year. + +Sun Aug 29 23:50:45 2004 Matthias Clasen + + * glib/tmpl/fileutils.sgml: Fix a typo. (#151109, Stepan Kasal) + +2004-08-27 Matthias Clasen + + * glib/tmpl/fileutils.sgml: Add G_FILE_ERROR_NOSYS. + +2004-08-25 Matthias Clasen + + * === Released 2.5.2 === + +2004-08-23 Matthias Clasen + + * glib/tmpl/warnings.sgml: Add an example for + g_on_error_query() usage. (#148716, Christian Persch) + +2004-08-12 Matthias Clasen + + * glib/tmpl/threads.sgml: Document the necessity to call + g_thread_init() when using threads + (even non-gthreads). (#149490, Vincent Untz) + + +Tue Aug 3 16:43:22 2004 Matthias Clasen + + * glib/glib-sections.txt: Add a section for GOption. + * glib/glib-docs.sgml: Include GOption section. + * glib/tmpl/option.sgml: New template. + +Tue Aug 3 15:34:16 2004 Matthias Clasen + + * glib/glib-sections.txt: Add a separate section for + version information. + * glib/glib-docs.sgml: Include version section. + * glib/tmpl/version.sgml: New template. + +2004-08-02 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/macros_misc.sgml: Document G_GNUC_INTERNAL. + +2004-08-01 Matthias Clasen + + * === Released 2.5.1 === + +2004-07-28 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: Clarify docs for + g_get_real_name(). (#143552, Danek Duvall) + +Fri Jul 23 10:38:24 2004 Matthias Clasen + + * glib/tmpl/limits.sgml: Fix docs for G_MAXSIZE. (#148262, + Christophe Fergeau) + +Sun Jul 18 18:03:08 2004 Soeren Sandmann + + * === Released 2.5.0 === + +2004-07-09 Matthias Clasen + + * glib/tmpl/arrays.sgml: Improve g_array_free() docs. (#146875, + Ed Griffiths) + +Tue Jul 6 00:54:38 2004 Matthias Clasen + + * gobject/gobject-sections.txt: + * gobject/tmpl/gtypemodule.sgml: Add g_type_module_register_enum() + and g_type_module_register_flags(). + +Mon Jul 5 18:49:56 2004 Matthias Clasen + + * glib/tmpl/messages.sgml: + * glib/glib-sections.txt: Add g_debug. + +2004-06-15 Federico Mena Quintero + + * glib/tmpl/conversions.sgml: New section on file name encodings. + + * glib/file-name-encodings.sxd: New diagram of how file name + encodings work. + + * glib/file-name-encodings.png: Same as above, for inclusion in + the generated docs. + + * glib/Makefile.am (HTML_IMAGES): Add file-name-encodings.png. + (EXTRA_DIST): Add the new images. + + * glib/running.sgml: Add ids to the corresponding paragraphs that + describe G_FILENAME_ENCODING and G_BROKEN_FILENAMES, to be able to + reference them from elsewhere. + +Thu Jun 10 21:29:55 2004 Matthias Clasen + + * glib/tmpl/modules.sgml: Add an example for GModule + usage. (#144127, Tommi Komulainen) + +Sun Jun 6 23:20:42 2004 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Fix the docs for G_DEFINE_TYPE() + and friends. (#143800, Crispin Flowerday) + +2004-05-05 Matthias Clasen + + * gobject/gobject-docs.sgml: + * glib/glib-docs.sgml: Add multiple indices. + +2004-04-30 Matthias Clasen + + * === Released 2.4.1 === + +2004-04-23 Matthias Clasen + + * glib/running.sgml: Document LIBCHARSET_ALIAS_DIR. + +2004-04-15 Matthias Clasen + + * glib/tmpl/types.sgml: Correct the description of the + gfloat and gdouble ranges. + +Tue Mar 16 12:06:09 2004 Owen Taylor + + * === Released 2.4.0 === + +Sun Mar 14 11:00:41 2004 Owen Taylor + + * gobject/tmpl/signals.sgml: Document the fact that + g_signal_connect_object() does *not* remove the signal + when the object is disconnected currently and describe + a workaround to prevent memory leaks. + +Tue Mar 9 09:16:11 2004 Owen Taylor + + * === Released 2.3.6 === + +Mon Mar 8 08:32:36 2004 Owen Taylor + + * glib/tmpl/main.sgml: Reference g_source_set_callback(), + not g_source_attach(). (Takeshi AIHANA) + +2004-02-29 Sebastian Wilhelmi + + * glib/glib-overrides.txt, glib/glib-sections.txt, + glib/tmpl/atomic_operations.sgml: Updated according to code changes. + +Sun Feb 29 02:35:00 2004 Sven Herzberg + + * glib/tmpl/limits.sgml: exchange non-existing G_MAX_DOUBLE for + G_MAXDOUBLE (fixes #135723) + +Fri Feb 27 22:10:25 2004 Matthias Clasen + + * glib/tmpl/modules.sgml: Reformat a bit. + +Fri Feb 27 22:05:23 2004 Matthias Clasen + + * glib/tmpl/limits.sgml: Document G_MAXSIZE. + +2004-02-26 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Updated to reflect removal of the PID + niceness surrogate for thread priorities. + + * glib/glib-overrides.txt, glib/glib-sections.txt, + glib/glib-docs.sgml, glib/tmpl/atomic_operations.sgml: Add docs + for atomic operations. + +Tue Feb 24 14:09:21 2004 Owen Taylor + + * === Released 2.3.3 === + + * glib/glib-sections.txt: Updates. + +Sun Feb 22 00:59:11 2004 Matthias Clasen + + * glib/tmpl/trees-nary.sgml: Document GCopyFunc. + +Sun Feb 22 00:54:17 2004 Matthias Clasen + + * glib/glib-sections.txt: Add GCopyFunc and g_node_copy_deep. + +2004-02-18 Sebastian Wilhelmi + + * glib/glib-sections.txt: Add the new g_rand_* functions + +Sat Feb 14 01:25:23 2004 Matthias Clasen + + * glib/glib-sections.txt: Add GPid, GChildWatchFunc, + g_child_watch_source_new, g_child_watch_add, + g_child_watch_add_full. + +Fri Feb 13 23:16:25 2004 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Fix a typo. + +Sat Feb 7 01:02:06 2004 Matthias Clasen + + * glib/tmpl/numerical.sgml: Fix some external links. + +Thu Feb 5 00:54:43 2004 Matthias Clasen + + * glib/glib-sections.txt: Add g_completion_complete_utf8. + +Fri Jan 30 23:25:58 2004 Matthias Clasen + + * glib/tmpl/iochannels.sgml: + * glib/tmpl/main.sgml: Remove references to deprecated GTK+ and + GDK functions. (#130756, Vincent Untz) + +Wed Jan 28 01:39:59 2004 Matthias Clasen + + * glib/glib-sections.txt: Add g_strsplit_set. (Soeren Sandmann) + +Thu Jan 22 14:51:19 2004 Owen Taylor + + * glib/glib-sections.txt glib/tmpl/timers.sgml: Document + g_timer_continue. (Tim-Philipp M??ller) + +Sun Jan 11 01:25:44 2004 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Improve docs for G_DEFINE_TYPE_* macros. + +Sun Jan 11 01:25:29 2004 Matthias Clasen + + * gobject/gobject-sections.txt: Add G_DEFINE_TYPE_EXTENDED. + +Sat Jan 10 02:18:32 2004 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Document the new GType boilerplate macros + with an example. + +Sat Jan 10 01:36:01 2004 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Document g_type_class_peek_static. + +Sat Jan 10 01:23:58 2004 Matthias Clasen + + * gobject/gobject-sections.txt: Add g_type_class_peek_static, + G_DEFINE_TYPE, G_DEFINE_TYPE_WITH_CODE, G_DEFINE_ABSTRACT_TYPE, + G_DEFINE_ABSTRACT_TYPE_WITH_CODE, G_IMPLEMENT_INTERFACE. + + +Sat Jan 10 01:23:01 2004 Matthias Clasen + + * gobject/tmpl/objects.sgml: Update docs of g_object_connect. + +Fri Jan 9 23:40:23 2004 Matthias Clasen + + * gobject/tmpl/gboxed.sgml: + * gobject/gobject-sections.txt: Add G_TYPE_STRV and GStrv. + +Fri Dec 26 02:04:49 2003 Matthias Clasen + + * glib/glib-sections.txt: Add g_ptr_array_foreach(). + +Sun Dec 21 01:01:34 2003 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: Document the encoding of + g_get_real_name(). + +Fri Dec 19 21:40:00 2003 Matthias Clasen + + * gobject/tmpl/signals.sgml: Rewording. + +Tue Dec 2 02:31:15 2003 Matthias Clasen + + * glib/tmpl/limits.sgml: + * glib/glib-sections.txt: Add G_{MIN,MAX,MAXU}INT{8,16,32}. + +Thu Nov 6 01:42:36 2003 Matthias Clasen + + * glib/glib-sections.txt: Add an i18n section. + * glib/glib-docs.sgml: Include the corresponding entity. + * glib/tmpl/i18n.sgml: Template for i18n section. + +Thu Nov 6 00:56:04 2003 Matthias Clasen + + * glib/running.sgml: Document G_FILENAME_ENCODING. + +Sat Oct 25 01:07:45 2003 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: + * gobject/tmpl/objects.sgml: Additions. + +Thu Oct 23 14:27:54 2003 Owen Taylor + + * gobject/Makefile.am: Add a dist-hook so that the + man pages get distributed. + + * glib/Makefile.am: Add a dist-hook so that the + man pages get distributed. + + * glib/Makefile.am (content_files): Add cross.sgml. + + * gobject/Makefile.am (INCLUDES): Add $(top_srcdir)/glib, + and (for gobject.cI) $(srcdir) + +Tue Oct 21 23:29:54 2003 Matthias Clasen + + * gobject/tmpl/gtypemodule.sgml: + * gobject/tmpl/enumerations_flags.sgml: + * gobject/tmpl/gtype.sgml: Additions. + +Tue Oct 21 23:09:15 2003 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/signals.sgml: Add "Since 2.4" markers where + appropriate. + +Tue Oct 14 17:45:33 2003 Owen Taylor + + * gobject/gobject-sections.txt gobject/tmpl/objects.sgml + gobject/tmpl/param_value_types.sgml gobject/tmpl/gparamspec.sgml: + Document interface properties and GParamSpecOverride. + +Mon Oct 20 22:05:37 2003 Matthias Clasen + + * gobject/tmpl/objects.sgml: + * gobject/tmpl/enumerations_flags.sgml: + * gobject/tmpl/gtypeplugin.sgml: Additions. + +Mon Oct 20 22:04:45 2003 Matthias Clasen + + * gobject/gobject-sections.txt: Add GObjectConstructParam. + +Mon Oct 20 20:38:06 2003 Matthias Clasen + + * gobject/gobject.i: Removed... + * gobject/gobject.cI: ...and readded. + * gobject/gobject.types: Change to the standard file + extension for included hunks of C code. + +Mon Oct 20 20:34:33 2003 Matthias Clasen + + * gobject/Makefile.am (INCLUDES): Add $(top_builddir)/glib + as an include dir again, this time for real. + +Mon Oct 20 01:12:46 2003 Matthias Clasen + + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/value_arrays.sgml: Additions. + + * gobject/tmpl/gboxed.sgml: + * gobject/gobject-sections.txt: Remove prematurely added + GStrv documentation. + +Sun Oct 19 22:18:28 2003 Matthias Clasen + + * gobject/Makefile.am (INCLUDES): Add $(top_builddir)/glib + as an include dir. (#124934, Mariano Su??rez-Alvarez) + +Sun Oct 19 00:33:28 2003 Matthias Clasen + + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/generic_values.sgml: + * gobject/tmpl/objects.sgml: + * gobject/tmpl/signals.sgml: Additions. + +Sat Oct 18 01:30:47 2003 Matthias Clasen + + * gobject/tmpl/gboxed.sgml: + * gobject/tmpl/gtypeplugin.sgml: + * gobject/tmpl/enumerations_flags.sgml: Additions. + +Sat Oct 18 00:04:22 2003 Matthias Clasen + + * gobject/gobject.types: List GObject here, since the + documentation misses the notify signal otherwise. Needs + a little bit of a hack to work around a gtkdoc-scangobj + limitation, see the comment in gobject/gobject.i. + + * gobject/gobject.i: New file, containing a trivial + g_object_get_type() function. + +Fri Oct 17 00:23:51 2003 Matthias Clasen + + * gobject/Makefile.am (GTKDOC_LIBS): + (INCLUDES): Add the necessary stuff to compile gobject-scan. + + * gobject/gobject.types: Add g_type_module_get_type() and + g_type_plugin_get_type(). + +Thu Oct 16 01:02:04 2003 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: Additions, document + GParamSpecPool. + +Wed Oct 15 00:56:30 2003 Matthias Clasen + + * gobject/tmpl/gclosure.sgml: Improvements from Owen's feedback. + +Tue Oct 14 02:35:45 2003 Matthias Clasen + + * gobject/gobject-sections.txt: Move the g_cclosure_marshal_* + functions to a non-private subsection, since these functions + are not private. + +Tue Oct 14 02:35:16 2003 Matthias Clasen + + * gobject/tmpl/gclosure.sgml: Fill in. + +Sun Oct 5 23:23:53 2003 Matthias Clasen + + * gobject/glib-sections.txt: + * gobject/gobject-sections.txt: Fix includes. + + * gobject/tmpl/value_collection.sgml: Add docs found in the + header. + +Thu Oct 2 01:22:46 2003 Owen Taylor + + * gobject/gobject-sections.txt gobject/tmpl/gtype.sgml: + Add g_type_add/remove_interface_check() + +2003-09-30 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: + * gobject/tmpl/signals.sgml: Additions. + + * glib/glib-sections.txt: Add g_unichar_get_mirror_char and + g_static_mutex_get_mutex_impl_shortcut. + +Mon Sep 29 10:55:23 2003 Owen Taylor + + * gobject/gobject-sections.txt gobject/tmpl/gtype.sgml: + Docs for g_type_default_interface_ref(), etc. + +Fri Sep 12 16:29:29 2003 Owen Taylor + + * gobject/tmpl/signals.sgml: Add docs for + g_signal_accumulator_true_handled. + +2003-09-12 Matthias Clasen + + * gobject/gobject-sections.txt: Add new g_value_take_x() functions. + + * gobject/tmpl/param_value_types.sgml: Document new g_value_take_x() + functions. (#100948) + +2003-08-05 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Add note about in-place editing to g_strdelimit() doc. + (#118875, Thomas Vander Stichele) + +2003-07-30 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: Move g_getenv() docs inline. + + * glib/tmpl/string_utils.sgml: Small fixes. + + * glib/glib-docs.sgml: Add paragraph about multi-threading policy. + + * glib/glib-sections.txt: Rename g_read_link to g_file_read_link. + +2003-07-29 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GINT{16,32,64}_MODIFIER, add note about scanning. + + * glib/glib-sections.txt: Add G_GINT{16,32,64}_MODIFIER. + +2003-07-28 Matthias Clasen + + * glib/glib-sections.txt: Add g_setenv(), g_unsetenv() and g_read_link(). (#100763, #72545) + +2003-07-26 Matthias Clasen + + * glib/tmpl/arrays.sgml: + * glib/tmpl/arrays_byte.sgml: + * glib/tmpl/arrays_pointer.sgml: + * glib/glib-sections.txt: Add g_{,byte,pointer}_array_remove_range. (#94879, Nalin Dahyabhai) + + * glib/tmpl/messages.sgml: Remove the note about the message length restriction. + +2003-07-24 Matthias Clasen + + * glib/tmpl/messages.sgml: Mention the restriction on message length. (#118043, Martyn Russell) + +2003-07-18 Matthias Clasen + + * glib/tmpl/arrays_pointer.sgml: Add a note about double indirection in + g_ptr_array_sort[_with_data](). (#113697, Owen Taylor) + +2003-07-12 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Add a paragraph about string precision, add links to it. + Remove markup which is now handled better by gtk-doc. + +2003-07-09 Matthias Clasen + + * glib/tmpl/threads.sgml: Document GOnce, GOnceStatus, G_ONCE_INIT, g_once and g_once_impl. + + * glib/glib-sections.txt: Add GOnce, GOnceStatus, G_ONCE_INIT, g_once and g_once_impl. + +2003-07-02 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Move g_strfreev() docs inline. + +2003-06-19 Matthias Clasen + + * glib/tmpl/misc_utils.sgml: Move g_path_get_basename() docs inline. + +2003-06-18 Matthias Clasen + +o * glib/glib-sections.txt: Add g_thread_init_glib to silence gtk-doc. + + * gobject/Makefile.am: Add rule to regenerate man pages from + Docbook. + (man_MANS): Add glib-mkenums.1, glib-genmarshal.1 and gobject-query.1. + (content_files): Add glib-mkenums.xml, glib-genmarshal.xml and + gobject-query.xml. + + * gobject/glib-mkenums.xml: + * gobject/glib-genmarshal.xml: + * gobject/gobject-query.xml: New refentries. + + * gobject/glib-mkenums.1: + * gobject/glib-genmarshal.1: + * gobject/gobject-query.1: Man pages generated from the .xml + sources. + + * gobject/gobject-docs.sgml: Include glib-mkenums.xml, + glib-genmarshal.xml and gobject-query.xml. + +2003-06-17 Matthias Clasen + + * glib/Makefile.am: Add rule to regenerate man pages from + Docbook. + (man_MANS): Add glib-gettextize.1. + (content_files): Add glib-gettextize.xml. + + * glib/glib-gettextize.xml: New refentry. + + * glib/glib-gettextize.1: Man page generated from the .xml source. + + * glib/glib-docs.sgml: Include glib-gettextize.xml. + +2003-06-17 Matthias Clasen + + * gobject/gobject-docs.sgml: + * glib/glib-docs.sgml: Add an autogenerated index. + +2003-06-17 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GNUC_DEPRECATED. + +2003-06-11 Matthias Clasen + + * gobject/tmpl/objects.sgml: A small addition. + +Sun Jun 8 12:28:39 2003 Owen Taylor + + * glib/tmpl/error_reporting.sgml: XML fix. + + * glib/glib-sections.txt: Updated. + +2003-06-06 Matthias Clasen + + * glib/tmpl/limits.sgml: Correct the documentation for + G_MINFLOAT and G_MINDOUBLE. (#114513, Christophe Fergeau) + + * glib/glib-sections.txt: Add g_vasprintf(). + + * glib/tmpl/string_utils.sgml: Add a hint about g_vasprintf() to + the g_strdup_printf() docs. + +2003-05-28 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Document that g_strdup() and + g_strndup() accept NULL. (#106987, Christian Biere) + +2003-05-12 Matthias Clasen + + * glib/cross.sgml: Fix a duplicate id left by copy-and-paste. + (#112785, Owen Taylor) + +2003-04-18 Matthias Clasen + + * gobject/tmpl/signals.sgml: Correct the documentation + GSignalEmissionHook (#110906) and some cleanups. + +2003-04-11 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: Fix a few typos. + +2003-04-09 Matthias Clasen + + * glib/glib-docs.sgml: Move dependencies to building.sgml. + + * glib/building.sgml: Move stuff from INSTALL here. + +2003-04-08 Matthias Clasen + + * glib/cross.sgml: New file; cross-compilation information. + * glib/glib-docs.sgml: Include cross.sgml. + +2003-04-07 Matthias Clasen + + * gobject/tmpl/enumerations_flags.sgml: Additions. + +2003-04-01 Matthias Clasen + + * glib/tmpl/error_reporting.sgml: + * glib/tmpl/random_numbers.sgml: + * glib/tmpl/arrays_pointer.sgml: + * glib/tmpl/arrays.sgml: Fix formatting of examples. + +2003-04-01 Matthias Clasen + + * glib/glib-sections.txt: Add g_string_chunk_insert_len. + +2003-03-28 Matthias Clasen + + * gobject/tmpl/param_value_types.sgml: Additions. + +2003-03-25 Matthias Clasen + + * gobject/tmpl/objects.sgml: Additions. + +2003-03-24 Matthias Clasen + + * gobject/tmpl/objects.sgml: Additions. + +Mon Mar 10 11:33:10 2003 Owen Taylor + + * gobject/tmpl/gtype.sgml gobject/gobject-sections.txt: + Document private instance data. + +2003-02-11 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Fix an off-by-one error in the + g_strescape() docs. (#105431, Phillip Vandry) + +2003-02-07 Matthias Clasen + + * gobject/tmpl/gtypemodule.sgml: + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/gclosure.sgml: + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/gparamspec.sgml: + * gobject/tmpl/objects.sgml: + * gobject/tmpl/signals.sgml: Move all docs out-of-line. Boy, what + a waste of time. + +2003-01-21 Matthias Clasen + + * glib/tmpl/strings.sgml: Document the return value of g_string_free(). + +2003-01-15 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Fix the description of + G_TYPE_FUNDAMENTAL. (#103119, Josh Parsons) + +2003-01-01 Tor Lillqvist + + * glib/tmpl/messages.sgml: Remove comment that only stdout would + be used on Windows, no longer true. + +2002-12-15 Matthias Clasen + + * gobject/tmpl/param_value_types.sgml: Move some docs inline. + +2002-12-15 Matthias Clasen + + * glib/Makefile.am (IGNORE_HFILES): Add gprintfint.h and trio. + +2002-12-13 Matthias Clasen + + * glib/Makefile.am (MKDB_OPTIONS): Add --ignore-files=trio to + avoid gtk-doc warnings about doxygen comments. + +Tue Dec 10 11:55:28 2002 Owen Taylor + + * glib/tmpl/timers.sgml: Improve docs for return value + and @microseconds out parameter. (Reported by + Dennis Haney, #100841) + +2002-12-10 Matthias Clasen + + * gobject/tmpl/generic_values.sgml: + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/enumerations_flags.sgml: Add docs. + +2002-12-09 Matthias Clasen + + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/enumerations_flags.sgml: Add docs. + + * gobject/tmpl/gtype.sgml: + * gobject/tmpl/gtypeplugin.sgml: + * gobject/tmpl/gtypemodule.sgml: + * gobject/gobject-sections.txt: Add GTypeClass, GTypePluginClass + and GTypeModuleClass. + + * gobject/tmpl/gboxed.sgml: + * gobject/tmpl/enumerations_flags.sgml: + * gobject/tmpl/gclosure.sgml: + * gobject/tmpl/param_value_types.sgml: Add docs. + +2002-12-06 Matthias Clasen + + * gobject/tmpl/gparamspec.sgml: Typo fix. + +2002-12-05 Matthias Clasen + + * glib/tmpl/strings.sgml: + * glib/tmpl/scanner.sgml: + * glib/tmpl/main.sgml: + * glib/tmpl/macros_misc.sgml: + * glib/tmpl/hash_tables.sgml: Add Since and Deprecation info + for symbols documented in the templates. + +2002-12-04 Matthias Clasen + + * gobject/tmpl/gtype.sgml: Add docs. + +2002-12-02 Matthias Clasen + + * gobject/tmpl/signals.sgml: Add docs. + +2002-12-01 Matthias Clasen + + * gobject/gobject-sections.txt: Mark g_signal_handlers_destroy as + private. + + * gobject/tmpl/signals.sgml: Move some docs inline. + +2002-11-29 Matthias Clasen + + * glib/tmpl/main.sgml: Write something about GSourceDummyMarshal. + + * glib/tmpl/date.sgml: + * glib/tmpl/string_utils.sgml: Remove redundant docs. + + * glib/glib-sections.txt: Add g_ascii_strtoull and + g_get_application_name. + +2002-11-28 Matthias Clasen + + * glib/tmpl/strings.sgml: + * glib/tmpl/string_utils.sgml: + * glib/tmpl/misc_utils.sgml: Move some docs inline. + +2002-11-23 Matthias Clasen + + * gobject/tmpl/gclosure.sgml: + * gobject/tmpl/signals.sgml: + * gobject/tmpl/gparamspec.sgml: + * gobject/tmpl/value_collection.sgml: + * gobject/tmpl/generic_values.sgml: + * gobject/tmpl/param_value_types.sgml: + * gobject/tmpl/gboxed.sgml: + * gobject/tmpl/enumerations_flags.sgml: + * gobject/tmpl/objects.sgml: + * gobject/tmpl/gtypemodule.sgml: + * gobject/tmpl/gtypeplugin.sgml: Add missing short descriptions, + standardize them to start with a capital and end without a period. + + * glib/tmpl/arrays.sgml: + * glib/tmpl/memory_chunks.sgml: + * glib/tmpl/macros.sgml: Remove periods from titles in examples. + + * glib/building.sgml: Explain --enable-include-printf. + + * glib/Makefile.am (extra_files): + * gobject/Makefile.am (extra_files): Add version.xml.in. + + * glib/Makefile.am (content_files): + * gobject/Makefile.am (content_files): Add version.xml. + + * glib/version.xml.in: + * gobject/version.xml.in: New files to let configure dump the version in. + + * glib/glib-docs.sgml: + * gobject/gobject-docs.sgml: Add version information. + + +Thu Nov 21 15:52:04 2002 Owen Taylor + + * glib/tmpl/iochannels.sgml: Add helpful comments about + the encoding of a new iochannel. (Amaury Jacquot, + #96444) + +2002-11-21 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Add note on including gprintf.h, + move some docs inline. + + * glib/glib-sections.txt: Add g_printf, g_vprintf, g_fprintf, + g_vfprintf, g_sprintf, g_vsprintf. + +2002-11-20 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_LIKELY, G_UNLIKELY. + + * glib/glib-sections.txt: Add G_LIKELY, G_UNLIKELY. + +2002-10-20 Matthias Clasen + + * gobject/Makefile.am (SCANOBJ_FILES): + * glib/Makefile.am (SCANOBJ_FILES): Add $(DOC_MODULE).prerequisites. + +2002-10-15 Matthias Clasen + + * gobject/gobject-sections.txt: Add g_type_interface_prerequisites. + +2002-10-14 Matthias Clasen + + * gobject/Makefile.am (dist-hook): + * glib/Makefile.am (dist-hook): Dist the xml/*.xml, not + sgml/*.sgml. (#95678, Owen Taylor) + +2002-10-14 Matthias Clasen + + * gobject/Makefile.am (SCANOBJ_FILES): + * glib/Makefile.am (SCANOBJ_FILES): Add $(DOC_MODULE).interfaces. + +2002-09-16 Matthias Clasen + + * glib/tmpl/messages.sgml: Replace G_LOG_FLAG_RECURSIVE by + G_LOG_FLAG_RECURSION throughout. (#93390) + +2002-08-12 Matthias Clasen + + * glib/glib-sections.txt: Add g_markup_parse_context_get_element + and g_utf8_strreverse. + +Thu Jul 25 18:58:29 2002 Owen Taylor + + * glib/tmpl/threads.sgml: Fix reference to non-existing + @priority parameter. (#88500, Linux Walleij) + +2002-06-03 Matthias Clasen + + * gobject/gobject-docs.sgml: + * glib/glib-docs.sgml: + * glib/tmpl/macros.sgml: + * glib/tmpl/string_utils.sgml: Replace homegrown "nbsp", "hash" + and "percent" entities by standard ISO entities "nbsp", "num" and + "percnt". + +2002-05-30 Matthias Clasen + + * glib/tmpl/string_utils.sgml: + * glib/tmpl/threads.sgml: Small formatting fixes. + +2002-05-26 Matthias Clasen + + * glib/tmpl/conversions.sgml: Add GIConv. + + * glib/tmpl/main.sgml: Fix references to nonexisting functions + g_main_loop_destroy(), g_source_add(), g_source_connect(). + + + * glib/glib-sections.txt: Add GIConv, g_str_has_prefix, g_str_has_suffix. + + * glib/tmpl/linked_lists_single.sgml: + * glib/tmpl/linked_lists_double.sgml: GListAllocator doesn't exist. + + * glib/glib-docs.sgml: Declare hash entity. + + * glib/tmpl/macros.sgml: Escape # in #ifdef to suppress erroneous links. + +2002-05-25 Matthias Clasen + + * gobject/Makefile.am, gobject/gobject-docs.sgml, gobject/tmpl/*: + * glib/Makefile.am, glib/glib-docs.sgml, glib/tmpl/*: Produce XML, + not SGML. + +2002-05-21 Matthias Clasen + + * glib/tmpl/markup.sgml: Updates. + +Sat May 18 00:44:35 2002 Tim Janik + + [merged from stable] + + * glib/tmpl/scanner.sgml: fix documentation for g_scanner_unexp_token(). + +2002-05-01 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Clarify recursion issues with + GMutex. (#78171) + +2002-04-24 Matthias Clasen + + * gobject/gobject-sections.txt: + * gobject/tmpl/gtype.sgml: Updates. + +2002-04-21 Matthias Clasen + + * glib/tmpl/strings.sgml: Fix the description of g_string_assign. (#78728) + +2002-04-18 Matthias Clasen + + * glib/tmpl/error_reporting.sgml: + * glib/tmpl/threads.sgml: + * glib/tmpl/arrays_pointer.sgml: + * glib/tmpl/arrays_byte.sgml: + * glib/tmpl/memory_chunks.sgml: s///g throughout the + documentation to bring the produced Docbook closer to XML. + +2002-03-25 Sven Neumann + + * glib/tmpl/scanner.sgml: Fixed documentation about unused struct + fields and added a note about proper g_scanner_unexp_token() usage. + +2002-03-11 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Add a note about g_strreverse() and + UTF-8. + +2002-02-21 Matthias Clasen + + * glib/Makefile.am (IGNORE_HFILES): Add gdebug.h. + + * glib/running.sgml: Document the G_DEBUG environment variable. + + * glib/tmpl/threads.sgml: Replace g_thread_wait() by + g_thread_join() in two places. + +2002-02-20 Sven Neumann + + * gobject/gobject-sections.txt + * gobject/tmpl/generic_values.sgml + * gobject/tmpl/param_value_types.sgml: updated for GValue changes. + +Tue Feb 19 17:45:43 2002 Tim Janik + + * gobject/tmpl/generic_values.sgml: added GValue documentation. + +Thu Feb 7 12:07:06 2002 Tim Janik + + * gobject/tmpl/generic_values.sgml: document value transformation. + +Mon Feb 4 17:55:39 2002 Tim Janik + + * gobject/tmpl/closures.sgml: doc common functions like ref/ + sink/unref/invalidate. + + * gobject/tmpl/objects.sgml: document g_object_watch_closure() and + qdata functions. + +Tue Jan 29 12:00:59 2002 Owen Taylor + + * gobject/gobject-sections.txt: Updated. + + * glib/running.sgml glib/changes-2.0.sgml: SGML fixes. + +2002-01-28 Ron Steinke + + * glib/iochannel.sgml: Changed #IOChannelError to + #GIOChannelError in one place + +2002-01-16 Matthias Clasen + + * glib/building.sgml, glib/compiling.sgml, + glib/running.sgml, glib/resources.sgml, + glib/changes-2.0.sgml: New files. + + * glib/Makefile.am (content_files): Add new files. + + * glib/glib-docs.sgml: Add an Overview chapter. + +2002-01-08 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Name the right function. + +2001-12-23 Matthias Clasen + + * glib/tmpl/main.sgml, glib/tmpl/string_utils.sgml, + glib/tmpl/strings.sgml: Replace references to deprecated + functions. + +2001-12-21 Matthias Clasen + + * glib/glib-sections.txt: Move g_get_charset() to the + Charset conversion section. (#65630) + +Wed Dec 19 23:07:53 2001 Owen Taylor + + * glib/tmpl/messages.sgml glib/tmpl/string_utils.sgml: + SGML fixes. + + * gobject/gobject-sections.txt glib/glib-sectoins.txt: Small updates. + +2001-12-15 Matthias Clasen + + * glib/tmpl/caches.sgml: GCs are cached by GTK, not by GDK. + +2001-12-14 Matthias Clasen + + * glib/tmpl/memory.sgml: Typo fixes. + +2001-12-13 Matthias Clasen + + * glib/tmpl/completion.sgml, glib/tmpl/date.sgml, + glib/tmpl/fileutils.sgml, glib/tmpl/iochannels.sgml, + glib/tmpl/macros.sgml, glib/tmpl/memory.sgml, + glib/tmpl/misc_utils.sgml, glib/tmpl/warnings.sgml, + glib/tmpl/windows.sgml: Revert mistaken change: it is UNIX, not Unix. + + * glib/tmpl/memory_chunks.sgml, + glib/tmpl/date.sgml, glib/tmpl/threads.sgml, + glib/tmpl/gtype.sgml: Trivial markup fixes. + +2001-12-12 Matthias Clasen + + * glib/tmpl/string_utils.sgml: Correct docs for g_[v]snprintf. + +2001-12-12 Matthias Clasen + + * glib/tmpl/allocators.sgml, glib/tmpl/arrays.sgml, + glib/tmpl/arrays_byte.sgml, glib/tmpl/arrays_pointer.sgml, + glib/tmpl/caches.sgml, glib/tmpl/completion.sgml, + glib/tmpl/conversions.sgml, + glib/tmpl/datalist.sgml, glib/tmpl/date.sgml, + glib/tmpl/error_reporting.sgml, glib/tmpl/fileutils.sgml, + glib/tmpl/hash_tables.sgml, + glib/tmpl/hooks.sgml, glib/tmpl/macros.sgml, + glib/tmpl/macros_misc.sgml, glib/tmpl/main.sgml, glib/tmpl/markup.sgml, + glib/tmpl/memory.sgml, glib/tmpl/memory_chunks.sgml, + glib/tmpl/messages.sgml, glib/tmpl/misc_utils.sgml, + glib/tmpl/modules.sgml, glib/tmpl/numerical.sgml, + glib/tmpl/patterns.sgml, glib/tmpl/queue.sgml, + glib/tmpl/shell.sgml, glib/tmpl/spawn.sgml, + glib/tmpl/string_utils.sgml, glib/tmpl/thread_pools.sgml, + glib/tmpl/threads.sgml, glib/tmpl/timers.sgml, + glib/tmpl/trees-binary.sgml, glib/tmpl/trees-nary.sgml, + glib/tmpl/type_conversion.sgml, glib/tmpl/unicode.sgml, + glib/tmpl/warnings.sgml, glib/tmpl/windows.sgml: + Improve markup of examples, general consistency improvements. + +2001-12-06 Havoc Pennington + + * glib/tmpl/messages.sgml: improve g_log_set_handler docs + +Wed Nov 28 18:50:19 2001 Owen Taylor + + * glib/glib-sections.txt: Update. + +2001-11-28 Sebastian Wilhelmi + + * glib/tmpl/date.sgml: Fix g_usleep docs. + +2001-11-26 Matthias Clasen + + * glib/tmpl/trees-binary.sgml: Document G_LEVEL_ORDER better. + +2001-11-22 Matthias Clasen + + Fixes for #61284: + + * glib/tmpl/windows.sgml: Document G_WIN32_DLLMAIN_FOR_DLL_NAME. + + * glib/tmpl/fileutils.sgml: Document GDir. + + * glib/tmpl/limits.sgml: Document G_MININT64, G_MAXINT64, G_MAXUINT64. + +Thu Nov 22 12:56:57 2001 Owen Taylor + + * gobject/gobject-sections.txt: Update. + + * glib/tmpl/{spawn.sgml,patterns.sgml}: SGML fixes. + + * glib/glib-sections.txt: Updated. + + * glib/Makefile.am (IGNORE_HFILES): Don't scan + headers in build/ + +Sat Nov 17 17:24:19 2001 Owen Taylor + + * glib/glib-sections.txt: Remove g_log_domain_glib + +2001-11-15 Matthias Clasen + + * glib/tmpl/iochannels.sgml: Document GIOFlags, fix typos. + + * glib/tmpl/conversions.sgml, glib/tmpl/unicode.sgml, + glib/tmpl/spawn.sgml, glib/tmpl/fileutils.sgml, + glib/tmpl/shell.sgml, glib/tmpl/windows.sgml: Add + some missing short and long descriptions. + +2001-11-14 Matthias Clasen + + * glib/Makefile.am (MKDB_OPTIONS): Add --sgml-mode. + + * glib/tmpl/patterns.sgml: Document UTF-8 support. + +Wed Nov 14 03:19:49 2001 Tim Janik + + * gobject/tmpl/param_value_types.sgml: more docs. + +Tue Nov 13 21:31:58 2001 Tim Janik + + * gobject/tmpl/param_value_types.sgml: list parameter and + value types. + + * gobject/tmpl/gparamspec.sgml: more docs for g_param_spec*() + functions. + + * gobject/*: section cleanups. + +Tue Nov 13 19:49:16 2001 Tim Janik + + * gobject/tmpl/gparamspec.sgml: param spec updates. + +2001-11-12 Matthias Clasen + + * glib/tmpl/markup.sgml: Remove excess listitem from long + description. + +2001-11-11 Matthias Clasen + + * glib/tmpl/unicode.sgml: Document GNormalizeMode enum. + + * glib/tmpl/spawn.sgml: Document GSpawnFlags flags. + + * glib/tmpl/error_reporting.sgml: Document GError struct. + + * glib/tmpl/main.sgml: Document GMainContext, GSource and + GSourceCallbackFuncs structs. + +2001-10-31 Matthias Clasen + + * glib/tmpl/messages.sgml, glib/tmpl/unicode.sgml: + Document g_log_domain_glib, gunichar, gunichar2, GUnicodeType, + GUnicodeBreakType. + +Fri Oct 26 11:42:50 2001 Owen Taylor + + * */Makefile.am: Remove $(srcdir)/html before building + HTML to prevent stale files. Dist all files in html/ + +2001-10-25 Havoc Pennington + + * glib/tmpl/string_utils.sgml: docs on why the deprecated + functions are deprecated. + +2001-10-15 Sven Neumann + + * glib/tmpl/random_numbers.sgml: fixed typo. + +Sat Oct 13 06:58:23 2001 Tim Janik + + * glib/tmpl/patterns.sgml: amended documentation. + +2001-10-11 Matthias Clasen + + * glib/tmpl/patterns.sgml, glib/tmpl/shell.sgml: Updates. + +2001-10-05 Matthias Clasen + + * glib/tmpl/hooks.sgml: Document G_HOOK_FLAG_USER_SHIFT. + + * glib/tmpl/trash_stacks.sgml: Document trash stacks. + + * glib/tmpl/async_queues.sgml, glib/tmpl/caches.sgml, + glib/tmpl/completion.sgml, glib/tmpl/patterns.sgml, + glib/tmpl/numerical.sgml, glib/tmpl/random_numbers.sgml, + glib/tmpl/relations.sgml, glib/tmpl/modules.sgml: Update. + +2001-10-05 Matthias Clasen + + * glib/tmpl/conversions.sgml: Update. + + * glib/tmpl/patterns.sgml: Update. + +2001-10-05 Matthias Clasen + + * glib/tmpl/hooks.sgml, glib/tmpl/spawn.sgml, + glib/tmpl/macros_misc.sgml: Update. + + * glib/tmpl/linked_lists_double.sgml, glib/tmpl/trees-binary.sgml, + glib/glib-sections.txt: Document GCompareDataFunc. + +2001-10-02 Matthias Clasen + + * glib/tmpl/iochannel.sgml, glib/tmpl/macros_misc.sgml, + glib/tmpl/queue.sgml: update docs. + + * glib/tmpl/modules.sgml, glib/tmpl/threads.sgml: Remove + references to glib-config. + +2001-10-01 Matthias Clasen + + * glib/tmpl/iochannels.sgml, glib/tmpl/shell.sgml, + glib/tmpl/spawn.sgml, glib/tmpl/memory.sgml, + glib/tmpl/macros.sgml, glib/tmpl/completion.sgml, + glib/tmpl/main.sgml, glib/tmpl/messages.sgml, + glib/tmpl/misc_utils.sgml, glib/tmpl/threads.sgml, + glib/tmpl/trees-nary.sgml, glib/tmpl/string_utils.sgml: + More markup fixes and completions. + +Mon Oct 1 15:59:46 2001 Owen Taylor + + * glib/tmpl/strings.sgml docs/glib-sections.txt: Rename + g_string_printfa(). to g_string_append_printf(). + +2001-10-01 Matthias Clasen + + * glib/glib-sections.txt: Move all *_error_quark() + functions to the 'Private' sections. (#61472) + +2001-10-01 Matthias Clasen + + * glib/tmpl/macros.sgml (G_CONST_RETURN): document + allowed uses for 'out' parameters. + +2001-10-01 Matthias Clasen + + * glib/tmpl/caches.sgml, glib/tmpl/datalist.sgml, + glib/tmpl/hash_tables.sgml, glib/tmpl/messages.sgml, + glib/tmpl/misc_utils.sgml: consistently refer to GTK+. + + * glib/tmpl/error_reporting.sgml, glib/tmpl/fileutils.sgml, + glib/tmpl/windows.sgml, glib/tmpl/modules.sgml, + glib/tmpl/linked_lists_single.sgml, glib/tmpl/trees-nary.sgml, + glib/tmpl/trees-binary.sgml, glib/tmpl/timers.sgml: Markup fixes. + +2001-09-30 Matthias Clasen + + * glib/tmpl/arrays.sgml,glib/tmpl/arrays_byte.sgml + glib/tmpl/arrays_pointer.sgml, glib/tmpl/caches.sgml, + glib/tmpl/datalist.sgml, glib/tmpl/date.sgml, + glib/tmpl/datasets.sgml, glib/tmpl/type_conversion.sgml, + glib/tmpl/memory.sgml, glib/tmpl/hash_tables.sgml: + Markup fixes and a few additions. + +2001-09-27 Matthias Clasen + + * glib/tmpl/macros.sgml, glib/tmpl/macros_misc.sgml, + glib/tmpl/scanner.sgml: Additions and markup fixes. + +2001-09-27 Matthias Clasen + + * glib/tmpl/warnings.sgml, glib/tmpl/linked_lists_double.sgml, + glib/tmpl/completion.sgml, glib/tmpl/strings.sgml: Documented + some functions, markup fixes. + * glib/tmpl/patterns.sgml: New file. + * glib/glib-docs.sgml: Add entity for patterns.sgml. + +2001-09-26 Matthias Clasen + + * glib/glib-sections.txt: Add g_mem_is_system_malloc. + +2001-09-25 Matthias Clasen + + * glib/glib-sections.txt: Add a missing SECTION + endtag. (#61126) + +2001-09-17 Darin Adler + + * glib/tmpl/string_utils.sgml: Fix a typo and change + documentation for g_ascii_isdigit and g_ascii_isxdigit + to reflect the fact that the standard isdigit and + isxdigit are already locale-independent. + +Wed Sep 5 05:24:07 2001 Tim Janik + + * gobject/tmpl/gboxed.sgml: documented some functions. + + * gobject/tmpl/objects.sgml: some fixups. + +Mon Sep 10 11:37:02 2001 Owen Taylor + + * glib/glib-sections.txt: Update. + +Sat Sep 8 14:13:44 2001 Owen Taylor + + * glib/Makefile.am (IGNORE_HFILES): Add + gbsearcharray.h. + + * gobject/Makefile.am (IGNORE_HFILES): Remove + gbsearcharray.h. + +2001-08-15 Ron Stenike + + * docs/reference/glib/glib-sections.txt: Added + declarations for g_io_channel_[set,get]_close_on_unref + +Sun Aug 12 10:03:42 2001 Owen Taylor + + * */Makefile.am: Set GPATH to fix srcdir != builddir + problems with GNU make. + +Sun Aug 12 02:24:36 2001 Tim Janik + + * gobject/tmpl/value_arrays.sgml: document value arrays. + +2001-08-06 Sven Neumann + + * docs/reference/gobject/gobject-sections.txt + * docs/reference/gobject/tmpl/objects.sgml: added documentation for + g_object_[add|remove]_weak_pointer(). + +2001-07-19 Darin Adler + + reviewed by: + + * glib/tmpl/string_utils.sgml: + +2001-06-03 Matthias Clasen + + * glib/tmpl/caches.sgml, glib/tmpl/main.sgml, + gobject/gobject-docs.sgml, gobject/tmpl/generic_values.sgml, + gobject/tmpl/gtypemodule.sgml, gobject/tmpl/signals.sgml, + gobject/tmpl/types.sgml: fix some typos. + +Thu Jun 28 17:43:29 2001 Owen Taylor + + * glib/tmpl/memory.sgml glib/tmpl/macros_misc.sgml: Add + notes about inclusion of string.h to docs on g_memmove, + G_VA_COPY. (#54411) + +Tue Jun 26 12:28:20 2001 Owen Taylor + + * glib/Makefile.am: Fix problem with glibconfig.h + +2001-06-26 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml (example): Corrected. + +2001-06-07 Sebastian Wilhelmi + + * glib/glib-sections.txt, glib/tmpl/date.sgml: Add g_time_val_add. + + * glib/tmpl/threads.sgml: Updated. + +2001-05-23 Sebastian Wilhelmi + + * glib/tmpl/arrays.sgml, glib/tmpl/arrays_pointers.sgml, + glib/tmpl/arrays_byte.sgml: Corrected documentation for the + ..._sized_new functions. Discovered by noon@users.sourceforge.net. + +2001-05-19 Havoc Pennington + + * glib/Makefile.am (IGNORE_HFILES): add glibintl.h + + * glib/tmpl/*.sgml: fix various missing docs + +2001-05-18 Sebastian Wilhelmi + + * glib/glib-overrides.txt, glib/glib-sections.txt, + glib/tmpl/thread_pools.sgml, glib/tmpl/threads.sgml: Updated. + +2001-05-09 Sebastian Wilhelmi + + * glib/tmpl/thread_pools.sgml, glib/tmpl/thread_pools.sgml: + Updates after some renaming took place. + +2001-05-08 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml, glib/glib-overrides.txt: Updated. + + * glib/tmpl/threads.sgml: Clarification for g_mutex_trylock. + +2001-04-19 Sebastian Wilhelmi + + * glib/tmpl/hash_tables.sgml, glib/tmpl/misc_utils.sgml, + glib/tmpl/scanner.sgml: Changes due to deprecation update. + +Mon Apr 16 12:18:26 2001 Owen Taylor + + * {glib,gobject}/Makefile.am (tmpl-build.stamp): More tweaks + from GTK+. Reenable $(HTML_IMAGES) with shell portability fixes. + +Wed Apr 4 00:56:00 2001 Tim Janik + + * gobject/Makefile.am: disabled "for i in $(HTML_IMAGES) ;" + dist-hook because $(HTML_IMAGES) is empty. + +Tue Apr 3 11:51:02 2001 Owen Taylor + + * {glib,gobject}/Makefile.am (sgml-build.stamp): Add + explicit path to tmpl files in dependencies. + + * glib/glib.types gobject/gobject.types: empty files + to keep generic makefiles happy. + +2001-04-03 Sebastian Wilhelmi + + * glib/glib-sections.txt: Removed + g_static_private_(get|set)_for_thread. + + * glib/tmpl/threads.sgml: Updated. + + * glib/tmpl/thread_pools.sgml: Added GThreadPool documentation. + +Mon Mar 26 14:20:36 2001 Owen Taylor + + * glib/Makefile.am (SCAN_OPTIONS): Add --deprecated-guards + +Sat Mar 17 17:51:17 2001 Owen Taylor + + * gobject/Makefile.am glib/Makefile.am: A couple + of small fixes. + +2001-03-08 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Spelling corrections. + +Wed Mar 7 15:02:17 2001 Owen Taylor + + * gobject/Makefile.am: Revert Tim's last commit to + get rid of 7+ unnecessary / broken changes. Add + back the useful part. Also fix problem with grep, + add dependency on template files. + + * gobject/gobject-sections.txt: Remove double + value_types names which was screwing up builds. + + * glib/Makefile.am: Propagate changes from + gobject/Makefile.am + +2001-03-07 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Fixed stupid typo. + +2001-03-07 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Completed. + +Wed Mar 7 09:33:27 2001 Tim Janik + + * gobject/Makefile.am: shuffled rules to avoid excessive + rebuilds. + + * gobject/gobject-sections.txt: updates. + + * gobject/tmpl/*: bunch of updates, added another patch + from Eric Lemings . + +2001-03-07 Sebastian Wilhelmi + + * glib/glib-sections.txt, glib/tmpl/messages.sgml: Removed + g_log_domain_gmodule. + +2001-02-23 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml: Big update. Almost ready. + + * glib/tmpl/async_queues.sgml: Typo. + + * glib/glib-sections.txt: Added g_static_rec_mutex_init, + g_static_rec_mutex_free, g_static_rw_lock_init, + g_static_private_init and g_static_private_free. + + * glib/glib-overrides.txt: Added g_thread_yield and g_thread_exit. + +Fri Feb 16 06:52:20 2001 Tim Janik + + * gobject/tmpl/types.sgml: incorporated huge docu patch from Eric + Lemings with a bunch of editing on my part. + +Mon Feb 12 12:42:45 2001 Owen Taylor + + * {glib,gobject}/Makefile.am: The ultimate gtk-doc makefile. + +2001-02-01 Sebastian Wilhelmi + + * glib/tmpl/threads.sgml, glib/glib-sections.txt: Added + documentation for g_static_mutex_init(). + +Wed Jan 31 07:14:22 2001 Tim Janik + + * gobject/Makefile.am: adapt to work with new CVS gtk-doc, leaving the old + rules in place caused bogus recursions. main changes: + - add to conditionalized section: + all-local: + $(MAKE) scan + $(MAKE) templates + $(MAKE) sgml + $(MAKE) html.stamp + html.stamp: sgml.stamp $(EXTRA_SGML_FILES) + $(MAKE) html + DOC_STAMPS= html.stamp sgml.stamp + - change: + maintainer-clean-local: clean + - cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + + cd $(srcdir) && rm -rf sgml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt $(DOC_STAMPS) + + * glib/Makefile.am (maintainer-clean-local): dito. + +Wed Jan 31 06:21:32 2001 Tim Janik + + * gobject/tmpl/types.sgml: applied docu patch from Eric Lemings + , did some more editing. + +2001-01-30 Sebastian Wilhelmi + + * glib/glib-sections.txt, glib/tmpl/threads.sgml: Added + g_static_mutex_free(). + +Tue Jan 9 03:10:38 2001 Tim Janik + + * gobject/tmpl/types.sgml: added some function documentations. + + * gobject/gobject-sections.txt: buncha fixups. + +Fri Jan 5 15:47:10 2001 Owen Taylor + + * glib/glib-sections.txt glib/tmpl/* glib/Makefile.am: Updated. + +2000-12-22 Sebastian Wilhelmi + + * glib/glib-sections.txt: Added G_MODULE_SUFFIX. + + * glib/tmpl/modules.sgml: Updated. + +2000-12-19 Sebastian Wilhelmi + + * glib/glib-sections.txt: Added g_rand_boolean and + g_random_boolean macros. + + * glib/tmpl/random_numbers.sgml: Updated. + +Tue Dec 5 15:41:23 2000 Owen Taylor + + * glib/Makefile.am glib/mainloop-states*: add images + + * glib/glib-sections.txt: Updated + + * glib/tmpl/main.sgml: More documentation, move function + docs to .c file. + +Mon Nov 13 00:18:55 2000 Owen Taylor + + * glib/glib-sections.sgml: Move conversion functions + into GConv section. + + * gobject/gobject-docs.sgml: Fix some malformed sgml. + +Sun Nov 5 13:24:50 2000 Owen Taylor + + * gobject/Makefile.am gobject/gobject-sections.sgml: Updates + * gobject/tmpl/g{boxed,type{plugin,module}}.sgml: added + +2000-11-05 Havoc Pennington + + * glib/tmpl/markup.sgml: Write docs + +2000-11-05 Havoc Pennington + + * glib/glib-sections.txt: remove parens from section name, + confuses gtk-doc + + * glib/glib-docs.sgml: Add the new files here, doh. + + * glib/tmpl/shell.sgml: add gshell.[hc] docs + +2000-11-05 Havoc Pennington + + * glib/tmpl/error_reporting.sgml: fixes + +2000-11-05 Havoc Pennington + + * glib/tmpl/spawn.sgml, glib/tmpl/markup.sgml, + glib/tmpl/fileutils.sgml: Added + + * glib/Makefile.am: Add new files + + * glib/glib-sections.txt: Add stuff from -unused + +Fri Nov 3 07:33:15 2000 Tim Janik + + * gobject/gobject-docs.sgml: added &gobject-closures; section. + + * gobject/Makefile.am (tmpl_sources): add tmpl/clsoures.sgml + + * gobject/gobject-sections.txt: added Closure section. + + * gobject/tmpl/closures.sgml: new file with template description + for GClosure functions. + +2000-11-02 Sebastian Wilhelmi + + * glib/tmpl/glib-unused.sgml: Remove superfluous GSearchFunc. + + * glib/tmpl/async_queues.sgml, glib/glib-sections.txt: Added + documentation for asynchronous queues. + +2000-10-31 Sebastian Wilhelmi + + * glib/tmpl/linked_lists_single.sgml: This time the right fix. + + * glib/tmpl/scanner.sgml, glib/tmpl/strings.sgml: Changed + parameter names. + + * glib/tmpl/string_utils.sgml: Corrected the documentation of + g_strescape and added those of g_strcompress. + +2000-10-30 Sebastian Wilhelmi + + * glib/tmpl/limits.sgml: Added documentation for + G_MAXU(INT|SHORT|LONG). + + * glib/tmpl/macros_misc.sgml: Added documentation for + G_G(U)INT(16|32|64)_FORMAT. + + * glib/tmpl/types.sgml: Mention G_MAXU(INT|SHORT|LONG) in + documentation for gu(int|short|long). + + * glib/glib-sections.txt, glib/tmpl/linked_lists_double.sgml, + glib/tmpl/caches.sgml: Move GCompareFunc to GList and introduce + and document GEqualFunc in GHashTable. + + * glib/tmpl/caches.sgml, glib/tmpl/hash_tables.sgml, + glib/tmpl/relations.sgml : Changed to reflect the changed API + (GCompareFunc -> GEqualFunc). + + * glib/tmpl/linked_lists_single.sgml, glib/tmpl/threads.sgml: Typo + fixes. + +Mon Oct 30 11:13:12 2000 Tim Janik + + * gobject/tmpl/signals.sgml: start at general description. + + * gobject/gobject-docs.sgml: added introduction. + +Mon Oct 30 06:01:43 2000 Tim Janik + + * gobject/gobject-sections.txt: opened up a new section on signals. + +2000-10-27 Sebastian Wilhelmi + + * glib/tmpl/misc_utils.sgml: Removed the win32 limitation. + + * glib/glib-sections.txt, glib/tmpl/hash_tables.sgml, + glib/tmpl/macros_misc.sgml, glib/tmpl/misc_utils.sgml, + glib/tmpl/scanner.sgml: Document the recently deprecated functions + as such. + +2000-10-15 Raja R Harinath + + 'make distcheck' fixes. + * glib/Makefile.am (EXTRA_DIST): Add $(DOC_MODULE)-decl.txt. + (html): Run 'gtkdoc-fixxref' in $(srcdir). + (dist-check-gtkdoc): Add missing quote. + (dist-hook): Copy in dependency order, so that none of the + makerules are fired in a tarball build. + + * gobject/Makefile.am: Likewise. + +2000-10-13 Sebastian Wilhelmi + + * glib/glib-sections.txt: Added misc items. + + * glib/tmpl/random_numbers.sgml: Documentation for the random + number generator. + +2000-10-09 Raja R Harinath + + * gobject/Makefile.am (DOC_SOURCE_DIR): Don't set to + $top_srcdir)/gobject. + * glib/Makefile.am (DOC_SOURCE_DIR): Don't set to $(top_srcdir), + +2000-09-29 Jonathan Blandford + + * glib/tmpl/trees-nary.sgml: Add g_node_insert_after(). + +Thu Sep 7 12:35:35 2000 Owen Taylor + + * Some further makefile improvement. + + * Restore all the docs that mysteriously vanished earlier. + +Wed Sep 6 10:59:45 2000 Owen Taylor + + * gobject/Makefile.am glib/Makefile.am: Improve + separation of generic non-generic parts and dependencies. + +Tue Sep 5 20:03:25 2000 Owen Taylor + + * Moved into glib source tree, updated glib-sections.txt + and Makefile.am for glib-1.3.x. + +2000-07-01 Damon Chaplin + + * tmpl/string_utils.sgml: updated g_strndup. + +2000-06-11 Damon Chaplin + + * tmpl/messages.sgml: updated a bit more. + +2000-06-11 Damon Chaplin + + * tmpl/messages.sgml: updated a few bits about log handlers & flags. + +2000-04-16 Damon Chaplin + + * tmpl/linked_lists_single.sgml: + * tmpl/linked_lists_double.sgml: + * tmpl/trees-nary.sgml: updated. + + * tmpl/modules.sgml: described g_module_build_path(). + + * tmpl/date.sgml: made short description lower case and end in a '.'. + + * glib-sections.txt: rearranged GDate section. + + * tmpl/arrays.sgml: + * tmpl/arrays_byte.sgml: + * tmpl/arrays_pointer.sgml: updated. + +2000-02-21 Damon Chaplin + + * tmpl/main.sgml: updated the g_source_remove_by_XXX() descriptions + to note that only the first source found is removed. + +2000-01-25 Damon Chaplin + + * tmpl/misc_utils.sgml: g_bit_nth_lsf/msf docs from + Nils Rennebarth , and updates for + GVoidFunc & GFreeFunc. + +1999-12-02 Sebastian Wilhelmi + + * glib-sections.txt, tmpl/threads.sgml: Removed + G_THREADS_IMPL_NSPR. Shouldn't be used anyway. + + * glib-overrides.txt: New file, that makes most of the thread + related macros look like functions. + + * Makefile.am: Added glib-overrides.txt to EXTRA_DIST. + + * tmpl/threads.sgml: Minor updates. + +Tue Aug 17 08:42:17 1999 Owen Taylor + + * tmpl/datasets.sgml: Added missing + * tmpl/timers.sgml: Added missing + * tmpl/misc_utils.sgml: Added missing + * tmpl/linked_lists_double.sgml: Added missing + * tmpl/linked_lists_single.sgml: Added missing + * tmpl/threads.sgml: Removed extra s. + * tmpl/main.sgml: Added missing + +Wed Aug 18 23:38:52 1999 Owen Taylor + + * README: Added some simple build instructions. + +Wed Aug 18 23:11:28 1999 Owen Taylor + + * Import into CVS of glib-reference-1.1.3 + Filled in some basic contents for AUTHORS + README, and README.cvs + diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am new file mode 100644 index 0000000..63cf90d --- /dev/null +++ b/docs/reference/Makefile.am @@ -0,0 +1,3 @@ +include $(top_srcdir)/Makefile.decl + +SUBDIRS = glib gobject gio diff --git a/docs/reference/Makefile.in b/docs/reference/Makefile.in new file mode 100644 index 0000000..4d008f1 --- /dev/null +++ b/docs/reference/Makefile.in @@ -0,0 +1,724 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines +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@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl AUTHORS COPYING ChangeLog NEWS +subdir = docs/reference +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +SUBDIRS = glib gobject gio +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu docs/reference/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu 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_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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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) check-am \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am check-local 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 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/NEWS b/docs/reference/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/docs/reference/README b/docs/reference/README new file mode 100644 index 0000000..8950281 --- /dev/null +++ b/docs/reference/README @@ -0,0 +1,63 @@ +This package contains the reference documentation +for GLib. For more information about Glib, +see: + + http://www.gtk.org + +For information about contributing to the +GLib/GTK+ reference documentation project, see: + + http://www.gtk.org/rdp/ + +The GLib reference documentation is freely redistributable, +see the file COPYING for details. + + +REQUIREMENTS +============ + +To build the documentation, you must have the gtk-doc +package installed. To rebuild the template files, +you must have the current version of the GLib +header files installed. + + +BUILD +===== + +First, run configure to generate the makefiles for this +module. There is one option specific to this package + + --with-html-dir=DIR top of installed HTML documentation tree + + +The Makefiles for this module define three targets: + + templates: + + Scan the headers and merge the results with the current + template files + + sgml: + + Generate SGML files using the DocBook DTD from + the template files + + html: + + Generate HTML from the SGML files. + +To build the documentation, do: + + make sgml + make html + +You should only run the 'make templates' step if you +need to regenerate the templates for a more recent +version of the GLib sources. + + +INSTALLATION +============ + + make install diff --git a/docs/reference/gio/Makefile.am b/docs/reference/gio/Makefile.am new file mode 100644 index 0000000..2c51c7e --- /dev/null +++ b/docs/reference/gio/Makefile.am @@ -0,0 +1,125 @@ +include $(top_srcdir)/Makefile.decl +NULL = + +# The name of the module. +DOC_MODULE=gio + +# The top-level SGML file. +DOC_MAIN_SGML_FILE=gio-docs.xml + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED" + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR=$(top_srcdir)/gio + +HFILE_GLOB=$(top_srcdir)/gio/*.h +CFILE_GLOB=$(top_srcdir)/gio/*.c + +# Headers to ignore +IGNORE_HFILES= \ + asyncns.h \ + fam-helper.h \ + fen-data.h \ + fen-helper.h \ + fen-kernel.h \ + fen-node.h \ + gasynchelper.h \ + gcontenttypeprivate.h \ + gdummyfile.h \ + gfamdirectorymonitor.h \ + gfamfilemonitor.h \ + gfileattribute-priv.h \ + gfileinfo-priv.h \ + ginotifydirectorymonitor.h \ + ginotifyfilemonitor.h \ + gio-marshal.h \ + gio.h \ + gioalias.h \ + gioalias.h \ + gioenumtypes.h \ + giomodule-priv.h \ + glocaldirectorymonitor.h \ + glocalfile.h \ + glocalfileenumerator.h \ + glocalfileinfo.h \ + glocalfileinputstream.h \ + glocalfilemonitor.h \ + glocalfileoutputstream.h \ + glocalvfs.h \ + gnativevolumemonitor.h \ + gnetworkingprivate.h \ + gpollfilemonitor.h \ + gthreadedresolver.h \ + gunionvolumemonitor.h \ + gunixdrive.h \ + gunixresolver.h \ + gunixvolume.h \ + gvolumeprivate.h \ + gwin32appinfo.h \ + gwin32resolver.h \ + inotify-diag.h \ + inotify-helper.h \ + inotify-kernel.h \ + inotify-missing.h \ + inotify-path.h \ + inotify-sub.h \ + local_inotify.h \ + local_inotify_syscalls.h \ + xdgmime.h \ + xdgmimealias.h \ + xdgmimecache.h \ + xdgmimeglob.h \ + xdgmimeint.h \ + xdgmimemagic.h \ + xdgmimeparent.h \ + xdgmimeicon.h \ + winhttp.h \ + $(NULL) + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +INCLUDES = \ + -I$(srcdir) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gobject \ + -I$(top_srcdir)/gio \ + -I$(top_builddir) \ + -I$(top_builddir)/glib \ + -I$(top_builddir)/gobject \ + -I$(top_builddir)/gio \ + $(GLIB_DEBUG_FLAGS) + +GTKDOC_LIBS = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + $(top_builddir)/gio/libgio-2.0.la \ + $(NULL) + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --output-format=xml --sgml-mode --name-space=g \ + --ignore-files=libasyncns + +# Images to copy into HTML directory +HTML_IMAGES = \ + gvfs-overview.png + +content_files = \ + version.xml \ + overview.xml \ + migrating.xml + +expand_content_files = \ + overview.xml \ + migrating.xml + +extra_files = \ + version.xml.in \ + gvfs-overview.odg + +include $(top_srcdir)/gtk-doc.make + +EXTRA_DIST += \ + version.xml.in diff --git a/docs/reference/gio/Makefile.in b/docs/reference/gio/Makefile.in new file mode 100644 index 0000000..72e30e8 --- /dev/null +++ b/docs/reference/gio/Makefile.in @@ -0,0 +1,853 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +# -*- 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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/version.xml.in $(top_srcdir)/Makefile.decl \ + $(top_srcdir)/gtk-doc.make +subdir = docs/reference/gio +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package +EXTRA_DIST = $(content_files) $(HTML_IMAGES) $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt \ + version.xml.in +TEST_PROGS = +NULL = + +# The name of the module. +DOC_MODULE = gio + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = gio-docs.xml + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="G_DISABLE_DEPRECATED" + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR = $(top_srcdir)/gio +HFILE_GLOB = $(top_srcdir)/gio/*.h +CFILE_GLOB = $(top_srcdir)/gio/*.c + +# Headers to ignore +IGNORE_HFILES = \ + asyncns.h \ + fam-helper.h \ + fen-data.h \ + fen-helper.h \ + fen-kernel.h \ + fen-node.h \ + gasynchelper.h \ + gcontenttypeprivate.h \ + gdummyfile.h \ + gfamdirectorymonitor.h \ + gfamfilemonitor.h \ + gfileattribute-priv.h \ + gfileinfo-priv.h \ + ginotifydirectorymonitor.h \ + ginotifyfilemonitor.h \ + gio-marshal.h \ + gio.h \ + gioalias.h \ + gioalias.h \ + gioenumtypes.h \ + giomodule-priv.h \ + glocaldirectorymonitor.h \ + glocalfile.h \ + glocalfileenumerator.h \ + glocalfileinfo.h \ + glocalfileinputstream.h \ + glocalfilemonitor.h \ + glocalfileoutputstream.h \ + glocalvfs.h \ + gnativevolumemonitor.h \ + gnetworkingprivate.h \ + gpollfilemonitor.h \ + gthreadedresolver.h \ + gunionvolumemonitor.h \ + gunixdrive.h \ + gunixresolver.h \ + gunixvolume.h \ + gvolumeprivate.h \ + gwin32appinfo.h \ + gwin32resolver.h \ + inotify-diag.h \ + inotify-helper.h \ + inotify-kernel.h \ + inotify-missing.h \ + inotify-path.h \ + inotify-sub.h \ + local_inotify.h \ + local_inotify_syscalls.h \ + xdgmime.h \ + xdgmimealias.h \ + xdgmimecache.h \ + xdgmimeglob.h \ + xdgmimeint.h \ + xdgmimemagic.h \ + xdgmimeparent.h \ + xdgmimeicon.h \ + winhttp.h \ + $(NULL) + + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +INCLUDES = \ + -I$(srcdir) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gobject \ + -I$(top_srcdir)/gio \ + -I$(top_builddir) \ + -I$(top_builddir)/glib \ + -I$(top_builddir)/gobject \ + -I$(top_builddir)/gio \ + $(GLIB_DEBUG_FLAGS) + +GTKDOC_LIBS = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + $(top_builddir)/gio/libgio-2.0.la \ + $(NULL) + + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --output-format=xml --sgml-mode --name-space=g \ + --ignore-files=libasyncns + + +# Images to copy into HTML directory +HTML_IMAGES = \ + gvfs-overview.png + +content_files = \ + version.xml \ + overview.xml \ + migrating.xml + +expand_content_files = \ + overview.xml \ + migrating.xml + +extra_files = \ + version.xml.in \ + gvfs-overview.odg + +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(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) +DOC_STAMPS = scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + pdf-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \ + $(srcdir)/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 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu docs/reference/gio/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/reference/gio/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): +version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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: check-am install-am install-strip + +.PHONY: all all-am all-local check check-am check-local 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 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +@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 + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + 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: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + @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 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(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 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/html + @mkdir $(srcdir)/html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options=--path="$(srcdir)"; \ + fi; \ + cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + @cd $(srcdir) && 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 'gtk-doc: Building PDF' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/$(DOC_MODULE).pdf + @mkpdf_imgdirs=""; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +distclean-local: + cd $(srcdir) && \ + rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html + +install-data-local: + @installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- 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 '-- Installing '$$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; \ + mv -f $${installdir}/$(DOC_MODULE).devhelp \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \ + 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 $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + cp $(srcdir)/html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +# 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/gio/gio-docs.xml b/docs/reference/gio/gio-docs.xml new file mode 100644 index 0000000..c7561d4 --- /dev/null +++ b/docs/reference/gio/gio-docs.xml @@ -0,0 +1,170 @@ + + + +]> + +GIO Reference Manual + + GIO Reference Manual + + for GIO &version; + The latest version of this documentation can be found on-line at + http://library.gnome.org/devel/gio/unstable/. + + + + + + + API Reference + + File Operations + + + + + + + + + File System Monitoring + + + + Asynchronous I/O + + + + + + + Data conversion + + + + + + + Streaming I/O + + + + + + + + + + + + + + + + + + + + + + + File types and applications + + + + + + Volumes and Drives + + + + + + + + Icons + + + + + + + + + Failable Initialization + + + + + Lowlevel platform-independent network support + + + + + + + + + + + DNS resolution + + + + + + + + Highlevel network functionallity + + + + + + + + Utilities + + + + Extending GIO + + + + + + + + + + Object Hierarchy + + + + + Index + + + + Index of deprecated symbols + + + + Index of new symbols in 2.18 + + + + Index of new symbols in 2.20 + + + + Index of new symbols in 2.22 + + + + Index of new symbols in 2.24 + + + diff --git a/docs/reference/gio/gio-overrides.txt b/docs/reference/gio/gio-overrides.txt new file mode 100644 index 0000000..e69de29 diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt new file mode 100644 index 0000000..9849a04 --- /dev/null +++ b/docs/reference/gio/gio-sections.txt @@ -0,0 +1,2077 @@ +
+ginitable +GInitable +GInitable +GInitableIface +g_initable_init +g_initable_new +g_initable_new_valist +g_initable_newv + +G_INITABLE +G_INITABLE_GET_IFACE +G_IS_INITABLE +G_TYPE_INITABLE +G_TYPE_IS_INITABLE + +g_initable_get_type +
+ +
+gasyncinitable +GAsyncInitable +GAsyncInitable +GAsyncInitableIface +g_async_initable_init_async +g_async_initable_init_finish +g_async_initable_new_async +g_async_initable_new_finish +g_async_initable_new_valist_async +g_async_initable_newv_async + +G_ASYNC_INITABLE +G_ASYNC_INITABLE_GET_IFACE +G_IS_ASYNC_INITABLE +G_TYPE_ASYNC_INITABLE +G_TYPE_IS_ASYNC_INITABLE + +g_async_initable_get_type +
+ +
+gvfs +GVfs +GVfs +G_VFS_EXTENSION_POINT_NAME +g_vfs_get_file_for_path +g_vfs_get_file_for_uri +g_vfs_parse_name +g_vfs_get_default +g_vfs_get_local +g_vfs_is_active +g_vfs_get_supported_uri_schemes + +GVfsClass +G_VFS +G_IS_VFS +G_TYPE_VFS +G_VFS_CLASS +G_IS_VFS_CLASS +G_VFS_GET_CLASS + +g_vfs_get_type +
+ +
+gfile +GFile +GFile +GFileIface +GFileQueryInfoFlags +GFileCreateFlags +GFileCopyFlags +GFileMonitorFlags +GFilesystemPreviewType +GFileProgressCallback +GFileReadMoreCallback +g_file_new_for_path +g_file_new_for_uri +g_file_new_for_commandline_arg +g_file_parse_name +g_file_dup +g_file_hash +g_file_equal +g_file_get_basename +g_file_get_path +g_file_get_uri +g_file_get_parse_name +g_file_get_parent +g_file_has_parent +g_file_get_child +g_file_get_child_for_display_name +g_file_has_prefix +g_file_get_relative_path +g_file_resolve_relative_path +g_file_is_native +g_file_has_uri_scheme +g_file_get_uri_scheme +g_file_read +g_file_read_async +g_file_read_finish +g_file_append_to +g_file_create +g_file_replace +g_file_append_to_async +g_file_append_to_finish +g_file_create_async +g_file_create_finish +g_file_replace_async +g_file_replace_finish +g_file_query_info +g_file_query_info_async +g_file_query_info_finish +g_file_query_exists +g_file_query_file_type +g_file_query_filesystem_info +g_file_query_filesystem_info_async +g_file_query_filesystem_info_finish +g_file_query_default_handler +g_file_find_enclosing_mount +g_file_find_enclosing_mount_async +g_file_find_enclosing_mount_finish +g_file_enumerate_children +g_file_enumerate_children_async +g_file_enumerate_children_finish +g_file_set_display_name +g_file_set_display_name_async +g_file_set_display_name_finish +g_file_delete +g_file_trash +g_file_copy +g_file_copy_async +g_file_copy_finish +g_file_move +g_file_make_directory +g_file_make_directory_with_parents +g_file_make_symbolic_link +g_file_query_settable_attributes +g_file_query_writable_namespaces +g_file_set_attribute +g_file_set_attributes_from_info +g_file_set_attributes_async +g_file_set_attributes_finish +g_file_set_attribute_string +g_file_set_attribute_byte_string +g_file_set_attribute_uint32 +g_file_set_attribute_int32 +g_file_set_attribute_uint64 +g_file_set_attribute_int64 +g_file_mount_mountable +g_file_mount_mountable_finish +g_file_unmount_mountable +g_file_unmount_mountable_finish +g_file_unmount_mountable_with_operation +g_file_unmount_mountable_with_operation_finish +g_file_eject_mountable +g_file_eject_mountable_finish +g_file_eject_mountable_with_operation +g_file_eject_mountable_with_operation_finish +g_file_start_mountable +g_file_start_mountable_finish +g_file_stop_mountable +g_file_stop_mountable_finish +g_file_poll_mountable +g_file_poll_mountable_finish +g_file_mount_enclosing_volume +g_file_mount_enclosing_volume_finish +g_file_monitor_directory +g_file_monitor_file +g_file_monitor +g_file_load_contents +g_file_load_contents_async +g_file_load_contents_finish +g_file_load_partial_contents_async +g_file_load_partial_contents_finish +g_file_replace_contents +g_file_replace_contents_async +g_file_replace_contents_finish +g_file_copy_attributes +g_file_create_readwrite +g_file_create_readwrite_async +g_file_create_readwrite_finish +g_file_open_readwrite +g_file_open_readwrite_async +g_file_open_readwrite_finish +g_file_replace_readwrite +g_file_replace_readwrite_async +g_file_replace_readwrite_finish +g_file_supports_thread_contexts + +G_FILE +G_IS_FILE +G_TYPE_FILE +G_FILE_GET_IFACE + +g_file_get_type +
+ +
+gfileenumerator +GFileEnumerator +GFileEnumerator +g_file_enumerator_next_file +g_file_enumerator_close +g_file_enumerator_next_files_async +g_file_enumerator_next_files_finish +g_file_enumerator_close_async +g_file_enumerator_close_finish +g_file_enumerator_is_closed +g_file_enumerator_has_pending +g_file_enumerator_set_pending +g_file_enumerator_get_container + +GFileEnumeratorClass +G_FILE_ENUMERATOR +G_IS_FILE_ENUMERATOR +G_TYPE_FILE_ENUMERATOR +G_FILE_ENUMERATOR_CLASS +G_IS_FILE_ENUMERATOR_CLASS +G_FILE_ENUMERATOR_GET_CLASS + +g_file_enumerator_get_type +GFileEnumeratorPrivate +
+ +
+gfileinfo +GFileInfo +GFileAttributeMatcher +GFileType +GFileInfo +G_FILE_ATTRIBUTE_STANDARD_TYPE +G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN +G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP +G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK +G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL +G_FILE_ATTRIBUTE_STANDARD_NAME +G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME +G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME +G_FILE_ATTRIBUTE_STANDARD_COPY_NAME +G_FILE_ATTRIBUTE_STANDARD_ICON +G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE +G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE +G_FILE_ATTRIBUTE_STANDARD_SIZE +G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE +G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET +G_FILE_ATTRIBUTE_STANDARD_TARGET_URI +G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER +G_FILE_ATTRIBUTE_ETAG_VALUE +G_FILE_ATTRIBUTE_ID_FILE +G_FILE_ATTRIBUTE_ID_FILESYSTEM +G_FILE_ATTRIBUTE_ACCESS_CAN_READ +G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE +G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE +G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE +G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH +G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT +G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE +G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE +G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL +G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED +G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP +G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE +G_FILE_ATTRIBUTE_TIME_MODIFIED +G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC +G_FILE_ATTRIBUTE_TIME_ACCESS +G_FILE_ATTRIBUTE_TIME_ACCESS_USEC +G_FILE_ATTRIBUTE_TIME_CHANGED +G_FILE_ATTRIBUTE_TIME_CHANGED_USEC +G_FILE_ATTRIBUTE_TIME_CREATED +G_FILE_ATTRIBUTE_TIME_CREATED_USEC +G_FILE_ATTRIBUTE_UNIX_DEVICE +G_FILE_ATTRIBUTE_UNIX_INODE +G_FILE_ATTRIBUTE_UNIX_MODE +G_FILE_ATTRIBUTE_UNIX_NLINK +G_FILE_ATTRIBUTE_UNIX_UID +G_FILE_ATTRIBUTE_UNIX_GID +G_FILE_ATTRIBUTE_UNIX_RDEV +G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE +G_FILE_ATTRIBUTE_UNIX_BLOCKS +G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT +G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE +G_FILE_ATTRIBUTE_DOS_IS_SYSTEM +G_FILE_ATTRIBUTE_OWNER_USER +G_FILE_ATTRIBUTE_OWNER_USER_REAL +G_FILE_ATTRIBUTE_OWNER_GROUP +G_FILE_ATTRIBUTE_THUMBNAIL_PATH +G_FILE_ATTRIBUTE_THUMBNAILING_FAILED +G_FILE_ATTRIBUTE_PREVIEW_ICON +G_FILE_ATTRIBUTE_FILESYSTEM_SIZE +G_FILE_ATTRIBUTE_FILESYSTEM_FREE +G_FILE_ATTRIBUTE_FILESYSTEM_TYPE +G_FILE_ATTRIBUTE_FILESYSTEM_READONLY +G_FILE_ATTRIBUTE_GVFS_BACKEND +G_FILE_ATTRIBUTE_SELINUX_CONTEXT +G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT +G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW +G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION +g_file_info_new +g_file_info_dup +g_file_info_copy_into +g_file_info_has_attribute +g_file_info_has_namespace +g_file_info_list_attributes +g_file_info_get_attribute_type +g_file_info_remove_attribute +g_file_info_get_attribute_as_string +g_file_info_get_attribute_data +g_file_info_get_attribute_status +g_file_info_get_attribute_string +g_file_info_get_attribute_stringv +g_file_info_get_attribute_byte_string +g_file_info_get_attribute_boolean +g_file_info_get_attribute_uint32 +g_file_info_get_attribute_int32 +g_file_info_get_attribute_uint64 +g_file_info_get_attribute_int64 +g_file_info_get_attribute_object +g_file_info_set_attribute +g_file_info_set_attribute_status +g_file_info_set_attribute_string +g_file_info_set_attribute_stringv +g_file_info_set_attribute_byte_string +g_file_info_set_attribute_boolean +g_file_info_set_attribute_uint32 +g_file_info_set_attribute_int32 +g_file_info_set_attribute_uint64 +g_file_info_set_attribute_int64 +g_file_info_set_attribute_object +g_file_info_clear_status +g_file_info_get_file_type +g_file_info_get_is_hidden +g_file_info_get_is_backup +g_file_info_get_is_symlink +g_file_info_get_name +g_file_info_get_display_name +g_file_info_get_edit_name +g_file_info_get_icon +g_file_info_get_content_type +g_file_info_get_size +g_file_info_get_modification_time +g_file_info_get_symlink_target +g_file_info_get_etag +g_file_info_get_sort_order +g_file_info_set_attribute_mask +g_file_info_unset_attribute_mask +g_file_info_set_file_type +g_file_info_set_is_hidden +g_file_info_set_is_symlink +g_file_info_set_name +g_file_info_set_display_name +g_file_info_set_edit_name +g_file_info_set_icon +g_file_info_set_content_type +g_file_info_set_size +g_file_info_set_modification_time +g_file_info_set_symlink_target +g_file_info_set_sort_order +g_file_attribute_matcher_new +g_file_attribute_matcher_ref +g_file_attribute_matcher_unref +g_file_attribute_matcher_matches +g_file_attribute_matcher_matches_only +g_file_attribute_matcher_enumerate_namespace +g_file_attribute_matcher_enumerate_next + +GFileInfoClass +G_FILE_INFO +G_IS_FILE_INFO +G_TYPE_FILE_INFO +G_FILE_INFO_CLASS +G_IS_FILE_INFO_CLASS +G_FILE_INFO_GET_CLASS + +g_file_info_get_type +
+ +
+gfileattribute +GFileAttribute +GFileAttributeType +GFileAttributeInfoFlags +GFileAttributeStatus +GFileAttributeInfo +GFileAttributeInfoList +g_file_attribute_info_list_new +g_file_attribute_info_list_ref +g_file_attribute_info_list_unref +g_file_attribute_info_list_dup +g_file_attribute_info_list_lookup +g_file_attribute_info_list_add + +g_file_attribute_info_list_get_type +
+ +
+gfilemonitor +GFileMonitor +GFileMonitorEvent +GFileMonitor +g_file_monitor_cancel +g_file_monitor_is_cancelled +g_file_monitor_set_rate_limit +g_file_monitor_emit_event + +GFileMonitorClass +G_FILE_MONITOR +G_IS_FILE_MONITOR +G_TYPE_FILE_MONITOR +G_FILE_MONITOR_CLASS +G_IS_FILE_MONITOR_CLASS +G_FILE_MONITOR_GET_CLASS + +g_file_monitor_get_type +GFileMonitorPrivate +
+ +
+gicon +GIcon +GIcon +GIconIface +g_icon_hash +g_icon_equal +g_icon_to_string +g_icon_new_for_string + +G_ICON +G_IS_ICON +G_TYPE_ICON +G_ICON_GET_IFACE + +g_icon_get_type +
+ +
+gthemedicon +GThemedIcon +GThemedIcon +g_themed_icon_new +g_themed_icon_new_from_names +g_themed_icon_new_with_default_fallbacks +g_themed_icon_prepend_name +g_themed_icon_append_name +g_themed_icon_get_names + +GThemedIconClass +G_THEMED_ICON +G_IS_THEMED_ICON +G_TYPE_THEMED_ICON +G_THEMED_ICON_CLASS +G_IS_THEMED_ICON_CLASS +G_THEMED_ICON_GET_CLASS + +g_themed_icon_get_type +
+ +
+gloadableicon +GLoadableIcon +GLoadableIcon +GLoadableIconIface +g_loadable_icon_load +g_loadable_icon_load_async +g_loadable_icon_load_finish + +G_LOADABLE_ICON +G_IS_LOADABLE_ICON +G_TYPE_LOADABLE_ICON +G_LOADABLE_ICON_GET_IFACE + +g_loadable_icon_get_type +
+ +
+gfileicon +GFileIcon +GFileIcon +g_file_icon_new +g_file_icon_get_file + +GFileIconClass +G_FILE_ICON +G_IS_FILE_ICON +G_TYPE_FILE_ICON +G_FILE_ICON_CLASS +G_IS_FILE_ICON_CLASS +G_FILE_ICON_GET_CLASS + +g_file_icon_get_type +
+ +
+gemblemedicon +GEmblemedIcon +GEmblemedIcon +g_emblemed_icon_new +g_emblemed_icon_get_icon +g_emblemed_icon_get_emblems +g_emblemed_icon_add_emblem + +GEmblemedIconClass +G_EMBLEMED_ICON +G_EMBLEMED_ICON_CLASS +G_EMBLEMED_ICON_GET_CLASS +G_IS_EMBLEMED_ICON +G_IS_EMBLEMED_ICON_CLASS +G_TYPE_EMBLEMED_ICON + + +g_emblemed_icon_get_type +
+ +
+gemblem +GEmblem +GEmblem +GEmblemOrigin +g_emblem_new +g_emblem_new_with_origin +g_emblem_get_icon +g_emblem_get_origin + +GEmblemClass +g_emblem_get_type +G_EMBLEM +G_EMBLEM_CLASS +G_EMBLEM_GET_CLASS +G_IS_EMBLEM +G_IS_EMBLEM_CLASS +G_TYPE_EMBLEM +
+ +
+ginputstream +GInputStream +GInputStream +g_input_stream_read +g_input_stream_read_all +g_input_stream_skip +g_input_stream_close +g_input_stream_read_async +g_input_stream_read_finish +g_input_stream_skip_async +g_input_stream_skip_finish +g_input_stream_close_async +g_input_stream_close_finish +g_input_stream_is_closed +g_input_stream_has_pending +g_input_stream_set_pending +g_input_stream_clear_pending + +GInputStreamClass +G_INPUT_STREAM +G_IS_INPUT_STREAM +G_TYPE_INPUT_STREAM +G_INPUT_STREAM_CLASS +G_IS_INPUT_STREAM_CLASS +G_INPUT_STREAM_GET_CLASS + +g_input_stream_get_type +GInputStreamPrivate +
+ +
+gfileinputstream +GFileInputStream +GFileInputStream +g_file_input_stream_query_info +g_file_input_stream_query_info_async +g_file_input_stream_query_info_finish + +GFileInputStreamClass +G_FILE_INPUT_STREAM +G_IS_FILE_INPUT_STREAM +G_TYPE_FILE_INPUT_STREAM +G_FILE_INPUT_STREAM_CLASS +G_IS_FILE_INPUT_STREAM_CLASS +G_FILE_INPUT_STREAM_GET_CLASS + +g_file_input_stream_get_type +GFileInputStreamPrivate +
+ +
+gfilterinputstream +GFilterInputStream +GFilterInputStream +g_filter_input_stream_get_base_stream +g_filter_input_stream_get_close_base_stream +g_filter_input_stream_set_close_base_stream + +GFilterInputStreamClass +G_FILTER_INPUT_STREAM +G_IS_FILTER_INPUT_STREAM +G_TYPE_FILTER_INPUT_STREAM +G_FILTER_INPUT_STREAM_CLASS +G_IS_FILTER_INPUT_STREAM_CLASS +G_FILTER_INPUT_STREAM_GET_CLASS + +g_filter_input_stream_get_type +
+ +
+gunixinputstream +GUnixInputStream +GUnixInputStream +g_unix_input_stream_new +g_unix_input_stream_set_close_fd +g_unix_input_stream_get_close_fd +g_unix_input_stream_get_fd + +GUnixInputStreamClass +G_UNIX_INPUT_STREAM +G_IS_UNIX_INPUT_STREAM +G_TYPE_UNIX_INPUT_STREAM +G_UNIX_INPUT_STREAM_CLASS +G_IS_UNIX_INPUT_STREAM_CLASS +G_UNIX_INPUT_STREAM_GET_CLASS + +g_unix_input_stream_get_type +GUnixInputStreamPrivate +
+ +
+gmemoryinputstream +GMemoryInputStream +GMemoryInputStream +g_memory_input_stream_new +g_memory_input_stream_new_from_data +g_memory_input_stream_add_data + +GMemoryInputStreamClass +G_MEMORY_INPUT_STREAM +G_IS_MEMORY_INPUT_STREAM +G_TYPE_MEMORY_INPUT_STREAM +G_MEMORY_INPUT_STREAM_CLASS +G_IS_MEMORY_INPUT_STREAM_CLASS +G_MEMORY_INPUT_STREAM_GET_CLASS + +GMemoryInputStreamPrivate +g_memory_input_stream_get_type +
+ +
+gdatainputstream +GDataInputStream +GDataInputStream +GDataStreamByteOrder +GDataStreamNewlineType +g_data_input_stream_new +g_data_input_stream_set_byte_order +g_data_input_stream_get_byte_order +g_data_input_stream_set_newline_type +g_data_input_stream_get_newline_type +g_data_input_stream_read_byte +g_data_input_stream_read_int16 +g_data_input_stream_read_uint16 +g_data_input_stream_read_int32 +g_data_input_stream_read_uint32 +g_data_input_stream_read_int64 +g_data_input_stream_read_uint64 +g_data_input_stream_read_line +g_data_input_stream_read_line_async +g_data_input_stream_read_line_finish +g_data_input_stream_read_until +g_data_input_stream_read_until_async +g_data_input_stream_read_until_finish + +GDataInputStreamClass +G_DATA_INPUT_STREAM +G_IS_DATA_INPUT_STREAM +G_TYPE_DATA_INPUT_STREAM +G_DATA_INPUT_STREAM_CLASS +G_IS_DATA_INPUT_STREAM_CLASS +G_DATA_INPUT_STREAM_GET_CLASS + +g_data_input_stream_get_type +GDataInputStreamPrivate +
+ +
+gbufferedinputstream +GBufferedInputStream +GBufferedInputStream +g_buffered_input_stream_new +g_buffered_input_stream_new_sized +g_buffered_input_stream_get_buffer_size +g_buffered_input_stream_set_buffer_size +g_buffered_input_stream_get_available +g_buffered_input_stream_peek_buffer +g_buffered_input_stream_peek +g_buffered_input_stream_fill +g_buffered_input_stream_fill_async +g_buffered_input_stream_fill_finish +g_buffered_input_stream_read_byte + +GBufferedInputStreamClass +G_BUFFERED_INPUT_STREAM +G_IS_BUFFERED_INPUT_STREAM +G_TYPE_BUFFERED_INPUT_STREAM +G_BUFFERED_INPUT_STREAM_CLASS +G_IS_BUFFERED_INPUT_STREAM_CLASS +G_BUFFERED_INPUT_STREAM_GET_CLASS + +g_buffered_input_stream_get_type +GBufferedInputStreamPrivate +
+ +
+goutputstream +GOutputStream +GOutputStreamSpliceFlags +GOutputStream +g_output_stream_write +g_output_stream_write_all +g_output_stream_splice +g_output_stream_flush +g_output_stream_close +g_output_stream_write_async +g_output_stream_write_finish +g_output_stream_splice_async +g_output_stream_splice_finish +g_output_stream_flush_async +g_output_stream_flush_finish +g_output_stream_close_async +g_output_stream_close_finish +g_output_stream_is_closing +g_output_stream_is_closed +g_output_stream_has_pending +g_output_stream_set_pending +g_output_stream_clear_pending + +GOutputStreamClass +G_OUTPUT_STREAM +G_IS_OUTPUT_STREAM +G_TYPE_OUTPUT_STREAM +G_OUTPUT_STREAM_CLASS +G_IS_OUTPUT_STREAM_CLASS +G_OUTPUT_STREAM_GET_CLASS + +g_output_stream_get_type +GOutputStreamPrivate +
+ +
+gfileoutputstream +GFileOutputStream +GFileOutputStream +g_file_output_stream_query_info +g_file_output_stream_query_info_async +g_file_output_stream_query_info_finish +g_file_output_stream_get_etag + +GFileOutputStreamClass +G_FILE_OUTPUT_STREAM +G_IS_FILE_OUTPUT_STREAM +G_TYPE_FILE_OUTPUT_STREAM +G_FILE_OUTPUT_STREAM_CLASS +G_IS_FILE_OUTPUT_STREAM_CLASS +G_FILE_OUTPUT_STREAM_GET_CLASS + +g_file_output_stream_get_type +GFileOutputStreamPrivate +
+ +
+gfilteroutputstream +GFilterOutputStream +GFilterOutputStream +g_filter_output_stream_get_base_stream +g_filter_output_stream_get_close_base_stream +g_filter_output_stream_set_close_base_stream + +GFilterOutputStreamClass +G_FILTER_OUTPUT_STREAM +G_IS_FILTER_OUTPUT_STREAM +G_TYPE_FILTER_OUTPUT_STREAM +G_FILTER_OUTPUT_STREAM_CLASS +G_IS_FILTER_OUTPUT_STREAM_CLASS +G_FILTER_OUTPUT_STREAM_GET_CLASS + +g_filter_output_stream_get_type +
+ +
+gbufferedoutputstream +GBufferedOutputStream +GBufferedOutputStream +g_buffered_output_stream_new +g_buffered_output_stream_new_sized +g_buffered_output_stream_get_buffer_size +g_buffered_output_stream_set_buffer_size +g_buffered_output_stream_get_auto_grow +g_buffered_output_stream_set_auto_grow + +GBufferedOutputStreamClass +G_BUFFERED_OUTPUT_STREAM +G_IS_BUFFERED_OUTPUT_STREAM +G_TYPE_BUFFERED_OUTPUT_STREAM +G_BUFFERED_OUTPUT_STREAM_CLASS +G_IS_BUFFERED_OUTPUT_STREAM_CLASS +G_BUFFERED_OUTPUT_STREAM_GET_CLASS + +g_buffered_output_stream_get_type +GBufferedOutputStreamPrivate +
+ +
+gmemoryoutputstream +GMemoryOutputStream +GReallocFunc +GMemoryOutputStream +g_memory_output_stream_new +g_memory_output_stream_get_data +g_memory_output_stream_get_size +g_memory_output_stream_get_data_size + +GMemoryOutputStreamClass +G_MEMORY_OUTPUT_STREAM +G_IS_MEMORY_OUTPUT_STREAM +G_TYPE_MEMORY_OUTPUT_STREAM +G_MEMORY_OUTPUT_STREAM_CLASS +G_IS_MEMORY_OUTPUT_STREAM_CLASS +G_MEMORY_OUTPUT_STREAM_GET_CLASS + +g_memory_output_stream_get_type +GMemoryOutputStreamPrivate +
+ +
+gdataoutputstream +GDataOutputStream +GDataOutputStream +g_data_output_stream_new +g_data_output_stream_set_byte_order +g_data_output_stream_get_byte_order +g_data_output_stream_put_byte +g_data_output_stream_put_int16 +g_data_output_stream_put_uint16 +g_data_output_stream_put_int32 +g_data_output_stream_put_uint32 +g_data_output_stream_put_int64 +g_data_output_stream_put_uint64 +g_data_output_stream_put_string + +GDataOutputStreamClass +G_DATA_OUTPUT_STREAM +G_IS_DATA_OUTPUT_STREAM +G_TYPE_DATA_OUTPUT_STREAM +G_DATA_OUTPUT_STREAM_CLASS +G_IS_DATA_OUTPUT_STREAM_CLASS +G_DATA_OUTPUT_STREAM_GET_CLASS + +g_data_output_stream_get_type +GDataOutputStreamPrivate +
+ +
+gunixoutputstream +GUnixOutputStream +GUnixOutputStream +g_unix_output_stream_new +g_unix_output_stream_set_close_fd +g_unix_output_stream_get_close_fd +g_unix_output_stream_get_fd + +GUnixOutputStreamClass +G_UNIX_OUTPUT_STREAM +G_IS_UNIX_OUTPUT_STREAM +G_TYPE_UNIX_OUTPUT_STREAM +G_UNIX_OUTPUT_STREAM_CLASS +G_IS_UNIX_OUTPUT_STREAM_CLASS +G_UNIX_OUTPUT_STREAM_GET_CLASS + +g_unix_output_stream_get_type +GUnixOutputStreamPrivate +
+ +
+giostream +GIOStream +GIOStream +g_io_stream_get_input_stream +g_io_stream_get_output_stream +g_io_stream_close +g_io_stream_close_async +g_io_stream_close_finish +g_io_stream_is_closed +g_io_stream_has_pending +g_io_stream_set_pending +g_io_stream_clear_pending + +GIOStreamClass +G_IO_STREAM +G_IO_STREAM_CLASS +G_IO_STREAM_GET_CLASS +G_IS_IO_STREAM +G_IS_IO_STREAM_CLASS +G_TYPE_IO_STREAM + +GIOStreamPrivate +g_io_stream_get_type +
+ +
+gfileiostream +GFileIOStream +GFileIOStream +g_file_io_stream_get_etag +g_file_io_stream_query_info +g_file_io_stream_query_info_async +g_file_io_stream_query_info_finish + +GFileIOStreamClass +G_FILE_IO_STREAM +G_FILE_IO_STREAM_CLASS +G_FILE_IO_STREAM_GET_CLASS +G_IS_FILE_IO_STREAM +G_IS_FILE_IO_STREAM_CLASS +G_TYPE_FILE_IO_STREAM + +GFileIOStreamPrivate +g_file_io_stream_get_type +
+ +
+gseekable +GSeekable +GSeekable +GSeekableIface +g_seekable_tell +g_seekable_can_seek +g_seekable_seek +g_seekable_can_truncate +g_seekable_truncate + +G_SEEKABLE +G_IS_SEEKABLE +G_TYPE_SEEKABLE +G_SEEKABLE_GET_IFACE + +g_seekable_get_type +
+ +
+gvolumemonitor +GVolumeMonitor +GVolumeMonitor +G_VOLUME_MONITOR_EXTENSION_POINT_NAME +g_volume_monitor_get +g_volume_monitor_get_connected_drives +g_volume_monitor_get_volumes +g_volume_monitor_get_mounts +g_volume_monitor_adopt_orphan_mount +g_volume_monitor_get_mount_for_uuid +g_volume_monitor_get_volume_for_uuid + +GVolumeMonitorClass +G_VOLUME_MONITOR +G_IS_VOLUME_MONITOR +G_TYPE_VOLUME_MONITOR +G_VOLUME_MONITOR_CLASS +G_IS_VOLUME_MONITOR_CLASS +G_VOLUME_MONITOR_GET_CLASS + +g_volume_monitor_get_type +
+ +
+gmount +GMount +GMount +GMountIface +g_mount_get_name +g_mount_get_uuid +g_mount_get_icon +g_mount_get_drive +g_mount_get_root +g_mount_get_volume +g_mount_get_default_location +g_mount_can_unmount +GMountMountFlags +GMountUnmountFlags +g_mount_unmount +g_mount_unmount_finish +g_mount_unmount_with_operation +g_mount_unmount_with_operation_finish +g_mount_remount +g_mount_remount_finish +g_mount_can_eject +g_mount_eject +g_mount_eject_finish +g_mount_eject_with_operation +g_mount_eject_with_operation_finish +g_mount_guess_content_type +g_mount_guess_content_type_finish +g_mount_guess_content_type_sync +g_mount_is_shadowed +g_mount_shadow +g_mount_unshadow + +G_IS_MOUNT +G_MOUNT +G_MOUNT_GET_IFACE +G_TYPE_MOUNT + +g_mount_get_type +
+ +
+gvolume +GVolume +GVolume +GVolumeIface +g_volume_get_name +g_volume_get_uuid +g_volume_get_icon +g_volume_get_drive +g_volume_get_mount +g_volume_can_mount +g_volume_should_automount +g_volume_get_activation_root +g_volume_mount +g_volume_mount_finish +g_volume_can_eject +g_volume_eject +g_volume_eject_finish +g_volume_eject_with_operation +g_volume_eject_with_operation_finish +G_VOLUME_IDENTIFIER_KIND_HAL_UDI +G_VOLUME_IDENTIFIER_KIND_LABEL +G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT +G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE +G_VOLUME_IDENTIFIER_KIND_UUID +g_volume_enumerate_identifiers +g_volume_get_identifier + +G_VOLUME +G_IS_VOLUME +G_TYPE_VOLUME +G_VOLUME_GET_IFACE + +g_volume_get_type +
+ +
+gdrive +GDrive +GDrive +GDriveIface +GDriveStartFlags +GDriveStartStopType +g_drive_get_name +g_drive_get_icon +g_drive_has_volumes +g_drive_get_volumes +g_drive_can_eject +g_drive_get_start_stop_type +g_drive_can_start +g_drive_can_start_degraded +g_drive_can_stop +g_drive_can_poll_for_media +g_drive_poll_for_media +g_drive_poll_for_media_finish +g_drive_has_media +g_drive_is_media_check_automatic +g_drive_is_media_removable +g_drive_eject +g_drive_eject_finish +g_drive_eject_with_operation +g_drive_eject_with_operation_finish +g_drive_start +g_drive_start_finish +g_drive_stop +g_drive_stop_finish +g_drive_enumerate_identifiers +g_drive_get_identifier + +G_DRIVE +G_IS_DRIVE +G_TYPE_DRIVE +G_DRIVE_GET_IFACE + +g_drive_get_type +
+ +
+gcancellable +GCancellable +GCancellable +g_cancellable_new +g_cancellable_is_cancelled +g_cancellable_set_error_if_cancelled +g_cancellable_get_fd +g_cancellable_make_pollfd +g_cancellable_release_fd +g_cancellable_get_current +g_cancellable_pop_current +g_cancellable_push_current +g_cancellable_reset +g_cancellable_connect +g_cancellable_disconnect +g_cancellable_cancel + +GCancellableClass +G_CANCELLABLE +G_IS_CANCELLABLE +G_TYPE_CANCELLABLE +G_CANCELLABLE_CLASS +G_IS_CANCELLABLE_CLASS +G_CANCELLABLE_GET_CLASS + +g_cancellable_get_type +
+ +
+gasyncresult +GAsyncResult +GAsyncResult +GAsyncResultIface +GAsyncReadyCallback +g_async_result_get_user_data +g_async_result_get_source_object + +G_ASYNC_RESULT +G_IS_ASYNC_RESULT +G_TYPE_ASYNC_RESULT +G_ASYNC_RESULT_GET_IFACE + +g_async_result_get_type +
+ +
+gsimpleasyncresult +GSimpleAsyncResult +GSimpleAsyncResult +GSimpleAsyncThreadFunc +g_simple_async_result_new +g_simple_async_result_new_error +g_simple_async_result_new_from_error +g_simple_async_result_set_op_res_gpointer +g_simple_async_result_get_op_res_gpointer +g_simple_async_result_set_op_res_gssize +g_simple_async_result_get_op_res_gssize +g_simple_async_result_set_op_res_gboolean +g_simple_async_result_get_op_res_gboolean +g_simple_async_result_get_source_tag +g_simple_async_result_is_valid +g_simple_async_result_set_handle_cancellation +g_simple_async_result_complete +g_simple_async_result_complete_in_idle +g_simple_async_result_run_in_thread +g_simple_async_result_set_from_error +g_simple_async_result_propagate_error +g_simple_async_result_set_error +g_simple_async_result_set_error_va +g_simple_async_report_error_in_idle +g_simple_async_report_gerror_in_idle + +GSimpleAsyncResultClass +G_SIMPLE_ASYNC_RESULT +G_IS_SIMPLE_ASYNC_RESULT +G_TYPE_SIMPLE_ASYNC_RESULT +G_SIMPLE_ASYNC_RESULT_CLASS +G_IS_SIMPLE_ASYNC_RESULT_CLASS +G_SIMPLE_ASYNC_RESULT_GET_CLASS + +g_simple_async_result_get_type +
+ +
+gioscheduler +GIOScheduler +GIOSchedulerJob +GIOSchedulerJobFunc +g_io_scheduler_push_job +g_io_scheduler_cancel_all_jobs +g_io_scheduler_job_send_to_mainloop +g_io_scheduler_job_send_to_mainloop_async +
+ +
+gioerror +GIOError +G_IO_ERROR +GIOErrorEnum +g_io_error_from_errno + +g_io_error_quark +
+ +
+gcontenttype +GContentType +g_content_type_equals +g_content_type_is_a +g_content_type_is_unknown +g_content_type_get_description +g_content_type_get_mime_type +g_content_type_get_icon +g_content_type_can_be_executable +g_content_type_from_mime_type +g_content_type_guess +g_content_type_guess_for_tree +g_content_types_get_registered +
+ +
+gappinfo +GAppInfo +GAppInfoCreateFlags +GAppInfo +GAppInfoIface +GAppLaunchContext +g_app_info_create_from_commandline +g_app_info_dup +g_app_info_equal +g_app_info_get_id +g_app_info_get_name +g_app_info_get_display_name +g_app_info_get_description +g_app_info_get_executable +g_app_info_get_commandline +g_app_info_get_icon +g_app_info_launch +g_app_info_supports_files +g_app_info_supports_uris +g_app_info_launch_uris +g_app_info_should_show +g_app_info_can_delete +g_app_info_delete +g_app_info_reset_type_associations +g_app_info_set_as_default_for_type +g_app_info_set_as_default_for_extension +g_app_info_add_supports_type +g_app_info_can_remove_supports_type +g_app_info_remove_supports_type +g_app_info_get_all +g_app_info_get_all_for_type +g_app_info_get_default_for_type +g_app_info_get_default_for_uri_scheme +g_app_info_launch_default_for_uri +g_app_launch_context_get_display +g_app_launch_context_get_startup_notify_id +g_app_launch_context_launch_failed +g_app_launch_context_new + +GAppLaunchContextClass +G_APP_INFO +G_IS_APP_INFO +G_TYPE_APP_INFO +G_APP_INFO_GET_IFACE +G_APP_LAUNCH_CONTEXT +G_APP_LAUNCH_CONTEXT_CLASS +G_APP_LAUNCH_CONTEXT_GET_CLASS +G_IS_APP_LAUNCH_CONTEXT +G_IS_APP_LAUNCH_CONTEXT_CLASS +G_TYPE_APP_LAUNCH_CONTEXT + +g_app_info_get_type +g_app_launch_context_get_type +GAppLaunchContextPrivate +
+ +
+gmountoperation +GMountOperation +GAskPasswordFlags +GPasswordSave +GMountOperation +GMountOperationResult +g_mount_operation_new +g_mount_operation_get_username +g_mount_operation_set_username +g_mount_operation_get_password +g_mount_operation_set_password +g_mount_operation_get_anonymous +g_mount_operation_set_anonymous +g_mount_operation_get_domain +g_mount_operation_set_domain +g_mount_operation_get_password_save +g_mount_operation_set_password_save +g_mount_operation_get_choice +g_mount_operation_set_choice +g_mount_operation_reply + +GMountOperationClass +G_MOUNT_OPERATION +G_IS_MOUNT_OPERATION +G_TYPE_MOUNT_OPERATION +G_MOUNT_OPERATION_CLASS +G_IS_MOUNT_OPERATION_CLASS +G_MOUNT_OPERATION_GET_CLASS + +g_mount_operation_get_type +GMountOperationPrivate +
+ +
+gfilenamecompleter +GFilenameCompleter +GFilenameCompleter +g_filename_completer_new +g_filename_completer_get_completion_suffix +g_filename_completer_get_completions +g_filename_completer_set_dirs_only + +GFilenameCompleterClass +G_FILENAME_COMPLETER +G_IS_FILENAME_COMPLETER +G_TYPE_FILENAME_COMPLETER +G_FILENAME_COMPLETER_CLASS +G_IS_FILENAME_COMPLETER_CLASS +G_FILENAME_COMPLETER_GET_CLASS + +g_filename_completer_get_type +
+ +
+gunixmounts +Unix Mounts +GUnixMount +GUnixMountPoint +GUnixMountEntry +GUnixMountMonitor +g_unix_mount_free +g_unix_mount_compare +g_unix_mount_get_mount_path +g_unix_mount_get_device_path +g_unix_mount_get_fs_type +g_unix_mount_is_readonly +g_unix_mount_is_system_internal +g_unix_mount_guess_icon +g_unix_mount_guess_name +g_unix_mount_guess_can_eject +g_unix_mount_guess_should_display +g_unix_mount_point_free +g_unix_mount_point_compare +g_unix_mount_point_get_mount_path +g_unix_mount_point_get_device_path +g_unix_mount_point_get_fs_type +g_unix_mount_point_is_readonly +g_unix_mount_point_is_user_mountable +g_unix_mount_point_is_loopback +g_unix_mount_point_guess_icon +g_unix_mount_point_guess_name +g_unix_mount_point_guess_can_eject +g_unix_mount_points_get +g_unix_mounts_get +g_unix_mount_at +g_unix_mounts_changed_since +g_unix_mount_points_changed_since +g_unix_mount_monitor_new +g_unix_mount_monitor_set_rate_limit +g_unix_is_mount_path_system_internal + +GUnixMountClass +GUnixMountMonitorClass +G_UNIX_MOUNT_MONITOR +G_IS_UNIX_MOUNT_MONITOR +G_TYPE_UNIX_MOUNT_MONITOR +G_UNIX_MOUNT_MONITOR_CLASS +G_IS_UNIX_MOUNT_MONITOR_CLASS +G_IS_UNIX_MOUNT +G_IS_UNIX_MOUNT_CLASS +G_UNIX_MOUNT +G_UNIX_MOUNT_CLASS +G_TYPE_UNIX_MOUNT + +g_unix_mount_monitor_get_type +G_IS_UNIX_VOLUME_MONITOR +G_IS_UNIX_VOLUME_MONITOR_CLASS +G_TYPE_UNIX_VOLUME_MONITOR +G_UNIX_VOLUME_MONITOR +G_UNIX_VOLUME_MONITOR_CLASS +GUnixVolume +GUnixVolumeMonitor +GUnixVolumeMonitorClass +
+ +
+gdesktopappinfo +Desktop file based GAppInfo +GDesktopAppInfo +g_desktop_app_info_new_from_filename +g_desktop_app_info_new_from_keyfile +g_desktop_app_info_new +g_desktop_app_info_get_filename +g_desktop_app_info_get_is_hidden +g_desktop_app_info_set_desktop_env +GDesktopAppInfoLookup +G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME +g_desktop_app_info_lookup_get_default_for_uri_scheme + +GDesktopAppInfoClass +G_TYPE_DESKTOP_APP_INFO +G_DESKTOP_APP_INFO +G_DESKTOP_APP_INFO_CLASS +G_IS_DESKTOP_APP_INFO +G_IS_DESKTOP_APP_INFO_CLASS +G_DESKTOP_APP_INFO_GET_CLASS +GDesktopAppInfoLookupIface +G_DESKTOP_APP_INFO_LOOKUP +G_TYPE_DESKTOP_APP_INFO_LOOKUP +G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE +G_IS_DESKTOP_APP_INFO_LOOKUP + +g_desktop_app_info_get_type +g_desktop_app_info_lookup_get_type +
+ +
+giomodule +GIOModule +GIOModule +g_io_module_new +g_io_modules_load_all_in_directory +g_io_modules_scan_all_in_directory +g_io_module_load +g_io_module_unload +g_io_module_query + +GIOModuleClass +G_IO_MODULE +G_IO_IS_MODULE +G_IO_TYPE_MODULE +G_IO_MODULE_CLASS +G_IO_IS_MODULE_CLASS +G_IO_MODULE_GET_CLASS + +g_io_module_get_type +
+ +
+extensionpoints +Extension Points +GIOExtension +GIOExtensionPoint +g_io_extension_get_name +g_io_extension_get_priority +g_io_extension_get_type +g_io_extension_point_get_extension_by_name +g_io_extension_point_get_extensions +g_io_extension_point_get_required_type +g_io_extension_point_implement +g_io_extension_point_lookup +g_io_extension_point_register +g_io_extension_point_set_required_type +g_io_extension_ref_class +
+ +
+gunixfdlist +GUnixFDList +GUnixFDList +g_unix_fd_list_new_from_array +g_unix_fd_list_new +g_unix_fd_list_get_length +g_unix_fd_list_get +g_unix_fd_list_peek_fds +g_unix_fd_list_steal_fds +g_unix_fd_list_append + +GUnixFDListClass +g_unix_fd_list_get_type +G_UNIX_FD_LIST +G_UNIX_FD_LIST_CLASS +G_IS_UNIX_FD_LIST +G_IS_UNIX_FD_LIST_CLASS +G_UNIX_FD_LIST_GET_CLASS +
+ +
+ginetaddress +GInetAddress +GInetAddress +g_inet_address_new_from_string +g_inet_address_new_from_bytes +g_inet_address_new_any +g_inet_address_new_loopback +g_inet_address_to_bytes +g_inet_address_get_native_size +g_inet_address_to_string +g_inet_address_get_family +g_inet_address_get_is_any +g_inet_address_get_is_loopback +g_inet_address_get_is_link_local +g_inet_address_get_is_site_local +g_inet_address_get_is_multicast +g_inet_address_get_is_mc_link_local +g_inet_address_get_is_mc_node_local +g_inet_address_get_is_mc_site_local +g_inet_address_get_is_mc_org_local +g_inet_address_get_is_mc_global + +GInetAddressClass +GInetAddressPrivate +G_INET_ADDRESS +G_INET_ADDRESS_CLASS +G_INET_ADDRESS_GET_CLASS +G_IS_INET_ADDRESS +G_IS_INET_ADDRESS_CLASS +G_TYPE_INET_ADDRESS + +g_inet_address_get_type +
+ +
+gsocketaddress +GSocketAddress +GSocketAddress +GSocketFamily +g_socket_address_new_from_native +g_socket_address_get_family +g_socket_address_to_native +g_socket_address_get_native_size + +GSocketAddressClass +G_IS_SOCKET_ADDRESS +G_IS_SOCKET_ADDRESS_CLASS +G_SOCKET_ADDRESS +G_SOCKET_ADDRESS_CLASS +G_SOCKET_ADDRESS_GET_CLASS +G_TYPE_SOCKET_ADDRESS + +g_socket_address_get_type +
+ +
+ginetsocketaddress +GInetSocketAddress +GInetSocketAddress +g_inet_socket_address_new +g_inet_socket_address_get_address +g_inet_socket_address_get_port + +GInetSocketAddressClass +GInetSocketAddressPrivate +G_INET_SOCKET_ADDRESS +G_INET_SOCKET_ADDRESS_CLASS +G_INET_SOCKET_ADDRESS_GET_CLASS +G_IS_INET_SOCKET_ADDRESS +G_IS_INET_SOCKET_ADDRESS_CLASS +G_TYPE_INET_SOCKET_ADDRESS + +g_inet_socket_address_get_type +
+ +
+gunixsocketaddress +GUnixSocketAddress +GUnixSocketAddress +g_unix_socket_address_new +g_unix_socket_address_new_abstract +g_unix_socket_address_get_is_abstract +g_unix_socket_address_get_path +g_unix_socket_address_get_path_len +g_unix_socket_address_abstract_names_supported + +GUnixSocketAddressClass +GUnixSocketAddressPrivate +G_IS_UNIX_SOCKET_ADDRESS +G_IS_UNIX_SOCKET_ADDRESS_CLASS +G_TYPE_UNIX_SOCKET_ADDRESS +G_UNIX_SOCKET_ADDRESS +G_UNIX_SOCKET_ADDRESS_CLASS +G_UNIX_SOCKET_ADDRESS_GET_CLASS + +g_unix_socket_address_get_type +
+ +
+gresolver +GResolver +GResolver +g_resolver_get_default +g_resolver_set_default +g_resolver_lookup_by_name +g_resolver_lookup_by_name_async +g_resolver_lookup_by_name_finish +g_resolver_free_addresses +g_resolver_lookup_by_address +g_resolver_lookup_by_address_async +g_resolver_lookup_by_address_finish +g_resolver_lookup_service +g_resolver_lookup_service_async +g_resolver_lookup_service_finish +g_resolver_free_targets + +G_RESOLVER_ERROR +GResolverError + +GResolverClass +G_IS_RESOLVER +G_IS_RESOLVER_CLASS +G_RESOLVER +G_RESOLVER_CLASS +G_RESOLVER_GET_CLASS +G_TYPE_RESOLVER + +g_resolver_get_type +g_resolver_error_quark +
+ +
+gsrvtarget +GSrvTarget +GSrvTarget +g_srv_target_new +g_srv_target_copy +g_srv_target_free +g_srv_target_get_hostname +g_srv_target_get_port +g_srv_target_get_priority +g_srv_target_get_weight +g_srv_target_list_sort + +G_TYPE_SRV_TARGET + +g_srv_target_get_type +
+ +
+gsocketconnectable +GSocketConnectable +GSocketConnectable +GSocketConnectableIface +g_socket_connectable_enumerate + +GSocketAddressEnumerator +g_socket_address_enumerator_next +g_socket_address_enumerator_next_async +g_socket_address_enumerator_next_finish + +G_IS_SOCKET_CONNECTABLE +G_SOCKET_CONNECTABLE +G_SOCKET_CONNECTABLE_GET_IFACE +G_TYPE_SOCKET_CONNECTABLE +GSocketAddressEnumeratorClass +G_IS_SOCKET_ADDRESS_ENUMERATOR +G_IS_SOCKET_ADDRESS_ENUMERATOR_CLASS +G_SOCKET_ADDRESS_ENUMERATOR +G_SOCKET_ADDRESS_ENUMERATOR_CLASS +G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS +G_TYPE_SOCKET_ADDRESS_ENUMERATOR + +g_socket_address_enumerator_get_type +g_socket_connectable_get_type +
+ +
+gnetworkaddress +GNetworkAddress +GNetworkAddress +g_network_address_new +g_network_address_get_hostname +g_network_address_get_port +g_network_address_parse + +GNetworkAddressClass +GNetworkAddressPrivate +G_IS_NETWORK_ADDRESS +G_IS_NETWORK_ADDRESS_CLASS +G_NETWORK_ADDRESS +G_NETWORK_ADDRESS_CLASS +G_NETWORK_ADDRESS_GET_CLASS +G_TYPE_NETWORK_ADDRESS + +g_network_address_get_type +
+ +
+gnetworkservice +GNetworkService +GNetworkService +g_network_service_new +g_network_service_get_service +g_network_service_get_protocol +g_network_service_get_domain + +GNetworkServiceClass +GNetworkServicePrivate +G_IS_NETWORK_SERVICE +G_IS_NETWORK_SERVICE_CLASS +G_NETWORK_SERVICE +G_NETWORK_SERVICE_CLASS +G_NETWORK_SERVICE_GET_CLASS +G_TYPE_NETWORK_SERVICE + +g_network_service_get_type +
+ +
+gsocket +GSocket +GSocket +GSocketSourceFunc +GSocketType +GSocketProtocol +GSocketMsgFlags +GInputVector +GOutputVector +g_socket_new +g_socket_new_from_fd +g_socket_bind +g_socket_listen +g_socket_accept +g_socket_connect +g_socket_check_connect_result +g_socket_receive +g_socket_receive_from +g_socket_receive_message +g_socket_send +g_socket_send_to +g_socket_send_message +g_socket_close +g_socket_is_closed +g_socket_shutdown +g_socket_is_connected +g_socket_create_source +g_socket_condition_check +g_socket_condition_wait +g_socket_set_listen_backlog +g_socket_get_listen_backlog +g_socket_get_blocking +g_socket_set_blocking +g_socket_get_keepalive +g_socket_set_keepalive +g_socket_get_family +g_socket_get_fd +g_socket_get_local_address +g_socket_get_protocol +g_socket_get_remote_address +g_socket_get_socket_type +g_socket_speaks_ipv4 + +GSocketClass +G_IS_SOCKET +G_IS_SOCKET_CLASS +G_SOCKET +G_SOCKET_CLASS +G_TYPE_SOCKET +G_SOCKET_GET_CLASS + +g_socket_get_type +GSocketPrivate +
+ +
+gsocketclient +GSocketClient +GSocketClient +g_socket_client_new +g_socket_client_connect +g_socket_client_connect_async +g_socket_client_connect_finish +g_socket_client_connect_to_host +g_socket_client_connect_to_host_async +g_socket_client_connect_to_host_finish +g_socket_client_connect_to_service +g_socket_client_connect_to_service_async +g_socket_client_connect_to_service_finish +g_socket_client_set_family +g_socket_client_set_local_address +g_socket_client_set_protocol +g_socket_client_set_socket_type +g_socket_client_get_family +g_socket_client_get_local_address +g_socket_client_get_protocol +g_socket_client_get_socket_type + +GSocketClientClass +G_IS_SOCKET_CLIENT +G_IS_SOCKET_CLIENT_CLASS +G_SOCKET_CLIENT +G_SOCKET_CLIENT_CLASS +G_SOCKET_CLIENT_GET_CLASS +G_TYPE_SOCKET_CLIENT + +GSocketClientPrivate +g_socket_client_get_type +
+ +
+gsocketconnection +GSocketConnection +GSocketConnection +g_socket_connection_get_local_address +g_socket_connection_get_remote_address +g_socket_connection_get_socket + +GTcpConnection +g_tcp_connection_set_graceful_disconnect +g_tcp_connection_get_graceful_disconnect + +GUnixConnection +g_unix_connection_receive_fd +g_unix_connection_send_fd + +g_socket_connection_factory_create_connection +g_socket_connection_factory_lookup_type +g_socket_connection_factory_register_type + +GSocketConnectionClass +G_IS_SOCKET_CONNECTION +G_IS_SOCKET_CONNECTION_CLASS +G_SOCKET_CONNECTION +G_SOCKET_CONNECTION_CLASS +G_SOCKET_CONNECTION_GET_CLASS +G_TYPE_SOCKET_CONNECTION +GTcpConnectionClass +G_IS_TCP_CONNECTION +G_IS_TCP_CONNECTION_CLASS +G_TCP_CONNECTION +G_TCP_CONNECTION_CLASS +G_TCP_CONNECTION_GET_CLASS +G_TYPE_TCP_CONNECTION +GUnixConnectionClass +G_IS_UNIX_CONNECTION +G_IS_UNIX_CONNECTION_CLASS +G_TYPE_UNIX_CONNECTION +G_UNIX_CONNECTION +G_UNIX_CONNECTION_CLASS +G_UNIX_CONNECTION_GET_CLASS + +GSocketConnectionPrivate +g_socket_connection_get_type +GTcpConnectionPrivate +g_tcp_connection_get_type +GUnixConnectionPrivate +g_unix_connection_get_type +
+ +
+gsocketcontrolmessage +GSocketControlMessage +GSocketControlMessage +g_socket_control_message_deserialize +g_socket_control_message_get_level +g_socket_control_message_get_msg_type +g_socket_control_message_get_size +g_socket_control_message_serialize + +GSocketControlMessageClass +G_IS_SOCKET_CONTROL_MESSAGE +G_IS_SOCKET_CONTROL_MESSAGE_CLASS +G_SOCKET_CONTROL_MESSAGE +G_SOCKET_CONTROL_MESSAGE_CLASS +G_SOCKET_CONTROL_MESSAGE_GET_CLASS +G_TYPE_SOCKET_CONTROL_MESSAGE + +GSocketControlMessagePrivate +g_socket_control_message_get_type +
+ +
+gsocketlistener +GSocketListener +GSocketListener +g_socket_listener_new +g_socket_listener_add_socket +g_socket_listener_add_address +g_socket_listener_add_inet_port +g_socket_listener_add_any_inet_port +g_socket_listener_accept +g_socket_listener_accept_async +g_socket_listener_accept_finish +g_socket_listener_accept_socket +g_socket_listener_accept_socket_async +g_socket_listener_accept_socket_finish +g_socket_listener_close +g_socket_listener_set_backlog + +GSocketListenerClass +G_IS_SOCKET_LISTENER +G_IS_SOCKET_LISTENER_CLASS +G_SOCKET_LISTENER +G_SOCKET_LISTENER_CLASS +G_SOCKET_LISTENER_GET_CLASS +G_TYPE_SOCKET_INPUT_STREAM +G_TYPE_SOCKET_LISTENER + +GSocketListenerPrivate +g_socket_listener_get_type +
+ +
+gsocketservice +GSocketService +GSocketService +g_socket_service_new +g_socket_service_start +g_socket_service_stop +g_socket_service_is_active + +GSocketServiceClass +G_IS_SOCKET_SERVICE +G_IS_SOCKET_SERVICE_CLASS +G_SOCKET_SERVICE +G_SOCKET_SERVICE_CLASS +G_SOCKET_SERVICE_GET_CLASS +G_TYPE_SOCKET_SERVICE + +GSocketServicePrivate +g_socket_service_get_type +
+ +
+gthreadedsocketservice +GThreadedSocketService +GThreadedSocketService +g_threaded_socket_service_new + +GThreadedSocketServiceClass +G_IS_THREADED_SOCKET_SERVICE +G_IS_THREADED_SOCKET_SERVICE_CLASS +G_THREADED_SOCKET_SERVICE +G_THREADED_SOCKET_SERVICE_CLASS +G_THREADED_SOCKET_SERVICE_GET_CLASS +G_TYPE_THREADED_SOCKET_SERVICE + +GThreadedSocketServicePrivate +g_threaded_socket_service_get_type +
+ +
+gunixfdmessage +GUnixFDMessage +GUnixFDMessage +g_unix_fd_message_new_with_fd_list +g_unix_fd_message_new +g_unix_fd_message_get_fd_list +g_unix_fd_message_append_fd +g_unix_fd_message_steal_fds + +GUnixFDMessageClass +G_IS_UNIX_FD_MESSAGE +G_IS_UNIX_FD_MESSAGE_CLASS +G_TYPE_UNIX_FD_MESSAGE +G_UNIX_FD_MESSAGE +G_UNIX_FD_MESSAGE_CLASS +G_UNIX_FD_MESSAGE_GET_CLASS + +GUnixFDMessagePrivate +g_unix_fd_message_get_type +
+ +
+gconverter +GConverter +GConverter +GConverterIface +GConverterResult +g_converter_convert +g_converter_reset + +G_TYPE_CONVERTER +G_CONVERTER +G_IS_CONVERTER +G_CONVERTER_GET_IFACE + +g_converter_get_type +
+ +
+gcharsetconverter +GCharsetConverter +GCharsetConverter +g_charset_converter_new +g_charset_converter_set_use_fallback +g_charset_converter_get_use_fallback +g_charset_converter_get_num_fallbacks + +GCharsetConverterClass +G_TYPE_CHARSET_CONVERTER +G_CHARSET_CONVERTER +G_IS_CHARSET_CONVERTER +G_CHARSET_CONVERTER_CLASS +G_IS_CHARSET_CONVERTER_CLASS +G_CHARSET_CONVERTER_GET_CLASS + +g_charset_converter_get_type +
+ +
+gconverterinputstream +GConverterInputstream +GConverterInputStream +g_converter_input_stream_new +g_converter_input_stream_get_converter + +GConverterInputStreamClass +G_TYPE_CONVERTER_INPUT_STREAM +G_CONVERTER_INPUT_STREAM +G_IS_CONVERTER_INPUT_STREAM +G_CONVERTER_INPUT_STREAM_CLASS +G_IS_CONVERTER_INPUT_STREAM_CLASS +G_CONVERTER_INPUT_STREAM_GET_CLASS + +GConverterInputStreamPrivate +g_converter_input_stream_get_type +
+ +
+gconverteroutputstream +GConverterOutputstream +GConverterOutputStream +g_converter_output_stream_new +g_converter_output_stream_get_converter + +GConverterOutputStreamClass +G_TYPE_CONVERTER_OUTPUT_STREAM +G_CONVERTER_OUTPUT_STREAM +G_IS_CONVERTER_OUTPUT_STREAM +G_CONVERTER_OUTPUT_STREAM_CLASS +G_IS_CONVERTER_OUTPUT_STREAM_CLASS +G_CONVERTER_OUTPUT_STREAM_GET_CLASS + +GConverterOutputStreamPrivate +g_converter_output_stream_get_type +
+ +
+gzcompressor +GZlibCompressor +GZlibCompressor +GZlibCompressorFormat +g_zlib_compressor_new + +GZlibCompressorClass +G_TYPE_ZLIB_COMPRESSOR +G_ZLIB_COMPRESSOR +G_IS_ZLIB_COMPRESSOR +G_ZLIB_COMPRESSOR_CLASS +G_IS_ZLIB_COMPRESSOR_CLASS +G_ZLIB_COMPRESSOR_GET_CLASS + +g_zlib_compressor_get_type +
+ +
+gzdecompressor +GZlibDecompressor +GZlibDecompressor +g_zlib_decompressor_new + +GZlibDecompressorClass +G_TYPE_ZLIB_DECOMPRESSOR +G_ZLIB_DECOMPRESSOR +G_IS_ZLIB_DECOMPRESSOR +G_ZLIB_DECOMPRESSOR_CLASS +G_IS_ZLIB_DECOMPRESSOR_CLASS +G_ZLIB_DECOMPRESSOR_GET_CLASS + +g_zlib_decompressor_get_type +
+ +
+gfiledescriptorbased +GFileDescriptorBased +GFileDescriptorBased +g_file_descriptor_based_get_fd + +GFileDescriptorBasedIface + +g_file_descriptor_based_get_type +G_FILE_DESCRIPTOR_BASED +G_FILE_DESCRIPTOR_BASED_GET_IFACE +G_IS_FILE_DESCRIPTOR_BASED +G_TYPE_FILE_DESCRIPTOR_BASED +
diff --git a/docs/reference/gio/gio.types b/docs/reference/gio/gio.types new file mode 100644 index 0000000..bb59b84 --- /dev/null +++ b/docs/reference/gio/gio.types @@ -0,0 +1,105 @@ +g_app_info_create_flags_get_type +g_app_info_get_type +g_app_launch_context_get_type +g_ask_password_flags_get_type +g_async_initable_get_type +g_async_result_get_type +g_buffered_input_stream_get_type +g_buffered_output_stream_get_type +g_cancellable_get_type +g_charset_converter_get_type +g_converter_get_type +g_converter_flags_get_type +g_converter_input_stream_get_type +g_converter_output_stream_get_type +g_converter_result_get_type +g_data_input_stream_get_type +g_data_output_stream_get_type +g_data_stream_byte_order_get_type +g_data_stream_newline_type_get_type +g_desktop_app_info_get_type +g_desktop_app_info_lookup_get_type +g_drive_get_type +g_emblem_get_type +g_emblem_origin_get_type +g_emblemed_icon_get_type +g_file_attribute_info_flags_get_type +g_file_attribute_status_get_type +g_file_attribute_type_get_type +g_file_copy_flags_get_type +g_file_create_flags_get_type +g_file_descriptor_based_get_type +g_file_enumerator_get_type +g_file_get_type +g_file_icon_get_type +g_file_info_get_type +g_file_input_stream_get_type +g_file_io_stream_get_type +g_file_monitor_event_get_type +g_file_monitor_flags_get_type +g_file_monitor_get_type +g_file_output_stream_get_type +g_file_query_info_flags_get_type +g_file_type_get_type +g_filename_completer_get_type +g_filesystem_preview_type_get_type +g_filter_input_stream_get_type +g_filter_output_stream_get_type +g_icon_get_type +g_inet_address_get_type +g_inet_socket_address_get_type +g_initable_get_type +g_input_stream_get_type +g_io_error_enum_get_type +g_io_module_get_type +g_io_stream_get_type +g_loadable_icon_get_type +g_local_directory_monitor_get_type +g_local_file_monitor_get_type +g_memory_input_stream_get_type +g_memory_output_stream_get_type +g_mount_get_type +g_mount_mount_flags_get_type +g_mount_operation_get_type +g_mount_operation_result_get_type +g_mount_unmount_flags_get_type +g_native_volume_monitor_get_type +g_network_address_get_type +g_network_service_get_type +g_output_stream_get_type +g_output_stream_splice_flags_get_type +g_password_save_get_type +g_resolver_error_get_type +g_resolver_get_type +g_seekable_get_type +g_simple_async_result_get_type +g_socket_address_enumerator_get_type +g_socket_address_get_type +g_socket_client_get_type +g_socket_connectable_get_type +g_socket_connection_get_type +g_socket_control_message_get_type +g_socket_family_get_type +g_socket_get_type +g_socket_listener_get_type +g_socket_msg_flags_get_type +g_socket_protocol_get_type +g_socket_service_get_type +g_socket_type_get_type +g_srv_target_get_type +g_tcp_connection_get_type +g_themed_icon_get_type +g_threaded_socket_service_get_type +g_unix_connection_get_type +g_unix_fd_list_get_type +g_unix_fd_message_get_type +g_unix_input_stream_get_type +g_unix_mount_monitor_get_type +g_unix_output_stream_get_type +g_unix_socket_address_get_type +g_vfs_get_type +g_volume_get_type +g_volume_monitor_get_type +g_zlib_compressor_get_type +g_zlib_compressor_format_get_type +g_zlib_decompressor_get_type diff --git a/docs/reference/gio/gvfs-overview.png b/docs/reference/gio/gvfs-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..628684dc350d2428170e169099263c6fd13ae9f4 GIT binary patch literal 48474 zcmcG#1yo#3(=Ix=LxA9(pdnar*Py|JI|P@(-8BS)1b26LXOO@ocyO1H;BJG@8It!q z=f3}1|6TXobG>mIsgE`l9QEE0{{>ZU|%X!WZ0Qc zJQ)43KX5K;G7^C5G4fs54`fpX87Tnt>66=4k^nn{<|wP<0s!ECgnd83A(d1g!cL;N z$|=4@SwKd`W@AQSn`MKYB5{4I?J5bhw>Nii1xPxZo4A^Pp!TqKwW5}hQ&iCk!X^R$ zr~z_P;_p2d4^})fpI<(JPv;Jf4lf6Pba27Ft;Br`=Yut``jWJO<5lxLSLBa*TT{7c z)9J5xkzF#XwE3m;xGIIR3Eqx9m;QQN5b(&#*vjE5?8ANZ;45_1TPxTASvhVz-d-96 zypxhD9OfLo>c}Ju&%-3bUBL1L5He9oNwqg32(AP7R%u>LULI4hnumOZ9kP%@V=<|x zqc`yB_eVzJXSh!X62gn8BmbYP&oTd8{TK}Q=c+0@^`Fb=$batr-@DmbozgrAChqG` zG4R<7a~b`!YUZu77=%AvPJV)a&xgE@Tpzg6v(Zx~mS0~TFE1EiV}Pk&ZioA)-${+M zK&p9jP&a%w;0T%C^$VAKvhMl-)+2O{l^oM`F#VEreS&_nWESvOA~I6X8)K{!!^=mE zUyUz}vYViz@W_BUt2F5E{72B1#5wnZ!9m2;DHFD0Kvn}m!qp7nMG^2tvOM0uzvpq9YT(D+Ey}o%9xN6 zoJcPz*%^*8T%6_h>8g9KZy+n~pP6*G{2uc=ogL`_-1mGL@F@^@IA`aR<&QOs2AEsw z6>B{tTB?E0hfO$!c_38qJo4o(Vq<1wHLSL{)6CY+Su0Yjpmo}?&0$k#o1!3S^r(mG zzV9oVySY;cnmVK|)eL*+NHN8d@216GYM#aDK`>ce`!thvV81S~9*vB&FL>Bfk%uSv zSs`eyu0404LS;UEbJ8mA5q;fG=0rUMY_xQ9Pg|S9ieHuQAkh(tK*44W^*yq=so8w{ z0dkUE(350BbT86ZUKBu*Y7@}>Qexv;U50uB<(lY(|0K*nrGlb16GwkmO5jZp%HeN~ zo=)~KNX6lA;X0dqy#n|3S}-dB;e#N0SPgHTeShDUu)B#Bq2}SEZ{;aTQ;uku2HDD@ zz1}8<3^hBzR_uo8>hTUkQ?ZSzb)0os5TSNaEEh%d@V4aY^i-%8^ss;|BVu~IAI|*{ zbud?A@2k%QnQ^^AU&{Q|qcA3N}um|M2(Yg8&csjDqWG zYR$O>qC;Q#MuZHPAR~VCOpmW#OWMM$Ijm z!yc1BBc5x!M1xv10r>E(=&z(66BB7Mzh~@g?HgxJG+x6WOi^E#HI*2s9Em^FQFzSX z9pU#WE9{dmsS=cIa#MnfrlbT*KPDd87`%9n=_*aoQ&X3Y#eA?B>{6S)y=B7f;ukXm zJ|;Bod@0a978BTSaKETt_F#j7RT2_1;p&J-m5!}cXj}0${nfd9Wi`F=%#pxdbilf{ zNPFb*-lp~#@MPgR_zYNw?A0tydh)UBo=Gz$iJ2T}q09+0MlCRb%y-KT5p}rWzPsQ> zXU>oHZpvf(g5L-Hj;5h*cn9?ZLhD6@gzzCw0`8km`qJo?Hf>~yOoeV-fqY}W+96?@ z{H*>s#+T-Hp42$?Mhr_$^a0JvgAoT3XMEt>L*Xv1LrheARhMN)fmWBg^xk9S$1+Jq zRxXN6*|}%-wm_Up2ca>a@7poI)rCxnPRa8tGIz<0Gq{kkU^SN(g0 zZ-^?6+s3i+C_k&my%%)!)DLx2YCtHJ7j)zUr5y`(M#49ruRiI1=@imwFPGhAvNp~O zH=y0L>%Zsm`%{W1d5V%xxYxJ}d#-UVr_TT`DklB=f~n{IF}{kGk3LNef+IAyyItw( zaGAl}o8rZOCf{~)h4wz~uK%p_YvjFfgnO?5Gx>aRXw;mmDT;uDVxQhLJCbckthKBP|&(S@G+6`wX@ozNjS38FCkTvb_M^zB5d9 z<}zBYjNpigz-+55WFbqL-h|E6YJg)E1uCuCC}I4MAg^iMsonvzyJVa1u8vK-an)RO znZ+Uakp`B;Eu16WN-XsVkg%)E?~Tw0l#_J7fT5T(!4~}TI_|nxEitkEO}ngM?yW?| z=I;#{QxECd3^YRkhSeqM;kEVEq-Vd~n>fX0H0u=`kG=X2-UNaltI-6oG;VTVf6Q@< z`Q59{4XTs20Gc#mXMO<9E$(*pkanDWet3XP)x}yLm;N!PLZhnypVdO5<0+q^uD~DV ztc?)Jo_D`=ntj)i(b`QJ%3XTS(lNQECed^wcmS2@N6~j+!)by(40Yo)g}bafHrg<2 zq}MZl@^xwIZT{hm-81^xq+^a8ZozXMsGa19P-}4|=kU{W=QX&9k$A_MkT03RBcDrH zp;Yd29s8YvWg0ds<&sPR_f)U=TsEH4RBvQsSO3f908;0%=AWO>IwDM)V!D5N0$mc9 zL~Mz^BpeO}F78SL?S3Cu9h#Y$lMFHAqQFYj~3-YgyyiAs9odxY^ua;mn zf1Z^E`x`1;mle#--xwW~S}iP{-uRd_FNA5Br2e2zjdIOlasY3t!5~m)EI0;~=7tmf zb4JboE?7T!=Iv&+QXKCOB^0fWqXt!9OWP7x+kK`DT|o+cdqbhvnUx*Pb>d3;O-btv zR-@C*f6OUWc`DsBSB_C@W6FF0tr^@)Z|F0$iF2FUWWTR!Q|RWVSgr+vU(#UWoxUQB;uGv`S2vXeUs-uB)*ma5s6> z0bd>s@&U>A{k!L!y0U_}kt-+tN8O$m8)$R#iw1m(-T-8?N?vZCO?1qfe^XCUWIasS#|d4CJm! zu3>&$NxyV+$v9i-0Q&swUf)`aaAp-OW2Wd~D6zQ+5kBaHqDxdsxEyF5b_EnaWX*%W zb*Ls|>H6q@3Jzl3XOv-QFG(}bZIke{?TnrwD1oooS9?vg(mX*@5)uWz8nxbabIWk*aN*9cS*(G!=8?b#(*fDvX)C`I2r24s+M<*e zs|GkDlyJCBVz)=;n-3p)Eqq*cmau32B&Y`a8z>WdTDdtnjNm2 zo8qsnrQ4gWjDzYS=jT`c)qb9qhn%*>W^O;62v4%>F_z8`H~Z{S;K0UB?8Mqtm)n42 zV_`s}R*3N_US)EqZ^su)5oWpgAKciutHRUD>=60LYW4Vrz#R;)FqEQ_i_c0zN z@e`a)Of#%x8oX_yra0x}akgG~xr5VeOYq`htmWlB{dRwikT%YtP1Iq=lIRrL$P{{udh~TKqDA=Ap*x%ggEA`-YrkCHKghCX1Sny+VcRlw~y|3xQ^GBj1Os|zFW=Sz218lm=A zJ?W~ZNV5nbq?Gto{D$w=Nl0;49ZKEhTMHS_f{5qh=dA&CvUb}F3N@1L;opzkS*>h- z@I=>-4VL$2#d0StzN)kazdDRo9@xXc+p`cXd;8k;jqhK=^zp|2#y{K8(kgPNFhT7m&u>B~K4!1zPU=EoL$urz| z?PCg3&Od4Lq$1Pbtopx6n-8+Nno3=nq69pBVA*y2N~G@JwEDkEx;q%Ks0nf73HeoY zsQ)JD?Nn1-Noe&;oS2f}_JgZwMcMyjDZQ)opJZJYVn!?-)xxc)PQqB9p)&l3ERf|b zN`~BlPQYZ!FU9zY@lN zKU!|95=3W)vqY_Kv`3AZf>cAk%PaJ4Di)8&3G<(34twoRVJ*tN7|j9)w#nX5znCnd z_}K0(dw_J)4)28#n`PBqQ08`@RKd3&DCuctu9^@~a!f;1_iK}3Cu6;|pX))$YvsNF z!(5wUG4vaAw()8|XmF)(t>j$Z-Q#JJaO1I0$D;A~;e*5(^uZ;fcDeQRVs2h=Ya zbqG^{`Nx3-^2?>zeS1OZt(^Y-x=(7cobxf-i1(qod$OjwhHj6ROU}l%2?@aW`Wqd& z&$iZ(UA(L~+mrC!v*|a~97F&C@!=lBGDFSx*8pvO-F|;-v`Z1T@hru$(u$p>7B++k zs)0TT6NP9FQ)l_{U+urkK=+&(ukKatA!iC?d&z9w zuJ68HN*nqrt(=vE0!Yt~fk&MG&_gU2DJ5(J_C%FhpnHb!ZOorvUD$pDmAi({Sm2@CIM(a4y|Om z3}n4tQeCj>5WW%($6$ksK00nV(el08Oju?u52-6!I6MpidHcKv(UA(Q{b8M8d=(Nx z6(%xZM2v~5>jn?leaYjpngPBw(6|(#V&7FG3}BC1y_(Kvq9jU!;~Z>kM?-#qjrwVA z!S1z=HSWPo-gGV*xbk=>TG9O&sAU07@S*f6sGa~pMvz|ne0T%6D`Kc`tV9kp4T!^R z!G#E^Qd6&l4L&hqvQeJoVcSFO%4kT>EwFp94(>%&6dnmjywmi z5e=L#Tg{)?a}51C_RHZ-K%$TWvhRDMUkd#FdFIw0-Zg+2(vL*@DO>qL} z&j9rOzU|TqyWlWT3dFpt`M#B8%5UH|3v7x-mQLf zx8|@_7`gdf-aWp>n$E?@J9FQ`E7Q~{4rfg#3Yu%%*e}(`4w&*4BcYjOQu<~~fGIm{ z1*rS#+ZEXl_?iA?oMaA&UcpT2fqO=awIRx!e7Y6d-Pu~urz>hToAH86r7IExM>udH z%7gpH16ip%xQI$fDh9le*Zb>6G<%Q@dQaF*KM5pui0QcH*t);`S=uhi#rsivJMF;X zFKp_5&2VB|V-1K+vm_r~&rb7PrhMa#y|uHebqY!nW%rA9MfP5C+uy$1i+$tHfW5W0 zX16{H25vW+(X%%i;o#vfx8i@<`QgDBLE%9ka03yV4Y+U&5d-wBFZ--gd+h2vbl&S@ zlQ*D{d^g1Gr)FZw!1bXTVY68Mnh9(n8U$-gLQ&9-~H=VnZq>J`X>tMitDBgOX6GjXe z2o${#F4K?#xBc{<8>HQ3qs{Xw|l7_-5(ivJhvV%teUII3q@cCRJ9ai)%Z`u~&Y)uY) z;IJR74`x?ZE|d%%ow6X`l;cs1F1&*`^1DoY*169Y;qL%MTS66;Ys}wCYq+TIOr+rS(lHxJ-hA_(*5a4tnvFEk7j@QbggZ-#R-Qm z&#yx?=0V4N^%T}@^Q~-QkM*?y{lBvZDJ7{U(DMFp^|Z;s5bv|*OmQzoxe(=Y)N5Y6 z6JTNaPy0{uV;@wY9gbvU*jRA#XKW^xKNtdafct?^hF3%W`S}O@@^6mwjmCFzLn6a5 z>nV1J>2`9!$%h3j_aSL&E*C zsBxj;U=JndiTC8moNsUSp_b}KO%G-@JsVV!@j)=Vv0`UsQ@`_Q8hO8xjtwe^3=yb3 z(o^urR5H0y2DEm9Co8s#3Ta~o*?q6eLB)(vWcdpBpEcf*RZHRQg;2WFVb|?rPLEpK z{mV;#quec9cZZw>#zW!o*F`8ln&f5Y@;RQC=OhjKtL8Zt$e{~`+$tP#I7a_BS`Kqk zKjh_@jiH_dcJdUULn$WNeX9Lig{t~0jyV62?3bLEV$0Qtm|FCaOeH@&))hPrG_x$t zH)=|;ZwuZfEuDHKs}FJ^U$upQ4JF5X86WzU>EcMR$$`S?`z0bC>j&dwX4#7i)DETG z`PLm-tM=Feu;f&puI zL!WO!;|ZR8U3Zz!dHyq14w(k(`qG;*LagIVm`i3HlE|R(K>wE6E+h48qIVs(alHE` zUsfVNH*@RzObWUr8tk!HXe|^I7I73oMx+g*_0hIx?gDITqSEyli0`N4uL2|t7NPGX zT3N-Ud4ydCXC7J_jo)S*h9nxA_~&>?&o>Sq$*qLKqLubG?d|ATElAvZ4?OcAc|h}_ zXXay9KnU28x5GeZA-VncMf5joC^?==)ije29-bd{ZUbueDT-^>dU^`^? ziBlA%7;Ns$U}Q~GPz*`4%^X6Qfkj>>x=4HIO-J~9$svyry~IH&tyb@;LgG2Jroi`7 zSy%lMzfXJmc$QFBi6>b*82*7N3hrmq3C;*1w;vK(Yzeu8UcGZ+ATVcBQN4mUj*H`q zzle_dHpJIys6_}W@cB`ES&)CLSG-VP%_IH%{27VrxW;?YL&Z_N55!#**5mdKe(RrT z{+G(cz(sRR(ldgGyH!PtTUFZWndFS?aw4_ba|s^%uCze2#W6w-j1JAgREsW0$->cK z=Rc3+8b1&1XmYB_DG5jYnr;XLaBJkK8eZXr4V<%coN5UxJ3M~J+`Hjq4s`T_xgKEN zY(BjuILt}`Hd3;e^jm#B=C|8Ls`|_FlDHrar!aOIG5|p zwdAqhV?SBA4BTSdtpI^NH99P8hc`5UKcDUUa#-6$EbnVf8W)c#>1+(8aXjPWb4xu_ zkdhJr!InT#5IR8Kci=*P#L0KBz-pU8(ZQ&86aAH~f8X|!RIIpB{Dxc^q>bdh*@#Dfhv!OuHlJB{~_H2P;+YU=d! z2TG&a3|g+8S0B>#7F4y#?pwc)Q4-Ag0x3ckuRaEnR1&4i&J_yJ58jKkZgcN=VPrxC zgzki2FTo+rtm8;f1H#N}U0(`aqGj@6Ad4VEKdbyu)yPW^fF%Uvlj^s#EGhP&prLg8 zRExMkAPJI}Xvwrt@P`!MpI37CvKp7Mh`~v}fL)pOL%$IfMN>uYxz}oK?=JHsTnF7^ zde$v3_MK`e*nJ0*M^jXEPbq?oo0_VC1Vv#jwO&h`hzMk5m8p^h{eo|^Nsi2R6F3%? z?&O>8+S2QXG!RFrEowvehT0D1-&8rg3+3HBE^JHKOh2yL$du*=*^$tT2L~w%khHTm zVK(MX!t))`T=!+a;^(JeO+!_Ogm!t0E8$(+8Y_sr*2jY0Vu~;aR%NU=qO5l-Y_wqM zqVcfWf-Z;_He>6*G_k#vqJ3x5z1>Bdm=!gCfqya1;BkJhk~c>zb}a6p(tR1=cAPey zL&VTF2a>BvleTuF5r;~gIrop39Lr^kgD5xmp@#>SyZD`%6mO}XU9cE~n~`wUcIoNP zv2V?fm#oiNn&yTtP_q@q7o3B+UA_-zk#(GyG&r>=j z%`egKgI>JDbL>F*lFAj-7>yyTOgT#r8$VN*A#KK*s@fw#P%cgia|GfsV-}{tjS%uX zf~%j$H4W>~S-s%`>_DpV&;Cm?*}=>ydcz@Cp^7OziXMGgxW%$ciXrt&2NZidBF`N_ z$%H-Md}!DJ{0}CVz&x4IeaS zMJ`KXN;rHFBAYLtaPwh+3nk`o=#)RQhf=gr`@IO?Z=fc1TsmBiAp!rhr`m@2m7I38 zrXVT_0|>DjJEkMJ*)N!Ac10iBCHRQwG2uHJpzh#_De}6d8~Pa0|cdIkFec|dtgV+OF$R3>t$P=m`XkiUtA$eyi z`TmPCPZD78V{h8U)+n^NRAEG(Z46ufX0 z@um0tJdd$>%IJDmzVS68ml}ZbE_|E8X6-4`{ums@!_5QNUEQ1vstA`%5TK`kLKuBb zMENRf`L2v5)uTSa8o^jT;;eW=bYu&n-aJ1&!)L(HGR#3Z$oL-PCeAv&C{kiXBuy@l*QI=(oj)k|NrSFppL%2@w&E+fzMg>dzqX4ajll=6RSX5hDo{^c~D1hDRzsQMgG0<#V-Hm z>v>V!clbv)40dQ%RIsh!X?Q#vS3S0Ky^;L0P%S^40*5f>?cU%~6&3qY5nT-g+vZ*j zqrQdM-kyl{EFs&B%GHxCw@Z*m=Vlwy-0QkxRukYfC{Yi9i8(SaR8rN#EJC%SX4SI{w zF%;$Aq3V+BXGcxYK8g*MTRHxju6Cha93kH`cEyH=Se<_3>yxHMIGEo~!2EXl&BUy} zL+jpl?Ss4L5f>kjJo*rg#IRym*%ba_C>X8ZWGnvU_P2^7{{79#U=X0E&a#gMMI1z1 zA(oSjd58U3L|DrJHAGm`BX5Z^;&6}k$q6Uz%gn_JIkVzyNa6_pL@!_E|5U2L960rF zb{6k2RPY)`PtIz$IE20t|6BOu%1gnaBwi>?5}voI?{2$C|0L}HO7YKsN$>v2MxUsd ze|+buYF3gvW2fo_og^;&@?`%|a6Y0EtF>;5Rd=Job$t#3^NA%%C zf1F7z6p`=dJ)fJ}L6{dzfo{y6X+?3V!t+zDKEJuX6=g9U>UMkNdrV3{(&89*wHfY(xMiul^&dkkHI62!vOhLjcW?KCED( zvt8eFF^Tn$TMxe=Pvs&oe3ZY_lq#G;LVV%}3a1#?u&o~|e}}%mE(0KY7ObsmVHZF` z{bEC`r`GSwE-}uVbe&g#4m>pdNJzsb2cGkq_!d4y_ow!)`%;INxbaH3sDA{x+-zh| zoRvnIVj$Wee00-WZ(`U-fj@Lscj~2+0ig6R*W^`_qC0QIR~!OfphB{cmi!jSVIvQN zt;~3(U!%Md!|FA=y4ExR9SPrYhx?nAAqVXwz!oO8;pF0hn z>56oC%qc*-J;aXLH_80Zt*pF$96pJB@{z*$%cQ*DKbQ>I9;TGhp#II9Z74-#jX7_n z1Tchyw51C1odl70Z{MBpaJVSDG~9~aDPMZ&yI(`PcJqFx<2?;*OybYXeAAY(?eQ>& z2@1h`iO3%lG$H=<1me#c_?-2Fxlzc+Wokd&;#x~a{-diF$9{?4-^C`20EW^x3LQ6B zr#v2VZ>-_)=^`vg{x1bpQ^fN9%vY}oeU}E>(fzcaKR(!i`GUS;!aDy$Pfg025(;_5 zG?AAEl}+W+hdXdntWX79-Jcw9v!StA9+o}4{)-iT0>9<>oC2FN?`Wb$F?ck%K?X;> z?DoDpP>LTE+xyUvNwG}`)c>v3O|4#I?At$#m8|xWl;@!!pHu54RHLS^^wIJ6VXZOl z^F*CZr-~ty(KntOXnc28#GdS(4U>!Xw#uI8ckbPJp6gNwS83=uzBn2pj3Z$n17t`| z-K^Y5D44;PD(a&vA#CTcK!F*LVJAf95w%4GG3;@tS&j@b#R!Gh2(ApP+$Z0QRa|oH zF2v<-5i&~Mx;*PFfqrmJI2aRQZ-R{1fw$f}zP=aI2!u`5TWaGcY}~!D`LsT>z20?G z>q%nwJ?u>WgjQS{8x+E9uVHyMXDUkyyvPB@PJMS&5-+ee2p4wij6F=OnAixf9ki3W)ugw11K`vp#enck7S8EBdfaTjF`W zdltpWSOsT%Tmn_hFL9!HH!vByaI>qGSiK~rs7hkIKDHx%HWB}U;!UI>{-Cs5G&ucg z>#S(2gzg{}6gNpVr)r@6ZUVSIHbmq0%kUSu-`Jl*`X^0QrKu^dyUBsCj{rYC7*^1M*>v{8*xH%SWvDlip<2ua*L(%DN zScb&D)(s6EMfed~#1W1muh1pm``aovwl4BzX>f51zXjI)2}R`^>djjf1B7t0FX}WU zywT(c1<2xsIdvvTmAV*SH!7+~#Iwy^x4oqt?9PEPGDrvpALGRw&nxWO52WEA#dd_4 zR>WsgYE&<0$ZZ^;RKnPMMD0J=0=_5)Tyu&Cus8ZYN)N3)2omJ@OMw`S3X2zwAZf$+ zzYUmGBzjk-nC|Tq`*Bcz0gK-Ra3&dbz5TH?MdEl&aS0z?I`*)4`OCly`FDmqsju2w z<2h;g4j#43(WU33{0ZWam9UQH+Udbvys`i#Z`5D@BWGkeecM9dA#^6aGbVEdQ2udK zfJx7FX8X8r#hTf`3fnqPYF#pdSYz_EY0AB}XRb!84!zftSTI?}56Ck5CcgiA&xoTTkz0_dK11;oA&{0>+kn z6YUTXb!>gG&`|eXaOX_|$$3eX#NA87J8{~dmjhT~%o|0qJx*P@<>Wk-!Jln63XOW= z8Ye85lKV1pBq!?py*OS&NoVZ?jWUt_!IrEAW>ZV#0W_WWq|Y^Z?*T)fs^$i{Px`g_ z+~gnD@GHY1MiG}tpFu61U%lxvqQx9%IVn6FZ1#@1O8;9{yqmbje{cgQ)cm4hA zjHs>om3^=L)?Lv>@4hcuoYY;kAE>EG#|}E)oK)SV=a)F-UPNSFr+~iBW`wiT8Gubq*ESeHU zdj2Ve-{mz6_w$^Upu5lXbJkjh9(PHORESKqeD@LA9fS zmok;@H8^+or-iMBUHo)xE8hnpm9vssgQ&=cp4baMIQ?(AlWYkS?ndn7-QTO-f=aX# z_)}G@WE8zxCUkFCL-mK0o&xCa;@X?kpjsr)ALE=L+FL)E){ zA=RZBZiR?pXbzSkt8@|dVnY@=L$$s;3}Ie~ickIIae#aAc-}!-6CmQuSC$&B|f z2ur)e_TL^|^g1H&>r*!Rr33byR2f`$q7%L%4QKcsvZ46G>z6;~&8F~&LOSgL;6Rk! znksHeBd?btBQ(bCxVm97X(9m^vMN@CAhRKNwk|JE=eE2N-Fip=1%E|z;&IUL{d*+x zB{q{4q5WkybL9^QO(1GNV{FzI3=duG1#s4Q=~TFm_1U3mKj-jfGe(O)(XC&94PR6v zoUl_H7AEjjnUC^^>nhM!*>}B59irKtz@H#0sTbMWGtYJ~reXqD)7IU^ZFtCeu)Jw? z_OH)O)YFFekc@;*LUN@fRQjnMg8{fVs@iZCU^7^U7S|0l$xomy4oZSulCtKGM zCgL4ZJhoP*X}Uq0%}+TqELx&1h=JwXpc)^x-TEl9OFiy-hNLXCmc;&}k;I)ke5|UObDWcXG6Q+*~hh(;Y4xGozB5ZQ48E>LV zOl-$|4A|Qp+I}ilEa~24}gdCBhv_B@+bkj0!D9d#_> z+^H1adj#z#eRh)bQGW%!!|Ppi&GIGK-9`I6mBjZkk702xLySK|bR5GTdc~Z2b!80_ zdTEDYK2!(lk(K?LFoU4Ay6viz-Az8+?Mf$Q3n zrk#Ylh~z`USA=0>OxSBRr#wuO#@f=`a=`ZltfP&lg-2*9`k32U80rjRt56F$tDC@r zJ`Xr&y57*$JZM0ZIyfUZsG8<5?$Kn;1Lwwzk#GF2r`_atQbhAogUtNl7mIh1{8;8j zVM@Om3y@{>$2n;di+ga62QGNkI1~1gTZB*e9{0pbWK(1%g|SiBN>+u}<0hP%T{r*( z9pw^BSU3UdO2YPQFdJD}mlAe>zkU-B@c>P%T|Hd8=})dE_OVIw{>YZOiq%i!pu6bO zIQOsAV|{eiT5%rxcyeP(8~XuT@;GoEL1lVipE6(%HRp# zmY8bF?1NR?*F8g-GPVoDoL{J6mo!-nT|Z=Z9~n z)3%D9{odU#ah@zM;-#am$e)mHwT6ny{z-(`l9c6rD%Or=kCRW7M#Qwl0s;WQ-g|6ox)$p0{<=n0Q5z z%(MQbfc?N$aYn1=tiMRB;p#`p!s+SUd&2k4!~V}A$;CVRK{*q=jrwLSsC)=Iz|ccA zX}9bP>CMtE$zfYiaKHoE7E55#er{!?gYX#oS6UDJ-tdB-wcb%NEyOSqRmQ?UbODH| zTpB)pq1R*w2ablrZBZa6bRoTu!H5Bq@$+!uNsI!E*?61Rye6U%KIu8 z(tq(kd;5XH$J0P7>I&up1wQ(rI;NN&R=P@@#+L?eV~eot9k})l z!Yh+P2*l?!A<4D_b96JaS_40E8i?NS1(%+URxT2|`^0wm?Pqjuj+>7VSl?e9x0Jpv z>%AaQzaNNr9&k!Sj2tNmq2DgW-x0LdUumLWg@rKrvfCj`s^?UV-~z<_R60hQj`KoZ zQc3zgC%KdFFKh*-#gHm>9J&DBSiw$reW}P@aG5Jn>Fvd>Y7|RWn0c_OOXa-{6pr(l7erQSh$bE~Ov( z8`4AVUYX$tB~JoDg*!`h&jUcwdumjv^fRI?FCj+5^KB=xgZfYfyk+TSNQi6#gI@!L zBVmV)U7A52m?%vS=m+=SHl0i%&$pu4Fi_98k%%l~R$PT!C+MlK^BKSAlA zJc^+Lp+tXBINR0lCVC*wpqY& zFZ$v;uR}}aPM8X3<9{E0cEhI1XGv)>@fCF7+&rl2oKC} z{dwWE)nIzQ!Q%#=ewBUvlHD&pW1i_T%_t3AER?9eUjvRI7aUEIhn_3tR0RNF;{DBD3DOp`9!z zo6grJT^iZr4{(Grp>kKLbS=zW-PF%QWeLLJWLnHTiep-|S<{AsW7KstDIP;U0VTKJ zm2+!3m^zoT*}8?X-H(>9SEWwHeZeJN)-zNi;9q5ZU{5TLe)&^nbA3?I8*hQrl4GZM z*9~~L1#L5%qFd3mZWFzC(j@WrOpdq1Qd4lcFsNb?;%&Die4EY0z`UZ@qW^v`s@1Ue zHCIA7v)>vl=ws5c&U57lzm;O1s`HaetJ(A@-=Md?7P;tHw;41PE;>3aA2+m1c%a5p zE&R@D)68#!c2FHQ_DRAhl&}l-P9j5B6;t>X31)&)ApRA4*F(YP;x4(T{>)eIGMf;y z3>tw|*ozVI!Qe@XjgX}#V1)Zb&t_GyjAp5$esdA+z1LmN4Mz#h;mL#@&F^!bxBBDI zjSjcrY{{5dTM=6FdlZ>obBz+Y6j#xkVT^t%OS0}#J$Fb0@|cB1D0)27QXeFPCE(@R zfv^rr*dQ{2KVBPB-qv}I1Z3p_=M!woUymqb&v+kSce8H^jX00kyuW^Xz56gy-t@Zr z#I!rZi(nY&Te@-u{Ml_OI9Xe!coiZmr8m?M0u8H{j@P5y3o_6#eo}F|9t|H$SoI|K zE`14bjvgjCvhvf`!SlMCi6IHSBCg(4gh6>3t>;hw;LnuAc!k$LREEVS*(yn1e^Ejo zbuzfw+5Zfz4#W6{c-AxN3g9aDE<|9_+#fNMDvdbnjJT8cs@~D^&WOzAXR5%>FR*{`FlVH}5^xoMF7>rc)8cx09Du5=A;qkx9Jc`HnLd z@ZHoFZb$?b-CHGk4*AOtgv!~@bi(9SxK(mK3A|y6Kca=)qTL3{wZ9LMQPD#0+^#Ep zQ{hCrDKfqV+>vPB|F(yJ>y^lQ^QB%4G;y^nYBrx3bk)|8p41{Le%gMB_#h5nB*>I{ z&Q)Plm*aS#WO)J{jDSZ2&*zRBRfD+{;Ro^vr=JKopRk0z#dizJ8K+5ewKvTm^;%zq zpmYG@!?c~wKr+fBNjs||KeG~SWBjxq#f&?T=t3yrUv~Lx{S5y4`m@R?sD%o%*77Tf zi>DRfaExvJoIpht3y#Xp5Q(iD1A)OK`vQI>oxnS+tMwP`-Nw?Ze%s^TFRAEk@+-0cY>~qH>ikI2i0uw9c{rfM78m^J;~J z$WVE#IOE%zihQjxiRenl>jUrAA7J*g%8kdUA~1{E`p0 zW(c)7k=wyaknV-Q3-VVGsW)tzjOalt*f@<9knt|y@OpLNP2#R8zF<*mZ*N-)g6dkR`$&_ zwYOiE{_eI#R`^!q({?wEhb6eih+_YYxGaqPh0g-snn7Rewwpz;H#+q3!v7jyZO!M) zWEe*2YHg6191}gI{%+R^Hkk~Ju1)Zomf9PQnTN4*925=8#E}no4_A?`UXBL`hJTi=oysn{K== zN~DIjhW;pN5q^C!NJc8{4llU}%mY!BHQCgpWAebb;2&mopw^PEw1#9#O9RP4n&J7= z4T(=$m3iJ;G;l@$EmL$f;kz#a-sHl?<#Y3kr!EB3?vbLBQdceC3Y+HHu6Ip zo!@CMNM&!Y5qAA1IcQ5}KuG5LuJ{k0nFedsU$u6@Ntxo4fk8h?78Cj>mZ0*p!H{pz zTftY&c3>@CxK^hU^DkVU#5xg_;>VFbysfj1zM>zco>x|D^~zik^9f>g>%!}u=MJGn zGED?9lKY}wSe*opcEyBGch|Zi9WVw0;S<8+GI_%zbmD&hi9l7~Ki#*&2x7dMon`BC zCGt599iL-@j&_$wIE}a7nM-LsXAA;cM4&IGWY-AA&yS`TaUdAf*XPmpVN$$>V!id+ zm0>QBTHMdp*L=RAkEIy9Ex&KKqL5id=>0KSwnT%#M3ZWJI$zF)CM8*&H;?thHaCMx zw-Z8;JQcq(3r$6Uch@*`jz3GIS!{YSCcd>98Sw7qTfOGZnlsLmNAT`ciN99nWQt_N zfhU8~fqtHtq5~tLqotMQCs&@DZUEB2Y|s3;KUNwRa&^FNs=1Z&XfXpzNpcV?tr_$= z{M7+J(ww2vLOu8FYpJ3oMxV=AJ0s(9aLz=;>UOkdcw}Q;whzP47R$8nU7IxMTK06r z>}bi`>U`TqmC&Eig^uGL#&QtW`uMD!HrwoW&Izdy=7P(&$BMNaCdhN?(PyiL4&)yTX2Wq5G1%maCdh}aCdii*R#kk z`@iMhyYD$?uMhC7Su@k!HQm)!?^{)aKc#?s4GJ!Uy7~3li4p zE;wHl`{-d@f{|y^y^6nm@-Rx_SP>ibnXBnKy8)*j{c?9R@$0n+wEY0ejTja!{UJ!S zxh6|nRZ@r!{D4l}x|a(oDPw=K*Xwlt>NyCC31!b;wn=zzneAVOG4m7;D z!bpZpIeJ#Cb>_zo%F`=~cUh5>&R$7{COGyZQJ+!)^%g%xtp(=4VX zLT$9yw|~;GwUpX@5l)On6ebOxY{BPiX+_Eu|1h5*8g%+32GTl1)aVA%=mzDAYntXI zQ4C01@vX-2ZFUBj>O7M{g7rn9-=2W#uQ7aA7FLpcrASY8339wDujpHyeKqDzjo7~l zh4w9WjuaGSJnq1L=jl+GvHz(w0}1xd{fYMK{Zpm}8~&eokpN&g4e(>Y^iL5Rc*s9Y zU`Q9>zq?rH0}Q}#=Fb&M&%Yr2s)VYdp+BIW^Sw7kd_p`9+*SSz7-Ln>_p zE;OIbu{fxSPW8~nqoawul|)I_%9KAt=n{%SduA(%8 z%|nGDjrNLGLA$HUc|VzIjNG3Xnz7WbhD2!0mZHSCPy6@>kwWn;*FHGN>sh(TeLoTl zz3x-FAf#10T&QT&Lt@Ukx=gfZ1KQG`XVL`-@Kco;&+f?No#mJISK9FN$>bL{G&Rnr z!@YrtzqN`|D+3udej>YF#r^f+!IHB6J$X&xBCbOJ(KHX>cJY{a22N}%%$T*KMf5&+=tkiW|2jk>pZDoaMH_lIE%Q{&Hu3)shr9kbP&VCkbz zdAIqrHz@&fm0g_;}(kccb-hm z4_u&tTB$iEyJzZfL%Ha+Xd+Tn5Wp>=_PM>dw`_xdEy$wB29x}~$jo^Oa z0!c{dsoP3(qO$`h{Px`Etlc_ZlNT^j@>YKePtLDHy(%NmGlSOs#ToPHppN+?6w;5z z)3l`vj-fh7%MZO~*O+7FFdG2eI-!3i_=r z#4cE)h3qN~CmI)MBrD(DR(_$0^zKBh2G9>8u8pf`ovuB}*Pqx`Hgp`w_T}@ovi?y# zjIX1e2RPXV%@3Osm`H?@M&(JI9SY?`ZCqZ2@Hj}-v#%ByG(|?3Zg~!jbSYCp&t84; zR~$ngTStB8U(^UUe|@kGJAhjw#F|R%NDfg7uz#wfu=-(niQG9(GXMh#c-*PTxeGUlLs$Ywe{>psX#ursWVBL;tQccRpqK z`_Xfv_Fh9d^OfyVuax_g53RKB#Uy##`gV+X8n@h`O~t%fRVP=Bwd|C6pXyB2+Daka zg&aiUk@h;RpIdMYmEoH$zD9~=t6W7CZW&)BFOvvK*1Jc$ z`fcz(KN~WaNwKZq%wt$CdYif|ExDW@lI6#dHE4_|&PnNCBtJMp_-ECqdCyxd`&g>B zSRDtqp2CSy*wn#>R1j2?cn7cZ?2+k7pV zI$)%*p}tLB6i-I6m3@pIxq669=?G~JZ!{Q-^Q3^VjzBwsW#TW2`vD6@z zMZWTY2T#-IjwZW!`ko-*SjEU1R&wlxi;MWY3rS z9{jrB2L-ljqFS0;=U(D=eQ@WfUEVP`&D@ch-;gYq`6?tmq+Fj#A2K~Z&slZ=+dMof zA+1`+iEtt{jzbLnv0e}|pu7{ehY!Gn1aAdN+U%+*GPvx@@g8+J5sn0jo6JvXr(ykq zD5PN}Up{nlYL2Ve@uFTl;#pMH(pNiJlRDxVY&G0gA@!^(z0_2TKE*#$Pn2?gxp%^7 zX_~@+;N2{+^t>w^Gh9wLX7bO1?CRv*N$b0AKDto3T3)K=p4+)S+@j3qtblDuK09rW zG*~=4S>?DY12%|6SsnX8Gntp=YT3u%t!%>*V$vsDPFkZ$P6UP_*`7B>>kS!H8 z5JZ-GA-wgtIi8o|hd0rX7jOd>*OHCrFW)kt_Uw2-IOzmgnA=ln)|+~Nnt!3M$(v}R zw%D(#H85I-aVukq0FVq9jDU1@*ONJy0;+Dkar5)-QL)k#R?s@05wY&LC9YZzu&5(Y z*ivSTh*FyT3VN6!j<>SDe5^=i0`*8!*1uXH9}~hCs)aIpaA}QnWKb!M#h99|%?@k` zH?g}YBFdwB6#!Lp;BF;TMUDN1sln&7=gnRdUBg=Cn-;zfKZ#=U?#?HpTi37lAjPu; z)UtEQ=0q4e_axW2{cH>u%cvknlsDa3wk|@cVl%+U;e>lddrJq6PFDOZOP@m6L3B%) zP7Dot%->A1vv5jxv`#MvbsQ=aBuXkQX+^WxvaoYPzCNAv{`C7|*(zugyett<37^ow z)+|75IiVzfIyA=91>c@U_MU#`WX?;$E9Ooz*$bV(bx{xZ!08(s-5zMB_XyNsMHcgM-A+l*o&XUq$ndwUAnzuGZ1Xa)V9~w~qC9R~W=}P-9)MI;U1nQ;NI~h^@Gmr5LLN z-6AgnODH(7z(MQVg-SS`=C|8E)-poWQ2434=lEP9-*k`nGzSnvz+}~o#{`iS0&%iSrHpzz%_A5iA z-R6YCbf+@gowff|=mFJ?75?eBSAd84>QV4N_Im&bBv??q06*x<(R80K=jMh^F4E!# zF^6tsfTobHR%0dR&au%$Inc3qp9k=egQP5}64K!5gSpo0;{yGsA}q~qs5Vc7rfWr*RPp}rg9K(_=ED)IPiQ75!BGYp1}7$goM%lb!Pteyp{jr zEBt%c|J>~V&(*=?E?F02TEEndt8_UM=X1YD#!W{@v=K-ma!6E;3(`j*H*g2qA>)bf zX%E1`(23fdM)j?oja;icSb@`idv63A9^H9BRmP z6%c@+8M`c8tQK^S$N(pz{NR1G9x`Q54e(tUaJHM$?ky<86|zNMU-0BKVLUdeIkwcj zH{4irA&H?mpNTPwmt6~0IC)aruDLxg)|2dfpcmZS&L&=l>ws|n2nzp&m#gt9$7$zV z;fg)-qSFbq7~&Rmz%H=D!7dV@@(MRftgC~Vp9P)QCnErk@>NXB6E@!Fr$V_mlGBS7 zLvexw+w9m$+kDlfgqDC8>;+6wrQ?-w5TtGHmFZg6Cn<@NC3ia~2*k6+5KUDE(%S`A zY;bCPzQIn)ESy89S7>XVdcU%J${icz`nN}ZhIIbOz+R=o<)NI9Jq;7~z0%a6u1<+5_(6#)7rZ>Q@>2R~ye=h({%Iu{CkEYwJLQC$y&q_^xT=p>@)+ z*WF0bQ)5i*WeN9dj^X1M!i@aXC`R^M0h?pph|1hxX69{tEyl5)Yq<{b;?+`b12Q{y zBN7|@m1vl*J%v?aa~=aPzOS+ter>_!8dieTyNEV@%UxyTb;U!&yn~&Kt*o_-B6TypLU_-|rF=HvZ46N^MNhMWpyTr%o_DpWD z#$>TOOaDOKQr_t&ngapse;M79myVseoXVshNH;P(>lhw?1ptCHZRz;Q)U;w=&uZQT zI@sz;u%R0{@uC?y#Pu#<_!ICW`&2*AX1PmI8ZtSWL+p+Lt7>fhkUSoV;zvytB!urv zjXR%-qIz~X&uS1wt5&6lup6BYGA294?50|4oDpxScC%F^y~M@dR)r1C zb${3UJyT9!*bLX3J0ZlJ)+JkA+ZG`79JG_f`4~KWqA%GwDMu0FC)BqJ$3#zs*?}+D z&uNLYKH~nRl!yoZQk5y^uwTx0Gul}g85{&QnqvP>o5~wnW*~N4P5SY`W%}Hid3Wia z8MB=0w=Mji$s|ADmyR9gL5&OWZ5yNVqH8$mwxgsWRnK74!3 zCbZraN=POp!E1g>O0b^-HipMq!!A_w6Sf zim^1!+DyP>?*ljzTU+Cj=)`T#(a2*0#O3rr*~dtg8tLEhKV^P(5b*R#2y!rdGe zNbmwm(tCaXM(^$gedy0DkaCFLy6fRmnOy~eym_!tt`M~%YhsBCE0u5>Jwt7@S;|oQ z7mH~9g5bt(p3N7wwKh|rvbUdpovbLd9|%P}A5nQ8V*q?phnm-QiWAmw|0u;Qrk1DF zgW~!(tS$QfN?QIF;!16ZlA}R_l&pXT`)BvzQQfj#?)C>vKxg?hmy(mxuEko0g|vuE zyb9#p(hqFk583ufZ7)0&bUJATTNUiqVSUP9q25rEy(?aB_An!DGbBn7QKpa*N6>=D z?-6x^Vm~Dt^O0VCTvI^kU5kG4)RC5;FyA!e^O;61qIHk7zMdS5lc1#t0|`0n zlqo#Sul_|=QxVh!W&sKS_rm7@54zHPukZ}i-6pDpC4El0DL}~F~{SlC@}o!JGCOdsc)4b(R;+-W2`@d3g=x%gW>F;$ox67a5;Bx+~~K zDrT?KeKO{itkjN?lje>EIcdtYH6sndZl}a71q`{8qh^l7H(<|dNKg!##m+1^u6}q9 zIBCWB1YQ2CI}LF%a#t!2wKXXN<$))o1*XC3n?0p1vV4QJbQj%9*x(?jq2T;HO22N} zZ!$Qv@V}wg`M^>%(1&MIAPsb-r(SS1>*+|V%nIv2WG^^E0Ob1xj`;lbV84`;=Z79F zmeZszDK|QyPc`?x81V4@o+f;i{e*W^?{TpATdZcQ_`u+)G2SL$J%>%M;h#>0MUZl* z%KOi~x8ffh&(X|Cid4pZkf zaq$U51>F#f1|mxonp{*;SYCvBD7Xk}eK0>5ApZ1CD&uaf-~||HhaXgRm5?hlM|eJn zUBUnjnxTW#6_uQRF;gj*#gU46qdaIoPmEn!{(=4T63u61wxGMl;XB2<_&*a}$q4;7 zFW9I9jsa`=BgFx{ouXPl-?!^Zx*@6wV_fnzXTPlQzNnU}`^svpFGR0M_BcCVJxUB- zd2+s(g4ZI53M~m;V>pGhx&ut_7$nAbt;cb}do!OfuJ-QwYGKNB+`QbWcU)sl(!?k^ zw4*0!jtU~P-1J}p@%g53TH9avX0X8^>SU2zXk9G9M_xQna*4_J+zD)dfFiM&q-(ei z0x;GvWq=E^PdcWRResir@7YH&LV)q*pt&@cd{5Twz&y?6ZSl+2_;-ntuK>U?UvQQR zrs1$75zem-?Hbl*nR)+%H3SU7s8!Y~`Ds&Y)u|eAEYvU7yHn(+m{YK-Q%k9|N&J+^ z`nmkIp~C8!g(f{IwJIjWGX-fwH}*5kyyca7PTqL$=3jtcPF6y2K$3tPJO zrfll#3xo;dAnj3m zXnp8pDm?=WC^*%yjW&hiG;Km+FmZ7qoub=&lxuDxpBuR8U&?Rcg^Cv3YOQhV%#iOEy8ye=aK0+Q&lDtP**7Nt|$pRe^Pce#+tR#tQMK>@SQD$l57K*UVt zsxLD+VvI+%-@nSM%6aGP&om|lTJh??3B%Wum@Ok8`xEcYCmcli!-IuWBcLd~2fEw& zv#sJ^ei#K=BC*{tA!006U3>=kPUaFFwk+(qtvwqjqIjRMprR^P>dV`v@pvIpA80^B zA{g|%b>)vqpD~F+`3wPXOAd$%pW?&~o8nx~Z^SkLI z5fV7F5*2ZoTEU5?pj}U8cA}-WqQQJ^gjcA7VcP$K?8pypDL&n$ZS2xWYc1G4nIne7 z?DZI)-H7rE;0Yi+lrXJybkI&4cM|!bHF`?!ViCkl)W8AhdDxS*QUN84FBrNV&j#&| zfJ&&{+fgE}w_DgG>E({c`H^!yO2GH;B9jC_e;$JtJMAR2CJ1>OQ73EXo&!I9Y5ccX zfV9B^+Vp$A>(!Cnz)2vw6g3Q<+Div^6VG_CGRKnin4QhF_Q|DRo;5Eb zJCaGih*4kb`hdN`(|v$M7fk0cq7g}aW;FR~5lKZW5|}sWfL;B-!T^8Se=v^@=o~A6 zu(y~kjn?ce>T5fHIwTl}tA9fzN5v_=d&0RkEcLSFL4kJAf5KToNG#k$oYc6&bPSdI{o!1q-Dj4g)4ht<=z(K55}VZ-q>N8Rrugk&@Xp zVzc)nLUH`pZvGkAP0 zb4$|g;bf*MC{SIXVDO6FjtUL+%Sw)7`?Ql)VvVMCz($VxUiU(AJxLHJoU)E4GAchB zbbeptLwk4i3g@Y-$KatqveZWx1+CL%Kztwkob}}IxW8BnKL$=ye?JTaFBO;(z{4)B zKB9(_xii3u+_b^j8I7qdH#rj=27+U6N7>P8sx~_CyUonQ?+1Kt!`xZF$uF)dm#>hydgyE?zX;Pgo)oIU>CsYXrTHc!2=yIsM0T zzj`cxn!yO&YHv8<I zjNjMU7I6RIKc6{ioXZ~xv6c}Hdh;m(_XQ#c9cCe6B|y(yj1e1<)&2&iH5ds6;BvhY zb{M7r_%hsJq9ZDU02quZi8o#wLZCH5I)8`TKQC(UW7tS43f9f%i+f>4l_O-aLsQK; zbCTXV)ij-a*LmHqJz*gK0x?QXo|_TZO(!oU@ry`s<1Vtr?sAizFDfdapE#(b0Lfz7 z(tj09!oX=QA=ze0mVPfx{SK|nW~gdASTal_^`Iu$^y}7u?rUe)I9lTq7p@d84BzLc zY;Rz22A2Wos;#tqqfOOTg);(hy5ryp(3kN|eKFYuvASi}$B zRQa+Q0VgDHn_W}n^B(tE_DecR&o7*2+Ot(cvtByhM{EVo2~+i>r)L|+bI$o{TA99O zpM824>4mvGb}(}c(Dc49c9rEZ7SGv)oSq>8vwjJ(H|N2DdlV4;SQmo;^Jl>P5=03Q zqH*-sDS!lEJIRqK#xp^}e0U^1l*Wp`C5j+#>&kiFYv3-+;Wb$e4W2Aw_%gjmT+?pM z=2$my(d*Rs;1k(+j*~x{uuJl--pW_GAg6ly&R3_#&iu-Vio6LP5}ZIK;><4_&cCKK zw>~$4WV;}n<5sZb(~RE6fc3?K?SPeu0+(`EH<-kQ)E26VHA-~FnysI@W`&7*t8I8T z*VlEd_?oz6XS$j1gW4?q%{n1`Q%JVp*F7t2=|8Mh2POvgCVr_WpE-|w74UIR8R8kT zWjZfDd=zY+#&fOkR) zJc+|Bw<`Zkw2|!%8;U`USh+yL!k~79pt3@}cfK9D0JrE*0s!SFt6KqsE=-B|7M zuL6QTp)8}gY%aS~j@U`(@qCKS=dK$wFPXJTl7z*DSDrO{_9gXsfF#eq$u^RxY9TfSS7a6$0_bxKF=f-b|<@N|tg21C31 zOa44_XL-T4;1R(n|2An*>q+_un-ydUG`3CmBS>~k-h$H^4}+Cg#SrBJ;ndg=+JUe7 zcAsqlow>O~6Rk%`$!`i$CnNqvl=rnW$c66G-3RAXW_3l49s<}ao)M~rb$|HAB2e{) ztV6bj_c>L+qdWr)xIx;dfdn;fiICX;0i9=YEh!h(ckrEkU#%Yofb8Z8u^7qU%}A5e zjg0K;0vQrkm*Z|qyfI4GsGJ51u%qFJKOE@Li2tCN;2-WtuYF@sP93F4sa7Rc8a#i3Iy?N<9cQK3P}OG{?< zBaO>IQ6tqfCsB8NQ0@GR9sL9tZUBHX6C}j55;tmccuQJ#)FOgHF_NJ7)5|Tfm6s~H zpgIKB8VM6LXuRx=9s4diO%aQ(Am@HYj$={vJW(nnAjy%JP*=sN&V9KYLr~aheoQ{a zn&;4nxHYvD0N`>*5}%Cw0a0xOT%Z-s32|2|iWy{W}frA3pb-dD&WFsGFRf9br zQbRXAFf3%|jV8g;pluh*i0B zj1E}jS9EOQqw>cBNOEg5o=TK4(-i^V2iq#mWWg@(Fce3ZmZO1utI=T^sINq1j0wU0 zcTi2v4(F6Po}rR%`8k*2Z|K~==%VK)OaYUzo5=Q0JYXO>AN_%lHwFqMd7s3l=r4EA z>2g$)Og6+j`%5plrGBM`rrE59!EFm#BAId^!4sw7XBe6yJyiP}t8YW3uKkf}PJ&qR zF$EOkWJ;^7#a<*Z2@zjs#H4-D@1^$|NW^k8_&n+6UqZ3boAawVm_u4ypym(?cJ3(l zlhCK$@u4PmaCWYlJQ%m6-qK!X%5Ypo{^e~uoiNREV69f3XU%nv=qg}Ev^%zpaV@3| z#~T_mbGB5`6i5d2KZ^D(A8|=j6?~fYA>tKL$*l@bAE`bqIFO%}O*r9rE6KeMB(t-# z1q&d~>dEJYK2Q`MzS7f0x_4fM2o?1Qt12=(GI6^ReCVR4(|o{s75ECN?{d1Ou0=Y@ zhHF-*v0tmPKfIdq?Ac<(?nK_H5Soh9!`iLre6Ff4NO6T@s6?0^^GHV};jBI+6-xWN z|B`IdDVdOOc=hi&{NUud_QWGtYLEzyB2dVUfa`DygNp{hf*mcDDqfy}=10#ILU#WKNllxW7$Uv5Y@(cKLpy5NjrJIiUio2?l-^3Agke z7W@96Yyp54{C<<&C*u-F7{DKD`eH*VbQ;J_Yeez(b0a`HwEP{%oZhKAUO-iJ9 zuE~ajQ*oa=#-VfPI?5K4y&a`}J>4G;1RnBoh1(s)cwx}R+Mad#{+cTf7D@EOK<8(Y zpe#B6%v@f={G)N#E{wGMQt|w1QW47Tf*BVe#0aE=w1ee(&hL1#-G5fwxqJ=$k{viH z3-ePep+K)wm_e*q=a(`6FFmGhE9_u5308Gm-vBmKer}IsbaU>5tiw3sAH1ec^2$v6 zin?x0-`99XEYo+`v0Z1J)7|hap4+^@>d)qb_=QOtuh{6P9M(94x0d}raC_?nhv+Q7 zsk~yKqU?O>Ln;skqAgjGeesr60N=p#w+;Q~Dm1Q}HyVx7t0Umc1_p{AO68AV-Dp-V zR-j*vKlQB4Ktv(Z{ECU)^D4HmO{x1JY>HfvJA6o40Mr#q9C!{6oHChPH_yuXH>ajm z83HeUNeLy-aALfB4YF4nrf$kfhZ>}g;!CT3YS#mZff6P5FQUjMQO6KZ5y4?ZFITjS zkqA49FbX7{z(6&s#N%aN{iFu_B(YykTUK<5d&hrNp)e=Xkh-b2M+r4nU)EhS+idTjr8s7-q;{l1Dj~Er zn$+wHS8jttg#3_E+A_qwZPK#$f5*51e4BXBzyQUOgx2gnt)pydIn`}9 zO)nw^o|$_u2h6=roCX{15)j_4ws&;2`J68}`s~r-UZAi)&{{t|kY>p;0)#3Ayf-gL zO049J-Cb71nNRM%o_(C?e<+)3omJOqLv+@DEpy8^lxzOQi280wiB=SR3ZMW3Ol~6T zsft#*?znW152{>oe&uL$)YDd~?z^N6_7SRJS2$VX#|8c$^JL~6|V!4wLPJ<4ZOcyXa%n8Ldq!d7dJ>8+!cIsNg}3^LcA2`7n- z8bLV`OD1BHNmq#Ze|UOpc==7FT;X&=H8fAuszWwxCtSWJN0gG?2%$1r$C&eN4#bmH z->qg}e4+}kP?swE!iyb^gV2HTtOvbg0i16}k%UsrE>*8B8?KInQic*L3ZNb39PLtb zt2LDM@SN?b!f{S0k+|1=yJU%3vQr{)_|b3@99seXH})FVo~9xross*RliBjM_Wx|j zK+R{B`%!*Q#yHXbc-WXP^mA8Iep}V+I(Kh@1<5{pqt6ae#F35ro4C-r6;MDJplLE8 zg-KghA3tVXX+P(K97=NoF$&W|^|Va&F$;B#8yq(3CD1*q2>yy$OUzN*j0o0T%bdQ= zlH`P!hLd$+quNlP6c+8?j95_UL`1+juv5i<~y%@md47iE2ABJ|D7!Ybp&gh=jxqT>8cB4C=ZS& ztEh_rXOesS1B>IQCoUT?K7Sq= zI9>_PcxqjUNKNP7U=i`G&)R2vb8CHVwC7vZ&Rhf zV--2&BVbwS9U}uosdt;pKQvu0*+6)x)(;ON4{g~*qmjOC)_@S)XMh0LZhYqGl23+h zOKAd1+vpz_9>bHV^U3j#m)?i|mk9sMU;m5y=Ho8OI+tp~3q0xYe&=?{NSHBb?y3vN z&#j&CnbAN5Mw@78PrAI1@0|r0GPwO3x!BQVf3B+*kZJg^VIf!~RR7A1gZf@GNQRAS z=RFk7afcZ}E1G{?7cXK0_#Nmn`>zvQ2 zoX_{4$-~%VQ=b^gACjSJp$9Jl;{LNrD(;(xfiG9QHbg7F!EiR4>AS{oR%-|coRy_M zifJ8qnQndp7*Z1rD41S&`U9`Muk<2J&I>G!cHZW|_HtCi+NwT^GLh>YP@?q;Wf`17 zBw?b5>qb#-rPe{6oA6W5A`w8k$(9#?#;^Q3Zf+8i4p>5_UM#ClEmvD0ZNb zU*qh)Vt2152WQSSC^C>ZHvgcw}gfIQ*tPj$56HrZYaU6dm!{ZwQ@7#FB8m!F7NxycOW4C#ig*x7D5hLw|wIj|UB3A51YD_QR`yqbPtR zb6Dfj`sv^Sf&7rPa7pB;$YNKGk*&o-pQs_r@qTy8wW^PT%;~pA5`HH>1e_ksZAOm` zAu>}{3ZX!ZY6Aijh!nY@W-yCF1D@04Rj#PC7Izw34@YTAGKcU}L(H`&e}gW)txkOt zpIm^RX`;F=th`$# z`k6x7zBPYh-4#~PK{h}3iZS#lMpng@&K_)(SGHC&nw{=7wt}YfY|nskwYYHmbJzyV5);2JS0o8`Fy_mc^@%fr=gVbg zoOsZNg#6+VAQP%!UB#girFrK%VhmmoeL0w^26k4I3N&A|5}l-_Y4KBy1xSWZDa^{Q zk#4B>99-m4xmzv2iZ{S$GQG59Zw^d&P*iul2h?E0kNX_D@`fKMj&<~L_S6KVI%=(k zDn^%iXLvfcCDk*o@lLT|1s%kPNKa{$raC!FWkip?QzG&)?lJ$G-irEWUd&!cOBk3# z5ZY`UbVF{GJO;1idFriM!@eR{(k_rR2-e@t&3)s{A#>jOhb0gM|5q$4M-SeDo37Tk zl1Lb90(&~1-v&(&1Takt5#sO91epCWe`Qt;+I|ZQ5c)E&ME7iu^N#{a}a~-hybgLlgm2K-NYbk)|?$ylRi`SG{ivmyl6~Lp0C%FwaVrEi2r4> z4jCS|_uE^5Or{t4?v1x82VNRba{Cx@0OW*>jh=uYvA>wS8A5_JsdD_sw;Rs$vCc1> ztPnsLEu zZZNIOInnBm_o)Qk!261t2SU5FXsf&!Huy4t*>Ov!_H-O1gOK6-r=OLM7h*H@JxmT> zjbg+Az+YIsY^g3dIF&Z<3%8Pucj2r(Tfa?{Kcv8@9j6D>$LfXKpRj`P8fbnfx+9`1 z{W9wZJ0MM3kVRS$62OR|>1*xl3>1Icgx6l7_lUPbCUEfebdVf_NFd-6avAIbxnG9> z?rQoc8m{pEFQ)u&o7Mj)oa+DTVkMz%z`KCifyGuuMV0UaK!lOi(E1`o4R8RL|KyzL z{Eu=@Dv-EKd<*rGJH}6(-D8%Hn%DkJe_vQ?;fj90NXtt8ed1Bwrl|7}2}#LM-)4z} za%*T?hvFqhnj^9ku@vZdAETP>nH=m6?5jmD|#m3vfDcd>ogG1!2A-3Jfk9?qBew` z_-ft3YR!Q-`yOun+bb9kcq0g4(-tyUHJzg|A;%Eny%--bKyPj)Wz`TRcLofg@qA|c zTyyHtx>SWT7;hJ(MdPE*>~Mg4f!06sf$=Y~`{`06%~Ko6&vR#qE)1H@oPc@0NkC7+L)2u5lA`!nHT`$V zD9wA~xCc|GVaCn>T`I{osCiFsw+N@M@B^TY7{ru>G9=u zT{`elP}!0Lz@zLLz9HEDWL5dT=U4Lan`nB~+%1zflCJTseStV2e)ciMACb2Iu5%os zOa0VvNnr^2a!USJ#* zPa@J?MQGYRD)30_AUr}}#iludlhF9ehX`oQSdn$@VQjnES?(+q@)#A|d-MnxGC42X zIhmsZn#lKd^7h>C10AwG3MG7JvOG41}U9JDcUO(p5-AY z&e}1P?wQGz4-=AF(_(~$aH8gMzDp>{RK4I=z@@uMg#ATNHho2z><7Pe; zxHsZD!v0W7J~IRo7ZXiN>c`PCV1VH!f@ntCW{vnGV2+At@JkxCZx{~_^ce*$002x> ziMcj1&KQIF;o-3yz8D-krtOufG6lz4Apiz&TJl0_X?alB7G!jRywm_HmI~Z6`0=A< zqV04LcambyS_C*Kc61-XHa8M?wi3uaRE+W0^w*@v6V&6UJC@jMbtvM05>%Mw%3xCI zKtTZVT(jLoTb3qH`CCjT+OGLKKtyzs>lYmvibN)e3TxJbw?j~eK945{kK>E{;1SwIwDl(3)`R%c$~RDz*}(s!9PVL z-to@{2X+Fc(R#85&aaiqe?U-4ty{gby~6WZ(0$e@x$;Z#;0)Vb!>8N*@hUQlczfU* z6?Nun*wOP-a#1;1qITTFFhOo-*B%N!w;%+083TN~+gaGC8|VgQCh^v(er&rgHStrH zf3Q>->2i3xK0qQ?eK4L57OXAWXj=TL;`Vn!1j9@KCxj7Gr{4NcaImrPHW!R+iD+Wi zIn2@}Pi%{}3w@>JYIF{Fr9-axK@mtj;JytazxJKO6@0)sys7GV#P#BdrS%&Qu{zKUq#gvq%S#Rrz)(BpEDf zfnWUL2e(kgXNF2WV!@MtVzYt!nRu6PQ~Utsg~HP4yxo**LubJZk*kv{0PqK=6lh4- zz=4MxBBAit0oGWw?Ysr198yw&yJX}WYn(pq+NJSU_8OFW+RW9=Y}6%6#U#Y(31xy8 zEpwA$%XekTc^z~Kr3m|`*R8PTeI#|PgjRxec)MH#x^6&t!C{SP+eguT2j3Iduy0K; ztYaYULFGLUXM`#)i&Y3Y(8{M2_?|xE817u_Ga4#}doWVU@2<&&J-Gb4~VYd6qHbeE96WAo4zHv8xf@~zteob5ECD7<0)Fac=Y z>swN^C*1&?IC&FJ#(?2bpCec3^OZAJbfoYI!y0tvfFRU6N>(F1v~8mLqFC1IFO=$Z zx>NTaDi7StRSgY>O!gN|0TiQ2!7-Yo4z;p}tcp-T*z0G~DRW*frR@mX zR7zerqg9)Zmo)3Ol@5jt>)MJlUSI9nQk$+6UisfdpbD%h8)eorP3oEk={3n2jnb#< z=UCOrzs|8v4vwG`>Xfiwdew=zXTk$S8}8L(6pBv;+qxyQw)M3q*YAh|^ZgK^z$I** ztNXLxc2`9aUss+shZZ_aHEwS@1|hZEo3ra#QJBh zXx9+BPuPYwq#v(6pr3b90b4alKrqq$gSD&0GI=3=#tf6*1l1ICL((kq)MUL)zKhVa zC;MrW`0RRW=Q>@3`ae1d=pteiUT=s?pQ&L2vOc#(3e-JM+|{T&@{gN{syARzy-%q8kV1&bKISH=io+BfgsZ z{Velj`GGt?at+_5+ZMdJ{sU@!|0bl}5mNWAB%J+VWqfdCbe9m_$qP7T6mGdvhyyNPqxA8+8z8ZjXHfckGJp-Gs- z&A}aWqqYz}R1?&^KTqLWI$Q zgQV*_e9DvbuuX3qpth!GP{blGwBp)4= zxl7x=;w+`QZdL4~8+r$PHxC<=jY3KmKbG35*rrD9?`~g6j2#CXn)d80Qb`Q{YNH>=z9P{ zv9fP?TNVC~I9{3=s|X|s*}jY#B$R6{paaFiD_AN(;CJ%bG)Fa?rk#(feW*(GxX{6i()<^P}2`p>*OIO)xOd(K$MB9~}<7>JO>$e*V9w z;{5sfzogJ$hyx>nj3r28j8Y|#!4s}`sEcokBB$(*&u;PD_Q5#iji4ahq`~YT*VG44O zn9?!=CBu934nwhbLIwOybpjrnpzUmd0eZeVMXjp@>)P)xQv7-v`ky47leVc14)l?O zKH3C7+l9PGxAH#xXJ=VK_Tm%-sM$Y$C=l`C5`C9ly4PQ~`hAxJey9pu=X|l@fk|{L z$i#>!z;+A@GXLc*`@PwowfE!|pF&3Yn3{SR!x6+AScw{jLSW!2lon<&<9_y>=`DbC2y!>Nf+9lBQ>p7r5_rC+gFaR@AvZ}k7VPijQeRvaJ`o3iSYv9q zz*L6=4?u$aIUYL=73iBJ7x-ic0v(i6PY)Ff4A{=iYd8N~ffw|VB=#kVemh(Kmyl5G zA~O%iqV)I2LhfvCuT6my3SblDHwwS?6btFVywd4KfZsOsdsR~zF!;w0{kNd3HE*j9`gN&wLt6$DDZz#nLO3>!Bdsm@SpP+ zQ6r-wPtV(cEo=7jFaEjfVeUVd{6BB#b`bM_42%RaL{_UK{=e<5i;{bnN2kA*Who%@k$g=uQ`71 z>%uMWm-~QUl|6anMbWSz%!I6Dc>m*-!)}dtlIve8{ zcVkR-O*g86&F8R9tJD~s4m@wIrg9lQc>_uxk8vnY9FU1rIaB;%^8^O;geEb!UVmd% zw~~N%dUv>osuH!vpdqdV>%Uw{%EHE^C3I!Q@Y)R@U|k#^bEma9k^pXY&X^v$aZIxQ zJQEJpIUlvz+LsQjvpMrcc?Xa=etU$CX)E#Qh4hnRU2}KFFAd-2sYI#JNo&kV0VM)% zVU85hrX?V5d4X}isqqIv1~Ntr<|`$*XuWTF%5}1ug;NNJnzw7AzavO0bYoddnMY z8wnj_#3|of+dajn+>l=8R8NRls#9Kzeg}Re>85t0E03;EE#DsbEi>SrzdeBJ+7LN#;2tCTIolm zH(V%uHx|y<8*Yo-1QDslG%gdN!=w5vW-vEu{Xx8dMKgQt!0aMz!L!0>VT+RF4TA}q z*zN^Dp3&*AYIUrt6$U{)b+5dUSE&uFa?eA>@(iZhzN45&gHggenbYK^+NmpB!Gk%^ z^ZlK?-U@w(H#$O1g^_WvH{pxV1GQ2e?x$l1oR5q79UYvG)OW|sSu)L>qpN;iXV3Aq z%T?3y{GY!#FaVOp;;53HQP<{Q$#-Y!PjG+4wvkoPdq?v-e$i}QRlA~ITlJ!g_NgwO zdctA5m0tDOVTAwmziK<{sJ6eR!3QZ&inUOR6lt;IT3k!<;_jgocXt95N{beE(o&?j zL($;wt|7R)1xq&lJ-cW3J^Q?8_dRDfe3Ep1FhVl^GdC(!@!{hLxkT8>T(!63%nPkqfr=bBT_EU45Ren67$~w! zL^@N8M`Cg_{u5o#qkc5Hl+ZHg}0KFewAA)y2xN3)6-KecKWvtq`_e>>!NOdj(x z{*k2gW^ZO-{}6w#-`NyhI(qPGxM@ce;kKqG&Cjx;sCsY{SUMa9YWHV&aU(i(*`nfW z8bsl3$!LX6iy;PB;*dMCI+1fzWzez9JxN*f&P#$7KficsJFk+iuul`WRFbDvFPLpF zYwpgt!|t!vf7ng@Bph9xcZ#+3Jx;7#fz^g7F|)IqFRbAb46E8z9!DTeJ|K;quxS1I zZnW5LHBWA_C4L|U5a?}D(;f#Yi)W7?WIA1M9&&IU;V?9gYERU)uMf%BFYG>9 z%L+&CzkYeq_tHevOe^xPpYlOEIl#p*Qqp?Y(2CpoxCzil;f|H0bmZs)<<>9sH(Ca? zH9fyPNY9#BdnoF@*8Fq$2# z!Cvl*A0Pl1upV3QcEqbGATRD#hQ0tFgEmv+z4^mg{;V5seU9)mi;1Z24~tID=i;?) z{X+|1B%TJ{CF{5>1Pzg1yG^i0dRrr3 zv6mJ6JQLG!^L$dqK%i9gU^FpY1YQn|^gY0gDUj(4HOH8$D}DKSs{J0l@SE;-~K>k)F&%IK`gi9gTq zM%@|QPri7vjF#pw5^%&J<6xpRvebG5n!l}Ee;LC*06QKmLQ93WteoD9rBrI?OT3D& zxk0+xuK&hHpl3cU4~0Bti_ne#g=!{a3v+`hz;IzaK(pfY%!Yjar{&J&(X;D!4Acb$ z0a*6{xY!9U7vb+HumG-BH%6##P)5*`pgdB-Qt)!D2$%_)K6o~2O^Kb3ohax z&Klj6v2I3#B>EB)2+hW33D$zWbliQL>7Gn128g}&D&Iop4X)Uq2TpgS-6PT?Q@wW( z2NlCOSR|z1GZK_#eJPk%V<3S{;97hDL;3Rb+9e_AngU=dVucRyGjSsVxEPH+Jqk-KQQ3{xR*Z-jsc+TXG0S0yAyW^S|9e2LFB$5 zv7W+M`ia{8+*p+bFkqku7Z&~)tyd663nclD!S}2t)c>W#XpVQ|5Ii7PU(2_fv<}_H zYM}M@D|vZK2e0af^>#Va{MXNhL`hVr`jErmL6^@N;2b8;VrHkP_(_xc96hn0xj%k< z=^%ekS)2j&-OWd??hGFNVwq@Z;3t;&Jg`RDM~)zV_mc~(HO=qQFI4v?0hB!B?B??5 z1;H?*0VMUlWL4|^$L5-VL9Zrp^7ka zcF06$(h?HaMAbpQZPI07^}#xw+@=~CT$AyAs^Buo@m(F>MI8k!CsY!q7LpuHjMIo= z(Jfu$4#ebo`iGsGt)%cC`Rum}4na>(z3wx2@;#l>H`&x7WkRd?&gBp#9848-4opup z*Y)evcVqZ_v@lZOzW0JHj5;#H*Q9;MTyU#t+x2dxK(h*lud>8pjp~xZxp|+E@A1df zR&M$0$GA`?)?s5yMN6X|xYBVR%QFTNT(=EEP(LweOLt~iB(q^{`aluI9wi-BHmBbX ziEKU-aiq+j)kq)~_;$MdY;=Mmep1dE`W?8Hojdi)=xrlSrCyXNLIm0?q0^hi&~AX% zOD)nYckVRwSYrF3TPY2(gFO4C$;4CiriIx#^=`z?$Y;weO7tY0&CaC(J5ffOroI2D$*XTg$Ctj3icgXEgmFf$lo z8%bp3jLPZu@%cp!_8-LF;KI<&N?eK5ip_#!N!p@W;|twdnyi@=$aqawvPhZD-N;%* z{^4T2fAw-eaSF0!(ryuHCGzO{a^qJ!a$&X=yY1@5(aP)PlW!?#6=&zg%!RQUSAot; znX4~6h0G^z<*@qgA+u&iLLL+}$|5LFgYyV7gwBle+HL77Uvzlu?Kfmj1dFUoby1f> z4bMfE0L?4iF5+JcFyIKR=9SFQLy%{^s~PurV}t#Y_)C}jLL<-N%S-`>!1}8~=76dO z9C(}D-tj}JjfhtUUB)`1XR8%#I%o}wC@0rln%k|#7l*$Fu%s-FoPCiE zymaL1yE&lyQhRUEClS&wllGoc_q3W&=Va4V90S;;5PoTkh!xzs-J&f-A;h`#D&-q|Loz~bQ3DE_JhB!#7-~8S-cAE^%KP(s(j_Q># zp0>Hw%MICwOfF&84j1Zrq=e zxZz7Y{3_T!HMr9*3Y$O$ey0qx!Zar-!=T0%&$IA)ZA0a7zAX3Wb`02NZ$6yz5;FOw z^?cp*{DP9E!rtTgxL(xl0t;y%cZQAEO5f9_7!(%OPNFm4NwEEGf3duck>Pq>J{#3K z=Ed0_wyF9eS>DHa)YX4W4-Ko;Nv8wH;!7@S=Z$D7RP*;22qxl@_1aNI>!>Mp9%R7L zpDnyPi4CTMtH}bv{0bl8(c)tP2PgJpvQi!$e%o(1}LUw>) zk`U5}hv0{bVl|YfnNJ!m!_sh>lkmrVPgA*g)6*j5o2EA`n361EvPxt$-G*O!6;E*m zDYkg%OFc-r5F_*VS)YuGO{>yH=Fd{FSXN%2Ja~I~+?nHhre4@V{VrTBjZZwTGH%re z{p8_n$s?jkQhs7%7uT<1N7oz73b9yg*2rooyjY`U_?9T89f|YR%r2*Z%(DaZ_Gv1XT0)6Lx4? z?+V&pUz8TX!Q>BZ!O16Yc`g_UWSI;Jy`~KE!Xaf8d68vPh*R7< z{)tL@TVJpbJrhG*l0+y*?43B$7a2(!43JbD5%774)VO8f`Wx}ADA0j~Rsics8Y zTuvniL(hyuJg@-Nw0cIx)xaODhXIbq#B7RKQo5NA#L}v;3HVic5cjg+^%pkE!C=*( z`p1n#rMn!7cuP_hU(@-U#cOuv7R1?YB7O~n#SO9S$-m#0wNCJSKag9FbR`Z6p5O=x z?w#S5pZf*`IvY2?3()NF^XfuosGQ^WP--IKkcY>lQg@HqS-PUzhEIcJP;m#!sCG#w zVUj-*tq)wz{aAu>&)R=17X;s&!ssx5=QZ37WAeA4T7qD*vX+x?19e|11axJp4RSVT zrqPjA$jw%ZyiZBwb?Q4KEuW7c_kl9v=7r*HGQ^3BhD~Kn%1dy4E?MVQ81aOq-;#=W zUU_m=Y>8M}Hixvn@(+JY)dt&y+i~_F3DA14J6bpxcW%$QhV3Za^GrMHSc#POe%S_U zOqROi3zR_D&R^>obpH)buwL%_AABJjfBtlDr8w`bb-G0GS7B~#^3(v5m5TZZ<#RF&FMZLfNvORBHCKi8#CQFO|L`6(8%-dp~+)Pr9A(>Op$_> zP7B%`vKP)u4!;HR)L*3)*7+x&K|QI5d3T4f9CQ6tMLD)Zb}xbIaZ|myp^w9Y8f6t%j_-F>YjQL9s>niVGpjZ&6*iCe z1m-HG(-cC(^S`^e^WW6t0gEjR)lZgdXhAQgHO`{Dr;-=n{a^>PW3(VFRJp>oEHEQM zE#!o_G3cI5-Z@~Eu`p}q_J|gzuE~-c6$-@)Z(S=-dBKs=(*WLJ2j5-sYituV#FHru z2}bLmbJ%kcz?af=73gp>?`Lq9R;O3a=`u2uDZDs^^aT(RjZebp2925n(s2LzM+ zOJsa4jQB&ZY&;m^zLX8xEo*Kjt{BP;8+!01zyH=vD@vO-wLH-;EEK+U{E5i6AWyh5 zQbo@E*@6;ru>;VtCj=%OzQtYj=j%?0!2pM;!lhd+U)k4ZEb@$pFt#%%Hd@prTj%{% zrQ4ORQZ>tN^!R<28xz4|U?h3}h6Gm>*AqPi5TkP1Bk^Tz`qT0&yW=MzdyumHwK$eN zsM8M@{ZKu=_ZnuYe`OFCi)}v6_3|$3(bq0%ZHZ4OujONlAu0_&fqj~|>Zjda@~`Tx zEzPd&8*OihGFpOI1Sa?3JpZB~QehD&Yo)7sm7%TGq9>QjCZ7=KO#0yXhSpq9BQ`1N z@}@cCeU8?0WqO3o^i+VJYAzeD!mD^J`h+Ss3Vo)n?_P?GuV^f;?dN+7Wdvey+JS2Y zJAv2W*Dx{|PUCFtj!DR)o*6-IL^-S2+gfXqKiF^qhgs2`KI+r9SDmjX>@p3sY?0Vi zDfy%hMed6iP=M62TB$8fGe*8W;X-hBa zOi57>akr-edciw#JPMQ8th+B%9U2Y!AlnR9I;~T(`EA1_QLRC4z!P->(y2T-smeba z*Uv8Z($|k2rKHu-9GzHxp?;}QGwBxIyTx;#glL&~y_I9WP|<;DY;*Kzgi$Zmj;p=q z$1B<-*yEeo;B_3!g@(^Si`AnTZoyZt9B@+S2Cq}!bBT8yZVEOl1oA|NzU4$V_?*(BZORMgZR)f+4 zcVzG=q4}roH?rEXpWyqS`^aCse;Hk#RK4?+`ekBfJR$r!ipKF#crT?@0i?css`IiU zbF3>6FM~Hk9sk$dZA<$ng2zR#DhGU%O(sO$-nZ-0Eox=U_R8`K^ZS0T!L9k8{sBqz zc9u`qbh_%J(cLcw3@NoSMXz#)Loqh1KZw87!RFg ze3qo;qs_{(ktSE?j!=J2M}9Q~;E{WDqt5Fgq!ehpXcL%B{U>T{eE6neTIBJKzV_%u zB&(jN3q$`3GjOiibE0P8{E~xp|I`OV3v4h!fTNjvrXpifW!jTK_@qKrb z7R5rjgld(%6OX%vZ%nEsUOh?H>i>p$w>10BTUkBP6IR=SkmKMGPPupq;lj@S{SmR6 zYu||-BU%4(NO!_npW$E{s^0zt@#Cc|2l-g(dYK*6Q`db}amzuQ)M)m*s4NGIt*_JW zT-X#x6cKwgkMpTK&$;22)dnPQXvIT2Bfy-sI8C=ERFCA{Za<#MpXcN+3I$ z`kBob?G=AsCnzSHUTa0miDXTM9O8C-?x2qy`Lt6l({hH)XGf(8N_%5JtVwvNuIjgI z?)I_fyFraN{~-65(WM68x2y@Sbu)}hL!rj`%B!ApYW(^P)XBm?e2#$_5ZGlNTrCn-|~9= zmkq8WS9(KGgLXM4dcZeS!lQ8ZGlmD-<;4AuX9kOs^S$i9g6Ae&i`I-o&p1^M&-9X1 z-yVYlY zTisgU$eeTuzfP=9mx%l#;n_^94png|cK#WaZ1LKwmt%r{!$&nGsrI3{`dP>?2Gp)$ zUduky(mfxF@=F-Ftc&dDl}jz47o&_;W3DWUIa&`j$vFk-O}Nu5FTpa_@*MLr#@O1Z zi9P49u2{eLc|Wu@`fEDjg!+l=g5kVCCHN*^iy)`+s@!FG@yY%hNK?qd?EY`?qP)9B zqFzA7cXFzs11;_36a5XZGkp>Zw7hm7#iF1k&&fQGB(S7`&h>e7!Qj9`AT;cHL)~YJ z<*QUDodp|w)|Mw`@b$SN`KOoZ3VU2&Q&fT`z7F2j2BRH2wkp*6P{?qm!CYyrGpQB9 zdW_o`ookXbTe{B2=-y&2rlb}*O6#!<4)xNVu+&P4)aLgBJ+`RzUodf-m?ESh}>=VR(QeRa=CA`HZ7$3Uvl)zk?`EF(kEv_;%_auKh{1iLh7hot_-}wWNxyE zcXOnE80qWk>83`2CfUBzJJ_~MnI5Yoy85Dp(&|h~&KF3P^48V7-g%u!lC!fxovk|# zC<)tXj@UXAeDl+AC`yCWl!6fR-S?YLbgUM>s8UkL;XZ9Ta{adv>d{nqB*rOgOGNV* zJXRRVNmImUy~~K~8jj68 z&RVk2GoC)0w61{$brz6`+^PgmA%sC(dbsX}ef!HX+i!Wox5Hx-dX#i;s~;Yoflt0n z%<_zVm977CU*3{~!uIxJGq#&d0%UzAX%{a{2`x@W7xnenCISO>l2HCpm>58;}|5MU%?Dd%?Z*oQdLy^SpNol|`J=4e4oRx!HLa-$7LT``6kzOOZ|&EyK4Q zCl6$t>(%Kn6`<&7_m7jz`sd;2a~tLcWe!9tnSlJPX-B%_Qm8AB7)9R2Se`QLRerX} z?{3NEt|Wg=o&}JriC=fo73-oEKlbzDY=@-{#}giOYO*Yk zM6jPDlR!9@DUXl!r*>f@Ga8(n*1lDypw22%w+4YtKV!PVKw?lMO~^f~q4?>@&a9F4 z8|0gXTWRxY{b@=r;%6Z-_(q@@ZN7@NldzINk(~lCA5X?Bfx3f;_&KrSk2Z^z@jWTJ z>aL*B+)yZQw1-r7fr;AO)Z5=zOPhy*q=0D7ByOiZbW)m@#EBK13j?41Z&g*|11g+m zmOu16d*6MsH4VOiSZQlqibK?9>uA;RibM9~b;8}1sJjvzXPp;ihe#$cR5hm3B z>p{;#tb4^sag+7(y`6biQO;D0Mt@aHL}Bq)UA<9?_g6v5?Xn|r!|YF!5>hnJ&FCuS zqxzPF2UJ+{b2t*B0x2!o)Yhg_^FYN6q+!+ys?pTZPuZi@1b(G!OPG#yv_H{*Fd}lH z4`7dcb&OBDRHWn&q00bgr>N*j9a_cFa&FD42M+U)QfnwKsA4B*&l$C__*J33=6>fx zj)#yr@#)c-R%=#z{CpJEHSVjFc~nn>hn7)OW*D)~Gvf)#;e@0q{`?CA{eLE5qVsZU zq=>1CM|O8EPfMko&Vcx{d{hsiou11@)mGbP2|DDZ?{|!^3<@pOfZrJs6L+LfRZ8hK z2!BSA;CdO~sTb&LhO1ZDKD7W9)7`2+S0c0r{rp{{iA#RFUAHVg0g?zxL{+5x6qc>| z6VWa5_LxRd)v~Skp>UyzW%WF-H$RXqHFGHbE@S}IZ4>!hklj1L-TuOW#!kgrMSw^2 zTgf@@4oKQ0LlQu{eifW6*6_7)nmebORj(#skmDI4aZ8V#H=x%zN(>=}h zpmXPw;4ex2xxCh*4G1*PnCka4qkZxQQx;$z6aW}3rN;o2mL_t^tjFsMx5RDGMa(#0 zrRNge5aQGA*Wl``=t~V7UZM^qU&G#oVlySwsbbArUDIvDuE6iYT_?$}#(@JI#tPGe z9`AK}a5lpgD8Vuak4K-Pz9wdW=}(Na*~A&VmJZLgQibsU4zuyq}l?rGVKUX z@J_fZo>>FVf)9f`gQyng3(y3)TeAq49+d#7F%eI+x<-*6F!vvCvaeWS>LD|+1K#Ob zYc{wde_FkQUIcTl&0>Fl0jYO6^?Tys8t|wstF)}VdAcEz&GjFGBP0DhI1SVIi#V2| zp>{fD@ZkFM%^4kx<8EXNn$beh#7m4LjO-saX%~#FIE_p#vRsa$3(c zd-vtNtmj@BU(Ys4tf2^Ol5d*4a;R(HeV}$)L%Mz^I5gK}ktn+mWY}Uwl zR(=u_g-yhaX$%aE`+oH^^iUB-b9zXE3gAOAHPiAjngEajAKOW}wWO^pmc`mr2xkN~ zky!|bXbMBF4+jED0+htIv1GI_$F%IKpIi^_963GI3gP%L3z$FUs}7DQC@U8ZZ0*{o zBqt195cxX`cv$@84W%rn-^%E$sk{Y$e$2G??zq|uJ(ROKqHs4VcKfdOSc0*Y>J?ej zSRBoG-3sDF2Lzt&zGNs-V{qpF{jfaHpGD zTS8gKp67E-N`sO}F8fDZRB#eK#WCM8vhsT`t$t;Dv%aH^rElz5tRkq&ZP?e^(J ze1bRlo9dpMu#l4{_H|9&?Dm5GzlF16j`%c?#Hpq2(Thx(CEhw>o# zej{czFGDlt914ChZBr@NrwJ;J`DMUbVwL9tD-+zmO=cb0#G%ILA)9+P1%RNpMj^$B z;3ma<-*`7lY`4j1&^d`~-jr148xF@k2Ctd!c%K}Gx20jSB2@Of?O_S2G)I}=fyZ$x+o*`yLZ1Mt8Wp&-HVtxH1NV5OkgH8e>F|GO&q<-4(o zIIE|B7a5;`*2FZSF^&=MB|#=sg%)t~*_)w-0v-W;4twv{%X**G23ap(CPE&YW2#Q< z2lcK8ca;nOi6N3w>Ztb9|o>ZKE|Si$ep-@fF0Z_Xgz47&)gpy$evt?;gbQPzR}oi z$o9n&IlpSh?cxN0Czq&LXy&K|>9ckJ3O#LW5cMx!4YM-!iI}`YAg%N(RQMp{sRqqk zCcc8nyL?-zS2D==Q|;?`<+x>X?r`!l>hOo+##pS$Q$NZ6W%L4g$aYjTfB$`# zJ@TJV{|%k@pUFP4Mfdk7ZI*{04|5Zvl5HsVZ?@}WrDNWcuy;{0(fpnC4z36P@Phx@ z5dVe<nDNbk6(uFD;~uOSKMgyW{yun;xSU;y-|c|Jk?`mdu!4jp;}|6kFIv zv#!>M0vIczwO$ zLlp@GjwdvbB&>oZJtrIzH z&z&4uAB}B(uRL`|tI)!Zi872-p;rnmzbh@N1&l<)RuG%aEOg7oj|i9Dc=z~i+OM==_$Ic&rq*<79G zy(1Mh?}!=JK+dP5t0uZ_ZsND9aFlt=WCAutlN8L85cmKd4qL}UCvtdW_G!eKbn0!q z7#xpBkxUMRqhG-=dAQc)uV2s8%Ku#k#&?Kr5I`$&%&a35_%-i+@i zkTva-VLjh^C(X`EI=Wq|3*MU959~e%m!Z?X_40xmp3!&?eW?2(|99CO^!HeymIoCs z&4wn}ZF4kB9TLb3y4wQxB|Bcy!i_8Da2IH4ImY+QO8oL<|E{?uEkL%&rrihc6D5G7 zv0i&aXH`>k%z#XN0x#PR#YL?qc>5d@Slk`kd5eWnf5`p)+>#vw2r+Hxiee==fFmdd z1wq#i4TqmK0H`w6NPpK}DN<5}y)a-KH%9zaq@&ngYQ7|JQS*2sT0(V~j|hMhRxRYU zhlk*Eu>(-pwQh7dNz7d!S_Mp?H38=g}d7cpB2l#0q=0lBj5_!k!q7$>Kd<;3Ds_QL!W~4z1@$ zl~bk(X5E$bD;_3Dmjc4{wp&w=3-Fxe9N28PxzwW z^w@e*pFm-q5>XBbTcwd+md6=Z#JCKnb7w`K7+U56>VaD~@{Kzn8nVn1$=(x3a8jpE2sxswZQ6#ZhAPz>)TC`|C`V z97NPodrGsSlau)YKHwpKybJ_a>WP~5eux&hu^%tuw{exDYAcNu9bj&H zp|AH3zFf!Vx0%mfokJZot2Yo*qjp|JXmPlI-N8kq?L-aeS{0QxRo#so<$^P^@ z05TD0ACJU<&MDhaH3*@FX+T%htjTH`Q~oLJ7pLY^!uXCtj2p;}n~SZ}NDIiA-1p@0;5&JgjQ9OgxM8!v;gSs?*YdcdbRElKs`<^F zFJ7%}8QsRQ-ECt=7)&V@y_bC$ABzEKl`4hyQ>xp_DI7nM2X=z6#4lyBp7`-x>4C z3VP5wC2@SZKB&!5|1DzdZL5To@kE+`>-rd#b<6FPS&u=Zx}3r-;rm(bP1yDT3tR_M zb15um6(Iov&sSUV`d!(p+|E0ZXOkZJ7U)s^%ms3}y?PirZNe>+5QI5;<&|79l2uynP@y}JN3$}YCk?r&tT+pkO-JD z6GiM6sZ931er|-!Vpaw@x$S9_k|^vkc%ls6M91(JE8$u=6Ew<wQyx)&szsC%xmQStC$7;@^xI#nuz5yT)2~k z*k^*5^8JHK3WLijXWHc+4Xy3Iql_eW8|j_0E|+fY5rYc-H<`{*nM}mtw*zrYKADCz zz8URm_f;dy5$|LXr-o!J%M`TlVh7Hapc_oO#>raw_?p1rAk9d{iJqqpdOcI%tkG#u zYR^EAb^TR8b*sp>iK~!q7RbIH3jp!xA2|q^JjjQ5HQgFRZ@SBtZ(a1tfq<|76K9!{ zZSsmTW>i@X#&!gLP>Fc-{%@&;&7dx1Pl-C<#4I}-fqOiHNL=e4EG#Od6B0{U>X3?p zT8enC*wOURc=E|nRq!&~aX(gDF52$rNR>2alYPUSC7@Gkd7L?A@)&F8_q{FY^)eD? z(yF=tK(!Uvf0m>*`<6&W;g{(uKsE{*EY?faRk + + + +GAppInfo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GAppInfo

+

GAppInfo — Application information and launch contexts

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+enum                GAppInfoCreateFlags;
+                    GAppInfo;
+                    GAppInfoIface;
+                    GAppLaunchContext;
+GAppInfo *          g_app_info_create_from_commandline  (const char *commandline,
+                                                         const char *application_name,
+                                                         GAppInfoCreateFlags flags,
+                                                         GError **error);
+GAppInfo *          g_app_info_dup                      (GAppInfo *appinfo);
+gboolean            g_app_info_equal                    (GAppInfo *appinfo1,
+                                                         GAppInfo *appinfo2);
+const char *        g_app_info_get_id                   (GAppInfo *appinfo);
+const char *        g_app_info_get_name                 (GAppInfo *appinfo);
+const char *        g_app_info_get_display_name         (GAppInfo *appinfo);
+const char *        g_app_info_get_description          (GAppInfo *appinfo);
+const char *        g_app_info_get_executable           (GAppInfo *appinfo);
+const char *        g_app_info_get_commandline          (GAppInfo *appinfo);
+GIcon *             g_app_info_get_icon                 (GAppInfo *appinfo);
+gboolean            g_app_info_launch                   (GAppInfo *appinfo,
+                                                         GList *files,
+                                                         GAppLaunchContext *launch_context,
+                                                         GError **error);
+gboolean            g_app_info_supports_files           (GAppInfo *appinfo);
+gboolean            g_app_info_supports_uris            (GAppInfo *appinfo);
+gboolean            g_app_info_launch_uris              (GAppInfo *appinfo,
+                                                         GList *uris,
+                                                         GAppLaunchContext *launch_context,
+                                                         GError **error);
+gboolean            g_app_info_should_show              (GAppInfo *appinfo);
+gboolean            g_app_info_can_delete               (GAppInfo *appinfo);
+gboolean            g_app_info_delete                   (GAppInfo *appinfo);
+void                g_app_info_reset_type_associations  (const char *content_type);
+gboolean            g_app_info_set_as_default_for_type  (GAppInfo *appinfo,
+                                                         const char *content_type,
+                                                         GError **error);
+gboolean            g_app_info_set_as_default_for_extension
+                                                        (GAppInfo *appinfo,
+                                                         const char *extension,
+                                                         GError **error);
+gboolean            g_app_info_add_supports_type        (GAppInfo *appinfo,
+                                                         const char *content_type,
+                                                         GError **error);
+gboolean            g_app_info_can_remove_supports_type (GAppInfo *appinfo);
+gboolean            g_app_info_remove_supports_type     (GAppInfo *appinfo,
+                                                         const char *content_type,
+                                                         GError **error);
+GList *             g_app_info_get_all                  (void);
+GList *             g_app_info_get_all_for_type         (const char *content_type);
+GAppInfo *          g_app_info_get_default_for_type     (const char *content_type,
+                                                         gboolean must_support_uris);
+GAppInfo *          g_app_info_get_default_for_uri_scheme
+                                                        (const char *uri_scheme);
+gboolean            g_app_info_launch_default_for_uri   (const char *uri,
+                                                         GAppLaunchContext *launch_context,
+                                                         GError **error);
+char *              g_app_launch_context_get_display    (GAppLaunchContext *context,
+                                                         GAppInfo *info,
+                                                         GList *files);
+char *              g_app_launch_context_get_startup_notify_id
+                                                        (GAppLaunchContext *context,
+                                                         GAppInfo *info,
+                                                         GList *files);
+void                g_app_launch_context_launch_failed  (GAppLaunchContext *context,
+                                                         const char *startup_notify_id);
+GAppLaunchContext * g_app_launch_context_new            (void);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GAppInfo
+
+
+  GObject
+   +----GAppLaunchContext
+
+
+
+

Prerequisites

+

+GAppInfo requires + GObject.

+
+
+

Known Implementations

+

+GAppInfo is implemented by + GDesktopAppInfo.

+
+
+

Description

+

+GAppInfo and GAppLaunchContext are used for describing and launching +applications installed on the system. +

+

+As of GLib 2.20, URIs will always be converted to POSIX paths +(using g_file_get_path()) when using g_app_info_launch() even if +the application requested an URI and not a POSIX path. For example +for an desktop-file based application with Exec key totem +%U and a single URI, +sftp://foo/file.avi, then +/home/user/.gvfs/sftp on foo/file.avi will be +passed. This will only work if a set of suitable GIO extensions +(such as gvfs 2.26 compiled with FUSE support), is available and +operational; if this is not the case, the URI will be passed +unmodified to the application. Some URIs, such as +mailto:, of course cannot be mapped to a POSIX +path (in gvfs there's no FUSE mount for it); such URIs will be +passed unmodified to the application. +

+

+Specifically for gvfs 2.26 and later, the POSIX URI will be mapped +back to the GIO URI in the GFile constructors (since gvfs +implements the GVfs extension point). As such, if the application +needs to examine the URI, it needs to use g_file_get_uri() or +similar on GFile. In other words, an application cannot assume +that the URI passed to e.g. g_file_new_for_commandline_arg() is +equal to the result of g_file_get_uri(). The following snippet +illustrates this: +

+

+

+
+GFile *f;
+char *uri;
+
+file = g_file_new_for_commandline_arg (uri_from_commandline);
+
+uri = g_file_get_uri (file);
+strcmp (uri, uri_from_commandline) == 0; // FALSE
+g_free (uri);
+
+if (g_file_has_uri_scheme (file, "cdda"))
+  {
+    // do something special with uri
+  }
+g_object_unref (file);
+
+

+

+

+This code will work when both cdda://sr0/Track +1.wav and /home/user/.gvfs/cdda on sr0/Track +1.wav is passed to the application. It should be noted +that it's generally not safe for applications to rely on the format +of a particular URIs. Different launcher applications (e.g. file +managers) may have different ideas of what a given URI means.

+
+
+

Details

+
+

enum GAppInfoCreateFlags

+
typedef enum {
+  G_APP_INFO_CREATE_NONE           = 0,         /*< nick=none >*/
+  G_APP_INFO_CREATE_NEEDS_TERMINAL = (1 << 0),  /*< nick=needs-terminal >*/
+  G_APP_INFO_CREATE_SUPPORTS_URIS  = (1 << 1)   /*< nick=supports-uris >*/
+} GAppInfoCreateFlags;
+
+

+Flags used when creating a GAppInfo.

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

G_APP_INFO_CREATE_NONE

No flags. +

G_APP_INFO_CREATE_NEEDS_TERMINAL

Application opens in a terminal window. +

G_APP_INFO_CREATE_SUPPORTS_URIS

Application supports URI arguments. +
+
+
+
+

GAppInfo

+
typedef struct _GAppInfo GAppInfo;
+

+Information about an installed application and methods to launch +it (with file arguments).

+
+
+
+

GAppInfoIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  GAppInfo *   (* dup)                          (GAppInfo           *appinfo);
+  gboolean     (* equal)                        (GAppInfo           *appinfo1,
+                                                 GAppInfo           *appinfo2);
+  const char * (* get_id)                       (GAppInfo           *appinfo);
+  const char * (* get_name)                     (GAppInfo           *appinfo);
+  const char * (* get_description)              (GAppInfo           *appinfo);
+  const char * (* get_executable)               (GAppInfo           *appinfo);
+  GIcon *      (* get_icon)                     (GAppInfo           *appinfo);
+  gboolean     (* launch)                       (GAppInfo           *appinfo,
+                                                 GList              *filenames,
+                                                 GAppLaunchContext  *launch_context,
+                                                 GError            **error);
+  gboolean     (* supports_uris)                (GAppInfo           *appinfo);
+  gboolean     (* supports_files)               (GAppInfo           *appinfo);
+  gboolean     (* launch_uris)                  (GAppInfo           *appinfo,
+                                                 GList              *uris,
+                                                 GAppLaunchContext  *launch_context,
+                                                 GError            **error);
+  gboolean     (* should_show)                  (GAppInfo           *appinfo);
+
+  /* For changing associations */
+  gboolean     (* set_as_default_for_type)      (GAppInfo           *appinfo,
+                                                 const char         *content_type,
+                                                 GError            **error);
+  gboolean     (* set_as_default_for_extension) (GAppInfo           *appinfo,
+                                                 const char         *extension,
+                                                 GError            **error);
+  gboolean     (* add_supports_type)            (GAppInfo           *appinfo,
+                                                 const char         *content_type,
+                                                 GError            **error);
+  gboolean     (* can_remove_supports_type)     (GAppInfo           *appinfo);
+  gboolean     (* remove_supports_type)         (GAppInfo           *appinfo,
+                                                 const char         *content_type,
+                                                 GError            **error);
+  gboolean     (* can_delete)                   (GAppInfo           *appinfo);
+  gboolean     (* do_delete)                    (GAppInfo           *appinfo);
+  const char * (* get_commandline)              (GAppInfo           *appinfo);
+  const char * (* get_display_name)             (GAppInfo           *appinfo);
+} GAppInfoIface;
+
+

+Application Information interface, for operating system portability.

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

GTypeInterface g_iface;

The parent interface. +

dup ()

Copies a GAppInfo. +

equal ()

Checks two GAppInfos for equality. +

get_id ()

Gets a string identifier for a GAppInfo. +

get_name ()

Gets the name of the application for a GAppInfo. +

get_description ()

Gets a short description for the application described by the GAppInfo. +

get_executable ()

Gets the executable name for the GAppInfo. +

get_icon ()

Gets the GIcon for the GAppInfo. +

launch ()

Launches an application specified by the GAppInfo. +

supports_uris ()

Indicates whether the application specified supports launching URIs. +

supports_files ()

Indicates whether the application specified accepts filename arguments. +

launch_uris ()

Launches an application with a list of URIs. +

should_show ()

Returns whether an application should be shown (e.g. when getting a list of installed applications). + +FreeDesktop.Org Startup Notification Specification. +

set_as_default_for_type ()

Sets an application as default for a given content type. +

set_as_default_for_extension ()

Sets an application as default for a given file extension. +

add_supports_type ()

Adds to the GAppInfo information about supported file types. +

can_remove_supports_type ()

Checks for support for removing supported file types from a GAppInfo. +

remove_supports_type ()

Removes a supported application type from a GAppInfo. +

can_delete ()

Checks if a GAppInfo can be deleted. Since 2.20 +

do_delete ()

Deletes a GAppInfo. Since 2.20 +

get_commandline ()

Gets the commandline for the GAppInfo. Since 2.20 +

get_display_name ()

Gets the display name for the GAppInfo. Since 2.24 +
+
+
+
+

GAppLaunchContext

+
typedef struct _GAppLaunchContext GAppLaunchContext;
+

+Integrating the launch with the launching application. This is used to +handle for instance startup notification and launching the new application +on the same screen as the launching window.

+
++ +
+
+
+
+

g_app_info_create_from_commandline ()

+
GAppInfo *          g_app_info_create_from_commandline  (const char *commandline,
+                                                         const char *application_name,
+                                                         GAppInfoCreateFlags flags,
+                                                         GError **error);
+

+Creates a new GAppInfo from the given information.

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

commandline :

the commandline to use +

application_name :

the application name, or NULL to use commandline +

flags :

flags that can specify details of the created GAppInfo +

error :

a GError location to store the error occuring, NULL to ignore. +

Returns :

new GAppInfo for given command. +
+
+
+
+

g_app_info_dup ()

+
GAppInfo *          g_app_info_dup                      (GAppInfo *appinfo);
+

+Creates a duplicate of a GAppInfo.

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

appinfo :

a GAppInfo. +

Returns :

a duplicate of appinfo. +
+
+
+
+

g_app_info_equal ()

+
gboolean            g_app_info_equal                    (GAppInfo *appinfo1,
+                                                         GAppInfo *appinfo2);
+

+Checks if two GAppInfos are equal.

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

appinfo1 :

the first GAppInfo. +

appinfo2 :

the second GAppInfo. +

Returns :

TRUE if appinfo1 is equal to appinfo2. FALSE otherwise. +
+
+
+
+

g_app_info_get_id ()

+
const char *        g_app_info_get_id                   (GAppInfo *appinfo);
+

+Gets the ID of an application. An id is a string that +identifies the application. The exact format of the id is +platform dependent. For instance, on Unix this is the +desktop file id from the xdg menu specification. +

+

+Note that the returned ID may be NULL, depending on how +the appinfo has been constructed.

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

appinfo :

a GAppInfo. +

Returns :

a string containing the application's ID. +
+
+
+
+

g_app_info_get_name ()

+
const char *        g_app_info_get_name                 (GAppInfo *appinfo);
+

+Gets the installed name of the application.

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

appinfo :

a GAppInfo. +

Returns :

the name of the application for appinfo. +
+
+
+
+

g_app_info_get_display_name ()

+
const char *        g_app_info_get_display_name         (GAppInfo *appinfo);
+

+Gets the display name of the application. The display name is often more +descriptive to the user than the name itself.

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

appinfo :

a GAppInfo. +

Returns :

the display name of the application for appinfo, or the name if +no display name is available. + +
+

Since 2.24

+
+
+
+

g_app_info_get_description ()

+
const char *        g_app_info_get_description          (GAppInfo *appinfo);
+

+Gets a human-readable description of an installed application.

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

appinfo :

a GAppInfo. +

Returns :

a string containing a description of the +application appinfo, or NULL if none. +
+
+
+
+

g_app_info_get_executable ()

+
const char *        g_app_info_get_executable           (GAppInfo *appinfo);
+

+Gets the executable's name for the installed application.

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

appinfo :

a GAppInfo +

Returns :

a string containing the appinfo's application +binaries name +
+
+
+
+

g_app_info_get_commandline ()

+
const char *        g_app_info_get_commandline          (GAppInfo *appinfo);
+

+Gets the commandline with which the application will be +started.

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

appinfo :

a GAppInfo +

Returns :

a string containing the appinfo's commandline, + or NULL if this information is not available + +
+

Since 2.20

+
+
+
+

g_app_info_get_icon ()

+
GIcon *             g_app_info_get_icon                 (GAppInfo *appinfo);
+

+Gets the icon for the application.

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

appinfo :

a GAppInfo. +

Returns :

the default GIcon for appinfo. +
+
+
+
+

g_app_info_launch ()

+
gboolean            g_app_info_launch                   (GAppInfo *appinfo,
+                                                         GList *files,
+                                                         GAppLaunchContext *launch_context,
+                                                         GError **error);
+

+Launches the application. Passes files to the launched application +as arguments, using the optional launch_context to get information +about the details of the launcher (like what screen it is on). +On error, error will be set accordingly. +

+

+To lauch the application without arguments pass a NULL files list. +

+

+Note that even if the launch is successful the application launched +can fail to start if it runs into problems during startup. There is +no way to detect this. +

+

+Some URIs can be changed when passed through a GFile (for instance +unsupported uris with strange formats like mailto:), so if you have +a textual uri you want to pass in as argument, consider using +g_app_info_launch_uris() instead.

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

appinfo :

a GAppInfo +

files :

a GList of GFile objects +

launch_context :

a GAppLaunchContext or NULL +

error :

a GError +

Returns :

TRUE on successful launch, FALSE otherwise. +
+
+
+
+

g_app_info_supports_files ()

+
gboolean            g_app_info_supports_files           (GAppInfo *appinfo);
+

+Checks if the application accepts files as arguments.

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

appinfo :

a GAppInfo. +

Returns :

TRUE if the appinfo supports files. +
+
+
+
+

g_app_info_supports_uris ()

+
gboolean            g_app_info_supports_uris            (GAppInfo *appinfo);
+

+Checks if the application supports reading files and directories from URIs.

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

appinfo :

a GAppInfo. +

Returns :

TRUE if the appinfo supports URIs. +
+
+
+
+

g_app_info_launch_uris ()

+
gboolean            g_app_info_launch_uris              (GAppInfo *appinfo,
+                                                         GList *uris,
+                                                         GAppLaunchContext *launch_context,
+                                                         GError **error);
+

+Launches the application. Passes uris to the launched application +as arguments, using the optional launch_context to get information +about the details of the launcher (like what screen it is on). +On error, error will be set accordingly. +

+

+To lauch the application without arguments pass a NULL uris list. +

+

+Note that even if the launch is successful the application launched +can fail to start if it runs into problems during startup. There is +no way to detect this.

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

appinfo :

a GAppInfo +

uris :

a GList containing URIs to launch. +

launch_context :

a GAppLaunchContext or NULL +

error :

a GError +

Returns :

TRUE on successful launch, FALSE otherwise. +
+
+
+
+

g_app_info_should_show ()

+
gboolean            g_app_info_should_show              (GAppInfo *appinfo);
+

+Checks if the application info should be shown in menus that +list available applications.

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

appinfo :

a GAppInfo. +

Returns :

TRUE if the appinfo should be shown, FALSE otherwise. +
+
+
+
+

g_app_info_can_delete ()

+
gboolean            g_app_info_can_delete               (GAppInfo *appinfo);
+

+Obtains the information whether the GAppInfo can be deleted. +See g_app_info_delete().

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

appinfo :

a GAppInfo +

Returns :

TRUE if appinfo can be deleted + +
+

Since 2.20

+
+
+
+

g_app_info_delete ()

+
gboolean            g_app_info_delete                   (GAppInfo *appinfo);
+

+Tries to delete a GAppInfo. +

+

+On some platforms, there may be a difference between user-defined +GAppInfos which can be deleted, and system-wide ones which +cannot. See g_app_info_can_delete().

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

appinfo :

a GAppInfo +

Returns :

TRUE if appinfo has been deleted + +
+

Since 2.20

+
+
+
+

g_app_info_reset_type_associations ()

+
void                g_app_info_reset_type_associations  (const char *content_type);
+

+Removes all changes to the type associations done by +g_app_info_set_as_default_for_type(), +g_app_info_set_as_default_for_extension(), +g_app_info_add_supports_type() or g_app_info_remove_supports_type().

+
++ + + + +

content_type :

a content type +
+

Since 2.20

+
+
+
+

g_app_info_set_as_default_for_type ()

+
gboolean            g_app_info_set_as_default_for_type  (GAppInfo *appinfo,
+                                                         const char *content_type,
+                                                         GError **error);
+

+Sets the application as the default handler for a given type.

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

appinfo :

a GAppInfo. +

content_type :

the content type. +

error :

a GError. +

Returns :

TRUE on success, FALSE on error. +
+
+
+
+

g_app_info_set_as_default_for_extension ()

+
gboolean            g_app_info_set_as_default_for_extension
+                                                        (GAppInfo *appinfo,
+                                                         const char *extension,
+                                                         GError **error);
+

+Sets the application as the default handler for the given file extension.

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

appinfo :

a GAppInfo. +

extension :

a string containing the file extension (without the dot). +

error :

a GError. +

Returns :

TRUE on success, FALSE on error. +
+
+
+
+

g_app_info_add_supports_type ()

+
gboolean            g_app_info_add_supports_type        (GAppInfo *appinfo,
+                                                         const char *content_type,
+                                                         GError **error);
+

+Adds a content type to the application information to indicate the +application is capable of opening files with the given content type.

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

appinfo :

a GAppInfo. +

content_type :

a string. +

error :

a GError. +

Returns :

TRUE on success, FALSE on error. +
+
+
+
+

g_app_info_can_remove_supports_type ()

+
gboolean            g_app_info_can_remove_supports_type (GAppInfo *appinfo);
+

+Checks if a supported content type can be removed from an application.

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

appinfo :

a GAppInfo. +

Returns :

TRUE if it is possible to remove supported + content types from a given appinfo, FALSE if not. +
+
+
+
+

g_app_info_remove_supports_type ()

+
gboolean            g_app_info_remove_supports_type     (GAppInfo *appinfo,
+                                                         const char *content_type,
+                                                         GError **error);
+

+Removes a supported type from an application, if possible.

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

appinfo :

a GAppInfo. +

content_type :

a string. +

error :

a GError. +

Returns :

TRUE on success, FALSE on error. +
+
+
+
+

g_app_info_get_all ()

+
GList *             g_app_info_get_all                  (void);
+

+Gets a list of all of the applications currently registered +on this system. +

+

+For desktop files, this includes applications that have +NoDisplay=true set or are excluded from +display by means of OnlyShowIn or +NotShowIn. See g_app_info_should_show(). +The returned list does not include applications which have +the Hidden key set.

+
++ + + + +

Returns :

a newly allocated GList of references to GAppInfos. +
+
+
+
+

g_app_info_get_all_for_type ()

+
GList *             g_app_info_get_all_for_type         (const char *content_type);
+

+Gets a list of all GAppInfos for a given content type.

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

content_type :

the content type to find a GAppInfo for +

Returns :

GList of GAppInfos for given content_type + or NULL on error. +
+
+
+
+

g_app_info_get_default_for_type ()

+
GAppInfo *          g_app_info_get_default_for_type     (const char *content_type,
+                                                         gboolean must_support_uris);
+

+Gets the GAppInfo that corresponds to a given content type.

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

content_type :

the content type to find a GAppInfo for +

must_support_uris :

if TRUE, the GAppInfo is expected to + support URIs +

Returns :

GAppInfo for given content_type or NULL on error. +
+
+
+
+

g_app_info_get_default_for_uri_scheme ()

+
GAppInfo *          g_app_info_get_default_for_uri_scheme
+                                                        (const char *uri_scheme);
+

+Gets the default application for launching applications +using this URI scheme. A URI scheme is the initial part +of the URI, up to but not including the ':', e.g. "http", +"ftp" or "sip".

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

uri_scheme :

a string containing a URI scheme. +

Returns :

GAppInfo for given uri_scheme or NULL on error. +
+
+
+
+

g_app_info_launch_default_for_uri ()

+
gboolean            g_app_info_launch_default_for_uri   (const char *uri,
+                                                         GAppLaunchContext *launch_context,
+                                                         GError **error);
+

+Utility function that launches the default application +registered to handle the specified uri. Synchronous I/O +is done on the uri to detect the type of the file if +required.

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

uri :

the uri to show +

launch_context :

an optional GAppLaunchContext. +

error :

a GError. +

Returns :

TRUE on success, FALSE on error. +
+
+
+
+

g_app_launch_context_get_display ()

+
char *              g_app_launch_context_get_display    (GAppLaunchContext *context,
+                                                         GAppInfo *info,
+                                                         GList *files);
+

+Gets the display string for the display. This is used to ensure new +applications are started on the same display as the launching +application.

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

context :

a GAppLaunchContext +

info :

a GAppInfo +

files :

a GList of GFile objects +

Returns :

a display string for the display. +
+
+
+
+

g_app_launch_context_get_startup_notify_id ()

+
char *              g_app_launch_context_get_startup_notify_id
+                                                        (GAppLaunchContext *context,
+                                                         GAppInfo *info,
+                                                         GList *files);
+

+Initiates startup notification for the application and returns the +DESKTOP_STARTUP_ID for the launched operation, if supported. +

+

+Startup notification IDs are defined in the +FreeDesktop.Org Startup Notifications standard.

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

context :

a GAppLaunchContext +

info :

a GAppInfo +

files :

a GList of of GFile objects +

Returns :

a startup notification ID for the application, or NULL if + not supported. +
+
+
+
+

g_app_launch_context_launch_failed ()

+
void                g_app_launch_context_launch_failed  (GAppLaunchContext *context,
+                                                         const char *startup_notify_id);
+

+Called when an application has failed to launch, so that it can cancel +the application startup notification started in g_app_launch_context_get_startup_notify_id().

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

context :

a GAppLaunchContext. +

startup_notify_id :

the startup notification id that was returned by g_app_launch_context_get_startup_notify_id(). +
+
+
+
+

g_app_launch_context_new ()

+
GAppLaunchContext * g_app_launch_context_new            (void);
+

+Creates a new application launch context. This is not normally used, +instead you instantiate a subclass of this, such as GdkAppLaunchContext.

+
++ + + + +

Returns :

a GAppLaunchContext. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GAsyncInitable.html b/docs/reference/gio/html/GAsyncInitable.html new file mode 100644 index 0000000..3b02f3c --- /dev/null +++ b/docs/reference/gio/html/GAsyncInitable.html @@ -0,0 +1,552 @@ + + + + +GAsyncInitable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GAsyncInitable

+

GAsyncInitable — Asynchronously failable object initialization interface

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GAsyncInitable;
+                    GAsyncInitableIface;
+void                g_async_initable_init_async         (GAsyncInitable *initable,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_async_initable_init_finish        (GAsyncInitable *initable,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+void                g_async_initable_new_async          (GType object_type,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         const gchar *first_property_name,
+                                                         ...);
+GObject *           g_async_initable_new_finish         (GAsyncInitable *initable,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+void                g_async_initable_new_valist_async   (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+void                g_async_initable_newv_async         (GType object_type,
+                                                         guint n_parameters,
+                                                         GParameter *parameters,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GAsyncInitable
+
+
+
+

Prerequisites

+

+GAsyncInitable requires + GObject.

+
+
+

Description

+

+This is the asynchronous version of GInitable; it behaves the same +in all ways except that initialization is asynchronous. For more details +see the descriptions on GInitable. +

+

+A class may implement both the GInitable and GAsyncInitable interfaces. +

+

+Users of objects implementing this are not intended to use the interface +method directly; instead it will be used automatically in various ways. +For C applications you generally just call g_async_initable_new_async() +directly, or indirectly via a foo_thing_new_async() wrapper. This will call +g_async_initable_init_async() under the cover, calling back with NULL and +a set GError on failure.

+
+
+

Details

+
+

GAsyncInitable

+
typedef struct _GAsyncInitable GAsyncInitable;
+

+Interface for asynchronously initializable objects.

+

Since 2.22

+
+
+
+

GAsyncInitableIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  void     (* init_async)  (GAsyncInitable      *initable,
+			    int                  io_priority,
+			    GCancellable        *cancellable,
+			    GAsyncReadyCallback  callback,
+			    gpointer             user_data);
+  gboolean (* init_finish) (GAsyncInitable      *initable,
+			    GAsyncResult        *res,
+			    GError             **error);
+} GAsyncInitableIface;
+
+

+Provides an interface for asynchronous initializing object such that +initialization may fail.

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

GTypeInterface g_iface;

The parent interface. +

init_async ()

Starts initialization of the object. +

init_finish ()

Finishes initialization of the object. +
+

Since 2.22

+
+
+
+

g_async_initable_init_async ()

+
void                g_async_initable_init_async         (GAsyncInitable *initable,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Starts asynchronous initialization of the object implementing the +interface. This must be done before any real use of the object after +initial construction. If the object also implements GInitable you can +optionally call g_initable_init() instead. +

+

+When the initialization is finished, callback will be called. You can +then call g_async_initable_init_finish() to get the result of the +initialization. +

+

+Implementations may also support cancellation. If cancellable is not +NULL, then initialization can be cancelled by triggering the cancellable +object from another thread. If the operation was cancelled, the error +G_IO_ERROR_CANCELLED will be returned. If cancellable is not NULL, and +the object doesn't support cancellable initialization, the error +G_IO_ERROR_NOT_SUPPORTED will be returned. +

+

+If this function is not called, or returns with an error, then all +operations on the object should fail, generally returning the +error G_IO_ERROR_NOT_INITIALIZED. +

+

+Implementations of this method must be idempotent: i.e. multiple calls +to this function with the same argument should return the same results. +Only the first call initializes the object; further calls return the result +of the first call. This is so that it's safe to implement the singleton +pattern in the GObject constructor function. +

+

+For classes that also support the GInitable interface, the default +implementation of this method will run the g_initable_init() function +in a thread, so if you want to support asynchronous initialization via +threads, just implement the GAsyncInitable interface without overriding +any interface methods.

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

initable :

a GAsyncInitable. +

io_priority :

the I/O priority + of the operation. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_async_initable_init_finish ()

+
gboolean            g_async_initable_init_finish        (GAsyncInitable *initable,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes asynchronous initialization and returns the result. +See g_async_initable_init_async().

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

initable :

a GAsyncInitable. +

res :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if successful. If an error has occurred, this function +will return FALSE and set error appropriately if present. + +
+

Since 2.22

+
+
+
+

g_async_initable_new_async ()

+
void                g_async_initable_new_async          (GType object_type,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         const gchar *first_property_name,
+                                                         ...);
+

+Helper function for constructing GAsyncInitiable object. This is +similar to g_object_new() but also initializes the object asynchronously. +

+

+When the initialization is finished, callback will be called. You can +then call g_async_initable_new_finish() to get the new object and check +for any errors.

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

object_type :

a GType supporting GAsyncInitable. +

io_priority :

the I/O priority + of the operation. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the initialization is + finished +

user_data :

the data to pass to callback function +

first_property_name :

the name of the first property, or NULL if no + properties +

... :

the value of the first property, followed by other property + value pairs, and ended by NULL. +
+

Since 2.22

+
+
+
+

g_async_initable_new_finish ()

+
GObject *           g_async_initable_new_finish         (GAsyncInitable *initable,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes the async construction for the various g_async_initable_new calls, +returning the created object or NULL on error.

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

initable :

the GAsyncInitable from the callback +

res :

the GAsyncResult.from the callback +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

a newly created GObject, or NULL on error. Free with + g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_async_initable_new_valist_async ()

+
void                g_async_initable_new_valist_async   (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Helper function for constructing GAsyncInitiable object. This is +similar to g_object_new_valist() but also initializes the object +asynchronously. +

+

+When the initialization is finished, callback will be called. You can +then call g_async_initable_new_finish() to get the new object and check +for any errors.

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

object_type :

a GType supporting GAsyncInitable. +

first_property_name :

the name of the first property, followed by +the value, and other property value pairs, and ended by NULL. +

var_args :

The var args list generated from first_property_name. +

io_priority :

the I/O priority + of the operation. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the initialization is + finished +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_async_initable_newv_async ()

+
void                g_async_initable_newv_async         (GType object_type,
+                                                         guint n_parameters,
+                                                         GParameter *parameters,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Helper function for constructing GAsyncInitiable object. This is +similar to g_object_newv() but also initializes the object asynchronously. +

+

+When the initialization is finished, callback will be called. You can +then call g_async_initable_new_finish() to get the new object and check +for any errors.

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

object_type :

a GType supporting GAsyncInitable. +

n_parameters :

the number of parameters in parameters +

parameters :

the parameters to use to construct the object +

io_priority :

the I/O priority + of the operation. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the initialization is + finished +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

See Also

+GInitable +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GAsyncResult.html b/docs/reference/gio/html/GAsyncResult.html new file mode 100644 index 0000000..8167ca4 --- /dev/null +++ b/docs/reference/gio/html/GAsyncResult.html @@ -0,0 +1,322 @@ + + + + +GAsyncResult + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GAsyncResult

+

GAsyncResult — Asynchronous Function Results

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GAsyncResult;
+                    GAsyncResultIface;
+void                (*GAsyncReadyCallback)              (GObject *source_object,
+                                                         GAsyncResult *res,
+                                                         gpointer user_data);
+gpointer            g_async_result_get_user_data        (GAsyncResult *res);
+GObject *           g_async_result_get_source_object    (GAsyncResult *res);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GAsyncResult
+
+
+
+

Prerequisites

+

+GAsyncResult requires + GObject.

+
+
+

Known Implementations

+

+GAsyncResult is implemented by + GSimpleAsyncResult.

+
+
+

Description

+

+Provides a base class for implementing asynchronous function results. +

+

+Asynchronous operations are broken up into two separate operations +which are chained together by a GAsyncReadyCallback. To begin +an asynchronous operation, provide a GAsyncReadyCallback to the +asynchronous function. This callback will be triggered when the +operation has completed, and will be passed a GAsyncResult instance +filled with the details of the operation's success or failure, the +object the asynchronous function was started for and any error codes +returned. The asynchronous callback function is then expected to call +the corresponding "_finish()" function, passing the object the +function was called for, the GAsyncResult instance, and (optionally) +an error to grab any error conditions that may have occurred. +

+

+The "_finish()" function for an operation takes the generic result +(of type GAsyncResult) and returns the specific result that the +operation in question yields (e.g. a GFileEnumerator for a +"enumerate children" operation). If the result or error status of the +operation is not needed, there is no need to call the "_finish()" +function; GIO will take care of cleaning up the result and error +information after the GAsyncReadyCallback returns. Applications may +also take a reference to the GAsyncResult and call "_finish()" +later; however, the "_finish()" function may be called at most once. +

+

+Example of a typical asynchronous operation flow: +

+
+void _theoretical_frobnitz_async (Theoretical         *t,
+                                  GCancellable        *c,
+                                  GAsyncReadyCallback *cb,
+                                  gpointer             u);
+
+gboolean _theoretical_frobnitz_finish (Theoretical   *t,
+                                       GAsyncResult  *res,
+                                       GError       **e);
+
+static void
+frobnitz_result_func (GObject      *source_object,
+		 GAsyncResult *res,
+		 gpointer      user_data)
+{
+  gboolean success = FALSE;
+
+  success = _theoretical_frobnitz_finish (source_object, res, NULL);
+
+  if (success)
+    g_printf ("Hurray!\n");
+  else
+    g_printf ("Uh oh!\n");
+
+  /* ... */
+
+}
+
+int main (int argc, void *argv[])
+{
+   /* ... */
+
+   _theoretical_frobnitz_async (theoretical_data,
+                                NULL,
+                                frobnitz_result_func,
+                                NULL);
+
+   /* ... */
+}
+
+

+

+

+The callback for an asynchronous operation is called only once, and is +always called, even in the case of a cancelled operation. On cancellation +the result is a G_IO_ERROR_CANCELLED error. +

+

+Some asynchronous operations are implemented using synchronous calls. +These are run in a separate thread, if GThread has been initialized, but +otherwise they are sent to the Main Event Loop and processed in an idle +function. So, if you truly need asynchronous operations, make sure to +initialize GThread.

+
+
+

Details

+
+

GAsyncResult

+
typedef struct _GAsyncResult GAsyncResult;
+

+Holds results information for an asynchronous operation, +usually passed directly to a asynchronous _finish() operation.

+
+
+
+

GAsyncResultIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  gpointer  (* get_user_data)     (GAsyncResult *async_result);
+  GObject * (* get_source_object) (GAsyncResult *async_result);
+} GAsyncResultIface;
+
+

+Interface definition for GAsyncResult.

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

GTypeInterface g_iface;

The parent interface. +

get_user_data ()

Gets the user data passed to the callback. +

get_source_object ()

Gets the source object that issued the asynchronous operation. +
+
+
+
+

GAsyncReadyCallback ()

+
void                (*GAsyncReadyCallback)              (GObject *source_object,
+                                                         GAsyncResult *res,
+                                                         gpointer user_data);
+

+Type definition for a function that will be called back when an asynchronous +operation within GIO has been completed.

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

source_object :

the object the asynchronous operation was started with. +

res :

a GAsyncResult. +

user_data :

user data passed to the callback. +
+
+
+
+

g_async_result_get_user_data ()

+
gpointer            g_async_result_get_user_data        (GAsyncResult *res);
+

+Gets the user data from a GAsyncResult.

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

res :

a GAsyncResult. +

Returns :

the user data for res. +
+
+
+
+

g_async_result_get_source_object ()

+
GObject *           g_async_result_get_source_object    (GAsyncResult *res);
+

+Gets the source object from a GAsyncResult.

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

res :

a GAsyncResult +

Returns :

a new reference to the source object for the res, + or NULL if there is none. +
+
+
+
+

See Also

+GSimpleAsyncResult +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GBufferedInputStream.html b/docs/reference/gio/html/GBufferedInputStream.html new file mode 100644 index 0000000..a2365bf --- /dev/null +++ b/docs/reference/gio/html/GBufferedInputStream.html @@ -0,0 +1,579 @@ + + + + +GBufferedInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GBufferedInputStream

+

GBufferedInputStream — Buffered Input Stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GFilterInputStream
+               +----GBufferedInputStream
+                     +----GDataInputStream
+
+
+
+

Properties

+
+  "buffer-size"              guint                 : Read / Write / Construct
+
+
+
+

Description

+

+Buffered input stream implements GFilterInputStream and provides +for buffered reads. +

+

+By default, GBufferedInputStream's buffer size is set at 4 kilobytes. +

+

+To create a buffered input stream, use g_buffered_input_stream_new(), +or g_buffered_input_stream_new_sized() to specify the buffer's size at +construction. +

+

+To get the size of a buffer within a buffered input stream, use +g_buffered_input_stream_get_buffer_size(). To change the size of a +buffered input stream's buffer, use +g_buffered_input_stream_set_buffer_size(). Note that the buffer's size +cannot be reduced below the size of the data within the buffer.

+
+
+

Details

+
+

GBufferedInputStream

+
typedef struct _GBufferedInputStream GBufferedInputStream;
+

+Implements GFilterInputStream with a sized input buffer.

+
+
+
+

g_buffered_input_stream_new ()

+
GInputStream*       g_buffered_input_stream_new         (GInputStream *base_stream);
+

+Creates a new GInputStream from the given base_stream, with +a buffer set to the default size (4 kilobytes).

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

base_stream :

a GInputStream. +

Returns :

a GInputStream for the given base_stream. +
+
+
+
+

g_buffered_input_stream_new_sized ()

+
GInputStream*       g_buffered_input_stream_new_sized   (GInputStream *base_stream,
+                                                         gsize size);
+

+Creates a new GBufferedInputStream from the given base_stream, +with a buffer set to size.

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

base_stream :

a GInputStream. +

size :

a gsize. +

Returns :

a GInputStream. +
+
+
+
+

g_buffered_input_stream_get_buffer_size ()

+
gsize               g_buffered_input_stream_get_buffer_size
+                                                        (GBufferedInputStream *stream);
+

+Gets the size of the input buffer.

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

stream :

GBufferedInputStream. +

Returns :

the current buffer size. +
+
+
+
+

g_buffered_input_stream_set_buffer_size ()

+
void                g_buffered_input_stream_set_buffer_size
+                                                        (GBufferedInputStream *stream,
+                                                         gsize size);
+

+Sets the size of the internal buffer of stream to size, or to the +size of the contents of the buffer. The buffer can never be resized +smaller than its current contents.

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

stream :

GBufferedInputStream. +

size :

a gsize. +
+
+
+
+

g_buffered_input_stream_get_available ()

+
gsize               g_buffered_input_stream_get_available
+                                                        (GBufferedInputStream *stream);
+

+Gets the size of the available data within the stream.

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

stream :

GBufferedInputStream. +

Returns :

size of the available stream. +
+
+
+
+

g_buffered_input_stream_peek_buffer ()

+
const void*         g_buffered_input_stream_peek_buffer (GBufferedInputStream *stream,
+                                                         gsize *count);
+

+Returns the buffer with the currently available bytes. The returned +buffer must not be modified and will become invalid when reading from +the stream or filling the buffer.

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

stream :

a GBufferedInputStream. +

count :

a gsize to get the number of bytes available in the buffer. +

Returns :

read-only buffer +
+
+
+
+

g_buffered_input_stream_peek ()

+
gsize               g_buffered_input_stream_peek        (GBufferedInputStream *stream,
+                                                         void *buffer,
+                                                         gsize offset,
+                                                         gsize count);
+

+Peeks in the buffer, copying data of size count into buffer, +offset offset bytes.

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

stream :

a GBufferedInputStream. +

buffer :

a pointer to an allocated chunk of memory. +

offset :

a gsize. +

count :

a gsize. +

Returns :

a gsize of the number of bytes peeked, or -1 on error. +
+
+
+
+

g_buffered_input_stream_fill ()

+
gssize              g_buffered_input_stream_fill        (GBufferedInputStream *stream,
+                                                         gssize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to read count bytes from the stream into the buffer. +Will block during this read. +

+

+If count is zero, returns zero and does nothing. A value of count +larger than G_MAXSSIZE will cause a G_IO_ERROR_INVALID_ARGUMENT error. +

+

+On success, the number of bytes read into the buffer is returned. +It is not an error if this is not the same as the requested size, as it +can happen e.g. near the end of a file. Zero is returned on end of file +(or if count is zero), but never otherwise. +

+

+If count is -1 then the attempted read size is equal to the number of +bytes that are required to fill the buffer. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an +operation was partially finished when the operation was cancelled the +partial result will be returned, without an error. +

+

+On error -1 is returned and error is set accordingly. +

+

+For the asynchronous, non-blocking, version of this function, see +g_buffered_input_stream_fill_async().

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

stream :

GBufferedInputStream. +

count :

the number of bytes that will be read from the stream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore. +

Returns :

the number of bytes read into stream's buffer, up to count, + or -1 on error. +
+
+
+
+

g_buffered_input_stream_fill_async ()

+
void                g_buffered_input_stream_fill_async  (GBufferedInputStream *stream,
+                                                         gssize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Reads data into stream's buffer asynchronously, up to count size. +io_priority can be used to prioritize reads. For the synchronous +version of this function, see g_buffered_input_stream_fill(). +

+

+If count is -1 then the attempted read size is equal to the number +of bytes that are required to fill the buffer.

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

stream :

GBufferedInputStream. +

count :

the number of bytes that will be read from the stream. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object +

callback :

a GAsyncReadyCallback. +

user_data :

a gpointer. +
+
+
+
+

g_buffered_input_stream_fill_finish ()

+
gssize              g_buffered_input_stream_fill_finish (GBufferedInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an asynchronous read.

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

stream :

a GBufferedInputStream. +

result :

a GAsyncResult. +

error :

a GError. +

Returns :

a gssize of the read stream, or -1 on an error. +
+
+
+
+

g_buffered_input_stream_read_byte ()

+
int                 g_buffered_input_stream_read_byte   (GBufferedInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to read a single byte from the stream or the buffer. Will block +during this read. +

+

+On success, the byte read from the stream is returned. On end of stream +-1 is returned but it's not an exceptional error and error is not set. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an +operation was partially finished when the operation was cancelled the +partial result will be returned, without an error. +

+

+On error -1 is returned and error is set accordingly.

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

stream :

GBufferedInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore. +

Returns :

the byte read from the stream, or -1 on end of stream or error. +
+
+
+
+

Property Details

+
+

The "buffer-size" property

+
  "buffer-size"              guint                 : Read / Write / Construct
+

The size of the backend buffer.

+

Allowed values: >= 1

+

Default value: 4096

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GBufferedOutputStream.html b/docs/reference/gio/html/GBufferedOutputStream.html new file mode 100644 index 0000000..bc5aeb3 --- /dev/null +++ b/docs/reference/gio/html/GBufferedOutputStream.html @@ -0,0 +1,317 @@ + + + + +GBufferedOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GBufferedOutputStream

+

GBufferedOutputStream — Buffered Output Stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GFilterOutputStream
+               +----GBufferedOutputStream
+
+
+
+

Properties

+
+  "auto-grow"                gboolean              : Read / Write
+  "buffer-size"              guint                 : Read / Write / Construct
+
+
+
+

Description

+

+Buffered output stream implements GFilterOutputStream and provides +for buffered writes. +

+

+By default, GBufferedOutputStream's buffer size is set at 4 kilobytes. +

+

+To create a buffered output stream, use g_buffered_output_stream_new(), +or g_buffered_output_stream_new_sized() to specify the buffer's size +at construction. +

+

+To get the size of a buffer within a buffered input stream, use +g_buffered_output_stream_get_buffer_size(). To change the size of a +buffered output stream's buffer, use +g_buffered_output_stream_set_buffer_size(). Note that the buffer's +size cannot be reduced below the size of the data within the buffer.

+
+
+

Details

+
+

GBufferedOutputStream

+
typedef struct _GBufferedOutputStream GBufferedOutputStream;
+

+An implementation of GFilterOutputStream with a sized buffer.

+
++ +
+
+
+
+

g_buffered_output_stream_new ()

+
GOutputStream*      g_buffered_output_stream_new        (GOutputStream *base_stream);
+

+Creates a new buffered output stream for a base stream.

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

base_stream :

a GOutputStream. +

Returns :

a GOutputStream for the given base_stream. +
+
+
+
+

g_buffered_output_stream_new_sized ()

+
GOutputStream*      g_buffered_output_stream_new_sized  (GOutputStream *base_stream,
+                                                         gsize size);
+

+Creates a new buffered output stream with a given buffer size.

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

base_stream :

a GOutputStream. +

size :

a gsize. +

Returns :

a GOutputStream with an internal buffer set to size. +
+
+
+
+

g_buffered_output_stream_get_buffer_size ()

+
gsize               g_buffered_output_stream_get_buffer_size
+                                                        (GBufferedOutputStream *stream);
+

+Gets the size of the buffer in the stream.

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

stream :

a GBufferedOutputStream. +

Returns :

the current size of the buffer. +
+
+
+
+

g_buffered_output_stream_set_buffer_size ()

+
void                g_buffered_output_stream_set_buffer_size
+                                                        (GBufferedOutputStream *stream,
+                                                         gsize size);
+

+Sets the size of the internal buffer to size.

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

stream :

a GBufferedOutputStream. +

size :

a gsize. +
+
+
+
+

g_buffered_output_stream_get_auto_grow ()

+
gboolean            g_buffered_output_stream_get_auto_grow
+                                                        (GBufferedOutputStream *stream);
+

+Checks if the buffer automatically grows as data is added.

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

stream :

a GBufferedOutputStream. +

Returns :

TRUE if the stream's buffer automatically grows, +FALSE otherwise. +
+
+
+
+

g_buffered_output_stream_set_auto_grow ()

+
void                g_buffered_output_stream_set_auto_grow
+                                                        (GBufferedOutputStream *stream,
+                                                         gboolean auto_grow);
+

+Sets whether or not the stream's buffer should automatically grow. +If auto_grow is true, then each write will just make the buffer +larger, and you must manually flush the buffer to actually write out +the data to the underlying stream.

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

stream :

a GBufferedOutputStream. +

auto_grow :

a gboolean. +
+
+
+
+

Property Details

+
+

The "auto-grow" property

+
  "auto-grow"                gboolean              : Read / Write
+

Whether the buffer should automatically grow.

+

Default value: FALSE

+
+
+
+

The "buffer-size" property

+
  "buffer-size"              guint                 : Read / Write / Construct
+

The size of the backend buffer.

+

Allowed values: >= 1

+

Default value: 4096

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GCancellable.html b/docs/reference/gio/html/GCancellable.html new file mode 100644 index 0000000..ab86983 --- /dev/null +++ b/docs/reference/gio/html/GCancellable.html @@ -0,0 +1,606 @@ + + + + +GCancellable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GCancellable

+

GCancellable — Thread-safe Operation Cancellation Stack

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GCancellable;
+GCancellable *      g_cancellable_new                   (void);
+gboolean            g_cancellable_is_cancelled          (GCancellable *cancellable);
+gboolean            g_cancellable_set_error_if_cancelled
+                                                        (GCancellable *cancellable,
+                                                         GError **error);
+int                 g_cancellable_get_fd                (GCancellable *cancellable);
+gboolean            g_cancellable_make_pollfd           (GCancellable *cancellable,
+                                                         GPollFD *pollfd);
+void                g_cancellable_release_fd            (GCancellable *cancellable);
+GCancellable *      g_cancellable_get_current           (void);
+void                g_cancellable_pop_current           (GCancellable *cancellable);
+void                g_cancellable_push_current          (GCancellable *cancellable);
+void                g_cancellable_reset                 (GCancellable *cancellable);
+gulong              g_cancellable_connect               (GCancellable *cancellable,
+                                                         GCallback callback,
+                                                         gpointer data,
+                                                         GDestroyNotify data_destroy_func);
+void                g_cancellable_disconnect            (GCancellable *cancellable,
+                                                         gulong handler_id);
+void                g_cancellable_cancel                (GCancellable *cancellable);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GCancellable
+
+
+
+

Signals

+
+  "cancelled"                                      : Run Last
+
+
+
+

Description

+

+GCancellable is a thread-safe operation cancellation stack used +throughout GIO to allow for cancellation of synchronous and +asynchronous operations.

+
+
+

Details

+
+

GCancellable

+
typedef struct _GCancellable GCancellable;
+

+Allows actions to be cancelled.

+
+
+
+

g_cancellable_new ()

+
GCancellable *      g_cancellable_new                   (void);
+

+Creates a new GCancellable object. +

+

+Applications that want to start one or more operations +that should be cancellable should create a GCancellable +and pass it to the operations. +

+

+One GCancellable can be used in multiple consecutive +operations, but not in multiple concurrent operations.

+
++ + + + +

Returns :

a GCancellable. +
+
+
+
+

g_cancellable_is_cancelled ()

+
gboolean            g_cancellable_is_cancelled          (GCancellable *cancellable);
+

+Checks if a cancellable job has been cancelled.

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

cancellable :

a GCancellable or NULL. +

Returns :

TRUE if cancellable is cancelled, +FALSE if called with NULL or if item is not cancelled. +
+
+
+
+

g_cancellable_set_error_if_cancelled ()

+
gboolean            g_cancellable_set_error_if_cancelled
+                                                        (GCancellable *cancellable,
+                                                         GError **error);
+

+If the cancellable is cancelled, sets the error to notify +that the operation was cancelled.

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

cancellable :

a GCancellable object. +

error :

GError to append error state to. +

Returns :

TRUE if cancellable was cancelled, FALSE if it was not. +
+
+
+
+

g_cancellable_get_fd ()

+
int                 g_cancellable_get_fd                (GCancellable *cancellable);
+

+Gets the file descriptor for a cancellable job. This can be used to +implement cancellable operations on Unix systems. The returned fd will +turn readable when cancellable is cancelled. +

+

+You are not supposed to read from the fd yourself, just check for +readable status. Reading to unset the readable status is done +with g_cancellable_reset(). +

+

+After a successful return from this function, you should use +g_cancellable_release_fd() to free up resources allocated for +the returned file descriptor. +

+

+See also g_cancellable_make_pollfd().

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

cancellable :

a GCancellable. +

Returns :

A valid file descriptor. -1 if the file descriptor +is not supported, or on errors. +
+
+
+
+

g_cancellable_make_pollfd ()

+
gboolean            g_cancellable_make_pollfd           (GCancellable *cancellable,
+                                                         GPollFD *pollfd);
+

+Creates a GPollFD corresponding to cancellable; this can be passed +to g_poll() and used to poll for cancellation. This is useful both +for unix systems without a native poll and for portability to +windows. +

+

+When this function returns TRUE, you should use +g_cancellable_release_fd() to free up resources allocated for the +pollfd. After a FALSE return, do not call g_cancellable_release_fd(). +

+

+If this function returns FALSE, either no cancellable was given or +resource limits prevent this function from allocating the necessary +structures for polling. (On Linux, you will likely have reached +the maximum number of file descriptors.) The suggested way to handle +these cases is to ignore the cancellable. +

+

+You are not supposed to read from the fd yourself, just check for +readable status. Reading to unset the readable status is done +with g_cancellable_reset().

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

cancellable :

a GCancellable or NULL +

pollfd :

a pointer to a GPollFD +

Returns :

TRUE if pollfd was successfully initialized, FALSE on + failure to prepare the cancellable. + +
+

Since 2.22

+
+
+
+

g_cancellable_release_fd ()

+
void                g_cancellable_release_fd            (GCancellable *cancellable);
+

+Releases a resources previously allocated by g_cancellable_get_fd() +or g_cancellable_make_pollfd(). +

+

+For compatibility reasons with older releases, calling this function +is not strictly required, the resources will be automatically freed +when the cancellable is finalized. However, the cancellable will +block scarce file descriptors until it is finalized if this function +is not called. This can cause the application to run out of file +descriptors when many GCancellables are used at the same time.

+
++ + + + +

cancellable :

a GCancellable +
+

Since 2.22

+
+
+
+

g_cancellable_get_current ()

+
GCancellable *      g_cancellable_get_current           (void);
+

+Gets the top cancellable from the stack.

+
++ + + + +

Returns :

a GCancellable from the top of the stack, or NULL +if the stack is empty. +
+
+
+
+

g_cancellable_pop_current ()

+
void                g_cancellable_pop_current           (GCancellable *cancellable);
+

+Pops cancellable off the cancellable stack (verifying that cancellable +is on the top of the stack).

+
++ + + + +

cancellable :

a GCancellable object +
+
+
+
+

g_cancellable_push_current ()

+
void                g_cancellable_push_current          (GCancellable *cancellable);
+

+Pushes cancellable onto the cancellable stack. The current +cancllable can then be recieved using g_cancellable_get_current(). +

+

+This is useful when implementing cancellable operations in +code that does not allow you to pass down the cancellable object. +

+

+This is typically called automatically by e.g. GFile operations, +so you rarely have to call this yourself.

+
++ + + + +

cancellable :

a GCancellable object +
+
+
+
+

g_cancellable_reset ()

+
void                g_cancellable_reset                 (GCancellable *cancellable);
+

+Resets cancellable to its uncancelled state.

+
++ + + + +

cancellable :

a GCancellable object. +
+
+
+
+

g_cancellable_connect ()

+
gulong              g_cancellable_connect               (GCancellable *cancellable,
+                                                         GCallback callback,
+                                                         gpointer data,
+                                                         GDestroyNotify data_destroy_func);
+

+Convenience function to connect to the "cancelled" +signal. Also handles the race condition that may happen +if the cancellable is cancelled right before connecting. +

+

+callback is called at most once, either directly at the +time of the connect if cancellable is already cancelled, +or when cancellable is cancelled in some thread. +

+

+data_destroy_func will be called when the handler is +disconnected, or immediately if the cancellable is already +cancelled. +

+

+See "cancelled" for details on how to use this.

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

cancellable :

A GCancellable. +

callback :

The GCallback to connect. +

data :

Data to pass to callback. +

data_destroy_func :

Free function for data or NULL. +

Returns :

The id of the signal handler or 0 if cancellable has already + been cancelled. + +
+

Since 2.22

+
+
+
+

g_cancellable_disconnect ()

+
void                g_cancellable_disconnect            (GCancellable *cancellable,
+                                                         gulong handler_id);
+

+Disconnects a handler from a cancellable instance similar to +g_signal_handler_disconnect(). Additionally, in the event that a +signal handler is currently running, this call will block until the +handler has finished. Calling this function from a +"cancelled" signal handler will therefore result in a +deadlock. +

+

+This avoids a race condition where a thread cancels at the +same time as the cancellable operation is finished and the +signal handler is removed. See "cancelled" for +details on how to use this. +

+

+If cancellable is NULL or handler_id is 0 this function does +nothing.

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

cancellable :

A GCancellable or NULL. +

handler_id :

Handler id of the handler to be disconnected, or 0. +
+

Since 2.22

+
+
+
+

g_cancellable_cancel ()

+
void                g_cancellable_cancel                (GCancellable *cancellable);
+

+Will set cancellable to cancelled, and will emit the +"cancelled" signal. (However, see the warning about +race conditions in the documentation for that signal if you are +planning to connect to it.) +

+

+This function is thread-safe. In other words, you can safely call +it from a thread other than the one running the operation that was +passed the cancellable. +

+

+The convention within gio is that cancelling an asynchronous +operation causes it to complete asynchronously. That is, if you +cancel the operation from the same thread in which it is running, +then the operation's GAsyncReadyCallback will not be invoked until +the application returns to the main loop.

+
++ + + + +

cancellable :

a GCancellable object. +
+
+
+
+

Signal Details

+
+

The "cancelled" signal

+
void                user_function                      (GCancellable *cancellable,
+                                                        gpointer      user_data)        : Run Last
+

+Emitted when the operation has been cancelled. +

+

+Can be used by implementations of cancellable operations. If the +operation is cancelled from another thread, the signal will be +emitted in the thread that cancelled the operation, not the +thread that is running the operation. +

+

+Note that disconnecting from this signal (or any signal) in a +multi-threaded program is prone to race conditions. For instance +it is possible that a signal handler may be invoked even +after a call to +g_signal_handler_disconnect() for that handler has already +returned. +

+

+There is also a problem when cancellation happen +right before connecting to the signal. If this happens the +signal will unexpectedly not be emitted, and checking before +connecting to the signal leaves a race condition where this is +still happening. +

+

+In order to make it safe and easy to connect handlers there +are two helper functions: g_cancellable_connect() and +g_cancellable_disconnect() which protect against problems +like this. +

+

+An example of how to us this: +

+
+    /* Make sure we don't do any unnecessary work if already cancelled */
+    if (g_cancellable_set_error_if_cancelled (cancellable))
+      return;
+    /* Set up all the data needed to be able to
+     * handle cancellation of the operation */
+    my_data = my_data_new (...);
+
+    id = 0;
+    if (cancellable)
+      id = g_cancellable_connect (cancellable,
+    			      G_CALLBACK (cancelled_handler)
+    			      data, NULL);
+
+    /* cancellable operation here... */
+
+    g_cancellable_disconnect (cancellable, id);
+
+    /* cancelled_handler is never called after this, it
+     * is now safe to free the data */
+    my_data_free (my_data);  
+
+

+

+

+Note that the cancelled signal is emitted in the thread that +the user cancelled from, which may be the main thread. So, the +cancellable signal should not do something that can block.

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

cancellable :

a GCancellable. +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GCharsetConverter.html b/docs/reference/gio/html/GCharsetConverter.html new file mode 100644 index 0000000..f6058e0 --- /dev/null +++ b/docs/reference/gio/html/GCharsetConverter.html @@ -0,0 +1,267 @@ + + + + +GCharsetConverter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GCharsetConverter

+

GCharsetConverter — Convert between charsets

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GCharsetConverter;
+GCharsetConverter * g_charset_converter_new             (const gchar *to_charset,
+                                                         const gchar *from_charset,
+                                                         GError **error);
+void                g_charset_converter_set_use_fallback
+                                                        (GCharsetConverter *converter,
+                                                         gboolean use_fallback);
+gboolean            g_charset_converter_get_use_fallback
+                                                        (GCharsetConverter *converter);
+guint               g_charset_converter_get_num_fallbacks
+                                                        (GCharsetConverter *converter);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GCharsetConverter
+
+
+
+

Implemented Interfaces

+

+GCharsetConverter implements + GConverter and GInitable.

+
+
+

Properties

+
+  "from-charset"             gchar*                : Read / Write / Construct Only
+  "to-charset"               gchar*                : Read / Write / Construct Only
+  "use-fallback"             gboolean              : Read / Write / Construct
+
+
+
+

Description

+

+GCharsetConverter is an implementation of GConverter based on +GIConv.

+
+
+

Details

+
+

GCharsetConverter

+
typedef struct _GCharsetConverter GCharsetConverter;
+

+Conversions between character sets.

+
+
+
+

g_charset_converter_new ()

+
GCharsetConverter * g_charset_converter_new             (const gchar *to_charset,
+                                                         const gchar *from_charset,
+                                                         GError **error);
+

+Creates a new GCharsetConverter.

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

to_charset :

destination charset +

from_charset :

source charset +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a new GCharsetConverter or NULL on error. + +
+

Since 2.24

+
+
+
+

g_charset_converter_set_use_fallback ()

+
void                g_charset_converter_set_use_fallback
+                                                        (GCharsetConverter *converter,
+                                                         gboolean use_fallback);
+

+Sets the "use-fallback" property.

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

converter :

a GCharsetConverter +

use_fallback :

TRUE to use fallbacks +
+

Since 2.24

+
+
+
+

g_charset_converter_get_use_fallback ()

+
gboolean            g_charset_converter_get_use_fallback
+                                                        (GCharsetConverter *converter);
+

+Gets the "use-fallback" property.

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

converter :

a GCharsetConverter +

Returns :

TRUE if fallbacks are used by converter + +
+

Since 2.24

+
+
+
+

g_charset_converter_get_num_fallbacks ()

+
guint               g_charset_converter_get_num_fallbacks
+                                                        (GCharsetConverter *converter);
+

+Gets the number of fallbacks that converter has applied so far.

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

converter :

a GCharsetConverter +

Returns :

the number of fallbacks that converter has applied + +
+

Since 2.24

+
+
+
+

Property Details

+
+

The "from-charset" property

+
  "from-charset"             gchar*                : Read / Write / Construct Only
+

The character encoding to convert from.

+

Default value: NULL

+
+
+
+

The "to-charset" property

+
  "to-charset"               gchar*                : Read / Write / Construct Only
+

The character encoding to convert to.

+

Default value: NULL

+
+
+
+

The "use-fallback" property

+
  "use-fallback"             gboolean              : Read / Write / Construct
+

Use fallback (of form \<hexval>) for invalid bytes.

+

Default value: FALSE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GConverter.html b/docs/reference/gio/html/GConverter.html new file mode 100644 index 0000000..3f381d8 --- /dev/null +++ b/docs/reference/gio/html/GConverter.html @@ -0,0 +1,412 @@ + + + + +GConverter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GConverter

+

GConverter — Data conversion interface

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GConverter;
+                    GConverterIface;
+enum                GConverterResult;
+GConverterResult    g_converter_convert                 (GConverter *converter,
+                                                         const void *inbuf,
+                                                         gsize inbuf_size,
+                                                         void *outbuf,
+                                                         gsize outbuf_size,
+                                                         GConverterFlags flags,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+void                g_converter_reset                   (GConverter *converter);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GConverter
+
+
+
+

Prerequisites

+

+GConverter requires + GObject.

+
+
+

Known Implementations

+

+GConverter is implemented by + GZlibCompressor, GCharsetConverter and GZlibDecompressor.

+
+
+

Description

+

+GConverter is implemented by objects that convert +binary data in various ways. The conversion can be +stateful and may fail at any place. +

+

+Some example conversions are: character set conversion, +compression, decompression and regular expression +replace.

+
+
+

Details

+
+

GConverter

+
typedef struct _GConverter GConverter;
+

+Seek object for streaming operations.

+

Since 2.24

+
+
+
+

GConverterIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  GConverterResult (* convert) (GConverter *converter,
+				const void *inbuf,
+				gsize       inbuf_size,
+				void       *outbuf,
+				gsize       outbuf_size,
+				GConverterFlags flags,
+				gsize      *bytes_read,
+				gsize      *bytes_written,
+				GError    **error);
+  void  (* reset)   (GConverter *converter);
+} GConverterIface;
+
+

+Provides an interface for converting data from one type +to another type. The conversion can be stateful +and may fail at any place.

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

GTypeInterface g_iface;

The parent interface. +

convert ()

Converts data. +

reset ()

Reverts the internal state of the converter to its initial state. +
+

Since 2.24

+
+
+
+

enum GConverterResult

+
typedef enum {
+  G_CONVERTER_ERROR     = 0,  /*< nick=error >*/
+  G_CONVERTER_CONVERTED = 1,  /*< nick=converted >*/
+  G_CONVERTER_FINISHED  = 2,  /*< nick=finished >*/
+  G_CONVERTER_FLUSHED   = 3   /*< nick=flushed >*/
+} GConverterResult;
+
+

+Results returned from g_converter_convert().

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

G_CONVERTER_ERROR

There was an error during conversion. +

G_CONVERTER_CONVERTED

Some data was consumed or produced +

G_CONVERTER_FINISHED

The conversion is finished +

G_CONVERTER_FLUSHED

Flushing is finished +
+

Since 2.24

+
+
+
+

g_converter_convert ()

+
GConverterResult    g_converter_convert                 (GConverter *converter,
+                                                         const void *inbuf,
+                                                         gsize inbuf_size,
+                                                         void *outbuf,
+                                                         gsize outbuf_size,
+                                                         GConverterFlags flags,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+This is the main operation used when converting data. It is to be called +multiple times in a loop, and each time it will do some work, i.e. +producing some output (in outbuf) or consuming some input (from inbuf) or +both. If its not possible to do any work an error is returned. +

+

+Note that a single call may not consume all input (or any input at all). +Also a call may produce output even if given no input, due to state stored +in the converter producing output. +

+

+If any data was either produced or consumed, and then an error happens, then +only the successful conversion is reported and the error is returned on the +next call. +

+

+A full conversion loop involves calling this method repeatedly, each time +giving it new input and space output space. When there is no more input +data after the data in inbuf, the flag G_CONVERTER_INPUT_AT_END must be set. +The loop will be (unless some error happens) returning G_CONVERTER_CONVERTED +each time until all data is consumed and all output is produced, then +G_CONVERTER_FINISHED is returned instead. Note, that G_CONVERTER_FINISHED +may be returned even if G_CONVERTER_INPUT_AT_END is not set, for instance +in a decompression converter where the end of data is detectable from the +data (and there might even be other data after the end of the compressed data). +

+

+When some data has successfully been converted bytes_read and is set to +the number of bytes read from inbuf, and bytes_written is set to indicate +how many bytes was written to outbuf. If there are more data to output +or consume (i.e. unless the G_CONVERTER_INPUT_AT_END is specified) then +G_CONVERTER_CONVERTED is returned, and if no more data is to be output +then G_CONVERTER_FINISHED is returned. +

+

+On error G_CONVERTER_ERROR is returned and error is set accordingly. +Some errors need special handling: +

+

+G_IO_ERROR_NO_SPACE is returned if there is not enough space +to write the resulting converted data, the application should +call the function again with a larger outbuf to continue. +

+

+G_IO_ERROR_PARTIAL_INPUT is returned if there is not enough +input to fully determine what the conversion should produce, +and the G_CONVERTER_INPUT_AT_END flag is not set. This happens for +example with an incomplete multibyte sequence when converting text, +or when a regexp matches up to the end of the input (and may match +further input). It may also happen when inbuf_size is zero and +there is no more data to produce. +

+

+When this happens the application should read more input and then +call the function again. If further input shows that there is no +more data call the function again with the same data but with +the G_CONVERTER_INPUT_AT_END flag set. This may cause the conversion +to finish as e.g. in the regexp match case (or, to fail again with +G_IO_ERROR_PARTIAL_INPUT in e.g. a charset conversion where the +input is actually partial). +

+

+After g_converter_convert() has returned G_CONVERTER_FINISHED the +converter object is in an invalid state where its not allowed +to call g_converter_convert() anymore. At this time you can only +free the object or call g_converter_reset() to reset it to the +initial state. +

+

+If the flag G_CONVERTER_FLUSH is set then conversion is modified +to try to write out all internal state to the output. The application +has to call the function multiple times with the flag set, and when +the availible input has been consumed and all internal state has +been produced then G_CONVERTER_FLUSHED (or G_CONVERTER_FINISHED if +really at the end) is returned instead of G_CONVERTER_CONVERTED. +This is somewhat similar to what happens at the end of the input stream, +but done in the middle of the data. +

+

+This has different meanings for different conversions. For instance +in a compression converter it would mean that we flush all the +compression state into output such that if you uncompress the +compressed data you get back all the input data. Doing this may +make the final file larger due to padding though. Another example +is a regexp conversion, where if you at the end of the flushed data +have a match, but there is also a potential longer match. In the +non-flushed case we would ask for more input, but when flushing we +treat this as the end of input and do the match. +

+

+Flushing is not always possible (like if a charset converter flushes +at a partial multibyte sequence). Converters are supposed to try +to produce as much output as possible and then return an error +(typically G_IO_ERROR_PARTIAL_INPUT).

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

converter :

a GConverter. +

inbuf :

the buffer containing the data to convert. +

inbuf_size :

the number of bytes in inbuf +

outbuf :

a buffer to write converted data in. +

outbuf_size :

the number of bytes in outbuf, must be at least one +

flags :

a GConvertFlags controlling the conversion details +

bytes_read :

will be set to the number of bytes read from inbuf on success +

bytes_written :

will be set to the number of bytes written to outbuf on success +

error :

location to store the error occuring, or NULL to ignore +

Returns :

a GConverterResult, G_CONVERTER_ERROR on error. + +
+

Since 2.24

+
+
+
+

g_converter_reset ()

+
void                g_converter_reset                   (GConverter *converter);
+

+Resets all internal state in the converter, making it behave +as if it was just created. If the converter has any internal +state that would produce output then that output is lost.

+
++ + + + +

converter :

a GConverter. +
+

Since 2.24

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GDataInputStream.html b/docs/reference/gio/html/GDataInputStream.html new file mode 100644 index 0000000..b2462ed --- /dev/null +++ b/docs/reference/gio/html/GDataInputStream.html @@ -0,0 +1,990 @@ + + + + +GDataInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GDataInputStream

+

GDataInputStream — Data Input Stream

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GDataInputStream;
+enum                GDataStreamByteOrder;
+enum                GDataStreamNewlineType;
+GDataInputStream *  g_data_input_stream_new             (GInputStream *base_stream);
+void                g_data_input_stream_set_byte_order  (GDataInputStream *stream,
+                                                         GDataStreamByteOrder order);
+GDataStreamByteOrder  g_data_input_stream_get_byte_order
+                                                        (GDataInputStream *stream);
+void                g_data_input_stream_set_newline_type
+                                                        (GDataInputStream *stream,
+                                                         GDataStreamNewlineType type);
+GDataStreamNewlineType  g_data_input_stream_get_newline_type
+                                                        (GDataInputStream *stream);
+guchar              g_data_input_stream_read_byte       (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gint16              g_data_input_stream_read_int16      (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+guint16             g_data_input_stream_read_uint16     (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gint32              g_data_input_stream_read_int32      (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+guint32             g_data_input_stream_read_uint32     (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gint64              g_data_input_stream_read_int64      (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+guint64             g_data_input_stream_read_uint64     (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+char *              g_data_input_stream_read_line       (GDataInputStream *stream,
+                                                         gsize *length,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_data_input_stream_read_line_async (GDataInputStream *stream,
+                                                         gint io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+char *              g_data_input_stream_read_line_finish
+                                                        (GDataInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         gsize *length,
+                                                         GError **error);
+char *              g_data_input_stream_read_until      (GDataInputStream *stream,
+                                                         const gchar *stop_chars,
+                                                         gsize *length,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_data_input_stream_read_until_async
+                                                        (GDataInputStream *stream,
+                                                         const gchar *stop_chars,
+                                                         gint io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+char *              g_data_input_stream_read_until_finish
+                                                        (GDataInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         gsize *length,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GFilterInputStream
+               +----GBufferedInputStream
+                     +----GDataInputStream
+
+
+
+

Properties

+
+  "byte-order"               GDataStreamByteOrder  : Read / Write
+  "newline-type"             GDataStreamNewlineType  : Read / Write
+
+
+
+

Description

+

+Data input stream implements GInputStream and includes functions for +reading structured data directly from a binary input stream.

+
+
+

Details

+
+

GDataInputStream

+
typedef struct _GDataInputStream GDataInputStream;
+

+An implementation of GBufferedInputStream that allows for high-level +data manipulation of arbitrary data (including binary operations).

+
++ +
+
+
+
+

enum GDataStreamByteOrder

+
typedef enum {
+  G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN,
+  G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN,
+  G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN
+} GDataStreamByteOrder;
+
+

+GDataStreamByteOrder is used to ensure proper endianness of streaming data sources +across various machine architectures.

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

G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN

Selects Big Endian byte order. +

G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN

Selects Little Endian byte order. +

G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN

Selects endianness based on host machine's architecture. +
+
+
+
+

enum GDataStreamNewlineType

+
typedef enum {
+  G_DATA_STREAM_NEWLINE_TYPE_LF,
+  G_DATA_STREAM_NEWLINE_TYPE_CR,
+  G_DATA_STREAM_NEWLINE_TYPE_CR_LF,
+  G_DATA_STREAM_NEWLINE_TYPE_ANY
+} GDataStreamNewlineType;
+
+

+GDataStreamNewlineType is used when checking for or setting the line endings for a given file.

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

G_DATA_STREAM_NEWLINE_TYPE_LF

Selects "LF" line endings, common on most modern UNIX platforms. +

G_DATA_STREAM_NEWLINE_TYPE_CR

Selects "CR" line endings. +

G_DATA_STREAM_NEWLINE_TYPE_CR_LF

Selects "CR, LF" line ending, common on Microsoft Windows. +

G_DATA_STREAM_NEWLINE_TYPE_ANY

Automatically try to handle any line ending type. +
+
+
+
+

g_data_input_stream_new ()

+
GDataInputStream *  g_data_input_stream_new             (GInputStream *base_stream);
+

+Creates a new data input stream for the base_stream.

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

base_stream :

a GInputStream. +

Returns :

a new GDataInputStream. +
+
+
+
+

g_data_input_stream_set_byte_order ()

+
void                g_data_input_stream_set_byte_order  (GDataInputStream *stream,
+                                                         GDataStreamByteOrder order);
+

+This function sets the byte order for the given stream. All subsequent +reads from the stream will be read in the given order.

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

stream :

a given GDataInputStream. +

order :

a GDataStreamByteOrder to set. +
+
+
+
+

g_data_input_stream_get_byte_order ()

+
GDataStreamByteOrder  g_data_input_stream_get_byte_order
+                                                        (GDataInputStream *stream);
+

+Gets the byte order for the data input stream.

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

stream :

a given GDataInputStream. +

Returns :

the stream's current GDataStreamByteOrder. +
+
+
+
+

g_data_input_stream_set_newline_type ()

+
void                g_data_input_stream_set_newline_type
+                                                        (GDataInputStream *stream,
+                                                         GDataStreamNewlineType type);
+

+Sets the newline type for the stream. +

+

+Note that using G_DATA_STREAM_NEWLINE_TYPE_ANY is slightly unsafe. If a read +chunk ends in "CR" we must read an additional byte to know if this is "CR" or +"CR LF", and this might block if there is no more data availible.

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

stream :

a GDataInputStream. +

type :

the type of new line return as GDataStreamNewlineType. +
+
+
+
+

g_data_input_stream_get_newline_type ()

+
GDataStreamNewlineType  g_data_input_stream_get_newline_type
+                                                        (GDataInputStream *stream);
+

+Gets the current newline type for the stream.

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

stream :

a given GDataInputStream. +

Returns :

GDataStreamNewlineType for the given stream. +
+
+
+
+

g_data_input_stream_read_byte ()

+
guchar              g_data_input_stream_read_byte       (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads an unsigned 8-bit/1-byte value from stream.

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

an unsigned 8-bit/1-byte value read from the stream or 0 +if an error occurred. +
+
+
+
+

g_data_input_stream_read_int16 ()

+
gint16              g_data_input_stream_read_int16      (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads a 16-bit/2-byte value from stream. +

+

+In order to get the correct byte order for this read operation, +see g_data_stream_get_byte_order() and g_data_stream_set_byte_order().

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

a signed 16-bit/2-byte value read from stream or 0 if +an error occurred. +
+
+
+
+

g_data_input_stream_read_uint16 ()

+
guint16             g_data_input_stream_read_uint16     (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads an unsigned 16-bit/2-byte value from stream. +

+

+In order to get the correct byte order for this read operation, +see g_data_stream_get_byte_order() and g_data_stream_set_byte_order().

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

an unsigned 16-bit/2-byte value read from the stream or 0 if +an error occurred. +
+
+
+
+

g_data_input_stream_read_int32 ()

+
gint32              g_data_input_stream_read_int32      (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads a signed 32-bit/4-byte value from stream. +

+

+In order to get the correct byte order for this read operation, +see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

a signed 32-bit/4-byte value read from the stream or 0 if +an error occurred. +
+
+
+
+

g_data_input_stream_read_uint32 ()

+
guint32             g_data_input_stream_read_uint32     (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads an unsigned 32-bit/4-byte value from stream. +

+

+In order to get the correct byte order for this read operation, +see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

an unsigned 32-bit/4-byte value read from the stream or 0 if +an error occurred. +
+
+
+
+

g_data_input_stream_read_int64 ()

+
gint64              g_data_input_stream_read_int64      (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads a 64-bit/8-byte value from stream. +

+

+In order to get the correct byte order for this read operation, +see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

a signed 64-bit/8-byte value read from stream or 0 if +an error occurred. +
+
+
+
+

g_data_input_stream_read_uint64 ()

+
guint64             g_data_input_stream_read_uint64     (GDataInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads an unsigned 64-bit/8-byte value from stream. +

+

+In order to get the correct byte order for this read operation, +see g_data_stream_get_byte_order(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

stream :

a given GDataInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

an unsigned 64-bit/8-byte read from stream or 0 if +an error occurred. +
+
+
+
+

g_data_input_stream_read_line ()

+
char *              g_data_input_stream_read_line       (GDataInputStream *stream,
+                                                         gsize *length,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads a line from the data input stream. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

stream :

a given GDataInputStream. +

length :

a gsize to get the length of the data read in. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

a string with the line that was read in (without the newlines). + Set length to a gsize to get the length of the read line. + On an error, it will return NULL and error will be set. If there's no + content to read, it will still return NULL, but error won't be set. +
+
+
+
+

g_data_input_stream_read_line_async ()

+
void                g_data_input_stream_read_line_async (GDataInputStream *stream,
+                                                         gint io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+The asynchronous version of g_data_input_stream_read_line(). It is +an error to have two outstanding calls to this function. +

+

+When the operation is finished, callback will be called. You +can then call g_data_input_stream_read_line_finish() to get +the result of the operation.

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

stream :

a given GDataInputStream. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied. +

user_data :

the data to pass to callback function. +
+

Since 2.20

+
+
+
+

g_data_input_stream_read_line_finish ()

+
char *              g_data_input_stream_read_line_finish
+                                                        (GDataInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         gsize *length,
+                                                         GError **error);
+

+Finish an asynchronous call started by +g_data_input_stream_read_line_async().

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

stream :

a given GDataInputStream. +

result :

the GAsyncResult that was provided to the callback. +

length :

a gsize to get the length of the data read in. +

error :

GError for error reporting. +

Returns :

a string with the line that was read in (without the newlines). + Set length to a gsize to get the length of the read line. + On an error, it will return NULL and error will be set. If there's no + content to read, it will still return NULL, but error won't be set. + +
+

Since 2.20

+
+
+
+

g_data_input_stream_read_until ()

+
char *              g_data_input_stream_read_until      (GDataInputStream *stream,
+                                                         const gchar *stop_chars,
+                                                         gsize *length,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Reads a string from the data input stream, up to the first +occurrence of any of the stop characters. +

+

+Note that, in contrast to g_data_input_stream_read_until_async(), +this function consumes the stop character that it finds.

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

stream :

a given GDataInputStream. +

stop_chars :

characters to terminate the read. +

length :

a gsize to get the length of the data read in. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

a string with the data that was read before encountering + any of the stop characters. Set length to a gsize to get the length + of the string. This function will return NULL on an error. +
+
+
+
+

g_data_input_stream_read_until_async ()

+
void                g_data_input_stream_read_until_async
+                                                        (GDataInputStream *stream,
+                                                         const gchar *stop_chars,
+                                                         gint io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+The asynchronous version of g_data_input_stream_read_until(). +It is an error to have two outstanding calls to this function. +

+

+Note that, in contrast to g_data_input_stream_read_until(), +this function does not consume the stop character that it finds. You +must read it for yourself. +

+

+When the operation is finished, callback will be called. You +can then call g_data_input_stream_read_until_finish() to get +the result of the operation.

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

stream :

a given GDataInputStream. +

stop_chars :

characters to terminate the read. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied. +

user_data :

the data to pass to callback function. +
+

Since 2.20

+
+
+
+

g_data_input_stream_read_until_finish ()

+
char *              g_data_input_stream_read_until_finish
+                                                        (GDataInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         gsize *length,
+                                                         GError **error);
+

+Finish an asynchronous call started by +g_data_input_stream_read_until_async().

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

stream :

a given GDataInputStream. +

result :

the GAsyncResult that was provided to the callback. +

length :

a gsize to get the length of the data read in. +

error :

GError for error reporting. +

Returns :

a string with the data that was read before encountering + any of the stop characters. Set length to a gsize to get the length + of the string. This function will return NULL on an error. +
+

Since 2.20

+
+
+
+

Property Details

+
+

The "byte-order" property

+
  "byte-order"               GDataStreamByteOrder  : Read / Write
+

The byte order.

+

Default value: G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN

+
+
+
+

The "newline-type" property

+
  "newline-type"             GDataStreamNewlineType  : Read / Write
+

The accepted types of line ending.

+

Default value: G_DATA_STREAM_NEWLINE_TYPE_LF

+
+
+
+

See Also

+GInputStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GDataOutputStream.html b/docs/reference/gio/html/GDataOutputStream.html new file mode 100644 index 0000000..52ea6c6 --- /dev/null +++ b/docs/reference/gio/html/GDataOutputStream.html @@ -0,0 +1,560 @@ + + + + +GDataOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GDataOutputStream

+

GDataOutputStream — Data Output Stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GFilterOutputStream
+               +----GDataOutputStream
+
+
+
+

Properties

+
+  "byte-order"               GDataStreamByteOrder  : Read / Write
+
+
+
+

Description

+

+Data output stream implements GOutputStream and includes functions for +writing data directly to an output stream.

+
+
+

Details

+
+

GDataOutputStream

+
typedef struct _GDataOutputStream GDataOutputStream;
+

+An implementation of GBufferedOutputStream that allows for high-level +data manipulation of arbitrary data (including binary operations).

+
++ +
+
+
+
+

g_data_output_stream_new ()

+
GDataOutputStream * g_data_output_stream_new            (GOutputStream *base_stream);
+

+Creates a new data output stream for base_stream.

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

base_stream :

a GOutputStream. +

Returns :

GDataOutputStream. +
+
+
+
+

g_data_output_stream_set_byte_order ()

+
void                g_data_output_stream_set_byte_order (GDataOutputStream *stream,
+                                                         GDataStreamByteOrder order);
+

+Sets the byte order of the data output stream to order.

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

stream :

a GDataOutputStream. +

order :

a GDataStreamByteOrder. +
+
+
+
+

g_data_output_stream_get_byte_order ()

+
GDataStreamByteOrder  g_data_output_stream_get_byte_order
+                                                        (GDataOutputStream *stream);
+

+Gets the byte order for the stream.

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

stream :

a GDataOutputStream. +

Returns :

the GDataStreamByteOrder for the stream. +
+
+
+
+

g_data_output_stream_put_byte ()

+
gboolean            g_data_output_stream_put_byte       (GDataOutputStream *stream,
+                                                         guchar data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts a byte into the output stream.

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

stream :

a GDataOutputStream. +

data :

a guchar. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_int16 ()

+
gboolean            g_data_output_stream_put_int16      (GDataOutputStream *stream,
+                                                         gint16 data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts a signed 16-bit integer into the output stream.

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

stream :

a GDataOutputStream. +

data :

a gint16. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_uint16 ()

+
gboolean            g_data_output_stream_put_uint16     (GDataOutputStream *stream,
+                                                         guint16 data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts an unsigned 16-bit integer into the output stream.

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

stream :

a GDataOutputStream. +

data :

a guint16. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_int32 ()

+
gboolean            g_data_output_stream_put_int32      (GDataOutputStream *stream,
+                                                         gint32 data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts a signed 32-bit integer into the output stream.

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

stream :

a GDataOutputStream. +

data :

a gint32. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_uint32 ()

+
gboolean            g_data_output_stream_put_uint32     (GDataOutputStream *stream,
+                                                         guint32 data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts an unsigned 32-bit integer into the stream.

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

stream :

a GDataOutputStream. +

data :

a guint32. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_int64 ()

+
gboolean            g_data_output_stream_put_int64      (GDataOutputStream *stream,
+                                                         gint64 data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts a signed 64-bit integer into the stream.

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

stream :

a GDataOutputStream. +

data :

a gint64. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_uint64 ()

+
gboolean            g_data_output_stream_put_uint64     (GDataOutputStream *stream,
+                                                         guint64 data,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts an unsigned 64-bit integer into the stream.

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

stream :

a GDataOutputStream. +

data :

a guint64. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if data was successfully added to the stream. +
+
+
+
+

g_data_output_stream_put_string ()

+
gboolean            g_data_output_stream_put_string     (GDataOutputStream *stream,
+                                                         const char *str,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Puts a string into the output stream.

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

stream :

a GDataOutputStream. +

str :

a string. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if string was successfully added to the stream. +
+
+
+
+

Property Details

+
+

The "byte-order" property

+
  "byte-order"               GDataStreamByteOrder  : Read / Write
+

+Determines the byte ordering that is used when writing +multi-byte entities (such as integers) to the stream.

+

Default value: G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN

+
+
+
+

See Also

+GOutputStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GDrive.html b/docs/reference/gio/html/GDrive.html new file mode 100644 index 0000000..3e8b8f6 --- /dev/null +++ b/docs/reference/gio/html/GDrive.html @@ -0,0 +1,1412 @@ + + + + +GDrive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GDrive

+

GDrive — Drive management

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GDrive;
+                    GDriveIface;
+enum                GDriveStartFlags;
+enum                GDriveStartStopType;
+char *              g_drive_get_name                    (GDrive *drive);
+GIcon *             g_drive_get_icon                    (GDrive *drive);
+gboolean            g_drive_has_volumes                 (GDrive *drive);
+GList *             g_drive_get_volumes                 (GDrive *drive);
+gboolean            g_drive_can_eject                   (GDrive *drive);
+GDriveStartStopType  g_drive_get_start_stop_type        (GDrive *drive);
+gboolean            g_drive_can_start                   (GDrive *drive);
+gboolean            g_drive_can_start_degraded          (GDrive *drive);
+gboolean            g_drive_can_stop                    (GDrive *drive);
+gboolean            g_drive_can_poll_for_media          (GDrive *drive);
+void                g_drive_poll_for_media              (GDrive *drive,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_drive_poll_for_media_finish       (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_drive_has_media                   (GDrive *drive);
+gboolean            g_drive_is_media_check_automatic    (GDrive *drive);
+gboolean            g_drive_is_media_removable          (GDrive *drive);
+void                g_drive_eject                       (GDrive *drive,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_drive_eject_finish                (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_drive_eject_with_operation        (GDrive *drive,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_drive_eject_with_operation_finish (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_drive_start                       (GDrive *drive,
+                                                         GDriveStartFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_drive_start_finish                (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_drive_stop                        (GDrive *drive,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_drive_stop_finish                 (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+char **             g_drive_enumerate_identifiers       (GDrive *drive);
+char *              g_drive_get_identifier              (GDrive *drive,
+                                                         const char *kind);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GDrive
+
+
+
+

Prerequisites

+

+GDrive requires + GObject.

+
+
+

Signals

+
+  "changed"                                        : Run Last
+  "disconnected"                                   : Run Last
+  "eject-button"                                   : Run Last
+  "stop-button"                                    : Run Last
+
+
+
+

Description

+

+GDrive - this represent a piece of hardware connected to the machine. +It's generally only created for removable hardware or hardware with +removable media. +

+

+GDrive is a container class for GVolume objects that stem from +the same piece of media. As such, GDrive abstracts a drive with +(or without) removable media and provides operations for querying +whether media is available, determing whether media change is +automatically detected and ejecting the media. +

+

+If the GDrive reports that media isn't automatically detected, one +can poll for media; typically one should not do this periodically +as a poll for media operation is potententially expensive and may +spin up the drive creating noise. +

+

+GDrive supports starting and stopping drives with authentication +support for the former. This can be used to support a diverse set +of use cases including connecting/disconnecting iSCSI devices, +powering down external disk enclosures and starting/stopping +multi-disk devices such as RAID devices. Note that the actual +semantics and side-effects of starting/stopping a GDrive may vary +according to implementation. To choose the correct verbs in e.g. a +file manager, use g_drive_get_start_stop_type(). +

+

+For porting from GnomeVFS note that there is no equivalent of +GDrive in that API.

+
+
+

Details

+
+

GDrive

+
typedef struct _GDrive GDrive;
+

+Opaque drive object.

+
+
+
+

GDriveIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* signals */
+  void     (* changed)                  (GDrive              *drive);
+  void     (* disconnected)             (GDrive              *drive);
+  void     (* eject_button)             (GDrive              *drive);
+
+  /* Virtual Table */
+  char *   (* get_name)                 (GDrive              *drive);
+  GIcon *  (* get_icon)                 (GDrive              *drive);
+  gboolean (* has_volumes)              (GDrive              *drive);
+  GList *  (* get_volumes)              (GDrive              *drive);
+  gboolean (* is_media_removable)       (GDrive              *drive);
+  gboolean (* has_media)                (GDrive              *drive);
+  gboolean (* is_media_check_automatic) (GDrive              *drive);
+  gboolean (* can_eject)                (GDrive              *drive);
+  gboolean (* can_poll_for_media)       (GDrive              *drive);
+  void     (* eject)                    (GDrive              *drive,
+                                         GMountUnmountFlags   flags,
+                                         GCancellable        *cancellable,
+                                         GAsyncReadyCallback  callback,
+                                         gpointer             user_data);
+  gboolean (* eject_finish)             (GDrive              *drive,
+                                         GAsyncResult        *result,
+                                         GError             **error);
+  void     (* poll_for_media)           (GDrive              *drive,
+                                         GCancellable        *cancellable,
+                                         GAsyncReadyCallback  callback,
+                                         gpointer             user_data);
+  gboolean (* poll_for_media_finish)    (GDrive              *drive,
+                                         GAsyncResult        *result,
+                                         GError             **error);
+
+  char *   (* get_identifier)           (GDrive              *drive,
+                                         const char          *kind);
+  char **  (* enumerate_identifiers)    (GDrive              *drive);
+
+  GDriveStartStopType (* get_start_stop_type) (GDrive        *drive);
+
+  gboolean (* can_start)                (GDrive              *drive);
+  gboolean (* can_start_degraded)       (GDrive              *drive);
+  void     (* start)                    (GDrive              *drive,
+                                         GDriveStartFlags     flags,
+                                         GMountOperation     *mount_operation,
+                                         GCancellable        *cancellable,
+                                         GAsyncReadyCallback  callback,
+                                         gpointer             user_data);
+  gboolean (* start_finish)             (GDrive              *drive,
+                                         GAsyncResult        *result,
+                                         GError             **error);
+
+  gboolean (* can_stop)                 (GDrive              *drive);
+  void     (* stop)                     (GDrive              *drive,
+                                         GMountUnmountFlags   flags,
+                                         GMountOperation     *mount_operation,
+                                         GCancellable        *cancellable,
+                                         GAsyncReadyCallback  callback,
+                                         gpointer             user_data);
+  gboolean (* stop_finish)              (GDrive              *drive,
+                                         GAsyncResult        *result,
+                                         GError             **error);
+  /* signal, not VFunc */
+  void     (* stop_button)              (GDrive              *drive);
+
+  void        (* eject_with_operation)      (GDrive              *drive,
+                                             GMountUnmountFlags   flags,
+                                             GMountOperation     *mount_operation,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* eject_with_operation_finish) (GDrive            *drive,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+} GDriveIface;
+
+

+Interface for creating GDrive implementations.

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

GTypeInterface g_iface;

The parent interface. +

changed ()

Signal emitted when the drive is changed. +

disconnected ()

The removed signal that is emitted when the GDrive have been disconnected. If the recipient is holding references to the object they should release them so the object can be finalized. +

eject_button ()

Signal emitted when the physical eject button (if any) of a drive have been pressed. +

get_name ()

Returns the name for the given GDrive. +

get_icon ()

Returns a GIcon for the given GDrive. +

has_volumes ()

Returns TRUE if the GDrive has mountable volumes. +

get_volumes ()

Returns a list GList of GVolume for the GDrive. +

is_media_removable ()

Returns TRUE if the GDrive supports removal and insertion of media. +

has_media ()

Returns TRUE if the GDrive has media inserted. +

is_media_check_automatic ()

Returns TRUE if the GDrive is capabable of automatically detecting media changes. +

can_eject ()

Returns TRUE if the GDrive can eject media. +

can_poll_for_media ()

Returns TRUE if the GDrive is capable of manually polling for media change. +

eject ()

Ejects a GDrive. +

eject_finish ()

Finishes an eject operation. +

poll_for_media ()

Poll for media insertion/removal on a GDrive. +

poll_for_media_finish ()

Finishes a media poll operation. +

get_identifier ()

Returns the identifier of the given kind, or NULL if + the GDrive doesn't have one. +

enumerate_identifiers ()

Returns an array strings listing the kinds + of identifiers which the GDrive has. +

get_start_stop_type ()

Gets a GDriveStartStopType with details about starting/stopping the drive. Since 2.22. +

can_start ()

Returns TRUE if a GDrive can be started. Since 2.22. +

can_start_degraded ()

Returns TRUE if a GDrive can be started degraded. Since 2.22. +

start ()

Starts a GDrive. Since 2.22. +

start_finish ()

Finishes a start operation. Since 2.22. +

can_stop ()

Returns TRUE if a GDrive can be stopped. Since 2.22. +

stop ()

Stops a GDrive. Since 2.22. +

stop_finish ()

Finishes a stop operation. Since 2.22. +

stop_button ()

Signal emitted when the physical stop button (if any) of a drive have been pressed. Since 2.22. +

eject_with_operation ()

Starts ejecting a GDrive using a GMountOperation. Since 2.22. +

eject_with_operation_finish ()

Finishes an eject operation using a GMountOperation. Since 2.22. +
+
+
+
+

enum GDriveStartFlags

+
typedef enum {
+  G_DRIVE_START_NONE = 0
+} GDriveStartFlags;
+
+

+Flags used when starting a drive.

+
++ + + + +

G_DRIVE_START_NONE

No flags set. +
+

Since 2.22

+
+
+
+

enum GDriveStartStopType

+
typedef enum {
+  G_DRIVE_START_STOP_TYPE_UNKNOWN,
+  G_DRIVE_START_STOP_TYPE_SHUTDOWN,
+  G_DRIVE_START_STOP_TYPE_NETWORK,
+  G_DRIVE_START_STOP_TYPE_MULTIDISK,
+  G_DRIVE_START_STOP_TYPE_PASSWORD
+} GDriveStartStopType;
+
+

+Enumeration describing how a drive can be started/stopped.

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

G_DRIVE_START_STOP_TYPE_UNKNOWN

Unknown or drive doesn't support + start/stop. +

G_DRIVE_START_STOP_TYPE_SHUTDOWN

The stop method will physically + shut down the drive and e.g. power down the port the drive is + attached to. +

G_DRIVE_START_STOP_TYPE_NETWORK

The start/stop methods are used + for connecting/disconnect to the drive over the network. +

G_DRIVE_START_STOP_TYPE_MULTIDISK

The start/stop methods will + assemble/disassemble a virtual drive from several physical + drives. +

G_DRIVE_START_STOP_TYPE_PASSWORD

The start/stop methods will + unlock/lock the disk (for example using the ATA “SECURITY + UNLOCK DEVICE” command) +
+

Since 2.22

+
+
+
+

g_drive_get_name ()

+
char *              g_drive_get_name                    (GDrive *drive);
+

+Gets the name of drive.

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

drive :

a GDrive. +

Returns :

a string containing drive's name. The returned + string should be freed when no longer needed. +
+
+
+
+

g_drive_get_icon ()

+
GIcon *             g_drive_get_icon                    (GDrive *drive);
+

+Gets the icon for drive.

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

drive :

a GDrive. +

Returns :

GIcon for the drive. + Free the returned object with g_object_unref(). +
+
+
+
+

g_drive_has_volumes ()

+
gboolean            g_drive_has_volumes                 (GDrive *drive);
+

+Check if drive has any mountable volumes.

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

drive :

a GDrive. +

Returns :

TRUE if the drive contains volumes, FALSE otherwise. +
+
+
+
+

g_drive_get_volumes ()

+
GList *             g_drive_get_volumes                 (GDrive *drive);
+

+Get a list of mountable volumes for drive. +

+

+The returned list should be freed with g_list_free(), after +its elements have been unreffed with g_object_unref().

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

drive :

a GDrive. +

Returns :

GList containing any GVolume objects on the given drive. +
+
+
+
+

g_drive_can_eject ()

+
gboolean            g_drive_can_eject                   (GDrive *drive);
+

+Checks if a drive can be ejected.

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

drive :

a GDrive. +

Returns :

TRUE if the drive can be ejected, FALSE otherwise. +
+
+
+
+

g_drive_get_start_stop_type ()

+
GDriveStartStopType  g_drive_get_start_stop_type        (GDrive *drive);
+

+Gets a hint about how a drive can be started/stopped.

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

drive :

a GDrive. +

Returns :

A value from the GDriveStartStopType enumeration. + +
+

Since 2.22

+
+
+
+

g_drive_can_start ()

+
gboolean            g_drive_can_start                   (GDrive *drive);
+

+Checks if a drive can be started.

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

drive :

a GDrive. +

Returns :

TRUE if the drive can be started, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_drive_can_start_degraded ()

+
gboolean            g_drive_can_start_degraded          (GDrive *drive);
+

+Checks if a drive can be started degraded.

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

drive :

a GDrive. +

Returns :

TRUE if the drive can be started degraded, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_drive_can_stop ()

+
gboolean            g_drive_can_stop                    (GDrive *drive);
+

+Checks if a drive can be stopped.

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

drive :

a GDrive. +

Returns :

TRUE if the drive can be stopped, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_drive_can_poll_for_media ()

+
gboolean            g_drive_can_poll_for_media          (GDrive *drive);
+

+Checks if a drive can be polled for media changes.

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

drive :

a GDrive. +

Returns :

TRUE if the drive can be polled for media changes, + FALSE otherwise. +
+
+
+
+

g_drive_poll_for_media ()

+
void                g_drive_poll_for_media              (GDrive *drive,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously polls drive to see if media has been inserted or removed. +

+

+When the operation is finished, callback will be called. +You can then call g_drive_poll_for_media_finish() to obtain the +result of the operation.

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

drive :

a GDrive. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data to pass to callback +
+
+
+
+

g_drive_poll_for_media_finish ()

+
gboolean            g_drive_poll_for_media_finish       (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an operation started with g_drive_poll_for_media() on a drive.

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

drive :

a GDrive. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the drive has been poll_for_mediaed successfully, + FALSE otherwise. +
+
+
+
+

g_drive_has_media ()

+
gboolean            g_drive_has_media                   (GDrive *drive);
+

+Checks if the drive has media. Note that the OS may not be polling +the drive for media changes; see g_drive_is_media_check_automatic() +for more details.

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

drive :

a GDrive. +

Returns :

TRUE if drive has media, FALSE otherwise. +
+
+
+
+

g_drive_is_media_check_automatic ()

+
gboolean            g_drive_is_media_check_automatic    (GDrive *drive);
+

+Checks if drive is capabable of automatically detecting media changes.

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

drive :

a GDrive. +

Returns :

TRUE if the drive is capabable of automatically detecting + media changes, FALSE otherwise. +
+
+
+
+

g_drive_is_media_removable ()

+
gboolean            g_drive_is_media_removable          (GDrive *drive);
+

+Checks if the drive supports removable media.

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

drive :

a GDrive. +

Returns :

TRUE if drive supports removable media, FALSE otherwise. +
+
+
+
+

g_drive_eject ()

+
void                g_drive_eject                       (GDrive *drive,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+

Warning

+

g_drive_eject has been deprecated since version 2.22 and should not be used in newly-written code. Use g_drive_eject_with_operation() instead.

+
+

+Asynchronously ejects a drive. +

+

+When the operation is finished, callback will be called. +You can then call g_drive_eject_finish() to obtain the +result of the operation.

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

drive :

a GDrive. +

flags :

flags affecting the unmount if required for eject +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data to pass to callback +
+
+
+
+

g_drive_eject_finish ()

+
gboolean            g_drive_eject_finish                (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+

Warning

+

g_drive_eject_finish has been deprecated since version 2.22 and should not be used in newly-written code. Use g_drive_eject_with_operation_finish() instead.

+
+

+Finishes ejecting a drive.

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

drive :

a GDrive. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the drive has been ejected successfully, + FALSE otherwise. + +
+
+
+
+

g_drive_eject_with_operation ()

+
void                g_drive_eject_with_operation        (GDrive *drive,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Ejects a drive. This is an asynchronous operation, and is +finished by calling g_drive_eject_with_operation_finish() with the drive +and GAsyncResult data returned in the callback.

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

drive :

a GDrive. +

flags :

flags affecting the unmount if required for eject +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+

Since 2.22

+
+
+
+

g_drive_eject_with_operation_finish ()

+
gboolean            g_drive_eject_with_operation_finish (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes ejecting a drive. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

drive :

a GDrive. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the drive was successfully ejected. FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_drive_start ()

+
void                g_drive_start                       (GDrive *drive,
+                                                         GDriveStartFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously starts a drive. +

+

+When the operation is finished, callback will be called. +You can then call g_drive_start_finish() to obtain the +result of the operation.

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

drive :

a GDrive. +

flags :

flags affecting the start operation. +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data to pass to callback +
+

Since 2.22

+
+
+
+

g_drive_start_finish ()

+
gboolean            g_drive_start_finish                (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes starting a drive.

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

drive :

a GDrive. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the drive has been started successfully, + FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_drive_stop ()

+
void                g_drive_stop                        (GDrive *drive,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously stops a drive. +

+

+When the operation is finished, callback will be called. +You can then call g_drive_stop_finish() to obtain the +result of the operation.

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

drive :

a GDrive. +

flags :

flags affecting the unmount if required for stopping. +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data to pass to callback +
+

Since 2.22

+
+
+
+

g_drive_stop_finish ()

+
gboolean            g_drive_stop_finish                 (GDrive *drive,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes stopping a drive.

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

drive :

a GDrive. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the drive has been stopped successfully, + FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_drive_enumerate_identifiers ()

+
char **             g_drive_enumerate_identifiers       (GDrive *drive);
+

+Gets the kinds of identifiers that drive has. +Use g_drive_get_identifer() to obtain the identifiers +themselves.

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

drive :

a GDrive +

Returns :

a NULL-terminated array of strings containing + kinds of identifiers. Use g_strfreev() to free. +
+
+
+
+

g_drive_get_identifier ()

+
char *              g_drive_get_identifier              (GDrive *drive,
+                                                         const char *kind);
+

+Gets the identifier of the given kind for drive.

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

drive :

a GDrive +

kind :

the kind of identifier to return +

Returns :

a newly allocated string containing the + requested identfier, or NULL if the GDrive + doesn't have this kind of identifier. +
+
+
+
+

Signal Details

+
+

The "changed" signal

+
void                user_function                      (GDrive  *drive,
+                                                        gpointer user_data)      : Run Last
+

+Emitted when the drive's state has changed.

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

drive :

a GDrive. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "disconnected" signal

+
void                user_function                      (GDrive  *drive,
+                                                        gpointer user_data)      : Run Last
+

+This signal is emitted when the GDrive have been +disconnected. If the recipient is holding references to the +object they should release them so the object can be +finalized.

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

drive :

a GDrive. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "eject-button" signal

+
void                user_function                      (GDrive  *drive,
+                                                        gpointer user_data)      : Run Last
+

+Emitted when the physical eject button (if any) of a drive has +been pressed.

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

drive :

a GDrive. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "stop-button" signal

+
void                user_function                      (GDrive  *drive,
+                                                        gpointer user_data)      : Run Last
+

+Emitted when the physical stop button (if any) of a drive has +been pressed.

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

drive :

a GDrive. +

user_data :

user data set when the signal handler was connected.
+

Since 2.22

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GEmblem.html b/docs/reference/gio/html/GEmblem.html new file mode 100644 index 0000000..e9a40c0 --- /dev/null +++ b/docs/reference/gio/html/GEmblem.html @@ -0,0 +1,295 @@ + + + + +GEmblem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GEmblem

+

GEmblem — An object for emblems

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GEmblem;
+enum                GEmblemOrigin;
+GEmblem *           g_emblem_new                        (GIcon *icon);
+GEmblem *           g_emblem_new_with_origin            (GIcon *icon,
+                                                         GEmblemOrigin origin);
+GIcon *             g_emblem_get_icon                   (GEmblem *emblem);
+GEmblemOrigin       g_emblem_get_origin                 (GEmblem *emblem);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GEmblem
+
+
+
+

Implemented Interfaces

+

+GEmblem implements + GIcon.

+
+
+

Properties

+
+  "icon"                     GObject*              : Read / Write / Construct Only
+  "origin"                   GEmblemOrigin         : Read / Write / Construct Only
+
+
+
+

Description

+

+GEmblem is an implementation of GIcon that supports +having an emblem, which is an icon with additional properties. +It can than be added to a GEmblemedIcon. +

+

+Currently, only metainformation about the emblem's origin is +supported. More may be added in the future.

+
+
+

Details

+
+

GEmblem

+
typedef struct _GEmblem GEmblem;
+

+An object for Emblems

+
+
+
+

enum GEmblemOrigin

+
typedef enum  {
+  G_EMBLEM_ORIGIN_UNKNOWN,
+  G_EMBLEM_ORIGIN_DEVICE,
+  G_EMBLEM_ORIGIN_LIVEMETADATA,
+  G_EMBLEM_ORIGIN_TAG
+} GEmblemOrigin;
+
+

+GEmblemOrigin is used to add information about the origin of the emblem +to GEmblem.

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

G_EMBLEM_ORIGIN_UNKNOWN

Emblem of unknown origin +

G_EMBLEM_ORIGIN_DEVICE

Emblem adds device-specific information +

G_EMBLEM_ORIGIN_LIVEMETADATA

Emblem depicts live metadata, such as "readonly" +

G_EMBLEM_ORIGIN_TAG

Emblem comes from a user-defined tag, e.g. set by nautilus (in the future) +
+

Since 2.18

+
+
+
+

g_emblem_new ()

+
GEmblem *           g_emblem_new                        (GIcon *icon);
+

+Creates a new emblem for icon.

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

icon :

a GIcon containing the icon. +

Returns :

a new GEmblem. + +
+

Since 2.18

+
+
+
+

g_emblem_new_with_origin ()

+
GEmblem *           g_emblem_new_with_origin            (GIcon *icon,
+                                                         GEmblemOrigin origin);
+

+Creates a new emblem for icon.

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

icon :

a GIcon containing the icon. +

origin :

a GEmblemOrigin enum defining the emblem's origin +

Returns :

a new GEmblem. + +
+

Since 2.18

+
+
+
+

g_emblem_get_icon ()

+
GIcon *             g_emblem_get_icon                   (GEmblem *emblem);
+

+Gives back the icon from emblem.

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

emblem :

a GEmblem from which the icon should be extracted. +

Returns :

a GIcon. The returned object belongs to the emblem + and should not be modified or freed. + +
+

Since 2.18

+
+
+
+

g_emblem_get_origin ()

+
GEmblemOrigin       g_emblem_get_origin                 (GEmblem *emblem);
+

+Gets the origin of the emblem.

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

emblem :

a GEmblem +

Returns :

the origin of the emblem + +
+

Since 2.18

+
+
+
+

Property Details

+
+

The "icon" property

+
  "icon"                     GObject*              : Read / Write / Construct Only
+

The actual icon of the emblem.

+
+
+
+

The "origin" property

+
  "origin"                   GEmblemOrigin         : Read / Write / Construct Only
+

Tells which origin the emblem is derived from.

+

Default value: G_EMBLEM_ORIGIN_UNKNOWN

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GEmblemedIcon.html b/docs/reference/gio/html/GEmblemedIcon.html new file mode 100644 index 0000000..85c3794 --- /dev/null +++ b/docs/reference/gio/html/GEmblemedIcon.html @@ -0,0 +1,230 @@ + + + + +GEmblemedIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GEmblemedIcon

+

GEmblemedIcon — Icon with emblems

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GEmblemedIcon;
+GIcon *             g_emblemed_icon_new                 (GIcon *icon,
+                                                         GEmblem *emblem);
+GIcon *             g_emblemed_icon_get_icon            (GEmblemedIcon *emblemed);
+GList *             g_emblemed_icon_get_emblems         (GEmblemedIcon *emblemed);
+void                g_emblemed_icon_add_emblem          (GEmblemedIcon *emblemed,
+                                                         GEmblem *emblem);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GEmblemedIcon
+
+
+
+

Implemented Interfaces

+

+GEmblemedIcon implements + GIcon.

+
+
+

Description

+

+GEmblemedIcon is an implementation of GIcon that supports +adding an emblem to an icon. Adding multiple emblems to an +icon is ensured via g_emblemed_icon_add_emblem(). +

+

+Note that GEmblemedIcon allows no control over the position +of the emblems. See also GEmblem for more information.

+
+
+

Details

+
+

GEmblemedIcon

+
typedef struct _GEmblemedIcon GEmblemedIcon;
+

+An implementation of GIcon for icons with emblems.

+
+
+
+

g_emblemed_icon_new ()

+
GIcon *             g_emblemed_icon_new                 (GIcon *icon,
+                                                         GEmblem *emblem);
+

+Creates a new emblemed icon for icon with the emblem emblem.

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

icon :

a GIcon +

emblem :

a GEmblem +

Returns :

a new GIcon + +
+

Since 2.18

+
+
+
+

g_emblemed_icon_get_icon ()

+
GIcon *             g_emblemed_icon_get_icon            (GEmblemedIcon *emblemed);
+

+Gets the main icon for emblemed.

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

emblemed :

a GEmblemedIcon +

Returns :

a GIcon that is owned by emblemed + +
+

Since 2.18

+
+
+
+

g_emblemed_icon_get_emblems ()

+
GList *             g_emblemed_icon_get_emblems         (GEmblemedIcon *emblemed);
+

+Gets the list of emblems for the icon.

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

emblemed :

a GEmblemedIcon +

Returns :

a GList of GEmblem s that is owned by emblemed + +
+

Since 2.18

+
+
+
+

g_emblemed_icon_add_emblem ()

+
void                g_emblemed_icon_add_emblem          (GEmblemedIcon *emblemed,
+                                                         GEmblem *emblem);
+

+Adds emblem to the GList of GEmblem s.

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

emblemed :

a GEmblemedIcon +

emblem :

a GEmblem +
+

Since 2.18

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFile.html b/docs/reference/gio/html/GFile.html new file mode 100644 index 0000000..d3f18eb --- /dev/null +++ b/docs/reference/gio/html/GFile.html @@ -0,0 +1,7337 @@ + + + + +GFile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFile

+

GFile — File and Directory Handling

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFile;
+                    GFileIface;
+enum                GFileQueryInfoFlags;
+enum                GFileCreateFlags;
+enum                GFileCopyFlags;
+enum                GFileMonitorFlags;
+enum                GFilesystemPreviewType;
+void                (*GFileProgressCallback)            (goffset current_num_bytes,
+                                                         goffset total_num_bytes,
+                                                         gpointer user_data);
+gboolean            (*GFileReadMoreCallback)            (const char *file_contents,
+                                                         goffset file_size,
+                                                         gpointer callback_data);
+GFile *             g_file_new_for_path                 (const char *path);
+GFile *             g_file_new_for_uri                  (const char *uri);
+GFile *             g_file_new_for_commandline_arg      (const char *arg);
+GFile *             g_file_parse_name                   (const char *parse_name);
+GFile *             g_file_dup                          (GFile *file);
+guint               g_file_hash                         (gconstpointer file);
+gboolean            g_file_equal                        (GFile *file1,
+                                                         GFile *file2);
+char *              g_file_get_basename                 (GFile *file);
+char *              g_file_get_path                     (GFile *file);
+char *              g_file_get_uri                      (GFile *file);
+char *              g_file_get_parse_name               (GFile *file);
+GFile *             g_file_get_parent                   (GFile *file);
+gboolean            g_file_has_parent                   (GFile *file,
+                                                         GFile *parent);
+GFile *             g_file_get_child                    (GFile *file,
+                                                         const char *name);
+GFile *             g_file_get_child_for_display_name   (GFile *file,
+                                                         const char *display_name,
+                                                         GError **error);
+gboolean            g_file_has_prefix                   (GFile *file,
+                                                         GFile *prefix);
+char *              g_file_get_relative_path            (GFile *parent,
+                                                         GFile *descendant);
+GFile *             g_file_resolve_relative_path        (GFile *file,
+                                                         const char *relative_path);
+gboolean            g_file_is_native                    (GFile *file);
+gboolean            g_file_has_uri_scheme               (GFile *file,
+                                                         const char *uri_scheme);
+char *              g_file_get_uri_scheme               (GFile *file);
+GFileInputStream *  g_file_read                         (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_read_async                   (GFile *file,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileInputStream *  g_file_read_finish                  (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GFileOutputStream * g_file_append_to                    (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileOutputStream * g_file_create                       (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileOutputStream * g_file_replace                      (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_append_to_async              (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileOutputStream * g_file_append_to_finish             (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+void                g_file_create_async                 (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileOutputStream * g_file_create_finish                (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+void                g_file_replace_async                (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileOutputStream * g_file_replace_finish               (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GFileInfo *         g_file_query_info                   (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_query_info_async             (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileInfo *         g_file_query_info_finish            (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+gboolean            g_file_query_exists                 (GFile *file,
+                                                         GCancellable *cancellable);
+GFileType           g_file_query_file_type              (GFile *file,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable);
+GFileInfo *         g_file_query_filesystem_info        (GFile *file,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_query_filesystem_info_async  (GFile *file,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileInfo *         g_file_query_filesystem_info_finish (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GAppInfo *          g_file_query_default_handler        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GMount *            g_file_find_enclosing_mount         (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_find_enclosing_mount_async   (GFile *file,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GMount *            g_file_find_enclosing_mount_finish  (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GFileEnumerator *   g_file_enumerate_children           (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_enumerate_children_async     (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileEnumerator *   g_file_enumerate_children_finish    (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GFile *             g_file_set_display_name             (GFile *file,
+                                                         const char *display_name,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_set_display_name_async       (GFile *file,
+                                                         const char *display_name,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFile *             g_file_set_display_name_finish      (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+gboolean            g_file_delete                       (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_trash                        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_copy                         (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GFileProgressCallback progress_callback,
+                                                         gpointer progress_callback_data,
+                                                         GError **error);
+void                g_file_copy_async                   (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GFileProgressCallback progress_callback,
+                                                         gpointer progress_callback_data,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_copy_finish                  (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+gboolean            g_file_move                         (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GFileProgressCallback progress_callback,
+                                                         gpointer progress_callback_data,
+                                                         GError **error);
+gboolean            g_file_make_directory               (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_make_directory_with_parents  (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_make_symbolic_link           (GFile *file,
+                                                         const char *symlink_value,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileAttributeInfoList * g_file_query_settable_attributes
+                                                        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileAttributeInfoList * g_file_query_writable_namespaces
+                                                        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attribute                (GFile *file,
+                                                         const char *attribute,
+                                                         GFileAttributeType type,
+                                                         gpointer value_p,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attributes_from_info     (GFile *file,
+                                                         GFileInfo *info,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_set_attributes_async         (GFile *file,
+                                                         GFileInfo *info,
+                                                         GFileQueryInfoFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_set_attributes_finish        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GFileInfo **info,
+                                                         GError **error);
+gboolean            g_file_set_attribute_string         (GFile *file,
+                                                         const char *attribute,
+                                                         const char *value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attribute_byte_string    (GFile *file,
+                                                         const char *attribute,
+                                                         const char *value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attribute_uint32         (GFile *file,
+                                                         const char *attribute,
+                                                         guint32 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attribute_int32          (GFile *file,
+                                                         const char *attribute,
+                                                         gint32 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attribute_uint64         (GFile *file,
+                                                         const char *attribute,
+                                                         guint64 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_set_attribute_int64          (GFile *file,
+                                                         const char *attribute,
+                                                         gint64 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_mount_mountable              (GFile *file,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFile *             g_file_mount_mountable_finish       (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_unmount_mountable            (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_unmount_mountable_finish     (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_unmount_mountable_with_operation
+                                                        (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_unmount_mountable_with_operation_finish
+                                                        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_eject_mountable              (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_eject_mountable_finish       (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_eject_mountable_with_operation
+                                                        (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_eject_mountable_with_operation_finish
+                                                        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_start_mountable              (GFile *file,
+                                                         GDriveStartFlags flags,
+                                                         GMountOperation *start_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_start_mountable_finish       (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_stop_mountable               (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_stop_mountable_finish        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_poll_mountable               (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_poll_mountable_finish        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_mount_enclosing_volume       (GFile *location,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_mount_enclosing_volume_finish
+                                                        (GFile *location,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+GFileMonitor*       g_file_monitor_directory            (GFile *file,
+                                                         GFileMonitorFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileMonitor*       g_file_monitor_file                 (GFile *file,
+                                                         GFileMonitorFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileMonitor*       g_file_monitor                      (GFile *file,
+                                                         GFileMonitorFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_load_contents                (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         char **contents,
+                                                         gsize *length,
+                                                         char **etag_out,
+                                                         GError **error);
+void                g_file_load_contents_async          (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_load_contents_finish         (GFile *file,
+                                                         GAsyncResult *res,
+                                                         char **contents,
+                                                         gsize *length,
+                                                         char **etag_out,
+                                                         GError **error);
+void                g_file_load_partial_contents_async  (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GFileReadMoreCallback read_more_callback,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_load_partial_contents_finish (GFile *file,
+                                                         GAsyncResult *res,
+                                                         char **contents,
+                                                         gsize *length,
+                                                         char **etag_out,
+                                                         GError **error);
+gboolean            g_file_replace_contents             (GFile *file,
+                                                         const char *contents,
+                                                         gsize length,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         char **new_etag,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_replace_contents_async       (GFile *file,
+                                                         const char *contents,
+                                                         gsize length,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_replace_contents_finish      (GFile *file,
+                                                         GAsyncResult *res,
+                                                         char **new_etag,
+                                                         GError **error);
+gboolean            g_file_copy_attributes              (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+GFileIOStream *     g_file_create_readwrite             (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_create_readwrite_async       (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileIOStream *     g_file_create_readwrite_finish      (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GFileIOStream *     g_file_open_readwrite               (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_open_readwrite_async         (GFile *file,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileIOStream *     g_file_open_readwrite_finish        (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+GFileIOStream *     g_file_replace_readwrite            (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_replace_readwrite_async      (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileIOStream *     g_file_replace_readwrite_finish     (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+gboolean            g_file_supports_thread_contexts     (GFile *file);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GFile
+
+
+
+

Prerequisites

+

+GFile requires + GObject.

+
+
+

Description

+

+GFile is a high level abstraction for manipulating files on a +virtual file system. GFiles are lightweight, immutable +objects that do no I/O upon creation. It is necessary to understand that +GFile objects do not represent files, merely an identifier for a file. All +file content I/O is implemented as streaming operations (see GInputStream and +GOutputStream). +

+

+To construct a GFile, you can use: +g_file_new_for_path() if you have a path. +g_file_new_for_uri() if you have a URI. +g_file_new_for_commandline_arg() for a command line argument. +g_file_parse_name() from a utf8 string gotten from g_file_get_parse_name(). +

+

+One way to think of a GFile is as an abstraction of a pathname. For normal +files the system pathname is what is stored internally, but as GFiles +are extensible it could also be something else that corresponds to a pathname +in a userspace implementation of a filesystem. +

+

+GFiles make up hierarchies of directories and files that correspond to the +files on a filesystem. You can move through the file system with GFile using +g_file_get_parent() to get an identifier for the parent directory, g_file_get_child() +to get a child within a directory, g_file_resolve_relative_path() to resolve a relative +path between two GFiles. There can be multiple hierarchies, so you may not +end up at the same root if you repeatedly call g_file_get_parent() on two different +files. +

+

+All GFiles have a basename (get with g_file_get_basename()). These names +are byte strings that are used to identify the file on the filesystem (relative to +its parent directory) and there is no guarantees that they have any particular charset +encoding or even make any sense at all. If you want to use filenames in a user +interface you should use the display name that you can get by requesting the +G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME attribute with g_file_query_info(). +This is guaranteed to be in utf8 and can be used in a user interface. But always +store the real basename or the GFile to use to actually access the file, because +there is no way to go from a display name to the actual name. +

+

+Using GFile as an identifier has the same weaknesses as using a path in that +there may be multiple aliases for the same file. For instance, hard or +soft links may cause two different GFiles to refer to the same file. +Other possible causes for aliases are: case insensitive filesystems, short +and long names on Fat/NTFS, or bind mounts in Linux. If you want to check if +two GFiles point to the same file you can query for the +G_FILE_ATTRIBUTE_ID_FILE attribute. Note that GFile does some trivial +canonicalization of pathnames passed in, so that trivial differences in the +path string used at creation (duplicated slashes, slash at end of path, "." +or ".." path segments, etc) does not create different GFiles. +

+

+Many GFile operations have both synchronous and asynchronous versions +to suit your application. Asynchronous versions of synchronous functions +simply have _async() appended to their function names. The asynchronous +I/O functions call a GAsyncReadyCallback which is then used to finalize +the operation, producing a GAsyncResult which is then passed to the +function's matching _finish() operation. +

+

+Some GFile operations do not have synchronous analogs, as they may +take a very long time to finish, and blocking may leave an application +unusable. Notable cases include: +g_file_mount_mountable() to mount a mountable file. +g_file_unmount_mountable_with_operation() to unmount a mountable file. +g_file_eject_mountable_with_operation() to eject a mountable file. +

+

+

+

+One notable feature of GFiles are entity tags, or "etags" for +short. Entity tags are somewhat like a more abstract version of the +traditional mtime, and can be used to quickly determine if the file has +been modified from the version on the file system. See the HTTP 1.1 +specification +for HTTP Etag headers, which are a very similar concept. +

+
+
+

Details

+
+

GFile

+
typedef struct _GFile GFile;
+

+A handle to an object implementing the GFileIface interface. +Generally stores a location within the file system. Handles do not +necessarily represent files or directories that currently exist.

+
+
+
+

GFileIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  GFile *             (* dup)                         (GFile         *file);
+  guint               (* hash)                        (GFile         *file);
+  gboolean            (* equal)                       (GFile         *file1,
+                                                       GFile         *file2);
+  gboolean            (* is_native)                   (GFile         *file);
+  gboolean            (* has_uri_scheme)              (GFile         *file,
+                                                       const char    *uri_scheme);
+  char *              (* get_uri_scheme)              (GFile         *file);
+  char *              (* get_basename)                (GFile         *file);
+  char *              (* get_path)                    (GFile         *file);
+  char *              (* get_uri)                     (GFile         *file);
+  char *              (* get_parse_name)              (GFile         *file);
+  GFile *             (* get_parent)                  (GFile         *file);
+  gboolean            (* prefix_matches)              (GFile         *prefix,
+                                                       GFile         *file);
+  char *              (* get_relative_path)           (GFile         *parent,
+                                                       GFile         *descendant);
+  GFile *             (* resolve_relative_path)       (GFile        *file,
+                                                       const char   *relative_path);
+  GFile *             (* get_child_for_display_name)  (GFile        *file,
+                                                       const char   *display_name,
+                                                       GError      **error);
+
+  GFileEnumerator *   (* enumerate_children)          (GFile                *file,
+                                                       const char           *attributes,
+                                                       GFileQueryInfoFlags   flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* enumerate_children_async)    (GFile                *file,
+                                                       const char           *attributes,
+                                                       GFileQueryInfoFlags   flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileEnumerator *   (* enumerate_children_finish)   (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFileInfo *         (* query_info)                  (GFile                *file,
+                                                       const char           *attributes,
+                                                       GFileQueryInfoFlags   flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* query_info_async)            (GFile                *file,
+                                                       const char           *attributes,
+                                                       GFileQueryInfoFlags   flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileInfo *         (* query_info_finish)           (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFileInfo *         (* query_filesystem_info)       (GFile                *file,
+                                                       const char           *attributes,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* query_filesystem_info_async) (GFile                *file,
+                                                       const char           *attributes,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileInfo *         (* query_filesystem_info_finish)(GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GMount *            (* find_enclosing_mount)        (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* find_enclosing_mount_async)  (GFile                *file,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GMount *            (* find_enclosing_mount_finish) (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFile *             (* set_display_name)            (GFile                *file,
+                                                       const char           *display_name,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* set_display_name_async)      (GFile                *file,
+                                                       const char           *display_name,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFile *             (* set_display_name_finish)     (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFileAttributeInfoList * (* query_settable_attributes)    (GFile          *file,
+                                                             GCancellable   *cancellable,
+                                                             GError        **error);
+  void                (* _query_settable_attributes_async)  (void);
+  void                (* _query_settable_attributes_finish) (void);
+
+  GFileAttributeInfoList * (* query_writable_namespaces)    (GFile          *file,
+                                                             GCancellable   *cancellable,
+                                                             GError        **error);
+  void                (* _query_writable_namespaces_async)  (void);
+  void                (* _query_writable_namespaces_finish) (void);
+
+  gboolean            (* set_attribute)               (GFile                *file,
+                                                       const char           *attribute,
+                                                       GFileAttributeType    type,
+                                                       gpointer              value_p,
+                                                       GFileQueryInfoFlags   flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  gboolean            (* set_attributes_from_info)    (GFile                *file,
+                                                       GFileInfo            *info,
+                                                       GFileQueryInfoFlags   flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* set_attributes_async)        (GFile                *file,
+                                                       GFileInfo            *info,
+                                                       GFileQueryInfoFlags   flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* set_attributes_finish)       (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GFileInfo           **info,
+                                                       GError              **error);
+
+  GFileInputStream *  (* read_fn)                     (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* read_async)                  (GFile                *file,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileInputStream *  (* read_finish)                 (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFileOutputStream * (* append_to)                   (GFile                *file,
+                                                       GFileCreateFlags      flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* append_to_async)             (GFile                *file,
+                                                       GFileCreateFlags      flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileOutputStream * (* append_to_finish)            (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFileOutputStream * (* create)                      (GFile                *file,
+                                                       GFileCreateFlags      flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* create_async)                (GFile                *file,
+                                                       GFileCreateFlags      flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileOutputStream * (* create_finish)               (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  GFileOutputStream * (* replace)                     (GFile                *file,
+                                                       const char           *etag,
+                                                       gboolean              make_backup,
+                                                       GFileCreateFlags      flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* replace_async)               (GFile                *file,
+                                                       const char           *etag,
+                                                       gboolean              make_backup,
+                                                       GFileCreateFlags      flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileOutputStream * (* replace_finish)              (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  gboolean            (* delete_file)                 (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* _delete_file_async)          (void);
+  void                (* _delete_file_finish)         (void);
+
+  gboolean            (* trash)                       (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* _trash_async)                (void);
+  void                (* _trash_finish)               (void);
+
+  gboolean            (* make_directory)              (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* _make_directory_async)       (void);
+  void                (* _make_directory_finish)      (void);
+
+  gboolean            (* make_symbolic_link)          (GFile                *file,
+                                                       const char           *symlink_value,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* _make_symbolic_link_async)   (void);
+  void                (* _make_symbolic_link_finish)  (void);
+
+  gboolean            (* copy)                        (GFile                *source,
+                                                       GFile                *destination,
+                                                       GFileCopyFlags        flags,
+                                                       GCancellable         *cancellable,
+                                                       GFileProgressCallback progress_callback,
+                                                       gpointer              progress_callback_data,
+                                                       GError              **error);
+  void                (* copy_async)                  (GFile                *source,
+                                                       GFile                *destination,
+                                                       GFileCopyFlags        flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GFileProgressCallback progress_callback,
+                                                       gpointer              progress_callback_data,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* copy_finish)                 (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  gboolean            (* move)                        (GFile                *source,
+                                                       GFile                *destination,
+                                                       GFileCopyFlags        flags,
+                                                       GCancellable         *cancellable,
+                                                       GFileProgressCallback progress_callback,
+                                                       gpointer              progress_callback_data,
+                                                       GError              **error);
+  void                (* _move_async)                 (void);
+  void                (* _move_finish)                (void);
+
+  void                (* mount_mountable)             (GFile                *file,
+                                                       GMountMountFlags      flags,
+                                                       GMountOperation      *mount_operation,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFile *             (* mount_mountable_finish)      (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  void                (* unmount_mountable)           (GFile                *file,
+                                                       GMountUnmountFlags    flags,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* unmount_mountable_finish)    (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  void                (* eject_mountable)             (GFile                *file,
+                                                       GMountUnmountFlags    flags,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* eject_mountable_finish)      (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  void                (* mount_enclosing_volume)      (GFile                *location,
+                                                       GMountMountFlags      flags,
+                                                       GMountOperation      *mount_operation,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean         (* mount_enclosing_volume_finish)  (GFile                *location,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  GFileMonitor *      (* monitor_dir)                 (GFile                *file,
+                                                       GFileMonitorFlags     flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  GFileMonitor *      (* monitor_file)                (GFile                *file,
+                                                       GFileMonitorFlags     flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+
+  GFileIOStream *     (* open_readwrite)              (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* open_readwrite_async)        (GFile                *file,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileIOStream *     (* open_readwrite_finish)       (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+  GFileIOStream *     (* create_readwrite)            (GFile                *file,
+						       GFileCreateFlags      flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* create_readwrite_async)      (GFile                *file,
+						       GFileCreateFlags      flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileIOStream *     (* create_readwrite_finish)      (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+  GFileIOStream *     (* replace_readwrite)           (GFile                *file,
+                                                       const char           *etag,
+                                                       gboolean              make_backup,
+                                                       GFileCreateFlags      flags,
+                                                       GCancellable         *cancellable,
+                                                       GError              **error);
+  void                (* replace_readwrite_async)     (GFile                *file,
+                                                       const char           *etag,
+                                                       gboolean              make_backup,
+                                                       GFileCreateFlags      flags,
+                                                       int                   io_priority,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  GFileIOStream *     (* replace_readwrite_finish)    (GFile                *file,
+                                                       GAsyncResult         *res,
+                                                       GError              **error);
+
+  void                (* start_mountable)             (GFile                *file,
+                                                       GDriveStartFlags      flags,
+                                                       GMountOperation      *start_operation,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* start_mountable_finish)      (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  void                (* stop_mountable)              (GFile                *file,
+                                                       GMountUnmountFlags    flags,
+                                                       GMountOperation      *mount_operation,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* stop_mountable_finish)       (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  gboolean            supports_thread_contexts;
+
+  void                (* unmount_mountable_with_operation) (GFile           *file,
+                                                       GMountUnmountFlags    flags,
+                                                       GMountOperation      *mount_operation,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* unmount_mountable_with_operation_finish) (GFile    *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  void                (* eject_mountable_with_operation) (GFile             *file,
+                                                       GMountUnmountFlags    flags,
+                                                       GMountOperation      *mount_operation,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* eject_mountable_with_operation_finish) (GFile      *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
+  void                (* poll_mountable)              (GFile                *file,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+  gboolean            (* poll_mountable_finish)       (GFile                *file,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+} GFileIface;
+
+

+An interface for writing VFS file handles.

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

GTypeInterface g_iface;

The parent interface. +

dup ()

Duplicates a GFile. +

hash ()

Creates a hash of a GFile. +

equal ()

Checks equality of two given GFiles. +

is_native ()

Checks to see if a file is native to the system. +

has_uri_scheme ()

Checks to see if a GFile has a given URI scheme. +

get_uri_scheme ()

Gets the URI scheme for a GFile. +

get_basename ()

Gets the basename for a given GFile. +

get_path ()

Gets the current path within a GFile. +

get_uri ()

Gets a URI for the path within a GFile. +

get_parse_name ()

Gets the parsed name for the GFile. +

get_parent ()

Gets the parent directory for the GFile. +

prefix_matches ()

Checks whether a GFile contains a specified file. +

get_relative_path ()

Gets the path for a GFile relative to a given path. +

resolve_relative_path ()

Resolves a relative path for a GFile to an absolute path. +

get_child_for_display_name ()

Gets the child GFile for a given display name. +

enumerate_children ()

Gets a GFileEnumerator with the children of a GFile. +

enumerate_children_async ()

Asynchronously gets a GFileEnumerator with the children of a GFile. +

enumerate_children_finish ()

Finishes asynchronously enumerating the children. +

query_info ()

Gets the GFileInfo for a GFile. +

query_info_async ()

Asynchronously gets the GFileInfo for a GFile. +

query_info_finish ()

Finishes an asynchronous query info operation. +

query_filesystem_info ()

Gets a GFileInfo for the file system GFile is on. +

query_filesystem_info_async ()

Asynchronously gets a GFileInfo for the file system GFile is on. +

query_filesystem_info_finish ()

Finishes asynchronously getting the file system info. +

find_enclosing_mount ()

Gets a GMount for the GFile. +

find_enclosing_mount_async ()

Asynchronously gets the GMount for a GFile. +

find_enclosing_mount_finish ()

Finishes asynchronously getting the volume. +

set_display_name ()

Sets the display name for a GFile. +

set_display_name_async ()

Asynchronously sets a GFile's display name. +

set_display_name_finish ()

Finishes asynchronously setting a GFile's display name. +

query_settable_attributes ()

Returns a list of GFileAttributes that can be set. +

_query_settable_attributes_async ()

Asynchronously gets a list of GFileAttributes that can be set. +

_query_settable_attributes_finish ()

Finishes asynchronously querying settable attributes. +

query_writable_namespaces ()

Returns a list of GFileAttribute namespaces that are writable. +

_query_writable_namespaces_async ()

Asynchronously gets a list of GFileAttribute namespaces that are writable. +

_query_writable_namespaces_finish ()

Finishes asynchronously querying the writable namespaces. +

set_attribute ()

Sets a GFileAttribute. +

set_attributes_from_info ()

Sets a GFileAttribute with information from a GFileInfo. +

set_attributes_async ()

Asynchronously sets a file's attributes. +

set_attributes_finish ()

Finishes setting a file's attributes asynchronously. +

read_fn ()

Reads a file asynchronously. +

read_async ()

Asynchronously reads a file. +

read_finish ()

Finishes asynchronously reading a file. +

append_to ()

Writes to the end of a file. +

append_to_async ()

Asynchronously writes to the end of a file. +

append_to_finish ()

Finishes an asynchronous file append operation. +

create ()

Creates a new file. +

create_async ()

Asynchronously creates a file. +

create_finish ()

Finishes asynchronously creating a file. +

replace ()

Replaces the contents of a file. +

replace_async ()

Asynchronously replaces the contents of a file. +

replace_finish ()

Finishes asynchronously replacing a file. +

delete_file ()

Deletes a file. +

_delete_file_async ()

Asynchronously deletes a file. +

_delete_file_finish ()

Finishes an asynchronous delete. +

trash ()

Sends a GFile to the Trash location. +

_trash_async ()

Asynchronously sends a GFile to the Trash location. +

_trash_finish ()

Finishes an asynchronous file trashing operation. +

make_directory ()

Makes a directory. +

_make_directory_async ()

Asynchronously makes a directory. +

_make_directory_finish ()

Finishes making a directory asynchronously. +

make_symbolic_link ()

Makes a symbolic link. +

_make_symbolic_link_async ()

Asynchronously makes a symbolic link +

_make_symbolic_link_finish ()

Finishes making a symbolic link asynchronously. +

copy ()

Copies a file. +

copy_async ()

Asynchronously copies a file. +

copy_finish ()

Finishes an asynchronous copy operation. +

move ()

Moves a file. +

_move_async ()

Asynchronously moves a file. +

_move_finish ()

Finishes an asynchronous move operation. +

mount_mountable ()

Mounts a mountable object. +

mount_mountable_finish ()

Finishes a mounting operation. +

unmount_mountable ()

Unmounts a mountable object. +

unmount_mountable_finish ()

Finishes an unmount operation. +

eject_mountable ()

Ejects a mountable. +

eject_mountable_finish ()

Finishes an eject operation. +

mount_enclosing_volume ()

Mounts a specified location. +

mount_enclosing_volume_finish ()

Finishes mounting a specified location. +

monitor_dir ()

Creates a GFileMonitor for the location. +

monitor_file ()

Creates a GFileMonitor for the location. +

open_readwrite ()

Open file read/write. Since 2.22. +

open_readwrite_async ()

Asynchronously opens file read/write. Since 2.22. +

open_readwrite_finish ()

Finishes an asynchronous open read/write. Since 2.22. +

create_readwrite ()

Creates file read/write. Since 2.22. +

create_readwrite_async ()

Asynchronously creates file read/write. Since 2.22. +

create_readwrite_finish ()

Finishes an asynchronous creates read/write. Since 2.22. +

replace_readwrite ()

Replaces file read/write. Since 2.22. +

replace_readwrite_async ()

Asynchronously replaces file read/write. Since 2.22. +

replace_readwrite_finish ()

Finishes an asynchronous replace read/write. Since 2.22. +

start_mountable ()

Starts a mountable object. Since 2.22. +

start_mountable_finish ()

Finishes an start operation. Since 2.22. +

stop_mountable ()

Stops a mountable. Since 2.22. +

stop_mountable_finish ()

Finishes an stop operation. Since 2.22. +

gboolean supports_thread_contexts;

a boolean that indicates whether the GFile implementation supports thread-default contexts. Since 2.22. +

unmount_mountable_with_operation ()

Unmounts a mountable object using a GMountOperation. Since 2.22. +

unmount_mountable_with_operation_finish ()

Finishes an unmount operation using a GMountOperation. Since 2.22. +

eject_mountable_with_operation ()

Ejects a mountable object using a GMountOperation. Since 2.22. +

eject_mountable_with_operation_finish ()

Finishes an eject operation using a GMountOperation. Since 2.22. +

poll_mountable ()

Polls a mountable object for media changes. Since 2.22. +

poll_mountable_finish ()

Finishes an poll operation for media changes. Since 2.22. +
+
+
+
+

enum GFileQueryInfoFlags

+
typedef enum {
+  G_FILE_QUERY_INFO_NONE              = 0,
+  G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS = (1 << 0)   /*< nick=nofollow-symlinks >*/
+} GFileQueryInfoFlags;
+
+

+Flags used when querying a GFileInfo.

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

G_FILE_QUERY_INFO_NONE

No flags set. +

G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS

Don't follow symlinks. +
+
+
+
+

enum GFileCreateFlags

+
typedef enum {
+  G_FILE_CREATE_NONE    = 0,
+  G_FILE_CREATE_PRIVATE = (1 << 0),
+  G_FILE_CREATE_REPLACE_DESTINATION = (1 << 1)
+} GFileCreateFlags;
+
+

+Flags used when an operation may create a file.

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

G_FILE_CREATE_NONE

No flags set. +

G_FILE_CREATE_PRIVATE

Create a file that can only be + accessed by the current user. +

G_FILE_CREATE_REPLACE_DESTINATION

Replace the destination + as if it didn't exist before. Don't try to keep any old + permissions, replace instead of following links. This + is generally useful if you're doing a "copy over" + rather than a "save new version of" replace operation. + You can think of it as "unlink destination" before + writing to it, although the implementation may not + be exactly like that. Since 2.20 +
+
+
+
+

enum GFileCopyFlags

+
typedef enum {
+  G_FILE_COPY_NONE                 = 0,          /*< nick=none >*/
+  G_FILE_COPY_OVERWRITE            = (1 << 0),
+  G_FILE_COPY_BACKUP               = (1 << 1),
+  G_FILE_COPY_NOFOLLOW_SYMLINKS    = (1 << 2),
+  G_FILE_COPY_ALL_METADATA         = (1 << 3),
+  G_FILE_COPY_NO_FALLBACK_FOR_MOVE = (1 << 4),
+  G_FILE_COPY_TARGET_DEFAULT_PERMS = (1 << 5)
+} GFileCopyFlags;
+
+

+Flags used when copying or moving files.

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

G_FILE_COPY_NONE

No flags set. +

G_FILE_COPY_OVERWRITE

Overwrite any existing files +

G_FILE_COPY_BACKUP

Make a backup of any existing files. +

G_FILE_COPY_NOFOLLOW_SYMLINKS

Don't follow symlinks. +

G_FILE_COPY_ALL_METADATA

Copy all file metadata instead of just default set used for copy (see GFileInfo). +

G_FILE_COPY_NO_FALLBACK_FOR_MOVE

Don't use copy and delete fallback if native move not supported. +

G_FILE_COPY_TARGET_DEFAULT_PERMS

Leaves target file with default perms, instead of setting the source file perms. +
+
+
+
+

enum GFileMonitorFlags

+
typedef enum {
+  G_FILE_MONITOR_NONE         = 0,
+  G_FILE_MONITOR_WATCH_MOUNTS = (1 << 0),
+  G_FILE_MONITOR_SEND_MOVED   = (1 << 1)
+} GFileMonitorFlags;
+
+

+Flags used to set what a GFileMonitor will watch for.

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

G_FILE_MONITOR_NONE

No flags set. +

G_FILE_MONITOR_WATCH_MOUNTS

Watch for mount events. +

G_FILE_MONITOR_SEND_MOVED

Pair DELETED and CREATED events caused + by file renames (moves) and send a single G_FILE_MONITOR_EVENT_MOVED + event instead (NB: not supported on all backends; the default + behaviour -without specifying this flag- is to send single DELETED + and CREATED events). +
+
+
+
+

enum GFilesystemPreviewType

+
typedef enum {
+  G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS = 0,
+  G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL,
+  G_FILESYSTEM_PREVIEW_TYPE_NEVER
+} GFilesystemPreviewType;
+
+

+Indicates a hint from the file system whether files should be +previewed in a file manager. Returned as the value of the key +G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW.

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

G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS

Only preview files if user has explicitly requested it. +

G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL

Preview files if user has requested preview of "local" files. +

G_FILESYSTEM_PREVIEW_TYPE_NEVER

Never preview files. +
+
+
+
+

GFileProgressCallback ()

+
void                (*GFileProgressCallback)            (goffset current_num_bytes,
+                                                         goffset total_num_bytes,
+                                                         gpointer user_data);
+

+When doing file operations that may take a while, such as moving +a file or copying a file, a progress callback is used to pass how +far along that operation is to the application.

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

current_num_bytes :

the current number of bytes in the operation. +

total_num_bytes :

the total number of bytes in the operation. +

user_data :

user data passed to the callback. +
+
+
+
+

GFileReadMoreCallback ()

+
gboolean            (*GFileReadMoreCallback)            (const char *file_contents,
+                                                         goffset file_size,
+                                                         gpointer callback_data);
+

+When loading the partial contents of a file with g_file_load_partial_contents_async(), +it may become necessary to determine if any more data from the file should be loaded. +A GFileReadMoreCallback function facilitates this by returning TRUE if more data +should be read, or FALSE otherwise.

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

file_contents :

the data as currently read. +

file_size :

the size of the data currently read. +

callback_data :

data passed to the callback. +

Returns :

TRUE if more data should be read back. FALSE otherwise. +
+
+
+
+

g_file_new_for_path ()

+
GFile *             g_file_new_for_path                 (const char *path);
+

+Constructs a GFile for a given path. This operation never +fails, but the returned object might not support any I/O +operation if path is malformed.

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

path :

a string containing a relative or absolute path. +

Returns :

a new GFile for the given path. +
+
+
+
+

g_file_new_for_uri ()

+
GFile *             g_file_new_for_uri                  (const char *uri);
+

+Constructs a GFile for a given URI. This operation never +fails, but the returned object might not support any I/O +operation if uri is malformed or if the uri type is +not supported.

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

uri :

a string containing a URI. +

Returns :

a GFile for the given uri. +
+
+
+
+

g_file_new_for_commandline_arg ()

+
GFile *             g_file_new_for_commandline_arg      (const char *arg);
+

+Creates a GFile with the given argument from the command line. The value of +arg can be either a URI, an absolute path or a relative path resolved +relative to the current working directory. +This operation never fails, but the returned object might not support any +I/O operation if arg points to a malformed path.

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

arg :

a command line string. +

Returns :

a new GFile. +
+
+
+
+

g_file_parse_name ()

+
GFile *             g_file_parse_name                   (const char *parse_name);
+

+Constructs a GFile with the given parse_name (i.e. something given by g_file_get_parse_name()). +This operation never fails, but the returned object might not support any I/O +operation if the parse_name cannot be parsed.

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

parse_name :

a file name or path to be parsed. +

Returns :

a new GFile. +
+
+
+
+

g_file_dup ()

+
GFile *             g_file_dup                          (GFile *file);
+

+Duplicates a GFile handle. This operation does not duplicate +the actual file or directory represented by the GFile; see +g_file_copy() if attempting to copy a file. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

a new GFile that is a duplicate of the given GFile. +
+
+
+
+

g_file_hash ()

+
guint               g_file_hash                         (gconstpointer file);
+

+Creates a hash value for a GFile. +

+

+This call does no blocking i/o.

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

file :

gconstpointer to a GFile. +

Returns :

0 if file is not a valid GFile, otherwise an + integer that can be used as hash value for the GFile. + This function is intended for easily hashing a GFile to + add to a GHashTable or similar data structure. +
+
+
+
+

g_file_equal ()

+
gboolean            g_file_equal                        (GFile *file1,
+                                                         GFile *file2);
+

+Checks equality of two given GFiles. Note that two +GFiles that differ can still refer to the same +file on the filesystem due to various forms of filename +aliasing. +

+

+This call does no blocking i/o.

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

file1 :

the first GFile. +

file2 :

the second GFile. +

Returns :

TRUE if file1 and file2 are equal. + FALSE if either is not a GFile. +
+
+
+
+

g_file_get_basename ()

+
char *              g_file_get_basename                 (GFile *file);
+

+Gets the base name (the last component of the path) for a given GFile. +

+

+If called for the top level of a system (such as the filesystem root +or a uri like sftp://host/) it will return a single directory separator +(and on Windows, possibly a drive letter). +

+

+The base name is a byte string (*not* UTF-8). It has no defined encoding +or rules other than it may not contain zero bytes. If you want to use +filenames in a user interface you should use the display name that you +can get by requesting the G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME +attribute with g_file_query_info(). +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

string containing the GFile's base name, or NULL + if given GFile is invalid. The returned string should be + freed with g_free() when no longer needed. +
+
+
+
+

g_file_get_path ()

+
char *              g_file_get_path                     (GFile *file);
+

+Gets the local pathname for GFile, if one exists. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

string containing the GFile's path, or NULL if + no such path exists. The returned string should be + freed with g_free() when no longer needed. +
+
+
+
+

g_file_get_uri ()

+
char *              g_file_get_uri                      (GFile *file);
+

+Gets the URI for the file. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

a string containing the GFile's URI. + The returned string should be freed with g_free() when no longer needed. +
+
+
+
+

g_file_get_parse_name ()

+
char *              g_file_get_parse_name               (GFile *file);
+

+Gets the parse name of the file. +A parse name is a UTF-8 string that describes the +file such that one can get the GFile back using +g_file_parse_name(). +

+

+This is generally used to show the GFile as a nice +full-pathname kind of string in a user interface, +like in a location entry. +

+

+For local files with names that can safely be converted +to UTF8 the pathname is used, otherwise the IRI is used +(a form of URI that allows UTF8 characters unescaped). +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

a string containing the GFile's parse name. The returned + string should be freed with g_free() when no longer needed. +
+
+
+
+

g_file_get_parent ()

+
GFile *             g_file_get_parent                   (GFile *file);
+

+Gets the parent directory for the file. +If the file represents the root directory of the +file system, then NULL will be returned. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

a GFile structure to the parent of the given + GFile or NULL if there is no parent. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_has_parent ()

+
gboolean            g_file_has_parent                   (GFile *file,
+                                                         GFile *parent);
+

+Checks if file has a parent, and optionally, if it is parent. +

+

+If parent is NULL then this function returns TRUE if file has any +parent at all. If parent is non-NULL then TRUE is only returned +if file is a child of parent.

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

file :

input GFile +

parent :

the parent to check for, or NULL +

Returns :

TRUE if file is a child of parent (or any parent in the + case that parent is NULL). + +
+

Since 2.24

+
+
+
+

g_file_get_child ()

+
GFile *             g_file_get_child                    (GFile *file,
+                                                         const char *name);
+

+Gets a child of file with basename equal to name. +

+

+Note that the file with that specific name might not exist, but +you can still have a GFile that points to it. You can use this +for instance to create that file. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

name :

string containing the child's basename. +

Returns :

a GFile to a child specified by name. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_get_child_for_display_name ()

+
GFile *             g_file_get_child_for_display_name   (GFile *file,
+                                                         const char *display_name,
+                                                         GError **error);
+

+Gets the child of file for a given display_name (i.e. a UTF8 +version of the name). If this function fails, it returns NULL and error will be +set. This is very useful when constructing a GFile for a new file +and the user entered the filename in the user interface, for instance +when you select a directory and type a filename in the file selector. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

display_name :

string to a possible child. +

error :

GError. +

Returns :

a GFile to the specified child, or + NULL if the display name couldn't be converted. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_has_prefix ()

+
gboolean            g_file_has_prefix                   (GFile *file,
+                                                         GFile *prefix);
+

+Checks whether file has the prefix specified by prefix. In other word, +if the names of inital elements of files pathname match prefix. +Only full pathname elements are matched, so a path like /foo is not +considered a prefix of /foobar, only of /foo/bar. +

+

+This call does no i/o, as it works purely on names. As such it can +sometimes return FALSE even if file is inside a prefix (from a +filesystem point of view), because the prefix of file is an alias +of prefix.

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

file :

input GFile. +

prefix :

input GFile. +

Returns :

TRUE if the files's parent, grandparent, etc is prefix. + FALSE otherwise. +
+
+
+
+

g_file_get_relative_path ()

+
char *              g_file_get_relative_path            (GFile *parent,
+                                                         GFile *descendant);
+

+Gets the path for descendant relative to parent. +

+

+This call does no blocking i/o.

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

parent :

input GFile. +

descendant :

input GFile. +

Returns :

string with the relative path from descendant + to parent, or NULL if descendant doesn't have parent as prefix. + The returned string should be freed with g_free() when no longer needed. +
+
+
+
+

g_file_resolve_relative_path ()

+
GFile *             g_file_resolve_relative_path        (GFile *file,
+                                                         const char *relative_path);
+

+Resolves a relative path for file to an absolute path. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

relative_path :

a given relative path string. +

Returns :

GFile to the resolved path. NULL if relative_path + is NULL or if file is invalid. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_is_native ()

+
gboolean            g_file_is_native                    (GFile *file);
+

+Checks to see if a file is native to the platform. +

+

+A native file s one expressed in the platform-native filename format, +e.g. "C:\Windows" or "/usr/bin/". This does not mean the file is local, +as it might be on a locally mounted remote filesystem. +

+

+On some systems non-native files may be available using +the native filesystem via a userspace filesystem (FUSE), in +these cases this call will return FALSE, but g_file_get_path() +will still return a native path. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

TRUE if file is native. +
+
+
+
+

g_file_has_uri_scheme ()

+
gboolean            g_file_has_uri_scheme               (GFile *file,
+                                                         const char *uri_scheme);
+

+Checks to see if a GFile has a given URI scheme. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

uri_scheme :

a string containing a URI scheme. +

Returns :

TRUE if GFile's backend supports the + given URI scheme, FALSE if URI scheme is NULL, + not supported, or GFile is invalid. +
+
+
+
+

g_file_get_uri_scheme ()

+
char *              g_file_get_uri_scheme               (GFile *file);
+

+Gets the URI scheme for a GFile. +RFC 3986 decodes the scheme as: +

+
+URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 
+
+

+Common schemes include "file", "http", "ftp", etc. +

+

+This call does no blocking i/o.

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

file :

input GFile. +

Returns :

a string containing the URI scheme for the given + GFile. The returned string should be freed with g_free() + when no longer needed. +
+
+
+
+

g_file_read ()

+
GFileInputStream *  g_file_read                         (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Opens a file for reading. The result is a GFileInputStream that +can be used to read the contents of the file. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. +If the file is a directory, the G_IO_ERROR_IS_DIRECTORY error will be returned. +Other errors are possible too, and depend on what kind of filesystem the file is on.

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

file :

GFile to read. +

cancellable :

a GCancellable +

error :

a GError, or NULL +

Returns :

GFileInputStream or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_read_async ()

+
void                g_file_read_async                   (GFile *file,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously opens file for reading. +

+

+For more details, see g_file_read() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_read_finish() to get the result of the operation.

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

file :

input GFile +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_read_finish ()

+
GFileInputStream *  g_file_read_finish                  (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file read operation started with +g_file_read_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFileInputStream or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_append_to ()

+
GFileOutputStream * g_file_append_to                    (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Gets an output stream for appending data to the file. If +the file doesn't already exist it is created. +

+

+By default files created are generally readable by everyone, +but if you pass G_FILE_CREATE_PRIVATE in flags the file +will be made readable only to the current user, to the level that +is supported on the target filesystem. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+Some file systems don't allow all file names, and may +return an G_IO_ERROR_INVALID_FILENAME error. +If the file is a directory the G_IO_ERROR_IS_DIRECTORY error will be +returned. Other errors are possible too, and depend on what kind of +filesystem the file is on.

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

file :

input GFile. +

flags :

a set of GFileCreateFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GFileOutputStream, or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_create ()

+
GFileOutputStream * g_file_create                       (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Creates a new file and returns an output stream for writing to it. +The file must not already exist. +

+

+By default files created are generally readable by everyone, +but if you pass G_FILE_CREATE_PRIVATE in flags the file +will be made readable only to the current user, to the level that +is supported on the target filesystem. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If a file or directory with this name already exists the G_IO_ERROR_EXISTS +error will be returned. +Some file systems don't allow all file names, and may +return an G_IO_ERROR_INVALID_FILENAME error, and if the name +is to long G_IO_ERROR_FILENAME_TOO_LONG will be returned. +Other errors are possible too, and depend on what kind of +filesystem the file is on.

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

file :

input GFile. +

flags :

a set of GFileCreateFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GFileOutputStream for the newly created file, or + NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_replace ()

+
GFileOutputStream * g_file_replace                      (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Returns an output stream for overwriting the file, possibly +creating a backup copy of the file first. If the file doesn't exist, +it will be created. +

+

+This will try to replace the file in the safest way possible so +that any errors during the writing will not affect an already +existing copy of the file. For instance, for local files it +may write to a temporary file and then atomically rename over +the destination when the stream is closed. +

+

+By default files created are generally readable by everyone, +but if you pass G_FILE_CREATE_PRIVATE in flags the file +will be made readable only to the current user, to the level that +is supported on the target filesystem. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If you pass in a non-NULL etag value, then this value is +compared to the current entity tag of the file, and if they differ +an G_IO_ERROR_WRONG_ETAG error is returned. This generally means +that the file has been changed since you last read it. You can get +the new etag from g_file_output_stream_get_etag() after you've +finished writing and closed the GFileOutputStream. When you load +a new file you can use g_file_input_stream_query_info() to get +the etag of the file. +

+

+If make_backup is TRUE, this function will attempt to make a backup +of the current file before overwriting it. If this fails a G_IO_ERROR_CANT_CREATE_BACKUP +error will be returned. If you want to replace anyway, try again with +make_backup set to FALSE. +

+

+If the file is a directory the G_IO_ERROR_IS_DIRECTORY error will be returned, +and if the file is some other form of non-regular file then a +G_IO_ERROR_NOT_REGULAR_FILE error will be returned. +Some file systems don't allow all file names, and may +return an G_IO_ERROR_INVALID_FILENAME error, and if the name +is to long G_IO_ERROR_FILENAME_TOO_LONG will be returned. +Other errors are possible too, and depend on what kind of +filesystem the file is on.

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

file :

input GFile. +

etag :

an optional entity tag for the + current GFile, or NULL to ignore. +

make_backup :

TRUE if a backup should be created. +

flags :

a set of GFileCreateFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GFileOutputStream or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_append_to_async ()

+
void                g_file_append_to_async              (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously opens file for appending. +

+

+For more details, see g_file_append_to() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_append_to_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

a set of GFileCreateFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_append_to_finish ()

+
GFileOutputStream * g_file_append_to_finish             (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file append operation started with +g_file_append_to_async().

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

file :

input GFile. +

res :

GAsyncResult +

error :

a GError, or NULL +

Returns :

a valid GFileOutputStream or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_create_async ()

+
void                g_file_create_async                 (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously creates a new file and returns an output stream for writing to it. +The file must not already exist. +

+

+For more details, see g_file_create() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_create_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

a set of GFileCreateFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_create_finish ()

+
GFileOutputStream * g_file_create_finish                (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file create operation started with +g_file_create_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFileOutputStream or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_replace_async ()

+
void                g_file_replace_async                (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously overwrites the file, replacing the contents, possibly +creating a backup copy of the file first. +

+

+For more details, see g_file_replace() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_replace_finish() to get the result of the operation.

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

file :

input GFile. +

etag :

an entity tag for the + current GFile, or NULL to ignore. +

make_backup :

TRUE if a backup should be created. +

flags :

a set of GFileCreateFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_replace_finish ()

+
GFileOutputStream * g_file_replace_finish               (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file replace operation started with +g_file_replace_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFileOutputStream, or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_query_info ()

+
GFileInfo *         g_file_query_info                   (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Gets the requested information about specified file. The result +is a GFileInfo object that contains key-value attributes (such as +the type or size of the file). +

+

+The attribute value is a string that specifies the file attributes that +should be gathered. It is not an error if it's not possible to read a particular +requested attribute from a file - it just won't be set. attribute should +be a comma-separated list of attribute or attribute wildcards. The wildcard "*" +means all attributes, and a wildcard like "standard::*" means all attributes in the standard +namespace. An example attribute query be "standard::*,owner::user". +The standard attributes are available as defines, like G_FILE_ATTRIBUTE_STANDARD_NAME. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+For symlinks, normally the information about the target of the +symlink is returned, rather than information about the symlink itself. +However if you pass G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS in flags the +information about the symlink itself will be returned. Also, for symlinks +that point to non-existing files the information about the symlink itself +will be returned. +

+

+If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. +Other errors are possible too, and depend on what kind of filesystem the file is on.

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

file :

input GFile. +

attributes :

an attribute query string. +

flags :

a set of GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError. +

Returns :

a GFileInfo for the given file, or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_query_info_async ()

+
void                g_file_query_info_async             (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously gets the requested information about specified file. The result +is a GFileInfo object that contains key-value attributes (such as type or size +for the file). +

+

+For more details, see g_file_query_info() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_query_info_finish() to get the result of the operation.

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

file :

input GFile. +

attributes :

an attribute query string. +

flags :

a set of GFileQueryInfoFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_query_info_finish ()

+
GFileInfo *         g_file_query_info_finish            (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file info query. +See g_file_query_info_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError. +

Returns :

GFileInfo for given file or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_query_exists ()

+
gboolean            g_file_query_exists                 (GFile *file,
+                                                         GCancellable *cancellable);
+

+Utility function to check if a particular file exists. This is +implemented using g_file_query_info() and as such does blocking I/O. +

+

+Note that in many cases it is racy to first check for file existence +and then execute something based on the outcome of that, because the +file might have been created or removed in between the operations. The +general approach to handling that is to not check, but just do the +operation and handle the errors as they come. +

+

+As an example of race-free checking, take the case of reading a file, and +if it doesn't exist, creating it. There are two racy versions: read it, and +on error create it; and: check if it exists, if not create it. These +can both result in two processes creating the file (with perhaps a partially +written file as the result). The correct approach is to always try to create +the file with g_file_create() which will either atomically create the file +or fail with a G_IO_ERROR_EXISTS error. +

+

+However, in many cases an existence check is useful in a user +interface, for instance to make a menu item sensitive/insensitive, so that +you don't have to fool users that something is possible and then just show +and error dialog. If you do this, you should make sure to also handle the +errors that can happen due to races when you execute the operation.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

Returns :

TRUE if the file exists (and can be detected without error), FALSE otherwise (or if cancelled). +
+
+
+
+

g_file_query_file_type ()

+
GFileType           g_file_query_file_type              (GFile *file,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable);
+

+Utility function to inspect the GFileType of a file. This is +implemented using g_file_query_info() and as such does blocking I/O. +

+

+The primary use case of this method is to check if a file is a regular file, +directory, or symlink.

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

file :

input GFile. +

flags :

a set of GFileQueryInfoFlags passed to g_file_query_info(). +

cancellable :

optional GCancellable object, NULL to ignore. +

Returns :

The GFileType of the file and G_FILE_TYPE_UNKNOWN if the file + does not exist + +
+

Since 2.18

+
+
+
+

g_file_query_filesystem_info ()

+
GFileInfo *         g_file_query_filesystem_info        (GFile *file,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Similar to g_file_query_info(), but obtains information +about the filesystem the file is on, rather than the file itself. +For instance the amount of space available and the type of +the filesystem. +

+

+The attribute value is a string that specifies the file attributes that +should be gathered. It is not an error if it's not possible to read a particular +requested attribute from a file - it just won't be set. attribute should +be a comma-separated list of attribute or attribute wildcards. The wildcard "*" +means all attributes, and a wildcard like "fs:*" means all attributes in the fs +namespace. The standard namespace for filesystem attributes is "fs". +Common attributes of interest are G_FILE_ATTRIBUTE_FILESYSTEM_SIZE +(the total size of the filesystem in bytes), G_FILE_ATTRIBUTE_FILESYSTEM_FREE (number of +bytes available), and G_FILE_ATTRIBUTE_FILESYSTEM_TYPE (type of the filesystem). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. +Other errors are possible too, and depend on what kind of filesystem the file is on.

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

file :

input GFile. +

attributes :

an attribute query string. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError. +

Returns :

a GFileInfo or NULL if there was an error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_query_filesystem_info_async ()

+
void                g_file_query_filesystem_info_async  (GFile *file,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously gets the requested information about the filesystem +that the specified file is on. The result is a GFileInfo object +that contains key-value attributes (such as type or size for the +file). +

+

+For more details, see g_file_query_filesystem_info() which is the +synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can +then call g_file_query_info_finish() to get the result of the +operation.

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

file :

input GFile. +

attributes :

an attribute query string. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_query_filesystem_info_finish ()

+
GFileInfo *         g_file_query_filesystem_info_finish (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous filesystem info query. See +g_file_query_filesystem_info_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError. +

Returns :

GFileInfo for given file or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_query_default_handler ()

+
GAppInfo *          g_file_query_default_handler        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Returns the GAppInfo that is registered as the default +application to handle the file specified by file. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

a GFile to open. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GAppInfo if the handle was found, NULL if there were errors. +When you are done with it, release it with g_object_unref() +
+
+
+
+

g_file_find_enclosing_mount ()

+
GMount *            g_file_find_enclosing_mount         (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Gets a GMount for the GFile. +

+

+If the GFileIface for file does not have a mount (e.g. possibly a +remote share), error will be set to G_IO_ERROR_NOT_FOUND and NULL +will be returned. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError. +

Returns :

a GMount where the file is located or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_find_enclosing_mount_async ()

+
void                g_file_find_enclosing_mount_async   (GFile *file,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously gets the mount for the file. +

+

+For more details, see g_file_find_enclosing_mount() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_find_enclosing_mount_finish() to get the result of the operation.

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

file :

a GFile +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_find_enclosing_mount_finish ()

+
GMount *            g_file_find_enclosing_mount_finish  (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous find mount request. +See g_file_find_enclosing_mount_async().

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

file :

a GFile +

res :

a GAsyncResult +

error :

a GError +

Returns :

GMount for given file or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_enumerate_children ()

+
GFileEnumerator *   g_file_enumerate_children           (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Gets the requested information about the files in a directory. The result +is a GFileEnumerator object that will give out GFileInfo objects for +all the files in the directory. +

+

+The attribute value is a string that specifies the file attributes that +should be gathered. It is not an error if it's not possible to read a particular +requested attribute from a file - it just won't be set. attribute should +be a comma-separated list of attribute or attribute wildcards. The wildcard "*" +means all attributes, and a wildcard like "standard::*" means all attributes in the standard +namespace. An example attribute query be "standard::*,owner::user". +The standard attributes are available as defines, like G_FILE_ATTRIBUTE_STANDARD_NAME. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. +If the file is not a directory, the G_FILE_ERROR_NOTDIR error will be returned. +Other errors are possible too.

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

file :

input GFile. +

attributes :

an attribute query string. +

flags :

a set of GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting. +

Returns :

A GFileEnumerator if successful, NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_enumerate_children_async ()

+
void                g_file_enumerate_children_async     (GFile *file,
+                                                         const char *attributes,
+                                                         GFileQueryInfoFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously gets the requested information about the files in a directory. The result +is a GFileEnumerator object that will give out GFileInfo objects for +all the files in the directory. +

+

+For more details, see g_file_enumerate_children() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_enumerate_children_finish() to get the result of the operation.

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

file :

input GFile. +

attributes :

an attribute query string. +

flags :

a set of GFileQueryInfoFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_enumerate_children_finish ()

+
GFileEnumerator *   g_file_enumerate_children_finish    (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an async enumerate children operation. +See g_file_enumerate_children_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError. +

Returns :

a GFileEnumerator or NULL if an error occurred. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_set_display_name ()

+
GFile *             g_file_set_display_name             (GFile *file,
+                                                         const char *display_name,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Renames file to the specified display name. +

+

+The display name is converted from UTF8 to the correct encoding for the target +filesystem if possible and the file is renamed to this. +

+

+If you want to implement a rename operation in the user interface the edit name +(G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME) should be used as the initial value in the rename +widget, and then the result after editing should be passed to g_file_set_display_name(). +

+

+On success the resulting converted filename is returned. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

display_name :

a string. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GFile specifying what file was renamed to, or NULL + if there was an error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_set_display_name_async ()

+
void                g_file_set_display_name_async       (GFile *file,
+                                                         const char *display_name,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously sets the display name for a given GFile. +

+

+For more details, see g_file_set_display_name() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_set_display_name_finish() to get the result of the operation.

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

file :

input GFile. +

display_name :

a string. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_set_display_name_finish ()

+
GFile *             g_file_set_display_name_finish      (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes setting a display name started with +g_file_set_display_name_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFile or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_delete ()

+
gboolean            g_file_delete                       (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Deletes a file. If the file is a directory, it will only be deleted if it +is empty. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the file was deleted. FALSE otherwise. +
+
+
+
+

g_file_trash ()

+
gboolean            g_file_trash                        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sends file to the "Trashcan", if possible. This is similar to +deleting it, but the user can recover it before emptying the trashcan. +Not all file systems support trashing, so this call can return the +G_IO_ERROR_NOT_SUPPORTED error. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

GFile to send to trash. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE on successful trash, FALSE otherwise. +
+
+
+
+

g_file_copy ()

+
gboolean            g_file_copy                         (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GFileProgressCallback progress_callback,
+                                                         gpointer progress_callback_data,
+                                                         GError **error);
+

+Copies the file source to the location specified by destination. +Can not handle recursive copies of directories. +

+

+If the flag G_FILE_COPY_OVERWRITE is specified an already +existing destination file is overwritten. +

+

+If the flag G_FILE_COPY_NOFOLLOW_SYMLINKS is specified then symlinks +will be copied as symlinks, otherwise the target of the +source symlink will be copied. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If progress_callback is not NULL, then the operation can be monitored by +setting this to a GFileProgressCallback function. progress_callback_data +will be passed to this function. It is guaranteed that this callback will +be called after all data has been transferred with the total number of bytes +copied during the operation. +

+

+If the source file does not exist then the G_IO_ERROR_NOT_FOUND +error is returned, independent on the status of the destination. +

+

+If G_FILE_COPY_OVERWRITE is not specified and the target exists, then the +error G_IO_ERROR_EXISTS is returned. +

+

+If trying to overwrite a file over a directory the G_IO_ERROR_IS_DIRECTORY +error is returned. If trying to overwrite a directory with a directory the +G_IO_ERROR_WOULD_MERGE error is returned. +

+

+If the source is a directory and the target does not exist, or G_FILE_COPY_OVERWRITE is +specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error +is returned. +

+

+If you are interested in copying the GFile object itself (not the on-disk +file), see g_file_dup().

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

source :

input GFile. +

destination :

destination GFile +

flags :

set of GFileCopyFlags +

cancellable :

optional GCancellable object, NULL to ignore. +

progress_callback :

function to callback with progress information +

progress_callback_data :

user data to pass to progress_callback +

error :

GError to set on error, or NULL +

Returns :

TRUE on success, FALSE otherwise. +
+
+
+
+

g_file_copy_async ()

+
void                g_file_copy_async                   (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GFileProgressCallback progress_callback,
+                                                         gpointer progress_callback_data,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Copies the file source to the location specified by destination +asynchronously. For details of the behaviour, see g_file_copy(). +

+

+If progress_callback is not NULL, then that function that will be called +just like in g_file_copy(), however the callback will run in the main loop, +not in the thread that is doing the I/O operation. +

+

+When the operation is finished, callback will be called. You can then call +g_file_copy_finish() to get the result of the operation.

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

source :

input GFile. +

destination :

destination GFile +

flags :

set of GFileCopyFlags +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

progress_callback :

function to callback with progress information +

progress_callback_data :

user data to pass to progress_callback +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_copy_finish ()

+
gboolean            g_file_copy_finish                  (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes copying the file started with +g_file_copy_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a TRUE on success, FALSE on error. +
+
+
+
+

g_file_move ()

+
gboolean            g_file_move                         (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GFileProgressCallback progress_callback,
+                                                         gpointer progress_callback_data,
+                                                         GError **error);
+

+Tries to move the file or directory source to the location specified by destination. +If native move operations are supported then this is used, otherwise a copy + delete +fallback is used. The native implementation may support moving directories (for instance +on moves inside the same filesystem), but the fallback code does not. +

+

+If the flag G_FILE_COPY_OVERWRITE is specified an already +existing destination file is overwritten. +

+

+If the flag G_FILE_COPY_NOFOLLOW_SYMLINKS is specified then symlinks +will be copied as symlinks, otherwise the target of the +source symlink will be copied. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If progress_callback is not NULL, then the operation can be monitored by +setting this to a GFileProgressCallback function. progress_callback_data +will be passed to this function. It is guaranteed that this callback will +be called after all data has been transferred with the total number of bytes +copied during the operation. +

+

+If the source file does not exist then the G_IO_ERROR_NOT_FOUND +error is returned, independent on the status of the destination. +

+

+If G_FILE_COPY_OVERWRITE is not specified and the target exists, then the +error G_IO_ERROR_EXISTS is returned. +

+

+If trying to overwrite a file over a directory the G_IO_ERROR_IS_DIRECTORY +error is returned. If trying to overwrite a directory with a directory the +G_IO_ERROR_WOULD_MERGE error is returned. +

+

+If the source is a directory and the target does not exist, or G_FILE_COPY_OVERWRITE is +specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error +may be returned (if the native move operation isn't available).

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

source :

GFile pointing to the source location. +

destination :

GFile pointing to the destination location. +

flags :

set of GFileCopyFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

progress_callback :

GFileProgressCallback function for updates. +

progress_callback_data :

gpointer to user data for the callback function. +

error :

GError for returning error conditions, or NULL +

Returns :

TRUE on successful move, FALSE otherwise. +
+
+
+
+

g_file_make_directory ()

+
gboolean            g_file_make_directory               (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Creates a directory. Note that this will only create a child directory of +the immediate parent directory of the path or URI given by the GFile. To +recursively create directories, see g_file_make_directory_with_parents(). +This function will fail if the parent directory does not exist, setting +error to G_IO_ERROR_NOT_FOUND. If the file system doesn't support creating +directories, this function will fail, setting error to +G_IO_ERROR_NOT_SUPPORTED. +

+

+For a local GFile the newly created directory will have the default +(current) ownership and permissions of the current process. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE on successful creation, FALSE otherwise. +
+
+
+
+

g_file_make_directory_with_parents ()

+
gboolean            g_file_make_directory_with_parents  (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Creates a directory and any parent directories that may not exist similar to +'mkdir -p'. If the file system does not support creating directories, this +function will fail, setting error to G_IO_ERROR_NOT_SUPPORTED. +

+

+For a local GFile the newly created directories will have the default +(current) ownership and permissions of the current process. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if all directories have been successfully created, FALSE +otherwise. + +
+

Since 2.18

+
+
+
+

g_file_make_symbolic_link ()

+
gboolean            g_file_make_symbolic_link           (GFile *file,
+                                                         const char *symlink_value,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Creates a symbolic link. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

symlink_value :

a string with the value of the new symlink. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError. +

Returns :

TRUE on the creation of a new symlink, FALSE otherwise. +
+
+
+
+

g_file_query_settable_attributes ()

+
GFileAttributeInfoList * g_file_query_settable_attributes
+                                                        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Obtain the list of settable attributes for the file. +

+

+Returns the type and full attribute name of all the attributes +that can be set on this file. This doesn't mean setting it will always +succeed though, you might get an access failure, or some specific +file may not support a specific attribute. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GFileAttributeInfoList describing the settable attributes. +When you are done with it, release it with g_file_attribute_info_list_unref() +
+
+
+
+

g_file_query_writable_namespaces ()

+
GFileAttributeInfoList * g_file_query_writable_namespaces
+                                                        (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Obtain the list of attribute namespaces where new attributes +can be created by a user. An example of this is extended +attributes (in the "xattr" namespace). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

a GFileAttributeInfoList describing the writable namespaces. +When you are done with it, release it with g_file_attribute_info_list_unref() +
+
+
+
+

g_file_set_attribute ()

+
gboolean            g_file_set_attribute                (GFile *file,
+                                                         const char *attribute,
+                                                         GFileAttributeType type,
+                                                         gpointer value_p,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets an attribute in the file with attribute name attribute to value. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

type :

The type of the attribute +

value_p :

a pointer to the value (or the pointer itself if the type is a pointer type) +

flags :

a set of GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was set, FALSE otherwise. +
+
+
+
+

g_file_set_attributes_from_info ()

+
gboolean            g_file_set_attributes_from_info     (GFile *file,
+                                                         GFileInfo *info,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to set all attributes in the GFileInfo on the target values, +not stopping on the first error. +

+

+If there is any error during this operation then error will be set to +the first error. Error on particular fields are flagged by setting +the "status" field in the attribute value to +G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING, which means you can also detect +further errors. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

info :

a GFileInfo. +

flags :

GFileQueryInfoFlags +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if there was any error, FALSE otherwise. +
+
+
+
+

g_file_set_attributes_async ()

+
void                g_file_set_attributes_async         (GFile *file,
+                                                         GFileInfo *info,
+                                                         GFileQueryInfoFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously sets the attributes of file with info. +

+

+For more details, see g_file_set_attributes_from_info() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_set_attributes_finish() to get the result of the operation.

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

file :

input GFile. +

info :

a GFileInfo. +

flags :

a GFileQueryInfoFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback. +

user_data :

a gpointer. +
+
+
+
+

g_file_set_attributes_finish ()

+
gboolean            g_file_set_attributes_finish        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GFileInfo **info,
+                                                         GError **error);
+

+Finishes setting an attribute started in g_file_set_attributes_async().

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

file :

input GFile. +

result :

a GAsyncResult. +

info :

a GFileInfo. +

error :

a GError, or NULL +

Returns :

TRUE if the attributes were set correctly, FALSE otherwise. +
+
+
+
+

g_file_set_attribute_string ()

+
gboolean            g_file_set_attribute_string         (GFile *file,
+                                                         const char *attribute,
+                                                         const char *value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets attribute of type G_FILE_ATTRIBUTE_TYPE_STRING to value. +If attribute is of a different type, this operation will fail. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

value :

a string containing the attribute's value. +

flags :

GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was successfully set, FALSE otherwise. +
+
+
+
+

g_file_set_attribute_byte_string ()

+
gboolean            g_file_set_attribute_byte_string    (GFile *file,
+                                                         const char *attribute,
+                                                         const char *value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets attribute of type G_FILE_ATTRIBUTE_TYPE_BYTE_STRING to value. +If attribute is of a different type, this operation will fail, +returning FALSE. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

value :

a string containing the attribute's new value. +

flags :

a GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was successfully set to value +in the file, FALSE otherwise. +
+
+
+
+

g_file_set_attribute_uint32 ()

+
gboolean            g_file_set_attribute_uint32         (GFile *file,
+                                                         const char *attribute,
+                                                         guint32 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets attribute of type G_FILE_ATTRIBUTE_TYPE_UINT32 to value. +If attribute is of a different type, this operation will fail. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

value :

a guint32 containing the attribute's new value. +

flags :

a GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was successfully set to value +in the file, FALSE otherwise. +
+
+
+
+

g_file_set_attribute_int32 ()

+
gboolean            g_file_set_attribute_int32          (GFile *file,
+                                                         const char *attribute,
+                                                         gint32 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets attribute of type G_FILE_ATTRIBUTE_TYPE_INT32 to value. +If attribute is of a different type, this operation will fail. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

value :

a gint32 containing the attribute's new value. +

flags :

a GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was successfully set to value +in the file, FALSE otherwise. +
+
+
+
+

g_file_set_attribute_uint64 ()

+
gboolean            g_file_set_attribute_uint64         (GFile *file,
+                                                         const char *attribute,
+                                                         guint64 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets attribute of type G_FILE_ATTRIBUTE_TYPE_UINT64 to value. +If attribute is of a different type, this operation will fail. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

value :

a guint64 containing the attribute's new value. +

flags :

a GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was successfully set to value +in the file, FALSE otherwise. +
+
+
+
+

g_file_set_attribute_int64 ()

+
gboolean            g_file_set_attribute_int64          (GFile *file,
+                                                         const char *attribute,
+                                                         gint64 value,
+                                                         GFileQueryInfoFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Sets attribute of type G_FILE_ATTRIBUTE_TYPE_INT64 to value. +If attribute is of a different type, this operation will fail. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

attribute :

a string containing the attribute's name. +

value :

a guint64 containing the attribute's new value. +

flags :

a GFileQueryInfoFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if the attribute was successfully set, FALSE otherwise. +
+
+
+
+

g_file_mount_mountable ()

+
void                g_file_mount_mountable              (GFile *file,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Mounts a file of type G_FILE_TYPE_MOUNTABLE. +Using mount_operation, you can request callbacks when, for instance, +passwords are needed during authentication. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+When the operation is finished, callback will be called. You can then call +g_file_mount_mountable_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation, or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_mount_mountable_finish ()

+
GFile *             g_file_mount_mountable_finish       (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes a mount operation. See g_file_mount_mountable() for details. +

+

+Finish an asynchronous mount operation that was started +with g_file_mount_mountable().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFile or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_unmount_mountable ()

+
void                g_file_unmount_mountable            (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+

Warning

+

g_file_unmount_mountable has been deprecated since version 2.22 and should not be used in newly-written code. Use g_file_unmount_mountable_with_operation() instead.

+
+

+Unmounts a file of type G_FILE_TYPE_MOUNTABLE. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+When the operation is finished, callback will be called. You can then call +g_file_unmount_mountable_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

flags affecting the operation +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_unmount_mountable_finish ()

+
gboolean            g_file_unmount_mountable_finish     (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+

Warning

+

g_file_unmount_mountable_finish has been deprecated since version 2.22 and should not be used in newly-written code. Use g_file_unmount_mountable_with_operation_finish() instead.

+
+

+Finishes an unmount operation, see g_file_unmount_mountable() for details. +

+

+Finish an asynchronous unmount operation that was started +with g_file_unmount_mountable().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the operation finished successfully. FALSE +otherwise. + +
+
+
+
+

g_file_unmount_mountable_with_operation ()

+
void                g_file_unmount_mountable_with_operation
+                                                        (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Unmounts a file of type G_FILE_TYPE_MOUNTABLE. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+When the operation is finished, callback will be called. You can then call +g_file_unmount_mountable_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation, or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_unmount_mountable_with_operation_finish ()

+
gboolean            g_file_unmount_mountable_with_operation_finish
+                                                        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an unmount operation, see g_file_unmount_mountable_with_operation() for details. +

+

+Finish an asynchronous unmount operation that was started +with g_file_unmount_mountable_with_operation().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the operation finished successfully. FALSE +otherwise. + +
+

Since 2.22

+
+
+
+

g_file_eject_mountable ()

+
void                g_file_eject_mountable              (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+

Warning

+

g_file_eject_mountable has been deprecated since version 2.22 and should not be used in newly-written code. Use g_file_eject_mountable_with_operation() instead.

+
+

+Starts an asynchronous eject on a mountable. +When this operation has completed, callback will be called with +user_user data, and the operation can be finalized with +g_file_eject_mountable_finish(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

flags :

flags affecting the operation +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_eject_mountable_finish ()

+
gboolean            g_file_eject_mountable_finish       (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+

Warning

+

g_file_eject_mountable_finish has been deprecated since version 2.22 and should not be used in newly-written code. Use g_file_eject_mountable_with_operation_finish() instead.

+
+

+Finishes an asynchronous eject operation started by +g_file_eject_mountable().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the file was ejected successfully. FALSE +otherwise. + +
+
+
+
+

g_file_eject_mountable_with_operation ()

+
void                g_file_eject_mountable_with_operation
+                                                        (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Starts an asynchronous eject on a mountable. +When this operation has completed, callback will be called with +user_user data, and the operation can be finalized with +g_file_eject_mountable_with_operation_finish(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation, or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_eject_mountable_with_operation_finish ()

+
gboolean            g_file_eject_mountable_with_operation_finish
+                                                        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an asynchronous eject operation started by +g_file_eject_mountable_with_operation().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the file was ejected successfully. FALSE +otherwise. + +
+

Since 2.22

+
+
+
+

g_file_start_mountable ()

+
void                g_file_start_mountable              (GFile *file,
+                                                         GDriveStartFlags flags,
+                                                         GMountOperation *start_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Starts a file of type G_FILE_TYPE_MOUNTABLE. +Using start_operation, you can request callbacks when, for instance, +passwords are needed during authentication. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+When the operation is finished, callback will be called. You can then call +g_file_mount_mountable_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

flags affecting the operation +

start_operation :

a GMountOperation, or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_start_mountable_finish ()

+
gboolean            g_file_start_mountable_finish       (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes a start operation. See g_file_start_mountable() for details. +

+

+Finish an asynchronous start operation that was started +with g_file_start_mountable().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the operation finished successfully. FALSE +otherwise. + +
+

Since 2.22

+
+
+
+

g_file_stop_mountable ()

+
void                g_file_stop_mountable               (GFile *file,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Stops a file of type G_FILE_TYPE_MOUNTABLE. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+When the operation is finished, callback will be called. You can then call +g_file_stop_mountable_finish() to get the result of the operation.

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

file :

input GFile. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation, or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_stop_mountable_finish ()

+
gboolean            g_file_stop_mountable_finish        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an stop operation, see g_file_stop_mountable() for details. +

+

+Finish an asynchronous stop operation that was started +with g_file_stop_mountable().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the operation finished successfully. FALSE +otherwise. + +
+

Since 2.22

+
+
+
+

g_file_poll_mountable ()

+
void                g_file_poll_mountable               (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Polls a file of type G_FILE_TYPE_MOUNTABLE. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+When the operation is finished, callback will be called. You can then call +g_file_mount_mountable_finish() to get the result of the operation.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_poll_mountable_finish ()

+
gboolean            g_file_poll_mountable_finish        (GFile *file,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes a poll operation. See g_file_poll_mountable() for details. +

+

+Finish an asynchronous poll operation that was polled +with g_file_poll_mountable().

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

file :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if the operation finished successfully. FALSE +otherwise. + +
+

Since 2.22

+
+
+
+

g_file_mount_enclosing_volume ()

+
void                g_file_mount_enclosing_volume       (GFile *location,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Starts a mount_operation, mounting the volume that contains the file location. +

+

+When this operation has completed, callback will be called with +user_user data, and the operation can be finalized with +g_file_mount_enclosing_volume_finish(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

location :

input GFile. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied, or NULL. +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_mount_enclosing_volume_finish ()

+
gboolean            g_file_mount_enclosing_volume_finish
+                                                        (GFile *location,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes a mount operation started by g_file_mount_enclosing_volume().

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

location :

input GFile. +

result :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

TRUE if successful. If an error +has occurred, this function will return FALSE and set error +appropriately if present. +
+
+
+
+

g_file_monitor_directory ()

+
GFileMonitor*       g_file_monitor_directory            (GFile *file,
+                                                         GFileMonitorFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Obtains a directory monitor for the given file. +This may fail if directory monitoring is not supported. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

flags :

a set of GFileMonitorFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL. +

Returns :

a GFileMonitor for the given file, or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_monitor_file ()

+
GFileMonitor*       g_file_monitor_file                 (GFile *file,
+                                                         GFileMonitorFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Obtains a file monitor for the given file. If no file notification +mechanism exists, then regular polling of the file is used. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

flags :

a set of GFileMonitorFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL. +

Returns :

a GFileMonitor for the given file, or NULL on error. + Free the returned object with g_object_unref(). +
+
+
+
+

g_file_monitor ()

+
GFileMonitor*       g_file_monitor                      (GFile *file,
+                                                         GFileMonitorFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Obtains a file or directory monitor for the given file, depending +on the type of the file. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile +

flags :

a set of GFileMonitorFlags +

cancellable :

optional GCancellable object, NULL to ignore +

error :

a GError, or NULL +

Returns :

a GFileMonitor for the given file, or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.18

+
+
+
+

g_file_load_contents ()

+
gboolean            g_file_load_contents                (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         char **contents,
+                                                         gsize *length,
+                                                         char **etag_out,
+                                                         GError **error);
+

+Loads the content of the file into memory. The data is always +zero-terminated, but this is not included in the resultant length. +The returned content should be freed with g_free() when no longer +needed. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

contents :

a location to place the contents of the file. +

length :

a location to place the length of the contents of the file, + or NULL if the length is not needed +

etag_out :

a location to place the current entity tag for the file, + or NULL if the entity tag is not needed +

error :

a GError, or NULL +

Returns :

TRUE if the file's contents were successfully loaded. +FALSE if there were errors. +
+
+
+
+

g_file_load_contents_async ()

+
void                g_file_load_contents_async          (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Starts an asynchronous load of the file's contents. +

+

+For more details, see g_file_load_contents() which is +the synchronous version of this call. +

+

+When the load operation has completed, callback will be called +with user data. To finish the operation, call +g_file_load_contents_finish() with the GAsyncResult returned by +the callback. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_load_contents_finish ()

+
gboolean            g_file_load_contents_finish         (GFile *file,
+                                                         GAsyncResult *res,
+                                                         char **contents,
+                                                         gsize *length,
+                                                         char **etag_out,
+                                                         GError **error);
+

+Finishes an asynchronous load of the file's contents. +The contents are placed in contents, and length is set to the +size of the contents string. The content should be freed with +g_free() when no longer needed. If etag_out is present, it will be +set to the new entity tag for the file.

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

file :

input GFile. +

res :

a GAsyncResult. +

contents :

a location to place the contents of the file. +

length :

a location to place the length of the contents of the file, + or NULL if the length is not needed +

etag_out :

a location to place the current entity tag for the file, + or NULL if the entity tag is not needed +

error :

a GError, or NULL +

Returns :

TRUE if the load was successful. If FALSE and error is +present, it will be set appropriately. +
+
+
+
+

g_file_load_partial_contents_async ()

+
void                g_file_load_partial_contents_async  (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GFileReadMoreCallback read_more_callback,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Reads the partial contents of a file. A GFileReadMoreCallback should be +used to stop reading from the file when appropriate, else this function +will behave exactly as g_file_load_contents_async(). This operation +can be finished by g_file_load_partial_contents_finish(). +

+

+Users of this function should be aware that user_data is passed to +both the read_more_callback and the callback. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

file :

input GFile. +

cancellable :

optional GCancellable object, NULL to ignore. +

read_more_callback :

a GFileReadMoreCallback to receive partial data and to specify whether further data should be read. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to the callback functions. +
+
+
+
+

g_file_load_partial_contents_finish ()

+
gboolean            g_file_load_partial_contents_finish (GFile *file,
+                                                         GAsyncResult *res,
+                                                         char **contents,
+                                                         gsize *length,
+                                                         char **etag_out,
+                                                         GError **error);
+

+Finishes an asynchronous partial load operation that was started +with g_file_load_partial_contents_async(). The data is always +zero-terminated, but this is not included in the resultant length. +The returned content should be freed with g_free() when no longer +needed.

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

file :

input GFile. +

res :

a GAsyncResult. +

contents :

a location to place the contents of the file. +

length :

a location to place the length of the contents of the file, + or NULL if the length is not needed +

etag_out :

a location to place the current entity tag for the file, + or NULL if the entity tag is not needed +

error :

a GError, or NULL +

Returns :

TRUE if the load was successful. If FALSE and error is +present, it will be set appropriately. +
+
+
+
+

g_file_replace_contents ()

+
gboolean            g_file_replace_contents             (GFile *file,
+                                                         const char *contents,
+                                                         gsize length,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         char **new_etag,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Replaces the contents of file with contents of length bytes. + +If etag is specified (not NULL) any existing file must have that etag, or +the error G_IO_ERROR_WRONG_ETAG will be returned. +

+

+If make_backup is TRUE, this function will attempt to make a backup of file. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+The returned new_etag can be used to verify that the file hasn't changed the +next time it is saved over.

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

file :

input GFile. +

contents :

a string containing the new contents for file. +

length :

the length of contents in bytes. +

etag :

the old entity tag + for the document, or NULL +

make_backup :

TRUE if a backup should be created. +

flags :

a set of GFileCreateFlags. +

new_etag :

a location to a new entity tag + for the document. This should be freed with g_free() when no longer + needed, or NULL +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, or NULL +

Returns :

TRUE if successful. If an error +has occurred, this function will return FALSE and set error +appropriately if present. +
+
+
+
+

g_file_replace_contents_async ()

+
void                g_file_replace_contents_async       (GFile *file,
+                                                         const char *contents,
+                                                         gsize length,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Starts an asynchronous replacement of file with the given +contents of length bytes. etag will replace the document's +current entity tag. +

+

+When this operation has completed, callback will be called with +user_user data, and the operation can be finalized with +g_file_replace_contents_finish(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If make_backup is TRUE, this function will attempt to +make a backup of file.

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

file :

input GFile. +

contents :

string of contents to replace the file with. +

length :

the length of contents in bytes. +

etag :

a new entity tag for the file, or NULL +

make_backup :

TRUE if a backup should be created. +

flags :

a set of GFileCreateFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_replace_contents_finish ()

+
gboolean            g_file_replace_contents_finish      (GFile *file,
+                                                         GAsyncResult *res,
+                                                         char **new_etag,
+                                                         GError **error);
+

+Finishes an asynchronous replace of the given file. See +g_file_replace_contents_async(). Sets new_etag to the new entity +tag for the document, if present.

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

file :

input GFile. +

res :

a GAsyncResult. +

new_etag :

a location of a new entity tag + for the document. This should be freed with g_free() when it is no + longer needed, or NULL +

error :

a GError, or NULL +

Returns :

TRUE on success, FALSE on failure. +
+
+
+
+

g_file_copy_attributes ()

+
gboolean            g_file_copy_attributes              (GFile *source,
+                                                         GFile *destination,
+                                                         GFileCopyFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Copies the file attributes from source to destination. +

+

+Normally only a subset of the file attributes are copied, +those that are copies in a normal file copy operation +(which for instance does not include e.g. owner). However +if G_FILE_COPY_ALL_METADATA is specified in flags, then +all the metadata that is possible to copy is copied. This +is useful when implementing move by copy + delete source.

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

source :

a GFile with attributes. +

destination :

a GFile to copy attributes to. +

flags :

a set of GFileCopyFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

TRUE if the attributes were copied successfully, FALSE otherwise. +
+
+
+
+

g_file_create_readwrite ()

+
GFileIOStream *     g_file_create_readwrite             (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Creates a new file and returns a stream for reading and writing to it. +The file must not already exist. +

+

+By default files created are generally readable by everyone, +but if you pass G_FILE_CREATE_PRIVATE in flags the file +will be made readable only to the current user, to the level that +is supported on the target filesystem. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If a file or directory with this name already exists the G_IO_ERROR_EXISTS +error will be returned. Some file systems don't allow all file names, +and may return an G_IO_ERROR_INVALID_FILENAME error, and if the name +is too long, G_IO_ERROR_FILENAME_TOO_LONG will be returned. Other errors +are possible too, and depend on what kind of filesystem the file is on. +

+

+Note that in many non-local file cases read and write streams are not +supported, so make sure you really need to do read and write streaming, +rather than just opening for reading or writing.

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

file :

a GFile +

flags :

a set of GFileCreateFlags +

cancellable :

optional GCancellable object, NULL to ignore +

error :

return location for a GError, or NULL +

Returns :

a GFileIOStream for the newly created file, or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_file_create_readwrite_async ()

+
void                g_file_create_readwrite_async       (GFile *file,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously creates a new file and returns a stream for reading and +writing to it. The file must not already exist. +

+

+For more details, see g_file_create_readwrite() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then +call g_file_create_readwrite_finish() to get the result of the operation.

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

file :

input GFile +

flags :

a set of GFileCreateFlags +

io_priority :

the I/O priority + of the request +

cancellable :

optional GCancellable object, NULL to ignore +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_create_readwrite_finish ()

+
GFileIOStream *     g_file_create_readwrite_finish      (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file create operation started with +g_file_create_readwrite_async().

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

file :

input GFile +

res :

a GAsyncResult +

error :

a GError, or NULL +

Returns :

a GFileIOStream or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_file_open_readwrite ()

+
GFileIOStream *     g_file_open_readwrite               (GFile *file,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Opens an existing file for reading and writing. The result is +a GFileIOStream that can be used to read and write the contents of the file. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +

+

+If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. +If the file is a directory, the G_IO_ERROR_IS_DIRECTORY error will be returned. +Other errors are possible too, and depend on what kind of filesystem the file is on. +Note that in many non-local file cases read and write streams are not supported, +so make sure you really need to do read and write streaming, rather than +just opening for reading or writing.

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

file :

GFile to open +

cancellable :

a GCancellable +

error :

a GError, or NULL +

Returns :

GFileIOStream or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_file_open_readwrite_async ()

+
void                g_file_open_readwrite_async         (GFile *file,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously opens file for reading and writing. +

+

+For more details, see g_file_open_readwrite() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then call +g_file_open_readwrite_finish() to get the result of the operation.

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

file :

input GFile. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_open_readwrite_finish ()

+
GFileIOStream *     g_file_open_readwrite_finish        (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file read operation started with +g_file_open_readwrite_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFileIOStream or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_file_replace_readwrite ()

+
GFileIOStream *     g_file_replace_readwrite            (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Returns an output stream for overwriting the file in readwrite mode, +possibly creating a backup copy of the file first. If the file doesn't +exist, it will be created. +

+

+For details about the behaviour, see g_file_replace() which does the same +thing but returns an output stream only. +

+

+Note that in many non-local file cases read and write streams are not +supported, so make sure you really need to do read and write streaming, +rather than just opening for reading or writing.

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

file :

a GFile +

etag :

an optional entity tag for the + current GFile, or NULL to ignore +

make_backup :

TRUE if a backup should be created +

flags :

a set of GFileCreateFlags +

cancellable :

optional GCancellable object, NULL to ignore +

error :

return location for a GError, or NULL +

Returns :

a GFileIOStream or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_file_replace_readwrite_async ()

+
void                g_file_replace_readwrite_async      (GFile *file,
+                                                         const char *etag,
+                                                         gboolean make_backup,
+                                                         GFileCreateFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously overwrites the file in read-write mode, replacing the +contents, possibly creating a backup copy of the file first. +

+

+For more details, see g_file_replace_readwrite() which is +the synchronous version of this call. +

+

+When the operation is finished, callback will be called. You can then +call g_file_replace_readwrite_finish() to get the result of the operation.

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

file :

input GFile. +

etag :

an entity tag for the + current GFile, or NULL to ignore. +

make_backup :

TRUE if a backup should be created. +

flags :

a set of GFileCreateFlags. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_replace_readwrite_finish ()

+
GFileIOStream *     g_file_replace_readwrite_finish     (GFile *file,
+                                                         GAsyncResult *res,
+                                                         GError **error);
+

+Finishes an asynchronous file replace operation started with +g_file_replace_readwrite_async().

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

file :

input GFile. +

res :

a GAsyncResult. +

error :

a GError, or NULL +

Returns :

a GFileIOStream, or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_file_supports_thread_contexts ()

+
gboolean            g_file_supports_thread_contexts     (GFile *file);
+

+Checks if file supports thread-default +contexts. If this returns FALSE, you cannot perform +asynchronous operations on file in a thread that has a +thread-default context.

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

file :

a GFile. +

Returns :

Whether or not file supports thread-default contexts. + +
+

Since 2.22

+
+
+
+

See Also

+GFileInfo, GFileEnumerator +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileDescriptorBased.html b/docs/reference/gio/html/GFileDescriptorBased.html new file mode 100644 index 0000000..1332aa5 --- /dev/null +++ b/docs/reference/gio/html/GFileDescriptorBased.html @@ -0,0 +1,142 @@ + + + + +GFileDescriptorBased + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileDescriptorBased

+

GFileDescriptorBased — Interface for file descriptor based IO

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileDescriptorBased;
+int                 g_file_descriptor_based_get_fd      (GFileDescriptorBased *fd_based);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GFileDescriptorBased
+
+
+
+

Prerequisites

+

+GFileDescriptorBased requires + GObject.

+
+
+

Description

+

+GFileDescriptorBased is implemented by streams (implementations of +GInputStream or GOutputStream) that are based on file descriptors.

+
+
+

Details

+
+

GFileDescriptorBased

+
typedef struct _GFileDescriptorBased GFileDescriptorBased;
+

+An interface for file descriptor based io objects.

+
+
+
+

g_file_descriptor_based_get_fd ()

+
int                 g_file_descriptor_based_get_fd      (GFileDescriptorBased *fd_based);
+

+Gets the underlying file descriptor.

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

fd_based :

a GFileDescriptorBased. +

Returns :

The file descriptor + +
+

Since 2.24

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileEnumerator.html b/docs/reference/gio/html/GFileEnumerator.html new file mode 100644 index 0000000..58476c8 --- /dev/null +++ b/docs/reference/gio/html/GFileEnumerator.html @@ -0,0 +1,538 @@ + + + + +GFileEnumerator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileEnumerator

+

GFileEnumerator — Enumerated Files Routines

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileEnumerator;
+GFileInfo *         g_file_enumerator_next_file         (GFileEnumerator *enumerator,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_file_enumerator_close             (GFileEnumerator *enumerator,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_enumerator_next_files_async  (GFileEnumerator *enumerator,
+                                                         int num_files,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GList *             g_file_enumerator_next_files_finish (GFileEnumerator *enumerator,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_file_enumerator_close_async       (GFileEnumerator *enumerator,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_file_enumerator_close_finish      (GFileEnumerator *enumerator,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_file_enumerator_is_closed         (GFileEnumerator *enumerator);
+gboolean            g_file_enumerator_has_pending       (GFileEnumerator *enumerator);
+void                g_file_enumerator_set_pending       (GFileEnumerator *enumerator,
+                                                         gboolean pending);
+GFile *             g_file_enumerator_get_container     (GFileEnumerator *enumerator);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GFileEnumerator
+
+
+
+

Properties

+
+  "container"                GFile*                : Write / Construct Only
+
+
+
+

Description

+

+GFileEnumerator allows you to operate on a set of GFiles, +returning a GFileInfo structure for each file enumerated (e.g. +g_file_enumerate_children() will return a GFileEnumerator for each +of the children within a directory). +

+

+To get the next file's information from a GFileEnumerator, use +g_file_enumerator_next_file() or its asynchronous version, +g_file_enumerator_next_files_async(). Note that the asynchronous +version will return a list of GFileInfos, whereas the +synchronous will only return the next file in the enumerator. +

+

+To close a GFileEnumerator, use g_file_enumerator_close(), or +its asynchronous version, g_file_enumerator_close_async(). Once +a GFileEnumerator is closed, no further actions may be performed +on it, and it should be freed with g_object_unref().

+
+
+

Details

+
+

GFileEnumerator

+
typedef struct _GFileEnumerator GFileEnumerator;
+

+A per matched file iterator.

+
++ +
+
+
+
+

g_file_enumerator_next_file ()

+
GFileInfo *         g_file_enumerator_next_file         (GFileEnumerator *enumerator,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Returns information for the next file in the enumerated object. +Will block until the information is available. The GFileInfo +returned from this function will contain attributes that match the +attribute string that was passed when the GFileEnumerator was created. +

+

+On error, returns NULL and sets error to the error. If the +enumerator is at the end, NULL will be returned and error will +be unset.

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

enumerator :

a GFileEnumerator. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

A GFileInfo or NULL on error or end of enumerator. + Free the returned object with g_object_unref() when no longer needed. +
+
+
+
+

g_file_enumerator_close ()

+
gboolean            g_file_enumerator_close             (GFileEnumerator *enumerator,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Releases all resources used by this enumerator, making the +enumerator return G_IO_ERROR_CLOSED on all calls. +

+

+This will be automatically called when the last reference +is dropped, but you might want to call this function to make +sure resources are released as early as possible.

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

enumerator :

a GFileEnumerator. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

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

g_file_enumerator_next_files_async ()

+
void                g_file_enumerator_next_files_async  (GFileEnumerator *enumerator,
+                                                         int num_files,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Request information for a number of files from the enumerator asynchronously. +When all i/o for the operation is finished the callback will be called with +the requested information. +

+

+The callback can be called with less than num_files files in case of error +or at the end of the enumerator. In case of a partial error the callback will +be called with any succeeding items and no error, and on the next request the +error will be reported. If a request is cancelled the callback will be called +with G_IO_ERROR_CANCELLED. +

+

+During an async request no other sync and async calls are allowed, and will +result in G_IO_ERROR_PENDING errors. +

+

+Any outstanding i/o request with higher priority (lower numerical value) will +be executed before an outstanding request with lower priority. Default +priority is G_PRIORITY_DEFAULT.

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

enumerator :

a GFileEnumerator. +

num_files :

the number of file info objects to request +

io_priority :

the io priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_enumerator_next_files_finish ()

+
GList *             g_file_enumerator_next_files_finish (GFileEnumerator *enumerator,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes the asynchronous operation started with g_file_enumerator_next_files_async().

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

enumerator :

a GFileEnumerator. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GList of GFileInfos. You must free the list with + g_list_free() and unref the infos with g_object_unref() when you're + done with them. +
+
+
+
+

g_file_enumerator_close_async ()

+
void                g_file_enumerator_close_async       (GFileEnumerator *enumerator,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously closes the file enumerator. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned in +g_file_enumerator_close_finish().

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

enumerator :

a GFileEnumerator. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_enumerator_close_finish ()

+
gboolean            g_file_enumerator_close_finish      (GFileEnumerator *enumerator,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes closing a file enumerator, started from g_file_enumerator_close_async(). +

+

+If the file enumerator was already closed when g_file_enumerator_close_async() +was called, then this function will report G_IO_ERROR_CLOSED in error, and +return FALSE. If the file enumerator had pending operation when the close +operation was started, then this function will report G_IO_ERROR_PENDING, and +return FALSE. If cancellable was not NULL, then the operation may have been +cancelled by triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be set, and FALSE will be +returned.

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

enumerator :

a GFileEnumerator. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if the close operation has finished successfully. +
+
+
+
+

g_file_enumerator_is_closed ()

+
gboolean            g_file_enumerator_is_closed         (GFileEnumerator *enumerator);
+

+Checks if the file enumerator has been closed.

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

enumerator :

a GFileEnumerator. +

Returns :

TRUE if the enumerator is closed. +
+
+
+
+

g_file_enumerator_has_pending ()

+
gboolean            g_file_enumerator_has_pending       (GFileEnumerator *enumerator);
+

+Checks if the file enumerator has pending operations.

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

enumerator :

a GFileEnumerator. +

Returns :

TRUE if the enumerator has pending operations. +
+
+
+
+

g_file_enumerator_set_pending ()

+
void                g_file_enumerator_set_pending       (GFileEnumerator *enumerator,
+                                                         gboolean pending);
+

+Sets the file enumerator as having pending operations.

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

enumerator :

a GFileEnumerator. +

pending :

a boolean value. +
+
+
+
+

g_file_enumerator_get_container ()

+
GFile *             g_file_enumerator_get_container     (GFileEnumerator *enumerator);
+

+Get the GFile container which is being enumerated.

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

enumerator :

a GFileEnumerator +

Returns :

the GFile which is being enumerated. + +
+

Since 2.18

+
+
+
+

Property Details

+
+

The "container" property

+
  "container"                GFile*                : Write / Construct Only
+

The container that is being enumerated.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileIOStream.html b/docs/reference/gio/html/GFileIOStream.html new file mode 100644 index 0000000..e266d8c --- /dev/null +++ b/docs/reference/gio/html/GFileIOStream.html @@ -0,0 +1,336 @@ + + + + +GFileIOStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileIOStream

+

GFileIOStream — File read and write streaming operations

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileIOStream;
+char *              g_file_io_stream_get_etag           (GFileIOStream *stream);
+GFileInfo *         g_file_io_stream_query_info         (GFileIOStream *stream,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_io_stream_query_info_async   (GFileIOStream *stream,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileInfo *         g_file_io_stream_query_info_finish  (GFileIOStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GIOStream
+         +----GFileIOStream
+
+
+
+

Implemented Interfaces

+

+GFileIOStream implements + GSeekable.

+
+
+

Description

+

+GFileIOStream provides io streams that both read and write to the same +file handle. +

+

+GFileIOStream implements GSeekable, which allows the io +stream to jump to arbitrary positions in the file and to truncate +the file, provided the filesystem of the file supports these +operations. +

+

+To find the position of a file io stream, use +g_seekable_tell(). +

+

+To find out if a file io stream supports seeking, use g_seekable_can_seek(). +To position a file io stream, use g_seekable_seek(). +To find out if a file io stream supports truncating, use +g_seekable_can_truncate(). To truncate a file io +stream, use g_seekable_truncate(). +

+

+The default implementation of all the GFileIOStream operations +and the implementation of GSeekable just call into the same operations +on the output stream.

+
+
+

Details

+
+

GFileIOStream

+
typedef struct _GFileIOStream GFileIOStream;
+

+A subclass of GIOStream for opened files. This adds +a few file-specific operations and seeking and truncating. +

+

+GFileIOStream implements GSeekable.

+
+
+
+

g_file_io_stream_get_etag ()

+
char *              g_file_io_stream_get_etag           (GFileIOStream *stream);
+

+Gets the entity tag for the file when it has been written. +This must be called after the stream has been written +and closed, as the etag can change while writing.

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

stream :

a GFileIOStream. +

Returns :

the entity tag for the stream. + +
+

Since 2.22

+
+
+
+

g_file_io_stream_query_info ()

+
GFileInfo *         g_file_io_stream_query_info         (GFileIOStream *stream,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Queries a file io stream for the given attributes. +This function blocks while querying the stream. For the asynchronous +version of this function, see g_file_io_stream_query_info_async(). +While the stream is blocked, the stream will set the pending flag +internally, and any other operations on the stream will fail with +G_IO_ERROR_PENDING. +

+

+Can fail if the stream was already closed (with error being set to +G_IO_ERROR_CLOSED), the stream has pending operations (with error being +set to G_IO_ERROR_PENDING), or if querying info is not supported for +the stream's interface (with error being set to G_IO_ERROR_NOT_SUPPORTED). I +all cases of failure, NULL will be returned. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be set, and NULL will +be returned.

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

stream :

a GFileIOStream. +

attributes :

a file attribute query string. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

a GFileInfo for the stream, or NULL on error. + +
+

Since 2.22

+
+
+
+

g_file_io_stream_query_info_async ()

+
void                g_file_io_stream_query_info_async   (GFileIOStream *stream,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously queries the stream for a GFileInfo. When completed, +callback will be called with a GAsyncResult which can be used to +finish the operation with g_file_io_stream_query_info_finish(). +

+

+For the synchronous version of this function, see +g_file_io_stream_query_info().

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

stream :

a GFileIOStream. +

attributes :

a file attribute query string. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_file_io_stream_query_info_finish ()

+
GFileInfo *         g_file_io_stream_query_info_finish  (GFileIOStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finalizes the asynchronous query started +by g_file_io_stream_query_info_async().

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

stream :

a GFileIOStream. +

result :

a GAsyncResult. +

error :

a GError, NULL to ignore. +

Returns :

A GFileInfo for the finished query. + +
+

Since 2.22

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileIcon.html b/docs/reference/gio/html/GFileIcon.html new file mode 100644 index 0000000..1a27370 --- /dev/null +++ b/docs/reference/gio/html/GFileIcon.html @@ -0,0 +1,180 @@ + + + + +GFileIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileIcon

+

GFileIcon — Icons pointing to an image file

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileIcon;
+GIcon *             g_file_icon_new                     (GFile *file);
+GFile *             g_file_icon_get_file                (GFileIcon *icon);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GFileIcon
+
+
+
+

Implemented Interfaces

+

+GFileIcon implements + GIcon and GLoadableIcon.

+
+
+

Properties

+
+  "file"                     GFile*                : Read / Write / Construct Only
+
+
+
+

Description

+

+GFileIcon specifies an icon by pointing to an image file +to be used as icon.

+
+
+

Details

+
+

GFileIcon

+
typedef struct _GFileIcon GFileIcon;
+

+Gets an icon for a GFile. Implements GLoadableIcon.

+
+
+
+

g_file_icon_new ()

+
GIcon *             g_file_icon_new                     (GFile *file);
+

+Creates a new icon for a file.

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

file :

a GFile. +

Returns :

a GIcon for the given file, or NULL on error. +
+
+
+
+

g_file_icon_get_file ()

+
GFile *             g_file_icon_get_file                (GFileIcon *icon);
+

+Gets the GFile associated with the given icon.

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

icon :

a GIcon. +

Returns :

a GFile, or NULL. +
+
+
+
+

Property Details

+
+

The "file" property

+
  "file"                     GFile*                : Read / Write / Construct Only
+

+The file containing the icon.

+
+
+
+

See Also

+GIcon, GLoadableIcon +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileInfo.html b/docs/reference/gio/html/GFileInfo.html new file mode 100644 index 0000000..08673a6 --- /dev/null +++ b/docs/reference/gio/html/GFileInfo.html @@ -0,0 +1,3001 @@ + + + + +GFileInfo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileInfo

+

GFileInfo — File Information and Attributes

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileAttributeMatcher;
+enum                GFileType;
+                    GFileInfo;
+#define             G_FILE_ATTRIBUTE_STANDARD_TYPE
+#define             G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN
+#define             G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP
+#define             G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK
+#define             G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL
+#define             G_FILE_ATTRIBUTE_STANDARD_NAME
+#define             G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME
+#define             G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME
+#define             G_FILE_ATTRIBUTE_STANDARD_COPY_NAME
+#define             G_FILE_ATTRIBUTE_STANDARD_ICON
+#define             G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE
+#define             G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE
+#define             G_FILE_ATTRIBUTE_STANDARD_SIZE
+#define             G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE
+#define             G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET
+#define             G_FILE_ATTRIBUTE_STANDARD_TARGET_URI
+#define             G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER
+#define             G_FILE_ATTRIBUTE_ETAG_VALUE
+#define             G_FILE_ATTRIBUTE_ID_FILE
+#define             G_FILE_ATTRIBUTE_ID_FILESYSTEM
+#define             G_FILE_ATTRIBUTE_ACCESS_CAN_READ
+#define             G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE
+#define             G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE
+#define             G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE
+#define             G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH
+#define             G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP
+#define             G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE
+#define             G_FILE_ATTRIBUTE_TIME_MODIFIED
+#define             G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC
+#define             G_FILE_ATTRIBUTE_TIME_ACCESS
+#define             G_FILE_ATTRIBUTE_TIME_ACCESS_USEC
+#define             G_FILE_ATTRIBUTE_TIME_CHANGED
+#define             G_FILE_ATTRIBUTE_TIME_CHANGED_USEC
+#define             G_FILE_ATTRIBUTE_TIME_CREATED
+#define             G_FILE_ATTRIBUTE_TIME_CREATED_USEC
+#define             G_FILE_ATTRIBUTE_UNIX_DEVICE
+#define             G_FILE_ATTRIBUTE_UNIX_INODE
+#define             G_FILE_ATTRIBUTE_UNIX_MODE
+#define             G_FILE_ATTRIBUTE_UNIX_NLINK
+#define             G_FILE_ATTRIBUTE_UNIX_UID
+#define             G_FILE_ATTRIBUTE_UNIX_GID
+#define             G_FILE_ATTRIBUTE_UNIX_RDEV
+#define             G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE
+#define             G_FILE_ATTRIBUTE_UNIX_BLOCKS
+#define             G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT
+#define             G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE
+#define             G_FILE_ATTRIBUTE_DOS_IS_SYSTEM
+#define             G_FILE_ATTRIBUTE_OWNER_USER
+#define             G_FILE_ATTRIBUTE_OWNER_USER_REAL
+#define             G_FILE_ATTRIBUTE_OWNER_GROUP
+#define             G_FILE_ATTRIBUTE_THUMBNAIL_PATH
+#define             G_FILE_ATTRIBUTE_THUMBNAILING_FAILED
+#define             G_FILE_ATTRIBUTE_PREVIEW_ICON
+#define             G_FILE_ATTRIBUTE_FILESYSTEM_SIZE
+#define             G_FILE_ATTRIBUTE_FILESYSTEM_FREE
+#define             G_FILE_ATTRIBUTE_FILESYSTEM_TYPE
+#define             G_FILE_ATTRIBUTE_FILESYSTEM_READONLY
+#define             G_FILE_ATTRIBUTE_GVFS_BACKEND
+#define             G_FILE_ATTRIBUTE_SELINUX_CONTEXT
+#define             G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT
+#define             G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW
+#define             G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION
+GFileInfo *         g_file_info_new                     (void);
+GFileInfo *         g_file_info_dup                     (GFileInfo *other);
+void                g_file_info_copy_into               (GFileInfo *src_info,
+                                                         GFileInfo *dest_info);
+gboolean            g_file_info_has_attribute           (GFileInfo *info,
+                                                         const char *attribute);
+gboolean            g_file_info_has_namespace           (GFileInfo *info,
+                                                         const char *name_space);
+char **             g_file_info_list_attributes         (GFileInfo *info,
+                                                         const char *name_space);
+GFileAttributeType  g_file_info_get_attribute_type      (GFileInfo *info,
+                                                         const char *attribute);
+void                g_file_info_remove_attribute        (GFileInfo *info,
+                                                         const char *attribute);
+char *              g_file_info_get_attribute_as_string (GFileInfo *info,
+                                                         const char *attribute);
+gboolean            g_file_info_get_attribute_data      (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GFileAttributeType *type,
+                                                         gpointer *value_pp,
+                                                         GFileAttributeStatus *status);
+GFileAttributeStatus  g_file_info_get_attribute_status  (GFileInfo *info,
+                                                         const char *attribute);
+const char *        g_file_info_get_attribute_string    (GFileInfo *info,
+                                                         const char *attribute);
+char **             g_file_info_get_attribute_stringv   (GFileInfo *info,
+                                                         const char *attribute);
+const char *        g_file_info_get_attribute_byte_string
+                                                        (GFileInfo *info,
+                                                         const char *attribute);
+gboolean            g_file_info_get_attribute_boolean   (GFileInfo *info,
+                                                         const char *attribute);
+guint32             g_file_info_get_attribute_uint32    (GFileInfo *info,
+                                                         const char *attribute);
+gint32              g_file_info_get_attribute_int32     (GFileInfo *info,
+                                                         const char *attribute);
+guint64             g_file_info_get_attribute_uint64    (GFileInfo *info,
+                                                         const char *attribute);
+gint64              g_file_info_get_attribute_int64     (GFileInfo *info,
+                                                         const char *attribute);
+GObject *           g_file_info_get_attribute_object    (GFileInfo *info,
+                                                         const char *attribute);
+void                g_file_info_set_attribute           (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GFileAttributeType type,
+                                                         gpointer value_p);
+gboolean            g_file_info_set_attribute_status    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GFileAttributeStatus status);
+void                g_file_info_set_attribute_string    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         const char *attr_value);
+void                g_file_info_set_attribute_stringv   (GFileInfo *info,
+                                                         const char *attribute,
+                                                         char **attr_value);
+void                g_file_info_set_attribute_byte_string
+                                                        (GFileInfo *info,
+                                                         const char *attribute,
+                                                         const char *attr_value);
+void                g_file_info_set_attribute_boolean   (GFileInfo *info,
+                                                         const char *attribute,
+                                                         gboolean attr_value);
+void                g_file_info_set_attribute_uint32    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         guint32 attr_value);
+void                g_file_info_set_attribute_int32     (GFileInfo *info,
+                                                         const char *attribute,
+                                                         gint32 attr_value);
+void                g_file_info_set_attribute_uint64    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         guint64 attr_value);
+void                g_file_info_set_attribute_int64     (GFileInfo *info,
+                                                         const char *attribute,
+                                                         gint64 attr_value);
+void                g_file_info_set_attribute_object    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GObject *attr_value);
+void                g_file_info_clear_status            (GFileInfo *info);
+GFileType           g_file_info_get_file_type           (GFileInfo *info);
+gboolean            g_file_info_get_is_hidden           (GFileInfo *info);
+gboolean            g_file_info_get_is_backup           (GFileInfo *info);
+gboolean            g_file_info_get_is_symlink          (GFileInfo *info);
+const char *        g_file_info_get_name                (GFileInfo *info);
+const char *        g_file_info_get_display_name        (GFileInfo *info);
+const char *        g_file_info_get_edit_name           (GFileInfo *info);
+GIcon *             g_file_info_get_icon                (GFileInfo *info);
+const char *        g_file_info_get_content_type        (GFileInfo *info);
+goffset             g_file_info_get_size                (GFileInfo *info);
+void                g_file_info_get_modification_time   (GFileInfo *info,
+                                                         GTimeVal *result);
+const char *        g_file_info_get_symlink_target      (GFileInfo *info);
+const char *        g_file_info_get_etag                (GFileInfo *info);
+gint32              g_file_info_get_sort_order          (GFileInfo *info);
+void                g_file_info_set_attribute_mask      (GFileInfo *info,
+                                                         GFileAttributeMatcher *mask);
+void                g_file_info_unset_attribute_mask    (GFileInfo *info);
+void                g_file_info_set_file_type           (GFileInfo *info,
+                                                         GFileType type);
+void                g_file_info_set_is_hidden           (GFileInfo *info,
+                                                         gboolean is_hidden);
+void                g_file_info_set_is_symlink          (GFileInfo *info,
+                                                         gboolean is_symlink);
+void                g_file_info_set_name                (GFileInfo *info,
+                                                         const char *name);
+void                g_file_info_set_display_name        (GFileInfo *info,
+                                                         const char *display_name);
+void                g_file_info_set_edit_name           (GFileInfo *info,
+                                                         const char *edit_name);
+void                g_file_info_set_icon                (GFileInfo *info,
+                                                         GIcon *icon);
+void                g_file_info_set_content_type        (GFileInfo *info,
+                                                         const char *content_type);
+void                g_file_info_set_size                (GFileInfo *info,
+                                                         goffset size);
+void                g_file_info_set_modification_time   (GFileInfo *info,
+                                                         GTimeVal *mtime);
+void                g_file_info_set_symlink_target      (GFileInfo *info,
+                                                         const char *symlink_target);
+void                g_file_info_set_sort_order          (GFileInfo *info,
+                                                         gint32 sort_order);
+GFileAttributeMatcher * g_file_attribute_matcher_new    (const char *attributes);
+GFileAttributeMatcher * g_file_attribute_matcher_ref    (GFileAttributeMatcher *matcher);
+void                g_file_attribute_matcher_unref      (GFileAttributeMatcher *matcher);
+gboolean            g_file_attribute_matcher_matches    (GFileAttributeMatcher *matcher,
+                                                         const char *attribute);
+gboolean            g_file_attribute_matcher_matches_only
+                                                        (GFileAttributeMatcher *matcher,
+                                                         const char *attribute);
+gboolean            g_file_attribute_matcher_enumerate_namespace
+                                                        (GFileAttributeMatcher *matcher,
+                                                         const char *ns);
+const char *        g_file_attribute_matcher_enumerate_next
+                                                        (GFileAttributeMatcher *matcher);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GFileInfo
+
+
+
+

Description

+

+Functionality for manipulating basic metadata for files. GFileInfo +implements methods for getting information that all files should +contain, and allows for manipulation of extended attributes. +

+

+See GFileAttribute for more +information on how GIO handles file attributes. +

+

+To obtain a GFileInfo for a GFile, use g_file_query_info() (or its +async variant). To obtain a GFileInfo for a file input or output +stream, use g_file_input_stream_query_info() or +g_file_output_stream_query_info() (or their async variants). +

+

+To change the actual attributes of a file, you should then set the +attribute in the GFileInfo and call g_file_set_attributes_from_info() +or g_file_set_attributes_async() on a GFile. +

+

+However, not all attributes can be changed in the file. For instance, +the actual size of a file cannot be changed via g_file_info_set_size(). +You may call g_file_query_settable_attributes() and +g_file_query_writable_namespaces() to discover the settable attributes +of a particular file at runtime. +

+

+GFileAttributeMatcher allows for searching through a GFileInfo for +attributes.

+
+
+

Details

+
+

GFileAttributeMatcher

+
typedef struct _GFileAttributeMatcher GFileAttributeMatcher;
+

+Determines if a string matches a file attribute.

+
+
+
+

enum GFileType

+
typedef enum {
+  G_FILE_TYPE_UNKNOWN = 0,
+  G_FILE_TYPE_REGULAR,
+  G_FILE_TYPE_DIRECTORY,
+  G_FILE_TYPE_SYMBOLIC_LINK,
+  G_FILE_TYPE_SPECIAL, /* socket, fifo, blockdev, chardev */
+  G_FILE_TYPE_SHORTCUT,
+  G_FILE_TYPE_MOUNTABLE
+} GFileType;
+
+

+Indicates the file's on-disk type.

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

G_FILE_TYPE_UNKNOWN

File's type is unknown. +

G_FILE_TYPE_REGULAR

File handle represents a regular file. +

G_FILE_TYPE_DIRECTORY

File handle represents a directory. +

G_FILE_TYPE_SYMBOLIC_LINK

File handle represents a symbolic link + (Unix systems). +

G_FILE_TYPE_SPECIAL

File is a "special" file, such as a socket, fifo, + block device, or character device. +

G_FILE_TYPE_SHORTCUT

File is a shortcut (Windows systems). +

G_FILE_TYPE_MOUNTABLE

File is a mountable location. +
+
+
+
+

GFileInfo

+
typedef struct _GFileInfo GFileInfo;
+

+Stores information about a file system object referenced by a GFile.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_TYPE

+
#define G_FILE_ATTRIBUTE_STANDARD_TYPE "standard::type"                     /* uint32 (GFileType) */
+
+

+A key in the "standard" namespace for storing file types. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32. +The value for this key should contain a GFileType.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN

+
#define G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "standard::is-hidden"           /* boolean */
+
+

+A key in the "standard" namespace for checking if a file is hidden. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP

+
#define G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP "standard::is-backup"           /* boolean */
+
+

+A key in the "standard" namespace for checking if a file is a backup file. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK

+
#define G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK "standard::is-symlink"         /* boolean */
+
+

+A key in the "standard" namespace for checking if the file is a symlink. +Typically the actual type is something else, if we followed the symlink +to get the type. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL

+
#define G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL "standard::is-virtual"         /* boolean */
+
+

+A key in the "standard" namespace for checking if a file is virtual. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_NAME

+
#define G_FILE_ATTRIBUTE_STANDARD_NAME "standard::name"                     /* byte string */
+
+

+A key in the "standard" namespace for getting the name of the file. +The name is the on-disk filename which may not be in any known encoding, +and can thus not be generally displayed as is. +Use G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME if you need to display the +name in a user interface. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BYTE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME

+
#define G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "standard::display-name"     /* string */
+
+

+A key in the "standard" namespace for getting the display name of the file. +A display name is guaranteed to be in UTF8 and can thus be displayed in +the UI. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME

+
#define G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME "standard::edit-name"           /* string */
+
+

+A key in the "standard" namespace for edit name of the file. +An edit name is similar to the display name, but it is meant to be +used when you want to rename the file in the UI. The display name +might contain information you don't want in the new filename (such as +"(invalid unicode)" if the filename was in an invalid encoding). +

+

+Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_COPY_NAME

+
#define G_FILE_ATTRIBUTE_STANDARD_COPY_NAME "standard::copy-name"           /* string */
+
+

+A key in the "standard" namespace for getting the copy name of the file. +The copy name is an optional version of the name. If available it's always +in UTF8, and corresponds directly to the original filename (only transcoded to +UTF8). This is useful if you want to copy the file to another filesystem that +might have a different encoding. If the filename is not a valid string in the +encoding selected for the filesystem it is in then the copy name will not be set. +

+

+Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_ICON

+
#define G_FILE_ATTRIBUTE_STANDARD_ICON "standard::icon"                     /* object (GIcon) */
+
+

+A key in the "standard" namespace for getting the icon for the file. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_OBJECT. +The value for this key should contain a GIcon.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE

+
#define G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "standard::content-type"     /* string */
+
+

+A key in the "standard" namespace for getting the content type of the file. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING. +The value for this key should contain a valid content type.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE

+
#define G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE "standard::fast-content-type" /* string */
+
+

+A key in the "standard" namespace for getting the fast content type. +The fast content type isn't as reliable as the regular one, as it +only uses the filename to guess it, but it is faster to calculate than the +regular content type. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_SIZE

+
#define G_FILE_ATTRIBUTE_STANDARD_SIZE "standard::size"                     /* uint64 */
+
+

+A key in the "standard" namespace for getting the file's size (in bytes). +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT64.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE

+
#define G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE "standard::allocated-size" /* uint64 */
+
+

+A key in the "standard" namespace for getting the amount of disk space +that is consumed by the file (in bytes). This will generally be larger +than the file size (due to block size overhead) but can occasionally be +smaller (for example, for sparse files). +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT64.

+

Since 2.20

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET

+
#define G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET "standard::symlink-target" /* byte string */
+
+

+A key in the "standard" namespace for getting the symlink target, if the file +is a symlink. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_BYTE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_TARGET_URI

+
#define G_FILE_ATTRIBUTE_STANDARD_TARGET_URI "standard::target-uri"         /* string */
+
+

+A key in the "standard" namespace for getting the target URI for the file, in +the case of G_FILE_TYPE_SHORTCUT or G_FILE_TYPE_MOUNTABLE files. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER

+
#define G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER "standard::sort-order"         /* int32  */
+
+

+A key in the "standard" namespace for setting the sort order of a file. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_INT32. +An example use would be in file managers, which would use this key +to set the order files are displayed. Files with smaller sort order +should be sorted first, and files without sort order as if sort order +was zero.

+
+
+
+

G_FILE_ATTRIBUTE_ETAG_VALUE

+
#define G_FILE_ATTRIBUTE_ETAG_VALUE "etag::value"                 /* string */
+
+

+A key in the "etag" namespace for getting the value of the file's +entity tag. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_ID_FILE

+
#define G_FILE_ATTRIBUTE_ID_FILE "id::file"                     /* string */
+
+

+A key in the "id" namespace for getting a file identifier. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING. +An example use would be during listing files, to avoid recursive +directory scanning.

+
+
+
+

G_FILE_ATTRIBUTE_ID_FILESYSTEM

+
#define G_FILE_ATTRIBUTE_ID_FILESYSTEM "id::filesystem"         /* string */
+
+

+A key in the "id" namespace for getting the file system identifier. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING. +An example use would be during drag and drop to see if the source +and target are on the same filesystem (default to move) or not (default +to copy).

+
+
+
+

G_FILE_ATTRIBUTE_ACCESS_CAN_READ

+
#define G_FILE_ATTRIBUTE_ACCESS_CAN_READ "access::can-read"       /* boolean */
+
+

+A key in the "access" namespace for getting read privileges. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN. +This attribute will be TRUE if the user is able to read the file.

+
+
+
+

G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE

+
#define G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE "access::can-write"     /* boolean */
+
+

+A key in the "access" namespace for getting write privileges. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN. +This attribute will be TRUE if the user is able to write to the file.

+
+
+
+

G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE

+
#define G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE "access::can-execute" /* boolean */
+
+

+A key in the "access" namespace for getting execution privileges. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN. +This attribute will be TRUE if the user is able to execute the file.

+
+
+
+

G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE

+
#define G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE "access::can-delete"   /* boolean */
+
+

+A key in the "access" namespace for checking deletion privileges. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN. +This attribute will be TRUE if the user is able to delete the file.

+
+
+
+

G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH

+
#define G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH "access::can-trash"     /* boolean */
+
+

+A key in the "access" namespace for checking trashing privileges. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN. +This attribute will be TRUE if the user is able to move the file to +the trash.

+
+
+
+

G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME

+
#define G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME "access::can-rename"   /* boolean */
+
+

+A key in the "access" namespace for checking renaming privileges. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN. +This attribute will be TRUE if the user is able to rename the file.

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT "mountable::can-mount"     /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) is mountable. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT "mountable::can-unmount" /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) is unmountable. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT "mountable::can-eject"     /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be ejected. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE "mountable::unix-device" /* uint32 */
+
+

+A key in the "mountable" namespace for getting the unix device. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE "mountable::unix-device-file" /* string */
+
+

+A key in the "mountable" namespace for getting the unix device file. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI "mountable::hal-udi"         /* string */
+
+

+A key in the "mountable" namespace for getting the HAL UDI for the mountable +file. Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL "mountable::can-poll"      /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be polled. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC "mountable::is-media-check-automatic"      /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) +is automatically polled for media. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START "mountable::can-start"     /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be started. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED "mountable::can-start-degraded"     /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be started +degraded. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP "mountable::can-stop"      /* boolean */
+
+

+A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be stopped. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE

+
#define G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE "mountable::start-stop-type" /* uint32 (GDriveStartStopType) */
+
+

+A key in the "mountable" namespace for getting the GDriveStartStopType. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+

Since 2.22

+
+
+
+

G_FILE_ATTRIBUTE_TIME_MODIFIED

+
#define G_FILE_ATTRIBUTE_TIME_MODIFIED "time::modified"           /* uint64 */
+
+

+A key in the "time" namespace for getting the time the file was last +modified. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT64, and contains the UNIX time since the +file was modified.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC

+
#define G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC "time::modified-usec" /* uint32 */
+
+

+A key in the "time" namespace for getting the miliseconds of the time +the file was last modified. This should be used in conjunction with +G_FILE_ATTRIBUTE_TIME_MODIFIED. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_ACCESS

+
#define G_FILE_ATTRIBUTE_TIME_ACCESS "time::access"               /* uint64 */
+
+

+A key in the "time" namespace for getting the time the file was last +accessed. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT64, and contains the UNIX time since the +file was last accessed.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_ACCESS_USEC

+
#define G_FILE_ATTRIBUTE_TIME_ACCESS_USEC "time::access-usec"     /* uint32 */
+
+

+A key in the "time" namespace for getting the microseconds of the time +the file was last accessed. This should be used in conjunction with +G_FILE_ATTRIBUTE_TIME_ACCESS. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_CHANGED

+
#define G_FILE_ATTRIBUTE_TIME_CHANGED "time::changed"             /* uint64 */
+
+

+A key in the "time" namespace for getting the time the file was last +changed. Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT64, +and contains the UNIX time since the file was last changed. +

+

+This corresponds to the traditional UNIX ctime.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_CHANGED_USEC

+
#define G_FILE_ATTRIBUTE_TIME_CHANGED_USEC "time::changed-usec"   /* uint32 */
+
+

+A key in the "time" namespace for getting the microseconds of the time +the file was last changed. This should be used in conjunction with +G_FILE_ATTRIBUTE_TIME_CHANGED. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_CREATED

+
#define G_FILE_ATTRIBUTE_TIME_CREATED "time::created"             /* uint64 */
+
+

+A key in the "time" namespace for getting the time the file was created. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT64, +and contains the UNIX time since the file was created. +

+

+This corresponds to the NTFS ctime.

+
+
+
+

G_FILE_ATTRIBUTE_TIME_CREATED_USEC

+
#define G_FILE_ATTRIBUTE_TIME_CREATED_USEC "time::created-usec"   /* uint32 */
+
+

+A key in the "time" namespace for getting the microseconds of the time +the file was created. This should be used in conjunction with +G_FILE_ATTRIBUTE_TIME_CREATED. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_DEVICE

+
#define G_FILE_ATTRIBUTE_UNIX_DEVICE "unix::device"               /* uint32 */
+
+

+A key in the "unix" namespace for getting the device id of the device the +file is located on (see stat() documentation). This attribute is only +available for UNIX file systems. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_INODE

+
#define G_FILE_ATTRIBUTE_UNIX_INODE "unix::inode"                 /* uint64 */
+
+

+A key in the "unix" namespace for getting the inode of the file. +This attribute is only available for UNIX file systems. Corresponding +GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT64.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_MODE

+
#define G_FILE_ATTRIBUTE_UNIX_MODE "unix::mode"                   /* uint32 */
+
+

+A key in the "unix" namespace for getting the mode of the file +(e.g. whether the file is a regular file, symlink, etc). See lstat() +documentation. This attribute is only available for UNIX file systems. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_NLINK

+
#define G_FILE_ATTRIBUTE_UNIX_NLINK "unix::nlink"                 /* uint32 */
+
+

+A key in the "unix" namespace for getting the number of hard links +for a file. See lstat() documentation. This attribute is only available +for UNIX file systems. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_UID

+
#define G_FILE_ATTRIBUTE_UNIX_UID "unix::uid"                     /* uint32 */
+
+

+A key in the "unix" namespace for getting the user ID for the file. +This attribute is only available for UNIX file systems. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_GID

+
#define G_FILE_ATTRIBUTE_UNIX_GID "unix::gid"                     /* uint32 */
+
+

+A key in the "unix" namespace for getting the group ID for the file. +This attribute is only available for UNIX file systems. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_RDEV

+
#define G_FILE_ATTRIBUTE_UNIX_RDEV "unix::rdev"                   /* uint32 */
+
+

+A key in the "unix" namespace for getting the device ID for the file +(if it is a special file). See lstat() documentation. This attribute +is only available for UNIX file systems. Corresponding GFileAttributeType +is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE

+
#define G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE "unix::block-size"       /* uint32 */
+
+

+A key in the "unix" namespace for getting the block size for the file +system. This attribute is only available for UNIX file systems. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_BLOCKS

+
#define G_FILE_ATTRIBUTE_UNIX_BLOCKS "unix::blocks"               /* uint64 */
+
+

+A key in the "unix" namespace for getting the number of blocks allocated +for the file. This attribute is only available for UNIX file systems. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT64.

+
+
+
+

G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT

+
#define G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT "unix::is-mountpoint" /* boolean */
+
+

+A key in the "unix" namespace for checking if the file represents a +UNIX mount point. This attribute is TRUE if the file is a UNIX mount +point. This attribute is only available for UNIX file systems. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE

+
#define G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE "dos::is-archive"         /* boolean */
+
+

+A key in the "dos" namespace for checking if the file's archive flag +is set. This attribute is TRUE if the archive flag is set. This attribute +is only available for DOS file systems. Corresponding GFileAttributeType +is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_DOS_IS_SYSTEM

+
#define G_FILE_ATTRIBUTE_DOS_IS_SYSTEM "dos::is-system"           /* boolean */
+
+

+A key in the "dos" namespace for checking if the file's backup flag +is set. This attribute is TRUE if the backup flag is set. This attribute +is only available for DOS file systems. Corresponding GFileAttributeType +is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_OWNER_USER

+
#define G_FILE_ATTRIBUTE_OWNER_USER "owner::user"                 /* string */
+
+

+A key in the "owner" namespace for getting the user name of the +file's owner. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_OWNER_USER_REAL

+
#define G_FILE_ATTRIBUTE_OWNER_USER_REAL "owner::user-real"       /* string */
+
+

+A key in the "owner" namespace for getting the real name of the +user that owns the file. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_OWNER_GROUP

+
#define G_FILE_ATTRIBUTE_OWNER_GROUP "owner::group"               /* string */
+
+

+A key in the "owner" namespace for getting the file owner's group. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_THUMBNAIL_PATH

+
#define G_FILE_ATTRIBUTE_THUMBNAIL_PATH "thumbnail::path"         /* bytestring */
+
+

+A key in the "thumbnail" namespace for getting the path to the thumbnail +image. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_BYTE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_THUMBNAILING_FAILED

+
#define G_FILE_ATTRIBUTE_THUMBNAILING_FAILED "thumbnail::failed"         /* boolean */
+
+

+A key in the "thumbnail" namespace for checking if thumbnailing failed. +This attribute is TRUE if thumbnailing failed. Corresponding +GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_PREVIEW_ICON

+
#define G_FILE_ATTRIBUTE_PREVIEW_ICON "preview::icon"         /* object (GIcon) */
+
+

+A key in the "preview" namespace for getting a GIcon that can be +used to get preview of the file. For example, it may be a low +resolution thumbnail without metadata. Corresponding +GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_OBJECT. The value +for this key should contain a GIcon.

+

Since 2.20

+
+
+
+

G_FILE_ATTRIBUTE_FILESYSTEM_SIZE

+
#define G_FILE_ATTRIBUTE_FILESYSTEM_SIZE "filesystem::size"                       /* uint64 */
+
+

+A key in the "filesystem" namespace for getting the total size (in bytes) of the file system, +used in g_file_query_filesystem_info(). Corresponding GFileAttributeType +is G_FILE_ATTRIBUTE_TYPE_UINT64.

+
+
+
+

G_FILE_ATTRIBUTE_FILESYSTEM_FREE

+
#define G_FILE_ATTRIBUTE_FILESYSTEM_FREE "filesystem::free"                       /* uint64 */
+
+

+A key in the "filesystem" namespace for getting the number of bytes of free space left on the +file system. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_UINT64.

+
+
+
+

G_FILE_ATTRIBUTE_FILESYSTEM_TYPE

+
#define G_FILE_ATTRIBUTE_FILESYSTEM_TYPE "filesystem::type"                       /* string */
+
+

+A key in the "filesystem" namespace for getting the file system's type. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_FILESYSTEM_READONLY

+
#define G_FILE_ATTRIBUTE_FILESYSTEM_READONLY "filesystem::readonly"               /* boolean */
+
+

+A key in the "filesystem" namespace for checking if the file system +is read only. Is set to TRUE if the file system is read only. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_BOOLEAN.

+
+
+
+

G_FILE_ATTRIBUTE_GVFS_BACKEND

+
#define G_FILE_ATTRIBUTE_GVFS_BACKEND "gvfs::backend"             /* string */
+
+

+A key in the "gvfs" namespace that gets the name of the current +GVFS backend in use. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

G_FILE_ATTRIBUTE_SELINUX_CONTEXT

+
#define G_FILE_ATTRIBUTE_SELINUX_CONTEXT "selinux::context"       /* string */
+
+

+A key in the "selinux" namespace for getting the file's SELinux +context. Corresponding GFileAttributeType is +G_FILE_ATTRIBUTE_TYPE_STRING. Note that this attribute is only +available if GLib has been built with SELinux support.

+
+
+
+

G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT

+
#define G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT "trash::item-count"     /* uint32 */
+
+

+A key in the "trash" namespace. When requested against +"trash:///" returns the number of (toplevel) items in the trash folder. +Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_UINT32.

+
+
+
+

G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW

+
#define G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW "filesystem::use-preview"        /* uint32 (GFilesystemPreviewType) */
+
+

+A key in the "filesystem" namespace for hinting a file manager +application whether it should preview (e.g. thumbnail) files on the +file system. The value for this key contain a +GFilesystemPreviewType.

+
+
+
+

G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION

+
#define G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION "standard::description"        /* string */
+
+

+A key in the "standard" namespace for getting the description of the file. +The description is a utf8 string that describes the file, generally containing +the filename, but can also contain furter information. Example descriptions +could be "filename (on hostname)" for a remote file or "filename (in trash)" +for a file in the trash. This is useful for instance as the window title +when displaying a directory or for a bookmarks menu. +

+

+Corresponding GFileAttributeType is G_FILE_ATTRIBUTE_TYPE_STRING.

+
+
+
+

g_file_info_new ()

+
GFileInfo *         g_file_info_new                     (void);
+

+Creates a new file info structure.

+
++ + + + +

Returns :

a GFileInfo. +
+
+
+
+

g_file_info_dup ()

+
GFileInfo *         g_file_info_dup                     (GFileInfo *other);
+

+Duplicates a file info structure.

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

other :

a GFileInfo. +

Returns :

a duplicate GFileInfo of other. +
+
+
+
+

g_file_info_copy_into ()

+
void                g_file_info_copy_into               (GFileInfo *src_info,
+                                                         GFileInfo *dest_info);
+

+Copies all of the GFileAttributes from src_info to dest_info.

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

src_info :

source to copy attributes from. +

dest_info :

destination to copy attributes to. +
+
+
+
+

g_file_info_has_attribute ()

+
gboolean            g_file_info_has_attribute           (GFileInfo *info,
+                                                         const char *attribute);
+

+Checks if a file info structure has an attribute named attribute.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

TRUE if Ginfo has an attribute named attribute, + FALSE otherwise. +
+
+
+
+

g_file_info_has_namespace ()

+
gboolean            g_file_info_has_namespace           (GFileInfo *info,
+                                                         const char *name_space);
+

+Checks if a file info structure has an attribute in the +specified name_space.

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

info :

a GFileInfo. +

name_space :

a file attribute namespace. +

Returns :

TRUE if Ginfo has an attribute in name_space, + FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_file_info_list_attributes ()

+
char **             g_file_info_list_attributes         (GFileInfo *info,
+                                                         const char *name_space);
+

+Lists the file info structure's attributes.

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

info :

a GFileInfo. +

name_space :

a file attribute key's namespace. +

Returns :

a null-terminated array of strings of all of the +possible attribute types for the given name_space, or +NULL on error. +
+
+
+
+

g_file_info_get_attribute_type ()

+
GFileAttributeType  g_file_info_get_attribute_type      (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the attribute type for an attribute key.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

a GFileAttributeType for the given attribute, or +G_FILE_ATTRIBUTE_TYPE_INVALID if the key is not set. +
+
+
+
+

g_file_info_remove_attribute ()

+
void                g_file_info_remove_attribute        (GFileInfo *info,
+                                                         const char *attribute);
+

+Removes all cases of attribute from info if it exists.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +
+
+
+
+

g_file_info_get_attribute_as_string ()

+
char *              g_file_info_get_attribute_as_string (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the value of a attribute, formated as a string. +This escapes things as needed to make the string valid +utf8.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

a UTF-8 string associated with the given attribute. + When you're done with the string it must be freed with g_free(). +
+
+
+
+

g_file_info_get_attribute_data ()

+
gboolean            g_file_info_get_attribute_data      (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GFileAttributeType *type,
+                                                         gpointer *value_pp,
+                                                         GFileAttributeStatus *status);
+

+Gets the attribute type, value and status for an attribute key.

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

info :

a GFileInfo +

attribute :

a file attribute key +

type :

return location for the attribute type, or NULL +

value_pp :

return location for the attribute value, or NULL +

status :

return location for the attribute status, or NULL +

Returns :

TRUE if info has an attribute named attribute, + FALSE otherwise. +
+
+
+
+

g_file_info_get_attribute_status ()

+
GFileAttributeStatus  g_file_info_get_attribute_status  (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the attribute status for an attribute key.

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

info :

a GFileInfo +

attribute :

a file attribute key +

Returns :

a GFileAttributeStatus for the given attribute, or + G_FILE_ATTRIBUTE_STATUS_UNSET if the key is invalid. + +
+
+
+
+

g_file_info_get_attribute_string ()

+
const char *        g_file_info_get_attribute_string    (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the value of a string attribute. If the attribute does +not contain a string, NULL will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

the contents of the attribute value as a string, or +NULL otherwise. +
+
+
+
+

g_file_info_get_attribute_stringv ()

+
char **             g_file_info_get_attribute_stringv   (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the value of a stringv attribute. If the attribute does +not contain a stringv, NULL will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

the contents of the attribute value as a stringv, or +NULL otherwise. Do not free. + +
+

Since 2.22

+
+
+
+

g_file_info_get_attribute_byte_string ()

+
const char *        g_file_info_get_attribute_byte_string
+                                                        (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the value of a byte string attribute. If the attribute does +not contain a byte string, NULL will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

the contents of the attribute value as a byte string, or +NULL otherwise. +
+
+
+
+

g_file_info_get_attribute_boolean ()

+
gboolean            g_file_info_get_attribute_boolean   (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the value of a boolean attribute. If the attribute does not +contain a boolean value, FALSE will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

the boolean value contained within the attribute. +
+
+
+
+

g_file_info_get_attribute_uint32 ()

+
guint32             g_file_info_get_attribute_uint32    (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets an unsigned 32-bit integer contained within the attribute. If the +attribute does not contain an unsigned 32-bit integer, or is invalid, +0 will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

an unsigned 32-bit integer from the attribute. +
+
+
+
+

g_file_info_get_attribute_int32 ()

+
gint32              g_file_info_get_attribute_int32     (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets a signed 32-bit integer contained within the attribute. If the +attribute does not contain a signed 32-bit integer, or is invalid, +0 will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

a signed 32-bit integer from the attribute. +
+
+
+
+

g_file_info_get_attribute_uint64 ()

+
guint64             g_file_info_get_attribute_uint64    (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets a unsigned 64-bit integer contained within the attribute. If the +attribute does not contain an unsigned 64-bit integer, or is invalid, +0 will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

a unsigned 64-bit integer from the attribute. +
+
+
+
+

g_file_info_get_attribute_int64 ()

+
gint64              g_file_info_get_attribute_int64     (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets a signed 64-bit integer contained within the attribute. If the +attribute does not contain an signed 64-bit integer, or is invalid, +0 will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

a signed 64-bit integer from the attribute. +
+
+
+
+

g_file_info_get_attribute_object ()

+
GObject *           g_file_info_get_attribute_object    (GFileInfo *info,
+                                                         const char *attribute);
+

+Gets the value of a GObject attribute. If the attribute does +not contain a GObject, NULL will be returned.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

Returns :

a GObject associated with the given attribute, or +NULL otherwise. +
+
+
+
+

g_file_info_set_attribute ()

+
void                g_file_info_set_attribute           (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GFileAttributeType type,
+                                                         gpointer value_p);
+

+Sets the attribute to contain the given value, if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

type :

a GFileAttributeType +

value_p :

pointer to the value +
+
+
+
+

g_file_info_set_attribute_status ()

+
gboolean            g_file_info_set_attribute_status    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GFileAttributeStatus status);
+

+Sets the attribute status for an attribute key. This is only +needed by external code that implement g_file_set_attributes_from_info() +or similar functions. +

+

+The attribute must exist in info for this to work. Otherwise FALSE +is returned and info is unchanged.

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

info :

a GFileInfo +

attribute :

a file attribute key +

status :

a GFileAttributeStatus +

Returns :

TRUE if the status was changed, FALSE if the key was not set. + +
+

Since 2.22

+
+
+
+

g_file_info_set_attribute_string ()

+
void                g_file_info_set_attribute_string    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         const char *attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

a string. +
+
+
+
+

g_file_info_set_attribute_stringv ()

+
void                g_file_info_set_attribute_stringv   (GFileInfo *info,
+                                                         const char *attribute,
+                                                         char **attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible. +

+

+Sinze: 2.22

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

a NULL terminated string array +
+
+
+
+

g_file_info_set_attribute_byte_string ()

+
void                g_file_info_set_attribute_byte_string
+                                                        (GFileInfo *info,
+                                                         const char *attribute,
+                                                         const char *attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

a byte string. +
+
+
+
+

g_file_info_set_attribute_boolean ()

+
void                g_file_info_set_attribute_boolean   (GFileInfo *info,
+                                                         const char *attribute,
+                                                         gboolean attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

a boolean value. +
+
+
+
+

g_file_info_set_attribute_uint32 ()

+
void                g_file_info_set_attribute_uint32    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         guint32 attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

an unsigned 32-bit integer. +
+
+
+
+

g_file_info_set_attribute_int32 ()

+
void                g_file_info_set_attribute_int32     (GFileInfo *info,
+                                                         const char *attribute,
+                                                         gint32 attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

a signed 32-bit integer +
+
+
+
+

g_file_info_set_attribute_uint64 ()

+
void                g_file_info_set_attribute_uint64    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         guint64 attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

an unsigned 64-bit integer. +
+
+
+
+

g_file_info_set_attribute_int64 ()

+
void                g_file_info_set_attribute_int64     (GFileInfo *info,
+                                                         const char *attribute,
+                                                         gint64 attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

attribute name to set. +

attr_value :

int64 value to set attribute to. +
+
+
+
+

g_file_info_set_attribute_object ()

+
void                g_file_info_set_attribute_object    (GFileInfo *info,
+                                                         const char *attribute,
+                                                         GObject *attr_value);
+

+Sets the attribute to contain the given attr_value, +if possible.

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

info :

a GFileInfo. +

attribute :

a file attribute key. +

attr_value :

a GObject. +
+
+
+
+

g_file_info_clear_status ()

+
void                g_file_info_clear_status            (GFileInfo *info);
+

+Clears the status information from info.

+
++ + + + +

info :

a GFileInfo. +
+
+
+
+

g_file_info_get_file_type ()

+
GFileType           g_file_info_get_file_type           (GFileInfo *info);
+

+Gets a file's type (whether it is a regular file, symlink, etc). +This is different from the file's content type, see g_file_info_get_content_type().

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

info :

a GFileInfo. +

Returns :

a GFileType for the given file. +
+
+
+
+

g_file_info_get_is_hidden ()

+
gboolean            g_file_info_get_is_hidden           (GFileInfo *info);
+

+Checks if a file is hidden.

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

info :

a GFileInfo. +

Returns :

TRUE if the file is a hidden file, FALSE otherwise. +
+
+
+
+

g_file_info_get_is_backup ()

+
gboolean            g_file_info_get_is_backup           (GFileInfo *info);
+

+Checks if a file is a backup file.

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

info :

a GFileInfo. +

Returns :

TRUE if file is a backup file, FALSE otherwise. +
+
+
+
+

g_file_info_get_is_symlink ()

+
gboolean            g_file_info_get_is_symlink          (GFileInfo *info);
+

+Checks if a file is a symlink.

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

info :

a GFileInfo. +

Returns :

TRUE if the given info is a symlink. +
+
+
+
+

g_file_info_get_name ()

+
const char *        g_file_info_get_name                (GFileInfo *info);
+

+Gets the name for a file.

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

info :

a GFileInfo. +

Returns :

a string containing the file name. +
+
+
+
+

g_file_info_get_display_name ()

+
const char *        g_file_info_get_display_name        (GFileInfo *info);
+

+Gets a display name for a file.

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

info :

a GFileInfo. +

Returns :

a string containing the display name. +
+
+
+
+

g_file_info_get_edit_name ()

+
const char *        g_file_info_get_edit_name           (GFileInfo *info);
+

+Gets the edit name for a file.

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

info :

a GFileInfo. +

Returns :

a string containing the edit name. +
+
+
+
+

g_file_info_get_icon ()

+
GIcon *             g_file_info_get_icon                (GFileInfo *info);
+

+Gets the icon for a file.

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

info :

a GFileInfo. +

Returns :

GIcon for the given info. +
+
+
+
+

g_file_info_get_content_type ()

+
const char *        g_file_info_get_content_type        (GFileInfo *info);
+

+Gets the file's content type.

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

info :

a GFileInfo. +

Returns :

a string containing the file's content type. +
+
+
+
+

g_file_info_get_size ()

+
goffset             g_file_info_get_size                (GFileInfo *info);
+

+Gets the file's size.

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

info :

a GFileInfo. +

Returns :

a goffset containing the file's size. +
+
+
+
+

g_file_info_get_modification_time ()

+
void                g_file_info_get_modification_time   (GFileInfo *info,
+                                                         GTimeVal *result);
+

+Gets the modification time of the current info and sets it +in result.

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

info :

a GFileInfo. +

result :

a GTimeVal. +
+
+
+
+

g_file_info_get_symlink_target ()

+
const char *        g_file_info_get_symlink_target      (GFileInfo *info);
+

+Gets the symlink target for a given GFileInfo.

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

info :

a GFileInfo. +

Returns :

a string containing the symlink target. +
+
+
+
+

g_file_info_get_etag ()

+
const char *        g_file_info_get_etag                (GFileInfo *info);
+

+Gets the entity tag for a given +GFileInfo. See G_FILE_ATTRIBUTE_ETAG_VALUE.

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

info :

a GFileInfo. +

Returns :

a string containing the value of the "etag:value" attribute. +
+
+
+
+

g_file_info_get_sort_order ()

+
gint32              g_file_info_get_sort_order          (GFileInfo *info);
+

+Gets the value of the sort_order attribute from the GFileInfo. +See G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER.

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

info :

a GFileInfo. +

Returns :

a gint32 containing the value of the "standard::sort_order" attribute. +
+
+
+
+

g_file_info_set_attribute_mask ()

+
void                g_file_info_set_attribute_mask      (GFileInfo *info,
+                                                         GFileAttributeMatcher *mask);
+

+Sets mask on info to match specific attribute types.

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

info :

a GFileInfo. +

mask :

a GFileAttributeMatcher. +
+
+
+
+

g_file_info_unset_attribute_mask ()

+
void                g_file_info_unset_attribute_mask    (GFileInfo *info);
+

+Unsets a mask set by g_file_info_set_attribute_mask(), if one +is set.

+
++ + + + +

info :

GFileInfo. +
+
+
+
+

g_file_info_set_file_type ()

+
void                g_file_info_set_file_type           (GFileInfo *info,
+                                                         GFileType type);
+

+Sets the file type in a GFileInfo to type. +See G_FILE_ATTRIBUTE_STANDARD_TYPE.

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

info :

a GFileInfo. +

type :

a GFileType. +
+
+
+
+

g_file_info_set_is_hidden ()

+
void                g_file_info_set_is_hidden           (GFileInfo *info,
+                                                         gboolean is_hidden);
+

+Sets the "is_hidden" attribute in a GFileInfo according to is_symlink. +See G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN.

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

info :

a GFileInfo. +

is_hidden :

a gboolean. +
+
+
+
+

g_file_info_set_is_symlink ()

+
void                g_file_info_set_is_symlink          (GFileInfo *info,
+                                                         gboolean is_symlink);
+

+Sets the "is_symlink" attribute in a GFileInfo according to is_symlink. +See G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK.

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

info :

a GFileInfo. +

is_symlink :

a gboolean. +
+
+
+
+

g_file_info_set_name ()

+
void                g_file_info_set_name                (GFileInfo *info,
+                                                         const char *name);
+

+Sets the name attribute for the current GFileInfo. +See G_FILE_ATTRIBUTE_STANDARD_NAME.

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

info :

a GFileInfo. +

name :

a string containing a name. +
+
+
+
+

g_file_info_set_display_name ()

+
void                g_file_info_set_display_name        (GFileInfo *info,
+                                                         const char *display_name);
+

+Sets the display name for the current GFileInfo. +See G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME.

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

info :

a GFileInfo. +

display_name :

a string containing a display name. +
+
+
+
+

g_file_info_set_edit_name ()

+
void                g_file_info_set_edit_name           (GFileInfo *info,
+                                                         const char *edit_name);
+

+Sets the edit name for the current file. +See G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME.

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

info :

a GFileInfo. +

edit_name :

a string containing an edit name. +
+
+
+
+

g_file_info_set_icon ()

+
void                g_file_info_set_icon                (GFileInfo *info,
+                                                         GIcon *icon);
+

+Sets the icon for a given GFileInfo. +See G_FILE_ATTRIBUTE_STANDARD_ICON.

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

info :

a GFileInfo. +

icon :

a GIcon. +
+
+
+
+

g_file_info_set_content_type ()

+
void                g_file_info_set_content_type        (GFileInfo *info,
+                                                         const char *content_type);
+

+Sets the content type attribute for a given GFileInfo. +See G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE.

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

info :

a GFileInfo. +

content_type :

a content type. See GContentType. +
+
+
+
+

g_file_info_set_size ()

+
void                g_file_info_set_size                (GFileInfo *info,
+                                                         goffset size);
+

+Sets the G_FILE_ATTRIBUTE_STANDARD_SIZE attribute in the file info +to the given size.

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

info :

a GFileInfo. +

size :

a goffset containing the file's size. +
+
+
+
+

g_file_info_set_modification_time ()

+
void                g_file_info_set_modification_time   (GFileInfo *info,
+                                                         GTimeVal *mtime);
+

+Sets the G_FILE_ATTRIBUTE_TIME_MODIFIED attribute in the file +info to the given time value.

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

info :

a GFileInfo. +

mtime :

a GTimeVal. +
+
+
+
+

g_file_info_set_symlink_target ()

+
void                g_file_info_set_symlink_target      (GFileInfo *info,
+                                                         const char *symlink_target);
+

+Sets the G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET attribute in the file info +to the given symlink target.

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

info :

a GFileInfo. +

symlink_target :

a static string containing a path to a symlink target. +
+
+
+
+

g_file_info_set_sort_order ()

+
void                g_file_info_set_sort_order          (GFileInfo *info,
+                                                         gint32 sort_order);
+

+Sets the sort order attribute in the file info structure. See +G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER.

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

info :

a GFileInfo. +

sort_order :

a sort order integer. +
+
+
+
+

g_file_attribute_matcher_new ()

+
GFileAttributeMatcher * g_file_attribute_matcher_new    (const char *attributes);
+

+Creates a new file attribute matcher, which matches attributes +against a given string. GFileAttributeMatchers are reference +counted structures, and are created with a reference count of 1. If +the number of references falls to 0, the GFileAttributeMatcher is +automatically destroyed. +

+

+The attribute string should be formatted with specific keys separated +from namespaces with a double colon. Several "namespace::key" strings may be +concatenated with a single comma (e.g. "standard::type,standard::is-hidden"). +The wildcard "*" may be used to match all keys and namespaces, or +"namespace::*" will match all keys in a given namespace. +

+

+Examples of strings to use: +

+
+

Table 3. File Attribute Matcher strings and results

+
++++ + + + + + + + + + + + + + + + + + + +
Matcher String Matches
"*"matches all attributes.
"standard::is-hidden"matches only the key is-hidden in the standard namespace.
"standard::type,unix::*"matches the type key in the standard namespace and +all keys in the unix namespace.
+
+


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

attributes :

an attribute string to match. +

Returns :

a GFileAttributeMatcher. +
+
+
+
+

g_file_attribute_matcher_ref ()

+
GFileAttributeMatcher * g_file_attribute_matcher_ref    (GFileAttributeMatcher *matcher);
+

+References a file attribute matcher.

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

matcher :

a GFileAttributeMatcher. +

Returns :

a GFileAttributeMatcher. +
+
+
+
+

g_file_attribute_matcher_unref ()

+
void                g_file_attribute_matcher_unref      (GFileAttributeMatcher *matcher);
+

+Unreferences matcher. If the reference count falls below 1, +the matcher is automatically freed.

+
++ + + + +

matcher :

a GFileAttributeMatcher. +
+
+
+
+

g_file_attribute_matcher_matches ()

+
gboolean            g_file_attribute_matcher_matches    (GFileAttributeMatcher *matcher,
+                                                         const char *attribute);
+

+Checks if an attribute will be matched by an attribute matcher. If +the matcher was created with the "*" matching string, this function +will always return TRUE.

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

matcher :

a GFileAttributeMatcher. +

attribute :

a file attribute key. +

Returns :

TRUE if attribute matches matcher. FALSE otherwise. +
+
+
+
+

g_file_attribute_matcher_matches_only ()

+
gboolean            g_file_attribute_matcher_matches_only
+                                                        (GFileAttributeMatcher *matcher,
+                                                         const char *attribute);
+

+Checks if a attribute matcher only matches a given attribute. Always +returns FALSE if "*" was used when creating the matcher.

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

matcher :

a GFileAttributeMatcher. +

attribute :

a file attribute key. +

Returns :

TRUE if the matcher only matches attribute. FALSE otherwise. +
+
+
+
+

g_file_attribute_matcher_enumerate_namespace ()

+
gboolean            g_file_attribute_matcher_enumerate_namespace
+                                                        (GFileAttributeMatcher *matcher,
+                                                         const char *ns);
+

+Checks if the matcher will match all of the keys in a given namespace. +This will always return TRUE if a wildcard character is in use (e.g. if +matcher was created with "standard::*" and ns is "standard", or if matcher was created +using "*" and namespace is anything.) +

+

+TODO: this is awkwardly worded.

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

matcher :

a GFileAttributeMatcher. +

ns :

a string containing a file attribute namespace. +

Returns :

TRUE if the matcher matches all of the entries +in the given ns, FALSE otherwise. +
+
+
+
+

g_file_attribute_matcher_enumerate_next ()

+
const char *        g_file_attribute_matcher_enumerate_next
+                                                        (GFileAttributeMatcher *matcher);
+

+Gets the next matched attribute from a GFileAttributeMatcher.

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

matcher :

a GFileAttributeMatcher. +

Returns :

a string containing the next attribute or NULL if +no more attribute exist. +
+
+
+
+

See Also

+GFile, GFileAttribute +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileInputStream.html b/docs/reference/gio/html/GFileInputStream.html new file mode 100644 index 0000000..384480e --- /dev/null +++ b/docs/reference/gio/html/GFileInputStream.html @@ -0,0 +1,287 @@ + + + + +GFileInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileInputStream

+

GFileInputStream — File input streaming operations

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileInputStream;
+GFileInfo *         g_file_input_stream_query_info      (GFileInputStream *stream,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_input_stream_query_info_async
+                                                        (GFileInputStream *stream,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileInfo *         g_file_input_stream_query_info_finish
+                                                        (GFileInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GFileInputStream
+
+
+
+

Implemented Interfaces

+

+GFileInputStream implements + GSeekable.

+
+
+

Description

+

+GFileInputStream provides input streams that take their +content from a file. +

+

+GFileInputStream implements GSeekable, which allows the input +stream to jump to arbitrary positions in the file, provided the +filesystem of the file allows it. To find the position of a file +input stream, use g_seekable_tell(). To find out if a file input +stream supports seeking, use g_seekable_stream_can_seek(). +To position a file input stream, use g_seekable_seek().

+
+
+

Details

+
+

GFileInputStream

+
typedef struct _GFileInputStream GFileInputStream;
+

+A subclass of GInputStream for opened files. This adds +a few file-specific operations and seeking. +

+

+GFileInputStream implements GSeekable.

+
+
+
+

g_file_input_stream_query_info ()

+
GFileInfo *         g_file_input_stream_query_info      (GFileInputStream *stream,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Queries a file input stream the given attributes. This function blocks +while querying the stream. For the asynchronous (non-blocking) version +of this function, see g_file_input_stream_query_info_async(). While the +stream is blocked, the stream will set the pending flag internally, and +any other operations on the stream will fail with G_IO_ERROR_PENDING.

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

stream :

a GFileInputStream. +

attributes :

a file attribute query string. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GFileInfo, or NULL on error. +
+
+
+
+

g_file_input_stream_query_info_async ()

+
void                g_file_input_stream_query_info_async
+                                                        (GFileInputStream *stream,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Queries the stream information asynchronously. +When the operation is finished callback will be called. +You can then call g_file_input_stream_query_info_finish() +to get the result of the operation. +

+

+For the synchronous version of this function, +see g_file_input_stream_query_info(). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be set

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

stream :

a GFileInputStream. +

attributes :

a file attribute query string. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_input_stream_query_info_finish ()

+
GFileInfo *         g_file_input_stream_query_info_finish
+                                                        (GFileInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an asynchronous info query operation.

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

stream :

a GFileInputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, + or NULL to ignore. +

Returns :

GFileInfo. +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileMonitor.html b/docs/reference/gio/html/GFileMonitor.html new file mode 100644 index 0000000..df9ad1c --- /dev/null +++ b/docs/reference/gio/html/GFileMonitor.html @@ -0,0 +1,375 @@ + + + + +GFileMonitor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileMonitor

+

GFileMonitor — File Monitor

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+enum                GFileMonitorEvent;
+                    GFileMonitor;
+gboolean            g_file_monitor_cancel               (GFileMonitor *monitor);
+gboolean            g_file_monitor_is_cancelled         (GFileMonitor *monitor);
+void                g_file_monitor_set_rate_limit       (GFileMonitor *monitor,
+                                                         int limit_msecs);
+void                g_file_monitor_emit_event           (GFileMonitor *monitor,
+                                                         GFile *child,
+                                                         GFile *other_file,
+                                                         GFileMonitorEvent event_type);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GFileMonitor
+
+
+
+

Properties

+
+  "cancelled"                gboolean              : Read
+  "rate-limit"               gint                  : Read / Write
+
+
+
+

Signals

+
+  "changed"                                        : Run Last
+
+
+
+

Description

+

+Monitors a file or directory for changes. +

+

+To obtain a GFileMonitor for a file or directory, use +g_file_monitor(), g_file_monitor_file(), or +g_file_monitor_directory(). +

+

+To get informed about changes to the file or directory you are +monitoring, connect to the "changed" signal. The +signal will be emitted in the thread-default main +context of the thread that the monitor was created in +(though if the global default main context is blocked, this may +cause notifications to be blocked even if the thread-default +context is still running).

+
+
+

Details

+
+

enum GFileMonitorEvent

+
typedef enum {
+  G_FILE_MONITOR_EVENT_CHANGED,
+  G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT,
+  G_FILE_MONITOR_EVENT_DELETED,
+  G_FILE_MONITOR_EVENT_CREATED,
+  G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED,
+  G_FILE_MONITOR_EVENT_PRE_UNMOUNT,
+  G_FILE_MONITOR_EVENT_UNMOUNTED,
+  G_FILE_MONITOR_EVENT_MOVED
+} GFileMonitorEvent;
+
+

+Specifies what type of event a monitor event is.

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

G_FILE_MONITOR_EVENT_CHANGED

a file changed. +

G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT

a hint that this was probably the last change in a set of changes. +

G_FILE_MONITOR_EVENT_DELETED

a file was deleted. +

G_FILE_MONITOR_EVENT_CREATED

a file was created. +

G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED

a file attribute was changed. +

G_FILE_MONITOR_EVENT_PRE_UNMOUNT

the file location will soon be unmounted. +

G_FILE_MONITOR_EVENT_UNMOUNTED

the file location was unmounted. +

G_FILE_MONITOR_EVENT_MOVED

the file was moved. +
+
+
+
+

GFileMonitor

+
typedef struct _GFileMonitor GFileMonitor;
+

+Watches for changes to a file.

+
+
+
+

g_file_monitor_cancel ()

+
gboolean            g_file_monitor_cancel               (GFileMonitor *monitor);
+

+Cancels a file monitor.

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

monitor :

a GFileMonitor. +

Returns :

TRUE if monitor was cancelled. +
+
+
+
+

g_file_monitor_is_cancelled ()

+
gboolean            g_file_monitor_is_cancelled         (GFileMonitor *monitor);
+

+Returns whether the monitor is canceled.

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

monitor :

a GFileMonitor +

Returns :

TRUE if monitor is canceled. FALSE otherwise. +
+
+
+
+

g_file_monitor_set_rate_limit ()

+
void                g_file_monitor_set_rate_limit       (GFileMonitor *monitor,
+                                                         int limit_msecs);
+

+Sets the rate limit to which the monitor will report +consecutive change events to the same file.

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

monitor :

a GFileMonitor. +

limit_msecs :

a integer with the limit in milliseconds to +poll for changes. +
+
+
+
+

g_file_monitor_emit_event ()

+
void                g_file_monitor_emit_event           (GFileMonitor *monitor,
+                                                         GFile *child,
+                                                         GFile *other_file,
+                                                         GFileMonitorEvent event_type);
+

+Emits the "changed" signal if a change +has taken place. Should be called from file monitor +implementations only. +

+

+The signal will be emitted from an idle handler (in the thread-default main +context).

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

monitor :

a GFileMonitor. +

child :

a GFile. +

other_file :

a GFile. +

event_type :

a set of GFileMonitorEvent flags. +
+
+
+
+

Property Details

+
+

The "cancelled" property

+
  "cancelled"                gboolean              : Read
+

Whether the monitor has been cancelled.

+

Default value: FALSE

+
+
+
+

The "rate-limit" property

+
  "rate-limit"               gint                  : Read / Write
+

The limit of the monitor to watch for changes, in milliseconds.

+

Allowed values: >= 0

+

Default value: 800

+
+
+
+

Signal Details

+
+

The "changed" signal

+
void                user_function                      (GFileMonitor     *monitor,
+                                                        GFile            *file,
+                                                        GFile            *other_file,
+                                                        GFileMonitorEvent event_type,
+                                                        gpointer          user_data)       : Run Last
+

+Emitted when a file has been changed.

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

monitor :

a GFileMonitor. +

file :

a GFile. +

other_file :

a GFile. +

event_type :

a GFileMonitorEvent. +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFileOutputStream.html b/docs/reference/gio/html/GFileOutputStream.html new file mode 100644 index 0000000..3d9d185 --- /dev/null +++ b/docs/reference/gio/html/GFileOutputStream.html @@ -0,0 +1,325 @@ + + + + +GFileOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileOutputStream

+

GFileOutputStream — File output streaming operations

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFileOutputStream;
+GFileInfo *         g_file_output_stream_query_info     (GFileOutputStream *stream,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_file_output_stream_query_info_async
+                                                        (GFileOutputStream *stream,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GFileInfo *         g_file_output_stream_query_info_finish
+                                                        (GFileOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+char *              g_file_output_stream_get_etag       (GFileOutputStream *stream);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GFileOutputStream
+
+
+
+

Implemented Interfaces

+

+GFileOutputStream implements + GSeekable.

+
+
+

Description

+

+GFileOutputStream provides output streams that write their +content to a file. +

+

+GFileOutputStream implements GSeekable, which allows the output +stream to jump to arbitrary positions in the file and to truncate +the file, provided the filesystem of the file supports these +operations. +

+

+To find the position of a file output stream, use g_seekable_tell(). +To find out if a file output stream supports seeking, use +g_seekable_can_seek().To position a file output stream, use +g_seekable_seek(). To find out if a file output stream supports +truncating, use g_seekable_can_truncate(). To truncate a file output +stream, use g_seekable_truncate().

+
+
+

Details

+
+

GFileOutputStream

+
typedef struct _GFileOutputStream GFileOutputStream;
+

+A subclass of GOutputStream for opened files. This adds +a few file-specific operations and seeking and truncating. +

+

+GFileOutputStream implements GSeekable.

+
+
+
+

g_file_output_stream_query_info ()

+
GFileInfo *         g_file_output_stream_query_info     (GFileOutputStream *stream,
+                                                         const char *attributes,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Queries a file output stream for the given attributes. +This function blocks while querying the stream. For the asynchronous +version of this function, see g_file_output_stream_query_info_async(). +While the stream is blocked, the stream will set the pending flag +internally, and any other operations on the stream will fail with +G_IO_ERROR_PENDING. +

+

+Can fail if the stream was already closed (with error being set to +G_IO_ERROR_CLOSED), the stream has pending operations (with error being +set to G_IO_ERROR_PENDING), or if querying info is not supported for +the stream's interface (with error being set to G_IO_ERROR_NOT_SUPPORTED). In +all cases of failure, NULL will be returned. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be set, and NULL will +be returned.

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

stream :

a GFileOutputStream. +

attributes :

a file attribute query string. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError, NULL to ignore. +

Returns :

a GFileInfo for the stream, or NULL on error. +
+
+
+
+

g_file_output_stream_query_info_async ()

+
void                g_file_output_stream_query_info_async
+                                                        (GFileOutputStream *stream,
+                                                         const char *attributes,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously queries the stream for a GFileInfo. When completed, +callback will be called with a GAsyncResult which can be used to +finish the operation with g_file_output_stream_query_info_finish(). +

+

+For the synchronous version of this function, see +g_file_output_stream_query_info().

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

stream :

a GFileOutputStream. +

attributes :

a file attribute query string. +

io_priority :

the I/O priority + of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_file_output_stream_query_info_finish ()

+
GFileInfo *         g_file_output_stream_query_info_finish
+                                                        (GFileOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finalizes the asynchronous query started +by g_file_output_stream_query_info_async().

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

stream :

a GFileOutputStream. +

result :

a GAsyncResult. +

error :

a GError, NULL to ignore. +

Returns :

A GFileInfo for the finished query. +
+
+
+
+

g_file_output_stream_get_etag ()

+
char *              g_file_output_stream_get_etag       (GFileOutputStream *stream);
+

+Gets the entity tag for the file when it has been written. +This must be called after the stream has been written +and closed, as the etag can change while writing.

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

stream :

a GFileOutputStream. +

Returns :

the entity tag for the stream. +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFilenameCompleter.html b/docs/reference/gio/html/GFilenameCompleter.html new file mode 100644 index 0000000..2c57716 --- /dev/null +++ b/docs/reference/gio/html/GFilenameCompleter.html @@ -0,0 +1,240 @@ + + + + +GFilenameCompleter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFilenameCompleter

+

GFilenameCompleter — Filename Completer

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GFilenameCompleter;
+GFilenameCompleter * g_filename_completer_new           (void);
+char *              g_filename_completer_get_completion_suffix
+                                                        (GFilenameCompleter *completer,
+                                                         const char *initial_text);
+char **             g_filename_completer_get_completions
+                                                        (GFilenameCompleter *completer,
+                                                         const char *initial_text);
+void                g_filename_completer_set_dirs_only  (GFilenameCompleter *completer,
+                                                         gboolean dirs_only);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GFilenameCompleter
+
+
+
+

Signals

+
+  "got-completion-data"                            : Run Last
+
+
+
+

Description

+

+Completes partial file and directory names given a partial string by +looking in the file system for clues. Can return a list of possible +completion strings for widget implementations.

+
+
+

Details

+
+

GFilenameCompleter

+
typedef struct _GFilenameCompleter GFilenameCompleter;
+

+Completes filenames based on files that exist within the file system.

+
+
+
+

g_filename_completer_new ()

+
GFilenameCompleter * g_filename_completer_new           (void);
+

+Creates a new filename completer.

+
++ + + + +

Returns :

a GFilenameCompleter. +
+
+
+
+

g_filename_completer_get_completion_suffix ()

+
char *              g_filename_completer_get_completion_suffix
+                                                        (GFilenameCompleter *completer,
+                                                         const char *initial_text);
+

+Obtains a completion for initial_text from completer.

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

completer :

the filename completer. +

initial_text :

text to be completed. +

Returns :

a completed string, or NULL if no completion exists. + This string is not owned by GIO, so remember to g_free() it + when finished. +
+
+
+
+

g_filename_completer_get_completions ()

+
char **             g_filename_completer_get_completions
+                                                        (GFilenameCompleter *completer,
+                                                         const char *initial_text);
+

+Gets an array of completion strings for a given initial text.

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

completer :

the filename completer. +

initial_text :

text to be completed. +

Returns :

array of strings with possible completions for initial_text. +This array must be freed by g_strfreev() when finished. +
+
+
+
+

g_filename_completer_set_dirs_only ()

+
void                g_filename_completer_set_dirs_only  (GFilenameCompleter *completer,
+                                                         gboolean dirs_only);
+

+If dirs_only is TRUE, completer will only +complete directory names, and not file names.

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

completer :

the filename completer. +

dirs_only :

a gboolean. +
+
+
+
+

Signal Details

+
+

The "got-completion-data" signal

+
void                user_function                      (GFilenameCompleter *arg0,
+                                                        gpointer            user_data)      : Run Last
+

+Emitted when the file name completion information comes available.

+
++ + + + +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFilterInputStream.html b/docs/reference/gio/html/GFilterInputStream.html new file mode 100644 index 0000000..a32815e --- /dev/null +++ b/docs/reference/gio/html/GFilterInputStream.html @@ -0,0 +1,207 @@ + + + + +GFilterInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFilterInputStream

+

GFilterInputStream — Filter Input Stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GFilterInputStream
+               +----GBufferedInputStream
+               +----GConverterInputStream
+
+
+
+

Properties

+
+  "base-stream"              GInputStream*         : Read / Write / Construct Only
+  "close-base-stream"        gboolean              : Read / Write / Construct Only
+
+
+
+

Description

+
+
+

Details

+
+

GFilterInputStream

+
typedef struct _GFilterInputStream GFilterInputStream;
+

+A base class for all input streams that work on an underlying stream.

+
+
+
+

g_filter_input_stream_get_base_stream ()

+
GInputStream *      g_filter_input_stream_get_base_stream
+                                                        (GFilterInputStream *stream);
+

+Gets the base stream for the filter stream.

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

stream :

a GFilterInputStream. +

Returns :

a GInputStream. +
+
+
+
+

g_filter_input_stream_get_close_base_stream ()

+
gboolean            g_filter_input_stream_get_close_base_stream
+                                                        (GFilterInputStream *stream);
+

+Returns whether the base stream will be closed when stream is +closed.

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

stream :

a GFilterInputStream. +

Returns :

TRUE if the base stream will be closed. +
+
+
+
+

g_filter_input_stream_set_close_base_stream ()

+
void                g_filter_input_stream_set_close_base_stream
+                                                        (GFilterInputStream *stream,
+                                                         gboolean close_base);
+

+Sets whether the base stream will be closed when stream is closed.

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

stream :

a GFilterInputStream. +

close_base :

TRUE to close the base stream. +
+
+
+
+

Property Details

+
+

The "base-stream" property

+
  "base-stream"              GInputStream*         : Read / Write / Construct Only
+

The underlying base stream on which the io ops will be done.

+
+
+
+

The "close-base-stream" property

+
  "close-base-stream"        gboolean              : Read / Write / Construct Only
+

If the base stream should be closed when the filter stream is closed.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GFilterOutputStream.html b/docs/reference/gio/html/GFilterOutputStream.html new file mode 100644 index 0000000..22f03d8 --- /dev/null +++ b/docs/reference/gio/html/GFilterOutputStream.html @@ -0,0 +1,208 @@ + + + + +GFilterOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFilterOutputStream

+

GFilterOutputStream — Filter Output Stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GFilterOutputStream
+               +----GBufferedOutputStream
+               +----GConverterOutputStream
+               +----GDataOutputStream
+
+
+
+

Properties

+
+  "base-stream"              GOutputStream*        : Read / Write / Construct Only
+  "close-base-stream"        gboolean              : Read / Write / Construct Only
+
+
+
+

Description

+
+
+

Details

+
+

GFilterOutputStream

+
typedef struct _GFilterOutputStream GFilterOutputStream;
+

+A base class for all output streams that work on an underlying stream.

+
+
+
+

g_filter_output_stream_get_base_stream ()

+
GOutputStream *     g_filter_output_stream_get_base_stream
+                                                        (GFilterOutputStream *stream);
+

+Gets the base stream for the filter stream.

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

stream :

a GFilterOutputStream. +

Returns :

a GOutputStream. +
+
+
+
+

g_filter_output_stream_get_close_base_stream ()

+
gboolean            g_filter_output_stream_get_close_base_stream
+                                                        (GFilterOutputStream *stream);
+

+Returns whether the base stream will be closed when stream is +closed.

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

stream :

a GFilterOutputStream. +

Returns :

TRUE if the base stream will be closed. +
+
+
+
+

g_filter_output_stream_set_close_base_stream ()

+
void                g_filter_output_stream_set_close_base_stream
+                                                        (GFilterOutputStream *stream,
+                                                         gboolean close_base);
+

+Sets whether the base stream will be closed when stream is closed.

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

stream :

a GFilterOutputStream. +

close_base :

TRUE to close the base stream. +
+
+
+
+

Property Details

+
+

The "base-stream" property

+
  "base-stream"              GOutputStream*        : Read / Write / Construct Only
+

The underlying base stream on which the io ops will be done.

+
+
+
+

The "close-base-stream" property

+
  "close-base-stream"        gboolean              : Read / Write / Construct Only
+

If the base stream should be closed when the filter stream is closed.

+

Default value: TRUE

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GIOModule.html b/docs/reference/gio/html/GIOModule.html new file mode 100644 index 0000000..6c77af2 --- /dev/null +++ b/docs/reference/gio/html/GIOModule.html @@ -0,0 +1,283 @@ + + + + +GIOModule + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GIOModule

+

GIOModule — Loadable GIO Modules

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GIOModule;
+GIOModule *         g_io_module_new                     (const gchar *filename);
+GList *             g_io_modules_load_all_in_directory  (const gchar *dirname);
+void                g_io_modules_scan_all_in_directory  (const char *dirname);
+void                g_io_module_load                    (GIOModule *module);
+void                g_io_module_unload                  (GIOModule *module);
+char **             g_io_module_query                   (void);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GTypeModule
+         +----GIOModule
+
+
+
+

Implemented Interfaces

+

+GIOModule implements + GTypePlugin.

+
+
+

Description

+

+Provides an interface and default functions for loading and unloading +modules. This is used internally to make GIO extensible, but can also +be used by others to implement module loading.

+
+
+

Details

+
+

GIOModule

+
typedef struct _GIOModule GIOModule;
+

+Opaque module base class for extending GIO.

+
+
+
+

g_io_module_new ()

+
GIOModule *         g_io_module_new                     (const gchar *filename);
+

+Creates a new GIOModule that will load the specific +shared library when in use.

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

filename :

filename of the shared library module. +

Returns :

a GIOModule from given filename, +or NULL on error. +
+
+
+
+

g_io_modules_load_all_in_directory ()

+
GList *             g_io_modules_load_all_in_directory  (const gchar *dirname);
+

+Loads all the modules in the specified directory. +

+

+If don't require all modules to be initialized (and thus registering +all gtypes) then you can use g_io_modules_scan_all_in_directory() +which allows delayed/lazy loading of modules.

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

dirname :

pathname for a directory containing modules to load. +

Returns :

a list of GIOModules loaded from the directory, + All the modules are loaded into memory, if you want to + unload them (enabling on-demand loading) you must call + g_type_module_unuse() on all the modules. Free the list + with g_list_free(). +
+
+
+
+

g_io_modules_scan_all_in_directory ()

+
void                g_io_modules_scan_all_in_directory  (const char *dirname);
+

+Scans all the modules in the specified directory, ensuring that +any extension point implemented by a module is registered. +

+

+This may not actually load and initialize all the types in each +module, some modules may be lazily loaded and initialized when +an extension point it implementes is used with e.g. +g_io_extension_point_get_extensions() or +g_io_extension_point_get_extension_by_name(). +

+

+If you need to guarantee that all types are loaded in all the modules, +use g_io_modules_scan_all_in_directory().

+
++ + + + +

dirname :

pathname for a directory containing modules to scan. +
+

Since 2.24

+
+
+
+

g_io_module_load ()

+
void                g_io_module_load                    (GIOModule *module);
+

+Required API for GIO modules to implement. +This function is ran after the module has been loaded into GIO, +to initialize the module.

+
++ + + + +

module :

a GIOModule. +
+
+
+
+

g_io_module_unload ()

+
void                g_io_module_unload                  (GIOModule *module);
+

+Required API for GIO modules to implement. +This function is ran when the module is being unloaded from GIO, +to finalize the module.

+
++ + + + +

module :

a GIOModule. +
+
+
+
+

g_io_module_query ()

+
char **             g_io_module_query                   (void);
+

+Optional API for GIO modules to implement. +

+

+Should return a list of all the extension points that may be +implemented in this module. +

+

+This method will not be called in normal use, however it may be +called when probing existing modules and recording which extension +points that this modle is used for. This means we won't have to +load and initialze this module unless its needed. +

+

+If this function is not implemented by the module the module will +always be loaded, initialized and then unloaded on application startup +so that it can register its extension points during init. +

+

+Note that a module need not actually implement all the extension points +that g_io_module_query returns, since the exact list of extension may +depend on runtime issues. However all extension points actually implemented +must be returned by g_io_module_query() (if defined). +

+

+When installing a module that implements g_io_module_query you must +run gio-querymodules in order to build the cache files required for +lazy loading.

+
++ + + + +

Returns :

A NULL-terminated array of strings, listing the supported + extension points of the module. The array must be suitable for + freeing with g_strfreev(). + +
+

Since 2.24

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

GIOStream

+

GIOStream — Base class for implementing read/write streams

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GIOStream;
+GInputStream *      g_io_stream_get_input_stream        (GIOStream *stream);
+GOutputStream *     g_io_stream_get_output_stream       (GIOStream *stream);
+gboolean            g_io_stream_close                   (GIOStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_io_stream_close_async             (GIOStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_io_stream_close_finish            (GIOStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_io_stream_is_closed               (GIOStream *stream);
+gboolean            g_io_stream_has_pending             (GIOStream *stream);
+gboolean            g_io_stream_set_pending             (GIOStream *stream,
+                                                         GError **error);
+void                g_io_stream_clear_pending           (GIOStream *stream);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GIOStream
+         +----GFileIOStream
+         +----GSocketConnection
+
+
+
+

Properties

+
+  "closed"                   gboolean              : Read / Write
+  "input-stream"             GInputStream*         : Read
+  "output-stream"            GOutputStream*        : Read
+
+
+
+

Description

+

+GIOStream represents an object that has both read and write streams. +Generally the two streams acts as separate input and output streams, +but they share some common resources and state. For instance, for +seekable streams they may use the same position in both streams. +

+

+Examples of GIOStream objects are GSocketConnection which represents +a two-way network connection, and GFileIOStream which represent a +file handle opened in read-write mode. +

+

+To do the actual reading and writing you need to get the substreams +with g_io_stream_get_input_stream() and g_io_stream_get_output_stream(). +

+

+The GIOStream object owns the input and the output streams, not the other +way around, so keeping the substreams alive will not keep the GIOStream +object alive. If the GIOStream object is freed it will be closed, thus +closing the substream, so even if the substreams stay alive they will +always just return a G_IO_ERROR_CLOSED for all operations. +

+

+To close a stream use g_io_stream_close() which will close the common +stream object and also the individual substreams. You can also close +the substreams themselves. In most cases this only marks the +substream as closed, so further I/O on it fails. However, some streams +may support "half-closed" states where one direction of the stream +is actually shut down.

+
+
+

Details

+
+

GIOStream

+
typedef struct _GIOStream GIOStream;
+

+Base class for read-write streams.

+
+
+
+

g_io_stream_get_input_stream ()

+
GInputStream *      g_io_stream_get_input_stream        (GIOStream *stream);
+

+Gets the input stream for this object. This is used +for reading.

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

stream :

a GIOStream +

Returns :

a GInputStream, owned by the GIOStream. Do not free. + +
+

Since 2.22

+
+
+
+

g_io_stream_get_output_stream ()

+
GOutputStream *     g_io_stream_get_output_stream       (GIOStream *stream);
+

+Gets the output stream for this object. This is used for +writing.

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

stream :

a GIOStream +

Returns :

a GOutputStream, owned by the GIOStream. Do not free. + +
+

Since 2.22

+
+
+
+

g_io_stream_close ()

+
gboolean            g_io_stream_close                   (GIOStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Closes the stream, releasing resources related to it. This will also +closes the individual input and output streams, if they are not already +closed. +

+

+Once the stream is closed, all other operations will return +G_IO_ERROR_CLOSED. Closing a stream multiple times will not +return an error. +

+

+Closing a stream will automatically flush any outstanding buffers +in the stream. +

+

+Streams will be automatically closed when the last reference +is dropped, but you might want to call this function to make sure +resources are released as early as possible. +

+

+Some streams might keep the backing store of the stream (e.g. a file +descriptor) open after the stream is closed. See the documentation for +the individual stream for details. +

+

+On failure the first error that happened will be reported, but the +close operation will finish as much as possible. A stream that failed +to close will still return G_IO_ERROR_CLOSED for all operations. +Still, it is important to check and report the error to the user, +otherwise there might be a loss of data as all data might not be written. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +Cancelling a close will still leave the stream closed, but some streams +can use a faster close that doesn't block to e.g. check errors. +

+

+The default implementation of this method just calls close on the +individual input/output streams.

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

stream :

a GIOStream +

cancellable :

optional GCancellable object, NULL to ignore +

error :

location to store the error occuring, or NULL to ignore +

Returns :

TRUE on success, FALSE on failure + +
+

Since 2.22

+
+
+
+

g_io_stream_close_async ()

+
void                g_io_stream_close_async             (GIOStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Requests an asynchronous close of the stream, releasing resources +related to it. When the operation is finished callback will be +called. You can then call g_io_stream_close_finish() to get +the result of the operation. +

+

+For behaviour details see g_io_stream_close(). +

+

+The asynchronous methods have a default fallback that uses threads +to implement asynchronicity, so they are optional for inheriting +classes. However, if you override one you must override all.

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

stream :

a GIOStream +

io_priority :

the io priority of the request +

cancellable :

optional cancellable object +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+

Since 2.22

+
+
+
+

g_io_stream_close_finish ()

+
gboolean            g_io_stream_close_finish            (GIOStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Closes a stream.

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

stream :

a GIOStream +

result :

a GAsyncResult +

error :

a GError location to store the error occuring, or NULL to + ignore +

Returns :

TRUE if stream was successfully closed, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_io_stream_is_closed ()

+
gboolean            g_io_stream_is_closed               (GIOStream *stream);
+

+Checks if a stream is closed.

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

stream :

a GIOStream +

Returns :

TRUE if the stream is closed. + +
+

Since 2.22

+
+
+
+

g_io_stream_has_pending ()

+
gboolean            g_io_stream_has_pending             (GIOStream *stream);
+

+Checks if a stream has pending actions.

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

stream :

a GIOStream +

Returns :

TRUE if stream has pending actions. + +
+

Since 2.22

+
+
+
+

g_io_stream_set_pending ()

+
gboolean            g_io_stream_set_pending             (GIOStream *stream,
+                                                         GError **error);
+

+Sets stream to have actions pending. If the pending flag is +already set or stream is closed, it will return FALSE and set +error.

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

stream :

a GIOStream +

error :

a GError location to store the error occuring, or NULL to + ignore +

Returns :

TRUE if pending was previously unset and is now set. + +
+

Since 2.22

+
+
+
+

g_io_stream_clear_pending ()

+
void                g_io_stream_clear_pending           (GIOStream *stream);
+

+Clears the pending flag on stream.

+
++ + + + +

stream :

a GIOStream +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "closed" property

+
  "closed"                   gboolean              : Read / Write
+

Is the stream closed.

+

Default value: FALSE

+
+
+
+

The "input-stream" property

+
  "input-stream"             GInputStream*         : Read
+

The GInputStream to read from.

+
+
+
+

The "output-stream" property

+
  "output-stream"            GOutputStream*        : Read
+

The GOutputStream to write to.

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GIcon.html b/docs/reference/gio/html/GIcon.html new file mode 100644 index 0000000..297d5b0 --- /dev/null +++ b/docs/reference/gio/html/GIcon.html @@ -0,0 +1,352 @@ + + + + +GIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GIcon

+

GIcon — Interface for icons

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GIcon;
+                    GIconIface;
+guint               g_icon_hash                         (gconstpointer icon);
+gboolean            g_icon_equal                        (GIcon *icon1,
+                                                         GIcon *icon2);
+gchar *             g_icon_to_string                    (GIcon *icon);
+GIcon *             g_icon_new_for_string               (const gchar *str,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GIcon
+
+
+
+

Prerequisites

+

+GIcon requires + GObject.

+
+
+

Known Derived Interfaces

+

+GIcon is required by + GLoadableIcon.

+
+
+

Known Implementations

+

+GIcon is implemented by + GThemedIcon, GFileIcon, GEmblem and GEmblemedIcon.

+
+
+

Description

+

+GIcon is a very minimal interface for icons. It provides functions +for checking the equality of two icons, hashing of icons and +serializing an icon to and from strings. +

+

+GIcon does not provide the actual pixmap for the icon as this is out +of GIO's scope, however implementations of GIcon may contain the name +of an icon (see GThemedIcon), or the path to an icon (see GLoadableIcon). +

+

+To obtain a hash of a GIcon, see g_icon_hash(). +

+

+To check if two GIcons are equal, see g_icon_equal(). +

+

+For serializing a GIcon, use g_icon_to_string() and +g_icon_new_for_string(). +

+

+If your application or library provides one or more GIcon +implementations you need to ensure that each GType is registered +with the type system prior to calling g_icon_new_for_string().

+
+
+

Details

+
+

GIcon

+
typedef struct _GIcon GIcon;
+

+An abstract type that specifies an icon.

+
+
+
+

GIconIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  guint       (* hash)        (GIcon   *icon);
+  gboolean    (* equal)       (GIcon   *icon1,
+                               GIcon   *icon2);
+  gboolean    (* to_tokens)   (GIcon   *icon,
+			       GPtrArray *tokens,
+                               gint    *out_version);
+  GIcon *     (* from_tokens) (gchar  **tokens,
+                               gint     num_tokens,
+                               gint     version,
+                               GError **error);
+} GIconIface;
+
+

+GIconIface is used to implement GIcon types for various +different systems. See GThemedIcon and GLoadableIcon for +examples of how to implement this interface.

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

GTypeInterface g_iface;

The parent interface. +

hash ()

A hash for a given GIcon. +

equal ()

Checks if two GIcons are equal. +

to_tokens ()

Serializes a GIcon into tokens. The tokens must not +contain any whitespace. Don't implement if the GIcon can't be +serialized (Since 2.20). +

from_tokens ()

Constructs a GIcon from tokens. Set the GError if +the tokens are malformed. Don't implement if the GIcon can't be +serialized (Since 2.20). +
+
+
+
+

g_icon_hash ()

+
guint               g_icon_hash                         (gconstpointer icon);
+

+Gets a hash for an icon.

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

icon :

gconstpointer to an icon object. +

Returns :

a guint containing a hash for the icon, suitable for +use in a GHashTable or similar data structure. +
+
+
+
+

g_icon_equal ()

+
gboolean            g_icon_equal                        (GIcon *icon1,
+                                                         GIcon *icon2);
+

+Checks if two icons are equal.

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

icon1 :

pointer to the first GIcon. +

icon2 :

pointer to the second GIcon. +

Returns :

TRUE if icon1 is equal to icon2. FALSE otherwise. +
+
+
+
+

g_icon_to_string ()

+
gchar *             g_icon_to_string                    (GIcon *icon);
+

+Generates a textual representation of icon that can be used for +serialization such as when passing icon to a different process or +saving it to persistent storage. Use g_icon_new_for_string() to +get icon back from the returned string. +

+

+The encoding of the returned string is proprietary to GIcon except +in the following two cases +

+

+

+
    +
  • + If icon is a GFileIcon, the returned string is a native path + (such as /path/to/my icon.png) without escaping + if the GFile for icon is a native file. If the file is not + native, the returned string is the result of g_file_get_uri() + (such as sftp://path/to/my%20icon.png). +

  • +
  • + If icon is a GThemedIcon with exactly one name, the encoding is + simply the name (such as network-server). +

  • +
+
++ + + + + + + + + + +

icon :

a GIcon. +

Returns :

An allocated NUL-terminated UTF8 string or NULL if icon can't +be serialized. Use g_free() to free. + +
+

Since 2.20

+
+
+
+

g_icon_new_for_string ()

+
GIcon *             g_icon_new_for_string               (const gchar *str,
+                                                         GError **error);
+

+Generate a GIcon instance from str. This function can fail if +str is not valid - see g_icon_to_string() for discussion. +

+

+If your application or library provides one or more GIcon +implementations you need to ensure that each GType is registered +with the type system prior to calling g_icon_new_for_string().

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

str :

A string obtained via g_icon_to_string(). +

error :

Return location for error. +

Returns :

An object implementing the GIcon interface or NULL if +error is set. + +
+

Since 2.20

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GInetAddress.html b/docs/reference/gio/html/GInetAddress.html new file mode 100644 index 0000000..c3c9b8e --- /dev/null +++ b/docs/reference/gio/html/GInetAddress.html @@ -0,0 +1,717 @@ + + + + +GInetAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GInetAddress

+

GInetAddress — An IPv4/IPv6 address

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GInetAddress
+
+
+
+

Properties

+
+  "bytes"                    gpointer              : Read / Write / Construct Only
+  "family"                   GSocketFamily         : Read / Write / Construct Only
+  "is-any"                   gboolean              : Read
+  "is-link-local"            gboolean              : Read
+  "is-loopback"              gboolean              : Read
+  "is-mc-global"             gboolean              : Read
+  "is-mc-link-local"         gboolean              : Read
+  "is-mc-node-local"         gboolean              : Read
+  "is-mc-org-local"          gboolean              : Read
+  "is-mc-site-local"         gboolean              : Read
+  "is-multicast"             gboolean              : Read
+  "is-site-local"            gboolean              : Read
+
+
+
+

Description

+

+GInetAddress represents an IPv4 or IPv6 internet address. Use +g_resolver_lookup_by_name() or g_resolver_lookup_by_name_async() to +look up the GInetAddress for a hostname. Use +g_resolver_lookup_by_address() or +g_resolver_lookup_by_address_async() to look up the hostname for a +GInetAddress. +

+

+To actually connect to a remote host, you will need a +GInetSocketAddress (which includes a GInetAddress as well as a +port number).

+
+
+

Details

+
+

GInetAddress

+
typedef struct _GInetAddress GInetAddress;
+

+An IPv4 or IPv6 internet address.

+
+
+
+

g_inet_address_new_from_string ()

+
GInetAddress *      g_inet_address_new_from_string      (const gchar *string);
+

+Parses string as an IP address and creates a new GInetAddress.

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

string :

a string representation of an IP address +

Returns :

a new GInetAddress corresponding to string, or NULL if +string could not be parsed. + +
+

Since 2.22

+
+
+
+

g_inet_address_new_from_bytes ()

+
GInetAddress *      g_inet_address_new_from_bytes       (const guint8 *bytes,
+                                                         GSocketFamily family);
+

+Creates a new GInetAddress from the given family and bytes. +bytes should be 4 bytes for G_INET_ADDRESS_IPV4 and 16 bytes for +G_INET_ADDRESS_IPV6.

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

bytes :

raw address data +

family :

the address family of bytes +

Returns :

a new GInetAddress corresponding to family and bytes. + +
+

Since 2.22

+
+
+
+

g_inet_address_new_any ()

+
GInetAddress *      g_inet_address_new_any              (GSocketFamily family);
+

+Creates a GInetAddress for the "any" address (unassigned/"don't +care") for family.

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

family :

the address family +

Returns :

a new GInetAddress corresponding to the "any" address +for family. + +
+

Since 2.22

+
+
+
+

g_inet_address_new_loopback ()

+
GInetAddress *      g_inet_address_new_loopback         (GSocketFamily family);
+

+Creates a GInetAddress for the loopback address for family.

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

family :

the address family +

Returns :

a new GInetAddress corresponding to the loopback address +for family. + +
+

Since 2.22

+
+
+
+

g_inet_address_to_bytes ()

+
const guint8 *      g_inet_address_to_bytes             (GInetAddress *address);
+

+Gets the raw binary address data from address.

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

address :

a GInetAddress +

Returns :

a pointer to an internal array of the bytes in address, +which should not be modified, stored, or freed. The size of this +array can be gotten with g_inet_address_get_native_size(). + +
+

Since 2.22

+
+
+
+

g_inet_address_get_native_size ()

+
gsize               g_inet_address_get_native_size      (GInetAddress *address);
+

+Gets the size of the native raw binary address for address. This +is the size of the data that you get from g_inet_address_to_bytes().

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

address :

a GInetAddress +

Returns :

the number of bytes used for the native version of address. + +
+

Since 2.22

+
+
+
+

g_inet_address_to_string ()

+
gchar *             g_inet_address_to_string            (GInetAddress *address);
+

+Converts address to string form.

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

address :

a GInetAddress +

Returns :

a representation of address as a string, which should be +freed after use. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_family ()

+
GSocketFamily       g_inet_address_get_family           (GInetAddress *address);
+

+Gets address's family

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

address :

a GInetAddress +

Returns :

address's family + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_any ()

+
gboolean            g_inet_address_get_is_any           (GInetAddress *address);
+

+Tests whether address is the "any" address for its family.

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

address :

a GInetAddress +

Returns :

TRUE if address is the "any" address for its family. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_loopback ()

+
gboolean            g_inet_address_get_is_loopback      (GInetAddress *address);
+

+Tests whether address is the loopback address for its family.

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

address :

a GInetAddress +

Returns :

TRUE if address is the loopback address for its family. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_link_local ()

+
gboolean            g_inet_address_get_is_link_local    (GInetAddress *address);
+

+Tests whether address is a link-local address (that is, if it +identifies a host on a local network that is not connected to the +Internet).

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

address :

a GInetAddress +

Returns :

TRUE if address is a link-local address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_site_local ()

+
gboolean            g_inet_address_get_is_site_local    (GInetAddress *address);
+

+Tests whether address is a site-local address such as 10.0.0.1 +(that is, the address identifies a host on a local network that can +not be reached directly from the Internet, but which may have +outgoing Internet connectivity via a NAT or firewall).

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

address :

a GInetAddress +

Returns :

TRUE if address is a site-local address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_multicast ()

+
gboolean            g_inet_address_get_is_multicast     (GInetAddress *address);
+

+Tests whether address is a multicast address.

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

address :

a GInetAddress +

Returns :

TRUE if address is a multicast address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_mc_link_local ()

+
gboolean            g_inet_address_get_is_mc_link_local (GInetAddress *address);
+

+Tests whether address is a link-local multicast address.

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

address :

a GInetAddress +

Returns :

TRUE if address is a link-local multicast address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_mc_node_local ()

+
gboolean            g_inet_address_get_is_mc_node_local (GInetAddress *address);
+

+Tests whether address is a node-local multicast address.

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

address :

a GInetAddress +

Returns :

TRUE if address is a node-local multicast address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_mc_site_local ()

+
gboolean            g_inet_address_get_is_mc_site_local (GInetAddress *address);
+

+Tests whether address is a site-local multicast address.

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

address :

a GInetAddress +

Returns :

TRUE if address is a site-local multicast address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_mc_org_local ()

+
gboolean            g_inet_address_get_is_mc_org_local  (GInetAddress *address);
+

+Tests whether address is an organization-local multicast address.

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

address :

a GInetAddress +

Returns :

TRUE if address is an organization-local multicast address. + +
+

Since 2.22

+
+
+
+

g_inet_address_get_is_mc_global ()

+
gboolean            g_inet_address_get_is_mc_global     (GInetAddress *address);
+

+Tests whether address is a global multicast address.

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

address :

a GInetAddress +

Returns :

TRUE if address is a global multicast address. + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "bytes" property

+
  "bytes"                    gpointer              : Read / Write / Construct Only
+

The raw address data.

+
+
+
+

The "family" property

+
  "family"                   GSocketFamily         : Read / Write / Construct Only
+

The address family (IPv4 or IPv6).

+

Default value: G_SOCKET_FAMILY_INVALID

+
+
+
+

The "is-any" property

+
  "is-any"                   gboolean              : Read
+

+Whether this is the "any" address for its family. +See g_inet_address_get_is_any().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-link-local" property

+
  "is-link-local"            gboolean              : Read
+

+Whether this is a link-local address. +See g_inet_address_get_is_link_local().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-loopback" property

+
  "is-loopback"              gboolean              : Read
+

+Whether this is the loopback address for its family. +See g_inet_address_get_is_loopback().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-mc-global" property

+
  "is-mc-global"             gboolean              : Read
+

+Whether this is a global multicast address. +See g_inet_address_get_is_mc_global().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-mc-link-local" property

+
  "is-mc-link-local"         gboolean              : Read
+

+Whether this is a link-local multicast address. +See g_inet_address_get_is_mc_link_local().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-mc-node-local" property

+
  "is-mc-node-local"         gboolean              : Read
+

+Whether this is a node-local multicast address. +See g_inet_address_get_is_mc_node_local().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-mc-org-local" property

+
  "is-mc-org-local"          gboolean              : Read
+

+Whether this is an organization-local multicast address. +See g_inet_address_get_is_mc_org_local().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-mc-site-local" property

+
  "is-mc-site-local"         gboolean              : Read
+

+Whether this is a site-local multicast address. +See g_inet_address_get_is_mc_site_local().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-multicast" property

+
  "is-multicast"             gboolean              : Read
+

+Whether this is a multicast address. +See g_inet_address_get_is_multicast().

+

Default value: FALSE

+

Since 2.22

+
+
+
+

The "is-site-local" property

+
  "is-site-local"            gboolean              : Read
+

+Whether this is a site-local address. +See g_inet_address_get_is_loopback().

+

Default value: FALSE

+

Since 2.22

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GInetSocketAddress.html b/docs/reference/gio/html/GInetSocketAddress.html new file mode 100644 index 0000000..13ba7d6 --- /dev/null +++ b/docs/reference/gio/html/GInetSocketAddress.html @@ -0,0 +1,220 @@ + + + + +GInetSocketAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GInetSocketAddress

+

GInetSocketAddress — Internet GSocketAddress

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketAddress
+         +----GInetSocketAddress
+
+
+
+

Implemented Interfaces

+

+GInetSocketAddress implements + GSocketConnectable.

+
+
+

Properties

+
+  "address"                  GInetAddress*         : Read / Write / Construct Only
+  "port"                     guint                 : Read / Write / Construct Only
+
+
+
+

Description

+

+An IPv4 or IPv6 socket address; that is, the combination of a +GInetAddress and a port number.

+
+
+

Details

+
+

GInetSocketAddress

+
typedef struct _GInetSocketAddress GInetSocketAddress;
+

+An IPv4 or IPv6 socket address, corresponding to a struct +sockaddr_in or struct sockaddr_in6.

+
+
+
+

g_inet_socket_address_new ()

+
GSocketAddress *    g_inet_socket_address_new           (GInetAddress *address,
+                                                         guint16 port);
+

+Creates a new GInetSocketAddress for address and port.

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

address :

a GInetAddress +

port :

a port number +

Returns :

a new GInetSocketAddress + +
+

Since 2.22

+
+
+
+

g_inet_socket_address_get_address ()

+
GInetAddress *      g_inet_socket_address_get_address   (GInetSocketAddress *address);
+

+Gets address's GInetAddress.

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

address :

a GInetSocketAddress +

Returns :

the GInetAddress for address, which must be +g_object_ref()'d if it will be stored + +
+

Since 2.22

+
+
+
+

g_inet_socket_address_get_port ()

+
guint16             g_inet_socket_address_get_port      (GInetSocketAddress *address);
+

+Gets address's port.

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

address :

a GInetSocketAddress +

Returns :

the port for address + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "address" property

+
  "address"                  GInetAddress*         : Read / Write / Construct Only
+

The address.

+
+
+
+

The "port" property

+
  "port"                     guint                 : Read / Write / Construct Only
+

The port.

+

Allowed values: <= 65535

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GInitable.html b/docs/reference/gio/html/GInitable.html new file mode 100644 index 0000000..6de9336 --- /dev/null +++ b/docs/reference/gio/html/GInitable.html @@ -0,0 +1,411 @@ + + + + +GInitable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GInitable

+

GInitable — Failable object initialization interface

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GInitable;
+                    GInitableIface;
+gboolean            g_initable_init                     (GInitable *initable,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gpointer            g_initable_new                      (GType object_type,
+                                                         GCancellable *cancellable,
+                                                         GError **error,
+                                                         const gchar *first_property_name,
+                                                         ...);
+GObject*            g_initable_new_valist               (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gpointer            g_initable_newv                     (GType object_type,
+                                                         guint n_parameters,
+                                                         GParameter *parameters,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GInitable
+
+
+
+

Prerequisites

+

+GInitable requires + GObject.

+
+
+

Known Implementations

+

+GInitable is implemented by + GCharsetConverter and GSocket.

+
+
+

Description

+

+GInitable is implemented by objects that can fail during +initialization. If an object implements this interface the +g_initable_init() function must be called as the first thing +after construction. If g_initable_init() is not called, or if +it returns an error, all further operations on the object +should fail, generally with a G_IO_ERROR_NOT_INITIALIZED error. +

+

+Users of objects implementing this are not intended to use +the interface method directly, instead it will be used automatically +in various ways. For C applications you generally just call +g_initable_new() directly, or indirectly via a foo_thing_new() wrapper. +This will call g_initable_init() under the cover, returning NULL and +setting a GError on failure. +

+

+For bindings in languages where the native constructor supports +exceptions the binding could check for objects implemention GInitable +during normal construction and automatically initialize them, throwing +an exception on failure.

+
+
+

Details

+
+

GInitable

+
typedef struct _GInitable GInitable;
+

+Interface for initializable objects.

+

Since 2.22

+
+
+
+

GInitableIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  gboolean    (* init) (GInitable    *initable,
+			GCancellable *cancellable,
+			GError      **error);
+} GInitableIface;
+
+

+Provides an interface for initializing object such that initialization +may fail.

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

GTypeInterface g_iface;

The parent interface. +

init ()

Initializes the object. +
+

Since 2.22

+
+
+
+

g_initable_init ()

+
gboolean            g_initable_init                     (GInitable *initable,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Initializes the object implementing the interface. This must be +done before any real use of the object after initial construction. +

+

+Implementations may also support cancellation. If cancellable is not NULL, +then initialization can be cancelled by triggering the cancellable object +from another thread. If the operation was cancelled, the error +G_IO_ERROR_CANCELLED will be returned. If cancellable is not NULL and +the object doesn't support cancellable initialization the error +G_IO_ERROR_NOT_SUPPORTED will be returned. +

+

+If this function is not called, or returns with an error then all +operations on the object should fail, generally returning the +error G_IO_ERROR_NOT_INITIALIZED. +

+

+Implementations of this method must be idempotent, i.e. multiple calls +to this function with the same argument should return the same results. +Only the first call initializes the object, further calls return the result +of the first call. This is so that its safe to implement the singleton +pattern in the GObject constructor function.

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

initable :

a GInitable. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if successful. If an error has occurred, this function will + return FALSE and set error appropriately if present. + +
+

Since 2.22

+
+
+
+

g_initable_new ()

+
gpointer            g_initable_new                      (GType object_type,
+                                                         GCancellable *cancellable,
+                                                         GError **error,
+                                                         const gchar *first_property_name,
+                                                         ...);
+

+Helper function for constructing GInitiable object. This is +similar to g_object_new() but also initializes the object +and returns NULL, setting an error on failure.

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

object_type :

a GType supporting GInitable. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

first_property_name :

the name of the first property, or NULL if no + properties +

... :

the value if the first property, followed by and other property + value pairs, and ended by NULL. +

Returns :

a newly allocated GObject, or NULL on error + +
+

Since 2.22

+
+
+
+

g_initable_new_valist ()

+
GObject*            g_initable_new_valist               (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Helper function for constructing GInitiable object. This is +similar to g_object_new_valist() but also initializes the object +and returns NULL, setting an error on failure.

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

object_type :

a GType supporting GInitable. +

first_property_name :

the name of the first property, followed by +the value, and other property value pairs, and ended by NULL. +

var_args :

The var args list generated from first_property_name. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

a newly allocated GObject, or NULL on error + +
+

Since 2.22

+
+
+
+

g_initable_newv ()

+
gpointer            g_initable_newv                     (GType object_type,
+                                                         guint n_parameters,
+                                                         GParameter *parameters,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Helper function for constructing GInitiable object. This is +similar to g_object_newv() but also initializes the object +and returns NULL, setting an error on failure.

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

object_type :

a GType supporting GInitable. +

n_parameters :

the number of parameters in parameters +

parameters :

the parameters to use to construct the object +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

a newly allocated GObject, or NULL on error + +
+

Since 2.22

+
+
+
+

See Also

+GAsyncInitable +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GInputStream.html b/docs/reference/gio/html/GInputStream.html new file mode 100644 index 0000000..d19d2b7 --- /dev/null +++ b/docs/reference/gio/html/GInputStream.html @@ -0,0 +1,822 @@ + + + + +GInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GInputStream

+

GInputStream — Base class for implementing streaming input

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GInputStream;
+gssize              g_input_stream_read                 (GInputStream *stream,
+                                                         void *buffer,
+                                                         gsize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_input_stream_read_all             (GInputStream *stream,
+                                                         void *buffer,
+                                                         gsize count,
+                                                         gsize *bytes_read,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_input_stream_skip                 (GInputStream *stream,
+                                                         gsize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_input_stream_close                (GInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_input_stream_read_async           (GInputStream *stream,
+                                                         void *buffer,
+                                                         gsize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gssize              g_input_stream_read_finish          (GInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_input_stream_skip_async           (GInputStream *stream,
+                                                         gsize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gssize              g_input_stream_skip_finish          (GInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_input_stream_close_async          (GInputStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_input_stream_close_finish         (GInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_input_stream_is_closed            (GInputStream *stream);
+gboolean            g_input_stream_has_pending          (GInputStream *stream);
+gboolean            g_input_stream_set_pending          (GInputStream *stream,
+                                                         GError **error);
+void                g_input_stream_clear_pending        (GInputStream *stream);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GFilterInputStream
+         +----GFileInputStream
+         +----GMemoryInputStream
+         +----GUnixInputStream
+
+
+
+

Description

+

+GInputStream has functions to read from a stream (g_input_stream_read()), +to close a stream (g_input_stream_close()) and to skip some content +(g_input_stream_skip()). +

+

+To copy the content of an input stream to an output stream without +manually handling the reads and writes, use g_output_stream_splice(). +

+

+All of these functions have async variants too.

+
+
+

Details

+
+

GInputStream

+
typedef struct _GInputStream GInputStream;
+

+Base class for streaming input operations.

+
+
+
+

g_input_stream_read ()

+
gssize              g_input_stream_read                 (GInputStream *stream,
+                                                         void *buffer,
+                                                         gsize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to read count bytes from the stream into the buffer starting at +buffer. Will block during this read. +

+

+If count is zero returns zero and does nothing. A value of count +larger than G_MAXSSIZE will cause a G_IO_ERROR_INVALID_ARGUMENT error. +

+

+On success, the number of bytes read into the buffer is returned. +It is not an error if this is not the same as the requested size, as it +can happen e.g. near the end of a file. Zero is returned on end of file +(or if count is zero), but never otherwise. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an +operation was partially finished when the operation was cancelled the +partial result will be returned, without an error. +

+

+On error -1 is returned and error is set accordingly.

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

stream :

a GInputStream. +

buffer :

a buffer to read data into (which should be at least count bytes long). +

count :

the number of bytes that will be read from the stream +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

Number of bytes read, or -1 on error +
+
+
+
+

g_input_stream_read_all ()

+
gboolean            g_input_stream_read_all             (GInputStream *stream,
+                                                         void *buffer,
+                                                         gsize count,
+                                                         gsize *bytes_read,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to read count bytes from the stream into the buffer starting at +buffer. Will block during this read. +

+

+This function is similar to g_input_stream_read(), except it tries to +read as many bytes as requested, only stopping on an error or end of stream. +

+

+On a successful read of count bytes, or if we reached the end of the +stream, TRUE is returned, and bytes_read is set to the number of bytes +read into buffer. +

+

+If there is an error during the operation FALSE is returned and error +is set to indicate the error status, bytes_read is updated to contain +the number of bytes read into buffer before the error occurred.

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

stream :

a GInputStream. +

buffer :

a buffer to read data into (which should be at least count bytes long). +

count :

the number of bytes that will be read from the stream +

bytes_read :

location to store the number of bytes that was read from the stream +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

TRUE on success, FALSE if there was an error +
+
+
+
+

g_input_stream_skip ()

+
gssize              g_input_stream_skip                 (GInputStream *stream,
+                                                         gsize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to skip count bytes from the stream. Will block during the operation. +

+

+This is identical to g_input_stream_read(), from a behaviour standpoint, +but the bytes that are skipped are not returned to the user. Some +streams have an implementation that is more efficient than reading the data. +

+

+This function is optional for inherited classes, as the default implementation +emulates it using read. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an +operation was partially finished when the operation was cancelled the +partial result will be returned, without an error.

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

stream :

a GInputStream. +

count :

the number of bytes that will be skipped from the stream +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

Number of bytes skipped, or -1 on error +
+
+
+
+

g_input_stream_close ()

+
gboolean            g_input_stream_close                (GInputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Closes the stream, releasing resources related to it. +

+

+Once the stream is closed, all other operations will return G_IO_ERROR_CLOSED. +Closing a stream multiple times will not return an error. +

+

+Streams will be automatically closed when the last reference +is dropped, but you might want to call this function to make sure +resources are released as early as possible. +

+

+Some streams might keep the backing store of the stream (e.g. a file descriptor) +open after the stream is closed. See the documentation for the individual +stream for details. +

+

+On failure the first error that happened will be reported, but the close +operation will finish as much as possible. A stream that failed to +close will still return G_IO_ERROR_CLOSED for all operations. Still, it +is important to check and report the error to the user. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +Cancelling a close will still leave the stream closed, but some streams +can use a faster close that doesn't block to e.g. check errors.

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

stream :

A GInputStream. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

TRUE on success, FALSE on failure +
+
+
+
+

g_input_stream_read_async ()

+
void                g_input_stream_read_async           (GInputStream *stream,
+                                                         void *buffer,
+                                                         gsize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Request an asynchronous read of count bytes from the stream into the buffer +starting at buffer. When the operation is finished callback will be called. +You can then call g_input_stream_read_finish() to get the result of the +operation. +

+

+During an async request no other sync and async calls are allowed on stream, and will +result in G_IO_ERROR_PENDING errors. +

+

+A value of count larger than G_MAXSSIZE will cause a G_IO_ERROR_INVALID_ARGUMENT error. +

+

+On success, the number of bytes read into the buffer will be passed to the +callback. It is not an error if this is not the same as the requested size, as it +can happen e.g. near the end of a file, but generally we try to read +as many bytes as requested. Zero is returned on end of file +(or if count is zero), but never otherwise. +

+

+Any outstanding i/o request with higher priority (lower numerical value) will +be executed before an outstanding request with lower priority. Default +priority is G_PRIORITY_DEFAULT. +

+

+The asyncronous methods have a default fallback that uses threads to implement +asynchronicity, so they are optional for inheriting classes. However, if you +override one you must override all.

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

stream :

A GInputStream. +

buffer :

a buffer to read data into (which should be at least count bytes long). +

count :

the number of bytes that will be read from the stream +

io_priority :

the I/O priority +of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_input_stream_read_finish ()

+
gssize              g_input_stream_read_finish          (GInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an asynchronous stream read operation.

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

stream :

a GInputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

number of bytes read in, or -1 on error. +
+
+
+
+

g_input_stream_skip_async ()

+
void                g_input_stream_skip_async           (GInputStream *stream,
+                                                         gsize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Request an asynchronous skip of count bytes from the stream. +When the operation is finished callback will be called. +You can then call g_input_stream_skip_finish() to get the result of the +operation. +

+

+During an async request no other sync and async calls are allowed, and will +result in G_IO_ERROR_PENDING errors. +

+

+A value of count larger than G_MAXSSIZE will cause a G_IO_ERROR_INVALID_ARGUMENT error. +

+

+On success, the number of bytes skipped will be passed to the +callback. It is not an error if this is not the same as the requested size, as it +can happen e.g. near the end of a file, but generally we try to skip +as many bytes as requested. Zero is returned on end of file +(or if count is zero), but never otherwise. +

+

+Any outstanding i/o request with higher priority (lower numerical value) will +be executed before an outstanding request with lower priority. Default +priority is G_PRIORITY_DEFAULT. +

+

+The asyncronous methods have a default fallback that uses threads to implement +asynchronicity, so they are optional for inheriting classes. However, if you +override one you must override all.

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

stream :

A GInputStream. +

count :

the number of bytes that will be skipped from the stream +

io_priority :

the I/O priority +of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_input_stream_skip_finish ()

+
gssize              g_input_stream_skip_finish          (GInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes a stream skip operation.

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

stream :

a GInputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

the size of the bytes skipped, or -1 on error. +
+
+
+
+

g_input_stream_close_async ()

+
void                g_input_stream_close_async          (GInputStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Requests an asynchronous closes of the stream, releasing resources related to it. +When the operation is finished callback will be called. +You can then call g_input_stream_close_finish() to get the result of the +operation. +

+

+For behaviour details see g_input_stream_close(). +

+

+The asyncronous methods have a default fallback that uses threads to implement +asynchronicity, so they are optional for inheriting classes. However, if you +override one you must override all.

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

stream :

A GInputStream. +

io_priority :

the I/O priority +of the request. +

cancellable :

optional cancellable object +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_input_stream_close_finish ()

+
gboolean            g_input_stream_close_finish         (GInputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes closing a stream asynchronously, started from g_input_stream_close_async().

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

stream :

a GInputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if the stream was closed successfully. +
+
+
+
+

g_input_stream_is_closed ()

+
gboolean            g_input_stream_is_closed            (GInputStream *stream);
+

+Checks if an input stream is closed.

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

stream :

input stream. +

Returns :

TRUE if the stream is closed. +
+
+
+
+

g_input_stream_has_pending ()

+
gboolean            g_input_stream_has_pending          (GInputStream *stream);
+

+Checks if an input stream has pending actions.

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

stream :

input stream. +

Returns :

TRUE if stream has pending actions. +
+
+
+
+

g_input_stream_set_pending ()

+
gboolean            g_input_stream_set_pending          (GInputStream *stream,
+                                                         GError **error);
+

+Sets stream to have actions pending. If the pending flag is +already set or stream is closed, it will return FALSE and set +error.

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

stream :

input stream +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if pending was previously unset and is now set. +
+
+
+
+

g_input_stream_clear_pending ()

+
void                g_input_stream_clear_pending        (GInputStream *stream);
+

+Clears the pending flag on stream.

+
++ + + + +

stream :

input stream +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GLoadableIcon.html b/docs/reference/gio/html/GLoadableIcon.html new file mode 100644 index 0000000..584fe6d --- /dev/null +++ b/docs/reference/gio/html/GLoadableIcon.html @@ -0,0 +1,325 @@ + + + + +GLoadableIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GLoadableIcon

+

GLoadableIcon — Loadable Icons

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GLoadableIcon;
+                    GLoadableIconIface;
+GInputStream *      g_loadable_icon_load                (GLoadableIcon *icon,
+                                                         int size,
+                                                         char **type,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_loadable_icon_load_async          (GLoadableIcon *icon,
+                                                         int size,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GInputStream *      g_loadable_icon_load_finish         (GLoadableIcon *icon,
+                                                         GAsyncResult *res,
+                                                         char **type,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GLoadableIcon
+
+
+
+

Prerequisites

+

+GLoadableIcon requires + GIcon and GObject.

+
+
+

Known Implementations

+

+GLoadableIcon is implemented by + GFileIcon.

+
+
+

Description

+

+Extends the GIcon interface and adds the ability to +load icons from streams.

+
+
+

Details

+
+

GLoadableIcon

+
typedef struct _GLoadableIcon GLoadableIcon;
+

+Generic type for all kinds of icons that can be loaded +as a stream.

+
+
+
+

GLoadableIconIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  GInputStream * (* load)        (GLoadableIcon       *icon,
+                                  int                  size,
+                                  char               **type,
+                                  GCancellable        *cancellable,
+                                  GError             **error);
+  void           (* load_async)  (GLoadableIcon       *icon,
+                                  int                  size,
+                                  GCancellable        *cancellable,
+                                  GAsyncReadyCallback  callback,
+                                  gpointer             user_data);
+  GInputStream * (* load_finish) (GLoadableIcon       *icon,
+                                  GAsyncResult        *res,
+                                  char               **type,
+                                  GError             **error);
+} GLoadableIconIface;
+
+

+Interface for icons that can be loaded as a stream.

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

GTypeInterface g_iface;

The parent interface. +

load ()

Loads an icon. +

load_async ()

Loads an icon asynchronously. +

load_finish ()

Finishes an asynchronous icon load. +
+
+
+
+

g_loadable_icon_load ()

+
GInputStream *      g_loadable_icon_load                (GLoadableIcon *icon,
+                                                         int size,
+                                                         char **type,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Loads a loadable icon. For the asynchronous version of this function, +see g_loadable_icon_load_async().

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

icon :

a GLoadableIcon. +

size :

an integer. +

type :

a location to store the type of the loaded icon, NULL to ignore. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GInputStream to read the icon from. +
+
+
+
+

g_loadable_icon_load_async ()

+
void                g_loadable_icon_load_async          (GLoadableIcon *icon,
+                                                         int size,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Loads an icon asynchronously. To finish this function, see +g_loadable_icon_load_finish(). For the synchronous, blocking +version of this function, see g_loadable_icon_load().

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

icon :

a GLoadableIcon. +

size :

an integer. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_loadable_icon_load_finish ()

+
GInputStream *      g_loadable_icon_load_finish         (GLoadableIcon *icon,
+                                                         GAsyncResult *res,
+                                                         char **type,
+                                                         GError **error);
+

+Finishes an asynchronous icon load started in g_loadable_icon_load_async().

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

icon :

a GLoadableIcon. +

res :

a GAsyncResult. +

type :

a location to store the type of the loaded icon, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GInputStream to read the icon from. +
+
+
+
+

See Also

+GIcon, GThemedIcon +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GMemoryInputStream.html b/docs/reference/gio/html/GMemoryInputStream.html new file mode 100644 index 0000000..3198c5e --- /dev/null +++ b/docs/reference/gio/html/GMemoryInputStream.html @@ -0,0 +1,210 @@ + + + + +GMemoryInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMemoryInputStream

+

GMemoryInputStream — Streaming input operations on memory chunks

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GMemoryInputStream;
+GInputStream *      g_memory_input_stream_new           (void);
+GInputStream *      g_memory_input_stream_new_from_data (const void *data,
+                                                         gssize len,
+                                                         GDestroyNotify destroy);
+void                g_memory_input_stream_add_data      (GMemoryInputStream *stream,
+                                                         const void *data,
+                                                         gssize len,
+                                                         GDestroyNotify destroy);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GMemoryInputStream
+
+
+
+

Implemented Interfaces

+

+GMemoryInputStream implements + GSeekable.

+
+
+

Description

+

+GMemoryInputStream is a class for using arbitrary +memory chunks as input for GIO streaming input operations.

+
+
+

Details

+
+

GMemoryInputStream

+
typedef struct _GMemoryInputStream GMemoryInputStream;
+

+Implements GInputStream for arbitrary memory chunks.

+
+
+
+

g_memory_input_stream_new ()

+
GInputStream *      g_memory_input_stream_new           (void);
+

+Creates a new empty GMemoryInputStream.

+
++ + + + +

Returns :

a new GInputStream +
+
+
+
+

g_memory_input_stream_new_from_data ()

+
GInputStream *      g_memory_input_stream_new_from_data (const void *data,
+                                                         gssize len,
+                                                         GDestroyNotify destroy);
+

+Creates a new GMemoryInputStream with data in memory of a given size.

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

data :

input data +

len :

length of the data, may be -1 if data is a nul-terminated string +

destroy :

function that is called to free data, or NULL +

Returns :

new GInputStream read from data of len bytes. +
+
+
+
+

g_memory_input_stream_add_data ()

+
void                g_memory_input_stream_add_data      (GMemoryInputStream *stream,
+                                                         const void *data,
+                                                         gssize len,
+                                                         GDestroyNotify destroy);
+

+Appends data to data that can be read from the input stream

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

stream :

a GMemoryInputStream +

data :

input data +

len :

length of the data, may be -1 if data is a nul-terminated string +

destroy :

function that is called to free data, or NULL +
+
+
+
+

See Also

+GMemoryOutputStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GMemoryOutputStream.html b/docs/reference/gio/html/GMemoryOutputStream.html new file mode 100644 index 0000000..55afd03 --- /dev/null +++ b/docs/reference/gio/html/GMemoryOutputStream.html @@ -0,0 +1,363 @@ + + + + +GMemoryOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMemoryOutputStream

+

GMemoryOutputStream — Streaming output operations on memory chunks

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GMemoryOutputStream
+
+
+
+

Implemented Interfaces

+

+GMemoryOutputStream implements + GSeekable.

+
+
+

Properties

+
+  "data"                     gpointer              : Read / Write / Construct Only
+  "data-size"                gulong                : Read
+  "destroy-function"         gpointer              : Read / Write / Construct Only
+  "realloc-function"         gpointer              : Read / Write / Construct Only
+  "size"                     gulong                : Read / Write / Construct Only
+
+
+
+

Description

+

+GMemoryOutputStream is a class for using arbitrary +memory chunks as output for GIO streaming output operations.

+
+
+

Details

+
+

GReallocFunc ()

+
gpointer            (*GReallocFunc)                     (gpointer data,
+                                                         gsize size);
+

+Changes the size of the memory block pointed to by data to +size bytes. +

+

+The function should have the same semantics as realloc().

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

data :

memory block to reallocate +

size :

size to reallocate data to +

Returns :

a pointer to the reallocated memory +
+
+
+
+

GMemoryOutputStream

+
typedef struct _GMemoryOutputStream GMemoryOutputStream;
+

+Implements GOutputStream for arbitrary memory chunks.

+
+
+
+

g_memory_output_stream_new ()

+
GOutputStream *     g_memory_output_stream_new          (gpointer data,
+                                                         gsize size,
+                                                         GReallocFunc realloc_function,
+                                                         GDestroyNotify destroy_function);
+

+Creates a new GMemoryOutputStream. +

+

+If data is non-NULL, the stream will use that for its internal storage. +If realloc_fn is non-NULL, it will be used for resizing the internal +storage when necessary. To construct a fixed-size output stream, +pass NULL as realloc_fn. +

+

+

+
+/* a stream that can grow */
+stream = g_memory_output_stream_new (NULL, 0, realloc, free);
+
+/* another stream that can grow */
+stream2 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
+
+/* a fixed-size stream */
+data = malloc (200);
+stream3 = g_memory_output_stream_new (data, 200, NULL, free);
+
+
++ + + + + + + + + + + + + + + + + + + + + + +

data :

pointer to a chunk of memory to use, or NULL +

size :

the size of data +

realloc_function :

a function with realloc() semantics (like g_realloc()) + to be called when data needs to be grown, or NULL +

destroy_function :

a function to be called on data when the stream is + finalized, or NULL +

Returns :

A newly created GMemoryOutputStream object. +
+
+
+
+

g_memory_output_stream_get_data ()

+
gpointer            g_memory_output_stream_get_data     (GMemoryOutputStream *ostream);
+

+Gets any loaded data from the ostream. +

+

+Note that the returned pointer may become invalid on the next +write or truncate operation on the stream.

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

ostream :

a GMemoryOutputStream +

Returns :

pointer to the stream's data +
+
+
+
+

g_memory_output_stream_get_size ()

+
gsize               g_memory_output_stream_get_size     (GMemoryOutputStream *ostream);
+

+Gets the size of the currently allocated data area (availible from +g_memory_output_stream_get_data()). If the stream isn't +growable (no realloc was passed to g_memory_output_stream_new()) then +this is the maximum size of the stream and further writes +will return G_IO_ERROR_NO_SPACE. +

+

+Note that for growable streams the returned size may become invalid on +the next write or truncate operation on the stream. +

+

+If you want the number of bytes currently written to the stream, use +g_memory_output_stream_get_data_size().

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

ostream :

a GMemoryOutputStream +

Returns :

the number of bytes allocated for the data buffer +
+
+
+
+

g_memory_output_stream_get_data_size ()

+
gsize               g_memory_output_stream_get_data_size
+                                                        (GMemoryOutputStream *ostream);
+

+Returns the number of bytes from the start up +to including the last byte written in the stream +that has not been truncated away.

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

ostream :

a GMemoryOutputStream +

Returns :

the number of bytes written to the stream + +
+

Since 2.18

+
+
+
+

Property Details

+
+

The "data" property

+
  "data"                     gpointer              : Read / Write / Construct Only
+

+Pointer to buffer where data will be written.

+

Since 2.24

+
+
+
+

The "data-size" property

+
  "data-size"                gulong                : Read
+

+Size of data written to the buffer.

+

Since 2.24

+
+
+
+

The "destroy-function" property

+
  "destroy-function"         gpointer              : Read / Write / Construct Only
+

+Function called with the buffer as argument when the stream is destroyed.

+

Since 2.24

+
+
+
+

The "realloc-function" property

+
  "realloc-function"         gpointer              : Read / Write / Construct Only
+

+Function with realloc semantics called to enlarge the buffer.

+

Since 2.24

+
+
+
+

The "size" property

+
  "size"                     gulong                : Read / Write / Construct Only
+

+Current size of the data buffer.

+

Since 2.24

+
+
+
+

See Also

+GMemoryInputStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GMount.html b/docs/reference/gio/html/GMount.html new file mode 100644 index 0000000..3c5065a --- /dev/null +++ b/docs/reference/gio/html/GMount.html @@ -0,0 +1,1462 @@ + + + + +GMount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMount

+

GMount — Mount management

+
+
+

Synopsis

+
+#include <gio/gio.h
+@see also: GVolume>
+#include <GUnixMount>
+
+                    GMount;
+                    GMountIface;
+char *              g_mount_get_name                    (GMount *mount);
+char *              g_mount_get_uuid                    (GMount *mount);
+GIcon *             g_mount_get_icon                    (GMount *mount);
+GDrive *            g_mount_get_drive                   (GMount *mount);
+GFile *             g_mount_get_root                    (GMount *mount);
+GVolume *           g_mount_get_volume                  (GMount *mount);
+GFile *             g_mount_get_default_location        (GMount *mount);
+gboolean            g_mount_can_unmount                 (GMount *mount);
+enum                GMountMountFlags;
+enum                GMountUnmountFlags;
+void                g_mount_unmount                     (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_mount_unmount_finish              (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_mount_unmount_with_operation      (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_mount_unmount_with_operation_finish
+                                                        (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_mount_remount                     (GMount *mount,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_mount_remount_finish              (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_mount_can_eject                   (GMount *mount);
+void                g_mount_eject                       (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_mount_eject_finish                (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_mount_eject_with_operation        (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_mount_eject_with_operation_finish (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_mount_guess_content_type          (GMount *mount,
+                                                         gboolean force_rescan,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gchar **            g_mount_guess_content_type_finish   (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gchar **            g_mount_guess_content_type_sync     (GMount *mount,
+                                                         gboolean force_rescan,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_mount_is_shadowed                 (GMount *mount);
+void                g_mount_shadow                      (GMount *mount);
+void                g_mount_unshadow                    (GMount *mount);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GMount
+
+
+
+

Prerequisites

+

+GMount requires + GObject.

+
+
+

Signals

+
+  "changed"                                        : Run Last
+  "pre-unmount"                                    : Run Last
+  "unmounted"                                      : Run Last
+
+
+
+

Description

+

+The GMount interface represents user-visible mounts. Note, when +porting from GnomeVFS, GMount is the moral equivalent of GnomeVFSVolume. +

+

+GMount is a "mounted" filesystem that you can access. Mounted is in +quotes because it's not the same as a unix mount, it might be a gvfs +mount, but you can still access the files on it if you use GIO. Might or +might not be related to a volume object. +

+

+Unmounting a GMount instance is an asynchronous operation. For +more information about asynchronous operations, see GAsyncReady +and GSimpleAsyncReady. To unmount a GMount instance, first call +g_mount_unmount_with_operation() with (at least) the GMount instance and a +GAsyncReadyCallback. The callback will be fired when the +operation has resolved (either with success or failure), and a +GAsyncReady structure will be passed to the callback. That +callback should then call g_mount_unmount_with_operation_finish() with the GMount +and the GAsyncReady data to see if the operation was completed +successfully. If an error is present when g_mount_unmount_with_operation_finish() +is called, then it will be filled with any error information.

+
+
+

Details

+
+

GMount

+
typedef struct _GMount GMount;
+

+A handle to an object implementing the GMountIface interface.

+
+
+
+

GMountIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* signals */
+
+  void        (* changed)                   (GMount              *mount);
+  void        (* unmounted)                 (GMount              *mount);
+
+  /* Virtual Table */
+
+  GFile     * (* get_root)                  (GMount              *mount);
+  char      * (* get_name)                  (GMount              *mount);
+  GIcon     * (* get_icon)                  (GMount              *mount);
+  char      * (* get_uuid)                  (GMount              *mount);
+  GVolume   * (* get_volume)                (GMount              *mount);
+  GDrive    * (* get_drive)                 (GMount              *mount);
+  gboolean    (* can_unmount)               (GMount              *mount);
+  gboolean    (* can_eject)                 (GMount              *mount);
+
+  void        (* unmount)                   (GMount              *mount,
+                                             GMountUnmountFlags   flags,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* unmount_finish)            (GMount              *mount,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+
+  void        (* eject)                     (GMount              *mount,
+                                             GMountUnmountFlags   flags,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* eject_finish)              (GMount              *mount,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+
+  void        (* remount)                   (GMount              *mount,
+                                             GMountMountFlags     flags,
+                                             GMountOperation     *mount_operation,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* remount_finish)            (GMount              *mount,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+
+  void        (* guess_content_type)        (GMount              *mount,
+                                             gboolean             force_rescan,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gchar    ** (* guess_content_type_finish) (GMount              *mount,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+  gchar    ** (* guess_content_type_sync)   (GMount              *mount,
+                                             gboolean             force_rescan,
+                                             GCancellable        *cancellable,
+                                             GError             **error);
+
+  /* Signal, not VFunc */
+  void        (* pre_unmount)               (GMount              *mount);
+
+  void        (* unmount_with_operation)    (GMount              *mount,
+                                             GMountUnmountFlags   flags,
+                                             GMountOperation     *mount_operation,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* unmount_with_operation_finish) (GMount          *mount,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+
+  void        (* eject_with_operation)      (GMount              *mount,
+                                             GMountUnmountFlags   flags,
+                                             GMountOperation     *mount_operation,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* eject_with_operation_finish) (GMount            *mount,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+  GFile     * (* get_default_location)      (GMount              *mount);
+} GMountIface;
+
+

+Interface for implementing operations for mounts.

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

GTypeInterface g_iface;

The parent interface. +

changed ()

Changed signal that is emitted when the mount's state has changed. +

unmounted ()

The unmounted signal that is emitted when the GMount have been unmounted. If the recipient is holding references to the object they should release them so the object can be finalized. +

get_root ()

Gets a GFile to the root directory of the GMount. +

get_name ()

Gets a string containing the name of the GMount. +

get_icon ()

Gets a GIcon for the GMount. +

get_uuid ()

Gets the UUID for the GMount. The reference is typically based on the file system UUID for the mount in question and should be considered an opaque string. Returns NULL if there is no UUID available. +

get_volume ()

Gets a GVolume the mount is located on. Returns NULL if the GMount is not associated with a GVolume. +

get_drive ()

Gets a GDrive the volume of the mount is located on. Returns NULL if the GMount is not associated with a GDrive or a GVolume. This is convenience method for getting the GVolume and using that to get the GDrive. +

can_unmount ()

Checks if a GMount can be unmounted. +

can_eject ()

Checks if a GMount can be ejected. +

unmount ()

Starts unmounting a GMount. +

unmount_finish ()

Finishes an unmounting operation. +

eject ()

Starts ejecting a GMount. +

eject_finish ()

Finishes an eject operation. +

remount ()

Starts remounting a GMount. +

remount_finish ()

Finishes a remounting operation. +

guess_content_type ()

Starts guessing the type of the content of a GMount. + See g_mount_guess_content_type() for more information on content + type guessing. This operation was added in 2.18. +

guess_content_type_finish ()

Finishes a contenet type guessing operation. Added in 2.18. +

guess_content_type_sync ()

Synchronous variant of guess_content_type. Added in 2.18 +

pre_unmount ()

The pre_unmout signal that is emitted when the GMount will soon be emitted. If the recipient is somehow holding the mount open by keeping an open file on it it should close the file. +

unmount_with_operation ()

Starts unmounting a GMount using a GMountOperation. Since 2.22. +

unmount_with_operation_finish ()

Finishes an unmounting operation using a GMountOperation. Since 2.22. +

eject_with_operation ()

Starts ejecting a GMount using a GMountOperation. Since 2.22. +

eject_with_operation_finish ()

Finishes an eject operation using a GMountOperation. Since 2.22. +

get_default_location ()

Gets a GFile indication a start location that can be use as the entry point for this mount. Since 2.24. +
+
+
+
+

g_mount_get_name ()

+
char *              g_mount_get_name                    (GMount *mount);
+

+Gets the name of mount.

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

mount :

a GMount. +

Returns :

the name for the given mount. + The returned string should be freed with g_free() + when no longer needed. +
+
+
+
+

g_mount_get_uuid ()

+
char *              g_mount_get_uuid                    (GMount *mount);
+

+Gets the UUID for the mount. The reference is typically based on +the file system UUID for the mount in question and should be +considered an opaque string. Returns NULL if there is no UUID +available.

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

mount :

a GMount. +

Returns :

the UUID for mount or NULL if no UUID can be computed. + The returned string should be freed with g_free() + when no longer needed. +
+
+
+
+

g_mount_get_icon ()

+
GIcon *             g_mount_get_icon                    (GMount *mount);
+

+Gets the icon for mount.

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

mount :

a GMount. +

Returns :

a GIcon. + The returned object should be unreffed with + g_object_unref() when no longer needed. +
+
+
+
+

g_mount_get_drive ()

+
GDrive *            g_mount_get_drive                   (GMount *mount);
+

+Gets the drive for the mount. +

+

+This is a convenience method for getting the GVolume and then +using that object to get the GDrive.

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

mount :

a GMount. +

Returns :

a GDrive or NULL if mount is not associated with a volume or a drive. + The returned object should be unreffed with + g_object_unref() when no longer needed. +
+
+
+
+

g_mount_get_root ()

+
GFile *             g_mount_get_root                    (GMount *mount);
+

+Gets the root directory on mount.

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

mount :

a GMount. +

Returns :

a GFile. + The returned object should be unreffed with + g_object_unref() when no longer needed. +
+
+
+
+

g_mount_get_volume ()

+
GVolume *           g_mount_get_volume                  (GMount *mount);
+

+Gets the volume for the mount.

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

mount :

a GMount. +

Returns :

a GVolume or NULL if mount is not associated with a volume. + The returned object should be unreffed with + g_object_unref() when no longer needed. +
+
+
+
+

g_mount_get_default_location ()

+
GFile *             g_mount_get_default_location        (GMount *mount);
+

+Gets the default location of mount. The default location of the given +mount is a path that reflects the main entry point for the user (e.g. +the home directory, or the root of the volume).

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

mount :

a GMount. +

Returns :

a GFile. + The returned object should be unreffed with + g_object_unref() when no longer needed. +
+
+
+
+

g_mount_can_unmount ()

+
gboolean            g_mount_can_unmount                 (GMount *mount);
+

+Checks if mount can be mounted.

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

mount :

a GMount. +

Returns :

TRUE if the mount can be unmounted. +
+
+
+
+

enum GMountMountFlags

+
typedef enum {
+  G_MOUNT_MOUNT_NONE = 0
+} GMountMountFlags;
+
+

+Flags used when mounting a mount.

+
++ + + + +

G_MOUNT_MOUNT_NONE

No flags set. +
+
+
+
+

enum GMountUnmountFlags

+
typedef enum {
+  G_MOUNT_UNMOUNT_NONE  = 0,
+  G_MOUNT_UNMOUNT_FORCE = (1 << 0)
+} GMountUnmountFlags;
+
+

+Flags used when an unmounting a mount.

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

G_MOUNT_UNMOUNT_NONE

No flags set. +

G_MOUNT_UNMOUNT_FORCE

Unmount even if there are outstanding + file operations on the mount. +
+
+
+
+

g_mount_unmount ()

+
void                g_mount_unmount                     (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+

Warning

+

g_mount_unmount has been deprecated since version 2.22 and should not be used in newly-written code. Use g_mount_unmount_with_operation() instead.

+
+

+Unmounts a mount. This is an asynchronous operation, and is +finished by calling g_mount_unmount_finish() with the mount +and GAsyncResult data returned in the callback.

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

mount :

a GMount. +

flags :

flags affecting the operation +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+
+
+
+

g_mount_unmount_finish ()

+
gboolean            g_mount_unmount_finish              (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+

Warning

+

g_mount_unmount_finish has been deprecated since version 2.22 and should not be used in newly-written code. Use g_mount_unmount_with_operation_finish() instead.

+
+

+Finishes unmounting a mount. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

mount :

a GMount. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the mount was successfully unmounted. FALSE otherwise. + +
+
+
+
+

g_mount_unmount_with_operation ()

+
void                g_mount_unmount_with_operation      (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Unmounts a mount. This is an asynchronous operation, and is +finished by calling g_mount_unmount_with_operation_finish() with the mount +and GAsyncResult data returned in the callback.

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

mount :

a GMount. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+

Since 2.22

+
+
+
+

g_mount_unmount_with_operation_finish ()

+
gboolean            g_mount_unmount_with_operation_finish
+                                                        (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes unmounting a mount. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

mount :

a GMount. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the mount was successfully unmounted. FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_mount_remount ()

+
void                g_mount_remount                     (GMount *mount,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Remounts a mount. This is an asynchronous operation, and is +finished by calling g_mount_remount_finish() with the mount +and GAsyncResults data returned in the callback. +

+

+Remounting is useful when some setting affecting the operation +of the volume has been changed, as these may need a remount to +take affect. While this is semantically equivalent with unmounting +and then remounting not all backends might need to actually be +unmounted.

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

mount :

a GMount. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+
+
+
+

g_mount_remount_finish ()

+
gboolean            g_mount_remount_finish              (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes remounting a mount. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

mount :

a GMount. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the mount was successfully remounted. FALSE otherwise. +
+
+
+
+

g_mount_can_eject ()

+
gboolean            g_mount_can_eject                   (GMount *mount);
+

+Checks if mount can be eject.

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

mount :

a GMount. +

Returns :

TRUE if the mount can be ejected. +
+
+
+
+

g_mount_eject ()

+
void                g_mount_eject                       (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+

Warning

+

g_mount_eject has been deprecated since version 2.22 and should not be used in newly-written code. Use g_mount_eject_with_operation() instead.

+
+

+Ejects a mount. This is an asynchronous operation, and is +finished by calling g_mount_eject_finish() with the mount +and GAsyncResult data returned in the callback.

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

mount :

a GMount. +

flags :

flags affecting the unmount if required for eject +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+
+
+
+

g_mount_eject_finish ()

+
gboolean            g_mount_eject_finish                (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+

Warning

+

g_mount_eject_finish has been deprecated since version 2.22 and should not be used in newly-written code. Use g_mount_eject_with_operation_finish() instead.

+
+

+Finishes ejecting a mount. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

mount :

a GMount. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the mount was successfully ejected. FALSE otherwise. + +
+
+
+
+

g_mount_eject_with_operation ()

+
void                g_mount_eject_with_operation        (GMount *mount,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Ejects a mount. This is an asynchronous operation, and is +finished by calling g_mount_eject_with_operation_finish() with the mount +and GAsyncResult data returned in the callback.

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

mount :

a GMount. +

flags :

flags affecting the unmount if required for eject +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+

Since 2.22

+
+
+
+

g_mount_eject_with_operation_finish ()

+
gboolean            g_mount_eject_with_operation_finish (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes ejecting a mount. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

mount :

a GMount. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the mount was successfully ejected. FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_mount_guess_content_type ()

+
void                g_mount_guess_content_type          (GMount *mount,
+                                                         gboolean force_rescan,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Tries to guess the type of content stored on mount. Returns one or +more textual identifiers of well-known content types (typically +prefixed with "x-content/"), e.g. x-content/image-dcf for camera +memory cards. See the shared-mime-info +specification for more on x-content types. +

+

+This is an asynchronous operation (see +g_mount_guess_content_type_sync() for the synchronous version), and +is finished by calling g_mount_guess_content_type_finish() with the +mount and GAsyncResult data returned in the callback.

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

mount :

a GMount +

force_rescan :

Whether to force a rescan of the content. + Otherwise a cached result will be used if available +

cancellable :

optional GCancellable object, NULL to ignore +

callback :

a GAsyncReadyCallback +

user_data :

user data passed to callback +
+

Since 2.18

+
+
+
+

g_mount_guess_content_type_finish ()

+
gchar **            g_mount_guess_content_type_finish   (GMount *mount,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes guessing content types of mount. If any errors occured +during the operation, error will be set to contain the errors and +FALSE will be returned. In particular, you may get an +G_IO_ERROR_NOT_SUPPORTED if the mount does not support content +guessing.

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

mount :

a GMount +

result :

a GAsyncResult +

error :

a GError location to store the error occuring, or NULL to + ignore +

Returns :

a NULL-terminated array of content types or NULL on error. + Caller should free this array with g_strfreev() when done with it. + +
+

Since 2.18

+
+
+
+

g_mount_guess_content_type_sync ()

+
gchar **            g_mount_guess_content_type_sync     (GMount *mount,
+                                                         gboolean force_rescan,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to guess the type of content stored on mount. Returns one or +more textual identifiers of well-known content types (typically +prefixed with "x-content/"), e.g. x-content/image-dcf for camera +memory cards. See the shared-mime-info +specification for more on x-content types. +

+

+This is an synchronous operation and as such may block doing IO; +see g_mount_guess_content_type() for the asynchronous version.

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

mount :

a GMount +

force_rescan :

Whether to force a rescan of the content. + Otherwise a cached result will be used if available +

cancellable :

optional GCancellable object, NULL to ignore +

error :

a GError location to store the error occuring, or NULL to + ignore +

Returns :

a NULL-terminated array of content types or NULL on error. + Caller should free this array with g_strfreev() when done with it. + +
+

Since 2.18

+
+
+
+

g_mount_is_shadowed ()

+
gboolean            g_mount_is_shadowed                 (GMount *mount);
+

+Determines if mount is shadowed. Applications or libraries should +avoid displaying mount in the user interface if it is shadowed. +

+

+A mount is said to be shadowed if there exists one or more user +visible objects (currently GMount objects) with a root that is +inside the root of mount. +

+

+One application of shadow mounts is when exposing a single file +system that is used to address several logical volumes. In this +situation, a GVolumeMonitor implementation would create two +GVolume objects (for example, one for the camera functionality of +the device and one for a SD card reader on the device) with +activation URIs gphoto2://[usb:001,002]/store1/ +and gphoto2://[usb:001,002]/store2/. When the +underlying mount (with root +gphoto2://[usb:001,002]/) is mounted, said +GVolumeMonitor implementation would create two GMount objects +(each with their root matching the corresponding volume activation +root) that would shadow the original mount. +

+

+The proxy monitor in GVfs 2.26 and later, automatically creates and +manage shadow mounts (and shadows the underlying mount) if the +activation root on a GVolume is set.

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

mount :

A GMount. +

Returns :

TRUE if mount is shadowed. + +
+

Since 2.20

+
+
+
+

g_mount_shadow ()

+
void                g_mount_shadow                      (GMount *mount);
+

+Increments the shadow count on mount. Usually used by +GVolumeMonitor implementations when creating a shadow mount for +mount, see g_mount_is_shadowed() for more information. The caller +will need to emit the "changed" signal on mount manually.

+
++ + + + +

mount :

A GMount. +
+

Since 2.20

+
+
+
+

g_mount_unshadow ()

+
void                g_mount_unshadow                    (GMount *mount);
+

+Decrements the shadow count on mount. Usually used by +GVolumeMonitor implementations when destroying a shadow mount for +mount, see g_mount_is_shadowed() for more information. The caller +will need to emit the "changed" signal on mount manually.

+
++ + + + +

mount :

A GMount. +
+

Since 2.20

+
+
+
+

Signal Details

+
+

The "changed" signal

+
void                user_function                      (GMount  *mount,
+                                                        gpointer user_data)      : Run Last
+

+Emitted when the mount has been changed.

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

mount :

the object on which the signal is emitted +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "pre-unmount" signal

+
void                user_function                      (GMount  *mount,
+                                                        gpointer user_data)      : Run Last
+

+This signal is emitted when the GMount is about to be +unmounted.

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

mount :

the object on which the signal is emitted +

user_data :

user data set when the signal handler was connected.
+

Since 2.22

+
+
+
+

The "unmounted" signal

+
void                user_function                      (GMount  *mount,
+                                                        gpointer user_data)      : Run Last
+

+This signal is emitted when the GMount have been +unmounted. If the recipient is holding references to the +object they should release them so the object can be +finalized.

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

mount :

the object on which the signal is emitted +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GMountOperation.html b/docs/reference/gio/html/GMountOperation.html new file mode 100644 index 0000000..1c06dd9 --- /dev/null +++ b/docs/reference/gio/html/GMountOperation.html @@ -0,0 +1,848 @@ + + + + +GMountOperation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMountOperation

+

GMountOperation — Object used for authentication and user interaction

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMountOperation
+
+
+
+

Properties

+
+  "anonymous"                gboolean              : Read / Write
+  "choice"                   gint                  : Read / Write
+  "domain"                   gchar*                : Read / Write
+  "password"                 gchar*                : Read / Write
+  "password-save"            GPasswordSave         : Read / Write
+  "username"                 gchar*                : Read / Write
+
+
+
+

Signals

+
+  "aborted"                                        : Run Last
+  "ask-password"                                   : Run Last
+  "ask-question"                                   : Run Last
+  "reply"                                          : Run Last
+  "show-processes"                                 : Run Last
+
+
+
+

Description

+

+GMountOperation provides a mechanism for interacting with the user. +It can be used for authenticating mountable operations, such as loop +mounting files, hard drive partitions or server locations. It can +also be used to ask the user questions or show a list of applications +preventing unmount or eject operations from completing. +

+

+Note that GMountOperation is used for more than just GMount +objects – for example it is also used in g_drive_start() and +g_drive_stop(). +

+

+Users should instantiate a subclass of this that implements all the +various callbacks to show the required dialogs, such as +GtkMountOperation. If no user interaction is desired (for example +when automounting filesystems at login time), usually NULL can be +passed, see each method taking a GMountOperation for details.

+
+
+

Details

+
+

enum GAskPasswordFlags

+
typedef enum {
+  G_ASK_PASSWORD_NEED_PASSWORD       = (1 << 0),
+  G_ASK_PASSWORD_NEED_USERNAME       = (1 << 1),
+  G_ASK_PASSWORD_NEED_DOMAIN         = (1 << 2),
+  G_ASK_PASSWORD_SAVING_SUPPORTED    = (1 << 3),
+  G_ASK_PASSWORD_ANONYMOUS_SUPPORTED = (1 << 4)
+} GAskPasswordFlags;
+
+

+GAskPasswordFlags are used to request specific information from the +user, or to notify the user of their choices in an authentication +situation.

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

G_ASK_PASSWORD_NEED_PASSWORD

operation requires a password. +

G_ASK_PASSWORD_NEED_USERNAME

operation requires a username. +

G_ASK_PASSWORD_NEED_DOMAIN

operation requires a domain. +

G_ASK_PASSWORD_SAVING_SUPPORTED

operation supports saving settings. +

G_ASK_PASSWORD_ANONYMOUS_SUPPORTED

operation supports anonymous users. +
+
+
+
+

enum GPasswordSave

+
typedef enum {
+  G_PASSWORD_SAVE_NEVER,
+  G_PASSWORD_SAVE_FOR_SESSION,
+  G_PASSWORD_SAVE_PERMANENTLY
+} GPasswordSave;
+
+

+GPasswordSave is used to indicate the lifespan of a saved password. +

+

+Gvfs stores passwords in the Gnome keyring when this flag allows it +to, and later retrieves it again from there.

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

G_PASSWORD_SAVE_NEVER

never save a password. +

G_PASSWORD_SAVE_FOR_SESSION

save a password for the session. +

G_PASSWORD_SAVE_PERMANENTLY

save a password permanently. +
+
+
+
+

GMountOperation

+
typedef struct _GMountOperation GMountOperation;
+

+Class for providing authentication methods for mounting operations, +such as mounting a file locally, or authenticating with a server.

+
+
+
+

enum GMountOperationResult

+
typedef enum {
+  G_MOUNT_OPERATION_HANDLED,
+  G_MOUNT_OPERATION_ABORTED,
+  G_MOUNT_OPERATION_UNHANDLED
+} GMountOperationResult;
+
+

+GMountOperationResult is returned as a result when a request for +information is send by the mounting operation.

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

G_MOUNT_OPERATION_HANDLED

The request was fulfilled and the + user specified data is now available +

G_MOUNT_OPERATION_ABORTED

The user requested the mount operation + to be aborted +

G_MOUNT_OPERATION_UNHANDLED

The request was unhandled (i.e. not + implemented) +
+
+
+
+

g_mount_operation_new ()

+
GMountOperation *   g_mount_operation_new               (void);
+

+Creates a new mount operation.

+
++ + + + +

Returns :

a GMountOperation. +
+
+
+
+

g_mount_operation_get_username ()

+
const char *        g_mount_operation_get_username      (GMountOperation *op);
+

+Get the user name from the mount operation.

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

op :

a GMountOperation. +

Returns :

a string containing the user name. +
+
+
+
+

g_mount_operation_set_username ()

+
void                g_mount_operation_set_username      (GMountOperation *op,
+                                                         const char *username);
+

+Sets the user name within op to username.

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

op :

a GMountOperation. +

username :

input username. +
+
+
+
+

g_mount_operation_get_password ()

+
const char *        g_mount_operation_get_password      (GMountOperation *op);
+

+Gets a password from the mount operation.

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

op :

a GMountOperation. +

Returns :

a string containing the password within op. +
+
+
+
+

g_mount_operation_set_password ()

+
void                g_mount_operation_set_password      (GMountOperation *op,
+                                                         const char *password);
+

+Sets the mount operation's password to password.

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

op :

a GMountOperation. +

password :

password to set. +
+
+
+
+

g_mount_operation_get_anonymous ()

+
gboolean            g_mount_operation_get_anonymous     (GMountOperation *op);
+

+Check to see whether the mount operation is being used +for an anonymous user.

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

op :

a GMountOperation. +

Returns :

TRUE if mount operation is anonymous. +
+
+
+
+

g_mount_operation_set_anonymous ()

+
void                g_mount_operation_set_anonymous     (GMountOperation *op,
+                                                         gboolean anonymous);
+

+Sets the mount operation to use an anonymous user if anonymous is TRUE.

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

op :

a GMountOperation. +

anonymous :

boolean value. +
+
+
+
+

g_mount_operation_get_domain ()

+
const char *        g_mount_operation_get_domain        (GMountOperation *op);
+

+Gets the domain of the mount operation.

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

op :

a GMountOperation. +

Returns :

a string set to the domain. +
+
+
+
+

g_mount_operation_set_domain ()

+
void                g_mount_operation_set_domain        (GMountOperation *op,
+                                                         const char *domain);
+

+Sets the mount operation's domain.

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

op :

a GMountOperation. +

domain :

the domain to set. +
+
+
+
+

g_mount_operation_get_password_save ()

+
GPasswordSave       g_mount_operation_get_password_save (GMountOperation *op);
+

+Gets the state of saving passwords for the mount operation.

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

op :

a GMountOperation. +

Returns :

a GPasswordSave flag. +
+
+
+
+

g_mount_operation_set_password_save ()

+
void                g_mount_operation_set_password_save (GMountOperation *op,
+                                                         GPasswordSave save);
+

+Sets the state of saving passwords for the mount operation.

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

op :

a GMountOperation. +

save :

a set of GPasswordSave flags. +
+
+
+
+

g_mount_operation_get_choice ()

+
int                 g_mount_operation_get_choice        (GMountOperation *op);
+

+Gets a choice from the mount operation.

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

op :

a GMountOperation. +

Returns :

an integer containing an index of the user's choice from +the choice's list, or 0. +
+
+
+
+

g_mount_operation_set_choice ()

+
void                g_mount_operation_set_choice        (GMountOperation *op,
+                                                         int choice);
+

+Sets a default choice for the mount operation.

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

op :

a GMountOperation. +

choice :

an integer. +
+
+
+
+

g_mount_operation_reply ()

+
void                g_mount_operation_reply             (GMountOperation *op,
+                                                         GMountOperationResult result);
+

+Emits the "reply" signal.

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

op :

a GMountOperation +

result :

a GMountOperationResult +
+
+
+
+

Property Details

+
+

The "anonymous" property

+
  "anonymous"                gboolean              : Read / Write
+

+Whether to use an anonymous user when authenticating.

+

Default value: FALSE

+
+
+
+

The "choice" property

+
  "choice"                   gint                  : Read / Write
+

+The index of the user's choice when a question is asked during the +mount operation. See the "ask-question" signal.

+

Allowed values: >= 0

+

Default value: 0

+
+
+
+

The "domain" property

+
  "domain"                   gchar*                : Read / Write
+

+The domain to use for the mount operation.

+

Default value: NULL

+
+
+
+

The "password" property

+
  "password"                 gchar*                : Read / Write
+

+The password that is used for authentication when carrying out +the mount operation.

+

Default value: NULL

+
+
+
+

The "password-save" property

+
  "password-save"            GPasswordSave         : Read / Write
+

+Determines if and how the password information should be saved.

+

Default value: G_PASSWORD_SAVE_NEVER

+
+
+
+

The "username" property

+
  "username"                 gchar*                : Read / Write
+

+The user name that is used for authentication when carrying out +the mount operation.

+

Default value: NULL

+
+
+
+

Signal Details

+
+

The "aborted" signal

+
void                user_function                      (GMountOperation *arg0,
+                                                        gpointer         user_data)      : Run Last
+

+Emitted by the backend when e.g. a device becomes unavailable +while a mount operation is in progress. +

+

+Implementations of GMountOperation should handle this signal +by dismissing open password dialogs.

+
++ + + + +

user_data :

user data set when the signal handler was connected.
+

Since 2.20

+
+
+
+

The "ask-password" signal

+
void                user_function                      (GMountOperation  *op,
+                                                        gchar            *message,
+                                                        gchar            *default_user,
+                                                        gchar            *default_domain,
+                                                        GAskPasswordFlags flags,
+                                                        gpointer          user_data)           : Run Last
+

+Emitted when a mount operation asks the user for a password. +

+

+If the message contains a line break, the first line should be +presented as a heading. For example, it may be used as the +primary text in a GtkMessageDialog.

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

op :

a GMountOperation requesting a password. +

message :

string containing a message to display to the user. +

default_user :

string containing the default user name. +

default_domain :

string containing the default domain. +

flags :

a set of GAskPasswordFlags. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "ask-question" signal

+
void                user_function                      (GMountOperation *op,
+                                                        gchar           *message,
+                                                        GStrv           *choices,
+                                                        gpointer         user_data)      : Run Last
+

+Emitted when asking the user a question and gives a list of +choices for the user to choose from. +

+

+If the message contains a line break, the first line should be +presented as a heading. For example, it may be used as the +primary text in a GtkMessageDialog.

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

op :

a GMountOperation asking a question. +

message :

string containing a message to display to the user. +

choices :

an array of strings for each possible choice. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "reply" signal

+
void                user_function                      (GMountOperation      *op,
+                                                        GMountOperationResult result,
+                                                        gpointer              user_data)      : Run Last
+

+Emitted when the user has replied to the mount operation.

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

op :

a GMountOperation. +

result :

a GMountOperationResult indicating how the request was handled +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "show-processes" signal

+
void                user_function                      (GMountOperation *op,
+                                                        gchar           *message,
+                                                        GArray          *processes,
+                                                        GStrv           *choices,
+                                                        gpointer         user_data)      : Run Last
+

+Emitted when one or more processes are blocking an operation +e.g. unmounting/ejecting a GMount or stopping a GDrive. +

+

+Note that this signal may be emitted several times to update the +list of blocking processes as processes close files. The +application should only respond with g_mount_operation_reply() to +the latest signal (setting "choice" to the choice +the user made). +

+

+If the message contains a line break, the first line should be +presented as a heading. For example, it may be used as the +primary text in a GtkMessageDialog.

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

op :

a GMountOperation. +

message :

string containing a message to display to the user. +

processes :

an array of GPid for processes blocking the operation. +

choices :

an array of strings for each possible choice. +

user_data :

user data set when the signal handler was connected.
+

Since 2.22

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GNetworkAddress.html b/docs/reference/gio/html/GNetworkAddress.html new file mode 100644 index 0000000..2fc3201 --- /dev/null +++ b/docs/reference/gio/html/GNetworkAddress.html @@ -0,0 +1,287 @@ + + + + +GNetworkAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GNetworkAddress

+

GNetworkAddress — A GSocketConnectable for resolving hostnames

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GNetworkAddress;
+GSocketConnectable * g_network_address_new              (const gchar *hostname,
+                                                         guint16 port);
+const gchar *       g_network_address_get_hostname      (GNetworkAddress *addr);
+guint16             g_network_address_get_port          (GNetworkAddress *addr);
+GSocketConnectable * g_network_address_parse            (const gchar *host_and_port,
+                                                         guint16 default_port,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GNetworkAddress
+
+
+
+

Implemented Interfaces

+

+GNetworkAddress implements + GSocketConnectable.

+
+
+

Properties

+
+  "hostname"                 gchar*                : Read / Write / Construct Only
+  "port"                     guint                 : Read / Write / Construct Only
+
+
+
+

Description

+

+GNetworkAddress provides an easy way to resolve a hostname and +then attempt to connect to that host, handling the possibility of +multiple IP addresses and multiple address families. +

+

+See GSocketConnectable for and example of using the connectable +interface.

+
+
+

Details

+
+

GNetworkAddress

+
typedef struct _GNetworkAddress GNetworkAddress;
+

+A GSocketConnectable for resolving a hostname and connecting to +that host.

+
+
+
+

g_network_address_new ()

+
GSocketConnectable * g_network_address_new              (const gchar *hostname,
+                                                         guint16 port);
+

+Creates a new GSocketConnectable for connecting to the given +hostname and port.

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

hostname :

the hostname +

port :

the port +

Returns :

the new GNetworkAddress + +
+

Since 2.22

+
+
+
+

g_network_address_get_hostname ()

+
const gchar *       g_network_address_get_hostname      (GNetworkAddress *addr);
+

+Gets addr's hostname. This might be either UTF-8 or ASCII-encoded, +depending on what addr was created with.

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

addr :

a GNetworkAddress +

Returns :

addr's hostname + +
+

Since 2.22

+
+
+
+

g_network_address_get_port ()

+
guint16             g_network_address_get_port          (GNetworkAddress *addr);
+

+Gets addr's port number

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

addr :

a GNetworkAddress +

Returns :

addr's port (which may be 0) + +
+

Since 2.22

+
+
+
+

g_network_address_parse ()

+
GSocketConnectable * g_network_address_parse            (const gchar *host_and_port,
+                                                         guint16 default_port,
+                                                         GError **error);
+

+Creates a new GSocketConnectable for connecting to the given +hostname and port. May fail and return NULL in case +parsing host_and_port fails. +

+

+host_and_port may be in any of a number of recognised formats: an IPv6 +address, an IPv4 address, or a domain name (in which case a DNS +lookup is performed). Quoting with [] is supported for all address +types. A port override may be specified in the usual way with a +colon. Ports may be given as decimal numbers or symbolic names (in +which case an /etc/services lookup is performed). +

+

+If no port is specified in host_and_port then default_port will be +used as the port number to connect to. +

+

+In general, host_and_port is expected to be provided by the user +(allowing them to give the hostname, and a port overide if necessary) +and default_port is expected to be provided by the application.

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

host_and_port :

the hostname and optionally a port +

default_port :

the default port if not in host_and_port +

error :

a pointer to a GError, or NULL +

Returns :

the new GNetworkAddress, or NULL on error + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "hostname" property

+
  "hostname"                 gchar*                : Read / Write / Construct Only
+

Hostname to resolve.

+

Default value: NULL

+
+
+
+

The "port" property

+
  "port"                     guint                 : Read / Write / Construct Only
+

Network port.

+

Allowed values: <= 65535

+

Default value: 0

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GNetworkService.html b/docs/reference/gio/html/GNetworkService.html new file mode 100644 index 0000000..05fd830 --- /dev/null +++ b/docs/reference/gio/html/GNetworkService.html @@ -0,0 +1,272 @@ + + + + +GNetworkService + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GNetworkService

+

GNetworkService — A GSocketConnectable for resolving SRV records

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GNetworkService;
+GSocketConnectable * g_network_service_new              (const gchar *service,
+                                                         const gchar *protocol,
+                                                         const gchar *domain);
+const gchar *       g_network_service_get_service       (GNetworkService *srv);
+const gchar *       g_network_service_get_protocol      (GNetworkService *srv);
+const gchar *       g_network_service_get_domain        (GNetworkService *srv);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GNetworkService
+
+
+
+

Implemented Interfaces

+

+GNetworkService implements + GSocketConnectable.

+
+
+

Properties

+
+  "domain"                   gchar*                : Read / Write / Construct Only
+  "protocol"                 gchar*                : Read / Write / Construct Only
+  "service"                  gchar*                : Read / Write / Construct Only
+
+
+
+

Description

+

+Like GNetworkAddress does with hostnames, GNetworkService +provides an easy way to resolve a SRV record, and then attempt to +connect to one of the hosts that implements that service, handling +service priority/weighting, multiple IP addresses, and multiple +address families. +

+

+See GSrvTarget for more information about SRV records, and see +GSocketConnectable for and example of using the connectable +interface.

+
+
+

Details

+
+

GNetworkService

+
typedef struct _GNetworkService GNetworkService;
+

+A GSocketConnectable for resolving a SRV record and connecting to +that service.

+
+
+
+

g_network_service_new ()

+
GSocketConnectable * g_network_service_new              (const gchar *service,
+                                                         const gchar *protocol,
+                                                         const gchar *domain);
+

+Creates a new GNetworkService representing the given service, +protocol, and domain. This will initially be unresolved; use the +GSocketConnectable interface to resolve it.

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

service :

the service type to look up (eg, "ldap") +

protocol :

the networking protocol to use for service (eg, "tcp") +

domain :

the DNS domain to look up the service in +

Returns :

a new GNetworkService + +
+

Since 2.22

+
+
+
+

g_network_service_get_service ()

+
const gchar *       g_network_service_get_service       (GNetworkService *srv);
+

+Gets srv's service name (eg, "ldap").

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

srv :

a GNetworkService +

Returns :

srv's service name + +
+

Since 2.22

+
+
+
+

g_network_service_get_protocol ()

+
const gchar *       g_network_service_get_protocol      (GNetworkService *srv);
+

+Gets srv's protocol name (eg, "tcp").

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

srv :

a GNetworkService +

Returns :

srv's protocol name + +
+

Since 2.22

+
+
+
+

g_network_service_get_domain ()

+
const gchar *       g_network_service_get_domain        (GNetworkService *srv);
+

+Gets the domain that srv serves. This might be either UTF-8 or +ASCII-encoded, depending on what srv was created with.

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

srv :

a GNetworkService +

Returns :

srv's domain name + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "domain" property

+
  "domain"                   gchar*                : Read / Write / Construct Only
+

Network domain, eg, "example.com".

+

Default value: NULL

+
+
+
+

The "protocol" property

+
  "protocol"                 gchar*                : Read / Write / Construct Only
+

Network protocol, eg "tcp".

+

Default value: NULL

+
+
+
+

The "service" property

+
  "service"                  gchar*                : Read / Write / Construct Only
+

Service name, eg "ldap".

+

Default value: NULL

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GOutputStream.html b/docs/reference/gio/html/GOutputStream.html new file mode 100644 index 0000000..5292b4c --- /dev/null +++ b/docs/reference/gio/html/GOutputStream.html @@ -0,0 +1,1015 @@ + + + + +GOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GOutputStream

+

GOutputStream — Base class for implementing streaming output

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+enum                GOutputStreamSpliceFlags;
+                    GOutputStream;
+gssize              g_output_stream_write               (GOutputStream *stream,
+                                                         const void *buffer,
+                                                         gsize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_output_stream_write_all           (GOutputStream *stream,
+                                                         const void *buffer,
+                                                         gsize count,
+                                                         gsize *bytes_written,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_output_stream_splice              (GOutputStream *stream,
+                                                         GInputStream *source,
+                                                         GOutputStreamSpliceFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_output_stream_flush               (GOutputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_output_stream_close               (GOutputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_output_stream_write_async         (GOutputStream *stream,
+                                                         const void *buffer,
+                                                         gsize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gssize              g_output_stream_write_finish        (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_output_stream_splice_async        (GOutputStream *stream,
+                                                         GInputStream *source,
+                                                         GOutputStreamSpliceFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gssize              g_output_stream_splice_finish       (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_output_stream_flush_async         (GOutputStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_output_stream_flush_finish        (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_output_stream_close_async         (GOutputStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_output_stream_close_finish        (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_output_stream_is_closing          (GOutputStream *stream);
+gboolean            g_output_stream_is_closed           (GOutputStream *stream);
+gboolean            g_output_stream_has_pending         (GOutputStream *stream);
+gboolean            g_output_stream_set_pending         (GOutputStream *stream,
+                                                         GError **error);
+void                g_output_stream_clear_pending       (GOutputStream *stream);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GFilterOutputStream
+         +----GFileOutputStream
+         +----GMemoryOutputStream
+         +----GUnixOutputStream
+
+
+
+

Description

+

+GOutputStream has functions to write to a stream (g_output_stream_write()), +to close a stream (g_output_stream_close()) and to flush pending writes +(g_output_stream_flush()). +

+

+To copy the content of an input stream to an output stream without +manually handling the reads and writes, use g_output_stream_splice(). +

+

+All of these functions have async variants too.

+
+
+

Details

+
+

enum GOutputStreamSpliceFlags

+
typedef enum {
+  G_OUTPUT_STREAM_SPLICE_NONE         = 0,
+  G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE = (1 << 0),
+  G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET = (1 << 1)
+} GOutputStreamSpliceFlags;
+
+

+GOutputStreamSpliceFlags determine how streams should be spliced.

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

G_OUTPUT_STREAM_SPLICE_NONE

Do not close either stream. +

G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE

Close the source stream after + the splice. +

G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET

Close the target stream after + the splice. +
+
+
+
+

GOutputStream

+
typedef struct _GOutputStream GOutputStream;
+

+Base class for writing output. +

+

+All classes derived from GOutputStream should implement synchronous +writing, splicing, flushing and closing streams, but may implement +asynchronous versions.

+
+
+
+

g_output_stream_write ()

+
gssize              g_output_stream_write               (GOutputStream *stream,
+                                                         const void *buffer,
+                                                         gsize count,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to write count bytes from buffer into the stream. Will block +during the operation. +

+

+If count is zero returns zero and does nothing. A value of count +larger than G_MAXSSIZE will cause a G_IO_ERROR_INVALID_ARGUMENT error. +

+

+On success, the number of bytes written to the stream is returned. +It is not an error if this is not the same as the requested size, as it +can happen e.g. on a partial i/o error, or if there is not enough +storage in the stream. All writes either block until at least one byte +is written, so zero is never returned (unless count is zero). +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an +operation was partially finished when the operation was cancelled the +partial result will be returned, without an error. +

+

+On error -1 is returned and error is set accordingly.

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

stream :

a GOutputStream. +

buffer :

the buffer containing the data to write. +

count :

the number of bytes to write +

cancellable :

optional cancellable object +

error :

location to store the error occuring, or NULL to ignore +

Returns :

Number of bytes written, or -1 on error +
+
+
+
+

g_output_stream_write_all ()

+
gboolean            g_output_stream_write_all           (GOutputStream *stream,
+                                                         const void *buffer,
+                                                         gsize count,
+                                                         gsize *bytes_written,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to write count bytes from buffer into the stream. Will block +during the operation. +

+

+This function is similar to g_output_stream_write(), except it tries to +write as many bytes as requested, only stopping on an error. +

+

+On a successful write of count bytes, TRUE is returned, and bytes_written +is set to count. +

+

+If there is an error during the operation FALSE is returned and error +is set to indicate the error status, bytes_written is updated to contain +the number of bytes written into the stream before the error occurred.

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

stream :

a GOutputStream. +

buffer :

the buffer containing the data to write. +

count :

the number of bytes to write +

bytes_written :

location to store the number of bytes that was + written to the stream +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

location to store the error occuring, or NULL to ignore +

Returns :

TRUE on success, FALSE if there was an error +
+
+
+
+

g_output_stream_splice ()

+
gssize              g_output_stream_splice              (GOutputStream *stream,
+                                                         GInputStream *source,
+                                                         GOutputStreamSpliceFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Splices an input stream into an output stream.

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

stream :

a GOutputStream. +

source :

a GInputStream. +

flags :

a set of GOutputStreamSpliceFlags. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a gssize containing the size of the data spliced, or + -1 if an error occurred. +
+
+
+
+

g_output_stream_flush ()

+
gboolean            g_output_stream_flush               (GOutputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Flushed any outstanding buffers in the stream. Will block during +the operation. Closing the stream will implicitly cause a flush. +

+

+This function is optional for inherited classes. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

stream :

a GOutputStream. +

cancellable :

optional cancellable object +

error :

location to store the error occuring, or NULL to ignore +

Returns :

TRUE on success, FALSE on error +
+
+
+
+

g_output_stream_close ()

+
gboolean            g_output_stream_close               (GOutputStream *stream,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Closes the stream, releasing resources related to it. +

+

+Once the stream is closed, all other operations will return G_IO_ERROR_CLOSED. +Closing a stream multiple times will not return an error. +

+

+Closing a stream will automatically flush any outstanding buffers in the +stream. +

+

+Streams will be automatically closed when the last reference +is dropped, but you might want to call this function to make sure +resources are released as early as possible. +

+

+Some streams might keep the backing store of the stream (e.g. a file descriptor) +open after the stream is closed. See the documentation for the individual +stream for details. +

+

+On failure the first error that happened will be reported, but the close +operation will finish as much as possible. A stream that failed to +close will still return G_IO_ERROR_CLOSED for all operations. Still, it +is important to check and report the error to the user, otherwise +there might be a loss of data as all data might not be written. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. +Cancelling a close will still leave the stream closed, but there some streams +can use a faster close that doesn't block to e.g. check errors. On +cancellation (as with any error) there is no guarantee that all written +data will reach the target.

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

stream :

A GOutputStream. +

cancellable :

optional cancellable object +

error :

location to store the error occuring, or NULL to ignore +

Returns :

TRUE on success, FALSE on failure +
+
+
+
+

g_output_stream_write_async ()

+
void                g_output_stream_write_async         (GOutputStream *stream,
+                                                         const void *buffer,
+                                                         gsize count,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Request an asynchronous write of count bytes from buffer into +the stream. When the operation is finished callback will be called. +You can then call g_output_stream_write_finish() to get the result of the +operation. +

+

+During an async request no other sync and async calls are allowed, +and will result in G_IO_ERROR_PENDING errors. +

+

+A value of count larger than G_MAXSSIZE will cause a +G_IO_ERROR_INVALID_ARGUMENT error. +

+

+On success, the number of bytes written will be passed to the +callback. It is not an error if this is not the same as the +requested size, as it can happen e.g. on a partial I/O error, +but generally we try to write as many bytes as requested. +

+

+Any outstanding I/O request with higher priority (lower numerical +value) will be executed before an outstanding request with lower +priority. Default priority is G_PRIORITY_DEFAULT. +

+

+The asyncronous methods have a default fallback that uses threads +to implement asynchronicity, so they are optional for inheriting +classes. However, if you override one you must override all. +

+

+For the synchronous, blocking version of this function, see +g_output_stream_write().

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

stream :

A GOutputStream. +

buffer :

the buffer containing the data to write. +

count :

the number of bytes to write +

io_priority :

the io priority of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_output_stream_write_finish ()

+
gssize              g_output_stream_write_finish        (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes a stream write operation.

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

stream :

a GOutputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a gssize containing the number of bytes written to the stream. +
+
+
+
+

g_output_stream_splice_async ()

+
void                g_output_stream_splice_async        (GOutputStream *stream,
+                                                         GInputStream *source,
+                                                         GOutputStreamSpliceFlags flags,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Splices a stream asynchronously. +When the operation is finished callback will be called. +You can then call g_output_stream_splice_finish() to get the +result of the operation. +

+

+For the synchronous, blocking version of this function, see +g_output_stream_splice().

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

stream :

a GOutputStream. +

source :

a GInputStream. +

flags :

a set of GOutputStreamSpliceFlags. +

io_priority :

the io priority of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback. +

user_data :

user data passed to callback. +
+
+
+
+

g_output_stream_splice_finish ()

+
gssize              g_output_stream_splice_finish       (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an asynchronous stream splice operation.

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

stream :

a GOutputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a gssize of the number of bytes spliced. +
+
+
+
+

g_output_stream_flush_async ()

+
void                g_output_stream_flush_async         (GOutputStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Flushes a stream asynchronously. +For behaviour details see g_output_stream_flush(). +

+

+When the operation is finished callback will be +called. You can then call g_output_stream_flush_finish() to get the +result of the operation.

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

stream :

a GOutputStream. +

io_priority :

the io priority of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_output_stream_flush_finish ()

+
gboolean            g_output_stream_flush_finish        (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes flushing an output stream.

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

stream :

a GOutputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if flush operation suceeded, FALSE otherwise. +
+
+
+
+

g_output_stream_close_async ()

+
void                g_output_stream_close_async         (GOutputStream *stream,
+                                                         int io_priority,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Requests an asynchronous close of the stream, releasing resources +related to it. When the operation is finished callback will be +called. You can then call g_output_stream_close_finish() to get +the result of the operation. +

+

+For behaviour details see g_output_stream_close(). +

+

+The asyncronous methods have a default fallback that uses threads +to implement asynchronicity, so they are optional for inheriting +classes. However, if you override one you must override all.

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

stream :

A GOutputStream. +

io_priority :

the io priority of the request. +

cancellable :

optional cancellable object +

callback :

callback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_output_stream_close_finish ()

+
gboolean            g_output_stream_close_finish        (GOutputStream *stream,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Closes an output stream.

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

stream :

a GOutputStream. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if stream was successfully closed, FALSE otherwise. +
+
+
+
+

g_output_stream_is_closing ()

+
gboolean            g_output_stream_is_closing          (GOutputStream *stream);
+

+Checks if an output stream is being closed. This can be +used inside e.g. a flush implementation to see if the +flush (or other i/o operation) is called from within +the closing operation.

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

stream :

a GOutputStream. +

Returns :

TRUE if stream is being closed. FALSE otherwise. + +
+

Since 2.24

+
+
+
+

g_output_stream_is_closed ()

+
gboolean            g_output_stream_is_closed           (GOutputStream *stream);
+

+Checks if an output stream has already been closed.

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

stream :

a GOutputStream. +

Returns :

TRUE if stream is closed. FALSE otherwise. +
+
+
+
+

g_output_stream_has_pending ()

+
gboolean            g_output_stream_has_pending         (GOutputStream *stream);
+

+Checks if an ouput stream has pending actions.

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

stream :

a GOutputStream. +

Returns :

TRUE if stream has pending actions. +
+
+
+
+

g_output_stream_set_pending ()

+
gboolean            g_output_stream_set_pending         (GOutputStream *stream,
+                                                         GError **error);
+

+Sets stream to have actions pending. If the pending flag is +already set or stream is closed, it will return FALSE and set +error.

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

stream :

a GOutputStream. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if pending was previously unset and is now set. +
+
+
+
+

g_output_stream_clear_pending ()

+
void                g_output_stream_clear_pending       (GOutputStream *stream);
+

+Clears the pending flag on stream.

+
++ + + + +

stream :

output stream +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GResolver.html b/docs/reference/gio/html/GResolver.html new file mode 100644 index 0000000..b634768 --- /dev/null +++ b/docs/reference/gio/html/GResolver.html @@ -0,0 +1,799 @@ + + + + +GResolver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GResolver

+

GResolver — Asynchronous and cancellable DNS resolver

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GResolver;
+GResolver *         g_resolver_get_default              (void);
+void                g_resolver_set_default              (GResolver *resolver);
+GList *             g_resolver_lookup_by_name           (GResolver *resolver,
+                                                         const gchar *hostname,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_resolver_lookup_by_name_async     (GResolver *resolver,
+                                                         const gchar *hostname,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GList *             g_resolver_lookup_by_name_finish    (GResolver *resolver,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_resolver_free_addresses           (GList *addresses);
+gchar *             g_resolver_lookup_by_address        (GResolver *resolver,
+                                                         GInetAddress *address,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_resolver_lookup_by_address_async  (GResolver *resolver,
+                                                         GInetAddress *address,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gchar *             g_resolver_lookup_by_address_finish (GResolver *resolver,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+GList *             g_resolver_lookup_service           (GResolver *resolver,
+                                                         const gchar *service,
+                                                         const gchar *protocol,
+                                                         const gchar *domain,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_resolver_lookup_service_async     (GResolver *resolver,
+                                                         const gchar *service,
+                                                         const gchar *protocol,
+                                                         const gchar *domain,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GList *             g_resolver_lookup_service_finish    (GResolver *resolver,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_resolver_free_targets             (GList *targets);
+
+#define             G_RESOLVER_ERROR
+enum                GResolverError;
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GResolver
+
+
+
+

Signals

+
+  "reload"                                         : Run Last
+
+
+
+

Description

+

+GResolver provides cancellable synchronous and asynchronous DNS +resolution, for hostnames (g_resolver_lookup_by_address(), +g_resolver_lookup_by_name() and their async variants) and SRV +(service) records (g_resolver_lookup_service()). +

+

+GNetworkAddress and GNetworkService provide wrappers around +GResolver functionality that also implement GSocketConnectable, +making it easy to connect to a remote host/service.

+
+
+

Details

+
+

GResolver

+
typedef struct _GResolver GResolver;
+

+The object that handles DNS resolution. Use g_resolver_get_default() +to get the default resolver.

+
+
+
+

g_resolver_get_default ()

+
GResolver *         g_resolver_get_default              (void);
+

+Gets the default GResolver. You should unref it when you are done +with it. GResolver may use its reference count as a hint about how +many threads/processes, etc it should allocate for concurrent DNS +resolutions.

+
++ + + + +

Returns :

the default GResolver. + +
+

Since 2.22

+
+
+
+

g_resolver_set_default ()

+
void                g_resolver_set_default              (GResolver *resolver);
+

+Sets resolver to be the application's default resolver (reffing +resolver, and unreffing the previous default resolver, if any). +Future calls to g_resolver_get_default() will return this resolver. +

+

+This can be used if an application wants to perform any sort of DNS +caching or "pinning"; it can implement its own GResolver that +calls the original default resolver for DNS operations, and +implements its own cache policies on top of that, and then set +itself as the default resolver for all later code to use.

+
++ + + + +

resolver :

the new default GResolver +
+

Since 2.22

+
+
+
+

g_resolver_lookup_by_name ()

+
GList *             g_resolver_lookup_by_name           (GResolver *resolver,
+                                                         const gchar *hostname,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Synchronously resolves hostname to determine its associated IP +address(es). hostname may be an ASCII-only or UTF-8 hostname, or +the textual form of an IP address (in which case this just becomes +a wrapper around g_inet_address_new_from_string()). +

+

+On success, g_resolver_lookup_by_name() will return a GList of +GInetAddress, sorted in order of preference. (That is, you should +attempt to connect to the first address first, then the second if +the first fails, etc.) +

+

+If the DNS resolution fails, error (if non-NULL) will be set to a +value from GResolverError. +

+

+If cancellable is non-NULL, it can be used to cancel the +operation, in which case error (if non-NULL) will be set to +G_IO_ERROR_CANCELLED. +

+

+If you are planning to connect to a socket on the resolved IP +address, it may be easier to create a GNetworkAddress and use its +GSocketConnectable interface.

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

resolver :

a GResolver +

hostname :

the hostname to look up +

cancellable :

a GCancellable, or NULL +

error :

return location for a GError, or NULL +

Returns :

a GList of GInetAddress, or NULL on error. You +must unref each of the addresses and free the list when you are +done with it. (You can use g_resolver_free_addresses() to do this.) + +
+

Since 2.22

+
+
+
+

g_resolver_lookup_by_name_async ()

+
void                g_resolver_lookup_by_name_async     (GResolver *resolver,
+                                                         const gchar *hostname,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Begins asynchronously resolving hostname to determine its +associated IP address(es), and eventually calls callback, which +must call g_resolver_lookup_by_name_finish() to get the result. +See g_resolver_lookup_by_name() for more details.

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

resolver :

a GResolver +

hostname :

the hostname to look up the address of +

cancellable :

a GCancellable, or NULL +

callback :

callback to call after resolution completes +

user_data :

data for callback +
+

Since 2.22

+
+
+
+

g_resolver_lookup_by_name_finish ()

+
GList *             g_resolver_lookup_by_name_finish    (GResolver *resolver,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Retrieves the result of a call to +g_resolver_lookup_by_name_async(). +

+

+If the DNS resolution failed, error (if non-NULL) will be set to +a value from GResolverError. If the operation was cancelled, +error will be set to G_IO_ERROR_CANCELLED.

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

resolver :

a GResolver +

result :

the result passed to your GAsyncReadyCallback +

error :

return location for a GError, or NULL +

Returns :

a GList of GInetAddress, or NULL on error. See +g_resolver_lookup_by_name() for more details. + +
+

Since 2.22

+
+
+
+

g_resolver_free_addresses ()

+
void                g_resolver_free_addresses           (GList *addresses);
+

+Frees addresses (which should be the return value from +g_resolver_lookup_by_name() or g_resolver_lookup_by_name_finish()). +(This is a convenience method; you can also simply free the results +by hand.)

+
++ + + + +

addresses :

a GList of GInetAddress +
+

Since 2.22

+
+
+
+

g_resolver_lookup_by_address ()

+
gchar *             g_resolver_lookup_by_address        (GResolver *resolver,
+                                                         GInetAddress *address,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Synchronously reverse-resolves address to determine its +associated hostname. +

+

+If the DNS resolution fails, error (if non-NULL) will be set to +a value from GResolverError. +

+

+If cancellable is non-NULL, it can be used to cancel the +operation, in which case error (if non-NULL) will be set to +G_IO_ERROR_CANCELLED.

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

resolver :

a GResolver +

address :

the address to reverse-resolve +

cancellable :

a GCancellable, or NULL +

error :

return location for a GError, or NULL +

Returns :

a hostname (either ASCII-only, or in ASCII-encoded + form), or NULL on error. + +
+

Since 2.22

+
+
+
+

g_resolver_lookup_by_address_async ()

+
void                g_resolver_lookup_by_address_async  (GResolver *resolver,
+                                                         GInetAddress *address,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Begins asynchronously reverse-resolving address to determine its +associated hostname, and eventually calls callback, which must +call g_resolver_lookup_by_address_finish() to get the final result.

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

resolver :

a GResolver +

address :

the address to reverse-resolve +

cancellable :

a GCancellable, or NULL +

callback :

callback to call after resolution completes +

user_data :

data for callback +
+

Since 2.22

+
+
+
+

g_resolver_lookup_by_address_finish ()

+
gchar *             g_resolver_lookup_by_address_finish (GResolver *resolver,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Retrieves the result of a previous call to +g_resolver_lookup_by_address_async(). +

+

+If the DNS resolution failed, error (if non-NULL) will be set to +a value from GResolverError. If the operation was cancelled, +error will be set to G_IO_ERROR_CANCELLED.

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

resolver :

a GResolver +

result :

the result passed to your GAsyncReadyCallback +

error :

return location for a GError, or NULL +

Returns :

a hostname (either ASCII-only, or in ASCII-encoded +form), or NULL on error. + +
+

Since 2.22

+
+
+
+

g_resolver_lookup_service ()

+
GList *             g_resolver_lookup_service           (GResolver *resolver,
+                                                         const gchar *service,
+                                                         const gchar *protocol,
+                                                         const gchar *domain,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Synchronously performs a DNS SRV lookup for the given service and +protocol in the given domain and returns an array of GSrvTarget. +domain may be an ASCII-only or UTF-8 hostname. Note also that the +service and protocol arguments do not +include the leading underscore that appears in the actual DNS +entry. +

+

+On success, g_resolver_lookup_service() will return a GList of +GSrvTarget, sorted in order of preference. (That is, you should +attempt to connect to the first target first, then the second if +the first fails, etc.) +

+

+If the DNS resolution fails, error (if non-NULL) will be set to +a value from GResolverError. +

+

+If cancellable is non-NULL, it can be used to cancel the +operation, in which case error (if non-NULL) will be set to +G_IO_ERROR_CANCELLED. +

+

+If you are planning to connect to the service, it is usually easier +to create a GNetworkService and use its GSocketConnectable +interface.

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

resolver :

a GResolver +

service :

the service type to look up (eg, "ldap") +

protocol :

the networking protocol to use for service (eg, "tcp") +

domain :

the DNS domain to look up the service in +

cancellable :

a GCancellable, or NULL +

error :

return location for a GError, or NULL +

Returns :

a GList of GSrvTarget, or NULL on error. You must +free each of the targets and the list when you are done with it. +(You can use g_resolver_free_targets() to do this.) + +
+

Since 2.22

+
+
+
+

g_resolver_lookup_service_async ()

+
void                g_resolver_lookup_service_async     (GResolver *resolver,
+                                                         const gchar *service,
+                                                         const gchar *protocol,
+                                                         const gchar *domain,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Begins asynchronously performing a DNS SRV lookup for the given +service and protocol in the given domain, and eventually calls +callback, which must call g_resolver_lookup_service_finish() to +get the final result. See g_resolver_lookup_service() for more +details.

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

resolver :

a GResolver +

service :

the service type to look up (eg, "ldap") +

protocol :

the networking protocol to use for service (eg, "tcp") +

domain :

the DNS domain to look up the service in +

cancellable :

a GCancellable, or NULL +

callback :

callback to call after resolution completes +

user_data :

data for callback +
+

Since 2.22

+
+
+
+

g_resolver_lookup_service_finish ()

+
GList *             g_resolver_lookup_service_finish    (GResolver *resolver,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Retrieves the result of a previous call to +g_resolver_lookup_service_async(). +

+

+If the DNS resolution failed, error (if non-NULL) will be set to +a value from GResolverError. If the operation was cancelled, +error will be set to G_IO_ERROR_CANCELLED.

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

resolver :

a GResolver +

result :

the result passed to your GAsyncReadyCallback +

error :

return location for a GError, or NULL +

Returns :

a GList of GSrvTarget, or NULL on error. See +g_resolver_lookup_service() for more details. + +
+

Since 2.22

+
+
+
+

g_resolver_free_targets ()

+
void                g_resolver_free_targets             (GList *targets);
+

+Frees targets (which should be the return value from +g_resolver_lookup_service() or g_resolver_lookup_service_finish()). +(This is a convenience method; you can also simply free the +results by hand.)

+
++ + + + +

targets :

a GList of GSrvTarget +
+

Since 2.22

+
+
+
+

G_RESOLVER_ERROR

+
#define G_RESOLVER_ERROR (g_resolver_error_quark ())
+
+

+Error domain for GResolver. Errors in this domain will be from the +GResolverError enumeration. See GError for more information on +error domains.

+
+
+
+

enum GResolverError

+
typedef enum {
+  G_RESOLVER_ERROR_NOT_FOUND,
+  G_RESOLVER_ERROR_TEMPORARY_FAILURE,
+  G_RESOLVER_ERROR_INTERNAL
+} GResolverError;
+
+

+An error code used with G_RESOLVER_ERROR in a GError returned +from a GResolver routine.

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

G_RESOLVER_ERROR_NOT_FOUND

the requested name/address/service was not + found +

G_RESOLVER_ERROR_TEMPORARY_FAILURE

the requested information could not + be looked up due to a network error or similar problem +

G_RESOLVER_ERROR_INTERNAL

unknown error +
+

Since 2.22

+
+
+
+

Signal Details

+
+

The "reload" signal

+
void                user_function                      (GResolver *resolver,
+                                                        gpointer   user_data)      : Run Last
+

+Emitted when the resolver notices that the system resolver +configuration has changed.

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

resolver :

a GResolver +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSeekable.html b/docs/reference/gio/html/GSeekable.html new file mode 100644 index 0000000..5962821 --- /dev/null +++ b/docs/reference/gio/html/GSeekable.html @@ -0,0 +1,372 @@ + + + + +GSeekable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSeekable

+

GSeekable — Stream seeking interface

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GSeekable;
+                    GSeekableIface;
+goffset             g_seekable_tell                     (GSeekable *seekable);
+gboolean            g_seekable_can_seek                 (GSeekable *seekable);
+gboolean            g_seekable_seek                     (GSeekable *seekable,
+                                                         goffset offset,
+                                                         GSeekType type,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_seekable_can_truncate             (GSeekable *seekable);
+gboolean            g_seekable_truncate                 (GSeekable *seekable,
+                                                         goffset offset,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GSeekable
+
+
+
+

Prerequisites

+

+GSeekable requires + GObject.

+
+
+

Known Implementations

+

+GSeekable is implemented by + GFileOutputStream, GMemoryOutputStream, GFileIOStream, GMemoryInputStream and GFileInputStream.

+
+
+

Description

+

+GSeekable is implemented by streams (implementations of +GInputStream or GOutputStream) that support seeking.

+
+
+

Details

+
+

GSeekable

+
typedef struct _GSeekable GSeekable;
+

+Seek object for streaming operations.

+
+
+
+

GSeekableIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  goffset     (* tell)	         (GSeekable    *seekable);
+
+  gboolean    (* can_seek)       (GSeekable    *seekable);
+  gboolean    (* seek)	         (GSeekable    *seekable,
+				  goffset       offset,
+				  GSeekType     type,
+				  GCancellable *cancellable,
+				  GError      **error);
+
+  gboolean    (* can_truncate)   (GSeekable    *seekable);
+  gboolean    (* truncate_fn)    (GSeekable    *seekable,
+				  goffset       offset,
+				  GCancellable *cancellable,
+				  GError       **error);
+
+  /* TODO: Async seek/truncate */
+} GSeekableIface;
+
+

+Provides an interface for implementing seekable functionality on I/O Streams.

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

GTypeInterface g_iface;

The parent interface. +

tell ()

Tells the current location within a stream. +

can_seek ()

Checks if seeking is supported by the stream. +

seek ()

Seeks to a location within a stream. +

can_truncate ()

Chekcs if truncation is suppored by the stream. +

truncate_fn ()

Truncates a stream. +
+
+
+
+

g_seekable_tell ()

+
goffset             g_seekable_tell                     (GSeekable *seekable);
+

+Tells the current position within the stream.

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

seekable :

a GSeekable. +

Returns :

the offset from the beginning of the buffer. +
+
+
+
+

g_seekable_can_seek ()

+
gboolean            g_seekable_can_seek                 (GSeekable *seekable);
+

+Tests if the stream supports the GSeekableIface.

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

seekable :

a GSeekable. +

Returns :

TRUE if seekable can be seeked. FALSE otherwise. +
+
+
+
+

g_seekable_seek ()

+
gboolean            g_seekable_seek                     (GSeekable *seekable,
+                                                         goffset offset,
+                                                         GSeekType type,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Seeks in the stream by the given offset, modified by type. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

seekable :

a GSeekable. +

offset :

a goffset. +

type :

a GSeekType. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if successful. If an error + has occurred, this function will return FALSE and set error + appropriately if present. +
+
+
+
+

g_seekable_can_truncate ()

+
gboolean            g_seekable_can_truncate             (GSeekable *seekable);
+

+Tests if the stream can be truncated.

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

seekable :

a GSeekable. +

Returns :

TRUE if the stream can be truncated, FALSE otherwise. +
+
+
+
+

g_seekable_truncate ()

+
gboolean            g_seekable_truncate                 (GSeekable *seekable,
+                                                         goffset offset,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Truncates a stream with a given offset. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an +operation was partially finished when the operation was cancelled the +partial result will be returned, without an error.

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

seekable :

a GSeekable. +

offset :

a goffset. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

TRUE if successful. If an error + has occurred, this function will return FALSE and set error + appropriately if present. +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSimpleAsyncResult.html b/docs/reference/gio/html/GSimpleAsyncResult.html new file mode 100644 index 0000000..1b02785 --- /dev/null +++ b/docs/reference/gio/html/GSimpleAsyncResult.html @@ -0,0 +1,984 @@ + + + + +GSimpleAsyncResult + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSimpleAsyncResult

+

GSimpleAsyncResult — Simple asynchronous results implementation

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GSimpleAsyncResult;
+void                (*GSimpleAsyncThreadFunc)           (GSimpleAsyncResult *res,
+                                                         GObject *object,
+                                                         GCancellable *cancellable);
+GSimpleAsyncResult * g_simple_async_result_new          (GObject *source_object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         gpointer source_tag);
+GSimpleAsyncResult * g_simple_async_result_new_error    (GObject *source_object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         ...);
+GSimpleAsyncResult * g_simple_async_result_new_from_error
+                                                        (GObject *source_object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GError *error);
+void                g_simple_async_result_set_op_res_gpointer
+                                                        (GSimpleAsyncResult *simple,
+                                                         gpointer op_res,
+                                                         GDestroyNotify destroy_op_res);
+gpointer            g_simple_async_result_get_op_res_gpointer
+                                                        (GSimpleAsyncResult *simple);
+void                g_simple_async_result_set_op_res_gssize
+                                                        (GSimpleAsyncResult *simple,
+                                                         gssize op_res);
+gssize              g_simple_async_result_get_op_res_gssize
+                                                        (GSimpleAsyncResult *simple);
+void                g_simple_async_result_set_op_res_gboolean
+                                                        (GSimpleAsyncResult *simple,
+                                                         gboolean op_res);
+gboolean            g_simple_async_result_get_op_res_gboolean
+                                                        (GSimpleAsyncResult *simple);
+gpointer            g_simple_async_result_get_source_tag
+                                                        (GSimpleAsyncResult *simple);
+gboolean            g_simple_async_result_is_valid      (GAsyncResult *result,
+                                                         GObject *source,
+                                                         gpointer source_tag);
+void                g_simple_async_result_set_handle_cancellation
+                                                        (GSimpleAsyncResult *simple,
+                                                         gboolean handle_cancellation);
+void                g_simple_async_result_complete      (GSimpleAsyncResult *simple);
+void                g_simple_async_result_complete_in_idle
+                                                        (GSimpleAsyncResult *simple);
+void                g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple,
+                                                         GSimpleAsyncThreadFunc func,
+                                                         int io_priority,
+                                                         GCancellable *cancellable);
+void                g_simple_async_result_set_from_error
+                                                        (GSimpleAsyncResult *simple,
+                                                         const GError *error);
+gboolean            g_simple_async_result_propagate_error
+                                                        (GSimpleAsyncResult *simple,
+                                                         GError **dest);
+void                g_simple_async_result_set_error     (GSimpleAsyncResult *simple,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         ...);
+void                g_simple_async_result_set_error_va  (GSimpleAsyncResult *simple,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         va_list args);
+void                g_simple_async_report_error_in_idle (GObject *object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         ...);
+void                g_simple_async_report_gerror_in_idle
+                                                        (GObject *object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GError *error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSimpleAsyncResult
+
+
+
+

Implemented Interfaces

+

+GSimpleAsyncResult implements + GAsyncResult.

+
+
+

Description

+

+Implements GAsyncResult for simple cases. Most of the time, this +will be all an application needs, and will be used transparently. +Because of this, GSimpleAsyncResult is used throughout GIO for +handling asynchronous functions. +

+

+GSimpleAsyncResult handles GAsyncReadyCallbacks, error +reporting, operation cancellation and the final state of an operation, +completely transparent to the application. Results can be returned +as a pointer e.g. for functions that return data that is collected +asynchronously, a boolean value for checking the success or failure +of an operation, or a gssize for operations which return the number +of bytes modified by the operation; all of the simple return cases +are covered. +

+

+Most of the time, an application will not need to know of the details +of this API; it is handled transparently, and any necessary operations +are handled by GAsyncResult's interface. However, if implementing a +new GIO module, for writing language bindings, or for complex +applications that need better control of how asynchronous operations +are completed, it is important to understand this functionality. +

+

+GSimpleAsyncResults are tagged with the calling function to ensure +that asynchronous functions and their finishing functions are used +together correctly. +

+

+To create a new GSimpleAsyncResult, call g_simple_async_result_new(). +If the result needs to be created for a GError, use +g_simple_async_result_new_from_error(). If a GError is not available +(e.g. the asynchronous operation's doesn't take a GError argument), +but the result still needs to be created for an error condition, use +g_simple_async_result_new_error() (or g_simple_async_result_set_error_va() +if your application or binding requires passing a variable argument list +directly), and the error can then be propagated through the use of +g_simple_async_result_propagate_error(). +

+

+An asynchronous operation can be made to ignore a cancellation event by +calling g_simple_async_result_set_handle_cancellation() with a +GSimpleAsyncResult for the operation and FALSE. This is useful for +operations that are dangerous to cancel, such as close (which would +cause a leak if cancelled before being run). +

+

+GSimpleAsyncResult can integrate into GLib's event loop, GMainLoop, +or it can use GThreads if available. +g_simple_async_result_complete() will finish an I/O task directly +from the point where it is called. g_simple_async_result_complete_in_idle() +will finish it from an idle handler in the thread-default main +context. g_simple_async_result_run_in_thread() will run the +job in a separate thread and then deliver the result to the +thread-default main context. +

+

+To set the results of an asynchronous function, +g_simple_async_result_set_op_res_gpointer(), +g_simple_async_result_set_op_res_gboolean(), and +g_simple_async_result_set_op_res_gssize() +are provided, setting the operation's result to a gpointer, gboolean, or +gssize, respectively. +

+

+Likewise, to get the result of an asynchronous function, +g_simple_async_result_get_op_res_gpointer(), +g_simple_async_result_get_op_res_gboolean(), and +g_simple_async_result_get_op_res_gssize() are +provided, getting the operation's result as a gpointer, gboolean, and +gssize, respectively.

+
+
+

Details

+
+

GSimpleAsyncResult

+
typedef struct _GSimpleAsyncResult GSimpleAsyncResult;
+

+A simple implementation of GAsyncResult.

+
+
+
+

GSimpleAsyncThreadFunc ()

+
void                (*GSimpleAsyncThreadFunc)           (GSimpleAsyncResult *res,
+                                                         GObject *object,
+                                                         GCancellable *cancellable);
+

+Simple thread function that runs an asynchronous operation and +checks for cancellation.

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

res :

a GSimpleAsyncResult. +

object :

a GObject. +

cancellable :

optional GCancellable object, NULL to ignore. +
+
+
+
+

g_simple_async_result_new ()

+
GSimpleAsyncResult * g_simple_async_result_new          (GObject *source_object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         gpointer source_tag);
+

+Creates a GSimpleAsyncResult.

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

source_object :

a GObject the asynchronous function was called with, +or NULL. +

callback :

a GAsyncReadyCallback. +

user_data :

user data passed to callback. +

source_tag :

the asynchronous function. +

Returns :

a GSimpleAsyncResult. +
+
+
+
+

g_simple_async_result_new_error ()

+
GSimpleAsyncResult * g_simple_async_result_new_error    (GObject *source_object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         ...);
+

+Creates a new GSimpleAsyncResult with a set error.

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

source_object :

a GObject, or NULL. +

callback :

a GAsyncReadyCallback. +

user_data :

user data passed to callback. +

domain :

a GQuark. +

code :

an error code. +

format :

a string with format characters. +

... :

a list of values to insert into format. +

Returns :

a GSimpleAsyncResult. +
+
+
+
+

g_simple_async_result_new_from_error ()

+
GSimpleAsyncResult * g_simple_async_result_new_from_error
+                                                        (GObject *source_object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GError *error);
+

+Creates a GSimpleAsyncResult from an error condition.

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

source_object :

a GObject, or NULL. +

callback :

a GAsyncReadyCallback. +

user_data :

user data passed to callback. +

error :

a GError location. +

Returns :

a GSimpleAsyncResult. +
+
+
+
+

g_simple_async_result_set_op_res_gpointer ()

+
void                g_simple_async_result_set_op_res_gpointer
+                                                        (GSimpleAsyncResult *simple,
+                                                         gpointer op_res,
+                                                         GDestroyNotify destroy_op_res);
+

+Sets the operation result within the asynchronous result to a pointer.

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

simple :

a GSimpleAsyncResult. +

op_res :

a pointer result from an asynchronous function. +

destroy_op_res :

a GDestroyNotify function. +
+
+
+
+

g_simple_async_result_get_op_res_gpointer ()

+
gpointer            g_simple_async_result_get_op_res_gpointer
+                                                        (GSimpleAsyncResult *simple);
+

+Gets a pointer result as returned by the asynchronous function.

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

simple :

a GSimpleAsyncResult. +

Returns :

a pointer from the result. +
+
+
+
+

g_simple_async_result_set_op_res_gssize ()

+
void                g_simple_async_result_set_op_res_gssize
+                                                        (GSimpleAsyncResult *simple,
+                                                         gssize op_res);
+

+Sets the operation result within the asynchronous result to +the given op_res.

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

simple :

a GSimpleAsyncResult. +

op_res :

a gssize. +
+
+
+
+

g_simple_async_result_get_op_res_gssize ()

+
gssize              g_simple_async_result_get_op_res_gssize
+                                                        (GSimpleAsyncResult *simple);
+

+Gets a gssize from the asynchronous result.

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

simple :

a GSimpleAsyncResult. +

Returns :

a gssize returned from the asynchronous function. +
+
+
+
+

g_simple_async_result_set_op_res_gboolean ()

+
void                g_simple_async_result_set_op_res_gboolean
+                                                        (GSimpleAsyncResult *simple,
+                                                         gboolean op_res);
+

+Sets the operation result to a boolean within the asynchronous result.

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

simple :

a GSimpleAsyncResult. +

op_res :

a gboolean. +
+
+
+
+

g_simple_async_result_get_op_res_gboolean ()

+
gboolean            g_simple_async_result_get_op_res_gboolean
+                                                        (GSimpleAsyncResult *simple);
+

+Gets the operation result boolean from within the asynchronous result.

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

simple :

a GSimpleAsyncResult. +

Returns :

TRUE if the operation's result was TRUE, FALSE + if the operation's result was FALSE. +
+
+
+
+

g_simple_async_result_get_source_tag ()

+
gpointer            g_simple_async_result_get_source_tag
+                                                        (GSimpleAsyncResult *simple);
+

+Gets the source tag for the GSimpleAsyncResult.

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

simple :

a GSimpleAsyncResult. +

Returns :

a gpointer to the source object for the GSimpleAsyncResult. +
+
+
+
+

g_simple_async_result_is_valid ()

+
gboolean            g_simple_async_result_is_valid      (GAsyncResult *result,
+                                                         GObject *source,
+                                                         gpointer source_tag);
+

+Ensures that the data passed to the _finish function of an async +operation is consistent. Three checks are performed. +

+

+First, result is checked to ensure that it is really a +GSimpleAsyncResult. Second, source is checked to ensure that it +matches the source object of result. Third, source_tag is +checked to ensure that it is equal to the source_tag argument given +to g_simple_async_result_new() (which, by convention, is a pointer +to the _async function corresponding to the _finish function from +which this function is called).

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

result :

the GAsyncResult passed to the _finish function. +

source :

the GObject passed to the _finish function. +

source_tag :

the asynchronous function. +

Returns :

TRUE if all checks passed or FALSE if any failed. +
+
+
+
+

g_simple_async_result_set_handle_cancellation ()

+
void                g_simple_async_result_set_handle_cancellation
+                                                        (GSimpleAsyncResult *simple,
+                                                         gboolean handle_cancellation);
+

+Sets whether to handle cancellation within the asynchronous operation.

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

simple :

a GSimpleAsyncResult. +

handle_cancellation :

a gboolean. +
+
+
+
+

g_simple_async_result_complete ()

+
void                g_simple_async_result_complete      (GSimpleAsyncResult *simple);
+

+Completes an asynchronous I/O job immediately. Must be called in +the thread where the asynchronous result was to be delivered, as it +invokes the callback directly. If you are in a different thread use +g_simple_async_result_complete_in_idle().

+
++ + + + +

simple :

a GSimpleAsyncResult. +
+
+
+
+

g_simple_async_result_complete_in_idle ()

+
void                g_simple_async_result_complete_in_idle
+                                                        (GSimpleAsyncResult *simple);
+

+Completes an asynchronous function in an idle handler in the thread-default main +loop of the thread that simple was initially created in. +

+

+Calling this function takes a reference to simple for as long as +is needed to complete the call.

+
++ + + + +

simple :

a GSimpleAsyncResult. +
+
+
+
+

g_simple_async_result_run_in_thread ()

+
void                g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple,
+                                                         GSimpleAsyncThreadFunc func,
+                                                         int io_priority,
+                                                         GCancellable *cancellable);
+

+Runs the asynchronous job in a separate thread and then calls +g_simple_async_result_complete_in_idle() on simple to return +the result to the appropriate main loop. +

+

+Calling this function takes a reference to simple for as long as +is needed to run the job and report its completion.

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

simple :

a GSimpleAsyncResult. +

func :

a GSimpleAsyncThreadFunc. +

io_priority :

the io priority of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +
+
+
+
+

g_simple_async_result_set_from_error ()

+
void                g_simple_async_result_set_from_error
+                                                        (GSimpleAsyncResult *simple,
+                                                         const GError *error);
+

+Sets the result from a GError.

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

simple :

a GSimpleAsyncResult. +

error :

GError. +
+
+
+
+

g_simple_async_result_propagate_error ()

+
gboolean            g_simple_async_result_propagate_error
+                                                        (GSimpleAsyncResult *simple,
+                                                         GError **dest);
+

+Propagates an error from within the simple asynchronous result to +a given destination.

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

simple :

a GSimpleAsyncResult. +

dest :

a location to propegate the error to. +

Returns :

TRUE if the error was propagated to dest. FALSE otherwise. +
+
+
+
+

g_simple_async_result_set_error ()

+
void                g_simple_async_result_set_error     (GSimpleAsyncResult *simple,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         ...);
+

+Sets an error within the asynchronous result without a GError.

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

simple :

a GSimpleAsyncResult. +

domain :

a GQuark (usually G_IO_ERROR). +

code :

an error code. +

format :

a formatted error reporting string. +

... :

a list of variables to fill in format. +
+
+
+
+

g_simple_async_result_set_error_va ()

+
void                g_simple_async_result_set_error_va  (GSimpleAsyncResult *simple,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         va_list args);
+

+Sets an error within the asynchronous result without a GError. +Unless writing a binding, see g_simple_async_result_set_error().

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

simple :

a GSimpleAsyncResult. +

domain :

a GQuark (usually G_IO_ERROR). +

code :

an error code. +

format :

a formatted error reporting string. +

args :

va_list of arguments. +
+
+
+
+

g_simple_async_report_error_in_idle ()

+
void                g_simple_async_report_error_in_idle (GObject *object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const char *format,
+                                                         ...);
+

+Reports an error in an asynchronous function in an idle function by +directly setting the contents of the GAsyncResult with the given error +information.

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

object :

a GObject. +

callback :

a GAsyncReadyCallback. +

user_data :

user data passed to callback. +

domain :

a GQuark containing the error domain (usually G_IO_ERROR). +

code :

a specific error code. +

format :

a formatted error reporting string. +

... :

a list of variables to fill in format. +
+
+
+
+

g_simple_async_report_gerror_in_idle ()

+
void                g_simple_async_report_gerror_in_idle
+                                                        (GObject *object,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data,
+                                                         GError *error);
+

+Reports an error in an idle function. Similar to +g_simple_async_report_error_in_idle(), but takes a GError rather +than building a new one.

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

object :

a GObject. +

callback :

a GAsyncReadyCallback. +

user_data :

user data passed to callback. +

error :

the GError to report +
+
+
+
+

See Also

+GAsyncResult +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocket.html b/docs/reference/gio/html/GSocket.html new file mode 100644 index 0000000..b36f4db --- /dev/null +++ b/docs/reference/gio/html/GSocket.html @@ -0,0 +1,2125 @@ + + + + +GSocket + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocket

+

GSocket — Low-level socket object

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GSocket;
+gboolean            (*GSocketSourceFunc)                (GSocket *socket,
+                                                         GIOCondition condition,
+                                                         gpointer user_data);
+enum                GSocketType;
+enum                GSocketProtocol;
+enum                GSocketMsgFlags;
+                    GInputVector;
+                    GOutputVector;
+GSocket *           g_socket_new                        (GSocketFamily family,
+                                                         GSocketType type,
+                                                         GSocketProtocol protocol,
+                                                         GError **error);
+GSocket *           g_socket_new_from_fd                (gint fd,
+                                                         GError **error);
+gboolean            g_socket_bind                       (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         gboolean allow_reuse,
+                                                         GError **error);
+gboolean            g_socket_listen                     (GSocket *socket,
+                                                         GError **error);
+GSocket *           g_socket_accept                     (GSocket *socket,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_socket_connect                    (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_socket_check_connect_result       (GSocket *socket,
+                                                         GError **error);
+gssize              g_socket_receive                    (GSocket *socket,
+                                                         gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_socket_receive_from               (GSocket *socket,
+                                                         GSocketAddress **address,
+                                                         gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_socket_receive_message            (GSocket *socket,
+                                                         GSocketAddress **address,
+                                                         GInputVector *vectors,
+                                                         gint num_vectors,
+                                                         GSocketControlMessage ***messages,
+                                                         gint *num_messages,
+                                                         gint *flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_socket_send                       (GSocket *socket,
+                                                         const gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_socket_send_to                    (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         const gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gssize              g_socket_send_message               (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         GOutputVector *vectors,
+                                                         gint num_vectors,
+                                                         GSocketControlMessage **messages,
+                                                         gint num_messages,
+                                                         gint flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+gboolean            g_socket_close                      (GSocket *socket,
+                                                         GError **error);
+gboolean            g_socket_is_closed                  (GSocket *socket);
+gboolean            g_socket_shutdown                   (GSocket *socket,
+                                                         gboolean shutdown_read,
+                                                         gboolean shutdown_write,
+                                                         GError **error);
+gboolean            g_socket_is_connected               (GSocket *socket);
+GSource *           g_socket_create_source              (GSocket *socket,
+                                                         GIOCondition condition,
+                                                         GCancellable *cancellable);
+GIOCondition        g_socket_condition_check            (GSocket *socket,
+                                                         GIOCondition condition);
+gboolean            g_socket_condition_wait             (GSocket *socket,
+                                                         GIOCondition condition,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_socket_set_listen_backlog         (GSocket *socket,
+                                                         gint backlog);
+gint                g_socket_get_listen_backlog         (GSocket *socket);
+gboolean            g_socket_get_blocking               (GSocket *socket);
+void                g_socket_set_blocking               (GSocket *socket,
+                                                         gboolean blocking);
+gboolean            g_socket_get_keepalive              (GSocket *socket);
+void                g_socket_set_keepalive              (GSocket *socket,
+                                                         gboolean keepalive);
+GSocketFamily       g_socket_get_family                 (GSocket *socket);
+int                 g_socket_get_fd                     (GSocket *socket);
+GSocketAddress *    g_socket_get_local_address          (GSocket *socket,
+                                                         GError **error);
+GSocketProtocol     g_socket_get_protocol               (GSocket *socket);
+GSocketAddress *    g_socket_get_remote_address         (GSocket *socket,
+                                                         GError **error);
+GSocketType         g_socket_get_socket_type            (GSocket *socket);
+gboolean            g_socket_speaks_ipv4                (GSocket *socket);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSocket
+
+
+
+

Implemented Interfaces

+

+GSocket implements + GInitable.

+
+
+

Properties

+
+  "blocking"                 gboolean              : Read / Write
+  "family"                   GSocketFamily         : Read / Write / Construct Only
+  "fd"                       gint                  : Read / Write / Construct Only
+  "keepalive"                gboolean              : Read / Write
+  "listen-backlog"           gint                  : Read / Write
+  "local-address"            GSocketAddress*       : Read
+  "protocol"                 GSocketProtocol       : Read / Write / Construct Only
+  "remote-address"           GSocketAddress*       : Read
+  "type"                     GSocketType           : Read / Write / Construct Only
+
+
+
+

Description

+

+A GSocket is a low-level networking primitive. It is a more or less +direct mapping of the BSD socket API in a portable GObject based API. +It supports both the UNIX socket implementations and winsock2 on Windows. +

+

+GSocket is the platform independent base upon which the higher level +network primitives are based. Applications are not typically meant to +use it directly, but rather through classes like GSocketClient, +GSocketService and GSocketConnection. However there may be cases where +direct use of GSocket is useful. +

+

+GSocket implements the GInitable interface, so if it is manually constructed +by e.g. g_object_new() you must call g_initable_init() and check the +results before using the object. This is done automatically in +g_socket_new() and g_socket_new_from_fd(), so these functions can return +NULL. +

+

+Sockets operate in two general modes, blocking or non-blocking. When +in blocking mode all operations block until the requested operation +is finished or there is an error. In non-blocking mode all calls that +would block return immediately with a G_IO_ERROR_WOULD_BLOCK error. +To know when a call would successfully run you can call g_socket_condition_check(), +or g_socket_condition_wait(). You can also use g_socket_create_source() and +attach it to a GMainContext to get callbacks when I/O is possible. +Note that all sockets are always set to non blocking mode in the system, and +blocking mode is emulated in GSocket. +

+

+When working in non-blocking mode applications should always be able to +handle getting a G_IO_ERROR_WOULD_BLOCK error even when some other +function said that I/O was possible. This can easily happen in case +of a race condition in the application, but it can also happen for other +reasons. For instance, on Windows a socket is always seen as writable +until a write returns G_IO_ERROR_WOULD_BLOCK. +

+

+GSockets can be either connection oriented or datagram based. +For connection oriented types you must first establish a connection by +either connecting to an address or accepting a connection from another +address. For connectionless socket types the target/source address is +specified or received in each I/O operation. +

+

+All socket file descriptors are set to be close-on-exec. +

+

+Note that creating a GSocket causes the signal SIGPIPE to be +ignored for the remainder of the program. If you are writing a +command-line utility that uses GSocket, you may need to take into +account the fact that your program will not automatically be killed +if it tries to write to stdout after it has been closed.

+
+
+

Details

+
+

GSocket

+
typedef struct _GSocket GSocket;
+

+A lowlevel network socket object.

+

Since 2.22

+
+
+
+

GSocketSourceFunc ()

+
gboolean            (*GSocketSourceFunc)                (GSocket *socket,
+                                                         GIOCondition condition,
+                                                         gpointer user_data);
+

+This is the function type of the callback used for the GSource +returned by g_socket_create_source().

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

socket :

the GSocket +

condition :

the current condition at the source fired. +

user_data :

data passed in by the user. +

Returns :

it should return FALSE if the source should be removed. + +
+

Since 2.22

+
+
+
+

enum GSocketType

+
typedef enum
+{
+  G_SOCKET_TYPE_INVALID,
+  G_SOCKET_TYPE_STREAM,
+  G_SOCKET_TYPE_DATAGRAM,
+  G_SOCKET_TYPE_SEQPACKET
+} GSocketType;
+
+

+Flags used when creating a GSocket. Some protocols may not implement +all the socket types.

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

G_SOCKET_TYPE_INVALID

Type unknown or wrong +

G_SOCKET_TYPE_STREAM

Reliable connection-based byte streams (e.g. TCP). +

G_SOCKET_TYPE_DATAGRAM

Connectionless, unreliable datagram passing. + (e.g. UDP) +

G_SOCKET_TYPE_SEQPACKET

Reliable connection-based passing of datagrams + of fixed maximum length (e.g. SCTP). +
+

Since 2.22

+
+
+
+

enum GSocketProtocol

+
typedef enum {
+  G_SOCKET_PROTOCOL_UNKNOWN = -1,
+  G_SOCKET_PROTOCOL_DEFAULT = 0,
+  G_SOCKET_PROTOCOL_TCP     = 6,
+  G_SOCKET_PROTOCOL_UDP     = 17,
+  G_SOCKET_PROTOCOL_SCTP    = 132
+} GSocketProtocol;
+
+

+A protocol identifier is specified when creating a GSocket, which is a +family/type specific identifier, where 0 means the default protocol for +the particular family/type. +

+

+This enum contains a set of commonly available and used protocols. You +can also pass any other identifiers handled by the platform in order to +use protocols not listed here.

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

G_SOCKET_PROTOCOL_UNKNOWN

The protocol type is unknown +

G_SOCKET_PROTOCOL_DEFAULT

The default protocol for the family/type +

G_SOCKET_PROTOCOL_TCP

TCP over IP +

G_SOCKET_PROTOCOL_UDP

UDP over IP +

G_SOCKET_PROTOCOL_SCTP

SCTP over IP +
+

Since 2.22

+
+
+
+

enum GSocketMsgFlags

+
typedef enum
+{
+  G_SOCKET_MSG_NONE,
+  G_SOCKET_MSG_OOB = GLIB_SYSDEF_MSG_OOB,
+  G_SOCKET_MSG_PEEK = GLIB_SYSDEF_MSG_PEEK,
+  G_SOCKET_MSG_DONTROUTE = GLIB_SYSDEF_MSG_DONTROUTE
+} GSocketMsgFlags;
+
+

+Flags used in g_socket_receive_message() and g_socket_send_message(). +The flags listed in the enum are some commonly available flags, but the +values used for them are the same as on the platform, and any other flags +are passed in/out as is. So to use a platform specific flag, just include +the right system header and pass in the flag.

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

G_SOCKET_MSG_NONE

No flags. +

G_SOCKET_MSG_OOB

Request to send/receive out of band data. +

G_SOCKET_MSG_PEEK

Read data from the socket without removing it from + the queue. +

G_SOCKET_MSG_DONTROUTE

Don't use a gateway to send out the packet, + only send to hosts on directly connected networks. +
+

Since 2.22

+
+
+
+

GInputVector

+
typedef struct {
+  gpointer buffer;
+  gsize size;
+} GInputVector;
+
+

+Structure used for scatter/gather data input. +You generally pass in an array of GInputVectors +and the operation will store the read data starting in the +first buffer, switching to the next as needed.

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

gpointer buffer;

Pointer to a buffer where data will be written. +

gsize size;

the available size in buffer. +
+

Since 2.22

+
+
+
+

GOutputVector

+
typedef struct {
+  gconstpointer buffer;
+  gsize size;
+} GOutputVector;
+
+

+Structure used for scatter/gather data output. +You generally pass in an array of GOutputVectors +and the operation will use all the buffers as if they were +one buffer.

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

gconstpointer buffer;

Pointer to a buffer of data to read. +

gsize size;

the size of buffer. +
+

Since 2.22

+
+
+
+

g_socket_new ()

+
GSocket *           g_socket_new                        (GSocketFamily family,
+                                                         GSocketType type,
+                                                         GSocketProtocol protocol,
+                                                         GError **error);
+

+Creates a new GSocket with the defined family, type and protocol. +If protocol is 0 (G_SOCKET_PROTOCOL_DEFAULT) the default protocol type +for the family and type is used. +

+

+The protocol is a family and type specific int that specifies what +kind of protocol to use. GSocketProtocol lists several common ones. +Many families only support one protocol, and use 0 for this, others +support several and using 0 means to use the default protocol for +the family and type. +

+

+The protocol id is passed directly to the operating +system, so you can use protocols not listed in GSocketProtocol if you +know the protocol number used for it.

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

family :

the socket family to use, e.g. G_SOCKET_FAMILY_IPV4. +

type :

the socket type to use. +

protocol :

the id of the protocol to use, or 0 for default. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocket or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_new_from_fd ()

+
GSocket *           g_socket_new_from_fd                (gint fd,
+                                                         GError **error);
+

+Creates a new GSocket from a native file descriptor +or winsock SOCKET handle. +

+

+This reads all the settings from the file descriptor so that +all properties should work. Note that the file descriptor +will be set to non-blocking mode, independent on the blocking +mode of the GSocket.

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

fd :

a native socket file descriptor. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocket or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_bind ()

+
gboolean            g_socket_bind                       (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         gboolean allow_reuse,
+                                                         GError **error);
+

+When a socket is created it is attached to an address family, but it +doesn't have an address in this family. g_socket_bind() assigns the +address (sometimes called name) of the socket. +

+

+It is generally required to bind to a local address before you can +receive connections. (See g_socket_listen() and g_socket_accept() ). +In certain situations, you may also want to bind a socket that will be +used to initiate connections, though this is not normally required. +

+

+allow_reuse should be TRUE for server sockets (sockets that you will +eventually call g_socket_accept() on), and FALSE for client sockets. +(Specifically, if it is TRUE, then g_socket_bind() will set the +SO_REUSEADDR flag on the socket, allowing it to bind address even if +that address was previously used by another socket that has not yet been +fully cleaned-up by the kernel. Failing to set this flag on a server +socket may cause the bind call to return G_IO_ERROR_ADDRESS_IN_USE if +the server program is stopped and then immediately restarted.)

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

socket :

a GSocket. +

address :

a GSocketAddress specifying the local address. +

allow_reuse :

whether to allow reusing this address +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error. + +
+

Since 2.22

+
+
+
+

g_socket_listen ()

+
gboolean            g_socket_listen                     (GSocket *socket,
+                                                         GError **error);
+

+Marks the socket as a server socket, i.e. a socket that is used +to accept incoming requests using g_socket_accept(). +

+

+Before calling this the socket must be bound to a local address using +g_socket_bind(). +

+

+To set the maximum amount of outstanding clients, use +g_socket_set_listen_backlog().

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

socket :

a GSocket. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error. + +
+

Since 2.22

+
+
+
+

g_socket_accept ()

+
GSocket *           g_socket_accept                     (GSocket *socket,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Accept incoming connections on a connection-based socket. This removes +the first outstanding connection request from the listening socket and +creates a GSocket object for it. +

+

+The socket must be bound to a local address with g_socket_bind() and +must be listening for incoming connections (g_socket_listen()). +

+

+If there are no outstanding connections then the operation will block +or return G_IO_ERROR_WOULD_BLOCK if non-blocking I/O is enabled. +To be notified of an incoming connection, wait for the G_IO_IN condition.

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

socket :

a GSocket. +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a new GSocket, or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_connect ()

+
gboolean            g_socket_connect                    (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Connect the socket to the specified remote address. +

+

+For connection oriented socket this generally means we attempt to make +a connection to the address. For a connection-less socket it sets +the default address for g_socket_send() and discards all incoming datagrams +from other sources. +

+

+Generally connection oriented sockets can only connect once, but +connection-less sockets can connect multiple times to change the +default address. +

+

+If the connect call needs to do network I/O it will block, unless +non-blocking I/O is enabled. Then G_IO_ERROR_PENDING is returned +and the user can be notified of the connection finishing by waiting +for the G_IO_OUT condition. The result of the connection can then be +checked with g_socket_check_connect_result().

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

socket :

a GSocket. +

address :

a GSocketAddress specifying the remote address. +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE if connected, FALSE on error. + +
+

Since 2.22

+
+
+
+

g_socket_check_connect_result ()

+
gboolean            g_socket_check_connect_result       (GSocket *socket,
+                                                         GError **error);
+

+Checks and resets the pending connect error for the socket. +This is used to check for errors when g_socket_connect() is +used in non-blocking mode.

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

socket :

a GSocket +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE if no error, FALSE otherwise, setting error to the error + +
+

Since 2.22

+
+
+
+

g_socket_receive ()

+
gssize              g_socket_receive                    (GSocket *socket,
+                                                         gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Receive data (up to size bytes) from a socket. This is mainly used by +connection-oriented sockets; it is identical to g_socket_receive_from() +with address set to NULL. +

+

+For G_SOCKET_TYPE_DATAGRAM and G_SOCKET_TYPE_SEQPACKET sockets, +g_socket_receive() will always read either 0 or 1 complete messages from +the socket. If the received message is too large to fit in buffer, then +the data beyond size bytes will be discarded, without any explicit +indication that this has occurred. +

+

+For G_SOCKET_TYPE_STREAM sockets, g_socket_receive() can return any +number of bytes, up to size. If more than size bytes have been +received, the additional data will be returned in future calls to +g_socket_receive(). +

+

+If the socket is in blocking mode the call will block until there is +some data to receive or there is an error. If there is no data available +and the socket is in non-blocking mode, a G_IO_ERROR_WOULD_BLOCK error +will be returned. To be notified when data is available, wait for the +G_IO_IN condition. +

+

+On error -1 is returned and error is set accordingly.

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

socket :

a GSocket +

buffer :

a buffer to read data into (which should be at least size + bytes long). +

size :

the number of bytes you want to read from the socket +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

Number of bytes read, or -1 on error + +
+

Since 2.22

+
+
+
+

g_socket_receive_from ()

+
gssize              g_socket_receive_from               (GSocket *socket,
+                                                         GSocketAddress **address,
+                                                         gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Receive data (up to size bytes) from a socket. +

+

+If address is non-NULL then address will be set equal to the +source address of the received packet. +address is owned by the caller. +

+

+See g_socket_receive() for additional information.

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

socket :

a GSocket +

address :

a pointer to a GSocketAddress pointer, or NULL +

buffer :

a buffer to read data into (which should be at least size + bytes long). +

size :

the number of bytes you want to read from the socket +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

Number of bytes read, or -1 on error + +
+

Since 2.22

+
+
+
+

g_socket_receive_message ()

+
gssize              g_socket_receive_message            (GSocket *socket,
+                                                         GSocketAddress **address,
+                                                         GInputVector *vectors,
+                                                         gint num_vectors,
+                                                         GSocketControlMessage ***messages,
+                                                         gint *num_messages,
+                                                         gint *flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Receive data from a socket. This is the most complicated and +fully-featured version of this call. For easier use, see +g_socket_receive() and g_socket_receive_from(). +

+

+If address is non-NULL then address will be set equal to the +source address of the received packet. +address is owned by the caller. +

+

+vector must point to an array of GInputVector structs and +num_vectors must be the length of this array. These structs +describe the buffers that received data will be scattered into. +If num_vectors is -1, then vectors is assumed to be terminated +by a GInputVector with a NULL buffer pointer. +

+

+As a special case, if num_vectors is 0 (in which case, vectors +may of course be NULL), then a single byte is received and +discarded. This is to facilitate the common practice of sending a +single '\0' byte for the purposes of transferring ancillary data. +

+

+messages, if non-NULL, will be set to point to a newly-allocated +array of GSocketControlMessage instances. These correspond to the +control messages received from the kernel, one +GSocketControlMessage per message from the kernel. This array is +NULL-terminated and must be freed by the caller using g_free(). If +messages is NULL, any control messages received will be +discarded. +

+

+num_messages, if non-NULL, will be set to the number of control +messages received. +

+

+If both messages and num_messages are non-NULL, then +num_messages gives the number of GSocketControlMessage instances +in messages (ie: not including the NULL terminator). +

+

+flags is an in/out parameter. The commonly available arguments +for this are available in the GSocketMsgFlags enum, but the +values there are the same as the system values, and the flags +are passed in as-is, so you can pass in system-specific flags too +(and g_socket_receive_message() may pass system-specific flags out). +

+

+As with g_socket_receive(), data may be discarded if socket is +G_SOCKET_TYPE_DATAGRAM or G_SOCKET_TYPE_SEQPACKET and you do not +provide enough buffer space to read a complete message. You can pass +G_SOCKET_MSG_PEEK in flags to peek at the current message without +removing it from the receive queue, but there is no portable way to find +out the length of the message other than by reading it into a +sufficiently-large buffer. +

+

+If the socket is in blocking mode the call will block until there +is some data to receive or there is an error. If there is no data +available and the socket is in non-blocking mode, a +G_IO_ERROR_WOULD_BLOCK error will be returned. To be notified when +data is available, wait for the G_IO_IN condition. +

+

+On error -1 is returned and error is set accordingly.

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

socket :

a GSocket +

address :

a pointer to a GSocketAddress pointer, or NULL +

vectors :

an array of GInputVector structs +

num_vectors :

the number of elements in vectors, or -1 +

messages :

a pointer which will be filled with an array of + GSocketControlMessages, or NULL +

num_messages :

a pointer which will be filled with the number of + elements in messages, or NULL +

flags :

a pointer to an int containing GSocketMsgFlags flags +

cancellable :

a GCancellable or NULL +

error :

a GError pointer, or NULL +

Returns :

Number of bytes read, or -1 on error + +
+

Since 2.22

+
+
+
+

g_socket_send ()

+
gssize              g_socket_send                       (GSocket *socket,
+                                                         const gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to send size bytes from buffer on the socket. This is +mainly used by connection-oriented sockets; it is identical to +g_socket_send_to() with address set to NULL. +

+

+If the socket is in blocking mode the call will block until there is +space for the data in the socket queue. If there is no space available +and the socket is in non-blocking mode a G_IO_ERROR_WOULD_BLOCK error +will be returned. To be notified when space is available, wait for the +G_IO_OUT condition. Note though that you may still receive +G_IO_ERROR_WOULD_BLOCK from g_socket_send() even if you were previously +notified of a G_IO_OUT condition. (On Windows in particular, this is +very common due to the way the underlying APIs work.) +

+

+On error -1 is returned and error is set accordingly.

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

socket :

a GSocket +

buffer :

the buffer containing the data to send. +

size :

the number of bytes to send +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

Number of bytes written (which may be less than size), or -1 +on error + +
+

Since 2.22

+
+
+
+

g_socket_send_to ()

+
gssize              g_socket_send_to                    (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         const gchar *buffer,
+                                                         gsize size,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to send size bytes from buffer to address. If address is +NULL then the message is sent to the default receiver (set by +g_socket_connect()). +

+

+See g_socket_send() for additional information.

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

socket :

a GSocket +

address :

a GSocketAddress, or NULL +

buffer :

the buffer containing the data to send. +

size :

the number of bytes to send +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

Number of bytes written (which may be less than size), or -1 +on error + +
+

Since 2.22

+
+
+
+

g_socket_send_message ()

+
gssize              g_socket_send_message               (GSocket *socket,
+                                                         GSocketAddress *address,
+                                                         GOutputVector *vectors,
+                                                         gint num_vectors,
+                                                         GSocketControlMessage **messages,
+                                                         gint num_messages,
+                                                         gint flags,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Send data to address on socket. This is the most complicated and +fully-featured version of this call. For easier use, see +g_socket_send() and g_socket_send_to(). +

+

+If address is NULL then the message is sent to the default receiver +(set by g_socket_connect()). +

+

+vectors must point to an array of GOutputVector structs and +num_vectors must be the length of this array. (If num_vectors is -1, +then vectors is assumed to be terminated by a GOutputVector with a +NULL buffer pointer.) The GOutputVector structs describe the buffers +that the sent data will be gathered from. Using multiple +GOutputVectors is more memory-efficient than manually copying +data from multiple sources into a single buffer, and more +network-efficient than making multiple calls to g_socket_send(). +

+

+messages, if non-NULL, is taken to point to an array of num_messages +GSocketControlMessage instances. These correspond to the control +messages to be sent on the socket. +If num_messages is -1 then messages is treated as a NULL-terminated +array. +

+

+flags modify how the message is sent. The commonly available arguments +for this are available in the GSocketMsgFlags enum, but the +values there are the same as the system values, and the flags +are passed in as-is, so you can pass in system-specific flags too. +

+

+If the socket is in blocking mode the call will block until there is +space for the data in the socket queue. If there is no space available +and the socket is in non-blocking mode a G_IO_ERROR_WOULD_BLOCK error +will be returned. To be notified when space is available, wait for the +G_IO_OUT condition. Note though that you may still receive +G_IO_ERROR_WOULD_BLOCK from g_socket_send() even if you were previously +notified of a G_IO_OUT condition. (On Windows in particular, this is +very common due to the way the underlying APIs work.) +

+

+On error -1 is returned and error is set accordingly.

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

socket :

a GSocket +

address :

a GSocketAddress, or NULL +

vectors :

an array of GOutputVector structs +

num_vectors :

the number of elements in vectors, or -1 +

messages :

a pointer to an array of GSocketControlMessages, or + NULL. +

num_messages :

number of elements in messages, or -1. +

flags :

an int containing GSocketMsgFlags flags +

cancellable :

a GCancellable or NULL +

error :

GError for error reporting, or NULL to ignore. +

Returns :

Number of bytes written (which may be less than size), or -1 +on error + +
+

Since 2.22

+
+
+
+

g_socket_close ()

+
gboolean            g_socket_close                      (GSocket *socket,
+                                                         GError **error);
+

+Closes the socket, shutting down any active connection. +

+

+Closing a socket does not wait for all outstanding I/O operations +to finish, so the caller should not rely on them to be guaranteed +to complete even if the close returns with no error. +

+

+Once the socket is closed, all other operations will return +G_IO_ERROR_CLOSED. Closing a socket multiple times will not +return an error. +

+

+Sockets will be automatically closed when the last reference +is dropped, but you might want to call this function to make sure +resources are released as early as possible. +

+

+Beware that due to the way that TCP works, it is possible for +recently-sent data to be lost if either you close a socket while the +G_IO_IN condition is set, or else if the remote connection tries to +send something to you after you close the socket but before it has +finished reading all of the data you sent. There is no easy generic +way to avoid this problem; the easiest fix is to design the network +protocol such that the client will never send data "out of turn". +Another solution is for the server to half-close the connection by +calling g_socket_shutdown() with only the shutdown_write flag set, +and then wait for the client to notice this and close its side of the +connection, after which the server can safely call g_socket_close(). +(This is what GTcpConnection does if you call +g_tcp_connection_set_graceful_disconnect(). But of course, this +only works if the client will close its connection after the server +does.)

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

socket :

a GSocket +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error + +
+

Since 2.22

+
+
+
+

g_socket_is_closed ()

+
gboolean            g_socket_is_closed                  (GSocket *socket);
+

+Checks whether a socket is closed.

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

socket :

a GSocket +

Returns :

TRUE if socket is closed, FALSE otherwise + +
+

Since 2.22

+
+
+
+

g_socket_shutdown ()

+
gboolean            g_socket_shutdown                   (GSocket *socket,
+                                                         gboolean shutdown_read,
+                                                         gboolean shutdown_write,
+                                                         GError **error);
+

+Shut down part of a full-duplex connection. +

+

+If shutdown_read is TRUE then the recieving side of the connection +is shut down, and further reading is disallowed. +

+

+If shutdown_write is TRUE then the sending side of the connection +is shut down, and further writing is disallowed. +

+

+It is allowed for both shutdown_read and shutdown_write to be TRUE. +

+

+One example where this is used is graceful disconnect for TCP connections +where you close the sending side, then wait for the other side to close +the connection, thus ensuring that the other side saw all sent data.

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

socket :

a GSocket +

shutdown_read :

whether to shut down the read side +

shutdown_write :

whether to shut down the write side +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error + +
+

Since 2.22

+
+
+
+

g_socket_is_connected ()

+
gboolean            g_socket_is_connected               (GSocket *socket);
+

+Check whether the socket is connected. This is only useful for +connection-oriented sockets.

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

socket :

a GSocket. +

Returns :

TRUE if socket is connected, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_socket_create_source ()

+
GSource *           g_socket_create_source              (GSocket *socket,
+                                                         GIOCondition condition,
+                                                         GCancellable *cancellable);
+

+Creates a GSource that can be attached to a GMainContext to monitor +for the availibility of the specified condition on the socket. +

+

+The callback on the source is of the GSocketSourceFunc type. +

+

+It is meaningless to specify G_IO_ERR or G_IO_HUP in condition; +these conditions will always be reported output if they are true. +

+

+cancellable if not NULL can be used to cancel the source, which will +cause the source to trigger, reporting the current condition (which +is likely 0 unless cancellation happened at the same time as a +condition change). You can check for this in the callback using +g_cancellable_is_cancelled().

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

socket :

a GSocket +

condition :

a GIOCondition mask to monitor +

cancellable :

a GCancellable or NULL +

Returns :

a newly allocated GSource, free with g_source_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_condition_check ()

+
GIOCondition        g_socket_condition_check            (GSocket *socket,
+                                                         GIOCondition condition);
+

+Checks on the readiness of socket to perform operations. +The operations specified in condition are checked for and masked +against the currently-satisfied conditions on socket. The result +is returned. +

+

+It is meaningless to specify G_IO_ERR or G_IO_HUP in condition; +these conditions will always be set in the output if they are true. +

+

+This call never blocks.

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

socket :

a GSocket +

condition :

a GIOCondition mask to check +

Returns :

the GIOCondition mask of the current state + +
+

Since 2.22

+
+
+
+

g_socket_condition_wait ()

+
gboolean            g_socket_condition_wait             (GSocket *socket,
+                                                         GIOCondition condition,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Waits for condition to become true on socket. When the condition +is met, TRUE is returned. +

+

+If cancellable is cancelled before the condition is met then FALSE +is returned and error, if non-NULL, is set to G_IO_ERROR_CANCELLED.

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

socket :

a GSocket +

condition :

a GIOCondition mask to wait for +

cancellable :

a GCancellable, or NULL +

error :

a GError pointer, or NULL +

Returns :

TRUE if the condition was met, FALSE otherwise + +
+

Since 2.22

+
+
+
+

g_socket_set_listen_backlog ()

+
void                g_socket_set_listen_backlog         (GSocket *socket,
+                                                         gint backlog);
+

+Sets the maximum number of outstanding connections allowed +when listening on this socket. If more clients than this are +connecting to the socket and the application is not handling them +on time then the new connections will be refused. +

+

+Note that this must be called before g_socket_listen() and has no +effect if called after that.

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

socket :

a GSocket. +

backlog :

the maximum number of pending connections. +
+

Since 2.22

+
+
+
+

g_socket_get_listen_backlog ()

+
gint                g_socket_get_listen_backlog         (GSocket *socket);
+

+Gets the listen backlog setting of the socket. For details on this, +see g_socket_set_listen_backlog().

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

socket :

a GSocket. +

Returns :

the maximum number of pending connections. + +
+

Since 2.22

+
+
+
+

g_socket_get_blocking ()

+
gboolean            g_socket_get_blocking               (GSocket *socket);
+

+Gets the blocking mode of the socket. For details on blocking I/O, +see g_socket_set_blocking().

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

socket :

a GSocket. +

Returns :

TRUE if blocking I/O is used, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_socket_set_blocking ()

+
void                g_socket_set_blocking               (GSocket *socket,
+                                                         gboolean blocking);
+

+Sets the blocking mode of the socket. In blocking mode +all operations block until they succeed or there is an error. In +non-blocking mode all functions return results immediately or +with a G_IO_ERROR_WOULD_BLOCK error. +

+

+All sockets are created in blocking mode. However, note that the +platform level socket is always non-blocking, and blocking mode +is a GSocket level feature.

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

socket :

a GSocket. +

blocking :

Whether to use blocking I/O or not. +
+

Since 2.22

+
+
+
+

g_socket_get_keepalive ()

+
gboolean            g_socket_get_keepalive              (GSocket *socket);
+

+Gets the keepalive mode of the socket. For details on this, +see g_socket_set_keepalive().

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

socket :

a GSocket. +

Returns :

TRUE if keepalive is active, FALSE otherwise. + +
+

Since 2.22

+
+
+
+

g_socket_set_keepalive ()

+
void                g_socket_set_keepalive              (GSocket *socket,
+                                                         gboolean keepalive);
+

+Sets or unsets the SO_KEEPALIVE flag on the underlying socket. When +this flag is set on a socket, the system will attempt to verify that the +remote socket endpoint is still present if a sufficiently long period of +time passes with no data being exchanged. If the system is unable to +verify the presence of the remote endpoint, it will automatically close +the connection. +

+

+This option is only functional on certain kinds of sockets. (Notably, +G_SOCKET_PROTOCOL_TCP sockets.) +

+

+The exact time between pings is system- and protocol-dependent, but will +normally be at least two hours. Most commonly, you would set this flag +on a server socket if you want to allow clients to remain idle for long +periods of time, but also want to ensure that connections are eventually +garbage-collected if clients crash or become unreachable.

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

socket :

a GSocket. +

keepalive :

Value for the keepalive flag +
+

Since 2.22

+
+
+
+

g_socket_get_family ()

+
GSocketFamily       g_socket_get_family                 (GSocket *socket);
+

+Gets the socket family of the socket.

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

socket :

a GSocket. +

Returns :

a GSocketFamily + +
+

Since 2.22

+
+
+
+

g_socket_get_fd ()

+
int                 g_socket_get_fd                     (GSocket *socket);
+

+Returns the underlying OS socket object. On unix this +is a socket file descriptor, and on windows this is +a Winsock2 SOCKET handle. This may be useful for +doing platform specific or otherwise unusual operations +on the socket.

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

socket :

a GSocket. +

Returns :

the file descriptor of the socket. + +
+

Since 2.22

+
+
+
+

g_socket_get_local_address ()

+
GSocketAddress *    g_socket_get_local_address          (GSocket *socket,
+                                                         GError **error);
+

+Try to get the local address of a bound socket. This is only +useful if the socket has been bound to a local address, +either explicitly or implicitly when connecting.

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

socket :

a GSocket. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocketAddress or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_get_protocol ()

+
GSocketProtocol     g_socket_get_protocol               (GSocket *socket);
+

+Gets the socket protocol id the socket was created with. +In case the protocol is unknown, -1 is returned.

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

socket :

a GSocket. +

Returns :

a protocol id, or -1 if unknown + +
+

Since 2.22

+
+
+
+

g_socket_get_remote_address ()

+
GSocketAddress *    g_socket_get_remote_address         (GSocket *socket,
+                                                         GError **error);
+

+Try to get the remove address of a connected socket. This is only +useful for connection oriented sockets that have been connected.

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

socket :

a GSocket. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocketAddress or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_get_socket_type ()

+
GSocketType         g_socket_get_socket_type            (GSocket *socket);
+

+Gets the socket type of the socket.

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

socket :

a GSocket. +

Returns :

a GSocketType + +
+

Since 2.22

+
+
+
+

g_socket_speaks_ipv4 ()

+
gboolean            g_socket_speaks_ipv4                (GSocket *socket);
+

+Checks if a socket is capable of speaking IPv4. +

+

+IPv4 sockets are capable of speaking IPv4. On some operating systems +and under some combinations of circumstances IPv6 sockets are also +capable of speaking IPv4. See RFC 3493 section 3.7 for more +information. +

+

+No other types of sockets are currently considered as being capable +of speaking IPv4.

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

socket :

a GSocket +

Returns :

TRUE if this socket can be used with IPv4. + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "blocking" property

+
  "blocking"                 gboolean              : Read / Write
+

Whether or not I/O on this socket is blocking.

+

Default value: TRUE

+
+
+
+

The "family" property

+
  "family"                   GSocketFamily         : Read / Write / Construct Only
+

The sockets address family.

+

Default value: G_SOCKET_FAMILY_INVALID

+
+
+
+

The "fd" property

+
  "fd"                       gint                  : Read / Write / Construct Only
+

The sockets file descriptor.

+

Default value: -1

+
+
+
+

The "keepalive" property

+
  "keepalive"                gboolean              : Read / Write
+

Keep connection alive by sending periodic pings.

+

Default value: FALSE

+
+
+
+

The "listen-backlog" property

+
  "listen-backlog"           gint                  : Read / Write
+

Outstanding connections in the listen queue.

+

Allowed values: [0,128]

+

Default value: 10

+
+
+
+

The "local-address" property

+
  "local-address"            GSocketAddress*       : Read
+

The local address the socket is bound to.

+
+
+
+

The "protocol" property

+
  "protocol"                 GSocketProtocol       : Read / Write / Construct Only
+

The id of the protocol to use, or -1 for unknown.

+

Default value: G_SOCKET_PROTOCOL_UNKNOWN

+
+
+
+

The "remote-address" property

+
  "remote-address"           GSocketAddress*       : Read
+

The remote address the socket is connected to.

+
+
+
+

The "type" property

+
  "type"                     GSocketType           : Read / Write / Construct Only
+

The sockets type.

+

Default value: G_SOCKET_TYPE_STREAM

+
+
+
+

See Also

+GInitable +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketAddress.html b/docs/reference/gio/html/GSocketAddress.html new file mode 100644 index 0000000..7b1b1e1 --- /dev/null +++ b/docs/reference/gio/html/GSocketAddress.html @@ -0,0 +1,319 @@ + + + + +GSocketAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketAddress

+

GSocketAddress — Abstract base class representing endpoints for +socket communication

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketAddress
+         +----GInetSocketAddress
+         +----GUnixSocketAddress
+
+
+
+

Implemented Interfaces

+

+GSocketAddress implements + GSocketConnectable.

+
+
+

Properties

+
+  "family"                   GSocketFamily         : Read
+
+
+
+

Description

+

+GSocketAddress is the equivalent of struct sockaddr +in the BSD sockets API. This is an abstract class; use +GInetSocketAddress for internet sockets, or GUnixSocketAddress +for UNIX domain sockets.

+
+
+

Details

+
+

GSocketAddress

+
typedef struct _GSocketAddress GSocketAddress;
+

+A socket endpoint address, corresponding to struct sockaddr +or one of its subtypes.

+
+
+
+

enum GSocketFamily

+
typedef enum {
+  G_SOCKET_FAMILY_INVALID,
+#ifdef GLIB_SYSDEF_AF_UNIX
+  G_SOCKET_FAMILY_UNIX = GLIB_SYSDEF_AF_UNIX,
+#endif
+  G_SOCKET_FAMILY_IPV4 = GLIB_SYSDEF_AF_INET,
+  G_SOCKET_FAMILY_IPV6 = GLIB_SYSDEF_AF_INET6
+} GSocketFamily;
+
+

+The protocol family of a GSocketAddress. (These values are +identical to the system defines AF_INET, AF_INET6 and AF_UNIX, +if available.)

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

G_SOCKET_FAMILY_INVALID

no address family +

G_SOCKET_FAMILY_UNIX

the UNIX domain family +

G_SOCKET_FAMILY_IPV4

the IPv4 family +

G_SOCKET_FAMILY_IPV6

the IPv6 family +
+

Since 2.22

+
+
+
+

g_socket_address_new_from_native ()

+
GSocketAddress *    g_socket_address_new_from_native    (gpointer native,
+                                                         gsize len);
+

+Creates a GSocketAddress subclass corresponding to the native +struct sockaddr native.

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

native :

a pointer to a struct sockaddr +

len :

the size of the memory location pointed to by native +

Returns :

a new GSocketAddress if native could successfully be converted, +otherwise NULL. + +
+

Since 2.22

+
+
+
+

g_socket_address_get_family ()

+
GSocketFamily       g_socket_address_get_family         (GSocketAddress *address);
+

+Gets the socket family type of address.

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

address :

a GSocketAddress +

Returns :

the socket family type of address. + +
+

Since 2.22

+
+
+
+

g_socket_address_to_native ()

+
gboolean            g_socket_address_to_native          (GSocketAddress *address,
+                                                         gpointer dest,
+                                                         gsize destlen,
+                                                         GError **error);
+

+Converts a GSocketAddress to a native struct +sockaddr, which can be passed to low-level functions like +connect() or bind(). +

+

+If not enough space is availible, a G_IO_ERROR_NO_SPACE error is +returned. If the address type is not known on the system +then a G_IO_ERROR_NOT_SUPPORTED error is returned.

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

address :

a GSocketAddress +

dest :

a pointer to a memory location that will contain the native +struct sockaddr. +

destlen :

the size of dest. Must be at least as large as +g_socket_address_get_native_size(). +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE if dest was filled in, FALSE on error + +
+

Since 2.22

+
+
+
+

g_socket_address_get_native_size ()

+
gssize              g_socket_address_get_native_size    (GSocketAddress *address);
+

+Gets the size of address's native struct sockaddr. +You can use this to allocate memory to pass to +g_socket_address_to_native().

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

address :

a GSocketAddress +

Returns :

the size of the native struct sockaddr that + address represents + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "family" property

+
  "family"                   GSocketFamily         : Read
+

The family of the socket address.

+

Default value: G_SOCKET_FAMILY_INVALID

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketClient.html b/docs/reference/gio/html/GSocketClient.html new file mode 100644 index 0000000..8277f7d --- /dev/null +++ b/docs/reference/gio/html/GSocketClient.html @@ -0,0 +1,939 @@ + + + + +GSocketClient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketClient

+

GSocketClient — Helper for connecting to a network service

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GSocketClient;
+GSocketClient *     g_socket_client_new                 (void);
+GSocketConnection * g_socket_client_connect             (GSocketClient *client,
+                                                         GSocketConnectable *connectable,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_socket_client_connect_async       (GSocketClient *client,
+                                                         GSocketConnectable *connectable,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GSocketConnection * g_socket_client_connect_finish      (GSocketClient *client,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+GSocketConnection * g_socket_client_connect_to_host     (GSocketClient *client,
+                                                         const gchar *host_and_port,
+                                                         guint16 default_port,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_socket_client_connect_to_host_async
+                                                        (GSocketClient *client,
+                                                         const gchar *host_and_port,
+                                                         guint16 default_port,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GSocketConnection * g_socket_client_connect_to_host_finish
+                                                        (GSocketClient *client,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+GSocketConnection * g_socket_client_connect_to_service  (GSocketClient *client,
+                                                         const gchar *domain,
+                                                         const gchar *service,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_socket_client_connect_to_service_async
+                                                        (GSocketClient *client,
+                                                         const gchar *domain,
+                                                         const gchar *service,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GSocketConnection * g_socket_client_connect_to_service_finish
+                                                        (GSocketClient *client,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_socket_client_set_family          (GSocketClient *client,
+                                                         GSocketFamily family);
+void                g_socket_client_set_local_address   (GSocketClient *client,
+                                                         GSocketAddress *address);
+void                g_socket_client_set_protocol        (GSocketClient *client,
+                                                         GSocketProtocol protocol);
+void                g_socket_client_set_socket_type     (GSocketClient *client,
+                                                         GSocketType type);
+GSocketFamily       g_socket_client_get_family          (GSocketClient *client);
+GSocketAddress *    g_socket_client_get_local_address   (GSocketClient *client);
+GSocketProtocol     g_socket_client_get_protocol        (GSocketClient *client);
+GSocketType         g_socket_client_get_socket_type     (GSocketClient *client);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSocketClient
+
+
+
+

Properties

+
+  "family"                   GSocketFamily         : Read / Write / Construct
+  "local-address"            GSocketAddress*       : Read / Write / Construct
+  "protocol"                 GSocketProtocol       : Read / Write / Construct
+  "type"                     GSocketType           : Read / Write / Construct
+
+
+
+

Description

+

+GSocketClient is a high-level utility class for connecting to a +network host using a connection oriented socket type. +

+

+You create a GSocketClient object, set any options you want, then +call a sync or async connect operation, which returns a GSocketConnection +subclass on success. +

+

+The type of the GSocketConnection object returned depends on the type of +the underlying socket that is in use. For instance, for a TCP/IP connection +it will be a GTcpConnection.

+
+
+

Details

+
+

GSocketClient

+
typedef struct _GSocketClient GSocketClient;
+

+A helper class for network servers to listen for and accept connections.

+

Since 2.22

+
+
+
+

g_socket_client_new ()

+
GSocketClient *     g_socket_client_new                 (void);
+

+Creates a new GSocketClient with the default options.

+
++ + + + +

Returns :

a GSocketClient. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_client_connect ()

+
GSocketConnection * g_socket_client_connect             (GSocketClient *client,
+                                                         GSocketConnectable *connectable,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Tries to resolve the connectable and make a network connection to it.. +

+

+Upon a successful connection, a new GSocketConnection is constructed +and returned. The caller owns this new object and must drop their +reference to it when finished with it. +

+

+The type of the GSocketConnection object returned depends on the type of +the underlying socket that is used. For instance, for a TCP/IP connection +it will be a GTcpConnection. +

+

+The socket created will be the same family as the the address that the +connectable resolves to, unless family is set with g_socket_client_set_family() +or indirectly via g_socket_client_set_local_address(). The socket type +defaults to G_SOCKET_TYPE_STREAM but can be set with +g_socket_client_set_socket_type(). +

+

+If a local address is specified with g_socket_client_set_local_address() the +socket will be bound to this address before connecting.

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

client :

a GSocketClient. +

connectable :

a GSocketConnectable specifying the remote address. +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_client_connect_async ()

+
void                g_socket_client_connect_async       (GSocketClient *client,
+                                                         GSocketConnectable *connectable,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+This is the asynchronous version of g_socket_client_connect(). +

+

+When the operation is finished callback will be +called. You can then call g_socket_client_connect_finish() to get +the result of the operation.

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

client :

a GTcpClient +

connectable :

a GSocketConnectable specifying the remote address. +

cancellable :

a GCancellable, or NULL +

callback :

a GAsyncReadyCallback +

user_data :

user data for the callback +
+

Since 2.22

+
+
+
+

g_socket_client_connect_finish ()

+
GSocketConnection * g_socket_client_connect_finish      (GSocketClient *client,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an async connect operation. See g_socket_client_connect_async()

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

client :

a GSocketClient. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_client_connect_to_host ()

+
GSocketConnection * g_socket_client_connect_to_host     (GSocketClient *client,
+                                                         const gchar *host_and_port,
+                                                         guint16 default_port,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+This is a helper function for g_socket_client_connect(). +

+

+Attempts to create a TCP connection to the named host. +

+

+host_and_port may be in any of a number of recognised formats: an IPv6 +address, an IPv4 address, or a domain name (in which case a DNS +lookup is performed). Quoting with [] is supported for all address +types. A port override may be specified in the usual way with a +colon. Ports may be given as decimal numbers or symbolic names (in +which case an /etc/services lookup is performed). +

+

+If no port override is given in host_and_port then default_port will be +used as the port number to connect to. +

+

+In general, host_and_port is expected to be provided by the user (allowing +them to give the hostname, and a port overide if necessary) and +default_port is expected to be provided by the application. +

+

+In the case that an IP address is given, a single connection +attempt is made. In the case that a name is given, multiple +connection attempts may be made, in turn and according to the +number of address records in DNS, until a connection succeeds. +

+

+Upon a successful connection, a new GSocketConnection is constructed +and returned. The caller owns this new object and must drop their +reference to it when finished with it. +

+

+In the event of any failure (DNS error, service not found, no hosts +connectable) NULL is returned and error (if non-NULL) is set +accordingly.

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

client :

a SocketClient +

host_and_port :

the name and optionally port of the host to connect to +

default_port :

the default port to connect to +

cancellable :

a GCancellable, or NULL +

error :

a pointer to a GError, or NULL +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_client_connect_to_host_async ()

+
void                g_socket_client_connect_to_host_async
+                                                        (GSocketClient *client,
+                                                         const gchar *host_and_port,
+                                                         guint16 default_port,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+This is the asynchronous version of g_socket_client_connect_to_host(). +

+

+When the operation is finished callback will be +called. You can then call g_socket_client_connect_to_host_finish() to get +the result of the operation.

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

client :

a GTcpClient +

host_and_port :

the name and optionally the port of the host to connect to +

default_port :

the default port to connect to +

cancellable :

a GCancellable, or NULL +

callback :

a GAsyncReadyCallback +

user_data :

user data for the callback +
+

Since 2.22

+
+
+
+

g_socket_client_connect_to_host_finish ()

+
GSocketConnection * g_socket_client_connect_to_host_finish
+                                                        (GSocketClient *client,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an async connect operation. See g_socket_client_connect_to_host_async()

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

client :

a GSocketClient. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_client_connect_to_service ()

+
GSocketConnection * g_socket_client_connect_to_service  (GSocketClient *client,
+                                                         const gchar *domain,
+                                                         const gchar *service,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Attempts to create a TCP connection to a service. +

+

+This call looks up the SRV record for service at domain for the +"tcp" protocol. It then attempts to connect, in turn, to each of +the hosts providing the service until either a connection succeeds +or there are no hosts remaining. +

+

+Upon a successful connection, a new GSocketConnection is constructed +and returned. The caller owns this new object and must drop their +reference to it when finished with it. +

+

+In the event of any failure (DNS error, service not found, no hosts +connectable) NULL is returned and error (if non-NULL) is set +accordingly.

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

client :

a GSocketConnection +

domain :

a domain name +

service :

the name of the service to connect to +

cancellable :

a GCancellable, or NULL +

error :

a pointer to a GError, or NULL +

Returns :

a GSocketConnection if successful, or NULL on error +
+
+
+
+

g_socket_client_connect_to_service_async ()

+
void                g_socket_client_connect_to_service_async
+                                                        (GSocketClient *client,
+                                                         const gchar *domain,
+                                                         const gchar *service,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+This is the asynchronous version of +g_socket_client_connect_to_service().

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

client :

a GSocketClient +

domain :

a domain name +

service :

the name of the service to connect to +

cancellable :

a GCancellable, or NULL +

callback :

a GAsyncReadyCallback +

user_data :

user data for the callback +
+

Since 2.22

+
+
+
+

g_socket_client_connect_to_service_finish ()

+
GSocketConnection * g_socket_client_connect_to_service_finish
+                                                        (GSocketClient *client,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes an async connect operation. See g_socket_client_connect_to_service_async()

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

client :

a GSocketClient. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_client_set_family ()

+
void                g_socket_client_set_family          (GSocketClient *client,
+                                                         GSocketFamily family);
+

+Sets the socket family of the socket client. +If this is set to something other than G_SOCKET_FAMILY_INVALID +then the sockets created by this object will be of the specified +family. +

+

+This might be useful for instance if you want to force the local +connection to be an ipv4 socket, even though the address might +be an ipv6 mapped to ipv4 address.

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

client :

a GSocketClient. +

family :

a GSocketFamily +
+

Since 2.22

+
+
+
+

g_socket_client_set_local_address ()

+
void                g_socket_client_set_local_address   (GSocketClient *client,
+                                                         GSocketAddress *address);
+

+Sets the local address of the socket client. +The sockets created by this object will bound to the +specified address (if not NULL) before connecting. +

+

+This is useful if you want to ensure the the local +side of the connection is on a specific port, or on +a specific interface.

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

client :

a GSocketClient. +

address :

a GSocketAddress, or NULL +
+

Since 2.22

+
+
+
+

g_socket_client_set_protocol ()

+
void                g_socket_client_set_protocol        (GSocketClient *client,
+                                                         GSocketProtocol protocol);
+

+Sets the protocol of the socket client. +The sockets created by this object will use of the specified +protocol. +

+

+If protocol is 0 that means to use the default +protocol for the socket family and type.

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

client :

a GSocketClient. +

protocol :

a GSocketProtocol +
+

Since 2.22

+
+
+
+

g_socket_client_set_socket_type ()

+
void                g_socket_client_set_socket_type     (GSocketClient *client,
+                                                         GSocketType type);
+

+Sets the socket type of the socket client. +The sockets created by this object will be of the specified +type. +

+

+It doesn't make sense to specify a type of G_SOCKET_TYPE_DATAGRAM, +as GSocketClient is used for connection oriented services.

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

client :

a GSocketClient. +

type :

a GSocketType +
+

Since 2.22

+
+
+
+

g_socket_client_get_family ()

+
GSocketFamily       g_socket_client_get_family          (GSocketClient *client);
+

+Gets the socket family of the socket client. +

+

+See g_socket_client_set_family() for details.

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

client :

a GSocketClient. +

Returns :

a GSocketFamily + +
+

Since 2.22

+
+
+
+

g_socket_client_get_local_address ()

+
GSocketAddress *    g_socket_client_get_local_address   (GSocketClient *client);
+

+Gets the local address of the socket client. +

+

+See g_socket_client_set_local_address() for details.

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

client :

a GSocketClient. +

Returns :

a GSocketAddres or NULL. don't free + +
+

Since 2.22

+
+
+
+

g_socket_client_get_protocol ()

+
GSocketProtocol     g_socket_client_get_protocol        (GSocketClient *client);
+

+Gets the protocol name type of the socket client. +

+

+See g_socket_client_set_protocol() for details.

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

client :

a GSocketClient +

Returns :

a GSocketProtocol + +
+

Since 2.22

+
+
+
+

g_socket_client_get_socket_type ()

+
GSocketType         g_socket_client_get_socket_type     (GSocketClient *client);
+

+Gets the socket type of the socket client. +

+

+See g_socket_client_set_socket_type() for details.

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

client :

a GSocketClient. +

Returns :

a GSocketFamily + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "family" property

+
  "family"                   GSocketFamily         : Read / Write / Construct
+

The sockets address family to use for socket construction.

+

Default value: G_SOCKET_FAMILY_INVALID

+
+
+
+

The "local-address" property

+
  "local-address"            GSocketAddress*       : Read / Write / Construct
+

The local address constructed sockets will be bound to.

+
+
+
+

The "protocol" property

+
  "protocol"                 GSocketProtocol       : Read / Write / Construct
+

The protocol to use for socket construction, or 0 for default.

+

Default value: G_SOCKET_PROTOCOL_DEFAULT

+
+
+
+

The "type" property

+
  "type"                     GSocketType           : Read / Write / Construct
+

The sockets type to use for socket construction.

+

Default value: G_SOCKET_TYPE_STREAM

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketConnectable.html b/docs/reference/gio/html/GSocketConnectable.html new file mode 100644 index 0000000..f4dc998 --- /dev/null +++ b/docs/reference/gio/html/GSocketConnectable.html @@ -0,0 +1,389 @@ + + + + +GSocketConnectable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketConnectable

+

GSocketConnectable — Interface for potential socket endpoints

+
+ +
+

Object Hierarchy

+
+  GInterface
+   +----GSocketConnectable
+
+
+  GObject
+   +----GSocketAddressEnumerator
+
+
+
+

Prerequisites

+

+GSocketConnectable requires + GObject.

+
+
+

Known Implementations

+

+GSocketConnectable is implemented by + GUnixSocketAddress, GNetworkService, GSocketAddress, GNetworkAddress and GInetSocketAddress.

+
+
+

Description

+

+Objects that describe one or more potential socket endpoints +implement GSocketConnectable. Callers can then use +g_socket_connectable_enumerate() to get a GSocketAddressEnumerator +to try out each socket address in turn until one succeeds, as shown +in the sample code below. +

+

+

+
+MyConnectionType *
+connect_to_host (const char    *hostname,
+                 guint16        port,
+                 GCancellable  *cancellable,
+                 GError       **error)
+{
+  MyConnection *conn = NULL;
+  GSocketConnectable *addr;
+  GSocketAddressEnumerator *enumerator;
+  GSocketAddress *sockaddr;
+  GError *conn_error = NULL;
+
+  addr = g_network_address_new ("www.gnome.org", 80);
+  enumerator = g_socket_connectable_enumerate (addr);
+  g_object_unref (addr);
+
+  /* Try each sockaddr until we succeed. Record the first
+   * connection error, but not any further ones (since they'll probably
+   * be basically the same as the first).
+   */
+  while (!conn && (sockaddr = g_socket_address_enumerator_next (enumerator, cancellable, error))
+    {
+      conn = connect_to_sockaddr (sockaddr, conn_error ? NULL : &conn_error);
+      g_object_unref (sockaddr);
+    }
+  g_object_unref (enumerator);
+
+  if (conn)
+    {
+      if (conn_error)
+        {
+          /* We couldn't connect to the first address, but we succeeded
+           * in connecting to a later address.
+           */
+          g_error_free (conn_error);
+        }
+      return conn;
+    }
+  else if (error)
+    {
+      /* Either the initial lookup failed, or else the caller
+       * cancelled us.
+       */
+      if (conn_error)
+        g_error_free (conn_error);
+      return NULL;
+    }
+  else
+    {
+      g_error_propagate (error, conn_error);
+      return NULL;
+    }
+}
+
+
+
+

Details

+
+

GSocketConnectable

+
typedef struct _GSocketConnectable GSocketConnectable;
+

+Interface for objects that contain or generate GSocketAddresses.

+
+
+
+

GSocketConnectableIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* Virtual Table */
+
+  GSocketAddressEnumerator * (* enumerate) (GSocketConnectable *connectable);
+} GSocketConnectableIface;
+
+

+Provides an interface for returning a GSocketAddressEnumerator

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

GTypeInterface g_iface;

The parent interface. +

enumerate ()

Creates a GSocketAddressEnumerator +
+
+
+
+

g_socket_connectable_enumerate ()

+
GSocketAddressEnumerator * g_socket_connectable_enumerate
+                                                        (GSocketConnectable *connectable);
+

+Creates a GSocketAddressEnumerator for connectable.

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

connectable :

a GSocketConnectable +

Returns :

a new GSocketAddressEnumerator. + +
+

Since 2.22

+
+
+
+

GSocketAddressEnumerator

+
typedef struct _GSocketAddressEnumerator GSocketAddressEnumerator;
+

+Enumerator type for objects that contain or generate +GSocketAddresses.

+
+
+
+

g_socket_address_enumerator_next ()

+
GSocketAddress *    g_socket_address_enumerator_next    (GSocketAddressEnumerator *enumerator,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Retrieves the next GSocketAddress from enumerator. Note that this +may block for some amount of time. (Eg, a GNetworkAddress may need +to do a DNS lookup before it can return an address.) Use +g_socket_address_enumerator_next_async() if you need to avoid +blocking. +

+

+If enumerator is expected to yield addresses, but for some reason +is unable to (eg, because of a DNS error), then the first call to +g_socket_address_enumerator_next() will return an appropriate error +in *error. However, if the first call to +g_socket_address_enumerator_next() succeeds, then any further +internal errors (other than cancellable being triggered) will be +ignored.

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

enumerator :

a GSocketAddressEnumerator +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

a GError. +

Returns :

a GSocketAddress (owned by the caller), or NULL on + error (in which case *error will be set) or if there are no + more addresses. +
+
+
+
+

g_socket_address_enumerator_next_async ()

+
void                g_socket_address_enumerator_next_async
+                                                        (GSocketAddressEnumerator *enumerator,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Asynchronously retrieves the next GSocketAddress from enumerator +and then calls callback, which must call +g_socket_address_enumerator_next_finish() to get the result.

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

enumerator :

a GSocketAddressEnumerator +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback to call when the request is satisfied +

user_data :

the data to pass to callback function +
+
+
+
+

g_socket_address_enumerator_next_finish ()

+
GSocketAddress *    g_socket_address_enumerator_next_finish
+                                                        (GSocketAddressEnumerator *enumerator,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Retrieves the result of a completed call to +g_socket_address_enumerator_next_async(). See +g_socket_address_enumerator_next() for more information about +error handling.

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

enumerator :

a GSocketAddressEnumerator +

result :

a GAsyncResult +

error :

a GError +

Returns :

a GSocketAddress (owned by the caller), or NULL on + error (in which case *error will be set) or if there are no + more addresses. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketConnection.html b/docs/reference/gio/html/GSocketConnection.html new file mode 100644 index 0000000..348f194 --- /dev/null +++ b/docs/reference/gio/html/GSocketConnection.html @@ -0,0 +1,561 @@ + + + + +GSocketConnection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketConnection

+

GSocketConnection — A socket connection

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GIOStream
+         +----GSocketConnection
+               +----GTcpConnection
+               +----GUnixConnection
+
+
+  GObject
+   +----GIOStream
+         +----GSocketConnection
+               +----GTcpConnection
+
+
+  GObject
+   +----GIOStream
+         +----GSocketConnection
+               +----GUnixConnection
+
+
+
+

Properties

+
+  "socket"                   GSocket*              : Read / Write / Construct Only
+  "graceful-disconnect"      gboolean              : Read / Write
+
+
+
+

Description

+

+GSocketConnection is a GIOStream for a connected socket. They +can be created either by GSocketClient when connecting to a host, +or by GSocketListener when accepting a new client. +

+

+The type of the GSocketConnection object returned from these calls +depends on the type of the underlying socket that is in use. For +instance, for a TCP/IP connection it will be a GTcpConnection. +

+

+Chosing what type of object to construct is done with the socket +connection factory, and it is possible for 3rd parties to register +custom socket connection types for specific combination of socket +family/type/protocol using g_socket_connection_factory_register_type().

+
+
+

Details

+
+

GSocketConnection

+
typedef struct _GSocketConnection GSocketConnection;
+

+A socket connection GIOStream object for connection-oriented sockets.

+

Since 2.22

+
+
+
+

g_socket_connection_get_local_address ()

+
GSocketAddress *    g_socket_connection_get_local_address
+                                                        (GSocketConnection *connection,
+                                                         GError **error);
+

+Try to get the local address of a socket connection.

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

connection :

a GSocketConnection +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocketAddress or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_connection_get_remote_address ()

+
GSocketAddress *    g_socket_connection_get_remote_address
+                                                        (GSocketConnection *connection,
+                                                         GError **error);
+

+Try to get the remote address of a socket connection.

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

connection :

a GSocketConnection +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocketAddress or NULL on error. + Free the returned object with g_object_unref(). + +
+

Since 2.22

+
+
+
+

g_socket_connection_get_socket ()

+
GSocket *           g_socket_connection_get_socket      (GSocketConnection *connection);
+

+Gets the underlying GSocket object of the connection. +This can be useful if you want to do something unusual on it +not supported by the GSocketConnection APIs.

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

connection :

a GSocketConnection +

Returns :

a GSocketAddress or NULL on error. + +
+

Since 2.22

+
+
+
+

GTcpConnection

+
typedef struct _GTcpConnection GTcpConnection;
+

+A GSocketConnection for UNIX domain socket connections.

+

Since 2.22

+
+
+
+

g_tcp_connection_set_graceful_disconnect ()

+
void                g_tcp_connection_set_graceful_disconnect
+                                                        (GTcpConnection *connection,
+                                                         gboolean graceful_disconnect);
+

+This enabled graceful disconnects on close. A graceful disconnect +means that we signal the recieving end that the connection is terminated +and wait for it to close the connection before closing the connection. +

+

+A graceful disconnect means that we can be sure that we successfully sent +all the outstanding data to the other end, or get an error reported. +However, it also means we have to wait for all the data to reach the +other side and for it to acknowledge this by closing the socket, which may +take a while. For this reason it is disabled by default.

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

connection :

a GTcpConnection +

graceful_disconnect :

Whether to do graceful disconnects or not +
+

Since 2.22

+
+
+
+

g_tcp_connection_get_graceful_disconnect ()

+
gboolean            g_tcp_connection_get_graceful_disconnect
+                                                        (GTcpConnection *connection);
+

+Checks if graceful disconnects are used. See +g_tcp_connection_set_graceful_disconnect().

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

connection :

a GTcpConnection +

Returns :

TRUE if graceful disconnect is used on close, FALSE otherwise + +
+

Since 2.22

+
+
+
+

GUnixConnection

+
typedef struct _GUnixConnection GUnixConnection;
+

+

+
+
+
+

g_unix_connection_receive_fd ()

+
gint                g_unix_connection_receive_fd        (GUnixConnection *connection,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Receives a file descriptor from the sending end of the connection. +The sending end has to call g_unix_connection_send_fd() for this +to work. +

+

+As well as reading the fd this also reads a single byte from the +stream, as this is required for fd passing to work on some +implementations.

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

connection :

a GUnixConnection +

cancellable :

optional GCancellable object, NULL to ignore +

error :

GError for error reporting, or NULL to ignore +

Returns :

a file descriptor on success, -1 on error. + +
+

Since 2.22

+
+
+
+

g_unix_connection_send_fd ()

+
gboolean            g_unix_connection_send_fd           (GUnixConnection *connection,
+                                                         gint fd,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Passes a file descriptor to the recieving side of the +connection. The recieving end has to call g_unix_connection_receive_fd() +to accept the file descriptor. +

+

+As well as sending the fd this also writes a single byte to the +stream, as this is required for fd passing to work on some +implementations.

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

connection :

a GUnixConnection +

fd :

a file descriptor +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a TRUE on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_connection_factory_create_connection ()

+
GSocketConnection * g_socket_connection_factory_create_connection
+                                                        (GSocket *socket);
+

+Creates a GSocketConnection subclass of the right type for +socket.

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

socket :

a GSocket +

Returns :

a GSocketConnection + +
+

Since 2.22

+
+
+
+

g_socket_connection_factory_lookup_type ()

+
GType               g_socket_connection_factory_lookup_type
+                                                        (GSocketFamily family,
+                                                         GSocketType type,
+                                                         gint protocol_id);
+

+Looks up the GType to be used when creating socket connections on +sockets with the specified family,type and protocol_id. +

+

+If no type is registered, the GSocketConnection base type is returned.

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

family :

a GSocketFamily +

type :

a GSocketType +

protocol_id :

a protocol id +

Returns :

a GType + +
+

Since 2.22

+
+
+
+

g_socket_connection_factory_register_type ()

+
void                g_socket_connection_factory_register_type
+                                                        (GType g_type,
+                                                         GSocketFamily family,
+                                                         GSocketType type,
+                                                         gint protocol);
+

+Looks up the GType to be used when creating socket connections on +sockets with the specified family,type and protocol. +

+

+If no type is registered, the GSocketConnection base type is returned.

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

g_type :

a GType, inheriting from G_TYPE_SOCKET_CONNECTION +

family :

a GSocketFamily +

type :

a GSocketType +

protocol :

a protocol id +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "socket" property

+
  "socket"                   GSocket*              : Read / Write / Construct Only
+

The underlying GSocket.

+
+
+
+

The "graceful-disconnect" property

+
  "graceful-disconnect"      gboolean              : Read / Write
+

Whether or not close does a graceful disconnect.

+

Default value: FALSE

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketControlMessage.html b/docs/reference/gio/html/GSocketControlMessage.html new file mode 100644 index 0000000..91345ef --- /dev/null +++ b/docs/reference/gio/html/GSocketControlMessage.html @@ -0,0 +1,297 @@ + + + + +GSocketControlMessage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketControlMessage

+

GSocketControlMessage — A GSocket control message

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketControlMessage
+         +----GUnixFDMessage
+
+
+
+

Description

+

+A GSocketControlMessage is a special-purpose utility message that +can be sent to or received from a GSocket. These types of +messages are often called "ancillary data". +

+

+The message can represent some sort of special instruction to or +information from the socket or can represent a special kind of +transfer to the peer (for example, sending a file description over +a UNIX socket). +

+

+These messages are sent with g_socket_send_message() and received +with g_socket_receive_message(). +

+

+To extend the set of control message that can be sent, subclass this +class and override the get_size, get_level, get_type and serialize +methods. +

+

+To extend the set of control messages that can be received, subclass +this class and implement the deserialize method. Also, make sure your +class is registered with the GType typesystem before calling +g_socket_receive_message() to read such a message.

+
+
+

Details

+
+

GSocketControlMessage

+
typedef struct _GSocketControlMessage GSocketControlMessage;
+

+Base class for socket-type specific control messages that can be sent and +received over GSocket.

+
+
+
+

g_socket_control_message_deserialize ()

+
GSocketControlMessage * g_socket_control_message_deserialize
+                                                        (int level,
+                                                         int type,
+                                                         gsize size,
+                                                         gpointer data);
+

+Tries to deserialize a socket control message of a given +level and type. This will ask all known (to GType) subclasses +of GSocketControlMessage if they can understand this kind +of message and if so deserialize it into a GSocketControlMessage. +

+

+If there is no implementation for this kind of control message, NULL +will be returned.

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

level :

a socket level +

type :

a socket control message type for the given level +

size :

the size of the data in bytes +

data :

pointer to the message data +

Returns :

the deserialized message or NULL + +
+

Since 2.22

+
+
+
+

g_socket_control_message_get_level ()

+
int                 g_socket_control_message_get_level  (GSocketControlMessage *message);
+

+Returns the "level" (i.e. the originating protocol) of the control message. +This is often SOL_SOCKET.

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

message :

a GSocketControlMessage +

Returns :

an integer describing the level + +
+

Since 2.22

+
+
+
+

g_socket_control_message_get_msg_type ()

+
int                 g_socket_control_message_get_msg_type
+                                                        (GSocketControlMessage *message);
+

+Returns the protocol specific type of the control message. +For instance, for UNIX fd passing this would be SCM_RIGHTS.

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

message :

a GSocketControlMessage +

Returns :

an integer describing the type of control message + +
+

Since 2.22

+
+
+
+

g_socket_control_message_get_size ()

+
gsize               g_socket_control_message_get_size   (GSocketControlMessage *message);
+

+Returns the space required for the control message, not including +headers or alignment.

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

message :

a GSocketControlMessage +

Returns :

The number of bytes required. + +
+

Since 2.22

+
+
+
+

g_socket_control_message_serialize ()

+
void                g_socket_control_message_serialize  (GSocketControlMessage *message,
+                                                         gpointer data);
+

+Converts the data in the message to bytes placed in the +message. +

+

+data is guaranteed to have enough space to fit the size +returned by g_socket_control_message_get_size() on this +object.

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

message :

a GSocketControlMessage +

data :

A buffer to write data to +
+

Since 2.22

+
+
+
+

See Also

+GSocket. +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketListener.html b/docs/reference/gio/html/GSocketListener.html new file mode 100644 index 0000000..a11e548 --- /dev/null +++ b/docs/reference/gio/html/GSocketListener.html @@ -0,0 +1,752 @@ + + + + +GSocketListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketListener

+

GSocketListener — Helper for accepting network client connections

+
+
+

Synopsis

+
                    GSocketListener;
+GSocketListener *   g_socket_listener_new               (void);
+gboolean            g_socket_listener_add_socket        (GSocketListener *listener,
+                                                         GSocket *socket,
+                                                         GObject *source_object,
+                                                         GError **error);
+gboolean            g_socket_listener_add_address       (GSocketListener *listener,
+                                                         GSocketAddress *address,
+                                                         GSocketType type,
+                                                         GSocketProtocol protocol,
+                                                         GObject *source_object,
+                                                         GSocketAddress **effective_address,
+                                                         GError **error);
+gboolean            g_socket_listener_add_inet_port     (GSocketListener *listener,
+                                                         guint16 port,
+                                                         GObject *source_object,
+                                                         GError **error);
+guint16             g_socket_listener_add_any_inet_port (GSocketListener *listener,
+                                                         GObject *source_object,
+                                                         GError **error);
+GSocketConnection * g_socket_listener_accept            (GSocketListener *listener,
+                                                         GObject **source_object,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_socket_listener_accept_async      (GSocketListener *listener,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GSocketConnection * g_socket_listener_accept_finish     (GSocketListener *listener,
+                                                         GAsyncResult *result,
+                                                         GObject **source_object,
+                                                         GError **error);
+GSocket *           g_socket_listener_accept_socket     (GSocketListener *listener,
+                                                         GObject **source_object,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+void                g_socket_listener_accept_socket_async
+                                                        (GSocketListener *listener,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+GSocket *           g_socket_listener_accept_socket_finish
+                                                        (GSocketListener *listener,
+                                                         GAsyncResult *result,
+                                                         GObject **source_object,
+                                                         GError **error);
+void                g_socket_listener_close             (GSocketListener *listener);
+void                g_socket_listener_set_backlog       (GSocketListener *listener,
+                                                         int listen_backlog);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GSocketListener
+         +----GSocketService
+
+
+
+

Properties

+
+  "listen-backlog"           gint                  : Read / Write / Construct
+
+
+
+

Description

+

+A GSocketListener is an object that keeps track of a set +of server sockets and helps you accept sockets from any of the +socket, either sync or async. +

+

+If you want to implement a network server, also look at GSocketService +and GThreadedSocketService which are subclass of GSocketListener +that makes this even easier.

+
+
+

Details

+
+

GSocketListener

+
typedef struct _GSocketListener GSocketListener;
+

+

+
+
+
+

g_socket_listener_new ()

+
GSocketListener *   g_socket_listener_new               (void);
+

+Creates a new GSocketListener with no sockets to listen for. +New listeners can be added with e.g. g_socket_listener_add_address() +or g_socket_listener_add_inet_port().

+
++ + + + +

Returns :

a new GSocketListener. + +
+

Since 2.22

+
+
+
+

g_socket_listener_add_socket ()

+
gboolean            g_socket_listener_add_socket        (GSocketListener *listener,
+                                                         GSocket *socket,
+                                                         GObject *source_object,
+                                                         GError **error);
+

+Adds socket to the set of sockets that we try to accept +new clients from. The socket must be bound to a local +address and listened to. +

+

+source_object will be passed out in the various calls +to accept to identify this particular source, which is +useful if you're listening on multiple addresses and do +different things depending on what address is connected to.

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

listener :

a GSocketListener +

socket :

a listening GSocket +

source_object :

Optional GObject identifying this source +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_add_address ()

+
gboolean            g_socket_listener_add_address       (GSocketListener *listener,
+                                                         GSocketAddress *address,
+                                                         GSocketType type,
+                                                         GSocketProtocol protocol,
+                                                         GObject *source_object,
+                                                         GSocketAddress **effective_address,
+                                                         GError **error);
+

+Creates a socket of type type and protocol protocol, binds +it to address and adds it to the set of sockets we're accepting +sockets from. +

+

+Note that adding an IPv6 address, depending on the platform, +may or may not result in a listener that also accepts IPv4 +connections. For more determinstic behaviour, see +g_socket_listener_add_inet_port(). +

+

+source_object will be passed out in the various calls +to accept to identify this particular source, which is +useful if you're listening on multiple addresses and do +different things depending on what address is connected to. +

+

+If successful and effective_address is non-NULL then it will +be set to the address that the binding actually occured at. This +is helpful for determining the port number that was used for when +requesting a binding to port 0 (ie: "any port"). This address, if +requested, belongs to the caller and must be freed.

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

listener :

a GSocketListener +

address :

a GSocketAddress +

type :

a GSocketType +

protocol :

a GSocketProtocol +

source_object :

Optional GObject identifying this source +

effective_address :

location to store the address that was bound to, or NULL. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_add_inet_port ()

+
gboolean            g_socket_listener_add_inet_port     (GSocketListener *listener,
+                                                         guint16 port,
+                                                         GObject *source_object,
+                                                         GError **error);
+

+Helper function for g_socket_listener_add_address() that +creates a TCP/IP socket listening on IPv4 and IPv6 (if +supported) on the specified port on all interfaces. +

+

+source_object will be passed out in the various calls +to accept to identify this particular source, which is +useful if you're listening on multiple addresses and do +different things depending on what address is connected to.

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

listener :

a GSocketListener +

port :

an IP port number (non-zero) +

source_object :

Optional GObject identifying this source +

error :

GError for error reporting, or NULL to ignore. +

Returns :

TRUE on success, FALSE on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_add_any_inet_port ()

+
guint16             g_socket_listener_add_any_inet_port (GSocketListener *listener,
+                                                         GObject *source_object,
+                                                         GError **error);
+

+Listens for TCP connections on any available port number for both +IPv6 and IPv4 (if each are available). +

+

+This is useful if you need to have a socket for incoming connections +but don't care about the specific port number. +

+

+source_object will be passed out in the various calls +to accept to identify this particular source, which is +useful if you're listening on multiple addresses and do +different things depending on what address is connected to.

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

listener :

a GSocketListener +

source_object :

Optional GObject identifying this source +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

the port number, or 0 in case of failure. + +
+

Since 2.24

+
+
+
+

g_socket_listener_accept ()

+
GSocketConnection * g_socket_listener_accept            (GSocketListener *listener,
+                                                         GObject **source_object,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Blocks waiting for a client to connect to any of the sockets added +to the listener. Returns a GSocketConnection for the socket that was +accepted. +

+

+If source_object is not NULL it will be filled out with the source +object specified when the corresponding socket or address was added +to the listener. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

listener :

a GSocketListener +

source_object :

location where GObject pointer will be stored, or NULL +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_accept_async ()

+
void                g_socket_listener_accept_async      (GSocketListener *listener,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+This is the asynchronous version of g_socket_listener_accept(). +

+

+When the operation is finished callback will be +called. You can then call g_socket_listener_accept_socket() +to get the result of the operation.

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

listener :

a GSocketListener +

cancellable :

a GCancellable, or NULL +

callback :

a GAsyncReadyCallback +

user_data :

user data for the callback +
+

Since 2.22

+
+
+
+

g_socket_listener_accept_finish ()

+
GSocketConnection * g_socket_listener_accept_finish     (GSocketListener *listener,
+                                                         GAsyncResult *result,
+                                                         GObject **source_object,
+                                                         GError **error);
+

+Finishes an async accept operation. See g_socket_listener_accept_async()

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

listener :

a GSocketListener +

result :

a GAsyncResult. +

source_object :

Optional GObject identifying this source +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GSocketConnection on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_accept_socket ()

+
GSocket *           g_socket_listener_accept_socket     (GSocketListener *listener,
+                                                         GObject **source_object,
+                                                         GCancellable *cancellable,
+                                                         GError **error);
+

+Blocks waiting for a client to connect to any of the sockets added +to the listener. Returns the GSocket that was accepted. +

+

+If you want to accept the high-level GSocketConnection, not a GSocket, +which is often the case, then you should use g_socket_listener_accept() +instead. +

+

+If source_object is not NULL it will be filled out with the source +object specified when the corresponding socket or address was added +to the listener. +

+

+If cancellable is not NULL, then the operation can be cancelled by +triggering the cancellable object from another thread. If the operation +was cancelled, the error G_IO_ERROR_CANCELLED will be returned.

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

listener :

a GSocketListener +

source_object :

location where GObject pointer will be stored, or NULL +

cancellable :

optional GCancellable object, NULL to ignore. +

error :

GError for error reporting, or NULL to ignore. +

Returns :

a GSocket on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_accept_socket_async ()

+
void                g_socket_listener_accept_socket_async
+                                                        (GSocketListener *listener,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+This is the asynchronous version of g_socket_listener_accept_socket(). +

+

+When the operation is finished callback will be +called. You can then call g_socket_listener_accept_socket_finish() +to get the result of the operation.

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

listener :

a GSocketListener +

cancellable :

a GCancellable, or NULL +

callback :

a GAsyncReadyCallback +

user_data :

user data for the callback +
+

Since 2.22

+
+
+
+

g_socket_listener_accept_socket_finish ()

+
GSocket *           g_socket_listener_accept_socket_finish
+                                                        (GSocketListener *listener,
+                                                         GAsyncResult *result,
+                                                         GObject **source_object,
+                                                         GError **error);
+

+Finishes an async accept operation. See g_socket_listener_accept_socket_async()

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

listener :

a GSocketListener +

result :

a GAsyncResult. +

source_object :

Optional GObject identifying this source +

error :

a GError location to store the error occuring, or NULL to +ignore. +

Returns :

a GSocket on success, NULL on error. + +
+

Since 2.22

+
+
+
+

g_socket_listener_close ()

+
void                g_socket_listener_close             (GSocketListener *listener);
+

+Closes all the sockets in the listener.

+
++ + + + +

listener :

a GSocketListener +
+

Since 2.22

+
+
+
+

g_socket_listener_set_backlog ()

+
void                g_socket_listener_set_backlog       (GSocketListener *listener,
+                                                         int listen_backlog);
+

+Sets the listen backlog on the sockets in the listener. +

+

+See g_socket_set_listen_backlog() for details

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

listener :

a GSocketListener +

listen_backlog :

an integer +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "listen-backlog" property

+
  "listen-backlog"           gint                  : Read / Write / Construct
+

outstanding connections in the listen queue.

+

Allowed values: [0,2000]

+

Default value: 10

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GSocketService.html b/docs/reference/gio/html/GSocketService.html new file mode 100644 index 0000000..3f66172 --- /dev/null +++ b/docs/reference/gio/html/GSocketService.html @@ -0,0 +1,281 @@ + + + + +GSocketService + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSocketService

+

GSocketService — Make it easy to implement a network service

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketListener
+         +----GSocketService
+               +----GThreadedSocketService
+
+
+
+

Signals

+
+  "incoming"                                       : Run Last
+
+
+
+

Description

+

+A GSocketService is an object that represents a service that is +provided to the network or over local sockets. When a new +connection is made to the service the "incoming" +signal is emitted. +

+

+A GSocketService is a subclass of GSocketListener and you need +to add the addresses you want to accept connections on to the +with the GSocketListener APIs. +

+

+There are two options for implementing a network service based on +GSocketService. The first is to create the service using +g_socket_service_new() and to connect to the "incoming" +signal. The second is to subclass GSocketService and override the +default signal handler implementation. +

+

+In either case, the handler must immediately return, or else it +will block additional incoming connections from being serviced. +If you are interested in writing connection handlers that contain +blocking code then see GThreadedSocketService. +

+

+The socket service runs on the main loop in the main thread, and is +not threadsafe in general. However, the calls to start and stop +the service are threadsafe so these can be used from threads that +handle incoming clients.

+
+
+

Details

+
+

GSocketService

+
typedef struct _GSocketService GSocketService;
+

+A helper class for handling accepting incomming connections in the +glib mainloop.

+

Since 2.22

+
+
+
+

g_socket_service_new ()

+
GSocketService *    g_socket_service_new                (void);
+

+Creates a new GSocketService with no sockets to listen for. +New listeners can be added with e.g. g_socket_listener_add_address() +or g_socket_listener_add_inet_port().

+
++ + + + +

Returns :

a new GSocketService. + +
+

Since 2.22

+
+
+
+

g_socket_service_start ()

+
void                g_socket_service_start              (GSocketService *service);
+

+Starts the service, i.e. start accepting connections +from the added sockets when the mainloop runs. +

+

+This call is threadsafe, so it may be called from a thread +handling an incomming client request.

+
++ + + + +

service :

a GSocketService +
+

Since 2.22

+
+
+
+

g_socket_service_stop ()

+
void                g_socket_service_stop               (GSocketService *service);
+

+Stops the service, i.e. stops accepting connections +from the added sockets when the mainloop runs. +

+

+This call is threadsafe, so it may be called from a thread +handling an incomming client request.

+
++ + + + +

service :

a GSocketService +
+

Since 2.22

+
+
+
+

g_socket_service_is_active ()

+
gboolean            g_socket_service_is_active          (GSocketService *service);
+

+Check whether the service is active or not. An active +service will accept new clients that connect, while +a non-active service will let connecting clients queue +up until the service is started.

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

service :

a GSocketService +

Returns :

TRUE if the service is active, FALSE otherwise + +
+

Since 2.22

+
+
+
+

Signal Details

+
+

The "incoming" signal

+
gboolean            user_function                      (GSocketService    *service,
+                                                        GSocketConnection *connection,
+                                                        GObject           *source_object,
+                                                        gpointer           user_data)          : Run Last
+

+The ::incoming signal is emitted when a new incoming connection +to service needs to be handled. The handler must initiate the +handling of connection, but may not block; in essence, +asynchronous operations must be used.

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

service :

the GSocketService. +

connection :

a new GSocketConnection object. +

source_object :

the source_object passed to g_socket_listener_add_address(). +

user_data :

user data set when the signal handler was connected.

Returns :

TRUE to stop other handlers from being called +
+

Since 2.22

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GThemedIcon.html b/docs/reference/gio/html/GThemedIcon.html new file mode 100644 index 0000000..f37f98d --- /dev/null +++ b/docs/reference/gio/html/GThemedIcon.html @@ -0,0 +1,362 @@ + + + + +GThemedIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GThemedIcon

+

GThemedIcon — Icon theming support

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GThemedIcon;
+GIcon *             g_themed_icon_new                   (const char *iconname);
+GIcon *             g_themed_icon_new_from_names        (char **iconnames,
+                                                         int len);
+GIcon *             g_themed_icon_new_with_default_fallbacks
+                                                        (const char *iconname);
+void                g_themed_icon_prepend_name          (GThemedIcon *icon,
+                                                         const char *iconname);
+void                g_themed_icon_append_name           (GThemedIcon *icon,
+                                                         const char *iconname);
+const gchar* const * g_themed_icon_get_names            (GThemedIcon *icon);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GThemedIcon
+
+
+
+

Implemented Interfaces

+

+GThemedIcon implements + GIcon.

+
+
+

Properties

+
+  "name"                     gchar*                : Write / Construct Only
+  "names"                    GStrv*                : Read / Write / Construct Only
+  "use-default-fallbacks"    gboolean              : Read / Write / Construct Only
+
+
+
+

Description

+

+GThemedIcon is an implementation of GIcon that supports icon themes. +GThemedIcon contains a list of all of the icons present in an icon +theme, so that icons can be looked up quickly. GThemedIcon does +not provide actual pixmaps for icons, just the icon names. +Ideally something like gtk_icon_theme_choose_icon() should be used to +resolve the list of names so that fallback icons work nicely with +themes that inherit other themes.

+
+
+

Details

+
+

GThemedIcon

+
typedef struct _GThemedIcon GThemedIcon;
+

+An implementation of GIcon for themed icons.

+
+
+
+

g_themed_icon_new ()

+
GIcon *             g_themed_icon_new                   (const char *iconname);
+

+Creates a new themed icon for iconname.

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

iconname :

a string containing an icon name. +

Returns :

a new GThemedIcon. +
+
+
+
+

g_themed_icon_new_from_names ()

+
GIcon *             g_themed_icon_new_from_names        (char **iconnames,
+                                                         int len);
+

+Creates a new themed icon for iconnames.

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

iconnames :

an array of strings containing icon names. +

len :

the length of the iconnames array, or -1 if iconnames is + NULL-terminated +

Returns :

a new GThemedIcon +
+
+
+
+

g_themed_icon_new_with_default_fallbacks ()

+
GIcon *             g_themed_icon_new_with_default_fallbacks
+                                                        (const char *iconname);
+

+Creates a new themed icon for iconname, and all the names +that can be created by shortening iconname at '-' characters. +

+

+In the following example, icon1 and icon2 are equivalent: +

+
+const char *names[] = { 
+  "gnome-dev-cdrom-audio",
+  "gnome-dev-cdrom",
+  "gnome-dev",
+  "gnome"
+};
+
+icon1 = g_themed_icon_new_from_names (names, 4);
+icon2 = g_themed_icon_new_with_default_fallbacks ("gnome-dev-cdrom-audio");
+
+
++ + + + + + + + + + +

iconname :

a string containing an icon name +

Returns :

a new GThemedIcon. +
+
+
+
+

g_themed_icon_prepend_name ()

+
void                g_themed_icon_prepend_name          (GThemedIcon *icon,
+                                                         const char *iconname);
+

+Prepend a name to the list of icons from within icon. +

+

+

+
+

Note

+

+Note that doing so invalidates the hash computed by prior calls +to g_icon_hash(). +

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

icon :

a GThemedIcon +

iconname :

name of icon to prepend to list of icons from within icon. +
+

Since 2.18

+
+
+
+

g_themed_icon_append_name ()

+
void                g_themed_icon_append_name           (GThemedIcon *icon,
+                                                         const char *iconname);
+

+Append a name to the list of icons from within icon. +

+

+

+
+

Note

+

+Note that doing so invalidates the hash computed by prior calls +to g_icon_hash(). +

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

icon :

a GThemedIcon +

iconname :

name of icon to append to list of icons from within icon. +
+
+
+
+

g_themed_icon_get_names ()

+
const gchar* const * g_themed_icon_get_names            (GThemedIcon *icon);
+

+Gets the names of icons from within icon.

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

icon :

a GThemedIcon. +

Returns :

a list of icon names. +
+
+
+
+

Property Details

+
+

The "name" property

+
  "name"                     gchar*                : Write / Construct Only
+

+The icon name.

+

Default value: NULL

+
+
+
+

The "names" property

+
  "names"                    GStrv*                : Read / Write / Construct Only
+

+A NULL-terminated array of icon names.

+
+
+
+

The "use-default-fallbacks" property

+
  "use-default-fallbacks"    gboolean              : Read / Write / Construct Only
+

+Whether to use the default fallbacks found by shortening the icon name +at '-' characters. If the "names" array has more than one element, +ignores any past the first. +

+

+For example, if the icon name was "gnome-dev-cdrom-audio", the array +would become +

+
+{
+  "gnome-dev-cdrom-audio",
+  "gnome-dev-cdrom",
+  "gnome-dev",
+  "gnome",
+  NULL
+};
+
+

Default value: FALSE

+
+
+
+

See Also

+GIcon, GLoadableIcon +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GThreadedSocketService.html b/docs/reference/gio/html/GThreadedSocketService.html new file mode 100644 index 0000000..5200d0f --- /dev/null +++ b/docs/reference/gio/html/GThreadedSocketService.html @@ -0,0 +1,223 @@ + + + + +GThreadedSocketService + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GThreadedSocketService

+

GThreadedSocketService — A threaded GSocketService

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketListener
+         +----GSocketService
+               +----GThreadedSocketService
+
+
+
+

Properties

+
+  "max-threads"              gint                  : Read / Write / Construct Only
+
+
+
+

Signals

+
+  "run"                                            : Run Last
+
+
+
+

Description

+

+A GThreadedSocketService is a simple subclass of GSocketService +that handles incoming connections by creating a worker thread and +dispatching the connection to it by emitting the ::run signal in +the new thread. +

+

+The signal handler may perform blocking IO and need not return +until the connection is closed. +

+

+The service is implemented using a thread pool, so there is a +limited amount of threads availible to serve incomming requests. +The service automatically stops the GSocketService from accepting +new connections when all threads are busy. +

+

+As with GSocketService, you may connect to "run", +or subclass and override the default handler.

+
+
+

Details

+
+

GThreadedSocketService

+
typedef struct _GThreadedSocketService GThreadedSocketService;
+

+A helper class for handling accepting incomming connections in the +glib mainloop and handling them in a thread.

+

Since 2.22

+
+
+
+

g_threaded_socket_service_new ()

+
GSocketService *    g_threaded_socket_service_new       (int max_threads);
+

+Creates a new GThreadedSocketService with no listeners. Listeners +must be added with g_socket_service_add_listeners().

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

max_threads :

the maximal number of threads to execute concurrently + handling incoming clients, -1 means no limit +

Returns :

a new GSocketService. + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "max-threads" property

+
  "max-threads"              gint                  : Read / Write / Construct Only
+

The max number of threads handling clients for this service.

+

Allowed values: >= G_MAXULONG

+

Default value: 10

+
+
+
+

Signal Details

+
+

The "run" signal

+
gboolean            user_function                      (GThreadedSocketService *service,
+                                                        GSocketConnection      *connection,
+                                                        GObject                *source_object,
+                                                        gpointer                user_data)          : Run Last
+

+The ::run signal is emitted in a worker thread in response to an +incoming connection. This thread is dedicated to handling +connection and may perform blocking IO. The signal handler need +not return until the connection is closed.

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

service :

the GThreadedSocketService. +

connection :

a new GSocketConnection object. +

source_object :

the source_object passed to g_socket_listener_add_address(). +

user_data :

user data set when the signal handler was connected.

Returns :

TRUE to stope further signal handlers from being called +
+
+
+
+

See Also

+GSocketService. +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GUnixFDList.html b/docs/reference/gio/html/GUnixFDList.html new file mode 100644 index 0000000..9b74e13 --- /dev/null +++ b/docs/reference/gio/html/GUnixFDList.html @@ -0,0 +1,403 @@ + + + + +GUnixFDList + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GUnixFDList

+

GUnixFDList — An object containing a set of file descriptors

+
+
+

Synopsis

+
                    GUnixFDList;
+GUnixFDList *       g_unix_fd_list_new_from_array       (const gint *fds,
+                                                         gint n_fds);
+GUnixFDList *       g_unix_fd_list_new                  (void);
+gint                g_unix_fd_list_get_length           (GUnixFDList *list);
+gint                g_unix_fd_list_get                  (GUnixFDList *list,
+                                                         gint index_,
+                                                         GError **error);
+const gint *        g_unix_fd_list_peek_fds             (GUnixFDList *list,
+                                                         gint *length);
+gint *              g_unix_fd_list_steal_fds            (GUnixFDList *list,
+                                                         gint *length);
+gint                g_unix_fd_list_append               (GUnixFDList *list,
+                                                         gint fd,
+                                                         GError **error);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GUnixFDList
+
+
+
+

Description

+

+A GUnixFDList contains a list of file descriptors. It owns the file +descriptors that it contains, closing them when finalized. +

+

+It may be wrapped in a GUnixFDMessage and sent over a GSocket in +the G_SOCKET_ADDRESS_UNIX family by using g_socket_send_message() +and received using g_socket_receive_message().

+
+
+

Details

+
+

GUnixFDList

+
typedef struct _GUnixFDList GUnixFDList;
+

+

+
+
+
+

g_unix_fd_list_new_from_array ()

+
GUnixFDList *       g_unix_fd_list_new_from_array       (const gint *fds,
+                                                         gint n_fds);
+

+Creates a new GUnixFDList containing the file descriptors given in +fds. The file descriptors become the property of the new list and +may no longer be used by the caller. The array itself is owned by +the caller. +

+

+Each file descriptor in the array should be set to close-on-exec. +

+

+If n_fds is -1 then fds must be terminated with -1.

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

fds :

the initial list of file descriptors +

n_fds :

the length of fds, or -1 +

Returns :

a new GUnixFDList + +
+

Since 2.24

+
+
+
+

g_unix_fd_list_new ()

+
GUnixFDList *       g_unix_fd_list_new                  (void);
+

+Creates a new GUnixFDList containing no file descriptors.

+
++ + + + +

Returns :

a new GUnixFDList + +
+

Since 2.24

+
+
+
+

g_unix_fd_list_get_length ()

+
gint                g_unix_fd_list_get_length           (GUnixFDList *list);
+

+Gets the length of list (ie: the number of file descriptors +contained within).

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

list :

a GUnixFDList +

Returns :

the length of list + +
+

Since 2.24

+
+
+
+

g_unix_fd_list_get ()

+
gint                g_unix_fd_list_get                  (GUnixFDList *list,
+                                                         gint index_,
+                                                         GError **error);
+

+Gets a file descriptor out of list. +

+

+index_ specifies the index of the file descriptor to get. It is a +programmer error for index_ to be out of range; see +g_unix_fd_list_get_length(). +

+

+The file descriptor is duplicated using dup() and set as +close-on-exec before being returned. You must call close() on it +when you are done. +

+

+A possible cause of failure is exceeding the per-process or +system-wide file descriptor limit.

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

list :

a GUnixFDList +

index_ :

the index into the list +

error :

a GError pointer +

Returns :

the file descriptor, or -1 in case of error + +
+

Since 2.24

+
+
+
+

g_unix_fd_list_peek_fds ()

+
const gint *        g_unix_fd_list_peek_fds             (GUnixFDList *list,
+                                                         gint *length);
+

+Returns the array of file descriptors that is contained in this +object. +

+

+After this call, the descriptors remain the property of list. The +caller must not close them and must not free the array. The array is +valid only until list is changed in any way. +

+

+If length is non-NULL then it is set to the number of file +descriptors in the returned array. The returned array is also +terminated with -1. +

+

+This function never returns NULL. In case there are no file +descriptors contained in list, an empty array is returned.

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

list :

a GUnixFDList +

length :

pointer to the length of the returned array, or NULL +

Returns :

an array of file descriptors + +
+

Since 2.24

+
+
+
+

g_unix_fd_list_steal_fds ()

+
gint *              g_unix_fd_list_steal_fds            (GUnixFDList *list,
+                                                         gint *length);
+

+Returns the array of file descriptors that is contained in this +object. +

+

+After this call, the descriptors are no longer contained in +list. Further calls will return an empty list (unless more +descriptors have been added). +

+

+The return result of this function must be freed with g_free(). +The caller is also responsible for closing all of the file +descriptors. The file descriptors in the array are set to +close-on-exec. +

+

+If length is non-NULL then it is set to the number of file +descriptors in the returned array. The returned array is also +terminated with -1. +

+

+This function never returns NULL. In case there are no file +descriptors contained in list, an empty array is returned.

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

list :

a GUnixFDList +

length :

pointer to the length of the returned array, or NULL +

Returns :

an array of file descriptors + +
+

Since 2.24

+
+
+
+

g_unix_fd_list_append ()

+
gint                g_unix_fd_list_append               (GUnixFDList *list,
+                                                         gint fd,
+                                                         GError **error);
+

+Adds a file descriptor to list. +

+

+The file descriptor is duplicated using dup(). You keep your copy +of the descriptor and the copy contained in list will be closed +when list is finalized. +

+

+A possible cause of failure is exceeding the per-process or +system-wide file descriptor limit. +

+

+The index of the file descriptor in the list is returned. If you use +this index with g_unix_fd_list_get() then you will receive back a +duplicated copy of the same file descriptor.

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

list :

a GUnixFDList +

fd :

a valid open file descriptor +

error :

a GError pointer +

Returns :

the index of the appended fd in case of success, else -1 + (and error is set) + +
+

Since 2.24

+
+
+
+

See Also

+GUnixFDMessage +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GUnixFDMessage.html b/docs/reference/gio/html/GUnixFDMessage.html new file mode 100644 index 0000000..689fdfa --- /dev/null +++ b/docs/reference/gio/html/GUnixFDMessage.html @@ -0,0 +1,304 @@ + + + + +GUnixFDMessage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GUnixFDMessage

+

GUnixFDMessage — A GSocketControlMessage containing a GUnixFDList

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketControlMessage
+         +----GUnixFDMessage
+
+
+
+

Properties

+
+  "fd-list"                  GUnixFDList*          : Read / Write / Construct Only
+
+
+
+

Description

+

+This GSocketControlMessage contains a GUnixFDList. It may be sent +using g_socket_send_message() and received using +g_socket_receive_message() over UNIX sockets (ie: sockets in the +G_SOCKET_ADDRESS_UNIX family). The file descriptors are copied +between processes by the kernel. +

+

+For an easier way to send and receive file descriptors over +stream-oriented UNIX sockets, see g_unix_connection_send_fd() and +g_unix_connection_receive_fd().

+
+
+

Details

+
+

GUnixFDMessage

+
typedef struct _GUnixFDMessage GUnixFDMessage;
+

+

+
+
+
+

g_unix_fd_message_new_with_fd_list ()

+
GSocketControlMessage * g_unix_fd_message_new_with_fd_list
+                                                        (GUnixFDList *fd_list);
+

+Creates a new GUnixFDMessage containing list.

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

fd_list :

a GUnixFDList +

Returns :

a new GUnixFDMessage + +
+

Since 2.24

+
+
+
+

g_unix_fd_message_new ()

+
GSocketControlMessage * g_unix_fd_message_new           (void);
+

+Creates a new GUnixFDMessage containing an empty file descriptor +list.

+
++ + + + +

Returns :

a new GUnixFDMessage + +
+

Since 2.22

+
+
+
+

g_unix_fd_message_get_fd_list ()

+
GUnixFDList *       g_unix_fd_message_get_fd_list       (GUnixFDMessage *message);
+

+Gets the GUnixFDList contained in message. This function does not +return a reference to the caller, but the returned list is valid for +the lifetime of message.

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

message :

a GUnixFDMessage +

Returns :

the GUnixFDList from message + +
+

Since 2.24

+
+
+
+

g_unix_fd_message_append_fd ()

+
gboolean            g_unix_fd_message_append_fd         (GUnixFDMessage *message,
+                                                         gint fd,
+                                                         GError **error);
+

+Adds a file descriptor to message. +

+

+The file descriptor is duplicated using dup(). You keep your copy +of the descriptor and the copy contained in message will be closed +when message is finalized. +

+

+A possible cause of failure is exceeding the per-process or +system-wide file descriptor limit.

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

message :

a GUnixFDMessage +

fd :

a valid open file descriptor +

error :

a GError pointer +

Returns :

TRUE in case of success, else FALSE (and error is set) + +
+

Since 2.22

+
+
+
+

g_unix_fd_message_steal_fds ()

+
gint *              g_unix_fd_message_steal_fds         (GUnixFDMessage *message,
+                                                         gint *length);
+

+Returns the array of file descriptors that is contained in this +object. +

+

+After this call, the descriptors are no longer contained in +message. Further calls will return an empty list (unless more +descriptors have been added). +

+

+The return result of this function must be freed with g_free(). +The caller is also responsible for closing all of the file +descriptors. +

+

+If length is non-NULL then it is set to the number of file +descriptors in the returned array. The returned array is also +terminated with -1. +

+

+This function never returns NULL. In case there are no file +descriptors contained in message, an empty array is returned.

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

message :

a GUnixFDMessage +

length :

pointer to the length of the returned array, or NULL +

Returns :

an array of file descriptors + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "fd-list" property

+
  "fd-list"                  GUnixFDList*          : Read / Write / Construct Only
+

The GUnixFDList object to send with the message.

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GUnixInputStream.html b/docs/reference/gio/html/GUnixInputStream.html new file mode 100644 index 0000000..61017db --- /dev/null +++ b/docs/reference/gio/html/GUnixInputStream.html @@ -0,0 +1,257 @@ + + + + +GUnixInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GUnixInputStream

+

GUnixInputStream — Streaming input operations for UNIX file descriptors

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GUnixInputStream
+
+
+
+

Properties

+
+  "close-fd"                 gboolean              : Read / Write
+  "fd"                       gint                  : Read / Write / Construct Only
+
+
+
+

Description

+

+GUnixInputStream implements GInputStream for reading from a +UNIX file descriptor, including asynchronous operations. The file +descriptor must be selectable, so it doesn't work with opened files. +

+

+Note that <gio/gunixinputstream.h> belongs +to the UNIX-specific GIO interfaces, thus you have to use the +gio-unix-2.0.pc pkg-config file when using it.

+
+
+

Details

+
+

GUnixInputStream

+
typedef struct _GUnixInputStream GUnixInputStream;
+

+Implements GInputStream for reading from selectable unix file descriptors

+
+
+
+

g_unix_input_stream_new ()

+
GInputStream *      g_unix_input_stream_new             (gint fd,
+                                                         gboolean close_fd);
+

+Creates a new GUnixInputStream for the given fd. +

+

+If close_fd is TRUE, the file descriptor will be closed +when the stream is closed.

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

fd :

a UNIX file descriptor +

close_fd :

TRUE to close the file descriptor when done +

Returns :

a new GUnixInputStream +
+
+
+
+

g_unix_input_stream_set_close_fd ()

+
void                g_unix_input_stream_set_close_fd    (GUnixInputStream *stream,
+                                                         gboolean close_fd);
+

+Sets whether the file descriptor of stream shall be closed +when the stream is closed.

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

stream :

a GUnixInputStream +

close_fd :

TRUE to close the file descriptor when done +
+

Since 2.20

+
+
+
+

g_unix_input_stream_get_close_fd ()

+
gboolean            g_unix_input_stream_get_close_fd    (GUnixInputStream *stream);
+

+Returns whether the file descriptor of stream will be +closed when the stream is closed.

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

stream :

a GUnixInputStream +

Returns :

TRUE if the file descriptor is closed when done + +
+

Since 2.20

+
+
+
+

g_unix_input_stream_get_fd ()

+
gint                g_unix_input_stream_get_fd          (GUnixInputStream *stream);
+

+Return the UNIX file descriptor that the stream reads from.

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

stream :

a GUnixInputStream +

Returns :

The file descriptor of stream + +
+

Since 2.20

+
+
+
+

Property Details

+
+

The "close-fd" property

+
  "close-fd"                 gboolean              : Read / Write
+

+Whether to close the file descriptor when the stream is closed.

+

Default value: TRUE

+

Since 2.20

+
+
+
+

The "fd" property

+
  "fd"                       gint                  : Read / Write / Construct Only
+

+The file descriptor that the stream reads from.

+

Default value: -1

+

Since 2.20

+
+
+
+

See Also

+GInputStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GUnixOutputStream.html b/docs/reference/gio/html/GUnixOutputStream.html new file mode 100644 index 0000000..2a5da0e --- /dev/null +++ b/docs/reference/gio/html/GUnixOutputStream.html @@ -0,0 +1,257 @@ + + + + +GUnixOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GUnixOutputStream

+

GUnixOutputStream — Streaming output operations for Unix file descriptors

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GUnixOutputStream
+
+
+
+

Properties

+
+  "close-fd"                 gboolean              : Read / Write
+  "fd"                       gint                  : Read / Write / Construct Only
+
+
+
+

Description

+

+GUnixOutputStream implements GOutputStream for writing to a +unix file descriptor, including asynchronous operations. The file +descriptor must be selectable, so it doesn't work with opened files. +

+

+Note that <gio/gunixoutputstream.h> belongs +to the UNIX-specific GIO interfaces, thus you have to use the +gio-unix-2.0.pc pkg-config file when using it.

+
+
+

Details

+
+

GUnixOutputStream

+
typedef struct _GUnixOutputStream GUnixOutputStream;
+

+Implements GOutputStream for outputting to selectable unix file descriptors

+
+
+
+

g_unix_output_stream_new ()

+
GOutputStream *     g_unix_output_stream_new            (gint fd,
+                                                         gboolean close_fd);
+

+Creates a new GUnixOutputStream for the given fd. +

+

+If close_fd, is TRUE, the file descriptor will be closed when +the output stream is destroyed.

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

fd :

a UNIX file descriptor +

close_fd :

TRUE to close the file descriptor when done +

Returns :

a new GOutputStream +
+
+
+
+

g_unix_output_stream_set_close_fd ()

+
void                g_unix_output_stream_set_close_fd   (GUnixOutputStream *stream,
+                                                         gboolean close_fd);
+

+Sets whether the file descriptor of stream shall be closed +when the stream is closed.

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

stream :

a GUnixOutputStream +

close_fd :

TRUE to close the file descriptor when done +
+

Since 2.20

+
+
+
+

g_unix_output_stream_get_close_fd ()

+
gboolean            g_unix_output_stream_get_close_fd   (GUnixOutputStream *stream);
+

+Returns whether the file descriptor of stream will be +closed when the stream is closed.

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

stream :

a GUnixOutputStream +

Returns :

TRUE if the file descriptor is closed when done + +
+

Since 2.20

+
+
+
+

g_unix_output_stream_get_fd ()

+
gint                g_unix_output_stream_get_fd         (GUnixOutputStream *stream);
+

+Return the UNIX file descriptor that the stream writes to.

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

stream :

a GUnixOutputStream +

Returns :

The file descriptor of stream + +
+

Since 2.20

+
+
+
+

Property Details

+
+

The "close-fd" property

+
  "close-fd"                 gboolean              : Read / Write
+

+Whether to close the file descriptor when the stream is closed.

+

Default value: TRUE

+

Since 2.20

+
+
+
+

The "fd" property

+
  "fd"                       gint                  : Read / Write / Construct Only
+

+The file descriptor that the stream writes to.

+

Default value: -1

+

Since 2.20

+
+
+
+

See Also

+GOutputStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GUnixSocketAddress.html b/docs/reference/gio/html/GUnixSocketAddress.html new file mode 100644 index 0000000..361842b --- /dev/null +++ b/docs/reference/gio/html/GUnixSocketAddress.html @@ -0,0 +1,328 @@ + + + + +GUnixSocketAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GUnixSocketAddress

+

GUnixSocketAddress — UNIX GSocketAddress

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GSocketAddress
+         +----GUnixSocketAddress
+
+
+
+

Implemented Interfaces

+

+GUnixSocketAddress implements + GSocketConnectable.

+
+
+

Properties

+
+  "abstract"                 gboolean              : Read / Write / Construct Only
+  "path"                     gchar*                : Read / Write / Construct Only
+  "path-as-array"            GByteArray*           : Read / Write / Construct Only
+
+
+
+

Description

+

+Support for UNIX-domain (aka local) sockets.

+
+
+

Details

+
+

GUnixSocketAddress

+
typedef struct _GUnixSocketAddress GUnixSocketAddress;
+

+A UNIX-domain (local) socket address, corresponding to a +struct sockaddr_un.

+
+
+
+

g_unix_socket_address_new ()

+
GSocketAddress *    g_unix_socket_address_new           (const gchar *path);
+

+Creates a new GUnixSocketAddress for path. +

+

+To create abstract socket addresses, on systems that support that, +use g_unix_socket_address_new_abstract().

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

path :

the socket path +

Returns :

a new GUnixSocketAddress + +
+

Since 2.22

+
+
+
+

g_unix_socket_address_new_abstract ()

+
GSocketAddress *    g_unix_socket_address_new_abstract  (const gchar *path,
+                                                         int path_len);
+

+Creates a new abstract GUnixSocketAddress for path. +

+

+Unix domain sockets are generally visible in the filesystem. However, some +systems support abstract socket name which are not visible in the +filesystem and not affected by the filesystem permissions, visibility, etc. +

+

+Note that not all systems (really only Linux) support abstract +socket names, so if you use them on other systems function calls may +return G_IO_ERROR_NOT_SUPPORTED errors. You can use +g_unix_socket_address_abstract_names_supported() to see if abstract +names are supported. +

+

+If path_len is -1 then path is assumed to be a zero terminated +string (although in general abstract names need not be zero terminated +and can have embedded nuls). All bytes after path_len up to the max size +of an abstract unix domain name is filled with zero bytes.

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

path :

the abstract name +

path_len :

the length of path, or -1 +

Returns :

a new GUnixSocketAddress + +
+

Since 2.22

+
+
+
+

g_unix_socket_address_get_is_abstract ()

+
gboolean            g_unix_socket_address_get_is_abstract
+                                                        (GUnixSocketAddress *address);
+

+Gets address's path.

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

address :

a GInetSocketAddress +

Returns :

TRUE if the address is abstract, FALSE otherwise + +
+

Since 2.22

+
+
+
+

g_unix_socket_address_get_path ()

+
const char *        g_unix_socket_address_get_path      (GUnixSocketAddress *address);
+

+Gets address's path, or for abstract sockets the "name". +

+

+Guaranteed to be zero-terminated, but an abstract socket +may contain embedded zeros, and thus you should use +g_unix_socket_address_get_path_len() to get the true length +of this string.

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

address :

a GInetSocketAddress +

Returns :

the path for address + +
+

Since 2.22

+
+
+
+

g_unix_socket_address_get_path_len ()

+
gsize               g_unix_socket_address_get_path_len  (GUnixSocketAddress *address);
+

+Gets the length of address's path. +

+

+For details, see g_unix_socket_address_get_path().

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

address :

a GInetSocketAddress +

Returns :

the length of the path + +
+

Since 2.22

+
+
+
+

g_unix_socket_address_abstract_names_supported ()

+
gboolean            g_unix_socket_address_abstract_names_supported
+                                                        (void);
+

+Checks if abstract unix domain socket names are supported.

+
++ + + + +

Returns :

TRUE if supported, FALSE otherwise + +
+

Since 2.22

+
+
+
+

Property Details

+
+

The "abstract" property

+
  "abstract"                 gboolean              : Read / Write / Construct Only
+

Whether or not this is an abstract address.

+

Default value: FALSE

+
+
+
+

The "path" property

+
  "path"                     gchar*                : Read / Write / Construct Only
+

UNIX socket path.

+

Default value: NULL

+
+
+
+

The "path-as-array" property

+
  "path-as-array"            GByteArray*           : Read / Write / Construct Only
+

UNIX socket path, as byte array.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GVfs.html b/docs/reference/gio/html/GVfs.html new file mode 100644 index 0000000..e244822 --- /dev/null +++ b/docs/reference/gio/html/GVfs.html @@ -0,0 +1,294 @@ + + + + +GVfs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GVfs

+

GVfs — Virtual File System

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GVfs;
+#define             G_VFS_EXTENSION_POINT_NAME
+GFile *             g_vfs_get_file_for_path             (GVfs *vfs,
+                                                         const char *path);
+GFile *             g_vfs_get_file_for_uri              (GVfs *vfs,
+                                                         const char *uri);
+GFile *             g_vfs_parse_name                    (GVfs *vfs,
+                                                         const char *parse_name);
+GVfs *              g_vfs_get_default                   (void);
+GVfs *              g_vfs_get_local                     (void);
+gboolean            g_vfs_is_active                     (GVfs *vfs);
+const gchar* const * g_vfs_get_supported_uri_schemes    (GVfs *vfs);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GVfs
+
+
+
+

Description

+

+Entry point for using GIO functionality.

+
+
+

Details

+
+

GVfs

+
typedef struct _GVfs GVfs;
+

+Virtual File System object.

+
+
+
+

G_VFS_EXTENSION_POINT_NAME

+
#define G_VFS_EXTENSION_POINT_NAME "gio-vfs"
+
+

+Extension point for GVfs functionality. +See Extending GIO.

+
+
+
+

g_vfs_get_file_for_path ()

+
GFile *             g_vfs_get_file_for_path             (GVfs *vfs,
+                                                         const char *path);
+

+Gets a GFile for path.

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

vfs :

a GVfs. +

path :

a string containing a VFS path. +

Returns :

a GFile. + Free the returned object with g_object_unref(). +
+
+
+
+

g_vfs_get_file_for_uri ()

+
GFile *             g_vfs_get_file_for_uri              (GVfs *vfs,
+                                                         const char *uri);
+

+Gets a GFile for uri. +

+

+This operation never fails, but the returned object +might not support any I/O operation if the URI +is malformed or if the URI scheme is not supported.

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

vfs :

aGVfs. +

uri :

a string containing a URI +

Returns :

a GFile. + Free the returned object with g_object_unref(). +
+
+
+
+

g_vfs_parse_name ()

+
GFile *             g_vfs_parse_name                    (GVfs *vfs,
+                                                         const char *parse_name);
+

+This operation never fails, but the returned object might +not support any I/O operations if the parse_name cannot +be parsed by the GVfs module.

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

vfs :

a GVfs. +

parse_name :

a string to be parsed by the VFS module. +

Returns :

a GFile for the given parse_name. + Free the returned object with g_object_unref(). +
+
+
+
+

g_vfs_get_default ()

+
GVfs *              g_vfs_get_default                   (void);
+

+Gets the default GVfs for the system.

+
++ + + + +

Returns :

a GVfs. +
+
+
+
+

g_vfs_get_local ()

+
GVfs *              g_vfs_get_local                     (void);
+

+Gets the local GVfs for the system.

+
++ + + + +

Returns :

a GVfs. +
+
+
+
+

g_vfs_is_active ()

+
gboolean            g_vfs_is_active                     (GVfs *vfs);
+

+Checks if the VFS is active.

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

vfs :

a GVfs. +

Returns :

TRUE if construction of the vfs was successful and it is now active. +
+
+
+
+

g_vfs_get_supported_uri_schemes ()

+
const gchar* const * g_vfs_get_supported_uri_schemes    (GVfs *vfs);
+

+Gets a list of URI schemes supported by vfs.

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

vfs :

a GVfs. +

Returns :

a NULL-terminated array of strings. + The returned array belongs to GIO and must + not be freed or modified. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GVolume.html b/docs/reference/gio/html/GVolume.html new file mode 100644 index 0000000..8b169be --- /dev/null +++ b/docs/reference/gio/html/GVolume.html @@ -0,0 +1,1031 @@ + + + + +GVolume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GVolume

+

GVolume — Volume management

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GVolume;
+                    GVolumeIface;
+char *              g_volume_get_name                   (GVolume *volume);
+char *              g_volume_get_uuid                   (GVolume *volume);
+GIcon *             g_volume_get_icon                   (GVolume *volume);
+GDrive *            g_volume_get_drive                  (GVolume *volume);
+GMount *            g_volume_get_mount                  (GVolume *volume);
+gboolean            g_volume_can_mount                  (GVolume *volume);
+gboolean            g_volume_should_automount           (GVolume *volume);
+GFile *             g_volume_get_activation_root        (GVolume *volume);
+void                g_volume_mount                      (GVolume *volume,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_volume_mount_finish               (GVolume *volume,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+gboolean            g_volume_can_eject                  (GVolume *volume);
+void                g_volume_eject                      (GVolume *volume,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_volume_eject_finish               (GVolume *volume,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+void                g_volume_eject_with_operation       (GVolume *volume,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+gboolean            g_volume_eject_with_operation_finish
+                                                        (GVolume *volume,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+#define             G_VOLUME_IDENTIFIER_KIND_HAL_UDI
+#define             G_VOLUME_IDENTIFIER_KIND_LABEL
+#define             G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT
+#define             G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE
+#define             G_VOLUME_IDENTIFIER_KIND_UUID
+char **             g_volume_enumerate_identifiers      (GVolume *volume);
+char *              g_volume_get_identifier             (GVolume *volume,
+                                                         const char *kind);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GVolume
+
+
+
+

Prerequisites

+

+GVolume requires + GObject.

+
+
+

Signals

+
+  "changed"                                        : Run Last
+  "removed"                                        : Run Last
+
+
+
+

Description

+

+The GVolume interface represents user-visible objects that can be +mounted. Note, when porting from GnomeVFS, GVolume is the moral +equivalent of GnomeVFSDrive. +

+

+Mounting a GVolume instance is an asynchronous operation. For more +information about asynchronous operations, see GAsyncReady and +GSimpleAsyncReady. To mount a GVolume, first call +g_volume_mount() with (at least) the GVolume instance, optionally +a GMountOperation object and a GAsyncReadyCallback. +

+

+Typically, one will only want to pass NULL for the +GMountOperation if automounting all volumes when a desktop session +starts since it's not desirable to put up a lot of dialogs asking +for credentials. +

+

+The callback will be fired when the operation has resolved (either +with success or failure), and a GAsyncReady structure will be +passed to the callback. That callback should then call +g_volume_mount_finish() with the GVolume instance and the +GAsyncReady data to see if the operation was completed +successfully. If an error is present when g_volume_mount_finish() +is called, then it will be filled with any error information. +

+

+

+

+It is sometimes necessary to directly access the underlying +operating system object behind a volume (e.g. for passing a volume +to an application via the commandline). For this purpose, GIO +allows to obtain an 'identifier' for the volume. There can be +different kinds of identifiers, such as Hal UDIs, filesystem labels, +traditional Unix devices (e.g. /dev/sda2), +uuids. GIO uses predefind strings as names for the different kinds +of identifiers: G_VOLUME_IDENTIFIER_KIND_HAL_UDI, +G_VOLUME_IDENTIFIER_KIND_LABEL, etc. Use g_volume_get_identifier() +to obtain an identifier for a volume. +

+

+

+

+Note that G_VOLUME_IDENTIFIER_KIND_HAL_UDI will only be available +when the gvfs hal volume monitor is in use. Other volume monitors +will generally be able to provide the G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE +identifier, which can be used to obtain a hal device by means of +libhal_manger_find_device_string_match().

+
+
+

Details

+
+

GVolume

+
typedef struct _GVolume GVolume;
+

+Opaque mountable volume object.

+
+
+
+

GVolumeIface

+
typedef struct {
+  GTypeInterface g_iface;
+
+  /* signals */
+
+  void        (* changed)               (GVolume             *volume);
+  void        (* removed)               (GVolume             *volume);
+
+  /* Virtual Table */
+
+  char      * (* get_name)              (GVolume             *volume);
+  GIcon     * (* get_icon)              (GVolume             *volume);
+  char      * (* get_uuid)              (GVolume             *volume);
+  GDrive    * (* get_drive)             (GVolume             *volume);
+  GMount    * (* get_mount)             (GVolume             *volume);
+  gboolean    (* can_mount)             (GVolume             *volume);
+  gboolean    (* can_eject)             (GVolume             *volume);
+  void        (* mount_fn)              (GVolume             *volume,
+                                         GMountMountFlags     flags,
+                                         GMountOperation     *mount_operation,
+                                         GCancellable        *cancellable,
+                                         GAsyncReadyCallback  callback,
+                                         gpointer             user_data);
+  gboolean    (* mount_finish)          (GVolume             *volume,
+                                         GAsyncResult        *result,
+                                         GError             **error);
+  void        (* eject)                 (GVolume             *volume,
+                                         GMountUnmountFlags   flags,
+                                         GCancellable        *cancellable,
+                                         GAsyncReadyCallback  callback,
+                                         gpointer             user_data);
+  gboolean    (* eject_finish)          (GVolume             *volume,
+                                         GAsyncResult        *result,
+                                         GError             **error);
+
+  char      * (* get_identifier)        (GVolume             *volume,
+                                         const char          *kind);
+  char     ** (* enumerate_identifiers) (GVolume             *volume);
+
+  gboolean    (* should_automount)      (GVolume             *volume);
+
+  GFile     * (* get_activation_root)   (GVolume             *volume);
+
+  void        (* eject_with_operation)      (GVolume             *volume,
+                                             GMountUnmountFlags   flags,
+                                             GMountOperation     *mount_operation,
+                                             GCancellable        *cancellable,
+                                             GAsyncReadyCallback  callback,
+                                             gpointer             user_data);
+  gboolean    (* eject_with_operation_finish) (GVolume           *volume,
+                                             GAsyncResult        *result,
+                                             GError             **error);
+} GVolumeIface;
+
+

+Interface for implementing operations for mountable volumes.

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

GTypeInterface g_iface;

The parent interface. +

changed ()

Changed signal that is emitted when the volume's state has changed. +

removed ()

The removed signal that is emitted when the GVolume have been removed. If the recipient is holding references to the object they should release them so the object can be finalized. +

get_name ()

Gets a string containing the name of the GVolume. +

get_icon ()

Gets a GIcon for the GVolume. +

get_uuid ()

Gets the UUID for the GVolume. The reference is typically based on the file system UUID for the mount in question and should be considered an opaque string. Returns NULL if there is no UUID available. +

get_drive ()

Gets a GDrive the volume is located on. Returns NULL if the GVolume is not associated with a GDrive. +

get_mount ()

Gets a GMount representing the mounted volume. Returns NULL if the GVolume is not mounted. +

can_mount ()

Returns TRUE if the GVolume can be mounted. +

can_eject ()

Checks if a GVolume can be ejected. +

mount_fn ()

Mounts a given GVolume. + GVolume implementations must emit the "aborted" + signal before completing a mount operation that is aborted while + awaiting input from the user through a GMountOperation instance. +

mount_finish ()

Finishes a mount operation. +

eject ()

Ejects a given GVolume. +

eject_finish ()

Finishes an eject operation. +

get_identifier ()

Returns the identifier of the given kind, or NULL if + the GVolume doesn't have one. +

enumerate_identifiers ()

Returns an array strings listing the kinds + of identifiers which the GVolume has. +

should_automount ()

Returns TRUE if the GVolume should be automatically mounted. +

get_activation_root ()

Returns the activation root for the GVolume if it is known in advance or NULL if + it is not known. +

eject_with_operation ()

Starts ejecting a GVolume using a GMountOperation. Since 2.22. +

eject_with_operation_finish ()

Finishes an eject operation using a GMountOperation. Since 2.22. +
+
+
+
+

g_volume_get_name ()

+
char *              g_volume_get_name                   (GVolume *volume);
+

+Gets the name of volume.

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

volume :

a GVolume. +

Returns :

the name for the given volume. The returned string should +be freed with g_free() when no longer needed. +
+
+
+
+

g_volume_get_uuid ()

+
char *              g_volume_get_uuid                   (GVolume *volume);
+

+Gets the UUID for the volume. The reference is typically based on +the file system UUID for the volume in question and should be +considered an opaque string. Returns NULL if there is no UUID +available.

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

volume :

a GVolume. +

Returns :

the UUID for volume or NULL if no UUID can be computed. + The returned string should be freed with g_free() + when no longer needed. +
+
+
+
+

g_volume_get_icon ()

+
GIcon *             g_volume_get_icon                   (GVolume *volume);
+

+Gets the icon for volume.

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

volume :

a GVolume. +

Returns :

a GIcon. + The returned object should be unreffed with g_object_unref() + when no longer needed. +
+
+
+
+

g_volume_get_drive ()

+
GDrive *            g_volume_get_drive                  (GVolume *volume);
+

+Gets the drive for the volume.

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

volume :

a GVolume. +

Returns :

a GDrive or NULL if volume is not associated with a drive. + The returned object should be unreffed with g_object_unref() + when no longer needed. +
+
+
+
+

g_volume_get_mount ()

+
GMount *            g_volume_get_mount                  (GVolume *volume);
+

+Gets the mount for the volume.

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

volume :

a GVolume. +

Returns :

a GMount or NULL if volume isn't mounted. + The returned object should be unreffed with g_object_unref() + when no longer needed. +
+
+
+
+

g_volume_can_mount ()

+
gboolean            g_volume_can_mount                  (GVolume *volume);
+

+Checks if a volume can be mounted.

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

volume :

a GVolume. +

Returns :

TRUE if the volume can be mounted. FALSE otherwise. +
+
+
+
+

g_volume_should_automount ()

+
gboolean            g_volume_should_automount           (GVolume *volume);
+

+Returns whether the volume should be automatically mounted.

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

volume :

a GVolume +

Returns :

TRUE if the volume should be automatically mounted. +
+
+
+
+

g_volume_get_activation_root ()

+
GFile *             g_volume_get_activation_root        (GVolume *volume);
+

+Gets the activation root for a GVolume if it is known ahead of +mount time. Returns NULL otherwise. If not NULL and if volume +is mounted, then the result of g_mount_get_root() on the +GMount object obtained from g_volume_get_mount() will always +either be equal or a prefix of what this function returns. In +other words, in code +

+

+

+
+  GMount *mount;
+  GFile *mount_root
+  GFile *volume_activation_root;
+
+  mount = g_volume_get_mount (volume); /* mounted, so never NULL */
+  mount_root = g_mount_get_root (mount);
+  volume_activation_root = g_volume_get_activation_root(volume); /* assume not NULL */
+
+

+

+

+then the expression +

+

+

+
+  (g_file_has_prefix (volume_activation_root, mount_root) ||
+      g_file_equal (volume_activation_root, mount_root))
+
+

+

+

+will always be TRUE. +

+

+Activation roots are typically used in GVolumeMonitor +implementations to find the underlying mount to shadow, see +g_mount_is_shadowed() for more details.

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

volume :

a GVolume +

Returns :

the activation root of volume or NULL. Use +g_object_unref() to free. + +
+

Since 2.18

+
+
+
+

g_volume_mount ()

+
void                g_volume_mount                      (GVolume *volume,
+                                                         GMountMountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Mounts a volume. This is an asynchronous operation, and is +finished by calling g_volume_mount_finish() with the volume +and GAsyncResult returned in the callback.

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

volume :

a GVolume. +

flags :

flags affecting the operation +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data that gets passed to callback +
+
+
+
+

g_volume_mount_finish ()

+
gboolean            g_volume_mount_finish               (GVolume *volume,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes mounting a volume. If any errors occured during the operation, +error will be set to contain the errors and FALSE will be returned. +

+

+If the mount operation succeeded, g_volume_get_mount() on volume +is guaranteed to return the mount right after calling this +function; there's no need to listen for the 'mount-added' signal on +GVolumeMonitor.

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

volume :

a GVolume +

result :

a GAsyncResult +

error :

a GError location to store an error, or NULL to ignore +

Returns :

TRUE, FALSE if operation failed. +
+
+
+
+

g_volume_can_eject ()

+
gboolean            g_volume_can_eject                  (GVolume *volume);
+

+Checks if a volume can be ejected.

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

volume :

a GVolume. +

Returns :

TRUE if the volume can be ejected. FALSE otherwise. +
+
+
+
+

g_volume_eject ()

+
void                g_volume_eject                      (GVolume *volume,
+                                                         GMountUnmountFlags flags,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+
+

Warning

+

g_volume_eject has been deprecated since version 2.22 and should not be used in newly-written code. Use g_volume_eject_with_operation() instead.

+
+

+Ejects a volume. This is an asynchronous operation, and is +finished by calling g_volume_eject_finish() with the volume +and GAsyncResult returned in the callback.

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

volume :

a GVolume. +

flags :

flags affecting the unmount if required for eject +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data that gets passed to callback +
+
+
+
+

g_volume_eject_finish ()

+
gboolean            g_volume_eject_finish               (GVolume *volume,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+
+

Warning

+

g_volume_eject_finish has been deprecated since version 2.22 and should not be used in newly-written code. Use g_volume_eject_with_operation_finish() instead.

+
+

+Finishes ejecting a volume. If any errors occured during the operation, +error will be set to contain the errors and FALSE will be returned.

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

volume :

pointer to a GVolume. +

result :

a GAsyncResult. +

error :

a GError location to store an error, or NULL to ignore +

Returns :

TRUE, FALSE if operation failed. + +
+
+
+
+

g_volume_eject_with_operation ()

+
void                g_volume_eject_with_operation       (GVolume *volume,
+                                                         GMountUnmountFlags flags,
+                                                         GMountOperation *mount_operation,
+                                                         GCancellable *cancellable,
+                                                         GAsyncReadyCallback callback,
+                                                         gpointer user_data);
+

+Ejects a volume. This is an asynchronous operation, and is +finished by calling g_volume_eject_with_operation_finish() with the volume +and GAsyncResult data returned in the callback.

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

volume :

a GVolume. +

flags :

flags affecting the unmount if required for eject +

mount_operation :

a GMountOperation or NULL to avoid user interaction. +

cancellable :

optional GCancellable object, NULL to ignore. +

callback :

a GAsyncReadyCallback, or NULL. +

user_data :

user data passed to callback. +
+

Since 2.22

+
+
+
+

g_volume_eject_with_operation_finish ()

+
gboolean            g_volume_eject_with_operation_finish
+                                                        (GVolume *volume,
+                                                         GAsyncResult *result,
+                                                         GError **error);
+

+Finishes ejecting a volume. If any errors occurred during the operation, +error will be set to contain the errors and FALSE will be returned.

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

volume :

a GVolume. +

result :

a GAsyncResult. +

error :

a GError location to store the error occuring, or NULL to + ignore. +

Returns :

TRUE if the volume was successfully ejected. FALSE otherwise. + +
+

Since 2.22

+
+
+
+

G_VOLUME_IDENTIFIER_KIND_HAL_UDI

+
#define G_VOLUME_IDENTIFIER_KIND_HAL_UDI "hal-udi"
+
+

+The string used to obtain a Hal UDI with g_volume_get_identifier().

+
+
+
+

G_VOLUME_IDENTIFIER_KIND_LABEL

+
#define G_VOLUME_IDENTIFIER_KIND_LABEL "label"
+
+

+The string used to obtain a filesystem label with g_volume_get_identifier().

+
+
+
+

G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT

+
#define G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT "nfs-mount"
+
+

+The string used to obtain a NFS mount with g_volume_get_identifier().

+
+
+
+

G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE

+
#define G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE "unix-device"
+
+

+The string used to obtain a Unix device path with g_volume_get_identifier().

+
+
+
+

G_VOLUME_IDENTIFIER_KIND_UUID

+
#define G_VOLUME_IDENTIFIER_KIND_UUID "uuid"
+
+

+The string used to obtain a UUID with g_volume_get_identifier().

+
+
+
+

g_volume_enumerate_identifiers ()

+
char **             g_volume_enumerate_identifiers      (GVolume *volume);
+

+Gets the kinds of identifiers +that volume has. Use g_volume_get_identifer() to obtain +the identifiers themselves.

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

volume :

a GVolume +

Returns :

a NULL-terminated array of strings containing + kinds of identifiers. Use g_strfreev() to free. +
+
+
+
+

g_volume_get_identifier ()

+
char *              g_volume_get_identifier             (GVolume *volume,
+                                                         const char *kind);
+

+Gets the identifier of the given kind for volume. +See the introduction +for more information about volume identifiers.

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

volume :

a GVolume +

kind :

the kind of identifier to return +

Returns :

a newly allocated string containing the + requested identfier, or NULL if the GVolume + doesn't have this kind of identifier +
+
+
+
+

Signal Details

+
+

The "changed" signal

+
void                user_function                      (GVolume *arg0,
+                                                        gpointer user_data)      : Run Last
+

+Emitted when the volume has been changed.

+
++ + + + +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "removed" signal

+
void                user_function                      (GVolume *arg0,
+                                                        gpointer user_data)      : Run Last
+

+This signal is emitted when the GVolume have been removed. If +the recipient is holding references to the object they should +release them so the object can be finalized.

+
++ + + + +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GVolumeMonitor.html b/docs/reference/gio/html/GVolumeMonitor.html new file mode 100644 index 0000000..9af6a87 --- /dev/null +++ b/docs/reference/gio/html/GVolumeMonitor.html @@ -0,0 +1,717 @@ + + + + +GVolumeMonitor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GVolumeMonitor

+

GVolumeMonitor — Volume Monitor

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GVolumeMonitor
+
+
+
+

Signals

+
+  "drive-changed"                                  : Run Last
+  "drive-connected"                                : Run Last
+  "drive-disconnected"                             : Run Last
+  "drive-eject-button"                             : Run Last
+  "drive-stop-button"                              : Run Last
+  "mount-added"                                    : Run Last
+  "mount-changed"                                  : Run Last
+  "mount-pre-unmount"                              : Run Last
+  "mount-removed"                                  : Run Last
+  "volume-added"                                   : Run Last
+  "volume-changed"                                 : Run Last
+  "volume-removed"                                 : Run Last
+
+
+
+

Description

+

+GVolumeMonitor is for listing the user interesting devices and volumes +on the computer. In other words, what a file selector or file manager +would show in a sidebar. +

+

+GVolumeMonitor is not thread-default-context +aware, and so should not be used other than from the main +thread, with no thread-default-context active.

+
+
+

Details

+
+

GVolumeMonitor

+
typedef struct _GVolumeMonitor GVolumeMonitor;
+

+A Volume Monitor that watches for volume events.

+
++ +
+
+
+
+

G_VOLUME_MONITOR_EXTENSION_POINT_NAME

+
#define G_VOLUME_MONITOR_EXTENSION_POINT_NAME "gio-volume-monitor"
+
+

+Extension point for volume monitor functionality. +See Extending GIO.

+
+
+
+

g_volume_monitor_get ()

+
GVolumeMonitor *    g_volume_monitor_get                (void);
+

+Gets the volume monitor used by gio.

+
++ + + + +

Returns :

a reference to the GVolumeMonitor used by gio. Call + g_object_unref() when done with it. +
+
+
+
+

g_volume_monitor_get_connected_drives ()

+
GList *             g_volume_monitor_get_connected_drives
+                                                        (GVolumeMonitor *volume_monitor);
+

+Gets a list of drives connected to the system. +

+

+The returned list should be freed with g_list_free(), after +its elements have been unreffed with g_object_unref().

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

volume_monitor :

a GVolumeMonitor. +

Returns :

a GList of connected GDrive objects. +
+
+
+
+

g_volume_monitor_get_volumes ()

+
GList *             g_volume_monitor_get_volumes        (GVolumeMonitor *volume_monitor);
+

+Gets a list of the volumes on the system. +

+

+The returned list should be freed with g_list_free(), after +its elements have been unreffed with g_object_unref().

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

volume_monitor :

a GVolumeMonitor. +

Returns :

a GList of GVolume objects. +
+
+
+
+

g_volume_monitor_get_mounts ()

+
GList *             g_volume_monitor_get_mounts         (GVolumeMonitor *volume_monitor);
+

+Gets a list of the mounts on the system. +

+

+The returned list should be freed with g_list_free(), after +its elements have been unreffed with g_object_unref().

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

volume_monitor :

a GVolumeMonitor. +

Returns :

a GList of GMount objects. +
+
+
+
+

g_volume_monitor_adopt_orphan_mount ()

+
GVolume *           g_volume_monitor_adopt_orphan_mount (GMount *mount);
+
+

Warning

+

g_volume_monitor_adopt_orphan_mount has been deprecated since version 2.20 and should not be used in newly-written code. Instead of using this function, GVolumeMonitor +implementations should instead create shadow mounts with the URI of +the mount they intend to adopt. See the proxy volume monitor in +gvfs for an example of this. Also see g_mount_is_shadowed(), +g_mount_shadow() and g_mount_unshadow() functions.

+
+

+This function should be called by any GVolumeMonitor +implementation when a new GMount object is created that is not +associated with a GVolume object. It must be called just before +emitting the mount_added signal. +

+

+If the return value is not NULL, the caller must associate the +returned GVolume object with the GMount. This involves returning +it in its g_mount_get_volume() implementation. The caller must +also listen for the "removed" signal on the returned object +and give up its reference when handling that signal +

+

+Similary, if implementing g_volume_monitor_adopt_orphan_mount(), +the implementor must take a reference to mount and return it in +its g_volume_get_mount() implemented. Also, the implementor must +listen for the "unmounted" signal on mount and give up its +reference upon handling that signal. +

+

+There are two main use cases for this function. +

+

+One is when implementing a user space file system driver that reads +blocks of a block device that is already represented by the native +volume monitor (for example a CD Audio file system driver). Such +a driver will generate its own GMount object that needs to be +assoicated with the GVolume object that represents the volume. +

+

+The other is for implementing a GVolumeMonitor whose sole purpose +is to return GVolume objects representing entries in the users +"favorite servers" list or similar.

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

mount :

a GMount object to find a parent for +

Returns :

the GVolume object that is the parent for mount or NULL +if no wants to adopt the GMount. + +
+
+
+
+

g_volume_monitor_get_mount_for_uuid ()

+
GMount *            g_volume_monitor_get_mount_for_uuid (GVolumeMonitor *volume_monitor,
+                                                         const char *uuid);
+

+Finds a GMount object by its UUID (see g_mount_get_uuid())

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

volume_monitor :

a GVolumeMonitor. +

uuid :

the UUID to look for +

Returns :

a GMount or NULL if no such mount is available. + Free the returned object with g_object_unref(). +
+
+
+
+

g_volume_monitor_get_volume_for_uuid ()

+
GVolume *           g_volume_monitor_get_volume_for_uuid
+                                                        (GVolumeMonitor *volume_monitor,
+                                                         const char *uuid);
+

+Finds a GVolume object by its UUID (see g_volume_get_uuid())

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

volume_monitor :

a GVolumeMonitor. +

uuid :

the UUID to look for +

Returns :

a GVolume or NULL if no such volume is available. + Free the returned object with g_object_unref(). +
+
+
+
+

Signal Details

+
+

The "drive-changed" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GDrive         *drive,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a drive changes.

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

volume_monitor :

The volume monitor emitting the signal. +

drive :

the drive that changed +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "drive-connected" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GDrive         *drive,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a drive is connected to the system.

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

volume_monitor :

The volume monitor emitting the signal. +

drive :

a GDrive that was connected. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "drive-disconnected" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GDrive         *drive,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a drive is disconnected from the system.

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

volume_monitor :

The volume monitor emitting the signal. +

drive :

a GDrive that was disconnected. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "drive-eject-button" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GDrive         *drive,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when the eject button is pressed on drive.

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

volume_monitor :

The volume monitor emitting the signal. +

drive :

the drive where the eject button was pressed +

user_data :

user data set when the signal handler was connected.
+

Since 2.18

+
+
+
+

The "drive-stop-button" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GDrive         *drive,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when the stop button is pressed on drive.

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

volume_monitor :

The volume monitor emitting the signal. +

drive :

the drive where the stop button was pressed +

user_data :

user data set when the signal handler was connected.
+

Since 2.22

+
+
+
+

The "mount-added" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GMount         *mount,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a mount is added.

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

volume_monitor :

The volume monitor emitting the signal. +

mount :

a GMount that was added. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "mount-changed" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GMount         *mount,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a mount changes.

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

volume_monitor :

The volume monitor emitting the signal. +

mount :

a GMount that changed. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "mount-pre-unmount" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GMount         *mount,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a mount is about to be removed.

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

volume_monitor :

The volume monitor emitting the signal. +

mount :

a GMount that is being unmounted. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "mount-removed" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GMount         *mount,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a mount is removed.

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

volume_monitor :

The volume monitor emitting the signal. +

mount :

a GMount that was removed. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "volume-added" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GVolume        *volume,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a mountable volume is added to the system.

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

volume_monitor :

The volume monitor emitting the signal. +

volume :

a GVolume that was added. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "volume-changed" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GVolume        *volume,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when mountable volume is changed.

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

volume_monitor :

The volume monitor emitting the signal. +

volume :

a GVolume that changed. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "volume-removed" signal

+
void                user_function                      (GVolumeMonitor *volume_monitor,
+                                                        GVolume        *volume,
+                                                        gpointer        user_data)           : Run Last
+

+Emitted when a mountable volume is removed from the system.

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

volume_monitor :

The volume monitor emitting the signal. +

volume :

a GVolume that was removed. +

user_data :

user data set when the signal handler was connected.
+
+
+
+

See Also

+GFileMonitor +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GZlibCompressor.html b/docs/reference/gio/html/GZlibCompressor.html new file mode 100644 index 0000000..db24493 --- /dev/null +++ b/docs/reference/gio/html/GZlibCompressor.html @@ -0,0 +1,206 @@ + + + + +GZlibCompressor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GZlibCompressor

+

GZlibCompressor — Zlib compressor

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GZlibCompressor;
+enum                GZlibCompressorFormat;
+GZlibCompressor *   g_zlib_compressor_new               (GZlibCompressorFormat format,
+                                                         int level);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GZlibCompressor
+
+
+
+

Implemented Interfaces

+

+GZlibCompressor implements + GConverter.

+
+
+

Properties

+
+  "format"                   GZlibCompressorFormat  : Read / Write / Construct Only
+  "level"                    gint                  : Read / Write / Construct Only
+
+
+
+

Description

+

+GZlibCompressor is an implementation of GConverter that +compresses data using zlib.

+
+
+

Details

+
+

GZlibCompressor

+
typedef struct _GZlibCompressor GZlibCompressor;
+

+Zlib decompression

+
+
+
+

enum GZlibCompressorFormat

+
typedef enum {
+  G_ZLIB_COMPRESSOR_FORMAT_ZLIB,
+  G_ZLIB_COMPRESSOR_FORMAT_GZIP,
+  G_ZLIB_COMPRESSOR_FORMAT_RAW
+} GZlibCompressorFormat;
+
+

+Used to select the type of data format to use for GZlibDecompressor +and GZlibCompressor.

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

G_ZLIB_COMPRESSOR_FORMAT_ZLIB

deflate compression with zlib header +

G_ZLIB_COMPRESSOR_FORMAT_GZIP

gzip file format +

G_ZLIB_COMPRESSOR_FORMAT_RAW

deflate compression with no header +
+

Since 2.24

+
+
+
+

g_zlib_compressor_new ()

+
GZlibCompressor *   g_zlib_compressor_new               (GZlibCompressorFormat format,
+                                                         int level);
+

+Creates a new GZlibCompressor.

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

format :

The format to use for the compressed data +

level :

compression level (0-9), -1 for default +

Returns :

a new GZlibCompressor + +
+

Since 2.24

+
+
+
+

Property Details

+
+

The "format" property

+
  "format"                   GZlibCompressorFormat  : Read / Write / Construct Only
+

The format of the compressed data.

+

Default value: G_ZLIB_COMPRESSOR_FORMAT_ZLIB

+
+
+
+

The "level" property

+
  "level"                    gint                  : Read / Write / Construct Only
+

The level of compression from 0 (no compression) to 9 (most compression), -1 for the default level.

+

Allowed values: [G_MAXULONG,9]

+

Default value: -1

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/GZlibDecompressor.html b/docs/reference/gio/html/GZlibDecompressor.html new file mode 100644 index 0000000..12bcc9a --- /dev/null +++ b/docs/reference/gio/html/GZlibDecompressor.html @@ -0,0 +1,155 @@ + + + + +GZlibDecompressor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GZlibDecompressor

+

GZlibDecompressor — Zlib decompressor

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GZlibDecompressor;
+GZlibDecompressor * g_zlib_decompressor_new             (GZlibCompressorFormat format);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GZlibDecompressor
+
+
+
+

Implemented Interfaces

+

+GZlibDecompressor implements + GConverter.

+
+
+

Properties

+
+  "format"                   GZlibCompressorFormat  : Read / Write / Construct Only
+
+
+
+

Description

+

+GZlibDecompressor is an implementation of GConverter that +decompresses data compressed with zlib.

+
+
+

Details

+
+

GZlibDecompressor

+
typedef struct _GZlibDecompressor GZlibDecompressor;
+

+Zlib decompression

+
+
+
+

g_zlib_decompressor_new ()

+
GZlibDecompressor * g_zlib_decompressor_new             (GZlibCompressorFormat format);
+

+Creates a new GZlibDecompressor.

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

format :

The format to use for the compressed data +

Returns :

a new GZlibDecompressor + +
+

Since 2.24

+
+
+
+

Property Details

+
+

The "format" property

+
  "format"                   GZlibCompressorFormat  : Read / Write / Construct Only
+

The format of the compressed data.

+

Default value: G_ZLIB_COMPRESSOR_FORMAT_ZLIB

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/api-index-2-18.html b/docs/reference/gio/html/api-index-2-18.html new file mode 100644 index 0000000..2eada71 --- /dev/null +++ b/docs/reference/gio/html/api-index-2-18.html @@ -0,0 +1,135 @@ + + + + +Index of new symbols in 2.18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gio/html/api-index-2-20.html b/docs/reference/gio/html/api-index-2-20.html new file mode 100644 index 0000000..3893831 --- /dev/null +++ b/docs/reference/gio/html/api-index-2-20.html @@ -0,0 +1,133 @@ + + + + +Index of new symbols in 2.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gio/html/api-index-2-22.html b/docs/reference/gio/html/api-index-2-22.html new file mode 100644 index 0000000..b144821 --- /dev/null +++ b/docs/reference/gio/html/api-index-2-22.html @@ -0,0 +1,610 @@ + + + + +Index of new symbols in 2.22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.22

+

A

+
GAsyncInitable
+
+
GAsyncInitableIface
+
+
g_async_initable_init_async
+
+
g_async_initable_init_finish
+
+
g_async_initable_newv_async
+
+
g_async_initable_new_async
+
+
g_async_initable_new_finish
+
+
g_async_initable_new_valist_async
+
+

C

+
g_cancellable_connect
+
+
g_cancellable_disconnect
+
+
g_cancellable_make_pollfd
+
+
g_cancellable_release_fd
+
+

D

+
GDrive::stop-button
+
+
GDriveStartFlags
+
+
GDriveStartStopType
+
+
g_drive_can_start
+
+
g_drive_can_start_degraded
+
+
g_drive_can_stop
+
+
g_drive_eject_with_operation
+
+
g_drive_eject_with_operation_finish
+
+
g_drive_get_start_stop_type
+
+
g_drive_start
+
+
g_drive_start_finish
+
+
g_drive_stop
+
+
g_drive_stop_finish
+
+

F

+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE
+
+
g_file_create_readwrite
+
+
g_file_create_readwrite_async
+
+
g_file_create_readwrite_finish
+
+
g_file_eject_mountable_with_operation
+
+
g_file_eject_mountable_with_operation_finish
+
+
g_file_info_get_attribute_stringv
+
+
g_file_info_has_namespace
+
+
g_file_info_set_attribute_status
+
+
g_file_io_stream_get_etag
+
+
g_file_io_stream_query_info
+
+
g_file_io_stream_query_info_async
+
+
g_file_io_stream_query_info_finish
+
+
g_file_open_readwrite
+
+
g_file_open_readwrite_async
+
+
g_file_open_readwrite_finish
+
+
g_file_poll_mountable
+
+
g_file_poll_mountable_finish
+
+
g_file_replace_readwrite
+
+
g_file_replace_readwrite_async
+
+
g_file_replace_readwrite_finish
+
+
g_file_start_mountable
+
+
g_file_start_mountable_finish
+
+
g_file_stop_mountable
+
+
g_file_stop_mountable_finish
+
+
g_file_supports_thread_contexts
+
+
g_file_unmount_mountable_with_operation
+
+
g_file_unmount_mountable_with_operation_finish
+
+

I

+
GInetAddress:is-any
+
+
GInetAddress:is-link-local
+
+
GInetAddress:is-loopback
+
+
GInetAddress:is-mc-global
+
+
GInetAddress:is-mc-link-local
+
+
GInetAddress:is-mc-node-local
+
+
GInetAddress:is-mc-org-local
+
+
GInetAddress:is-mc-site-local
+
+
GInetAddress:is-multicast
+
+
GInetAddress:is-site-local
+
+
g_inet_address_get_family
+
+
g_inet_address_get_is_any
+
+
g_inet_address_get_is_link_local
+
+
g_inet_address_get_is_loopback
+
+
g_inet_address_get_is_mc_global
+
+
g_inet_address_get_is_mc_link_local
+
+
g_inet_address_get_is_mc_node_local
+
+
g_inet_address_get_is_mc_org_local
+
+
g_inet_address_get_is_mc_site_local
+
+
g_inet_address_get_is_multicast
+
+
g_inet_address_get_is_site_local
+
+
g_inet_address_get_native_size
+
+
g_inet_address_new_any
+
+
g_inet_address_new_from_bytes
+
+
g_inet_address_new_from_string
+
+
g_inet_address_new_loopback
+
+
g_inet_address_to_bytes
+
+
g_inet_address_to_string
+
+
g_inet_socket_address_get_address
+
+
g_inet_socket_address_get_port
+
+
g_inet_socket_address_new
+
+
GInitable
+
+
GInitableIface
+
+
g_initable_init
+
+
g_initable_new
+
+
g_initable_newv
+
+
g_initable_new_valist
+
+
GInputVector
+
+
g_io_stream_clear_pending
+
+
g_io_stream_close
+
+
g_io_stream_close_async
+
+
g_io_stream_close_finish
+
+
g_io_stream_get_input_stream
+
+
g_io_stream_get_output_stream
+
+
g_io_stream_has_pending
+
+
g_io_stream_is_closed
+
+
g_io_stream_set_pending
+
+

M

+
GMount::pre-unmount
+
+
GMountOperation::show-processes
+
+
g_mount_eject_with_operation
+
+
g_mount_eject_with_operation_finish
+
+
g_mount_unmount_with_operation
+
+
g_mount_unmount_with_operation_finish
+
+

N

+
g_network_address_get_hostname
+
+
g_network_address_get_port
+
+
g_network_address_new
+
+
g_network_address_parse
+
+
g_network_service_get_domain
+
+
g_network_service_get_protocol
+
+
g_network_service_get_service
+
+
g_network_service_new
+
+

O

+
GOutputVector
+
+

R

+
GResolverError
+
+
g_resolver_free_addresses
+
+
g_resolver_free_targets
+
+
g_resolver_get_default
+
+
g_resolver_lookup_by_address
+
+
g_resolver_lookup_by_address_async
+
+
g_resolver_lookup_by_address_finish
+
+
g_resolver_lookup_by_name
+
+
g_resolver_lookup_by_name_async
+
+
g_resolver_lookup_by_name_finish
+
+
g_resolver_lookup_service
+
+
g_resolver_lookup_service_async
+
+
g_resolver_lookup_service_finish
+
+
g_resolver_set_default
+
+

S

+
GSocket
+
+
GSocketClient
+
+
GSocketConnection
+
+
GSocketFamily
+
+
GSocketMsgFlags
+
+
GSocketProtocol
+
+
GSocketService
+
+
GSocketService::incoming
+
+
GSocketSourceFunc
+
+
GSocketType
+
+
g_socket_accept
+
+
g_socket_address_get_family
+
+
g_socket_address_get_native_size
+
+
g_socket_address_new_from_native
+
+
g_socket_address_to_native
+
+
g_socket_bind
+
+
g_socket_check_connect_result
+
+
g_socket_client_connect
+
+
g_socket_client_connect_async
+
+
g_socket_client_connect_finish
+
+
g_socket_client_connect_to_host
+
+
g_socket_client_connect_to_host_async
+
+
g_socket_client_connect_to_host_finish
+
+
g_socket_client_connect_to_service_async
+
+
g_socket_client_connect_to_service_finish
+
+
g_socket_client_get_family
+
+
g_socket_client_get_local_address
+
+
g_socket_client_get_protocol
+
+
g_socket_client_get_socket_type
+
+
g_socket_client_new
+
+
g_socket_client_set_family
+
+
g_socket_client_set_local_address
+
+
g_socket_client_set_protocol
+
+
g_socket_client_set_socket_type
+
+
g_socket_close
+
+
g_socket_condition_check
+
+
g_socket_condition_wait
+
+
g_socket_connect
+
+
g_socket_connectable_enumerate
+
+
g_socket_connection_factory_create_connection
+
+
g_socket_connection_factory_lookup_type
+
+
g_socket_connection_factory_register_type
+
+
g_socket_connection_get_local_address
+
+
g_socket_connection_get_remote_address
+
+
g_socket_connection_get_socket
+
+
g_socket_control_message_deserialize
+
+
g_socket_control_message_get_level
+
+
g_socket_control_message_get_msg_type
+
+
g_socket_control_message_get_size
+
+
g_socket_control_message_serialize
+
+
g_socket_create_source
+
+
g_socket_get_blocking
+
+
g_socket_get_family
+
+
g_socket_get_fd
+
+
g_socket_get_keepalive
+
+
g_socket_get_listen_backlog
+
+
g_socket_get_local_address
+
+
g_socket_get_protocol
+
+
g_socket_get_remote_address
+
+
g_socket_get_socket_type
+
+
g_socket_is_closed
+
+
g_socket_is_connected
+
+
g_socket_listen
+
+
g_socket_listener_accept
+
+
g_socket_listener_accept_async
+
+
g_socket_listener_accept_finish
+
+
g_socket_listener_accept_socket
+
+
g_socket_listener_accept_socket_async
+
+
g_socket_listener_accept_socket_finish
+
+
g_socket_listener_add_address
+
+
g_socket_listener_add_inet_port
+
+
g_socket_listener_add_socket
+
+
g_socket_listener_close
+
+
g_socket_listener_new
+
+
g_socket_listener_set_backlog
+
+
g_socket_new
+
+
g_socket_new_from_fd
+
+
g_socket_receive
+
+
g_socket_receive_from
+
+
g_socket_receive_message
+
+
g_socket_send
+
+
g_socket_send_message
+
+
g_socket_send_to
+
+
g_socket_service_is_active
+
+
g_socket_service_new
+
+
g_socket_service_start
+
+
g_socket_service_stop
+
+
g_socket_set_blocking
+
+
g_socket_set_keepalive
+
+
g_socket_set_listen_backlog
+
+
g_socket_shutdown
+
+
g_socket_speaks_ipv4
+
+
g_srv_target_copy
+
+
g_srv_target_free
+
+
g_srv_target_get_hostname
+
+
g_srv_target_get_port
+
+
g_srv_target_get_priority
+
+
g_srv_target_get_weight
+
+
g_srv_target_list_sort
+
+
g_srv_target_new
+
+

T

+
GTcpConnection
+
+
g_tcp_connection_get_graceful_disconnect
+
+
g_tcp_connection_set_graceful_disconnect
+
+
GThreadedSocketService
+
+
g_threaded_socket_service_new
+
+

U

+
g_unix_connection_receive_fd
+
+
g_unix_connection_send_fd
+
+
g_unix_fd_message_append_fd
+
+
g_unix_fd_message_new
+
+
g_unix_fd_message_steal_fds
+
+
g_unix_socket_address_abstract_names_supported
+
+
g_unix_socket_address_get_is_abstract
+
+
g_unix_socket_address_get_path
+
+
g_unix_socket_address_get_path_len
+
+
g_unix_socket_address_new
+
+
g_unix_socket_address_new_abstract
+
+

V

+
GVolumeMonitor::drive-stop-button
+
+
g_volume_eject_with_operation
+
+
g_volume_eject_with_operation_finish
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/api-index-2-24.html b/docs/reference/gio/html/api-index-2-24.html new file mode 100644 index 0000000..711f01e --- /dev/null +++ b/docs/reference/gio/html/api-index-2-24.html @@ -0,0 +1,164 @@ + + + + +Index of new symbols in 2.24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gio/html/api-index-deprecated.html b/docs/reference/gio/html/api-index-deprecated.html new file mode 100644 index 0000000..15aa7ae --- /dev/null +++ b/docs/reference/gio/html/api-index-deprecated.html @@ -0,0 +1,101 @@ + + + + +Index of deprecated symbols + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gio/html/api-index-full.html b/docs/reference/gio/html/api-index-full.html new file mode 100644 index 0000000..b26e885 --- /dev/null +++ b/docs/reference/gio/html/api-index-full.html @@ -0,0 +1,2323 @@ + + + + +Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index

+

A

+
GAppInfo
+
+
GAppInfoCreateFlags
+
+
GAppInfoIface
+
+
GAppLaunchContext
+
+
g_app_info_add_supports_type
+
+
g_app_info_can_delete
+
+
g_app_info_can_remove_supports_type
+
+
g_app_info_create_from_commandline
+
+
g_app_info_delete
+
+
g_app_info_dup
+
+
g_app_info_equal
+
+
g_app_info_get_all
+
+
g_app_info_get_all_for_type
+
+
g_app_info_get_commandline
+
+
g_app_info_get_default_for_type
+
+
g_app_info_get_default_for_uri_scheme
+
+
g_app_info_get_description
+
+
g_app_info_get_display_name
+
+
g_app_info_get_executable
+
+
g_app_info_get_icon
+
+
g_app_info_get_id
+
+
g_app_info_get_name
+
+
g_app_info_launch
+
+
g_app_info_launch_default_for_uri
+
+
g_app_info_launch_uris
+
+
g_app_info_remove_supports_type
+
+
g_app_info_reset_type_associations
+
+
g_app_info_set_as_default_for_extension
+
+
g_app_info_set_as_default_for_type
+
+
g_app_info_should_show
+
+
g_app_info_supports_files
+
+
g_app_info_supports_uris
+
+
g_app_launch_context_get_display
+
+
g_app_launch_context_get_startup_notify_id
+
+
g_app_launch_context_launch_failed
+
+
g_app_launch_context_new
+
+
GAskPasswordFlags
+
+
GAsyncInitable
+
+
GAsyncInitableIface
+
+
GAsyncReadyCallback
+
+
GAsyncResult
+
+
GAsyncResultIface
+
+
g_async_initable_init_async
+
+
g_async_initable_init_finish
+
+
g_async_initable_newv_async
+
+
g_async_initable_new_async
+
+
g_async_initable_new_finish
+
+
g_async_initable_new_valist_async
+
+
g_async_result_get_source_object
+
+
g_async_result_get_user_data
+
+

B

+
GBufferedInputStream
+
+
GBufferedInputStream:buffer-size
+
+
GBufferedOutputStream
+
+
GBufferedOutputStream:auto-grow
+
+
GBufferedOutputStream:buffer-size
+
+
g_buffered_input_stream_fill
+
+
g_buffered_input_stream_fill_async
+
+
g_buffered_input_stream_fill_finish
+
+
g_buffered_input_stream_get_available
+
+
g_buffered_input_stream_get_buffer_size
+
+
g_buffered_input_stream_new
+
+
g_buffered_input_stream_new_sized
+
+
g_buffered_input_stream_peek
+
+
g_buffered_input_stream_peek_buffer
+
+
g_buffered_input_stream_read_byte
+
+
g_buffered_input_stream_set_buffer_size
+
+
g_buffered_output_stream_get_auto_grow
+
+
g_buffered_output_stream_get_buffer_size
+
+
g_buffered_output_stream_new
+
+
g_buffered_output_stream_new_sized
+
+
g_buffered_output_stream_set_auto_grow
+
+
g_buffered_output_stream_set_buffer_size
+
+

C

+
GCancellable
+
+
GCancellable::cancelled
+
+
g_cancellable_cancel
+
+
g_cancellable_connect
+
+
g_cancellable_disconnect
+
+
g_cancellable_get_current
+
+
g_cancellable_get_fd
+
+
g_cancellable_is_cancelled
+
+
g_cancellable_make_pollfd
+
+
g_cancellable_new
+
+
g_cancellable_pop_current
+
+
g_cancellable_push_current
+
+
g_cancellable_release_fd
+
+
g_cancellable_reset
+
+
g_cancellable_set_error_if_cancelled
+
+
GCharsetConverter
+
+
GCharsetConverter:from-charset
+
+
GCharsetConverter:to-charset
+
+
GCharsetConverter:use-fallback
+
+
g_charset_converter_get_num_fallbacks
+
+
g_charset_converter_get_use_fallback
+
+
g_charset_converter_new
+
+
g_charset_converter_set_use_fallback
+
+
g_content_types_get_registered
+
+
g_content_type_can_be_executable
+
+
g_content_type_equals
+
+
g_content_type_from_mime_type
+
+
g_content_type_get_description
+
+
g_content_type_get_icon
+
+
g_content_type_get_mime_type
+
+
g_content_type_guess
+
+
g_content_type_guess_for_tree
+
+
g_content_type_is_a
+
+
g_content_type_is_unknown
+
+
GConverter
+
+
GConverterIface
+
+
GConverterInputStream
+
+
GConverterInputStream:converter
+
+
GConverterOutputStream
+
+
GConverterOutputStream:converter
+
+
GConverterResult
+
+
g_converter_convert
+
+
g_converter_input_stream_get_converter
+
+
g_converter_input_stream_new
+
+
g_converter_output_stream_get_converter
+
+
g_converter_output_stream_new
+
+
g_converter_reset
+
+

D

+
GDataInputStream
+
+
GDataInputStream:byte-order
+
+
GDataInputStream:newline-type
+
+
GDataOutputStream
+
+
GDataOutputStream:byte-order
+
+
GDataStreamByteOrder
+
+
GDataStreamNewlineType
+
+
g_data_input_stream_get_byte_order
+
+
g_data_input_stream_get_newline_type
+
+
g_data_input_stream_new
+
+
g_data_input_stream_read_byte
+
+
g_data_input_stream_read_int16
+
+
g_data_input_stream_read_int32
+
+
g_data_input_stream_read_int64
+
+
g_data_input_stream_read_line
+
+
g_data_input_stream_read_line_async
+
+
g_data_input_stream_read_line_finish
+
+
g_data_input_stream_read_uint16
+
+
g_data_input_stream_read_uint32
+
+
g_data_input_stream_read_uint64
+
+
g_data_input_stream_read_until
+
+
g_data_input_stream_read_until_async
+
+
g_data_input_stream_read_until_finish
+
+
g_data_input_stream_set_byte_order
+
+
g_data_input_stream_set_newline_type
+
+
g_data_output_stream_get_byte_order
+
+
g_data_output_stream_new
+
+
g_data_output_stream_put_byte
+
+
g_data_output_stream_put_int16
+
+
g_data_output_stream_put_int32
+
+
g_data_output_stream_put_int64
+
+
g_data_output_stream_put_string
+
+
g_data_output_stream_put_uint16
+
+
g_data_output_stream_put_uint32
+
+
g_data_output_stream_put_uint64
+
+
g_data_output_stream_set_byte_order
+
+
GDesktopAppInfo
+
+
GDesktopAppInfoLookup
+
+
g_desktop_app_info_get_filename
+
+
g_desktop_app_info_get_is_hidden
+
+
G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME
+
+
g_desktop_app_info_lookup_get_default_for_uri_scheme
+
+
g_desktop_app_info_new
+
+
g_desktop_app_info_new_from_filename
+
+
g_desktop_app_info_new_from_keyfile
+
+
g_desktop_app_info_set_desktop_env
+
+
GDrive
+
+
GDrive::changed
+
+
GDrive::disconnected
+
+
GDrive::eject-button
+
+
GDrive::stop-button
+
+
GDriveIface
+
+
GDriveStartFlags
+
+
GDriveStartStopType
+
+
g_drive_can_eject
+
+
g_drive_can_poll_for_media
+
+
g_drive_can_start
+
+
g_drive_can_start_degraded
+
+
g_drive_can_stop
+
+
g_drive_eject
+
+
g_drive_eject_finish
+
+
g_drive_eject_with_operation
+
+
g_drive_eject_with_operation_finish
+
+
g_drive_enumerate_identifiers
+
+
g_drive_get_icon
+
+
g_drive_get_identifier
+
+
g_drive_get_name
+
+
g_drive_get_start_stop_type
+
+
g_drive_get_volumes
+
+
g_drive_has_media
+
+
g_drive_has_volumes
+
+
g_drive_is_media_check_automatic
+
+
g_drive_is_media_removable
+
+
g_drive_poll_for_media
+
+
g_drive_poll_for_media_finish
+
+
g_drive_start
+
+
g_drive_start_finish
+
+
g_drive_stop
+
+
g_drive_stop_finish
+
+

E

+
GEmblem
+
+
GEmblem:icon
+
+
GEmblem:origin
+
+
GEmblemedIcon
+
+
g_emblemed_icon_add_emblem
+
+
g_emblemed_icon_get_emblems
+
+
g_emblemed_icon_get_icon
+
+
g_emblemed_icon_new
+
+
GEmblemOrigin
+
+
g_emblem_get_icon
+
+
g_emblem_get_origin
+
+
g_emblem_new
+
+
g_emblem_new_with_origin
+
+

F

+
GFile
+
+
GFileAttributeInfo
+
+
GFileAttributeInfoFlags
+
+
GFileAttributeInfoList
+
+
GFileAttributeMatcher
+
+
GFileAttributeStatus
+
+
GFileAttributeType
+
+
GFileCopyFlags
+
+
GFileCreateFlags
+
+
GFileDescriptorBased
+
+
GFileEnumerator
+
+
GFileEnumerator:container
+
+
GFileIcon
+
+
GFileIcon:file
+
+
GFileIface
+
+
GFileInfo
+
+
GFileInputStream
+
+
GFileIOStream
+
+
GFileMonitor
+
+
GFileMonitor::changed
+
+
GFileMonitor:cancelled
+
+
GFileMonitor:rate-limit
+
+
GFileMonitorEvent
+
+
GFileMonitorFlags
+
+
GFilenameCompleter
+
+
GFilenameCompleter::got-completion-data
+
+
g_filename_completer_get_completions
+
+
g_filename_completer_get_completion_suffix
+
+
g_filename_completer_new
+
+
g_filename_completer_set_dirs_only
+
+
GFileOutputStream
+
+
GFileProgressCallback
+
+
GFileQueryInfoFlags
+
+
GFileReadMoreCallback
+
+
GFilesystemPreviewType
+
+
GFileType
+
+
g_file_append_to
+
+
g_file_append_to_async
+
+
g_file_append_to_finish
+
+
G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE
+
+
G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE
+
+
G_FILE_ATTRIBUTE_ACCESS_CAN_READ
+
+
G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME
+
+
G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH
+
+
G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE
+
+
G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE
+
+
G_FILE_ATTRIBUTE_DOS_IS_SYSTEM
+
+
G_FILE_ATTRIBUTE_ETAG_VALUE
+
+
G_FILE_ATTRIBUTE_FILESYSTEM_FREE
+
+
G_FILE_ATTRIBUTE_FILESYSTEM_READONLY
+
+
G_FILE_ATTRIBUTE_FILESYSTEM_SIZE
+
+
G_FILE_ATTRIBUTE_FILESYSTEM_TYPE
+
+
G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW
+
+
G_FILE_ATTRIBUTE_GVFS_BACKEND
+
+
G_FILE_ATTRIBUTE_ID_FILE
+
+
G_FILE_ATTRIBUTE_ID_FILESYSTEM
+
+
g_file_attribute_info_list_add
+
+
g_file_attribute_info_list_dup
+
+
g_file_attribute_info_list_lookup
+
+
g_file_attribute_info_list_new
+
+
g_file_attribute_info_list_ref
+
+
g_file_attribute_info_list_unref
+
+
g_file_attribute_matcher_enumerate_namespace
+
+
g_file_attribute_matcher_enumerate_next
+
+
g_file_attribute_matcher_matches
+
+
g_file_attribute_matcher_matches_only
+
+
g_file_attribute_matcher_new
+
+
g_file_attribute_matcher_ref
+
+
g_file_attribute_matcher_unref
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE
+
+
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE
+
+
G_FILE_ATTRIBUTE_OWNER_GROUP
+
+
G_FILE_ATTRIBUTE_OWNER_USER
+
+
G_FILE_ATTRIBUTE_OWNER_USER_REAL
+
+
G_FILE_ATTRIBUTE_PREVIEW_ICON
+
+
G_FILE_ATTRIBUTE_SELINUX_CONTEXT
+
+
G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE
+
+
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE
+
+
G_FILE_ATTRIBUTE_STANDARD_COPY_NAME
+
+
G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION
+
+
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME
+
+
G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME
+
+
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE
+
+
G_FILE_ATTRIBUTE_STANDARD_ICON
+
+
G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP
+
+
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN
+
+
G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK
+
+
G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL
+
+
G_FILE_ATTRIBUTE_STANDARD_NAME
+
+
G_FILE_ATTRIBUTE_STANDARD_SIZE
+
+
G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER
+
+
G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET
+
+
G_FILE_ATTRIBUTE_STANDARD_TARGET_URI
+
+
G_FILE_ATTRIBUTE_STANDARD_TYPE
+
+
G_FILE_ATTRIBUTE_THUMBNAILING_FAILED
+
+
G_FILE_ATTRIBUTE_THUMBNAIL_PATH
+
+
G_FILE_ATTRIBUTE_TIME_ACCESS
+
+
G_FILE_ATTRIBUTE_TIME_ACCESS_USEC
+
+
G_FILE_ATTRIBUTE_TIME_CHANGED
+
+
G_FILE_ATTRIBUTE_TIME_CHANGED_USEC
+
+
G_FILE_ATTRIBUTE_TIME_CREATED
+
+
G_FILE_ATTRIBUTE_TIME_CREATED_USEC
+
+
G_FILE_ATTRIBUTE_TIME_MODIFIED
+
+
G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC
+
+
G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT
+
+
G_FILE_ATTRIBUTE_UNIX_BLOCKS
+
+
G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE
+
+
G_FILE_ATTRIBUTE_UNIX_DEVICE
+
+
G_FILE_ATTRIBUTE_UNIX_GID
+
+
G_FILE_ATTRIBUTE_UNIX_INODE
+
+
G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT
+
+
G_FILE_ATTRIBUTE_UNIX_MODE
+
+
G_FILE_ATTRIBUTE_UNIX_NLINK
+
+
G_FILE_ATTRIBUTE_UNIX_RDEV
+
+
G_FILE_ATTRIBUTE_UNIX_UID
+
+
g_file_copy
+
+
g_file_copy_async
+
+
g_file_copy_attributes
+
+
g_file_copy_finish
+
+
g_file_create
+
+
g_file_create_async
+
+
g_file_create_finish
+
+
g_file_create_readwrite
+
+
g_file_create_readwrite_async
+
+
g_file_create_readwrite_finish
+
+
g_file_delete
+
+
g_file_descriptor_based_get_fd
+
+
g_file_dup
+
+
g_file_eject_mountable
+
+
g_file_eject_mountable_finish
+
+
g_file_eject_mountable_with_operation
+
+
g_file_eject_mountable_with_operation_finish
+
+
g_file_enumerate_children
+
+
g_file_enumerate_children_async
+
+
g_file_enumerate_children_finish
+
+
g_file_enumerator_close
+
+
g_file_enumerator_close_async
+
+
g_file_enumerator_close_finish
+
+
g_file_enumerator_get_container
+
+
g_file_enumerator_has_pending
+
+
g_file_enumerator_is_closed
+
+
g_file_enumerator_next_file
+
+
g_file_enumerator_next_files_async
+
+
g_file_enumerator_next_files_finish
+
+
g_file_enumerator_set_pending
+
+
g_file_equal
+
+
g_file_find_enclosing_mount
+
+
g_file_find_enclosing_mount_async
+
+
g_file_find_enclosing_mount_finish
+
+
g_file_get_basename
+
+
g_file_get_child
+
+
g_file_get_child_for_display_name
+
+
g_file_get_parent
+
+
g_file_get_parse_name
+
+
g_file_get_path
+
+
g_file_get_relative_path
+
+
g_file_get_uri
+
+
g_file_get_uri_scheme
+
+
g_file_hash
+
+
g_file_has_parent
+
+
g_file_has_prefix
+
+
g_file_has_uri_scheme
+
+
g_file_icon_get_file
+
+
g_file_icon_new
+
+
g_file_info_clear_status
+
+
g_file_info_copy_into
+
+
g_file_info_dup
+
+
g_file_info_get_attribute_as_string
+
+
g_file_info_get_attribute_boolean
+
+
g_file_info_get_attribute_byte_string
+
+
g_file_info_get_attribute_data
+
+
g_file_info_get_attribute_int32
+
+
g_file_info_get_attribute_int64
+
+
g_file_info_get_attribute_object
+
+
g_file_info_get_attribute_status
+
+
g_file_info_get_attribute_string
+
+
g_file_info_get_attribute_stringv
+
+
g_file_info_get_attribute_type
+
+
g_file_info_get_attribute_uint32
+
+
g_file_info_get_attribute_uint64
+
+
g_file_info_get_content_type
+
+
g_file_info_get_display_name
+
+
g_file_info_get_edit_name
+
+
g_file_info_get_etag
+
+
g_file_info_get_file_type
+
+
g_file_info_get_icon
+
+
g_file_info_get_is_backup
+
+
g_file_info_get_is_hidden
+
+
g_file_info_get_is_symlink
+
+
g_file_info_get_modification_time
+
+
g_file_info_get_name
+
+
g_file_info_get_size
+
+
g_file_info_get_sort_order
+
+
g_file_info_get_symlink_target
+
+
g_file_info_has_attribute
+
+
g_file_info_has_namespace
+
+
g_file_info_list_attributes
+
+
g_file_info_new
+
+
g_file_info_remove_attribute
+
+
g_file_info_set_attribute
+
+
g_file_info_set_attribute_boolean
+
+
g_file_info_set_attribute_byte_string
+
+
g_file_info_set_attribute_int32
+
+
g_file_info_set_attribute_int64
+
+
g_file_info_set_attribute_mask
+
+
g_file_info_set_attribute_object
+
+
g_file_info_set_attribute_status
+
+
g_file_info_set_attribute_string
+
+
g_file_info_set_attribute_stringv
+
+
g_file_info_set_attribute_uint32
+
+
g_file_info_set_attribute_uint64
+
+
g_file_info_set_content_type
+
+
g_file_info_set_display_name
+
+
g_file_info_set_edit_name
+
+
g_file_info_set_file_type
+
+
g_file_info_set_icon
+
+
g_file_info_set_is_hidden
+
+
g_file_info_set_is_symlink
+
+
g_file_info_set_modification_time
+
+
g_file_info_set_name
+
+
g_file_info_set_size
+
+
g_file_info_set_sort_order
+
+
g_file_info_set_symlink_target
+
+
g_file_info_unset_attribute_mask
+
+
g_file_input_stream_query_info
+
+
g_file_input_stream_query_info_async
+
+
g_file_input_stream_query_info_finish
+
+
g_file_io_stream_get_etag
+
+
g_file_io_stream_query_info
+
+
g_file_io_stream_query_info_async
+
+
g_file_io_stream_query_info_finish
+
+
g_file_is_native
+
+
g_file_load_contents
+
+
g_file_load_contents_async
+
+
g_file_load_contents_finish
+
+
g_file_load_partial_contents_async
+
+
g_file_load_partial_contents_finish
+
+
g_file_make_directory
+
+
g_file_make_directory_with_parents
+
+
g_file_make_symbolic_link
+
+
g_file_monitor
+
+
g_file_monitor_cancel
+
+
g_file_monitor_directory
+
+
g_file_monitor_emit_event
+
+
g_file_monitor_file
+
+
g_file_monitor_is_cancelled
+
+
g_file_monitor_set_rate_limit
+
+
g_file_mount_enclosing_volume
+
+
g_file_mount_enclosing_volume_finish
+
+
g_file_mount_mountable
+
+
g_file_mount_mountable_finish
+
+
g_file_move
+
+
g_file_new_for_commandline_arg
+
+
g_file_new_for_path
+
+
g_file_new_for_uri
+
+
g_file_open_readwrite
+
+
g_file_open_readwrite_async
+
+
g_file_open_readwrite_finish
+
+
g_file_output_stream_get_etag
+
+
g_file_output_stream_query_info
+
+
g_file_output_stream_query_info_async
+
+
g_file_output_stream_query_info_finish
+
+
g_file_parse_name
+
+
g_file_poll_mountable
+
+
g_file_poll_mountable_finish
+
+
g_file_query_default_handler
+
+
g_file_query_exists
+
+
g_file_query_filesystem_info
+
+
g_file_query_filesystem_info_async
+
+
g_file_query_filesystem_info_finish
+
+
g_file_query_file_type
+
+
g_file_query_info
+
+
g_file_query_info_async
+
+
g_file_query_info_finish
+
+
g_file_query_settable_attributes
+
+
g_file_query_writable_namespaces
+
+
g_file_read
+
+
g_file_read_async
+
+
g_file_read_finish
+
+
g_file_replace
+
+
g_file_replace_async
+
+
g_file_replace_contents
+
+
g_file_replace_contents_async
+
+
g_file_replace_contents_finish
+
+
g_file_replace_finish
+
+
g_file_replace_readwrite
+
+
g_file_replace_readwrite_async
+
+
g_file_replace_readwrite_finish
+
+
g_file_resolve_relative_path
+
+
g_file_set_attribute
+
+
g_file_set_attributes_async
+
+
g_file_set_attributes_finish
+
+
g_file_set_attributes_from_info
+
+
g_file_set_attribute_byte_string
+
+
g_file_set_attribute_int32
+
+
g_file_set_attribute_int64
+
+
g_file_set_attribute_string
+
+
g_file_set_attribute_uint32
+
+
g_file_set_attribute_uint64
+
+
g_file_set_display_name
+
+
g_file_set_display_name_async
+
+
g_file_set_display_name_finish
+
+
g_file_start_mountable
+
+
g_file_start_mountable_finish
+
+
g_file_stop_mountable
+
+
g_file_stop_mountable_finish
+
+
g_file_supports_thread_contexts
+
+
g_file_trash
+
+
g_file_unmount_mountable
+
+
g_file_unmount_mountable_finish
+
+
g_file_unmount_mountable_with_operation
+
+
g_file_unmount_mountable_with_operation_finish
+
+
GFilterInputStream
+
+
GFilterInputStream:base-stream
+
+
GFilterInputStream:close-base-stream
+
+
GFilterOutputStream
+
+
GFilterOutputStream:base-stream
+
+
GFilterOutputStream:close-base-stream
+
+
g_filter_input_stream_get_base_stream
+
+
g_filter_input_stream_get_close_base_stream
+
+
g_filter_input_stream_set_close_base_stream
+
+
g_filter_output_stream_get_base_stream
+
+
g_filter_output_stream_get_close_base_stream
+
+
g_filter_output_stream_set_close_base_stream
+
+

I

+
GIcon
+
+
GIconIface
+
+
g_icon_equal
+
+
g_icon_hash
+
+
g_icon_new_for_string
+
+
g_icon_to_string
+
+
GInetAddress
+
+
GInetAddress:bytes
+
+
GInetAddress:family
+
+
GInetAddress:is-any
+
+
GInetAddress:is-link-local
+
+
GInetAddress:is-loopback
+
+
GInetAddress:is-mc-global
+
+
GInetAddress:is-mc-link-local
+
+
GInetAddress:is-mc-node-local
+
+
GInetAddress:is-mc-org-local
+
+
GInetAddress:is-mc-site-local
+
+
GInetAddress:is-multicast
+
+
GInetAddress:is-site-local
+
+
GInetSocketAddress
+
+
GInetSocketAddress:address
+
+
GInetSocketAddress:port
+
+
g_inet_address_get_family
+
+
g_inet_address_get_is_any
+
+
g_inet_address_get_is_link_local
+
+
g_inet_address_get_is_loopback
+
+
g_inet_address_get_is_mc_global
+
+
g_inet_address_get_is_mc_link_local
+
+
g_inet_address_get_is_mc_node_local
+
+
g_inet_address_get_is_mc_org_local
+
+
g_inet_address_get_is_mc_site_local
+
+
g_inet_address_get_is_multicast
+
+
g_inet_address_get_is_site_local
+
+
g_inet_address_get_native_size
+
+
g_inet_address_new_any
+
+
g_inet_address_new_from_bytes
+
+
g_inet_address_new_from_string
+
+
g_inet_address_new_loopback
+
+
g_inet_address_to_bytes
+
+
g_inet_address_to_string
+
+
g_inet_socket_address_get_address
+
+
g_inet_socket_address_get_port
+
+
g_inet_socket_address_new
+
+
GInitable
+
+
GInitableIface
+
+
g_initable_init
+
+
g_initable_new
+
+
g_initable_newv
+
+
g_initable_new_valist
+
+
GInputStream
+
+
GInputVector
+
+
g_input_stream_clear_pending
+
+
g_input_stream_close
+
+
g_input_stream_close_async
+
+
g_input_stream_close_finish
+
+
g_input_stream_has_pending
+
+
g_input_stream_is_closed
+
+
g_input_stream_read
+
+
g_input_stream_read_all
+
+
g_input_stream_read_async
+
+
g_input_stream_read_finish
+
+
g_input_stream_set_pending
+
+
g_input_stream_skip
+
+
g_input_stream_skip_async
+
+
g_input_stream_skip_finish
+
+
GIOErrorEnum
+
+
GIOExtension
+
+
GIOExtensionPoint
+
+
GIOModule
+
+
GIOSchedulerJob
+
+
GIOSchedulerJobFunc
+
+
GIOStream
+
+
GIOStream:closed
+
+
GIOStream:input-stream
+
+
GIOStream:output-stream
+
+
G_IO_ERROR
+
+
g_io_error_from_errno
+
+
g_io_extension_get_name
+
+
g_io_extension_get_priority
+
+
g_io_extension_get_type
+
+
g_io_extension_point_get_extensions
+
+
g_io_extension_point_get_extension_by_name
+
+
g_io_extension_point_get_required_type
+
+
g_io_extension_point_implement
+
+
g_io_extension_point_lookup
+
+
g_io_extension_point_register
+
+
g_io_extension_point_set_required_type
+
+
g_io_extension_ref_class
+
+
g_io_modules_load_all_in_directory
+
+
g_io_modules_scan_all_in_directory
+
+
g_io_module_load
+
+
g_io_module_new
+
+
g_io_module_query
+
+
g_io_module_unload
+
+
g_io_scheduler_cancel_all_jobs
+
+
g_io_scheduler_job_send_to_mainloop
+
+
g_io_scheduler_job_send_to_mainloop_async
+
+
g_io_scheduler_push_job
+
+
g_io_stream_clear_pending
+
+
g_io_stream_close
+
+
g_io_stream_close_async
+
+
g_io_stream_close_finish
+
+
g_io_stream_get_input_stream
+
+
g_io_stream_get_output_stream
+
+
g_io_stream_has_pending
+
+
g_io_stream_is_closed
+
+
g_io_stream_set_pending
+
+

L

+
GLoadableIcon
+
+
GLoadableIconIface
+
+
g_loadable_icon_load
+
+
g_loadable_icon_load_async
+
+
g_loadable_icon_load_finish
+
+

M

+
GMemoryInputStream
+
+
GMemoryOutputStream
+
+
GMemoryOutputStream:data
+
+
GMemoryOutputStream:data-size
+
+
GMemoryOutputStream:destroy-function
+
+
GMemoryOutputStream:realloc-function
+
+
GMemoryOutputStream:size
+
+
g_memory_input_stream_add_data
+
+
g_memory_input_stream_new
+
+
g_memory_input_stream_new_from_data
+
+
g_memory_output_stream_get_data
+
+
g_memory_output_stream_get_data_size
+
+
g_memory_output_stream_get_size
+
+
g_memory_output_stream_new
+
+
GMount
+
+
GMount::changed
+
+
GMount::pre-unmount
+
+
GMount::unmounted
+
+
GMountIface
+
+
GMountMountFlags
+
+
GMountOperation
+
+
GMountOperation::aborted
+
+
GMountOperation::ask-password
+
+
GMountOperation::ask-question
+
+
GMountOperation::reply
+
+
GMountOperation::show-processes
+
+
GMountOperation:anonymous
+
+
GMountOperation:choice
+
+
GMountOperation:domain
+
+
GMountOperation:password
+
+
GMountOperation:password-save
+
+
GMountOperation:username
+
+
GMountOperationResult
+
+
GMountUnmountFlags
+
+
g_mount_can_eject
+
+
g_mount_can_unmount
+
+
g_mount_eject
+
+
g_mount_eject_finish
+
+
g_mount_eject_with_operation
+
+
g_mount_eject_with_operation_finish
+
+
g_mount_get_default_location
+
+
g_mount_get_drive
+
+
g_mount_get_icon
+
+
g_mount_get_name
+
+
g_mount_get_root
+
+
g_mount_get_uuid
+
+
g_mount_get_volume
+
+
g_mount_guess_content_type
+
+
g_mount_guess_content_type_finish
+
+
g_mount_guess_content_type_sync
+
+
g_mount_is_shadowed
+
+
g_mount_operation_get_anonymous
+
+
g_mount_operation_get_choice
+
+
g_mount_operation_get_domain
+
+
g_mount_operation_get_password
+
+
g_mount_operation_get_password_save
+
+
g_mount_operation_get_username
+
+
g_mount_operation_new
+
+
g_mount_operation_reply
+
+
g_mount_operation_set_anonymous
+
+
g_mount_operation_set_choice
+
+
g_mount_operation_set_domain
+
+
g_mount_operation_set_password
+
+
g_mount_operation_set_password_save
+
+
g_mount_operation_set_username
+
+
g_mount_remount
+
+
g_mount_remount_finish
+
+
g_mount_shadow
+
+
g_mount_unmount
+
+
g_mount_unmount_finish
+
+
g_mount_unmount_with_operation
+
+
g_mount_unmount_with_operation_finish
+
+
g_mount_unshadow
+
+

N

+
GNetworkAddress
+
+
GNetworkAddress:hostname
+
+
GNetworkAddress:port
+
+
GNetworkService
+
+
GNetworkService:domain
+
+
GNetworkService:protocol
+
+
GNetworkService:service
+
+
g_network_address_get_hostname
+
+
g_network_address_get_port
+
+
g_network_address_new
+
+
g_network_address_parse
+
+
g_network_service_get_domain
+
+
g_network_service_get_protocol
+
+
g_network_service_get_service
+
+
g_network_service_new
+
+

O

+
GOutputStream
+
+
GOutputStreamSpliceFlags
+
+
GOutputVector
+
+
g_output_stream_clear_pending
+
+
g_output_stream_close
+
+
g_output_stream_close_async
+
+
g_output_stream_close_finish
+
+
g_output_stream_flush
+
+
g_output_stream_flush_async
+
+
g_output_stream_flush_finish
+
+
g_output_stream_has_pending
+
+
g_output_stream_is_closed
+
+
g_output_stream_is_closing
+
+
g_output_stream_set_pending
+
+
g_output_stream_splice
+
+
g_output_stream_splice_async
+
+
g_output_stream_splice_finish
+
+
g_output_stream_write
+
+
g_output_stream_write_all
+
+
g_output_stream_write_async
+
+
g_output_stream_write_finish
+
+

P

+
GPasswordSave
+
+

R

+
GReallocFunc
+
+
GResolver
+
+
GResolver::reload
+
+
GResolverError
+
+
G_RESOLVER_ERROR
+
+
g_resolver_free_addresses
+
+
g_resolver_free_targets
+
+
g_resolver_get_default
+
+
g_resolver_lookup_by_address
+
+
g_resolver_lookup_by_address_async
+
+
g_resolver_lookup_by_address_finish
+
+
g_resolver_lookup_by_name
+
+
g_resolver_lookup_by_name_async
+
+
g_resolver_lookup_by_name_finish
+
+
g_resolver_lookup_service
+
+
g_resolver_lookup_service_async
+
+
g_resolver_lookup_service_finish
+
+
g_resolver_set_default
+
+

S

+
GSeekable
+
+
GSeekableIface
+
+
g_seekable_can_seek
+
+
g_seekable_can_truncate
+
+
g_seekable_seek
+
+
g_seekable_tell
+
+
g_seekable_truncate
+
+
GSimpleAsyncResult
+
+
GSimpleAsyncThreadFunc
+
+
g_simple_async_report_error_in_idle
+
+
g_simple_async_report_gerror_in_idle
+
+
g_simple_async_result_complete
+
+
g_simple_async_result_complete_in_idle
+
+
g_simple_async_result_get_op_res_gboolean
+
+
g_simple_async_result_get_op_res_gpointer
+
+
g_simple_async_result_get_op_res_gssize
+
+
g_simple_async_result_get_source_tag
+
+
g_simple_async_result_is_valid
+
+
g_simple_async_result_new
+
+
g_simple_async_result_new_error
+
+
g_simple_async_result_new_from_error
+
+
g_simple_async_result_propagate_error
+
+
g_simple_async_result_run_in_thread
+
+
g_simple_async_result_set_error
+
+
g_simple_async_result_set_error_va
+
+
g_simple_async_result_set_from_error
+
+
g_simple_async_result_set_handle_cancellation
+
+
g_simple_async_result_set_op_res_gboolean
+
+
g_simple_async_result_set_op_res_gpointer
+
+
g_simple_async_result_set_op_res_gssize
+
+
GSocket
+
+
GSocket:blocking
+
+
GSocket:family
+
+
GSocket:fd
+
+
GSocket:keepalive
+
+
GSocket:listen-backlog
+
+
GSocket:local-address
+
+
GSocket:protocol
+
+
GSocket:remote-address
+
+
GSocket:type
+
+
GSocketAddress
+
+
GSocketAddress:family
+
+
GSocketAddressEnumerator
+
+
GSocketClient
+
+
GSocketClient:family
+
+
GSocketClient:local-address
+
+
GSocketClient:protocol
+
+
GSocketClient:type
+
+
GSocketConnectable
+
+
GSocketConnectableIface
+
+
GSocketConnection
+
+
GSocketConnection:socket
+
+
GSocketControlMessage
+
+
GSocketFamily
+
+
GSocketListener
+
+
GSocketListener:listen-backlog
+
+
GSocketMsgFlags
+
+
GSocketProtocol
+
+
GSocketService
+
+
GSocketService::incoming
+
+
GSocketSourceFunc
+
+
GSocketType
+
+
g_socket_accept
+
+
g_socket_address_enumerator_next
+
+
g_socket_address_enumerator_next_async
+
+
g_socket_address_enumerator_next_finish
+
+
g_socket_address_get_family
+
+
g_socket_address_get_native_size
+
+
g_socket_address_new_from_native
+
+
g_socket_address_to_native
+
+
g_socket_bind
+
+
g_socket_check_connect_result
+
+
g_socket_client_connect
+
+
g_socket_client_connect_async
+
+
g_socket_client_connect_finish
+
+
g_socket_client_connect_to_host
+
+
g_socket_client_connect_to_host_async
+
+
g_socket_client_connect_to_host_finish
+
+
g_socket_client_connect_to_service
+
+
g_socket_client_connect_to_service_async
+
+
g_socket_client_connect_to_service_finish
+
+
g_socket_client_get_family
+
+
g_socket_client_get_local_address
+
+
g_socket_client_get_protocol
+
+
g_socket_client_get_socket_type
+
+
g_socket_client_new
+
+
g_socket_client_set_family
+
+
g_socket_client_set_local_address
+
+
g_socket_client_set_protocol
+
+
g_socket_client_set_socket_type
+
+
g_socket_close
+
+
g_socket_condition_check
+
+
g_socket_condition_wait
+
+
g_socket_connect
+
+
g_socket_connectable_enumerate
+
+
g_socket_connection_factory_create_connection
+
+
g_socket_connection_factory_lookup_type
+
+
g_socket_connection_factory_register_type
+
+
g_socket_connection_get_local_address
+
+
g_socket_connection_get_remote_address
+
+
g_socket_connection_get_socket
+
+
g_socket_control_message_deserialize
+
+
g_socket_control_message_get_level
+
+
g_socket_control_message_get_msg_type
+
+
g_socket_control_message_get_size
+
+
g_socket_control_message_serialize
+
+
g_socket_create_source
+
+
g_socket_get_blocking
+
+
g_socket_get_family
+
+
g_socket_get_fd
+
+
g_socket_get_keepalive
+
+
g_socket_get_listen_backlog
+
+
g_socket_get_local_address
+
+
g_socket_get_protocol
+
+
g_socket_get_remote_address
+
+
g_socket_get_socket_type
+
+
g_socket_is_closed
+
+
g_socket_is_connected
+
+
g_socket_listen
+
+
g_socket_listener_accept
+
+
g_socket_listener_accept_async
+
+
g_socket_listener_accept_finish
+
+
g_socket_listener_accept_socket
+
+
g_socket_listener_accept_socket_async
+
+
g_socket_listener_accept_socket_finish
+
+
g_socket_listener_add_address
+
+
g_socket_listener_add_any_inet_port
+
+
g_socket_listener_add_inet_port
+
+
g_socket_listener_add_socket
+
+
g_socket_listener_close
+
+
g_socket_listener_new
+
+
g_socket_listener_set_backlog
+
+
g_socket_new
+
+
g_socket_new_from_fd
+
+
g_socket_receive
+
+
g_socket_receive_from
+
+
g_socket_receive_message
+
+
g_socket_send
+
+
g_socket_send_message
+
+
g_socket_send_to
+
+
g_socket_service_is_active
+
+
g_socket_service_new
+
+
g_socket_service_start
+
+
g_socket_service_stop
+
+
g_socket_set_blocking
+
+
g_socket_set_keepalive
+
+
g_socket_set_listen_backlog
+
+
g_socket_shutdown
+
+
g_socket_speaks_ipv4
+
+
GSrvTarget
+
+
g_srv_target_copy
+
+
g_srv_target_free
+
+
g_srv_target_get_hostname
+
+
g_srv_target_get_port
+
+
g_srv_target_get_priority
+
+
g_srv_target_get_weight
+
+
g_srv_target_list_sort
+
+
g_srv_target_new
+
+

T

+
GTcpConnection
+
+
GTcpConnection:graceful-disconnect
+
+
g_tcp_connection_get_graceful_disconnect
+
+
g_tcp_connection_set_graceful_disconnect
+
+
GThemedIcon
+
+
GThemedIcon:name
+
+
GThemedIcon:names
+
+
GThemedIcon:use-default-fallbacks
+
+
g_themed_icon_append_name
+
+
g_themed_icon_get_names
+
+
g_themed_icon_new
+
+
g_themed_icon_new_from_names
+
+
g_themed_icon_new_with_default_fallbacks
+
+
g_themed_icon_prepend_name
+
+
GThreadedSocketService
+
+
GThreadedSocketService::run
+
+
GThreadedSocketService:max-threads
+
+
g_threaded_socket_service_new
+
+

U

+
GUnixConnection
+
+
GUnixFDList
+
+
GUnixFDMessage
+
+
GUnixFDMessage:fd-list
+
+
GUnixInputStream
+
+
GUnixInputStream:close-fd
+
+
GUnixInputStream:fd
+
+
GUnixMount
+
+
GUnixMountEntry
+
+
GUnixMountMonitor
+
+
GUnixMountMonitor::mountpoints-changed
+
+
GUnixMountMonitor::mounts-changed
+
+
GUnixMountPoint
+
+
GUnixOutputStream
+
+
GUnixOutputStream:close-fd
+
+
GUnixOutputStream:fd
+
+
GUnixSocketAddress
+
+
GUnixSocketAddress:abstract
+
+
GUnixSocketAddress:path
+
+
GUnixSocketAddress:path-as-array
+
+
g_unix_connection_receive_fd
+
+
g_unix_connection_send_fd
+
+
g_unix_fd_list_append
+
+
g_unix_fd_list_get
+
+
g_unix_fd_list_get_length
+
+
g_unix_fd_list_new
+
+
g_unix_fd_list_new_from_array
+
+
g_unix_fd_list_peek_fds
+
+
g_unix_fd_list_steal_fds
+
+
g_unix_fd_message_append_fd
+
+
g_unix_fd_message_get_fd_list
+
+
g_unix_fd_message_new
+
+
g_unix_fd_message_new_with_fd_list
+
+
g_unix_fd_message_steal_fds
+
+
g_unix_input_stream_get_close_fd
+
+
g_unix_input_stream_get_fd
+
+
g_unix_input_stream_new
+
+
g_unix_input_stream_set_close_fd
+
+
g_unix_is_mount_path_system_internal
+
+
g_unix_mounts_changed_since
+
+
g_unix_mounts_get
+
+
g_unix_mount_at
+
+
g_unix_mount_compare
+
+
g_unix_mount_free
+
+
g_unix_mount_get_device_path
+
+
g_unix_mount_get_fs_type
+
+
g_unix_mount_get_mount_path
+
+
g_unix_mount_guess_can_eject
+
+
g_unix_mount_guess_icon
+
+
g_unix_mount_guess_name
+
+
g_unix_mount_guess_should_display
+
+
g_unix_mount_is_readonly
+
+
g_unix_mount_is_system_internal
+
+
g_unix_mount_monitor_new
+
+
g_unix_mount_monitor_set_rate_limit
+
+
g_unix_mount_points_changed_since
+
+
g_unix_mount_points_get
+
+
g_unix_mount_point_compare
+
+
g_unix_mount_point_free
+
+
g_unix_mount_point_get_device_path
+
+
g_unix_mount_point_get_fs_type
+
+
g_unix_mount_point_get_mount_path
+
+
g_unix_mount_point_guess_can_eject
+
+
g_unix_mount_point_guess_icon
+
+
g_unix_mount_point_guess_name
+
+
g_unix_mount_point_is_loopback
+
+
g_unix_mount_point_is_readonly
+
+
g_unix_mount_point_is_user_mountable
+
+
g_unix_output_stream_get_close_fd
+
+
g_unix_output_stream_get_fd
+
+
g_unix_output_stream_new
+
+
g_unix_output_stream_set_close_fd
+
+
g_unix_socket_address_abstract_names_supported
+
+
g_unix_socket_address_get_is_abstract
+
+
g_unix_socket_address_get_path
+
+
g_unix_socket_address_get_path_len
+
+
g_unix_socket_address_new
+
+
g_unix_socket_address_new_abstract
+
+

V

+
GVfs
+
+
G_VFS_EXTENSION_POINT_NAME
+
+
g_vfs_get_default
+
+
g_vfs_get_file_for_path
+
+
g_vfs_get_file_for_uri
+
+
g_vfs_get_local
+
+
g_vfs_get_supported_uri_schemes
+
+
g_vfs_is_active
+
+
g_vfs_parse_name
+
+
GVolume
+
+
GVolume::changed
+
+
GVolume::removed
+
+
GVolumeIface
+
+
GVolumeMonitor
+
+
GVolumeMonitor::drive-changed
+
+
GVolumeMonitor::drive-connected
+
+
GVolumeMonitor::drive-disconnected
+
+
GVolumeMonitor::drive-eject-button
+
+
GVolumeMonitor::drive-stop-button
+
+
GVolumeMonitor::mount-added
+
+
GVolumeMonitor::mount-changed
+
+
GVolumeMonitor::mount-pre-unmount
+
+
GVolumeMonitor::mount-removed
+
+
GVolumeMonitor::volume-added
+
+
GVolumeMonitor::volume-changed
+
+
GVolumeMonitor::volume-removed
+
+
g_volume_can_eject
+
+
g_volume_can_mount
+
+
g_volume_eject
+
+
g_volume_eject_finish
+
+
g_volume_eject_with_operation
+
+
g_volume_eject_with_operation_finish
+
+
g_volume_enumerate_identifiers
+
+
g_volume_get_activation_root
+
+
g_volume_get_drive
+
+
g_volume_get_icon
+
+
g_volume_get_identifier
+
+
g_volume_get_mount
+
+
g_volume_get_name
+
+
g_volume_get_uuid
+
+
G_VOLUME_IDENTIFIER_KIND_HAL_UDI
+
+
G_VOLUME_IDENTIFIER_KIND_LABEL
+
+
G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT
+
+
G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE
+
+
G_VOLUME_IDENTIFIER_KIND_UUID
+
+
g_volume_monitor_adopt_orphan_mount
+
+
G_VOLUME_MONITOR_EXTENSION_POINT_NAME
+
+
g_volume_monitor_get
+
+
g_volume_monitor_get_connected_drives
+
+
g_volume_monitor_get_mounts
+
+
g_volume_monitor_get_mount_for_uuid
+
+
g_volume_monitor_get_volumes
+
+
g_volume_monitor_get_volume_for_uuid
+
+
g_volume_mount
+
+
g_volume_mount_finish
+
+
g_volume_should_automount
+
+

Z

+
GZlibCompressor
+
+
GZlibCompressor:format
+
+
GZlibCompressor:level
+
+
GZlibCompressorFormat
+
+
GZlibDecompressor
+
+
GZlibDecompressor:format
+
+
g_zlib_compressor_new
+
+
g_zlib_decompressor_new
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/async.html b/docs/reference/gio/html/async.html new file mode 100644 index 0000000..838d407 --- /dev/null +++ b/docs/reference/gio/html/async.html @@ -0,0 +1,74 @@ + + + + +Asynchronous I/O + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Asynchronous I/O

+
+
+GCancellable — Thread-safe Operation Cancellation Stack +
+
+GAsyncResult — Asynchronous Function Results +
+
+GIOScheduler — I/O Scheduler +
+
+GSimpleAsyncResult — Simple asynchronous results implementation +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch01.html b/docs/reference/gio/html/ch01.html new file mode 100644 index 0000000..473cf8e --- /dev/null +++ b/docs/reference/gio/html/ch01.html @@ -0,0 +1,201 @@ + + + + +Introduction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Introduction

+

+ GIO is striving to provide a modern, easy-to-use VFS API that sits + at the right level in the library stack. The goal is to overcome the + shortcomings of GnomeVFS and provide an API that is so good that + developers prefer it over raw POSIX calls. Among other things + that means using GObject. It also means not cloning the POSIX + API, but providing higher-level, document-centric interfaces. +

+

+ The abstract file system model of GIO consists of a number of + interfaces and base classes for I/O and files: +

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

GFile

reference to a file

GFileInfo

information about a file or filesystem

GFileEnumerator

list files in directories

GDrive

represents a drive

GVolume

represents a file system in an abstract way

GMount

represents a mounted file system

+

+ Then there is a number of stream classes, similar to the input and + output stream hierarchies that can be found in frameworks like Java: +

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

GInputStream

read data

GOutputStream

write data

GIOStream

read and write data

GSeekable

interface optionally implemented by streams to support seeking

+

+ There are interfaces related to applications and the types + of files they handle: +

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

GAppInfo

information about an installed application

GIcon

abstract type for file and application icons

+

+ There is support for network programming, including name resolution, lowlevel socket + APIs and highlevel client and server helper classes: +

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

GSocket

lowlevel platform independent socket object

GResolver

asynchronous and cancellable DNS resolver

GSocketClient

high-level network client helper

GSocketService

high-level network server helper

GSocketConnection

network connection stream

+

+ Beyond these, GIO provides facilities for file monitoring, + asynchronous I/O and filename completion. In addition to the + interfaces, GIO provides implementations for the local case. + Implementations for various network file systems are provided + by the GVFS package as loadable modules. +

+

+ Other design choices which consciously break with the GnomeVFS + design are to move backends out-of-process, which minimizes the + dependency bloat and makes the whole system more robust. The backends + are not included in GIO, but in the separate GVFS package. The GVFS + package also contains the GVFS daemon, which spawn further mount + daemons for each individual connection. +

+
+

Figure 1. GIO in the GTK+ library stack

+
GIO in the GTK+ library stack
+
+

+ The GIO model of I/O is stateful: if an application establishes e.g. + a SFTP connection to a server, it becomes available to all applications + in the session; the user does not have to enter his password over + and over again. +

+

+ One of the big advantages of putting the VFS in the GLib layer + is that GTK+ can directly use it, e.g. in the filechooser. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch02.html b/docs/reference/gio/html/ch02.html new file mode 100644 index 0000000..e805d21 --- /dev/null +++ b/docs/reference/gio/html/ch02.html @@ -0,0 +1,75 @@ + + + + +Compiling GIO applications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Compiling GIO applications

+

+ GIO comes with a gio-2.0.pc file that you + should use together with pkg-config to obtain + the necessary information about header files and libraries. See + the pkg-config man page or the GLib documentation + for more information on how to use pkg-config + to compile your application. +

+

+ If you are using GIO on UNIX-like systems, you may want to use + UNIX-specific GIO interfaces such as GUnixInputStream, + GUnixOutputStream, GUnixMount or GDesktopAppInfo. + To do so, use the gio-unix-2.0.pc file + instead of gio-2.0.pc +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch03.html b/docs/reference/gio/html/ch03.html new file mode 100644 index 0000000..f3fe54d --- /dev/null +++ b/docs/reference/gio/html/ch03.html @@ -0,0 +1,110 @@ + + + + +Running GIO applications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Running GIO applications

+

+ GIO inspects a few of environment variables in addition to the + ones used by GLib. +

+

XDG_DATA_HOME, XDG_DATA_DIRS.  + GIO uses these environment variables to locate MIME information. + For more information, see the Shared MIME-info Database + and the Base Directory Specification. +

+

GVFS_DISABLE_FUSE.  + This variable can be set to keep Gvfs from starting the fuse backend, + which may be unwanted or unnecessary in certain situations. +

+

+ The following environment variables are only useful for debugging + GIO itself or modules that it loads. They should not be set in a + production environment. +

+

GIO_USE_VFS.  + This environment variable can be set to the name of a GVfs + implementation to override the default for debugging purposes. + The GVfs implementation for local files that is included in GIO + has the name "local", the implementation in the gvfs module has + the name "gvfs". +

+

GIO_USE_VOLUME_MONITOR.  + This variable can be set to the name of a GVolumeMonitor + implementation to override the default for debugging purposes. + The GVolumeMonitor implementation for local files that is included + in GIO has the name "unix", the hal-based implementation in the + gvfs module has the name "hal". +

+

GIO_USE_URI_ASSOCIATION.  + This variable can be set to the name of a GDesktopAppInfoLookup + implementation to override the default for debugging purposes. + GIO does not include a GDesktopAppInfoLookup implementation, + the GConf-based implementation in the gvfs module has the name + "gconf". +

+

GVFS_INOTIFY_DIAG.  + When this environment variable is set and GIO has been built + with inotify support, a dump of diagnostic inotify information + will be written every 20 seconds to a file named + /tmp/gvfsdid.pid. +

+

GIO_EXTRA_MODULES.  + When this environment variable is set to a path, or a set of + paths separated by a colon, GIO will attempt to load + modules from within the path. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch19.html b/docs/reference/gio/html/ch19.html new file mode 100644 index 0000000..cfe83de --- /dev/null +++ b/docs/reference/gio/html/ch19.html @@ -0,0 +1,105 @@ + + + + +Migrating from POSIX to GIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Migrating from POSIX to GIO

+
+

Table 4. Comparison of POSIX and GIO concepts

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
POSIXGIO
char *pathGFile *file
struct stat *bufGFileInfo *info
struct statvfs *bufGFileInfo *info
int fdGInputStream *in
GOutputStream *out
DIR *GFileEnumerator *enum
fstab entryGUnixMountPoint *mount_point
mtab entryGUnixMountEntry *mount_entry
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch20.html b/docs/reference/gio/html/ch20.html new file mode 100644 index 0000000..64e754f --- /dev/null +++ b/docs/reference/gio/html/ch20.html @@ -0,0 +1,206 @@ + + + + +Migrating from GnomeVFS to GIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Migrating from GnomeVFS to GIO

+ +
+

Table 5. Comparison of GnomeVFS and GIO concepts

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GnomeVFSGIO
GnomeVFSURIGFile
GnomeVFSFileInfoGFileInfo
GnomeVFSResultGError, with G_IO_ERROR values
GnomeVFSHandle & GnomeVFSAsyncHandleGInputStream or GOutputStream
GnomeVFSDirectoryHandleGFileEnumerator
mime typecontent type
GnomeVFSMonitorGFileMonitor
GnomeVFSVolumeMonitorGVolumeMonitor
GnomeVFSVolumeGMount
GnomeVFSDriveGVolume
-GDrive
GnomeVFSContextGCancellable
gnome_vfs_async_cancelg_cancellable_cancel
+
+
+

+Trash handling

+

+ The handling of trashed files has been changed in GIO, compared + to gnome-vfs. gnome-vfs has a home-grown trash implementation that + predates the freedesktop.org Desktop Trash Can specification + that is implemented in GIO. The location for storing trashed files + has changed from $HOME/.Trash to + $HOME/.local/share/Trash (or more correctly + $XDG_DATA_HOME/Trash), which means that + there is a need for migrating files that have been trashed by + gnome-vfs to the new location. +

+

+ In gnome-vfs, the trash:// scheme offering a + merged view of all trash directories was implemented in nautilus, + and trash-handling applications had to find and monitor all trash + directories themselves. With GIO, the trash:// + implementation has been moved to gvfs and applications can simply + monitor that location: +

+
+static void
+file_changed (GFileMonitor      *file_monitor,
+              GFile             *child,
+              GFile             *other_file,
+              GFileMonitorEvent  event_type,
+              gpointer           user_data)
+{
+  switch (event_type)
+  {
+  case G_FILE_MONITOR_EVENT_DELETED:
+    g_print ("'%s' removed from trash\n", g_file_get_basename (child));
+    break;
+  case G_FILE_MONITOR_EVENT_CREATED:
+    g_print ("'%s' added to trash\n", g_file_get_basename (child));
+    break;
+  default: ;
+  }
+}
+
+static void
+start_monitoring_trash (void)
+{
+  GFile *file;
+  GFileMonitor *monitor;
+
+  file = g_file_new_for_uri ("trash://");
+  monitor = g_file_monitor_directory (file, 0, NULL, NULL);
+  g_object_unref (file);
+
+  g_signal_connect (monitor, "changed", G_CALLBACK (file_changed), NULL);
+
+  /* ... */
+
+}       
+
+

+ GIO exposes some useful metadata about trashed files. There are + trash::orig-path and trash::deletion-date attributes. The + standard::icon attribute of the trash:// + itself provides a suitable icon for displaying the trash can on + the desktop. If you are using this icon, make sure to monitor + this attribute for changes, since the icon may be updated to + reflect that state of the trash can. +

+

+ Moving a file to the trash is much simpler with GIO. Instead of + using gnome_vfs_find_directory() with GNOME_VFS_DIRECTORY_KIND_TRASH + to find out where to move the trashed file, just use the g_file_trash() + function. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch20s02.html b/docs/reference/gio/html/ch20s02.html new file mode 100644 index 0000000..0d9a20d --- /dev/null +++ b/docs/reference/gio/html/ch20s02.html @@ -0,0 +1,71 @@ + + + + +Operations on multiple files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Operations on multiple files

+

+ gnome-vfs has the dreaded gnome_vfs_xfer_uri_list() function which + has tons of options and offers the equivalent of cp, mv, ln, mkdir + and rm at the same time. +

+

+ GIO offers a much simpler I/O scheduler functionality instead, that + lets you schedule a function to be called in a separate thread, or + if threads are not available, as an idle in the mainloop. + See g_io_scheduler_push_job(). +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/ch20s03.html b/docs/reference/gio/html/ch20s03.html new file mode 100644 index 0000000..b8728f1 --- /dev/null +++ b/docs/reference/gio/html/ch20s03.html @@ -0,0 +1,69 @@ + + + + +Mime monitoring + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Mime monitoring

+

+ gnome-vfs offered a way to monitor the association between mime types + and default handlers for changes, with the GnomeVFSMIMEMonitor object. + GIO does not offer a replacement for this functionality at this time, + since we have not found a compelling use case where + GnomeVFSMIMEMonitor was used. If you think you have such a use + case, please report it at + bugzilla.gnome.org. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/conversion.html b/docs/reference/gio/html/conversion.html new file mode 100644 index 0000000..368da21 --- /dev/null +++ b/docs/reference/gio/html/conversion.html @@ -0,0 +1,74 @@ + + + + +Data conversion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Data conversion

+
+
+GConverter — Data conversion interface +
+
+GCharsetConverter — Convert between charsets +
+
+GZlibCompressor — Zlib compressor +
+
+GZlibDecompressor — Zlib decompressor +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/extending-gio.html b/docs/reference/gio/html/extending-gio.html new file mode 100644 index 0000000..3844b25 --- /dev/null +++ b/docs/reference/gio/html/extending-gio.html @@ -0,0 +1,126 @@ + + + + +Extending GIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Extending GIO

+

+ A lot of the functionality that is accessible through GIO + is implemented in loadable modules, and modules provide a convenient + way to extend GIO. In addition to the GIOModule API which supports + writing such modules, GIO has a mechanism to define extension points, + and register implementations thereof, see GIOExtensionPoint. +

+

+ The following extension points are currently defined by GIO: +

+

G_VFS_EXTENSION_POINT_NAME.  + Allows to override the functionality of the GVfs class. + Implementations of this extension point must be derived from GVfs. + GIO uses the implementation with the highest priority that is active, + see g_vfs_is_active(). + + GIO implements this extension point for local files, gvfs contains + an implementation that supports all the backends in gvfs. +

+

G_VOLUME_MONITOR_EXTENSION_POINT_NAME.  + Allows to add more volume monitors. + Implementations of this extension point must be derived from + GVolumeMonitor. GIO uses all registered extensions. + + gvfs contains an implementation that works together with the GVfs + implementation in gvfs. +

+

G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME.  + Allows to override the 'native' volume monitor. + Implementations of this extension point must be derived from + GNativeVolumeMonitor. GIO uses the implementation with + the highest priority that is supported, as determined by the + is_supported() vfunc in GVolumeMonitorClass. + + GIO implements this extension point for local mounts, + gvfs contains a hal-based implementation. +

+

G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME.  + Allows to override the file monitor implementation for + local files. Implementations of this extension point must + be derived from GLocalFileMonitor. GIO uses the implementation + with the highest priority that is supported, as determined by the + is_supported() vfunc in GLocalFileMonitorClass. + + GIO uses this extension point internally, to switch between + its fam-based and inotify-based file monitoring implementations. +

+

G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME.  + Allows to override the directory monitor implementation for + local files. Implementations of this extension point must be + derived from GLocalDirectoryMonitor. GIO uses the implementation + with the highest priority that is supported, as determined by the + is_supported() vfunc in GLocalDirectoryMonitorClass. + + GIO uses this extension point internally, to switch between + its fam-based and inotify-based directory monitoring implementations. +

+

G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME.  + Unix-only. Allows to provide a way to associate default handlers + with URI schemes. Implementations of this extension point must + implement the GDesktopAppInfoLookup interface. GIO uses the + implementation with the highest priority. + + gvfs contains a GConf-based implementation that uses the + same GConf keys as gnome-vfs. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/extending.html b/docs/reference/gio/html/extending.html new file mode 100644 index 0000000..c127e44 --- /dev/null +++ b/docs/reference/gio/html/extending.html @@ -0,0 +1,71 @@ + + + + +Extending GIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Extending GIO

+
+
+GVfs — Virtual File System +
+
+GIOModule — Loadable GIO Modules +
+
+Extension Points — Extension Points +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/failable_initialization.html b/docs/reference/gio/html/failable_initialization.html new file mode 100644 index 0000000..200f506 --- /dev/null +++ b/docs/reference/gio/html/failable_initialization.html @@ -0,0 +1,68 @@ + + + + +Failable Initialization + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Failable Initialization

+
+
+GInitable — Failable object initialization interface +
+
+GAsyncInitable — Asynchronously failable object initialization interface +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/file_mon.html b/docs/reference/gio/html/file_mon.html new file mode 100644 index 0000000..057539c --- /dev/null +++ b/docs/reference/gio/html/file_mon.html @@ -0,0 +1,63 @@ + + + + +File System Monitoring + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+File System Monitoring

+
+GFileMonitor — File Monitor +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/file_ops.html b/docs/reference/gio/html/file_ops.html new file mode 100644 index 0000000..90c02d4 --- /dev/null +++ b/docs/reference/gio/html/file_ops.html @@ -0,0 +1,80 @@ + + + + +File Operations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+File Operations

+
+
+GFile — File and Directory Handling +
+
+GFileAttribute — Key-Value Paired File Attributes +
+
+GFileInfo — File Information and Attributes +
+
+GFileEnumerator — Enumerated Files Routines +
+
+GIOError — Error helper functions +
+
+GMountOperation — Object used for authentication and user interaction +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-Desktop-file-based-GAppInfo.html b/docs/reference/gio/html/gio-Desktop-file-based-GAppInfo.html new file mode 100644 index 0000000..d7d1af3 --- /dev/null +++ b/docs/reference/gio/html/gio-Desktop-file-based-GAppInfo.html @@ -0,0 +1,358 @@ + + + + +Desktop file based GAppInfo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Desktop file based GAppInfo

+

Desktop file based GAppInfo — Application information from desktop files

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GDesktopAppInfo
+
+
+  GInterface
+   +----GDesktopAppInfoLookup
+
+
+
+

Prerequisites

+

+GDesktopAppInfoLookup requires + GObject.

+
+
+

Implemented Interfaces

+

+GDesktopAppInfo implements + GAppInfo.

+
+
+

Description

+

+GDesktopAppInfo is an implementation of GAppInfo based on +desktop files. +

+

+Note that <gio/gdesktopappinfo.h> belongs to +the UNIX-specific GIO interfaces, thus you have to use the +gio-unix-2.0.pc pkg-config file when using it.

+
+
+

Details

+
+

GDesktopAppInfo

+
typedef struct _GDesktopAppInfo GDesktopAppInfo;
+

+Information about an installed application from a desktop file.

+
+
+
+

g_desktop_app_info_new_from_filename ()

+
GDesktopAppInfo *   g_desktop_app_info_new_from_filename
+                                                        (const char *filename);
+

+Creates a new GDesktopAppInfo.

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

filename :

the path of a desktop file, in the GLib filename encoding +

Returns :

a new GDesktopAppInfo or NULL on error. +
+
+
+
+

g_desktop_app_info_new_from_keyfile ()

+
GDesktopAppInfo *   g_desktop_app_info_new_from_keyfile (GKeyFile *key_file);
+

+Creates a new GDesktopAppInfo.

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

key_file :

an opened GKeyFile +

Returns :

a new GDesktopAppInfo or NULL on error. + +
+

Since 2.18

+
+
+
+

g_desktop_app_info_new ()

+
GDesktopAppInfo *   g_desktop_app_info_new              (const char *desktop_id);
+

+Creates a new GDesktopAppInfo based on a desktop file id. +

+

+A desktop file id is the basename of the desktop file, including the +.desktop extension. GIO is looking for a desktop file with this name +in the applications subdirectories of the XDG data +directories (i.e. the directories specified in the +XDG_DATA_HOME and XDG_DATA_DIRS environment +variables). GIO also supports the prefix-to-subdirectory mapping that is +described in the Menu Spec +(i.e. a desktop id of kde-foo.desktop will match +/usr/share/applications/kde/foo.desktop).

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

desktop_id :

the desktop file id +

Returns :

a new GDesktopAppInfo, or NULL if no desktop file with that id +
+
+
+
+

g_desktop_app_info_get_filename ()

+
const char *        g_desktop_app_info_get_filename     (GDesktopAppInfo *info);
+

+When info was created from a known filename, return it. In some +situations such as the GDesktopAppInfo returned from +g_desktop_app_info_new_from_keyfile(), this function will return NULL.

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

info :

a GDesktopAppInfo +

Returns :

The full path to the file for info, or NULL if not known. +
+

Since 2.24

+
+
+
+

g_desktop_app_info_get_is_hidden ()

+
gboolean            g_desktop_app_info_get_is_hidden    (GDesktopAppInfo *info);
+

+A desktop file is hidden if the Hidden key in it is +set to True.

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

info :

a GDesktopAppInfo. +

Returns :

TRUE if hidden, FALSE otherwise. +
+
+
+
+

g_desktop_app_info_set_desktop_env ()

+
void                g_desktop_app_info_set_desktop_env  (const char *desktop_env);
+

+Sets the name of the desktop that the application is running in. +This is used by g_app_info_should_show() to evaluate the +OnlyShowIn and NotShowIn +desktop entry fields. +

+

+The Desktop +Menu specification recognizes the following: +

+ + + + + + +
GNOME
KDE
ROX
XFCE
Old
+

+

+

+Should be called only once; subsequent calls are ignored.

+
++ + + + +

desktop_env :

a string specifying what desktop this is +
+
+
+
+

GDesktopAppInfoLookup

+
typedef struct _GDesktopAppInfoLookup GDesktopAppInfoLookup;
+

+Interface that is used by backends to associate default +handlers with URI schemes.

+
+
+
+

G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME

+
#define G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME "gio-desktop-app-info-lookup"
+
+

+Extension point for default handler to URI association. See +Extending GIO.

+
+
+
+

g_desktop_app_info_lookup_get_default_for_uri_scheme ()

+
GAppInfo *          g_desktop_app_info_lookup_get_default_for_uri_scheme
+                                                        (GDesktopAppInfoLookup *lookup,
+                                                         const char *uri_scheme);
+

+Gets the default application for launching applications +using this URI scheme for a particular GDesktopAppInfoLookup +implementation. +

+

+The GDesktopAppInfoLookup interface and this function is used +to implement g_app_info_get_default_for_uri_scheme() backends +in a GIO module. There is no reason for applications to use it +directly. Applications should use g_app_info_get_default_for_uri_scheme().

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

lookup :

a GDesktopAppInfoLookup +

uri_scheme :

a string containing a URI scheme. +

Returns :

GAppInfo for given uri_scheme or NULL on error. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-Extension-Points.html b/docs/reference/gio/html/gio-Extension-Points.html new file mode 100644 index 0000000..c85a5f3 --- /dev/null +++ b/docs/reference/gio/html/gio-Extension-Points.html @@ -0,0 +1,458 @@ + + + + +Extension Points + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Extension Points

+

Extension Points — Extension Points

+
+
+

Synopsis

+
+#include <gio.h>
+
+                    GIOExtension;
+                    GIOExtensionPoint;
+const char *        g_io_extension_get_name             (GIOExtension *extension);
+gint                g_io_extension_get_priority         (GIOExtension *extension);
+GType               g_io_extension_get_type             (GIOExtension *extension);
+GIOExtension *      g_io_extension_point_get_extension_by_name
+                                                        (GIOExtensionPoint *extension_point,
+                                                         const char *name);
+GList *             g_io_extension_point_get_extensions (GIOExtensionPoint *extension_point);
+GType               g_io_extension_point_get_required_type
+                                                        (GIOExtensionPoint *extension_point);
+GIOExtension *      g_io_extension_point_implement      (const char *extension_point_name,
+                                                         GType type,
+                                                         const char *extension_name,
+                                                         gint priority);
+GIOExtensionPoint * g_io_extension_point_lookup         (const char *name);
+GIOExtensionPoint * g_io_extension_point_register       (const char *name);
+void                g_io_extension_point_set_required_type
+                                                        (GIOExtensionPoint *extension_point,
+                                                         GType type);
+GTypeClass*         g_io_extension_ref_class            (GIOExtension *extension);
+
+
+
+

Description

+

+GIOExtensionPoint provides a mechanism for modules to extend the +functionality of the library or application that loaded it in an +organized fashion. +

+

+An extension point is identified by a name, and it may optionally +require that any implementation must by of a certain type (or derived +thereof). Use g_io_extension_point_register() to register an +extension point, and g_io_extension_point_set_required_type() to +set a required type. +

+

+A module can implement an extension point by specifying the GType +that implements the functionality. Additionally, each implementation +of an extension point has a name, and a priority. Use +g_io_extension_point_implement() to implement an extension point. +

+

+

+
+ GIOExtensionPoint *ep;
+
+ /* Register an extension point */
+ ep = g_io_extension_point_register ("my-extension-point");
+ g_io_extension_point_set_required_type (ep, MY_TYPE_EXAMPLE);
+ 
+

+

+

+

+
+ /* Implement an extension point */
+ G_DEFINE_TYPE (MyExampleImpl, my_example_impl, MY_TYPE_EXAMPLE);
+ g_io_extension_point_implement ("my-extension-point",
+                                 my_example_impl_get_type (),
+                                 "my-example",
+                                 10);
+ 
+

+

+

+ It is up to the code that registered the extension point how + it uses the implementations that have been associated with it. + Depending on the use case, it may use all implementations, or + only the one with the highest priority, or pick a specific + one by name.

+
+
+

Details

+
+

GIOExtension

+
typedef struct _GIOExtension GIOExtension;
+

+

+
+
+
+

GIOExtensionPoint

+
typedef struct _GIOExtensionPoint GIOExtensionPoint;
+

+

+
+
+
+

g_io_extension_get_name ()

+
const char *        g_io_extension_get_name             (GIOExtension *extension);
+

+Gets the name under which extension was registered. +

+

+Note that the same type may be registered as extension +for multiple extension points, under different names.

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

extension :

a GIOExtension +

Returns :

the name of extension. +
+
+
+
+

g_io_extension_get_priority ()

+
gint                g_io_extension_get_priority         (GIOExtension *extension);
+

+Gets the priority with which extension was registered.

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

extension :

a GIOExtension +

Returns :

the priority of extension +
+
+
+
+

g_io_extension_get_type ()

+
GType               g_io_extension_get_type             (GIOExtension *extension);
+

+Gets the type associated with extension.

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

extension :

a GIOExtension +

Returns :

the type of extension +
+
+
+
+

g_io_extension_point_get_extension_by_name ()

+
GIOExtension *      g_io_extension_point_get_extension_by_name
+                                                        (GIOExtensionPoint *extension_point,
+                                                         const char *name);
+

+Finds a GIOExtension for an extension point by name.

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

extension_point :

a GIOExtensionPoint +

name :

the name of the extension to get +

Returns :

the GIOExtension for extension_point that has the + given name, or NULL if there is no extension with that name +
+
+
+
+

g_io_extension_point_get_extensions ()

+
GList *             g_io_extension_point_get_extensions (GIOExtensionPoint *extension_point);
+

+Gets a list of all extensions that implement this extension point. +The list is sorted by priority, beginning with the highest priority.

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

extension_point :

a GIOExtensionPoint +

Returns :

a GList of GIOExtensions. The list is owned by + GIO and should not be modified +
+
+
+
+

g_io_extension_point_get_required_type ()

+
GType               g_io_extension_point_get_required_type
+                                                        (GIOExtensionPoint *extension_point);
+

+Gets the required type for extension_point.

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

extension_point :

a GIOExtensionPoint +

Returns :

the GType that all implementations must have, + or G_TYPE_INVALID if the extension point has no required type +
+
+
+
+

g_io_extension_point_implement ()

+
GIOExtension *      g_io_extension_point_implement      (const char *extension_point_name,
+                                                         GType type,
+                                                         const char *extension_name,
+                                                         gint priority);
+

+Registers type as extension for the extension point with name +extension_point_name. +

+

+If type has already been registered as an extension for this +extension point, the existing GIOExtension object is returned.

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

extension_point_name :

the name of the extension point +

type :

the GType to register as extension +

extension_name :

the name for the extension +

priority :

the priority for the extension +

Returns :

a GIOExtension object for GType +
+
+
+
+

g_io_extension_point_lookup ()

+
GIOExtensionPoint * g_io_extension_point_lookup         (const char *name);
+

+Looks up an existing extension point.

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

name :

the name of the extension point +

Returns :

the GIOExtensionPoint, or NULL if there is no + registered extension point with the given name +
+
+
+
+

g_io_extension_point_register ()

+
GIOExtensionPoint * g_io_extension_point_register       (const char *name);
+

+Registers an extension point.

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

name :

The name of the extension point +

Returns :

the new GIOExtensionPoint. This object is owned by GIO + and should not be freed +
+
+
+
+

g_io_extension_point_set_required_type ()

+
void                g_io_extension_point_set_required_type
+                                                        (GIOExtensionPoint *extension_point,
+                                                         GType type);
+

+Sets the required type for extension_point to type. +All implementations must henceforth have this type.

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

extension_point :

a GIOExtensionPoint +

type :

the GType to require +
+
+
+
+

g_io_extension_ref_class ()

+
GTypeClass*         g_io_extension_ref_class            (GIOExtension *extension);
+

+Gets a reference to the class for the type that is +associated with extension.

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

extension :

a GIOExtension +

Returns :

the GTypeClass for the type of extension +
+
+
+
+

See Also

+Extending GIO +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GContentType.html b/docs/reference/gio/html/gio-GContentType.html new file mode 100644 index 0000000..596f2f3 --- /dev/null +++ b/docs/reference/gio/html/gio-GContentType.html @@ -0,0 +1,399 @@ + + + + +GContentType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GContentType

+

GContentType — Platform-specific content typing

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+gboolean            g_content_type_equals               (const char *type1,
+                                                         const char *type2);
+gboolean            g_content_type_is_a                 (const char *type,
+                                                         const char *supertype);
+gboolean            g_content_type_is_unknown           (const char *type);
+char *              g_content_type_get_description      (const char *type);
+char *              g_content_type_get_mime_type        (const char *type);
+GIcon *             g_content_type_get_icon             (const char *type);
+gboolean            g_content_type_can_be_executable    (const char *type);
+char *              g_content_type_from_mime_type       (const char *mime_type);
+char *              g_content_type_guess                (const char *filename,
+                                                         const guchar *data,
+                                                         gsize data_size,
+                                                         gboolean *result_uncertain);
+char **             g_content_type_guess_for_tree       (GFile *root);
+GList *             g_content_types_get_registered      (void);
+
+
+
+

Description

+

+A content type is a platform specific string that defines the type +of a file. On unix it is a mime type, on win32 it is an extension string +like ".doc", ".txt" or a percieved string like "audio". Such strings +can be looked up in the registry at HKEY_CLASSES_ROOT.

+
+
+

Details

+
+

g_content_type_equals ()

+
gboolean            g_content_type_equals               (const char *type1,
+                                                         const char *type2);
+

+Compares two content types for equality.

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

type1 :

a content type string. +

type2 :

a content type string. +

Returns :

TRUE if the two strings are identical or equivalent, +FALSE otherwise. +
+
+
+
+

g_content_type_is_a ()

+
gboolean            g_content_type_is_a                 (const char *type,
+                                                         const char *supertype);
+

+Determines if type is a subset of supertype.

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

type :

a content type string. +

supertype :

a string. +

Returns :

TRUE if type is a kind of supertype, +FALSE otherwise. +
+
+
+
+

g_content_type_is_unknown ()

+
gboolean            g_content_type_is_unknown           (const char *type);
+

+Checks if the content type is the generic "unknown" type. +On unix this is the "application/octet-stream" mimetype, +while on win32 it is "*".

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

type :

a content type string. +

Returns :

TRUE if the type is the unknown type. +
+
+
+
+

g_content_type_get_description ()

+
char *              g_content_type_get_description      (const char *type);
+

+Gets the human readable description of the content type.

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

type :

a content type string. +

Returns :

a short description of the content type type. +
+
+
+
+

g_content_type_get_mime_type ()

+
char *              g_content_type_get_mime_type        (const char *type);
+

+Gets the mime-type for the content type. If one is registered

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

type :

a content type string. +

Returns :

the registered mime-type for the given type, or NULL if unknown. +
+
+
+
+

g_content_type_get_icon ()

+
GIcon *             g_content_type_get_icon             (const char *type);
+

+Gets the icon for a content type.

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

type :

a content type string. +

Returns :

GIcon corresponding to the content type. +
+
+
+
+

g_content_type_can_be_executable ()

+
gboolean            g_content_type_can_be_executable    (const char *type);
+

+Checks if a content type can be executable. Note that for instance +things like text files can be executables (i.e. scripts and batch files).

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

type :

a content type string. +

Returns :

TRUE if the file type corresponds to a type that +can be executable, FALSE otherwise. +
+
+
+
+

g_content_type_from_mime_type ()

+
char *              g_content_type_from_mime_type       (const char *mime_type);
+

+Tries to find a content type based on the mime type name.

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

mime_type :

a mime type string. +

Returns :

Newly allocated string with content type or NULL when does not know. + +
+

Since 2.18

+
+
+
+

g_content_type_guess ()

+
char *              g_content_type_guess                (const char *filename,
+                                                         const guchar *data,
+                                                         gsize data_size,
+                                                         gboolean *result_uncertain);
+

+Guesses the content type based on example data. If the function is +uncertain, result_uncertain will be set to TRUE. Either filename +or data may be NULL, in which case the guess will be based solely +on the other argument.

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

filename :

a string, or NULL +

data :

a stream of data, or NULL +

data_size :

the size of data +

result_uncertain :

a flag indicating the certainty of the result +

Returns :

a string indicating a guessed content type for the +given data. +
+
+
+
+

g_content_type_guess_for_tree ()

+
char **             g_content_type_guess_for_tree       (GFile *root);
+

+Tries to guess the type of the tree with root root, by +looking at the files it contains. The result is an array +of content types, with the best guess coming first. +

+

+The types returned all have the form x-content/foo, e.g. +x-content/audio-cdda (for audio CDs) or x-content/image-dcf +(for a camera memory card). See the shared-mime-info +specification for more on x-content types. +

+

+This function is useful in the implementation of g_mount_guess_content_type().

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

root :

the root of the tree to guess a type for +

Returns :

an NULL-terminated array of zero or more content types, or NULL. + Free with g_strfreev() + +
+

Since 2.18

+
+
+
+

g_content_types_get_registered ()

+
GList *             g_content_types_get_registered      (void);
+

+Gets a list of strings containing all the registered content types +known to the system. The list and its data should be freed using +g_list_foreach(list, g_free, NULL) and g_list_free(list)

+
++ + + + +

Returns :

GList of the registered content types. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GConverterInputstream.html b/docs/reference/gio/html/gio-GConverterInputstream.html new file mode 100644 index 0000000..97ccf05 --- /dev/null +++ b/docs/reference/gio/html/gio-GConverterInputstream.html @@ -0,0 +1,189 @@ + + + + +GConverterInputstream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GConverterInputstream

+

GConverterInputstream — Converter Input Stream

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GConverterInputStream;
+GInputStream *      g_converter_input_stream_new        (GInputStream *base_stream,
+                                                         GConverter *converter);
+GConverter *        g_converter_input_stream_get_converter
+                                                        (GConverterInputStream *converter_stream);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GInputStream
+         +----GFilterInputStream
+               +----GConverterInputStream
+
+
+
+

Properties

+
+  "converter"                GConverter*           : Read / Write / Construct Only
+
+
+
+

Description

+

+Converter input stream implements GInputStream and allows +conversion of data of various types during reading.

+
+
+

Details

+
+

GConverterInputStream

+
typedef struct _GConverterInputStream GConverterInputStream;
+

+An implementation of GFilterInputStream that allows data +conversion.

+
++ +
+
+
+
+

g_converter_input_stream_new ()

+
GInputStream *      g_converter_input_stream_new        (GInputStream *base_stream,
+                                                         GConverter *converter);
+

+Creates a new converter input stream for the base_stream.

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

base_stream :

a GInputStream +

converter :

a GConverter +

Returns :

a new GInputStream. +
+
+
+
+

g_converter_input_stream_get_converter ()

+
GConverter *        g_converter_input_stream_get_converter
+                                                        (GConverterInputStream *converter_stream);
+

+Gets the GConverter that is used by converter_stream.

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

converter_stream :

a GConverterInputStream +

Returns :

the converter of the converter input stream + +
+

Since 2.24

+
+
+
+

Property Details

+
+

The "converter" property

+
  "converter"                GConverter*           : Read / Write / Construct Only
+

The converter object.

+
+
+
+

See Also

+GInputStream, GConverter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GConverterOutputstream.html b/docs/reference/gio/html/gio-GConverterOutputstream.html new file mode 100644 index 0000000..65f30d0 --- /dev/null +++ b/docs/reference/gio/html/gio-GConverterOutputstream.html @@ -0,0 +1,189 @@ + + + + +GConverterOutputstream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GConverterOutputstream

+

GConverterOutputstream — Converter Output Stream

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GConverterOutputStream;
+GOutputStream *     g_converter_output_stream_new       (GOutputStream *base_stream,
+                                                         GConverter *converter);
+GConverter *        g_converter_output_stream_get_converter
+                                                        (GConverterOutputStream *converter_stream);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GOutputStream
+         +----GFilterOutputStream
+               +----GConverterOutputStream
+
+
+
+

Properties

+
+  "converter"                GConverter*           : Read / Write / Construct Only
+
+
+
+

Description

+

+Converter output stream implements GOutputStream and allows +conversion of data of various types during reading.

+
+
+

Details

+
+

GConverterOutputStream

+
typedef struct _GConverterOutputStream GConverterOutputStream;
+

+An implementation of GFilterOutputStream that allows data +conversion.

+
++ +
+
+
+
+

g_converter_output_stream_new ()

+
GOutputStream *     g_converter_output_stream_new       (GOutputStream *base_stream,
+                                                         GConverter *converter);
+

+Creates a new converter output stream for the base_stream.

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

base_stream :

a GOutputStream +

converter :

a GConverter +

Returns :

a new GOutputStream. +
+
+
+
+

g_converter_output_stream_get_converter ()

+
GConverter *        g_converter_output_stream_get_converter
+                                                        (GConverterOutputStream *converter_stream);
+

+Gets the GConverter that is used by converter_stream.

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

converter_stream :

a GConverterOutputStream +

Returns :

the converter of the converter output stream + +
+

Since 2.24

+
+
+
+

Property Details

+
+

The "converter" property

+
  "converter"                GConverter*           : Read / Write / Construct Only
+

The converter object.

+
+
+
+

See Also

+GOutputStream, GConverter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GFileAttribute.html b/docs/reference/gio/html/gio-GFileAttribute.html new file mode 100644 index 0000000..5ba1a8b --- /dev/null +++ b/docs/reference/gio/html/gio-GFileAttribute.html @@ -0,0 +1,944 @@ + + + + +GFileAttribute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GFileAttribute

+

GFileAttribute — Key-Value Paired File Attributes

+
+ +
+

Description

+

+File attributes in GIO consist of a list of key-value pairs. +

+

+Keys are strings that contain a key namespace and a key name, separated +by a colon, e.g. "namespace:keyname". Namespaces are included to sort +key-value pairs by namespaces for relevance. Keys can be retrived +using wildcards, e.g. "standard::*" will return all of the keys in the +"standard" namespace. +

+

+Values are stored within the list in GFileAttributeValue structures. +Values can store different types, listed in the enum GFileAttributeType. +Upon creation of a GFileAttributeValue, the type will be set to +G_FILE_ATTRIBUTE_TYPE_INVALID. +

+

+The list of possible attributes for a filesystem (pointed to by a GFile) is +availible as a GFileAttributeInfoList. This list is queryable by key names +as indicated earlier. +

+

+Classes that implement GFileIface will create a GFileAttributeInfoList and +install default keys and values for their given file system, architecture, +and other possible implementation details (e.g., on a UNIX system, a file +attribute key will be registered for the user id for a given file). +

+

+

+

+

+
+

Table 1. GFileAttributes Default Namespaces

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamspaceDescription
"standard"The "Standard" namespace. General file +information that any application may need should be put in this namespace. +Examples include the file's name, type, and size.
"etag"The "Entity Tag" +namespace. Currently, the only key in this namespace is "value", which contains +the value of the current entity tag.
"id"The "Identification" namespace. This +namespace is used by file managers and applications that list directories +to check for loops and to uniquely identify files.
"access"The "Access" namespace. Used to check +if a user has the proper privilidges to access files and perform +file operations. Keys in this namespace are made to be generic +and easily understood, e.g. the "can_read" key is TRUE if +the current user has permission to read the file. UNIX permissions and +NTFS ACLs in Windows should be mapped to these values.
"mountable"The "Mountable" namespace. Includes +simple boolean keys for checking if a file or path supports mount operations, e.g. +mount, unmount, eject. These are used for files of type G_FILE_TYPE_MOUNTABLE.
"time"The "Time" namespace. Includes file +access, changed, created times.
"unix"The "Unix" namespace. Includes UNIX-specific +information and may not be available for all files. Examples include +the UNIX "UID", "GID", etc.
"dos"The "DOS" namespace. Includes DOS-specific +information and may not be available for all files. Examples include +"is_system" for checking if a file is marked as a system file, and "is_archive" +for checking if a file is marked as an archive file.
"owner"The "Owner" namespace. Includes information +about who owns a file. May not be available for all file systems. Examples include +"user" for getting the user name of the file owner. This information is often mapped from +some backend specific data such as a unix UID.
"thumbnail"The "Thumbnail" namespace. Includes +information about file thumbnails and their location within the file system. Exaples of +keys in this namespace include "path" to get the location of a thumbnail, and "failed" +to check if thumbnailing of the file failed.
"filesystem"The "Filesystem" namespace. Gets information +about the file system where a file is located, such as its type, how much +space is left available, and the overall size of the file system.
"gvfs"The "GVFS" namespace. Keys in this namespace +contain information about the current GVFS backend in use.
"xattr"The "xattr" namespace. Gets information +about extended user attributes. See attr(5). The "user." prefix of the +extended user attribute name is stripped away when constructing keys in +this namespace, e.g. "xattr::mime_type" for the extended attribute with +the name "user.mime_type". Note that this information is only available +if GLib has been built with extended attribute support.
"xattr-sys"The "xattr-sys" namespace. +Gets information about extended attributes which are not user-specific. +See attr(5). Note that this information is only available if GLib +has been built with extended attribute support.
"selinux"The "SELinux" namespace. Includes +information about the SELinux context of files. Note that this information +is only available if GLib has been built with SELinux support.
+
+


+

+

+

+

+Please note that these are not all of the possible namespaces. +More namespaces can be added from GIO modules or by individual applications. +For more information about writing GIO modules, see GIOModule. +

+

+ +

+

+

+
+

Table 2. GFileAttributes Built-in Keys and Value Types

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Enum ValueNamespace:KeyValue Type
G_FILE_ATTRIBUTE_STANDARD_TYPEstandard::typeuint32 (GFileType)
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDENstandard::is-hiddenboolean
G_FILE_ATTRIBUTE_STANDARD_IS_BACKUPstandard::is-backupboolean
G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINKstandard::is-symlinkboolean
G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUALstandard::is-virtualboolean
G_FILE_ATTRIBUTE_STANDARD_NAMEstandard::namebyte string
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAMEstandard::display-namestring
G_FILE_ATTRIBUTE_STANDARD_EDIT_NAMEstandard::edit-namestring
G_FILE_ATTRIBUTE_STANDARD_ICONstandard::iconobject (GIcon)
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPEstandard::content-typestring
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPEstandard::fast-content-typestring
G_FILE_ATTRIBUTE_STANDARD_SIZEstandard::sizeuint64
G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZEstandard::allocated-sizeuint64
G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGETstandard::symlink-targetbyte string
G_FILE_ATTRIBUTE_STANDARD_TARGET_URIstandard::target-uristring
G_FILE_ATTRIBUTE_STANDARD_SORT_ORDERstandard::sort-orderint32
G_FILE_ATTRIBUTE_ETAG_VALUEetag::valuestring
G_FILE_ATTRIBUTE_ID_FILEid::filestring
G_FILE_ATTRIBUTE_ID_FILESYSTEMid::filesystemstring
G_FILE_ATTRIBUTE_ACCESS_CAN_READaccess::can-readboolean
G_FILE_ATTRIBUTE_ACCESS_CAN_WRITEaccess::can-writeboolean
G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTEaccess::can-executeboolean
G_FILE_ATTRIBUTE_ACCESS_CAN_DELETEaccess::can-deleteboolean
G_FILE_ATTRIBUTE_ACCESS_CAN_TRASHaccess::can-trashboolean
G_FILE_ATTRIBUTE_ACCESS_CAN_RENAMEaccess::can-renameboolean
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNTmountable::can-mountboolean
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNTmountable::can-unmountboolean
G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECTmountable::can-ejectboolean
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICEmountable::unix-deviceuint32
G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILEmountable::unix-device-filestring
G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDImountable::hal-udistring
G_FILE_ATTRIBUTE_TIME_MODIFIEDtime::modifieduint64
G_FILE_ATTRIBUTE_TIME_MODIFIED_USECtime::modified-usecuint32
G_FILE_ATTRIBUTE_TIME_ACCESStime::accessuint64
G_FILE_ATTRIBUTE_TIME_ACCESS_USECtime::access-usecuint32
G_FILE_ATTRIBUTE_TIME_CHANGEDtime::changeduint64
G_FILE_ATTRIBUTE_TIME_CHANGED_USECtime::changed-usecuint32
G_FILE_ATTRIBUTE_TIME_CREATEDtime::createduint64
G_FILE_ATTRIBUTE_TIME_CREATED_USECtime::created-usecuint32
G_FILE_ATTRIBUTE_UNIX_DEVICEunix::deviceuint32
G_FILE_ATTRIBUTE_UNIX_INODEunix::inodeuint64
G_FILE_ATTRIBUTE_UNIX_MODEunix::modeuint32
G_FILE_ATTRIBUTE_UNIX_NLINKunix::nlinkuint32
G_FILE_ATTRIBUTE_UNIX_UIDunix::uiduint32
G_FILE_ATTRIBUTE_UNIX_GIDunix::giduint32
G_FILE_ATTRIBUTE_UNIX_RDEVunix::rdevuint32
G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZEunix::block-sizeuint32
G_FILE_ATTRIBUTE_UNIX_BLOCKSunix::blocksuint64
G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINTunix::is-mountpointboolean
G_FILE_ATTRIBUTE_DOS_IS_ARCHIVEdos::is-archiveboolean
G_FILE_ATTRIBUTE_DOS_IS_SYSTEMdos::is-systemboolean
G_FILE_ATTRIBUTE_OWNER_USERowner::userstring
G_FILE_ATTRIBUTE_OWNER_USER_REALowner::user-realstring
G_FILE_ATTRIBUTE_OWNER_GROUPowner::groupstring
G_FILE_ATTRIBUTE_THUMBNAIL_PATHthumbnail::pathbytestring
G_FILE_ATTRIBUTE_THUMBNAILING_FAILEDthumbnail::failedboolean
G_FILE_ATTRIBUTE_PREVIEW_ICONpreview::iconobject (GIcon)
G_FILE_ATTRIBUTE_FILESYSTEM_SIZEfilesystem::sizeuint64
G_FILE_ATTRIBUTE_FILESYSTEM_FREEfilesystem::freeuint64
G_FILE_ATTRIBUTE_FILESYSTEM_TYPEfilesystem::typestring
G_FILE_ATTRIBUTE_FILESYSTEM_READONLYfilesystem::readonlyboolean
G_FILE_ATTRIBUTE_GVFS_BACKENDgvfs::backendstring
G_FILE_ATTRIBUTE_SELINUX_CONTEXTselinux::contextstring
+
+


+

+ +Note that there are no predefined keys in the "xattr" and "xattr-sys" +namespaces. Keys for the "xattr" namespace are constructed by stripping +away the "user." prefix from the extended user attribute, and prepending +"xattr::". Keys for the "xattr-sys" namespace are constructed by +concatenating "xattr-sys::" with the extended attribute name. All extended +attribute values are returned as hex-encoded strings in which bytes outside +the ASCII range are encoded as hexadecimal escape sequences of the form +\xnn.

+
+
+

Details

+
+

enum GFileAttributeType

+
typedef enum {
+  G_FILE_ATTRIBUTE_TYPE_INVALID = 0,
+  G_FILE_ATTRIBUTE_TYPE_STRING,
+  G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, /* zero terminated string of non-zero bytes */
+  G_FILE_ATTRIBUTE_TYPE_BOOLEAN,
+  G_FILE_ATTRIBUTE_TYPE_UINT32,
+  G_FILE_ATTRIBUTE_TYPE_INT32,
+  G_FILE_ATTRIBUTE_TYPE_UINT64,
+  G_FILE_ATTRIBUTE_TYPE_INT64,
+  G_FILE_ATTRIBUTE_TYPE_OBJECT,
+  G_FILE_ATTRIBUTE_TYPE_STRINGV
+} GFileAttributeType;
+
+

+The data types for file attributes.

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

G_FILE_ATTRIBUTE_TYPE_INVALID

indicates an invalid or uninitalized type. +

G_FILE_ATTRIBUTE_TYPE_STRING

a null terminated UTF8 string. +

G_FILE_ATTRIBUTE_TYPE_BYTE_STRING

a zero terminated string of non-zero bytes. +

G_FILE_ATTRIBUTE_TYPE_BOOLEAN

a boolean value. +

G_FILE_ATTRIBUTE_TYPE_UINT32

an unsigned 4-byte/32-bit integer. +

G_FILE_ATTRIBUTE_TYPE_INT32

a signed 4-byte/32-bit integer. +

G_FILE_ATTRIBUTE_TYPE_UINT64

an unsigned 8-byte/64-bit integer. +

G_FILE_ATTRIBUTE_TYPE_INT64

a signed 8-byte/64-bit integer. +

G_FILE_ATTRIBUTE_TYPE_OBJECT

a GObject. +

G_FILE_ATTRIBUTE_TYPE_STRINGV

a NULL terminated char **. Since 2.22 +
+
+
+
+

enum GFileAttributeInfoFlags

+
typedef enum {
+  G_FILE_ATTRIBUTE_INFO_NONE            = 0,
+  G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE  = (1 << 0),
+  G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED = (1 << 1)
+} GFileAttributeInfoFlags;
+
+

+Flags specifying the behaviour of an attribute.

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

G_FILE_ATTRIBUTE_INFO_NONE

no flags set. +

G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE

copy the attribute values when the file is copied. +

G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED

copy the attribute values when the file is moved. +
+
+
+
+

enum GFileAttributeStatus

+
typedef enum {
+  G_FILE_ATTRIBUTE_STATUS_UNSET = 0,
+  G_FILE_ATTRIBUTE_STATUS_SET,
+  G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING
+} GFileAttributeStatus;
+
+

+Used by g_file_set_attributes_from_info() when setting file attributes.

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

G_FILE_ATTRIBUTE_STATUS_UNSET

Attribute value is unset (empty). +

G_FILE_ATTRIBUTE_STATUS_SET

Attribute value is set. +

G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING

Indicates an error in setting the value. +
+
+
+
+

GFileAttributeInfo

+
typedef struct {
+  char                    *name;
+  GFileAttributeType       type;
+  GFileAttributeInfoFlags  flags;
+} GFileAttributeInfo;
+
+

+Information about a specific attribute.

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

char *name;

the name of the attribute. +

GFileAttributeType type;

the GFileAttributeType type of the attribute. +

GFileAttributeInfoFlags flags;

a set of GFileAttributeInfoFlags. +
+
+
+
+

GFileAttributeInfoList

+
typedef struct {
+  GFileAttributeInfo *infos;
+  int                 n_infos;
+} GFileAttributeInfoList;
+
+

+Acts as a lightweight registry for possible valid file attributes. +The registry stores Key-Value pair formats as GFileAttributeInfos.

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

GFileAttributeInfo *infos;

an array of GFileAttributeInfos. +

int n_infos;

the number of values in the array. +
+
+
+
+

g_file_attribute_info_list_new ()

+
GFileAttributeInfoList * g_file_attribute_info_list_new (void);
+

+Creates a new file attribute info list.

+
++ + + + +

Returns :

a GFileAttributeInfoList. +
+
+
+
+

g_file_attribute_info_list_ref ()

+
GFileAttributeInfoList * g_file_attribute_info_list_ref (GFileAttributeInfoList *list);
+

+References a file attribute info list.

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

list :

a GFileAttributeInfoList to reference. +

Returns :

GFileAttributeInfoList or NULL on error. +
+
+
+
+

g_file_attribute_info_list_unref ()

+
void                g_file_attribute_info_list_unref    (GFileAttributeInfoList *list);
+

+Removes a reference from the given list. If the reference count +falls to zero, the list is deleted.

+
++ + + + +

list :

The GFileAttributeInfoList to unreference. +
+
+
+
+

g_file_attribute_info_list_dup ()

+
GFileAttributeInfoList * g_file_attribute_info_list_dup (GFileAttributeInfoList *list);
+

+Makes a duplicate of a file attribute info list.

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

list :

a GFileAttributeInfoList to duplicate. +

Returns :

a copy of the given list. +
+
+
+
+

g_file_attribute_info_list_lookup ()

+
const GFileAttributeInfo * g_file_attribute_info_list_lookup
+                                                        (GFileAttributeInfoList *list,
+                                                         const char *name);
+

+Gets the file attribute with the name name from list.

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

list :

a GFileAttributeInfoList. +

name :

the name of the attribute to lookup. +

Returns :

a GFileAttributeInfo for the name, or NULL if an +attribute isn't found. +
+
+
+
+

g_file_attribute_info_list_add ()

+
void                g_file_attribute_info_list_add      (GFileAttributeInfoList *list,
+                                                         const char *name,
+                                                         GFileAttributeType type,
+                                                         GFileAttributeInfoFlags flags);
+

+Adds a new attribute with name to the list, setting +its type and flags.

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

list :

a GFileAttributeInfoList. +

name :

the name of the attribute to add. +

type :

the GFileAttributeType for the attribute. +

flags :

GFileAttributeInfoFlags for the attribute. +
+
+
+
+

See Also

+GFile, GFileInfo +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GIOError.html b/docs/reference/gio/html/gio-GIOError.html new file mode 100644 index 0000000..4828e94 --- /dev/null +++ b/docs/reference/gio/html/gio-GIOError.html @@ -0,0 +1,354 @@ + + + + +GIOError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GIOError

+

GIOError — Error helper functions

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+#define             G_IO_ERROR
+enum                GIOErrorEnum;
+GIOErrorEnum        g_io_error_from_errno               (gint err_no);
+
+
+
+

Description

+

+Contains helper functions for reporting errors to the user.

+
+
+

Details

+
+

G_IO_ERROR

+
#define G_IO_ERROR g_io_error_quark()
+
+

+Error domain for GIO. Errors in this domain will be from the GIOErrorEnum enumeration. +See GError for more information on error domains.

+
+
+
+

enum GIOErrorEnum

+
typedef enum {
+  G_IO_ERROR_FAILED,
+  G_IO_ERROR_NOT_FOUND,
+  G_IO_ERROR_EXISTS,
+  G_IO_ERROR_IS_DIRECTORY,
+  G_IO_ERROR_NOT_DIRECTORY,
+  G_IO_ERROR_NOT_EMPTY,
+  G_IO_ERROR_NOT_REGULAR_FILE,
+  G_IO_ERROR_NOT_SYMBOLIC_LINK,
+  G_IO_ERROR_NOT_MOUNTABLE_FILE,
+  G_IO_ERROR_FILENAME_TOO_LONG,
+  G_IO_ERROR_INVALID_FILENAME,
+  G_IO_ERROR_TOO_MANY_LINKS,
+  G_IO_ERROR_NO_SPACE,
+  G_IO_ERROR_INVALID_ARGUMENT,
+  G_IO_ERROR_PERMISSION_DENIED,
+  G_IO_ERROR_NOT_SUPPORTED,
+  G_IO_ERROR_NOT_MOUNTED,
+  G_IO_ERROR_ALREADY_MOUNTED,
+  G_IO_ERROR_CLOSED,
+  G_IO_ERROR_CANCELLED,
+  G_IO_ERROR_PENDING,
+  G_IO_ERROR_READ_ONLY,
+  G_IO_ERROR_CANT_CREATE_BACKUP,
+  G_IO_ERROR_WRONG_ETAG,
+  G_IO_ERROR_TIMED_OUT,
+  G_IO_ERROR_WOULD_RECURSE,
+  G_IO_ERROR_BUSY,
+  G_IO_ERROR_WOULD_BLOCK,
+  G_IO_ERROR_HOST_NOT_FOUND,
+  G_IO_ERROR_WOULD_MERGE,
+  G_IO_ERROR_FAILED_HANDLED,
+  G_IO_ERROR_TOO_MANY_OPEN_FILES,
+  G_IO_ERROR_NOT_INITIALIZED,
+  G_IO_ERROR_ADDRESS_IN_USE,
+  G_IO_ERROR_PARTIAL_INPUT,
+  G_IO_ERROR_INVALID_DATA
+} GIOErrorEnum;
+
+

+Error codes returned by GIO functions.

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

G_IO_ERROR_FAILED

Generic error condition for when any operation fails. +

G_IO_ERROR_NOT_FOUND

File not found error. +

G_IO_ERROR_EXISTS

File already exists error. +

G_IO_ERROR_IS_DIRECTORY

File is a directory error. +

G_IO_ERROR_NOT_DIRECTORY

File is not a directory. +

G_IO_ERROR_NOT_EMPTY

File is a directory that isn't empty. +

G_IO_ERROR_NOT_REGULAR_FILE

File is not a regular file. +

G_IO_ERROR_NOT_SYMBOLIC_LINK

File is not a symbolic link. +

G_IO_ERROR_NOT_MOUNTABLE_FILE

File cannot be mounted. +

G_IO_ERROR_FILENAME_TOO_LONG

Filename is too many characters. +

G_IO_ERROR_INVALID_FILENAME

Filename is invalid or contains invalid characters. +

G_IO_ERROR_TOO_MANY_LINKS

File contains too many symbolic links. +

G_IO_ERROR_NO_SPACE

No space left on drive. +

G_IO_ERROR_INVALID_ARGUMENT

Invalid argument. +

G_IO_ERROR_PERMISSION_DENIED

Permission denied. +

G_IO_ERROR_NOT_SUPPORTED

Operation not supported for the current backend. +

G_IO_ERROR_NOT_MOUNTED

File isn't mounted. +

G_IO_ERROR_ALREADY_MOUNTED

File is already mounted. +

G_IO_ERROR_CLOSED

File was closed. +

G_IO_ERROR_CANCELLED

Operation was cancelled. See GCancellable. +

G_IO_ERROR_PENDING

Operations are still pending. +

G_IO_ERROR_READ_ONLY

File is read only. +

G_IO_ERROR_CANT_CREATE_BACKUP

Backup couldn't be created. +

G_IO_ERROR_WRONG_ETAG

File's Entity Tag was incorrect. +

G_IO_ERROR_TIMED_OUT

Operation timed out. +

G_IO_ERROR_WOULD_RECURSE

Operation would be recursive. +

G_IO_ERROR_BUSY

File is busy. +

G_IO_ERROR_WOULD_BLOCK

Operation would block. +

G_IO_ERROR_HOST_NOT_FOUND

Host couldn't be found (remote operations). +

G_IO_ERROR_WOULD_MERGE

Operation would merge files. +

G_IO_ERROR_FAILED_HANDLED

Operation failed and a helper program has + already interacted with the user. Do not display any error dialog. +

G_IO_ERROR_TOO_MANY_OPEN_FILES

The current process has too many files + open and can't open any more. Duplicate descriptors do count toward + this limit. Since 2.20 +

G_IO_ERROR_NOT_INITIALIZED

The object has not been initialized. Since 2.22 +

G_IO_ERROR_ADDRESS_IN_USE

The requested address is already in use. Since 2.22 +

G_IO_ERROR_PARTIAL_INPUT

Need more input to finish operation. Since 2.24 +

G_IO_ERROR_INVALID_DATA

There input data was invalid. Since 2.24 +
+
+
+
+

g_io_error_from_errno ()

+
GIOErrorEnum        g_io_error_from_errno               (gint err_no);
+

+Converts errno.h error codes into GIO error codes.

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

err_no :

Error number as defined in errno.h. +

Returns :

GIOErrorEnum value for the given errno.h error number. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GIOScheduler.html b/docs/reference/gio/html/gio-GIOScheduler.html new file mode 100644 index 0000000..2d59a87 --- /dev/null +++ b/docs/reference/gio/html/gio-GIOScheduler.html @@ -0,0 +1,319 @@ + + + + +GIOScheduler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GIOScheduler

+

GIOScheduler — I/O Scheduler

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GIOSchedulerJob;
+gboolean            (*GIOSchedulerJobFunc)              (GIOSchedulerJob *job,
+                                                         GCancellable *cancellable,
+                                                         gpointer user_data);
+void                g_io_scheduler_push_job             (GIOSchedulerJobFunc job_func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify,
+                                                         gint io_priority,
+                                                         GCancellable *cancellable);
+void                g_io_scheduler_cancel_all_jobs      (void);
+gboolean            g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job,
+                                                         GSourceFunc func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify);
+void                g_io_scheduler_job_send_to_mainloop_async
+                                                        (GIOSchedulerJob *job,
+                                                         GSourceFunc func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify);
+
+
+
+

Description

+

+Schedules asynchronous I/O operations. GIOScheduler integrates +into the main event loop (GMainLoop) and may use threads if they +are available. +

+

+

+

+Each I/O operation has a priority, and the scheduler uses the priorities +to determine the order in which operations are executed. They are +not used to determine system-wide I/O scheduling. +Priorities are integers, with lower numbers indicating higher priority. +It is recommended to choose priorities between G_PRIORITY_LOW and +G_PRIORITY_HIGH, with G_PRIORITY_DEFAULT as a default. +

+
+
+

Details

+
+

GIOSchedulerJob

+
typedef struct _GIOSchedulerJob GIOSchedulerJob;
+

+Opaque class for definining and scheduling IO jobs.

+
+
+
+

GIOSchedulerJobFunc ()

+
gboolean            (*GIOSchedulerJobFunc)              (GIOSchedulerJob *job,
+                                                         GCancellable *cancellable,
+                                                         gpointer user_data);
+

+I/O Job function. +

+

+Note that depending on whether threads are available, the +GIOScheduler may run jobs in separate threads or in an idle +in the mainloop. +

+

+Long-running jobs should periodically check the cancellable +to see if they have been cancelled.

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

job :

a GIOSchedulerJob. +

cancellable :

optional GCancellable object, NULL to ignore. +

user_data :

the data to pass to callback function +

Returns :

TRUE if this function should be called again to + complete the job, FALSE if the job is complete (or cancelled) +
+
+
+
+

g_io_scheduler_push_job ()

+
void                g_io_scheduler_push_job             (GIOSchedulerJobFunc job_func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify,
+                                                         gint io_priority,
+                                                         GCancellable *cancellable);
+

+Schedules the I/O job to run. +

+

+notify will be called on user_data after job_func has returned, +regardless whether the job was cancelled or has run to completion. +

+

+If cancellable is not NULL, it can be used to cancel the I/O job +by calling g_cancellable_cancel() or by calling +g_io_scheduler_cancel_all_jobs().

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

job_func :

a GIOSchedulerJobFunc. +

user_data :

data to pass to job_func +

notify :

a GDestroyNotify for user_data, or NULL +

io_priority :

the I/O priority +of the request. +

cancellable :

optional GCancellable object, NULL to ignore. +
+
+
+
+

g_io_scheduler_cancel_all_jobs ()

+
void                g_io_scheduler_cancel_all_jobs      (void);
+

+Cancels all cancellable I/O jobs. +

+

+A job is cancellable if a GCancellable was passed into +g_io_scheduler_push_job().

+
+
+
+

g_io_scheduler_job_send_to_mainloop ()

+
gboolean            g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job,
+                                                         GSourceFunc func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify);
+

+Used from an I/O job to send a callback to be run in the thread +that the job was started from, waiting for the result (and thus +blocking the I/O job).

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

job :

a GIOSchedulerJob +

func :

a GSourceFunc callback that will be called in the original thread +

user_data :

data to pass to func +

notify :

a GDestroyNotify for user_data, or NULL +

Returns :

The return value of func +
+
+
+
+

g_io_scheduler_job_send_to_mainloop_async ()

+
void                g_io_scheduler_job_send_to_mainloop_async
+                                                        (GIOSchedulerJob *job,
+                                                         GSourceFunc func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify);
+

+Used from an I/O job to send a callback to be run asynchronously in +the thread that the job was started from. The callback will be run +when the main loop is available, but at that time the I/O job might +have finished. The return value from the callback is ignored. +

+

+Note that if you are passing the user_data from g_io_scheduler_push_job() +on to this function you have to ensure that it is not freed before +func is called, either by passing NULL as notify to +g_io_scheduler_push_job() or by using refcounting for user_data.

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

job :

a GIOSchedulerJob +

func :

a GSourceFunc callback that will be called in the original thread +

user_data :

data to pass to func +

notify :

a GDestroyNotify for user_data, or NULL +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-GSrvTarget.html b/docs/reference/gio/html/gio-GSrvTarget.html new file mode 100644 index 0000000..f44bf04 --- /dev/null +++ b/docs/reference/gio/html/gio-GSrvTarget.html @@ -0,0 +1,333 @@ + + + + +GSrvTarget + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GSrvTarget

+

GSrvTarget — DNS SRV record target

+
+
+

Synopsis

+
+#include <gio/gio.h>
+
+                    GSrvTarget;
+GSrvTarget *        g_srv_target_new                    (const gchar *hostname,
+                                                         guint16 port,
+                                                         guint16 priority,
+                                                         guint16 weight);
+GSrvTarget *        g_srv_target_copy                   (GSrvTarget *target);
+void                g_srv_target_free                   (GSrvTarget *target);
+const gchar *       g_srv_target_get_hostname           (GSrvTarget *target);
+guint16             g_srv_target_get_port               (GSrvTarget *target);
+guint16             g_srv_target_get_priority           (GSrvTarget *target);
+guint16             g_srv_target_get_weight             (GSrvTarget *target);
+GList *             g_srv_target_list_sort              (GList *targets);
+
+
+
+

Description

+

+SRV (service) records are used by some network protocols to provide +service-specific aliasing and load-balancing. For example, XMPP +(Jabber) uses SRV records to locate the XMPP server for a domain; +rather than connecting directly to "example.com" or assuming a +specific server hostname like "xmpp.example.com", an XMPP client +would look up the "xmpp-client" SRV record for "example.com", and +then connect to whatever host was pointed to by that record. +

+

+You can use g_resolver_lookup_service() or +g_resolver_lookup_service_async() to find the GSrvTargets +for a given service. However, if you are simply planning to connect +to the remote service, you can use GNetworkService's +GSocketConnectable interface and not need to worry about +GSrvTarget at all.

+
+
+

Details

+
+

GSrvTarget

+
typedef struct _GSrvTarget GSrvTarget;
+

+A single target host/port that a network service is running on.

+
+
+
+

g_srv_target_new ()

+
GSrvTarget *        g_srv_target_new                    (const gchar *hostname,
+                                                         guint16 port,
+                                                         guint16 priority,
+                                                         guint16 weight);
+

+Creates a new GSrvTarget with the given parameters. +

+

+You should not need to use this; normally GSrvTargets are +created by GResolver.

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

hostname :

the host that the service is running on +

port :

the port that the service is running on +

priority :

the target's priority +

weight :

the target's weight +

Returns :

a new GSrvTarget. + +
+

Since 2.22

+
+
+
+

g_srv_target_copy ()

+
GSrvTarget *        g_srv_target_copy                   (GSrvTarget *target);
+

+Copies target

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

target :

a GSrvTarget +

Returns :

a copy of target + +
+

Since 2.22

+
+
+
+

g_srv_target_free ()

+
void                g_srv_target_free                   (GSrvTarget *target);
+

+Frees target

+
++ + + + +

target :

a GSrvTarget +
+

Since 2.22

+
+
+
+

g_srv_target_get_hostname ()

+
const gchar *       g_srv_target_get_hostname           (GSrvTarget *target);
+

+Gets target's hostname (in ASCII form; if you are going to present +this to the user, you should use g_hostname_is_ascii_encoded() to +check if it contains encoded Unicode segments, and use +g_hostname_to_unicode() to convert it if it does.)

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

target :

a GSrvTarget +

Returns :

target's hostname + +
+

Since 2.22

+
+
+
+

g_srv_target_get_port ()

+
guint16             g_srv_target_get_port               (GSrvTarget *target);
+

+Gets target's port

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

target :

a GSrvTarget +

Returns :

target's port + +
+

Since 2.22

+
+
+
+

g_srv_target_get_priority ()

+
guint16             g_srv_target_get_priority           (GSrvTarget *target);
+

+Gets target's priority. You should not need to look at this; +GResolver already sorts the targets according to the algorithm in +RFC 2782.

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

target :

a GSrvTarget +

Returns :

target's priority + +
+

Since 2.22

+
+
+
+

g_srv_target_get_weight ()

+
guint16             g_srv_target_get_weight             (GSrvTarget *target);
+

+Gets target's weight. You should not need to look at this; +GResolver already sorts the targets according to the algorithm in +RFC 2782.

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

target :

a GSrvTarget +

Returns :

target's weight + +
+

Since 2.22

+
+
+
+

g_srv_target_list_sort ()

+
GList *             g_srv_target_list_sort              (GList *targets);
+

+Sorts targets in place according to the algorithm in RFC 2782.

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

targets :

a GList of GSrvTarget +

Returns :

the head of the sorted list. + +
+

Since 2.22

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-Unix-Mounts.html b/docs/reference/gio/html/gio-Unix-Mounts.html new file mode 100644 index 0000000..eb59f38 --- /dev/null +++ b/docs/reference/gio/html/gio-Unix-Mounts.html @@ -0,0 +1,911 @@ + + + + +Unix Mounts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Unix Mounts

+

Unix Mounts — Unix Mounts

+
+
+

Synopsis

+
+#include <gio/gunixmounts.h>
+
+                    GUnixMount;
+                    GUnixMountPoint;
+                    GUnixMountEntry;
+                    GUnixMountMonitor;
+void                g_unix_mount_free                   (GUnixMountEntry *mount_entry);
+gint                g_unix_mount_compare                (GUnixMountEntry *mount1,
+                                                         GUnixMountEntry *mount2);
+const char *        g_unix_mount_get_mount_path         (GUnixMountEntry *mount_entry);
+const char *        g_unix_mount_get_device_path        (GUnixMountEntry *mount_entry);
+const char *        g_unix_mount_get_fs_type            (GUnixMountEntry *mount_entry);
+gboolean            g_unix_mount_is_readonly            (GUnixMountEntry *mount_entry);
+gboolean            g_unix_mount_is_system_internal     (GUnixMountEntry *mount_entry);
+GIcon *             g_unix_mount_guess_icon             (GUnixMountEntry *mount_entry);
+char *              g_unix_mount_guess_name             (GUnixMountEntry *mount_entry);
+gboolean            g_unix_mount_guess_can_eject        (GUnixMountEntry *mount_entry);
+gboolean            g_unix_mount_guess_should_display   (GUnixMountEntry *mount_entry);
+void                g_unix_mount_point_free             (GUnixMountPoint *mount_point);
+gint                g_unix_mount_point_compare          (GUnixMountPoint *mount1,
+                                                         GUnixMountPoint *mount2);
+const char *        g_unix_mount_point_get_mount_path   (GUnixMountPoint *mount_point);
+const char *        g_unix_mount_point_get_device_path  (GUnixMountPoint *mount_point);
+const char *        g_unix_mount_point_get_fs_type      (GUnixMountPoint *mount_point);
+gboolean            g_unix_mount_point_is_readonly      (GUnixMountPoint *mount_point);
+gboolean            g_unix_mount_point_is_user_mountable
+                                                        (GUnixMountPoint *mount_point);
+gboolean            g_unix_mount_point_is_loopback      (GUnixMountPoint *mount_point);
+GIcon *             g_unix_mount_point_guess_icon       (GUnixMountPoint *mount_point);
+char *              g_unix_mount_point_guess_name       (GUnixMountPoint *mount_point);
+gboolean            g_unix_mount_point_guess_can_eject  (GUnixMountPoint *mount_point);
+GList *             g_unix_mount_points_get             (guint64 *time_read);
+GList *             g_unix_mounts_get                   (guint64 *time_read);
+GUnixMountEntry *   g_unix_mount_at                     (const char *mount_path,
+                                                         guint64 *time_read);
+gboolean            g_unix_mounts_changed_since         (guint64 time);
+gboolean            g_unix_mount_points_changed_since   (guint64 time);
+GUnixMountMonitor * g_unix_mount_monitor_new            (void);
+void                g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor,
+                                                         int limit_msec);
+gboolean            g_unix_is_mount_path_system_internal
+                                                        (const char *mount_path);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GUnixMountMonitor
+
+
+
+

Signals

+
+  "mountpoints-changed"                            : Run Last
+  "mounts-changed"                                 : Run Last
+
+
+
+

Description

+

+Routines for managing mounted UNIX mount points and paths. +

+

+Note that <gio/gunixmounts.h> belongs to the +UNIX-specific GIO interfaces, thus you have to use the +gio-unix-2.0.pc pkg-config file when using it.

+
+
+

Details

+
+

GUnixMount

+
typedef struct _GUnixMount GUnixMount;
+

+Implementation of the GMount interface for Unix systems.

+
+
+
+

GUnixMountPoint

+
typedef struct _GUnixMountPoint GUnixMountPoint;
+

+Defines a Unix mount point (e.g. /dev). +This corresponds roughly to a fstab entry.

+
+
+
+

GUnixMountEntry

+
typedef struct _GUnixMountEntry GUnixMountEntry;
+

+Defines a Unix mount entry (e.g. /media/cdrom). +This corresponds roughly to a mtab entry.

+
+
+
+

GUnixMountMonitor

+
typedef struct _GUnixMountMonitor GUnixMountMonitor;
+

+Watches GUnixMounts for changes.

+
+
+
+

g_unix_mount_free ()

+
void                g_unix_mount_free                   (GUnixMountEntry *mount_entry);
+

+Frees a unix mount.

+
++ + + + +

mount_entry :

a GUnixMount. +
+
+
+
+

g_unix_mount_compare ()

+
gint                g_unix_mount_compare                (GUnixMountEntry *mount1,
+                                                         GUnixMountEntry *mount2);
+

+Compares two unix mounts.

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

mount1 :

first GUnixMountEntry to compare. +

mount2 :

second GUnixMountEntry to compare. +

Returns :

1, 0 or -1 if mount1 is greater than, equal to, +or less than mount2, respectively. +
+
+
+
+

g_unix_mount_get_mount_path ()

+
const char *        g_unix_mount_get_mount_path         (GUnixMountEntry *mount_entry);
+

+Gets the mount path for a unix mount.

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

mount_entry :

input GUnixMountEntry to get the mount path for. +

Returns :

the mount path for mount_entry. +
+
+
+
+

g_unix_mount_get_device_path ()

+
const char *        g_unix_mount_get_device_path        (GUnixMountEntry *mount_entry);
+

+Gets the device path for a unix mount.

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

mount_entry :

a GUnixMount. +

Returns :

a string containing the device path. +
+
+
+
+

g_unix_mount_get_fs_type ()

+
const char *        g_unix_mount_get_fs_type            (GUnixMountEntry *mount_entry);
+

+Gets the filesystem type for the unix mount.

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

mount_entry :

a GUnixMount. +

Returns :

a string containing the file system type. +
+
+
+
+

g_unix_mount_is_readonly ()

+
gboolean            g_unix_mount_is_readonly            (GUnixMountEntry *mount_entry);
+

+Checks if a unix mount is mounted read only.

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

mount_entry :

a GUnixMount. +

Returns :

TRUE if mount_entry is read only. +
+
+
+
+

g_unix_mount_is_system_internal ()

+
gboolean            g_unix_mount_is_system_internal     (GUnixMountEntry *mount_entry);
+

+Checks if a unix mount is a system path.

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

mount_entry :

a GUnixMount. +

Returns :

TRUE if the unix mount is for a system path. +
+
+
+
+

g_unix_mount_guess_icon ()

+
GIcon *             g_unix_mount_guess_icon             (GUnixMountEntry *mount_entry);
+

+Guesses the icon of a Unix mount.

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

mount_entry :

a GUnixMountEntry +

Returns :

a GIcon +
+
+
+
+

g_unix_mount_guess_name ()

+
char *              g_unix_mount_guess_name             (GUnixMountEntry *mount_entry);
+

+Guesses the name of a Unix mount. +The result is a translated string.

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

mount_entry :

a GUnixMountEntry +

Returns :

A newly allocated string that must + be freed with g_free() +
+
+
+
+

g_unix_mount_guess_can_eject ()

+
gboolean            g_unix_mount_guess_can_eject        (GUnixMountEntry *mount_entry);
+

+Guesses whether a Unix mount can be ejected.

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

mount_entry :

a GUnixMountEntry +

Returns :

TRUE if mount_entry is deemed to be ejectable. +
+
+
+
+

g_unix_mount_guess_should_display ()

+
gboolean            g_unix_mount_guess_should_display   (GUnixMountEntry *mount_entry);
+

+Guesses whether a Unix mount should be displayed in the UI.

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

mount_entry :

a GUnixMountEntry +

Returns :

TRUE if mount_entry is deemed to be displayable. +
+
+
+
+

g_unix_mount_point_free ()

+
void                g_unix_mount_point_free             (GUnixMountPoint *mount_point);
+

+Frees a unix mount point.

+
++ + + + +

mount_point :

unix mount point to free. +
+
+
+
+

g_unix_mount_point_compare ()

+
gint                g_unix_mount_point_compare          (GUnixMountPoint *mount1,
+                                                         GUnixMountPoint *mount2);
+

+Compares two unix mount points.

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

mount1 :

a GUnixMount. +

mount2 :

a GUnixMount. +

Returns :

1, 0 or -1 if mount1 is greater than, equal to, +or less than mount2, respectively. +
+
+
+
+

g_unix_mount_point_get_mount_path ()

+
const char *        g_unix_mount_point_get_mount_path   (GUnixMountPoint *mount_point);
+

+Gets the mount path for a unix mount point.

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

mount_point :

a GUnixMountPoint. +

Returns :

a string containing the mount path. +
+
+
+
+

g_unix_mount_point_get_device_path ()

+
const char *        g_unix_mount_point_get_device_path  (GUnixMountPoint *mount_point);
+

+Gets the device path for a unix mount point.

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

mount_point :

a GUnixMountPoint. +

Returns :

a string containing the device path. +
+
+
+
+

g_unix_mount_point_get_fs_type ()

+
const char *        g_unix_mount_point_get_fs_type      (GUnixMountPoint *mount_point);
+

+Gets the file system type for the mount point.

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

mount_point :

a GUnixMountPoint. +

Returns :

a string containing the file system type. +
+
+
+
+

g_unix_mount_point_is_readonly ()

+
gboolean            g_unix_mount_point_is_readonly      (GUnixMountPoint *mount_point);
+

+Checks if a unix mount point is read only.

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

mount_point :

a GUnixMountPoint. +

Returns :

TRUE if a mount point is read only. +
+
+
+
+

g_unix_mount_point_is_user_mountable ()

+
gboolean            g_unix_mount_point_is_user_mountable
+                                                        (GUnixMountPoint *mount_point);
+

+Checks if a unix mount point is mountable by the user.

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

mount_point :

a GUnixMountPoint. +

Returns :

TRUE if the mount point is user mountable. +
+
+
+
+

g_unix_mount_point_is_loopback ()

+
gboolean            g_unix_mount_point_is_loopback      (GUnixMountPoint *mount_point);
+

+Checks if a unix mount point is a loopback device.

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

mount_point :

a GUnixMountPoint. +

Returns :

TRUE if the mount point is a loopback. FALSE otherwise. +
+
+
+
+

g_unix_mount_point_guess_icon ()

+
GIcon *             g_unix_mount_point_guess_icon       (GUnixMountPoint *mount_point);
+

+Guesses the icon of a Unix mount point.

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

mount_point :

a GUnixMountPoint +

Returns :

a GIcon +
+
+
+
+

g_unix_mount_point_guess_name ()

+
char *              g_unix_mount_point_guess_name       (GUnixMountPoint *mount_point);
+

+Guesses the name of a Unix mount point. +The result is a translated string.

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

mount_point :

a GUnixMountPoint +

Returns :

A newly allocated string that must + be freed with g_free() +
+
+
+
+

g_unix_mount_point_guess_can_eject ()

+
gboolean            g_unix_mount_point_guess_can_eject  (GUnixMountPoint *mount_point);
+

+Guesses whether a Unix mount point can be ejected.

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

mount_point :

a GUnixMountPoint +

Returns :

TRUE if mount_point is deemed to be ejectable. +
+
+
+
+

g_unix_mount_points_get ()

+
GList *             g_unix_mount_points_get             (guint64 *time_read);
+

+Gets a GList of strings containing the unix mount points. +If time_read is set, it will be filled with the mount timestamp, +allowing for checking if the mounts have changed with +g_unix_mounts_points_changed_since().

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

time_read :

guint64 to contain a timestamp. +

Returns :

a GList of the UNIX mountpoints. +
+
+
+
+

g_unix_mounts_get ()

+
GList *             g_unix_mounts_get                   (guint64 *time_read);
+

+Gets a GList of strings containing the unix mounts. +If time_read is set, it will be filled with the mount +timestamp, allowing for checking if the mounts have changed +with g_unix_mounts_changed_since().

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

time_read :

guint64 to contain a timestamp. +

Returns :

a GList of the UNIX mounts. +
+
+
+
+

g_unix_mount_at ()

+
GUnixMountEntry *   g_unix_mount_at                     (const char *mount_path,
+                                                         guint64 *time_read);
+

+Gets a GUnixMountEntry for a given mount path. If time_read +is set, it will be filled with a unix timestamp for checking +if the mounts have changed since with g_unix_mounts_changed_since().

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

mount_path :

path for a possible unix mount. +

time_read :

guint64 to contain a timestamp. +

Returns :

a GUnixMount. +
+
+
+
+

g_unix_mounts_changed_since ()

+
gboolean            g_unix_mounts_changed_since         (guint64 time);
+

+Checks if the unix mounts have changed since a given unix time.

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

time :

guint64 to contain a timestamp. +

Returns :

TRUE if the mounts have changed since time. +
+
+
+
+

g_unix_mount_points_changed_since ()

+
gboolean            g_unix_mount_points_changed_since   (guint64 time);
+

+Checks if the unix mount points have changed since a given unix time.

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

time :

guint64 to contain a timestamp. +

Returns :

TRUE if the mount points have changed since time. +
+
+
+
+

g_unix_mount_monitor_new ()

+
GUnixMountMonitor * g_unix_mount_monitor_new            (void);
+

+Gets a new GUnixMountMonitor. The default rate limit for which the +monitor will report consecutive changes for the mount and mount +point entry files is the default for a GFileMonitor. Use +g_unix_mount_monitor_set_rate_limit() to change this.

+
++ + + + +

Returns :

a GUnixMountMonitor. +
+
+
+
+

g_unix_mount_monitor_set_rate_limit ()

+
void                g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor,
+                                                         int limit_msec);
+

+Sets the rate limit to which the mount_monitor will report +consecutive change events to the mount and mount point entry files.

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

mount_monitor :

a GUnixMountMonitor +

limit_msec :

a integer with the limit in milliseconds to + poll for changes. +
+

Since 2.18

+
+
+
+

g_unix_is_mount_path_system_internal ()

+
gboolean            g_unix_is_mount_path_system_internal
+                                                        (const char *mount_path);
+

+Determines if mount_path is considered an implementation of the +OS. This is primarily used for hiding mountable and mounted volumes +that only are used in the OS and has little to no relevance to the +casual user.

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

mount_path :

a mount path, e.g. /media/disk + or /usr +

Returns :

TRUE if mount_path is considered an implementation detail + of the OS. +
+
+
+
+

Signal Details

+
+

The "mountpoints-changed" signal

+
void                user_function                      (GUnixMountMonitor *monitor,
+                                                        gpointer           user_data)      : Run Last
+

+Emitted when the unix mount points have changed.

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

monitor :

the object on which the signal is emitted +

user_data :

user data set when the signal handler was connected.
+
+
+
+

The "mounts-changed" signal

+
void                user_function                      (GUnixMountMonitor *monitor,
+                                                        gpointer           user_data)      : Run Last
+

+Emitted when the unix mounts have changed.

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

monitor :

the object on which the signal is emitted +

user_data :

user data set when the signal handler was connected.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio-hierarchy.html b/docs/reference/gio/html/gio-hierarchy.html new file mode 100644 index 0000000..503f433 --- /dev/null +++ b/docs/reference/gio/html/gio-hierarchy.html @@ -0,0 +1,137 @@ + + + + +Object Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gio/html/gio.devhelp b/docs/reference/gio/html/gio.devhelp new file mode 100644 index 0000000..6ad0373 --- /dev/null +++ b/docs/reference/gio/html/gio.devhelp @@ -0,0 +1,1235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gio/html/gio.devhelp2 b/docs/reference/gio/html/gio.devhelp2 new file mode 100644 index 0000000..08e7230 --- /dev/null +++ b/docs/reference/gio/html/gio.devhelp2 @@ -0,0 +1,1384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gio/html/gvfs-overview.png b/docs/reference/gio/html/gvfs-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..628684dc350d2428170e169099263c6fd13ae9f4 GIT binary patch literal 48474 zcmcG#1yo#3(=Ix=LxA9(pdnar*Py|JI|P@(-8BS)1b26LXOO@ocyO1H;BJG@8It!q z=f3}1|6TXobG>mIsgE`l9QEE0{{>ZU|%X!WZ0Qc zJQ)43KX5K;G7^C5G4fs54`fpX87Tnt>66=4k^nn{<|wP<0s!ECgnd83A(d1g!cL;N z$|=4@SwKd`W@AQSn`MKYB5{4I?J5bhw>Nii1xPxZo4A^Pp!TqKwW5}hQ&iCk!X^R$ zr~z_P;_p2d4^})fpI<(JPv;Jf4lf6Pba27Ft;Br`=Yut``jWJO<5lxLSLBa*TT{7c z)9J5xkzF#XwE3m;xGIIR3Eqx9m;QQN5b(&#*vjE5?8ANZ;45_1TPxTASvhVz-d-96 zypxhD9OfLo>c}Ju&%-3bUBL1L5He9oNwqg32(AP7R%u>LULI4hnumOZ9kP%@V=<|x zqc`yB_eVzJXSh!X62gn8BmbYP&oTd8{TK}Q=c+0@^`Fb=$batr-@DmbozgrAChqG` zG4R<7a~b`!YUZu77=%AvPJV)a&xgE@Tpzg6v(Zx~mS0~TFE1EiV}Pk&ZioA)-${+M zK&p9jP&a%w;0T%C^$VAKvhMl-)+2O{l^oM`F#VEreS&_nWESvOA~I6X8)K{!!^=mE zUyUz}vYViz@W_BUt2F5E{72B1#5wnZ!9m2;DHFD0Kvn}m!qp7nMG^2tvOM0uzvpq9YT(D+Ey}o%9xN6 zoJcPz*%^*8T%6_h>8g9KZy+n~pP6*G{2uc=ogL`_-1mGL@F@^@IA`aR<&QOs2AEsw z6>B{tTB?E0hfO$!c_38qJo4o(Vq<1wHLSL{)6CY+Su0Yjpmo}?&0$k#o1!3S^r(mG zzV9oVySY;cnmVK|)eL*+NHN8d@216GYM#aDK`>ce`!thvV81S~9*vB&FL>Bfk%uSv zSs`eyu0404LS;UEbJ8mA5q;fG=0rUMY_xQ9Pg|S9ieHuQAkh(tK*44W^*yq=so8w{ z0dkUE(350BbT86ZUKBu*Y7@}>Qexv;U50uB<(lY(|0K*nrGlb16GwkmO5jZp%HeN~ zo=)~KNX6lA;X0dqy#n|3S}-dB;e#N0SPgHTeShDUu)B#Bq2}SEZ{;aTQ;uku2HDD@ zz1}8<3^hBzR_uo8>hTUkQ?ZSzb)0os5TSNaEEh%d@V4aY^i-%8^ss;|BVu~IAI|*{ zbud?A@2k%QnQ^^AU&{Q|qcA3N}um|M2(Yg8&csjDqWG zYR$O>qC;Q#MuZHPAR~VCOpmW#OWMM$Ijm z!yc1BBc5x!M1xv10r>E(=&z(66BB7Mzh~@g?HgxJG+x6WOi^E#HI*2s9Em^FQFzSX z9pU#WE9{dmsS=cIa#MnfrlbT*KPDd87`%9n=_*aoQ&X3Y#eA?B>{6S)y=B7f;ukXm zJ|;Bod@0a978BTSaKETt_F#j7RT2_1;p&J-m5!}cXj}0${nfd9Wi`F=%#pxdbilf{ zNPFb*-lp~#@MPgR_zYNw?A0tydh)UBo=Gz$iJ2T}q09+0MlCRb%y-KT5p}rWzPsQ> zXU>oHZpvf(g5L-Hj;5h*cn9?ZLhD6@gzzCw0`8km`qJo?Hf>~yOoeV-fqY}W+96?@ z{H*>s#+T-Hp42$?Mhr_$^a0JvgAoT3XMEt>L*Xv1LrheARhMN)fmWBg^xk9S$1+Jq zRxXN6*|}%-wm_Up2ca>a@7poI)rCxnPRa8tGIz<0Gq{kkU^SN(g0 zZ-^?6+s3i+C_k&my%%)!)DLx2YCtHJ7j)zUr5y`(M#49ruRiI1=@imwFPGhAvNp~O zH=y0L>%Zsm`%{W1d5V%xxYxJ}d#-UVr_TT`DklB=f~n{IF}{kGk3LNef+IAyyItw( zaGAl}o8rZOCf{~)h4wz~uK%p_YvjFfgnO?5Gx>aRXw;mmDT;uDVxQhLJCbckthKBP|&(S@G+6`wX@ozNjS38FCkTvb_M^zB5d9 z<}zBYjNpigz-+55WFbqL-h|E6YJg)E1uCuCC}I4MAg^iMsonvzyJVa1u8vK-an)RO znZ+Uakp`B;Eu16WN-XsVkg%)E?~Tw0l#_J7fT5T(!4~}TI_|nxEitkEO}ngM?yW?| z=I;#{QxECd3^YRkhSeqM;kEVEq-Vd~n>fX0H0u=`kG=X2-UNaltI-6oG;VTVf6Q@< z`Q59{4XTs20Gc#mXMO<9E$(*pkanDWet3XP)x}yLm;N!PLZhnypVdO5<0+q^uD~DV ztc?)Jo_D`=ntj)i(b`QJ%3XTS(lNQECed^wcmS2@N6~j+!)by(40Yo)g}bafHrg<2 zq}MZl@^xwIZT{hm-81^xq+^a8ZozXMsGa19P-}4|=kU{W=QX&9k$A_MkT03RBcDrH zp;Yd29s8YvWg0ds<&sPR_f)U=TsEH4RBvQsSO3f908;0%=AWO>IwDM)V!D5N0$mc9 zL~Mz^BpeO}F78SL?S3Cu9h#Y$lMFHAqQFYj~3-YgyyiAs9odxY^ua;mn zf1Z^E`x`1;mle#--xwW~S}iP{-uRd_FNA5Br2e2zjdIOlasY3t!5~m)EI0;~=7tmf zb4JboE?7T!=Iv&+QXKCOB^0fWqXt!9OWP7x+kK`DT|o+cdqbhvnUx*Pb>d3;O-btv zR-@C*f6OUWc`DsBSB_C@W6FF0tr^@)Z|F0$iF2FUWWTR!Q|RWVSgr+vU(#UWoxUQB;uGv`S2vXeUs-uB)*ma5s6> z0bd>s@&U>A{k!L!y0U_}kt-+tN8O$m8)$R#iw1m(-T-8?N?vZCO?1qfe^XCUWIasS#|d4CJm! zu3>&$NxyV+$v9i-0Q&swUf)`aaAp-OW2Wd~D6zQ+5kBaHqDxdsxEyF5b_EnaWX*%W zb*Ls|>H6q@3Jzl3XOv-QFG(}bZIke{?TnrwD1oooS9?vg(mX*@5)uWz8nxbabIWk*aN*9cS*(G!=8?b#(*fDvX)C`I2r24s+M<*e zs|GkDlyJCBVz)=;n-3p)Eqq*cmau32B&Y`a8z>WdTDdtnjNm2 zo8qsnrQ4gWjDzYS=jT`c)qb9qhn%*>W^O;62v4%>F_z8`H~Z{S;K0UB?8Mqtm)n42 zV_`s}R*3N_US)EqZ^su)5oWpgAKciutHRUD>=60LYW4Vrz#R;)FqEQ_i_c0zN z@e`a)Of#%x8oX_yra0x}akgG~xr5VeOYq`htmWlB{dRwikT%YtP1Iq=lIRrL$P{{udh~TKqDA=Ap*x%ggEA`-YrkCHKghCX1Sny+VcRlw~y|3xQ^GBj1Os|zFW=Sz218lm=A zJ?W~ZNV5nbq?Gto{D$w=Nl0;49ZKEhTMHS_f{5qh=dA&CvUb}F3N@1L;opzkS*>h- z@I=>-4VL$2#d0StzN)kazdDRo9@xXc+p`cXd;8k;jqhK=^zp|2#y{K8(kgPNFhT7m&u>B~K4!1zPU=EoL$urz| z?PCg3&Od4Lq$1Pbtopx6n-8+Nno3=nq69pBVA*y2N~G@JwEDkEx;q%Ks0nf73HeoY zsQ)JD?Nn1-Noe&;oS2f}_JgZwMcMyjDZQ)opJZJYVn!?-)xxc)PQqB9p)&l3ERf|b zN`~BlPQYZ!FU9zY@lN zKU!|95=3W)vqY_Kv`3AZf>cAk%PaJ4Di)8&3G<(34twoRVJ*tN7|j9)w#nX5znCnd z_}K0(dw_J)4)28#n`PBqQ08`@RKd3&DCuctu9^@~a!f;1_iK}3Cu6;|pX))$YvsNF z!(5wUG4vaAw()8|XmF)(t>j$Z-Q#JJaO1I0$D;A~;e*5(^uZ;fcDeQRVs2h=Ya zbqG^{`Nx3-^2?>zeS1OZt(^Y-x=(7cobxf-i1(qod$OjwhHj6ROU}l%2?@aW`Wqd& z&$iZ(UA(L~+mrC!v*|a~97F&C@!=lBGDFSx*8pvO-F|;-v`Z1T@hru$(u$p>7B++k zs)0TT6NP9FQ)l_{U+urkK=+&(ukKatA!iC?d&z9w zuJ68HN*nqrt(=vE0!Yt~fk&MG&_gU2DJ5(J_C%FhpnHb!ZOorvUD$pDmAi({Sm2@CIM(a4y|Om z3}n4tQeCj>5WW%($6$ksK00nV(el08Oju?u52-6!I6MpidHcKv(UA(Q{b8M8d=(Nx z6(%xZM2v~5>jn?leaYjpngPBw(6|(#V&7FG3}BC1y_(Kvq9jU!;~Z>kM?-#qjrwVA z!S1z=HSWPo-gGV*xbk=>TG9O&sAU07@S*f6sGa~pMvz|ne0T%6D`Kc`tV9kp4T!^R z!G#E^Qd6&l4L&hqvQeJoVcSFO%4kT>EwFp94(>%&6dnmjywmi z5e=L#Tg{)?a}51C_RHZ-K%$TWvhRDMUkd#FdFIw0-Zg+2(vL*@DO>qL} z&j9rOzU|TqyWlWT3dFpt`M#B8%5UH|3v7x-mQLf zx8|@_7`gdf-aWp>n$E?@J9FQ`E7Q~{4rfg#3Yu%%*e}(`4w&*4BcYjOQu<~~fGIm{ z1*rS#+ZEXl_?iA?oMaA&UcpT2fqO=awIRx!e7Y6d-Pu~urz>hToAH86r7IExM>udH z%7gpH16ip%xQI$fDh9le*Zb>6G<%Q@dQaF*KM5pui0QcH*t);`S=uhi#rsivJMF;X zFKp_5&2VB|V-1K+vm_r~&rb7PrhMa#y|uHebqY!nW%rA9MfP5C+uy$1i+$tHfW5W0 zX16{H25vW+(X%%i;o#vfx8i@<`QgDBLE%9ka03yV4Y+U&5d-wBFZ--gd+h2vbl&S@ zlQ*D{d^g1Gr)FZw!1bXTVY68Mnh9(n8U$-gLQ&9-~H=VnZq>J`X>tMitDBgOX6GjXe z2o${#F4K?#xBc{<8>HQ3qs{Xw|l7_-5(ivJhvV%teUII3q@cCRJ9ai)%Z`u~&Y)uY) z;IJR74`x?ZE|d%%ow6X`l;cs1F1&*`^1DoY*169Y;qL%MTS66;Ys}wCYq+TIOr+rS(lHxJ-hA_(*5a4tnvFEk7j@QbggZ-#R-Qm z&#yx?=0V4N^%T}@^Q~-QkM*?y{lBvZDJ7{U(DMFp^|Z;s5bv|*OmQzoxe(=Y)N5Y6 z6JTNaPy0{uV;@wY9gbvU*jRA#XKW^xKNtdafct?^hF3%W`S}O@@^6mwjmCFzLn6a5 z>nV1J>2`9!$%h3j_aSL&E*C zsBxj;U=JndiTC8moNsUSp_b}KO%G-@JsVV!@j)=Vv0`UsQ@`_Q8hO8xjtwe^3=yb3 z(o^urR5H0y2DEm9Co8s#3Ta~o*?q6eLB)(vWcdpBpEcf*RZHRQg;2WFVb|?rPLEpK z{mV;#quec9cZZw>#zW!o*F`8ln&f5Y@;RQC=OhjKtL8Zt$e{~`+$tP#I7a_BS`Kqk zKjh_@jiH_dcJdUULn$WNeX9Lig{t~0jyV62?3bLEV$0Qtm|FCaOeH@&))hPrG_x$t zH)=|;ZwuZfEuDHKs}FJ^U$upQ4JF5X86WzU>EcMR$$`S?`z0bC>j&dwX4#7i)DETG z`PLm-tM=Feu;f&puI zL!WO!;|ZR8U3Zz!dHyq14w(k(`qG;*LagIVm`i3HlE|R(K>wE6E+h48qIVs(alHE` zUsfVNH*@RzObWUr8tk!HXe|^I7I73oMx+g*_0hIx?gDITqSEyli0`N4uL2|t7NPGX zT3N-Ud4ydCXC7J_jo)S*h9nxA_~&>?&o>Sq$*qLKqLubG?d|ATElAvZ4?OcAc|h}_ zXXay9KnU28x5GeZA-VncMf5joC^?==)ije29-bd{ZUbueDT-^>dU^`^? ziBlA%7;Ns$U}Q~GPz*`4%^X6Qfkj>>x=4HIO-J~9$svyry~IH&tyb@;LgG2Jroi`7 zSy%lMzfXJmc$QFBi6>b*82*7N3hrmq3C;*1w;vK(Yzeu8UcGZ+ATVcBQN4mUj*H`q zzle_dHpJIys6_}W@cB`ES&)CLSG-VP%_IH%{27VrxW;?YL&Z_N55!#**5mdKe(RrT z{+G(cz(sRR(ldgGyH!PtTUFZWndFS?aw4_ba|s^%uCze2#W6w-j1JAgREsW0$->cK z=Rc3+8b1&1XmYB_DG5jYnr;XLaBJkK8eZXr4V<%coN5UxJ3M~J+`Hjq4s`T_xgKEN zY(BjuILt}`Hd3;e^jm#B=C|8Ls`|_FlDHrar!aOIG5|p zwdAqhV?SBA4BTSdtpI^NH99P8hc`5UKcDUUa#-6$EbnVf8W)c#>1+(8aXjPWb4xu_ zkdhJr!InT#5IR8Kci=*P#L0KBz-pU8(ZQ&86aAH~f8X|!RIIpB{Dxc^q>bdh*@#Dfhv!OuHlJB{~_H2P;+YU=d! z2TG&a3|g+8S0B>#7F4y#?pwc)Q4-Ag0x3ckuRaEnR1&4i&J_yJ58jKkZgcN=VPrxC zgzki2FTo+rtm8;f1H#N}U0(`aqGj@6Ad4VEKdbyu)yPW^fF%Uvlj^s#EGhP&prLg8 zRExMkAPJI}Xvwrt@P`!MpI37CvKp7Mh`~v}fL)pOL%$IfMN>uYxz}oK?=JHsTnF7^ zde$v3_MK`e*nJ0*M^jXEPbq?oo0_VC1Vv#jwO&h`hzMk5m8p^h{eo|^Nsi2R6F3%? z?&O>8+S2QXG!RFrEowvehT0D1-&8rg3+3HBE^JHKOh2yL$du*=*^$tT2L~w%khHTm zVK(MX!t))`T=!+a;^(JeO+!_Ogm!t0E8$(+8Y_sr*2jY0Vu~;aR%NU=qO5l-Y_wqM zqVcfWf-Z;_He>6*G_k#vqJ3x5z1>Bdm=!gCfqya1;BkJhk~c>zb}a6p(tR1=cAPey zL&VTF2a>BvleTuF5r;~gIrop39Lr^kgD5xmp@#>SyZD`%6mO}XU9cE~n~`wUcIoNP zv2V?fm#oiNn&yTtP_q@q7o3B+UA_-zk#(GyG&r>=j z%`egKgI>JDbL>F*lFAj-7>yyTOgT#r8$VN*A#KK*s@fw#P%cgia|GfsV-}{tjS%uX zf~%j$H4W>~S-s%`>_DpV&;Cm?*}=>ydcz@Cp^7OziXMGgxW%$ciXrt&2NZidBF`N_ z$%H-Md}!DJ{0}CVz&x4IeaS zMJ`KXN;rHFBAYLtaPwh+3nk`o=#)RQhf=gr`@IO?Z=fc1TsmBiAp!rhr`m@2m7I38 zrXVT_0|>DjJEkMJ*)N!Ac10iBCHRQwG2uHJpzh#_De}6d8~Pa0|cdIkFec|dtgV+OF$R3>t$P=m`XkiUtA$eyi z`TmPCPZD78V{h8U)+n^NRAEG(Z46ufX0 z@um0tJdd$>%IJDmzVS68ml}ZbE_|E8X6-4`{ums@!_5QNUEQ1vstA`%5TK`kLKuBb zMENRf`L2v5)uTSa8o^jT;;eW=bYu&n-aJ1&!)L(HGR#3Z$oL-PCeAv&C{kiXBuy@l*QI=(oj)k|NrSFppL%2@w&E+fzMg>dzqX4ajll=6RSX5hDo{^c~D1hDRzsQMgG0<#V-Hm z>v>V!clbv)40dQ%RIsh!X?Q#vS3S0Ky^;L0P%S^40*5f>?cU%~6&3qY5nT-g+vZ*j zqrQdM-kyl{EFs&B%GHxCw@Z*m=Vlwy-0QkxRukYfC{Yi9i8(SaR8rN#EJC%SX4SI{w zF%;$Aq3V+BXGcxYK8g*MTRHxju6Cha93kH`cEyH=Se<_3>yxHMIGEo~!2EXl&BUy} zL+jpl?Ss4L5f>kjJo*rg#IRym*%ba_C>X8ZWGnvU_P2^7{{79#U=X0E&a#gMMI1z1 zA(oSjd58U3L|DrJHAGm`BX5Z^;&6}k$q6Uz%gn_JIkVzyNa6_pL@!_E|5U2L960rF zb{6k2RPY)`PtIz$IE20t|6BOu%1gnaBwi>?5}voI?{2$C|0L}HO7YKsN$>v2MxUsd ze|+buYF3gvW2fo_og^;&@?`%|a6Y0EtF>;5Rd=Job$t#3^NA%%C zf1F7z6p`=dJ)fJ}L6{dzfo{y6X+?3V!t+zDKEJuX6=g9U>UMkNdrV3{(&89*wHfY(xMiul^&dkkHI62!vOhLjcW?KCED( zvt8eFF^Tn$TMxe=Pvs&oe3ZY_lq#G;LVV%}3a1#?u&o~|e}}%mE(0KY7ObsmVHZF` z{bEC`r`GSwE-}uVbe&g#4m>pdNJzsb2cGkq_!d4y_ow!)`%;INxbaH3sDA{x+-zh| zoRvnIVj$Wee00-WZ(`U-fj@Lscj~2+0ig6R*W^`_qC0QIR~!OfphB{cmi!jSVIvQN zt;~3(U!%Md!|FA=y4ExR9SPrYhx?nAAqVXwz!oO8;pF0hn z>56oC%qc*-J;aXLH_80Zt*pF$96pJB@{z*$%cQ*DKbQ>I9;TGhp#II9Z74-#jX7_n z1Tchyw51C1odl70Z{MBpaJVSDG~9~aDPMZ&yI(`PcJqFx<2?;*OybYXeAAY(?eQ>& z2@1h`iO3%lG$H=<1me#c_?-2Fxlzc+Wokd&;#x~a{-diF$9{?4-^C`20EW^x3LQ6B zr#v2VZ>-_)=^`vg{x1bpQ^fN9%vY}oeU}E>(fzcaKR(!i`GUS;!aDy$Pfg025(;_5 zG?AAEl}+W+hdXdntWX79-Jcw9v!StA9+o}4{)-iT0>9<>oC2FN?`Wb$F?ck%K?X;> z?DoDpP>LTE+xyUvNwG}`)c>v3O|4#I?At$#m8|xWl;@!!pHu54RHLS^^wIJ6VXZOl z^F*CZr-~ty(KntOXnc28#GdS(4U>!Xw#uI8ckbPJp6gNwS83=uzBn2pj3Z$n17t`| z-K^Y5D44;PD(a&vA#CTcK!F*LVJAf95w%4GG3;@tS&j@b#R!Gh2(ApP+$Z0QRa|oH zF2v<-5i&~Mx;*PFfqrmJI2aRQZ-R{1fw$f}zP=aI2!u`5TWaGcY}~!D`LsT>z20?G z>q%nwJ?u>WgjQS{8x+E9uVHyMXDUkyyvPB@PJMS&5-+ee2p4wij6F=OnAixf9ki3W)ugw11K`vp#enck7S8EBdfaTjF`W zdltpWSOsT%Tmn_hFL9!HH!vByaI>qGSiK~rs7hkIKDHx%HWB}U;!UI>{-Cs5G&ucg z>#S(2gzg{}6gNpVr)r@6ZUVSIHbmq0%kUSu-`Jl*`X^0QrKu^dyUBsCj{rYC7*^1M*>v{8*xH%SWvDlip<2ua*L(%DN zScb&D)(s6EMfed~#1W1muh1pm``aovwl4BzX>f51zXjI)2}R`^>djjf1B7t0FX}WU zywT(c1<2xsIdvvTmAV*SH!7+~#Iwy^x4oqt?9PEPGDrvpALGRw&nxWO52WEA#dd_4 zR>WsgYE&<0$ZZ^;RKnPMMD0J=0=_5)Tyu&Cus8ZYN)N3)2omJ@OMw`S3X2zwAZf$+ zzYUmGBzjk-nC|Tq`*Bcz0gK-Ra3&dbz5TH?MdEl&aS0z?I`*)4`OCly`FDmqsju2w z<2h;g4j#43(WU33{0ZWam9UQH+Udbvys`i#Z`5D@BWGkeecM9dA#^6aGbVEdQ2udK zfJx7FX8X8r#hTf`3fnqPYF#pdSYz_EY0AB}XRb!84!zftSTI?}56Ck5CcgiA&xoTTkz0_dK11;oA&{0>+kn z6YUTXb!>gG&`|eXaOX_|$$3eX#NA87J8{~dmjhT~%o|0qJx*P@<>Wk-!Jln63XOW= z8Ye85lKV1pBq!?py*OS&NoVZ?jWUt_!IrEAW>ZV#0W_WWq|Y^Z?*T)fs^$i{Px`g_ z+~gnD@GHY1MiG}tpFu61U%lxvqQx9%IVn6FZ1#@1O8;9{yqmbje{cgQ)cm4hA zjHs>om3^=L)?Lv>@4hcuoYY;kAE>EG#|}E)oK)SV=a)F-UPNSFr+~iBW`wiT8Gubq*ESeHU zdj2Ve-{mz6_w$^Upu5lXbJkjh9(PHORESKqeD@LA9fS zmok;@H8^+or-iMBUHo)xE8hnpm9vssgQ&=cp4baMIQ?(AlWYkS?ndn7-QTO-f=aX# z_)}G@WE8zxCUkFCL-mK0o&xCa;@X?kpjsr)ALE=L+FL)E){ zA=RZBZiR?pXbzSkt8@|dVnY@=L$$s;3}Ie~ickIIae#aAc-}!-6CmQuSC$&B|f z2ur)e_TL^|^g1H&>r*!Rr33byR2f`$q7%L%4QKcsvZ46G>z6;~&8F~&LOSgL;6Rk! znksHeBd?btBQ(bCxVm97X(9m^vMN@CAhRKNwk|JE=eE2N-Fip=1%E|z;&IUL{d*+x zB{q{4q5WkybL9^QO(1GNV{FzI3=duG1#s4Q=~TFm_1U3mKj-jfGe(O)(XC&94PR6v zoUl_H7AEjjnUC^^>nhM!*>}B59irKtz@H#0sTbMWGtYJ~reXqD)7IU^ZFtCeu)Jw? z_OH)O)YFFekc@;*LUN@fRQjnMg8{fVs@iZCU^7^U7S|0l$xomy4oZSulCtKGM zCgL4ZJhoP*X}Uq0%}+TqELx&1h=JwXpc)^x-TEl9OFiy-hNLXCmc;&}k;I)ke5|UObDWcXG6Q+*~hh(;Y4xGozB5ZQ48E>LV zOl-$|4A|Qp+I}ilEa~24}gdCBhv_B@+bkj0!D9d#_> z+^H1adj#z#eRh)bQGW%!!|Ppi&GIGK-9`I6mBjZkk702xLySK|bR5GTdc~Z2b!80_ zdTEDYK2!(lk(K?LFoU4Ay6viz-Az8+?Mf$Q3n zrk#Ylh~z`USA=0>OxSBRr#wuO#@f=`a=`ZltfP&lg-2*9`k32U80rjRt56F$tDC@r zJ`Xr&y57*$JZM0ZIyfUZsG8<5?$Kn;1Lwwzk#GF2r`_atQbhAogUtNl7mIh1{8;8j zVM@Om3y@{>$2n;di+ga62QGNkI1~1gTZB*e9{0pbWK(1%g|SiBN>+u}<0hP%T{r*( z9pw^BSU3UdO2YPQFdJD}mlAe>zkU-B@c>P%T|Hd8=})dE_OVIw{>YZOiq%i!pu6bO zIQOsAV|{eiT5%rxcyeP(8~XuT@;GoEL1lVipE6(%HRp# zmY8bF?1NR?*F8g-GPVoDoL{J6mo!-nT|Z=Z9~n z)3%D9{odU#ah@zM;-#am$e)mHwT6ny{z-(`l9c6rD%Or=kCRW7M#Qwl0s;WQ-g|6ox)$p0{<=n0Q5z z%(MQbfc?N$aYn1=tiMRB;p#`p!s+SUd&2k4!~V}A$;CVRK{*q=jrwLSsC)=Iz|ccA zX}9bP>CMtE$zfYiaKHoE7E55#er{!?gYX#oS6UDJ-tdB-wcb%NEyOSqRmQ?UbODH| zTpB)pq1R*w2ablrZBZa6bRoTu!H5Bq@$+!uNsI!E*?61Rye6U%KIu8 z(tq(kd;5XH$J0P7>I&up1wQ(rI;NN&R=P@@#+L?eV~eot9k})l z!Yh+P2*l?!A<4D_b96JaS_40E8i?NS1(%+URxT2|`^0wm?Pqjuj+>7VSl?e9x0Jpv z>%AaQzaNNr9&k!Sj2tNmq2DgW-x0LdUumLWg@rKrvfCj`s^?UV-~z<_R60hQj`KoZ zQc3zgC%KdFFKh*-#gHm>9J&DBSiw$reW}P@aG5Jn>Fvd>Y7|RWn0c_OOXa-{6pr(l7erQSh$bE~Ov( z8`4AVUYX$tB~JoDg*!`h&jUcwdumjv^fRI?FCj+5^KB=xgZfYfyk+TSNQi6#gI@!L zBVmV)U7A52m?%vS=m+=SHl0i%&$pu4Fi_98k%%l~R$PT!C+MlK^BKSAlA zJc^+Lp+tXBINR0lCVC*wpqY& zFZ$v;uR}}aPM8X3<9{E0cEhI1XGv)>@fCF7+&rl2oKC} z{dwWE)nIzQ!Q%#=ewBUvlHD&pW1i_T%_t3AER?9eUjvRI7aUEIhn_3tR0RNF;{DBD3DOp`9!z zo6grJT^iZr4{(Grp>kKLbS=zW-PF%QWeLLJWLnHTiep-|S<{AsW7KstDIP;U0VTKJ zm2+!3m^zoT*}8?X-H(>9SEWwHeZeJN)-zNi;9q5ZU{5TLe)&^nbA3?I8*hQrl4GZM z*9~~L1#L5%qFd3mZWFzC(j@WrOpdq1Qd4lcFsNb?;%&Die4EY0z`UZ@qW^v`s@1Ue zHCIA7v)>vl=ws5c&U57lzm;O1s`HaetJ(A@-=Md?7P;tHw;41PE;>3aA2+m1c%a5p zE&R@D)68#!c2FHQ_DRAhl&}l-P9j5B6;t>X31)&)ApRA4*F(YP;x4(T{>)eIGMf;y z3>tw|*ozVI!Qe@XjgX}#V1)Zb&t_GyjAp5$esdA+z1LmN4Mz#h;mL#@&F^!bxBBDI zjSjcrY{{5dTM=6FdlZ>obBz+Y6j#xkVT^t%OS0}#J$Fb0@|cB1D0)27QXeFPCE(@R zfv^rr*dQ{2KVBPB-qv}I1Z3p_=M!woUymqb&v+kSce8H^jX00kyuW^Xz56gy-t@Zr z#I!rZi(nY&Te@-u{Ml_OI9Xe!coiZmr8m?M0u8H{j@P5y3o_6#eo}F|9t|H$SoI|K zE`14bjvgjCvhvf`!SlMCi6IHSBCg(4gh6>3t>;hw;LnuAc!k$LREEVS*(yn1e^Ejo zbuzfw+5Zfz4#W6{c-AxN3g9aDE<|9_+#fNMDvdbnjJT8cs@~D^&WOzAXR5%>FR*{`FlVH}5^xoMF7>rc)8cx09Du5=A;qkx9Jc`HnLd z@ZHoFZb$?b-CHGk4*AOtgv!~@bi(9SxK(mK3A|y6Kca=)qTL3{wZ9LMQPD#0+^#Ep zQ{hCrDKfqV+>vPB|F(yJ>y^lQ^QB%4G;y^nYBrx3bk)|8p41{Le%gMB_#h5nB*>I{ z&Q)Plm*aS#WO)J{jDSZ2&*zRBRfD+{;Ro^vr=JKopRk0z#dizJ8K+5ewKvTm^;%zq zpmYG@!?c~wKr+fBNjs||KeG~SWBjxq#f&?T=t3yrUv~Lx{S5y4`m@R?sD%o%*77Tf zi>DRfaExvJoIpht3y#Xp5Q(iD1A)OK`vQI>oxnS+tMwP`-Nw?Ze%s^TFRAEk@+-0cY>~qH>ikI2i0uw9c{rfM78m^J;~J z$WVE#IOE%zihQjxiRenl>jUrAA7J*g%8kdUA~1{E`p0 zW(c)7k=wyaknV-Q3-VVGsW)tzjOalt*f@<9knt|y@OpLNP2#R8zF<*mZ*N-)g6dkR`$&_ zwYOiE{_eI#R`^!q({?wEhb6eih+_YYxGaqPh0g-snn7Rewwpz;H#+q3!v7jyZO!M) zWEe*2YHg6191}gI{%+R^Hkk~Ju1)Zomf9PQnTN4*925=8#E}no4_A?`UXBL`hJTi=oysn{K== zN~DIjhW;pN5q^C!NJc8{4llU}%mY!BHQCgpWAebb;2&mopw^PEw1#9#O9RP4n&J7= z4T(=$m3iJ;G;l@$EmL$f;kz#a-sHl?<#Y3kr!EB3?vbLBQdceC3Y+HHu6Ip zo!@CMNM&!Y5qAA1IcQ5}KuG5LuJ{k0nFedsU$u6@Ntxo4fk8h?78Cj>mZ0*p!H{pz zTftY&c3>@CxK^hU^DkVU#5xg_;>VFbysfj1zM>zco>x|D^~zik^9f>g>%!}u=MJGn zGED?9lKY}wSe*opcEyBGch|Zi9WVw0;S<8+GI_%zbmD&hi9l7~Ki#*&2x7dMon`BC zCGt599iL-@j&_$wIE}a7nM-LsXAA;cM4&IGWY-AA&yS`TaUdAf*XPmpVN$$>V!id+ zm0>QBTHMdp*L=RAkEIy9Ex&KKqL5id=>0KSwnT%#M3ZWJI$zF)CM8*&H;?thHaCMx zw-Z8;JQcq(3r$6Uch@*`jz3GIS!{YSCcd>98Sw7qTfOGZnlsLmNAT`ciN99nWQt_N zfhU8~fqtHtq5~tLqotMQCs&@DZUEB2Y|s3;KUNwRa&^FNs=1Z&XfXpzNpcV?tr_$= z{M7+J(ww2vLOu8FYpJ3oMxV=AJ0s(9aLz=;>UOkdcw}Q;whzP47R$8nU7IxMTK06r z>}bi`>U`TqmC&Eig^uGL#&QtW`uMD!HrwoW&Izdy=7P(&$BMNaCdhN?(PyiL4&)yTX2Wq5G1%maCdh}aCdii*R#kk z`@iMhyYD$?uMhC7Su@k!HQm)!?^{)aKc#?s4GJ!Uy7~3li4p zE;wHl`{-d@f{|y^y^6nm@-Rx_SP>ibnXBnKy8)*j{c?9R@$0n+wEY0ejTja!{UJ!S zxh6|nRZ@r!{D4l}x|a(oDPw=K*Xwlt>NyCC31!b;wn=zzneAVOG4m7;D z!bpZpIeJ#Cb>_zo%F`=~cUh5>&R$7{COGyZQJ+!)^%g%xtp(=4VX zLT$9yw|~;GwUpX@5l)On6ebOxY{BPiX+_Eu|1h5*8g%+32GTl1)aVA%=mzDAYntXI zQ4C01@vX-2ZFUBj>O7M{g7rn9-=2W#uQ7aA7FLpcrASY8339wDujpHyeKqDzjo7~l zh4w9WjuaGSJnq1L=jl+GvHz(w0}1xd{fYMK{Zpm}8~&eokpN&g4e(>Y^iL5Rc*s9Y zU`Q9>zq?rH0}Q}#=Fb&M&%Yr2s)VYdp+BIW^Sw7kd_p`9+*SSz7-Ln>_p zE;OIbu{fxSPW8~nqoawul|)I_%9KAt=n{%SduA(%8 z%|nGDjrNLGLA$HUc|VzIjNG3Xnz7WbhD2!0mZHSCPy6@>kwWn;*FHGN>sh(TeLoTl zz3x-FAf#10T&QT&Lt@Ukx=gfZ1KQG`XVL`-@Kco;&+f?No#mJISK9FN$>bL{G&Rnr z!@YrtzqN`|D+3udej>YF#r^f+!IHB6J$X&xBCbOJ(KHX>cJY{a22N}%%$T*KMf5&+=tkiW|2jk>pZDoaMH_lIE%Q{&Hu3)shr9kbP&VCkbz zdAIqrHz@&fm0g_;}(kccb-hm z4_u&tTB$iEyJzZfL%Ha+Xd+Tn5Wp>=_PM>dw`_xdEy$wB29x}~$jo^Oa z0!c{dsoP3(qO$`h{Px`Etlc_ZlNT^j@>YKePtLDHy(%NmGlSOs#ToPHppN+?6w;5z z)3l`vj-fh7%MZO~*O+7FFdG2eI-!3i_=r z#4cE)h3qN~CmI)MBrD(DR(_$0^zKBh2G9>8u8pf`ovuB}*Pqx`Hgp`w_T}@ovi?y# zjIX1e2RPXV%@3Osm`H?@M&(JI9SY?`ZCqZ2@Hj}-v#%ByG(|?3Zg~!jbSYCp&t84; zR~$ngTStB8U(^UUe|@kGJAhjw#F|R%NDfg7uz#wfu=-(niQG9(GXMh#c-*PTxeGUlLs$Ywe{>psX#ursWVBL;tQccRpqK z`_Xfv_Fh9d^OfyVuax_g53RKB#Uy##`gV+X8n@h`O~t%fRVP=Bwd|C6pXyB2+Daka zg&aiUk@h;RpIdMYmEoH$zD9~=t6W7CZW&)BFOvvK*1Jc$ z`fcz(KN~WaNwKZq%wt$CdYif|ExDW@lI6#dHE4_|&PnNCBtJMp_-ECqdCyxd`&g>B zSRDtqp2CSy*wn#>R1j2?cn7cZ?2+k7pV zI$)%*p}tLB6i-I6m3@pIxq669=?G~JZ!{Q-^Q3^VjzBwsW#TW2`vD6@z zMZWTY2T#-IjwZW!`ko-*SjEU1R&wlxi;MWY3rS z9{jrB2L-ljqFS0;=U(D=eQ@WfUEVP`&D@ch-;gYq`6?tmq+Fj#A2K~Z&slZ=+dMof zA+1`+iEtt{jzbLnv0e}|pu7{ehY!Gn1aAdN+U%+*GPvx@@g8+J5sn0jo6JvXr(ykq zD5PN}Up{nlYL2Ve@uFTl;#pMH(pNiJlRDxVY&G0gA@!^(z0_2TKE*#$Pn2?gxp%^7 zX_~@+;N2{+^t>w^Gh9wLX7bO1?CRv*N$b0AKDto3T3)K=p4+)S+@j3qtblDuK09rW zG*~=4S>?DY12%|6SsnX8Gntp=YT3u%t!%>*V$vsDPFkZ$P6UP_*`7B>>kS!H8 z5JZ-GA-wgtIi8o|hd0rX7jOd>*OHCrFW)kt_Uw2-IOzmgnA=ln)|+~Nnt!3M$(v}R zw%D(#H85I-aVukq0FVq9jDU1@*ONJy0;+Dkar5)-QL)k#R?s@05wY&LC9YZzu&5(Y z*ivSTh*FyT3VN6!j<>SDe5^=i0`*8!*1uXH9}~hCs)aIpaA}QnWKb!M#h99|%?@k` zH?g}YBFdwB6#!Lp;BF;TMUDN1sln&7=gnRdUBg=Cn-;zfKZ#=U?#?HpTi37lAjPu; z)UtEQ=0q4e_axW2{cH>u%cvknlsDa3wk|@cVl%+U;e>lddrJq6PFDOZOP@m6L3B%) zP7Dot%->A1vv5jxv`#MvbsQ=aBuXkQX+^WxvaoYPzCNAv{`C7|*(zugyett<37^ow z)+|75IiVzfIyA=91>c@U_MU#`WX?;$E9Ooz*$bV(bx{xZ!08(s-5zMB_XyNsMHcgM-A+l*o&XUq$ndwUAnzuGZ1Xa)V9~w~qC9R~W=}P-9)MI;U1nQ;NI~h^@Gmr5LLN z-6AgnODH(7z(MQVg-SS`=C|8E)-poWQ2434=lEP9-*k`nGzSnvz+}~o#{`iS0&%iSrHpzz%_A5iA z-R6YCbf+@gowff|=mFJ?75?eBSAd84>QV4N_Im&bBv??q06*x<(R80K=jMh^F4E!# zF^6tsfTobHR%0dR&au%$Inc3qp9k=egQP5}64K!5gSpo0;{yGsA}q~qs5Vc7rfWr*RPp}rg9K(_=ED)IPiQ75!BGYp1}7$goM%lb!Pteyp{jr zEBt%c|J>~V&(*=?E?F02TEEndt8_UM=X1YD#!W{@v=K-ma!6E;3(`j*H*g2qA>)bf zX%E1`(23fdM)j?oja;icSb@`idv63A9^H9BRmP z6%c@+8M`c8tQK^S$N(pz{NR1G9x`Q54e(tUaJHM$?ky<86|zNMU-0BKVLUdeIkwcj zH{4irA&H?mpNTPwmt6~0IC)aruDLxg)|2dfpcmZS&L&=l>ws|n2nzp&m#gt9$7$zV z;fg)-qSFbq7~&Rmz%H=D!7dV@@(MRftgC~Vp9P)QCnErk@>NXB6E@!Fr$V_mlGBS7 zLvexw+w9m$+kDlfgqDC8>;+6wrQ?-w5TtGHmFZg6Cn<@NC3ia~2*k6+5KUDE(%S`A zY;bCPzQIn)ESy89S7>XVdcU%J${icz`nN}ZhIIbOz+R=o<)NI9Jq;7~z0%a6u1<+5_(6#)7rZ>Q@>2R~ye=h({%Iu{CkEYwJLQC$y&q_^xT=p>@)+ z*WF0bQ)5i*WeN9dj^X1M!i@aXC`R^M0h?pph|1hxX69{tEyl5)Yq<{b;?+`b12Q{y zBN7|@m1vl*J%v?aa~=aPzOS+ter>_!8dieTyNEV@%UxyTb;U!&yn~&Kt*o_-B6TypLU_-|rF=HvZ46N^MNhMWpyTr%o_DpWD z#$>TOOaDOKQr_t&ngapse;M79myVseoXVshNH;P(>lhw?1ptCHZRz;Q)U;w=&uZQT zI@sz;u%R0{@uC?y#Pu#<_!ICW`&2*AX1PmI8ZtSWL+p+Lt7>fhkUSoV;zvytB!urv zjXR%-qIz~X&uS1wt5&6lup6BYGA294?50|4oDpxScC%F^y~M@dR)r1C zb${3UJyT9!*bLX3J0ZlJ)+JkA+ZG`79JG_f`4~KWqA%GwDMu0FC)BqJ$3#zs*?}+D z&uNLYKH~nRl!yoZQk5y^uwTx0Gul}g85{&QnqvP>o5~wnW*~N4P5SY`W%}Hid3Wia z8MB=0w=Mji$s|ADmyR9gL5&OWZ5yNVqH8$mwxgsWRnK74!3 zCbZraN=POp!E1g>O0b^-HipMq!!A_w6Sf zim^1!+DyP>?*ljzTU+Cj=)`T#(a2*0#O3rr*~dtg8tLEhKV^P(5b*R#2y!rdGe zNbmwm(tCaXM(^$gedy0DkaCFLy6fRmnOy~eym_!tt`M~%YhsBCE0u5>Jwt7@S;|oQ z7mH~9g5bt(p3N7wwKh|rvbUdpovbLd9|%P}A5nQ8V*q?phnm-QiWAmw|0u;Qrk1DF zgW~!(tS$QfN?QIF;!16ZlA}R_l&pXT`)BvzQQfj#?)C>vKxg?hmy(mxuEko0g|vuE zyb9#p(hqFk583ufZ7)0&bUJATTNUiqVSUP9q25rEy(?aB_An!DGbBn7QKpa*N6>=D z?-6x^Vm~Dt^O0VCTvI^kU5kG4)RC5;FyA!e^O;61qIHk7zMdS5lc1#t0|`0n zlqo#Sul_|=QxVh!W&sKS_rm7@54zHPukZ}i-6pDpC4El0DL}~F~{SlC@}o!JGCOdsc)4b(R;+-W2`@d3g=x%gW>F;$ox67a5;Bx+~~K zDrT?KeKO{itkjN?lje>EIcdtYH6sndZl}a71q`{8qh^l7H(<|dNKg!##m+1^u6}q9 zIBCWB1YQ2CI}LF%a#t!2wKXXN<$))o1*XC3n?0p1vV4QJbQj%9*x(?jq2T;HO22N} zZ!$Qv@V}wg`M^>%(1&MIAPsb-r(SS1>*+|V%nIv2WG^^E0Ob1xj`;lbV84`;=Z79F zmeZszDK|QyPc`?x81V4@o+f;i{e*W^?{TpATdZcQ_`u+)G2SL$J%>%M;h#>0MUZl* z%KOi~x8ffh&(X|Cid4pZkf zaq$U51>F#f1|mxonp{*;SYCvBD7Xk}eK0>5ApZ1CD&uaf-~||HhaXgRm5?hlM|eJn zUBUnjnxTW#6_uQRF;gj*#gU46qdaIoPmEn!{(=4T63u61wxGMl;XB2<_&*a}$q4;7 zFW9I9jsa`=BgFx{ouXPl-?!^Zx*@6wV_fnzXTPlQzNnU}`^svpFGR0M_BcCVJxUB- zd2+s(g4ZI53M~m;V>pGhx&ut_7$nAbt;cb}do!OfuJ-QwYGKNB+`QbWcU)sl(!?k^ zw4*0!jtU~P-1J}p@%g53TH9avX0X8^>SU2zXk9G9M_xQna*4_J+zD)dfFiM&q-(ei z0x;GvWq=E^PdcWRResir@7YH&LV)q*pt&@cd{5Twz&y?6ZSl+2_;-ntuK>U?UvQQR zrs1$75zem-?Hbl*nR)+%H3SU7s8!Y~`Ds&Y)u|eAEYvU7yHn(+m{YK-Q%k9|N&J+^ z`nmkIp~C8!g(f{IwJIjWGX-fwH}*5kyyca7PTqL$=3jtcPF6y2K$3tPJO zrfll#3xo;dAnj3m zXnp8pDm?=WC^*%yjW&hiG;Km+FmZ7qoub=&lxuDxpBuR8U&?Rcg^Cv3YOQhV%#iOEy8ye=aK0+Q&lDtP**7Nt|$pRe^Pce#+tR#tQMK>@SQD$l57K*UVt zsxLD+VvI+%-@nSM%6aGP&om|lTJh??3B%Wum@Ok8`xEcYCmcli!-IuWBcLd~2fEw& zv#sJ^ei#K=BC*{tA!006U3>=kPUaFFwk+(qtvwqjqIjRMprR^P>dV`v@pvIpA80^B zA{g|%b>)vqpD~F+`3wPXOAd$%pW?&~o8nx~Z^SkLI z5fV7F5*2ZoTEU5?pj}U8cA}-WqQQJ^gjcA7VcP$K?8pypDL&n$ZS2xWYc1G4nIne7 z?DZI)-H7rE;0Yi+lrXJybkI&4cM|!bHF`?!ViCkl)W8AhdDxS*QUN84FBrNV&j#&| zfJ&&{+fgE}w_DgG>E({c`H^!yO2GH;B9jC_e;$JtJMAR2CJ1>OQ73EXo&!I9Y5ccX zfV9B^+Vp$A>(!Cnz)2vw6g3Q<+Div^6VG_CGRKnin4QhF_Q|DRo;5Eb zJCaGih*4kb`hdN`(|v$M7fk0cq7g}aW;FR~5lKZW5|}sWfL;B-!T^8Se=v^@=o~A6 zu(y~kjn?ce>T5fHIwTl}tA9fzN5v_=d&0RkEcLSFL4kJAf5KToNG#k$oYc6&bPSdI{o!1q-Dj4g)4ht<=z(K55}VZ-q>N8Rrugk&@Xp zVzc)nLUH`pZvGkAP0 zb4$|g;bf*MC{SIXVDO6FjtUL+%Sw)7`?Ql)VvVMCz($VxUiU(AJxLHJoU)E4GAchB zbbeptLwk4i3g@Y-$KatqveZWx1+CL%Kztwkob}}IxW8BnKL$=ye?JTaFBO;(z{4)B zKB9(_xii3u+_b^j8I7qdH#rj=27+U6N7>P8sx~_CyUonQ?+1Kt!`xZF$uF)dm#>hydgyE?zX;Pgo)oIU>CsYXrTHc!2=yIsM0T zzj`cxn!yO&YHv8<I zjNjMU7I6RIKc6{ioXZ~xv6c}Hdh;m(_XQ#c9cCe6B|y(yj1e1<)&2&iH5ds6;BvhY zb{M7r_%hsJq9ZDU02quZi8o#wLZCH5I)8`TKQC(UW7tS43f9f%i+f>4l_O-aLsQK; zbCTXV)ij-a*LmHqJz*gK0x?QXo|_TZO(!oU@ry`s<1Vtr?sAizFDfdapE#(b0Lfz7 z(tj09!oX=QA=ze0mVPfx{SK|nW~gdASTal_^`Iu$^y}7u?rUe)I9lTq7p@d84BzLc zY;Rz22A2Wos;#tqqfOOTg);(hy5ryp(3kN|eKFYuvASi}$B zRQa+Q0VgDHn_W}n^B(tE_DecR&o7*2+Ot(cvtByhM{EVo2~+i>r)L|+bI$o{TA99O zpM824>4mvGb}(}c(Dc49c9rEZ7SGv)oSq>8vwjJ(H|N2DdlV4;SQmo;^Jl>P5=03Q zqH*-sDS!lEJIRqK#xp^}e0U^1l*Wp`C5j+#>&kiFYv3-+;Wb$e4W2Aw_%gjmT+?pM z=2$my(d*Rs;1k(+j*~x{uuJl--pW_GAg6ly&R3_#&iu-Vio6LP5}ZIK;><4_&cCKK zw>~$4WV;}n<5sZb(~RE6fc3?K?SPeu0+(`EH<-kQ)E26VHA-~FnysI@W`&7*t8I8T z*VlEd_?oz6XS$j1gW4?q%{n1`Q%JVp*F7t2=|8Mh2POvgCVr_WpE-|w74UIR8R8kT zWjZfDd=zY+#&fOkR) zJc+|Bw<`Zkw2|!%8;U`USh+yL!k~79pt3@}cfK9D0JrE*0s!SFt6KqsE=-B|7M zuL6QTp)8}gY%aS~j@U`(@qCKS=dK$wFPXJTl7z*DSDrO{_9gXsfF#eq$u^RxY9TfSS7a6$0_bxKF=f-b|<@N|tg21C31 zOa44_XL-T4;1R(n|2An*>q+_un-ydUG`3CmBS>~k-h$H^4}+Cg#SrBJ;ndg=+JUe7 zcAsqlow>O~6Rk%`$!`i$CnNqvl=rnW$c66G-3RAXW_3l49s<}ao)M~rb$|HAB2e{) ztV6bj_c>L+qdWr)xIx;dfdn;fiICX;0i9=YEh!h(ckrEkU#%Yofb8Z8u^7qU%}A5e zjg0K;0vQrkm*Z|qyfI4GsGJ51u%qFJKOE@Li2tCN;2-WtuYF@sP93F4sa7Rc8a#i3Iy?N<9cQK3P}OG{?< zBaO>IQ6tqfCsB8NQ0@GR9sL9tZUBHX6C}j55;tmccuQJ#)FOgHF_NJ7)5|Tfm6s~H zpgIKB8VM6LXuRx=9s4diO%aQ(Am@HYj$={vJW(nnAjy%JP*=sN&V9KYLr~aheoQ{a zn&;4nxHYvD0N`>*5}%Cw0a0xOT%Z-s32|2|iWy{W}frA3pb-dD&WFsGFRf9br zQbRXAFf3%|jV8g;pluh*i0B zj1E}jS9EOQqw>cBNOEg5o=TK4(-i^V2iq#mWWg@(Fce3ZmZO1utI=T^sINq1j0wU0 zcTi2v4(F6Po}rR%`8k*2Z|K~==%VK)OaYUzo5=Q0JYXO>AN_%lHwFqMd7s3l=r4EA z>2g$)Og6+j`%5plrGBM`rrE59!EFm#BAId^!4sw7XBe6yJyiP}t8YW3uKkf}PJ&qR zF$EOkWJ;^7#a<*Z2@zjs#H4-D@1^$|NW^k8_&n+6UqZ3boAawVm_u4ypym(?cJ3(l zlhCK$@u4PmaCWYlJQ%m6-qK!X%5Ypo{^e~uoiNREV69f3XU%nv=qg}Ev^%zpaV@3| z#~T_mbGB5`6i5d2KZ^D(A8|=j6?~fYA>tKL$*l@bAE`bqIFO%}O*r9rE6KeMB(t-# z1q&d~>dEJYK2Q`MzS7f0x_4fM2o?1Qt12=(GI6^ReCVR4(|o{s75ECN?{d1Ou0=Y@ zhHF-*v0tmPKfIdq?Ac<(?nK_H5Soh9!`iLre6Ff4NO6T@s6?0^^GHV};jBI+6-xWN z|B`IdDVdOOc=hi&{NUud_QWGtYLEzyB2dVUfa`DygNp{hf*mcDDqfy}=10#ILU#WKNllxW7$Uv5Y@(cKLpy5NjrJIiUio2?l-^3Agke z7W@96Yyp54{C<<&C*u-F7{DKD`eH*VbQ;J_Yeez(b0a`HwEP{%oZhKAUO-iJ9 zuE~ajQ*oa=#-VfPI?5K4y&a`}J>4G;1RnBoh1(s)cwx}R+Mad#{+cTf7D@EOK<8(Y zpe#B6%v@f={G)N#E{wGMQt|w1QW47Tf*BVe#0aE=w1ee(&hL1#-G5fwxqJ=$k{viH z3-ePep+K)wm_e*q=a(`6FFmGhE9_u5308Gm-vBmKer}IsbaU>5tiw3sAH1ec^2$v6 zin?x0-`99XEYo+`v0Z1J)7|hap4+^@>d)qb_=QOtuh{6P9M(94x0d}raC_?nhv+Q7 zsk~yKqU?O>Ln;skqAgjGeesr60N=p#w+;Q~Dm1Q}HyVx7t0Umc1_p{AO68AV-Dp-V zR-j*vKlQB4Ktv(Z{ECU)^D4HmO{x1JY>HfvJA6o40Mr#q9C!{6oHChPH_yuXH>ajm z83HeUNeLy-aALfB4YF4nrf$kfhZ>}g;!CT3YS#mZff6P5FQUjMQO6KZ5y4?ZFITjS zkqA49FbX7{z(6&s#N%aN{iFu_B(YykTUK<5d&hrNp)e=Xkh-b2M+r4nU)EhS+idTjr8s7-q;{l1Dj~Er zn$+wHS8jttg#3_E+A_qwZPK#$f5*51e4BXBzyQUOgx2gnt)pydIn`}9 zO)nw^o|$_u2h6=roCX{15)j_4ws&;2`J68}`s~r-UZAi)&{{t|kY>p;0)#3Ayf-gL zO049J-Cb71nNRM%o_(C?e<+)3omJOqLv+@DEpy8^lxzOQi280wiB=SR3ZMW3Ol~6T zsft#*?znW152{>oe&uL$)YDd~?z^N6_7SRJS2$VX#|8c$^JL~6|V!4wLPJ<4ZOcyXa%n8Ldq!d7dJ>8+!cIsNg}3^LcA2`7n- z8bLV`OD1BHNmq#Ze|UOpc==7FT;X&=H8fAuszWwxCtSWJN0gG?2%$1r$C&eN4#bmH z->qg}e4+}kP?swE!iyb^gV2HTtOvbg0i16}k%UsrE>*8B8?KInQic*L3ZNb39PLtb zt2LDM@SN?b!f{S0k+|1=yJU%3vQr{)_|b3@99seXH})FVo~9xross*RliBjM_Wx|j zK+R{B`%!*Q#yHXbc-WXP^mA8Iep}V+I(Kh@1<5{pqt6ae#F35ro4C-r6;MDJplLE8 zg-KghA3tVXX+P(K97=NoF$&W|^|Va&F$;B#8yq(3CD1*q2>yy$OUzN*j0o0T%bdQ= zlH`P!hLd$+quNlP6c+8?j95_UL`1+juv5i<~y%@md47iE2ABJ|D7!Ybp&gh=jxqT>8cB4C=ZS& ztEh_rXOesS1B>IQCoUT?K7Sq= zI9>_PcxqjUNKNP7U=i`G&)R2vb8CHVwC7vZ&Rhf zV--2&BVbwS9U}uosdt;pKQvu0*+6)x)(;ON4{g~*qmjOC)_@S)XMh0LZhYqGl23+h zOKAd1+vpz_9>bHV^U3j#m)?i|mk9sMU;m5y=Ho8OI+tp~3q0xYe&=?{NSHBb?y3vN z&#j&CnbAN5Mw@78PrAI1@0|r0GPwO3x!BQVf3B+*kZJg^VIf!~RR7A1gZf@GNQRAS z=RFk7afcZ}E1G{?7cXK0_#Nmn`>zvQ2 zoX_{4$-~%VQ=b^gACjSJp$9Jl;{LNrD(;(xfiG9QHbg7F!EiR4>AS{oR%-|coRy_M zifJ8qnQndp7*Z1rD41S&`U9`Muk<2J&I>G!cHZW|_HtCi+NwT^GLh>YP@?q;Wf`17 zBw?b5>qb#-rPe{6oA6W5A`w8k$(9#?#;^Q3Zf+8i4p>5_UM#ClEmvD0ZNb zU*qh)Vt2152WQSSC^C>ZHvgcw}gfIQ*tPj$56HrZYaU6dm!{ZwQ@7#FB8m!F7NxycOW4C#ig*x7D5hLw|wIj|UB3A51YD_QR`yqbPtR zb6Dfj`sv^Sf&7rPa7pB;$YNKGk*&o-pQs_r@qTy8wW^PT%;~pA5`HH>1e_ksZAOm` zAu>}{3ZX!ZY6Aijh!nY@W-yCF1D@04Rj#PC7Izw34@YTAGKcU}L(H`&e}gW)txkOt zpIm^RX`;F=th`$# z`k6x7zBPYh-4#~PK{h}3iZS#lMpng@&K_)(SGHC&nw{=7wt}YfY|nskwYYHmbJzyV5);2JS0o8`Fy_mc^@%fr=gVbg zoOsZNg#6+VAQP%!UB#girFrK%VhmmoeL0w^26k4I3N&A|5}l-_Y4KBy1xSWZDa^{Q zk#4B>99-m4xmzv2iZ{S$GQG59Zw^d&P*iul2h?E0kNX_D@`fKMj&<~L_S6KVI%=(k zDn^%iXLvfcCDk*o@lLT|1s%kPNKa{$raC!FWkip?QzG&)?lJ$G-irEWUd&!cOBk3# z5ZY`UbVF{GJO;1idFriM!@eR{(k_rR2-e@t&3)s{A#>jOhb0gM|5q$4M-SeDo37Tk zl1Lb90(&~1-v&(&1Takt5#sO91epCWe`Qt;+I|ZQ5c)E&ME7iu^N#{a}a~-hybgLlgm2K-NYbk)|?$ylRi`SG{ivmyl6~Lp0C%FwaVrEi2r4> z4jCS|_uE^5Or{t4?v1x82VNRba{Cx@0OW*>jh=uYvA>wS8A5_JsdD_sw;Rs$vCc1> ztPnsLEu zZZNIOInnBm_o)Qk!261t2SU5FXsf&!Huy4t*>Ov!_H-O1gOK6-r=OLM7h*H@JxmT> zjbg+Az+YIsY^g3dIF&Z<3%8Pucj2r(Tfa?{Kcv8@9j6D>$LfXKpRj`P8fbnfx+9`1 z{W9wZJ0MM3kVRS$62OR|>1*xl3>1Icgx6l7_lUPbCUEfebdVf_NFd-6avAIbxnG9> z?rQoc8m{pEFQ)u&o7Mj)oa+DTVkMz%z`KCifyGuuMV0UaK!lOi(E1`o4R8RL|KyzL z{Eu=@Dv-EKd<*rGJH}6(-D8%Hn%DkJe_vQ?;fj90NXtt8ed1Bwrl|7}2}#LM-)4z} za%*T?hvFqhnj^9ku@vZdAETP>nH=m6?5jmD|#m3vfDcd>ogG1!2A-3Jfk9?qBew` z_-ft3YR!Q-`yOun+bb9kcq0g4(-tyUHJzg|A;%Eny%--bKyPj)Wz`TRcLofg@qA|c zTyyHtx>SWT7;hJ(MdPE*>~Mg4f!06sf$=Y~`{`06%~Ko6&vR#qE)1H@oPc@0NkC7+L)2u5lA`!nHT`$V zD9wA~xCc|GVaCn>T`I{osCiFsw+N@M@B^TY7{ru>G9=u zT{`elP}!0Lz@zLLz9HEDWL5dT=U4Lan`nB~+%1zflCJTseStV2e)ciMACb2Iu5%os zOa0VvNnr^2a!USJ#* zPa@J?MQGYRD)30_AUr}}#iludlhF9ehX`oQSdn$@VQjnES?(+q@)#A|d-MnxGC42X zIhmsZn#lKd^7h>C10AwG3MG7JvOG41}U9JDcUO(p5-AY z&e}1P?wQGz4-=AF(_(~$aH8gMzDp>{RK4I=z@@uMg#ATNHho2z><7Pe; zxHsZD!v0W7J~IRo7ZXiN>c`PCV1VH!f@ntCW{vnGV2+At@JkxCZx{~_^ce*$002x> ziMcj1&KQIF;o-3yz8D-krtOufG6lz4Apiz&TJl0_X?alB7G!jRywm_HmI~Z6`0=A< zqV04LcambyS_C*Kc61-XHa8M?wi3uaRE+W0^w*@v6V&6UJC@jMbtvM05>%Mw%3xCI zKtTZVT(jLoTb3qH`CCjT+OGLKKtyzs>lYmvibN)e3TxJbw?j~eK945{kK>E{;1SwIwDl(3)`R%c$~RDz*}(s!9PVL z-to@{2X+Fc(R#85&aaiqe?U-4ty{gby~6WZ(0$e@x$;Z#;0)Vb!>8N*@hUQlczfU* z6?Nun*wOP-a#1;1qITTFFhOo-*B%N!w;%+083TN~+gaGC8|VgQCh^v(er&rgHStrH zf3Q>->2i3xK0qQ?eK4L57OXAWXj=TL;`Vn!1j9@KCxj7Gr{4NcaImrPHW!R+iD+Wi zIn2@}Pi%{}3w@>JYIF{Fr9-axK@mtj;JytazxJKO6@0)sys7GV#P#BdrS%&Qu{zKUq#gvq%S#Rrz)(BpEDf zfnWUL2e(kgXNF2WV!@MtVzYt!nRu6PQ~Utsg~HP4yxo**LubJZk*kv{0PqK=6lh4- zz=4MxBBAit0oGWw?Ysr198yw&yJX}WYn(pq+NJSU_8OFW+RW9=Y}6%6#U#Y(31xy8 zEpwA$%XekTc^z~Kr3m|`*R8PTeI#|PgjRxec)MH#x^6&t!C{SP+eguT2j3Iduy0K; ztYaYULFGLUXM`#)i&Y3Y(8{M2_?|xE817u_Ga4#}doWVU@2<&&J-Gb4~VYd6qHbeE96WAo4zHv8xf@~zteob5ECD7<0)Fac=Y z>swN^C*1&?IC&FJ#(?2bpCec3^OZAJbfoYI!y0tvfFRU6N>(F1v~8mLqFC1IFO=$Z zx>NTaDi7StRSgY>O!gN|0TiQ2!7-Yo4z;p}tcp-T*z0G~DRW*frR@mX zR7zerqg9)Zmo)3Ol@5jt>)MJlUSI9nQk$+6UisfdpbD%h8)eorP3oEk={3n2jnb#< z=UCOrzs|8v4vwG`>Xfiwdew=zXTk$S8}8L(6pBv;+qxyQw)M3q*YAh|^ZgK^z$I** ztNXLxc2`9aUss+shZZ_aHEwS@1|hZEo3ra#QJBh zXx9+BPuPYwq#v(6pr3b90b4alKrqq$gSD&0GI=3=#tf6*1l1ICL((kq)MUL)zKhVa zC;MrW`0RRW=Q>@3`ae1d=pteiUT=s?pQ&L2vOc#(3e-JM+|{T&@{gN{syARzy-%q8kV1&bKISH=io+BfgsZ z{Velj`GGt?at+_5+ZMdJ{sU@!|0bl}5mNWAB%J+VWqfdCbe9m_$qP7T6mGdvhyyNPqxA8+8z8ZjXHfckGJp-Gs- z&A}aWqqYz}R1?&^KTqLWI$Q zgQV*_e9DvbuuX3qpth!GP{blGwBp)4= zxl7x=;w+`QZdL4~8+r$PHxC<=jY3KmKbG35*rrD9?`~g6j2#CXn)d80Qb`Q{YNH>=z9P{ zv9fP?TNVC~I9{3=s|X|s*}jY#B$R6{paaFiD_AN(;CJ%bG)Fa?rk#(feW*(GxX{6i()<^P}2`p>*OIO)xOd(K$MB9~}<7>JO>$e*V9w z;{5sfzogJ$hyx>nj3r28j8Y|#!4s}`sEcokBB$(*&u;PD_Q5#iji4ahq`~YT*VG44O zn9?!=CBu934nwhbLIwOybpjrnpzUmd0eZeVMXjp@>)P)xQv7-v`ky47leVc14)l?O zKH3C7+l9PGxAH#xXJ=VK_Tm%-sM$Y$C=l`C5`C9ly4PQ~`hAxJey9pu=X|l@fk|{L z$i#>!z;+A@GXLc*`@PwowfE!|pF&3Yn3{SR!x6+AScw{jLSW!2lon<&<9_y>=`DbC2y!>Nf+9lBQ>p7r5_rC+gFaR@AvZ}k7VPijQeRvaJ`o3iSYv9q zz*L6=4?u$aIUYL=73iBJ7x-ic0v(i6PY)Ff4A{=iYd8N~ffw|VB=#kVemh(Kmyl5G zA~O%iqV)I2LhfvCuT6my3SblDHwwS?6btFVywd4KfZsOsdsR~zF!;w0{kNd3HE*j9`gN&wLt6$DDZz#nLO3>!Bdsm@SpP+ zQ6r-wPtV(cEo=7jFaEjfVeUVd{6BB#b`bM_42%RaL{_UK{=e<5i;{bnN2kA*Who%@k$g=uQ`71 z>%uMWm-~QUl|6anMbWSz%!I6Dc>m*-!)}dtlIve8{ zcVkR-O*g86&F8R9tJD~s4m@wIrg9lQc>_uxk8vnY9FU1rIaB;%^8^O;geEb!UVmd% zw~~N%dUv>osuH!vpdqdV>%Uw{%EHE^C3I!Q@Y)R@U|k#^bEma9k^pXY&X^v$aZIxQ zJQEJpIUlvz+LsQjvpMrcc?Xa=etU$CX)E#Qh4hnRU2}KFFAd-2sYI#JNo&kV0VM)% zVU85hrX?V5d4X}isqqIv1~Ntr<|`$*XuWTF%5}1ug;NNJnzw7AzavO0bYoddnMY z8wnj_#3|of+dajn+>l=8R8NRls#9Kzeg}Re>85t0E03;EE#DsbEi>SrzdeBJ+7LN#;2tCTIolm zH(V%uHx|y<8*Yo-1QDslG%gdN!=w5vW-vEu{Xx8dMKgQt!0aMz!L!0>VT+RF4TA}q z*zN^Dp3&*AYIUrt6$U{)b+5dUSE&uFa?eA>@(iZhzN45&gHggenbYK^+NmpB!Gk%^ z^ZlK?-U@w(H#$O1g^_WvH{pxV1GQ2e?x$l1oR5q79UYvG)OW|sSu)L>qpN;iXV3Aq z%T?3y{GY!#FaVOp;;53HQP<{Q$#-Y!PjG+4wvkoPdq?v-e$i}QRlA~ITlJ!g_NgwO zdctA5m0tDOVTAwmziK<{sJ6eR!3QZ&inUOR6lt;IT3k!<;_jgocXt95N{beE(o&?j zL($;wt|7R)1xq&lJ-cW3J^Q?8_dRDfe3Ep1FhVl^GdC(!@!{hLxkT8>T(!63%nPkqfr=bBT_EU45Ren67$~w! zL^@N8M`Cg_{u5o#qkc5Hl+ZHg}0KFewAA)y2xN3)6-KecKWvtq`_e>>!NOdj(x z{*k2gW^ZO-{}6w#-`NyhI(qPGxM@ce;kKqG&Cjx;sCsY{SUMa9YWHV&aU(i(*`nfW z8bsl3$!LX6iy;PB;*dMCI+1fzWzez9JxN*f&P#$7KficsJFk+iuul`WRFbDvFPLpF zYwpgt!|t!vf7ng@Bph9xcZ#+3Jx;7#fz^g7F|)IqFRbAb46E8z9!DTeJ|K;quxS1I zZnW5LHBWA_C4L|U5a?}D(;f#Yi)W7?WIA1M9&&IU;V?9gYERU)uMf%BFYG>9 z%L+&CzkYeq_tHevOe^xPpYlOEIl#p*Qqp?Y(2CpoxCzil;f|H0bmZs)<<>9sH(Ca? zH9fyPNY9#BdnoF@*8Fq$2# z!Cvl*A0Pl1upV3QcEqbGATRD#hQ0tFgEmv+z4^mg{;V5seU9)mi;1Z24~tID=i;?) z{X+|1B%TJ{CF{5>1Pzg1yG^i0dRrr3 zv6mJ6JQLG!^L$dqK%i9gU^FpY1YQn|^gY0gDUj(4HOH8$D}DKSs{J0l@SE;-~K>k)F&%IK`gi9gTq zM%@|QPri7vjF#pw5^%&J<6xpRvebG5n!l}Ee;LC*06QKmLQ93WteoD9rBrI?OT3D& zxk0+xuK&hHpl3cU4~0Bti_ne#g=!{a3v+`hz;IzaK(pfY%!Yjar{&J&(X;D!4Acb$ z0a*6{xY!9U7vb+HumG-BH%6##P)5*`pgdB-Qt)!D2$%_)K6o~2O^Kb3ohax z&Klj6v2I3#B>EB)2+hW33D$zWbliQL>7Gn128g}&D&Iop4X)Uq2TpgS-6PT?Q@wW( z2NlCOSR|z1GZK_#eJPk%V<3S{;97hDL;3Rb+9e_AngU=dVucRyGjSsVxEPH+Jqk-KQQ3{xR*Z-jsc+TXG0S0yAyW^S|9e2LFB$5 zv7W+M`ia{8+*p+bFkqku7Z&~)tyd663nclD!S}2t)c>W#XpVQ|5Ii7PU(2_fv<}_H zYM}M@D|vZK2e0af^>#Va{MXNhL`hVr`jErmL6^@N;2b8;VrHkP_(_xc96hn0xj%k< z=^%ekS)2j&-OWd??hGFNVwq@Z;3t;&Jg`RDM~)zV_mc~(HO=qQFI4v?0hB!B?B??5 z1;H?*0VMUlWL4|^$L5-VL9Zrp^7ka zcF06$(h?HaMAbpQZPI07^}#xw+@=~CT$AyAs^Buo@m(F>MI8k!CsY!q7LpuHjMIo= z(Jfu$4#ebo`iGsGt)%cC`Rum}4na>(z3wx2@;#l>H`&x7WkRd?&gBp#9848-4opup z*Y)evcVqZ_v@lZOzW0JHj5;#H*Q9;MTyU#t+x2dxK(h*lud>8pjp~xZxp|+E@A1df zR&M$0$GA`?)?s5yMN6X|xYBVR%QFTNT(=EEP(LweOLt~iB(q^{`aluI9wi-BHmBbX ziEKU-aiq+j)kq)~_;$MdY;=Mmep1dE`W?8Hojdi)=xrlSrCyXNLIm0?q0^hi&~AX% zOD)nYckVRwSYrF3TPY2(gFO4C$;4CiriIx#^=`z?$Y;weO7tY0&CaC(J5ffOroI2D$*XTg$Ctj3icgXEgmFf$lo z8%bp3jLPZu@%cp!_8-LF;KI<&N?eK5ip_#!N!p@W;|twdnyi@=$aqawvPhZD-N;%* z{^4T2fAw-eaSF0!(ryuHCGzO{a^qJ!a$&X=yY1@5(aP)PlW!?#6=&zg%!RQUSAot; znX4~6h0G^z<*@qgA+u&iLLL+}$|5LFgYyV7gwBle+HL77Uvzlu?Kfmj1dFUoby1f> z4bMfE0L?4iF5+JcFyIKR=9SFQLy%{^s~PurV}t#Y_)C}jLL<-N%S-`>!1}8~=76dO z9C(}D-tj}JjfhtUUB)`1XR8%#I%o}wC@0rln%k|#7l*$Fu%s-FoPCiE zymaL1yE&lyQhRUEClS&wllGoc_q3W&=Va4V90S;;5PoTkh!xzs-J&f-A;h`#D&-q|Loz~bQ3DE_JhB!#7-~8S-cAE^%KP(s(j_Q># zp0>Hw%MICwOfF&84j1Zrq=e zxZz7Y{3_T!HMr9*3Y$O$ey0qx!Zar-!=T0%&$IA)ZA0a7zAX3Wb`02NZ$6yz5;FOw z^?cp*{DP9E!rtTgxL(xl0t;y%cZQAEO5f9_7!(%OPNFm4NwEEGf3duck>Pq>J{#3K z=Ed0_wyF9eS>DHa)YX4W4-Ko;Nv8wH;!7@S=Z$D7RP*;22qxl@_1aNI>!>Mp9%R7L zpDnyPi4CTMtH}bv{0bl8(c)tP2PgJpvQi!$e%o(1}LUw>) zk`U5}hv0{bVl|YfnNJ!m!_sh>lkmrVPgA*g)6*j5o2EA`n361EvPxt$-G*O!6;E*m zDYkg%OFc-r5F_*VS)YuGO{>yH=Fd{FSXN%2Ja~I~+?nHhre4@V{VrTBjZZwTGH%re z{p8_n$s?jkQhs7%7uT<1N7oz73b9yg*2rooyjY`U_?9T89f|YR%r2*Z%(DaZ_Gv1XT0)6Lx4? z?+V&pUz8TX!Q>BZ!O16Yc`g_UWSI;Jy`~KE!Xaf8d68vPh*R7< z{)tL@TVJpbJrhG*l0+y*?43B$7a2(!43JbD5%774)VO8f`Wx}ADA0j~Rsics8Y zTuvniL(hyuJg@-Nw0cIx)xaODhXIbq#B7RKQo5NA#L}v;3HVic5cjg+^%pkE!C=*( z`p1n#rMn!7cuP_hU(@-U#cOuv7R1?YB7O~n#SO9S$-m#0wNCJSKag9FbR`Z6p5O=x z?w#S5pZf*`IvY2?3()NF^XfuosGQ^WP--IKkcY>lQg@HqS-PUzhEIcJP;m#!sCG#w zVUj-*tq)wz{aAu>&)R=17X;s&!ssx5=QZ37WAeA4T7qD*vX+x?19e|11axJp4RSVT zrqPjA$jw%ZyiZBwb?Q4KEuW7c_kl9v=7r*HGQ^3BhD~Kn%1dy4E?MVQ81aOq-;#=W zUU_m=Y>8M}Hixvn@(+JY)dt&y+i~_F3DA14J6bpxcW%$QhV3Za^GrMHSc#POe%S_U zOqROi3zR_D&R^>obpH)buwL%_AABJjfBtlDr8w`bb-G0GS7B~#^3(v5m5TZZ<#RF&FMZLfNvORBHCKi8#CQFO|L`6(8%-dp~+)Pr9A(>Op$_> zP7B%`vKP)u4!;HR)L*3)*7+x&K|QI5d3T4f9CQ6tMLD)Zb}xbIaZ|myp^w9Y8f6t%j_-F>YjQL9s>niVGpjZ&6*iCe z1m-HG(-cC(^S`^e^WW6t0gEjR)lZgdXhAQgHO`{Dr;-=n{a^>PW3(VFRJp>oEHEQM zE#!o_G3cI5-Z@~Eu`p}q_J|gzuE~-c6$-@)Z(S=-dBKs=(*WLJ2j5-sYituV#FHru z2}bLmbJ%kcz?af=73gp>?`Lq9R;O3a=`u2uDZDs^^aT(RjZebp2925n(s2LzM+ zOJsa4jQB&ZY&;m^zLX8xEo*Kjt{BP;8+!01zyH=vD@vO-wLH-;EEK+U{E5i6AWyh5 zQbo@E*@6;ru>;VtCj=%OzQtYj=j%?0!2pM;!lhd+U)k4ZEb@$pFt#%%Hd@prTj%{% zrQ4ORQZ>tN^!R<28xz4|U?h3}h6Gm>*AqPi5TkP1Bk^Tz`qT0&yW=MzdyumHwK$eN zsM8M@{ZKu=_ZnuYe`OFCi)}v6_3|$3(bq0%ZHZ4OujONlAu0_&fqj~|>Zjda@~`Tx zEzPd&8*OihGFpOI1Sa?3JpZB~QehD&Yo)7sm7%TGq9>QjCZ7=KO#0yXhSpq9BQ`1N z@}@cCeU8?0WqO3o^i+VJYAzeD!mD^J`h+Ss3Vo)n?_P?GuV^f;?dN+7Wdvey+JS2Y zJAv2W*Dx{|PUCFtj!DR)o*6-IL^-S2+gfXqKiF^qhgs2`KI+r9SDmjX>@p3sY?0Vi zDfy%hMed6iP=M62TB$8fGe*8W;X-hBa zOi57>akr-edciw#JPMQ8th+B%9U2Y!AlnR9I;~T(`EA1_QLRC4z!P->(y2T-smeba z*Uv8Z($|k2rKHu-9GzHxp?;}QGwBxIyTx;#glL&~y_I9WP|<;DY;*Kzgi$Zmj;p=q z$1B<-*yEeo;B_3!g@(^Si`AnTZoyZt9B@+S2Cq}!bBT8yZVEOl1oA|NzU4$V_?*(BZORMgZR)f+4 zcVzG=q4}roH?rEXpWyqS`^aCse;Hk#RK4?+`ekBfJR$r!ipKF#crT?@0i?css`IiU zbF3>6FM~Hk9sk$dZA<$ng2zR#DhGU%O(sO$-nZ-0Eox=U_R8`K^ZS0T!L9k8{sBqz zc9u`qbh_%J(cLcw3@NoSMXz#)Loqh1KZw87!RFg ze3qo;qs_{(ktSE?j!=J2M}9Q~;E{WDqt5Fgq!ehpXcL%B{U>T{eE6neTIBJKzV_%u zB&(jN3q$`3GjOiibE0P8{E~xp|I`OV3v4h!fTNjvrXpifW!jTK_@qKrb z7R5rjgld(%6OX%vZ%nEsUOh?H>i>p$w>10BTUkBP6IR=SkmKMGPPupq;lj@S{SmR6 zYu||-BU%4(NO!_npW$E{s^0zt@#Cc|2l-g(dYK*6Q`db}amzuQ)M)m*s4NGIt*_JW zT-X#x6cKwgkMpTK&$;22)dnPQXvIT2Bfy-sI8C=ERFCA{Za<#MpXcN+3I$ z`kBob?G=AsCnzSHUTa0miDXTM9O8C-?x2qy`Lt6l({hH)XGf(8N_%5JtVwvNuIjgI z?)I_fyFraN{~-65(WM68x2y@Sbu)}hL!rj`%B!ApYW(^P)XBm?e2#$_5ZGlNTrCn-|~9= zmkq8WS9(KGgLXM4dcZeS!lQ8ZGlmD-<;4AuX9kOs^S$i9g6Ae&i`I-o&p1^M&-9X1 z-yVYlY zTisgU$eeTuzfP=9mx%l#;n_^94png|cK#WaZ1LKwmt%r{!$&nGsrI3{`dP>?2Gp)$ zUduky(mfxF@=F-Ftc&dDl}jz47o&_;W3DWUIa&`j$vFk-O}Nu5FTpa_@*MLr#@O1Z zi9P49u2{eLc|Wu@`fEDjg!+l=g5kVCCHN*^iy)`+s@!FG@yY%hNK?qd?EY`?qP)9B zqFzA7cXFzs11;_36a5XZGkp>Zw7hm7#iF1k&&fQGB(S7`&h>e7!Qj9`AT;cHL)~YJ z<*QUDodp|w)|Mw`@b$SN`KOoZ3VU2&Q&fT`z7F2j2BRH2wkp*6P{?qm!CYyrGpQB9 zdW_o`ookXbTe{B2=-y&2rlb}*O6#!<4)xNVu+&P4)aLgBJ+`RzUodf-m?ESh}>=VR(QeRa=CA`HZ7$3Uvl)zk?`EF(kEv_;%_auKh{1iLh7hot_-}wWNxyE zcXOnE80qWk>83`2CfUBzJJ_~MnI5Yoy85Dp(&|h~&KF3P^48V7-g%u!lC!fxovk|# zC<)tXj@UXAeDl+AC`yCWl!6fR-S?YLbgUM>s8UkL;XZ9Ta{adv>d{nqB*rOgOGNV* zJXRRVNmImUy~~K~8jj68 z&RVk2GoC)0w61{$brz6`+^PgmA%sC(dbsX}ef!HX+i!Wox5Hx-dX#i;s~;Yoflt0n z%<_zVm977CU*3{~!uIxJGq#&d0%UzAX%{a{2`x@W7xnenCISO>l2HCpm>58;}|5MU%?Dd%?Z*oQdLy^SpNol|`J=4e4oRx!HLa-$7LT``6kzOOZ|&EyK4Q zCl6$t>(%Kn6`<&7_m7jz`sd;2a~tLcWe!9tnSlJPX-B%_Qm8AB7)9R2Se`QLRerX} z?{3NEt|Wg=o&}JriC=fo73-oEKlbzDY=@-{#}giOYO*Yk zM6jPDlR!9@DUXl!r*>f@Ga8(n*1lDypw22%w+4YtKV!PVKw?lMO~^f~q4?>@&a9F4 z8|0gXTWRxY{b@=r;%6Z-_(q@@ZN7@NldzINk(~lCA5X?Bfx3f;_&KrSk2Z^z@jWTJ z>aL*B+)yZQw1-r7fr;AO)Z5=zOPhy*q=0D7ByOiZbW)m@#EBK13j?41Z&g*|11g+m zmOu16d*6MsH4VOiSZQlqibK?9>uA;RibM9~b;8}1sJjvzXPp;ihe#$cR5hm3B z>p{;#tb4^sag+7(y`6biQO;D0Mt@aHL}Bq)UA<9?_g6v5?Xn|r!|YF!5>hnJ&FCuS zqxzPF2UJ+{b2t*B0x2!o)Yhg_^FYN6q+!+ys?pTZPuZi@1b(G!OPG#yv_H{*Fd}lH z4`7dcb&OBDRHWn&q00bgr>N*j9a_cFa&FD42M+U)QfnwKsA4B*&l$C__*J33=6>fx zj)#yr@#)c-R%=#z{CpJEHSVjFc~nn>hn7)OW*D)~Gvf)#;e@0q{`?CA{eLE5qVsZU zq=>1CM|O8EPfMko&Vcx{d{hsiou11@)mGbP2|DDZ?{|!^3<@pOfZrJs6L+LfRZ8hK z2!BSA;CdO~sTb&LhO1ZDKD7W9)7`2+S0c0r{rp{{iA#RFUAHVg0g?zxL{+5x6qc>| z6VWa5_LxRd)v~Skp>UyzW%WF-H$RXqHFGHbE@S}IZ4>!hklj1L-TuOW#!kgrMSw^2 zTgf@@4oKQ0LlQu{eifW6*6_7)nmebORj(#skmDI4aZ8V#H=x%zN(>=}h zpmXPw;4ex2xxCh*4G1*PnCka4qkZxQQx;$z6aW}3rN;o2mL_t^tjFsMx5RDGMa(#0 zrRNge5aQGA*Wl``=t~V7UZM^qU&G#oVlySwsbbArUDIvDuE6iYT_?$}#(@JI#tPGe z9`AK}a5lpgD8Vuak4K-Pz9wdW=}(Na*~A&VmJZLgQibsU4zuyq}l?rGVKUX z@J_fZo>>FVf)9f`gQyng3(y3)TeAq49+d#7F%eI+x<-*6F!vvCvaeWS>LD|+1K#Ob zYc{wde_FkQUIcTl&0>Fl0jYO6^?Tys8t|wstF)}VdAcEz&GjFGBP0DhI1SVIi#V2| zp>{fD@ZkFM%^4kx<8EXNn$beh#7m4LjO-saX%~#FIE_p#vRsa$3(c zd-vtNtmj@BU(Ys4tf2^Ol5d*4a;R(HeV}$)L%Mz^I5gK}ktn+mWY}Uwl zR(=u_g-yhaX$%aE`+oH^^iUB-b9zXE3gAOAHPiAjngEajAKOW}wWO^pmc`mr2xkN~ zky!|bXbMBF4+jED0+htIv1GI_$F%IKpIi^_963GI3gP%L3z$FUs}7DQC@U8ZZ0*{o zBqt195cxX`cv$@84W%rn-^%E$sk{Y$e$2G??zq|uJ(ROKqHs4VcKfdOSc0*Y>J?ej zSRBoG-3sDF2Lzt&zGNs-V{qpF{jfaHpGD zTS8gKp67E-N`sO}F8fDZRB#eK#WCM8vhsT`t$t;Dv%aH^rElz5tRkq&ZP?e^(J ze1bRlo9dpMu#l4{_H|9&?Dm5GzlF16j`%c?#Hpq2(Thx(CEhw>o# zej{czFGDlt914ChZBr@NrwJ;J`DMUbVwL9tD-+zmO=cb0#G%ILA)9+P1%RNpMj^$B z;3ma<-*`7lY`4j1&^d`~-jr148xF@k2Ctd!c%K}Gx20jSB2@Of?O_S2G)I}=fyZ$x+o*`yLZ1Mt8Wp&-HVtxH1NV5OkgH8e>F|GO&q<-4(o zIIE|B7a5;`*2FZSF^&=MB|#=sg%)t~*_)w-0v-W;4twv{%X**G23ap(CPE&YW2#Q< z2lcK8ca;nOi6N3w>Ztb9|o>ZKE|Si$ep-@fF0Z_Xgz47&)gpy$evt?;gbQPzR}oi z$o9n&IlpSh?cxN0Czq&LXy&K|>9ckJ3O#LW5cMx!4YM-!iI}`YAg%N(RQMp{sRqqk zCcc8nyL?-zS2D==Q|;?`<+x>X?r`!l>hOo+##pS$Q$NZ6W%L4g$aYjTfB$`# zJ@TJV{|%k@pUFP4Mfdk7ZI*{04|5Zvl5HsVZ?@}WrDNWcuy;{0(fpnC4z36P@Phx@ z5dVe<nDNbk6(uFD;~uOSKMgyW{yun;xSU;y-|c|Jk?`mdu!4jp;}|6kFIv zv#!>M0vIczwO$ zLlp@GjwdvbB&>oZJtrIzH z&z&4uAB}B(uRL`|tI)!Zi872-p;rnmzbh@N1&l<)RuG%aEOg7oj|i9Dc=z~i+OM==_$Ic&rq*<79G zy(1Mh?}!=JK+dP5t0uZ_ZsND9aFlt=WCAutlN8L85cmKd4qL}UCvtdW_G!eKbn0!q z7#xpBkxUMRqhG-=dAQc)uV2s8%Ku#k#&?Kr5I`$&%&a35_%-i+@i zkTva-VLjh^C(X`EI=Wq|3*MU959~e%m!Z?X_40xmp3!&?eW?2(|99CO^!HeymIoCs z&4wn}ZF4kB9TLb3y4wQxB|Bcy!i_8Da2IH4ImY+QO8oL<|E{?uEkL%&rrihc6D5G7 zv0i&aXH`>k%z#XN0x#PR#YL?qc>5d@Slk`kd5eWnf5`p)+>#vw2r+Hxiee==fFmdd z1wq#i4TqmK0H`w6NPpK}DN<5}y)a-KH%9zaq@&ngYQ7|JQS*2sT0(V~j|hMhRxRYU zhlk*Eu>(-pwQh7dNz7d!S_Mp?H38=g}d7cpB2l#0q=0lBj5_!k!q7$>Kd<;3Ds_QL!W~4z1@$ zl~bk(X5E$bD;_3Dmjc4{wp&w=3-Fxe9N28PxzwW z^w@e*pFm-q5>XBbTcwd+md6=Z#JCKnb7w`K7+U56>VaD~@{Kzn8nVn1$=(x3a8jpE2sxswZQ6#ZhAPz>)TC`|C`V z97NPodrGsSlau)YKHwpKybJ_a>WP~5eux&hu^%tuw{exDYAcNu9bj&H zp|AH3zFf!Vx0%mfokJZot2Yo*qjp|JXmPlI-N8kq?L-aeS{0QxRo#so<$^P^@ z05TD0ACJU<&MDhaH3*@FX+T%htjTH`Q~oLJ7pLY^!uXCtj2p;}n~SZ}NDIiA-1p@0;5&JgjQ9OgxM8!v;gSs?*YdcdbRElKs`<^F zFJ7%}8QsRQ-ECt=7)&V@y_bC$ABzEKl`4hyQ>xp_DI7nM2X=z6#4lyBp7`-x>4C z3VP5wC2@SZKB&!5|1DzdZL5To@kE+`>-rd#b<6FPS&u=Zx}3r-;rm(bP1yDT3tR_M zb15um6(Iov&sSUV`d!(p+|E0ZXOkZJ7U)s^%ms3}y?PirZNe>+5QI5;<&|79l2uynP@y}JN3$}YCk?r&tT+pkO-JD z6GiM6sZ931er|-!Vpaw@x$S9_k|^vkc%ls6M91(JE8$u=6Ew<wQyx)&szsC%xmQStC$7;@^xI#nuz5yT)2~k z*k^*5^8JHK3WLijXWHc+4Xy3Iql_eW8|j_0E|+fY5rYc-H<`{*nM}mtw*zrYKADCz zz8URm_f;dy5$|LXr-o!J%M`TlVh7Hapc_oO#>raw_?p1rAk9d{iJqqpdOcI%tkG#u zYR^EAb^TR8b*sp>iK~!q7RbIH3jp!xA2|q^JjjQ5HQgFRZ@SBtZ(a1tfq<|76K9!{ zZSsmTW>i@X#&!gLP>Fc-{%@&;&7dx1Pl-C<#4I}-fqOiHNL=e4EG#Od6B0{U>X3?p zT8enC*wOURc=E|nRq!&~aX(gDF52$rNR>2alYPUSC7@Gkd7L?A@)&F8_q{FY^)eD? z(yF=tK(!Uvf0m>*`<6&W;g{(uKsE{*EY?faRk + + + +Highlevel network functionallity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Highlevel network functionallity

+
+
+GSocketClient — Helper for connecting to a network service +
+
+GSocketConnection — A socket connection +
+
+GSocketListener — Helper for accepting network client connections +
+
+GSocketService — Make it easy to implement a network service +
+
+GThreadedSocketService — A threaded GSocketService +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/home.png b/docs/reference/gio/html/home.png new file mode 100644 index 0000000000000000000000000000000000000000..17003611d9df2b066afc682cbde962f3a575002d GIT binary patch literal 654 zcmV;90&)F`P)~yY zO1cF+0vxb!W?!x?K+*#62Jq)nA4q`)5S6sgX4ao{=)(Mgq+YMr)7sjak|a^9)zS!j zlk{-n29mabXYF=7SYBQx&vO8xC}MYams+hxqtO7sImhPaCf@rq;I^3!#u*2aUP)55 zT2&N90xmEJ0s&fGT~(T<3d2xYmK9C>IP*x-M@ib*+0pFm>>uW37N2Wzaq-fCnIZE9 zpb8}0+uN+KuQM2oZVHfP8U6kQdo3?>Wo2dT)WeM9So8DqhLi#T0 z-i(>mfjhvbsYV`;4sgfJ-p>G-SqJ!fjR6BQYs1h*y9xaN0l{VB;o%`08yiy@)$8@~ z2PD1gcDuiy;j1tR0v#V8OH%W)25-YKyx(j#IXO9*YWf0mb8}QG6@b@;cHxh9{t7+@ o!Yd`f8L$sLH?yBt^q3C6015TtIu@BS5dZ)H07*qoM6N<$f*igdr~m)} literal 0 HcmV?d00001 diff --git a/docs/reference/gio/html/icons.html b/docs/reference/gio/html/icons.html new file mode 100644 index 0000000..34c99c3 --- /dev/null +++ b/docs/reference/gio/html/icons.html @@ -0,0 +1,80 @@ + + + + +Icons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Icons

+
+
+GIcon — Interface for icons +
+
+GFileIcon — Icons pointing to an image file +
+
+GLoadableIcon — Loadable Icons +
+
+GThemedIcon — Icon theming support +
+
+GEmblemedIcon — Icon with emblems +
+
+GEmblem — An object for emblems +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/index.html b/docs/reference/gio/html/index.html new file mode 100644 index 0000000..f666d0d --- /dev/null +++ b/docs/reference/gio/html/index.html @@ -0,0 +1,348 @@ + + + + +GIO Reference Manual + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

+ for GIO 2.24.0 + + The latest version of this documentation can be found on-line at + http://library.gnome.org/devel/gio/unstable/. +

+
+
+
+
+
I. GIO Overview
+
+
Introduction
+
Compiling GIO applications
+
Running GIO applications
+
Extending GIO
+
+
II. API Reference
+
+
File Operations
+
+
+GFile — File and Directory Handling +
+
+GFileAttribute — Key-Value Paired File Attributes +
+
+GFileInfo — File Information and Attributes +
+
+GFileEnumerator — Enumerated Files Routines +
+
+GIOError — Error helper functions +
+
+GMountOperation — Object used for authentication and user interaction +
+
+
File System Monitoring
+
+GFileMonitor — File Monitor +
+
Asynchronous I/O
+
+
+GCancellable — Thread-safe Operation Cancellation Stack +
+
+GAsyncResult — Asynchronous Function Results +
+
+GIOScheduler — I/O Scheduler +
+
+GSimpleAsyncResult — Simple asynchronous results implementation +
+
+
Data conversion
+
+
+GConverter — Data conversion interface +
+
+GCharsetConverter — Convert between charsets +
+
+GZlibCompressor — Zlib compressor +
+
+GZlibDecompressor — Zlib decompressor +
+
+
Streaming I/O
+
+
+GSeekable — Stream seeking interface +
+
+GInputStream — Base class for implementing streaming input +
+
+GOutputStream — Base class for implementing streaming output +
+
+GIOStream — Base class for implementing read/write streams +
+
+GFileInputStream — File input streaming operations +
+
+GFileOutputStream — File output streaming operations +
+
+GFileIOStream — File read and write streaming operations +
+
+GFileDescriptorBased — Interface for file descriptor based IO +
+
+GFilterInputStream — Filter Input Stream +
+
+GFilterOutputStream — Filter Output Stream +
+
+GMemoryInputStream — Streaming input operations on memory chunks +
+
+GMemoryOutputStream — Streaming output operations on memory chunks +
+
+GBufferedInputStream — Buffered Input Stream +
+
+GBufferedOutputStream — Buffered Output Stream +
+
+GDataInputStream — Data Input Stream +
+
+GDataOutputStream — Data Output Stream +
+
+GUnixInputStream — Streaming input operations for UNIX file descriptors +
+
+GUnixOutputStream — Streaming output operations for Unix file descriptors +
+
+GConverterInputstream — Converter Input Stream +
+
+GConverterOutputstream — Converter Output Stream +
+
+
File types and applications
+
+
+GContentType — Platform-specific content typing +
+
+GAppInfo — Application information and launch contexts +
+
+Desktop file based GAppInfo — Application information from desktop files +
+
+
Volumes and Drives
+
+
+GVolumeMonitor — Volume Monitor +
+
+GVolume — Volume management +
+
+GMount — Mount management +
+
+GDrive — Drive management +
+
+Unix Mounts — Unix Mounts +
+
+
Icons
+
+
+GIcon — Interface for icons +
+
+GFileIcon — Icons pointing to an image file +
+
+GLoadableIcon — Loadable Icons +
+
+GThemedIcon — Icon theming support +
+
+GEmblemedIcon — Icon with emblems +
+
+GEmblem — An object for emblems +
+
+
Failable Initialization
+
+
+GInitable — Failable object initialization interface +
+
+GAsyncInitable — Asynchronously failable object initialization interface +
+
+
Lowlevel platform-independent network support
+
+
+GSocket — Low-level socket object +
+
+GInetAddress — An IPv4/IPv6 address +
+
+GSocketAddress — Abstract base class representing endpoints for +socket communication +
+
+GInetSocketAddress — Internet GSocketAddress +
+
+GUnixSocketAddress — UNIX GSocketAddress +
+
+GSocketControlMessage — A GSocket control message +
+
+GUnixFDList — An object containing a set of file descriptors +
+
+GUnixFDMessage — A GSocketControlMessage containing a GUnixFDList +
+
+
DNS resolution
+
+
+GResolver — Asynchronous and cancellable DNS resolver +
+
+GSocketConnectable — Interface for potential socket endpoints +
+
+GNetworkAddress — A GSocketConnectable for resolving hostnames +
+
+GNetworkService — A GSocketConnectable for resolving SRV records +
+
+GSrvTarget — DNS SRV record target +
+
+
Highlevel network functionallity
+
+
+GSocketClient — Helper for connecting to a network service +
+
+GSocketConnection — A socket connection +
+
+GSocketListener — Helper for accepting network client connections +
+
+GSocketService — Make it easy to implement a network service +
+
+GThreadedSocketService — A threaded GSocketService +
+
+
Utilities
+
+GFilenameCompleter — Filename Completer +
+
Extending GIO
+
+
+GVfs — Virtual File System +
+
+GIOModule — Loadable GIO Modules +
+
+Extension Points — Extension Points +
+
+
+
III. Migrating to GIO
+
+
Migrating from POSIX to GIO
+
Migrating from GnomeVFS to GIO
+
+
Trash handling
+
Operations on multiple files
+
Mime monitoring
+
+
+
Object Hierarchy
+
Index
+
Index of deprecated symbols
+
Index of new symbols in 2.18
+
Index of new symbols in 2.20
+
Index of new symbols in 2.22
+
Index of new symbols in 2.24
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/index.sgml b/docs/reference/gio/html/index.sgml new file mode 100644 index 0000000..ddba613 --- /dev/null +++ b/docs/reference/gio/html/index.sgml @@ -0,0 +1,1796 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gio/html/left.png b/docs/reference/gio/html/left.png new file mode 100644 index 0000000000000000000000000000000000000000..2d05b3d5b4aeec9384bbfe404bfc4ed0897051c4 GIT binary patch literal 459 zcmV;+0W|)JP)40xL?wO*>WZ(J#ML5j2<9jD6A%Q&kC}jOeEc;X{s;`zcnxLeZR6?6h#^ihmNF6NpGdilO$m<82oD9WQ|6nVv1`? z>KufRi{?QPXg;4;wroQu4?mN1Ydd@|kaQ|ZyWLK!)yi7Wb%=0{}lD)tfliHAUyWRQ+fD_;aV6j->y6!O_8bENg + + + +Part III. Migrating to GIO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Part III. Migrating to GIO

+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/networking.html b/docs/reference/gio/html/networking.html new file mode 100644 index 0000000..e82ae19 --- /dev/null +++ b/docs/reference/gio/html/networking.html @@ -0,0 +1,87 @@ + + + + +Lowlevel platform-independent network support + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Lowlevel platform-independent network support

+
+
+GSocket — Low-level socket object +
+
+GInetAddress — An IPv4/IPv6 address +
+
+GSocketAddress — Abstract base class representing endpoints for +socket communication +
+
+GInetSocketAddress — Internet GSocketAddress +
+
+GUnixSocketAddress — UNIX GSocketAddress +
+
+GSocketControlMessage — A GSocket control message +
+
+GUnixFDList — An object containing a set of file descriptors +
+
+GUnixFDMessage — A GSocketControlMessage containing a GUnixFDList +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/pt01.html b/docs/reference/gio/html/pt01.html new file mode 100644 index 0000000..f3b574a --- /dev/null +++ b/docs/reference/gio/html/pt01.html @@ -0,0 +1,69 @@ + + + + +Part I. GIO Overview + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Part I. GIO Overview

+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/pt02.html b/docs/reference/gio/html/pt02.html new file mode 100644 index 0000000..4e604a9 --- /dev/null +++ b/docs/reference/gio/html/pt02.html @@ -0,0 +1,323 @@ + + + + +Part II. API Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Part II. API Reference

+
+

Table of Contents

+
+
File Operations
+
+
+GFile — File and Directory Handling +
+
+GFileAttribute — Key-Value Paired File Attributes +
+
+GFileInfo — File Information and Attributes +
+
+GFileEnumerator — Enumerated Files Routines +
+
+GIOError — Error helper functions +
+
+GMountOperation — Object used for authentication and user interaction +
+
+
File System Monitoring
+
+GFileMonitor — File Monitor +
+
Asynchronous I/O
+
+
+GCancellable — Thread-safe Operation Cancellation Stack +
+
+GAsyncResult — Asynchronous Function Results +
+
+GIOScheduler — I/O Scheduler +
+
+GSimpleAsyncResult — Simple asynchronous results implementation +
+
+
Data conversion
+
+
+GConverter — Data conversion interface +
+
+GCharsetConverter — Convert between charsets +
+
+GZlibCompressor — Zlib compressor +
+
+GZlibDecompressor — Zlib decompressor +
+
+
Streaming I/O
+
+
+GSeekable — Stream seeking interface +
+
+GInputStream — Base class for implementing streaming input +
+
+GOutputStream — Base class for implementing streaming output +
+
+GIOStream — Base class for implementing read/write streams +
+
+GFileInputStream — File input streaming operations +
+
+GFileOutputStream — File output streaming operations +
+
+GFileIOStream — File read and write streaming operations +
+
+GFileDescriptorBased — Interface for file descriptor based IO +
+
+GFilterInputStream — Filter Input Stream +
+
+GFilterOutputStream — Filter Output Stream +
+
+GMemoryInputStream — Streaming input operations on memory chunks +
+
+GMemoryOutputStream — Streaming output operations on memory chunks +
+
+GBufferedInputStream — Buffered Input Stream +
+
+GBufferedOutputStream — Buffered Output Stream +
+
+GDataInputStream — Data Input Stream +
+
+GDataOutputStream — Data Output Stream +
+
+GUnixInputStream — Streaming input operations for UNIX file descriptors +
+
+GUnixOutputStream — Streaming output operations for Unix file descriptors +
+
+GConverterInputstream — Converter Input Stream +
+
+GConverterOutputstream — Converter Output Stream +
+
+
File types and applications
+
+
+GContentType — Platform-specific content typing +
+
+GAppInfo — Application information and launch contexts +
+
+Desktop file based GAppInfo — Application information from desktop files +
+
+
Volumes and Drives
+
+
+GVolumeMonitor — Volume Monitor +
+
+GVolume — Volume management +
+
+GMount — Mount management +
+
+GDrive — Drive management +
+
+Unix Mounts — Unix Mounts +
+
+
Icons
+
+
+GIcon — Interface for icons +
+
+GFileIcon — Icons pointing to an image file +
+
+GLoadableIcon — Loadable Icons +
+
+GThemedIcon — Icon theming support +
+
+GEmblemedIcon — Icon with emblems +
+
+GEmblem — An object for emblems +
+
+
Failable Initialization
+
+
+GInitable — Failable object initialization interface +
+
+GAsyncInitable — Asynchronously failable object initialization interface +
+
+
Lowlevel platform-independent network support
+
+
+GSocket — Low-level socket object +
+
+GInetAddress — An IPv4/IPv6 address +
+
+GSocketAddress — Abstract base class representing endpoints for +socket communication +
+
+GInetSocketAddress — Internet GSocketAddress +
+
+GUnixSocketAddress — UNIX GSocketAddress +
+
+GSocketControlMessage — A GSocket control message +
+
+GUnixFDList — An object containing a set of file descriptors +
+
+GUnixFDMessage — A GSocketControlMessage containing a GUnixFDList +
+
+
DNS resolution
+
+
+GResolver — Asynchronous and cancellable DNS resolver +
+
+GSocketConnectable — Interface for potential socket endpoints +
+
+GNetworkAddress — A GSocketConnectable for resolving hostnames +
+
+GNetworkService — A GSocketConnectable for resolving SRV records +
+
+GSrvTarget — DNS SRV record target +
+
+
Highlevel network functionallity
+
+
+GSocketClient — Helper for connecting to a network service +
+
+GSocketConnection — A socket connection +
+
+GSocketListener — Helper for accepting network client connections +
+
+GSocketService — Make it easy to implement a network service +
+
+GThreadedSocketService — A threaded GSocketService +
+
+
Utilities
+
+GFilenameCompleter — Filename Completer +
+
Extending GIO
+
+
+GVfs — Virtual File System +
+
+GIOModule — Loadable GIO Modules +
+
+Extension Points — Extension Points +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/resolver.html b/docs/reference/gio/html/resolver.html new file mode 100644 index 0000000..c10a844 --- /dev/null +++ b/docs/reference/gio/html/resolver.html @@ -0,0 +1,77 @@ + + + + +DNS resolution + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+DNS resolution

+
+
+GResolver — Asynchronous and cancellable DNS resolver +
+
+GSocketConnectable — Interface for potential socket endpoints +
+
+GNetworkAddress — A GSocketConnectable for resolving hostnames +
+
+GNetworkService — A GSocketConnectable for resolving SRV records +
+
+GSrvTarget — DNS SRV record target +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/right.png b/docs/reference/gio/html/right.png new file mode 100644 index 0000000000000000000000000000000000000000..92832e3a4566e59d6e4092010e08d28f3be3a68d GIT binary patch literal 472 zcmV;}0Vn>6P) + + + +Streaming I/O + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Streaming I/O

+
+
+GSeekable — Stream seeking interface +
+
+GInputStream — Base class for implementing streaming input +
+
+GOutputStream — Base class for implementing streaming output +
+
+GIOStream — Base class for implementing read/write streams +
+
+GFileInputStream — File input streaming operations +
+
+GFileOutputStream — File output streaming operations +
+
+GFileIOStream — File read and write streaming operations +
+
+GFileDescriptorBased — Interface for file descriptor based IO +
+
+GFilterInputStream — Filter Input Stream +
+
+GFilterOutputStream — Filter Output Stream +
+
+GMemoryInputStream — Streaming input operations on memory chunks +
+
+GMemoryOutputStream — Streaming output operations on memory chunks +
+
+GBufferedInputStream — Buffered Input Stream +
+
+GBufferedOutputStream — Buffered Output Stream +
+
+GDataInputStream — Data Input Stream +
+
+GDataOutputStream — Data Output Stream +
+
+GUnixInputStream — Streaming input operations for UNIX file descriptors +
+
+GUnixOutputStream — Streaming output operations for Unix file descriptors +
+
+GConverterInputstream — Converter Input Stream +
+
+GConverterOutputstream — Converter Output Stream +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/style.css b/docs/reference/gio/html/style.css new file mode 100644 index 0000000..e31596b --- /dev/null +++ b/docs/reference/gio/html/style.css @@ -0,0 +1,257 @@ +.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] + { + position: relative; + padding-top:4.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; +} + +/* code listings */ + +.programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.programlisting .function { color: #000000; font-weight: bold; } +.programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.programlisting .normal { color: #000000; } +.programlisting .number { color: #75507b; } /* tango: plum 2 */ +.programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.programlisting .type { color: #000000; } +.programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.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/gio/html/types.html b/docs/reference/gio/html/types.html new file mode 100644 index 0000000..7c2b2bc --- /dev/null +++ b/docs/reference/gio/html/types.html @@ -0,0 +1,71 @@ + + + + +File types and applications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+File types and applications

+
+
+GContentType — Platform-specific content typing +
+
+GAppInfo — Application information and launch contexts +
+
+Desktop file based GAppInfo — Application information from desktop files +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/up.png b/docs/reference/gio/html/up.png new file mode 100644 index 0000000000000000000000000000000000000000..85b3e2a2755fece72d0d09fbf1cf28d51fa71077 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgf{4tZ81y*aK8HyIchl|5Y?Ln`LHoowrM#DT$We|~2y zm!kHPIYzBV#iFCm$l5qa=|7aUX_&jTHR3kct+f-3dJW1pZtj?HsP%l7!S0-YWnmjW zI3~>Cd4HCN^TYHBC0dz3r5|}*T3c5!K}0^NPTey!^rYo;W&eW{b1SE%dR-1ljcju- zJITo5P_e{cPDWDszO|97o#m$fni3V4d%~7^?0HU4-k!+X`e~w55Q}HA=c?CM9`EK` z^o5GF_RsnG`ey+9wOf8O4bzg>7W*;jU~M?g`OZAA$mNp|Lz<$s+~N9!2`ir8RcClo$(Q~19INM~9}j;&*|enC yGd}kJak0wj?aUKd8;%}`i}SSew>!A-2iw}^5}Rh(M>+vRkipZ{&t;ucLK6U4uc96R literal 0 HcmV?d00001 diff --git a/docs/reference/gio/html/utils.html b/docs/reference/gio/html/utils.html new file mode 100644 index 0000000..a1a13ea --- /dev/null +++ b/docs/reference/gio/html/utils.html @@ -0,0 +1,63 @@ + + + + +Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Utilities

+
+GFilenameCompleter — Filename Completer +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/html/volume_mon.html b/docs/reference/gio/html/volume_mon.html new file mode 100644 index 0000000..5e8e876 --- /dev/null +++ b/docs/reference/gio/html/volume_mon.html @@ -0,0 +1,77 @@ + + + + +Volumes and Drives + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Volumes and Drives

+
+
+GVolumeMonitor — Volume Monitor +
+
+GVolume — Volume management +
+
+GMount — Mount management +
+
+GDrive — Drive management +
+
+Unix Mounts — Unix Mounts +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gio/migrating.xml b/docs/reference/gio/migrating.xml new file mode 100644 index 0000000..89191d3 --- /dev/null +++ b/docs/reference/gio/migrating.xml @@ -0,0 +1,162 @@ + + Migrating to GIO + + + Migrating from POSIX to GIO + + + Comparison of POSIX and GIO concepts + + + POSIXGIO + + + char *pathGFile *file + struct stat *bufGFileInfo *info + struct statvfs *bufGFileInfo *info + int fdGInputStream *in + GOutputStream *out + DIR *GFileEnumerator *enum + fstab entryGUnixMountPoint *mount_point + mtab entryGUnixMountEntry *mount_entry + + +
+ +
+ + + Migrating from GnomeVFS to GIO + + + Comparison of GnomeVFS and GIO concepts + + + GnomeVFSGIO + + + GnomeVFSURIGFile + GnomeVFSFileInfoGFileInfo + GnomeVFSResultGError, with G_IO_ERROR values + GnomeVFSHandle & GnomeVFSAsyncHandleGInputStream or GOutputStream + GnomeVFSDirectoryHandleGFileEnumerator + mime typecontent type + GnomeVFSMonitorGFileMonitor + GnomeVFSVolumeMonitorGVolumeMonitor + GnomeVFSVolumeGMount + GnomeVFSDriveGVolume + -GDrive + GnomeVFSContextGCancellable + gnome_vfs_async_cancelg_cancellable_cancel + + +
+ +
+ Trash handling + + + The handling of trashed files has been changed in GIO, compared + to gnome-vfs. gnome-vfs has a home-grown trash implementation that + predates the freedesktop.org Desktop Trash Can specification + that is implemented in GIO. The location for storing trashed files + has changed from $HOME/.Trash to + $HOME/.local/share/Trash (or more correctly + $XDG_DATA_HOME/Trash), which means that + there is a need for migrating files that have been trashed by + gnome-vfs to the new location. + + + In gnome-vfs, the trash:// scheme offering a + merged view of all trash directories was implemented in nautilus, + and trash-handling applications had to find and monitor all trash + directories themselves. With GIO, the trash:// + implementation has been moved to gvfs and applications can simply + monitor that location: + + +static void +file_changed (GFileMonitor *file_monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + switch (event_type) + { + case G_FILE_MONITOR_EVENT_DELETED: + g_print ("'%s' removed from trash\n", g_file_get_basename (child)); + break; + case G_FILE_MONITOR_EVENT_CREATED: + g_print ("'%s' added to trash\n", g_file_get_basename (child)); + break; + default: ; + } +} + +static void +start_monitoring_trash (void) +{ + GFile *file; + GFileMonitor *monitor; + + file = g_file_new_for_uri ("trash://"); + monitor = g_file_monitor_directory (file, 0, NULL, NULL); + g_object_unref (file); + + g_signal_connect (monitor, "changed", G_CALLBACK (file_changed), NULL); + + /* ... */ + +} + + + GIO exposes some useful metadata about trashed files. There are + trash::orig-path and trash::deletion-date attributes. The + standard::icon attribute of the trash:// + itself provides a suitable icon for displaying the trash can on + the desktop. If you are using this icon, make sure to monitor + this attribute for changes, since the icon may be updated to + reflect that state of the trash can. + + + Moving a file to the trash is much simpler with GIO. Instead of + using gnome_vfs_find_directory() with %GNOME_VFS_DIRECTORY_KIND_TRASH + to find out where to move the trashed file, just use the g_file_trash() + function. + +
+ +
+ Operations on multiple files + + + gnome-vfs has the dreaded gnome_vfs_xfer_uri_list() function which + has tons of options and offers the equivalent of cp, mv, ln, mkdir + and rm at the same time. + + + GIO offers a much simpler I/O scheduler functionality instead, that + lets you schedule a function to be called in a separate thread, or + if threads are not available, as an idle in the mainloop. + See g_io_scheduler_push_job(). + + +
+ +
+ Mime monitoring + + + gnome-vfs offered a way to monitor the association between mime types + and default handlers for changes, with the #GnomeVFSMIMEMonitor object. + GIO does not offer a replacement for this functionality at this time, + since we have not found a compelling use case where + #GnomeVFSMIMEMonitor was used. If you think you have such a use + case, please report it at + bugzilla.gnome.org. + +
+
+ +
diff --git a/docs/reference/gio/overview.xml b/docs/reference/gio/overview.xml new file mode 100644 index 0000000..9964921 --- /dev/null +++ b/docs/reference/gio/overview.xml @@ -0,0 +1,352 @@ + + GIO Overview + + + Introduction + + + GIO is striving to provide a modern, easy-to-use VFS API that sits + at the right level in the library stack. The goal is to overcome the + shortcomings of GnomeVFS and provide an API that is so good that + developers prefer it over raw POSIX calls. Among other things + that means using GObject. It also means not cloning the POSIX + API, but providing higher-level, document-centric interfaces. + + + + The abstract file system model of GIO consists of a number of + interfaces and base classes for I/O and files: + + + GFile + reference to a file + + + GFileInfo + information about a file or filesystem + + + GFileEnumerator + list files in directories + + + GDrive + represents a drive + + + GVolume + represents a file system in an abstract way + + + GMount + represents a mounted file system + + + Then there is a number of stream classes, similar to the input and + output stream hierarchies that can be found in frameworks like Java: + + + GInputStream + read data + + + GOutputStream + write data + + + GIOStream + read and write data + + + GSeekable + interface optionally implemented by streams to support seeking + + + There are interfaces related to applications and the types + of files they handle: + + + GAppInfo + information about an installed application + + + GIcon + abstract type for file and application icons + + + There is support for network programming, including name resolution, lowlevel socket + APIs and highlevel client and server helper classes: + + + GSocket + lowlevel platform independent socket object + + + GResolver + asynchronous and cancellable DNS resolver + + + GSocketClient + high-level network client helper + + + GSocketService + high-level network server helper + + + GSocketConnection + network connection stream + + + Beyond these, GIO provides facilities for file monitoring, + asynchronous I/O and filename completion. In addition to the + interfaces, GIO provides implementations for the local case. + Implementations for various network file systems are provided + by the GVFS package as loadable modules. + + + + Other design choices which consciously break with the GnomeVFS + design are to move backends out-of-process, which minimizes the + dependency bloat and makes the whole system more robust. The backends + are not included in GIO, but in the separate GVFS package. The GVFS + package also contains the GVFS daemon, which spawn further mount + daemons for each individual connection. + + +
+ GIO in the GTK+ library stack + +
+ + + The GIO model of I/O is stateful: if an application establishes e.g. + a SFTP connection to a server, it becomes available to all applications + in the session; the user does not have to enter his password over + and over again. + + + One of the big advantages of putting the VFS in the GLib layer + is that GTK+ can directly use it, e.g. in the filechooser. + +
+ + + Compiling GIO applications + + + GIO comes with a gio-2.0.pc file that you + should use together with pkg-config to obtain + the necessary information about header files and libraries. See + the pkg-config man page or the GLib documentation + for more information on how to use pkg-config + to compile your application. + + + + If you are using GIO on UNIX-like systems, you may want to use + UNIX-specific GIO interfaces such as #GUnixInputStream, + #GUnixOutputStream, #GUnixMount or #GDesktopAppInfo. + To do so, use the gio-unix-2.0.pc file + instead of gio-2.0.pc + + + + + Running GIO applications + + + GIO inspects a few of environment variables in addition to the + ones used by GLib. + + + + <envar>XDG_DATA_HOME</envar>, <envar>XDG_DATA_DIRS</envar> + + + GIO uses these environment variables to locate MIME information. + For more information, see the Shared MIME-info Database + and the Base Directory Specification. + + + + + <envar>GVFS_DISABLE_FUSE</envar> + + + This variable can be set to keep #Gvfs from starting the fuse backend, + which may be unwanted or unnecessary in certain situations. + + + + + The following environment variables are only useful for debugging + GIO itself or modules that it loads. They should not be set in a + production environment. + + + <envar>GIO_USE_VFS</envar> + + + This environment variable can be set to the name of a #GVfs + implementation to override the default for debugging purposes. + The #GVfs implementation for local files that is included in GIO + has the name "local", the implementation in the gvfs module has + the name "gvfs". + + + + + <envar>GIO_USE_VOLUME_MONITOR</envar> + + + This variable can be set to the name of a #GVolumeMonitor + implementation to override the default for debugging purposes. + The #GVolumeMonitor implementation for local files that is included + in GIO has the name "unix", the hal-based implementation in the + gvfs module has the name "hal". + + + + + <envar>GIO_USE_URI_ASSOCIATION</envar> + + + This variable can be set to the name of a #GDesktopAppInfoLookup + implementation to override the default for debugging purposes. + GIO does not include a #GDesktopAppInfoLookup implementation, + the GConf-based implementation in the gvfs module has the name + "gconf". + + + + + <envar>GVFS_INOTIFY_DIAG</envar> + + + When this environment variable is set and GIO has been built + with inotify support, a dump of diagnostic inotify information + will be written every 20 seconds to a file named + /tmp/gvfsdid.pid. + + + + + <envar>GIO_EXTRA_MODULES</envar> + + + When this environment variable is set to a path, or a set of + paths separated by a colon, GIO will attempt to load + modules from within the path. + + + + + + + Extending GIO + + + A lot of the functionality that is accessible through GIO + is implemented in loadable modules, and modules provide a convenient + way to extend GIO. In addition to the #GIOModule API which supports + writing such modules, GIO has a mechanism to define extension points, + and register implementations thereof, see #GIOExtensionPoint. + + + The following extension points are currently defined by GIO: + + + + G_VFS_EXTENSION_POINT_NAME + + + Allows to override the functionality of the #GVfs class. + Implementations of this extension point must be derived from #GVfs. + GIO uses the implementation with the highest priority that is active, + see g_vfs_is_active(). + + + GIO implements this extension point for local files, gvfs contains + an implementation that supports all the backends in gvfs. + + + + + G_VOLUME_MONITOR_EXTENSION_POINT_NAME + + + Allows to add more volume monitors. + Implementations of this extension point must be derived from + #GVolumeMonitor. GIO uses all registered extensions. + + + gvfs contains an implementation that works together with the #GVfs + implementation in gvfs. + + + + + G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME + + + Allows to override the 'native' volume monitor. + Implementations of this extension point must be derived from + #GNativeVolumeMonitor. GIO uses the implementation with + the highest priority that is supported, as determined by the + is_supported() vfunc in #GVolumeMonitorClass. + + + GIO implements this extension point for local mounts, + gvfs contains a hal-based implementation. + + + + + G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME + + + Allows to override the file monitor implementation for + local files. Implementations of this extension point must + be derived from #GLocalFileMonitor. GIO uses the implementation + with the highest priority that is supported, as determined by the + is_supported() vfunc in #GLocalFileMonitorClass. + + + GIO uses this extension point internally, to switch between + its fam-based and inotify-based file monitoring implementations. + + + + + G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME + + + Allows to override the directory monitor implementation for + local files. Implementations of this extension point must be + derived from #GLocalDirectoryMonitor. GIO uses the implementation + with the highest priority that is supported, as determined by the + is_supported() vfunc in #GLocalDirectoryMonitorClass. + + + GIO uses this extension point internally, to switch between + its fam-based and inotify-based directory monitoring implementations. + + + + + G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME + + + Unix-only. Allows to provide a way to associate default handlers + with URI schemes. Implementations of this extension point must + implement the #GDesktopAppInfoLookup interface. GIO uses the + implementation with the highest priority. + + + gvfs contains a GConf-based implementation that uses the + same GConf keys as gnome-vfs. + + + +
diff --git a/docs/reference/gio/tmpl/extensionpoints.sgml b/docs/reference/gio/tmpl/extensionpoints.sgml new file mode 100644 index 0000000..ce36a90 --- /dev/null +++ b/docs/reference/gio/tmpl/extensionpoints.sgml @@ -0,0 +1,134 @@ + +Extension Points + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@extension: +@Returns: + + + + + + + +@extension: +@Returns: + + + + + + + +@extension: +@Returns: + + + + + + + +@extension_point: +@name: +@Returns: + + + + + + + +@extension_point: +@Returns: + + + + + + + +@extension_point: +@Returns: + + + + + + + +@extension_point_name: +@type: +@extension_name: +@priority: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@extension_point: +@type: + + + + + + + +@extension: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gappinfo.sgml b/docs/reference/gio/tmpl/gappinfo.sgml new file mode 100644 index 0000000..00a042e --- /dev/null +++ b/docs/reference/gio/tmpl/gappinfo.sgml @@ -0,0 +1,378 @@ + +GAppInfo + + + + + + + + + + + + + + + + + + + + + + +@G_APP_INFO_CREATE_NONE: +@G_APP_INFO_CREATE_NEEDS_TERMINAL: +@G_APP_INFO_CREATE_SUPPORTS_URIS: + + + + + + + + + + + + +@g_iface: +@dup: +@equal: +@get_id: +@get_name: +@get_description: +@get_executable: +@get_icon: +@launch: +@supports_uris: +@supports_files: +@launch_uris: +@should_show: +@set_as_default_for_type: +@set_as_default_for_extension: +@add_supports_type: +@can_remove_supports_type: +@remove_supports_type: +@can_delete: +@do_delete: +@get_commandline: +@get_display_name: + + + + + + + + + + + + +@commandline: +@application_name: +@flags: +@error: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo1: +@appinfo2: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@files: +@launch_context: +@error: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@uris: +@launch_context: +@error: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@content_type: + + + + + + + +@appinfo: +@content_type: +@error: +@Returns: + + + + + + + +@appinfo: +@extension: +@error: +@Returns: + + + + + + + +@appinfo: +@content_type: +@error: +@Returns: + + + + + + + +@appinfo: +@Returns: + + + + + + + +@appinfo: +@content_type: +@error: +@Returns: + + + + + + + +@Returns: + + + + + + + +@content_type: +@Returns: + + + + + + + +@content_type: +@must_support_uris: +@Returns: + + + + + + + +@uri_scheme: +@Returns: + + + + + + + +@uri: +@launch_context: +@error: +@Returns: + + + + + + + +@context: +@info: +@files: +@Returns: + + + + + + + +@context: +@info: +@files: +@Returns: + + + + + + + +@context: +@startup_notify_id: + + + + + + + +@Returns: + + diff --git a/docs/reference/gio/tmpl/gasyncinitable.sgml b/docs/reference/gio/tmpl/gasyncinitable.sgml new file mode 100644 index 0000000..f8fbba2 --- /dev/null +++ b/docs/reference/gio/tmpl/gasyncinitable.sgml @@ -0,0 +1,110 @@ + +GAsyncInitable + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@init_async: +@init_finish: + + + + + + +@initable: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@initable: +@res: +@error: +@Returns: + + + + + + + +@object_type: +@io_priority: +@cancellable: +@callback: +@user_data: +@first_property_name: +@Varargs: + + + + + + + +@initable: +@res: +@error: +@Returns: + + + + + + + +@object_type: +@first_property_name: +@var_args: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@object_type: +@n_parameters: +@parameters: +@io_priority: +@cancellable: +@callback: +@user_data: + + diff --git a/docs/reference/gio/tmpl/gasyncresult.sgml b/docs/reference/gio/tmpl/gasyncresult.sgml new file mode 100644 index 0000000..d47e81d --- /dev/null +++ b/docs/reference/gio/tmpl/gasyncresult.sgml @@ -0,0 +1,62 @@ + +GAsyncResult + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@get_user_data: +@get_source_object: + + + + + + +@source_object: +@res: +@user_data: + + + + + + + +@res: +@Returns: + + + + + + + +@res: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gbufferedinputstream.sgml b/docs/reference/gio/tmpl/gbufferedinputstream.sgml new file mode 100644 index 0000000..651bfde --- /dev/null +++ b/docs/reference/gio/tmpl/gbufferedinputstream.sgml @@ -0,0 +1,145 @@ + +GBufferedInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@base_stream: +@Returns: + + + + + + + +@base_stream: +@size: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@size: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@count: +@Returns: + + + + + + + +@stream: +@buffer: +@offset: +@count: +@Returns: + + + + + + + +@stream: +@count: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@count: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gbufferedoutputstream.sgml b/docs/reference/gio/tmpl/gbufferedoutputstream.sgml new file mode 100644 index 0000000..728c8a2 --- /dev/null +++ b/docs/reference/gio/tmpl/gbufferedoutputstream.sgml @@ -0,0 +1,90 @@ + +GBufferedOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@base_stream: +@Returns: + + + + + + + +@base_stream: +@size: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@size: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@auto_grow: + + diff --git a/docs/reference/gio/tmpl/gcancellable.sgml b/docs/reference/gio/tmpl/gcancellable.sgml new file mode 100644 index 0000000..eb48ac3 --- /dev/null +++ b/docs/reference/gio/tmpl/gcancellable.sgml @@ -0,0 +1,147 @@ + +GCancellable + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gcancellable: the object which received the signal. + + + + + + +@Returns: + + + + + + + +@cancellable: +@Returns: + + + + + + + +@cancellable: +@error: +@Returns: + + + + + + + +@cancellable: +@Returns: + + + + + + + +@cancellable: +@pollfd: +@Returns: + + + + + + + +@cancellable: + + + + + + + +@Returns: + + + + + + + +@cancellable: + + + + + + + +@cancellable: + + + + + + + +@cancellable: + + + + + + + +@cancellable: +@callback: +@data: +@data_destroy_func: +@Returns: + + + + + + + +@cancellable: +@handler_id: + + + + + + + +@cancellable: + + diff --git a/docs/reference/gio/tmpl/gcharsetconverter.sgml b/docs/reference/gio/tmpl/gcharsetconverter.sgml new file mode 100644 index 0000000..d48c76a --- /dev/null +++ b/docs/reference/gio/tmpl/gcharsetconverter.sgml @@ -0,0 +1,78 @@ + +GCharsetConverter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@to_charset: +@from_charset: +@error: +@Returns: + + + + + + + +@converter: +@use_fallback: + + + + + + + +@converter: +@Returns: + + + + + + + +@converter: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gcontenttype.sgml b/docs/reference/gio/tmpl/gcontenttype.sgml new file mode 100644 index 0000000..52be46f --- /dev/null +++ b/docs/reference/gio/tmpl/gcontenttype.sgml @@ -0,0 +1,122 @@ + +GContentType + + + + + + + + + + + + + + + + + + + + + + +@type1: +@type2: +@Returns: + + + + + + + +@type: +@supertype: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@mime_type: +@Returns: + + + + + + + +@filename: +@data: +@data_size: +@result_uncertain: +@Returns: + + + + + + + +@root: +@Returns: + + + + + + + +@Returns: + + diff --git a/docs/reference/gio/tmpl/gconverter.sgml b/docs/reference/gio/tmpl/gconverter.sgml new file mode 100644 index 0000000..791946c --- /dev/null +++ b/docs/reference/gio/tmpl/gconverter.sgml @@ -0,0 +1,69 @@ + +GConverter + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@convert: +@reset: + + + + + + +@G_CONVERTER_ERROR: +@G_CONVERTER_CONVERTED: +@G_CONVERTER_FINISHED: +@G_CONVERTER_FLUSHED: + + + + + + +@converter: +@inbuf: +@inbuf_size: +@outbuf: +@outbuf_size: +@flags: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + + + + +@converter: + + diff --git a/docs/reference/gio/tmpl/gconverterinputstream.sgml b/docs/reference/gio/tmpl/gconverterinputstream.sgml new file mode 100644 index 0000000..a4bf9e3 --- /dev/null +++ b/docs/reference/gio/tmpl/gconverterinputstream.sgml @@ -0,0 +1,49 @@ + +GConverterInputstream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@base_stream: +@converter: +@Returns: + + + + + + + +@converter_stream: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gconverteroutputstream.sgml b/docs/reference/gio/tmpl/gconverteroutputstream.sgml new file mode 100644 index 0000000..8665b5a --- /dev/null +++ b/docs/reference/gio/tmpl/gconverteroutputstream.sgml @@ -0,0 +1,49 @@ + +GConverterOutputstream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@base_stream: +@converter: +@Returns: + + + + + + + +@converter_stream: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gdatainputstream.sgml b/docs/reference/gio/tmpl/gdatainputstream.sgml new file mode 100644 index 0000000..cc17fb7 --- /dev/null +++ b/docs/reference/gio/tmpl/gdatainputstream.sgml @@ -0,0 +1,250 @@ + +GDataInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: +@G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: +@G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + + + + + + +@G_DATA_STREAM_NEWLINE_TYPE_LF: +@G_DATA_STREAM_NEWLINE_TYPE_CR: +@G_DATA_STREAM_NEWLINE_TYPE_CR_LF: +@G_DATA_STREAM_NEWLINE_TYPE_ANY: + + + + + + +@base_stream: +@Returns: + + + + + + + +@stream: +@order: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@type: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@length: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@length: +@error: +@Returns: + + + + + + + +@stream: +@stop_chars: +@length: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@stop_chars: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@length: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gdataoutputstream.sgml b/docs/reference/gio/tmpl/gdataoutputstream.sgml new file mode 100644 index 0000000..e935967 --- /dev/null +++ b/docs/reference/gio/tmpl/gdataoutputstream.sgml @@ -0,0 +1,153 @@ + +GDataOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@base_stream: +@Returns: + + + + + + + +@stream: +@order: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@data: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@str: +@cancellable: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gdesktopappinfo.sgml b/docs/reference/gio/tmpl/gdesktopappinfo.sgml new file mode 100644 index 0000000..636f226 --- /dev/null +++ b/docs/reference/gio/tmpl/gdesktopappinfo.sgml @@ -0,0 +1,101 @@ + +Desktop file based GAppInfo + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@Returns: + + + + + + + +@key_file: +@Returns: + + + + + + + +@desktop_id: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@desktop_env: + + + + + + + + + + + + + + + + + + + + +@lookup: +@uri_scheme: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gdrive.sgml b/docs/reference/gio/tmpl/gdrive.sgml new file mode 100644 index 0000000..7ce01b1 --- /dev/null +++ b/docs/reference/gio/tmpl/gdrive.sgml @@ -0,0 +1,360 @@ + +GDrive + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gdrive: the object which received the signal. + + + + + + +@gdrive: the object which received the signal. + + + + + + +@gdrive: the object which received the signal. + + + + + + +@gdrive: the object which received the signal. + + + + + + +@g_iface: +@changed: +@disconnected: +@eject_button: +@get_name: +@get_icon: +@has_volumes: +@get_volumes: +@is_media_removable: +@has_media: +@is_media_check_automatic: +@can_eject: +@can_poll_for_media: +@eject: +@eject_finish: +@poll_for_media: +@poll_for_media_finish: +@get_identifier: +@enumerate_identifiers: +@get_start_stop_type: +@can_start: +@can_start_degraded: +@start: +@start_finish: +@can_stop: +@stop: +@stop_finish: +@stop_button: +@eject_with_operation: +@eject_with_operation_finish: + + + + + + +@G_DRIVE_START_NONE: + + + + + + +@G_DRIVE_START_STOP_TYPE_UNKNOWN: +@G_DRIVE_START_STOP_TYPE_SHUTDOWN: +@G_DRIVE_START_STOP_TYPE_NETWORK: +@G_DRIVE_START_STOP_TYPE_MULTIDISK: +@G_DRIVE_START_STOP_TYPE_PASSWORD: + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@cancellable: +@callback: +@user_data: + + + + + + + +@drive: +@result: +@error: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@drive: +@result: +@error: +@Returns: + + + + + + + +@drive: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@drive: +@result: +@error: +@Returns: + + + + + + + +@drive: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@drive: +@result: +@error: +@Returns: + + + + + + + +@drive: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@drive: +@result: +@error: +@Returns: + + + + + + + +@drive: +@Returns: + + + + + + + +@drive: +@kind: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gemblem.sgml b/docs/reference/gio/tmpl/gemblem.sgml new file mode 100644 index 0000000..25f634b --- /dev/null +++ b/docs/reference/gio/tmpl/gemblem.sgml @@ -0,0 +1,82 @@ + +GEmblem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_EMBLEM_ORIGIN_UNKNOWN: +@G_EMBLEM_ORIGIN_DEVICE: +@G_EMBLEM_ORIGIN_LIVEMETADATA: +@G_EMBLEM_ORIGIN_TAG: + + + + + + +@icon: +@Returns: + + + + + + + +@icon: +@origin: +@Returns: + + + + + + + +@emblem: +@Returns: + + + + + + + +@emblem: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gemblemedicon.sgml b/docs/reference/gio/tmpl/gemblemedicon.sgml new file mode 100644 index 0000000..482e0e2 --- /dev/null +++ b/docs/reference/gio/tmpl/gemblemedicon.sgml @@ -0,0 +1,62 @@ + +GEmblemedIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@icon: +@emblem: +@Returns: + + + + + + + +@emblemed: +@Returns: + + + + + + + +@emblemed: +@Returns: + + + + + + + +@emblemed: +@emblem: + + diff --git a/docs/reference/gio/tmpl/gfile.sgml b/docs/reference/gio/tmpl/gfile.sgml new file mode 100644 index 0000000..48f2ac6 --- /dev/null +++ b/docs/reference/gio/tmpl/gfile.sgml @@ -0,0 +1,1522 @@ + +GFile + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@dup: +@hash: +@equal: +@is_native: +@has_uri_scheme: +@get_uri_scheme: +@get_basename: +@get_path: +@get_uri: +@get_parse_name: +@get_parent: +@prefix_matches: +@get_relative_path: +@resolve_relative_path: +@get_child_for_display_name: +@enumerate_children: +@enumerate_children_async: +@enumerate_children_finish: +@query_info: +@query_info_async: +@query_info_finish: +@query_filesystem_info: +@query_filesystem_info_async: +@query_filesystem_info_finish: +@find_enclosing_mount: +@find_enclosing_mount_async: +@find_enclosing_mount_finish: +@set_display_name: +@set_display_name_async: +@set_display_name_finish: +@query_settable_attributes: +@_query_settable_attributes_async: +@_query_settable_attributes_finish: +@query_writable_namespaces: +@_query_writable_namespaces_async: +@_query_writable_namespaces_finish: +@set_attribute: +@set_attributes_from_info: +@set_attributes_async: +@set_attributes_finish: +@read_fn: +@read_async: +@read_finish: +@append_to: +@append_to_async: +@append_to_finish: +@create: +@create_async: +@create_finish: +@replace: +@replace_async: +@replace_finish: +@delete_file: +@_delete_file_async: +@_delete_file_finish: +@trash: +@_trash_async: +@_trash_finish: +@make_directory: +@_make_directory_async: +@_make_directory_finish: +@make_symbolic_link: +@_make_symbolic_link_async: +@_make_symbolic_link_finish: +@copy: +@copy_async: +@copy_finish: +@move: +@_move_async: +@_move_finish: +@mount_mountable: +@mount_mountable_finish: +@unmount_mountable: +@unmount_mountable_finish: +@eject_mountable: +@eject_mountable_finish: +@mount_enclosing_volume: +@mount_enclosing_volume_finish: +@monitor_dir: +@monitor_file: +@open_readwrite: +@open_readwrite_async: +@open_readwrite_finish: +@create_readwrite: +@create_readwrite_async: +@create_readwrite_finish: +@replace_readwrite: +@replace_readwrite_async: +@replace_readwrite_finish: +@start_mountable: +@start_mountable_finish: +@stop_mountable: +@stop_mountable_finish: +@supports_thread_contexts: +@unmount_mountable_with_operation: +@unmount_mountable_with_operation_finish: +@eject_mountable_with_operation: +@eject_mountable_with_operation_finish: +@poll_mountable: +@poll_mountable_finish: + + + + + + +@G_FILE_QUERY_INFO_NONE: +@G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS: + + + + + + +@G_FILE_CREATE_NONE: +@G_FILE_CREATE_PRIVATE: +@G_FILE_CREATE_REPLACE_DESTINATION: + + + + + + +@G_FILE_COPY_NONE: +@G_FILE_COPY_OVERWRITE: +@G_FILE_COPY_BACKUP: +@G_FILE_COPY_NOFOLLOW_SYMLINKS: +@G_FILE_COPY_ALL_METADATA: +@G_FILE_COPY_NO_FALLBACK_FOR_MOVE: +@G_FILE_COPY_TARGET_DEFAULT_PERMS: + + + + + + +@G_FILE_MONITOR_NONE: +@G_FILE_MONITOR_WATCH_MOUNTS: +@G_FILE_MONITOR_SEND_MOVED: + + + + + + +@G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS: +@G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL: +@G_FILESYSTEM_PREVIEW_TYPE_NEVER: + + + + + + +@current_num_bytes: +@total_num_bytes: +@user_data: + + + + + + + +@file_contents: +@file_size: +@callback_data: +@Returns: + + + + + + + +@path: +@Returns: + + + + + + + +@uri: +@Returns: + + + + + + + +@arg: +@Returns: + + + + + + + +@parse_name: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file1: +@file2: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@parent: +@Returns: + + + + + + + +@file: +@name: +@Returns: + + + + + + + +@file: +@display_name: +@error: +@Returns: + + + + + + + +@file: +@prefix: +@Returns: + + + + + + + +@parent: +@descendant: +@Returns: + + + + + + + +@file: +@relative_path: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@uri_scheme: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@etag: +@make_backup: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@etag: +@make_backup: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@attributes: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attributes: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@Returns: + + + + + + + +@file: +@attributes: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attributes: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@attributes: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attributes: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@display_name: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@display_name: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@source: +@destination: +@flags: +@cancellable: +@progress_callback: +@progress_callback_data: +@error: +@Returns: + + + + + + + +@source: +@destination: +@flags: +@io_priority: +@cancellable: +@progress_callback: +@progress_callback_data: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@source: +@destination: +@flags: +@cancellable: +@progress_callback: +@progress_callback_data: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@symlink_value: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@type: +@value_p: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@info: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@info: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@info: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@value: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@value: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@value: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@value: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@value: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@attribute: +@value: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@start_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@result: +@error: +@Returns: + + + + + + + +@location: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@location: +@result: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@contents: +@length: +@etag_out: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@contents: +@length: +@etag_out: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@read_more_callback: +@callback: +@user_data: + + + + + + + +@file: +@res: +@contents: +@length: +@etag_out: +@error: +@Returns: + + + + + + + +@file: +@contents: +@length: +@etag: +@make_backup: +@flags: +@new_etag: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@contents: +@length: +@etag: +@make_backup: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@new_etag: +@error: +@Returns: + + + + + + + +@source: +@destination: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@etag: +@make_backup: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@file: +@etag: +@make_backup: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@file: +@res: +@error: +@Returns: + + + + + + + +@file: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfileattribute.sgml b/docs/reference/gio/tmpl/gfileattribute.sgml new file mode 100644 index 0000000..5046176 --- /dev/null +++ b/docs/reference/gio/tmpl/gfileattribute.sgml @@ -0,0 +1,125 @@ + +GFileAttribute + + + + + + + + + + + + + + + + + + + + + + +@G_FILE_ATTRIBUTE_TYPE_INVALID: +@G_FILE_ATTRIBUTE_TYPE_STRING: +@G_FILE_ATTRIBUTE_TYPE_BYTE_STRING: +@G_FILE_ATTRIBUTE_TYPE_BOOLEAN: +@G_FILE_ATTRIBUTE_TYPE_UINT32: +@G_FILE_ATTRIBUTE_TYPE_INT32: +@G_FILE_ATTRIBUTE_TYPE_UINT64: +@G_FILE_ATTRIBUTE_TYPE_INT64: +@G_FILE_ATTRIBUTE_TYPE_OBJECT: +@G_FILE_ATTRIBUTE_TYPE_STRINGV: + + + + + + +@G_FILE_ATTRIBUTE_INFO_NONE: +@G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE: +@G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED: + + + + + + +@G_FILE_ATTRIBUTE_STATUS_UNSET: +@G_FILE_ATTRIBUTE_STATUS_SET: +@G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING: + + + + + + +@name: +@type: +@flags: + + + + + + +@infos: +@n_infos: + + + + + + +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@name: +@Returns: + + + + + + + +@list: +@name: +@type: +@flags: + + diff --git a/docs/reference/gio/tmpl/gfiledescriptorbased.sgml b/docs/reference/gio/tmpl/gfiledescriptorbased.sgml new file mode 100644 index 0000000..b400236 --- /dev/null +++ b/docs/reference/gio/tmpl/gfiledescriptorbased.sgml @@ -0,0 +1,34 @@ + +GFileDescriptorBased + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd_based: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfileenumerator.sgml b/docs/reference/gio/tmpl/gfileenumerator.sgml new file mode 100644 index 0000000..db64ae9 --- /dev/null +++ b/docs/reference/gio/tmpl/gfileenumerator.sgml @@ -0,0 +1,135 @@ + +GFileEnumerator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@enumerator: +@cancellable: +@error: +@Returns: + + + + + + + +@enumerator: +@cancellable: +@error: +@Returns: + + + + + + + +@enumerator: +@num_files: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@enumerator: +@result: +@error: +@Returns: + + + + + + + +@enumerator: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@enumerator: +@result: +@error: +@Returns: + + + + + + + +@enumerator: +@Returns: + + + + + + + +@enumerator: +@Returns: + + + + + + + +@enumerator: +@pending: + + + + + + + +@enumerator: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfileicon.sgml b/docs/reference/gio/tmpl/gfileicon.sgml new file mode 100644 index 0000000..c95d515 --- /dev/null +++ b/docs/reference/gio/tmpl/gfileicon.sgml @@ -0,0 +1,48 @@ + +GFileIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@file: +@Returns: + + + + + + + +@icon: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfileinfo.sgml b/docs/reference/gio/tmpl/gfileinfo.sgml new file mode 100644 index 0000000..34cdbaf --- /dev/null +++ b/docs/reference/gio/tmpl/gfileinfo.sgml @@ -0,0 +1,1189 @@ + +GFileInfo + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_FILE_TYPE_UNKNOWN: +@G_FILE_TYPE_REGULAR: +@G_FILE_TYPE_DIRECTORY: +@G_FILE_TYPE_SYMBOLIC_LINK: +@G_FILE_TYPE_SPECIAL: +@G_FILE_TYPE_SHORTCUT: +@G_FILE_TYPE_MOUNTABLE: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@other: +@Returns: + + + + + + + +@src_info: +@dest_info: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@name_space: +@Returns: + + + + + + + +@info: +@name_space: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@type: +@value_pp: +@status: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@Returns: + + + + + + + +@info: +@attribute: +@type: +@value_p: + + + + + + + +@info: +@attribute: +@status: +@Returns: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: +@attribute: +@attr_value: + + + + + + + +@info: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@result: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@Returns: + + + + + + + +@info: +@mask: + + + + + + + +@info: + + + + + + + +@info: +@type: + + + + + + + +@info: +@is_hidden: + + + + + + + +@info: +@is_symlink: + + + + + + + +@info: +@name: + + + + + + + +@info: +@display_name: + + + + + + + +@info: +@edit_name: + + + + + + + +@info: +@icon: + + + + + + + +@info: +@content_type: + + + + + + + +@info: +@size: + + + + + + + +@info: +@mtime: + + + + + + + +@info: +@symlink_target: + + + + + + + +@info: +@sort_order: + + + + + + + +@attributes: +@Returns: + + + + + + + +@matcher: +@Returns: + + + + + + + +@matcher: + + + + + + + +@matcher: +@attribute: +@Returns: + + + + + + + +@matcher: +@attribute: +@Returns: + + + + + + + +@matcher: +@ns: +@Returns: + + + + + + + +@matcher: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfileinputstream.sgml b/docs/reference/gio/tmpl/gfileinputstream.sgml new file mode 100644 index 0000000..063c5e1 --- /dev/null +++ b/docs/reference/gio/tmpl/gfileinputstream.sgml @@ -0,0 +1,61 @@ + +GFileInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@attributes: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@attributes: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfileiostream.sgml b/docs/reference/gio/tmpl/gfileiostream.sgml new file mode 100644 index 0000000..cbade18 --- /dev/null +++ b/docs/reference/gio/tmpl/gfileiostream.sgml @@ -0,0 +1,70 @@ + +GFileIOStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@attributes: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@attributes: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfilemonitor.sgml b/docs/reference/gio/tmpl/gfilemonitor.sgml new file mode 100644 index 0000000..8447221 --- /dev/null +++ b/docs/reference/gio/tmpl/gfilemonitor.sgml @@ -0,0 +1,97 @@ + +GFileMonitor + + + + + + + + + + + + + + + + + + + + + + +@G_FILE_MONITOR_EVENT_CHANGED: +@G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: +@G_FILE_MONITOR_EVENT_DELETED: +@G_FILE_MONITOR_EVENT_CREATED: +@G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: +@G_FILE_MONITOR_EVENT_PRE_UNMOUNT: +@G_FILE_MONITOR_EVENT_UNMOUNTED: +@G_FILE_MONITOR_EVENT_MOVED: + + + + + + + + + + + + +@gfilemonitor: the object which received the signal. +@arg1: +@arg2: +@arg3: + + + + + + + + + + + + + + + + +@monitor: +@Returns: + + + + + + + +@monitor: +@Returns: + + + + + + + +@monitor: +@limit_msecs: + + + + + + + +@monitor: +@child: +@other_file: +@event_type: + + diff --git a/docs/reference/gio/tmpl/gfilenamecompleter.sgml b/docs/reference/gio/tmpl/gfilenamecompleter.sgml new file mode 100644 index 0000000..5c3e79d --- /dev/null +++ b/docs/reference/gio/tmpl/gfilenamecompleter.sgml @@ -0,0 +1,69 @@ + +GFilenameCompleter + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gfilenamecompleter: the object which received the signal. + + + + + + +@Returns: + + + + + + + +@completer: +@initial_text: +@Returns: + + + + + + + +@completer: +@initial_text: +@Returns: + + + + + + + +@completer: +@dirs_only: + + diff --git a/docs/reference/gio/tmpl/gfileoutputstream.sgml b/docs/reference/gio/tmpl/gfileoutputstream.sgml new file mode 100644 index 0000000..419af7f --- /dev/null +++ b/docs/reference/gio/tmpl/gfileoutputstream.sgml @@ -0,0 +1,70 @@ + +GFileOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@attributes: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@attributes: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gfilterinputstream.sgml b/docs/reference/gio/tmpl/gfilterinputstream.sgml new file mode 100644 index 0000000..0f32997 --- /dev/null +++ b/docs/reference/gio/tmpl/gfilterinputstream.sgml @@ -0,0 +1,62 @@ + +GFilterInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@close_base: + + diff --git a/docs/reference/gio/tmpl/gfilteroutputstream.sgml b/docs/reference/gio/tmpl/gfilteroutputstream.sgml new file mode 100644 index 0000000..788b561 --- /dev/null +++ b/docs/reference/gio/tmpl/gfilteroutputstream.sgml @@ -0,0 +1,62 @@ + +GFilterOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@close_base: + + diff --git a/docs/reference/gio/tmpl/gicon.sgml b/docs/reference/gio/tmpl/gicon.sgml new file mode 100644 index 0000000..fbcb3fd --- /dev/null +++ b/docs/reference/gio/tmpl/gicon.sgml @@ -0,0 +1,74 @@ + +GIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@hash: +@equal: +@to_tokens: +@from_tokens: + + + + + + +@icon: +@Returns: + + + + + + + +@icon1: +@icon2: +@Returns: + + + + + + + +@icon: +@Returns: + + + + + + + +@str: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/ginetaddress.sgml b/docs/reference/gio/tmpl/ginetaddress.sgml new file mode 100644 index 0000000..4f3e368 --- /dev/null +++ b/docs/reference/gio/tmpl/ginetaddress.sgml @@ -0,0 +1,248 @@ + +GInetAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@string: +@Returns: + + + + + + + +@bytes: +@family: +@Returns: + + + + + + + +@family: +@Returns: + + + + + + + +@family: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + diff --git a/docs/reference/gio/tmpl/ginetsocketaddress.sgml b/docs/reference/gio/tmpl/ginetsocketaddress.sgml new file mode 100644 index 0000000..5ef20dd --- /dev/null +++ b/docs/reference/gio/tmpl/ginetsocketaddress.sgml @@ -0,0 +1,63 @@ + +GInetSocketAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@address: +@port: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + diff --git a/docs/reference/gio/tmpl/ginitable.sgml b/docs/reference/gio/tmpl/ginitable.sgml new file mode 100644 index 0000000..f0504b3 --- /dev/null +++ b/docs/reference/gio/tmpl/ginitable.sgml @@ -0,0 +1,83 @@ + +GInitable + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@init: + + + + + + +@initable: +@cancellable: +@error: +@Returns: + + + + + + + +@object_type: +@cancellable: +@error: +@first_property_name: +@Varargs: +@Returns: + + + + + + + +@object_type: +@first_property_name: +@var_args: +@cancellable: +@error: +@Returns: + + + + + + + +@object_type: +@n_parameters: +@parameters: +@cancellable: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/ginputstream.sgml b/docs/reference/gio/tmpl/ginputstream.sgml new file mode 100644 index 0000000..d7496f0 --- /dev/null +++ b/docs/reference/gio/tmpl/ginputstream.sgml @@ -0,0 +1,183 @@ + +GInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@buffer: +@count: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@buffer: +@count: +@bytes_read: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@count: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@buffer: +@count: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@count: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@error: +@Returns: + + + + + + + +@stream: + + diff --git a/docs/reference/gio/tmpl/gio-unused.sgml b/docs/reference/gio/tmpl/gio-unused.sgml new file mode 100644 index 0000000..e69de29 diff --git a/docs/reference/gio/tmpl/gioerror.sgml b/docs/reference/gio/tmpl/gioerror.sgml new file mode 100644 index 0000000..6c6ade2 --- /dev/null +++ b/docs/reference/gio/tmpl/gioerror.sgml @@ -0,0 +1,77 @@ + +GIOError + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_IO_ERROR_FAILED: +@G_IO_ERROR_NOT_FOUND: +@G_IO_ERROR_EXISTS: +@G_IO_ERROR_IS_DIRECTORY: +@G_IO_ERROR_NOT_DIRECTORY: +@G_IO_ERROR_NOT_EMPTY: +@G_IO_ERROR_NOT_REGULAR_FILE: +@G_IO_ERROR_NOT_SYMBOLIC_LINK: +@G_IO_ERROR_NOT_MOUNTABLE_FILE: +@G_IO_ERROR_FILENAME_TOO_LONG: +@G_IO_ERROR_INVALID_FILENAME: +@G_IO_ERROR_TOO_MANY_LINKS: +@G_IO_ERROR_NO_SPACE: +@G_IO_ERROR_INVALID_ARGUMENT: +@G_IO_ERROR_PERMISSION_DENIED: +@G_IO_ERROR_NOT_SUPPORTED: +@G_IO_ERROR_NOT_MOUNTED: +@G_IO_ERROR_ALREADY_MOUNTED: +@G_IO_ERROR_CLOSED: +@G_IO_ERROR_CANCELLED: +@G_IO_ERROR_PENDING: +@G_IO_ERROR_READ_ONLY: +@G_IO_ERROR_CANT_CREATE_BACKUP: +@G_IO_ERROR_WRONG_ETAG: +@G_IO_ERROR_TIMED_OUT: +@G_IO_ERROR_WOULD_RECURSE: +@G_IO_ERROR_BUSY: +@G_IO_ERROR_WOULD_BLOCK: +@G_IO_ERROR_HOST_NOT_FOUND: +@G_IO_ERROR_WOULD_MERGE: +@G_IO_ERROR_FAILED_HANDLED: +@G_IO_ERROR_TOO_MANY_OPEN_FILES: +@G_IO_ERROR_NOT_INITIALIZED: +@G_IO_ERROR_ADDRESS_IN_USE: +@G_IO_ERROR_PARTIAL_INPUT: +@G_IO_ERROR_INVALID_DATA: + + + + + + +@err_no: +@Returns: + + diff --git a/docs/reference/gio/tmpl/giomodule.sgml b/docs/reference/gio/tmpl/giomodule.sgml new file mode 100644 index 0000000..c501424 --- /dev/null +++ b/docs/reference/gio/tmpl/giomodule.sgml @@ -0,0 +1,75 @@ + +GIOModule + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filename: +@Returns: + + + + + + + +@dirname: +@Returns: + + + + + + + +@dirname: + + + + + + + +@module: + + + + + + + +@module: + + + + + + + +@Returns: + + diff --git a/docs/reference/gio/tmpl/gioscheduler.sgml b/docs/reference/gio/tmpl/gioscheduler.sgml new file mode 100644 index 0000000..77af9cf --- /dev/null +++ b/docs/reference/gio/tmpl/gioscheduler.sgml @@ -0,0 +1,78 @@ + +GIOScheduler + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@job: +@cancellable: +@user_data: +@Returns: + + + + + + + +@job_func: +@user_data: +@notify: +@io_priority: +@cancellable: + + + + + + + + + + + + + + +@job: +@func: +@user_data: +@notify: +@Returns: + + + + + + + +@job: +@func: +@user_data: +@notify: + + diff --git a/docs/reference/gio/tmpl/giostream.sgml b/docs/reference/gio/tmpl/giostream.sgml new file mode 100644 index 0000000..ebd80b6 --- /dev/null +++ b/docs/reference/gio/tmpl/giostream.sgml @@ -0,0 +1,128 @@ + +GIOStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@error: +@Returns: + + + + + + + +@stream: + + diff --git a/docs/reference/gio/tmpl/gloadableicon.sgml b/docs/reference/gio/tmpl/gloadableicon.sgml new file mode 100644 index 0000000..7093f1f --- /dev/null +++ b/docs/reference/gio/tmpl/gloadableicon.sgml @@ -0,0 +1,72 @@ + +GLoadableIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@load: +@load_async: +@load_finish: + + + + + + +@icon: +@size: +@type: +@cancellable: +@error: +@Returns: + + + + + + + +@icon: +@size: +@cancellable: +@callback: +@user_data: + + + + + + + +@icon: +@res: +@type: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gmemoryinputstream.sgml b/docs/reference/gio/tmpl/gmemoryinputstream.sgml new file mode 100644 index 0000000..6e4cc88 --- /dev/null +++ b/docs/reference/gio/tmpl/gmemoryinputstream.sgml @@ -0,0 +1,55 @@ + +GMemoryInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@data: +@len: +@destroy: +@Returns: + + + + + + + +@stream: +@data: +@len: +@destroy: + + diff --git a/docs/reference/gio/tmpl/gmemoryoutputstream.sgml b/docs/reference/gio/tmpl/gmemoryoutputstream.sgml new file mode 100644 index 0000000..b22faae --- /dev/null +++ b/docs/reference/gio/tmpl/gmemoryoutputstream.sgml @@ -0,0 +1,99 @@ + +GMemoryOutputStream + + + + + + + + + + + + + + + + + + + + + + +@data: +@size: +@Returns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@data: +@size: +@realloc_function: +@destroy_function: +@Returns: + + + + + + + +@ostream: +@Returns: + + + + + + + +@ostream: +@Returns: + + + + + + + +@ostream: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gmount.sgml b/docs/reference/gio/tmpl/gmount.sgml new file mode 100644 index 0000000..31301e1 --- /dev/null +++ b/docs/reference/gio/tmpl/gmount.sgml @@ -0,0 +1,352 @@ + +GMount + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gmount: the object which received the signal. + + + + + + +@gmount: the object which received the signal. + + + + + + +@gmount: the object which received the signal. + + + + + + +@g_iface: +@changed: +@unmounted: +@get_root: +@get_name: +@get_icon: +@get_uuid: +@get_volume: +@get_drive: +@can_unmount: +@can_eject: +@unmount: +@unmount_finish: +@eject: +@eject_finish: +@remount: +@remount_finish: +@guess_content_type: +@guess_content_type_finish: +@guess_content_type_sync: +@pre_unmount: +@unmount_with_operation: +@unmount_with_operation_finish: +@eject_with_operation: +@eject_with_operation_finish: +@get_default_location: + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@G_MOUNT_MOUNT_NONE: + + + + + + +@G_MOUNT_UNMOUNT_NONE: +@G_MOUNT_UNMOUNT_FORCE: + + + + + + +@mount: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@mount: +@result: +@error: +@Returns: + + + + + + + +@mount: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@mount: +@result: +@error: +@Returns: + + + + + + + +@mount: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@mount: +@result: +@error: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@mount: +@result: +@error: +@Returns: + + + + + + + +@mount: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@mount: +@result: +@error: +@Returns: + + + + + + + +@mount: +@force_rescan: +@cancellable: +@callback: +@user_data: + + + + + + + +@mount: +@result: +@error: +@Returns: + + + + + + + +@mount: +@force_rescan: +@cancellable: +@error: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@mount: + + + + + + + +@mount: + + diff --git a/docs/reference/gio/tmpl/gmountoperation.sgml b/docs/reference/gio/tmpl/gmountoperation.sgml new file mode 100644 index 0000000..ac6311c --- /dev/null +++ b/docs/reference/gio/tmpl/gmountoperation.sgml @@ -0,0 +1,254 @@ + +GMountOperation + + + + + + + + + + + + + + + + + + + + + + +@G_ASK_PASSWORD_NEED_PASSWORD: +@G_ASK_PASSWORD_NEED_USERNAME: +@G_ASK_PASSWORD_NEED_DOMAIN: +@G_ASK_PASSWORD_SAVING_SUPPORTED: +@G_ASK_PASSWORD_ANONYMOUS_SUPPORTED: + + + + + + +@G_PASSWORD_SAVE_NEVER: +@G_PASSWORD_SAVE_FOR_SESSION: +@G_PASSWORD_SAVE_PERMANENTLY: + + + + + + + + + + + + +@gmountoperation: the object which received the signal. + + + + + + +@gmountoperation: the object which received the signal. +@arg1: +@arg2: +@arg3: +@arg4: + + + + + + +@gmountoperation: the object which received the signal. +@arg1: +@arg2: + + + + + + +@gmountoperation: the object which received the signal. +@arg1: + + + + + + +@gmountoperation: the object which received the signal. +@arg1: +@arg2: +@arg3: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_MOUNT_OPERATION_HANDLED: +@G_MOUNT_OPERATION_ABORTED: +@G_MOUNT_OPERATION_UNHANDLED: + + + + + + +@Returns: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@username: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@password: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@anonymous: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@domain: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@save: + + + + + + + +@op: +@Returns: + + + + + + + +@op: +@choice: + + + + + + + +@op: +@result: + + diff --git a/docs/reference/gio/tmpl/gnetworkaddress.sgml b/docs/reference/gio/tmpl/gnetworkaddress.sgml new file mode 100644 index 0000000..b2a055c --- /dev/null +++ b/docs/reference/gio/tmpl/gnetworkaddress.sgml @@ -0,0 +1,74 @@ + +GNetworkAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@hostname: +@port: +@Returns: + + + + + + + +@addr: +@Returns: + + + + + + + +@addr: +@Returns: + + + + + + + +@host_and_port: +@default_port: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gnetworkservice.sgml b/docs/reference/gio/tmpl/gnetworkservice.sgml new file mode 100644 index 0000000..6857396 --- /dev/null +++ b/docs/reference/gio/tmpl/gnetworkservice.sgml @@ -0,0 +1,78 @@ + +GNetworkService + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@service: +@protocol: +@domain: +@Returns: + + + + + + + +@srv: +@Returns: + + + + + + + +@srv: +@Returns: + + + + + + + +@srv: +@Returns: + + diff --git a/docs/reference/gio/tmpl/goutputstream.sgml b/docs/reference/gio/tmpl/goutputstream.sgml new file mode 100644 index 0000000..f6156f0 --- /dev/null +++ b/docs/reference/gio/tmpl/goutputstream.sgml @@ -0,0 +1,237 @@ + +GOutputStream + + + + + + + + + + + + + + + + + + + + + + +@G_OUTPUT_STREAM_SPLICE_NONE: +@G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE: +@G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET: + + + + + + + + + + + + +@stream: +@buffer: +@count: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@buffer: +@count: +@bytes_written: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@source: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@cancellable: +@error: +@Returns: + + + + + + + +@stream: +@buffer: +@count: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@source: +@flags: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@io_priority: +@cancellable: +@callback: +@user_data: + + + + + + + +@stream: +@result: +@error: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@error: +@Returns: + + + + + + + +@stream: + + diff --git a/docs/reference/gio/tmpl/gresolver.sgml b/docs/reference/gio/tmpl/gresolver.sgml new file mode 100644 index 0000000..cb2208d --- /dev/null +++ b/docs/reference/gio/tmpl/gresolver.sgml @@ -0,0 +1,189 @@ + +GResolver + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gresolver: the object which received the signal. + + + + + + +@Returns: + + + + + + + +@resolver: + + + + + + + +@resolver: +@hostname: +@cancellable: +@error: +@Returns: + + + + + + + +@resolver: +@hostname: +@cancellable: +@callback: +@user_data: + + + + + + + +@resolver: +@result: +@error: +@Returns: + + + + + + + +@addresses: + + + + + + + +@resolver: +@address: +@cancellable: +@error: +@Returns: + + + + + + + +@resolver: +@address: +@cancellable: +@callback: +@user_data: + + + + + + + +@resolver: +@result: +@error: +@Returns: + + + + + + + +@resolver: +@service: +@protocol: +@domain: +@cancellable: +@error: +@Returns: + + + + + + + +@resolver: +@service: +@protocol: +@domain: +@cancellable: +@callback: +@user_data: + + + + + + + +@resolver: +@result: +@error: +@Returns: + + + + + + + +@targets: + + + + + + + + + + + + + + +@G_RESOLVER_ERROR_NOT_FOUND: +@G_RESOLVER_ERROR_TEMPORARY_FAILURE: +@G_RESOLVER_ERROR_INTERNAL: + diff --git a/docs/reference/gio/tmpl/gseekable.sgml b/docs/reference/gio/tmpl/gseekable.sgml new file mode 100644 index 0000000..b74f185 --- /dev/null +++ b/docs/reference/gio/tmpl/gseekable.sgml @@ -0,0 +1,89 @@ + +GSeekable + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@tell: +@can_seek: +@seek: +@can_truncate: +@truncate_fn: + + + + + + +@seekable: +@Returns: + + + + + + + +@seekable: +@Returns: + + + + + + + +@seekable: +@offset: +@type: +@cancellable: +@error: +@Returns: + + + + + + + +@seekable: +@Returns: + + + + + + + +@seekable: +@offset: +@cancellable: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gsimpleasyncresult.sgml b/docs/reference/gio/tmpl/gsimpleasyncresult.sgml new file mode 100644 index 0000000..ca13aa0 --- /dev/null +++ b/docs/reference/gio/tmpl/gsimpleasyncresult.sgml @@ -0,0 +1,253 @@ + +GSimpleAsyncResult + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@res: +@object: +@cancellable: + + + + + + + +@source_object: +@callback: +@user_data: +@source_tag: +@Returns: + + + + + + + +@source_object: +@callback: +@user_data: +@domain: +@code: +@format: +@Varargs: +@Returns: + + + + + + + +@source_object: +@callback: +@user_data: +@error: +@Returns: + + + + + + + +@simple: +@op_res: +@destroy_op_res: + + + + + + + +@simple: +@Returns: + + + + + + + +@simple: +@op_res: + + + + + + + +@simple: +@Returns: + + + + + + + +@simple: +@op_res: + + + + + + + +@simple: +@Returns: + + + + + + + +@simple: +@Returns: + + + + + + + +@result: +@source: +@source_tag: +@Returns: + + + + + + + +@simple: +@handle_cancellation: + + + + + + + +@simple: + + + + + + + +@simple: + + + + + + + +@simple: +@func: +@io_priority: +@cancellable: + + + + + + + +@simple: +@error: + + + + + + + +@simple: +@dest: +@Returns: + + + + + + + +@simple: +@domain: +@code: +@format: +@Varargs: + + + + + + + +@simple: +@domain: +@code: +@format: +@args: + + + + + + + +@object: +@callback: +@user_data: +@domain: +@code: +@format: +@Varargs: + + + + + + + +@object: +@callback: +@user_data: +@error: + + diff --git a/docs/reference/gio/tmpl/gsocket.sgml b/docs/reference/gio/tmpl/gsocket.sgml new file mode 100644 index 0000000..d0943e3 --- /dev/null +++ b/docs/reference/gio/tmpl/gsocket.sgml @@ -0,0 +1,485 @@ + +GSocket + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@socket: +@condition: +@user_data: +@Returns: + + + + + + + +@G_SOCKET_TYPE_INVALID: +@G_SOCKET_TYPE_STREAM: +@G_SOCKET_TYPE_DATAGRAM: +@G_SOCKET_TYPE_SEQPACKET: + + + + + + +@G_SOCKET_PROTOCOL_UNKNOWN: +@G_SOCKET_PROTOCOL_DEFAULT: +@G_SOCKET_PROTOCOL_TCP: +@G_SOCKET_PROTOCOL_UDP: +@G_SOCKET_PROTOCOL_SCTP: + + + + + + +@G_SOCKET_MSG_NONE: +@G_SOCKET_MSG_OOB: +@G_SOCKET_MSG_PEEK: +@G_SOCKET_MSG_DONTROUTE: + + + + + + +@buffer: +@size: + + + + + + +@buffer: +@size: + + + + + + +@family: +@type: +@protocol: +@error: +@Returns: + + + + + + + +@fd: +@error: +@Returns: + + + + + + + +@socket: +@address: +@allow_reuse: +@error: +@Returns: + + + + + + + +@socket: +@error: +@Returns: + + + + + + + +@socket: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@address: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@error: +@Returns: + + + + + + + +@socket: +@buffer: +@size: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@address: +@buffer: +@size: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@address: +@vectors: +@num_vectors: +@messages: +@num_messages: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@buffer: +@size: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@address: +@buffer: +@size: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@address: +@vectors: +@num_vectors: +@messages: +@num_messages: +@flags: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@error: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@shutdown_read: +@shutdown_write: +@error: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@condition: +@cancellable: +@Returns: + + + + + + + +@socket: +@condition: +@Returns: + + + + + + + +@socket: +@condition: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@backlog: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@blocking: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@keepalive: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@error: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@error: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@socket: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gsocketaddress.sgml b/docs/reference/gio/tmpl/gsocketaddress.sgml new file mode 100644 index 0000000..7db4c30 --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketaddress.sgml @@ -0,0 +1,80 @@ + +GSocketAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_SOCKET_FAMILY_INVALID: +@G_SOCKET_FAMILY_UNIX: +@G_SOCKET_FAMILY_IPV4: +@G_SOCKET_FAMILY_IPV6: + + + + + + +@native: +@len: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@dest: +@destlen: +@error: +@Returns: + + + + + + + +@address: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gsocketclient.sgml b/docs/reference/gio/tmpl/gsocketclient.sgml new file mode 100644 index 0000000..3c0eec3 --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketclient.sgml @@ -0,0 +1,234 @@ + +GSocketClient + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@client: +@connectable: +@cancellable: +@error: +@Returns: + + + + + + + +@client: +@connectable: +@cancellable: +@callback: +@user_data: + + + + + + + +@client: +@result: +@error: +@Returns: + + + + + + + +@client: +@host_and_port: +@default_port: +@cancellable: +@error: +@Returns: + + + + + + + +@client: +@host_and_port: +@default_port: +@cancellable: +@callback: +@user_data: + + + + + + + +@client: +@result: +@error: +@Returns: + + + + + + + +@client: +@domain: +@service: +@cancellable: +@error: +@Returns: + + + + + + + +@client: +@domain: +@service: +@cancellable: +@callback: +@user_data: + + + + + + + +@client: +@result: +@error: +@Returns: + + + + + + + +@client: +@family: + + + + + + + +@client: +@address: + + + + + + + +@client: +@protocol: + + + + + + + +@client: +@type: + + + + + + + +@client: +@Returns: + + + + + + + +@client: +@Returns: + + + + + + + +@client: +@Returns: + + + + + + + +@client: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gsocketconnectable.sgml b/docs/reference/gio/tmpl/gsocketconnectable.sgml new file mode 100644 index 0000000..9c3ee3b --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketconnectable.sgml @@ -0,0 +1,81 @@ + +GSocketConnectable + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@g_iface: +@enumerate: + + + + + + +@connectable: +@Returns: + + + + + + + + + + + + + +@enumerator: +@cancellable: +@error: +@Returns: + + + + + + + +@enumerator: +@cancellable: +@callback: +@user_data: + + + + + + + +@enumerator: +@result: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gsocketconnection.sgml b/docs/reference/gio/tmpl/gsocketconnection.sgml new file mode 100644 index 0000000..c6e573d --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketconnection.sgml @@ -0,0 +1,148 @@ + +GSocketConnection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@connection: +@error: +@Returns: + + + + + + + +@connection: +@error: +@Returns: + + + + + + + +@connection: +@Returns: + + + + + + + + + + + + + + + + + + +@connection: +@graceful_disconnect: + + + + + + + +@connection: +@Returns: + + + + + + + + + + + + + +@connection: +@cancellable: +@error: +@Returns: + + + + + + + +@connection: +@fd: +@cancellable: +@error: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@family: +@type: +@protocol_id: +@Returns: + + + + + + + +@g_type: +@family: +@type: +@protocol: + + diff --git a/docs/reference/gio/tmpl/gsocketcontrolmessage.sgml b/docs/reference/gio/tmpl/gsocketcontrolmessage.sgml new file mode 100644 index 0000000..3d93883 --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketcontrolmessage.sgml @@ -0,0 +1,73 @@ + +GSocketControlMessage + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@level: +@type: +@size: +@data: +@Returns: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@data: + + diff --git a/docs/reference/gio/tmpl/gsocketlistener.sgml b/docs/reference/gio/tmpl/gsocketlistener.sgml new file mode 100644 index 0000000..efd06f4 --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketlistener.sgml @@ -0,0 +1,175 @@ + +GSocketListener + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@listener: +@socket: +@source_object: +@error: +@Returns: + + + + + + + +@listener: +@address: +@type: +@protocol: +@source_object: +@effective_address: +@error: +@Returns: + + + + + + + +@listener: +@port: +@source_object: +@error: +@Returns: + + + + + + + +@listener: +@source_object: +@error: +@Returns: + + + + + + + +@listener: +@source_object: +@cancellable: +@error: +@Returns: + + + + + + + +@listener: +@cancellable: +@callback: +@user_data: + + + + + + + +@listener: +@result: +@source_object: +@error: +@Returns: + + + + + + + +@listener: +@source_object: +@cancellable: +@error: +@Returns: + + + + + + + +@listener: +@cancellable: +@callback: +@user_data: + + + + + + + +@listener: +@result: +@source_object: +@error: +@Returns: + + + + + + + +@listener: + + + + + + + +@listener: +@listen_backlog: + + diff --git a/docs/reference/gio/tmpl/gsocketservice.sgml b/docs/reference/gio/tmpl/gsocketservice.sgml new file mode 100644 index 0000000..24603bd --- /dev/null +++ b/docs/reference/gio/tmpl/gsocketservice.sgml @@ -0,0 +1,68 @@ + +GSocketService + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gsocketservice: the object which received the signal. +@arg1: +@arg2: +@Returns: + + + + + + +@Returns: + + + + + + + +@service: + + + + + + + +@service: + + + + + + + +@service: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gsrvtarget.sgml b/docs/reference/gio/tmpl/gsrvtarget.sgml new file mode 100644 index 0000000..8ecb9e2 --- /dev/null +++ b/docs/reference/gio/tmpl/gsrvtarget.sgml @@ -0,0 +1,99 @@ + +GSrvTarget + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@hostname: +@port: +@priority: +@weight: +@Returns: + + + + + + + +@target: +@Returns: + + + + + + + +@target: + + + + + + + +@target: +@Returns: + + + + + + + +@target: +@Returns: + + + + + + + +@target: +@Returns: + + + + + + + +@target: +@Returns: + + + + + + + +@targets: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gthemedicon.sgml b/docs/reference/gio/tmpl/gthemedicon.sgml new file mode 100644 index 0000000..ac37f88 --- /dev/null +++ b/docs/reference/gio/tmpl/gthemedicon.sgml @@ -0,0 +1,95 @@ + +GThemedIcon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@iconname: +@Returns: + + + + + + + +@iconnames: +@len: +@Returns: + + + + + + + +@iconname: +@Returns: + + + + + + + +@icon: +@iconname: + + + + + + + +@icon: +@iconname: + + + + + + + +@icon: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gthreadedsocketservice.sgml b/docs/reference/gio/tmpl/gthreadedsocketservice.sgml new file mode 100644 index 0000000..a8df8d9 --- /dev/null +++ b/docs/reference/gio/tmpl/gthreadedsocketservice.sgml @@ -0,0 +1,49 @@ + +GThreadedSocketService + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gthreadedsocketservice: the object which received the signal. +@arg1: +@arg2: +@Returns: + + + + + + + + + + + +@max_threads: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gunixfdlist.sgml b/docs/reference/gio/tmpl/gunixfdlist.sgml new file mode 100644 index 0000000..4018a0d --- /dev/null +++ b/docs/reference/gio/tmpl/gunixfdlist.sgml @@ -0,0 +1,94 @@ + +GUnixFDList + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fds: +@n_fds: +@Returns: + + + + + + + +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@index_: +@error: +@Returns: + + + + + + + +@list: +@length: +@Returns: + + + + + + + +@list: +@length: +@Returns: + + + + + + + +@list: +@fd: +@error: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gunixfdmessage.sgml b/docs/reference/gio/tmpl/gunixfdmessage.sgml new file mode 100644 index 0000000..69a48ca --- /dev/null +++ b/docs/reference/gio/tmpl/gunixfdmessage.sgml @@ -0,0 +1,77 @@ + +GUnixFDMessage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd_list: +@Returns: + + + + + + + +@Returns: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@fd: +@error: +@Returns: + + + + + + + +@message: +@length: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gunixinputstream.sgml b/docs/reference/gio/tmpl/gunixinputstream.sgml new file mode 100644 index 0000000..a4b9eda --- /dev/null +++ b/docs/reference/gio/tmpl/gunixinputstream.sgml @@ -0,0 +1,72 @@ + +GUnixInputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd: +@close_fd: +@Returns: + + + + + + + +@stream: +@close_fd: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gunixmounts.sgml b/docs/reference/gio/tmpl/gunixmounts.sgml new file mode 100644 index 0000000..93086a7 --- /dev/null +++ b/docs/reference/gio/tmpl/gunixmounts.sgml @@ -0,0 +1,327 @@ + +Unix Mounts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gunixmountmonitor: the object which received the signal. + + + + + + +@gunixmountmonitor: the object which received the signal. + + + + + + +@mount_entry: + + + + + + + +@mount1: +@mount2: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_entry: +@Returns: + + + + + + + +@mount_point: + + + + + + + +@mount1: +@mount2: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@mount_point: +@Returns: + + + + + + + +@time_read: +@Returns: + + + + + + + +@time_read: +@Returns: + + + + + + + +@mount_path: +@time_read: +@Returns: + + + + + + + +@time: +@Returns: + + + + + + + +@time: +@Returns: + + + + + + + +@Returns: + + + + + + + +@mount_monitor: +@limit_msec: + + + + + + + +@mount_path: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gunixoutputstream.sgml b/docs/reference/gio/tmpl/gunixoutputstream.sgml new file mode 100644 index 0000000..d5d5460 --- /dev/null +++ b/docs/reference/gio/tmpl/gunixoutputstream.sgml @@ -0,0 +1,72 @@ + +GUnixOutputStream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd: +@close_fd: +@Returns: + + + + + + + +@stream: +@close_fd: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gunixsocketaddress.sgml b/docs/reference/gio/tmpl/gunixsocketaddress.sgml new file mode 100644 index 0000000..fffba80 --- /dev/null +++ b/docs/reference/gio/tmpl/gunixsocketaddress.sgml @@ -0,0 +1,94 @@ + +GUnixSocketAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@path: +@Returns: + + + + + + + +@path: +@path_len: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@address: +@Returns: + + + + + + + +@Returns: + + diff --git a/docs/reference/gio/tmpl/gvfs.sgml b/docs/reference/gio/tmpl/gvfs.sgml new file mode 100644 index 0000000..8672015 --- /dev/null +++ b/docs/reference/gio/tmpl/gvfs.sgml @@ -0,0 +1,96 @@ + +GVfs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@vfs: +@path: +@Returns: + + + + + + + +@vfs: +@uri: +@Returns: + + + + + + + +@vfs: +@parse_name: +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@vfs: +@Returns: + + + + + + + +@vfs: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gvolume.sgml b/docs/reference/gio/tmpl/gvolume.sgml new file mode 100644 index 0000000..ff3c2ed --- /dev/null +++ b/docs/reference/gio/tmpl/gvolume.sgml @@ -0,0 +1,271 @@ + +GVolume + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gvolume: the object which received the signal. + + + + + + +@gvolume: the object which received the signal. + + + + + + +@g_iface: +@changed: +@removed: +@get_name: +@get_icon: +@get_uuid: +@get_drive: +@get_mount: +@can_mount: +@can_eject: +@mount_fn: +@mount_finish: +@eject: +@eject_finish: +@get_identifier: +@enumerate_identifiers: +@should_automount: +@get_activation_root: +@eject_with_operation: +@eject_with_operation_finish: + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@volume: +@result: +@error: +@Returns: + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@flags: +@cancellable: +@callback: +@user_data: + + + + + + + +@volume: +@result: +@error: +@Returns: + + + + + + + +@volume: +@flags: +@mount_operation: +@cancellable: +@callback: +@user_data: + + + + + + + +@volume: +@result: +@error: +@Returns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@volume: +@Returns: + + + + + + + +@volume: +@kind: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gvolumemonitor.sgml b/docs/reference/gio/tmpl/gvolumemonitor.sgml new file mode 100644 index 0000000..3320420 --- /dev/null +++ b/docs/reference/gio/tmpl/gvolumemonitor.sgml @@ -0,0 +1,192 @@ + +GVolumeMonitor + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + +@gvolumemonitor: the object which received the signal. +@arg1: + + + + + + + + + + + + + +@Returns: + + + + + + + +@volume_monitor: +@Returns: + + + + + + + +@volume_monitor: +@Returns: + + + + + + + +@volume_monitor: +@Returns: + + + + + + + +@mount: +@Returns: + + + + + + + +@volume_monitor: +@uuid: +@Returns: + + + + + + + +@volume_monitor: +@uuid: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gzcompressor.sgml b/docs/reference/gio/tmpl/gzcompressor.sgml new file mode 100644 index 0000000..b7bc7a4 --- /dev/null +++ b/docs/reference/gio/tmpl/gzcompressor.sgml @@ -0,0 +1,54 @@ + +GZlibCompressor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_ZLIB_COMPRESSOR_FORMAT_ZLIB: +@G_ZLIB_COMPRESSOR_FORMAT_GZIP: +@G_ZLIB_COMPRESSOR_FORMAT_RAW: + + + + + + +@format: +@level: +@Returns: + + diff --git a/docs/reference/gio/tmpl/gzdecompressor.sgml b/docs/reference/gio/tmpl/gzdecompressor.sgml new file mode 100644 index 0000000..788e7e7 --- /dev/null +++ b/docs/reference/gio/tmpl/gzdecompressor.sgml @@ -0,0 +1,39 @@ + +GZlibDecompressor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@format: +@Returns: + + diff --git a/docs/reference/gio/version.xml.in b/docs/reference/gio/version.xml.in new file mode 100644 index 0000000..d78bda9 --- /dev/null +++ b/docs/reference/gio/version.xml.in @@ -0,0 +1 @@ +@VERSION@ diff --git a/docs/reference/glib/Makefile.am b/docs/reference/glib/Makefile.am new file mode 100644 index 0000000..a61110b --- /dev/null +++ b/docs/reference/glib/Makefile.am @@ -0,0 +1,110 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module. +DOC_MODULE=glib + +# The top-level SGML file. +DOC_MAIN_SGML_FILE=glib-docs.sgml + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR=../../.. + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED" --ignore-decorators="GLIB_VAR" + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS=--sgml-mode --output-format=xml --name-space=g + +# Used for dependencies +HFILE_GLOB=$(top_srcdir)/glib/*.h $(top_srcdir)/gmodule/*.h +CFILE_GLOB=$(top_srcdir)/glib/*.c $(top_srcdir)/gmodule/*.c + +# Headers to ignore +IGNORE_HFILES= \ + build \ + gobject \ + gio \ + config.h \ + gdatasetprivate.h \ + glibintl.h \ + gbsearcharray.h \ + gmoduleconf.h \ + gunibreak.h \ + gunicomp.h \ + gunidecomp.h \ + gunichartables.h \ + glibconfig-sysdefs.h \ + gdebug.h \ + gprintfint.h \ + galias.h \ + gmirroringtable.h \ + gscripttable.h \ + glib-mirroring-tab \ + gnulib \ + pcre \ + update-pcre \ + gbuffer.h \ + gvariant-internal.h \ + gvariant-serialiser.h \ + gvariant-core.h \ + gvarianttypeinfo.h + +# Images to copy into HTML directory +HTML_IMAGES = \ + file-name-encodings.png \ + mainloop-states.gif + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = \ + cross.sgml \ + running.sgml \ + building.sgml \ + changes.sgml \ + compiling.sgml \ + resources.sgml \ + regex-syntax.sgml \ + version.xml \ + glib-gettextize.xml \ + gtester.xml \ + gtester-report.xml \ + gvariant-varargs.xml + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS= + +# include common portion ... +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +EXTRA_DIST += \ + file-name-encodings.png \ + file-name-encodings.sxd \ + mainloop-states.fig \ + mainloop-states.png \ + mainloop-states.eps \ + version.xml.in + +######################################################################## + +man_MANS = \ + glib-gettextize.1 \ + gtester.1 \ + gtester-report.1 +if ENABLE_MAN + +%.1 : %.xml + @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +endif + +BUILT_EXTRA_DIST = $(man_MANS) + +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/glib/Makefile.in b/docs/reference/glib/Makefile.in new file mode 100644 index 0000000..06db780 --- /dev/null +++ b/docs/reference/glib/Makefile.in @@ -0,0 +1,911 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +# -*- 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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/version.xml.in $(top_srcdir)/Makefile.decl \ + $(top_srcdir)/gtk-doc.make +subdir = docs/reference/glib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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' +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# include common portion ... + +# Other files to distribute +EXTRA_DIST = $(content_files) $(HTML_IMAGES) $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt \ + file-name-encodings.png file-name-encodings.sxd \ + mainloop-states.fig mainloop-states.png mainloop-states.eps \ + version.xml.in +TEST_PROGS = +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module. +DOC_MODULE = glib + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = glib-docs.sgml + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR = ../../.. + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="G_DISABLE_DEPRECATED" --ignore-decorators="GLIB_VAR" + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --sgml-mode --output-format=xml --name-space=g + +# Used for dependencies +HFILE_GLOB = $(top_srcdir)/glib/*.h $(top_srcdir)/gmodule/*.h +CFILE_GLOB = $(top_srcdir)/glib/*.c $(top_srcdir)/gmodule/*.c + +# Headers to ignore +IGNORE_HFILES = \ + build \ + gobject \ + gio \ + config.h \ + gdatasetprivate.h \ + glibintl.h \ + gbsearcharray.h \ + gmoduleconf.h \ + gunibreak.h \ + gunicomp.h \ + gunidecomp.h \ + gunichartables.h \ + glibconfig-sysdefs.h \ + gdebug.h \ + gprintfint.h \ + galias.h \ + gmirroringtable.h \ + gscripttable.h \ + glib-mirroring-tab \ + gnulib \ + pcre \ + update-pcre \ + gbuffer.h \ + gvariant-internal.h \ + gvariant-serialiser.h \ + gvariant-core.h \ + gvarianttypeinfo.h + + +# Images to copy into HTML directory +HTML_IMAGES = \ + file-name-encodings.png \ + mainloop-states.gif + + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = \ + cross.sgml \ + running.sgml \ + building.sgml \ + changes.sgml \ + compiling.sgml \ + resources.sgml \ + regex-syntax.sgml \ + version.xml \ + glib-gettextize.xml \ + gtester.xml \ + gtester-report.xml \ + gvariant-varargs.xml + + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS = +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(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) +DOC_STAMPS = scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + pdf-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \ + $(srcdir)/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 + +######################################################################## +man_MANS = \ + glib-gettextize.1 \ + gtester.1 \ + gtester-report.1 + +BUILT_EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu docs/reference/glib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/reference/glib/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): +version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(MANS) all-local +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-man + +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-man1 + +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 uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am all-local check check-am check-local 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-man1 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 uninstall-man uninstall-man1 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +@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 + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + 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: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + @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 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(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 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/html + @mkdir $(srcdir)/html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options=--path="$(srcdir)"; \ + fi; \ + cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + @cd $(srcdir) && 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 'gtk-doc: Building PDF' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/$(DOC_MODULE).pdf + @mkpdf_imgdirs=""; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +distclean-local: + cd $(srcdir) && \ + rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html + +install-data-local: + @installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- 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 '-- Installing '$$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; \ + mv -f $${installdir}/$(DOC_MODULE).devhelp \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \ + 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 $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + cp $(srcdir)/html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +@ENABLE_MAN_TRUE@%.1 : %.xml +@ENABLE_MAN_TRUE@ @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +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/glib/building.sgml b/docs/reference/glib/building.sgml new file mode 100644 index 0000000..a49a4d6 --- /dev/null +++ b/docs/reference/glib/building.sgml @@ -0,0 +1,585 @@ + + + + +Compiling the GLib package +3 +GLib Library + + + +Compiling the GLib Package + +How to compile GLib itself + + + + + Building the Library on UNIX + + On UNIX, GLib 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. The normal sequence for + compiling and installing the GLib library is thus: + + + ./configure + make + make install + + + + + The standard options provided by GNU + autoconf may be passed to the + configure script. Please see the + autoconf documentation or run + ./configure --help for information about + the standard options. + + + The GTK+ documentation contains + further details + about the build process and ways to influence it. + + + + Dependencies + + Before you can compile the GLib 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 GLib + 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 GLib library. (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 GLib is mirrored in the + dependencies directory + on the GTK+ FTP + site. + + + + + The GTK+ makefiles will mostly work with different versions + of make, however, there tends to be + a few incompatibilities, so the GTK+ 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.) + + + + + GLib depends on a number of other libraries. + + + + + The GNU + libiconv library is needed to build GLib if your + system doesn't have the iconv() + function for doing conversion between character + encodings. Most modern systems should have + iconv(), however many older systems lack + an iconv() implementation. On such systems, + you must install the libiconv library. This can be found at: + http://www.gnu.org/software/libiconv. + + + If your system has an iconv() implementation but + you want to use libiconv instead, you can pass the + --with-libiconv option to configure. This forces + libiconv to be used. + + + Note that if you have libiconv installed in your default include + search path (for instance, in /usr/local/), but + don't enable it, you will get an error while compiling GLib because + the iconv.h that libiconv installs hides the + system iconv. + + + If you are using the native iconv implementation on Solaris + instead of libiconv, you'll need to make sure that you have + the converters between locale encodings and UTF-8 installed. + At a minimum you'll need the SUNWuiu8 package. You probably + should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and + SUNWkiu8 packages. + + + The native iconv on Compaq Tru64 doesn't contain support for + UTF-8, so you'll need to use GNU libiconv instead. (When + using GNU libiconv for GLib, you'll need to use GNU libiconv + for GNU gettext as well.) This probably applies to related + operating systems as well. + + + + + The libintl library from the GNU gettext + package is needed if your system doesn't have the + gettext() functionality for handling + message translation databases. + + + + + A thread implementation is needed, unless you want to compile GLib + without thread support, which is not recommended. The thread support + in GLib can be based upon several native thread implementations, + e.g. POSIX threads, DCE threads or Solaris threads. + + + + + GRegex uses the PCRE library + for regular expression matching. The default is to use the internal + version of PCRE that is patched to use GLib for memory management + and Unicode handling. If you prefer to use the system-supplied PCRE + library you can pass the --with-pcre=system option to configure, + but it is not recommended. + + + + + The optional extended attribute support in GIO requires the + getxattr() family of functions that may be provided by glibc or + by the standalone libattr library. To build GLib without extended + attribute support, use the + configure option. + + + + + The optional SELinux support in GIO requires libselinux. To build + GLib without SELinux support, use the + configure option. + + + + + + + Extra Configuration Options + + + In addition to the normal options, the + configure script in the GLib + library supports these additional arguments: + + + configure + + --enable-debug=[no|minimum|yes] + + + --disable-gc-friendly + --enable-gc-friendly + + + --disable-mem-pools + --enable-mem-pools + + + --disable-threads + --enable-threads + + + --with-threads=[none|posix|dce|win32] + + + --disable-regex + --enable-regex + + + --with-pcre=[internal|system] + + + --disable-included-printf + --enable-included-printf + + + --disable-visibility + --enable-visibility + + + --disable-gtk-doc + --enable-gtk-doc + + + --disable-man + --enable-man + + + --disable-xattr + --enable-xattr + + + --disable-selinux + --enable-selinux + + + --with-runtime-libdir=RELPATH + + + + + + <systemitem>--enable-debug</systemitem> + + + Turns on various amounts of debugging support. Setting this to 'no' + disables g_assert(), g_return_if_fail(), g_return_val_if_fail() and + all cast checks between different object types. Setting it to 'minimum' disables only cast checks. Setting it to 'yes' enables + runtime debugging. + The default is 'minimum'. + Note that 'no' is fast, but dangerous as it tends to destabilize + even mostly bug-free software by changing the effect of many bugs + from simple warnings into fatal crashes. Thus + should not + be used for stable releases of GLib. + + + + + <systemitem>--disable-gc-friendly</systemitem> and + <systemitem>--enable-gc-friendly</systemitem> + + + By default, and with --disable-gc-friendly + as well, Glib does not clear the memory for certain objects before they + are freed. For example, Glib may decide to recycle GList nodes by + putting them in a free list. However, memory profiling and debugging tools like Valgrind work better if an + application does not keep dangling pointers to freed memory (even + though these pointers are no longer dereferenced), or invalid pointers inside + uninitialized memory. The + --enable-gc-friendly option makes Glib clear + memory in these situations: + + + + + + + When shrinking a GArray, Glib will clear the memory no longer + available in the array: shrink an array from 10 bytes to 7, and + the last 3 bytes will be cleared. This includes removals of single and multiple elements. + + + + + + + + + When growing a GArray, Glib will clear the new chunk of memory. + Grow an array from 7 bytes to 10 bytes, and the last 3 bytes will be cleared. + + + + + The above applies to GPtrArray as well. + + + + + When freeing a node from a GHashTable, Glib will first clear + the node, which used to have pointers to the key and the value + stored at that node. + + + + + When destroying or removing a GTree node, Glib will clear the node, + which used to have pointers to the node's value, and the left and right subnodes. + + + + + + Since clearing the memory has a cost, + --disable-gc-friendly is the default. + + + + <systemitem>--disable-mem-pools</systemitem> and + <systemitem>--enable-mem-pools</systemitem> + + + Many small chunks of memory are often allocated via collective pools + in GLib and are cached after release to speed up reallocations. + For sparse memory systems this behaviour is often inferior, so + memory pools can be disabled to avoid excessive caching and force + atomic maintenance of chunks through the g_malloc() + and g_free() functions. Code currently affected by + this: + + + + GList, GSList, + GNode, GHash + allocations. The functions g_list_push_allocator(), + g_list_pop_allocator(), g_slist_push_allocator(), + g_slist_pop_allocator(), g_node_push_allocator() and + g_node_pop_allocator() are not available + + + + + GMemChunks become basically non-effective + + + + + GSignal disables all caching (potentially + very slow) + + + + + GType doesn't honour the + GTypeInfo + n_preallocs field anymore + + + + + the GBSearchArray flag + G_BSEARCH_ALIGN_POWER2 becomes non-functional + + + + + + + + <systemitem>--disable-threads</systemitem> and + <systemitem>--enable-threads</systemitem> + + + Do not compile GLib to be multi thread safe. GLib + will be slightly faster then. This is however not + recommended, as many programs rely on GLib being + multi thread safe. + + + + + <systemitem>--with-threads</systemitem> + + + Specify a thread implementation to use. + + + 'posix' and 'dce' can be used interchangeable + to mean the different versions of Posix + threads. configure tries to find out, which + one is installed. + + + + 'none' means that GLib will be thread safe, + but does not have a default thread + implementation. This has to be supplied to + g_thread_init() by the programmer. + + + + + + + + <systemitem>--disable-regex</systemitem> and + <systemitem>--enable-regex</systemitem> + + + Do not compile GLib with regular expression support. + GLib will be smaller because it will not need the + PCRE library. This is however not recommended, as + programs may need GRegex. + + + + + <systemitem>--with-pcre</systemitem> + + + Specify whether to use the internal or the system-supplied + PCRE library. + + + 'internal' means that GRegex will be compiled to use + the internal PCRE library. + + + + 'system' means that GRegex will be compiled to use + the system-supplied PCRE library. + + + Using the internal PCRE is the preferred solution: + + + + System-supplied PCRE has a separated copy of the big tables + used for Unicode handling. + + + + + Some systems have PCRE libraries compiled without some needed + features, such as UTF-8 and Unicode support. + + + + + PCRE uses some global variables for memory management and + other features. In the rare case of a program using both + GRegex and PCRE (maybe indirectly through a library), + this variables could lead to problems when they are modified. + + + + + + + + <systemitem>--disable-included-printf</systemitem> and + <systemitem>--enable-included-printf</systemitem> + + + By default the configure script will try + to auto-detect whether the C library provides a suitable set + of printf() functions. In detail, + configure checks that the semantics of + snprintf() are as specified by C99 and + that positional parameters as specified in the Single Unix + Specification are supported. If this not the case, GLib will + include an implementation of the printf() + family. + These options can be used to explicitly control whether + an implementation fo the printf() family + should be included or not. + + + + + <systemitem>--disable-visibility</systemitem> and + <systemitem>--enable-visibility</systemitem> + + + By default, GLib uses ELF visibility attributes to optimize + PLT table entries if the compiler supports ELF visibility + attributes. A side-effect of the way in which this is currently + implemented is that any header change forces a full + recompilation, and missing includes may go unnoticed. + Therefore, it makes sense to turn this feature off while + doing GLib development, even if the compiler supports ELF + visibility attributes. The + option allows to do that. + + + + + <systemitem>--disable-gtk-doc</systemitem> and + <systemitem>--enable-gtk-doc</systemitem> + + + By default the configure script will try + to auto-detect whether the + gtk-doc package is installed. If + it is, then it will use it to extract and build the + documentation for the GLib library. These options + can be used to explicitly control whether + gtk-doc should be + used or not. If it is not used, the distributed, + pre-generated HTML files will be installed instead of + building them on your machine. + + + + + <systemitem>--disable-man</systemitem> and + <systemitem>--enable-man</systemitem> + + + By default the configure script will try + to auto-detect whether xsltproc + and the necessary Docbook stylesheets are installed. If + they are, then it will use them to rebuild the included + man pages from the XML sources. These options can be used + to explicitly control whether man pages should be rebuilt + used or not. The distribution includes pre-generated man + pages. + + + + + <systemitem>--disable-xattr</systemitem> and + <systemitem>--enable-xattr</systemitem> + + + By default the configure script will try + to auto-detect whether the getxattr() family of functions + is available. If it is, then extended attribute support + will be included in GIO. These options can be used to + explicitly control whether extended attribute support + should be included or not. getxattr() and friends can + be provided by glibc or by the standalone libattr library. + + + + + <systemitem>--disable-selinux</systemitem> and + <systemitem>--enable-selinux</systemitem> + + + By default the configure script will + auto-detect if libselinux is available and include + SELinux support in GIO if it is. These options can be + used to explicitly control whether SELinux support should + be included. + + + + + <systemitem>--with-runtime-libdir=RELPATH</systemitem> + + + Allows specifying a relative path to where to install the runtime + libraries (meaning library files used for running, not developing, + GLib applications). This can be used in operating system setups where + programs using GLib needs to run before e.g. /usr + is mounted. + For example, if LIBDIR is /usr/lib and + ../../lib is passed to + --with-runtime-libdir then the + runtime libraries are installed into /lib rather + than /usr/lib. + + + + + + diff --git a/docs/reference/glib/changes.sgml b/docs/reference/glib/changes.sgml new file mode 100644 index 0000000..c64ffc2 --- /dev/null +++ b/docs/reference/glib/changes.sgml @@ -0,0 +1,182 @@ + + + + +Changes to GLib +3 +Changes to GLib + + + +Changes to GLib + +Incompatible changes made between successing versions of GLib + + + + + +Incompatible changes from 2.0 to 2.2 + + + + + +GLib changed the seeding algorithm for the pseudo-random number +generator Mersenne Twister, as used by GRand +and GRandom. This was necessary, because some +seeds would yield very bad pseudo-random streams. Also the +pseudo-random integers generated by +g_rand*_int_range() will have a +slightly better equal distribution with the new version of GLib. + + + +Further information can be found at the website of the Mersenne +Twister random number generator at http://www.math.keio.ac.jp/~matumoto/emt.html. + + + +The original seeding and generation algorithms, as found in GLib +2.0.x, can be used instead of the new ones by setting the environment +variable G_RANDOM_VERSION to the value of '2.0'. Use +the GLib-2.0 algorithms only if you have sequences of numbers generated +with Glib-2.0 that you need to reproduce exactly. + + + + + + + + + +Incompatible changes from 1.2 to 2.0 + + +The GNOME 2.0 +porting guide on http://developer.gnome.org +has some more detailed discussion of porting from 1.2 to 2.0. +See the section on GLib. + + + + + + +The event loop functionality GMain has extensively +been revised to support multiple separate main loops in separate threads. +All sources (timeouts, idle functions, etc.) are associated with a +GMainContext. + + + +Compatibility functions exist so that most application code dealing with +the main loop will continue to work. However, code that creates new custom +types of sources will require modification. + + + +The main changes here are: + + + + + + Sources are now exposed as GSource *, rather than simply as + numeric ids. + + + + + + New types of sources are created by structure "derivation" from + GSource, so the source_data + parameter to the GSource virtual functions has been + replaced with a GSource *. + + + + + + Sources are first created, then later added to a specific + GMainContext. + + + + + + Dispatching has been modified so both the callback and data are passed + in to the dispatch() virtual function. + + + + + To go along with this change, the vtable for + GIOChannel has changed and + add_watch() has been replaced by + create_watch(). + + + + + +g_list_foreach() and +g_slist_foreach() have been changed so they +are now safe against removal of the current item, not the next item. + + + +It's not recommended to mutate the list in the callback to these +functions in any case. + + + + + +GDate now works in UTF-8, not in the current locale. +If you want to use it with the encoding of the locale, you need to convert +strings using g_locale_to_utf8() first. + + + + + +g_strsplit() has been fixed to: + + + + + include trailing empty tokens, rather than stripping them + + + + + split into a maximum of max_tokens tokens, rather + than max_tokens + 1 + + + + + Code depending on either of these bugs will need to be fixed. + + + + + +Deprecated functions that got removed: +g_set_error_handler(), +g_set_warning_handler(), +g_set_message_handler(), use +g_log_set_handler() instead. + + + + + + + diff --git a/docs/reference/glib/compiling.sgml b/docs/reference/glib/compiling.sgml new file mode 100644 index 0000000..b12197d --- /dev/null +++ b/docs/reference/glib/compiling.sgml @@ -0,0 +1,97 @@ + + + + +Compiling GLib Applications +3 +GLib Library + + + +Compiling GLib Applications + +How to compile your GLib application + + + + +Compiling GLib Applications on UNIX + + +To compile a GLib application, you need to tell the compiler where to +find the GLib header files and libraries. This is done with the +pkg-config utility. + + +The following interactive shell session demonstrates how +pkg-config is used (the actual output on +your system may be different): + +$ pkg-config --cflags glib-2.0 + -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include +$ pkg-config --libs glib-2.0 + -L/usr/lib -lm -lglib-2.0 + + + +If your application uses threads or GObject +features, it must be compiled and linked with the options returned by the +following pkg-config invocations: + +$ pkg-config --cflags --libs gthread-2.0 +$ pkg-config --cflags --libs gobject-2.0 + + + +If your application uses modules, it must be compiled and linked with the options +returned by one of the following pkg-config invocations: + +$ pkg-config --cflags --libs gmodule-no-export-2.0 +$ pkg-config --cflags --libs gmodule-2.0 + +The difference between the two is that gmodule-2.0 adds +to the linker flags, which is often not needed. + + +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 GLib Hello, World, you would type the following: + +$ cc `pkg-config --cflags --libs glib-2.0` hello.c -o hello + + + + +If you want to make sure that your program doesn't use any deprecated +functions, you can define the preprocessor symbol G_DISABLE_DEPRECATED +by using the command line option -DG_DISABLE_DEPRECATED=1. + + + +The recommended way of using GLib has always been to only include the +toplevel headers glib.h, +glib-object.h, gio.h. +Still, there are some exceptions; these headers have to be included separately: +gmodule.h, +glib/gi18n-lib.h or glib/gi18n.h (see +the Internationalization section), +glib/gprintf.h and glib/gstdio.h +(we don't want to pull in all of stdio). + + + +Starting with 2.17, GLib enforces this by generating an error +when individual headers are directly included. To help with the +transition, the enforcement is not turned on by default for GLib +headers (it is turned on for GObject and GIO). +To turn it on, define the preprocessor symbol G_DISABLE_SINGLE_INCLUDES +by using the command line option -DG_DISABLE_SINGLE_INCLUDES. + + + + + diff --git a/docs/reference/glib/cross.sgml b/docs/reference/glib/cross.sgml new file mode 100644 index 0000000..40c0a1f --- /dev/null +++ b/docs/reference/glib/cross.sgml @@ -0,0 +1,199 @@ + + + + +Cross-compiling the GLib package +3 +GLib Library + + + +Cross-compiling the GLib Package + +How to cross-compile GLib + + + + + Building the Library for a different architecture + + Cross-compilation is the process of compiling a program or + library on a different architecture or operating system then + it will be run upon. GLib is slightly more difficult to + cross-compile than many packages because much of GLib is + about hiding differences between different systems. + + + These notes cover things specific to cross-compiling GLib; + for general information about cross-compilation, see the + autoconf info pages. + + + GLib tries to detect as much information as possible about + the target system by compiling and linking programs without + actually running anything; however, some information GLib + needs is not available this way. This information needs + to be provided to the configure script via a "cache file" + or by setting the cache variables in your environment. + + + As an example of using a cache file, to cross compile for + the "MingW32" Win32 runtine environment on a Linux system, + create a file 'win32.cache' with the following contents: + + +glib_cv_long_long_format=I64 +glib_cv_stack_grows=no + + + Then execute the following commands: + + +PATH=/path/to/mingw32-compiler/bin:$PATH +chmod a-w win32.cache # prevent configure from changing it +./configure --cache-file=win32.cache --host=mingw32 + + + The complete list of cache file variables follows. Most + of these won't need to be set in most cases. + + + + Cache file variables + + glib_cv_long_long_format=[ll/q/I64] + + + Format used by printf() and + scanf() for 64 bit integers. "ll" is + the C99 standard, and what is used by the 'trio' library + that GLib builds if your printf() is + insufficiently capable. + Doesn't need to be set if you are compiling using trio. + + + + glib_cv_stack_grows=[yes/no] + + + Whether the stack grows up or down. Most places will want "no", + A few architectures, such as PA-RISC need "yes". + + + + glib_cv_working_bcopy=[yes/no] + + + Whether your bcopy() can handle overlapping + copies. Only needs to be set if you don't have + memmove(). (Very unlikely) + + + + glib_cv_sane_realloc=[yes/np] + + + Whether your realloc() conforms to ANSI C + and can handle NULL as the first argument. + Defaults to "yes" and probably doesn't need to be set. + + + + glib_cv_have_strlcpy=[yes/no] + + + Whether you have strlcpy() that matches + OpenBSD. Defaults to "no", which is safe, since GLib uses a + built-in version in that case. + + + + glib_cv_va_val_copy=[yes/no] + + + Whether va_list can be copied as a pointer. If set + to "no", then memcopy() will be used. Only + matters if you don't have va_copy() or + __va_copy(). (So, doesn't matter for GCC.) + Defaults to "yes" which is slightly more common than "no". + + + + glib_cv_rtldglobal_broken=[yes/no] + + + Whether you have a bug found in OSF/1 v5.0. Defaults to "no". + + + + glib_cv_uscore=[yes/no] + + + Whether an underscore needs to be prepended to symbols when + looking them up via dlsym(). Only needs to + be set if your system uses + dlopen()/dlsym(). + + + + ac_cv_func_posix_getpwuid_r=[yes/no] + + + Whether you have a getpwuid_r function (in your C library, + not your thread library) that conforms to the POSIX spec. + (Takes a 'struct passwd **' as the final argument) + + + + ac_cv_func_nonposix_getpwuid_r=[yes/no] + + + Whether you have some variant of getpwuid_r() + that doesn't conform to to the POSIX spec, but GLib might be able + to use (or might segfault.) Only needs to be set if + ac_cv_func_posix_getpwuid_r is not set. It's + safest to set this to "no". + + + + ac_cv_func_posix_getgrgid_r=[yes/no] + + + Whether you have a getgrgid_r function that conforms to + the POSIX spec. + + + + glib_cv_use_pid_surrogate=[yes/no] + + + Whether to use a setpriority() on the PID of + the thread as a method for setting the priority of threads. This + only needs to be set when using POSIX threads. + + + + ac_cv_func_printf_unix98=[yes/no] + + + Whether your printf() family supports Unix98 + style %N$ positional parameters. Defaults to + "no". + + + + ac_cv_func_vsnprintf_c99=[yes/no] + + + Whether you have a vsnprintf() with C99 + semantics. (C99 semantics means returning the number of bytes + that would have been written had the output buffer had enough + space.) Defaults to "no". + + + + + + diff --git a/docs/reference/glib/file-name-encodings.png b/docs/reference/glib/file-name-encodings.png new file mode 100644 index 0000000000000000000000000000000000000000..7adbcea393fc43286f09cbaa8ab507f19d4eb50c GIT binary patch literal 32141 zcmb@ubx>SQ6fZ~&NFcataCi4)fZ*;P+}%9{2!S9WxQ7tjA-F?ucXuD$ZGdgQ_f~56 zZPos~5WIndgL^9_DW(hu_v{M%3rBnoj!2&RIKjca zgOd{bpz1NVzv%uRbNdnDn5K@AUGm*)ihZUElfECn)!TwyS)h4y^~H0BEpt=a=5bb4 z*b>Fwp9|MW-t}OZ(&}6;5kh)~j-rmgqhpmD+!c=u@0D)UZ8IlqGaoGo)i}Hfe*O#& z4)53T$V+flI#lqcOak8i2tEzM6TJO61#e#B9vYbR%*?{BP%KVbI5=A0yMr3MulHwX znI014c)Hzscp0_I_X4HdgZPA*^E{idjZ>HgRaSu+#`r||2 zi~q;@-)(|XG$OsUcz#^XADpI9qEGhooAG@&`wp_Hp_HW*EXyMv$J(dW!-5>{-Dca} z4z#K;Q~|?)$7MgU+^++M25FaHogJy<& zef8>9F--mW$C0rqb`G}6vI;yKu0+Xq4{~x!YI<=$qaoxm&tcC$b%I;|^f|AnM0Qw~ z2IHIRTY8j`J?_87#d0^#L%Pc~8Q&(ulRREsUUPAA5sSDBvXf)1qNxQ+Q^%k~_=cUy zNyW%tRa93$m`=0!k4tRhZjcIi$;!weDU-bK3k>L*>G2o~k}`Qy=Utaye)=j-TCdrJ z?_+CX@<59{_cbvLDS<^W+^=WC#0&WX&qhcyCO`ju*i`&fSV0){}YmAv>SfruU|rdLwJtf6tE&WMx2=f351ZK|L!Y~ON=6XKs=Dn%Vb zEaD8CyRbeaIV?;lH5*GJkEW#&*?tJT<4fYZkh^fAG-t&VBpDtYwcVd7*G|?(64q1H zFbF{_$S=m{u}pR1$9sKudd70^1B{4p)#)av@!CB|N!nMnp#HU)?AQmUtL zy70^WD(iPBAswp@Z|We7XcX%984ybJ1EPKM-xN+x&fuEi$l((qQxnr08(W|7xc@mK z#tg;wn!Jv}jLhI)nwa=gT4--?9o4-)FEGc@PhZ$qXk%lmORN`igWS*1(?8Tp9n&MM zFWk4g^4ddBPjAvB%Q$N|C@sG*e|`7VrpWfkb2U}9R3Ue6DlXH`pV($yX3(>DJ6Nfx zLZrlmgQm_A;o(+$R_i2PT&i3}y3G}3wa5Qg#VSJ2Q6o zpdIutpYFRbr+Q0wrfyqnxGBWTpL3OhJ0zm}I4vzL8a-O0#DLHHu&64os(HvdFg(B0 z#Ih1h7PDRx7AM2E;z7TI$7k(YiCT$C$)={}R8&;1GB;xtV?Qe}2qLytp#f-X?#K2E zjiVzYE2JwTmJ5{habX>+Vn#{`Efl4+3Nk84WSr((skPU&jg5kGU$=gW%czoO3Btak z_4W1g6MDrjcV%!}CTEnAM#zgIPEJni)jE)I30*AQIPbOSmOdb;tLRW9^llHO@9l5M zwjy#xaJ7(JbJe`#*;m%I`%n^BHTka`lTR1rXV$`(g&)hJ${E?zIn?sViQiV)G^3w( zL-$XWm|O(8BX!;d`|H!;_;Jf~VRNGqCfnzO3Cn2TSf>6)1q$0)+Iyni zue3EGd>}<=vU?L)1Rp`bM=vM{8)_0jN2RbSwk<9$8k8IKycI-A=`gC8$QW)N-SVjQ zHrY0z$)>)!y>*(^HT5(%H#hPzqG@rSs8#ACA&HiZHHeL3<+Pq-6e>x-rJ2*5r!}A* z-fkl!0)fZV=Xct&-wCucCnpDA#cUv*jWEjfqHt#y%Ep!CeR(7`Ea{(oI?EkZ-+4+B(_|yba-}gxL$<)K48Qt~p@CKP!H=|Ae5V1d8$o zDLTtI_f=wrfAeMC4=jnq6-<}TuCA&P>i6MxnvukaKCeDdQBqP;(-+Sj4M8C;2)i!1 z=4NH(WM^bzVxpy2RPdDhnvm|n_!-3pk!k+XP@=)+iqr&~K#I};0UW6=lU==zD zv+l#~3r3?baRLGYXs{|ll@8v8Jb83%Z2Y^R_Rd6MmSZlO8H4E3R*uKLIL%0P}J zv5$z^CVx0dqzeSwIV)d*EQ5j2!9jwg}OKyRRqQac6>r`Ryk|-uj=aR%Gsh0 zRmE`P{j;4RCaxANMsI0j=d&9XlbKnZU91lwQwAB-+&niaU#o_$4BsZ`$NP6b`ZvqC zpM!vZs6>k;D%znx^k?5VN=`)v6Cz0-e=Kmls38#k$;_(DsA8${i_yy$=>cHw^Uf4a zrQGZ;J7sWHGO|C4gmbfTCvh77bgCo{>4+c|cyNTRCk7>+tat70?z|Rn|K^SU^0{Hq z5u%zw%-647G^GB&d&gwGex7q4>}JtKVZ90F*73eBTYboaMMQ)z^U8dY5BR0>{vDba zBwCa4kUO^1q&$()_8@^>@5T6zTO2;hYHaSv2;HJUTPzng#;c;Rr&ZSNfJkA)9?EE; z{-e0~fT0jpg+Pj0jSuUEDJ1KpoSmMsXPCo>qx|}ruebP4u=0a?;8^82M+F|UG zL+w0Rz?GbwTzYun<*9%OGAHZEC%mpz2dhGBfq%sH{Pjm}Yw)-59|f}-8yn^Qa^JsG z%odE3c6E1G7?z3(3nf_PA*Z9tR~gxbu2~t`jQL(3CuRp{gC9w9D@#kMepvxhH(?$Y z9yT^dkafKuUEtF`WR03QB@xm1ZyUV*?2f|R0OybNCYar%2Q5fZ)g|`*yK5vBwC|ll zccQU#*S4T02|^2nkVi{F{h1;oBdNQnL8ZcTv@kH#N3GJ6uAfd2J8h>G6KbMYav0Jf z@|W0z;pex$g8q6xJUo(+RWt~@=auNMuV25y!^0C36Tgna(B}z(1H0f^q!{Im$F&1* z>KE7-84c#Dzkl;kvBQGvUe&piAD*)ZH^Le@GR?=>$N2>WCi~}K9k^2*ZEbF&BfiAM z#H{a!Jvx26o)n9pyo-EEx%uGy(wIa?H zl{~o62TN0_P+^3gl54u&^52RseqD2@O-xM83sJ%d-N^R;6S|LY(pT(Rj&@eRgh+30JlFv``{Zyu7@WL;sdHv(d2R=2U-VPKd(i+HzINv(CE% zQ6;e!Pl#B^_=Pc(9uxUT8#}w9{$U0trp>dP9O|5PVWQ~+Za6IV&dFXbGU3dE`Zr`7 zt81B3{`q^2AeycmKPzFLHvAD7T^o~T)u%OGIcDOt0+DwtsF|}op5Fek; z>)bv#8W7OYbz_k z1;K^1MMJKqD)JpgOz$|291k03ox=sh)z#I`uSAm^tUgNeQ2A^QPJDSc`KE9?J0oFO z;Ho&4ICdPi=POU6P)+6-635I;2M8kLaS{Hl+i`v#n(xEF%B1nlO<$36fV~~=Pa&&Zj z6AZZ*=0=8J|2}D;siW2XuhYcDR8ZQBGNz9enIfjgg&?he6{Q*fGD`D{^O;x}>@BQzc6NS9Qc+@r7It#6v$J!utEQtrhPft7 zva)m1Gt#<{tPL1C*S|F_*Gy?y)YVqfR#TfCn<9_t%`>4_$S^lG&F&miF6Fb@pv8O< z)4tYTeaT%X8`*sfm2jjp>6?hkK{+E(Pt?$yRHQE!SC4vu-%mouQf6Intb>bSl?}s}sQB_qPNanJhueSB`^BW=X$J|LkfP)z`>(yhClD4=VXj{Ai zn6UM|ilU;!O6#*AML)mh(^pTIMJBSdvjbrZkxV$F#c8w8db;F8%6owH;J<;q7%lln z-{}E%V@LIbE=QtN^l7m!)9?QK<&pNzyuG8t8^y`lnSqfpi24gS-MMi=V2Mzhp(eQ8 z`<5EB!DRif`i&lJWMt2@Uq79K#nj9!=g*&W<;>r|$@%%U>Ej?ePr&jv>EFM9yW_cM zH?XBb+l5*-O3IhX0D8fVJSsojoNfE&d!BAcS(LcHN+*8~cWnUD2O=sesjyG&sjZor znW$)>*DG&tZL_-( z#s6_2iNhP^&Fj|zV4A=|ZyWCU;o+#ZPkFf7nwrQJre^7J&B%^3dgYcLqU6+CX6nTx$?bOrmz6bsAjt@~(h{ANG&?f#OW(-eet6a4m+Ajt z5neqlS~$rY|H2D{(&aM44h95QH#a}dlPn}$W)}w3*RNkEW1iy*@6A@4f5%}0AxAY% zGJ8yf<+09faPBoGbvUtz+d2;+5|RNjQz@fCmDl7w!j&Ogz_Xm%T92hhPyAi{f}hFI zWP_^*e)FkR)O!)#3X|Rr1k`Mdd@BnT=W&1Thi%;%zB*l$Vg$NJx3TeY4t92ZK1qNp zy1O-0Rb3eDZ7qxQi#_L2Ft2>IsKm9H>cX+*`R-@G5;_SjZ z^;(l};{9^#NUOtMPO*NSeWR1 zZ})fS{YE0Jc?JdtGblxrSYoBKO*>7=GbJ+>drVKeL!;#6WD}V63JQKi$FcRejntiO zf07D#M#0QI)Yk{ST%3mn`#;>6D@*^>Bv+@!%FfPS?~a;Y-IsyP1OpRumhtkp`1g;Ic(cqFk08hE@Yq#VRe5@Om1tIc z$r^XPZqCeHovX4wDL_p@?Crlj4F)E==q5_ zrc~$H$XRA)f~adP|92b~C^rp*ut9WMdIZ|q?%7bfz`U)6j}I)8Sm1Jh)_L!+xaXT> z>T@2`x!AhOZ6h&RTCAly|B(Jo6i0&J!T?=;%+WL7SwH6WM)0Oj)1KDMEnw~O8hMxU zVO67pMlSWwhsn=!ILCI_IN0gJez#J6nEYuZE2OOUOM>K~-_Ypk>9xy^I&(Ap2rw~Y zG=6OJ|GU^@X)!C)PYqI6R>yFnr4(XH`w4~9Rkpu67VpJy7nSD1)3UT^kZlrajyMKFYFeR=kPM29j%fiYC zx_aoiITqK6gfouEspWb8qVjj}t;8 zA|kFH{_-4HCPM?o$VZ3t1X{Eou|qmW-&y-K!<+-&{}QG#e%>{ZA(A0WE#e2O-S*+; zW=+0YL0Cn%ldeFqyCnK~HwCa|`l-8Rvg}eSPM`=~UE|evkK8 z?D;lR16l2IWCO$a7!BCw(%0BJ2s-p}w~JTHOga^^BV_Lp zPi|lc(WvT0x}&PgCU$my!soDsSI+bE^XL%34zcsIf0BLgBik4gh#AwXTjRD^olzYs zMjoUnE-voka&9goQfQxFQ(pF3fVA4{!0Liz==SSv-cBB>kH{}219_`d?W-I`MKzty zPplsGf){eXm9jp@B_xPQ`@HP8`*kr>WYCf>Mpmp<^Re!3s_iJRxa4gET25A}^Zqp( z$c;Z3NT>uW{{DsCUoFRFadPp*#mD!VI&IE-*BtHcLiO&?3M46$xozhVnn|&6u^BeP zyxk8^JOtIE$ou&d zBN##!)7vN0Ph}Je$@I8BCR508Uu_T8@M|OWyKbA9i0xQqtxD9Xwu_d|hKd@m8`bF^ z#xZDos=;d1G4MaBiijBO*a>l})1}0Eb@Yato4eWjssxfLDI+6_IG8G=(u&(-QXvxg zU}$24nw6hl6v&QoHz4&?T7yhzW5{Q@yhKfOWH=u_F9pj# z2T2>&4y(SbuK&uPuX?*PNYFayo@v=Boo@8veI+AG=Jq6L zU$PT6Rh|t~&;U5*UC^;dV`h0~g+N|YQ&V~Vi7RT}n>TOx-S%fnR`gKhQF!c@^YT4+ zM@phIm8^BFMO9wdlzw(+SThV7N25WYK_EhrAdjJzOQFPi9itqh+60H$CI3s2&O^`- zc6|bvQVNb2WD_$pc%--@-nTXsq7h#?d%HLvgWxH6B$u$2-;yh~+RcP3EKKIq{SGpGKAstuzVZ%q&f3D|G?S*J%VcU|;zY zZ^Oid4$-&M4~Thwb+||fN=^dlY-O+pHEF-9;Wz34ZhnbmNjq6jA{ zEH&1fd;(Q9Ust)eat6NlYL;5N_AU2YQ0Sa(9>B-4^n3d|L8d%#D*B#cc{=HH^Ycdw z<(N@TGvuEtXA#NDH5)zq&75V<2AA!tt179YB`>Nj;Je`2>yXLB0H`$z)n)EpKamU& zGeVckD)j&H8C_EBrz9;Dy8Dws%xHAJiYxkaM~l%S_)EY%!7h1H(JT!uKV&L`Cmp>e z&SPq=!w@R_+d}b^8vGGXgmetxd-7x7lfMhPel84Z&L0g^ocXf!F@3S6o#bpJQMo^8 z5y=F<=Ki4TPhh?xT+J2c^7g(HzW<2$l0R*!?MRUpYw=5Sak1?%i?@-H@g@8b@s>c* zb}eAJ@t$Rku8!=zm%T~XP18GCY%w>pGBY!rYMK|LmKm1M;PcK|N0ZpJicL(MsX`4~ z9b_D!?`L>L{G2~fUrlFnY~lCd#Niygp%ruox*;-rb$Rj;5gQA)v5?8)E464!mY$aS ztanvd!5a|2q^4C_is(y?EGueln2Y*W7AvYMK;=|wn+I0jyC8OUj&EYWLzSlGD^ zRRc(Iysw*E+ZeCKOu69G3~f!B5_)}oeCjXq&R>ZK{>~~@QPZMI=#OjSr|(uE7V&?8 zO&jMB6U=>vOY|$?4Es^y=PGN+da)rDAj)$c7N2Wv&rVx(HWuZ>FLQUD444? zr1)wWSsjV)PNA!(JFDwvr+*lk;pSqif+^)3xJ7b(@Hw|8HzsC$_RO52k6}P=uz}yF zs7T^EVy4Oc>Q`GJfOA_1DQvLsRb~14`9S@t>m-X0laZE2gD^7TeDC#IUm(CIn4Oyu z{^rfPx2^@a{#MPM9Uu z-2N}H8_1(;Pv#>;4q%p}YvQs@)WKq}lSyLZlfR+?f$4H!_Ep`hW&7Lo5-A=Ij`8tH z6}gy>)gsMmqqD8S%0RPmd>3yC?+d@1k&%(_xGdyBAVxw7_e5?sFoQS`AoomChyVtW4I>dDUS8%snH3-}s6De9k#>eqT? zW@S+@GVTNNq@cZUy0o6JA^(zT&3KK8iSfYZ;M1(@_|cJ+768pUI(wU&la=N<)z#Gn z1qGrbAIN`d%Eo6#XPzFmVU+)AEYkI4)Yp-jpP1mJ6o ztehO`=K(7#Bd*z1kP=!328Kdf3XE?+t`H9v2h4Gw#CI$locM$U_Y?#UXAaEu5(9C- z2A^#Y1FgpLuf{oHmsqz?{l<8Q1S;wkaS6T6kwqzOp@p?AW>}CIMs&v(P-*f>gCwP; zlLg!l)0@1zB8U+R**&(eef%t?ELEH_1Ky7So`i!#CH?kidivq|f%Db?J|;&Dz^qL1 zQ=rO)PNTjNZ~wXWv#aZ4lI+K<(OTV-^mLL?u>w$0GBI78pR3wE0q=?2{7bjXxw*Ll z$BZ1|G#>w@98w;+6hS$)nKSNAL^5++^BiiG8^AdV(9&8Q)K{Ht4F$g98Bz9Yz4qDM z28Cou6w%>&oOjxnp^N3B(vtjUk5%%&B-aMYIk4dGxLuLNckZ(O+tq1GsK1%@oAY|d z_GNs_HDS)j!|oJ^OLeXizNm1>8zd5C%Lehzf3QZcrhn#})f$bU$RN0pEPh)LIRjr=zD2i;PrfNn$l@Uv6MU zv@hocmAcL(!irwzs6}&g^U<*VvsJW@t)J=|Q5Fn<-u{GKSDM`Srixjne3ex0*Yp)E z6~?P==GXyUk$lVf`G5BUe0F@c>~k+?=T_oH>MCzH)cESGBHjFn`Dnc>X)5*|uSp4y zh`2b{*WJQkWnNLfroxE+H@>-8>)X*iO#}T9Yn4}(%_S34b#Yg`cu0=&r1&4D75eLA ze|wqL9j@NO>vMN`kWi{CjO%q6CGx=Qv%{Lue}A)`5y#UYfoO<_!^yMbc)C7QJM(OT z-QgMq?pQm8+t$k7+MwQOH=06XY-}9){H?ITMO|g3v#5&bPUpy-`%(V}yNF23WWRb0 zSN)JtqtDH0eoU?^YEVT@r9qQX)oFmDsi`TC-NLts&|>?7X~Vsj^2n)zrWL0s7Pu_> zjlOr>5%PrvMcQ>frn*MDzzv|_KK%A^_C0wt8iehHEmt9fnU1cUwMMhip**E9#Vh$t z;2Ic8q4kHJVd1qGh9o}hkl6R6+~w(HSGx6(>Z#W}{QNF`UH_fJJm zS5B`AjfmHI&%gvDB_-vWUyv9%pBHRrBZ_)jZMv?ZE+H;%5GC1ned_H6$)&mFa7ATh zcO?G&{RUB$|Cjo%dTu{L0IsII9G?R$NOZB9ClN&w7njghEeN-=oL5&hJ3Z_U?m?Ei zGP_QkIfnFM-9brdwDiu8Sip>tB&5ar=2{qU_=(Ca@WM$EfhWCg~&| z&DWIvsTDI&5PA3R6G%(CizPaFBs2ai3HL2n8@ROgCOM^rEql3oxGcJ|((<>K+Y0c4 zfeWb%x%mnavf+Mr7d5*aIgfwWX{ckg40Kv-I-h_6o7aTJq^aU&_U7A*w?OGAy~DxC z-#A=sxOsKcCh{sqibYS*^vHtLjjX7=TY_ zIyEanBr8F|jas!tCJ2VGak84QX#p8i&R7np4VI3(KZ9jr&sw)CLcCCYW3MIYeNV2V zL9i3fDD~=5PzWAI@?X3vtckkX=#6Q33#jV?`yvg06KtFQ7jO^aF0L*Yo-EnsfM{1Y zn?l>hy}G7a`v#p(W6ujuM-9UG{x8#9)PLcUBCzcfD?T2{`q>Srt*Q6C2trTQEqFn( z+hK_JwfoounFU>jfRF&7QyRInKM#rT--dm?WeojCp08TqwWYwbNww*`HOR)zy;NhK zL0x&Lhnc5Zkf%Z!CrJjv$m2&LQg}$Va!5U@UXxeVEioeU+qd2s@}{PnB|;4!eRz!k zxAivs?YEakKDsd4MW2MVJP-kOYI6MGPSX}vy*9RX zFkh3B>@IG*mi4bW+``DFebvE2b?$hz!$3nKrBKd%1k_&ju5$qM9xOC*Tv%G|%qr%R z$(It<6f{aF6c+Z55asnh@wdlrQ$>1bCyh}xHuI-IFr-xt`z4A-h}&;e;ngBqK&>}E zFtdLe+z&J`6Lvl(ii2sK3U&!x&8WRbM1HsV(W31EE%ShxCj1H-`tyAx8y${83i_p>dG$EPwq|J=?|sy z0Y#?TZn40t`Bz-rWIjhOu$aW!cal3Q8;t=T*45Po0ebqxmp4uU(#M-5o>HYpC0F+1 z^0cI+04FRM3nO^Y?94+iYBHVQwIC%W1)5|5)FStzrK-xxEJa!l^TG4;)1t!C4%YCF zRp2SOxxSg1pQQ-OQOI~`Lm>UpyRq64V$kHJ=6UP}81KFwZg%duCTDjoEiC|LP*wrR z1dtr+9s}4}j-27^TM>g?^XvxxhJrr(<;G(E`a-d6r8=7usI9I~sw_3(fygb3;P=Ls z&v*STQ~wJE!td6iT>=zQfF~%bN2_r^ust}#8L0gGccIDp3eFDaDIg%DE&D#|X?tns zmQ_a4El*8t2@JU3p6|YB(0WRvFMJknHVsrVEnTUqB~cJXi`k95BGGkOFrB zo6SsF2r6lFO#Z3^Z}>6JaL>QhM{HExK=2syRIZ|SWGDMb(Up~?Qw~l>C!R<@V zr2qXwYWgVa;o&j-0ca(`!NDV9K;HT6C+j*=MZ=4X1UAvm)l`wzc>hzuOifAop5Z@5 zBYR+A07wV=^t7ZXB@cf^o?Lo6q<}94S#N0j%)7K27@vOpK(k=}PpFW&*&fcg%HHaY zp~VbdeuV3#31$8e}TfoVHP<-*`^70Z85f|K)lqNT)ng9eoT|I|1BhjH*x-=P_XL`O$=aBxsi zv$?ssNDoTZj}j7vOHRB*Kvc2dc~TZ0e0)=$7q)qsr&nfr28dS=G(eHTaO=>0Bb~yStv}J4z%` z)81VE{*Ps4tQO4wU1a^}=&>sn6%lb{dOD=~Klwri>OQnb$I9xkSnoO_{iF~)go%+4 zCUI=L2AU10zm0gdA!iNpMo2nz$_Ie6CK;MI&xbw&nhV4EV#-?Fmfi;Li{ z{}hdv{qand<>kBTMz*$ZnO=aelD@knTjy)W?MaDJs=~@N2>k5s~xwz^_k6N zX&*z(f?|(K8VefhO9tf$h zq#~_ugVlk|V+=10NTAfiiH!SLC67+`1G5}WA)XXL%)xqneLZu3UB}9g9b_8JeJRgY&3fn?3y8h92KGDZyc5nlU&N7s=*nHP zoTp!snaO6~)(GGz8YJ{}C{0ub?BVX{BBEX-3(Qw))7g2$(3wc!;KF7gFIK~c^R2BY6b5K&PfA;E2begiE)pZRZX;HRS>HQ2X^ zdH{~q=(jQWTrNUx+P{H>>^!6NVSH@t_k*J@^Hqb~GJ5Yn{bp}lxdYVY`;p?2?s@ae zg;~NW`yW!KNVqIS`>dK;%@5x%M0LLopm?3UtNbG&1uSydYS^;;I!Z~#-hAGk~%Wp?f+ggm*}~#eUA)75y1V5MsE2-7Fq7&%WwxbCv~}lo;C_lU=|FA z78dTog3m%J*H(XYXyI#NQp+Bb9+eWg@NPJW`gU~5>B;2gIIgm{sVOkUmfqNhpDtjg76G3KZY%^9|;F&6(JkC^zo5 z;;2#!mX*tqWR#YZ7f19&Jxgb`d=8P+!njuYRiG^)(S7fIm0>PanqQbC=v)DiFC?$L z`NR@B4()@64^p7B%hpqe3zO^+Wkt86f7hk!or>>*Ux{a@I>ugouJD#a2nrE-j)^}6ghh6>gg@6Uw8Ww z-FHNj%BOLuCDG9%%XL973eh2><)eW%@Wl^CTmk1eduLx>A;}iYP0AF|7otIkY=_dk z-Mb=5zoVC@8^6B(QnX)W*xXS8UL2J|O+s;-VsAzV1{mq+dfVDEtFo&yn*+Mn^P?KFSiGba5+3Df&KoHwF%vOY-zpLf`~BK-I}$rYvViwx z5B(P$=0jraF55$CQ$y+kIt`xATS{80o8PjjvVk8FxR#%1zE_a2hpfB=#cAI<9qy1p z&p@AUnM2#AOhSKuUs?#SLNa@3+oy$kF9vQlb?UeX0yeAIM_P=yKTzAA{(%P9D|IEy zXdo?Qlx8eTim)ezqy3c5R*F_CFE5X{h;ZRwTxj>1o3OOebGte?X%xI5Ng-`{90dlF z+0mQZsy$OKQ{b|6HXqtdI`Q(m-#_2~vi)k@OityaAVg9^!W{PRaBv~94QPHf-{MDlr1te>v zOvS`=Udw?XHs~gxHyqgO+}s}#0Ygb~ z|M97`toW@QcdF-W;1cn<^>fcoPhtq0AH_W_mh=$^5MQ)3bttJR>pg4HLs{xG$CSqk z=nI7PZu9fA^PSwq3=9n18=3!gK4K90`kI?K%~npBgDfKSq}m@YRe1x)gHid+=#UaE znqSMw-SSCdE_T}I4{*gRww*U3%lfb3#rVq#)%y*x2; z-qA&B7qkrGIAZ2$#i@j2)R!6r8GcG&`oo2=z;63Xb^K?%MAn+wh7;wpA1jU$IC6)- zbs7Z$MyJ8)q%Yak8Ys6m2(x2S=gXImmuEv6fSZTVo{R0295i4l2Y+w)9uWP(&dttN z4)E|}3lpgijCzz9bjxOdNND!BNigt>CeKeQ*V2}r18oa?g?rwSiAm{nKxx#|ove{+ zI6!WqSy)&+KfkbBu4jst^g@a7L9;ZnF)}ybHrb1fNgJQIUUPgEmhO>tC>iGPL0WFA83|$@?mh3+!fQlQB)R%^|4*@H-v5fKaa_h4pU_Ncm zY|h`sM%5cJu>#D5S&q3h)fmqZa!e$LsrI)9b6TMm>^wZJt1B*MTwppa4 zr7>hW`>+$q>%r^LP!4#GOTN*6~Hc2V!S4s=skjQT~B+vA9>z*(V@bB z3;Nv(%ml_SHs0{1bPD@k{*5Xfp310Z*OHBv{A;~k5_BEZ+8dxtY^U^LG2@riDdob54k4}KJ3519N2ytq0AlxX7>q8TIhKEJm&J*cZfC%>yA^fo4N7(1OtiD9Mjx5|T5ulf> zn5+T{26}R+WuHo^p+1Y5GI@!8$@JJ*`+7qN(1$ROUm^30PWG3!O}s~ZJsFO|{&;BanT4ed7cw#on$Zo&dvFqpG@g*W@NS(dp?0J3AW$k&Ni{`G=9t=7Rb*jR24nI$O07LBL z?x+whqiW}sD=3BTf=Df&Dw#Eo2Eju=yJ_795Th^Fydp6UJ8t-AdYxB2hLjja@Wiy= z3qmB29ZY}mqBsIz3u-N)La9F(L1?cj$bwEQPp@DV2xR|^%H8&tMiUfzhX;YjP|0^Q zQ(yG)F4q5a=XC(=u^Ymbbcu4wU$5soC|@E^qmVw(+vn)!>SxJ)dU`|bQ}{t051nw0 z)x`h);dIQ&ySpTkI1IjXsqJC9sRgA1{~yQUlC7Ga8ZkD0_U+!e!_|&)pUAMMzS8XE zA7EkZUoB8x>g($JZ2ki+V}*M{PR*d?hl~jZa?}MZ12|yVlaM>~kpZuQNR}j)^L|l< z1T>JaHOh`nQyh2+3gK!b09yjJeERhoiv%_Bg^GoLL-R_$KJOuwK!bpIPuRQ+$M&4= zQ9p&x+iWf;%Ukiq@D2zOwrx$mt-%CpoPzEUe5~RwhFR3rj zcLb)83I96}L4CgSel7!e1cb-GdoaNse-1GyU|34of zyp%gwjYd)FL;u!~VJOYqV>#@3)!fxlq$12L3`fQNBnZavse$W1PA_#Lca z@Z#^#^3u_!dym8rmGZDAr|!SM^-n5NnUFFc190=A@AE2+d^#RBHZ~zk!TZqTqD?<_Fo2(-&`}W&i#ygW2qwzwG-C-+i2T`c9JtSoxR@>IFUL zHd>>eS82`hK0jP4_67nAj6o(@^4F-vUW>lM@0J<)Zn9Jq4FociPiAGV+fy(YZ0+}2 zk-3&X(S25V^~tzeMsp#~3jV1BUdf-||7O}}T4z38Box-z&!(d#9H%q0V2sXo-Ylhg zQ*}}mv;*v3v`_>P)r&jSPhvo&pX8Z9N`D>Hj=Q)9w4!CZ+e?4G!fLl_lQ(=66r!$P z41nx>GS@N!Ll+bQf({WQj~+DR;o|JwVBaKtZ){5uESp(wA(W*{i=nQek%E_uR@R&o z1Y8c;*_$ym3j8mL_1+qpr6wk7D(SUxY-yoX=n7f5ikphNatX#^0^tT<(88fF21_r! zBtO`)<^!Mrn!;zs=Ej!h9s-sT`kb{Xjik&zZW*K?s9>r96LO|X>SCIKRzTOUw~qMi z|4e&ANd0E&vN))@w}^8ZW3n*68iF!KxWh-)o9T#ykdRP?W4uQonx*=@zp$XckOp3! zNT{SR7c?Dh?(bHbQkg!k_*7^zvapoS`auaxCI_)+TeU_ z1@(D>Rlz{OLfTwfqBB^9bkrru=AidTR{5cd7MxKp$hnodgb!yoT@YTu2#Xc5~-sYyLx z;Z@YvYF=%4Tfo7XuWF?#rYdU^4y^Em+ttOzOe{PKt|-C*?^)T|mGws^8bCz_4DyrJ z+-V;*TBrjh$?LuAmg~GFT-PvzAxW%`5P7#D_hr8ti(PVJJz~RLRyO9*&hgI9PE*y^ zyp_c^!%RcrC1EveH6Hs#WIW7Ib|*$!30QHQHC)qbllK7f=fLNzzvyOgM+8p*_%imO z(Eq^H;K3lcwAZcIqT6$ueH+fCWMF?+M`j56QB{1A_?fMy-JUIf0DvtqawQexm{UX% zz`-ca-0lP6um!`-bUIQG51+!2@_EvV$XE-@DzES5`Ema$@PLB8PL1yZj%)t_yoUvQ z{<2UOHaNRE5s4(_^AHQ5lYEKs@n6wkal`LF6n9v{b+m!hJg>Cad; zE#C}(yXvZwlb0Uq?^hwlGOU~hHZ3+zE}!*pxb4ik4Q_H=zZ)9v3b+a<7=W#Res)eR zUadfSfN3zHSl11R^@}10UB|%CvtGt08uGSt)lt7$-??CWq1o+jD}yK7DL=Pndjemj zHx_prWq+pm#VR_$Meb!8+_uR{*+~_^2^bT#M*5onC1Pf=PW9Sr4+Dec;g;*hdD1u> z8SBKWvZ8ZFwO&ADoZvn5WoWcRp0t^i!E|A3ev|e`40+!>(^iI3`qGlS(%YA&>{@f< zoaxUL6ckG5>5$oz7%7-KdS)c+9(9!TN2lhvXPWo8DV*vW^UL#_OPW&rmn6En#iKRQ8I_f0o17yE^_c2*#r)s$B$>C42W#R27FGK%?}QHcf((W<~2NFlHBK77vx z+gVbz8Y@alA_q+iYka`+^3`inr2WS#3+NpQ4T+>4pt*;I0reUMG)D}NPme+Q)BZM> z=z9thMXiDu3RJras<^N>-?fts>anAMm=K!unk0&ao)K8|ssn8s>b(e3`uh8%Onw&p z30zhJ48_utJS7@1@?Ln}KHdkoSUX$CQ>XrVP4~zHn#@;x0lDk$APBn8;n@LU`S@qx z??7Qf$t5Exn^DlPWJbXKVg|KH6TV-id0k6OOGqg~5#fqn00|-Ref&#Cw%rVfL&=B|3asOUK-ZN8i#{2Nae{_DP& zSmdj|v3>Ohay^~PuWNk#Y-cn}kfij= z>fzzR(9m#1_rHsDFE2kv(2=5{{VFX*wSD!Z1SCuxrB17S`m|E-y7w#Y>2B_^L&cH- zeY6KZm@Y(^jQFHhw5a$!KHP(Y`+T&Z0p)37(k&mA&)SHHh`RT8ZuI}w2Mf|52 zAjUK4m>C<77yp}^BhZEiUln=3zu2I0G1uR3-4%{MLj5$D0At{GpDs0!KxD%U4+;tr z)@OYMtQ)AcQGODO0y z3F!!ke`?-(S}aieUbRHjsTBpjTa=Vuoj?1z3c3cz3A;2!n5UL4BNmxhw#wB*V-0CWC9Nn%U63T@!>~GgzE~J~`E;=fB-#PY2-_&z7x@pZGoLRE ziWB-bhn3UQg#5WFXaXU>dHMO7waa=2+KcADfg}!`cYr?i1xX#ZpP9?^vHAWf;j*y@ z!0t&UJyMTvpu@c$70e3mWs56zqF4K~9PWp@7qJOpe>!hE5i=R4ONy{c_owMdW6&zS zCavJ(GP6o4;-r^{lLq?xbt=sUw@7&!8X8(EATBoN(73``S#F7_!0vT)$fVljhYug9 zvZ=h_y*vb)>wnLEHb*1Cv9d796E>1^?7d`~pZ0Ikzt5G+8ns(&?6hCEpQ&9XmG`XE zeYlw$t{kt-l~3oR34`475qqoXy`I72vaS zfByXe#FxiqpM~Q28nc1K=)}b9dI7Sd2hXeM9~6~l17jQ`&Mq!uh{2Ee%@!x*5)u+D zq%7r!y-#YOHpPfIyR%yPqEqZgIe5(9tpQ`JG;WTctpQlslFq;V{mecjSmX zT#Net0~SKZb3PJb5@_(8_8fzV!A)l}3+x4Kabe-1H&%ldD{7r|*nsu%PHx#4Z^{-J zx$lo!9)T+R@Eb8iS5O!H09VS@-O2K5%{>ZL7gc>-gYBIqVW^~XJQ2TB&)D4QNVF(e zAY?%p8I(hb!t48Wl~6hsG(;f%9v$orj{5F?#tV4=zg2eDK~;ubySE4tk&+HUq`Mmh z1eER$K|s1&K&3$hq(n-jTSAZqDFNxOO?P+0S@@lq@60>jnK_5y4`*bv+0S!7_r2n} zehc+0{{CdkmPuy!q3zMTMbEv0L>Xt1*-P+LEvr-xvla$cVa>IKIoR5|&IQ8a=Sc4M z-rjx&!oF^itB;sU2P4qZ@FziwkX~>VOcJLYeNeXLLG^@+I!#DAvSR_V4zQzQwdo2Z z$|ng1eF{zz@^E%^bkuwv2Tqw^@9cDR3wGyVGqo>v&^pP7PSxO`Q`VBg0%8?>Im${( zv_w%LL}I&Xw2QV242wL*ybPJIqK~jKMfu$L*d7?IuC6&&R6dscRLWT{{)?v@N?rnh z29Obz(Y4aGwPh8}(hlo{lgpTWH1L6>xP*92Omy+jQJfZ8R&KU}g6vO0!E}tw13f(i z?5_iplauZDDvFDDfBW6jVJ`n({M#Z6U!vX+#}IT3G;&{#Tf}NjyAm3hFw!#9i=^`U1k~4v0xWA2Y32|3(8~P zC?Rf$Hb|ITd)tZ_9+0ksE)h1dN~Y`%br#T)X{f80kDq_sC#H*d33!i$0A8az>vboz+)lh)=oQrr5f-7Xd+oivF}5ES}3Q}YC5QY@Cb`}Uin6Z3n4^)6B{Ws<@_9(S}L4JI7E8L zTh|`VPdM0k(R*rvP}LB>=@U9}Hqlz0#GrJQu*XD8sSHVLVB}2_qO#JhY);)YC!7sKypzU%py8!Ax2~;P$ zsxCd=`188g%(27-n7{TT(<@;&E_~(Ua`ej%`de;pZoDMSjEpjFf@h~|g^+Yc8yD!- zIj?WCIWvs6_n9~RM!FEhWzqT7)7xNou#_7u?|r(GIZ!$Pne;lM=4_(E0itrzlY|dHlg||fTP^ekyDhGhb8tM&BtH@zXk)ik&}~?pv-Ea7P@eU#SR3Edi<<9 zGg(jB)71Tq{_-Ph38Yh$;O5!=fE7TeT#U9|&U{J~JiI8Mn%i+j^RuVi5eJKEg`bu5=R=X6=K{*GEgFW0_UAidF<>uSzaNAVKs;_GkCY zOYGMx{k0szrJtpAseg4koGKaCp3{!2^c*7F$PpTS&x41$Azl!QI1vx6tSwvg{^aK+ zy*|g@zJ0s?L4z{lOHxv;*M&O(a=?KAtp(I4q9iw4tzVCijhr4Izg~FlS-gyc5nyC! zt~8}^)jBHTHL~NA8?wfr{k+1-T@_So?8n=1i{0PDW6Q(M3C35QTKBk@Y0f*9 zU&j8jijJ&u>TG7}g$j1GTs~v2 z${$=%4y%*h)jPdQCg9&XGpOvfR+gWuRj_u7(Mn~<@ZIq6hQDqV>= zi~$!dTKk!450+>urG(YR@X&en`Hvpfw5LdXNYGW!8CG`>KLkaltGoNG-B&ufy-KKV?bA^R>C00p+S3$3?NCt64C{NR_ho}M z=B1PrFNi%FB5y5BtWT`_irvjsFEn8#2xBKZ&^uop%tg17Fj31e4_2WU^4_VgNOwC9 z-2SPb7aE6S^vbNrbczg4JVs1ROarr5e1dO}cOQ1p$bb3!jl+3;A|-*#tUawL!brVP z>tf-QrB(bR8wZO2V!E6!}Ye#j?S)j#PMKD{k!`8 zkB$dClhsxwv6<>nSlBw4*>MFacTjM!xs{dbJ7FQW-KOqg8|%M1K?>i)=?w8(=#^8i z3V%>p!Cu29ijb&l6Mm%go zyL7qVFOQl6O>-$K@R#iXEeG^tnL;wkw73w$JT!iY=GMJtd2XHxYG80|i>4g!w2~j} zAMlR}U|iaVi)O&>3GXxs@b|YKug)*7WVd}Yy=<2nKO&3f_q{eln32&EA-U%(`bwnS z6RfxJaaj_$tS5LYF+9!A`(k47{6u>dh86Uc>vnQOGfXmKBU!)`D;##UvMUe!4ESzA z2my4O#AkJGYbJ6g7?BMVKP}YN)rWVF7nG^x6rZ$pd?XWc*O})X?9bOO?~8LBRC{e= z!cOoJ)?BUSP8^2`1|hq+(JaXQKFWR+sun_ad%(`kd1*c80#>-1`Y|pGAr!YEmBH$5 zF7NXlNdb?liRy_~OW)-oTRk{oP%nd8doh1AVWP^kmtTmW-AQk*)HQ5^2G>tlV6N$Ukat%VwK) za3YK-Ax4cxp$CM=N|o%*_cvu_WkED1$Ddqk-c0Y?(-KOYxRGdgheR~1BAbtydGpWA zn+QvGAH8r&QBybn##J7(eVe<2p?~&v*EnB5>(gUfc{zX z;yem-@NV)V8EfMcaYXQ%hIw3PHzYmGbb1n-7n zp3*L+>OVL?tyNnbXj5*uY=FQ|wTvGs`oCu4??31#&+$T=M*Riq@7Wz!Uj^~kO$Aq* ztIO+8QTayrQ15&IBL=rzybN_ePoIssIaHL|(`7!&{NQC2i+`4`n4g#LsKJlUpPHnb z92u>wrsO<(gafAnDuozMV;~#W+2JNmNVCnt$4^BCJDJiVs)ywS@kAh2(5=A5#hqVU z3TZH)AgVE8~{#hcOkchy<*!1EcwN0BZKP*|W ztgM)9orA!qS+M=>e%kU2Y3&fun&il6J|~P5HCZXrJ4S<~%96V(e)vM-V%KGJl8uYw z;K6RI0UPuKE^9B3HX-DwGJ*Ka+Ih3C{8F2cmiLzRz_KD-lxg^YQLP57Wf*1cVME|2 z??P-&j5@R%Lx7N*n|qH8-*$|TJv&dkM^{f1;XrxArXy$vb?waT&U0MRLO);{t`xV(5|n$M z9Ugu<6iM9m)>1T6oXu{!arKU`WO4iC+~+O|4#pF7a=wXyKl`JvvMbyF4t#8QU2Txr zFem#_7W_ib4YB53r=S=hz|X(F?jb?`<;&Ob?D-?-KXi0hj`uQT} z424RJ0Gy!ba8Xlhj2hL6xveJC7&T!PDhxl0?U-s`Bp@PyhIx)WT`nUrHm7g%>I(^c zN&E<@fu4~b2lU1{kOU$7G(h+67FI|jJSWCtmn@f$KGBfXxf~%5uPnoYgMS;a0)dc0 zJzvm%|Ig~fTvg*r{wgq%uKMO9Q~R{d?VO$K zIzWR^dwR$)D9*o8!Jz0wz~3(3^2+Xx;Cq(&$G&6Q<8>#8@ye!hn(%PY;-Vuf>**EL zM%nADZzgIm;>kC47~6xdQdJe|mK)^Lg?b}{y$7;oAI3Wu;4bESbcw;j5Revd=Fq0a zy*yB@bm~x}_p98{ACGEOCDkE;i(Cep$gSFw&C$_eYv>BN&bTVTwM$Vr7Od5wmNa;3 z=WLe*Dn0Yp2uX6!`T6;@uOW?sE-}yF(t?RQaKySlE zytBqnHgR}fFqG?1#I_kji?VUj2n3(2XFbHuveP@Rlo5ZH_EgW%!n#4GU4!!IK$bf4 zg|Q94?XlU8GL8|>;HWy3Whf&wH1$q&jGo2QVM*)#ifmihWwwsR(_M2?za$5piJ65( zY;-ILswsSlz7ky)&+%gfL`o-}b-@BrY8zO-+sjC*cBP+LlFL!}Xlr=N>tJ_BiHvO5 zVef1()$ny*V;|uBOO(Q6tx7k&2cgKzdGi?P|k?K zfQbtHN3Kr{yyzG;YW%YiD)bMxkr=J;045goC*9syGA=kST@!W>l+4DSd8E1nVqzi) z^3V9{_tQ;dHr6*PD=WdYhb1Z~Tv$-MS!nj_RgngjYO0a3nV+J8Xfo_DdJ)DC zqYbqwI9y+MuO+!M49wL zHS~$JatBa6pwvAW1!Y|!DR0{yZ~W*pY*AVop6g7vP*6)jDk`UsenCm~r>e;2S&{zK zV|{XH+FJ>f6~%kVt=Nt6(cs7ji*Mzm+Dv@0J5t^fX?IUkpuIEs0ggs9j?&w2ZzHyi z^DXm;R*92vg`c540>d47oPO0CE z4Fj(*57_mR^b&OwA9AsL$~&hy0WbU*;|7m;M{8G*tl-yQ-rbjc4okRr_=sP2sbOm_ zXV544F>2|H8Q&Sxv2Z{1zN)IK3cV^sJA?F`oUEKYT=If|I#Gn^I66H#)yL@X`j>nW z%R!DI2Nx%G16)vDsTb;AyzZs()F)pvn0trGe?C6b@ZRSMcH4|mz}7^aSb8nL>Re1y zVwJ7+#qe4zvtE1Os~x2C^Xj+G93GSSYo{e~hjNGI)`&{4y~@zg``0cT&ZZgLF1fB$ ziBDriMgftLk=YSuU`0x448ZfO{xh;X7)$qnkbQoFdhj4d(WhEe0#ya#^X@#EBgz|Xp#}{r?j{dVPR@4I9Oyw zPUAz+GP(Wuc4)I7fZEGimi3<~t2#P5P;4!Opu=0l8``3X}ou|@Wp;%j=|X0W`W<1=)z> z$rjJ5qX@!zsG?X~yTGrPl9D3d0ya_E+tFR!DwjllkKl&aoP#__C@8VGG1c}@I{*H? ztU9ZMiWNlzMGJMy%OdR=yiXcy?2hz|G`^1Mxqj(a#w{%yycJ$oG%;B|h<#panB zMLy5V;wDtHNDr;i|Vb4yEb`s~IPf;qB{3N1*7s=T;t)gzEW^v&N9 zwy-^No3ZMkmT!t}D){)ZGmZY4#u*2uTN5XZT|#GvjQW*2A0h(%42k0KIA}7G;|Xza z_NFg=j^*bdB4Lp)3?=4)R(_GAM#pUI&T)0Ropd&C&Qsbif^NGId8v%$hVd7XH)kN^ zFWz=8Axj_&lL=o7u{x531-|g{%ESwA9HrJ>ZM9zoy3UqQy%jK=53JRH%E zpRv2C4IgSSQ|@2^DkMvq%7E6tK{*m-!=lZ?*K_qwB%mmT?|#RoOQ z#h)xJEry6wYFlXgVn$2Aa+D9iApUwlo9i>)Fkr~f%X@r!pi{~Q&5oZI!#Vt&U}}QW z$@KEHRBCTbE6dUTJ|ivTBkVu`=OL01cxrg<+%a`^B0(~g*g=3$vKY#PO%yc+$XJoI zRKDRM@f~eOG+R?O`nuYo%?6OZPfkppdQ({J`!3hl*W-6VA1P)PzpX@=(rAuUWc^pX zeR*|pf@lU1e1Mjv6WzSCvjbvQaY{B}VW2eWje33OSShStZ0sG}8TP3Ymhlc`eWTIC z3P<mc$YV1=?2Br$|7yKWPBf5Qz^^ell7oB2bqV3&uz#ad% zj-1bP*3rz(OhkkXQfZKYLc&RcoH}r=kciDxRFc>4ZfJPsq)9Cr*s%asY6fpJcMlH+ z50m3tUdGRj0iLA8oN3Vu#~q+_qaK2>S~f)?Au%yJ1ei^nTwDO=p*y2|+41s3R5(t& zth5x~o`;JE2??1l77%kq#l`dxl!i2KZf-(Ln~A9t(SUe5^^`iYXms8G)Zh9UPsG!K zp&@P#jM>!9CCYuTh3c$C;iPqWP@={&0Jefs9Q*(4= zAP}teO!*Z$*4iH0@2*OwQb6`zT>QCXjuOe<*?EYdG%`M3`Vpp%Zn88QS**IMZnN3a zbdf8ZnHClnp_eWIW#hD_`<<#Q;KD{IbD#<6r4zfOFd+GOjS4+{SGhQ3LK^dFSA4YL zHj2vz!ijh0M_A#50rcf@sOhVDmz}~rJw;a=*Pef~k|{kZyZ$&JY`?ssr&Z%LGE;7G zem+W&sltBY<#zb={WYHY=ge2MM_ZFeyW20Tk`E^q?5#GQH9QmW8o7DUFW(Wv;$UYV zM1oJqM*q8cbfNz8HhVUD4pKFCSjTv!+nT({Wtvxm3be>R#&IMGdyZWVyP0Y0xjAKN zFjDvb;pOX^ob+srC1%W@=JvgMG+DhV(slXD%$gAUFmI}?I`8~#-${kTVvhCrjnkOe zyh5}x9~_6ct@CQ7ZXU&BW8 z18Lo+P-3&8rna{CwwTJOr8A`eTPuL5^uBoh0Yb@|fFKJqGx+a1wJ(=e4c^ad29}b& z3#ti|+7CCzMb6eavIuV=Vjz|y24zd;$`$&=>?ENQcu3R)k#q-#ZiFgUB3~2wq$PJS3wRDI?Mn^X<*sIFJ z^T&l21^Z80T2>NlXcZL|&uXrrdno=ua0f`G(P8K5fl(PpQXnC6c?^Wm|82Cg)=GNAT)I4|UXO!?wbLF&&Sf4|RKzy$@EXAPRH@EE&jvgWxoY_z zw61+}4^+e{?ZAe}63^wZD3e9`@0D^V&+xl06{2$gY$wvu|T+Y zXvlfFCq;qpx>fz)nT}2ZRN7l`QBY7|p}||D7(zgu(+Wnv{tQ_k{%iA`H}3}@ALz#f zVt(&m0hYo=wE--@OW|o@?!xKmX-ue~Y;4?Dy?KKmkQHj3$t6EKtvVB&yVjUh_4KR_ z48GY>?nL2` zCl_D=8gBYviPC&Z%3>_kx#~Q9V75n|AuQ-}I&oS!Y*C_jhJAA1f`@lR;BOKSaX>3w zChdH1RrzL;j9`WRL3`r3ORX&(Ix-G69=qq_zEg7H+VZkO@&ezVy-4HaeLeB|hdNS~ z;n9)JYm0=$L;(-(k&|$Kc}iW6xCaRL+!yJ6>whifS>#PoOc{|wFn=2s!GjG*JRQVX zA3b(()Dxi62Hy)2`O%4gSKNxp%D&=Up7D(LiVaI%N^-hj|SKM0(>x1U4kppq(6_u@nQ;0rk*yHI_*X$1;K7cFmZSCpapP&d- zpJScN&BUs!*z>xIkVROCK*pB1^R}Ve!&~iOMvD&(k7}nqwHJy(Pia}%*a`8ux;(=L zen0ZgFB)7w`5@1l(B5LPSTj6<}-)lSS-+IhPL@3N|DNYd47in!DSAA@^ zvydB`Yo7B(#^jCE8z~Lc_fk($gPLc@d29fkncUx=(!au8#@(MG*FV(19s`^ZrLCe9 z^9yw{GBV~*%%FHZ=sbWUguL_kPtWgdAulxSIC1(&{wiLE+(4PfAY*e0sk~Bj2}cUw zot~TzQTZGnDZp>Qji$91x3h4+eP-H+CCXDc39;jklA_1cs30o62JR?Me2*}a1a9+c&MNpb zxQ4j2zGxE=6OfCzR~Hn>^)M~3ua}mWL(LR2I!OR#{pI7>xl;|&Ji#Q_{XdG3ae{Z{ zFy@fl5>Byk;kk`yJGkn8?@b|mZp2%j1^9X-WoiqcZjTTx4;_E5}d#@Q^C*tpV1YnChjI(sR_w|QtX!6^7KSQ=pkTH-L0bms8WbHH2~T(CSF|QNGB9Y z0e3wd9uw0tw+C%QDr~dU(iL%Y{hFIAW-Fk?156|toBN%lclh_3P>#r}U1z?>7UCz$ z#Y$13^BYa7ul;5G8-6R1-)j|wj?nF?xv0hx#mSU858MGEB=7_I-KxsBY5|cn-Saeq z8;61lOZq#FWLO{pgw>@hV>I%K==UF7c#R){8oPVx%44l=YqExi*_}i>K=rhAe?6`Q zeEEso9z>xMkwM1lk%eTuwvV9F6k9l)UsZm7`(oI;BuSi_!naA34cW)dScrBWO%SV& z);a?IPCOr3@9kR5I{|tW@l?^CXl-nRAuDtgN`3zrgMQtrQ)9A`T^>uHl3miQ1((+XfOLAag zd#yr+5#XbX4=cngPRPZ1tEA8~D;#J!F&QL9ZcBCWD<8OO%TK1tS)N z$MfUKbDUQBgsZvgPX!o$;tkWR3EXm~E}1ga%6J)lS?xnSqNtMfuk18bZSErbP<#%0 zdsF{}`M&IZa6JRAMAY0Ov~lLO5~1juPE!l#&4~)9HMIzh*EXi)cx2pfn{55LQ@1u? zuZGHU`xIe&YOH9=^u1#ihCBt@aIK?XqA5WBzbI@8?+FKt?J)0|`}UF#>}~C>IMnh6 zZ`cZSYs=m?@BX(e++Zq+`e{TAu&zYOrlt^zs!&;tJ7 z7k2@$m?IXDoo(hM>qJxDKiR9x=Lg*`P0d7MPc8b0-(INjM^??Q&+8~@7``@n{mM9n zEjRyXei+g?-v(@E8q2H;-aNogfG?493}6966Z~Z+#xCLh?^{~vOrSwxu_@f%w%v4@ zs5;uLos24XDD}`fFU>A`;ig7NL4}D5M;=o?Q&5x0lo=Tw86F9`9cf7$&yZER}|la1?JLIcZip z5(%w{_ARreK16#y=2IFqPUme++VYXaVeT|^L!iu?<`SbRX#qrj3bc%t6{B9irz?$T1k z*bM?n6iG>x*4rK!3U^ibL-e$i+*f|5|G;{MOOJFY1|baMq1e4f=)EQgcv_EVSh->+ zy?c!L$CnMuNU!2sP2@!sp)zw)jVsRrGnC=_IEZlg7SB)iybVcd(c9a*)yPgZ{&ahI zN$`p{;n>|t$c@akxAv61i0)9gbtU=zh)Pl|Mykj0bPUD#%=1Jd=A7eYU&?$I7}GDWrry%R$sgaobZ0$ z{~6jDx}7bZ-giFn7F?>g#cuDvC4UD@Kvx}uS7s@xxjrxfs9j=!!F0bdNn z%R6|a8>Fhys$B(LR7%|^8gj&$Wf?=GgPNmHKpYN(A4V*ldFqILn&0%6?t_eFiHa{j z0VW#MzGI1Pqf-ekN@0s^UKjdO3~54b8Dg|q(~U{BVeZy-SJ{C>^*us)060#tFo%ZJ zBBXq2ra^Qh`%z}QX^BV%Uc#ly1-U#G+6&K9&}gCaH~wy)jTRGpX#ZTs+Ww4m1+)c;*F`yX1`5QtM9l-T|Y|H@9I zx(?<1@or!L*nek+d>~&npCi52Ti1JliXaZ~t9d#V*g3Z#|JqKWV_+CBF?}GK1(ckV ze?Smn66n!G=?s;E3{X9z#c63&S^t#ID6>FKqU?1LqmWDBO<_a2riUQgUgJ?}|A*9& ziG?MA{$D0%@c)?`0tsICnwx_B1@fzG<;-2z>e>)15YKKQY7}(;iLqmM!I*ME=XSjP zDyyIz$@=K_jbnzW=;-VDLY$l`C#B!Mef#-SwdNfVbCQxEYeUp{#4>8$IzYabcN46y zuLGDQ-<^n*G@tE@J@5{pY#I>kz6NsI|3bO_CmQ9y6N+<(2GtzB-t zVfu2t_g(vFZ zwV0XQ73N#%#qFj_go2&hzw%%9Cv{CpVFEt%V2-MS^grb>%yol$;F@uXNms&M)oV%$ z`3PMdiW2I&aH2=~@Nn6`(U|eE}I`Ru~as5pG$AX_~)vgMY1$Y&( z<%Fxzpu+YHHAwtBRDFMM-l`wJFv$iFkGPy%S3qef$R?g(1bAGnrMOC4PyD(m0BLU) zOn_*fs@JZiS@149ZyjuYC=65SL^NmPngEq}C98&f3K`$D*!8XbA0M=B?)o|ppSr@* zkEOxwXpqtBv*-^t-HT;L_5JX!;iej%+Lm#CJ41Uvd!OThqhuJt{bVdSO>W1lP);7~ z6{tBg1c?WSg$xh&UocDw2|d0z&0mX%h*+gdcBBjHZ(!qQ_i_Q{D4Nn{CMwm3-jvjA zT=T6c5$D}6K9RT61h0RUp0k{@iG&G$`8^89GsFfkDXNcDA!}y$`}p)xbyfMaeMQ~H zp*ByQN7hykf=-?a8}_0VEyocd$ZiQnnhfon^~#<;>Up&SVzNy{oq*SbE9LuRuVM49 zJU+^xKZuq~&-`~Kk$a!zW8RpVHIUtc!?}Lwk2Rya7Hn*-9|;_`W@^A$*q51JP_T7^ zfd^u{Ef*y8`+yche{}@c&A=d%VIJuT5*R6=4AmR?olmFh02D$Q6OOiykEWB?m`=88 zuk^48cY3$kkKM$*Oy7S1^;%Bhlyrnp=}|m&c;G5j3hqA3EJ%r zuBrF;B|Rh~6P_6EP_Nm(*UbEB!O>QYQ5y@JQf(a}-khsF>Muvf^aYY(>|sNZV*Di7d^9)s~hbFHM1o~a05 zzL}A1My0n;x+TxPfH~~+4(|6Q`HUF9TUHGiWKq+Gsy`E2)O9m>w9hh zF2DwMglZ4Ulx4-S$8j>;RJN$0qI+cXo>vVQ@Ik=*mY1KW-?MFFKH*}ZulFn|+AlgJ zQd%HWNQk56Tb9ABZ%}`xOzW%Usw;CbeH4COsCY#Hi^Xu7TC>EmLT*!DC?+8>besZ1$!8y4xT z>rk=3(6yS3h?Fe8SG?36cRlW|!C(Nt0;ZcNDPiOJaB;Ckhg>%%p|P@Ru_mIq9aI#- zw(fO(H5`}{VyZs~GBM@fsJr1C9#Dl6(wviD$dpZ6R9xEkhp|FOPerMz$FPYh*ullF z6=xd?za2cx`Zdm6D@vc!e=cCwQLOsi3%N(A_3_EQ*k2XD=!_X-NS%AGjdQO%`sW4(&KKAtEgrJ8prZ~Cy_ zdjF{I(bb=#$M~OFG_ryU%Y@+=NCbDn%upkgLY_PHJmESq9Px zG8+MU=q`L3=fCUQJ=;l$yF#4ahi|hr+&5Z&&UdsyO@R?vx@J3J)WJUhU7dvy3--n8 zh_`&BqrGv@O%J?PLtch_{v0WFr_Z!Q^+FAwep${u61q^yh?bX{!l?1ZKkqKzdfBtkj4|es;sI{*QD!S{_aC~@X z!$D^Jdj7TV{kzIrh#lL#W5>2kSDkMBo{7KJW!Z=OEB$~W!J@!g4Y+dyfw_O<1OD>z z>Yt7_n43hlNtT1LW^iSI=C_-+{o-*|(Gg_~UQ9t(K@P?nUraxlyJ%>AeSPNUZ*mIr zhySRB{#HSAlIp=Up79^^AJ!Tl_^3i9S-@NX-IxnHme`I8LFOty-6<9QDHWSHuLB{{ z%!Xc#_xFN3x1QN40?@-zDvN&BgS&sCy}uuaA}TR1zi8k~gpmqX;rzmiAEvpLS#-zz z50qPPI(%H#cIH~G61bs`C8;er*!J|c&}|z0%!IszfjkvSk4`yrT~giKp0`7ToQIro z(b6HZ?QiI%%_}S{)EsH~Btz-qXpZNVo>NTk8y;DM6DPA-MWz0y#%W2-*~D4hG!}9l zhIv$qY?WZlS!cT|o$6q!@0A(+zTv4QCW+x~uLX#!K$RZ68oX5NL{%M>9b|&U?t~?( zJE;q(^24XssR4x^&z9G!ryfstXXpKp#-X9XL(caP?bRiRK~f7iIl?(pg{*GmMgvv? zw8Rgs7MpUM$oB&pgPIK^r1tYz@x)S;Ikk#WDVY56@WLJjJzw=ZOAYP!$22r6aW8xq zESf^g%yhYRd8MYVwg$5Zzo3I&^PCNmn5b9z=oiCJV%w@JCQ&JLbvy6**twE~J`+O? zxA^dKwMKv%1AkVtVgdzJQ7W8J|Iqybb=Ho=Ag13kP<=a!v*AEaYh zRAbanPmX1SlR(Sa@{J=(OmuB+4WC)}cxmmPkL{fV8A?!m)jVJl(hl~-+ktq^=LqJO zK8(RDjvs|jQj=O!lX`*ViA$;Iu2$&{Ew^!WTFkJHwM7?;1a3fSZ?@k&cm$$IW@M}!lYmhyHFjZPw+Ngi2<=rs& z+oNOLet8J0^KMW8xS_O|lby{y-|3Ke{fKr?aW!?IH&sGgOQUvuc@QxwM;%VMza)VY z^kmk8ZkSVhi2(i6J2BK3#(nCw0&$|wKV05`1lnmSCM-7W^uF^LuN7e!JEkZZg6xOI z`y-^5k#|d=G#eTi=%M927=N0xXM5N)IA~>U27j+gQn`w`wOOtG23kPB!>kH(EIuy& zM6CnN>HyWp8=aL#>sR`<&T;((YQM6k4-?0g;$U#h;GbnKWki4X#6Wd=#lmsh+Z z(C(StUxPnEhX8=bZ#Iu`@0K_u-*>?Z_AB3-?E3p>!18Q*yFDf0AoQT{tqZ;1>e_~M zY9BaUHYe&*iLx5!_5d3VuDK4wqFcx)^#w@ZnBY=dPgXpMY$G8d`M9r7@)O7{jh(6B zo}%HQF?99iR@NRpzJ|_eojP_r(1vqA)uNx+oY;D*rqiUPQ>L>ej7+{BYe2glTD{OI znLKSAN_j7~BI7P5+qmITK5AK35mzBGbJ^418!zm3`d$o0sb6`N$r7Ij9}=(%QG~*j zf{xC*!PXDkOHumh)w#LIgoL-V13{~m<`8veYn;LnvR-Wo)71JtD;?ldeGXhyTO4#6 z1Vp}#wV8=o(GT9d+M-&C02z6)yCDaAI~{GE70K=*Gq$2$&uVi^auullwsp37BuGBO z2KcwB$s6P!w zi(wpfs(oayrzR)V-e(MRUKJxC04%Mutguw+F7h->IjiyOCMRY;4Qg>T*VUrjV4U zEs&DouuE6yl>H0HC}J|~OS!E`bT~toS@KATxv0^68eBcxkJx&ee-9YKOkXHmU3~Xu z#3Lplu(YziNSlA*VJd(Z!o|S_?dey2aV(Zs825?HjjZ?PS0WF)oEb4JObi!S=X31d z?2xa+R=zd8J<-;;GuLv@_XFZ$3l1zO-OC3jgU;&Som-4#fTjf%fK{G5(KIOi?=7+r ztc(0AD3fEv>wm*(!C?X7K)%nde*$5%qg~+aws$c z49OQlHX_hNQz$QX#^ICT>L{v00T+@zKn^F8CdhWm42G~Re}tbBzg2W3JG$&xY0nkq z(sey0uG(|aWD&j#86_wqs6&(Ye`|tFo~U97McF|a=8~eJpkpjgrV729@QsZgHhJ@a zP%teFKTXl>eeL_KVZs3TrC(bqe7QJ4w&3+lJ|sUhKR=$*FbDc7OPxT3IY%fl)Gq@__(8wh4zA_ZK zCm)=|N#~BOLUf}C5U>B$pZg|nQ_;FO)@f03QlXF!PU~VCKY3x8WaqWV|F$0dt4Hsl zvaE0q{+05<3sO*6%>VnP|DACE9~G4A3~yR&-@E9S9|J#Mg)#i>jTg`5#0x|XKKw5P CV&)$J literal 0 HcmV?d00001 diff --git a/docs/reference/glib/file-name-encodings.sxd b/docs/reference/glib/file-name-encodings.sxd new file mode 100644 index 0000000000000000000000000000000000000000..46750dc17c54ed6462f960f00ce354397a62729b GIT binary patch literal 7006 zcma)B2Ut_fv!^3ndcPE@QbH)wix7GT@lq575+Ia>5;_Qi(iQ1d5$RwkQUgd=nsf*V zNR?itSAD^I^_KVlzwgcY&dJ%`-^}jLnS3*|W1x+TM}u`mW2gawAeGPNF zKwTgRUss5=tE)5A)*1nY!vJ0|u&{?GOxVZ8Ss3hY?QQTw!Zi&3N&<%I7m;AzY~e5j z1ctamkC}glElANc%@%aoRhN7sq1sb_Wx>#=Gc}}fnJ{U#Wog3WRw$v#BAwmR*kQSS zzLl_9v9H4ZJXkqRIWJ_(_B?>xIl0Y0{ zVm60gNTRu4giR?G%rAdv8QrJzI$I|bj|!3;*WNZWkd>0;+m((19lk8!asN%`S?q!j zA3e!Sld_Hnl*CZ0YQ7w(GB$;qj7{Xi5XwhCPdG12g(g_^vqnNCF$I2y6^*eMr+Dkz z`ga?TP3rX+qFzQ)uN+d^$SJ92Cmcml)6_?NmFjn9C~u_-u_e08v}}FAy!|nvHzlV8 zA=HP>gfcD%Z8F=5u)O&?tX%8AK_`Wfto83WZY5l&uDyfH*ipcKZ1sWQd#||PJCe>JZVv2Vx%NUBG`(p=7{VL-RV{Uu=^c+qbI-LxWW*0r1Hyf)ehZ>1<+$EDN~gq4$r8Ag z%gi*qMY0+v?d83IOQm9Q>*m*hdS@08E4nG*OHG@h7&)@9wPtPo}s+Ki@CqLM^)1CyY!diDh+sN`}7w>ZB{o zd~$++{;A(l?l3S@1A3z@{OeLx>MhR`X&=7t$2*D*Sb@RQME--oLl3EuRJgMWz1MP^ z=#(#Q!#On*Ktc0v4$CKK6}{rMqC}@W~nBdZ*UEIwq(p`JP+8?BkBJHLneQ zlE=#|@u{BPXoxhmW+HNZebns68&6Z0@XG1csFwUwYwW_%7-v`pHCt;qj@O4^C8_*< zUBOigGZ7{;5tFsFOD?FGqRdRPB96M>h%ls0e303&xWqK@yIB(p4Twg1EJgl-N*A z?#ue_vCsIN@@MOhbZj*Hlf+C!%{YNUp?wvo{zwm20GI<~j>POm3@zSte68F2{kG1IEG zir2FmLWVi4OYn7SWZiG1(dJ6Li)TDOl&GGSRoZmVYUW`bDxkjc65;)I>1h8MMf3Q$ zxjt|`FWJKzRJ3G_)<71Jo|UbeJSlu+vv#OMt9c%Aht>n_n&kg&xsA#wKt*9z^5%QM z)QpZZkkRR@ zaxGgHR`97?*MnvY2F0EA6AnAQnC#ucYM>2dnihg&yE1TH!hv!_f z@vpy4#8VCEn&Ub?dfg;zbSyi=>dU)+urehj3KQwQrn{Uk>#l>#t3amlHZxc=sZ{-DNuaGbS%h#{LJu>nY^JVsC{_OI!Qi>WV=wGpNd% zmEX*s7`+xA&RrJUO+Fb0F0V&+sF0ey z%x0YikEW6asSlZyv#aT!JUdH)9*vHBYeRT;^xtuOxli_pjP?_-!uevOA|z;pK)}fD z<>mNngzCk|(KdcuS)d+!6)nd=IsP`=U^T5#gnyPAO=DsuOQT3GZ+v0FId-1-`5I?4 z_Xk=#t~<@TmxEfP<_mau7pQKBnD{V|Rvm?% zOsq#T&OgsbGL#SWMVJK``blsFxCW)$U8gz9&q>Kud$pQ%!L`VI zkeAhgC(ikZ*itnFiv+}pxTw1=Y_lb+{tful`~wy@$67M3x-Afqv7<6fpP?1;np6_s zmFj?$e!8ZWBl0!XZOtNRy%c$SNCNVDE}2FP*ELWCI)d&Cn$%;X=5&{5zci_c&2uxN zS#&?{o6?RgG85K`iE+n#o!lNmImgazrA=1{nru(@$mt2>r9m zrKfJ1R6(jwNr3$)$h0ouvKYxk6%mPU5v@4MC4mpoe6Dy(RvUa;fN$E+7xUZA(`xJB0}n_3OAZQ|4^mmNhl z!`Grww7pa-YpBy5#h}_Pt_;*7@tzzDBfYqv!LTDwX!n7?n_ktq_-E|!T3m8|z5yIG zPJ0DwG&qRMsO(DzXI2ir9CAA6Srp=Otc`7laF*4VkSype;9@Z}Oz|^ClVm!J_(jg; zTr36CMWuWzo6mym48^xEE!4BlRwv;vPVU(&UW}B9?T<~o_bqMkaMkY&7FMvyDkCE7 zEljrbUsO6)x-KBQiB=n!|9(uTwv8A+QvNi(36+!EfXnfnA0M%9e(oz=A5pKcH9Vbp z9@E9NWSCC(9appuwOS=dU^g}rmoyMcYYe#e+d!-dYfXwD3DdOvyC`PV2l)^!FZ*i6 zWyUwRwqZbp;Dr6Wye9Q4A&>kvnk_1} z4{0|nJ|;60xBvz>An}ggn+`@hVi{G)wM89m1et7D_RfHvKCIIYk{{+gZkK`Zw6Oi+ zH9gM9SZ%_@=2zG;IMd3JBGPXx%_$#ur#td0 zJ`(RQ5IRvHF*vS!SZijbN${Q6EBreuy0Rd6)~h9acR>qu-S5N$B!uc zrhJJu0dkQkg`(I{eh2=pW}-q;flT0G)PRLeMIENcOhe6N_B*xk? zJ246Pdx}DgeXXHMPQrX7BK|GhL=7YIBw?z*MFx6{# z`!$Sz>u4Z<;M)&hPI^B5K9LX$YfAp7FTY9-uku6_GH~t;E*93+{Ug(aAgr%Extt>A z!R`fd_rT2v->Z0FIgCPu8nBL`6hI0DrVO+5cehafZU2 ze&M~ny@kESeyj&5EiDcBG5QklasfdbnCAkL7h{doX@!a%@J?A2y}q5sn= zt^hy5uI>;IjD#Oq{Qt@HcOd6a1^?rd{8G-9dq7ZUnYq^&#T$7+SZ)(D6KMy=vPBDaKq z5_f=-G7_RPqLP0~`zKBgY%BA>7^Gx?;xgi5a)6(MS14y|n7ya9JwyQl6EZRWG4`wL zk4-_qPz1*Eglv6nF`=e{_@5L0tNWi=uqQ?h80%FqxFag6D=LN&{A15QnSPD`!RF}! zaTfwZ?4U3RnEeM3X6*uz=hTGR!P$YFfIoHdf5Jrne=xECA58og?AO1_tq%!DkLjT+4D=RX&j118W-_!C!V0XpVHU-AOB^o{ zQ=_(XBw8J|>H#ggHS;xcj{OvSxTwIHZ7+%UH=DL3^P-FDfb8wX3py`0Iys_?TqFJ^ zg68*hwF!g0OMAyVsQHHA6tCBZd0It#hXxna^uD~Qrn`7(Vfx429<;}lkKW%6HzlYn3mkXSP+O)bfwYN&of@qQ{X$AN^1yK%adUM{C6)d|Fyr7Z+ z8%cVzO(c&>Z;`3}vzSj%>52DvZVZO@v<*lA%vI>M_H<$sU9_2c!t{&*ByAqs z(f#-hQBbG2k^<1RJx$K&5CP?v?v#TOTf)01;E#30wSy`>$8!7hLb>qW7GAJ1$BVl}b^BPU)Ey3+oj)A*@+ZhDVR3IiA$E3w#ED zL6mshR##Q6uZ=eIm=`)AZ0di?nh_{TdhbDmG0%X6w=TQ5-e!WCJ0C89W&isF77yvg z)l)Yh?NF7*9g4{fo8696n3)F74gQ9w$7mAsN*2m4UK;PGwuNQKw-<#-WX-w-Y<=JydvomAt z3&AI55f;qYtJ2xny&-*{6J~7ppciM43hxwuv8gaMKQtxcN zUPmAjM^wjG!QNM>_za|60q&|Sc(l$Bl~@Mi{An%ZNklDuAQ8* zrsSja;f}HU!ljS7QBQWTB5j;Of!i6R{&Ms~G(P1ShD||i5+n`Z3srl8(;2k&tk0hI zlshDc3m|?6I0ntx->YXFXbVlBahz20=-ePNk#}<1I!`+}dl2DoTpPvv!pluz>?KpK z@P}{JK0)IpdOeb@m!I|Fmc@$cN!|O6dm~~EivlVa&GatI-qZtpK}G#CV@YF|(42;^ zV~zL7hPL|lHQ@J&WG=>BJp)`})*M^2SB|c(iqUQ7kWVKIb+Mc@#FTP} zTP=1MPf*+~Hk5`ty_P zr{4d5LU&c;`HPe>uYarf{G0Lb>A=+i-e2?*^MU_5&il!CHU6KHg}?Y5$uUJLOu%uK zI{f7Nxy-*C&Q*Bv7s06h8EpKU^Y1FVGOWL-l;OXanSnMwW(!zY1enVl8>4N;tJePj D*f>u9 literal 0 HcmV?d00001 diff --git a/docs/reference/glib/glib-docs.sgml b/docs/reference/glib/glib-docs.sgml new file mode 100644 index 0000000..c63881d --- /dev/null +++ b/docs/reference/glib/glib-docs.sgml @@ -0,0 +1,192 @@ + + + +]> + + + GLib Reference Manual + + for GLib &version; + The latest version of this documentation can be found on-line at + http://library.gnome.org/devel/glib/unstable/. + + + + + GLib Overview + +GLib is a general-purpose utility library, which provides many useful data +types, macros, type conversions, string utilities, file utilities, a main +loop abstraction, and so on. It works on many UNIX-like platforms, Windows, +OS/2 and BeOS. GLib is released under the GNU Library General Public License +(GNU LGPL). + + +The general policy of GLib is that all functions are invisibly threadsafe with the +exception of data structure manipulation functions, where, if you have two threads +manipulating the same data structure, they must use a lock to +synchronize their operation. + + + + + + + + + + + + + + GLib Fundamentals + + + + + + + + + + + + + GLib Core Application Support + + + + + + + + + + + + + + GLib Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GLib Data Types + + + + + + + + + + + + + + + + + + + + + + + + + + + + GLib Tools + + + + + + + Index + + + + Index of deprecated symbols + + + + Index of new symbols in 2.2 + + + + Index of new symbols in 2.4 + + + + Index of new symbols in 2.6 + + + + Index of new symbols in 2.8 + + + + Index of new symbols in 2.10 + + + + Index of new symbols in 2.12 + + + + Index of new symbols in 2.14 + + + + Index of new symbols in 2.16 + + + + Index of new symbols in 2.18 + + + + Index of new symbols in 2.20 + + + + Index of new symbols in 2.22 + + + + Index of new symbols in 2.24 + + + + diff --git a/docs/reference/glib/glib-gettextize.1 b/docs/reference/glib/glib-gettextize.1 new file mode 100644 index 0000000..f8bfb9e --- /dev/null +++ b/docs/reference/glib/glib-gettextize.1 @@ -0,0 +1,51 @@ +.\" ** You probably do not want to edit this file directly ** +.\" It was generated using the DocBook XSL Stylesheets (version 1.69.0). +.\" Instead of manually editing it, you probably should edit the DocBook XML +.\" source for it and then use the DocBook XSL Stylesheets to regenerate it. +.TH "GLIB\-GETTEXTIZE" "1" "08/15/2005" "" "" +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH "NAME" +glib\-gettextize \- gettext internationalization utility +.SH "SYNOPSIS" +.HP 16 +\fBglib\-gettextize\fR [option...] [directory] +.SH "DESCRIPTION" +.PP +\fBglib\-gettextize\fR +helps to prepare a source package for being internationalized through +gettext. It is a variant of the +\fBgettextize\fR +that ships with +gettext. +.PP +\fBglib\-gettextize\fR +differs from +\fBgettextize\fR +in that it doesn't create an +\fIintl/\fR +subdirectory and doesn't modify +\fIpo/ChangeLog\fR +(note that newer versions of +\fBgettextize\fR +behave like this when called with the +\fB\-\-no\-changelog\fR +option). +.SS "Options" +.TP +\fB\-\-help\fR +print help and exit +.TP +\fB\-\-version\fR +print version information and exit +.TP +\fB\-c\fR, \fB\-\-copy\fR +copy files instead of making symlinks +.TP +\fB\-f\fR, \fB\-\-force\fR +force writing of new files even if old ones exist +.SH "SEE ALSO" +.PP + \fBgettextize\fR(1) diff --git a/docs/reference/glib/glib-gettextize.xml b/docs/reference/glib/glib-gettextize.xml new file mode 100644 index 0000000..c92dc57 --- /dev/null +++ b/docs/reference/glib/glib-gettextize.xml @@ -0,0 +1,76 @@ + + + +glib-gettextize +1 + + + +glib-gettextize +gettext internationalization utility + + + + +glib-gettextize +option +directory + + + +Description +glib-gettextize helps to prepare a source package for being +internationalized through gettext. +It is a variant of the gettextize that ships with +gettext. + + +glib-gettextize differs +from gettextize in that it doesn't create an +intl/ subdirectory and doesn't modify +po/ChangeLog (note that newer versions of +gettextize behave like this when called with the + option). + +Options + + + + + +print help and exit + + + + + + +print version information and exit + + + + +, + +copy files instead of making symlinks + + + + +, + +force writing of new files even if old ones exist + + + + + + +See also + +gettextize(1) + + + + + diff --git a/docs/reference/glib/glib-overrides.txt b/docs/reference/glib/glib-overrides.txt new file mode 100644 index 0000000..7dd58e8 --- /dev/null +++ b/docs/reference/glib/glib-overrides.txt @@ -0,0 +1,307 @@ +# This file makes most of the thread related macros look like +# functions, which they really were, if possible easy. + +# default thread implementation + + +G_THREADS_IMPL_POSIX +#define G_THREADS_IMPL_POSIX + + + +G_THREADS_IMPL_NONE +#define G_THREADS_IMPL_NONE + + +# threads supported? + + +g_thread_supported +gboolean + + +# GMutex + + +g_mutex_new +GMutex * + + + +g_mutex_lock +void +GMutex *mutex + + + +g_mutex_trylock +gboolean +GMutex *mutex + + + +g_mutex_unlock +void +GMutex *mutex + + + +g_mutex_free +void +GMutex *mutex + + +# GStaticMutex + + +GStaticMutex + + + +G_STATIC_MUTEX_INIT +#define G_STATIC_MUTEX_INIT + + + +g_static_mutex_lock +void +GStaticMutex* mutex + + + +g_static_mutex_trylock +gboolean +GStaticMutex* mutex + + + +g_static_mutex_unlock +void +GStaticMutex* mutex + + + +g_static_mutex_get_mutex +GMutex * +GStaticMutex* mutex + + +# GThread + + +g_thread_yield +void + + + +g_thread_create +GThread * +GThreadFunc func +gpointer data, +gboolean joinable, +GError **error + + +# G_LOCK_* macros + + +G_LOCK_DEFINE +#define G_LOCK_DEFINE(name) + + + +G_LOCK_DEFINE_STATIC +#define G_LOCK_DEFINE_STATIC(name) + + + +G_LOCK_EXTERN +#define G_LOCK_EXTERN(name) + + + +G_LOCK +#define G_LOCK(name) + + + +G_UNLOCK +#define G_UNLOCK(name) + + + +G_TRYLOCK +#define G_TRYLOCK(name) + + +# GCond + + +g_cond_new +GCond* + + + +g_cond_signal +void +GCond *cond + + + +g_cond_broadcast +void +GCond *cond + + + +g_cond_wait +void +GCond *cond, GMutex *mutex + + + +g_cond_timed_wait +gboolean +GCond *cond, GMutex *mutex, GTimeVal *abs_time + + + +g_cond_free +void +GCond *cond + + +# GPrivate + + +g_private_new +GPrivate* +GDestroyNotify destructor + + + +g_private_get +gpointer +GPrivate *private_key + + + +g_private_set +void +GPrivate *private_key, gpointer data + + +# GStaticPrivate + + +G_STATIC_PRIVATE_INIT +#define G_STATIC_PRIVATE_INIT + + +# Definitions for different operating systems + + +G_OS_UNIX +#define G_OS_UNIX + + + +G_OS_WIN32 +#define G_OS_WIN32 + + + +G_OS_BEOS +#define G_OS_BEOS + + +# g_ascii_isxxx + + +g_ascii_isalnum +gboolean +gchar c + + + +g_ascii_isalpha +gboolean +gchar c + + + +g_ascii_iscntrl +gboolean +gchar c + + + +g_ascii_isdigit +gboolean +gchar c + + + +g_ascii_isgraph +gboolean +gchar c + + + +g_ascii_islower +gboolean +gchar c + + + +g_ascii_isprint +gboolean +gchar c + + + +g_ascii_ispunct +gboolean +gchar c + + + +g_ascii_isspace +gboolean +gchar c + + + +g_ascii_isupper +gboolean +gchar c + + + +g_ascii_isxdigit +gboolean +gchar c + + +# g_atomic + + +g_atomic_int_inc +void +gint *atomic + + + +g_atomic_int_dec_and_test +gboolean +gint *atomic + + + +GIConv + + + +G_VA_COPY +#define G_VA_COPY(ap1,ap2) + diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt new file mode 100644 index 0000000..bcfa7b0 --- /dev/null +++ b/docs/reference/glib/glib-sections.txt @@ -0,0 +1,2919 @@ +glib.h + +
+Basic Types +types +gboolean +gpointer +gconstpointer +gchar +guchar + + +gint +guint +gshort +gushort +glong +gulong + + +gint8 +guint8 +gint16 +guint16 +gint32 +guint32 + + +G_HAVE_GINT64 +gint64 +guint64 +G_GINT64_CONSTANT +G_GUINT64_CONSTANT + + +gfloat +gdouble + + +gsize +gssize +goffset +G_GOFFSET_CONSTANT + + +gintptr +guintptr + + +GLIB_SIZEOF_VOID_P +GLIB_SIZEOF_LONG +GLIB_SIZEOF_SIZE_T +
+ +
+Limits of Basic Types +limits +G_MININT +G_MAXINT +G_MAXUINT + + +G_MINSHORT +G_MAXSHORT +G_MAXUSHORT + + +G_MINLONG +G_MAXLONG +G_MAXULONG + + +G_MININT8 +G_MAXINT8 +G_MAXUINT8 + + +G_MININT16 +G_MAXINT16 +G_MAXUINT16 + + +G_MININT32 +G_MAXINT32 +G_MAXUINT32 + + +G_MININT64 +G_MAXINT64 +G_MAXUINT64 + + +G_MAXSIZE +G_MINSSIZE +G_MAXSSIZE + + +G_MINOFFSET +G_MAXOFFSET + + +G_MINFLOAT +G_MAXFLOAT + + +G_MINDOUBLE +G_MAXDOUBLE +
+ +
+Version Information +version +glib_major_version +glib_minor_version +glib_micro_version +glib_binary_age +glib_interface_age +glib_check_version + + +GLIB_MAJOR_VERSION +GLIB_MINOR_VERSION +GLIB_MICRO_VERSION +GLIB_CHECK_VERSION +
+ +
+Standard Macros +macros + +G_OS_WIN32 +G_OS_BEOS +G_OS_UNIX + + +G_DIR_SEPARATOR +G_DIR_SEPARATOR_S +G_IS_DIR_SEPARATOR +G_SEARCHPATH_SEPARATOR +G_SEARCHPATH_SEPARATOR_S + + +TRUE +FALSE + + +NULL + + +MIN +MAX + + +ABS +CLAMP + + +G_STRUCT_MEMBER +G_STRUCT_MEMBER_P +G_STRUCT_OFFSET + + +G_MEM_ALIGN + + +G_CONST_RETURN + +
+ +
+Type Conversion Macros +type_conversion +GINT_TO_POINTER +GPOINTER_TO_INT + + +GUINT_TO_POINTER +GPOINTER_TO_UINT +GSIZE_TO_POINTER +GPOINTER_TO_SIZE +
+ +
+Byte Order Macros +byte_order +G_BYTE_ORDER +G_LITTLE_ENDIAN +G_BIG_ENDIAN +G_PDP_ENDIAN + + +g_htonl +g_htons +g_ntohl +g_ntohs + + +GINT_FROM_BE +GINT_FROM_LE +GINT_TO_BE +GINT_TO_LE + + +GUINT_FROM_BE +GUINT_FROM_LE +GUINT_TO_BE +GUINT_TO_LE + + +GLONG_FROM_BE +GLONG_FROM_LE +GLONG_TO_BE +GLONG_TO_LE + + +GULONG_FROM_BE +GULONG_FROM_LE +GULONG_TO_BE +GULONG_TO_LE + + +GSIZE_FROM_BE +GSIZE_FROM_LE +GSIZE_TO_BE +GSIZE_TO_LE + + +GSSIZE_FROM_BE +GSSIZE_FROM_LE +GSSIZE_TO_BE +GSSIZE_TO_LE + + +GINT16_FROM_BE +GINT16_FROM_LE +GINT16_TO_BE +GINT16_TO_LE + + +GUINT16_FROM_BE +GUINT16_FROM_LE +GUINT16_TO_BE +GUINT16_TO_LE + + +GINT32_FROM_BE +GINT32_FROM_LE +GINT32_TO_BE +GINT32_TO_LE + + +GUINT32_FROM_BE +GUINT32_FROM_LE +GUINT32_TO_BE +GUINT32_TO_LE + + +GINT64_FROM_BE +GINT64_FROM_LE +GINT64_TO_BE +GINT64_TO_LE + + +GUINT64_FROM_BE +GUINT64_FROM_LE +GUINT64_TO_BE +GUINT64_TO_LE + + +GUINT16_SWAP_BE_PDP +GUINT16_SWAP_LE_BE +GUINT16_SWAP_LE_PDP + + +GUINT32_SWAP_BE_PDP +GUINT32_SWAP_LE_BE +GUINT32_SWAP_LE_PDP + + +GUINT64_SWAP_LE_BE + + +GUINT16_SWAP_LE_BE_CONSTANT +GUINT32_SWAP_LE_BE_CONSTANT +GUINT64_SWAP_LE_BE_CONSTANT +GUINT16_SWAP_LE_BE_IA32 +GUINT32_SWAP_LE_BE_IA32 +GUINT64_SWAP_LE_BE_IA32 +GUINT16_SWAP_LE_BE_IA64 +GUINT32_SWAP_LE_BE_IA64 +GUINT64_SWAP_LE_BE_IA64 +GUINT32_SWAP_LE_BE_X86_64 +GUINT64_SWAP_LE_BE_X86_64 + +
+ +
+Numerical Definitions +numerical +G_IEEE754_FLOAT_BIAS +G_IEEE754_DOUBLE_BIAS +GFloatIEEE754 +GDoubleIEEE754 + + + +G_E +G_LN2 +G_LN10 +G_PI +G_PI_2 +G_PI_4 +G_SQRT2 +G_LOG_2_BASE_10 +
+ +
+Miscellaneous Macros +macros_misc +G_INLINE_FUNC + + +G_STMT_START +G_STMT_END + + +G_BEGIN_DECLS +G_END_DECLS + + +G_N_ELEMENTS + + +G_VA_COPY + + +G_STRINGIFY +G_PASTE +G_PASTE_ARGS +G_STATIC_ASSERT + + +G_GNUC_EXTENSION +G_GNUC_CONST +G_GNUC_PURE +G_GNUC_MALLOC +G_GNUC_ALLOC_SIZE +G_GNUC_ALLOC_SIZE2 +G_GNUC_DEPRECATED +G_GNUC_NORETURN +G_GNUC_UNUSED +G_GNUC_PRINTF +G_GNUC_SCANF +G_GNUC_FORMAT +G_GNUC_NULL_TERMINATED +G_GNUC_WARN_UNUSED_RESULT +G_GNUC_FUNCTION +G_GNUC_PRETTY_FUNCTION +G_GNUC_NO_INSTRUMENT +G_HAVE_GNUC_VISIBILITY +G_GNUC_INTERNAL +G_GNUC_MAY_ALIAS + + +G_LIKELY +G_UNLIKELY + + +G_STRLOC +G_STRFUNC + + +G_GINT16_MODIFIER +G_GINT16_FORMAT +G_GUINT16_FORMAT +G_GINT32_MODIFIER +G_GINT32_FORMAT +G_GUINT32_FORMAT +G_GINT64_MODIFIER +G_GINT64_FORMAT +G_GUINT64_FORMAT +G_GSIZE_MODIFIER +G_GSIZE_FORMAT +G_GSSIZE_FORMAT +G_GOFFSET_MODIFIER +G_GOFFSET_FORMAT +G_GINTPTR_MODIFIER +G_GINTPTR_FORMAT +G_GUINTPTR_FORMAT + + +GLIB_VAR +G_STRINGIFY_ARG +G_HAVE_INLINE +G_CAN_INLINE +inline +G_HAVE___INLINE +G_HAVE___INLINE__ +G_HAVE_GNUC_VARARGS +G_HAVE_ISO_VARARGS +G_HAVE_GROWING_STACK +
+ +
+Error Reporting +error_reporting +GError +g_error_new +g_error_new_literal +g_error_new_valist +g_error_free +g_error_copy +g_error_matches +g_set_error +g_set_error_literal +g_propagate_error +g_clear_error +g_prefix_error +g_propagate_prefixed_error +
+ +
+The Main Event Loop +main +GMainLoop +g_main_loop_new +g_main_loop_ref +g_main_loop_unref +g_main_loop_run +g_main_loop_quit +g_main_loop_is_running +g_main_loop_get_context +g_main_new +g_main_destroy +g_main_run +g_main_quit +g_main_is_running + + +G_PRIORITY_HIGH +G_PRIORITY_DEFAULT +G_PRIORITY_HIGH_IDLE +G_PRIORITY_DEFAULT_IDLE +G_PRIORITY_LOW + + +GMainContext +g_main_context_new +g_main_context_ref +g_main_context_unref +g_main_context_default +g_main_context_iteration +g_main_iteration +g_main_context_pending +g_main_pending +g_main_context_find_source_by_id +g_main_context_find_source_by_user_data +g_main_context_find_source_by_funcs_user_data +g_main_context_wakeup +g_main_context_acquire +g_main_context_release +g_main_context_is_owner +g_main_context_wait +g_main_context_prepare +g_main_context_query +g_main_context_check +g_main_context_dispatch +g_main_context_set_poll_func +g_main_context_get_poll_func +GPollFunc +g_main_context_add_poll +g_main_context_remove_poll +g_main_depth +g_main_current_source +g_main_set_poll_func + + +g_main_context_get_thread_default +g_main_context_push_thread_default +g_main_context_pop_thread_default + + +g_timeout_source_new +g_timeout_source_new_seconds +g_timeout_add +g_timeout_add_full +g_timeout_add_seconds +g_timeout_add_seconds_full + + +g_idle_source_new +g_idle_add +g_idle_add_full +g_idle_remove_by_data + + +GPid +GChildWatchFunc +g_child_watch_source_new +g_child_watch_add +g_child_watch_add_full + + +GPollFD +g_poll +G_POLLFD_FORMAT + + +GSource +GSourceDummyMarshal +GSourceFuncs +GSourceCallbackFuncs +g_source_new +g_source_ref +g_source_unref +g_source_set_funcs +g_source_attach +g_source_destroy +g_source_is_destroyed +g_source_set_priority +g_source_get_priority +g_source_set_can_recurse +g_source_get_can_recurse +g_source_get_id +g_source_get_context +g_source_set_callback +GSourceFunc +g_source_set_callback_indirect +g_source_add_poll +g_source_remove_poll +g_source_get_current_time +g_source_remove +g_source_remove_by_funcs_user_data +g_source_remove_by_user_data + + +GLIB_HAVE_SYS_POLL_H +GLIB_HAVE_ALLOCA_H +alloca +GLIB_SYSDEF_POLLERR +GLIB_SYSDEF_POLLHUP +GLIB_SYSDEF_POLLIN +GLIB_SYSDEF_POLLNVAL +GLIB_SYSDEF_POLLOUT +GLIB_SYSDEF_POLLPRI +G_WIN32_MSG_HANDLE +g_idle_funcs +g_timeout_funcs +g_child_watch_funcs +
+ +
+Threads +threads + +G_THREADS_ENABLED +G_THREADS_IMPL_POSIX +G_THREADS_IMPL_NONE + + +G_THREAD_ERROR +GThreadError + + +GThreadFunctions +g_thread_init +g_thread_supported +g_thread_get_initialized + + +GThreadFunc +GThreadPriority +GThread +g_thread_create +g_thread_create_full +g_thread_self +g_thread_join +g_thread_set_priority +g_thread_yield +g_thread_exit +g_thread_foreach + + +GMutex +g_mutex_new +g_mutex_lock +g_mutex_trylock +g_mutex_unlock +g_mutex_free + + +GStaticMutex +G_STATIC_MUTEX_INIT +g_static_mutex_init +g_static_mutex_lock +g_static_mutex_trylock +g_static_mutex_unlock +g_static_mutex_get_mutex +g_static_mutex_free + + +G_LOCK_DEFINE +G_LOCK_DEFINE_STATIC +G_LOCK_EXTERN +G_LOCK +G_TRYLOCK +G_UNLOCK + + +GStaticRecMutex +G_STATIC_REC_MUTEX_INIT +g_static_rec_mutex_init +g_static_rec_mutex_lock +g_static_rec_mutex_trylock +g_static_rec_mutex_unlock +g_static_rec_mutex_lock_full +g_static_rec_mutex_unlock_full +g_static_rec_mutex_free + + +GStaticRWLock +G_STATIC_RW_LOCK_INIT +g_static_rw_lock_init +g_static_rw_lock_reader_lock +g_static_rw_lock_reader_trylock +g_static_rw_lock_reader_unlock +g_static_rw_lock_writer_lock +g_static_rw_lock_writer_trylock +g_static_rw_lock_writer_unlock +g_static_rw_lock_free + + +GCond +g_cond_new +g_cond_signal +g_cond_broadcast +g_cond_wait +g_cond_timed_wait +g_cond_free + + +GPrivate +g_private_new +g_private_get +g_private_set + + +GStaticPrivate +G_STATIC_PRIVATE_INIT +g_static_private_init +g_static_private_get +g_static_private_set +g_static_private_free + + +GOnce +GOnceStatus +G_ONCE_INIT +g_once +g_once_init_enter +g_once_init_leave + + +g_bit_lock +g_bit_trylock +g_bit_unlock + + +G_THREAD_ECF +G_THREAD_CF +G_THREAD_UF +g_static_mutex_get_mutex_impl +g_static_mutex_get_mutex_impl_shortcut +G_MUTEX_DEBUG_MAGIC +g_thread_init_with_errorcheck_mutexes +G_LOCK_NAME +glib_dummy_decl +GSystemThread +g_thread_use_default_impl +g_threads_got_initialized +g_thread_functions_for_glib_use +g_thread_init_glib +g_thread_error_quark +g_once_impl +g_once_init_enter_impl +atexit +g_system_thread_assign +g_system_thread_equal +g_system_thread_equal_simple +
+ +
+Thread Pools +thread_pools +GThreadPool +g_thread_pool_new +g_thread_pool_push +g_thread_pool_set_max_threads +g_thread_pool_get_max_threads +g_thread_pool_get_num_threads +g_thread_pool_unprocessed +g_thread_pool_free +g_thread_pool_set_max_unused_threads +g_thread_pool_get_max_unused_threads +g_thread_pool_get_num_unused_threads +g_thread_pool_stop_unused_threads +g_thread_pool_set_sort_function +g_thread_pool_set_max_idle_time +g_thread_pool_get_max_idle_time +
+ +
+Asynchronous Queues +async_queues +GAsyncQueue +g_async_queue_new +g_async_queue_new_full +g_async_queue_ref +g_async_queue_unref +g_async_queue_push +g_async_queue_push_sorted +g_async_queue_pop +g_async_queue_try_pop +g_async_queue_timed_pop +g_async_queue_length +g_async_queue_sort + + +g_async_queue_lock +g_async_queue_unlock +g_async_queue_ref_unlocked +g_async_queue_unref_and_unlock +g_async_queue_push_unlocked +g_async_queue_push_sorted_unlocked +g_async_queue_pop_unlocked +g_async_queue_try_pop_unlocked +g_async_queue_timed_pop_unlocked +g_async_queue_length_unlocked +g_async_queue_sort_unlocked +
+ +
+Atomic Operations +atomic_operationsg +g_atomic_int_get +g_atomic_int_set +g_atomic_int_add +g_atomic_int_exchange_and_add +g_atomic_int_compare_and_exchange +g_atomic_pointer_get +g_atomic_pointer_set +g_atomic_pointer_compare_and_exchange +g_atomic_int_inc +g_atomic_int_dec_and_test +
+ +
+IO Channels +iochannels +GIOChannel + + +g_io_channel_unix_new +g_io_channel_unix_get_fd +g_io_channel_win32_new_fd +g_io_channel_win32_new_socket +g_io_channel_win32_new_messages + + +g_io_channel_init + + +g_io_channel_new_file +g_io_channel_read_chars +g_io_channel_read_unichar +g_io_channel_read_line +g_io_channel_read_line_string +g_io_channel_read_to_end +g_io_channel_write_chars +g_io_channel_write_unichar +g_io_channel_flush +g_io_channel_seek_position +GSeekType +g_io_channel_shutdown + + +GIOStatus +GIOChannelError +G_IO_CHANNEL_ERROR +g_io_channel_error_from_errno + + +g_io_channel_ref +g_io_channel_unref + + +g_io_create_watch +g_io_add_watch +g_io_add_watch_full +GIOCondition +GIOFunc + + +GIOFuncs + + +g_io_channel_get_buffer_size +g_io_channel_set_buffer_size +g_io_channel_get_buffer_condition +g_io_channel_get_flags +g_io_channel_set_flags +GIOFlags +g_io_channel_get_line_term +g_io_channel_set_line_term +g_io_channel_get_buffered +g_io_channel_set_buffered +g_io_channel_get_encoding +g_io_channel_set_encoding +g_io_channel_get_close_on_unref +g_io_channel_set_close_on_unref + + +g_io_channel_win32_poll +g_io_channel_win32_make_pollfd +g_io_channel_win32_get_fd + + +g_io_channel_read +GIOError +g_io_channel_write +g_io_channel_seek +g_io_channel_close + + +g_io_channel_error_quark +g_io_watch_funcs +
+ +
+Memory Allocation +memory +g_new +g_new0 +g_renew +g_try_new +g_try_new0 +g_try_renew + + +g_malloc +g_malloc0 +g_realloc +g_try_malloc +g_try_malloc0 +g_try_realloc +g_malloc_n +g_malloc0_n +g_realloc_n +g_try_malloc_n +g_try_malloc0_n +g_try_realloc_n + + +g_free +g_mem_gc_friendly + + +g_alloca +g_newa + + +g_memmove +g_memdup + + +GMemVTable +g_mem_set_vtable +g_mem_is_system_malloc + + +glib_mem_profiler_table +g_mem_profile +
+ +
+Warnings and Assertions +warnings +g_print +g_set_print_handler +GPrintFunc + + +g_printerr +g_set_printerr_handler + + +g_return_if_fail +g_return_val_if_fail +g_return_if_reached +g_return_val_if_reached +g_warn_if_fail +g_warn_if_reached + + +g_on_error_query +g_on_error_stack_trace + + +G_BREAKPOINT + + +g_return_if_fail_warning +g_assert_warning +g_warn_message +
+ +
+Glob-style pattern matching +patterns +GPatternSpec +g_pattern_spec_new +g_pattern_spec_free +g_pattern_spec_equal +g_pattern_match +g_pattern_match_string +g_pattern_match_simple +
+ +
+Perl-compatible regular expressions +gregex +GRegexError +G_REGEX_ERROR +GRegexCompileFlags +GRegexMatchFlags +GRegex +GRegexEvalCallback +g_regex_new +g_regex_ref +g_regex_unref +g_regex_get_pattern +g_regex_get_max_backref +g_regex_get_capture_count +g_regex_get_string_number +g_regex_escape_string +g_regex_match_simple +g_regex_match +g_regex_match_full +g_regex_match_all +g_regex_match_all_full +g_regex_split_simple +g_regex_split +g_regex_split_full +g_regex_replace +g_regex_replace_literal +g_regex_replace_eval +g_regex_check_replacement +GMatchInfo +g_match_info_get_regex +g_match_info_get_string +g_match_info_free +g_match_info_matches +g_match_info_next +g_match_info_get_match_count +g_match_info_is_partial_match +g_match_info_expand_references +g_match_info_fetch +g_match_info_fetch_pos +g_match_info_fetch_named +g_match_info_fetch_named_pos +g_match_info_fetch_all + +g_regex_error_quark +
+ +
+Message Logging +messages +G_LOG_DOMAIN +G_LOG_FATAL_MASK +G_LOG_LEVEL_USER_SHIFT +GLogFunc +GLogLevelFlags + + +g_log +g_logv +g_message +g_warning +g_critical +g_error +g_debug + + +g_log_set_handler +g_log_remove_handler +g_log_set_always_fatal +g_log_set_fatal_mask +g_log_default_handler +g_log_set_default_handler +
+ +
+Timers +timers +GTimer +g_timer_new +g_timer_start +g_timer_stop +g_timer_continue +g_timer_elapsed +g_timer_reset +g_timer_destroy +
+ +
+Spawning Processes +spawn +GSpawnError +G_SPAWN_ERROR +GSpawnFlags +GSpawnChildSetupFunc +g_spawn_async_with_pipes +g_spawn_async +g_spawn_sync +g_spawn_command_line_async +g_spawn_command_line_sync +g_spawn_close_pid + +g_spawn_error_quark +
+ +
+Simple XML Subset Parser +markup +GMarkupError +G_MARKUP_ERROR +GMarkupParseFlags +GMarkupParseContext +GMarkupParser +g_markup_escape_text +g_markup_printf_escaped +g_markup_vprintf_escaped +g_markup_parse_context_end_parse +g_markup_parse_context_free +g_markup_parse_context_get_position +g_markup_parse_context_get_element +g_markup_parse_context_get_element_stack +g_markup_parse_context_get_user_data +g_markup_parse_context_new +g_markup_parse_context_parse +g_markup_parse_context_push +g_markup_parse_context_pop + +GMarkupCollectType +g_markup_collect_attributes + +g_markup_error_quark +
+ + +
+Shell-related Utilities +shell +GShellError +G_SHELL_ERROR +g_shell_parse_argv +g_shell_quote +g_shell_unquote + +g_shell_error_quark +
+ + +
+Commandline option parser +option +GOptionError +G_OPTION_ERROR +GOptionArgFunc +GOptionContext +g_option_context_new +g_option_context_set_summary +g_option_context_get_summary +g_option_context_set_description +g_option_context_get_description +GTranslateFunc +g_option_context_set_translate_func +g_option_context_set_translation_domain +g_option_context_free +g_option_context_parse +g_option_context_set_help_enabled +g_option_context_get_help_enabled +g_option_context_set_ignore_unknown_options +g_option_context_get_ignore_unknown_options +g_option_context_get_help +GOptionArg +GOptionFlags +G_OPTION_REMAINING +GOptionEntry +g_option_context_add_main_entries +GOptionGroup +g_option_context_add_group +g_option_context_set_main_group +g_option_context_get_main_group +g_option_group_new +g_option_group_free +g_option_group_add_entries +GOptionParseFunc +g_option_group_set_parse_hooks +GOptionErrorFunc +g_option_group_set_error_hook +g_option_group_set_translate_func +g_option_group_set_translation_domain + +g_option_error_quark +
+ + +
+File Utilities +fileutils +glib.h,glib/gstdio.h +GFileError +G_FILE_ERROR +GFileTest +g_file_error_from_errno +g_file_get_contents +g_file_set_contents +g_file_test +g_mkstemp +g_mkstemp_full +g_file_open_tmp +g_file_read_link +g_mkdir_with_parents + + +GDir +g_dir_open +g_dir_read_name +g_dir_rewind +g_dir_close + + +GMappedFile +g_mapped_file_new +g_mapped_file_ref +g_mapped_file_unref +g_mapped_file_free +g_mapped_file_get_length +g_mapped_file_get_contents + + +g_open +g_rename +g_mkdir +g_stat +g_lstat +g_unlink +g_remove +g_rmdir +g_fopen +g_freopen +g_chmod +g_access +g_creat +g_chdir +g_utime + + +g_file_error_quark +
+ + +
+String Utility Functions +string_utils +glib.h,glib/gprintf.h +g_strdup +g_strndup +g_strdupv +g_strnfill +g_stpcpy +g_strstr_len +g_strrstr +g_strrstr_len +g_str_has_prefix +g_str_has_suffix +g_strcmp0 + + +g_strlcpy +g_strlcat + + +g_strdup_printf +g_strdup_vprintf +g_printf +g_vprintf +g_fprintf +g_vfprintf +g_sprintf +g_vsprintf +g_snprintf +g_vsnprintf +g_vasprintf +g_printf_string_upper_bound + + +g_ascii_isalnum +g_ascii_isalpha +g_ascii_iscntrl +g_ascii_isdigit +g_ascii_isgraph +g_ascii_islower +g_ascii_isprint +g_ascii_ispunct +g_ascii_isspace +g_ascii_isupper +g_ascii_isxdigit + + +g_ascii_digit_value +g_ascii_xdigit_value + + +g_ascii_strcasecmp +g_ascii_strncasecmp + + +g_ascii_strup +g_ascii_strdown + + +g_ascii_tolower +g_ascii_toupper + + +g_string_ascii_up +g_string_ascii_down + + +g_strup +g_strdown + + +g_strcasecmp +g_strncasecmp + + +g_strreverse + + +g_ascii_strtoll +g_ascii_strtoull +G_ASCII_DTOSTR_BUF_SIZE +g_ascii_strtod +g_ascii_dtostr +g_ascii_formatd +g_strtod + + +g_strchug +g_strchomp +g_strstrip + + +g_strdelimit +G_STR_DELIMITERS +g_strescape +g_strcompress +g_strcanon +g_strsplit +g_strsplit_set +g_strfreev +g_strconcat +g_strjoin +g_strjoinv +g_strv_length + + +g_strerror +g_strsignal + + +GAsciiType +
+ +
+Date and Time Functions +date +G_USEC_PER_SEC +GTimeVal +g_get_current_time +g_usleep +g_time_val_add +g_time_val_from_iso8601 +g_time_val_to_iso8601 + + +GDate +GTime +GDateDMY +GDateDay +GDateMonth +GDateYear +GDateWeekday + + +G_DATE_BAD_DAY +G_DATE_BAD_JULIAN +G_DATE_BAD_YEAR + + +g_date_new +g_date_new_dmy +g_date_new_julian +g_date_clear +g_date_free + + +g_date_set_day +g_date_set_month +g_date_set_year +g_date_set_dmy +g_date_set_julian +g_date_set_time +g_date_set_time_t +g_date_set_time_val +g_date_set_parse + + +g_date_add_days +g_date_subtract_days +g_date_add_months +g_date_subtract_months +g_date_add_years +g_date_subtract_years +g_date_days_between +g_date_compare +g_date_clamp +g_date_order + + +g_date_get_day +g_date_get_month +g_date_get_year +g_date_get_julian +g_date_get_weekday +g_date_get_day_of_year + + +g_date_get_days_in_month +g_date_is_first_of_month +g_date_is_last_of_month +g_date_is_leap_year +g_date_get_monday_week_of_year +g_date_get_monday_weeks_in_year +g_date_get_sunday_week_of_year +g_date_get_sunday_weeks_in_year +g_date_get_iso8601_week_of_year + + +g_date_strftime +g_date_to_struct_tm + + +g_date_valid +g_date_valid_day +g_date_valid_month +g_date_valid_year +g_date_valid_dmy +g_date_valid_julian +g_date_valid_weekday + + +g_date_weekday +g_date_month +g_date_year +g_date_day +g_date_julian +g_date_day_of_year +g_date_monday_week_of_year +g_date_sunday_week_of_year +g_date_days_in_month +g_date_monday_weeks_in_year +g_date_sunday_weeks_in_year +tm +
+ +
+Hook Functions +hooks +GHookList +GHookFinalizeFunc +GHook +GHookFunc +GHookCheckFunc + + +g_hook_list_init +g_hook_list_invoke +g_hook_list_invoke_check +g_hook_list_marshal +GHookMarshaller +g_hook_list_marshal_check +GHookCheckMarshaller +g_hook_list_clear + + +g_hook_alloc +g_hook_append +g_hook_prepend +g_hook_insert_before +g_hook_insert_sorted +GHookCompareFunc +g_hook_compare_ids + + +g_hook_get +g_hook_find +GHookFindFunc +g_hook_find_data +g_hook_find_func +g_hook_find_func_data + + +g_hook_first_valid +g_hook_next_valid + +GHookFlagMask +G_HOOK_FLAGS +G_HOOK_FLAG_USER_SHIFT + + +G_HOOK +G_HOOK_IS_VALID +G_HOOK_ACTIVE +G_HOOK_IN_CALL +G_HOOK_IS_UNLINKED + + +g_hook_ref +g_hook_unref + +g_hook_free +g_hook_destroy +g_hook_destroy_link +
+ +
+Miscellaneous Utility Functions +misc_utils +g_get_application_name +g_set_application_name +g_get_prgname +g_set_prgname +g_getenv +g_setenv +g_unsetenv +g_listenv +g_get_user_name +g_get_real_name +g_get_user_cache_dir +g_get_user_data_dir +g_get_user_config_dir +GUserDirectory +g_get_user_special_dir +g_get_system_data_dirs +g_get_system_config_dirs +g_reload_user_special_dirs_cache + + +g_get_host_name +g_get_home_dir +g_get_tmp_dir +g_get_current_dir +g_basename +g_dirname +g_path_is_absolute +g_path_skip_root +g_path_get_basename +g_path_get_dirname +g_build_filename +g_build_filenamev +g_build_path +g_build_pathv +g_format_size_for_display + + +g_find_program_in_path + + +g_bit_nth_lsf +g_bit_nth_msf +g_bit_storage + + +g_spaced_primes_closest + + +g_atexit + + +g_parse_debug_string +GDebugKey + + +GVoidFunc +GFreeFunc + + +g_qsort_with_data + + +g_nullify_pointer + + +G_NATIVE_ATEXIT +g_ATEXIT +g_win32_get_system_data_dirs_for_module +ATEXIT + +
+ +
+Lexical Scanner +scanner +GScanner +GScannerConfig +g_scanner_new +g_scanner_destroy + + +g_scanner_input_file +g_scanner_sync_file_offset +g_scanner_input_text +g_scanner_peek_next_token +g_scanner_get_next_token +g_scanner_eof + + +g_scanner_cur_line +g_scanner_cur_position +g_scanner_cur_token +g_scanner_cur_value + + +g_scanner_set_scope +g_scanner_scope_add_symbol +g_scanner_scope_foreach_symbol +g_scanner_scope_lookup_symbol +g_scanner_scope_remove_symbol +g_scanner_add_symbol +g_scanner_remove_symbol +g_scanner_foreach_symbol + + +g_scanner_freeze_symbol_table +g_scanner_thaw_symbol_table +g_scanner_lookup_symbol + + +g_scanner_warn +g_scanner_error +g_scanner_unexp_token +GScannerMsgFunc + + +G_CSET_a_2_z +G_CSET_A_2_Z +G_CSET_DIGITS +G_CSET_LATINC +G_CSET_LATINS +GTokenType +GTokenValue +GErrorType + +
+ +
+Key-value file parser +keyfile +GKeyFile +G_KEY_FILE_ERROR +GKeyFileError +GKeyFileFlags + + +g_key_file_new +g_key_file_free +g_key_file_set_list_separator +g_key_file_load_from_file +g_key_file_load_from_data +g_key_file_load_from_data_dirs +g_key_file_load_from_dirs +g_key_file_to_data +g_key_file_get_start_group +g_key_file_get_groups +g_key_file_get_keys +g_key_file_has_group +g_key_file_has_key + + +g_key_file_get_value +g_key_file_get_string +g_key_file_get_locale_string +g_key_file_get_boolean +g_key_file_get_integer +g_key_file_get_double +g_key_file_get_string_list +g_key_file_get_locale_string_list +g_key_file_get_boolean_list +g_key_file_get_integer_list +g_key_file_get_double_list +g_key_file_get_comment + + +g_key_file_set_value +g_key_file_set_string +g_key_file_set_locale_string +g_key_file_set_boolean +g_key_file_set_integer +g_key_file_set_double +g_key_file_set_string_list +g_key_file_set_locale_string_list +g_key_file_set_boolean_list +g_key_file_set_integer_list +g_key_file_set_double_list +g_key_file_set_comment +g_key_file_remove_group +g_key_file_remove_key +g_key_file_remove_comment + + +G_KEY_FILE_DESKTOP_GROUP +G_KEY_FILE_DESKTOP_KEY_TYPE +G_KEY_FILE_DESKTOP_KEY_VERSION +G_KEY_FILE_DESKTOP_KEY_NAME +G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME +G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY +G_KEY_FILE_DESKTOP_KEY_COMMENT +G_KEY_FILE_DESKTOP_KEY_ICON +G_KEY_FILE_DESKTOP_KEY_HIDDEN +G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN +G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN +G_KEY_FILE_DESKTOP_KEY_TRY_EXEC +G_KEY_FILE_DESKTOP_KEY_EXEC +G_KEY_FILE_DESKTOP_KEY_PATH +G_KEY_FILE_DESKTOP_KEY_TERMINAL +G_KEY_FILE_DESKTOP_KEY_MIME_TYPE +G_KEY_FILE_DESKTOP_KEY_CATEGORIES +G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY +G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS +G_KEY_FILE_DESKTOP_KEY_URL +G_KEY_FILE_DESKTOP_TYPE_APPLICATION +G_KEY_FILE_DESKTOP_TYPE_LINK +G_KEY_FILE_DESKTOP_TYPE_DIRECTORY + + +g_key_file_error_quark +
+ +
+Bookmark file parser +bookmarkfile +GBookmarkFile +G_BOOKMARK_FILE_ERROR +GBookmarkFileError +g_bookmark_file_new +g_bookmark_file_free +g_bookmark_file_load_from_file +g_bookmark_file_load_from_data +g_bookmark_file_load_from_data_dirs +g_bookmark_file_to_data +g_bookmark_file_to_file +g_bookmark_file_has_item +g_bookmark_file_has_group +g_bookmark_file_has_application +g_bookmark_file_get_size +g_bookmark_file_get_uris G_GNUC_MALLOC + + +g_bookmark_file_get_title +g_bookmark_file_get_description +g_bookmark_file_get_mime_type +g_bookmark_file_get_is_private +g_bookmark_file_get_icon +g_bookmark_file_get_added +g_bookmark_file_get_modified +g_bookmark_file_get_visited +g_bookmark_file_get_groups +g_bookmark_file_get_applications +g_bookmark_file_get_app_info + + +g_bookmark_file_set_title +g_bookmark_file_set_description +g_bookmark_file_set_mime_type +g_bookmark_file_set_is_private +g_bookmark_file_set_icon +g_bookmark_file_set_added +g_bookmark_file_set_groups +g_bookmark_file_set_modified +g_bookmark_file_set_visited +g_bookmark_file_set_app_info +g_bookmark_file_add_group +g_bookmark_file_add_application +g_bookmark_file_remove_group +g_bookmark_file_remove_application +g_bookmark_file_remove_item +g_bookmark_file_move_item + + +g_bookmark_file_error_quark +
+ +
+Dynamic Loading of Modules +modules +gmodule.h +GModule +g_module_supported +g_module_build_path +g_module_open +GModuleFlags +g_module_symbol +g_module_name +g_module_make_resident +g_module_close +g_module_error + +GModuleCheckInit +GModuleUnload +G_MODULE_SUFFIX +G_MODULE_EXPORT +G_MODULE_IMPORT +
+ +
+Automatic String Completion +completion +GCompletion +g_completion_new +GCompletionFunc +g_completion_add_items +g_completion_remove_items +g_completion_clear_items +g_completion_complete +g_completion_complete_utf8 +g_completion_set_compare +GCompletionStrncmpFunc +g_completion_free +
+ +
+Windows Compatibility Functions +windows +MAXPATHLEN + +g_win32_error_message +g_win32_getlocale +g_win32_get_package_installation_directory +g_win32_get_package_installation_directory_of_module +g_win32_get_package_installation_subdirectory +g_win32_get_windows_version +g_win32_locale_filename_from_utf8 +G_WIN32_DLLMAIN_FOR_DLL_NAME +G_WIN32_HAVE_WIDECHAR_API +G_WIN32_IS_NT_BASED + + +g_win32_ftruncate + +
+ +# Data Structures + +
+Memory Chunks +memory_chunks +GMemChunk +G_ALLOC_AND_FREE +G_ALLOC_ONLY + + +g_mem_chunk_new +g_mem_chunk_alloc +g_mem_chunk_alloc0 +g_mem_chunk_free +g_mem_chunk_destroy + + +g_mem_chunk_create +g_chunk_new +g_chunk_new0 +g_chunk_free + + +g_mem_chunk_reset +g_mem_chunk_clean +g_blow_chunks + + +g_mem_chunk_info +g_mem_chunk_print + +
+ +
+Memory Slices +memory_slices +g_slice_alloc +g_slice_alloc0 +g_slice_copy +g_slice_free1 +g_slice_free_chain_with_offset + + +g_slice_new +g_slice_new0 +g_slice_dup +g_slice_free +g_slice_free_chain + + +GSliceConfig +g_slice_set_config +g_slice_get_config +g_slice_get_config_state +
+ +
+Doubly-Linked Lists +linked_lists_double +GList + + +g_list_append +g_list_prepend +g_list_insert +g_list_insert_before +g_list_insert_sorted +g_list_remove +g_list_remove_link +g_list_delete_link +g_list_remove_all +g_list_free + + +g_list_alloc +g_list_free_1 +g_list_free1 + + +g_list_length +g_list_copy +g_list_reverse +g_list_sort +GCompareFunc +g_list_insert_sorted_with_data +g_list_sort_with_data +GCompareDataFunc +g_list_concat +g_list_foreach +GFunc + + +g_list_first +g_list_last +g_list_previous +g_list_next +g_list_nth +g_list_nth_data +g_list_nth_prev + + +g_list_find +g_list_find_custom +g_list_position +g_list_index + + +g_list_push_allocator +g_list_pop_allocator +
+ +
+Singly-Linked Lists +linked_lists_single +GSList + + +g_slist_alloc +g_slist_append +g_slist_prepend +g_slist_insert +g_slist_insert_before +g_slist_insert_sorted +g_slist_remove +g_slist_remove_link +g_slist_delete_link +g_slist_remove_all +g_slist_free +g_slist_free_1 +g_slist_free1 + + +g_slist_length +g_slist_copy +g_slist_reverse +g_slist_insert_sorted_with_data +g_slist_sort +g_slist_sort_with_data +g_slist_concat +g_slist_foreach + + +g_slist_last +g_slist_next +g_slist_nth +g_slist_nth_data + + +g_slist_find +g_slist_find_custom +g_slist_position +g_slist_index + + +g_slist_push_allocator +g_slist_pop_allocator +
+ +
+Double-ended Queues +queue + +GQueue +g_queue_new +g_queue_free +G_QUEUE_INIT +g_queue_init +g_queue_clear +g_queue_is_empty +g_queue_get_length +g_queue_reverse +g_queue_copy +g_queue_foreach +g_queue_find +g_queue_find_custom +g_queue_sort +g_queue_push_head +g_queue_push_tail +g_queue_push_nth +g_queue_pop_head +g_queue_pop_tail +g_queue_pop_nth +g_queue_peek_head +g_queue_peek_tail +g_queue_peek_nth +g_queue_index +g_queue_remove +g_queue_remove_all +g_queue_insert_before +g_queue_insert_after +g_queue_insert_sorted +g_queue_push_head_link +g_queue_push_tail_link +g_queue_push_nth_link +g_queue_pop_head_link +g_queue_pop_tail_link +g_queue_pop_nth_link +g_queue_peek_head_link +g_queue_peek_tail_link +g_queue_peek_nth_link +g_queue_link_index +g_queue_unlink +g_queue_delete_link +
+ +
+Sequences +sequence + +GSequence +GSequenceIter +GSequenceIterCompareFunc + + +g_sequence_new +g_sequence_free +g_sequence_get_length +g_sequence_foreach +g_sequence_foreach_range +g_sequence_sort +g_sequence_sort_iter + + +g_sequence_get_begin_iter +g_sequence_get_end_iter +g_sequence_get_iter_at_pos +g_sequence_append +g_sequence_prepend +g_sequence_insert_before +g_sequence_move +g_sequence_swap +g_sequence_insert_sorted +g_sequence_insert_sorted_iter +g_sequence_sort_changed +g_sequence_sort_changed_iter +g_sequence_remove +g_sequence_remove_range +g_sequence_move_range +g_sequence_search +g_sequence_search_iter + + +g_sequence_get +g_sequence_set + + +g_sequence_iter_is_begin +g_sequence_iter_is_end +g_sequence_iter_next +g_sequence_iter_prev +g_sequence_iter_get_position +g_sequence_iter_move +g_sequence_iter_get_sequence + + +g_sequence_iter_compare +g_sequence_range_get_midpoint +
+ +
+Trash Stacks +trash_stack +GTrashStack + +g_trash_stack_push +g_trash_stack_pop +g_trash_stack_peek +g_trash_stack_height +
+ +
+Hash Tables +hash_tables +GHashTable +g_hash_table_new +g_hash_table_new_full +GHashFunc +GEqualFunc +g_hash_table_insert +g_hash_table_replace +g_hash_table_size +g_hash_table_lookup +g_hash_table_lookup_extended +g_hash_table_foreach +g_hash_table_find +GHFunc +g_hash_table_remove +g_hash_table_steal +g_hash_table_foreach_remove +g_hash_table_foreach_steal +g_hash_table_remove_all +g_hash_table_steal_all +g_hash_table_get_keys +g_hash_table_get_values +GHRFunc +g_hash_table_freeze +g_hash_table_thaw +g_hash_table_destroy +g_hash_table_ref +g_hash_table_unref +GHashTableIter +g_hash_table_iter_init +g_hash_table_iter_next +g_hash_table_iter_get_hash_table +g_hash_table_iter_remove +g_hash_table_iter_steal + + +g_direct_equal +g_direct_hash +g_int_equal +g_int_hash +g_int64_equal +g_int64_hash +g_double_equal +g_double_hash +g_str_equal +g_str_hash + +
+ +
+Strings +strings +GString +g_string_new +g_string_new_len +g_string_sized_new +g_string_assign +g_string_sprintf +g_string_sprintfa +g_string_vprintf +g_string_append_vprintf +g_string_printf +g_string_append_printf +g_string_append +g_string_append_c +g_string_append_unichar +g_string_append_len +g_string_append_uri_escaped +g_string_prepend +g_string_prepend_c +g_string_prepend_unichar +g_string_prepend_len +g_string_insert +g_string_insert_c +g_string_insert_unichar +g_string_insert_len +g_string_overwrite +g_string_overwrite_len +g_string_erase +g_string_truncate +g_string_set_size +g_string_free + + +g_string_up +g_string_down + + +g_string_hash +g_string_equal + +
+ +
+String Chunks +string_chunks +GStringChunk +g_string_chunk_new +g_string_chunk_insert +g_string_chunk_insert_const +g_string_chunk_insert_len +g_string_chunk_clear +g_string_chunk_free + +
+ +
+Arrays +arrays +GArray +g_array_new +g_array_sized_new +g_array_ref +g_array_unref +g_array_get_element_size +g_array_append_val +g_array_append_vals +g_array_prepend_val +g_array_prepend_vals +g_array_insert_val +g_array_insert_vals +g_array_remove_index +g_array_remove_index_fast +g_array_remove_range +g_array_sort +g_array_sort_with_data +g_array_index +g_array_set_size +g_array_free +
+ +
+Pointer Arrays +arrays_pointer +GPtrArray +g_ptr_array_new +g_ptr_array_sized_new +g_ptr_array_new_with_free_func +g_ptr_array_set_free_func +g_ptr_array_ref +g_ptr_array_unref +g_ptr_array_add +g_ptr_array_remove +g_ptr_array_remove_index +g_ptr_array_remove_fast +g_ptr_array_remove_index_fast +g_ptr_array_remove_range +g_ptr_array_sort +g_ptr_array_sort_with_data +g_ptr_array_set_size +g_ptr_array_index +g_ptr_array_free +g_ptr_array_foreach + +
+ +
+Byte Arrays +arrays_byte +GByteArray +g_byte_array_new +g_byte_array_sized_new +g_byte_array_ref +g_byte_array_unref +g_byte_array_append +g_byte_array_prepend +g_byte_array_remove_index +g_byte_array_remove_index_fast +g_byte_array_remove_range +g_byte_array_sort +g_byte_array_sort_with_data +g_byte_array_set_size +g_byte_array_free + +
+ +
+Balanced Binary Trees +trees-binary +GTree +g_tree_new +g_tree_ref +g_tree_unref +g_tree_new_with_data +g_tree_new_full +g_tree_insert +g_tree_replace +g_tree_nnodes +g_tree_height +g_tree_lookup +g_tree_lookup_extended +g_tree_foreach +g_tree_traverse +GTraverseFunc +GTraverseType +g_tree_search +g_tree_remove +g_tree_steal +g_tree_destroy +
+ +
+N-ary Trees +trees-nary +GNode +g_node_new +g_node_copy +GCopyFunc +g_node_copy_deep + + +g_node_insert +g_node_insert_before +g_node_insert_after +g_node_append +g_node_prepend + + +g_node_insert_data +g_node_insert_data_before +g_node_append_data +g_node_prepend_data + + +g_node_reverse_children +g_node_traverse +GTraverseFlags +GNodeTraverseFunc +g_node_children_foreach +GNodeForeachFunc + + +g_node_get_root +g_node_find +g_node_find_child +g_node_child_index +g_node_child_position +g_node_first_child +g_node_last_child +g_node_nth_child +g_node_first_sibling +g_node_next_sibling +g_node_prev_sibling +g_node_last_sibling + + +G_NODE_IS_LEAF +G_NODE_IS_ROOT +g_node_depth +g_node_n_nodes +g_node_n_children +g_node_is_ancestor +g_node_max_height + + +g_node_unlink +g_node_destroy + + +g_node_push_allocator +g_node_pop_allocator +
+ + +
+Quarks +quarks +GQuark +g_quark_from_string +g_quark_from_static_string +g_quark_to_string +g_quark_try_string +g_intern_string +g_intern_static_string +
+ +
+Keyed Data Lists +datalist +GData +g_datalist_init + + +g_datalist_id_set_data +g_datalist_id_set_data_full +g_datalist_id_get_data +g_datalist_id_remove_data +g_datalist_id_remove_no_notify + + +g_datalist_set_data +g_datalist_set_data_full +g_datalist_get_data +g_datalist_remove_data +g_datalist_remove_no_notify + + +g_datalist_foreach +g_datalist_clear +g_datalist_set_flags +g_datalist_unset_flags +g_datalist_get_flags +G_DATALIST_FLAGS_MASK +
+ + +
+Datasets +datasets +g_dataset_id_set_data +g_dataset_id_set_data_full +GDestroyNotify +g_dataset_id_get_data +g_dataset_id_remove_data +g_dataset_id_remove_no_notify + + +g_dataset_set_data +g_dataset_set_data_full +g_dataset_get_data +g_dataset_remove_data +g_dataset_remove_no_notify + + +g_dataset_foreach +GDataForeachFunc +g_dataset_destroy + +
+ +
+Relations and Tuples +relations +GRelation +g_relation_new +g_relation_index +g_relation_insert +g_relation_exists +g_relation_count +g_relation_select +g_relation_delete +g_relation_destroy + + +g_relation_print + + +GTuples +g_tuples_destroy +g_tuples_index +
+ +
+Caches +caches +GCache +g_cache_new +g_cache_insert +g_cache_remove +g_cache_destroy + + +g_cache_key_foreach +g_cache_value_foreach + + +GCacheDestroyFunc +GCacheDupFunc +GCacheNewFunc +
+ +
+Memory Allocators +allocators +GAllocator +g_allocator_new +g_allocator_free + + +G_ALLOCATOR_LIST +G_ALLOCATOR_NODE +G_ALLOCATOR_SLIST +
+ +
+Random Numbers +random_numbers +GRand +g_rand_new_with_seed +g_rand_new_with_seed_array +g_rand_new +g_rand_copy +g_rand_free +g_rand_set_seed +g_rand_set_seed_array +g_rand_boolean +g_rand_int +g_rand_int_range +g_rand_double +g_rand_double_range +g_random_set_seed +g_random_boolean +g_random_int +g_random_int_range +g_random_double +g_random_double_range +
+ +
+Character Set Conversion +conversions +g_convert +g_convert_with_fallback +GIConv +g_convert_with_iconv +G_CONVERT_ERROR +g_iconv_open +g_iconv +g_iconv_close +g_locale_to_utf8 +g_filename_to_utf8 +g_filename_from_utf8 +g_filename_from_uri +g_filename_to_uri +g_get_filename_charsets +g_filename_display_name +g_filename_display_basename +g_locale_from_utf8 +GConvertError + + +g_get_charset + + +g_convert_error_quark +
+ +
+Unicode Manipulation +unicode +gunichar +gunichar2 + + +g_unichar_validate +g_unichar_isalnum +g_unichar_isalpha +g_unichar_iscntrl +g_unichar_isdefined +g_unichar_isdigit +g_unichar_isgraph +g_unichar_islower +g_unichar_ismark +g_unichar_isprint +g_unichar_ispunct +g_unichar_isspace +g_unichar_istitle +g_unichar_isupper +g_unichar_isxdigit +g_unichar_iswide +g_unichar_iswide_cjk +g_unichar_iszerowidth +g_unichar_toupper +g_unichar_tolower +g_unichar_totitle +g_unichar_digit_value +g_unichar_xdigit_value +GUnicodeType +g_unichar_type +GUnicodeBreakType +g_unichar_break_type +g_unichar_combining_class +g_unicode_canonical_ordering +g_unicode_canonical_decomposition +g_unichar_get_mirror_char +GUnicodeScript +g_unichar_get_script + + +g_utf8_next_char +g_utf8_get_char +g_utf8_get_char_validated +g_utf8_offset_to_pointer +g_utf8_pointer_to_offset +g_utf8_prev_char +g_utf8_find_next_char +g_utf8_find_prev_char +g_utf8_strlen +g_utf8_strncpy +g_utf8_strchr +g_utf8_strrchr +g_utf8_strreverse +g_utf8_validate + + +g_utf8_strup +g_utf8_strdown +g_utf8_casefold +g_utf8_normalize +GNormalizeMode +g_utf8_collate +g_utf8_collate_key +g_utf8_collate_key_for_filename + + +g_utf8_to_utf16 +g_utf8_to_ucs4 +g_utf8_to_ucs4_fast +g_utf16_to_ucs4 +g_utf16_to_utf8 +g_ucs4_to_utf16 +g_ucs4_to_utf8 +g_unichar_to_utf8 +
+ +
+I18N +i18n +glib.h,glib/gi18n.h +Q_ +C_ +N_ +NC_ +g_dgettext +g_dngettext +g_dpgettext +g_dpgettext2 +g_strip_context + +g_get_language_names +
+ +
+Base64 Encoding +base64 +g_base64_encode_step +g_base64_encode_close +g_base64_encode +g_base64_decode_step +g_base64_decode +g_base64_decode_inplace +
+ +
+URI Functions +gurifuncs +G_URI_RESERVED_CHARS_ALLOWED_IN_PATH +G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT +G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO +G_URI_RESERVED_CHARS_GENERIC_DELIMITERS +G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS +g_uri_parse_scheme +g_uri_escape_string +g_uri_unescape_string +g_uri_unescape_segment +g_uri_list_extract_uris +
+ +
+Data Checksums +checksum +GChecksumType +g_checksum_type_get_length +GChecksum +g_checksum_new +g_checksum_copy +g_checksum_free +g_checksum_reset +g_checksum_update +g_checksum_get_string +g_checksum_get_digest + +g_compute_checksum_for_data +g_compute_checksum_for_string +
+ +
+Testing +testing +g_test_minimized_result +g_test_maximized_result +g_test_init +g_test_quick +g_test_slow +g_test_thorough +g_test_perf +g_test_verbose +g_test_quiet +g_test_run +g_test_add_func +g_test_add_data_func +g_test_add + +g_test_message +g_test_bug_base +g_test_bug +GTestLogFatalFunc +g_test_log_set_fatal_handler + +g_test_timer_start +g_test_timer_elapsed +g_test_timer_last + +g_test_queue_free +g_test_queue_destroy +g_test_queue_unref + +GTestTrapFlags +g_test_trap_fork +g_test_trap_has_passed +g_test_trap_reached_timeout +g_test_trap_assert_passed +g_test_trap_assert_failed +g_test_trap_assert_stdout +g_test_trap_assert_stdout_unmatched +g_test_trap_assert_stderr +g_test_trap_assert_stderr_unmatched + +g_test_rand_bit +g_test_rand_int +g_test_rand_int_range +g_test_rand_double +g_test_rand_double_range + +g_assert +g_assert_not_reached +g_assert_cmpstr +g_assert_cmpint +g_assert_cmpuint +g_assert_cmphex +g_assert_cmpfloat +g_assert_no_error +g_assert_error + +GTestCase +GTestSuite +g_test_create_case +g_test_create_suite +g_test_get_root +g_test_suite_add +g_test_suite_add_suite +g_test_run_suite + + +g_test_trap_assertions +g_assertion_message +g_assertion_message_expr +g_assertion_message_cmpstr +g_assertion_message_cmpnum +g_assertion_message_error + +g_test_add_vtable +GTestConfig +g_test_config_vars +GTestLogType +GTestLogMsg +GTestLogBuffer + +g_test_log_type_name +g_test_log_buffer_new +g_test_log_buffer_free +g_test_log_buffer_push +g_test_log_buffer_pop +g_test_log_msg_free +
+ +
+GVariantType +gvarianttype +GVariantType +G_VARIANT_TYPE_BOOLEAN +G_VARIANT_TYPE_BYTE +G_VARIANT_TYPE_INT16 +G_VARIANT_TYPE_UINT16 +G_VARIANT_TYPE_INT32 +G_VARIANT_TYPE_UINT32 +G_VARIANT_TYPE_INT64 +G_VARIANT_TYPE_UINT64 +G_VARIANT_TYPE_HANDLE +G_VARIANT_TYPE_DOUBLE +G_VARIANT_TYPE_STRING +G_VARIANT_TYPE_OBJECT_PATH +G_VARIANT_TYPE_SIGNATURE +G_VARIANT_TYPE_VARIANT +G_VARIANT_TYPE_ANY +G_VARIANT_TYPE_BASIC +G_VARIANT_TYPE_MAYBE +G_VARIANT_TYPE_ARRAY +G_VARIANT_TYPE_TUPLE +G_VARIANT_TYPE_UNIT +G_VARIANT_TYPE_DICT_ENTRY +G_VARIANT_TYPE_DICTIONARY + + +G_VARIANT_TYPE +g_variant_type_free +g_variant_type_copy +g_variant_type_new + + +g_variant_type_string_is_valid +g_variant_type_string_scan +g_variant_type_get_string_length +g_variant_type_peek_string +g_variant_type_dup_string + + +g_variant_type_is_definite +g_variant_type_is_container +g_variant_type_is_basic +g_variant_type_is_maybe +g_variant_type_is_array +g_variant_type_is_tuple +g_variant_type_is_dict_entry +g_variant_type_is_variant + + +g_variant_type_hash +g_variant_type_equal +g_variant_type_is_subtype_of + + +g_variant_type_new_maybe +g_variant_type_new_array +g_variant_type_new_tuple +g_variant_type_new_dict_entry + + +g_variant_type_element +g_variant_type_n_items +g_variant_type_first +g_variant_type_next +g_variant_type_key +g_variant_type_value +
+ +
+GVariant +gvariant +GVariant +g_variant_unref +g_variant_ref +g_variant_ref_sink +g_variant_get_type +g_variant_get_type_string +g_variant_is_of_type +g_variant_is_container + + +g_variant_classify +GVariantClass + + +g_variant_get +g_variant_get_va +g_variant_new +g_variant_new_va + + +g_variant_new_boolean +g_variant_new_byte +g_variant_new_int16 +g_variant_new_uint16 +g_variant_new_int32 +g_variant_new_uint32 +g_variant_new_int64 +g_variant_new_uint64 +g_variant_new_handle +g_variant_new_double +g_variant_new_string +g_variant_new_object_path +g_variant_is_object_path +g_variant_new_signature +g_variant_is_signature +g_variant_new_variant +g_variant_new_strv + + +g_variant_get_boolean +g_variant_get_byte +g_variant_get_int16 +g_variant_get_uint16 +g_variant_get_int32 +g_variant_get_uint32 +g_variant_get_int64 +g_variant_get_uint64 +g_variant_get_handle +g_variant_get_double +g_variant_get_string +g_variant_dup_string +g_variant_get_variant +g_variant_get_strv +g_variant_dup_strv + + +g_variant_new_maybe +g_variant_new_array +g_variant_new_tuple +g_variant_new_dict_entry + + +g_variant_get_maybe +g_variant_n_children +g_variant_get_child_value +g_variant_get_child +g_variant_get_fixed_array + + +g_variant_get_size +g_variant_get_data +g_variant_store +g_variant_new_from_data +g_variant_byteswap +g_variant_get_normal_form +g_variant_is_normal_form + + +g_variant_hash +g_variant_equal + + +g_variant_print +g_variant_print_string + + +GVariantIter +g_variant_iter_copy +g_variant_iter_free +g_variant_iter_init +g_variant_iter_n_children +g_variant_iter_new +g_variant_iter_next_value +g_variant_iter_next +g_variant_iter_loop + + +GVariantBuilder +g_variant_builder_unref +g_variant_builder_ref +g_variant_builder_new +g_variant_builder_init +g_variant_builder_clear +g_variant_builder_add_value +g_variant_builder_add +g_variant_builder_end +g_variant_builder_open +g_variant_builder_close + + +G_VARIANT_PARSE_ERROR +g_variant_parse +g_variant_new_parsed_va +g_variant_new_parsed + + +g_variant_parser_get_error_quark +g_variant_type_checked_ +
+ + +
+ghostutils +Hostname Utilities +g_hostname_to_ascii +g_hostname_to_unicode + +g_hostname_is_non_ascii +g_hostname_is_ascii_encoded + +g_hostname_is_ip_address +
diff --git a/docs/reference/glib/glib.types b/docs/reference/glib/glib.types new file mode 100644 index 0000000..e69de29 diff --git a/docs/reference/glib/gtester-report.1 b/docs/reference/glib/gtester-report.1 new file mode 100644 index 0000000..49b8484 --- /dev/null +++ b/docs/reference/glib/gtester-report.1 @@ -0,0 +1,44 @@ +'\" t +.\" Title: gtester-report +.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] +.\" Generator: DocBook XSL Stylesheets v1.74.2 +.\" Date: 03/13/2009 +.\" Manual: [FIXME: manual] +.\" Source: [FIXME: source] +.\" Language: English +.\" +.TH "GTESTER\-REPORT" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +gtester-report \- test report formatting utility +.SH "SYNOPSIS" +.HP \w'\fBgtester\-report\fR\ 'u +\fBgtester\-report\fR [option...] [gtester\-log] +.SH "DESCRIPTION" +.PP +\fBgtester\-report\fR +is a script which converts the XML output generated by gtester into HTML\&. +.SS "Options" +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +print help and exit +.RE +.PP +\fB\-v\fR, \fB\-\-version\fR +.RS 4 +print version information and exit +.RE +.SH "SEE ALSO" +.PP + +\fBgtester\fR(1) diff --git a/docs/reference/glib/gtester-report.xml b/docs/reference/glib/gtester-report.xml new file mode 100644 index 0000000..614341d --- /dev/null +++ b/docs/reference/glib/gtester-report.xml @@ -0,0 +1,54 @@ + + + +gtester-report +1 + + + +gtester-report +test report formatting utility + + + + +gtester-report +option +gtester-log + + + +Description +gtester-report is a script which converts +the XML output generated by gtester into HTML. + + +Options + + + +, + +print help and exit + + + + +, + +print version information and exit + + + + + + + +See also + +gtester(1) + + + + + diff --git a/docs/reference/glib/gtester.1 b/docs/reference/glib/gtester.1 new file mode 100644 index 0000000..50c1022 --- /dev/null +++ b/docs/reference/glib/gtester.1 @@ -0,0 +1,101 @@ +'\" t +.\" Title: gtester +.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] +.\" Generator: DocBook XSL Stylesheets v1.74.2 +.\" Date: 03/13/2009 +.\" Manual: [FIXME: manual] +.\" Source: [FIXME: source] +.\" Language: English +.\" +.TH "GTESTER" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +gtester \- test running utility +.SH "SYNOPSIS" +.HP \w'\fBgtester\fR\ 'u +\fBgtester\fR [option...] [testprogram] +.SH "DESCRIPTION" +.PP +\fBgtester\fR +is a utility to run unit tests that have been written using the GLib test framework\&. +.PP +When called with the +\fB\-o\fR +option, +\fBgtester\fR +writes an XML report of the test results, which can be converted into HTML using the +\fBgtester\-report\fR +utility\&. +.SS "Options" +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +print help and exit +.RE +.PP +\fB\-v\fR, \fB\-\-version\fR +.RS 4 +print version information and exit +.RE +.PP +\fB\-\-g\-fatal\-warnings\fR +.RS 4 +make warnings fatal +.RE +.PP +\fB\-k\fR, \fB\-\-keep\-going\fR +.RS 4 +continue running after tests failed +.RE +.PP +\fB\-l\fR +.RS 4 +list paths of available test cases +.RE +.PP +\fB\-m=\fR\fB\fIMODE\fR\fR +.RS 4 +run test cases in +\fIMODE\fR, which can be perf, slow, thorough or quick\&. The default mode is quick\&. +.RE +.PP +\fB\-p=\fR\fB\fITESTPATH\fR\fR +.RS 4 +only run test cases matching +\fITESTPATH\fR +.RE +.PP +\fB\-\-seed=\fR\fB\fISEEDSTRING\fR\fR +.RS 4 +run all test cases with random number seed +\fISEEDSTRING\fR +.RE +.PP +\fB\-o=\fR\fB\fILOGFILE\fR\fR +.RS 4 +write the test log to +\fILOGFILE\fR +.RE +.PP +\fB\-q\fR, \fB\-\-quiet\fR +.RS 4 +suppress per test binary output +.RE +.PP +\fB\-\-verbose\fR +.RS 4 +report success per testcase +.RE +.SH "SEE ALSO" +.PP + +\fBgtester\-report\fR(1) diff --git a/docs/reference/glib/gtester.xml b/docs/reference/glib/gtester.xml new file mode 100644 index 0000000..840dbea --- /dev/null +++ b/docs/reference/glib/gtester.xml @@ -0,0 +1,120 @@ + + + +gtester +1 + + + +gtester +test running utility + + + + +gtester +option +testprogram + + + +Description +gtester is a utility to run unit tests that have +been written using the GLib test framework. + + +When called with the option, gtester +writes an XML report of the test results, which can be converted +into HTML using the gtester-report utility. + + +Options + + + +, + +print help and exit + + + + +, + +print version information and exit + + + + + + +make warnings fatal + + + + +, + +continue running after tests failed + + + + + + +list paths of available test cases + + + + + + +run test cases in MODE, which can be perf, slow, thorough or quick. The default mode is quick. + + + + + + +only run test cases matching TESTPATH + + + + + + +run all test cases with random number seed SEEDSTRING + + + + + + +write the test log to LOGFILE + + + + +, + +suppress per test binary output + + + + + + +report success per testcase + + + + + + + +See also + +gtester-report(1) + + + diff --git a/docs/reference/glib/gvariant-varargs.xml b/docs/reference/glib/gvariant-varargs.xml new file mode 100644 index 0000000..702235c --- /dev/null +++ b/docs/reference/glib/gvariant-varargs.xml @@ -0,0 +1,970 @@ + + + + + GVariant Format Strings + + + + Variable Argument Conversions + + + This page attempts to document how to perform variable argument conversions with GVariant. + + + Conversions occur according to format strings. A format string is a two-way mapping between a single + GVariant value and one or more C values. + + + A conversion from C values into a GVariant value is made using the + g_variant_new() function. A conversion from a + GVariant into C values is made using the + g_variant_get() function. + + + + + Syntax + + + This section exhaustively describes all possibilities for GVariant format strings. There are no valid forms of + format strings other than those described here. Please note that the format string syntax is likely to expand in the + future. + + + Valid format strings have one of the following forms: + + + + any type string + + + + a type string prefixed with a '@' + + + + + '&s' '&o', '&g', '^as', + '^ao', '^ag', '^a&s', '^a&o' or + '^a&g' + + + + + any format string, prefixed with an 'm' + + + + + a sequence of zero or more format strings strings, concatenated and enclosed in parentheses + + + + + an opening brace, followed by two format strings, followed by a closing brace (subject to the constraint that the + first format string correspond to a type valid for use as the key type of a dictionary) + + + + + + Symbols + + + The following table describes the rough meaning of symbols that may appear inside a GVariant format string. Each + symbol is described in detail in its own section, including usage examples. + + + + + + + + + + + + Symbol + + + + + Meaning + + + + + + + + + b, y, n, q, i, + u, x, t, h, d + + + + + + Used for building or deconstructing boolean, byte and numeric types. See + Numeric Types below. + + + + + + + + + s, o, g + + + + + + Used for building or deconstructing string types. See + Strings below. + + + + + + + + v + + + + + Used for building or deconstructing variant types. See + Variants below. + + + + + + + + + a + + + + + + Used for building or deconstructing arrays. See + Arrays below. + + + + + + + + + m + + + + + + Used for building or deconstructing maybe types. See + Maybe Types below. + + + + + + + + + () + + + + + + Used for building or deconstructing tuples. See + Tuples below. + + + + + + + + + {} + + + + + + Used for building or deconstructing dictionary entries. See + Dictionaries below. + + + + + + + + + @ + + + + + + Used as a prefix on a GVariant type string (not format string). Denotes that a pointer to a + GVariant should be used in place of the normal C type or types. For + g_variant_new() this means that you must pass a + non-NULL (GVariant + *). For g_variant_get() this means that you + must pass a pointer to a (GVariant *) for the value to be returned + by reference or NULL to ignore the value. See + GVariant * below. + + + + + + + + + *, ?, r + + + + + + Exactly equivalent to @*, @? and @r. Provided only for + completeness so that all GVariant type strings can be used also as format strings. See GVariant * below. + + + + + + + + & + + + + + Used as a prefix on a GVariant type string (not format string). Denotes that a C pointer to serialised data + should be used in place of the normal C type. See + Pointers below. + + + + + + + + ^ + + + + + Used as a prefix on some specific types of format strings. See + Convenience Conversions below. + + + + + + + + + + Numeric Types + + + Characters: b, y, n, q, + i, u, x, t, h, + d + + + + + Variable argument conversions from numeric types work in the most obvious way possible. Upon encountering one of + these characters, g_variant_new() takes the equivalent C + type as an argument. g_variant_get() takes a pointer to + the equivalent C type (or NULL to ignore the value). + + + + The equivalent C types are as follows: + + + + + + + + + + Character + + + + + Equivalent C type + + + + + + + + b + + + + + + gboolean + + + + + + + + y + + + + + + guchar + + + + + + + + n + + + + + + gint16 + + + + + + + + q + + + + + + guint16 + + + + + + + + i + + + + + + gint32 + + + + + + + + u + + + + + + guint32 + + + + + + + + x + + + + + + gint64 + + + + + + + + t + + + + + + guint64 + + + + + + + + h + + + + + + gint32 + + + + + + + + d + + + + + + gdouble + + + + + + + + + Note that in C, small integer types in variable argument lists are promoted up to int or unsigned int as appropriate, and + read back accordingly. int is 32 bits on every platform on which GLib is + currently suported. This means that you can use C expressions of type int + with g_variant_new() and format characters + 'b', 'y', 'n', 'q', + 'i', 'u' and 'h'. Specifically, you can use integer + literals with these characters. + + + + When using the 'x' and 't' characters, you must ensure that the value that you + provide is 64 bit. This means that you should use a cast or make use of the + G_GINT64_CONSTANT or + G_GUINT64_CONSTANT macros. + + + + No type promotion occurs when using g_variant_get() since + it operates with pointers. The pointers must always point to a memory region of exactly the correct size. + + + + Examples + + + + + + + Strings + + + Characters: s, o, g + + + + + String conversions occur to and from standard nul-terminated C strings. Upon encountering an + 's', 'o' or 'g' in a format string, + g_variant_new() takes a (const + gchar *) and makes a copy of it. + NULL is not a valid string. If the 'o' or + 'g' characters are used, care must be taken to ensure that the passed string is a valid DBus + object path or DBus type signature, respectively. + + + Upon encounting 's', 'o' or 'g', g_variant_get() takes a pointer to a + (gchar *) (ie: (gchar **)) and + sets it to a newly-allocated copy of the string. It is appropriate to free this copy using + g_free(). + NULL may also be passed to indicate that the value of the + string should be ignored (in which case no copy is made). + + + + Examples + + + + + + + Variants + + + Characters: v + + + + + Upon encountering a 'v', + g_variant_new() takes a (GVariant *). The value of the + GVariant is used as the contents of the variant value. + + + Upon encountering a 'v', g_variant_get() takes a pointer to a + (GVariant *) (ie: (GVariant **) + ). It is set to a new reference to a GVariant instance + containing the contents of the variant value. It is appropriate to free this reference using + g_variant_unref(). + NULL may also be passed to indicate that the value should be + ignored (in which case no new reference is created). + + + + Examples + + + + + + + + Arrays + + + Characters: a + + + + + Upon encountering an 'a' character followed by a type string, + g_variant_new() will take a + (GVariantBuilder *) that has been created as an array builder + for an array of the type given in the type string. The builder will have + g_variant_builder_end() called on it and the + result will be used as the value. As a special exception, if the given type string is a definite type, then + NULL may be given to mean an empty array of that type. + + + + Upon encountering an 'a' character followed by a type string, + g_variant_get() will take a pointer to a + (GVariantIter *) (ie: + (GVariantIter **)). + A new heap-allocated iterator is created and returned, initialised for iterating over the elements of the array. + This iterator should be freed when you are done with it, using + g_variant_iter_unref(). + NULL may also be given to indicate that the value of the array + should be ignored. + + + + Examples + + + + + + + Maybe Types + + + Characters: m + + + + Maybe types are handled in two separate ways depending on the format string that follows the + 'm'. The method that is used currently depends entirely on the character immediately following the + 'm'. + + + + The first way is used with format strings starting with 's', 'o', + 'g', 'v', '@', '*', + '?', 'r', '&', or '^'. In all of + these cases, for non-maybe types, g_variant_new() takes + a pointer to a non-NULL value and + g_variant_get() returns (by reference) a + non-NULL pointer. When any of these format strings are + prefixed with an 'm', the type of arguments that are collected does not change in any way, but + NULL becomes a permissable value, to indicate the Nothing case. + + + The second way is used with all other format strings. For + g_variant_new() an additional + gboolean argument is collected and for + g_variant_get() an additional + (gboolean *). Following this argument, the arguments that are normally + collected for the equivalent non-maybe type will be collected. + + + If FALSE is given to + g_variant_new() then the Nothing value is constructed and + the collected arguments are ignored. Otherwise (if TRUE was + given), the arguments are used in the normal way to create the Just value. + + + If NULL is given to + g_variant_get() then the value is ignored. If a + non-NULL pointer is given then it is used to return by reference + whether the value was Just. In the case that the value was Just, the + gboolean will be set to + TRUE and the value will be stored in the arguments in the usual + way. In the case that the value was Nothing, the gboolean will be set to + FALSE and the arguments will be collected in the normal way + but have their values set to binary zero. + + + + Examples + + + + + + + Tuples + + + Characters: () + + + + + Tuples are handled by handling each item in the tuple, in sequence. Each item is handled in the usual way. + + + + Examples + + + + + + + Dictionaries + + + Characters: {} + + + + + Dictionary entries are handled by handling first the key, then the value. Each is handled in the usual way. + + + + Examples + + + + + + + GVariant * + + + Characters: @, *, ?, r + + + + + Upon encountering a '@' in front of a type string, + g_variant_new() takes a + non-NULL pointer to a + GVariant and uses its value directly instead of collecting arguments to + create the value. The provided GVariant must have a type that matches the + type string following the '@'. '*' is + the same as '@*' (ie: take a GVariant of any type). + '?' is the same as '@?' (ie: take a + GVariant of any basic type). 'r' is the same as + '@r' (ie: take a GVariant of any tuple type). + + + Upon encountering a '@' in front of a type string, + g_variant_get() + takes a pointer to a (GVariant *) (ie: a + (GVariant **)) and sets it to a new reference to a + GVariant containing the value (instead of deconstructing the value into + C types in the usual way). NULL can be given to ignore the + value. '*', '?' and 'r' are handled in a way analogous to + what is stated above. + + + You can always use '*' as an alternative to '?', 'r' or any + use of '@'. Using the other characters where possible is recommended, however, due to the + improvements in type safety and code self-documentation. + + + + Examples + + + + + + + Pointers + + + Characters: & + + + + + The '&' character is used to indicate that serialised data should be directly exchanged via a + pointer. + + + Currently, the only use for this character is when it is applied to a string (ie: '&s', + '&o' or '&g'). For + g_variant_new() this has absolutely no effect. The string + is collected and duplicated normally. For g_variant_get() + it means that instead of creating a newly allocated copy of the string, a pointer to the serialised data is + returned. This pointer should not be freed. Validity checks are performed to ensure that the string data will + always be properly nul-terminated. + + + + Examples + + + + + + + Convenience Conversions + + + Characters: ^ + + + + + The '^' character currently only has one purpose: to convert to and from + G_TYPE_STRV type arrays of strings. It is always used with + arrays of strings (or other string types). It has two forms. + + + + + '^as' (or o or g) + + + + + '^a&s' (or o or g) + + + + + When used with g_variant_new() both forms are equivalent. + A (const gchar * const *) is collected. This must be a pointer to the + array of NULL-terminated pointers to strings. This array is + converted to a GVariant instance. Copies are made, so the original + array may be freed immediately. + + + When used with g_variant_get() the two forms have + different meaning. Both return a freshly allocated + NULL-terminated array of pointers to strings. In the case of + '^as', the strings are owned by the caller -- it is appropriate to free the array with + g_strfreev(). In the case of '^a&s', + a shallow copy is made; the strings themselves are embedded in the serialised data and owned by the original + GVariant instance -- it is only appropriate to free the outer array + with g_free(). + + + + diff --git a/docs/reference/glib/html/api-index-2-10.html b/docs/reference/glib/html/api-index-2-10.html new file mode 100644 index 0000000..b1f87f1 --- /dev/null +++ b/docs/reference/glib/html/api-index-2-10.html @@ -0,0 +1,140 @@ + + + + +Index of new symbols in 2.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-12.html b/docs/reference/glib/html/api-index-2-12.html new file mode 100644 index 0000000..9f231cd --- /dev/null +++ b/docs/reference/glib/html/api-index-2-12.html @@ -0,0 +1,206 @@ + + + + +Index of new symbols in 2.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.12

+

A

+
g_ascii_strtoll
+
+

B

+
g_base64_decode
+
+
g_base64_decode_step
+
+
g_base64_encode
+
+
g_base64_encode_close
+
+
g_base64_encode_step
+
+
g_bookmark_file_add_application
+
+
g_bookmark_file_add_group
+
+
g_bookmark_file_free
+
+
g_bookmark_file_get_added
+
+
g_bookmark_file_get_applications
+
+
g_bookmark_file_get_app_info
+
+
g_bookmark_file_get_description
+
+
g_bookmark_file_get_groups
+
+
g_bookmark_file_get_icon
+
+
g_bookmark_file_get_is_private
+
+
g_bookmark_file_get_mime_type
+
+
g_bookmark_file_get_modified
+
+
g_bookmark_file_get_size
+
+
g_bookmark_file_get_title
+
+
g_bookmark_file_get_uris
+
+
g_bookmark_file_get_visited
+
+
g_bookmark_file_has_application
+
+
g_bookmark_file_has_group
+
+
g_bookmark_file_has_item
+
+
g_bookmark_file_load_from_data
+
+
g_bookmark_file_load_from_data_dirs
+
+
g_bookmark_file_load_from_file
+
+
g_bookmark_file_move_item
+
+
g_bookmark_file_new
+
+
g_bookmark_file_remove_application
+
+
g_bookmark_file_remove_group
+
+
g_bookmark_file_remove_item
+
+
g_bookmark_file_set_added
+
+
g_bookmark_file_set_app_info
+
+
g_bookmark_file_set_description
+
+
g_bookmark_file_set_groups
+
+
g_bookmark_file_set_icon
+
+
g_bookmark_file_set_is_private
+
+
g_bookmark_file_set_mime_type
+
+
g_bookmark_file_set_modified
+
+
g_bookmark_file_set_title
+
+
g_bookmark_file_set_visited
+
+
g_bookmark_file_to_data
+
+
g_bookmark_file_to_file
+
+

H

+
g_hash_table_remove_all
+
+
g_hash_table_steal_all
+
+

K

+
g_key_file_get_double
+
+
g_key_file_get_double_list
+
+
g_key_file_set_double
+
+
g_key_file_set_double_list
+
+

M

+
g_main_current_source
+
+

O

+
g_option_context_get_description
+
+
g_option_context_get_summary
+
+
g_option_context_set_description
+
+
g_option_context_set_summary
+
+
g_option_context_set_translate_func
+
+
g_option_context_set_translation_domain
+
+

S

+
g_source_is_destroyed
+
+
g_source_set_funcs
+
+

T

+
g_time_val_from_iso8601
+
+
g_time_val_to_iso8601
+
+

U

+
g_unichar_iswide_cjk
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-14.html b/docs/reference/glib/html/api-index-2-14.html new file mode 100644 index 0000000..af0645a --- /dev/null +++ b/docs/reference/glib/html/api-index-2-14.html @@ -0,0 +1,333 @@ + + + + +Index of new symbols in 2.14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.14

+

G

+
g_get_user_special_dir
+
+

H

+
g_hash_table_get_keys
+
+
g_hash_table_get_values
+
+

K

+
G_KEY_FILE_DESKTOP_GROUP
+
+
G_KEY_FILE_DESKTOP_KEY_CATEGORIES
+
+
G_KEY_FILE_DESKTOP_KEY_COMMENT
+
+
G_KEY_FILE_DESKTOP_KEY_EXEC
+
+
G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME
+
+
G_KEY_FILE_DESKTOP_KEY_HIDDEN
+
+
G_KEY_FILE_DESKTOP_KEY_ICON
+
+
G_KEY_FILE_DESKTOP_KEY_MIME_TYPE
+
+
G_KEY_FILE_DESKTOP_KEY_NAME
+
+
G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN
+
+
G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY
+
+
G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN
+
+
G_KEY_FILE_DESKTOP_KEY_PATH
+
+
G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY
+
+
G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS
+
+
G_KEY_FILE_DESKTOP_KEY_TERMINAL
+
+
G_KEY_FILE_DESKTOP_KEY_TRY_EXEC
+
+
G_KEY_FILE_DESKTOP_KEY_TYPE
+
+
G_KEY_FILE_DESKTOP_KEY_URL
+
+
G_KEY_FILE_DESKTOP_KEY_VERSION
+
+
G_KEY_FILE_DESKTOP_TYPE_APPLICATION
+
+
G_KEY_FILE_DESKTOP_TYPE_DIRECTORY
+
+
G_KEY_FILE_DESKTOP_TYPE_LINK
+
+
g_key_file_load_from_dirs
+
+

M

+
GMatchInfo
+
+
g_match_info_expand_references
+
+
g_match_info_fetch
+
+
g_match_info_fetch_all
+
+
g_match_info_fetch_named
+
+
g_match_info_fetch_named_pos
+
+
g_match_info_fetch_pos
+
+
g_match_info_free
+
+
g_match_info_get_match_count
+
+
g_match_info_get_regex
+
+
g_match_info_get_string
+
+
g_match_info_is_partial_match
+
+
g_match_info_matches
+
+
g_match_info_next
+
+
G_MAXSSIZE
+
+
G_MINSSIZE
+
+

O

+
g_once_init_enter
+
+
g_once_init_leave
+
+
g_option_context_get_help
+
+

Q

+
g_queue_clear
+
+
g_queue_init
+
+
G_QUEUE_INIT
+
+

R

+
GRegex
+
+
GRegexCompileFlags
+
+
GRegexError
+
+
GRegexEvalCallback
+
+
GRegexMatchFlags
+
+
g_regex_check_replacement
+
+
G_REGEX_ERROR
+
+
g_regex_escape_string
+
+
g_regex_get_capture_count
+
+
g_regex_get_max_backref
+
+
g_regex_get_pattern
+
+
g_regex_get_string_number
+
+
g_regex_match
+
+
g_regex_match_all
+
+
g_regex_match_all_full
+
+
g_regex_match_full
+
+
g_regex_match_simple
+
+
g_regex_new
+
+
g_regex_ref
+
+
g_regex_replace
+
+
g_regex_replace_eval
+
+
g_regex_replace_literal
+
+
g_regex_split
+
+
g_regex_split_full
+
+
g_regex_split_simple
+
+
g_regex_unref
+
+

S

+
g_sequence_append
+
+
g_sequence_foreach
+
+
g_sequence_foreach_range
+
+
g_sequence_free
+
+
g_sequence_get
+
+
g_sequence_get_begin_iter
+
+
g_sequence_get_end_iter
+
+
g_sequence_get_iter_at_pos
+
+
g_sequence_get_length
+
+
g_sequence_insert_before
+
+
g_sequence_insert_sorted
+
+
g_sequence_insert_sorted_iter
+
+
g_sequence_iter_compare
+
+
g_sequence_iter_get_position
+
+
g_sequence_iter_get_sequence
+
+
g_sequence_iter_is_begin
+
+
g_sequence_iter_is_end
+
+
g_sequence_iter_move
+
+
g_sequence_iter_next
+
+
g_sequence_iter_prev
+
+
g_sequence_move
+
+
g_sequence_move_range
+
+
g_sequence_new
+
+
g_sequence_prepend
+
+
g_sequence_range_get_midpoint
+
+
g_sequence_remove
+
+
g_sequence_remove_range
+
+
g_sequence_search
+
+
g_sequence_search_iter
+
+
g_sequence_set
+
+
g_sequence_sort
+
+
g_sequence_sort_changed
+
+
g_sequence_sort_changed_iter
+
+
g_sequence_sort_iter
+
+
g_sequence_swap
+
+
g_slice_copy
+
+
g_slice_dup
+
+
g_string_append_vprintf
+
+
g_string_chunk_clear
+
+
g_string_overwrite
+
+
g_string_overwrite_len
+
+
g_string_vprintf
+
+

T

+
g_timeout_add_seconds
+
+
g_timeout_add_seconds_full
+
+
g_timeout_source_new_seconds
+
+

U

+
g_unichar_combining_class
+
+
g_unichar_get_script
+
+
g_unichar_ismark
+
+
g_unichar_iszerowidth
+
+
GUserDirectory
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-16.html b/docs/reference/glib/html/api-index-2-16.html new file mode 100644 index 0000000..9760a76 --- /dev/null +++ b/docs/reference/glib/html/api-index-2-16.html @@ -0,0 +1,234 @@ + + + + +Index of new symbols in 2.16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.16

+

A

+
g_assert_cmpfloat
+
+
g_assert_cmphex
+
+
g_assert_cmpint
+
+
g_assert_cmpstr
+
+
g_assert_cmpuint
+
+
g_async_queue_new_full
+
+

C

+
GChecksum
+
+
GChecksumType
+
+
g_checksum_copy
+
+
g_checksum_free
+
+
g_checksum_get_digest
+
+
g_checksum_get_string
+
+
g_checksum_new
+
+
g_checksum_type_get_length
+
+
g_checksum_update
+
+
g_compute_checksum_for_data
+
+
g_compute_checksum_for_string
+
+
C_
+
+

D

+
g_dpgettext
+
+

F

+
g_format_size_for_display
+
+

H

+
g_hash_table_iter_get_hash_table
+
+
g_hash_table_iter_init
+
+
g_hash_table_iter_next
+
+
g_hash_table_iter_remove
+
+
g_hash_table_iter_steal
+
+

M

+
g_markup_collect_attributes
+
+
g_markup_parse_context_get_element_stack
+
+

P

+
g_prefix_error
+
+
g_propagate_prefixed_error
+
+

S

+
g_strcmp0
+
+
g_string_append_uri_escaped
+
+

T

+
g_test_add
+
+
g_test_add_data_func
+
+
g_test_add_func
+
+
g_test_bug
+
+
g_test_bug_base
+
+
g_test_create_case
+
+
g_test_create_suite
+
+
g_test_get_root
+
+
g_test_init
+
+
g_test_maximized_result
+
+
g_test_message
+
+
g_test_minimized_result
+
+
g_test_queue_destroy
+
+
g_test_queue_free
+
+
g_test_queue_unref
+
+
g_test_rand_bit
+
+
g_test_rand_double
+
+
g_test_rand_double_range
+
+
g_test_rand_int
+
+
g_test_rand_int_range
+
+
g_test_run
+
+
g_test_run_suite
+
+
g_test_suite_add
+
+
g_test_suite_add_suite
+
+
g_test_timer_elapsed
+
+
g_test_timer_last
+
+
g_test_timer_start
+
+
g_test_trap_assert_failed
+
+
g_test_trap_assert_passed
+
+
g_test_trap_assert_stderr
+
+
g_test_trap_assert_stderr_unmatched
+
+
g_test_trap_assert_stdout
+
+
g_test_trap_assert_stdout_unmatched
+
+
g_test_trap_fork
+
+
g_test_trap_has_passed
+
+
g_test_trap_reached_timeout
+
+

U

+
g_uri_escape_string
+
+
g_uri_parse_scheme
+
+
g_uri_unescape_segment
+
+
g_uri_unescape_string
+
+

W

+
g_warn_if_fail
+
+
g_warn_if_reached
+
+
g_win32_get_package_installation_directory_of_module
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-18.html b/docs/reference/glib/html/api-index-2-18.html new file mode 100644 index 0000000..325e40d --- /dev/null +++ b/docs/reference/glib/html/api-index-2-18.html @@ -0,0 +1,98 @@ + + + + +Index of new symbols in 2.18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-2.html b/docs/reference/glib/html/api-index-2-2.html new file mode 100644 index 0000000..dcef9d0 --- /dev/null +++ b/docs/reference/glib/html/api-index-2-2.html @@ -0,0 +1,112 @@ + + + + +Index of new symbols in 2.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-20.html b/docs/reference/glib/html/api-index-2-20.html new file mode 100644 index 0000000..a6842df --- /dev/null +++ b/docs/reference/glib/html/api-index-2-20.html @@ -0,0 +1,87 @@ + + + + +Index of new symbols in 2.20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.20

+

A

+
g_assert_error
+
+
g_assert_no_error
+
+

B

+
g_base64_decode_inplace
+
+

G

+
G_GOFFSET_MODIFIER
+
+

P

+
G_PASTE
+
+
g_poll
+
+

S

+
G_STATIC_ASSERT
+
+

T

+
g_thread_get_initialized
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-22.html b/docs/reference/glib/html/api-index-2-22.html new file mode 100644 index 0000000..248d10d --- /dev/null +++ b/docs/reference/glib/html/api-index-2-22.html @@ -0,0 +1,150 @@ + + + + +Index of new symbols in 2.22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-24.html b/docs/reference/glib/html/api-index-2-24.html new file mode 100644 index 0000000..a97910a --- /dev/null +++ b/docs/reference/glib/html/api-index-2-24.html @@ -0,0 +1,253 @@ + + + + +Index of new symbols in 2.24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.24

+

B

+
g_bit_lock
+
+
g_bit_trylock
+
+
g_bit_unlock
+
+

M

+
g_malloc0_n
+
+
g_malloc_n
+
+

R

+
g_realloc_n
+
+

T

+
g_try_malloc0_n
+
+
g_try_malloc_n
+
+
g_try_realloc_n
+
+

V

+
GVariant
+
+
GVariantClass
+
+
g_variant_builder_add
+
+
g_variant_builder_add_value
+
+
g_variant_builder_clear
+
+
g_variant_builder_close
+
+
g_variant_builder_end
+
+
g_variant_builder_init
+
+
g_variant_builder_new
+
+
g_variant_builder_open
+
+
g_variant_builder_ref
+
+
g_variant_builder_unref
+
+
g_variant_byteswap
+
+
g_variant_classify
+
+
g_variant_dup_string
+
+
g_variant_dup_strv
+
+
g_variant_equal
+
+
g_variant_get
+
+
g_variant_get_boolean
+
+
g_variant_get_byte
+
+
g_variant_get_child
+
+
g_variant_get_child_value
+
+
g_variant_get_data
+
+
g_variant_get_double
+
+
g_variant_get_fixed_array
+
+
g_variant_get_handle
+
+
g_variant_get_int16
+
+
g_variant_get_int32
+
+
g_variant_get_int64
+
+
g_variant_get_maybe
+
+
g_variant_get_normal_form
+
+
g_variant_get_size
+
+
g_variant_get_string
+
+
g_variant_get_strv
+
+
g_variant_get_type
+
+
g_variant_get_type_string
+
+
g_variant_get_uint16
+
+
g_variant_get_uint32
+
+
g_variant_get_uint64
+
+
g_variant_get_va
+
+
g_variant_get_variant
+
+
g_variant_hash
+
+
g_variant_is_normal_form
+
+
g_variant_is_object_path
+
+
g_variant_is_of_type
+
+
g_variant_is_signature
+
+
g_variant_iter_copy
+
+
g_variant_iter_free
+
+
g_variant_iter_init
+
+
g_variant_iter_loop
+
+
g_variant_iter_new
+
+
g_variant_iter_next
+
+
g_variant_iter_next_value
+
+
g_variant_iter_n_children
+
+
g_variant_new
+
+
g_variant_new_array
+
+
g_variant_new_boolean
+
+
g_variant_new_byte
+
+
g_variant_new_dict_entry
+
+
g_variant_new_double
+
+
g_variant_new_from_data
+
+
g_variant_new_handle
+
+
g_variant_new_int16
+
+
g_variant_new_int32
+
+
g_variant_new_int64
+
+
g_variant_new_maybe
+
+
g_variant_new_object_path
+
+
g_variant_new_signature
+
+
g_variant_new_string
+
+
g_variant_new_strv
+
+
g_variant_new_tuple
+
+
g_variant_new_uint16
+
+
g_variant_new_uint32
+
+
g_variant_new_uint64
+
+
g_variant_new_va
+
+
g_variant_new_variant
+
+
g_variant_n_children
+
+
g_variant_print_string
+
+
g_variant_ref
+
+
g_variant_ref_sink
+
+
g_variant_store
+
+
g_variant_type_new
+
+
g_variant_type_string_scan
+
+
g_variant_unref
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-4.html b/docs/reference/glib/html/api-index-2-4.html new file mode 100644 index 0000000..3a4e80f --- /dev/null +++ b/docs/reference/glib/html/api-index-2-4.html @@ -0,0 +1,255 @@ + + + + +Index of new symbols in 2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.4

+

A

+
g_array_remove_range
+
+
g_atomic_int_add
+
+
g_atomic_int_compare_and_exchange
+
+
g_atomic_int_dec_and_test
+
+
g_atomic_int_exchange_and_add
+
+
g_atomic_int_get
+
+
g_atomic_int_inc
+
+
g_atomic_pointer_compare_and_exchange
+
+
g_atomic_pointer_get
+
+

B

+
g_byte_array_remove_range
+
+

C

+
g_child_watch_add
+
+
g_child_watch_add_full
+
+
g_child_watch_source_new
+
+
g_completion_complete_utf8
+
+
GCopyFunc
+
+

F

+
g_file_read_link
+
+

G

+
G_GINT16_MODIFIER
+
+
G_GINT32_MODIFIER
+
+
G_GINT64_MODIFIER
+
+

H

+
g_hash_table_find
+
+

M

+
g_markup_printf_escaped
+
+
g_markup_vprintf_escaped
+
+
G_MAXINT16
+
+
G_MAXINT32
+
+
G_MAXINT8
+
+
G_MAXSIZE
+
+
G_MAXUINT16
+
+
G_MAXUINT32
+
+
G_MAXUINT8
+
+
G_MININT16
+
+
G_MININT32
+
+
G_MININT8
+
+

N

+
g_node_copy_deep
+
+
N_
+
+

O

+
GOnce
+
+
g_once
+
+
GOnceStatus
+
+
G_ONCE_INIT
+
+

P

+
g_ptr_array_foreach
+
+
g_ptr_array_remove_range
+
+

Q

+
g_queue_copy
+
+
g_queue_delete_link
+
+
g_queue_find
+
+
g_queue_find_custom
+
+
g_queue_foreach
+
+
g_queue_get_length
+
+
g_queue_index
+
+
g_queue_insert_after
+
+
g_queue_insert_before
+
+
g_queue_insert_sorted
+
+
g_queue_link_index
+
+
g_queue_peek_head_link
+
+
g_queue_peek_nth
+
+
g_queue_peek_nth_link
+
+
g_queue_peek_tail_link
+
+
g_queue_pop_nth
+
+
g_queue_pop_nth_link
+
+
g_queue_push_nth
+
+
g_queue_push_nth_link
+
+
g_queue_remove
+
+
g_queue_remove_all
+
+
g_queue_reverse
+
+
g_queue_sort
+
+
g_queue_unlink
+
+
Q_
+
+

R

+
g_rand_copy
+
+
g_rand_new_with_seed_array
+
+
g_rand_set_seed_array
+
+

S

+
g_setenv
+
+
G_STRFUNC
+
+
g_string_chunk_insert_len
+
+
g_strip_context
+
+
g_strsplit_set
+
+

T

+
g_timer_continue
+
+

U

+
g_unichar_get_mirror_char
+
+
g_unsetenv
+
+

V

+
g_vasprintf
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-6.html b/docs/reference/glib/html/api-index-2-6.html new file mode 100644 index 0000000..26f88cb --- /dev/null +++ b/docs/reference/glib/html/api-index-2-6.html @@ -0,0 +1,261 @@ + + + + +Index of new symbols in 2.6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.6

+

D

+
g_date_get_iso8601_week_of_year
+
+
g_debug
+
+

F

+
g_filename_display_basename
+
+
g_filename_display_name
+
+
g_fopen
+
+
g_freopen
+
+

G

+
g_get_filename_charsets
+
+
g_get_language_names
+
+
g_get_system_config_dirs
+
+
g_get_system_data_dirs
+
+
g_get_user_cache_dir
+
+
g_get_user_config_dir
+
+
g_get_user_data_dir
+
+
G_GNUC_MALLOC
+
+
G_GSIZE_FORMAT
+
+
G_GSIZE_MODIFIER
+
+
G_GSSIZE_FORMAT
+
+

I

+
G_IS_DIR_SEPARATOR
+
+

K

+
g_key_file_free
+
+
g_key_file_get_boolean
+
+
g_key_file_get_boolean_list
+
+
g_key_file_get_comment
+
+
g_key_file_get_groups
+
+
g_key_file_get_integer
+
+
g_key_file_get_integer_list
+
+
g_key_file_get_keys
+
+
g_key_file_get_locale_string
+
+
g_key_file_get_locale_string_list
+
+
g_key_file_get_start_group
+
+
g_key_file_get_string
+
+
g_key_file_get_string_list
+
+
g_key_file_get_value
+
+
g_key_file_has_group
+
+
g_key_file_has_key
+
+
g_key_file_load_from_data
+
+
g_key_file_load_from_data_dirs
+
+
g_key_file_load_from_file
+
+
g_key_file_new
+
+
g_key_file_remove_comment
+
+
g_key_file_remove_group
+
+
g_key_file_remove_key
+
+
g_key_file_set_boolean
+
+
g_key_file_set_boolean_list
+
+
g_key_file_set_comment
+
+
g_key_file_set_integer
+
+
g_key_file_set_integer_list
+
+
g_key_file_set_list_separator
+
+
g_key_file_set_locale_string
+
+
g_key_file_set_locale_string_list
+
+
g_key_file_set_string
+
+
g_key_file_set_string_list
+
+
g_key_file_set_value
+
+
g_key_file_to_data
+
+

L

+
g_log_set_default_handler
+
+
g_lstat
+
+

M

+
g_mkdir
+
+

O

+
g_open
+
+
g_option_context_add_group
+
+
g_option_context_add_main_entries
+
+
g_option_context_free
+
+
g_option_context_get_help_enabled
+
+
g_option_context_get_ignore_unknown_options
+
+
g_option_context_get_main_group
+
+
g_option_context_new
+
+
g_option_context_parse
+
+
g_option_context_set_help_enabled
+
+
g_option_context_set_ignore_unknown_options
+
+
g_option_context_set_main_group
+
+
g_option_group_add_entries
+
+
g_option_group_free
+
+
g_option_group_new
+
+
g_option_group_set_error_hook
+
+
g_option_group_set_parse_hooks
+
+
g_option_group_set_translate_func
+
+
g_option_group_set_translation_domain
+
+
G_OPTION_REMAINING
+
+

R

+
g_remove
+
+
g_rename
+
+
g_rmdir
+
+

S

+
g_stat
+
+
g_strv_length
+
+

U

+
g_unlink
+
+
g_uri_list_extract_uris
+
+

W

+
g_win32_get_windows_version
+
+
G_WIN32_HAVE_WIDECHAR_API
+
+
G_WIN32_IS_NT_BASED
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-2-8.html b/docs/reference/glib/html/api-index-2-8.html new file mode 100644 index 0000000..f2ab30e --- /dev/null +++ b/docs/reference/glib/html/api-index-2-8.html @@ -0,0 +1,132 @@ + + + + +Index of new symbols in 2.8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-deprecated.html b/docs/reference/glib/html/api-index-deprecated.html new file mode 100644 index 0000000..851725e --- /dev/null +++ b/docs/reference/glib/html/api-index-deprecated.html @@ -0,0 +1,226 @@ + + + + +Index of deprecated symbols + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of deprecated symbols

+

A

+
GAllocator
+
+
g_allocator_free
+
+
g_allocator_new
+
+
G_ALLOC_AND_FREE
+
+
G_ALLOC_ONLY
+
+
g_async_queue_ref_unlocked
+
+
g_async_queue_unref_and_unlock
+
+

B

+
g_basename
+
+
g_blow_chunks
+
+

C

+
g_cache_value_foreach
+
+
g_chunk_free
+
+
g_chunk_new
+
+
g_chunk_new0
+
+

D

+
g_date_set_time
+
+
g_dirname
+
+

G

+
G_GNUC_FUNCTION
+
+
G_GNUC_PRETTY_FUNCTION
+
+

H

+
g_hash_table_freeze
+
+
g_hash_table_thaw
+
+
G_HAVE_GINT64
+
+

I

+
g_io_channel_close
+
+
g_io_channel_read
+
+
g_io_channel_seek
+
+
g_io_channel_write
+
+

L

+
g_list_pop_allocator
+
+
g_list_push_allocator
+
+

M

+
g_main_destroy
+
+
g_main_is_running
+
+
g_main_iteration
+
+
g_main_new
+
+
g_main_pending
+
+
g_main_quit
+
+
g_main_run
+
+
g_main_set_poll_func
+
+
g_mapped_file_free
+
+
GMemChunk
+
+
g_mem_chunk_alloc
+
+
g_mem_chunk_alloc0
+
+
g_mem_chunk_clean
+
+
g_mem_chunk_create
+
+
g_mem_chunk_destroy
+
+
g_mem_chunk_free
+
+
g_mem_chunk_info
+
+
g_mem_chunk_new
+
+
g_mem_chunk_print
+
+
g_mem_chunk_reset
+
+

N

+
g_node_pop_allocator
+
+
g_node_push_allocator
+
+

S

+
g_scanner_add_symbol
+
+
g_scanner_foreach_symbol
+
+
g_scanner_freeze_symbol_table
+
+
g_scanner_remove_symbol
+
+
g_scanner_thaw_symbol_table
+
+
g_slist_pop_allocator
+
+
g_slist_push_allocator
+
+
g_strcasecmp
+
+
g_strdown
+
+
g_string_down
+
+
g_string_sprintf
+
+
g_string_sprintfa
+
+
g_string_up
+
+
g_strncasecmp
+
+
g_strup
+
+

T

+
g_tree_traverse
+
+

W

+
G_WIN32_DLLMAIN_FOR_DLL_NAME
+
+
g_win32_get_package_installation_directory
+
+
g_win32_get_package_installation_subdirectory
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/api-index-full.html b/docs/reference/glib/html/api-index-full.html new file mode 100644 index 0000000..5250eb8 --- /dev/null +++ b/docs/reference/glib/html/api-index-full.html @@ -0,0 +1,3987 @@ + + + + +Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index

+

A

+
ABS
+
+
g_access
+
+
g_alloca
+
+
GAllocator
+
+
g_allocator_free
+
+
g_allocator_new
+
+
G_ALLOC_AND_FREE
+
+
G_ALLOC_ONLY
+
+
GArray
+
+
g_array_append_val
+
+
g_array_append_vals
+
+
g_array_free
+
+
g_array_get_element_size
+
+
g_array_index
+
+
g_array_insert_val
+
+
g_array_insert_vals
+
+
g_array_new
+
+
g_array_prepend_val
+
+
g_array_prepend_vals
+
+
g_array_ref
+
+
g_array_remove_index
+
+
g_array_remove_index_fast
+
+
g_array_remove_range
+
+
g_array_set_size
+
+
g_array_sized_new
+
+
g_array_sort
+
+
g_array_sort_with_data
+
+
g_array_unref
+
+
g_ascii_digit_value
+
+
g_ascii_dtostr
+
+
G_ASCII_DTOSTR_BUF_SIZE
+
+
g_ascii_formatd
+
+
g_ascii_isalnum
+
+
g_ascii_isalpha
+
+
g_ascii_iscntrl
+
+
g_ascii_isdigit
+
+
g_ascii_isgraph
+
+
g_ascii_islower
+
+
g_ascii_isprint
+
+
g_ascii_ispunct
+
+
g_ascii_isspace
+
+
g_ascii_isupper
+
+
g_ascii_isxdigit
+
+
g_ascii_strcasecmp
+
+
g_ascii_strdown
+
+
g_ascii_strncasecmp
+
+
g_ascii_strtod
+
+
g_ascii_strtoll
+
+
g_ascii_strtoull
+
+
g_ascii_strup
+
+
g_ascii_tolower
+
+
g_ascii_toupper
+
+
g_ascii_xdigit_value
+
+
g_assert
+
+
g_assert_cmpfloat
+
+
g_assert_cmphex
+
+
g_assert_cmpint
+
+
g_assert_cmpstr
+
+
g_assert_cmpuint
+
+
g_assert_error
+
+
g_assert_not_reached
+
+
g_assert_no_error
+
+
GAsyncQueue
+
+
g_async_queue_length
+
+
g_async_queue_length_unlocked
+
+
g_async_queue_lock
+
+
g_async_queue_new
+
+
g_async_queue_new_full
+
+
g_async_queue_pop
+
+
g_async_queue_pop_unlocked
+
+
g_async_queue_push
+
+
g_async_queue_push_sorted
+
+
g_async_queue_push_sorted_unlocked
+
+
g_async_queue_push_unlocked
+
+
g_async_queue_ref
+
+
g_async_queue_ref_unlocked
+
+
g_async_queue_sort
+
+
g_async_queue_sort_unlocked
+
+
g_async_queue_timed_pop
+
+
g_async_queue_timed_pop_unlocked
+
+
g_async_queue_try_pop
+
+
g_async_queue_try_pop_unlocked
+
+
g_async_queue_unlock
+
+
g_async_queue_unref
+
+
g_async_queue_unref_and_unlock
+
+
g_atexit
+
+
g_atomic_int_add
+
+
g_atomic_int_compare_and_exchange
+
+
g_atomic_int_dec_and_test
+
+
g_atomic_int_exchange_and_add
+
+
g_atomic_int_get
+
+
g_atomic_int_inc
+
+
g_atomic_int_set
+
+
g_atomic_pointer_compare_and_exchange
+
+
g_atomic_pointer_get
+
+
g_atomic_pointer_set
+
+

B

+
g_base64_decode
+
+
g_base64_decode_inplace
+
+
g_base64_decode_step
+
+
g_base64_encode
+
+
g_base64_encode_close
+
+
g_base64_encode_step
+
+
g_basename
+
+
G_BEGIN_DECLS
+
+
G_BIG_ENDIAN
+
+
g_bit_lock
+
+
g_bit_nth_lsf
+
+
g_bit_nth_msf
+
+
g_bit_storage
+
+
g_bit_trylock
+
+
g_bit_unlock
+
+
g_blow_chunks
+
+
GBookmarkFile
+
+
GBookmarkFileError
+
+
g_bookmark_file_add_application
+
+
g_bookmark_file_add_group
+
+
G_BOOKMARK_FILE_ERROR
+
+
g_bookmark_file_free
+
+
g_bookmark_file_get_added
+
+
g_bookmark_file_get_applications
+
+
g_bookmark_file_get_app_info
+
+
g_bookmark_file_get_description
+
+
g_bookmark_file_get_groups
+
+
g_bookmark_file_get_icon
+
+
g_bookmark_file_get_is_private
+
+
g_bookmark_file_get_mime_type
+
+
g_bookmark_file_get_modified
+
+
g_bookmark_file_get_size
+
+
g_bookmark_file_get_title
+
+
g_bookmark_file_get_uris
+
+
g_bookmark_file_get_visited
+
+
g_bookmark_file_has_application
+
+
g_bookmark_file_has_group
+
+
g_bookmark_file_has_item
+
+
g_bookmark_file_load_from_data
+
+
g_bookmark_file_load_from_data_dirs
+
+
g_bookmark_file_load_from_file
+
+
g_bookmark_file_move_item
+
+
g_bookmark_file_new
+
+
g_bookmark_file_remove_application
+
+
g_bookmark_file_remove_group
+
+
g_bookmark_file_remove_item
+
+
g_bookmark_file_set_added
+
+
g_bookmark_file_set_app_info
+
+
g_bookmark_file_set_description
+
+
g_bookmark_file_set_groups
+
+
g_bookmark_file_set_icon
+
+
g_bookmark_file_set_is_private
+
+
g_bookmark_file_set_mime_type
+
+
g_bookmark_file_set_modified
+
+
g_bookmark_file_set_title
+
+
g_bookmark_file_set_visited
+
+
g_bookmark_file_to_data
+
+
g_bookmark_file_to_file
+
+
gboolean
+
+
G_BREAKPOINT
+
+
g_build_filename
+
+
g_build_filenamev
+
+
g_build_path
+
+
g_build_pathv
+
+
GByteArray
+
+
g_byte_array_append
+
+
g_byte_array_free
+
+
g_byte_array_new
+
+
g_byte_array_prepend
+
+
g_byte_array_ref
+
+
g_byte_array_remove_index
+
+
g_byte_array_remove_index_fast
+
+
g_byte_array_remove_range
+
+
g_byte_array_set_size
+
+
g_byte_array_sized_new
+
+
g_byte_array_sort
+
+
g_byte_array_sort_with_data
+
+
g_byte_array_unref
+
+
G_BYTE_ORDER
+
+

C

+
GCache
+
+
GCacheDestroyFunc
+
+
GCacheDupFunc
+
+
GCacheNewFunc
+
+
g_cache_destroy
+
+
g_cache_insert
+
+
g_cache_key_foreach
+
+
g_cache_new
+
+
g_cache_remove
+
+
g_cache_value_foreach
+
+
gchar
+
+
g_chdir
+
+
GChecksum
+
+
GChecksumType
+
+
g_checksum_copy
+
+
g_checksum_free
+
+
g_checksum_get_digest
+
+
g_checksum_get_string
+
+
g_checksum_new
+
+
g_checksum_reset
+
+
g_checksum_type_get_length
+
+
g_checksum_update
+
+
GChildWatchFunc
+
+
g_child_watch_add
+
+
g_child_watch_add_full
+
+
g_child_watch_source_new
+
+
g_chmod
+
+
g_chunk_free
+
+
g_chunk_new
+
+
g_chunk_new0
+
+
CLAMP
+
+
g_clear_error
+
+
GCompareDataFunc
+
+
GCompareFunc
+
+
GCompletion
+
+
GCompletionFunc
+
+
GCompletionStrncmpFunc
+
+
g_completion_add_items
+
+
g_completion_clear_items
+
+
g_completion_complete
+
+
g_completion_complete_utf8
+
+
g_completion_free
+
+
g_completion_new
+
+
g_completion_remove_items
+
+
g_completion_set_compare
+
+
g_compute_checksum_for_data
+
+
g_compute_checksum_for_string
+
+
GCond
+
+
g_cond_broadcast
+
+
g_cond_free
+
+
g_cond_new
+
+
g_cond_signal
+
+
g_cond_timed_wait
+
+
g_cond_wait
+
+
gconstpointer
+
+
G_CONST_RETURN
+
+
g_convert
+
+
GConvertError
+
+
G_CONVERT_ERROR
+
+
g_convert_with_fallback
+
+
g_convert_with_iconv
+
+
GCopyFunc
+
+
g_creat
+
+
g_critical
+
+
G_CSET_a_2_z
+
+
G_CSET_A_2_Z
+
+
G_CSET_DIGITS
+
+
G_CSET_LATINC
+
+
G_CSET_LATINS
+
+
C_
+
+

D

+
GData
+
+
GDataForeachFunc
+
+
g_datalist_clear
+
+
G_DATALIST_FLAGS_MASK
+
+
g_datalist_foreach
+
+
g_datalist_get_data
+
+
g_datalist_get_flags
+
+
g_datalist_id_get_data
+
+
g_datalist_id_remove_data
+
+
g_datalist_id_remove_no_notify
+
+
g_datalist_id_set_data
+
+
g_datalist_id_set_data_full
+
+
g_datalist_init
+
+
g_datalist_remove_data
+
+
g_datalist_remove_no_notify
+
+
g_datalist_set_data
+
+
g_datalist_set_data_full
+
+
g_datalist_set_flags
+
+
g_datalist_unset_flags
+
+
g_dataset_destroy
+
+
g_dataset_foreach
+
+
g_dataset_get_data
+
+
g_dataset_id_get_data
+
+
g_dataset_id_remove_data
+
+
g_dataset_id_remove_no_notify
+
+
g_dataset_id_set_data
+
+
g_dataset_id_set_data_full
+
+
g_dataset_remove_data
+
+
g_dataset_remove_no_notify
+
+
g_dataset_set_data
+
+
g_dataset_set_data_full
+
+
GDate
+
+
GDateDay
+
+
GDateDMY
+
+
GDateMonth
+
+
GDateWeekday
+
+
GDateYear
+
+
g_date_add_days
+
+
g_date_add_months
+
+
g_date_add_years
+
+
G_DATE_BAD_DAY
+
+
G_DATE_BAD_JULIAN
+
+
G_DATE_BAD_YEAR
+
+
g_date_clamp
+
+
g_date_clear
+
+
g_date_compare
+
+
g_date_days_between
+
+
g_date_free
+
+
g_date_get_day
+
+
g_date_get_days_in_month
+
+
g_date_get_day_of_year
+
+
g_date_get_iso8601_week_of_year
+
+
g_date_get_julian
+
+
g_date_get_monday_weeks_in_year
+
+
g_date_get_monday_week_of_year
+
+
g_date_get_month
+
+
g_date_get_sunday_weeks_in_year
+
+
g_date_get_sunday_week_of_year
+
+
g_date_get_weekday
+
+
g_date_get_year
+
+
g_date_is_first_of_month
+
+
g_date_is_last_of_month
+
+
g_date_is_leap_year
+
+
g_date_new
+
+
g_date_new_dmy
+
+
g_date_new_julian
+
+
g_date_order
+
+
g_date_set_day
+
+
g_date_set_dmy
+
+
g_date_set_julian
+
+
g_date_set_month
+
+
g_date_set_parse
+
+
g_date_set_time
+
+
g_date_set_time_t
+
+
g_date_set_time_val
+
+
g_date_set_year
+
+
g_date_strftime
+
+
g_date_subtract_days
+
+
g_date_subtract_months
+
+
g_date_subtract_years
+
+
g_date_to_struct_tm
+
+
g_date_valid
+
+
g_date_valid_day
+
+
g_date_valid_dmy
+
+
g_date_valid_julian
+
+
g_date_valid_month
+
+
g_date_valid_weekday
+
+
g_date_valid_year
+
+
g_debug
+
+
GDebugKey
+
+
GDestroyNotify
+
+
g_dgettext
+
+
GDir
+
+
g_direct_equal
+
+
g_direct_hash
+
+
g_dirname
+
+
g_dir_close
+
+
g_dir_open
+
+
g_dir_read_name
+
+
g_dir_rewind
+
+
G_DIR_SEPARATOR
+
+
G_DIR_SEPARATOR_S
+
+
g_dngettext
+
+
gdouble
+
+
GDoubleIEEE754
+
+
g_double_equal
+
+
g_double_hash
+
+
g_dpgettext
+
+
g_dpgettext2
+
+

E

+
G_E
+
+
G_END_DECLS
+
+
GEqualFunc
+
+
g_error
+
+
GError
+
+
GErrorType
+
+
g_error_copy
+
+
g_error_free
+
+
g_error_matches
+
+
g_error_new
+
+
g_error_new_literal
+
+
g_error_new_valist
+
+

F

+
FALSE
+
+
GFileError
+
+
g_filename_display_basename
+
+
g_filename_display_name
+
+
g_filename_from_uri
+
+
g_filename_from_utf8
+
+
g_filename_to_uri
+
+
g_filename_to_utf8
+
+
GFileTest
+
+
G_FILE_ERROR
+
+
g_file_error_from_errno
+
+
g_file_get_contents
+
+
g_file_open_tmp
+
+
g_file_read_link
+
+
g_file_set_contents
+
+
g_file_test
+
+
g_find_program_in_path
+
+
gfloat
+
+
GFloatIEEE754
+
+
g_fopen
+
+
g_format_size_for_display
+
+
g_fprintf
+
+
g_free
+
+
GFreeFunc
+
+
g_freopen
+
+
GFunc
+
+

G

+
g_getenv
+
+
g_get_application_name
+
+
g_get_charset
+
+
g_get_current_dir
+
+
g_get_current_time
+
+
g_get_filename_charsets
+
+
g_get_home_dir
+
+
g_get_host_name
+
+
g_get_language_names
+
+
g_get_prgname
+
+
g_get_real_name
+
+
g_get_system_config_dirs
+
+
g_get_system_data_dirs
+
+
g_get_tmp_dir
+
+
g_get_user_cache_dir
+
+
g_get_user_config_dir
+
+
g_get_user_data_dir
+
+
g_get_user_name
+
+
g_get_user_special_dir
+
+
G_GINT16_FORMAT
+
+
G_GINT16_MODIFIER
+
+
G_GINT32_FORMAT
+
+
G_GINT32_MODIFIER
+
+
G_GINT64_CONSTANT
+
+
G_GINT64_FORMAT
+
+
G_GINT64_MODIFIER
+
+
G_GINTPTR_FORMAT
+
+
G_GINTPTR_MODIFIER
+
+
G_GNUC_ALLOC_SIZE
+
+
G_GNUC_ALLOC_SIZE2
+
+
G_GNUC_CONST
+
+
G_GNUC_DEPRECATED
+
+
G_GNUC_EXTENSION
+
+
G_GNUC_FORMAT
+
+
G_GNUC_FUNCTION
+
+
G_GNUC_INTERNAL
+
+
G_GNUC_MALLOC
+
+
G_GNUC_MAY_ALIAS
+
+
G_GNUC_NORETURN
+
+
G_GNUC_NO_INSTRUMENT
+
+
G_GNUC_NULL_TERMINATED
+
+
G_GNUC_PRETTY_FUNCTION
+
+
G_GNUC_PRINTF
+
+
G_GNUC_PURE
+
+
G_GNUC_SCANF
+
+
G_GNUC_UNUSED
+
+
G_GNUC_WARN_UNUSED_RESULT
+
+
G_GOFFSET_CONSTANT
+
+
G_GOFFSET_FORMAT
+
+
G_GOFFSET_MODIFIER
+
+
G_GSIZE_FORMAT
+
+
G_GSIZE_MODIFIER
+
+
G_GSSIZE_FORMAT
+
+
G_GUINT16_FORMAT
+
+
G_GUINT32_FORMAT
+
+
G_GUINT64_CONSTANT
+
+
G_GUINT64_FORMAT
+
+
G_GUINTPTR_FORMAT
+
+

H

+
GHashFunc
+
+
GHashTable
+
+
GHashTableIter
+
+
g_hash_table_destroy
+
+
g_hash_table_find
+
+
g_hash_table_foreach
+
+
g_hash_table_foreach_remove
+
+
g_hash_table_foreach_steal
+
+
g_hash_table_freeze
+
+
g_hash_table_get_keys
+
+
g_hash_table_get_values
+
+
g_hash_table_insert
+
+
g_hash_table_iter_get_hash_table
+
+
g_hash_table_iter_init
+
+
g_hash_table_iter_next
+
+
g_hash_table_iter_remove
+
+
g_hash_table_iter_steal
+
+
g_hash_table_lookup
+
+
g_hash_table_lookup_extended
+
+
g_hash_table_new
+
+
g_hash_table_new_full
+
+
g_hash_table_ref
+
+
g_hash_table_remove
+
+
g_hash_table_remove_all
+
+
g_hash_table_replace
+
+
g_hash_table_size
+
+
g_hash_table_steal
+
+
g_hash_table_steal_all
+
+
g_hash_table_thaw
+
+
g_hash_table_unref
+
+
G_HAVE_GINT64
+
+
G_HAVE_GNUC_VISIBILITY
+
+
GHFunc
+
+
G_HOOK
+
+
GHook
+
+
GHookCheckFunc
+
+
GHookCheckMarshaller
+
+
GHookCompareFunc
+
+
GHookFinalizeFunc
+
+
GHookFindFunc
+
+
GHookFlagMask
+
+
GHookFunc
+
+
GHookList
+
+
GHookMarshaller
+
+
G_HOOK_ACTIVE
+
+
g_hook_alloc
+
+
g_hook_append
+
+
g_hook_compare_ids
+
+
g_hook_destroy
+
+
g_hook_destroy_link
+
+
g_hook_find
+
+
g_hook_find_data
+
+
g_hook_find_func
+
+
g_hook_find_func_data
+
+
g_hook_first_valid
+
+
G_HOOK_FLAGS
+
+
G_HOOK_FLAG_USER_SHIFT
+
+
g_hook_free
+
+
g_hook_get
+
+
g_hook_insert_before
+
+
g_hook_insert_sorted
+
+
G_HOOK_IN_CALL
+
+
G_HOOK_IS_UNLINKED
+
+
G_HOOK_IS_VALID
+
+
g_hook_list_clear
+
+
g_hook_list_init
+
+
g_hook_list_invoke
+
+
g_hook_list_invoke_check
+
+
g_hook_list_marshal
+
+
g_hook_list_marshal_check
+
+
g_hook_next_valid
+
+
g_hook_prepend
+
+
g_hook_ref
+
+
g_hook_unref
+
+
g_hostname_is_ascii_encoded
+
+
g_hostname_is_ip_address
+
+
g_hostname_is_non_ascii
+
+
g_hostname_to_ascii
+
+
g_hostname_to_unicode
+
+
GHRFunc
+
+
g_htonl
+
+
g_htons
+
+

I

+
GIConv
+
+
g_iconv
+
+
g_iconv_close
+
+
g_iconv_open
+
+
g_idle_add
+
+
g_idle_add_full
+
+
g_idle_remove_by_data
+
+
g_idle_source_new
+
+
G_IEEE754_DOUBLE_BIAS
+
+
G_IEEE754_FLOAT_BIAS
+
+
G_INLINE_FUNC
+
+
gint
+
+
gint16
+
+
GINT16_FROM_BE
+
+
GINT16_FROM_LE
+
+
GINT16_TO_BE
+
+
GINT16_TO_LE
+
+
gint32
+
+
GINT32_FROM_BE
+
+
GINT32_FROM_LE
+
+
GINT32_TO_BE
+
+
GINT32_TO_LE
+
+
gint64
+
+
g_int64_equal
+
+
GINT64_FROM_BE
+
+
GINT64_FROM_LE
+
+
g_int64_hash
+
+
GINT64_TO_BE
+
+
GINT64_TO_LE
+
+
gint8
+
+
g_intern_static_string
+
+
g_intern_string
+
+
gintptr
+
+
g_int_equal
+
+
GINT_FROM_BE
+
+
GINT_FROM_LE
+
+
g_int_hash
+
+
GINT_TO_BE
+
+
GINT_TO_LE
+
+
GINT_TO_POINTER
+
+
GIOChannel
+
+
GIOChannelError
+
+
GIOCondition
+
+
GIOError
+
+
GIOFlags
+
+
GIOFunc
+
+
GIOFuncs
+
+
GIOStatus
+
+
g_io_add_watch
+
+
g_io_add_watch_full
+
+
g_io_channel_close
+
+
G_IO_CHANNEL_ERROR
+
+
g_io_channel_error_from_errno
+
+
g_io_channel_flush
+
+
g_io_channel_get_buffered
+
+
g_io_channel_get_buffer_condition
+
+
g_io_channel_get_buffer_size
+
+
g_io_channel_get_close_on_unref
+
+
g_io_channel_get_encoding
+
+
g_io_channel_get_flags
+
+
g_io_channel_get_line_term
+
+
g_io_channel_init
+
+
g_io_channel_new_file
+
+
g_io_channel_read
+
+
g_io_channel_read_chars
+
+
g_io_channel_read_line
+
+
g_io_channel_read_line_string
+
+
g_io_channel_read_to_end
+
+
g_io_channel_read_unichar
+
+
g_io_channel_ref
+
+
g_io_channel_seek
+
+
g_io_channel_seek_position
+
+
g_io_channel_set_buffered
+
+
g_io_channel_set_buffer_size
+
+
g_io_channel_set_close_on_unref
+
+
g_io_channel_set_encoding
+
+
g_io_channel_set_flags
+
+
g_io_channel_set_line_term
+
+
g_io_channel_shutdown
+
+
g_io_channel_unix_get_fd
+
+
g_io_channel_unix_new
+
+
g_io_channel_unref
+
+
g_io_channel_win32_new_fd
+
+
g_io_channel_win32_new_messages
+
+
g_io_channel_win32_new_socket
+
+
g_io_channel_write
+
+
g_io_channel_write_chars
+
+
g_io_channel_write_unichar
+
+
g_io_create_watch
+
+
G_IS_DIR_SEPARATOR
+
+

K

+
GKeyFile
+
+
GKeyFileError
+
+
GKeyFileFlags
+
+
G_KEY_FILE_DESKTOP_GROUP
+
+
G_KEY_FILE_DESKTOP_KEY_CATEGORIES
+
+
G_KEY_FILE_DESKTOP_KEY_COMMENT
+
+
G_KEY_FILE_DESKTOP_KEY_EXEC
+
+
G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME
+
+
G_KEY_FILE_DESKTOP_KEY_HIDDEN
+
+
G_KEY_FILE_DESKTOP_KEY_ICON
+
+
G_KEY_FILE_DESKTOP_KEY_MIME_TYPE
+
+
G_KEY_FILE_DESKTOP_KEY_NAME
+
+
G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN
+
+
G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY
+
+
G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN
+
+
G_KEY_FILE_DESKTOP_KEY_PATH
+
+
G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY
+
+
G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS
+
+
G_KEY_FILE_DESKTOP_KEY_TERMINAL
+
+
G_KEY_FILE_DESKTOP_KEY_TRY_EXEC
+
+
G_KEY_FILE_DESKTOP_KEY_TYPE
+
+
G_KEY_FILE_DESKTOP_KEY_URL
+
+
G_KEY_FILE_DESKTOP_KEY_VERSION
+
+
G_KEY_FILE_DESKTOP_TYPE_APPLICATION
+
+
G_KEY_FILE_DESKTOP_TYPE_DIRECTORY
+
+
G_KEY_FILE_DESKTOP_TYPE_LINK
+
+
G_KEY_FILE_ERROR
+
+
g_key_file_free
+
+
g_key_file_get_boolean
+
+
g_key_file_get_boolean_list
+
+
g_key_file_get_comment
+
+
g_key_file_get_double
+
+
g_key_file_get_double_list
+
+
g_key_file_get_groups
+
+
g_key_file_get_integer
+
+
g_key_file_get_integer_list
+
+
g_key_file_get_keys
+
+
g_key_file_get_locale_string
+
+
g_key_file_get_locale_string_list
+
+
g_key_file_get_start_group
+
+
g_key_file_get_string
+
+
g_key_file_get_string_list
+
+
g_key_file_get_value
+
+
g_key_file_has_group
+
+
g_key_file_has_key
+
+
g_key_file_load_from_data
+
+
g_key_file_load_from_data_dirs
+
+
g_key_file_load_from_dirs
+
+
g_key_file_load_from_file
+
+
g_key_file_new
+
+
g_key_file_remove_comment
+
+
g_key_file_remove_group
+
+
g_key_file_remove_key
+
+
g_key_file_set_boolean
+
+
g_key_file_set_boolean_list
+
+
g_key_file_set_comment
+
+
g_key_file_set_double
+
+
g_key_file_set_double_list
+
+
g_key_file_set_integer
+
+
g_key_file_set_integer_list
+
+
g_key_file_set_list_separator
+
+
g_key_file_set_locale_string
+
+
g_key_file_set_locale_string_list
+
+
g_key_file_set_string
+
+
g_key_file_set_string_list
+
+
g_key_file_set_value
+
+
g_key_file_to_data
+
+

L

+
GLIB_CHECK_VERSION
+
+
GLIB_MAJOR_VERSION
+
+
glib_mem_profiler_table
+
+
GLIB_MICRO_VERSION
+
+
GLIB_MINOR_VERSION
+
+
G_LIKELY
+
+
GList
+
+
g_listenv
+
+
g_list_alloc
+
+
g_list_append
+
+
g_list_concat
+
+
g_list_copy
+
+
g_list_delete_link
+
+
g_list_find
+
+
g_list_find_custom
+
+
g_list_first
+
+
g_list_foreach
+
+
g_list_free
+
+
g_list_free1
+
+
g_list_free_1
+
+
g_list_index
+
+
g_list_insert
+
+
g_list_insert_before
+
+
g_list_insert_sorted
+
+
g_list_insert_sorted_with_data
+
+
g_list_last
+
+
g_list_length
+
+
g_list_next
+
+
g_list_nth
+
+
g_list_nth_data
+
+
g_list_nth_prev
+
+
g_list_pop_allocator
+
+
g_list_position
+
+
g_list_prepend
+
+
g_list_previous
+
+
g_list_push_allocator
+
+
g_list_remove
+
+
g_list_remove_all
+
+
g_list_remove_link
+
+
g_list_reverse
+
+
g_list_sort
+
+
g_list_sort_with_data
+
+
G_LITTLE_ENDIAN
+
+
G_LN10
+
+
G_LN2
+
+
g_locale_from_utf8
+
+
g_locale_to_utf8
+
+
G_LOCK
+
+
G_LOCK_DEFINE
+
+
G_LOCK_DEFINE_STATIC
+
+
G_LOCK_EXTERN
+
+
g_log
+
+
GLogFunc
+
+
GLogLevelFlags
+
+
g_logv
+
+
G_LOG_2_BASE_10
+
+
g_log_default_handler
+
+
G_LOG_DOMAIN
+
+
G_LOG_FATAL_MASK
+
+
G_LOG_LEVEL_USER_SHIFT
+
+
g_log_remove_handler
+
+
g_log_set_always_fatal
+
+
g_log_set_default_handler
+
+
g_log_set_fatal_mask
+
+
g_log_set_handler
+
+
glong
+
+
GLONG_FROM_BE
+
+
GLONG_FROM_LE
+
+
GLONG_TO_BE
+
+
GLONG_TO_LE
+
+
g_lstat
+
+

M

+
GMainContext
+
+
GMainLoop
+
+
g_main_context_acquire
+
+
g_main_context_add_poll
+
+
g_main_context_check
+
+
g_main_context_default
+
+
g_main_context_dispatch
+
+
g_main_context_find_source_by_funcs_user_data
+
+
g_main_context_find_source_by_id
+
+
g_main_context_find_source_by_user_data
+
+
g_main_context_get_poll_func
+
+
g_main_context_get_thread_default
+
+
g_main_context_is_owner
+
+
g_main_context_iteration
+
+
g_main_context_new
+
+
g_main_context_pending
+
+
g_main_context_pop_thread_default
+
+
g_main_context_prepare
+
+
g_main_context_push_thread_default
+
+
g_main_context_query
+
+
g_main_context_ref
+
+
g_main_context_release
+
+
g_main_context_remove_poll
+
+
g_main_context_set_poll_func
+
+
g_main_context_unref
+
+
g_main_context_wait
+
+
g_main_context_wakeup
+
+
g_main_current_source
+
+
g_main_depth
+
+
g_main_destroy
+
+
g_main_is_running
+
+
g_main_iteration
+
+
g_main_loop_get_context
+
+
g_main_loop_is_running
+
+
g_main_loop_new
+
+
g_main_loop_quit
+
+
g_main_loop_ref
+
+
g_main_loop_run
+
+
g_main_loop_unref
+
+
g_main_new
+
+
g_main_pending
+
+
g_main_quit
+
+
g_main_run
+
+
g_main_set_poll_func
+
+
g_malloc
+
+
g_malloc0
+
+
g_malloc0_n
+
+
g_malloc_n
+
+
GMappedFile
+
+
g_mapped_file_free
+
+
g_mapped_file_get_contents
+
+
g_mapped_file_get_length
+
+
g_mapped_file_new
+
+
g_mapped_file_ref
+
+
g_mapped_file_unref
+
+
GMarkupCollectType
+
+
GMarkupError
+
+
GMarkupParseContext
+
+
GMarkupParseFlags
+
+
GMarkupParser
+
+
g_markup_collect_attributes
+
+
G_MARKUP_ERROR
+
+
g_markup_escape_text
+
+
g_markup_parse_context_end_parse
+
+
g_markup_parse_context_free
+
+
g_markup_parse_context_get_element
+
+
g_markup_parse_context_get_element_stack
+
+
g_markup_parse_context_get_position
+
+
g_markup_parse_context_get_user_data
+
+
g_markup_parse_context_new
+
+
g_markup_parse_context_parse
+
+
g_markup_parse_context_pop
+
+
g_markup_parse_context_push
+
+
g_markup_printf_escaped
+
+
g_markup_vprintf_escaped
+
+
GMatchInfo
+
+
g_match_info_expand_references
+
+
g_match_info_fetch
+
+
g_match_info_fetch_all
+
+
g_match_info_fetch_named
+
+
g_match_info_fetch_named_pos
+
+
g_match_info_fetch_pos
+
+
g_match_info_free
+
+
g_match_info_get_match_count
+
+
g_match_info_get_regex
+
+
g_match_info_get_string
+
+
g_match_info_is_partial_match
+
+
g_match_info_matches
+
+
g_match_info_next
+
+
MAX
+
+
G_MAXDOUBLE
+
+
G_MAXFLOAT
+
+
G_MAXINT
+
+
G_MAXINT16
+
+
G_MAXINT32
+
+
G_MAXINT64
+
+
G_MAXINT8
+
+
G_MAXLONG
+
+
G_MAXOFFSET
+
+
MAXPATHLEN
+
+
G_MAXSHORT
+
+
G_MAXSIZE
+
+
G_MAXSSIZE
+
+
G_MAXUINT
+
+
G_MAXUINT16
+
+
G_MAXUINT32
+
+
G_MAXUINT64
+
+
G_MAXUINT8
+
+
G_MAXULONG
+
+
G_MAXUSHORT
+
+
GMemChunk
+
+
g_memdup
+
+
g_memmove
+
+
GMemVTable
+
+
G_MEM_ALIGN
+
+
g_mem_chunk_alloc
+
+
g_mem_chunk_alloc0
+
+
g_mem_chunk_clean
+
+
g_mem_chunk_create
+
+
g_mem_chunk_destroy
+
+
g_mem_chunk_free
+
+
g_mem_chunk_info
+
+
g_mem_chunk_new
+
+
g_mem_chunk_print
+
+
g_mem_chunk_reset
+
+
g_mem_gc_friendly
+
+
g_mem_is_system_malloc
+
+
g_mem_profile
+
+
g_mem_set_vtable
+
+
g_message
+
+
MIN
+
+
G_MINDOUBLE
+
+
G_MINFLOAT
+
+
G_MININT
+
+
G_MININT16
+
+
G_MININT32
+
+
G_MININT64
+
+
G_MININT8
+
+
G_MINLONG
+
+
G_MINOFFSET
+
+
G_MINSHORT
+
+
G_MINSSIZE
+
+
g_mkdir
+
+
g_mkdir_with_parents
+
+
g_mkstemp
+
+
g_mkstemp_full
+
+
GModule
+
+
GModuleCheckInit
+
+
GModuleFlags
+
+
GModuleUnload
+
+
g_module_build_path
+
+
g_module_close
+
+
g_module_error
+
+
G_MODULE_EXPORT
+
+
G_MODULE_IMPORT
+
+
g_module_make_resident
+
+
g_module_name
+
+
g_module_open
+
+
G_MODULE_SUFFIX
+
+
g_module_supported
+
+
g_module_symbol
+
+
GMutex
+
+
g_mutex_free
+
+
g_mutex_lock
+
+
g_mutex_new
+
+
g_mutex_trylock
+
+
g_mutex_unlock
+
+

N

+
NC_
+
+
g_new
+
+
g_new0
+
+
g_newa
+
+
GNode
+
+
GNodeForeachFunc
+
+
GNodeTraverseFunc
+
+
g_node_append
+
+
g_node_append_data
+
+
g_node_children_foreach
+
+
g_node_child_index
+
+
g_node_child_position
+
+
g_node_copy
+
+
g_node_copy_deep
+
+
g_node_depth
+
+
g_node_destroy
+
+
g_node_find
+
+
g_node_find_child
+
+
g_node_first_child
+
+
g_node_first_sibling
+
+
g_node_get_root
+
+
g_node_insert
+
+
g_node_insert_after
+
+
g_node_insert_before
+
+
g_node_insert_data
+
+
g_node_insert_data_before
+
+
g_node_is_ancestor
+
+
G_NODE_IS_LEAF
+
+
G_NODE_IS_ROOT
+
+
g_node_last_child
+
+
g_node_last_sibling
+
+
g_node_max_height
+
+
g_node_new
+
+
g_node_next_sibling
+
+
g_node_nth_child
+
+
g_node_n_children
+
+
g_node_n_nodes
+
+
g_node_pop_allocator
+
+
g_node_prepend
+
+
g_node_prepend_data
+
+
g_node_prev_sibling
+
+
g_node_push_allocator
+
+
g_node_reverse_children
+
+
g_node_traverse
+
+
g_node_unlink
+
+
GNormalizeMode
+
+
g_ntohl
+
+
g_ntohs
+
+
NULL
+
+
g_nullify_pointer
+
+
N_
+
+
G_N_ELEMENTS
+
+

O

+
goffset
+
+
GOnce
+
+
g_once
+
+
GOnceStatus
+
+
G_ONCE_INIT
+
+
g_once_init_enter
+
+
g_once_init_leave
+
+
g_on_error_query
+
+
g_on_error_stack_trace
+
+
g_open
+
+
GOptionArg
+
+
GOptionArgFunc
+
+
GOptionContext
+
+
GOptionEntry
+
+
GOptionError
+
+
GOptionErrorFunc
+
+
GOptionFlags
+
+
GOptionGroup
+
+
GOptionParseFunc
+
+
g_option_context_add_group
+
+
g_option_context_add_main_entries
+
+
g_option_context_free
+
+
g_option_context_get_description
+
+
g_option_context_get_help
+
+
g_option_context_get_help_enabled
+
+
g_option_context_get_ignore_unknown_options
+
+
g_option_context_get_main_group
+
+
g_option_context_get_summary
+
+
g_option_context_new
+
+
g_option_context_parse
+
+
g_option_context_set_description
+
+
g_option_context_set_help_enabled
+
+
g_option_context_set_ignore_unknown_options
+
+
g_option_context_set_main_group
+
+
g_option_context_set_summary
+
+
g_option_context_set_translate_func
+
+
g_option_context_set_translation_domain
+
+
G_OPTION_ERROR
+
+
g_option_group_add_entries
+
+
g_option_group_free
+
+
g_option_group_new
+
+
g_option_group_set_error_hook
+
+
g_option_group_set_parse_hooks
+
+
g_option_group_set_translate_func
+
+
g_option_group_set_translation_domain
+
+
G_OPTION_REMAINING
+
+
G_OS_BEOS
+
+
G_OS_UNIX
+
+
G_OS_WIN32
+
+

P

+
g_parse_debug_string
+
+
G_PASTE
+
+
G_PASTE_ARGS
+
+
g_path_get_basename
+
+
g_path_get_dirname
+
+
g_path_is_absolute
+
+
g_path_skip_root
+
+
GPatternSpec
+
+
g_pattern_match
+
+
g_pattern_match_simple
+
+
g_pattern_match_string
+
+
g_pattern_spec_equal
+
+
g_pattern_spec_free
+
+
g_pattern_spec_new
+
+
G_PDP_ENDIAN
+
+
G_PI
+
+
GPid
+
+
G_PI_2
+
+
G_PI_4
+
+
gpointer
+
+
GPOINTER_TO_INT
+
+
GPOINTER_TO_SIZE
+
+
GPOINTER_TO_UINT
+
+
g_poll
+
+
GPollFD
+
+
G_POLLFD_FORMAT
+
+
GPollFunc
+
+
g_prefix_error
+
+
g_print
+
+
g_printerr
+
+
g_printf
+
+
GPrintFunc
+
+
g_printf_string_upper_bound
+
+
G_PRIORITY_DEFAULT
+
+
G_PRIORITY_DEFAULT_IDLE
+
+
G_PRIORITY_HIGH
+
+
G_PRIORITY_HIGH_IDLE
+
+
G_PRIORITY_LOW
+
+
GPrivate
+
+
g_private_get
+
+
g_private_new
+
+
g_private_set
+
+
g_propagate_error
+
+
g_propagate_prefixed_error
+
+
GPtrArray
+
+
g_ptr_array_add
+
+
g_ptr_array_foreach
+
+
g_ptr_array_free
+
+
g_ptr_array_index
+
+
g_ptr_array_new
+
+
g_ptr_array_new_with_free_func
+
+
g_ptr_array_ref
+
+
g_ptr_array_remove
+
+
g_ptr_array_remove_fast
+
+
g_ptr_array_remove_index
+
+
g_ptr_array_remove_index_fast
+
+
g_ptr_array_remove_range
+
+
g_ptr_array_set_free_func
+
+
g_ptr_array_set_size
+
+
g_ptr_array_sized_new
+
+
g_ptr_array_sort
+
+
g_ptr_array_sort_with_data
+
+
g_ptr_array_unref
+
+

Q

+
g_qsort_with_data
+
+
GQuark
+
+
g_quark_from_static_string
+
+
g_quark_from_string
+
+
g_quark_to_string
+
+
g_quark_try_string
+
+
GQueue
+
+
g_queue_clear
+
+
g_queue_copy
+
+
g_queue_delete_link
+
+
g_queue_find
+
+
g_queue_find_custom
+
+
g_queue_foreach
+
+
g_queue_free
+
+
g_queue_get_length
+
+
g_queue_index
+
+
g_queue_init
+
+
G_QUEUE_INIT
+
+
g_queue_insert_after
+
+
g_queue_insert_before
+
+
g_queue_insert_sorted
+
+
g_queue_is_empty
+
+
g_queue_link_index
+
+
g_queue_new
+
+
g_queue_peek_head
+
+
g_queue_peek_head_link
+
+
g_queue_peek_nth
+
+
g_queue_peek_nth_link
+
+
g_queue_peek_tail
+
+
g_queue_peek_tail_link
+
+
g_queue_pop_head
+
+
g_queue_pop_head_link
+
+
g_queue_pop_nth
+
+
g_queue_pop_nth_link
+
+
g_queue_pop_tail
+
+
g_queue_pop_tail_link
+
+
g_queue_push_head
+
+
g_queue_push_head_link
+
+
g_queue_push_nth
+
+
g_queue_push_nth_link
+
+
g_queue_push_tail
+
+
g_queue_push_tail_link
+
+
g_queue_remove
+
+
g_queue_remove_all
+
+
g_queue_reverse
+
+
g_queue_sort
+
+
g_queue_unlink
+
+
Q_
+
+

R

+
GRand
+
+
g_random_boolean
+
+
g_random_double
+
+
g_random_double_range
+
+
g_random_int
+
+
g_random_int_range
+
+
g_random_set_seed
+
+
g_rand_boolean
+
+
g_rand_copy
+
+
g_rand_double
+
+
g_rand_double_range
+
+
g_rand_free
+
+
g_rand_int
+
+
g_rand_int_range
+
+
g_rand_new
+
+
g_rand_new_with_seed
+
+
g_rand_new_with_seed_array
+
+
g_rand_set_seed
+
+
g_rand_set_seed_array
+
+
g_realloc
+
+
g_realloc_n
+
+
GRegex
+
+
GRegexCompileFlags
+
+
GRegexError
+
+
GRegexEvalCallback
+
+
GRegexMatchFlags
+
+
g_regex_check_replacement
+
+
G_REGEX_ERROR
+
+
g_regex_escape_string
+
+
g_regex_get_capture_count
+
+
g_regex_get_max_backref
+
+
g_regex_get_pattern
+
+
g_regex_get_string_number
+
+
g_regex_match
+
+
g_regex_match_all
+
+
g_regex_match_all_full
+
+
g_regex_match_full
+
+
g_regex_match_simple
+
+
g_regex_new
+
+
g_regex_ref
+
+
g_regex_replace
+
+
g_regex_replace_eval
+
+
g_regex_replace_literal
+
+
g_regex_split
+
+
g_regex_split_full
+
+
g_regex_split_simple
+
+
g_regex_unref
+
+
GRelation
+
+
g_relation_count
+
+
g_relation_delete
+
+
g_relation_destroy
+
+
g_relation_exists
+
+
g_relation_index
+
+
g_relation_insert
+
+
g_relation_new
+
+
g_relation_print
+
+
g_relation_select
+
+
g_reload_user_special_dirs_cache
+
+
g_remove
+
+
g_rename
+
+
g_renew
+
+
g_return_if_fail
+
+
g_return_if_reached
+
+
g_return_val_if_fail
+
+
g_return_val_if_reached
+
+
g_rmdir
+
+

S

+
GScanner
+
+
GScannerConfig
+
+
GScannerMsgFunc
+
+
g_scanner_add_symbol
+
+
g_scanner_cur_line
+
+
g_scanner_cur_position
+
+
g_scanner_cur_token
+
+
g_scanner_cur_value
+
+
g_scanner_destroy
+
+
g_scanner_eof
+
+
g_scanner_error
+
+
g_scanner_foreach_symbol
+
+
g_scanner_freeze_symbol_table
+
+
g_scanner_get_next_token
+
+
g_scanner_input_file
+
+
g_scanner_input_text
+
+
g_scanner_lookup_symbol
+
+
g_scanner_new
+
+
g_scanner_peek_next_token
+
+
g_scanner_remove_symbol
+
+
g_scanner_scope_add_symbol
+
+
g_scanner_scope_foreach_symbol
+
+
g_scanner_scope_lookup_symbol
+
+
g_scanner_scope_remove_symbol
+
+
g_scanner_set_scope
+
+
g_scanner_sync_file_offset
+
+
g_scanner_thaw_symbol_table
+
+
g_scanner_unexp_token
+
+
g_scanner_warn
+
+
G_SEARCHPATH_SEPARATOR
+
+
G_SEARCHPATH_SEPARATOR_S
+
+
GSeekType
+
+
GSequence
+
+
GSequenceIter
+
+
GSequenceIterCompareFunc
+
+
g_sequence_append
+
+
g_sequence_foreach
+
+
g_sequence_foreach_range
+
+
g_sequence_free
+
+
g_sequence_get
+
+
g_sequence_get_begin_iter
+
+
g_sequence_get_end_iter
+
+
g_sequence_get_iter_at_pos
+
+
g_sequence_get_length
+
+
g_sequence_insert_before
+
+
g_sequence_insert_sorted
+
+
g_sequence_insert_sorted_iter
+
+
g_sequence_iter_compare
+
+
g_sequence_iter_get_position
+
+
g_sequence_iter_get_sequence
+
+
g_sequence_iter_is_begin
+
+
g_sequence_iter_is_end
+
+
g_sequence_iter_move
+
+
g_sequence_iter_next
+
+
g_sequence_iter_prev
+
+
g_sequence_move
+
+
g_sequence_move_range
+
+
g_sequence_new
+
+
g_sequence_prepend
+
+
g_sequence_range_get_midpoint
+
+
g_sequence_remove
+
+
g_sequence_remove_range
+
+
g_sequence_search
+
+
g_sequence_search_iter
+
+
g_sequence_set
+
+
g_sequence_sort
+
+
g_sequence_sort_changed
+
+
g_sequence_sort_changed_iter
+
+
g_sequence_sort_iter
+
+
g_sequence_swap
+
+
g_setenv
+
+
g_set_application_name
+
+
g_set_error
+
+
g_set_error_literal
+
+
g_set_prgname
+
+
g_set_printerr_handler
+
+
g_set_print_handler
+
+
GShellError
+
+
G_SHELL_ERROR
+
+
g_shell_parse_argv
+
+
g_shell_quote
+
+
g_shell_unquote
+
+
gshort
+
+
gsize
+
+
GSIZE_FROM_BE
+
+
GSIZE_FROM_LE
+
+
GSIZE_TO_BE
+
+
GSIZE_TO_LE
+
+
GSIZE_TO_POINTER
+
+
g_slice_alloc
+
+
g_slice_alloc0
+
+
g_slice_copy
+
+
g_slice_dup
+
+
g_slice_free
+
+
g_slice_free1
+
+
g_slice_free_chain
+
+
g_slice_free_chain_with_offset
+
+
g_slice_new
+
+
g_slice_new0
+
+
GSList
+
+
g_slist_alloc
+
+
g_slist_append
+
+
g_slist_concat
+
+
g_slist_copy
+
+
g_slist_delete_link
+
+
g_slist_find
+
+
g_slist_find_custom
+
+
g_slist_foreach
+
+
g_slist_free
+
+
g_slist_free1
+
+
g_slist_free_1
+
+
g_slist_index
+
+
g_slist_insert
+
+
g_slist_insert_before
+
+
g_slist_insert_sorted
+
+
g_slist_insert_sorted_with_data
+
+
g_slist_last
+
+
g_slist_length
+
+
g_slist_next
+
+
g_slist_nth
+
+
g_slist_nth_data
+
+
g_slist_pop_allocator
+
+
g_slist_position
+
+
g_slist_prepend
+
+
g_slist_push_allocator
+
+
g_slist_remove
+
+
g_slist_remove_all
+
+
g_slist_remove_link
+
+
g_slist_reverse
+
+
g_slist_sort
+
+
g_slist_sort_with_data
+
+
g_snprintf
+
+
GSource
+
+
GSourceCallbackFuncs
+
+
GSourceDummyMarshal
+
+
GSourceFunc
+
+
GSourceFuncs
+
+
g_source_add_poll
+
+
g_source_attach
+
+
g_source_destroy
+
+
g_source_get_can_recurse
+
+
g_source_get_context
+
+
g_source_get_current_time
+
+
g_source_get_id
+
+
g_source_get_priority
+
+
g_source_is_destroyed
+
+
g_source_new
+
+
g_source_ref
+
+
g_source_remove
+
+
g_source_remove_by_funcs_user_data
+
+
g_source_remove_by_user_data
+
+
g_source_remove_poll
+
+
g_source_set_callback
+
+
g_source_set_callback_indirect
+
+
g_source_set_can_recurse
+
+
g_source_set_funcs
+
+
g_source_set_priority
+
+
g_source_unref
+
+
g_spaced_primes_closest
+
+
GSpawnChildSetupFunc
+
+
GSpawnError
+
+
GSpawnFlags
+
+
g_spawn_async
+
+
g_spawn_async_with_pipes
+
+
g_spawn_close_pid
+
+
g_spawn_command_line_async
+
+
g_spawn_command_line_sync
+
+
G_SPAWN_ERROR
+
+
g_spawn_sync
+
+
g_sprintf
+
+
G_SQRT2
+
+
gssize
+
+
GSSIZE_FROM_BE
+
+
GSSIZE_FROM_LE
+
+
GSSIZE_TO_BE
+
+
GSSIZE_TO_LE
+
+
g_stat
+
+
GStaticMutex
+
+
GStaticPrivate
+
+
GStaticRecMutex
+
+
GStaticRWLock
+
+
G_STATIC_ASSERT
+
+
g_static_mutex_free
+
+
g_static_mutex_get_mutex
+
+
G_STATIC_MUTEX_INIT
+
+
g_static_mutex_init
+
+
g_static_mutex_lock
+
+
g_static_mutex_trylock
+
+
g_static_mutex_unlock
+
+
g_static_private_free
+
+
g_static_private_get
+
+
G_STATIC_PRIVATE_INIT
+
+
g_static_private_init
+
+
g_static_private_set
+
+
g_static_rec_mutex_free
+
+
g_static_rec_mutex_init
+
+
G_STATIC_REC_MUTEX_INIT
+
+
g_static_rec_mutex_lock
+
+
g_static_rec_mutex_lock_full
+
+
g_static_rec_mutex_trylock
+
+
g_static_rec_mutex_unlock
+
+
g_static_rec_mutex_unlock_full
+
+
g_static_rw_lock_free
+
+
g_static_rw_lock_init
+
+
G_STATIC_RW_LOCK_INIT
+
+
g_static_rw_lock_reader_lock
+
+
g_static_rw_lock_reader_trylock
+
+
g_static_rw_lock_reader_unlock
+
+
g_static_rw_lock_writer_lock
+
+
g_static_rw_lock_writer_trylock
+
+
g_static_rw_lock_writer_unlock
+
+
G_STMT_END
+
+
G_STMT_START
+
+
g_stpcpy
+
+
g_strcanon
+
+
g_strcasecmp
+
+
g_strchomp
+
+
g_strchug
+
+
g_strcmp0
+
+
g_strcompress
+
+
g_strconcat
+
+
g_strdelimit
+
+
g_strdown
+
+
g_strdup
+
+
g_strdupv
+
+
g_strdup_printf
+
+
g_strdup_vprintf
+
+
g_strerror
+
+
g_strescape
+
+
g_strfreev
+
+
G_STRFUNC
+
+
GString
+
+
GStringChunk
+
+
G_STRINGIFY
+
+
g_string_append
+
+
g_string_append_c
+
+
g_string_append_len
+
+
g_string_append_printf
+
+
g_string_append_unichar
+
+
g_string_append_uri_escaped
+
+
g_string_append_vprintf
+
+
g_string_ascii_down
+
+
g_string_ascii_up
+
+
g_string_assign
+
+
g_string_chunk_clear
+
+
g_string_chunk_free
+
+
g_string_chunk_insert
+
+
g_string_chunk_insert_const
+
+
g_string_chunk_insert_len
+
+
g_string_chunk_new
+
+
g_string_down
+
+
g_string_equal
+
+
g_string_erase
+
+
g_string_free
+
+
g_string_hash
+
+
g_string_insert
+
+
g_string_insert_c
+
+
g_string_insert_len
+
+
g_string_insert_unichar
+
+
g_string_new
+
+
g_string_new_len
+
+
g_string_overwrite
+
+
g_string_overwrite_len
+
+
g_string_prepend
+
+
g_string_prepend_c
+
+
g_string_prepend_len
+
+
g_string_prepend_unichar
+
+
g_string_printf
+
+
g_string_set_size
+
+
g_string_sized_new
+
+
g_string_sprintf
+
+
g_string_sprintfa
+
+
g_string_truncate
+
+
g_string_up
+
+
g_string_vprintf
+
+
g_strip_context
+
+
g_strjoin
+
+
g_strjoinv
+
+
g_strlcat
+
+
g_strlcpy
+
+
G_STRLOC
+
+
g_strncasecmp
+
+
g_strndup
+
+
g_strnfill
+
+
g_strreverse
+
+
g_strrstr
+
+
g_strrstr_len
+
+
g_strsignal
+
+
g_strsplit
+
+
g_strsplit_set
+
+
g_strstrip
+
+
g_strstr_len
+
+
g_strtod
+
+
G_STRUCT_MEMBER
+
+
G_STRUCT_MEMBER_P
+
+
G_STRUCT_OFFSET
+
+
g_strup
+
+
g_strv_length
+
+
G_STR_DELIMITERS
+
+
g_str_equal
+
+
g_str_hash
+
+
g_str_has_prefix
+
+
g_str_has_suffix
+
+

T

+
GTestCase
+
+
GTestLogFatalFunc
+
+
GTestSuite
+
+
GTestTrapFlags
+
+
g_test_add
+
+
g_test_add_data_func
+
+
g_test_add_func
+
+
g_test_bug
+
+
g_test_bug_base
+
+
g_test_create_case
+
+
g_test_create_suite
+
+
g_test_get_root
+
+
g_test_init
+
+
g_test_log_set_fatal_handler
+
+
g_test_maximized_result
+
+
g_test_message
+
+
g_test_minimized_result
+
+
g_test_perf
+
+
g_test_queue_destroy
+
+
g_test_queue_free
+
+
g_test_queue_unref
+
+
g_test_quick
+
+
g_test_quiet
+
+
g_test_rand_bit
+
+
g_test_rand_double
+
+
g_test_rand_double_range
+
+
g_test_rand_int
+
+
g_test_rand_int_range
+
+
g_test_run
+
+
g_test_run_suite
+
+
g_test_slow
+
+
g_test_suite_add
+
+
g_test_suite_add_suite
+
+
g_test_thorough
+
+
g_test_timer_elapsed
+
+
g_test_timer_last
+
+
g_test_timer_start
+
+
g_test_trap_assert_failed
+
+
g_test_trap_assert_passed
+
+
g_test_trap_assert_stderr
+
+
g_test_trap_assert_stderr_unmatched
+
+
g_test_trap_assert_stdout
+
+
g_test_trap_assert_stdout_unmatched
+
+
g_test_trap_fork
+
+
g_test_trap_has_passed
+
+
g_test_trap_reached_timeout
+
+
g_test_verbose
+
+
GThread
+
+
GThreadError
+
+
GThreadFunc
+
+
GThreadFunctions
+
+
GThreadPool
+
+
GThreadPriority
+
+
G_THREADS_ENABLED
+
+
G_THREADS_IMPL_NONE
+
+
G_THREADS_IMPL_POSIX
+
+
g_thread_create
+
+
g_thread_create_full
+
+
G_THREAD_ERROR
+
+
g_thread_exit
+
+
g_thread_foreach
+
+
g_thread_get_initialized
+
+
g_thread_init
+
+
g_thread_join
+
+
g_thread_pool_free
+
+
g_thread_pool_get_max_idle_time
+
+
g_thread_pool_get_max_threads
+
+
g_thread_pool_get_max_unused_threads
+
+
g_thread_pool_get_num_threads
+
+
g_thread_pool_get_num_unused_threads
+
+
g_thread_pool_new
+
+
g_thread_pool_push
+
+
g_thread_pool_set_max_idle_time
+
+
g_thread_pool_set_max_threads
+
+
g_thread_pool_set_max_unused_threads
+
+
g_thread_pool_set_sort_function
+
+
g_thread_pool_stop_unused_threads
+
+
g_thread_pool_unprocessed
+
+
g_thread_self
+
+
g_thread_set_priority
+
+
g_thread_supported
+
+
g_thread_yield
+
+
GTime
+
+
g_timeout_add
+
+
g_timeout_add_full
+
+
g_timeout_add_seconds
+
+
g_timeout_add_seconds_full
+
+
g_timeout_source_new
+
+
g_timeout_source_new_seconds
+
+
GTimer
+
+
g_timer_continue
+
+
g_timer_destroy
+
+
g_timer_elapsed
+
+
g_timer_new
+
+
g_timer_reset
+
+
g_timer_start
+
+
g_timer_stop
+
+
GTimeVal
+
+
g_time_val_add
+
+
g_time_val_from_iso8601
+
+
g_time_val_to_iso8601
+
+
GTokenType
+
+
GTokenValue
+
+
GTranslateFunc
+
+
GTrashStack
+
+
g_trash_stack_height
+
+
g_trash_stack_peek
+
+
g_trash_stack_pop
+
+
g_trash_stack_push
+
+
GTraverseFlags
+
+
GTraverseFunc
+
+
GTraverseType
+
+
GTree
+
+
g_tree_destroy
+
+
g_tree_foreach
+
+
g_tree_height
+
+
g_tree_insert
+
+
g_tree_lookup
+
+
g_tree_lookup_extended
+
+
g_tree_new
+
+
g_tree_new_full
+
+
g_tree_new_with_data
+
+
g_tree_nnodes
+
+
g_tree_ref
+
+
g_tree_remove
+
+
g_tree_replace
+
+
g_tree_search
+
+
g_tree_steal
+
+
g_tree_traverse
+
+
g_tree_unref
+
+
TRUE
+
+
G_TRYLOCK
+
+
g_try_malloc
+
+
g_try_malloc0
+
+
g_try_malloc0_n
+
+
g_try_malloc_n
+
+
g_try_new
+
+
g_try_new0
+
+
g_try_realloc
+
+
g_try_realloc_n
+
+
g_try_renew
+
+
GTuples
+
+
g_tuples_destroy
+
+
g_tuples_index
+
+

U

+
guchar
+
+
g_ucs4_to_utf16
+
+
g_ucs4_to_utf8
+
+
guint
+
+
guint16
+
+
GUINT16_FROM_BE
+
+
GUINT16_FROM_LE
+
+
GUINT16_SWAP_BE_PDP
+
+
GUINT16_SWAP_LE_BE
+
+
GUINT16_SWAP_LE_PDP
+
+
GUINT16_TO_BE
+
+
GUINT16_TO_LE
+
+
guint32
+
+
GUINT32_FROM_BE
+
+
GUINT32_FROM_LE
+
+
GUINT32_SWAP_BE_PDP
+
+
GUINT32_SWAP_LE_BE
+
+
GUINT32_SWAP_LE_PDP
+
+
GUINT32_TO_BE
+
+
GUINT32_TO_LE
+
+
guint64
+
+
GUINT64_FROM_BE
+
+
GUINT64_FROM_LE
+
+
GUINT64_SWAP_LE_BE
+
+
GUINT64_TO_BE
+
+
GUINT64_TO_LE
+
+
guint8
+
+
guintptr
+
+
GUINT_FROM_BE
+
+
GUINT_FROM_LE
+
+
GUINT_TO_BE
+
+
GUINT_TO_LE
+
+
GUINT_TO_POINTER
+
+
gulong
+
+
GULONG_FROM_BE
+
+
GULONG_FROM_LE
+
+
GULONG_TO_BE
+
+
GULONG_TO_LE
+
+
gunichar
+
+
gunichar2
+
+
g_unichar_break_type
+
+
g_unichar_combining_class
+
+
g_unichar_digit_value
+
+
g_unichar_get_mirror_char
+
+
g_unichar_get_script
+
+
g_unichar_isalnum
+
+
g_unichar_isalpha
+
+
g_unichar_iscntrl
+
+
g_unichar_isdefined
+
+
g_unichar_isdigit
+
+
g_unichar_isgraph
+
+
g_unichar_islower
+
+
g_unichar_ismark
+
+
g_unichar_isprint
+
+
g_unichar_ispunct
+
+
g_unichar_isspace
+
+
g_unichar_istitle
+
+
g_unichar_isupper
+
+
g_unichar_iswide
+
+
g_unichar_iswide_cjk
+
+
g_unichar_isxdigit
+
+
g_unichar_iszerowidth
+
+
g_unichar_tolower
+
+
g_unichar_totitle
+
+
g_unichar_toupper
+
+
g_unichar_to_utf8
+
+
g_unichar_type
+
+
g_unichar_validate
+
+
g_unichar_xdigit_value
+
+
GUnicodeBreakType
+
+
GUnicodeScript
+
+
GUnicodeType
+
+
g_unicode_canonical_decomposition
+
+
g_unicode_canonical_ordering
+
+
G_UNLIKELY
+
+
g_unlink
+
+
G_UNLOCK
+
+
g_unsetenv
+
+
g_uri_escape_string
+
+
g_uri_list_extract_uris
+
+
g_uri_parse_scheme
+
+
G_URI_RESERVED_CHARS_ALLOWED_IN_PATH
+
+
G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT
+
+
G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO
+
+
G_URI_RESERVED_CHARS_GENERIC_DELIMITERS
+
+
G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS
+
+
g_uri_unescape_segment
+
+
g_uri_unescape_string
+
+
G_USEC_PER_SEC
+
+
GUserDirectory
+
+
gushort
+
+
g_usleep
+
+
g_utf16_to_ucs4
+
+
g_utf16_to_utf8
+
+
g_utf8_casefold
+
+
g_utf8_collate
+
+
g_utf8_collate_key
+
+
g_utf8_collate_key_for_filename
+
+
g_utf8_find_next_char
+
+
g_utf8_find_prev_char
+
+
g_utf8_get_char
+
+
g_utf8_get_char_validated
+
+
g_utf8_next_char
+
+
g_utf8_normalize
+
+
g_utf8_offset_to_pointer
+
+
g_utf8_pointer_to_offset
+
+
g_utf8_prev_char
+
+
g_utf8_strchr
+
+
g_utf8_strdown
+
+
g_utf8_strlen
+
+
g_utf8_strncpy
+
+
g_utf8_strrchr
+
+
g_utf8_strreverse
+
+
g_utf8_strup
+
+
g_utf8_to_ucs4
+
+
g_utf8_to_ucs4_fast
+
+
g_utf8_to_utf16
+
+
g_utf8_validate
+
+
g_utime
+
+

V

+
GVariant
+
+
GVariantBuilder
+
+
GVariantClass
+
+
GVariantIter
+
+
GVariantType
+
+
g_variant_builder_add
+
+
g_variant_builder_add_value
+
+
g_variant_builder_clear
+
+
g_variant_builder_close
+
+
g_variant_builder_end
+
+
g_variant_builder_init
+
+
g_variant_builder_new
+
+
g_variant_builder_open
+
+
g_variant_builder_ref
+
+
g_variant_builder_unref
+
+
g_variant_byteswap
+
+
g_variant_classify
+
+
g_variant_dup_string
+
+
g_variant_dup_strv
+
+
g_variant_equal
+
+
g_variant_get
+
+
g_variant_get_boolean
+
+
g_variant_get_byte
+
+
g_variant_get_child
+
+
g_variant_get_child_value
+
+
g_variant_get_data
+
+
g_variant_get_double
+
+
g_variant_get_fixed_array
+
+
g_variant_get_handle
+
+
g_variant_get_int16
+
+
g_variant_get_int32
+
+
g_variant_get_int64
+
+
g_variant_get_maybe
+
+
g_variant_get_normal_form
+
+
g_variant_get_size
+
+
g_variant_get_string
+
+
g_variant_get_strv
+
+
g_variant_get_type
+
+
g_variant_get_type_string
+
+
g_variant_get_uint16
+
+
g_variant_get_uint32
+
+
g_variant_get_uint64
+
+
g_variant_get_va
+
+
g_variant_get_variant
+
+
g_variant_hash
+
+
g_variant_is_container
+
+
g_variant_is_normal_form
+
+
g_variant_is_object_path
+
+
g_variant_is_of_type
+
+
g_variant_is_signature
+
+
g_variant_iter_copy
+
+
g_variant_iter_free
+
+
g_variant_iter_init
+
+
g_variant_iter_loop
+
+
g_variant_iter_new
+
+
g_variant_iter_next
+
+
g_variant_iter_next_value
+
+
g_variant_iter_n_children
+
+
g_variant_new
+
+
g_variant_new_array
+
+
g_variant_new_boolean
+
+
g_variant_new_byte
+
+
g_variant_new_dict_entry
+
+
g_variant_new_double
+
+
g_variant_new_from_data
+
+
g_variant_new_handle
+
+
g_variant_new_int16
+
+
g_variant_new_int32
+
+
g_variant_new_int64
+
+
g_variant_new_maybe
+
+
g_variant_new_object_path
+
+
g_variant_new_parsed
+
+
g_variant_new_parsed_va
+
+
g_variant_new_signature
+
+
g_variant_new_string
+
+
g_variant_new_strv
+
+
g_variant_new_tuple
+
+
g_variant_new_uint16
+
+
g_variant_new_uint32
+
+
g_variant_new_uint64
+
+
g_variant_new_va
+
+
g_variant_new_variant
+
+
g_variant_n_children
+
+
g_variant_parse
+
+
G_VARIANT_PARSE_ERROR
+
+
g_variant_print
+
+
g_variant_print_string
+
+
g_variant_ref
+
+
g_variant_ref_sink
+
+
g_variant_store
+
+
G_VARIANT_TYPE
+
+
G_VARIANT_TYPE_ANY
+
+
G_VARIANT_TYPE_ARRAY
+
+
G_VARIANT_TYPE_BASIC
+
+
G_VARIANT_TYPE_BOOLEAN
+
+
G_VARIANT_TYPE_BYTE
+
+
g_variant_type_copy
+
+
G_VARIANT_TYPE_DICTIONARY
+
+
G_VARIANT_TYPE_DICT_ENTRY
+
+
G_VARIANT_TYPE_DOUBLE
+
+
g_variant_type_dup_string
+
+
g_variant_type_element
+
+
g_variant_type_equal
+
+
g_variant_type_first
+
+
g_variant_type_free
+
+
g_variant_type_get_string_length
+
+
G_VARIANT_TYPE_HANDLE
+
+
g_variant_type_hash
+
+
G_VARIANT_TYPE_INT16
+
+
G_VARIANT_TYPE_INT32
+
+
G_VARIANT_TYPE_INT64
+
+
g_variant_type_is_array
+
+
g_variant_type_is_basic
+
+
g_variant_type_is_container
+
+
g_variant_type_is_definite
+
+
g_variant_type_is_dict_entry
+
+
g_variant_type_is_maybe
+
+
g_variant_type_is_subtype_of
+
+
g_variant_type_is_tuple
+
+
g_variant_type_is_variant
+
+
g_variant_type_key
+
+
G_VARIANT_TYPE_MAYBE
+
+
g_variant_type_new
+
+
g_variant_type_new_array
+
+
g_variant_type_new_dict_entry
+
+
g_variant_type_new_maybe
+
+
g_variant_type_new_tuple
+
+
g_variant_type_next
+
+
g_variant_type_n_items
+
+
G_VARIANT_TYPE_OBJECT_PATH
+
+
g_variant_type_peek_string
+
+
G_VARIANT_TYPE_SIGNATURE
+
+
G_VARIANT_TYPE_STRING
+
+
g_variant_type_string_is_valid
+
+
g_variant_type_string_scan
+
+
G_VARIANT_TYPE_TUPLE
+
+
G_VARIANT_TYPE_UINT16
+
+
G_VARIANT_TYPE_UINT32
+
+
G_VARIANT_TYPE_UINT64
+
+
G_VARIANT_TYPE_UNIT
+
+
g_variant_type_value
+
+
G_VARIANT_TYPE_VARIANT
+
+
g_variant_unref
+
+
g_vasprintf
+
+
G_VA_COPY
+
+
g_vfprintf
+
+
GVoidFunc
+
+
g_vprintf
+
+
g_vsnprintf
+
+
g_vsprintf
+
+

W

+
g_warning
+
+
g_warn_if_fail
+
+
g_warn_if_reached
+
+
G_WIN32_DLLMAIN_FOR_DLL_NAME
+
+
g_win32_error_message
+
+
g_win32_getlocale
+
+
g_win32_get_package_installation_directory
+
+
g_win32_get_package_installation_directory_of_module
+
+
g_win32_get_package_installation_subdirectory
+
+
g_win32_get_windows_version
+
+
G_WIN32_HAVE_WIDECHAR_API
+
+
G_WIN32_IS_NT_BASED
+
+
g_win32_locale_filename_from_utf8
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/file-name-encodings.png b/docs/reference/glib/html/file-name-encodings.png new file mode 100644 index 0000000000000000000000000000000000000000..7adbcea393fc43286f09cbaa8ab507f19d4eb50c GIT binary patch literal 32141 zcmb@ubx>SQ6fZ~&NFcataCi4)fZ*;P+}%9{2!S9WxQ7tjA-F?ucXuD$ZGdgQ_f~56 zZPos~5WIndgL^9_DW(hu_v{M%3rBnoj!2&RIKjca zgOd{bpz1NVzv%uRbNdnDn5K@AUGm*)ihZUElfECn)!TwyS)h4y^~H0BEpt=a=5bb4 z*b>Fwp9|MW-t}OZ(&}6;5kh)~j-rmgqhpmD+!c=u@0D)UZ8IlqGaoGo)i}Hfe*O#& z4)53T$V+flI#lqcOak8i2tEzM6TJO61#e#B9vYbR%*?{BP%KVbI5=A0yMr3MulHwX znI014c)Hzscp0_I_X4HdgZPA*^E{idjZ>HgRaSu+#`r||2 zi~q;@-)(|XG$OsUcz#^XADpI9qEGhooAG@&`wp_Hp_HW*EXyMv$J(dW!-5>{-Dca} z4z#K;Q~|?)$7MgU+^++M25FaHogJy<& zef8>9F--mW$C0rqb`G}6vI;yKu0+Xq4{~x!YI<=$qaoxm&tcC$b%I;|^f|AnM0Qw~ z2IHIRTY8j`J?_87#d0^#L%Pc~8Q&(ulRREsUUPAA5sSDBvXf)1qNxQ+Q^%k~_=cUy zNyW%tRa93$m`=0!k4tRhZjcIi$;!weDU-bK3k>L*>G2o~k}`Qy=Utaye)=j-TCdrJ z?_+CX@<59{_cbvLDS<^W+^=WC#0&WX&qhcyCO`ju*i`&fSV0){}YmAv>SfruU|rdLwJtf6tE&WMx2=f351ZK|L!Y~ON=6XKs=Dn%Vb zEaD8CyRbeaIV?;lH5*GJkEW#&*?tJT<4fYZkh^fAG-t&VBpDtYwcVd7*G|?(64q1H zFbF{_$S=m{u}pR1$9sKudd70^1B{4p)#)av@!CB|N!nMnp#HU)?AQmUtL zy70^WD(iPBAswp@Z|We7XcX%984ybJ1EPKM-xN+x&fuEi$l((qQxnr08(W|7xc@mK z#tg;wn!Jv}jLhI)nwa=gT4--?9o4-)FEGc@PhZ$qXk%lmORN`igWS*1(?8Tp9n&MM zFWk4g^4ddBPjAvB%Q$N|C@sG*e|`7VrpWfkb2U}9R3Ue6DlXH`pV($yX3(>DJ6Nfx zLZrlmgQm_A;o(+$R_i2PT&i3}y3G}3wa5Qg#VSJ2Q6o zpdIutpYFRbr+Q0wrfyqnxGBWTpL3OhJ0zm}I4vzL8a-O0#DLHHu&64os(HvdFg(B0 z#Ih1h7PDRx7AM2E;z7TI$7k(YiCT$C$)={}R8&;1GB;xtV?Qe}2qLytp#f-X?#K2E zjiVzYE2JwTmJ5{habX>+Vn#{`Efl4+3Nk84WSr((skPU&jg5kGU$=gW%czoO3Btak z_4W1g6MDrjcV%!}CTEnAM#zgIPEJni)jE)I30*AQIPbOSmOdb;tLRW9^llHO@9l5M zwjy#xaJ7(JbJe`#*;m%I`%n^BHTka`lTR1rXV$`(g&)hJ${E?zIn?sViQiV)G^3w( zL-$XWm|O(8BX!;d`|H!;_;Jf~VRNGqCfnzO3Cn2TSf>6)1q$0)+Iyni zue3EGd>}<=vU?L)1Rp`bM=vM{8)_0jN2RbSwk<9$8k8IKycI-A=`gC8$QW)N-SVjQ zHrY0z$)>)!y>*(^HT5(%H#hPzqG@rSs8#ACA&HiZHHeL3<+Pq-6e>x-rJ2*5r!}A* z-fkl!0)fZV=Xct&-wCucCnpDA#cUv*jWEjfqHt#y%Ep!CeR(7`Ea{(oI?EkZ-+4+B(_|yba-}gxL$<)K48Qt~p@CKP!H=|Ae5V1d8$o zDLTtI_f=wrfAeMC4=jnq6-<}TuCA&P>i6MxnvukaKCeDdQBqP;(-+Sj4M8C;2)i!1 z=4NH(WM^bzVxpy2RPdDhnvm|n_!-3pk!k+XP@=)+iqr&~K#I};0UW6=lU==zD zv+l#~3r3?baRLGYXs{|ll@8v8Jb83%Z2Y^R_Rd6MmSZlO8H4E3R*uKLIL%0P}J zv5$z^CVx0dqzeSwIV)d*EQ5j2!9jwg}OKyRRqQac6>r`Ryk|-uj=aR%Gsh0 zRmE`P{j;4RCaxANMsI0j=d&9XlbKnZU91lwQwAB-+&niaU#o_$4BsZ`$NP6b`ZvqC zpM!vZs6>k;D%znx^k?5VN=`)v6Cz0-e=Kmls38#k$;_(DsA8${i_yy$=>cHw^Uf4a zrQGZ;J7sWHGO|C4gmbfTCvh77bgCo{>4+c|cyNTRCk7>+tat70?z|Rn|K^SU^0{Hq z5u%zw%-647G^GB&d&gwGex7q4>}JtKVZ90F*73eBTYboaMMQ)z^U8dY5BR0>{vDba zBwCa4kUO^1q&$()_8@^>@5T6zTO2;hYHaSv2;HJUTPzng#;c;Rr&ZSNfJkA)9?EE; z{-e0~fT0jpg+Pj0jSuUEDJ1KpoSmMsXPCo>qx|}ruebP4u=0a?;8^82M+F|UG zL+w0Rz?GbwTzYun<*9%OGAHZEC%mpz2dhGBfq%sH{Pjm}Yw)-59|f}-8yn^Qa^JsG z%odE3c6E1G7?z3(3nf_PA*Z9tR~gxbu2~t`jQL(3CuRp{gC9w9D@#kMepvxhH(?$Y z9yT^dkafKuUEtF`WR03QB@xm1ZyUV*?2f|R0OybNCYar%2Q5fZ)g|`*yK5vBwC|ll zccQU#*S4T02|^2nkVi{F{h1;oBdNQnL8ZcTv@kH#N3GJ6uAfd2J8h>G6KbMYav0Jf z@|W0z;pex$g8q6xJUo(+RWt~@=auNMuV25y!^0C36Tgna(B}z(1H0f^q!{Im$F&1* z>KE7-84c#Dzkl;kvBQGvUe&piAD*)ZH^Le@GR?=>$N2>WCi~}K9k^2*ZEbF&BfiAM z#H{a!Jvx26o)n9pyo-EEx%uGy(wIa?H zl{~o62TN0_P+^3gl54u&^52RseqD2@O-xM83sJ%d-N^R;6S|LY(pT(Rj&@eRgh+30JlFv``{Zyu7@WL;sdHv(d2R=2U-VPKd(i+HzINv(CE% zQ6;e!Pl#B^_=Pc(9uxUT8#}w9{$U0trp>dP9O|5PVWQ~+Za6IV&dFXbGU3dE`Zr`7 zt81B3{`q^2AeycmKPzFLHvAD7T^o~T)u%OGIcDOt0+DwtsF|}op5Fek; z>)bv#8W7OYbz_k z1;K^1MMJKqD)JpgOz$|291k03ox=sh)z#I`uSAm^tUgNeQ2A^QPJDSc`KE9?J0oFO z;Ho&4ICdPi=POU6P)+6-635I;2M8kLaS{Hl+i`v#n(xEF%B1nlO<$36fV~~=Pa&&Zj z6AZZ*=0=8J|2}D;siW2XuhYcDR8ZQBGNz9enIfjgg&?he6{Q*fGD`D{^O;x}>@BQzc6NS9Qc+@r7It#6v$J!utEQtrhPft7 zva)m1Gt#<{tPL1C*S|F_*Gy?y)YVqfR#TfCn<9_t%`>4_$S^lG&F&miF6Fb@pv8O< z)4tYTeaT%X8`*sfm2jjp>6?hkK{+E(Pt?$yRHQE!SC4vu-%mouQf6Intb>bSl?}s}sQB_qPNanJhueSB`^BW=X$J|LkfP)z`>(yhClD4=VXj{Ai zn6UM|ilU;!O6#*AML)mh(^pTIMJBSdvjbrZkxV$F#c8w8db;F8%6owH;J<;q7%lln z-{}E%V@LIbE=QtN^l7m!)9?QK<&pNzyuG8t8^y`lnSqfpi24gS-MMi=V2Mzhp(eQ8 z`<5EB!DRif`i&lJWMt2@Uq79K#nj9!=g*&W<;>r|$@%%U>Ej?ePr&jv>EFM9yW_cM zH?XBb+l5*-O3IhX0D8fVJSsojoNfE&d!BAcS(LcHN+*8~cWnUD2O=sesjyG&sjZor znW$)>*DG&tZL_-( z#s6_2iNhP^&Fj|zV4A=|ZyWCU;o+#ZPkFf7nwrQJre^7J&B%^3dgYcLqU6+CX6nTx$?bOrmz6bsAjt@~(h{ANG&?f#OW(-eet6a4m+Ajt z5neqlS~$rY|H2D{(&aM44h95QH#a}dlPn}$W)}w3*RNkEW1iy*@6A@4f5%}0AxAY% zGJ8yf<+09faPBoGbvUtz+d2;+5|RNjQz@fCmDl7w!j&Ogz_Xm%T92hhPyAi{f}hFI zWP_^*e)FkR)O!)#3X|Rr1k`Mdd@BnT=W&1Thi%;%zB*l$Vg$NJx3TeY4t92ZK1qNp zy1O-0Rb3eDZ7qxQi#_L2Ft2>IsKm9H>cX+*`R-@G5;_SjZ z^;(l};{9^#NUOtMPO*NSeWR1 zZ})fS{YE0Jc?JdtGblxrSYoBKO*>7=GbJ+>drVKeL!;#6WD}V63JQKi$FcRejntiO zf07D#M#0QI)Yk{ST%3mn`#;>6D@*^>Bv+@!%FfPS?~a;Y-IsyP1OpRumhtkp`1g;Ic(cqFk08hE@Yq#VRe5@Om1tIc z$r^XPZqCeHovX4wDL_p@?Crlj4F)E==q5_ zrc~$H$XRA)f~adP|92b~C^rp*ut9WMdIZ|q?%7bfz`U)6j}I)8Sm1Jh)_L!+xaXT> z>T@2`x!AhOZ6h&RTCAly|B(Jo6i0&J!T?=;%+WL7SwH6WM)0Oj)1KDMEnw~O8hMxU zVO67pMlSWwhsn=!ILCI_IN0gJez#J6nEYuZE2OOUOM>K~-_Ypk>9xy^I&(Ap2rw~Y zG=6OJ|GU^@X)!C)PYqI6R>yFnr4(XH`w4~9Rkpu67VpJy7nSD1)3UT^kZlrajyMKFYFeR=kPM29j%fiYC zx_aoiITqK6gfouEspWb8qVjj}t;8 zA|kFH{_-4HCPM?o$VZ3t1X{Eou|qmW-&y-K!<+-&{}QG#e%>{ZA(A0WE#e2O-S*+; zW=+0YL0Cn%ldeFqyCnK~HwCa|`l-8Rvg}eSPM`=~UE|evkK8 z?D;lR16l2IWCO$a7!BCw(%0BJ2s-p}w~JTHOga^^BV_Lp zPi|lc(WvT0x}&PgCU$my!soDsSI+bE^XL%34zcsIf0BLgBik4gh#AwXTjRD^olzYs zMjoUnE-voka&9goQfQxFQ(pF3fVA4{!0Liz==SSv-cBB>kH{}219_`d?W-I`MKzty zPplsGf){eXm9jp@B_xPQ`@HP8`*kr>WYCf>Mpmp<^Re!3s_iJRxa4gET25A}^Zqp( z$c;Z3NT>uW{{DsCUoFRFadPp*#mD!VI&IE-*BtHcLiO&?3M46$xozhVnn|&6u^BeP zyxk8^JOtIE$ou&d zBN##!)7vN0Ph}Je$@I8BCR508Uu_T8@M|OWyKbA9i0xQqtxD9Xwu_d|hKd@m8`bF^ z#xZDos=;d1G4MaBiijBO*a>l})1}0Eb@Yato4eWjssxfLDI+6_IG8G=(u&(-QXvxg zU}$24nw6hl6v&QoHz4&?T7yhzW5{Q@yhKfOWH=u_F9pj# z2T2>&4y(SbuK&uPuX?*PNYFayo@v=Boo@8veI+AG=Jq6L zU$PT6Rh|t~&;U5*UC^;dV`h0~g+N|YQ&V~Vi7RT}n>TOx-S%fnR`gKhQF!c@^YT4+ zM@phIm8^BFMO9wdlzw(+SThV7N25WYK_EhrAdjJzOQFPi9itqh+60H$CI3s2&O^`- zc6|bvQVNb2WD_$pc%--@-nTXsq7h#?d%HLvgWxH6B$u$2-;yh~+RcP3EKKIq{SGpGKAstuzVZ%q&f3D|G?S*J%VcU|;zY zZ^Oid4$-&M4~Thwb+||fN=^dlY-O+pHEF-9;Wz34ZhnbmNjq6jA{ zEH&1fd;(Q9Ust)eat6NlYL;5N_AU2YQ0Sa(9>B-4^n3d|L8d%#D*B#cc{=HH^Ycdw z<(N@TGvuEtXA#NDH5)zq&75V<2AA!tt179YB`>Nj;Je`2>yXLB0H`$z)n)EpKamU& zGeVckD)j&H8C_EBrz9;Dy8Dws%xHAJiYxkaM~l%S_)EY%!7h1H(JT!uKV&L`Cmp>e z&SPq=!w@R_+d}b^8vGGXgmetxd-7x7lfMhPel84Z&L0g^ocXf!F@3S6o#bpJQMo^8 z5y=F<=Ki4TPhh?xT+J2c^7g(HzW<2$l0R*!?MRUpYw=5Sak1?%i?@-H@g@8b@s>c* zb}eAJ@t$Rku8!=zm%T~XP18GCY%w>pGBY!rYMK|LmKm1M;PcK|N0ZpJicL(MsX`4~ z9b_D!?`L>L{G2~fUrlFnY~lCd#Niygp%ruox*;-rb$Rj;5gQA)v5?8)E464!mY$aS ztanvd!5a|2q^4C_is(y?EGueln2Y*W7AvYMK;=|wn+I0jyC8OUj&EYWLzSlGD^ zRRc(Iysw*E+ZeCKOu69G3~f!B5_)}oeCjXq&R>ZK{>~~@QPZMI=#OjSr|(uE7V&?8 zO&jMB6U=>vOY|$?4Es^y=PGN+da)rDAj)$c7N2Wv&rVx(HWuZ>FLQUD444? zr1)wWSsjV)PNA!(JFDwvr+*lk;pSqif+^)3xJ7b(@Hw|8HzsC$_RO52k6}P=uz}yF zs7T^EVy4Oc>Q`GJfOA_1DQvLsRb~14`9S@t>m-X0laZE2gD^7TeDC#IUm(CIn4Oyu z{^rfPx2^@a{#MPM9Uu z-2N}H8_1(;Pv#>;4q%p}YvQs@)WKq}lSyLZlfR+?f$4H!_Ep`hW&7Lo5-A=Ij`8tH z6}gy>)gsMmqqD8S%0RPmd>3yC?+d@1k&%(_xGdyBAVxw7_e5?sFoQS`AoomChyVtW4I>dDUS8%snH3-}s6De9k#>eqT? zW@S+@GVTNNq@cZUy0o6JA^(zT&3KK8iSfYZ;M1(@_|cJ+768pUI(wU&la=N<)z#Gn z1qGrbAIN`d%Eo6#XPzFmVU+)AEYkI4)Yp-jpP1mJ6o ztehO`=K(7#Bd*z1kP=!328Kdf3XE?+t`H9v2h4Gw#CI$locM$U_Y?#UXAaEu5(9C- z2A^#Y1FgpLuf{oHmsqz?{l<8Q1S;wkaS6T6kwqzOp@p?AW>}CIMs&v(P-*f>gCwP; zlLg!l)0@1zB8U+R**&(eef%t?ELEH_1Ky7So`i!#CH?kidivq|f%Db?J|;&Dz^qL1 zQ=rO)PNTjNZ~wXWv#aZ4lI+K<(OTV-^mLL?u>w$0GBI78pR3wE0q=?2{7bjXxw*Ll z$BZ1|G#>w@98w;+6hS$)nKSNAL^5++^BiiG8^AdV(9&8Q)K{Ht4F$g98Bz9Yz4qDM z28Cou6w%>&oOjxnp^N3B(vtjUk5%%&B-aMYIk4dGxLuLNckZ(O+tq1GsK1%@oAY|d z_GNs_HDS)j!|oJ^OLeXizNm1>8zd5C%Lehzf3QZcrhn#})f$bU$RN0pEPh)LIRjr=zD2i;PrfNn$l@Uv6MU zv@hocmAcL(!irwzs6}&g^U<*VvsJW@t)J=|Q5Fn<-u{GKSDM`Srixjne3ex0*Yp)E z6~?P==GXyUk$lVf`G5BUe0F@c>~k+?=T_oH>MCzH)cESGBHjFn`Dnc>X)5*|uSp4y zh`2b{*WJQkWnNLfroxE+H@>-8>)X*iO#}T9Yn4}(%_S34b#Yg`cu0=&r1&4D75eLA ze|wqL9j@NO>vMN`kWi{CjO%q6CGx=Qv%{Lue}A)`5y#UYfoO<_!^yMbc)C7QJM(OT z-QgMq?pQm8+t$k7+MwQOH=06XY-}9){H?ITMO|g3v#5&bPUpy-`%(V}yNF23WWRb0 zSN)JtqtDH0eoU?^YEVT@r9qQX)oFmDsi`TC-NLts&|>?7X~Vsj^2n)zrWL0s7Pu_> zjlOr>5%PrvMcQ>frn*MDzzv|_KK%A^_C0wt8iehHEmt9fnU1cUwMMhip**E9#Vh$t z;2Ic8q4kHJVd1qGh9o}hkl6R6+~w(HSGx6(>Z#W}{QNF`UH_fJJm zS5B`AjfmHI&%gvDB_-vWUyv9%pBHRrBZ_)jZMv?ZE+H;%5GC1ned_H6$)&mFa7ATh zcO?G&{RUB$|Cjo%dTu{L0IsII9G?R$NOZB9ClN&w7njghEeN-=oL5&hJ3Z_U?m?Ei zGP_QkIfnFM-9brdwDiu8Sip>tB&5ar=2{qU_=(Ca@WM$EfhWCg~&| z&DWIvsTDI&5PA3R6G%(CizPaFBs2ai3HL2n8@ROgCOM^rEql3oxGcJ|((<>K+Y0c4 zfeWb%x%mnavf+Mr7d5*aIgfwWX{ckg40Kv-I-h_6o7aTJq^aU&_U7A*w?OGAy~DxC z-#A=sxOsKcCh{sqibYS*^vHtLjjX7=TY_ zIyEanBr8F|jas!tCJ2VGak84QX#p8i&R7np4VI3(KZ9jr&sw)CLcCCYW3MIYeNV2V zL9i3fDD~=5PzWAI@?X3vtckkX=#6Q33#jV?`yvg06KtFQ7jO^aF0L*Yo-EnsfM{1Y zn?l>hy}G7a`v#p(W6ujuM-9UG{x8#9)PLcUBCzcfD?T2{`q>Srt*Q6C2trTQEqFn( z+hK_JwfoounFU>jfRF&7QyRInKM#rT--dm?WeojCp08TqwWYwbNww*`HOR)zy;NhK zL0x&Lhnc5Zkf%Z!CrJjv$m2&LQg}$Va!5U@UXxeVEioeU+qd2s@}{PnB|;4!eRz!k zxAivs?YEakKDsd4MW2MVJP-kOYI6MGPSX}vy*9RX zFkh3B>@IG*mi4bW+``DFebvE2b?$hz!$3nKrBKd%1k_&ju5$qM9xOC*Tv%G|%qr%R z$(It<6f{aF6c+Z55asnh@wdlrQ$>1bCyh}xHuI-IFr-xt`z4A-h}&;e;ngBqK&>}E zFtdLe+z&J`6Lvl(ii2sK3U&!x&8WRbM1HsV(W31EE%ShxCj1H-`tyAx8y${83i_p>dG$EPwq|J=?|sy z0Y#?TZn40t`Bz-rWIjhOu$aW!cal3Q8;t=T*45Po0ebqxmp4uU(#M-5o>HYpC0F+1 z^0cI+04FRM3nO^Y?94+iYBHVQwIC%W1)5|5)FStzrK-xxEJa!l^TG4;)1t!C4%YCF zRp2SOxxSg1pQQ-OQOI~`Lm>UpyRq64V$kHJ=6UP}81KFwZg%duCTDjoEiC|LP*wrR z1dtr+9s}4}j-27^TM>g?^XvxxhJrr(<;G(E`a-d6r8=7usI9I~sw_3(fygb3;P=Ls z&v*STQ~wJE!td6iT>=zQfF~%bN2_r^ust}#8L0gGccIDp3eFDaDIg%DE&D#|X?tns zmQ_a4El*8t2@JU3p6|YB(0WRvFMJknHVsrVEnTUqB~cJXi`k95BGGkOFrB zo6SsF2r6lFO#Z3^Z}>6JaL>QhM{HExK=2syRIZ|SWGDMb(Up~?Qw~l>C!R<@V zr2qXwYWgVa;o&j-0ca(`!NDV9K;HT6C+j*=MZ=4X1UAvm)l`wzc>hzuOifAop5Z@5 zBYR+A07wV=^t7ZXB@cf^o?Lo6q<}94S#N0j%)7K27@vOpK(k=}PpFW&*&fcg%HHaY zp~VbdeuV3#31$8e}TfoVHP<-*`^70Z85f|K)lqNT)ng9eoT|I|1BhjH*x-=P_XL`O$=aBxsi zv$?ssNDoTZj}j7vOHRB*Kvc2dc~TZ0e0)=$7q)qsr&nfr28dS=G(eHTaO=>0Bb~yStv}J4z%` z)81VE{*Ps4tQO4wU1a^}=&>sn6%lb{dOD=~Klwri>OQnb$I9xkSnoO_{iF~)go%+4 zCUI=L2AU10zm0gdA!iNpMo2nz$_Ie6CK;MI&xbw&nhV4EV#-?Fmfi;Li{ z{}hdv{qand<>kBTMz*$ZnO=aelD@knTjy)W?MaDJs=~@N2>k5s~xwz^_k6N zX&*z(f?|(K8VefhO9tf$h zq#~_ugVlk|V+=10NTAfiiH!SLC67+`1G5}WA)XXL%)xqneLZu3UB}9g9b_8JeJRgY&3fn?3y8h92KGDZyc5nlU&N7s=*nHP zoTp!snaO6~)(GGz8YJ{}C{0ub?BVX{BBEX-3(Qw))7g2$(3wc!;KF7gFIK~c^R2BY6b5K&PfA;E2begiE)pZRZX;HRS>HQ2X^ zdH{~q=(jQWTrNUx+P{H>>^!6NVSH@t_k*J@^Hqb~GJ5Yn{bp}lxdYVY`;p?2?s@ae zg;~NW`yW!KNVqIS`>dK;%@5x%M0LLopm?3UtNbG&1uSydYS^;;I!Z~#-hAGk~%Wp?f+ggm*}~#eUA)75y1V5MsE2-7Fq7&%WwxbCv~}lo;C_lU=|FA z78dTog3m%J*H(XYXyI#NQp+Bb9+eWg@NPJW`gU~5>B;2gIIgm{sVOkUmfqNhpDtjg76G3KZY%^9|;F&6(JkC^zo5 z;;2#!mX*tqWR#YZ7f19&Jxgb`d=8P+!njuYRiG^)(S7fIm0>PanqQbC=v)DiFC?$L z`NR@B4()@64^p7B%hpqe3zO^+Wkt86f7hk!or>>*Ux{a@I>ugouJD#a2nrE-j)^}6ghh6>gg@6Uw8Ww z-FHNj%BOLuCDG9%%XL973eh2><)eW%@Wl^CTmk1eduLx>A;}iYP0AF|7otIkY=_dk z-Mb=5zoVC@8^6B(QnX)W*xXS8UL2J|O+s;-VsAzV1{mq+dfVDEtFo&yn*+Mn^P?KFSiGba5+3Df&KoHwF%vOY-zpLf`~BK-I}$rYvViwx z5B(P$=0jraF55$CQ$y+kIt`xATS{80o8PjjvVk8FxR#%1zE_a2hpfB=#cAI<9qy1p z&p@AUnM2#AOhSKuUs?#SLNa@3+oy$kF9vQlb?UeX0yeAIM_P=yKTzAA{(%P9D|IEy zXdo?Qlx8eTim)ezqy3c5R*F_CFE5X{h;ZRwTxj>1o3OOebGte?X%xI5Ng-`{90dlF z+0mQZsy$OKQ{b|6HXqtdI`Q(m-#_2~vi)k@OityaAVg9^!W{PRaBv~94QPHf-{MDlr1te>v zOvS`=Udw?XHs~gxHyqgO+}s}#0Ygb~ z|M97`toW@QcdF-W;1cn<^>fcoPhtq0AH_W_mh=$^5MQ)3bttJR>pg4HLs{xG$CSqk z=nI7PZu9fA^PSwq3=9n18=3!gK4K90`kI?K%~npBgDfKSq}m@YRe1x)gHid+=#UaE znqSMw-SSCdE_T}I4{*gRww*U3%lfb3#rVq#)%y*x2; z-qA&B7qkrGIAZ2$#i@j2)R!6r8GcG&`oo2=z;63Xb^K?%MAn+wh7;wpA1jU$IC6)- zbs7Z$MyJ8)q%Yak8Ys6m2(x2S=gXImmuEv6fSZTVo{R0295i4l2Y+w)9uWP(&dttN z4)E|}3lpgijCzz9bjxOdNND!BNigt>CeKeQ*V2}r18oa?g?rwSiAm{nKxx#|ove{+ zI6!WqSy)&+KfkbBu4jst^g@a7L9;ZnF)}ybHrb1fNgJQIUUPgEmhO>tC>iGPL0WFA83|$@?mh3+!fQlQB)R%^|4*@H-v5fKaa_h4pU_Ncm zY|h`sM%5cJu>#D5S&q3h)fmqZa!e$LsrI)9b6TMm>^wZJt1B*MTwppa4 zr7>hW`>+$q>%r^LP!4#GOTN*6~Hc2V!S4s=skjQT~B+vA9>z*(V@bB z3;Nv(%ml_SHs0{1bPD@k{*5Xfp310Z*OHBv{A;~k5_BEZ+8dxtY^U^LG2@riDdob54k4}KJ3519N2ytq0AlxX7>q8TIhKEJm&J*cZfC%>yA^fo4N7(1OtiD9Mjx5|T5ulf> zn5+T{26}R+WuHo^p+1Y5GI@!8$@JJ*`+7qN(1$ROUm^30PWG3!O}s~ZJsFO|{&;BanT4ed7cw#on$Zo&dvFqpG@g*W@NS(dp?0J3AW$k&Ni{`G=9t=7Rb*jR24nI$O07LBL z?x+whqiW}sD=3BTf=Df&Dw#Eo2Eju=yJ_795Th^Fydp6UJ8t-AdYxB2hLjja@Wiy= z3qmB29ZY}mqBsIz3u-N)La9F(L1?cj$bwEQPp@DV2xR|^%H8&tMiUfzhX;YjP|0^Q zQ(yG)F4q5a=XC(=u^Ymbbcu4wU$5soC|@E^qmVw(+vn)!>SxJ)dU`|bQ}{t051nw0 z)x`h);dIQ&ySpTkI1IjXsqJC9sRgA1{~yQUlC7Ga8ZkD0_U+!e!_|&)pUAMMzS8XE zA7EkZUoB8x>g($JZ2ki+V}*M{PR*d?hl~jZa?}MZ12|yVlaM>~kpZuQNR}j)^L|l< z1T>JaHOh`nQyh2+3gK!b09yjJeERhoiv%_Bg^GoLL-R_$KJOuwK!bpIPuRQ+$M&4= zQ9p&x+iWf;%Ukiq@D2zOwrx$mt-%CpoPzEUe5~RwhFR3rj zcLb)83I96}L4CgSel7!e1cb-GdoaNse-1GyU|34of zyp%gwjYd)FL;u!~VJOYqV>#@3)!fxlq$12L3`fQNBnZavse$W1PA_#Lca z@Z#^#^3u_!dym8rmGZDAr|!SM^-n5NnUFFc190=A@AE2+d^#RBHZ~zk!TZqTqD?<_Fo2(-&`}W&i#ygW2qwzwG-C-+i2T`c9JtSoxR@>IFUL zHd>>eS82`hK0jP4_67nAj6o(@^4F-vUW>lM@0J<)Zn9Jq4FociPiAGV+fy(YZ0+}2 zk-3&X(S25V^~tzeMsp#~3jV1BUdf-||7O}}T4z38Box-z&!(d#9H%q0V2sXo-Ylhg zQ*}}mv;*v3v`_>P)r&jSPhvo&pX8Z9N`D>Hj=Q)9w4!CZ+e?4G!fLl_lQ(=66r!$P z41nx>GS@N!Ll+bQf({WQj~+DR;o|JwVBaKtZ){5uESp(wA(W*{i=nQek%E_uR@R&o z1Y8c;*_$ym3j8mL_1+qpr6wk7D(SUxY-yoX=n7f5ikphNatX#^0^tT<(88fF21_r! zBtO`)<^!Mrn!;zs=Ej!h9s-sT`kb{Xjik&zZW*K?s9>r96LO|X>SCIKRzTOUw~qMi z|4e&ANd0E&vN))@w}^8ZW3n*68iF!KxWh-)o9T#ykdRP?W4uQonx*=@zp$XckOp3! zNT{SR7c?Dh?(bHbQkg!k_*7^zvapoS`auaxCI_)+TeU_ z1@(D>Rlz{OLfTwfqBB^9bkrru=AidTR{5cd7MxKp$hnodgb!yoT@YTu2#Xc5~-sYyLx z;Z@YvYF=%4Tfo7XuWF?#rYdU^4y^Em+ttOzOe{PKt|-C*?^)T|mGws^8bCz_4DyrJ z+-V;*TBrjh$?LuAmg~GFT-PvzAxW%`5P7#D_hr8ti(PVJJz~RLRyO9*&hgI9PE*y^ zyp_c^!%RcrC1EveH6Hs#WIW7Ib|*$!30QHQHC)qbllK7f=fLNzzvyOgM+8p*_%imO z(Eq^H;K3lcwAZcIqT6$ueH+fCWMF?+M`j56QB{1A_?fMy-JUIf0DvtqawQexm{UX% zz`-ca-0lP6um!`-bUIQG51+!2@_EvV$XE-@DzES5`Ema$@PLB8PL1yZj%)t_yoUvQ z{<2UOHaNRE5s4(_^AHQ5lYEKs@n6wkal`LF6n9v{b+m!hJg>Cad; zE#C}(yXvZwlb0Uq?^hwlGOU~hHZ3+zE}!*pxb4ik4Q_H=zZ)9v3b+a<7=W#Res)eR zUadfSfN3zHSl11R^@}10UB|%CvtGt08uGSt)lt7$-??CWq1o+jD}yK7DL=Pndjemj zHx_prWq+pm#VR_$Meb!8+_uR{*+~_^2^bT#M*5onC1Pf=PW9Sr4+Dec;g;*hdD1u> z8SBKWvZ8ZFwO&ADoZvn5WoWcRp0t^i!E|A3ev|e`40+!>(^iI3`qGlS(%YA&>{@f< zoaxUL6ckG5>5$oz7%7-KdS)c+9(9!TN2lhvXPWo8DV*vW^UL#_OPW&rmn6En#iKRQ8I_f0o17yE^_c2*#r)s$B$>C42W#R27FGK%?}QHcf((W<~2NFlHBK77vx z+gVbz8Y@alA_q+iYka`+^3`inr2WS#3+NpQ4T+>4pt*;I0reUMG)D}NPme+Q)BZM> z=z9thMXiDu3RJras<^N>-?fts>anAMm=K!unk0&ao)K8|ssn8s>b(e3`uh8%Onw&p z30zhJ48_utJS7@1@?Ln}KHdkoSUX$CQ>XrVP4~zHn#@;x0lDk$APBn8;n@LU`S@qx z??7Qf$t5Exn^DlPWJbXKVg|KH6TV-id0k6OOGqg~5#fqn00|-Ref&#Cw%rVfL&=B|3asOUK-ZN8i#{2Nae{_DP& zSmdj|v3>Ohay^~PuWNk#Y-cn}kfij= z>fzzR(9m#1_rHsDFE2kv(2=5{{VFX*wSD!Z1SCuxrB17S`m|E-y7w#Y>2B_^L&cH- zeY6KZm@Y(^jQFHhw5a$!KHP(Y`+T&Z0p)37(k&mA&)SHHh`RT8ZuI}w2Mf|52 zAjUK4m>C<77yp}^BhZEiUln=3zu2I0G1uR3-4%{MLj5$D0At{GpDs0!KxD%U4+;tr z)@OYMtQ)AcQGODO0y z3F!!ke`?-(S}aieUbRHjsTBpjTa=Vuoj?1z3c3cz3A;2!n5UL4BNmxhw#wB*V-0CWC9Nn%U63T@!>~GgzE~J~`E;=fB-#PY2-_&z7x@pZGoLRE ziWB-bhn3UQg#5WFXaXU>dHMO7waa=2+KcADfg}!`cYr?i1xX#ZpP9?^vHAWf;j*y@ z!0t&UJyMTvpu@c$70e3mWs56zqF4K~9PWp@7qJOpe>!hE5i=R4ONy{c_owMdW6&zS zCavJ(GP6o4;-r^{lLq?xbt=sUw@7&!8X8(EATBoN(73``S#F7_!0vT)$fVljhYug9 zvZ=h_y*vb)>wnLEHb*1Cv9d796E>1^?7d`~pZ0Ikzt5G+8ns(&?6hCEpQ&9XmG`XE zeYlw$t{kt-l~3oR34`475qqoXy`I72vaS zfByXe#FxiqpM~Q28nc1K=)}b9dI7Sd2hXeM9~6~l17jQ`&Mq!uh{2Ee%@!x*5)u+D zq%7r!y-#YOHpPfIyR%yPqEqZgIe5(9tpQ`JG;WTctpQlslFq;V{mecjSmX zT#Net0~SKZb3PJb5@_(8_8fzV!A)l}3+x4Kabe-1H&%ldD{7r|*nsu%PHx#4Z^{-J zx$lo!9)T+R@Eb8iS5O!H09VS@-O2K5%{>ZL7gc>-gYBIqVW^~XJQ2TB&)D4QNVF(e zAY?%p8I(hb!t48Wl~6hsG(;f%9v$orj{5F?#tV4=zg2eDK~;ubySE4tk&+HUq`Mmh z1eER$K|s1&K&3$hq(n-jTSAZqDFNxOO?P+0S@@lq@60>jnK_5y4`*bv+0S!7_r2n} zehc+0{{CdkmPuy!q3zMTMbEv0L>Xt1*-P+LEvr-xvla$cVa>IKIoR5|&IQ8a=Sc4M z-rjx&!oF^itB;sU2P4qZ@FziwkX~>VOcJLYeNeXLLG^@+I!#DAvSR_V4zQzQwdo2Z z$|ng1eF{zz@^E%^bkuwv2Tqw^@9cDR3wGyVGqo>v&^pP7PSxO`Q`VBg0%8?>Im${( zv_w%LL}I&Xw2QV242wL*ybPJIqK~jKMfu$L*d7?IuC6&&R6dscRLWT{{)?v@N?rnh z29Obz(Y4aGwPh8}(hlo{lgpTWH1L6>xP*92Omy+jQJfZ8R&KU}g6vO0!E}tw13f(i z?5_iplauZDDvFDDfBW6jVJ`n({M#Z6U!vX+#}IT3G;&{#Tf}NjyAm3hFw!#9i=^`U1k~4v0xWA2Y32|3(8~P zC?Rf$Hb|ITd)tZ_9+0ksE)h1dN~Y`%br#T)X{f80kDq_sC#H*d33!i$0A8az>vboz+)lh)=oQrr5f-7Xd+oivF}5ES}3Q}YC5QY@Cb`}Uin6Z3n4^)6B{Ws<@_9(S}L4JI7E8L zTh|`VPdM0k(R*rvP}LB>=@U9}Hqlz0#GrJQu*XD8sSHVLVB}2_qO#JhY);)YC!7sKypzU%py8!Ax2~;P$ zsxCd=`188g%(27-n7{TT(<@;&E_~(Ua`ej%`de;pZoDMSjEpjFf@h~|g^+Yc8yD!- zIj?WCIWvs6_n9~RM!FEhWzqT7)7xNou#_7u?|r(GIZ!$Pne;lM=4_(E0itrzlY|dHlg||fTP^ekyDhGhb8tM&BtH@zXk)ik&}~?pv-Ea7P@eU#SR3Edi<<9 zGg(jB)71Tq{_-Ph38Yh$;O5!=fE7TeT#U9|&U{J~JiI8Mn%i+j^RuVi5eJKEg`bu5=R=X6=K{*GEgFW0_UAidF<>uSzaNAVKs;_GkCY zOYGMx{k0szrJtpAseg4koGKaCp3{!2^c*7F$PpTS&x41$Azl!QI1vx6tSwvg{^aK+ zy*|g@zJ0s?L4z{lOHxv;*M&O(a=?KAtp(I4q9iw4tzVCijhr4Izg~FlS-gyc5nyC! zt~8}^)jBHTHL~NA8?wfr{k+1-T@_So?8n=1i{0PDW6Q(M3C35QTKBk@Y0f*9 zU&j8jijJ&u>TG7}g$j1GTs~v2 z${$=%4y%*h)jPdQCg9&XGpOvfR+gWuRj_u7(Mn~<@ZIq6hQDqV>= zi~$!dTKk!450+>urG(YR@X&en`Hvpfw5LdXNYGW!8CG`>KLkaltGoNG-B&ufy-KKV?bA^R>C00p+S3$3?NCt64C{NR_ho}M z=B1PrFNi%FB5y5BtWT`_irvjsFEn8#2xBKZ&^uop%tg17Fj31e4_2WU^4_VgNOwC9 z-2SPb7aE6S^vbNrbczg4JVs1ROarr5e1dO}cOQ1p$bb3!jl+3;A|-*#tUawL!brVP z>tf-QrB(bR8wZO2V!E6!}Ye#j?S)j#PMKD{k!`8 zkB$dClhsxwv6<>nSlBw4*>MFacTjM!xs{dbJ7FQW-KOqg8|%M1K?>i)=?w8(=#^8i z3V%>p!Cu29ijb&l6Mm%go zyL7qVFOQl6O>-$K@R#iXEeG^tnL;wkw73w$JT!iY=GMJtd2XHxYG80|i>4g!w2~j} zAMlR}U|iaVi)O&>3GXxs@b|YKug)*7WVd}Yy=<2nKO&3f_q{eln32&EA-U%(`bwnS z6RfxJaaj_$tS5LYF+9!A`(k47{6u>dh86Uc>vnQOGfXmKBU!)`D;##UvMUe!4ESzA z2my4O#AkJGYbJ6g7?BMVKP}YN)rWVF7nG^x6rZ$pd?XWc*O})X?9bOO?~8LBRC{e= z!cOoJ)?BUSP8^2`1|hq+(JaXQKFWR+sun_ad%(`kd1*c80#>-1`Y|pGAr!YEmBH$5 zF7NXlNdb?liRy_~OW)-oTRk{oP%nd8doh1AVWP^kmtTmW-AQk*)HQ5^2G>tlV6N$Ukat%VwK) za3YK-Ax4cxp$CM=N|o%*_cvu_WkED1$Ddqk-c0Y?(-KOYxRGdgheR~1BAbtydGpWA zn+QvGAH8r&QBybn##J7(eVe<2p?~&v*EnB5>(gUfc{zX z;yem-@NV)V8EfMcaYXQ%hIw3PHzYmGbb1n-7n zp3*L+>OVL?tyNnbXj5*uY=FQ|wTvGs`oCu4??31#&+$T=M*Riq@7Wz!Uj^~kO$Aq* ztIO+8QTayrQ15&IBL=rzybN_ePoIssIaHL|(`7!&{NQC2i+`4`n4g#LsKJlUpPHnb z92u>wrsO<(gafAnDuozMV;~#W+2JNmNVCnt$4^BCJDJiVs)ywS@kAh2(5=A5#hqVU z3TZH)AgVE8~{#hcOkchy<*!1EcwN0BZKP*|W ztgM)9orA!qS+M=>e%kU2Y3&fun&il6J|~P5HCZXrJ4S<~%96V(e)vM-V%KGJl8uYw z;K6RI0UPuKE^9B3HX-DwGJ*Ka+Ih3C{8F2cmiLzRz_KD-lxg^YQLP57Wf*1cVME|2 z??P-&j5@R%Lx7N*n|qH8-*$|TJv&dkM^{f1;XrxArXy$vb?waT&U0MRLO);{t`xV(5|n$M z9Ugu<6iM9m)>1T6oXu{!arKU`WO4iC+~+O|4#pF7a=wXyKl`JvvMbyF4t#8QU2Txr zFem#_7W_ib4YB53r=S=hz|X(F?jb?`<;&Ob?D-?-KXi0hj`uQT} z424RJ0Gy!ba8Xlhj2hL6xveJC7&T!PDhxl0?U-s`Bp@PyhIx)WT`nUrHm7g%>I(^c zN&E<@fu4~b2lU1{kOU$7G(h+67FI|jJSWCtmn@f$KGBfXxf~%5uPnoYgMS;a0)dc0 zJzvm%|Ig~fTvg*r{wgq%uKMO9Q~R{d?VO$K zIzWR^dwR$)D9*o8!Jz0wz~3(3^2+Xx;Cq(&$G&6Q<8>#8@ye!hn(%PY;-Vuf>**EL zM%nADZzgIm;>kC47~6xdQdJe|mK)^Lg?b}{y$7;oAI3Wu;4bESbcw;j5Revd=Fq0a zy*yB@bm~x}_p98{ACGEOCDkE;i(Cep$gSFw&C$_eYv>BN&bTVTwM$Vr7Od5wmNa;3 z=WLe*Dn0Yp2uX6!`T6;@uOW?sE-}yF(t?RQaKySlE zytBqnHgR}fFqG?1#I_kji?VUj2n3(2XFbHuveP@Rlo5ZH_EgW%!n#4GU4!!IK$bf4 zg|Q94?XlU8GL8|>;HWy3Whf&wH1$q&jGo2QVM*)#ifmihWwwsR(_M2?za$5piJ65( zY;-ILswsSlz7ky)&+%gfL`o-}b-@BrY8zO-+sjC*cBP+LlFL!}Xlr=N>tJ_BiHvO5 zVef1()$ny*V;|uBOO(Q6tx7k&2cgKzdGi?P|k?K zfQbtHN3Kr{yyzG;YW%YiD)bMxkr=J;045goC*9syGA=kST@!W>l+4DSd8E1nVqzi) z^3V9{_tQ;dHr6*PD=WdYhb1Z~Tv$-MS!nj_RgngjYO0a3nV+J8Xfo_DdJ)DC zqYbqwI9y+MuO+!M49wL zHS~$JatBa6pwvAW1!Y|!DR0{yZ~W*pY*AVop6g7vP*6)jDk`UsenCm~r>e;2S&{zK zV|{XH+FJ>f6~%kVt=Nt6(cs7ji*Mzm+Dv@0J5t^fX?IUkpuIEs0ggs9j?&w2ZzHyi z^DXm;R*92vg`c540>d47oPO0CE z4Fj(*57_mR^b&OwA9AsL$~&hy0WbU*;|7m;M{8G*tl-yQ-rbjc4okRr_=sP2sbOm_ zXV544F>2|H8Q&Sxv2Z{1zN)IK3cV^sJA?F`oUEKYT=If|I#Gn^I66H#)yL@X`j>nW z%R!DI2Nx%G16)vDsTb;AyzZs()F)pvn0trGe?C6b@ZRSMcH4|mz}7^aSb8nL>Re1y zVwJ7+#qe4zvtE1Os~x2C^Xj+G93GSSYo{e~hjNGI)`&{4y~@zg``0cT&ZZgLF1fB$ ziBDriMgftLk=YSuU`0x448ZfO{xh;X7)$qnkbQoFdhj4d(WhEe0#ya#^X@#EBgz|Xp#}{r?j{dVPR@4I9Oyw zPUAz+GP(Wuc4)I7fZEGimi3<~t2#P5P;4!Opu=0l8``3X}ou|@Wp;%j=|X0W`W<1=)z> z$rjJ5qX@!zsG?X~yTGrPl9D3d0ya_E+tFR!DwjllkKl&aoP#__C@8VGG1c}@I{*H? ztU9ZMiWNlzMGJMy%OdR=yiXcy?2hz|G`^1Mxqj(a#w{%yycJ$oG%;B|h<#panB zMLy5V;wDtHNDr;i|Vb4yEb`s~IPf;qB{3N1*7s=T;t)gzEW^v&N9 zwy-^No3ZMkmT!t}D){)ZGmZY4#u*2uTN5XZT|#GvjQW*2A0h(%42k0KIA}7G;|Xza z_NFg=j^*bdB4Lp)3?=4)R(_GAM#pUI&T)0Ropd&C&Qsbif^NGId8v%$hVd7XH)kN^ zFWz=8Axj_&lL=o7u{x531-|g{%ESwA9HrJ>ZM9zoy3UqQy%jK=53JRH%E zpRv2C4IgSSQ|@2^DkMvq%7E6tK{*m-!=lZ?*K_qwB%mmT?|#RoOQ z#h)xJEry6wYFlXgVn$2Aa+D9iApUwlo9i>)Fkr~f%X@r!pi{~Q&5oZI!#Vt&U}}QW z$@KEHRBCTbE6dUTJ|ivTBkVu`=OL01cxrg<+%a`^B0(~g*g=3$vKY#PO%yc+$XJoI zRKDRM@f~eOG+R?O`nuYo%?6OZPfkppdQ({J`!3hl*W-6VA1P)PzpX@=(rAuUWc^pX zeR*|pf@lU1e1Mjv6WzSCvjbvQaY{B}VW2eWje33OSShStZ0sG}8TP3Ymhlc`eWTIC z3P<mc$YV1=?2Br$|7yKWPBf5Qz^^ell7oB2bqV3&uz#ad% zj-1bP*3rz(OhkkXQfZKYLc&RcoH}r=kciDxRFc>4ZfJPsq)9Cr*s%asY6fpJcMlH+ z50m3tUdGRj0iLA8oN3Vu#~q+_qaK2>S~f)?Au%yJ1ei^nTwDO=p*y2|+41s3R5(t& zth5x~o`;JE2??1l77%kq#l`dxl!i2KZf-(Ln~A9t(SUe5^^`iYXms8G)Zh9UPsG!K zp&@P#jM>!9CCYuTh3c$C;iPqWP@={&0Jefs9Q*(4= zAP}teO!*Z$*4iH0@2*OwQb6`zT>QCXjuOe<*?EYdG%`M3`Vpp%Zn88QS**IMZnN3a zbdf8ZnHClnp_eWIW#hD_`<<#Q;KD{IbD#<6r4zfOFd+GOjS4+{SGhQ3LK^dFSA4YL zHj2vz!ijh0M_A#50rcf@sOhVDmz}~rJw;a=*Pef~k|{kZyZ$&JY`?ssr&Z%LGE;7G zem+W&sltBY<#zb={WYHY=ge2MM_ZFeyW20Tk`E^q?5#GQH9QmW8o7DUFW(Wv;$UYV zM1oJqM*q8cbfNz8HhVUD4pKFCSjTv!+nT({Wtvxm3be>R#&IMGdyZWVyP0Y0xjAKN zFjDvb;pOX^ob+srC1%W@=JvgMG+DhV(slXD%$gAUFmI}?I`8~#-${kTVvhCrjnkOe zyh5}x9~_6ct@CQ7ZXU&BW8 z18Lo+P-3&8rna{CwwTJOr8A`eTPuL5^uBoh0Yb@|fFKJqGx+a1wJ(=e4c^ad29}b& z3#ti|+7CCzMb6eavIuV=Vjz|y24zd;$`$&=>?ENQcu3R)k#q-#ZiFgUB3~2wq$PJS3wRDI?Mn^X<*sIFJ z^T&l21^Z80T2>NlXcZL|&uXrrdno=ua0f`G(P8K5fl(PpQXnC6c?^Wm|82Cg)=GNAT)I4|UXO!?wbLF&&Sf4|RKzy$@EXAPRH@EE&jvgWxoY_z zw61+}4^+e{?ZAe}63^wZD3e9`@0D^V&+xl06{2$gY$wvu|T+Y zXvlfFCq;qpx>fz)nT}2ZRN7l`QBY7|p}||D7(zgu(+Wnv{tQ_k{%iA`H}3}@ALz#f zVt(&m0hYo=wE--@OW|o@?!xKmX-ue~Y;4?Dy?KKmkQHj3$t6EKtvVB&yVjUh_4KR_ z48GY>?nL2` zCl_D=8gBYviPC&Z%3>_kx#~Q9V75n|AuQ-}I&oS!Y*C_jhJAA1f`@lR;BOKSaX>3w zChdH1RrzL;j9`WRL3`r3ORX&(Ix-G69=qq_zEg7H+VZkO@&ezVy-4HaeLeB|hdNS~ z;n9)JYm0=$L;(-(k&|$Kc}iW6xCaRL+!yJ6>whifS>#PoOc{|wFn=2s!GjG*JRQVX zA3b(()Dxi62Hy)2`O%4gSKNxp%D&=Up7D(LiVaI%N^-hj|SKM0(>x1U4kppq(6_u@nQ;0rk*yHI_*X$1;K7cFmZSCpapP&d- zpJScN&BUs!*z>xIkVROCK*pB1^R}Ve!&~iOMvD&(k7}nqwHJy(Pia}%*a`8ux;(=L zen0ZgFB)7w`5@1l(B5LPSTj6<}-)lSS-+IhPL@3N|DNYd47in!DSAA@^ zvydB`Yo7B(#^jCE8z~Lc_fk($gPLc@d29fkncUx=(!au8#@(MG*FV(19s`^ZrLCe9 z^9yw{GBV~*%%FHZ=sbWUguL_kPtWgdAulxSIC1(&{wiLE+(4PfAY*e0sk~Bj2}cUw zot~TzQTZGnDZp>Qji$91x3h4+eP-H+CCXDc39;jklA_1cs30o62JR?Me2*}a1a9+c&MNpb zxQ4j2zGxE=6OfCzR~Hn>^)M~3ua}mWL(LR2I!OR#{pI7>xl;|&Ji#Q_{XdG3ae{Z{ zFy@fl5>Byk;kk`yJGkn8?@b|mZp2%j1^9X-WoiqcZjTTx4;_E5}d#@Q^C*tpV1YnChjI(sR_w|QtX!6^7KSQ=pkTH-L0bms8WbHH2~T(CSF|QNGB9Y z0e3wd9uw0tw+C%QDr~dU(iL%Y{hFIAW-Fk?156|toBN%lclh_3P>#r}U1z?>7UCz$ z#Y$13^BYa7ul;5G8-6R1-)j|wj?nF?xv0hx#mSU858MGEB=7_I-KxsBY5|cn-Saeq z8;61lOZq#FWLO{pgw>@hV>I%K==UF7c#R){8oPVx%44l=YqExi*_}i>K=rhAe?6`Q zeEEso9z>xMkwM1lk%eTuwvV9F6k9l)UsZm7`(oI;BuSi_!naA34cW)dScrBWO%SV& z);a?IPCOr3@9kR5I{|tW@l?^CXl-nRAuDtgN`3zrgMQtrQ)9A`T^>uHl3miQ1((+XfOLAag zd#yr+5#XbX4=cngPRPZ1tEA8~D;#J!F&QL9ZcBCWD<8OO%TK1tS)N z$MfUKbDUQBgsZvgPX!o$;tkWR3EXm~E}1ga%6J)lS?xnSqNtMfuk18bZSErbP<#%0 zdsF{}`M&IZa6JRAMAY0Ov~lLO5~1juPE!l#&4~)9HMIzh*EXi)cx2pfn{55LQ@1u? zuZGHU`xIe&YOH9=^u1#ihCBt@aIK?XqA5WBzbI@8?+FKt?J)0|`}UF#>}~C>IMnh6 zZ`cZSYs=m?@BX(e++Zq+`e{TAu&zYOrlt^zs!&;tJ7 z7k2@$m?IXDoo(hM>qJxDKiR9x=Lg*`P0d7MPc8b0-(INjM^??Q&+8~@7``@n{mM9n zEjRyXei+g?-v(@E8q2H;-aNogfG?493}6966Z~Z+#xCLh?^{~vOrSwxu_@f%w%v4@ zs5;uLos24XDD}`fFU>A`;ig7NL4}D5M;=o?Q&5x0lo=Tw86F9`9cf7$&yZER}|la1?JLIcZip z5(%w{_ARreK16#y=2IFqPUme++VYXaVeT|^L!iu?<`SbRX#qrj3bc%t6{B9irz?$T1k z*bM?n6iG>x*4rK!3U^ibL-e$i+*f|5|G;{MOOJFY1|baMq1e4f=)EQgcv_EVSh->+ zy?c!L$CnMuNU!2sP2@!sp)zw)jVsRrGnC=_IEZlg7SB)iybVcd(c9a*)yPgZ{&ahI zN$`p{;n>|t$c@akxAv61i0)9gbtU=zh)Pl|Mykj0bPUD#%=1Jd=A7eYU&?$I7}GDWrry%R$sgaobZ0$ z{~6jDx}7bZ-giFn7F?>g#cuDvC4UD@Kvx}uS7s@xxjrxfs9j=!!F0bdNn z%R6|a8>Fhys$B(LR7%|^8gj&$Wf?=GgPNmHKpYN(A4V*ldFqILn&0%6?t_eFiHa{j z0VW#MzGI1Pqf-ekN@0s^UKjdO3~54b8Dg|q(~U{BVeZy-SJ{C>^*us)060#tFo%ZJ zBBXq2ra^Qh`%z}QX^BV%Uc#ly1-U#G+6&K9&}gCaH~wy)jTRGpX#ZTs+Ww4m1+)c;*F`yX1`5QtM9l-T|Y|H@9I zx(?<1@or!L*nek+d>~&npCi52Ti1JliXaZ~t9d#V*g3Z#|JqKWV_+CBF?}GK1(ckV ze?Smn66n!G=?s;E3{X9z#c63&S^t#ID6>FKqU?1LqmWDBO<_a2riUQgUgJ?}|A*9& ziG?MA{$D0%@c)?`0tsICnwx_B1@fzG<;-2z>e>)15YKKQY7}(;iLqmM!I*ME=XSjP zDyyIz$@=K_jbnzW=;-VDLY$l`C#B!Mef#-SwdNfVbCQxEYeUp{#4>8$IzYabcN46y zuLGDQ-<^n*G@tE@J@5{pY#I>kz6NsI|3bO_CmQ9y6N+<(2GtzB-t zVfu2t_g(vFZ zwV0XQ73N#%#qFj_go2&hzw%%9Cv{CpVFEt%V2-MS^grb>%yol$;F@uXNms&M)oV%$ z`3PMdiW2I&aH2=~@Nn6`(U|eE}I`Ru~as5pG$AX_~)vgMY1$Y&( z<%Fxzpu+YHHAwtBRDFMM-l`wJFv$iFkGPy%S3qef$R?g(1bAGnrMOC4PyD(m0BLU) zOn_*fs@JZiS@149ZyjuYC=65SL^NmPngEq}C98&f3K`$D*!8XbA0M=B?)o|ppSr@* zkEOxwXpqtBv*-^t-HT;L_5JX!;iej%+Lm#CJ41Uvd!OThqhuJt{bVdSO>W1lP);7~ z6{tBg1c?WSg$xh&UocDw2|d0z&0mX%h*+gdcBBjHZ(!qQ_i_Q{D4Nn{CMwm3-jvjA zT=T6c5$D}6K9RT61h0RUp0k{@iG&G$`8^89GsFfkDXNcDA!}y$`}p)xbyfMaeMQ~H zp*ByQN7hykf=-?a8}_0VEyocd$ZiQnnhfon^~#<;>Up&SVzNy{oq*SbE9LuRuVM49 zJU+^xKZuq~&-`~Kk$a!zW8RpVHIUtc!?}Lwk2Rya7Hn*-9|;_`W@^A$*q51JP_T7^ zfd^u{Ef*y8`+yche{}@c&A=d%VIJuT5*R6=4AmR?olmFh02D$Q6OOiykEWB?m`=88 zuk^48cY3$kkKM$*Oy7S1^;%Bhlyrnp=}|m&c;G5j3hqA3EJ%r zuBrF;B|Rh~6P_6EP_Nm(*UbEB!O>QYQ5y@JQf(a}-khsF>Muvf^aYY(>|sNZV*Di7d^9)s~hbFHM1o~a05 zzL}A1My0n;x+TxPfH~~+4(|6Q`HUF9TUHGiWKq+Gsy`E2)O9m>w9hh zF2DwMglZ4Ulx4-S$8j>;RJN$0qI+cXo>vVQ@Ik=*mY1KW-?MFFKH*}ZulFn|+AlgJ zQd%HWNQk56Tb9ABZ%}`xOzW%Usw;CbeH4COsCY#Hi^Xu7TC>EmLT*!DC?+8>besZ1$!8y4xT z>rk=3(6yS3h?Fe8SG?36cRlW|!C(Nt0;ZcNDPiOJaB;Ckhg>%%p|P@Ru_mIq9aI#- zw(fO(H5`}{VyZs~GBM@fsJr1C9#Dl6(wviD$dpZ6R9xEkhp|FOPerMz$FPYh*ullF z6=xd?za2cx`Zdm6D@vc!e=cCwQLOsi3%N(A_3_EQ*k2XD=!_X-NS%AGjdQO%`sW4(&KKAtEgrJ8prZ~Cy_ zdjF{I(bb=#$M~OFG_ryU%Y@+=NCbDn%upkgLY_PHJmESq9Px zG8+MU=q`L3=fCUQJ=;l$yF#4ahi|hr+&5Z&&UdsyO@R?vx@J3J)WJUhU7dvy3--n8 zh_`&BqrGv@O%J?PLtch_{v0WFr_Z!Q^+FAwep${u61q^yh?bX{!l?1ZKkqKzdfBtkj4|es;sI{*QD!S{_aC~@X z!$D^Jdj7TV{kzIrh#lL#W5>2kSDkMBo{7KJW!Z=OEB$~W!J@!g4Y+dyfw_O<1OD>z z>Yt7_n43hlNtT1LW^iSI=C_-+{o-*|(Gg_~UQ9t(K@P?nUraxlyJ%>AeSPNUZ*mIr zhySRB{#HSAlIp=Up79^^AJ!Tl_^3i9S-@NX-IxnHme`I8LFOty-6<9QDHWSHuLB{{ z%!Xc#_xFN3x1QN40?@-zDvN&BgS&sCy}uuaA}TR1zi8k~gpmqX;rzmiAEvpLS#-zz z50qPPI(%H#cIH~G61bs`C8;er*!J|c&}|z0%!IszfjkvSk4`yrT~giKp0`7ToQIro z(b6HZ?QiI%%_}S{)EsH~Btz-qXpZNVo>NTk8y;DM6DPA-MWz0y#%W2-*~D4hG!}9l zhIv$qY?WZlS!cT|o$6q!@0A(+zTv4QCW+x~uLX#!K$RZ68oX5NL{%M>9b|&U?t~?( zJE;q(^24XssR4x^&z9G!ryfstXXpKp#-X9XL(caP?bRiRK~f7iIl?(pg{*GmMgvv? zw8Rgs7MpUM$oB&pgPIK^r1tYz@x)S;Ikk#WDVY56@WLJjJzw=ZOAYP!$22r6aW8xq zESf^g%yhYRd8MYVwg$5Zzo3I&^PCNmn5b9z=oiCJV%w@JCQ&JLbvy6**twE~J`+O? zxA^dKwMKv%1AkVtVgdzJQ7W8J|Iqybb=Ho=Ag13kP<=a!v*AEaYh zRAbanPmX1SlR(Sa@{J=(OmuB+4WC)}cxmmPkL{fV8A?!m)jVJl(hl~-+ktq^=LqJO zK8(RDjvs|jQj=O!lX`*ViA$;Iu2$&{Ew^!WTFkJHwM7?;1a3fSZ?@k&cm$$IW@M}!lYmhyHFjZPw+Ngi2<=rs& z+oNOLet8J0^KMW8xS_O|lby{y-|3Ke{fKr?aW!?IH&sGgOQUvuc@QxwM;%VMza)VY z^kmk8ZkSVhi2(i6J2BK3#(nCw0&$|wKV05`1lnmSCM-7W^uF^LuN7e!JEkZZg6xOI z`y-^5k#|d=G#eTi=%M927=N0xXM5N)IA~>U27j+gQn`w`wOOtG23kPB!>kH(EIuy& zM6CnN>HyWp8=aL#>sR`<&T;((YQM6k4-?0g;$U#h;GbnKWki4X#6Wd=#lmsh+Z z(C(StUxPnEhX8=bZ#Iu`@0K_u-*>?Z_AB3-?E3p>!18Q*yFDf0AoQT{tqZ;1>e_~M zY9BaUHYe&*iLx5!_5d3VuDK4wqFcx)^#w@ZnBY=dPgXpMY$G8d`M9r7@)O7{jh(6B zo}%HQF?99iR@NRpzJ|_eojP_r(1vqA)uNx+oY;D*rqiUPQ>L>ej7+{BYe2glTD{OI znLKSAN_j7~BI7P5+qmITK5AK35mzBGbJ^418!zm3`d$o0sb6`N$r7Ij9}=(%QG~*j zf{xC*!PXDkOHumh)w#LIgoL-V13{~m<`8veYn;LnvR-Wo)71JtD;?ldeGXhyTO4#6 z1Vp}#wV8=o(GT9d+M-&C02z6)yCDaAI~{GE70K=*Gq$2$&uVi^auullwsp37BuGBO z2KcwB$s6P!w zi(wpfs(oayrzR)V-e(MRUKJxC04%Mutguw+F7h->IjiyOCMRY;4Qg>T*VUrjV4U zEs&DouuE6yl>H0HC}J|~OS!E`bT~toS@KATxv0^68eBcxkJx&ee-9YKOkXHmU3~Xu z#3Lplu(YziNSlA*VJd(Z!o|S_?dey2aV(Zs825?HjjZ?PS0WF)oEb4JObi!S=X31d z?2xa+R=zd8J<-;;GuLv@_XFZ$3l1zO-OC3jgU;&Som-4#fTjf%fK{G5(KIOi?=7+r ztc(0AD3fEv>wm*(!C?X7K)%nde*$5%qg~+aws$c z49OQlHX_hNQz$QX#^ICT>L{v00T+@zKn^F8CdhWm42G~Re}tbBzg2W3JG$&xY0nkq z(sey0uG(|aWD&j#86_wqs6&(Ye`|tFo~U97McF|a=8~eJpkpjgrV729@QsZgHhJ@a zP%teFKTXl>eeL_KVZs3TrC(bqe7QJ4w&3+lJ|sUhKR=$*FbDc7OPxT3IY%fl)Gq@__(8wh4zA_ZK zCm)=|N#~BOLUf}C5U>B$pZg|nQ_;FO)@f03QlXF!PU~VCKY3x8WaqWV|F$0dt4Hsl zvaE0q{+05<3sO*6%>VnP|DACE9~G4A3~yR&-@E9S9|J#Mg)#i>jTg`5#0x|XKKw5P CV&)$J literal 0 HcmV?d00001 diff --git a/docs/reference/glib/html/glib-Arrays.html b/docs/reference/glib/html/glib-Arrays.html new file mode 100644 index 0000000..21dc885 --- /dev/null +++ b/docs/reference/glib/html/glib-Arrays.html @@ -0,0 +1,848 @@ + + + + +Arrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Arrays

+

Arrays — arrays of arbitrary elements which grow + automatically as elements are added

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GArray;
+GArray*             g_array_new                         (gboolean zero_terminated,
+                                                         gboolean clear_,
+                                                         guint element_size);
+GArray*             g_array_sized_new                   (gboolean zero_terminated,
+                                                         gboolean clear_,
+                                                         guint element_size,
+                                                         guint reserved_size);
+GArray *            g_array_ref                         (GArray *array);
+void                g_array_unref                       (GArray *array);
+guint               g_array_get_element_size            (GArray *array);
+#define             g_array_append_val                  (a,v)
+GArray*             g_array_append_vals                 (GArray *array,
+                                                         gconstpointer data,
+                                                         guint len);
+#define             g_array_prepend_val                 (a,v)
+GArray*             g_array_prepend_vals                (GArray *array,
+                                                         gconstpointer data,
+                                                         guint len);
+#define             g_array_insert_val                  (a,i,v)
+GArray*             g_array_insert_vals                 (GArray *array,
+                                                         guint index_,
+                                                         gconstpointer data,
+                                                         guint len);
+GArray*             g_array_remove_index                (GArray *array,
+                                                         guint index_);
+GArray*             g_array_remove_index_fast           (GArray *array,
+                                                         guint index_);
+GArray*             g_array_remove_range                (GArray *array,
+                                                         guint index_,
+                                                         guint length);
+void                g_array_sort                        (GArray *array,
+                                                         GCompareFunc compare_func);
+void                g_array_sort_with_data              (GArray *array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+#define             g_array_index                       (a,t,i)
+GArray*             g_array_set_size                    (GArray *array,
+                                                         guint length);
+gchar*              g_array_free                        (GArray *array,
+                                                         gboolean free_segment);
+
+
+
+

Description

+

+Arrays are similar to standard C arrays, except that they grow +automatically as elements are added. +

+

+Array elements can be of any size (though all elements of one array +are the same size), and the array can be automatically cleared to +'0's and zero-terminated. +

+

+To create a new array use g_array_new(). +

+

+To add elements to an array, use g_array_append_val(), +g_array_append_vals(), g_array_prepend_val(), and +g_array_prepend_vals(). +

+

+To access an element of an array, use g_array_index(). +

+

+To set the size of an array, use g_array_set_size(). +

+

+To free an array, use g_array_free(). +

+

+

+
+

Example 19. Using a GArray to store gint values

+
+  GArray *garray;
+  gint i;
+  /* We create a new array to store gint values.
+     We don't want it zero-terminated or cleared to 0's. */
+  garray = g_array_new (FALSE, FALSE, sizeof (gint));
+  for (i = 0; i < 10000; i++)
+    g_array_append_val (garray, i);
+  for (i = 0; i < 10000; i++)
+    if (g_array_index (garray, gint, i) != i)
+      g_print ("ERROR: got %d instead of %d\n",
+               g_array_index (garray, gint, i), i);
+  g_array_free (garray, TRUE);
+ 
+
+


+
+
+

Details

+
+

GArray

+
typedef struct {
+  gchar *data;
+  guint len;
+} GArray;
+
+

+Contains the public fields of an Array.

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

gchar *data;

a pointer to the element data. The data may be moved as + elements are added to the GArray. +

guint len;

the number of elements in the GArray not including the + possible terminating zero element. +
+
+
+
+

g_array_new ()

+
GArray*             g_array_new                         (gboolean zero_terminated,
+                                                         gboolean clear_,
+                                                         guint element_size);
+

+Creates a new GArray with a reference count of 1.

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

zero_terminated :

TRUE if the array should have an extra element at + the end which is set to 0. +

clear_ :

TRUE if GArray elements should be automatically cleared + to 0 when they are allocated. +

element_size :

the size of each element in bytes. +

Returns :

the new GArray. +
+
+
+
+

g_array_sized_new ()

+
GArray*             g_array_sized_new                   (gboolean zero_terminated,
+                                                         gboolean clear_,
+                                                         guint element_size,
+                                                         guint reserved_size);
+

+Creates a new GArray with reserved_size elements preallocated and +a reference count of 1. This avoids frequent reallocation, if you +are going to add many elements to the array. Note however that the +size of the array is still 0.

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

zero_terminated :

TRUE if the array should have an extra element at + the end with all bits cleared. +

clear_ :

TRUE if all bits in the array should be cleared to 0 on + allocation. +

element_size :

size of each element in the array. +

reserved_size :

number of elements preallocated. +

Returns :

the new GArray. +
+
+
+
+

g_array_ref ()

+
GArray *            g_array_ref                         (GArray *array);
+

+Atomically increments the reference count of array by one. This +function is MT-safe and may be called from any thread.

+
++ + + + + + + + + + +

array :

A GArray. +

Returns :

The passed in GArray. + +
+

Since 2.22

+
+
+
+

g_array_unref ()

+
void                g_array_unref                       (GArray *array);
+

+Atomically decrements the reference count of array by one. If the +reference count drops to 0, all memory allocated by the array is +released. This function is MT-safe and may be called from any +thread.

+
++ + + + +

array :

A GArray. +
+

Since 2.22

+
+
+
+

g_array_get_element_size ()

+
guint               g_array_get_element_size            (GArray *array);
+

+Gets the size of the elements in array.

+
++ + + + + + + + + + +

array :

A GArray. +

Returns :

Size of each element, in bytes. + +
+

Since 2.22

+
+
+
+

g_array_append_val()

+
#define             g_array_append_val(a,v)
+

+Adds the value on to the end of the array. The array will grow in +size automatically if necessary. +

+

+

+
+

Note

+

g_array_append_val() is a macro which uses a reference +to the value parameter v. This means that you cannot use it with +literal values such as "27". You must use variables.

+
+
++ + + + + + + + + + + + + + +

a :

a GArray. +

v :

the value to append to the GArray. +

Returns :

the GArray. +
+
+
+
+

g_array_append_vals ()

+
GArray*             g_array_append_vals                 (GArray *array,
+                                                         gconstpointer data,
+                                                         guint len);
+

+Adds len elements onto the end of the array.

+
++ + + + + + + + + + + + + + + + + + +

array :

a GArray. +

data :

a pointer to the elements to append to the end of the array. +

len :

the number of elements to append. +

Returns :

the GArray. +
+
+
+
+

g_array_prepend_val()

+
#define             g_array_prepend_val(a,v)
+

+Adds the value on to the start of the array. The array will grow in +size automatically if necessary. +

+

+This operation is slower than g_array_append_val() since the +existing elements in the array have to be moved to make space for +the new element. +

+

+

+
+

Note

+

g_array_prepend_val() is a macro which uses a reference +to the value parameter v. This means that you cannot use it with +literal values such as "27". You must use variables.

+
+
++ + + + + + + + + + + + + + +

a :

a GArray. +

v :

the value to prepend to the GArray. +

Returns :

the GArray. +
+
+
+
+

g_array_prepend_vals ()

+
GArray*             g_array_prepend_vals                (GArray *array,
+                                                         gconstpointer data,
+                                                         guint len);
+

+Adds len elements onto the start of the array. +

+

+This operation is slower than g_array_append_vals() since the +existing elements in the array have to be moved to make space for +the new elements.

+
++ + + + + + + + + + + + + + + + + + +

array :

a GArray. +

data :

a pointer to the elements to prepend to the start of the + array. +

len :

the number of elements to prepend. +

Returns :

the GArray. +
+
+
+
+

g_array_insert_val()

+
#define             g_array_insert_val(a,i,v)
+

+Inserts an element into an array at the given index. +

+

+

+
+

Note

+

g_array_insert_val() is a macro which uses a reference +to the value parameter v. This means that you cannot use it with +literal values such as "27". You must use variables.

+
+
++ + + + + + + + + + + + + + + + + + +

a :

a GArray. +

i :

the index to place the element at. +

v :

the value to insert into the array. +

Returns :

the GArray. +
+
+
+
+

g_array_insert_vals ()

+
GArray*             g_array_insert_vals                 (GArray *array,
+                                                         guint index_,
+                                                         gconstpointer data,
+                                                         guint len);
+

+Inserts len elements into a GArray at the given index.

+
++ + + + + + + + + + + + + + + + + + + + + + +

array :

a GArray. +

index_ :

the index to place the elements at. +

data :

a pointer to the elements to insert. +

len :

the number of elements to insert. +

Returns :

the GArray. +
+
+
+
+

g_array_remove_index ()

+
GArray*             g_array_remove_index                (GArray *array,
+                                                         guint index_);
+

+Removes the element at the given index from a GArray. The following +elements are moved down one place.

+
++ + + + + + + + + + + + + + +

array :

a GArray. +

index_ :

the index of the element to remove. +

Returns :

the GArray. +
+
+
+
+

g_array_remove_index_fast ()

+
GArray*             g_array_remove_index_fast           (GArray *array,
+                                                         guint index_);
+

+Removes the element at the given index from a GArray. The last +element in the array is used to fill in the space, so this function +does not preserve the order of the GArray. But it is faster than +g_array_remove_index().

+
++ + + + + + + + + + + + + + +

array :

a GArray. +

index_ :

the index of the element to remove. +

Returns :

the GArray. +
+
+
+
+

g_array_remove_range ()

+
GArray*             g_array_remove_range                (GArray *array,
+                                                         guint index_,
+                                                         guint length);
+

+Removes the given number of elements starting at the given index +from a GArray. The following elements are moved to close the gap.

+
++ + + + + + + + + + + + + + + + + + +

array :

a GArray. +

index_ :

the index of the first element to remove. +

length :

the number of elements to remove. +

Returns :

the GArray. +
+

Since 2.4

+
+
+
+

g_array_sort ()

+
void                g_array_sort                        (GArray *array,
+                                                         GCompareFunc compare_func);
+

+Sorts a GArray using compare_func which should be a qsort()-style +comparison function (returns less than zero for first arg is less +than second arg, zero for equal, greater zero if first arg is +greater than second arg). +

+

+If two array elements compare equal, their order in the sorted array +is undefined.

+
++ + + + + + + + + + +

array :

a GArray. +

compare_func :

comparison function. +
+
+
+
+

g_array_sort_with_data ()

+
void                g_array_sort_with_data              (GArray *array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Like g_array_sort(), but the comparison function receives an extra +user data argument.

+
++ + + + + + + + + + + + + + +

array :

a GArray. +

compare_func :

comparison function. +

user_data :

data to pass to compare_func. +
+
+
+
+

g_array_index()

+
#define             g_array_index(a,t,i)
+

+Returns the element of a GArray at the given index. The return +value is cast to the given type. +

+

+

+
+

Example 20. Getting a pointer to an element in a GArray

+
+  EDayViewEvent *event;
+  /* This gets a pointer to the 4th element
+     in the array of EDayViewEvent structs. */
+  event = &g_array_index (events, EDayViewEvent, 3);
+ 
+
+


+
++ + + + + + + + + + + + + + + + + + +

a :

a GArray. +

t :

the type of the elements. +

i :

the index of the element to return. +

Returns :

the element of the GArray at the index given by i. +
+
+
+
+

g_array_set_size ()

+
GArray*             g_array_set_size                    (GArray *array,
+                                                         guint length);
+

+Sets the size of the array, expanding it if necessary. If the array +was created with clear_ set to TRUE, the new elements are set to 0.

+
++ + + + + + + + + + + + + + +

array :

a GArray. +

length :

the new size of the GArray. +

Returns :

the GArray. +
+
+
+
+

g_array_free ()

+
gchar*              g_array_free                        (GArray *array,
+                                                         gboolean free_segment);
+

+Frees the memory allocated for the GArray. If free_segment is +TRUE it frees the memory block holding the elements as well and +also each element if array has a element_free_func set. Pass +FALSE if you want to free the GArray wrapper but preserve the +underlying array for use elsewhere. If the reference count of array +is greater than one, the GArray wrapper is preserved but the size +of array will be set to zero. +

+

+

+
+

Note

+

If array elements contain dynamically-allocated memory, +they should be freed separately.

+
+
++ + + + + + + + + + + + + + +

array :

a GArray. +

free_segment :

if TRUE the actual element data is freed as well. +

Returns :

the element data if free_segment is FALSE, otherwise + NULL. The element data should be freed using g_free(). +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Asynchronous-Queues.html b/docs/reference/glib/html/glib-Asynchronous-Queues.html new file mode 100644 index 0000000..6f4bac2 --- /dev/null +++ b/docs/reference/glib/html/glib-Asynchronous-Queues.html @@ -0,0 +1,799 @@ + + + + +Asynchronous Queues + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Asynchronous Queues

+

Asynchronous Queues — asynchronous communication between threads

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GAsyncQueue;
+GAsyncQueue*        g_async_queue_new                   (void);
+GAsyncQueue*        g_async_queue_new_full              (GDestroyNotify item_free_func);
+GAsyncQueue*        g_async_queue_ref                   (GAsyncQueue *queue);
+void                g_async_queue_unref                 (GAsyncQueue *queue);
+void                g_async_queue_push                  (GAsyncQueue *queue,
+                                                         gpointer data);
+void                g_async_queue_push_sorted           (GAsyncQueue *queue,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+gpointer            g_async_queue_pop                   (GAsyncQueue *queue);
+gpointer            g_async_queue_try_pop               (GAsyncQueue *queue);
+gpointer            g_async_queue_timed_pop             (GAsyncQueue *queue,
+                                                         GTimeVal *end_time);
+gint                g_async_queue_length                (GAsyncQueue *queue);
+void                g_async_queue_sort                  (GAsyncQueue *queue,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+
+void                g_async_queue_lock                  (GAsyncQueue *queue);
+void                g_async_queue_unlock                (GAsyncQueue *queue);
+void                g_async_queue_ref_unlocked          (GAsyncQueue *queue);
+void                g_async_queue_unref_and_unlock      (GAsyncQueue *queue);
+void                g_async_queue_push_unlocked         (GAsyncQueue *queue,
+                                                         gpointer data);
+void                g_async_queue_push_sorted_unlocked  (GAsyncQueue *queue,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+gpointer            g_async_queue_pop_unlocked          (GAsyncQueue *queue);
+gpointer            g_async_queue_try_pop_unlocked      (GAsyncQueue *queue);
+gpointer            g_async_queue_timed_pop_unlocked    (GAsyncQueue *queue,
+                                                         GTimeVal *end_time);
+gint                g_async_queue_length_unlocked       (GAsyncQueue *queue);
+void                g_async_queue_sort_unlocked         (GAsyncQueue *queue,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+
+
+
+

Description

+

+Often you need to communicate between different threads. In general +it's safer not to do this by shared memory, but by explicit message +passing. These messages only make sense asynchronously for +multi-threaded applications though, as a synchronous operation could as +well be done in the same thread. +

+

+Asynchronous queues are an exception from most other GLib data +structures, as they can be used simultaneously from multiple threads +without explicit locking and they bring their own builtin reference +counting. This is because the nature of an asynchronous queue is that +it will always be used by at least 2 concurrent threads. +

+

+For using an asynchronous queue you first have to create one with +g_async_queue_new(). A newly-created queue will get the reference +count 1. Whenever another thread is creating a new reference of (that +is, pointer to) the queue, it has to increase the reference count +(using g_async_queue_ref()). Also, before removing this reference, the +reference count has to be decreased (using +g_async_queue_unref()). After that the queue might no longer exist so +you must not access it after that point. +

+

+A thread, which wants to send a message to that queue simply calls +g_async_queue_push() to push the message to the queue. +

+

+A thread, which is expecting messages from an asynchronous queue +simply calls g_async_queue_pop() for that queue. If no message is +available in the queue at that point, the thread is now put to sleep +until a message arrives. The message will be removed from the queue +and returned. The functions g_async_queue_try_pop() and +g_async_queue_timed_pop() can be used to only check for the presence +of messages or to only wait a certain time for messages respectively. +

+

+For almost every function there exist two variants, one that locks the +queue and one that doesn't. That way you can hold the queue lock +(acquire it with g_async_queue_lock() and release it with +g_async_queue_unlock()) over multiple queue accessing +instructions. This can be necessary to ensure the integrity of the +queue, but should only be used when really necessary, as it can make +your life harder if used unwisely. Normally you should only use the +locking function variants (those without the suffix _unlocked) +

+
+
+

Details

+
+

GAsyncQueue

+
typedef struct _GAsyncQueue GAsyncQueue;
+

+The GAsyncQueue struct is an opaque data structure, which represents +an asynchronous queue. It should only be accessed through the +g_async_queue_* functions. +

+
+
+
+

g_async_queue_new ()

+
GAsyncQueue*        g_async_queue_new                   (void);
+

+Creates a new asynchronous queue with the initial reference count of 1.

+
++ + + + +

Returns :

the new GAsyncQueue. +
+
+
+
+

g_async_queue_new_full ()

+
GAsyncQueue*        g_async_queue_new_full              (GDestroyNotify item_free_func);
+

+Creates a new asynchronous queue with an initial reference count of 1 and +sets up a destroy notify function that is used to free any remaining +queue items when the queue is destroyed after the final unref.

+
++ + + + + + + + + + +

item_free_func :

function to free queue elements +

Returns :

the new GAsyncQueue. + +
+

Since 2.16

+
+
+
+

g_async_queue_ref ()

+
GAsyncQueue*        g_async_queue_ref                   (GAsyncQueue *queue);
+

+Increases the reference count of the asynchronous queue by 1. You +do not need to hold the lock to call this function.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

the queue that was passed in (since 2.6) +
+
+
+
+

g_async_queue_unref ()

+
void                g_async_queue_unref                 (GAsyncQueue *queue);
+

+Decreases the reference count of the asynchronous queue by 1. If +the reference count went to 0, the queue will be destroyed and the +memory allocated will be freed. So you are not allowed to use the +queue afterwards, as it might have disappeared. You do not need to +hold the lock to call this function.

+
++ + + + +

queue :

a GAsyncQueue. +
+
+
+
+

g_async_queue_push ()

+
void                g_async_queue_push                  (GAsyncQueue *queue,
+                                                         gpointer data);
+

+Pushes the data into the queue. data must not be NULL.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

data :

data to push into the queue. +
+
+
+
+

g_async_queue_push_sorted ()

+
void                g_async_queue_push_sorted           (GAsyncQueue *queue,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Inserts data into queue using func to determine the new +position. +

+

+This function requires that the queue is sorted before pushing on +new elements. +

+

+This function will lock queue before it sorts the queue and unlock +it when it is finished. +

+

+For an example of func see g_async_queue_sort().

+
++ + + + + + + + + + + + + + + + + + +

queue :

a GAsyncQueue +

data :

the data to push into the queue +

func :

the GCompareDataFunc is used to sort queue. This function + is passed two elements of the queue. The function should return + 0 if they are equal, a negative value if the first element + should be higher in the queue or a positive value if the first + element should be lower in the queue than the second element. +

user_data :

user data passed to func. +
+

Since 2.10

+
+
+
+

g_async_queue_pop ()

+
gpointer            g_async_queue_pop                   (GAsyncQueue *queue);
+

+Pops data from the queue. This function blocks until data become +available.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

data from the queue. +
+
+
+
+

g_async_queue_try_pop ()

+
gpointer            g_async_queue_try_pop               (GAsyncQueue *queue);
+

+Tries to pop data from the queue. If no data is available, NULL is +returned.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

data from the queue or NULL, when no data is +available immediately. +
+
+
+
+

g_async_queue_timed_pop ()

+
gpointer            g_async_queue_timed_pop             (GAsyncQueue *queue,
+                                                         GTimeVal *end_time);
+

+Pops data from the queue. If no data is received before end_time, +NULL is returned. +

+

+To easily calculate end_time a combination of g_get_current_time() +and g_time_val_add() can be used.

+
++ + + + + + + + + + + + + + +

queue :

a GAsyncQueue. +

end_time :

a GTimeVal, determining the final time. +

Returns :

data from the queue or NULL, when no data is +received before end_time. +
+
+
+
+

g_async_queue_length ()

+
gint                g_async_queue_length                (GAsyncQueue *queue);
+

+Returns the length of the queue, negative values mean waiting +threads, positive values mean available entries in the +queue. Actually this function returns the number of data items in +the queue minus the number of waiting threads. Thus a return value +of 0 could mean 'n' entries in the queue and 'n' thread waiting. +That can happen due to locking of the queue or due to +scheduling.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

the length of the queue. +
+
+
+
+

g_async_queue_sort ()

+
void                g_async_queue_sort                  (GAsyncQueue *queue,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Sorts queue using func. +

+

+This function will lock queue before it sorts the queue and unlock +it when it is finished. +

+

+If you were sorting a list of priority numbers to make sure the +lowest priority would be at the top of the queue, you could use: +

+
+ gint32 id1;
+ gint32 id2;
+  
+ id1 = GPOINTER_TO_INT (element1);
+ id2 = GPOINTER_TO_INT (element2);
+  
+ return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
+
+
++ + + + + + + + + + + + + + +

queue :

a GAsyncQueue +

func :

the GCompareDataFunc is used to sort queue. This + function is passed two elements of the queue. The function + should return 0 if they are equal, a negative value if the + first element should be higher in the queue or a positive + value if the first element should be lower in the queue than + the second element. +

user_data :

user data passed to func +
+

Since 2.10

+
+
+
+

g_async_queue_lock ()

+
void                g_async_queue_lock                  (GAsyncQueue *queue);
+

+Acquires the queue's lock. After that you can only call the +g_async_queue_*_unlocked() function variants on that +queue. Otherwise it will deadlock.

+
++ + + + +

queue :

a GAsyncQueue. +
+
+
+
+

g_async_queue_unlock ()

+
void                g_async_queue_unlock                (GAsyncQueue *queue);
+

+Releases the queue's lock.

+
++ + + + +

queue :

a GAsyncQueue. +
+
+
+
+

g_async_queue_ref_unlocked ()

+
void                g_async_queue_ref_unlocked          (GAsyncQueue *queue);
+
+

Warning

+

g_async_queue_ref_unlocked is deprecated and should not be used in newly-written code.

+
+

+Increases the reference count of the asynchronous queue by 1. +

+

+Deprecated: Since 2.8, reference counting is done atomically +so g_async_queue_ref() can be used regardless of the queue's +lock.

+
++ + + + +

queue :

a GAsyncQueue. +
+
+
+
+

g_async_queue_unref_and_unlock ()

+
void                g_async_queue_unref_and_unlock      (GAsyncQueue *queue);
+
+

Warning

+

g_async_queue_unref_and_unlock is deprecated and should not be used in newly-written code.

+
+

+Decreases the reference count of the asynchronous queue by 1 and +releases the lock. This function must be called while holding the +queue's lock. If the reference count went to 0, the queue will be +destroyed and the memory allocated will be freed. +

+

+Deprecated: Since 2.8, reference counting is done atomically +so g_async_queue_unref() can be used regardless of the queue's +lock.

+
++ + + + +

queue :

a GAsyncQueue. +
+
+
+
+

g_async_queue_push_unlocked ()

+
void                g_async_queue_push_unlocked         (GAsyncQueue *queue,
+                                                         gpointer data);
+

+Pushes the data into the queue. data must not be NULL. This +function must be called while holding the queue's lock.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

data :

data to push into the queue. +
+
+
+
+

g_async_queue_push_sorted_unlocked ()

+
void                g_async_queue_push_sorted_unlocked  (GAsyncQueue *queue,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Inserts data into queue using func to determine the new +position. +

+

+This function requires that the queue is sorted before pushing on +new elements. +

+

+This function is called while holding the queue's lock. +

+

+For an example of func see g_async_queue_sort().

+
++ + + + + + + + + + + + + + + + + + +

queue :

a GAsyncQueue +

data :

the data to push into the queue +

func :

the GCompareDataFunc is used to sort queue. This function + is passed two elements of the queue. The function should return + 0 if they are equal, a negative value if the first element + should be higher in the queue or a positive value if the first + element should be lower in the queue than the second element. +

user_data :

user data passed to func. +
+

Since 2.10

+
+
+
+

g_async_queue_pop_unlocked ()

+
gpointer            g_async_queue_pop_unlocked          (GAsyncQueue *queue);
+

+Pops data from the queue. This function blocks until data become +available. This function must be called while holding the queue's +lock.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

data from the queue. +
+
+
+
+

g_async_queue_try_pop_unlocked ()

+
gpointer            g_async_queue_try_pop_unlocked      (GAsyncQueue *queue);
+

+Tries to pop data from the queue. If no data is available, NULL is +returned. This function must be called while holding the queue's +lock.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

data from the queue or NULL, when no data is +available immediately. +
+
+
+
+

g_async_queue_timed_pop_unlocked ()

+
gpointer            g_async_queue_timed_pop_unlocked    (GAsyncQueue *queue,
+                                                         GTimeVal *end_time);
+

+Pops data from the queue. If no data is received before end_time, +NULL is returned. This function must be called while holding the +queue's lock. +

+

+To easily calculate end_time a combination of g_get_current_time() +and g_time_val_add() can be used.

+
++ + + + + + + + + + + + + + +

queue :

a GAsyncQueue. +

end_time :

a GTimeVal, determining the final time. +

Returns :

data from the queue or NULL, when no data is +received before end_time. +
+
+
+
+

g_async_queue_length_unlocked ()

+
gint                g_async_queue_length_unlocked       (GAsyncQueue *queue);
+

+Returns the length of the queue, negative values mean waiting +threads, positive values mean available entries in the +queue. Actually this function returns the number of data items in +the queue minus the number of waiting threads. Thus a return value +of 0 could mean 'n' entries in the queue and 'n' thread waiting. +That can happen due to locking of the queue or due to +scheduling. This function must be called while holding the queue's +lock.

+
++ + + + + + + + + + +

queue :

a GAsyncQueue. +

Returns :

the length of the queue. +
+
+
+
+

g_async_queue_sort_unlocked ()

+
void                g_async_queue_sort_unlocked         (GAsyncQueue *queue,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Sorts queue using func. +

+

+This function is called while holding the queue's lock.

+
++ + + + + + + + + + + + + + +

queue :

a GAsyncQueue +

func :

the GCompareDataFunc is used to sort queue. This + function is passed two elements of the queue. The function + should return 0 if they are equal, a negative value if the + first element should be higher in the queue or a positive + value if the first element should be lower in the queue than + the second element. +

user_data :

user data passed to func +
+

Since 2.10

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Atomic-Operations.html b/docs/reference/glib/html/glib-Atomic-Operations.html new file mode 100644 index 0000000..5577506 --- /dev/null +++ b/docs/reference/glib/html/glib-Atomic-Operations.html @@ -0,0 +1,312 @@ + + + + +Atomic Operations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Atomic Operations

+

Atomic Operations — basic atomic integer and pointer operations

+
+ +
+

Description

+

+The following functions can be used to atomically access integers and +pointers. They are implemented as inline assembler function on most +platforms and use slower fall-backs otherwise. Using them can sometimes +save you from using a performance-expensive GMutex to protect the +integer or pointer. +

+

+The most important usage is reference counting. Using +g_atomic_int_inc() and g_atomic_int_dec_and_test() makes reference +counting a very fast operation. +

+
+

Note

+

+You must not directly read integers or pointers concurrently accessed +by multiple threads, but use the atomic accessor functions instead. +That is, always use g_atomic_int_get() and g_atomic_pointer_get() for +read outs. +They provide the neccessary synchonization mechanisms like memory +barriers to access memory locations concurrently. +

+
+
+

Note

+

+If you are using those functions for anything apart from simple +reference counting, you should really be aware of the implications of +doing that. There are literally thousands of ways to shoot yourself in +the foot. So if in doubt, use a GMutex. If you don't know, what +memory barriers are, do not use anything but g_atomic_int_inc() and +g_atomic_int_dec_and_test(). +

+
+
+

Note

+

+It is not safe to set an integer or pointer just by assigning to it, +when it is concurrently accessed by other threads with the following +functions. Use g_atomic_int_compare_and_exchange() or +g_atomic_pointer_compare_and_exchange() respectively. +

+
+
+
+

Details

+
+

g_atomic_int_get ()

+
gint                g_atomic_int_get                    ();
+

+Reads the value of the integer pointed to by atomic. Also acts as +a memory barrier. +

+
++ + + + +

Returns :

the value of *atomic +
+

Since 2.4

+
+
+
+

g_atomic_int_set ()

+
void                g_atomic_int_set                    ();
+

+Sets the value of the integer pointed to by atomic. +Also acts as a memory barrier. +

+

Since 2.10

+
+
+
+

g_atomic_int_add ()

+
void                g_atomic_int_add                    ();
+

+Atomically adds val to the integer pointed to by atomic. +Also acts as a memory barrier. +

+

Since 2.4

+
+
+
+

g_atomic_int_exchange_and_add ()

+
gint                g_atomic_int_exchange_and_add       ();
+

+Atomically adds val to the integer pointed to by atomic. It returns +the value of *atomic just before the addition took place. +Also acts as a memory barrier. +

+
++ + + + +

Returns :

the value of *atomic before the addition. +
+

Since 2.4

+
+
+
+

g_atomic_int_compare_and_exchange ()

+
gboolean            g_atomic_int_compare_and_exchange   ();
+

+Compares oldval with the integer pointed to by atomic and +if they are equal, atomically exchanges *atomic with newval. +Also acts as a memory barrier. +

+
++ + + + +

Returns :

+TRUE, if *atomic was equal oldval. FALSE otherwise. +
+

Since 2.4

+
+
+
+

g_atomic_pointer_get ()

+
gpointer            g_atomic_pointer_get                ();
+

+Reads the value of the pointer pointed to by atomic. Also acts as +a memory barrier. +

+
++ + + + +

Returns :

the value to add to *atomic. +
+

Since 2.4

+
+
+
+

g_atomic_pointer_set ()

+
void                g_atomic_pointer_set                ();
+

+Sets the value of the pointer pointed to by atomic. +Also acts as a memory barrier. +

+

Since 2.10

+
+
+
+

g_atomic_pointer_compare_and_exchange ()

+
gboolean            g_atomic_pointer_compare_and_exchange
+                                                        ();
+

+Compares oldval with the pointer pointed to by atomic and +if they are equal, atomically exchanges *atomic with newval. +Also acts as a memory barrier. +

+
++ + + + +

Returns :

+TRUE, if *atomic was equal oldval. FALSE otherwise. +
+

Since 2.4

+
+
+
+

g_atomic_int_inc ()

+
void                g_atomic_int_inc                    (gint *atomic);
+

+Atomically increments the integer pointed to by atomic by 1. +

+
++ + + + +

atomic :

a pointer to an integer. +
+

Since 2.4

+
+
+
+

g_atomic_int_dec_and_test ()

+
gboolean            g_atomic_int_dec_and_test           (gint *atomic);
+

+Atomically decrements the integer pointed to by atomic by 1. +

+
++ + + + + + + + + + +

atomic :

a pointer to an integer. +

Returns :

+TRUE, if the integer pointed to by atomic is 0 after +decrementing it. +
+

Since 2.4

+
+
+
+

See Also

+

+

+
++ + + + +

GMutex

GLib mutual exclusions.

+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Automatic-String-Completion.html b/docs/reference/glib/html/glib-Automatic-String-Completion.html new file mode 100644 index 0000000..6b7e2f6 --- /dev/null +++ b/docs/reference/glib/html/glib-Automatic-String-Completion.html @@ -0,0 +1,438 @@ + + + + +Automatic String Completion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Automatic String Completion

+

Automatic String Completion — support for automatic completion using a group + of target strings

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GCompletion;
+GCompletion*        g_completion_new                    (GCompletionFunc func);
+gchar *             (*GCompletionFunc)                  (gpointer );
+void                g_completion_add_items              (GCompletion *cmp,
+                                                         GList *items);
+void                g_completion_remove_items           (GCompletion *cmp,
+                                                         GList *items);
+void                g_completion_clear_items            (GCompletion *cmp);
+GList*              g_completion_complete               (GCompletion *cmp,
+                                                         const gchar *prefix,
+                                                         gchar **new_prefix);
+GList*              g_completion_complete_utf8          (GCompletion *cmp,
+                                                         const gchar *prefix,
+                                                         gchar **new_prefix);
+void                g_completion_set_compare            (GCompletion *cmp,
+                                                         GCompletionStrncmpFunc strncmp_func);
+gint                (*GCompletionStrncmpFunc)           (const gchar *s1,
+                                                         const gchar *s2,
+                                                         gsize n);
+void                g_completion_free                   (GCompletion *cmp);
+
+
+
+

Description

+

+GCompletion provides support for automatic completion of a string +using any group of target strings. It is typically used for file +name completion as is common in many UNIX shells. +

+

+A GCompletion is created using g_completion_new(). Target items are +added and removed with g_completion_add_items(), +g_completion_remove_items() and g_completion_clear_items(). A +completion attempt is requested with g_completion_complete() or +g_completion_complete_utf8(). When no longer needed, the +GCompletion is freed with g_completion_free(). +

+

+Items in the completion can be simple strings (e.g. filenames), or +pointers to arbitrary data structures. If data structures are used +you must provide a GCompletionFunc in g_completion_new(), which +retrieves the item's string from the data structure. You can change +the way in which strings are compared by setting a different +GCompletionStrncmpFunc in g_completion_set_compare().

+
+
+

Details

+
+

GCompletion

+
typedef struct {
+  GList* items;
+  GCompletionFunc func;
+ 
+  gchar* prefix;
+  GList* cache;
+  GCompletionStrncmpFunc strncmp_func;
+} GCompletion;
+
+

+The data structure used for automatic completion.

+
++ + + + + + + + + + + + + + + + + + + + + + +

GList *items;

list of target items (strings or data structures). +

GCompletionFunc func;

function which is called to get the string associated with a + target item. It is NULL if the target items are strings. +

gchar *prefix;

the last prefix passed to g_completion_complete() or + g_completion_complete_utf8(). +

GList *cache;

the list of items which begin with prefix. +

GCompletionStrncmpFunc strncmp_func;

The function to use when comparing strings. Use + g_completion_set_compare() to modify this function. +
+
+
+
+

g_completion_new ()

+
GCompletion*        g_completion_new                    (GCompletionFunc func);
+

+Creates a new GCompletion.

+
++ + + + + + + + + + +

func :

the function to be called to return the string representing + an item in the GCompletion, or NULL if strings are going to + be used as the GCompletion items. +

Returns :

the new GCompletion. +
+
+
+
+

GCompletionFunc ()

+
gchar *             (*GCompletionFunc)                  (gpointer );
+

+Specifies the type of the function passed to g_completion_new(). It +should return the string corresponding to the given target item. +This is used when you use data structures as GCompletion items.

+
++ + + + + + + + + + +

Param1 :

the completion item. +

Returns :

the string corresponding to the item. +
+
+
+
+

g_completion_add_items ()

+
void                g_completion_add_items              (GCompletion *cmp,
+                                                         GList *items);
+

+Adds items to the GCompletion.

+
++ + + + + + + + + + +

cmp :

the GCompletion. +

items :

the list of items to add. +
+
+
+
+

g_completion_remove_items ()

+
void                g_completion_remove_items           (GCompletion *cmp,
+                                                         GList *items);
+

+Removes items from a GCompletion.

+
++ + + + + + + + + + +

cmp :

the GCompletion. +

items :

the items to remove. +
+
+
+
+

g_completion_clear_items ()

+
void                g_completion_clear_items            (GCompletion *cmp);
+

+Removes all items from the GCompletion.

+
++ + + + +

cmp :

the GCompletion. +
+
+
+
+

g_completion_complete ()

+
GList*              g_completion_complete               (GCompletion *cmp,
+                                                         const gchar *prefix,
+                                                         gchar **new_prefix);
+

+Attempts to complete the string prefix using the GCompletion +target items.

+
++ + + + + + + + + + + + + + + + + + +

cmp :

the GCompletion. +

prefix :

the prefix string, typically typed by the user, which is + compared with each of the items. +

new_prefix :

if non-NULL, returns the longest prefix which is + common to all items that matched prefix, or NULL if + no items matched prefix. This string should be freed + when no longer needed. +

Returns :

the list of items whose strings begin with prefix. This + should not be changed. +
+
+
+
+

g_completion_complete_utf8 ()

+
GList*              g_completion_complete_utf8          (GCompletion *cmp,
+                                                         const gchar *prefix,
+                                                         gchar **new_prefix);
+

+Attempts to complete the string prefix using the GCompletion target items. +In contrast to g_completion_complete(), this function returns the largest common +prefix that is a valid UTF-8 string, omitting a possible common partial +character. +

+

+You should use this function instead of g_completion_complete() if your +items are UTF-8 strings.

+
++ + + + + + + + + + + + + + + + + + +

cmp :

the GCompletion +

prefix :

the prefix string, typically used by the user, which is compared + with each of the items +

new_prefix :

if non-NULL, returns the longest prefix which is common to all + items that matched prefix, or NULL if no items matched prefix. + This string should be freed when no longer needed. +

Returns :

the list of items whose strings begin with prefix. This should +not be changed. + +
+

Since 2.4

+
+
+
+

g_completion_set_compare ()

+
void                g_completion_set_compare            (GCompletion *cmp,
+                                                         GCompletionStrncmpFunc strncmp_func);
+

+Sets the function to use for string comparisons. The default string +comparison function is strncmp().

+
++ + + + + + + + + + +

cmp :

a GCompletion. +

strncmp_func :

the string comparison function. +
+
+
+
+

GCompletionStrncmpFunc ()

+
gint                (*GCompletionStrncmpFunc)           (const gchar *s1,
+                                                         const gchar *s2,
+                                                         gsize n);
+

+Specifies the type of the function passed to +g_completion_set_compare(). This is used when you use strings as +GCompletion items.

+
++ + + + + + + + + + + + + + + + + + +

s1 :

string to compare with s2. +

s2 :

string to compare with s1. +

n :

maximal number of bytes to compare. +

Returns :

an integer less than, equal to, or greater than zero if + the first n bytes of s1 is found, respectively, to be + less than, to match, or to be greater than the first n + bytes of s2. +
+
+
+
+

g_completion_free ()

+
void                g_completion_free                   (GCompletion *cmp);
+

+Frees all memory used by the GCompletion.

+
++ + + + +

cmp :

the GCompletion. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Balanced-Binary-Trees.html b/docs/reference/glib/html/glib-Balanced-Binary-Trees.html new file mode 100644 index 0000000..df25234 --- /dev/null +++ b/docs/reference/glib/html/glib-Balanced-Binary-Trees.html @@ -0,0 +1,800 @@ + + + + +Balanced Binary Trees + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Balanced Binary Trees

+

Balanced Binary Trees — a sorted collection of key/value pairs optimized + for searching and traversing in order

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GTree;
+GTree*              g_tree_new                          (GCompareFunc key_compare_func);
+GTree*              g_tree_ref                          (GTree *tree);
+void                g_tree_unref                        (GTree *tree);
+GTree*              g_tree_new_with_data                (GCompareDataFunc key_compare_func,
+                                                         gpointer key_compare_data);
+GTree*              g_tree_new_full                     (GCompareDataFunc key_compare_func,
+                                                         gpointer key_compare_data,
+                                                         GDestroyNotify key_destroy_func,
+                                                         GDestroyNotify value_destroy_func);
+void                g_tree_insert                       (GTree *tree,
+                                                         gpointer key,
+                                                         gpointer value);
+void                g_tree_replace                      (GTree *tree,
+                                                         gpointer key,
+                                                         gpointer value);
+gint                g_tree_nnodes                       (GTree *tree);
+gint                g_tree_height                       (GTree *tree);
+gpointer            g_tree_lookup                       (GTree *tree,
+                                                         gconstpointer key);
+gboolean            g_tree_lookup_extended              (GTree *tree,
+                                                         gconstpointer lookup_key,
+                                                         gpointer *orig_key,
+                                                         gpointer *value);
+void                g_tree_foreach                      (GTree *tree,
+                                                         GTraverseFunc func,
+                                                         gpointer user_data);
+void                g_tree_traverse                     (GTree *tree,
+                                                         GTraverseFunc traverse_func,
+                                                         GTraverseType traverse_type,
+                                                         gpointer user_data);
+gboolean            (*GTraverseFunc)                    (gpointer key,
+                                                         gpointer value,
+                                                         gpointer data);
+enum                GTraverseType;
+gpointer            g_tree_search                       (GTree *tree,
+                                                         GCompareFunc search_func,
+                                                         gconstpointer user_data);
+gboolean            g_tree_remove                       (GTree *tree,
+                                                         gconstpointer key);
+gboolean            g_tree_steal                        (GTree *tree,
+                                                         gconstpointer key);
+void                g_tree_destroy                      (GTree *tree);
+
+
+
+

Description

+

+The GTree structure and its associated functions provide a sorted +collection of key/value pairs optimized for searching and traversing +in order. +

+

+To create a new GTree use g_tree_new(). +

+

+To insert a key/value pair into a GTree use g_tree_insert(). +

+

+To lookup the value corresponding to a given key, use +g_tree_lookup() and g_tree_lookup_extended(). +

+

+To find out the number of nodes in a GTree, use g_tree_nnodes(). To +get the height of a GTree, use g_tree_height(). +

+

+To traverse a GTree, calling a function for each node visited in +the traversal, use g_tree_foreach(). +

+

+To remove a key/value pair use g_tree_remove(). +

+

+To destroy a GTree, use g_tree_destroy().

+
+
+

Details

+
+

GTree

+
typedef struct _GTree GTree;
+

+The GTree struct is an opaque data +structure representing a Balanced Binary Tree. It +should be accessed only by using the following functions.

+
+
+
+

g_tree_new ()

+
GTree*              g_tree_new                          (GCompareFunc key_compare_func);
+

+Creates a new GTree.

+
++ + + + + + + + + + +

key_compare_func :

the function used to order the nodes in the GTree. + It should return values similar to the standard strcmp() function - + 0 if the two arguments are equal, a negative value if the first argument + comes before the second, or a positive value if the first argument comes + after the second. +

Returns :

a new GTree. +
+
+
+
+

g_tree_ref ()

+
GTree*              g_tree_ref                          (GTree *tree);
+

+Increments the reference count of tree by one. It is safe to call +this function from any thread.

+
++ + + + + + + + + + +

tree :

a GTree. +

Returns :

the passed in GTree. + +
+

Since 2.22

+
+
+
+

g_tree_unref ()

+
void                g_tree_unref                        (GTree *tree);
+

+Decrements the reference count of tree by one. If the reference count +drops to 0, all keys and values will be destroyed (if destroy +functions were specified) and all memory allocated by tree will be +released. +

+

+It is safe to call this function from any thread.

+
++ + + + +

tree :

a GTree. +
+

Since 2.22

+
+
+
+

g_tree_new_with_data ()

+
GTree*              g_tree_new_with_data                (GCompareDataFunc key_compare_func,
+                                                         gpointer key_compare_data);
+

+Creates a new GTree with a comparison function that accepts user data. +See g_tree_new() for more details.

+
++ + + + + + + + + + + + + + +

key_compare_func :

qsort()-style comparison function. +

key_compare_data :

data to pass to comparison function. +

Returns :

a new GTree. +
+
+
+
+

g_tree_new_full ()

+
GTree*              g_tree_new_full                     (GCompareDataFunc key_compare_func,
+                                                         gpointer key_compare_data,
+                                                         GDestroyNotify key_destroy_func,
+                                                         GDestroyNotify value_destroy_func);
+

+Creates a new GTree like g_tree_new() and allows to specify functions +to free the memory allocated for the key and value that get called when +removing the entry from the GTree.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_compare_func :

qsort()-style comparison function. +

key_compare_data :

data to pass to comparison function. +

key_destroy_func :

a function to free the memory allocated for the key + used when removing the entry from the GTree or NULL if you don't + want to supply such a function. +

value_destroy_func :

a function to free the memory allocated for the + value used when removing the entry from the GTree or NULL if you + don't want to supply such a function. +

Returns :

a new GTree. +
+
+
+
+

g_tree_insert ()

+
void                g_tree_insert                       (GTree *tree,
+                                                         gpointer key,
+                                                         gpointer value);
+

+Inserts a key/value pair into a GTree. If the given key already exists +in the GTree its corresponding value is set to the new value. If you +supplied a value_destroy_func when creating the GTree, the old value is +freed using that function. If you supplied a key_destroy_func when +creating the GTree, the passed key is freed using that function. +

+

+The tree is automatically 'balanced' as new key/value pairs are added, +so that the distance from the root to every leaf is as small as possible.

+
++ + + + + + + + + + + + + + +

tree :

a GTree. +

key :

the key to insert. +

value :

the value corresponding to the key. +
+
+
+
+

g_tree_replace ()

+
void                g_tree_replace                      (GTree *tree,
+                                                         gpointer key,
+                                                         gpointer value);
+

+Inserts a new key and value into a GTree similar to g_tree_insert(). +The difference is that if the key already exists in the GTree, it gets +replaced by the new key. If you supplied a value_destroy_func when +creating the GTree, the old value is freed using that function. If you +supplied a key_destroy_func when creating the GTree, the old key is +freed using that function. +

+

+The tree is automatically 'balanced' as new key/value pairs are added, +so that the distance from the root to every leaf is as small as possible.

+
++ + + + + + + + + + + + + + +

tree :

a GTree. +

key :

the key to insert. +

value :

the value corresponding to the key. +
+
+
+
+

g_tree_nnodes ()

+
gint                g_tree_nnodes                       (GTree *tree);
+

+Gets the number of nodes in a GTree.

+
++ + + + + + + + + + +

tree :

a GTree. +

Returns :

the number of nodes in the GTree. +
+
+
+
+

g_tree_height ()

+
gint                g_tree_height                       (GTree *tree);
+

+Gets the height of a GTree. +

+

+If the GTree contains no nodes, the height is 0. +If the GTree contains only one root node the height is 1. +If the root node has children the height is 2, etc.

+
++ + + + + + + + + + +

tree :

a GTree. +

Returns :

the height of the GTree. +
+
+
+
+

g_tree_lookup ()

+
gpointer            g_tree_lookup                       (GTree *tree,
+                                                         gconstpointer key);
+

+Gets the value corresponding to the given key. Since a GTree is +automatically balanced as key/value pairs are added, key lookup is very +fast.

+
++ + + + + + + + + + + + + + +

tree :

a GTree. +

key :

the key to look up. +

Returns :

the value corresponding to the key, or NULL if the key was +not found. +
+
+
+
+

g_tree_lookup_extended ()

+
gboolean            g_tree_lookup_extended              (GTree *tree,
+                                                         gconstpointer lookup_key,
+                                                         gpointer *orig_key,
+                                                         gpointer *value);
+

+Looks up a key in the GTree, returning the original key and the +associated value and a gboolean which is TRUE if the key was found. This +is useful if you need to free the memory allocated for the original key, +for example before calling g_tree_remove().

+
++ + + + + + + + + + + + + + + + + + + + + + +

tree :

a GTree. +

lookup_key :

the key to look up. +

orig_key :

returns the original key. +

value :

returns the value associated with the key. +

Returns :

TRUE if the key was found in the GTree. +
+
+
+
+

g_tree_foreach ()

+
void                g_tree_foreach                      (GTree *tree,
+                                                         GTraverseFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each of the key/value pairs in the GTree. +The function is passed the key and value of each pair, and the given +data parameter. The tree is traversed in sorted order. +

+

+The tree may not be modified while iterating over it (you can't +add/remove items). To remove all items matching a predicate, you need +to add each item to a list in your GTraverseFunc as you walk over +the tree, then walk the list and remove each item.

+
++ + + + + + + + + + + + + + +

tree :

a GTree. +

func :

the function to call for each node visited. If this function + returns TRUE, the traversal is stopped. +

user_data :

user data to pass to the function. +
+
+
+
+

g_tree_traverse ()

+
void                g_tree_traverse                     (GTree *tree,
+                                                         GTraverseFunc traverse_func,
+                                                         GTraverseType traverse_type,
+                                                         gpointer user_data);
+
+

Warning

+

g_tree_traverse has been deprecated since version 2.2 and should not be used in newly-written code. The order of a balanced tree is somewhat arbitrary. If you +just want to visit all nodes in sorted order, use g_tree_foreach() +instead. If you really need to visit nodes in a different order, consider +using an N-ary Tree.

+
+

+Calls the given function for each node in the GTree.

+
++ + + + + + + + + + + + + + + + + + +

tree :

a GTree. +

traverse_func :

the function to call for each node visited. If this + function returns TRUE, the traversal is stopped. +

traverse_type :

the order in which nodes are visited, one of G_IN_ORDER, + G_PRE_ORDER and G_POST_ORDER. +

user_data :

user data to pass to the function. +
+
+
+
+

GTraverseFunc ()

+
gboolean            (*GTraverseFunc)                    (gpointer key,
+                                                         gpointer value,
+                                                         gpointer data);
+

+Specifies the type of function passed to g_tree_traverse(). It is +passed the key and value of each node, together with the user_data +parameter passed to g_tree_traverse(). If the function returns +TRUE, the traversal is stopped.

+
++ + + + + + + + + + + + + + + + + + +

key :

a key of a GTree node. +

value :

the value corresponding to the key. +

data :

user data passed to g_tree_traverse(). +

Returns :

TRUE to stop the traversal. +
+
+
+
+

enum GTraverseType

+
typedef enum
+{
+  G_IN_ORDER,
+  G_PRE_ORDER,
+  G_POST_ORDER,
+  G_LEVEL_ORDER
+} GTraverseType;
+
+

+Specifies the type of traveral performed by g_tree_traverse(), +g_node_traverse() and g_node_find().

+
++ + + + + + + + + + + + + + + + + + +

G_IN_ORDER

vists a node's left child first, then the node itself, + then its right child. This is the one to use if you + want the output sorted according to the compare + function. +

G_PRE_ORDER

visits a node, then its children. +

G_POST_ORDER

visits the node's children, then the node itself. +

G_LEVEL_ORDER

is not implemented for Balanced Binary + Trees. For N-ary Trees, it + vists the root node first, then its children, then + its grandchildren, and so on. Note that this is less + efficient than the other orders. +
+
+
+
+

g_tree_search ()

+
gpointer            g_tree_search                       (GTree *tree,
+                                                         GCompareFunc search_func,
+                                                         gconstpointer user_data);
+

+Searches a GTree using search_func. +

+

+The search_func is called with a pointer to the key of a key/value pair in +the tree, and the passed in user_data. If search_func returns 0 for a +key/value pair, then g_tree_search_func() will return the value of that +pair. If search_func returns -1, searching will proceed among the +key/value pairs that have a smaller key; if search_func returns 1, +searching will proceed among the key/value pairs that have a larger key.

+
++ + + + + + + + + + + + + + + + + + +

tree :

a GTree. +

search_func :

a function used to search the GTree. +

user_data :

the data passed as the second argument to the search_func +function. +

Returns :

the value corresponding to the found key, or NULL if the key +was not found. +
+
+
+
+

g_tree_remove ()

+
gboolean            g_tree_remove                       (GTree *tree,
+                                                         gconstpointer key);
+

+Removes a key/value pair from a GTree. +

+

+If the GTree was created using g_tree_new_full(), the key and value +are freed using the supplied destroy functions, otherwise you have to +make sure that any dynamically allocated values are freed yourself. +If the key does not exist in the GTree, the function does nothing.

+
++ + + + + + + + + + + + + + +

tree :

a GTree. +

key :

the key to remove. +

Returns :

TRUE if the key was found (prior to 2.8, this function returned + nothing) +
+
+
+
+

g_tree_steal ()

+
gboolean            g_tree_steal                        (GTree *tree,
+                                                         gconstpointer key);
+

+Removes a key and its associated value from a GTree without calling +the key and value destroy functions. +

+

+If the key does not exist in the GTree, the function does nothing.

+
++ + + + + + + + + + + + + + +

tree :

a GTree. +

key :

the key to remove. +

Returns :

TRUE if the key was found (prior to 2.8, this function returned + nothing) +
+
+
+
+

g_tree_destroy ()

+
void                g_tree_destroy                      (GTree *tree);
+

+Removes all keys and values from the GTree and decreases its +reference count by one. If keys and/or values are dynamically +allocated, you should either free them first or create the GTree +using g_tree_new_full(). In the latter case the destroy functions +you supplied will be called on all keys and values before destroying +the GTree.

+
++ + + + +

tree :

a GTree. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Base64-Encoding.html b/docs/reference/glib/html/glib-Base64-Encoding.html new file mode 100644 index 0000000..884fe80 --- /dev/null +++ b/docs/reference/glib/html/glib-Base64-Encoding.html @@ -0,0 +1,385 @@ + + + + +Base64 Encoding + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Base64 Encoding

+

Base64 Encoding — encodes and decodes data in Base64 format

+
+
+

Synopsis

+
+#include <glib.h>
+
+gsize               g_base64_encode_step                (const guchar *in,
+                                                         gsize len,
+                                                         gboolean break_lines,
+                                                         gchar *out,
+                                                         gint *state,
+                                                         gint *save);
+gsize               g_base64_encode_close               (gboolean break_lines,
+                                                         gchar *out,
+                                                         gint *state,
+                                                         gint *save);
+gchar*              g_base64_encode                     (const guchar *data,
+                                                         gsize len);
+gsize               g_base64_decode_step                (const gchar *in,
+                                                         gsize len,
+                                                         guchar *out,
+                                                         gint *state,
+                                                         guint *save);
+guchar *            g_base64_decode                     (const gchar *text,
+                                                         gsize *out_len);
+guchar *            g_base64_decode_inplace             (gchar *text,
+                                                         gsize *out_len);
+
+
+
+

Description

+

+Base64 is an encoding that allows a sequence of arbitrary bytes to be +encoded as a sequence of printable ASCII characters. For the definition +of Base64, see RFC +1421 or RFC +2045. Base64 is most commonly used as a MIME transfer encoding +for email. +

+

+GLib supports incremental encoding using g_base64_encode_step() and +g_base64_encode_close(). Incremental decoding can be done with +g_base64_decode_step(). To encode or decode data in one go, use +g_base64_encode() or g_base64_decode(). To avoid memory allocation when +decoding, you can use g_base64_decode_inplace(). +

+

+Support for Base64 encoding has been added in GLib 2.12.

+
+
+

Details

+
+

g_base64_encode_step ()

+
gsize               g_base64_encode_step                (const guchar *in,
+                                                         gsize len,
+                                                         gboolean break_lines,
+                                                         gchar *out,
+                                                         gint *state,
+                                                         gint *save);
+

+Incrementally encode a sequence of binary data into its Base-64 stringified +representation. By calling this function multiple times you can convert +data in chunks to avoid having to have the full encoded data in memory. +

+

+When all of the data has been converted you must call +g_base64_encode_close() to flush the saved state. +

+

+The output buffer must be large enough to fit all the data that will +be written to it. Due to the way base64 encodes you will need +at least: (len / 3 + 1) * 4 + 4 bytes (+ 4 may be needed in case of +non-zero state). If you enable line-breaking you will need at least: +((len / 3 + 1) * 4 + 4) / 72 + 1 bytes of extra space. +

+

+break_lines is typically used when putting base64-encoded data in emails. +It breaks the lines at 72 columns instead of putting all of the text on +the same line. This avoids problems with long lines in the email system.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

in :

the binary data to encode +

len :

the length of in +

break_lines :

whether to break long lines +

out :

pointer to destination buffer +

state :

Saved state between steps, initialize to 0 +

save :

Saved state between steps, initialize to 0 +

Returns :

The number of bytes of output that was written + +
+

Since 2.12

+
+
+
+

g_base64_encode_close ()

+
gsize               g_base64_encode_close               (gboolean break_lines,
+                                                         gchar *out,
+                                                         gint *state,
+                                                         gint *save);
+

+Flush the status from a sequence of calls to g_base64_encode_step(). +

+

+The output buffer must be large enough to fit all the data that will +be written to it. It will need up to 4 bytes, or up to 5 bytes if +line-breaking is enabled.

+
++ + + + + + + + + + + + + + + + + + + + + + +

break_lines :

whether to break long lines +

out :

pointer to destination buffer +

state :

Saved state from g_base64_encode_step() +

save :

Saved state from g_base64_encode_step() +

Returns :

The number of bytes of output that was written + +
+

Since 2.12

+
+
+
+

g_base64_encode ()

+
gchar*              g_base64_encode                     (const guchar *data,
+                                                         gsize len);
+

+Encode a sequence of binary data into its Base-64 stringified +representation.

+
++ + + + + + + + + + + + + + +

data :

the binary data to encode +

len :

the length of data +

Returns :

a newly allocated, zero-terminated Base-64 encoded + string representing data. The returned string must + be freed with g_free(). + +
+

Since 2.12

+
+
+
+

g_base64_decode_step ()

+
gsize               g_base64_decode_step                (const gchar *in,
+                                                         gsize len,
+                                                         guchar *out,
+                                                         gint *state,
+                                                         guint *save);
+

+Incrementally decode a sequence of binary data from its Base-64 stringified +representation. By calling this function multiple times you can convert +data in chunks to avoid having to have the full encoded data in memory. +

+

+The output buffer must be large enough to fit all the data that will +be written to it. Since base64 encodes 3 bytes in 4 chars you need +at least: (len / 4) * 3 + 3 bytes (+ 3 may be needed in case of non-zero +state).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

in :

binary input data +

len :

max length of in data to decode +

out :

output buffer +

state :

Saved state between steps, initialize to 0 +

save :

Saved state between steps, initialize to 0 +

Returns :

The number of bytes of output that was written + +
+

Since 2.12

+
+
+
+

g_base64_decode ()

+
guchar *            g_base64_decode                     (const gchar *text,
+                                                         gsize *out_len);
+

+Decode a sequence of Base-64 encoded text into binary data

+
++ + + + + + + + + + + + + + +

text :

zero-terminated string with base64 text to decode +

out_len :

The length of the decoded data is written here +

Returns :

a newly allocated buffer containing the binary data + that text represents. The returned buffer must + be freed with g_free(). + +
+

Since 2.12

+
+
+
+

g_base64_decode_inplace ()

+
guchar *            g_base64_decode_inplace             (gchar *text,
+                                                         gsize *out_len);
+

+Decode a sequence of Base-64 encoded text into binary data +by overwriting the input data.

+
++ + + + + + + + + + + + + + +

text :

zero-terminated string with base64 text to decode +

out_len :

The length of the decoded data is written here +

Returns :

The binary data that text responds. This pointer + is the same as the input text. + +
+

Since 2.20

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Basic-Types.html b/docs/reference/glib/html/glib-Basic-Types.html new file mode 100644 index 0000000..0ef9728 --- /dev/null +++ b/docs/reference/glib/html/glib-Basic-Types.html @@ -0,0 +1,520 @@ + + + + +Basic Types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Basic Types

+

Basic Types — standard GLib types, defined for ease-of-use and portability

+
+
+

Synopsis

+
+#include <glib.h>
+
+typedef             gboolean;
+typedef             gpointer;
+typedef             gconstpointer;
+typedef             gchar;
+typedef             guchar;
+
+typedef             gint;
+typedef             guint;
+typedef             gshort;
+typedef             gushort;
+typedef             glong;
+typedef             gulong;
+
+typedef             gint8;
+typedef             guint8;
+typedef             gint16;
+typedef             guint16;
+typedef             gint32;
+typedef             guint32;
+
+#define             G_HAVE_GINT64
+typedef             gint64;
+typedef             guint64;
+#define             G_GINT64_CONSTANT                   (val)
+#define             G_GUINT64_CONSTANT                  (val)
+
+typedef             gfloat;
+typedef             gdouble;
+
+typedef             gsize;
+typedef             gssize;
+typedef             goffset;
+#define             G_GOFFSET_CONSTANT                  (val)
+
+typedef             gintptr;
+typedef             guintptr;
+
+
+
+

Description

+

+GLib defines a number of commonly used types, which can be divided into +4 groups: +

+
+

+

+
+
+

Details

+
+

gboolean

+
typedef gint   gboolean;
+
+

+A standard boolean type. +Variables of this type should only contain the value TRUE or FALSE. +

+
+
+
+

gpointer

+
typedef void* gpointer;
+
+

+An untyped pointer. +gpointer looks better and is easier to use than void*. +

+
+
+
+

gconstpointer

+
typedef const void *gconstpointer;
+
+

+An untyped pointer to constant data. +The data pointed to should not be changed. +

+

+This is typically used in function prototypes to indicate that the +data pointed to will not be altered by the function. +

+
+
+
+

gchar

+
typedef char   gchar;
+
+

+Corresponds to the standard C char type. +

+
+
+
+

guchar

+
typedef unsigned char   guchar;
+
+

+Corresponds to the standard C unsigned char type. +

+
+
+
+

gint

+
typedef int    gint;
+
+

+Corresponds to the standard C int type. +Values of this type can range from G_MININT to G_MAXINT. +

+
+
+
+

guint

+
typedef unsigned int    guint;
+
+

+Corresponds to the standard C unsigned int type. +Values of this type can range from 0 to G_MAXUINT. +

+
+
+
+

gshort

+
typedef short  gshort;
+
+

+Corresponds to the standard C short type. +Values of this type can range from G_MINSHORT to G_MAXSHORT. +

+
+
+
+

gushort

+
typedef unsigned short  gushort;
+
+

+Corresponds to the standard C unsigned short type. +Values of this type can range from 0 to G_MAXUSHORT. +

+
+
+
+

glong

+
typedef long   glong;
+
+

+Corresponds to the standard C long type. +Values of this type can range from G_MINLONG to G_MAXLONG. +

+
+
+
+

gulong

+
typedef unsigned long   gulong;
+
+

+Corresponds to the standard C unsigned long type. +Values of this type can range from 0 to G_MAXULONG. +

+
+
+
+

gint8

+
typedef signed char gint8;
+
+

+A signed integer guaranteed to be 8 bits on all platforms. +Values of this type can range from G_MININT8 (= -128) to +G_MAXINT8 (= 127). +

+
+
+
+

guint8

+
typedef unsigned char guint8;
+
+

+An unsigned integer guaranteed to be 8 bits on all platforms. +Values of this type can range from 0 to G_MAXUINT8 (= 255). +

+
+
+
+

gint16

+
typedef signed short gint16;
+
+

+A signed integer guaranteed to be 16 bits on all platforms. +Values of this type can range from G_MININT16 (= -32,768) to +G_MAXINT16 (= 32,767). +

+

+To print or scan values of this type, use +G_GINT16_MODIFIER and/or G_GINT16_FORMAT. +

+
+
+
+

guint16

+
typedef unsigned short guint16;
+
+

+An unsigned integer guaranteed to be 16 bits on all platforms. +Values of this type can range from 0 to G_MAXUINT16 (= 65,535). +

+

+To print or scan values of this type, use +G_GINT16_MODIFIER and/or G_GUINT16_FORMAT. +

+
+
+
+

gint32

+
typedef signed int gint32;
+
+

+A signed integer guaranteed to be 32 bits on all platforms. +Values of this type can range from G_MININT32 (= -2,147,483,648) to +G_MAXINT32 (= 2,147,483,647). +

+

+To print or scan values of this type, use +G_GINT32_MODIFIER and/or G_GINT32_FORMAT. +

+
+
+
+

guint32

+
typedef unsigned int guint32;
+
+

+An unsigned integer guaranteed to be 32 bits on all platforms. +Values of this type can range from 0 to G_MAXUINT32 (= 4,294,967,295). +

+

+To print or scan values of this type, use +G_GINT32_MODIFIER and/or G_GUINT32_FORMAT. +

+
+
+
+

G_HAVE_GINT64

+
#define G_HAVE_GINT64 1          /* deprecated, always true */
+
+
+

Warning

+

G_HAVE_GINT64 is deprecated and should not be used in newly-written code. GLib requires 64-bit integer support since version 2.0, therefore +G_HAVE_GINT64 is always defined.

+
+

+This macro is defined if 64-bit signed and unsigned integers are available +on the platform. +

+
+
+
+

gint64

+
typedef signed long gint64;
+
+

+A signed integer guaranteed to be 64 bits on all platforms. +Values of this type can range from G_MININT64 (= -9,223,372,036,854,775,808) to +G_MAXINT64 (= 9,223,372,036,854,775,807). +

+

+To print or scan values of this type, use +G_GINT64_MODIFIER and/or G_GINT64_FORMAT. +

+
+
+
+

guint64

+
typedef unsigned long guint64;
+
+

+An unsigned integer guaranteed to be 64 bits on all platforms. +Values of this type can range from 0 to G_MAXUINT64 (= 18,446,744,073,709,551,615). +

+

+To print or scan values of this type, use +G_GINT64_MODIFIER and/or G_GUINT64_FORMAT. +

+
+
+
+

G_GINT64_CONSTANT()

+
#define G_GINT64_CONSTANT(val) (val##L)
+
+

+This macro is used to insert 64-bit integer literals into the source code. +

+
++ + + + +

val :

a literal integer value, e.g. 0x1d636b02300a7aa7. +
+
+
+
+

G_GUINT64_CONSTANT()

+
#define G_GUINT64_CONSTANT(val) (val##UL)
+
+

+This macro is used to insert 64-bit unsigned integer literals into the +source code. +

+
++ + + + +

val :

a literal integer value, e.g. 0x1d636b02300a7aa7U. +
+

Since 2.10

+
+
+
+

gfloat

+
typedef float   gfloat;
+
+

+Corresponds to the standard C float type. +Values of this type can range from -G_MAXFLOAT to G_MAXFLOAT. +

+
+
+
+

gdouble

+
typedef double  gdouble;
+
+

+Corresponds to the standard C double type. +Values of this type can range from -G_MAXDOUBLE to G_MAXDOUBLE. +

+
+
+
+

gsize

+
typedef unsigned long gsize;
+
+

+An unsigned integer type of the result of the sizeof operator, corresponding +to the size_t type defined in C99. This type is wide enough to hold the numeric +value of a pointer, so it is usually 32bit wide on a 32bit platform and +64bit wide on a 64bit platform. +Values of this type can range from 0 to G_MAXSIZE. +

+

+To print or scan values of this type, use +G_GSIZE_MODIFIER and/or G_GSIZE_FORMAT. +

+
+
+
+

gssize

+
typedef signed long gssize;
+
+

+A signed variant of gsize, corresponding to the ssize_t defined on most platforms. +Values of this type can range from G_MINSSIZE to G_MAXSSIZE. +

+

+To print or scan values of this type, use +G_GSIZE_MODIFIER and/or G_GSSIZE_FORMAT. +

+
+
+
+

goffset

+
typedef gint64 goffset;
+
+

+A signed integer type that is used for file offsets, corresponding to the +C99 type off64_t. +Values of this type can range from G_MINOFFSET to G_MAXOFFSET. +

+

+To print or scan values of this type, use +G_GOFFSET_MODIFIER and/or G_GOFFSET_FORMAT. +

+Since: 2.14
+
+
+

G_GOFFSET_CONSTANT()

+
#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val)
+
+

+This macro is used to insert goffset 64-bit integer literals into the source code. +See also G_GINT64_CONSTANT. +

+
++ + + + +

val :

a literal integer value, e.g. 0x1d636b02300a7aa7. +Since: 2.20 +
+
+
+
+

gintptr

+
typedef signed long gintptr;
+
+

+Corresponds to the C99 type intptr_t, a signed integer type that +can hold any pointer. +

+

+To print or scan values of this type, use +G_GINTPTR_MODIFIER and/or G_GINTPTR_FORMAT. +

+Since: 2.18
+
+
+

guintptr

+
typedef unsigned long guintptr;
+
+

+Corresponds to the C99 type uintptr_t, an unsigned integer type that +can hold any pointer. +

+

+To print or scan values of this type, use +G_GINTPTR_MODIFIER and/or G_GUINTPTR_FORMAT. +

+Since: 2.18
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Bookmark-file-parser.html b/docs/reference/glib/html/glib-Bookmark-file-parser.html new file mode 100644 index 0000000..fdccec7 --- /dev/null +++ b/docs/reference/glib/html/glib-Bookmark-file-parser.html @@ -0,0 +1,2006 @@ + + + + +Bookmark file parser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Bookmark file parser

+

Bookmark file parser — parses files containing bookmarks

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GBookmarkFile;
+#define             G_BOOKMARK_FILE_ERROR
+enum                GBookmarkFileError;
+GBookmarkFile *     g_bookmark_file_new                 (void);
+void                g_bookmark_file_free                (GBookmarkFile *bookmark);
+gboolean            g_bookmark_file_load_from_file      (GBookmarkFile *bookmark,
+                                                         const gchar *filename,
+                                                         GError **error);
+gboolean            g_bookmark_file_load_from_data      (GBookmarkFile *bookmark,
+                                                         const gchar *data,
+                                                         gsize length,
+                                                         GError **error);
+gboolean            g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
+                                                         const gchar *file,
+                                                         gchar **full_path,
+                                                         GError **error);
+gchar *             g_bookmark_file_to_data             (GBookmarkFile *bookmark,
+                                                         gsize *length,
+                                                         GError **error);
+gboolean            g_bookmark_file_to_file             (GBookmarkFile *bookmark,
+                                                         const gchar *filename,
+                                                         GError **error);
+gboolean            g_bookmark_file_has_item            (GBookmarkFile *bookmark,
+                                                         const gchar *uri);
+gboolean            g_bookmark_file_has_group           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *group,
+                                                         GError **error);
+gboolean            g_bookmark_file_has_application     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         GError **error);
+gint                g_bookmark_file_get_size            (GBookmarkFile *bookmark);
+gchar **            g_bookmark_file_get_uris            (GBookmarkFile *bookmark,
+                                                         gsize *length);
+
+gchar *             g_bookmark_file_get_title           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+gchar *             g_bookmark_file_get_description     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+gchar *             g_bookmark_file_get_mime_type       (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+gboolean            g_bookmark_file_get_is_private      (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+gboolean            g_bookmark_file_get_icon            (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gchar **href,
+                                                         gchar **mime_type,
+                                                         GError **error);
+time_t              g_bookmark_file_get_added           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+time_t              g_bookmark_file_get_modified        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+time_t              g_bookmark_file_get_visited         (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+gchar **            g_bookmark_file_get_groups          (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gsize *length,
+                                                         GError **error);
+gchar **            g_bookmark_file_get_applications    (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gsize *length,
+                                                         GError **error);
+gboolean            g_bookmark_file_get_app_info        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         gchar **exec,
+                                                         guint *count,
+                                                         time_t *stamp,
+                                                         GError **error);
+
+void                g_bookmark_file_set_title           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *title);
+void                g_bookmark_file_set_description     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *description);
+void                g_bookmark_file_set_mime_type       (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *mime_type);
+void                g_bookmark_file_set_is_private      (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gboolean is_private);
+void                g_bookmark_file_set_icon            (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *href,
+                                                         const gchar *mime_type);
+void                g_bookmark_file_set_added           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         time_t added);
+void                g_bookmark_file_set_groups          (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar **groups,
+                                                         gsize length);
+void                g_bookmark_file_set_modified        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         time_t modified);
+void                g_bookmark_file_set_visited         (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         time_t visited);
+gboolean            g_bookmark_file_set_app_info        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         const gchar *exec,
+                                                         gint count,
+                                                         time_t stamp,
+                                                         GError **error);
+void                g_bookmark_file_add_group           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *group);
+void                g_bookmark_file_add_application     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         const gchar *exec);
+gboolean            g_bookmark_file_remove_group        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *group,
+                                                         GError **error);
+gboolean            g_bookmark_file_remove_application  (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         GError **error);
+gboolean            g_bookmark_file_remove_item         (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+gboolean            g_bookmark_file_move_item           (GBookmarkFile *bookmark,
+                                                         const gchar *old_uri,
+                                                         const gchar *new_uri,
+                                                         GError **error);
+
+
+
+

Description

+

+GBookmarkFile lets you parse, edit or create files containing bookmarks +to URI, along with some meta-data about the resource pointed by the URI like +its MIME type, the application that is registering the bookmark and the +icon that should be used to represent the bookmark. The data is stored using +the +Desktop Bookmark +Specification. +

+

+The syntax of the bookmark files is described in detail inside the Desktop +Bookmark Specification, here is a quick summary: bookmark files use a sub-class +of the +XML Bookmark Exchange Language specification, consisting +of valid UTF-8 encoded XML, under the xbel root element; +each bookmark is stored inside a bookmark element, using +its URI: no relative paths can be used inside a bookmark file. The bookmark +may have a user defined title and description, to be used instead of the URI. +Under the metadata element, with its owner +attribute set to http://freedesktop.org, is stored the +meta-data about a resource pointed by its URI. The meta-data consists of +the resource's MIME type; the applications that have registered a bookmark; +the groups to which a bookmark belongs to; a visibility flag, used to set +the bookmark as "private" to the applications and groups that has it +registered; the URI and MIME type of an icon, to be used when displaying the +bookmark inside a GUI. +

+
+
+<?xml version="1.0"?>
+<!DOCTYPE xbel PUBLIC
+  "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML"
+  "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd">
+<xbel version="1.0"
+      xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
+      xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks">
+  <bookmark href="file:///home/ebassi/bookmark-spec/bookmark-spec.xml">
+    <title>Desktop Bookmarks Spec</title>
+    <info>
+      <metadata owner="http://freedesktop.org">
+        <mime:mime-type>text/xml</mime:mime-type>
+	<bookmark:applications>
+          <bookmark:application name="GEdit" count="2" exec="gedit %u" timestamp="1115726763"/>
+          <bookmark:application name="GViM" count="7" exec="gvim %f" timestamp="1115726812"/>
+	</bookmark:applications>
+	<bookmark:groups>
+	  <bookmark:group>Editors</bookmark:group>
+	</bookmark:groups>
+      </metadata>
+    </info>
+  </bookmark>
+</xbel>
+
+
+

+A bookmark file might contain more than one bookmark; each bookmark is accessed +through its URI. +

+

+The important caveat of bookmark files is that when you add a new bookmark you +must also add the application that is registering it, using +g_bookmark_file_add_application() or g_bookmark_file_set_app_info(). If a +bookmark has no applications then it won't be dumped when creating the +on disk representation, using g_bookmark_file_to_data() or +g_bookmark_file_to_file(). +

+

+The GBookmarkFile parser was added in GLib 2.12. +

+
+
+

Details

+
+

GBookmarkFile

+
typedef struct _GBookmarkFile GBookmarkFile;
+

+The GBookmarkFile struct contains only private data +and should not be used directly. +

+
+
+
+

G_BOOKMARK_FILE_ERROR

+
#define G_BOOKMARK_FILE_ERROR (g_bookmark_file_error_quark ())
+
+

+Error domain for bookmark file parsing. Errors in this domain will be +from the GBookmarkFileError enumeration. See GError for informations +on error domains. +

+
+
+
+

enum GBookmarkFileError

+
typedef enum
+{
+  G_BOOKMARK_FILE_ERROR_INVALID_URI,
+  G_BOOKMARK_FILE_ERROR_INVALID_VALUE,
+  G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED,
+  G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND,
+  G_BOOKMARK_FILE_ERROR_READ,
+  G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING,
+  G_BOOKMARK_FILE_ERROR_WRITE,
+  G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND
+} GBookmarkFileError;
+
+

+Error codes returned by bookmark file parsing. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_BOOKMARK_FILE_ERROR_INVALID_URI

URI was ill-formed +

G_BOOKMARK_FILE_ERROR_INVALID_VALUE

a requested field was not found +

G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED

a requested application did not +register a bookmark +

G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND

a requested URI was not found +

G_BOOKMARK_FILE_ERROR_READ

document was ill formed +

G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING

the text being parsed was in an +unknown encoding +

G_BOOKMARK_FILE_ERROR_WRITE

an error occurred while writing +

G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND

requested file was not found +
+
+
+
+

g_bookmark_file_new ()

+
GBookmarkFile *     g_bookmark_file_new                 (void);
+

+Creates a new empty GBookmarkFile object. +

+

+Use g_bookmark_file_load_from_file(), g_bookmark_file_load_from_data() +or g_bookmark_file_load_from_data_dirs() to read an existing bookmark +file.

+
++ + + + +

Returns :

an empty GBookmarkFile + +
+

Since 2.12

+
+
+
+

g_bookmark_file_free ()

+
void                g_bookmark_file_free                (GBookmarkFile *bookmark);
+

+Frees a GBookmarkFile.

+
++ + + + +

bookmark :

a GBookmarkFile +
+

Since 2.12

+
+
+
+

g_bookmark_file_load_from_file ()

+
gboolean            g_bookmark_file_load_from_file      (GBookmarkFile *bookmark,
+                                                         const gchar *filename,
+                                                         GError **error);
+

+Loads a desktop bookmark file into an empty GBookmarkFile structure. +If the file could not be loaded then error is set to either a GFileError +or GBookmarkFileError.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

an empty GBookmarkFile struct +

filename :

the path of a filename to load, in the GLib file name encoding +

error :

return location for a GError, or NULL +

Returns :

TRUE if a desktop bookmark file could be loaded + +
+

Since 2.12

+
+
+
+

g_bookmark_file_load_from_data ()

+
gboolean            g_bookmark_file_load_from_data      (GBookmarkFile *bookmark,
+                                                         const gchar *data,
+                                                         gsize length,
+                                                         GError **error);
+

+Loads a bookmark file from memory into an empty GBookmarkFile +structure. If the object cannot be created then error is set to a +GBookmarkFileError.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

an empty GBookmarkFile struct +

data :

desktop bookmarks loaded in memory +

length :

the length of data in bytes +

error :

return location for a GError, or NULL +

Returns :

TRUE if a desktop bookmark could be loaded. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_load_from_data_dirs ()

+
gboolean            g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark,
+                                                         const gchar *file,
+                                                         gchar **full_path,
+                                                         GError **error);
+

+This function looks for a desktop bookmark file named file in the +paths returned from g_get_user_data_dir() and g_get_system_data_dirs(), +loads the file into bookmark and returns the file's full path in +full_path. If the file could not be loaded then an error is +set to either a GFileError or GBookmarkFileError.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

file :

a relative path to a filename to open and parse +

full_path :

return location for a string containing the full path + of the file, or NULL +

error :

return location for a GError, or NULL +

Returns :

TRUE if a key file could be loaded, FALSE othewise + +
+

Since 2.12

+
+
+
+

g_bookmark_file_to_data ()

+
gchar *             g_bookmark_file_to_data             (GBookmarkFile *bookmark,
+                                                         gsize *length,
+                                                         GError **error);
+

+This function outputs bookmark as a string.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

length :

return location for the length of the returned string, or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string holding + the contents of the GBookmarkFile + +
+

Since 2.12

+
+
+
+

g_bookmark_file_to_file ()

+
gboolean            g_bookmark_file_to_file             (GBookmarkFile *bookmark,
+                                                         const gchar *filename,
+                                                         GError **error);
+

+This function outputs bookmark into a file. The write process is +guaranteed to be atomic by using g_file_set_contents() internally.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

filename :

path of the output file +

error :

return location for a GError, or NULL +

Returns :

TRUE if the file was successfully written. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_has_item ()

+
gboolean            g_bookmark_file_has_item            (GBookmarkFile *bookmark,
+                                                         const gchar *uri);
+

+Looks whether the desktop bookmark has an item with its URI set to uri.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

Returns :

TRUE if uri is inside bookmark, FALSE otherwise + +
+

Since 2.12

+
+
+
+

g_bookmark_file_has_group ()

+
gboolean            g_bookmark_file_has_group           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *group,
+                                                         GError **error);
+

+Checks whether group appears in the list of groups to which +the bookmark for uri belongs to. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

group :

the group name to be searched +

error :

return location for a GError, or NULL +

Returns :

TRUE if group was found. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_has_application ()

+
gboolean            g_bookmark_file_has_application     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         GError **error);
+

+Checks whether the bookmark for uri inside bookmark has been +registered by application name. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

name :

the name of the application +

error :

return location for a GError or NULL +

Returns :

TRUE if the application name was found + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_size ()

+
gint                g_bookmark_file_get_size            (GBookmarkFile *bookmark);
+

+Gets the number of bookmarks inside bookmark.

+
++ + + + + + + + + + +

bookmark :

a GBookmarkFile +

Returns :

the number of bookmarks + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_uris ()

+
gchar **            g_bookmark_file_get_uris            (GBookmarkFile *bookmark,
+                                                         gsize *length);
+

+Returns all URIs of the bookmarks in the bookmark file bookmark. +The array of returned URIs will be NULL-terminated, so length may +optionally be NULL.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

length :

return location for the number of returned URIs, or NULL +

Returns :

a newly allocated NULL-terminated array of strings. + Use g_strfreev() to free it. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_title ()

+
gchar *             g_bookmark_file_get_title           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Returns the title of the bookmark for uri. +

+

+If uri is NULL, the title of bookmark is returned. +

+

+In the event the URI cannot be found, NULL is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string or NULL if the specified + URI cannot be found. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_description ()

+
gchar *             g_bookmark_file_get_description     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Retrieves the description of the bookmark for uri. +

+

+In the event the URI cannot be found, NULL is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string or NULL if the specified + URI cannot be found. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_mime_type ()

+
gchar *             g_bookmark_file_get_mime_type       (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Retrieves the MIME type of the resource pointed by uri. +

+

+In the event the URI cannot be found, NULL is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the +event that the MIME type cannot be found, NULL is returned and +error is set to G_BOOKMARK_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string or NULL if the specified + URI cannot be found. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_is_private ()

+
gboolean            g_bookmark_file_get_is_private      (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Gets whether the private flag of the bookmark for uri is set. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the +event that the private flag cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

TRUE if the private flag is set, FALSE otherwise. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_icon ()

+
gboolean            g_bookmark_file_get_icon            (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gchar **href,
+                                                         gchar **mime_type,
+                                                         GError **error);
+

+Gets the icon of the bookmark for uri. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

href :

return location for the icon's location or NULL +

mime_type :

return location for the icon's MIME type or NULL +

error :

return location for a GError or NULL +

Returns :

TRUE if the icon for the bookmark for the URI was found. + You should free the returned strings. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_added ()

+
time_t              g_bookmark_file_get_added           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Gets the time the bookmark for uri was added to bookmark +

+

+In the event the URI cannot be found, -1 is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

a timestamp + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_modified ()

+
time_t              g_bookmark_file_get_modified        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Gets the time when the bookmark for uri was last modified. +

+

+In the event the URI cannot be found, -1 is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

a timestamp + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_visited ()

+
time_t              g_bookmark_file_get_visited         (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Gets the time the bookmark for uri was last visited. +

+

+In the event the URI cannot be found, -1 is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

a timestamp. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_groups ()

+
gchar **            g_bookmark_file_get_groups          (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gsize *length,
+                                                         GError **error);
+

+Retrieves the list of group names of the bookmark for uri. +

+

+In the event the URI cannot be found, NULL is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. +

+

+The returned array is NULL terminated, so length may optionally +be NULL.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

length :

return location for the length of the returned string, or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly allocated NULL-terminated array of group names. + Use g_strfreev() to free it. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_applications ()

+
gchar **            g_bookmark_file_get_applications    (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gsize *length,
+                                                         GError **error);
+

+Retrieves the names of the applications that have registered the +bookmark for uri. +

+

+In the event the URI cannot be found, NULL is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

length :

return location of the length of the returned list, or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly allocated NULL-terminated array of strings. + Use g_strfreev() to free it. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_get_app_info ()

+
gboolean            g_bookmark_file_get_app_info        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         gchar **exec,
+                                                         guint *count,
+                                                         time_t *stamp,
+                                                         GError **error);
+

+Gets the registration informations of app_name for the bookmark for +uri. See g_bookmark_file_set_app_info() for more informations about +the returned data. +

+

+The string returned in app_exec must be freed. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the +event that no application with name app_name has registered a bookmark +for uri, FALSE is returned and error is set to +G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. In the event that unquoting +the command line fails, an error of the G_SHELL_ERROR domain is +set and FALSE is returned.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

name :

an application's name +

exec :

location for the command line of the application, or NULL +

count :

return location for the registration count, or NULL +

stamp :

return location for the last registration time, or NULL +

error :

return location for a GError, or NULL +

Returns :

TRUE on success. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_title ()

+
void                g_bookmark_file_set_title           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *title);
+

+Sets title as the title of the bookmark for uri inside the +bookmark file bookmark. +

+

+If uri is NULL, the title of bookmark is set. +

+

+If a bookmark for uri cannot be found then it is created.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI or NULL +

title :

a UTF-8 encoded string +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_description ()

+
void                g_bookmark_file_set_description     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *description);
+

+Sets description as the description of the bookmark for uri. +

+

+If uri is NULL, the description of bookmark is set. +

+

+If a bookmark for uri cannot be found then it is created.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI or NULL +

description :

a string +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_mime_type ()

+
void                g_bookmark_file_set_mime_type       (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *mime_type);
+

+Sets mime_type as the MIME type of the bookmark for uri. +

+

+If a bookmark for uri cannot be found then it is created.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

mime_type :

a MIME type +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_is_private ()

+
void                g_bookmark_file_set_is_private      (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         gboolean is_private);
+

+Sets the private flag of the bookmark for uri. +

+

+If a bookmark for uri cannot be found then it is created.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

is_private :

TRUE if the bookmark should be marked as private +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_icon ()

+
void                g_bookmark_file_set_icon            (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *href,
+                                                         const gchar *mime_type);
+

+Sets the icon for the bookmark for uri. If href is NULL, unsets +the currently set icon. href can either be a full URL for the icon +file or the icon name following the Icon Naming specification. +

+

+If no bookmark for uri is found one is created.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

href :

the URI of the icon for the bookmark, or NULL +

mime_type :

the MIME type of the icon for the bookmark +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_added ()

+
void                g_bookmark_file_set_added           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         time_t added);
+

+Sets the time the bookmark for uri was added into bookmark. +

+

+If no bookmark for uri is found then it is created.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

added :

a timestamp or -1 to use the current time +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_groups ()

+
void                g_bookmark_file_set_groups          (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar **groups,
+                                                         gsize length);
+

+Sets a list of group names for the item with URI uri. Each previously +set group name list is removed. +

+

+If uri cannot be found then an item for it is created.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

an item's URI +

groups :

an array of group names, or NULL to remove all groups +

length :

number of group name values in groups +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_modified ()

+
void                g_bookmark_file_set_modified        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         time_t modified);
+

+Sets the last time the bookmark for uri was last modified. +

+

+If no bookmark for uri is found then it is created. +

+

+The "modified" time should only be set when the bookmark's meta-data +was actually changed. Every function of GBookmarkFile that +modifies a bookmark also changes the modification time, except for +g_bookmark_file_set_visited().

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

modified :

a timestamp or -1 to use the current time +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_visited ()

+
void                g_bookmark_file_set_visited         (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         time_t visited);
+

+Sets the time the bookmark for uri was last visited. +

+

+If no bookmark for uri is found then it is created. +

+

+The "visited" time should only be set if the bookmark was launched, +either using the command line retrieved by g_bookmark_file_get_app_info() +or by the default application for the bookmark's MIME type, retrieved +using g_bookmark_file_get_mime_type(). Changing the "visited" time +does not affect the "modified" time.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

visited :

a timestamp or -1 to use the current time +
+

Since 2.12

+
+
+
+

g_bookmark_file_set_app_info ()

+
gboolean            g_bookmark_file_set_app_info        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         const gchar *exec,
+                                                         gint count,
+                                                         time_t stamp,
+                                                         GError **error);
+

+Sets the meta-data of application name inside the list of +applications that have registered a bookmark for uri inside +bookmark. +

+

+You should rarely use this function; use g_bookmark_file_add_application() +and g_bookmark_file_remove_application() instead. +

+

+name can be any UTF-8 encoded string used to identify an +application. +exec can have one of these two modifiers: "f", which will +be expanded as the local file name retrieved from the bookmark's +URI; "u", which will be expanded as the bookmark's URI. +The expansion is done automatically when retrieving the stored +command line using the g_bookmark_file_get_app_info() function. +count is the number of times the application has registered the +bookmark; if is < 0, the current registration count will be increased +by one, if is 0, the application with name will be removed from +the list of registered applications. +stamp is the Unix time of the last registration; if it is -1, the +current time will be used. +

+

+If you try to remove an application by setting its registration count to +zero, and no bookmark for uri is found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND; similarly, +in the event that no application name has registered a bookmark +for uri, FALSE is returned and error is set to +G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. Otherwise, if no bookmark +for uri is found, one is created.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

name :

an application's name +

exec :

an application's command line +

count :

the number of registrations done for this application +

stamp :

the time of the last registration for this application +

error :

return location for a GError or NULL +

Returns :

TRUE if the application's meta-data was successfully + changed. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_add_group ()

+
void                g_bookmark_file_add_group           (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *group);
+

+Adds group to the list of groups to which the bookmark for uri +belongs to. +

+

+If no bookmark for uri is found then it is created.

+
++ + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

group :

the group name to be added +
+

Since 2.12

+
+
+
+

g_bookmark_file_add_application ()

+
void                g_bookmark_file_add_application     (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         const gchar *exec);
+

+Adds the application with name and exec to the list of +applications that have registered a bookmark for uri into +bookmark. +

+

+Every bookmark inside a GBookmarkFile must have at least an +application registered. Each application must provide a name, a +command line useful for launching the bookmark, the number of times +the bookmark has been registered by the application and the last +time the application registered this bookmark. +

+

+If name is NULL, the name of the application will be the +same returned by g_get_application_name(); if exec is NULL, the +command line will be a composition of the program name as +returned by g_get_prgname() and the "u" modifier, which will be +expanded to the bookmark's URI. +

+

+This function will automatically take care of updating the +registrations count and timestamping in case an application +with the same name had already registered a bookmark for +uri inside bookmark. +

+

+If no bookmark for uri is found, one is created.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

name :

the name of the application registering the bookmark + or NULL +

exec :

command line to be used to launch the bookmark or NULL +
+

Since 2.12

+
+
+
+

g_bookmark_file_remove_group ()

+
gboolean            g_bookmark_file_remove_group        (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *group,
+                                                         GError **error);
+

+Removes group from the list of groups to which the bookmark +for uri belongs to. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. +In the event no group was defined, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

group :

the group name to be removed +

error :

return location for a GError, or NULL +

Returns :

TRUE if group was successfully removed. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_remove_application ()

+
gboolean            g_bookmark_file_remove_application  (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         const gchar *name,
+                                                         GError **error);
+

+Removes application registered with name from the list of applications +that have registered a bookmark for uri inside bookmark. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. +In the event that no application with name app_name has registered +a bookmark for uri, FALSE is returned and error is set to +G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

name :

the name of the application +

error :

return location for a GError or NULL +

Returns :

TRUE if the application was successfully removed. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_remove_item ()

+
gboolean            g_bookmark_file_remove_item         (GBookmarkFile *bookmark,
+                                                         const gchar *uri,
+                                                         GError **error);
+

+Removes the bookmark for uri from the bookmark file bookmark.

+
++ + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

uri :

a valid URI +

error :

return location for a GError, or NULL +

Returns :

TRUE if the bookmark was removed successfully. + +
+

Since 2.12

+
+
+
+

g_bookmark_file_move_item ()

+
gboolean            g_bookmark_file_move_item           (GBookmarkFile *bookmark,
+                                                         const gchar *old_uri,
+                                                         const gchar *new_uri,
+                                                         GError **error);
+

+Changes the URI of a bookmark item from old_uri to new_uri. Any +existing bookmark for new_uri will be overwritten. If new_uri is +NULL, then the bookmark is removed. +

+

+In the event the URI cannot be found, FALSE is returned and +error is set to G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

bookmark :

a GBookmarkFile +

old_uri :

a valid URI +

new_uri :

a valid URI, or NULL +

error :

return location for a GError or NULL +

Returns :

TRUE if the URI was successfully changed + +
+

Since 2.12

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Byte-Arrays.html b/docs/reference/glib/html/glib-Byte-Arrays.html new file mode 100644 index 0000000..ebad95a --- /dev/null +++ b/docs/reference/glib/html/glib-Byte-Arrays.html @@ -0,0 +1,542 @@ + + + + +Byte Arrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Byte Arrays

+

Byte Arrays — arrays of bytes, which grow automatically as + elements are added

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GByteArray;
+GByteArray*         g_byte_array_new                    (void);
+GByteArray*         g_byte_array_sized_new              (guint reserved_size);
+GByteArray *        g_byte_array_ref                    (GByteArray *array);
+void                g_byte_array_unref                  (GByteArray *array);
+GByteArray*         g_byte_array_append                 (GByteArray *array,
+                                                         const guint8 *data,
+                                                         guint len);
+GByteArray*         g_byte_array_prepend                (GByteArray *array,
+                                                         const guint8 *data,
+                                                         guint len);
+GByteArray*         g_byte_array_remove_index           (GByteArray *array,
+                                                         guint index_);
+GByteArray*         g_byte_array_remove_index_fast      (GByteArray *array,
+                                                         guint index_);
+GByteArray*         g_byte_array_remove_range           (GByteArray *array,
+                                                         guint index_,
+                                                         guint length);
+void                g_byte_array_sort                   (GByteArray *array,
+                                                         GCompareFunc compare_func);
+void                g_byte_array_sort_with_data         (GByteArray *array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+GByteArray*         g_byte_array_set_size               (GByteArray *array,
+                                                         guint length);
+guint8*             g_byte_array_free                   (GByteArray *array,
+                                                         gboolean free_segment);
+
+
+
+

Description

+

+GByteArray is based on GArray, to provide arrays of bytes which +grow automatically as elements are added. +

+

+To create a new GByteArray use g_byte_array_new(). +

+

+To add elements to a GByteArray, use g_byte_array_append(), and +g_byte_array_prepend(). +

+

+To set the size of a GByteArray, use g_byte_array_set_size(). +

+

+To free a GByteArray, use g_byte_array_free(). +

+

+

+
+

Example 22. Using a GByteArray

+
+  GByteArray *gbarray;
+  gint i;
+
+  gbarray = g_byte_array_new ();
+  for (i = 0; i < 10000; i++)
+    g_byte_array_append (gbarray, (guint8*) "abcd", 4);
+
+  for (i = 0; i < 10000; i++)
+    {
+      g_assert (gbarray->data[4*i] == 'a');
+      g_assert (gbarray->data[4*i+1] == 'b');
+      g_assert (gbarray->data[4*i+2] == 'c');
+      g_assert (gbarray->data[4*i+3] == 'd');
+    }
+
+  g_byte_array_free (gbarray, TRUE);
+ 
+
+


+
+
+

Details

+
+

GByteArray

+
typedef struct {
+  guint8 *data;
+  guint	  len;
+} GByteArray;
+
+

+The GByteArray struct allows access to the +public fields of a GByteArray.

+
++ + + + + + + + + + +

guint8 *data;

a pointer to the element data. The data may be moved as + elements are added to the GByteArray. +

guint len;

the number of elements in the GByteArray. +
+
+
+
+

g_byte_array_new ()

+
GByteArray*         g_byte_array_new                    (void);
+

+Creates a new GByteArray with a reference count of 1.

+
++ + + + +

Returns :

the new GByteArray. +
+
+
+
+

g_byte_array_sized_new ()

+
GByteArray*         g_byte_array_sized_new              (guint reserved_size);
+

+Creates a new GByteArray with reserved_size bytes preallocated. +This avoids frequent reallocation, if you are going to add many +bytes to the array. Note however that the size of the array is still +0.

+
++ + + + + + + + + + +

reserved_size :

number of bytes preallocated. +

Returns :

the new GByteArray. +
+
+
+
+

g_byte_array_ref ()

+
GByteArray *        g_byte_array_ref                    (GByteArray *array);
+

+Atomically increments the reference count of array by one. This +function is MT-safe and may be called from any thread.

+
++ + + + + + + + + + +

array :

A GByteArray. +

Returns :

The passed in GByteArray. + +
+

Since 2.22

+
+
+
+

g_byte_array_unref ()

+
void                g_byte_array_unref                  (GByteArray *array);
+

+Atomically decrements the reference count of array by one. If the +reference count drops to 0, all memory allocated by the array is +released. This function is MT-safe and may be called from any +thread.

+
++ + + + +

array :

A GByteArray. +
+

Since 2.22

+
+
+
+

g_byte_array_append ()

+
GByteArray*         g_byte_array_append                 (GByteArray *array,
+                                                         const guint8 *data,
+                                                         guint len);
+

+Adds the given bytes to the end of the GByteArray. The array will +grow in size automatically if necessary.

+
++ + + + + + + + + + + + + + + + + + +

array :

a GByteArray. +

data :

the byte data to be added. +

len :

the number of bytes to add. +

Returns :

the GByteArray. +
+
+
+
+

g_byte_array_prepend ()

+
GByteArray*         g_byte_array_prepend                (GByteArray *array,
+                                                         const guint8 *data,
+                                                         guint len);
+

+Adds the given data to the start of the GByteArray. The array will +grow in size automatically if necessary.

+
++ + + + + + + + + + + + + + + + + + +

array :

a GByteArray. +

data :

the byte data to be added. +

len :

the number of bytes to add. +

Returns :

the GByteArray. +
+
+
+
+

g_byte_array_remove_index ()

+
GByteArray*         g_byte_array_remove_index           (GByteArray *array,
+                                                         guint index_);
+

+Removes the byte at the given index from a GByteArray. The +following bytes are moved down one place.

+
++ + + + + + + + + + + + + + +

array :

a GByteArray. +

index_ :

the index of the byte to remove. +

Returns :

the GByteArray. +
+
+
+
+

g_byte_array_remove_index_fast ()

+
GByteArray*         g_byte_array_remove_index_fast      (GByteArray *array,
+                                                         guint index_);
+

+Removes the byte at the given index from a GByteArray. The last +element in the array is used to fill in the space, so this function +does not preserve the order of the GByteArray. But it is faster +than g_byte_array_remove_index().

+
++ + + + + + + + + + + + + + +

array :

a GByteArray. +

index_ :

the index of the byte to remove. +

Returns :

the GByteArray. +
+
+
+
+

g_byte_array_remove_range ()

+
GByteArray*         g_byte_array_remove_range           (GByteArray *array,
+                                                         guint index_,
+                                                         guint length);
+

+Removes the given number of bytes starting at the given index from a +GByteArray. The following elements are moved to close the gap.

+
++ + + + + + + + + + + + + + + + + + +

array :

a GByteArray. +

index_ :

the index of the first byte to remove. +

length :

the number of bytes to remove. +

Returns :

the GByteArray. +
+

Since 2.4

+
+
+
+

g_byte_array_sort ()

+
void                g_byte_array_sort                   (GByteArray *array,
+                                                         GCompareFunc compare_func);
+

+Sorts a byte array, using compare_func which should be a +qsort()-style comparison function (returns less than zero for first +arg is less than second arg, zero for equal, greater than zero if +first arg is greater than second arg). +

+

+If two array elements compare equal, their order in the sorted array +is undefined.

+
++ + + + + + + + + + +

array :

a GByteArray. +

compare_func :

comparison function. +
+
+
+
+

g_byte_array_sort_with_data ()

+
void                g_byte_array_sort_with_data         (GByteArray *array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Like g_byte_array_sort(), but the comparison function takes an extra +user data argument.

+
++ + + + + + + + + + + + + + +

array :

a GByteArray. +

compare_func :

comparison function. +

user_data :

data to pass to compare_func. +
+
+
+
+

g_byte_array_set_size ()

+
GByteArray*         g_byte_array_set_size               (GByteArray *array,
+                                                         guint length);
+

+Sets the size of the GByteArray, expanding it if necessary.

+
++ + + + + + + + + + + + + + +

array :

a GByteArray. +

length :

the new size of the GByteArray. +

Returns :

the GByteArray. +
+
+
+
+

g_byte_array_free ()

+
guint8*             g_byte_array_free                   (GByteArray *array,
+                                                         gboolean free_segment);
+

+Frees the memory allocated by the GByteArray. If free_segment is +TRUE it frees the actual byte data. If the reference count of +array is greater than one, the GByteArray wrapper is preserved but +the size of array will be set to zero.

+
++ + + + + + + + + + + + + + +

array :

a GByteArray. +

free_segment :

if TRUE the actual byte data is freed as well. +

Returns :

the element data if free_segment is FALSE, otherwise + NULL. The element data should be freed using g_free(). +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Byte-Order-Macros.html b/docs/reference/glib/html/glib-Byte-Order-Macros.html new file mode 100644 index 0000000..ddc725d --- /dev/null +++ b/docs/reference/glib/html/glib-Byte-Order-Macros.html @@ -0,0 +1,1706 @@ + + + + +Byte Order Macros + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Byte Order Macros

+

Byte Order Macros — a portable way to convert between different byte orders

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_BYTE_ORDER
+#define             G_LITTLE_ENDIAN
+#define             G_BIG_ENDIAN
+#define             G_PDP_ENDIAN
+
+#define             g_htonl                             (val)
+#define             g_htons                             (val)
+#define             g_ntohl                             (val)
+#define             g_ntohs                             (val)
+
+#define             GINT_FROM_BE                        (val)
+#define             GINT_FROM_LE                        (val)
+#define             GINT_TO_BE                          (val)
+#define             GINT_TO_LE                          (val)
+
+#define             GUINT_FROM_BE                       (val)
+#define             GUINT_FROM_LE                       (val)
+#define             GUINT_TO_BE                         (val)
+#define             GUINT_TO_LE                         (val)
+
+#define             GLONG_FROM_BE                       (val)
+#define             GLONG_FROM_LE                       (val)
+#define             GLONG_TO_BE                         (val)
+#define             GLONG_TO_LE                         (val)
+
+#define             GULONG_FROM_BE                      (val)
+#define             GULONG_FROM_LE                      (val)
+#define             GULONG_TO_BE                        (val)
+#define             GULONG_TO_LE                        (val)
+
+#define             GSIZE_FROM_BE                       (val)
+#define             GSIZE_FROM_LE                       (val)
+#define             GSIZE_TO_BE                         (val)
+#define             GSIZE_TO_LE                         (val)
+
+#define             GSSIZE_FROM_BE                      (val)
+#define             GSSIZE_FROM_LE                      (val)
+#define             GSSIZE_TO_BE                        (val)
+#define             GSSIZE_TO_LE                        (val)
+
+#define             GINT16_FROM_BE                      (val)
+#define             GINT16_FROM_LE                      (val)
+#define             GINT16_TO_BE                        (val)
+#define             GINT16_TO_LE                        (val)
+
+#define             GUINT16_FROM_BE                     (val)
+#define             GUINT16_FROM_LE                     (val)
+#define             GUINT16_TO_BE                       (val)
+#define             GUINT16_TO_LE                       (val)
+
+#define             GINT32_FROM_BE                      (val)
+#define             GINT32_FROM_LE                      (val)
+#define             GINT32_TO_BE                        (val)
+#define             GINT32_TO_LE                        (val)
+
+#define             GUINT32_FROM_BE                     (val)
+#define             GUINT32_FROM_LE                     (val)
+#define             GUINT32_TO_BE                       (val)
+#define             GUINT32_TO_LE                       (val)
+
+#define             GINT64_FROM_BE                      (val)
+#define             GINT64_FROM_LE                      (val)
+#define             GINT64_TO_BE                        (val)
+#define             GINT64_TO_LE                        (val)
+
+#define             GUINT64_FROM_BE                     (val)
+#define             GUINT64_FROM_LE                     (val)
+#define             GUINT64_TO_BE                       (val)
+#define             GUINT64_TO_LE                       (val)
+
+#define             GUINT16_SWAP_BE_PDP                 (val)
+#define             GUINT16_SWAP_LE_BE                  (val)
+#define             GUINT16_SWAP_LE_PDP                 (val)
+
+#define             GUINT32_SWAP_BE_PDP                 (val)
+#define             GUINT32_SWAP_LE_BE                  (val)
+#define             GUINT32_SWAP_LE_PDP                 (val)
+
+#define             GUINT64_SWAP_LE_BE                  (val)
+
+
+
+

Description

+

+These macros provide a portable way to determine the host byte order +and to convert values between different byte orders. +

+

+The byte order is the order in which bytes are stored to create larger +data types such as the gint and glong values. +The host byte order is the byte order used on the current machine. +

+

+Some processors store the most significant bytes (i.e. the bytes that +hold the largest part of the value) first. These are known as big-endian +processors. +

+

+Other processors (notably the x86 family) store the most significant byte +last. These are known as little-endian processors. +

+

+Finally, to complicate matters, some other processors store the bytes in +a rather curious order known as PDP-endian. For a 4-byte word, the 3rd +most significant byte is stored first, then the 4th, then the 1st and finally +the 2nd. +

+

+Obviously there is a problem when these different processors communicate +with each other, for example over networks or by using binary file formats. +This is where these macros come in. +They are typically used to convert values into a byte order +which has been agreed on for use when communicating between different +processors. The Internet uses what is known as 'network byte order' +as the standard byte order (which is in fact the big-endian byte order). +

+

+Note that the byte order conversion macros may evaluate their arguments +multiple times, thus you should not use them with arguments which have +side-effects. +

+
+
+

Details

+
+

G_BYTE_ORDER

+
#define G_BYTE_ORDER G_LITTLE_ENDIAN
+
+

+The host byte order. +This can be either G_LITTLE_ENDIAN or G_BIG_ENDIAN (support for +G_PDP_ENDIAN may be added in future.) +

+
+
+
+

G_LITTLE_ENDIAN

+
#define G_LITTLE_ENDIAN 1234
+
+

+Specifies one of the possible types of byte order. +See G_BYTE_ORDER. +

+
+
+
+

G_BIG_ENDIAN

+
#define G_BIG_ENDIAN    4321
+
+

+Specifies one of the possible types of byte order. +See G_BYTE_ORDER. +

+
+
+
+

G_PDP_ENDIAN

+
#define G_PDP_ENDIAN    3412		/* unused, need specific PDP check */	
+
+

+Specifies one of the possible types of byte order (currently unused). +See G_BYTE_ORDER. +

+
+
+
+

g_htonl()

+
#define             g_htonl(val)
+

+Converts a 32-bit integer value from host to network byte order. +

+
++ + + + + + + + + + +

val :

a 32-bit integer value in host byte order. +

Returns :

+val converted to network byte order. +
+
+
+
+

g_htons()

+
#define             g_htons(val)
+

+Converts a 16-bit integer value from host to network byte order. +

+
++ + + + + + + + + + +

val :

a 16-bit integer value in host byte order. +

Returns :

+val converted to network byte order. +
+
+
+
+

g_ntohl()

+
#define             g_ntohl(val)
+

+Converts a 32-bit integer value from network to host byte order. +

+
++ + + + + + + + + + +

val :

a 32-bit integer value in network byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

g_ntohs()

+
#define             g_ntohs(val)
+

+Converts a 16-bit integer value from network to host byte order. +

+
++ + + + + + + + + + +

val :

a 16-bit integer value in network byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT_FROM_BE()

+
#define GINT_FROM_BE(val) (GINT_TO_BE (val))
+
+

+Converts a gint value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT_FROM_LE()

+
#define GINT_FROM_LE(val) (GINT_TO_LE (val))
+
+

+Converts a gint value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT_TO_BE()

+
#define GINT_TO_BE(val)		((gint) GINT32_TO_BE (val))
+
+

+Converts a gint value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gint value in host byte order. +

Returns :

+val converted to big-endian byte order. +
+
+
+
+

GINT_TO_LE()

+
#define GINT_TO_LE(val)		((gint) GINT32_TO_LE (val))
+
+

+Converts a gint value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gint value in host byte order. +

Returns :

+val converted to little-endian byte order. +
+
+
+
+

GUINT_FROM_BE()

+
#define GUINT_FROM_BE(val) (GUINT_TO_BE (val))
+
+

+Converts a guint value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT_FROM_LE()

+
#define GUINT_FROM_LE(val) (GUINT_TO_LE (val))
+
+

+Converts a guint value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT_TO_BE()

+
#define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val))
+
+

+Converts a guint value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a guint value in host byte order. +

Returns :

+val converted to big-endian byte order. +
+
+
+
+

GUINT_TO_LE()

+
#define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val))
+
+

+Converts a guint value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a guint value in host byte order. +

Returns :

+val converted to little-endian byte order. +
+
+
+
+

GLONG_FROM_BE()

+
#define GLONG_FROM_BE(val) (GLONG_TO_BE (val))
+
+

+Converts a glong value from big-endian to the host byte order. +

+
++ + + + + + + + + + +

val :

a glong value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GLONG_FROM_LE()

+
#define GLONG_FROM_LE(val) (GLONG_TO_LE (val))
+
+

+Converts a glong value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a glong value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GLONG_TO_BE()

+
#define GLONG_TO_BE(val) ((glong) GINT64_TO_BE (val))
+
+

+Converts a glong value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a glong value in host byte order. +

Returns :

+val converted to big-endian byte order. +
+
+
+
+

GLONG_TO_LE()

+
#define GLONG_TO_LE(val) ((glong) GINT64_TO_LE (val))
+
+

+Converts a glong value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a glong value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GULONG_FROM_BE()

+
#define GULONG_FROM_BE(val) (GULONG_TO_BE (val))
+
+

+Converts a gulong value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gulong value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GULONG_FROM_LE()

+
#define GULONG_FROM_LE(val) (GULONG_TO_LE (val))
+
+

+Converts a gulong value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gulong value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GULONG_TO_BE()

+
#define GULONG_TO_BE(val) ((gulong) GUINT64_TO_BE (val))
+
+

+Converts a gulong value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gulong value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GULONG_TO_LE()

+
#define GULONG_TO_LE(val) ((gulong) GUINT64_TO_LE (val))
+
+

+Converts a gulong value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gulong value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GSIZE_FROM_BE()

+
#define GSIZE_FROM_BE(val) (GSIZE_TO_BE (val))
+
+

+Converts a gsize value from big-endian to the host byte order. +

+
++ + + + + + + + + + +

val :

a gsize value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GSIZE_FROM_LE()

+
#define GSIZE_FROM_LE(val) (GSIZE_TO_LE (val))
+
+

+Converts a gsize value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gsize value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GSIZE_TO_BE()

+
#define GSIZE_TO_BE(val) ((gsize) GUINT64_TO_BE (val))
+
+

+Converts a gsize value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gsize value in host byte order. +

Returns :

+val converted to big-endian byte order. +
+
+
+
+

GSIZE_TO_LE()

+
#define GSIZE_TO_LE(val) ((gsize) GUINT64_TO_LE (val))
+
+

+Converts a gsize value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gsize value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GSSIZE_FROM_BE()

+
#define GSSIZE_FROM_BE(val) (GSSIZE_TO_BE (val))
+
+

+Converts a gssize value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gssize value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GSSIZE_FROM_LE()

+
#define GSSIZE_FROM_LE(val) (GSSIZE_TO_LE (val))
+
+

+Converts a gssize value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gssize value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GSSIZE_TO_BE()

+
#define GSSIZE_TO_BE(val) ((gssize) GINT64_TO_BE (val))
+
+

+Converts a gssize value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gssize value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GSSIZE_TO_LE()

+
#define GSSIZE_TO_LE(val) ((gssize) GINT64_TO_LE (val))
+
+

+Converts a gssize value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gssize value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GINT16_FROM_BE()

+
#define GINT16_FROM_BE(val) (GINT16_TO_BE (val))
+
+

+Converts a gint16 value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint16 value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT16_FROM_LE()

+
#define GINT16_FROM_LE(val) (GINT16_TO_LE (val))
+
+

+Converts a gint16 value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint16 value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT16_TO_BE()

+
#define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val))
+
+

+Converts a gint16 value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gint16 value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GINT16_TO_LE()

+
#define GINT16_TO_LE(val) ((gint16) (val))
+
+

+Converts a gint16 value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gint16 value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GUINT16_FROM_BE()

+
#define GUINT16_FROM_BE(val) (GUINT16_TO_BE (val))
+
+

+Converts a guint16 value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint16 value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT16_FROM_LE()

+
#define GUINT16_FROM_LE(val) (GUINT16_TO_LE (val))
+
+

+Converts a guint16 value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint16 value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT16_TO_BE()

+
#define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val))
+
+

+Converts a guint16 value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a guint16 value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GUINT16_TO_LE()

+
#define GUINT16_TO_LE(val) ((guint16) (val))
+
+

+Converts a guint16 value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a guint16 value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GINT32_FROM_BE()

+
#define GINT32_FROM_BE(val) (GINT32_TO_BE (val))
+
+

+Converts a gint32 value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint32 value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT32_FROM_LE()

+
#define GINT32_FROM_LE(val) (GINT32_TO_LE (val))
+
+

+Converts a gint32 value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint32 value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT32_TO_BE()

+
#define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val))
+
+

+Converts a gint32 value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gint32 value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GINT32_TO_LE()

+
#define GINT32_TO_LE(val) ((gint32) (val))
+
+

+Converts a gint32 value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gint32 value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GUINT32_FROM_BE()

+
#define GUINT32_FROM_BE(val) (GUINT32_TO_BE (val))
+
+

+Converts a guint32 value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint32 value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT32_FROM_LE()

+
#define GUINT32_FROM_LE(val) (GUINT32_TO_LE (val))
+
+

+Converts a guint32 value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint32 value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT32_TO_BE()

+
#define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val))
+
+

+Converts a guint32 value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a guint32 value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GUINT32_TO_LE()

+
#define GUINT32_TO_LE(val) ((guint32) (val))
+
+

+Converts a guint32 value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a guint32 value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GINT64_FROM_BE()

+
#define GINT64_FROM_BE(val) (GINT64_TO_BE (val))
+
+

+Converts a gint64 value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint64 value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT64_FROM_LE()

+
#define GINT64_FROM_LE(val) (GINT64_TO_LE (val))
+
+

+Converts a gint64 value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a gint64 value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GINT64_TO_BE()

+
#define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val))
+
+

+Converts a gint64 value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a gint64 value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GINT64_TO_LE()

+
#define GINT64_TO_LE(val) ((gint64) (val))
+
+

+Converts a gint64 value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a gint64 value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GUINT64_FROM_BE()

+
#define GUINT64_FROM_BE(val) (GUINT64_TO_BE (val))
+
+

+Converts a guint64 value from big-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint64 value in big-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT64_FROM_LE()

+
#define GUINT64_FROM_LE(val) (GUINT64_TO_LE (val))
+
+

+Converts a guint64 value from little-endian to host byte order. +

+
++ + + + + + + + + + +

val :

a guint64 value in little-endian byte order. +

Returns :

+val converted to host byte order. +
+
+
+
+

GUINT64_TO_BE()

+
#define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val))
+
+

+Converts a guint64 value from host byte order to big-endian. +

+
++ + + + + + + + + + +

val :

a guint64 value in host byte order. +

Returns :

+val converted to big-endian. +
+
+
+
+

GUINT64_TO_LE()

+
#define GUINT64_TO_LE(val) ((guint64) (val))
+
+

+Converts a guint64 value from host byte order to little-endian. +

+
++ + + + + + + + + + +

val :

a guint64 value in host byte order. +

Returns :

+val converted to little-endian. +
+
+
+
+

GUINT16_SWAP_BE_PDP()

+
#define GUINT16_SWAP_BE_PDP(val) (GUINT16_SWAP_LE_BE (val))
+
+

+Converts a guint16 value between big-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint16 value in big-endian or pdp-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+

GUINT16_SWAP_LE_BE()

+
#define             GUINT16_SWAP_LE_BE(val)
+

+Converts a guint16 value between little-endian and big-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint16 value in little-endian or big-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+

GUINT16_SWAP_LE_PDP()

+
#define GUINT16_SWAP_LE_PDP(val) ((guint16) (val))
+
+

+Converts a guint16 value between little-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint16 value in little-endian or pdp-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+

GUINT32_SWAP_BE_PDP()

+
#define             GUINT32_SWAP_BE_PDP(val)
+

+Converts a guint32 value between big-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint32 value in big-endian or pdp-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+

GUINT32_SWAP_LE_BE()

+
#define             GUINT32_SWAP_LE_BE(val)
+

+Converts a guint32 value between little-endian and big-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint32 value in little-endian or big-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+

GUINT32_SWAP_LE_PDP()

+
#define             GUINT32_SWAP_LE_PDP(val)
+

+Converts a guint32 value between little-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint32 value in little-endian or pdp-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+

GUINT64_SWAP_LE_BE()

+
#define             GUINT64_SWAP_LE_BE(val)
+

+Converts a guint64 value between little-endian and big-endian byte order. +The conversion is symmetric so it can be used both ways. +

+
++ + + + + + + + + + +

val :

a guint64 value in little-endian or big-endian byte order. +

Returns :

+val converted to the opposite byte order. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Caches.html b/docs/reference/glib/html/glib-Caches.html new file mode 100644 index 0000000..0911abf --- /dev/null +++ b/docs/reference/glib/html/glib-Caches.html @@ -0,0 +1,407 @@ + + + + +Caches + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Caches

+

Caches — caches allow sharing of complex data structures + to save resources

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GCache;
+GCache*             g_cache_new                         (GCacheNewFunc value_new_func,
+                                                         GCacheDestroyFunc value_destroy_func,
+                                                         GCacheDupFunc key_dup_func,
+                                                         GCacheDestroyFunc key_destroy_func,
+                                                         GHashFunc hash_key_func,
+                                                         GHashFunc hash_value_func,
+                                                         GEqualFunc key_equal_func);
+gpointer            g_cache_insert                      (GCache *cache,
+                                                         gpointer key);
+void                g_cache_remove                      (GCache *cache,
+                                                         gconstpointer value);
+void                g_cache_destroy                     (GCache *cache);
+
+void                g_cache_key_foreach                 (GCache *cache,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+void                g_cache_value_foreach               (GCache *cache,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+
+void                (*GCacheDestroyFunc)                (gpointer value);
+gpointer            (*GCacheDupFunc)                    (gpointer value);
+gpointer            (*GCacheNewFunc)                    (gpointer key);
+
+
+
+

Description

+

+A GCache allows sharing of complex data structures, in order to +save system resources. +

+

+GTK+ uses caches for GtkStyles and GdkGCs. These consume a lot of +resources, so a GCache is used to see if a GtkStyle or GdkGC with +the required properties already exists. If it does, then the +existing object is used instead of creating a new one. +

+

+GCache uses keys and values. A GCache key describes the properties +of a particular resource. A GCache value is the actual resource.

+
+
+

Details

+
+

GCache

+
typedef struct _GCache GCache;
+

+The GCache struct is an opaque data structure containing +information about a GCache. It should only be accessed via the +following functions.

+
+
+
+

g_cache_new ()

+
GCache*             g_cache_new                         (GCacheNewFunc value_new_func,
+                                                         GCacheDestroyFunc value_destroy_func,
+                                                         GCacheDupFunc key_dup_func,
+                                                         GCacheDestroyFunc key_destroy_func,
+                                                         GHashFunc hash_key_func,
+                                                         GHashFunc hash_value_func,
+                                                         GEqualFunc key_equal_func);
+

+Creates a new GCache.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

value_new_func :

a function to create a new object given a key. + This is called by g_cache_insert() if an object + with the given key does not already exist. +

value_destroy_func :

a function to destroy an object. It is called + by g_cache_remove() when the object is no + longer needed (i.e. its reference count drops + to 0). +

key_dup_func :

a function to copy a key. It is called by + g_cache_insert() if the key does not already exist in + the GCache. +

key_destroy_func :

a function to destroy a key. It is called by + g_cache_remove() when the object is no longer + needed (i.e. its reference count drops to 0). +

hash_key_func :

a function to create a hash value from a key. +

hash_value_func :

a function to create a hash value from a value. +

key_equal_func :

a function to compare two keys. It should return + TRUE if the two keys are equivalent. +

Returns :

a new GCache. +
+
+
+
+

g_cache_insert ()

+
gpointer            g_cache_insert                      (GCache *cache,
+                                                         gpointer key);
+

+Gets the value corresponding to the given key, creating it if +necessary. It first checks if the value already exists in the +GCache, by using the key_equal_func function passed to +g_cache_new(). If it does already exist it is returned, and its +reference count is increased by one. If the value does not currently +exist, if is created by calling the value_new_func. The key is +duplicated by calling key_dup_func and the duplicated key and value +are inserted into the GCache.

+
++ + + + + + + + + + + + + + +

cache :

a GCache. +

key :

a key describing a GCache object. +

Returns :

a pointer to a GCache value. +
+
+
+
+

g_cache_remove ()

+
void                g_cache_remove                      (GCache *cache,
+                                                         gconstpointer value);
+

+Decreases the reference count of the given value. If it drops to 0 +then the value and its corresponding key are destroyed, using the +value_destroy_func and key_destroy_func passed to g_cache_new().

+
++ + + + + + + + + + +

cache :

a GCache. +

value :

the value to remove. +
+
+
+
+

g_cache_destroy ()

+
void                g_cache_destroy                     (GCache *cache);
+

+Frees the memory allocated for the GCache. +

+

+Note that it does not destroy the keys and values which were +contained in the GCache.

+
++ + + + +

cache :

a GCache. +
+
+
+
+

g_cache_key_foreach ()

+
void                g_cache_key_foreach                 (GCache *cache,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each of the keys in the GCache. +

+

+NOTE func is passed three parameters, the value and key of a cache +entry and the user_data. The order of value and key is different +from the order in which g_hash_table_foreach() passes key-value +pairs to its callback function !

+
++ + + + + + + + + + + + + + +

cache :

a GCache. +

func :

the function to call with each GCache key. +

user_data :

user data to pass to the function. +
+
+
+
+

g_cache_value_foreach ()

+
void                g_cache_value_foreach               (GCache *cache,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+
+

Warning

+

g_cache_value_foreach has been deprecated since version 2.10 and should not be used in newly-written code. The reason is that it passes pointers to internal + data structures to func; use g_cache_key_foreach() + instead

+
+

+Calls the given function for each of the values in the GCache.

+
++ + + + + + + + + + + + + + +

cache :

a GCache. +

func :

the function to call with each GCache value. +

user_data :

user data to pass to the function. +
+
+
+
+

GCacheDestroyFunc ()

+
void                (*GCacheDestroyFunc)                (gpointer value);
+

+Specifies the type of the value_destroy_func and key_destroy_func +functions passed to g_cache_new(). The functions are passed a +pointer to the GCache key or GCache value and should free any +memory and other resources associated with it.

+
++ + + + +

value :

the GCache value to destroy. +
+
+
+
+

GCacheDupFunc ()

+
gpointer            (*GCacheDupFunc)                    (gpointer value);
+

+Specifies the type of the key_dup_func function passed to +g_cache_new(). The function is passed a key +(not a value as the prototype implies) and +should return a duplicate of the key.

+
++ + + + + + + + + + +

value :

the GCache key to destroy (not a + GCache value as it seems). +

Returns :

a copy of the GCache key. +
+
+
+
+

GCacheNewFunc ()

+
gpointer            (*GCacheNewFunc)                    (gpointer key);
+

+Specifies the type of the value_new_func function passed to +g_cache_new(). It is passed a GCache key and should create the +value corresponding to the key.

+
++ + + + + + + + + + +

key :

a GCache key. +

Returns :

a new GCache value corresponding to the key. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Character-Set-Conversion.html b/docs/reference/glib/html/glib-Character-Set-Conversion.html new file mode 100644 index 0000000..cfb1927 --- /dev/null +++ b/docs/reference/glib/html/glib-Character-Set-Conversion.html @@ -0,0 +1,1191 @@ + + + + +Character Set Conversion + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Character Set Conversion

+

Character Set Conversion — convert strings between different character sets using iconv()

+
+
+

Synopsis

+
+#include <glib.h>
+
+gchar*              g_convert                           (const gchar *str,
+                                                         gssize len,
+                                                         const gchar *to_codeset,
+                                                         const gchar *from_codeset,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+gchar*              g_convert_with_fallback             (const gchar *str,
+                                                         gssize len,
+                                                         const gchar *to_codeset,
+                                                         const gchar *from_codeset,
+                                                         const gchar *fallback,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+                    GIConv;
+gchar*              g_convert_with_iconv                (const gchar *str,
+                                                         gssize len,
+                                                         GIConv converter,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+#define             G_CONVERT_ERROR
+GIConv              g_iconv_open                        (const gchar *to_codeset,
+                                                         const gchar *from_codeset);
+gsize               g_iconv                             (GIConv converter,
+                                                         gchar **inbuf,
+                                                         gsize *inbytes_left,
+                                                         gchar **outbuf,
+                                                         gsize *outbytes_left);
+gint                g_iconv_close                       (GIConv converter);
+gchar*              g_locale_to_utf8                    (const gchar *opsysstring,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+gchar*              g_filename_to_utf8                  (const gchar *opsysstring,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+gchar*              g_filename_from_utf8                (const gchar *utf8string,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+gchar *             g_filename_from_uri                 (const gchar *uri,
+                                                         gchar **hostname,
+                                                         GError **error);
+gchar *             g_filename_to_uri                   (const gchar *filename,
+                                                         const gchar *hostname,
+                                                         GError **error);
+gboolean            g_get_filename_charsets             (G_CONST_RETURN gchar ***charsets);
+gchar *             g_filename_display_name             (const gchar *filename);
+gchar *             g_filename_display_basename         (const gchar *filename);
+gchar*              g_locale_from_utf8                  (const gchar *utf8string,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+enum                GConvertError;
+
+gboolean            g_get_charset                       (G_CONST_RETURN char **charset);
+
+
+
+

Description

+

+

+
+

File Name Encodings

+

+ Historically, Unix has not had a defined encoding for file + names: a file name is valid as long as it does not have path + separators in it ("/"). However, displaying file names may + require conversion: from the character set in which they were + created, to the character set in which the application + operates. Consider the Spanish file name + "Presentación.sxi". If the + application which created it uses ISO-8859-1 for its encoding, + then the actual file name on disk would look like this: +

+
+Character:  P  r  e  s  e  n  t  a  c  i  ó  n  .  s  x  i
+Hex code:   50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69
+      
+

+ However, if the application use UTF-8, the actual file name on + disk would look like this: +

+
+Character:  P  r  e  s  e  n  t  a  c  i  ó     n  .  s  x  i
+Hex code:   50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69
+      
+

+ Glib uses UTF-8 for its strings, and GUI toolkits like GTK+ + that use Glib do the same thing. If you get a file name from + the file system, for example, from + readdir(3) or from g_dir_read_name(), + and you wish to display the file name to the user, you + will need to convert it into UTF-8. The + opposite case is when the user types the name of a file he + wishes to save: the toolkit will give you that string in + UTF-8 encoding, and you will need to convert it to the + character set used for file names before you can create the + file with open(2) or + fopen(3). +

+

+ By default, Glib assumes that file names on disk are in UTF-8 + encoding. This is a valid assumption for file systems which + were created relatively recently: most applications use UTF-8 + encoding for their strings, and that is also what they use for + the file names they create. However, older file systems may + still contain file names created in "older" encodings, such as + ISO-8859-1. In this case, for compatibility reasons, you may + want to instruct Glib to use that particular encoding for file + names rather than UTF-8. You can do this by specifying the + encoding for file names in the G_FILENAME_ENCODING + environment variable. For example, if your installation uses + ISO-8859-1 for file names, you can put this in your + ~/.profile: +

+
+export G_FILENAME_ENCODING=ISO-8859-1
+      
+

+ Glib provides the functions g_filename_to_utf8() + and g_filename_from_utf8() + to perform the necessary conversions. These functions convert + file names from the encoding specified in + G_FILENAME_ENCODING to UTF-8 and vice-versa. + Figure 2, “Conversion between File Name Encodings” illustrates how + these functions are used to convert between UTF-8 and the + encoding for file names in the file system. +

+
+

Figure 2. Conversion between File Name Encodings

+
Conversion between File Name Encodings
+
+
+

Checklist for Application Writers

+

+ This section is a practical summary of the detailed + description above. You can use this as a checklist of + things to do to make sure your applications process file + name encodings correctly. +

+
    +
  1. + If you get a file name from the file system from a + function such as readdir(3) or + gtk_file_chooser_get_filename(), + you do not need to do any conversion to pass that + file name to functions like open(2), + rename(2), or + fopen(3) — those are "raw" + file names which the file system understands. +

  2. +
  3. + If you need to display a file name, convert it to UTF-8 + first by using g_filename_to_utf8(). + If conversion fails, display a string like + "Unknown file name". Do + not convert this string back into the + encoding used for file names if you wish to pass it to + the file system; use the original file name instead. + For example, the document window of a word processor + could display "Unknown file name" in its title bar but + still let the user save the file, as it would keep the + raw file name internally. This can happen if the user + has not set the G_FILENAME_ENCODING + environment variable even though he has files whose + names are not encoded in UTF-8. +

  4. +
  5. + If your user interface lets the user type a file name + for saving or renaming, convert it to the encoding used + for file names in the file system by using g_filename_from_utf8(). + Pass the converted file name to functions like + fopen(3). If conversion fails, ask + the user to enter a different file name. This can + happen if the user types Japanese characters when + G_FILENAME_ENCODING is set to + ISO-8859-1, for example. +

  6. +
+
+
+
+
+

Details

+
+

g_convert ()

+
gchar*              g_convert                           (const gchar *str,
+                                                         gssize len,
+                                                         const gchar *to_codeset,
+                                                         const gchar *from_codeset,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string from one character set to another. +

+

+Note that you should use g_iconv() for streaming +conversions[2].

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

the string to convert +

len :

the length of the string, or -1 if the string is + nul-terminated[1]. +

to_codeset :

name of character set into which to convert str +

from_codeset :

character set of str. +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. If the error + G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + stored will the byte offset after the last valid + input sequence. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

If the conversion was successful, a newly allocated + nul-terminated string, which must be freed with + g_free(). Otherwise NULL and error will be set. +
+
+
+
+

g_convert_with_fallback ()

+
gchar*              g_convert_with_fallback             (const gchar *str,
+                                                         gssize len,
+                                                         const gchar *to_codeset,
+                                                         const gchar *from_codeset,
+                                                         const gchar *fallback,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string from one character set to another, possibly +including fallback sequences for characters not representable +in the output. Note that it is not guaranteed that the specification +for the fallback sequences in fallback will be honored. Some +systems may do an approximate conversion from from_codeset +to to_codeset in their iconv() functions, +in which case GLib will simply return that approximate conversion. +

+

+Note that you should use g_iconv() for streaming +conversions[2].

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

the string to convert +

len :

the length of the string, or -1 if the string is + nul-terminated[1]. +

to_codeset :

name of character set into which to convert str +

from_codeset :

character set of str. +

fallback :

UTF-8 string to use in place of character not + present in the target encoding. (The string must be + representable in the target encoding). + If NULL, characters not in the target encoding will + be represented as Unicode escapes \uxxxx or \Uxxxxyyyy. +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

If the conversion was successful, a newly allocated + nul-terminated string, which must be freed with + g_free(). Otherwise NULL and error will be set. +
+
+
+
+

GIConv

+
typedef struct _GIConv GIConv;
+

+The GIConv struct wraps an +iconv() conversion descriptor. It contains private data +and should only be accessed using the following functions. +

+
+
+
+

g_convert_with_iconv ()

+
gchar*              g_convert_with_iconv                (const gchar *str,
+                                                         gssize len,
+                                                         GIConv converter,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string from one character set to another. +

+

+Note that you should use g_iconv() for streaming +conversions[2].

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

the string to convert +

len :

the length of the string, or -1 if the string is + nul-terminated[1]. +

converter :

conversion descriptor from g_iconv_open() +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. If the error + G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + stored will the byte offset after the last valid + input sequence. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

If the conversion was successful, a newly allocated + nul-terminated string, which must be freed with + g_free(). Otherwise NULL and error will be set. +
+
+
+
+

G_CONVERT_ERROR

+
#define G_CONVERT_ERROR g_convert_error_quark()
+
+

+Error domain for character set conversions. Errors in this domain will +be from the GConvertError enumeration. See GError for information on +error domains. +

+
+
+
+

g_iconv_open ()

+
GIConv              g_iconv_open                        (const gchar *to_codeset,
+                                                         const gchar *from_codeset);
+

+Same as the standard UNIX routine iconv_open(), but +may be implemented via libiconv on UNIX flavors that lack +a native implementation. +

+

+GLib provides g_convert() and g_locale_to_utf8() which are likely +more convenient than the raw iconv wrappers.

+
++ + + + + + + + + + + + + + +

to_codeset :

destination codeset +

from_codeset :

source codeset +

Returns :

a "conversion descriptor", or (GIConv)-1 if + opening the converter failed. +
+
+
+
+

g_iconv ()

+
gsize               g_iconv                             (GIConv converter,
+                                                         gchar **inbuf,
+                                                         gsize *inbytes_left,
+                                                         gchar **outbuf,
+                                                         gsize *outbytes_left);
+

+Same as the standard UNIX routine iconv(), but +may be implemented via libiconv on UNIX flavors that lack +a native implementation. +

+

+GLib provides g_convert() and g_locale_to_utf8() which are likely +more convenient than the raw iconv wrappers.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

converter :

conversion descriptor from g_iconv_open() +

inbuf :

bytes to convert +

inbytes_left :

inout parameter, bytes remaining to convert in inbuf +

outbuf :

converted output bytes +

outbytes_left :

inout parameter, bytes available to fill in outbuf +

Returns :

count of non-reversible conversions, or -1 on error +
+
+
+
+

g_iconv_close ()

+
gint                g_iconv_close                       (GIConv converter);
+

+Same as the standard UNIX routine iconv_close(), but +may be implemented via libiconv on UNIX flavors that lack +a native implementation. Should be called to clean up +the conversion descriptor from g_iconv_open() when +you are done converting things. +

+

+GLib provides g_convert() and g_locale_to_utf8() which are likely +more convenient than the raw iconv wrappers.

+
++ + + + + + + + + + +

converter :

a conversion descriptor from g_iconv_open() +

Returns :

-1 on error, 0 on success +
+
+
+
+

g_locale_to_utf8 ()

+
gchar*              g_locale_to_utf8                    (const gchar *opsysstring,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string which is in the encoding used for strings by +the C runtime (usually the same as that used by the operating +system) in the current locale into a +UTF-8 string.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

opsysstring :

a string in the encoding of the current locale. On Windows + this means the system codepage. +

len :

the length of the string, or -1 if the string is + nul-terminated[1]. +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. If the error + G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + stored will the byte offset after the last valid + input sequence. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

The converted string, or NULL on an error. +
+
+
+
+

g_filename_to_utf8 ()

+
gchar*              g_filename_to_utf8                  (const gchar *opsysstring,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string which is in the encoding used by GLib for +filenames into a UTF-8 string. Note that on Windows GLib uses UTF-8 +for filenames; on other platforms, this function indirectly depends on +the current locale.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

opsysstring :

a string in the encoding for filenames +

len :

the length of the string, or -1 if the string is + nul-terminated[1]. +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. If the error + G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + stored will the byte offset after the last valid + input sequence. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

The converted string, or NULL on an error. +
+
+
+
+

g_filename_from_utf8 ()

+
gchar*              g_filename_from_utf8                (const gchar *utf8string,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string from UTF-8 to the encoding GLib uses for +filenames. Note that on Windows GLib uses UTF-8 for filenames; +on other platforms, this function indirectly depends on the +current locale.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

utf8string :

a UTF-8 encoded string. +

len :

the length of the string, or -1 if the string is + nul-terminated. +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. If the error + G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + stored will the byte offset after the last valid + input sequence. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

The converted string, or NULL on an error. +
+
+
+
+

g_filename_from_uri ()

+
gchar *             g_filename_from_uri                 (const gchar *uri,
+                                                         gchar **hostname,
+                                                         GError **error);
+

+Converts an escaped ASCII-encoded URI to a local filename in the +encoding used for filenames.

+
++ + + + + + + + + + + + + + + + + + +

uri :

a uri describing a filename (escaped, encoded in ASCII). +

hostname :

Location to store hostname for the URI, or NULL. + If there is no hostname in the URI, NULL will be + stored in this location. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

a newly-allocated string holding the resulting + filename, or NULL on an error. +
+
+
+
+

g_filename_to_uri ()

+
gchar *             g_filename_to_uri                   (const gchar *filename,
+                                                         const gchar *hostname,
+                                                         GError **error);
+

+Converts an absolute filename to an escaped ASCII-encoded URI, with the path +component following Section 3.3. of RFC 2396.

+
++ + + + + + + + + + + + + + + + + + +

filename :

an absolute filename specified in the GLib file name encoding, + which is the on-disk file name bytes on Unix, and UTF-8 on + Windows +

hostname :

A UTF-8 encoded hostname, or NULL for none. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

a newly-allocated string holding the resulting + URI, or NULL on an error. +
+
+
+
+

g_get_filename_charsets ()

+
gboolean            g_get_filename_charsets             (G_CONST_RETURN gchar ***charsets);
+

+Determines the preferred character sets used for filenames. +The first character set from the charsets is the filename encoding, the +subsequent character sets are used when trying to generate a displayable +representation of a filename, see g_filename_display_name(). +

+

+On Unix, the character sets are determined by consulting the +environment variables G_FILENAME_ENCODING and +G_BROKEN_FILENAMES. On Windows, the character set +used in the GLib API is always UTF-8 and said environment variables +have no effect. +

+

+G_FILENAME_ENCODING may be set to a comma-separated list +of character set names. The special token "@locale" is taken to +mean the character set for the current +locale. If G_FILENAME_ENCODING is not set, but +G_BROKEN_FILENAMES is, the character set of the current +locale is taken as the filename encoding. If neither environment variable +is set, UTF-8 is taken as the filename encoding, but the character +set of the current locale is also put in the list of encodings. +

+

+The returned charsets belong to GLib and must not be freed. +

+

+Note that on Unix, regardless of the locale character set or +G_FILENAME_ENCODING value, the actual file names present +on a system might be in any random encoding or just gibberish.

+
++ + + + + + + + + + +

charsets :

return location for the NULL-terminated list of encoding names +

Returns :

TRUE if the filename encoding is UTF-8. + +
+

Since 2.6

+
+
+
+

g_filename_display_name ()

+
gchar *             g_filename_display_name             (const gchar *filename);
+

+Converts a filename into a valid UTF-8 string. The conversion is +not necessarily reversible, so you should keep the original around +and use the return value of this function only for display purposes. +Unlike g_filename_to_utf8(), the result is guaranteed to be non-NULL +even if the filename actually isn't in the GLib file name encoding. +

+

+If GLib can not make sense of the encoding of filename, as a last resort it +replaces unknown characters with U+FFFD, the Unicode replacement character. +You can search the result for the UTF-8 encoding of this character (which is +"\357\277\275" in octal notation) to find out if filename was in an invalid +encoding. +

+

+If you know the whole pathname of the file you should use +g_filename_display_basename(), since that allows location-based +translation of filenames.

+
++ + + + + + + + + + +

filename :

a pathname hopefully in the GLib file name encoding +

Returns :

a newly allocated string containing + a rendition of the filename in valid UTF-8 + +
+

Since 2.6

+
+
+
+

g_filename_display_basename ()

+
gchar *             g_filename_display_basename         (const gchar *filename);
+

+Returns the display basename for the particular filename, guaranteed +to be valid UTF-8. The display name might not be identical to the filename, +for instance there might be problems converting it to UTF-8, and some files +can be translated in the display. +

+

+If GLib can not make sense of the encoding of filename, as a last resort it +replaces unknown characters with U+FFFD, the Unicode replacement character. +You can search the result for the UTF-8 encoding of this character (which is +"\357\277\275" in octal notation) to find out if filename was in an invalid +encoding. +

+

+You must pass the whole absolute pathname to this functions so that +translation of well known locations can be done. +

+

+This function is preferred over g_filename_display_name() if you know the +whole path, as it allows translation.

+
++ + + + + + + + + + +

filename :

an absolute pathname in the GLib file name encoding +

Returns :

a newly allocated string containing + a rendition of the basename of the filename in valid UTF-8 + +
+

Since 2.6

+
+
+
+

g_locale_from_utf8 ()

+
gchar*              g_locale_from_utf8                  (const gchar *utf8string,
+                                                         gssize len,
+                                                         gsize *bytes_read,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Converts a string from UTF-8 to the encoding used for strings by +the C runtime (usually the same as that used by the operating +system) in the current locale. On +Windows this means the system codepage.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

utf8string :

a UTF-8 encoded string +

len :

the length of the string, or -1 if the string is + nul-terminated[1]. +

bytes_read :

location to store the number of bytes in the + input string that were successfully converted, or NULL. + Even if the conversion was successful, this may be + less than len if there were partial characters + at the end of the input. If the error + G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + stored will the byte offset after the last valid + input sequence. +

bytes_written :

the number of bytes stored in the output buffer (not + including the terminating nul). +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError may occur. +

Returns :

The converted string, or NULL on an error. +
+
+
+
+

enum GConvertError

+
typedef enum 
+{
+  G_CONVERT_ERROR_NO_CONVERSION,
+  G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
+  G_CONVERT_ERROR_FAILED,
+  G_CONVERT_ERROR_PARTIAL_INPUT,
+  G_CONVERT_ERROR_BAD_URI,
+  G_CONVERT_ERROR_NOT_ABSOLUTE_PATH
+} GConvertError;
+
+

+Error codes returned by character set conversion routines. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

G_CONVERT_ERROR_NO_CONVERSION

Conversion between the requested character sets +is not supported. +

G_CONVERT_ERROR_ILLEGAL_SEQUENCE

Invalid byte sequence in conversion input. +

G_CONVERT_ERROR_FAILED

Conversion failed for some reason. +

G_CONVERT_ERROR_PARTIAL_INPUT

Partial character sequence at end of input. +

G_CONVERT_ERROR_BAD_URI

URI is invalid. +

G_CONVERT_ERROR_NOT_ABSOLUTE_PATH

Pathname is not an absolute path. +
+
+
+
+

g_get_charset ()

+
gboolean            g_get_charset                       (G_CONST_RETURN char **charset);
+

+Obtains the character set for the current +locale; you might use this character set as an argument to +g_convert(), to convert from the current locale's encoding to some +other encoding. (Frequently g_locale_to_utf8() and g_locale_from_utf8() +are nice shortcuts, though.) +

+

+On Windows the character set returned by this function is the +so-called system default ANSI code-page. That is the character set +used by the "narrow" versions of C library and Win32 functions that +handle file names. It might be different from the character set +used by the C library's current locale. +

+

+The return value is TRUE if the locale's encoding is UTF-8, in that +case you can perhaps avoid calling g_convert(). +

+

+The string returned in charset is not allocated, and should not be +freed.

+
++ + + + + + + + + + +

charset :

return location for character set name +

Returns :

TRUE if the returned charset is UTF-8 +
+
+
+
+

+

[1] + Note that some encodings may allow nul bytes to + occur inside strings. In that case, using -1 for + the len parameter is unsafe. +

+

[2] +Despite the fact that byes_read can return information about partial +characters, the g_convert_... functions +are not generally suitable for streaming. If the underlying converter +being used maintains internal state, then this won't be preserved +across successive calls to g_convert(), g_convert_with_iconv() or +g_convert_with_fallback(). (An example of this is the GNU C converter +for CP1255 which does not emit a base character until it knows that +the next character is not a mark that could combine with the base +character.) +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Commandline-option-parser.html b/docs/reference/glib/html/glib-Commandline-option-parser.html new file mode 100644 index 0000000..b3176fa --- /dev/null +++ b/docs/reference/glib/html/glib-Commandline-option-parser.html @@ -0,0 +1,1603 @@ + + + + +Commandline option parser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Commandline option parser

+

Commandline option parser — parses commandline options

+
+
+

Synopsis

+
+#include <glib.h>
+
+enum                GOptionError;
+#define             G_OPTION_ERROR
+gboolean            (*GOptionArgFunc)                   (const gchar *option_name,
+                                                         const gchar *value,
+                                                         gpointer data,
+                                                         GError **error);
+                    GOptionContext;
+GOptionContext *    g_option_context_new                (const gchar *parameter_string);
+void                g_option_context_set_summary        (GOptionContext *context,
+                                                         const gchar *summary);
+const gchar *       g_option_context_get_summary        (GOptionContext *context);
+void                g_option_context_set_description    (GOptionContext *context,
+                                                         const gchar *description);
+const gchar *       g_option_context_get_description    (GOptionContext *context);
+const gchar *       (*GTranslateFunc)                   (const gchar *str,
+                                                         gpointer data);
+void                g_option_context_set_translate_func (GOptionContext *context,
+                                                         GTranslateFunc func,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_notify);
+void                g_option_context_set_translation_domain
+                                                        (GOptionContext *context,
+                                                         const gchar *domain);
+void                g_option_context_free               (GOptionContext *context);
+gboolean            g_option_context_parse              (GOptionContext *context,
+                                                         gint *argc,
+                                                         gchar ***argv,
+                                                         GError **error);
+void                g_option_context_set_help_enabled   (GOptionContext *context,
+                                                         gboolean help_enabled);
+gboolean            g_option_context_get_help_enabled   (GOptionContext *context);
+void                g_option_context_set_ignore_unknown_options
+                                                        (GOptionContext *context,
+                                                         gboolean ignore_unknown);
+gboolean            g_option_context_get_ignore_unknown_options
+                                                        (GOptionContext *context);
+gchar *             g_option_context_get_help           (GOptionContext *context,
+                                                         gboolean main_help,
+                                                         GOptionGroup *group);
+enum                GOptionArg;
+enum                GOptionFlags;
+#define             G_OPTION_REMAINING
+                    GOptionEntry;
+void                g_option_context_add_main_entries   (GOptionContext *context,
+                                                         const GOptionEntry *entries,
+                                                         const gchar *translation_domain);
+                    GOptionGroup;
+void                g_option_context_add_group          (GOptionContext *context,
+                                                         GOptionGroup *group);
+void                g_option_context_set_main_group     (GOptionContext *context,
+                                                         GOptionGroup *group);
+GOptionGroup *      g_option_context_get_main_group     (GOptionContext *context);
+GOptionGroup *      g_option_group_new                  (const gchar *name,
+                                                         const gchar *description,
+                                                         const gchar *help_description,
+                                                         gpointer user_data,
+                                                         GDestroyNotify destroy);
+void                g_option_group_free                 (GOptionGroup *group);
+void                g_option_group_add_entries          (GOptionGroup *group,
+                                                         const GOptionEntry *entries);
+gboolean            (*GOptionParseFunc)                 (GOptionContext *context,
+                                                         GOptionGroup *group,
+                                                         gpointer data,
+                                                         GError **error);
+void                g_option_group_set_parse_hooks      (GOptionGroup *group,
+                                                         GOptionParseFunc pre_parse_func,
+                                                         GOptionParseFunc post_parse_func);
+void                (*GOptionErrorFunc)                 (GOptionContext *context,
+                                                         GOptionGroup *group,
+                                                         gpointer data,
+                                                         GError **error);
+void                g_option_group_set_error_hook       (GOptionGroup *group,
+                                                         GOptionErrorFunc error_func);
+void                g_option_group_set_translate_func   (GOptionGroup *group,
+                                                         GTranslateFunc func,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_notify);
+void                g_option_group_set_translation_domain
+                                                        (GOptionGroup *group,
+                                                         const gchar *domain);
+
+
+
+

Description

+

+The GOption commandline parser is intended to be a simpler replacement for the +popt library. It supports short and long commandline options, as shown in the +following example: +

+

+testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2 +

+

+The example demonstrates a number of features of the GOption commandline parser +

+
    +
  • + Options can be single letters, prefixed by a single dash. Multiple + short options can be grouped behind a single dash. +

  • +
  • + Long options are prefixed by two consecutive dashes. +

  • +
  • + Options can have an extra argument, which can be a number, a string or a + filename. For long options, the extra argument can be appended with an + equals sign after the option name. +

  • +
  • + Non-option arguments are returned to the application as rest arguments. +

  • +
  • + An argument consisting solely of two dashes turns off further parsing, + any remaining arguments (even those starting with a dash) are returned + to the application as rest arguments. +

  • +
+

+

+

+Another important feature of GOption is that it can automatically generate +nicely formatted help output. Unless it is explicitly turned off with +g_option_context_set_help_enabled(), GOption will recognize the +--help, -?, --help-all +and --help-groupname options +(where groupname is the name of a GOptionGroup) +and write a text similar to the one shown in the following example to stdout. +

+

+

+
+Usage:
+  testtreemodel [OPTION...] - test tree model performance
+ 
+Help Options:
+  -h, --help               Show help options
+  --help-all               Show all help options
+  --help-gtk               Show GTK+ Options
+ 
+Application Options:
+  -r, --repeats=N          Average over N repetitions
+  -m, --max-size=M         Test up to 2^M items
+  --display=DISPLAY        X display to use
+  -v, --verbose            Be verbose
+  -b, --beep               Beep when done   
+  --rand                   Randomize the data
+
+

+

+

+GOption groups options in GOptionGroups, which makes it easy to +incorporate options from multiple sources. The intended use for this is +to let applications collect option groups from the libraries it uses, +add them to their GOptionContext, and parse all options by a single call +to g_option_context_parse(). See gtk_get_option_group() for an example. +

+

+If an option is declared to be of type string or filename, GOption takes +care of converting it to the right encoding; strings are returned in UTF-8, +filenames are returned in the GLib filename encoding. Note that this only +works if setlocale() has been called before g_option_context_parse(). +

+

+Here is a complete example of setting up GOption to parse the example +commandline above and produce the example help output. +

+

+

+
+static gint repeats = 2;
+static gint max_size = 8;
+static gboolean verbose = FALSE;
+static gboolean beep = FALSE;
+static gboolean rand = FALSE;
+
+static GOptionEntry entries[] = 
+{
+  { "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" },
+  { "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" },
+  { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL },
+  { "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Beep when done", NULL },
+  { "rand", 0, 0, G_OPTION_ARG_NONE, &rand, "Randomize the data", NULL },
+  { NULL }
+};
+
+int 
+main (int argc, char *argv[])
+{
+  GError *error = NULL;
+  GOptionContext *context;
+
+  context = g_option_context_new ("- test tree model performance");
+  g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
+  g_option_context_add_group (context, gtk_get_option_group (TRUE));
+  if (!g_option_context_parse (context, &argc, &argv, &error))
+    {
+      g_print ("option parsing failed: %s\n", error->message);
+      exit (1);
+    }
+
+  // ...
+
+}
+
+
+
+

Details

+
+

enum GOptionError

+
typedef enum
+{
+  G_OPTION_ERROR_UNKNOWN_OPTION,
+  G_OPTION_ERROR_BAD_VALUE,
+  G_OPTION_ERROR_FAILED
+} GOptionError;
+
+

+Error codes returned by option parsing.

+
++ + + + + + + + + + + + + + +

G_OPTION_ERROR_UNKNOWN_OPTION

An option was not known to the parser. + This error will only be reported, if the parser hasn't been instructed + to ignore unknown options, see g_option_context_set_ignore_unknown_options(). +

G_OPTION_ERROR_BAD_VALUE

A value couldn't be parsed. +

G_OPTION_ERROR_FAILED

A GOptionArgFunc callback failed. +
+
+
+
+

G_OPTION_ERROR

+
#define G_OPTION_ERROR (g_option_error_quark ())
+
+

+Error domain for option parsing. Errors in this domain will +be from the GOptionError enumeration. See GError for information on +error domains.

+
+
+
+

GOptionArgFunc ()

+
gboolean            (*GOptionArgFunc)                   (const gchar *option_name,
+                                                         const gchar *value,
+                                                         gpointer data,
+                                                         GError **error);
+

+The type of function to be passed as callback for G_OPTION_ARG_CALLBACK +options.

+
++ + + + + + + + + + + + + + + + + + + + + + +

option_name :

The name of the option being parsed. This will be either a + single dash followed by a single letter (for a short name) or two dashes + followed by a long option name. +

value :

The value to be parsed. +

data :

User data added to the GOptionGroup containing the option when it + was created with g_option_group_new() +

error :

A return location for errors. The error code G_OPTION_ERROR_FAILED + is intended to be used for errors in GOptionArgFunc callbacks. +

Returns :

TRUE if the option was successfully parsed, FALSE if an error + occurred, in which case error should be set with g_set_error() +
+
+
+
+

GOptionContext

+
typedef struct _GOptionContext GOptionContext;
+

+A GOptionContext struct defines which options +are accepted by the commandline option parser. The struct has only private +fields and should not be directly accessed.

+
+
+
+

g_option_context_new ()

+
GOptionContext *    g_option_context_new                (const gchar *parameter_string);
+

+Creates a new option context. +

+

+The parameter_string can serve multiple purposes. It can be used +to add descriptions for "rest" arguments, which are not parsed by +the GOptionContext, typically something like "FILES" or +"FILE1 FILE2...". If you are using G_OPTION_REMAINING for +collecting "rest" arguments, GLib handles this automatically by +using the arg_description of the corresponding GOptionEntry in +the usage summary. +

+

+Another usage is to give a short summary of the program +functionality, like " - frob the strings", which will be displayed +in the same line as the usage. For a longer description of the +program functionality that should be displayed as a paragraph +below the usage line, use g_option_context_set_summary(). +

+

+Note that the parameter_string is translated using the +function set with g_option_context_set_translate_func(), so +it should normally be passed untranslated.

+
++ + + + + + + + + + +

parameter_string :

a string which is displayed in + the first line of --help output, after the + usage summary + programname [OPTION...] +

Returns :

a newly created GOptionContext, which must be + freed with g_option_context_free() after use. + +
+

Since 2.6

+
+
+
+

g_option_context_set_summary ()

+
void                g_option_context_set_summary        (GOptionContext *context,
+                                                         const gchar *summary);
+

+Adds a string to be displayed in --help output +before the list of options. This is typically a summary of the +program functionality. +

+

+Note that the summary is translated (see +g_option_context_set_translate_func() and +g_option_context_set_translation_domain()).

+
++ + + + + + + + + + +

context :

a GOptionContext +

summary :

a string to be shown in --help output + before the list of options, or NULL +
+

Since 2.12

+
+
+
+

g_option_context_get_summary ()

+
const gchar *       g_option_context_get_summary        (GOptionContext *context);
+

+Returns the summary. See g_option_context_set_summary().

+
++ + + + + + + + + + +

context :

a GOptionContext +

Returns :

the summary + +
+

Since 2.12

+
+
+
+

g_option_context_set_description ()

+
void                g_option_context_set_description    (GOptionContext *context,
+                                                         const gchar *description);
+

+Adds a string to be displayed in --help output +after the list of options. This text often includes a bug reporting +address. +

+

+Note that the summary is translated (see +g_option_context_set_translate_func()).

+
++ + + + + + + + + + +

context :

a GOptionContext +

description :

a string to be shown in --help output + after the list of options, or NULL +
+

Since 2.12

+
+
+
+

g_option_context_get_description ()

+
const gchar *       g_option_context_get_description    (GOptionContext *context);
+

+Returns the description. See g_option_context_set_description().

+
++ + + + + + + + + + +

context :

a GOptionContext +

Returns :

the description + +
+

Since 2.12

+
+
+
+

GTranslateFunc ()

+
const gchar *       (*GTranslateFunc)                   (const gchar *str,
+                                                         gpointer data);
+

+The type of functions which are used to translate user-visible +strings, for --help output.

+
++ + + + + + + + + + + + + + +

str :

the untranslated string +

data :

user data specified when installing the function, e.g. + in g_option_group_set_translate_func() +

Returns :

a translation of the string for the current locale. + The returned string is owned by GLib and must not be freed. +
+
+
+
+

g_option_context_set_translate_func ()

+
void                g_option_context_set_translate_func (GOptionContext *context,
+                                                         GTranslateFunc func,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_notify);
+

+Sets the function which is used to translate the contexts +user-visible strings, for --help output. +If func is NULL, strings are not translated. +

+

+Note that option groups have their own translation functions, +this function only affects the parameter_string (see g_option_context_new()), +the summary (see g_option_context_set_summary()) and the description +(see g_option_context_set_description()). +

+

+If you are using gettext(), you only need to set the translation +domain, see g_option_context_set_translation_domain().

+
++ + + + + + + + + + + + + + + + + + +

context :

a GOptionContext +

func :

the GTranslateFunc, or NULL +

data :

user data to pass to func, or NULL +

destroy_notify :

a function which gets called to free data, or NULL +
+

Since 2.12

+
+
+
+

g_option_context_set_translation_domain ()

+
void                g_option_context_set_translation_domain
+                                                        (GOptionContext *context,
+                                                         const gchar *domain);
+

+A convenience function to use gettext() for translating +user-visible strings.

+
++ + + + + + + + + + +

context :

a GOptionContext +

domain :

the domain to use +
+

Since 2.12

+
+
+
+

g_option_context_free ()

+
void                g_option_context_free               (GOptionContext *context);
+

+Frees context and all the groups which have been +added to it. +

+

+Please note that parsed arguments need to be freed separately (see +GOptionEntry).

+
++ + + + +

context :

a GOptionContext +
+

Since 2.6

+
+
+
+

g_option_context_parse ()

+
gboolean            g_option_context_parse              (GOptionContext *context,
+                                                         gint *argc,
+                                                         gchar ***argv,
+                                                         GError **error);
+

+Parses the command line arguments, recognizing options +which have been added to context. A side-effect of +calling this function is that g_set_prgname() will be +called. +

+

+If the parsing is successful, any parsed arguments are +removed from the array and argc and argv are updated +accordingly. A '--' option is stripped from argv +unless there are unparsed options before and after it, +or some of the options after it start with '-'. In case +of an error, argc and argv are left unmodified. +

+

+If automatic --help support is enabled +(see g_option_context_set_help_enabled()), and the +argv array contains one of the recognized help options, +this function will produce help output to stdout and +call exit (0). +

+

+Note that function depends on the +current locale for +automatic character set conversion of string and filename +arguments.

+
++ + + + + + + + + + + + + + + + + + + + + + +

context :

a GOptionContext +

argc :

a pointer to the number of command line arguments +

argv :

a pointer to the array of command line arguments +

error :

a return location for errors +

Returns :

TRUE if the parsing was successful, + FALSE if an error occurred + +
+

Since 2.6

+
+
+
+

g_option_context_set_help_enabled ()

+
void                g_option_context_set_help_enabled   (GOptionContext *context,
+                                                         gboolean help_enabled);
+

+Enables or disables automatic generation of --help +output. By default, g_option_context_parse() recognizes +--help, -h, +-?, --help-all +and --help-groupname and creates +suitable output to stdout.

+
++ + + + + + + + + + +

context :

a GOptionContext +

help_enabled :

TRUE to enable --help, FALSE to disable it +
+

Since 2.6

+
+
+
+

g_option_context_get_help_enabled ()

+
gboolean            g_option_context_get_help_enabled   (GOptionContext *context);
+

+Returns whether automatic --help generation +is turned on for context. See g_option_context_set_help_enabled().

+
++ + + + + + + + + + +

context :

a GOptionContext +

Returns :

TRUE if automatic help generation is turned on. + +
+

Since 2.6

+
+
+
+

g_option_context_set_ignore_unknown_options ()

+
void                g_option_context_set_ignore_unknown_options
+                                                        (GOptionContext *context,
+                                                         gboolean ignore_unknown);
+

+Sets whether to ignore unknown options or not. If an argument is +ignored, it is left in the argv array after parsing. By default, +g_option_context_parse() treats unknown options as error. +

+

+This setting does not affect non-option arguments (i.e. arguments +which don't start with a dash). But note that GOption cannot reliably +determine whether a non-option belongs to a preceding unknown option.

+
++ + + + + + + + + + +

context :

a GOptionContext +

ignore_unknown :

TRUE to ignore unknown options, FALSE to produce + an error when unknown options are met +
+

Since 2.6

+
+
+
+

g_option_context_get_ignore_unknown_options ()

+
gboolean            g_option_context_get_ignore_unknown_options
+                                                        (GOptionContext *context);
+

+Returns whether unknown options are ignored or not. See +g_option_context_set_ignore_unknown_options().

+
++ + + + + + + + + + +

context :

a GOptionContext +

Returns :

TRUE if unknown options are ignored. + +
+

Since 2.6

+
+
+
+

g_option_context_get_help ()

+
gchar *             g_option_context_get_help           (GOptionContext *context,
+                                                         gboolean main_help,
+                                                         GOptionGroup *group);
+

+Returns a formatted, translated help text for the given context. +To obtain the text produced by --help, call +g_option_context_get_help (context, TRUE, NULL). +To obtain the text produced by --help-all, call +g_option_context_get_help (context, FALSE, NULL). +To obtain the help text for an option group, call +g_option_context_get_help (context, FALSE, group).

+
++ + + + + + + + + + + + + + + + + + +

context :

a GOptionContext +

main_help :

if TRUE, only include the main group +

group :

the GOptionGroup to create help for, or NULL +

Returns :

A newly allocated string containing the help text + +
+

Since 2.14

+
+
+
+

enum GOptionArg

+
typedef enum
+{
+  G_OPTION_ARG_NONE,
+  G_OPTION_ARG_STRING,
+  G_OPTION_ARG_INT,
+  G_OPTION_ARG_CALLBACK,
+  G_OPTION_ARG_FILENAME,
+  G_OPTION_ARG_STRING_ARRAY,
+  G_OPTION_ARG_FILENAME_ARRAY,
+  G_OPTION_ARG_DOUBLE,
+  G_OPTION_ARG_INT64
+} GOptionArg;
+
+

+The GOptionArg enum values determine which type of extra argument the +options expect to find. If an option expects an extra argument, it +can be specified in several ways; with a short option: +-x arg, with a long option: --name arg +or combined in a single argument: --name=arg.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_OPTION_ARG_NONE

No extra argument. This is useful for simple flags. +

G_OPTION_ARG_STRING

The option takes a string argument. +

G_OPTION_ARG_INT

The option takes an integer argument. +

G_OPTION_ARG_CALLBACK

The option provides a callback to parse the + extra argument. +

G_OPTION_ARG_FILENAME

The option takes a filename as argument. +

G_OPTION_ARG_STRING_ARRAY

The option takes a string argument, multiple + uses of the option are collected into an array of strings. +

G_OPTION_ARG_FILENAME_ARRAY

The option takes a filename as argument, + multiple uses of the option are collected into an array of strings. +

G_OPTION_ARG_DOUBLE

The option takes a double argument. The argument + can be formatted either for the user's locale or for the "C" locale. Since 2.12 +

G_OPTION_ARG_INT64

The option takes a 64-bit integer. Like G_OPTION_ARG_INT + but for larger numbers. The number can be in decimal base, or in hexadecimal + (when prefixed with 0x, for example, 0xffffffff). + Since 2.12 +
+
+
+
+

enum GOptionFlags

+
typedef enum
+{
+  G_OPTION_FLAG_HIDDEN		= 1 << 0,
+  G_OPTION_FLAG_IN_MAIN		= 1 << 1,
+  G_OPTION_FLAG_REVERSE		= 1 << 2,
+  G_OPTION_FLAG_NO_ARG		= 1 << 3,
+  G_OPTION_FLAG_FILENAME = 1 << 4,
+  G_OPTION_FLAG_OPTIONAL_ARG    = 1 << 5,
+  G_OPTION_FLAG_NOALIAS	        = 1 << 6
+} GOptionFlags;
+
+

+Flags which modify individual options.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_OPTION_FLAG_HIDDEN

The option doesn't appear in --help + output. +

G_OPTION_FLAG_IN_MAIN

The option appears in the main section of the + --help output, even if it is defined in a group. +

G_OPTION_FLAG_REVERSE

For options of the G_OPTION_ARG_NONE kind, this flag + indicates that the sense of the option is reversed. +

G_OPTION_FLAG_NO_ARG

For options of the G_OPTION_ARG_CALLBACK kind, + this flag indicates that the callback does not take any argument + (like a G_OPTION_ARG_NONE option). Since 2.8 +

G_OPTION_FLAG_FILENAME

For options of the G_OPTION_ARG_CALLBACK + kind, this flag indicates that the argument should be passed to the + callback in the GLib filename encoding rather than UTF-8. Since 2.8 +

G_OPTION_FLAG_OPTIONAL_ARG

For options of the G_OPTION_ARG_CALLBACK + kind, this flag indicates that the argument supply is optional. If no argument + is given then data of GOptionParseFunc will be set to NULL. Since 2.8 +

G_OPTION_FLAG_NOALIAS

This flag turns off the automatic conflict resolution + which prefixes long option names with groupname- if + there is a conflict. This option should only be used in situations where + aliasing is necessary to model some legacy commandline interface. It is + not safe to use this option, unless all option groups are under your + direct control. Since 2.8. +
+
+
+
+

G_OPTION_REMAINING

+
#define G_OPTION_REMAINING ""
+
+

+If a long option in the main group has this name, it is not treated as a +regular option. Instead it collects all non-option arguments which would +otherwise be left in argv. The option must be of type +G_OPTION_ARG_CALLBACK, G_OPTION_ARG_STRING_ARRAY +or G_OPTION_ARG_FILENAME_ARRAY. +

+

+Using G_OPTION_REMAINING instead of simply scanning argv +for leftover arguments has the advantage that GOption takes care of +necessary encoding conversions for strings or filenames.

+

Since 2.6

+
+
+
+

GOptionEntry

+
typedef struct {
+  const gchar *long_name;
+  gchar        short_name;
+  gint         flags;
+
+  GOptionArg   arg;
+  gpointer     arg_data;
+  
+  const gchar *description;
+  const gchar *arg_description;
+} GOptionEntry;
+
+

+A GOptionEntry defines a single option. +To have an effect, they must be added to a GOptionGroup with +g_option_context_add_main_entries() or g_option_group_add_entries().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

const gchar *long_name;

The long name of an option can be used to specify it + in a commandline as --long_name. Every + option must have a long name. To resolve conflicts if multiple + option groups contain the same long name, it is also possible to + specify the option as + --groupname-long_name. +

gchar short_name;

If an option has a short name, it can be specified + -short_name in a commandline. short_name must be + a printable ASCII character different from '-', or zero if the option has no + short name. +

gint flags;

Flags from GOptionFlags. +

GOptionArg arg;

The type of the option, as a GOptionArg. +

gpointer arg_data;

If the arg type is G_OPTION_ARG_CALLBACK, then arg_data must + point to a GOptionArgFunc callback function, which will be called to handle + the extra argument. Otherwise, arg_data is a pointer to a location to store + the value, the required type of the location depends on the arg type: + + If arg type is G_OPTION_ARG_STRING or G_OPTION_ARG_FILENAME the location + will contain a newly allocated string if the option was given. That string + needs to be freed by the callee using g_free(). Likewise if arg type is + G_OPTION_ARG_STRING_ARRAY or G_OPTION_ARG_FILENAME_ARRAY, the data should + be freed using g_strfreev(). +

const gchar *description;

the description for the option in --help + output. The description is translated using the translate_func of the + group, see g_option_group_set_translation_domain(). +

const gchar *arg_description;

The placeholder to use for the extra argument parsed + by the option in --help + output. The arg_description is translated using the translate_func of the + group, see g_option_group_set_translation_domain(). +
+
+
+
+

g_option_context_add_main_entries ()

+
void                g_option_context_add_main_entries   (GOptionContext *context,
+                                                         const GOptionEntry *entries,
+                                                         const gchar *translation_domain);
+

+A convenience function which creates a main group if it doesn't +exist, adds the entries to it and sets the translation domain.

+
++ + + + + + + + + + + + + + +

context :

a GOptionContext +

entries :

a NULL-terminated array of GOptionEntrys +

translation_domain :

a translation domain to use for translating + the --help output for the options in entries + with gettext(), or NULL +
+

Since 2.6

+
+
+
+

GOptionGroup

+
typedef struct _GOptionGroup GOptionGroup;
+

+A GOptionGroup struct defines the options in a single +group. The struct has only private fields and should not be directly accessed. +

+

+All options in a group share the same translation function. Libraries which +need to parse commandline options are expected to provide a function for +getting a GOptionGroup holding their options, which +the application can then add to its GOptionContext.

+
+
+
+

g_option_context_add_group ()

+
void                g_option_context_add_group          (GOptionContext *context,
+                                                         GOptionGroup *group);
+

+Adds a GOptionGroup to the context, so that parsing with context +will recognize the options in the group. Note that the group will +be freed together with the context when g_option_context_free() is +called, so you must not free the group yourself after adding it +to a context.

+
++ + + + + + + + + + +

context :

a GOptionContext +

group :

the group to add +
+

Since 2.6

+
+
+
+

g_option_context_set_main_group ()

+
void                g_option_context_set_main_group     (GOptionContext *context,
+                                                         GOptionGroup *group);
+

+Sets a GOptionGroup as main group of the context. +This has the same effect as calling g_option_context_add_group(), +the only difference is that the options in the main group are +treated differently when generating --help output.

+
++ + + + + + + + + + +

context :

a GOptionContext +

group :

the group to set as main group +
+

Since 2.6

+
+
+
+

g_option_context_get_main_group ()

+
GOptionGroup *      g_option_context_get_main_group     (GOptionContext *context);
+

+Returns a pointer to the main group of context.

+
++ + + + + + + + + + +

context :

a GOptionContext +

Returns :

the main group of context, or NULL if context doesn't + have a main group. Note that group belongs to context and should + not be modified or freed. + +
+

Since 2.6

+
+
+
+

g_option_group_new ()

+
GOptionGroup *      g_option_group_new                  (const gchar *name,
+                                                         const gchar *description,
+                                                         const gchar *help_description,
+                                                         gpointer user_data,
+                                                         GDestroyNotify destroy);
+

+Creates a new GOptionGroup.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

the name for the option group, this is used to provide + help for the options in this group with --help-name +

description :

a description for this group to be shown in + --help. This string is translated using the translation + domain or translation function of the group +

help_description :

a description for the --help-name option. + This string is translated using the translation domain or translation function + of the group +

user_data :

user data that will be passed to the pre- and post-parse hooks, + the error hook and to callbacks of G_OPTION_ARG_CALLBACK options, or NULL +

destroy :

a function that will be called to free user_data, or NULL +

Returns :

a newly created option group. It should be added + to a GOptionContext or freed with g_option_group_free(). + +
+

Since 2.6

+
+
+
+

g_option_group_free ()

+
void                g_option_group_free                 (GOptionGroup *group);
+

+Frees a GOptionGroup. Note that you must not +free groups which have been added to a GOptionContext.

+
++ + + + +

group :

a GOptionGroup +
+

Since 2.6

+
+
+
+

g_option_group_add_entries ()

+
void                g_option_group_add_entries          (GOptionGroup *group,
+                                                         const GOptionEntry *entries);
+

+Adds the options specified in entries to group.

+
++ + + + + + + + + + +

group :

a GOptionGroup +

entries :

a NULL-terminated array of GOptionEntrys +
+

Since 2.6

+
+
+
+

GOptionParseFunc ()

+
gboolean            (*GOptionParseFunc)                 (GOptionContext *context,
+                                                         GOptionGroup *group,
+                                                         gpointer data,
+                                                         GError **error);
+

+The type of function that can be called before and after parsing.

+
++ + + + + + + + + + + + + + + + + + + + + + +

context :

The active GOptionContext +

group :

The group to which the function belongs +

data :

User data added to the GOptionGroup containing the option when it + was created with g_option_group_new() +

error :

A return location for error details +

Returns :

TRUE if the function completed successfully, FALSE if an error + occurred, in which case error should be set with g_set_error() +
+
+
+
+

g_option_group_set_parse_hooks ()

+
void                g_option_group_set_parse_hooks      (GOptionGroup *group,
+                                                         GOptionParseFunc pre_parse_func,
+                                                         GOptionParseFunc post_parse_func);
+

+Associates two functions with group which will be called +from g_option_context_parse() before the first option is parsed +and after the last option has been parsed, respectively. +

+

+Note that the user data to be passed to pre_parse_func and +post_parse_func can be specified when constructing the group +with g_option_group_new().

+
++ + + + + + + + + + + + + + +

group :

a GOptionGroup +

pre_parse_func :

a function to call before parsing, or NULL +

post_parse_func :

a function to call after parsing, or NULL +
+

Since 2.6

+
+
+
+

GOptionErrorFunc ()

+
void                (*GOptionErrorFunc)                 (GOptionContext *context,
+                                                         GOptionGroup *group,
+                                                         gpointer data,
+                                                         GError **error);
+

+The type of function to be used as callback when a parse error occurs.

+
++ + + + + + + + + + + + + + + + + + +

context :

The active GOptionContext +

group :

The group to which the function belongs +

data :

User data added to the GOptionGroup containing the option when it + was created with g_option_group_new() +

error :

The GError containing details about the parse error +
+
+
+
+

g_option_group_set_error_hook ()

+
void                g_option_group_set_error_hook       (GOptionGroup *group,
+                                                         GOptionErrorFunc error_func);
+

+Associates a function with group which will be called +from g_option_context_parse() when an error occurs. +

+

+Note that the user data to be passed to error_func can be +specified when constructing the group with g_option_group_new().

+
++ + + + + + + + + + +

group :

a GOptionGroup +

error_func :

a function to call when an error occurs +
+

Since 2.6

+
+
+
+

g_option_group_set_translate_func ()

+
void                g_option_group_set_translate_func   (GOptionGroup *group,
+                                                         GTranslateFunc func,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_notify);
+

+Sets the function which is used to translate user-visible +strings, for --help output. Different +groups can use different GTranslateFuncs. If func +is NULL, strings are not translated. +

+

+If you are using gettext(), you only need to set the translation +domain, see g_option_group_set_translation_domain().

+
++ + + + + + + + + + + + + + + + + + +

group :

a GOptionGroup +

func :

the GTranslateFunc, or NULL +

data :

user data to pass to func, or NULL +

destroy_notify :

a function which gets called to free data, or NULL +
+

Since 2.6

+
+
+
+

g_option_group_set_translation_domain ()

+
void                g_option_group_set_translation_domain
+                                                        (GOptionGroup *group,
+                                                         const gchar *domain);
+

+A convenience function to use gettext() for translating +user-visible strings.

+
++ + + + + + + + + + +

group :

a GOptionGroup +

domain :

the domain to use +
+

Since 2.6

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Data-Checksums.html b/docs/reference/glib/html/glib-Data-Checksums.html new file mode 100644 index 0000000..62277f3 --- /dev/null +++ b/docs/reference/glib/html/glib-Data-Checksums.html @@ -0,0 +1,467 @@ + + + + +Data Checksums + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Data Checksums

+

Data Checksums — Computes the checksum for data

+
+
+

Synopsis

+
+#include <glib.h>
+
+enum                GChecksumType;
+gssize              g_checksum_type_get_length          (GChecksumType checksum_type);
+                    GChecksum;
+GChecksum *         g_checksum_new                      (GChecksumType checksum_type);
+GChecksum *         g_checksum_copy                     (const GChecksum *checksum);
+void                g_checksum_free                     (GChecksum *checksum);
+void                g_checksum_reset                    (GChecksum *checksum);
+void                g_checksum_update                   (GChecksum *checksum,
+                                                         const guchar *data,
+                                                         gssize length);
+const gchar *       g_checksum_get_string               (GChecksum *checksum);
+void                g_checksum_get_digest               (GChecksum *checksum,
+                                                         guint8 *buffer,
+                                                         gsize *digest_len);
+
+gchar *             g_compute_checksum_for_data         (GChecksumType checksum_type,
+                                                         const guchar *data,
+                                                         gsize length);
+gchar *             g_compute_checksum_for_string       (GChecksumType checksum_type,
+                                                         const gchar *str,
+                                                         gssize length);
+
+
+
+

Description

+

+GLib provides a generic API for computing checksums (or "digests") +for a sequence of arbitrary bytes, using various hashing algorithms +like MD5, SHA-1 and SHA-256. Checksums are commonly used in various +environments and specifications. +

+

+GLib supports incremental checksums using the GChecksum data +structure, by calling g_checksum_update() as long as there's data +available and then using g_checksum_get_string() or +g_checksum_get_digest() to compute the checksum and return it either +as a string in hexadecimal form, or as a raw sequence of bytes. To +compute the checksum for binary blobs and NUL-terminated strings in +one go, use the convenience functions g_compute_checksum_for_data() +and g_compute_checksum_for_string(), respectively. +

+

+Support for checksums has been added in GLib 2.16

+
+
+

Details

+
+

enum GChecksumType

+
typedef enum {
+  G_CHECKSUM_MD5,
+  G_CHECKSUM_SHA1,
+  G_CHECKSUM_SHA256
+} GChecksumType;
+
+

+The hashing algorithm to be used by GChecksum when performing the +digest of some data. +

+

+Note that the GChecksumType enumeration may be extended at a later +date to include new hashing algorithm types.

+
++ + + + + + + + + + + + + + +

G_CHECKSUM_MD5

Use the MD5 hashing algorithm +

G_CHECKSUM_SHA1

Use the SHA-1 hashing algorithm +

G_CHECKSUM_SHA256

Use the SHA-256 hashing algorithm +
+

Since 2.16

+
+
+
+

g_checksum_type_get_length ()

+
gssize              g_checksum_type_get_length          (GChecksumType checksum_type);
+

+Gets the length in bytes of digests of type checksum_type

+
++ + + + + + + + + + +

checksum_type :

a GChecksumType +

Returns :

the checksum length, or -1 if checksum_type is +not supported. + +
+

Since 2.16

+
+
+
+

GChecksum

+
typedef struct _GChecksum GChecksum;
+

+An opaque structure representing a checksumming operation. +To create a new GChecksum, use g_checksum_new(). To free +a GChecksum, use g_checksum_free().

+

Since 2.16

+
+
+
+

g_checksum_new ()

+
GChecksum *         g_checksum_new                      (GChecksumType checksum_type);
+

+Creates a new GChecksum, using the checksum algorithm checksum_type. +If the checksum_type is not known, NULL is returned. +A GChecksum can be used to compute the checksum, or digest, of an +arbitrary binary blob, using different hashing algorithms. +

+

+A GChecksum works by feeding a binary blob through g_checksum_update() +until there is data to be checked; the digest can then be extracted +using g_checksum_get_string(), which will return the checksum as a +hexadecimal string; or g_checksum_get_digest(), which will return a +vector of raw bytes. Once either g_checksum_get_string() or +g_checksum_get_digest() have been called on a GChecksum, the checksum +will be closed and it won't be possible to call g_checksum_update() +on it anymore.

+
++ + + + + + + + + + +

checksum_type :

the desired type of checksum +

Returns :

the newly created GChecksum, or NULL. + Use g_checksum_free() to free the memory allocated by it. + +
+

Since 2.16

+
+
+
+

g_checksum_copy ()

+
GChecksum *         g_checksum_copy                     (const GChecksum *checksum);
+

+Copies a GChecksum. If checksum has been closed, by calling +g_checksum_get_string() or g_checksum_get_digest(), the copied +checksum will be closed as well.

+
++ + + + + + + + + + +

checksum :

the GChecksum to copy +

Returns :

the copy of the passed GChecksum. Use g_checksum_free() + when finished using it. + +
+

Since 2.16

+
+
+
+

g_checksum_free ()

+
void                g_checksum_free                     (GChecksum *checksum);
+

+Frees the memory allocated for checksum.

+
++ + + + +

checksum :

a GChecksum +
+

Since 2.16

+
+
+
+

g_checksum_reset ()

+
void                g_checksum_reset                    (GChecksum *checksum);
+

+Resets the state of the checksum back to its initial state.

+
++ + + + +

checksum :

the GChecksum to reset +
+

Since 2.18

+
+
+
+

g_checksum_update ()

+
void                g_checksum_update                   (GChecksum *checksum,
+                                                         const guchar *data,
+                                                         gssize length);
+

+Feeds data into an existing GChecksum. The checksum must still be +open, that is g_checksum_get_string() or g_checksum_get_digest() must +not have been called on checksum.

+
++ + + + + + + + + + + + + + +

checksum :

a GChecksum +

data :

buffer used to compute the checksum +

length :

size of the buffer, or -1 if it is a null-terminated string. +
+

Since 2.16

+
+
+
+

g_checksum_get_string ()

+
const gchar *       g_checksum_get_string               (GChecksum *checksum);
+

+Gets the digest as an hexadecimal string. +

+

+Once this function has been called the GChecksum can no longer be +updated with g_checksum_update(). +

+

+The hexadecimal characters will be lower case.

+
++ + + + + + + + + + +

checksum :

a GChecksum +

Returns :

the hexadecimal representation of the checksum. The + returned string is owned by the checksum and should not be modified + or freed. + +
+

Since 2.16

+
+
+
+

g_checksum_get_digest ()

+
void                g_checksum_get_digest               (GChecksum *checksum,
+                                                         guint8 *buffer,
+                                                         gsize *digest_len);
+

+Gets the digest from checksum as a raw binary vector and places it +into buffer. The size of the digest depends on the type of checksum. +

+

+Once this function has been called, the GChecksum is closed and can +no longer be updated with g_checksum_update().

+
++ + + + + + + + + + + + + + +

checksum :

a GChecksum +

buffer :

output buffer +

digest_len :

an inout parameter. The caller initializes it to the size of buffer. + After the call it contains the length of the digest. +
+

Since 2.16

+
+
+
+

g_compute_checksum_for_data ()

+
gchar *             g_compute_checksum_for_data         (GChecksumType checksum_type,
+                                                         const guchar *data,
+                                                         gsize length);
+

+Computes the checksum for a binary data of length. This is a +convenience wrapper for g_checksum_new(), g_checksum_get_string() +and g_checksum_free(). +

+

+The hexadecimal string returned will be in lower case.

+
++ + + + + + + + + + + + + + + + + + +

checksum_type :

a GChecksumType +

data :

binary blob to compute the digest of +

length :

length of data +

Returns :

the digest of the binary data as a string in hexadecimal. + The returned string should be freed with g_free() when done using it. + +
+

Since 2.16

+
+
+
+

g_compute_checksum_for_string ()

+
gchar *             g_compute_checksum_for_string       (GChecksumType checksum_type,
+                                                         const gchar *str,
+                                                         gssize length);
+

+Computes the checksum of a string. +

+

+The hexadecimal string returned will be in lower case.

+
++ + + + + + + + + + + + + + + + + + +

checksum_type :

a GChecksumType +

str :

the string to compute the checksum of +

length :

the length of the string, or -1 if the string is null-terminated. +

Returns :

the checksum as a hexadecimal string. The returned string + should be freed with g_free() when done using it. + +
+

Since 2.16

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Datasets.html b/docs/reference/glib/html/glib-Datasets.html new file mode 100644 index 0000000..f5c7a44 --- /dev/null +++ b/docs/reference/glib/html/glib-Datasets.html @@ -0,0 +1,522 @@ + + + + +Datasets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Datasets

+

Datasets — associate groups of data elements with + particular memory locations

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             g_dataset_id_set_data               (l, k, d)
+void                g_dataset_id_set_data_full          (gconstpointer dataset_location,
+                                                         GQuark key_id,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_func);
+void                (*GDestroyNotify)                   (gpointer data);
+gpointer            g_dataset_id_get_data               (gconstpointer dataset_location,
+                                                         GQuark key_id);
+#define             g_dataset_id_remove_data            (l, k)
+gpointer            g_dataset_id_remove_no_notify       (gconstpointer dataset_location,
+                                                         GQuark key_id);
+
+#define             g_dataset_set_data                  (l, k, d)
+#define             g_dataset_set_data_full             (l, k, d, f)
+#define             g_dataset_get_data                  (l, k)
+#define             g_dataset_remove_data               (l, k)
+#define             g_dataset_remove_no_notify          (l, k)
+
+void                g_dataset_foreach                   (gconstpointer dataset_location,
+                                                         GDataForeachFunc func,
+                                                         gpointer user_data);
+void                (*GDataForeachFunc)                 (GQuark key_id,
+                                                         gpointer data,
+                                                         gpointer user_data);
+void                g_dataset_destroy                   (gconstpointer dataset_location);
+
+
+
+

Description

+

+Datasets associate groups of data elements with particular memory +locations. These are useful if you need to associate data with a +structure returned from an external library. Since you cannot modify +the structure, you use its location in memory as the key into a +dataset, where you can associate any number of data elements with it. +

+

+There are two forms of most of the dataset functions. The first form +uses strings to identify the data elements associated with a +location. The second form uses GQuark identifiers, which are +created with a call to g_quark_from_string() or +g_quark_from_static_string(). The second form is quicker, since it +does not require looking up the string in the hash table of GQuark +identifiers. +

+

+There is no function to create a dataset. It is automatically +created as soon as you add elements to it. +

+

+To add data elements to a dataset use g_dataset_id_set_data(), +g_dataset_id_set_data_full(), g_dataset_set_data() and +g_dataset_set_data_full(). +

+

+To get data elements from a dataset use g_dataset_id_get_data() and +g_dataset_get_data(). +

+

+To iterate over all data elements in a dataset use +g_dataset_foreach() (not thread-safe). +

+

+To remove data elements from a dataset use +g_dataset_id_remove_data() and g_dataset_remove_data(). +

+

+To destroy a dataset, use g_dataset_destroy().

+
+
+

Details

+
+

g_dataset_id_set_data()

+
#define             g_dataset_id_set_data(l, k, d)
+

+Sets the data element associated with the given GQuark id. Any +previous data with the same key is removed, and its destroy function +is called.

+
++ + + + + + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the GQuark id to identify the data element. +

d :

the data element. +
+
+
+
+

g_dataset_id_set_data_full ()

+
void                g_dataset_id_set_data_full          (gconstpointer dataset_location,
+                                                         GQuark key_id,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_func);
+

+Sets the data element associated with the given GQuark id, and also +the function to call when the data element is destroyed. Any +previous data with the same key is removed, and its destroy function +is called.

+
++ + + + + + + + + + + + + + + + + + +

dataset_location :

the location identifying the dataset. +

key_id :

the GQuark id to identify the data element. +

data :

the data element. +

destroy_func :

the function to call when the data element is + removed. This function will be called with the data + element and can be used to free any memory allocated + for it. +
+
+
+
+

GDestroyNotify ()

+
void                (*GDestroyNotify)                   (gpointer data);
+

+Specifies the type of function which is called when a data element +is destroyed. It is passed the pointer to the data element and +should free any memory and resources allocated for it.

+
++ + + + +

data :

the data element. +
+
+
+
+

g_dataset_id_get_data ()

+
gpointer            g_dataset_id_get_data               (gconstpointer dataset_location,
+                                                         GQuark key_id);
+

+Gets the data element corresponding to a GQuark.

+
++ + + + + + + + + + + + + + +

dataset_location :

the location identifying the dataset. +

key_id :

the GQuark id to identify the data element. +

Returns :

the data element corresponding to the GQuark, or NULL if + it is not found. +
+
+
+
+

g_dataset_id_remove_data()

+
#define             g_dataset_id_remove_data(l, k)
+

+Removes a data element from a dataset. The data element's destroy +function is called if it has been set.

+
++ + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the GQuark id identifying the data element. +
+
+
+
+

g_dataset_id_remove_no_notify ()

+
gpointer            g_dataset_id_remove_no_notify       (gconstpointer dataset_location,
+                                                         GQuark key_id);
+

+Removes an element, without calling its destroy notification +function.

+
++ + + + + + + + + + + + + + +

dataset_location :

the location identifying the dataset. +

key_id :

the GQuark ID identifying the data element. +

Returns :

the data previously stored at key_id, or NULL if none. +
+
+
+
+

g_dataset_set_data()

+
#define             g_dataset_set_data(l, k, d)
+

+Sets the data corresponding to the given string identifier.

+
++ + + + + + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the string to identify the data element. +

d :

the data element. +
+
+
+
+

g_dataset_set_data_full()

+
#define             g_dataset_set_data_full(l, k, d, f)
+

+Sets the data corresponding to the given string identifier, and the +function to call when the data element is destroyed.

+
++ + + + + + + + + + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the string to identify the data element. +

d :

the data element. +

f :

the function to call when the data element is removed. This + function will be called with the data element and can be used to + free any memory allocated for it. +
+
+
+
+

g_dataset_get_data()

+
#define             g_dataset_get_data(l, k)
+

+Gets the data element corresponding to a string.

+
++ + + + + + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the string identifying the data element. +

Returns :

the data element corresponding to the string, or NULL if + it is not found. +
+
+
+
+

g_dataset_remove_data()

+
#define             g_dataset_remove_data(l, k)
+

+Removes a data element corresponding to a string. Its destroy +function is called if it has been set.

+
++ + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the string identifying the data element. +
+
+
+
+

g_dataset_remove_no_notify()

+
#define             g_dataset_remove_no_notify(l, k)
+

+Removes an element, without calling its destroy notifier.

+
++ + + + + + + + + + +

l :

the location identifying the dataset. +

k :

the string identifying the data element. +
+
+
+
+

g_dataset_foreach ()

+
void                g_dataset_foreach                   (gconstpointer dataset_location,
+                                                         GDataForeachFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each data element which is associated +with the given location. Note that this function is NOT thread-safe. +So unless datalist can be protected from any modifications during +invocation of this function, it should not be called.

+
++ + + + + + + + + + + + + + +

dataset_location :

the location identifying the dataset. +

func :

the function to call for each data element. +

user_data :

user data to pass to the function. +
+
+
+
+

GDataForeachFunc ()

+
void                (*GDataForeachFunc)                 (GQuark key_id,
+                                                         gpointer data,
+                                                         gpointer user_data);
+

+Specifies the type of function passed to g_dataset_foreach(). It is +called with each GQuark id and associated data element, together +with the user_data parameter supplied to g_dataset_foreach().

+
++ + + + + + + + + + + + + + +

key_id :

the GQuark id to identifying the data element. +

data :

the data element. +

user_data :

user data passed to g_dataset_foreach(). +
+
+
+
+

g_dataset_destroy ()

+
void                g_dataset_destroy                   (gconstpointer dataset_location);
+

+Destroys the dataset, freeing all memory allocated, and calling any +destroy functions set for data elements.

+
++ + + + +

dataset_location :

the location identifying the dataset. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Date-and-Time-Functions.html b/docs/reference/glib/html/glib-Date-and-Time-Functions.html new file mode 100644 index 0000000..177b7c5 --- /dev/null +++ b/docs/reference/glib/html/glib-Date-and-Time-Functions.html @@ -0,0 +1,2030 @@ + + + + +Date and Time Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Date and Time Functions

+

Date and Time Functions — calendrical calculations and miscellaneous time stuff

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_USEC_PER_SEC
+                    GTimeVal;
+void                g_get_current_time                  (GTimeVal *result);
+void                g_usleep                            (gulong microseconds);
+void                g_time_val_add                      (GTimeVal *time_,
+                                                         glong microseconds);
+gboolean            g_time_val_from_iso8601             (const gchar *iso_date,
+                                                         GTimeVal *time_);
+gchar*              g_time_val_to_iso8601               (GTimeVal *time_);
+
+                    GDate;
+typedef             GTime;
+enum                GDateDMY;
+typedef             GDateDay;
+enum                GDateMonth;
+typedef             GDateYear;
+enum                GDateWeekday;
+
+#define             G_DATE_BAD_DAY
+#define             G_DATE_BAD_JULIAN
+#define             G_DATE_BAD_YEAR
+
+GDate*              g_date_new                          (void);
+GDate*              g_date_new_dmy                      (GDateDay day,
+                                                         GDateMonth month,
+                                                         GDateYear year);
+GDate*              g_date_new_julian                   (guint32 julian_day);
+void                g_date_clear                        (GDate *date,
+                                                         guint n_dates);
+void                g_date_free                         (GDate *date);
+
+void                g_date_set_day                      (GDate *date,
+                                                         GDateDay day);
+void                g_date_set_month                    (GDate *date,
+                                                         GDateMonth month);
+void                g_date_set_year                     (GDate *date,
+                                                         GDateYear year);
+void                g_date_set_dmy                      (GDate *date,
+                                                         GDateDay day,
+                                                         GDateMonth month,
+                                                         GDateYear y);
+void                g_date_set_julian                   (GDate *date,
+                                                         guint32 julian_date);
+void                g_date_set_time                     (GDate *date,
+                                                         GTime time_);
+void                g_date_set_time_t                   (GDate *date,
+                                                         time_t timet);
+void                g_date_set_time_val                 (GDate *date,
+                                                         GTimeVal *timeval);
+void                g_date_set_parse                    (GDate *date,
+                                                         const gchar *str);
+
+void                g_date_add_days                     (GDate *date,
+                                                         guint n_days);
+void                g_date_subtract_days                (GDate *date,
+                                                         guint n_days);
+void                g_date_add_months                   (GDate *date,
+                                                         guint n_months);
+void                g_date_subtract_months              (GDate *date,
+                                                         guint n_months);
+void                g_date_add_years                    (GDate *date,
+                                                         guint n_years);
+void                g_date_subtract_years               (GDate *date,
+                                                         guint n_years);
+gint                g_date_days_between                 (const GDate *date1,
+                                                         const GDate *date2);
+gint                g_date_compare                      (const GDate *lhs,
+                                                         const GDate *rhs);
+void                g_date_clamp                        (GDate *date,
+                                                         const GDate *min_date,
+                                                         const GDate *max_date);
+void                g_date_order                        (GDate *date1,
+                                                         GDate *date2);
+
+GDateDay            g_date_get_day                      (const GDate *date);
+GDateMonth          g_date_get_month                    (const GDate *date);
+GDateYear           g_date_get_year                     (const GDate *date);
+guint32             g_date_get_julian                   (const GDate *date);
+GDateWeekday        g_date_get_weekday                  (const GDate *date);
+guint               g_date_get_day_of_year              (const GDate *date);
+
+guint8              g_date_get_days_in_month            (GDateMonth month,
+                                                         GDateYear year);
+gboolean            g_date_is_first_of_month            (const GDate *date);
+gboolean            g_date_is_last_of_month             (const GDate *date);
+gboolean            g_date_is_leap_year                 (GDateYear year);
+guint               g_date_get_monday_week_of_year      (const GDate *date);
+guint8              g_date_get_monday_weeks_in_year     (GDateYear year);
+guint               g_date_get_sunday_week_of_year      (const GDate *date);
+guint8              g_date_get_sunday_weeks_in_year     (GDateYear year);
+guint               g_date_get_iso8601_week_of_year     (const GDate *date);
+
+gsize               g_date_strftime                     (gchar *s,
+                                                         gsize slen,
+                                                         const gchar *format,
+                                                         const GDate *date);
+void                g_date_to_struct_tm                 (const GDate *date,
+                                                         struct tm *tm);
+
+gboolean            g_date_valid                        (const GDate *date);
+gboolean            g_date_valid_day                    (GDateDay day);
+gboolean            g_date_valid_month                  (GDateMonth month);
+gboolean            g_date_valid_year                   (GDateYear year);
+gboolean            g_date_valid_dmy                    (GDateDay day,
+                                                         GDateMonth month,
+                                                         GDateYear year);
+gboolean            g_date_valid_julian                 (guint32 julian_date);
+gboolean            g_date_valid_weekday                (GDateWeekday weekday);
+
+
+
+

Description

+

+The GDate data structure represents a day between January 1, Year 1, +and sometime a few thousand years in the future (right now it will go +to the year 65535 or so, but g_date_set_parse() only parses up to the +year 8000 or so - just count on "a few thousand"). GDate is meant to +represent everyday dates, not astronomical dates or historical dates +or ISO timestamps or the like. It extrapolates the current Gregorian +calendar forward and backward in time; there is no attempt to change +the calendar to match time periods or locations. GDate does not store +time information; it represents a day. +

+

+The GDate implementation has several nice features; it is only a +64-bit struct, so storing large numbers of dates is very efficient. It +can keep both a Julian and day-month-year representation of the date, +since some calculations are much easier with one representation or the +other. A Julian representation is simply a count of days since some +fixed day in the past; for GDate the fixed day is January 1, 1 AD. +("Julian" dates in the GDate API aren't really Julian dates in the +technical sense; technically, Julian dates count from the start of the +Julian period, Jan 1, 4713 BC). +

+

+GDate is simple to use. First you need a "blank" date; you can get a +dynamically allocated date from g_date_new(), or you can declare an +automatic variable or array and initialize it to a sane state by +calling g_date_clear(). A cleared date is sane; it's safe to call +g_date_set_dmy() and the other mutator functions to initialize the +value of a cleared date. However, a cleared date is initially +invalid, meaning that it doesn't represent a day +that exists. It is undefined to call any of the date calculation +routines on an invalid date. If you obtain a date from a user or other +unpredictable source, you should check its validity with the +g_date_valid() predicate. g_date_valid() is also used to check for +errors with g_date_set_parse() and other functions that can +fail. Dates can be invalidated by calling g_date_clear() again. +

+

+It is very important to use the API to access the GDate +struct. Often only the day-month-year or only the Julian +representation is valid. Sometimes neither is valid. Use the API. +

+

+GLib doesn't contain any time-manipulation functions; however, there +is a GTime typedef and a GTimeVal struct which represents a more +precise time (with microseconds). You can request the current time as +a GTimeVal with g_get_current_time(). +

+
+
+

Details

+
+

G_USEC_PER_SEC

+
#define G_USEC_PER_SEC 1000000
+
+

+Number of microseconds in one second (1 million). This macro is provided for +code readability. +

+
+
+
+

GTimeVal

+
typedef struct {
+  glong tv_sec;
+  glong tv_usec;
+} GTimeVal;
+
+

+Represents a precise time, with seconds and microseconds. +Similar to the struct timeval returned by +the gettimeofday() UNIX call. +

+
++ + + + + + + + + + +

glong tv_sec;

seconds +

glong tv_usec;

microseconds +
+
+
+
+

g_get_current_time ()

+
void                g_get_current_time                  (GTimeVal *result);
+

+Equivalent to the UNIX gettimeofday() function, but portable.

+
++ + + + +

result :

GTimeVal structure in which to store current time. +
+
+
+
+

g_usleep ()

+
void                g_usleep                            (gulong microseconds);
+

+Pauses the current thread for the given number of microseconds. There +are 1 million microseconds per second (represented by the +G_USEC_PER_SEC macro). g_usleep() may have limited precision, +depending on hardware and operating system; don't rely on the exact +length of the sleep. +

+
++ + + + +

microseconds :

number of microseconds to pause +
+
+
+
+

g_time_val_add ()

+
void                g_time_val_add                      (GTimeVal *time_,
+                                                         glong microseconds);
+

+Adds the given number of microseconds to time_. microseconds can +also be negative to decrease the value of time_.

+
++ + + + + + + + + + +

time_ :

a GTimeVal +

microseconds :

number of microseconds to add to time +
+
+
+
+

g_time_val_from_iso8601 ()

+
gboolean            g_time_val_from_iso8601             (const gchar *iso_date,
+                                                         GTimeVal *time_);
+

+Converts a string containing an ISO 8601 encoded date and time +to a GTimeVal and puts it into time_.

+
++ + + + + + + + + + + + + + +

iso_date :

an ISO 8601 encoded date string +

time_ :

a GTimeVal +

Returns :

TRUE if the conversion was successful. + +
+

Since 2.12

+
+
+
+

g_time_val_to_iso8601 ()

+
gchar*              g_time_val_to_iso8601               (GTimeVal *time_);
+

+Converts time_ into an ISO 8601 encoded string, relative to the +Coordinated Universal Time (UTC).

+
++ + + + + + + + + + +

time_ :

a GTimeVal +

Returns :

a newly allocated string containing an ISO 8601 date + +
+

Since 2.12

+
+
+
+

GDate

+
typedef struct {
+  guint julian_days : 32; /* julian days representation - we use a
+                           *  bitfield hoping that 64 bit platforms
+                           *  will pack this whole struct in one big
+                           *  int
+                           */
+
+  guint julian : 1;    /* julian is valid */
+  guint dmy    : 1;    /* dmy is valid */
+
+  /* DMY representation */
+  guint day    : 6;
+  guint month  : 4;
+  guint year   : 16;
+} GDate;
+
+

+Represents a day between January 1, Year 1 and a few thousand years in +the future. None of its members should be accessed directly. If the +GDate is obtained from g_date_new(), it will +be safe to mutate but invalid and thus not safe for calendrical computations. +If it's declared on the stack, it will contain garbage so must be +initialized with g_date_clear(). g_date_clear() makes the date invalid +but sane. An invalid date doesn't represent a day, it's "empty." A +date becomes valid after you set it to a Julian day or you set a day, +month, and year. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

guint julian_days : 32;

the Julian representation of the date +

guint julian : 1;

this bit is set if julian_days is valid +

guint dmy : 1;

this is set if day, month and year are valid +

guint day : 6;

the day of the day-month-year representation of the date, as + a number between 1 and 31 +

guint month : 4;

the day of the day-month-year representation of the date, as + a number between 1 and 12 +

guint year : 16;

the day of the day-month-year representation of the date +
+
+
+
+

GTime

+
typedef gint32  GTime;
+
+

+Simply a replacement for time_t. It has been deprected +since it is not equivalent to time_t +on 64-bit platforms with a 64-bit time_t. +Unrelated to GTimer. +

+

+Note that GTime is defined to always be a 32bit integer, +unlike time_t which may be 64bit on some systems. +Therefore, GTime will overflow in the year 2038, and +you cannot use the address of a GTime variable as argument +to the UNIX time() function. Instead, do the following: +

+
+time_t ttime;
+GTime gtime;
+time (&ttime);
+gtime = (GTime)ttime;
+
+

+

+
+
+
+

enum GDateDMY

+
typedef enum
+{
+  G_DATE_DAY   = 0,
+  G_DATE_MONTH = 1,
+  G_DATE_YEAR  = 2
+} GDateDMY;
+
+

+This enumeration isn't used in the API, but may be useful if you need +to mark a number as a day, month, or year. +

+
++ + + + + + + + + + + + + + +

G_DATE_DAY

a day +

G_DATE_MONTH

a month +

G_DATE_YEAR

a year +
+
+
+
+

GDateDay

+
typedef guint8  GDateDay;   /* day of the month */
+
+

+Integer representing a day of the month; between 1 and +31. G_DATE_BAD_DAY represents an invalid day of the month. +

+
+
+
+

enum GDateMonth

+
typedef enum
+{
+  G_DATE_BAD_MONTH = 0,
+  G_DATE_JANUARY   = 1,
+  G_DATE_FEBRUARY  = 2,
+  G_DATE_MARCH     = 3,
+  G_DATE_APRIL     = 4,
+  G_DATE_MAY       = 5,
+  G_DATE_JUNE      = 6,
+  G_DATE_JULY      = 7,
+  G_DATE_AUGUST    = 8,
+  G_DATE_SEPTEMBER = 9,
+  G_DATE_OCTOBER   = 10,
+  G_DATE_NOVEMBER  = 11,
+  G_DATE_DECEMBER  = 12
+} GDateMonth;
+
+

+Enumeration representing a month; values are G_DATE_JANUARY, +G_DATE_FEBRUARY, etc. G_DATE_BAD_MONTH is the invalid value. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_DATE_BAD_MONTH

invalid value +

G_DATE_JANUARY

January +

G_DATE_FEBRUARY

February +

G_DATE_MARCH

March +

G_DATE_APRIL

April +

G_DATE_MAY

May +

G_DATE_JUNE

June +

G_DATE_JULY

July +

G_DATE_AUGUST

August +

G_DATE_SEPTEMBER

September +

G_DATE_OCTOBER

October +

G_DATE_NOVEMBER

November +

G_DATE_DECEMBER

December +
+
+
+
+

GDateYear

+
typedef guint16 GDateYear;
+
+

+Integer representing a year; G_DATE_BAD_YEAR is the invalid +value. The year must be 1 or higher; negative (BC) years are not +allowed. The year is represented with four digits. +

+
+
+
+

enum GDateWeekday

+
typedef enum
+{
+  G_DATE_BAD_WEEKDAY  = 0,
+  G_DATE_MONDAY       = 1,
+  G_DATE_TUESDAY      = 2,
+  G_DATE_WEDNESDAY    = 3,
+  G_DATE_THURSDAY     = 4,
+  G_DATE_FRIDAY       = 5,
+  G_DATE_SATURDAY     = 6,
+  G_DATE_SUNDAY       = 7
+} GDateWeekday;
+
+

+Enumeration representing a day of the week; G_DATE_MONDAY, +G_DATE_TUESDAY, etc. G_DATE_BAD_WEEKDAY is an invalid weekday. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_DATE_BAD_WEEKDAY

invalid value +

G_DATE_MONDAY

Monday +

G_DATE_TUESDAY

Tuesday +

G_DATE_WEDNESDAY

Wednesday +

G_DATE_THURSDAY

Thursday +

G_DATE_FRIDAY

Friday +

G_DATE_SATURDAY

Saturday +

G_DATE_SUNDAY

Sunday +
+
+
+
+

G_DATE_BAD_DAY

+
#define G_DATE_BAD_DAY    0U
+
+

+Represents an invalid GDateDay. +

+
+
+
+

G_DATE_BAD_JULIAN

+
#define G_DATE_BAD_JULIAN 0U
+
+

+Represents an invalid Julian day number. +

+
+
+
+

G_DATE_BAD_YEAR

+
#define G_DATE_BAD_YEAR   0U
+
+

+Represents an invalid year. +

+
+
+
+

g_date_new ()

+
GDate*              g_date_new                          (void);
+

+Allocates a GDate and initializes it to a sane state. The new date will +be cleared (as if you'd called g_date_clear()) but invalid (it won't +represent an existing day). Free the return value with g_date_free(). +

+
++ + + + +

Returns :

a newly-allocated GDate +
+
+
+
+

g_date_new_dmy ()

+
GDate*              g_date_new_dmy                      (GDateDay day,
+                                                         GDateMonth month,
+                                                         GDateYear year);
+

+Like g_date_new(), but also sets the value of the date. Assuming the +day-month-year triplet you pass in represents an existing day, the +returned date will be valid. +

+
++ + + + + + + + + + + + + + + + + + +

day :

day of the month +

month :

month of the year +

year :

year +

Returns :

a newly-allocated GDate initialized with day, month, and year +
+
+
+
+

g_date_new_julian ()

+
GDate*              g_date_new_julian                   (guint32 julian_day);
+

+Like g_date_new(), but also sets the value of the date. Assuming the +Julian day number you pass in is valid (greater than 0, less than an +unreasonably large number), the returned date will be valid. +

+
++ + + + + + + + + + +

julian_day :

days since January 1, Year 1 +

Returns :

a newly-allocated GDate initialized with julian_day +
+
+
+
+

g_date_clear ()

+
void                g_date_clear                        (GDate *date,
+                                                         guint n_dates);
+

+Initializes one or more GDate structs to a sane but invalid +state. The cleared dates will not represent an existing date, but will +not contain garbage. Useful to init a date declared on the stack. +Validity can be tested with g_date_valid(). +

+
++ + + + + + + + + + +

date :

pointer to one or more dates to clear +

n_dates :

number of dates to clear +
+
+
+
+

g_date_free ()

+
void                g_date_free                         (GDate *date);
+

+Frees a GDate returned from g_date_new(). +

+
++ + + + +

date :

a GDate +
+
+
+
+

g_date_set_day ()

+
void                g_date_set_day                      (GDate *date,
+                                                         GDateDay day);
+

+Sets the day of the month for a GDate. If the resulting day-month-year +triplet is invalid, the date will be invalid. +

+
++ + + + + + + + + + +

date :

a GDate +

day :

day to set +
+
+
+
+

g_date_set_month ()

+
void                g_date_set_month                    (GDate *date,
+                                                         GDateMonth month);
+

+Sets the month of the year for a GDate. If the resulting +day-month-year triplet is invalid, the date will be invalid. +

+
++ + + + + + + + + + +

date :

a GDate +

month :

month to set +
+
+
+
+

g_date_set_year ()

+
void                g_date_set_year                     (GDate *date,
+                                                         GDateYear year);
+

+Sets the year for a GDate. If the resulting day-month-year triplet is +invalid, the date will be invalid. +

+
++ + + + + + + + + + +

date :

a GDate +

year :

year to set +
+
+
+
+

g_date_set_dmy ()

+
void                g_date_set_dmy                      (GDate *date,
+                                                         GDateDay day,
+                                                         GDateMonth month,
+                                                         GDateYear y);
+

+Sets the value of a GDate from a day, month, and year. The day-month-year +triplet must be valid; if you aren't sure it is, call g_date_valid_dmy() to +check before you set it. +

+
++ + + + + + + + + + + + + + + + + + +

date :

a GDate +

day :

day +

month :

month +

y :

year +
+
+
+
+

g_date_set_julian ()

+
void                g_date_set_julian                   (GDate *date,
+                                                         guint32 julian_date);
+

+Sets the value of a GDate from a Julian day number. +

+
++ + + + + + + + + + +

date :

a GDate +

julian_date :

Julian day number (days since January 1, Year 1) +
+
+
+
+

g_date_set_time ()

+
void                g_date_set_time                     (GDate *date,
+                                                         GTime time_);
+
+

Warning

+

g_date_set_time has been deprecated since version 2.10 and should not be used in newly-written code. Use g_date_set_time_t() instead.

+
+

+Sets the value of a date from a GTime value. +The time to date conversion is done using the user's current timezone.

+
++ + + + + + + + + + +

date :

a GDate. +

time_ :

GTime value to set. +
+
+
+
+

g_date_set_time_t ()

+
void                g_date_set_time_t                   (GDate *date,
+                                                         time_t timet);
+

+Sets the value of a date to the date corresponding to a time +specified as a time_t. The time to date conversion is done using +the user's current timezone. +

+

+To set the value of a date to the current day, you could write: +

+
+ g_date_set_time_t (date, time (NULL)); 
+
+
++ + + + + + + + + + +

date :

a GDate +

timet :

time_t value to set +
+

Since 2.10

+
+
+
+

g_date_set_time_val ()

+
void                g_date_set_time_val                 (GDate *date,
+                                                         GTimeVal *timeval);
+

+Sets the value of a date from a GTimeVal value. Note that the +tv_usec member is ignored, because GDate can't make use of the +additional precision.

+
++ + + + + + + + + + +

date :

a GDate +

timeval :

GTimeVal value to set +
+

Since 2.10

+
+
+
+

g_date_set_parse ()

+
void                g_date_set_parse                    (GDate *date,
+                                                         const gchar *str);
+

+Parses a user-inputted string str, and try to figure out what date it +represents, taking the current locale +into account. If the string is successfully parsed, the date will be +valid after the call. Otherwise, it will be invalid. You should check +using g_date_valid() to see whether the parsing succeeded. +

+

+This function is not appropriate for file formats and the like; it +isn't very precise, and its exact behavior varies with the +locale. It's intended to be a heuristic routine that guesses what the +user means by a given string (and it does work pretty well in that +capacity). +

+
++ + + + + + + + + + +

date :

a GDate to fill in +

str :

string to parse +
+
+
+
+

g_date_add_days ()

+
void                g_date_add_days                     (GDate *date,
+                                                         guint n_days);
+

+Increments a date some number of days. To move forward by weeks, add +weeks*7 days. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to increment +

n_days :

number of days to move the date forward +
+
+
+
+

g_date_subtract_days ()

+
void                g_date_subtract_days                (GDate *date,
+                                                         guint n_days);
+

+Moves a date some number of days into the past. To move by weeks, just +move by weeks*7 days. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to decrement +

n_days :

number of days to move +
+
+
+
+

g_date_add_months ()

+
void                g_date_add_months                   (GDate *date,
+                                                         guint n_months);
+

+Increments a date by some number of months. If the day of the month is +greater than 28, this routine may change the day of the month (because +the destination month may not have the current day in it). The date +must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to increment +

n_months :

number of months to move forward +
+
+
+
+

g_date_subtract_months ()

+
void                g_date_subtract_months              (GDate *date,
+                                                         guint n_months);
+

+Moves a date some number of months into the past. If the current day of +the month doesn't exist in the destination month, the day of the month +may change. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to decrement +

n_months :

number of months to move +
+
+
+
+

g_date_add_years ()

+
void                g_date_add_years                    (GDate *date,
+                                                         guint n_years);
+

+Increments a date by some number of years. If the date is February 29, +and the destination year is not a leap year, the date will be changed +to February 28. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to increment +

n_years :

number of years to move forward +
+
+
+
+

g_date_subtract_years ()

+
void                g_date_subtract_years               (GDate *date,
+                                                         guint n_years);
+

+Moves a date some number of years into the past. If the current day +doesn't exist in the destination year (i.e. it's February 29 and you +move to a non-leap-year) then the day is changed to February 29. The date +must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to decrement +

n_years :

number of years to move +
+
+
+
+

g_date_days_between ()

+
gint                g_date_days_between                 (const GDate *date1,
+                                                         const GDate *date2);
+

+Computes the number of days between two dates. +If date2 is prior to date1, the returned value is negative. +Both dates must be valid. +

+
++ + + + + + + + + + + + + + +

date1 :

the first date +

date2 :

the second date +

Returns :

the number of days between date1 and date2 +
+
+
+
+

g_date_compare ()

+
gint                g_date_compare                      (const GDate *lhs,
+                                                         const GDate *rhs);
+

+qsort()-style comparsion function for dates. Both +dates must be valid. +

+
++ + + + + + + + + + + + + + +

lhs :

first date to compare +

rhs :

second date to compare +

Returns :

0 for equal, less than zero if lhs is less than rhs, + greater than zero if lhs is greater than rhs +
+
+
+
+

g_date_clamp ()

+
void                g_date_clamp                        (GDate *date,
+                                                         const GDate *min_date,
+                                                         const GDate *max_date);
+

+If date is prior to min_date, sets date equal to min_date. +If date falls after max_date, sets date equal to max_date. +Otherwise, date is unchanged. +Either of min_date and max_date may be NULL. All non-NULL dates +must be valid. +

+
++ + + + + + + + + + + + + + +

date :

a GDate to clamp +

min_date :

minimum accepted value for date +

max_date :

maximum accepted value for date +
+
+
+
+

g_date_order ()

+
void                g_date_order                        (GDate *date1,
+                                                         GDate *date2);
+

+Checks if date1 is less than or equal to date2, +and swap the values if this is not the case. +

+
++ + + + + + + + + + +

date1 :

the first date +

date2 :

the second date +
+
+
+
+

g_date_get_day ()

+
GDateDay            g_date_get_day                      (const GDate *date);
+

+Returns the day of the month. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to extract the day of the month from +

Returns :

day of the month +
+
+
+
+

g_date_get_month ()

+
GDateMonth          g_date_get_month                    (const GDate *date);
+

+Returns the month of the year. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to get the month from +

Returns :

month of the year as a GDateMonth +
+
+
+
+

g_date_get_year ()

+
GDateYear           g_date_get_year                     (const GDate *date);
+

+Returns the year of a GDate. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate +

Returns :

year in which the date falls +
+
+
+
+

g_date_get_julian ()

+
guint32             g_date_get_julian                   (const GDate *date);
+

+Returns the Julian day or "serial number" of the GDate. The +Julian day is simply the number of days since January 1, Year 1; i.e., +January 1, Year 1 is Julian day 1; January 2, Year 1 is Julian day 2, +etc. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to extract the Julian day from +

Returns :

Julian day +
+
+
+
+

g_date_get_weekday ()

+
GDateWeekday        g_date_get_weekday                  (const GDate *date);
+

+Returns the day of the week for a GDate. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate. +

Returns :

day of the week as a GDateWeekday. +
+
+
+
+

g_date_get_day_of_year ()

+
guint               g_date_get_day_of_year              (const GDate *date);
+

+Returns the day of the year, where Jan 1 is the first day of the +year. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to extract day of year from +

Returns :

day of the year +
+
+
+
+

g_date_get_days_in_month ()

+
guint8              g_date_get_days_in_month            (GDateMonth month,
+                                                         GDateYear year);
+

+Returns the number of days in a month, taking leap years into account. +

+
++ + + + + + + + + + + + + + +

month :

month +

year :

year +

Returns :

number of days in month during the year +
+
+
+
+

g_date_is_first_of_month ()

+
gboolean            g_date_is_first_of_month            (const GDate *date);
+

+Returns TRUE if the date is on the first of a month. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to check +

Returns :

+TRUE if the date is the first of the month +
+
+
+
+

g_date_is_last_of_month ()

+
gboolean            g_date_is_last_of_month             (const GDate *date);
+

+Returns TRUE if the date is the last day of the month. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate to check +

Returns :

+TRUE if the date is the last day of the month +
+
+
+
+

g_date_is_leap_year ()

+
gboolean            g_date_is_leap_year                 (GDateYear year);
+

+Returns TRUE if the year is a leap year.[4] +

+
++ + + + + + + + + + +

year :

year to check +

Returns :

+TRUE if the year is a leap year +
+
+
+
+

g_date_get_monday_week_of_year ()

+
guint               g_date_get_monday_week_of_year      (const GDate *date);
+

+Returns the week of the year, where weeks are understood to start on +Monday. If the date is before the first Monday of the year, return +0. The date must be valid. +

+
++ + + + + + + + + + +

date :

a GDate +

Returns :

week of the year +
+
+
+
+

g_date_get_monday_weeks_in_year ()

+
guint8              g_date_get_monday_weeks_in_year     (GDateYear year);
+

+Returns the number of weeks in the year, where weeks are taken to start +on Monday. Will be 52 or 53. The date must be valid. (Years always have 52 +7-day periods, plus 1 or 2 extra days depending on whether it's a leap +year. This function is basically telling you how many Mondays are in +the year, i.e. there are 53 Mondays if one of the extra days happens +to be a Monday.) +

+
++ + + + + + + + + + +

year :

a year +

Returns :

number of Mondays in the year +
+
+
+
+

g_date_get_sunday_week_of_year ()

+
guint               g_date_get_sunday_week_of_year      (const GDate *date);
+

+Returns the week of the year during which this date falls, if weeks +are understood to being on Sunday. The date must be valid. Can return 0 if +the day is before the first Sunday of the year. +

+
++ + + + + + + + + + +

date :

a GDate +

Returns :

week number +
+
+
+
+

g_date_get_sunday_weeks_in_year ()

+
guint8              g_date_get_sunday_weeks_in_year     (GDateYear year);
+

+Returns the number of weeks in the year, where weeks are taken to start +on Sunday. Will be 52 or 53. The date must be valid. (Years always have 52 +7-day periods, plus 1 or 2 extra days depending on whether it's a leap +year. This function is basically telling you how many Sundays are in +the year, i.e. there are 53 Sundays if one of the extra days happens +to be a Sunday.) +

+
++ + + + + + + + + + +

year :

year to count weeks in +

Returns :

number of weeks +
+
+
+
+

g_date_get_iso8601_week_of_year ()

+
guint               g_date_get_iso8601_week_of_year     (const GDate *date);
+

+Returns the week of the year, where weeks are interpreted according +to ISO 8601.

+
++ + + + + + + + + + +

date :

a valid GDate +

Returns :

ISO 8601 week number of the year. + +
+

Since 2.6

+
+
+
+

g_date_strftime ()

+
gsize               g_date_strftime                     (gchar *s,
+                                                         gsize slen,
+                                                         const gchar *format,
+                                                         const GDate *date);
+

+Generates a printed representation of the date, in a +locale-specific way. Works just like +the platform's C library strftime() function, but only accepts date-related +formats; time-related formats give undefined results. Date must be valid. +Unlike strftime() (which uses the locale encoding), works on a UTF-8 format +string and stores a UTF-8 result. +

+

+This function does not provide any conversion specifiers in addition +to those implemented by the platform's C library. For example, don't +expect that using g_date_strftime() would make the F provided by the C99 +strftime() work on Windows where the C library only complies to C89. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

s :

destination buffer +

slen :

buffer size +

format :

format string +

date :

valid GDate +

Returns :

number of characters written to the buffer, or 0 the buffer was too small +
+
+
+
+

g_date_to_struct_tm ()

+
void                g_date_to_struct_tm                 (const GDate *date,
+                                                         struct tm *tm);
+

+Fills in the date-related bits of a struct tm +using the date value. Initializes the non-date parts with something +sane but meaningless. +

+
++ + + + + + + + + + +

date :

a GDate to set the struct tm from. +

tm :

+struct tm to fill. +
+
+
+
+

g_date_valid ()

+
gboolean            g_date_valid                        (const GDate *date);
+

+Returns TRUE if the GDate represents an existing day. The date must not +contain garbage; it should have been initialized with g_date_clear() +if it wasn't allocated by one of the g_date_new() variants. +

+
++ + + + + + + + + + +

date :

a GDate to check +

Returns :

Whether the date is valid +
+
+
+
+

g_date_valid_day ()

+
gboolean            g_date_valid_day                    (GDateDay day);
+

+Returns TRUE if the day of the month is valid (a day is valid if it's +between 1 and 31 inclusive). +

+
++ + + + + + + + + + +

day :

day to check +

Returns :

+TRUE if the day is valid +
+
+
+
+

g_date_valid_month ()

+
gboolean            g_date_valid_month                  (GDateMonth month);
+

+Returns TRUE if the month value is valid. The 12 GDateMonth +enumeration values are the only valid months. +

+
++ + + + + + + + + + +

month :

month +

Returns :

+TRUE if the month is valid +
+
+
+
+

g_date_valid_year ()

+
gboolean            g_date_valid_year                   (GDateYear year);
+

+Returns TRUE if the year is valid. Any year greater than 0 is valid, +though there is a 16-bit limit to what GDate will understand. +

+
++ + + + + + + + + + +

year :

year +

Returns :

+TRUE if the year is valid +
+
+
+
+

g_date_valid_dmy ()

+
gboolean            g_date_valid_dmy                    (GDateDay day,
+                                                         GDateMonth month,
+                                                         GDateYear year);
+

+Returns TRUE if the day-month-year triplet forms a valid, existing day +in the range of days GDate understands (Year 1 or later, no more than +a few thousand years in the future). +

+
++ + + + + + + + + + + + + + + + + + +

day :

day +

month :

month +

year :

year +

Returns :

+TRUE if the date is a valid one +
+
+
+
+

g_date_valid_julian ()

+
gboolean            g_date_valid_julian                 (guint32 julian_date);
+

+Returns TRUE if the Julian day is valid. Anything greater than zero +is basically a valid Julian, though there is a 32-bit limit. +

+
++ + + + + + + + + + +

julian_date :

Julian day to check +

Returns :

+TRUE if the Julian day is valid +
+
+
+
+

g_date_valid_weekday ()

+
gboolean            g_date_valid_weekday                (GDateWeekday weekday);
+

+Returns TRUE if the weekday is valid. The seven GDateWeekday enumeration +values are the only valid weekdays. +

+
++ + + + + + + + + + +

weekday :

weekday +

Returns :

+TRUE if the weekday is valid +
+
+
+
+

+

[4] +For the purposes of this function, leap year is every year divisible by +4 unless that year is divisible by 100. If it is divisible by 100 it would +be a leap year only if that year is also divisible by 400.

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Double-ended-Queues.html b/docs/reference/glib/html/glib-Double-ended-Queues.html new file mode 100644 index 0000000..4c9f890 --- /dev/null +++ b/docs/reference/glib/html/glib-Double-ended-Queues.html @@ -0,0 +1,1251 @@ + + + + +Double-ended Queues + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Double-ended Queues

+

Double-ended Queues — double-ended queue data structure

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GQueue;
+GQueue*             g_queue_new                         (void);
+void                g_queue_free                        (GQueue *queue);
+#define             G_QUEUE_INIT
+void                g_queue_init                        (GQueue *queue);
+void                g_queue_clear                       (GQueue *queue);
+gboolean            g_queue_is_empty                    (GQueue *queue);
+guint               g_queue_get_length                  (GQueue *queue);
+void                g_queue_reverse                     (GQueue *queue);
+GQueue *            g_queue_copy                        (GQueue *queue);
+void                g_queue_foreach                     (GQueue *queue,
+                                                         GFunc func,
+                                                         gpointer user_data);
+GList *             g_queue_find                        (GQueue *queue,
+                                                         gconstpointer data);
+GList *             g_queue_find_custom                 (GQueue *queue,
+                                                         gconstpointer data,
+                                                         GCompareFunc func);
+void                g_queue_sort                        (GQueue *queue,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+void                g_queue_push_head                   (GQueue *queue,
+                                                         gpointer data);
+void                g_queue_push_tail                   (GQueue *queue,
+                                                         gpointer data);
+void                g_queue_push_nth                    (GQueue *queue,
+                                                         gpointer data,
+                                                         gint n);
+gpointer            g_queue_pop_head                    (GQueue *queue);
+gpointer            g_queue_pop_tail                    (GQueue *queue);
+gpointer            g_queue_pop_nth                     (GQueue *queue,
+                                                         guint n);
+gpointer            g_queue_peek_head                   (GQueue *queue);
+gpointer            g_queue_peek_tail                   (GQueue *queue);
+gpointer            g_queue_peek_nth                    (GQueue *queue,
+                                                         guint n);
+gint                g_queue_index                       (GQueue *queue,
+                                                         gconstpointer data);
+void                g_queue_remove                      (GQueue *queue,
+                                                         gconstpointer data);
+void                g_queue_remove_all                  (GQueue *queue,
+                                                         gconstpointer data);
+void                g_queue_insert_before               (GQueue *queue,
+                                                         GList *sibling,
+                                                         gpointer data);
+void                g_queue_insert_after                (GQueue *queue,
+                                                         GList *sibling,
+                                                         gpointer data);
+void                g_queue_insert_sorted               (GQueue *queue,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+void                g_queue_push_head_link              (GQueue *queue,
+                                                         GList *link_);
+void                g_queue_push_tail_link              (GQueue *queue,
+                                                         GList *link_);
+void                g_queue_push_nth_link               (GQueue *queue,
+                                                         gint n,
+                                                         GList *link_);
+GList*              g_queue_pop_head_link               (GQueue *queue);
+GList*              g_queue_pop_tail_link               (GQueue *queue);
+GList*              g_queue_pop_nth_link                (GQueue *queue,
+                                                         guint n);
+GList*              g_queue_peek_head_link              (GQueue *queue);
+GList*              g_queue_peek_tail_link              (GQueue *queue);
+GList*              g_queue_peek_nth_link               (GQueue *queue,
+                                                         guint n);
+gint                g_queue_link_index                  (GQueue *queue,
+                                                         GList *link_);
+void                g_queue_unlink                      (GQueue *queue,
+                                                         GList *link_);
+void                g_queue_delete_link                 (GQueue *queue,
+                                                         GList *link_);
+
+
+
+

Description

+

+The GQueue structure and its associated functions provide a standard +queue data structure. Internally, GQueue uses the same data structure as +GList to store elements. +

+

+The data contained in each element can be either integer values, by using one +of the +Type Conversion Macros, +or simply pointers to any type of data. +

+

+To create a new GQueue, use g_queue_new(). +

+

+To initialize a statically-allocated GQueue, use G_QUEUE_INIT or +g_queue_init(). +

+

+To add elements, use g_queue_push_head(), g_queue_push_head_link(), +g_queue_push_tail() and g_queue_push_tail_link(). +

+

+To remove elements, use g_queue_pop_head() and g_queue_pop_tail(). +

+

+To free the entire queue, use g_queue_free(). +

+
+
+

Details

+
+

GQueue

+
typedef struct {
+  GList *head;
+  GList *tail;
+  guint  length;
+} GQueue;
+
+

+Contains the public fields of a Queue. +

+
++ + + + + + + + + + + + + + +

GList *head;

a pointer to the first element of the queue. +

GList *tail;

a pointer to the last element of the queue. +

guint length;

the number of elements in the queue. +
+
+
+
+

g_queue_new ()

+
GQueue*             g_queue_new                         (void);
+

+Creates a new GQueue.

+
++ + + + +

Returns :

a new GQueue. +
+
+
+
+

g_queue_free ()

+
void                g_queue_free                        (GQueue *queue);
+

+Frees the memory allocated for the GQueue. Only call this function if +queue was created with g_queue_new(). If queue elements contain +dynamically-allocated memory, they should be freed first.

+
++ + + + +

queue :

a GQueue. +
+
+
+
+

G_QUEUE_INIT

+
#define G_QUEUE_INIT { NULL, NULL, 0 }
+
+

+A statically-allocated GQueue must be initialized with this macro before it +can be used. This macro can be used to initialize a variable, but it cannot +be assigned to a variable. In that case you have to use g_queue_init(). +

+
+GQueue my_queue = G_QUEUE_INIT;
+
+

Since 2.14

+
+
+
+

g_queue_init ()

+
void                g_queue_init                        (GQueue *queue);
+

+A statically-allocated GQueue must be initialized with this function +before it can be used. Alternatively you can initialize it with +G_QUEUE_INIT. It is not necessary to initialize queues created with +g_queue_new().

+
++ + + + +

queue :

an uninitialized GQueue +
+

Since 2.14

+
+
+
+

g_queue_clear ()

+
void                g_queue_clear                       (GQueue *queue);
+

+Removes all the elements in queue. If queue elements contain +dynamically-allocated memory, they should be freed first.

+
++ + + + +

queue :

a GQueue +
+

Since 2.14

+
+
+
+

g_queue_is_empty ()

+
gboolean            g_queue_is_empty                    (GQueue *queue);
+

+Returns TRUE if the queue is empty.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

TRUE if the queue is empty. +
+
+
+
+

g_queue_get_length ()

+
guint               g_queue_get_length                  (GQueue *queue);
+

+Returns the number of items in queue.

+
++ + + + + + + + + + +

queue :

a GQueue +

Returns :

The number of items in queue. + +
+

Since 2.4

+
+
+
+

g_queue_reverse ()

+
void                g_queue_reverse                     (GQueue *queue);
+

+Reverses the order of the items in queue.

+
++ + + + +

queue :

a GQueue +
+

Since 2.4

+
+
+
+

g_queue_copy ()

+
GQueue *            g_queue_copy                        (GQueue *queue);
+

+Copies a queue. Note that is a shallow copy. If the elements in the +queue consist of pointers to data, the pointers are copied, but the +actual data is not.

+
++ + + + + + + + + + +

queue :

a GQueue +

Returns :

A copy of queue + +
+

Since 2.4

+
+
+
+

g_queue_foreach ()

+
void                g_queue_foreach                     (GQueue *queue,
+                                                         GFunc func,
+                                                         gpointer user_data);
+

+Calls func for each element in the queue passing user_data to the +function.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

func :

the function to call for each element's data +

user_data :

user data to pass to func +
+

Since 2.4

+
+
+
+

g_queue_find ()

+
GList *             g_queue_find                        (GQueue *queue,
+                                                         gconstpointer data);
+

+Finds the first link in queue which contains data.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

data :

data to find +

Returns :

The first link in queue which contains data. + +
+

Since 2.4

+
+
+
+

g_queue_find_custom ()

+
GList *             g_queue_find_custom                 (GQueue *queue,
+                                                         gconstpointer data,
+                                                         GCompareFunc func);
+

+Finds an element in a GQueue, using a supplied function to find the +desired element. It iterates over the queue, calling the given function +which should return 0 when the desired element is found. The function +takes two gconstpointer arguments, the GQueue element's data as the +first argument and the given user data as the second argument.

+
++ + + + + + + + + + + + + + + + + + +

queue :

a GQueue +

data :

user data passed to func +

func :

a GCompareFunc to call for each element. It should return 0 +when the desired element is found +

Returns :

The found link, or NULL if it wasn't found + +
+

Since 2.4

+
+
+
+

g_queue_sort ()

+
void                g_queue_sort                        (GQueue *queue,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Sorts queue using compare_func.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

compare_func :

the GCompareDataFunc used to sort queue. This function + is passed two elements of the queue and should return 0 if they are + equal, a negative value if the first comes before the second, and + a positive value if the second comes before the first. +

user_data :

user data passed to compare_func +
+

Since 2.4

+
+
+
+

g_queue_push_head ()

+
void                g_queue_push_head                   (GQueue *queue,
+                                                         gpointer data);
+

+Adds a new element at the head of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

data :

the data for the new element. +
+
+
+
+

g_queue_push_tail ()

+
void                g_queue_push_tail                   (GQueue *queue,
+                                                         gpointer data);
+

+Adds a new element at the tail of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

data :

the data for the new element. +
+
+
+
+

g_queue_push_nth ()

+
void                g_queue_push_nth                    (GQueue *queue,
+                                                         gpointer data,
+                                                         gint n);
+

+Inserts a new element into queue at the given position

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

data :

the data for the new element +

n :

the position to insert the new element. If n is negative or + larger than the number of elements in the queue, the element is + added to the end of the queue. +
+

Since 2.4

+
+
+
+

g_queue_pop_head ()

+
gpointer            g_queue_pop_head                    (GQueue *queue);
+

+Removes the first element of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

the data of the first element in the queue, or NULL if the queue + is empty. +
+
+
+
+

g_queue_pop_tail ()

+
gpointer            g_queue_pop_tail                    (GQueue *queue);
+

+Removes the last element of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

the data of the last element in the queue, or NULL if the queue + is empty. +
+
+
+
+

g_queue_pop_nth ()

+
gpointer            g_queue_pop_nth                     (GQueue *queue,
+                                                         guint n);
+

+Removes the n'th element of queue.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

n :

the position of the element. +

Returns :

the element's data, or NULL if n is off the end of queue. + +
+

Since 2.4

+
+
+
+

g_queue_peek_head ()

+
gpointer            g_queue_peek_head                   (GQueue *queue);
+

+Returns the first element of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

the data of the first element in the queue, or NULL if the queue + is empty. +
+
+
+
+

g_queue_peek_tail ()

+
gpointer            g_queue_peek_tail                   (GQueue *queue);
+

+Returns the last element of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

the data of the last element in the queue, or NULL if the queue + is empty. +
+
+
+
+

g_queue_peek_nth ()

+
gpointer            g_queue_peek_nth                    (GQueue *queue,
+                                                         guint n);
+

+Returns the n'th element of queue.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

n :

the position of the element. +

Returns :

The data for the n'th element of queue, or NULL if n is + off the end of queue. + +
+

Since 2.4

+
+
+
+

g_queue_index ()

+
gint                g_queue_index                       (GQueue *queue,
+                                                         gconstpointer data);
+

+Returns the position of the first element in queue which contains data.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

data :

the data to find. +

Returns :

The position of the first element in queue which contains data, or -1 if no element in queue contains data. + +
+

Since 2.4

+
+
+
+

g_queue_remove ()

+
void                g_queue_remove                      (GQueue *queue,
+                                                         gconstpointer data);
+

+Removes the first element in queue that contains data.

+
++ + + + + + + + + + +

queue :

a GQueue +

data :

data to remove. +
+

Since 2.4

+
+
+
+

g_queue_remove_all ()

+
void                g_queue_remove_all                  (GQueue *queue,
+                                                         gconstpointer data);
+

+Remove all elemeents in queue which contains data.

+
++ + + + + + + + + + +

queue :

a GQueue +

data :

data to remove +
+

Since 2.4

+
+
+
+

g_queue_insert_before ()

+
void                g_queue_insert_before               (GQueue *queue,
+                                                         GList *sibling,
+                                                         gpointer data);
+

+Inserts data into queue before sibling. +

+

+sibling must be part of queue.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

sibling :

a GList link that must be part of queue +

data :

the data to insert +
+

Since 2.4

+
+
+
+

g_queue_insert_after ()

+
void                g_queue_insert_after                (GQueue *queue,
+                                                         GList *sibling,
+                                                         gpointer data);
+

+Inserts data into queue after sibling +

+

+sibling must be part of queue

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

sibling :

a GList link that must be part of queue +

data :

the data to insert +
+

Since 2.4

+
+
+
+

g_queue_insert_sorted ()

+
void                g_queue_insert_sorted               (GQueue *queue,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Inserts data into queue using func to determine the new position.

+
++ + + + + + + + + + + + + + + + + + +

queue :

a GQueue +

data :

the data to insert +

func :

the GCompareDataFunc used to compare elements in the queue. It is + called with two elements of the queue and user_data. It should + return 0 if the elements are equal, a negative value if the first + element comes before the second, and a positive value if the second + element comes before the first. +

user_data :

user data passed to func. +
+

Since 2.4

+
+
+
+

g_queue_push_head_link ()

+
void                g_queue_push_head_link              (GQueue *queue,
+                                                         GList *link_);
+

+Adds a new element at the head of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

link_ :

a single GList element, not a list with + more than one element. +
+
+
+
+

g_queue_push_tail_link ()

+
void                g_queue_push_tail_link              (GQueue *queue,
+                                                         GList *link_);
+

+Adds a new element at the tail of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

link_ :

a single GList element, not a list with + more than one element. +
+
+
+
+

g_queue_push_nth_link ()

+
void                g_queue_push_nth_link               (GQueue *queue,
+                                                         gint n,
+                                                         GList *link_);
+

+Inserts link into queue at the given position.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

n :

the position to insert the link. If this is negative or larger than + the number of elements in queue, the link is added to the end of + queue. +

link_ :

the link to add to queue +
+

Since 2.4

+
+
+
+

g_queue_pop_head_link ()

+
GList*              g_queue_pop_head_link               (GQueue *queue);
+

+Removes the first element of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

the GList element at the head of the queue, or NULL if the queue + is empty. +
+
+
+
+

g_queue_pop_tail_link ()

+
GList*              g_queue_pop_tail_link               (GQueue *queue);
+

+Removes the last element of the queue.

+
++ + + + + + + + + + +

queue :

a GQueue. +

Returns :

the GList element at the tail of the queue, or NULL if the queue + is empty. +
+
+
+
+

g_queue_pop_nth_link ()

+
GList*              g_queue_pop_nth_link                (GQueue *queue,
+                                                         guint n);
+

+Removes and returns the link at the given position.

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

n :

the link's position +

Returns :

The n'th link, or NULL if n is off the end of queue. + +
+

Since 2.4

+
+
+
+

g_queue_peek_head_link ()

+
GList*              g_queue_peek_head_link              (GQueue *queue);
+

+Returns the first link in queue

+
++ + + + + + + + + + +

queue :

a GQueue +

Returns :

the first link in queue, or NULL if queue is empty + +
+

Since 2.4

+
+
+
+

g_queue_peek_tail_link ()

+
GList*              g_queue_peek_tail_link              (GQueue *queue);
+

+Returns the last link queue.

+
++ + + + + + + + + + +

queue :

a GQueue +

Returns :

the last link in queue, or NULL if queue is empty + +
+

Since 2.4

+
+
+
+

g_queue_peek_nth_link ()

+
GList*              g_queue_peek_nth_link               (GQueue *queue,
+                                                         guint n);
+

+Returns the link at the given position

+
++ + + + + + + + + + + + + + +

queue :

a GQueue +

n :

the position of the link +

Returns :

The link at the n'th position, or NULL if n is off the +end of the list + +
+

Since 2.4

+
+
+
+

g_queue_link_index ()

+
gint                g_queue_link_index                  (GQueue *queue,
+                                                         GList *link_);
+

+Returns the position of link_ in queue.

+
++ + + + + + + + + + + + + + +

queue :

a Gqueue +

link_ :

A GList link +

Returns :

The position of link_, or -1 if the link is +not part of queue + +
+

Since 2.4

+
+
+
+

g_queue_unlink ()

+
void                g_queue_unlink                      (GQueue *queue,
+                                                         GList *link_);
+

+Unlinks link_ so that it will no longer be part of queue. The link is +not freed. +

+

+link_ must be part of queue,

+
++ + + + + + + + + + +

queue :

a GQueue +

link_ :

a GList link that must be part of queue +
+

Since 2.4

+
+
+
+

g_queue_delete_link ()

+
void                g_queue_delete_link                 (GQueue *queue,
+                                                         GList *link_);
+

+Removes link_ from queue and frees it. +

+

+link_ must be part of queue.

+
++ + + + + + + + + + +

queue :

a GQueue +

link_ :

a GList link that must be part of queue +
+

Since 2.4

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Doubly-Linked-Lists.html b/docs/reference/glib/html/glib-Doubly-Linked-Lists.html new file mode 100644 index 0000000..83f69ea --- /dev/null +++ b/docs/reference/glib/html/glib-Doubly-Linked-Lists.html @@ -0,0 +1,1354 @@ + + + + +Doubly-Linked Lists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Doubly-Linked Lists

+

Doubly-Linked Lists — linked lists containing integer values or + pointers to data, with the ability to iterate + over the list in both directions

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GList;
+
+GList*              g_list_append                       (GList *list,
+                                                         gpointer data);
+GList*              g_list_prepend                      (GList *list,
+                                                         gpointer data);
+GList*              g_list_insert                       (GList *list,
+                                                         gpointer data,
+                                                         gint position);
+GList*              g_list_insert_before                (GList *list,
+                                                         GList *sibling,
+                                                         gpointer data);
+GList*              g_list_insert_sorted                (GList *list,
+                                                         gpointer data,
+                                                         GCompareFunc func);
+GList*              g_list_remove                       (GList *list,
+                                                         gconstpointer data);
+GList*              g_list_remove_link                  (GList *list,
+                                                         GList *llink);
+GList*              g_list_delete_link                  (GList *list,
+                                                         GList *link_);
+GList*              g_list_remove_all                   (GList *list,
+                                                         gconstpointer data);
+void                g_list_free                         (GList *list);
+
+GList*              g_list_alloc                        (void);
+void                g_list_free_1                       (GList *list);
+#define             g_list_free1
+
+guint               g_list_length                       (GList *list);
+GList*              g_list_copy                         (GList *list);
+GList*              g_list_reverse                      (GList *list);
+GList*              g_list_sort                         (GList *list,
+                                                         GCompareFunc compare_func);
+gint                (*GCompareFunc)                     (gconstpointer a,
+                                                         gconstpointer b);
+GList*              g_list_insert_sorted_with_data      (GList *list,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+GList*              g_list_sort_with_data               (GList *list,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+gint                (*GCompareDataFunc)                 (gconstpointer a,
+                                                         gconstpointer b,
+                                                         gpointer user_data);
+GList*              g_list_concat                       (GList *list1,
+                                                         GList *list2);
+void                g_list_foreach                      (GList *list,
+                                                         GFunc func,
+                                                         gpointer user_data);
+void                (*GFunc)                            (gpointer data,
+                                                         gpointer user_data);
+
+GList*              g_list_first                        (GList *list);
+GList*              g_list_last                         (GList *list);
+#define             g_list_previous                     (list)
+#define             g_list_next                         (list)
+GList*              g_list_nth                          (GList *list,
+                                                         guint n);
+gpointer            g_list_nth_data                     (GList *list,
+                                                         guint n);
+GList*              g_list_nth_prev                     (GList *list,
+                                                         guint n);
+
+GList*              g_list_find                         (GList *list,
+                                                         gconstpointer data);
+GList*              g_list_find_custom                  (GList *list,
+                                                         gconstpointer data,
+                                                         GCompareFunc func);
+gint                g_list_position                     (GList *list,
+                                                         GList *llink);
+gint                g_list_index                        (GList *list,
+                                                         gconstpointer data);
+
+void                g_list_push_allocator               (gpointer allocator);
+void                g_list_pop_allocator                (void);
+
+
+
+

Description

+

+The GList structure and its associated functions provide a standard +doubly-linked list data structure. +

+

+Each element in the list contains a piece of data, together with +pointers which link to the previous and next elements in the list. +Using these pointers it is possible to move through the list in both +directions (unlike the Singly-Linked Lists which +only allows movement through the list in the forward direction). +

+

+The data contained in each element can be either integer values, by +using one of the Type +Conversion Macros, or simply pointers to any type of data. +

+

+List elements are allocated from the slice allocator, which is more +efficient than allocating elements individually. +

+

+Note that most of the GList functions expect to be passed a pointer +to the first element in the list. The functions which insert +elements return the new start of the list, which may have changed. +

+

+There is no function to create a GList. NULL is considered to be +the empty list so you simply set a GList* to NULL. +

+

+To add elements, use g_list_append(), g_list_prepend(), +g_list_insert() and g_list_insert_sorted(). +

+

+To remove elements, use g_list_remove(). +

+

+To find elements in the list use g_list_first(), g_list_last(), +g_list_next(), g_list_previous(), g_list_nth(), g_list_nth_data(), +g_list_find() and g_list_find_custom(). +

+

+To find the index of an element use g_list_position() and +g_list_index(). +

+

+To call a function for each element in the list use g_list_foreach(). +

+

+To free the entire list, use g_list_free().

+
+
+

Details

+
+

GList

+
typedef struct {
+  gpointer data;
+  GList *next;
+  GList *prev;
+} GList;
+
+

+The GList struct is used for each element in a doubly-linked list.

+
++ + + + + + + + + + + + + + +

gpointer data;

holds the element's data, which can be a pointer to any kind + of data, or any integer value using the Type Conversion + Macros. +

GList *next;

contains the link to the next element in the list. +

GList *prev;

contains the link to the previous element in the list. +
+
+
+
+

g_list_append ()

+
GList*              g_list_append                       (GList *list,
+                                                         gpointer data);
+

+Adds a new element on to the end of the list. +

+

+

+
+

Note

+

+The return value is the new start of the list, which +may have changed, so make sure you store the new value. +

+
+

+

+

+

+
+

Note

+

+Note that g_list_append() has to traverse the entire list +to find the end, which is inefficient when adding multiple +elements. A common idiom to avoid the inefficiency is to prepend +the elements and reverse the list when all elements have been added. +

+
+

+

+

+

+
+/* Notice that these are initialized to the empty list. */
+GList *list = NULL, *number_list = NULL;
+
+/* This is a list of strings. */
+list = g_list_append (list, "first");
+list = g_list_append (list, "second");
+
+/* This is a list of integers. */
+number_list = g_list_append (number_list, GINT_TO_POINTER (27));
+number_list = g_list_append (number_list, GINT_TO_POINTER (14));
+
+
++ + + + + + + + + + + + + + +

list :

a pointer to a GList +

data :

the data for the new element +

Returns :

the new start of the GList +
+
+
+
+

g_list_prepend ()

+
GList*              g_list_prepend                      (GList *list,
+                                                         gpointer data);
+

+Adds a new element on to the start of the list. +

+

+

+
+

Note

+

+The return value is the new start of the list, which +may have changed, so make sure you store the new value. +

+
+

+

+

+

+
 
+/* Notice that it is initialized to the empty list. */
+GList *list = NULL;
+list = g_list_prepend (list, "last");
+list = g_list_prepend (list, "first");
+
+
++ + + + + + + + + + + + + + +

list :

a pointer to a GList +

data :

the data for the new element +

Returns :

the new start of the GList +
+
+
+
+

g_list_insert ()

+
GList*              g_list_insert                       (GList *list,
+                                                         gpointer data,
+                                                         gint position);
+

+Inserts a new element into the list at the given position.

+
++ + + + + + + + + + + + + + + + + + +

list :

a pointer to a GList +

data :

the data for the new element +

position :

the position to insert the element. If this is + negative, or is larger than the number of elements in the + list, the new element is added on to the end of the list. +

Returns :

the new start of the GList +
+
+
+
+

g_list_insert_before ()

+
GList*              g_list_insert_before                (GList *list,
+                                                         GList *sibling,
+                                                         gpointer data);
+

+Inserts a new element into the list before the given position.

+
++ + + + + + + + + + + + + + + + + + +

list :

a pointer to a GList +

sibling :

the list element before which the new element + is inserted or NULL to insert at the end of the list +

data :

the data for the new element +

Returns :

the new start of the GList +
+
+
+
+

g_list_insert_sorted ()

+
GList*              g_list_insert_sorted                (GList *list,
+                                                         gpointer data,
+                                                         GCompareFunc func);
+

+Inserts a new element into the list, using the given comparison +function to determine its position.

+
++ + + + + + + + + + + + + + + + + + +

list :

a pointer to a GList +

data :

the data for the new element +

func :

the function to compare elements in the list. It should + return a number > 0 if the first parameter comes after the + second parameter in the sort order. +

Returns :

the new start of the GList +
+
+
+
+

g_list_remove ()

+
GList*              g_list_remove                       (GList *list,
+                                                         gconstpointer data);
+

+Removes an element from a GList. +If two elements contain the same data, only the first is removed. +If none of the elements contain the data, the GList is unchanged.

+
++ + + + + + + + + + + + + + +

list :

a GList +

data :

the data of the element to remove +

Returns :

the new start of the GList +
+
+
+
+

g_list_remove_link ()

+
GList*              g_list_remove_link                  (GList *list,
+                                                         GList *llink);
+

+Removes an element from a GList, without freeing the element. +The removed element's prev and next links are set to NULL, so +that it becomes a self-contained list with one element.

+
++ + + + + + + + + + + + + + +

list :

a GList +

llink :

an element in the GList +

Returns :

the new start of the GList, without the element +
+
+
+
+

g_list_delete_link ()

+
GList*              g_list_delete_link                  (GList *list,
+                                                         GList *link_);
+

+Removes the node link_ from the list and frees it. +Compare this to g_list_remove_link() which removes the node +without freeing it.

+
++ + + + + + + + + + + + + + +

list :

a GList +

link_ :

node to delete from list +

Returns :

the new head of list +
+
+
+
+

g_list_remove_all ()

+
GList*              g_list_remove_all                   (GList *list,
+                                                         gconstpointer data);
+

+Removes all list nodes with data equal to data. +Returns the new head of the list. Contrast with +g_list_remove() which removes only the first node +matching the given data.

+
++ + + + + + + + + + + + + + +

list :

a GList +

data :

data to remove +

Returns :

new head of list +
+
+
+
+

g_list_free ()

+
void                g_list_free                         (GList *list);
+

+Frees all of the memory used by a GList. +The freed elements are returned to the slice allocator. +

+

+

+
+

Note

+

+If list elements contain dynamically-allocated memory, +they should be freed first. +

+
+
++ + + + +

list :

a GList +
+
+
+
+

g_list_alloc ()

+
GList*              g_list_alloc                        (void);
+

+Allocates space for one GList element. It is called by +g_list_append(), g_list_prepend(), g_list_insert() and +g_list_insert_sorted() and so is rarely used on its own.

+
++ + + + +

Returns :

a pointer to the newly-allocated GList element. +
+
+
+
+

g_list_free_1 ()

+
void                g_list_free_1                       (GList *list);
+

+Frees one GList element. +It is usually used after g_list_remove_link().

+
++ + + + +

list :

a GList element +
+
+
+
+

g_list_free1

+
#define             g_list_free1
+

+Another name for g_list_free_1().

+
+
+
+

g_list_length ()

+
guint               g_list_length                       (GList *list);
+

+Gets the number of elements in a GList. +

+

+

+
+

Note

+

+This function iterates over the whole list to +count its elements. +

+
+
++ + + + + + + + + + +

list :

a GList +

Returns :

the number of elements in the GList +
+
+
+
+

g_list_copy ()

+
GList*              g_list_copy                         (GList *list);
+

+Copies a GList. +

+

+

+
+

Note

+

+Note that this is a "shallow" copy. If the list elements +consist of pointers to data, the pointers are copied but +the actual data is not. +

+
+
++ + + + + + + + + + +

list :

a GList +

Returns :

a copy of list +
+
+
+
+

g_list_reverse ()

+
GList*              g_list_reverse                      (GList *list);
+

+Reverses a GList. +It simply switches the next and prev pointers of each element.

+
++ + + + + + + + + + +

list :

a GList +

Returns :

the start of the reversed GList +
+
+
+
+

g_list_sort ()

+
GList*              g_list_sort                         (GList *list,
+                                                         GCompareFunc compare_func);
+

+Sorts a GList using the given comparison function.

+
++ + + + + + + + + + + + + + +

list :

a GList +

compare_func :

the comparison function used to sort the GList. + This function is passed the data from 2 elements of the GList + and should return 0 if they are equal, a negative value if the + first element comes before the second, or a positive value if + the first element comes after the second. +

Returns :

the start of the sorted GList +
+
+
+
+

GCompareFunc ()

+
gint                (*GCompareFunc)                     (gconstpointer a,
+                                                         gconstpointer b);
+

+Specifies the type of a comparison function used to compare two +values. The function should return a negative integer if the first +value comes before the second, 0 if they are equal, or a positive +integer if the first value comes after the second.

+
++ + + + + + + + + + + + + + +

a :

a value. +

b :

a value to compare with. +

Returns :

negative value if a < b; zero if a = b; positive + value if a > b. +
+
+
+
+

g_list_insert_sorted_with_data ()

+
GList*              g_list_insert_sorted_with_data      (GList *list,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Inserts a new element into the list, using the given comparison +function to determine its position.

+
++ + + + + + + + + + + + + + + + + + + + + + +

list :

a pointer to a GList +

data :

the data for the new element +

func :

the function to compare elements in the list. + It should return a number > 0 if the first parameter + comes after the second parameter in the sort order. +

user_data :

user data to pass to comparison function. +

Returns :

the new start of the GList + +
+

Since 2.10

+
+
+
+

g_list_sort_with_data ()

+
GList*              g_list_sort_with_data               (GList *list,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Like g_list_sort(), but the comparison function accepts +a user data argument.

+
++ + + + + + + + + + + + + + + + + + +

list :

a GList +

compare_func :

comparison function +

user_data :

user data to pass to comparison function +

Returns :

the new head of list +
+
+
+
+

GCompareDataFunc ()

+
gint                (*GCompareDataFunc)                 (gconstpointer a,
+                                                         gconstpointer b,
+                                                         gpointer user_data);
+

+Specifies the type of a comparison function used to compare two +values. The function should return a negative integer if the first +value comes before the second, 0 if they are equal, or a positive +integer if the first value comes after the second.

+
++ + + + + + + + + + + + + + + + + + +

a :

a value. +

b :

a value to compare with. +

user_data :

user data to pass to comparison function. +

Returns :

negative value if a < b; zero if a = b; positive + value if a > b. +
+
+
+
+

g_list_concat ()

+
GList*              g_list_concat                       (GList *list1,
+                                                         GList *list2);
+

+Adds the second GList onto the end of the first GList. +Note that the elements of the second GList are not copied. +They are used directly.

+
++ + + + + + + + + + + + + + +

list1 :

a GList +

list2 :

the GList to add to the end of the first GList +

Returns :

the start of the new GList +
+
+
+
+

g_list_foreach ()

+
void                g_list_foreach                      (GList *list,
+                                                         GFunc func,
+                                                         gpointer user_data);
+

+Calls a function for each element of a GList.

+
++ + + + + + + + + + + + + + +

list :

a GList +

func :

the function to call with each element's data +

user_data :

user data to pass to the function +
+
+
+
+

GFunc ()

+
void                (*GFunc)                            (gpointer data,
+                                                         gpointer user_data);
+

+Specifies the type of functions passed to g_list_foreach() and +g_slist_foreach().

+
++ + + + + + + + + + +

data :

the element's data. +

user_data :

user data passed to g_list_foreach() or + g_slist_foreach(). +
+
+
+
+

g_list_first ()

+
GList*              g_list_first                        (GList *list);
+

+Gets the first element in a GList.

+
++ + + + + + + + + + +

list :

a GList +

Returns :

the first element in the GList, + or NULL if the GList has no elements +
+
+
+
+

g_list_last ()

+
GList*              g_list_last                         (GList *list);
+

+Gets the last element in a GList.

+
++ + + + + + + + + + +

list :

a GList +

Returns :

the last element in the GList, + or NULL if the GList has no elements +
+
+
+
+

g_list_previous()

+
#define             g_list_previous(list)
+

+A convenience macro to get the previous element in a GList.

+
++ + + + + + + + + + +

list :

an element in a GList. +

Returns :

the previous element, or NULL if there are no previous + elements. +
+
+
+
+

g_list_next()

+
#define             g_list_next(list)
+

+A convenience macro to get the next element in a GList.

+
++ + + + + + + + + + +

list :

an element in a GList. +

Returns :

the next element, or NULL if there are no more elements. +
+
+
+
+

g_list_nth ()

+
GList*              g_list_nth                          (GList *list,
+                                                         guint n);
+

+Gets the element at the given position in a GList.

+
++ + + + + + + + + + + + + + +

list :

a GList +

n :

the position of the element, counting from 0 +

Returns :

the element, or NULL if the position is off + the end of the GList +
+
+
+
+

g_list_nth_data ()

+
gpointer            g_list_nth_data                     (GList *list,
+                                                         guint n);
+

+Gets the data of the element at the given position.

+
++ + + + + + + + + + + + + + +

list :

a GList +

n :

the position of the element +

Returns :

the element's data, or NULL if the position + is off the end of the GList +
+
+
+
+

g_list_nth_prev ()

+
GList*              g_list_nth_prev                     (GList *list,
+                                                         guint n);
+

+Gets the element n places before list.

+
++ + + + + + + + + + + + + + +

list :

a GList +

n :

the position of the element, counting from 0 +

Returns :

the element, or NULL if the position is + off the end of the GList +
+
+
+
+

g_list_find ()

+
GList*              g_list_find                         (GList *list,
+                                                         gconstpointer data);
+

+Finds the element in a GList which +contains the given data.

+
++ + + + + + + + + + + + + + +

list :

a GList +

data :

the element data to find +

Returns :

the found GList element, + or NULL if it is not found +
+
+
+
+

g_list_find_custom ()

+
GList*              g_list_find_custom                  (GList *list,
+                                                         gconstpointer data,
+                                                         GCompareFunc func);
+

+Finds an element in a GList, using a supplied function to +find the desired element. It iterates over the list, calling +the given function which should return 0 when the desired +element is found. The function takes two gconstpointer arguments, +the GList element's data as the first argument and the +given user data.

+
++ + + + + + + + + + + + + + + + + + +

list :

a GList +

data :

user data passed to the function +

func :

the function to call for each element. + It should return 0 when the desired element is found +

Returns :

the found GList element, or NULL if it is not found +
+
+
+
+

g_list_position ()

+
gint                g_list_position                     (GList *list,
+                                                         GList *llink);
+

+Gets the position of the given element +in the GList (starting from 0).

+
++ + + + + + + + + + + + + + +

list :

a GList +

llink :

an element in the GList +

Returns :

the position of the element in the GList, + or -1 if the element is not found +
+
+
+
+

g_list_index ()

+
gint                g_list_index                        (GList *list,
+                                                         gconstpointer data);
+

+Gets the position of the element containing +the given data (starting from 0).

+
++ + + + + + + + + + + + + + +

list :

a GList +

data :

the data to find +

Returns :

the index of the element containing the data, + or -1 if the data is not found +
+
+
+
+

g_list_push_allocator ()

+
void                g_list_push_allocator               (gpointer allocator);
+
+

Warning

+

g_list_push_allocator has been deprecated since version 2.10 and should not be used in newly-written code. It does nothing, since GList has been converted + to the slice + allocator

+
+

+Sets the allocator to use to allocate GList elements. Use +g_list_pop_allocator() to restore the previous allocator. +

+

+Note that this function is not available if GLib has been compiled +with --disable-mem-pools

+
++ + + + +

allocator :

the GAllocator to use when allocating GList elements. +
+
+
+
+

g_list_pop_allocator ()

+
void                g_list_pop_allocator                (void);
+
+

Warning

+

g_list_pop_allocator has been deprecated since version 2.10 and should not be used in newly-written code. It does nothing, since GList has been converted + to the slice + allocator

+
+

+Restores the previous GAllocator, used when allocating GList +elements. +

+

+Note that this function is not available if GLib has been compiled +with --disable-mem-pools

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Dynamic-Loading-of-Modules.html b/docs/reference/glib/html/glib-Dynamic-Loading-of-Modules.html new file mode 100644 index 0000000..4712c89 --- /dev/null +++ b/docs/reference/glib/html/glib-Dynamic-Loading-of-Modules.html @@ -0,0 +1,526 @@ + + + + +Dynamic Loading of Modules + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Dynamic Loading of Modules

+

Dynamic Loading of Modules — portable method for dynamically loading 'plug-ins'

+
+
+

Synopsis

+
+#include <gmodule.h>
+
+                    GModule;
+gboolean            g_module_supported                  (void);
+gchar*              g_module_build_path                 (const gchar *directory,
+                                                         const gchar *module_name);
+GModule*            g_module_open                       (const gchar *file_name,
+                                                         GModuleFlags flags);
+enum                GModuleFlags;
+gboolean            g_module_symbol                     (GModule *module,
+                                                         const gchar *symbol_name,
+                                                         gpointer *symbol);
+const gchar*        g_module_name                       (GModule *module);
+void                g_module_make_resident              (GModule *module);
+gboolean            g_module_close                      (GModule *module);
+const gchar*        g_module_error                      (void);
+
+const gchar *       (*GModuleCheckInit)                 (GModule *module);
+void                (*GModuleUnload)                    (GModule *module);
+#define             G_MODULE_SUFFIX
+#define             G_MODULE_EXPORT
+#define             G_MODULE_IMPORT
+
+
+
+

Description

+

+These functions provide a portable way to dynamically load object files +(commonly known as 'plug-ins'). +The current implementation supports all systems that provide +an implementation of dlopen() (e.g. Linux/Sun), as well as HP-UX via its +shl_load() mechanism, and Windows platforms via DLLs. +

+

+A program which wants to use these functions must be linked to the +libraries output by the command pkg-config --libs gmodule-2.0. +

+

+To use them you must first determine whether dynamic loading +is supported on the platform by calling g_module_supported(). +If it is, you can open a module with g_module_open(), +find the module's symbols (e.g. function names) with g_module_symbol(), +and later close the module with g_module_close(). +g_module_name() will return the file name of a currently opened module. +

+

+If any of the above functions fail, the error status can be found with +g_module_error(). +

+

+The GModule implementation features reference counting for opened modules, +and supports hook functions within a module which are called when the +module is loaded and unloaded (see GModuleCheckInit and GModuleUnload). +

+

+If your module introduces static data to common subsystems in the running +program, e.g. through calling g_quark_from_static_string ("my-module-stuff"), +it must ensure that it is never unloaded, by calling g_module_make_resident(). +

+

+

+
+

Example 11. Calling a function defined in a GModule

+
+/* the function signature for 'say_hello' */
+typedef void (* SayHelloFunc) (const char *message);
+gboolean
+just_say_hello (const char *filename, GError **error)
+{
+  SayHelloFunc  say_hello;
+  GModule      *module;
+  module = g_module_open (filename, G_MODULE_BIND_LAZY);
+  if (!module)
+    {
+      g_set_error (error, FOO_ERROR, FOO_ERROR_BLAH,
+		   "%s", g_module_error ());
+      return FALSE;
+    }
+  if (!g_module_symbol (module, "say_hello", (gpointer *)&say_hello))
+    {
+      g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN,
+		   "%s: %s", filename, g_module_error ());
+      if (!g_module_close (module))
+	g_warning ("%s: %s", filename, g_module_error ());
+      return FALSE;
+    }
+  if (say_hello == NULL)
+    {
+      g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, "symbol say_hello is NULL");
+      if (!g_module_close (module))
+	g_warning ("%s: %s", filename, g_module_error ());
+      return FALSE;
+    }
+  /* call our function in the module */
+  say_hello ("Hello world!");
+  if (!g_module_close (module))
+    g_warning ("%s: %s", filename, g_module_error ());
+  return TRUE;
+}
+
+
+


+

+
+
+

Details

+
+

GModule

+
typedef struct _GModule GModule;
+

+The GModule struct is an opaque data structure to represent a +Dynamically-Loaded Module. +It should only be accessed via the following functions. +

+
+
+
+

g_module_supported ()

+
gboolean            g_module_supported                  (void);
+

+Checks if modules are supported on the current platform. +

+
++ + + + +

Returns :

+TRUE if modules are supported. +
+
+
+
+

g_module_build_path ()

+
gchar*              g_module_build_path                 (const gchar *directory,
+                                                         const gchar *module_name);
+

+A portable way to build the filename of a module. The platform-specific +prefix and suffix are added to the filename, if needed, and the result is +added to the directory, using the correct separator character. +

+

+The directory should specify the directory where the module can be found. +It can be NULL or an empty string to indicate that the module is in a standard +platform-specific directory, though this is not recommended since the +wrong module may be found. +

+

+For example, calling g_module_build_path() on a Linux system with a directory +of /lib and a module_name of "mylibrary" will return +/lib/libmylibrary.so. On a Windows system, using +\Windows as the directory it will return +\Windows\mylibrary.dll. +

+
++ + + + + + + + + + + + + + +

directory :

the directory where the module is. This can be NULL or the empty +string to indicate that the standard platform-specific directories will be +used, though that is not recommended. +

module_name :

the name of the module. +

Returns :

the complete path of the module, including the standard library +prefix and suffix. This should be freed when no longer needed. +
+
+
+
+

g_module_open ()

+
GModule*            g_module_open                       (const gchar *file_name,
+                                                         GModuleFlags flags);
+

+Opens a module. If the module has already been opened, its reference +count is incremented. +

+

+First of all g_module_open() tries to open file_name as a module. If +that fails and file_name has the ".la"-suffix (and is a libtool archive) +it tries to open the corresponding module. If that fails and it doesn't +have the proper module suffix for the platform (G_MODULE_SUFFIX), this +suffix will be appended and the corresponding module will be opended. If +that fails and file_name doesn't have the ".la"-suffix, this suffix is +appended and g_module_open() tries to open the corresponding module. If +eventually that fails as well, NULL is returned. +

+
++ + + + + + + + + + + + + + +

file_name :

the name of the file containing the module, or NULL to obtain + a GModule representing the main program itself. +

flags :

the flags used for opening the module. This can be the logical +OR of any of the GModuleFlags. +

Returns :

a GModule on success, or NULL on failure. +
+
+
+
+

enum GModuleFlags

+
typedef enum
+{
+  G_MODULE_BIND_LAZY = 1 << 0,
+  G_MODULE_BIND_LOCAL = 1 << 1,
+  G_MODULE_BIND_MASK = 0x03
+} GModuleFlags;
+
+

+Flags passed to g_module_open(). Note that these flags are +not supported on all platforms. +

+
++ + + + + + + + + + + + + + +

G_MODULE_BIND_LAZY

specifies that symbols are only resolved when needed. + The default action is to bind all symbols when the module is loaded. +

G_MODULE_BIND_LOCAL

specifies that symbols in the module should + not be added to the global name space. The default action on most + platforms is to place symbols in the module in the global name space, + which may cause conflicts with existing symbols. +

G_MODULE_BIND_MASK

mask for all flags. +
+
+
+
+

g_module_symbol ()

+
gboolean            g_module_symbol                     (GModule *module,
+                                                         const gchar *symbol_name,
+                                                         gpointer *symbol);
+

+Gets a symbol pointer from a module, such as one exported by G_MODULE_EXPORT. +

+

+Note that a valid symbol can be NULL. +

+
++ + + + + + + + + + + + + + + + + + +

module :

a GModule. +

symbol_name :

the name of the symbol to find. +

symbol :

returns the pointer to the symbol value. +

Returns :

+TRUE on success. +
+
+
+
+

g_module_name ()

+
const gchar*        g_module_name                       (GModule *module);
+

+Gets the filename from a GModule. +

+
++ + + + + + + + + + +

module :

a GModule. +

Returns :

the filename of the module, or "main" if the module is the main +program itself. +
+
+
+
+

g_module_make_resident ()

+
void                g_module_make_resident              (GModule *module);
+

+Ensures that a module will never be unloaded. +Any future g_module_close() calls on the module will be ignored. +

+
++ + + + +

module :

a GModule to make permanently resident. +
+
+
+
+

g_module_close ()

+
gboolean            g_module_close                      (GModule *module);
+

+Closes a module. +

+
++ + + + + + + + + + +

module :

a GModule to close. +

Returns :

+TRUE on success. +
+
+
+
+

g_module_error ()

+
const gchar*        g_module_error                      (void);
+

+Gets a string describing the last module error. +

+
++ + + + +

Returns :

a string describing the last module error. +
+
+
+
+

GModuleCheckInit ()

+
const gchar *       (*GModuleCheckInit)                 (GModule *module);
+

+Specifies the type of the module initialization function. + +If a module contains a function named g_module_check_init() it is called +automatically when the module is loaded. It is passed the GModule structure +and should return NULL on success or a string describing the initialization +error. +

+
++ + + + + + + + + + +

module :

the GModule corresponding to the module which has just been loaded. +

Returns :

+NULL on success, or a string describing the initialization error. +
+
+
+
+

GModuleUnload ()

+
void                (*GModuleUnload)                    (GModule *module);
+

+ +Specifies the type of the module function called when it is unloaded. +If a module contains a function named g_module_unload() it is called +automatically when the module is unloaded. +It is passed the GModule structure. +

+
++ + + + +

module :

the GModule about to be unloaded. +
+
+
+
+

G_MODULE_SUFFIX

+
#define G_MODULE_SUFFIX "so"
+
+

+Expands to the proper shared library suffix for the current platform +without the leading dot. For the most Unices and Linux this is "so", +for some HP-UX versions this is "sl" and for Windows this is "dll". +

+
+
+
+

G_MODULE_EXPORT

+
#define             G_MODULE_EXPORT
+

+Used to declare functions exported by modules. This is a no-op on Linux and +Unices, but when compiling for Windows, it marks a symbol to be exported from +the library or executable being built. +

+
+
+
+

G_MODULE_IMPORT

+
#define G_MODULE_IMPORT		extern
+
+

+Used to declare functions imported from modules. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Error-Reporting.html b/docs/reference/glib/html/glib-Error-Reporting.html new file mode 100644 index 0000000..ffbfc65 --- /dev/null +++ b/docs/reference/glib/html/glib-Error-Reporting.html @@ -0,0 +1,862 @@ + + + + +Error Reporting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Error Reporting

+

Error Reporting — a system for reporting errors

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GError;
+GError*             g_error_new                         (GQuark domain,
+                                                         gint code,
+                                                         const gchar *format,
+                                                         ...);
+GError*             g_error_new_literal                 (GQuark domain,
+                                                         gint code,
+                                                         const gchar *message);
+GError*             g_error_new_valist                  (GQuark domain,
+                                                         gint code,
+                                                         const gchar *format,
+                                                         va_list args);
+void                g_error_free                        (GError *error);
+GError*             g_error_copy                        (const GError *error);
+gboolean            g_error_matches                     (const GError *error,
+                                                         GQuark domain,
+                                                         gint code);
+void                g_set_error                         (GError **err,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const gchar *format,
+                                                         ...);
+void                g_set_error_literal                 (GError **err,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const gchar *message);
+void                g_propagate_error                   (GError **dest,
+                                                         GError *src);
+void                g_clear_error                       (GError **err);
+void                g_prefix_error                      (GError **err,
+                                                         const gchar *format,
+                                                         ...);
+void                g_propagate_prefixed_error          (GError **dest,
+                                                         GError *src,
+                                                         const gchar *format,
+                                                         ...);
+
+
+
+

Description

+

+GLib provides a standard method of reporting errors from a called function to +the calling code. (This is the same problem solved by exceptions in other +languages.) It's important to understand that this method is both a +data type (the GError object) and a set of +rules. If you use GError incorrectly, then your code will not +properly interoperate with other code that uses GError, and users of your API +will probably get confused. +

+

+First and foremost: GError should only be used to report +recoverable runtime errors, never to report programming errors. If +the programmer has screwed up, then you should use g_warning(), +g_return_if_fail(), g_assert(), g_error(), or some similar facility. +(Incidentally, remember that the g_error() function should +only be used for programming errors, it should not be used +to print any error reportable via GError.) +

+

+Examples of recoverable runtime errors are "file not found" or "failed to parse +input." Examples of programming errors are "NULL passed to strcmp()" or +"attempted to free the same pointer twice." These two kinds of errors are +fundamentally different: runtime errors should be handled or reported to the +user, programming errors should be eliminated by fixing the bug in the program. +This is why most functions in GLib and GTK+ do not use the GError facility. +

+

+Functions that can fail take a return location for a GError as their last argument. +For example: +

+
+gboolean g_file_get_contents (const gchar *filename,
+	                      gchar      **contents,
+                              gsize       *length,
+                              GError     **error);
+
+

+If you pass a non-NULL value for the error argument, it should +point to a location where an error can be placed. For example: +

+
+gchar *contents;
+GError *err = NULL;
+g_file_get_contents ("foo.txt", &contents, NULL, &err);
+g_assert ((contents == NULL && err != NULL) || (contents != NULL && err == NULL));
+if (err != NULL)
+  {
+    /* Report error to user, and free error */
+    g_assert (contents == NULL);
+    fprintf (stderr, "Unable to read file: %s\n", err->message);
+    g_error_free (err);
+  }
+else
+  {
+    /* Use file contents */
+    g_assert (contents != NULL);
+  }
+
+

+Note that err != NULL in this example is a +reliable indicator of whether +g_file_get_contents() failed. Additionally, g_file_get_contents() returns +a boolean which indicates whether it was successful. +

+

+Because g_file_get_contents() returns FALSE on failure, if you are only +interested in whether it failed and don't need to display an error message, you +can pass NULL for the error argument: +

+
+if (g_file_get_contents ("foo.txt", &contents, NULL, NULL)) /* ignore errors */
+  /* no error occurred */ ;
+else
+  /* error */ ;
+
+

+

+

+The GError object contains three fields: domain indicates +the module the error-reporting function is located in, code +indicates the specific error that occurred, and message is a +user-readable error message with as many details as possible. Several functions +are provided to deal with an error received from a called function: +g_error_matches() returns TRUE if the error matches a given domain and code, +g_propagate_error() copies an error into an error location (so the calling +function will receive it), and g_clear_error() clears an error location by +freeing the error and resetting the location to NULL. To display an error to the +user, simply display error->message, perhaps along with +additional context known only to the calling function (the file being opened, or +whatever -- though in the g_file_get_contents() case, +error->message already contains a filename). +

+

+When implementing a function that can report errors, the basic tool is +g_set_error(). Typically, if a fatal error occurs you want to g_set_error(), +then return immediately. g_set_error() does nothing if the error location passed +to it is NULL. Here's an example: +

+
+gint
+foo_open_file (GError **error)
+{
+  gint fd;
+  fd = open ("file.txt", O_RDONLY);
+  if (fd < 0)
+    {
+      g_set_error (error,
+                   FOO_ERROR,                 /* error domain */
+                   FOO_ERROR_BLAH,            /* error code */
+                   "Failed to open file: %s", /* error message format string */
+                   g_strerror (errno));
+      return -1;
+    }
+  else
+    return fd;
+}
+
+

+

+

+Things are somewhat more complicated if you yourself call another function that +can report a GError. If the sub-function indicates fatal errors in some way +other than reporting a GError, such as by returning TRUE on success, you can +simply do the following: +

+
+gboolean
+my_function_that_can_fail (GError **err)
+{
+  g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+  if (!sub_function_that_can_fail (err))
+    {
+       /* assert that error was set by the sub-function */
+       g_assert (err == NULL || *err != NULL);
+       return FALSE;
+    }
+  /* otherwise continue, no error occurred */
+  g_assert (err == NULL || *err == NULL);
+}
+
+

+

+

+If the sub-function does not indicate errors other than by reporting a GError, +you need to create a temporary GError since the passed-in one may be NULL. +g_propagate_error() is intended for use in this case. +

+
+gboolean
+my_function_that_can_fail (GError **err)
+{
+  GError *tmp_error;
+  g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+  tmp_error = NULL;
+  sub_function_that_can_fail (&tmp_error);
+  if (tmp_error != NULL)
+    {
+       /* store tmp_error in err, if err != NULL,
+        * otherwise call g_error_free() on tmp_error
+        */
+       g_propagate_error (err, tmp_error);
+       return FALSE;
+    }
+  /* otherwise continue, no error occurred */
+}
+
+

+

+

+Error pileups are always a bug. For example, this code is incorrect: +

+
+gboolean
+my_function_that_can_fail (GError **err)
+{
+  GError *tmp_error;
+  g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+  tmp_error = NULL;
+  sub_function_that_can_fail (&tmp_error);
+  other_function_that_can_fail (&tmp_error);
+  if (tmp_error != NULL)
+    {
+       g_propagate_error (err, tmp_error);
+       return FALSE;
+    }
+}
+
+

+tmp_error should be checked immediately after +sub_function_that_can_fail(), and either cleared or propagated upward. The rule +is: after each error, you must either handle the error, or return it to the +calling function. Note that passing NULL for the error location is the +equivalent of handling an error by always doing nothing about it. So the +following code is fine, assuming errors in sub_function_that_can_fail() are not +fatal to my_function_that_can_fail(): +

+
+gboolean
+my_function_that_can_fail (GError **err)
+{
+  GError *tmp_error;
+  g_return_val_if_fail (err == NULL || *err == NULL, FALSE);
+  sub_function_that_can_fail (NULL); /* ignore errors */
+  tmp_error = NULL;
+  other_function_that_can_fail (&tmp_error);
+  if (tmp_error != NULL)
+    {
+       g_propagate_error (err, tmp_error);
+       return FALSE;
+    }
+}
+
+

+

+

+Note that passing NULL for the error location ignores +errors; it's equivalent to try { sub_function_that_can_fail(); } catch +(...) {} in C++. It does not mean to leave errors +unhandled; it means to handle them by doing nothing. +

+

+Error domains and codes are conventionally named as follows: +

+
    +
  • +

    +The error domain is called +<NAMESPACE>_<MODULE>_ERROR, for example +G_SPAWN_ERROR or G_THREAD_ERROR: +

    +
    +#define G_SPAWN_ERROR g_spawn_error_quark ()
    +GQuark
    +g_spawn_error_quark (void)
    +{
    +  return g_quark_from_static_string ("g-spawn-error-quark");
    +}
    +
    +

    +

    +
  • +
  • +The error codes are in an enumeration called +<Namespace><Module>Error; for example, +GThreadError or GSpawnError. +

  • +
  • +Members of the error code enumeration are called <NAMESPACE>_<MODULE>_ERROR_<CODE>, for example G_SPAWN_ERROR_FORK or G_THREAD_ERROR_AGAIN. +

  • +
  • +If there's a "generic" or "unknown" error code for unrecoverable errors it +doesn't make sense to distinguish with specific codes, it should be called +<NAMESPACE>_<MODULE>_ERROR_FAILED, for +example G_SPAWN_ERROR_FAILED or G_THREAD_ERROR_FAILED. +

  • +
+

+

+

+Summary of rules for use of GError: +

+
    +
  • + Do not report programming errors via GError. +

  • +
  • + The last argument of a function that returns an error should be a + location where a GError can be placed (i.e. "GError** error"). If + GError is used with varargs, the GError** should be the last + argument before the "...". +

  • +
  • + The caller may pass NULL for the GError** if they are not interested + in details of the exact error that occurred. +

  • +
  • + If NULL is passed for the GError** argument, then errors should + not be returned to the caller, but your function should still + abort and return if an error occurs. That is, control flow should + not be affected by whether the caller wants to get a GError. +

  • +
  • + If a GError is reported, then your function by definition + had a fatal failure and did not complete whatever it was supposed + to do. If the failure was not fatal, then you handled it + and you should not report it. If it was fatal, then you must report it + and discontinue whatever you were doing immediately. +

  • +
  • + A GError* must be initialized to NULL before passing its address to + a function that can report errors. +

  • +
  • + "Piling up" errors is always a bug. That is, if you assign a new + GError to a GError* that is non-NULL, thus overwriting the previous + error, it indicates that you should have aborted the operation instead + of continuing. If you were able to continue, you should have cleared + the previous error with g_clear_error(). g_set_error() will complain + if you pile up errors. +

  • +
  • + By convention, if you return a boolean value indicating success + then TRUE means success and FALSE means failure. If FALSE is returned, + the error must be set to a non-NULL value. +

  • +
  • + A NULL return value is also frequently used to mean that an error + occurred. You should make clear in your documentation whether NULL is + a valid return value in non-error cases; if NULL is a valid value, + then users must check whether an error was returned to see if the + function succeeded. +

  • +
  • + When implementing a function that can report errors, you may want to + add a check at the top of your function that the error return location + is either NULL or contains a NULL error + (e.g. g_return_if_fail (error == NULL || *error == + NULL);). +

  • +
+

+

+
+
+

Details

+
+

GError

+
typedef struct {
+  GQuark       domain;
+  gint         code;
+  gchar       *message;
+} GError;
+
+

+The GError structure contains +information about an error that has occurred. +

+
++ + + + + + + + + + + + + + +

GQuark domain;

error domain, e.g. G_FILE_ERROR. +

gint code;

error code, e.g. G_FILE_ERROR_NOENT. +

gchar *message;

human-readable informative error message. +
+
+
+
+

g_error_new ()

+
GError*             g_error_new                         (GQuark domain,
+                                                         gint code,
+                                                         const gchar *format,
+                                                         ...);
+

+Creates a new GError with the given domain and code, +and a message formatted with format.

+
++ + + + + + + + + + + + + + + + + + + + + + +

domain :

error domain +

code :

error code +

format :

printf()-style format for error message +

... :

parameters for message format +

Returns :

a new GError +
+
+
+
+

g_error_new_literal ()

+
GError*             g_error_new_literal                 (GQuark domain,
+                                                         gint code,
+                                                         const gchar *message);
+

+Creates a new GError; unlike g_error_new(), message is +not a printf()-style format string. Use this function if +message contains text you don't have control over, +that could include printf() escape sequences.

+
++ + + + + + + + + + + + + + + + + + +

domain :

error domain +

code :

error code +

message :

error message +

Returns :

a new GError +
+
+
+
+

g_error_new_valist ()

+
GError*             g_error_new_valist                  (GQuark domain,
+                                                         gint code,
+                                                         const gchar *format,
+                                                         va_list args);
+

+Creates a new GError with the given domain and code, +and a message formatted with format.

+
++ + + + + + + + + + + + + + + + + + + + + + +

domain :

error domain +

code :

error code +

format :

printf()-style format for error message +

args :

va_list of parameters for the message format +

Returns :

a new GError + +
+

Since 2.22

+
+
+
+

g_error_free ()

+
void                g_error_free                        (GError *error);
+

+Frees a GError and associated resources.

+
++ + + + +

error :

a GError +
+
+
+
+

g_error_copy ()

+
GError*             g_error_copy                        (const GError *error);
+

+Makes a copy of error.

+
++ + + + + + + + + + +

error :

a GError +

Returns :

a new GError +
+
+
+
+

g_error_matches ()

+
gboolean            g_error_matches                     (const GError *error,
+                                                         GQuark domain,
+                                                         gint code);
+

+Returns TRUE if error matches domain and code, FALSE +otherwise. In particular, when error is NULL, FALSE will +be returned.

+
++ + + + + + + + + + + + + + + + + + +

error :

a GError or NULL +

domain :

an error domain +

code :

an error code +

Returns :

whether error has domain and code +
+
+
+
+

g_set_error ()

+
void                g_set_error                         (GError **err,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const gchar *format,
+                                                         ...);
+

+Does nothing if err is NULL; if err is non-NULL, then *err +must be NULL. A new GError is created and assigned to *err.

+
++ + + + + + + + + + + + + + + + + + + + + + +

err :

a return location for a GError, or NULL +

domain :

error domain +

code :

error code +

format :

printf()-style format +

... :

args for format +
+
+
+
+

g_set_error_literal ()

+
void                g_set_error_literal                 (GError **err,
+                                                         GQuark domain,
+                                                         gint code,
+                                                         const gchar *message);
+

+Does nothing if err is NULL; if err is non-NULL, then *err +must be NULL. A new GError is created and assigned to *err. +Unlike g_set_error(), message is not a printf()-style format string. +Use this function if message contains text you don't have control over, +that could include printf() escape sequences.

+
++ + + + + + + + + + + + + + + + + + +

err :

a return location for a GError, or NULL +

domain :

error domain +

code :

error code +

message :

error message +
+

Since 2.18

+
+
+
+

g_propagate_error ()

+
void                g_propagate_error                   (GError **dest,
+                                                         GError *src);
+

+If dest is NULL, free src; otherwise, moves src into *dest. +The error variable dest points to must be NULL.

+
++ + + + + + + + + + +

dest :

error return location +

src :

error to move into the return location +
+
+
+
+

g_clear_error ()

+
void                g_clear_error                       (GError **err);
+

+If err is NULL, does nothing. If err is non-NULL, +calls g_error_free() on *err and sets *err to NULL.

+
++ + + + +

err :

a GError return location +
+
+
+
+

g_prefix_error ()

+
void                g_prefix_error                      (GError **err,
+                                                         const gchar *format,
+                                                         ...);
+

+Formats a string according to format and +prefix it to an existing error message. If +err is NULL (ie: no error variable) then do +nothing. +

+

+If *err is NULL (ie: an error variable is +present but there is no error condition) then +also do nothing. Whether or not it makes +sense to take advantage of this feature is up +to you.

+
++ + + + + + + + + + + + + + +

err :

a return location for a GError, or NULL +

format :

printf()-style format string +

... :

arguments to format +
+

Since 2.16

+
+
+
+

g_propagate_prefixed_error ()

+
void                g_propagate_prefixed_error          (GError **dest,
+                                                         GError *src,
+                                                         const gchar *format,
+                                                         ...);
+

+If dest is NULL, free src; otherwise, +moves src into *dest. *dest must be NULL. +After the move, add a prefix as with +g_prefix_error().

+
++ + + + + + + + + + + + + + + + + + +

dest :

error return location +

src :

error to move into the return location +

format :

printf()-style format string +

... :

arguments to format +
+

Since 2.16

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-File-Utilities.html b/docs/reference/glib/html/glib-File-Utilities.html new file mode 100644 index 0000000..feb19b8 --- /dev/null +++ b/docs/reference/glib/html/glib-File-Utilities.html @@ -0,0 +1,1783 @@ + + + + +File Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

File Utilities

+

File Utilities — various file-related functions

+
+
+

Synopsis

+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+enum                GFileError;
+#define             G_FILE_ERROR
+enum                GFileTest;
+GFileError          g_file_error_from_errno             (gint err_no);
+gboolean            g_file_get_contents                 (const gchar *filename,
+                                                         gchar **contents,
+                                                         gsize *length,
+                                                         GError **error);
+gboolean            g_file_set_contents                 (const gchar *filename,
+                                                         const gchar *contents,
+                                                         gssize length,
+                                                         GError **error);
+gboolean            g_file_test                         (const gchar *filename,
+                                                         GFileTest test);
+gint                g_mkstemp                           (gchar *tmpl);
+gint                g_mkstemp_full                      (gchar *tmpl,
+                                                         int flags,
+                                                         int mode);
+gint                g_file_open_tmp                     (const gchar *tmpl,
+                                                         gchar **name_used,
+                                                         GError **error);
+gchar *             g_file_read_link                    (const gchar *filename,
+                                                         GError **error);
+int                 g_mkdir_with_parents                (const gchar *pathname,
+                                                         int mode);
+
+                    GDir;
+GDir *              g_dir_open                          (const gchar *path,
+                                                         guint flags,
+                                                         GError **error);
+const gchar *       g_dir_read_name                     (GDir *dir);
+void                g_dir_rewind                        (GDir *dir);
+void                g_dir_close                         (GDir *dir);
+
+                    GMappedFile;
+GMappedFile *       g_mapped_file_new                   (const gchar *filename,
+                                                         gboolean writable,
+                                                         GError **error);
+GMappedFile *       g_mapped_file_ref                   (GMappedFile *file);
+void                g_mapped_file_unref                 (GMappedFile *file);
+void                g_mapped_file_free                  (GMappedFile *file);
+gsize               g_mapped_file_get_length            (GMappedFile *file);
+gchar *             g_mapped_file_get_contents          (GMappedFile *file);
+
+int                 g_open                              (const gchar *filename,
+                                                         int flags,
+                                                         int mode);
+int                 g_rename                            (const gchar *oldfilename,
+                                                         const gchar *newfilename);
+int                 g_mkdir                             (const gchar *filename,
+                                                         int mode);
+int                 g_stat                              (const gchar *filename,
+                                                         struct _g_stat_struct *buf);
+int                 g_lstat                             (const gchar *filename,
+                                                         struct _g_stat_struct *buf);
+int                 g_unlink                            (const gchar *filename);
+int                 g_remove                            (const gchar *filename);
+int                 g_rmdir                             (const gchar *filename);
+FILE *              g_fopen                             (const gchar *filename,
+                                                         const gchar *mode);
+FILE *              g_freopen                           (const gchar *filename,
+                                                         const gchar *mode,
+                                                         FILE *stream);
+int                 g_chmod                             (const gchar *filename,
+                                                         int mode);
+int                 g_access                            (const gchar *filename,
+                                                         int mode);
+int                 g_creat                             (const gchar *filename,
+                                                         int mode);
+int                 g_chdir                             (const gchar *path);
+int                 g_utime                             (const gchar *filename,
+                                                         struct utimbuf *utb);
+
+
+
+

Description

+

+There is a group of functions which wrap the common POSIX functions +dealing with filenames (g_open(), g_rename(), g_mkdir(), g_stat(), +g_unlink(), g_remove(), g_fopen(), g_freopen()). The point of these +wrappers is to make it possible to handle file names with any Unicode +characters in them on Windows without having to use ifdefs and the +wide character API in the application code. +

+

+The pathname argument should be in the GLib file name encoding. On +POSIX this is the actual on-disk encoding which might correspond to +the locale settings of the process (or the +G_FILENAME_ENCODING environment variable), or not. +

+

+On Windows the GLib file name encoding is UTF-8. Note that the +Microsoft C library does not use UTF-8, but has separate APIs for +current system code page and wide characters (UTF-16). The GLib +wrappers call the wide character API if present (on modern Windows +systems), otherwise convert to/from the system code page. +

+

+Another group of functions allows to open and read directories +in the GLib file name encoding. These are g_dir_open(), +g_dir_read_name(), g_dir_rewind(), g_dir_close(). +

+
+
+

Details

+
+

enum GFileError

+
typedef enum
+{
+  G_FILE_ERROR_EXIST,
+  G_FILE_ERROR_ISDIR,
+  G_FILE_ERROR_ACCES,
+  G_FILE_ERROR_NAMETOOLONG,
+  G_FILE_ERROR_NOENT,
+  G_FILE_ERROR_NOTDIR,
+  G_FILE_ERROR_NXIO,
+  G_FILE_ERROR_NODEV,
+  G_FILE_ERROR_ROFS,
+  G_FILE_ERROR_TXTBSY,
+  G_FILE_ERROR_FAULT,
+  G_FILE_ERROR_LOOP,
+  G_FILE_ERROR_NOSPC,
+  G_FILE_ERROR_NOMEM,
+  G_FILE_ERROR_MFILE,
+  G_FILE_ERROR_NFILE,
+  G_FILE_ERROR_BADF,
+  G_FILE_ERROR_INVAL,
+  G_FILE_ERROR_PIPE,
+  G_FILE_ERROR_AGAIN,
+  G_FILE_ERROR_INTR,
+  G_FILE_ERROR_IO,
+  G_FILE_ERROR_PERM,
+  G_FILE_ERROR_NOSYS,
+  G_FILE_ERROR_FAILED
+} GFileError;
+
+

+Values corresponding to errno codes returned from file operations +on UNIX. Unlike errno codes, GFileError values are available on +all systems, even Windows. The exact meaning of each code depends on what +sort of file operation you were performing; the UNIX documentation +gives more details. The following error code descriptions come +from the GNU C Library manual, and are under the copyright +of that manual. +

+

+It's not very portable to make detailed assumptions about exactly +which errors will be returned from a given operation. Some errors +don't occur on some systems, etc., sometimes there are subtle +differences in when a system will report a given error, etc. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_FILE_ERROR_EXIST

Operation not permitted; only the owner of the + file (or other resource) or processes with special privileges can + perform the operation. +

G_FILE_ERROR_ISDIR

File is a directory; you cannot open a directory + for writing, or create or remove hard links to it. +

G_FILE_ERROR_ACCES

Permission denied; the file permissions do not + allow the attempted operation. +

G_FILE_ERROR_NAMETOOLONG

Filename too long. +

G_FILE_ERROR_NOENT

No such file or directory. This is a "file + doesn't exist" error for ordinary files that are referenced in + contexts where they are expected to already exist. +

G_FILE_ERROR_NOTDIR

A file that isn't a directory was specified when + a directory is required. +

G_FILE_ERROR_NXIO

No such device or address. The system tried to + use the device represented by a file you specified, and it + couldn't find the device. This can mean that the device file was + installed incorrectly, or that the physical device is missing or + not correctly attached to the computer. +

G_FILE_ERROR_NODEV

This file is of a type that doesn't support + mapping. +

G_FILE_ERROR_ROFS

The directory containing the new link can't be + modified because it's on a read-only file system. +

G_FILE_ERROR_TXTBSY

Text file busy. +

G_FILE_ERROR_FAULT

You passed in a pointer to bad memory. + (GLib won't reliably return this, don't pass in pointers to bad + memory.) +

G_FILE_ERROR_LOOP

Too many levels of symbolic links were encountered + in looking up a file name. This often indicates a cycle of symbolic + links. +

G_FILE_ERROR_NOSPC

No space left on device; write operation on a + file failed because the disk is full. +

G_FILE_ERROR_NOMEM

No memory available. The system cannot allocate + more virtual memory because its capacity is full. +

G_FILE_ERROR_MFILE

The current process has too many files open and + can't open any more. Duplicate descriptors do count toward this + limit. +

G_FILE_ERROR_NFILE

There are too many distinct file openings in the + entire system. +

G_FILE_ERROR_BADF

Bad file descriptor; for example, I/O on a + descriptor that has been closed or reading from a descriptor open + only for writing (or vice versa). +

G_FILE_ERROR_INVAL

Invalid argument. This is used to indicate + various kinds of problems with passing the wrong argument to a + library function. +

G_FILE_ERROR_PIPE

Broken pipe; there is no process reading from the + other end of a pipe. Every library function that returns this + error code also generates a `SIGPIPE' signal; this signal + terminates the program if not handled or blocked. Thus, your + program will never actually see this code unless it has handled or + blocked `SIGPIPE'. +

G_FILE_ERROR_AGAIN

Resource temporarily unavailable; the call might + work if you try again later. +

G_FILE_ERROR_INTR

Interrupted function call; an asynchronous signal + occurred and prevented completion of the call. When this + happens, you should try the call again. +

G_FILE_ERROR_IO

Input/output error; usually used for physical read + or write errors. i.e. the disk or other physical device hardware + is returning errors. +

G_FILE_ERROR_PERM

Operation not permitted; only the owner of the + file (or other resource) or processes with special privileges can + perform the operation. +

G_FILE_ERROR_NOSYS

Function not implemented; this indicates that the + system is missing some functionality. +

G_FILE_ERROR_FAILED

Does not correspond to a UNIX error code; this + is the standard "failed for unspecified reason" error code present in + all GError error code enumerations. Returned if no specific + code applies. +
+
+
+
+

G_FILE_ERROR

+
#define G_FILE_ERROR g_file_error_quark ()
+
+

+Error domain for file operations. Errors in this domain will +be from the GFileError enumeration. See GError for information on +error domains. +

+
+
+
+

enum GFileTest

+
typedef enum
+{
+  G_FILE_TEST_IS_REGULAR    = 1 << 0,
+  G_FILE_TEST_IS_SYMLINK    = 1 << 1,
+  G_FILE_TEST_IS_DIR        = 1 << 2,
+  G_FILE_TEST_IS_EXECUTABLE = 1 << 3,
+  G_FILE_TEST_EXISTS        = 1 << 4
+} GFileTest;
+
+

+A test to perform on a file using g_file_test(). +

+
++ + + + + + + + + + + + + + + + + + + + + + +

G_FILE_TEST_IS_REGULAR

+TRUE if the file is a regular file (not a directory). + Note that this test will also return TRUE if the tested file is a symlink + to a regular file. +

G_FILE_TEST_IS_SYMLINK

+TRUE if the file is a symlink. +

G_FILE_TEST_IS_DIR

+TRUE if the file is a directory. +

G_FILE_TEST_IS_EXECUTABLE

+TRUE if the file is executable. +

G_FILE_TEST_EXISTS

+TRUE if the file exists. + It may or may not be a regular file. +
+
+
+
+

g_file_error_from_errno ()

+
GFileError          g_file_error_from_errno             (gint err_no);
+

+Gets a GFileError constant based on the passed-in errno. +For example, if you pass in EEXIST this function returns +G_FILE_ERROR_EXIST. Unlike errno values, you can portably +assume that all GFileError values will exist. +

+

+Normally a GFileError value goes into a GError returned +from a function that manipulates files. So you would use +g_file_error_from_errno() when constructing a GError.

+
++ + + + + + + + + + +

err_no :

an "errno" value +

Returns :

GFileError corresponding to the given errno +
+
+
+
+

g_file_get_contents ()

+
gboolean            g_file_get_contents                 (const gchar *filename,
+                                                         gchar **contents,
+                                                         gsize *length,
+                                                         GError **error);
+

+Reads an entire file into allocated memory, with good error +checking. +

+

+If the call was successful, it returns TRUE and sets contents to the file +contents and length to the length of the file contents in bytes. The string +stored in contents will be nul-terminated, so for text files you can pass +NULL for the length argument. If the call was not successful, it returns +FALSE and sets error. The error domain is G_FILE_ERROR. Possible error +codes are those in the GFileError enumeration. In the error case, +contents is set to NULL and length is set to zero.

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename :

name of a file to read contents from, in the GLib file name encoding +

contents :

location to store an allocated string, use g_free() to free + the returned string +

length :

location to store length in bytes of the contents, or NULL +

error :

return location for a GError, or NULL +

Returns :

TRUE on success, FALSE if an error occurred +
+
+
+
+

g_file_set_contents ()

+
gboolean            g_file_set_contents                 (const gchar *filename,
+                                                         const gchar *contents,
+                                                         gssize length,
+                                                         GError **error);
+

+Writes all of contents to a file named filename, with good error checking. +If a file called filename already exists it will be overwritten. +

+

+This write is atomic in the sense that it is first written to a temporary +file which is then renamed to the final name. Notes: +

+
    +
  • + On Unix, if filename already exists hard links to filename will break. + Also since the file is recreated, existing permissions, access control + lists, metadata etc. may be lost. If filename is a symbolic link, + the link itself will be replaced, not the linked file. +
  • +
  • + On Windows renaming a file will not remove an existing file with the + new name, so on Windows there is a race condition between the existing + file being removed and the temporary file being renamed. +
  • +
  • + On Windows there is no way to remove a file that is open to some + process, or mapped into memory. Thus, this function will fail if + filename already exists and is open. +
  • +
+

+

+

+If the call was sucessful, it returns TRUE. If the call was not successful, +it returns FALSE and sets error. The error domain is G_FILE_ERROR. +Possible error codes are those in the GFileError enumeration.

+
++ + + + + + + + + + + + + + + + + + + + + + +

filename :

name of a file to write contents to, in the GLib file name + encoding +

contents :

string to write to the file +

length :

length of contents, or -1 if contents is a nul-terminated string +

error :

return location for a GError, or NULL +

Returns :

TRUE on success, FALSE if an error occurred + +
+

Since 2.8

+
+
+
+

g_file_test ()

+
gboolean            g_file_test                         (const gchar *filename,
+                                                         GFileTest test);
+

+Returns TRUE if any of the tests in the bitfield test are +TRUE. For example, (G_FILE_TEST_EXISTS | +G_FILE_TEST_IS_DIR) will return TRUE if the file exists; +the check whether it's a directory doesn't matter since the existence +test is TRUE. With the current set of available tests, there's no point +passing in more than one test at a time. +

+

+Apart from G_FILE_TEST_IS_SYMLINK all tests follow symbolic links, +so for a symbolic link to a regular file g_file_test() will return +TRUE for both G_FILE_TEST_IS_SYMLINK and G_FILE_TEST_IS_REGULAR. +

+

+Note, that for a dangling symbolic link g_file_test() will return +TRUE for G_FILE_TEST_IS_SYMLINK and FALSE for all other flags. +

+

+You should never use g_file_test() to test whether it is safe +to perform an operation, because there is always the possibility +of the condition changing before you actually perform the operation. +For example, you might think you could use G_FILE_TEST_IS_SYMLINK +to know whether it is safe to write to a file without being +tricked into writing into a different location. It doesn't work! +

+
+/* DON'T DO THIS */
+ if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK)) 
+   {
+     fd = g_open (filename, O_WRONLY);
+     /* write to fd */
+   }
+
+

+

+

+Another thing to note is that G_FILE_TEST_EXISTS and +G_FILE_TEST_IS_EXECUTABLE are implemented using the access() +system call. This usually doesn't matter, but if your program +is setuid or setgid it means that these tests will give you +the answer for the real user ID and group ID, rather than the +effective user ID and group ID. +

+

+On Windows, there are no symlinks, so testing for +G_FILE_TEST_IS_SYMLINK will always return FALSE. Testing for +G_FILE_TEST_IS_EXECUTABLE will just check that the file exists and +its name indicates that it is executable, checking for well-known +extensions and those listed in the PATHEXT environment variable.

+
++ + + + + + + + + + + + + + +

filename :

a filename to test in the GLib file name encoding +

test :

bitfield of GFileTest flags +

Returns :

whether a test was TRUE +
+
+
+
+

g_mkstemp ()

+
gint                g_mkstemp                           (gchar *tmpl);
+

+Opens a temporary file. See the mkstemp() documentation +on most UNIX-like systems. +

+

+The parameter is a string that should follow the rules for +mkstemp() templates, i.e. contain the string "XXXXXX". +g_mkstemp() is slightly more flexible than mkstemp() +in that the sequence does not have to occur at the very end of the +template. The X string will +be modified to form the name of a file that didn't exist. +The string should be in the GLib file name encoding. Most importantly, +on Windows it should be in UTF-8.

+
++ + + + + + + + + + +

tmpl :

template filename +

Returns :

A file handle (as from open()) to the file +opened for reading and writing. The file is opened in binary mode +on platforms where there is a difference. The file handle should be +closed with close(). In case of errors, -1 is returned. +
+
+
+
+

g_mkstemp_full ()

+
gint                g_mkstemp_full                      (gchar *tmpl,
+                                                         int flags,
+                                                         int mode);
+

+Opens a temporary file. See the mkstemp() documentation +on most UNIX-like systems. +

+

+The parameter is a string that should follow the rules for +mkstemp() templates, i.e. contain the string "XXXXXX". +g_mkstemp_full() is slightly more flexible than mkstemp() +in that the sequence does not have to occur at the very end of the +template and you can pass a mode and additional flags. The X +string will be modified to form the name of a file that didn't exist. +The string should be in the GLib file name encoding. Most importantly, +on Windows it should be in UTF-8.

+
++ + + + + + + + + + + + + + + + + + +

tmpl :

template filename +

flags :

flags to pass to an open() call in addition to O_EXCL and + O_CREAT, which are passed automatically +

mode :

permissios to create the temporary file with +

Returns :

A file handle (as from open()) to the file + opened for reading and writing. The file handle should be + closed with close(). In case of errors, -1 is returned. + +
+

Since 2.22

+
+
+
+

g_file_open_tmp ()

+
gint                g_file_open_tmp                     (const gchar *tmpl,
+                                                         gchar **name_used,
+                                                         GError **error);
+

+Opens a file for writing in the preferred directory for temporary +files (as returned by g_get_tmp_dir()). +

+

+tmpl should be a string in the GLib file name encoding containing +a sequence of six 'X' characters, as the parameter to g_mkstemp(). +However, unlike these functions, the template should only be a +basename, no directory components are allowed. If template is +NULL, a default template is used. +

+

+Note that in contrast to g_mkstemp() (and mkstemp()) +tmpl is not modified, and might thus be a read-only literal string. +

+

+The actual name used is returned in name_used if non-NULL. This +string should be freed with g_free() when not needed any longer. +The returned name is in the GLib file name encoding.

+
++ + + + + + + + + + + + + + + + + + +

tmpl :

Template for file name, as in g_mkstemp(), basename only, + or NULL, to a default template +

name_used :

location to store actual name used, or NULL +

error :

return location for a GError +

Returns :

A file handle (as from open()) to +the file opened for reading and writing. The file is opened in binary +mode on platforms where there is a difference. The file handle should be +closed with close(). In case of errors, -1 is returned +and error will be set. +
+
+
+
+

g_file_read_link ()

+
gchar *             g_file_read_link                    (const gchar *filename,
+                                                         GError **error);
+

+Reads the contents of the symbolic link filename like the POSIX +readlink() function. The returned string is in the encoding used +for filenames. Use g_filename_to_utf8() to convert it to UTF-8.

+
++ + + + + + + + + + + + + + +

filename :

the symbolic link +

error :

return location for a GError +

Returns :

A newly-allocated string with the contents of the symbolic link, + or NULL if an error occurred. + +
+

Since 2.4

+
+
+
+

g_mkdir_with_parents ()

+
int                 g_mkdir_with_parents                (const gchar *pathname,
+                                                         int mode);
+

+Create a directory if it doesn't already exist. Create intermediate +parent directories as needed, too.

+
++ + + + + + + + + + + + + + +

pathname :

a pathname in the GLib file name encoding +

mode :

permissions to use for newly created directories +

Returns :

0 if the directory already exists, or was successfully +created. Returns -1 if an error occurred, with errno set. + +
+

Since 2.8

+
+
+
+

GDir

+
typedef struct _GDir GDir;
+

+An opaque structure representing an opened directory. +

+
+
+
+

g_dir_open ()

+
GDir *              g_dir_open                          (const gchar *path,
+                                                         guint flags,
+                                                         GError **error);
+

+Opens a directory for reading. The names of the files in the +directory can then be retrieved using g_dir_read_name().

+
++ + + + + + + + + + + + + + + + + + +

path :

the path to the directory you are interested in. On Unix + in the on-disk encoding. On Windows in UTF-8 +

flags :

Currently must be set to 0. Reserved for future use. +

error :

return location for a GError, or NULL. + If non-NULL, an error will be set if and only if + g_dir_open() fails. +

Returns :

a newly allocated GDir on success, NULL on failure. + If non-NULL, you must free the result with g_dir_close() + when you are finished with it. +
+
+
+
+

g_dir_read_name ()

+
const gchar *       g_dir_read_name                     (GDir *dir);
+

+Retrieves the name of the next entry in the directory. The '.' and +'..' entries are omitted. On Windows, the returned name is in +UTF-8. On Unix, it is in the on-disk encoding.

+
++ + + + + + + + + + +

dir :

a GDir* created by g_dir_open() +

Returns :

The entry's name or NULL if there are no + more entries. The return value is owned by GLib and + must not be modified or freed. +
+
+
+
+

g_dir_rewind ()

+
void                g_dir_rewind                        (GDir *dir);
+

+Resets the given directory. The next call to g_dir_read_name() +will return the first entry again.

+
++ + + + +

dir :

a GDir* created by g_dir_open() +
+
+
+
+

g_dir_close ()

+
void                g_dir_close                         (GDir *dir);
+

+Closes the directory and deallocates all related resources.

+
++ + + + +

dir :

a GDir* created by g_dir_open() +
+
+
+
+

GMappedFile

+
typedef struct _GMappedFile GMappedFile;
+

+The GMappedFile represents a file mapping created with +g_mapped_file_new(). It has only private members and should +not be accessed directly. +

+
+
+
+

g_mapped_file_new ()

+
GMappedFile *       g_mapped_file_new                   (const gchar *filename,
+                                                         gboolean writable,
+                                                         GError **error);
+

+Maps a file into memory. On UNIX, this is using the mmap() function. +

+

+If writable is TRUE, the mapped buffer may be modified, otherwise +it is an error to modify the mapped buffer. Modifications to the buffer +are not visible to other processes mapping the same file, and are not +written back to the file. +

+

+Note that modifications of the underlying file might affect the contents +of the GMappedFile. Therefore, mapping should only be used if the file +will not be modified, or if all modifications of the file are done +atomically (e.g. using g_file_set_contents()).

+
++ + + + + + + + + + + + + + + + + + +

filename :

The path of the file to load, in the GLib filename encoding +

writable :

whether the mapping should be writable +

error :

return location for a GError, or NULL +

Returns :

a newly allocated GMappedFile which must be unref'd + with g_mapped_file_unref(), or NULL if the mapping failed. + +
+

Since 2.8

+
+
+
+

g_mapped_file_ref ()

+
GMappedFile *       g_mapped_file_ref                   (GMappedFile *file);
+

+Increments the reference count of file by one. It is safe to call +this function from any thread.

+
++ + + + + + + + + + +

file :

a GMappedFile +

Returns :

the passed in GMappedFile. + +
+

Since 2.22

+
+
+
+

g_mapped_file_unref ()

+
void                g_mapped_file_unref                 (GMappedFile *file);
+

+Decrements the reference count of file by one. If the reference count +drops to 0, unmaps the buffer of file and frees it. +

+

+It is safe to call this function from any thread. +

+

+Since 2.22

+
++ + + + +

file :

a GMappedFile +
+
+
+
+

g_mapped_file_free ()

+
void                g_mapped_file_free                  (GMappedFile *file);
+
+

Warning

+

g_mapped_file_free has been deprecated since version 2.22 and should not be used in newly-written code. Use g_mapped_file_unref() instead.

+
+

+This call existed before GMappedFile had refcounting and is currently +exactly the same as g_mapped_file_unref().

+
++ + + + +

file :

a GMappedFile +
+

Since 2.8

+
+
+
+

g_mapped_file_get_length ()

+
gsize               g_mapped_file_get_length            (GMappedFile *file);
+

+Returns the length of the contents of a GMappedFile.

+
++ + + + + + + + + + +

file :

a GMappedFile +

Returns :

the length of the contents of file. + +
+

Since 2.8

+
+
+
+

g_mapped_file_get_contents ()

+
gchar *             g_mapped_file_get_contents          (GMappedFile *file);
+

+Returns the contents of a GMappedFile. +

+

+Note that the contents may not be zero-terminated, +even if the GMappedFile is backed by a text file. +

+

+If the file is empty then NULL is returned.

+
++ + + + + + + + + + +

file :

a GMappedFile +

Returns :

the contents of file, or NULL. + +
+

Since 2.8

+
+
+
+

g_open ()

+
int                 g_open                              (const gchar *filename,
+                                                         int flags,
+                                                         int mode);
+

+A wrapper for the POSIX open() function. The open() function is +used to convert a pathname into a file descriptor. +

+

+On POSIX systems file descriptors are implemented by the operating +system. On Windows, it's the C library that implements open() and +file descriptors. The actual Win32 API for opening files is quite +different, see MSDN documentation for CreateFile(). The Win32 API +uses file handles, which are more randomish integers, not small +integers like file descriptors. +

+

+Because file descriptors are specific to the C library on Windows, +the file descriptor returned by this function makes sense only to +functions in the same C library. Thus if the GLib-using code uses a +different C library than GLib does, the file descriptor returned by +this function cannot be passed to C library functions like write() +or read(). +

+

+See your C library manual for more details about open().

+
++ + + + + + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

flags :

as in open() +

mode :

as in open() +

Returns :

a new file descriptor, or -1 if an error occurred. The +return value can be used exactly like the return value from open(). + +
+

Since 2.6

+
+
+
+

g_rename ()

+
int                 g_rename                            (const gchar *oldfilename,
+                                                         const gchar *newfilename);
+

+A wrapper for the POSIX rename() function. The rename() function +renames a file, moving it between directories if required. +

+

+See your C library manual for more details about how rename() works +on your system. It is not possible in general on Windows to rename +a file that is open to some process.

+
++ + + + + + + + + + + + + + +

oldfilename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

newfilename :

a pathname in the GLib file name encoding +

Returns :

0 if the renaming succeeded, -1 if an error occurred + +
+

Since 2.6

+
+
+
+

g_mkdir ()

+
int                 g_mkdir                             (const gchar *filename,
+                                                         int mode);
+

+A wrapper for the POSIX mkdir() function. The mkdir() function +attempts to create a directory with the given name and permissions. +The mode argument is ignored on Windows. +

+

+See your C library manual for more details about mkdir().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

mode :

permissions to use for the newly created directory +

Returns :

0 if the directory was successfully created, -1 if an error + occurred + +
+

Since 2.6

+
+
+
+

g_stat ()

+
int                 g_stat                              (const gchar *filename,
+                                                         struct _g_stat_struct *buf);
+

+A wrapper for the POSIX stat() function. The stat() function +returns information about a file. On Windows the stat() function in +the C library checks only the FAT-style READONLY attribute and does +not look at the ACL at all. Thus on Windows the protection bits in +the st_mode field are a fabrication of little use. +

+

+See your C library manual for more details about stat().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

buf :

a pointer to a stat struct, which + will be filled with the file information +

Returns :

0 if the information was successfully retrieved, -1 if an error + occurred + +
+

Since 2.6

+
+
+
+

g_lstat ()

+
int                 g_lstat                             (const gchar *filename,
+                                                         struct _g_stat_struct *buf);
+

+A wrapper for the POSIX lstat() function. The lstat() function is +like stat() except that in the case of symbolic links, it returns +information about the symbolic link itself and not the file that it +refers to. If the system does not support symbolic links g_lstat() +is identical to g_stat(). +

+

+See your C library manual for more details about lstat().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

buf :

a pointer to a stat struct, which + will be filled with the file information +

Returns :

0 if the information was successfully retrieved, -1 if an error + occurred + +
+

Since 2.6

+
+
+
+

g_unlink ()

+
int                 g_unlink                            (const gchar *filename);
+

+A wrapper for the POSIX unlink() function. The unlink() function +deletes a name from the filesystem. If this was the last link to the +file and no processes have it opened, the diskspace occupied by the +file is freed. +

+

+See your C library manual for more details about unlink(). Note +that on Windows, it is in general not possible to delete files that +are open to some process, or mapped into memory.

+
++ + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

Returns :

0 if the name was successfully deleted, -1 if an error + occurred + +
+

Since 2.6

+
+
+
+

g_remove ()

+
int                 g_remove                            (const gchar *filename);
+

+A wrapper for the POSIX remove() function. The remove() function +deletes a name from the filesystem. +

+

+See your C library manual for more details about how remove() works +on your system. On Unix, remove() removes also directories, as it +calls unlink() for files and rmdir() for directories. On Windows, +although remove() in the C library only works for files, this +function tries first remove() and then if that fails rmdir(), and +thus works for both files and directories. Note however, that on +Windows, it is in general not possible to remove a file that is +open to some process, or mapped into memory. +

+

+If this function fails on Windows you can't infer too much from the +errno value. rmdir() is tried regardless of what caused remove() to +fail. Any errno value set by remove() will be overwritten by that +set by rmdir().

+
++ + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

Returns :

0 if the file was successfully removed, -1 if an error + occurred + +
+

Since 2.6

+
+
+
+

g_rmdir ()

+
int                 g_rmdir                             (const gchar *filename);
+

+A wrapper for the POSIX rmdir() function. The rmdir() function +deletes a directory from the filesystem. +

+

+See your C library manual for more details about how rmdir() works +on your system.

+
++ + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

Returns :

0 if the directory was successfully removed, -1 if an error + occurred + +
+

Since 2.6

+
+
+
+

g_fopen ()

+
FILE *              g_fopen                             (const gchar *filename,
+                                                         const gchar *mode);
+

+A wrapper for the stdio fopen() function. The fopen() function +opens a file and associates a new stream with it. +

+

+Because file descriptors are specific to the C library on Windows, +and a file descriptor is partof the FILE struct, the +FILE pointer returned by this function makes sense +only to functions in the same C library. Thus if the GLib-using +code uses a different C library than GLib does, the +FILE pointer returned by this function cannot be +passed to C library functions like fprintf() or fread(). +

+

+See your C library manual for more details about fopen().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

mode :

a string describing the mode in which the file should be + opened +

Returns :

A FILE pointer if the file was successfully + opened, or NULL if an error occurred + +
+

Since 2.6

+
+
+
+

g_freopen ()

+
FILE *              g_freopen                           (const gchar *filename,
+                                                         const gchar *mode,
+                                                         FILE *stream);
+

+A wrapper for the POSIX freopen() function. The freopen() function +opens a file and associates it with an existing stream. +

+

+See your C library manual for more details about freopen().

+
++ + + + + + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

mode :

a string describing the mode in which the file should be + opened +

stream :

an existing stream which will be reused, or NULL +

Returns :

A FILE pointer if the file was successfully + opened, or NULL if an error occurred. + +
+

Since 2.6

+
+
+
+

g_chmod ()

+
int                 g_chmod                             (const gchar *filename,
+                                                         int mode);
+

+A wrapper for the POSIX chmod() function. The chmod() function is +used to set the permissions of a file system object. +

+

+On Windows the file protection mechanism is not at all POSIX-like, +and the underlying chmod() function in the C library just sets or +clears the FAT-style READONLY attribute. It does not touch any +ACL. Software that needs to manage file permissions on Windows +exactly should use the Win32 API. +

+

+See your C library manual for more details about chmod().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

mode :

as in chmod() +

Returns :

zero if the operation succeeded, -1 on error. + +
+

Since 2.8

+
+
+
+

g_access ()

+
int                 g_access                            (const gchar *filename,
+                                                         int mode);
+

+A wrapper for the POSIX access() function. This function is used to +test a pathname for one or several of read, write or execute +permissions, or just existence. +

+

+On Windows, the file protection mechanism is not at all POSIX-like, +and the underlying function in the C library only checks the +FAT-style READONLY attribute, and does not look at the ACL of a +file at all. This function is this in practise almost useless on +Windows. Software that needs to handle file permissions on Windows +more exactly should use the Win32 API. +

+

+See your C library manual for more details about access().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

mode :

as in access() +

Returns :

zero if the pathname refers to an existing file system +object that has all the tested permissions, or -1 otherwise or on +error. + +
+

Since 2.8

+
+
+
+

g_creat ()

+
int                 g_creat                             (const gchar *filename,
+                                                         int mode);
+

+A wrapper for the POSIX creat() function. The creat() function is +used to convert a pathname into a file descriptor, creating a file +if necessary. +

+

+On POSIX systems file descriptors are implemented by the operating +system. On Windows, it's the C library that implements creat() and +file descriptors. The actual Windows API for opening files is +different, see MSDN documentation for CreateFile(). The Win32 API +uses file handles, which are more randomish integers, not small +integers like file descriptors. +

+

+Because file descriptors are specific to the C library on Windows, +the file descriptor returned by this function makes sense only to +functions in the same C library. Thus if the GLib-using code uses a +different C library than GLib does, the file descriptor returned by +this function cannot be passed to C library functions like write() +or read(). +

+

+See your C library manual for more details about creat().

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

mode :

as in creat() +

Returns :

a new file descriptor, or -1 if an error occurred. The +return value can be used exactly like the return value from creat(). + +
+

Since 2.8

+
+
+
+

g_chdir ()

+
int                 g_chdir                             (const gchar *path);
+

+A wrapper for the POSIX chdir() function. The function changes the +current directory of the process to path. +

+

+See your C library manual for more details about chdir().

+
++ + + + + + + + + + +

path :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

Returns :

0 on success, -1 if an error occurred. + +
+

Since 2.8

+
+
+
+

g_utime ()

+
int                 g_utime                             (const gchar *filename,
+                                                         struct utimbuf *utb);
+

+A wrapper for the POSIX utime() function. The utime() function +sets the access and modification timestamps of a file. +

+

+See your C library manual for more details about how utime() works +on your system.

+
++ + + + + + + + + + + + + + +

filename :

a pathname in the GLib file name encoding (UTF-8 on Windows) +

utb :

a pointer to a struct utimbuf. +

Returns :

0 if the operation was successful, -1 if an error + occurred + +
+

Since 2.18

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-GVariant.html b/docs/reference/glib/html/glib-GVariant.html new file mode 100644 index 0000000..e22d687 --- /dev/null +++ b/docs/reference/glib/html/glib-GVariant.html @@ -0,0 +1,3639 @@ + + + + +GVariant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GVariant

+

GVariant — strongly typed value datatype

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GVariant;
+void                g_variant_unref                     (GVariant *value);
+GVariant *          g_variant_ref                       (GVariant *value);
+GVariant *          g_variant_ref_sink                  (GVariant *value);
+const GVariantType * g_variant_get_type                 (GVariant *value);
+const gchar *       g_variant_get_type_string           (GVariant *value);
+gboolean            g_variant_is_of_type                (GVariant *value,
+                                                         const GVariantType *type);
+gboolean            g_variant_is_container              (GVariant *value);
+
+GVariantClass       g_variant_classify                  (GVariant *value);
+enum                GVariantClass;
+
+void                g_variant_get                       (GVariant *value,
+                                                         const gchar *format_string,
+                                                         ...);
+void                g_variant_get_va                    (GVariant *value,
+                                                         const gchar *format_string,
+                                                         const gchar **endptr,
+                                                         va_list *app);
+GVariant *          g_variant_new                       (const gchar *format_string,
+                                                         ...);
+GVariant *          g_variant_new_va                    (const gchar *format_string,
+                                                         const gchar **endptr,
+                                                         va_list *app);
+
+GVariant *          g_variant_new_boolean               (gboolean boolean);
+GVariant *          g_variant_new_byte                  (guchar byte);
+GVariant *          g_variant_new_int16                 (gint16 int16);
+GVariant *          g_variant_new_uint16                (guint16 uint16);
+GVariant *          g_variant_new_int32                 (gint32 int32);
+GVariant *          g_variant_new_uint32                (guint32 uint32);
+GVariant *          g_variant_new_int64                 (gint64 int64);
+GVariant *          g_variant_new_uint64                (guint64 uint64);
+GVariant *          g_variant_new_handle                (gint32 handle);
+GVariant *          g_variant_new_double                (gdouble floating);
+GVariant *          g_variant_new_string                (const gchar *string);
+GVariant *          g_variant_new_object_path           (const gchar *object_path);
+gboolean            g_variant_is_object_path            (const gchar *string);
+GVariant *          g_variant_new_signature             (const gchar *signature);
+gboolean            g_variant_is_signature              (const gchar *string);
+GVariant *          g_variant_new_variant               (GVariant *value);
+GVariant *          g_variant_new_strv                  (const gchar * const *strv,
+                                                         gssize length);
+
+gboolean            g_variant_get_boolean               (GVariant *value);
+guchar              g_variant_get_byte                  (GVariant *value);
+gint16              g_variant_get_int16                 (GVariant *value);
+guint16             g_variant_get_uint16                (GVariant *value);
+gint32              g_variant_get_int32                 (GVariant *value);
+guint32             g_variant_get_uint32                (GVariant *value);
+gint64              g_variant_get_int64                 (GVariant *value);
+guint64             g_variant_get_uint64                (GVariant *value);
+gint32              g_variant_get_handle                (GVariant *value);
+gdouble             g_variant_get_double                (GVariant *value);
+const gchar *       g_variant_get_string                (GVariant *value,
+                                                         gsize *length);
+gchar *             g_variant_dup_string                (GVariant *value,
+                                                         gsize *length);
+GVariant *          g_variant_get_variant               (GVariant *value);
+const gchar **      g_variant_get_strv                  (GVariant *value,
+                                                         gsize *length);
+gchar **            g_variant_dup_strv                  (GVariant *value,
+                                                         gsize *length);
+
+GVariant *          g_variant_new_maybe                 (const GVariantType *child_type,
+                                                         GVariant *child);
+GVariant *          g_variant_new_array                 (const GVariantType *child_type,
+                                                         GVariant * const *children,
+                                                         gsize n_children);
+GVariant *          g_variant_new_tuple                 (GVariant * const *children,
+                                                         gsize n_children);
+GVariant *          g_variant_new_dict_entry            (GVariant *key,
+                                                         GVariant *value);
+
+GVariant *          g_variant_get_maybe                 (GVariant *value);
+gsize               g_variant_n_children                (GVariant *value);
+GVariant *          g_variant_get_child_value           (GVariant *value,
+                                                         gsize index_);
+void                g_variant_get_child                 (GVariant *value,
+                                                         gsize index_,
+                                                         const gchar *format_string,
+                                                         ...);
+gconstpointer       g_variant_get_fixed_array           (GVariant *value,
+                                                         gsize *n_elements,
+                                                         gsize element_size);
+
+gsize               g_variant_get_size                  (GVariant *value);
+gconstpointer       g_variant_get_data                  (GVariant *value);
+void                g_variant_store                     (GVariant *value,
+                                                         gpointer data);
+GVariant *          g_variant_new_from_data             (const GVariantType *type,
+                                                         gconstpointer data,
+                                                         gsize size,
+                                                         gboolean trusted,
+                                                         GDestroyNotify notify,
+                                                         gpointer user_data);
+GVariant *          g_variant_byteswap                  (GVariant *value);
+GVariant *          g_variant_get_normal_form           (GVariant *value);
+gboolean            g_variant_is_normal_form            (GVariant *value);
+
+guint               g_variant_hash                      (gconstpointer value);
+gboolean            g_variant_equal                     (gconstpointer one,
+                                                         gconstpointer two);
+
+gchar *             g_variant_print                     (GVariant *value,
+                                                         gboolean type_annotate);
+GString *           g_variant_print_string              (GVariant *value,
+                                                         GString *string,
+                                                         gboolean type_annotate);
+
+                    GVariantIter;
+GVariantIter *      g_variant_iter_copy                 (GVariantIter *iter);
+void                g_variant_iter_free                 (GVariantIter *iter);
+gsize               g_variant_iter_init                 (GVariantIter *iter,
+                                                         GVariant *value);
+gsize               g_variant_iter_n_children           (GVariantIter *iter);
+GVariantIter *      g_variant_iter_new                  (GVariant *value);
+GVariant *          g_variant_iter_next_value           (GVariantIter *iter);
+gboolean            g_variant_iter_next                 (GVariantIter *iter,
+                                                         const gchar *format_string,
+                                                         ...);
+gboolean            g_variant_iter_loop                 (GVariantIter *iter,
+                                                         const gchar *format_string,
+                                                         ...);
+
+                    GVariantBuilder;
+void                g_variant_builder_unref             (GVariantBuilder *builder);
+GVariantBuilder *   g_variant_builder_ref               (GVariantBuilder *builder);
+GVariantBuilder *   g_variant_builder_new               (const GVariantType *type);
+void                g_variant_builder_init              (GVariantBuilder *builder,
+                                                         const GVariantType *type);
+void                g_variant_builder_clear             (GVariantBuilder *builder);
+void                g_variant_builder_add_value         (GVariantBuilder *builder,
+                                                         GVariant *value);
+void                g_variant_builder_add               (GVariantBuilder *builder,
+                                                         const gchar *format_string,
+                                                         ...);
+GVariant *          g_variant_builder_end               (GVariantBuilder *builder);
+void                g_variant_builder_open              (GVariantBuilder *builder,
+                                                         const GVariantType *type);
+void                g_variant_builder_close             (GVariantBuilder *builder);
+
+#define             G_VARIANT_PARSE_ERROR
+GVariant *          g_variant_parse                     (const GVariantType *type,
+                                                         const gchar *text,
+                                                         const gchar *limit,
+                                                         const gchar **endptr,
+                                                         GError **error);
+GVariant *          g_variant_new_parsed_va             (const gchar *format,
+                                                         va_list *app);
+GVariant *          g_variant_new_parsed                (const gchar *format,
+                                                         ...);
+
+
+
+

Description

+

+GVariant is a variant datatype; it stores a value along with +information about the type of that value. The range of possible +values is determined by the type. The type system used by GVariant +is GVariantType. +

+

+GVariant instances always have a type and a value (which are given +at construction time). The type and value of a GVariant instance +can never change other than by the GVariant itself being +destroyed. A GVariant can not contain a pointer. +

+

+GVariant is reference counted using g_variant_ref() and +g_variant_unref(). GVariant also has floating reference counts -- +see g_variant_ref_sink(). +

+

+GVariant is completely threadsafe. A GVariant instance can be +concurrently accessed in any way from any number of threads without +problems. +

+

+GVariant is heavily optimised for dealing with data in serialised +form. It works particularly well with data located in memory-mapped +files. It can perform nearly all deserialisation operations in a +small constant time, usually touching only a single memory page. +Serialised GVariant data can also be sent over the network. +

+

+GVariant is largely compatible with DBus. Almost all types of +GVariant instances can be sent over DBus. See GVariantType for +exceptions. +

+

+For convenience to C programmers, GVariant features powerful +varargs-based value construction and destruction. This feature is +designed to be embedded in other libraries. +

+

+There is a Python-inspired text language for describing GVariant +values. GVariant includes a printer for this language and a parser +with type inferencing. +

+

+

+
+

Memory Use

+

+ GVariant tries to be quite efficient with respect to memory use. + This section gives a rough idea of how much memory is used by the + current implementation. The information here is subject to change + in the future. +

+

+ The memory allocated by GVariant can be grouped into 4 broad + purposes: memory for serialised data, memory for the type + information cache, buffer management memory and memory for the + GVariant structure itself. +

+
+

Serialised Data Memory

+

+ This is the memory that is used for storing GVariant data in + serialised form. This is what would be sent over the network or + what would end up on disk. +

+

+ The amount of memory required to store a boolean is 1 byte. 16, + 32 and 64 bit integers and double precision floating point numbers + use their "natural" size. Strings (including object path and + signature strings) are stored with a nul terminator, and as such + use the length of the string plus 1 byte. +

+

+ Maybe types use no space at all to represent the null value and + use the same amount of space (sometimes plus one byte) as the + equivalent non-maybe-typed value to represent the non-null case. +

+

+ Arrays use the amount of space required to store each of their + members, concatenated. Additionally, if the items stored in an + array are not of a fixed-size (ie: strings, other arrays, etc) + then an additional framing offset is stored for each item. The + size of this offset is either 1, 2 or 4 bytes depending on the + overall size of the container. Additionally, extra padding bytes + are added as required for alignment of child values. +

+

+ Tuples (including dictionary entries) use the amount of space + required to store each of their members, concatenated, plus one + framing offset (as per arrays) for each non-fixed-sized item in + the tuple, except for the last one. Additionally, extra padding + bytes are added as required for alignment of child values. +

+

+ Variants use the same amount of space as the item inside of the + variant, plus 1 byte, plus the length of the type string for the + item inside the variant. +

+

+ As an example, consider a dictionary mapping strings to variants. + In the case that the dictionary is empty, 0 bytes are required for + the serialisation. +

+

+ If we add an item "width" that maps to the int32 value of 500 then + we will use 4 byte to store the int32 (so 6 for the variant + containing it) and 6 bytes for the string. The variant must be + aligned to 8 after the 6 bytes of the string, so that's 2 extra + bytes. 6 (string) + 2 (padding) + 6 (variant) is 14 bytes used + for the dictionary entry. An additional 1 byte is added to the + array as a framing offset making a total of 15 bytes. +

+

+ If we add another entry, "title" that maps to a nullable string + that happens to have a value of null, then we use 0 bytes for the + null value (and 3 bytes for the variant to contain it along with + its type string) plus 6 bytes for the string. Again, we need 2 + padding bytes. That makes a total of 6 + 2 + 3 = 11 bytes. +

+

+ We now require extra padding between the two items in the array. + After the 14 bytes of the first item, that's 2 bytes required. We + now require 2 framing offsets for an extra two bytes. 14 + 2 + 11 + + 2 = 29 bytes to encode the entire two-item dictionary. +

+
+
+

Type Information Cache

+

+ For each GVariant type that currently exists in the program a type + information structure is kept in the type information cache. The + type information structure is required for rapid deserialisation. +

+

+ Continuing with the above example, if a GVariant exists with the + type "a{sv}" then a type information struct will exist for + "a{sv}", "{sv}", "s", and "v". Multiple uses of the same type + will share the same type information. Additionally, all + single-digit types are stored in read-only static memory and do + not contribute to the writable memory footprint of a program using + GVariant. +

+

+ Aside from the type information structures stored in read-only + memory, there are two forms of type information. One is used for + container types where there is a single element type: arrays and + maybe types. The other is used for container types where there + are multiple element types: tuples and dictionary entries. +

+

+ Array type info structures are 6 * sizeof (void *), plus the + memory required to store the type string itself. This means that + on 32bit systems, the cache entry for "a{sv}" would require 30 + bytes of memory (plus malloc overhead). +

+

+ Tuple type info structures are 6 * sizeof (void *), plus 4 * + sizeof (void *) for each item in the tuple, plus the memory + required to store the type string itself. A 2-item tuple, for + example, would have a type information structure that consumed + writable memory in the size of 14 * sizeof (void *) (plus type + string) This means that on 32bit systems, the cache entry for + "{sv}" would require 61 bytes of memory (plus malloc overhead). +

+

+ This means that in total, for our "a{sv}" example, 91 bytes of + type information would be allocated. +

+

+ The type information cache, additionally, uses a GHashTable to + store and lookup the cached items and stores a pointer to this + hash table in static storage. The hash table is freed when there + are zero items in the type cache. +

+

+ Although these sizes may seem large it is important to remember + that a program will probably only have a very small number of + different types of values in it and that only one type information + structure is required for many different values of the same type. +

+
+
+

Buffer Management Memory

+

+ GVariant uses an internal buffer management structure to deal + with the various different possible sources of serialised data + that it uses. The buffer is responsible for ensuring that the + correct call is made when the data is no longer in use by + GVariant. This may involve a g_free() or a g_slice_free() or + even g_mapped_file_unref(). +

+

+ One buffer management structure is used for each chunk of + serialised data. The size of the buffer management structure is 4 + * (void *). On 32bit systems, that's 16 bytes. +

+
+
+

GVariant structure

+

+ The size of a GVariant structure is 6 * (void *). On 32 bit + systems, that's 24 bytes. +

+

+ GVariant structures only exist if they are explicitly created + with API calls. For example, if a GVariant is constructed out of + serialised data for the example given above (with the dictionary) + then although there are 9 individual values that comprise the + entire dictionary (two keys, two values, two variants containing + the values, two dictionary entries, plus the dictionary itself), + only 1 GVariant instance exists -- the one refering to the + dictionary. +

+

+ If calls are made to start accessing the other values then + GVariant instances will exist for those values only for as long + as they are in use (ie: until you call g_variant_unref()). The + type information is shared. The serialised data and the buffer + management structure for that serialised data is shared by the + child. +

+
+
+

Summary

+

+ To put the entire example together, for our dictionary mapping + strings to variants (with two entries, as given above), we are + using 91 bytes of memory for type information, 29 byes of memory + for the serialised data, 16 bytes for buffer management and 24 + bytes for the GVariant instance, or a total of 160 bytes, plus + malloc overhead. If we were to use g_variant_get_child_value() to + access the two dictionary entries, we would use an additional 48 + bytes. If we were to have other dictionaries of the same type, we + would use more memory for the serialised data and buffer + management for those dictionaries, but the type information would + be shared. +

+
+
+
+
+

Details

+
+

GVariant

+
typedef struct _GVariant GVariant;
+

+GVariant is an opaque data structure and can only be accessed +using the following functions.

+

Since 2.24

+
+
+
+

g_variant_unref ()

+
void                g_variant_unref                     (GVariant *value);
+

+Decreases the reference count of value. When its reference count +drops to 0, the memory used by the variant is freed.

+
++ + + + +

value :

a GVariant +
+

Since 2.24

+
+
+
+

g_variant_ref ()

+
GVariant *          g_variant_ref                       (GVariant *value);
+

+Increases the reference count of value.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

the same value +
+

Since 2.24

+
+
+
+

g_variant_ref_sink ()

+
GVariant *          g_variant_ref_sink                  (GVariant *value);
+

+GVariant uses a floating reference count system. All functions with +names starting with g_variant_new_ return floating +references. +

+

+Calling g_variant_ref_sink() on a GVariant with a floating reference +will convert the floating reference into a full reference. Calling +g_variant_ref_sink() on a non-floating GVariant results in an +additional normal reference being added. +

+

+In other words, if the value is floating, then this call "assumes +ownership" of the floating reference, converting it to a normal +reference. If the value is not floating, then this call adds a +new normal reference increasing the reference count by one. +

+

+All calls that result in a GVariant instance being inserted into a +container will call g_variant_ref_sink() on the instance. This means +that if the value was just created (and has only its floating +reference) then the container will assume sole ownership of the value +at that point and the caller will not need to unreference it. This +makes certain common styles of programming much easier while still +maintaining normal refcounting semantics in situations where values +are not floating.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

the same value +
+

Since 2.24

+
+
+
+

g_variant_get_type ()

+
const GVariantType * g_variant_get_type                 (GVariant *value);
+

+Determines the type of value. +

+

+The return value is valid for the lifetime of value and must not +be freed.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

a GVariantType +
+

Since 2.24

+
+
+
+

g_variant_get_type_string ()

+
const gchar *       g_variant_get_type_string           (GVariant *value);
+

+Returns the type string of value. Unlike the result of calling +g_variant_type_peek_string(), this string is nul-terminated. This +string belongs to GVariant and must not be freed.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

the type string for the type of value +
+

Since 2.24

+
+
+
+

g_variant_is_of_type ()

+
gboolean            g_variant_is_of_type                (GVariant *value,
+                                                         const GVariantType *type);
+

+Checks if a value has a type matching the provided type.

+
++ + + + + + + + + + + + + + +

value :

a GVariant instance +

type :

a GVariantType +

Returns :

TRUE if the type of value matches type +
+

Since 2.24

+
+
+
+

g_variant_is_container ()

+
gboolean            g_variant_is_container              (GVariant *value);
+

+Checks if value is a container.

+
++ + + + + + + + + + +

value :

a GVariant instance +

Returns :

TRUE if value is a container +
+
+
+
+

g_variant_classify ()

+
GVariantClass       g_variant_classify                  (GVariant *value);
+

+Classifies value according to its top-level type.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

the GVariantClass of value +
+

Since 2.24

+
+
+
+

enum GVariantClass

+
typedef enum
+{
+  G_VARIANT_CLASS_BOOLEAN       = 'b',
+  G_VARIANT_CLASS_BYTE          = 'y',
+  G_VARIANT_CLASS_INT16         = 'n',
+  G_VARIANT_CLASS_UINT16        = 'q',
+  G_VARIANT_CLASS_INT32         = 'i',
+  G_VARIANT_CLASS_UINT32        = 'u',
+  G_VARIANT_CLASS_INT64         = 'x',
+  G_VARIANT_CLASS_UINT64        = 't',
+  G_VARIANT_CLASS_HANDLE        = 'h',
+  G_VARIANT_CLASS_DOUBLE        = 'd',
+  G_VARIANT_CLASS_STRING        = 's',
+  G_VARIANT_CLASS_OBJECT_PATH   = 'o',
+  G_VARIANT_CLASS_SIGNATURE     = 'g',
+  G_VARIANT_CLASS_VARIANT       = 'v',
+  G_VARIANT_CLASS_MAYBE         = 'm',
+  G_VARIANT_CLASS_ARRAY         = 'a',
+  G_VARIANT_CLASS_TUPLE         = '(',
+  G_VARIANT_CLASS_DICT_ENTRY    = '{'
+} GVariantClass;
+
+

+The range of possible top-level types of GVariant instances.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_VARIANT_CLASS_BOOLEAN

The GVariant is a boolean. +

G_VARIANT_CLASS_BYTE

The GVariant is a byte. +

G_VARIANT_CLASS_INT16

The GVariant is a signed 16 bit integer. +

G_VARIANT_CLASS_UINT16

The GVariant is an unsigned 16 bit integer. +

G_VARIANT_CLASS_INT32

The GVariant is a signed 32 bit integer. +

G_VARIANT_CLASS_UINT32

The GVariant is an unsigned 32 bit integer. +

G_VARIANT_CLASS_INT64

The GVariant is a signed 64 bit integer. +

G_VARIANT_CLASS_UINT64

The GVariant is an unsigned 64 bit integer. +

G_VARIANT_CLASS_HANDLE

The GVariant is a file handle index. +

G_VARIANT_CLASS_DOUBLE

The GVariant is a double precision floating + point value. +

G_VARIANT_CLASS_STRING

The GVariant is a normal string. +

G_VARIANT_CLASS_OBJECT_PATH

The GVariant is a DBus object path + string. +

G_VARIANT_CLASS_SIGNATURE

The GVariant is a DBus signature string. +

G_VARIANT_CLASS_VARIANT

The GVariant is a variant. +

G_VARIANT_CLASS_MAYBE

The GVariant is a maybe-typed value. +

G_VARIANT_CLASS_ARRAY

The GVariant is an array. +

G_VARIANT_CLASS_TUPLE

The GVariant is a tuple. +

G_VARIANT_CLASS_DICT_ENTRY

The GVariant is a dictionary entry. +
+

Since 2.24

+
+
+
+

g_variant_get ()

+
void                g_variant_get                       (GVariant *value,
+                                                         const gchar *format_string,
+                                                         ...);
+

+Deconstructs a GVariant instance. +

+

+Think of this function as an analogue to scanf(). +

+

+The arguments that are expected by this function are entirely +determined by format_string. format_string also restricts the +permissible types of value. It is an error to give a value with +an incompatible type. See the section on GVariant Format Strings. +Please note that the syntax of the format string is very likely to be +extended in the future.

+
++ + + + + + + + + + + + + + +

value :

a GVariant instance +

format_string :

a GVariant format string +

... :

arguments, as per format_string +
+

Since 2.24

+
+
+
+

g_variant_get_va ()

+
void                g_variant_get_va                    (GVariant *value,
+                                                         const gchar *format_string,
+                                                         const gchar **endptr,
+                                                         va_list *app);
+

+This function is intended to be used by libraries based on GVariant +that want to provide g_variant_get()-like functionality to their +users. +

+

+The API is more general than g_variant_get() to allow a wider range +of possible uses. +

+

+format_string must still point to a valid format string, but it only +need to be nul-terminated if endptr is NULL. If endptr is +non-NULL then it is updated to point to the first character past the +end of the format string. +

+

+app is a pointer to a va_list. The arguments, according to +format_string, are collected from this va_list and the list is left +pointing to the argument following the last. +

+

+These two generalisations allow mixing of multiple calls to +g_variant_new_va() and g_variant_get_va() within a single actual +varargs call by the user.

+
++ + + + + + + + + + + + + + + + + + +

value :

a GVariant +

format_string :

a string that is prefixed with a format string +

endptr :

location to store the end pointer, or NULL +

app :

a pointer to a va_list +
+

Since 2.24

+
+
+
+

g_variant_new ()

+
GVariant *          g_variant_new                       (const gchar *format_string,
+                                                         ...);
+

+Creates a new GVariant instance. +

+

+Think of this function as an analogue to g_strdup_printf(). +

+

+The type of the created instance and the arguments that are +expected by this function are determined by format_string. See the +section on GVariant Format +Strings. Please note that the syntax of the format string is +very likely to be extended in the future. +

+

+The first character of the format string must not be '*' '?' '@' or +'r'; in essence, a new GVariant must always be constructed by this +function (and not merely passed through it unmodified).

+
++ + + + + + + + + + + + + + +

format_string :

a GVariant format string +

... :

arguments, as per format_string +

Returns :

a new floating GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_va ()

+
GVariant *          g_variant_new_va                    (const gchar *format_string,
+                                                         const gchar **endptr,
+                                                         va_list *app);
+

+This function is intended to be used by libraries based on +GVariant that want to provide g_variant_new()-like functionality +to their users. +

+

+The API is more general than g_variant_new() to allow a wider range +of possible uses. +

+

+format_string must still point to a valid format string, but it only +needs to be nul-terminated if endptr is NULL. If endptr is +non-NULL then it is updated to point to the first character past the +end of the format string. +

+

+app is a pointer to a va_list. The arguments, according to +format_string, are collected from this va_list and the list is left +pointing to the argument following the last. +

+

+These two generalisations allow mixing of multiple calls to +g_variant_new_va() and g_variant_get_va() within a single actual +varargs call by the user. +

+

+The return value will be floating if it was a newly created GVariant +instance (for example, if the format string was "(ii)"). In the case +that the format_string was '*', '?', 'r', or a format starting with +'@' then the collected GVariant pointer will be returned unmodified, +without adding any additional references. +

+

+In order to behave correctly in all cases it is necessary for the +calling function to g_variant_ref_sink() the return result before +returning control to the user that originally provided the pointer. +At this point, the caller will have their own full reference to the +result. This can also be done by adding the result to a container, +or by passing it to another g_variant_new() call.

+
++ + + + + + + + + + + + + + + + + + +

format_string :

a string that is prefixed with a format string +

endptr :

location to store the end pointer, or NULL +

app :

a pointer to a va_list +

Returns :

a new, usually floating, GVariant +
+

Since 2.24

+
+
+
+

g_variant_new_boolean ()

+
GVariant *          g_variant_new_boolean               (gboolean boolean);
+

+Creates a new boolean GVariant instance -- either TRUE or FALSE.

+
++ + + + + + + + + + +

boolean :

a gboolean value +

Returns :

a new boolean GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_byte ()

+
GVariant *          g_variant_new_byte                  (guchar byte);
+

+Creates a new byte GVariant instance.

+
++ + + + + + + + + + +

byte :

a guint8 value +

Returns :

a new byte GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_int16 ()

+
GVariant *          g_variant_new_int16                 (gint16 int16);
+

+Creates a new int16 GVariant instance.

+
++ + + + + + + + + + +

int16 :

a gint16 value +

Returns :

a new int16 GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_uint16 ()

+
GVariant *          g_variant_new_uint16                (guint16 uint16);
+

+Creates a new uint16 GVariant instance.

+
++ + + + + + + + + + +

uint16 :

a guint16 value +

Returns :

a new uint16 GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_int32 ()

+
GVariant *          g_variant_new_int32                 (gint32 int32);
+

+Creates a new int32 GVariant instance.

+
++ + + + + + + + + + +

int32 :

a gint32 value +

Returns :

a new int32 GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_uint32 ()

+
GVariant *          g_variant_new_uint32                (guint32 uint32);
+

+Creates a new uint32 GVariant instance.

+
++ + + + + + + + + + +

uint32 :

a guint32 value +

Returns :

a new uint32 GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_int64 ()

+
GVariant *          g_variant_new_int64                 (gint64 int64);
+

+Creates a new int64 GVariant instance.

+
++ + + + + + + + + + +

int64 :

a gint64 value +

Returns :

a new int64 GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_uint64 ()

+
GVariant *          g_variant_new_uint64                (guint64 uint64);
+

+Creates a new uint64 GVariant instance.

+
++ + + + + + + + + + +

uint64 :

a guint64 value +

Returns :

a new uint64 GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_handle ()

+
GVariant *          g_variant_new_handle                (gint32 handle);
+

+Creates a new handle GVariant instance. +

+

+By convention, handles are indexes into an array of file descriptors +that are sent alongside a DBus message. If you're not interacting +with DBus, you probably don't need them.

+
++ + + + + + + + + + +

handle :

a gint32 value +

Returns :

a new handle GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_double ()

+
GVariant *          g_variant_new_double                (gdouble floating);
+

+Creates a new double GVariant instance.

+
++ + + + + + + + + + +

floating :

a gdouble floating point value +

Returns :

a new double GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_string ()

+
GVariant *          g_variant_new_string                (const gchar *string);
+

+Creates a string GVariant with the contents of string.

+
++ + + + + + + + + + +

string :

a normal C nul-terminated string +

Returns :

a new string GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_object_path ()

+
GVariant *          g_variant_new_object_path           (const gchar *object_path);
+

+Creates a DBus object path GVariant with the contents of string. +string must be a valid DBus object path. Use +g_variant_is_object_path() if you're not sure.

+
++ + + + + + + + + + +

object_path :

a normal C nul-terminated string +

Returns :

a new object path GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_is_object_path ()

+
gboolean            g_variant_is_object_path            (const gchar *string);
+

+Determines if a given string is a valid DBus object path. You +should ensure that a string is a valid DBus object path before +passing it to g_variant_new_object_path(). +

+

+A valid object path starts with '/' followed by zero or more +sequences of characters separated by '/' characters. Each sequence +must contain only the characters "[A-Z][a-z][0-9]_". No sequence +(including the one following the final '/' character) may be empty.

+
++ + + + + + + + + + +

string :

a normal C nul-terminated string +

Returns :

TRUE if string is a DBus object path +
+

Since 2.24

+
+
+
+

g_variant_new_signature ()

+
GVariant *          g_variant_new_signature             (const gchar *signature);
+

+Creates a DBus type signature GVariant with the contents of +string. string must be a valid DBus type signature. Use +g_variant_is_signature() if you're not sure.

+
++ + + + + + + + + + +

signature :

a normal C nul-terminated string +

Returns :

a new signature GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_is_signature ()

+
gboolean            g_variant_is_signature              (const gchar *string);
+

+Determines if a given string is a valid DBus type signature. You +should ensure that a string is a valid DBus object path before +passing it to g_variant_new_signature(). +

+

+DBus type signatures consist of zero or more definite GVariantType +strings in sequence.

+
++ + + + + + + + + + +

string :

a normal C nul-terminated string +

Returns :

TRUE if string is a DBus type signature +
+

Since 2.24

+
+
+
+

g_variant_new_variant ()

+
GVariant *          g_variant_new_variant               (GVariant *value);
+

+Boxes value. The result is a GVariant instance representing a +variant containing the original value.

+
++ + + + + + + + + + +

value :

a GVariance instance +

Returns :

a new variant GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_new_strv ()

+
GVariant *          g_variant_new_strv                  (const gchar * const *strv,
+                                                         gssize length);
+

+Constructs an array of strings GVariant from the given array of +strings. +

+

+If length is not -1 then it gives the maximum length of strv. In +any case, a NULL pointer in strv is taken as a terminator.

+
++ + + + + + + + + + + + + + +

strv :

an array of strings +

length :

the length of strv, or -1 +

Returns :

a new floating GVariant instance +
+

Since 2.24

+
+
+
+

g_variant_get_boolean ()

+
gboolean            g_variant_get_boolean               (GVariant *value);
+

+Returns the boolean value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_BOOLEAN.

+
++ + + + + + + + + + +

value :

a boolean GVariant instance +

Returns :

TRUE or FALSE +
+

Since 2.24

+
+
+
+

g_variant_get_byte ()

+
guchar              g_variant_get_byte                  (GVariant *value);
+

+Returns the byte value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_BYTE.

+
++ + + + + + + + + + +

value :

a byte GVariant instance +

Returns :

a guchar +
+

Since 2.24

+
+
+
+

g_variant_get_int16 ()

+
gint16              g_variant_get_int16                 (GVariant *value);
+

+Returns the 16-bit signed integer value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_INT16.

+
++ + + + + + + + + + +

value :

a int16 GVariant instance +

Returns :

a gint16 +
+

Since 2.24

+
+
+
+

g_variant_get_uint16 ()

+
guint16             g_variant_get_uint16                (GVariant *value);
+

+Returns the 16-bit unsigned integer value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_UINT16.

+
++ + + + + + + + + + +

value :

a uint16 GVariant instance +

Returns :

a guint16 +
+

Since 2.24

+
+
+
+

g_variant_get_int32 ()

+
gint32              g_variant_get_int32                 (GVariant *value);
+

+Returns the 32-bit signed integer value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_INT32.

+
++ + + + + + + + + + +

value :

a int32 GVariant instance +

Returns :

a gint32 +
+

Since 2.24

+
+
+
+

g_variant_get_uint32 ()

+
guint32             g_variant_get_uint32                (GVariant *value);
+

+Returns the 32-bit unsigned integer value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_UINT32.

+
++ + + + + + + + + + +

value :

a uint32 GVariant instance +

Returns :

a guint32 +
+

Since 2.24

+
+
+
+

g_variant_get_int64 ()

+
gint64              g_variant_get_int64                 (GVariant *value);
+

+Returns the 64-bit signed integer value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_INT64.

+
++ + + + + + + + + + +

value :

a int64 GVariant instance +

Returns :

a gint64 +
+

Since 2.24

+
+
+
+

g_variant_get_uint64 ()

+
guint64             g_variant_get_uint64                (GVariant *value);
+

+Returns the 64-bit unsigned integer value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_UINT64.

+
++ + + + + + + + + + +

value :

a uint64 GVariant instance +

Returns :

a guint64 +
+

Since 2.24

+
+
+
+

g_variant_get_handle ()

+
gint32              g_variant_get_handle                (GVariant *value);
+

+Returns the 32-bit signed integer value of value. +

+

+It is an error to call this function with a value of any type other +than G_VARIANT_TYPE_HANDLE. +

+

+By convention, handles are indexes into an array of file descriptors +that are sent alongside a DBus message. If you're not interacting +with DBus, you probably don't need them.

+
++ + + + + + + + + + +

value :

a handle GVariant instance +

Returns :

a gint32 +
+

Since 2.24

+
+
+
+

g_variant_get_double ()

+
gdouble             g_variant_get_double                (GVariant *value);
+

+Returns the double precision floating point value of value. +

+

+It is an error to call this function with a value of any type +other than G_VARIANT_TYPE_DOUBLE.

+
++ + + + + + + + + + +

value :

a double GVariant instance +

Returns :

a gdouble +
+

Since 2.24

+
+
+
+

g_variant_get_string ()

+
const gchar *       g_variant_get_string                (GVariant *value,
+                                                         gsize *length);
+

+Returns the string value of a GVariant instance with a string +type. This includes the types G_VARIANT_TYPE_STRING, +G_VARIANT_TYPE_OBJECT_PATH and G_VARIANT_TYPE_SIGNATURE. +

+

+If length is non-NULL then the length of the string (in bytes) is +returned there. For trusted values, this information is already +known. For untrusted values, a strlen() will be performed. +

+

+It is an error to call this function with a value of any type +other than those three. +

+

+The return value remains valid as long as value exists.

+
++ + + + + + + + + + + + + + +

value :

a string GVariant instance +

length :

a pointer to a gsize, to store the length +

Returns :

the constant string +
+

Since 2.24

+
+
+
+

g_variant_dup_string ()

+
gchar *             g_variant_dup_string                (GVariant *value,
+                                                         gsize *length);
+

+Similar to g_variant_get_string() except that instead of returning +a constant string, the string is duplicated. +

+

+The return value must be freed using g_free().

+
++ + + + + + + + + + + + + + +

value :

a string GVariant instance +

length :

a pointer to a gsize, to store the length +

Returns :

a newly allocated string +
+

Since 2.24

+
+
+
+

g_variant_get_variant ()

+
GVariant *          g_variant_get_variant               (GVariant *value);
+

+Unboxes value. The result is the GVariant instance that was +contained in value.

+
++ + + + + + + + + + +

value :

a variant GVariance instance +

Returns :

the item contained in the variant +
+

Since 2.24

+
+
+
+

g_variant_get_strv ()

+
const gchar **      g_variant_get_strv                  (GVariant *value,
+                                                         gsize *length);
+

+Gets the contents of an array of strings GVariant. This call +makes a shallow copy; the return result should be released with +g_free(), but the individual strings must not be modified. +

+

+If length is non-NULL then the number of elements in the result +is stored there. In any case, the resulting array will be +NULL-terminated. +

+

+For an empty array, length will be set to 0 and a pointer to a +NULL pointer will be returned.

+
++ + + + + + + + + + + + + + +

value :

an array of strings GVariant +

length :

the length of the result, or NULL +

Returns :

an array of constant strings +
+

Since 2.24

+
+
+
+

g_variant_dup_strv ()

+
gchar **            g_variant_dup_strv                  (GVariant *value,
+                                                         gsize *length);
+

+Gets the contents of an array of strings GVariant. This call +makes a deep copy; the return result should be released with +g_strfreev(). +

+

+If length is non-NULL then the number of elements in the result +is stored there. In any case, the resulting array will be +NULL-terminated. +

+

+For an empty array, length will be set to 0 and a pointer to a +NULL pointer will be returned.

+
++ + + + + + + + + + + + + + +

value :

an array of strings GVariant +

length :

the length of the result, or NULL +

Returns :

an array of constant strings +
+

Since 2.24

+
+
+
+

g_variant_new_maybe ()

+
GVariant *          g_variant_new_maybe                 (const GVariantType *child_type,
+                                                         GVariant *child);
+

+Depending on if value is NULL, either wraps value inside of a +maybe container or creates a Nothing instance for the given type. +

+

+At least one of type and value must be non-NULL. If type is +non-NULL then it must be a definite type. If they are both +non-NULL then type must be the type of value.

+
++ + + + + + + + + + + + + + +

child_type :

the GVariantType of the child +

child :

the child value, or NULL +

Returns :

a new GVariant maybe instance +
+

Since 2.24

+
+
+
+

g_variant_new_array ()

+
GVariant *          g_variant_new_array                 (const GVariantType *child_type,
+                                                         GVariant * const *children,
+                                                         gsize n_children);
+

+Creates a new GVariant array from children. +

+

+child_type must be non-NULL if n_children is zero. Otherwise, the +child type is determined by inspecting the first element of the +children array. If child_type is non-NULL then it must be a +definite type. +

+

+The items of the array are taken from the children array. No entry +in the children array may be NULL. +

+

+All items in the array must have the same type, which must be the +same as child_type, if given.

+
++ + + + + + + + + + + + + + + + + + +

child_type :

the element type of the new array +

children :

an array of GVariant pointers, the children +

n_children :

the length of children +

Returns :

a new GVariant array +
+

Since 2.24

+
+
+
+

g_variant_new_tuple ()

+
GVariant *          g_variant_new_tuple                 (GVariant * const *children,
+                                                         gsize n_children);
+

+Creates a new tuple GVariant out of the items in children. The +type is determined from the types of children. No entry in the +children array may be NULL. +

+

+If n_children is 0 then the unit tuple is constructed.

+
++ + + + + + + + + + + + + + +

children :

the items to make the tuple out of +

n_children :

the length of children +

Returns :

a new GVariant tuple +
+

Since 2.24

+
+
+
+

g_variant_new_dict_entry ()

+
GVariant *          g_variant_new_dict_entry            (GVariant *key,
+                                                         GVariant *value);
+

+Creates a new dictionary entry GVariant. key and value must be +non-NULL. +

+

+key must be a value of a basic type (ie: not a container).

+
++ + + + + + + + + + + + + + +

key :

a basic GVariant, the key +

value :

a GVariant, the value +

Returns :

a new dictionary entry GVariant +
+

Since 2.24

+
+
+
+

g_variant_get_maybe ()

+
GVariant *          g_variant_get_maybe                 (GVariant *value);
+

+Given a maybe-typed GVariant instance, extract its value. If the +value is Nothing, then this function returns NULL.

+
++ + + + + + + + + + +

value :

a maybe-typed value +

Returns :

the contents of value, or NULL +
+

Since 2.24

+
+
+
+

g_variant_n_children ()

+
gsize               g_variant_n_children                (GVariant *value);
+

+Determines the number of children in a container GVariant instance. +This includes variants, maybes, arrays, tuples and dictionary +entries. It is an error to call this function on any other type of +GVariant. +

+

+For variants, the return value is always 1. For values with maybe +types, it is always zero or one. For arrays, it is the length of the +array. For tuples it is the number of tuple items (which depends +only on the type). For dictionary entries, it is always 2 +

+

+This function is O(1).

+
++ + + + + + + + + + +

value :

a container GVariant +

Returns :

the number of children in the container +
+

Since 2.24

+
+
+
+

g_variant_get_child_value ()

+
GVariant *          g_variant_get_child_value           (GVariant *value,
+                                                         gsize index_);
+

+Reads a child item out of a container GVariant instance. This +includes variants, maybes, arrays, tuples and dictionary +entries. It is an error to call this function on any other type of +GVariant. +

+

+It is an error if index_ is greater than the number of child items +in the container. See g_variant_n_children(). +

+

+This function is O(1).

+
++ + + + + + + + + + + + + + +

value :

a container GVariant +

index_ :

the index of the child to fetch +

Returns :

the child at the specified index +
+

Since 2.24

+
+
+
+

g_variant_get_child ()

+
void                g_variant_get_child                 (GVariant *value,
+                                                         gsize index_,
+                                                         const gchar *format_string,
+                                                         ...);
+

+Reads a child item out of a container GVariant instance and +deconstructs it according to format_string. This call is +essentially a combination of g_variant_get_child_value() and +g_variant_get().

+
++ + + + + + + + + + + + + + + + + + +

value :

a container GVariant +

index_ :

the index of the child to deconstruct +

format_string :

a GVariant format string +

... :

arguments, as per format_string +
+

Since 2.24

+
+
+
+

g_variant_get_fixed_array ()

+
gconstpointer       g_variant_get_fixed_array           (GVariant *value,
+                                                         gsize *n_elements,
+                                                         gsize element_size);
+

+Provides access to the serialised data for an array of fixed-sized +items. +

+

+value must be an array with fixed-sized elements. Numeric types are +fixed-size as are tuples containing only other fixed-sized types. +

+

+element_size must be the size of a single element in the array. For +example, if calling this function for an array of 32 bit integers, +you might say sizeof (gint32). This value isn't used +except for the purpose of a double-check that the form of the +seralised data matches the caller's expectation. +

+

+n_elements, which must be non-NULL is set equal to the number of +items in the array.

+
++ + + + + + + + + + + + + + + + + + +

value :

a GVariant array with fixed-sized elements +

n_elements :

a pointer to the location to store the number of items +

element_size :

the size of each element +

Returns :

a pointer to the fixed array +
+

Since 2.24

+
+
+
+

g_variant_get_size ()

+
gsize               g_variant_get_size                  (GVariant *value);
+

+Determines the number of bytes that would be required to store value +with g_variant_store(). +

+

+If value has a fixed-sized type then this function always returned +that fixed size. +

+

+In the case that value is already in serialised form or the size has +already been calculated (ie: this function has been called before) +then this function is O(1). Otherwise, the size is calculated, an +operation which is approximately O(n) in the number of values +involved.

+
++ + + + + + + + + + +

value :

a GVariant instance +

Returns :

the serialised size of value +
+

Since 2.24

+
+
+
+

g_variant_get_data ()

+
gconstpointer       g_variant_get_data                  (GVariant *value);
+

+Returns a pointer to the serialised form of a GVariant instance. +The returned data may not be in fully-normalised form if read from an +untrusted source. The returned data must not be freed; it remains +valid for as long as value exists. +

+

+If value is a fixed-sized value that was deserialised from a +corrupted serialised container then NULL may be returned. In this +case, the proper thing to do is typically to use the appropriate +number of nul bytes in place of value. If value is not fixed-sized +then NULL is never returned. +

+

+In the case that value is already in serialised form, this function +is O(1). If the value is not already in serialised form, +serialisation occurs implicitly and is approximately O(n) in the size +of the result.

+
++ + + + + + + + + + +

value :

a GVariant instance +

Returns :

the serialised form of value, or NULL +
+

Since 2.24

+
+
+
+

g_variant_store ()

+
void                g_variant_store                     (GVariant *value,
+                                                         gpointer data);
+

+Stores the serialised form of value at data. data should be +large enough. See g_variant_get_size(). +

+

+The stored data is in machine native byte order but may not be in +fully-normalised form if read from an untrusted source. See +g_variant_normalise() for a solution. +

+

+This function is approximately O(n) in the size of data.

+
++ + + + + + + + + + +

value :

the GVariant to store +

data :

the location to store the serialised data at +
+

Since 2.24

+
+
+
+

g_variant_new_from_data ()

+
GVariant *          g_variant_new_from_data             (const GVariantType *type,
+                                                         gconstpointer data,
+                                                         gsize size,
+                                                         gboolean trusted,
+                                                         GDestroyNotify notify,
+                                                         gpointer user_data);
+

+Creates a new GVariant instance from serialised data. +

+

+type is the type of GVariant instance that will be constructed. +The interpretation of data depends on knowing the type. +

+

+data is not modified by this function and must remain valid with an +unchanging value until such a time as notify is called with +user_data. If the contents of data change before that time then +the result is undefined. +

+

+If data is trusted to be serialised data in normal form then +trusted should be TRUE. This applies to serialised data created +within this process or read from a trusted location on the disk (such +as a file installed in /usr/lib alongside your application). You +should set trusted to FALSE if data is read from the network, a +file in the user's home directory, etc. +

+

+notify will be called with user_data when data is no longer +needed. The exact time of this call is unspecified and might even be +before this function returns.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

type :

a GVariantType +

data :

the serialised data +

size :

the size of data +

trusted :

TRUE if data is definitely in normal form +

notify :

function to call when data is no longer needed +

user_data :

data for notify +

Returns :

a new floating GVariant of type type +
+

Since 2.24

+
+
+
+

g_variant_byteswap ()

+
GVariant *          g_variant_byteswap                  (GVariant *value);
+

+Performs a byteswapping operation on the contents of value. The +result is that all multi-byte numeric data contained in value is +byteswapped. That includes 16, 32, and 64bit signed and unsigned +integers as well as file handles and double precision floating point +values. +

+

+This function is an identity mapping on any value that does not +contain multi-byte numeric data. That include strings, booleans, +bytes and containers containing only these things (recursively). +

+

+The returned value is always in normal form and is marked as trusted.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

the byteswapped form of value +
+

Since 2.24

+
+
+
+

g_variant_get_normal_form ()

+
GVariant *          g_variant_get_normal_form           (GVariant *value);
+

+Gets a GVariant instance that has the same value as value and is +trusted to be in normal form. +

+

+If value is already trusted to be in normal form then a new +reference to value is returned. +

+

+If value is not already trusted, then it is scanned to check if it +is in normal form. If it is found to be in normal form then it is +marked as trusted and a new reference to it is returned. +

+

+If value is found not to be in normal form then a new trusted +GVariant is created with the same value as value. +

+

+It makes sense to call this function if you've received GVariant +data from untrusted sources and you want to ensure your serialised +output is definitely in normal form.

+
++ + + + + + + + + + +

value :

a GVariant +

Returns :

a trusted GVariant +
+

Since 2.24

+
+
+
+

g_variant_is_normal_form ()

+
gboolean            g_variant_is_normal_form            (GVariant *value);
+

+Checks if value is in normal form. +

+

+The main reason to do this is to detect if a given chunk of +serialised data is in normal form: load the data into a GVariant +using g_variant_create_from_data() and then use this function to +check. +

+

+If value is found to be in normal form then it will be marked as +being trusted. If the value was already marked as being trusted then +this function will immediately return TRUE.

+
++ + + + + + + + + + +

value :

a GVariant instance +

Returns :

TRUE if value is in normal form +
+

Since 2.24

+
+
+
+

g_variant_hash ()

+
guint               g_variant_hash                      (gconstpointer value);
+

+Generates a hash value for a GVariant instance. +

+

+The output of this function is guaranteed to be the same for a given +value only per-process. It may change between different processor +architectures or even different versions of GLib. Do not use this +function as a basis for building protocols or file formats. +

+

+The type of value is gconstpointer only to allow use of this +function with GHashTable. value must be a GVariant.

+
++ + + + + + + + + + +

value :

a basic GVariant value as a gconstpointer +

Returns :

a hash value corresponding to value +
+

Since 2.24

+
+
+
+

g_variant_equal ()

+
gboolean            g_variant_equal                     (gconstpointer one,
+                                                         gconstpointer two);
+

+Checks if one and two have the same type and value. +

+

+The types of one and two are gconstpointer only to allow use of +this function with GHashTable. They must each be a GVariant.

+
++ + + + + + + + + + + + + + +

one :

a GVariant instance +

two :

a GVariant instance +

Returns :

TRUE if one and two are equal +
+

Since 2.24

+
+
+
+

g_variant_print ()

+
gchar *             g_variant_print                     (GVariant *value,
+                                                         gboolean type_annotate);
+

+Pretty-prints value in the format understood by g_variant_parse(). +

+

+If type_annotate is TRUE, then type information is included in +the output.

+
++ + + + + + + + + + + + + + +

value :

a GVariant +

type_annotate :

TRUE if type information should be included in + the output +

Returns :

a newly-allocated string holding the result. +
+
+
+
+

g_variant_print_string ()

+
GString *           g_variant_print_string              (GVariant *value,
+                                                         GString *string,
+                                                         gboolean type_annotate);
+

+Behaves as g_variant_print(), but operates on a GString. +

+

+If string is non-NULL then it is appended to and returned. Else, +a new empty GString is allocated and it is returned.

+
++ + + + + + + + + + + + + + + + + + +

value :

a GVariant +

string :

a GString, or NULL +

type_annotate :

TRUE if type information should be included in + the output +

Returns :

a GString containing the string +
+

Since 2.24

+
+
+
+

GVariantIter

+
typedef struct {
+} GVariantIter;
+
+

+GVariantIter is an opaque data structure and can only be accessed +using the following functions.

+
+
+
+

g_variant_iter_copy ()

+
GVariantIter *      g_variant_iter_copy                 (GVariantIter *iter);
+

+Creates a new heap-allocated GVariantIter to iterate over the +container that was being iterated over by iter. Iteration begins on +the new iterator from the current position of the old iterator but +the two copies are independent past that point. +

+

+Use g_variant_iter_free() to free the return value when you no longer +need it. +

+

+A reference is taken to the container that iter is iterating over +and will be releated only when g_variant_iter_free() is called.

+
++ + + + + + + + + + +

iter :

a GVariantIter +

Returns :

a new heap-allocated GVariantIter +
+

Since 2.24

+
+
+
+

g_variant_iter_free ()

+
void                g_variant_iter_free                 (GVariantIter *iter);
+

+Frees a heap-allocated GVariantIter. Only call this function on +iterators that were returned by g_variant_iter_new() or +g_variant_iter_copy().

+
++ + + + +

iter :

a heap-allocated GVariantIter +
+

Since 2.24

+
+
+
+

g_variant_iter_init ()

+
gsize               g_variant_iter_init                 (GVariantIter *iter,
+                                                         GVariant *value);
+

+Initialises (without allocating) a GVariantIter. iter may be +completely uninitialised prior to this call; its old value is +ignored. +

+

+The iterator remains valid for as long as value exists, and need not +be freed in any way.

+
++ + + + + + + + + + + + + + +

iter :

a pointer to a GVariantIter +

value :

a container GVariant +

Returns :

the number of items in value +
+

Since 2.24

+
+
+
+

g_variant_iter_n_children ()

+
gsize               g_variant_iter_n_children           (GVariantIter *iter);
+

+Queries the number of child items in the container that we are +iterating over. This is the total number of items -- not the number +of items remaining. +

+

+This function might be useful for preallocation of arrays.

+
++ + + + + + + + + + +

iter :

a GVariantIter +

Returns :

the number of children in the container +
+

Since 2.24

+
+
+
+

g_variant_iter_new ()

+
GVariantIter *      g_variant_iter_new                  (GVariant *value);
+

+Creates a heap-allocated GVariantIter for iterating over the items +in value. +

+

+Use g_variant_iter_free() to free the return value when you no longer +need it. +

+

+A reference is taken to value and will be released only when +g_variant_iter_free() is called.

+
++ + + + + + + + + + +

value :

a container GVariant +

Returns :

a new heap-allocated GVariantIter +
+

Since 2.24

+
+
+
+

g_variant_iter_next_value ()

+
GVariant *          g_variant_iter_next_value           (GVariantIter *iter);
+

+Gets the next item in the container. If no more items remain then +NULL is returned. +

+

+Use g_variant_unref() to drop your reference on the return value when +you no longer need it. +

+

+

+
+

Example 23. Iterating with g_variant_iter_next_value()

+
+  /* recursively iterate a container */
+  void
+  iterate_container_recursive (GVariant *container)
+  {
+    GVariantIter iter;
+    GVariant *child;
+
+    g_variant_iter_init (&iter, dictionary);
+    while ((child = g_variant_iter_next_value (&iter)))
+      {
+        g_print ("type '%s'\n", g_variant_get_type_string (child));
+
+        if (g_variant_is_container (child))
+          iterate_container_recursive (child);
+
+        g_variant_unref (child);
+      }
+  }
+
+
+


+
++ + + + + + + + + + +

iter :

a GVariantIter +

Returns :

a GVariant, or NULL +
+

Since 2.24

+
+
+
+

g_variant_iter_next ()

+
gboolean            g_variant_iter_next                 (GVariantIter *iter,
+                                                         const gchar *format_string,
+                                                         ...);
+

+Gets the next item in the container and unpacks it into the variable +argument list according to format_string, returning TRUE. +

+

+If no more items remain then FALSE is returned. +

+

+All of the pointers given on the variable arguments list of this +function are assumed to point at uninitialised memory. It is the +responsibility of the caller to free all of the values returned by +the unpacking process. +

+

+

+
+

Example 24. Memory management with g_variant_iter_next()

+
+  /* Iterates a dictionary of type 'a{sv}' */
+  void
+  iterate_dictionary (GVariant *dictionary)
+  {
+    GVariantIter iter;
+    GVariant *value;
+    gchar *key;
+
+    g_variant_iter_init (&iter, dictionary);
+    while (g_variant_iter_next (&iter, "{sv}", &key, &value))
+      {
+        g_print ("Item '%s' has type '%s'\n", key,
+                 g_variant_get_type_string (value));
+
+        /* must free data for ourselves */
+        g_variant_unref (value);
+        g_free (key);
+      }
+  }
+ 
+
+


+

+

+For a solution that is likely to be more convenient to C programmers +when dealing with loops, see g_variant_iter_loop().

+
++ + + + + + + + + + + + + + + + + + +

iter :

a GVariantIter +

format_string :

a GVariant format string +

... :

the arguments to unpack the value into +

Returns :

TRUE if a value was unpacked, or FALSE if there as no + value +
+

Since 2.24

+
+
+
+

g_variant_iter_loop ()

+
gboolean            g_variant_iter_loop                 (GVariantIter *iter,
+                                                         const gchar *format_string,
+                                                         ...);
+

+Gets the next item in the container and unpacks it into the variable +argument list according to format_string, returning TRUE. +

+

+If no more items remain then FALSE is returned. +

+

+On the first call to this function, the pointers appearing on the +variable argument list are assumed to point at uninitialised memory. +On the second and later calls, it is assumed that the same pointers +will be given and that they will point to the memory as set by the +previous call to this function. This allows the previous values to +be freed, as appropriate. +

+

+This function is intended to be used with a while loop as +demonstrated in the following example. This function can only be +used when iterating over an array. It is only valid to call this +function with a string constant for the format string and the same +string constant must be used each time. Mixing calls to this +function and g_variant_iter_next() or g_variant_iter_next_value() on +the same iterator is not recommended. +

+

+

+
+

Example 25. Memory management with g_variant_iter_loop()

+
+  /* Iterates a dictionary of type 'a{sv}' */
+  void
+  iterate_dictionary (GVariant *dictionary)
+  {
+    GVariantIter iter;
+    GVariant *value;
+    gchar *key;
+
+    g_variant_iter_init (&iter, dictionary);
+    while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
+      {
+        g_print ("Item '%s' has type '%s'\n", key,
+                 g_variant_get_type_string (value));
+
+        /* no need to free 'key' and 'value' here */
+      }
+  }
+ 
+
+


+

+

+If you want a slightly less magical alternative that requires more +typing, see g_variant_iter_next().

+
++ + + + + + + + + + + + + + + + + + +

iter :

a GVariantIter +

format_string :

a GVariant format string +

... :

the arguments to unpack the value into +

Returns :

TRUE if a value was unpacked, or FALSE if there as no + value +
+

Since 2.24

+
+
+
+

GVariantBuilder

+
typedef struct {
+} GVariantBuilder;
+
+

+A utility type for constructing container-type GVariant instances. +

+

+This is an opaque structure and may only be accessed using the +following functions. +

+

+GVariantBuilder is not threadsafe in any way. Do not attempt to +access it from more than one thread.

+
+
+
+

g_variant_builder_unref ()

+
void                g_variant_builder_unref             (GVariantBuilder *builder);
+

+Decreases the reference count on builder. +

+

+In the event that there are no more references, releases all memory +associated with the GVariantBuilder. +

+

+Don't call this on stack-allocated GVariantBuilder instances or bad +things will happen.

+
++ + + + +

builder :

a GVariantBuilder allocated by g_variant_builder_new() +
+

Since 2.24

+
+
+
+

g_variant_builder_ref ()

+
GVariantBuilder *   g_variant_builder_ref               (GVariantBuilder *builder);
+

+Increases the reference count on builder. +

+

+Don't call this on stack-allocated GVariantBuilder instances or bad +things will happen.

+
++ + + + + + + + + + +

builder :

a GVariantBuilder allocated by g_variant_builder_new() +

Returns :

a new reference to builder +
+

Since 2.24

+
+
+
+

g_variant_builder_new ()

+
GVariantBuilder *   g_variant_builder_new               (const GVariantType *type);
+

+Allocates and initialises a new GVariantBuilder. +

+

+You should call g_variant_builder_unref() on the return value when it +is no longer needed. The memory will not be automatically freed by +any other call. +

+

+In most cases it is easier to place a GVariantBuilder directly on +the stack of the calling function and initialise it with +g_variant_builder_init().

+
++ + + + + + + + + + +

type :

a container type +

Returns :

a GVariantBuilder +
+

Since 2.24

+
+
+
+

g_variant_builder_init ()

+
void                g_variant_builder_init              (GVariantBuilder *builder,
+                                                         const GVariantType *type);
+

+Initialises a GVariantBuilder structure. +

+

+type must be non-NULL. It specifies the type of container to +construct. It can be an indefinite type such as +G_VARIANT_TYPE_ARRAY or a definite type such as "as" or "(ii)". +Maybe, array, tuple, dictionary entry and variant-typed values may be +constructed. +

+

+After the builder is initialised, values are added using +g_variant_builder_add_value() or g_variant_builder_add(). +

+

+After all the child values are added, g_variant_builder_end() frees +the memory associated with the builder and returns the GVariant that +was created. +

+

+This function completely ignores the previous contents of builder. +On one hand this means that it is valid to pass in completely +uninitialised memory. On the other hand, this means that if you are +initialising over top of an existing GVariantBuilder you need to +first call g_variant_builder_clear() in order to avoid leaking +memory. +

+

+You must not call g_variant_builder_ref() or +g_variant_builder_unref() on a GVariantBuilder that was initialised +with this function. If you ever pass a reference to a +GVariantBuilder outside of the control of your own code then you +should assume that the person receiving that reference may try to use +reference counting; you should use g_variant_builder_new() instead of +this function.

+
++ + + + + + + + + + +

builder :

a GVariantBuilder +

type :

a container type +
+

Since 2.24

+
+
+
+

g_variant_builder_clear ()

+
void                g_variant_builder_clear             (GVariantBuilder *builder);
+

+Releases all memory associated with a GVariantBuilder without +freeing the GVariantBuilder structure itself. +

+

+It typically only makes sense to do this on a stack-allocated +GVariantBuilder if you want to abort building the value part-way +through. This function need not be called if you call +g_variant_builder_end() and it also doesn't need to be called on +builders allocated with g_variant_builder_new (see +g_variant_builder_free() for that). +

+

+This function leaves the GVariantBuilder structure set to all-zeros. +It is valid to call this function on either an initialised +GVariantBuilder or one that is set to all-zeros but it is not valid +to call this function on uninitialised memory.

+
++ + + + +

builder :

a GVariantBuilder +
+

Since 2.24

+
+
+
+

g_variant_builder_add_value ()

+
void                g_variant_builder_add_value         (GVariantBuilder *builder,
+                                                         GVariant *value);
+

+Adds value to builder. +

+

+It is an error to call this function in any way that would create an +inconsistent value to be constructed. Some examples of this are +putting different types of items into an array, putting the wrong +types or number of items in a tuple, putting more than one value into +a variant, etc.

+
++ + + + + + + + + + +

builder :

a GVariantBuilder +

value :

a GVariant +
+

Since 2.24

+
+
+
+

g_variant_builder_add ()

+
void                g_variant_builder_add               (GVariantBuilder *builder,
+                                                         const gchar *format_string,
+                                                         ...);
+

+Adds to a GVariantBuilder. +

+

+This call is a convenience wrapper that is exactly equivalent to +calling g_variant_new() followed by g_variant_builder_add_value(). +

+

+This function might be used as follows: +

+

+

+
+GVariant *
+make_pointless_dictionary (void)
+{
+  GVariantBuilder *builder;
+  int i;
+
+  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
+                                   NULL);
+  for (i = 0; i < 16; i++)
+    {
+      gchar buf[3];
+
+      sprintf (buf, "%d", i);
+      g_variant_builder_add (builder, "{is}", i, buf);
+    }
+
+  return g_variant_builder_end (builder);
+}
+
+
++ + + + + + + + + + + + + + +

builder :

a GVariantBuilder +

format_string :

a GVariant varargs format string +

... :

arguments, as per format_string +
+

Since 2.24

+
+
+
+

g_variant_builder_end ()

+
GVariant *          g_variant_builder_end               (GVariantBuilder *builder);
+

+Ends the builder process and returns the constructed value. +

+

+This call automatically reduces the reference count on builder by +one, unless it has previously had g_variant_builder_no_autofree() +called on it. Unless you've taken other actions, this is usually +sufficient to free builder. +

+

+Even if additional references are held, it is not permissible to use +builder in any way after this call except for further reference +counting operations. +

+

+It is an error to call this function in any way that would create an +inconsistent value to be constructed (ie: insufficient number of +items added to a container with a specific number of children +required). It is also an error to call this function if the builder +was created with an indefinite array or maybe type and no children +have been added; in this case it is impossible to infer the type of +the empty array.

+
++ + + + + + + + + + +

builder :

a GVariantBuilder +

Returns :

a new, floating, GVariant +
+

Since 2.24

+
+
+
+

g_variant_builder_open ()

+
void                g_variant_builder_open              (GVariantBuilder *builder,
+                                                         const GVariantType *type);
+

+Opens a subcontainer inside the given builder. When done adding +items to the subcontainer, g_variant_builder_close() must be called. +

+

+It is an error to call this function in any way that would cause an +inconsistent value to be constructed (ie: adding too many values or +a value of an incorrect type).

+
++ + + + + + + + + + +

builder :

a GVariantBuilder +

type :

a GVariantType +
+

Since 2.24

+
+
+
+

g_variant_builder_close ()

+
void                g_variant_builder_close             (GVariantBuilder *builder);
+

+Closes the subcontainer inside the given builder that was opened by +the most recent call to g_variant_builder_open(). +

+

+It is an error to call this function in any way that would create an +inconsistent value to be constructed (ie: too few values added to the +subcontainer).

+
++ + + + +

builder :

a GVariantBuilder +
+

Since 2.24

+
+
+
+

G_VARIANT_PARSE_ERROR

+
#define G_VARIANT_PARSE_ERROR (g_variant_parser_get_error_quark ())
+
+

+Error domain for GVariant text format parsing. Specific error codes +are not currently defined for this domain. See GError for +information on error domains.

+
+
+
+

g_variant_parse ()

+
GVariant *          g_variant_parse                     (const GVariantType *type,
+                                                         const gchar *text,
+                                                         const gchar *limit,
+                                                         const gchar **endptr,
+                                                         GError **error);
+

+Parses a GVariant from a text representation. +

+

+A single GVariant is parsed from the content of text. +

+

+The memory at limit will never be accessed and the parser behaves as +if the character at limit is the nul terminator. This has the +effect of bounding text. +

+

+If endptr is non-NULL then text is permitted to contain data +following the value that this function parses and endptr will be +updated to point to the first character past the end of the text +parsed by this function. If endptr is NULL and there is extra data +then an error is returned. +

+

+If type is non-NULL then the value will be parsed to have that +type. This may result in additional parse errors (in the case that +the parsed value doesn't fit the type) but may also result in fewer +errors (in the case that the type would have been ambiguous, such as +with empty arrays). +

+

+In the event that the parsing is successful, the resulting GVariant +is returned. +

+

+In case of any error, NULL will be returned. If error is non-NULL +then it will be set to reflect the error that occured. +

+

+Officially, the language understood by the parser is "any string +produced by g_variant_print()".

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

type :

a GVariantType, or NULL +

text :

a string containing a GVariant in text form +

limit :

a pointer to the end of text, or NULL +

endptr :

a location to store the end pointer, or NULL +

error :

a pointer to a NULL GError pointer, or NULL +

Returns :

a reference to a GVariant, or NULL +
+
+
+
+

g_variant_new_parsed_va ()

+
GVariant *          g_variant_new_parsed_va             (const gchar *format,
+                                                         va_list *app);
+

+Parses format and returns the result. +

+

+This is the version of g_variant_new_parsed() intended to be used +from libraries. +

+

+The return value will be floating if it was a newly created GVariant +instance. In the case that format simply specified the collection +of a GVariant pointer (eg: format was "%*") then the collected +GVariant pointer will be returned unmodified, without adding any +additional references. +

+

+In order to behave correctly in all cases it is necessary for the +calling function to g_variant_ref_sink() the return result before +returning control to the user that originally provided the pointer. +At this point, the caller will have their own full reference to the +result. This can also be done by adding the result to a container, +or by passing it to another g_variant_new() call.

+
++ + + + + + + + + + + + + + +

format :

a text format GVariant +

app :

a pointer to a va_list +

Returns :

a new, usually floating, GVariant +
+
+
+
+

g_variant_new_parsed ()

+
GVariant *          g_variant_new_parsed                (const gchar *format,
+                                                         ...);
+

+Parses format and returns the result. +

+

+format must be a text format GVariant with one extention: at any +point that a value may appear in the text, a '%' character followed +by a GVariant format string (as per g_variant_new()) may appear. In +that case, the same arguments are collected from the argument list as +g_variant_new() would have collected. +

+

+Consider this simple example: +

+

+

+
+ g_variant_new_parsed ("[('one', 1), ('two', %i), (%s, 3)]", 2, "three");
+
+

+

+

+In the example, the variable argument parameters are collected and +filled in as if they were part of the original string to produce the +result of [('one', 1), ('two', 2), ('three', 3)]. +

+

+This function is intended only to be used with format as a string +literal. Any parse error is fatal to the calling process. If you +want to parse data from untrusted sources, use g_variant_parse(). +

+

+You may not use this function to return, unmodified, a single +GVariant pointer from the argument list. ie: format may not solely +be anything along the lines of "%*", "%?", "r", or anything starting +with "%@".

+
++ + + + + + + + + + + + + + +

format :

a text format GVariant +

... :

arguments as per format +

Returns :

a new floating GVariant instance +
+
+
+
+

See Also

+GVariantType +
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-GVariantType.html b/docs/reference/glib/html/glib-GVariantType.html new file mode 100644 index 0000000..c1b6183 --- /dev/null +++ b/docs/reference/glib/html/glib-GVariantType.html @@ -0,0 +1,1772 @@ + + + + +GVariantType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GVariantType

+

GVariantType — introduction to the GVariant type system

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GVariantType;
+#define             G_VARIANT_TYPE_BOOLEAN
+#define             G_VARIANT_TYPE_BYTE
+#define             G_VARIANT_TYPE_INT16
+#define             G_VARIANT_TYPE_UINT16
+#define             G_VARIANT_TYPE_INT32
+#define             G_VARIANT_TYPE_UINT32
+#define             G_VARIANT_TYPE_INT64
+#define             G_VARIANT_TYPE_UINT64
+#define             G_VARIANT_TYPE_HANDLE
+#define             G_VARIANT_TYPE_DOUBLE
+#define             G_VARIANT_TYPE_STRING
+#define             G_VARIANT_TYPE_OBJECT_PATH
+#define             G_VARIANT_TYPE_SIGNATURE
+#define             G_VARIANT_TYPE_VARIANT
+#define             G_VARIANT_TYPE_ANY
+#define             G_VARIANT_TYPE_BASIC
+#define             G_VARIANT_TYPE_MAYBE
+#define             G_VARIANT_TYPE_ARRAY
+#define             G_VARIANT_TYPE_TUPLE
+#define             G_VARIANT_TYPE_UNIT
+#define             G_VARIANT_TYPE_DICT_ENTRY
+#define             G_VARIANT_TYPE_DICTIONARY
+
+#define             G_VARIANT_TYPE                      (type_string)
+void                g_variant_type_free                 (GVariantType *type);
+GVariantType *      g_variant_type_copy                 (const GVariantType *type);
+GVariantType *      g_variant_type_new                  (const gchar *type_string);
+
+gboolean            g_variant_type_string_is_valid      (const gchar *type_string);
+gboolean            g_variant_type_string_scan          (const gchar *string,
+                                                         const gchar *limit,
+                                                         const gchar **endptr);
+gsize               g_variant_type_get_string_length    (const GVariantType *type);
+const gchar *       g_variant_type_peek_string          (const GVariantType *type);
+gchar *             g_variant_type_dup_string           (const GVariantType *type);
+
+gboolean            g_variant_type_is_definite          (const GVariantType *type);
+gboolean            g_variant_type_is_container         (const GVariantType *type);
+gboolean            g_variant_type_is_basic             (const GVariantType *type);
+gboolean            g_variant_type_is_maybe             (const GVariantType *type);
+gboolean            g_variant_type_is_array             (const GVariantType *type);
+gboolean            g_variant_type_is_tuple             (const GVariantType *type);
+gboolean            g_variant_type_is_dict_entry        (const GVariantType *type);
+gboolean            g_variant_type_is_variant           (const GVariantType *type);
+
+guint               g_variant_type_hash                 (gconstpointer type);
+gboolean            g_variant_type_equal                (gconstpointer type1,
+                                                         gconstpointer type2);
+gboolean            g_variant_type_is_subtype_of        (const GVariantType *type,
+                                                         const GVariantType *supertype);
+
+GVariantType *      g_variant_type_new_maybe            (const GVariantType *element);
+GVariantType *      g_variant_type_new_array            (const GVariantType *element);
+GVariantType *      g_variant_type_new_tuple            (const GVariantType * const *items,
+                                                         gint length);
+GVariantType *      g_variant_type_new_dict_entry       (const GVariantType *key,
+                                                         const GVariantType *value);
+
+const GVariantType * g_variant_type_element             (const GVariantType *type);
+gsize               g_variant_type_n_items              (const GVariantType *type);
+const GVariantType * g_variant_type_first               (const GVariantType *type);
+const GVariantType * g_variant_type_next                (const GVariantType *type);
+const GVariantType * g_variant_type_key                 (const GVariantType *type);
+const GVariantType * g_variant_type_value               (const GVariantType *type);
+
+
+
+

Description

+

+This section introduces the GVariant type system. It is based, in +large part, on the DBus type system, with two major changes and some minor +lifting of restrictions. The DBus +specification, therefore, provides a significant amount of +information that is useful when working with GVariant. +

+

+The first major change with respect to the DBus type system is the +introduction of maybe (or "nullable") types. Any type in GVariant can be +converted to a maybe type, in which case, "nothing" (or "null") becomes a +valid value. Maybe types have been added by introducing the +character "m" to type strings. +

+

+The second major change is that the GVariant type system supports the +concept of "indefinite types" -- types that are less specific than +the normal types found in DBus. For example, it is possible to speak +of "an array of any type" in GVariant, where the DBus type system +would require you to speak of "an array of integers" or "an array of +strings". Indefinite types have been added by introducing the +characters "*", "?" and +"r" to type strings. +

+

+Finally, all arbitrary restrictions relating to the complexity of +types are lifted along with the restriction that dictionary entries +may only appear nested inside of arrays. +

+

+Just as in DBus, GVariant types are described with strings ("type +strings"). Subject to the differences mentioned above, these strings +are of the same form as those found in DBus. Note, however: DBus +always works in terms of messages and therefore individual type +strings appear nowhere in its interface. Instead, "signatures" +are a concatenation of the strings of the type of each argument in a +message. GVariant deals with single values directly so GVariant type +strings always describe the type of exactly one value. This means +that a DBus signature string is generally not a valid GVariant type +string -- except in the case that it is the signature of a message +containing exactly one argument. +

+

+An indefinite type is similar in spirit to what may be called an +abstract type in other type systems. No value can exist that has an +indefinite type as its type, but values can exist that have types +that are subtypes of indefinite types. That is to say, +g_variant_get_type() will never return an indefinite type, but +calling g_variant_is_a() with an indefinite type may return TRUE. +For example, you can not have a value that represents "an array of no +particular type", but you can have an "array of integers" which +certainly matches the type of "an array of no particular type", since +"array of integers" is a subtype of "array of no particular type". +

+

+This is similar to how instances of abstract classes may not +directly exist in other type systems, but instances of their +non-abstract subtypes may. For example, in GTK, no object that has +the type of GtkBin can exist (since GtkBin is an abstract class), +but a GtkWindow can certainly be instantiated, and you would say +that the GtkWindow is a GtkBin (since GtkWindow is a subclass of +GtkBin). +

+

+A detailed description of GVariant type strings is given here: +

+

+

+
+

GVariant Type Strings

+

+ A GVariant type string can be any of the following: +

+
    +
  • + any basic type string (listed below) +

  • +
  • + "v", "r" or + "*" +

  • +
  • + one of the characters 'a' or + 'm', followed by another type string +

  • +
  • + the character '(', followed by a concatenation + of zero or more other type strings, followed by the character + ')' +

  • +
  • + the character '{', followed by a basic type + string (see below), followed by another type string, followed by + the character '}' +

  • +
+

+ A basic type string describes a basic type (as per + g_variant_type_is_basic()) and is always a single + character in length. The valid basic type strings are + "b", "y", + "n", "q", + "i", "u", + "x", "t", + "h", "d", + "s", "o", + "g" and "?". +

+

+ The above definition is recursive to arbitrary depth. + "aaaaai" and "(ui(nq((y)))s)" + are both valid type strings, as is + "a(aa(ui)(qna{ya(yd)}))". +

+

+ The meaning of each of the characters is as follows: +

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Character +

+
+

+ Meaning +

+
+

+ b +

+
+

+ the type string of G_VARIANT_TYPE_BOOLEAN; a boolean value. +

+
+

+ y +

+
+

+ the type string of G_VARIANT_TYPE_BYTE; a byte. +

+
+

+ n +

+
+

+ the type string of G_VARIANT_TYPE_INT16; a signed 16 bit + integer. +

+
+

+ q +

+
+

+ the type string of G_VARIANT_TYPE_UINT16; an unsigned 16 bit + integer. +

+
+

+ i +

+
+

+ the type string of G_VARIANT_TYPE_INT32; a signed 32 bit + integer. +

+
+

+ u +

+
+

+ the type string of G_VARIANT_TYPE_UINT32; an unsigned 32 bit + integer. +

+
+

+ x +

+
+

+ the type string of G_VARIANT_TYPE_INT64; a signed 64 bit + integer. +

+
+

+ t +

+
+

+ the type string of G_VARIANT_TYPE_UINT64; an unsigned 64 bit + integer. +

+
+

+ h +

+
+

+ the type string of G_VARIANT_TYPE_HANDLE; a signed 32 bit + value that, by convention, is used as an index into an array + of file descriptors that are sent alongside a DBus message. +

+
+

+ d +

+
+

+ the type string of G_VARIANT_TYPE_DOUBLE; a double precision + floating point value. +

+
+

+ s +

+
+

+ the type string of G_VARIANT_TYPE_STRING; a string. +

+
+

+ o +

+
+

+ the type string of G_VARIANT_TYPE_OBJECT_PATH; a string in + the form of a DBus object path. +

+
+

+ g +

+
+

+ the type string of G_VARIANT_TYPE_STRING; a string in the + form of a DBus type signature. +

+
+

+ ? +

+
+

+ the type string of G_VARIANT_TYPE_BASIC; an indefinite type + that is a supertype of any of the basic types. +

+
+

+ v +

+
+

+ the type string of G_VARIANT_TYPE_VARIANT; a container type + that contain any other type of value. +

+
+

+ a +

+
+

+ used as a prefix on another type string to mean an array of + that type; the type string "ai", for + example, is the type of an array of 32 bit signed integers. +

+
+

+ m +

+
+

+ used as a prefix on another type string to mean a "maybe", or + "nullable", version of that type; the type string + "ms", for example, is the type of a value + that maybe contains a string, or maybe contains nothing. +

+
+

+ () +

+
+

+ used to enclose zero or more other concatenated type strings + to create a tuple type; the type string + "(is)", for example, is the type of a pair + of an integer and a string. +

+
+

+ r +

+
+

+ the type string of G_VARIANT_TYPE_TUPLE; an indefinite type + that is a supertype of any tuple type, regardless of the + number of items. +

+
+

+ {} +

+
+

+ used to enclose a basic type string concatenated with another + type string to create a dictionary entry type, which usually + appears inside of an array to form a dictionary; the type + string "a{sd}", for example, is the type of + a dictionary that maps strings to double precision floating + point values. +

+

+ The first type (the basic type) is the key type and the second + type is the value type. The reason that the first type is + restricted to being a basic type is so that it can easily be + hashed. +

+
+

+ * +

+
+

+ the type string of G_VARIANT_TYPE_ANY; the indefinite type + that is a supertype of all types. Note that, as with all type + strings, this character represents exactly one type. It + cannot be used inside of tuples to mean "any number of items". +

+
+

+ Any type string of a container that contains an indefinite type is, + itself, an indefinite type. For example, the type string + "a*" (corresponding to G_VARIANT_TYPE_ARRAY) is + an indefinite type that is a supertype of every array type. + "(*s)" is a supertype of all tuples that + contain exactly two items where the second item is a string. +

+

+ "a{?*}" is an indefinite type that is a + supertype of all arrays containing dictionary entries where the key + is any basic type and the value is any type at all. This is, by + definition, a dictionary, so this type string corresponds to + G_VARIANT_TYPE_DICTIONARY. Note that, due to the restriction that + the key of a dictionary entry must be a basic type, + "{**}" is not a valid type string. +

+
+
+
+

Details

+
+

GVariantType

+
typedef struct _GVariantType GVariantType;
+

+A type in the GVariant type system. +

+

+Two types may not be compared by value; use g_variant_type_equal() or +g_variant_type_is_subtype(). May be copied using +g_variant_type_copy() and freed using g_variant_type_free().

+
+
+
+

G_VARIANT_TYPE_BOOLEAN

+
#define G_VARIANT_TYPE_BOOLEAN              ((const GVariantType *) "b")
+
+

+The type of a value that can be either TRUE or FALSE.

+
+
+
+

G_VARIANT_TYPE_BYTE

+
#define G_VARIANT_TYPE_BYTE                 ((const GVariantType *) "y")
+
+

+The type of an integer value that can range from 0 to 255.

+
+
+
+

G_VARIANT_TYPE_INT16

+
#define G_VARIANT_TYPE_INT16                ((const GVariantType *) "n")
+
+

+The type of an integer value that can range from -32768 to 32767.

+
+
+
+

G_VARIANT_TYPE_UINT16

+
#define G_VARIANT_TYPE_UINT16               ((const GVariantType *) "q")
+
+

+The type of an integer value that can range from 0 to 65535. +There were about this many people living in Toronto in the 1870s.

+
+
+
+

G_VARIANT_TYPE_INT32

+
#define G_VARIANT_TYPE_INT32                ((const GVariantType *) "i")
+
+

+The type of an integer value that can range from -2147483648 to +2147483647.

+
+
+
+

G_VARIANT_TYPE_UINT32

+
#define G_VARIANT_TYPE_UINT32               ((const GVariantType *) "u")
+
+

+The type of an integer value that can range from 0 to 4294967295. +That's one number for everyone who was around in the late 1970s.

+
+
+
+

G_VARIANT_TYPE_INT64

+
#define G_VARIANT_TYPE_INT64                ((const GVariantType *) "x")
+
+

+The type of an integer value that can range from +-9223372036854775808 to 9223372036854775807.

+
+
+
+

G_VARIANT_TYPE_UINT64

+
#define G_VARIANT_TYPE_UINT64               ((const GVariantType *) "t")
+
+

+The type of an integer value that can range from 0 to +18446744073709551616. That's a really big number, but a Rubik's +cube can have a bit more than twice as many possible positions.

+
+
+
+

G_VARIANT_TYPE_HANDLE

+
#define G_VARIANT_TYPE_HANDLE               ((const GVariantType *) "h")
+
+

+The type of a 32bit signed integer value, that by convention, is used +as an index into an array of file descriptors that are sent alongside +a DBus message. +

+

+If you are not interacting with DBus, then there is no reason to make +use of this type.

+
+
+
+

G_VARIANT_TYPE_DOUBLE

+
#define G_VARIANT_TYPE_DOUBLE               ((const GVariantType *) "d")
+
+

+The type of a double precision IEEE754 floating point number. +These guys go up to about 1.80e308 (plus and minus) but miss out on +some numbers in between. In any case, that's far greater than the +estimated number of fundamental particles in the observable +universe.

+
+
+
+

G_VARIANT_TYPE_STRING

+
#define G_VARIANT_TYPE_STRING               ((const GVariantType *) "s")
+
+

+The type of a string. "" is a string. NULL is not a string.

+
+
+
+

G_VARIANT_TYPE_OBJECT_PATH

+
#define G_VARIANT_TYPE_OBJECT_PATH          ((const GVariantType *) "o")
+
+

+The type of a DBus object reference. These are strings of a +specific format used to identify objects at a given destination on +the bus. +

+

+If you are not interacting with DBus, then there is no reason to make +use of this type. If you are, then the DBus specification contains a +precise description of valid object paths.

+
+
+
+

G_VARIANT_TYPE_SIGNATURE

+
#define G_VARIANT_TYPE_SIGNATURE            ((const GVariantType *) "g")
+
+

+The type of a DBus type signature. These are strings of a specific +format used as type signatures for DBus methods and messages. +

+

+If you are not interacting with DBus, then there is no reason to make +use of this type. If you are, then the DBus specification contains a +precise description of valid signature strings.

+
+
+
+

G_VARIANT_TYPE_VARIANT

+
#define G_VARIANT_TYPE_VARIANT              ((const GVariantType *) "v")
+
+

+The type of a box that contains any other value (including another +variant).

+
+
+
+

G_VARIANT_TYPE_ANY

+
#define G_VARIANT_TYPE_ANY                  ((const GVariantType *) "*")
+
+

+An indefinite type that is a supertype of every type (including +itself).

+
+
+
+

G_VARIANT_TYPE_BASIC

+
#define G_VARIANT_TYPE_BASIC                ((const GVariantType *) "?")
+
+

+An indefinite type that is a supertype of every basic (ie: +non-container) type.

+
+
+
+

G_VARIANT_TYPE_MAYBE

+
#define G_VARIANT_TYPE_MAYBE                ((const GVariantType *) "m*")
+
+

+An indefinite type that is a supertype of every maybe type.

+
+
+
+

G_VARIANT_TYPE_ARRAY

+
#define G_VARIANT_TYPE_ARRAY                ((const GVariantType *) "a*")
+
+

+An indefinite type that is a supertype of every array type.

+
+
+
+

G_VARIANT_TYPE_TUPLE

+
#define G_VARIANT_TYPE_TUPLE                ((const GVariantType *) "r")
+
+

+An indefinite type that is a supertype of every tuple type, +regardless of the number of items in the tuple.

+
+
+
+

G_VARIANT_TYPE_UNIT

+
#define G_VARIANT_TYPE_UNIT                 ((const GVariantType *) "()")
+
+

+The empty tuple type. Has only one instance. Known also as "triv" +or "void".

+
+
+
+

G_VARIANT_TYPE_DICT_ENTRY

+
#define G_VARIANT_TYPE_DICT_ENTRY           ((const GVariantType *) "{?*}")
+
+

+An indefinite type that is a supertype of every dictionary entry +type.

+
+
+
+

G_VARIANT_TYPE_DICTIONARY

+
#define G_VARIANT_TYPE_DICTIONARY           ((const GVariantType *) "a{?*}")
+
+

+An indefinite type that is a supertype of every dictionary type -- +that is, any array type that has an element type equal to any +dictionary entry type.

+
+
+
+

G_VARIANT_TYPE()

+
#define             G_VARIANT_TYPE(type_string)
+

+Converts a string to a const GVariantType. Depending on the +current debugging level, this function may perform a runtime check +to ensure that string is a valid GVariant type string. +

+

+It is always a programmer error to use this macro with an invalid +type string. +

+

+Since 2.24

+
++ + + + +

type_string :

a well-formed GVariantType type string +
+
+
+
+

g_variant_type_free ()

+
void                g_variant_type_free                 (GVariantType *type);
+

+Frees a GVariantType that was allocated with +g_variant_type_copy(), g_variant_type_new() or one of the container +type constructor functions. +

+

+In the case that type is NULL, this function does nothing. +

+

+Since 2.24

+
++ + + + +

type :

a GVariantType, or NULL +
+
+
+
+

g_variant_type_copy ()

+
GVariantType *      g_variant_type_copy                 (const GVariantType *type);
+

+Makes a copy of a GVariantType. It is appropriate to call +g_variant_type_free() on the return value. type may not be NULL. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

a new GVariantType +
+
+
+
+

g_variant_type_new ()

+
GVariantType *      g_variant_type_new                  (const gchar *type_string);
+

+Creates a new GVariantType corresponding to the type string given +by type_string. It is appropriate to call g_variant_type_free() on +the return value. +

+

+It is a programmer error to call this function with an invalid type +string. Use g_variant_type_string_is_valid() if you are unsure.

+
++ + + + + + + + + + +

type_string :

a valid GVariant type string +

Returns :

a new GVariantType +
+

Since 2.24

+
+
+
+

g_variant_type_string_is_valid ()

+
gboolean            g_variant_type_string_is_valid      (const gchar *type_string);
+

+Checks if type_string is a valid GVariant type string. This call is +equivalent to calling g_variant_type_string_scan() and confirming +that the following character is a nul terminator. +

+

+Since 2.24

+
++ + + + + + + + + + +

type_string :

a pointer to any string +

Returns :

TRUE if type_string is exactly one valid type string +
+
+
+
+

g_variant_type_string_scan ()

+
gboolean            g_variant_type_string_scan          (const gchar *string,
+                                                         const gchar *limit,
+                                                         const gchar **endptr);
+

+Scan for a single complete and valid GVariant type string in string. +The memory pointed to by limit (or bytes beyond it) is never +accessed. +

+

+If a valid type string is found, endptr is updated to point to the +first character past the end of the string that was found and TRUE +is returned. +

+

+If there is no valid type string starting at string, or if the type +string does not end before limit then FALSE is returned. +

+

+For the simple case of checking if a string is a valid type string, +see g_variant_type_string_is_valid().

+
++ + + + + + + + + + + + + + + + + + +

string :

a pointer to any string +

limit :

the end of string, or NULL +

endptr :

location to store the end pointer, or NULL +

Returns :

TRUE if a valid type string was found +
+

Since 2.24

+
+
+
+

g_variant_type_get_string_length ()

+
gsize               g_variant_type_get_string_length    (const GVariantType *type);
+

+Returns the length of the type string corresponding to the given +type. This function must be used to determine the valid extent of +the memory region returned by g_variant_type_peek_string(). +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

the length of the corresponding type string +
+
+
+
+

g_variant_type_peek_string ()

+
const gchar *       g_variant_type_peek_string          (const GVariantType *type);
+

+Returns the type string corresponding to the given type. The +result is not nul-terminated; in order to determine its length you +must call g_variant_type_get_string_length(). +

+

+To get a nul-terminated string, see g_variant_type_dup_string(). +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

the corresponding type string (not nul-terminated) +
+
+
+
+

g_variant_type_dup_string ()

+
gchar *             g_variant_type_dup_string           (const GVariantType *type);
+

+Returns a newly-allocated copy of the type string corresponding to +type. The returned string is nul-terminated. It is appropriate to +call g_free() on the return value. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

the corresponding type string +
+
+
+
+

g_variant_type_is_definite ()

+
gboolean            g_variant_type_is_definite          (const GVariantType *type);
+

+Determines if the given type is definite (ie: not indefinite). +

+

+A type is definite if its type string does not contain any indefinite +type characters ('*', '?', or 'r'). +

+

+A GVariant instance may not have an indefinite type, so calling +this function on the result of g_variant_get_type() will always +result in TRUE being returned. Calling this function on an +indefinite type like G_VARIANT_TYPE_ARRAY, however, will result in +FALSE being returned. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is definite +
+
+
+
+

g_variant_type_is_container ()

+
gboolean            g_variant_type_is_container         (const GVariantType *type);
+

+Determines if the given type is a container type. +

+

+Container types are any array, maybe, tuple, or dictionary +entry types plus the variant type. +

+

+This function returns TRUE for any indefinite type for which every +definite subtype is a container -- G_VARIANT_TYPE_ARRAY, for +example. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is a container type +
+
+
+
+

g_variant_type_is_basic ()

+
gboolean            g_variant_type_is_basic             (const GVariantType *type);
+

+Determines if the given type is a basic type. +

+

+Basic types are booleans, bytes, integers, doubles, strings, object +paths and signatures. +

+

+Only a basic type may be used as the key of a dictionary entry. +

+

+This function returns FALSE for all indefinite types except +G_VARIANT_TYPE_BASIC. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is a basic type +
+
+
+
+

g_variant_type_is_maybe ()

+
gboolean            g_variant_type_is_maybe             (const GVariantType *type);
+

+Determines if the given type is a maybe type. This is true if the +type string for type starts with an 'm'. +

+

+This function returns TRUE for any indefinite type for which every +definite subtype is a maybe type -- G_VARIANT_TYPE_MAYBE, for +example. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is a maybe type +
+
+
+
+

g_variant_type_is_array ()

+
gboolean            g_variant_type_is_array             (const GVariantType *type);
+

+Determines if the given type is an array type. This is true if the +type string for type starts with an 'a'. +

+

+This function returns TRUE for any indefinite type for which every +definite subtype is an array type -- G_VARIANT_TYPE_ARRAY, for +example. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is an array type +
+
+
+
+

g_variant_type_is_tuple ()

+
gboolean            g_variant_type_is_tuple             (const GVariantType *type);
+

+Determines if the given type is a tuple type. This is true if the +type string for type starts with a '(' or if type is +G_VARIANT_TYPE_TUPLE. +

+

+This function returns TRUE for any indefinite type for which every +definite subtype is a tuple type -- G_VARIANT_TYPE_TUPLE, for +example. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is a tuple type +
+
+
+
+

g_variant_type_is_dict_entry ()

+
gboolean            g_variant_type_is_dict_entry        (const GVariantType *type);
+

+Determines if the given type is a dictionary entry type. This is +true if the type string for type starts with a '{'. +

+

+This function returns TRUE for any indefinite type for which every +definite subtype is a dictionary entry type -- +G_VARIANT_TYPE_DICT_ENTRY, for example. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is a dictionary entry type +
+
+
+
+

g_variant_type_is_variant ()

+
gboolean            g_variant_type_is_variant           (const GVariantType *type);
+

+Determines if the given type is the variant type. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

TRUE if type is the variant type +
+
+
+
+

g_variant_type_hash ()

+
guint               g_variant_type_hash                 (gconstpointer type);
+

+Hashes type. +

+

+The argument type of type is only gconstpointer to allow use with +GHashTable without function pointer casting. A valid +GVariantType must be provided. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType +

Returns :

the hash value +
+
+
+
+

g_variant_type_equal ()

+
gboolean            g_variant_type_equal                (gconstpointer type1,
+                                                         gconstpointer type2);
+

+Compares type1 and type2 for equality. +

+

+Only returns TRUE if the types are exactly equal. Even if one type +is an indefinite type and the other is a subtype of it, FALSE will +be returned if they are not exactly equal. If you want to check for +subtypes, use g_variant_type_is_subtype_of(). +

+

+The argument types of type1 and type2 are only gconstpointer to +allow use with GHashTable without function pointer casting. For +both arguments, a valid GVariantType must be provided. +

+

+Since 2.24

+
++ + + + + + + + + + + + + + +

type1 :

a GVariantType +

type2 :

a GVariantType +

Returns :

TRUE if type1 and type2 are exactly equal +
+
+
+
+

g_variant_type_is_subtype_of ()

+
gboolean            g_variant_type_is_subtype_of        (const GVariantType *type,
+                                                         const GVariantType *supertype);
+

+Checks if type is a subtype of supertype. +

+

+This function returns TRUE if type is a subtype of supertype. All +types are considered to be subtypes of themselves. Aside from that, +only indefinite types can have subtypes. +

+

+Since 2.24

+
++ + + + + + + + + + + + + + +

type :

a GVariantType +

supertype :

a GVariantType +

Returns :

TRUE if type is a subtype of supertype +
+
+
+
+

g_variant_type_new_maybe ()

+
GVariantType *      g_variant_type_new_maybe            (const GVariantType *element);
+

+Constructs the type corresponding to a maybe instance containing +type type or Nothing. +

+

+It is appropriate to call g_variant_type_free() on the return value. +

+

+Since 2.24

+
++ + + + + + + + + + +

element :

a GVariantType +

Returns :

a new maybe GVariantType +
+
+
+
+

g_variant_type_new_array ()

+
GVariantType *      g_variant_type_new_array            (const GVariantType *element);
+

+Constructs the type corresponding to an array of elements of the +type type. +

+

+It is appropriate to call g_variant_type_free() on the return value. +

+

+Since 2.24

+
++ + + + + + + + + + +

element :

a GVariantType +

Returns :

a new array GVariantType +
+
+
+
+

g_variant_type_new_tuple ()

+
GVariantType *      g_variant_type_new_tuple            (const GVariantType * const *items,
+                                                         gint length);
+

+Constructs a new tuple type, from items. +

+

+length is the number of items in items, or -1 to indicate that +items is NULL-terminated. +

+

+It is appropriate to call g_variant_type_free() on the return value. +

+

+Since 2.24

+
++ + + + + + + + + + + + + + +

items :

an array of GVariantTypes, one for each item +

length :

the length of items, or -1 +

Returns :

a new tuple GVariantType +
+
+
+
+

g_variant_type_new_dict_entry ()

+
GVariantType *      g_variant_type_new_dict_entry       (const GVariantType *key,
+                                                         const GVariantType *value);
+

+Constructs the type corresponding to a dictionary entry with a key +of type key and a value of type value. +

+

+It is appropriate to call g_variant_type_free() on the return value. +

+

+Since 2.24

+
++ + + + + + + + + + + + + + +

key :

a basic GVariantType +

value :

a GVariantType +

Returns :

a new dictionary entry GVariantType +
+
+
+
+

g_variant_type_element ()

+
const GVariantType * g_variant_type_element             (const GVariantType *type);
+

+Determines the element type of an array or maybe type. +

+

+This function may only be used with array or maybe types. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

an array or maybe GVariantType +

Returns :

the element type of type +
+
+
+
+

g_variant_type_n_items ()

+
gsize               g_variant_type_n_items              (const GVariantType *type);
+

+Determines the number of items contained in a tuple or +dictionary entry type. +

+

+This function may only be used with tuple or dictionary entry types, +but must not be used with the generic tuple type +G_VARIANT_TYPE_TUPLE. +

+

+In the case of a dictionary entry type, this function will always +return 2. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a tuple or dictionary entry GVariantType +

Returns :

the number of items in type +
+
+
+
+

g_variant_type_first ()

+
const GVariantType * g_variant_type_first               (const GVariantType *type);
+

+Determines the first item type of a tuple or dictionary entry +type. +

+

+This function may only be used with tuple or dictionary entry types, +but must not be used with the generic tuple type +G_VARIANT_TYPE_TUPLE. +

+

+In the case of a dictionary entry type, this returns the type of +the key. +

+

+NULL is returned in case of type being G_VARIANT_TYPE_UNIT. +

+

+This call, together with g_variant_type_next() provides an iterator +interface over tuple and dictionary entry types. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a tuple or dictionary entry GVariantType +

Returns :

the first item type of type, or NULL +
+
+
+
+

g_variant_type_next ()

+
const GVariantType * g_variant_type_next                (const GVariantType *type);
+

+Determines the next item type of a tuple or dictionary entry +type. +

+

+type must be the result of a previous call to +g_variant_type_first() or g_variant_type_next(). +

+

+If called on the key type of a dictionary entry then this call +returns the value type. If called on the value type of a dictionary +entry then this call returns NULL. +

+

+For tuples, NULL is returned when type is the last item in a tuple. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a GVariantType from a previous call +

Returns :

the next GVariantType after type, or NULL +
+
+
+
+

g_variant_type_key ()

+
const GVariantType * g_variant_type_key                 (const GVariantType *type);
+

+Determines the key type of a dictionary entry type. +

+

+This function may only be used with a dictionary entry type. Other +than the additional restriction, this call is equivalent to +g_variant_type_first(). +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a dictionary entry GVariantType +

Returns :

the key type of the dictionary entry +
+
+
+
+

g_variant_type_value ()

+
const GVariantType * g_variant_type_value               (const GVariantType *type);
+

+Determines the value type of a dictionary entry type. +

+

+This function may only be used with a dictionary entry type. +

+

+Since 2.24

+
++ + + + + + + + + + +

type :

a dictionary entry GVariantType +

Returns :

the value type of the dictionary entry +
+
+
+
+

See Also

+GVariantType, GVariant +
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Glob-style-pattern-matching.html b/docs/reference/glib/html/glib-Glob-style-pattern-matching.html new file mode 100644 index 0000000..d2a0f6b --- /dev/null +++ b/docs/reference/glib/html/glib-Glob-style-pattern-matching.html @@ -0,0 +1,304 @@ + + + + +Glob-style pattern matching + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Glob-style pattern matching

+

Glob-style pattern matching — matches strings against patterns containing '*' + (wildcard) and '?' (joker)

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GPatternSpec;
+GPatternSpec*       g_pattern_spec_new                  (const gchar *pattern);
+void                g_pattern_spec_free                 (GPatternSpec *pspec);
+gboolean            g_pattern_spec_equal                (GPatternSpec *pspec1,
+                                                         GPatternSpec *pspec2);
+gboolean            g_pattern_match                     (GPatternSpec *pspec,
+                                                         guint string_length,
+                                                         const gchar *string,
+                                                         const gchar *string_reversed);
+gboolean            g_pattern_match_string              (GPatternSpec *pspec,
+                                                         const gchar *string);
+gboolean            g_pattern_match_simple              (const gchar *pattern,
+                                                         const gchar *string);
+
+
+
+

Description

+

+The g_pattern_match* functions match a string +against a pattern containing '*' and '?' wildcards with similar +semantics as the standard glob() function: '*' matches an arbitrary, +possibly empty, string, '?' matches an arbitrary character. +

+

+Note that in contrast to glob(), the '/' character +can be matched by the wildcards, there are no +'[...]' character ranges and '*' and '?' can +not be escaped to include them literally in a +pattern. +

+

+When multiple strings must be matched against the same pattern, it +is better to compile the pattern to a GPatternSpec using +g_pattern_spec_new() and use g_pattern_match_string() instead of +g_pattern_match_simple(). This avoids the overhead of repeated +pattern compilation.

+
+
+

Details

+
+

GPatternSpec

+
typedef struct _GPatternSpec GPatternSpec;
+

+A GPatternSpec is the 'compiled' form of a +pattern. This structure is opaque and its fields cannot be accessed +directly.

+
+
+
+

g_pattern_spec_new ()

+
GPatternSpec*       g_pattern_spec_new                  (const gchar *pattern);
+

+Compiles a pattern to a GPatternSpec.

+
++ + + + + + + + + + +

pattern :

a zero-terminated UTF-8 encoded string +

Returns :

a newly-allocated GPatternSpec +
+
+
+
+

g_pattern_spec_free ()

+
void                g_pattern_spec_free                 (GPatternSpec *pspec);
+

+Frees the memory allocated for the GPatternSpec.

+
++ + + + +

pspec :

a GPatternSpec +
+
+
+
+

g_pattern_spec_equal ()

+
gboolean            g_pattern_spec_equal                (GPatternSpec *pspec1,
+                                                         GPatternSpec *pspec2);
+

+Compares two compiled pattern specs and returns whether they will +match the same set of strings.

+
++ + + + + + + + + + + + + + +

pspec1 :

a GPatternSpec +

pspec2 :

another GPatternSpec +

Returns :

Whether the compiled patterns are equal +
+
+
+
+

g_pattern_match ()

+
gboolean            g_pattern_match                     (GPatternSpec *pspec,
+                                                         guint string_length,
+                                                         const gchar *string,
+                                                         const gchar *string_reversed);
+

+Matches a string against a compiled pattern. Passing the correct +length of the string given is mandatory. The reversed string can be +omitted by passing NULL, this is more efficient if the reversed +version of the string to be matched is not at hand, as +g_pattern_match() will only construct it if the compiled pattern +requires reverse matches. +

+

+Note that, if the user code will (possibly) match a string against a +multitude of patterns containing wildcards, chances are high that +some patterns will require a reversed string. In this case, it's +more efficient to provide the reversed string to avoid multiple +constructions thereof in the various calls to g_pattern_match(). +

+

+Note also that the reverse of a UTF-8 encoded string can in general +not be obtained by g_strreverse(). This works +only if the string doesn't contain any multibyte characters. GLib +offers the g_utf8_strreverse() function to reverse UTF-8 encoded +strings.

+
++ + + + + + + + + + + + + + + + + + + + + + +

pspec :

a GPatternSpec +

string_length :

the length of string (in bytes, i.e. strlen(), + not g_utf8_strlen()) +

string :

the UTF-8 encoded string to match +

string_reversed :

the reverse of string or NULL +

Returns :

TRUE if string matches pspec +
+
+
+
+

g_pattern_match_string ()

+
gboolean            g_pattern_match_string              (GPatternSpec *pspec,
+                                                         const gchar *string);
+

+Matches a string against a compiled pattern. If the string is to be +matched against more than one pattern, consider using +g_pattern_match() instead while supplying the reversed string.

+
++ + + + + + + + + + + + + + +

pspec :

a GPatternSpec +

string :

the UTF-8 encoded string to match +

Returns :

TRUE if string matches pspec +
+
+
+
+

g_pattern_match_simple ()

+
gboolean            g_pattern_match_simple              (const gchar *pattern,
+                                                         const gchar *string);
+

+Matches a string against a pattern given as a string. If this +function is to be called in a loop, it's more efficient to compile +the pattern once with g_pattern_spec_new() and call +g_pattern_match_string() repeatedly.

+
++ + + + + + + + + + + + + + +

pattern :

the UTF-8 encoded pattern +

string :

the UTF-8 encoded string to match +

Returns :

TRUE if string matches pspec +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Hash-Tables.html b/docs/reference/glib/html/glib-Hash-Tables.html new file mode 100644 index 0000000..fac40b5 --- /dev/null +++ b/docs/reference/glib/html/glib-Hash-Tables.html @@ -0,0 +1,1470 @@ + + + + +Hash Tables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Hash Tables

+

Hash Tables — associations between keys and values so that + given a key the value can be found quickly

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GHashTable;
+GHashTable*         g_hash_table_new                    (GHashFunc hash_func,
+                                                         GEqualFunc key_equal_func);
+GHashTable*         g_hash_table_new_full               (GHashFunc hash_func,
+                                                         GEqualFunc key_equal_func,
+                                                         GDestroyNotify key_destroy_func,
+                                                         GDestroyNotify value_destroy_func);
+guint               (*GHashFunc)                        (gconstpointer key);
+gboolean            (*GEqualFunc)                       (gconstpointer a,
+                                                         gconstpointer b);
+void                g_hash_table_insert                 (GHashTable *hash_table,
+                                                         gpointer key,
+                                                         gpointer value);
+void                g_hash_table_replace                (GHashTable *hash_table,
+                                                         gpointer key,
+                                                         gpointer value);
+guint               g_hash_table_size                   (GHashTable *hash_table);
+gpointer            g_hash_table_lookup                 (GHashTable *hash_table,
+                                                         gconstpointer key);
+gboolean            g_hash_table_lookup_extended        (GHashTable *hash_table,
+                                                         gconstpointer lookup_key,
+                                                         gpointer *orig_key,
+                                                         gpointer *value);
+void                g_hash_table_foreach                (GHashTable *hash_table,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+gpointer            g_hash_table_find                   (GHashTable *hash_table,
+                                                         GHRFunc predicate,
+                                                         gpointer user_data);
+void                (*GHFunc)                           (gpointer key,
+                                                         gpointer value,
+                                                         gpointer user_data);
+gboolean            g_hash_table_remove                 (GHashTable *hash_table,
+                                                         gconstpointer key);
+gboolean            g_hash_table_steal                  (GHashTable *hash_table,
+                                                         gconstpointer key);
+guint               g_hash_table_foreach_remove         (GHashTable *hash_table,
+                                                         GHRFunc func,
+                                                         gpointer user_data);
+guint               g_hash_table_foreach_steal          (GHashTable *hash_table,
+                                                         GHRFunc func,
+                                                         gpointer user_data);
+void                g_hash_table_remove_all             (GHashTable *hash_table);
+void                g_hash_table_steal_all              (GHashTable *hash_table);
+GList *             g_hash_table_get_keys               (GHashTable *hash_table);
+GList *             g_hash_table_get_values             (GHashTable *hash_table);
+gboolean            (*GHRFunc)                          (gpointer key,
+                                                         gpointer value,
+                                                         gpointer user_data);
+#define             g_hash_table_freeze                 (hash_table)
+#define             g_hash_table_thaw                   (hash_table)
+void                g_hash_table_destroy                (GHashTable *hash_table);
+GHashTable*         g_hash_table_ref                    (GHashTable *hash_table);
+void                g_hash_table_unref                  (GHashTable *hash_table);
+                    GHashTableIter;
+void                g_hash_table_iter_init              (GHashTableIter *iter,
+                                                         GHashTable *hash_table);
+gboolean            g_hash_table_iter_next              (GHashTableIter *iter,
+                                                         gpointer *key,
+                                                         gpointer *value);
+GHashTable*         g_hash_table_iter_get_hash_table    (GHashTableIter *iter);
+void                g_hash_table_iter_remove            (GHashTableIter *iter);
+void                g_hash_table_iter_steal             (GHashTableIter *iter);
+
+gboolean            g_direct_equal                      (gconstpointer v1,
+                                                         gconstpointer v2);
+guint               g_direct_hash                       (gconstpointer v);
+gboolean            g_int_equal                         (gconstpointer v1,
+                                                         gconstpointer v2);
+guint               g_int_hash                          (gconstpointer v);
+gboolean            g_int64_equal                       (gconstpointer v1,
+                                                         gconstpointer v2);
+guint               g_int64_hash                        (gconstpointer v);
+gboolean            g_double_equal                      (gconstpointer v1,
+                                                         gconstpointer v2);
+guint               g_double_hash                       (gconstpointer v);
+gboolean            g_str_equal                         (gconstpointer v1,
+                                                         gconstpointer v2);
+guint               g_str_hash                          (gconstpointer v);
+
+
+
+

Description

+

+A GHashTable provides associations between keys and values which is +optimized so that given a key, the associated value can be found +very quickly. +

+

+Note that neither keys nor values are copied when inserted into the +GHashTable, so they must exist for the lifetime of the GHashTable. +This means that the use of static strings is OK, but temporary +strings (i.e. those created in buffers and those returned by GTK+ +widgets) should be copied with g_strdup() before being inserted. +

+

+If keys or values are dynamically allocated, you must be careful to +ensure that they are freed when they are removed from the +GHashTable, and also when they are overwritten by new insertions +into the GHashTable. It is also not advisable to mix static strings +and dynamically-allocated strings in a GHashTable, because it then +becomes difficult to determine whether the string should be freed. +

+

+To create a GHashTable, use g_hash_table_new(). +

+

+To insert a key and value into a GHashTable, use +g_hash_table_insert(). +

+

+To lookup a value corresponding to a given key, use +g_hash_table_lookup() and g_hash_table_lookup_extended(). +

+

+To remove a key and value, use g_hash_table_remove(). +

+

+To call a function for each key and value pair use +g_hash_table_foreach() or use a iterator to iterate over the +key/value pairs in the hash table, see GHashTableIter. +

+

+To destroy a GHashTable use g_hash_table_destroy().

+
+
+

Details

+
+

GHashTable

+
typedef struct _GHashTable GHashTable;
+

+The GHashTable struct is an opaque data structure to represent a +Hash Table. It should only be +accessed via the following functions.

+
+
+
+

g_hash_table_new ()

+
GHashTable*         g_hash_table_new                    (GHashFunc hash_func,
+                                                         GEqualFunc key_equal_func);
+

+Creates a new GHashTable with a reference count of 1.

+
++ + + + + + + + + + + + + + +

hash_func :

a function to create a hash value from a key. + Hash values are used to determine where keys are stored within the + GHashTable data structure. The g_direct_hash(), g_int_hash(), + g_int64_hash(), g_double_hash() and g_str_hash() functions are provided + for some common types of keys. + If hash_func is NULL, g_direct_hash() is used. +

key_equal_func :

a function to check two keys for equality. This is + used when looking up keys in the GHashTable. The g_direct_equal(), + g_int_equal(), g_int64_equal(), g_double_equal() and g_str_equal() + functions are provided for the most common types of keys. + If key_equal_func is NULL, keys are compared directly in a similar + fashion to g_direct_equal(), but without the overhead of a function call. +

Returns :

a new GHashTable. +
+
+
+
+

g_hash_table_new_full ()

+
GHashTable*         g_hash_table_new_full               (GHashFunc hash_func,
+                                                         GEqualFunc key_equal_func,
+                                                         GDestroyNotify key_destroy_func,
+                                                         GDestroyNotify value_destroy_func);
+

+Creates a new GHashTable like g_hash_table_new() with a reference count +of 1 and allows to specify functions to free the memory allocated for the +key and value that get called when removing the entry from the GHashTable.

+
++ + + + + + + + + + + + + + + + + + + + + + +

hash_func :

a function to create a hash value from a key. +

key_equal_func :

a function to check two keys for equality. +

key_destroy_func :

a function to free the memory allocated for the key + used when removing the entry from the GHashTable or NULL if you + don't want to supply such a function. +

value_destroy_func :

a function to free the memory allocated for the + value used when removing the entry from the GHashTable or NULL if + you don't want to supply such a function. +

Returns :

a new GHashTable. +
+
+
+
+

GHashFunc ()

+
guint               (*GHashFunc)                        (gconstpointer key);
+

+Specifies the type of the hash function which is passed to +g_hash_table_new() when a GHashTable is created. +

+

+The function is passed a key and should return a guint hash value. +The functions g_direct_hash(), g_int_hash() and g_str_hash() provide +hash functions which can be used when the key is a gpointer, gint, +and gchar* respectively. +

+

+ The hash values should be evenly +distributed over a fairly large range? The modulus is taken with the +hash table size (a prime number) to find the 'bucket' to place each +key into. The function should also be very fast, since it is called +for each key lookup.

+
++ + + + + + + + + + +

key :

a key. +

Returns :

the hash value corresponding to the key. +
+
+
+
+

GEqualFunc ()

+
gboolean            (*GEqualFunc)                       (gconstpointer a,
+                                                         gconstpointer b);
+

+Specifies the type of a function used to test two values for +equality. The function should return TRUE if both values are equal +and FALSE otherwise.

+
++ + + + + + + + + + + + + + +

a :

a value. +

b :

a value to compare with. +

Returns :

TRUE if a = b; FALSE otherwise. +
+
+
+
+

g_hash_table_insert ()

+
void                g_hash_table_insert                 (GHashTable *hash_table,
+                                                         gpointer key,
+                                                         gpointer value);
+

+Inserts a new key and value into a GHashTable. +

+

+If the key already exists in the GHashTable its current value is replaced +with the new value. If you supplied a value_destroy_func when creating the +GHashTable, the old value is freed using that function. If you supplied +a key_destroy_func when creating the GHashTable, the passed key is freed +using that function.

+
++ + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

key :

a key to insert. +

value :

the value to associate with the key. +
+
+
+
+

g_hash_table_replace ()

+
void                g_hash_table_replace                (GHashTable *hash_table,
+                                                         gpointer key,
+                                                         gpointer value);
+

+Inserts a new key and value into a GHashTable similar to +g_hash_table_insert(). The difference is that if the key already exists +in the GHashTable, it gets replaced by the new key. If you supplied a +value_destroy_func when creating the GHashTable, the old value is freed +using that function. If you supplied a key_destroy_func when creating the +GHashTable, the old key is freed using that function.

+
++ + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

key :

a key to insert. +

value :

the value to associate with the key. +
+
+
+
+

g_hash_table_size ()

+
guint               g_hash_table_size                   (GHashTable *hash_table);
+

+Returns the number of elements contained in the GHashTable.

+
++ + + + + + + + + + +

hash_table :

a GHashTable. +

Returns :

the number of key/value pairs in the GHashTable. +
+
+
+
+

g_hash_table_lookup ()

+
gpointer            g_hash_table_lookup                 (GHashTable *hash_table,
+                                                         gconstpointer key);
+

+Looks up a key in a GHashTable. Note that this function cannot +distinguish between a key that is not present and one which is present +and has the value NULL. If you need this distinction, use +g_hash_table_lookup_extended().

+
++ + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

key :

the key to look up. +

Returns :

the associated value, or NULL if the key is not found. +
+
+
+
+

g_hash_table_lookup_extended ()

+
gboolean            g_hash_table_lookup_extended        (GHashTable *hash_table,
+                                                         gconstpointer lookup_key,
+                                                         gpointer *orig_key,
+                                                         gpointer *value);
+

+Looks up a key in the GHashTable, returning the original key and the +associated value and a gboolean which is TRUE if the key was found. This +is useful if you need to free the memory allocated for the original key, +for example before calling g_hash_table_remove(). +

+

+You can actually pass NULL for lookup_key to test +whether the NULL key exists.

+
++ + + + + + + + + + + + + + + + + + + + + + +

hash_table :

a GHashTable +

lookup_key :

the key to look up +

orig_key :

return location for the original key, or NULL +

value :

return location for the value associated with the key, or NULL +

Returns :

TRUE if the key was found in the GHashTable. +
+
+
+
+

g_hash_table_foreach ()

+
void                g_hash_table_foreach                (GHashTable *hash_table,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each of the key/value pairs in the +GHashTable. The function is passed the key and value of each +pair, and the given user_data parameter. The hash table may not +be modified while iterating over it (you can't add/remove +items). To remove all items matching a predicate, use +g_hash_table_foreach_remove(). +

+

+See g_hash_table_find() for performance caveats for linear +order searches in contrast to g_hash_table_lookup().

+
++ + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

func :

the function to call for each key/value pair. +

user_data :

user data to pass to the function. +
+
+
+
+

g_hash_table_find ()

+
gpointer            g_hash_table_find                   (GHashTable *hash_table,
+                                                         GHRFunc predicate,
+                                                         gpointer user_data);
+

+Calls the given function for key/value pairs in the GHashTable until +predicate returns TRUE. The function is passed the key and value of +each pair, and the given user_data parameter. The hash table may not +be modified while iterating over it (you can't add/remove items). +

+

+Note, that hash tables are really only optimized for forward lookups, +i.e. g_hash_table_lookup(). +So code that frequently issues g_hash_table_find() or +g_hash_table_foreach() (e.g. in the order of once per every entry in a +hash table) should probably be reworked to use additional or different +data structures for reverse lookups (keep in mind that an O(n) find/foreach +operation issued for all n values in a hash table ends up needing O(n*n) +operations).

+
++ + + + + + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

predicate :

function to test the key/value pairs for a certain property. +

user_data :

user data to pass to the function. +

Returns :

The value of the first key/value pair is returned, for which +func evaluates to TRUE. If no pair with the requested property is found, +NULL is returned. + +
+

Since 2.4

+
+
+
+

GHFunc ()

+
void                (*GHFunc)                           (gpointer key,
+                                                         gpointer value,
+                                                         gpointer user_data);
+

+Specifies the type of the function passed to g_hash_table_foreach(). +It is called with each key/value pair, together with the user_data +parameter which is passed to g_hash_table_foreach().

+
++ + + + + + + + + + + + + + +

key :

a key. +

value :

the value corresponding to the key. +

user_data :

user data passed to g_hash_table_foreach(). +
+
+
+
+

g_hash_table_remove ()

+
gboolean            g_hash_table_remove                 (GHashTable *hash_table,
+                                                         gconstpointer key);
+

+Removes a key and its associated value from a GHashTable. +

+

+If the GHashTable was created using g_hash_table_new_full(), the +key and value are freed using the supplied destroy functions, otherwise +you have to make sure that any dynamically allocated values are freed +yourself.

+
++ + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

key :

the key to remove. +

Returns :

TRUE if the key was found and removed from the GHashTable. +
+
+
+
+

g_hash_table_steal ()

+
gboolean            g_hash_table_steal                  (GHashTable *hash_table,
+                                                         gconstpointer key);
+

+Removes a key and its associated value from a GHashTable without +calling the key and value destroy functions.

+
++ + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

key :

the key to remove. +

Returns :

TRUE if the key was found and removed from the GHashTable. +
+
+
+
+

g_hash_table_foreach_remove ()

+
guint               g_hash_table_foreach_remove         (GHashTable *hash_table,
+                                                         GHRFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each key/value pair in the GHashTable. +If the function returns TRUE, then the key/value pair is removed from the +GHashTable. If you supplied key or value destroy functions when creating +the GHashTable, they are used to free the memory allocated for the removed +keys and values. +

+

+See GHashTableIter for an alternative way to loop over the +key/value pairs in the hash table.

+
++ + + + + + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

func :

the function to call for each key/value pair. +

user_data :

user data to pass to the function. +

Returns :

the number of key/value pairs removed. +
+
+
+
+

g_hash_table_foreach_steal ()

+
guint               g_hash_table_foreach_steal          (GHashTable *hash_table,
+                                                         GHRFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each key/value pair in the GHashTable. +If the function returns TRUE, then the key/value pair is removed from the +GHashTable, but no key or value destroy functions are called. +

+

+See GHashTableIter for an alternative way to loop over the +key/value pairs in the hash table.

+
++ + + + + + + + + + + + + + + + + + +

hash_table :

a GHashTable. +

func :

the function to call for each key/value pair. +

user_data :

user data to pass to the function. +

Returns :

the number of key/value pairs removed. +
+
+
+
+

g_hash_table_remove_all ()

+
void                g_hash_table_remove_all             (GHashTable *hash_table);
+

+Removes all keys and their associated values from a GHashTable. +

+

+If the GHashTable was created using g_hash_table_new_full(), the keys +and values are freed using the supplied destroy functions, otherwise you +have to make sure that any dynamically allocated values are freed +yourself.

+
++ + + + +

hash_table :

a GHashTable +
+

Since 2.12

+
+
+
+

g_hash_table_steal_all ()

+
void                g_hash_table_steal_all              (GHashTable *hash_table);
+

+Removes all keys and their associated values from a GHashTable +without calling the key and value destroy functions.

+
++ + + + +

hash_table :

a GHashTable. +
+

Since 2.12

+
+
+
+

g_hash_table_get_keys ()

+
GList *             g_hash_table_get_keys               (GHashTable *hash_table);
+

+Retrieves every key inside hash_table. The returned data is valid +until hash_table is modified.

+
++ + + + + + + + + + +

hash_table :

a GHashTable +

Returns :

a GList containing all the keys inside the hash + table. The content of the list is owned by the hash table and + should not be modified or freed. Use g_list_free() when done + using the list. + +
+

Since 2.14

+
+
+
+

g_hash_table_get_values ()

+
GList *             g_hash_table_get_values             (GHashTable *hash_table);
+

+Retrieves every value inside hash_table. The returned data is +valid until hash_table is modified.

+
++ + + + + + + + + + +

hash_table :

a GHashTable +

Returns :

a GList containing all the values inside the hash + table. The content of the list is owned by the hash table and + should not be modified or freed. Use g_list_free() when done + using the list. + +
+

Since 2.14

+
+
+
+

GHRFunc ()

+
gboolean            (*GHRFunc)                          (gpointer key,
+                                                         gpointer value,
+                                                         gpointer user_data);
+

+Specifies the type of the function passed to +g_hash_table_foreach_remove(). It is called with each key/value +pair, together with the user_data parameter passed to +g_hash_table_foreach_remove(). It should return TRUE if the +key/value pair should be removed from the GHashTable.

+
++ + + + + + + + + + + + + + + + + + +

key :

a key. +

value :

the value associated with the key. +

user_data :

user data passed to g_hash_table_remove(). +

Returns :

TRUE if the key/value pair should be removed from the + GHashTable. +
+
+
+
+

g_hash_table_freeze()

+
#define             g_hash_table_freeze(hash_table)
+
+

Warning

+

g_hash_table_freeze is deprecated and should not be used in newly-written code.

+
+

+This function is deprecated and will be removed in the next major +release of GLib. It does nothing.

+
++ + + + +

hash_table :

a GHashTable +
+
+
+
+

g_hash_table_thaw()

+
#define             g_hash_table_thaw(hash_table)
+
+

Warning

+

g_hash_table_thaw is deprecated and should not be used in newly-written code.

+
+

+This function is deprecated and will be removed in the next major +release of GLib. It does nothing.

+
++ + + + +

hash_table :

a GHashTable +
+
+
+
+

g_hash_table_destroy ()

+
void                g_hash_table_destroy                (GHashTable *hash_table);
+

+Destroys all keys and values in the GHashTable and decrements its +reference count by 1. If keys and/or values are dynamically allocated, +you should either free them first or create the GHashTable with destroy +notifiers using g_hash_table_new_full(). In the latter case the destroy +functions you supplied will be called on all keys and values during the +destruction phase.

+
++ + + + +

hash_table :

a GHashTable. +
+
+
+
+

g_hash_table_ref ()

+
GHashTable*         g_hash_table_ref                    (GHashTable *hash_table);
+

+Atomically increments the reference count of hash_table by one. +This function is MT-safe and may be called from any thread.

+
++ + + + + + + + + + +

hash_table :

a valid GHashTable. +

Returns :

the passed in GHashTable. + +
+

Since 2.10

+
+
+
+

g_hash_table_unref ()

+
void                g_hash_table_unref                  (GHashTable *hash_table);
+

+Atomically decrements the reference count of hash_table by one. +If the reference count drops to 0, all keys and values will be +destroyed, and all memory allocated by the hash table is released. +This function is MT-safe and may be called from any thread.

+
++ + + + +

hash_table :

a valid GHashTable. +
+

Since 2.10

+
+
+
+

GHashTableIter

+
typedef struct {
+} GHashTableIter;
+
+

+A GHashTableIter structure represents an iterator that can be used +to iterate over the elements of a GHashTable. GHashTableIter +structures are typically allocated on the stack and then initialized +with g_hash_table_iter_init().

+
+
+
+

g_hash_table_iter_init ()

+
void                g_hash_table_iter_init              (GHashTableIter *iter,
+                                                         GHashTable *hash_table);
+

+Initializes a key/value pair iterator and associates it with +hash_table. Modifying the hash table after calling this function +invalidates the returned iterator. +

+
+GHashTableIter iter;
+gpointer key, value;
+
+g_hash_table_iter_init (&iter, hash_table);
+while (g_hash_table_iter_next (&iter, &key, &value)) 
+  {
+    /* do something with key and value */
+  }
+
+
++ + + + + + + + + + +

iter :

an uninitialized GHashTableIter. +

hash_table :

a GHashTable. +
+

Since 2.16

+
+
+
+

g_hash_table_iter_next ()

+
gboolean            g_hash_table_iter_next              (GHashTableIter *iter,
+                                                         gpointer *key,
+                                                         gpointer *value);
+

+Advances iter and retrieves the key and/or value that are now +pointed to as a result of this advancement. If FALSE is returned, +key and value are not set, and the iterator becomes invalid.

+
++ + + + + + + + + + + + + + + + + + +

iter :

an initialized GHashTableIter. +

key :

a location to store the key, or NULL. +

value :

a location to store the value, or NULL. +

Returns :

FALSE if the end of the GHashTable has been reached. + +
+

Since 2.16

+
+
+
+

g_hash_table_iter_get_hash_table ()

+
GHashTable*         g_hash_table_iter_get_hash_table    (GHashTableIter *iter);
+

+Returns the GHashTable associated with iter.

+
++ + + + + + + + + + +

iter :

an initialized GHashTableIter. +

Returns :

the GHashTable associated with iter. + +
+

Since 2.16

+
+
+
+

g_hash_table_iter_remove ()

+
void                g_hash_table_iter_remove            (GHashTableIter *iter);
+

+Removes the key/value pair currently pointed to by the iterator +from its associated GHashTable. Can only be called after +g_hash_table_iter_next() returned TRUE, and cannot be called more +than once for the same key/value pair. +

+

+If the GHashTable was created using g_hash_table_new_full(), the +key and value are freed using the supplied destroy functions, otherwise +you have to make sure that any dynamically allocated values are freed +yourself.

+
++ + + + +

iter :

an initialized GHashTableIter. +
+

Since 2.16

+
+
+
+

g_hash_table_iter_steal ()

+
void                g_hash_table_iter_steal             (GHashTableIter *iter);
+

+Removes the key/value pair currently pointed to by the iterator +from its associated GHashTable, without calling the key and value +destroy functions. Can only be called after +g_hash_table_iter_next() returned TRUE, and cannot be called more +than once for the same key/value pair.

+
++ + + + +

iter :

an initialized GHashTableIter. +
+

Since 2.16

+
+
+
+

g_direct_equal ()

+
gboolean            g_direct_equal                      (gconstpointer v1,
+                                                         gconstpointer v2);
+

+Compares two gpointer arguments and returns TRUE if they are equal. +It can be passed to g_hash_table_new() as the key_equal_func +parameter, when using pointers as keys in a GHashTable.

+
++ + + + + + + + + + + + + + +

v1 :

a key. +

v2 :

a key to compare with v1. +

Returns :

TRUE if the two keys match. +
+
+
+
+

g_direct_hash ()

+
guint               g_direct_hash                       (gconstpointer v);
+

+Converts a gpointer to a hash value. +It can be passed to g_hash_table_new() as the hash_func parameter, +when using pointers as keys in a GHashTable.

+
++ + + + + + + + + + +

v :

a gpointer key +

Returns :

a hash value corresponding to the key. +
+
+
+
+

g_int_equal ()

+
gboolean            g_int_equal                         (gconstpointer v1,
+                                                         gconstpointer v2);
+

+Compares the two gint values being pointed to and returns +TRUE if they are equal. +It can be passed to g_hash_table_new() as the key_equal_func +parameter, when using pointers to integers as keys in a GHashTable.

+
++ + + + + + + + + + + + + + +

v1 :

a pointer to a gint key. +

v2 :

a pointer to a gint key to compare with v1. +

Returns :

TRUE if the two keys match. +
+
+
+
+

g_int_hash ()

+
guint               g_int_hash                          (gconstpointer v);
+

+Converts a pointer to a gint to a hash value. +It can be passed to g_hash_table_new() as the hash_func parameter, +when using pointers to integers values as keys in a GHashTable.

+
++ + + + + + + + + + +

v :

a pointer to a gint key +

Returns :

a hash value corresponding to the key. +
+
+
+
+

g_int64_equal ()

+
gboolean            g_int64_equal                       (gconstpointer v1,
+                                                         gconstpointer v2);
+

+Compares the two gint64 values being pointed to and returns +TRUE if they are equal. +It can be passed to g_hash_table_new() as the key_equal_func +parameter, when using pointers to 64-bit integers as keys in a GHashTable.

+
++ + + + + + + + + + + + + + +

v1 :

a pointer to a gint64 key. +

v2 :

a pointer to a gint64 key to compare with v1. +

Returns :

TRUE if the two keys match. + +
+

Since 2.22

+
+
+
+

g_int64_hash ()

+
guint               g_int64_hash                        (gconstpointer v);
+

+Converts a pointer to a gint64 to a hash value. +It can be passed to g_hash_table_new() as the hash_func parameter, +when using pointers to 64-bit integers values as keys in a GHashTable.

+
++ + + + + + + + + + +

v :

a pointer to a gint64 key +

Returns :

a hash value corresponding to the key. + +
+

Since 2.22

+
+
+
+

g_double_equal ()

+
gboolean            g_double_equal                      (gconstpointer v1,
+                                                         gconstpointer v2);
+

+Compares the two gdouble values being pointed to and returns +TRUE if they are equal. +It can be passed to g_hash_table_new() as the key_equal_func +parameter, when using pointers to doubles as keys in a GHashTable.

+
++ + + + + + + + + + + + + + +

v1 :

a pointer to a gdouble key. +

v2 :

a pointer to a gdouble key to compare with v1. +

Returns :

TRUE if the two keys match. + +
+

Since 2.22

+
+
+
+

g_double_hash ()

+
guint               g_double_hash                       (gconstpointer v);
+

+Converts a pointer to a gdouble to a hash value. +It can be passed to g_hash_table_new() as the hash_func parameter, +when using pointers to doubles as keys in a GHashTable.

+
++ + + + + + + + + + +

v :

a pointer to a gdouble key +

Returns :

a hash value corresponding to the key. + +
+

Since 2.22

+
+
+
+

g_str_equal ()

+
gboolean            g_str_equal                         (gconstpointer v1,
+                                                         gconstpointer v2);
+

+Compares two strings for byte-by-byte equality and returns TRUE +if they are equal. It can be passed to g_hash_table_new() as the +key_equal_func parameter, when using strings as keys in a GHashTable. +

+

+Note that this function is primarily meant as a hash table comparison +function. For a general-purpose, NULL-safe string comparison function, +see g_strcmp0().

+
++ + + + + + + + + + + + + + +

v1 :

a key +

v2 :

a key to compare with v1 +

Returns :

TRUE if the two keys match +
+
+
+
+

g_str_hash ()

+
guint               g_str_hash                          (gconstpointer v);
+

+Converts a string to a hash value. +It can be passed to g_hash_table_new() as the hash_func +parameter, when using strings as keys in a GHashTable.

+
++ + + + + + + + + + +

v :

a string key +

Returns :

a hash value corresponding to the key +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Hook-Functions.html b/docs/reference/glib/html/glib-Hook-Functions.html new file mode 100644 index 0000000..afd3b17 --- /dev/null +++ b/docs/reference/glib/html/glib-Hook-Functions.html @@ -0,0 +1,1386 @@ + + + + +Hook Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Hook Functions

+

Hook Functions — support for manipulating lists of hook functions

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GHookList;
+void                (*GHookFinalizeFunc)                (GHookList *hook_list,
+                                                         GHook *hook);
+                    GHook;
+void                (*GHookFunc)                        (gpointer data);
+gboolean            (*GHookCheckFunc)                   (gpointer data);
+
+void                g_hook_list_init                    (GHookList *hook_list,
+                                                         guint hook_size);
+void                g_hook_list_invoke                  (GHookList *hook_list,
+                                                         gboolean may_recurse);
+void                g_hook_list_invoke_check            (GHookList *hook_list,
+                                                         gboolean may_recurse);
+void                g_hook_list_marshal                 (GHookList *hook_list,
+                                                         gboolean may_recurse,
+                                                         GHookMarshaller marshaller,
+                                                         gpointer marshal_data);
+void                (*GHookMarshaller)                  (GHook *hook,
+                                                         gpointer marshal_data);
+void                g_hook_list_marshal_check           (GHookList *hook_list,
+                                                         gboolean may_recurse,
+                                                         GHookCheckMarshaller marshaller,
+                                                         gpointer marshal_data);
+gboolean            (*GHookCheckMarshaller)             (GHook *hook,
+                                                         gpointer marshal_data);
+void                g_hook_list_clear                   (GHookList *hook_list);
+
+GHook*              g_hook_alloc                        (GHookList *hook_list);
+#define             g_hook_append                       ( hook_list, hook )
+void                g_hook_prepend                      (GHookList *hook_list,
+                                                         GHook *hook);
+void                g_hook_insert_before                (GHookList *hook_list,
+                                                         GHook *sibling,
+                                                         GHook *hook);
+void                g_hook_insert_sorted                (GHookList *hook_list,
+                                                         GHook *hook,
+                                                         GHookCompareFunc func);
+gint                (*GHookCompareFunc)                 (GHook *new_hook,
+                                                         GHook *sibling);
+gint                g_hook_compare_ids                  (GHook *new_hook,
+                                                         GHook *sibling);
+
+GHook*              g_hook_get                          (GHookList *hook_list,
+                                                         gulong hook_id);
+GHook*              g_hook_find                         (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         GHookFindFunc func,
+                                                         gpointer data);
+gboolean            (*GHookFindFunc)                    (GHook *hook,
+                                                         gpointer data);
+GHook*              g_hook_find_data                    (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         gpointer data);
+GHook*              g_hook_find_func                    (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         gpointer func);
+GHook*              g_hook_find_func_data               (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         gpointer func,
+                                                         gpointer data);
+
+GHook*              g_hook_first_valid                  (GHookList *hook_list,
+                                                         gboolean may_be_in_call);
+GHook*              g_hook_next_valid                   (GHookList *hook_list,
+                                                         GHook *hook,
+                                                         gboolean may_be_in_call);
+enum                GHookFlagMask;
+#define             G_HOOK_FLAGS                        (hook)
+#define             G_HOOK_FLAG_USER_SHIFT
+
+#define             G_HOOK                              (hook)
+#define             G_HOOK_IS_VALID                     (hook)
+#define             G_HOOK_ACTIVE                       (hook)
+#define             G_HOOK_IN_CALL                      (hook)
+#define             G_HOOK_IS_UNLINKED                  (hook)
+
+GHook *             g_hook_ref                          (GHookList *hook_list,
+                                                         GHook *hook);
+void                g_hook_unref                        (GHookList *hook_list,
+                                                         GHook *hook);
+void                g_hook_free                         (GHookList *hook_list,
+                                                         GHook *hook);
+gboolean            g_hook_destroy                      (GHookList *hook_list,
+                                                         gulong hook_id);
+void                g_hook_destroy_link                 (GHookList *hook_list,
+                                                         GHook *hook);
+
+
+
+

Description

+

+The GHookList, GHook and their related functions provide support for +lists of hook functions. Functions can be added and removed from the lists, +and the list of hook functions can be invoked. +

+
+
+

Details

+
+

GHookList

+
typedef struct {
+  gulong	    seq_id;
+  guint		    hook_size : 16;
+  guint		    is_setup : 1;
+  GHook		   *hooks;
+  gpointer	    dummy3;
+  GHookFinalizeFunc finalize_hook;
+  gpointer	    dummy[2];
+} GHookList;
+
+

+The GHookList struct represents a +list of hook functions. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

gulong seq_id;

the next free GHook id +

guint hook_size : 16;

the size of the GHookList elements, in bytes +

guint is_setup : 1;

1 if the GHookList has been initialized +

GHook *hooks;

the first GHook element in the list +

gpointer dummy3;

unused +

GHookFinalizeFunc finalize_hook;

the function to call to finalize a GHook element. The +default behaviour is to call the hooks destroy function +

gpointer dummy[2];

unused +
+
+
+
+

GHookFinalizeFunc ()

+
void                (*GHookFinalizeFunc)                (GHookList *hook_list,
+                                                         GHook *hook);
+

+Defines the type of function to be called when a hook in a +list of hooks gets finalized. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook :

the hook in hook_list that gets finalized +
+
+
+
+

GHook

+
typedef struct {
+  gpointer	 data;
+  GHook		*next;
+  GHook		*prev;
+  guint		 ref_count;
+  gulong	 hook_id;
+  guint		 flags;
+  gpointer	 func;
+  GDestroyNotify destroy;
+} GHook;
+
+

+The GHook struct represents a single hook +function in a GHookList. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

gpointer data;

data which is passed to func when this hook is invoked +

GHook *next;

pointer to the next hook in the list +

GHook *prev;

pointer to the previous hook in the list +

guint ref_count;

the reference count of this hook +

gulong hook_id;

the id of this hook, which is unique within its list +

guint flags;

flags which are set for this hook. See GHookFlagMask for + predefined flags +

gpointer func;

the function to call when this hook is invoked. The possible +signatures for this function are GHookFunc and GHookCheckFunc +

GDestroyNotify destroy;

the default finalize_hook function of a +GHookList calls this member of the hook that is being finalized +
+
+
+
+

GHookFunc ()

+
void                (*GHookFunc)                        (gpointer data);
+

+Defines the type of a hook function that can be invoked +by g_hook_list_invoke(). +

+
++ + + + +

data :

the data field of the GHook is passed to the hook function here +
+
+
+
+

GHookCheckFunc ()

+
gboolean            (*GHookCheckFunc)                   (gpointer data);
+

+Defines the type of a hook function that can be invoked +by g_hook_list_invoke_check(). +

+
++ + + + + + + + + + +

data :

the data field of the GHook is passed to the hook function here +

Returns :

+FALSE if the GHook should be destroyed +
+
+
+
+

g_hook_list_init ()

+
void                g_hook_list_init                    (GHookList *hook_list,
+                                                         guint hook_size);
+

+Initializes a GHookList. +This must be called before the GHookList is used. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook_size :

the size of each element in the GHookList, typically + sizeof (GHook) +
+
+
+
+

g_hook_list_invoke ()

+
void                g_hook_list_invoke                  (GHookList *hook_list,
+                                                         gboolean may_recurse);
+

+Calls all of the GHook functions in a GHookList. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

may_recurse :

+TRUE if functions which are already running (e.g. in another + thread) can be called. If set to FALSE, these are skipped +
+
+
+
+

g_hook_list_invoke_check ()

+
void                g_hook_list_invoke_check            (GHookList *hook_list,
+                                                         gboolean may_recurse);
+

+Calls all of the GHook functions in a GHookList. +Any function which returns FALSE is removed from the GHookList. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

may_recurse :

+TRUE if functions which are already running (e.g. in another +thread) can be called. If set to FALSE, these are skipped +
+
+
+
+

g_hook_list_marshal ()

+
void                g_hook_list_marshal                 (GHookList *hook_list,
+                                                         gboolean may_recurse,
+                                                         GHookMarshaller marshaller,
+                                                         gpointer marshal_data);
+

+Calls a function on each valid GHook. +

+
++ + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

may_recurse :

+TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to FALSE, these are skipped +

marshaller :

the function to call for each GHook +

marshal_data :

data to pass to marshaller +
+
+
+
+

GHookMarshaller ()

+
void                (*GHookMarshaller)                  (GHook *hook,
+                                                         gpointer marshal_data);
+

+Defines the type of function used by g_hook_list_marshal(). +

+
++ + + + + + + + + + +

hook :

a GHook +

marshal_data :

user data +
+
+
+
+

g_hook_list_marshal_check ()

+
void                g_hook_list_marshal_check           (GHookList *hook_list,
+                                                         gboolean may_recurse,
+                                                         GHookCheckMarshaller marshaller,
+                                                         gpointer marshal_data);
+

+Calls a function on each valid GHook and destroys it if the +function returns FALSE. +

+
++ + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

may_recurse :

+TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to FALSE, these are skipped +

marshaller :

the function to call for each GHook +

marshal_data :

data to pass to marshaller +
+
+
+
+

GHookCheckMarshaller ()

+
gboolean            (*GHookCheckMarshaller)             (GHook *hook,
+                                                         gpointer marshal_data);
+

+Defines the type of function used by g_hook_list_marshal_check(). +

+
++ + + + + + + + + + + + + + +

hook :

a GHook +

marshal_data :

user data +

Returns :

+FALSE if hook should be destroyed +
+
+
+
+

g_hook_list_clear ()

+
void                g_hook_list_clear                   (GHookList *hook_list);
+

+Removes all the GHook elements from a GHookList. +

+
++ + + + +

hook_list :

a GHookList +
+
+
+
+

g_hook_alloc ()

+
GHook*              g_hook_alloc                        (GHookList *hook_list);
+

+Allocates space for a GHook and initializes it. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

Returns :

a new GHook +
+
+
+
+

g_hook_append()

+
#define             g_hook_append( hook_list, hook )
+

+Appends a GHook onto the end of a GHookList. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to add to the end of hook_list +
+
+
+
+

g_hook_prepend ()

+
void                g_hook_prepend                      (GHookList *hook_list,
+                                                         GHook *hook);
+

+Prepends a GHook on the start of a GHookList. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to add to the start of hook_list +
+
+
+
+

g_hook_insert_before ()

+
void                g_hook_insert_before                (GHookList *hook_list,
+                                                         GHook *sibling,
+                                                         GHook *hook);
+

+Inserts a GHook into a GHookList, before a given GHook. +

+
++ + + + + + + + + + + + + + +

hook_list :

a GHookList +

sibling :

the GHook to insert the new GHook before +

hook :

the GHook to insert +
+
+
+
+

g_hook_insert_sorted ()

+
void                g_hook_insert_sorted                (GHookList *hook_list,
+                                                         GHook *hook,
+                                                         GHookCompareFunc func);
+

+Inserts a GHook into a GHookList, sorted by the given function. +

+
++ + + + + + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to insert +

func :

the comparison function used to sort the GHook elements +
+
+
+
+

GHookCompareFunc ()

+
gint                (*GHookCompareFunc)                 (GHook *new_hook,
+                                                         GHook *sibling);
+

+Defines the type of function used to compare GHook elements in +g_hook_insert_sorted(). +

+
++ + + + + + + + + + + + + + +

new_hook :

the GHook being inserted +

sibling :

the GHook to compare with new_hook +

Returns :

a value <= 0 if new_hook should be before sibling +
+
+
+
+

g_hook_compare_ids ()

+
gint                g_hook_compare_ids                  (GHook *new_hook,
+                                                         GHook *sibling);
+

+Compares the ids of two GHook elements, returning a negative value +if the second id is greater than the first. +

+
++ + + + + + + + + + + + + + +

new_hook :

a GHook +

sibling :

a GHook to compare with new_hook +

Returns :

a value <= 0 if the id of sibling is >= the id of new_hook +
+
+
+
+

g_hook_get ()

+
GHook*              g_hook_get                          (GHookList *hook_list,
+                                                         gulong hook_id);
+

+Returns the GHook with the given id, or NULL if it is not found. +

+
++ + + + + + + + + + + + + + +

hook_list :

a GHookList +

hook_id :

a hook id +

Returns :

the GHook with the given id, or NULL if it is not found +
+
+
+
+

g_hook_find ()

+
GHook*              g_hook_find                         (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         GHookFindFunc func,
+                                                         gpointer data);
+

+Finds a GHook in a GHookList using the given function to test for a match. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

need_valids :

+TRUE if GHook elements which have been destroyed should be + skipped +

func :

the function to call for each GHook, which should return TRUE when + the GHook has been found +

data :

the data to pass to func +

Returns :

the found GHook or NULL if no matching GHook is found +
+
+
+
+

GHookFindFunc ()

+
gboolean            (*GHookFindFunc)                    (GHook *hook,
+                                                         gpointer data);
+

+Defines the type of the function passed to g_hook_find(). +

+
++ + + + + + + + + + + + + + +

hook :

a GHook +

data :

user data passed to g_hook_find_func() +

Returns :

+TRUE if the required GHook has been found +
+
+
+
+

g_hook_find_data ()

+
GHook*              g_hook_find_data                    (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         gpointer data);
+

+Finds a GHook in a GHookList with the given data. +

+
++ + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

need_valids :

+TRUE if GHook elements which have been destroyed should be + skipped +

data :

the data to find +

Returns :

the GHook with the given data or NULL if no matching + GHook is found +
+
+
+
+

g_hook_find_func ()

+
GHook*              g_hook_find_func                    (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         gpointer func);
+

+Finds a GHook in a GHookList with the given function. +

+
++ + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

need_valids :

+TRUE if GHook elements which have been destroyed should be + skipped +

func :

the function to find +

Returns :

the GHook with the given func or NULL if no matching + GHook is found +
+
+
+
+

g_hook_find_func_data ()

+
GHook*              g_hook_find_func_data               (GHookList *hook_list,
+                                                         gboolean need_valids,
+                                                         gpointer func,
+                                                         gpointer data);
+

+Finds a GHook in a GHookList with the given function and data. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

need_valids :

+TRUE if GHook elements which have been destroyed should be + skipped +

func :

the function to find +

data :

the data to find +

Returns :

the GHook with the given func and data or NULL if no matching + GHook is found +
+
+
+
+

g_hook_first_valid ()

+
GHook*              g_hook_first_valid                  (GHookList *hook_list,
+                                                         gboolean may_be_in_call);
+

+Returns the first GHook in a GHookList which has not been destroyed. +The reference count for the GHook is incremented, so you must call +g_hook_unref() to restore it when no longer needed. (Or call +g_hook_next_valid() if you are stepping through the GHookList.) +

+
++ + + + + + + + + + + + + + +

hook_list :

a GHookList +

may_be_in_call :

+TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to FALSE, these are skipped +

Returns :

the first valid GHook, or NULL if none are valid +
+
+
+
+

g_hook_next_valid ()

+
GHook*              g_hook_next_valid                   (GHookList *hook_list,
+                                                         GHook *hook,
+                                                         gboolean may_be_in_call);
+

+Returns the next GHook in a GHookList which has not been destroyed. +The reference count for the GHook is incremented, so you must call +g_hook_unref() to restore it when no longer needed. (Or continue to call +g_hook_next_valid() until NULL is returned.) +

+
++ + + + + + + + + + + + + + + + + + +

hook_list :

a GHookList +

hook :

the current GHook +

may_be_in_call :

+TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to FALSE, these are skipped +

Returns :

the next valid GHook, or NULL if none are valid +
+
+
+
+

enum GHookFlagMask

+
typedef enum
+{
+  G_HOOK_FLAG_ACTIVE	    = 1 << 0,
+  G_HOOK_FLAG_IN_CALL	    = 1 << 1,
+  G_HOOK_FLAG_MASK	    = 0x0f
+} GHookFlagMask;
+
+

+Flags used internally in the GHook implementation. +

+
++ + + + + + + + + + + + + + +

G_HOOK_FLAG_ACTIVE

set if the hook has not been destroyed +

G_HOOK_FLAG_IN_CALL

set if the hook is currently being run +

G_HOOK_FLAG_MASK

A mask covering all bits reserved for + hook flags; see G_HOOK_FLAGS_USER_SHIFT +
+
+
+
+

G_HOOK_FLAGS()

+
#define G_HOOK_FLAGS(hook)		(G_HOOK (hook)->flags)
+
+

+Returns the flags of a hook. +

+
++ + + + +

hook :

a GHook +
+
+
+
+

G_HOOK_FLAG_USER_SHIFT

+
#define G_HOOK_FLAG_USER_SHIFT (4)
+
+

+The position of the first bit which is not reserved for internal +use be the GHook implementation, i.e. +1 << G_HOOK_FLAG_USER_SHIFT is the first bit +which can be used for application-defined flags. +

+
+
+
+

G_HOOK()

+
#define G_HOOK(hook)			((GHook*) (hook))
+
+

+Casts a pointer to a GHook*. +

+
++ + + + +

hook :

a pointer +
+
+
+
+

G_HOOK_IS_VALID()

+
#define             G_HOOK_IS_VALID(hook)
+

+Returns TRUE if the GHook is valid, i.e. it is in a GHookList, it is active +and it has not been destroyed. +

+
++ + + + + + + + + + +

hook :

a GHook +

Returns :

+TRUE if the GHook is valid +
+
+
+
+

G_HOOK_ACTIVE()

+
#define             G_HOOK_ACTIVE(hook)
+

+Returns TRUE if the GHook is active, which is normally TRUE until the GHook +is destroyed. +

+
++ + + + + + + + + + +

hook :

a GHook +

Returns :

+TRUE if the GHook is active +
+
+
+
+

G_HOOK_IN_CALL()

+
#define             G_HOOK_IN_CALL(hook)
+

+Returns TRUE if the GHook function is currently executing. +

+
++ + + + + + + + + + +

hook :

a GHook +

Returns :

+TRUE if the GHook function is currently executing +
+
+
+
+

G_HOOK_IS_UNLINKED()

+
#define             G_HOOK_IS_UNLINKED(hook)
+

+Returns TRUE if the GHook is not in a GHookList. +

+
++ + + + + + + + + + +

hook :

a GHook +

Returns :

+TRUE if the GHook is not in a GHookList +
+
+
+
+

g_hook_ref ()

+
GHook *             g_hook_ref                          (GHookList *hook_list,
+                                                         GHook *hook);
+

+Increments the reference count for a GHook. +

+
++ + + + + + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to increment the reference count of +

Returns :

the hook that was passed in (since 2.6) +
+
+
+
+

g_hook_unref ()

+
void                g_hook_unref                        (GHookList *hook_list,
+                                                         GHook *hook);
+

+Decrements the reference count of a GHook. +If the reference count falls to 0, the GHook is removed from the GHookList +and g_hook_free() is called to free it. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to unref +
+
+
+
+

g_hook_free ()

+
void                g_hook_free                         (GHookList *hook_list,
+                                                         GHook *hook);
+

+Calls the GHookList finalize_hook function if it exists, and frees the memory +allocated for the GHook. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to free +
+
+
+
+

g_hook_destroy ()

+
gboolean            g_hook_destroy                      (GHookList *hook_list,
+                                                         gulong hook_id);
+

+Destroys a GHook, given its ID. +

+
++ + + + + + + + + + + + + + +

hook_list :

a GHookList +

hook_id :

a hook ID +

Returns :

+TRUE if the GHook was found in the GHookList and destroyed +
+
+
+
+

g_hook_destroy_link ()

+
void                g_hook_destroy_link                 (GHookList *hook_list,
+                                                         GHook *hook);
+

+Removes one GHook from a GHookList, marking it inactive and calling +g_hook_unref() on it. +

+
++ + + + + + + + + + +

hook_list :

a GHookList +

hook :

the GHook to remove +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Hostname-Utilities.html b/docs/reference/glib/html/glib-Hostname-Utilities.html new file mode 100644 index 0000000..e828a31 --- /dev/null +++ b/docs/reference/glib/html/glib-Hostname-Utilities.html @@ -0,0 +1,243 @@ + + + + +Hostname Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Hostname Utilities

+

Hostname Utilities — Internet hostname utilities

+
+
+

Synopsis

+
+#include <glib.h>
+
+gchar *             g_hostname_to_ascii                 (const gchar *hostname);
+gchar *             g_hostname_to_unicode               (const gchar *hostname);
+
+gboolean            g_hostname_is_non_ascii             (const gchar *hostname);
+gboolean            g_hostname_is_ascii_encoded         (const gchar *hostname);
+
+gboolean            g_hostname_is_ip_address            (const gchar *hostname);
+
+
+
+

Description

+

+Functions for manipulating internet hostnames; in particular, for +converting between Unicode and ASCII-encoded forms of +Internationalized Domain Names (IDNs). +

+

+The Internationalized Domain +Names for Applications (IDNA) standards allow for the use +of Unicode domain names in applications, while providing +backward-compatibility with the old ASCII-only DNS, by defining an +ASCII-Compatible Encoding of any given Unicode name, which can be +used with non-IDN-aware applications and protocols. (For example, +"Παν語.org" maps to "xn--4wa8awb4637h.org".)

+
+
+

Details

+
+

g_hostname_to_ascii ()

+
gchar *             g_hostname_to_ascii                 (const gchar *hostname);
+

+Converts hostname to its canonical ASCII form; an ASCII-only +string containing no uppercase letters and not ending with a +trailing dot.

+
++ + + + + + + + + + +

hostname :

a valid UTF-8 or ASCII hostname +

Returns :

an ASCII hostname, which must be freed, or NULL if +hostname is in some way invalid. + +
+

Since 2.22

+
+
+
+

g_hostname_to_unicode ()

+
gchar *             g_hostname_to_unicode               (const gchar *hostname);
+

+Converts hostname to its canonical presentation form; a UTF-8 +string in Unicode normalization form C, containing no uppercase +letters, no forbidden characters, and no ASCII-encoded segments, +and not ending with a trailing dot. +

+

+Of course if hostname is not an internationalized hostname, then +the canonical presentation form will be entirely ASCII.

+
++ + + + + + + + + + +

hostname :

a valid UTF-8 or ASCII hostname +

Returns :

a UTF-8 hostname, which must be freed, or NULL if +hostname is in some way invalid. + +
+

Since 2.22

+
+
+
+

g_hostname_is_non_ascii ()

+
gboolean            g_hostname_is_non_ascii             (const gchar *hostname);
+

+Tests if hostname contains Unicode characters. If this returns +TRUE, you need to encode the hostname with g_hostname_to_ascii() +before using it in non-IDN-aware contexts. +

+

+Note that a hostname might contain a mix of encoded and unencoded +segments, and so it is possible for g_hostname_is_non_ascii() and +g_hostname_is_ascii_encoded() to both return TRUE for a name.

+
++ + + + + + + + + + +

hostname :

a hostname +

Returns :

TRUE if hostname contains any non-ASCII characters + +
+

Since 2.22

+
+
+
+

g_hostname_is_ascii_encoded ()

+
gboolean            g_hostname_is_ascii_encoded         (const gchar *hostname);
+

+Tests if hostname contains segments with an ASCII-compatible +encoding of an Internationalized Domain Name. If this returns +TRUE, you should decode the hostname with g_hostname_to_unicode() +before displaying it to the user. +

+

+Note that a hostname might contain a mix of encoded and unencoded +segments, and so it is possible for g_hostname_is_non_ascii() and +g_hostname_is_ascii_encoded() to both return TRUE for a name.

+
++ + + + + + + + + + +

hostname :

a hostname +

Returns :

TRUE if hostname contains any ASCII-encoded +segments. + +
+

Since 2.22

+
+
+
+

g_hostname_is_ip_address ()

+
gboolean            g_hostname_is_ip_address            (const gchar *hostname);
+

+Tests if hostname is the string form of an IPv4 or IPv6 address. +(Eg, "192.168.0.1".)

+
++ + + + + + + + + + +

hostname :

a hostname (or IP address in string form) +

Returns :

TRUE if hostname is an IP address + +
+

Since 2.22

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-I18N.html b/docs/reference/glib/html/glib-I18N.html new file mode 100644 index 0000000..76b7c1d --- /dev/null +++ b/docs/reference/glib/html/glib-I18N.html @@ -0,0 +1,583 @@ + + + + +Internationalization + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Internationalization

+

Internationalization — gettext support macros

+
+
+

Synopsis

+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#define             Q_                                  (String)
+#define             C_                                  (Context,String)
+#define             N_                                  (String)
+#define             NC_                                 (Context, String)
+const gchar *       g_dgettext                          (const gchar *domain,
+                                                         const gchar *msgid);
+const gchar *       g_dngettext                         (const gchar *domain,
+                                                         const gchar *msgid,
+                                                         const gchar *msgid_plural,
+                                                         gulong n);
+const gchar *       g_dpgettext                         (const gchar *domain,
+                                                         const gchar *msgctxtid,
+                                                         gsize msgidoffset);
+const gchar *       g_dpgettext2                        (const gchar *domain,
+                                                         const gchar *context,
+                                                         const gchar *msgid);
+const gchar *       g_strip_context                     (const gchar *msgid,
+                                                         const gchar *msgval);
+
+const gchar* const * g_get_language_names               (void);
+
+
+
+

Description

+

+GLib doesn't force any particular localization method upon its users. +But since GLib itself is localized using the gettext() mechanism, it seems +natural to offer the de-facto standard gettext() support macros in an +easy-to-use form. +

+

+In order to use these macros in an application, you must include +glib/gi18n.h. For use in a library, must include +glib/gi18n-lib.h after defining +the GETTEXT_PACKAGE macro suitably for your library: +

+
+#define GETTEXT_PACKAGE "gtk20"
+#include <glib/gi18n-lib.h>
+
+

+The gettext manual covers details of how to set up message extraction +with xgettext. +

+
+
+

Details

+
+

Q_()

+
#define             Q_(String)
+

+Like _(), but handles context in message ids. This has the advantage that +the string can be adorned with a prefix to guarantee uniqueness and provide +context to the translator. +

+

+One use case given in the gettext manual is GUI translation, where one could +e.g. disambiguate two "Open" menu entries as "File|Open" and "Printer|Open". +Another use case is the string "Russian" which may have to be translated +differently depending on whether it's the name of a character set or a +language. This could be solved by using "charset|Russian" and +"language|Russian". +

+

+See the C_() macro for a different way to mark up translatable strings +with context. +

+
+

Note

+

+If you are using the Q_() macro, you need to make sure that you +pass --keyword=Q_ to xgettext when extracting messages. +If you are using GNU gettext >= 0.15, you can also use +--keyword=Q_:1g to let xgettext split the context +string off into a msgctxt line in the po file. +

+
+
++ + + + + + + + + + +

String :

the string to be translated, with a '|'-separated prefix which + must not be translated +

Returns :

the translated message +
+

Since 2.4

+
+
+
+

C_()

+
#define             C_(Context,String)
+

+Uses gettext to get the translation for msgid. msgctxt is +used as a context. This is mainly useful for short strings which +may need different translations, depending on the context in which +they are used. +

+
+label1 = C_("Navigation", "Back");
+label2 = C_("Body part", "Back");
+
+

+

+
+

Note

+

+If you are using the C_() macro, you need to make sure that you +pass --keyword=C_:1c,2 to xgettext when extracting +messages. Note that this only works with GNU gettext >= 0.15. +

+
+
++ + + + + + + + + + + + + + +

Context :

a message context, must be a string literal +

String :

a message id, must be a string literal +

Returns :

the translated message +
+

Since 2.16

+
+
+
+

N_()

+
#define             N_(String)
+

+Only marks a string for translation. +This is useful in situations where the translated strings can't +be directly used, e.g. in string array initializers. +To get the translated string, call gettext() at runtime. +

+
+     {
+       static const char *messages[] = {
+         N_("some very meaningful message"),
+         N_("and another one")
+       };
+       const char *string;
+       ...
+       string
+         = index > 1 ? _("a default message") : gettext (messages[index]);
+
+       fputs (string);
+       ...
+     }
+
+
++ + + + +

String :

the string to be translated +
+

Since 2.4

+
+
+
+

NC_()

+
#define             NC_(Context, String)
+

+Only marks a string for translation, with context. +This is useful in situations where the translated strings can't +be directly used, e.g. in string array initializers. +To get the translated string, you should call g_dpgettext2() at runtime. +

+
+     {
+       static const char *messages[] = {
+         NC_("some context", "some very meaningful message"),
+         NC_("some context", "and another one")
+       };
+       const char *string;
+       ...
+       string
+         = index > 1 ? g_dpgettext2 (NULL, "some context", "a default message") : g_dpgettext2 (NULL, "some context", messages[index]);
+
+       fputs (string);
+       ...
+     }
+
+
+

Note

+

+If you are using the NC_() macro, you need to make sure that you +pass --keyword=NC_:1c,2 to xgettext when extracting +messages. Note that this only works with GNU gettext >= 0.15. +Intltool has support for the NC_() macro since version 0.40.1. +

+
+
++ + + + + + + + + + +

Context :

a message context, must be a string literal +

String :

a message id, must be a string literal +
+

Since 2.18

+
+
+
+

g_dgettext ()

+
const gchar *       g_dgettext                          (const gchar *domain,
+                                                         const gchar *msgid);
+

+This function is a wrapper of dgettext() which does not translate +the message if the default domain as set with textdomain() has no +translations for the current locale. +

+

+The advantage of using this function over dgettext() proper is that +libraries using this function (like GTK+) will not use translations +if the application using the library does not have translations for +the current locale. This results in a consistent English-only +interface instead of one having partial translations. For this +feature to work, the call to textdomain() and setlocale() should +precede any g_dgettext() invocations. For GTK+, it means calling +textdomain() before gtk_init or its variants. +

+

+This function disables translations if and only if upon its first +call all the following conditions hold: +

+
    +
  • +domain is not NULL +
  • +
  • +textdomain() has been called to set a default text domain
  • +
  • there is no translations available for the default text domain + and the current locale
  • +
  • current locale is not "C" or any English locales (those + starting with "en_")
  • +
+

+

+

+Note that this behavior may not be desired for example if an application +has its untranslated messages in a language other than English. In those +cases the application should call textdomain() after initializing GTK+. +

+

+Applications should normally not use this function directly, +but use the _() macro for translations.

+
++ + + + + + + + + + + + + + +

domain :

the translation domain to use, or NULL to use + the domain set with textdomain() +

msgid :

message to translate +

Returns :

The translated string + +
+

Since 2.18

+
+
+
+

g_dngettext ()

+
const gchar *       g_dngettext                         (const gchar *domain,
+                                                         const gchar *msgid,
+                                                         const gchar *msgid_plural,
+                                                         gulong n);
+

+This function is a wrapper of dngettext() which does not translate +the message if the default domain as set with textdomain() has no +translations for the current locale. +

+

+See g_dgettext() for details of how this differs from dngettext() +proper.

+
++ + + + + + + + + + + + + + + + + + + + + + +

domain :

the translation domain to use, or NULL to use + the domain set with textdomain() +

msgid :

message to translate +

msgid_plural :

plural form of the message +

n :

the quantity for which translation is needed +

Returns :

The translated string + +
+

Since 2.18

+
+
+
+

g_dpgettext ()

+
const gchar *       g_dpgettext                         (const gchar *domain,
+                                                         const gchar *msgctxtid,
+                                                         gsize msgidoffset);
+

+This function is a variant of g_dgettext() which supports +a disambiguating message context. GNU gettext uses the +'\004' character to separate the message context and +message id in msgctxtid. +If 0 is passed as msgidoffset, this function will fall back to +trying to use the deprecated convention of using "|" as a separation +character. +

+

+This uses g_dgettext() internally. See that functions for differences +with dgettext() proper. +

+

+Applications should normally not use this function directly, +but use the C_() macro for translations with context.

+
++ + + + + + + + + + + + + + + + + + +

domain :

the translation domain to use, or NULL to use + the domain set with textdomain() +

msgctxtid :

a combined message context and message id, separated + by a \004 character +

msgidoffset :

the offset of the message id in msgctxid +

Returns :

The translated string + +
+

Since 2.16

+
+
+
+

g_dpgettext2 ()

+
const gchar *       g_dpgettext2                        (const gchar *domain,
+                                                         const gchar *context,
+                                                         const gchar *msgid);
+

+This function is a variant of g_dgettext() which supports +a disambiguating message context. GNU gettext uses the +'\004' character to separate the message context and +message id in msgctxtid. +

+

+This uses g_dgettext() internally. See that functions for differences +with dgettext() proper. +

+

+This function differs from C_() in that it is not a macro and +thus you may use non-string-literals as context and msgid arguments.

+
++ + + + + + + + + + + + + + + + + + +

domain :

the translation domain to use, or NULL to use + the domain set with textdomain() +

context :

the message context +

msgid :

the message +

Returns :

The translated string + +
+

Since 2.18

+
+
+
+

g_strip_context ()

+
const gchar *       g_strip_context                     (const gchar *msgid,
+                                                         const gchar *msgval);
+

+An auxiliary function for gettext() support (see Q_()).

+
++ + + + + + + + + + + + + + +

msgid :

a string +

msgval :

another string +

Returns :

msgval, unless msgval is identical to msgid and contains + a '|' character, in which case a pointer to the substring of msgid after + the first '|' character is returned. + +
+

Since 2.4

+
+
+
+

g_get_language_names ()

+
const gchar* const * g_get_language_names               (void);
+

+Computes a list of applicable locale names, which can be used to +e.g. construct locale-dependent filenames or search paths. The returned +list is sorted from most desirable to least desirable and always contains +the default locale "C". +

+

+For example, if LANGUAGE=de:en_US, then the returned list is +"de", "en_US", "en", "C". +

+

+This function consults the environment variables LANGUAGE, +LC_ALL, LC_MESSAGES and LANG +to find the list of locales specified by the user.

+
++ + + + +

Returns :

a NULL-terminated array of strings owned by GLib + that must not be modified or freed. + +
+

Since 2.6

+
+
+
+

See Also

+

+The gettext manual. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-IO-Channels.html b/docs/reference/glib/html/glib-IO-Channels.html new file mode 100644 index 0000000..ebd9021 --- /dev/null +++ b/docs/reference/glib/html/glib-IO-Channels.html @@ -0,0 +1,2165 @@ + + + + +IO Channels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

IO Channels

+

IO Channels — portable support for using files, pipes and + sockets

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GIOChannel;
+
+GIOChannel*         g_io_channel_unix_new               (int fd);
+gint                g_io_channel_unix_get_fd            (GIOChannel *channel);
+GIOChannel*         g_io_channel_win32_new_fd           (gint fd);
+GIOChannel *        g_io_channel_win32_new_socket       (gint socket);
+GIOChannel *        g_io_channel_win32_new_messages     (gsize hwnd);
+
+void                g_io_channel_init                   (GIOChannel *channel);
+
+GIOChannel*         g_io_channel_new_file               (const gchar *filename,
+                                                         const gchar *mode,
+                                                         GError **error);
+GIOStatus           g_io_channel_read_chars             (GIOChannel *channel,
+                                                         gchar *buf,
+                                                         gsize count,
+                                                         gsize *bytes_read,
+                                                         GError **error);
+GIOStatus           g_io_channel_read_unichar           (GIOChannel *channel,
+                                                         gunichar *thechar,
+                                                         GError **error);
+GIOStatus           g_io_channel_read_line              (GIOChannel *channel,
+                                                         gchar **str_return,
+                                                         gsize *length,
+                                                         gsize *terminator_pos,
+                                                         GError **error);
+GIOStatus           g_io_channel_read_line_string       (GIOChannel *channel,
+                                                         GString *buffer,
+                                                         gsize *terminator_pos,
+                                                         GError **error);
+GIOStatus           g_io_channel_read_to_end            (GIOChannel *channel,
+                                                         gchar **str_return,
+                                                         gsize *length,
+                                                         GError **error);
+GIOStatus           g_io_channel_write_chars            (GIOChannel *channel,
+                                                         const gchar *buf,
+                                                         gssize count,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+GIOStatus           g_io_channel_write_unichar          (GIOChannel *channel,
+                                                         gunichar thechar,
+                                                         GError **error);
+GIOStatus           g_io_channel_flush                  (GIOChannel *channel,
+                                                         GError **error);
+GIOStatus           g_io_channel_seek_position          (GIOChannel *channel,
+                                                         gint64 offset,
+                                                         GSeekType type,
+                                                         GError **error);
+enum                GSeekType;
+GIOStatus           g_io_channel_shutdown               (GIOChannel *channel,
+                                                         gboolean flush,
+                                                         GError **err);
+
+enum                GIOStatus;
+enum                GIOChannelError;
+#define             G_IO_CHANNEL_ERROR
+GIOChannelError     g_io_channel_error_from_errno       (gint en);
+
+GIOChannel *        g_io_channel_ref                    (GIOChannel *channel);
+void                g_io_channel_unref                  (GIOChannel *channel);
+
+GSource *           g_io_create_watch                   (GIOChannel *channel,
+                                                         GIOCondition condition);
+guint               g_io_add_watch                      (GIOChannel *channel,
+                                                         GIOCondition condition,
+                                                         GIOFunc func,
+                                                         gpointer user_data);
+guint               g_io_add_watch_full                 (GIOChannel *channel,
+                                                         gint priority,
+                                                         GIOCondition condition,
+                                                         GIOFunc func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify);
+enum                GIOCondition;
+gboolean            (*GIOFunc)                          (GIOChannel *source,
+                                                         GIOCondition condition,
+                                                         gpointer data);
+
+                    GIOFuncs;
+
+gsize               g_io_channel_get_buffer_size        (GIOChannel *channel);
+void                g_io_channel_set_buffer_size        (GIOChannel *channel,
+                                                         gsize size);
+GIOCondition        g_io_channel_get_buffer_condition   (GIOChannel *channel);
+GIOFlags            g_io_channel_get_flags              (GIOChannel *channel);
+GIOStatus           g_io_channel_set_flags              (GIOChannel *channel,
+                                                         GIOFlags flags,
+                                                         GError **error);
+enum                GIOFlags;
+const gchar*        g_io_channel_get_line_term          (GIOChannel *channel,
+                                                         gint *length);
+void                g_io_channel_set_line_term          (GIOChannel *channel,
+                                                         const gchar *line_term,
+                                                         gint length);
+gboolean            g_io_channel_get_buffered           (GIOChannel *channel);
+void                g_io_channel_set_buffered           (GIOChannel *channel,
+                                                         gboolean buffered);
+const gchar*        g_io_channel_get_encoding           (GIOChannel *channel);
+GIOStatus           g_io_channel_set_encoding           (GIOChannel *channel,
+                                                         const gchar *encoding,
+                                                         GError **error);
+gboolean            g_io_channel_get_close_on_unref     (GIOChannel *channel);
+void                g_io_channel_set_close_on_unref     (GIOChannel *channel,
+                                                         gboolean do_close);
+
+
+GIOError            g_io_channel_read                   (GIOChannel *channel,
+                                                         gchar *buf,
+                                                         gsize count,
+                                                         gsize *bytes_read);
+enum                GIOError;
+GIOError            g_io_channel_write                  (GIOChannel *channel,
+                                                         const gchar *buf,
+                                                         gsize count,
+                                                         gsize *bytes_written);
+GIOError            g_io_channel_seek                   (GIOChannel *channel,
+                                                         gint64 offset,
+                                                         GSeekType type);
+void                g_io_channel_close                  (GIOChannel *channel);
+
+
+
+

Description

+

+The GIOChannel data type aims to provide a portable method for +using file descriptors, pipes, and sockets, and integrating them +into the main event +loop. Currently full support is available on UNIX platforms, +support for Windows is only partially complete. +

+

+To create a new GIOChannel on UNIX systems use +g_io_channel_unix_new(). This works for plain file descriptors, +pipes and sockets. Alternatively, a channel can be created for a +file in a system independent manner using g_io_channel_new_file(). +

+

+Once a GIOChannel has been created, it can be used in a generic +manner with the functions g_io_channel_read_chars(), +g_io_channel_write_chars(), g_io_channel_seek_position(), and +g_io_channel_shutdown(). +

+

+To add a GIOChannel to the main event loop use +g_io_add_watch() or g_io_add_watch_full(). Here you specify which +events you are interested in on the GIOChannel, and provide a +function to be called whenever these events occur. +

+

+GIOChannel instances are created with an initial reference count of +1. g_io_channel_ref() and g_io_channel_unref() can be used to +increment or decrement the reference count respectively. When the +reference count falls to 0, the GIOChannel is freed. (Though it +isn't closed automatically, unless it was created using +g_io_channel_new_from_file().) Using g_io_add_watch() or +g_io_add_watch_full() increments a channel's reference count. +

+

+The new functions g_io_channel_read_chars(), +g_io_channel_read_line(), g_io_channel_read_line_string(), +g_io_channel_read_to_end(), g_io_channel_write_chars(), +g_io_channel_seek_position(), and g_io_channel_flush() should not be +mixed with the deprecated functions g_io_channel_read(), +g_io_channel_write(), and g_io_channel_seek() on the same channel.

+
+
+

Details

+
+

GIOChannel

+
typedef struct {
+} GIOChannel;
+
+

+A data structure representing an IO Channel. The fields should be +considered private and should only be accessed with the following +functions.

+
+
+
+

g_io_channel_unix_new ()

+
GIOChannel*         g_io_channel_unix_new               (int fd);
+

+Creates a new GIOChannel given a file descriptor. On UNIX systems +this works for plain files, pipes, and sockets. +

+

+The returned GIOChannel has a reference count of 1. +

+

+The default encoding for GIOChannel is UTF-8. If your application +is reading output from a command using via pipe, you may need to set +the encoding to the encoding of the current locale (see +g_get_charset()) with the g_io_channel_set_encoding() function. +

+

+If you want to read raw binary data without interpretation, then +call the g_io_channel_set_encoding() function with NULL for the +encoding argument. +

+

+This function is available in GLib on Windows, too, but you should +avoid using it on Windows. The domain of file descriptors and +sockets overlap. There is no way for GLib to know which one you mean +in case the argument you pass to this function happens to be both a +valid file descriptor and socket. If that happens a warning is +issued, and GLib assumes that it is the file descriptor you mean.

+
++ + + + + + + + + + +

fd :

a file descriptor. +

Returns :

a new GIOChannel. +
+
+
+
+

g_io_channel_unix_get_fd ()

+
gint                g_io_channel_unix_get_fd            (GIOChannel *channel);
+

+Returns the file descriptor of the GIOChannel. +

+

+On Windows this function returns the file descriptor or socket of +the GIOChannel.

+
++ + + + + + + + + + +

channel :

a GIOChannel, created with g_io_channel_unix_new(). +

Returns :

the file descriptor of the GIOChannel. +
+
+
+
+

g_io_channel_win32_new_fd ()

+
GIOChannel*         g_io_channel_win32_new_fd           (gint fd);
+

+Creates a new GIOChannel given a file descriptor on Windows. This +works for file descriptors from the C runtime. +

+

+This function works for file descriptors as returned by the open(), +creat(), pipe() and fileno() calls in the Microsoft C runtime. In +order to meaningfully use this function your code should use the +same C runtime as GLib uses, which is msvcrt.dll. Note that in +current Microsoft compilers it is near impossible to convince it to +build code that would use msvcrt.dll. The last Microsoft compiler +version that supported using msvcrt.dll as the C runtime was version +6. The GNU compiler and toolchain for Windows, also known as Mingw, +fully supports msvcrt.dll. +

+

+If you have created a GIOChannel for a file descriptor and started +watching (polling) it, you shouldn't call read() on the file +descriptor. This is because adding polling for a file descriptor is +implemented in GLib on Windows by starting a thread that sits +blocked in a read() from the file descriptor most of the time. All +reads from the file descriptor should be done by this internal GLib +thread. Your code should call only g_io_channel_read(). +

+

+This function is available only in GLib on Windows.

+
++ + + + + + + + + + +

fd :

a C library file descriptor. +

Returns :

a new GIOChannel. +
+
+
+
+

g_io_channel_win32_new_socket ()

+
GIOChannel *        g_io_channel_win32_new_socket       (gint socket);
+

+Creates a new GIOChannel given a socket on Windows. +

+

+This function works for sockets created by Winsock. It's available +only in GLib on Windows. +

+

+Polling a GSource created to watch a channel for a socket puts the +socket in non-blocking mode. This is a side-effect of the +implementation and unavoidable.

+
++ + + + + + + + + + +

socket :

a Winsock socket +

Returns :

a new GIOChannel +
+
+
+
+

g_io_channel_win32_new_messages ()

+
GIOChannel *        g_io_channel_win32_new_messages     (gsize hwnd);
+

+Creates a new GIOChannel given a window handle on Windows. +

+

+This function creates a GIOChannel that can be used to poll for +Windows messages for the window in question.

+
++ + + + + + + + + + +

hwnd :

a window handle. +

Returns :

a new GIOChannel. +
+
+
+
+

g_io_channel_init ()

+
void                g_io_channel_init                   (GIOChannel *channel);
+

+Initializes a GIOChannel struct. +

+

+This is called by each of the above functions when creating a +GIOChannel, and so is not often needed by the application +programmer (unless you are creating a new type of GIOChannel).

+
++ + + + +

channel :

a GIOChannel +
+
+
+
+

g_io_channel_new_file ()

+
GIOChannel*         g_io_channel_new_file               (const gchar *filename,
+                                                         const gchar *mode,
+                                                         GError **error);
+

+Open a file filename as a GIOChannel using mode mode. This +channel will be closed when the last reference to it is dropped, +so there is no need to call g_io_channel_close() (though doing +so will not cause problems, as long as no attempt is made to +access the channel after it is closed).

+
++ + + + + + + + + + + + + + + + + + +

filename :

A string containing the name of a file +

mode :

One of "r", "w", "a", "r+", "w+", "a+". These have + the same meaning as in fopen() +

error :

A location to return an error of type G_FILE_ERROR +

Returns :

A GIOChannel on success, NULL on failure. +
+
+
+
+

g_io_channel_read_chars ()

+
GIOStatus           g_io_channel_read_chars             (GIOChannel *channel,
+                                                         gchar *buf,
+                                                         gsize count,
+                                                         gsize *bytes_read,
+                                                         GError **error);
+

+Replacement for g_io_channel_read() with the new API.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

buf :

a buffer to read data into +

count :

the size of the buffer. Note that the buffer may + not be complelely filled even if there is data + in the buffer if the remaining data is not a + complete character. +

bytes_read :

The number of bytes read. This may be zero even on + success if count < 6 and the channel's encoding is non-NULL. + This indicates that the next UTF-8 character is too wide for + the buffer. +

error :

a location to return an error of type GConvertError + or GIOChannelError. +

Returns :

the status of the operation. +
+
+
+
+

g_io_channel_read_unichar ()

+
GIOStatus           g_io_channel_read_unichar           (GIOChannel *channel,
+                                                         gunichar *thechar,
+                                                         GError **error);
+

+Reads a Unicode character from channel. +This function cannot be called on a channel with NULL encoding.

+
++ + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

thechar :

a location to return a character +

error :

a location to return an error of type GConvertError + or GIOChannelError +

Returns :

a GIOStatus +
+
+
+
+

g_io_channel_read_line ()

+
GIOStatus           g_io_channel_read_line              (GIOChannel *channel,
+                                                         gchar **str_return,
+                                                         gsize *length,
+                                                         gsize *terminator_pos,
+                                                         GError **error);
+

+Reads a line, including the terminating character(s), +from a GIOChannel into a newly-allocated string. +str_return will contain allocated memory if the return +is G_IO_STATUS_NORMAL.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

str_return :

The line read from the GIOChannel, including the + line terminator. This data should be freed with g_free() + when no longer needed. This is a nul-terminated string. + If a length of zero is returned, this will be NULL instead. +

length :

location to store length of the read data, or NULL +

terminator_pos :

location to store position of line terminator, or NULL +

error :

A location to return an error of type GConvertError + or GIOChannelError +

Returns :

the status of the operation. +
+
+
+
+

g_io_channel_read_line_string ()

+
GIOStatus           g_io_channel_read_line_string       (GIOChannel *channel,
+                                                         GString *buffer,
+                                                         gsize *terminator_pos,
+                                                         GError **error);
+

+Reads a line from a GIOChannel, using a GString as a buffer.

+
++ + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

buffer :

a GString into which the line will be written. + If buffer already contains data, the old data will + be overwritten. +

terminator_pos :

location to store position of line terminator, or NULL +

error :

a location to store an error of type GConvertError + or GIOChannelError +

Returns :

the status of the operation. +
+
+
+
+

g_io_channel_read_to_end ()

+
GIOStatus           g_io_channel_read_to_end            (GIOChannel *channel,
+                                                         gchar **str_return,
+                                                         gsize *length,
+                                                         GError **error);
+

+Reads all the remaining data from the file.

+
++ + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

str_return :

Location to store a pointer to a string holding + the remaining data in the GIOChannel. This data should + be freed with g_free() when no longer needed. This + data is terminated by an extra nul character, but there + may be other nuls in the intervening data. +

length :

location to store length of the data +

error :

location to return an error of type GConvertError + or GIOChannelError +

Returns :

G_IO_STATUS_NORMAL on success. + This function never returns G_IO_STATUS_EOF. +
+
+
+
+

g_io_channel_write_chars ()

+
GIOStatus           g_io_channel_write_chars            (GIOChannel *channel,
+                                                         const gchar *buf,
+                                                         gssize count,
+                                                         gsize *bytes_written,
+                                                         GError **error);
+

+Replacement for g_io_channel_write() with the new API. +

+

+On seekable channels with encodings other than NULL or UTF-8, generic +mixing of reading and writing is not allowed. A call to g_io_channel_write_chars() +may only be made on a channel from which data has been read in the +cases described in the documentation for g_io_channel_set_encoding().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

buf :

a buffer to write data from +

count :

the size of the buffer. If -1, the buffer + is taken to be a nul-terminated string. +

bytes_written :

The number of bytes written. This can be nonzero + even if the return value is not G_IO_STATUS_NORMAL. + If the return value is G_IO_STATUS_NORMAL and the + channel is blocking, this will always be equal + to count if count >= 0. +

error :

a location to return an error of type GConvertError + or GIOChannelError +

Returns :

the status of the operation. +
+
+
+
+

g_io_channel_write_unichar ()

+
GIOStatus           g_io_channel_write_unichar          (GIOChannel *channel,
+                                                         gunichar thechar,
+                                                         GError **error);
+

+Writes a Unicode character to channel. +This function cannot be called on a channel with NULL encoding.

+
++ + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

thechar :

a character +

error :

location to return an error of type GConvertError + or GIOChannelError +

Returns :

a GIOStatus +
+
+
+
+

g_io_channel_flush ()

+
GIOStatus           g_io_channel_flush                  (GIOChannel *channel,
+                                                         GError **error);
+

+Flushes the write buffer for the GIOChannel.

+
++ + + + + + + + + + + + + + +

channel :

a GIOChannel +

error :

location to store an error of type GIOChannelError +

Returns :

the status of the operation: One of + G_IO_STATUS_NORMAL, G_IO_STATUS_AGAIN, or + G_IO_STATUS_ERROR. +
+
+
+
+

g_io_channel_seek_position ()

+
GIOStatus           g_io_channel_seek_position          (GIOChannel *channel,
+                                                         gint64 offset,
+                                                         GSeekType type,
+                                                         GError **error);
+

+Replacement for g_io_channel_seek() with the new API.

+
++ + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

offset :

The offset in bytes from the position specified by type +

type :

a GSeekType. The type G_SEEK_CUR is only allowed in those + cases where a call to g_io_channel_set_encoding() + is allowed. See the documentation for + g_io_channel_set_encoding() for details. +

error :

A location to return an error of type GIOChannelError +

Returns :

the status of the operation. +
+
+
+
+

enum GSeekType

+
typedef enum
+{
+  G_SEEK_CUR,
+  G_SEEK_SET,
+  G_SEEK_END
+} GSeekType;
+
+

+An enumeration specifying the base position for a +g_io_channel_seek_position() operation.

+
++ + + + + + + + + + + + + + +

G_SEEK_CUR

the current position in the file. +

G_SEEK_SET

the start of the file. +

G_SEEK_END

the end of the file. +
+
+
+
+

g_io_channel_shutdown ()

+
GIOStatus           g_io_channel_shutdown               (GIOChannel *channel,
+                                                         gboolean flush,
+                                                         GError **err);
+

+Close an IO channel. Any pending data to be written will be +flushed if flush is TRUE. The channel will not be freed until the +last reference is dropped using g_io_channel_unref().

+
++ + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

flush :

if TRUE, flush pending +

err :

location to store a GIOChannelError +

Returns :

the status of the operation. +
+
+
+
+

enum GIOStatus

+
typedef enum
+{
+  G_IO_STATUS_ERROR,
+  G_IO_STATUS_NORMAL,
+  G_IO_STATUS_EOF,
+  G_IO_STATUS_AGAIN
+} GIOStatus;
+
+

+Stati returned by most of the GIOFuncs functions.

+
++ + + + + + + + + + + + + + + + + + +

G_IO_STATUS_ERROR

An error occurred. +

G_IO_STATUS_NORMAL

Success. +

G_IO_STATUS_EOF

End of file. +

G_IO_STATUS_AGAIN

Resource temporarily unavailable. +
+
+
+
+

enum GIOChannelError

+
typedef enum
+{
+  /* Derived from errno */
+  G_IO_CHANNEL_ERROR_FBIG,
+  G_IO_CHANNEL_ERROR_INVAL,
+  G_IO_CHANNEL_ERROR_IO,
+  G_IO_CHANNEL_ERROR_ISDIR,
+  G_IO_CHANNEL_ERROR_NOSPC,
+  G_IO_CHANNEL_ERROR_NXIO,
+  G_IO_CHANNEL_ERROR_OVERFLOW,
+  G_IO_CHANNEL_ERROR_PIPE,
+  /* Other */
+  G_IO_CHANNEL_ERROR_FAILED
+} GIOChannelError;
+
+

+Error codes returned by GIOChannel operations.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_IO_CHANNEL_ERROR_FBIG

File too large. +

G_IO_CHANNEL_ERROR_INVAL

Invalid argument. +

G_IO_CHANNEL_ERROR_IO

IO error. +

G_IO_CHANNEL_ERROR_ISDIR

File is a directory. +

G_IO_CHANNEL_ERROR_NOSPC

No space left on device. +

G_IO_CHANNEL_ERROR_NXIO

No such device or address. +

G_IO_CHANNEL_ERROR_OVERFLOW

Value too large for defined datatype. +

G_IO_CHANNEL_ERROR_PIPE

Broken pipe. +

G_IO_CHANNEL_ERROR_FAILED

Some other error. +
+
+
+
+

G_IO_CHANNEL_ERROR

+
#define G_IO_CHANNEL_ERROR g_io_channel_error_quark()
+
+

+Error domain for GIOChannel operations. Errors in this domain will +be from the GIOChannelError enumeration. See GError for +information on error domains.

+
+
+
+

g_io_channel_error_from_errno ()

+
GIOChannelError     g_io_channel_error_from_errno       (gint en);
+

+Converts an errno error number to a GIOChannelError.

+
++ + + + + + + + + + +

en :

an errno error number, e.g. EINVAL +

Returns :

a GIOChannelError error number, e.g. + G_IO_CHANNEL_ERROR_INVAL. +
+
+
+
+

g_io_channel_ref ()

+
GIOChannel *        g_io_channel_ref                    (GIOChannel *channel);
+

+Increments the reference count of a GIOChannel.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

Returns :

the channel that was passed in (since 2.6) +
+
+
+
+

g_io_channel_unref ()

+
void                g_io_channel_unref                  (GIOChannel *channel);
+

+Decrements the reference count of a GIOChannel.

+
++ + + + +

channel :

a GIOChannel +
+
+
+
+

g_io_create_watch ()

+
GSource *           g_io_create_watch                   (GIOChannel *channel,
+                                                         GIOCondition condition);
+

+Creates a GSource that's dispatched when condition is met for the +given channel. For example, if condition is G_IO_IN, the source will +be dispatched when there's data available for reading. +

+

+g_io_add_watch() is a simpler interface to this same functionality, for +the case where you want to add the source to the default main loop context +at the default priority. +

+

+On Windows, polling a GSource created to watch a channel for a socket +puts the socket in non-blocking mode. This is a side-effect of the +implementation and unavoidable.

+
++ + + + + + + + + + + + + + +

channel :

a GIOChannel to watch +

condition :

conditions to watch for +

Returns :

a new GSource +
+
+
+
+

g_io_add_watch ()

+
guint               g_io_add_watch                      (GIOChannel *channel,
+                                                         GIOCondition condition,
+                                                         GIOFunc func,
+                                                         gpointer user_data);
+

+Adds the GIOChannel into the default main loop context +with the default priority.

+
++ + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

condition :

the condition to watch for +

func :

the function to call when the condition is satisfied +

user_data :

user data to pass to func +

Returns :

the event source id +
+
+
+
+

g_io_add_watch_full ()

+
guint               g_io_add_watch_full                 (GIOChannel *channel,
+                                                         gint priority,
+                                                         GIOCondition condition,
+                                                         GIOFunc func,
+                                                         gpointer user_data,
+                                                         GDestroyNotify notify);
+

+Adds the GIOChannel into the default main loop context +with the given priority. +

+

+This internally creates a main loop source using g_io_create_watch() +and attaches it to the main loop context with g_source_attach(). +You can do these steps manuallt if you need greater control.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

priority :

the priority of the GIOChannel source +

condition :

the condition to watch for +

func :

the function to call when the condition is satisfied +

user_data :

user data to pass to func +

notify :

the function to call when the source is removed +

Returns :

the event source id +
+
+
+
+

enum GIOCondition

+
typedef enum
+{
+  G_IO_IN GLIB_SYSDEF_POLLIN,
+  G_IO_OUT GLIB_SYSDEF_POLLOUT,
+  G_IO_PRI GLIB_SYSDEF_POLLPRI,
+  G_IO_ERR GLIB_SYSDEF_POLLERR,
+  G_IO_HUP GLIB_SYSDEF_POLLHUP,
+  G_IO_NVAL GLIB_SYSDEF_POLLNVAL
+} GIOCondition;
+
+

+A bitwise combination representing a condition to watch for on an +event source.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

G_IO_IN

There is data to read. +

G_IO_OUT

Data can be written (without blocking). +

G_IO_PRI

There is urgent data to read. +

G_IO_ERR

Error condition. +

G_IO_HUP

Hung up (the connection has been broken, usually for + pipes and sockets). +

G_IO_NVAL

Invalid request. The file descriptor is not open. +
+
+
+
+

GIOFunc ()

+
gboolean            (*GIOFunc)                          (GIOChannel *source,
+                                                         GIOCondition condition,
+                                                         gpointer data);
+

+Specifies the type of function passed to g_io_add_watch() or +g_io_add_watch_full(), which is called when the requested condition +on a GIOChannel is satisfied.

+
++ + + + + + + + + + + + + + + + + + +

source :

the GIOChannel event source +

condition :

the condition which has been satisfied +

data :

user data set in g_io_add_watch() or g_io_add_watch_full() +

Returns :

the function should return FALSE if the event source + should be removed +
+
+
+
+

GIOFuncs

+
typedef struct {
+  GIOStatus (*io_read)           (GIOChannel   *channel, 
+			          gchar        *buf, 
+				  gsize         count,
+				  gsize        *bytes_read,
+				  GError      **err);
+  GIOStatus (*io_write)          (GIOChannel   *channel, 
+				  const gchar  *buf, 
+				  gsize         count,
+				  gsize        *bytes_written,
+				  GError      **err);
+  GIOStatus (*io_seek)           (GIOChannel   *channel, 
+				  gint64        offset, 
+				  GSeekType     type,
+				  GError      **err);
+  GIOStatus  (*io_close)         (GIOChannel   *channel,
+				  GError      **err);
+  GSource*   (*io_create_watch)  (GIOChannel   *channel,
+				  GIOCondition  condition);
+  void       (*io_free)          (GIOChannel   *channel);
+  GIOStatus  (*io_set_flags)     (GIOChannel   *channel,
+                                  GIOFlags      flags,
+				  GError      **err);
+  GIOFlags   (*io_get_flags)     (GIOChannel   *channel);
+} GIOFuncs;
+
+

+A table of functions used to handle different types of GIOChannel +in a generic way.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

io_read ()

reads raw bytes from the channel. This is called from + various functions such as g_io_channel_read_chars() to + read raw bytes from the channel. Encoding and buffering + issues are dealt with at a higher level. +

io_write ()

writes raw bytes to the channel. This is called from + various functions such as g_io_channel_write_chars() to + write raw bytes to the channel. Encoding and buffering + issues are dealt with at a higher level. +

io_seek ()

(optional) seeks the channel. This is called from + g_io_channel_seek() on channels that support it. +

io_close ()

closes the channel. This is called from + g_io_channel_close() after flushing the buffers. +

io_create_watch ()

creates a watch on the channel. This call + corresponds directly to g_io_create_watch(). +

io_free ()

called from g_io_channel_unref() when the channel needs to + be freed. This function must free the memory associated + with the channel, including freeing the GIOChannel + structure itself. The channel buffers have been flushed + and possibly io_close has been called by the time this + function is called. +

io_set_flags ()

sets the GIOFlags on the channel. This is called + from g_io_channel_set_flags() with all flags except + for G_IO_FLAG_APPEND and G_IO_FLAG_NONBLOCK masked + out. +

io_get_flags ()

gets the GIOFlags for the channel. This function + need only return the G_IO_FLAG_APPEND and + G_IO_FLAG_NONBLOCK flags; g_io_channel_get_flags() + automatically adds the others as appropriate. +
+
+
+
+

g_io_channel_get_buffer_size ()

+
gsize               g_io_channel_get_buffer_size        (GIOChannel *channel);
+

+Gets the buffer size.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

Returns :

the size of the buffer. +
+
+
+
+

g_io_channel_set_buffer_size ()

+
void                g_io_channel_set_buffer_size        (GIOChannel *channel,
+                                                         gsize size);
+

+Sets the buffer size.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

size :

the size of the buffer, or 0 to let GLib pick a good size +
+
+
+
+

g_io_channel_get_buffer_condition ()

+
GIOCondition        g_io_channel_get_buffer_condition   (GIOChannel *channel);
+

+This function returns a GIOCondition depending on whether there +is data to be read/space to write data in the internal buffers in +the GIOChannel. Only the flags G_IO_IN and G_IO_OUT may be set.

+
++ + + + + + + + + + +

channel :

A GIOChannel +

Returns :

A GIOCondition +
+
+
+
+

g_io_channel_get_flags ()

+
GIOFlags            g_io_channel_get_flags              (GIOChannel *channel);
+

+Gets the current flags for a GIOChannel, including read-only +flags such as G_IO_FLAG_IS_READABLE. +

+

+The values of the flags G_IO_FLAG_IS_READABLE and G_IO_FLAG_IS_WRITEABLE +are cached for internal use by the channel when it is created. +If they should change at some later point (e.g. partial shutdown +of a socket with the UNIX shutdown() function), the user +should immediately call g_io_channel_get_flags() to update +the internal values of these flags.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

Returns :

the flags which are set on the channel +
+
+
+
+

g_io_channel_set_flags ()

+
GIOStatus           g_io_channel_set_flags              (GIOChannel *channel,
+                                                         GIOFlags flags,
+                                                         GError **error);
+

+Sets the (writeable) flags in channel to (flags & G_IO_CHANNEL_SET_MASK).

+
++ + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

flags :

the flags to set on the IO channel +

error :

A location to return an error of type GIOChannelError +

Returns :

the status of the operation. +
+
+
+
+

enum GIOFlags

+
typedef enum
+{
+  G_IO_FLAG_APPEND = 1 << 0,
+  G_IO_FLAG_NONBLOCK = 1 << 1,
+  G_IO_FLAG_IS_READABLE = 1 << 2, /* Read only flag */
+  G_IO_FLAG_IS_WRITEABLE = 1 << 3, /* Read only flag */
+  G_IO_FLAG_IS_SEEKABLE = 1 << 4, /* Read only flag */
+  G_IO_FLAG_MASK = (1 << 5) - 1,
+  G_IO_FLAG_GET_MASK = G_IO_FLAG_MASK,
+  G_IO_FLAG_SET_MASK = G_IO_FLAG_APPEND | G_IO_FLAG_NONBLOCK
+} GIOFlags;
+
+

+Specifies properties of a GIOChannel. Some of the flags can only be +read with g_io_channel_get_flags(), but not changed with +g_io_channel_set_flags().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_IO_FLAG_APPEND

turns on append mode, corresponds to O_APPEND + (see the documentation of the UNIX open() + syscall). +

G_IO_FLAG_NONBLOCK

turns on nonblocking mode, corresponds to + O_NONBLOCK/O_NDELAY (see the documentation of + the UNIX open() syscall). +

G_IO_FLAG_IS_READABLE

indicates that the io channel is readable. + This flag can not be changed. +

G_IO_FLAG_IS_WRITEABLE

indicates that the io channel is writable. + This flag can not be changed. +

G_IO_FLAG_IS_SEEKABLE

indicates that the io channel is seekable, + i.e. that g_io_channel_seek_position() can + be used on it. This flag can not be changed. +

G_IO_FLAG_MASK

the mask that specifies all the valid flags. +

G_IO_FLAG_GET_MASK

the mask of the flags that are returned from + g_io_channel_get_flags(). +

G_IO_FLAG_SET_MASK

the mask of the flags that the user can modify + with g_io_channel_set_flags(). +
+
+
+
+

g_io_channel_get_line_term ()

+
const gchar*        g_io_channel_get_line_term          (GIOChannel *channel,
+                                                         gint *length);
+

+This returns the string that GIOChannel uses to determine +where in the file a line break occurs. A value of NULL +indicates autodetection.

+
++ + + + + + + + + + + + + + +

channel :

a GIOChannel +

length :

a location to return the length of the line terminator +

Returns :

The line termination string. This value + is owned by GLib and must not be freed. +
+
+
+
+

g_io_channel_set_line_term ()

+
void                g_io_channel_set_line_term          (GIOChannel *channel,
+                                                         const gchar *line_term,
+                                                         gint length);
+

+This sets the string that GIOChannel uses to determine +where in the file a line break occurs.

+
++ + + + + + + + + + + + + + +

channel :

a GIOChannel +

line_term :

The line termination string. Use NULL for autodetect. + Autodetection breaks on "\n", "\r\n", "\r", "\0", and + the Unicode paragraph separator. Autodetection should + not be used for anything other than file-based channels. +

length :

The length of the termination string. If -1 is passed, the + string is assumed to be nul-terminated. This option allows + termination strings with embedded nuls. +
+
+
+
+

g_io_channel_get_buffered ()

+
gboolean            g_io_channel_get_buffered           (GIOChannel *channel);
+

+Returns whether channel is buffered.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

Returns :

TRUE if the channel is buffered. +
+
+
+
+

g_io_channel_set_buffered ()

+
void                g_io_channel_set_buffered           (GIOChannel *channel,
+                                                         gboolean buffered);
+

+The buffering state can only be set if the channel's encoding +is NULL. For any other encoding, the channel must be buffered. +

+

+A buffered channel can only be set unbuffered if the channel's +internal buffers have been flushed. Newly created channels or +channels which have returned G_IO_STATUS_EOF +not require such a flush. For write-only channels, a call to +g_io_channel_flush() is sufficient. For all other channels, +the buffers may be flushed by a call to g_io_channel_seek_position(). +This includes the possibility of seeking with seek type G_SEEK_CUR +and an offset of zero. Note that this means that socket-based +channels cannot be set unbuffered once they have had data +read from them. +

+

+On unbuffered channels, it is safe to mix read and write +calls from the new and old APIs, if this is necessary for +maintaining old code. +

+

+The default state of the channel is buffered.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

buffered :

whether to set the channel buffered or unbuffered +
+
+
+
+

g_io_channel_get_encoding ()

+
const gchar*        g_io_channel_get_encoding           (GIOChannel *channel);
+

+Gets the encoding for the input/output of the channel. +The internal encoding is always UTF-8. The encoding NULL +makes the channel safe for binary data.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

Returns :

A string containing the encoding, this string is + owned by GLib and must not be freed. +
+
+
+
+

g_io_channel_set_encoding ()

+
GIOStatus           g_io_channel_set_encoding           (GIOChannel *channel,
+                                                         const gchar *encoding,
+                                                         GError **error);
+

+Sets the encoding for the input/output of the channel. +The internal encoding is always UTF-8. The default encoding +for the external file is UTF-8. +

+

+The encoding NULL is safe to use with binary data. +

+

+The encoding can only be set if one of the following conditions +is true: +

+
+

+Channels which do not meet one of the above conditions cannot call +g_io_channel_seek_position() with an offset of G_SEEK_CUR, and, if +they are "seekable", cannot call g_io_channel_write_chars() after +calling one of the API "read" functions.

+
++ + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

encoding :

the encoding type +

error :

location to store an error of type GConvertError +

Returns :

G_IO_STATUS_NORMAL if the encoding was successfully set. +
+
+
+
+

g_io_channel_get_close_on_unref ()

+
gboolean            g_io_channel_get_close_on_unref     (GIOChannel *channel);
+

+Returns whether the file/socket/whatever associated with channel +will be closed when channel receives its final unref and is +destroyed. The default value of this is TRUE for channels created +by g_io_channel_new_file(), and FALSE for all other channels.

+
++ + + + + + + + + + +

channel :

a GIOChannel. +

Returns :

Whether the channel will be closed on the final unref of + the GIOChannel data structure. +
+
+
+
+

g_io_channel_set_close_on_unref ()

+
void                g_io_channel_set_close_on_unref     (GIOChannel *channel,
+                                                         gboolean do_close);
+

+Setting this flag to TRUE for a channel you have already closed +can cause problems.

+
++ + + + + + + + + + +

channel :

a GIOChannel +

do_close :

Whether to close the channel on the final unref of + the GIOChannel data structure. The default value of + this is TRUE for channels created by g_io_channel_new_file(), + and FALSE for all other channels. +
+
+
+
+

g_io_channel_read ()

+
GIOError            g_io_channel_read                   (GIOChannel *channel,
+                                                         gchar *buf,
+                                                         gsize count,
+                                                         gsize *bytes_read);
+
+

Warning

+

g_io_channel_read has been deprecated since version 2.2 and should not be used in newly-written code. Use g_io_channel_read_chars() instead.

+
+

+Reads data from a GIOChannel.

+
++ + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

buf :

a buffer to read the data into (which should be at least + count bytes long) +

count :

the number of bytes to read from the GIOChannel +

bytes_read :

returns the number of bytes actually read +

Returns :

G_IO_ERROR_NONE if the operation was successful. + +
+
+
+
+

enum GIOError

+
typedef enum
+{
+  G_IO_ERROR_NONE,
+  G_IO_ERROR_AGAIN,
+  G_IO_ERROR_INVAL,
+  G_IO_ERROR_UNKNOWN
+} GIOError;
+
+

+GIOError is only used by the deprecated functions +g_io_channel_read(), g_io_channel_write(), and g_io_channel_seek().

+
++ + + + + + + + + + + + + + + + + + +

G_IO_ERROR_NONE

no error +

G_IO_ERROR_AGAIN

an EAGAIN error occurred +

G_IO_ERROR_INVAL

an EINVAL error occurred +

G_IO_ERROR_UNKNOWN

another error occurred +
+
+
+
+

g_io_channel_write ()

+
GIOError            g_io_channel_write                  (GIOChannel *channel,
+                                                         const gchar *buf,
+                                                         gsize count,
+                                                         gsize *bytes_written);
+
+

Warning

+

g_io_channel_write has been deprecated since version 2.2 and should not be used in newly-written code. Use g_io_channel_write_chars() instead.

+
+

+Writes data to a GIOChannel.

+
++ + + + + + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

buf :

the buffer containing the data to write +

count :

the number of bytes to write +

bytes_written :

the number of bytes actually written +

Returns :

G_IO_ERROR_NONE if the operation was successful. + +
+
+
+
+

g_io_channel_seek ()

+
GIOError            g_io_channel_seek                   (GIOChannel *channel,
+                                                         gint64 offset,
+                                                         GSeekType type);
+
+

Warning

+

g_io_channel_seek has been deprecated since version 2.2 and should not be used in newly-written code. Use g_io_channel_seek_position() instead.

+
+

+Sets the current position in the GIOChannel, similar to the standard +library function fseek().

+
++ + + + + + + + + + + + + + + + + + +

channel :

a GIOChannel +

offset :

an offset, in bytes, which is added to the position specified + by type +

type :

the position in the file, which can be G_SEEK_CUR (the current + position), G_SEEK_SET (the start of the file), or G_SEEK_END + (the end of the file) +

Returns :

G_IO_ERROR_NONE if the operation was successful. + +
+
+
+
+

g_io_channel_close ()

+
void                g_io_channel_close                  (GIOChannel *channel);
+
+

Warning

+

g_io_channel_close has been deprecated since version 2.2 and should not be used in newly-written code. Use g_io_channel_shutdown() instead.

+
+

+Close an IO channel. Any pending data to be written will be +flushed, ignoring errors. The channel will not be freed until the +last reference is dropped using g_io_channel_unref().

+
++ + + + +

channel :

A GIOChannel +
+
+
+
+

See Also

+

+
++ + + + +

g_io_add_watch(), g_io_add_watch_full(), + g_source_remove()

Convenience + functions for creating GIOChannel instances and adding + them to the main + event loop.

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Key-value-file-parser.html b/docs/reference/glib/html/glib-Key-value-file-parser.html new file mode 100644 index 0000000..9053cb1 --- /dev/null +++ b/docs/reference/glib/html/glib-Key-value-file-parser.html @@ -0,0 +1,2514 @@ + + + + +Key-value file parser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Key-value file parser

+

Key-value file parser — parses .ini-like config files

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GKeyFile;
+#define             G_KEY_FILE_ERROR
+enum                GKeyFileError;
+enum                GKeyFileFlags;
+
+GKeyFile *          g_key_file_new                      (void);
+void                g_key_file_free                     (GKeyFile *key_file);
+void                g_key_file_set_list_separator       (GKeyFile *key_file,
+                                                         gchar separator);
+gboolean            g_key_file_load_from_file           (GKeyFile *key_file,
+                                                         const gchar *file,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+gboolean            g_key_file_load_from_data           (GKeyFile *key_file,
+                                                         const gchar *data,
+                                                         gsize length,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+gboolean            g_key_file_load_from_data_dirs      (GKeyFile *key_file,
+                                                         const gchar *file,
+                                                         gchar **full_path,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+gboolean            g_key_file_load_from_dirs           (GKeyFile *key_file,
+                                                         const gchar *file,
+                                                         const gchar **search_dirs,
+                                                         gchar **full_path,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+gchar *             g_key_file_to_data                  (GKeyFile *key_file,
+                                                         gsize *length,
+                                                         GError **error);
+gchar *             g_key_file_get_start_group          (GKeyFile *key_file);
+gchar **            g_key_file_get_groups               (GKeyFile *key_file,
+                                                         gsize *length);
+gchar **            g_key_file_get_keys                 (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         gsize *length,
+                                                         GError **error);
+gboolean            g_key_file_has_group                (GKeyFile *key_file,
+                                                         const gchar *group_name);
+gboolean            g_key_file_has_key                  (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+
+gchar *             g_key_file_get_value                (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+gchar *             g_key_file_get_string               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+gchar *             g_key_file_get_locale_string        (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         GError **error);
+gboolean            g_key_file_get_boolean              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+gint                g_key_file_get_integer              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+gdouble             g_key_file_get_double               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+gchar **            g_key_file_get_string_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+gchar **            g_key_file_get_locale_string_list   (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         gsize *length,
+                                                         GError **error);
+gboolean *          g_key_file_get_boolean_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+gint *              g_key_file_get_integer_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+gdouble *           g_key_file_get_double_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+gchar *             g_key_file_get_comment              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+
+void                g_key_file_set_value                (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *value);
+void                g_key_file_set_string               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *string);
+void                g_key_file_set_locale_string        (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         const gchar *string);
+void                g_key_file_set_boolean              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gboolean value);
+void                g_key_file_set_integer              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gint value);
+void                g_key_file_set_double               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gdouble value);
+void                g_key_file_set_string_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar * const list[],
+                                                         gsize length);
+void                g_key_file_set_locale_string_list   (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         const gchar * const list[],
+                                                         gsize length);
+void                g_key_file_set_boolean_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gboolean list[],
+                                                         gsize length);
+void                g_key_file_set_integer_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gint list[],
+                                                         gsize length);
+void                g_key_file_set_double_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gdouble list[],
+                                                         gsize length);
+gboolean            g_key_file_set_comment              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *comment,
+                                                         GError **error);
+gboolean            g_key_file_remove_group             (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         GError **error);
+gboolean            g_key_file_remove_key               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+gboolean            g_key_file_remove_comment           (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+
+#define             G_KEY_FILE_DESKTOP_GROUP
+#define             G_KEY_FILE_DESKTOP_KEY_TYPE
+#define             G_KEY_FILE_DESKTOP_KEY_VERSION
+#define             G_KEY_FILE_DESKTOP_KEY_NAME
+#define             G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME
+#define             G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY
+#define             G_KEY_FILE_DESKTOP_KEY_COMMENT
+#define             G_KEY_FILE_DESKTOP_KEY_ICON
+#define             G_KEY_FILE_DESKTOP_KEY_HIDDEN
+#define             G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN
+#define             G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN
+#define             G_KEY_FILE_DESKTOP_KEY_TRY_EXEC
+#define             G_KEY_FILE_DESKTOP_KEY_EXEC
+#define             G_KEY_FILE_DESKTOP_KEY_PATH
+#define             G_KEY_FILE_DESKTOP_KEY_TERMINAL
+#define             G_KEY_FILE_DESKTOP_KEY_MIME_TYPE
+#define             G_KEY_FILE_DESKTOP_KEY_CATEGORIES
+#define             G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY
+#define             G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS
+#define             G_KEY_FILE_DESKTOP_KEY_URL
+#define             G_KEY_FILE_DESKTOP_TYPE_APPLICATION
+#define             G_KEY_FILE_DESKTOP_TYPE_LINK
+#define             G_KEY_FILE_DESKTOP_TYPE_DIRECTORY
+
+
+
+

Description

+

+GKeyFile lets you parse, edit or create files containing groups of +key-value pairs, which we call key files for +lack of a better name. Several freedesktop.org specifications use +key files now, e.g the +Desktop +Entry Specification and the +Icon +Theme Specification. +

+

+The syntax of key files is described in detail in the +Desktop +Entry Specification, here is a quick summary: Key files +consists of groups of key-value pairs, interspersed with comments. +

+
+# this is just an example
+# there can be comments before the first group
+[First Group]
+Name=Key File Example\tthis value shows\nescaping
+# localized strings are stored in multiple key-value pairs
+Welcome=Hello
+Welcome[de]=Hallo
+Welcome[fr_FR]=Bonjour
+Welcome[it]=Ciao
+Welcome[be@latin]=Hello
+[Another Group]
+Numbers=2;20;-200;0
+Booleans=true;false;true;true
+
+

+Lines beginning with a '#' and blank lines are considered comments. +

+

+Groups are started by a header line containing the group name enclosed +in '[' and ']', and ended implicitly by the start of the next group or +the end of the file. Each key-value pair must be contained in a group. +

+

+Key-value pairs generally have the form key=value, +with the exception of localized strings, which have the form +key[locale]=value, with a locale identifier of the form +lang_COUNTRYMODIFIER where COUNTRY and +MODIFIER are optional. Space before and after the +'=' character are ignored. Newline, tab, carriage return and backslash +characters in value are escaped as \n, \t, \r, and \\, respectively. +To preserve leading spaces in values, these can also be escaped as \s. +

+

+Key files can store strings (possibly with localized variants), integers, +booleans and lists of these. Lists are separated by a separator character, +typically ';' or ','. To use the list separator character in a value in +a list, it has to be escaped by prefixing it with a backslash. +

+

+This syntax is obviously inspired by the .ini +files commonly met on Windows, but there are some important differences: +

+
    +
  • +.ini files use the ';' character to begin comments, + key files use the '#' character. +

  • +
  • +Key files do not allow for ungrouped keys meaning only comments can precede the first group. +

  • +
  • +Key files are always encoded in UTF-8. +

  • +
  • +Key and Group names are case-sensitive, for example a group called +[GROUP] is a different group from [group]. +

  • +
  • +.ini files don't have a strongly typed boolean entry type, they only +have GetProfileInt. In GKeyFile only +true and false (in lower case) are allowed. +

  • +
+

+

+

+Note that in contrast to the +Desktop +Entry Specification, groups in key files may contain the same +key multiple times; the last entry wins. Key files may also contain +multiple groups with the same name; they are merged together. +Another difference is that keys and group names in key files are not +restricted to ASCII characters. +

+
+
+

Details

+
+

GKeyFile

+
typedef struct _GKeyFile GKeyFile;
+

+The GKeyFile struct contains only private fields +and should not be used directly. +

+
+
+
+

G_KEY_FILE_ERROR

+
#define G_KEY_FILE_ERROR g_key_file_error_quark()
+
+

+Error domain for key file parsing. Errors in this domain will +be from the GKeyFileError enumeration. See GError for information on +error domains. +

+
+
+
+

enum GKeyFileError

+
typedef enum
+{
+  G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
+  G_KEY_FILE_ERROR_PARSE,
+  G_KEY_FILE_ERROR_NOT_FOUND,
+  G_KEY_FILE_ERROR_KEY_NOT_FOUND,
+  G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
+  G_KEY_FILE_ERROR_INVALID_VALUE
+} GKeyFileError;
+
+

+Error codes returned by key file parsing. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

G_KEY_FILE_ERROR_UNKNOWN_ENCODING

the text being parsed was in an unknown encoding +

G_KEY_FILE_ERROR_PARSE

document was ill-formed +

G_KEY_FILE_ERROR_NOT_FOUND

the file was not found +

G_KEY_FILE_ERROR_KEY_NOT_FOUND

a requested key was not found +

G_KEY_FILE_ERROR_GROUP_NOT_FOUND

a requested group was not found +

G_KEY_FILE_ERROR_INVALID_VALUE

a value could not be parsed +
+
+
+
+

enum GKeyFileFlags

+
typedef enum
+{
+  G_KEY_FILE_NONE              = 0,
+  G_KEY_FILE_KEEP_COMMENTS     = 1 << 0,
+  G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1
+} GKeyFileFlags;
+
+

+Flags which influence the parsing. +

+
++ + + + + + + + + + + + + + +

G_KEY_FILE_NONE

No flags, default behaviour +

G_KEY_FILE_KEEP_COMMENTS

Use this flag if you plan to write the (possibly modified) + contents of the key file back to a file; otherwise all comments will be lost when + the key file is written back. +

G_KEY_FILE_KEEP_TRANSLATIONS

Use this flag if you plan to write the (possibly modified) + contents of the key file back to a file; otherwise only the translations for the current + language will be written back. +
+
+
+
+

g_key_file_new ()

+
GKeyFile *          g_key_file_new                      (void);
+

+Creates a new empty GKeyFile object. Use +g_key_file_load_from_file(), g_key_file_load_from_data(), +g_key_file_load_from_dirs() or g_key_file_load_from_data_dirs() to +read an existing key file.

+
++ + + + +

Returns :

an empty GKeyFile. + +
+

Since 2.6

+
+
+
+

g_key_file_free ()

+
void                g_key_file_free                     (GKeyFile *key_file);
+

+Frees a GKeyFile.

+
++ + + + +

key_file :

a GKeyFile +
+

Since 2.6

+
+
+
+

g_key_file_set_list_separator ()

+
void                g_key_file_set_list_separator       (GKeyFile *key_file,
+                                                         gchar separator);
+

+Sets the character which is used to separate +values in lists. Typically ';' or ',' are used +as separators. The default list separator is ';'.

+
++ + + + + + + + + + +

key_file :

a GKeyFile +

separator :

the separator +
+

Since 2.6

+
+
+
+

g_key_file_load_from_file ()

+
gboolean            g_key_file_load_from_file           (GKeyFile *key_file,
+                                                         const gchar *file,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+

+Loads a key file into an empty GKeyFile structure. +If the file could not be loaded then error is set to +either a GFileError or GKeyFileError.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

an empty GKeyFile struct +

file :

the path of a filename to load, in the GLib filename encoding +

flags :

flags from GKeyFileFlags +

error :

return location for a GError, or NULL +

Returns :

TRUE if a key file could be loaded, FALSE otherwise + +
+

Since 2.6

+
+
+
+

g_key_file_load_from_data ()

+
gboolean            g_key_file_load_from_data           (GKeyFile *key_file,
+                                                         const gchar *data,
+                                                         gsize length,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+

+Loads a key file from memory into an empty GKeyFile structure. +If the object cannot be created then error is set to a GKeyFileError.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

an empty GKeyFile struct +

data :

key file loaded in memory +

length :

the length of data in bytes +

flags :

flags from GKeyFileFlags +

error :

return location for a GError, or NULL +

Returns :

TRUE if a key file could be loaded, FALSE otherwise + +
+

Since 2.6

+
+
+
+

g_key_file_load_from_data_dirs ()

+
gboolean            g_key_file_load_from_data_dirs      (GKeyFile *key_file,
+                                                         const gchar *file,
+                                                         gchar **full_path,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+

+This function looks for a key file named file in the paths +returned from g_get_user_data_dir() and g_get_system_data_dirs(), +loads the file into key_file and returns the file's full path in +full_path. If the file could not be loaded then an error is +set to either a GFileError or GKeyFileError.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

an empty GKeyFile struct +

file :

a relative path to a filename to open and parse +

full_path :

return location for a string containing the full path + of the file, or NULL +

flags :

flags from GKeyFileFlags +

error :

return location for a GError, or NULL +

Returns :

TRUE if a key file could be loaded, FALSE othewise +
+

Since 2.6

+
+
+
+

g_key_file_load_from_dirs ()

+
gboolean            g_key_file_load_from_dirs           (GKeyFile *key_file,
+                                                         const gchar *file,
+                                                         const gchar **search_dirs,
+                                                         gchar **full_path,
+                                                         GKeyFileFlags flags,
+                                                         GError **error);
+

+This function looks for a key file named file in the paths +specified in search_dirs, loads the file into key_file and +returns the file's full path in full_path. If the file could not +be loaded then an error is set to either a GFileError or +GKeyFileError.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

an empty GKeyFile struct +

file :

a relative path to a filename to open and parse +

search_dirs :

NULL-terminated array of directories to search +

full_path :

return location for a string containing the full path + of the file, or NULL +

flags :

flags from GKeyFileFlags +

error :

return location for a GError, or NULL +

Returns :

TRUE if a key file could be loaded, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_key_file_to_data ()

+
gchar *             g_key_file_to_data                  (GKeyFile *key_file,
+                                                         gsize *length,
+                                                         GError **error);
+

+This function outputs key_file as a string. +

+

+Note that this function never reports an error, +so it is safe to pass NULL as error.

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

length :

return location for the length of the + returned string, or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string holding + the contents of the GKeyFile + +
+

Since 2.6

+
+
+
+

g_key_file_get_start_group ()

+
gchar *             g_key_file_get_start_group          (GKeyFile *key_file);
+

+Returns the name of the start group of the file.

+
++ + + + + + + + + + +

key_file :

a GKeyFile +

Returns :

The start group of the key file. + +
+

Since 2.6

+
+
+
+

g_key_file_get_groups ()

+
gchar **            g_key_file_get_groups               (GKeyFile *key_file,
+                                                         gsize *length);
+

+Returns all groups in the key file loaded with key_file. +The array of returned groups will be NULL-terminated, so +length may optionally be NULL.

+
++ + + + + + + + + + + + + + +

key_file :

a GKeyFile +

length :

return location for the number of returned groups, or NULL +

Returns :

a newly-allocated NULL-terminated array of strings. + Use g_strfreev() to free it. +
+

Since 2.6

+
+
+
+

g_key_file_get_keys ()

+
gchar **            g_key_file_get_keys                 (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         gsize *length,
+                                                         GError **error);
+

+Returns all keys for the group name group_name. The array of +returned keys will be NULL-terminated, so length may +optionally be NULL. In the event that the group_name cannot +be found, NULL is returned and error is set to +G_KEY_FILE_ERROR_GROUP_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

length :

return location for the number of keys returned, or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly-allocated NULL-terminated array of strings. + Use g_strfreev() to free it. + +
+

Since 2.6

+
+
+
+

g_key_file_has_group ()

+
gboolean            g_key_file_has_group                (GKeyFile *key_file,
+                                                         const gchar *group_name);
+

+Looks whether the key file has the group group_name.

+
++ + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

Returns :

TRUE if group_name is a part of key_file, FALSE +otherwise. +
+

Since 2.6

+
+
+
+

g_key_file_has_key ()

+
gboolean            g_key_file_has_key                  (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Looks whether the key file has the key key in the group +group_name.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key name +

error :

return location for a GError +

Returns :

TRUE if key is a part of group_name, FALSE +otherwise. + +
+

Since 2.6

+
+
+
+

g_key_file_get_value ()

+
gchar *             g_key_file_get_value                (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Returns the raw value associated with key under group_name. +Use g_key_file_get_string() to retrieve an unescaped UTF-8 string. +

+

+In the event the key cannot be found, NULL is returned and +error is set to G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the +event that the group_name cannot be found, NULL is returned +and error is set to G_KEY_FILE_ERROR_GROUP_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string or NULL if the specified + key cannot be found. + +
+

Since 2.6

+
+
+
+

g_key_file_get_string ()

+
gchar *             g_key_file_get_string               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Returns the string value associated with key under group_name. +Unlike g_key_file_get_value(), this function handles escape sequences +like \s. +

+

+In the event the key cannot be found, NULL is returned and +error is set to G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the +event that the group_name cannot be found, NULL is returned +and error is set to G_KEY_FILE_ERROR_GROUP_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string or NULL if the specified + key cannot be found. + +
+

Since 2.6

+
+
+
+

g_key_file_get_locale_string ()

+
gchar *             g_key_file_get_locale_string        (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         GError **error);
+

+Returns the value associated with key under group_name +translated in the given locale if available. If locale is +NULL then the current locale is assumed. +

+

+If key cannot be found then NULL is returned and error is set +to G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the value associated +with key cannot be interpreted or no suitable translation can +be found then the untranslated value is returned.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

locale :

a locale identifier or NULL +

error :

return location for a GError, or NULL +

Returns :

a newly allocated string or NULL if the specified + key cannot be found. + +
+

Since 2.6

+
+
+
+

g_key_file_get_boolean ()

+
gboolean            g_key_file_get_boolean              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Returns the value associated with key under group_name as a +boolean. +

+

+If key cannot be found then FALSE is returned and error is set +to G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value +associated with key cannot be interpreted as a boolean then FALSE +is returned and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

error :

return location for a GError +

Returns :

the value associated with the key as a boolean, + or FALSE if the key was not found or could not be parsed. + +
+

Since 2.6

+
+
+
+

g_key_file_get_integer ()

+
gint                g_key_file_get_integer              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Returns the value associated with key under group_name as an +integer. +

+

+If key cannot be found then 0 is returned and error is set to +G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated +with key cannot be interpreted as an integer then 0 is returned +and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

error :

return location for a GError +

Returns :

the value associated with the key as an integer, or + 0 if the key was not found or could not be parsed. + +
+

Since 2.6

+
+
+
+

g_key_file_get_double ()

+
gdouble             g_key_file_get_double               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Returns the value associated with key under group_name as a +double. If group_name is NULL, the start_group is used. +

+

+If key cannot be found then 0.0 is returned and error is set to +G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated +with key cannot be interpreted as a double then 0.0 is returned +and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

error :

return location for a GError +

Returns :

the value associated with the key as a double, or + 0.0 if the key was not found or could not be parsed. + +
+

Since 2.12

+
+
+
+

g_key_file_get_string_list ()

+
gchar **            g_key_file_get_string_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+

+Returns the values associated with key under group_name. +

+

+In the event the key cannot be found, NULL is returned and +error is set to G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the +event that the group_name cannot be found, NULL is returned +and error is set to G_KEY_FILE_ERROR_GROUP_NOT_FOUND.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

length :

return location for the number of returned strings, or NULL +

error :

return location for a GError, or NULL +

Returns :

a NULL-terminated string array or NULL if the specified + key cannot be found. The array should be freed with g_strfreev(). + +
+

Since 2.6

+
+
+
+

g_key_file_get_locale_string_list ()

+
gchar **            g_key_file_get_locale_string_list   (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         gsize *length,
+                                                         GError **error);
+

+Returns the values associated with key under group_name +translated in the given locale if available. If locale is +NULL then the current locale is assumed. +

+

+If key cannot be found then NULL is returned and error is set +to G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the values associated +with key cannot be interpreted or no suitable translations +can be found then the untranslated values are returned. The +returned array is NULL-terminated, so length may optionally +be NULL.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

locale :

a locale identifier or NULL +

length :

return location for the number of returned strings or NULL +

error :

return location for a GError or NULL +

Returns :

a newly allocated NULL-terminated string array + or NULL if the key isn't found. The string array should be freed + with g_strfreev(). + +
+

Since 2.6

+
+
+
+

g_key_file_get_boolean_list ()

+
gboolean *          g_key_file_get_boolean_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+

+Returns the values associated with key under group_name as +booleans. +

+

+If key cannot be found then NULL is returned and error is set to +G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated +with key cannot be interpreted as booleans then NULL is returned +and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

length :

the number of booleans returned +

error :

return location for a GError +

Returns :

the values associated with the key as a list of + booleans, or NULL if the key was not found or could not be parsed. + +
+

Since 2.6

+
+
+
+

g_key_file_get_integer_list ()

+
gint *              g_key_file_get_integer_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+

+Returns the values associated with key under group_name as +integers. +

+

+If key cannot be found then NULL is returned and error is set to +G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated +with key cannot be interpreted as integers then NULL is returned +and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

length :

the number of integers returned +

error :

return location for a GError +

Returns :

the values associated with the key as a list of + integers, or NULL if the key was not found or could not be parsed. + +
+

Since 2.6

+
+
+
+

g_key_file_get_double_list ()

+
gdouble *           g_key_file_get_double_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gsize *length,
+                                                         GError **error);
+

+Returns the values associated with key under group_name as +doubles. +

+

+If key cannot be found then NULL is returned and error is set to +G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated +with key cannot be interpreted as doubles then NULL is returned +and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

length :

the number of doubles returned +

error :

return location for a GError +

Returns :

the values associated with the key as a list of + doubles, or NULL if the key was not found or could not be parsed. + +
+

Since 2.12

+
+
+
+

g_key_file_get_comment ()

+
gchar *             g_key_file_get_comment              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Retrieves a comment above key from group_name. +If key is NULL then comment will be read from above +group_name. If both key and group_name are NULL, then +comment will be read from above the first group in the file.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name, or NULL +

key :

a key +

error :

return location for a GError +

Returns :

a comment that should be freed with g_free() + +
+

Since 2.6

+
+
+
+

g_key_file_set_value ()

+
void                g_key_file_set_value                (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *value);
+

+Associates a new value with key under group_name. +

+

+If key cannot be found then it is created. If group_name cannot +be found then it is created. To set an UTF-8 string which may contain +characters that need escaping (such as newlines or spaces), use +g_key_file_set_string().

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

value :

a string +
+

Since 2.6

+
+
+
+

g_key_file_set_string ()

+
void                g_key_file_set_string               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *string);
+

+Associates a new string value with key under group_name. +If key cannot be found then it is created. +If group_name cannot be found then it is created. +Unlike g_key_file_set_value(), this function handles characters +that need escaping, such as newlines.

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

string :

a string +
+

Since 2.6

+
+
+
+

g_key_file_set_locale_string ()

+
void                g_key_file_set_locale_string        (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         const gchar *string);
+

+Associates a string value for key and locale under group_name. +If the translation for key cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

locale :

a locale identifier +

string :

a string +
+

Since 2.6

+
+
+
+

g_key_file_set_boolean ()

+
void                g_key_file_set_boolean              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gboolean value);
+

+Associates a new boolean value with key under group_name. +If key cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

value :

TRUE or FALSE +
+

Since 2.6

+
+
+
+

g_key_file_set_integer ()

+
void                g_key_file_set_integer              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gint value);
+

+Associates a new integer value with key under group_name. +If key cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

value :

an integer value +
+

Since 2.6

+
+
+
+

g_key_file_set_double ()

+
void                g_key_file_set_double               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gdouble value);
+

+Associates a new double value with key under group_name. +If key cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

value :

an double value +
+

Since 2.12

+
+
+
+

g_key_file_set_string_list ()

+
void                g_key_file_set_string_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar * const list[],
+                                                         gsize length);
+

+Associates a list of string values for key under group_name. +If key cannot be found then it is created. +If group_name cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

list :

an array of string values +

length :

number of string values in list +
+

Since 2.6

+
+
+
+

g_key_file_set_locale_string_list ()

+
void                g_key_file_set_locale_string_list   (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *locale,
+                                                         const gchar * const list[],
+                                                         gsize length);
+

+Associates a list of string values for key and locale under +group_name. If the translation for key cannot be found then +it is created.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

locale :

a locale identifier +

list :

a NULL-terminated array of locale string values +

length :

the length of list +
+

Since 2.6

+
+
+
+

g_key_file_set_boolean_list ()

+
void                g_key_file_set_boolean_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gboolean list[],
+                                                         gsize length);
+

+Associates a list of boolean values with key under group_name. +If key cannot be found then it is created. +If group_name is NULL, the start_group is used.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

list :

an array of boolean values +

length :

length of list +
+

Since 2.6

+
+
+
+

g_key_file_set_integer_list ()

+
void                g_key_file_set_integer_list         (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gint list[],
+                                                         gsize length);
+

+Associates a list of integer values with key under group_name. +If key cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

list :

an array of integer values +

length :

number of integer values in list +
+

Since 2.6

+
+
+
+

g_key_file_set_double_list ()

+
void                g_key_file_set_double_list          (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         gdouble list[],
+                                                         gsize length);
+

+Associates a list of double values with key under +group_name. If key cannot be found then it is created.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key +

list :

an array of double values +

length :

number of double values in list +
+

Since 2.12

+
+
+
+

g_key_file_set_comment ()

+
gboolean            g_key_file_set_comment              (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         const gchar *comment,
+                                                         GError **error);
+

+Places a comment above key from group_name. +If key is NULL then comment will be written above group_name. +If both key and group_name are NULL, then comment will be +written above the first group in the file.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name, or NULL +

key :

a key +

comment :

a comment +

error :

return location for a GError +

Returns :

TRUE if the comment was written, FALSE otherwise + +
+

Since 2.6

+
+
+
+

g_key_file_remove_group ()

+
gboolean            g_key_file_remove_group             (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         GError **error);
+

+Removes the specified group, group_name, +from the key file.

+
++ + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

error :

return location for a GError or NULL +

Returns :

TRUE if the group was removed, FALSE otherwise + +
+

Since 2.6

+
+
+
+

g_key_file_remove_key ()

+
gboolean            g_key_file_remove_key               (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Removes key in group_name from the key file.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name +

key :

a key name to remove +

error :

return location for a GError or NULL +

Returns :

TRUE if the key was removed, FALSE otherwise + +
+

Since 2.6

+
+
+
+

g_key_file_remove_comment ()

+
gboolean            g_key_file_remove_comment           (GKeyFile *key_file,
+                                                         const gchar *group_name,
+                                                         const gchar *key,
+                                                         GError **error);
+

+Removes a comment above key from group_name. +If key is NULL then comment will be removed above group_name. +If both key and group_name are NULL, then comment will +be removed above the first group in the file.

+
++ + + + + + + + + + + + + + + + + + + + + + +

key_file :

a GKeyFile +

group_name :

a group name, or NULL +

key :

a key +

error :

return location for a GError +

Returns :

TRUE if the comment was removed, FALSE otherwise + +
+

Since 2.6

+
+
+
+

G_KEY_FILE_DESKTOP_GROUP

+
#define G_KEY_FILE_DESKTOP_GROUP                "Desktop Entry"
+
+

+The name of the main group of a desktop entry file, as defined in the +Desktop +Entry Specification. Consult the specification for more +details about the meanings of the keys below. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_TYPE

+
#define G_KEY_FILE_DESKTOP_KEY_TYPE             "Type"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the type of the desktop entry. Usually +G_KEY_FILE_DESKTOP_TYPE_APPLICATION, +G_KEY_FILE_DESKTOP_TYPE_LINK, or +G_KEY_FILE_DESKTOP_TYPE_DIRECTORY. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_VERSION

+
#define G_KEY_FILE_DESKTOP_KEY_VERSION          "Version"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the version of the Desktop +Entry Specification used for the desktop entry file. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_NAME

+
#define G_KEY_FILE_DESKTOP_KEY_NAME             "Name"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the specific name of the +desktop entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME

+
#define G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME     "GenericName"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the generic name of the +desktop entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY

+
#define G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY       "NoDisplay"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the desktop entry should be +shown in menus. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_COMMENT

+
#define G_KEY_FILE_DESKTOP_KEY_COMMENT          "Comment"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the tooltip for the desktop +entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_ICON

+
#define G_KEY_FILE_DESKTOP_KEY_ICON             "Icon"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the name of the icon to be +displayed for the desktop entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_HIDDEN

+
#define G_KEY_FILE_DESKTOP_KEY_HIDDEN           "Hidden"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the desktop entry has been +deleted by the user. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN

+
#define G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN     "OnlyShowIn"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings identifying the environments that +should display the desktop entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN

+
#define G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN      "NotShowIn"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings identifying the environments that +should not display the desktop entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_TRY_EXEC

+
#define G_KEY_FILE_DESKTOP_KEY_TRY_EXEC         "TryExec"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the file name of a binary on disk +used to determine if the program is actually installed. It is only +valid for desktop entries with the Application +type. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_EXEC

+
#define G_KEY_FILE_DESKTOP_KEY_EXEC             "Exec"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the command line to execute. It is only +valid for desktop entries with the Application +type. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_PATH

+
#define G_KEY_FILE_DESKTOP_KEY_PATH             "Path"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string containing the working directory to run the +program in. It is only valid for desktop entries with the +Application type. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_TERMINAL

+
#define G_KEY_FILE_DESKTOP_KEY_TERMINAL         "Terminal"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the program should be +run in a terminal window. It is only valid for desktop entries with +the Application type. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_MIME_TYPE

+
#define G_KEY_FILE_DESKTOP_KEY_MIME_TYPE        "MimeType"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings giving the MIME types supported +by this desktop entry. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_CATEGORIES

+
#define G_KEY_FILE_DESKTOP_KEY_CATEGORIES       "Categories"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings giving the categories in which the +desktop entry should be shown in a menu. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY

+
#define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY   "StartupNotify"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the application supports +the Startup +Notification Protocol Specification. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS

+
#define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is string identifying the WM class or name hint of a +window that the application will create, which can be used to emulate +Startup Notification with older applications. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_KEY_URL

+
#define G_KEY_FILE_DESKTOP_KEY_URL              "URL"
+
+

+A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the URL to access. It is only valid +for desktop entries with the Link type. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_TYPE_APPLICATION

+
#define G_KEY_FILE_DESKTOP_TYPE_APPLICATION     "Application"
+
+

+The value of the G_KEY_FILE_DESKTOP_KEY_TYPE +key for desktop entries representing applications. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_TYPE_LINK

+
#define G_KEY_FILE_DESKTOP_TYPE_LINK            "Link"
+
+

+The value of the G_KEY_FILE_DESKTOP_KEY_TYPE +key for desktop entries representing links to documents. +

+

Since 2.14

+
+
+
+

G_KEY_FILE_DESKTOP_TYPE_DIRECTORY

+
#define G_KEY_FILE_DESKTOP_TYPE_DIRECTORY       "Directory"
+
+

+The value of the G_KEY_FILE_DESKTOP_KEY_TYPE +key for desktop entries representing directories. +

+

Since 2.14

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Keyed-Data-Lists.html b/docs/reference/glib/html/glib-Keyed-Data-Lists.html new file mode 100644 index 0000000..b55aca8 --- /dev/null +++ b/docs/reference/glib/html/glib-Keyed-Data-Lists.html @@ -0,0 +1,602 @@ + + + + +Keyed Data Lists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Keyed Data Lists

+

Keyed Data Lists — lists of data elements which are accessible by a + string or GQuark identifier

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GData;
+void                g_datalist_init                     (GData **datalist);
+
+#define             g_datalist_id_set_data              (dl, q, d)
+void                g_datalist_id_set_data_full         (GData **datalist,
+                                                         GQuark key_id,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_func);
+gpointer            g_datalist_id_get_data              (GData **datalist,
+                                                         GQuark key_id);
+#define             g_datalist_id_remove_data           (dl, q)
+gpointer            g_datalist_id_remove_no_notify      (GData **datalist,
+                                                         GQuark key_id);
+
+#define             g_datalist_set_data                 (dl, k, d)
+#define             g_datalist_set_data_full            (dl, k, d, f)
+#define             g_datalist_get_data                 (dl, k)
+#define             g_datalist_remove_data              (dl, k)
+#define             g_datalist_remove_no_notify         (dl, k)
+
+void                g_datalist_foreach                  (GData **datalist,
+                                                         GDataForeachFunc func,
+                                                         gpointer user_data);
+void                g_datalist_clear                    (GData **datalist);
+void                g_datalist_set_flags                (GData **datalist,
+                                                         guint flags);
+void                g_datalist_unset_flags              (GData **datalist,
+                                                         guint flags);
+guint               g_datalist_get_flags                (GData **datalist);
+#define             G_DATALIST_FLAGS_MASK
+
+
+
+

Description

+

+Keyed data lists provide lists of arbitrary data elements which can +be accessed either with a string or with a GQuark corresponding to +the string. +

+

+The GQuark methods are quicker, since the strings have to be +converted to GQuarks anyway. +

+

+Data lists are used for associating arbitrary data with GObjects, +using g_object_set_data() and related functions. +

+

+To create a datalist, use g_datalist_init(). +

+

+To add data elements to a datalist use g_datalist_id_set_data(), +g_datalist_id_set_data_full(), g_datalist_set_data() and +g_datalist_set_data_full(). +

+

+To get data elements from a datalist use g_datalist_id_get_data() +and g_datalist_get_data(). +

+

+To iterate over all data elements in a datalist use +g_datalist_foreach() (not thread-safe). +

+

+To remove data elements from a datalist use +g_datalist_id_remove_data() and g_datalist_remove_data(). +

+

+To remove all data elements from a datalist, use g_datalist_clear().

+
+
+

Details

+
+

GData

+
typedef struct _GData GData;
+

+The GData struct is an opaque data structure to represent a Keyed Data List. It should +only be accessed via the following functions.

+
+
+
+

g_datalist_init ()

+
void                g_datalist_init                     (GData **datalist);
+

+Resets the datalist to NULL. It does not free any memory or call +any destroy functions.

+
++ + + + +

datalist :

a pointer to a pointer to a datalist. +
+
+
+
+

g_datalist_id_set_data()

+
#define             g_datalist_id_set_data(dl, q, d)
+

+Sets the data corresponding to the given GQuark id. Any previous +data with the same key is removed, and its destroy function is +called.

+
++ + + + + + + + + + + + + + +

dl :

a datalist. +

q :

the GQuark to identify the data element. +

d :

the data element, or NULL to remove any previous element + corresponding to q. +
+
+
+
+

g_datalist_id_set_data_full ()

+
void                g_datalist_id_set_data_full         (GData **datalist,
+                                                         GQuark key_id,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy_func);
+

+Sets the data corresponding to the given GQuark id, and the +function to be called when the element is removed from the datalist. +Any previous data with the same key is removed, and its destroy +function is called.

+
++ + + + + + + + + + + + + + + + + + +

datalist :

a datalist. +

key_id :

the GQuark to identify the data element. +

data :

the data element or NULL to remove any previous element + corresponding to key_id. +

destroy_func :

the function to call when the data element is + removed. This function will be called with the data + element and can be used to free any memory allocated + for it. If data is NULL, then destroy_func must + also be NULL. +
+
+
+
+

g_datalist_id_get_data ()

+
gpointer            g_datalist_id_get_data              (GData **datalist,
+                                                         GQuark key_id);
+

+Retrieves the data element corresponding to key_id.

+
++ + + + + + + + + + + + + + +

datalist :

a datalist. +

key_id :

the GQuark identifying a data element. +

Returns :

the data element, or NULL if it is not found. +
+
+
+
+

g_datalist_id_remove_data()

+
#define             g_datalist_id_remove_data(dl, q)
+

+Removes an element, using its GQuark identifier.

+
++ + + + + + + + + + +

dl :

a datalist. +

q :

the GQuark identifying the data element. +
+
+
+
+

g_datalist_id_remove_no_notify ()

+
gpointer            g_datalist_id_remove_no_notify      (GData **datalist,
+                                                         GQuark key_id);
+

+Removes an element, without calling its destroy notification +function.

+
++ + + + + + + + + + + + + + +

datalist :

a datalist. +

key_id :

the GQuark identifying a data element. +

Returns :

the data previously stored at key_id, or NULL if none. +
+
+
+
+

g_datalist_set_data()

+
#define             g_datalist_set_data(dl, k, d)
+

+Sets the data element corresponding to the given string identifier.

+
++ + + + + + + + + + + + + + +

dl :

a datalist. +

k :

the string to identify the data element. +

d :

the data element, or NULL to remove any previous element + corresponding to k. +
+
+
+
+

g_datalist_set_data_full()

+
#define             g_datalist_set_data_full(dl, k, d, f)
+

+Sets the data element corresponding to the given string identifier, +and the function to be called when the data element is removed.

+
++ + + + + + + + + + + + + + + + + + +

dl :

a datalist. +

k :

the string to identify the data element. +

d :

the data element, or NULL to remove any previous element + corresponding to k. +

f :

the function to call when the data element is removed. This + function will be called with the data element and can be used to + free any memory allocated for it. If d is NULL, then f must + also be NULL. +
+
+
+
+

g_datalist_get_data()

+
#define             g_datalist_get_data(dl, k)
+

+Gets a data element, using its string identifer. This is slower than +g_datalist_id_get_data() because the string is first converted to a +GQuark.

+
++ + + + + + + + + + + + + + +

dl :

a datalist. +

k :

the string identifying a data element. +

Returns :

the data element, or NULL if it is not found. +
+
+
+
+

g_datalist_remove_data()

+
#define             g_datalist_remove_data(dl, k)
+

+Removes an element using its string identifier. The data element's +destroy function is called if it has been set.

+
++ + + + + + + + + + +

dl :

a datalist. +

k :

the string identifying the data element. +
+
+
+
+

g_datalist_remove_no_notify()

+
#define             g_datalist_remove_no_notify(dl, k)
+

+Removes an element, without calling its destroy notifier.

+
++ + + + + + + + + + +

dl :

a datalist. +

k :

the string identifying the data element. +
+
+
+
+

g_datalist_foreach ()

+
void                g_datalist_foreach                  (GData **datalist,
+                                                         GDataForeachFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each data element of the datalist. The +function is called with each data element's GQuark id and data, +together with the given user_data parameter. Note that this +function is NOT thread-safe. So unless datalist can be protected +from any modifications during invocation of this function, it should +not be called.

+
++ + + + + + + + + + + + + + +

datalist :

a datalist. +

func :

the function to call for each data element. +

user_data :

user data to pass to the function. +
+
+
+
+

g_datalist_clear ()

+
void                g_datalist_clear                    (GData **datalist);
+

+Frees all the data elements of the datalist. The data elements' +destroy functions are called if they have been set.

+
++ + + + +

datalist :

a datalist. +
+
+
+
+

g_datalist_set_flags ()

+
void                g_datalist_set_flags                (GData **datalist,
+                                                         guint flags);
+

+Turns on flag values for a data list. This function is used +to keep a small number of boolean flags in an object with +a data list without using any additional space. It is +not generally useful except in circumstances where space +is very tight. (It is used in the base GObject type, for +example.)

+
++ + + + + + + + + + +

datalist :

pointer to the location that holds a list +

flags :

the flags to turn on. The values of the flags are + restricted by G_DATALIST_FLAGS_MASK (currently + 3; giving two possible boolean flags). + A value for flags that doesn't fit within the mask is + an error. +
+

Since 2.8

+
+
+
+

g_datalist_unset_flags ()

+
void                g_datalist_unset_flags              (GData **datalist,
+                                                         guint flags);
+

+Turns off flag values for a data list. See g_datalist_unset_flags()

+
++ + + + + + + + + + +

datalist :

pointer to the location that holds a list +

flags :

the flags to turn off. The values of the flags are + restricted by G_DATALIST_FLAGS_MASK (currently + 3: giving two possible boolean flags). + A value for flags that doesn't fit within the mask is + an error. +
+

Since 2.8

+
+
+
+

g_datalist_get_flags ()

+
guint               g_datalist_get_flags                (GData **datalist);
+

+Gets flags values packed in together with the datalist. +See g_datalist_set_flags().

+
++ + + + + + + + + + +

datalist :

pointer to the location that holds a list +

Returns :

the flags of the datalist + +
+

Since 2.8

+
+
+
+

G_DATALIST_FLAGS_MASK

+
#define G_DATALIST_FLAGS_MASK 0x3
+
+

+A bitmask that restricts the possible flags passed to +g_datalist_set_flags(). Passing a flags value where +flags & ~G_DATALIST_FLAGS_MASK != 0 is an error.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Lexical-Scanner.html b/docs/reference/glib/html/glib-Lexical-Scanner.html new file mode 100644 index 0000000..cd555fc --- /dev/null +++ b/docs/reference/glib/html/glib-Lexical-Scanner.html @@ -0,0 +1,1481 @@ + + + + +Lexical Scanner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Lexical Scanner

+

Lexical Scanner — a general purpose lexical scanner

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GScanner;
+                    GScannerConfig;
+GScanner*           g_scanner_new                       (const GScannerConfig *config_templ);
+void                g_scanner_destroy                   (GScanner *scanner);
+
+void                g_scanner_input_file                (GScanner *scanner,
+                                                         gint input_fd);
+void                g_scanner_sync_file_offset          (GScanner *scanner);
+void                g_scanner_input_text                (GScanner *scanner,
+                                                         const gchar *text,
+                                                         guint text_len);
+GTokenType          g_scanner_peek_next_token           (GScanner *scanner);
+GTokenType          g_scanner_get_next_token            (GScanner *scanner);
+gboolean            g_scanner_eof                       (GScanner *scanner);
+
+guint               g_scanner_cur_line                  (GScanner *scanner);
+guint               g_scanner_cur_position              (GScanner *scanner);
+GTokenType          g_scanner_cur_token                 (GScanner *scanner);
+GTokenValue         g_scanner_cur_value                 (GScanner *scanner);
+
+guint               g_scanner_set_scope                 (GScanner *scanner,
+                                                         guint scope_id);
+void                g_scanner_scope_add_symbol          (GScanner *scanner,
+                                                         guint scope_id,
+                                                         const gchar *symbol,
+                                                         gpointer value);
+void                g_scanner_scope_foreach_symbol      (GScanner *scanner,
+                                                         guint scope_id,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+gpointer            g_scanner_scope_lookup_symbol       (GScanner *scanner,
+                                                         guint scope_id,
+                                                         const gchar *symbol);
+void                g_scanner_scope_remove_symbol       (GScanner *scanner,
+                                                         guint scope_id,
+                                                         const gchar *symbol);
+#define             g_scanner_add_symbol                ( scanner, symbol, value )
+#define             g_scanner_remove_symbol             ( scanner, symbol )
+#define             g_scanner_foreach_symbol            ( scanner, func, data )
+
+#define             g_scanner_freeze_symbol_table       (scanner)
+#define             g_scanner_thaw_symbol_table         (scanner)
+gpointer            g_scanner_lookup_symbol             (GScanner *scanner,
+                                                         const gchar *symbol);
+
+void                g_scanner_warn                      (GScanner *scanner,
+                                                         const gchar *format,
+                                                         ...);
+void                g_scanner_error                     (GScanner *scanner,
+                                                         const gchar *format,
+                                                         ...);
+void                g_scanner_unexp_token               (GScanner *scanner,
+                                                         GTokenType expected_token,
+                                                         const gchar *identifier_spec,
+                                                         const gchar *symbol_spec,
+                                                         const gchar *symbol_name,
+                                                         const gchar *message,
+                                                         gint is_error);
+void                (*GScannerMsgFunc)                  (GScanner *scanner,
+                                                         gchar *message,
+                                                         gboolean error);
+
+#define             G_CSET_a_2_z
+#define             G_CSET_A_2_Z
+#define             G_CSET_DIGITS
+#define             G_CSET_LATINC
+#define             G_CSET_LATINS
+enum                GTokenType;
+union               GTokenValue;
+enum                GErrorType;
+
+
+
+

Description

+

+The GScanner and its associated functions provide a general purpose +lexical scanner. +

+
+
+

Details

+
+

GScanner

+
typedef struct {
+  /* unused fields */
+  gpointer		user_data;
+  guint			max_parse_errors;
+  
+  /* g_scanner_error() increments this field */
+  guint			parse_errors;
+  
+  /* name of input stream, featured by the default message handler */
+  const gchar		*input_name;
+  
+  /* quarked data */
+  GData			*qdata;
+  
+  /* link into the scanner configuration */
+  GScannerConfig *config;
+  
+  /* fields filled in after g_scanner_get_next_token() */
+  GTokenType		token;
+  GTokenValue		value;
+  guint			line;
+  guint			position;
+  
+  /* fields filled in after g_scanner_peek_next_token() */
+  GTokenType		next_token;
+  GTokenValue		next_value;
+  guint			next_line;
+  guint			next_position;
+  
+  /* to be considered private */
+  GHashTable		*symbol_table;
+  gint			input_fd;
+  const gchar		*text;
+  const gchar		*text_end;
+  gchar			*buffer;
+  guint			scope_id;
+  
+  /* handler function for _warn and _error */
+  GScannerMsgFunc msg_handler;
+} GScanner;
+
+

+The data structure representing a lexical scanner. +

+

+You should set input_name after creating +the scanner, since it is used by the default message handler when +displaying warnings and errors. If you are scanning a file, the file +name would be a good choice. +

+

+The user_data and +max_parse_errors fields are not used. +If you need to associate extra data with the scanner you can place them here. +

+

+If you want to use your own message handler you can set the +msg_handler field. The type of the message +handler function is declared by GScannerMsgFunc. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

gpointer user_data;

+

guint max_parse_errors;

+

guint parse_errors;

+

const gchar *input_name;

+

GData *qdata;

+

GScannerConfig *config;

+

GTokenType token;

token parsed by the last g_scanner_get_next_token() +

GTokenValue value;

value of the last token from g_scanner_get_next_token() +

guint line;

line number of the last token from g_scanner_get_next_token() +

guint position;

char number of the last token from g_scanner_get_next_token() +

GTokenType next_token;

token parsed by the last g_scanner_peek_next_token() +

GTokenValue next_value;

value of the last token from g_scanner_peek_next_token() +

guint next_line;

line number of the last token from g_scanner_peek_next_token() +

guint next_position;

char number of the last token from g_scanner_peek_next_token() +

GHashTable *symbol_table;

+

gint input_fd;

+

const gchar *text;

+

const gchar *text_end;

+

gchar *buffer;

+

guint scope_id;

+

GScannerMsgFunc msg_handler;

function to handle GScanner message output +
+
+
+
+

GScannerConfig

+
typedef struct {
+  /* Character sets
+   */
+  gchar		*cset_skip_characters;		/* default: " \t\n" */
+  gchar		*cset_identifier_first;
+  gchar		*cset_identifier_nth;
+  gchar		*cpair_comment_single;		/* default: "#\n" */
+  
+  /* Should symbol lookup work case sensitive?
+   */
+  guint		case_sensitive : 1;
+  
+  /* Boolean values to be adjusted "on the fly"
+   * to configure scanning behaviour.
+   */
+  guint		skip_comment_multi : 1;		/* C like comment */
+  guint		skip_comment_single : 1; /* single line comment */
+  guint		scan_comment_multi : 1;		/* scan multi line comments? */
+  guint		scan_identifier : 1;
+  guint		scan_identifier_1char : 1;
+  guint		scan_identifier_NULL : 1;
+  guint		scan_symbols : 1;
+  guint		scan_binary : 1;
+  guint		scan_octal : 1;
+  guint		scan_float : 1;
+  guint		scan_hex : 1;			/* `0x0ff0' */
+  guint		scan_hex_dollar : 1;		/* `$0ff0' */
+  guint		scan_string_sq : 1;		/* string: 'anything' */
+  guint		scan_string_dq : 1;		/* string: "\\-escapes!\n" */
+  guint		numbers_2_int : 1;		/* bin, octal, hex => int */
+  guint		int_2_float : 1;		/* int => G_TOKEN_FLOAT? */
+  guint		identifier_2_string : 1;
+  guint		char_2_token : 1;		/* return G_TOKEN_CHAR? */
+  guint		symbol_2_token : 1;
+  guint		scope_0_fallback : 1;		/* try scope 0 on lookups? */
+  guint		store_int64 : 1; 		/* use value.v_int64 rather than v_int */
+  guint		padding_dummy;
+} GScannerConfig;
+
+

+Specifies the GScanner parser configuration. Most settings can be changed during +the parsing phase and will affect the lexical parsing of the next unpeeked token. +

+

+cset_skip_characters specifies which characters +should be skipped by the scanner (the default is the whitespace characters: +space, tab, carriage-return and line-feed). +

+

+cset_identifier_first specifies the characters +which can start identifiers (the default is G_CSET_a_2_z, "_", and +G_CSET_A_2_Z). +

+

+cset_identifier_nth specifies the characters +which can be used in identifiers, after the first character (the default +is G_CSET_a_2_z, "_0123456789", G_CSET_A_2_Z, G_CSET_LATINS, +G_CSET_LATINC). +

+

+cpair_comment_single specifies the characters +at the start and end of single-line comments. The default is "#\n" which +means that single-line comments start with a '#' and continue until a '\n' +(end of line). +

+

+case_sensitive specifies if symbols are +case sensitive (the default is FALSE). +

+

+skip_comment_multi specifies if multi-line +comments are skipped and not returned as tokens (the default is TRUE). +

+

+skip_comment_single specifies if single-line +comments are skipped and not returned as tokens (the default is TRUE). +

+

+scan_comment_multi specifies if multi-line +comments are recognized (the default is TRUE). +

+

+scan_identifier specifies if identifiers +are recognized (the default is TRUE). +

+

+scan_identifier_1char specifies if single-character +identifiers are recognized (the default is FALSE). +

+

+scan_identifier_NULL specifies if +NULL is reported as G_TOKEN_IDENTIFIER_NULL. +(the default is FALSE). +

+

+scan_symbols specifies if symbols are +recognized (the default is TRUE). +

+

+scan_binary specifies if binary numbers +are recognized (the default is FALSE). +

+

+scan_octal specifies if octal numbers +are recognized (the default is TRUE). +

+

+scan_float specifies if floating point numbers +are recognized (the default is TRUE). +

+

+scan_hex specifies if hexadecimal numbers +are recognized (the default is TRUE). +

+

+scan_hex_dollar specifies if '$' is recognized +as a prefix for hexadecimal numbers (the default is FALSE). +

+

+scan_string_sq specifies if strings can be +enclosed in single quotes (the default is TRUE). +

+

+scan_string_dq specifies if strings can be +enclosed in double quotes (the default is TRUE). +

+

+numbers_2_int specifies if binary, octal and +hexadecimal numbers are reported as G_TOKEN_INT (the default is TRUE). +

+

+int_2_float specifies if all numbers are +reported as G_TOKEN_FLOAT (the default is FALSE). +

+

+identifier_2_string specifies if identifiers +are reported as strings (the default is FALSE). +

+

+char_2_token specifies if characters +are reported by setting token = ch or as G_TOKEN_CHAR +(the default is TRUE). +

+

+symbol_2_token specifies if symbols +are reported by setting token = v_symbol or as +G_TOKEN_SYMBOL (the default is FALSE). +

+

+scope_0_fallback specifies if a symbol +is searched for in the default scope in addition to the current scope +(the default is FALSE). +

+
+
+
+

g_scanner_new ()

+
GScanner*           g_scanner_new                       (const GScannerConfig *config_templ);
+

+Creates a new GScanner. +The config_templ structure specifies the initial settings of the scanner, +which are copied into the GScanner config field. +If you pass NULL then the default settings are used. +

+
++ + + + + + + + + + +

config_templ :

the initial scanner settings. +

Returns :

the new GScanner. +
+
+
+
+

g_scanner_destroy ()

+
void                g_scanner_destroy                   (GScanner *scanner);
+

+Frees all memory used by the GScanner. +

+
++ + + + +

scanner :

a GScanner. +
+
+
+
+

g_scanner_input_file ()

+
void                g_scanner_input_file                (GScanner *scanner,
+                                                         gint input_fd);
+

+Prepares to scan a file. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

input_fd :

a file descriptor. +
+
+
+
+

g_scanner_sync_file_offset ()

+
void                g_scanner_sync_file_offset          (GScanner *scanner);
+

+Rewinds the filedescriptor to the current buffer position and blows +the file read ahead buffer. This is useful for third party uses of +the scanners filedescriptor, which hooks onto the current scanning +position. +

+
++ + + + +

scanner :

a GScanner. +
+
+
+
+

g_scanner_input_text ()

+
void                g_scanner_input_text                (GScanner *scanner,
+                                                         const gchar *text,
+                                                         guint text_len);
+

+Prepares to scan a text buffer. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

text :

the text buffer to scan. +

text_len :

the length of the text buffer. +
+
+
+
+

g_scanner_peek_next_token ()

+
GTokenType          g_scanner_peek_next_token           (GScanner *scanner);
+

+Parses the next token, without removing it from the input stream. +The token data is placed in the +next_token, +next_value, +next_line, and +next_position fields of the GScanner structure. +

+

+Note that, while the token is not removed from the input stream (i.e. +the next call to g_scanner_get_next_token() will return the same token), +it will not be reevaluated. This can lead to surprising results when +changing scope or the scanner configuration after peeking the next token. +Getting the next token after switching the scope or configuration will +return whatever was peeked before, regardless of any symbols that may +have been added or removed in the new scope. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

the type of the token. +
+
+
+
+

g_scanner_get_next_token ()

+
GTokenType          g_scanner_get_next_token            (GScanner *scanner);
+

+Parses the next token just like g_scanner_peek_next_token() and also +removes it from the input stream. +The token data is placed in the +token, +value, +line, and +position fields of the GScanner structure. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

the type of the token. +
+
+
+
+

g_scanner_eof ()

+
gboolean            g_scanner_eof                       (GScanner *scanner);
+

+Returns TRUE if the scanner has reached the end of the file or text buffer. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

+TRUE if the scanner has reached the end of the file or text buffer. +
+
+
+
+

g_scanner_cur_line ()

+
guint               g_scanner_cur_line                  (GScanner *scanner);
+

+Returns the current line in the input stream (counting from 1). +This is the line of the last token parsed via g_scanner_get_next_token(). +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

the current line. +
+
+
+
+

g_scanner_cur_position ()

+
guint               g_scanner_cur_position              (GScanner *scanner);
+

+Returns the current position in the current line (counting from 0). +This is the position of the last token parsed via g_scanner_get_next_token(). +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

the current position on the line. +
+
+
+
+

g_scanner_cur_token ()

+
GTokenType          g_scanner_cur_token                 (GScanner *scanner);
+

+Gets the current token type. +This is simply the token field in the GScanner +structure. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

the current token type. +
+
+
+
+

g_scanner_cur_value ()

+
GTokenValue         g_scanner_cur_value                 (GScanner *scanner);
+

+Gets the current token value. +This is simply the value field in the GScanner +structure. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

Returns :

the current token value. +
+
+
+
+

g_scanner_set_scope ()

+
guint               g_scanner_set_scope                 (GScanner *scanner,
+                                                         guint scope_id);
+

+Sets the current scope. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

scope_id :

the new scope id. +

Returns :

the old scope id. +
+
+
+
+

g_scanner_scope_add_symbol ()

+
void                g_scanner_scope_add_symbol          (GScanner *scanner,
+                                                         guint scope_id,
+                                                         const gchar *symbol,
+                                                         gpointer value);
+

+Adds a symbol to the given scope. +

+
++ + + + + + + + + + + + + + + + + + +

scanner :

a GScanner. +

scope_id :

the scope id. +

symbol :

the symbol to add. +

value :

the value of the symbol. +
+
+
+
+

g_scanner_scope_foreach_symbol ()

+
void                g_scanner_scope_foreach_symbol      (GScanner *scanner,
+                                                         guint scope_id,
+                                                         GHFunc func,
+                                                         gpointer user_data);
+

+Calls the given function for each of the symbol/value pairs in the +given scope of the GScanner. The function is passed the symbol and +value of each pair, and the given user_data parameter. +

+
++ + + + + + + + + + + + + + + + + + +

scanner :

a GScanner. +

scope_id :

the scope id. +

func :

the function to call for each symbol/value pair. +

user_data :

user data to pass to the function. +
+
+
+
+

g_scanner_scope_lookup_symbol ()

+
gpointer            g_scanner_scope_lookup_symbol       (GScanner *scanner,
+                                                         guint scope_id,
+                                                         const gchar *symbol);
+

+Looks up a symbol in a scope and return its value. If the +symbol is not bound in the scope, NULL is returned. +

+
++ + + + + + + + + + + + + + + + + + +

scanner :

a GScanner. +

scope_id :

the scope id. +

symbol :

the symbol to look up. +

Returns :

the value of symbol in the given scope, or NULL +if symbol is not bound in the given scope. +
+
+
+
+

g_scanner_scope_remove_symbol ()

+
void                g_scanner_scope_remove_symbol       (GScanner *scanner,
+                                                         guint scope_id,
+                                                         const gchar *symbol);
+

+Removes a symbol from a scope. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

scope_id :

the scope id. +

symbol :

the symbol to remove. +
+
+
+
+

g_scanner_add_symbol()

+
#define             g_scanner_add_symbol( scanner, symbol, value )
+
+

Warning

+

g_scanner_add_symbol has been deprecated since version 2.2 and should not be used in newly-written code. Use g_scanner_scope_add_symbol() instead.

+
+

+Adds a symbol to the default scope. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

symbol :

the symbol to add. +

value :

the value of the symbol. +
+
+
+
+

g_scanner_remove_symbol()

+
#define             g_scanner_remove_symbol( scanner, symbol )
+
+

Warning

+

g_scanner_remove_symbol has been deprecated since version 2.2 and should not be used in newly-written code. Use g_scanner_scope_remove_symbol() instead.

+
+

+Removes a symbol from the default scope. +

+
++ + + + + + + + + + +

scanner :

a GScanner. +

symbol :

the symbol to remove. +
+
+
+
+

g_scanner_foreach_symbol()

+
#define             g_scanner_foreach_symbol( scanner, func, data )
+
+

Warning

+

g_scanner_foreach_symbol has been deprecated since version 2.2 and should not be used in newly-written code. Use g_scanner_scope_foreach_symbol() instead.

+
+

+Calls a function for each symbol in the default scope. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

func :

the function to call with each symbol. +

data :

data to pass to the function. +
+
+
+
+

g_scanner_freeze_symbol_table()

+
#define             g_scanner_freeze_symbol_table(scanner)
+
+

Warning

+

g_scanner_freeze_symbol_table has been deprecated since version 2.2 and should not be used in newly-written code. This macro does nothing.

+
+

+There is no reason to use this macro, since it does nothing. +

+
++ + + + +

scanner :

a GScanner. +
+
+
+
+

g_scanner_thaw_symbol_table()

+
#define             g_scanner_thaw_symbol_table(scanner)
+
+

Warning

+

g_scanner_thaw_symbol_table has been deprecated since version 2.2 and should not be used in newly-written code. This macro does nothing.

+
+

+There is no reason to use this macro, since it does nothing. +

+
++ + + + +

scanner :

a GScanner. +
+
+
+
+

g_scanner_lookup_symbol ()

+
gpointer            g_scanner_lookup_symbol             (GScanner *scanner,
+                                                         const gchar *symbol);
+

+Looks up a symbol in the current scope and return its value. If the +symbol is not bound in the current scope, NULL is returned. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

symbol :

the symbol to look up. +

Returns :

the value of symbol in the current scope, or NULL +if symbol is not bound in the current scope. +
+
+
+
+

g_scanner_warn ()

+
void                g_scanner_warn                      (GScanner *scanner,
+                                                         const gchar *format,
+                                                         ...);
+

+Outputs a warning message, via the GScanner message handler. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

format :

the message format. See the printf() +documentation. +

... :

the parameters to insert into the format string. +
+
+
+
+

g_scanner_error ()

+
void                g_scanner_error                     (GScanner *scanner,
+                                                         const gchar *format,
+                                                         ...);
+

+Outputs an error message, via the GScanner message handler. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

format :

the message format. See the printf() +documentation. +

... :

the parameters to insert into the format string. +
+
+
+
+

g_scanner_unexp_token ()

+
void                g_scanner_unexp_token               (GScanner *scanner,
+                                                         GTokenType expected_token,
+                                                         const gchar *identifier_spec,
+                                                         const gchar *symbol_spec,
+                                                         const gchar *symbol_name,
+                                                         const gchar *message,
+                                                         gint is_error);
+

+Outputs a message through the scanner's msg_handler, resulting from an +unexpected token in the input stream. +Note that you should not call g_scanner_peek_next_token() followed by +g_scanner_unexp_token() without an intermediate call to +g_scanner_get_next_token(), as g_scanner_unexp_token() evaluates the +scanner's current token (not the peeked token) to construct part +of the message. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

scanner :

a GScanner. +

expected_token :

the expected token. +

identifier_spec :

a string describing how the scanner's user refers to + identifiers (NULL defaults to "identifier"). + This is used if expected_token is G_TOKEN_IDENTIFIER + or G_TOKEN_IDENTIFIER_NULL. +

symbol_spec :

a string describing how the scanner's user refers to + symbols (NULL defaults to "symbol"). + This is used if expected_token is G_TOKEN_SYMBOL or + any token value greater than G_TOKEN_LAST. +

symbol_name :

the name of the symbol, if the scanner's current token + is a symbol. +

message :

a message string to output at the end of the warning/error, or NULL. +

is_error :

if TRUE it is output as an error. If FALSE it is output as a + warning. +
+
+
+
+

GScannerMsgFunc ()

+
void                (*GScannerMsgFunc)                  (GScanner *scanner,
+                                                         gchar *message,
+                                                         gboolean error);
+

+Specifies the type of the message handler function. +

+
++ + + + + + + + + + + + + + +

scanner :

a GScanner. +

message :

the message. +

error :

+TRUE if the message signals an error, FALSE if it + signals a warning. +
+
+
+
+

G_CSET_a_2_z

+
#define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz"
+
+

+The set of lowercase ASCII alphabet characters. +Used for specifying valid identifier characters in GScannerConfig. +

+
+
+
+

G_CSET_A_2_Z

+
#define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+

+The set of uppercase ASCII alphabet characters. +Used for specifying valid identifier characters in GScannerConfig. +

+
+
+
+

G_CSET_DIGITS

+
#define G_CSET_DIGITS "0123456789"
+
+

+The set of digits. +Used for specifying valid identifier characters in GScannerConfig. +

+
+
+
+

G_CSET_LATINC

+
#define             G_CSET_LATINC
+

+The set of uppercase ISO 8859-1 alphabet characters which are +not ASCII characters. +Used for specifying valid identifier characters in GScannerConfig. +

+
+
+
+

G_CSET_LATINS

+
#define             G_CSET_LATINS
+

+The set of lowercase ISO 8859-1 alphabet characters which are +not ASCII characters. +Used for specifying valid identifier characters in GScannerConfig. +

+
+
+
+

enum GTokenType

+
typedef enum
+{
+  G_TOKEN_EOF			=   0,
+  
+  G_TOKEN_LEFT_PAREN		= '(',
+  G_TOKEN_RIGHT_PAREN		= ')',
+  G_TOKEN_LEFT_CURLY		= '{',
+  G_TOKEN_RIGHT_CURLY		= '}',
+  G_TOKEN_LEFT_BRACE		= '[',
+  G_TOKEN_RIGHT_BRACE		= ']',
+  G_TOKEN_EQUAL_SIGN		= '=',
+  G_TOKEN_COMMA			= ',',
+  
+  G_TOKEN_NONE			= 256,
+  
+  G_TOKEN_ERROR,
+  
+  G_TOKEN_CHAR,
+  G_TOKEN_BINARY,
+  G_TOKEN_OCTAL,
+  G_TOKEN_INT,
+  G_TOKEN_HEX,
+  G_TOKEN_FLOAT,
+  G_TOKEN_STRING,
+  
+  G_TOKEN_SYMBOL,
+  G_TOKEN_IDENTIFIER,
+  G_TOKEN_IDENTIFIER_NULL,
+  
+  G_TOKEN_COMMENT_SINGLE,
+  G_TOKEN_COMMENT_MULTI,
+  G_TOKEN_LAST
+} GTokenType;
+
+

+The possible types of token returned from each g_scanner_get_next_token() call. +

+
++ + + + + + + + + + + + + + + + + + +

G_TOKEN_EOF

the end of the file. +

G_TOKEN_LEFT_PAREN

a '(' character. +

G_TOKEN_LEFT_CURLY

a '{' character. +

G_TOKEN_RIGHT_CURLY

a '}' character. +
+
+
+
+

union GTokenValue

+
union GTokenValue
+{
+  gpointer v_symbol;
+  gchar		*v_identifier;
+  gulong v_binary;
+  gulong v_octal;
+  gulong v_int;
+  guint64       v_int64;
+  gdouble v_float;
+  gulong v_hex;
+  gchar		*v_string;
+  gchar		*v_comment;
+  guchar v_char;
+  guint		v_error;
+};
+
+

+A union holding the value of the token. +

+
+
+
+

enum GErrorType

+
typedef enum
+{
+  G_ERR_UNKNOWN,
+  G_ERR_UNEXP_EOF,
+  G_ERR_UNEXP_EOF_IN_STRING,
+  G_ERR_UNEXP_EOF_IN_COMMENT,
+  G_ERR_NON_DIGIT_IN_CONST,
+  G_ERR_DIGIT_RADIX,
+  G_ERR_FLOAT_RADIX,
+  G_ERR_FLOAT_MALFORMED
+} GErrorType;
+
+

+The possible errors, used in the v_error field +of GTokenValue, when the token is a G_TOKEN_ERROR. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_ERR_UNKNOWN

unknown error. +

G_ERR_UNEXP_EOF

unexpected end of file. +

G_ERR_UNEXP_EOF_IN_STRING

unterminated string constant. +

G_ERR_UNEXP_EOF_IN_COMMENT

unterminated comment. +

G_ERR_NON_DIGIT_IN_CONST

non-digit character in a number. +

G_ERR_DIGIT_RADIX

digit beyond radix in a number. +

G_ERR_FLOAT_RADIX

non-decimal floating point number. +

G_ERR_FLOAT_MALFORMED

malformed floating point number. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Limits-of-Basic-Types.html b/docs/reference/glib/html/glib-Limits-of-Basic-Types.html new file mode 100644 index 0000000..9a2cc2c --- /dev/null +++ b/docs/reference/glib/html/glib-Limits-of-Basic-Types.html @@ -0,0 +1,409 @@ + + + + +Limits of Basic Types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Limits of Basic Types

+

Limits of Basic Types — portable method of determining the limits of the standard types

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_MININT
+#define             G_MAXINT
+#define             G_MAXUINT
+
+#define             G_MINSHORT
+#define             G_MAXSHORT
+#define             G_MAXUSHORT
+
+#define             G_MINLONG
+#define             G_MAXLONG
+#define             G_MAXULONG
+
+#define             G_MININT8
+#define             G_MAXINT8
+#define             G_MAXUINT8
+
+#define             G_MININT16
+#define             G_MAXINT16
+#define             G_MAXUINT16
+
+#define             G_MININT32
+#define             G_MAXINT32
+#define             G_MAXUINT32
+
+#define             G_MININT64
+#define             G_MAXINT64
+#define             G_MAXUINT64
+
+#define             G_MAXSIZE
+#define             G_MINSSIZE
+#define             G_MAXSSIZE
+
+#define             G_MINOFFSET
+#define             G_MAXOFFSET
+
+#define             G_MINFLOAT
+#define             G_MAXFLOAT
+
+#define             G_MINDOUBLE
+#define             G_MAXDOUBLE
+
+
+
+

Description

+

+These macros provide a portable method to determine the limits of some of +the standard integer and floating point types. +

+
+
+

Details

+
+

G_MININT

+
#define G_MININT INT_MIN
+
+

+The minimum value which can be held in a gint. +

+
+
+
+

G_MAXINT

+
#define G_MAXINT INT_MAX
+
+

+The maximum value which can be held in a gint. +

+
+
+
+

G_MAXUINT

+
#define G_MAXUINT UINT_MAX
+
+

+The maximum value which can be held in a guint. +

+
+
+
+

G_MINSHORT

+
#define G_MINSHORT SHRT_MIN
+
+

+The minimum value which can be held in a gshort. +

+
+
+
+

G_MAXSHORT

+
#define G_MAXSHORT SHRT_MAX
+
+

+The maximum value which can be held in a gshort. +

+
+
+
+

G_MAXUSHORT

+
#define G_MAXUSHORT USHRT_MAX
+
+

+The maximum value which can be held in a gushort. +

+
+
+
+

G_MINLONG

+
#define G_MINLONG LONG_MIN
+
+

+The minimum value which can be held in a glong. +

+
+
+
+

G_MAXLONG

+
#define G_MAXLONG LONG_MAX
+
+

+The maximum value which can be held in a glong. +

+
+
+
+

G_MAXULONG

+
#define G_MAXULONG ULONG_MAX
+
+

+The maximum value which can be held in a gulong. +

+
+
+
+

G_MININT8

+
#define G_MININT8 ((gint8)  0x80)
+
+

+The minimum value which can be held in a gint8. +

+

Since 2.4

+
+
+
+

G_MAXINT8

+
#define G_MAXINT8 ((gint8)  0x7f)
+
+

+The maximum value which can be held in a gint8. +

+

Since 2.4

+
+
+
+

G_MAXUINT8

+
#define G_MAXUINT8 ((guint8) 0xff)
+
+

+The maximum value which can be held in a guint8. +

+

Since 2.4

+
+
+
+

G_MININT16

+
#define G_MININT16 ((gint16)  0x8000)
+
+

+The minimum value which can be held in a gint16. +

+

Since 2.4

+
+
+
+

G_MAXINT16

+
#define G_MAXINT16 ((gint16)  0x7fff)
+
+

+The maximum value which can be held in a gint16. +

+

Since 2.4

+
+
+
+

G_MAXUINT16

+
#define G_MAXUINT16 ((guint16) 0xffff)
+
+

+The maximum value which can be held in a guint16. +

+

Since 2.4

+
+
+
+

G_MININT32

+
#define G_MININT32 ((gint32)  0x80000000)
+
+

+The minimum value which can be held in a gint32. +

+

Since 2.4

+
+
+
+

G_MAXINT32

+
#define G_MAXINT32 ((gint32)  0x7fffffff)
+
+

+The maximum value which can be held in a gint32. +

+

Since 2.4

+
+
+
+

G_MAXUINT32

+
#define G_MAXUINT32 ((guint32) 0xffffffff)
+
+

+The maximum value which can be held in a guint32. +

+

Since 2.4

+
+
+
+

G_MININT64

+
#define G_MININT64 ((gint64) G_GINT64_CONSTANT(0x8000000000000000))
+
+

+The minimum value which can be held in a gint64. +

+
+
+
+

G_MAXINT64

+
#define G_MAXINT64 G_GINT64_CONSTANT(0x7fffffffffffffff)
+
+

+The maximum value which can be held in a gint64. +

+
+
+
+

G_MAXUINT64

+
#define G_MAXUINT64 G_GINT64_CONSTANT(0xffffffffffffffffU)
+
+

+The maximum value which can be held in a guint64. +

+
+
+
+

G_MAXSIZE

+
#define G_MAXSIZE G_MAXULONG
+
+

+The maximum value which can be held in a gsize. +

+

Since 2.4

+
+
+
+

G_MINSSIZE

+
#define G_MINSSIZE G_MINLONG
+
+

+The minimum value which can be held in a gssize. +

+

Since 2.14

+
+
+
+

G_MAXSSIZE

+
#define G_MAXSSIZE G_MAXLONG
+
+

+The maximum value which can be held in a gssize. +

+

Since 2.14

+
+
+
+

G_MINOFFSET

+
#define G_MINOFFSET G_MININT64
+
+

+The minimum value which can be held in a goffset. +

+
+
+
+

G_MAXOFFSET

+
#define G_MAXOFFSET G_MAXINT64
+
+

+The maximum value which can be held in a goffset. +

+
+
+
+

G_MINFLOAT

+
#define G_MINFLOAT FLT_MIN
+
+

+The minimum positive value which can be held in a gfloat. +

+

+If you are interested in the smallest value which can be held in a gfloat, +use -G_MAX_FLOAT. +

+
+
+
+

G_MAXFLOAT

+
#define G_MAXFLOAT FLT_MAX
+
+

+The maximum value which can be held in a gfloat. +

+
+
+
+

G_MINDOUBLE

+
#define G_MINDOUBLE DBL_MIN
+
+

+The minimum positive value which can be held in a gdouble. +

+

+If you are interested in the smallest value which can be held in a gdouble, +use -G_MAXDOUBLE. +

+
+
+
+

G_MAXDOUBLE

+
#define G_MAXDOUBLE DBL_MAX
+
+

+The maximum value which can be held in a gdouble. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Memory-Allocation.html b/docs/reference/glib/html/glib-Memory-Allocation.html new file mode 100644 index 0000000..4897010 --- /dev/null +++ b/docs/reference/glib/html/glib-Memory-Allocation.html @@ -0,0 +1,1036 @@ + + + + +Memory Allocation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Memory Allocation

+

Memory Allocation — general memory-handling

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             g_new                               (struct_type, n_structs)
+#define             g_new0                              (struct_type, n_structs)
+#define             g_renew                             (struct_type, mem, n_structs)
+#define             g_try_new                           (struct_type, n_structs)
+#define             g_try_new0                          (struct_type, n_structs)
+#define             g_try_renew                         (struct_type, mem, n_structs)
+
+gpointer            g_malloc                            (gsize n_bytes);
+gpointer            g_malloc0                           (gsize n_bytes);
+gpointer            g_realloc                           (gpointer mem,
+                                                         gsize n_bytes);
+gpointer            g_try_malloc                        (gsize n_bytes);
+gpointer            g_try_malloc0                       (gsize n_bytes);
+gpointer            g_try_realloc                       (gpointer mem,
+                                                         gsize n_bytes);
+gpointer            g_malloc_n                          (gsize n_blocks,
+                                                         gsize n_block_bytes);
+gpointer            g_malloc0_n                         (gsize n_blocks,
+                                                         gsize n_block_bytes);
+gpointer            g_realloc_n                         (gpointer mem,
+                                                         gsize n_blocks,
+                                                         gsize n_block_bytes);
+gpointer            g_try_malloc_n                      (gsize n_blocks,
+                                                         gsize n_block_bytes);
+gpointer            g_try_malloc0_n                     (gsize n_blocks,
+                                                         gsize n_block_bytes);
+gpointer            g_try_realloc_n                     (gpointer mem,
+                                                         gsize n_blocks,
+                                                         gsize n_block_bytes);
+
+void                g_free                              (gpointer mem);
+extern              gboolean g_mem_gc_friendly;
+
+#define             g_alloca                            (size)
+#define             g_newa                              (struct_type, n_structs)
+
+#define             g_memmove                           (dest,src,len)
+gpointer            g_memdup                            (gconstpointer mem,
+                                                         guint byte_size);
+
+                    GMemVTable;
+void                g_mem_set_vtable                    (GMemVTable *vtable);
+gboolean            g_mem_is_system_malloc              (void);
+
+extern              GMemVTable	*glib_mem_profiler_table;
+void                g_mem_profile                       (void);
+
+
+
+

Description

+

+These functions provide support for allocating and freeing memory. +

+
+

Note

+

+If any call to allocate memory fails, the application is terminated. +This also means that there is no need to check if the call succeeded. +

+
+
+

Note

+

+It's important to match g_malloc() with g_free(), plain malloc() with free(), +and (if you're using C++) new with delete and new[] with delete[]. Otherwise +bad things can happen, since these allocators may use different memory +pools (and new/delete call constructors and destructors). See also +g_mem_set_vtable(). +

+
+
+
+

Details

+
+

g_new()

+
#define             g_new(struct_type, n_structs)
+

+Allocates n_structs elements of type struct_type. +The returned pointer is cast to a pointer to the given type. +If n_structs is 0 it returns NULL. +Care is taken to avoid overflow when calculating the size of the allocated block. +

+

+Since the returned pointer is already casted to the right type, +it is normally unnecessary to cast it explicitly, and doing +so might hide memory allocation errors. +

+
++ + + + + + + + + + + + + + +

struct_type :

the type of the elements to allocate +

n_structs :

the number of elements to allocate +

Returns :

a pointer to the allocated memory, cast to a pointer to struct_type +
+
+
+
+

g_new0()

+
#define             g_new0(struct_type, n_structs)
+

+Allocates n_structs elements of type struct_type, initialized to 0's. +The returned pointer is cast to a pointer to the given type. +If n_structs is 0 it returns NULL. +Care is taken to avoid overflow when calculating the size of the allocated block. +

+

+Since the returned pointer is already casted to the right type, +it is normally unnecessary to cast it explicitly, and doing +so might hide memory allocation errors. +

+
++ + + + + + + + + + + + + + +

struct_type :

the type of the elements to allocate. +

n_structs :

the number of elements to allocate. +

Returns :

a pointer to the allocated memory, cast to a pointer to struct_type. +
+
+
+
+

g_renew()

+
#define             g_renew(struct_type, mem, n_structs)
+

+Reallocates the memory pointed to by mem, so that it now has space for +n_structs elements of type struct_type. It returns the new address of +the memory, which may have been moved. +Care is taken to avoid overflow when calculating the size of the allocated block. +

+
++ + + + + + + + + + + + + + + + + + +

struct_type :

the type of the elements to allocate +

mem :

the currently allocated memory +

n_structs :

the number of elements to allocate +

Returns :

a pointer to the new allocated memory, cast to a pointer to struct_type +
+
+
+
+

g_try_new()

+
#define             g_try_new(struct_type, n_structs)
+

+Attempts to allocate n_structs elements of type struct_type, and returns +NULL on failure. Contrast with g_new(), which aborts the program on failure. +The returned pointer is cast to a pointer to the given type. +The function returns NULL when n_structs is 0 of if an overflow occurs. +

+
++ + + + + + + + + + + + + + +

struct_type :

the type of the elements to allocate +

n_structs :

the number of elements to allocate +

Returns :

a pointer to the allocated memory, cast to a pointer to struct_type +
+

Since 2.8

+
+
+
+

g_try_new0()

+
#define             g_try_new0(struct_type, n_structs)
+

+Attempts to allocate n_structs elements of type struct_type, initialized +to 0's, and returns NULL on failure. Contrast with g_new0(), which aborts +the program on failure. +The returned pointer is cast to a pointer to the given type. +The function returns NULL when n_structs is 0 of if an overflow occurs. +

+
++ + + + + + + + + + + + + + +

struct_type :

the type of the elements to allocate +

n_structs :

the number of elements to allocate +

Returns :

a pointer to the allocated memory, cast to a pointer to struct_type +
+

Since 2.8

+
+
+
+

g_try_renew()

+
#define             g_try_renew(struct_type, mem, n_structs)
+

+Attempts to reallocate the memory pointed to by mem, so that it now has +space for n_structs elements of type struct_type, and returns NULL on +failure. Contrast with g_renew(), which aborts the program on failure. +It returns the new address of the memory, which may have been moved. +The function returns NULL if an overflow occurs. +

+
++ + + + + + + + + + + + + + + + + + +

struct_type :

the type of the elements to allocate +

mem :

the currently allocated memory +

n_structs :

the number of elements to allocate +

Returns :

a pointer to the new allocated memory, cast to a pointer to struct_type +
+

Since 2.8

+
+
+
+

g_malloc ()

+
gpointer            g_malloc                            (gsize n_bytes);
+

+Allocates n_bytes bytes of memory. +If n_bytes is 0 it returns NULL. +

+
++ + + + + + + + + + +

n_bytes :

the number of bytes to allocate +

Returns :

a pointer to the allocated memory +
+
+
+
+

g_malloc0 ()

+
gpointer            g_malloc0                           (gsize n_bytes);
+

+Allocates n_bytes bytes of memory, initialized to 0's. +If n_bytes is 0 it returns NULL. +

+
++ + + + + + + + + + +

n_bytes :

the number of bytes to allocate +

Returns :

a pointer to the allocated memory +
+
+
+
+

g_realloc ()

+
gpointer            g_realloc                           (gpointer mem,
+                                                         gsize n_bytes);
+

+Reallocates the memory pointed to by mem, so that it now has space for +n_bytes bytes of memory. It returns the new address of the memory, which may +have been moved. mem may be NULL, in which case it's considered to +have zero-length. n_bytes may be 0, in which case NULL will be returned +and mem will be freed unless it is NULL. +

+
++ + + + + + + + + + + + + + +

mem :

the memory to reallocate +

n_bytes :

new size of the memory in bytes +

Returns :

the new address of the allocated memory +
+
+
+
+

g_try_malloc ()

+
gpointer            g_try_malloc                        (gsize n_bytes);
+

+Attempts to allocate n_bytes, and returns NULL on failure. +Contrast with g_malloc(), which aborts the program on failure. +

+
++ + + + + + + + + + +

n_bytes :

number of bytes to allocate. +

Returns :

the allocated memory, or NULL. +
+
+
+
+

g_try_malloc0 ()

+
gpointer            g_try_malloc0                       (gsize n_bytes);
+

+Attempts to allocate n_bytes, initialized to 0's, and returns NULL on +failure. Contrast with g_malloc0(), which aborts the program on failure. +

+
++ + + + + + + + + + +

n_bytes :

number of bytes to allocate +

Returns :

the allocated memory, or NULL +
+

Since 2.8

+
+
+
+

g_try_realloc ()

+
gpointer            g_try_realloc                       (gpointer mem,
+                                                         gsize n_bytes);
+

+Attempts to realloc mem to a new size, n_bytes, and returns NULL +on failure. Contrast with g_realloc(), which aborts the program +on failure. If mem is NULL, behaves the same as g_try_malloc(). +

+
++ + + + + + + + + + + + + + +

mem :

previously-allocated memory, or NULL. +

n_bytes :

number of bytes to allocate. +

Returns :

the allocated memory, or NULL. +
+
+
+
+

g_malloc_n ()

+
gpointer            g_malloc_n                          (gsize n_blocks,
+                                                         gsize n_block_bytes);
+

+This function is similar to g_malloc(), allocating (n_blocks * n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. +

+
++ + + + + + + + + + + + + + +

n_blocks :

the number of blocks to allocate +

n_block_bytes :

the size of each block in bytes +

Returns :

a pointer to the allocated memory +
+

Since 2.24

+
+
+
+

g_malloc0_n ()

+
gpointer            g_malloc0_n                         (gsize n_blocks,
+                                                         gsize n_block_bytes);
+

+This function is similar to g_malloc0(), allocating (n_blocks * n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. +

+
++ + + + + + + + + + + + + + +

n_blocks :

the number of blocks to allocate +

n_block_bytes :

the size of each block in bytes +

Returns :

a pointer to the allocated memory +
+

Since 2.24

+
+
+
+

g_realloc_n ()

+
gpointer            g_realloc_n                         (gpointer mem,
+                                                         gsize n_blocks,
+                                                         gsize n_block_bytes);
+

+This function is similar to g_realloc(), allocating (n_blocks * n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. +

+
++ + + + + + + + + + + + + + + + + + +

mem :

the memory to reallocate +

n_blocks :

the number of blocks to allocate +

n_block_bytes :

the size of each block in bytes +

Returns :

the new address of the allocated memory +
+

Since 2.24

+
+
+
+

g_try_malloc_n ()

+
gpointer            g_try_malloc_n                      (gsize n_blocks,
+                                                         gsize n_block_bytes);
+

+This function is similar to g_try_malloc(), allocating (n_blocks * n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. +

+
++ + + + + + + + + + + + + + +

n_blocks :

the number of blocks to allocate +

n_block_bytes :

the size of each block in bytes +

Returns :

the allocated memory, or NULL. +
+

Since 2.24

+
+
+
+

g_try_malloc0_n ()

+
gpointer            g_try_malloc0_n                     (gsize n_blocks,
+                                                         gsize n_block_bytes);
+

+This function is similar to g_try_malloc0(), allocating (n_blocks * n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. +

+
++ + + + + + + + + + + + + + +

n_blocks :

the number of blocks to allocate +

n_block_bytes :

the size of each block in bytes +

Returns :

the allocated memory, or NULL +
+

Since 2.24

+
+
+
+

g_try_realloc_n ()

+
gpointer            g_try_realloc_n                     (gpointer mem,
+                                                         gsize n_blocks,
+                                                         gsize n_block_bytes);
+

+This function is similar to g_try_realloc(), allocating (n_blocks * n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. +

+
++ + + + + + + + + + + + + + + + + + +

mem :

previously-allocated memory, or NULL. +

n_blocks :

the number of blocks to allocate +

n_block_bytes :

the size of each block in bytes +

Returns :

the allocated memory, or NULL. +
+

Since 2.24

+
+
+
+

g_free ()

+
void                g_free                              (gpointer mem);
+

+Frees the memory pointed to by mem. +If mem is NULL it simply returns. +

+
++ + + + +

mem :

the memory to free +
+
+
+
+

g_mem_gc_friendly

+
extern gboolean g_mem_gc_friendly;
+
+

+This variable is TRUE if the G_DEBUG environment variable +includes the key gc-friendly. +

+
+
+
+

g_alloca()

+
#define             g_alloca(size)
+

+Allocates size bytes on the stack; these bytes will be freed when the current +stack frame is cleaned up. This macro essentially just wraps the alloca() +function present on most UNIX variants. +Thus it provides the same advantages and pitfalls as alloca(): +

+
++ + + + + + + + + + + + + + + + + + + + + + +

+ + alloca() is very fast, as on most systems it's implemented by just adjusting + the stack pointer register. +

+ + It doesn't cause any memory fragmentation, within its scope, separate alloca() + blocks just build up and are released together at function end. +

+ - Allocation sizes have to fit into the current stack frame. For instance in a + threaded environment on Linux, the per-thread stack size is limited to 2 Megabytes, + so be sparse with alloca() uses. +

+ - Allocation failure due to insufficient stack space is not indicated with a NULL + return like e.g. with malloc(). Instead, most systems probably handle it the same + way as out of stack space situations from infinite function recursion, i.e. + with a segmentation fault. +

+ - Special care has to be taken when mixing alloca() with GNU C variable sized arrays. + Stack space allocated with alloca() in the same scope as a variable sized array + will be freed together with the variable sized array upon exit of that scope, and + not upon exit of the enclosing function scope. +

+

+

+
++ + + + + + + + + + +

size :

number of bytes to allocate. +

Returns :

space for size bytes, allocated on the stack +
+
+
+
+

g_newa()

+
#define             g_newa(struct_type, n_structs)
+

+Wraps g_alloca() in a more typesafe manner. +

+
++ + + + + + + + + + + + + + +

struct_type :

Type of memory chunks to be allocated +

n_structs :

Number of chunks to be allocated +

Returns :

Pointer to stack space for n_structs chunks of type struct_type +
+
+
+
+

g_memmove()

+
#define             g_memmove(dest,src,len)
+

+Copies a block of memory len bytes long, from src to dest. +The source and destination areas may overlap. +

+

+In order to use this function, you must include +string.h yourself, because this macro will +typically simply resolve to memmove() and GLib does not include +string.h for you.

+
++ + + + + + + + + + + + + + +

dest :

the destination address to copy the bytes to. +

src :

the source address to copy the bytes from. +

len :

the number of bytes to copy. +
+
+
+
+

g_memdup ()

+
gpointer            g_memdup                            (gconstpointer mem,
+                                                         guint byte_size);
+

+Allocates byte_size bytes of memory, and copies byte_size bytes into it +from mem. If mem is NULL it returns NULL. +

+
++ + + + + + + + + + + + + + +

mem :

the memory to copy. +

byte_size :

the number of bytes to copy. +

Returns :

a pointer to the newly-allocated copy of the memory, or NULL if mem +is NULL. +
+
+
+
+

GMemVTable

+
typedef struct {
+  gpointer (*malloc)      (gsize    n_bytes);
+  gpointer (*realloc)     (gpointer mem,
+			   gsize    n_bytes);
+  void     (*free)        (gpointer mem);
+  /* optional; set to NULL if not used ! */
+  gpointer (*calloc)      (gsize    n_blocks,
+			   gsize    n_block_bytes);
+  gpointer (*try_malloc)  (gsize    n_bytes);
+  gpointer (*try_realloc) (gpointer mem,
+			   gsize    n_bytes);
+} GMemVTable;
+
+

+A set of functions used to perform memory allocation. The same GMemVTable must +be used for all allocations in the same program; a call to g_mem_set_vtable(), +if it exists, should be prior to any use of GLib. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

malloc ()

function to use for allocating memory. +

realloc ()

function to use for reallocating memory. +

free ()

function to use to free memory. +

calloc ()

function to use for allocating zero-filled memory. +

try_malloc ()

function to use for allocating memory without a default error handler. +

try_realloc ()

function to use for reallocating memory without a default error handler. +
+
+
+
+

g_mem_set_vtable ()

+
void                g_mem_set_vtable                    (GMemVTable *vtable);
+

+Sets the GMemVTable to use for memory allocation. You can use this to provide +custom memory allocation routines. This function must be called +before using any other GLib functions. The vtable only needs to +provide malloc(), realloc(), and free() functions; GLib can provide default +implementations of the others. The malloc() and realloc() implementations +should return NULL on failure, GLib will handle error-checking for you. +vtable is copied, so need not persist after this function has been called. +

+
++ + + + +

vtable :

table of memory allocation routines. +
+
+
+
+

g_mem_is_system_malloc ()

+
gboolean            g_mem_is_system_malloc              (void);
+

+Checks whether the allocator used by g_malloc() is the system's +malloc implementation. If it returns TRUE memory allocated with +malloc() can be used interchangeable with memory allocated using g_malloc(). +This function is useful for avoiding an extra copy of allocated memory returned +by a non-GLib-based API. +

+

+A different allocator can be set using g_mem_set_vtable().

+
++ + + + +

Returns :

if TRUE, malloc() and g_malloc() can be mixed. +
+
+
+
+

glib_mem_profiler_table

+
extern GMemVTable *glib_mem_profiler_table;
+
+

+A GMemVTable containing profiling variants of the memory +allocation functions. Use them together with g_mem_profile() +in order to get information about the memory allocation pattern +of your program. +

+
+
+
+

g_mem_profile ()

+
void                g_mem_profile                       (void);
+

+Outputs a summary of memory usage. +

+

+It outputs the frequency of allocations of different sizes, +the total number of bytes which have been allocated, +the total number of bytes which have been freed, +and the difference between the previous two values, i.e. the number of bytes +still in use. +

+

+Note that this function will not output anything unless you have +previously installed the glib_mem_profiler_table with g_mem_set_vtable(). +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Memory-Allocators.html b/docs/reference/glib/html/glib-Memory-Allocators.html new file mode 100644 index 0000000..cb0863c --- /dev/null +++ b/docs/reference/glib/html/glib-Memory-Allocators.html @@ -0,0 +1,157 @@ + + + + +Memory Allocators + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Memory Allocators

+

Memory Allocators — deprecated way to allocate chunks of memory for + GList, GSList and GNode

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GAllocator;
+GAllocator*         g_allocator_new                     (const gchar *name,
+                                                         guint n_preallocs);
+void                g_allocator_free                    (GAllocator *allocator);
+
+
+
+

Description

+

+Prior to 2.10, GAllocator was used as an efficient way to allocate +small pieces of memory for use with the GList, GSList and GNode +data structures. Since 2.10, it has been completely replaced by the +slice allocator and +deprecated.

+
+
+

Details

+
+

GAllocator

+
typedef struct _GAllocator GAllocator;
+
+

Warning

+

GAllocator is deprecated and should not be used in newly-written code.

+
+

+The GAllocator struct contains private data. and should only be +accessed using the following functions.

+
+
+
+

g_allocator_new ()

+
GAllocator*         g_allocator_new                     (const gchar *name,
+                                                         guint n_preallocs);
+
+

Warning

+

g_allocator_new has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Creates a new GAllocator.

+
++ + + + + + + + + + + + + + +

name :

the name of the GAllocator. This name is used to set the + name of the GMemChunk used by the GAllocator, and is only + used for debugging. +

n_preallocs :

the number of elements in each block of memory + allocated. Larger blocks mean less calls to + g_malloc(), but some memory may be wasted. (GLib uses + 128 elements per block by default.) The value must be + between 1 and 65535. +

Returns :

a new GAllocator. +
+
+
+
+

g_allocator_free ()

+
void                g_allocator_free                    (GAllocator *allocator);
+
+

Warning

+

g_allocator_free has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Frees all of the memory allocated by the GAllocator.

+
++ + + + +

allocator :

a GAllocator. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Memory-Chunks.html b/docs/reference/glib/html/glib-Memory-Chunks.html new file mode 100644 index 0000000..c54a9b1 --- /dev/null +++ b/docs/reference/glib/html/glib-Memory-Chunks.html @@ -0,0 +1,646 @@ + + + + +Memory Chunks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Memory Chunks

+

Memory Chunks — deprecated way to allocate groups of equal-sized + chunks of memory

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GMemChunk;
+#define             G_ALLOC_AND_FREE
+#define             G_ALLOC_ONLY
+
+GMemChunk*          g_mem_chunk_new                     (const gchar *name,
+                                                         gint atom_size,
+                                                         gsize area_size,
+                                                         gint type);
+gpointer            g_mem_chunk_alloc                   (GMemChunk *mem_chunk);
+gpointer            g_mem_chunk_alloc0                  (GMemChunk *mem_chunk);
+void                g_mem_chunk_free                    (GMemChunk *mem_chunk,
+                                                         gpointer mem);
+void                g_mem_chunk_destroy                 (GMemChunk *mem_chunk);
+
+#define             g_mem_chunk_create                  (type, pre_alloc, alloc_type)
+#define             g_chunk_new                         (type, chunk)
+#define             g_chunk_new0                        (type, chunk)
+#define             g_chunk_free                        (mem, mem_chunk)
+
+void                g_mem_chunk_reset                   (GMemChunk *mem_chunk);
+void                g_mem_chunk_clean                   (GMemChunk *mem_chunk);
+void                g_blow_chunks                       (void);
+
+void                g_mem_chunk_info                    (void);
+void                g_mem_chunk_print                   (GMemChunk *mem_chunk);
+
+
+
+

Description

+

+Memory chunks provide an space-efficient way to allocate equal-sized +pieces of memory, called atoms. However, due to the administrative +overhead (in particular for G_ALLOC_AND_FREE, and when used from +multiple threads), they are in practise often slower than direct use +of g_malloc(). Therefore, memory chunks have been deprecated in +favor of the slice +allocator, which has been added in 2.10. All internal uses of +memory chunks in GLib have been converted to the +g_slice API. +

+

+There are two types of memory chunks, G_ALLOC_ONLY, and +G_ALLOC_AND_FREE.

+
    +
  • G_ALLOC_ONLY +chunks only allow allocation of atoms. The atoms can never be freed +individually. The memory chunk can only be free in its entirety. +

  • +
  • G_ALLOC_AND_FREE chunks do +allow atoms to be freed individually. The disadvantage of this is +that the memory chunk has to keep track of which atoms have been +freed. This results in more memory being used and a slight +degradation in performance.

  • +
+

+

+

+To create a memory chunk use g_mem_chunk_new() or the convenience +macro g_mem_chunk_create(). +

+

+To allocate a new atom use g_mem_chunk_alloc(), +g_mem_chunk_alloc0(), or the convenience macros g_chunk_new() or +g_chunk_new0(). +

+

+To free an atom use g_mem_chunk_free(), or the convenience macro +g_chunk_free(). (Atoms can only be freed if the memory chunk is +created with the type set to G_ALLOC_AND_FREE.) +

+

+To free any blocks of memory which are no longer being used, use +g_mem_chunk_clean(). To clean all memory chunks, use g_blow_chunks(). +

+

+To reset the memory chunk, freeing all of the atoms, use +g_mem_chunk_reset(). +

+

+To destroy a memory chunk, use g_mem_chunk_destroy(). +

+

+To help debug memory chunks, use g_mem_chunk_info() and +g_mem_chunk_print(). +

+

+

+
+

Example 17. Using a GMemChunk

+
+  GMemChunk *mem_chunk;
+  gchar *mem[10000];
+  gint i;
+
+  /* Create a GMemChunk with atoms 50 bytes long, and memory
+     blocks holding 100 bytes. Note that this means that only 2 atoms
+     fit into each memory block and so isn't very efficient. */
+  mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE);
+  /* Now allocate 10000 atoms. */
+  for (i = 0; i < 10000; i++)
+    {
+      mem[i] = g_chunk_new (gchar, mem_chunk);
+      /* Fill in the atom memory with some junk. */
+      for (j = 0; j < 50; j++)
+        mem[i][j] = i * j;
+    }
+  /* Now free all of the atoms. Note that since we are going to
+     destroy the GMemChunk, this wouldn't normally be used. */
+  for (i = 0; i < 10000; i++)
+    {
+      g_mem_chunk_free (mem_chunk, mem[i]);
+    }
+  /* We are finished with the GMemChunk, so we destroy it. */
+  g_mem_chunk_destroy (mem_chunk);
+ 
+
+


+

+

+

+
+

Example 18. Using a GMemChunk with data structures

+
+   GMemChunk *array_mem_chunk;
+   GRealArray *array;
+   /* Create a GMemChunk to hold GRealArray structures, using
+      the g_mem_chunk_create() convenience macro. We want 1024 atoms in each
+      memory block, and we want to be able to free individual atoms. */
+   array_mem_chunk = g_mem_chunk_create (GRealArray, 1024, G_ALLOC_AND_FREE);
+   /* Allocate one atom, using the g_chunk_new() convenience macro. */
+   array = g_chunk_new (GRealArray, array_mem_chunk);
+   /* We can now use array just like a normal pointer to a structure. */
+   array->data            = NULL;
+   array->len             = 0;
+   array->alloc           = 0;
+   array->zero_terminated = (zero_terminated ? 1 : 0);
+   array->clear           = (clear ? 1 : 0);
+   array->elt_size        = elt_size;
+   /* We can free the element, so it can be reused. */
+   g_chunk_free (array, array_mem_chunk);
+   /* We destroy the GMemChunk when we are finished with it. */
+   g_mem_chunk_destroy (array_mem_chunk);
+ 
+
+


+
+
+

Details

+
+

GMemChunk

+
typedef struct _GMemChunk GMemChunk;
+
+

Warning

+

GMemChunk is deprecated and should not be used in newly-written code.

+
+

+The GMemChunk struct is an opaque data structure representing a +memory chunk. It should be accessed only through the use of the +following functions.

+
+
+
+

G_ALLOC_AND_FREE

+
#define G_ALLOC_AND_FREE  2
+
+
+

Warning

+

G_ALLOC_AND_FREE is deprecated and should not be used in newly-written code.

+
+

+Specifies the type of a GMemChunk. Used in g_mem_chunk_new() and +g_mem_chunk_create() to specify that atoms will be freed +individually.

+
+
+
+

G_ALLOC_ONLY

+
#define G_ALLOC_ONLY	  1
+
+
+

Warning

+

G_ALLOC_ONLY is deprecated and should not be used in newly-written code.

+
+

+Specifies the type of a GMemChunk. Used in g_mem_chunk_new() and +g_mem_chunk_create() to specify that atoms will never be freed +individually.

+
+
+
+

g_mem_chunk_new ()

+
GMemChunk*          g_mem_chunk_new                     (const gchar *name,
+                                                         gint atom_size,
+                                                         gsize area_size,
+                                                         gint type);
+
+

Warning

+

g_mem_chunk_new has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Creates a new GMemChunk.

+
++ + + + + + + + + + + + + + + + + + + + + + +

name :

a string to identify the GMemChunk. It is not copied so it + should be valid for the lifetime of the GMemChunk. It is + only used in g_mem_chunk_print(), which is used for debugging. +

atom_size :

the size, in bytes, of each element in the GMemChunk. +

area_size :

the size, in bytes, of each block of memory allocated to + contain the atoms. +

type :

the type of the GMemChunk. G_ALLOC_AND_FREE is used if the + atoms will be freed individually. G_ALLOC_ONLY should be + used if atoms will never be freed individually. + G_ALLOC_ONLY is quicker, since it does not need to track + free atoms, but it obviously wastes memory if you no longer + need many of the atoms. +

Returns :

the new GMemChunk. +
+
+
+
+

g_mem_chunk_alloc ()

+
gpointer            g_mem_chunk_alloc                   (GMemChunk *mem_chunk);
+
+

Warning

+

g_mem_chunk_alloc has been deprecated since version 2.10 and should not be used in newly-written code. Use g_slice_alloc() instead

+
+

+Allocates an atom of memory from a GMemChunk.

+
++ + + + + + + + + + +

mem_chunk :

a GMemChunk. +

Returns :

a pointer to the allocated atom. +
+
+
+
+

g_mem_chunk_alloc0 ()

+
gpointer            g_mem_chunk_alloc0                  (GMemChunk *mem_chunk);
+
+

Warning

+

g_mem_chunk_alloc0 has been deprecated since version 2.10 and should not be used in newly-written code. Use g_slice_alloc0() instead

+
+

+Allocates an atom of memory from a GMemChunk, setting the memory to +0.

+
++ + + + + + + + + + +

mem_chunk :

a GMemChunk. +

Returns :

a pointer to the allocated atom. +
+
+
+
+

g_mem_chunk_free ()

+
void                g_mem_chunk_free                    (GMemChunk *mem_chunk,
+                                                         gpointer mem);
+
+

Warning

+

g_mem_chunk_free has been deprecated since version 2.10 and should not be used in newly-written code. Use g_slice_free1() instead

+
+

+Frees an atom in a GMemChunk. This should only be called if the +GMemChunk was created with G_ALLOC_AND_FREE. Otherwise it will +simply return.

+
++ + + + + + + + + + +

mem_chunk :

a GMemChunk. +

mem :

a pointer to the atom to free. +
+
+
+
+

g_mem_chunk_destroy ()

+
void                g_mem_chunk_destroy                 (GMemChunk *mem_chunk);
+
+

Warning

+

g_mem_chunk_destroy has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Frees all of the memory allocated for a GMemChunk.

+
++ + + + +

mem_chunk :

a GMemChunk. +
+
+
+
+

g_mem_chunk_create()

+
#define             g_mem_chunk_create(type, pre_alloc, alloc_type)
+
+

Warning

+

g_mem_chunk_create has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+A convenience macro for creating a new GMemChunk. It calls +g_mem_chunk_new(), using the given type to create the GMemChunk +name. The atom size is determined using +sizeof(), and the area size is calculated by +multiplying the pre_alloc parameter with the atom size.

+
++ + + + + + + + + + + + + + + + + + +

type :

the type of the atoms, typically a structure name. +

pre_alloc :

the number of atoms to store in each block of memory. +

alloc_type :

the type of the GMemChunk. G_ALLOC_AND_FREE is used + if the atoms will be freed individually. G_ALLOC_ONLY + should be used if atoms will never be freed + individually. G_ALLOC_ONLY is quicker, since it does + not need to track free atoms, but it obviously wastes + memory if you no longer need many of the atoms. +

Returns :

the new GMemChunk. +
+
+
+
+

g_chunk_new()

+
#define             g_chunk_new(type, chunk)
+
+

Warning

+

g_chunk_new has been deprecated since version 2.10 and should not be used in newly-written code. Use g_slice_new() instead

+
+

+A convenience macro to allocate an atom of memory from a GMemChunk. +It calls g_mem_chunk_alloc() and casts the returned atom to a +pointer to the given type, avoiding a type cast in the source code.

+
++ + + + + + + + + + + + + + +

type :

the type of the GMemChunk atoms, typically a structure name. +

chunk :

a GMemChunk. +

Returns :

a pointer to the allocated atom, cast to a pointer to + type. +
+
+
+
+

g_chunk_new0()

+
#define             g_chunk_new0(type, chunk)
+
+

Warning

+

g_chunk_new0 has been deprecated since version 2.10 and should not be used in newly-written code. Use g_slice_new0() instead

+
+

+A convenience macro to allocate an atom of memory from a GMemChunk. +It calls g_mem_chunk_alloc0() and casts the returned atom to a +pointer to the given type, avoiding a type cast in the source code.

+
++ + + + + + + + + + + + + + +

type :

the type of the GMemChunk atoms, typically a structure name. +

chunk :

a GMemChunk. +

Returns :

a pointer to the allocated atom, cast to a pointer to + type. +
+
+
+
+

g_chunk_free()

+
#define             g_chunk_free(mem, mem_chunk)
+
+

Warning

+

g_chunk_free has been deprecated since version 2.10 and should not be used in newly-written code. Use g_slice_free() instead

+
+

+A convenience macro to free an atom of memory from a GMemChunk. It +simply switches the arguments and calls g_mem_chunk_free() It is +included simply to complement the other convenience macros, +g_chunk_new() and g_chunk_new0().

+
++ + + + + + + + + + +

mem :

a pointer to the atom to be freed. +

mem_chunk :

a GMemChunk. +
+
+
+
+

g_mem_chunk_reset ()

+
void                g_mem_chunk_reset                   (GMemChunk *mem_chunk);
+
+

Warning

+

g_mem_chunk_reset has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Resets a GMemChunk to its initial state. It frees all of the +currently allocated blocks of memory.

+
++ + + + +

mem_chunk :

a GMemChunk. +
+
+
+
+

g_mem_chunk_clean ()

+
void                g_mem_chunk_clean                   (GMemChunk *mem_chunk);
+
+

Warning

+

g_mem_chunk_clean has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Frees any blocks in a GMemChunk which are no longer being used.

+
++ + + + +

mem_chunk :

a GMemChunk. +
+
+
+
+

g_blow_chunks ()

+
void                g_blow_chunks                       (void);
+
+

Warning

+

g_blow_chunks has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Calls g_mem_chunk_clean() on all GMemChunk objects.

+
+
+
+

g_mem_chunk_info ()

+
void                g_mem_chunk_info                    (void);
+
+

Warning

+

g_mem_chunk_info has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Outputs debugging information for all GMemChunk objects currently +in use. It outputs the number of GMemChunk objects currently +allocated, and calls g_mem_chunk_print() to output information on +each one.

+
+
+
+

g_mem_chunk_print ()

+
void                g_mem_chunk_print                   (GMemChunk *mem_chunk);
+
+

Warning

+

g_mem_chunk_print has been deprecated since version 2.10 and should not be used in newly-written code. Use the slice + allocator instead

+
+

+Outputs debugging information for a GMemChunk. It outputs the name +of the GMemChunk (set with g_mem_chunk_new()), the number of bytes +used, and the number of blocks of memory allocated.

+
++ + + + +

mem_chunk :

a GMemChunk. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Memory-Slices.html b/docs/reference/glib/html/glib-Memory-Slices.html new file mode 100644 index 0000000..331e314 --- /dev/null +++ b/docs/reference/glib/html/glib-Memory-Slices.html @@ -0,0 +1,485 @@ + + + + +Memory Slices + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Memory Slices

+

Memory Slices — efficient way to allocate groups of equal-sized chunks of memory

+
+
+

Synopsis

+
+#include <glib.h>
+
+gpointer            g_slice_alloc                       (gsize block_size);
+gpointer            g_slice_alloc0                      (gsize block_size);
+gpointer            g_slice_copy                        (gsize block_size,
+                                                         gconstpointer mem_block);
+void                g_slice_free1                       (gsize block_size,
+                                                         gpointer mem_block);
+void                g_slice_free_chain_with_offset      (gsize block_size,
+                                                         gpointer mem_chain,
+                                                         gsize next_offset);
+
+#define             g_slice_new                         (type)
+#define             g_slice_new0                        (type)
+#define             g_slice_dup                         (type, mem)
+#define             g_slice_free                        (type, mem)
+#define             g_slice_free_chain                  (type, mem_chain, next)
+
+
+
+

Description

+

+Memory slices provide a space-efficient and multi-processing scalable +way to allocate equal-sized pieces of memory, just like the original +GMemChunks (from GLib <= 2.8), while avoiding their excessive +memory-waste, scalability and performance problems. +

+

+To achieve these goals, the slice allocator uses a sophisticated, +layered design that has been inspired by Bonwick's slab allocator +[6]. +It uses posix_memalign() to optimize allocations of many equally-sized +chunks, and has per-thread free lists (the so-called magazine layer) +to quickly satisfy allocation requests of already known structure sizes. +This is accompanied by extra caching logic to keep freed memory around +for some time before returning it to the system. Memory that is unused +due to alignment constraints is used for cache colorization (random +distribution of chunk addresses) to improve CPU cache utilization. The +caching layer of the slice allocator adapts itself to high lock contention +to improve scalability. +

+

+The slice allocator can allocate blocks as small as two pointers, and +unlike malloc(), it does not reserve extra space per block. For large block +sizes, g_slice_new() and g_slice_alloc() will automatically delegate to the +system malloc() implementation. For newly written code it is recommended +to use the new g_slice API instead of g_malloc() and +friends, as long as objects are not resized during their lifetime and the +object size used at allocation time is still available when freeing. +

+
+

Example 15. Using the slice allocator

+
+  gchar *mem[10000];
+  gint i;
+  /* Allocate 10000 blocks. */
+  for (i = 0; i < 10000; i++)
+    {
+      mem[i] = g_slice_alloc (50);
+      /* Fill in the memory with some junk. */
+      for (j = 0; j < 50; j++)
+	mem[i][j] = i * j;
+    }
+  /* Now free all of the blocks. */
+  for (i = 0; i < 10000; i++)
+    {
+      g_slice_free1 (50, mem[i]);
+    }
+
+
+
+

Example 16. Using the slice allocator with data structures

+
+  GRealArray *array;
+  /* Allocate one block, using the g_slice_new() macro. */
+  array = g_slice_new (GRealArray);
+  /* We can now use array just like a normal pointer to a structure. */
+  array->data            = NULL;
+  array->len             = 0;
+  array->alloc           = 0;
+  array->zero_terminated = (zero_terminated ? 1 : 0);
+  array->clear           = (clear ? 1 : 0);
+  array->elt_size        = elt_size;
+  /* We can free the block, so it can be reused. */
+  g_slice_free (GRealArray, array);
+
+
+
+
+
+

Details

+
+

g_slice_alloc ()

+
gpointer            g_slice_alloc                       (gsize block_size);
+

+Allocates a block of memory from the slice allocator. +The block adress handed out can be expected to be aligned +to at least 1 * sizeof (void*), +though in general slices are 2 * sizeof (void*) bytes aligned, +if a malloc() fallback implementation is used instead, +the alignment may be reduced in a libc dependent fashion. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. +

+
++ + + + + + + + + + +

block_size :

the number of bytes to allocate +

Returns :

a pointer to the allocated memory block +
+

Since 2.10

+
+
+
+

g_slice_alloc0 ()

+
gpointer            g_slice_alloc0                      (gsize block_size);
+

+Allocates a block of memory via g_slice_alloc() +and initialize the returned memory to 0. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. +

+
++ + + + + + + + + + +

block_size :

the number of bytes to allocate +

Returns :

a pointer to the allocated block +
+

Since 2.10

+
+
+
+

g_slice_copy ()

+
gpointer            g_slice_copy                        (gsize block_size,
+                                                         gconstpointer mem_block);
+

+Allocates a block of memory from the slice allocator and copies +block_size bytes into it from mem_block. +

+
++ + + + + + + + + + + + + + +

block_size :

the number of bytes to allocate +

mem_block :

the memory to copy +

Returns :

a pointer to the allocated memory block +
+

Since 2.14

+
+
+
+

g_slice_free1 ()

+
void                g_slice_free1                       (gsize block_size,
+                                                         gpointer mem_block);
+

+Frees a block of memory. The memory must have been allocated via +g_slice_alloc() or g_slice_alloc0() +and the block_size has to match the size specified upon allocation. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. +

+
++ + + + + + + + + + +

block_size :

the size of the block +

mem_block :

a pointer to the block to free +
+

Since 2.10

+
+
+
+

g_slice_free_chain_with_offset ()

+
void                g_slice_free_chain_with_offset      (gsize block_size,
+                                                         gpointer mem_chain,
+                                                         gsize next_offset);
+

+Frees a linked list of memory blocks of structure type type. +The memory blocks must be equal-sized, allocated via +g_slice_alloc() or g_slice_alloc0() +and linked together by a next pointer (similar to GSList). The offset +of the next field in each block is passed as third argument. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. +

+
++ + + + + + + + + + + + + + +

block_size :

the size of the blocks +

mem_chain :

a pointer to the first block of the chain +

next_offset :

the offset of the next field in the blocks +
+

Since 2.10

+
+
+
+

g_slice_new()

+
#define             g_slice_new(type)
+

+A convenience macro to allocate a block of memory from the slice allocator. +It calls g_slice_alloc() with sizeof (type) and casts +the returned pointer to a pointer of the given type, avoiding a type cast +in the source code. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. +

+
++ + + + + + + + + + +

type :

the type to allocate, typically a structure name +

Returns :

a pointer to the allocated block, cast to a pointer to type. +
+

Since 2.10

+
+
+
+

g_slice_new0()

+
#define             g_slice_new0(type)
+

+A convenience macro to allocate a block of memory from the slice allocator +and set the memory to 0. It calls g_slice_alloc0() with +sizeof (type) and casts the returned pointer to a pointer +of the given type, avoiding a type cast in the source code. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. +

+
++ + + + + + + + + + +

type :

the type to allocate, typically a structure name +

Returns :

a pointer to the allocated block, cast to a pointer to type. +
+

Since 2.10

+
+
+
+

g_slice_dup()

+
#define             g_slice_dup(type, mem)
+

+A convenience macro to duplicate a block of memory using the slice allocator. +It calls g_slice_copy() with sizeof (type) and casts +the returned pointer to a pointer of the given type, avoiding a type cast +in the source code. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. +

+
++ + + + + + + + + + + + + + +

type :

the type to duplicate, typically a structure name +

mem :

the memory to copy into the allocated block +

Returns :

a pointer to the allocated block, cast to a pointer to type. +
+

Since 2.14

+
+
+
+

g_slice_free()

+
#define             g_slice_free(type, mem)
+

+A convenience macro to free a block of memory that has been allocated +from the slice allocator. It calls g_slice_free1() using +sizeof (type) as the block size. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. +

+
++ + + + + + + + + + +

type :

the type of the block to free, typically a structure name +

mem :

a pointer to the block to free +
+

Since 2.10

+
+
+
+

g_slice_free_chain()

+
#define             g_slice_free_chain(type, mem_chain, next)
+

+Frees a linked list of memory blocks of structure type type. +The memory blocks must be equal-sized, allocated via +g_slice_alloc() or g_slice_alloc0() and linked together by a +next pointer (similar to GSList). The name of the +next field in type is passed as third argument. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. +

+
++ + + + + + + + + + + + + + +

type :

the type of the mem_chain blocks +

mem_chain :

a pointer to the first block of the chain +

next :

the field name of the next pointer in type +
+

Since 2.10

+
+
+
+

+

[6] +[Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel +memory allocator. USENIX 1994, and +[Bonwick01] Bonwick and Jonathan Adams, Magazines and vmem: Extending the +slab allocator to many cpu's and arbitrary resources. USENIX 2001 +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Message-Logging.html b/docs/reference/glib/html/glib-Message-Logging.html new file mode 100644 index 0000000..d9cc9db --- /dev/null +++ b/docs/reference/glib/html/glib-Message-Logging.html @@ -0,0 +1,688 @@ + + + + +Message Logging + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Message Logging

+

Message Logging — versatile support for logging messages with different levels of importance

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_LOG_DOMAIN
+#define             G_LOG_FATAL_MASK
+#define             G_LOG_LEVEL_USER_SHIFT
+void                (*GLogFunc)                         (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *message,
+                                                         gpointer user_data);
+enum                GLogLevelFlags;
+
+void                g_log                               (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *format,
+                                                         ...);
+void                g_logv                              (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *format,
+                                                         va_list args);
+#define             g_message                           (...)
+#define             g_warning                           (...)
+#define             g_critical                          (...)
+#define             g_error                             (...)
+#define             g_debug                             (...)
+
+guint               g_log_set_handler                   (const gchar *log_domain,
+                                                         GLogLevelFlags log_levels,
+                                                         GLogFunc log_func,
+                                                         gpointer user_data);
+void                g_log_remove_handler                (const gchar *log_domain,
+                                                         guint handler_id);
+GLogLevelFlags      g_log_set_always_fatal              (GLogLevelFlags fatal_mask);
+GLogLevelFlags      g_log_set_fatal_mask                (const gchar *log_domain,
+                                                         GLogLevelFlags fatal_mask);
+void                g_log_default_handler               (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *message,
+                                                         gpointer unused_data);
+GLogFunc            g_log_set_default_handler           (GLogFunc log_func,
+                                                         gpointer user_data);
+
+
+
+

Description

+

+These functions provide support for logging error messages or messages +used for debugging. +

+

+There are several built-in levels of messages, defined in GLogLevelFlags. +These can be extended with user-defined levels. +

+
+
+

Details

+
+

G_LOG_DOMAIN

+
#define G_LOG_DOMAIN    ((gchar*) 0)
+
+

+Defines the log domain. +For applications, this is typically left as the default NULL (or "") domain. +Libraries should define this so that any messages which they log can +be differentiated from messages from other libraries and application code. +But be careful not to define it in any public header files. +

+

+For example, GTK+ uses this in its Makefile.am: +

+
+INCLUDES = -DG_LOG_DOMAIN=\"Gtk\"
+
+
+
+
+

G_LOG_FATAL_MASK

+
#define G_LOG_FATAL_MASK        (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR)
+
+

+GLib log levels that are considered fatal by default. +

+
+
+
+

G_LOG_LEVEL_USER_SHIFT

+
#define G_LOG_LEVEL_USER_SHIFT  (8)
+
+

+Log level shift offset for user defined log levels (0-7 are used by GLib). +

+
+
+
+

GLogFunc ()

+
void                (*GLogFunc)                         (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *message,
+                                                         gpointer user_data);
+

+Specifies the prototype of log handler functions. +

+
++ + + + + + + + + + + + + + + + + + +

log_domain :

the log domain of the message. +

log_level :

the log level of the message (including the fatal and recursion +flags). +

message :

the message to process. +

user_data :

user data, set in g_log_set_handler(). +
+
+
+
+

enum GLogLevelFlags

+
typedef enum
+{
+  /* log flags */
+  G_LOG_FLAG_RECURSION          = 1 << 0,
+  G_LOG_FLAG_FATAL              = 1 << 1,
+
+  /* GLib log levels */
+  G_LOG_LEVEL_ERROR             = 1 << 2,       /* always fatal */
+  G_LOG_LEVEL_CRITICAL          = 1 << 3,
+  G_LOG_LEVEL_WARNING           = 1 << 4,
+  G_LOG_LEVEL_MESSAGE           = 1 << 5,
+  G_LOG_LEVEL_INFO              = 1 << 6,
+  G_LOG_LEVEL_DEBUG             = 1 << 7,
+
+  G_LOG_LEVEL_MASK              = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL)
+} GLogLevelFlags;
+
+

+Flags specifying the level of log messages. It is possible to change +how GLib treats messages of the various levels using g_log_set_handler() +and g_log_set_fatal_mask(). +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_LOG_FLAG_RECURSION

internal flag +

G_LOG_FLAG_FATAL

internal flag +

G_LOG_LEVEL_ERROR

log level for errors, see g_error(). + This level is also used for messages produced by g_assert(). +

G_LOG_LEVEL_CRITICAL

log level for critical messages, see g_critical(). + This level is also used for messages produced by g_return_if_fail() and + g_return_val_if_fail(). +

G_LOG_LEVEL_WARNING

log level for warnings, see g_warning() +

G_LOG_LEVEL_MESSAGE

log level for messages, see g_message() +

G_LOG_LEVEL_INFO

log level for informational messages +

G_LOG_LEVEL_DEBUG

log level for debug messages, see g_debug() +

G_LOG_LEVEL_MASK

a mask including all log levels. +
+
+
+
+

g_log ()

+
void                g_log                               (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *format,
+                                                         ...);
+

+Logs an error or debugging message. +If the log level has been set as fatal, the abort() +function is called to terminate the program. +

+
++ + + + + + + + + + + + + + + + + + +

log_domain :

the log domain, usually G_LOG_DOMAIN. +

log_level :

the log level, either from GLogLevelFlags or a user-defined level. +

format :

the message format. See the printf() +documentation. +

... :

the parameters to insert into the format string. +
+
+
+
+

g_logv ()

+
void                g_logv                              (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *format,
+                                                         va_list args);
+

+Logs an error or debugging message. +If the log level has been set as fatal, the abort() +function is called to terminate the program. +

+
++ + + + + + + + + + + + + + + + + + +

log_domain :

the log domain. +

log_level :

the log level. +

format :

the message format. See the printf() +documentation. +

args :

the parameters to insert into the format string. +
+
+
+
+

g_message()

+
#define             g_message(...)
+

+A convenience function/macro to log a normal message. +

+
++ + + + +

... :

format string, followed by parameters to insert into the format string (as with printf()) +
+
+
+
+

g_warning()

+
#define             g_warning(...)
+

+A convenience function/macro to log a warning message. +

+

+You can make warnings fatal at runtime by setting the G_DEBUG environment +variable (see Running GLib Applications). +

+
++ + + + +

... :

format string, followed by parameters to insert into the format string (as with printf()) +
+
+
+
+

g_critical()

+
#define             g_critical(...)
+

+Logs a "critical warning" (G_LOG_LEVEL_CRITICAL). It's more or less +application-defined what constitutes a critical vs. a regular +warning. You could call g_log_set_always_fatal() to make critical +warnings exit the program, then use g_critical() for fatal errors, for +example. +

+

+You can also make critical warnings fatal at runtime by setting +the G_DEBUG environment variable (see +Running GLib Applications). +

+
++ + + + +

... :

format string, followed by parameters to insert into the format string (as with printf()) +
+
+
+
+

g_error()

+
#define             g_error(...)
+

+A convenience function/macro to log an error message. +Error messages are always fatal, resulting in a call to +abort() to terminate the application. +This function will result in a core dump; don't use it for errors you +expect. Using this function indicates a bug in your program, i.e. an +assertion failure. +

+
++ + + + +

... :

format string, followed by parameters to insert into the format string (as with printf()) +
+
+
+
+

g_debug()

+
#define             g_debug(...)
+

+A convenience function/macro to log a debug message. +

+
++ + + + +

... :

format string, followed by parameters to insert into the format string (as with printf()) +
+

Since 2.6

+
+
+
+

g_log_set_handler ()

+
guint               g_log_set_handler                   (const gchar *log_domain,
+                                                         GLogLevelFlags log_levels,
+                                                         GLogFunc log_func,
+                                                         gpointer user_data);
+

+Sets the log handler for a domain and a set of log levels. +To handle fatal and recursive messages the log_levels parameter +must be combined with the G_LOG_FLAG_FATAL and G_LOG_FLAG_RECURSION +bit flags. +

+

+Note that since the G_LOG_LEVEL_ERROR log level is always fatal, if +you want to set a handler for this log level you must combine it with +G_LOG_FLAG_FATAL. +

+
+

Example 12. Adding a log handler for all warning messages in the default +(application) domain

+
+  g_log_set_handler (NULL, G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL
+                     | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+
+
+
+

Example 13. Adding a log handler for all critical messages from GTK+

+
+  g_log_set_handler ("Gtk", G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL
+                     | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+
+
+
+

Example 14. Adding a log handler for all messages from +GLib

+
+  g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL
+                     | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+
+
+
++ + + + + + + + + + + + + + + + + + + + + + +

log_domain :

the log domain, or NULL for the default "" application domain. +

log_levels :

the log levels to apply the log handler for. To handle fatal +and recursive messages as well, combine the log levels with the +G_LOG_FLAG_FATAL and G_LOG_FLAG_RECURSION bit flags. +

log_func :

the log handler function. +

user_data :

data passed to the log handler. +

Returns :

the id of the new handler. +
+
+
+
+

g_log_remove_handler ()

+
void                g_log_remove_handler                (const gchar *log_domain,
+                                                         guint handler_id);
+

+Removes the log handler. +

+
++ + + + + + + + + + +

log_domain :

the log domain. +

handler_id :

the id of the handler, which was returned in g_log_set_handler(). +
+
+
+
+

g_log_set_always_fatal ()

+
GLogLevelFlags      g_log_set_always_fatal              (GLogLevelFlags fatal_mask);
+

+Sets the message levels which are always fatal, in any log domain. +When a message with any of these levels is logged the program terminates. +You can only set the levels defined by GLib to be fatal. +G_LOG_LEVEL_ERROR is always fatal. +

+

+You can also make some message levels +fatal at runtime by setting the G_DEBUG environment variable (see +Running GLib Applications). +

+
++ + + + + + + + + + +

fatal_mask :

the mask containing bits set for each level of error which is +to be fatal. +

Returns :

the old fatal mask. +
+
+
+
+

g_log_set_fatal_mask ()

+
GLogLevelFlags      g_log_set_fatal_mask                (const gchar *log_domain,
+                                                         GLogLevelFlags fatal_mask);
+

+Sets the log levels which are fatal in the given domain. +G_LOG_LEVEL_ERROR is always fatal. +

+
++ + + + + + + + + + + + + + +

log_domain :

the log domain. +

fatal_mask :

the new fatal mask. +

Returns :

the old fatal mask for the log domain. +
+
+
+
+

g_log_default_handler ()

+
void                g_log_default_handler               (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *message,
+                                                         gpointer unused_data);
+

+The default log handler set up by GLib; g_log_set_default_handler() +allows to install an alternate default log handler. +This is used if no log handler has been set for the particular log domain +and log level combination. It outputs the message to stderr or stdout +and if the log level is fatal it calls abort(). +

+

+stderr is used for levels G_LOG_LEVEL_ERROR, G_LOG_LEVEL_CRITICAL, +G_LOG_LEVEL_WARNING and G_LOG_LEVEL_MESSAGE. stdout is used for the rest. +

+
++ + + + + + + + + + + + + + + + + + +

log_domain :

the log domain of the message. +

log_level :

the level of the message. +

message :

the message. +

unused_data :

data passed from g_log() which is unused. +
+
+
+
+

g_log_set_default_handler ()

+
GLogFunc            g_log_set_default_handler           (GLogFunc log_func,
+                                                         gpointer user_data);
+

+Installs a default log handler which is used if no +log handler has been set for the particular log domain +and log level combination. By default, GLib uses +g_log_default_handler() as default log handler. +

+
++ + + + + + + + + + + + + + +

log_func :

the log handler function. +

user_data :

data passed to the log handler. +

Returns :

the previous default log handler +
+

Since 2.6

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Miscellaneous-Macros.html b/docs/reference/glib/html/glib-Miscellaneous-Macros.html new file mode 100644 index 0000000..0eeb30e --- /dev/null +++ b/docs/reference/glib/html/glib-Miscellaneous-Macros.html @@ -0,0 +1,989 @@ + + + + +Miscellaneous Macros + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Miscellaneous Macros

+

Miscellaneous Macros — specialized macros which are not used often

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_INLINE_FUNC
+
+#define             G_STMT_START
+#define             G_STMT_END
+
+#define             G_BEGIN_DECLS
+#define             G_END_DECLS
+
+#define             G_N_ELEMENTS                        (arr)
+
+#define             G_VA_COPY                           (ap1,ap2)
+
+#define             G_STRINGIFY                         (macro_or_string)
+#define             G_PASTE                             (identifier1,identifier2)
+#define             G_PASTE_ARGS                        (identifier1,identifier2)
+#define             G_STATIC_ASSERT                     (expr)
+
+#define             G_GNUC_EXTENSION
+#define             G_GNUC_CONST
+#define             G_GNUC_PURE
+#define             G_GNUC_MALLOC
+#define             G_GNUC_ALLOC_SIZE                   (x)
+#define             G_GNUC_ALLOC_SIZE2                  (x,y)
+#define             G_GNUC_DEPRECATED
+#define             G_GNUC_NORETURN
+#define             G_GNUC_UNUSED
+#define             G_GNUC_PRINTF                       ( format_idx, arg_idx )
+#define             G_GNUC_SCANF                        ( format_idx, arg_idx )
+#define             G_GNUC_FORMAT                       ( arg_idx )
+#define             G_GNUC_NULL_TERMINATED
+#define             G_GNUC_WARN_UNUSED_RESULT
+#define             G_GNUC_FUNCTION
+#define             G_GNUC_PRETTY_FUNCTION
+#define             G_GNUC_NO_INSTRUMENT
+#define             G_HAVE_GNUC_VISIBILITY
+#define             G_GNUC_INTERNAL
+#define             G_GNUC_MAY_ALIAS
+
+#define             G_LIKELY                            (expr)
+#define             G_UNLIKELY                          (expr)
+
+#define             G_STRLOC
+#define             G_STRFUNC
+
+#define             G_GINT16_MODIFIER
+#define             G_GINT16_FORMAT
+#define             G_GUINT16_FORMAT
+#define             G_GINT32_MODIFIER
+#define             G_GINT32_FORMAT
+#define             G_GUINT32_FORMAT
+#define             G_GINT64_MODIFIER
+#define             G_GINT64_FORMAT
+#define             G_GUINT64_FORMAT
+#define             G_GSIZE_MODIFIER
+#define             G_GSIZE_FORMAT
+#define             G_GSSIZE_FORMAT
+#define             G_GOFFSET_MODIFIER
+#define             G_GOFFSET_FORMAT
+#define             G_GINTPTR_MODIFIER
+#define             G_GINTPTR_FORMAT
+#define             G_GUINTPTR_FORMAT
+
+
+
+

Description

+

+These macros provide more specialized features which are not needed so often +by application programmers. +

+
+
+

Details

+
+

G_INLINE_FUNC

+
#define             G_INLINE_FUNC
+

+This macro is used to export function prototypes so they can be linked +with an external version when no inlining is performed. The file which +implements the functions should define G_IMPLEMENTS_INLINES +before including the headers which contain G_INLINE_FUNC declarations. +Since inlining is very compiler-dependent using these macros correctly +is very difficult. Their use is strongly discouraged. +

+

+This macro is often mistaken for a replacement for the inline keyword; +inline is already declared in a portable manner in the glib headers +and can be used normally. +

+
+
+
+

G_STMT_START

+
#  define G_STMT_START  do
+
+

+Used within multi-statement macros so that they can be used in places where +only one statement is expected by the compiler. +

+
+
+
+

G_STMT_END

+
#  define G_STMT_END    while (0)
+
+

+Used within multi-statement macros so that they can be used in places where +only one statement is expected by the compiler. +

+
+
+
+

G_BEGIN_DECLS

+
#define             G_BEGIN_DECLS
+

+Used (along with G_END_DECLS) to bracket header files. If the +compiler in use is a C++ compiler, adds extern "C" +around the header. +

+
+
+
+

G_END_DECLS

+
#define             G_END_DECLS
+

+Used (along with G_BEGIN_DECLS) to bracket header files. If the +compiler in use is a C++ compiler, adds extern "C" +around the header. +

+
+
+
+

G_N_ELEMENTS()

+
#define G_N_ELEMENTS(arr)		(sizeof (arr) / sizeof ((arr)[0]))
+
+

+Determines the number of elements in an array. The array must be +declared so the compiler knows its size at compile-time; this +macro will not work on an array allocated on the heap, only static +arrays or arrays on the stack. +

+
++ + + + +

arr :

the array +
+
+
+
+

G_VA_COPY()

+
#define             G_VA_COPY(ap1,ap2)
+

+Portable way to copy va_list variables. +

+

+In order to use this function, you must include string.h +yourself, because this macro may use memmove() and GLib +does not include string.h for you. +

+
++ + + + + + + + + + +

ap1 :

the va_list variable to place a copy of ap2 in. +

ap2 :

a va_list. +
+
+
+
+

G_STRINGIFY()

+
#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string)
+
+

+Accepts a macro or a string and converts it into a string after +preprocessor argument expansion. +

+
++ + + + +

macro_or_string :

a macro or a string. +
+
+
+
+

G_PASTE()

+
#define G_PASTE(identifier1,identifier2)      G_PASTE_ARGS (identifier1, identifier2)
+
+

+Yields a new preprocessor pasted identifier 'identifier1identifier2' +from its expanded arguments 'identifier1' and 'identifier2'. +

+
++ + + + + + + + + + +

identifier1 :

an identifier +

identifier2 :

an identifier +
+

Since 2.20

+
+
+
+

G_PASTE_ARGS()

+
#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
+
+

+

+
++ + + + + + + + + + +

identifier1 :

+

identifier2 :

+
+
+
+
+

G_STATIC_ASSERT()

+
#define G_STATIC_ASSERT(expr) typedef struct { char Compile_Time_Assertion[(expr) ? 1 : -1]; } G_PASTE (_GStaticAssert_, __LINE__)
+
+

+The G_STATIC_ASSERT macro lets the programmer check a condition at compile time, +the condition needs to be compile time computable. +The macro can be used in any place where a typedef is valid. +The macro should only be used once per source code line. +

+
++ + + + +

expr :

a constant expression. +
+

Since 2.20

+
+
+
+

G_GNUC_EXTENSION

+
#define             G_GNUC_EXTENSION
+

+Expands to __extension__ when gcc is +used as the compiler. +This simply tells gcc not to warn about the following non-standard code +when compiling with the -pedantic option. +

+
+
+
+

G_GNUC_CONST

+
#define             G_GNUC_CONST
+

+Expands to the GNU C const function attribute if the compiler is +gcc. Declaring a function as const enables better optimization of calls +to the function. A const function doesn't examine any values except its parameters, and has no +effects except its return value. See the GNU C documentation for details. +

+
+

Note

+

+A function that has pointer arguments and examines the data pointed to +must not be declared const. Likewise, a function that +calls a non-const function usually must not be const. It doesn't make sense +for a const function to return void. +

+
+
+
+
+

G_GNUC_PURE

+
#define             G_GNUC_PURE
+

+Expands to the GNU C pure function attribute if the compiler is +gcc. Declaring a function as pure enables better optimization of +calls to the function. A pure function has no effects except its return value and the +return value depends only on the parameters and/or global variables. +See the GNU C documentation for details. +

+
+
+
+

G_GNUC_MALLOC

+
#define             G_GNUC_MALLOC
+

+Expands to the GNU C malloc function attribute if the +compiler is gcc. Declaring a function as malloc enables +better optimization of the function. A function can have the malloc attribute +if it returns a pointer which is guaranteed to not alias with any other pointer +when the function returns (in practice, this means newly allocated memory). +See the GNU C documentation for details. +

+

Since 2.6

+
+
+
+

G_GNUC_ALLOC_SIZE()

+
#define             G_GNUC_ALLOC_SIZE(x)
+

+Expands to the GNU C alloc_size function attribute if the +compiler is a new enough gcc. This attribute tells the +compiler that the function returns a pointer to memory of a size that is +specified by the xth function parameter. +See the GNU C documentation for details. +

+
++ + + + +

x :

the index of the argument specifying the allocation size +
+

Since 2.18

+
+
+
+

G_GNUC_ALLOC_SIZE2()

+
#define             G_GNUC_ALLOC_SIZE2(x,y)
+

+Expands to the GNU C alloc_size function attribute if the +compiler is a new enough gcc. This attribute tells the +compiler that the function returns a pointer to memory of a size that is +specified by the product of two function parameters. +See the GNU C documentation for details. +

+
++ + + + + + + + + + +

x :

the index of the argument specifying one factor of the allocation size +

y :

the index of the argument specifying the second factor of the allocation size +
+

Since 2.18

+
+
+
+

G_GNUC_DEPRECATED

+
#define             G_GNUC_DEPRECATED
+

+Expands to the GNU C deprecated attribute if the compiler +is gcc. +It can be used to mark typedefs, variables and functions as deprecated. +When called with the -Wdeprecated-declarations option, the compiler will +generate warnings when deprecated interfaces are used. +See the GNU C documentation for details. +

+

Since 2.2

+
+
+
+

G_GNUC_NORETURN

+
#define             G_GNUC_NORETURN
+

+Expands to the GNU C noreturn function attribute if the +compiler is gcc. It is used for declaring functions which never return. +It enables optimization of the function, and avoids possible compiler +warnings. See the GNU C documentation for details. +

+
+
+
+

G_GNUC_UNUSED

+
#define             G_GNUC_UNUSED
+

+Expands to the GNU C unused function attribute if the compiler is +gcc. It is used for declaring functions which may never be used. +It avoids possible compiler warnings. See the GNU C documentation for details. +

+
+
+
+

G_GNUC_PRINTF()

+
#define             G_GNUC_PRINTF( format_idx, arg_idx )
+

+Expands to the GNU C format function attribute if the compiler is +gcc. This is used for declaring functions which take a variable number of +arguments, with the same syntax as printf(). +It allows the compiler to type-check the arguments passed to the function. +See the GNU C documentation for details. +

+
+gint g_snprintf (gchar  *string,
+                 gulong       n,
+                 gchar const *format,
+                 ...) G_GNUC_PRINTF (3, 4);
+
+
++ + + + + + + + + + +

format_idx :

the index of the argument corresponding to the format string. +(The arguments are numbered from 1). +

arg_idx :

the index of the first of the format arguments. +
+
+
+
+

G_GNUC_SCANF()

+
#define             G_GNUC_SCANF( format_idx, arg_idx )
+

+Expands to the GNU C format function attribute if the compiler is gcc. +This is used for declaring functions which take a variable number of +arguments, with the same syntax as scanf(). +It allows the compiler to type-check the arguments passed to the function. +See the GNU C documentation for details. +

+
++ + + + + + + + + + +

format_idx :

the index of the argument corresponding to the format string. +(The arguments are numbered from 1). +

arg_idx :

the index of the first of the format arguments. +
+
+
+
+

G_GNUC_FORMAT()

+
#define             G_GNUC_FORMAT( arg_idx )
+

+Expands to the GNU C format_arg function attribute if the compiler is gcc. +This function attribute specifies that a function takes a format +string for a printf(), scanf(), +strftime() or strfmon() style +function and modifies it, so that the result can be passed to a +printf(), scanf(), +strftime() or strfmon() style +function (with the remaining arguments to the format function the same as +they would have been for the unmodified string). +See the GNU C documentation for details. +

+
+gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2);
+
+
++ + + + +

arg_idx :

the index of the argument. +
+
+
+
+

G_GNUC_NULL_TERMINATED

+
#define             G_GNUC_NULL_TERMINATED
+

+Expands to the GNU C sentinel function attribute if the +compiler is gcc, or "" if it isn't. This function attribute +only applies to variadic functions and instructs the compiler to check that +the argument list is terminated with an explicit NULL. +See the GNU C documentation for details. +

+Since: 2.8
+
+
+

G_GNUC_WARN_UNUSED_RESULT

+
#define             G_GNUC_WARN_UNUSED_RESULT
+

+Expands to the GNU C warn_unused_result function attribute +if the compiler is gcc, or "" if it isn't. This function +attribute makes the compiler emit a warning if the result of a function call +is ignored. See the GNU C documentation for details. +

+

Since 2.10

+
+
+
+

G_GNUC_FUNCTION

+
#define             G_GNUC_FUNCTION
+
+

Warning

+

G_GNUC_FUNCTION has been deprecated since version 2.16 and should not be used in newly-written code. Use G_STRFUNC instead.

+
+

+Expands to "" on all modern compilers, and to __FUNCTION__ +on gcc version 2.x. Don't use it. +

+
+
+
+

G_GNUC_PRETTY_FUNCTION

+
#define             G_GNUC_PRETTY_FUNCTION
+
+

Warning

+

G_GNUC_PRETTY_FUNCTION has been deprecated since version 2.16 and should not be used in newly-written code. Use G_STRFUNC instead.

+
+

+Expands to "" on all modern compilers, and to +__PRETTY_FUNCTION__ on gcc version 2.x. +Don't use it. +

+
+
+
+

G_GNUC_NO_INSTRUMENT

+
#define             G_GNUC_NO_INSTRUMENT
+

+Expands to the GNU C no_instrument_function function +attribute if the compiler is gcc. Functions with this +attribute will not be +instrumented for profiling, when the compiler is called with the +-finstrument-functions option. +See the GNU C documentation for details. +

+
+
+
+

G_HAVE_GNUC_VISIBILITY

+
#define G_HAVE_GNUC_VISIBILITY 1
+
+

+

+
+
+
+

G_GNUC_INTERNAL

+
#define             G_GNUC_INTERNAL
+

+This attribute can be used for marking library functions as being used +internally to the library only, which may allow the compiler to handle +function calls more efficiently. +Note that static functions do not need to be marked as internal in this way. +See the GNU C documentation for details. +

+

+When using a compiler that supports the GNU C hidden visibility attribute, +this macro expands to __attribute__((visibility("hidden"))). +When using the Sun Studio compiler, it expands to __hidden. +

+

+Note that for portability, the attribute should be placed before the +function declaration. While GCC allows the macro after the declaration, +Sun Studio does not. +

+
+G_GNUC_INTERNAL
+void _g_log_fallback_handler (const gchar    *log_domain,
+                              GLogLevelFlags  log_level,
+                              const gchar    *message,
+                              gpointer        unused_data);
+
+Since: 2.6
+
+
+

G_GNUC_MAY_ALIAS

+
#define             G_GNUC_MAY_ALIAS
+

+Expands to the GNU C may_alias type attribute +if the compiler is gcc. Types with this attribute +will not be subjected to type-based alias analysis, but are assumed +to alias with any other type, just like char. +See the GNU C documentation for details. +

+Since: 2.14
+
+
+

G_LIKELY()

+
#define             G_LIKELY(expr)
+

+Hints the compiler that the expression is likely to evaluate to a true +value. The compiler may use this information for optimizations. +

+
+if (G_LIKELY (random () != 1))
+  g_print ("not one");
+
+
++ + + + + + + + + + +

expr :

the expression +

Returns :

the value of expr +
+

Since 2.2

+
+
+
+

G_UNLIKELY()

+
#define             G_UNLIKELY(expr)
+

+Hints the compiler that the expression is unlikely to evaluate to a true +value. The compiler may use this information for optimizations. +

+
+if (G_UNLIKELY (random () == 1))
+  g_print ("a random one");
+
+
++ + + + + + + + + + +

expr :

the expression +

Returns :

the value of expr +
+

Since 2.2

+
+
+
+

G_STRLOC

+
#define             G_STRLOC
+

+Expands to a string identifying the current code position. +

+
+
+
+

G_STRFUNC

+
#define             G_STRFUNC
+

+Expands to a string identifying the current function. +

+

Since 2.4

+
+
+
+

G_GINT16_MODIFIER

+
#define G_GINT16_MODIFIER "h"
+
+

+The platform dependent length modifier for conversion specifiers for scanning +and printing values of type gint16 or guint16. It is a string literal, +but doesn't include the percent-sign, such that you can add precision and +length modifiers between percent-sign and conversion specifier and append a +conversion specifier. +

+

+The following example prints "0x7b"; +

+
+gint16 value = 123;
+g_print ("%#" G_GINT16_MODIFIER "x", value);
+
+

+

+

Since 2.4

+
+
+
+

G_GINT16_FORMAT

+
#define G_GINT16_FORMAT "hi"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type gint16. It is a string literal, but doesn't +include the percent-sign, such that you can add precision and length +modifiers between percent-sign and conversion specifier. +

+

+

+
+gint16 in;
+gint32 out;
+sscanf ("42", "%" G_GINT16_FORMAT, &in)
+out = in * 1000;
+g_print ("%" G_GINT32_FORMAT, out);
+
+

+

+
+
+
+

G_GUINT16_FORMAT

+
#define G_GUINT16_FORMAT "hu"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type guint16. See also G_GINT16_FORMAT. +

+
+
+
+

G_GINT32_MODIFIER

+
#define G_GINT32_MODIFIER ""
+
+

+The platform dependent length modifier for conversion specifiers for scanning +and printing values of type gint32 or guint32. It is a string literal, +See also G_GINT16_MODIFIER. +

+

Since 2.4

+
+
+
+

G_GINT32_FORMAT

+
#define G_GINT32_FORMAT "i"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type gint32. See also G_GINT16_FORMAT. +

+
+
+
+

G_GUINT32_FORMAT

+
#define G_GUINT32_FORMAT "u"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type guint32. See also G_GINT16_FORMAT. +

+
+
+
+

G_GINT64_MODIFIER

+
#define G_GINT64_MODIFIER "l"
+
+

+The platform dependent length modifier for conversion specifiers for scanning +and printing values of type gint64 or guint64. It is a string literal. +

+
+

Note

+

+Some platforms do not support printing 64 bit integers, +even though the types are supported. On such platforms G_GINT64_MODIFIER +is not defined. +

+
+

Since 2.4

+
+
+
+

G_GINT64_FORMAT

+
#define G_GINT64_FORMAT "li"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type gint64. See also G_GINT16_FORMAT. +

+
+

Note

+

+Some platforms do not support scanning and printing 64 bit integers, +even though the types are supported. On such platforms G_GINT64_FORMAT +is not defined. Note that scanf() may not support 64 bit integers, even +if G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() +is not recommended for parsing anyway; consider using g_ascii_strtoull() +instead. +

+
+
+
+
+

G_GUINT64_FORMAT

+
#define G_GUINT64_FORMAT "lu"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type guint64. See also G_GINT16_FORMAT. +

+
+

Note

+

+Some platforms do not support scanning and printing 64 bit integers, +even though the types are supported. On such platforms G_GUINT64_FORMAT +is not defined. Note that scanf() may not support 64 bit integers, even +if G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() is not +recommended for parsing anyway; consider using g_strtoull() instead. +

+
+
+
+
+

G_GSIZE_MODIFIER

+
#define G_GSIZE_MODIFIER "l"
+
+

+The platform dependent length modifier for conversion specifiers for scanning +and printing values of type gsize or gssize. It is a string literal, +

+

Since 2.6

+
+
+
+

G_GSIZE_FORMAT

+
#define G_GSIZE_FORMAT "lu"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type gsize. See also G_GINT16_FORMAT. +

+

Since 2.6

+
+
+
+

G_GSSIZE_FORMAT

+
#define G_GSSIZE_FORMAT "li"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type gssize. See also G_GINT16_FORMAT. +

+

Since 2.6

+
+
+
+

G_GOFFSET_MODIFIER

+
#define G_GOFFSET_MODIFIER      G_GINT64_MODIFIER
+
+

+The platform dependent length modifier for conversion specifiers for scanning +and printing values of type goffset. It is a string literal. See also +G_GINT64_MODIFIER. +

+

Since 2.20

+
+
+
+

G_GOFFSET_FORMAT

+
#define G_GOFFSET_FORMAT        G_GINT64_FORMAT
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type goffset. See also G_GINT64_FORMAT. +

+Since: 2.20
+
+
+

G_GINTPTR_MODIFIER

+
#define G_GINTPTR_MODIFIER      "l"
+
+

+The platform dependent length modifier for conversion specifiers for scanning +and printing values of type gintptr or guintptr. It is a string literal. +

+

Since 2.22

+
+
+
+

G_GINTPTR_FORMAT

+
#define G_GINTPTR_FORMAT        "li"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type gintptr. +

+

Since 2.22

+
+
+
+

G_GUINTPTR_FORMAT

+
#define G_GUINTPTR_FORMAT       "lu"
+
+

+This is the platform dependent conversion specifier for scanning and +printing values of type guintptr. +

+

Since 2.22

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Miscellaneous-Utility-Functions.html b/docs/reference/glib/html/glib-Miscellaneous-Utility-Functions.html new file mode 100644 index 0000000..ccd7458 --- /dev/null +++ b/docs/reference/glib/html/glib-Miscellaneous-Utility-Functions.html @@ -0,0 +1,1493 @@ + + + + +Miscellaneous Utility Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Miscellaneous Utility Functions

+

Miscellaneous Utility Functions — a selection of portable utility functions

+
+
+

Synopsis

+
+#include <glib.h>
+
+const gchar*        g_get_application_name              (void);
+void                g_set_application_name              (const gchar *application_name);
+gchar*              g_get_prgname                       (void);
+void                g_set_prgname                       (const gchar *prgname);
+const gchar*        g_getenv                            (const gchar *variable);
+gboolean            g_setenv                            (const gchar *variable,
+                                                         const gchar *value,
+                                                         gboolean overwrite);
+void                g_unsetenv                          (const gchar *variable);
+gchar**             g_listenv                           (void);
+const gchar*        g_get_user_name                     (void);
+const gchar*        g_get_real_name                     (void);
+const gchar*        g_get_user_cache_dir                (void);
+const gchar*        g_get_user_data_dir                 (void);
+const gchar*        g_get_user_config_dir               (void);
+enum                GUserDirectory;
+const gchar*        g_get_user_special_dir              (GUserDirectory directory);
+const gchar* const * g_get_system_data_dirs             (void);
+const gchar* const * g_get_system_config_dirs           (void);
+void                g_reload_user_special_dirs_cache    (void);
+
+const gchar*        g_get_host_name                     (void);
+const gchar*        g_get_home_dir                      (void);
+const gchar*        g_get_tmp_dir                       (void);
+gchar*              g_get_current_dir                   (void);
+const gchar*        g_basename                          (const gchar *file_name);
+#define             g_dirname
+gboolean            g_path_is_absolute                  (const gchar *file_name);
+const gchar*        g_path_skip_root                    (const gchar *file_name);
+gchar*              g_path_get_basename                 (const gchar *file_name);
+gchar*              g_path_get_dirname                  (const gchar *file_name);
+gchar *             g_build_filename                    (const gchar *first_element,
+                                                         ...);
+gchar *             g_build_filenamev                   (gchar **args);
+gchar *             g_build_path                        (const gchar *separator,
+                                                         const gchar *first_element,
+                                                         ...);
+gchar *             g_build_pathv                       (const gchar *separator,
+                                                         gchar **args);
+char *              g_format_size_for_display           (goffset size);
+
+gchar*              g_find_program_in_path              (const gchar *program);
+
+gint                g_bit_nth_lsf                       (gulong mask,
+                                                         gint nth_bit);
+gint                g_bit_nth_msf                       (gulong mask,
+                                                         gint nth_bit);
+guint               g_bit_storage                       (gulong number);
+
+guint               g_spaced_primes_closest             (guint num);
+
+void                g_atexit                            (GVoidFunc func);
+
+guint               g_parse_debug_string                (const gchar *string,
+                                                         const GDebugKey *keys,
+                                                         guint nkeys);
+                    GDebugKey;
+
+void                (*GVoidFunc)                        (void);
+void                (*GFreeFunc)                        (gpointer data);
+
+void                g_qsort_with_data                   (gconstpointer pbase,
+                                                         gint total_elems,
+                                                         gsize size,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+
+void                g_nullify_pointer                   (gpointer *nullify_location);
+
+
+
+

Description

+

+These are portable utility functions. +

+
+
+

Details

+
+

g_get_application_name ()

+
const gchar*        g_get_application_name              (void);
+

+Gets a human-readable name for the application, as set by +g_set_application_name(). This name should be localized if +possible, and is intended for display to the user. Contrast with +g_get_prgname(), which gets a non-localized name. If +g_set_application_name() has not been called, returns the result of +g_get_prgname() (which may be NULL if g_set_prgname() has also not +been called).

+
++ + + + +

Returns :

human-readable application name. may return NULL + +
+

Since 2.2

+
+
+
+

g_set_application_name ()

+
void                g_set_application_name              (const gchar *application_name);
+

+Sets a human-readable name for the application. This name should be +localized if possible, and is intended for display to the user. +Contrast with g_set_prgname(), which sets a non-localized name. +g_set_prgname() will be called automatically by gtk_init(), +but g_set_application_name() will not. +

+

+Note that for thread safety reasons, this function can only +be called once. +

+

+The application name will be used in contexts such as error messages, +or when displaying an application's name in the task list.

+
++ + + + +

application_name :

localized name of the application +
+

Since 2.2

+
+
+
+

g_get_prgname ()

+
gchar*              g_get_prgname                       (void);
+

+Gets the name of the program. This name should not +be localized, contrast with g_get_application_name(). +(If you are using GDK or GTK+ the program name is set in gdk_init(), +which is called by gtk_init(). The program name is found by taking +the last component of argv[0].)

+
++ + + + +

Returns :

the name of the program. The returned string belongs +to GLib and must not be modified or freed. +
+
+
+
+

g_set_prgname ()

+
void                g_set_prgname                       (const gchar *prgname);
+

+Sets the name of the program. This name should not +be localized, contrast with g_set_application_name(). Note that for +thread-safety reasons this function can only be called once.

+
++ + + + +

prgname :

the name of the program. +
+
+
+
+

g_getenv ()

+
const gchar*        g_getenv                            (const gchar *variable);
+

+Returns the value of an environment variable. The name and value +are in the GLib file name encoding. On UNIX, this means the actual +bytes which might or might not be in some consistent character set +and encoding. On Windows, it is in UTF-8. On Windows, in case the +environment variable's value contains references to other +environment variables, they are expanded.

+
++ + + + + + + + + + +

variable :

the environment variable to get, in the GLib file name encoding. +

Returns :

the value of the environment variable, or NULL if +the environment variable is not found. The returned string may be +overwritten by the next call to g_getenv(), g_setenv() or +g_unsetenv(). +
+
+
+
+

g_setenv ()

+
gboolean            g_setenv                            (const gchar *variable,
+                                                         const gchar *value,
+                                                         gboolean overwrite);
+

+Sets an environment variable. Both the variable's name and value +should be in the GLib file name encoding. On UNIX, this means that +they can be any sequence of bytes. On Windows, they should be in +UTF-8. +

+

+Note that on some systems, when variables are overwritten, the memory +used for the previous variables and its value isn't reclaimed.

+
++ + + + + + + + + + + + + + + + + + +

variable :

the environment variable to set, must not contain '='. +

value :

the value for to set the variable to. +

overwrite :

whether to change the variable if it already exists. +

Returns :

FALSE if the environment variable couldn't be set. + +
+

Since 2.4

+
+
+
+

g_unsetenv ()

+
void                g_unsetenv                          (const gchar *variable);
+

+Removes an environment variable from the environment. +

+

+Note that on some systems, when variables are overwritten, the memory +used for the previous variables and its value isn't reclaimed. +Furthermore, this function can't be guaranteed to operate in a +threadsafe way.

+
++ + + + +

variable :

the environment variable to remove, must not contain '='. +
+

Since 2.4

+
+
+
+

g_listenv ()

+
gchar**             g_listenv                           (void);
+

+Gets the names of all variables set in the environment.

+
++ + + + +

Returns :

a NULL-terminated list of strings which must be freed +with g_strfreev(). + +Programs that want to be portable to Windows should typically use +this function and g_getenv() instead of using the environ array +from the C library directly. On Windows, the strings in the environ +array are in system codepage encoding, while in most of the typical +use cases for environment variables in GLib-using programs you want +the UTF-8 encoding that this function and g_getenv() provide. + +
+

Since 2.8

+
+
+
+

g_get_user_name ()

+
const gchar*        g_get_user_name                     (void);
+

+Gets the user name of the current user. The encoding of the returned +string is system-defined. On UNIX, it might be the preferred file name +encoding, or something else, and there is no guarantee that it is even +consistent on a machine. On Windows, it is always UTF-8.

+
++ + + + +

Returns :

the user name of the current user. +
+
+
+
+

g_get_real_name ()

+
const gchar*        g_get_real_name                     (void);
+

+Gets the real name of the user. This usually comes from the user's entry +in the passwd file. The encoding of the returned +string is system-defined. (On Windows, it is, however, always UTF-8.) +If the real user name cannot be determined, the string "Unknown" is +returned.

+
++ + + + +

Returns :

the user's real name. +
+
+
+
+

g_get_user_cache_dir ()

+
const gchar*        g_get_user_cache_dir                (void);
+

+Returns a base directory in which to store non-essential, cached +data specific to particular user. +

+

+On UNIX platforms this is determined using the mechanisms described in +the +XDG Base Directory Specification

+
++ + + + +

Returns :

a string owned by GLib that must not be modified + or freed. +
+

Since 2.6

+
+
+
+

g_get_user_data_dir ()

+
const gchar*        g_get_user_data_dir                 (void);
+

+Returns a base directory in which to access application data such +as icons that is customized for a particular user. +

+

+On UNIX platforms this is determined using the mechanisms described in +the +XDG Base Directory Specification

+
++ + + + +

Returns :

a string owned by GLib that must not be modified + or freed. +
+

Since 2.6

+
+
+
+

g_get_user_config_dir ()

+
const gchar*        g_get_user_config_dir               (void);
+

+Returns a base directory in which to store user-specific application +configuration information such as user preferences and settings. +

+

+On UNIX platforms this is determined using the mechanisms described in +the +XDG Base Directory Specification

+
++ + + + +

Returns :

a string owned by GLib that must not be modified + or freed. +
+

Since 2.6

+
+
+
+

enum GUserDirectory

+
typedef enum {
+  G_USER_DIRECTORY_DESKTOP,
+  G_USER_DIRECTORY_DOCUMENTS,
+  G_USER_DIRECTORY_DOWNLOAD,
+  G_USER_DIRECTORY_MUSIC,
+  G_USER_DIRECTORY_PICTURES,
+  G_USER_DIRECTORY_PUBLIC_SHARE,
+  G_USER_DIRECTORY_TEMPLATES,
+  G_USER_DIRECTORY_VIDEOS,
+
+  G_USER_N_DIRECTORIES
+} GUserDirectory;
+
+

+These are logical ids for special directories which are defined +depending on the platform used. You should use g_get_user_special_dir() +to retrieve the full path associated to the logical id. +

+

+The GUserDirectory enumeration can be extended at later date. Not +every platform has a directory for every logical id in this +enumeration.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_USER_DIRECTORY_DESKTOP

the user's Desktop directory +

G_USER_DIRECTORY_DOCUMENTS

the user's Documents directory +

G_USER_DIRECTORY_DOWNLOAD

the user's Downloads directory +

G_USER_DIRECTORY_MUSIC

the user's Music directory +

G_USER_DIRECTORY_PICTURES

the user's Pictures directory +

G_USER_DIRECTORY_PUBLIC_SHARE

the user's shared directory +

G_USER_DIRECTORY_TEMPLATES

the user's Templates directory +

G_USER_DIRECTORY_VIDEOS

the user's Movies directory +

G_USER_N_DIRECTORIES

the number of enum values +
+

Since 2.14

+
+
+
+

g_get_user_special_dir ()

+
const gchar*        g_get_user_special_dir              (GUserDirectory directory);
+

+Returns the full path of a special directory using its logical id. +

+

+On Unix this is done using the XDG special user directories. +For compatibility with existing practise, G_USER_DIRECTORY_DESKTOP +falls back to $HOME/Desktop when XDG special +user directories have not been set up. +

+

+Depending on the platform, the user might be able to change the path +of the special directory without requiring the session to restart; GLib +will not reflect any change once the special directories are loaded.

+
++ + + + + + + + + + +

directory :

the logical id of special directory +

Returns :

the path to the specified special directory, or NULL + if the logical id was not found. The returned string is owned by + GLib and should not be modified or freed. + +
+

Since 2.14

+
+
+
+

g_get_system_data_dirs ()

+
const gchar* const * g_get_system_data_dirs             (void);
+

+Returns an ordered list of base directories in which to access +system-wide application data. +

+

+On UNIX platforms this is determined using the mechanisms described in +the +XDG Base Directory Specification +

+

+On Windows the first elements in the list are the Application Data +and Documents folders for All Users. (These can be determined only +on Windows 2000 or later and are not present in the list on other +Windows versions.) See documentation for CSIDL_COMMON_APPDATA and +CSIDL_COMMON_DOCUMENTS. +

+

+Then follows the "share" subfolder in the installation folder for +the package containing the DLL that calls this function, if it can +be determined. +

+

+Finally the list contains the "share" subfolder in the installation +folder for GLib, and in the installation folder for the package the +application's .exe file belongs to. +

+

+The installation folders above are determined by looking up the +folder where the module (DLL or EXE) in question is located. If the +folder's name is "bin", its parent is used, otherwise the folder +itself. +

+

+Note that on Windows the returned list can vary depending on where +this function is called.

+
++ + + + +

Returns :

a NULL-terminated array of strings owned by GLib that must + not be modified or freed. +
+

Since 2.6

+
+
+
+

g_get_system_config_dirs ()

+
const gchar* const * g_get_system_config_dirs           (void);
+

+Returns an ordered list of base directories in which to access +system-wide configuration information. +

+

+On UNIX platforms this is determined using the mechanisms described in +the +XDG Base Directory Specification

+
++ + + + +

Returns :

a NULL-terminated array of strings owned by GLib that must + not be modified or freed. +
+

Since 2.6

+
+
+
+

g_reload_user_special_dirs_cache ()

+
void                g_reload_user_special_dirs_cache    (void);
+

+Resets the cache used for g_get_user_special_dir(), so +that the latest on-disk version is used. Call this only +if you just changed the data on disk yourself. +

+

+Due to threadsafety issues this may cause leaking of strings +that were previously returned from g_get_user_special_dir() +that can't be freed. We ensure to only leak the data for +the directories that actually changed value though.

+

Since 2.22

+
+
+
+

g_get_host_name ()

+
const gchar*        g_get_host_name                     (void);
+

+Return a name for the machine. +

+

+The returned name is not necessarily a fully-qualified domain name, +or even present in DNS or some other name service at all. It need +not even be unique on your local network or site, but usually it +is. Callers should not rely on the return value having any specific +properties like uniqueness for security purposes. Even if the name +of the machine is changed while an application is running, the +return value from this function does not change. The returned +string is owned by GLib and should not be modified or freed. If no +name can be determined, a default fixed string "localhost" is +returned.

+
++ + + + +

Returns :

the host name of the machine. + +
+

Since 2.8

+
+
+
+

g_get_home_dir ()

+
const gchar*        g_get_home_dir                      (void);
+

+Gets the current user's home directory as defined in the +password database. +

+

+Note that in contrast to traditional UNIX tools, this function +prefers passwd entries over the HOME +environment variable. +

+

+One of the reasons for this decision is that applications in many +cases need special handling to deal with the case where +HOME is +

+ + + + +
Not owned by the user
Not writeable
Not even readable
+

+Since applications are in general not written +to deal with these situations it was considered better to make +g_get_home_dir() not pay attention to HOME and to +return the real home directory for the user. If applications +want to pay attention to HOME, they can do: +

+
+ const char *homedir = g_getenv ("HOME");
+  if (!homedir)
+     homedir = g_get_home_dir ();
+
+
++ + + + +

Returns :

the current user's home directory +
+
+
+
+

g_get_tmp_dir ()

+
const gchar*        g_get_tmp_dir                       (void);
+

+Gets the directory to use for temporary files. This is found from +inspecting the environment variables TMPDIR, +TMP, and TEMP in that order. If none +of those are defined "/tmp" is returned on UNIX and "C:\" on Windows. +The encoding of the returned string is system-defined. On Windows, +it is always UTF-8. The return value is never NULL.

+
++ + + + +

Returns :

the directory to use for temporary files. +
+
+
+
+

g_get_current_dir ()

+
gchar*              g_get_current_dir                   (void);
+

+Gets the current directory. +The returned string should be freed when no longer needed. The encoding +of the returned string is system defined. On Windows, it is always UTF-8.

+
++ + + + +

Returns :

the current directory. +
+
+
+
+

g_basename ()

+
const gchar*        g_basename                          (const gchar *file_name);
+
+

Warning

+

g_basename has been deprecated since version 2.2 and should not be used in newly-written code. Use g_path_get_basename() instead, but notice that +g_path_get_basename() allocates new memory for the returned string, unlike +this function which returns a pointer into the argument.

+
+

+Gets the name of the file without any leading directory components. +It returns a pointer into the given file name string.

+
++ + + + + + + + + + +

file_name :

the name of the file. +

Returns :

the name of the file without any leading directory components. + +
+
+
+
+

g_dirname

+
#define             g_dirname
+
+

Warning

+

g_dirname is deprecated and should not be used in newly-written code.

+
+

+This function is deprecated and will be removed in the next major +release of GLib. Use g_path_get_dirname() instead. +

+

+Gets the directory components of a file name. +If the file name has no directory components "." is returned. +The returned string should be freed when no longer needed. +

+
++ + + + +

Returns :

the directory components of the file. +
+
+
+
+

g_path_is_absolute ()

+
gboolean            g_path_is_absolute                  (const gchar *file_name);
+

+Returns TRUE if the given file_name is an absolute file name, +i.e. it contains a full path from the root directory such as "/usr/local" +on UNIX or "C:\windows" on Windows systems.

+
++ + + + + + + + + + +

file_name :

a file name. +

Returns :

TRUE if file_name is an absolute path. +
+
+
+
+

g_path_skip_root ()

+
const gchar*        g_path_skip_root                    (const gchar *file_name);
+

+Returns a pointer into file_name after the root component, i.e. after +the "/" in UNIX or "C:\" under Windows. If file_name is not an absolute +path it returns NULL.

+
++ + + + + + + + + + +

file_name :

a file name. +

Returns :

a pointer into file_name after the root component. +
+
+
+
+

g_path_get_basename ()

+
gchar*              g_path_get_basename                 (const gchar *file_name);
+

+Gets the last component of the filename. If file_name ends with a +directory separator it gets the component before the last slash. If +file_name consists only of directory separators (and on Windows, +possibly a drive letter), a single separator is returned. If +file_name is empty, it gets ".".

+
++ + + + + + + + + + +

file_name :

the name of the file. +

Returns :

a newly allocated string containing the last component of + the filename. +
+
+
+
+

g_path_get_dirname ()

+
gchar*              g_path_get_dirname                  (const gchar *file_name);
+

+Gets the directory components of a file name. If the file name has no +directory components "." is returned. The returned string should be +freed when no longer needed.

+
++ + + + + + + + + + +

file_name :

the name of the file. +

Returns :

the directory components of the file. +
+
+
+
+

g_build_filename ()

+
gchar *             g_build_filename                    (const gchar *first_element,
+                                                         ...);
+

+Creates a filename from a series of elements using the correct +separator for filenames. +

+

+On Unix, this function behaves identically to g_build_path +(G_DIR_SEPARATOR_S, first_element, ....). +

+

+On Windows, it takes into account that either the backslash +(\ or slash (/) can be used +as separator in filenames, but otherwise behaves as on Unix. When +file pathname separators need to be inserted, the one that last +previously occurred in the parameters (reading from left to right) +is used. +

+

+No attempt is made to force the resulting filename to be an absolute +path. If the first element is a relative path, the result will +be a relative path.

+
++ + + + + + + + + + + + + + +

first_element :

the first element in the path +

... :

remaining elements in path, terminated by NULL +

Returns :

a newly-allocated string that must be freed with g_free(). +
+
+
+
+

g_build_filenamev ()

+
gchar *             g_build_filenamev                   (gchar **args);
+

+Behaves exactly like g_build_filename(), but takes the path elements +as a string array, instead of varargs. This function is mainly +meant for language bindings.

+
++ + + + + + + + + + +

args :

NULL-terminated array of strings containing the path elements. +

Returns :

a newly-allocated string that must be freed with g_free(). + +
+

Since 2.8

+
+
+
+

g_build_path ()

+
gchar *             g_build_path                        (const gchar *separator,
+                                                         const gchar *first_element,
+                                                         ...);
+

+Creates a path from a series of elements using separator as the +separator between elements. At the boundary between two elements, +any trailing occurrences of separator in the first element, or +leading occurrences of separator in the second element are removed +and exactly one copy of the separator is inserted. +

+

+Empty elements are ignored. +

+

+The number of leading copies of the separator on the result is +the same as the number of leading copies of the separator on +the first non-empty element. +

+

+The number of trailing copies of the separator on the result is +the same as the number of trailing copies of the separator on +the last non-empty element. (Determination of the number of +trailing copies is done without stripping leading copies, so +if the separator is ABA, ABABA +has 1 trailing copy.) +

+

+However, if there is only a single non-empty element, and there +are no characters in that element not part of the leading or +trailing separators, then the result is exactly the original value +of that element. +

+

+Other than for determination of the number of leading and trailing +copies of the separator, elements consisting only of copies +of the separator are ignored.

+
++ + + + + + + + + + + + + + + + + + +

separator :

a string used to separator the elements of the path. +

first_element :

the first element in the path +

... :

remaining elements in path, terminated by NULL +

Returns :

a newly-allocated string that must be freed with g_free(). +
+
+
+
+

g_build_pathv ()

+
gchar *             g_build_pathv                       (const gchar *separator,
+                                                         gchar **args);
+

+Behaves exactly like g_build_path(), but takes the path elements +as a string array, instead of varargs. This function is mainly +meant for language bindings.

+
++ + + + + + + + + + + + + + +

separator :

a string used to separator the elements of the path. +

args :

NULL-terminated array of strings containing the path elements. +

Returns :

a newly-allocated string that must be freed with g_free(). + +
+

Since 2.8

+
+
+
+

g_format_size_for_display ()

+
char *              g_format_size_for_display           (goffset size);
+

+Formats a size (for example the size of a file) into a human readable string. +Sizes are rounded to the nearest size prefix (KB, MB, GB) and are displayed +rounded to the nearest tenth. E.g. the file size 3292528 bytes will be +converted into the string "3.1 MB". +

+

+The prefix units base is 1024 (i.e. 1 KB is 1024 bytes). +

+

+This string should be freed with g_free() when not needed any longer.

+
++ + + + + + + + + + +

size :

a size in bytes. +

Returns :

a newly-allocated formatted string containing a human readable + file size. + +
+

Since 2.16

+
+
+
+

g_find_program_in_path ()

+
gchar*              g_find_program_in_path              (const gchar *program);
+

+Locates the first executable named program in the user's path, in the +same way that execvp() would locate it. Returns an allocated string +with the absolute path name, or NULL if the program is not found in +the path. If program is already an absolute path, returns a copy of +program if program exists and is executable, and NULL otherwise. + +On Windows, if program does not have a file type suffix, tries +with the suffixes .exe, .cmd, .bat and .com, and the suffixes in +the PATHEXT environment variable. +

+

+On Windows, it looks for the file in the same way as CreateProcess() +would. This means first in the directory where the executing +program was loaded from, then in the current directory, then in the +Windows 32-bit system directory, then in the Windows directory, and +finally in the directories in the PATH environment +variable. If the program is found, the return value contains the +full name including the type suffix.

+
++ + + + + + + + + + +

program :

a program name in the GLib file name encoding +

Returns :

absolute path, or NULL +
+
+
+
+

g_bit_nth_lsf ()

+
gint                g_bit_nth_lsf                       (gulong mask,
+                                                         gint nth_bit);
+

+Find the position of the first bit set in mask, searching from (but not +including) nth_bit upwards. Bits are numbered from 0 (least significant) +to sizeof(gulong) * 8 - 1 (31 or 63, usually). To start searching from the +0th bit, set nth_bit to -1. +

+
++ + + + + + + + + + + + + + +

mask :

a gulong containing flags. +

nth_bit :

the index of the bit to start the search from. +

Returns :

the index of the first bit set which is higher than nth_bit. +
+
+
+
+

g_bit_nth_msf ()

+
gint                g_bit_nth_msf                       (gulong mask,
+                                                         gint nth_bit);
+

+Find the position of the first bit set in mask, searching from (but not +including) nth_bit downwards. Bits are numbered from 0 (least significant) +to sizeof(gulong) * 8 - 1 (31 or 63, usually). To start searching from the +last bit, set nth_bit to -1 or GLIB_SIZEOF_LONG * 8. +

+
++ + + + + + + + + + + + + + +

mask :

a gulong containing flags. +

nth_bit :

the index of the bit to start the search from. +

Returns :

the index of the first bit set which is lower than nth_bit. +
+
+
+
+

g_bit_storage ()

+
guint               g_bit_storage                       (gulong number);
+

+Gets the number of bits used to hold number, +e.g. if number is 4, 3 bits are needed. +

+
++ + + + + + + + + + +

number :

a guint. +

Returns :

the number of bits used to hold number. +
+
+
+
+

g_spaced_primes_closest ()

+
guint               g_spaced_primes_closest             (guint num);
+

+Gets the smallest prime number from a built-in array of primes which +is larger than num. This is used within GLib to calculate the optimum +size of a GHashTable. +

+

+The built-in array of primes ranges from 11 to 13845163 such that +each prime is approximately 1.5-2 times the previous prime. +

+
++ + + + + + + + + + +

num :

a guint. +

Returns :

the smallest prime number from a built-in array of primes which is +larger than num. +
+
+
+
+

g_atexit ()

+
void                g_atexit                            (GVoidFunc func);
+

+Specifies a function to be called at normal program termination. +

+

+Since GLib 2.8.2, on Windows g_atexit() actually is a preprocessor +macro that maps to a call to the atexit() function in the C +library. This means that in case the code that calls g_atexit(), +i.e. atexit(), is in a DLL, the function will be called when the +DLL is detached from the program. This typically makes more sense +than that the function is called when the GLib DLL is detached, +which happened earlier when g_atexit() was a function in the GLib +DLL. +

+

+The behaviour of atexit() in the context of dynamically loaded +modules is not formally specified and varies wildly. +

+

+On POSIX systems, calling g_atexit() (or atexit()) in a dynamically +loaded module which is unloaded before the program terminates might +well cause a crash at program exit. +

+

+Some POSIX systems implement atexit() like Windows, and have each +dynamically loaded module maintain an own atexit chain that is +called when the module is unloaded. +

+

+On other POSIX systems, before a dynamically loaded module is +unloaded, the registered atexit functions (if any) residing in that +module are called, regardless where the code that registered them +resided. This is presumably the most robust approach. +

+

+As can be seen from the above, for portability it's best to avoid +calling g_atexit() (or atexit()) except in the main executable of a +program.

+
++ + + + +

func :

the function to call on normal program termination. +
+
+
+
+

g_parse_debug_string ()

+
guint               g_parse_debug_string                (const gchar *string,
+                                                         const GDebugKey *keys,
+                                                         guint nkeys);
+

+Parses a string containing debugging options +into a guint containing bit flags. This is used +within GDK and GTK+ to parse the debug options passed on the +command line or through environment variables. +

+

+If string is equal to "all", all flags are set. If string +is equal to "help", all the available keys in keys are printed +out to standard error.

+
++ + + + + + + + + + + + + + + + + + +

string :

a list of debug options separated by colons, spaces, or +commas, or NULL. +

keys :

pointer to an array of GDebugKey which associate + strings with bit flags. +

nkeys :

the number of GDebugKeys in the array. +

Returns :

the combined set of bit flags. +
+
+
+
+

GDebugKey

+
typedef struct {
+  const gchar *key;
+  guint	       value;
+} GDebugKey;
+
+

+Associates a string with a bit flag. +Used in g_parse_debug_string(). +

+
++ + + + + + + + + + +

const gchar *key;

the string +

guint value;

the flag +
+
+
+
+

GVoidFunc ()

+
void                (*GVoidFunc)                        (void);
+

+Declares a type of function which takes no arguments and has no return value. +It is used to specify the type function passed to g_atexit(). +

+
+
+
+

GFreeFunc ()

+
void                (*GFreeFunc)                        (gpointer data);
+

+Declares a type of function which takes an arbitrary data pointer argument +and has no return value. It is not currently used in GLib or GTK+. +

+
++ + + + +

data :

a data pointer. +
+
+
+
+

g_qsort_with_data ()

+
void                g_qsort_with_data                   (gconstpointer pbase,
+                                                         gint total_elems,
+                                                         gsize size,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+This is just like the standard C qsort() function, but +the comparison routine accepts a user data argument.

+
++ + + + + + + + + + + + + + + + + + + + + + +

pbase :

start of array to sort +

total_elems :

elements in the array +

size :

size of each element +

compare_func :

function to compare elements +

user_data :

data to pass to compare_func +
+
+
+
+

g_nullify_pointer ()

+
void                g_nullify_pointer                   (gpointer *nullify_location);
+

+Set the pointer at the specified location to NULL.

+
++ + + + +

nullify_location :

the memory address of the pointer. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-N-ary-Trees.html b/docs/reference/glib/html/glib-N-ary-Trees.html new file mode 100644 index 0000000..91d96be --- /dev/null +++ b/docs/reference/glib/html/glib-N-ary-Trees.html @@ -0,0 +1,1434 @@ + + + + +N-ary Trees + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

N-ary Trees

+

N-ary Trees — trees of data with any number of branches

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GNode;
+GNode*              g_node_new                          (gpointer data);
+GNode*              g_node_copy                         (GNode *node);
+gpointer            (*GCopyFunc)                        (gconstpointer src,
+                                                         gpointer data);
+GNode*              g_node_copy_deep                    (GNode *node,
+                                                         GCopyFunc copy_func,
+                                                         gpointer data);
+
+GNode*              g_node_insert                       (GNode *parent,
+                                                         gint position,
+                                                         GNode *node);
+GNode*              g_node_insert_before                (GNode *parent,
+                                                         GNode *sibling,
+                                                         GNode *node);
+GNode*              g_node_insert_after                 (GNode *parent,
+                                                         GNode *sibling,
+                                                         GNode *node);
+#define             g_node_append                       (parent, node)
+GNode*              g_node_prepend                      (GNode *parent,
+                                                         GNode *node);
+
+#define             g_node_insert_data                  (parent, position, data)
+#define             g_node_insert_data_before           (parent, sibling, data)
+#define             g_node_append_data                  (parent, data)
+#define             g_node_prepend_data                 (parent, data)
+
+void                g_node_reverse_children             (GNode *node);
+void                g_node_traverse                     (GNode *root,
+                                                         GTraverseType order,
+                                                         GTraverseFlags flags,
+                                                         gint max_depth,
+                                                         GNodeTraverseFunc func,
+                                                         gpointer data);
+enum                GTraverseFlags;
+gboolean            (*GNodeTraverseFunc)                (GNode *node,
+                                                         gpointer data);
+void                g_node_children_foreach             (GNode *node,
+                                                         GTraverseFlags flags,
+                                                         GNodeForeachFunc func,
+                                                         gpointer data);
+void                (*GNodeForeachFunc)                 (GNode *node,
+                                                         gpointer data);
+
+GNode*              g_node_get_root                     (GNode *node);
+GNode*              g_node_find                         (GNode *root,
+                                                         GTraverseType order,
+                                                         GTraverseFlags flags,
+                                                         gpointer data);
+GNode*              g_node_find_child                   (GNode *node,
+                                                         GTraverseFlags flags,
+                                                         gpointer data);
+gint                g_node_child_index                  (GNode *node,
+                                                         gpointer data);
+gint                g_node_child_position               (GNode *node,
+                                                         GNode *child);
+#define             g_node_first_child                  (node)
+GNode*              g_node_last_child                   (GNode *node);
+GNode*              g_node_nth_child                    (GNode *node,
+                                                         guint n);
+GNode*              g_node_first_sibling                (GNode *node);
+#define             g_node_next_sibling                 (node)
+#define             g_node_prev_sibling                 (node)
+GNode*              g_node_last_sibling                 (GNode *node);
+
+#define             G_NODE_IS_LEAF                      (node)
+#define             G_NODE_IS_ROOT                      (node)
+guint               g_node_depth                        (GNode *node);
+guint               g_node_n_nodes                      (GNode *root,
+                                                         GTraverseFlags flags);
+guint               g_node_n_children                   (GNode *node);
+gboolean            g_node_is_ancestor                  (GNode *node,
+                                                         GNode *descendant);
+guint               g_node_max_height                   (GNode *root);
+
+void                g_node_unlink                       (GNode *node);
+void                g_node_destroy                      (GNode *root);
+
+void                g_node_push_allocator               (gpointer dummy);
+void                g_node_pop_allocator                (void);
+
+
+
+

Description

+

+The GNode struct and its associated functions provide a N-ary tree +data structure, where nodes in the tree can contain arbitrary data. +

+

+To create a new tree use g_node_new(). +

+

+To insert a node into a tree use g_node_insert(), +g_node_insert_before(), g_node_append() and g_node_prepend(). +

+

+To create a new node and insert it into a tree use +g_node_insert_data(), g_node_insert_data_before(), +g_node_append_data() and g_node_prepend_data(). +

+

+To reverse the children of a node use g_node_reverse_children(). +

+

+To find a node use g_node_get_root(), g_node_find(), +g_node_find_child(), g_node_child_index(), g_node_child_position(), +g_node_first_child(), g_node_last_child(), g_node_nth_child(), +g_node_first_sibling(), g_node_prev_sibling(), g_node_next_sibling() +or g_node_last_sibling(). +

+

+To get information about a node or tree use G_NODE_IS_LEAF(), +G_NODE_IS_ROOT(), g_node_depth(), g_node_n_nodes(), +g_node_n_children(), g_node_is_ancestor() or g_node_max_height(). +

+

+To traverse a tree, calling a function for each node visited in the +traversal, use g_node_traverse() or g_node_children_foreach(). +

+

+To remove a node or subtree from a tree use g_node_unlink() or +g_node_destroy().

+
+
+

Details

+
+

GNode

+
typedef struct {
+  gpointer data;
+  GNode	  *next;
+  GNode	  *prev;
+  GNode	  *parent;
+  GNode	  *children;
+} GNode;
+
+

+The GNode struct represents one node in a +N-ary Tree. fields

+
++ + + + + + + + + + + + + + + + + + + + + + +

gpointer data;

contains the actual data of the node. +

GNode *next;

points to the node's next sibling (a sibling is another + GNode with the same parent). +

GNode *prev;

points to the node's previous sibling. +

GNode *parent;

points to the parent of the GNode, or is NULL if the + GNode is the root of the tree. +

GNode *children;

points to the first child of the GNode. The other + children are accessed by using the next pointer of each + child. +
+
+
+
+

g_node_new ()

+
GNode*              g_node_new                          (gpointer data);
+

+Creates a new GNode containing the given data. +Used to create the first node in a tree.

+
++ + + + + + + + + + +

data :

the data of the new node +

Returns :

a new GNode +
+
+
+
+

g_node_copy ()

+
GNode*              g_node_copy                         (GNode *node);
+

+Recursively copies a GNode (but does not deep-copy the data inside the +nodes, see g_node_copy_deep() if you need that).

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

a new GNode containing the same data pointers +
+
+
+
+

GCopyFunc ()

+
gpointer            (*GCopyFunc)                        (gconstpointer src,
+                                                         gpointer data);
+

+A function of this signature is used to copy the node data +when doing a deep-copy of a tree.

+
++ + + + + + + + + + + + + + +

src :

A pointer to the data which should be copied +

data :

Additional data +

Returns :

A pointer to the copy + +
+

Since 2.4

+
+
+
+

g_node_copy_deep ()

+
GNode*              g_node_copy_deep                    (GNode *node,
+                                                         GCopyFunc copy_func,
+                                                         gpointer data);
+

+Recursively copies a GNode and its data.

+
++ + + + + + + + + + + + + + + + + + +

node :

a GNode +

copy_func :

the function which is called to copy the data inside each node, + or NULL to use the original data. +

data :

data to pass to copy_func +

Returns :

a new GNode containing copies of the data in node. + +
+

Since 2.4

+
+
+
+

g_node_insert ()

+
GNode*              g_node_insert                       (GNode *parent,
+                                                         gint position,
+                                                         GNode *node);
+

+Inserts a GNode beneath the parent at the given position.

+
++ + + + + + + + + + + + + + + + + + +

parent :

the GNode to place node under +

position :

the position to place node at, with respect to its siblings + If position is -1, node is inserted as the last child of parent +

node :

the GNode to insert +

Returns :

the inserted GNode +
+
+
+
+

g_node_insert_before ()

+
GNode*              g_node_insert_before                (GNode *parent,
+                                                         GNode *sibling,
+                                                         GNode *node);
+

+Inserts a GNode beneath the parent before the given sibling.

+
++ + + + + + + + + + + + + + + + + + +

parent :

the GNode to place node under +

sibling :

the sibling GNode to place node before. + If sibling is NULL, the node is inserted as the last child of parent. +

node :

the GNode to insert +

Returns :

the inserted GNode +
+
+
+
+

g_node_insert_after ()

+
GNode*              g_node_insert_after                 (GNode *parent,
+                                                         GNode *sibling,
+                                                         GNode *node);
+

+Inserts a GNode beneath the parent after the given sibling.

+
++ + + + + + + + + + + + + + + + + + +

parent :

the GNode to place node under +

sibling :

the sibling GNode to place node after. + If sibling is NULL, the node is inserted as the first child of parent. +

node :

the GNode to insert +

Returns :

the inserted GNode +
+
+
+
+

g_node_append()

+
#define             g_node_append(parent, node)
+

+Inserts a GNode as the last child of the given parent.

+
++ + + + + + + + + + + + + + +

parent :

the GNode to place the new GNode under +

node :

the GNode to insert +

Returns :

the inserted GNode +
+
+
+
+

g_node_prepend ()

+
GNode*              g_node_prepend                      (GNode *parent,
+                                                         GNode *node);
+

+Inserts a GNode as the first child of the given parent.

+
++ + + + + + + + + + + + + + +

parent :

the GNode to place the new GNode under +

node :

the GNode to insert +

Returns :

the inserted GNode +
+
+
+
+

g_node_insert_data()

+
#define             g_node_insert_data(parent, position, data)
+

+Inserts a new GNode at the given position.

+
++ + + + + + + + + + + + + + + + + + +

parent :

the GNode to place the new GNode under +

position :

the position to place the new GNode at. If position is -1, + the new GNode is inserted as the last child of parent +

data :

the data for the new GNode +

Returns :

the new GNode +
+
+
+
+

g_node_insert_data_before()

+
#define             g_node_insert_data_before(parent, sibling, data)
+

+Inserts a new GNode before the given sibling.

+
++ + + + + + + + + + + + + + + + + + +

parent :

the GNode to place the new GNode under +

sibling :

the sibling GNode to place the new GNode before +

data :

the data for the new GNode +

Returns :

the new GNode +
+
+
+
+

g_node_append_data()

+
#define             g_node_append_data(parent, data)
+

+Inserts a new GNode as the last child of the given parent.

+
++ + + + + + + + + + + + + + +

parent :

the GNode to place the new GNode under +

data :

the data for the new GNode +

Returns :

the new GNode +
+
+
+
+

g_node_prepend_data()

+
#define             g_node_prepend_data(parent, data)
+

+Inserts a new GNode as the first child of the given parent.

+
++ + + + + + + + + + + + + + +

parent :

the GNode to place the new GNode under +

data :

the data for the new GNode +

Returns :

the new GNode +
+
+
+
+

g_node_reverse_children ()

+
void                g_node_reverse_children             (GNode *node);
+

+Reverses the order of the children of a GNode. +(It doesn't change the order of the grandchildren.)

+
++ + + + +

node :

a GNode. +
+
+
+
+

g_node_traverse ()

+
void                g_node_traverse                     (GNode *root,
+                                                         GTraverseType order,
+                                                         GTraverseFlags flags,
+                                                         gint max_depth,
+                                                         GNodeTraverseFunc func,
+                                                         gpointer data);
+

+Traverses a tree starting at the given root GNode. +It calls the given function for each node visited. +The traversal can be halted at any point by returning TRUE from func.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

root :

the root GNode of the tree to traverse +

order :

the order in which nodes are visited - G_IN_ORDER, + G_PRE_ORDER, G_POST_ORDER, or G_LEVEL_ORDER. +

flags :

which types of children are to be visited, one of + G_TRAVERSE_ALL, G_TRAVERSE_LEAVES and G_TRAVERSE_NON_LEAVES +

max_depth :

the maximum depth of the traversal. Nodes below this + depth will not be visited. If max_depth is -1 all nodes in + the tree are visited. If depth is 1, only the root is visited. + If depth is 2, the root and its children are visited. And so on. +

func :

the function to call for each visited GNode +

data :

user data to pass to the function +
+
+
+
+

enum GTraverseFlags

+
typedef enum
+{
+  G_TRAVERSE_LEAVES     = 1 << 0,
+  G_TRAVERSE_NON_LEAVES = 1 << 1,
+  G_TRAVERSE_ALL        = G_TRAVERSE_LEAVES | G_TRAVERSE_NON_LEAVES,
+  G_TRAVERSE_MASK       = 0x03,
+  G_TRAVERSE_LEAFS      = G_TRAVERSE_LEAVES,
+  G_TRAVERSE_NON_LEAFS  = G_TRAVERSE_NON_LEAVES
+} GTraverseFlags;
+
+

+Specifies which nodes are visited during several of the tree +functions, including g_node_traverse() and g_node_find().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

G_TRAVERSE_LEAVES

only leaf nodes should be visited. This name has + been introduced in 2.6, for older version use + G_TRAVERSE_LEAFS. +

G_TRAVERSE_NON_LEAVES

only non-leaf nodes should be visited. This + name has been introduced in 2.6, for older + version use G_TRAVERSE_NON_LEAFS. +

G_TRAVERSE_ALL

all nodes should be visited. +

G_TRAVERSE_MASK

a mask of all traverse flags. +

G_TRAVERSE_LEAFS

identical to G_TRAVERSE_LEAVES. +

G_TRAVERSE_NON_LEAFS

identical to G_TRAVERSE_NON_LEAVES. +
+
+
+
+

GNodeTraverseFunc ()

+
gboolean            (*GNodeTraverseFunc)                (GNode *node,
+                                                         gpointer data);
+

+Specifies the type of function passed to g_node_traverse(). The +function is called with each of the nodes visited, together with the +user data passed to g_node_traverse(). If the function returns +TRUE, then the traversal is stopped.

+
++ + + + + + + + + + + + + + +

node :

a GNode. +

data :

user data passed to g_node_traverse(). +

Returns :

TRUE to stop the traversal. +
+
+
+
+

g_node_children_foreach ()

+
void                g_node_children_foreach             (GNode *node,
+                                                         GTraverseFlags flags,
+                                                         GNodeForeachFunc func,
+                                                         gpointer data);
+

+Calls a function for each of the children of a GNode. +Note that it doesn't descend beneath the child nodes.

+
++ + + + + + + + + + + + + + + + + + +

node :

a GNode +

flags :

which types of children are to be visited, one of + G_TRAVERSE_ALL, G_TRAVERSE_LEAVES and G_TRAVERSE_NON_LEAVES +

func :

the function to call for each visited node +

data :

user data to pass to the function +
+
+
+
+

GNodeForeachFunc ()

+
void                (*GNodeForeachFunc)                 (GNode *node,
+                                                         gpointer data);
+

+Specifies the type of function passed to g_node_children_foreach(). +The function is called with each child node, together with the user +data passed to g_node_children_foreach().

+
++ + + + + + + + + + +

node :

a GNode. +

data :

user data passed to g_node_children_foreach(). +
+
+
+
+

g_node_get_root ()

+
GNode*              g_node_get_root                     (GNode *node);
+

+Gets the root of a tree.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the root of the tree +
+
+
+
+

g_node_find ()

+
GNode*              g_node_find                         (GNode *root,
+                                                         GTraverseType order,
+                                                         GTraverseFlags flags,
+                                                         gpointer data);
+

+Finds a GNode in a tree.

+
++ + + + + + + + + + + + + + + + + + + + + + +

root :

the root GNode of the tree to search +

order :

the order in which nodes are visited - G_IN_ORDER, + G_PRE_ORDER, G_POST_ORDER, or G_LEVEL_ORDER +

flags :

which types of children are to be searched, one of + G_TRAVERSE_ALL, G_TRAVERSE_LEAVES and G_TRAVERSE_NON_LEAVES +

data :

the data to find +

Returns :

the found GNode, or NULL if the data is not found +
+
+
+
+

g_node_find_child ()

+
GNode*              g_node_find_child                   (GNode *node,
+                                                         GTraverseFlags flags,
+                                                         gpointer data);
+

+Finds the first child of a GNode with the given data.

+
++ + + + + + + + + + + + + + + + + + +

node :

a GNode +

flags :

which types of children are to be searched, one of + G_TRAVERSE_ALL, G_TRAVERSE_LEAVES and G_TRAVERSE_NON_LEAVES +

data :

the data to find +

Returns :

the found child GNode, or NULL if the data is not found +
+
+
+
+

g_node_child_index ()

+
gint                g_node_child_index                  (GNode *node,
+                                                         gpointer data);
+

+Gets the position of the first child of a GNode +which contains the given data.

+
++ + + + + + + + + + + + + + +

node :

a GNode +

data :

the data to find +

Returns :

the index of the child of node which contains + data, or -1 if the data is not found +
+
+
+
+

g_node_child_position ()

+
gint                g_node_child_position               (GNode *node,
+                                                         GNode *child);
+

+Gets the position of a GNode with respect to its siblings. +child must be a child of node. The first child is numbered 0, +the second 1, and so on.

+
++ + + + + + + + + + + + + + +

node :

a GNode +

child :

a child of node +

Returns :

the position of child with respect to its siblings +
+
+
+
+

g_node_first_child()

+
#define             g_node_first_child(node)
+

+Gets the first child of a GNode.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the first child of node, or NULL if node is NULL + or has no children +
+
+
+
+

g_node_last_child ()

+
GNode*              g_node_last_child                   (GNode *node);
+

+Gets the last child of a GNode.

+
++ + + + + + + + + + +

node :

a GNode (must not be NULL) +

Returns :

the last child of node, or NULL if node has no children +
+
+
+
+

g_node_nth_child ()

+
GNode*              g_node_nth_child                    (GNode *node,
+                                                         guint n);
+

+Gets a child of a GNode, using the given index. +The first child is at index 0. If the index is +too big, NULL is returned.

+
++ + + + + + + + + + + + + + +

node :

a GNode +

n :

the index of the desired child +

Returns :

the child of node at index n +
+
+
+
+

g_node_first_sibling ()

+
GNode*              g_node_first_sibling                (GNode *node);
+

+Gets the first sibling of a GNode. +This could possibly be the node itself.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the first sibling of node +
+
+
+
+

g_node_next_sibling()

+
#define             g_node_next_sibling(node)
+

+Gets the next sibling of a GNode.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the next sibling of node, or NULL if node is NULL +
+
+
+
+

g_node_prev_sibling()

+
#define             g_node_prev_sibling(node)
+

+Gets the previous sibling of a GNode.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the previous sibling of node, or NULL if node is NULL +
+
+
+
+

g_node_last_sibling ()

+
GNode*              g_node_last_sibling                 (GNode *node);
+

+Gets the last sibling of a GNode. +This could possibly be the node itself.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the last sibling of node +
+
+
+
+

G_NODE_IS_LEAF()

+
#define	 G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL)
+
+

+Returns TRUE if a GNode is a leaf node.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

TRUE if the GNode is a leaf node + (i.e. it has no children) +
+
+
+
+

G_NODE_IS_ROOT()

+
#define             G_NODE_IS_ROOT(node)
+

+Returns TRUE if a GNode is the root of a tree.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

TRUE if the GNode is the root of a tree + (i.e. it has no parent or siblings) +
+
+
+
+

g_node_depth ()

+
guint               g_node_depth                        (GNode *node);
+

+Gets the depth of a GNode. +

+

+If node is NULL the depth is 0. The root node has a depth of 1. +For the children of the root node the depth is 2. And so on.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the depth of the GNode +
+
+
+
+

g_node_n_nodes ()

+
guint               g_node_n_nodes                      (GNode *root,
+                                                         GTraverseFlags flags);
+

+Gets the number of nodes in a tree.

+
++ + + + + + + + + + + + + + +

root :

a GNode +

flags :

which types of children are to be counted, one of + G_TRAVERSE_ALL, G_TRAVERSE_LEAVES and G_TRAVERSE_NON_LEAVES +

Returns :

the number of nodes in the tree +
+
+
+
+

g_node_n_children ()

+
guint               g_node_n_children                   (GNode *node);
+

+Gets the number of children of a GNode.

+
++ + + + + + + + + + +

node :

a GNode +

Returns :

the number of children of node +
+
+
+
+

g_node_is_ancestor ()

+
gboolean            g_node_is_ancestor                  (GNode *node,
+                                                         GNode *descendant);
+

+Returns TRUE if node is an ancestor of descendant. +This is true if node is the parent of descendant, +or if node is the grandparent of descendant etc.

+
++ + + + + + + + + + + + + + +

node :

a GNode +

descendant :

a GNode +

Returns :

TRUE if node is an ancestor of descendant +
+
+
+
+

g_node_max_height ()

+
guint               g_node_max_height                   (GNode *root);
+

+Gets the maximum height of all branches beneath a GNode. +This is the maximum distance from the GNode to all leaf nodes. +

+

+If root is NULL, 0 is returned. If root has no children, +1 is returned. If root has children, 2 is returned. And so on.

+
++ + + + + + + + + + +

root :

a GNode +

Returns :

the maximum height of the tree beneath root +
+
+
+
+

g_node_unlink ()

+
void                g_node_unlink                       (GNode *node);
+

+Unlinks a GNode from a tree, resulting in two separate trees.

+
++ + + + +

node :

the GNode to unlink, which becomes the root of a new tree +
+
+
+
+

g_node_destroy ()

+
void                g_node_destroy                      (GNode *root);
+

+Removes root and its children from the tree, freeing any memory +allocated.

+
++ + + + +

root :

the root of the tree/subtree to destroy +
+
+
+
+

g_node_push_allocator ()

+
void                g_node_push_allocator               (gpointer dummy);
+
+

Warning

+

g_node_push_allocator has been deprecated since version 2.10 and should not be used in newly-written code. It does nothing, since GNode has been converted to + the slice + allocator

+
+

+Sets the allocator to use to allocate GNode elements. Use +g_node_pop_allocator() to restore the previous allocator. +

+

+Note that this function is not available if GLib has been compiled +with --disable-mem-pools

+
++ + + + +

dummy :

the GAllocator to use when allocating GNode elements. +
+
+
+
+

g_node_pop_allocator ()

+
void                g_node_pop_allocator                (void);
+
+

Warning

+

g_node_pop_allocator has been deprecated since version 2.10 and should not be used in newly-written code. It does nothing, since GNode has been converted to + the slice + allocator

+
+

+Restores the previous GAllocator, used when allocating GNode +elements. +

+

+Note that this function is not available if GLib has been compiled +with --disable-mem-pools

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Numerical-Definitions.html b/docs/reference/glib/html/glib-Numerical-Definitions.html new file mode 100644 index 0000000..e9d5ba6 --- /dev/null +++ b/docs/reference/glib/html/glib-Numerical-Definitions.html @@ -0,0 +1,243 @@ + + + + +Numerical Definitions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Numerical Definitions

+

Numerical Definitions — mathematical constants, and floating point decomposition

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_IEEE754_FLOAT_BIAS
+#define             G_IEEE754_DOUBLE_BIAS
+union               GFloatIEEE754;
+union               GDoubleIEEE754;
+
+
+#define             G_E
+#define             G_LN2
+#define             G_LN10
+#define             G_PI
+#define             G_PI_2
+#define             G_PI_4
+#define             G_SQRT2
+#define             G_LOG_2_BASE_10
+
+
+
+

Description

+

+GLib offers mathematical constants such as G_PI for the value of pi; +many platforms have these in the C library, but some don't, the GLib +versions always exist. +

+

+The GFloatIEEE754 and GDoubleIEEE754 unions are used to access the + sign, mantissa and exponent of IEEE floats and doubles. These + unions are defined as appropriate for a given platform. + IEEE floats and doubles are supported (used for + storage) by at least Intel, PPC and Sparc, for reference: http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html +

+
+
+

Details

+
+

G_IEEE754_FLOAT_BIAS

+
#define G_IEEE754_FLOAT_BIAS (127)
+
+

+See http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html +

+
+
+
+

G_IEEE754_DOUBLE_BIAS

+
#define G_IEEE754_DOUBLE_BIAS (1023)
+
+

+See http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html +

+
+
+
+

union GFloatIEEE754

+
union GFloatIEEE754
+{
+  gfloat v_float;
+  struct {
+    guint mantissa : 23;
+    guint biased_exponent : 8;
+    guint sign : 1;
+  } mpn;
+};
+
+

+The GFloatIEEE754 and GDoubleIEEE754 unions are used to access the + sign, mantissa and exponent of IEEE floats and doubles. These + unions are defined as appropriate for a given platform. + IEEE floats and doubles are supported (used for + storage) by at least Intel, PPC and Sparc, for reference: +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html +

+
+
+
+

union GDoubleIEEE754

+
union GDoubleIEEE754
+{
+  gdouble v_double;
+  struct {
+    guint mantissa_low : 32;
+    guint mantissa_high : 20;
+    guint biased_exponent : 11;
+    guint sign : 1;
+  } mpn;
+};
+
+

+The GFloatIEEE754 and GDoubleIEEE754 unions are used to access the + sign, mantissa and exponent of IEEE floats and doubles. These + unions are defined as appropriate for a given platform. + IEEE floats and doubles are supported (used for + storage) by at least Intel, PPC and Sparc, for reference: +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html +

+
+
+
+

G_E

+
#define G_E     2.7182818284590452353602874713526624977572470937000
+
+

+The base of natural logarithms. +

+
+
+
+

G_LN2

+
#define G_LN2   0.69314718055994530941723212145817656807550013436026
+
+

+The natural logarithm of 2. +

+
+
+
+

G_LN10

+
#define G_LN10  2.3025850929940456840179914546843642076011014886288
+
+

+The natural logarithm of 10. +

+
+
+
+

G_PI

+
#define G_PI    3.1415926535897932384626433832795028841971693993751
+
+

+The value of pi (ratio of circle's circumference to its diameter). +

+
+
+
+

G_PI_2

+
#define G_PI_2  1.5707963267948966192313216916397514420985846996876
+
+

+Pi divided by 2. +

+
+
+
+

G_PI_4

+
#define G_PI_4  0.78539816339744830961566084581987572104929234984378
+
+

+Pi divided by 4. +

+
+
+
+

G_SQRT2

+
#define G_SQRT2 1.4142135623730950488016887242096980785696718753769
+
+

+The square root of two. +

+
+
+
+

G_LOG_2_BASE_10

+
#define G_LOG_2_BASE_10		(0.30102999566398119521)
+
+

+Used for fooling around with float formats, see +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html +

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Perl-compatible-regular-expressions.html b/docs/reference/glib/html/glib-Perl-compatible-regular-expressions.html new file mode 100644 index 0000000..07af546 --- /dev/null +++ b/docs/reference/glib/html/glib-Perl-compatible-regular-expressions.html @@ -0,0 +1,2529 @@ + + + + +Perl-compatible regular expressions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Perl-compatible regular expressions

+

Perl-compatible regular expressions — matches strings against regular expressions

+
+
+

Synopsis

+
+#include <glib.h>
+
+enum                GRegexError;
+#define             G_REGEX_ERROR
+enum                GRegexCompileFlags;
+enum                GRegexMatchFlags;
+                    GRegex;
+gboolean            (*GRegexEvalCallback)               (const GMatchInfo *match_info,
+                                                         GString *result,
+                                                         gpointer user_data);
+GRegex *            g_regex_new                         (const gchar *pattern,
+                                                         GRegexCompileFlags compile_options,
+                                                         GRegexMatchFlags match_options,
+                                                         GError **error);
+GRegex *            g_regex_ref                         (GRegex *regex);
+void                g_regex_unref                       (GRegex *regex);
+const gchar *       g_regex_get_pattern                 (const GRegex *regex);
+gint                g_regex_get_max_backref             (const GRegex *regex);
+gint                g_regex_get_capture_count           (const GRegex *regex);
+gint                g_regex_get_string_number           (const GRegex *regex,
+                                                         const gchar *name);
+gchar *             g_regex_escape_string               (const gchar *string,
+                                                         gint length);
+gboolean            g_regex_match_simple                (const gchar *pattern,
+                                                         const gchar *string,
+                                                         GRegexCompileFlags compile_options,
+                                                         GRegexMatchFlags match_options);
+gboolean            g_regex_match                       (const GRegex *regex,
+                                                         const gchar *string,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info);
+gboolean            g_regex_match_full                  (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info,
+                                                         GError **error);
+gboolean            g_regex_match_all                   (const GRegex *regex,
+                                                         const gchar *string,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info);
+gboolean            g_regex_match_all_full              (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info,
+                                                         GError **error);
+gchar **            g_regex_split_simple                (const gchar *pattern,
+                                                         const gchar *string,
+                                                         GRegexCompileFlags compile_options,
+                                                         GRegexMatchFlags match_options);
+gchar **            g_regex_split                       (const GRegex *regex,
+                                                         const gchar *string,
+                                                         GRegexMatchFlags match_options);
+gchar **            g_regex_split_full                  (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         gint max_tokens,
+                                                         GError **error);
+gchar *             g_regex_replace                     (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         const gchar *replacement,
+                                                         GRegexMatchFlags match_options,
+                                                         GError **error);
+gchar *             g_regex_replace_literal             (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         const gchar *replacement,
+                                                         GRegexMatchFlags match_options,
+                                                         GError **error);
+gchar *             g_regex_replace_eval                (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         GRegexEvalCallback eval,
+                                                         gpointer user_data,
+                                                         GError **error);
+gboolean            g_regex_check_replacement           (const gchar *replacement,
+                                                         gboolean *has_references,
+                                                         GError **error);
+                    GMatchInfo;
+GRegex *            g_match_info_get_regex              (const GMatchInfo *match_info);
+const gchar *       g_match_info_get_string             (const GMatchInfo *match_info);
+void                g_match_info_free                   (GMatchInfo *match_info);
+gboolean            g_match_info_matches                (const GMatchInfo *match_info);
+gboolean            g_match_info_next                   (GMatchInfo *match_info,
+                                                         GError **error);
+gint                g_match_info_get_match_count        (const GMatchInfo *match_info);
+gboolean            g_match_info_is_partial_match       (const GMatchInfo *match_info);
+gchar *             g_match_info_expand_references      (const GMatchInfo *match_info,
+                                                         const gchar *string_to_expand,
+                                                         GError **error);
+gchar *             g_match_info_fetch                  (const GMatchInfo *match_info,
+                                                         gint match_num);
+gboolean            g_match_info_fetch_pos              (const GMatchInfo *match_info,
+                                                         gint match_num,
+                                                         gint *start_pos,
+                                                         gint *end_pos);
+gchar *             g_match_info_fetch_named            (const GMatchInfo *match_info,
+                                                         const gchar *name);
+gboolean            g_match_info_fetch_named_pos        (const GMatchInfo *match_info,
+                                                         const gchar *name,
+                                                         gint *start_pos,
+                                                         gint *end_pos);
+gchar **            g_match_info_fetch_all              (const GMatchInfo *match_info);
+
+
+
+

Description

+

+The g_regex_*() functions implement regular +expression pattern matching using syntax and semantics similar to +Perl regular expression. +

+

+Some functions accept a start_position argument, +setting it differs from just passing over a shortened string and setting +G_REGEX_MATCH_NOTBOL in the case of a pattern that begins with any kind +of lookbehind assertion. +For example, consider the pattern "\Biss\B" which finds occurrences of "iss" +in the middle of words. ("\B" matches only if the current position in the +subject is not a word boundary.) When applied to the string "Mississipi" +from the fourth byte, namely "issipi", it does not match, because "\B" is +always false at the start of the subject, which is deemed to be a word +boundary. However, if the entire string is passed , but with +start_position set to 4, it finds the second +occurrence of "iss" because it is able to look behind the starting point +to discover that it is preceded by a letter. +

+

+Note that, unless you set the G_REGEX_RAW flag, all the strings passed +to these functions must be encoded in UTF-8. The lengths and the positions +inside the strings are in bytes and not in characters, so, for instance, +"\xc3\xa0" (i.e. "à") is two bytes long but it is treated as a single +character. If you set G_REGEX_RAW the strings can be non-valid UTF-8 +strings and a byte is treated as a character, so "\xc3\xa0" is two bytes +and two characters long. +

+

+When matching a pattern, "\n" matches only against a "\n" character in the +string, and "\r" matches only a "\r" character. To match any newline sequence +use "\R". This particular group matches either the two-character sequence +CR + LF ("\r\n"), or one of the single characters LF (linefeed, U+000A, "\n"), VT +(vertical tab, U+000B, "\v"), FF (formfeed, U+000C, "\f"), CR (carriage return, +U+000D, "\r"), NEL (next line, U+0085), LS (line separator, U+2028), or PS +(paragraph separator, U+2029). +

+

+The behaviour of the dot, circumflex, and dollar metacharacters are affected by +newline characters, the default is to recognize any newline character (the same +characters recognized by "\R"). This can be changed with G_REGEX_NEWLINE_CR, +G_REGEX_NEWLINE_LF and G_REGEX_NEWLINE_CRLF compile options, +and with G_REGEX_MATCH_NEWLINE_ANY, G_REGEX_MATCH_NEWLINE_CR, +G_REGEX_MATCH_NEWLINE_LF and G_REGEX_MATCH_NEWLINE_CRLF match options. +These settings are also relevant when compiling a pattern if +G_REGEX_EXTENDED is set, and an unescaped "#" outside a character class is +encountered. This indicates a comment that lasts until after the next +newline. +

+

+Creating and manipulating the same GRegex structure from different +threads is not a problem as GRegex does not modify its internal +state between creation and destruction, on the other hand GMatchInfo is +not threadsafe. +

+

+The regular expressions low level functionalities are obtained through +the excellent PCRE library +written by Philip Hazel. +

+
+
+

Details

+
+

enum GRegexError

+
typedef enum
+{
+  G_REGEX_ERROR_COMPILE,
+  G_REGEX_ERROR_OPTIMIZE,
+  G_REGEX_ERROR_REPLACE,
+  G_REGEX_ERROR_MATCH,
+  G_REGEX_ERROR_INTERNAL,
+
+  /* These are the error codes from PCRE + 100 */
+  G_REGEX_ERROR_STRAY_BACKSLASH = 101,
+  G_REGEX_ERROR_MISSING_CONTROL_CHAR = 102,
+  G_REGEX_ERROR_UNRECOGNIZED_ESCAPE = 103,
+  G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER = 104,
+  G_REGEX_ERROR_QUANTIFIER_TOO_BIG = 105,
+  G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS = 106,
+  G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS = 107,
+  G_REGEX_ERROR_RANGE_OUT_OF_ORDER = 108,
+  G_REGEX_ERROR_NOTHING_TO_REPEAT = 109,
+  G_REGEX_ERROR_UNRECOGNIZED_CHARACTER = 112,
+  G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS = 113,
+  G_REGEX_ERROR_UNMATCHED_PARENTHESIS = 114,
+  G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE = 115,
+  G_REGEX_ERROR_UNTERMINATED_COMMENT = 118,
+  G_REGEX_ERROR_EXPRESSION_TOO_LARGE = 120,
+  G_REGEX_ERROR_MEMORY_ERROR = 121,
+  G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND = 125,
+  G_REGEX_ERROR_MALFORMED_CONDITION = 126,
+  G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES = 127,
+  G_REGEX_ERROR_ASSERTION_EXPECTED = 128,
+  G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME = 130,
+  G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED = 131,
+  G_REGEX_ERROR_HEX_CODE_TOO_LARGE = 134,
+  G_REGEX_ERROR_INVALID_CONDITION = 135,
+  G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND = 136,
+  G_REGEX_ERROR_INFINITE_LOOP = 140,
+  G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR = 142,
+  G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME = 143,
+  G_REGEX_ERROR_MALFORMED_PROPERTY = 146,
+  G_REGEX_ERROR_UNKNOWN_PROPERTY = 147,
+  G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG = 148,
+  G_REGEX_ERROR_TOO_MANY_SUBPATTERNS = 149,
+  G_REGEX_ERROR_INVALID_OCTAL_VALUE = 151,
+  G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE = 154,
+  G_REGEX_ERROR_DEFINE_REPETION = 155,
+  G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS = 156,
+  G_REGEX_ERROR_MISSING_BACK_REFERENCE = 157
+} GRegexError;
+
+

+Error codes returned by regular expressions functions. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_REGEX_ERROR_COMPILE

Compilation of the regular expression failed. +

G_REGEX_ERROR_OPTIMIZE

Optimization of the regular expression failed. +

G_REGEX_ERROR_REPLACE

Replacement failed due to an ill-formed replacement string. +

G_REGEX_ERROR_MATCH

The match process failed. +

G_REGEX_ERROR_INTERNAL

Internal error of the regular expression engine. Since 2.16 +

G_REGEX_ERROR_STRAY_BACKSLASH

"\\" at end of pattern. Since 2.16 +

G_REGEX_ERROR_MISSING_CONTROL_CHAR

"\\c" at end of pattern. Since 2.16 +

G_REGEX_ERROR_UNRECOGNIZED_ESCAPE

Unrecognized character follows "\\". Since 2.16 +

G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER

Numbers out of order in "{}" quantifier. Since 2.16 +

G_REGEX_ERROR_QUANTIFIER_TOO_BIG

Number too big in "{}" quantifier. Since 2.16 +

G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS

Missing terminating "]" for character class. Since 2.16 +

G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS

Invalid escape sequence in character class. Since 2.16 +

G_REGEX_ERROR_RANGE_OUT_OF_ORDER

Range out of order in character class. Since 2.16 +

G_REGEX_ERROR_NOTHING_TO_REPEAT

Nothing to repeat. Since 2.16 +

G_REGEX_ERROR_UNRECOGNIZED_CHARACTER

Unrecognized character after "(?", "(?<" or "(?P". Since 2.16 +

G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS

POSIX named classes are supported only within a class. Since 2.16 +

G_REGEX_ERROR_UNMATCHED_PARENTHESIS

Missing terminating ")" or ")" without opening "(". Since 2.16 +

G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE

Reference to non-existent subpattern. Since 2.16 +

G_REGEX_ERROR_UNTERMINATED_COMMENT

Missing terminating ")" after comment. Since 2.16 +

G_REGEX_ERROR_EXPRESSION_TOO_LARGE

Regular expression too large. Since 2.16 +

G_REGEX_ERROR_MEMORY_ERROR

Failed to get memory. Since 2.16 +

G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND

Lookbehind assertion is not fixed length. Since 2.16 +

G_REGEX_ERROR_MALFORMED_CONDITION

Malformed number or name after "(?(". Since 2.16 +

G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES

Conditional group contains more than two branches. Since 2.16 +

G_REGEX_ERROR_ASSERTION_EXPECTED

Assertion expected after "(?(". Since 2.16 +

G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME

Unknown POSIX class name. Since 2.16 +

G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED

POSIX collating elements are not supported. Since 2.16 +

G_REGEX_ERROR_HEX_CODE_TOO_LARGE

Character value in "\\x{...}" sequence is too large. Since 2.16 +

G_REGEX_ERROR_INVALID_CONDITION

Invalid condition "(?(0)". Since 2.16 +

G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND

\\C not allowed in lookbehind assertion. Since 2.16 +

G_REGEX_ERROR_INFINITE_LOOP

Recursive call could loop indefinitely. Since 2.16 +

G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR

Missing terminator in subpattern name. Since 2.16 +

G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME

Two named subpatterns have the same name. Since 2.16 +

G_REGEX_ERROR_MALFORMED_PROPERTY

Malformed "\\P" or "\\p" sequence. Since 2.16 +

G_REGEX_ERROR_UNKNOWN_PROPERTY

Unknown property name after "\\P" or "\\p". Since 2.16 +

G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG

Subpattern name is too long (maximum 32 characters). Since 2.16 +

G_REGEX_ERROR_TOO_MANY_SUBPATTERNS

Too many named subpatterns (maximum 10,000). Since 2.16 +

G_REGEX_ERROR_INVALID_OCTAL_VALUE

Octal value is greater than "\\377". Since 2.16 +

G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE

"DEFINE" group contains more than one branch. Since 2.16 +

G_REGEX_ERROR_DEFINE_REPETION

Repeating a "DEFINE" group is not allowed. Since 2.16 +

G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS

Inconsistent newline options. Since 2.16 +

G_REGEX_ERROR_MISSING_BACK_REFERENCE

"\\g" is not followed by a braced name or an +optionally braced non-zero number. Since 2.16 +
+

Since 2.14

+
+
+
+

G_REGEX_ERROR

+
#define G_REGEX_ERROR g_regex_error_quark ()
+
+

+Error domain for regular expressions. Errors in this domain will be from the GRegexError enumeration. See GError for information on error domains. +

+

Since 2.14

+
+
+
+

enum GRegexCompileFlags

+
typedef enum
+{
+  G_REGEX_CASELESS          = 1 << 0,
+  G_REGEX_MULTILINE         = 1 << 1,
+  G_REGEX_DOTALL            = 1 << 2,
+  G_REGEX_EXTENDED          = 1 << 3,
+  G_REGEX_ANCHORED          = 1 << 4,
+  G_REGEX_DOLLAR_ENDONLY    = 1 << 5,
+  G_REGEX_UNGREEDY          = 1 << 9,
+  G_REGEX_RAW               = 1 << 11,
+  G_REGEX_NO_AUTO_CAPTURE   = 1 << 12,
+  G_REGEX_OPTIMIZE          = 1 << 13,
+  G_REGEX_DUPNAMES          = 1 << 19,
+  G_REGEX_NEWLINE_CR        = 1 << 20,
+  G_REGEX_NEWLINE_LF        = 1 << 21,
+  G_REGEX_NEWLINE_CRLF      = G_REGEX_NEWLINE_CR | G_REGEX_NEWLINE_LF
+} GRegexCompileFlags;
+
+

+Flags specifying compile-time options. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_REGEX_CASELESS

Letters in the pattern match both upper and lower case +letters. This option can be changed within a pattern by a "(?i)" option +setting. +

G_REGEX_MULTILINE

By default, GRegex treats the strings as consisting +of a single line of characters (even if it actually contains newlines). +The "start of line" metacharacter ("^") matches only at the start of the +string, while the "end of line" metacharacter ("$") matches only at the +end of the string, or before a terminating newline (unless +G_REGEX_DOLLAR_ENDONLY is set). When G_REGEX_MULTILINE is set, +the "start of line" and "end of line" constructs match immediately following +or immediately before any newline in the string, respectively, as well +as at the very start and end. This can be changed within a pattern by a +"(?m)" option setting. +

G_REGEX_DOTALL

A dot metacharater (".") in the pattern matches all +characters, including newlines. Without it, newlines are excluded. This +option can be changed within a pattern by a ("?s") option setting. +

G_REGEX_EXTENDED

Whitespace data characters in the pattern are +totally ignored except when escaped or inside a character class. +Whitespace does not include the VT character (code 11). In addition, +characters between an unescaped "#" outside a character class and +the next newline character, inclusive, are also ignored. This can be +changed within a pattern by a "(?x)" option setting. +

G_REGEX_ANCHORED

The pattern is forced to be "anchored", that is, +it is constrained to match only at the first matching point in the string +that is being searched. This effect can also be achieved by appropriate +constructs in the pattern itself such as the "^" metacharater. +

G_REGEX_DOLLAR_ENDONLY

A dollar metacharacter ("$") in the pattern +matches only at the end of the string. Without this option, a dollar also +matches immediately before the final character if it is a newline (but +not before any other newlines). This option is ignored if +G_REGEX_MULTILINE is set. +

G_REGEX_UNGREEDY

Inverts the "greediness" of the +quantifiers so that they are not greedy by default, but become greedy +if followed by "?". It can also be set by a "(?U)" option setting within +the pattern. +

G_REGEX_RAW

Usually strings must be valid UTF-8 strings, using this +flag they are considered as a raw sequence of bytes. +

G_REGEX_NO_AUTO_CAPTURE

Disables the use of numbered capturing +parentheses in the pattern. Any opening parenthesis that is not followed +by "?" behaves as if it were followed by "?:" but named parentheses can +still be used for capturing (and they acquire numbers in the usual way). +

G_REGEX_OPTIMIZE

Optimize the regular expression. If the pattern will +be used many times, then it may be worth the effort to optimize it to +improve the speed of matches. +

G_REGEX_DUPNAMES

Names used to identify capturing subpatterns need not +be unique. This can be helpful for certain types of pattern when it is known +that only one instance of the named subpattern can ever be matched. +

G_REGEX_NEWLINE_CR

Usually any newline character is recognized, if this +option is set, the only recognized newline character is '\r'. +

G_REGEX_NEWLINE_LF

Usually any newline character is recognized, if this +option is set, the only recognized newline character is '\n'. +

G_REGEX_NEWLINE_CRLF

Usually any newline character is recognized, if this +option is set, the only recognized newline character sequence is '\r\n'. +
+

Since 2.14

+
+
+
+

enum GRegexMatchFlags

+
typedef enum
+{
+  G_REGEX_MATCH_ANCHORED      = 1 << 4,
+  G_REGEX_MATCH_NOTBOL        = 1 << 7,
+  G_REGEX_MATCH_NOTEOL        = 1 << 8,
+  G_REGEX_MATCH_NOTEMPTY      = 1 << 10,
+  G_REGEX_MATCH_PARTIAL       = 1 << 15,
+  G_REGEX_MATCH_NEWLINE_CR    = 1 << 20,
+  G_REGEX_MATCH_NEWLINE_LF    = 1 << 21,
+  G_REGEX_MATCH_NEWLINE_CRLF  = G_REGEX_MATCH_NEWLINE_CR | G_REGEX_MATCH_NEWLINE_LF,
+  G_REGEX_MATCH_NEWLINE_ANY   = 1 << 22
+} GRegexMatchFlags;
+
+

+Flags specifying match-time options. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_REGEX_MATCH_ANCHORED

The pattern is forced to be "anchored", that is, +it is constrained to match only at the first matching point in the string +that is being searched. This effect can also be achieved by appropriate +constructs in the pattern itself such as the "^" metacharater. +

G_REGEX_MATCH_NOTBOL

Specifies that first character of the string is +not the beginning of a line, so the circumflex metacharacter should not +match before it. Setting this without G_REGEX_MULTILINE (at compile time) +causes circumflex never to match. This option affects only the behaviour of +the circumflex metacharacter, it does not affect "\A". +

G_REGEX_MATCH_NOTEOL

Specifies that the end of the subject string is +not the end of a line, so the dollar metacharacter should not match it nor +(except in multiline mode) a newline immediately before it. Setting this +without G_REGEX_MULTILINE (at compile time) causes dollar never to match. +This option affects only the behaviour of the dollar metacharacter, it does +not affect "\Z" or "\z". +

G_REGEX_MATCH_NOTEMPTY

An empty string is not considered to be a valid +match if this option is set. If there are alternatives in the pattern, they +are tried. If all the alternatives match the empty string, the entire match +fails. For example, if the pattern "a?b?" is applied to a string not beginning +with "a" or "b", it matches the empty string at the start of the string. +With this flag set, this match is not valid, so GRegex searches further +into the string for occurrences of "a" or "b". +

G_REGEX_MATCH_PARTIAL

Turns on the partial matching feature, for more +documentation on partial matching see g_match_info_is_partial_match(). +

G_REGEX_MATCH_NEWLINE_CR

Overrides the newline definition set when creating +a new GRegex, setting the '\r' character as line terminator. +

G_REGEX_MATCH_NEWLINE_LF

Overrides the newline definition set when creating +a new GRegex, setting the '\n' character as line terminator. +

G_REGEX_MATCH_NEWLINE_CRLF

Overrides the newline definition set when creating +a new GRegex, setting the '\r\n' characters as line terminator. +

G_REGEX_MATCH_NEWLINE_ANY

Overrides the newline definition set when creating +a new GRegex, any newline character or character sequence is recognized. +
+

Since 2.14

+
+
+
+

GRegex

+
typedef struct _GRegex GRegex;
+

+A GRegex is the "compiled" form of a regular expression pattern. This +structure is opaque and its fields cannot be accessed directly. +

+

Since 2.14

+
+
+
+

GRegexEvalCallback ()

+
gboolean            (*GRegexEvalCallback)               (const GMatchInfo *match_info,
+                                                         GString *result,
+                                                         gpointer user_data);
+

+Specifies the type of the function passed to g_regex_replace_eval(). +It is called for each occurance of the pattern in the string passed +to g_regex_replace_eval(), and it should append the replacement to +result. +

+
++ + + + + + + + + + + + + + + + + + +

match_info :

the GMatchInfo generated by the match. +Use g_match_info_get_regex() and g_match_info_get_string() if you +need the GRegex or the matched string. +

result :

a GString containing the new string +

user_data :

user data passed to g_regex_replace_eval() +

Returns :

+FALSE to continue the replacement process, TRUE to stop it +
+

Since 2.14

+
+
+
+

g_regex_new ()

+
GRegex *            g_regex_new                         (const gchar *pattern,
+                                                         GRegexCompileFlags compile_options,
+                                                         GRegexMatchFlags match_options,
+                                                         GError **error);
+

+Compiles the regular expression to an internal form, and does +the initial setup of the GRegex structure.

+
++ + + + + + + + + + + + + + + + + + + + + + +

pattern :

the regular expression +

compile_options :

compile options for the regular expression, or 0 +

match_options :

match options for the regular expression, or 0 +

error :

return location for a GError +

Returns :

a GRegex structure. Call g_regex_unref() when you + are done with it + +
+

Since 2.14

+
+
+
+

g_regex_ref ()

+
GRegex *            g_regex_ref                         (GRegex *regex);
+

+Increases reference count of regex by 1.

+
++ + + + + + + + + + +

regex :

a GRegex +

Returns :

regex + +
+

Since 2.14

+
+
+
+

g_regex_unref ()

+
void                g_regex_unref                       (GRegex *regex);
+

+Decreases reference count of regex by 1. When reference count drops +to zero, it frees all the memory associated with the regex structure.

+
++ + + + +

regex :

a GRegex +
+

Since 2.14

+
+
+
+

g_regex_get_pattern ()

+
const gchar *       g_regex_get_pattern                 (const GRegex *regex);
+

+Gets the pattern string associated with regex, i.e. a copy of +the string passed to g_regex_new().

+
++ + + + + + + + + + +

regex :

a GRegex structure +

Returns :

the pattern of regex + +
+

Since 2.14

+
+
+
+

g_regex_get_max_backref ()

+
gint                g_regex_get_max_backref             (const GRegex *regex);
+

+Returns the number of the highest back reference +in the pattern, or 0 if the pattern does not contain +back references.

+
++ + + + + + + + + + +

regex :

a GRegex +

Returns :

the number of the highest back reference + +
+

Since 2.14

+
+
+
+

g_regex_get_capture_count ()

+
gint                g_regex_get_capture_count           (const GRegex *regex);
+

+Returns the number of capturing subpatterns in the pattern.

+
++ + + + + + + + + + +

regex :

a GRegex +

Returns :

the number of capturing subpatterns + +
+

Since 2.14

+
+
+
+

g_regex_get_string_number ()

+
gint                g_regex_get_string_number           (const GRegex *regex,
+                                                         const gchar *name);
+

+Retrieves the number of the subexpression named name.

+
++ + + + + + + + + + + + + + +

regex :

GRegex structure +

name :

name of the subexpression +

Returns :

The number of the subexpression or -1 if name + does not exists + +
+

Since 2.14

+
+
+
+

g_regex_escape_string ()

+
gchar *             g_regex_escape_string               (const gchar *string,
+                                                         gint length);
+

+Escapes the special characters used for regular expressions +in string, for instance "a.b*c" becomes "a\.b\*c". This +function is useful to dynamically generate regular expressions. +

+

+string can contain nul characters that are replaced with "\0", +in this case remember to specify the correct length of string +in length.

+
++ + + + + + + + + + + + + + +

string :

the string to escape +

length :

the length of string, or -1 if string is nul-terminated +

Returns :

a newly-allocated escaped string + +
+

Since 2.14

+
+
+
+

g_regex_match_simple ()

+
gboolean            g_regex_match_simple                (const gchar *pattern,
+                                                         const gchar *string,
+                                                         GRegexCompileFlags compile_options,
+                                                         GRegexMatchFlags match_options);
+

+Scans for a match in string for pattern. +

+

+This function is equivalent to g_regex_match() but it does not +require to compile the pattern with g_regex_new(), avoiding some +lines of code when you need just to do a match without extracting +substrings, capture counts, and so on. +

+

+If this function is to be called on the same pattern more than +once, it's more efficient to compile the pattern once with +g_regex_new() and then use g_regex_match().

+
++ + + + + + + + + + + + + + + + + + + + + + +

pattern :

the regular expression +

string :

the string to scan for matches +

compile_options :

compile options for the regular expression, or 0 +

match_options :

match options, or 0 +

Returns :

TRUE if the string matched, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_regex_match ()

+
gboolean            g_regex_match                       (const GRegex *regex,
+                                                         const gchar *string,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info);
+

+Scans for a match in string for the pattern in regex. +The match_options are combined with the match options specified +when the regex structure was created, letting you have more +flexibility in reusing GRegex structures. +

+

+A GMatchInfo structure, used to get information on the match, +is stored in match_info if not NULL. Note that if match_info +is not NULL then it is created even if the function returns FALSE, +i.e. you must free it regardless if regular expression actually matched. +

+

+To retrieve all the non-overlapping matches of the pattern in +string you can use g_match_info_next(). +

+

+

+
+static void
+print_uppercase_words (const gchar *string)
+{
+  /* Print all uppercase-only words. */
+  GRegex *regex;
+  GMatchInfo *match_info;
+   
+  regex = g_regex_new ("[A-Z]+", 0, 0, NULL);
+  g_regex_match (regex, string, 0, &match_info);
+  while (g_match_info_matches (match_info))
+    {
+      gchar *word = g_match_info_fetch (match_info, 0);
+      g_print ("Found: %s\n", word);
+      g_free (word);
+      g_match_info_next (match_info, NULL);
+    }
+  g_match_info_free (match_info);
+  g_regex_unref (regex);
+}
+
+

+

+

+string is not copied and is used in GMatchInfo internally. If +you use any GMatchInfo method (except g_match_info_free()) after +freeing or modifying string then the behaviour is undefined.

+
++ + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure from g_regex_new() +

string :

the string to scan for matches +

match_options :

match options +

match_info :

pointer to location where to store the GMatchInfo, + or NULL if you do not need it +

Returns :

TRUE is the string matched, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_regex_match_full ()

+
gboolean            g_regex_match_full                  (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info,
+                                                         GError **error);
+

+Scans for a match in string for the pattern in regex. +The match_options are combined with the match options specified +when the regex structure was created, letting you have more +flexibility in reusing GRegex structures. +

+

+Setting start_position differs from just passing over a shortened +string and setting G_REGEX_MATCH_NOTBOL in the case of a pattern +that begins with any kind of lookbehind assertion, such as "\b". +

+

+A GMatchInfo structure, used to get information on the match, is +stored in match_info if not NULL. Note that if match_info is +not NULL then it is created even if the function returns FALSE, +i.e. you must free it regardless if regular expression actually +matched. +

+

+string is not copied and is used in GMatchInfo internally. If +you use any GMatchInfo method (except g_match_info_free()) after +freeing or modifying string then the behaviour is undefined. +

+

+To retrieve all the non-overlapping matches of the pattern in +string you can use g_match_info_next(). +

+

+

+
+static void
+print_uppercase_words (const gchar *string)
+{
+  /* Print all uppercase-only words. */
+  GRegex *regex;
+  GMatchInfo *match_info;
+  GError *error = NULL;
+   
+  regex = g_regex_new ("[A-Z]+", 0, 0, NULL);
+  g_regex_match_full (regex, string, -1, 0, 0, &match_info, &error);
+  while (g_match_info_matches (match_info))
+    {
+      gchar *word = g_match_info_fetch (match_info, 0);
+      g_print ("Found: %s\n", word);
+      g_free (word);
+      g_match_info_next (match_info, &error);
+    }
+  g_match_info_free (match_info);
+  g_regex_unref (regex);
+  if (error != NULL)
+    {
+      g_printerr ("Error while matching: %s\n", error->message);
+      g_error_free (error);
+    }
+}
+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure from g_regex_new() +

string :

the string to scan for matches +

string_len :

the length of string, or -1 if string is nul-terminated +

start_position :

starting index of the string to match +

match_options :

match options +

match_info :

pointer to location where to store the GMatchInfo, + or NULL if you do not need it +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

TRUE is the string matched, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_regex_match_all ()

+
gboolean            g_regex_match_all                   (const GRegex *regex,
+                                                         const gchar *string,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info);
+

+Using the standard algorithm for regular expression matching only +the longest match in the string is retrieved. This function uses +a different algorithm so it can retrieve all the possible matches. +For more documentation see g_regex_match_all_full(). +

+

+A GMatchInfo structure, used to get information on the match, is +stored in match_info if not NULL. Note that if match_info is +not NULL then it is created even if the function returns FALSE, +i.e. you must free it regardless if regular expression actually +matched. +

+

+string is not copied and is used in GMatchInfo internally. If +you use any GMatchInfo method (except g_match_info_free()) after +freeing or modifying string then the behaviour is undefined.

+
++ + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure from g_regex_new() +

string :

the string to scan for matches +

match_options :

match options +

match_info :

pointer to location where to store the GMatchInfo, + or NULL if you do not need it +

Returns :

TRUE is the string matched, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_regex_match_all_full ()

+
gboolean            g_regex_match_all_full              (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         GMatchInfo **match_info,
+                                                         GError **error);
+

+Using the standard algorithm for regular expression matching only +the longest match in the string is retrieved, it is not possibile +to obtain all the available matches. For instance matching +"<a> <b> <c>" against the pattern "<.*>" +you get "<a> <b> <c>". +

+

+This function uses a different algorithm (called DFA, i.e. deterministic +finite automaton), so it can retrieve all the possible matches, all +starting at the same point in the string. For instance matching +"<a> <b> <c>" against the pattern "<.*>" +you would obtain three matches: "<a> <b> <c>", +"<a> <b>" and "<a>". +

+

+The number of matched strings is retrieved using +g_match_info_get_match_count(). To obtain the matched strings and +their position you can use, respectively, g_match_info_fetch() and +g_match_info_fetch_pos(). Note that the strings are returned in +reverse order of length; that is, the longest matching string is +given first. +

+

+Note that the DFA algorithm is slower than the standard one and it +is not able to capture substrings, so backreferences do not work. +

+

+Setting start_position differs from just passing over a shortened +string and setting G_REGEX_MATCH_NOTBOL in the case of a pattern +that begins with any kind of lookbehind assertion, such as "\b". +

+

+A GMatchInfo structure, used to get information on the match, is +stored in match_info if not NULL. Note that if match_info is +not NULL then it is created even if the function returns FALSE, +i.e. you must free it regardless if regular expression actually +matched. +

+

+string is not copied and is used in GMatchInfo internally. If +you use any GMatchInfo method (except g_match_info_free()) after +freeing or modifying string then the behaviour is undefined.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure from g_regex_new() +

string :

the string to scan for matches +

string_len :

the length of string, or -1 if string is nul-terminated +

start_position :

starting index of the string to match +

match_options :

match options +

match_info :

pointer to location where to store the GMatchInfo, + or NULL if you do not need it +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

TRUE is the string matched, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_regex_split_simple ()

+
gchar **            g_regex_split_simple                (const gchar *pattern,
+                                                         const gchar *string,
+                                                         GRegexCompileFlags compile_options,
+                                                         GRegexMatchFlags match_options);
+

+Breaks the string on the pattern, and returns an array of +the tokens. If the pattern contains capturing parentheses, +then the text for each of the substrings will also be returned. +If the pattern does not match anywhere in the string, then the +whole string is returned as the first token. +

+

+This function is equivalent to g_regex_split() but it does +not require to compile the pattern with g_regex_new(), avoiding +some lines of code when you need just to do a split without +extracting substrings, capture counts, and so on. +

+

+If this function is to be called on the same pattern more than +once, it's more efficient to compile the pattern once with +g_regex_new() and then use g_regex_split(). +

+

+As a special case, the result of splitting the empty string "" +is an empty vector, not a vector containing a single string. +The reason for this special case is that being able to represent +a empty vector is typically more useful than consistent handling +of empty elements. If you do need to represent empty elements, +you'll need to check for the empty string before calling this +function. +

+

+A pattern that can match empty strings splits string into +separate characters wherever it matches the empty string between +characters. For example splitting "ab c" using as a separator +"\s*", you will get "a", "b" and "c".

+
++ + + + + + + + + + + + + + + + + + + + + + +

pattern :

the regular expression +

string :

the string to scan for matches +

compile_options :

compile options for the regular expression, or 0 +

match_options :

match options, or 0 +

Returns :

a NULL-terminated array of strings. Free it using g_strfreev() + +
+

Since 2.14

+
+
+
+

g_regex_split ()

+
gchar **            g_regex_split                       (const GRegex *regex,
+                                                         const gchar *string,
+                                                         GRegexMatchFlags match_options);
+

+Breaks the string on the pattern, and returns an array of the tokens. +If the pattern contains capturing parentheses, then the text for each +of the substrings will also be returned. If the pattern does not match +anywhere in the string, then the whole string is returned as the first +token. +

+

+As a special case, the result of splitting the empty string "" is an +empty vector, not a vector containing a single string. The reason for +this special case is that being able to represent a empty vector is +typically more useful than consistent handling of empty elements. If +you do need to represent empty elements, you'll need to check for the +empty string before calling this function. +

+

+A pattern that can match empty strings splits string into separate +characters wherever it matches the empty string between characters. +For example splitting "ab c" using as a separator "\s*", you will get +"a", "b" and "c".

+
++ + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure +

string :

the string to split with the pattern +

match_options :

match time option flags +

Returns :

a NULL-terminated gchar ** array. Free it using g_strfreev() + +
+

Since 2.14

+
+
+
+

g_regex_split_full ()

+
gchar **            g_regex_split_full                  (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         gint max_tokens,
+                                                         GError **error);
+

+Breaks the string on the pattern, and returns an array of the tokens. +If the pattern contains capturing parentheses, then the text for each +of the substrings will also be returned. If the pattern does not match +anywhere in the string, then the whole string is returned as the first +token. +

+

+As a special case, the result of splitting the empty string "" is an +empty vector, not a vector containing a single string. The reason for +this special case is that being able to represent a empty vector is +typically more useful than consistent handling of empty elements. If +you do need to represent empty elements, you'll need to check for the +empty string before calling this function. +

+

+A pattern that can match empty strings splits string into separate +characters wherever it matches the empty string between characters. +For example splitting "ab c" using as a separator "\s*", you will get +"a", "b" and "c". +

+

+Setting start_position differs from just passing over a shortened +string and setting G_REGEX_MATCH_NOTBOL in the case of a pattern +that begins with any kind of lookbehind assertion, such as "\b".

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure +

string :

the string to split with the pattern +

string_len :

the length of string, or -1 if string is nul-terminated +

start_position :

starting index of the string to match +

match_options :

match time option flags +

max_tokens :

the maximum number of tokens to split string into. + If this is less than 1, the string is split completely +

error :

return location for a GError +

Returns :

a NULL-terminated gchar ** array. Free it using g_strfreev() + +
+

Since 2.14

+
+
+
+

g_regex_replace ()

+
gchar *             g_regex_replace                     (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         const gchar *replacement,
+                                                         GRegexMatchFlags match_options,
+                                                         GError **error);
+

+Replaces all occurrences of the pattern in regex with the +replacement text. Backreferences of the form '\number' or +'\g<number>' in the replacement text are interpolated by the +number-th captured subexpression of the match, '\g<name>' refers +to the captured subexpression with the given name. '\0' refers to the +complete match, but '\0' followed by a number is the octal representation +of a character. To include a literal '\' in the replacement, write '\\'. +There are also escapes that changes the case of the following text: +

+

+

+
++ + + + + + + + + + + + + + + + + + + + + + +

\l

Convert to lower case the next character

\u

Convert to upper case the next character

\L

Convert to lower case till \E

\U

Convert to upper case till \E

\E

End case modification

+

+

+

+If you do not need to use backreferences use g_regex_replace_literal(). +

+

+The replacement string must be UTF-8 encoded even if G_REGEX_RAW was +passed to g_regex_new(). If you want to use not UTF-8 encoded stings +you can use g_regex_replace_literal(). +

+

+Setting start_position differs from just passing over a shortened +string and setting G_REGEX_MATCH_NOTBOL in the case of a pattern that +begins with any kind of lookbehind assertion, such as "\b".

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure +

string :

the string to perform matches against +

string_len :

the length of string, or -1 if string is nul-terminated +

start_position :

starting index of the string to match +

replacement :

text to replace each match with +

match_options :

options for the match +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

a newly allocated string containing the replacements + +
+

Since 2.14

+
+
+
+

g_regex_replace_literal ()

+
gchar *             g_regex_replace_literal             (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         const gchar *replacement,
+                                                         GRegexMatchFlags match_options,
+                                                         GError **error);
+

+Replaces all occurrences of the pattern in regex with the +replacement text. replacement is replaced literally, to +include backreferences use g_regex_replace(). +

+

+Setting start_position differs from just passing over a +shortened string and setting G_REGEX_MATCH_NOTBOL in the +case of a pattern that begins with any kind of lookbehind +assertion, such as "\b".

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure +

string :

the string to perform matches against +

string_len :

the length of string, or -1 if string is nul-terminated +

start_position :

starting index of the string to match +

replacement :

text to replace each match with +

match_options :

options for the match +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

a newly allocated string containing the replacements + +
+

Since 2.14

+
+
+
+

g_regex_replace_eval ()

+
gchar *             g_regex_replace_eval                (const GRegex *regex,
+                                                         const gchar *string,
+                                                         gssize string_len,
+                                                         gint start_position,
+                                                         GRegexMatchFlags match_options,
+                                                         GRegexEvalCallback eval,
+                                                         gpointer user_data,
+                                                         GError **error);
+

+Replaces occurrences of the pattern in regex with the output of +eval for that occurrence. +

+

+Setting start_position differs from just passing over a shortened +string and setting G_REGEX_MATCH_NOTBOL in the case of a pattern +that begins with any kind of lookbehind assertion, such as "\b". +

+

+The following example uses g_regex_replace_eval() to replace multiple +strings at once: +

+
+static gboolean 
+eval_cb (const GMatchInfo *info,          
+         GString          *res,
+         gpointer          data)
+{
+  gchar *match;
+  gchar *r;
+
+   match = g_match_info_fetch (info, 0);
+   r = g_hash_table_lookup ((GHashTable *)data, match);
+   g_string_append (res, r);
+   g_free (match);
+
+   return FALSE;
+}
+
+/* ... */
+
+GRegex *reg;
+GHashTable *h;
+gchar *res;
+
+h = g_hash_table_new (g_str_hash, g_str_equal);
+
+g_hash_table_insert (h, "1", "ONE");
+g_hash_table_insert (h, "2", "TWO");
+g_hash_table_insert (h, "3", "THREE");
+g_hash_table_insert (h, "4", "FOUR");
+
+reg = g_regex_new ("1|2|3|4", 0, 0, NULL);
+res = g_regex_replace_eval (reg, text, -1, 0, 0, eval_cb, h, NULL);
+g_hash_table_destroy (h);
+
+/* ... */
+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

regex :

a GRegex structure from g_regex_new() +

string :

string to perform matches against +

string_len :

the length of string, or -1 if string is nul-terminated +

start_position :

starting index of the string to match +

match_options :

options for the match +

eval :

a function to call for each match +

user_data :

user data to pass to the function +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

a newly allocated string containing the replacements + +
+

Since 2.14

+
+
+
+

g_regex_check_replacement ()

+
gboolean            g_regex_check_replacement           (const gchar *replacement,
+                                                         gboolean *has_references,
+                                                         GError **error);
+

+Checks whether replacement is a valid replacement string +(see g_regex_replace()), i.e. that all escape sequences in +it are valid. +

+

+If has_references is not NULL then replacement is checked +for pattern references. For instance, replacement text 'foo\n' +does not contain references and may be evaluated without information +about actual match, but '\0\1' (whole match followed by first +subpattern) requires valid GMatchInfo object.

+
++ + + + + + + + + + + + + + + + + + +

replacement :

the replacement string +

has_references :

location to store information about + references in replacement or NULL +

error :

location to store error +

Returns :

whether replacement is a valid replacement string + +
+

Since 2.14

+
+
+
+

GMatchInfo

+
typedef struct _GMatchInfo GMatchInfo;
+

+GMatchInfo is used to retrieve information about the regular expression match +which created it. +This structure is opaque and its fields cannot be accessed directly. +

+

Since 2.14

+
+
+
+

g_match_info_get_regex ()

+
GRegex *            g_match_info_get_regex              (const GMatchInfo *match_info);
+

+Returns GRegex object used in match_info. It belongs to Glib +and must not be freed. Use g_regex_ref() if you need to keep it +after you free match_info object.

+
++ + + + + + + + + + +

match_info :

a GMatchInfo +

Returns :

GRegex object used in match_info + +
+

Since 2.14

+
+
+
+

g_match_info_get_string ()

+
const gchar *       g_match_info_get_string             (const GMatchInfo *match_info);
+

+Returns the string searched with match_info. This is the +string passed to g_regex_match() or g_regex_replace() so +you may not free it before calling this function.

+
++ + + + + + + + + + +

match_info :

a GMatchInfo +

Returns :

the string searched with match_info + +
+

Since 2.14

+
+
+
+

g_match_info_free ()

+
void                g_match_info_free                   (GMatchInfo *match_info);
+

+Frees all the memory associated with the GMatchInfo structure.

+
++ + + + +

match_info :

a GMatchInfo +
+

Since 2.14

+
+
+
+

g_match_info_matches ()

+
gboolean            g_match_info_matches                (const GMatchInfo *match_info);
+

+Returns whether the previous match operation succeeded.

+
++ + + + + + + + + + +

match_info :

a GMatchInfo structure +

Returns :

TRUE if the previous match operation succeeded, + FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_match_info_next ()

+
gboolean            g_match_info_next                   (GMatchInfo *match_info,
+                                                         GError **error);
+

+Scans for the next match using the same parameters of the previous +call to g_regex_match_full() or g_regex_match() that returned +match_info. +

+

+The match is done on the string passed to the match function, so you +cannot free it before calling this function.

+
++ + + + + + + + + + + + + + +

match_info :

a GMatchInfo structure +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

TRUE is the string matched, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_match_info_get_match_count ()

+
gint                g_match_info_get_match_count        (const GMatchInfo *match_info);
+

+Retrieves the number of matched substrings (including substring 0, +that is the whole matched text), so 1 is returned if the pattern +has no substrings in it and 0 is returned if the match failed. +

+

+If the last match was obtained using the DFA algorithm, that is +using g_regex_match_all() or g_regex_match_all_full(), the retrieved +count is not that of the number of capturing parentheses but that of +the number of matched substrings.

+
++ + + + + + + + + + +

match_info :

a GMatchInfo structure +

Returns :

Number of matched substrings, or -1 if an error occurred + +
+

Since 2.14

+
+
+
+

g_match_info_is_partial_match ()

+
gboolean            g_match_info_is_partial_match       (const GMatchInfo *match_info);
+

+Usually if the string passed to g_regex_match*() matches as far as +it goes, but is too short to match the entire pattern, FALSE is +returned. There are circumstances where it might be helpful to +distinguish this case from other cases in which there is no match. +

+

+Consider, for example, an application where a human is required to +type in data for a field with specific formatting requirements. An +example might be a date in the form ddmmmyy, defined by the pattern +"^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$". +If the application sees the user’s keystrokes one by one, and can +check that what has been typed so far is potentially valid, it is +able to raise an error as soon as a mistake is made. +

+

+GRegex supports the concept of partial matching by means of the +G_REGEX_MATCH_PARTIAL flag. When this is set the return code for +g_regex_match() or g_regex_match_full() is, as usual, TRUE +for a complete match, FALSE otherwise. But, when these functions +return FALSE, you can check if the match was partial calling +g_match_info_is_partial_match(). +

+

+When using partial matching you cannot use g_match_info_fetch*(). +

+

+Because of the way certain internal optimizations are implemented +the partial matching algorithm cannot be used with all patterns. +So repeated single characters such as "a{2,4}" and repeated single +meta-sequences such as "\d+" are not permitted if the maximum number +of occurrences is greater than one. Optional items such as "\d?" +(where the maximum is one) are permitted. Quantifiers with any values +are permitted after parentheses, so the invalid examples above can be +coded thus "(a){2,4}" and "(\d)+". If G_REGEX_MATCH_PARTIAL is set +for a pattern that does not conform to the restrictions, matching +functions return an error.

+
++ + + + + + + + + + +

match_info :

a GMatchInfo structure +

Returns :

TRUE if the match was partial, FALSE otherwise + +
+

Since 2.14

+
+
+
+

g_match_info_expand_references ()

+
gchar *             g_match_info_expand_references      (const GMatchInfo *match_info,
+                                                         const gchar *string_to_expand,
+                                                         GError **error);
+

+Returns a new string containing the text in string_to_expand with +references and escape sequences expanded. References refer to the last +match done with string against regex and have the same syntax used by +g_regex_replace(). +

+

+The string_to_expand must be UTF-8 encoded even if G_REGEX_RAW was +passed to g_regex_new(). +

+

+The backreferences are extracted from the string passed to the match +function, so you cannot call this function after freeing the string. +

+

+match_info may be NULL in which case string_to_expand must not +contain references. For instance "foo\n" does not refer to an actual +pattern and '\n' merely will be replaced with \n character, +while to expand "\0" (whole match) one needs the result of a match. +Use g_regex_check_replacement() to find out whether string_to_expand +contains references.

+
++ + + + + + + + + + + + + + + + + + +

match_info :

a GMatchInfo or NULL +

string_to_expand :

the string to expand +

error :

location to store the error occuring, or NULL to ignore errors +

Returns :

the expanded string, or NULL if an error occurred + +
+

Since 2.14

+
+
+
+

g_match_info_fetch ()

+
gchar *             g_match_info_fetch                  (const GMatchInfo *match_info,
+                                                         gint match_num);
+

+Retrieves the text matching the match_num'th capturing +parentheses. 0 is the full text of the match, 1 is the first paren +set, 2 the second, and so on. +

+

+If match_num is a valid sub pattern but it didn't match anything +(e.g. sub pattern 1, matching "b" against "(a)?b") then an empty +string is returned. +

+

+If the match was obtained using the DFA algorithm, that is using +g_regex_match_all() or g_regex_match_all_full(), the retrieved +string is not that of a set of parentheses but that of a matched +substring. Substrings are matched in reverse order of length, so +0 is the longest match. +

+

+The string is fetched from the string passed to the match function, +so you cannot call this function after freeing the string.

+
++ + + + + + + + + + + + + + +

match_info :

GMatchInfo structure +

match_num :

number of the sub expression +

Returns :

The matched substring, or NULL if an error occurred. + You have to free the string yourself + +
+

Since 2.14

+
+
+
+

g_match_info_fetch_pos ()

+
gboolean            g_match_info_fetch_pos              (const GMatchInfo *match_info,
+                                                         gint match_num,
+                                                         gint *start_pos,
+                                                         gint *end_pos);
+

+Retrieves the position in bytes of the match_num'th capturing +parentheses. 0 is the full text of the match, 1 is the first +paren set, 2 the second, and so on. +

+

+If match_num is a valid sub pattern but it didn't match anything +(e.g. sub pattern 1, matching "b" against "(a)?b") then start_pos +and end_pos are set to -1 and TRUE is returned. +

+

+If the match was obtained using the DFA algorithm, that is using +g_regex_match_all() or g_regex_match_all_full(), the retrieved +position is not that of a set of parentheses but that of a matched +substring. Substrings are matched in reverse order of length, so +0 is the longest match.

+
++ + + + + + + + + + + + + + + + + + + + + + +

match_info :

GMatchInfo structure +

match_num :

number of the sub expression +

start_pos :

pointer to location where to store the start position +

end_pos :

pointer to location where to store the end position +

Returns :

TRUE if the position was fetched, FALSE otherwise. If + the position cannot be fetched, start_pos and end_pos are left + unchanged + +
+

Since 2.14

+
+
+
+

g_match_info_fetch_named ()

+
gchar *             g_match_info_fetch_named            (const GMatchInfo *match_info,
+                                                         const gchar *name);
+

+Retrieves the text matching the capturing parentheses named name. +

+

+If name is a valid sub pattern name but it didn't match anything +(e.g. sub pattern "X", matching "b" against "(?P<X>a)?b") +then an empty string is returned. +

+

+The string is fetched from the string passed to the match function, +so you cannot call this function after freeing the string.

+
++ + + + + + + + + + + + + + +

match_info :

GMatchInfo structure +

name :

name of the subexpression +

Returns :

The matched substring, or NULL if an error occurred. + You have to free the string yourself + +
+

Since 2.14

+
+
+
+

g_match_info_fetch_named_pos ()

+
gboolean            g_match_info_fetch_named_pos        (const GMatchInfo *match_info,
+                                                         const gchar *name,
+                                                         gint *start_pos,
+                                                         gint *end_pos);
+

+Retrieves the position in bytes of the capturing parentheses named name. +

+

+If name is a valid sub pattern name but it didn't match anything +(e.g. sub pattern "X", matching "b" against "(?P<X>a)?b") +then start_pos and end_pos are set to -1 and TRUE is returned.

+
++ + + + + + + + + + + + + + + + + + + + + + +

match_info :

GMatchInfo structure +

name :

name of the subexpression +

start_pos :

pointer to location where to store the start position +

end_pos :

pointer to location where to store the end position +

Returns :

TRUE if the position was fetched, FALSE otherwise. If + the position cannot be fetched, start_pos and end_pos are left + unchanged + +
+

Since 2.14

+
+
+
+

g_match_info_fetch_all ()

+
gchar **            g_match_info_fetch_all              (const GMatchInfo *match_info);
+

+Bundles up pointers to each of the matching substrings from a match +and stores them in an array of gchar pointers. The first element in +the returned array is the match number 0, i.e. the entire matched +text. +

+

+If a sub pattern didn't match anything (e.g. sub pattern 1, matching +"b" against "(a)?b") then an empty string is inserted. +

+

+If the last match was obtained using the DFA algorithm, that is using +g_regex_match_all() or g_regex_match_all_full(), the retrieved +strings are not that matched by sets of parentheses but that of the +matched substring. Substrings are matched in reverse order of length, +so the first one is the longest match. +

+

+The strings are fetched from the string passed to the match function, +so you cannot call this function after freeing the string.

+
++ + + + + + + + + + +

match_info :

a GMatchInfo structure +

Returns :

a NULL-terminated array of gchar * pointers. It must be + freed using g_strfreev(). If the previous match failed NULL is + returned + +
+

Since 2.14

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Pointer-Arrays.html b/docs/reference/glib/html/glib-Pointer-Arrays.html new file mode 100644 index 0000000..f775b35 --- /dev/null +++ b/docs/reference/glib/html/glib-Pointer-Arrays.html @@ -0,0 +1,726 @@ + + + + +Pointer Arrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Pointer Arrays

+

Pointer Arrays — arrays of pointers to any type of data, which + grow automatically as new elements are added

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GPtrArray;
+GPtrArray*          g_ptr_array_new                     (void);
+GPtrArray*          g_ptr_array_sized_new               (guint reserved_size);
+GPtrArray*          g_ptr_array_new_with_free_func      (GDestroyNotify element_free_func);
+void                g_ptr_array_set_free_func           (GPtrArray *array,
+                                                         GDestroyNotify element_free_func);
+GPtrArray*          g_ptr_array_ref                     (GPtrArray *array);
+void                g_ptr_array_unref                   (GPtrArray *array);
+void                g_ptr_array_add                     (GPtrArray *array,
+                                                         gpointer data);
+gboolean            g_ptr_array_remove                  (GPtrArray *array,
+                                                         gpointer data);
+gpointer            g_ptr_array_remove_index            (GPtrArray *array,
+                                                         guint index_);
+gboolean            g_ptr_array_remove_fast             (GPtrArray *array,
+                                                         gpointer data);
+gpointer            g_ptr_array_remove_index_fast       (GPtrArray *array,
+                                                         guint index_);
+void                g_ptr_array_remove_range            (GPtrArray *array,
+                                                         guint index_,
+                                                         guint length);
+void                g_ptr_array_sort                    (GPtrArray *array,
+                                                         GCompareFunc compare_func);
+void                g_ptr_array_sort_with_data          (GPtrArray *array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+void                g_ptr_array_set_size                (GPtrArray *array,
+                                                         gint length);
+#define             g_ptr_array_index                   (array,index_)
+gpointer*           g_ptr_array_free                    (GPtrArray *array,
+                                                         gboolean free_seg);
+void                g_ptr_array_foreach                 (GPtrArray *array,
+                                                         GFunc func,
+                                                         gpointer user_data);
+
+
+
+

Description

+

+Pointer Arrays are similar to Arrays but are used only for storing +pointers. +

+

+

+
+

Note

+

If you remove elements from the array, elements at the +end of the array are moved into the space previously occupied by the +removed element. This means that you should not rely on the index of +particular elements remaining the same. You should also be careful +when deleting elements while iterating over the array.

+
+

+

+

+To create a pointer array, use g_ptr_array_new(). +

+

+To add elements to a pointer array, use g_ptr_array_add(). +

+

+To remove elements from a pointer array, use g_ptr_array_remove(), +g_ptr_array_remove_index() or g_ptr_array_remove_index_fast(). +

+

+To access an element of a pointer array, use g_ptr_array_index(). +

+

+To set the size of a pointer array, use g_ptr_array_set_size(). +

+

+To free a pointer array, use g_ptr_array_free(). +

+

+

+
+

Example 21. Using a GPtrArray

+
+  GPtrArray *gparray;
+  gchar *string1 = "one", *string2 = "two", *string3 = "three";
+
+  gparray = g_ptr_array_new ();
+  g_ptr_array_add (gparray, (gpointer) string1);
+  g_ptr_array_add (gparray, (gpointer) string2);
+  g_ptr_array_add (gparray, (gpointer) string3);
+
+  if (g_ptr_array_index (gparray, 0) != (gpointer) string1)
+    g_print ("ERROR: got %p instead of %p\n",
+             g_ptr_array_index (gparray, 0), string1);
+
+  g_ptr_array_free (gparray, TRUE);
+ 
+
+


+
+
+

Details

+
+

GPtrArray

+
typedef struct {
+  gpointer *pdata;
+  guint	    len;
+} GPtrArray;
+
+

+Contains the public fields of a pointer array.

+
++ + + + + + + + + + +

gpointer *pdata;

points to the array of pointers, which may be moved when the + array grows. +

guint len;

number of pointers in the array. +
+
+
+
+

g_ptr_array_new ()

+
GPtrArray*          g_ptr_array_new                     (void);
+

+Creates a new GPtrArray with a reference count of 1.

+
++ + + + +

Returns :

the new GPtrArray. +
+
+
+
+

g_ptr_array_sized_new ()

+
GPtrArray*          g_ptr_array_sized_new               (guint reserved_size);
+

+Creates a new GPtrArray with reserved_size pointers preallocated +and a reference count of 1. This avoids frequent reallocation, if +you are going to add many pointers to the array. Note however that +the size of the array is still 0.

+
++ + + + + + + + + + +

reserved_size :

number of pointers preallocated. +

Returns :

the new GPtrArray. +
+
+
+
+

g_ptr_array_new_with_free_func ()

+
GPtrArray*          g_ptr_array_new_with_free_func      (GDestroyNotify element_free_func);
+

+Creates a new GPtrArray with a reference count of 1 and use element_free_func +for freeing each element when the array is destroyed either via +g_ptr_array_unref(), when g_ptr_array_free() is called with free_segment +set to TRUE or when removing elements.

+
++ + + + + + + + + + +

element_free_func :

A function to free elements with destroy array or NULL. +

Returns :

A new GPtrArray. + +
+

Since 2.22

+
+
+
+

g_ptr_array_set_free_func ()

+
void                g_ptr_array_set_free_func           (GPtrArray *array,
+                                                         GDestroyNotify element_free_func);
+

+Sets a function for freeing each element when array is destroyed +either via g_ptr_array_unref(), when g_ptr_array_free() is called +with free_segment set to TRUE or when removing elements.

+
++ + + + + + + + + + +

array :

A GPtrArray. +

element_free_func :

A function to free elements with destroy array or NULL. +
+

Since 2.22

+
+
+
+

g_ptr_array_ref ()

+
GPtrArray*          g_ptr_array_ref                     (GPtrArray *array);
+

+Atomically increments the reference count of array by one. This +function is MT-safe and may be called from any thread.

+
++ + + + + + + + + + +

array :

A GArray. +

Returns :

The passed in GPtrArray. + +
+

Since 2.22

+
+
+
+

g_ptr_array_unref ()

+
void                g_ptr_array_unref                   (GPtrArray *array);
+

+Atomically decrements the reference count of array by one. If the +reference count drops to 0, the effect is the same as calling +g_ptr_array_free() with free_segment set to TRUE. This function +is MT-safe and may be called from any thread.

+
++ + + + +

array :

A GPtrArray. +
+

Since 2.22

+
+
+
+

g_ptr_array_add ()

+
void                g_ptr_array_add                     (GPtrArray *array,
+                                                         gpointer data);
+

+Adds a pointer to the end of the pointer array. The array will grow +in size automatically if necessary.

+
++ + + + + + + + + + +

array :

a GPtrArray. +

data :

the pointer to add. +
+
+
+
+

g_ptr_array_remove ()

+
gboolean            g_ptr_array_remove                  (GPtrArray *array,
+                                                         gpointer data);
+

+Removes the first occurrence of the given pointer from the pointer +array. The following elements are moved down one place. If array +has a non-NULL GDestroyNotify function it is called for the +removed element. +

+

+It returns TRUE if the pointer was removed, or FALSE if the +pointer was not found.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

data :

the pointer to remove. +

Returns :

TRUE if the pointer is removed. FALSE if the pointer is + not found in the array. +
+
+
+
+

g_ptr_array_remove_index ()

+
gpointer            g_ptr_array_remove_index            (GPtrArray *array,
+                                                         guint index_);
+

+Removes the pointer at the given index from the pointer array. The +following elements are moved down one place. If array has a +non-NULL GDestroyNotify function it is called for the removed +element.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

index_ :

the index of the pointer to remove. +

Returns :

the pointer which was removed. +
+
+
+
+

g_ptr_array_remove_fast ()

+
gboolean            g_ptr_array_remove_fast             (GPtrArray *array,
+                                                         gpointer data);
+

+Removes the first occurrence of the given pointer from the pointer +array. The last element in the array is used to fill in the space, +so this function does not preserve the order of the array. But it is +faster than g_ptr_array_remove(). If array has a non-NULL +GDestroyNotify function it is called for the removed element. +

+

+It returns TRUE if the pointer was removed, or FALSE if the +pointer was not found.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

data :

the pointer to remove. +

Returns :

TRUE if the pointer was found in the array. +
+
+
+
+

g_ptr_array_remove_index_fast ()

+
gpointer            g_ptr_array_remove_index_fast       (GPtrArray *array,
+                                                         guint index_);
+

+Removes the pointer at the given index from the pointer array. The +last element in the array is used to fill in the space, so this +function does not preserve the order of the array. But it is faster +than g_ptr_array_remove_index(). If array has a non-NULL +GDestroyNotify function it is called for the removed element.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

index_ :

the index of the pointer to remove. +

Returns :

the pointer which was removed. +
+
+
+
+

g_ptr_array_remove_range ()

+
void                g_ptr_array_remove_range            (GPtrArray *array,
+                                                         guint index_,
+                                                         guint length);
+

+Removes the given number of pointers starting at the given index +from a GPtrArray. The following elements are moved to close the +gap. If array has a non-NULL GDestroyNotify function it is called +for the removed elements.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

index_ :

the index of the first pointer to remove. +

length :

the number of pointers to remove. +
+

Since 2.4

+
+
+
+

g_ptr_array_sort ()

+
void                g_ptr_array_sort                    (GPtrArray *array,
+                                                         GCompareFunc compare_func);
+

+Sorts the array, using compare_func which should be a qsort()-style +comparison function (returns less than zero for first arg is less +than second arg, zero for equal, greater than zero if irst arg is +greater than second arg). +

+

+If two array elements compare equal, their order in the sorted array +is undefined. +

+

+

+
+

Note

+

The comparison function for g_ptr_array_sort() doesn't +take the pointers from the array as arguments, it takes pointers to +the pointers in the array.

+
+
++ + + + + + + + + + +

array :

a GPtrArray. +

compare_func :

comparison function. +
+
+
+
+

g_ptr_array_sort_with_data ()

+
void                g_ptr_array_sort_with_data          (GPtrArray *array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Like g_ptr_array_sort(), but the comparison function has an extra +user data argument. +

+

+

+
+

Note

+

The comparison function for g_ptr_array_sort_with_data() +doesn't take the pointers from the array as arguments, it takes +pointers to the pointers in the array.

+
+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

compare_func :

comparison function. +

user_data :

data to pass to compare_func. +
+
+
+
+

g_ptr_array_set_size ()

+
void                g_ptr_array_set_size                (GPtrArray *array,
+                                                         gint length);
+

+Sets the size of the array. When making the array larger, +newly-added elements will be set to NULL. When making it smaller, +if array has a non-NULL GDestroyNotify function then it will be +called for the removed elements.

+
++ + + + + + + + + + +

array :

a GPtrArray. +

length :

the new length of the pointer array. +
+
+
+
+

g_ptr_array_index()

+
#define             g_ptr_array_index(array,index_)
+

+Returns the pointer at the given index of the pointer array.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

index_ :

the index of the pointer to return. +

Returns :

the pointer at the given index. +
+
+
+
+

g_ptr_array_free ()

+
gpointer*           g_ptr_array_free                    (GPtrArray *array,
+                                                         gboolean free_seg);
+

+Frees the memory allocated for the GPtrArray. If free_seg is TRUE +it frees the memory block holding the elements as well. Pass FALSE +if you want to free the GPtrArray wrapper but preserve the +underlying array for use elsewhere. If the reference count of array +is greater than one, the GPtrArray wrapper is preserved but the +size of array will be set to zero. +

+

+

+
+

Note

+

If array contents point to dynamically-allocated +memory, they should be freed separately if free_seg is TRUE and no +GDestroyNotify function has been set for array.

+
+
++ + + + + + + + + + + + + + +

array :

a GPtrArray. +

free_seg :

if TRUE the actual pointer array is freed as well. +

Returns :

the pointer array if free_seg is FALSE, otherwise NULL. + The pointer array should be freed using g_free(). +
+
+
+
+

g_ptr_array_foreach ()

+
void                g_ptr_array_foreach                 (GPtrArray *array,
+                                                         GFunc func,
+                                                         gpointer user_data);
+

+Calls a function for each element of a GPtrArray.

+
++ + + + + + + + + + + + + + +

array :

a GPtrArray +

func :

the function to call for each array element +

user_data :

user data to pass to the function +
+

Since 2.4

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Quarks.html b/docs/reference/glib/html/glib-Quarks.html new file mode 100644 index 0000000..cfb9a03 --- /dev/null +++ b/docs/reference/glib/html/glib-Quarks.html @@ -0,0 +1,281 @@ + + + + +Quarks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Quarks

+

Quarks — a 2-way association between a string and a + unique integer identifier

+
+
+

Synopsis

+
+#include <glib.h>
+
+typedef             GQuark;
+GQuark              g_quark_from_string                 (const gchar *string);
+GQuark              g_quark_from_static_string          (const gchar *string);
+const gchar*        g_quark_to_string                   (GQuark quark);
+GQuark              g_quark_try_string                  (const gchar *string);
+const gchar*        g_intern_string                     (const gchar *string);
+const gchar*        g_intern_static_string              (const gchar *string);
+
+
+
+

Description

+

+Quarks are associations between strings and integer identifiers. +Given either the string or the GQuark identifier it is possible to +retrieve the other. +

+

+Quarks are used for both Datasets and Keyed Data Lists. +

+

+To create a new quark from a string, use g_quark_from_string() or +g_quark_from_static_string(). +

+

+To find the string corresponding to a given GQuark, use +g_quark_to_string(). +

+

+To find the GQuark corresponding to a given string, use +g_quark_try_string(). +

+

+Another use for the string pool maintained for the quark functions +is string interning, using g_intern_string() or +g_intern_static_string(). An interned string is a canonical +representation for a string. One important advantage of interned +strings is that they can be compared for equality by a simple +pointer comparision, rather than using strcmp().

+
+
+

Details

+
+

GQuark

+
typedef guint32 GQuark;
+
+

+A GQuark is a non-zero integer which uniquely identifies a +particular string. A GQuark value of zero is associated to NULL.

+
+
+
+

g_quark_from_string ()

+
GQuark              g_quark_from_string                 (const gchar *string);
+

+Gets the GQuark identifying the given string. If the string does +not currently have an associated GQuark, a new GQuark is created, +using a copy of the string.

+
++ + + + + + + + + + +

string :

a string. +

Returns :

the GQuark identifying the string, or 0 if string is + NULL. +
+
+
+
+

g_quark_from_static_string ()

+
GQuark              g_quark_from_static_string          (const gchar *string);
+

+Gets the GQuark identifying the given (static) string. If the +string does not currently have an associated GQuark, a new GQuark +is created, linked to the given string. +

+

+Note that this function is identical to g_quark_from_string() except +that if a new GQuark is created the string itself is used rather +than a copy. This saves memory, but can only be used if the string +will always exist. It can be used with +statically allocated strings in the main program, but not with +statically allocated memory in dynamically loaded modules, if you +expect to ever unload the module again (e.g. do not use this +function in GTK+ theme engines).

+
++ + + + + + + + + + +

string :

a string. +

Returns :

the GQuark identifying the string, or 0 if string is + NULL. +
+
+
+
+

g_quark_to_string ()

+
const gchar*        g_quark_to_string                   (GQuark quark);
+

+Gets the string associated with the given GQuark.

+
++ + + + + + + + + + +

quark :

a GQuark. +

Returns :

the string associated with the GQuark. +
+
+
+
+

g_quark_try_string ()

+
GQuark              g_quark_try_string                  (const gchar *string);
+

+Gets the GQuark associated with the given string, or 0 if string is +NULL or it has no associated GQuark. +

+

+If you want the GQuark to be created if it doesn't already exist, +use g_quark_from_string() or g_quark_from_static_string().

+
++ + + + + + + + + + +

string :

a string. +

Returns :

the GQuark associated with the string, or 0 if string is + NULL or there is no GQuark associated with it. +
+
+
+
+

g_intern_string ()

+
const gchar*        g_intern_string                     (const gchar *string);
+

+Returns a canonical representation for string. Interned strings can +be compared for equality by comparing the pointers, instead of using strcmp().

+
++ + + + + + + + + + +

string :

a string +

Returns :

a canonical representation for the string + +
+

Since 2.10

+
+
+
+

g_intern_static_string ()

+
const gchar*        g_intern_static_string              (const gchar *string);
+

+Returns a canonical representation for string. Interned strings can +be compared for equality by comparing the pointers, instead of using strcmp(). +g_intern_static_string() does not copy the string, therefore string must +not be freed or modified.

+
++ + + + + + + + + + +

string :

a static string +

Returns :

a canonical representation for the string + +
+

Since 2.10

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Random-Numbers.html b/docs/reference/glib/html/glib-Random-Numbers.html new file mode 100644 index 0000000..3aba9aa --- /dev/null +++ b/docs/reference/glib/html/glib-Random-Numbers.html @@ -0,0 +1,578 @@ + + + + +Random Numbers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Random Numbers

+

Random Numbers — pseudo-random number generator

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GRand;
+GRand*              g_rand_new_with_seed                (guint32 seed);
+GRand*              g_rand_new_with_seed_array          (const guint32 *seed,
+                                                         guint seed_length);
+GRand*              g_rand_new                          (void);
+GRand*              g_rand_copy                         (GRand *rand_);
+void                g_rand_free                         (GRand *rand_);
+void                g_rand_set_seed                     (GRand *rand_,
+                                                         guint32 seed);
+void                g_rand_set_seed_array               (GRand *rand_,
+                                                         const guint32 *seed,
+                                                         guint seed_length);
+#define             g_rand_boolean                      (rand_)
+guint32             g_rand_int                          (GRand *rand_);
+gint32              g_rand_int_range                    (GRand *rand_,
+                                                         gint32 begin,
+                                                         gint32 end);
+gdouble             g_rand_double                       (GRand *rand_);
+gdouble             g_rand_double_range                 (GRand *rand_,
+                                                         gdouble begin,
+                                                         gdouble end);
+void                g_random_set_seed                   (guint32 seed);
+#define             g_random_boolean                    ()
+guint32             g_random_int                        (void);
+gint32              g_random_int_range                  (gint32 begin,
+                                                         gint32 end);
+gdouble             g_random_double                     (void);
+gdouble             g_random_double_range               (gdouble begin,
+                                                         gdouble end);
+
+
+
+

Description

+

+The following functions allow you to use a portable, fast and good +pseudo-random number generator (PRNG). It uses the Mersenne Twister +PRNG, which was originally developed by Makoto Matsumoto and Takuji +Nishimura. Further information can be found at + +www.math.keio.ac.jp/~matumoto/emt.html. +

+

+If you just need a random number, you simply call the +g_random_* functions, which will create a +globally used GRand and use the according +g_rand_* functions internally. Whenever you +need a stream of reproducible random numbers, you better create a +GRand yourself and use the g_rand_* functions +directly, which will also be slightly faster. Initializing a GRand +with a certain seed will produce exactly the same series of random +numbers on all platforms. This can thus be used as a seed for e.g. +games. +

+

+The g_rand*_range functions will return high +quality equally distributed random numbers, whereas for example the +(g_random_int()%max) approach often +doesn't yield equally distributed numbers. +

+

+GLib changed the seeding algorithm for the pseudo-random number +generator Mersenne Twister, as used by +GRand and GRandom. +This was necessary, because some seeds would yield very bad +pseudo-random streams. Also the pseudo-random integers generated by +g_rand*_int_range() will have a slightly better +equal distribution with the new version of GLib. +

+

+The original seeding and generation algorithms, as found in GLib +2.0.x, can be used instead of the new ones by setting the +environment variable G_RANDOM_VERSION to the value of +'2.0'. Use the GLib-2.0 algorithms only if you have sequences of +numbers generated with Glib-2.0 that you need to reproduce exactly.

+
+
+

Details

+
+

GRand

+
typedef struct _GRand GRand;
+

+The GRand struct is an opaque data structure. It should only be +accessed through the g_rand_* functions.

+
+
+
+

g_rand_new_with_seed ()

+
GRand*              g_rand_new_with_seed                (guint32 seed);
+

+Creates a new random number generator initialized with seed.

+
++ + + + + + + + + + +

seed :

a value to initialize the random number generator. +

Returns :

the new GRand. +
+
+
+
+

g_rand_new_with_seed_array ()

+
GRand*              g_rand_new_with_seed_array          (const guint32 *seed,
+                                                         guint seed_length);
+

+Creates a new random number generator initialized with seed.

+
++ + + + + + + + + + + + + + +

seed :

an array of seeds to initialize the random number generator. +

seed_length :

an array of seeds to initialize the random number generator. +

Returns :

the new GRand. + +
+

Since 2.4

+
+
+
+

g_rand_new ()

+
GRand*              g_rand_new                          (void);
+

+Creates a new random number generator initialized with a seed taken +either from /dev/urandom (if existing) or from +the current time (as a fallback).

+
++ + + + +

Returns :

the new GRand. +
+
+
+
+

g_rand_copy ()

+
GRand*              g_rand_copy                         (GRand *rand_);
+

+Copies a GRand into a new one with the same exact state as before. +This way you can take a snapshot of the random number generator for +replaying later.

+
++ + + + + + + + + + +

rand_ :

a GRand. +

Returns :

the new GRand. + +
+

Since 2.4

+
+
+
+

g_rand_free ()

+
void                g_rand_free                         (GRand *rand_);
+

+Frees the memory allocated for the GRand.

+
++ + + + +

rand_ :

a GRand. +
+
+
+
+

g_rand_set_seed ()

+
void                g_rand_set_seed                     (GRand *rand_,
+                                                         guint32 seed);
+

+Sets the seed for the random number generator GRand to seed.

+
++ + + + + + + + + + +

rand_ :

a GRand. +

seed :

a value to reinitialize the random number generator. +
+
+
+
+

g_rand_set_seed_array ()

+
void                g_rand_set_seed_array               (GRand *rand_,
+                                                         const guint32 *seed,
+                                                         guint seed_length);
+

+Initializes the random number generator by an array of +longs. Array can be of arbitrary size, though only the +first 624 values are taken. This function is useful +if you have many low entropy seeds, or if you require more then +32bits of actual entropy for your application.

+
++ + + + + + + + + + + + + + +

rand_ :

a GRand. +

seed :

array to initialize with +

seed_length :

length of array +
+

Since 2.4

+
+
+
+

g_rand_boolean()

+
#define             g_rand_boolean(rand_)
+

+Returns a random gboolean from rand_. This corresponds to a +unbiased coin toss.

+
++ + + + + + + + + + +

rand_ :

a GRand. +

Returns :

a random gboolean. +
+
+
+
+

g_rand_int ()

+
guint32             g_rand_int                          (GRand *rand_);
+

+Returns the next random guint32 from rand_ equally distributed over +the range [0..2^32-1].

+
++ + + + + + + + + + +

rand_ :

a GRand. +

Returns :

A random number. +
+
+
+
+

g_rand_int_range ()

+
gint32              g_rand_int_range                    (GRand *rand_,
+                                                         gint32 begin,
+                                                         gint32 end);
+

+Returns the next random gint32 from rand_ equally distributed over +the range [begin..end-1].

+
++ + + + + + + + + + + + + + + + + + +

rand_ :

a GRand. +

begin :

lower closed bound of the interval. +

end :

upper open bound of the interval. +

Returns :

A random number. +
+
+
+
+

g_rand_double ()

+
gdouble             g_rand_double                       (GRand *rand_);
+

+Returns the next random gdouble from rand_ equally distributed over +the range [0..1).

+
++ + + + + + + + + + +

rand_ :

a GRand. +

Returns :

A random number. +
+
+
+
+

g_rand_double_range ()

+
gdouble             g_rand_double_range                 (GRand *rand_,
+                                                         gdouble begin,
+                                                         gdouble end);
+

+Returns the next random gdouble from rand_ equally distributed over +the range [begin..end).

+
++ + + + + + + + + + + + + + + + + + +

rand_ :

a GRand. +

begin :

lower closed bound of the interval. +

end :

upper open bound of the interval. +

Returns :

A random number. +
+
+
+
+

g_random_set_seed ()

+
void                g_random_set_seed                   (guint32 seed);
+

+Sets the seed for the global random number generator, which is used +by the g_random_* functions, to seed.

+
++ + + + +

seed :

a value to reinitialize the global random number generator. +
+
+
+
+

g_random_boolean()

+
#define             g_random_boolean()
+

+Returns a random gboolean. This corresponds to a unbiased coin toss.

+
++ + + + +

Returns :

a random gboolean. +
+
+
+
+

g_random_int ()

+
guint32             g_random_int                        (void);
+

+Return a random guint32 equally distributed over the range +[0..2^32-1].

+
++ + + + +

Returns :

A random number. +
+
+
+
+

g_random_int_range ()

+
gint32              g_random_int_range                  (gint32 begin,
+                                                         gint32 end);
+

+Returns a random gint32 equally distributed over the range +[begin..end-1].

+
++ + + + + + + + + + + + + + +

begin :

lower closed bound of the interval. +

end :

upper open bound of the interval. +

Returns :

A random number. +
+
+
+
+

g_random_double ()

+
gdouble             g_random_double                     (void);
+

+Returns a random gdouble equally distributed over the range [0..1).

+
++ + + + +

Returns :

A random number. +
+
+
+
+

g_random_double_range ()

+
gdouble             g_random_double_range               (gdouble begin,
+                                                         gdouble end);
+

+Returns a random gdouble equally distributed over the range [begin..end).

+
++ + + + + + + + + + + + + + +

begin :

lower closed bound of the interval. +

end :

upper open bound of the interval. +

Returns :

A random number. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Relations-and-Tuples.html b/docs/reference/glib/html/glib-Relations-and-Tuples.html new file mode 100644 index 0000000..9c874d6 --- /dev/null +++ b/docs/reference/glib/html/glib-Relations-and-Tuples.html @@ -0,0 +1,488 @@ + + + + +Relations and Tuples + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Relations and Tuples

+

Relations and Tuples — tables of data which can be indexed on any + number of fields

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GRelation;
+GRelation*          g_relation_new                      (gint fields);
+void                g_relation_index                    (GRelation *relation,
+                                                         gint field,
+                                                         GHashFunc hash_func,
+                                                         GEqualFunc key_equal_func);
+void                g_relation_insert                   (GRelation *relation,
+                                                         ...);
+gboolean            g_relation_exists                   (GRelation *relation,
+                                                         ...);
+gint                g_relation_count                    (GRelation *relation,
+                                                         gconstpointer key,
+                                                         gint field);
+GTuples*            g_relation_select                   (GRelation *relation,
+                                                         gconstpointer key,
+                                                         gint field);
+gint                g_relation_delete                   (GRelation *relation,
+                                                         gconstpointer key,
+                                                         gint field);
+void                g_relation_destroy                  (GRelation *relation);
+
+void                g_relation_print                    (GRelation *relation);
+
+                    GTuples;
+void                g_tuples_destroy                    (GTuples *tuples);
+gpointer            g_tuples_index                      (GTuples *tuples,
+                                                         gint index_,
+                                                         gint field);
+
+
+
+

Description

+

+A GRelation is a table of data which can be indexed on any number +of fields, rather like simple database tables. A GRelation contains +a number of records, called tuples. Each record contains a number of +fields. Records are not ordered, so it is not possible to find the +record at a particular index. +

+

+Note that GRelation tables are currently limited to 2 fields. +

+

+To create a GRelation, use g_relation_new(). +

+

+To specify which fields should be indexed, use g_relation_index(). +Note that this must be called before any tuples are added to the +GRelation. +

+

+To add records to a GRelation use g_relation_insert(). +

+

+To determine if a given record appears in a GRelation, use +g_relation_exists(). Note that fields are compared directly, so +pointers must point to the exact same position (i.e. different +copies of the same string will not match.) +

+

+To count the number of records which have a particular value in a +given field, use g_relation_count(). +

+

+To get all the records which have a particular value in a given +field, use g_relation_select(). To access fields of the resulting +records, use g_tuples_index(). To free the resulting records use +g_tuples_destroy(). +

+

+To delete all records which have a particular value in a given +field, use g_relation_delete(). +

+

+To destroy the GRelation, use g_relation_destroy(). +

+

+To help debug GRelation objects, use g_relation_print().

+
+
+

Details

+
+

GRelation

+
typedef struct _GRelation GRelation;
+

+The GRelation struct is an opaque data structure to represent a +Relation. It should +only be accessed via the following functions.

+
+
+
+

g_relation_new ()

+
GRelation*          g_relation_new                      (gint fields);
+

+Creates a new GRelation with the given number of fields. Note that +currently the number of fields must be 2.

+
++ + + + + + + + + + +

fields :

the number of fields. +

Returns :

a new GRelation. +
+
+
+
+

g_relation_index ()

+
void                g_relation_index                    (GRelation *relation,
+                                                         gint field,
+                                                         GHashFunc hash_func,
+                                                         GEqualFunc key_equal_func);
+

+Creates an index on the given field. Note that this must be called +before any records are added to the GRelation.

+
++ + + + + + + + + + + + + + + + + + +

relation :

a GRelation. +

field :

the field to index, counting from 0. +

hash_func :

a function to produce a hash value from the field data. +

key_equal_func :

a function to compare two values of the given field. +
+
+
+
+

g_relation_insert ()

+
void                g_relation_insert                   (GRelation *relation,
+                                                         ...);
+

+Inserts a record into a GRelation.

+
++ + + + + + + + + + +

relation :

a GRelation. +

... :

the fields of the record to add. These must match the + number of fields in the GRelation, and of type gpointer + or gconstpointer. +
+
+
+
+

g_relation_exists ()

+
gboolean            g_relation_exists                   (GRelation *relation,
+                                                         ...);
+

+Returns TRUE if a record with the given values exists in a +GRelation. Note that the values are compared directly, so that, for +example, two copies of the same string will not match.

+
++ + + + + + + + + + + + + + +

relation :

a GRelation. +

... :

the fields of the record to compare. The number must match + the number of fields in the GRelation. +

Returns :

TRUE if a record matches. +
+
+
+
+

g_relation_count ()

+
gint                g_relation_count                    (GRelation *relation,
+                                                         gconstpointer key,
+                                                         gint field);
+

+Returns the number of tuples in a GRelation that have the given +value in the given field.

+
++ + + + + + + + + + + + + + + + + + +

relation :

a GRelation. +

key :

the value to compare with. +

field :

the field of each record to match. +

Returns :

the number of matches. +
+
+
+
+

g_relation_select ()

+
GTuples*            g_relation_select                   (GRelation *relation,
+                                                         gconstpointer key,
+                                                         gint field);
+

+Returns all of the tuples which have the given key in the given +field. Use g_tuples_index() to access the returned records. The +returned records should be freed with g_tuples_destroy().

+
++ + + + + + + + + + + + + + + + + + +

relation :

a GRelation. +

key :

the value to compare with. +

field :

the field of each record to match. +

Returns :

the records (tuples) that matched. +
+
+
+
+

g_relation_delete ()

+
gint                g_relation_delete                   (GRelation *relation,
+                                                         gconstpointer key,
+                                                         gint field);
+

+Deletes any records from a GRelation that have the given key value +in the given field.

+
++ + + + + + + + + + + + + + + + + + +

relation :

a GRelation. +

key :

the value to compare with. +

field :

the field of each record to match. +

Returns :

the number of records deleted. +
+
+
+
+

g_relation_destroy ()

+
void                g_relation_destroy                  (GRelation *relation);
+

+Destroys the GRelation, freeing all memory allocated. However, it +does not free memory allocated for the tuple data, so you should +free that first if appropriate.

+
++ + + + +

relation :

a GRelation. +
+
+
+
+

g_relation_print ()

+
void                g_relation_print                    (GRelation *relation);
+

+Outputs information about all records in a GRelation, as well as +the indexes. It is for debugging.

+
++ + + + +

relation :

a GRelation. +
+
+
+
+

GTuples

+
typedef struct {
+  guint len;
+} GTuples;
+
+

+The GTuples struct is used to return records (or tuples) from the +GRelation by g_relation_select(). It only contains one public +member - the number of records that matched. To access the matched +records, you must use g_tuples_index().

+
++ + + + +

guint len;

the number of records that matched. +
+
+
+
+

g_tuples_destroy ()

+
void                g_tuples_destroy                    (GTuples *tuples);
+

+Frees the records which were returned by g_relation_select(). This +should always be called after g_relation_select() when you are +finished with the records. The records are not removed from the +GRelation.

+
++ + + + +

tuples :

the tuple data to free. +
+
+
+
+

g_tuples_index ()

+
gpointer            g_tuples_index                      (GTuples *tuples,
+                                                         gint index_,
+                                                         gint field);
+

+Gets a field from the records returned by g_relation_select(). It +returns the given field of the record at the given index. The +returned value should not be changed.

+
++ + + + + + + + + + + + + + + + + + +

tuples :

the tuple data, returned by g_relation_select(). +

index_ :

the index of the record. +

field :

the field to return. +

Returns :

the field of the record. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Sequences.html b/docs/reference/glib/html/glib-Sequences.html new file mode 100644 index 0000000..ae9da6d --- /dev/null +++ b/docs/reference/glib/html/glib-Sequences.html @@ -0,0 +1,1334 @@ + + + + +Sequences + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Sequences

+

Sequences — scalable lists

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GSequence;
+typedef             GSequenceIter;
+gint                (*GSequenceIterCompareFunc)         (GSequenceIter *a,
+                                                         GSequenceIter *b,
+                                                         gpointer data);
+
+GSequence *         g_sequence_new                      (GDestroyNotify data_destroy);
+void                g_sequence_free                     (GSequence *seq);
+gint                g_sequence_get_length               (GSequence *seq);
+void                g_sequence_foreach                  (GSequence *seq,
+                                                         GFunc func,
+                                                         gpointer user_data);
+void                g_sequence_foreach_range            (GSequenceIter *begin,
+                                                         GSequenceIter *end,
+                                                         GFunc func,
+                                                         gpointer user_data);
+void                g_sequence_sort                     (GSequence *seq,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+void                g_sequence_sort_iter                (GSequence *seq,
+                                                         GSequenceIterCompareFunc cmp_func,
+                                                         gpointer cmp_data);
+
+GSequenceIter *     g_sequence_get_begin_iter           (GSequence *seq);
+GSequenceIter *     g_sequence_get_end_iter             (GSequence *seq);
+GSequenceIter *     g_sequence_get_iter_at_pos          (GSequence *seq,
+                                                         gint pos);
+GSequenceIter *     g_sequence_append                   (GSequence *seq,
+                                                         gpointer data);
+GSequenceIter *     g_sequence_prepend                  (GSequence *seq,
+                                                         gpointer data);
+GSequenceIter *     g_sequence_insert_before            (GSequenceIter *iter,
+                                                         gpointer data);
+void                g_sequence_move                     (GSequenceIter *src,
+                                                         GSequenceIter *dest);
+void                g_sequence_swap                     (GSequenceIter *a,
+                                                         GSequenceIter *b);
+GSequenceIter *     g_sequence_insert_sorted            (GSequence *seq,
+                                                         gpointer data,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+GSequenceIter *     g_sequence_insert_sorted_iter       (GSequence *seq,
+                                                         gpointer data,
+                                                         GSequenceIterCompareFunc iter_cmp,
+                                                         gpointer cmp_data);
+void                g_sequence_sort_changed             (GSequenceIter *iter,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+void                g_sequence_sort_changed_iter        (GSequenceIter *iter,
+                                                         GSequenceIterCompareFunc iter_cmp,
+                                                         gpointer cmp_data);
+void                g_sequence_remove                   (GSequenceIter *iter);
+void                g_sequence_remove_range             (GSequenceIter *begin,
+                                                         GSequenceIter *end);
+void                g_sequence_move_range               (GSequenceIter *dest,
+                                                         GSequenceIter *begin,
+                                                         GSequenceIter *end);
+GSequenceIter *     g_sequence_search                   (GSequence *seq,
+                                                         gpointer data,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+GSequenceIter *     g_sequence_search_iter              (GSequence *seq,
+                                                         gpointer data,
+                                                         GSequenceIterCompareFunc iter_cmp,
+                                                         gpointer cmp_data);
+
+gpointer            g_sequence_get                      (GSequenceIter *iter);
+void                g_sequence_set                      (GSequenceIter *iter,
+                                                         gpointer data);
+
+gboolean            g_sequence_iter_is_begin            (GSequenceIter *iter);
+gboolean            g_sequence_iter_is_end              (GSequenceIter *iter);
+GSequenceIter *     g_sequence_iter_next                (GSequenceIter *iter);
+GSequenceIter *     g_sequence_iter_prev                (GSequenceIter *iter);
+gint                g_sequence_iter_get_position        (GSequenceIter *iter);
+GSequenceIter *     g_sequence_iter_move                (GSequenceIter *iter,
+                                                         gint delta);
+GSequence *         g_sequence_iter_get_sequence        (GSequenceIter *iter);
+
+gint                g_sequence_iter_compare             (GSequenceIter *a,
+                                                         GSequenceIter *b);
+GSequenceIter *     g_sequence_range_get_midpoint       (GSequenceIter *begin,
+                                                         GSequenceIter *end);
+
+
+
+

Description

+

+The GSequence data structure has the API of a list, but is +implemented internally with a balanced binary tree. This means that +it is possible to maintain a sorted list of n elements in time O(n +log n). The data contained in each element can be either integer +values, by using of the Type Conversion Macros, +or simply pointers to any type of data. +

+

+A GSequence is accessed through iterators, +represented by a GSequenceIter. An iterator represents a position +between two elements of the sequence. For example, the +begin iterator represents the gap immediately +before the first element of the sequence, and the +end iterator represents the gap immediately +after the last element. In an empty sequence, the begin and end +iterators are the same. +

+

+Some methods on GSequence operate on ranges of items. For example +g_sequence_foreach_range() will call a user-specified function on +each element with the given range. The range is delimited by the +gaps represented by the passed-in iterators, so if you pass in the +begin and end iterators, the range in question is the entire +sequence. +

+

+The function g_sequence_get() is used with an iterator to access the +element immediately following the gap that the iterator represents. +The iterator is said to point to that element. +

+

+Iterators are stable across most operations on a GSequence. For +example an iterator pointing to some element of a sequence will +continue to point to that element even after the sequence is sorted. +Even moving an element to another sequence using for example +g_sequence_move_range() will not invalidate the iterators pointing +to it. The only operation that will invalidate an iterator is when +the element it points to is removed from any sequence.

+
+
+

Details

+
+

GSequence

+
typedef struct _GSequence GSequence;
+

+The GSequence struct is an opaque data type representing a +Sequence data type.

+
+
+
+

GSequenceIter

+
typedef struct _GSequenceNode  GSequenceIter;
+
+

+The GSequenceIter struct is an opaque data type representing an +iterator pointing into a GSequence.

+
+
+
+

GSequenceIterCompareFunc ()

+
gint                (*GSequenceIterCompareFunc)         (GSequenceIter *a,
+                                                         GSequenceIter *b,
+                                                         gpointer data);
+

+A GSequenceIterCompareFunc is a function used to compare iterators. +It must return zero if the iterators compare equal, a negative value +if a comes before b, and a positive value if b comes before a.

+
++ + + + + + + + + + + + + + + + + + +

a :

a GSequenceIter +

b :

a GSequenceIter +

data :

user data +

Returns :

zero if the iterators are equal, a negative value if a + comes before b, and a positive value if b comes before + a. +
+
+
+
+

g_sequence_new ()

+
GSequence *         g_sequence_new                      (GDestroyNotify data_destroy);
+

+Creates a new GSequence. The data_destroy function, if non-NULL will +be called on all items when the sequence is destroyed and on items that +are removed from the sequence.

+
++ + + + + + + + + + +

data_destroy :

a GDestroyNotify function, or NULL +

Returns :

a new GSequence + +
+

Since 2.14

+
+
+
+

g_sequence_free ()

+
void                g_sequence_free                     (GSequence *seq);
+

+Frees the memory allocated for seq. If seq has a data destroy +function associated with it, that function is called on all items in +seq.

+
++ + + + +

seq :

a GSequence +
+

Since 2.14

+
+
+
+

g_sequence_get_length ()

+
gint                g_sequence_get_length               (GSequence *seq);
+

+Returns the length of seq

+
++ + + + + + + + + + +

seq :

a GSequence +

Returns :

the length of seq + +
+

Since 2.14

+
+
+
+

g_sequence_foreach ()

+
void                g_sequence_foreach                  (GSequence *seq,
+                                                         GFunc func,
+                                                         gpointer user_data);
+

+Calls func for each item in the sequence passing user_data +to the function.

+
++ + + + + + + + + + + + + + +

seq :

a GSequence +

func :

the function to call for each item in seq +

user_data :

user data passed to func +
+

Since 2.14

+
+
+
+

g_sequence_foreach_range ()

+
void                g_sequence_foreach_range            (GSequenceIter *begin,
+                                                         GSequenceIter *end,
+                                                         GFunc func,
+                                                         gpointer user_data);
+

+Calls func for each item in the range (begin, end) passing +user_data to the function.

+
++ + + + + + + + + + + + + + + + + + +

begin :

a GSequenceIter +

end :

a GSequenceIter +

func :

a GFunc +

user_data :

user data passed to func +
+

Since 2.14

+
+
+
+

g_sequence_sort ()

+
void                g_sequence_sort                     (GSequence *seq,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+

+Sorts seq using cmp_func.

+
++ + + + + + + + + + + + + + +

seq :

a GSequence +

cmp_func :

the GCompareDataFunc used to sort seq. This function is + passed two items of seq and should return 0 if they are equal, + a negative value if the first comes before the second, and a + positive value if the second comes before the first. +

cmp_data :

user data passed to cmp_func +
+

Since 2.14

+
+
+
+

g_sequence_sort_iter ()

+
void                g_sequence_sort_iter                (GSequence *seq,
+                                                         GSequenceIterCompareFunc cmp_func,
+                                                         gpointer cmp_data);
+

+Like g_sequence_sort(), but uses a GSequenceIterCompareFunc instead +of a GCompareDataFunc as the compare function

+
++ + + + + + + + + + + + + + +

seq :

a GSequence +

cmp_func :

the GSequenceItercompare used to compare iterators in the + sequence. It is called with two iterators pointing into seq. It should + return 0 if the iterators are equal, a negative value if the first + iterator comes before the second, and a positive value if the second + iterator comes before the first. +

cmp_data :

user data passed to cmp_func +
+

Since 2.14

+
+
+
+

g_sequence_get_begin_iter ()

+
GSequenceIter *     g_sequence_get_begin_iter           (GSequence *seq);
+

+Returns the begin iterator for seq.

+
++ + + + + + + + + + +

seq :

a GSequence +

Returns :

the begin iterator for seq. + +
+

Since 2.14

+
+
+
+

g_sequence_get_end_iter ()

+
GSequenceIter *     g_sequence_get_end_iter             (GSequence *seq);
+

+Returns the end iterator for seg

+
++ + + + + + + + + + +

seq :

a GSequence +

Returns :

the end iterator for seq + +
+

Since 2.14

+
+
+
+

g_sequence_get_iter_at_pos ()

+
GSequenceIter *     g_sequence_get_iter_at_pos          (GSequence *seq,
+                                                         gint pos);
+

+Returns the iterator at position pos. If pos is negative or larger +than the number of items in seq, the end iterator is returned.

+
++ + + + + + + + + + + + + + +

seq :

a GSequence +

pos :

a position in seq, or -1 for the end. +

Returns :

The GSequenceIter at position pos + +
+

Since 2.14

+
+
+
+

g_sequence_append ()

+
GSequenceIter *     g_sequence_append                   (GSequence *seq,
+                                                         gpointer data);
+

+Adds a new item to the end of seq.

+
++ + + + + + + + + + + + + + +

seq :

a GSequencePointer +

data :

the data for the new item +

Returns :

an iterator pointing to the new item + +
+

Since 2.14

+
+
+
+

g_sequence_prepend ()

+
GSequenceIter *     g_sequence_prepend                  (GSequence *seq,
+                                                         gpointer data);
+

+Adds a new item to the front of seq

+
++ + + + + + + + + + + + + + +

seq :

a GSequence +

data :

the data for the new item +

Returns :

an iterator pointing to the new item + +
+

Since 2.14

+
+
+
+

g_sequence_insert_before ()

+
GSequenceIter *     g_sequence_insert_before            (GSequenceIter *iter,
+                                                         gpointer data);
+

+Inserts a new item just before the item pointed to by iter.

+
++ + + + + + + + + + + + + + +

iter :

a GSequenceIter +

data :

the data for the new item +

Returns :

an iterator pointing to the new item + +
+

Since 2.14

+
+
+
+

g_sequence_move ()

+
void                g_sequence_move                     (GSequenceIter *src,
+                                                         GSequenceIter *dest);
+

+Moves the item pointed to by src to the position indicated by dest. +After calling this function dest will point to the position immediately +after src. It is allowed for src and dest to point into different +sequences.

+
++ + + + + + + + + + +

src :

a GSequenceIter pointing to the item to move +

dest :

a GSequenceIter pointing to the position to which + the item is moved. +
+

Since 2.14

+
+
+
+

g_sequence_swap ()

+
void                g_sequence_swap                     (GSequenceIter *a,
+                                                         GSequenceIter *b);
+

+Swaps the items pointed to by a and b. It is allowed for a and b +to point into difference sequences.

+
++ + + + + + + + + + +

a :

a GSequenceIter +

b :

a GSequenceIter +
+

Since 2.14

+
+
+
+

g_sequence_insert_sorted ()

+
GSequenceIter *     g_sequence_insert_sorted            (GSequence *seq,
+                                                         gpointer data,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+

+Inserts data into sequence using func to determine the new position. +The sequence must already be sorted according to cmp_func; otherwise the +new position of data is undefined.

+
++ + + + + + + + + + + + + + + + + + + + + + +

seq :

a GSequence +

data :

the data to insert +

cmp_func :

the GCompareDataFunc used to compare items in the sequence. It + is called with two items of the seq and user_data. It should + return 0 if the items are equal, a negative value if the first + item comes before the second, and a positive value if the second + item comes before the first. +

cmp_data :

user data passed to cmp_func. +

Returns :

a GSequenceIter pointing to the new item. + +
+

Since 2.14

+
+
+
+

g_sequence_insert_sorted_iter ()

+
GSequenceIter *     g_sequence_insert_sorted_iter       (GSequence *seq,
+                                                         gpointer data,
+                                                         GSequenceIterCompareFunc iter_cmp,
+                                                         gpointer cmp_data);
+

+Like g_sequence_insert_sorted(), but uses +a GSequenceIterCompareFunc instead of a GCompareDataFunc as +the compare function.

+
++ + + + + + + + + + + + + + + + + + + + + + +

seq :

a GSequence +

data :

data for the new item +

iter_cmp :

the GSequenceItercompare used to compare iterators in the + sequence. It is called with two iterators pointing into seq. It should + return 0 if the iterators are equal, a negative value if the first + iterator comes before the second, and a positive value if the second + iterator comes before the first. +

cmp_data :

user data passed to cmp_func +

Returns :

a GSequenceIter pointing to the new item + +
+

Since 2.14

+
+
+
+

g_sequence_sort_changed ()

+
void                g_sequence_sort_changed             (GSequenceIter *iter,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+

+Moves the data pointed to a new position as indicated by cmp_func. This +function should be called for items in a sequence already sorted according +to cmp_func whenever some aspect of an item changes so that cmp_func +may return different values for that item.

+
++ + + + + + + + + + + + + + +

iter :

A GSequenceIter +

cmp_func :

the GCompareDataFunc used to compare items in the sequence. It + is called with two items of the seq and user_data. It should + return 0 if the items are equal, a negative value if the first + item comes before the second, and a positive value if the second + item comes before the first. +

cmp_data :

user data passed to cmp_func. +
+

Since 2.14

+
+
+
+

g_sequence_sort_changed_iter ()

+
void                g_sequence_sort_changed_iter        (GSequenceIter *iter,
+                                                         GSequenceIterCompareFunc iter_cmp,
+                                                         gpointer cmp_data);
+

+Like g_sequence_sort_changed(), but uses +a GSequenceIterCompareFunc instead of a GCompareDataFunc as +the compare function.

+
++ + + + + + + + + + + + + + +

iter :

a GSequenceIter +

iter_cmp :

the GSequenceItercompare used to compare iterators in the + sequence. It is called with two iterators pointing into seq. It should + return 0 if the iterators are equal, a negative value if the first + iterator comes before the second, and a positive value if the second + iterator comes before the first. +

cmp_data :

user data passed to cmp_func +
+

Since 2.14

+
+
+
+

g_sequence_remove ()

+
void                g_sequence_remove                   (GSequenceIter *iter);
+

+Removes the item pointed to by iter. It is an error to pass the +end iterator to this function. +

+

+If the sequnce has a data destroy function associated with it, this +function is called on the data for the removed item.

+
++ + + + +

iter :

a GSequenceIter +
+

Since 2.14

+
+
+
+

g_sequence_remove_range ()

+
void                g_sequence_remove_range             (GSequenceIter *begin,
+                                                         GSequenceIter *end);
+

+Removes all items in the (begin, end) range. +

+

+If the sequence has a data destroy function associated with it, this +function is called on the data for the removed items.

+
++ + + + + + + + + + +

begin :

a GSequenceIter +

end :

a GSequenceIter +
+

Since 2.14

+
+
+
+

g_sequence_move_range ()

+
void                g_sequence_move_range               (GSequenceIter *dest,
+                                                         GSequenceIter *begin,
+                                                         GSequenceIter *end);
+

+Inserts the (begin, end) range at the destination pointed to by ptr. +The begin and end iters must point into the same sequence. It is +allowed for dest to point to a different sequence than the one pointed +into by begin and end. +

+

+If dest is NULL, the range indicated by begin and end is +removed from the sequence. If dest iter points to a place within +the (begin, end) range, the range does not move.

+
++ + + + + + + + + + + + + + +

dest :

a GSequenceIter +

begin :

a GSequenceIter +

end :

a GSequenceIter +
+

Since 2.14

+
+
+
+

g_sequence_search ()

+
GSequenceIter *     g_sequence_search                   (GSequence *seq,
+                                                         gpointer data,
+                                                         GCompareDataFunc cmp_func,
+                                                         gpointer cmp_data);
+

+Returns an iterator pointing to the position where data would +be inserted according to cmp_func and cmp_data.

+
++ + + + + + + + + + + + + + + + + + + + + + +

seq :

a GSequence +

data :

data for the new item +

cmp_func :

the GCompareDataFunc used to compare items in the sequence. It + is called with two items of the seq and user_data. It should + return 0 if the items are equal, a negative value if the first + item comes before the second, and a positive value if the second + item comes before the first. +

cmp_data :

user data passed to cmp_func. +

Returns :

an GSequenceIter pointing to the position where data +would have been inserted according to cmp_func and cmp_data. + +
+

Since 2.14

+
+
+
+

g_sequence_search_iter ()

+
GSequenceIter *     g_sequence_search_iter              (GSequence *seq,
+                                                         gpointer data,
+                                                         GSequenceIterCompareFunc iter_cmp,
+                                                         gpointer cmp_data);
+

+Like g_sequence_search(), but uses +a GSequenceIterCompareFunc instead of a GCompareDataFunc as +the compare function.

+
++ + + + + + + + + + + + + + + + + + + + + + +

seq :

a GSequence +

data :

data for the new item +

iter_cmp :

the GSequenceIterCompare function used to compare iterators + in the sequence. It is called with two iterators pointing into seq. + It should return 0 if the iterators are equal, a negative value if the + first iterator comes before the second, and a positive value if the + second iterator comes before the first. +

cmp_data :

user data passed to iter_cmp +

Returns :

a GSequenceIter pointing to the position in seq +where data would have been inserted according to iter_cmp and cmp_data. + +
+

Since 2.14

+
+
+
+

g_sequence_get ()

+
gpointer            g_sequence_get                      (GSequenceIter *iter);
+

+Returns the data that iter points to.

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

the data that iter points to + +
+

Since 2.14

+
+
+
+

g_sequence_set ()

+
void                g_sequence_set                      (GSequenceIter *iter,
+                                                         gpointer data);
+

+Changes the data for the item pointed to by iter to be data. If +the sequence has a data destroy function associated with it, that +function is called on the existing data that iter pointed to.

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

data :

new data for the item +
+

Since 2.14

+
+
+
+

g_sequence_iter_is_begin ()

+
gboolean            g_sequence_iter_is_begin            (GSequenceIter *iter);
+

+Returns whether iter is the begin iterator

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

whether iter is the begin iterator + +
+

Since 2.14

+
+
+
+

g_sequence_iter_is_end ()

+
gboolean            g_sequence_iter_is_end              (GSequenceIter *iter);
+

+Returns whether iter is the end iterator

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

Whether iter is the end iterator. + +
+

Since 2.14

+
+
+
+

g_sequence_iter_next ()

+
GSequenceIter *     g_sequence_iter_next                (GSequenceIter *iter);
+

+Returns an iterator pointing to the next position after iter. If +iter is the end iterator, the end iterator is returned.

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

a GSequenceIter pointing to the next position after iter. + +
+

Since 2.14

+
+
+
+

g_sequence_iter_prev ()

+
GSequenceIter *     g_sequence_iter_prev                (GSequenceIter *iter);
+

+Returns an iterator pointing to the previous position before iter. If +iter is the begin iterator, the begin iterator is returned.

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

a GSequenceIter pointing to the previous position before +iter. + +
+

Since 2.14

+
+
+
+

g_sequence_iter_get_position ()

+
gint                g_sequence_iter_get_position        (GSequenceIter *iter);
+

+Returns the position of iter

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

the position of iter + +
+

Since 2.14

+
+
+
+

g_sequence_iter_move ()

+
GSequenceIter *     g_sequence_iter_move                (GSequenceIter *iter,
+                                                         gint delta);
+

+Returns the GSequenceIter which is delta positions away from iter. +If iter is closer than -delta positions to the beginning of the sequence, +the begin iterator is returned. If iter is closer than delta positions +to the end of the sequence, the end iterator is returned.

+
++ + + + + + + + + + + + + + +

iter :

a GSequenceIter +

delta :

A positive or negative number indicating how many positions away + from iter the returned GSequenceIter will be. +

Returns :

a GSequenceIter which is delta positions away from iter. + +
+

Since 2.14

+
+
+
+

g_sequence_iter_get_sequence ()

+
GSequence *         g_sequence_iter_get_sequence        (GSequenceIter *iter);
+

+Returns the GSequence that iter points into.

+
++ + + + + + + + + + +

iter :

a GSequenceIter +

Returns :

the GSequence that iter points into. + +
+

Since 2.14

+
+
+
+

g_sequence_iter_compare ()

+
gint                g_sequence_iter_compare             (GSequenceIter *a,
+                                                         GSequenceIter *b);
+

+Returns a negative number if a comes before b, 0 if they are equal, +and a positive number if a comes after b. +

+

+The a and b iterators must point into the same sequence.

+
++ + + + + + + + + + + + + + +

a :

a GSequenceIter +

b :

a GSequenceIter +

Returns :

A negative number if a comes before b, 0 if they are +equal, and a positive number if a comes after b. + +
+

Since 2.14

+
+
+
+

g_sequence_range_get_midpoint ()

+
GSequenceIter *     g_sequence_range_get_midpoint       (GSequenceIter *begin,
+                                                         GSequenceIter *end);
+

+Finds an iterator somewhere in the range (begin, end). This +iterator will be close to the middle of the range, but is not +guaranteed to be exactly in the middle. +

+

+The begin and end iterators must both point to the same sequence and +begin must come before or be equal to end in the sequence.

+
++ + + + + + + + + + + + + + +

begin :

a GSequenceIter +

end :

a GSequenceIter +

Returns :

A GSequenceIter pointing somewhere in the +(begin, end) range. + +
+

Since 2.14

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Shell-related-Utilities.html b/docs/reference/glib/html/glib-Shell-related-Utilities.html new file mode 100644 index 0000000..f01a3e9 --- /dev/null +++ b/docs/reference/glib/html/glib-Shell-related-Utilities.html @@ -0,0 +1,253 @@ + + + + +Shell-related Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Shell-related Utilities

+

Shell-related Utilities — shell-like commandline handling

+
+
+

Synopsis

+
+#include <glib.h>
+
+enum                GShellError;
+#define             G_SHELL_ERROR
+gboolean            g_shell_parse_argv                  (const gchar *command_line,
+                                                         gint *argcp,
+                                                         gchar ***argvp,
+                                                         GError **error);
+gchar*              g_shell_quote                       (const gchar *unquoted_string);
+gchar*              g_shell_unquote                     (const gchar *quoted_string,
+                                                         GError **error);
+
+
+
+

Description

+
+
+

Details

+
+

enum GShellError

+
typedef enum
+{
+  /* mismatched or otherwise mangled quoting */
+  G_SHELL_ERROR_BAD_QUOTING,
+  /* string to be parsed was empty */
+  G_SHELL_ERROR_EMPTY_STRING,
+  G_SHELL_ERROR_FAILED
+} GShellError;
+
+

+Error codes returned by shell functions.

+
++ + + + + + + + + + + + + + +

G_SHELL_ERROR_BAD_QUOTING

Mismatched or otherwise mangled quoting. +

G_SHELL_ERROR_EMPTY_STRING

String to be parsed was empty. +

G_SHELL_ERROR_FAILED

Some other error. +
+
+
+
+

G_SHELL_ERROR

+
#define G_SHELL_ERROR g_shell_error_quark ()
+
+

+Error domain for shell functions. Errors in this domain will be from +the GShellError enumeration. See GError for information on error +domains.

+
+
+
+

g_shell_parse_argv ()

+
gboolean            g_shell_parse_argv                  (const gchar *command_line,
+                                                         gint *argcp,
+                                                         gchar ***argvp,
+                                                         GError **error);
+

+Parses a command line into an argument vector, in much the same way +the shell would, but without many of the expansions the shell would +perform (variable expansion, globs, operators, filename expansion, +etc. are not supported). The results are defined to be the same as +those you would get from a UNIX98 /bin/sh, as long as the input +contains none of the unsupported shell expansions. If the input +does contain such expansions, they are passed through +literally. Possible errors are those from the G_SHELL_ERROR +domain. Free the returned vector with g_strfreev().

+
++ + + + + + + + + + + + + + + + + + + + + + +

command_line :

command line to parse +

argcp :

return location for number of args +

argvp :

return location for array of args +

error :

return location for error +

Returns :

TRUE on success, FALSE if error set +
+
+
+
+

g_shell_quote ()

+
gchar*              g_shell_quote                       (const gchar *unquoted_string);
+

+Quotes a string so that the shell (/bin/sh) will interpret the +quoted string to mean unquoted_string. If you pass a filename to +the shell, for example, you should first quote it with this +function. The return value must be freed with g_free(). The +quoting style used is undefined (single or double quotes may be +used).

+
++ + + + + + + + + + +

unquoted_string :

a literal string +

Returns :

quoted string +
+
+
+
+

g_shell_unquote ()

+
gchar*              g_shell_unquote                     (const gchar *quoted_string,
+                                                         GError **error);
+

+Unquotes a string as the shell (/bin/sh) would. Only handles +quotes; if a string contains file globs, arithmetic operators, +variables, backticks, redirections, or other special-to-the-shell +features, the result will be different from the result a real shell +would produce (the variables, backticks, etc. will be passed +through literally instead of being expanded). This function is +guaranteed to succeed if applied to the result of +g_shell_quote(). If it fails, it returns NULL and sets the +error. The quoted_string need not actually contain quoted or +escaped text; g_shell_unquote() simply goes through the string and +unquotes/unescapes anything that the shell would. Both single and +double quotes are handled, as are escapes including escaped +newlines. The return value must be freed with g_free(). Possible +errors are in the G_SHELL_ERROR domain. +

+

+Shell quoting rules are a bit strange. Single quotes preserve the +literal string exactly. escape sequences are not allowed; not even +\' - if you want a ' in the quoted text, you have to do something +like 'foo'\''bar'. Double quotes allow $, `, ", \, and newline to +be escaped with backslash. Otherwise double quotes preserve things +literally.

+
++ + + + + + + + + + + + + + +

quoted_string :

shell-quoted string +

error :

error return location or NULL +

Returns :

an unquoted string +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Simple-XML-Subset-Parser.html b/docs/reference/glib/html/glib-Simple-XML-Subset-Parser.html new file mode 100644 index 0000000..e61d604 --- /dev/null +++ b/docs/reference/glib/html/glib-Simple-XML-Subset-Parser.html @@ -0,0 +1,1178 @@ + + + + +Simple XML Subset Parser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Simple XML Subset Parser

+

Simple XML Subset Parser — parses a subset of XML

+
+
+

Synopsis

+
+#include <glib.h>
+
+enum                GMarkupError;
+#define             G_MARKUP_ERROR
+enum                GMarkupParseFlags;
+                    GMarkupParseContext;
+                    GMarkupParser;
+gchar*              g_markup_escape_text                (const gchar *text,
+                                                         gssize length);
+gchar *             g_markup_printf_escaped             (const char *format,
+                                                         ...);
+gchar *             g_markup_vprintf_escaped            (const char *format,
+                                                         va_list args);
+gboolean            g_markup_parse_context_end_parse    (GMarkupParseContext *context,
+                                                         GError **error);
+void                g_markup_parse_context_free         (GMarkupParseContext *context);
+void                g_markup_parse_context_get_position (GMarkupParseContext *context,
+                                                         gint *line_number,
+                                                         gint *char_number);
+const gchar *       g_markup_parse_context_get_element  (GMarkupParseContext *context);
+const GSList *      g_markup_parse_context_get_element_stack
+                                                        (GMarkupParseContext *context);
+gpointer            g_markup_parse_context_get_user_data
+                                                        (GMarkupParseContext *context);
+GMarkupParseContext * g_markup_parse_context_new        (const GMarkupParser *parser,
+                                                         GMarkupParseFlags flags,
+                                                         gpointer user_data,
+                                                         GDestroyNotify user_data_dnotify);
+gboolean            g_markup_parse_context_parse        (GMarkupParseContext *context,
+                                                         const gchar *text,
+                                                         gssize text_len,
+                                                         GError **error);
+void                g_markup_parse_context_push         (GMarkupParseContext *context,
+                                                         GMarkupParser *parser,
+                                                         gpointer user_data);
+gpointer            g_markup_parse_context_pop          (GMarkupParseContext *context);
+
+enum                GMarkupCollectType;
+gboolean            g_markup_collect_attributes         (const gchar *element_name,
+                                                         const gchar **attribute_names,
+                                                         const gchar **attribute_values,
+                                                         GError **error,
+                                                         GMarkupCollectType first_type,
+                                                         const gchar *first_attr,
+                                                         ...);
+
+
+
+

Description

+

+The "GMarkup" parser is intended to parse a simple markup format +that's a subset of XML. This is a small, efficient, easy-to-use +parser. It should not be used if you expect to interoperate with other +applications generating full-scale XML. However, it's very useful for +application data files, config files, etc. where you know your +application will be the only one writing the file. Full-scale XML +parsers should be able to parse the subset used by GMarkup, so you can +easily migrate to full-scale XML at a later time if the need arises. +

+

+GMarkup is not guaranteed to signal an error on all invalid XML; the +parser may accept documents that an XML parser would not. However, XML +documents which are not well-formed[5] are not considered valid GMarkup +documents. +

+

+Simplifications to XML include: +

+
    +
  • +Only UTF-8 encoding is allowed. +

  • +
  • +No user-defined entities. +

  • +
  • +Processing instructions, comments and the doctype declaration are "passed +through" but are not interpreted in any way. +

  • +
  • +No DTD or validation. +

  • +
+

+

+

+The markup format does support: +

+
    +
  • +Elements +

  • +
  • +Attributes +

  • +
  • +5 standard entities: &amp; &lt; &gt; &quot; &apos; +

  • +
  • +Character references +

  • +
  • +Sections marked as CDATA +

  • +
+

+

+
+
+

Details

+
+

enum GMarkupError

+
typedef enum
+{
+  G_MARKUP_ERROR_BAD_UTF8,
+  G_MARKUP_ERROR_EMPTY,
+  G_MARKUP_ERROR_PARSE,
+  /* The following are primarily intended for specific GMarkupParser
+   * implementations to set.
+   */
+  G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+  G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+  G_MARKUP_ERROR_INVALID_CONTENT,
+  G_MARKUP_ERROR_MISSING_ATTRIBUTE
+} GMarkupError;
+
+

+Error codes returned by markup parsing. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_MARKUP_ERROR_BAD_UTF8

text being parsed was not valid UTF-8 +

G_MARKUP_ERROR_EMPTY

document contained nothing, or only whitespace +

G_MARKUP_ERROR_PARSE

document was ill-formed +

G_MARKUP_ERROR_UNKNOWN_ELEMENT

error should be set by GMarkupParser functions; element wasn't known +

G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE

error should be set by GMarkupParser functions; attribute wasn't known +

G_MARKUP_ERROR_INVALID_CONTENT

error should be set by GMarkupParser functions; content was invalid +

G_MARKUP_ERROR_MISSING_ATTRIBUTE

error should be set by GMarkupParser functions; a required attribute was missing +
+
+
+
+

G_MARKUP_ERROR

+
#define G_MARKUP_ERROR g_markup_error_quark ()
+
+

+Error domain for markup parsing. Errors in this domain will +be from the GMarkupError enumeration. See GError for information on +error domains. +

+
+
+
+

enum GMarkupParseFlags

+
typedef enum
+{
+  G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0,
+  G_MARKUP_TREAT_CDATA_AS_TEXT              = 1 << 1,
+  G_MARKUP_PREFIX_ERROR_POSITION            = 1 << 2
+} GMarkupParseFlags;
+
+

+Flags that affect the behaviour of the parser. +

+
++ + + + + + + + + + + + + + +

G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG

flag you should not use. +

G_MARKUP_TREAT_CDATA_AS_TEXT

When this flag is set, CDATA marked + sections are not passed literally to the passthrough function of + the parser. Instead, the content of the section (without the + <![CDATA[ and ]]>) is + passed to the text function. This flag was added in GLib 2.12. +

G_MARKUP_PREFIX_ERROR_POSITION

Normally errors caught by GMarkup + itself have line/column information prefixed to them to let the + caller know the location of the error. When this flag is set the + location information is also prefixed to errors generated by the + GMarkupParser implementation functions. +
+
+
+
+

GMarkupParseContext

+
typedef struct _GMarkupParseContext GMarkupParseContext;
+

+A parse context is used to parse a stream of bytes that you expect to +contain marked-up text. See g_markup_parse_context_new(), +GMarkupParser, and so on for more details. +

+
+
+
+

GMarkupParser

+
typedef struct {
+  /* Called for open tags <foo bar="baz"> */
+  void (*start_element)  (GMarkupParseContext *context,
+                          const gchar         *element_name,
+                          const gchar        **attribute_names,
+                          const gchar        **attribute_values,
+                          gpointer             user_data,
+                          GError             **error);
+
+  /* Called for close tags </foo> */
+  void (*end_element)    (GMarkupParseContext *context,
+                          const gchar         *element_name,
+                          gpointer             user_data,
+                          GError             **error);
+
+  /* Called for character data */
+  /* text is not nul-terminated */
+  void (*text)           (GMarkupParseContext *context,
+                          const gchar         *text,
+                          gsize                text_len,  
+                          gpointer             user_data,
+                          GError             **error);
+
+  /* Called for strings that should be re-saved verbatim in this same
+   * position, but are not otherwise interpretable.  At the moment
+   * this includes comments and processing instructions.
+   */
+  /* text is not nul-terminated. */
+  void (*passthrough)    (GMarkupParseContext *context,
+                          const gchar         *passthrough_text,
+                          gsize                text_len,  
+                          gpointer             user_data,
+                          GError             **error);
+
+  /* Called on error, including one set by other
+   * methods in the vtable. The GError should not be freed.
+   */
+  void (*error)          (GMarkupParseContext *context,
+                          GError              *error,
+                          gpointer             user_data);
+} GMarkupParser;
+
+

+Any of the fields in GMarkupParser can be NULL, in which case they +will be ignored. Except for the error function, any of these +callbacks can set an error; in particular the +G_MARKUP_ERROR_UNKNOWN_ELEMENT, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, +and G_MARKUP_ERROR_INVALID_CONTENT errors are intended to be set +from these callbacks. If you set an error from a callback, +g_markup_parse_context_parse() will report that error back to its caller. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

start_element ()

Callback to invoke when the opening tag of an element + is seen. +

end_element ()

Callback to invoke when the closing tag of an element is seen. + Note that this is also called for empty tags like + <empty/>. +

text ()

Callback to invoke when some text is seen (text is always + inside an element). Note that the text of an element may be spread + over multiple calls of this function. If the G_MARKUP_TREAT_CDATA_AS_TEXT + flag is set, this function is also called for the content of CDATA marked + sections. +

passthrough ()

Callback to invoke for comments, processing instructions + and doctype declarations; if you're re-writing the parsed document, + write the passthrough text back out in the same position. If the + G_MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also + called for CDATA marked sections. +

error ()

Callback to invoke when an error occurs. +
+
+
+
+

g_markup_escape_text ()

+
gchar*              g_markup_escape_text                (const gchar *text,
+                                                         gssize length);
+

+Escapes text so that the markup parser will parse it verbatim. +Less than, greater than, ampersand, etc. are replaced with the +corresponding entities. This function would typically be used +when writing out a file to be parsed with the markup parser. +

+

+Note that this function doesn't protect whitespace and line endings +from being processed according to the XML rules for normalization +of line endings and attribute values. +

+

+Note also that if given a string containing them, this function +will produce character references in the range of &x1; .. +&x1f; for all control sequences except for tabstop, newline +and carriage return. The character references in this range are +not valid XML 1.0, but they are valid XML 1.1 and will be accepted +by the GMarkup parser.

+
++ + + + + + + + + + + + + + +

text :

some valid UTF-8 text +

length :

length of text in bytes, or -1 if the text is nul-terminated +

Returns :

a newly allocated string with the escaped text +
+
+
+
+

g_markup_printf_escaped ()

+
gchar *             g_markup_printf_escaped             (const char *format,
+                                                         ...);
+

+Formats arguments according to format, escaping +all string and character arguments in the fashion +of g_markup_escape_text(). This is useful when you +want to insert literal strings into XML-style markup +output, without having to worry that the strings +might themselves contain markup. +

+

+

+
+const char *store = "Fortnum & Mason";
+const char *item = "Tea";
+char *output;
+ 
+output = g_markup_printf_escaped ("<purchase>"
+                                  "<store>%s</store>"
+                                  "<item>%s</item>"
+                                  "</purchase>",
+                                  store, item);
+
+
++ + + + + + + + + + + + + + +

format :

printf() style format string +

... :

the arguments to insert in the format string +

Returns :

newly allocated result from formatting + operation. Free with g_free(). + +
+

Since 2.4

+
+
+
+

g_markup_vprintf_escaped ()

+
gchar *             g_markup_vprintf_escaped            (const char *format,
+                                                         va_list args);
+

+Formats the data in args according to format, escaping +all string and character arguments in the fashion +of g_markup_escape_text(). See g_markup_printf_escaped().

+
++ + + + + + + + + + + + + + +

format :

printf() style format string +

args :

variable argument list, similar to vprintf() +

Returns :

newly allocated result from formatting + operation. Free with g_free(). + +
+

Since 2.4

+
+
+
+

g_markup_parse_context_end_parse ()

+
gboolean            g_markup_parse_context_end_parse    (GMarkupParseContext *context,
+                                                         GError **error);
+

+Signals to the GMarkupParseContext that all data has been +fed into the parse context with g_markup_parse_context_parse(). +This function reports an error if the document isn't complete, +for example if elements are still open.

+
++ + + + + + + + + + + + + + +

context :

a GMarkupParseContext +

error :

return location for a GError +

Returns :

TRUE on success, FALSE if an error was set +
+
+
+
+

g_markup_parse_context_free ()

+
void                g_markup_parse_context_free         (GMarkupParseContext *context);
+

+Frees a GMarkupParseContext. Can't be called from inside +one of the GMarkupParser functions. Can't be called while +a subparser is pushed.

+
++ + + + +

context :

a GMarkupParseContext +
+
+
+
+

g_markup_parse_context_get_position ()

+
void                g_markup_parse_context_get_position (GMarkupParseContext *context,
+                                                         gint *line_number,
+                                                         gint *char_number);
+

+Retrieves the current line number and the number of the character on +that line. Intended for use in error messages; there are no strict +semantics for what constitutes the "current" line number other than +"the best number we could come up with for error messages."

+
++ + + + + + + + + + + + + + +

context :

a GMarkupParseContext +

line_number :

return location for a line number, or NULL +

char_number :

return location for a char-on-line number, or NULL +
+
+
+
+

g_markup_parse_context_get_element ()

+
const gchar *       g_markup_parse_context_get_element  (GMarkupParseContext *context);
+

+Retrieves the name of the currently open element. +

+

+If called from the start_element or end_element handlers this will +give the element_name as passed to those functions. For the parent +elements, see g_markup_parse_context_get_element_stack().

+
++ + + + + + + + + + +

context :

a GMarkupParseContext +

Returns :

the name of the currently open element, or NULL +
+

Since 2.2

+
+
+
+

g_markup_parse_context_get_element_stack ()

+
const GSList *      g_markup_parse_context_get_element_stack
+                                                        (GMarkupParseContext *context);
+

+Retrieves the element stack from the internal state of the parser. +The returned GSList is a list of strings where the first item is +the currently open tag (as would be returned by +g_markup_parse_context_get_element()) and the next item is its +immediate parent. +

+

+This function is intended to be used in the start_element and +end_element handlers where g_markup_parse_context_get_element() +would merely return the name of the element that is being +processed.

+
++ + + + + + + + + + +

context :

a GMarkupParseContext +

Returns :

the element stack, which must not be modified + +
+

Since 2.16

+
+
+
+

g_markup_parse_context_get_user_data ()

+
gpointer            g_markup_parse_context_get_user_data
+                                                        (GMarkupParseContext *context);
+

+Returns the user_data associated with context. This will either +be the user_data that was provided to g_markup_parse_context_new() +or to the most recent call of g_markup_parse_context_push().

+
++ + + + + + + + + + +

context :

a GMarkupParseContext +

Returns :

the provided user_data. The returned data belongs to + the markup context and will be freed when g_markup_context_free() + is called. + +
+

Since 2.18

+
+
+
+

g_markup_parse_context_new ()

+
GMarkupParseContext * g_markup_parse_context_new        (const GMarkupParser *parser,
+                                                         GMarkupParseFlags flags,
+                                                         gpointer user_data,
+                                                         GDestroyNotify user_data_dnotify);
+

+Creates a new parse context. A parse context is used to parse +marked-up documents. You can feed any number of documents into +a context, as long as no errors occur; once an error occurs, +the parse context can't continue to parse text (you have to free it +and create a new parse context).

+
++ + + + + + + + + + + + + + + + + + + + + + +

parser :

a GMarkupParser +

flags :

one or more GMarkupParseFlags +

user_data :

user data to pass to GMarkupParser functions +

user_data_dnotify :

user data destroy notifier called when the parse context is freed +

Returns :

a new GMarkupParseContext +
+
+
+
+

g_markup_parse_context_parse ()

+
gboolean            g_markup_parse_context_parse        (GMarkupParseContext *context,
+                                                         const gchar *text,
+                                                         gssize text_len,
+                                                         GError **error);
+

+Feed some data to the GMarkupParseContext. The data need not +be valid UTF-8; an error will be signaled if it's invalid. +The data need not be an entire document; you can feed a document +into the parser incrementally, via multiple calls to this function. +Typically, as you receive data from a network connection or file, +you feed each received chunk of data into this function, aborting +the process if an error occurs. Once an error is reported, no further +data may be fed to the GMarkupParseContext; all errors are fatal.

+
++ + + + + + + + + + + + + + + + + + + + + + +

context :

a GMarkupParseContext +

text :

chunk of text to parse +

text_len :

length of text in bytes +

error :

return location for a GError +

Returns :

FALSE if an error occurred, TRUE on success +
+
+
+
+

g_markup_parse_context_push ()

+
void                g_markup_parse_context_push         (GMarkupParseContext *context,
+                                                         GMarkupParser *parser,
+                                                         gpointer user_data);
+

+Temporarily redirects markup data to a sub-parser. +

+

+This function may only be called from the start_element handler of +a GMarkupParser. It must be matched with a corresponding call to +g_markup_parse_context_pop() in the matching end_element handler +(except in the case that the parser aborts due to an error). +

+

+All tags, text and other data between the matching tags is +redirected to the subparser given by parser. user_data is used +as the user_data for that parser. user_data is also passed to the +error callback in the event that an error occurs. This includes +errors that occur in subparsers of the subparser. +

+

+The end tag matching the start tag for which this call was made is +handled by the previous parser (which is given its own user_data) +which is why g_markup_parse_context_pop() is provided to allow "one +last access" to the user_data provided to this function. In the +case of error, the user_data provided here is passed directly to +the error callback of the subparser and g_markup_parse_context() +should not be called. In either case, if user_data was allocated +then it ought to be freed from both of these locations. +

+

+This function is not intended to be directly called by users +interested in invoking subparsers. Instead, it is intended to be +used by the subparsers themselves to implement a higher-level +interface. +

+

+As an example, see the following implementation of a simple +parser that counts the number of tags encountered. +

+

+

+
+typedef struct
+{
+  gint tag_count;
+} CounterData;
+
+static void
+counter_start_element (GMarkupParseContext  *context,
+                       const gchar          *element_name,
+                       const gchar         **attribute_names,
+                       const gchar         **attribute_values,
+                       gpointer              user_data,
+                       GError              **error)
+{
+  CounterData *data = user_data;
+
+  data->tag_count++;
+}
+
+static void
+counter_error (GMarkupParseContext *context,
+               GError              *error,
+               gpointer             user_data)
+{
+  CounterData *data = user_data;
+
+  g_slice_free (CounterData, data);
+}
+
+static GMarkupParser counter_subparser =
+{
+  counter_start_element,
+  NULL,
+  NULL,
+  NULL,
+  counter_error
+};
+
+

+

+

+In order to allow this parser to be easily used as a subparser, the +following interface is provided: +

+

+

+
+void
+start_counting (GMarkupParseContext *context)
+{
+  CounterData *data = g_slice_new (CounterData);
+
+  data->tag_count = 0;
+  g_markup_parse_context_push (context, &counter_subparser, data);
+}
+
+gint
+end_counting (GMarkupParseContext *context)
+{
+  CounterData *data = g_markup_parse_context_pop (context);
+  int result;
+
+  result = data->tag_count;
+  g_slice_free (CounterData, data);
+
+  return result;
+}
+
+

+

+

+The subparser would then be used as follows: +

+

+

+
+static void start_element (context, element_name, ...)
+{
+  if (strcmp (element_name, "count-these") == 0)
+    start_counting (context);
+
+  /* else, handle other tags... */
+}
+
+static void end_element (context, element_name, ...)
+{
+  if (strcmp (element_name, "count-these") == 0)
+    g_print ("Counted %d tags\n", end_counting (context));
+
+  /* else, handle other tags... */
+}
+
+
++ + + + + + + + + + + + + + +

context :

a GMarkupParseContext +

parser :

a GMarkupParser +

user_data :

user data to pass to GMarkupParser functions +
+

Since 2.18

+
+
+
+

g_markup_parse_context_pop ()

+
gpointer            g_markup_parse_context_pop          (GMarkupParseContext *context);
+

+Completes the process of a temporary sub-parser redirection. +

+

+This function exists to collect the user_data allocated by a +matching call to g_markup_parse_context_push(). It must be called +in the end_element handler corresponding to the start_element +handler during which g_markup_parse_context_push() was called. You +must not call this function from the error callback -- the +user_data is provided directly to the callback in that case. +

+

+This function is not intended to be directly called by users +interested in invoking subparsers. Instead, it is intended to be +used by the subparsers themselves to implement a higher-level +interface.

+
++ + + + + + + + + + +

context :

a GMarkupParseContext +

Returns :

the user_data passed to g_markup_parse_context_push(). + +
+

Since 2.18

+
+
+
+

enum GMarkupCollectType

+
typedef enum
+{
+  G_MARKUP_COLLECT_INVALID,
+  G_MARKUP_COLLECT_STRING,
+  G_MARKUP_COLLECT_STRDUP,
+  G_MARKUP_COLLECT_BOOLEAN,
+  G_MARKUP_COLLECT_TRISTATE,
+
+  G_MARKUP_COLLECT_OPTIONAL = (1 << 16)
+} GMarkupCollectType;
+
+

+A mixed enumerated type and flags field. You must specify one type +(string, strdup, boolean, tristate). Additionally, you may +optionally bitwise OR the type with the flag +G_MARKUP_COLLECT_OPTIONAL. +

+

+It is likely that this enum will be extended in the future to +support other types.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

G_MARKUP_COLLECT_INVALID

used to terminate the list of attributes + to collect. +

G_MARKUP_COLLECT_STRING

collect the string pointer directly from + the attribute_values[] array. Expects a + parameter of type (const char **). If + G_MARKUP_COLLECT_OPTIONAL is specified + and the attribute isn't present then the + pointer will be set to NULL. +

G_MARKUP_COLLECT_STRDUP

as with G_MARKUP_COLLECT_STRING, but + expects a parameter of type (char **) and + g_strdup()s the returned pointer. The + pointer must be freed with g_free(). +

G_MARKUP_COLLECT_BOOLEAN

expects a parameter of type (gboolean *) + and parses the attribute value as a + boolean. Sets FALSE if the attribute + isn't present. Valid boolean values + consist of (case insensitive) "false", + "f", "no", "n", "0" and "true", "t", + "yes", "y", "1". +

G_MARKUP_COLLECT_TRISTATE

as with G_MARKUP_COLLECT_BOOLEAN, but + in the case of a missing attribute a + value is set that compares equal to + neither FALSE nor TRUE. + G_MARKUP_COLLECT_OPTIONAL is implied. +

G_MARKUP_COLLECT_OPTIONAL

can be bitwise ORed with the other + fields. If present, allows the + attribute not to appear. A default + value is set depending on what value + type is used. +
+
+
+
+

g_markup_collect_attributes ()

+
gboolean            g_markup_collect_attributes         (const gchar *element_name,
+                                                         const gchar **attribute_names,
+                                                         const gchar **attribute_values,
+                                                         GError **error,
+                                                         GMarkupCollectType first_type,
+                                                         const gchar *first_attr,
+                                                         ...);
+

+Collects the attributes of the element from the +data passed to the GMarkupParser start_element +function, dealing with common error conditions +and supporting boolean values. +

+

+This utility function is not required to write +a parser but can save a lot of typing. +

+

+The element_name, attribute_names, +attribute_values and error parameters passed +to the start_element callback should be passed +unmodified to this function. +

+

+Following these arguments is a list of +"supported" attributes to collect. It is an +error to specify multiple attributes with the +same name. If any attribute not in the list +appears in the attribute_names array then an +unknown attribute error will result. +

+

+The GMarkupCollectType field allows specifying +the type of collection to perform and if a +given attribute must appear or is optional. +

+

+The attribute name is simply the name of the +attribute to collect. +

+

+The pointer should be of the appropriate type +(see the descriptions under +GMarkupCollectType) and may be NULL in case a +particular attribute is to be allowed but +ignored. +

+

+This function deals with issuing errors for missing attributes +(of type G_MARKUP_ERROR_MISSING_ATTRIBUTE), unknown attributes +(of type G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE) and duplicate +attributes (of type G_MARKUP_ERROR_INVALID_CONTENT) as well +as parse errors for boolean-valued attributes (again of type +G_MARKUP_ERROR_INVALID_CONTENT). In all of these cases FALSE +will be returned and error will be set as appropriate.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

element_name :

the current tag name +

attribute_names :

the attribute names +

attribute_values :

the attribute values +

error :

a pointer to a GError or NULL +

first_type :

the GMarkupCollectType of the + first attribute +

first_attr :

the name of the first attribute +

... :

a pointer to the storage location of the + first attribute (or NULL), followed by + more types names and pointers, ending + with G_MARKUP_COLLECT_INVALID. +

Returns :

TRUE if successful + +
+

Since 2.16

+
+
+
+

+
[5] XML specification
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Singly-Linked-Lists.html b/docs/reference/glib/html/glib-Singly-Linked-Lists.html new file mode 100644 index 0000000..0bfbde9 --- /dev/null +++ b/docs/reference/glib/html/glib-Singly-Linked-Lists.html @@ -0,0 +1,1166 @@ + + + + +Singly-Linked Lists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Singly-Linked Lists

+

Singly-Linked Lists — linked lists containing integer values or + pointers to data, limited to iterating over the + list in one direction

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GSList;
+
+GSList*             g_slist_alloc                       (void);
+GSList*             g_slist_append                      (GSList *list,
+                                                         gpointer data);
+GSList*             g_slist_prepend                     (GSList *list,
+                                                         gpointer data);
+GSList*             g_slist_insert                      (GSList *list,
+                                                         gpointer data,
+                                                         gint position);
+GSList*             g_slist_insert_before               (GSList *slist,
+                                                         GSList *sibling,
+                                                         gpointer data);
+GSList*             g_slist_insert_sorted               (GSList *list,
+                                                         gpointer data,
+                                                         GCompareFunc func);
+GSList*             g_slist_remove                      (GSList *list,
+                                                         gconstpointer data);
+GSList*             g_slist_remove_link                 (GSList *list,
+                                                         GSList *link_);
+GSList*             g_slist_delete_link                 (GSList *list,
+                                                         GSList *link_);
+GSList*             g_slist_remove_all                  (GSList *list,
+                                                         gconstpointer data);
+void                g_slist_free                        (GSList *list);
+void                g_slist_free_1                      (GSList *list);
+#define             g_slist_free1
+
+guint               g_slist_length                      (GSList *list);
+GSList*             g_slist_copy                        (GSList *list);
+GSList*             g_slist_reverse                     (GSList *list);
+GSList*             g_slist_insert_sorted_with_data     (GSList *list,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+GSList*             g_slist_sort                        (GSList *list,
+                                                         GCompareFunc compare_func);
+GSList*             g_slist_sort_with_data              (GSList *list,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+GSList*             g_slist_concat                      (GSList *list1,
+                                                         GSList *list2);
+void                g_slist_foreach                     (GSList *list,
+                                                         GFunc func,
+                                                         gpointer user_data);
+
+GSList*             g_slist_last                        (GSList *list);
+#define             g_slist_next                        (slist)
+GSList*             g_slist_nth                         (GSList *list,
+                                                         guint n);
+gpointer            g_slist_nth_data                    (GSList *list,
+                                                         guint n);
+
+GSList*             g_slist_find                        (GSList *list,
+                                                         gconstpointer data);
+GSList*             g_slist_find_custom                 (GSList *list,
+                                                         gconstpointer data,
+                                                         GCompareFunc func);
+gint                g_slist_position                    (GSList *list,
+                                                         GSList *llink);
+gint                g_slist_index                       (GSList *list,
+                                                         gconstpointer data);
+
+void                g_slist_push_allocator              (gpointer dummy);
+void                g_slist_pop_allocator               (void);
+
+
+
+

Description

+

+The GSList structure and its associated functions provide a +standard singly-linked list data structure. +

+

+Each element in the list contains a piece of data, together with a +pointer which links to the next element in the list. Using this +pointer it is possible to move through the list in one direction +only (unlike the Doubly-Linked Lists which +allow movement in both directions). +

+

+The data contained in each element can be either integer values, by +using one of the Type +Conversion Macros, or simply pointers to any type of data. +

+

+List elements are allocated from the slice allocator, which is more +efficient than allocating elements individually. +

+

+Note that most of the GSList functions expect to be passed a +pointer to the first element in the list. The functions which insert +elements return the new start of the list, which may have changed. +

+

+There is no function to create a GSList. NULL is considered to be +the empty list so you simply set a GSList* to NULL. +

+

+To add elements, use g_slist_append(), g_slist_prepend(), +g_slist_insert() and g_slist_insert_sorted(). +

+

+To remove elements, use g_slist_remove(). +

+

+To find elements in the list use g_slist_last(), g_slist_next(), +g_slist_nth(), g_slist_nth_data(), g_slist_find() and +g_slist_find_custom(). +

+

+To find the index of an element use g_slist_position() and +g_slist_index(). +

+

+To call a function for each element in the list use +g_slist_foreach(). +

+

+To free the entire list, use g_slist_free().

+
+
+

Details

+
+

GSList

+
typedef struct {
+  gpointer data;
+  GSList *next;
+} GSList;
+
+

+The GSList struct is used for each element in the singly-linked +list.

+
++ + + + + + + + + + +

gpointer data;

holds the element's data, which can be a pointer to any kind + of data, or any integer value using the Type Conversion + Macros. +

GSList *next;

contains the link to the next element in the list. +
+
+
+
+

g_slist_alloc ()

+
GSList*             g_slist_alloc                       (void);
+

+Allocates space for one GSList element. It is called by the +g_slist_append(), g_slist_prepend(), g_slist_insert() and +g_slist_insert_sorted() functions and so is rarely used on its own.

+
++ + + + +

Returns :

a pointer to the newly-allocated GSList element. +
+
+
+
+

g_slist_append ()

+
GSList*             g_slist_append                      (GSList *list,
+                                                         gpointer data);
+

+Adds a new element on to the end of the list. +

+

+

+
+

Note

+

+The return value is the new start of the list, which may +have changed, so make sure you store the new value. +

+
+

+

+

+

+
+

Note

+

+Note that g_slist_append() has to traverse the entire list +to find the end, which is inefficient when adding multiple +elements. A common idiom to avoid the inefficiency is to prepend +the elements and reverse the list when all elements have been added. +

+
+

+

+

+

+
+/* Notice that these are initialized to the empty list. */
+GSList *list = NULL, *number_list = NULL;
+
+/* This is a list of strings. */
+list = g_slist_append (list, "first");
+list = g_slist_append (list, "second");
+
+/* This is a list of integers. */
+number_list = g_slist_append (number_list, GINT_TO_POINTER (27));
+number_list = g_slist_append (number_list, GINT_TO_POINTER (14));
+
+
++ + + + + + + + + + + + + + +

list :

a GSList +

data :

the data for the new element +

Returns :

the new start of the GSList +
+
+
+
+

g_slist_prepend ()

+
GSList*             g_slist_prepend                     (GSList *list,
+                                                         gpointer data);
+

+Adds a new element on to the start of the list. +

+

+

+
+

Note

+

+The return value is the new start of the list, which +may have changed, so make sure you store the new value. +

+
+

+

+

+

+
+/* Notice that it is initialized to the empty list. */
+GSList *list = NULL;
+list = g_slist_prepend (list, "last");
+list = g_slist_prepend (list, "first");
+
+
++ + + + + + + + + + + + + + +

list :

a GSList +

data :

the data for the new element +

Returns :

the new start of the GSList +
+
+
+
+

g_slist_insert ()

+
GSList*             g_slist_insert                      (GSList *list,
+                                                         gpointer data,
+                                                         gint position);
+

+Inserts a new element into the list at the given position.

+
++ + + + + + + + + + + + + + + + + + +

list :

a GSList +

data :

the data for the new element +

position :

the position to insert the element. + If this is negative, or is larger than the number + of elements in the list, the new element is added on + to the end of the list. +

Returns :

the new start of the GSList +
+
+
+
+

g_slist_insert_before ()

+
GSList*             g_slist_insert_before               (GSList *slist,
+                                                         GSList *sibling,
+                                                         gpointer data);
+

+Inserts a node before sibling containing data.

+
++ + + + + + + + + + + + + + + + + + +

slist :

a GSList +

sibling :

node to insert data before +

data :

data to put in the newly-inserted node +

Returns :

the new head of the list. +
+
+
+
+

g_slist_insert_sorted ()

+
GSList*             g_slist_insert_sorted               (GSList *list,
+                                                         gpointer data,
+                                                         GCompareFunc func);
+

+Inserts a new element into the list, using the given +comparison function to determine its position.

+
++ + + + + + + + + + + + + + + + + + +

list :

a GSList +

data :

the data for the new element +

func :

the function to compare elements in the list. + It should return a number > 0 if the first parameter + comes after the second parameter in the sort order. +

Returns :

the new start of the GSList +
+
+
+
+

g_slist_remove ()

+
GSList*             g_slist_remove                      (GSList *list,
+                                                         gconstpointer data);
+

+Removes an element from a GSList. +If two elements contain the same data, only the first is removed. +If none of the elements contain the data, the GSList is unchanged.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

data :

the data of the element to remove +

Returns :

the new start of the GSList +
+
+
+
+

g_slist_remove_link ()

+
GSList*             g_slist_remove_link                 (GSList *list,
+                                                         GSList *link_);
+

+Removes an element from a GSList, without +freeing the element. The removed element's next +link is set to NULL, so that it becomes a +self-contained list with one element.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

link_ :

an element in the GSList +

Returns :

the new start of the GSList, without the element +
+
+
+
+

g_slist_delete_link ()

+
GSList*             g_slist_delete_link                 (GSList *list,
+                                                         GSList *link_);
+

+Removes the node link_ from the list and frees it. +Compare this to g_slist_remove_link() which removes the node +without freeing it.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

link_ :

node to delete +

Returns :

the new head of list +
+
+
+
+

g_slist_remove_all ()

+
GSList*             g_slist_remove_all                  (GSList *list,
+                                                         gconstpointer data);
+

+Removes all list nodes with data equal to data. +Returns the new head of the list. Contrast with +g_slist_remove() which removes only the first node +matching the given data.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

data :

data to remove +

Returns :

new head of list +
+
+
+
+

g_slist_free ()

+
void                g_slist_free                        (GSList *list);
+

+Frees all of the memory used by a GSList. +The freed elements are returned to the slice allocator.

+
++ + + + +

list :

a GSList +
+
+
+
+

g_slist_free_1 ()

+
void                g_slist_free_1                      (GSList *list);
+

+Frees one GSList element. +It is usually used after g_slist_remove_link().

+
++ + + + +

list :

a GSList element +
+
+
+
+

g_slist_free1

+
#define             g_slist_free1
+

+A macro which does the same as g_slist_free_1().

+

Since 2.10

+
+
+
+

g_slist_length ()

+
guint               g_slist_length                      (GSList *list);
+

+Gets the number of elements in a GSList. +

+

+

+
+

Note

+

+This function iterates over the whole list to +count its elements. +

+
+
++ + + + + + + + + + +

list :

a GSList +

Returns :

the number of elements in the GSList +
+
+
+
+

g_slist_copy ()

+
GSList*             g_slist_copy                        (GSList *list);
+

+Copies a GSList. +

+

+

+
+

Note

+

+Note that this is a "shallow" copy. If the list elements +consist of pointers to data, the pointers are copied but +the actual data isn't. +

+
+
++ + + + + + + + + + +

list :

a GSList +

Returns :

a copy of list +
+
+
+
+

g_slist_reverse ()

+
GSList*             g_slist_reverse                     (GSList *list);
+

+Reverses a GSList.

+
++ + + + + + + + + + +

list :

a GSList +

Returns :

the start of the reversed GSList +
+
+
+
+

g_slist_insert_sorted_with_data ()

+
GSList*             g_slist_insert_sorted_with_data     (GSList *list,
+                                                         gpointer data,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Inserts a new element into the list, using the given +comparison function to determine its position.

+
++ + + + + + + + + + + + + + + + + + + + + + +

list :

a GSList +

data :

the data for the new element +

func :

the function to compare elements in the list. + It should return a number > 0 if the first parameter + comes after the second parameter in the sort order. +

user_data :

data to pass to comparison function +

Returns :

the new start of the GSList + +
+

Since 2.10

+
+
+
+

g_slist_sort ()

+
GSList*             g_slist_sort                        (GSList *list,
+                                                         GCompareFunc compare_func);
+

+Sorts a GSList using the given comparison function.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

compare_func :

the comparison function used to sort the GSList. + This function is passed the data from 2 elements of the GSList + and should return 0 if they are equal, a negative value if the + first element comes before the second, or a positive value if + the first element comes after the second. +

Returns :

the start of the sorted GSList +
+
+
+
+

g_slist_sort_with_data ()

+
GSList*             g_slist_sort_with_data              (GSList *list,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Like g_slist_sort(), but the sort function accepts a user data argument.

+
++ + + + + + + + + + + + + + + + + + +

list :

a GSList +

compare_func :

comparison function +

user_data :

data to pass to comparison function +

Returns :

new head of the list +
+
+
+
+

g_slist_concat ()

+
GSList*             g_slist_concat                      (GSList *list1,
+                                                         GSList *list2);
+

+Adds the second GSList onto the end of the first GSList. +Note that the elements of the second GSList are not copied. +They are used directly.

+
++ + + + + + + + + + + + + + +

list1 :

a GSList +

list2 :

the GSList to add to the end of the first GSList +

Returns :

the start of the new GSList +
+
+
+
+

g_slist_foreach ()

+
void                g_slist_foreach                     (GSList *list,
+                                                         GFunc func,
+                                                         gpointer user_data);
+

+Calls a function for each element of a GSList.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

func :

the function to call with each element's data +

user_data :

user data to pass to the function +
+
+
+
+

g_slist_last ()

+
GSList*             g_slist_last                        (GSList *list);
+

+Gets the last element in a GSList. + +

+
+

Note

+

+This function iterates over the whole list. +

+
+
++ + + + + + + + + + +

list :

a GSList +

Returns :

the last element in the GSList, + or NULL if the GSList has no elements +
+
+
+
+

g_slist_next()

+
#define             g_slist_next(slist)
+

+A convenience macro to get the next element in a GSList.

+
++ + + + + + + + + + +

slist :

an element in a GSList. +

Returns :

the next element, or NULL if there are no more elements. +
+
+
+
+

g_slist_nth ()

+
GSList*             g_slist_nth                         (GSList *list,
+                                                         guint n);
+

+Gets the element at the given position in a GSList.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

n :

the position of the element, counting from 0 +

Returns :

the element, or NULL if the position is off + the end of the GSList +
+
+
+
+

g_slist_nth_data ()

+
gpointer            g_slist_nth_data                    (GSList *list,
+                                                         guint n);
+

+Gets the data of the element at the given position.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

n :

the position of the element +

Returns :

the element's data, or NULL if the position + is off the end of the GSList +
+
+
+
+

g_slist_find ()

+
GSList*             g_slist_find                        (GSList *list,
+                                                         gconstpointer data);
+

+Finds the element in a GSList which +contains the given data.

+
++ + + + + + + + + + + + + + +

list :

a GSList +

data :

the element data to find +

Returns :

the found GSList element, + or NULL if it is not found +
+
+
+
+

g_slist_find_custom ()

+
GSList*             g_slist_find_custom                 (GSList *list,
+                                                         gconstpointer data,
+                                                         GCompareFunc func);
+

+Finds an element in a GSList, using a supplied function to +find the desired element. It iterates over the list, calling +the given function which should return 0 when the desired +element is found. The function takes two gconstpointer arguments, +the GSList element's data as the first argument and the +given user data.

+
++ + + + + + + + + + + + + + + + + + +

list :

a GSList +

data :

user data passed to the function +

func :

the function to call for each element. + It should return 0 when the desired element is found +

Returns :

the found GSList element, or NULL if it is not found +
+
+
+
+

g_slist_position ()

+
gint                g_slist_position                    (GSList *list,
+                                                         GSList *llink);
+

+Gets the position of the given element +in the GSList (starting from 0).

+
++ + + + + + + + + + + + + + +

list :

a GSList +

llink :

an element in the GSList +

Returns :

the position of the element in the GSList, + or -1 if the element is not found +
+
+
+
+

g_slist_index ()

+
gint                g_slist_index                       (GSList *list,
+                                                         gconstpointer data);
+

+Gets the position of the element containing +the given data (starting from 0).

+
++ + + + + + + + + + + + + + +

list :

a GSList +

data :

the data to find +

Returns :

the index of the element containing the data, + or -1 if the data is not found +
+
+
+
+

g_slist_push_allocator ()

+
void                g_slist_push_allocator              (gpointer dummy);
+
+

Warning

+

g_slist_push_allocator has been deprecated since version 2.10 and should not be used in newly-written code. It does nothing, since GSList has been converted + to the slice + allocator

+
+

+Sets the allocator to use to allocate GSList elements. Use +g_slist_pop_allocator() to restore the previous allocator. +

+

+Note that this function is not available if GLib has been compiled +with --disable-mem-pools

+
++ + + + +

dummy :

the GAllocator to use when allocating GSList elements. +
+
+
+
+

g_slist_pop_allocator ()

+
void                g_slist_pop_allocator               (void);
+
+

Warning

+

g_slist_pop_allocator has been deprecated since version 2.10 and should not be used in newly-written code. It does nothing, since GSList has been converted + to the slice + allocator

+
+

+Restores the previous GAllocator, used when allocating GSList +elements. +

+

+Note that this function is not available if GLib has been compiled +with --disable-mem-pools

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Spawning-Processes.html b/docs/reference/glib/html/glib-Spawning-Processes.html new file mode 100644 index 0000000..aa1d6b1 --- /dev/null +++ b/docs/reference/glib/html/glib-Spawning-Processes.html @@ -0,0 +1,936 @@ + + + + +Spawning Processes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Spawning Processes

+

Spawning Processes — process launching

+
+
+

Synopsis

+
+#include <glib.h>
+
+enum                GSpawnError;
+#define             G_SPAWN_ERROR
+enum                GSpawnFlags;
+void                (*GSpawnChildSetupFunc)             (gpointer user_data);
+gboolean            g_spawn_async_with_pipes            (const gchar *working_directory,
+                                                         gchar **argv,
+                                                         gchar **envp,
+                                                         GSpawnFlags flags,
+                                                         GSpawnChildSetupFunc child_setup,
+                                                         gpointer user_data,
+                                                         GPid *child_pid,
+                                                         gint *standard_input,
+                                                         gint *standard_output,
+                                                         gint *standard_error,
+                                                         GError **error);
+gboolean            g_spawn_async                       (const gchar *working_directory,
+                                                         gchar **argv,
+                                                         gchar **envp,
+                                                         GSpawnFlags flags,
+                                                         GSpawnChildSetupFunc child_setup,
+                                                         gpointer user_data,
+                                                         GPid *child_pid,
+                                                         GError **error);
+gboolean            g_spawn_sync                        (const gchar *working_directory,
+                                                         gchar **argv,
+                                                         gchar **envp,
+                                                         GSpawnFlags flags,
+                                                         GSpawnChildSetupFunc child_setup,
+                                                         gpointer user_data,
+                                                         gchar **standard_output,
+                                                         gchar **standard_error,
+                                                         gint *exit_status,
+                                                         GError **error);
+gboolean            g_spawn_command_line_async          (const gchar *command_line,
+                                                         GError **error);
+gboolean            g_spawn_command_line_sync           (const gchar *command_line,
+                                                         gchar **standard_output,
+                                                         gchar **standard_error,
+                                                         gint *exit_status,
+                                                         GError **error);
+void                g_spawn_close_pid                   (GPid pid);
+
+
+
+

Description

+

+

+
+
+

Details

+
+

enum GSpawnError

+
typedef enum
+{
+  G_SPAWN_ERROR_FORK,   /* fork failed due to lack of memory */
+  G_SPAWN_ERROR_READ,   /* read or select on pipes failed */
+  G_SPAWN_ERROR_CHDIR,  /* changing to working dir failed */
+  G_SPAWN_ERROR_ACCES,  /* execv() returned EACCES */
+  G_SPAWN_ERROR_PERM,   /* execv() returned EPERM */
+  G_SPAWN_ERROR_2BIG,   /* execv() returned E2BIG */
+  G_SPAWN_ERROR_NOEXEC, /* execv() returned ENOEXEC */
+  G_SPAWN_ERROR_NAMETOOLONG, /* ""  "" ENAMETOOLONG */
+  G_SPAWN_ERROR_NOENT,       /* ""  "" ENOENT */
+  G_SPAWN_ERROR_NOMEM,       /* ""  "" ENOMEM */
+  G_SPAWN_ERROR_NOTDIR,      /* ""  "" ENOTDIR */
+  G_SPAWN_ERROR_LOOP,        /* ""  "" ELOOP   */
+  G_SPAWN_ERROR_TXTBUSY,     /* ""  "" ETXTBUSY */
+  G_SPAWN_ERROR_IO,          /* ""  "" EIO */
+  G_SPAWN_ERROR_NFILE,       /* ""  "" ENFILE */
+  G_SPAWN_ERROR_MFILE,       /* ""  "" EMFLE */
+  G_SPAWN_ERROR_INVAL,       /* ""  "" EINVAL */
+  G_SPAWN_ERROR_ISDIR,       /* ""  "" EISDIR */
+  G_SPAWN_ERROR_LIBBAD,      /* ""  "" ELIBBAD */
+  G_SPAWN_ERROR_FAILED       /* other fatal failure, error->message
+                              * should explain
+                              */
+} GSpawnError;
+
+

+Error codes returned by spawning processes. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_SPAWN_ERROR_FORK

Fork failed due to lack of memory. +

G_SPAWN_ERROR_READ

Read or select on pipes failed. +

G_SPAWN_ERROR_CHDIR

Changing to working directory failed. +

G_SPAWN_ERROR_ACCES

execv() returned EACCES. +

G_SPAWN_ERROR_PERM

execv() returned EPERM. +

G_SPAWN_ERROR_2BIG

execv() returned E2BIG. +

G_SPAWN_ERROR_NOEXEC

execv() returned ENOEXEC. +

G_SPAWN_ERROR_NAMETOOLONG

execv() returned ENAMETOOLONG. +

G_SPAWN_ERROR_NOENT

execv() returned ENOENT. +

G_SPAWN_ERROR_NOMEM

execv() returned ENOMEM. +

G_SPAWN_ERROR_NOTDIR

execv() returned ENOTDIR. +

G_SPAWN_ERROR_LOOP

execv() returned ELOOP. +

G_SPAWN_ERROR_TXTBUSY

execv() returned ETXTBUSY. +

G_SPAWN_ERROR_IO

execv() returned EIO. +

G_SPAWN_ERROR_NFILE

execv() returned ENFILE. +

G_SPAWN_ERROR_MFILE

execv() returned EMFILE. +

G_SPAWN_ERROR_INVAL

execv() returned EINVAL. +

G_SPAWN_ERROR_ISDIR

execv() returned EISDIR. +

G_SPAWN_ERROR_LIBBAD

execv() returned ELIBBAD. +

G_SPAWN_ERROR_FAILED

Some other fatal failure, error->message should explain. +
+
+
+
+

G_SPAWN_ERROR

+
#define G_SPAWN_ERROR g_spawn_error_quark ()
+
+

+Error domain for spawning processes. Errors in this domain will +be from the GSpawnError enumeration. See GError for information on +error domains. +

+
+
+
+

enum GSpawnFlags

+
typedef enum
+{
+  G_SPAWN_LEAVE_DESCRIPTORS_OPEN = 1 << 0,
+  G_SPAWN_DO_NOT_REAP_CHILD      = 1 << 1,
+  /* look for argv[0] in the path i.e. use execvp() */
+  G_SPAWN_SEARCH_PATH            = 1 << 2,
+  /* Dump output to /dev/null */
+  G_SPAWN_STDOUT_TO_DEV_NULL     = 1 << 3,
+  G_SPAWN_STDERR_TO_DEV_NULL     = 1 << 4,
+  G_SPAWN_CHILD_INHERITS_STDIN   = 1 << 5,
+  G_SPAWN_FILE_AND_ARGV_ZERO     = 1 << 6
+} GSpawnFlags;
+
+

+Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes(). +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_SPAWN_LEAVE_DESCRIPTORS_OPEN

the parent's open file descriptors will be + inherited by the child; otherwise all descriptors except stdin/stdout/stderr + will be closed before calling exec() in the child. +

G_SPAWN_DO_NOT_REAP_CHILD

the child will not be automatically reaped; you + must use g_child_watch_add() yourself (or call waitpid() + or handle SIGCHLD yourself), or the child will become a zombie. +

G_SPAWN_SEARCH_PATH

+argv[0] need not be an absolute path, + it will be looked for in the user's PATH. +

G_SPAWN_STDOUT_TO_DEV_NULL

the child's standard output will be discarded, + instead of going to the same location as the parent's standard output. +

G_SPAWN_STDERR_TO_DEV_NULL

the child's standard error will be discarded. +

G_SPAWN_CHILD_INHERITS_STDIN

the child will inherit the parent's standard + input (by default, the child's standard input is attached to + /dev/null). +

G_SPAWN_FILE_AND_ARGV_ZERO

the first element of argv is + the file to execute, while the remaining elements are the actual argument + vector to pass to the file. Normally g_spawn_async_with_pipes() uses + argv[0] as the file to execute, and passes all of + argv to the child. +
+
+
+
+

GSpawnChildSetupFunc ()

+
void                (*GSpawnChildSetupFunc)             (gpointer user_data);
+

+Specifies the type of the setup function passed to g_spawn_async(), +g_spawn_sync() and g_spawn_async_with_pipes(). On POSIX platforms it +is called in the child after GLib has performed all the setup it plans +to perform but before calling exec(). On POSIX actions taken in this +function will thus only affect the child, not the parent. +

+

+Note that POSIX allows only async-signal-safe functions (see signal(7)) +to be called in the child between fork() and exec(), which drastically +limits the usefulness of child setup functions. +

+

+Also note that modifying the environment from the child setup function +may not have the intended effect, since it will get overridden by +a non-NULL env argument to the g_spawn... functions. +

+

+On Windows the function is called in the parent. Its usefulness on +Windows is thus questionable. In many cases executing the child setup +function in the parent can have ill effects, and you should be very +careful when porting software to Windows that uses child setup +functions. +

+
++ + + + +

user_data :

user data to pass to the function. +
+
+
+
+

g_spawn_async_with_pipes ()

+
gboolean            g_spawn_async_with_pipes            (const gchar *working_directory,
+                                                         gchar **argv,
+                                                         gchar **envp,
+                                                         GSpawnFlags flags,
+                                                         GSpawnChildSetupFunc child_setup,
+                                                         gpointer user_data,
+                                                         GPid *child_pid,
+                                                         gint *standard_input,
+                                                         gint *standard_output,
+                                                         gint *standard_error,
+                                                         GError **error);
+

+Executes a child program asynchronously (your program will not +block waiting for the child to exit). The child program is +specified by the only argument that must be provided, argv. argv +should be a NULL-terminated array of strings, to be passed as the +argument vector for the child. The first string in argv is of +course the name of the program to execute. By default, the name of +the program must be a full path; the PATH shell variable +will only be searched if you pass the G_SPAWN_SEARCH_PATH flag. +

+

+On Windows, note that all the string or string vector arguments to +this function and the other g_spawn*() functions are in UTF-8, the +GLib file name encoding. Unicode characters that are not part of +the system codepage passed in these arguments will be correctly +available in the spawned program only if it uses wide character API +to retrieve its command line. For C programs built with Microsoft's +tools it is enough to make the program have a wmain() instead of +main(). wmain() has a wide character argument vector as parameter. +

+

+At least currently, mingw doesn't support wmain(), so if you use +mingw to develop the spawned program, it will have to call the +undocumented function __wgetmainargs() to get the wide character +argument vector and environment. See gspawn-win32-helper.c in the +GLib sources or init.c in the mingw runtime sources for a prototype +for that function. Alternatively, you can retrieve the Win32 system +level wide character command line passed to the spawned program +using the GetCommandLineW() function. +

+

+On Windows the low-level child process creation API +CreateProcess() doesn't use argument vectors, +but a command line. The C runtime library's +spawn*() family of functions (which +g_spawn_async_with_pipes() eventually calls) paste the argument +vector elements together into a command line, and the C runtime startup code +does a corresponding reconstruction of an argument vector from the +command line, to be passed to main(). Complications arise when you have +argument vector elements that contain spaces of double quotes. The +spawn*() functions don't do any quoting or +escaping, but on the other hand the startup code does do unquoting +and unescaping in order to enable receiving arguments with embedded +spaces or double quotes. To work around this asymmetry, +g_spawn_async_with_pipes() will do quoting and escaping on argument +vector elements that need it before calling the C runtime +spawn() function. +

+

+The returned child_pid on Windows is a handle to the child +process, not its identifier. Process handles and process +identifiers are different concepts on Windows. +

+

+envp is a NULL-terminated array of strings, where each string +has the form KEY=VALUE. This will become +the child's environment. If envp is NULL, the child inherits its +parent's environment. +

+

+flags should be the bitwise OR of any flags you want to affect the +function's behaviour. The G_SPAWN_DO_NOT_REAP_CHILD means that +the child will not automatically be reaped; you must use a +GChildWatch source to be notified about the death of the child +process. Eventually you must call g_spawn_close_pid() on the +child_pid, in order to free resources which may be associated +with the child process. (On Unix, using a GChildWatch source is +equivalent to calling waitpid() or handling the SIGCHLD signal +manually. On Windows, calling g_spawn_close_pid() is equivalent +to calling CloseHandle() on the process handle returned in +child_pid). +

+

+G_SPAWN_LEAVE_DESCRIPTORS_OPEN means that the parent's open file +descriptors will be inherited by the child; otherwise all +descriptors except stdin/stdout/stderr will be closed before +calling exec() in the child. G_SPAWN_SEARCH_PATH +means that argv[0] need not be an absolute path, it +will be looked for in the user's PATH. +G_SPAWN_STDOUT_TO_DEV_NULL means that the child's standard output will +be discarded, instead of going to the same location as the parent's +standard output. If you use this flag, standard_output must be NULL. +G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error +will be discarded, instead of going to the same location as the parent's +standard error. If you use this flag, standard_error must be NULL. +G_SPAWN_CHILD_INHERITS_STDIN means that the child will inherit the parent's +standard input (by default, the child's standard input is attached to +/dev/null). If you use this flag, standard_input must be NULL. +G_SPAWN_FILE_AND_ARGV_ZERO means that the first element of argv is +the file to execute, while the remaining elements are the +actual argument vector to pass to the file. Normally +g_spawn_async_with_pipes() uses argv[0] as the file to execute, and +passes all of argv to the child. +

+

+child_setup and user_data are a function and user data. On POSIX +platforms, the function is called in the child after GLib has +performed all the setup it plans to perform (including creating +pipes, closing file descriptors, etc.) but before calling +exec(). That is, child_setup is called just +before calling exec() in the child. Obviously +actions taken in this function will only affect the child, not the +parent. +

+

+On Windows, there is no separate fork() and exec() +functionality. Child processes are created and run with a single +API call, CreateProcess(). There is no sensible thing child_setup +could be used for on Windows so it is ignored and not called. +

+

+If non-NULL, child_pid will on Unix be filled with the child's +process ID. You can use the process ID to send signals to the +child, or to use g_child_watch_add() (or waitpid()) if you specified the +G_SPAWN_DO_NOT_REAP_CHILD flag. On Windows, child_pid will be +filled with a handle to the child process only if you specified the +G_SPAWN_DO_NOT_REAP_CHILD flag. You can then access the child +process using the Win32 API, for example wait for its termination +with the WaitFor*() functions, or examine its +exit code with GetExitCodeProcess(). You should close the handle +with CloseHandle() or g_spawn_close_pid() when you no longer need it. +

+

+If non-NULL, the standard_input, standard_output, standard_error +locations will be filled with file descriptors for writing to the child's +standard input or reading from its standard output or standard error. +The caller of g_spawn_async_with_pipes() must close these file descriptors +when they are no longer in use. If these parameters are NULL, the corresponding +pipe won't be created. +

+

+If standard_input is NULL, the child's standard input is attached to +/dev/null unless G_SPAWN_CHILD_INHERITS_STDIN is set. +

+

+If standard_error is NULL, the child's standard error goes to the same +location as the parent's standard error unless G_SPAWN_STDERR_TO_DEV_NULL +is set. +

+

+If standard_output is NULL, the child's standard output goes to the same +location as the parent's standard output unless G_SPAWN_STDOUT_TO_DEV_NULL +is set. +

+

+error can be NULL to ignore errors, or non-NULL to report errors. +If an error is set, the function returns FALSE. Errors +are reported even if they occur in the child (for example if the +executable in argv[0] is not found). Typically +the message field of returned errors should be displayed +to users. Possible errors are those from the G_SPAWN_ERROR domain. +

+

+If an error occurs, child_pid, standard_input, standard_output, +and standard_error will not be filled with valid values. +

+

+If child_pid is not NULL and an error does not occur then the returned +process reference must be closed using g_spawn_close_pid(). +

+

+

+
+

Note

+

+If you are writing a GTK+ application, and the program you +are spawning is a graphical application, too, then you may +want to use gdk_spawn_on_screen_with_pipes() instead to ensure that +the spawned program opens its windows on the right screen. +

+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

working_directory :

child's current working directory, or NULL to inherit parent's, in the GLib file name encoding +

argv :

child's argument vector, in the GLib file name encoding +

envp :

child's environment, or NULL to inherit parent's, in the GLib file name encoding +

flags :

flags from GSpawnFlags +

child_setup :

function to run in the child just before exec() +

user_data :

user data for child_setup +

child_pid :

return location for child process ID, or NULL +

standard_input :

return location for file descriptor to write to child's stdin, or NULL +

standard_output :

return location for file descriptor to read child's stdout, or NULL +

standard_error :

return location for file descriptor to read child's stderr, or NULL +

error :

return location for error +

Returns :

TRUE on success, FALSE if an error was set +
+
+
+
+

g_spawn_async ()

+
gboolean            g_spawn_async                       (const gchar *working_directory,
+                                                         gchar **argv,
+                                                         gchar **envp,
+                                                         GSpawnFlags flags,
+                                                         GSpawnChildSetupFunc child_setup,
+                                                         gpointer user_data,
+                                                         GPid *child_pid,
+                                                         GError **error);
+

+See g_spawn_async_with_pipes() for a full description; this function +simply calls the g_spawn_async_with_pipes() without any pipes. +

+

+You should call g_spawn_close_pid() on the returned child process +reference when you don't need it any more. +

+

+

+
+

Note

+

+If you are writing a GTK+ application, and the program you +are spawning is a graphical application, too, then you may +want to use gdk_spawn_on_screen() instead to ensure that +the spawned program opens its windows on the right screen. +

+
+

+

+

+

+
+

Note

+

Note that the returned child_pid on Windows is a +handle to the child process and not its identifier. Process handles +and process identifiers are different concepts on Windows. +

+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

working_directory :

child's current working directory, or NULL to inherit parent's +

argv :

child's argument vector +

envp :

child's environment, or NULL to inherit parent's +

flags :

flags from GSpawnFlags +

child_setup :

function to run in the child just before exec() +

user_data :

user data for child_setup +

child_pid :

return location for child process reference, or NULL +

error :

return location for error +

Returns :

TRUE on success, FALSE if error is set +
+
+
+
+

g_spawn_sync ()

+
gboolean            g_spawn_sync                        (const gchar *working_directory,
+                                                         gchar **argv,
+                                                         gchar **envp,
+                                                         GSpawnFlags flags,
+                                                         GSpawnChildSetupFunc child_setup,
+                                                         gpointer user_data,
+                                                         gchar **standard_output,
+                                                         gchar **standard_error,
+                                                         gint *exit_status,
+                                                         GError **error);
+

+Executes a child synchronously (waits for the child to exit before returning). +All output from the child is stored in standard_output and standard_error, +if those parameters are non-NULL. Note that you must set the +G_SPAWN_STDOUT_TO_DEV_NULL and G_SPAWN_STDERR_TO_DEV_NULL flags when +passing NULL for standard_output and standard_error. +If exit_status is non-NULL, the exit status of the child is stored +there as it would be returned by waitpid(); standard UNIX macros such +as WIFEXITED() and WEXITSTATUS() must be used to evaluate the exit status. +Note that this function call waitpid() even if exit_status is NULL, and +does not accept the G_SPAWN_DO_NOT_REAP_CHILD flag. +If an error occurs, no data is returned in standard_output, +standard_error, or exit_status. +

+

+This function calls g_spawn_async_with_pipes() internally; see that +function for full details on the other parameters and details on +how these functions work on Windows.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

working_directory :

child's current working directory, or NULL to inherit parent's +

argv :

child's argument vector +

envp :

child's environment, or NULL to inherit parent's +

flags :

flags from GSpawnFlags +

child_setup :

function to run in the child just before exec() +

user_data :

user data for child_setup +

standard_output :

return location for child output, or NULL +

standard_error :

return location for child error messages, or NULL +

exit_status :

return location for child exit status, as returned by waitpid(), or NULL +

error :

return location for error, or NULL +

Returns :

TRUE on success, FALSE if an error was set. +
+
+
+
+

g_spawn_command_line_async ()

+
gboolean            g_spawn_command_line_async          (const gchar *command_line,
+                                                         GError **error);
+

+A simple version of g_spawn_async() that parses a command line with +g_shell_parse_argv() and passes it to g_spawn_async(). Runs a +command line in the background. Unlike g_spawn_async(), the +G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note +that G_SPAWN_SEARCH_PATH can have security implications, so +consider using g_spawn_async() directly if appropriate. Possible +errors are those from g_shell_parse_argv() and g_spawn_async(). +

+

+The same concerns on Windows apply as for g_spawn_command_line_sync().

+
++ + + + + + + + + + + + + + +

command_line :

a command line +

error :

return location for errors +

Returns :

TRUE on success, FALSE if error is set. +
+
+
+
+

g_spawn_command_line_sync ()

+
gboolean            g_spawn_command_line_sync           (const gchar *command_line,
+                                                         gchar **standard_output,
+                                                         gchar **standard_error,
+                                                         gint *exit_status,
+                                                         GError **error);
+

+A simple version of g_spawn_sync() with little-used parameters +removed, taking a command line instead of an argument vector. See +g_spawn_sync() for full details. command_line will be parsed by +g_shell_parse_argv(). Unlike g_spawn_sync(), the G_SPAWN_SEARCH_PATH flag +is enabled. Note that G_SPAWN_SEARCH_PATH can have security +implications, so consider using g_spawn_sync() directly if +appropriate. Possible errors are those from g_spawn_sync() and those +from g_shell_parse_argv(). +

+

+If exit_status is non-NULL, the exit status of the child is stored there as +it would be returned by waitpid(); standard UNIX macros such as WIFEXITED() +and WEXITSTATUS() must be used to evaluate the exit status. +

+

+On Windows, please note the implications of g_shell_parse_argv() +parsing command_line. Parsing is done according to Unix shell rules, not +Windows command interpreter rules. +Space is a separator, and backslashes are +special. Thus you cannot simply pass a command_line containing +canonical Windows paths, like "c:\\program files\\app\\app.exe", as +the backslashes will be eaten, and the space will act as a +separator. You need to enclose such paths with single quotes, like +"'c:\\program files\\app\\app.exe' 'e:\\folder\\argument.txt'".

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

command_line :

a command line +

standard_output :

return location for child output +

standard_error :

return location for child errors +

exit_status :

return location for child exit status, as returned by waitpid() +

error :

return location for errors +

Returns :

TRUE on success, FALSE if an error was set +
+
+
+
+

g_spawn_close_pid ()

+
void                g_spawn_close_pid                   (GPid pid);
+

+On some platforms, notably Windows, the GPid type represents a resource +which must be closed to prevent resource leaking. g_spawn_close_pid() +is provided for this purpose. It should be used on all platforms, even +though it doesn't do anything under UNIX.

+
++ + + + +

pid :

The process reference to close +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Standard-Macros.html b/docs/reference/glib/html/glib-Standard-Macros.html new file mode 100644 index 0000000..6dc2cc9 --- /dev/null +++ b/docs/reference/glib/html/glib-Standard-Macros.html @@ -0,0 +1,478 @@ + + + + +Standard Macros + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Standard Macros

+

Standard Macros — commonly-used macros.

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_OS_WIN32
+#define             G_OS_BEOS
+#define             G_OS_UNIX
+
+#define             G_DIR_SEPARATOR
+#define             G_DIR_SEPARATOR_S
+#define             G_IS_DIR_SEPARATOR                  (c)
+#define             G_SEARCHPATH_SEPARATOR
+#define             G_SEARCHPATH_SEPARATOR_S
+
+#define             TRUE
+#define             FALSE
+
+#define             NULL
+
+#define             MIN                                 (a, b)
+#define             MAX                                 (a, b)
+
+#define             ABS                                 (a)
+#define             CLAMP                               (x, low, high)
+
+#define             G_STRUCT_MEMBER                     (member_type, struct_p, struct_offset)
+#define             G_STRUCT_MEMBER_P                   (struct_p, struct_offset)
+#define             G_STRUCT_OFFSET                     (struct_type, member)
+
+#define             G_MEM_ALIGN
+
+#define             G_CONST_RETURN
+
+
+
+

Description

+

+These macros provide a few commonly-used features. +

+
+
+

Details

+
+

G_OS_WIN32

+
#define G_OS_WIN32
+
+

+This macro is defined only on Windows. So you can bracket +Windows-specific code in "#ifdef G_OS_WIN32". +

+
+
+
+

G_OS_BEOS

+
#define G_OS_BEOS
+
+

+This macro is defined only on BeOS. So you can bracket +BeOS-specific code in "#ifdef G_OS_BEOS". +

+
+
+
+

G_OS_UNIX

+
#define G_OS_UNIX
+
+

+This macro is defined only on UNIX. So you can bracket +UNIX-specific code in "#ifdef G_OS_UNIX". +

+
+
+
+

G_DIR_SEPARATOR

+
#define             G_DIR_SEPARATOR
+

+The directory separator character. +This is '/' on UNIX machines and '\' under Windows. +

+
+
+
+

G_DIR_SEPARATOR_S

+
#define             G_DIR_SEPARATOR_S
+

+The directory separator as a string. +This is "/" on UNIX machines and "\" under Windows. +

+
+
+
+

G_IS_DIR_SEPARATOR()

+
#define             G_IS_DIR_SEPARATOR(c)
+

+Checks whether a character is a directory +separator. It returns TRUE for '/' on UNIX +machines and for '\' or '/' under Windows. +

+
++ + + + +

c :

a character +
+

Since 2.6

+
+
+
+

G_SEARCHPATH_SEPARATOR

+
#define             G_SEARCHPATH_SEPARATOR
+

+The search path separator character. +This is ':' on UNIX machines and ';' under Windows. +

+
+
+
+

G_SEARCHPATH_SEPARATOR_S

+
#define             G_SEARCHPATH_SEPARATOR_S
+

+The search path separator as a string. +This is ":" on UNIX machines and ";" under Windows. +

+
+
+
+

TRUE

+
#define TRUE (!FALSE)
+
+

+Defines the TRUE value for the gboolean type. +

+
+
+
+

FALSE

+
#define FALSE (0)
+
+

+Defines the FALSE value for the gboolean type. +

+
+
+
+

NULL

+
#define             NULL
+

+Defines the standard NULL pointer. +

+
+
+
+

MIN()

+
#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
+
+

+Calculates the minimum of a and b. +

+
++ + + + + + + + + + + + + + +

a :

a numeric value. +

b :

a numeric value. +

Returns :

the minimum of a and b. +
+
+
+
+

MAX()

+
#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
+
+

+Calculates the maximum of a and b. +

+
++ + + + + + + + + + + + + + +

a :

a numeric value. +

b :

a numeric value. +

Returns :

the maximum of a and b. +
+
+
+
+

ABS()

+
#define ABS(a)	   (((a) < 0) ? -(a) : (a))
+
+

+Calculates the absolute value of a. +The absolute value is simply the number with any negative sign taken away. +

+

+For example, +

+
    +
  • +ABS(-10) is 10. +

  • +
  • +ABS(10) is also 10. +

  • +
+

+

+
++ + + + + + + + + + +

a :

a numeric value. +

Returns :

the absolute value of a. +
+
+
+
+

CLAMP()

+
#define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
+
+

+Ensures that x is between the limits set by low and high. If low is +greater than high the result is undefined. +

+

+For example, +

+
    +
  • +CLAMP(5, 10, 15) is 10. +

  • +
  • +CLAMP(15, 5, 10) is 10. +

  • +
  • +CLAMP(20, 15, 25) is 20. +

  • +
+

+

+
++ + + + + + + + + + + + + + + + + + +

x :

the value to clamp. +

low :

the minimum value allowed. +

high :

the maximum value allowed. +

Returns :

the value of x clamped to the range between low and high. +
+
+
+
+

G_STRUCT_MEMBER()

+
#define             G_STRUCT_MEMBER(member_type, struct_p, struct_offset)
+

+Returns a member of a structure at a given offset, using the given type. +

+
++ + + + + + + + + + + + + + + + + + +

member_type :

the type of the struct field. +

struct_p :

a pointer to a struct. +

struct_offset :

the offset of the field from the start of the struct, in bytes. +

Returns :

the struct member. +
+
+
+
+

G_STRUCT_MEMBER_P()

+
#define             G_STRUCT_MEMBER_P(struct_p, struct_offset)
+

+Returns an untyped pointer to a given offset of a struct. +

+
++ + + + + + + + + + + + + + +

struct_p :

a pointer to a struct. +

struct_offset :

the offset from the start of the struct, in bytes. +

Returns :

an untyped pointer to struct_p plus struct_offset bytes. +
+
+
+
+

G_STRUCT_OFFSET()

+
#define             G_STRUCT_OFFSET(struct_type, member)
+

+Returns the offset, in bytes, of a member of a struct. +

+
++ + + + + + + + + + + + + + +

struct_type :

a structure type, e.g. GtkWidget. +

member :

a field in the structure, e.g. window. +

Returns :

the offset of member from the start of struct_type. +
+
+
+
+

G_MEM_ALIGN

+
#define             G_MEM_ALIGN
+

+Indicates the number of bytes to which memory will be aligned on the +current platform. +

+
+
+
+

G_CONST_RETURN

+
#define             G_CONST_RETURN
+

+If G_DISABLE_CONST_RETURNS is defined, this macro expands to nothing. +By default, the macro expands to const. The macro +should be used in place of const for functions that +return a value that should not be modified. The purpose of this macro is +to allow us to turn on const for returned constant +strings by default, while allowing programmers who find that annoying to +turn it off. This macro should only be used for return values and for +out parameters, it doesn't make sense for +in parameters. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-String-Chunks.html b/docs/reference/glib/html/glib-String-Chunks.html new file mode 100644 index 0000000..0cb070f --- /dev/null +++ b/docs/reference/glib/html/glib-String-Chunks.html @@ -0,0 +1,313 @@ + + + + +String Chunks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

String Chunks

+

String Chunks — efficient storage of groups of strings

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GStringChunk;
+GStringChunk*       g_string_chunk_new                  (gsize size);
+gchar*              g_string_chunk_insert               (GStringChunk *chunk,
+                                                         const gchar *string);
+gchar*              g_string_chunk_insert_const         (GStringChunk *chunk,
+                                                         const gchar *string);
+gchar*              g_string_chunk_insert_len           (GStringChunk *chunk,
+                                                         const gchar *string,
+                                                         gssize len);
+void                g_string_chunk_clear                (GStringChunk *chunk);
+void                g_string_chunk_free                 (GStringChunk *chunk);
+
+
+
+

Description

+

+String chunks are used to store groups of strings. Memory is +allocated in blocks, and as strings are added to the GStringChunk +they are copied into the next free position in a block. When a block +is full a new block is allocated. +

+

+When storing a large number of strings, string chunks are more +efficient than using g_strdup() since fewer calls to malloc() are +needed, and less memory is wasted in memory allocation overheads. +

+

+By adding strings with g_string_chunk_insert_const() it is also +possible to remove duplicates. +

+

+To create a new GStringChunk use g_string_chunk_new(). +

+

+To add strings to a GStringChunk use g_string_chunk_insert(). +

+

+To add strings to a GStringChunk, but without duplicating strings +which are already in the GStringChunk, use +g_string_chunk_insert_const(). +

+

+To free the entire GStringChunk use g_string_chunk_free(). It is +not possible to free individual strings.

+
+
+

Details

+
+

GStringChunk

+
typedef struct _GStringChunk GStringChunk;
+

+An opaque data structure representing String Chunks. It should only +be accessed by using the following functions.

+
+
+
+

g_string_chunk_new ()

+
GStringChunk*       g_string_chunk_new                  (gsize size);
+

+Creates a new GStringChunk.

+
++ + + + + + + + + + +

size :

the default size of the blocks of memory which are + allocated to store the strings. If a particular string + is larger than this default size, a larger block of + memory will be allocated for it. +

Returns :

a new GStringChunk +
+
+
+
+

g_string_chunk_insert ()

+
gchar*              g_string_chunk_insert               (GStringChunk *chunk,
+                                                         const gchar *string);
+

+Adds a copy of string to the GStringChunk. +It returns a pointer to the new copy of the string +in the GStringChunk. The characters in the string +can be changed, if necessary, though you should not +change anything after the end of the string. +

+

+Unlike g_string_chunk_insert_const(), this function +does not check for duplicates. Also strings added +with g_string_chunk_insert() will not be searched +by g_string_chunk_insert_const() when looking for +duplicates.

+
++ + + + + + + + + + + + + + +

chunk :

a GStringChunk +

string :

the string to add +

Returns :

a pointer to the copy of string within + the GStringChunk +
+
+
+
+

g_string_chunk_insert_const ()

+
gchar*              g_string_chunk_insert_const         (GStringChunk *chunk,
+                                                         const gchar *string);
+

+Adds a copy of string to the GStringChunk, unless the same +string has already been added to the GStringChunk with +g_string_chunk_insert_const(). +

+

+This function is useful if you need to copy a large number +of strings but do not want to waste space storing duplicates. +But you must remember that there may be several pointers to +the same string, and so any changes made to the strings +should be done very carefully. +

+

+Note that g_string_chunk_insert_const() will not return a +pointer to a string added with g_string_chunk_insert(), even +if they do match.

+
++ + + + + + + + + + + + + + +

chunk :

a GStringChunk +

string :

the string to add +

Returns :

a pointer to the new or existing copy of string + within the GStringChunk +
+
+
+
+

g_string_chunk_insert_len ()

+
gchar*              g_string_chunk_insert_len           (GStringChunk *chunk,
+                                                         const gchar *string,
+                                                         gssize len);
+

+Adds a copy of the first len bytes of string to the GStringChunk. +The copy is nul-terminated. +

+

+Since this function does not stop at nul bytes, it is the caller's +responsibility to ensure that string has at least len addressable +bytes. +

+

+The characters in the returned string can be changed, if necessary, +though you should not change anything after the end of the string.

+
++ + + + + + + + + + + + + + + + + + +

chunk :

a GStringChunk +

string :

bytes to insert +

len :

number of bytes of string to insert, or -1 to insert a + nul-terminated string +

Returns :

a pointer to the copy of string within the GStringChunk + +
+

Since 2.4

+
+
+
+

g_string_chunk_clear ()

+
void                g_string_chunk_clear                (GStringChunk *chunk);
+

+Frees all strings contained within the GStringChunk. +After calling g_string_chunk_clear() it is not safe to +access any of the strings which were contained within it.

+
++ + + + +

chunk :

a GStringChunk +
+

Since 2.14

+
+
+
+

g_string_chunk_free ()

+
void                g_string_chunk_free                 (GStringChunk *chunk);
+

+Frees all memory allocated by the GStringChunk. +After calling g_string_chunk_free() it is not safe to +access any of the strings which were contained within it.

+
++ + + + +

chunk :

a GStringChunk +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-String-Utility-Functions.html b/docs/reference/glib/html/glib-String-Utility-Functions.html new file mode 100644 index 0000000..373b94a --- /dev/null +++ b/docs/reference/glib/html/glib-String-Utility-Functions.html @@ -0,0 +1,2899 @@ + + + + +String Utility Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

String Utility Functions

+

String Utility Functions — various string-related functions

+
+
+

Synopsis

+
+#include <glib.h>
+#include <glib/gprintf.h>
+
+gchar*              g_strdup                            (const gchar *str);
+gchar*              g_strndup                           (const gchar *str,
+                                                         gsize n);
+gchar**             g_strdupv                           (gchar **str_array);
+gchar*              g_strnfill                          (gsize length,
+                                                         gchar fill_char);
+gchar*              g_stpcpy                            (gchar *dest,
+                                                         const char *src);
+gchar *             g_strstr_len                        (const gchar *haystack,
+                                                         gssize haystack_len,
+                                                         const gchar *needle);
+gchar *             g_strrstr                           (const gchar *haystack,
+                                                         const gchar *needle);
+gchar *             g_strrstr_len                       (const gchar *haystack,
+                                                         gssize haystack_len,
+                                                         const gchar *needle);
+gboolean            g_str_has_prefix                    (const gchar *str,
+                                                         const gchar *prefix);
+gboolean            g_str_has_suffix                    (const gchar *str,
+                                                         const gchar *suffix);
+int                 g_strcmp0                           (const char *str1,
+                                                         const char *str2);
+
+gsize               g_strlcpy                           (gchar *dest,
+                                                         const gchar *src,
+                                                         gsize dest_size);
+gsize               g_strlcat                           (gchar *dest,
+                                                         const gchar *src,
+                                                         gsize dest_size);
+
+gchar*              g_strdup_printf                     (const gchar *format,
+                                                         ...);
+gchar*              g_strdup_vprintf                    (const gchar *format,
+                                                         va_list args);
+gint                g_printf                            (gchar const *format,
+                                                         ...);
+gint                g_vprintf                           (gchar const *format,
+                                                         va_list args);
+gint                g_fprintf                           (FILE *file,
+                                                         gchar const *format,
+                                                         ...);
+gint                g_vfprintf                          (FILE *file,
+                                                         gchar const *format,
+                                                         va_list args);
+gint                g_sprintf                           (gchar *string,
+                                                         gchar const *format,
+                                                         ...);
+gint                g_vsprintf                          (gchar *string,
+                                                         gchar const *format,
+                                                         va_list args);
+gint                g_snprintf                          (gchar *string,
+                                                         gulong n,
+                                                         gchar const *format,
+                                                         ...);
+gint                g_vsnprintf                         (gchar *string,
+                                                         gulong n,
+                                                         gchar const *format,
+                                                         va_list args);
+gint                g_vasprintf                         (gchar **string,
+                                                         gchar const *format,
+                                                         va_list args);
+gsize               g_printf_string_upper_bound         (const gchar *format,
+                                                         va_list args);
+
+gboolean            g_ascii_isalnum                     (gchar c);
+gboolean            g_ascii_isalpha                     (gchar c);
+gboolean            g_ascii_iscntrl                     (gchar c);
+gboolean            g_ascii_isdigit                     (gchar c);
+gboolean            g_ascii_isgraph                     (gchar c);
+gboolean            g_ascii_islower                     (gchar c);
+gboolean            g_ascii_isprint                     (gchar c);
+gboolean            g_ascii_ispunct                     (gchar c);
+gboolean            g_ascii_isspace                     (gchar c);
+gboolean            g_ascii_isupper                     (gchar c);
+gboolean            g_ascii_isxdigit                    (gchar c);
+
+gint                g_ascii_digit_value                 (gchar c);
+gint                g_ascii_xdigit_value                (gchar c);
+
+gint                g_ascii_strcasecmp                  (const gchar *s1,
+                                                         const gchar *s2);
+gint                g_ascii_strncasecmp                 (const gchar *s1,
+                                                         const gchar *s2,
+                                                         gsize n);
+
+gchar*              g_ascii_strup                       (const gchar *str,
+                                                         gssize len);
+gchar*              g_ascii_strdown                     (const gchar *str,
+                                                         gssize len);
+
+gchar               g_ascii_tolower                     (gchar c);
+gchar               g_ascii_toupper                     (gchar c);
+
+GString*            g_string_ascii_up                   (GString *string);
+GString*            g_string_ascii_down                 (GString *string);
+
+gchar*              g_strup                             (gchar *string);
+gchar*              g_strdown                           (gchar *string);
+
+gint                g_strcasecmp                        (const gchar *s1,
+                                                         const gchar *s2);
+gint                g_strncasecmp                       (const gchar *s1,
+                                                         const gchar *s2,
+                                                         guint n);
+
+gchar*              g_strreverse                        (gchar *string);
+
+gint64              g_ascii_strtoll                     (const gchar *nptr,
+                                                         gchar **endptr,
+                                                         guint base);
+guint64             g_ascii_strtoull                    (const gchar *nptr,
+                                                         gchar **endptr,
+                                                         guint base);
+#define             G_ASCII_DTOSTR_BUF_SIZE
+gdouble             g_ascii_strtod                      (const gchar *nptr,
+                                                         gchar **endptr);
+gchar *             g_ascii_dtostr                      (gchar *buffer,
+                                                         gint buf_len,
+                                                         gdouble d);
+gchar *             g_ascii_formatd                     (gchar *buffer,
+                                                         gint buf_len,
+                                                         const gchar *format,
+                                                         gdouble d);
+gdouble             g_strtod                            (const gchar *nptr,
+                                                         gchar **endptr);
+
+gchar*              g_strchug                           (gchar *string);
+gchar*              g_strchomp                          (gchar *string);
+#define             g_strstrip                          ( string )
+
+gchar*              g_strdelimit                        (gchar *string,
+                                                         const gchar *delimiters,
+                                                         gchar new_delimiter);
+#define             G_STR_DELIMITERS
+gchar*              g_strescape                         (const gchar *source,
+                                                         const gchar *exceptions);
+gchar*              g_strcompress                       (const gchar *source);
+gchar*              g_strcanon                          (gchar *string,
+                                                         const gchar *valid_chars,
+                                                         gchar substitutor);
+gchar**             g_strsplit                          (const gchar *string,
+                                                         const gchar *delimiter,
+                                                         gint max_tokens);
+gchar **            g_strsplit_set                      (const gchar *string,
+                                                         const gchar *delimiters,
+                                                         gint max_tokens);
+void                g_strfreev                          (gchar **str_array);
+gchar*              g_strconcat                         (const gchar *string1,
+                                                         ...);
+gchar*              g_strjoin                           (const gchar *separator,
+                                                         ...);
+gchar*              g_strjoinv                          (const gchar *separator,
+                                                         gchar **str_array);
+guint               g_strv_length                       (gchar **str_array);
+
+const gchar*        g_strerror                          (gint errnum);
+const gchar*        g_strsignal                         (gint signum);
+
+
+
+

Description

+

+This section describes a number of utility functions for creating, +duplicating, and manipulating strings. +

+

+Note that the functions g_printf(), g_fprintf(), g_sprintf(), g_snprintf(), +g_vprintf(), g_vfprintf(), g_vsprintf() and g_vsnprintf() are declared in +the header gprintf.h which is not +included in glib.h (otherwise using +glib.h would drag in stdio.h), so +you'll have to explicitly include <glib/gprintf.h> +in order to use the GLib printf() functions. +

+

+While you may use the printf() functions to format UTF-8 strings, notice that +the precision of a %Ns parameter is interpreted as the +number of bytes, not characters to print. +On top of that, the GNU libc implementation of the printf() functions has the "feature" +that it checks that the string given for the %Ns parameter +consists of a whole number of characters in the current encoding. So, unless you +are sure you are always going to be in an UTF-8 locale or your know your text is restricted +to ASCII, avoid using %Ns. +If your intention is to format strings for a certain number of columns, then +%Ns is not a correct solution anyway, since it fails to take +wide characters (see g_unichar_iswide()) into account. +

+
+
+

Details

+
+

g_strdup ()

+
gchar*              g_strdup                            (const gchar *str);
+

+Duplicates a string. If str is NULL it returns NULL. +The returned string should be freed with g_free() +when no longer needed.

+
++ + + + + + + + + + +

str :

the string to duplicate +

Returns :

a newly-allocated copy of str +
+
+
+
+

g_strndup ()

+
gchar*              g_strndup                           (const gchar *str,
+                                                         gsize n);
+

+Duplicates the first n bytes of a string, returning a newly-allocated +buffer n + 1 bytes long which will always be nul-terminated. +If str is less than n bytes long the buffer is padded with nuls. +If str is NULL it returns NULL. +The returned value should be freed when no longer needed. +

+

+

+
+

Note

+

+To copy a number of characters from a UTF-8 encoded string, use +g_utf8_strncpy() instead. +

+
+
++ + + + + + + + + + + + + + +

str :

the string to duplicate +

n :

the maximum number of bytes to copy from str +

Returns :

a newly-allocated buffer containing the first n bytes + of str, nul-terminated +
+
+
+
+

g_strdupv ()

+
gchar**             g_strdupv                           (gchar **str_array);
+

+Copies NULL-terminated array of strings. The copy is a deep copy; +the new array should be freed by first freeing each string, then +the array itself. g_strfreev() does this for you. If called +on a NULL value, g_strdupv() simply returns NULL.

+
++ + + + + + + + + + +

str_array :

NULL-terminated array of strings. +

Returns :

a new NULL-terminated array of strings. +
+
+
+
+

g_strnfill ()

+
gchar*              g_strnfill                          (gsize length,
+                                                         gchar fill_char);
+

+Creates a new string length bytes long filled with fill_char. +The returned string should be freed when no longer needed.

+
++ + + + + + + + + + + + + + +

length :

the length of the new string +

fill_char :

the byte to fill the string with +

Returns :

a newly-allocated string filled the fill_char +
+
+
+
+

g_stpcpy ()

+
gchar*              g_stpcpy                            (gchar *dest,
+                                                         const char *src);
+

+Copies a nul-terminated string into the dest buffer, include the +trailing nul, and return a pointer to the trailing nul byte. +This is useful for concatenating multiple strings together +without having to repeatedly scan for the end.

+
++ + + + + + + + + + + + + + +

dest :

destination buffer. +

src :

source string. +

Returns :

a pointer to trailing nul byte. +
+
+
+
+

g_strstr_len ()

+
gchar *             g_strstr_len                        (const gchar *haystack,
+                                                         gssize haystack_len,
+                                                         const gchar *needle);
+

+Searches the string haystack for the first occurrence +of the string needle, limiting the length of the search +to haystack_len.

+
++ + + + + + + + + + + + + + + + + + +

haystack :

a string. +

haystack_len :

the maximum length of haystack. Note that -1 is +a valid length, if haystack is nul-terminated, meaning it will +search through the whole string. +

needle :

the string to search for. +

Returns :

a pointer to the found occurrence, or + NULL if not found. +
+
+
+
+

g_strrstr ()

+
gchar *             g_strrstr                           (const gchar *haystack,
+                                                         const gchar *needle);
+

+Searches the string haystack for the last occurrence +of the string needle.

+
++ + + + + + + + + + + + + + +

haystack :

a nul-terminated string. +

needle :

the nul-terminated string to search for. +

Returns :

a pointer to the found occurrence, or + NULL if not found. +
+
+
+
+

g_strrstr_len ()

+
gchar *             g_strrstr_len                       (const gchar *haystack,
+                                                         gssize haystack_len,
+                                                         const gchar *needle);
+

+Searches the string haystack for the last occurrence +of the string needle, limiting the length of the search +to haystack_len.

+
++ + + + + + + + + + + + + + + + + + +

haystack :

a nul-terminated string. +

haystack_len :

the maximum length of haystack. +

needle :

the nul-terminated string to search for. +

Returns :

a pointer to the found occurrence, or + NULL if not found. +
+
+
+
+

g_str_has_prefix ()

+
gboolean            g_str_has_prefix                    (const gchar *str,
+                                                         const gchar *prefix);
+

+Looks whether the string str begins with prefix.

+
++ + + + + + + + + + + + + + +

str :

a nul-terminated string. +

prefix :

the nul-terminated prefix to look for. +

Returns :

TRUE if str begins with prefix, FALSE otherwise. + +
+

Since 2.2

+
+
+
+

g_str_has_suffix ()

+
gboolean            g_str_has_suffix                    (const gchar *str,
+                                                         const gchar *suffix);
+

+Looks whether the string str ends with suffix.

+
++ + + + + + + + + + + + + + +

str :

a nul-terminated string. +

suffix :

the nul-terminated suffix to look for. +

Returns :

TRUE if str end with suffix, FALSE otherwise. + +
+

Since 2.2

+
+
+
+

g_strcmp0 ()

+
int                 g_strcmp0                           (const char *str1,
+                                                         const char *str2);
+

+Compares str1 and str2 like strcmp(). Handles NULL +gracefully by sorting it before non-NULL strings.

+
++ + + + + + + + + + + + + + +

str1 :

a C string or NULL +

str2 :

another C string or NULL +

Returns :

-1, 0 or 1, if str1 is <, == or > than str2. + +
+

Since 2.16

+
+
+
+

g_strlcpy ()

+
gsize               g_strlcpy                           (gchar *dest,
+                                                         const gchar *src,
+                                                         gsize dest_size);
+

+Portability wrapper that calls strlcpy() on systems which have it, +and emulates strlcpy() otherwise. Copies src to dest; dest is +guaranteed to be nul-terminated; src must be nul-terminated; +dest_size is the buffer size, not the number of chars to copy. +

+

+At most dest_size - 1 characters will be copied. Always nul-terminates +(unless dest_size == 0). This function does not +allocate memory. Unlike strncpy(), this function doesn't pad dest (so +it's often faster). It returns the size of the attempted result, +strlen (src), so if retval >= dest_size, truncation occurred. +

+

+

+
+

Note

+

Caveat: strlcpy() is supposedly more secure than +strcpy() or strncpy(), but if you really want to avoid screwups, +g_strdup() is an even better idea.

+
+
++ + + + + + + + + + + + + + + + + + +

dest :

destination buffer +

src :

source buffer +

dest_size :

length of dest in bytes +

Returns :

length of src +
+
+
+
+

g_strlcat ()

+
gsize               g_strlcat                           (gchar *dest,
+                                                         const gchar *src,
+                                                         gsize dest_size);
+

+Portability wrapper that calls strlcat() on systems which have it, +and emulates it otherwise. Appends nul-terminated src string to dest, +guaranteeing nul-termination for dest. The total size of dest won't +exceed dest_size. +

+

+At most dest_size - 1 characters will be copied. +Unlike strncat, dest_size is the full size of dest, not the space left over. +This function does NOT allocate memory. +This always NUL terminates (unless siz == 0 or there were no NUL characters +in the dest_size characters of dest to start with). +

+

+

+
+

Note

+

Caveat: this is supposedly a more secure alternative to +strcat() or strncat(), but for real security g_strconcat() is harder +to mess up.

+
+
++ + + + + + + + + + + + + + + + + + +

dest :

destination buffer, already containing one nul-terminated string +

src :

source buffer +

dest_size :

length of dest buffer in bytes (not length of existing string + inside dest) +

Returns :

size of attempted result, which is +MIN (dest_size, strlen (original dest)) + strlen (src), +so if retval >= dest_size, truncation occurred. +
+
+
+
+

g_strdup_printf ()

+
gchar*              g_strdup_printf                     (const gchar *format,
+                                                         ...);
+

+Similar to the standard C sprintf() function but safer, since it +calculates the maximum space required and allocates memory to hold +the result. The returned string should be freed with g_free() when no +longer needed.

+
++ + + + + + + + + + + + + + +

format :

a standard printf() format string, but notice + string precision pitfalls +

... :

the parameters to insert into the format string +

Returns :

a newly-allocated string holding the result +
+
+
+
+

g_strdup_vprintf ()

+
gchar*              g_strdup_vprintf                    (const gchar *format,
+                                                         va_list args);
+

+Similar to the standard C vsprintf() function but safer, since it +calculates the maximum space required and allocates memory to hold +the result. The returned string should be freed with g_free() when +no longer needed. +

+

+See also g_vasprintf(), which offers the same functionality, but +additionally returns the length of the allocated string.

+
++ + + + + + + + + + + + + + +

format :

a standard printf() format string, but notice + string precision pitfalls +

args :

the list of parameters to insert into the format string +

Returns :

a newly-allocated string holding the result +
+
+
+
+

g_printf ()

+
gint                g_printf                            (gchar const *format,
+                                                         ...);
+

+An implementation of the standard printf() function which supports +positional parameters, as specified in the Single Unix Specification.

+
++ + + + + + + + + + + + + + +

format :

a standard printf() format string, but notice + string precision pitfalls. +

... :

the arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.2

+
+
+
+

g_vprintf ()

+
gint                g_vprintf                           (gchar const *format,
+                                                         va_list args);
+

+An implementation of the standard vprintf() function which supports +positional parameters, as specified in the Single Unix Specification.

+
++ + + + + + + + + + + + + + +

format :

a standard printf() format string, but notice + string precision pitfalls. +

args :

the list of arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.2

+
+
+
+

g_fprintf ()

+
gint                g_fprintf                           (FILE *file,
+                                                         gchar const *format,
+                                                         ...);
+

+An implementation of the standard fprintf() function which supports +positional parameters, as specified in the Single Unix Specification.

+
++ + + + + + + + + + + + + + + + + + +

file :

the stream to write to. +

format :

a standard printf() format string, but notice + string precision pitfalls. +

... :

the arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.2

+
+
+
+

g_vfprintf ()

+
gint                g_vfprintf                          (FILE *file,
+                                                         gchar const *format,
+                                                         va_list args);
+

+An implementation of the standard fprintf() function which supports +positional parameters, as specified in the Single Unix Specification.

+
++ + + + + + + + + + + + + + + + + + +

file :

the stream to write to. +

format :

a standard printf() format string, but notice + string precision pitfalls. +

args :

the list of arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.2

+
+
+
+

g_sprintf ()

+
gint                g_sprintf                           (gchar *string,
+                                                         gchar const *format,
+                                                         ...);
+

+An implementation of the standard sprintf() function which supports +positional parameters, as specified in the Single Unix Specification.

+
++ + + + + + + + + + + + + + + + + + +

string :

A pointer to a memory buffer to contain the resulting string. It + is up to the caller to ensure that the allocated buffer is large + enough to hold the formatted result +

format :

a standard printf() format string, but notice + string precision pitfalls. +

... :

the arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.2

+
+
+
+

g_vsprintf ()

+
gint                g_vsprintf                          (gchar *string,
+                                                         gchar const *format,
+                                                         va_list args);
+

+An implementation of the standard vsprintf() function which supports +positional parameters, as specified in the Single Unix Specification.

+
++ + + + + + + + + + + + + + + + + + +

string :

the buffer to hold the output. +

format :

a standard printf() format string, but notice + string precision pitfalls. +

args :

the list of arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.2

+
+
+
+

g_snprintf ()

+
gint                g_snprintf                          (gchar *string,
+                                                         gulong n,
+                                                         gchar const *format,
+                                                         ...);
+

+A safer form of the standard sprintf() function. The output is guaranteed +to not exceed n characters (including the terminating nul character), so +it is easy to ensure that a buffer overflow cannot occur. +

+

+See also g_strdup_printf(). +

+

+In versions of GLib prior to 1.2.3, this function may return -1 if the +output was truncated, and the truncated string may not be nul-terminated. +In versions prior to 1.3.12, this function returns the length of the output +string. +

+

+The return value of g_snprintf() conforms to the snprintf() +function as standardized in ISO C99. Note that this is different from +traditional snprintf(), which returns the length of the output string. +

+

+The format string may contain positional parameters, as specified in +the Single Unix Specification.

+
++ + + + + + + + + + + + + + + + + + + + + + +

string :

the buffer to hold the output. +

n :

the maximum number of bytes to produce (including the + terminating nul character). +

format :

a standard printf() format string, but notice + string precision pitfalls. +

... :

the arguments to insert in the output. +

Returns :

the number of bytes which would be produced if the buffer + was large enough. +
+
+
+
+

g_vsnprintf ()

+
gint                g_vsnprintf                         (gchar *string,
+                                                         gulong n,
+                                                         gchar const *format,
+                                                         va_list args);
+

+A safer form of the standard vsprintf() function. The output is guaranteed +to not exceed n characters (including the terminating nul character), so +it is easy to ensure that a buffer overflow cannot occur. +

+

+See also g_strdup_vprintf(). +

+

+In versions of GLib prior to 1.2.3, this function may return -1 if the +output was truncated, and the truncated string may not be nul-terminated. +In versions prior to 1.3.12, this function returns the length of the output +string. +

+

+The return value of g_vsnprintf() conforms to the vsnprintf() function +as standardized in ISO C99. Note that this is different from traditional +vsnprintf(), which returns the length of the output string. +

+

+The format string may contain positional parameters, as specified in +the Single Unix Specification.

+
++ + + + + + + + + + + + + + + + + + + + + + +

string :

the buffer to hold the output. +

n :

the maximum number of bytes to produce (including the + terminating nul character). +

format :

a standard printf() format string, but notice + string precision pitfalls. +

args :

the list of arguments to insert in the output. +

Returns :

the number of bytes which would be produced if the buffer + was large enough. +
+
+
+
+

g_vasprintf ()

+
gint                g_vasprintf                         (gchar **string,
+                                                         gchar const *format,
+                                                         va_list args);
+

+An implementation of the GNU vasprintf() function which supports +positional parameters, as specified in the Single Unix Specification. +This function is similar to g_vsprintf(), except that it allocates a +string to hold the output, instead of putting the output in a buffer +you allocate in advance.

+
++ + + + + + + + + + + + + + + + + + +

string :

the return location for the newly-allocated string. +

format :

a standard printf() format string, but notice + string precision pitfalls. +

args :

the list of arguments to insert in the output. +

Returns :

the number of bytes printed. + +
+

Since 2.4

+
+
+
+

g_printf_string_upper_bound ()

+
gsize               g_printf_string_upper_bound         (const gchar *format,
+                                                         va_list args);
+

+Calculates the maximum space needed to store the output of the sprintf() +function. +

+
++ + + + + + + + + + + + + + +

format :

the format string. See the printf() documentation. +

args :

the parameters to be inserted into the format string. +

Returns :

the maximum space needed to store the formatted string. +
+
+
+
+

g_ascii_isalnum ()

+
gboolean            g_ascii_isalnum                     (gchar c);
+

+Determines whether a character is alphanumeric. +

+

+Unlike the standard C library isalnum() function, this only +recognizes standard ASCII letters and ignores the locale, returning +FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII alphanumeric character +
+
+
+
+

g_ascii_isalpha ()

+
gboolean            g_ascii_isalpha                     (gchar c);
+

+Determines whether a character is alphabetic (i.e. a letter). +

+

+Unlike the standard C library isalpha() function, this only +recognizes standard ASCII letters and ignores the locale, returning +FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII alphabetic character +
+
+
+
+

g_ascii_iscntrl ()

+
gboolean            g_ascii_iscntrl                     (gchar c);
+

+Determines whether a character is a control character. +

+

+Unlike the standard C library iscntrl() function, this only +recognizes standard ASCII control characters and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII control character. +
+
+
+
+

g_ascii_isdigit ()

+
gboolean            g_ascii_isdigit                     (gchar c);
+

+Determines whether a character is digit (0-9). +

+

+Unlike the standard C library isdigit() function, +this takes a char, not an int, so don't call it +on EOF but no need to cast to guchar before passing a possibly +non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII digit. +
+
+
+
+

g_ascii_isgraph ()

+
gboolean            g_ascii_isgraph                     (gchar c);
+

+Determines whether a character is a printing character and not a space. +

+

+Unlike the standard C library isgraph() function, +this only recognizes standard ASCII characters and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII printing character other than space. +
+
+
+
+

g_ascii_islower ()

+
gboolean            g_ascii_islower                     (gchar c);
+

+Determines whether a character is an ASCII lower case letter. +

+

+Unlike the standard C library islower() function, +this only recognizes standard ASCII letters and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to worry about casting to guchar +before passing a possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII lower case letter +
+
+
+
+

g_ascii_isprint ()

+
gboolean            g_ascii_isprint                     (gchar c);
+

+Determines whether a character is a printing character. +

+

+Unlike the standard C library isprint() function, +this only recognizes standard ASCII characters and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII printing character. +
+
+
+
+

g_ascii_ispunct ()

+
gboolean            g_ascii_ispunct                     (gchar c);
+

+Determines whether a character is a punctuation character. +

+

+Unlike the standard C library ispunct() function, +this only recognizes standard ASCII letters and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII punctuation character. +
+
+
+
+

g_ascii_isspace ()

+
gboolean            g_ascii_isspace                     (gchar c);
+

+Determines whether a character is a white-space character. +

+

+Unlike the standard C library isspace() function, +this only recognizes standard ASCII white-space and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII white-space character +
+
+
+
+

g_ascii_isupper ()

+
gboolean            g_ascii_isupper                     (gchar c);
+

+Determines whether a character is an ASCII upper case letter. +

+

+Unlike the standard C library isupper() function, +this only recognizes standard ASCII letters and ignores the locale, +returning FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on EOF but no need to worry about casting to guchar +before passing a possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII upper case letter +
+
+
+
+

g_ascii_isxdigit ()

+
gboolean            g_ascii_isxdigit                    (gchar c);
+

+Determines whether a character is a hexadecimal-digit character. +

+

+Unlike the standard C library isxdigit() function, +this takes a char, not an int, so +don't call it on EOF but no need to cast to guchar before passing a +possibly non-ASCII character in. +

+
++ + + + + + + + + + +

c :

any character +

Returns :

+TRUE if c is an ASCII hexadecimal-digit character. +
+
+
+
+

g_ascii_digit_value ()

+
gint                g_ascii_digit_value                 (gchar c);
+

+Determines the numeric value of a character as a decimal +digit. Differs from g_unichar_digit_value() because it takes +a char, so there's no worry about sign extension if characters +are signed.

+
++ + + + + + + + + + +

c :

an ASCII character. +

Returns :

If c is a decimal digit (according to +g_ascii_isdigit()), its numeric value. Otherwise, -1. +
+
+
+
+

g_ascii_xdigit_value ()

+
gint                g_ascii_xdigit_value                (gchar c);
+

+Determines the numeric value of a character as a hexidecimal +digit. Differs from g_unichar_xdigit_value() because it takes +a char, so there's no worry about sign extension if characters +are signed.

+
++ + + + + + + + + + +

c :

an ASCII character. +

Returns :

If c is a hex digit (according to +g_ascii_isxdigit()), its numeric value. Otherwise, -1. +
+
+
+
+

g_ascii_strcasecmp ()

+
gint                g_ascii_strcasecmp                  (const gchar *s1,
+                                                         const gchar *s2);
+

+Compare two strings, ignoring the case of ASCII characters. +

+

+Unlike the BSD strcasecmp() function, this only recognizes standard +ASCII letters and ignores the locale, treating all non-ASCII +bytes as if they are not letters. +

+

+This function should be used only on strings that are known to be +in encodings where the bytes corresponding to ASCII letters always +represent themselves. This includes UTF-8 and the ISO-8859-* +charsets, but not for instance double-byte encodings like the +Windows Codepage 932, where the trailing bytes of double-byte +characters include all ASCII letters. If you compare two CP932 +strings using this function, you will get false matches.

+
++ + + + + + + + + + + + + + +

s1 :

string to compare with s2. +

s2 :

string to compare with s1. +

Returns :

0 if the strings match, a negative value if s1 < s2, + or a positive value if s1 > s2. +
+
+
+
+

g_ascii_strncasecmp ()

+
gint                g_ascii_strncasecmp                 (const gchar *s1,
+                                                         const gchar *s2,
+                                                         gsize n);
+

+Compare s1 and s2, ignoring the case of ASCII characters and any +characters after the first n in each string. +

+

+Unlike the BSD strcasecmp() function, this only recognizes standard +ASCII letters and ignores the locale, treating all non-ASCII +characters as if they are not letters. +

+

+The same warning as in g_ascii_strcasecmp() applies: Use this +function only on strings known to be in encodings where bytes +corresponding to ASCII letters always represent themselves.

+
++ + + + + + + + + + + + + + + + + + +

s1 :

string to compare with s2. +

s2 :

string to compare with s1. +

n :

number of characters to compare. +

Returns :

0 if the strings match, a negative value if s1 < s2, + or a positive value if s1 > s2. +
+
+
+
+

g_ascii_strup ()

+
gchar*              g_ascii_strup                       (const gchar *str,
+                                                         gssize len);
+

+Converts all lower case ASCII letters to upper case ASCII letters.

+
++ + + + + + + + + + + + + + +

str :

a string. +

len :

length of str in bytes, or -1 if str is nul-terminated. +

Returns :

a newly allocated string, with all the lower case + characters in str converted to upper case, with + semantics that exactly match g_ascii_toupper(). (Note + that this is unlike the old g_strup(), which modified + the string in place.) +
+
+
+
+

g_ascii_strdown ()

+
gchar*              g_ascii_strdown                     (const gchar *str,
+                                                         gssize len);
+

+Converts all upper case ASCII letters to lower case ASCII letters.

+
++ + + + + + + + + + + + + + +

str :

a string. +

len :

length of str in bytes, or -1 if str is nul-terminated. +

Returns :

a newly-allocated string, with all the upper case + characters in str converted to lower case, with + semantics that exactly match g_ascii_tolower(). (Note + that this is unlike the old g_strdown(), which modified + the string in place.) +
+
+
+
+

g_ascii_tolower ()

+
gchar               g_ascii_tolower                     (gchar c);
+

+Convert a character to ASCII lower case. +

+

+Unlike the standard C library tolower() function, this only +recognizes standard ASCII letters and ignores the locale, returning +all non-ASCII characters unchanged, even if they are lower case +letters in a particular character set. Also unlike the standard +library function, this takes and returns a char, not an int, so +don't call it on EOF but no need to worry about casting to guchar +before passing a possibly non-ASCII character in.

+
++ + + + + + + + + + +

c :

any character. +

Returns :

the result of converting c to lower case. + If c is not an ASCII upper case letter, + c is returned unchanged. +
+
+
+
+

g_ascii_toupper ()

+
gchar               g_ascii_toupper                     (gchar c);
+

+Convert a character to ASCII upper case. +

+

+Unlike the standard C library toupper() function, this only +recognizes standard ASCII letters and ignores the locale, returning +all non-ASCII characters unchanged, even if they are upper case +letters in a particular character set. Also unlike the standard +library function, this takes and returns a char, not an int, so +don't call it on EOF but no need to worry about casting to guchar +before passing a possibly non-ASCII character in.

+
++ + + + + + + + + + +

c :

any character. +

Returns :

the result of converting c to upper case. + If c is not an ASCII lower case letter, + c is returned unchanged. +
+
+
+
+

g_string_ascii_up ()

+
GString*            g_string_ascii_up                   (GString *string);
+

+Converts all lower case ASCII letters to upper case ASCII letters.

+
++ + + + + + + + + + +

string :

a GString +

Returns :

passed-in string pointer, with all the lower case + characters converted to upper case in place, with + semantics that exactly match g_ascii_toupper(). +
+
+
+
+

g_string_ascii_down ()

+
GString*            g_string_ascii_down                 (GString *string);
+

+Converts all upper case ASCII letters to lower case ASCII letters.

+
++ + + + + + + + + + +

string :

a GString +

Returns :

passed-in string pointer, with all the upper case + characters converted to lower case in place, with + semantics that exactly match g_ascii_tolower(). +
+
+
+
+

g_strup ()

+
gchar*              g_strup                             (gchar *string);
+
+

Warning

+

g_strup has been deprecated since version 2.2 and should not be used in newly-written code. This function is totally broken for the reasons discussed +in the g_strncasecmp() docs - use g_ascii_strup() or g_utf8_strup() instead.

+
+

+Converts a string to upper case.

+
++ + + + + + + + + + +

string :

the string to convert. +

Returns :

the string + +
+
+
+
+

g_strdown ()

+
gchar*              g_strdown                           (gchar *string);
+
+

Warning

+

g_strdown has been deprecated since version 2.2 and should not be used in newly-written code. This function is totally broken for the reasons discussed +in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown() +instead.

+
+

+Converts a string to lower case.

+
++ + + + + + + + + + +

string :

the string to convert. +

Returns :

the string + +
+
+
+
+

g_strcasecmp ()

+
gint                g_strcasecmp                        (const gchar *s1,
+                                                         const gchar *s2);
+
+

Warning

+

g_strcasecmp has been deprecated since version 2.2 and should not be used in newly-written code. See g_strncasecmp() for a discussion of why this function + is deprecated and how to replace it.

+
+

+A case-insensitive string comparison, corresponding to the standard +strcasecmp() function on platforms which support it.

+
++ + + + + + + + + + + + + + +

s1 :

a string. +

s2 :

a string to compare with s1. +

Returns :

0 if the strings match, a negative value if s1 < s2, + or a positive value if s1 > s2. + +
+
+
+
+

g_strncasecmp ()

+
gint                g_strncasecmp                       (const gchar *s1,
+                                                         const gchar *s2,
+                                                         guint n);
+
+

Warning

+

g_strncasecmp has been deprecated since version 2.2 and should not be used in newly-written code. The problem with g_strncasecmp() is that it does the +comparison by calling toupper()/tolower(). These functions are +locale-specific and operate on single bytes. However, it is impossible +to handle things correctly from an I18N standpoint by operating on +bytes, since characters may be multibyte. Thus g_strncasecmp() is +broken if your string is guaranteed to be ASCII, since it's +locale-sensitive, and it's broken if your string is localized, since +it doesn't work on many encodings at all, including UTF-8, EUC-JP, +etc. +

+

+There are therefore two replacement functions: g_ascii_strncasecmp(), +which only works on ASCII and is not locale-sensitive, and +g_utf8_casefold(), which is good for case-insensitive sorting of UTF-8.

+
+

+A case-insensitive string comparison, corresponding to the standard +strncasecmp() function on platforms which support it. +It is similar to g_strcasecmp() except it only compares the first n +characters of the strings.

+
++ + + + + + + + + + + + + + + + + + +

s1 :

a string. +

s2 :

a string to compare with s1. +

n :

the maximum number of characters to compare. +

Returns :

0 if the strings match, a negative value if s1 < s2, + or a positive value if s1 > s2. + +
+
+
+
+

g_strreverse ()

+
gchar*              g_strreverse                        (gchar *string);
+

+Reverses all of the bytes in a string. For example, +g_strreverse ("abcdef") will result +in "fedcba". +

+

+Note that g_strreverse() doesn't work on UTF-8 strings +containing multibyte characters. For that purpose, use +g_utf8_strreverse().

+
++ + + + + + + + + + +

string :

the string to reverse +

Returns :

the same pointer passed in as string +
+
+
+
+

g_ascii_strtoll ()

+
gint64              g_ascii_strtoll                     (const gchar *nptr,
+                                                         gchar **endptr,
+                                                         guint base);
+

+Converts a string to a gint64 value. +This function behaves like the standard strtoll() function +does in the C locale. It does this without actually +changing the current locale, since that would not be +thread-safe. +

+

+This function is typically used when reading configuration +files or other non-user input that should be locale independent. +To handle input from the user you should normally use the +locale-sensitive system strtoll() function. +

+

+If the correct value would cause overflow, G_MAXINT64 or G_MININT64 +is returned, and ERANGE is stored in errno. If the base is +outside the valid range, zero is returned, and EINVAL is stored +in errno. If the string conversion fails, zero is returned, and +endptr returns nptr (if endptr is non-NULL).

+
++ + + + + + + + + + + + + + + + + + +

nptr :

the string to convert to a numeric value. +

endptr :

if non-NULL, it returns the character after + the last character used in the conversion. +

base :

to be used for the conversion, 2..36 or 0 +

Returns :

the gint64 value or zero on error. + +
+

Since 2.12

+
+
+
+

g_ascii_strtoull ()

+
guint64             g_ascii_strtoull                    (const gchar *nptr,
+                                                         gchar **endptr,
+                                                         guint base);
+

+Converts a string to a guint64 value. +This function behaves like the standard strtoull() function +does in the C locale. It does this without actually +changing the current locale, since that would not be +thread-safe. +

+

+This function is typically used when reading configuration +files or other non-user input that should be locale independent. +To handle input from the user you should normally use the +locale-sensitive system strtoull() function. +

+

+If the correct value would cause overflow, G_MAXUINT64 +is returned, and ERANGE is stored in errno. If the base is +outside the valid range, zero is returned, and EINVAL is stored +in errno. If the string conversion fails, zero is returned, and +endptr returns nptr (if endptr is non-NULL).

+
++ + + + + + + + + + + + + + + + + + +

nptr :

the string to convert to a numeric value. +

endptr :

if non-NULL, it returns the character after + the last character used in the conversion. +

base :

to be used for the conversion, 2..36 or 0 +

Returns :

the guint64 value or zero on error. + +
+

Since 2.2

+
+
+
+

G_ASCII_DTOSTR_BUF_SIZE

+
#define G_ASCII_DTOSTR_BUF_SIZE (29 + 10)
+
+

+A good size for a buffer to be passed into g_ascii_dtostr(). +It is guaranteed to be enough for all output of that function on systems with + 64bit IEEE-compatible doubles. +

+

+The typical usage would be something like: +

+
+  char buf[G_ASCII_DTOSTR_BUF_SIZE];
+  fprintf (out, "value=%s\n", g_ascii_dtostr (buf, sizeof (buf), value));
+
+

+

+
+
+
+

g_ascii_strtod ()

+
gdouble             g_ascii_strtod                      (const gchar *nptr,
+                                                         gchar **endptr);
+

+Converts a string to a gdouble value. +

+

+This function behaves like the standard strtod() function +does in the C locale. It does this without actually changing +the current locale, since that would not be thread-safe. +A limitation of the implementation is that this function +will still accept localized versions of infinities and NANs. +

+

+This function is typically used when reading configuration +files or other non-user input that should be locale independent. +To handle input from the user you should normally use the +locale-sensitive system strtod() function. +

+

+To convert from a gdouble to a string in a locale-insensitive +way, use g_ascii_dtostr(). +

+

+If the correct value would cause overflow, plus or minus HUGE_VAL +is returned (according to the sign of the value), and ERANGE is +stored in errno. If the correct value would cause underflow, +zero is returned and ERANGE is stored in errno. +

+

+This function resets errno before calling strtod() so that +you can reliably detect overflow and underflow.

+
++ + + + + + + + + + + + + + +

nptr :

the string to convert to a numeric value. +

endptr :

if non-NULL, it returns the character after + the last character used in the conversion. +

Returns :

the gdouble value. +
+
+
+
+

g_ascii_dtostr ()

+
gchar *             g_ascii_dtostr                      (gchar *buffer,
+                                                         gint buf_len,
+                                                         gdouble d);
+

+Converts a gdouble to a string, using the '.' as +decimal point. +

+

+This functions generates enough precision that converting +the string back using g_ascii_strtod() gives the same machine-number +(on machines with IEEE compatible 64bit doubles). It is +guaranteed that the size of the resulting string will never +be larger than G_ASCII_DTOSTR_BUF_SIZE bytes.

+
++ + + + + + + + + + + + + + + + + + +

buffer :

A buffer to place the resulting string in +

buf_len :

The length of the buffer. +

d :

The gdouble to convert +

Returns :

The pointer to the buffer with the converted string. +
+
+
+
+

g_ascii_formatd ()

+
gchar *             g_ascii_formatd                     (gchar *buffer,
+                                                         gint buf_len,
+                                                         const gchar *format,
+                                                         gdouble d);
+

+Converts a gdouble to a string, using the '.' as +decimal point. To format the number you pass in +a printf()-style format string. Allowed conversion +specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'. +

+

+If you just want to want to serialize the value into a +string, use g_ascii_dtostr().

+
++ + + + + + + + + + + + + + + + + + + + + + +

buffer :

A buffer to place the resulting string in +

buf_len :

The length of the buffer. +

format :

The printf()-style format to use for the + code to use for converting. +

d :

The gdouble to convert +

Returns :

The pointer to the buffer with the converted string. +
+
+
+
+

g_strtod ()

+
gdouble             g_strtod                            (const gchar *nptr,
+                                                         gchar **endptr);
+

+Converts a string to a gdouble value. +It calls the standard strtod() function to handle the conversion, but +if the string is not completely converted it attempts the conversion +again with g_ascii_strtod(), and returns the best match. +

+

+This function should seldomly be used. The normal situation when reading +numbers not for human consumption is to use g_ascii_strtod(). Only when +you know that you must expect both locale formatted and C formatted numbers +should you use this. Make sure that you don't pass strings such as comma +separated lists of values, since the commas may be interpreted as a decimal +point in some locales, causing unexpected results.

+
++ + + + + + + + + + + + + + +

nptr :

the string to convert to a numeric value. +

endptr :

if non-NULL, it returns the character after + the last character used in the conversion. +

Returns :

the gdouble value. +
+
+
+
+

g_strchug ()

+
gchar*              g_strchug                           (gchar *string);
+

+Removes leading whitespace from a string, by moving the rest of the +characters forward. +

+

+This function doesn't allocate or reallocate any memory; it modifies string +in place. The pointer to string is returned to allow the nesting of functions. +

+

+Also see g_strchomp() and g_strstrip(). +

+
++ + + + + + + + + + +

string :

a string to remove the leading whitespace from. +

Returns :

+string. +
+
+
+
+

g_strchomp ()

+
gchar*              g_strchomp                          (gchar *string);
+

+Removes trailing whitespace from a string. +

+

+This function doesn't allocate or reallocate any memory; it modifies string in +place. The pointer to string is returned to allow the nesting of functions. +

+

+Also see g_strchug() and g_strstrip(). +

+
++ + + + + + + + + + +

string :

a string to remove the trailing whitespace from. +

Returns :

+string. +
+
+
+
+

g_strstrip()

+
#define             g_strstrip( string )
+

+Removes leading and trailing whitespace from a string. See g_strchomp() and +g_strchug(). +

+
++ + + + +

string :

a string to remove the leading and trailing whitespace from. +
+
+
+
+

g_strdelimit ()

+
gchar*              g_strdelimit                        (gchar *string,
+                                                         const gchar *delimiters,
+                                                         gchar new_delimiter);
+

+Converts any delimiter characters in string to new_delimiter. +Any characters in string which are found in delimiters are changed +to the new_delimiter character. Modifies string in place, and returns +string itself, not a copy. The return value is to allow nesting such as +g_ascii_strup (g_strdelimit (str, "abc", '?')). +

+
++ + + + + + + + + + + + + + + + + + +

string :

the string to convert. +

delimiters :

a string containing the current delimiters, or NULL to use the +standard delimiters defined in G_STR_DELIMITERS. +

new_delimiter :

the new delimiter character. +

Returns :

+string. +
+
+
+
+

G_STR_DELIMITERS

+
#define	 G_STR_DELIMITERS "_-|> <."
+
+

+The standard delimiters, used in g_strdelimit(). +

+
+
+
+

g_strescape ()

+
gchar*              g_strescape                         (const gchar *source,
+                                                         const gchar *exceptions);
+

+Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\' and +'"' in the string source by inserting a '\' before +them. Additionally all characters in the range 0x01-0x1F (everything +below SPACE) and in the range 0x7F-0xFF (all non-ASCII chars) are +replaced with a '\' followed by their octal representation. Characters +supplied in exceptions are not escaped. +

+

+g_strcompress() does the reverse conversion. +

+
++ + + + + + + + + + + + + + +

source :

a string to escape. +

exceptions :

a string of characters not to escape in source. +

Returns :

a newly-allocated copy of source with certain +characters escaped. See above. +
+
+
+
+

g_strcompress ()

+
gchar*              g_strcompress                       (const gchar *source);
+

+Replaces all escaped characters with their one byte equivalent. It +does the reverse conversion of g_strescape(). +

+
++ + + + + + + + + + +

source :

a string to compress. +

Returns :

a newly-allocated copy of source with all escaped +character compressed. +
+
+
+
+

g_strcanon ()

+
gchar*              g_strcanon                          (gchar *string,
+                                                         const gchar *valid_chars,
+                                                         gchar substitutor);
+

+For each character in string, if the character is not in valid_chars, +replaces the character with substitutor. Modifies string in place, +and return string itself, not a copy. The return value is to allow +nesting such as g_ascii_strup (g_strcanon (str, "abc", '?')). +

+
++ + + + + + + + + + + + + + + + + + +

string :

a nul-terminated array of bytes. +

valid_chars :

bytes permitted in string. +

substitutor :

replacement character for disallowed bytes. +

Returns :

+string. +
+
+
+
+

g_strsplit ()

+
gchar**             g_strsplit                          (const gchar *string,
+                                                         const gchar *delimiter,
+                                                         gint max_tokens);
+

+Splits a string into a maximum of max_tokens pieces, using the given +delimiter. If max_tokens is reached, the remainder of string is appended +to the last token. +

+

+As a special case, the result of splitting the empty string "" is an empty +vector, not a vector containing a single string. The reason for this +special case is that being able to represent a empty vector is typically +more useful than consistent handling of empty elements. If you do need +to represent empty elements, you'll need to check for the empty string +before calling g_strsplit().

+
++ + + + + + + + + + + + + + + + + + +

string :

a string to split. +

delimiter :

a string which specifies the places at which to split the string. + The delimiter is not included in any of the resulting strings, unless + max_tokens is reached. +

max_tokens :

the maximum number of pieces to split string into. If this is + less than 1, the string is split completely. +

Returns :

a newly-allocated NULL-terminated array of strings. Use + g_strfreev() to free it. +
+
+
+
+

g_strsplit_set ()

+
gchar **            g_strsplit_set                      (const gchar *string,
+                                                         const gchar *delimiters,
+                                                         gint max_tokens);
+

+Splits string into a number of tokens not containing any of the characters +in delimiter. A token is the (possibly empty) longest string that does not +contain any of the characters in delimiters. If max_tokens is reached, the +remainder is appended to the last token. +

+

+For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a +NULL-terminated vector containing the three strings "abc", "def", +and "ghi". +

+

+The result if g_strsplit_set (":def/ghi:", ":/", -1) is a NULL-terminated +vector containing the four strings "", "def", "ghi", and "". +

+

+As a special case, the result of splitting the empty string "" is an empty +vector, not a vector containing a single string. The reason for this +special case is that being able to represent a empty vector is typically +more useful than consistent handling of empty elements. If you do need +to represent empty elements, you'll need to check for the empty string +before calling g_strsplit_set(). +

+

+Note that this function works on bytes not characters, so it can't be used +to delimit UTF-8 strings for anything but ASCII characters.

+
++ + + + + + + + + + + + + + + + + + +

string :

The string to be tokenized +

delimiters :

A nul-terminated string containing bytes that are used + to split the string. +

max_tokens :

The maximum number of tokens to split string into. + If this is less than 1, the string is split completely +

Returns :

a newly-allocated NULL-terminated array of strings. Use + g_strfreev() to free it. + +
+

Since 2.4

+
+
+
+

g_strfreev ()

+
void                g_strfreev                          (gchar **str_array);
+

+Frees a NULL-terminated array of strings, and the array itself. +If called on a NULL value, g_strfreev() simply returns.

+
++ + + + +

str_array :

a NULL-terminated array of strings to free. +
+
+
+
+

g_strconcat ()

+
gchar*              g_strconcat                         (const gchar *string1,
+                                                         ...);
+

+Concatenates all of the given strings into one long string. +The returned string should be freed with g_free() when no longer needed. +

+

+

+
+

Warning

+

The variable argument list must end +with NULL. If you forget the NULL, g_strconcat() will start appending +random memory junk to your string.

+
+
++ + + + + + + + + + + + + + +

string1 :

the first string to add, which must not be NULL +

... :

a NULL-terminated list of strings to append to the string +

Returns :

a newly-allocated string containing all the string arguments +
+
+
+
+

g_strjoin ()

+
gchar*              g_strjoin                           (const gchar *separator,
+                                                         ...);
+

+Joins a number of strings together to form one long string, with the +optional separator inserted between each of them. The returned string +should be freed with g_free().

+
++ + + + + + + + + + + + + + +

separator :

a string to insert between each of the strings, or NULL +

... :

a NULL-terminated list of strings to join +

Returns :

a newly-allocated string containing all of the strings joined + together, with separator between them +
+
+
+
+

g_strjoinv ()

+
gchar*              g_strjoinv                          (const gchar *separator,
+                                                         gchar **str_array);
+

+Joins a number of strings together to form one long string, with the +optional separator inserted between each of them. The returned string +should be freed with g_free().

+
++ + + + + + + + + + + + + + +

separator :

a string to insert between each of the strings, or NULL +

str_array :

a NULL-terminated array of strings to join +

Returns :

a newly-allocated string containing all of the strings joined + together, with separator between them +
+
+
+
+

g_strv_length ()

+
guint               g_strv_length                       (gchar **str_array);
+

+Returns the length of the given NULL-terminated +string array str_array.

+
++ + + + + + + + + + +

str_array :

a NULL-terminated array of strings. +

Returns :

length of str_array. + +
+

Since 2.6

+
+
+
+

g_strerror ()

+
const gchar*        g_strerror                          (gint errnum);
+

+Returns a string corresponding to the given error code, e.g. +"no such process". You should use this function in preference to +strerror(), because it returns a string in UTF-8 encoding, and since +not all platforms support the strerror() function.

+
++ + + + + + + + + + +

errnum :

the system error number. See the standard C errno + documentation +

Returns :

a UTF-8 string describing the error code. If the error code + is unknown, it returns "unknown error (<code>)". The string + can only be used until the next call to g_strerror() +
+
+
+
+

g_strsignal ()

+
const gchar*        g_strsignal                         (gint signum);
+

+Returns a string describing the given signal, e.g. "Segmentation fault". +You should use this function in preference to strsignal(), because it +returns a string in UTF-8 encoding, and since not all platforms support +the strsignal() function.

+
++ + + + + + + + + + +

signum :

the signal number. See the signal + documentation +

Returns :

a UTF-8 string describing the signal. If the signal is unknown, + it returns "unknown signal (<signum>)". The string can only be + used until the next call to g_strsignal() +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Strings.html b/docs/reference/glib/html/glib-Strings.html new file mode 100644 index 0000000..05a20c9 --- /dev/null +++ b/docs/reference/glib/html/glib-Strings.html @@ -0,0 +1,1277 @@ + + + + +Strings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Strings

+

Strings — text buffers which grow automatically as text is added

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GString;
+GString*            g_string_new                        (const gchar *init);
+GString*            g_string_new_len                    (const gchar *init,
+                                                         gssize len);
+GString*            g_string_sized_new                  (gsize dfl_size);
+GString*            g_string_assign                     (GString *string,
+                                                         const gchar *rval);
+#define             g_string_sprintf
+#define             g_string_sprintfa
+void                g_string_vprintf                    (GString *string,
+                                                         const gchar *format,
+                                                         va_list args);
+void                g_string_append_vprintf             (GString *string,
+                                                         const gchar *format,
+                                                         va_list args);
+void                g_string_printf                     (GString *string,
+                                                         const gchar *format,
+                                                         ...);
+void                g_string_append_printf              (GString *string,
+                                                         const gchar *format,
+                                                         ...);
+GString*            g_string_append                     (GString *string,
+                                                         const gchar *val);
+GString*            g_string_append_c                   (GString *string,
+                                                         gchar c);
+GString*            g_string_append_unichar             (GString *string,
+                                                         gunichar wc);
+GString*            g_string_append_len                 (GString *string,
+                                                         const gchar *val,
+                                                         gssize len);
+GString *           g_string_append_uri_escaped         (GString *string,
+                                                         const char *unescaped,
+                                                         const char *reserved_chars_allowed,
+                                                         gboolean allow_utf8);
+GString*            g_string_prepend                    (GString *string,
+                                                         const gchar *val);
+GString*            g_string_prepend_c                  (GString *string,
+                                                         gchar c);
+GString*            g_string_prepend_unichar            (GString *string,
+                                                         gunichar wc);
+GString*            g_string_prepend_len                (GString *string,
+                                                         const gchar *val,
+                                                         gssize len);
+GString*            g_string_insert                     (GString *string,
+                                                         gssize pos,
+                                                         const gchar *val);
+GString*            g_string_insert_c                   (GString *string,
+                                                         gssize pos,
+                                                         gchar c);
+GString*            g_string_insert_unichar             (GString *string,
+                                                         gssize pos,
+                                                         gunichar wc);
+GString*            g_string_insert_len                 (GString *string,
+                                                         gssize pos,
+                                                         const gchar *val,
+                                                         gssize len);
+GString*            g_string_overwrite                  (GString *string,
+                                                         gsize pos,
+                                                         const gchar *val);
+GString*            g_string_overwrite_len              (GString *string,
+                                                         gsize pos,
+                                                         const gchar *val,
+                                                         gssize len);
+GString*            g_string_erase                      (GString *string,
+                                                         gssize pos,
+                                                         gssize len);
+GString*            g_string_truncate                   (GString *string,
+                                                         gsize len);
+GString*            g_string_set_size                   (GString *string,
+                                                         gsize len);
+gchar*              g_string_free                       (GString *string,
+                                                         gboolean free_segment);
+
+GString*            g_string_up                         (GString *string);
+GString*            g_string_down                       (GString *string);
+
+guint               g_string_hash                       (const GString *str);
+gboolean            g_string_equal                      (const GString *v,
+                                                         const GString *v2);
+
+
+
+

Description

+

+A GString is similar to a standard C string, except that it grows +automatically as text is appended or inserted. Also, it stores the +length of the string, so can be used for binary data with embedded +nul bytes. +

+
+
+

Details

+
+

GString

+
typedef struct {
+  gchar  *str;
+  gsize len;    
+  gsize allocated_len;
+} GString;
+
+

+The GString struct contains the public fields of a GString. +

+
++ + + + + + + + + + + + + + +

gchar *str;

points to the character data. It may move as text is added. + The str field is nul-terminated and so + can be used as an ordinary C string. +

gsize len;

contains the length of the string, not including the + terminating nul byte. +

gsize allocated_len;

the number of bytes that can be stored in the + string before it needs to be reallocated. May be larger than len. +
+
+
+
+

g_string_new ()

+
GString*            g_string_new                        (const gchar *init);
+

+Creates a new GString, initialized with the given string.

+
++ + + + + + + + + + +

init :

the initial text to copy into the string +

Returns :

the new GString +
+
+
+
+

g_string_new_len ()

+
GString*            g_string_new_len                    (const gchar *init,
+                                                         gssize len);
+

+Creates a new GString with len bytes of the init buffer. +Because a length is provided, init need not be nul-terminated, +and can contain embedded nul bytes. +

+

+Since this function does not stop at nul bytes, it is the caller's +responsibility to ensure that init has at least len addressable +bytes.

+
++ + + + + + + + + + + + + + +

init :

initial contents of the string +

len :

length of init to use +

Returns :

a new GString +
+
+
+
+

g_string_sized_new ()

+
GString*            g_string_sized_new                  (gsize dfl_size);
+

+Creates a new GString, with enough space for dfl_size +bytes. This is useful if you are going to add a lot of +text to the string and don't want it to be reallocated +too often.

+
++ + + + + + + + + + +

dfl_size :

the default size of the space allocated to + hold the string +

Returns :

the new GString +
+
+
+
+

g_string_assign ()

+
GString*            g_string_assign                     (GString *string,
+                                                         const gchar *rval);
+

+Copies the bytes from a string into a GString, +destroying any previous contents. It is rather like +the standard strcpy() function, except that you do not +have to worry about having enough space to copy the string.

+
++ + + + + + + + + + + + + + +

string :

the destination GString. Its current contents + are destroyed. +

rval :

the string to copy into string +

Returns :

string +
+
+
+
+

g_string_sprintf

+
#define             g_string_sprintf
+
+

Warning

+

g_string_sprintf is deprecated and should not be used in newly-written code. This function has been renamed to g_string_printf().

+
+

+Writes a formatted string into a GString. +This is similar to the standard sprintf() function, +except that the GString buffer automatically expands +to contain the results. The previous contents of the +GString are destroyed.

+
++ + + + + + + + + + + + + + +

string :

a GString +

format :

the string format. See the sprintf() documentation +

... :

the parameters to insert into the format string +
+
+
+
+

g_string_sprintfa

+
#define             g_string_sprintfa
+
+

Warning

+

g_string_sprintfa is deprecated and should not be used in newly-written code. This function has been renamed to g_string_append_printf()

+
+

+Appends a formatted string onto the end of a GString. +This function is similar to g_string_sprintf() except that +the text is appended to the GString.

+
++ + + + + + + + + + + + + + +

string :

a GString +

format :

the string format. See the sprintf() documentation +

... :

the parameters to insert into the format string +
+
+
+
+

g_string_vprintf ()

+
void                g_string_vprintf                    (GString *string,
+                                                         const gchar *format,
+                                                         va_list args);
+

+Writes a formatted string into a GString. +This function is similar to g_string_printf() except that +the arguments to the format string are passed as a va_list.

+
++ + + + + + + + + + + + + + +

string :

a GString +

format :

the string format. See the printf() documentation +

args :

the parameters to insert into the format string +
+

Since 2.14

+
+
+
+

g_string_append_vprintf ()

+
void                g_string_append_vprintf             (GString *string,
+                                                         const gchar *format,
+                                                         va_list args);
+

+Appends a formatted string onto the end of a GString. +This function is similar to g_string_append_printf() +except that the arguments to the format string are passed +as a va_list.

+
++ + + + + + + + + + + + + + +

string :

a GString +

format :

the string format. See the printf() documentation +

args :

the list of arguments to insert in the output +
+

Since 2.14

+
+
+
+

g_string_printf ()

+
void                g_string_printf                     (GString *string,
+                                                         const gchar *format,
+                                                         ...);
+

+Writes a formatted string into a GString. +This is similar to the standard sprintf() function, +except that the GString buffer automatically expands +to contain the results. The previous contents of the +GString are destroyed.

+
++ + + + + + + + + + + + + + +

string :

a GString +

format :

the string format. See the printf() documentation +

... :

the parameters to insert into the format string +
+
+
+
+

g_string_append_printf ()

+
void                g_string_append_printf              (GString *string,
+                                                         const gchar *format,
+                                                         ...);
+

+Appends a formatted string onto the end of a GString. +This function is similar to g_string_printf() except +that the text is appended to the GString.

+
++ + + + + + + + + + + + + + +

string :

a GString +

format :

the string format. See the printf() documentation +

... :

the parameters to insert into the format string +
+
+
+
+

g_string_append ()

+
GString*            g_string_append                     (GString *string,
+                                                         const gchar *val);
+

+Adds a string onto the end of a GString, expanding +it if necessary.

+
++ + + + + + + + + + + + + + +

string :

a GString +

val :

the string to append onto the end of string +

Returns :

string +
+
+
+
+

g_string_append_c ()

+
GString*            g_string_append_c                   (GString *string,
+                                                         gchar c);
+

+Adds a byte onto the end of a GString, expanding +it if necessary.

+
++ + + + + + + + + + + + + + +

string :

a GString +

c :

the byte to append onto the end of string +

Returns :

string +
+
+
+
+

g_string_append_unichar ()

+
GString*            g_string_append_unichar             (GString *string,
+                                                         gunichar wc);
+

+Converts a Unicode character into UTF-8, and appends it +to the string.

+
++ + + + + + + + + + + + + + +

string :

a GString +

wc :

a Unicode character +

Returns :

string +
+
+
+
+

g_string_append_len ()

+
GString*            g_string_append_len                 (GString *string,
+                                                         const gchar *val,
+                                                         gssize len);
+

+Appends len bytes of val to string. Because len is +provided, val may contain embedded nuls and need not +be nul-terminated. +

+

+Since this function does not stop at nul bytes, it is +the caller's responsibility to ensure that val has at +least len addressable bytes.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

val :

bytes to append +

len :

number of bytes of val to use +

Returns :

string +
+
+
+
+

g_string_append_uri_escaped ()

+
GString *           g_string_append_uri_escaped         (GString *string,
+                                                         const char *unescaped,
+                                                         const char *reserved_chars_allowed,
+                                                         gboolean allow_utf8);
+

+Appends unescaped to string, escaped any characters that +are reserved in URIs using URI-style escape sequences.

+
++ + + + + + + + + + + + + + + + + + + + + + +

string :

a GString +

unescaped :

a string +

reserved_chars_allowed :

a string of reserved characters allowed to be used +

allow_utf8 :

set TRUE if the escaped string may include UTF8 characters +

Returns :

string + +
+

Since 2.16

+
+
+
+

g_string_prepend ()

+
GString*            g_string_prepend                    (GString *string,
+                                                         const gchar *val);
+

+Adds a string on to the start of a GString, +expanding it if necessary.

+
++ + + + + + + + + + + + + + +

string :

a GString +

val :

the string to prepend on the start of string +

Returns :

string +
+
+
+
+

g_string_prepend_c ()

+
GString*            g_string_prepend_c                  (GString *string,
+                                                         gchar c);
+

+Adds a byte onto the start of a GString, +expanding it if necessary.

+
++ + + + + + + + + + + + + + +

string :

a GString +

c :

the byte to prepend on the start of the GString +

Returns :

string +
+
+
+
+

g_string_prepend_unichar ()

+
GString*            g_string_prepend_unichar            (GString *string,
+                                                         gunichar wc);
+

+Converts a Unicode character into UTF-8, and prepends it +to the string.

+
++ + + + + + + + + + + + + + +

string :

a GString +

wc :

a Unicode character +

Returns :

string +
+
+
+
+

g_string_prepend_len ()

+
GString*            g_string_prepend_len                (GString *string,
+                                                         const gchar *val,
+                                                         gssize len);
+

+Prepends len bytes of val to string. +Because len is provided, val may contain +embedded nuls and need not be nul-terminated. +

+

+Since this function does not stop at nul bytes, +it is the caller's responsibility to ensure that +val has at least len addressable bytes.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

val :

bytes to prepend +

len :

number of bytes in val to prepend +

Returns :

string +
+
+
+
+

g_string_insert ()

+
GString*            g_string_insert                     (GString *string,
+                                                         gssize pos,
+                                                         const gchar *val);
+

+Inserts a copy of a string into a GString, +expanding it if necessary.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

the position to insert the copy of the string +

val :

the string to insert +

Returns :

string +
+
+
+
+

g_string_insert_c ()

+
GString*            g_string_insert_c                   (GString *string,
+                                                         gssize pos,
+                                                         gchar c);
+

+Inserts a byte into a GString, expanding it if necessary.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

the position to insert the byte +

c :

the byte to insert +

Returns :

string +
+
+
+
+

g_string_insert_unichar ()

+
GString*            g_string_insert_unichar             (GString *string,
+                                                         gssize pos,
+                                                         gunichar wc);
+

+Converts a Unicode character into UTF-8, and insert it +into the string at the given position.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

the position at which to insert character, or -1 to + append at the end of the string +

wc :

a Unicode character +

Returns :

string +
+
+
+
+

g_string_insert_len ()

+
GString*            g_string_insert_len                 (GString *string,
+                                                         gssize pos,
+                                                         const gchar *val,
+                                                         gssize len);
+

+Inserts len bytes of val into string at pos. +Because len is provided, val may contain embedded +nuls and need not be nul-terminated. If pos is -1, +bytes are inserted at the end of the string. +

+

+Since this function does not stop at nul bytes, it is +the caller's responsibility to ensure that val has at +least len addressable bytes.

+
++ + + + + + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

position in string where insertion should + happen, or -1 for at the end +

val :

bytes to insert +

len :

number of bytes of val to insert +

Returns :

string +
+
+
+
+

g_string_overwrite ()

+
GString*            g_string_overwrite                  (GString *string,
+                                                         gsize pos,
+                                                         const gchar *val);
+

+Overwrites part of a string, lengthening it if necessary.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

the position at which to start overwriting +

val :

the string that will overwrite the string starting at pos +

Returns :

string + +
+

Since 2.14

+
+
+
+

g_string_overwrite_len ()

+
GString*            g_string_overwrite_len              (GString *string,
+                                                         gsize pos,
+                                                         const gchar *val,
+                                                         gssize len);
+

+Overwrites part of a string, lengthening it if necessary. +This function will work with embedded nuls.

+
++ + + + + + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

the position at which to start overwriting +

val :

the string that will overwrite the string starting at pos +

len :

the number of bytes to write from val +

Returns :

string + +
+

Since 2.14

+
+
+
+

g_string_erase ()

+
GString*            g_string_erase                      (GString *string,
+                                                         gssize pos,
+                                                         gssize len);
+

+Removes len bytes from a GString, starting at position pos. +The rest of the GString is shifted down to fill the gap.

+
++ + + + + + + + + + + + + + + + + + +

string :

a GString +

pos :

the position of the content to remove +

len :

the number of bytes to remove, or -1 to remove all + following bytes +

Returns :

string +
+
+
+
+

g_string_truncate ()

+
GString*            g_string_truncate                   (GString *string,
+                                                         gsize len);
+

+Cuts off the end of the GString, leaving the first len bytes.

+
++ + + + + + + + + + + + + + +

string :

a GString +

len :

the new size of string +

Returns :

string +
+
+
+
+

g_string_set_size ()

+
GString*            g_string_set_size                   (GString *string,
+                                                         gsize len);
+

+Sets the length of a GString. If the length is less than +the current length, the string will be truncated. If the +length is greater than the current length, the contents +of the newly added area are undefined. (However, as +always, string->str[string->len] will be a nul byte.)

+
++ + + + + + + + + + + + + + +

string :

a GString +

len :

the new length +

Returns :

string +
+
+
+
+

g_string_free ()

+
gchar*              g_string_free                       (GString *string,
+                                                         gboolean free_segment);
+

+Frees the memory allocated for the GString. +If free_segment is TRUE it also frees the character data.

+
++ + + + + + + + + + + + + + +

string :

a GString +

free_segment :

if TRUE the actual character data is freed as well +

Returns :

the character data of string + (i.e. NULL if free_segment is TRUE) +
+
+
+
+

g_string_up ()

+
GString*            g_string_up                         (GString *string);
+
+

Warning

+

g_string_up has been deprecated since version 2.2 and should not be used in newly-written code. This function uses the locale-specific + toupper() function, which is almost never the right thing. + Use g_string_ascii_up() or g_utf8_strup() instead.

+
+

+Converts a GString to uppercase.

+
++ + + + + + + + + + +

string :

a GString +

Returns :

string + +
+
+
+
+

g_string_down ()

+
GString*            g_string_down                       (GString *string);
+
+

Warning

+

g_string_down has been deprecated since version 2.2 and should not be used in newly-written code. This function uses the locale-specific + tolower() function, which is almost never the right thing. + Use g_string_ascii_down() or g_utf8_strdown() instead.

+
+

+Converts a GString to lowercase.

+
++ + + + + + + + + + +

string :

a GString +

Returns :

the GString. + +
+
+
+
+

g_string_hash ()

+
guint               g_string_hash                       (const GString *str);
+

+Creates a hash code for str; for use with GHashTable.

+
++ + + + + + + + + + +

str :

a string to hash +

Returns :

hash code for str +
+
+
+
+

g_string_equal ()

+
gboolean            g_string_equal                      (const GString *v,
+                                                         const GString *v2);
+

+Compares two strings for equality, returning TRUE if they are equal. +For use with GHashTable.

+
++ + + + + + + + + + + + + + +

v :

a GString +

v2 :

another GString +

Returns :

TRUE if they strings are the same length and contain the + same bytes +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Testing.html b/docs/reference/glib/html/glib-Testing.html new file mode 100644 index 0000000..ad5530a --- /dev/null +++ b/docs/reference/glib/html/glib-Testing.html @@ -0,0 +1,1677 @@ + + + + +Testing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Testing

+

Testing — a test framework

+
+
+

Synopsis

+
+#include <glib.h>
+
+void                g_test_minimized_result             (double minimized_quantity,
+                                                         const char *format,
+                                                         ...);
+void                g_test_maximized_result             (double maximized_quantity,
+                                                         const char *format,
+                                                         ...);
+void                g_test_init                         (int *argc,
+                                                         char ***argv,
+                                                         ...);
+#define             g_test_quick                        ()
+#define             g_test_slow                         ()
+#define             g_test_thorough                     ()
+#define             g_test_perf                         ()
+#define             g_test_verbose                      ()
+#define             g_test_quiet                        ()
+int                 g_test_run                          (void);
+void                g_test_add_func                     (const char *testpath,
+                                                         void (test_funcvoid) ());
+void                g_test_add_data_func                (const char *testpath,
+                                                         gconstpointer test_data,
+                                                         void (test_funcgconstpointer) ());
+#define             g_test_add                          (testpath, Fixture, tdata, fsetup, ftest, fteardown)
+void                g_test_message                      (const char *format,
+                                                         ...);
+void                g_test_bug_base                     (const char *uri_pattern);
+void                g_test_bug                          (const char *bug_uri_snippet);
+gboolean            (*GTestLogFatalFunc)                (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *message,
+                                                         gpointer user_data);
+void                g_test_log_set_fatal_handler        (GTestLogFatalFunc log_func,
+                                                         gpointer user_data);
+void                g_test_timer_start                  (void);
+double              g_test_timer_elapsed                (void);
+double              g_test_timer_last                   (void);
+void                g_test_queue_free                   (gpointer gfree_pointer);
+void                g_test_queue_destroy                (GDestroyNotify destroy_func,
+                                                         gpointer destroy_data);
+#define             g_test_queue_unref                  (gobject)
+enum                GTestTrapFlags;
+gboolean            g_test_trap_fork                    (guint64 usec_timeout,
+                                                         GTestTrapFlags test_trap_flags);
+gboolean            g_test_trap_has_passed              (void);
+gboolean            g_test_trap_reached_timeout         (void);
+#define             g_test_trap_assert_passed           ()
+#define             g_test_trap_assert_failed           ()
+#define             g_test_trap_assert_stdout           (soutpattern)
+#define             g_test_trap_assert_stdout_unmatched (soutpattern)
+#define             g_test_trap_assert_stderr           (serrpattern)
+#define             g_test_trap_assert_stderr_unmatched (serrpattern)
+#define             g_test_rand_bit                     ()
+gint32              g_test_rand_int                     (void);
+gint32              g_test_rand_int_range               (gint32 begin,
+                                                         gint32 end);
+double              g_test_rand_double                  (void);
+double              g_test_rand_double_range            (double range_start,
+                                                         double range_end);
+#define             g_assert                            (expr)
+#define             g_assert_not_reached                ()
+#define             g_assert_cmpstr                     (s1, cmp, s2)
+#define             g_assert_cmpint                     (n1, cmp, n2)
+#define             g_assert_cmpuint                    (n1, cmp, n2)
+#define             g_assert_cmphex                     (n1, cmp, n2)
+#define             g_assert_cmpfloat                   (n1,cmp,n2)
+#define             g_assert_no_error                   (err)
+#define             g_assert_error                      (err, dom, c)
+typedef             GTestCase;
+typedef             GTestSuite;
+GTestCase*          g_test_create_case                  (const char *test_name,
+                                                         gsize data_size,
+                                                         gconstpointer test_data,
+                                                         void (data_setupvoid) (),
+                                                         void (data_testvoid) (),
+                                                         void (data_teardownvoid) ());
+GTestSuite*         g_test_create_suite                 (const char *suite_name);
+GTestSuite*         g_test_get_root                     (void);
+void                g_test_suite_add                    (GTestSuite *suite,
+                                                         GTestCase *test_case);
+void                g_test_suite_add_suite              (GTestSuite *suite,
+                                                         GTestSuite *nestedsuite);
+int                 g_test_run_suite                    (GTestSuite *suite);
+
+
+
+

Description

+

+GLib provides a framework for writing and maintaining unit tests +in parallel to the code they are testing. The API is designed according +to established concepts found in the other test frameworks (JUnit, NUnit, +RUnit), which in turn is based on smalltalk unit testing concepts. +

+
++ + + + + + + + + + + + + + +

Test case

+ Tests (test methods) are grouped together with their + fixture into test cases. +

Fixture

+ A test fixture consists of fixture data and setup and teardown methods + to establish the environment for the test functions. We use fresh + fixtures, i.e. fixtures are newly set up and torn down around each test + invocation to avoid dependencies between tests. +

Test suite

+ Test cases can be grouped into test suites, to allow subsets of the + available tests to be run. Test suites can be grouped into other test + suites as well. +

+

+The API is designed to handle creation and registration of test suites and +test cases implicitly. A simple call like +

+
+  g_test_add_func ("/misc/assertions", test_assertions);
+
+

+creates a test suite called "misc" with a single test case named "assertions", +which consists of running the test_assertions function. +

+

+In addition to the traditional g_assert(), the test framework provides +an extended set of assertions for string and numerical comparisons: +g_assert_cmpfloat(), g_assert_cmpint(), g_assert_cmpuint(), g_assert_cmphex(), +g_assert_cmpstr(). The advantage of these variants over plain g_assert() +is that the assertion messages can be more elaborate, and include the +values of the compared entities. +

+

+GLib ships with two utilities called gtester and gtester-report to +facilitate running tests and producing nicely formatted test reports. +

+
+
+

Details

+
+

g_test_minimized_result ()

+
void                g_test_minimized_result             (double minimized_quantity,
+                                                         const char *format,
+                                                         ...);
+

+Report the result of a performance or measurement test. +The test should generally strive to minimize the reported +quantities (smaller values are better than larger ones), +this and minimized_quantity can determine sorting +order for test result reports.

+
++ + + + + + + + + + + + + + +

minimized_quantity :

the reported value +

format :

the format string of the report message +

... :

arguments to pass to the printf() function +
+

Since 2.16

+
+
+
+

g_test_maximized_result ()

+
void                g_test_maximized_result             (double maximized_quantity,
+                                                         const char *format,
+                                                         ...);
+

+Report the result of a performance or measurement test. +The test should generally strive to maximize the reported +quantities (larger values are better than smaller ones), +this and maximized_quantity can determine sorting +order for test result reports.

+
++ + + + + + + + + + + + + + +

maximized_quantity :

the reported value +

format :

the format string of the report message +

... :

arguments to pass to the printf() function +
+

Since 2.16

+
+
+
+

g_test_init ()

+
void                g_test_init                         (int *argc,
+                                                         char ***argv,
+                                                         ...);
+

+Initialize the GLib testing framework, e.g. by seeding the +test random number generator, the name for g_get_prgname() +and parsing test related command line args. +So far, the following arguments are understood: +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

-l

+ list test cases available in a test executable. +

--seed=RANDOMSEED

+ provide a random seed to reproduce test runs using random numbers. +

--verbose

run tests verbosely.

-q, --quiet

run tests quietly.

-p TESTPATH

+ execute all tests matching TESTPATH. +

-m {perf|slow|thorough|quick}

+

+ execute tests according to these test modes: +

+
++ + + + + + + + + + + + + + +

perf

+ performance tests, may take long and report results. +

slow, thorough

+ slow and thorough tests, may take quite long and + maximize coverage. +

quick

+ quick tests, should run really quickly and give good coverage. +

+

+

+

--debug-log

debug test logging output.

-k, --keep-going

gtester-specific argument.

--GTestLogFD N

gtester-specific argument.

--GTestSkipCount N

gtester-specific argument.

+
++ + + + + + + + + + + + + + +

argc :

Address of the argc parameter of the main() function. + Changed if any arguments were handled. +

argv :

Address of the argv parameter of main(). + Any parameters understood by g_test_init() stripped before return. +

... :

Reserved for future extension. Currently, you must pass NULL. +
+

Since 2.16

+
+
+
+

g_test_quick()

+
#define             g_test_quick()
+

+Returns TRUE if tests are run in quick mode. +

+
+
+
+

g_test_slow()

+
#define             g_test_slow()
+

+Returns TRUE if tests are run in slow mode. +

+
+
+
+

g_test_thorough()

+
#define             g_test_thorough()
+

+Returns TRUE if tests are run in thorough mode. +

+
+
+
+

g_test_perf()

+
#define             g_test_perf()
+

+Returns TRUE if tests are run in performance mode. +

+
+
+
+

g_test_verbose()

+
#define             g_test_verbose()
+

+Returns TRUE if tests are run in verbose mode. +

+
+
+
+

g_test_quiet()

+
#define             g_test_quiet()
+

+Returns TRUE if tests are run in quiet mode. +

+
+
+
+

g_test_run ()

+
int                 g_test_run                          (void);
+

+Runs all tests under the toplevel suite which can be retrieved +with g_test_get_root(). Similar to g_test_run_suite(), the test +cases to be run are filtered according to +test path arguments (-p testpath) as +parsed by g_test_init(). +g_test_run_suite() or g_test_run() may only be called once +in a program.

+
++ + + + +

Returns :

0 on success + +
+

Since 2.16

+
+
+
+

g_test_add_func ()

+
void                g_test_add_func                     (const char *testpath,
+                                                         void (test_funcvoid) ());
+

+Create a new test case, similar to g_test_create_case(). However +the test is assumed to use no fixture, and test suites are automatically +created on the fly and added to the root fixture, based on the +slash-separated portions of testpath.

+
++ + + + + + + + + + +

testpath :

Slash-separated test case path name for the test. +

test_func :

The test function to invoke for this test. +
+

Since 2.16

+
+
+
+

g_test_add_data_func ()

+
void                g_test_add_data_func                (const char *testpath,
+                                                         gconstpointer test_data,
+                                                         void (test_funcgconstpointer) ());
+

+Create a new test case, similar to g_test_create_case(). However +the test is assumed to use no fixture, and test suites are automatically +created on the fly and added to the root fixture, based on the +slash-separated portions of testpath. The test_data argument +will be passed as first argument to test_func.

+
++ + + + + + + + + + + + + + +

testpath :

Slash-separated test case path name for the test. +

test_data :

Test data argument for the test function. +

test_func :

The test function to invoke for this test. +
+

Since 2.16

+
+
+
+

g_test_add()

+
#define             g_test_add(testpath, Fixture, tdata, fsetup, ftest, fteardown)
+

+Hook up a new test case at testpath, similar to g_test_add_func(). +A fixture data structure with setup and teardown function may be provided +though, similar to g_test_create_case(). +g_test_add() is implemented as a macro, so that the fsetup(), ftest() and +fteardown() callbacks can expect a Fixture pointer as first argument in +a type safe manner.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

testpath :

The test path for a new test case. +

Fixture :

The type of a fixture data structure. +

tdata :

Data argument for the test functions. +

fsetup :

The function to set up the fixture data. +

ftest :

The actual test function. +

fteardown :

The function to tear down the fixture data. +
+

Since 2.16

+
+
+
+

g_test_message ()

+
void                g_test_message                      (const char *format,
+                                                         ...);
+

+Add a message to the test report.

+
++ + + + + + + + + + +

format :

the format string +

... :

printf-like arguments to format +
+

Since 2.16

+
+
+
+

g_test_bug_base ()

+
void                g_test_bug_base                     (const char *uri_pattern);
+

+Specify the base URI for bug reports. +

+

+The base URI is used to construct bug report messages for +g_test_message() when g_test_bug() is called. +Calling this function outside of a test case sets the +default base URI for all test cases. Calling it from within +a test case changes the base URI for the scope of the test +case only. +Bug URIs are constructed by appending a bug specific URI +portion to uri_pattern, or by replacing the special string +'s' within uri_pattern if that is present.

+
++ + + + +

uri_pattern :

the base pattern for bug URIs +
+

Since 2.16

+
+
+
+

g_test_bug ()

+
void                g_test_bug                          (const char *bug_uri_snippet);
+

+This function adds a message to test reports that +associates a bug URI with a test case. +Bug URIs are constructed from a base URI set with g_test_bug_base() +and bug_uri_snippet.

+
++ + + + +

bug_uri_snippet :

Bug specific bug tracker URI portion. +
+

Since 2.16

+
+
+
+

GTestLogFatalFunc ()

+
gboolean            (*GTestLogFatalFunc)                (const gchar *log_domain,
+                                                         GLogLevelFlags log_level,
+                                                         const gchar *message,
+                                                         gpointer user_data);
+

+Specifies the prototype of fatal log handler functions.

+
++ + + + + + + + + + + + + + + + + + + + + + +

log_domain :

the log domain of the message +

log_level :

the log level of the message (including the fatal and recursion flags) +

message :

the message to process +

user_data :

user data, set in g_test_log_set_fatal_handler() +

Returns :

TRUE if the program should abort, FALSE otherwise + +
+

Since 2.22

+
+
+
+

g_test_log_set_fatal_handler ()

+
void                g_test_log_set_fatal_handler        (GTestLogFatalFunc log_func,
+                                                         gpointer user_data);
+

+Installs a non-error fatal log handler which can be +used to decide whether log messages which are counted +as fatal abort the program. +

+

+The use case here is that you are running a test case +that depends on particular libraries or circumstances +and cannot prevent certain known critical or warning +messages. So you install a handler that compares the +domain and message to precisely not abort in such a case. +

+

+Note that the handler is reset at the beginning of +any test case, so you have to set it inside each test +function which needs the special behavior. +

+

+This handler has no effect on g_error messages.

+
++ + + + + + + + + + +

log_func :

the log handler function. +

user_data :

data passed to the log handler. +
+

Since 2.22

+
+
+
+

g_test_timer_start ()

+
void                g_test_timer_start                  (void);
+

+Start a timing test. Call g_test_timer_elapsed() when the task is supposed +to be done. Call this function again to restart the timer.

+

Since 2.16

+
+
+
+

g_test_timer_elapsed ()

+
double              g_test_timer_elapsed                (void);
+

+Get the time since the last start of the timer with g_test_timer_start().

+
++ + + + +

Returns :

the time since the last start of the timer, as a double + +
+

Since 2.16

+
+
+
+

g_test_timer_last ()

+
double              g_test_timer_last                   (void);
+

+Report the last result of g_test_timer_elapsed().

+
++ + + + +

Returns :

the last result of g_test_timer_elapsed(), as a double + +
+

Since 2.16

+
+
+
+

g_test_queue_free ()

+
void                g_test_queue_free                   (gpointer gfree_pointer);
+

+Enqueue a pointer to be released with g_free() during the next +teardown phase. This is equivalent to calling g_test_queue_destroy() +with a destroy callback of g_free().

+
++ + + + +

gfree_pointer :

the pointer to be stored. +
+

Since 2.16

+
+
+
+

g_test_queue_destroy ()

+
void                g_test_queue_destroy                (GDestroyNotify destroy_func,
+                                                         gpointer destroy_data);
+

+This function enqueus a callback @destroy_func() to be executed +during the next test case teardown phase. This is most useful +to auto destruct allocted test resources at the end of a test run. +Resources are released in reverse queue order, that means enqueueing +callback A before callback B will cause B() to be called before +A() during teardown.

+
++ + + + + + + + + + +

destroy_func :

Destroy callback for teardown phase. +

destroy_data :

Destroy callback data. +
+

Since 2.16

+
+
+
+

g_test_queue_unref()

+
#define             g_test_queue_unref(gobject)
+

+Enqueue an object to be released with g_object_unref() during +the next teardown phase. This is equivalent to calling g_test_queue_destroy() +with a destroy callback of g_object_unref(). +

+
++ + + + +

gobject :

the object to unref +
+

Since 2.16

+
+
+
+

enum GTestTrapFlags

+
typedef enum {
+  G_TEST_TRAP_SILENCE_STDOUT    = 1 << 7,
+  G_TEST_TRAP_SILENCE_STDERR    = 1 << 8,
+  G_TEST_TRAP_INHERIT_STDIN     = 1 << 9
+} GTestTrapFlags;
+
+

+Test traps are guards around forked tests. These flags +determine what traps to set. +

+
++ + + + + + + + + + + + + + +

G_TEST_TRAP_SILENCE_STDOUT

Redirect stdout of the test child to + /dev/null so it cannot be observed on the + console during test runs. The actual output is still captured + though to allow later tests with g_test_trap_assert_stdout(). +

G_TEST_TRAP_SILENCE_STDERR

Redirect stderr of the test child to + /dev/null so it cannot be observed on the + console during test runs. The actual output is still captured + though to allow later tests with g_test_trap_assert_stderr(). +

G_TEST_TRAP_INHERIT_STDIN

If this flag is given, stdin of the forked + child process is shared with stdin of its parent process. It is + redirected to /dev/null otherwise. +
+
+
+
+

g_test_trap_fork ()

+
gboolean            g_test_trap_fork                    (guint64 usec_timeout,
+                                                         GTestTrapFlags test_trap_flags);
+

+Fork the current test program to execute a test case that might +not return or that might abort. The forked test case is aborted +and considered failing if its run time exceeds usec_timeout. +

+

+The forking behavior can be configured with the GTestTrapFlags flags. +

+

+In the following example, the test code forks, the forked child +process produces some sample output and exits successfully. +The forking parent process then asserts successful child program +termination and validates child program outputs. +

+

+

+
+  static void
+  test_fork_patterns (void)
+  {
+    if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR))
+      {
+        g_print ("some stdout text: somagic17\n");
+        g_printerr ("some stderr text: semagic43\n");
+        exit (0); /* successful test run */
+      }
+    g_test_trap_assert_passed();
+    g_test_trap_assert_stdout ("*somagic17*");
+    g_test_trap_assert_stderr ("*semagic43*");
+  }
+
+

+

+

+This function is implemented only on Unix platforms.

+
++ + + + + + + + + + + + + + +

usec_timeout :

Timeout for the forked test in micro seconds. +

test_trap_flags :

Flags to modify forking behaviour. +

Returns :

TRUE for the forked child and FALSE for the executing parent process. + +
+

Since 2.16

+
+
+
+

g_test_trap_has_passed ()

+
gboolean            g_test_trap_has_passed              (void);
+

+Check the result of the last g_test_trap_fork() call.

+
++ + + + +

Returns :

TRUE if the last forked child terminated successfully. + +
+

Since 2.16

+
+
+
+

g_test_trap_reached_timeout ()

+
gboolean            g_test_trap_reached_timeout         (void);
+

+Check the result of the last g_test_trap_fork() call.

+
++ + + + +

Returns :

TRUE if the last forked child got killed due to a fork timeout. + +
+

Since 2.16

+
+
+
+

g_test_trap_assert_passed()

+
#define             g_test_trap_assert_passed()
+

+Assert that the last forked test passed. See g_test_trap_fork(). +

+

Since 2.16

+
+
+
+

g_test_trap_assert_failed()

+
#define             g_test_trap_assert_failed()
+

+Assert that the last forked test failed. See g_test_trap_fork(). +

+

Since 2.16

+
+
+
+

g_test_trap_assert_stdout()

+
#define             g_test_trap_assert_stdout(soutpattern)
+

+Assert that the stdout output of the last forked test matches soutpattern. +See g_test_trap_fork(). +

+
++ + + + +

soutpattern :

a glob-style pattern +
+

Since 2.16

+
+
+
+

g_test_trap_assert_stdout_unmatched()

+
#define             g_test_trap_assert_stdout_unmatched(soutpattern)
+

+Assert that the stdout output of the last forked test does not match +soutpattern. See g_test_trap_fork(). +

+
++ + + + +

soutpattern :

a glob-style pattern +
+

Since 2.16

+
+
+
+

g_test_trap_assert_stderr()

+
#define             g_test_trap_assert_stderr(serrpattern)
+

+Assert that the stderr output of the last forked test matches serrpattern. +See g_test_trap_fork(). +

+
++ + + + +

serrpattern :

a glob-style pattern +
+

Since 2.16

+
+
+
+

g_test_trap_assert_stderr_unmatched()

+
#define             g_test_trap_assert_stderr_unmatched(serrpattern)
+

+Assert that the stderr output of the last forked test does not match +serrpattern. See g_test_trap_fork(). +

+
++ + + + +

serrpattern :

a glob-style pattern +
+

Since 2.16

+
+
+
+

g_test_rand_bit()

+
#define             g_test_rand_bit()
+

+Get a reproducible random bit (0 or 1), +see g_test_rand_int() for details on test case random numbers. +

+

Since 2.16

+
+
+
+

g_test_rand_int ()

+
gint32              g_test_rand_int                     (void);
+

+Get a reproducible random integer number. +

+

+The random numbers generated by the g_test_rand_*() family of functions +change with every new test program start, unless the --seed option is +given when starting test programs. +

+

+For individual test cases however, the random number generator is +reseeded, to avoid dependencies between tests and to make --seed +effective for all test cases.

+
++ + + + +

Returns :

a random number from the seeded random number generator. + +
+

Since 2.16

+
+
+
+

g_test_rand_int_range ()

+
gint32              g_test_rand_int_range               (gint32 begin,
+                                                         gint32 end);
+

+Get a reproducible random integer number out of a specified range, +see g_test_rand_int() for details on test case random numbers.

+
++ + + + + + + + + + + + + + +

begin :

the minimum value returned by this function +

end :

the smallest value not to be returned by this function +

Returns :

a number with begin <= number < end. + +
+

Since 2.16

+
+
+
+

g_test_rand_double ()

+
double              g_test_rand_double                  (void);
+

+Get a reproducible random floating point number, +see g_test_rand_int() for details on test case random numbers.

+
++ + + + +

Returns :

a random number from the seeded random number generator. + +
+

Since 2.16

+
+
+
+

g_test_rand_double_range ()

+
double              g_test_rand_double_range            (double range_start,
+                                                         double range_end);
+

+Get a reproducible random floating pointer number out of a specified range, +see g_test_rand_int() for details on test case random numbers.

+
++ + + + + + + + + + + + + + +

range_start :

the minimum value returned by this function +

range_end :

the minimum value not returned by this function +

Returns :

a number with range_start <= number < range_end. + +
+

Since 2.16

+
+
+
+

g_assert()

+
#define             g_assert(expr)
+

+Debugging macro to terminate the application if the assertion fails. +If the assertion fails (i.e. the expression is not true), an error message +is logged and the application is terminated. +

+

+The macro can be turned off in final releases of code by defining +G_DISABLE_ASSERT when compiling the application. +

+
++ + + + +

expr :

the expression to check. +
+
+
+
+

g_assert_not_reached()

+
#define             g_assert_not_reached()
+

+Debugging macro to terminate the application if it is ever reached. +If it is reached, an error message is logged and the application is terminated. +

+

+The macro can be turned off in final releases of code by defining +G_DISABLE_ASSERT when compiling the application. +

+
+
+
+

g_assert_cmpstr()

+
#define             g_assert_cmpstr(s1, cmp, s2)
+

+Debugging macro to terminate the application with a warning message +if a string comparison fails. +The strings are compared using g_strcmp0(). +

+

+The effect of g_assert_cmpstr (s1, op, s2) is the same +as g_assert (g_strcmp0 (s1, s2) op 0). The advantage of this macro +is that it can produce a message that includes the actual values of s1 +and s2. +

+
+  g_assert_cmpstr (mystring, ==, "fubar");
+
+
++ + + + + + + + + + + + + + +

s1 :

a string (may be NULL) +

cmp :

The comparison operator to use. One of ==, !=, <, >, <=, >=. +

s2 :

another string (may be NULL) +
+

Since 2.16

+
+
+
+

g_assert_cmpint()

+
#define             g_assert_cmpint(n1, cmp, n2)
+

+Debugging macro to terminate the application with a warning message +if an integer comparison fails. +

+

+The effect of g_assert_cmpint (n1, op, n2) is the same +as g_assert (n1 op n2). The advantage of this macro +is that it can produce a message that includes the actual values of n1 +and n2. +

+
++ + + + + + + + + + + + + + +

n1 :

an integer +

cmp :

The comparison operator to use. One of ==, !=, <, >, <=, >=. +

n2 :

another integer +
+

Since 2.16

+
+
+
+

g_assert_cmpuint()

+
#define             g_assert_cmpuint(n1, cmp, n2)
+

+Debugging macro to terminate the application with a warning message +if an unsigned integer comparison fails. +

+

+The effect of g_assert_cmpuint (n1, op, n2) is the same +as g_assert (n1 op n2). The advantage of this macro +is that it can produce a message that includes the actual values of n1 +and n2. +

+
++ + + + + + + + + + + + + + +

n1 :

an unsigned integer +

cmp :

The comparison operator to use. One of ==, !=, <, >, <=, >=. +

n2 :

another unsigned integer +
+

Since 2.16

+
+
+
+

g_assert_cmphex()

+
#define             g_assert_cmphex(n1, cmp, n2)
+

+Debugging macro to terminate the application with a warning message +if an unsigned integer comparison fails. This is a variant of +g_assert_cmpuint() that displays the numbers in hexadecimal notation +in the message. +

+
++ + + + + + + + + + + + + + +

n1 :

an unsigned integer +

cmp :

The comparison operator to use. One of ==, !=, <, >, <=, >=. +

n2 :

another unsigned integer +
+

Since 2.16

+
+
+
+

g_assert_cmpfloat()

+
#define             g_assert_cmpfloat(n1,cmp,n2)
+

+Debugging macro to terminate the application with a warning message +if a floating point number comparison fails. +

+

+The effect of g_assert_cmpfloat (n1, op, n2) is the same +as g_assert (n1 op n2). The advantage of this function +is that it can produce a message that includes the actual values of n1 +and n2. +

+
++ + + + + + + + + + + + + + +

n1 :

an floating point number +

cmp :

The comparison operator to use. One of ==, !=, <, >, <=, >=. +

n2 :

another floating point number +
+

Since 2.16

+
+
+
+

g_assert_no_error()

+
#define             g_assert_no_error(err)
+

+Debugging macro to terminate the application with a warning message +if a method has returned a GError. +

+

+The effect of g_assert_no_error (err) is the same +as g_assert (err == NULL). The advantage of this macro +is that it can produce a message that includes the error message and code. +

+
++ + + + +

err :

a GError, possibly NULL +
+

Since 2.20

+
+
+
+

g_assert_error()

+
#define             g_assert_error(err, dom, c)
+

+Debugging macro to terminate the application with a warning message +if a method has not returned the correct GError. +

+

+The effect of g_assert_error (err, dom, c) is the same +as g_assert (err != NULL && err->domain == dom && err->code == c). +The advantage of this macro is that it can produce a message that +includes the incorrect error message and code. +

+

+This can only be used to test for a specific error. If you want to +test that err is set, but don't care what it's set to, just use +g_assert (err != NULL) +

+
++ + + + + + + + + + + + + + +

err :

a GError, possibly NULL +

dom :

the expected error domain (a GQuark) +

c :

the expected error code +
+

Since 2.20

+
+
+
+

GTestCase

+
typedef struct GTestCase  GTestCase;
+
+

+An opaque structure representing a test case. +

+
+
+
+

GTestSuite

+
typedef struct GTestSuite GTestSuite;
+
+

+An opaque structure representing a test suite. +

+
+
+
+

g_test_create_case ()

+
GTestCase*          g_test_create_case                  (const char *test_name,
+                                                         gsize data_size,
+                                                         gconstpointer test_data,
+                                                         void (data_setupvoid) (),
+                                                         void (data_testvoid) (),
+                                                         void (data_teardownvoid) ());
+

+Create a new GTestCase, named test_name, this API is fairly +low level, calling g_test_add() or g_test_add_func() is preferable. +When this test is executed, a fixture structure of size data_size +will be allocated and filled with 0s. Then data_setup() is called +to initialize the fixture. After fixture setup, the actual test +function data_test() is called. Once the test run completed, the +fixture structure is torn down by calling data_teardown() and +after that the memory is released. +

+

+Splitting up a test run into fixture setup, test function and +fixture teardown is most usful if the same fixture is used for +multiple tests. In this cases, g_test_create_case() will be +called with the same fixture, but varying test_name and +data_test arguments.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

test_name :

the name for the test case +

data_size :

the size of the fixture data structure +

test_data :

test data argument for the test functions +

data_setup :

the function to set up the fixture data +

data_test :

the actual test function +

data_teardown :

the function to teardown the fixture data +

Returns :

a newly allocated GTestCase. + +
+

Since 2.16

+
+
+
+

g_test_create_suite ()

+
GTestSuite*         g_test_create_suite                 (const char *suite_name);
+

+Create a new test suite with the name suite_name.

+
++ + + + + + + + + + +

suite_name :

a name for the suite +

Returns :

A newly allocated GTestSuite instance. + +
+

Since 2.16

+
+
+
+

g_test_get_root ()

+
GTestSuite*         g_test_get_root                     (void);
+

+Get the toplevel test suite for the test path API.

+
++ + + + +

Returns :

the toplevel GTestSuite + +
+

Since 2.16

+
+
+
+

g_test_suite_add ()

+
void                g_test_suite_add                    (GTestSuite *suite,
+                                                         GTestCase *test_case);
+

+Adds test_case to suite.

+
++ + + + + + + + + + +

suite :

a GTestSuite +

test_case :

a GTestCase +
+

Since 2.16

+
+
+
+

g_test_suite_add_suite ()

+
void                g_test_suite_add_suite              (GTestSuite *suite,
+                                                         GTestSuite *nestedsuite);
+

+Adds nestedsuite to suite.

+
++ + + + + + + + + + +

suite :

a GTestSuite +

nestedsuite :

another GTestSuite +
+

Since 2.16

+
+
+
+

g_test_run_suite ()

+
int                 g_test_run_suite                    (GTestSuite *suite);
+

+Execute the tests within suite and all nested GTestSuites. +The test suites to be executed are filtered according to +test path arguments (-p testpath) +as parsed by g_test_init(). +g_test_run_suite() or g_test_run() may only be called once +in a program.

+
++ + + + + + + + + + +

suite :

a GTestSuite +

Returns :

0 on success + +
+

Since 2.16

+
+
+
+

See Also

+

+gtester, +gtester-report +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-The-Main-Event-Loop.html b/docs/reference/glib/html/glib-The-Main-Event-Loop.html new file mode 100644 index 0000000..2df745c --- /dev/null +++ b/docs/reference/glib/html/glib-The-Main-Event-Loop.html @@ -0,0 +1,3199 @@ + + + + +The Main Event Loop + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

The Main Event Loop

+

The Main Event Loop — manages all available sources of events

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GMainLoop;
+GMainLoop *         g_main_loop_new                     (GMainContext *context,
+                                                         gboolean is_running);
+GMainLoop *         g_main_loop_ref                     (GMainLoop *loop);
+void                g_main_loop_unref                   (GMainLoop *loop);
+void                g_main_loop_run                     (GMainLoop *loop);
+void                g_main_loop_quit                    (GMainLoop *loop);
+gboolean            g_main_loop_is_running              (GMainLoop *loop);
+GMainContext *      g_main_loop_get_context             (GMainLoop *loop);
+#define             g_main_new                          (is_running)
+#define             g_main_destroy                      (loop)
+#define             g_main_run                          (loop)
+#define             g_main_quit                         (loop)
+#define             g_main_is_running                   (loop)
+
+#define             G_PRIORITY_HIGH
+#define             G_PRIORITY_DEFAULT
+#define             G_PRIORITY_HIGH_IDLE
+#define             G_PRIORITY_DEFAULT_IDLE
+#define             G_PRIORITY_LOW
+
+                    GMainContext;
+GMainContext *      g_main_context_new                  (void);
+GMainContext *      g_main_context_ref                  (GMainContext *context);
+void                g_main_context_unref                (GMainContext *context);
+GMainContext *      g_main_context_default              (void);
+gboolean            g_main_context_iteration            (GMainContext *context,
+                                                         gboolean may_block);
+#define             g_main_iteration                    (may_block)
+gboolean            g_main_context_pending              (GMainContext *context);
+#define             g_main_pending                      ()
+GSource *           g_main_context_find_source_by_id    (GMainContext *context,
+                                                         guint source_id);
+GSource *           g_main_context_find_source_by_user_data
+                                                        (GMainContext *context,
+                                                         gpointer user_data);
+GSource *           g_main_context_find_source_by_funcs_user_data
+                                                        (GMainContext *context,
+                                                         GSourceFuncs *funcs,
+                                                         gpointer user_data);
+void                g_main_context_wakeup               (GMainContext *context);
+gboolean            g_main_context_acquire              (GMainContext *context);
+void                g_main_context_release              (GMainContext *context);
+gboolean            g_main_context_is_owner             (GMainContext *context);
+gboolean            g_main_context_wait                 (GMainContext *context,
+                                                         GCond *cond,
+                                                         GMutex *mutex);
+gboolean            g_main_context_prepare              (GMainContext *context,
+                                                         gint *priority);
+gint                g_main_context_query                (GMainContext *context,
+                                                         gint max_priority,
+                                                         gint *timeout_,
+                                                         GPollFD *fds,
+                                                         gint n_fds);
+gint                g_main_context_check                (GMainContext *context,
+                                                         gint max_priority,
+                                                         GPollFD *fds,
+                                                         gint n_fds);
+void                g_main_context_dispatch             (GMainContext *context);
+void                g_main_context_set_poll_func        (GMainContext *context,
+                                                         GPollFunc func);
+GPollFunc           g_main_context_get_poll_func        (GMainContext *context);
+gint                (*GPollFunc)                        (GPollFD *ufds,
+                                                         guint nfsd,
+                                                         gint timeout_);
+void                g_main_context_add_poll             (GMainContext *context,
+                                                         GPollFD *fd,
+                                                         gint priority);
+void                g_main_context_remove_poll          (GMainContext *context,
+                                                         GPollFD *fd);
+gint                g_main_depth                        (void);
+GSource *           g_main_current_source               (void);
+#define             g_main_set_poll_func                (func)
+
+GMainContext *      g_main_context_get_thread_default   (void);
+void                g_main_context_push_thread_default  (GMainContext *context);
+void                g_main_context_pop_thread_default   (GMainContext *context);
+
+GSource *           g_timeout_source_new                (guint interval);
+GSource *           g_timeout_source_new_seconds        (guint interval);
+guint               g_timeout_add                       (guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data);
+guint               g_timeout_add_full                  (gint priority,
+                                                         guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+guint               g_timeout_add_seconds               (guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data);
+guint               g_timeout_add_seconds_full          (gint priority,
+                                                         guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+
+GSource *           g_idle_source_new                   (void);
+guint               g_idle_add                          (GSourceFunc function,
+                                                         gpointer data);
+guint               g_idle_add_full                     (gint priority,
+                                                         GSourceFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+gboolean            g_idle_remove_by_data               (gpointer data);
+
+typedef             GPid;
+void                (*GChildWatchFunc)                  (GPid pid,
+                                                         gint status,
+                                                         gpointer data);
+GSource *           g_child_watch_source_new            (GPid pid);
+guint               g_child_watch_add                   (GPid pid,
+                                                         GChildWatchFunc function,
+                                                         gpointer data);
+guint               g_child_watch_add_full              (gint priority,
+                                                         GPid pid,
+                                                         GChildWatchFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+
+                    GPollFD;
+gint                g_poll                              (GPollFD *fds,
+                                                         guint nfds,
+                                                         gint timeout);
+#define             G_POLLFD_FORMAT
+
+                    GSource;
+void                (*GSourceDummyMarshal)              (void);
+                    GSourceFuncs;
+                    GSourceCallbackFuncs;
+GSource *           g_source_new                        (GSourceFuncs *source_funcs,
+                                                         guint struct_size);
+GSource *           g_source_ref                        (GSource *source);
+void                g_source_unref                      (GSource *source);
+void                g_source_set_funcs                  (GSource *source,
+                                                         GSourceFuncs *funcs);
+guint               g_source_attach                     (GSource *source,
+                                                         GMainContext *context);
+void                g_source_destroy                    (GSource *source);
+gboolean            g_source_is_destroyed               (GSource *source);
+void                g_source_set_priority               (GSource *source,
+                                                         gint priority);
+gint                g_source_get_priority               (GSource *source);
+void                g_source_set_can_recurse            (GSource *source,
+                                                         gboolean can_recurse);
+gboolean            g_source_get_can_recurse            (GSource *source);
+guint               g_source_get_id                     (GSource *source);
+GMainContext *      g_source_get_context                (GSource *source);
+void                g_source_set_callback               (GSource *source,
+                                                         GSourceFunc func,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+gboolean            (*GSourceFunc)                      (gpointer data);
+void                g_source_set_callback_indirect      (GSource *source,
+                                                         gpointer callback_data,
+                                                         GSourceCallbackFuncs *callback_funcs);
+void                g_source_add_poll                   (GSource *source,
+                                                         GPollFD *fd);
+void                g_source_remove_poll                (GSource *source,
+                                                         GPollFD *fd);
+void                g_source_get_current_time           (GSource *source,
+                                                         GTimeVal *timeval);
+gboolean            g_source_remove                     (guint tag);
+gboolean            g_source_remove_by_funcs_user_data  (GSourceFuncs *funcs,
+                                                         gpointer user_data);
+gboolean            g_source_remove_by_user_data        (gpointer user_data);
+
+
+
+

Description

+

+ The main event loop manages all the available sources of events for + GLib and GTK+ applications. These events can come from any number of + different types of sources such as file descriptors (plain files, + pipes or sockets) and timeouts. New types of event sources can also + be added using g_source_attach(). +

+

+ To allow multiple independent sets of sources to be handled in + different threads, each source is associated with a GMainContext. + A GMainContext can only be running in a single thread, but + sources can be added to it and removed from it from other threads. +

+

+ Each event source is assigned a priority. The default priority, + G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher + priorities. Values greater than 0 denote lower priorities. Events + from high priority sources are always processed before events from + lower priority sources. +

+

+ Idle functions can also be added, and assigned a priority. These will + be run whenever no events with a higher priority are ready to be + processed. +

+

+ The GMainLoop data type represents a main event loop. A GMainLoop + is created with g_main_loop_new(). After adding the initial event sources, + g_main_loop_run() is called. This continuously checks for new events from + each of the event sources and dispatches them. Finally, the + processing of an event from one of the sources leads to a call to + g_main_loop_quit() to exit the main loop, and g_main_loop_run() returns. +

+

+ It is possible to create new instances of GMainLoop recursively. + This is often used in GTK+ applications when showing modal dialog + boxes. Note that event sources are associated with a particular + GMainContext, and will be checked and dispatched for all main + loops associated with that GMainContext. +

+

+ GTK+ contains wrappers of some of these functions, e.g. gtk_main(), + gtk_main_quit() and gtk_events_pending(). +

+
+

Creating new sources types

+

+ One of the unusual features of the GTK+ main loop functionality + is that new types of event source can be created and used in + addition to the builtin type of event source. A new event source + type is used for handling GDK events. A new source type is + created by deriving from the GSource + structure. The derived type of source is represented by a + structure that has the GSource structure as a first element, + and other elements specific to the new source type. To create + an instance of the new source type, call g_source_new() passing + in the size of the derived structure and a table of functions. + These GSourceFuncs determine the behavior of the new source + types. +

+

+ New source types basically interact with the main context + in two ways. Their prepare function in GSourceFuncs can set + a timeout to determine the maximum amount of time that the + main loop will sleep before checking the source again. In + addition, or as well, the source can add file descriptors to + the set that the main context checks using g_source_add_poll(). +

+
+
+
+

Customizing the main loop iteration

+

+ Single iterations of a GMainContext can be run with + g_main_context_iteration(). In some cases, more detailed control + of exactly how the details of the main loop work is desired, + for instance, when integrating the GMainLoop with an external + main loop. In such cases, you can call the component functions + of g_main_context_iteration() directly. These functions + are g_main_context_prepare(), g_main_context_query(), + g_main_context_check() and g_main_context_dispatch(). +

+

+ The operation of these functions can best be seen in terms + of a state diagram, as shown in Figure 1, “States of a Main Context”. +

+
+

Figure 1. States of a Main Context

+
States of a Main Context
+
+
+
+
+
+

Details

+
+

GMainLoop

+
typedef struct _GMainLoop GMainLoop;
+

+The GMainLoop struct is an opaque data type +representing the main event loop of a GLib or GTK+ application. +

+
+
+
+

g_main_loop_new ()

+
GMainLoop *         g_main_loop_new                     (GMainContext *context,
+                                                         gboolean is_running);
+

+Creates a new GMainLoop structure.

+
++ + + + + + + + + + + + + + +

context :

a GMainContext (if NULL, the default context will be used). +

is_running :

set to TRUE to indicate that the loop is running. This +is not very important since calling g_main_loop_run() will set this to +TRUE anyway. +

Returns :

a new GMainLoop. +
+
+
+
+

g_main_loop_ref ()

+
GMainLoop *         g_main_loop_ref                     (GMainLoop *loop);
+

+Increases the reference count on a GMainLoop object by one.

+
++ + + + + + + + + + +

loop :

a GMainLoop +

Returns :

loop +
+
+
+
+

g_main_loop_unref ()

+
void                g_main_loop_unref                   (GMainLoop *loop);
+

+Decreases the reference count on a GMainLoop object by one. If +the result is zero, free the loop and free all associated memory.

+
++ + + + +

loop :

a GMainLoop +
+
+
+
+

g_main_loop_run ()

+
void                g_main_loop_run                     (GMainLoop *loop);
+

+Runs a main loop until g_main_loop_quit() is called on the loop. +If this is called for the thread of the loop's GMainContext, +it will process events from the loop, otherwise it will +simply wait.

+
++ + + + +

loop :

a GMainLoop +
+
+
+
+

g_main_loop_quit ()

+
void                g_main_loop_quit                    (GMainLoop *loop);
+

+Stops a GMainLoop from running. Any calls to g_main_loop_run() +for the loop will return. +

+

+Note that sources that have already been dispatched when +g_main_loop_quit() is called will still be executed.

+
++ + + + +

loop :

a GMainLoop +
+
+
+
+

g_main_loop_is_running ()

+
gboolean            g_main_loop_is_running              (GMainLoop *loop);
+

+Checks to see if the main loop is currently being run via g_main_loop_run().

+
++ + + + + + + + + + +

loop :

a GMainLoop. +

Returns :

TRUE if the mainloop is currently being run. +
+
+
+
+

g_main_loop_get_context ()

+
GMainContext *      g_main_loop_get_context             (GMainLoop *loop);
+

+Returns the GMainContext of loop.

+
++ + + + + + + + + + +

loop :

a GMainLoop. +

Returns :

the GMainContext of loop +
+
+
+
+

g_main_new()

+
#define             g_main_new(is_running)
+
+

Warning

+

g_main_new has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_loop_new() instead.

+
+

+Creates a new GMainLoop for the default main loop. +

+
++ + + + + + + + + + +

is_running :

set to TRUE to indicate that the loop is running. This is not +very important since calling g_main_run() will set this to TRUE anyway. +

Returns :

a new GMainLoop. +
+
+
+
+

g_main_destroy()

+
#define             g_main_destroy(loop)
+
+

Warning

+

g_main_destroy has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_loop_unref() instead.

+
+

+Frees the memory allocated for the GMainLoop. +

+
++ + + + +

loop :

a GMainLoop. +
+
+
+
+

g_main_run()

+
#define             g_main_run(loop)
+
+

Warning

+

g_main_run has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_loop_run() instead.

+
+

+Runs a main loop until it stops running. +

+
++ + + + +

loop :

a GMainLoop. +
+
+
+
+

g_main_quit()

+
#define             g_main_quit(loop)
+
+

Warning

+

g_main_quit has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_loop_quit() instead.

+
+

+Stops the GMainLoop. If g_main_run() was called to run the GMainLoop, +it will now return. +

+
++ + + + +

loop :

a GMainLoop. +
+
+
+
+

g_main_is_running()

+
#define             g_main_is_running(loop)
+
+

Warning

+

g_main_is_running has been deprecated since version 2.2 and should not be used in newly-written code. USe g_main_loop_is_running() instead.

+
+

+Checks if the main loop is running. +

+
++ + + + + + + + + + +

loop :

a GMainLoop. +

Returns :

+TRUE if the main loop is running. +
+
+
+
+

G_PRIORITY_HIGH

+
#define G_PRIORITY_HIGH            -100
+
+

+Use this for high priority event sources. +It is not used within GLib or GTK+. +

+
+
+
+

G_PRIORITY_DEFAULT

+
#define G_PRIORITY_DEFAULT          0
+
+

+Use this for default priority event sources. +In GLib this priority is used when adding timeout functions with +g_timeout_add(). +In GDK this priority is used for events from the X server. +

+
+
+
+

G_PRIORITY_HIGH_IDLE

+
#define G_PRIORITY_HIGH_IDLE        100
+
+

+Use this for high priority idle functions. +GTK+ uses G_PRIORITY_HIGH_IDLE + 10 for resizing operations, and +G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is done to +ensure that any pending resizes are processed before any pending redraws, +so that widgets are not redrawn twice unnecessarily.) +

+
+
+
+

G_PRIORITY_DEFAULT_IDLE

+
#define G_PRIORITY_DEFAULT_IDLE     200
+
+

+Use this for default priority idle functions. +In GLib this priority is used when adding idle functions with g_idle_add(). +

+
+
+
+

G_PRIORITY_LOW

+
#define G_PRIORITY_LOW	            300
+
+

+Use this for very low priority background tasks. +It is not used within GLib or GTK+. +

+
+
+
+

GMainContext

+
typedef struct _GMainContext GMainContext;
+

+The GMainContext struct is an opaque data type +representing a set of sources to be handled in a main loop. +

+
+
+
+

g_main_context_new ()

+
GMainContext *      g_main_context_new                  (void);
+

+Creates a new GMainContext structure.

+
++ + + + +

Returns :

the new GMainContext +
+
+
+
+

g_main_context_ref ()

+
GMainContext *      g_main_context_ref                  (GMainContext *context);
+

+Increases the reference count on a GMainContext object by one.

+
++ + + + + + + + + + +

context :

a GMainContext +

Returns :

the context that was passed in (since 2.6) +
+
+
+
+

g_main_context_unref ()

+
void                g_main_context_unref                (GMainContext *context);
+

+Decreases the reference count on a GMainContext object by one. If +the result is zero, free the context and free all associated memory.

+
++ + + + +

context :

a GMainContext +
+
+
+
+

g_main_context_default ()

+
GMainContext *      g_main_context_default              (void);
+

+Returns the global default main context. This is the main context +used for main loop functions when a main loop is not explicitly +specified, and corresponds to the "main" main loop. See also +g_main_context_get_thread_default().

+
++ + + + +

Returns :

the global default main context. +
+
+
+
+

g_main_context_iteration ()

+
gboolean            g_main_context_iteration            (GMainContext *context,
+                                                         gboolean may_block);
+

+Runs a single iteration for the given main loop. This involves +checking to see if any event sources are ready to be processed, +then if no events sources are ready and may_block is TRUE, waiting +for a source to become ready, then dispatching the highest priority +events sources that are ready. Otherwise, if may_block is FALSE +sources are not waited to become ready, only those highest priority +events sources will be dispatched (if any), that are ready at this +given moment without further waiting. +

+

+Note that even when may_block is TRUE, it is still possible for +g_main_context_iteration() to return FALSE, since the the wait may +be interrupted for other reasons than an event source becoming ready.

+
++ + + + + + + + + + + + + + +

context :

a GMainContext (if NULL, the default context will be used) +

may_block :

whether the call may block. +

Returns :

TRUE if events were dispatched. +
+
+
+
+

g_main_iteration()

+
#define             g_main_iteration(may_block)
+
+

Warning

+

g_main_iteration has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_context_iteration() instead.

+
+

+Runs a single iteration for the default GMainContext. +

+
++ + + + + + + + + + +

may_block :

set to TRUE if it should block (i.e. wait) until an event source +becomes ready. It will return after an event source has been processed. +If set to FALSE it will return immediately if no event source is ready to be +processed. +

Returns :

+TRUE if more events are pending. +
+
+
+
+

g_main_context_pending ()

+
gboolean            g_main_context_pending              (GMainContext *context);
+

+Checks if any sources have pending events for the given context.

+
++ + + + + + + + + + +

context :

a GMainContext (if NULL, the default context will be used) +

Returns :

TRUE if events are pending. +
+
+
+
+

g_main_pending()

+
#define             g_main_pending()
+
+

Warning

+

g_main_pending has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_context_pending() instead.

+
+

+Checks if any events are pending for the default GMainContext +(i.e. ready to be processed). +

+
++ + + + +

Returns :

+TRUE if any events are pending. +
+
+
+
+

g_main_context_find_source_by_id ()

+
GSource *           g_main_context_find_source_by_id    (GMainContext *context,
+                                                         guint source_id);
+

+Finds a GSource given a pair of context and ID.

+
++ + + + + + + + + + + + + + +

context :

a GMainContext (if NULL, the default context will be used) +

source_id :

the source ID, as returned by g_source_get_id(). +

Returns :

the GSource if found, otherwise, NULL +
+
+
+
+

g_main_context_find_source_by_user_data ()

+
GSource *           g_main_context_find_source_by_user_data
+                                                        (GMainContext *context,
+                                                         gpointer user_data);
+

+Finds a source with the given user data for the callback. If +multiple sources exist with the same user data, the first +one found will be returned.

+
++ + + + + + + + + + + + + + +

context :

a GMainContext +

user_data :

the user_data for the callback. +

Returns :

the source, if one was found, otherwise NULL +
+
+
+
+

g_main_context_find_source_by_funcs_user_data ()

+
GSource *           g_main_context_find_source_by_funcs_user_data
+                                                        (GMainContext *context,
+                                                         GSourceFuncs *funcs,
+                                                         gpointer user_data);
+

+Finds a source with the given source functions and user data. If +multiple sources exist with the same source function and user data, +the first one found will be returned.

+
++ + + + + + + + + + + + + + + + + + +

context :

a GMainContext (if NULL, the default context will be used). +

funcs :

the source_funcs passed to g_source_new(). +

user_data :

the user data from the callback. +

Returns :

the source, if one was found, otherwise NULL +
+
+
+
+

g_main_context_wakeup ()

+
void                g_main_context_wakeup               (GMainContext *context);
+

+If context is currently waiting in a poll(), interrupt +the poll(), and continue the iteration process.

+
++ + + + +

context :

a GMainContext +
+
+
+
+

g_main_context_acquire ()

+
gboolean            g_main_context_acquire              (GMainContext *context);
+

+Tries to become the owner of the specified context. +If some other thread is the owner of the context, +returns FALSE immediately. Ownership is properly +recursive: the owner can require ownership again +and will release ownership when g_main_context_release() +is called as many times as g_main_context_acquire(). +

+

+You must be the owner of a context before you +can call g_main_context_prepare(), g_main_context_query(), +g_main_context_check(), g_main_context_dispatch().

+
++ + + + + + + + + + +

context :

a GMainContext +

Returns :

TRUE if the operation succeeded, and + this thread is now the owner of context. +
+
+
+
+

g_main_context_release ()

+
void                g_main_context_release              (GMainContext *context);
+

+Releases ownership of a context previously acquired by this thread +with g_main_context_acquire(). If the context was acquired multiple +times, the ownership will be released only when g_main_context_release() +is called as many times as it was acquired.

+
++ + + + +

context :

a GMainContext +
+
+
+
+

g_main_context_is_owner ()

+
gboolean            g_main_context_is_owner             (GMainContext *context);
+

+Determines whether this thread holds the (recursive) +ownership of this GMaincontext. This is useful to +know before waiting on another thread that may be +blocking to get ownership of context.

+
++ + + + + + + + + + +

context :

a GMainContext +

Returns :

TRUE if current thread is owner of context. + +
+

Since 2.10

+
+
+
+

g_main_context_wait ()

+
gboolean            g_main_context_wait                 (GMainContext *context,
+                                                         GCond *cond,
+                                                         GMutex *mutex);
+

+Tries to become the owner of the specified context, +as with g_main_context_acquire(). But if another thread +is the owner, atomically drop mutex and wait on cond until +that owner releases ownership or until cond is signaled, then +try again (once) to become the owner.

+
++ + + + + + + + + + + + + + + + + + +

context :

a GMainContext +

cond :

a condition variable +

mutex :

a mutex, currently held +

Returns :

TRUE if the operation succeeded, and + this thread is now the owner of context. +
+
+
+
+

g_main_context_prepare ()

+
gboolean            g_main_context_prepare              (GMainContext *context,
+                                                         gint *priority);
+

+Prepares to poll sources within a main loop. The resulting information +for polling is determined by calling g_main_context_query().

+
++ + + + + + + + + + + + + + +

context :

a GMainContext +

priority :

location to store priority of highest priority + source already ready. +

Returns :

TRUE if some source is ready to be dispatched + prior to polling. +
+
+
+
+

g_main_context_query ()

+
gint                g_main_context_query                (GMainContext *context,
+                                                         gint max_priority,
+                                                         gint *timeout_,
+                                                         GPollFD *fds,
+                                                         gint n_fds);
+

+Determines information necessary to poll this main loop.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

context :

a GMainContext +

max_priority :

maximum priority source to check +

timeout_ :

location to store timeout to be used in polling +

fds :

location to store GPollFD records that need to be polled. +

n_fds :

length of fds. +

Returns :

the number of records actually stored in fds, + or, if more than n_fds records need to be stored, the number + of records that need to be stored. +
+
+
+
+

g_main_context_check ()

+
gint                g_main_context_check                (GMainContext *context,
+                                                         gint max_priority,
+                                                         GPollFD *fds,
+                                                         gint n_fds);
+

+Passes the results of polling back to the main loop.

+
++ + + + + + + + + + + + + + + + + + + + + + +

context :

a GMainContext +

max_priority :

the maximum numerical priority of sources to check +

fds :

array of GPollFD's that was passed to the last call to + g_main_context_query() +

n_fds :

return value of g_main_context_query() +

Returns :

TRUE if some sources are ready to be dispatched. +
+
+
+
+

g_main_context_dispatch ()

+
void                g_main_context_dispatch             (GMainContext *context);
+

+Dispatches all pending sources.

+
++ + + + +

context :

a GMainContext +
+
+
+
+

g_main_context_set_poll_func ()

+
void                g_main_context_set_poll_func        (GMainContext *context,
+                                                         GPollFunc func);
+

+Sets the function to use to handle polling of file descriptors. It +will be used instead of the poll() system call +(or GLib's replacement function, which is used where +poll() isn't available). +

+

+This function could possibly be used to integrate the GLib event +loop with an external event loop.

+
++ + + + + + + + + + +

context :

a GMainContext +

func :

the function to call to poll all file descriptors +
+
+
+
+

g_main_context_get_poll_func ()

+
GPollFunc           g_main_context_get_poll_func        (GMainContext *context);
+

+Gets the poll function set by g_main_context_set_poll_func().

+
++ + + + + + + + + + +

context :

a GMainContext +

Returns :

the poll function +
+
+
+
+

GPollFunc ()

+
gint                (*GPollFunc)                        (GPollFD *ufds,
+                                                         guint nfsd,
+                                                         gint timeout_);
+

+Specifies the type of function passed to g_main_context_set_poll_func(). +The semantics of the function should match those of the +poll() system call. +

+
++ + + + + + + + + + + + + + + + + + +

ufds :

an array of GPollFD elements. +

nfsd :

the number of elements in ufds. +

timeout_ :

the maximum time to wait for an event of the file descriptors. + A negative value indicates an infinite timeout. +

Returns :

the number of GPollFD elements which have events or errors reported, +or -1 if an error occurred. +
+
+
+
+

g_main_context_add_poll ()

+
void                g_main_context_add_poll             (GMainContext *context,
+                                                         GPollFD *fd,
+                                                         gint priority);
+

+Adds a file descriptor to the set of file descriptors polled for +this context. This will very seldomly be used directly. Instead +a typical event source will use g_source_add_poll() instead.

+
++ + + + + + + + + + + + + + +

context :

a GMainContext (or NULL for the default context) +

fd :

a GPollFD structure holding information about a file + descriptor to watch. +

priority :

the priority for this file descriptor which should be + the same as the priority used for g_source_attach() to ensure that the + file descriptor is polled whenever the results may be needed. +
+
+
+
+

g_main_context_remove_poll ()

+
void                g_main_context_remove_poll          (GMainContext *context,
+                                                         GPollFD *fd);
+

+Removes file descriptor from the set of file descriptors to be +polled for a particular context.

+
++ + + + + + + + + + +

context :

a GMainContext +

fd :

a GPollFD descriptor previously added with g_main_context_add_poll() +
+
+
+
+

g_main_depth ()

+
gint                g_main_depth                        (void);
+

+Returns the depth of the stack of calls to +g_main_context_dispatch() on any GMainContext in the current thread. + That is, when called from the toplevel, it gives 0. When +called from within a callback from g_main_context_iteration() +(or g_main_loop_run(), etc.) it returns 1. When called from within +a callback to a recursive call to g_main_context_iterate(), +it returns 2. And so forth. +

+

+This function is useful in a situation like the following: +Imagine an extremely simple "garbage collected" system. +

+

+

+
+static GList *free_list;
+
+gpointer
+allocate_memory (gsize size)
+{ 
+  gpointer result = g_malloc (size);
+  free_list = g_list_prepend (free_list, result);
+  return result;
+}
+
+void
+free_allocated_memory (void)
+{
+  GList *l;
+  for (l = free_list; l; l = l->next);
+    g_free (l->data);
+  g_list_free (free_list);
+  free_list = NULL;
+ }
+
+[...]
+
+while (TRUE); 
+ {
+   g_main_context_iteration (NULL, TRUE);
+   free_allocated_memory();
+  }
+
+

+

+

+This works from an application, however, if you want to do the same +thing from a library, it gets more difficult, since you no longer +control the main loop. You might think you can simply use an idle +function to make the call to free_allocated_memory(), but that +doesn't work, since the idle function could be called from a +recursive callback. This can be fixed by using g_main_depth() +

+

+

+
+gpointer
+allocate_memory (gsize size)
+{ 
+  FreeListBlock *block = g_new (FreeListBlock, 1);
+  block->mem = g_malloc (size);
+  block->depth = g_main_depth ();   
+  free_list = g_list_prepend (free_list, block);
+  return block->mem;
+}
+
+void
+free_allocated_memory (void)
+{
+  GList *l;
+  
+  int depth = g_main_depth ();
+  for (l = free_list; l; );
+    {
+      GList *next = l->next;
+      FreeListBlock *block = l->data;
+      if (block->depth > depth)
+        {
+          g_free (block->mem);
+          g_free (block);
+          free_list = g_list_delete_link (free_list, l);
+        }
+              
+      l = next;
+    }
+  }
+
+

+

+

+There is a temptation to use g_main_depth() to solve +problems with reentrancy. For instance, while waiting for data +to be received from the network in response to a menu item, +the menu item might be selected again. It might seem that +one could make the menu item's callback return immediately +and do nothing if g_main_depth() returns a value greater than 1. +However, this should be avoided since the user then sees selecting +the menu item do nothing. Furthermore, you'll find yourself adding +these checks all over your code, since there are doubtless many, +many things that the user could do. Instead, you can use the +following techniques: +

+

+

+
    +
  1. + Use gtk_widget_set_sensitive() or modal dialogs to prevent + the user from interacting with elements while the main + loop is recursing. +

  2. +
  3. + Avoid main loop recursion in situations where you can't handle + arbitrary callbacks. Instead, structure your code so that you + simply return to the main loop and then get called again when + there is more work to do. +

  4. +
+
++ + + + +

Returns :

The main loop recursion level in the current thread +
+
+
+
+

g_main_current_source ()

+
GSource *           g_main_current_source               (void);
+

+Returns the currently firing source for this thread.

+
++ + + + +

Returns :

The currently firing source or NULL. + +
+

Since 2.12

+
+
+
+

g_main_set_poll_func()

+
#define             g_main_set_poll_func(func)
+
+

Warning

+

g_main_set_poll_func has been deprecated since version 2.2 and should not be used in newly-written code. Use g_main_context_set_poll_func() instead.

+
+

+Sets the function to use for the handle polling of file descriptors +for the default main context. +

+
++ + + + +

func :

the function to call to poll all file descriptors. +
+
+
+
+

g_main_context_get_thread_default ()

+
GMainContext *      g_main_context_get_thread_default   (void);
+

+Gets the thread-default GMainContext for this thread. Asynchronous +operations that want to be able to be run in contexts other than +the default one should call this method to get a GMainContext to +add their GSources to. (Note that even in single-threaded +programs applications may sometimes want to temporarily push a +non-default context, so it is not safe to assume that this will +always return NULL if threads are not initialized.)

+
++ + + + +

Returns :

the thread-default GMainContext, or NULL if the +thread-default context is the global default context. + +
+

Since 2.22

+
+
+
+

g_main_context_push_thread_default ()

+
void                g_main_context_push_thread_default  (GMainContext *context);
+

+Acquires context and sets it as the thread-default context for the +current thread. This will cause certain asynchronous operations +(such as most gio-based I/O) which are +started in this thread to run under context and deliver their +results to its main loop, rather than running under the global +default context in the main thread. Note that calling this function +changes the context returned by +g_main_context_get_thread_default(), not the +one returned by g_main_context_default(), so it does not affect the +context used by functions like g_idle_add(). +

+

+Normally you would call this function shortly after creating a new +thread, passing it a GMainContext which will be run by a +GMainLoop in that thread, to set a new default context for all +async operations in that thread. (In this case, you don't need to +ever call g_main_context_pop_thread_default().) In some cases +however, you may want to schedule a single operation in a +non-default context, or temporarily use a non-default context in +the main thread. In that case, you can wrap the call to the +asynchronous operation inside a +g_main_context_push_thread_default() / +g_main_context_pop_thread_default() pair, but it is up to you to +ensure that no other asynchronous operations accidentally get +started while the non-default context is active. +

+

+Beware that libraries that predate this function may not correctly +handle being used from a thread with a thread-default context. Eg, +see g_file_supports_thread_contexts().

+
++ + + + +

context :

a GMainContext, or NULL for the global default context +
+

Since 2.22

+
+
+
+

g_main_context_pop_thread_default ()

+
void                g_main_context_pop_thread_default   (GMainContext *context);
+

+Pops context off the thread-default context stack (verifying that +it was on the top of the stack).

+
++ + + + +

context :

a GMainContext object, or NULL +
+

Since 2.22

+
+
+
+

g_timeout_source_new ()

+
GSource *           g_timeout_source_new                (guint interval);
+

+Creates a new timeout source. +

+

+The source will not initially be associated with any GMainContext +and must be added to one with g_source_attach() before it will be +executed.

+
++ + + + + + + + + + +

interval :

the timeout interval in milliseconds. +

Returns :

the newly-created timeout source +
+
+
+
+

g_timeout_source_new_seconds ()

+
GSource *           g_timeout_source_new_seconds        (guint interval);
+

+Creates a new timeout source. +

+

+The source will not initially be associated with any GMainContext +and must be added to one with g_source_attach() before it will be +executed. +

+

+The scheduling granularity/accuracy of this timeout source will be +in seconds.

+
++ + + + + + + + + + +

interval :

the timeout interval in seconds +

Returns :

the newly-created timeout source + +
+

Since 2.14

+
+
+
+

g_timeout_add ()

+
guint               g_timeout_add                       (guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data);
+

+Sets a function to be called at regular intervals, with the default +priority, G_PRIORITY_DEFAULT. The function is called repeatedly +until it returns FALSE, at which point the timeout is automatically +destroyed and the function will not be called again. The first call +to the function will be at the end of the first interval. +

+

+Note that timeout functions may be delayed, due to the processing of other +event sources. Thus they should not be relied on for precise timing. +After each call to the timeout function, the time of the next +timeout is recalculated based on the current time and the given interval +(it does not try to 'catch up' time lost in delays). +

+

+If you want to have a timer in the "seconds" range and do not care +about the exact time of the first call of the timer, use the +g_timeout_add_seconds() function; this function allows for more +optimizations and more efficient system power usage. +

+

+This internally creates a main loop source using g_timeout_source_new() +and attaches it to the main loop context using g_source_attach(). You can +do these steps manually if you need greater control.

+
++ + + + + + + + + + + + + + + + + + +

interval :

the time between calls to the function, in milliseconds + (1/1000ths of a second) +

function :

function to call +

data :

data to pass to function +

Returns :

the ID (greater than 0) of the event source. +
+
+
+
+

g_timeout_add_full ()

+
guint               g_timeout_add_full                  (gint priority,
+                                                         guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+

+Sets a function to be called at regular intervals, with the given +priority. The function is called repeatedly until it returns +FALSE, at which point the timeout is automatically destroyed and +the function will not be called again. The notify function is +called when the timeout is destroyed. The first call to the +function will be at the end of the first interval. +

+

+Note that timeout functions may be delayed, due to the processing of other +event sources. Thus they should not be relied on for precise timing. +After each call to the timeout function, the time of the next +timeout is recalculated based on the current time and the given interval +(it does not try to 'catch up' time lost in delays). +

+

+This internally creates a main loop source using g_timeout_source_new() +and attaches it to the main loop context using g_source_attach(). You can +do these steps manually if you need greater control.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

priority :

the priority of the timeout source. Typically this will be in + the range between G_PRIORITY_DEFAULT and G_PRIORITY_HIGH. +

interval :

the time between calls to the function, in milliseconds + (1/1000ths of a second) +

function :

function to call +

data :

data to pass to function +

notify :

function to call when the timeout is removed, or NULL +

Returns :

the ID (greater than 0) of the event source. +
+
+
+
+

g_timeout_add_seconds ()

+
guint               g_timeout_add_seconds               (guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data);
+

+Sets a function to be called at regular intervals with the default +priority, G_PRIORITY_DEFAULT. The function is called repeatedly until +it returns FALSE, at which point the timeout is automatically destroyed +and the function will not be called again. +

+

+This internally creates a main loop source using +g_timeout_source_new_seconds() and attaches it to the main loop context +using g_source_attach(). You can do these steps manually if you need +greater control. Also see g_timout_add_seconds_full().

+
++ + + + + + + + + + + + + + + + + + +

interval :

the time between calls to the function, in seconds +

function :

function to call +

data :

data to pass to function +

Returns :

the ID (greater than 0) of the event source. + +
+

Since 2.14

+
+
+
+

g_timeout_add_seconds_full ()

+
guint               g_timeout_add_seconds_full          (gint priority,
+                                                         guint interval,
+                                                         GSourceFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+

+Sets a function to be called at regular intervals, with priority. +The function is called repeatedly until it returns FALSE, at which +point the timeout is automatically destroyed and the function will +not be called again. +

+

+Unlike g_timeout_add(), this function operates at whole second granularity. +The initial starting point of the timer is determined by the implementation +and the implementation is expected to group multiple timers together so that +they fire all at the same time. +To allow this grouping, the interval to the first timer is rounded +and can deviate up to one second from the specified interval. +Subsequent timer iterations will generally run at the specified interval. +

+

+Note that timeout functions may be delayed, due to the processing of other +event sources. Thus they should not be relied on for precise timing. +After each call to the timeout function, the time of the next +timeout is recalculated based on the current time and the given interval +

+

+If you want timing more precise than whole seconds, use g_timeout_add() +instead. +

+

+The grouping of timers to fire at the same time results in a more power +and CPU efficient behavior so if your timer is in multiples of seconds +and you don't require the first timer exactly one second from now, the +use of g_timeout_add_seconds() is preferred over g_timeout_add(). +

+

+This internally creates a main loop source using +g_timeout_source_new_seconds() and attaches it to the main loop context +using g_source_attach(). You can do these steps manually if you need +greater control.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

priority :

the priority of the timeout source. Typically this will be in + the range between G_PRIORITY_DEFAULT and G_PRIORITY_HIGH. +

interval :

the time between calls to the function, in seconds +

function :

function to call +

data :

data to pass to function +

notify :

function to call when the timeout is removed, or NULL +

Returns :

the ID (greater than 0) of the event source. + +
+

Since 2.14

+
+
+
+

g_idle_source_new ()

+
GSource *           g_idle_source_new                   (void);
+

+Creates a new idle source. +

+

+The source will not initially be associated with any GMainContext +and must be added to one with g_source_attach() before it will be +executed. Note that the default priority for idle sources is +G_PRIORITY_DEFAULT_IDLE, as compared to other sources which +have a default priority of G_PRIORITY_DEFAULT.

+
++ + + + +

Returns :

the newly-created idle source +
+
+
+
+

g_idle_add ()

+
guint               g_idle_add                          (GSourceFunc function,
+                                                         gpointer data);
+

+Adds a function to be called whenever there are no higher priority +events pending to the default main loop. The function is given the +default idle priority, G_PRIORITY_DEFAULT_IDLE. If the function +returns FALSE it is automatically removed from the list of event +sources and will not be called again. +

+

+This internally creates a main loop source using g_idle_source_new() +and attaches it to the main loop context using g_source_attach(). +You can do these steps manually if you need greater control.

+
++ + + + + + + + + + + + + + +

function :

function to call +

data :

data to pass to function. +

Returns :

the ID (greater than 0) of the event source. +
+
+
+
+

g_idle_add_full ()

+
guint               g_idle_add_full                     (gint priority,
+                                                         GSourceFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+

+Adds a function to be called whenever there are no higher priority +events pending. If the function returns FALSE it is automatically +removed from the list of event sources and will not be called again. +

+

+This internally creates a main loop source using g_idle_source_new() +and attaches it to the main loop context using g_source_attach(). +You can do these steps manually if you need greater control.

+
++ + + + + + + + + + + + + + + + + + + + + + +

priority :

the priority of the idle source. Typically this will be in the + range between G_PRIORITY_DEFAULT_IDLE and G_PRIORITY_HIGH_IDLE. +

function :

function to call +

data :

data to pass to function +

notify :

function to call when the idle is removed, or NULL +

Returns :

the ID (greater than 0) of the event source. +
+
+
+
+

g_idle_remove_by_data ()

+
gboolean            g_idle_remove_by_data               (gpointer data);
+

+Removes the idle function with the given data.

+
++ + + + + + + + + + +

data :

the data for the idle source's callback. +

Returns :

TRUE if an idle source was found and removed. +
+
+
+
+

GPid

+
typedef int GPid;
+
+

+A type which is used to hold a process identification. +On Unix, processes are identified by a process id (an +integer), while Windows uses process handles (which are +pointers). +

+
+
+
+

GChildWatchFunc ()

+
void                (*GChildWatchFunc)                  (GPid pid,
+                                                         gint status,
+                                                         gpointer data);
+

+The type of functions to be called when a child exists. +

+
++ + + + + + + + + + + + + + +

pid :

the process id of the child process +

status :

Status information about the child process, + see waitpid(2) for more information about this field +

data :

user data passed to g_child_watch_add() +
+
+
+
+

g_child_watch_source_new ()

+
GSource *           g_child_watch_source_new            (GPid pid);
+

+Creates a new child_watch source. +

+

+The source will not initially be associated with any GMainContext +and must be added to one with g_source_attach() before it will be +executed. +

+

+Note that child watch sources can only be used in conjunction with +g_spawn... when the G_SPAWN_DO_NOT_REAP_CHILD +flag is used. +

+

+Note that on platforms where GPid must be explicitly closed +(see g_spawn_close_pid()) pid must not be closed while the +source is still active. Typically, you will want to call +g_spawn_close_pid() in the callback function for the source. +

+

+Note further that using g_child_watch_source_new() is not +compatible with calling waitpid(-1) in +the application. Calling waitpid() for individual pids will +still work fine.

+
++ + + + + + + + + + +

pid :

process to watch. On POSIX the pid of a child process. On +Windows a handle for a process (which doesn't have to be a child). +

Returns :

the newly-created child watch source + +
+

Since 2.4

+
+
+
+

g_child_watch_add ()

+
guint               g_child_watch_add                   (GPid pid,
+                                                         GChildWatchFunc function,
+                                                         gpointer data);
+

+Sets a function to be called when the child indicated by pid +exits, at a default priority, G_PRIORITY_DEFAULT. +

+

+If you obtain pid from g_spawn_async() or g_spawn_async_with_pipes() +you will need to pass G_SPAWN_DO_NOT_REAP_CHILD as flag to +the spawn function for the child watching to work. +

+

+Note that on platforms where GPid must be explicitly closed +(see g_spawn_close_pid()) pid must not be closed while the +source is still active. Typically, you will want to call +g_spawn_close_pid() in the callback function for the source. +

+

+GLib supports only a single callback per process id. +

+

+This internally creates a main loop source using +g_child_watch_source_new() and attaches it to the main loop context +using g_source_attach(). You can do these steps manually if you +need greater control.

+
++ + + + + + + + + + + + + + + + + + +

pid :

process id to watch. On POSIX the pid of a child process. On +Windows a handle for a process (which doesn't have to be a child). +

function :

function to call +

data :

data to pass to function +

Returns :

the ID (greater than 0) of the event source. + +
+

Since 2.4

+
+
+
+

g_child_watch_add_full ()

+
guint               g_child_watch_add_full              (gint priority,
+                                                         GPid pid,
+                                                         GChildWatchFunc function,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+

+Sets a function to be called when the child indicated by pid +exits, at the priority priority. +

+

+If you obtain pid from g_spawn_async() or g_spawn_async_with_pipes() +you will need to pass G_SPAWN_DO_NOT_REAP_CHILD as flag to +the spawn function for the child watching to work. +

+

+Note that on platforms where GPid must be explicitly closed +(see g_spawn_close_pid()) pid must not be closed while the +source is still active. Typically, you will want to call +g_spawn_close_pid() in the callback function for the source. +

+

+GLib supports only a single callback per process id. +

+

+This internally creates a main loop source using +g_child_watch_source_new() and attaches it to the main loop context +using g_source_attach(). You can do these steps manually if you +need greater control.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

priority :

the priority of the idle source. Typically this will be in the + range between G_PRIORITY_DEFAULT_IDLE and G_PRIORITY_HIGH_IDLE. +

pid :

process to watch. On POSIX the pid of a child process. On +Windows a handle for a process (which doesn't have to be a child). +

function :

function to call +

data :

data to pass to function +

notify :

function to call when the idle is removed, or NULL +

Returns :

the ID (greater than 0) of the event source. + +
+

Since 2.4

+
+
+
+

GPollFD

+
typedef struct {
+#if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8
+  gint64 fd;
+#else
+  gint		fd;
+#endif
+  gushort 	events;
+  gushort 	revents;
+} GPollFD;
+
+

+

+
++++ + + + + + + + + + + + + + + +
+gint fd;the file descriptor to poll (or a HANDLE on Win32 platforms).
+gushort events;a bitwise combination of flags from GIOCondition, specifying which +events should be polled for. Typically for reading from a file descriptor +you would use G_IO_IN | G_IO_HUP | G_IO_ERR, and for writing you would use +G_IO_OUT | G_IO_ERR. +
+gushort revents;a bitwise combination of flags from GIOCondition, returned from the +poll() function to indicate which events occurred. +
+

+

+
+
+
+

g_poll ()

+
gint                g_poll                              (GPollFD *fds,
+                                                         guint nfds,
+                                                         gint timeout);
+

+Polls fds, as with the poll() system call, but portably. (On +systems that don't have poll(), it is emulated using select().) +This is used internally by GMainContext, but it can be called +directly if you need to block until a file descriptor is ready, but +don't want to run the full main loop. +

+

+Each element of fds is a GPollFD describing a single file +descriptor to poll. The fd field indicates the file descriptor, +and the events field indicates the events to poll for. On return, +the revents fields will be filled with the events that actually +occurred. +

+

+On POSIX systems, the file descriptors in fds can be any sort of +file descriptor, but the situation is much more complicated on +Windows. If you need to use g_poll() in code that has to run on +Windows, the easiest solution is to construct all of your +GPollFDs with g_io_channel_win32_make_pollfd().

+
++ + + + + + + + + + + + + + + + + + +

fds :

file descriptors to poll +

nfds :

the number of file descriptors in fds +

timeout :

amount of time to wait, in milliseconds, or -1 to wait forever +

Returns :

the number of entries in fds whose revents fields +were filled in, or 0 if the operation timed out, or -1 on error or +if the call was interrupted. + +
+

Since 2.20

+
+
+
+

G_POLLFD_FORMAT

+
#define             G_POLLFD_FORMAT
+

+

+
+
+
+

GSource

+
typedef struct {
+} GSource;
+
+

+The GSource struct is an opaque data type representing +an event source. +

+
+
+
+

GSourceDummyMarshal ()

+
void                (*GSourceDummyMarshal)              (void);
+

+This is just a placeholder for GClosureMarshal, which cannot be used here +for dependency reasons. +

+
+
+
+

GSourceFuncs

+
typedef struct {
+  gboolean (*prepare)  (GSource    *source,
+			gint       *timeout_);
+  gboolean (*check)    (GSource    *source);
+  gboolean (*dispatch) (GSource    *source,
+			GSourceFunc callback,
+			gpointer    user_data);
+  void     (*finalize) (GSource    *source); /* Can be NULL */
+
+  /* For use by g_source_set_closure */
+  GSourceFunc     closure_callback;	   
+  GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
+} GSourceFuncs;
+
+

+The GSourceFuncs struct contains a table of functions used to handle +event sources in a generic manner. +

+

+For idle sources, the prepare and check functions always return TRUE to +indicate that the source is always ready to be processed. +The prepare function also returns a timeout value of 0 to ensure that the +poll() call doesn't block (since that would be time +wasted which could have been spent running the idle function). +

+

+For timeout sources, the prepare and check functions both return TRUE if the +timeout interval has expired. The prepare function also returns a timeout +value to ensure that the poll() call doesn't block too +long and miss the next timeout. +

+

+For file descriptor sources, the prepare function typically returns FALSE, +since it must wait until poll() has been called before +it knows whether any events need to be processed. It sets the returned +timeout to -1 to indicate that it doesn't mind how long the +poll() call blocks. +In the check function, it tests the results of the poll() +call to see if the required condition has been met, and returns TRUE if so. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

prepare ()

Called before all the file descriptors are polled. +If the source can determine that it is ready here (without waiting for the +results of the poll() call) it should return TRUE. +It can also return a timeout_ value which should be the maximum timeout +(in milliseconds) which should be passed to the poll() call. +The actual timeout used will be -1 if all sources returned -1, or it will +be the minimum of all the timeout_ values returned which were >= 0. +

check ()

Called after all the file descriptors are polled. +The source should return TRUE if it is ready to be dispatched. +Note that some time may have passed since the previous prepare function was +called, so the source should be checked again here. +

dispatch ()

Called to dispatch the event source, after it has returned TRUE in +either its prepare or its check function. The dispatch function is +passed in a callback function and data. The callback function may be +NULL if the source was never connected to a callback using +g_source_set_callback(). The dispatch function should call the +callback function with user_data and whatever additional parameters are +needed for this type of event source. +

finalize ()

Called when the source is finalized. +

GSourceFunc closure_callback;

+

GSourceDummyMarshal closure_marshal;

+
+
+
+
+

GSourceCallbackFuncs

+
typedef struct {
+  void (*ref)   (gpointer     cb_data);
+  void (*unref) (gpointer     cb_data);
+  void (*get)   (gpointer     cb_data,
+		 GSource     *source, 
+		 GSourceFunc *func,
+		 gpointer    *data);
+} GSourceCallbackFuncs;
+
+

+The GSourceCallbackFuncs struct contains +functions for managing callback objects. +

+
++ + + + + + + + + + + + + + +

ref ()

Called when a reference is added to the callback object. +

unref ()

Called when a reference to the callback object is dropped. +

get ()

Called to extract the callback function and data from the callback object. +
+
+
+
+

g_source_new ()

+
GSource *           g_source_new                        (GSourceFuncs *source_funcs,
+                                                         guint struct_size);
+

+Creates a new GSource structure. The size is specified to +allow creating structures derived from GSource that contain +additional data. The size passed in must be at least +sizeof (GSource). +

+

+The source will not initially be associated with any GMainContext +and must be added to one with g_source_attach() before it will be +executed.

+
++ + + + + + + + + + + + + + +

source_funcs :

structure containing functions that implement + the sources behavior. +

struct_size :

size of the GSource structure to create. +

Returns :

the newly-created GSource. +
+
+
+
+

g_source_ref ()

+
GSource *           g_source_ref                        (GSource *source);
+

+Increases the reference count on a source by one.

+
++ + + + + + + + + + +

source :

a GSource +

Returns :

source +
+
+
+
+

g_source_unref ()

+
void                g_source_unref                      (GSource *source);
+

+Decreases the reference count of a source by one. If the +resulting reference count is zero the source and associated +memory will be destroyed.

+
++ + + + +

source :

a GSource +
+
+
+
+

g_source_set_funcs ()

+
void                g_source_set_funcs                  (GSource *source,
+                                                         GSourceFuncs *funcs);
+

+Sets the source functions (can be used to override +default implementations) of an unattached source.

+
++ + + + + + + + + + +

source :

a GSource +

funcs :

the new GSourceFuncs +
+

Since 2.12

+
+
+
+

g_source_attach ()

+
guint               g_source_attach                     (GSource *source,
+                                                         GMainContext *context);
+

+Adds a GSource to a context so that it will be executed within +that context. Remove it by calling g_source_destroy().

+
++ + + + + + + + + + + + + + +

source :

a GSource +

context :

a GMainContext (if NULL, the default context will be used) +

Returns :

the ID (greater than 0) for the source within the + GMainContext. +
+
+
+
+

g_source_destroy ()

+
void                g_source_destroy                    (GSource *source);
+

+Removes a source from its GMainContext, if any, and mark it as +destroyed. The source cannot be subsequently added to another +context.

+
++ + + + +

source :

a GSource +
+
+
+
+

g_source_is_destroyed ()

+
gboolean            g_source_is_destroyed               (GSource *source);
+

+Returns whether source has been destroyed. +

+

+This is important when you operate upon your objects +from within idle handlers, but may have freed the object +before the dispatch of your idle handler. +

+

+

+
+static gboolean 
+idle_callback (gpointer data)
+{
+  SomeWidget *self = data;
+   
+  GDK_THREADS_ENTER ();
+  /* do stuff with self */
+  self->idle_id = 0;
+  GDK_THREADS_LEAVE ();
+   
+  return FALSE;
+}
+ 
+static void 
+some_widget_do_stuff_later (SomeWidget *self)
+{
+  self->idle_id = g_idle_add (idle_callback, self);
+}
+ 
+static void 
+some_widget_finalize (GObject *object)
+{
+  SomeWidget *self = SOME_WIDGET (object);
+   
+  if (self->idle_id)
+    g_source_remove (self->idle_id);
+   
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+

+

+

+This will fail in a multi-threaded application if the +widget is destroyed before the idle handler fires due +to the use after free in the callback. A solution, to +this particular problem, is to check to if the source +has already been destroy within the callback. +

+

+

+
+static gboolean 
+idle_callback (gpointer data)
+{
+  SomeWidget *self = data;
+  
+  GDK_THREADS_ENTER ();
+  if (!g_source_is_destroyed (g_main_current_source ()))
+    {
+      /* do stuff with self */
+    }
+  GDK_THREADS_LEAVE ();
+  
+  return FALSE;
+}
+
+
++ + + + + + + + + + +

source :

a GSource +

Returns :

TRUE if the source has been destroyed + +
+

Since 2.12

+
+
+
+

g_source_set_priority ()

+
void                g_source_set_priority               (GSource *source,
+                                                         gint priority);
+

+Sets the priority of a source. While the main loop is being +run, a source will be dispatched if it is ready to be dispatched and no sources +at a higher (numerically smaller) priority are ready to be dispatched.

+
++ + + + + + + + + + +

source :

a GSource +

priority :

the new priority. +
+
+
+
+

g_source_get_priority ()

+
gint                g_source_get_priority               (GSource *source);
+

+Gets the priority of a source.

+
++ + + + + + + + + + +

source :

a GSource +

Returns :

the priority of the source +
+
+
+
+

g_source_set_can_recurse ()

+
void                g_source_set_can_recurse            (GSource *source,
+                                                         gboolean can_recurse);
+

+Sets whether a source can be called recursively. If can_recurse is +TRUE, then while the source is being dispatched then this source +will be processed normally. Otherwise, all processing of this +source is blocked until the dispatch function returns.

+
++ + + + + + + + + + +

source :

a GSource +

can_recurse :

whether recursion is allowed for this source +
+
+
+
+

g_source_get_can_recurse ()

+
gboolean            g_source_get_can_recurse            (GSource *source);
+

+Checks whether a source is allowed to be called recursively. +see g_source_set_can_recurse().

+
++ + + + + + + + + + +

source :

a GSource +

Returns :

whether recursion is allowed. +
+
+
+
+

g_source_get_id ()

+
guint               g_source_get_id                     (GSource *source);
+

+Returns the numeric ID for a particular source. The ID of a source +is a positive integer which is unique within a particular main loop +context. The reverse +mapping from ID to source is done by g_main_context_find_source_by_id().

+
++ + + + + + + + + + +

source :

a GSource +

Returns :

the ID (greater than 0) for the source +
+
+
+
+

g_source_get_context ()

+
GMainContext *      g_source_get_context                (GSource *source);
+

+Gets the GMainContext with which the source is associated. +Calling this function on a destroyed source is an error.

+
++ + + + + + + + + + +

source :

a GSource +

Returns :

the GMainContext with which the source is associated, + or NULL if the context has not yet been added + to a source. +
+
+
+
+

g_source_set_callback ()

+
void                g_source_set_callback               (GSource *source,
+                                                         GSourceFunc func,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+

+Sets the callback function for a source. The callback for a source is +called from the source's dispatch function. +

+

+The exact type of func depends on the type of source; ie. you +should not count on func being called with data as its first +parameter. +

+

+Typically, you won't use this function. Instead use functions specific +to the type of source you are using.

+
++ + + + + + + + + + + + + + + + + + +

source :

the source +

func :

a callback function +

data :

the data to pass to callback function +

notify :

a function to call when data is no longer in use, or NULL. +
+
+
+
+

GSourceFunc ()

+
gboolean            (*GSourceFunc)                      (gpointer data);
+

+Specifies the type of function passed to g_timeout_add(), g_timeout_add_full(), +g_idle_add(), and g_idle_add_full(). +

+
++ + + + + + + + + + +

data :

data passed to the function, set when the source was created with one +of the above functions. +

Returns :

it should return FALSE if the source should be removed. +
+
+
+
+

g_source_set_callback_indirect ()

+
void                g_source_set_callback_indirect      (GSource *source,
+                                                         gpointer callback_data,
+                                                         GSourceCallbackFuncs *callback_funcs);
+

+Sets the callback function storing the data as a refcounted callback +"object". This is used internally. Note that calling +g_source_set_callback_indirect() assumes +an initial reference count on callback_data, and thus +callback_funcs->unref will eventually be called once more +than callback_funcs->ref.

+
++ + + + + + + + + + + + + + +

source :

the source +

callback_data :

pointer to callback data "object" +

callback_funcs :

functions for reference counting callback_data + and getting the callback and data +
+
+
+
+

g_source_add_poll ()

+
void                g_source_add_poll                   (GSource *source,
+                                                         GPollFD *fd);
+

+Adds a file descriptor to the set of file descriptors polled for +this source. This is usually combined with g_source_new() to add an +event source. The event source's check function will typically test +the revents field in the GPollFD struct and return TRUE if events need +to be processed.

+
++ + + + + + + + + + +

source :

a GSource +

fd :

a GPollFD structure holding information about a file + descriptor to watch. +
+
+
+
+

g_source_remove_poll ()

+
void                g_source_remove_poll                (GSource *source,
+                                                         GPollFD *fd);
+

+Removes a file descriptor from the set of file descriptors polled for +this source.

+
++ + + + + + + + + + +

source :

a GSource +

fd :

a GPollFD structure previously passed to g_source_add_poll(). +
+
+
+
+

g_source_get_current_time ()

+
void                g_source_get_current_time           (GSource *source,
+                                                         GTimeVal *timeval);
+

+Gets the "current time" to be used when checking +this source. The advantage of calling this function over +calling g_get_current_time() directly is that when +checking multiple sources, GLib can cache a single value +instead of having to repeatedly get the system time.

+
++ + + + + + + + + + +

source :

a GSource +

timeval :

GTimeVal structure in which to store current time. +
+
+
+
+

g_source_remove ()

+
gboolean            g_source_remove                     (guint tag);
+

+Removes the source with the given id from the default main context. +The id of +a GSource is given by g_source_get_id(), or will be returned by the +functions g_source_attach(), g_idle_add(), g_idle_add_full(), +g_timeout_add(), g_timeout_add_full(), g_child_watch_add(), +g_child_watch_add_full(), g_io_add_watch(), and g_io_add_watch_full(). +

+

+See also g_source_destroy(). You must use g_source_destroy() for sources +added to a non-default main context.

+
++ + + + + + + + + + +

tag :

the ID of the source to remove. +

Returns :

TRUE if the source was found and removed. +
+
+
+
+

g_source_remove_by_funcs_user_data ()

+
gboolean            g_source_remove_by_funcs_user_data  (GSourceFuncs *funcs,
+                                                         gpointer user_data);
+

+Removes a source from the default main loop context given the +source functions and user data. If multiple sources exist with the +same source functions and user data, only one will be destroyed.

+
++ + + + + + + + + + + + + + +

funcs :

The source_funcs passed to g_source_new() +

user_data :

the user data for the callback +

Returns :

TRUE if a source was found and removed. +
+
+
+
+

g_source_remove_by_user_data ()

+
gboolean            g_source_remove_by_user_data        (gpointer user_data);
+

+Removes a source from the default main loop context given the user +data for the callback. If multiple sources exist with the same user +data, only one will be destroyed.

+
++ + + + + + + + + + +

user_data :

the user_data for the callback. +

Returns :

TRUE if a source was found and removed. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Thread-Pools.html b/docs/reference/glib/html/glib-Thread-Pools.html new file mode 100644 index 0000000..68d02ee --- /dev/null +++ b/docs/reference/glib/html/glib-Thread-Pools.html @@ -0,0 +1,610 @@ + + + + +Thread Pools + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Thread Pools

+

Thread Pools — pools of threads to execute work concurrently

+
+ +
+

Description

+

+Sometimes you wish to asynchronously fork out the execution of work +and continue working in your own thread. If that will happen often, +the overhead of starting and destroying a thread each time might be +too high. In such cases reusing already started threads seems like a +good idea. And it indeed is, but implementing this can be tedious +and error-prone. +

+

+Therefore GLib provides thread pools for your convenience. An added +advantage is, that the threads can be shared between the different +subsystems of your program, when they are using GLib. +

+

+To create a new thread pool, you use g_thread_pool_new(). It is +destroyed by g_thread_pool_free(). +

+

+If you want to execute a certain task within a thread pool, you call +g_thread_pool_push(). +

+

+To get the current number of running threads you call +g_thread_pool_get_num_threads(). To get the number of still +unprocessed tasks you call g_thread_pool_unprocessed(). To control +the maximal number of threads for a thread pool, you use +g_thread_pool_get_max_threads() and g_thread_pool_set_max_threads(). +

+

+Finally you can control the number of unused threads, that are kept +alive by GLib for future use. The current number can be fetched with +g_thread_pool_get_num_unused_threads(). The maximal number can be +controlled by g_thread_pool_get_max_unused_threads() and +g_thread_pool_set_max_unused_threads(). All currently unused threads +can be stopped by calling g_thread_pool_stop_unused_threads().

+
+
+

Details

+
+

GThreadPool

+
typedef struct {
+  GFunc func;
+  gpointer user_data;
+  gboolean exclusive;
+} GThreadPool;
+
+

+The GThreadPool struct represents a thread pool. It has three +public read-only members, but the underlying struct is bigger, so +you must not copy this struct.

+
++ + + + + + + + + + + + + + +

GFunc func;

the function to execute in the threads of this pool +

gpointer user_data;

the user data for the threads of this pool +

gboolean exclusive;

are all threads exclusive to this pool +
+
+
+
+

g_thread_pool_new ()

+
GThreadPool*        g_thread_pool_new                   (GFunc func,
+                                                         gpointer user_data,
+                                                         gint max_threads,
+                                                         gboolean exclusive,
+                                                         GError **error);
+

+This function creates a new thread pool. +

+

+Whenever you call g_thread_pool_push(), either a new thread is +created or an unused one is reused. At most max_threads threads +are running concurrently for this thread pool. max_threads = -1 +allows unlimited threads to be created for this thread pool. The +newly created or reused thread now executes the function func with +the two arguments. The first one is the parameter to +g_thread_pool_push() and the second one is user_data. +

+

+The parameter exclusive determines, whether the thread pool owns +all threads exclusive or whether the threads are shared +globally. If exclusive is TRUE, max_threads threads are started +immediately and they will run exclusively for this thread pool until +it is destroyed by g_thread_pool_free(). If exclusive is FALSE, +threads are created, when needed and shared between all +non-exclusive thread pools. This implies that max_threads may not +be -1 for exclusive thread pools. +

+

+error can be NULL to ignore errors, or non-NULL to report +errors. An error can only occur when exclusive is set to TRUE and +not all max_threads threads could be created.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

func :

a function to execute in the threads of the new thread pool +

user_data :

user data that is handed over to func every time it + is called +

max_threads :

the maximal number of threads to execute concurrently in + the new thread pool, -1 means no limit +

exclusive :

should this thread pool be exclusive? +

error :

return location for error +

Returns :

the new GThreadPool +
+
+
+
+

g_thread_pool_push ()

+
void                g_thread_pool_push                  (GThreadPool *pool,
+                                                         gpointer data,
+                                                         GError **error);
+

+Inserts data into the list of tasks to be executed by pool. When +the number of currently running threads is lower than the maximal +allowed number of threads, a new thread is started (or reused) with +the properties given to g_thread_pool_new(). Otherwise data stays +in the queue until a thread in this pool finishes its previous task +and processes data. +

+

+error can be NULL to ignore errors, or non-NULL to report +errors. An error can only occur when a new thread couldn't be +created. In that case data is simply appended to the queue of work +to do.

+
++ + + + + + + + + + + + + + +

pool :

a GThreadPool +

data :

a new task for pool +

error :

return location for error +
+
+
+
+

g_thread_pool_set_max_threads ()

+
void                g_thread_pool_set_max_threads       (GThreadPool *pool,
+                                                         gint max_threads,
+                                                         GError **error);
+

+Sets the maximal allowed number of threads for pool. A value of -1 +means, that the maximal number of threads is unlimited. +

+

+Setting max_threads to 0 means stopping all work for pool. It is +effectively frozen until max_threads is set to a non-zero value +again. +

+

+A thread is never terminated while calling func, as supplied by +g_thread_pool_new(). Instead the maximal number of threads only +has effect for the allocation of new threads in g_thread_pool_push(). +A new thread is allocated, whenever the number of currently +running threads in pool is smaller than the maximal number. +

+

+error can be NULL to ignore errors, or non-NULL to report +errors. An error can only occur when a new thread couldn't be +created.

+
++ + + + + + + + + + + + + + +

pool :

a GThreadPool +

max_threads :

a new maximal number of threads for pool +

error :

return location for error +
+
+
+
+

g_thread_pool_get_max_threads ()

+
gint                g_thread_pool_get_max_threads       (GThreadPool *pool);
+

+Returns the maximal number of threads for pool.

+
++ + + + + + + + + + +

pool :

a GThreadPool +

Returns :

the maximal number of threads +
+
+
+
+

g_thread_pool_get_num_threads ()

+
guint               g_thread_pool_get_num_threads       (GThreadPool *pool);
+

+Returns the number of threads currently running in pool.

+
++ + + + + + + + + + +

pool :

a GThreadPool +

Returns :

the number of threads currently running +
+
+
+
+

g_thread_pool_unprocessed ()

+
guint               g_thread_pool_unprocessed           (GThreadPool *pool);
+

+Returns the number of tasks still unprocessed in pool.

+
++ + + + + + + + + + +

pool :

a GThreadPool +

Returns :

the number of unprocessed tasks +
+
+
+
+

g_thread_pool_free ()

+
void                g_thread_pool_free                  (GThreadPool *pool,
+                                                         gboolean immediate,
+                                                         gboolean wait_);
+

+Frees all resources allocated for pool. +

+

+If immediate is TRUE, no new task is processed for +pool. Otherwise pool is not freed before the last task is +processed. Note however, that no thread of this pool is +interrupted, while processing a task. Instead at least all still +running threads can finish their tasks before the pool is freed. +

+

+If wait_ is TRUE, the functions does not return before all tasks +to be processed (dependent on immediate, whether all or only the +currently running) are ready. Otherwise the function returns immediately. +

+

+After calling this function pool must not be used anymore.

+
++ + + + + + + + + + + + + + +

pool :

a GThreadPool +

immediate :

should pool shut down immediately? +

wait_ :

should the function wait for all tasks to be finished? +
+
+
+
+

g_thread_pool_set_max_unused_threads ()

+
void                g_thread_pool_set_max_unused_threads
+                                                        (gint max_threads);
+

+Sets the maximal number of unused threads to max_threads. If +max_threads is -1, no limit is imposed on the number of unused +threads.

+
++ + + + +

max_threads :

maximal number of unused threads +
+
+
+
+

g_thread_pool_get_max_unused_threads ()

+
gint                g_thread_pool_get_max_unused_threads
+                                                        (void);
+

+Returns the maximal allowed number of unused threads.

+
++ + + + +

Returns :

the maximal number of unused threads +
+
+
+
+

g_thread_pool_get_num_unused_threads ()

+
guint               g_thread_pool_get_num_unused_threads
+                                                        (void);
+

+Returns the number of currently unused threads.

+
++ + + + +

Returns :

the number of currently unused threads +
+
+
+
+

g_thread_pool_stop_unused_threads ()

+
void                g_thread_pool_stop_unused_threads   (void);
+

+Stops all currently unused threads. This does not change the +maximal number of unused threads. This function can be used to +regularly stop all unused threads e.g. from g_timeout_add().

+
+
+
+

g_thread_pool_set_sort_function ()

+
void                g_thread_pool_set_sort_function     (GThreadPool *pool,
+                                                         GCompareDataFunc func,
+                                                         gpointer user_data);
+

+Sets the function used to sort the list of tasks. This allows the +tasks to be processed by a priority determined by func, and not +just in the order in which they were added to the pool. +

+

+Note, if the maximum number of threads is more than 1, the order +that threads are executed can not be guranteed 100%. Threads are +scheduled by the operating system and are executed at random. It +cannot be assumed that threads are executed in the order they are +created.

+
++ + + + + + + + + + + + + + +

pool :

a GThreadPool +

func :

the GCompareDataFunc used to sort the list of tasks. + This function is passed two tasks. It should return + 0 if the order in which they are handled does not matter, + a negative value if the first task should be processed before + the second or a positive value if the second task should be + processed first. +

user_data :

user data passed to func. +
+

Since 2.10

+
+
+
+

g_thread_pool_set_max_idle_time ()

+
void                g_thread_pool_set_max_idle_time     (guint interval);
+

+This function will set the maximum interval that a thread waiting +in the pool for new tasks can be idle for before being +stopped. This function is similar to calling +g_thread_pool_stop_unused_threads() on a regular timeout, except, +this is done on a per thread basis. +

+

+By setting interval to 0, idle threads will not be stopped. + +This function makes use of g_async_queue_timed_pop() using +interval.

+
++ + + + +

interval :

the maximum interval (1/1000ths of a second) a thread + can be idle. +
+

Since 2.10

+
+
+
+

g_thread_pool_get_max_idle_time ()

+
guint               g_thread_pool_get_max_idle_time     (void);
+

+This function will return the maximum interval that a thread will +wait in the thread pool for new tasks before being stopped. +

+

+If this function returns 0, threads waiting in the thread pool for +new work are not stopped.

+
++ + + + +

Returns :

the maximum interval to wait for new tasks in the + thread pool before stopping the thread (1/1000ths of a second). + +
+

Since 2.10

+
+
+
+

See Also

+

+
++ + + + +

GThread

GLib thread + system.

+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Threads.html b/docs/reference/glib/html/glib-Threads.html new file mode 100644 index 0000000..d467152 --- /dev/null +++ b/docs/reference/glib/html/glib-Threads.html @@ -0,0 +1,2986 @@ + + + + +Threads + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Threads

+

Threads — thread abstraction; including threads, different + mutexes, conditions and thread private data

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_THREADS_ENABLED
+#define             G_THREADS_IMPL_POSIX
+#define             G_THREADS_IMPL_NONE
+
+#define             G_THREAD_ERROR
+enum                GThreadError;
+
+                    GThreadFunctions;
+void                g_thread_init                       (GThreadFunctions *vtable);
+gboolean            g_thread_supported                  ();
+gboolean            g_thread_get_initialized            (void);
+
+gpointer            (*GThreadFunc)                      (gpointer data);
+enum                GThreadPriority;
+                    GThread;
+GThread *           g_thread_create                     (GThreadFunc func,
+                                                         gpointer data,
+                                                         gboolean joinable,
+                                                         GError **error);
+GThread*            g_thread_create_full                (GThreadFunc func,
+                                                         gpointer data,
+                                                         gulong stack_size,
+                                                         gboolean joinable,
+                                                         gboolean bound,
+                                                         GThreadPriority priority,
+                                                         GError **error);
+GThread*            g_thread_self                       (void);
+gpointer            g_thread_join                       (GThread *thread);
+void                g_thread_set_priority               (GThread *thread,
+                                                         GThreadPriority priority);
+void                g_thread_yield                      ();
+void                g_thread_exit                       (gpointer retval);
+void                g_thread_foreach                    (GFunc thread_func,
+                                                         gpointer user_data);
+
+                    GMutex;
+GMutex *            g_mutex_new                         ();
+void                g_mutex_lock                        (GMutex *mutex);
+gboolean            g_mutex_trylock                     (GMutex *mutex);
+void                g_mutex_unlock                      (GMutex *mutex);
+void                g_mutex_free                        (GMutex *mutex);
+
+                    GStaticMutex;
+#define             G_STATIC_MUTEX_INIT
+void                g_static_mutex_init                 (GStaticMutex *mutex);
+void                g_static_mutex_lock                 (GStaticMutex *mutex);
+gboolean            g_static_mutex_trylock              (GStaticMutex *mutex);
+void                g_static_mutex_unlock               (GStaticMutex *mutex);
+GMutex *            g_static_mutex_get_mutex            (GStaticMutex *mutex);
+void                g_static_mutex_free                 (GStaticMutex *mutex);
+
+#define             G_LOCK_DEFINE                       (name)
+#define             G_LOCK_DEFINE_STATIC                (name)
+#define             G_LOCK_EXTERN                       (name)
+#define             G_LOCK                              (name)
+#define             G_TRYLOCK                           (name)
+#define             G_UNLOCK                            (name)
+
+                    GStaticRecMutex;
+#define             G_STATIC_REC_MUTEX_INIT
+void                g_static_rec_mutex_init             (GStaticRecMutex *mutex);
+void                g_static_rec_mutex_lock             (GStaticRecMutex *mutex);
+gboolean            g_static_rec_mutex_trylock          (GStaticRecMutex *mutex);
+void                g_static_rec_mutex_unlock           (GStaticRecMutex *mutex);
+void                g_static_rec_mutex_lock_full        (GStaticRecMutex *mutex,
+                                                         guint depth);
+guint               g_static_rec_mutex_unlock_full      (GStaticRecMutex *mutex);
+void                g_static_rec_mutex_free             (GStaticRecMutex *mutex);
+
+                    GStaticRWLock;
+#define             G_STATIC_RW_LOCK_INIT
+void                g_static_rw_lock_init               (GStaticRWLock *lock);
+void                g_static_rw_lock_reader_lock        (GStaticRWLock *lock);
+gboolean            g_static_rw_lock_reader_trylock     (GStaticRWLock *lock);
+void                g_static_rw_lock_reader_unlock      (GStaticRWLock *lock);
+void                g_static_rw_lock_writer_lock        (GStaticRWLock *lock);
+gboolean            g_static_rw_lock_writer_trylock     (GStaticRWLock *lock);
+void                g_static_rw_lock_writer_unlock      (GStaticRWLock *lock);
+void                g_static_rw_lock_free               (GStaticRWLock *lock);
+
+                    GCond;
+GCond*              g_cond_new                          ();
+void                g_cond_signal                       (GCond *cond);
+void                g_cond_broadcast                    (GCond *cond);
+void                g_cond_wait                         (GCond *cond,
+                                                         GMutex *mutex);
+gboolean            g_cond_timed_wait                   (GCond *cond,
+                                                         GMutex *mutex,
+                                                         GTimeVal *abs_time);
+void                g_cond_free                         (GCond *cond);
+
+                    GPrivate;
+GPrivate*           g_private_new                       (GDestroyNotify destructor);
+gpointer            g_private_get                       (GPrivate *private_key);
+void                g_private_set                       (GPrivate *private_key,
+                                                         gpointer data);
+
+                    GStaticPrivate;
+#define             G_STATIC_PRIVATE_INIT
+void                g_static_private_init               (GStaticPrivate *private_key);
+gpointer            g_static_private_get                (GStaticPrivate *private_key);
+void                g_static_private_set                (GStaticPrivate *private_key,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+void                g_static_private_free               (GStaticPrivate *private_key);
+
+                    GOnce;
+enum                GOnceStatus;
+#define             G_ONCE_INIT
+#define             g_once                              (once, func, arg)
+gboolean            g_once_init_enter                   (volatile gsize *value_location);
+void                g_once_init_leave                   (volatile gsize *value_location,
+                                                         gsize initialization_value);
+
+void                g_bit_lock                          (volatile gint *address,
+                                                         gint lock_bit);
+gboolean            g_bit_trylock                       (volatile gint *address,
+                                                         gint lock_bit);
+void                g_bit_unlock                        (volatile gint *address,
+                                                         gint lock_bit);
+
+
+
+

Description

+

+Threads act almost like processes, but unlike processes all threads +of one process share the same memory. This is good, as it provides +easy communication between the involved threads via this shared +memory, and it is bad, because strange things (so called +"Heisenbugs") might happen if the program is not carefully designed. +In particular, due to the concurrent nature of threads, no +assumptions on the order of execution of code running in different +threads can be made, unless order is explicitly forced by the +programmer through synchronization primitives. +

+

+The aim of the thread related functions in GLib is to provide a +portable means for writing multi-threaded software. There are +primitives for mutexes to protect the access to portions of memory +(GMutex, GStaticMutex, G_LOCK_DEFINE, GStaticRecMutex and +GStaticRWLock). There are primitives for condition variables to +allow synchronization of threads (GCond). There are primitives for +thread-private data - data that every thread has a private instance +of (GPrivate, GStaticPrivate). Last but definitely not least there +are primitives to portably create and manage threads (GThread). +

+

+The threading system is initialized with g_thread_init(), which +takes an optional custom thread implementation or NULL for the +default implementation. If you want to call g_thread_init() with a +non-NULL argument this must be done before executing any other GLib +functions (except g_mem_set_vtable()). This is a requirement even if +no threads are in fact ever created by the process. +

+

+Calling g_thread_init() with a NULL argument is somewhat more +relaxed. You may call any other glib functions in the main thread +before g_thread_init() as long as g_thread_init() is not called from +a glib callback, or with any locks held. However, many libraries +above glib does not support late initialization of threads, so doing +this should be avoided if possible. +

+

+Please note that since version 2.24 the GObject initialization +function g_type_init() initializes threads (with a NULL argument), +so most applications, including those using Gtk+ will run with +threads enabled. If you want a special thread implementation, make +sure you call g_thread_init() before g_type_init() is called. +

+

+After calling g_thread_init(), GLib is completely thread safe (all +global data is automatically locked), but individual data structure +instances are not automatically locked for performance reasons. So, +for example you must coordinate accesses to the same GHashTable +from multiple threads. The two notable exceptions from this rule +are GMainLoop and GAsyncQueue, which are +threadsafe and need no further application-level locking to be +accessed from multiple threads. +

+

+To help debugging problems in multithreaded applications, GLib +supports error-checking mutexes that will give you helpful error +messages on common problems. To use error-checking mutexes, define +the symbol G_ERRORCHECK_MUTEXES when compiling the application.

+
+
+

Details

+
+

G_THREADS_ENABLED

+
#define G_THREADS_ENABLED
+
+

+This macro is defined if GLib was compiled with thread support. This +does not necessarily mean that there is a thread implementation +available, but it does mean that the infrastructure is in place and +that once you provide a thread implementation to g_thread_init(), +GLib will be multi-thread safe. If G_THREADS_ENABLED is not +defined, then Glib is not, and cannot be, multi-thread safe.

+
+
+
+

G_THREADS_IMPL_POSIX

+
#define G_THREADS_IMPL_POSIX
+
+

+This macro is defined if POSIX style threads are used.

+
+
+
+

G_THREADS_IMPL_NONE

+
#define G_THREADS_IMPL_NONE
+
+

+This macro is defined if no thread implementation is used. You can, +however, provide one to g_thread_init() to make GLib multi-thread +safe.

+
+
+
+

G_THREAD_ERROR

+
#define G_THREAD_ERROR g_thread_error_quark ()
+
+

+The error domain of the GLib thread subsystem.

+
+
+
+

enum GThreadError

+
typedef enum
+{
+  G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */
+} GThreadError;
+
+

+Possible errors of thread related functions.

+
++ + + + +

G_THREAD_ERROR_AGAIN

a thread couldn't be created due to resource + shortage. Try again later. +
+
+
+
+

GThreadFunctions

+
typedef struct {
+  GMutex*  (*mutex_new)           (void);
+  void     (*mutex_lock)          (GMutex               *mutex);
+  gboolean (*mutex_trylock)       (GMutex               *mutex);
+  void     (*mutex_unlock)        (GMutex               *mutex);
+  void     (*mutex_free)          (GMutex               *mutex);
+  GCond*   (*cond_new)            (void);
+  void     (*cond_signal)         (GCond                *cond);
+  void     (*cond_broadcast)      (GCond                *cond);
+  void     (*cond_wait)           (GCond                *cond,
+                                   GMutex               *mutex);
+  gboolean (*cond_timed_wait)     (GCond                *cond,
+                                   GMutex               *mutex,
+                                   GTimeVal             *end_time);
+  void      (*cond_free)          (GCond                *cond);
+  GPrivate* (*private_new)        (GDestroyNotify        destructor);
+  gpointer  (*private_get)        (GPrivate             *private_key);
+  void      (*private_set)        (GPrivate             *private_key,
+                                   gpointer              data);
+  void      (*thread_create)      (GThreadFunc           func,
+                                   gpointer              data,
+                                   gulong                stack_size,
+                                   gboolean              joinable,
+                                   gboolean              bound,
+                                   GThreadPriority       priority,
+                                   gpointer              thread,
+                                   GError              **error);
+  void      (*thread_yield)       (void);
+  void      (*thread_join)        (gpointer              thread);
+  void      (*thread_exit)        (void);
+  void      (*thread_set_priority)(gpointer              thread,
+                                   GThreadPriority       priority);
+  void      (*thread_self)        (gpointer              thread);
+  gboolean  (*thread_equal)       (gpointer              thread1,
+				   gpointer              thread2);
+} GThreadFunctions;
+
+

+This function table is used by g_thread_init() to initialize the +thread system. The functions in the table are directly used by their +g_* prepended counterparts (described in this document). For +example, if you call g_mutex_new() then mutex_new() from the table +provided to g_thread_init() will be called. +

+

+

+
+

Note

+

Do not use this struct unless you know what you are +doing.

+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

mutex_new ()

virtual function pointer for g_mutex_new() +

mutex_lock ()

virtual function pointer for g_mutex_lock() +

mutex_trylock ()

virtual function pointer for g_mutex_trylock() +

mutex_unlock ()

virtual function pointer for g_mutex_unlock() +

mutex_free ()

virtual function pointer for g_mutex_free() +

cond_new ()

virtual function pointer for g_cond_new() +

cond_signal ()

virtual function pointer for g_cond_signal() +

cond_broadcast ()

virtual function pointer for g_cond_broadcast() +

cond_wait ()

virtual function pointer for g_cond_wait() +

cond_timed_wait ()

virtual function pointer for g_cond_timed_wait() +

cond_free ()

virtual function pointer for g_cond_free() +

private_new ()

virtual function pointer for g_private_new() +

private_get ()

virtual function pointer for g_private_get() +

private_set ()

virtual function pointer for g_private_set() +

thread_create ()

virtual function pointer for g_thread_create() +

thread_yield ()

virtual function pointer for g_thread_yield() +

thread_join ()

virtual function pointer for g_thread_join() +

thread_exit ()

virtual function pointer for g_thread_exit() +

thread_set_priority ()

virtual function pointer for + g_thread_set_priority() +

thread_self ()

virtual function pointer for g_thread_self() +

thread_equal ()

used internally by recursive mutex locks and by some + assertion checks +
+
+
+
+

g_thread_init ()

+
void                g_thread_init                       (GThreadFunctions *vtable);
+

+If you use GLib from more than one thread, you must initialize the +thread system by calling g_thread_init(). Most of the time you will +only have to call g_thread_init (NULL). +

+

+

+
+

Note

+

Do not call g_thread_init() with a non-NULL parameter unless +you really know what you are doing.

+
+

+

+

+

+
+

Note

+

g_thread_init() must not be called directly or indirectly as a +callback from GLib. Also no mutexes may be currently locked while +calling g_thread_init().

+
+

+

+

+

+
+

Note

+

g_thread_init() changes the way in which GTimer measures +elapsed time. As a consequence, timers that are running while +g_thread_init() is called may report unreliable times.

+
+

+

+

+Calling g_thread_init() multiple times is allowed (since version +2.24), but nothing happens except for the first call. If the +argument is non-NULL on such a call a warning will be printed, but +otherwise the argument is ignored. +

+

+If no thread system is available and vtable is NULL or if not all +elements of vtable are non-NULL, then g_thread_init() will abort. +

+

+

+
+

Note

+

To use g_thread_init() in your program, you have to link with +the libraries that the command pkg-config --libs +gthread-2.0 outputs. This is not the case for all the +other thread related functions of GLib. Those can be used without +having to link with the thread libraries.

+
+
++ + + + +

vtable :

a function table of type GThreadFunctions, that provides + the entry points to the thread system to be used. +
+
+
+
+

g_thread_supported ()

+
gboolean            g_thread_supported                  ();
+

+This function returns TRUE if the thread system is initialized, and +FALSE if it is not. +

+

+

+
+

Note

+

This function is actually a macro. Apart from taking the +address of it you can however use it as if it was a +function.

+
+
++ + + + +

Returns :

TRUE, if the thread system is initialized. +
+
+
+
+

g_thread_get_initialized ()

+
gboolean            g_thread_get_initialized            (void);
+

+Indicates if g_thread_init() has been called.

+
++ + + + +

Returns :

TRUE if threads have been initialized. + +
+

Since 2.20

+
+
+
+

GThreadFunc ()

+
gpointer            (*GThreadFunc)                      (gpointer data);
+

+Specifies the type of the func functions passed to +g_thread_create() or g_thread_create_full().

+
++ + + + + + + + + + +

data :

data passed to the thread. +

Returns :

the return value of the thread, which will be returned by + g_thread_join(). +
+
+
+
+

enum GThreadPriority

+
typedef enum
+{
+  G_THREAD_PRIORITY_LOW,
+  G_THREAD_PRIORITY_NORMAL,
+  G_THREAD_PRIORITY_HIGH,
+  G_THREAD_PRIORITY_URGENT
+} GThreadPriority;
+
+

+Specifies the priority of a thread. +

+

+

+
+

Note

+

It is not guaranteed that threads with different priorities +really behave accordingly. On some systems (e.g. Linux) there are no +thread priorities. On other systems (e.g. Solaris) there doesn't +seem to be different scheduling for different priorities. All in all +try to avoid being dependent on priorities.

+
+
++ + + + + + + + + + + + + + + + + + +

G_THREAD_PRIORITY_LOW

a priority lower than normal +

G_THREAD_PRIORITY_NORMAL

the default priority +

G_THREAD_PRIORITY_HIGH

a priority higher than normal +

G_THREAD_PRIORITY_URGENT

the highest priority +
+
+
+
+

GThread

+
typedef struct {
+} GThread;
+
+

+The GThread struct represents a running thread. It has three public +read-only members, but the underlying struct is bigger, so you must +not copy this struct. +

+

+

+
+

Note

+

Resources for a joinable thread are not fully released +until g_thread_join() is called for that thread.

+
+
+
+
+

g_thread_create ()

+
GThread *           g_thread_create                     (GThreadFunc func,
+                                                         gpointer data,
+                                                         gboolean joinable,
+                                                         GError **error);
+

+This function creates a new thread with the default priority. +

+

+If joinable is TRUE, you can wait for this threads termination +calling g_thread_join(). Otherwise the thread will just disappear +when it terminates. +

+

+The new thread executes the function func with the argument data. +If the thread was created successfully, it is returned. +

+

+error can be NULL to ignore errors, or non-NULL to report errors. +The error is set, if and only if the function returns NULL.

+
++ + + + + + + + + + + + + + + + + + + + + + +

func :

a function to execute in the new thread. +

data :

an argument to supply to the new thread. +

joinable :

should this thread be joinable? +

error :

return location for error. +

Returns :

the new GThread on success. +
+
+
+
+

g_thread_create_full ()

+
GThread*            g_thread_create_full                (GThreadFunc func,
+                                                         gpointer data,
+                                                         gulong stack_size,
+                                                         gboolean joinable,
+                                                         gboolean bound,
+                                                         GThreadPriority priority,
+                                                         GError **error);
+

+This function creates a new thread with the priority priority. If +the underlying thread implementation supports it, the thread gets a +stack size of stack_size or the default value for the current +platform, if stack_size is 0. +

+

+If joinable is TRUE, you can wait for this threads termination +calling g_thread_join(). Otherwise the thread will just disappear +when it terminates. If bound is TRUE, this thread will be +scheduled in the system scope, otherwise the implementation is free +to do scheduling in the process scope. The first variant is more +expensive resource-wise, but generally faster. On some systems (e.g. +Linux) all threads are bound. +

+

+The new thread executes the function func with the argument data. +If the thread was created successfully, it is returned. +

+

+error can be NULL to ignore errors, or non-NULL to report errors. +The error is set, if and only if the function returns NULL. +

+

+

+
+

Note

+

It is not guaranteed that threads with different priorities +really behave accordingly. On some systems (e.g. Linux) there are no +thread priorities. On other systems (e.g. Solaris) there doesn't +seem to be different scheduling for different priorities. All in all +try to avoid being dependent on priorities. Use +G_THREAD_PRIORITY_NORMAL here as a default.

+
+

+

+

+

+
+

Note

+

Only use g_thread_create_full() if you really can't use +g_thread_create() instead. g_thread_create() does not take +stack_size, bound, and priority as arguments, as they should only +be used in cases in which it is unavoidable.

+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

func :

a function to execute in the new thread. +

data :

an argument to supply to the new thread. +

stack_size :

a stack size for the new thread. +

joinable :

should this thread be joinable? +

bound :

should this thread be bound to a system thread? +

priority :

a priority for the thread. +

error :

return location for error. +

Returns :

the new GThread on success. +
+
+
+
+

g_thread_self ()

+
GThread*            g_thread_self                       (void);
+

+This functions returns the GThread corresponding to the calling +thread.

+
++ + + + +

Returns :

the current thread. +
+
+
+
+

g_thread_join ()

+
gpointer            g_thread_join                       (GThread *thread);
+

+Waits until thread finishes, i.e. the function func, as given to +g_thread_create(), returns or g_thread_exit() is called by thread. +All resources of thread including the GThread struct are released. +thread must have been created with joinable=TRUE in +g_thread_create(). The value returned by func or given to +g_thread_exit() by thread is returned by this function.

+
++ + + + + + + + + + +

thread :

a GThread to be waited for. +

Returns :

the return value of the thread. +
+
+
+
+

g_thread_set_priority ()

+
void                g_thread_set_priority               (GThread *thread,
+                                                         GThreadPriority priority);
+

+Changes the priority of thread to priority. +

+

+

+
+

Note

+

It is not guaranteed that threads with different +priorities really behave accordingly. On some systems (e.g. Linux) +there are no thread priorities. On other systems (e.g. Solaris) there +doesn't seem to be different scheduling for different priorities. All +in all try to avoid being dependent on priorities.

+
+
++ + + + + + + + + + +

thread :

a GThread. +

priority :

a new priority for thread. +
+
+
+
+

g_thread_yield ()

+
void                g_thread_yield                      ();
+

+Gives way to other threads waiting to be scheduled. +

+

+This function is often used as a method to make busy wait less evil. +But in most cases you will encounter, there are better methods to do +that. So in general you shouldn't use this function.

+
+
+
+

g_thread_exit ()

+
void                g_thread_exit                       (gpointer retval);
+

+Exits the current thread. If another thread is waiting for that +thread using g_thread_join() and the current thread is joinable, the +waiting thread will be woken up and get retval as the return value +of g_thread_join(). If the current thread is not joinable, retval +is ignored. Calling +

+

+

+
+  g_thread_exit (retval);
+ 
+

+

+

+is equivalent to returning retval from the function func, as given +to g_thread_create(). +

+

+

+
+

Note

+

Never call g_thread_exit() from within a thread of a +GThreadPool, as that will mess up the bookkeeping and lead to funny +and unwanted results.

+
+
++ + + + +

retval :

the return value of this thread. +
+
+
+
+

g_thread_foreach ()

+
void                g_thread_foreach                    (GFunc thread_func,
+                                                         gpointer user_data);
+

+Call thread_func on all existing GThread structures. Note that +threads may decide to exit while thread_func is running, so +without intimate knowledge about the lifetime of foreign threads, +thread_func shouldn't access the GThread* pointer passed in as +first argument. However, thread_func will not be called for threads +which are known to have exited already. +

+

+Due to thread lifetime checks, this function has an execution complexity +which is quadratic in the number of existing threads.

+
++ + + + + + + + + + +

thread_func :

function to call for all GThread structures +

user_data :

second argument to thread_func +
+

Since 2.10

+
+
+
+

GMutex

+
typedef struct _GMutex GMutex;
+

+The GMutex struct is an opaque data structure to represent a mutex +(mutual exclusion). It can be used to protect data against shared +access. Take for example the following function: +

+

+

+
+

Example 2. A function which will not work in a threaded environment

+
+  int
+  give_me_next_number (void)
+  {
+    static int current_number = 0;
+
+    /* now do a very complicated calculation to calculate the new
+     * number, this might for example be a random number generator
+     */
+    current_number = calc_next_number (current_number);
+
+    return current_number;
+  }
+ 
+
+


+

+

+It is easy to see that this won't work in a multi-threaded +application. There current_number must be protected against shared +access. A first naive implementation would be: +

+

+

+
+

Example 3. The wrong way to write a thread-safe function

+
+  int
+  give_me_next_number (void)
+  {
+    static int current_number = 0;
+    int ret_val;
+    static GMutex * mutex = NULL;
+
+    if (!mutex) mutex = g_mutex_new ();
+
+    g_mutex_lock (mutex);
+    ret_val = current_number = calc_next_number (current_number);
+    g_mutex_unlock (mutex);
+
+    return ret_val;
+  }
+ 
+
+


+

+

+This looks like it would work, but there is a race condition while +constructing the mutex and this code cannot work reliable. Please do +not use such constructs in your own programs! One working solution +is: +

+

+

+
+

Example 4. A correct thread-safe function

+
+  static GMutex *give_me_next_number_mutex = NULL;
+
+  /* this function must be called before any call to
+   * give_me_next_number()
+   *
+   * it must be called exactly once.
+   */
+  void
+  init_give_me_next_number (void)
+  {
+    g_assert (give_me_next_number_mutex == NULL);
+    give_me_next_number_mutex = g_mutex_new ();
+  }
+
+  int
+  give_me_next_number (void)
+  {
+    static int current_number = 0;
+    int ret_val;
+
+    g_mutex_lock (give_me_next_number_mutex);
+    ret_val = current_number = calc_next_number (current_number);
+    g_mutex_unlock (give_me_next_number_mutex);
+
+    return ret_val;
+  }
+ 
+
+


+

+

+GStaticMutex provides a simpler and safer way of doing this. +

+

+If you want to use a mutex, and your code should also work without +calling g_thread_init() first, then you can not use a GMutex, as +g_mutex_new() requires that the thread system be initialized. Use a +GStaticMutex instead. +

+

+A GMutex should only be accessed via the following functions. +

+

+

+
+

Note

+

All of the g_mutex_* functions are +actually macros. Apart from taking their addresses, you can however +use them as if they were functions.

+
+
+
+
+

g_mutex_new ()

+
GMutex *            g_mutex_new                         ();
+

+Creates a new GMutex. +

+

+

+
+

Note

+

This function will abort if g_thread_init() has not been +called yet.

+
+
++ + + + +

Returns :

a new GMutex. +
+
+
+
+

g_mutex_lock ()

+
void                g_mutex_lock                        (GMutex *mutex);
+

+Locks mutex. If mutex is already locked by another thread, the +current thread will block until mutex is unlocked by the other +thread. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will do nothing. +

+

+

+
+

Note

+

GMutex is neither guaranteed to be recursive nor to be +non-recursive, i.e. a thread could deadlock while calling +g_mutex_lock(), if it already has locked mutex. Use +GStaticRecMutex, if you need recursive mutexes.

+
+
++ + + + +

mutex :

a GMutex. +
+
+
+
+

g_mutex_trylock ()

+
gboolean            g_mutex_trylock                     (GMutex *mutex);
+

+Tries to lock mutex. If mutex is already locked by another thread, +it immediately returns FALSE. Otherwise it locks mutex and returns +TRUE. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will immediately return TRUE. +

+

+

+
+

Note

+

GMutex is neither guaranteed to be recursive nor to be +non-recursive, i.e. the return value of g_mutex_trylock() could be +both FALSE or TRUE, if the current thread already has locked +mutex. Use GStaticRecMutex, if you need recursive +mutexes.

+
+
++ + + + + + + + + + +

mutex :

a GMutex. +

Returns :

TRUE, if mutex could be locked. +
+
+
+
+

g_mutex_unlock ()

+
void                g_mutex_unlock                      (GMutex *mutex);
+

+Unlocks mutex. If another thread is blocked in a g_mutex_lock() +call for mutex, it will be woken and can lock mutex itself. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will do nothing.

+
++ + + + +

mutex :

a GMutex. +
+
+
+
+

g_mutex_free ()

+
void                g_mutex_free                        (GMutex *mutex);
+

+Destroys mutex. +

+

+

+
+

Note

+

Calling g_mutex_free() on a locked mutex may result in +undefined behaviour.

+
+
++ + + + +

mutex :

a GMutex. +
+
+
+
+

GStaticMutex

+
typedef struct _GStaticMutex GStaticMutex;
+

+A GStaticMutex works like a GMutex, but it has one significant +advantage. It doesn't need to be created at run-time like a GMutex, +but can be defined at compile-time. Here is a shorter, easier and +safer version of our give_me_next_number() +example: +

+

+

+
+

Example 5.  + Using GStaticMutex + to simplify thread-safe programming +

+
+  int
+  give_me_next_number (void)
+  {
+    static int current_number = 0;
+    int ret_val;
+    static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+
+    g_static_mutex_lock (&mutex);
+    ret_val = current_number = calc_next_number (current_number);
+    g_static_mutex_unlock (&mutex);
+
+    return ret_val;
+  }
+ 
+
+


+

+

+Sometimes you would like to dynamically create a mutex. If you don't +want to require prior calling to g_thread_init(), because your code +should also be usable in non-threaded programs, you are not able to +use g_mutex_new() and thus GMutex, as that requires a prior call to +g_thread_init(). In theses cases you can also use a GStaticMutex. +It must be initialized with g_static_mutex_init() before using it +and freed with with g_static_mutex_free() when not needed anymore to +free up any allocated resources. +

+

+Even though GStaticMutex is not opaque, it should only be used with +the following functions, as it is defined differently on different +platforms. +

+

+All of the g_static_mutex_* functions apart +from g_static_mutex_get_mutex can also be used +even if g_thread_init() has not yet been called. Then they do +nothing, apart from g_static_mutex_trylock, +which does nothing but returning TRUE. +

+

+

+
+

Note

+

All of the g_static_mutex_* +functions are actually macros. Apart from taking their addresses, you +can however use them as if they were functions.

+
+
+
+
+

G_STATIC_MUTEX_INIT

+
#define G_STATIC_MUTEX_INIT
+
+

+A GStaticMutex must be initialized with this macro, before it can +be used. This macro can used be to initialize a variable, but it +cannot be assigned to a variable. In that case you have to use +g_static_mutex_init(). +

+

+

+
+  GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;
+ 
+
+
+
+

g_static_mutex_init ()

+
void                g_static_mutex_init                 (GStaticMutex *mutex);
+

+Initializes mutex. Alternatively you can initialize it with +G_STATIC_MUTEX_INIT.

+
++ + + + +

mutex :

a GStaticMutex to be initialized. +
+
+
+
+

g_static_mutex_lock ()

+
void                g_static_mutex_lock                 (GStaticMutex *mutex);
+

+Works like g_mutex_lock(), but for a GStaticMutex.

+
++ + + + +

mutex :

a GStaticMutex. +
+
+
+
+

g_static_mutex_trylock ()

+
gboolean            g_static_mutex_trylock              (GStaticMutex *mutex);
+

+Works like g_mutex_trylock(), but for a GStaticMutex.

+
++ + + + + + + + + + +

mutex :

a GStaticMutex. +

Returns :

TRUE, if the GStaticMutex could be locked. +
+
+
+
+

g_static_mutex_unlock ()

+
void                g_static_mutex_unlock               (GStaticMutex *mutex);
+

+Works like g_mutex_unlock(), but for a GStaticMutex.

+
++ + + + +

mutex :

a GStaticMutex. +
+
+
+
+

g_static_mutex_get_mutex ()

+
GMutex *            g_static_mutex_get_mutex            (GStaticMutex *mutex);
+

+For some operations (like g_cond_wait()) you must have a GMutex +instead of a GStaticMutex. This function will return the +corresponding GMutex for mutex.

+
++ + + + + + + + + + +

mutex :

a GStaticMutex. +

Returns :

the GMutex corresponding to mutex. +
+
+
+
+

g_static_mutex_free ()

+
void                g_static_mutex_free                 (GStaticMutex *mutex);
+

+Releases all resources allocated to mutex. +

+

+You don't have to call this functions for a GStaticMutex with an +unbounded lifetime, i.e. objects declared 'static', but if you have +a GStaticMutex as a member of a structure and the structure is +freed, you should also free the GStaticMutex. +

+

+

+
+

Note

+

Calling g_static_mutex_free() on a locked mutex may +result in undefined behaviour.

+
+
++ + + + +

mutex :

a GStaticMutex to be freed. +
+
+
+
+

G_LOCK_DEFINE()

+
#define             G_LOCK_DEFINE(name)
+

+The G_LOCK_* macros provide a convenient interface to GStaticMutex +with the advantage that they will expand to nothing in programs +compiled against a thread-disabled GLib, saving code and memory +there. G_LOCK_DEFINE defines a lock. It can appear anywhere +variable definitions may appear in programs, i.e. in the first block +of a function or outside of functions. The name parameter will be +mangled to get the name of the GStaticMutex. This means that you +can use names of existing variables as the parameter - e.g. the name +of the variable you intent to protect with the lock. Look at our +give_me_next_number() example using the +G_LOCK_* macros: +

+

+

+
+

Example 6. Using the G_LOCK_* convenience macros

+
+  G_LOCK_DEFINE (current_number);
+
+  int
+  give_me_next_number (void)
+  {
+    static int current_number = 0;
+    int ret_val;
+
+    G_LOCK (current_number);
+    ret_val = current_number = calc_next_number (current_number);
+    G_UNLOCK (current_number);
+
+    return ret_val;
+  }
+ 
+
+


+
++ + + + +

name :

the name of the lock. +
+
+
+
+

G_LOCK_DEFINE_STATIC()

+
#define             G_LOCK_DEFINE_STATIC(name)
+

+This works like G_LOCK_DEFINE, but it creates a static object.

+
++ + + + +

name :

the name of the lock. +
+
+
+
+

G_LOCK_EXTERN()

+
#define             G_LOCK_EXTERN(name)
+

+This declares a lock, that is defined with G_LOCK_DEFINE in another +module.

+
++ + + + +

name :

the name of the lock. +
+
+
+
+

G_LOCK()

+
#define             G_LOCK(name)
+

+Works like g_mutex_lock(), but for a lock defined with +G_LOCK_DEFINE.

+
++ + + + +

name :

the name of the lock. +
+
+
+
+

G_TRYLOCK()

+
#define             G_TRYLOCK(name)
+

+Works like g_mutex_trylock(), but for a lock defined with +G_LOCK_DEFINE.

+
++ + + + + + + + + + +

name :

the name of the lock. +

Returns :

TRUE, if the lock could be locked. +
+
+
+
+

G_UNLOCK()

+
#define             G_UNLOCK(name)
+

+Works like g_mutex_unlock(), but for a lock defined with +G_LOCK_DEFINE.

+
++ + + + +

name :

the name of the lock. +
+
+
+
+

GStaticRecMutex

+
typedef struct {
+} GStaticRecMutex;
+
+

+A GStaticRecMutex works like a GStaticMutex, but it can be locked +multiple times by one thread. If you enter it n times, you have to +unlock it n times again to let other threads lock it. An exception +is the function g_static_rec_mutex_unlock_full(): that allows you to +unlock a GStaticRecMutex completely returning the depth, (i.e. the +number of times this mutex was locked). The depth can later be used +to restore the state of the GStaticRecMutex by calling +g_static_rec_mutex_lock_full(). +

+

+Even though GStaticRecMutex is not opaque, it should only be used +with the following functions. +

+

+All of the g_static_rec_mutex_* functions can +be used even if g_thread_init() has not been called. Then they do +nothing, apart from g_static_rec_mutex_trylock, +which does nothing but returning TRUE.

+
+
+
+

G_STATIC_REC_MUTEX_INIT

+
#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT }
+
+

+A GStaticRecMutex must be initialized with this macro before it can +be used. This macro can used be to initialize a variable, but it +cannot be assigned to a variable. In that case you have to use +g_static_rec_mutex_init(). +

+

+

+
+  GStaticRecMutex my_mutex = G_STATIC_REC_MUTEX_INIT;
+
+
+
+
+

g_static_rec_mutex_init ()

+
void                g_static_rec_mutex_init             (GStaticRecMutex *mutex);
+

+A GStaticRecMutex must be initialized with this function before it +can be used. Alternatively you can initialize it with +G_STATIC_REC_MUTEX_INIT.

+
++ + + + +

mutex :

a GStaticRecMutex to be initialized. +
+
+
+
+

g_static_rec_mutex_lock ()

+
void                g_static_rec_mutex_lock             (GStaticRecMutex *mutex);
+

+Locks mutex. If mutex is already locked by another thread, the +current thread will block until mutex is unlocked by the other +thread. If mutex is already locked by the calling thread, this +functions increases the depth of mutex and returns immediately.

+
++ + + + +

mutex :

a GStaticRecMutex to lock. +
+
+
+
+

g_static_rec_mutex_trylock ()

+
gboolean            g_static_rec_mutex_trylock          (GStaticRecMutex *mutex);
+

+Tries to lock mutex. If mutex is already locked by another thread, +it immediately returns FALSE. Otherwise it locks mutex and returns +TRUE. If mutex is already locked by the calling thread, this +functions increases the depth of mutex and immediately returns +TRUE.

+
++ + + + + + + + + + +

mutex :

a GStaticRecMutex to lock. +

Returns :

TRUE, if mutex could be locked. +
+
+
+
+

g_static_rec_mutex_unlock ()

+
void                g_static_rec_mutex_unlock           (GStaticRecMutex *mutex);
+

+Unlocks mutex. Another thread will be allowed to lock mutex only +when it has been unlocked as many times as it had been locked +before. If mutex is completely unlocked and another thread is +blocked in a g_static_rec_mutex_lock() call for mutex, it will be +woken and can lock mutex itself.

+
++ + + + +

mutex :

a GStaticRecMutex to unlock. +
+
+
+
+

g_static_rec_mutex_lock_full ()

+
void                g_static_rec_mutex_lock_full        (GStaticRecMutex *mutex,
+                                                         guint depth);
+

+Works like calling g_static_rec_mutex_lock() for mutex depth times.

+
++ + + + + + + + + + +

mutex :

a GStaticRecMutex to lock. +

depth :

number of times this mutex has to be unlocked to be + completely unlocked. +
+
+
+
+

g_static_rec_mutex_unlock_full ()

+
guint               g_static_rec_mutex_unlock_full      (GStaticRecMutex *mutex);
+

+Completely unlocks mutex. If another thread is blocked in a +g_static_rec_mutex_lock() call for mutex, it will be woken and can +lock mutex itself. This function returns the number of times that +mutex has been locked by the current thread. To restore the state +before the call to g_static_rec_mutex_unlock_full() you can call +g_static_rec_mutex_lock_full() with the depth returned by this +function.

+
++ + + + + + + + + + +

mutex :

a GStaticRecMutex to completely unlock. +

Returns :

number of times mutex has been locked by the current + thread. +
+
+
+
+

g_static_rec_mutex_free ()

+
void                g_static_rec_mutex_free             (GStaticRecMutex *mutex);
+

+Releases all resources allocated to a GStaticRecMutex. +

+

+You don't have to call this functions for a GStaticRecMutex with an +unbounded lifetime, i.e. objects declared 'static', but if you have +a GStaticRecMutex as a member of a structure and the structure is +freed, you should also free the GStaticRecMutex.

+
++ + + + +

mutex :

a GStaticRecMutex to be freed. +
+
+
+
+

GStaticRWLock

+
typedef struct {
+} GStaticRWLock;
+
+

+The GStaticRWLock struct represents a read-write lock. A read-write +lock can be used for protecting data that some portions of code only +read from, while others also write. In such situations it is +desirable that several readers can read at once, whereas of course +only one writer may write at a time. Take a look at the following +example: +

+

+

+
+

Example 7. An array with access functions

+
+  GStaticRWLock rwlock = G_STATIC_RW_LOCK_INIT;
+  GPtrArray *array;
+
+  gpointer
+  my_array_get (guint index)
+  {
+    gpointer retval = NULL;
+
+    if (!array)
+      return NULL;
+
+    g_static_rw_lock_reader_lock (&rwlock);
+    if (index < array->len)
+      retval = g_ptr_array_index (array, index);
+    g_static_rw_lock_reader_unlock (&rwlock);
+
+    return retval;
+  }
+
+  void
+  my_array_set (guint index, gpointer data)
+  {
+    g_static_rw_lock_writer_lock (&rwlock);
+
+    if (!array)
+      array = g_ptr_array_new ();
+
+    if (index >= array->len)
+      g_ptr_array_set_size (array, index+1);
+    g_ptr_array_index (array, index) = data;
+
+    g_static_rw_lock_writer_unlock (&rwlock);
+  }
+ 
+
+


+

+

+This example shows an array which can be accessed by many readers +(the my_array_get() function) simultaneously, +whereas the writers (the my_array_set() +function) will only be allowed once at a time and only if no readers +currently access the array. This is because of the potentially +dangerous resizing of the array. Using these functions is fully +multi-thread safe now. +

+

+Most of the time, writers should have precedence over readers. That +means, for this implementation, that as soon as a writer wants to +lock the data, no other reader is allowed to lock the data, whereas, +of course, the readers that already have locked the data are allowed +to finish their operation. As soon as the last reader unlocks the +data, the writer will lock it. +

+

+Even though GStaticRWLock is not opaque, it should only be used +with the following functions. +

+

+All of the g_static_rw_lock_* functions can be +used even if g_thread_init() has not been called. Then they do +nothing, apart from g_static_rw_lock_*_trylock, +which does nothing but returning TRUE. +

+

+

+
+

Note

+

A read-write lock has a higher overhead than a mutex. For +example, both g_static_rw_lock_reader_lock() and +g_static_rw_lock_reader_unlock() have to lock and unlock a +GStaticMutex, so it takes at least twice the time to lock and unlock +a GStaticRWLock that it does to lock and unlock a GStaticMutex. So +only data structures that are accessed by multiple readers, and which +keep the lock for a considerable time justify a GStaticRWLock. The +above example most probably would fare better with a +GStaticMutex.

+
+
+
+
+

G_STATIC_RW_LOCK_INIT

+
#define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, 0, 0 }
+
+

+A GStaticRWLock must be initialized with this macro before it can +be used. This macro can used be to initialize a variable, but it +cannot be assigned to a variable. In that case you have to use +g_static_rw_lock_init(). +

+

+

+
+  GStaticRWLock my_lock = G_STATIC_RW_LOCK_INIT;
+ 
+
+
+
+

g_static_rw_lock_init ()

+
void                g_static_rw_lock_init               (GStaticRWLock *lock);
+

+A GStaticRWLock must be initialized with this function before it +can be used. Alternatively you can initialize it with +G_STATIC_RW_LOCK_INIT.

+
++ + + + +

lock :

a GStaticRWLock to be initialized. +
+
+
+
+

g_static_rw_lock_reader_lock ()

+
void                g_static_rw_lock_reader_lock        (GStaticRWLock *lock);
+

+Locks lock for reading. There may be unlimited concurrent locks for +reading of a GStaticRWLock at the same time. If lock is already +locked for writing by another thread or if another thread is already +waiting to lock lock for writing, this function will block until +lock is unlocked by the other writing thread and no other writing +threads want to lock lock. This lock has to be unlocked by +g_static_rw_lock_reader_unlock(). +

+

+GStaticRWLock is not recursive. It might seem to be possible to +recursively lock for reading, but that can result in a deadlock, due +to writer preference.

+
++ + + + +

lock :

a GStaticRWLock to lock for reading. +
+
+
+
+

g_static_rw_lock_reader_trylock ()

+
gboolean            g_static_rw_lock_reader_trylock     (GStaticRWLock *lock);
+

+Tries to lock lock for reading. If lock is already locked for +writing by another thread or if another thread is already waiting to +lock lock for writing, immediately returns FALSE. Otherwise locks +lock for reading and returns TRUE. This lock has to be unlocked by +g_static_rw_lock_reader_unlock().

+
++ + + + + + + + + + +

lock :

a GStaticRWLock to lock for reading. +

Returns :

TRUE, if lock could be locked for reading. +
+
+
+
+

g_static_rw_lock_reader_unlock ()

+
void                g_static_rw_lock_reader_unlock      (GStaticRWLock *lock);
+

+Unlocks lock. If a thread waits to lock lock for writing and all +locks for reading have been unlocked, the waiting thread is woken up +and can lock lock for writing.

+
++ + + + +

lock :

a GStaticRWLock to unlock after reading. +
+
+
+
+

g_static_rw_lock_writer_lock ()

+
void                g_static_rw_lock_writer_lock        (GStaticRWLock *lock);
+

+Locks lock for writing. If lock is already locked for writing or +reading by other threads, this function will block until lock is +completely unlocked and then lock lock for writing. While this +functions waits to lock lock, no other thread can lock lock for +reading. When lock is locked for writing, no other thread can lock +lock (neither for reading nor writing). This lock has to be +unlocked by g_static_rw_lock_writer_unlock().

+
++ + + + +

lock :

a GStaticRWLock to lock for writing. +
+
+
+
+

g_static_rw_lock_writer_trylock ()

+
gboolean            g_static_rw_lock_writer_trylock     (GStaticRWLock *lock);
+

+Tries to lock lock for writing. If lock is already locked (for +either reading or writing) by another thread, it immediately returns +FALSE. Otherwise it locks lock for writing and returns TRUE. This +lock has to be unlocked by g_static_rw_lock_writer_unlock().

+
++ + + + + + + + + + +

lock :

a GStaticRWLock to lock for writing. +

Returns :

TRUE, if lock could be locked for writing. +
+
+
+
+

g_static_rw_lock_writer_unlock ()

+
void                g_static_rw_lock_writer_unlock      (GStaticRWLock *lock);
+

+Unlocks lock. If a thread is waiting to lock lock for writing and +all locks for reading have been unlocked, the waiting thread is +woken up and can lock lock for writing. If no thread is waiting to +lock lock for writing, and some thread or threads are waiting to +lock lock for reading, the waiting threads are woken up and can +lock lock for reading.

+
++ + + + +

lock :

a GStaticRWLock to unlock after writing. +
+
+
+
+

g_static_rw_lock_free ()

+
void                g_static_rw_lock_free               (GStaticRWLock *lock);
+

+Releases all resources allocated to lock. +

+

+You don't have to call this functions for a GStaticRWLock with an +unbounded lifetime, i.e. objects declared 'static', but if you have +a GStaticRWLock as a member of a structure, and the structure is +freed, you should also free the GStaticRWLock.

+
++ + + + +

lock :

a GStaticRWLock to be freed. +
+
+
+
+

GCond

+
typedef struct _GCond GCond;
+

+The GCond struct is an opaque data structure that represents a +condition. Threads can block on a GCond if they find a certain +condition to be false. If other threads change the state of this +condition they signal the GCond, and that causes the waiting +threads to be woken up. +

+

+

+
+

Example 8.  + Using GCond to block a thread until a condition is satisfied +

+
+  GCond* data_cond = NULL; /* Must be initialized somewhere */
+  GMutex* data_mutex = NULL; /* Must be initialized somewhere */
+  gpointer current_data = NULL;
+
+  void
+  push_data (gpointer data)
+  {
+    g_mutex_lock (data_mutex);
+    current_data = data;
+    g_cond_signal (data_cond);
+    g_mutex_unlock (data_mutex);
+  }
+
+  gpointer
+  pop_data (void)
+  {
+    gpointer data;
+
+    g_mutex_lock (data_mutex);
+    while (!current_data)
+      g_cond_wait (data_cond, data_mutex);
+    data = current_data;
+    current_data = NULL;
+    g_mutex_unlock (data_mutex);
+
+    return data;
+  }
+ 
+
+


+

+

+Whenever a thread calls pop_data() now, it will +wait until current_data is non-NULL, i.e. until some other thread +has called push_data(). +

+

+

+
+

Note

+

It is important to use the g_cond_wait() and +g_cond_timed_wait() functions only inside a loop which checks for the +condition to be true. It is not guaranteed that the waiting thread +will find the condition fulfilled after it wakes up, even if the +signaling thread left the condition in that state: another thread may +have altered the condition before the waiting thread got the chance +to be woken up, even if the condition itself is protected by a +GMutex, like above.

+
+

+

+

+A GCond should only be accessed via the following functions. +

+

+

+
+

Note

+

All of the g_cond_* functions are +actually macros. Apart from taking their addresses, you can however +use them as if they were functions.

+
+
+
+
+

g_cond_new ()

+
GCond*              g_cond_new                          ();
+

+Creates a new GCond. This function will abort, if g_thread_init() +has not been called yet.

+
++ + + + +

Returns :

a new GCond. +
+
+
+
+

g_cond_signal ()

+
void                g_cond_signal                       (GCond *cond);
+

+If threads are waiting for cond, exactly one of them is woken up. +It is good practice to hold the same lock as the waiting thread +while calling this function, though not required. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will do nothing.

+
++ + + + +

cond :

a GCond. +
+
+
+
+

g_cond_broadcast ()

+
void                g_cond_broadcast                    (GCond *cond);
+

+If threads are waiting for cond, all of them are woken up. It is +good practice to lock the same mutex as the waiting threads, while +calling this function, though not required. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will do nothing.

+
++ + + + +

cond :

a GCond. +
+
+
+
+

g_cond_wait ()

+
void                g_cond_wait                         (GCond *cond,
+                                                         GMutex *mutex);
+

+Waits until this thread is woken up on cond. The mutex is unlocked +before falling asleep and locked again before resuming. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will immediately return.

+
++ + + + + + + + + + +

cond :

a GCond. +

mutex :

a GMutex, that is currently locked. +
+
+
+
+

g_cond_timed_wait ()

+
gboolean            g_cond_timed_wait                   (GCond *cond,
+                                                         GMutex *mutex,
+                                                         GTimeVal *abs_time);
+

+Waits until this thread is woken up on cond, but not longer than +until the time specified by abs_time. The mutex is unlocked before +falling asleep and locked again before resuming. +

+

+If abs_time is NULL, g_cond_timed_wait() acts like g_cond_wait(). +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will immediately return TRUE. +

+

+To easily calculate abs_time a combination of g_get_current_time() +and g_time_val_add() can be used.

+
++ + + + + + + + + + + + + + + + + + +

cond :

a GCond. +

mutex :

a GMutex that is currently locked. +

abs_time :

a GTimeVal, determining the final time. +

Returns :

TRUE if cond was signalled, or FALSE on timeout. +
+
+
+
+

g_cond_free ()

+
void                g_cond_free                         (GCond *cond);
+

+Destroys the GCond.

+
++ + + + +

cond :

a GCond. +
+
+
+
+

GPrivate

+
typedef struct _GPrivate GPrivate;
+

+The GPrivate struct is an opaque data structure to represent a +thread private data key. Threads can thereby obtain and set a +pointer which is private to the current thread. Take our +give_me_next_number() example from +above. Suppose we don't want current_number to be +shared between the threads, but instead to be private to each thread. +This can be done as follows: +

+

+

+
+

Example 9. Using GPrivate for per-thread data

+
+  GPrivate* current_number_key = NULL; /* Must be initialized somewhere
+                                          with g_private_new (g_free); */
+
+  int
+  give_me_next_number (void)
+  {
+    int *current_number = g_private_get (current_number_key);
+
+    if (!current_number)
+      {
+        current_number = g_new (int, 1);
+        *current_number = 0;
+        g_private_set (current_number_key, current_number);
+      }
+
+    *current_number = calc_next_number (*current_number);
+
+    return *current_number;
+  }
+ 
+
+


+

+

+Here the pointer belonging to the key +current_number_key is read. If it is NULL, it has +not been set yet. Then get memory for an integer value, assign this +memory to the pointer and write the pointer back. Now we have an +integer value that is private to the current thread. +

+

+The GPrivate struct should only be accessed via the following +functions. +

+

+

+
+

Note

+

All of the g_private_* functions are +actually macros. Apart from taking their addresses, you can however +use them as if they were functions.

+
+
+
+
+

g_private_new ()

+
GPrivate*           g_private_new                       (GDestroyNotify destructor);
+

+Creates a new GPrivate. If destructor is non-NULL, it is a +pointer to a destructor function. Whenever a thread ends and the +corresponding pointer keyed to this instance of GPrivate is +non-NULL, the destructor is called with this pointer as the +argument. +

+

+

+
+

Note

+

destructor is used quite differently from notify in +g_static_private_set().

+
+

+

+

+

+
+

Note

+

A GPrivate can not be freed. Reuse it instead, if you +can, to avoid shortage, or use GStaticPrivate.

+
+

+

+

+

+
+

Note

+

This function will abort if g_thread_init() has not been +called yet.

+
+
++ + + + + + + + + + +

destructor :

a function to destroy the data keyed to GPrivate when + a thread ends. +

Returns :

a new GPrivate. +
+
+
+
+

g_private_get ()

+
gpointer            g_private_get                       (GPrivate *private_key);
+

+Returns the pointer keyed to private_key for the current thread. If +g_private_set() hasn't been called for the current private_key and +thread yet, this pointer will be NULL. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will return the value of private_key +casted to gpointer. Note however, that private data set +before g_thread_init() will +not be retained after the +call. Instead, NULL will be returned in all threads directly after +g_thread_init(), regardless of any g_private_set() calls issued +before threading system intialization.

+
++ + + + + + + + + + +

private_key :

a GPrivate. +

Returns :

the corresponding pointer. +
+
+
+
+

g_private_set ()

+
void                g_private_set                       (GPrivate *private_key,
+                                                         gpointer data);
+

+Sets the pointer keyed to private_key for the current thread. +

+

+This function can be used even if g_thread_init() has not yet been +called, and, in that case, will set private_key to data casted to +GPrivate*. See g_private_get() for resulting caveats.

+
++ + + + + + + + + + +

private_key :

a GPrivate. +

data :

the new pointer. +
+
+
+
+

GStaticPrivate

+
typedef struct {
+} GStaticPrivate;
+
+

+A GStaticPrivate works almost like a GPrivate, but it has one +significant advantage. It doesn't need to be created at run-time +like a GPrivate, but can be defined at compile-time. This is +similar to the difference between GMutex and GStaticMutex. Now +look at our give_me_next_number() example with +GStaticPrivate: +

+

+

+
+

Example 10. Using GStaticPrivate for per-thread data

+
+  int
+  give_me_next_number ()
+  {
+    static GStaticPrivate current_number_key = G_STATIC_PRIVATE_INIT;
+    int *current_number = g_static_private_get (&current_number_key);
+
+    if (!current_number)
+      {
+        current_number = g_new (int,1);
+        *current_number = 0;
+        g_static_private_set (&current_number_key, current_number, g_free);
+      }
+
+    *current_number = calc_next_number (*current_number);
+
+    return *current_number;
+  }
+ 
+
+


+
+
+
+

G_STATIC_PRIVATE_INIT

+
#define G_STATIC_PRIVATE_INIT 
+
+

+Every GStaticPrivate must be initialized with this macro, before it +can be used. +

+

+

+
+  GStaticPrivate my_private = G_STATIC_PRIVATE_INIT;
+ 
+
+
+
+

g_static_private_init ()

+
void                g_static_private_init               (GStaticPrivate *private_key);
+

+Initializes private_key. Alternatively you can initialize it with +G_STATIC_PRIVATE_INIT.

+
++ + + + +

private_key :

a GStaticPrivate to be initialized. +
+
+
+
+

g_static_private_get ()

+
gpointer            g_static_private_get                (GStaticPrivate *private_key);
+

+Works like g_private_get() only for a GStaticPrivate. +

+

+This function works even if g_thread_init() has not yet been called.

+
++ + + + + + + + + + +

private_key :

a GStaticPrivate. +

Returns :

the corresponding pointer. +
+
+
+
+

g_static_private_set ()

+
void                g_static_private_set                (GStaticPrivate *private_key,
+                                                         gpointer data,
+                                                         GDestroyNotify notify);
+

+Sets the pointer keyed to private_key for the current thread and +the function notify to be called with that pointer (NULL or +non-NULL), whenever the pointer is set again or whenever the +current thread ends. +

+

+This function works even if g_thread_init() has not yet been called. +If g_thread_init() is called later, the data keyed to private_key +will be inherited only by the main thread, i.e. the one that called +g_thread_init(). +

+

+

+
+

Note

+

notify is used quite differently from destructor in +g_private_new().

+
+
++ + + + + + + + + + + + + + +

private_key :

a GStaticPrivate. +

data :

the new pointer. +

notify :

a function to be called with the pointer whenever the + current thread ends or sets this pointer again. +
+
+
+
+

g_static_private_free ()

+
void                g_static_private_free               (GStaticPrivate *private_key);
+

+Releases all resources allocated to private_key. +

+

+You don't have to call this functions for a GStaticPrivate with an +unbounded lifetime, i.e. objects declared 'static', but if you have +a GStaticPrivate as a member of a structure and the structure is +freed, you should also free the GStaticPrivate.

+
++ + + + +

private_key :

a GStaticPrivate to be freed. +
+
+
+
+

GOnce

+
typedef struct {
+  volatile GOnceStatus status;
+  volatile gpointer retval;
+} GOnce;
+
+

+A GOnce struct controls a one-time initialization function. Any +one-time initialization function must have its own unique GOnce +struct.

+
++ + + + + + + + + + +

volatile GOnceStatus status;

the status of the GOnce +

volatile gpointer retval;

the value returned by the call to the function, if status + is G_ONCE_STATUS_READY +
+

Since 2.4

+
+
+
+

enum GOnceStatus

+
typedef enum
+{
+  G_ONCE_STATUS_NOTCALLED,
+  G_ONCE_STATUS_PROGRESS,
+  G_ONCE_STATUS_READY  
+} GOnceStatus;
+
+

+The possible statuses of a one-time initialization function +controlled by a GOnce struct.

+
++ + + + + + + + + + + + + + +

G_ONCE_STATUS_NOTCALLED

the function has not been called yet. +

G_ONCE_STATUS_PROGRESS

the function call is currently in progress. +

G_ONCE_STATUS_READY

the function has been called. +
+

Since 2.4

+
+
+
+

G_ONCE_INIT

+
#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL }
+
+

+A GOnce must be initialized with this macro before it can be used. +

+

+

+
+  GOnce my_once = G_ONCE_INIT;
+ 
+

Since 2.4

+
+
+
+

g_once()

+
#define             g_once(once, func, arg)
+

+The first call to this routine by a process with a given GOnce +struct calls func with the given argument. Thereafter, subsequent +calls to g_once() with the same GOnce struct do not call func +again, but return the stored result of the first call. On return +from g_once(), the status of once will be G_ONCE_STATUS_READY. +

+

+For example, a mutex or a thread-specific data key must be created +exactly once. In a threaded environment, calling g_once() ensures +that the initialization is serialized across multiple threads. +

+

+

+
+

Note

+

Calling g_once() recursively on the same GOnce struct in +func will lead to a deadlock.

+
+

+

+

+

+
+  gpointer
+  get_debug_flags (void)
+  {
+    static GOnce my_once = G_ONCE_INIT;
+
+    g_once (&my_once, parse_debug_flags, NULL);
+
+    return my_once.retval;
+  }
+ 
+
++ + + + + + + + + + + + + + +

once :

a GOnce structure +

func :

the GThreadFunc function associated to once. This function + is called only once, regardless of the number of times it and + its associated GOnce struct are passed to g_once(). +

arg :

data to be passed to func +
+

Since 2.4

+
+
+
+

g_once_init_enter ()

+
gboolean            g_once_init_enter                   (volatile gsize *value_location);
+

+Function to be called when starting a critical initialization +section. The argument value_location must point to a static +0-initialized variable that will be set to a value other than 0 at +the end of the initialization section. In combination with +g_once_init_leave() and the unique address value_location, it can +be ensured that an initialization section will be executed only once +during a program's life time, and that concurrent threads are +blocked until initialization completed. To be used in constructs +like this: +

+

+

+
+  static gsize initialization_value = 0;
+
+  if (g_once_init_enter (&initialization_value))
+    {
+      gsize setup_value = 42; /* initialization code here */
+
+      g_once_init_leave (&initialization_value, setup_value);
+    }
+
+  /* use initialization_value here */
+ 
+
++ + + + + + + + + + +

value_location :

location of a static initializable variable + containing 0. +

Returns :

TRUE if the initialization section should be entered, + FALSE and blocks otherwise +
+

Since 2.14

+
+
+
+

g_once_init_leave ()

+
void                g_once_init_leave                   (volatile gsize *value_location,
+                                                         gsize initialization_value);
+

+Counterpart to g_once_init_enter(). Expects a location of a static +0-initialized initialization variable, and an initialization value +other than 0. Sets the variable to the initialization value, and +releases concurrent threads blocking in g_once_init_enter() on this +initialization variable.

+
++ + + + + + + + + + +

value_location :

location of a static initializable variable + containing 0. +

initialization_value :

new non-0 value for *value_location. +
+

Since 2.14

+
+
+
+

g_bit_lock ()

+
void                g_bit_lock                          (volatile gint *address,
+                                                         gint lock_bit);
+

+Sets the indicated lock_bit in address. If the bit is already +set, this call will block until g_bit_unlock() unsets the +corresponding bit. +

+

+Attempting to lock on two different bits within the same integer is +not supported and will very probably cause deadlocks. +

+

+The value of the bit that is set is (1u << bit). If bit is not +between 0 and 31 then the result is undefined. +

+

+This function accesses address atomically. All other accesses to +address must be atomic in order for this function to work +reliably.

+
++ + + + + + + + + + +

address :

a pointer to an integer +

lock_bit :

a bit value between 0 and 31 +
+

Since 2.24

+
+
+
+

g_bit_trylock ()

+
gboolean            g_bit_trylock                       (volatile gint *address,
+                                                         gint lock_bit);
+

+Sets the indicated lock_bit in address, returning TRUE if +successful. If the bit is already set, returns FALSE immediately. +

+

+Attempting to lock on two different bits within the same integer is +not supported. +

+

+The value of the bit that is set is (1u << bit). If bit is not +between 0 and 31 then the result is undefined. +

+

+This function accesses address atomically. All other accesses to +address must be atomic in order for this function to work +reliably.

+
++ + + + + + + + + + + + + + +

address :

a pointer to an integer +

lock_bit :

a bit value between 0 and 31 +

Returns :

TRUE if the lock was acquired +
+

Since 2.24

+
+
+
+

g_bit_unlock ()

+
void                g_bit_unlock                        (volatile gint *address,
+                                                         gint lock_bit);
+

+Clears the indicated lock_bit in address. If another thread is +currently blocked in g_bit_lock() on this same bit then it will be +woken up. +

+

+This function accesses address atomically. All other accesses to +address must be atomic in order for this function to work +reliably.

+
++ + + + + + + + + + +

address :

a pointer to an integer +

lock_bit :

a bit value between 0 and 31 +
+

Since 2.24

+
+
+
+

See Also

+GThreadPool, GAsyncQueue +
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Timers.html b/docs/reference/glib/html/glib-Timers.html new file mode 100644 index 0000000..fdadc92 --- /dev/null +++ b/docs/reference/glib/html/glib-Timers.html @@ -0,0 +1,254 @@ + + + + +Timers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Timers

+

Timers — keep track of elapsed time

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GTimer;
+GTimer*             g_timer_new                         (void);
+void                g_timer_start                       (GTimer *timer);
+void                g_timer_stop                        (GTimer *timer);
+void                g_timer_continue                    (GTimer *timer);
+gdouble             g_timer_elapsed                     (GTimer *timer,
+                                                         gulong *microseconds);
+void                g_timer_reset                       (GTimer *timer);
+void                g_timer_destroy                     (GTimer *timer);
+
+
+
+

Description

+

+GTimer records a start time, and counts microseconds elapsed since +that time. This is done somewhat differently on different platforms, +and can be tricky to get exactly right, so GTimer provides a +portable/convenient interface. +

+

+

+
+

Note

+

+ GTimer uses a higher-quality clock when thread support is available. + Therefore, calling g_thread_init() while timers are running may lead to + unreliable results. It is best to call g_thread_init() before starting any + timers, if you are using threads at all. +

+
+
+
+

Details

+
+

GTimer

+
typedef struct _GTimer GTimer;
+

+Opaque datatype that records a start time.

+
+
+
+

g_timer_new ()

+
GTimer*             g_timer_new                         (void);
+

+Creates a new timer, and starts timing (i.e. g_timer_start() is +implicitly called for you).

+
++ + + + +

Returns :

a new GTimer. +
+
+
+
+

g_timer_start ()

+
void                g_timer_start                       (GTimer *timer);
+

+Marks a start time, so that future calls to g_timer_elapsed() will +report the time since g_timer_start() was called. g_timer_new() +automatically marks the start time, so no need to call +g_timer_start() immediately after creating the timer.

+
++ + + + +

timer :

a GTimer. +
+
+
+
+

g_timer_stop ()

+
void                g_timer_stop                        (GTimer *timer);
+

+Marks an end time, so calls to g_timer_elapsed() will return the +difference between this end time and the start time.

+
++ + + + +

timer :

a GTimer. +
+
+
+
+

g_timer_continue ()

+
void                g_timer_continue                    (GTimer *timer);
+

+Resumes a timer that has previously been stopped with +g_timer_stop(). g_timer_stop() must be called before using this +function.

+
++ + + + +

timer :

a GTimer. +
+

Since 2.4

+
+
+
+

g_timer_elapsed ()

+
gdouble             g_timer_elapsed                     (GTimer *timer,
+                                                         gulong *microseconds);
+

+If timer has been started but not stopped, obtains the time since +the timer was started. If timer has been stopped, obtains the +elapsed time between the time it was started and the time it was +stopped. The return value is the number of seconds elapsed, +including any fractional part. The microseconds out parameter is +essentially useless. +

+

+

+
+

Warning

+

+ Calling initialization functions, in particular g_thread_init(), while a + timer is running will cause invalid return values from this function. +

+
+
++ + + + + + + + + + + + + + +

timer :

a GTimer. +

microseconds :

return location for the fractional part of seconds + elapsed, in microseconds (that is, the total number + of microseconds elapsed, modulo 1000000), or NULL +

Returns :

seconds elapsed as a floating point value, including any + fractional part. +
+
+
+
+

g_timer_reset ()

+
void                g_timer_reset                       (GTimer *timer);
+

+This function is useless; it's fine to call g_timer_start() on an +already-started timer to reset the start time, so g_timer_reset() +serves no purpose.

+
++ + + + +

timer :

a GTimer. +
+
+
+
+

g_timer_destroy ()

+
void                g_timer_destroy                     (GTimer *timer);
+

+Destroys a timer, freeing associated resources.

+
++ + + + +

timer :

a GTimer to destroy. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Trash-Stacks.html b/docs/reference/glib/html/glib-Trash-Stacks.html new file mode 100644 index 0000000..530fcdd --- /dev/null +++ b/docs/reference/glib/html/glib-Trash-Stacks.html @@ -0,0 +1,208 @@ + + + + +Trash Stacks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Trash Stacks

+

Trash Stacks — maintain a stack of unused allocated memory chunks

+
+
+

Synopsis

+
+#include <glib.h>
+
+                    GTrashStack;
+void                g_trash_stack_push                  (GTrashStack **stack_p,
+                                                         gpointer data_p);
+gpointer            g_trash_stack_pop                   (GTrashStack **stack_p);
+gpointer            g_trash_stack_peek                  (GTrashStack **stack_p);
+guint               g_trash_stack_height                (GTrashStack **stack_p);
+
+
+
+

Description

+

+A GTrashStack is an efficient way to keep a stack of unused allocated +memory chunks. Each memory chunk is required to be large enough to hold +a gpointer. This allows the stack to be maintained without any space +overhead, since the stack pointers can be stored inside the memory chunks. +

+

+There is no function to create a GTrashStack. A NULL GTrashStack* +is a perfectly valid empty stack. +

+
+
+

Details

+
+

GTrashStack

+
typedef struct {
+  GTrashStack *next;
+} GTrashStack;
+
+

+Each piece of memory that is pushed onto the stack +is cast to a GTrashStack*. +

+
++ + + + +

GTrashStack *next;

pointer to the previous element of the stack, +gets stored in the first sizeof (gpointer) +bytes of the element. +
+
+
+
+

g_trash_stack_push ()

+
void                g_trash_stack_push                  (GTrashStack **stack_p,
+                                                         gpointer data_p);
+

+Pushes a piece of memory onto a GTrashStack. +

+
++ + + + + + + + + + +

stack_p :

a pointer to a GTrashStack. +

data_p :

the piece of memory to push on the stack. +
+
+
+
+

g_trash_stack_pop ()

+
gpointer            g_trash_stack_pop                   (GTrashStack **stack_p);
+

+Pops a piece of memory off a GTrashStack. +

+
++ + + + + + + + + + +

stack_p :

a pointer to a GTrashStack. +

Returns :

the element at the top of the stack. +
+
+
+
+

g_trash_stack_peek ()

+
gpointer            g_trash_stack_peek                  (GTrashStack **stack_p);
+

+Returns the element at the top of a GTrashStack which may be NULL. +

+
++ + + + + + + + + + +

stack_p :

a pointer to a GTrashStack. +

Returns :

the element at the top of the stack. +
+
+
+
+

g_trash_stack_height ()

+
guint               g_trash_stack_height                (GTrashStack **stack_p);
+

+Returns the height of a GTrashStack. +Note that execution of this function is of O(N) complexity +where N denotes the number of items on the stack. +

+
++ + + + + + + + + + +

stack_p :

a pointer to a GTrashStack. +

Returns :

the height of the stack. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Type-Conversion-Macros.html b/docs/reference/glib/html/glib-Type-Conversion-Macros.html new file mode 100644 index 0000000..599459a --- /dev/null +++ b/docs/reference/glib/html/glib-Type-Conversion-Macros.html @@ -0,0 +1,252 @@ + + + + +Type Conversion Macros + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Type Conversion Macros

+

Type Conversion Macros — portably storing integers in pointer variables

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             GINT_TO_POINTER                     (i)
+#define             GPOINTER_TO_INT                     (p)
+
+#define             GUINT_TO_POINTER                    (u)
+#define             GPOINTER_TO_UINT                    (p)
+#define             GSIZE_TO_POINTER                    (s)
+#define             GPOINTER_TO_SIZE                    (p)
+
+
+
+

Description

+

+Many times GLib, GTK+, and other libraries allow you to pass "user +data" to a callback, in the form of a void pointer. From time to time +you want to pass an integer instead of a pointer. You could allocate +an integer, with something like: +

+
+ int *ip = g_new (int, 1);
+ *ip = 42;
+
+

+But this is inconvenient, and it's annoying to have to free the +memory at some later time. +

+

+Pointers are always at least 32 bits in size (on all platforms GLib +intends to support). Thus you can store at least 32-bit integer values +in a pointer value. Naively, you might try this, but it's incorrect: +

+
+ gpointer p;
+ int i;
+ p = (void*) 42;
+ i = (int) p;
+
+

+Again, that example was not correct, don't copy it. +The problem is that on some systems you need to do this: +

+
+ gpointer p;
+ int i;
+ p = (void*) (long) 42;
+ i = (int) (long) p;
+
+

+So GPOINTER_TO_INT(), GINT_TO_POINTER(), etc. do the right thing +on the current platform. +

+

+

+
+

Warning

+

+YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE IN ANY +WAY SHAPE OR FORM. These macros ONLY allow +storing integers in pointers, and only preserve 32 bits of the +integer; values outside the range of a 32-bit integer will be mangled. +

+
+

+

+
+
+

Details

+
+

GINT_TO_POINTER()

+
#define GINT_TO_POINTER(i) ((gpointer) (glong) (i))
+
+

+Stuffs an integer into a pointer type. +

+

+Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE +IN ANY WAY SHAPE OR FORM. These macros ONLY allow +storing integers in pointers, and only preserve 32 bits of the +integer; values outside the range of a 32-bit integer will be mangled. +

+
++ + + + +

i :

integer to stuff into a pointer. +
+
+
+
+

GPOINTER_TO_INT()

+
#define GPOINTER_TO_INT(p) ((gint)  (glong) (p))
+
+

+Extracts an integer from a pointer. The integer must have +been stored in the pointer with GINT_TO_POINTER(). +

+

+Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE +IN ANY WAY SHAPE OR FORM. These macros ONLY allow +storing integers in pointers, and only preserve 32 bits of the +integer; values outside the range of a 32-bit integer will be mangled. +

+
++ + + + +

p :

pointer containing an integer. +
+
+
+
+

GUINT_TO_POINTER()

+
#define GUINT_TO_POINTER(u) ((gpointer) (gulong) (u))
+
+

+Stuffs an unsigned integer into a pointer type. +

+
++ + + + +

u :

unsigned integer to stuff into the pointer. +
+
+
+
+

GPOINTER_TO_UINT()

+
#define GPOINTER_TO_UINT(p) ((guint) (gulong) (p))
+
+

+Extracts an unsigned integer from a pointer. The integer must have +been stored in the pointer with GUINT_TO_POINTER(). +

+
++ + + + +

p :

pointer to extract an unsigned integer from. +
+
+
+
+

GSIZE_TO_POINTER()

+
#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s))
+
+

+Stuffs a gsize into a pointer type. +

+
++ + + + +

s :

+gsize to stuff into the pointer. +
+
+
+
+

GPOINTER_TO_SIZE()

+
#define GPOINTER_TO_SIZE(p) ((gsize) (p))
+
+

+Extracts a gsize from a pointer. The gsize must have +been stored in the pointer with GSIZE_TO_POINTER(). +

+
++ + + + +

p :

pointer to extract a gsize from. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-URI-Functions.html b/docs/reference/glib/html/glib-URI-Functions.html new file mode 100644 index 0000000..d9ac8ca --- /dev/null +++ b/docs/reference/glib/html/glib-URI-Functions.html @@ -0,0 +1,322 @@ + + + + +URI Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

URI Functions

+

URI Functions — URI Functions

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             G_URI_RESERVED_CHARS_ALLOWED_IN_PATH
+#define             G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT
+#define             G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO
+#define             G_URI_RESERVED_CHARS_GENERIC_DELIMITERS
+#define             G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS
+char *              g_uri_parse_scheme                  (const char *uri);
+char *              g_uri_escape_string                 (const char *unescaped,
+                                                         const char *reserved_chars_allowed,
+                                                         gboolean allow_utf8);
+char *              g_uri_unescape_string               (const char *escaped_string,
+                                                         const char *illegal_characters);
+char *              g_uri_unescape_segment              (const char *escaped_string,
+                                                         const char *escaped_string_end,
+                                                         const char *illegal_characters);
+gchar **            g_uri_list_extract_uris             (const gchar *uri_list);
+
+
+
+

Description

+

+Functions for manipulating Universal Resource Identifiers (URIs) as +defined by +RFC 3986. It is highly recommended that you have read and +understand RFC 3986 for understanding this API.

+
+
+

Details

+
+

G_URI_RESERVED_CHARS_ALLOWED_IN_PATH

+
#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/"
+
+

+Allowed characters in a path. Includes "!$&'()*+,;=:@/".

+
+
+
+

G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT

+
#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@"
+
+

+Allowed characters in path elements. Includes "!$&'()*+,;=:@".

+
+
+
+

G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO

+
#define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":"
+
+

+Allowed characters in userinfo as defined in RFC 3986. Includes "!$&'()*+,;=:".

+
+
+
+

G_URI_RESERVED_CHARS_GENERIC_DELIMITERS

+
#define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@"
+
+

+Generic delimiters characters as defined in RFC 3986. Includes ":/?#[]@".

+
+
+
+

G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS

+
#define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;="
+
+

+Subcomponent delimiter characters as defined in RFC 3986. Includes "!$&'()*+,;=".

+
+
+
+

g_uri_parse_scheme ()

+
char *              g_uri_parse_scheme                  (const char *uri);
+

+Gets the scheme portion of a URI string. RFC 3986 decodes the scheme as: +

+
+URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 
+
+

+Common schemes include "file", "http", "svn+ssh", etc.

+
++ + + + + + + + + + +

uri :

a valid URI. +

Returns :

The "Scheme" component of the URI, or NULL on error. +The returned string should be freed when no longer needed. + +
+

Since 2.16

+
+
+
+

g_uri_escape_string ()

+
char *              g_uri_escape_string                 (const char *unescaped,
+                                                         const char *reserved_chars_allowed,
+                                                         gboolean allow_utf8);
+

+Escapes a string for use in a URI. +

+

+Normally all characters that are not "unreserved" (i.e. ASCII alphanumerical +characters plus dash, dot, underscore and tilde) are escaped. +But if you specify characters in reserved_chars_allowed they are not +escaped. This is useful for the "reserved" characters in the URI +specification, since those are allowed unescaped in some portions of +a URI.

+
++ + + + + + + + + + + + + + + + + + +

unescaped :

the unescaped input string. +

reserved_chars_allowed :

a string of reserved characters that are + allowed to be used. +

allow_utf8 :

TRUE if the result can include UTF-8 characters. +

Returns :

an escaped version of unescaped. The returned string should be +freed when no longer needed. + +
+

Since 2.16

+
+
+
+

g_uri_unescape_string ()

+
char *              g_uri_unescape_string               (const char *escaped_string,
+                                                         const char *illegal_characters);
+

+Unescapes a whole escaped string. +

+

+If any of the characters in illegal_characters or the character zero appears +as an escaped character in escaped_string then that is an error and NULL +will be returned. This is useful it you want to avoid for instance having a +slash being expanded in an escaped path element, which might confuse pathname +handling.

+
++ + + + + + + + + + + + + + +

escaped_string :

an escaped string to be unescaped. +

illegal_characters :

an optional string of illegal characters not to be allowed. +

Returns :

an unescaped version of escaped_string. The returned string +should be freed when no longer needed. + +
+

Since 2.16

+
+
+
+

g_uri_unescape_segment ()

+
char *              g_uri_unescape_segment              (const char *escaped_string,
+                                                         const char *escaped_string_end,
+                                                         const char *illegal_characters);
+

+Unescapes a segment of an escaped string. +

+

+If any of the characters in illegal_characters or the character zero appears +as an escaped character in escaped_string then that is an error and NULL +will be returned. This is useful it you want to avoid for instance having a +slash being expanded in an escaped path element, which might confuse pathname +handling.

+
++ + + + + + + + + + + + + + + + + + +

escaped_string :

a string. +

escaped_string_end :

a string. +

illegal_characters :

an optional string of illegal characters not to be allowed. +

Returns :

an unescaped version of escaped_string or NULL on error. +The returned string should be freed when no longer needed. + +
+

Since 2.16

+
+
+
+

g_uri_list_extract_uris ()

+
gchar **            g_uri_list_extract_uris             (const gchar *uri_list);
+

+Splits an URI list conforming to the text/uri-list +mime type defined in RFC 2483 into individual URIs, +discarding any comments. The URIs are not validated.

+
++ + + + + + + + + + +

uri_list :

an URI list +

Returns :

a newly allocated NULL-terminated list of + strings holding the individual URIs. The array should + be freed with g_strfreev(). + +
+

Since 2.6

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Unicode-Manipulation.html b/docs/reference/glib/html/glib-Unicode-Manipulation.html new file mode 100644 index 0000000..9e0eb6e --- /dev/null +++ b/docs/reference/glib/html/glib-Unicode-Manipulation.html @@ -0,0 +1,3307 @@ + + + + +Unicode Manipulation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Unicode Manipulation

+

Unicode Manipulation — functions operating on Unicode characters and UTF-8 strings

+
+
+

Synopsis

+
+#include <glib.h>
+
+typedef             gunichar;
+typedef             gunichar2;
+
+gboolean            g_unichar_validate                  (gunichar ch);
+gboolean            g_unichar_isalnum                   (gunichar c);
+gboolean            g_unichar_isalpha                   (gunichar c);
+gboolean            g_unichar_iscntrl                   (gunichar c);
+gboolean            g_unichar_isdefined                 (gunichar c);
+gboolean            g_unichar_isdigit                   (gunichar c);
+gboolean            g_unichar_isgraph                   (gunichar c);
+gboolean            g_unichar_islower                   (gunichar c);
+gboolean            g_unichar_ismark                    (gunichar c);
+gboolean            g_unichar_isprint                   (gunichar c);
+gboolean            g_unichar_ispunct                   (gunichar c);
+gboolean            g_unichar_isspace                   (gunichar c);
+gboolean            g_unichar_istitle                   (gunichar c);
+gboolean            g_unichar_isupper                   (gunichar c);
+gboolean            g_unichar_isxdigit                  (gunichar c);
+gboolean            g_unichar_iswide                    (gunichar c);
+gboolean            g_unichar_iswide_cjk                (gunichar c);
+gboolean            g_unichar_iszerowidth               (gunichar c);
+gunichar            g_unichar_toupper                   (gunichar c);
+gunichar            g_unichar_tolower                   (gunichar c);
+gunichar            g_unichar_totitle                   (gunichar c);
+gint                g_unichar_digit_value               (gunichar c);
+gint                g_unichar_xdigit_value              (gunichar c);
+enum                GUnicodeType;
+GUnicodeType        g_unichar_type                      (gunichar c);
+enum                GUnicodeBreakType;
+GUnicodeBreakType   g_unichar_break_type                (gunichar c);
+gint                g_unichar_combining_class           (gunichar uc);
+void                g_unicode_canonical_ordering        (gunichar *string,
+                                                         gsize len);
+gunichar *          g_unicode_canonical_decomposition   (gunichar ch,
+                                                         gsize *result_len);
+gboolean            g_unichar_get_mirror_char           (gunichar ch,
+                                                         gunichar *mirrored_ch);
+enum                GUnicodeScript;
+GUnicodeScript      g_unichar_get_script                (gunichar ch);
+
+#define             g_utf8_next_char                    (p)
+gunichar            g_utf8_get_char                     (const gchar *p);
+gunichar            g_utf8_get_char_validated           (const gchar *p,
+                                                         gssize max_len);
+gchar*              g_utf8_offset_to_pointer            (const gchar *str,
+                                                         glong offset);
+glong               g_utf8_pointer_to_offset            (const gchar *str,
+                                                         const gchar *pos);
+gchar*              g_utf8_prev_char                    (const gchar *p);
+gchar*              g_utf8_find_next_char               (const gchar *p,
+                                                         const gchar *end);
+gchar*              g_utf8_find_prev_char               (const gchar *str,
+                                                         const gchar *p);
+glong               g_utf8_strlen                       (const gchar *p,
+                                                         gssize max);
+gchar*              g_utf8_strncpy                      (gchar *dest,
+                                                         const gchar *src,
+                                                         gsize n);
+gchar*              g_utf8_strchr                       (const gchar *p,
+                                                         gssize len,
+                                                         gunichar c);
+gchar*              g_utf8_strrchr                      (const gchar *p,
+                                                         gssize len,
+                                                         gunichar c);
+gchar*              g_utf8_strreverse                   (const gchar *str,
+                                                         gssize len);
+gboolean            g_utf8_validate                     (const gchar *str,
+                                                         gssize max_len,
+                                                         const gchar **end);
+
+gchar *             g_utf8_strup                        (const gchar *str,
+                                                         gssize len);
+gchar *             g_utf8_strdown                      (const gchar *str,
+                                                         gssize len);
+gchar *             g_utf8_casefold                     (const gchar *str,
+                                                         gssize len);
+gchar *             g_utf8_normalize                    (const gchar *str,
+                                                         gssize len,
+                                                         GNormalizeMode mode);
+enum                GNormalizeMode;
+gint                g_utf8_collate                      (const gchar *str1,
+                                                         const gchar *str2);
+gchar *             g_utf8_collate_key                  (const gchar *str,
+                                                         gssize len);
+gchar *             g_utf8_collate_key_for_filename     (const gchar *str,
+                                                         gssize len);
+
+gunichar2 *         g_utf8_to_utf16                     (const gchar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+gunichar *          g_utf8_to_ucs4                      (const gchar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+gunichar *          g_utf8_to_ucs4_fast                 (const gchar *str,
+                                                         glong len,
+                                                         glong *items_written);
+gunichar *          g_utf16_to_ucs4                     (const gunichar2 *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+gchar*              g_utf16_to_utf8                     (const gunichar2 *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+gunichar2 *         g_ucs4_to_utf16                     (const gunichar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+gchar*              g_ucs4_to_utf8                      (const gunichar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+gint                g_unichar_to_utf8                   (gunichar c,
+                                                         gchar *outbuf);
+
+
+
+

Description

+

+This section describes a number of functions for dealing with +Unicode characters and strings. There are analogues of the +traditional ctype.h character classification +and case conversion functions, UTF-8 analogues of some string utility +functions, functions to perform normalization, case conversion and +collation on UTF-8 strings and finally functions to convert between +the UTF-8, UTF-16 and UCS-4 encodings of Unicode. +

+

+The implementations of the Unicode functions in GLib are based +on the Unicode Character Data tables, which are available from +www.unicode.org. +GLib 2.8 supports Unicode 4.0, GLib 2.10 supports Unicode 4.1, +GLib 2.12 supports Unicode 5.0, GLib 2.16.3 supports Unicode 5.1. +

+
+
+

Details

+
+

gunichar

+
typedef guint32 gunichar;
+
+

+A type which can hold any UTF-32 or UCS-4 character code, also known +as a Unicode code point. +

+

+If you want to produce the UTF-8 representation of a gunichar, +use g_ucs4_to_utf8(). See also g_utf8_to_ucs4() for the reverse process. +

+

+To print/scan values of this type as integer, use +G_GINT32_MODIFIER and/or G_GUINT32_FORMAT. +

+

+The notation to express a Unicode code point in running text is as a +hexadecimal number with four to six digits and uppercase letters, prefixed +by the string "U+". Leading zeros are omitted, unless the code point would +have fewer than four hexadecimal digits. +For example, "U+0041 LATIN CAPITAL LETTER A". +To print a code point in the U+-notation, use the format string +"U+04"G_GINT32_FORMAT"X". +To scan, use the format string "U+06"G_GINT32_FORMAT"X". +

+
+gunichar c;
+sscanf ("U+0041", "U+%06"G_GINT32_FORMAT"X", &c)
+g_print ("Read U+%04"G_GINT32_FORMAT"X", c);
+
+

+

+
+
+
+

gunichar2

+
typedef guint16 gunichar2;
+
+

+A type which can hold any UTF-16 code +point[3]. +

+

+To print/scan values of this type to/from text you need to convert +to/from UTF-8, using g_utf16_to_utf8()/g_utf8_to_utf16(). +

+

+To print/scan values of this type as integer, use +G_GINT16_MODIFIER and/or G_GUINT16_FORMAT. +

+
+
+
+

g_unichar_validate ()

+
gboolean            g_unichar_validate                  (gunichar ch);
+

+Checks whether ch is a valid Unicode character. Some possible +integer values of ch will not be valid. 0 is considered a valid +character, though it's normally a string terminator.

+
++ + + + + + + + + + +

ch :

a Unicode character +

Returns :

TRUE if ch is a valid Unicode character +
+
+
+
+

g_unichar_isalnum ()

+
gboolean            g_unichar_isalnum                   (gunichar c);
+

+Determines whether a character is alphanumeric. +Given some UTF-8 text, obtain a character value +with g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is an alphanumeric character +
+
+
+
+

g_unichar_isalpha ()

+
gboolean            g_unichar_isalpha                   (gunichar c);
+

+Determines whether a character is alphabetic (i.e. a letter). +Given some UTF-8 text, obtain a character value with +g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is an alphabetic character +
+
+
+
+

g_unichar_iscntrl ()

+
gboolean            g_unichar_iscntrl                   (gunichar c);
+

+Determines whether a character is a control character. +Given some UTF-8 text, obtain a character value with +g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is a control character +
+
+
+
+

g_unichar_isdefined ()

+
gboolean            g_unichar_isdefined                 (gunichar c);
+

+Determines if a given character is assigned in the Unicode +standard.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if the character has an assigned value +
+
+
+
+

g_unichar_isdigit ()

+
gboolean            g_unichar_isdigit                   (gunichar c);
+

+Determines whether a character is numeric (i.e. a digit). This +covers ASCII 0-9 and also digits in other languages/scripts. Given +some UTF-8 text, obtain a character value with g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is a digit +
+
+
+
+

g_unichar_isgraph ()

+
gboolean            g_unichar_isgraph                   (gunichar c);
+

+Determines whether a character is printable and not a space +(returns FALSE for control characters, format characters, and +spaces). g_unichar_isprint() is similar, but returns TRUE for +spaces. Given some UTF-8 text, obtain a character value with +g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is printable unless it's a space +
+
+
+
+

g_unichar_islower ()

+
gboolean            g_unichar_islower                   (gunichar c);
+

+Determines whether a character is a lowercase letter. +Given some UTF-8 text, obtain a character value with +g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is a lowercase letter +
+
+
+
+

g_unichar_ismark ()

+
gboolean            g_unichar_ismark                    (gunichar c);
+

+Determines whether a character is a mark (non-spacing mark, +combining mark, or enclosing mark in Unicode speak). +Given some UTF-8 text, obtain a character value +with g_utf8_get_char(). +

+

+Note: in most cases where isalpha characters are allowed, +ismark characters should be allowed to as they are essential +for writing most European languages as well as many non-Latin +scripts.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is a mark character + +
+

Since 2.14

+
+
+
+

g_unichar_isprint ()

+
gboolean            g_unichar_isprint                   (gunichar c);
+

+Determines whether a character is printable. +Unlike g_unichar_isgraph(), returns TRUE for spaces. +Given some UTF-8 text, obtain a character value with +g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is printable +
+
+
+
+

g_unichar_ispunct ()

+
gboolean            g_unichar_ispunct                   (gunichar c);
+

+Determines whether a character is punctuation or a symbol. +Given some UTF-8 text, obtain a character value with +g_utf8_get_char().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is a punctuation or symbol character +
+
+
+
+

g_unichar_isspace ()

+
gboolean            g_unichar_isspace                   (gunichar c);
+

+Determines whether a character is a space, tab, or line separator +(newline, carriage return, etc.). Given some UTF-8 text, obtain a +character value with g_utf8_get_char(). +

+

+(Note: don't use this to do word breaking; you have to use +Pango or equivalent to get word breaking right, the algorithm +is fairly complex.)

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is a space character +
+
+
+
+

g_unichar_istitle ()

+
gboolean            g_unichar_istitle                   (gunichar c);
+

+Determines if a character is titlecase. Some characters in +Unicode which are composites, such as the DZ digraph +have three case variants instead of just two. The titlecase +form is used at the beginning of a word where only the +first letter is capitalized. The titlecase form of the DZ +digraph is U+01F2 LATIN CAPITAL LETTTER D WITH SMALL LETTER Z.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if the character is titlecase +
+
+
+
+

g_unichar_isupper ()

+
gboolean            g_unichar_isupper                   (gunichar c);
+

+Determines if a character is uppercase.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if c is an uppercase character +
+
+
+
+

g_unichar_isxdigit ()

+
gboolean            g_unichar_isxdigit                  (gunichar c);
+

+Determines if a character is a hexidecimal digit.

+
++ + + + + + + + + + +

c :

a Unicode character. +

Returns :

TRUE if the character is a hexadecimal digit +
+
+
+
+

g_unichar_iswide ()

+
gboolean            g_unichar_iswide                    (gunichar c);
+

+Determines if a character is typically rendered in a double-width +cell.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if the character is wide +
+
+
+
+

g_unichar_iswide_cjk ()

+
gboolean            g_unichar_iswide_cjk                (gunichar c);
+

+Determines if a character is typically rendered in a double-width +cell under legacy East Asian locales. If a character is wide according to +g_unichar_iswide(), then it is also reported wide with this function, but +the converse is not necessarily true. See the +Unicode Standard +Annex #11 for details. +

+

+If a character passes the g_unichar_iswide() test then it will also pass +this test, but not the other way around. Note that some characters may +pas both this test and g_unichar_iszerowidth().

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if the character is wide in legacy East Asian locales + +
+

Since 2.12

+
+
+
+

g_unichar_iszerowidth ()

+
gboolean            g_unichar_iszerowidth               (gunichar c);
+

+Determines if a given character typically takes zero width when rendered. +The return value is TRUE for all non-spacing and enclosing marks +(e.g., combining accents), format characters, zero-width +space, but not U+00AD SOFT HYPHEN. +

+

+A typical use of this function is with one of g_unichar_iswide() or +g_unichar_iswide_cjk() to determine the number of cells a string occupies +when displayed on a grid display (terminals). However, note that not all +terminals support zero-width rendering of zero-width marks.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

TRUE if the character has zero width + +
+

Since 2.14

+
+
+
+

g_unichar_toupper ()

+
gunichar            g_unichar_toupper                   (gunichar c);
+

+Converts a character to uppercase.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

the result of converting c to uppercase. + If c is not an lowercase or titlecase character, + or has no upper case equivalent c is returned unchanged. +
+
+
+
+

g_unichar_tolower ()

+
gunichar            g_unichar_tolower                   (gunichar c);
+

+Converts a character to lower case.

+
++ + + + + + + + + + +

c :

a Unicode character. +

Returns :

the result of converting c to lower case. + If c is not an upperlower or titlecase character, + or has no lowercase equivalent c is returned unchanged. +
+
+
+
+

g_unichar_totitle ()

+
gunichar            g_unichar_totitle                   (gunichar c);
+

+Converts a character to the titlecase.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

the result of converting c to titlecase. + If c is not an uppercase or lowercase character, + c is returned unchanged. +
+
+
+
+

g_unichar_digit_value ()

+
gint                g_unichar_digit_value               (gunichar c);
+

+Determines the numeric value of a character as a decimal +digit.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

If c is a decimal digit (according to +g_unichar_isdigit()), its numeric value. Otherwise, -1. +
+
+
+
+

g_unichar_xdigit_value ()

+
gint                g_unichar_xdigit_value              (gunichar c);
+

+Determines the numeric value of a character as a hexidecimal +digit.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

If c is a hex digit (according to +g_unichar_isxdigit()), its numeric value. Otherwise, -1. +
+
+
+
+

enum GUnicodeType

+
typedef enum
+{
+  G_UNICODE_CONTROL,
+  G_UNICODE_FORMAT,
+  G_UNICODE_UNASSIGNED,
+  G_UNICODE_PRIVATE_USE,
+  G_UNICODE_SURROGATE,
+  G_UNICODE_LOWERCASE_LETTER,
+  G_UNICODE_MODIFIER_LETTER,
+  G_UNICODE_OTHER_LETTER,
+  G_UNICODE_TITLECASE_LETTER,
+  G_UNICODE_UPPERCASE_LETTER,
+  G_UNICODE_COMBINING_MARK,
+  G_UNICODE_ENCLOSING_MARK,
+  G_UNICODE_NON_SPACING_MARK,
+  G_UNICODE_DECIMAL_NUMBER,
+  G_UNICODE_LETTER_NUMBER,
+  G_UNICODE_OTHER_NUMBER,
+  G_UNICODE_CONNECT_PUNCTUATION,
+  G_UNICODE_DASH_PUNCTUATION,
+  G_UNICODE_CLOSE_PUNCTUATION,
+  G_UNICODE_FINAL_PUNCTUATION,
+  G_UNICODE_INITIAL_PUNCTUATION,
+  G_UNICODE_OTHER_PUNCTUATION,
+  G_UNICODE_OPEN_PUNCTUATION,
+  G_UNICODE_CURRENCY_SYMBOL,
+  G_UNICODE_MODIFIER_SYMBOL,
+  G_UNICODE_MATH_SYMBOL,
+  G_UNICODE_OTHER_SYMBOL,
+  G_UNICODE_LINE_SEPARATOR,
+  G_UNICODE_PARAGRAPH_SEPARATOR,
+  G_UNICODE_SPACE_SEPARATOR
+} GUnicodeType;
+
+

+These are the possible character classifications from the +Unicode specification. +See http://www.unicode.org/Public/UNIDATA/UnicodeData.html. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_UNICODE_CONTROL

General category "Other, Control" (Cc) +

G_UNICODE_FORMAT

General category "Other, Format" (Cf) +

G_UNICODE_UNASSIGNED

General category "Other, Not Assigned" (Cn) +

G_UNICODE_PRIVATE_USE

General category "Other, Private Use" (Co) +

G_UNICODE_SURROGATE

General category "Other, Surrogate" (Cs) +

G_UNICODE_LOWERCASE_LETTER

General category "Letter, Lowercase" (Ll) +

G_UNICODE_MODIFIER_LETTER

General category "Letter, Modifier" (Lm) +

G_UNICODE_OTHER_LETTER

General category "Letter, Other" (Lo) +

G_UNICODE_TITLECASE_LETTER

General category "Letter, Titlecase" (Lt) +

G_UNICODE_UPPERCASE_LETTER

General category "Letter, Uppercase" (Lu) +

G_UNICODE_COMBINING_MARK

General category "Mark, Spacing Combining" (Mc) +

G_UNICODE_ENCLOSING_MARK

General category "Mark, Enclosing" (Me) +

G_UNICODE_NON_SPACING_MARK

General category "Mark, Nonspacing" (Mn) +

G_UNICODE_DECIMAL_NUMBER

General category "Number, Decimal Digit" (Nd) +

G_UNICODE_LETTER_NUMBER

General category "Number, Letter" (Nl) +

G_UNICODE_OTHER_NUMBER

General category "Number, Other" (No) +

G_UNICODE_CONNECT_PUNCTUATION

General category "Punctuation, Connector" (Pc) +

G_UNICODE_DASH_PUNCTUATION

General category "Punctuation, Dash" (Pd) +

G_UNICODE_CLOSE_PUNCTUATION

General category "Punctuation, Close" (Pe) +

G_UNICODE_FINAL_PUNCTUATION

General category "Punctuation, Final quote" (Pf) +

G_UNICODE_INITIAL_PUNCTUATION

General category "Punctuation, Initial quote" (Pi) +

G_UNICODE_OTHER_PUNCTUATION

General category "Punctuation, Other" (Po) +

G_UNICODE_OPEN_PUNCTUATION

General category "Punctuation, Open" (Ps) +

G_UNICODE_CURRENCY_SYMBOL

General category "Symbol, Currency" (Sc) +

G_UNICODE_MODIFIER_SYMBOL

General category "Symbol, Modifier" (Sk) +

G_UNICODE_MATH_SYMBOL

General category "Symbol, Math" (Sm) +

G_UNICODE_OTHER_SYMBOL

General category "Symbol, Other" (So) +

G_UNICODE_LINE_SEPARATOR

General category "Separator, Line" (Zl) +

G_UNICODE_PARAGRAPH_SEPARATOR

General category "Separator, Paragraph" (Zp) +

G_UNICODE_SPACE_SEPARATOR

General category "Separator, Space" (Zs) +
+
+
+
+

g_unichar_type ()

+
GUnicodeType        g_unichar_type                      (gunichar c);
+

+Classifies a Unicode character by type.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

the type of the character. +
+
+
+
+

enum GUnicodeBreakType

+
typedef enum
+{
+  G_UNICODE_BREAK_MANDATORY,
+  G_UNICODE_BREAK_CARRIAGE_RETURN,
+  G_UNICODE_BREAK_LINE_FEED,
+  G_UNICODE_BREAK_COMBINING_MARK,
+  G_UNICODE_BREAK_SURROGATE,
+  G_UNICODE_BREAK_ZERO_WIDTH_SPACE,
+  G_UNICODE_BREAK_INSEPARABLE,
+  G_UNICODE_BREAK_NON_BREAKING_GLUE,
+  G_UNICODE_BREAK_CONTINGENT,
+  G_UNICODE_BREAK_SPACE,
+  G_UNICODE_BREAK_AFTER,
+  G_UNICODE_BREAK_BEFORE,
+  G_UNICODE_BREAK_BEFORE_AND_AFTER,
+  G_UNICODE_BREAK_HYPHEN,
+  G_UNICODE_BREAK_NON_STARTER,
+  G_UNICODE_BREAK_OPEN_PUNCTUATION,
+  G_UNICODE_BREAK_CLOSE_PUNCTUATION,
+  G_UNICODE_BREAK_QUOTATION,
+  G_UNICODE_BREAK_EXCLAMATION,
+  G_UNICODE_BREAK_IDEOGRAPHIC,
+  G_UNICODE_BREAK_NUMERIC,
+  G_UNICODE_BREAK_INFIX_SEPARATOR,
+  G_UNICODE_BREAK_SYMBOL,
+  G_UNICODE_BREAK_ALPHABETIC,
+  G_UNICODE_BREAK_PREFIX,
+  G_UNICODE_BREAK_POSTFIX,
+  G_UNICODE_BREAK_COMPLEX_CONTEXT,
+  G_UNICODE_BREAK_AMBIGUOUS,
+  G_UNICODE_BREAK_UNKNOWN,
+  G_UNICODE_BREAK_NEXT_LINE,
+  G_UNICODE_BREAK_WORD_JOINER,
+  G_UNICODE_BREAK_HANGUL_L_JAMO,
+  G_UNICODE_BREAK_HANGUL_V_JAMO,
+  G_UNICODE_BREAK_HANGUL_T_JAMO,
+  G_UNICODE_BREAK_HANGUL_LV_SYLLABLE,
+  G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE
+} GUnicodeBreakType;
+
+

+These are the possible line break classifications. +The five Hangul types were added in Unicode 4.1, so, has been +introduced in GLib 2.10. Note that new types may be added in the future. +Applications should be ready to handle unknown values. +They may be regarded as G_UNICODE_BREAK_UNKNOWN. +See http://www.unicode.org/unicode/reports/tr14/. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_UNICODE_BREAK_MANDATORY

Mandatory Break (BK) +

G_UNICODE_BREAK_CARRIAGE_RETURN

Carriage Return (CR) +

G_UNICODE_BREAK_LINE_FEED

Line Feed (LF) +

G_UNICODE_BREAK_COMBINING_MARK

Attached Characters and Combining Marks (CM) +

G_UNICODE_BREAK_SURROGATE

Surrogates (SG) +

G_UNICODE_BREAK_ZERO_WIDTH_SPACE

Zero Width Space (ZW) +

G_UNICODE_BREAK_INSEPARABLE

Inseparable (IN) +

G_UNICODE_BREAK_NON_BREAKING_GLUE

Non-breaking ("Glue") (GL) +

G_UNICODE_BREAK_CONTINGENT

Contingent Break Opportunity (CB) +

G_UNICODE_BREAK_SPACE

Space (SP) +

G_UNICODE_BREAK_AFTER

Break Opportunity After (BA) +

G_UNICODE_BREAK_BEFORE

Break Opportunity Before (BB) +

G_UNICODE_BREAK_BEFORE_AND_AFTER

Break Opportunity Before and After (B2) +

G_UNICODE_BREAK_HYPHEN

Hyphen (HY) +

G_UNICODE_BREAK_NON_STARTER

Nonstarter (NS) +

G_UNICODE_BREAK_OPEN_PUNCTUATION

Opening Punctuation (OP) +

G_UNICODE_BREAK_CLOSE_PUNCTUATION

Closing Punctuation (CL) +

G_UNICODE_BREAK_QUOTATION

Ambiguous Quotation (QU) +

G_UNICODE_BREAK_EXCLAMATION

Exclamation/Interrogation (EX) +

G_UNICODE_BREAK_IDEOGRAPHIC

Ideographic (ID) +

G_UNICODE_BREAK_NUMERIC

Numeric (NU) +

G_UNICODE_BREAK_INFIX_SEPARATOR

Infix Separator (Numeric) (IS) +

G_UNICODE_BREAK_SYMBOL

Symbols Allowing Break After (SY) +

G_UNICODE_BREAK_ALPHABETIC

Ordinary Alphabetic and Symbol Characters (AL) +

G_UNICODE_BREAK_PREFIX

Prefix (Numeric) (PR) +

G_UNICODE_BREAK_POSTFIX

Postfix (Numeric) (PO) +

G_UNICODE_BREAK_COMPLEX_CONTEXT

Complex Content Dependent (South East Asian) (SA) +

G_UNICODE_BREAK_AMBIGUOUS

Ambiguous (Alphabetic or Ideographic) (AI) +

G_UNICODE_BREAK_UNKNOWN

Unknown (XX) +

G_UNICODE_BREAK_NEXT_LINE

Next Line (NL) +

G_UNICODE_BREAK_WORD_JOINER

Word Joiner (WJ) +

G_UNICODE_BREAK_HANGUL_L_JAMO

Hangul L Jamo (JL) +

G_UNICODE_BREAK_HANGUL_V_JAMO

Hangul V Jamo (JV) +

G_UNICODE_BREAK_HANGUL_T_JAMO

Hangul T Jamo (JT) +

G_UNICODE_BREAK_HANGUL_LV_SYLLABLE

Hangul LV Syllable (H2) +

G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE

Hangul LVT Syllable (H3) +
+
+
+
+

g_unichar_break_type ()

+
GUnicodeBreakType   g_unichar_break_type                (gunichar c);
+

+Determines the break type of c. c should be a Unicode character +(to derive a character from UTF-8 encoded text, use +g_utf8_get_char()). The break type is used to find word and line +breaks ("text boundaries"), Pango implements the Unicode boundary +resolution algorithms and normally you would use a function such +as pango_break() instead of caring about break types yourself.

+
++ + + + + + + + + + +

c :

a Unicode character +

Returns :

the break type of c +
+
+
+
+

g_unichar_combining_class ()

+
gint                g_unichar_combining_class           (gunichar uc);
+

+Determines the canonical combining class of a Unicode character.

+
++ + + + + + + + + + +

uc :

a Unicode character +

Returns :

the combining class of the character + +
+

Since 2.14

+
+
+
+

g_unicode_canonical_ordering ()

+
void                g_unicode_canonical_ordering        (gunichar *string,
+                                                         gsize len);
+

+Computes the canonical ordering of a string in-place. +This rearranges decomposed characters in the string +according to their combining classes. See the Unicode +manual for more information.

+
++ + + + + + + + + + +

string :

a UCS-4 encoded string. +

len :

the maximum length of string to use. +
+
+
+
+

g_unicode_canonical_decomposition ()

+
gunichar *          g_unicode_canonical_decomposition   (gunichar ch,
+                                                         gsize *result_len);
+

+Computes the canonical decomposition of a Unicode character.

+
++ + + + + + + + + + + + + + +

ch :

a Unicode character. +

result_len :

location to store the length of the return value. +

Returns :

a newly allocated string of Unicode characters. + result_len is set to the resulting length of the string. +
+
+
+
+

g_unichar_get_mirror_char ()

+
gboolean            g_unichar_get_mirror_char           (gunichar ch,
+                                                         gunichar *mirrored_ch);
+

+In Unicode, some characters are mirrored. This +means that their images are mirrored horizontally in text that is laid +out from right to left. For instance, "(" would become its mirror image, +")", in right-to-left text. +

+

+If ch has the Unicode mirrored property and there is another unicode +character that typically has a glyph that is the mirror image of ch's +glyph and mirrored_ch is set, it puts that character in the address +pointed to by mirrored_ch. Otherwise the original character is put.

+
++ + + + + + + + + + + + + + +

ch :

a Unicode character +

mirrored_ch :

location to store the mirrored character +

Returns :

TRUE if ch has a mirrored character, FALSE otherwise + +
+

Since 2.4

+
+
+
+

enum GUnicodeScript

+
typedef enum 
+{                         /* ISO 15924 code */
+  G_UNICODE_SCRIPT_INVALID_CODE = -1,
+  G_UNICODE_SCRIPT_COMMON       = 0,   /* Zyyy */
+  G_UNICODE_SCRIPT_INHERITED,          /* Qaai */
+  G_UNICODE_SCRIPT_ARABIC,             /* Arab */
+  G_UNICODE_SCRIPT_ARMENIAN,           /* Armn */
+  G_UNICODE_SCRIPT_BENGALI,            /* Beng */
+  G_UNICODE_SCRIPT_BOPOMOFO,           /* Bopo */
+  G_UNICODE_SCRIPT_CHEROKEE,           /* Cher */
+  G_UNICODE_SCRIPT_COPTIC,             /* Qaac */
+  G_UNICODE_SCRIPT_CYRILLIC,           /* Cyrl (Cyrs) */
+  G_UNICODE_SCRIPT_DESERET,            /* Dsrt */
+  G_UNICODE_SCRIPT_DEVANAGARI,         /* Deva */
+  G_UNICODE_SCRIPT_ETHIOPIC,           /* Ethi */
+  G_UNICODE_SCRIPT_GEORGIAN,           /* Geor (Geon, Geoa) */
+  G_UNICODE_SCRIPT_GOTHIC,             /* Goth */
+  G_UNICODE_SCRIPT_GREEK,              /* Grek */
+  G_UNICODE_SCRIPT_GUJARATI,           /* Gujr */
+  G_UNICODE_SCRIPT_GURMUKHI,           /* Guru */
+  G_UNICODE_SCRIPT_HAN,                /* Hani */
+  G_UNICODE_SCRIPT_HANGUL,             /* Hang */
+  G_UNICODE_SCRIPT_HEBREW,             /* Hebr */
+  G_UNICODE_SCRIPT_HIRAGANA,           /* Hira */
+  G_UNICODE_SCRIPT_KANNADA,            /* Knda */
+  G_UNICODE_SCRIPT_KATAKANA,           /* Kana */
+  G_UNICODE_SCRIPT_KHMER,              /* Khmr */
+  G_UNICODE_SCRIPT_LAO,                /* Laoo */
+  G_UNICODE_SCRIPT_LATIN,              /* Latn (Latf, Latg) */
+  G_UNICODE_SCRIPT_MALAYALAM,          /* Mlym */
+  G_UNICODE_SCRIPT_MONGOLIAN,          /* Mong */
+  G_UNICODE_SCRIPT_MYANMAR,            /* Mymr */
+  G_UNICODE_SCRIPT_OGHAM,              /* Ogam */
+  G_UNICODE_SCRIPT_OLD_ITALIC,         /* Ital */
+  G_UNICODE_SCRIPT_ORIYA,              /* Orya */
+  G_UNICODE_SCRIPT_RUNIC,              /* Runr */
+  G_UNICODE_SCRIPT_SINHALA,            /* Sinh */
+  G_UNICODE_SCRIPT_SYRIAC,             /* Syrc (Syrj, Syrn, Syre) */
+  G_UNICODE_SCRIPT_TAMIL,              /* Taml */
+  G_UNICODE_SCRIPT_TELUGU,             /* Telu */
+  G_UNICODE_SCRIPT_THAANA,             /* Thaa */
+  G_UNICODE_SCRIPT_THAI,               /* Thai */
+  G_UNICODE_SCRIPT_TIBETAN,            /* Tibt */
+  G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */
+  G_UNICODE_SCRIPT_YI,                 /* Yiii */
+  G_UNICODE_SCRIPT_TAGALOG,            /* Tglg */
+  G_UNICODE_SCRIPT_HANUNOO,            /* Hano */
+  G_UNICODE_SCRIPT_BUHID,              /* Buhd */
+  G_UNICODE_SCRIPT_TAGBANWA,           /* Tagb */
+
+  /* Unicode-4.0 additions */
+  G_UNICODE_SCRIPT_BRAILLE,            /* Brai */
+  G_UNICODE_SCRIPT_CYPRIOT,            /* Cprt */
+  G_UNICODE_SCRIPT_LIMBU,              /* Limb */
+  G_UNICODE_SCRIPT_OSMANYA,            /* Osma */
+  G_UNICODE_SCRIPT_SHAVIAN,            /* Shaw */
+  G_UNICODE_SCRIPT_LINEAR_B,           /* Linb */
+  G_UNICODE_SCRIPT_TAI_LE,             /* Tale */
+  G_UNICODE_SCRIPT_UGARITIC,           /* Ugar */
+      
+  /* Unicode-4.1 additions */
+  G_UNICODE_SCRIPT_NEW_TAI_LUE,        /* Talu */
+  G_UNICODE_SCRIPT_BUGINESE,           /* Bugi */
+  G_UNICODE_SCRIPT_GLAGOLITIC,         /* Glag */
+  G_UNICODE_SCRIPT_TIFINAGH,           /* Tfng */
+  G_UNICODE_SCRIPT_SYLOTI_NAGRI,       /* Sylo */
+  G_UNICODE_SCRIPT_OLD_PERSIAN,        /* Xpeo */
+  G_UNICODE_SCRIPT_KHAROSHTHI,         /* Khar */
+
+  /* Unicode-5.0 additions */
+  G_UNICODE_SCRIPT_UNKNOWN,            /* Zzzz */
+  G_UNICODE_SCRIPT_BALINESE,           /* Bali */
+  G_UNICODE_SCRIPT_CUNEIFORM,          /* Xsux */
+  G_UNICODE_SCRIPT_PHOENICIAN,         /* Phnx */
+  G_UNICODE_SCRIPT_PHAGS_PA,           /* Phag */
+  G_UNICODE_SCRIPT_NKO,                /* Nkoo */
+
+  /* Unicode-5.1 additions */
+  G_UNICODE_SCRIPT_KAYAH_LI,           /* Kali */
+  G_UNICODE_SCRIPT_LEPCHA,             /* Lepc */
+  G_UNICODE_SCRIPT_REJANG,             /* Rjng */
+  G_UNICODE_SCRIPT_SUNDANESE,          /* Sund */
+  G_UNICODE_SCRIPT_SAURASHTRA,         /* Saur */
+  G_UNICODE_SCRIPT_CHAM,               /* Cham */
+  G_UNICODE_SCRIPT_OL_CHIKI,           /* Olck */
+  G_UNICODE_SCRIPT_VAI,                /* Vaii */
+  G_UNICODE_SCRIPT_CARIAN,             /* Cari */
+  G_UNICODE_SCRIPT_LYCIAN,             /* Lyci */
+  G_UNICODE_SCRIPT_LYDIAN              /* Lydi */
+} GUnicodeScript;
+
+

+The GUnicodeScript enumeration identifies different writing +systems. The values correspond to the names as defined in the +Unicode standard. The enumeration has been added in GLib 2.14, +and is interchangeable with PangoScript. +Note that new types may be added in the future. Applications +should be ready to handle unknown values. +See Unicode Standard Annex +#24: Script names. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_UNICODE_SCRIPT_INVALID_CODE

a value never returned from g_unichar_get_script() +

G_UNICODE_SCRIPT_COMMON

a character used by multiple different scripts +

G_UNICODE_SCRIPT_INHERITED

a mark glyph that takes its script from the + base glyph to which it is attached +

G_UNICODE_SCRIPT_ARABIC

Arabic +

G_UNICODE_SCRIPT_ARMENIAN

Armenian +

G_UNICODE_SCRIPT_BENGALI

Bengali +

G_UNICODE_SCRIPT_BOPOMOFO

Bopomofo +

G_UNICODE_SCRIPT_CHEROKEE

Cherokee +

G_UNICODE_SCRIPT_COPTIC

Coptic +

G_UNICODE_SCRIPT_CYRILLIC

Cyrillic +

G_UNICODE_SCRIPT_DESERET

Deseret +

G_UNICODE_SCRIPT_DEVANAGARI

Devanagari +

G_UNICODE_SCRIPT_ETHIOPIC

Ethiopic +

G_UNICODE_SCRIPT_GEORGIAN

Georgian +

G_UNICODE_SCRIPT_GOTHIC

Gothic +

G_UNICODE_SCRIPT_GREEK

Greek +

G_UNICODE_SCRIPT_GUJARATI

Gujarati +

G_UNICODE_SCRIPT_GURMUKHI

Gurmukhi +

G_UNICODE_SCRIPT_HAN

Han +

G_UNICODE_SCRIPT_HANGUL

Hangul +

G_UNICODE_SCRIPT_HEBREW

Hebrew +

G_UNICODE_SCRIPT_HIRAGANA

Hiragana +

G_UNICODE_SCRIPT_KANNADA

Kannada +

G_UNICODE_SCRIPT_KATAKANA

Katakana +

G_UNICODE_SCRIPT_KHMER

Khmer +

G_UNICODE_SCRIPT_LAO

Lao +

G_UNICODE_SCRIPT_LATIN

Latin +

G_UNICODE_SCRIPT_MALAYALAM

Malayalam +

G_UNICODE_SCRIPT_MONGOLIAN

Mongolian +

G_UNICODE_SCRIPT_MYANMAR

Myanmar +

G_UNICODE_SCRIPT_OGHAM

Ogham +

G_UNICODE_SCRIPT_OLD_ITALIC

Old Italic +

G_UNICODE_SCRIPT_ORIYA

Oriya +

G_UNICODE_SCRIPT_RUNIC

Runic +

G_UNICODE_SCRIPT_SINHALA

Sinhala +

G_UNICODE_SCRIPT_SYRIAC

Syriac +

G_UNICODE_SCRIPT_TAMIL

Tamil +

G_UNICODE_SCRIPT_TELUGU

Telugu +

G_UNICODE_SCRIPT_THAANA

Thaana +

G_UNICODE_SCRIPT_THAI

Thai +

G_UNICODE_SCRIPT_TIBETAN

Tibetan +

G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL

+ Canadian Aboriginal +

G_UNICODE_SCRIPT_YI

Yi +

G_UNICODE_SCRIPT_TAGALOG

Tagalog +

G_UNICODE_SCRIPT_HANUNOO

Hanunoo +

G_UNICODE_SCRIPT_BUHID

Buhid +

G_UNICODE_SCRIPT_TAGBANWA

Tagbanwa +

G_UNICODE_SCRIPT_BRAILLE

Braille +

G_UNICODE_SCRIPT_CYPRIOT

Cypriot +

G_UNICODE_SCRIPT_LIMBU

Limbu +

G_UNICODE_SCRIPT_OSMANYA

Osmanya +

G_UNICODE_SCRIPT_SHAVIAN

Shavian +

G_UNICODE_SCRIPT_LINEAR_B

Linear B +

G_UNICODE_SCRIPT_TAI_LE

Tai Le +

G_UNICODE_SCRIPT_UGARITIC

Ugaritic +

G_UNICODE_SCRIPT_NEW_TAI_LUE

New Tai Lue +

G_UNICODE_SCRIPT_BUGINESE

Buginese +

G_UNICODE_SCRIPT_GLAGOLITIC

Glagolitic +

G_UNICODE_SCRIPT_TIFINAGH

Tifinagh +

G_UNICODE_SCRIPT_SYLOTI_NAGRI

Syloti Nagri +

G_UNICODE_SCRIPT_OLD_PERSIAN

Old Persian +

G_UNICODE_SCRIPT_KHAROSHTHI

Kharoshthi +

G_UNICODE_SCRIPT_UNKNOWN

an unassigned code point +

G_UNICODE_SCRIPT_BALINESE

Balinese +

G_UNICODE_SCRIPT_CUNEIFORM

Cuneiform +

G_UNICODE_SCRIPT_PHOENICIAN

Phoenician +

G_UNICODE_SCRIPT_PHAGS_PA

Phags-pa +

G_UNICODE_SCRIPT_NKO

N'Ko +

G_UNICODE_SCRIPT_KAYAH_LI

Kayah Li. Since 2.16.3 +

G_UNICODE_SCRIPT_LEPCHA

Lepcha. Since 2.16.3 +

G_UNICODE_SCRIPT_REJANG

Rejang. Since 2.16.3 +

G_UNICODE_SCRIPT_SUNDANESE

Sundanese. Since 2.16.3 +

G_UNICODE_SCRIPT_SAURASHTRA

Saurashtra. Since 2.16.3 +

G_UNICODE_SCRIPT_CHAM

Cham. Since 2.16.3 +

G_UNICODE_SCRIPT_OL_CHIKI

Ol Chiki. Since 2.16.3 +

G_UNICODE_SCRIPT_VAI

Vai. Since 2.16.3 +

G_UNICODE_SCRIPT_CARIAN

Carian. Since 2.16.3 +

G_UNICODE_SCRIPT_LYCIAN

Lycian. Since 2.16.3 +

G_UNICODE_SCRIPT_LYDIAN

Lydian. Since 2.16.3 +
+
+
+
+

g_unichar_get_script ()

+
GUnicodeScript      g_unichar_get_script                (gunichar ch);
+

+Looks up the GUnicodeScript for a particular character (as defined +by Unicode Standard Annex 24). No check is made for ch being a +valid Unicode character; if you pass in invalid character, the +result is undefined. +

+

+This function is equivalent to pango_script_for_unichar() and the +two are interchangeable.

+
++ + + + + + + + + + +

ch :

a Unicode character +

Returns :

the GUnicodeScript for the character. + +
+

Since 2.14

+
+
+
+

g_utf8_next_char()

+
#define             g_utf8_next_char(p)
+

+Skips to the next character in a UTF-8 string. The string must be +valid; this macro is as fast as possible, and has no error-checking. +You would use this macro to iterate over a string character by +character. The macro returns the start of the next UTF-8 character. +Before using this macro, use g_utf8_validate() to validate strings +that may contain invalid UTF-8. +

+
++ + + + +

p :

Pointer to the start of a valid UTF-8 character. +
+
+
+
+

g_utf8_get_char ()

+
gunichar            g_utf8_get_char                     (const gchar *p);
+

+Converts a sequence of bytes encoded as UTF-8 to a Unicode character. +If p does not point to a valid UTF-8 encoded character, results are +undefined. If you are not sure that the bytes are complete +valid Unicode characters, you should use g_utf8_get_char_validated() +instead.

+
++ + + + + + + + + + +

p :

a pointer to Unicode character encoded as UTF-8 +

Returns :

the resulting character +
+
+
+
+

g_utf8_get_char_validated ()

+
gunichar            g_utf8_get_char_validated           (const gchar *p,
+                                                         gssize max_len);
+

+Convert a sequence of bytes encoded as UTF-8 to a Unicode character. +This function checks for incomplete characters, for invalid characters +such as characters that are out of the range of Unicode, and for +overlong encodings of valid characters.

+
++ + + + + + + + + + + + + + +

p :

a pointer to Unicode character encoded as UTF-8 +

max_len :

the maximum number of bytes to read, or -1, for no maximum or + if p is nul-terminated +

Returns :

the resulting character. If p points to a partial + sequence at the end of a string that could begin a valid + character (or if max_len is zero), returns (gunichar)-2; + otherwise, if p does not point to a valid UTF-8 encoded + Unicode character, returns (gunichar)-1. +
+
+
+
+

g_utf8_offset_to_pointer ()

+
gchar*              g_utf8_offset_to_pointer            (const gchar *str,
+                                                         glong offset);
+

+Converts from an integer character offset to a pointer to a position +within the string. +

+

+Since 2.10, this function allows to pass a negative offset to +step backwards. It is usually worth stepping backwards from the end +instead of forwards if offset is in the last fourth of the string, +since moving forward is about 3 times faster than moving backward. +

+

+

+
+

Note

+

+This function doesn't abort when reaching the end of str. Therefore +you should be sure that offset is within string boundaries before +calling that function. Call g_utf8_strlen() when unsure. +

+

+This limitation exists as this function is called frequently during +text rendering and therefore has to be as fast as possible. +

+
+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

offset :

a character offset within str +

Returns :

the resulting pointer +
+
+
+
+

g_utf8_pointer_to_offset ()

+
glong               g_utf8_pointer_to_offset            (const gchar *str,
+                                                         const gchar *pos);
+

+Converts from a pointer to position within a string to a integer +character offset. +

+

+Since 2.10, this function allows pos to be before str, and returns +a negative offset in this case.

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

pos :

a pointer to a position within str +

Returns :

the resulting character offset +
+
+
+
+

g_utf8_prev_char ()

+
gchar*              g_utf8_prev_char                    (const gchar *p);
+

+Finds the previous UTF-8 character in the string before p. +

+

+p does not have to be at the beginning of a UTF-8 character. No check +is made to see if the character found is actually valid other than +it starts with an appropriate byte. If p might be the first +character of the string, you must use g_utf8_find_prev_char() instead.

+
++ + + + + + + + + + +

p :

a pointer to a position within a UTF-8 encoded string +

Returns :

a pointer to the found character. +
+
+
+
+

g_utf8_find_next_char ()

+
gchar*              g_utf8_find_next_char               (const gchar *p,
+                                                         const gchar *end);
+

+Finds the start of the next UTF-8 character in the string after p. +

+

+p does not have to be at the beginning of a UTF-8 character. No check +is made to see if the character found is actually valid other than +it starts with an appropriate byte.

+
++ + + + + + + + + + + + + + +

p :

a pointer to a position within a UTF-8 encoded string +

end :

a pointer to the byte following the end of the string, +or NULL to indicate that the string is nul-terminated. +

Returns :

a pointer to the found character or NULL +
+
+
+
+

g_utf8_find_prev_char ()

+
gchar*              g_utf8_find_prev_char               (const gchar *str,
+                                                         const gchar *p);
+

+Given a position p with a UTF-8 encoded string str, find the start +of the previous UTF-8 character starting before p. Returns NULL if no +UTF-8 characters are present in str before p. +

+

+p does not have to be at the beginning of a UTF-8 character. No check +is made to see if the character found is actually valid other than +it starts with an appropriate byte.

+
++ + + + + + + + + + + + + + +

str :

pointer to the beginning of a UTF-8 encoded string +

p :

pointer to some position within str +

Returns :

a pointer to the found character or NULL. +
+
+
+
+

g_utf8_strlen ()

+
glong               g_utf8_strlen                       (const gchar *p,
+                                                         gssize max);
+

+Computes the length of the string in characters, not including +the terminating nul character.

+
++ + + + + + + + + + + + + + +

p :

pointer to the start of a UTF-8 encoded string +

max :

the maximum number of bytes to examine. If max + is less than 0, then the string is assumed to be + nul-terminated. If max is 0, p will not be examined and + may be NULL. +

Returns :

the length of the string in characters +
+
+
+
+

g_utf8_strncpy ()

+
gchar*              g_utf8_strncpy                      (gchar *dest,
+                                                         const gchar *src,
+                                                         gsize n);
+

+Like the standard C strncpy() function, but +copies a given number of characters instead of a given number of +bytes. The src string must be valid UTF-8 encoded text. +(Use g_utf8_validate() on all text before trying to use UTF-8 +utility functions with it.)

+
++ + + + + + + + + + + + + + + + + + +

dest :

buffer to fill with characters from src +

src :

UTF-8 encoded string +

n :

character count +

Returns :

dest +
+
+
+
+

g_utf8_strchr ()

+
gchar*              g_utf8_strchr                       (const gchar *p,
+                                                         gssize len,
+                                                         gunichar c);
+

+Finds the leftmost occurrence of the given Unicode character +in a UTF-8 encoded string, while limiting the search to len bytes. +If len is -1, allow unbounded search.

+
++ + + + + + + + + + + + + + + + + + +

p :

a nul-terminated UTF-8 encoded string +

len :

the maximum length of p +

c :

a Unicode character +

Returns :

NULL if the string does not contain the character, + otherwise, a pointer to the start of the leftmost occurrence of + the character in the string. +
+
+
+
+

g_utf8_strrchr ()

+
gchar*              g_utf8_strrchr                      (const gchar *p,
+                                                         gssize len,
+                                                         gunichar c);
+

+Find the rightmost occurrence of the given Unicode character +in a UTF-8 encoded string, while limiting the search to len bytes. +If len is -1, allow unbounded search.

+
++ + + + + + + + + + + + + + + + + + +

p :

a nul-terminated UTF-8 encoded string +

len :

the maximum length of p +

c :

a Unicode character +

Returns :

NULL if the string does not contain the character, + otherwise, a pointer to the start of the rightmost occurrence of the + character in the string. +
+
+
+
+

g_utf8_strreverse ()

+
gchar*              g_utf8_strreverse                   (const gchar *str,
+                                                         gssize len);
+

+Reverses a UTF-8 string. str must be valid UTF-8 encoded text. +(Use g_utf8_validate() on all text before trying to use UTF-8 +utility functions with it.) +

+

+This function is intended for programmatic uses of reversed strings. +It pays no attention to decomposed characters, combining marks, byte +order marks, directional indicators (LRM, LRO, etc) and similar +characters which might need special handling when reversing a string +for display purposes. +

+

+Note that unlike g_strreverse(), this function returns +newly-allocated memory, which should be freed with g_free() when +no longer needed.

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

the maximum length of str to use, in bytes. If len < 0, + then the string is nul-terminated. +

Returns :

a newly-allocated string which is the reverse of str. + +
+

Since 2.2

+
+
+
+

g_utf8_validate ()

+
gboolean            g_utf8_validate                     (const gchar *str,
+                                                         gssize max_len,
+                                                         const gchar **end);
+

+Validates UTF-8 encoded text. str is the text to validate; +if str is nul-terminated, then max_len can be -1, otherwise +max_len should be the number of bytes to validate. +If end is non-NULL, then the end of the valid range +will be stored there (i.e. the start of the first invalid +character if some bytes were invalid, or the end of the text +being validated otherwise). +

+

+Note that g_utf8_validate() returns FALSE if max_len is +positive and NUL is met before max_len bytes have been read. +

+

+Returns TRUE if all of str was valid. Many GLib and GTK+ +routines require valid UTF-8 as input; +so data read from a file or the network should be checked +with g_utf8_validate() before doing anything else with it.

+
++ + + + + + + + + + + + + + + + + + +

str :

a pointer to character data +

max_len :

max bytes to validate, or -1 to go until NUL +

end :

return location for end of valid data +

Returns :

TRUE if the text was valid UTF-8 +
+
+
+
+

g_utf8_strup ()

+
gchar *             g_utf8_strup                        (const gchar *str,
+                                                         gssize len);
+

+Converts all Unicode characters in the string that have a case +to uppercase. The exact manner that this is done depends +on the current locale, and may result in the number of +characters in the string increasing. (For instance, the +German ess-zet will be changed to SS.)

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

length of str, in bytes, or -1 if str is nul-terminated. +

Returns :

a newly allocated string, with all characters + converted to uppercase. +
+
+
+
+

g_utf8_strdown ()

+
gchar *             g_utf8_strdown                      (const gchar *str,
+                                                         gssize len);
+

+Converts all Unicode characters in the string that have a case +to lowercase. The exact manner that this is done depends +on the current locale, and may result in the number of +characters in the string changing.

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

length of str, in bytes, or -1 if str is nul-terminated. +

Returns :

a newly allocated string, with all characters + converted to lowercase. +
+
+
+
+

g_utf8_casefold ()

+
gchar *             g_utf8_casefold                     (const gchar *str,
+                                                         gssize len);
+

+Converts a string into a form that is independent of case. The +result will not correspond to any particular case, but can be +compared for equality or ordered with the results of calling +g_utf8_casefold() on other strings. +

+

+Note that calling g_utf8_casefold() followed by g_utf8_collate() is +only an approximation to the correct linguistic case insensitive +ordering, though it is a fairly good one. Getting this exactly +right would require a more sophisticated collation function that +takes case sensitivity into account. GLib does not currently +provide such a function.

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

length of str, in bytes, or -1 if str is nul-terminated. +

Returns :

a newly allocated string, that is a + case independent form of str. +
+
+
+
+

g_utf8_normalize ()

+
gchar *             g_utf8_normalize                    (const gchar *str,
+                                                         gssize len,
+                                                         GNormalizeMode mode);
+

+Converts a string into canonical form, standardizing +such issues as whether a character with an accent +is represented as a base character and combining +accent or as a single precomposed character. The +string has to be valid UTF-8, otherwise NULL is +returned. You should generally call g_utf8_normalize() +before comparing two Unicode strings. +

+

+The normalization mode G_NORMALIZE_DEFAULT only +standardizes differences that do not affect the +text content, such as the above-mentioned accent +representation. G_NORMALIZE_ALL also standardizes +the "compatibility" characters in Unicode, such +as SUPERSCRIPT THREE to the standard forms +(in this case DIGIT THREE). Formatting information +may be lost but for most text operations such +characters should be considered the same. +

+

+G_NORMALIZE_DEFAULT_COMPOSE and G_NORMALIZE_ALL_COMPOSE +are like G_NORMALIZE_DEFAULT and G_NORMALIZE_ALL, +but returned a result with composed forms rather +than a maximally decomposed form. This is often +useful if you intend to convert the string to +a legacy encoding or pass it to a system with +less capable Unicode handling.

+
++ + + + + + + + + + + + + + + + + + +

str :

a UTF-8 encoded string. +

len :

length of str, in bytes, or -1 if str is nul-terminated. +

mode :

the type of normalization to perform. +

Returns :

a newly allocated string, that is the + normalized form of str, or NULL if str is not + valid UTF-8. +
+
+
+
+

enum GNormalizeMode

+
typedef enum {
+  G_NORMALIZE_DEFAULT,
+  G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT,
+  G_NORMALIZE_DEFAULT_COMPOSE,
+  G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE,
+  G_NORMALIZE_ALL,
+  G_NORMALIZE_NFKD = G_NORMALIZE_ALL,
+  G_NORMALIZE_ALL_COMPOSE,
+  G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE
+} GNormalizeMode;
+
+

+Defines how a Unicode string is transformed in a canonical +form, standardizing such issues as whether a character with an accent is +represented as a base character and combining accent or as a single precomposed +character. Unicode strings should generally be normalized before comparing them. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_NORMALIZE_DEFAULT

standardize differences that do not affect the + text content, such as the above-mentioned accent representation. +

G_NORMALIZE_NFD

another name for G_NORMALIZE_DEFAULT. +

G_NORMALIZE_DEFAULT_COMPOSE

like G_NORMALIZE_DEFAULT, but with composed + forms rather than a maximally decomposed form. +

G_NORMALIZE_NFC

another name for G_NORMALIZE_DEFAULT_COMPOSE. +

G_NORMALIZE_ALL

beyond G_NORMALIZE_DEFAULT also standardize the + "compatibility" characters in Unicode, such as SUPERSCRIPT THREE to the + standard forms (in this case DIGIT THREE). Formatting information may be + lost but for most text operations such characters should be considered the + same. +

G_NORMALIZE_NFKD

another name for G_NORMALIZE_ALL. +

G_NORMALIZE_ALL_COMPOSE

like G_NORMALIZE_ALL, but with composed + forms rather than a maximally decomposed form. +

G_NORMALIZE_NFKC

another name for G_NORMALIZE_ALL_COMPOSE. +
+
+
+
+

g_utf8_collate ()

+
gint                g_utf8_collate                      (const gchar *str1,
+                                                         const gchar *str2);
+

+Compares two strings for ordering using the linguistically +correct rules for the current locale. +When sorting a large number of strings, it will be significantly +faster to obtain collation keys with g_utf8_collate_key() and +compare the keys with strcmp() when sorting instead of sorting +the original strings.

+
++ + + + + + + + + + + + + + +

str1 :

a UTF-8 encoded string +

str2 :

a UTF-8 encoded string +

Returns :

< 0 if str1 compares before str2, + 0 if they compare equal, > 0 if str1 compares after str2. +
+
+
+
+

g_utf8_collate_key ()

+
gchar *             g_utf8_collate_key                  (const gchar *str,
+                                                         gssize len);
+

+Converts a string into a collation key that can be compared +with other collation keys produced by the same function using +strcmp(). +

+

+The results of comparing the collation keys of two strings +with strcmp() will always be the same as comparing the two +original keys with g_utf8_collate(). +

+

+Note that this function depends on the +current locale.

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string. +

len :

length of str, in bytes, or -1 if str is nul-terminated. +

Returns :

a newly allocated string. This string should + be freed with g_free() when you are done with it. +
+
+
+
+

g_utf8_collate_key_for_filename ()

+
gchar *             g_utf8_collate_key_for_filename     (const gchar *str,
+                                                         gssize len);
+

+Converts a string into a collation key that can be compared +with other collation keys produced by the same function using strcmp(). +

+

+In order to sort filenames correctly, this function treats the dot '.' +as a special case. Most dictionary orderings seem to consider it +insignificant, thus producing the ordering "event.c" "eventgenerator.c" +"event.h" instead of "event.c" "event.h" "eventgenerator.c". Also, we +would like to treat numbers intelligently so that "file1" "file10" "file5" +is sorted as "file1" "file5" "file10". +

+

+Note that this function depends on the +current locale.

+
++ + + + + + + + + + + + + + +

str :

a UTF-8 encoded string. +

len :

length of str, in bytes, or -1 if str is nul-terminated. +

Returns :

a newly allocated string. This string should + be freed with g_free() when you are done with it. + +
+

Since 2.8

+
+
+
+

g_utf8_to_utf16 ()

+
gunichar2 *         g_utf8_to_utf16                     (const gchar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+

+Convert a string from UTF-8 to UTF-16. A 0 character will be +added to the result after the converted text.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

the maximum length (number of bytes) of str to use. + If len < 0, then the string is nul-terminated. +

items_read :

location to store number of bytes read, or NULL. + If NULL, then G_CONVERT_ERROR_PARTIAL_INPUT will be + returned in case str contains a trailing partial + character. If an error occurs then the index of the + invalid input is stored here. +

items_written :

location to store number of gunichar2 written, + or NULL. + The value stored here does not include the trailing 0. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError other than + G_CONVERT_ERROR_NO_CONVERSION may occur. +

Returns :

a pointer to a newly allocated UTF-16 string. + This value must be freed with g_free(). If an + error occurs, NULL will be returned and + error set. +
+
+
+
+

g_utf8_to_ucs4 ()

+
gunichar *          g_utf8_to_ucs4                      (const gchar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+

+Convert a string from UTF-8 to a 32-bit fixed width +representation as UCS-4. A trailing 0 will be added to the +string after the converted text.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

the maximum length of str to use, in bytes. If len < 0, + then the string is nul-terminated. +

items_read :

location to store number of bytes read, or NULL. + If NULL, then G_CONVERT_ERROR_PARTIAL_INPUT will be + returned in case str contains a trailing partial + character. If an error occurs then the index of the + invalid input is stored here. +

items_written :

location to store number of characters written or NULL. + The value here stored does not include the trailing 0 + character. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError other than + G_CONVERT_ERROR_NO_CONVERSION may occur. +

Returns :

a pointer to a newly allocated UCS-4 string. + This value must be freed with g_free(). If an + error occurs, NULL will be returned and + error set. +
+
+
+
+

g_utf8_to_ucs4_fast ()

+
gunichar *          g_utf8_to_ucs4_fast                 (const gchar *str,
+                                                         glong len,
+                                                         glong *items_written);
+

+Convert a string from UTF-8 to a 32-bit fixed width +representation as UCS-4, assuming valid UTF-8 input. +This function is roughly twice as fast as g_utf8_to_ucs4() +but does no error checking on the input.

+
++ + + + + + + + + + + + + + + + + + +

str :

a UTF-8 encoded string +

len :

the maximum length of str to use, in bytes. If len < 0, + then the string is nul-terminated. +

items_written :

location to store the number of characters in the + result, or NULL. +

Returns :

a pointer to a newly allocated UCS-4 string. + This value must be freed with g_free(). +
+
+
+
+

g_utf16_to_ucs4 ()

+
gunichar *          g_utf16_to_ucs4                     (const gunichar2 *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+

+Convert a string from UTF-16 to UCS-4. The result will be +nul-terminated.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

a UTF-16 encoded string +

len :

the maximum length (number of gunichar2) of str to use. + If len < 0, then the string is nul-terminated. +

items_read :

location to store number of words read, or NULL. + If NULL, then G_CONVERT_ERROR_PARTIAL_INPUT will be + returned in case str contains a trailing partial + character. If an error occurs then the index of the + invalid input is stored here. +

items_written :

location to store number of characters written, or NULL. + The value stored here does not include the trailing + 0 character. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError other than + G_CONVERT_ERROR_NO_CONVERSION may occur. +

Returns :

a pointer to a newly allocated UCS-4 string. + This value must be freed with g_free(). If an + error occurs, NULL will be returned and + error set. +
+
+
+
+

g_utf16_to_utf8 ()

+
gchar*              g_utf16_to_utf8                     (const gunichar2 *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+

+Convert a string from UTF-16 to UTF-8. The result will be +terminated with a 0 byte. +

+

+Note that the input is expected to be already in native endianness, +an initial byte-order-mark character is not handled specially. +g_convert() can be used to convert a byte buffer of UTF-16 data of +ambiguous endianess. +

+

+Further note that this function does not validate the result +string; it may e.g. include embedded NUL characters. The only +validation done by this function is to ensure that the input can +be correctly interpreted as UTF-16, i.e. it doesn't contain +things unpaired surrogates.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

a UTF-16 encoded string +

len :

the maximum length (number of gunichar2) of str to use. + If len < 0, then the string is nul-terminated. +

items_read :

location to store number of words read, or NULL. + If NULL, then G_CONVERT_ERROR_PARTIAL_INPUT will be + returned in case str contains a trailing partial + character. If an error occurs then the index of the + invalid input is stored here. +

items_written :

location to store number of bytes written, or NULL. + The value stored here does not include the trailing + 0 byte. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError other than + G_CONVERT_ERROR_NO_CONVERSION may occur. +

Returns :

a pointer to a newly allocated UTF-8 string. + This value must be freed with g_free(). If an + error occurs, NULL will be returned and + error set. +
+
+
+
+

g_ucs4_to_utf16 ()

+
gunichar2 *         g_ucs4_to_utf16                     (const gunichar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+

+Convert a string from UCS-4 to UTF-16. A 0 character will be +added to the result after the converted text.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

a UCS-4 encoded string +

len :

the maximum length (number of characters) of str to use. + If len < 0, then the string is nul-terminated. +

items_read :

location to store number of bytes read, or NULL. + If an error occurs then the index of the invalid input + is stored here. +

items_written :

location to store number of gunichar2 + written, or NULL. The value stored here does not + include the trailing 0. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError other than + G_CONVERT_ERROR_NO_CONVERSION may occur. +

Returns :

a pointer to a newly allocated UTF-16 string. + This value must be freed with g_free(). If an + error occurs, NULL will be returned and + error set. +
+
+
+
+

g_ucs4_to_utf8 ()

+
gchar*              g_ucs4_to_utf8                      (const gunichar *str,
+                                                         glong len,
+                                                         glong *items_read,
+                                                         glong *items_written,
+                                                         GError **error);
+

+Convert a string from a 32-bit fixed width representation as UCS-4. +to UTF-8. The result will be terminated with a 0 byte.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

str :

a UCS-4 encoded string +

len :

the maximum length (number of characters) of str to use. + If len < 0, then the string is nul-terminated. +

items_read :

location to store number of characters read, or NULL. +

items_written :

location to store number of bytes written or NULL. + The value here stored does not include the trailing 0 + byte. +

error :

location to store the error occuring, or NULL to ignore + errors. Any of the errors in GConvertError other than + G_CONVERT_ERROR_NO_CONVERSION may occur. +

Returns :

a pointer to a newly allocated UTF-8 string. + This value must be freed with g_free(). If an + error occurs, NULL will be returned and + error set. In that case, items_read will be + set to the position of the first invalid input + character. +
+
+
+
+

g_unichar_to_utf8 ()

+
gint                g_unichar_to_utf8                   (gunichar c,
+                                                         gchar *outbuf);
+

+Converts a single character to UTF-8.

+
++ + + + + + + + + + + + + + +

c :

a Unicode character code +

outbuf :

output buffer, must have at least 6 bytes of space. + If NULL, the length will be computed and returned + and nothing will be written to outbuf. +

Returns :

number of bytes written +
+
+
+
+

See Also

+

+

+
++ + + + +

g_locale_to_utf8(), g_locale_from_utf8()

+Convenience functions for converting between UTF-8 and the locale encoding. +

+

+

+
+
+

+
[3] surrogate pairs
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Version-Information.html b/docs/reference/glib/html/glib-Version-Information.html new file mode 100644 index 0000000..07dd2aa --- /dev/null +++ b/docs/reference/glib/html/glib-Version-Information.html @@ -0,0 +1,159 @@ + + + + +Version Information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Version Information

+

Version Information — Variables and functions to check the GLib version

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             GLIB_MAJOR_VERSION
+#define             GLIB_MINOR_VERSION
+#define             GLIB_MICRO_VERSION
+#define             GLIB_CHECK_VERSION                  (major,minor,micro)
+
+
+
+

Description

+

+GLib provides version information, primarily useful in configure checks +for builds that have a configure script. Applications will not +typically use the features described here. +

+
+
+

Details

+
+

GLIB_MAJOR_VERSION

+
#define GLIB_MAJOR_VERSION 2
+
+

+The major version number of the GLib library. +Like glib_major_version, but from the headers used at +application compile time, rather than from the library linked against +at application run time. +

+
+
+
+

GLIB_MINOR_VERSION

+
#define GLIB_MINOR_VERSION 24
+
+

+The minor version number of the GLib library. +Like gtk_minor_version, but from the headers used at +application compile time, rather than from the library linked against +at application run time. +

+
+
+
+

GLIB_MICRO_VERSION

+
#define GLIB_MICRO_VERSION 0
+
+

+The micro version number of the GLib library. +Like gtk_micro_version, but from the headers used at +application compile time, rather than from the library linked against +at application run time. +

+
+
+
+

GLIB_CHECK_VERSION()

+
#define             GLIB_CHECK_VERSION(major,minor,micro)
+

+Checks the version of the GLib library. +Returns TRUE if the version of the GLib header files is the same +as or newer than the passed-in version. +

+
+

Example 1. Checking the version of the GLib library

+
+  if (!GLIB_CHECK_VERSION (1, 2, 0))
+    g_error ("GLib version 1.2.0 or above is needed");
+
+
+


+

+
++ + + + + + + + + + + + + + +

major :

the major version number. +

minor :

the minor version number. +

micro :

the micro version number. +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Warnings-and-Assertions.html b/docs/reference/glib/html/glib-Warnings-and-Assertions.html new file mode 100644 index 0000000..a92520a --- /dev/null +++ b/docs/reference/glib/html/glib-Warnings-and-Assertions.html @@ -0,0 +1,431 @@ + + + + +Message Output and Debugging Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Message Output and Debugging Functions

+

Message Output and Debugging Functions — functions to output messages and help debug applications

+
+
+

Synopsis

+
+#include <glib.h>
+
+void                g_print                             (const gchar *format,
+                                                         ...);
+GPrintFunc          g_set_print_handler                 (GPrintFunc func);
+void                (*GPrintFunc)                       (const gchar *string);
+
+void                g_printerr                          (const gchar *format,
+                                                         ...);
+GPrintFunc          g_set_printerr_handler              (GPrintFunc func);
+
+#define             g_return_if_fail                    (expr)
+#define             g_return_val_if_fail                (expr,val)
+#define             g_return_if_reached                 ()
+#define             g_return_val_if_reached             (val)
+#define             g_warn_if_fail                      (expr)
+#define             g_warn_if_reached                   ()
+
+void                g_on_error_query                    (const gchar *prg_name);
+void                g_on_error_stack_trace              (const gchar *prg_name);
+
+#define             G_BREAKPOINT                        ()
+
+
+
+

Description

+

+These functions provide support for outputting messages. +

+

+The g_return family of macros (g_return_if_fail(), +g_return_val_if_fail(), g_return_if_reached(), g_return_val_if_reached()) +should only be used for programming errors, a typical use case is +checking for invalid parameters at the beginning of a public function. +They should not be used if you just mean "if (error) return", they +should only be used if you mean "if (bug in program) return". +The program behavior is generally considered undefined after one of these +checks fails. They are not intended for normal control flow, only to +give a perhaps-helpful warning before giving up. +

+
+
+

Details

+
+

g_print ()

+
void                g_print                             (const gchar *format,
+                                                         ...);
+

+Outputs a formatted message via the print handler. +The default print handler simply outputs the message to stdout. +

+

+g_print() should not be used from within libraries for debugging messages, +since it may be redirected by applications to special purpose message +windows or even files. +Instead, libraries should use g_log(), or the convenience functions +g_message(), g_warning() and g_error(). +

+
++ + + + + + + + + + +

format :

the message format. See the printf() documentation. +

... :

the parameters to insert into the format string. +
+
+
+
+

g_set_print_handler ()

+
GPrintFunc          g_set_print_handler                 (GPrintFunc func);
+

+Sets the print handler. +Any messages passed to g_print() will be output via the new handler. +The default handler simply outputs the message to stdout. +By providing your own handler you can redirect the output, to a GTK+ +widget or a log file for example. +

+
++ + + + + + + + + + +

func :

the new print handler. +

Returns :

the old print handler. +
+
+
+
+

GPrintFunc ()

+
void                (*GPrintFunc)                       (const gchar *string);
+

+Specifies the type of the print handler functions. +These are called with the complete formatted string to output. +

+
++ + + + +

string :

the message to be output. +
+
+
+
+

g_printerr ()

+
void                g_printerr                          (const gchar *format,
+                                                         ...);
+

+Outputs a formatted message via the error message handler. +The default handler simply outputs the message to stderr. +

+

+g_printerr() should not be used from within libraries. Instead g_log() should +be used, or the convenience functions g_message(), g_warning() and g_error(). +

+
++ + + + + + + + + + +

format :

the message format. See the printf() documentation. +

... :

the parameters to insert into the format string. +
+
+
+
+

g_set_printerr_handler ()

+
GPrintFunc          g_set_printerr_handler              (GPrintFunc func);
+

+Sets the handler for printing error messages. +Any messages passed to g_printerr() will be output via the new handler. +The default handler simply outputs the message to stderr. +By providing your own handler you can redirect the output, to a GTK+ +widget or a log file for example. +

+
++ + + + + + + + + + +

func :

the new error message handler. +

Returns :

the old error message handler. +
+
+
+
+

g_return_if_fail()

+
#define             g_return_if_fail(expr)
+

+Returns from the current function if the expression is not true. +If the expression evaluates to FALSE, a critical message is logged and +the function returns. This can only be used in functions which do not return +a value. +

+
++ + + + +

expr :

the expression to check. +
+
+
+
+

g_return_val_if_fail()

+
#define             g_return_val_if_fail(expr,val)
+

+Returns from the current function, returning the value val, if the expression +is not true. +If the expression evaluates to FALSE, a critical message is logged and +val is returned. +

+
++ + + + + + + + + + +

expr :

the expression to check. +

val :

the value to return from the current function if the expression is not +true. +
+
+
+
+

g_return_if_reached()

+
#define             g_return_if_reached()
+

+Logs a critical message and returns from the current function. +This can only be used in functions which do not return a value. +

+
+
+
+

g_return_val_if_reached()

+
#define             g_return_val_if_reached(val)
+

+Logs a critical message and returns val. +

+
++ + + + +

val :

the value to return from the current function. +
+
+
+
+

g_warn_if_fail()

+
#define             g_warn_if_fail(expr)
+

+Logs a warning if the expression is not true. +

+
++ + + + +

expr :

the expression to check +
+

Since 2.16

+
+
+
+

g_warn_if_reached()

+
#define             g_warn_if_reached()
+

+Logs a critical warning. +

+

Since 2.16

+
+
+
+

g_on_error_query ()

+
void                g_on_error_query                    (const gchar *prg_name);
+

+Prompts the user with [E]xit, [H]alt, show [S]tack trace or [P]roceed. +This function is intended to be used for debugging use only. The following +example shows how it can be used together with the g_log() functions. +

+
+#include <glib.h>
+static void
+log_handler (const gchar   *log_domain,
+	     GLogLevelFlags log_level,
+	     const gchar   *message,
+	     gpointer       user_data)
+{
+  g_log_default_handler (log_domain, log_level, message, user_data);
+  g_on_error_query (MY_PROGRAM_NAME);
+}
+int main (int argc, char *argv[])
+{
+  g_log_set_handler (MY_LOG_DOMAIN,
+		     G_LOG_LEVEL_WARNING |
+                     G_LOG_LEVEL_ERROR |
+                     G_LOG_LEVEL_CRITICAL,
+		     log_handler,
+		     NULL);
+ /* ... */
+
+

+If [E]xit is selected, the application terminates with a call to +_exit(0). +

+

+If [H]alt is selected, the application enters an infinite loop. +The infinite loop can only be stopped by killing the application, +or by setting glib_on_error_halt to FALSE (possibly via a debugger). +

+

+If [S]tack trace is selected, g_on_error_stack_trace() is called. This +invokes gdb, which attaches to the current process and shows a stack trace. +The prompt is then shown again. +

+

+If [P]roceed is selected, the function returns. +

+

+This function may cause different actions on non-UNIX platforms. +

+
++ + + + +

prg_name :

the program name, needed by gdb for the [S]tack trace option. +If prg_name is NULL, g_get_prgname() is called to get the program name +(which will work correctly if gdk_init() or gtk_init() has been called). +
+
+
+
+

g_on_error_stack_trace ()

+
void                g_on_error_stack_trace              (const gchar *prg_name);
+

+Invokes gdb, which attaches to the current process and shows a stack trace. +Called by g_on_error_query() when the [S]tack trace option is selected. +

+

+This function may cause different actions on non-UNIX platforms. +

+
++ + + + +

prg_name :

the program name, needed by gdb for the [S]tack trace option. +If prg_name is NULL, g_get_prgname() is called to get the program name +(which will work correctly if gdk_init() or gtk_init() has been called). +
+
+
+
+

G_BREAKPOINT()

+
#define             G_BREAKPOINT()
+

+Inserts a breakpoint instruction into the code. On x86 and alpha systems +this is implemented as a soft interrupt and on other architectures it raises +a SIGTRAP signal. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-Windows-Compatibility-Functions.html b/docs/reference/glib/html/glib-Windows-Compatibility-Functions.html new file mode 100644 index 0000000..cece309 --- /dev/null +++ b/docs/reference/glib/html/glib-Windows-Compatibility-Functions.html @@ -0,0 +1,488 @@ + + + + +Windows Compatibility Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Windows Compatibility Functions

+

Windows Compatibility Functions — UNIX emulation on Windows

+
+
+

Synopsis

+
+#include <glib.h>
+
+#define             MAXPATHLEN
+gchar*              g_win32_error_message               (gint error);
+gchar*              g_win32_getlocale                   (void);
+gchar*              g_win32_get_package_installation_directory
+                                                        (const gchar *package,
+                                                         const gchar *dll_name);
+gchar*              g_win32_get_package_installation_directory_of_module
+                                                        (gpointer hmodule);
+gchar*              g_win32_get_package_installation_subdirectory
+                                                        (const gchar *package,
+                                                         const gchar *dll_name,
+                                                         const gchar *subdir);
+guint               g_win32_get_windows_version         (void);
+gchar*              g_win32_locale_filename_from_utf8   (const gchar *utf8filename);
+#define             G_WIN32_DLLMAIN_FOR_DLL_NAME        (static, dll_name)
+#define             G_WIN32_HAVE_WIDECHAR_API           ()
+#define             G_WIN32_IS_NT_BASED                 ()
+
+
+
+

Description

+

+These functions provide some level of UNIX emulation on the Windows platform. +If your application really needs the POSIX APIs, we suggest you try the Cygwin +project. +

+
+
+

Details

+
+

MAXPATHLEN

+
#define MAXPATHLEN 1024
+
+

+Provided for UNIX emulation on Windows; equivalent to UNIX +macro MAXPATHLEN, which is the maximum length of a filename +(including full path). +

+
+
+
+

g_win32_error_message ()

+
gchar*              g_win32_error_message               (gint error);
+

+Translate a Win32 error code (as returned by GetLastError()) into +the corresponding message. The message is either language neutral, +or in the thread's language, or the user's language, the system's +language, or US English (see docs for FormatMessage()). The +returned string is in UTF-8. It should be deallocated with +g_free().

+
++ + + + + + + + + + +

error :

error code. +

Returns :

newly-allocated error message +
+
+
+
+

g_win32_getlocale ()

+
gchar*              g_win32_getlocale                   (void);
+

+The setlocale() function in the Microsoft C library uses locale +names of the form "English_United States.1252" etc. We want the +UNIXish standard form "en_US", "zh_TW" etc. This function gets the +current thread locale from Windows - without any encoding info - +and returns it as a string of the above form for use in forming +file names etc. The returned string should be deallocated with +g_free().

+
++ + + + +

Returns :

newly-allocated locale name. +
+
+
+
+

g_win32_get_package_installation_directory ()

+
gchar*              g_win32_get_package_installation_directory
+                                                        (const gchar *package,
+                                                         const gchar *dll_name);
+
+

Warning

+

g_win32_get_package_installation_directory has been deprecated since version 2.18 and should not be used in newly-written code. Pass the HMODULE of a DLL or EXE to +g_win32_get_package_installation_directory_of_module() instead.

+
+

+Try to determine the installation directory for a software package. +

+

+This function is deprecated. Use +g_win32_get_package_installation_directory_of_module() instead. +

+

+The use of package is deprecated. You should always pass NULL. A +warning is printed if non-NULL is passed as package. +

+

+The original intended use of package was for a short identifier of +the package, typically the same identifier as used for +GETTEXT_PACKAGE in software configured using GNU +autotools. The function first looks in the Windows Registry for the +value #InstallationDirectory in the key +#HKLM\Software@package, and if that value +exists and is a string, returns that. +

+

+It is strongly recommended that packagers of GLib-using libraries +for Windows do not store installation paths in the Registry to be +used by this function as that interfers with having several +parallel installations of the library. Enabling multiple +installations of different versions of some GLib-using library, or +GLib itself, is desirable for various reasons. +

+

+For this reason it is recommeded to always pass NULL as +package to this function, to avoid the temptation to use the +Registry. In version 2.20 of GLib the package parameter +will be ignored and this function won't look in the Registry at all. +

+

+If package is NULL, or the above value isn't found in the +Registry, but dll_name is non-NULL, it should name a DLL loaded +into the current process. Typically that would be the name of the +DLL calling this function, looking for its installation +directory. The function then asks Windows what directory that DLL +was loaded from. If that directory's last component is "bin" or +"lib", the parent directory is returned, otherwise the directory +itself. If that DLL isn't loaded, the function proceeds as if +dll_name was NULL. +

+

+If both package and dll_name are NULL, the directory from where +the main executable of the process was loaded is used instead in +the same way as above.

+
++ + + + + + + + + + + + + + +

package :

You should pass NULL for this. +

dll_name :

The name of a DLL that a package provides in UTF-8, or NULL. +

Returns :

a string containing the installation directory for +package. The string is in the GLib file name encoding, +i.e. UTF-8. The return value should be freed with g_free() when not +needed any longer. If the function fails NULL is returned. + +
+
+
+
+

g_win32_get_package_installation_directory_of_module ()

+
gchar*              g_win32_get_package_installation_directory_of_module
+                                                        (gpointer hmodule);
+

+This function tries to determine the installation directory of a +software package based on the location of a DLL of the software +package. +

+

+hmodule should be the handle of a loaded DLL or NULL. The +function looks up the directory that DLL was loaded from. If +hmodule is NULL, the directory the main executable of the current +process is looked up. If that directory's last component is "bin" +or "lib", its parent directory is returned, otherwise the directory +itself. +

+

+It thus makes sense to pass only the handle to a "public" DLL of a +software package to this function, as such DLLs typically are known +to be installed in a "bin" or occasionally "lib" subfolder of the +installation folder. DLLs that are of the dynamically loaded module +or plugin variety are often located in more private locations +deeper down in the tree, from which it is impossible for GLib to +deduce the root of the package installation. +

+

+The typical use case for this function is to have a DllMain() that +saves the handle for the DLL. Then when code in the DLL needs to +construct names of files in the installation tree it calls this +function passing the DLL handle.

+
++ + + + + + + + + + +

hmodule :

The Win32 handle for a DLL loaded into the current process, or NULL +

Returns :

a string containing the guessed installation directory for +the software package hmodule is from. The string is in the GLib +file name encoding, i.e. UTF-8. The return value should be freed +with g_free() when not needed any longer. If the function fails +NULL is returned. + +
+

Since 2.16

+
+
+
+

g_win32_get_package_installation_subdirectory ()

+
gchar*              g_win32_get_package_installation_subdirectory
+                                                        (const gchar *package,
+                                                         const gchar *dll_name,
+                                                         const gchar *subdir);
+
+

Warning

+

g_win32_get_package_installation_subdirectory has been deprecated since version 2.18 and should not be used in newly-written code. Pass the HMODULE of a DLL or EXE to +g_win32_get_package_installation_directory_of_module() instead, and +then construct a subdirectory pathname with g_build_filename().

+
+

+This function is deprecated. Use +g_win32_get_package_installation_directory_of_module() and +g_build_filename() instead. +

+

+Returns a newly-allocated string containing the path of the +subdirectory subdir in the return value from calling +g_win32_get_package_installation_directory() with the package and +dll_name parameters. See the documentation for +g_win32_get_package_installation_directory() for more details. In +particular, note that it is deprecated to pass anything except NULL +as package.

+
++ + + + + + + + + + + + + + + + + + +

package :

You should pass NULL for this. +

dll_name :

The name of a DLL that a package provides, in UTF-8, or NULL. +

subdir :

A subdirectory of the package installation directory, also in UTF-8 +

Returns :

a string containing the complete path to subdir inside +the installation directory of package. The returned string is in +the GLib file name encoding, i.e. UTF-8. The return value should be +freed with g_free() when no longer needed. If something goes wrong, +NULL is returned. + +
+
+
+
+

g_win32_get_windows_version ()

+
guint               g_win32_get_windows_version         (void);
+

+Returns version information for the Windows operating system the +code is running on. See MSDN documentation for the GetVersion() +function. To summarize, the most significant bit is one on Win9x, +and zero on NT-based systems. Since version 2.14, GLib works only +on NT-based systems, so checking whether your are running on Win9x +in your own software is moot. The least significant byte is 4 on +Windows NT 4, and 5 on Windows XP. Software that needs really +detailled version and feature information should use Win32 API like +GetVersionEx() and VerifyVersionInfo().

+
++ + + + +

Returns :

The version information. + +
+

Since 2.6

+
+
+
+

g_win32_locale_filename_from_utf8 ()

+
gchar*              g_win32_locale_filename_from_utf8   (const gchar *utf8filename);
+

+Converts a filename from UTF-8 to the system codepage. +

+

+On NT-based Windows, on NTFS file systems, file names are in +Unicode. It is quite possible that Unicode file names contain +characters not representable in the system codepage. (For instance, +Greek or Cyrillic characters on Western European or US Windows +installations, or various less common CJK characters on CJK Windows +installations.) +

+

+In such a case, and if the filename refers to an existing file, and +the file system stores alternate short (8.3) names for directory +entries, the short form of the filename is returned. Note that the +"short" name might in fact be longer than the Unicode name if the +Unicode name has very short pathname components containing +non-ASCII characters. If no system codepage name for the file is +possible, NULL is returned. +

+

+The return value is dynamically allocated and should be freed with +g_free() when no longer needed.

+
++ + + + + + + + + + +

utf8filename :

a UTF-8 encoded filename. +

Returns :

The converted filename, or NULL on conversion +failure and lack of short names. + +
+

Since 2.8

+
+
+
+

G_WIN32_DLLMAIN_FOR_DLL_NAME()

+
#define             G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name)
+
+

Warning

+

G_WIN32_DLLMAIN_FOR_DLL_NAME is deprecated and should not be used in newly-written code.

+
+

+On Windows, this macro defines a DllMain() function that stores the actual +DLL name that the code being compiled will be included in. +

+

+On non-Windows platforms, expands to nothing. +

+
++ + + + + + + + + + +

static :

empty or "static". +

dll_name :

the name of the (pointer to the) char array where the DLL name + will be stored. If this is used, you must also include + windows.h. If you need a more complex DLL entry + point function, you cannot use this. +
+
+
+
+

G_WIN32_HAVE_WIDECHAR_API()

+
#define G_WIN32_HAVE_WIDECHAR_API() TRUE
+
+

+On Windows, this macro defines an expression which evaluates to TRUE +if the code is running on a version of Windows where the wide +character versions of the Win32 API functions, and the wide chaacter +versions of the C library functions work. (They are always present in +the DLLs, but don't work on Windows 9x and Me.) +

+

+On non-Windows platforms, it is not defined. +

+

Since 2.6

+
+
+
+

G_WIN32_IS_NT_BASED()

+
#define G_WIN32_IS_NT_BASED() TRUE
+
+

+On Windows, this macro defines an expression which evaluates to TRUE +if the code is running on an NT-based Windows operating system. +

+

+On non-Windows platforms, it is not defined. +

+

Since 2.6

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-building.html b/docs/reference/glib/html/glib-building.html new file mode 100644 index 0000000..89f2ab3 --- /dev/null +++ b/docs/reference/glib/html/glib-building.html @@ -0,0 +1,458 @@ + + + + +Compiling the GLib package + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Compiling the GLib package

+

Compiling the GLib Package — +How to compile GLib itself +

+
+
+

Building the Library on UNIX

+

+ On UNIX, GLib 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. The normal sequence for + compiling and installing the GLib library is thus: + +

+


+          ./configure
+          make
+          make install
+        

+

+

+

+ The standard options provided by GNU + autoconf may be passed to the + configure script. Please see the + autoconf documentation or run + ./configure --help for information about + the standard options. +

+

+ The GTK+ documentation contains + further details + about the build process and ways to influence it. +

+
+
+

Dependencies

+

+ Before you can compile the GLib 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 GLib + 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 GLib library. (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 GLib is mirrored in the + dependencies directory + on the GTK+ FTP + site. +

  • +
  • + The GTK+ makefiles will mostly work with different versions + of make, however, there tends to be + a few incompatibilities, so the GTK+ 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.) +

  • +
+

+ GLib depends on a number of other libraries. +

+
    +
  • +

    + The GNU + libiconv library is needed to build GLib if your + system doesn't have the iconv() + function for doing conversion between character + encodings. Most modern systems should have + iconv(), however many older systems lack + an iconv() implementation. On such systems, + you must install the libiconv library. This can be found at: + http://www.gnu.org/software/libiconv. +

    +

    + If your system has an iconv() implementation but + you want to use libiconv instead, you can pass the + --with-libiconv option to configure. This forces + libiconv to be used. +

    +

    + Note that if you have libiconv installed in your default include + search path (for instance, in /usr/local/), but + don't enable it, you will get an error while compiling GLib because + the iconv.h that libiconv installs hides the + system iconv. +

    +

    + If you are using the native iconv implementation on Solaris + instead of libiconv, you'll need to make sure that you have + the converters between locale encodings and UTF-8 installed. + At a minimum you'll need the SUNWuiu8 package. You probably + should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and + SUNWkiu8 packages. +

    +

    + The native iconv on Compaq Tru64 doesn't contain support for + UTF-8, so you'll need to use GNU libiconv instead. (When + using GNU libiconv for GLib, you'll need to use GNU libiconv + for GNU gettext as well.) This probably applies to related + operating systems as well. +

    +
  • +
  • + The libintl library from the GNU gettext + package is needed if your system doesn't have the + gettext() functionality for handling + message translation databases. +

  • +
  • + A thread implementation is needed, unless you want to compile GLib + without thread support, which is not recommended. The thread support + in GLib can be based upon several native thread implementations, + e.g. POSIX threads, DCE threads or Solaris threads. +

  • +
  • + GRegex uses the PCRE library + for regular expression matching. The default is to use the internal + version of PCRE that is patched to use GLib for memory management + and Unicode handling. If you prefer to use the system-supplied PCRE + library you can pass the --with-pcre=system option to configure, + but it is not recommended. +

  • +
  • + The optional extended attribute support in GIO requires the + getxattr() family of functions that may be provided by glibc or + by the standalone libattr library. To build GLib without extended + attribute support, use the --disable-xattr + configure option. +

  • +
  • + The optional SELinux support in GIO requires libselinux. To build + GLib without SELinux support, use the + --disable-selinux configure option. +

  • +
+
+
+

Extra Configuration Options

+

+ In addition to the normal options, the + configure script in the GLib + library supports these additional arguments: + +

+

configure [[--enable-debug=[no|minimum|yes]]] [[--disable-gc-friendly] | [--enable-gc-friendly]] [[--disable-mem-pools] | [--enable-mem-pools]] [[--disable-threads] | [--enable-threads]] [[--with-threads=[none|posix|dce|win32]]] [[--disable-regex] | [--enable-regex]] [[--with-pcre=[internal|system]]] [[--disable-included-printf] | [--enable-included-printf]] [[--disable-visibility] | [--enable-visibility]] [[--disable-gtk-doc] | [--enable-gtk-doc]] [[--disable-man] | [--enable-man]] [[--disable-xattr] | [--enable-xattr]] [[--disable-selinux] | [--enable-selinux]] [[--with-runtime-libdir=RELPATH]]

+

+

+

--enable-debug.  + Turns on various amounts of debugging support. Setting this to 'no' + disables g_assert(), g_return_if_fail(), g_return_val_if_fail() and + all cast checks between different object types. Setting it to 'minimum' disables only cast checks. Setting it to 'yes' enables + runtime debugging. + The default is 'minimum'. + Note that 'no' is fast, but dangerous as it tends to destabilize + even mostly bug-free software by changing the effect of many bugs + from simple warnings into fatal crashes. Thus + --enable-debug=no should not + be used for stable releases of GLib. +

+

--disable-gc-friendly and + --enable-gc-friendly.  + By default, and with --disable-gc-friendly + as well, Glib does not clear the memory for certain objects before they + are freed. For example, Glib may decide to recycle GList nodes by + putting them in a free list. However, memory profiling and debugging tools like Valgrind work better if an + application does not keep dangling pointers to freed memory (even + though these pointers are no longer dereferenced), or invalid pointers inside + uninitialized memory. The + --enable-gc-friendly option makes Glib clear + memory in these situations: +

+
    +
  • + When shrinking a GArray, Glib will clear the memory no longer + available in the array: shrink an array from 10 bytes to 7, and + the last 3 bytes will be cleared. This includes removals of single and multiple elements. +

  • +
  • +

  • +
  • + When growing a GArray, Glib will clear the new chunk of memory. + Grow an array from 7 bytes to 10 bytes, and the last 3 bytes will be cleared. +

  • +
  • + The above applies to GPtrArray as well. +

  • +
  • + When freeing a node from a GHashTable, Glib will first clear + the node, which used to have pointers to the key and the value + stored at that node. +

  • +
  • + When destroying or removing a GTree node, Glib will clear the node, + which used to have pointers to the node's value, and the left and right subnodes. +

  • +
+

+ Since clearing the memory has a cost, + --disable-gc-friendly is the default. +

+

--disable-mem-pools and + --enable-mem-pools.  + Many small chunks of memory are often allocated via collective pools + in GLib and are cached after release to speed up reallocations. + For sparse memory systems this behaviour is often inferior, so + memory pools can be disabled to avoid excessive caching and force + atomic maintenance of chunks through the g_malloc() + and g_free() functions. Code currently affected by + this: +

+
    +
  • + GList, GSList, + GNode, GHash + allocations. The functions g_list_push_allocator(), + g_list_pop_allocator(), g_slist_push_allocator(), + g_slist_pop_allocator(), g_node_push_allocator() and + g_node_pop_allocator() are not available +

  • +
  • + GMemChunks become basically non-effective +

  • +
  • + GSignal disables all caching (potentially + very slow) +

  • +
  • + GType doesn't honour the + GTypeInfo + n_preallocs field anymore +

  • +
  • + the GBSearchArray flag + G_BSEARCH_ALIGN_POWER2 becomes non-functional +

  • +
+

+

+

--disable-threads and + --enable-threads.  + Do not compile GLib to be multi thread safe. GLib + will be slightly faster then. This is however not + recommended, as many programs rely on GLib being + multi thread safe. +

+

--with-threads.  + Specify a thread implementation to use. +

+
    +
  • + 'posix' and 'dce' can be used interchangeable + to mean the different versions of Posix + threads. configure tries to find out, which + one is installed. +

  • +
  • + 'none' means that GLib will be thread safe, + but does not have a default thread + implementation. This has to be supplied to + g_thread_init() by the programmer. +

  • +
+

+ +

+

--disable-regex and + --enable-regex.  + Do not compile GLib with regular expression support. + GLib will be smaller because it will not need the + PCRE library. This is however not recommended, as + programs may need GRegex. +

+

--with-pcre.  + Specify whether to use the internal or the system-supplied + PCRE library. +

+
    +
  • + 'internal' means that GRegex will be compiled to use + the internal PCRE library. +

  • +
  • + 'system' means that GRegex will be compiled to use + the system-supplied PCRE library. +

  • +
+

+ Using the internal PCRE is the preferred solution: +

+
    +
  • + System-supplied PCRE has a separated copy of the big tables + used for Unicode handling. +

  • +
  • + Some systems have PCRE libraries compiled without some needed + features, such as UTF-8 and Unicode support. +

  • +
  • + PCRE uses some global variables for memory management and + other features. In the rare case of a program using both + GRegex and PCRE (maybe indirectly through a library), + this variables could lead to problems when they are modified. +

  • +
+

+

+

--disable-included-printf and + --enable-included-printf.  + By default the configure script will try + to auto-detect whether the C library provides a suitable set + of printf() functions. In detail, + configure checks that the semantics of + snprintf() are as specified by C99 and + that positional parameters as specified in the Single Unix + Specification are supported. If this not the case, GLib will + include an implementation of the printf() + family. + These options can be used to explicitly control whether + an implementation fo the printf() family + should be included or not. +

+

--disable-visibility and + --enable-visibility.  + By default, GLib uses ELF visibility attributes to optimize + PLT table entries if the compiler supports ELF visibility + attributes. A side-effect of the way in which this is currently + implemented is that any header change forces a full + recompilation, and missing includes may go unnoticed. + Therefore, it makes sense to turn this feature off while + doing GLib development, even if the compiler supports ELF + visibility attributes. The --disable-visibility + option allows to do that. +

+

--disable-gtk-doc and + --enable-gtk-doc.  + By default the configure script will try + to auto-detect whether the + gtk-doc package is installed. If + it is, then it will use it to extract and build the + documentation for the GLib library. These options + can be used to explicitly control whether + gtk-doc should be + used or not. If it is not used, the distributed, + pre-generated HTML files will be installed instead of + building them on your machine. +

+

--disable-man and + --enable-man.  + By default the configure script will try + to auto-detect whether xsltproc + and the necessary Docbook stylesheets are installed. If + they are, then it will use them to rebuild the included + man pages from the XML sources. These options can be used + to explicitly control whether man pages should be rebuilt + used or not. The distribution includes pre-generated man + pages. +

+

--disable-xattr and + --enable-xattr.  + By default the configure script will try + to auto-detect whether the getxattr() family of functions + is available. If it is, then extended attribute support + will be included in GIO. These options can be used to + explicitly control whether extended attribute support + should be included or not. getxattr() and friends can + be provided by glibc or by the standalone libattr library. +

+

--disable-selinux and + --enable-selinux.  + By default the configure script will + auto-detect if libselinux is available and include + SELinux support in GIO if it is. These options can be + used to explicitly control whether SELinux support should + be included. +

+

--with-runtime-libdir=RELPATH.  + Allows specifying a relative path to where to install the runtime + libraries (meaning library files used for running, not developing, + GLib applications). This can be used in operating system setups where + programs using GLib needs to run before e.g. /usr + is mounted. + For example, if LIBDIR is /usr/lib and + ../../lib is passed to + --with-runtime-libdir then the + runtime libraries are installed into /lib rather + than /usr/lib. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-changes.html b/docs/reference/glib/html/glib-changes.html new file mode 100644 index 0000000..d724343 --- /dev/null +++ b/docs/reference/glib/html/glib-changes.html @@ -0,0 +1,179 @@ + + + + +Changes to GLib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes to GLib

+

Changes to GLib — +Incompatible changes made between successing versions of GLib +

+
+
+

Incompatible changes from 2.0 to 2.2

+
  • +

    +GLib changed the seeding algorithm for the pseudo-random number +generator Mersenne Twister, as used by GRand +and GRandom. This was necessary, because some +seeds would yield very bad pseudo-random streams. Also the +pseudo-random integers generated by +g_rand*_int_range() will have a +slightly better equal distribution with the new version of GLib. +

    +

    +Further information can be found at the website of the Mersenne +Twister random number generator at http://www.math.keio.ac.jp/~matumoto/emt.html. +

    +

    +The original seeding and generation algorithms, as found in GLib +2.0.x, can be used instead of the new ones by setting the environment +variable G_RANDOM_VERSION to the value of '2.0'. Use +the GLib-2.0 algorithms only if you have sequences of numbers generated +with Glib-2.0 that you need to reproduce exactly. +

    +
+
+
+

Incompatible changes from 1.2 to 2.0

+

+The GNOME 2.0 +porting guide on http://developer.gnome.org +has some more detailed discussion of porting from 1.2 to 2.0. +See the section on GLib. +

+
    +
  • +

    +The event loop functionality GMain has extensively +been revised to support multiple separate main loops in separate threads. +All sources (timeouts, idle functions, etc.) are associated with a +GMainContext. +

    +

    +Compatibility functions exist so that most application code dealing with +the main loop will continue to work. However, code that creates new custom +types of sources will require modification. +

    +

    +The main changes here are: + +

    +
      +
    • + Sources are now exposed as GSource *, rather than simply as + numeric ids. +

    • +
    • + New types of sources are created by structure "derivation" from + GSource, so the source_data + parameter to the GSource virtual functions has been + replaced with a GSource *. +

    • +
    • + Sources are first created, then later added to a specific + GMainContext. +

    • +
    • + Dispatching has been modified so both the callback and data are passed + in to the dispatch() virtual function. +

    • +
    +

    + To go along with this change, the vtable for + GIOChannel has changed and + add_watch() has been replaced by + create_watch(). +

    +
  • +
  • +

    +g_list_foreach() and +g_slist_foreach() have been changed so they +are now safe against removal of the current item, not the next item. +

    +

    +It's not recommended to mutate the list in the callback to these +functions in any case. +

    +
  • +
  • +GDate now works in UTF-8, not in the current locale. +If you want to use it with the encoding of the locale, you need to convert +strings using g_locale_to_utf8() first. +

  • +
  • +

    +g_strsplit() has been fixed to: + +

    +
      +
    • + include trailing empty tokens, rather than stripping them +

    • +
    • + split into a maximum of max_tokens tokens, rather + than max_tokens + 1 +

    • +
    +

    + + Code depending on either of these bugs will need to be fixed. +

    +
  • +
  • +Deprecated functions that got removed: +g_set_error_handler(), +g_set_warning_handler(), +g_set_message_handler(), use +g_log_set_handler() instead. +

  • +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-compiling.html b/docs/reference/glib/html/glib-compiling.html new file mode 100644 index 0000000..9f739cf --- /dev/null +++ b/docs/reference/glib/html/glib-compiling.html @@ -0,0 +1,138 @@ + + + + +Compiling GLib Applications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Compiling GLib Applications

+

Compiling GLib Applications — +How to compile your GLib application +

+
+
+

Compiling GLib Applications on UNIX

+

+To compile a GLib application, you need to tell the compiler where to +find the GLib header files and libraries. This is done with the +pkg-config utility. +

+

+The following interactive shell session demonstrates how +pkg-config is used (the actual output on +your system may be different): +

+
+$ pkg-config --cflags glib-2.0
+ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include 
+$ pkg-config --libs glib-2.0
+ -L/usr/lib -lm -lglib-2.0  
+
+

+

+

+If your application uses threads or GObject +features, it must be compiled and linked with the options returned by the +following pkg-config invocations: +

+
+$ pkg-config --cflags --libs gthread-2.0
+$ pkg-config --cflags --libs gobject-2.0
+
+

+

+

+If your application uses modules, it must be compiled and linked with the options +returned by one of the following pkg-config invocations: +

+
+$ pkg-config --cflags --libs gmodule-no-export-2.0 
+$ pkg-config --cflags --libs gmodule-2.0 
+
+

+The difference between the two is that gmodule-2.0 adds --export-dynamic +to the linker flags, which is often not needed. +

+

+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 GLib Hello, World, you would type the following: +

+
+$ cc `pkg-config --cflags --libs glib-2.0` hello.c -o hello
+
+

+

+

+If you want to make sure that your program doesn't use any deprecated +functions, you can define the preprocessor symbol G_DISABLE_DEPRECATED +by using the command line option -DG_DISABLE_DEPRECATED=1. +

+

+The recommended way of using GLib has always been to only include the +toplevel headers glib.h, +glib-object.h, gio.h. +Still, there are some exceptions; these headers have to be included separately: +gmodule.h, +glib/gi18n-lib.h or glib/gi18n.h (see +the Internationalization section), +glib/gprintf.h and glib/gstdio.h +(we don't want to pull in all of stdio). +

+

+Starting with 2.17, GLib enforces this by generating an error +when individual headers are directly included. To help with the +transition, the enforcement is not turned on by default for GLib +headers (it is turned on for GObject and GIO). +To turn it on, define the preprocessor symbol G_DISABLE_SINGLE_INCLUDES +by using the command line option -DG_DISABLE_SINGLE_INCLUDES. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-core.html b/docs/reference/glib/html/glib-core.html new file mode 100644 index 0000000..eec69bf --- /dev/null +++ b/docs/reference/glib/html/glib-core.html @@ -0,0 +1,84 @@ + + + + +GLib Core Application Support + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GLib Core Application Support

+
+
+The Main Event Loop — manages all available sources of events +
+
+Threads — thread abstraction; including threads, different + mutexes, conditions and thread private data +
+
+Thread Pools — pools of threads to execute work concurrently +
+
+Asynchronous Queues — asynchronous communication between threads +
+
+Dynamic Loading of Modules — portable method for dynamically loading 'plug-ins' +
+
+Memory Allocation — general memory-handling +
+
+IO Channels — portable support for using files, pipes and + sockets +
+
+Error Reporting — a system for reporting errors +
+
+Message Output and Debugging Functions — functions to output messages and help debug applications +
+
+Message Logging — versatile support for logging messages with different levels of importance +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-cross-compiling.html b/docs/reference/glib/html/glib-cross-compiling.html new file mode 100644 index 0000000..73d442c --- /dev/null +++ b/docs/reference/glib/html/glib-cross-compiling.html @@ -0,0 +1,180 @@ + + + + +Cross-compiling the GLib package + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Cross-compiling the GLib package

+

Cross-compiling the GLib Package — +How to cross-compile GLib +

+
+
+

Building the Library for a different architecture

+

+ Cross-compilation is the process of compiling a program or + library on a different architecture or operating system then + it will be run upon. GLib is slightly more difficult to + cross-compile than many packages because much of GLib is + about hiding differences between different systems. +

+

+ These notes cover things specific to cross-compiling GLib; + for general information about cross-compilation, see the + autoconf info pages. +

+

+ GLib tries to detect as much information as possible about + the target system by compiling and linking programs without + actually running anything; however, some information GLib + needs is not available this way. This information needs + to be provided to the configure script via a "cache file" + or by setting the cache variables in your environment. +

+

+ As an example of using a cache file, to cross compile for + the "MingW32" Win32 runtine environment on a Linux system, + create a file 'win32.cache' with the following contents: +

+
 
+glib_cv_long_long_format=I64
+glib_cv_stack_grows=no
+      
+

+ Then execute the following commands: +

+
+PATH=/path/to/mingw32-compiler/bin:$PATH
+chmod a-w win32.cache   # prevent configure from changing it
+./configure --cache-file=win32.cache --host=mingw32
+      
+

+ The complete list of cache file variables follows. Most + of these won't need to be set in most cases. +

+
+
+

Cache file variables

+

glib_cv_long_long_format=[ll/q/I64].  + Format used by printf() and + scanf() for 64 bit integers. "ll" is + the C99 standard, and what is used by the 'trio' library + that GLib builds if your printf() is + insufficiently capable. + Doesn't need to be set if you are compiling using trio. +

+

glib_cv_stack_grows=[yes/no].  + Whether the stack grows up or down. Most places will want "no", + A few architectures, such as PA-RISC need "yes". +

+

glib_cv_working_bcopy=[yes/no].  + Whether your bcopy() can handle overlapping + copies. Only needs to be set if you don't have + memmove(). (Very unlikely) +

+

glib_cv_sane_realloc=[yes/np].  + Whether your realloc() conforms to ANSI C + and can handle NULL as the first argument. + Defaults to "yes" and probably doesn't need to be set. +

+

glib_cv_have_strlcpy=[yes/no].  + Whether you have strlcpy() that matches + OpenBSD. Defaults to "no", which is safe, since GLib uses a + built-in version in that case. +

+

glib_cv_va_val_copy=[yes/no].  + Whether va_list can be copied as a pointer. If set + to "no", then memcopy() will be used. Only + matters if you don't have va_copy() or + __va_copy(). (So, doesn't matter for GCC.) + Defaults to "yes" which is slightly more common than "no". +

+

glib_cv_rtldglobal_broken=[yes/no].  + Whether you have a bug found in OSF/1 v5.0. Defaults to "no". +

+

glib_cv_uscore=[yes/no].  + Whether an underscore needs to be prepended to symbols when + looking them up via dlsym(). Only needs to + be set if your system uses + dlopen()/dlsym(). +

+

ac_cv_func_posix_getpwuid_r=[yes/no].  + Whether you have a getpwuid_r function (in your C library, + not your thread library) that conforms to the POSIX spec. + (Takes a 'struct passwd **' as the final argument) +

+

ac_cv_func_nonposix_getpwuid_r=[yes/no].  + Whether you have some variant of getpwuid_r() + that doesn't conform to to the POSIX spec, but GLib might be able + to use (or might segfault.) Only needs to be set if + ac_cv_func_posix_getpwuid_r is not set. It's + safest to set this to "no". +

+

ac_cv_func_posix_getgrgid_r=[yes/no].  + Whether you have a getgrgid_r function that conforms to + the POSIX spec. +

+

glib_cv_use_pid_surrogate=[yes/no].  + Whether to use a setpriority() on the PID of + the thread as a method for setting the priority of threads. This + only needs to be set when using POSIX threads. +

+

ac_cv_func_printf_unix98=[yes/no].  + Whether your printf() family supports Unix98 + style %N$ positional parameters. Defaults to + "no". +

+

ac_cv_func_vsnprintf_c99=[yes/no].  + Whether you have a vsnprintf() with C99 + semantics. (C99 semantics means returning the number of bytes + that would have been written had the output buffer had enough + space.) Defaults to "no". +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-data-types.html b/docs/reference/glib/html/glib-data-types.html new file mode 100644 index 0000000..71dd3c5 --- /dev/null +++ b/docs/reference/glib/html/glib-data-types.html @@ -0,0 +1,140 @@ + + + + +GLib Data Types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GLib Data Types

+
+
+Memory Slices — efficient way to allocate groups of equal-sized chunks of memory +
+
+Memory Chunks — deprecated way to allocate groups of equal-sized + chunks of memory +
+
+Doubly-Linked Lists — linked lists containing integer values or + pointers to data, with the ability to iterate + over the list in both directions +
+
+Singly-Linked Lists — linked lists containing integer values or + pointers to data, limited to iterating over the + list in one direction +
+
+Double-ended Queues — double-ended queue data structure +
+
+Sequences — scalable lists +
+
+Trash Stacks — maintain a stack of unused allocated memory chunks +
+
+Hash Tables — associations between keys and values so that + given a key the value can be found quickly +
+
+Strings — text buffers which grow automatically as text is added +
+
+String Chunks — efficient storage of groups of strings +
+
+Arrays — arrays of arbitrary elements which grow + automatically as elements are added +
+
+Pointer Arrays — arrays of pointers to any type of data, which + grow automatically as new elements are added +
+
+Byte Arrays — arrays of bytes, which grow automatically as + elements are added +
+
+Balanced Binary Trees — a sorted collection of key/value pairs optimized + for searching and traversing in order +
+
+N-ary Trees — trees of data with any number of branches +
+
+Quarks — a 2-way association between a string and a + unique integer identifier +
+
+Keyed Data Lists — lists of data elements which are accessible by a + string or GQuark identifier +
+
+Datasets — associate groups of data elements with + particular memory locations +
+
+Relations and Tuples — tables of data which can be indexed on any + number of fields +
+
+Caches — caches allow sharing of complex data structures + to save resources +
+
+Memory Allocators — deprecated way to allocate chunks of memory for + GList, GSList and GNode +
+
+GVariantType — introduction to the GVariant type system +
+
+GVariant — strongly typed value datatype +
+
+GVariant Format Strings +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-fundamentals.html b/docs/reference/glib/html/glib-fundamentals.html new file mode 100644 index 0000000..04acde1 --- /dev/null +++ b/docs/reference/glib/html/glib-fundamentals.html @@ -0,0 +1,79 @@ + + + + +GLib Fundamentals + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GLib Fundamentals

+
+
+Version Information — Variables and functions to check the GLib version +
+
+Basic Types — standard GLib types, defined for ease-of-use and portability +
+
+Limits of Basic Types — portable method of determining the limits of the standard types +
+
+Standard Macros — commonly-used macros. +
+
+Type Conversion Macros — portably storing integers in pointer variables +
+
+Byte Order Macros — a portable way to convert between different byte orders +
+
+Numerical Definitions — mathematical constants, and floating point decomposition +
+
+Miscellaneous Macros — specialized macros which are not used often +
+
+Atomic Operations — basic atomic integer and pointer operations +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-gettextize.html b/docs/reference/glib/html/glib-gettextize.html new file mode 100644 index 0000000..4f4e8a3 --- /dev/null +++ b/docs/reference/glib/html/glib-gettextize.html @@ -0,0 +1,113 @@ + + + + +glib-gettextize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

glib-gettextize

+

glib-gettextize — gettext internationalization utility

+
+
+

Synopsis

+

glib-gettextize [option...] [directory]

+
+
+

Description

+

glib-gettextize helps to prepare a source package for being +internationalized through gettext. +It is a variant of the gettextize that ships with +gettext. +

+

glib-gettextize differs +from gettextize in that it doesn't create an +intl/ subdirectory and doesn't modify +po/ChangeLog (note that newer versions of +gettextize behave like this when called with the +--no-changelog option). +

+
+

Options

+
++ + + + + + + + + + + + + + + + + + +

--help

+print help and exit +

--version

+print version information and exit +

-c, --copy

+copy files instead of making symlinks +

-f, --force

+force writing of new files even if old ones exist +

+
+
+
+

See also

+

+gettextize(1) +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-regex-syntax.html b/docs/reference/glib/html/glib-regex-syntax.html new file mode 100644 index 0000000..557465b --- /dev/null +++ b/docs/reference/glib/html/glib-regex-syntax.html @@ -0,0 +1,2415 @@ + + + + +Regular expression syntax + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Regular expression syntax

+

Regular expression syntax — +Syntax and semantics of the regular expressions supported by GRegex +

+
+
+

GRegex regular expression details

+

+A regular expression is a pattern that is matched against a +string from left to right. Most characters stand for themselves in a +pattern, and match the corresponding characters in the string. As a +trivial example, the pattern +

+
+The quick brown fox
+
+

+matches a portion of a string that is identical to itself. When +caseless matching is specified (the G_REGEX_CASELESS flag), letters are +matched independently of case. +

+

+The power of regular expressions comes from the ability to include +alternatives and repetitions in the pattern. These are encoded in the +pattern by the use of metacharacters, which do not stand for themselves +but instead are interpreted in some special way. +

+

+There are two different sets of metacharacters: those that are recognized +anywhere in the pattern except within square brackets, and those +that are recognized in square brackets. Outside square brackets, the +metacharacters are as follows: +

+
+

Table 1. Metacharacters outside square brackets

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacterMeaning
\general escape character with several uses
^assert start of string (or line, in multiline mode)
$assert end of string (or line, in multiline mode)
.match any character except newline (by default)
[start character class definition
|start of alternative branch
(start subpattern
)end subpattern
?extends the meaning of (, or 0/1 quantifier, or quantifier minimizer
*0 or more quantifier
+1 or more quantifier, also "possessive quantifier"
{start min/max quantifier
+
+

+Part of a pattern that is in square brackets is called a "character +class". In a character class the only metacharacters are: +

+
+

Table 2. Metacharacters inside square brackets

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CharacterMeaning
\general escape character
^negate the class, but only if the first character
-indicates character range
[POSIX character class (only if followed by POSIX syntax)
]terminates the character class
+
+
+
+
+

Backslash

+

+The backslash character has several uses. Firstly, if it is followed by +a non-alphanumeric character, it takes away any special meaning that +character may have. This use of backslash as an escape character +applies both inside and outside character classes. +

+

+For example, if you want to match a * character, you write \* in the +pattern. This escaping action applies whether or not the following +character would otherwise be interpreted as a metacharacter, so it is +always safe to precede a non-alphanumeric with backslash to specify +that it stands for itself. In particular, if you want to match a +backslash, you write \\. +

+

+If a pattern is compiled with the G_REGEX_EXTENDED +option, whitespace in the pattern (other than in a character class) and +characters between a # outside a character class and the next newline +are ignored. +An escaping backslash can be used to include a whitespace or # character +as part of the pattern. +

+

+If you want to remove the special meaning from a sequence of characters, +you can do so by putting them between \Q and \E. +The \Q...\E sequence is recognized both inside and outside character +classes. +

+
+

Non-printing characters

+

+A second use of backslash provides a way of encoding non-printing +characters in patterns in a visible manner. There is no restriction on the +appearance of non-printing characters, apart from the binary zero that +terminates a pattern, but when a pattern is being prepared by text +editing, it is usually easier to use one of the following escape +sequences than the binary character it represents: +

+
+

Table 3. Non-printing characters

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EscapeMeaning
\aalarm, that is, the BEL character (hex 07)
\cx"control-x", where x is any character
\eescape (hex 1B)
\fformfeed (hex 0C)
\nnewline (hex 0A)
\rcarriage return (hex 0D)
\ttab (hex 09)
\dddcharacter with octal code ddd, or backreference
\xhhcharacter with hex code hh
\x{hhh..}character with hex code hhh..
+
+

+The precise effect of \cx is as follows: if x is a lower case letter, +it is converted to upper case. Then bit 6 of the character (hex 40) is +inverted. Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; +becomes hex 7B. +

+

+After \x, from zero to two hexadecimal digits are read (letters can be +in upper or lower case). Any number of hexadecimal digits may appear +between \x{ and }, but the value of the character code +must be less than 2**31 (that is, the maximum hexadecimal value is +7FFFFFFF). If characters other than hexadecimal digits appear between +\x{ and }, or if there is no terminating }, this form of escape is not +recognized. Instead, the initial \x will be interpreted as a basic hexadecimal +escape, with no following digits, giving a character whose +value is zero. +

+

+Characters whose value is less than 256 can be defined by either of the +two syntaxes for \x. There is no difference +in the way they are handled. For example, \xdc is exactly the same as +\x{dc}. +

+

+After \0 up to two further octal digits are read. If there are fewer +than two digits, just those that are present are used. +Thus the sequence \0\x\07 specifies two binary zeros followed by a BEL +character (code value 7). Make sure you supply two digits after the +initial zero if the pattern character that follows is itself an octal +digit. +

+

+The handling of a backslash followed by a digit other than 0 is complicated. +Outside a character class, GRegex reads it and any following digits as a +decimal number. If the number is less than 10, or if there +have been at least that many previous capturing left parentheses in the +expression, the entire sequence is taken as a back reference. A +description of how this works is given later, following the discussion +of parenthesized subpatterns. +

+

+Inside a character class, or if the decimal number is greater than 9 +and there have not been that many capturing subpatterns, GRegex re-reads +up to three octal digits following the backslash, and uses them to generate +a data character. Any subsequent digits stand for themselves. For example: +

+
+

Table 4. Non-printing characters

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EscapeMeaning
\040is another way of writing a space
\40is the same, provided there are fewer than 40 previous capturing subpatterns
\7is always a back reference
\11might be a back reference, or another way of writing a tab
\011is always a tab
\0113is a tab followed by the character "3"
\113might be a back reference, otherwise the character with octal code 113
\377might be a back reference, otherwise the byte consisting entirely of 1 bits
\81is either a back reference, or a binary zero followed by the two characters "8" and "1"
+
+

+Note that octal values of 100 or greater must not be introduced by a +leading zero, because no more than three octal digits are ever read. +

+

+All the sequences that define a single character can be used both inside +and outside character classes. In addition, inside a character class, the +sequence \b is interpreted as the backspace character (hex 08), and the +sequences \R and \X are interpreted as the characters "R" and "X", respectively. +Outside a character class, these sequences have different meanings (see below). +

+
+
+
+

Absolute and relative back references

+

+The sequence \g followed by a positive or negative number, optionally enclosed +in braces, is an absolute or relative back reference. Back references are +discussed later, following the discussion of parenthesized subpatterns. +

+
+
+
+

Generic character types

+

+Another use of backslash is for specifying generic character types. +The following are always recognized: +

+
+

Table 5. Generic characters

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EscapeMeaning
\dany decimal digit
\Dany character that is not a decimal digit
\sany whitespace character
\Sany character that is not a whitespace character
\wany "word" character
\Wany "non-word" character
+
+

+Each pair of escape sequences partitions the complete set of characters +into two disjoint sets. Any given character matches one, and only one, +of each pair. +

+

+These character type sequences can appear both inside and outside character +classes. They each match one character of the appropriate type. +If the current matching point is at the end of the passed string, all +of them fail, since there is no character to match. +

+

+For compatibility with Perl, \s does not match the VT character (code +11). This makes it different from the the POSIX "space" class. The \s +characters are HT (9), LF (10), FF (12), CR (13), and space (32). +

+

+A "word" character is an underscore or any character less than 256 that +is a letter or digit.

+

+Characters with values greater than 128 never match \d, +\s, or \w, and always match \D, \S, and \W. +

+
+
+
+

Newline sequences

+

Outside a character class, the escape sequence \R matches any Unicode +newline sequence. +This particular group matches either the two-character sequence CR followed by +LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, +U+000B), FF (formfeed, U+000C), CR (carriage return, U+000D), NEL (next +line, U+0085), LS (line separator, U+2028), or PS (paragraph separator, U+2029). +The two-character sequence is treated as a single unit that +cannot be split. Inside a character class, \R matches the letter "R".

+
+
+
+

Unicode character properties

+

+To support generic character types there are three additional escape +sequences, they are: +

+
+

Table 6. Generic character types

+
++++ + + + + + + + + + + + + + + + + + + +
EscapeMeaning
\p{xx}a character with the xx property
\P{xx}a character without the xx property
\Xan extended Unicode sequence
+
+

+The property names represented by xx above are limited to the Unicode +script names, the general category properties, and "Any", which matches +any character (including newline). Other properties such as "InMusicalSymbols" +are not currently supported. Note that \P{Any} does not match any characters, +so always causes a match failure. +

+

+Sets of Unicode characters are defined as belonging to certain scripts. A +character from one of these sets can be matched using a script name. For +example, \p{Greek} or \P{Han}. +

+

+Those that are not part of an identified script are lumped together as +"Common". The current list of scripts is: +

+
    +
  • Arabic

  • +
  • Armenian

  • +
  • Balinese

  • +
  • Bengali

  • +
  • Bopomofo

  • +
  • Braille

  • +
  • Buginese

  • +
  • Buhid

  • +
  • Canadian_Aboriginal

  • +
  • Cherokee

  • +
  • Common

  • +
  • Coptic

  • +
  • Cuneiform

  • +
  • Cypriot

  • +
  • Cyrillic

  • +
  • Deseret

  • +
  • Devanagari

  • +
  • Ethiopic

  • +
  • Georgian

  • +
  • Glagolitic

  • +
  • Gothic

  • +
  • Greek

  • +
  • Gujarati

  • +
  • Gurmukhi

  • +
  • Han

  • +
  • Hangul

  • +
  • Hanunoo

  • +
  • Hebrew

  • +
  • Hiragana

  • +
  • Inherited

  • +
  • Kannada

  • +
  • Katakana

  • +
  • Kharoshthi

  • +
  • Khmer

  • +
  • Lao

  • +
  • Latin

  • +
  • Limbu

  • +
  • Linear_B

  • +
  • Malayalam

  • +
  • Mongolian

  • +
  • Myanmar

  • +
  • New_Tai_Lue

  • +
  • Nko

  • +
  • Ogham

  • +
  • Old_Italic

  • +
  • Old_Persian

  • +
  • Oriya

  • +
  • Osmanya

  • +
  • Phags_Pa

  • +
  • Phoenician

  • +
  • Runic

  • +
  • Shavian

  • +
  • Sinhala

  • +
  • Syloti_Nagri

  • +
  • Syriac

  • +
  • Tagalog

  • +
  • Tagbanwa

  • +
  • Tai_Le

  • +
  • Tamil

  • +
  • Telugu

  • +
  • Thaana

  • +
  • Thai

  • +
  • Tibetan

  • +
  • Tifinagh

  • +
  • Ugaritic

  • +
  • Yi

  • +
+

+Each character has exactly one general category property, specified by a +two-letter abbreviation. For compatibility with Perl, negation can be specified +by including a circumflex between the opening brace and the property name. For +example, \p{^Lu} is the same as \P{Lu}. +

+

+If only one letter is specified with \p or \P, it includes all the general +category properties that start with that letter. In this case, in the absence +of negation, the curly brackets in the escape sequence are optional; these two +examples have the same effect: +

+
+\p{L}
+\pL
+
+

+The following general category property codes are supported: +

+
+

Table 7. Property codes

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeMeaning
COther
CcControl
CfFormat
CnUnassigned
CoPrivate use
CsSurrogate
LLetter
LlLower case letter
LmModifier letter
LoOther letter
LtTitle case letter
LuUpper case letter
MMark
McSpacing mark
MeEnclosing mark
MnNon-spacing mark
NNumber
NdDecimal number
NlLetter number
NoOther number
PPunctuation
PcConnector punctuation
PdDash punctuation
PeClose punctuation
PfFinal punctuation
PiInitial punctuation
PoOther punctuation
PsOpen punctuation
SSymbol
ScCurrency symbol
SkModifier symbol
SmMathematical symbol
SoOther symbol
ZSeparator
ZlLine separator
ZpParagraph separator
ZsSpace separator
+
+

+The special property L& is also supported: it matches a character that has +the Lu, Ll, or Lt property, in other words, a letter that is not classified as +a modifier or "other". +

+

+The long synonyms for these properties that Perl supports (such as \ep{Letter}) +are not supported by GRegex, nor is it permitted to prefix any of these +properties with "Is". +

+

+No character that is in the Unicode table has the Cn (unassigned) property. +Instead, this property is assumed for any code point that is not in the +Unicode table. +

+

+Specifying caseless matching does not affect these escape sequences. +For example, \p{Lu} always matches only upper case letters. +

+

+The \X escape matches any number of Unicode characters that form an +extended Unicode sequence. \X is equivalent to +

+
+(?>\PM\pM*)
+
+

+That is, it matches a character without the "mark" property, followed +by zero or more characters with the "mark" property, and treats the +sequence as an atomic group (see below). Characters with the "mark" +property are typically accents that affect the preceding character. +

+

+Matching characters by Unicode property is not fast, because GRegex has +to search a structure that contains data for over fifteen thousand +characters. That is why the traditional escape sequences such as \d and +\w do not use Unicode properties. +

+
+
+
+

Simple assertions

+

+The final use of backslash is for certain simple assertions. An +assertion specifies a condition that has to be met at a particular point in +a match, without consuming any characters from the string. The +use of subpatterns for more complicated assertions is described below. +The backslashed assertions are: +

+
+

Table 8. Simple assertions

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EscapeMeaning
\bmatches at a word boundary
\Bmatches when not at a word boundary
\Amatches at the start of the string
\Zmatches at the end of the string or before a newline at the end of the string
\zmatches only at the end of the string
\Gmatches at first matching position in the string
+
+

+These assertions may not appear in character classes (but note that \b +has a different meaning, namely the backspace character, inside a +character class). +

+

+A word boundary is a position in the string where the current +character and the previous character do not both match \w or \W (i.e. +one matches \w and the other matches \W), or the start or end of the +string if the first or last character matches \w, respectively. +

+

+The \A, \Z, and \z assertions differ from the traditional circumflex +and dollar (described in the next section) in that they only ever match +at the very start and end of the string, whatever options are +set. Thus, they are independent of multiline mode. These three assertions +are not affected by the G_REGEX_MATCH_NOTBOL or G_REGEX_MATCH_NOTEOL options, +which affect only the behaviour of the circumflex and dollar metacharacters. +However, if the start_position argument of a matching function is non-zero, +indicating that matching is to start at a point other than the beginning of +the string, \A can never match. The difference between \Z and \z is +that \Z matches before a newline at the end of the string as well at the +very end, whereas \z matches only at the end. +

+

+The \G assertion is true only when the current matching position is at +the start point of the match, as specified by the start_position argument +to the matching functions. It differs from \A when the value of startoffset is +non-zero. +

+

+Note, however, that the interpretation of \G, as the start of the +current match, is subtly different from Perl’s, which defines it as the +end of the previous match. In Perl, these can be different when the +previously matched string was empty. +

+

+If all the alternatives of a pattern begin with \G, the expression is +anchored to the starting match position, and the "anchored" flag is set +in the compiled regular expression. +

+
+
+
+

Circumflex and dollar

+

+Outside a character class, in the default matching mode, the circumflex +character is an assertion that is true only if the current matching +point is at the start of the string. If the start_position argument to +the matching functions is non-zero, circumflex can never match if the +G_REGEX_MULTILINE option is unset. Inside a character class, circumflex +has an entirely different meaning (see below). +

+

+Circumflex need not be the first character of the pattern if a number +of alternatives are involved, but it should be the first thing in each +alternative in which it appears if the pattern is ever to match that +branch. If all possible alternatives start with a circumflex, that is, +if the pattern is constrained to match only at the start of the string, +it is said to be an "anchored" pattern. (There are also other +constructs that can cause a pattern to be anchored.) +

+

+A dollar character is an assertion that is true only if the current +matching point is at the end of the string, or immediately +before a newline at the end of the string (by default). Dollar need not +be the last character of the pattern if a number of alternatives are +involved, but it should be the last item in any branch in which it +appears. Dollar has no special meaning in a character class. +

+

+The meaning of dollar can be changed so that it matches only at the +very end of the string, by setting the G_REGEX_DOLLAR_ENDONLY option at +compile time. This does not affect the \Z assertion. +

+

+The meanings of the circumflex and dollar characters are changed if the +G_REGEX_MULTILINE option is set. When this is the case, +a circumflex matches immediately after internal newlines as well as at the +start of the string. It does not match after a newline that ends the string. +A dollar matches before any newlines in the string, as well as at the very +end, when G_REGEX_MULTILINE is set. When newline is +specified as the two-character sequence CRLF, isolated CR and LF characters +do not indicate newlines. +

+

+For example, the pattern /^abc$/ matches the string "def\nabc" (where +\n represents a newline) in multiline mode, but not otherwise. Consequently, +patterns that are anchored in single line mode because all branches start with +^ are not anchored in multiline mode, and a match for circumflex is possible +when the start_position argument of a matching function +is non-zero. The G_REGEX_DOLLAR_ENDONLY option is ignored +if G_REGEX_MULTILINE is set. +

+

+Note that the sequences \A, \Z, and \z can be used to match the start and +end of the string in both modes, and if all branches of a pattern start with +\A it is always anchored, whether or not G_REGEX_MULTILINE +is set. +

+
+
+

Full stop (period, dot)

+

+Outside a character class, a dot in the pattern matches any one character +in the string, including a non-printing character, but not (by +default) newline. In UTF-8 a character might be more than one byte long. +

+

+When a line ending is defined as a single character, dot never matches that +character; when the two-character sequence CRLF is used, dot does not match CR +if it is immediately followed by LF, but otherwise it matches all characters +(including isolated CRs and LFs). When any Unicode line endings are being +recognized, dot does not match CR or LF or any of the other line ending +characters. +

+

+If the G_REGEX_DOTALL flag is set, dots match newlines +as well. The handling of dot is entirely independent of the handling of circumflex +and dollar, the only relationship being that they both involve newline +characters. Dot has no special meaning in a character class. +

+

+The behaviour of dot with regard to newlines can be changed. If the +G_REGEX_DOTALL option is set, a dot matches any one +character, without exception. If newline is defined as the two-character +sequence CRLF, it takes two dots to match it. +

+

+The handling of dot is entirely independent of the handling of circumflex and +dollar, the only relationship being that they both involve newlines. Dot has no +special meaning in a character class. +

+
+
+

Matching a single byte

+

+Outside a character class, the escape sequence \C matches any one byte, +both in and out of UTF-8 mode. Unlike a dot, it always matches any line +ending characters. +The feature is provided in Perl in order to match individual bytes in +UTF-8 mode. Because it breaks up UTF-8 characters into individual +bytes, what remains in the string may be a malformed UTF-8 string. For +this reason, the \C escape sequence is best avoided. +

+

+GRegex does not allow \C to appear in lookbehind assertions (described +below), because in UTF-8 mode this would make it impossible to calculate +the length of the lookbehind. +

+
+
+

Square brackets and character classes

+

+An opening square bracket introduces a character class, terminated by a +closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class, +it should be the first data character in the class (after an initial +circumflex, if present) or escaped with a backslash. +

+

+A character class matches a single character in the string. A matched character +must be in the set of characters defined by the class, unless the first +character in the class definition is a circumflex, in which case the +string character must not be in the set defined by the class. If a +circumflex is actually required as a member of the class, ensure it is +not the first character, or escape it with a backslash. +

+

+For example, the character class [aeiou] matches any lower case vowel, +while [^aeiou] matches any character that is not a lower case vowel. +Note that a circumflex is just a convenient notation for specifying the +characters that are in the class by enumerating those that are not. A +class that starts with a circumflex is not an assertion: it still consumes +a character from the string, and therefore it fails if the current pointer +is at the end of the string. +

+

+In UTF-8 mode, characters with values greater than 255 can be included +in a class as a literal string of bytes, or by using the \x{ escaping +mechanism. +

+

+When caseless matching is set, any letters in a class represent both +their upper case and lower case versions, so for example, a caseless +[aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not +match "A", whereas a caseful version would. +

+

+Characters that might indicate line breaks are never treated +in any special way when matching character classes, whatever line-ending +sequence is in use, and whatever setting of the G_REGEX_DOTALL +and G_REGEX_MULTILINE options is used. A class such as [^a] +always matches one of these characters. +

+

+The minus (hyphen) character can be used to specify a range of characters in +a character class. For example, [d-m] matches any letter +between d and m, inclusive. If a minus character is required in a +class, it must be escaped with a backslash or appear in a position +where it cannot be interpreted as indicating a range, typically as the +first or last character in the class. +

+

+It is not possible to have the literal character "]" as the end character +of a range. A pattern such as [W-]46] is interpreted as a class of +two characters ("W" and "-") followed by a literal string "46]", so it +would match "W46]" or "-46]". However, if the "]" is escaped with a +backslash it is interpreted as the end of range, so [W-\]46] is interpreted +as a class containing a range followed by two other characters. +The octal or hexadecimal representation of "]" can also be used to end +a range. +

+

+Ranges operate in the collating sequence of character values. They can +also be used for characters specified numerically, for example +[\000-\037]. In UTF-8 mode, ranges can include characters whose values +are greater than 255, for example [\x{100}-\x{2ff}]. +

+

+The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear +in a character class, and add the characters that they match to the +class. For example, [\dABCDEF] matches any hexadecimal digit. A +circumflex can conveniently be used with the upper case character types to +specify a more restricted set of characters than the matching lower +case type. For example, the class [^\W_] matches any letter or digit, +but not underscore. +

+

+The only metacharacters that are recognized in character classes are +backslash, hyphen (only where it can be interpreted as specifying a +range), circumflex (only at the start), opening square bracket (only +when it can be interpreted as introducing a POSIX class name - see the +next section), and the terminating closing square bracket. However, +escaping other non-alphanumeric characters does no harm. +

+
+
+

Posix character classes

+

+GRegex supports the POSIX notation for character classes. This uses names +enclosed by [: and :] within the enclosing square brackets. For example, +

+
+[01[:alpha:]%]
+
+

+matches "0", "1", any alphabetic character, or "%". The supported class +names are +

+
+

Table 9. Posix classes

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameMeaning
alnumletters and digits
alphaletters
asciicharacter codes 0 - 127
blankspace or tab only
cntrlcontrol characters
digitdecimal digits (same as \d)
graphprinting characters, excluding space
lowerlower case letters
printprinting characters, including space
punctprinting characters, excluding letters and digits
spacewhite space (not quite the same as \s)
upperupper case letters
word"word" characters (same as \w)
xdigithexadecimal digits
+
+

+The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), +and space (32). Notice that this list includes the VT character (code +11). This makes "space" different to \s, which does not include VT (for +Perl compatibility). +

+

+The name "word" is a Perl extension, and "blank" is a GNU extension. +Another Perl extension is negation, which is indicated by a ^ character +after the colon. For example, +

+
+[12[:^digit:]]
+
+

+matches "1", "2", or any non-digit. GRegex also recognize the +POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but +these are not supported, and an error is given if they are encountered. +

+

+In UTF-8 mode, characters with values greater than 128 do not match any +of the POSIX character classes. +

+
+
+

Vertical bar

+

+Vertical bar characters are used to separate alternative patterns. For +example, the pattern +

+
+ gilbert|sullivan
+
+

+matches either "gilbert" or "sullivan". Any number of alternatives may +appear, and an empty alternative is permitted (matching the empty +string). The matching process tries each alternative in turn, from +left to right, and the first one that succeeds is used. If the alternatives are within a subpattern (defined below), "succeeds" means matching the rest of the main pattern as well as the alternative in the subpattern. +

+
+
+

Internal option setting

+

+The settings of the G_REGEX_CASELESS, G_REGEX_MULTILINE, G_REGEX_MULTILINE, +and G_REGEX_EXTENDED options can be changed from within the pattern by a +sequence of Perl-style option letters enclosed between "(?" and ")". The +option letters are +

+
+

Table 10. Option settings

+
++++ + + + + + + + + + + + + + + + + + + + + + + +
OptionFlag
iG_REGEX_CASELESS
mG_REGEX_MULTILINE
sG_REGEX_DOTALL
xG_REGEX_EXTENDED
+
+

+For example, (?im) sets caseless, multiline matching. It is also +possible to unset these options by preceding the letter with a hyphen, and a +combined setting and unsetting such as (?im-sx), which sets G_REGEX_CASELESS +and G_REGEX_MULTILINE while unsetting G_REGEX_DOTALL and G_REGEX_EXTENDED, +is also permitted. If a letter appears both before and after the +hyphen, the option is unset. +

+

+When an option change occurs at top level (that is, not inside subpattern +parentheses), the change applies to the remainder of the pattern +that follows. +

+

+An option change within a subpattern (see below for a description of subpatterns) +affects only that part of the current pattern that follows it, so +

+
+(a(?i)b)c
+
+

+matches abc and aBc and no other strings (assuming G_REGEX_CASELESS is not +used). By this means, options can be made to have different settings +in different parts of the pattern. Any changes made in one alternative +do carry on into subsequent branches within the same subpattern. For +example, +

+
+(a(?i)b|c)
+
+

+matches "ab", "aB", "c", and "C", even though when matching "C" the +first branch is abandoned before the option setting. This is because +the effects of option settings happen at compile time. There would be +some very weird behaviour otherwise. +

+

+The options G_REGEX_UNGREEDY and +G_REGEX_EXTRA and G_REGEX_DUPNAMES +can be changed in the same way as the Perl-compatible options by using +the characters U, X and J respectively. +

+
+
+

Subpatterns

+

+Subpatterns are delimited by parentheses (round brackets), which can be +nested. Turning part of a pattern into a subpattern does two things: +

+
    +
  • +It localizes a set of alternatives. For example, the pattern +cat(aract|erpillar|) matches one of the words "cat", "cataract", or +"caterpillar". Without the parentheses, it would match "cataract", +"erpillar" or an empty string. +

  • +
  • +It sets up the subpattern as a capturing subpattern. This means +that, when the whole pattern matches, that portion of the +string that matched the subpattern can be obtained using g_regex_fetch(). +Opening parentheses are counted from left to right (starting from 1, as +subpattern 0 is the whole matched string) to obtain numbers for the +capturing subpatterns. +

  • +
+

+For example, if the string "the red king" is matched against the pattern +

+
+the ((red|white) (king|queen))
+
+

+the captured substrings are "red king", "red", and "king", and are numbered 1, 2, and 3, respectively. +

+

+The fact that plain parentheses fulfil two functions is not always +helpful. There are often times when a grouping subpattern is required +without a capturing requirement. If an opening parenthesis is followed +by a question mark and a colon, the subpattern does not do any capturing, +and is not counted when computing the number of any subsequent +capturing subpatterns. For example, if the string "the white queen" is +matched against the pattern +

+
+the ((?:red|white) (king|queen))
+
+

+the captured substrings are "white queen" and "queen", and are numbered +1 and 2. The maximum number of capturing subpatterns is 65535. +

+

+As a convenient shorthand, if any option settings are required at the +start of a non-capturing subpattern, the option letters may appear +between the "?" and the ":". Thus the two patterns +

+
+(?i:saturday|sunday)
+(?:(?i)saturday|sunday)
+
+

+match exactly the same set of strings. Because alternative branches are +tried from left to right, and options are not reset until the end of +the subpattern is reached, an option setting in one branch does affect +subsequent branches, so the above patterns match "SUNDAY" as well as +"Saturday". +

+
+
+

Named subpatterns

+

+Identifying capturing parentheses by number is simple, but it can be +very hard to keep track of the numbers in complicated regular expressions. +Furthermore, if an expression is modified, the numbers may +change. To help with this difficulty, GRegex supports the naming of +subpatterns. A subpattern can be named in one of three ways: (?<name>...) or +(?'name'...) as in Perl, or (?P<name>...) as in Python. +References to capturing parentheses from other +parts of the pattern, such as backreferences, recursion, and conditions, +can be made by name as well as by number. +

+

+Names consist of up to 32 alphanumeric characters and underscores. Named +capturing parentheses are still allocated numbers as well as names, exactly as +if the names were not present. +By default, a name must be unique within a pattern, but it is possible to relax +this constraint by setting the G_REGEX_DUPNAMES option at +compile time. This can be useful for patterns where only one instance of the +named parentheses can match. Suppose you want to match the name of a weekday, +either as a 3-letter abbreviation or as the full name, and in both cases you +want to extract the abbreviation. This pattern (ignoring the line breaks) does +the job: +

+
+(?<DN>Mon|Fri|Sun)(?:day)?|
+(?<DN>Tue)(?:sday)?|
+(?<DN>Wed)(?:nesday)?|
+(?<DN>Thu)(?:rsday)?|
+(?<DN>Sat)(?:urday)?
+
+

+There are five capturing substrings, but only one is ever set after a match. +The function for extracting the data by name returns the substring +for the first (and in this example, the only) subpattern of that name that +matched. This saves searching to find which numbered subpattern it was. If you +make a reference to a non-unique named subpattern from elsewhere in the +pattern, the one that corresponds to the lowest number is used. +

+
+
+

Repetition

+

+Repetition is specified by quantifiers, which can follow any of the +following items: +

+
    +
  • a literal data character

  • +
  • the dot metacharacter

  • +
  • the \C escape sequence

  • +
  • the \X escape sequence (in UTF-8 mode)

  • +
  • the \R escape sequence

  • +
  • an escape such as \d that matches a single character

  • +
  • a character class

  • +
  • a back reference (see next section)

  • +
  • a parenthesized subpattern (unless it is an assertion)

  • +
+

+The general repetition quantifier specifies a minimum and maximum number +of permitted matches, by giving the two numbers in curly brackets +(braces), separated by a comma. The numbers must be less than 65536, +and the first must be less than or equal to the second. For example: +

+
+z{2,4}
+
+

+matches "zz", "zzz", or "zzzz". A closing brace on its own is not a +special character. If the second number is omitted, but the comma is +present, there is no upper limit; if the second number and the comma +are both omitted, the quantifier specifies an exact number of required +matches. Thus +

+
+[aeiou]{3,}
+
+

+matches at least 3 successive vowels, but may match many more, while +

+
+\d{8}
+
+

+matches exactly 8 digits. An opening curly bracket that appears in a +position where a quantifier is not allowed, or one that does not match +the syntax of a quantifier, is taken as a literal character. For example, +{,6} is not a quantifier, but a literal string of four characters. +

+

+In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to +individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 +characters, each of which is represented by a two-byte sequence. Similarly, +\X{3} matches three Unicode extended sequences, each of which may be +several bytes long (and they may be of different lengths). +

+

+The quantifier {0} is permitted, causing the expression to behave as if +the previous item and the quantifier were not present. +

+

+For convenience, the three most common quantifiers have single-character +abbreviations: +

+
+

Table 11. Abbreviations for quantifiers

+
++++ + + + + + + + + + + + + + + + + + + +
AbbreviationMeaning
*is equivalent to {0,}
+is equivalent to {1,}
?is equivalent to {0,1}
+
+

+It is possible to construct infinite loops by following a subpattern +that can match no characters with a quantifier that has no upper limit, +for example: +

+
+(a?)*
+
+

+Because there are cases where this can be useful, such patterns are +accepted, but if any repetition of the subpattern does in fact match +no characters, the loop is forcibly broken. +

+

+By default, the quantifiers are "greedy", that is, they match as much +as possible (up to the maximum number of permitted times), without +causing the rest of the pattern to fail. The classic example of where +this gives problems is in trying to match comments in C programs. These +appear between /* and */ and within the comment, individual * and / +characters may appear. An attempt to match C comments by applying the +pattern +

+
+/\*.*\*/
+
+

+to the string +

+
+/* first comment */  not comment  /* second comment */
+
+

+fails, because it matches the entire string owing to the greediness of +the .* item. +

+

+However, if a quantifier is followed by a question mark, it ceases to +be greedy, and instead matches the minimum number of times possible, so +the pattern +

+
+/\*.*?\*/
+
+

+does the right thing with the C comments. The meaning of the various +quantifiers is not otherwise changed, just the preferred number of +matches. Do not confuse this use of question mark with its use as a +quantifier in its own right. Because it has two uses, it can sometimes +appear doubled, as in +

+
+\d??\d
+
+

+which matches one digit by preference, but can match two if that is the +only way the rest of the pattern matches. +

+

+If the G_REGEX_UNGREEDY flag is set, the quantifiers are not greedy +by default, but individual ones can be made greedy by following them with +a question mark. In other words, it inverts the default behaviour. +

+

+When a parenthesized subpattern is quantified with a minimum repeat +count that is greater than 1 or with a limited maximum, more memory is +required for the compiled pattern, in proportion to the size of the +minimum or maximum. +

+

+If a pattern starts with .* or .{0,} and the G_REGEX_DOTALL flag +is set, thus allowing the dot to match newlines, the +pattern is implicitly anchored, because whatever follows will be tried +against every character position in the string, so there is no +point in retrying the overall match at any position after the first. +GRegex normally treats such a pattern as though it were preceded by \A. +

+

+In cases where it is known that the string contains no newlines, it +is worth setting G_REGEX_DOTALL in order to obtain this optimization, +or alternatively using ^ to indicate anchoring explicitly. +

+

+However, there is one situation where the optimization cannot be used. +When .* is inside capturing parentheses that are the subject of a +backreference elsewhere in the pattern, a match at the start may fail +where a later one succeeds. Consider, for example: +

+
+(.*)abc\1
+
+

+If the string is "xyz123abc123" the match point is the fourth character. +For this reason, such a pattern is not implicitly anchored. +

+

+When a capturing subpattern is repeated, the value captured is the +substring that matched the final iteration. For example, after +

+
+(tweedle[dume]{3}\s*)+
+
+

+has matched "tweedledum tweedledee" the value of the captured substring +is "tweedledee". However, if there are nested capturing subpatterns, +the corresponding captured values may have been set in previous iterations. +For example, after +

+
+/(a|(b))+/
+
+

+matches "aba" the value of the second captured substring is "b". +

+
+
+

Atomic grouping and possessive quantifiers

+

+With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") +repetition, failure of what follows normally causes the repeated +item to be re-evaluated to see if a different number +of repeats allows the rest of the pattern to match. Sometimes it +is useful to prevent this, either to change the nature of the +match, or to cause it fail earlier than it otherwise might, when the +author of the pattern knows there is no point in carrying on. +

+

+Consider, for example, the pattern \d+foo when applied to the string +

+
+123456bar
+
+

+After matching all 6 digits and then failing to match "foo", the normal +action of the matcher is to try again with only 5 digits matching the +\d+ item, and then with 4, and so on, before ultimately failing. +"Atomic grouping" (a term taken from Jeffrey Friedl’s book) provides +the means for specifying that once a subpattern has matched, it is not +to be re-evaluated in this way. +

+

+If we use atomic grouping for the previous example, the matcher +give up immediately on failing to match "foo" the first time. The notation +is a kind of special parenthesis, starting with (?> as in this +example: +

+
+(?>\d+)foo
+
+

+This kind of parenthesis "locks up" the part of the pattern it contains +once it has matched, and a failure further into the pattern is +prevented from backtracking into it. Backtracking past it to previous +items, however, works as normal. +

+

+An alternative description is that a subpattern of this type matches +the string of characters that an identical standalone pattern would +match, if anchored at the current point in the string. +

+

+Atomic grouping subpatterns are not capturing subpatterns. Simple cases +such as the above example can be thought of as a maximizing repeat that +must swallow everything it can. So, while both \d+ and \d+? are prepared +to adjust the number of digits they match in order to make the +rest of the pattern match, (?>\d+) can only match an entire sequence of +digits. +

+

+Atomic groups in general can of course contain arbitrarily complicated +subpatterns, and can be nested. However, when the subpattern for an +atomic group is just a single repeated item, as in the example above, a +simpler notation, called a "possessive quantifier" can be used. This +consists of an additional + character following a quantifier. Using +this notation, the previous example can be rewritten as +

+
+\d++foo
+
+

+Possessive quantifiers are always greedy; the setting of the +G_REGEX_UNGREEDY option is ignored. They are a convenient notation for the +simpler forms of atomic group. However, there is no difference in the +meaning of a possessive quantifier and the equivalent +atomic group, though there may be a performance difference; +possessive quantifiers should be slightly faster. +

+

+The possessive quantifier syntax is an extension to the Perl syntax. +It was invented by Jeffrey Friedl in the first edition of his book and +then implemented by Mike McCloskey in Sun's Java package. +It ultimately found its way into Perl at release 5.10. +

+

+GRegex has an optimization that automatically "possessifies" certain simple +pattern constructs. For example, the sequence A+B is treated as A++B because +there is no point in backtracking into a sequence of A's when B must follow. +

+

+When a pattern contains an unlimited repeat inside a subpattern that +can itself be repeated an unlimited number of times, the use of an +atomic group is the only way to avoid some failing matches taking a +very long time indeed. The pattern +

+
+(\D+|<\d+>)*[!?]
+
+

+matches an unlimited number of substrings that either consist of non- +digits, or digits enclosed in <>, followed by either ! or ?. When it +matches, it runs quickly. However, if it is applied to +

+
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+

+it takes a long time before reporting failure. This is because the +string can be divided between the internal \D+ repeat and the external +* repeat in a large number of ways, and all have to be tried. (The +example uses [!?] rather than a single character at the end, because +GRegex has an optimization that allows for fast failure +when a single character is used. It remember the last single character +that is required for a match, and fail early if it is not present +in the string.) If the pattern is changed so that it uses an atomic +group, like this: +

+
+((?>\D+)|<\d+>)*[!?]
+
+

+sequences of non-digits cannot be broken, and failure happens quickly. +

+
+
+

Back references

+

+Outside a character class, a backslash followed by a digit greater than +0 (and possibly further digits) is a back reference to a capturing subpattern +earlier (that is, to its left) in the pattern, provided there have been that +many previous capturing left parentheses. +

+

+However, if the decimal number following the backslash is less than 10, +it is always taken as a back reference, and causes an error only if +there are not that many capturing left parentheses in the entire pattern. +In other words, the parentheses that are referenced need not be +to the left of the reference for numbers less than 10. A "forward back +reference" of this type can make sense when a repetition is involved and +the subpattern to the right has participated in an earlier iteration. +

+

+It is not possible to have a numerical "forward back reference" to subpattern +whose number is 10 or more using this syntax because a sequence such as \e50 is +interpreted as a character defined in octal. See the subsection entitled +"Non-printing characters" above for further details of the handling of digits +following a backslash. There is no such problem when named parentheses are used. +A back reference to any subpattern is possible using named parentheses (see below). +

+

+Another way of avoiding the ambiguity inherent in the use of digits following a +backslash is to use the \g escape sequence (introduced in Perl 5.10.) +This escape must be followed by a positive or a negative number, +optionally enclosed in braces. +

+

+A positive number specifies an absolute reference without the ambiguity that is +present in the older syntax. It is also useful when literal digits follow the +reference. A negative number is a relative reference. Consider "(abc(def)ghi)\g{-1}", +the sequence \g{-1} is a reference to the most recently started capturing +subpattern before \g, that is, is it equivalent to \2. Similarly, \g{-2} +would be equivalent to \1. The use of relative references can be helpful in +long patterns, and also in patterns that are created by joining together +fragments that contain references within themselves. +

+

+A back reference matches whatever actually matched the capturing subpattern +in the current string, rather than anything matching +the subpattern itself (see "Subpatterns as subroutines" below for a way +of doing that). So the pattern +

+
+(sens|respons)e and \1ibility
+
+

+matches "sense and sensibility" and "response and responsibility", but +not "sense and responsibility". If caseful matching is in force at the +time of the back reference, the case of letters is relevant. For example, +

+
+((?i)rah)\s+\1
+
+

+matches "rah rah" and "RAH RAH", but not "RAH rah", even though the +original capturing subpattern is matched caselessly. +

+

+Back references to named subpatterns use the Perl syntax \k<name> or \k'name' +or the Python syntax (?P=name). We could rewrite the above example in either of +the following ways: +

+
+(?<p1>(?i)rah)\s+\k<p1>
+(?P<p1>(?i)rah)\s+(?P=p1)
+
+

+A subpattern that is referenced by name may appear in the pattern before or +after the reference. +

+

+There may be more than one back reference to the same subpattern. If a +subpattern has not actually been used in a particular match, any back +references to it always fail. For example, the pattern +

+
+(a|(bc))\2
+
+

+always fails if it starts to match "a" rather than "bc". Because there +may be many capturing parentheses in a pattern, all digits following +the backslash are taken as part of a potential back reference number. +If the pattern continues with a digit character, some delimiter must be +used to terminate the back reference. If the G_REGEX_EXTENDED flag is +set, this can be whitespace. Otherwise an empty comment (see "Comments" below) can be used. +

+

+A back reference that occurs inside the parentheses to which it refers +fails when the subpattern is first used, so, for example, (a\1) never +matches. However, such references can be useful inside repeated subpatterns. +For example, the pattern +

+
+(a|b\1)+
+
+

+matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration +of the subpattern, the back reference matches the character +string corresponding to the previous iteration. In order for this to +work, the pattern must be such that the first iteration does not need +to match the back reference. This can be done using alternation, as in +the example above, or by a quantifier with a minimum of zero. +

+
+
+

Assertions

+

+An assertion is a test on the characters following or preceding the +current matching point that does not actually consume any characters. +The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are +described above. +

+

+More complicated assertions are coded as subpatterns. There are two +kinds: those that look ahead of the current position in the +string, and those that look behind it. An assertion subpattern is +matched in the normal way, except that it does not cause the current +matching position to be changed. +

+

+Assertion subpatterns are not capturing subpatterns, and may not be +repeated, because it makes no sense to assert the same thing several +times. If any kind of assertion contains capturing subpatterns within +it, these are counted for the purposes of numbering the capturing +subpatterns in the whole pattern. However, substring capturing is carried +out only for positive assertions, because it does not make sense for +negative assertions. +

+
+

Lookahead assertions

+

+Lookahead assertions start with (?= for positive assertions and (?! for +negative assertions. For example, +

+
+\w+(?=;)
+
+

+matches a word followed by a semicolon, but does not include the semicolon +in the match, and +

+
+foo(?!bar)
+
+

+matches any occurrence of "foo" that is not followed by "bar". Note +that the apparently similar pattern +

+
+(?!foo)bar
+
+

+does not find an occurrence of "bar" that is preceded by something +other than "foo"; it finds any occurrence of "bar" whatsoever, because +the assertion (?!foo) is always true when the next three characters are +"bar". A lookbehind assertion is needed to achieve the other effect. +

+

+If you want to force a matching failure at some point in a pattern, the +most convenient way to do it is with (?!) because an empty string +always matches, so an assertion that requires there not to be an empty +string must always fail. +

+
+
+
+

Lookbehind assertions

+

+Lookbehind assertions start with (?<= for positive assertions and (?<! +for negative assertions. For example, +

+
+(?<!foo)bar
+
+

+does find an occurrence of "bar" that is not preceded by "foo". The +contents of a lookbehind assertion are restricted such that all the +strings it matches must have a fixed length. However, if there are +several top-level alternatives, they do not all have to have the same +fixed length. Thus +

+
+(?<=bullock|donkey)
+
+

+is permitted, but +

+
+(?<!dogs?|cats?)
+
+

+causes an error at compile time. Branches that match different length +strings are permitted only at the top level of a lookbehind assertion. +An assertion such as +

+
+(?<=ab(c|de))
+
+

+is not permitted, because its single top-level branch can match two +different lengths, but it is acceptable if rewritten to use two top- +level branches: +

+
+(?<=abc|abde)
+
+

+The implementation of lookbehind assertions is, for each alternative, +to temporarily move the current position back by the fixed length and +then try to match. If there are insufficient characters before the +current position, the assertion fails. +

+

+GRegex does not allow the \C escape (which matches a single byte in UTF-8 +mode) to appear in lookbehind assertions, because it makes it impossible +to calculate the length of the lookbehind. The \X and \R escapes, which can +match different numbers of bytes, are also not permitted. +

+

+Possessive quantifiers can be used in conjunction with lookbehind assertions to +specify efficient matching at the end of the subject string. Consider a simple +pattern such as +

+
+abcd$
+
+

+when applied to a long string that does not match. Because matching +proceeds from left to right, GRegex will look for each "a" in the string +and then see if what follows matches the rest of the pattern. If the +pattern is specified as +

+
+^.*abcd$
+
+

+the initial .* matches the entire string at first, but when this fails +(because there is no following "a"), it backtracks to match all but the +last character, then all but the last two characters, and so on. Once +again the search for "a" covers the entire string, from right to left, +so we are no better off. However, if the pattern is written as +

+
+^.*+(?<=abcd)
+
+

+there can be no backtracking for the .*+ item; it can match only the +entire string. The subsequent lookbehind assertion does a single test +on the last four characters. If it fails, the match fails immediately. +For long strings, this approach makes a significant difference to the +processing time. +

+
+
+
+

Using multiple assertions

+

+Several assertions (of any sort) may occur in succession. For example, +

+
+(?<=\d{3})(?<!999)foo
+
+

+matches "foo" preceded by three digits that are not "999". Notice that +each of the assertions is applied independently at the same point in +the string. First there is a check that the previous three +characters are all digits, and then there is a check that the same +three characters are not "999". This pattern does not match "foo" preceded +by six characters, the first of which are digits and the last +three of which are not "999". For example, it doesn’t match "123abcfoo". +A pattern to do that is +

+
+(?<=\d{3}...)(?<!999)foo
+
+

+This time the first assertion looks at the preceding six characters, +checking that the first three are digits, and then the second assertion +checks that the preceding three characters are not "999". +

+

+Assertions can be nested in any combination. For example, +

+
+(?<=(?<!foo)bar)baz
+
+

+matches an occurrence of "baz" that is preceded by "bar" which in turn +is not preceded by "foo", while +

+
+(?<=\d{3}(?!999)...)foo
+
+

+is another pattern that matches "foo" preceded by three digits and any +three characters that are not "999". +

+
+
+
+

Conditional subpatterns

+

+It is possible to cause the matching process to obey a subpattern +conditionally or to choose between two alternative subpatterns, depending +on the result of an assertion, or whether a previous capturing subpattern +matched or not. The two possible forms of conditional subpattern are +

+
+(?(condition)yes-pattern)
+(?(condition)yes-pattern|no-pattern)
+
+

+If the condition is satisfied, the yes-pattern is used; otherwise the +no-pattern (if present) is used. If there are more than two alternatives +in the subpattern, a compile-time error occurs. +

+

+There are four kinds of condition: references to subpatterns, references to +recursion, a pseudo-condition called DEFINE, and assertions. +

+
+

Checking for a used subpattern by number

+

+If the text between the parentheses consists of a sequence of digits, the +condition is true if the capturing subpattern of that number has previously +matched. +

+

+Consider the following pattern, which contains non-significant white space +to make it more readable (assume the G_REGEX_EXTENDED) +and to divide it into three parts for ease of discussion: +

+
+( \( )?    [^()]+    (?(1) \) )
+
+

+The first part matches an optional opening parenthesis, and if that +character is present, sets it as the first captured substring. The second +part matches one or more characters that are not parentheses. The +third part is a conditional subpattern that tests whether the first set +of parentheses matched or not. If they did, that is, if string started +with an opening parenthesis, the condition is true, and so the yes-pattern +is executed and a closing parenthesis is required. Otherwise, +since no-pattern is not present, the subpattern matches nothing. In +other words, this pattern matches a sequence of non-parentheses, +optionally enclosed in parentheses. +

+
+
+
+

Checking for a used subpattern by name

+

+Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used +subpattern by name, the Python syntax (?(name)...) is also recognized. However, +there is a possible ambiguity with this syntax, because subpattern names may +consist entirely of digits. GRegex looks first for a named subpattern; if it +cannot find one and the name consists entirely of digits, GRegex looks for a +subpattern of that number, which must be greater than zero. Using subpattern +names that consist entirely of digits is not recommended. +

+

+Rewriting the above example to use a named subpattern gives this: +

+
+(?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
+
+
+
+
+

Checking for pattern recursion

+

+If the condition is the string (R), and there is no subpattern with the name R, +the condition is true if a recursive call to the whole pattern or any +subpattern has been made. If digits or a name preceded by ampersand follow the +letter R, for example: +

+
+(?(R3)...)
+(?(R&name)...)
+
+

+the condition is true if the most recent recursion is into the subpattern whose +number or name is given. This condition does not check the entire recursion +stack. +

+

+At "top level", all these recursion test conditions are false. Recursive +patterns are described below. +

+
+
+
+

Defining subpatterns for use by reference only

+

+If the condition is the string (DEFINE), and there is no subpattern with the +name DEFINE, the condition is always false. In this case, there may be only one +alternative in the subpattern. It is always skipped if control reaches this +point in the pattern; the idea of DEFINE is that it can be used to define +"subroutines" that can be referenced from elsewhere. (The use of "subroutines" +is described below.) For example, a pattern to match an IPv4 address could be +written like this (ignore whitespace and line breaks): +

+
+(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
+\b (?&byte) (\.(?&byte)){3} \b
+
+

+The first part of the pattern is a DEFINE group inside which a another group +named "byte" is defined. This matches an individual component of an IPv4 +address (a number less than 256). When matching takes place, this part of the +pattern is skipped because DEFINE acts like a false condition. +

+

+The rest of the pattern uses references to the named group to match the four +dot-separated components of an IPv4 address, insisting on a word boundary at +each end. +

+
+
+
+

Assertion conditions

+

+If the condition is not in any of the above formats, it must be an +assertion. This may be a positive or negative lookahead or lookbehind +assertion. Consider this pattern, again containing non-significant +white space, and with the two alternatives on the second line: +

+
+(?(?=[^a-z]*[a-z])
+\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
+
+

+The condition is a positive lookahead assertion that matches an +optional sequence of non-letters followed by a letter. In other words, +it tests for the presence of at least one letter in the string. If a +letter is found, the string is matched against the first alternative; +otherwise it is matched against the second. This pattern matches +strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are +letters and dd are digits. +

+
+
+
+

Comments

+

+The sequence (?# marks the start of a comment that continues up to the +next closing parenthesis. Nested parentheses are not permitted. The +characters that make up a comment play no part in the pattern matching +at all. +

+

+If the G_REGEX_EXTENDED option is set, an unescaped # +character outside a character class introduces a comment that continues to +immediately after the next newline in the pattern. +

+
+
+

Recursive patterns

+

+Consider the problem of matching a string in parentheses, allowing for +unlimited nested parentheses. Without the use of recursion, the best +that can be done is to use a pattern that matches up to some fixed +depth of nesting. It is not possible to handle an arbitrary nesting +depth. +

+

+For some time, Perl has provided a facility that allows regular expressions to +recurse (amongst other things). It does this by interpolating Perl code in the +expression at run time, and the code can refer to the expression itself. A Perl +pattern using code interpolation to solve the parentheses problem can be +created like this: +

+
+$re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
+
+

+The (?p{...}) item interpolates Perl code at run time, and in this case refers +recursively to the pattern in which it appears. +

+

+Obviously, GRegex cannot support the interpolation of Perl code. Instead, it +supports special syntax for recursion of the entire pattern, and also for +individual subpattern recursion. This kind of recursion was introduced into +Perl at release 5.10. +

+

+A special item that consists of (? followed by a number greater than zero and a +closing parenthesis is a recursive call of the subpattern of the given number, +provided that it occurs inside that subpattern. (If not, it is a "subroutine" +call, which is described in the next section.) The special item (?R) or (?0) is +a recursive call of the entire regular expression. +

+

+In GRegex (like Python, but unlike Perl), a recursive subpattern call is always +treated as an atomic group. That is, once it has matched some of the subject +string, it is never re-entered, even if it contains untried alternatives and +there is a subsequent matching failure. +

+

+This pattern solves the nested parentheses problem (assume the +G_REGEX_EXTENDED option is set so that white space is +ignored): +

+
+\( ( (?>[^()]+) | (?R) )* \)
+
+

+First it matches an opening parenthesis. Then it matches any number of +substrings which can either be a sequence of non-parentheses, or a +recursive match of the pattern itself (that is, a correctly parenthesized +substring). Finally there is a closing parenthesis. +

+

+If this were part of a larger pattern, you would not want to recurse +the entire pattern, so instead you could use this: +

+
+( \( ( (?>[^()]+) | (?1) )* \) )
+
+

+We have put the pattern into parentheses, and caused the recursion to +refer to them instead of the whole pattern. In a larger pattern, keeping +track of parenthesis numbers can be tricky. It may be more convenient to +use named parentheses instead. +The Perl syntax for this is (?&name); GRegex also supports the(?P>name) +syntac. We could rewrite the above example as follows: +

+
+(?<pn> \( ( (?>[^()]+) | (?&pn) )* \) )
+
+

+If there is more than one subpattern with the same name, the earliest one is +used. This particular example pattern contains nested unlimited repeats, and so +the use of atomic grouping for matching strings of non-parentheses is important +when applying the pattern to strings that do not match. +For example, when this pattern is applied to +

+
+(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
+
+

+it yields "no match" quickly. However, if atomic grouping is not used, +the match runs for a very long time indeed because there are so many +different ways the + and * repeats can carve up the string, and all +have to be tested before failure can be reported. +

+

+At the end of a match, the values set for any capturing subpatterns are +those from the outermost level of the recursion at which the subpattern +value is set. + + + +If the pattern above is matched against +

+
+(ab(cd)ef)
+
+

+the value for the capturing parentheses is "ef", which is the last +value taken on at the top level. If additional parentheses are added, +giving +

+
+\( ( ( (?>[^()]+) | (?R) )* ) \)
+   ^                        ^
+   ^                        ^
+
+

+the string they capture is "ab(cd)ef", the contents of the top level +parentheses. +

+

+Do not confuse the (?R) item with the condition (R), which tests for +recursion. Consider this pattern, which matches text in angle brackets, +allowing for arbitrary nesting. Only digits are allowed in nested +brackets (that is, when recursing), whereas any characters are permitted +at the outer level. +

+
+< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >
+
+

+In this pattern, (?(R) is the start of a conditional subpattern, with +two different alternatives for the recursive and non-recursive cases. +The (?R) item is the actual recursive call. +

+
+
+

Subpatterns as subroutines

+

+If the syntax for a recursive subpattern reference (either by number or +by name) is used outside the parentheses to which it refers, it operates +like a subroutine in a programming language. The "called" subpattern may +be defined before or after the reference. An earlier example pointed out +that the pattern +

+
+(sens|respons)e and \1ibility
+
+

+matches "sense and sensibility" and "response and responsibility", but +not "sense and responsibility". If instead the pattern +

+
+(sens|respons)e and (?1)ibility
+
+

+is used, it does match "sense and responsibility" as well as the other +two strings. Another example is given in the discussion of DEFINE above. +

+

+Like recursive subpatterns, a "subroutine" call is always treated as an atomic +group. That is, once it has matched some of the string, it is never +re-entered, even if it contains untried alternatives and there is a subsequent +matching failure. +

+

+When a subpattern is used as a subroutine, processing options such as +case-independence are fixed when the subpattern is defined. They cannot be +changed for different calls. For example, consider this pattern: +

+
+(abc)(?i:(?1))
+
+

+It matches "abcabc". It does not match "abcABC" because the change of +processing option does not affect the called subpattern. +

+
+
+

Copyright

+

+This document was copied and adapted from the PCRE documentation, +specifically from the man page for pcrepattern. +The original copyright note is: +

+
+Copyright (c) 1997-2006 University of Cambridge.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the name of Google
+      Inc. nor the names of their contributors may be used to endorse or
+      promote products derived from this software without specific prior
+      written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-resources.html b/docs/reference/glib/html/glib-resources.html new file mode 100644 index 0000000..f01baa5 --- /dev/null +++ b/docs/reference/glib/html/glib-resources.html @@ -0,0 +1,141 @@ + + + + +Mailing lists and bug reports + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Mailing lists and bug reports

+

Mailing lists and bug reports — +Getting help with GLib +

+
+
+

Filing a bug report or feature request

+

+If you encounter a bug, misfeature, or missing feature in GLib, please +file a bug report on +http://bugzilla.gnome.org. +We'd also appreciate reports of incomplete or misleading information in +the GLib documentation; file those against the "docs" component of the "glib" +product in Bugzilla. +

+

+Don't hesitate to file a bug report, even if you think we may know +about it already, or aren't sure of the details. Just give us as much +information as you have, and if it's already fixed or has already been +discussed, we'll add a note to that effect in the report. +

+

+The bug tracker should definitely be used for feature requests, it's +not only for bugs. We track all GLib development in Bugzilla, so it's +the way to be sure the GLib developers won't forget about an issue. +

+
+
+

Submitting Patches

+

+If you develop a bugfix or enhancement for GLib, 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 GNU LGPL 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 +gtk-devel-list@gnome.org. +But be sure to file the Bugzilla report as well; if the patch is only on the +list and not in Bugzilla, it's likely to slip through the cracks. +

+
+
+

Mailing lists

+

+There are several mailing lists dedicated to GTK+ and related +libraries. Discussion of GLib generally takes place on these lists. +You can subscribe or view the archives of these lists on +http://mail.gnome.org. +

+

+

+
++ + + + + + + + + + + + + + +

gtk-list@gnome.org

+gtk-list covers general GTK+ (and GLib) topics; questions about using GLib +in programs, GLib from a user standpoint, announcements of GLib-related projects +would all be on-topic. The bulk of the traffic consists of GTK+ programming +questions. +

gtk-devel-list@gnome.org

+gtk-devel-list is for discussion of work on GTK+ (and GLib) itself, it is +not for asking questions about how to use GTK+ (or GLib) +in applications. gtk-devel-list is appropriate for discussion of patches, +bugs, proposed features, and so on. +

gtk-doc-list@gnome.org

+gtk-doc-list is for discussion of the gtk-doc +documentation system (used to document GTK+ and Glib), and for work on the GTK+ +(and GLib) documentation. +

+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-running.html b/docs/reference/glib/html/glib-running.html new file mode 100644 index 0000000..e0a9e80 --- /dev/null +++ b/docs/reference/glib/html/glib-running.html @@ -0,0 +1,322 @@ + + + + +Running GLib Applications + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Running GLib Applications

+

Running GLib Applications — +How to run and debug your GLib application +

+
+
+

Running and debugging GLib Applications

+
+

Environment variables

+

+GLib inspects a few of environment variables in addition to standard +variables like LANG, PATH or HOME. +

+

G_FILENAME_ENCODING.  + This environment variable can be set to a comma-separated list of character + set names. GLib assumes that filenames are encoded in the first character + set from that list rather than in UTF-8. The special token "@locale" can be + used to specify the character set for the current locale. +

+

G_BROKEN_FILENAMES.  + If this environment variable is set, GLib assumes that filenames are in + the locale encoding rather than in UTF-8. G_FILENAME_ENCODING takes + priority over G_BROKEN_FILENAMES. +

+

G_MESSAGES_PREFIXED.  + A list of log levels for which messages should be prefixed by the + program name and PID of the application. The default is to prefix + everything except G_LOG_LEVEL_MESSAGE and G_LOG_LEVEL_INFO. +

+

G_DEBUG.  + If GLib has been configured with --enable-debug=yes, + this variable can be set to a list of debug options, which cause GLib + to print out different types of debugging information. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

fatal_warnings

Causes GLib to abort the program at the first call + to g_warning() or + g_critical(). This option is + special in that it doesn't require GLib to be configured with + debugging support.

fatal_criticals

Causes GLib to abort the program at the first call + to g_critical(). This option is + special in that it doesn't require GLib to be configured with + debugging support.

gc-friendly

+ Newly allocated memory that isn't directly initialized, as well + as memory being freed will be reset to 0. The point here is to + allow memory checkers and similar programs that use bohem GC alike + algorithms to produce more accurate results. + This option is special in that it doesn't require GLib to be + configured with debugging support. +

resident-modules

+ All modules loaded by GModule will be made resident. This can be useful + for tracking memory leaks in modules which are later unloaded; but it can + also hide bugs where code is accessed after the module would have normally + been unloaded. + This option is special in that it doesn't require GLib to be + configured with debugging support. +

bind-now-modules

+ All modules loaded by GModule will bind their symbols at load time, even + when the code uses %G_MODULE_BIND_LAZY. + This option is special in that it doesn't require GLib to be + configured with debugging support. +

+

+ The special value all can be used to turn on all debug options. + The special value help can be used to print all available options. +

+

G_SLICE.  + This environment variable allows reconfiguration of the GSlice + memory allocator. +

+
++ + + + + + + + + + +

always-malloc

+ This will cause all slices allocated through g_slice_alloc() and + released by g_slice_free1() to be actually allocated via direct + calls to g_malloc() and g_free(). + This is most useful for memory checkers and similar programs that + use Bohem GC alike algorithms to produce more accurate results. + It can also be in conjunction with debugging features of the system's + malloc implementation such as glibc's MALLOC_CHECK_=2 to debug + erroneous slice allocation code, allthough debug-blocks + usually is a better suited debugging tool. +

debug-blocks

+

+ Using this option (present since GLib-2.13) engages extra code + which performs sanity checks on the released memory slices. + Invalid slice adresses or slice sizes will be reported and lead to + a program halt. + This option is for debugging scenarios. + In particular, client packages sporting their own test suite should + always enable this option when running tests. + Global slice validation is ensured by storing size and address information + for each allocated chunk, and maintaining a global hash table of that data. + That way, multi-thread scalability is given up, and memory consumption is + increased. However, the resulting code usually performs acceptably well, + possibly better than with comparable memory checking carried out using + external tools. An example of a memory corruption scenario that cannot be + reproduced with G_SLICE=always-malloc, but will be caught + by G_SLICE=debug-blocks is as follows: +

+
+		    void *slist = g_slist_alloc(); /* void* gives up type-safety */
+		    g_list_free (slist);           /* corruption: sizeof (GSList) != sizeof (GList) */
+		  
+

+

+
+

+ The special value all can be used to turn on all options. + The special value help can be used to print all available options. +

+

G_RANDOM_VERSION.  + If this environment variable is set to '2.0', the outdated + pseudo-random number seeding and generation algorithms from + GLib-2.0 are used instead of the new better ones. Use the GLib-2.0 + algorithms only if you have sequences of numbers generated with + Glib-2.0 that you need to reproduce exactly. +

+

LIBCHARSET_ALIAS_DIR.  + Allows to specify a nonstandard location for the + charset.aliases file that is used by the + character set conversion routines. The default location is the + libdir specified at compilation time. +

+
+
+
+

Locale

+

+A number of interfaces in GLib depend on the current locale in which +an application is running. Therefore, most GLib-using applications should +call setlocale (LC_ALL, "") to set up the current +locale. +

+

+On Windows, in a C program there are several locale concepts +that not necessarily are synchronized. On one hand, there is the +system default ANSI code-page, which determines what encoding is used +for file names handled by the C library's functions and the Win32 +API. (We are talking about the "narrow" functions here that take +character pointers, not the "wide" ones.) +

+

+On the other hand, there is the C library's current locale. The +character set (code-page) used by that is not necessarily the same as +the system default ANSI code-page. Strings in this character set are +returned by functions like strftime(). +

+
+
+
+

Traps and traces

+

+ + + +Some code portions contain trap variables that can be set during debugging +time if GLib has been configured with --enable-debug=yes. +Such traps lead to immediate code halts to examine the current program state +and backtrace. +

+

+Currently, the following trap variables exist: +

+
+static volatile gulong g_trap_free_size;
+static volatile gulong g_trap_realloc_size;
+static volatile gulong g_trap_malloc_size;
+
+

+If set to a size > 0, g_free(), +g_realloc() and +g_malloc() will be intercepted if the size +matches the size of the corresponding memory block. This will only work with +g_mem_set_vtable (glib_mem_profiler_table) upon startup +though, because memory profiling is required to match on the memory block sizes. +

+

+Note that many modern debuggers support conditional breakpoints, which achieve +pretty much the same. E.g. in gdb, you can do +

+
+break g_malloc
+condition 1 n_bytes == 20
+
+

+to break only on g_malloc() calls where the size of the allocated memory block +is 20. +

+
+
+
+

Gdb debugging macros

+

+glib ships with a set of python macros for the gdb debugger. These includes pretty +printers for lists, hashtables and gobject types. It also has a backtrace filter +that makes backtraces with signal emissions easier to read. +

+

+To use this you need a recent enough gdb that supports python scripting. Gdb 7.0 +should be recent enough, but branches of the "archer" gdb tree as used in Fedora 11 +and Fedora 12 should work too. You then need to install glib in the same prefix as +gdb so that the python gdb autoloaded files get installed in the right place for +gdb to pick up. +

+

+General pretty printing should just happen without having to do anything special. +To get the signal emission filtered backtrace you must use the "new-backtrace" command +instead of the standard one. +

+

+There is also a new command called gforeach that can be used to apply a command +on each item in a list. E.g. you can do +

+
+gforeach i in some_list_variable: print *(GtkWidget *)l
+
+

+Which would print the contents of each widget in a list of widgets. +

+
+
+
+

Memory statistics

+

+g_mem_profile() will output a summary g_malloc() memory usage, if memory +profiling has been enabled by calling +g_mem_set_vtable (glib_mem_profiler_table) upon startup. +

+

+If GLib has been configured with --enable-debug=yes, +then g_slice_debug_tree_statistics() can be called in a debugger to +output details about the memory usage of the slice allocator. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib-utilities.html b/docs/reference/glib/html/glib-utilities.html new file mode 100644 index 0000000..f3c9ea7 --- /dev/null +++ b/docs/reference/glib/html/glib-utilities.html @@ -0,0 +1,132 @@ + + + + +GLib Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GLib Utilities

+
+
+String Utility Functions — various string-related functions +
+
+Character Set Conversion — convert strings between different character sets using iconv() +
+
+Unicode Manipulation — functions operating on Unicode characters and UTF-8 strings +
+
+Base64 Encoding — encodes and decodes data in Base64 format +
+
+Data Checksums — Computes the checksum for data +
+
+Internationalization — gettext support macros +
+
+Date and Time Functions — calendrical calculations and miscellaneous time stuff +
+
+Random Numbers — pseudo-random number generator +
+
+Hook Functions — support for manipulating lists of hook functions +
+
+Miscellaneous Utility Functions — a selection of portable utility functions +
+
+Lexical Scanner — a general purpose lexical scanner +
+
+Automatic String Completion — support for automatic completion using a group + of target strings +
+
+Timers — keep track of elapsed time +
+
+Spawning Processes — process launching +
+
+File Utilities — various file-related functions +
+
+URI Functions — URI Functions +
+
+Hostname Utilities — Internet hostname utilities +
+
+Shell-related Utilities — shell-like commandline handling +
+
+Commandline option parser — parses commandline options +
+
+Glob-style pattern matching — matches strings against patterns containing '*' + (wildcard) and '?' (joker) +
+
+Perl-compatible regular expressions — matches strings against regular expressions +
+
+Simple XML Subset Parser — parses a subset of XML +
+
+Key-value file parser — parses .ini-like config files +
+
+Bookmark file parser — parses files containing bookmarks +
+
+Testing — a test framework +
+
+Windows Compatibility Functions — UNIX emulation on Windows +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/glib.devhelp b/docs/reference/glib/html/glib.devhelp new file mode 100644 index 0000000..d14da5f --- /dev/null +++ b/docs/reference/glib/html/glib.devhelp @@ -0,0 +1,2084 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/glib/html/glib.devhelp2 b/docs/reference/glib/html/glib.devhelp2 new file mode 100644 index 0000000..2ba1240 --- /dev/null +++ b/docs/reference/glib/html/glib.devhelp2 @@ -0,0 +1,2556 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/glib/html/glib.html b/docs/reference/glib/html/glib.html new file mode 100644 index 0000000..ddd77d7 --- /dev/null +++ b/docs/reference/glib/html/glib.html @@ -0,0 +1,100 @@ + + + + +GLib Overview + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GLib Overview

+
+
+Compiling the GLib package — +How to compile GLib itself + +
+
+Cross-compiling the GLib package — +How to cross-compile GLib + +
+
+Compiling GLib Applications — +How to compile your GLib application + +
+
+Running GLib Applications — +How to run and debug your GLib application + +
+
+Changes to GLib — +Incompatible changes made between successing versions of GLib + +
+
+Regular expression syntax — +Syntax and semantics of the regular expressions supported by GRegex + +
+
+Mailing lists and bug reports — +Getting help with GLib + +
+
+

+GLib is a general-purpose utility library, which provides many useful data +types, macros, type conversions, string utilities, file utilities, a main +loop abstraction, and so on. It works on many UNIX-like platforms, Windows, +OS/2 and BeOS. GLib is released under the GNU Library General Public License +(GNU LGPL). +

+

+The general policy of GLib is that all functions are invisibly threadsafe with the +exception of data structure manipulation functions, where, if you have two threads +manipulating the same data structure, they must use a lock to +synchronize their operation. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/gtester-report.html b/docs/reference/glib/html/gtester-report.html new file mode 100644 index 0000000..46b4926 --- /dev/null +++ b/docs/reference/glib/html/gtester-report.html @@ -0,0 +1,92 @@ + + + + +gtester-report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gtester-report

+

gtester-report — test report formatting utility

+
+
+

Synopsis

+

gtester-report [option...] [gtester-log]

+
+
+

Description

+

gtester-report is a script which converts +the XML output generated by gtester into HTML. +

+
+

Options

+
++ + + + + + + + + + +

-h, --help

+print help and exit +

-v, --version

+print version information and exit +

+
+
+
+

See also

+

+gtester(1) +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/gtester.html b/docs/reference/glib/html/gtester.html new file mode 100644 index 0000000..097a5f7 --- /dev/null +++ b/docs/reference/glib/html/gtester.html @@ -0,0 +1,151 @@ + + + + +gtester + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gtester

+

gtester — test running utility

+
+
+

Synopsis

+

gtester [option...] [testprogram]

+
+
+

Description

+

gtester is a utility to run unit tests that have +been written using the GLib test framework. +

+

+When called with the -o option, gtester +writes an XML report of the test results, which can be converted +into HTML using the gtester-report utility. +

+
+

Options

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

-h, --help

+print help and exit +

-v, --version

+print version information and exit +

--g-fatal-warnings

+make warnings fatal +

-k, --keep-going

+continue running after tests failed +

-l

+list paths of available test cases +

-m=MODE

+run test cases in MODE, which can be perf, slow, thorough or quick. The default mode is quick. +

-p=TESTPATH

+only run test cases matching TESTPATH +

--seed=SEEDSTRING

+run all test cases with random number seed SEEDSTRING +

-o=LOGFILE

+write the test log to LOGFILE +

-q, --quiet

+suppress per test binary output +

--verbose

+report success per testcase +

+
+
+
+

See also

+

+gtester-report(1) +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/gvariant-format-strings.html b/docs/reference/glib/html/gvariant-format-strings.html new file mode 100644 index 0000000..71b21ae --- /dev/null +++ b/docs/reference/glib/html/gvariant-format-strings.html @@ -0,0 +1,947 @@ + + + + +GVariant Format Strings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Variable Argument Conversions

+

+ This page attempts to document how to perform variable argument conversions with GVariant. +

+

+ Conversions occur according to format strings. A format string is a two-way mapping between a single + GVariant value and one or more C values. +

+

+ A conversion from C values into a GVariant value is made using the + g_variant_new() function. A conversion from a + GVariant into C values is made using the + g_variant_get() function. +

+
+
+

Syntax

+

+ This section exhaustively describes all possibilities for GVariant format strings. There are no valid forms of + format strings other than those described here. Please note that the format string syntax is likely to expand in the + future. +

+

+ Valid format strings have one of the following forms: +

+
    +
  • any type string

  • +
  • + a type string prefixed with a '@' +

  • +
  • + '&s' '&o', '&g', '^as', + '^ao', '^ag', '^a&s', '^a&o' or + '^a&g' +

  • +
  • + any format string, prefixed with an 'm' +

  • +
  • + a sequence of zero or more format strings strings, concatenated and enclosed in parentheses +

  • +
  • + an opening brace, followed by two format strings, followed by a closing brace (subject to the constraint that the + first format string correspond to a type valid for use as the key type of a dictionary) +

  • +
+
+
+

Symbols

+

+ The following table describes the rough meaning of symbols that may appear inside a GVariant format string. Each + symbol is described in detail in its own section, including usage examples. +

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Symbol +

+
+

+ Meaning +

+
+

+ + b, y, n, q, i, + u, x, t, h, d + +

+
+

+ Used for building or deconstructing boolean, byte and numeric types. See + Numeric Types below. +

+
+

+ + s, o, g + +

+
+

+ Used for building or deconstructing string types. See + Strings below. +

+
+

+ v +

+
+

+ Used for building or deconstructing variant types. See + Variants below. +

+
+

+ + a + +

+
+

+ Used for building or deconstructing arrays. See + Arrays below. +

+
+

+ + m + +

+
+

+ Used for building or deconstructing maybe types. See + Maybe Types below. +

+
+

+ + () + +

+
+

+ Used for building or deconstructing tuples. See + Tuples below. +

+
+

+ + {} + +

+
+

+ Used for building or deconstructing dictionary entries. See + Dictionaries below. +

+
+

+ + @ + +

+
+

+ Used as a prefix on a GVariant type string (not format string). Denotes that a pointer to a + GVariant should be used in place of the normal C type or types. For + g_variant_new() this means that you must pass a + non-NULL (GVariant + *). For g_variant_get() this means that you + must pass a pointer to a (GVariant *) for the value to be returned + by reference or NULL to ignore the value. See + GVariant * below. +

+
+

+ + *, ?, r + +

+
+

+ Exactly equivalent to @*, @? and @r. Provided only for + completeness so that all GVariant type strings can be used also as format strings. See GVariant * below. +

+
+

+ & +

+
+

+ Used as a prefix on a GVariant type string (not format string). Denotes that a C pointer to serialised data + should be used in place of the normal C type. See + Pointers below. +

+
+

+ ^ +

+
+

+ Used as a prefix on some specific types of format strings. See + Convenience Conversions below. +

+
+
+

Numeric Types

+

+ + Characters: b, y, n, q, + i, u, x, t, h, + d + +

+

+ Variable argument conversions from numeric types work in the most obvious way possible. Upon encountering one of + these characters, g_variant_new() takes the equivalent C + type as an argument. g_variant_get() takes a pointer to + the equivalent C type (or NULL to ignore the value). +

+

+ The equivalent C types are as follows: +

+
++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ Character +

+
+

+ Equivalent C type +

+
+

+ + b + +

+
+

+ gboolean +

+
+

+ + y + +

+
+

+ guchar +

+
+

+ + n + +

+
+

+ gint16 +

+
+

+ + q + +

+
+

+ guint16 +

+
+

+ + i + +

+
+

+ gint32 +

+
+

+ + u + +

+
+

+ guint32 +

+
+

+ + x + +

+
+

+ gint64 +

+
+

+ + t + +

+
+

+ guint64 +

+
+

+ + h + +

+
+

+ gint32 +

+
+

+ + d + +

+
+

+ gdouble +

+
+

+ Note that in C, small integer types in variable argument lists are promoted up to int or unsigned int as appropriate, and + read back accordingly. int is 32 bits on every platform on which GLib is + currently suported. This means that you can use C expressions of type int + with g_variant_new() and format characters + 'b', 'y', 'n', 'q', + 'i', 'u' and 'h'. Specifically, you can use integer + literals with these characters. +

+

+ When using the 'x' and 't' characters, you must ensure that the value that you + provide is 64 bit. This means that you should use a cast or make use of the + G_GINT64_CONSTANT or + G_GUINT64_CONSTANT macros. +

+

+ No type promotion occurs when using g_variant_get() since + it operates with pointers. The pointers must always point to a memory region of exactly the correct size. +

+
+

Examples

+
+GVariant *value1, *value2, *value3, *value4;
+
+value1 = g_variant_new ("y", 200);
+value2 = g_variant_new ("b", TRUE);
+value3 = g_variant_new ("d", 37.5):
+value4 = g_variant_new ("x", G_GINT64_CONSTANT (998877665544332211));
+
+{
+  gdouble floating;
+  gboolean truth;
+  gint64 bignum;
+
+
+  g_variant_get (value1, "y", NULL);      /* ignore the value. */
+  g_variant_get (value2, "b", &truth);
+  g_variant_get (value3, "d", &floating);
+  g_variant_get (value4, "x", &bignum);
+}
+
+
+
+
+

Strings

+

+ + Characters: s, o, g + +

+

+ String conversions occur to and from standard nul-terminated C strings. Upon encountering an + 's', 'o' or 'g' in a format string, + g_variant_new() takes a (const + gchar *) and makes a copy of it. + NULL is not a valid string. If the 'o' or + 'g' characters are used, care must be taken to ensure that the passed string is a valid DBus + object path or DBus type signature, respectively. +

+

+ Upon encounting 's', 'o' or 'g', g_variant_get() takes a pointer to a + (gchar *) (ie: (gchar **)) and + sets it to a newly-allocated copy of the string. It is appropriate to free this copy using + g_free(). + NULL may also be passed to indicate that the value of the + string should be ignored (in which case no copy is made). +

+
+

Examples

+
+GVariant *value1, *value2, *value3;
+
+value1 = g_variant_new ("s", "hello world!");
+value2 = g_variant_new ("o", "/must/be/a/valid/path");
+value3 = g_variant_new ("g", "iias");
+
+#if 0
+  g_variant_new ("s", NULL);      /* not valid: NULL is not a string. */
+#endif
+
+{
+  gchar *result;
+
+  g_variant_get (value1, "s", &result);
+  g_print ("It was '%s'\n", result);
+  g_free (result);
+}
+
+
+
+
+

Variants

+

+ + Characters: v + +

+

+ Upon encountering a 'v', + g_variant_new() takes a (GVariant *). The value of the + GVariant is used as the contents of the variant value. +

+

+ Upon encountering a 'v', g_variant_get() takes a pointer to a + (GVariant *) (ie: (GVariant **) + ). It is set to a new reference to a GVariant instance + containing the contents of the variant value. It is appropriate to free this reference using + g_variant_unref(). + NULL may also be passed to indicate that the value should be + ignored (in which case no new reference is created). +

+
+

Examples

+
+GVariant *x, *y;
+
+/* the following two lines are equivalent: */
+x = g_variant_new ("v", y);
+x = g_variant_new_variant (y);
+
+/* as are these: */
+g_variant_get (x, "v", &y);
+y = g_variant_get_variant (x);
+
+
+
+
+

Arrays

+

+ + Characters: a + +

+

+ Upon encountering an 'a' character followed by a type string, + g_variant_new() will take a + (GVariantBuilder *) that has been created as an array builder + for an array of the type given in the type string. The builder will have + g_variant_builder_end() called on it and the + result will be used as the value. As a special exception, if the given type string is a definite type, then + NULL may be given to mean an empty array of that type. +

+

+ Upon encountering an 'a' character followed by a type string, + g_variant_get() will take a pointer to a + (GVariantIter *) (ie: + (GVariantIter **)). + A new heap-allocated iterator is created and returned, initialised for iterating over the elements of the array. + This iterator should be freed when you are done with it, using + g_variant_iter_unref(). + NULL may also be given to indicate that the value of the array + should be ignored. +

+
+

Examples

+
+GVariantBuilder *builder;
+GVariant *value;
+
+builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, NULL);
+g_variant_builder_add (builder, "s", "when");
+g_variant_builder_add (builder, "s", "in");
+g_variant_builder_add (builder, "s", "the");
+g_variant_builder_add (builder, "s", "course");
+value = g_variant_new ("as", builder);
+
+{
+  GVariantIter *iter;
+  gchar *str;
+
+  g_variant_get (value, "as", &iter);
+  while (g_variant_iter_loop (iter, "s", &str))
+    g_print ("%s\n");
+  g_variant_iter_unref (iter);
+}
+
+
+
+
+

Maybe Types

+

+ + Characters: m + +

+

+ Maybe types are handled in two separate ways depending on the format string that follows the + 'm'. The method that is used currently depends entirely on the character immediately following the + 'm'. +

+

+ The first way is used with format strings starting with 's', 'o', + 'g', 'v', '@', '*', + '?', 'r', '&', or '^'. In all of + these cases, for non-maybe types, g_variant_new() takes + a pointer to a non-NULL value and + g_variant_get() returns (by reference) a + non-NULL pointer. When any of these format strings are + prefixed with an 'm', the type of arguments that are collected does not change in any way, but + NULL becomes a permissable value, to indicate the Nothing case. +

+

+ The second way is used with all other format strings. For + g_variant_new() an additional + gboolean argument is collected and for + g_variant_get() an additional + (gboolean *). Following this argument, the arguments that are normally + collected for the equivalent non-maybe type will be collected. +

+

+ If FALSE is given to + g_variant_new() then the Nothing value is constructed and + the collected arguments are ignored. Otherwise (if TRUE was + given), the arguments are used in the normal way to create the Just value. +

+

+ If NULL is given to + g_variant_get() then the value is ignored. If a + non-NULL pointer is given then it is used to return by reference + whether the value was Just. In the case that the value was Just, the + gboolean will be set to + TRUE and the value will be stored in the arguments in the usual + way. In the case that the value was Nothing, the gboolean will be set to + FALSE and the arguments will be collected in the normal way + but have their values set to binary zero. +

+
+

Examples

+
+GVariant *value1, *value2, *value3, *value4, *value5, *value6;
+value1 = g_variant_new ("ms", "Hello world");
+value2 = g_variant_new ("ms", NULL);
+value3 = g_variant_new ("(m(ii)s)", TRUE, 123, 456, "Done");
+value4 = g_variant_new ("(m(ii)s)", FALSE, -1, -1, "Done");          /* both '-1' are ignored. */
+value5 = g_variant_new ("(m@(ii)s)", NULL, "Done");
+
+{
+  GVariant *contents;
+  const gchar *cstr;
+  gboolean just;
+  gint32 x, y;
+  gchar *str;
+
+  g_variant_get (value1, "ms", &str);
+  if (str != NULL)
+    g_print ("str: %s\n", str);
+  else
+    g_print ("it was null\n");
+  g_free (str);
+
+
+  g_variant_get (value2, "m&s", &cstr);
+  if (cstr != NULL)
+    g_print ("str: %s\n", cstr);
+  else
+    g_print ("it was null\n");
+  /* don't free 'cstr' */
+
+
+  /* NULL passed for the gboolean *, but two 'gint32 *' still collected */
+  g_variant_get (value3, "(m(ii)s)", NULL, NULL, NULL, &str);
+  g_print ("string is %s\n", str);
+  g_free (str);
+
+  /* note: &s used, so g_free() not needed */
+  g_variant_get (value4, "(m(ii)&s)", &just, &x, &y, &cstr);
+  if (just)
+    g_print ("it was (%d, %d)\n", x, y);
+  else
+    g_print ("it was null\n");
+  g_print ("string is %s\n", cstr);
+  /* don't free 'cstr' */
+
+
+  g_variant_get (value5, "(m*s)", &contents, NULL); /* ignore the string. */
+  if (contents != NULL)
+    {
+      g_variant_get (contents, "(ii)", &x, &y);
+      g_print ("it was (%d, %d)\n", x, y);
+      g_variant_unref (contents);
+    }
+  else
+    g_print ("it was null\n");
+}
+
+
+
+
+

Tuples

+

+ + Characters: () + +

+

+ Tuples are handled by handling each item in the tuple, in sequence. Each item is handled in the usual way. +

+
+

Examples

+
+GVariant *value1, *value2;
+
+value1 = g_variant_new ("(s(ii))", "Hello", 55, 77);
+value2 = g_variant_new ("()");
+
+{
+  gchar *string;
+  gint x, y;
+
+  g_variant_get (value1, "(s(ii))", &string, &x, &y);
+  g_print ("%s, %d, %d\n", string, x, y);
+  g_free (string);
+
+  g_variant_get (value2, "()");   /* do nothing... */
+}
+
+
+
+
+

Dictionaries

+

+ + Characters: {} + +

+

+ Dictionary entries are handled by handling first the key, then the value. Each is handled in the usual way. +

+
+

Examples

+
+GVariantBuilder *b;
+GVariant *dict;
+
+b = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, G_VARIANT_TYPE ("a{sv}"));
+g_variant_builder_add (b, "{sv}", "name", g_variant_new_string ("foo"));
+g_variant_builder_add (b, "{sv}", "timeout", g_variant_new_int32 (10));
+dict = g_variant_builder_end (b);
+
+
+
+
+

GVariant *

+

+ + Characters: @, *, ?, r + + +

+

+ Upon encountering a '@' in front of a type string, + g_variant_new() takes a + non-NULL pointer to a + GVariant and uses its value directly instead of collecting arguments to + create the value. The provided GVariant must have a type that matches the + type string following the '@'. '*' is + the same as '@*' (ie: take a GVariant of any type). + '?' is the same as '@?' (ie: take a + GVariant of any basic type). 'r' is the same as + '@r' (ie: take a GVariant of any tuple type). +

+

+ Upon encountering a '@' in front of a type string, + g_variant_get() + takes a pointer to a (GVariant *) (ie: a + (GVariant **)) and sets it to a new reference to a + GVariant containing the value (instead of deconstructing the value into + C types in the usual way). NULL can be given to ignore the + value. '*', '?' and 'r' are handled in a way analogous to + what is stated above. +

+

+ You can always use '*' as an alternative to '?', 'r' or any + use of '@'. Using the other characters where possible is recommended, however, due to the + improvements in type safety and code self-documentation. +

+
+

Examples

+
+GVariant *value1, *value2;
+
+value1 = g_variant_new ("(i@ii)", 44, g_variant_new_int32 (55), 66);
+
+/* note: consumes floating reference count on 'value1' */
+value2 = g_variant_new ("(@(iii)*)", value1, g_variant_new_string ("foo"));
+
+{
+  const gchar *string;
+  GVariant *tmp;
+  gsize length;
+  gint x, y, z;
+
+  g_variant_get (value2, "((iii)*)", &x, &y, &z, &tmp);
+  string = g_variant_get_string (tmp, &length);
+  g_print ("it is %d %d %d %s (length=%d)\n", x, y, z, string, (int) length);
+  g_variant_unref (tmp);
+
+  /* quick way to skip all the values in a tuple */
+  g_variant_get (value2, "(rs)", NULL, &string); /* or "(@(iii)s)" */
+  g_print ("i only got the string: %s\n", string);
+  g_free (string);
+}
+
+
+
+
+

Pointers

+

+ + Characters: & + +

+

+ The '&' character is used to indicate that serialised data should be directly exchanged via a + pointer. +

+

+ Currently, the only use for this character is when it is applied to a string (ie: '&s', + '&o' or '&g'). For + g_variant_new() this has absolutely no effect. The string + is collected and duplicated normally. For g_variant_get() + it means that instead of creating a newly allocated copy of the string, a pointer to the serialised data is + returned. This pointer should not be freed. Validity checks are performed to ensure that the string data will + always be properly nul-terminated. +

+
+

Examples

+
+{
+  const gchar *str;
+  GVariant *value;
+
+  value = g_variant_new ("&s", "hello world");
+  str = g_variant_get ("&s", &str);
+  g_print ("string is: %s\n", str);
+  /* no need to free str */
+}
+
+
+
+
+

Convenience Conversions

+

+ + Characters: ^ + +

+

+ The '^' character currently only has one purpose: to convert to and from + G_TYPE_STRV type arrays of strings. It is always used with + arrays of strings (or other string types). It has two forms. +

+
    +
  • + '^as' (or o or g) +

  • +
  • + '^a&s' (or o or g) +

  • +
+

+ When used with g_variant_new() both forms are equivalent. + A (const gchar * const *) is collected. This must be a pointer to the + array of NULL-terminated pointers to strings. This array is + converted to a GVariant instance. Copies are made, so the original + array may be freed immediately. +

+

+ When used with g_variant_get() the two forms have + different meaning. Both return a freshly allocated + NULL-terminated array of pointers to strings. In the case of + '^as', the strings are owned by the caller -- it is appropriate to free the array with + g_strfreev(). In the case of '^a&s', + a shallow copy is made; the strings themselves are embedded in the serialised data and owned by the original + GVariant instance -- it is only appropriate to free the outer array + with g_free(). +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/home.png b/docs/reference/glib/html/home.png new file mode 100644 index 0000000000000000000000000000000000000000..17003611d9df2b066afc682cbde962f3a575002d GIT binary patch literal 654 zcmV;90&)F`P)~yY zO1cF+0vxb!W?!x?K+*#62Jq)nA4q`)5S6sgX4ao{=)(Mgq+YMr)7sjak|a^9)zS!j zlk{-n29mabXYF=7SYBQx&vO8xC}MYams+hxqtO7sImhPaCf@rq;I^3!#u*2aUP)55 zT2&N90xmEJ0s&fGT~(T<3d2xYmK9C>IP*x-M@ib*+0pFm>>uW37N2Wzaq-fCnIZE9 zpb8}0+uN+KuQM2oZVHfP8U6kQdo3?>Wo2dT)WeM9So8DqhLi#T0 z-i(>mfjhvbsYV`;4sgfJ-p>G-SqJ!fjR6BQYs1h*y9xaN0l{VB;o%`08yiy@)$8@~ z2PD1gcDuiy;j1tR0v#V8OH%W)25-YKyx(j#IXO9*YWf0mb8}QG6@b@;cHxh9{t7+@ o!Yd`f8L$sLH?yBt^q3C6015TtIu@BS5dZ)H07*qoM6N<$f*igdr~m)} literal 0 HcmV?d00001 diff --git a/docs/reference/glib/html/index.html b/docs/reference/glib/html/index.html new file mode 100644 index 0000000..a3e160a --- /dev/null +++ b/docs/reference/glib/html/index.html @@ -0,0 +1,356 @@ + + + + +GLib Reference Manual + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

+ for GLib 2.24.0 + + The latest version of this documentation can be found on-line at + http://library.gnome.org/devel/glib/unstable/. +

+
+
+
+
+
GLib Overview
+
+
+Compiling the GLib package — +How to compile GLib itself + +
+
+Cross-compiling the GLib package — +How to cross-compile GLib + +
+
+Compiling GLib Applications — +How to compile your GLib application + +
+
+Running GLib Applications — +How to run and debug your GLib application + +
+
+Changes to GLib — +Incompatible changes made between successing versions of GLib + +
+
+Regular expression syntax — +Syntax and semantics of the regular expressions supported by GRegex + +
+
+Mailing lists and bug reports — +Getting help with GLib + +
+
+
GLib Fundamentals
+
+
+Version Information — Variables and functions to check the GLib version +
+
+Basic Types — standard GLib types, defined for ease-of-use and portability +
+
+Limits of Basic Types — portable method of determining the limits of the standard types +
+
+Standard Macros — commonly-used macros. +
+
+Type Conversion Macros — portably storing integers in pointer variables +
+
+Byte Order Macros — a portable way to convert between different byte orders +
+
+Numerical Definitions — mathematical constants, and floating point decomposition +
+
+Miscellaneous Macros — specialized macros which are not used often +
+
+Atomic Operations — basic atomic integer and pointer operations +
+
+
GLib Core Application Support
+
+
+The Main Event Loop — manages all available sources of events +
+
+Threads — thread abstraction; including threads, different + mutexes, conditions and thread private data +
+
+Thread Pools — pools of threads to execute work concurrently +
+
+Asynchronous Queues — asynchronous communication between threads +
+
+Dynamic Loading of Modules — portable method for dynamically loading 'plug-ins' +
+
+Memory Allocation — general memory-handling +
+
+IO Channels — portable support for using files, pipes and + sockets +
+
+Error Reporting — a system for reporting errors +
+
+Message Output and Debugging Functions — functions to output messages and help debug applications +
+
+Message Logging — versatile support for logging messages with different levels of importance +
+
+
GLib Utilities
+
+
+String Utility Functions — various string-related functions +
+
+Character Set Conversion — convert strings between different character sets using iconv() +
+
+Unicode Manipulation — functions operating on Unicode characters and UTF-8 strings +
+
+Base64 Encoding — encodes and decodes data in Base64 format +
+
+Data Checksums — Computes the checksum for data +
+
+Internationalization — gettext support macros +
+
+Date and Time Functions — calendrical calculations and miscellaneous time stuff +
+
+Random Numbers — pseudo-random number generator +
+
+Hook Functions — support for manipulating lists of hook functions +
+
+Miscellaneous Utility Functions — a selection of portable utility functions +
+
+Lexical Scanner — a general purpose lexical scanner +
+
+Automatic String Completion — support for automatic completion using a group + of target strings +
+
+Timers — keep track of elapsed time +
+
+Spawning Processes — process launching +
+
+File Utilities — various file-related functions +
+
+URI Functions — URI Functions +
+
+Hostname Utilities — Internet hostname utilities +
+
+Shell-related Utilities — shell-like commandline handling +
+
+Commandline option parser — parses commandline options +
+
+Glob-style pattern matching — matches strings against patterns containing '*' + (wildcard) and '?' (joker) +
+
+Perl-compatible regular expressions — matches strings against regular expressions +
+
+Simple XML Subset Parser — parses a subset of XML +
+
+Key-value file parser — parses .ini-like config files +
+
+Bookmark file parser — parses files containing bookmarks +
+
+Testing — a test framework +
+
+Windows Compatibility Functions — UNIX emulation on Windows +
+
+
GLib Data Types
+
+
+Memory Slices — efficient way to allocate groups of equal-sized chunks of memory +
+
+Memory Chunks — deprecated way to allocate groups of equal-sized + chunks of memory +
+
+Doubly-Linked Lists — linked lists containing integer values or + pointers to data, with the ability to iterate + over the list in both directions +
+
+Singly-Linked Lists — linked lists containing integer values or + pointers to data, limited to iterating over the + list in one direction +
+
+Double-ended Queues — double-ended queue data structure +
+
+Sequences — scalable lists +
+
+Trash Stacks — maintain a stack of unused allocated memory chunks +
+
+Hash Tables — associations between keys and values so that + given a key the value can be found quickly +
+
+Strings — text buffers which grow automatically as text is added +
+
+String Chunks — efficient storage of groups of strings +
+
+Arrays — arrays of arbitrary elements which grow + automatically as elements are added +
+
+Pointer Arrays — arrays of pointers to any type of data, which + grow automatically as new elements are added +
+
+Byte Arrays — arrays of bytes, which grow automatically as + elements are added +
+
+Balanced Binary Trees — a sorted collection of key/value pairs optimized + for searching and traversing in order +
+
+N-ary Trees — trees of data with any number of branches +
+
+Quarks — a 2-way association between a string and a + unique integer identifier +
+
+Keyed Data Lists — lists of data elements which are accessible by a + string or GQuark identifier +
+
+Datasets — associate groups of data elements with + particular memory locations +
+
+Relations and Tuples — tables of data which can be indexed on any + number of fields +
+
+Caches — caches allow sharing of complex data structures + to save resources +
+
+Memory Allocators — deprecated way to allocate chunks of memory for + GList, GSList and GNode +
+
+GVariantType — introduction to the GVariant type system +
+
+GVariant — strongly typed value datatype +
+
+GVariant Format Strings +
+
+
GLib Tools
+
+
+glib-gettextize — gettext internationalization utility +
+
+gtester — test running utility +
+
+gtester-report — test report formatting utility +
+
+
Index
+
Index of deprecated symbols
+
Index of new symbols in 2.2
+
Index of new symbols in 2.4
+
Index of new symbols in 2.6
+
Index of new symbols in 2.8
+
Index of new symbols in 2.10
+
Index of new symbols in 2.12
+
Index of new symbols in 2.14
+
Index of new symbols in 2.16
+
Index of new symbols in 2.18
+
Index of new symbols in 2.20
+
Index of new symbols in 2.22
+
Index of new symbols in 2.24
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/index.sgml b/docs/reference/glib/html/index.sgml new file mode 100644 index 0000000..a05938e --- /dev/null +++ b/docs/reference/glib/html/index.sgml @@ -0,0 +1,2718 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/glib/html/left.png b/docs/reference/glib/html/left.png new file mode 100644 index 0000000000000000000000000000000000000000..2d05b3d5b4aeec9384bbfe404bfc4ed0897051c4 GIT binary patch literal 459 zcmV;+0W|)JP)40xL?wO*>WZ(J#ML5j2<9jD6A%Q&kC}jOeEc;X{s;`zcnxLeZR6?6h#^ihmNF6NpGdilO$m<82oD9WQ|6nVv1`? z>KufRi{?QPXg;4;wroQu4?mN1Ydd@|kaQ|ZyWLK!)yi7Wb%=0{}lD)tfliHAUyWRQ+fD_;aV6j->y6!O_8bENgM)j$~<`XsWJk>%MR- z&vb3yc&=NCaty!$LP7`*CBet!5u6}`1fo$2JOYx-rUda2?7rZzcuX#vH4Q}J+;IpV z3$}btuiNiwtwl3@pHhYgF9nwy-RBLj~JR-UA# zrkhHLqNl8_uCHeVd$6>%wzs&sy1Tr+zQ4dXslmj>#(|({Knhn=08DWm3``aa2Pmt@ z!33h+-rwNi;^XAy=I7|(?Iz?Gp{dCE41&0S5=t2^>hUpuutg1DLvp zp$G#B2?j8e5a1yQhAa5>)1|<`x{dw>3{1pzAR2%L2Hq)1u%QtJi~uqvcz2-y%?biC zZNwEI<<1HY3@F6)WKDqu1H3pGxpdh(0rC(S@B&J}0&W5fBr9UIiW7-me*!!3Q7i#^ zw;~QvV?asH2?`V@STJ(Hns)=1(sa;n080Qxh#Zk87TDRs7RY)Ur2*wL08e^QFfgG2 zWh50O{+-bGrC`j6eQ69mdJ@bFP#Zjq*kI%p&!9QC&deEhf=ZS#ybTSjbYb6-PFvuc zR|1ov5)>z|{W7S<*!S9T5sCpgZ&KEGW=AC4LW2eqvQ|K#z!5*co&yku4x50^3)`=6 zim#1+p|TkQAa}qRvQ{fl0saBl69^PBRRK>ZRD>D{JQ0OGK`elr6aC4DU4>%VXJH0v z$U*=Emu*;!hQ*L5B5e~$b|Nh%2Gb%S6WS3FMbEAH%8M_!!IS{5(RBxoeiVmC0Y6BH zK>+yKC<%}iB)~urNg!|&1_%lWK$Z6xfEFE0^3eq%$|=c7mzgEw009aNV1OkXScyb; zbC8M08;2YwCL#%JMuD81G4!N98MxWZAAH`C|OS}MQ*f-G3d7d=a9HRDUswc{jO0d&;V19}z^&j6U%APNCfMzYxfX=EZm zHxqCp%3lrc3Q;$+{&XWOv4S1Dtg-+ki$IN<7D8MQPaZIAsSG6ufCCFGz|xZ@N%|%c zT5a`&L=LD29=qTo=GgTYW2ErB4?@16&5foQbqI3hR+HV4fLG| zGU2EI6dU*Po*{oCoS-gaZMVAWx~WxNHNUW3ya<4;MjiZV7Sz9IU#DZJ0w7L7+grpf z!q$CGdUw_SmD}CZ01AN!x!;mg5U&r8Dk=uK21Jxp--(OmMm!5J;P?ki3-?22RJVGy z-E><+^yi?DfZzclnf?X2X%4W!d#(Q@Ks=bt9zyLL;;UXJm|x!4JqiFX1CzrCk$O~e9+9I}$9PkfX z`4|2Ju4sZI%I^u~k--C8BSm1m@BvjcA{YCRCL>krS}R;533{-=7z99uWyD1RJXXXQ z*eMbZblMYZ5T+UIv5zWa?rrw6Z3^7VrQ{hS8MTBn36Yc?chPuLuipzyUx>&Q3^$ zo$bs6h>WKI@~kPIuCSN6@L8u40>v*$xhFqMF_&2m)DV^-V;~)%KxrOS5SFRtL;mLw z#R*7AWmKH#CM+{bjRvBk96bOUJ*tVGbd;okAXhijG*XmG0xBnU=^v2iMwvnarZz=H zMRSS>uJBZ+KKf}PI4V@2O0=kBASzN1q12`FAp!n$DnbP+RXdRDs8wY{DYIIK*>Lp` zfz#zzaS+zAUILb8{lZq$s;#%N^$V7<+;~P=_!f~*&BMhA{vcSy7{DTl zLc(93bfr{0Ng>ZQ&QS6aMhPs@yDG2@IFGx5h{%-;qyh|Nc>|N^Kn6;;m(rFH=Sy1*qHKrIpSY9VFTHoy%o762@a z1m{fP0Eolv2duK-5va4d8+ez1(qtSf=@tlafC@LJqRs<6BmkRj=@P`GfPIdNzMzOm z7#X0D9-r&N>e)kFn)KZhxV6L{-~w`w5SZ80W{s_}1BYmdGdlud3QGe>$k1I6{M63Z%1LX+288u(hJ=uE7 zfG;LMm*Zw#Yj^{|-|&uzv^~(Y)*Ac;d4{)uAAX2RJo|7I2kWHqOQ(!a_1SOsxFJHW zXCjGQ14;hZ?tABjc=>{#2lPVZYQaY@ zx*!;^@xuOG=@9MtWN8j{LJ0l1Dz7>qlI~iIYdsK5C$GuB9*D8KcH(3Qgpf#E)3o=& zYg{>(uk+OPi6=;C8y`JT4>V98=1JzxTLSM{GB9VSkN5Dnxaqrb2P4b3Rj%mjnR}eR39At z`M&tW5syVzjOg;=Ix!OJ`&y*xydoO@DdhhM*#7b+xfP>-DfDlMj`Jq@nZkdIk$9#6 zfQ8|Inj(PiM1btje!75q3CMs%A%UKtcf??Uq(OnUpn!vbfxzH_zafD^6$YNt7)^Hq z94H7N=nE_O6WQS;t0z*jQvq5c2I|orHONH9(1N_cgBuYag7P5-5LGpxOO&H48psJg zs0&M2AEC1~mZ37b;sHk(N5{~FxPXPm0E93BA@FAcP(g)S2m&dH47U(mDKLh_z=hQz z5!Iqw@{>Fsvj?$~5^A#!f#Vd!1|@N*6*VOwB1ANs@hTHghqJO78-y#MR)%Va0x$?) zMdN@q@FYv9hA#4ir(q9d(Jm>o22TX_FfoBE z>|!O{;1u#gFXM7AJi~~8P>E(zGE`*;RTu)62n=k90RmDt>N0vGb26#8J$6Gb&!HX` z0R(LFGi}B)Fq0hXK{JDugqz@t74Ro{FpL)gG{>k|fEF`SSS>W+CiZX{%moov;wDdU z6W6FanZrBls5Ohli$P*)7-5cOK#)|3j+jU#M58${_7V4k74^uDfufJvlR10C8Kwu2 zeISma<1|+yE7sr$iKs~wAuD&dC%4sI0hAIUc_p_(l5N%z&t;I5f{+|=gilh9_pnDm zU{LsDCSDbheKI@ulRZ|lIh_;!jMV{-n!u4?p&u3$4+XGCED;hu5sITIbf$=krx=xX zL6v|pgfvkuGm$)|W|M6K6G5SBZt@q`HVkgU7pYJ#nd2ruaA(`Nk3YGOi0oY|tnHv>62R!UXSFiD;Pt#IYGO z=3DzHbbMh2fLARGFfS3YCPS1Lw;_dhbXySuGr<|0yJIE$!vOvBjjx%8-QgxrB0Ue8 zce}ZVL`jjBIh?3*FA@HtY`kefEHN|_#42ht3Lt_jX;umUpgeaGh$8V6OrsDVG?n(* zL0<4d4KhMNK!otYl%^q&nI#?gGGO{>FVDD-4uXvCX)Y%L)@dRhu zT?P^bMKGo)fTg`4fR#B1Z8Q`O0(lfNo?s}Sj1frqLZIfyH2FCJ{Ru)(;4Ql71V2!q z3`S;7GlTDWe*Skh0}528br49h$pPy3fpZX~C(xQcS~1zD12Yi`Pge|jDmN;4Hq93r zw<@crI;$_htGiHqh#?h{xDdm-0)0w(zPby%7egBXe8_nW1{emPx^{hlfIy>qwwJBi zx~<&Wt*;lY#9*yv@Tz_QuB2xp_D32ucdkmpey-CIs>-gR(S74rul7oQ!zQml^L*kr zYxnxEqHujsm#n8068xsGU_h{!1R|Y^uymlXi6jan=dg4jYG#!v(MGX#5O{M%7P!)| z8cPNo`&L1aU?D39@5WY9=rtZwtS37|TB=P}sWS!QvM-B*F>6iCbusIDvtSTidPS{1 zD+ZSL{#HOcv|}K&Y=w463kFb?SZ3F>Uof(TrIb>O17Vj~S$DNKpmT{ubzG|hjG^T zTB1_8E%3DD6>*BI0)l&7WBa%wFtKNMf|T0<7VBEAnzKi(i{Nx*fo@ z3x;c``vHUtWiQmaw1c^!HMz1YKUO<*ZQHu4t7o<=yAe^gb0w~~iw`*~RKGjA8EbHV z3uS0>8P-5qe6?IC_FFRO8i(gHlCRL#oTYwaGv>-^~bv)t~*clUGgPgV% z7Dc@;g2 zV^SdiFQzx%V zEkzm<@j7Y-dl4ZV4JhLPShk1THOeDAqeyTUr+i)DMS~*ZW+F5y;_?9T@Bp>dG!vmt zxH2_qMk{VsX1Ic8Pv8Y~RxBXP$uVqj6?~Je78`;Fqpq@(JdB|bG{s6HR#?hzz;jh( z*T2yG!%l!!N&F!!vBtg2YEgVPSZZ(iW&vfBcB563ZAK5$p=y9}#@BEgTGW4RxMVcM(-@ z9+4NZ^L6}TSy>U*@YdHF5O-tbzItZbofQ(tJ6BQxeba zU3D^-i_Z#k!cDqB5wakH+sE}zDR5ZMZB|>f0`glh1mPUA zK%Z<22vSEjFhr{z0>Is03szS)px&0dLIl1MN0GBVaoRJm*#yFICX)mIpvyM^RT-|V zF8pAi^5I~Z6`_1wHogNxWPULKx-Lk&B*5PmPHOgW!4&X($lMJPvoLQ&Eg%DnHwrBS zA}v>L<<`~526W`+y}BX(TDV9}o&k2o(y?1CmwpDRlIDTH z8tFvSUl8e_9><}9g_3mYCg3C}(Gg%=3IJXR^&}DF>#AuoUuS6{OUNms2k9c@5v(3h zP(`;oEeGmju9HLQjtDB=Z3BDs>=RWqd0`dGL*q3d`6v8UP!`#J2p1U<}3j9+l<6~ONopd)60foGKCU@+_4(Gc72 z=Yp6As>m1u zXJqirgAqg$5PhC73s2_!0DTYh@H8LsHV^(Fi0@^>On;M3A7L=GDPNT_rto|+nf0jd^&ZH>w5pd) zzw7d&6HqVh1<3(TGny9=z11Lfr`QpFLhcl>>F;2rsv|JKT;uT`=~+A%=E*j_uqKD<5m#Yot!K^{pbK%1Af5 zpPF|Ar`yl<1IC*o5!i<>2Ulbz^!_{e?1KK$&uZrn{iu#v($U{vAoxw`_!McB4B;lZ zsXD}ODcQgM5CG())ecY$8vPI}6i2c&PqgX)Vi1-N0R#gB;EuLuC7$+O>*b^DRF~5( zkw`V2&!-VOrB+SS>goqHY5`sen1v94%~G#eOdV(t1UNy_u-5HX?SRR$Ie-(t34;QF zz_6d9y_Ta8EUXZaJITpLO3O=;$EmZeA}*C3hX#ePE>qA>&pV9)gNN5w8O&MAyduOy z+=+rR-L6}X4&i}^TSi)BOwD9wr{$>AQdQ~cn}t;B>}<8?rtW6&FBDr}U2zEl2ByE< z_H%RNc$B5^di#54NlxuF{xq8cV%WY!!^Z8-H+-`Y4s^%v-MIt@$~Bbtu%bl~kpLi& zHKIWWQp03D7;w!51Ck*YNKDu=+(Hw6+7u*sU;qOE0jMQtRlos)8V>gCqlwB6Oqcq` z+4$9N00;-?7#Lu($f-OuAq-utB!Q!ek5K`9)Chp(34kFQ6ieEc7SfCeNOpLT;G>I; z9U3Gka2ElS05%sC=o^E{)B$@r94KJda5l$ygY6ZV#Vt6tBnkw3Isidq4g@w2(3$ta zXq^shHV9C1w1B8VJcE9EkpPa47`txFo$;mwo}?rMz?lNBo!*!29ao+S?wU=_r6Xg0 zCCLOhCk~jrVL+_@f;}P}h;>In0C4gad`6jmuX=lJN!}lWU%$?L@d%Tf;6SJVjPo22 zu8%hh8p-7!m|lDC~&_K@UzdG4WUV|1ep%%a6~BRx`Q)Jc#`2W zS7ta*0tIwRU;*J~5^Def(=$X5bZmI=i?XgG@vR}3B4UIVgb}ewD>7rUtpyAKpcoDk z7!Uv{CD5Qe1H;3msUJ0b@(#wvoUVYg%*;p4OTIdxj0SMxX%wuuq?3`RA|fnHHt|sa z!#?jp;L1R)D-@3k0j)qLu}CUSf)6HO2@MAfDDKO6$pWA# zoIyziJ!`=L*idWXvjjrRV3-9sHT2jNfclKwOE%j8T`Cd?fU{N_2y&K{o*+QnUzz+Y zj;T0gcOC_78fIXE3pV&*gcDYHVTKz%0K9*p*leedmYroSD0KDJ2rK=K_+yY0a&m+R zZVaUr`w;lB&;w*4&WU+LmU(7nOc0`7!cT`As!g42MOkyRzYkxf?)$404eZ532~!fVa@}dfCQb{$!{`V;ofUQ#oiZyDw; zro4Qy(sp9yjUwP2Pl15BL?TI46Gmp{vV#LwNEiYX2F^^>H6=mN3!I4=`79W*Z^*$_ zdTCy3761YP*yI4E(cJ(>=&Blk=YwVN!UH~X8q`#%2C~=|Z3OtX3+7OVWP-$*g#1^OplYKWF;+mNlca?0suRRFGM&1 literal 0 HcmV?d00001 diff --git a/docs/reference/glib/html/right.png b/docs/reference/glib/html/right.png new file mode 100644 index 0000000000000000000000000000000000000000..92832e3a4566e59d6e4092010e08d28f3be3a68d GIT binary patch literal 472 zcmV;}0Vn>6P) + + + +GLib Tools + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GLib Tools

+
+
+glib-gettextize — gettext internationalization utility +
+
+gtester — test running utility +
+
+gtester-report — test report formatting utility +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/glib/html/up.png b/docs/reference/glib/html/up.png new file mode 100644 index 0000000000000000000000000000000000000000..85b3e2a2755fece72d0d09fbf1cf28d51fa71077 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgf{4tZ81y*aK8HyIchl|5Y?Ln`LHoowrM#DT$We|~2y zm!kHPIYzBV#iFCm$l5qa=|7aUX_&jTHR3kct+f-3dJW1pZtj?HsP%l7!S0-YWnmjW zI3~>Cd4HCN^TYHBC0dz3r5|}*T3c5!K}0^NPTey!^rYo;W&eW{b1SE%dR-1ljcju- zJITo5P_e{cPDWDszO|97o#m$fni3V4d%~7^?0HU4-k!+X`e~w55Q}HA=c?CM9`EK` z^o5GF_RsnG`ey+9wOf8O4bzg>7W*;jU~M?g`OZAA$mNp|Lz<$s+~N9!2`ir8RcClo$(Q~19INM~9}j;&*|enC yGd}kJak0wj?aUKd8;%}`i}SSew>!A-2iw}^5}Rh(M>+vRkipZ{&t;ucLK6U4uc96R literal 0 HcmV?d00001 diff --git a/docs/reference/glib/mainloop-states.eps b/docs/reference/glib/mainloop-states.eps new file mode 100644 index 0000000..b3d159b --- /dev/null +++ b/docs/reference/glib/mainloop-states.eps @@ -0,0 +1,306 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: mainloop-stages.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3c +%%CreationDate: Wed Nov 29 12:23:52 2000 +%%For: otaylor@fresnel.labs.redhat.com (Owen Taylor) +%%BoundingBox: 0 0 503 291 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 291 moveto 0 0 lineto 503 0 lineto 503 291 lineto closepath clip newpath +-106.0 402.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +%%Page: 1 1 +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +/Times-Roman ff 270.00 scf sf +9300 6225 m +gs 1 -1 sc (Initial[n+1]) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 270.00 scf sf +9300 6540 m +gs 1 -1 sc (\(Recursion\)) dup sw pop 2 div neg 0 rm col0 sh gr +% Polyline +15.000 slw + [60] 0 sd +n 1905 6000 m 1800 6000 1800 6420 105 arcto 4 {pop} repeat + 1800 6525 3120 6525 105 arcto 4 {pop} repeat + 3225 6525 3225 6105 105 arcto 4 {pop} repeat + 3225 6000 1905 6000 105 arcto 4 {pop} repeat + cp gs col0 s gr [] 0 sd +% Polyline + [60] 0 sd +gs clippath +3865 5498 m 3806 5431 l 3688 5535 l 3808 5490 l 3747 5602 l cp +3184 5976 m 3243 6043 l 3361 5939 l 3242 5985 l 3302 5872 l cp +eoclip +n 3225 6000 m + 3825 5475 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 3302 5872 m 3242 5985 l 3361 5939 l 3302 5872 l cp gs 0.00 setgray ef gr col0 s +% arrowhead +n 3747 5602 m 3808 5490 l 3688 5535 l 3747 5602 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 4980 5775 m 4875 5775 4875 6270 105 arcto 4 {pop} repeat + 4875 6375 6870 6375 105 arcto 4 {pop} repeat + 6975 6375 6975 5880 105 arcto 4 {pop} repeat + 6975 5775 4980 5775 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline + [60] 0 sd +gs clippath +8457 5969 m 8515 5900 l 8394 5799 l 8458 5911 l 8337 5868 l cp +8042 5505 m 7984 5574 l 8105 5675 l 8042 5564 l 8162 5606 l cp +eoclip +n 8025 5550 m + 8475 5925 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 8162 5606 m 8042 5564 l 8105 5675 l 8162 5606 l cp gs 0.00 setgray ef gr col0 s +% arrowhead +n 8337 5868 m 8458 5911 l 8394 5799 l 8337 5868 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [60] 0 sd +n 8580 5850 m 8475 5850 8475 6570 105 arcto 4 {pop} repeat + 8475 6675 10020 6675 105 arcto 4 {pop} repeat + 10125 6675 10125 5955 105 arcto 4 {pop} repeat + 10125 5850 8580 5850 105 arcto 4 {pop} repeat + cp gs col0 s gr [] 0 sd +% Polyline +n 7155 3825 m 7050 3825 7050 4320 105 arcto 4 {pop} repeat + 7050 4425 9045 4425 105 arcto 4 {pop} repeat + 9150 4425 9150 3930 105 arcto 4 {pop} repeat + 9150 3825 7155 3825 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 5055 2100 m 4950 2100 4950 2595 105 arcto 4 {pop} repeat + 4950 2700 6945 2700 105 arcto 4 {pop} repeat + 7050 2700 7050 2205 105 arcto 4 {pop} repeat + 7050 2100 5055 2100 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 2730 3900 m 2625 3900 2625 4395 105 arcto 4 {pop} repeat + 2625 4500 4620 4500 105 arcto 4 {pop} repeat + 4725 4500 4725 4005 105 arcto 4 {pop} repeat + 4725 3900 2730 3900 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline + [60] 0 sd +n 8580 1875 m 8475 1875 8475 2295 105 arcto 4 {pop} repeat + 8475 2400 9645 2400 105 arcto 4 {pop} repeat + 9750 2400 9750 1980 105 arcto 4 {pop} repeat + 9750 1875 8580 1875 105 arcto 4 {pop} repeat + cp gs col0 s gr [] 0 sd +% Polyline + [60] 0 sd +gs clippath +8518 2419 m 8451 2358 l 8345 2474 l 8460 2416 l 8412 2534 l cp +8003 2848 m 8070 2909 l 8176 2793 l 8062 2852 l 8109 2733 l cp +eoclip +n 8047 2868 m + 8475 2400 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 8109 2733 m 8062 2852 l 8176 2793 l 8109 2733 l cp gs 0.00 setgray ef gr col0 s +% arrowhead +n 8412 2534 m 8460 2416 l 8345 2474 l 8412 2534 l cp gs 0.00 setgray ef gr col0 s +% Polyline +2 slj +gs clippath +3340 4475 m 3252 4494 l 3286 4648 l 3305 4522 l 3374 4629 l cp +eoclip +n 4875 6075 m 4874 6075 l 4872 6074 l 4868 6073 l 4861 6072 l 4852 6070 l + 4839 6067 l 4824 6064 l 4805 6059 l 4783 6054 l 4759 6048 l + 4731 6041 l 4701 6033 l 4669 6025 l 4635 6015 l 4600 6004 l + 4563 5993 l 4526 5981 l 4487 5967 l 4448 5953 l 4408 5937 l + 4367 5920 l 4326 5901 l 4284 5881 l 4241 5859 l 4198 5835 l + 4154 5809 l 4109 5781 l 4063 5749 l 4016 5715 l 3968 5678 l + 3920 5638 l 3872 5595 l 3825 5550 l 3780 5503 l 3737 5455 l + 3697 5407 l 3660 5359 l 3626 5312 l 3594 5266 l 3566 5221 l + 3540 5177 l 3516 5134 l 3494 5091 l 3474 5049 l 3455 5008 l + 3438 4967 l 3422 4927 l 3408 4888 l 3394 4849 l 3382 4812 l + 3371 4775 l 3360 4740 l 3350 4706 l 3342 4674 l 3334 4644 l + 3327 4616 l 3321 4592 l 3316 4570 l 3311 4551 l 3308 4536 l + 3305 4523 l 3303 4514 l + 3300 4500 l gs col0 s gr gr + +% arrowhead +0 slj +n 3374 4629 m 3305 4522 l 3286 4648 l 3374 4629 l cp gs 0.00 setgray ef gr col0 s +% Polyline +2 slj +gs clippath +6943 6114 m 6978 6197 l 7123 6135 l 6995 6141 l 7087 6052 l cp +eoclip +n 8475 4500 m 8475 4501 l 8475 4503 l 8475 4508 l 8475 4515 l 8474 4525 l + 8474 4538 l 8473 4553 l 8472 4573 l 8470 4594 l 8468 4619 l + 8465 4646 l 8462 4675 l 8457 4706 l 8452 4739 l 8445 4773 l + 8437 4808 l 8427 4845 l 8416 4882 l 8403 4921 l 8388 4961 l + 8370 5002 l 8350 5045 l 8326 5090 l 8299 5137 l 8268 5186 l + 8232 5237 l 8192 5290 l 8148 5345 l 8100 5400 l 8057 5445 l + 8013 5490 l 7968 5533 l 7923 5573 l 7878 5612 l 7833 5649 l + 7789 5684 l 7745 5717 l 7701 5749 l 7658 5779 l 7615 5807 l + 7573 5834 l 7531 5861 l 7489 5886 l 7447 5910 l 7407 5933 l + 7366 5955 l 7327 5977 l 7288 5997 l 7250 6017 l 7214 6035 l + 7180 6052 l 7147 6068 l 7117 6083 l 7090 6096 l 7065 6108 l + 7043 6118 l 7025 6127 l 7010 6134 l 6998 6140 l 6989 6144 l + + 6975 6150 l gs col0 s gr gr + +% arrowhead +0 slj +n 7087 6052 m 6995 6141 l 7123 6135 l 7087 6052 l cp gs 0.00 setgray ef gr col0 s +% Polyline +2 slj +gs clippath +8433 3848 m 8521 3831 l 8493 3676 l 8471 3803 l 8404 3693 l cp +eoclip +n 7050 2400 m 7051 2400 l 7054 2401 l 7058 2401 l 7066 2403 l 7076 2404 l + 7090 2407 l 7107 2410 l 7127 2414 l 7150 2418 l 7177 2424 l + 7206 2430 l 7238 2437 l 7271 2445 l 7306 2454 l 7343 2463 l + 7381 2474 l 7419 2486 l 7458 2499 l 7498 2513 l 7538 2528 l + 7579 2545 l 7621 2564 l 7663 2585 l 7706 2608 l 7750 2634 l + 7795 2662 l 7841 2694 l 7887 2728 l 7933 2766 l 7980 2807 l + 8025 2850 l 8068 2895 l 8109 2942 l 8147 2988 l 8181 3034 l + 8213 3080 l 8241 3125 l 8267 3169 l 8290 3212 l 8311 3254 l + 8330 3296 l 8347 3337 l 8362 3377 l 8376 3417 l 8389 3456 l + 8401 3494 l 8412 3532 l 8421 3569 l 8430 3604 l 8438 3637 l + 8445 3669 l 8451 3698 l 8457 3725 l 8461 3748 l 8465 3768 l + 8468 3785 l 8471 3799 l 8472 3809 l + 8475 3825 l gs col0 s gr gr + +% arrowhead +0 slj +n 8404 3693 m 8471 3803 l 8493 3676 l 8404 3693 l cp gs 0.00 setgray ef gr col0 s +% Polyline +2 slj +gs clippath +4970 2442 m 4959 2353 l 4803 2372 l 4928 2403 l 4814 2461 l cp +eoclip +n 3375 3900 m 3375 3899 l 3376 3897 l 3377 3892 l 3378 3886 l 3380 3876 l + 3383 3863 l 3386 3848 l 3391 3828 l 3396 3806 l 3402 3781 l + 3409 3753 l 3417 3722 l 3425 3689 l 3435 3655 l 3446 3619 l + 3457 3581 l 3469 3543 l 3483 3504 l 3497 3464 l 3513 3423 l + 3530 3383 l 3549 3341 l 3569 3299 l 3591 3257 l 3615 3214 l + 3641 3170 l 3669 3125 l 3701 3080 l 3735 3034 l 3772 2988 l + 3812 2941 l 3855 2895 l 3900 2850 l 3950 2804 l 4001 2762 l + 4052 2723 l 4102 2687 l 4152 2655 l 4201 2625 l 4248 2599 l + 4295 2576 l 4340 2555 l 4385 2536 l 4429 2519 l 4472 2504 l + 4515 2490 l 4557 2477 l 4598 2466 l 4638 2456 l 4677 2447 l + 4715 2439 l 4751 2432 l 4784 2426 l 4815 2420 l 4843 2415 l + 4868 2411 l 4890 2408 l 4908 2406 l 4922 2404 l 4933 2402 l + + 4950 2400 l gs col0 s gr gr + +% arrowhead +0 slj +n 4814 2461 m 4928 2403 l 4803 2372 l 4814 2461 l cp gs 0.00 setgray ef gr col0 s +/Times-Roman ff 360.00 scf sf +5925 6225 m +gs 1 -1 sc (Initial[n]) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 360.00 scf sf +8100 4275 m +gs 1 -1 sc (Dispatching) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 360.00 scf sf +3675 4350 m +gs 1 -1 sc (Prepared) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 360.00 scf sf +5925 2550 m +gs 1 -1 sc (Polling) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 270.00 scf sf +4050 3300 m +gs 1 -1 sc (query\(\)) col0 sh gr +/Times-Roman ff 270.00 scf sf +7800 3225 m +gs 1 -1 sc (check\(\)) dup sw pop neg 0 rm col0 sh gr +/Times-Roman ff 270.00 scf sf +2475 6375 m +gs 1 -1 sc (Working) dup sw pop 2 div neg 0 rm col0 sh gr +/Times-Roman ff 270.00 scf sf +3900 5400 m +gs 1 -1 sc (prepare\(\)) col0 sh gr +/Times-Roman ff 270.00 scf sf +8025 5325 m +gs 1 -1 sc (dispatch\(\)) dup sw pop neg 0 rm col0 sh gr +/Times-Roman ff 270.00 scf sf +9150 2250 m +gs 1 -1 sc (Working) dup sw pop 2 div neg 0 rm col0 sh gr +$F2psEnd +rs diff --git a/docs/reference/glib/mainloop-states.fig b/docs/reference/glib/mainloop-states.fig new file mode 100644 index 0000000..6acbedb --- /dev/null +++ b/docs/reference/glib/mainloop-states.fig @@ -0,0 +1,65 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 8625 6000 9975 6600 +4 1 0 50 0 0 18 0.0000 4 240 1290 9300 6225 Initial[n+1]\001 +4 1 0 50 0 0 18 0.0000 4 255 1335 9300 6540 (Recursion)\001 +-6 +2 4 1 2 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 3225 6525 3225 6000 1800 6000 1800 6525 3225 6525 +2 1 1 2 0 7 50 0 -1 4.000 0 0 -1 1 1 2 + 1 1 2.00 90.00 120.00 + 1 1 2.00 90.00 120.00 + 3225 6000 3825 5475 +2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 6975 6375 6975 5775 4875 5775 4875 6375 6975 6375 +2 1 1 2 0 7 50 0 -1 4.000 0 0 -1 1 1 2 + 1 1 2.00 90.00 120.00 + 1 1 2.00 90.00 120.00 + 8025 5550 8475 5925 +2 4 1 2 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 10125 6675 10125 5850 8475 5850 8475 6675 10125 6675 +2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 9150 4425 9150 3825 7050 3825 7050 4425 9150 4425 +2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 7050 2700 7050 2100 4950 2100 4950 2700 7050 2700 +2 4 0 2 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 4725 4500 4725 3900 2625 3900 2625 4500 4725 4500 +2 4 1 2 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 9750 2400 9750 1875 8475 1875 8475 2400 9750 2400 +2 1 1 2 0 7 50 0 -1 4.000 0 0 -1 1 1 2 + 1 1 2.00 90.00 120.00 + 1 1 2.00 90.00 120.00 + 8047 2868 8475 2400 +3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3 + 1 1 2.00 90.00 120.00 + 4875 6075 3825 5550 3300 4500 + 0.000 -1.000 0.000 +3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3 + 1 1 2.00 90.00 120.00 + 8475 4500 8100 5400 6975 6150 + 0.000 -1.000 0.000 +3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3 + 1 1 2.00 90.00 120.00 + 7050 2400 8025 2850 8475 3825 + 0.000 -1.000 0.000 +3 2 0 2 0 7 50 0 -1 0.000 0 1 0 3 + 1 1 2.00 90.00 120.00 + 3375 3900 3900 2850 4950 2400 + 0.000 -1.000 0.000 +4 1 0 50 0 0 24 0.0000 4 315 1290 5925 6225 Initial[n]\001 +4 1 0 50 0 0 24 0.0000 4 330 1770 8100 4275 Dispatching\001 +4 1 0 50 0 0 24 0.0000 4 330 1320 3675 4350 Prepared\001 +4 1 0 50 0 0 24 0.0000 4 330 1050 5925 2550 Polling\001 +4 0 0 50 0 0 18 0.0000 4 255 825 4050 3300 query()\001 +4 2 0 50 0 0 18 0.0000 4 255 855 7800 3225 check()\001 +4 1 0 50 0 0 18 0.0000 4 255 990 2475 6375 Working\001 +4 0 0 50 0 0 18 0.0000 4 255 1050 3900 5400 prepare()\001 +4 2 0 50 0 0 18 0.0000 4 255 1140 8025 5325 dispatch()\001 +4 1 0 50 0 0 18 0.0000 4 255 990 9150 2250 Working\001 diff --git a/docs/reference/glib/mainloop-states.gif b/docs/reference/glib/mainloop-states.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ba1a8999c5ba981c58b7d53999c6f7c0f82cd49 GIT binary patch literal 7088 zcmV;h8&Bj%Nk%w1VfXM)j$~<`XsWJk>%MR- z&vb3yc&=NCaty!$LP7`*CBet!5u6}`1fo$2JOYx-rUda2?7rZzcuX#vH4Q}J+;IpV z3$}btuiNiwtwl3@pHhYgF9nwy-RBLj~JR-UA# zrkhHLqNl8_uCHeVd$6>%wzs&sy1Tr+zQ4dXslmj>#(|({Knhn=08DWm3``aa2Pmt@ z!33h+-rwNi;^XAy=I7|(?Iz?Gp{dCE41&0S5=t2^>hUpuutg1DLvp zp$G#B2?j8e5a1yQhAa5>)1|<`x{dw>3{1pzAR2%L2Hq)1u%QtJi~uqvcz2-y%?biC zZNwEI<<1HY3@F6)WKDqu1H3pGxpdh(0rC(S@B&J}0&W5fBr9UIiW7-me*!!3Q7i#^ zw;~QvV?asH2?`V@STJ(Hns)=1(sa;n080Qxh#Zk87TDRs7RY)Ur2*wL08e^QFfgG2 zWh50O{+-bGrC`j6eQ69mdJ@bFP#Zjq*kI%p&!9QC&deEhf=ZS#ybTSjbYb6-PFvuc zR|1ov5)>z|{W7S<*!S9T5sCpgZ&KEGW=AC4LW2eqvQ|K#z!5*co&yku4x50^3)`=6 zim#1+p|TkQAa}qRvQ{fl0saBl69^PBRRK>ZRD>D{JQ0OGK`elr6aC4DU4>%VXJH0v z$U*=Emu*;!hQ*L5B5e~$b|Nh%2Gb%S6WS3FMbEAH%8M_!!IS{5(RBxoeiVmC0Y6BH zK>+yKC<%}iB)~urNg!|&1_%lWK$Z6xfEFE0^3eq%$|=c7mzgEw009aNV1OkXScyb; zbC8M08;2YwCL#%JMuD81G4!N98MxWZAAH`C|OS}MQ*f-G3d7d=a9HRDUswc{jO0d&;V19}z^&j6U%APNCfMzYxfX=EZm zHxqCp%3lrc3Q;$+{&XWOv4S1Dtg-+ki$IN<7D8MQPaZIAsSG6ufCCFGz|xZ@N%|%c zT5a`&L=LD29=qTo=GgTYW2ErB4?@16&5foQbqI3hR+HV4fLG| zGU2EI6dU*Po*{oCoS-gaZMVAWx~WxNHNUW3ya<4;MjiZV7Sz9IU#DZJ0w7L7+grpf z!q$CGdUw_SmD}CZ01AN!x!;mg5U&r8Dk=uK21Jxp--(OmMm!5J;P?ki3-?22RJVGy z-E><+^yi?DfZzclnf?X2X%4W!d#(Q@Ks=bt9zyLL;;UXJm|x!4JqiFX1CzrCk$O~e9+9I}$9PkfX z`4|2Ju4sZI%I^u~k--C8BSm1m@BvjcA{YCRCL>krS}R;533{-=7z99uWyD1RJXXXQ z*eMbZblMYZ5T+UIv5zWa?rrw6Z3^7VrQ{hS8MTBn36Yc?chPuLuipzyUx>&Q3^$ zo$bs6h>WKI@~kPIuCSN6@L8u40>v*$xhFqMF_&2m)DV^-V;~)%KxrOS5SFRtL;mLw z#R*7AWmKH#CM+{bjRvBk96bOUJ*tVGbd;okAXhijG*XmG0xBnU=^v2iMwvnarZz=H zMRSS>uJBZ+KKf}PI4V@2O0=kBASzN1q12`FAp!n$DnbP+RXdRDs8wY{DYIIK*>Lp` zfz#zzaS+zAUILb8{lZq$s;#%N^$V7<+;~P=_!f~*&BMhA{vcSy7{DTl zLc(93bfr{0Ng>ZQ&QS6aMhPs@yDG2@IFGx5h{%-;qyh|Nc>|N^Kn6;;m(rFH=Sy1*qHKrIpSY9VFTHoy%o762@a z1m{fP0Eolv2duK-5va4d8+ez1(qtSf=@tlafC@LJqRs<6BmkRj=@P`GfPIdNzMzOm z7#X0D9-r&N>e)kFn)KZhxV6L{-~w`w5SZ80W{s_}1BYmdGdlud3QGe>$k1I6{M63Z%1LX+288u(hJ=uE7 zfG;LMm*Zw#Yj^{|-|&uzv^~(Y)*Ac;d4{)uAAX2RJo|7I2kWHqOQ(!a_1SOsxFJHW zXCjGQ14;hZ?tABjc=>{#2lPVZYQaY@ zx*!;^@xuOG=@9MtWN8j{LJ0l1Dz7>qlI~iIYdsK5C$GuB9*D8KcH(3Qgpf#E)3o=& zYg{>(uk+OPi6=;C8y`JT4>V98=1JzxTLSM{GB9VSkN5Dnxaqrb2P4b3Rj%mjnR}eR39At z`M&tW5syVzjOg;=Ix!OJ`&y*xydoO@DdhhM*#7b+xfP>-DfDlMj`Jq@nZkdIk$9#6 zfQ8|Inj(PiM1btje!75q3CMs%A%UKtcf??Uq(OnUpn!vbfxzH_zafD^6$YNt7)^Hq z94H7N=nE_O6WQS;t0z*jQvq5c2I|orHONH9(1N_cgBuYag7P5-5LGpxOO&H48psJg zs0&M2AEC1~mZ37b;sHk(N5{~FxPXPm0E93BA@FAcP(g)S2m&dH47U(mDKLh_z=hQz z5!Iqw@{>Fsvj?$~5^A#!f#Vd!1|@N*6*VOwB1ANs@hTHghqJO78-y#MR)%Va0x$?) zMdN@q@FYv9hA#4ir(q9d(Jm>o22TX_FfoBE z>|!O{;1u#gFXM7AJi~~8P>E(zGE`*;RTu)62n=k90RmDt>N0vGb26#8J$6Gb&!HX` z0R(LFGi}B)Fq0hXK{JDugqz@t74Ro{FpL)gG{>k|fEF`SSS>W+CiZX{%moov;wDdU z6W6FanZrBls5Ohli$P*)7-5cOK#)|3j+jU#M58${_7V4k74^uDfufJvlR10C8Kwu2 zeISma<1|+yE7sr$iKs~wAuD&dC%4sI0hAIUc_p_(l5N%z&t;I5f{+|=gilh9_pnDm zU{LsDCSDbheKI@ulRZ|lIh_;!jMV{-n!u4?p&u3$4+XGCED;hu5sITIbf$=krx=xX zL6v|pgfvkuGm$)|W|M6K6G5SBZt@q`HVkgU7pYJ#nd2ruaA(`Nk3YGOi0oY|tnHv>62R!UXSFiD;Pt#IYGO z=3DzHbbMh2fLARGFfS3YCPS1Lw;_dhbXySuGr<|0yJIE$!vOvBjjx%8-QgxrB0Ue8 zce}ZVL`jjBIh?3*FA@HtY`kefEHN|_#42ht3Lt_jX;umUpgeaGh$8V6OrsDVG?n(* zL0<4d4KhMNK!otYl%^q&nI#?gGGO{>FVDD-4uXvCX)Y%L)@dRhu zT?P^bMKGo)fTg`4fR#B1Z8Q`O0(lfNo?s}Sj1frqLZIfyH2FCJ{Ru)(;4Ql71V2!q z3`S;7GlTDWe*Skh0}528br49h$pPy3fpZX~C(xQcS~1zD12Yi`Pge|jDmN;4Hq93r zw<@crI;$_htGiHqh#?h{xDdm-0)0w(zPby%7egBXe8_nW1{emPx^{hlfIy>qwwJBi zx~<&Wt*;lY#9*yv@Tz_QuB2xp_D32ucdkmpey-CIs>-gR(S74rul7oQ!zQml^L*kr zYxnxEqHujsm#n8068xsGU_h{!1R|Y^uymlXi6jan=dg4jYG#!v(MGX#5O{M%7P!)| z8cPNo`&L1aU?D39@5WY9=rtZwtS37|TB=P}sWS!QvM-B*F>6iCbusIDvtSTidPS{1 zD+ZSL{#HOcv|}K&Y=w463kFb?SZ3F>Uof(TrIb>O17Vj~S$DNKpmT{ubzG|hjG^T zTB1_8E%3DD6>*BI0)l&7WBa%wFtKNMf|T0<7VBEAnzKi(i{Nx*fo@ z3x;c``vHUtWiQmaw1c^!HMz1YKUO<*ZQHu4t7o<=yAe^gb0w~~iw`*~RKGjA8EbHV z3uS0>8P-5qe6?IC_FFRO8i(gHlCRL#oTYwaGv>-^~bv)t~*clUGgPgV% z7Dc@;g2 zV^SdiFQzx%V zEkzm<@j7Y-dl4ZV4JhLPShk1THOeDAqeyTUr+i)DMS~*ZW+F5y;_?9T@Bp>dG!vmt zxH2_qMk{VsX1Ic8Pv8Y~RxBXP$uVqj6?~Je78`;Fqpq@(JdB|bG{s6HR#?hzz;jh( z*T2yG!%l!!N&F!!vBtg2YEgVPSZZ(iW&vfBcB563ZAK5$p=y9}#@BEgTGW4RxMVcM(-@ z9+4NZ^L6}TSy>U*@YdHF5O-tbzItZbofQ(tJ6BQxeba zU3D^-i_Z#k!cDqB5wakH+sE}zDR5ZMZB|>f0`glh1mPUA zK%Z<22vSEjFhr{z0>Is03szS)px&0dLIl1MN0GBVaoRJm*#yFICX)mIpvyM^RT-|V zF8pAi^5I~Z6`_1wHogNxWPULKx-Lk&B*5PmPHOgW!4&X($lMJPvoLQ&Eg%DnHwrBS zA}v>L<<`~526W`+y}BX(TDV9}o&k2o(y?1CmwpDRlIDTH z8tFvSUl8e_9><}9g_3mYCg3C}(Gg%=3IJXR^&}DF>#AuoUuS6{OUNms2k9c@5v(3h zP(`;oEeGmju9HLQjtDB=Z3BDs>=RWqd0`dGL*q3d`6v8UP!`#J2p1U<}3j9+l<6~ONopd)60foGKCU@+_4(Gc72 z=Yp6As>m1u zXJqirgAqg$5PhC73s2_!0DTYh@H8LsHV^(Fi0@^>On;M3A7L=GDPNT_rto|+nf0jd^&ZH>w5pd) zzw7d&6HqVh1<3(TGny9=z11Lfr`QpFLhcl>>F;2rsv|JKT;uT`=~+A%=E*j_uqKD<5m#Yot!K^{pbK%1Af5 zpPF|Ar`yl<1IC*o5!i<>2Ulbz^!_{e?1KK$&uZrn{iu#v($U{vAoxw`_!McB4B;lZ zsXD}ODcQgM5CG())ecY$8vPI}6i2c&PqgX)Vi1-N0R#gB;EuLuC7$+O>*b^DRF~5( zkw`V2&!-VOrB+SS>goqHY5`sen1v94%~G#eOdV(t1UNy_u-5HX?SRR$Ie-(t34;QF zz_6d9y_Ta8EUXZaJITpLO3O=;$EmZeA}*C3hX#ePE>qA>&pV9)gNN5w8O&MAyduOy z+=+rR-L6}X4&i}^TSi)BOwD9wr{$>AQdQ~cn}t;B>}<8?rtW6&FBDr}U2zEl2ByE< z_H%RNc$B5^di#54NlxuF{xq8cV%WY!!^Z8-H+-`Y4s^%v-MIt@$~Bbtu%bl~kpLi& zHKIWWQp03D7;w!51Ck*YNKDu=+(Hw6+7u*sU;qOE0jMQtRlos)8V>gCqlwB6Oqcq` z+4$9N00;-?7#Lu($f-OuAq-utB!Q!ek5K`9)Chp(34kFQ6ieEc7SfCeNOpLT;G>I; z9U3Gka2ElS05%sC=o^E{)B$@r94KJda5l$ygY6ZV#Vt6tBnkw3Isidq4g@w2(3$ta zXq^shHV9C1w1B8VJcE9EkpPa47`txFo$;mwo}?rMz?lNBo!*!29ao+S?wU=_r6Xg0 zCCLOhCk~jrVL+_@f;}P}h;>In0C4gad`6jmuX=lJN!}lWU%$?L@d%Tf;6SJVjPo22 zu8%hh8p-7!m|lDC~&_K@UzdG4WUV|1ep%%a6~BRx`Q)Jc#`2W zS7ta*0tIwRU;*J~5^Def(=$X5bZmI=i?XgG@vR}3B4UIVgb}ewD>7rUtpyAKpcoDk z7!Uv{CD5Qe1H;3msUJ0b@(#wvoUVYg%*;p4OTIdxj0SMxX%wuuq?3`RA|fnHHt|sa z!#?jp;L1R)D-@3k0j)qLu}CUSf)6HO2@MAfDDKO6$pWA# zoIyziJ!`=L*idWXvjjrRV3-9sHT2jNfclKwOE%j8T`Cd?fU{N_2y&K{o*+QnUzz+Y zj;T0gcOC_78fIXE3pV&*gcDYHVTKz%0K9*p*leedmYroSD0KDJ2rK=K_+yY0a&m+R zZVaUr`w;lB&;w*4&WU+LmU(7nOc0`7!cT`As!g42MOkyRzYkxf?)$404eZ532~!fVa@}dfCQb{$!{`V;ofUQ#oiZyDw; zro4Qy(sp9yjUwP2Pl15BL?TI46Gmp{vV#LwNEiYX2F^^>H6=mN3!I4=`79W*Z^*$_ zdTCy3761YP*yI4E(cJ(>=&Blk=YwVN!UH~X8q`#%2C~=|Z3OtX3+7OVWP-$*g#1^OplYKWF;+mNlca?0suRRFGM&1 literal 0 HcmV?d00001 diff --git a/docs/reference/glib/mainloop-states.png b/docs/reference/glib/mainloop-states.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9fc9d9a46d128af43a962b5f9ca1535305c8dd GIT binary patch literal 15258 zcmXwg1yoee`#0^|(f^;msNH0i9iwFV&N_Th13Q9^ycd8&F-SL%9DW#DH31Ow< zKlpp!T(zuU*ZTa&2YircrPC-DPY{({>yDCNd!mmos|vTFfa)3-u_^IpAWnQ2k*G6s6VBm`>4|~CgrTA!r|X@$o7Ltt`=fThZn$Y^OZgRvv#L%ncj$DgT5+mRvh@~4 zcR-A=AiOUi##}@IJMv0hnJogt5WOry0f=uMW*w8BUXN2 zLKA;Zihh&)ds$0HO@$&zc_)mivUg~R*Y;>&sAlSgga{20B$NqK)qKgkjmHED9gMUv zSeq9dIpU;tRY$e>Dlsl7L-Od0G8M#B#iJZc=-1NK#I_j%kToHhkNZ{n)9$X~<`1=# zNrf`u7gau862Bgci&Kz`Zsa}sh0ti4Y_&E<2kp{JvHa-Q-Xz13dl|kkHs5t4E1RbT z#W8RlRg7a&?&R1{p*A0gC5>G{#FFbeaG)WftVAsZgo^~)buYiz%lve#n~|GDA#dMX z-_l}?wZCKT9eaa5d!kj7H_8He2N(RQHleOevl;yeiW9{Et!30bB_;s()cY>1m>x$i z{=uDydvfvNWT*c5MgRNnpX>Pxi2;gQf_Sy!W<$1$Orbp^;dnR84;b0qF4(bj3l9kH zj~rcpOpi87oELXn$8kU_!#5eO8r>K?xKmPw=GaJHah4_VFLT*b&Xm_W%<>F;kDG~E zZ+#~@VwfT_`7zVn&~R4nSpj1 z7nV};*`%At$4xI$_i}IxMaB&dPp&0j)XGuCILs1t85zHLG#~$;R+%1z*|)w5har2x+d`I(%U#V-}XTsBYZqdp3c_xxzQz)6nu&K@xr z+SQ|X&*^l@l(0mt)b~w-C$OvMhdNNo-XQ!IYLqBe7_)BRX7oifM+P^w<&ZJ-14ItW zimK!xd`>!s4v+8o*3%LvHF9B{r(bVv3?ao$u~ry0)%919S%2$8Gv8zb6VpejmyE-Ak_iNUXl{D8 z6m;pbHL!gheD9;*pY{?>^n=8WVQEdaqEB%I+=6F^;yS(MMW1L^F*m_W$T*9$C66FW z$MBr|W!N+6v0jlgu*}cf0{>vrNUa>KnFW8ui^WkF1Epm7&xh;&tN8VO+=h1(h*9@2 zux6FrxgfDC*0q8)MIU%Y!Xt*YHxnNG=K@<(b17M*T|h#}aLJyaSrZs*1NE!RU%8Yz zJas4&wp*{KNVetf9Tew4D@RxId~}&pCT3n^ZD6}-uIt!rxH7*OI?He|Y|Y%8dgDaJ zWiAP2r1jvoRG?58sKN^i853d~RKSNT3CQIsy~G_kst)RkmY%Jxp^w=(d-nI)mix>m zt(V??g8UwB@n&3SnAHqLjWW#J$p5znvcVsx$&^RVibs%kv;*V)lT@k{i=s@{wZe;& zy=NyMUDdk<5LhZ11&-gad|WQ?|0v~xjj<$FN*ivu(|sS}wo(mWF`?PIFnA6zz)kU^ zrD`d-lVO6Rgzja4>>!WSpX_f=?^mn^q?yssn8=*}8Jo>nKur2aQ1-~2J<{fL)$CFOh#5SA+e@43&*WZaV-MfSB(we$B z=%~0hJSp)|Z6$j3_t>xOlK!LS)AC-o%PYT=EvLLpPGQRgPok6i)?l*d;tf=3yvS)+ zY>b}njrq?)%w)9T`f?~IOl0VZvqGF2(whSvxFrQ;)IIr_`vIJ=kl7~g6Y%|_f!gvh ziOIcppT*v-An3m3iK&vaG})nBqxMW_fS6q=^5Pp&;JdJdMI`zcX=@w|1KJ!%Ef`^&gY zkE+@fON!Hf!cka1Kg5#M>oXgstYG4~_WYAR=NdGNe_4XXoK4R>?o#L|MF*UW@!cXS z>Y{&qkvnk+PSgcgYfb&E%RTVEhvqIJIdTp^oa}a8G5abx!Ndp*akDqZx6pk*@tMtq zn#yV?J51yIEWvnKR;3*}p1J%HASy#zKQ;S^5oUqNvPnlb!*kt8mzfj$bc+k|72{l* zOi%aGZ3;e}r`*r$Fbk3PFfnxO9wN5b4&Iz>CrJEQz43ys(dc0oTex{u+On`nZ&q$h z;3EOwZZJvcq*kt)PGCJM;xC>RL zPA;+)F4OES^VqWpw4q!4n~2zJjhlm`I}L0nfm;?;wAxU{t5a((`e)UMShv%|gQr)N zpAI|VY7etW%F>4oKO(Eyg%}`e9mF&o>Q~1EA~7qINf{q}A|&TZGaGQmoUM)U zz@!7iJr@`{ntIgl72{a+d>IjIM$@QeD;e@poqCLF3ipKTb7at{V%s2xl`1IbwY8pC zd%i+VHtB5ULmKC)5LCY7EQxtT=+j?RZ<_hV7KP0Snij@ZZYqR`2FYuA9*>KpnB~dH zuA@sc)*~zo)Te!APQpEww-5WbBvLc1MYT5HL-jX={!>|s|G-jRxJFZD<{a=h{H!Vc_0eH+OM?D8iX##L zsEX zu<@X<`g4_{=K|_(-jAm@H8|u~l$Kw$rrvo)tuHC*1?_?}&yrJF3EO3h+T7s(*GkPK zV6PL}PFb9Sv!)gzvXvv_m(9N}@2pX=^iT=<0W7}UlRuBW zCCO$Om9*2*NN4_wyj=EqA^t>d+?-aA;@hF4_^Nmv)JeXRp!hki)+RZCR?KdnearB& zaq<5!?GIc9wk_`a)r!T^KNgR8y>SMB*s64v2Key2mKp%nI_t2y2kt-!0`7+_d2#(2 z$m-)~3&w4W=O6U|#X~)1Ch%JoPp=d+YnBE-$6Ctkmid zdb@H!2Uw}Mo`niJnh5l`z>S42EuCT1DqQq4Cn@|1!{5V@IW+dO6}sF|GBOXt*5DKW zQ-y1Phip-14?6WLDvD?CpM^|EVOTe+;MqQ=d^FZrL(~-+mxrN~_l@hfZ-Wc0q>}Q> zMP0L@sCweYsp~n|nXyq`s;91gOK2V;*|K`^!PpYp{klVGT{ERb9=^g7sPD}$1M1CA~pWrl8c%F^QTG<}boY%>;v+d8d&+Z-AcS4@ z3IghO5!SGWyJQ2 zoZ>tZR8>^<7{b=nnyyN1^eIN!6uneeW6iln&Px5xu*mufA$S*uwjo!kWJP!s52Nl* zQRXUQxNj#huq|k;QEQkY=`_BhG^1B*IBA!C7U1F!l2!k;bKUQ(L+)=ZblixyJ69=# zd&1N8G55%Q9%mP&fJ+d7v&j&!!cSj%*t;G4oRQbMfRw(#3QTZtKviz{@A4<@2yfXu zQcAj4VO(*a=y(Q17lo7EaPRzG4lB+$sN{J}@d$iga>y4FjYwiz*x2jv6-0!8Uh@;h zWF~S%0ZZ2)u$vHi|r7Uk}$2!E{rCTQ1A9U z&D7j2%ViF$H?9?>4uh}4nA*l99kv-5BBWu?3T^tMf5Vwp+M8H}!5^~in0^PpF)jqE z5J^H7!_5LQE2yMIowA8~tQ3n59W7raQfGAzZRmi++U|ExEz0{V?POP2ock#kSFOHL zZ;P1UK1fbKQ55y<#{SdMs~VmC=eVR!xaq^f81Dc9+*_?*C7Ec*>)I*q9kdHd20l zbqhk0JqwI)c@x#D7o6yc%!jT;fJClk!=dBC%lqfr40}5jV?*Xbdofyp$Op9!faL%( zHG-&k&=FWuF=j!73M6FJ*V@GH7FI_pPj4#D$J1`n&8ya61=)!`KdPp6@Pmr2C|YLk z9(>U$_g3^c7|E>DDUU3! ze&V{g>!nzWzPO_1HwhoFH3Ri|lYyb7>McfuwDLrXZ9wfDGl5IH3oPfQ)Ndccsa@0{ zeiwWX?iuG3K+{st6y!TPik~ceOJ8QMB$p6;)xTeX85v7wU1kE&Zc*i7taWgMQP&&K z9$`t-5UEN$IPU`B;$&Z6=7SsTj$ykd#-FU27`-w*8k9}8XkHeqCnWE9`;aSfDA+(W zamZRMy##Y&_^pD5O$qBKLQ~^1#>ujX_-MiTV9JD^hm)r5JcuS7b!jF|qr`3-m!4H4RqL&K*0K*Mhoo}i) zq)Vfktz915yQd@D(@TA1Tws^Z7EL6}ol&Cheb6*O`V4CY1F2l}JY;4wRkmqN@|cmM z4e{!Ha*eXbh46#Fg3aVf zUEo^me{*mVah$eMvq5$q{{Ak-IR@NUv1!r~#>;BZqgzp#FkF}LTWY?kr6t+!(2KOK zfW8ae%&Zb(@iWZo4%`~>(UGIKFCM7(tMGKa#9LvC+J5>n4cyGcyL&umFSDnJQfN;z zhJ8Y4`ONc=V(Kl&>qD^Tn^00tgdR=Iy$G<*6hAy;te(+mk^E!JfbvWwI`DNW^4uwX)#k( zpMLsd+dkfv2pF;R_Nkjg*p6zQA3FN%Z{4H&lW+j|sI>oOut6&}W<(&LX%uW+xT{Y` zJZQ${%?jc*Kk4fn&AnYyR^w_pDmleph~b%;ber^$9>gam4z!#0Z9}0ScD{Fhb=mf8 zrCxjfGr>;ijGod0GIoVy<4scHdE2o7Ci`7xvjvj@VuGvR`YFj8B@VMBW(fYZ!jt_4 zawGtB!%_Q?Dp)D+(~3SCd{G$=^jDT?^OAj2C`~92N%qEM?VA_*;&OR8WIZn5x2nx( ztYsDAzlC&_$+qJ^5&G^}6Y(1BgJdXAl9G(HZQYD^-Tgngqa(fGp&xsmVBQyz)& zgocAh*`F5r^`Rx668cF&t#0;;_8J+h@Tjj4I|us7QSIMjz`k!U@d=vIppNbt#!h!E z#y)alQfAFVaR>zUZ*ghFJ!D-;2wkkfAqN+H>{pzQVx#{ z_4f1IL1;`6tK0*}$0W`zNwB%eSOufAL94mfDw*V}!%OH|7H z_jNfV5VqPVePY{!_OFi<9hw=hj!3n|m}ocm(Q2aP9^6p#N1POdos9>ZJxY^TT(`Q^ zL0~2Ug|CVK=^1vT85t`Q@D-rK)$Z2R)PSbG5cecR)Yl|84?5lW=BpAA=aJoT)vW^mghS zIK9A8xzs&o5BrZCVx!+&2vDqnrZs1cIwog@pgTYTGGlm6s{9-73&;X>`CFh0)jE*s z;cG*?#1kB5!MpjNQ|B`wYd?mAjwumuC&*mrG6#?(JYJ>>zJ?@P+HtG0( ziE~F6Ly{6xmc9`i2n%3Qxch++b=-8DcuYoQ1^YeKRR${oiTf@_AsO#0< z!+)4P6+@J4lR?U4u%Q1n(LmMNOX)oPKd-WOx;JToYS5Y*=Xp>?V5!yPvKk@d*ido&`*{E1PS*UsHX}V*Q zP{bKZE}1kDwC^*NN@)|mT)fMF&o-H55!-s7U{Dblm>)R!?@kG>z(^l`^Pec!7eD-V z`9b}wLVOW>D^e5EQ6GBHVHe9Zp!DfhA|8d}3ZTfbW3pXJ3iz^l<0yd`T@|jMGKp|3 zL@oKe=vM)F$HHJi-m$zMH|itr-;h&`si-VjBEx%PTAO6%_{%=`z6+Bf=L{MFJQAw& zIX%>(c%vwfZA3X%bzbFD{V3Yd<<C1VcpK3+VRrd0U(T{Nr9WwoJ1!;)5CRK}`|9Rr-da_ApjD+;K%*1rVqf6j}F9DkA zn9c?YO;|^+&rBh?(YBHYXvNMbGqv&XSC1tgAR+$Ejm`JNlRQ;d(kDb3VLftB!#bD} zhoDHngXh+`CsmKC@vYdySKs>lkeGAbRSdgBlQ~iAU>&>xJ+%h%a21Jv2mWc>p$kiE z9r`}{?G%0sc_T{~d^95w)LDYNNuy1KKWcY5f1h!DB6MU3Z*h;unR%!&G|wp2WIy{) zb;xqWG%hyGZN4Ch@S8I3I+#Waj~EB9AnJ3d!#nr7bOx#u6}t=*L!)7Qhlwv%@r>Fp-`O}H;TnX-&Gx*j9x z59^~me_A&d7DCT{#lj7#H|x+9B*Iw*B3nMwHbd6N8GfE%{7mEGeis0`ly7jInbc#Q z@3=LWtVgi*<2@Pi*znphjBbKF?)pF|bsA}U0JPifE;8H%0AF`p=IdJ?3i%aTN-(%I zljN0dIVah9Ehj>w^)iXp#TjLJ1ePfOz)nj;u)%r;sMX?iKRz>*4V;@##xI*kLlRE4AFd!qouV zw~3J8g;k7s(BI9w1EhYa#qG+=7V7k*@gdqTXPlIqGs`65FNXDa#O#5~>pspAK7a?u z5Ov8ONL*2&6-F)TSaSH+J0`Yl8f?_Bpxp$90`f_%mLK_%o!(;CA9D=^yy7U6PPBnv99u@kR)T9|veSZf?9h07j7~r{~JC~86LmT zlRYK`>q)Q^q~Vj=`g)b)c^RLaf!J?c&3BKQk-w9citSHLH`!Y?>E*`@fTvooJl$;F$K zndGqp7|F55T8%{E@sKaO-Qy2sQemDN{;{3`q@rbXR=4&me7pgdZWkCZ8|r4#D*!3S zk;7t}Lh=*j+oT`1HrLjs@UQ#u`7D2oYHzHWDHk1tb==_!-UjJHh`1AZPG3VTx7Wx z+wVK_4+(SN7_j9+Cf{IS&=cNf0Z#p_^|DAPeEFxW-dg;KX|q=rx4G!^oEVaW;-pc7 z<8^g)^g%zF!T~GyRnqLAFv2k)i_Q*_Yab6q-bh4eW4`5bk8y08q`F4{;3%CllvVoj zYPxMDDcwdc?}p*ZY;#E3E+ediw$1 z0+Vtx+_!sS@5My9G7Sg1O}<~{;LgaAjQ!OTg5)_i8LML@(L(ZgNO8s&^D5da2H%%t ztS_2_PF{F(D9pbJ2b6(I8w#ud?K&*E_(lEn2u37cL?BOGpnv$6WXN6aPa{+$8&(+L zP(IV~MSxKRHW;X}F8i>rfHp<>3)}#C=-;{g{->w6PXZ7vA3!`_3e`nT(c?ssc8~PE zD3suWmme_{>Tr$=|8XFbyWiuISyLmD^obUTPYeJxz$RFfVWW#%Y4&V@@Bnr#@ng{O zMOzosW1OgLzzJp?EV0$ayfB>J);he}!T#I>X7*9`X0n*W%Xu&>ex^%1zaGJvtwTT|;Cc?YWU9U-Bg_?&`#o6=^Z z8!1(A!8z@|VRjKL%DVa~7W2;|UNUc^SSbNnv0oqc4P#2ktJSTZ9mFPR;Wy<7!Tbxk ziw`a^>L^4CNE4trfB}>mhA?s8A*#GRNTak*Jy7+1OBfG)zg~dFdAdYn>9xgJJHQCZ znSDH%@7iBYhk3|D&7Zbo>M;S8kKowzc=W+rCNtN=bD$z2lXJ*nW16oyB7wu#-?Vls zwhhFsAb>jxcm9&#(?NFS4rB+vKZlPd%4Oq|mw?&ZnyQqX!wAkIzU8U+*9!lgL`1Y9 zV%&8p3L3DCNPn8^SYvytFOC6+tGefTtZT8te7psC%2du;aZH4`p$^V2b-A*6Ik@1- z^ddR!DZOKRew^JNA-g>iIx697_R%z*P4OunuHyV)?~&Dr%R0qfXC`npq>(vBQin9uvgm&@gZxx%fr0(l&~KB(Knlj zVe<&}qV6}SF`-*S<~OgeQXP*Ss!9IV_m*w4t^^dGq}BAkwt$?&hTQ(9*K-#3%;)_o z+eNBQfJQM&N~CV@f%Sm>2lLz%`;NNUS0G0(=Q*Dq!naXO+%fDJV^usoF5Ll{7(_xjN-Q)!S8M2_N0PZQy(qj=;`|(4y(rGO*4THG9mKK{kc!%fuYMm)`?m zfSM?Xg=AY=RnguolFf)8JwUR7HN>B6Yw=+rlSyqHVC?UX)gK2w0$F%l_d_z!Ca+r? zoAZA;&Wc`TKmk&rC_aA-$)hu#;naR$L4#N8XPavUA|2TRpan@U-TOHaw~YpM1C=4= zx}pq{9A-2yAzlc@xz87ejFtLz8=-9!j@tC5&X-Zg>a~l|zR(rKiBjGD@iw8KL;#kU z)ikj-2REL0#yB2Ti|cImwCwrS#z`Izt4i|hs8cWk5flTD1)lnx4j9`P^iMw|KL8){ zGPAkyrq)3M$c0}bNMd>zO6RTr7CfYQYjoRcY)V#3SOw`fqlqy%*?}#3(RXbBI?nCA zcLE%6p`Twvs#+pBz!T%zr9LBz6z%PtidC9>B`(V|>> zIv0IBV^??v8ox$#^@=py*tNNYCz?{LOlYP*FkAN;aoH2}&YND zE-b6s^C_nL9=Eqk?&=mNVYI)gIKn|eC^<4>un``kJcxhv%ni12u*U2jxcQ7+hY6Ie z6brKtVa~uBY6sB|@n@EMtrNzg(I6=nIFV42+CM9rH=M>`*UQya^}FM1Show%?IlMv zwR~=k?7g!0U)iPQi?Jf4O}(?7U?NPDNjC+hoj_CKp$N)AX-s;8WWw%lc{9I!4IuC1 zjLf5G=b9qWY!Gut$_GzMk`kliP#YYn;Zdv*@4?sNww4BZ6@3RUBq~6<0_ce|dIBoC z-U{Y|&s~cJrxLaI1mT~Wf(q7c$Q5@SH-6N2Df!M`PK$@VB97v%b?E6?#`r-LnHwjj=+q%U^s*bo1|VQ_zICz?8(F6=qJ{)Wp4I zyMHA6^d9wg6pCY4k-I&MN(G)ksww}sFY`5vGQ>TGPb2ybmGC?dRi(R=GCgz$5J$~n z=)b7U!RULDpj2^ErT9l-ug(y`#ToE;yQ+mT5#z@tv)c4}F|GKl{*wdI0{d=tpQwkpI1CUP&5^wh7}Pc+xHIG6a2fgr30G#}vbtBu35 z70NR?iMp)CW`Mpfak;}hPzAy#er3pi788ND2k(B$V~HXl(Py{h{>|q&H-J#cy#%2} zz!sPl#%mH>EF?$Xd-a1Ry&YI{@^}PJgzN<&t=y^C3KO3xxQTh@qtY(p6|l)o_Kmm+ z^r|AhLCk#0&b6g7sqWwGE?)00<_Avk;K#09?%Z5WJ23`c^vGO~Z7?t1jO^c3AD0B3 zFW#U_YGk5F;TAOSB$I^J7;mO!t}kvbPJ+(f2c;Pu#syujd_MkslXu-y?sJhdf75&; zvv+fp7}Ra^U^!UmRT$4Qul9-<-0FTuIX{y&d{WHt znGxEOYM>$mV@R8#C{x(2leWOh{(Y^Lp9YiiY4A?Xja^Wtb|CDZos1U%+UTLqdu6R$ zAyJH5sV>Rq`y07ADQ0u|8QBw_yKd;%Y>kpfa>Bmd)hq9iUrcFCV)MD;maX0bjr$MK z9}xaNk>ouIKd{!*O`k<^-TH;nt;2jI6z4yI2yuPAvxqJBX@{Yu*^sJ@^2;L2m(HqB zhmN2^n>c*zNH>D@{0yvexOz|NJp=*Mmlha~nlExB&;MvIi98m^&yRkjJt5({^q1vU zRennG2tJKd@r`Go6KPMQ*T#__v!})}G;RqICt~Wq9zHM!xTV%X{w20iFHZx21j>js zTeWeDTWKS5wvcOF7<6p?UZ?>MtS9+4XQ_B04@9CK7oc&jPN>!InO5E+t+}6iU0UJlMX@q%qC*(q*w57Z&;%%}!{^3Ys`gs~HcsaRK)y!sU#8 zpq9~~@Pn8%zc@&k42FeN>y$&0qbPBJ9$Nuoz-LZq(|BS0!Ugue&+@+if~jkEdO6GcL z;Zrv#$Wv?!p>1H32(Zeg^^p#-fr0r1N;D$;xYIX0z2Y`L_JOj%il`^gAO)8msFE!O zCSDb07YpN3kt84_17dCVbAt}5;x==NNQg+%e4AI!umupuK`gRkvHGaz$fz;^!9(DH zegW&D&CdAXg+`Q0GKX9I1mTch{ALlIaEJH4N+t>loPue*GgyID;rP~}<4!s?s)OSt{FL}1f#&b7^&g^eIUmuIs-3|G=*uxIMh;Z{NA`$Px?7?~cPzEy3H{UrD4VUS)cuKd`@v*3c2hDGfQnuxnG!LTo~ZT9+#zznB7Fq z?4^JUdZ-QnZD);Gz&WMxC@98u#6y`0{v5pjGF)r3;C?%|Q##v!lM449iP9SvH0AEK z{C9g&nmr!s2+ZzxVW~K2>TjE_I%eE%-yYAcX>#$)GB$^*UZueC5mv4xestqm=)#yE zqaPrv#x^BM8YRGO07L0r=qcfXSG&^DlX}4CZi z{nQZ~Nq%jb4B7aJtD$pAkRabQ6p8-?ni*uJ-+E(xb5?@E^UEmvv%hQLVd*JH)QZ>5 zznI$RMdLcdT{Y3KX|p^Oginex)r+t)%-E+_LE01j>Z)|FO@L=WkVxnZ_nRhd`z9^m zWrQ&={*rn;e zh;Rg0J~ECiyjSGs4GZ9>X1FJVP+9{^R@3Qp=ZX%~B`d+oq{K})mn(2JHqL-q545g@ zG3~WyiHp7kewj|Q$J@>1V>Y;tkEA8&K?X_Kme*u(I&Pbs4`L9!Wm(TS+8I>X6 z)`fMZ*yVA~gO8$%T}eUkS$LRpalABhjfq#Sc^7G*%?yauk1|>mE&KT&3SVV$YHy*J zeCVZT&Q1onQFr`byl`&DOf2~Z*$K58F3&M;2g2c;$lm(AkD`pXC6>I}l6}kDQMwKL zC$1fca`&GDZChD#>E_TgrXnYY#bnUWJDPEzK+HtJqZ@F z@8y#6G&G}!vXDVmvuwH|GJ6DD_R^_h)jD@c)jWKxPQ@+Z#6v7-at*O6uA9H(@66#e zpjxSI$DJ}eU(rQB(|=faND)jngp+sjqU7VMT`0 zW(gNLM2oq!c~)=01?J1fE+0e!e2o&8nx&9EIZLtg#IY8wA1#CgT~AUj1IIqPAZ7Ln zv#B(!n@3_2Ni~VVWI|?eW&8F);FA6g2LDBbI(vB4Wb+D9(A1Gx>dv)!1pz9w`Y=Fm z=Vrp~ooZ2|qL=&($9@us#kgMp$$xSG<9plSjpu@MGD=*@g6ibeBz@nTv{wv`EKf%V?I3!VZn)55bLA#?QyBiu@@r3-Vr`a z_^XdE^{HlJ|AZDrc8_4sIB^4$>0aK+<$u!2Ge>rGQUxb&PT;19UUw;tgv+V2Ww>bC zrajpVlEA@@%^kg9Ye13`hL6>B-DOArcr>r(AreaI+fqO;g>C6Fa-2!yc=<~aofO0r zp1XzTl(ze)ox1ORIeGf6heD#Gk^x4^;uLPsbxLrHw^VchgLy?+<89K9aOWG9Z_lqAwzIdxH zIHVaj!uY)(FptSKUl9Le4VyyD=EP}1;+u=__=$_78bgR8_sVd>p>g9uGx7eZWAHt9 z8d7rZ?kgQ347085hPRb$c>dw3qI70h1M`5z^U5AYgC-m@MYw~U-i+k|k)g19c_}U4 z9v9<+9qBR&FU}UZV2RoFR#nUw9M7#PDcR_9szyZ`_aF}-!DYJK2L)YxyNU(htc|Gr z!~Jvij6pHiEExEKd>U`4hYma}38m}$N*tQq6t5IUd|vUaQTc+c^cZOIdbYQ# zhmT0to7e=eUzBlte>GRzbW;aEO>>~Rhx3Cz(S~1>hQ|-h6-$`fVd-f6LhS8oIxVw| z9CbF1I@WA)cYAD{55wYPS5AW-gwWt4!G58{xX?P+oJn7rt!qWF{f7QY87v_044YX2 z_yb>4soq2^@Jm&ecHV$^=e+GWmDb0`6$DTvMRvMgtf?6o8tw%A?h{F~F!-=i`IthX zr6BB^iTD%!ln8IDmIBbKJwNh-j6Sz4B*D&=EBT>MKviw+`p*a^H^JRav%n^-+Ixu$Zt>CUe$Kuerp~0*=?SH-7VVCdB)ekfZ%`8 zda#H`5ES>!@WYr;bhexu)qO%_zsiJsSom!a{MTLWUZP8?2I*AkGFo+FWnNw=t5R4Z zhGye~hpfy6is)JgAtE8z7x_K9G5HH1zjVQ~@t8thrL$G^Q3@W2Hv1D!jdWF_m{^$i zN;7QC3`9)^H{SXHB0jM4>lMmO@{ef5%jJ9z%vR0@wx$!35gjvwTA!&;d(TR;P`O@c zun%H~VcsP(jXL1bO}VCbHvfJSu;z~josgG6XaUhbpOR>yJM%=&To=_usLay9`o?Bg z(j14`duJM8e^GlT@}%>F6MDj3;EsNKB(xJwG$`S$`7{;26pKb&FdYQhvB;zoAgR}l_7`ee6_Nm@umf7{VcyAhcBO_7ls zxF1xWx4T+Ao`c?>Xvze62f5wgP(m}<0b`GRf?uTBt$uN$_WPtjo7@%CeqA*Ai1Vo< zoCXN@Lae1x_|TVXmNmm*3mYO*#?TH_M8oB>UzkANI=j-XKiAHB&H|Jo(eF<&z#}Y# zhZW&$an2!CA((9}r*wD1FL9dF+gHMeuFgGm9U4A_s+D^n9$kpz$OE4 zOfN5i99kTnJUm!BW^{=mT(mpSKi5@uGDLB{L9P`njg zZW>fb8#8TFljTSygHAp58{96qV(b*VIh5wLg~5}JzlV@E&w{Zr>44$-0@C>vlg6=K zEKhzCF`ojfL;sg4iFb`tWN`Gn{!V2rf zzAw?HPT+}n7hhomfNp8o(HY(~Kt-Zx0Znbj$nz{vrRkAUK+&|F&~QoIIY3cBwj z*Ev%xA~K^&n++HI8rcbcWj)v$6r}LQk-Liu%JaGv*_H*r^M;qCUyz5un_1HH)G0NJF6lX&U-}&~$va literal 0 HcmV?d00001 diff --git a/docs/reference/glib/regex-syntax.sgml b/docs/reference/glib/regex-syntax.sgml new file mode 100644 index 0000000..901b447 --- /dev/null +++ b/docs/reference/glib/regex-syntax.sgml @@ -0,0 +1,2708 @@ + + + + +Regular expression syntax + + + + + +Regular expression syntax + +Syntax and semantics of the regular expressions supported by GRegex + + + + +GRegex regular expression details + +A regular expression is a pattern that is matched against a +string from left to right. Most characters stand for themselves in a +pattern, and match the corresponding characters in the string. As a +trivial example, the pattern + + + +The quick brown fox + + + +matches a portion of a string that is identical to itself. When +caseless matching is specified (the G_REGEX_CASELESS flag), letters are +matched independently of case. + + + +The power of regular expressions comes from the ability to include +alternatives and repetitions in the pattern. These are encoded in the +pattern by the use of metacharacters, which do not stand for themselves +but instead are interpreted in some special way. + + + +There are two different sets of metacharacters: those that are recognized +anywhere in the pattern except within square brackets, and those +that are recognized in square brackets. Outside square brackets, the +metacharacters are as follows: + + + +Metacharacters outside square brackets + + + + + Character + Meaning + + + + + \ + general escape character with several uses + + + ^ + assert start of string (or line, in multiline mode) + + + $ + assert end of string (or line, in multiline mode) + + + . + match any character except newline (by default) + + + [ + start character class definition + + + | + start of alternative branch + + + ( + start subpattern + + + ) + end subpattern + + + ? + extends the meaning of (, or 0/1 quantifier, or quantifier minimizer + + + * + 0 or more quantifier + + + + + 1 or more quantifier, also "possessive quantifier" + + + { + start min/max quantifier + + + +
+ + +Part of a pattern that is in square brackets is called a "character +class". In a character class the only metacharacters are: + + + +Metacharacters inside square brackets + + + + + Character + Meaning + + + + + \ + general escape character + + + ^ + negate the class, but only if the first character + + + - + indicates character range + + + [ + POSIX character class (only if followed by POSIX syntax) + + + ] + terminates the character class + + + +
+
+ + +Backslash + +The backslash character has several uses. Firstly, if it is followed by +a non-alphanumeric character, it takes away any special meaning that +character may have. This use of backslash as an escape character +applies both inside and outside character classes. + + + +For example, if you want to match a * character, you write \* in the +pattern. This escaping action applies whether or not the following +character would otherwise be interpreted as a metacharacter, so it is +always safe to precede a non-alphanumeric with backslash to specify +that it stands for itself. In particular, if you want to match a +backslash, you write \\. + + + +If a pattern is compiled with the G_REGEX_EXTENDED +option, whitespace in the pattern (other than in a character class) and +characters between a # outside a character class and the next newline +are ignored. +An escaping backslash can be used to include a whitespace or # character +as part of the pattern. + + + +If you want to remove the special meaning from a sequence of characters, +you can do so by putting them between \Q and \E. +The \Q...\E sequence is recognized both inside and outside character +classes. + + + +Non-printing characters + +A second use of backslash provides a way of encoding non-printing +characters in patterns in a visible manner. There is no restriction on the +appearance of non-printing characters, apart from the binary zero that +terminates a pattern, but when a pattern is being prepared by text +editing, it is usually easier to use one of the following escape +sequences than the binary character it represents: + + + +Non-printing characters + + + + + Escape + Meaning + + + + + \a + alarm, that is, the BEL character (hex 07) + + + \cx + "control-x", where x is any character + + + \e + escape (hex 1B) + + + \f + formfeed (hex 0C) + + + \n + newline (hex 0A) + + + \r + carriage return (hex 0D) + + + \t + tab (hex 09) + + + \ddd + character with octal code ddd, or backreference + + + \xhh + character with hex code hh + + + \x{hhh..} + character with hex code hhh.. + + + +
+ + +The precise effect of \cx is as follows: if x is a lower case letter, +it is converted to upper case. Then bit 6 of the character (hex 40) is +inverted. Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; +becomes hex 7B. + + + +After \x, from zero to two hexadecimal digits are read (letters can be +in upper or lower case). Any number of hexadecimal digits may appear +between \x{ and }, but the value of the character code +must be less than 2**31 (that is, the maximum hexadecimal value is +7FFFFFFF). If characters other than hexadecimal digits appear between +\x{ and }, or if there is no terminating }, this form of escape is not +recognized. Instead, the initial \x will be interpreted as a basic hexadecimal +escape, with no following digits, giving a character whose +value is zero. + + + +Characters whose value is less than 256 can be defined by either of the +two syntaxes for \x. There is no difference +in the way they are handled. For example, \xdc is exactly the same as +\x{dc}. + + + +After \0 up to two further octal digits are read. If there are fewer +than two digits, just those that are present are used. +Thus the sequence \0\x\07 specifies two binary zeros followed by a BEL +character (code value 7). Make sure you supply two digits after the +initial zero if the pattern character that follows is itself an octal +digit. + + + +The handling of a backslash followed by a digit other than 0 is complicated. +Outside a character class, GRegex reads it and any following digits as a +decimal number. If the number is less than 10, or if there +have been at least that many previous capturing left parentheses in the +expression, the entire sequence is taken as a back reference. A +description of how this works is given later, following the discussion +of parenthesized subpatterns. + + + +Inside a character class, or if the decimal number is greater than 9 +and there have not been that many capturing subpatterns, GRegex re-reads +up to three octal digits following the backslash, and uses them to generate +a data character. Any subsequent digits stand for themselves. For example: + + + +Non-printing characters + + + + + Escape + Meaning + + + + + \040 + is another way of writing a space + + + \40 + is the same, provided there are fewer than 40 previous capturing subpatterns + + + \7 + is always a back reference + + + \11 + might be a back reference, or another way of writing a tab + + + \011 + is always a tab + + + \0113 + is a tab followed by the character "3" + + + \113 + might be a back reference, otherwise the character with octal code 113 + + + \377 + might be a back reference, otherwise the byte consisting entirely of 1 bits + + + \81 + is either a back reference, or a binary zero followed by the two characters "8" and "1" + + + +
+ + +Note that octal values of 100 or greater must not be introduced by a +leading zero, because no more than three octal digits are ever read. + + + +All the sequences that define a single character can be used both inside +and outside character classes. In addition, inside a character class, the +sequence \b is interpreted as the backspace character (hex 08), and the +sequences \R and \X are interpreted as the characters "R" and "X", respectively. +Outside a character class, these sequences have different meanings (see below). + +
+ + +Absolute and relative back references + +The sequence \g followed by a positive or negative number, optionally enclosed +in braces, is an absolute or relative back reference. Back references are +discussed later, following the discussion of parenthesized subpatterns. + + + + +Generic character types + + +Another use of backslash is for specifying generic character types. +The following are always recognized: + + + +Generic characters + + + + + Escape + Meaning + + + + + \d + any decimal digit + + + \D + any character that is not a decimal digit + + + \s + any whitespace character + + + \S + any character that is not a whitespace character + + + \w + any "word" character + + + \W + any "non-word" character + + + +
+ + +Each pair of escape sequences partitions the complete set of characters +into two disjoint sets. Any given character matches one, and only one, +of each pair. + + + +These character type sequences can appear both inside and outside character +classes. They each match one character of the appropriate type. +If the current matching point is at the end of the passed string, all +of them fail, since there is no character to match. + + + +For compatibility with Perl, \s does not match the VT character (code +11). This makes it different from the the POSIX "space" class. The \s +characters are HT (9), LF (10), FF (12), CR (13), and space (32). + + + +A "word" character is an underscore or any character less than 256 that +is a letter or digit. + + +Characters with values greater than 128 never match \d, +\s, or \w, and always match \D, \S, and \W. + +
+ + +Newline sequences +Outside a character class, the escape sequence \R matches any Unicode +newline sequence. +This particular group matches either the two-character sequence CR followed by +LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, +U+000B), FF (formfeed, U+000C), CR (carriage return, U+000D), NEL (next +line, U+0085), LS (line separator, U+2028), or PS (paragraph separator, U+2029). +The two-character sequence is treated as a single unit that +cannot be split. Inside a character class, \R matches the letter "R". + + + +Unicode character properties + +To support generic character types there are three additional escape +sequences, they are: + + + +Generic character types + + + + + Escape + Meaning + + + + + \p{xx} + a character with the xx property + + + \P{xx} + a character without the xx property + + + \X + an extended Unicode sequence + + + +
+ + +The property names represented by xx above are limited to the Unicode +script names, the general category properties, and "Any", which matches +any character (including newline). Other properties such as "InMusicalSymbols" +are not currently supported. Note that \P{Any} does not match any characters, +so always causes a match failure. + + + +Sets of Unicode characters are defined as belonging to certain scripts. A +character from one of these sets can be matched using a script name. For +example, \p{Greek} or \P{Han}. + + + +Those that are not part of an identified script are lumped together as +"Common". The current list of scripts is: + + + +Arabic +Armenian +Balinese +Bengali +Bopomofo +Braille +Buginese +Buhid +Canadian_Aboriginal +Cherokee +Common +Coptic +Cuneiform +Cypriot +Cyrillic +Deseret +Devanagari +Ethiopic +Georgian +Glagolitic +Gothic +Greek +Gujarati +Gurmukhi +Han +Hangul +Hanunoo +Hebrew +Hiragana +Inherited +Kannada +Katakana +Kharoshthi +Khmer +Lao +Latin +Limbu +Linear_B +Malayalam +Mongolian +Myanmar +New_Tai_Lue +Nko +Ogham +Old_Italic +Old_Persian +Oriya +Osmanya +Phags_Pa +Phoenician +Runic +Shavian +Sinhala +Syloti_Nagri +Syriac +Tagalog +Tagbanwa +Tai_Le +Tamil +Telugu +Thaana +Thai +Tibetan +Tifinagh +Ugaritic +Yi + + + +Each character has exactly one general category property, specified by a +two-letter abbreviation. For compatibility with Perl, negation can be specified +by including a circumflex between the opening brace and the property name. For +example, \p{^Lu} is the same as \P{Lu}. + + + +If only one letter is specified with \p or \P, it includes all the general +category properties that start with that letter. In this case, in the absence +of negation, the curly brackets in the escape sequence are optional; these two +examples have the same effect: + + + +\p{L} +\pL + + + +The following general category property codes are supported: + + + +Property codes + + + + + Code + Meaning + + + + + C + Other + + + Cc + Control + + + Cf + Format + + + Cn + Unassigned + + + Co + Private use + + + Cs + Surrogate + + + L + Letter + + + Ll + Lower case letter + + + Lm + Modifier letter + + + Lo + Other letter + + + Lt + Title case letter + + + Lu + Upper case letter + + + M + Mark + + + Mc + Spacing mark + + + Me + Enclosing mark + + + Mn + Non-spacing mark + + + N + Number + + + Nd + Decimal number + + + Nl + Letter number + + + No + Other number + + + P + Punctuation + + + Pc + Connector punctuation + + + Pd + Dash punctuation + + + Pe + Close punctuation + + + Pf + Final punctuation + + + Pi + Initial punctuation + + + Po + Other punctuation + + + Ps + Open punctuation + + + S + Symbol + + + Sc + Currency symbol + + + Sk + Modifier symbol + + + Sm + Mathematical symbol + + + So + Other symbol + + + Z + Separator + + + Zl + Line separator + + + Zp + Paragraph separator + + + Zs + Space separator + + + +
+ + +The special property L& is also supported: it matches a character that has +the Lu, Ll, or Lt property, in other words, a letter that is not classified as +a modifier or "other". + + + +The long synonyms for these properties that Perl supports (such as \ep{Letter}) +are not supported by GRegex, nor is it permitted to prefix any of these +properties with "Is". + + + +No character that is in the Unicode table has the Cn (unassigned) property. +Instead, this property is assumed for any code point that is not in the +Unicode table. + + + +Specifying caseless matching does not affect these escape sequences. +For example, \p{Lu} always matches only upper case letters. + + + +The \X escape matches any number of Unicode characters that form an +extended Unicode sequence. \X is equivalent to + + + +(?>\PM\pM*) + + + +That is, it matches a character without the "mark" property, followed +by zero or more characters with the "mark" property, and treats the +sequence as an atomic group (see below). Characters with the "mark" +property are typically accents that affect the preceding character. + + + +Matching characters by Unicode property is not fast, because GRegex has +to search a structure that contains data for over fifteen thousand +characters. That is why the traditional escape sequences such as \d and +\w do not use Unicode properties. + +
+ + +Simple assertions + +The final use of backslash is for certain simple assertions. An +assertion specifies a condition that has to be met at a particular point in +a match, without consuming any characters from the string. The +use of subpatterns for more complicated assertions is described below. +The backslashed assertions are: + + + +Simple assertions + + + + + Escape + Meaning + + + + + \b + matches at a word boundary + + + \B + matches when not at a word boundary + + + \A + matches at the start of the string + + + \Z + matches at the end of the string or before a newline at the end of the string + + + \z + matches only at the end of the string + + + \G + matches at first matching position in the string + + + +
+ + +These assertions may not appear in character classes (but note that \b +has a different meaning, namely the backspace character, inside a +character class). + + + +A word boundary is a position in the string where the current +character and the previous character do not both match \w or \W (i.e. +one matches \w and the other matches \W), or the start or end of the +string if the first or last character matches \w, respectively. + + + +The \A, \Z, and \z assertions differ from the traditional circumflex +and dollar (described in the next section) in that they only ever match +at the very start and end of the string, whatever options are +set. Thus, they are independent of multiline mode. These three assertions +are not affected by the G_REGEX_MATCH_NOTBOL or G_REGEX_MATCH_NOTEOL options, +which affect only the behaviour of the circumflex and dollar metacharacters. +However, if the start_position argument of a matching function is non-zero, +indicating that matching is to start at a point other than the beginning of +the string, \A can never match. The difference between \Z and \z is +that \Z matches before a newline at the end of the string as well at the +very end, whereas \z matches only at the end. + + + +The \G assertion is true only when the current matching position is at +the start point of the match, as specified by the start_position argument +to the matching functions. It differs from \A when the value of startoffset is +non-zero. + + + +Note, however, that the interpretation of \G, as the start of the +current match, is subtly different from Perl’s, which defines it as the +end of the previous match. In Perl, these can be different when the +previously matched string was empty. + + + +If all the alternatives of a pattern begin with \G, the expression is +anchored to the starting match position, and the "anchored" flag is set +in the compiled regular expression. + +
+
+ + +Circumflex and dollar + +Outside a character class, in the default matching mode, the circumflex +character is an assertion that is true only if the current matching +point is at the start of the string. If the start_position argument to +the matching functions is non-zero, circumflex can never match if the +G_REGEX_MULTILINE option is unset. Inside a character class, circumflex +has an entirely different meaning (see below). + + + +Circumflex need not be the first character of the pattern if a number +of alternatives are involved, but it should be the first thing in each +alternative in which it appears if the pattern is ever to match that +branch. If all possible alternatives start with a circumflex, that is, +if the pattern is constrained to match only at the start of the string, +it is said to be an "anchored" pattern. (There are also other +constructs that can cause a pattern to be anchored.) + + + +A dollar character is an assertion that is true only if the current +matching point is at the end of the string, or immediately +before a newline at the end of the string (by default). Dollar need not +be the last character of the pattern if a number of alternatives are +involved, but it should be the last item in any branch in which it +appears. Dollar has no special meaning in a character class. + + + +The meaning of dollar can be changed so that it matches only at the +very end of the string, by setting the G_REGEX_DOLLAR_ENDONLY option at +compile time. This does not affect the \Z assertion. + + + +The meanings of the circumflex and dollar characters are changed if the +G_REGEX_MULTILINE option is set. When this is the case, +a circumflex matches immediately after internal newlines as well as at the +start of the string. It does not match after a newline that ends the string. +A dollar matches before any newlines in the string, as well as at the very +end, when G_REGEX_MULTILINE is set. When newline is +specified as the two-character sequence CRLF, isolated CR and LF characters +do not indicate newlines. + + + +For example, the pattern /^abc$/ matches the string "def\nabc" (where +\n represents a newline) in multiline mode, but not otherwise. Consequently, +patterns that are anchored in single line mode because all branches start with +^ are not anchored in multiline mode, and a match for circumflex is possible +when the start_position argument of a matching function +is non-zero. The G_REGEX_DOLLAR_ENDONLY option is ignored +if G_REGEX_MULTILINE is set. + + + +Note that the sequences \A, \Z, and \z can be used to match the start and +end of the string in both modes, and if all branches of a pattern start with +\A it is always anchored, whether or not G_REGEX_MULTILINE +is set. + + + + +Full stop (period, dot) + +Outside a character class, a dot in the pattern matches any one character +in the string, including a non-printing character, but not (by +default) newline. In UTF-8 a character might be more than one byte long. + + + +When a line ending is defined as a single character, dot never matches that +character; when the two-character sequence CRLF is used, dot does not match CR +if it is immediately followed by LF, but otherwise it matches all characters +(including isolated CRs and LFs). When any Unicode line endings are being +recognized, dot does not match CR or LF or any of the other line ending +characters. + + + +If the G_REGEX_DOTALL flag is set, dots match newlines +as well. The handling of dot is entirely independent of the handling of circumflex +and dollar, the only relationship being that they both involve newline +characters. Dot has no special meaning in a character class. + + + +The behaviour of dot with regard to newlines can be changed. If the +G_REGEX_DOTALL option is set, a dot matches any one +character, without exception. If newline is defined as the two-character +sequence CRLF, it takes two dots to match it. + + + +The handling of dot is entirely independent of the handling of circumflex and +dollar, the only relationship being that they both involve newlines. Dot has no +special meaning in a character class. + + + + +Matching a single byte + +Outside a character class, the escape sequence \C matches any one byte, +both in and out of UTF-8 mode. Unlike a dot, it always matches any line +ending characters. +The feature is provided in Perl in order to match individual bytes in +UTF-8 mode. Because it breaks up UTF-8 characters into individual +bytes, what remains in the string may be a malformed UTF-8 string. For +this reason, the \C escape sequence is best avoided. + + + +GRegex does not allow \C to appear in lookbehind assertions (described +below), because in UTF-8 mode this would make it impossible to calculate +the length of the lookbehind. + + + + +Square brackets and character classes + +An opening square bracket introduces a character class, terminated by a +closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class, +it should be the first data character in the class (after an initial +circumflex, if present) or escaped with a backslash. + + + +A character class matches a single character in the string. A matched character +must be in the set of characters defined by the class, unless the first +character in the class definition is a circumflex, in which case the +string character must not be in the set defined by the class. If a +circumflex is actually required as a member of the class, ensure it is +not the first character, or escape it with a backslash. + + + +For example, the character class [aeiou] matches any lower case vowel, +while [^aeiou] matches any character that is not a lower case vowel. +Note that a circumflex is just a convenient notation for specifying the +characters that are in the class by enumerating those that are not. A +class that starts with a circumflex is not an assertion: it still consumes +a character from the string, and therefore it fails if the current pointer +is at the end of the string. + + + +In UTF-8 mode, characters with values greater than 255 can be included +in a class as a literal string of bytes, or by using the \x{ escaping +mechanism. + + + +When caseless matching is set, any letters in a class represent both +their upper case and lower case versions, so for example, a caseless +[aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not +match "A", whereas a caseful version would. + + + +Characters that might indicate line breaks are never treated +in any special way when matching character classes, whatever line-ending +sequence is in use, and whatever setting of the G_REGEX_DOTALL +and G_REGEX_MULTILINE options is used. A class such as [^a] +always matches one of these characters. + + + +The minus (hyphen) character can be used to specify a range of characters in +a character class. For example, [d-m] matches any letter +between d and m, inclusive. If a minus character is required in a +class, it must be escaped with a backslash or appear in a position +where it cannot be interpreted as indicating a range, typically as the +first or last character in the class. + + + +It is not possible to have the literal character "]" as the end character +of a range. A pattern such as [W-]46] is interpreted as a class of +two characters ("W" and "-") followed by a literal string "46]", so it +would match "W46]" or "-46]". However, if the "]" is escaped with a +backslash it is interpreted as the end of range, so [W-\]46] is interpreted +as a class containing a range followed by two other characters. +The octal or hexadecimal representation of "]" can also be used to end +a range. + + + +Ranges operate in the collating sequence of character values. They can +also be used for characters specified numerically, for example +[\000-\037]. In UTF-8 mode, ranges can include characters whose values +are greater than 255, for example [\x{100}-\x{2ff}]. + + + +The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear +in a character class, and add the characters that they match to the +class. For example, [\dABCDEF] matches any hexadecimal digit. A +circumflex can conveniently be used with the upper case character types to +specify a more restricted set of characters than the matching lower +case type. For example, the class [^\W_] matches any letter or digit, +but not underscore. + + + +The only metacharacters that are recognized in character classes are +backslash, hyphen (only where it can be interpreted as specifying a +range), circumflex (only at the start), opening square bracket (only +when it can be interpreted as introducing a POSIX class name - see the +next section), and the terminating closing square bracket. However, +escaping other non-alphanumeric characters does no harm. + + + + +Posix character classes + +GRegex supports the POSIX notation for character classes. This uses names +enclosed by [: and :] within the enclosing square brackets. For example, + + + +[01[:alpha:]%] + + + +matches "0", "1", any alphabetic character, or "%". The supported class +names are + + + +Posix classes + + + + + Name + Meaning + + + + + alnum + letters and digits + + + alpha + letters + + + ascii + character codes 0 - 127 + + + blank + space or tab only + + + cntrl + control characters + + + digit + decimal digits (same as \d) + + + graph + printing characters, excluding space + + + lower + lower case letters + + + print + printing characters, including space + + + punct + printing characters, excluding letters and digits + + + space + white space (not quite the same as \s) + + + upper + upper case letters + + + word + "word" characters (same as \w) + + + xdigit + hexadecimal digits + + + +
+ + +The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), +and space (32). Notice that this list includes the VT character (code +11). This makes "space" different to \s, which does not include VT (for +Perl compatibility). + + + +The name "word" is a Perl extension, and "blank" is a GNU extension. +Another Perl extension is negation, which is indicated by a ^ character +after the colon. For example, + + + +[12[:^digit:]] + + + +matches "1", "2", or any non-digit. GRegex also recognize the +POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but +these are not supported, and an error is given if they are encountered. + + + +In UTF-8 mode, characters with values greater than 128 do not match any +of the POSIX character classes. + +
+ + +Vertical bar + +Vertical bar characters are used to separate alternative patterns. For +example, the pattern + + + + gilbert|sullivan + + + +matches either "gilbert" or "sullivan". Any number of alternatives may +appear, and an empty alternative is permitted (matching the empty +string). The matching process tries each alternative in turn, from +left to right, and the first one that succeeds is used. If the alternatives are within a subpattern (defined below), "succeeds" means matching the rest of the main pattern as well as the alternative in the subpattern. + + + + +Internal option setting + +The settings of the G_REGEX_CASELESS, G_REGEX_MULTILINE, G_REGEX_MULTILINE, +and G_REGEX_EXTENDED options can be changed from within the pattern by a +sequence of Perl-style option letters enclosed between "(?" and ")". The +option letters are + + + +Option settings + + + + + Option + Flag + + + + + i + G_REGEX_CASELESS + + + m + G_REGEX_MULTILINE + + + s + G_REGEX_DOTALL + + + x + G_REGEX_EXTENDED + + + +
+ + +For example, (?im) sets caseless, multiline matching. It is also +possible to unset these options by preceding the letter with a hyphen, and a +combined setting and unsetting such as (?im-sx), which sets G_REGEX_CASELESS +and G_REGEX_MULTILINE while unsetting G_REGEX_DOTALL and G_REGEX_EXTENDED, +is also permitted. If a letter appears both before and after the +hyphen, the option is unset. + + + +When an option change occurs at top level (that is, not inside subpattern +parentheses), the change applies to the remainder of the pattern +that follows. + + + +An option change within a subpattern (see below for a description of subpatterns) +affects only that part of the current pattern that follows it, so + + + +(a(?i)b)c + + + +matches abc and aBc and no other strings (assuming G_REGEX_CASELESS is not +used). By this means, options can be made to have different settings +in different parts of the pattern. Any changes made in one alternative +do carry on into subsequent branches within the same subpattern. For +example, + + + +(a(?i)b|c) + + + +matches "ab", "aB", "c", and "C", even though when matching "C" the +first branch is abandoned before the option setting. This is because +the effects of option settings happen at compile time. There would be +some very weird behaviour otherwise. + + + +The options G_REGEX_UNGREEDY and +G_REGEX_EXTRA and G_REGEX_DUPNAMES +can be changed in the same way as the Perl-compatible options by using +the characters U, X and J respectively. + +
+ + +Subpatterns + +Subpatterns are delimited by parentheses (round brackets), which can be +nested. Turning part of a pattern into a subpattern does two things: + + + + +It localizes a set of alternatives. For example, the pattern +cat(aract|erpillar|) matches one of the words "cat", "cataract", or +"caterpillar". Without the parentheses, it would match "cataract", +"erpillar" or an empty string. + + +It sets up the subpattern as a capturing subpattern. This means +that, when the whole pattern matches, that portion of the +string that matched the subpattern can be obtained using g_regex_fetch(). +Opening parentheses are counted from left to right (starting from 1, as +subpattern 0 is the whole matched string) to obtain numbers for the +capturing subpatterns. + + + + +For example, if the string "the red king" is matched against the pattern + + + +the ((red|white) (king|queen)) + + + +the captured substrings are "red king", "red", and "king", and are numbered 1, 2, and 3, respectively. + + + +The fact that plain parentheses fulfil two functions is not always +helpful. There are often times when a grouping subpattern is required +without a capturing requirement. If an opening parenthesis is followed +by a question mark and a colon, the subpattern does not do any capturing, +and is not counted when computing the number of any subsequent +capturing subpatterns. For example, if the string "the white queen" is +matched against the pattern + + + +the ((?:red|white) (king|queen)) + + + +the captured substrings are "white queen" and "queen", and are numbered +1 and 2. The maximum number of capturing subpatterns is 65535. + + + +As a convenient shorthand, if any option settings are required at the +start of a non-capturing subpattern, the option letters may appear +between the "?" and the ":". Thus the two patterns + + + +(?i:saturday|sunday) +(?:(?i)saturday|sunday) + + + +match exactly the same set of strings. Because alternative branches are +tried from left to right, and options are not reset until the end of +the subpattern is reached, an option setting in one branch does affect +subsequent branches, so the above patterns match "SUNDAY" as well as +"Saturday". + + + + +Named subpatterns + +Identifying capturing parentheses by number is simple, but it can be +very hard to keep track of the numbers in complicated regular expressions. +Furthermore, if an expression is modified, the numbers may +change. To help with this difficulty, GRegex supports the naming of +subpatterns. A subpattern can be named in one of three ways: (?<name>...) or +(?'name'...) as in Perl, or (?P<name>...) as in Python. +References to capturing parentheses from other +parts of the pattern, such as backreferences, recursion, and conditions, +can be made by name as well as by number. + + + +Names consist of up to 32 alphanumeric characters and underscores. Named +capturing parentheses are still allocated numbers as well as names, exactly as +if the names were not present. +By default, a name must be unique within a pattern, but it is possible to relax +this constraint by setting the G_REGEX_DUPNAMES option at +compile time. This can be useful for patterns where only one instance of the +named parentheses can match. Suppose you want to match the name of a weekday, +either as a 3-letter abbreviation or as the full name, and in both cases you +want to extract the abbreviation. This pattern (ignoring the line breaks) does +the job: + + + +(?<DN>Mon|Fri|Sun)(?:day)?| +(?<DN>Tue)(?:sday)?| +(?<DN>Wed)(?:nesday)?| +(?<DN>Thu)(?:rsday)?| +(?<DN>Sat)(?:urday)? + + + +There are five capturing substrings, but only one is ever set after a match. +The function for extracting the data by name returns the substring +for the first (and in this example, the only) subpattern of that name that +matched. This saves searching to find which numbered subpattern it was. If you +make a reference to a non-unique named subpattern from elsewhere in the +pattern, the one that corresponds to the lowest number is used. + + + + +Repetition + +Repetition is specified by quantifiers, which can follow any of the +following items: + + + +a literal data character +the dot metacharacter +the \C escape sequence +the \X escape sequence (in UTF-8 mode) +the \R escape sequence +an escape such as \d that matches a single character +a character class +a back reference (see next section) +a parenthesized subpattern (unless it is an assertion) + + + +The general repetition quantifier specifies a minimum and maximum number +of permitted matches, by giving the two numbers in curly brackets +(braces), separated by a comma. The numbers must be less than 65536, +and the first must be less than or equal to the second. For example: + + + +z{2,4} + + + +matches "zz", "zzz", or "zzzz". A closing brace on its own is not a +special character. If the second number is omitted, but the comma is +present, there is no upper limit; if the second number and the comma +are both omitted, the quantifier specifies an exact number of required +matches. Thus + + + +[aeiou]{3,} + + + +matches at least 3 successive vowels, but may match many more, while + + + +\d{8} + + + +matches exactly 8 digits. An opening curly bracket that appears in a +position where a quantifier is not allowed, or one that does not match +the syntax of a quantifier, is taken as a literal character. For example, +{,6} is not a quantifier, but a literal string of four characters. + + + +In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to +individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 +characters, each of which is represented by a two-byte sequence. Similarly, +\X{3} matches three Unicode extended sequences, each of which may be +several bytes long (and they may be of different lengths). + + + +The quantifier {0} is permitted, causing the expression to behave as if +the previous item and the quantifier were not present. + + + +For convenience, the three most common quantifiers have single-character +abbreviations: + + + +Abbreviations for quantifiers + + + + + Abbreviation + Meaning + + + + + * + is equivalent to {0,} + + + + + is equivalent to {1,} + + + ? + is equivalent to {0,1} + + + +
+ + +It is possible to construct infinite loops by following a subpattern +that can match no characters with a quantifier that has no upper limit, +for example: + + + +(a?)* + + + +Because there are cases where this can be useful, such patterns are +accepted, but if any repetition of the subpattern does in fact match +no characters, the loop is forcibly broken. + + + +By default, the quantifiers are "greedy", that is, they match as much +as possible (up to the maximum number of permitted times), without +causing the rest of the pattern to fail. The classic example of where +this gives problems is in trying to match comments in C programs. These +appear between /* and */ and within the comment, individual * and / +characters may appear. An attempt to match C comments by applying the +pattern + + + +/\*.*\*/ + + + +to the string + + + +/* first comment */ not comment /* second comment */ + + + +fails, because it matches the entire string owing to the greediness of +the .* item. + + + +However, if a quantifier is followed by a question mark, it ceases to +be greedy, and instead matches the minimum number of times possible, so +the pattern + + + +/\*.*?\*/ + + + +does the right thing with the C comments. The meaning of the various +quantifiers is not otherwise changed, just the preferred number of +matches. Do not confuse this use of question mark with its use as a +quantifier in its own right. Because it has two uses, it can sometimes +appear doubled, as in + + + +\d??\d + + + +which matches one digit by preference, but can match two if that is the +only way the rest of the pattern matches. + + + +If the G_REGEX_UNGREEDY flag is set, the quantifiers are not greedy +by default, but individual ones can be made greedy by following them with +a question mark. In other words, it inverts the default behaviour. + + + +When a parenthesized subpattern is quantified with a minimum repeat +count that is greater than 1 or with a limited maximum, more memory is +required for the compiled pattern, in proportion to the size of the +minimum or maximum. + + + +If a pattern starts with .* or .{0,} and the G_REGEX_DOTALL flag +is set, thus allowing the dot to match newlines, the +pattern is implicitly anchored, because whatever follows will be tried +against every character position in the string, so there is no +point in retrying the overall match at any position after the first. +GRegex normally treats such a pattern as though it were preceded by \A. + + + +In cases where it is known that the string contains no newlines, it +is worth setting G_REGEX_DOTALL in order to obtain this optimization, +or alternatively using ^ to indicate anchoring explicitly. + + + +However, there is one situation where the optimization cannot be used. +When .* is inside capturing parentheses that are the subject of a +backreference elsewhere in the pattern, a match at the start may fail +where a later one succeeds. Consider, for example: + + + +(.*)abc\1 + + + +If the string is "xyz123abc123" the match point is the fourth character. +For this reason, such a pattern is not implicitly anchored. + + + +When a capturing subpattern is repeated, the value captured is the +substring that matched the final iteration. For example, after + + + +(tweedle[dume]{3}\s*)+ + + + +has matched "tweedledum tweedledee" the value of the captured substring +is "tweedledee". However, if there are nested capturing subpatterns, +the corresponding captured values may have been set in previous iterations. +For example, after + + + +/(a|(b))+/ + + + +matches "aba" the value of the second captured substring is "b". + +
+ + +Atomic grouping and possessive quantifiers + +With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") +repetition, failure of what follows normally causes the repeated +item to be re-evaluated to see if a different number +of repeats allows the rest of the pattern to match. Sometimes it +is useful to prevent this, either to change the nature of the +match, or to cause it fail earlier than it otherwise might, when the +author of the pattern knows there is no point in carrying on. + + + +Consider, for example, the pattern \d+foo when applied to the string + + + +123456bar + + + +After matching all 6 digits and then failing to match "foo", the normal +action of the matcher is to try again with only 5 digits matching the +\d+ item, and then with 4, and so on, before ultimately failing. +"Atomic grouping" (a term taken from Jeffrey Friedl’s book) provides +the means for specifying that once a subpattern has matched, it is not +to be re-evaluated in this way. + + + +If we use atomic grouping for the previous example, the matcher +give up immediately on failing to match "foo" the first time. The notation +is a kind of special parenthesis, starting with (?> as in this +example: + + + +(?>\d+)foo + + + +This kind of parenthesis "locks up" the part of the pattern it contains +once it has matched, and a failure further into the pattern is +prevented from backtracking into it. Backtracking past it to previous +items, however, works as normal. + + + +An alternative description is that a subpattern of this type matches +the string of characters that an identical standalone pattern would +match, if anchored at the current point in the string. + + + +Atomic grouping subpatterns are not capturing subpatterns. Simple cases +such as the above example can be thought of as a maximizing repeat that +must swallow everything it can. So, while both \d+ and \d+? are prepared +to adjust the number of digits they match in order to make the +rest of the pattern match, (?>\d+) can only match an entire sequence of +digits. + + + +Atomic groups in general can of course contain arbitrarily complicated +subpatterns, and can be nested. However, when the subpattern for an +atomic group is just a single repeated item, as in the example above, a +simpler notation, called a "possessive quantifier" can be used. This +consists of an additional + character following a quantifier. Using +this notation, the previous example can be rewritten as + + + +\d++foo + + + +Possessive quantifiers are always greedy; the setting of the +G_REGEX_UNGREEDY option is ignored. They are a convenient notation for the +simpler forms of atomic group. However, there is no difference in the +meaning of a possessive quantifier and the equivalent +atomic group, though there may be a performance difference; +possessive quantifiers should be slightly faster. + + + +The possessive quantifier syntax is an extension to the Perl syntax. +It was invented by Jeffrey Friedl in the first edition of his book and +then implemented by Mike McCloskey in Sun's Java package. +It ultimately found its way into Perl at release 5.10. + + + +GRegex has an optimization that automatically "possessifies" certain simple +pattern constructs. For example, the sequence A+B is treated as A++B because +there is no point in backtracking into a sequence of A's when B must follow. + + + +When a pattern contains an unlimited repeat inside a subpattern that +can itself be repeated an unlimited number of times, the use of an +atomic group is the only way to avoid some failing matches taking a +very long time indeed. The pattern + + + +(\D+|<\d+>)*[!?] + + + +matches an unlimited number of substrings that either consist of non- +digits, or digits enclosed in <>, followed by either ! or ?. When it +matches, it runs quickly. However, if it is applied to + + + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + + +it takes a long time before reporting failure. This is because the +string can be divided between the internal \D+ repeat and the external +* repeat in a large number of ways, and all have to be tried. (The +example uses [!?] rather than a single character at the end, because +GRegex has an optimization that allows for fast failure +when a single character is used. It remember the last single character +that is required for a match, and fail early if it is not present +in the string.) If the pattern is changed so that it uses an atomic +group, like this: + + + +((?>\D+)|<\d+>)*[!?] + + + +sequences of non-digits cannot be broken, and failure happens quickly. + + + + +Back references + +Outside a character class, a backslash followed by a digit greater than +0 (and possibly further digits) is a back reference to a capturing subpattern +earlier (that is, to its left) in the pattern, provided there have been that +many previous capturing left parentheses. + + + +However, if the decimal number following the backslash is less than 10, +it is always taken as a back reference, and causes an error only if +there are not that many capturing left parentheses in the entire pattern. +In other words, the parentheses that are referenced need not be +to the left of the reference for numbers less than 10. A "forward back +reference" of this type can make sense when a repetition is involved and +the subpattern to the right has participated in an earlier iteration. + + + +It is not possible to have a numerical "forward back reference" to subpattern +whose number is 10 or more using this syntax because a sequence such as \e50 is +interpreted as a character defined in octal. See the subsection entitled +"Non-printing characters" above for further details of the handling of digits +following a backslash. There is no such problem when named parentheses are used. +A back reference to any subpattern is possible using named parentheses (see below). + + + +Another way of avoiding the ambiguity inherent in the use of digits following a +backslash is to use the \g escape sequence (introduced in Perl 5.10.) +This escape must be followed by a positive or a negative number, +optionally enclosed in braces. + + + +A positive number specifies an absolute reference without the ambiguity that is +present in the older syntax. It is also useful when literal digits follow the +reference. A negative number is a relative reference. Consider "(abc(def)ghi)\g{-1}", +the sequence \g{-1} is a reference to the most recently started capturing +subpattern before \g, that is, is it equivalent to \2. Similarly, \g{-2} +would be equivalent to \1. The use of relative references can be helpful in +long patterns, and also in patterns that are created by joining together +fragments that contain references within themselves. + + + +A back reference matches whatever actually matched the capturing subpattern +in the current string, rather than anything matching +the subpattern itself (see "Subpatterns as subroutines" below for a way +of doing that). So the pattern + + + +(sens|respons)e and \1ibility + + + +matches "sense and sensibility" and "response and responsibility", but +not "sense and responsibility". If caseful matching is in force at the +time of the back reference, the case of letters is relevant. For example, + + + +((?i)rah)\s+\1 + + + +matches "rah rah" and "RAH RAH", but not "RAH rah", even though the +original capturing subpattern is matched caselessly. + + + +Back references to named subpatterns use the Perl syntax \k<name> or \k'name' +or the Python syntax (?P=name). We could rewrite the above example in either of +the following ways: + + + +(?<p1>(?i)rah)\s+\k<p1> +(?P<p1>(?i)rah)\s+(?P=p1) + + + +A subpattern that is referenced by name may appear in the pattern before or +after the reference. + + + +There may be more than one back reference to the same subpattern. If a +subpattern has not actually been used in a particular match, any back +references to it always fail. For example, the pattern + + + +(a|(bc))\2 + + + +always fails if it starts to match "a" rather than "bc". Because there +may be many capturing parentheses in a pattern, all digits following +the backslash are taken as part of a potential back reference number. +If the pattern continues with a digit character, some delimiter must be +used to terminate the back reference. If the G_REGEX_EXTENDED flag is +set, this can be whitespace. Otherwise an empty comment (see "Comments" below) can be used. + + + +A back reference that occurs inside the parentheses to which it refers +fails when the subpattern is first used, so, for example, (a\1) never +matches. However, such references can be useful inside repeated subpatterns. +For example, the pattern + + + +(a|b\1)+ + + + +matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration +of the subpattern, the back reference matches the character +string corresponding to the previous iteration. In order for this to +work, the pattern must be such that the first iteration does not need +to match the back reference. This can be done using alternation, as in +the example above, or by a quantifier with a minimum of zero. + + + + +Assertions + +An assertion is a test on the characters following or preceding the +current matching point that does not actually consume any characters. +The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are +described above. + + + +More complicated assertions are coded as subpatterns. There are two +kinds: those that look ahead of the current position in the +string, and those that look behind it. An assertion subpattern is +matched in the normal way, except that it does not cause the current +matching position to be changed. + + + +Assertion subpatterns are not capturing subpatterns, and may not be +repeated, because it makes no sense to assert the same thing several +times. If any kind of assertion contains capturing subpatterns within +it, these are counted for the purposes of numbering the capturing +subpatterns in the whole pattern. However, substring capturing is carried +out only for positive assertions, because it does not make sense for +negative assertions. + + + +Lookahead assertions + +Lookahead assertions start with (?= for positive assertions and (?! for +negative assertions. For example, + + + +\w+(?=;) + + + +matches a word followed by a semicolon, but does not include the semicolon +in the match, and + + + +foo(?!bar) + + + +matches any occurrence of "foo" that is not followed by "bar". Note +that the apparently similar pattern + + + +(?!foo)bar + + + +does not find an occurrence of "bar" that is preceded by something +other than "foo"; it finds any occurrence of "bar" whatsoever, because +the assertion (?!foo) is always true when the next three characters are +"bar". A lookbehind assertion is needed to achieve the other effect. + + + +If you want to force a matching failure at some point in a pattern, the +most convenient way to do it is with (?!) because an empty string +always matches, so an assertion that requires there not to be an empty +string must always fail. + + + + +Lookbehind assertions + +Lookbehind assertions start with (?<= for positive assertions and (?<! +for negative assertions. For example, + + + +(?<!foo)bar + + + +does find an occurrence of "bar" that is not preceded by "foo". The +contents of a lookbehind assertion are restricted such that all the +strings it matches must have a fixed length. However, if there are +several top-level alternatives, they do not all have to have the same +fixed length. Thus + + + +(?<=bullock|donkey) + + + +is permitted, but + + + +(?<!dogs?|cats?) + + + +causes an error at compile time. Branches that match different length +strings are permitted only at the top level of a lookbehind assertion. +An assertion such as + + + +(?<=ab(c|de)) + + + +is not permitted, because its single top-level branch can match two +different lengths, but it is acceptable if rewritten to use two top- +level branches: + + + +(?<=abc|abde) + + + +The implementation of lookbehind assertions is, for each alternative, +to temporarily move the current position back by the fixed length and +then try to match. If there are insufficient characters before the +current position, the assertion fails. + + + +GRegex does not allow the \C escape (which matches a single byte in UTF-8 +mode) to appear in lookbehind assertions, because it makes it impossible +to calculate the length of the lookbehind. The \X and \R escapes, which can +match different numbers of bytes, are also not permitted. + + + +Possessive quantifiers can be used in conjunction with lookbehind assertions to +specify efficient matching at the end of the subject string. Consider a simple +pattern such as + + + +abcd$ + + + +when applied to a long string that does not match. Because matching +proceeds from left to right, GRegex will look for each "a" in the string +and then see if what follows matches the rest of the pattern. If the +pattern is specified as + + + +^.*abcd$ + + + +the initial .* matches the entire string at first, but when this fails +(because there is no following "a"), it backtracks to match all but the +last character, then all but the last two characters, and so on. Once +again the search for "a" covers the entire string, from right to left, +so we are no better off. However, if the pattern is written as + + + +^.*+(?<=abcd) + + + +there can be no backtracking for the .*+ item; it can match only the +entire string. The subsequent lookbehind assertion does a single test +on the last four characters. If it fails, the match fails immediately. +For long strings, this approach makes a significant difference to the +processing time. + + + + +Using multiple assertions + +Several assertions (of any sort) may occur in succession. For example, + + + +(?<=\d{3})(?<!999)foo + + + +matches "foo" preceded by three digits that are not "999". Notice that +each of the assertions is applied independently at the same point in +the string. First there is a check that the previous three +characters are all digits, and then there is a check that the same +three characters are not "999". This pattern does not match "foo" preceded +by six characters, the first of which are digits and the last +three of which are not "999". For example, it doesn’t match "123abcfoo". +A pattern to do that is + + + +(?<=\d{3}...)(?<!999)foo + + + +This time the first assertion looks at the preceding six characters, +checking that the first three are digits, and then the second assertion +checks that the preceding three characters are not "999". + + + +Assertions can be nested in any combination. For example, + + + +(?<=(?<!foo)bar)baz + + + +matches an occurrence of "baz" that is preceded by "bar" which in turn +is not preceded by "foo", while + + + +(?<=\d{3}(?!999)...)foo + + + +is another pattern that matches "foo" preceded by three digits and any +three characters that are not "999". + + + + + +Conditional subpatterns + +It is possible to cause the matching process to obey a subpattern +conditionally or to choose between two alternative subpatterns, depending +on the result of an assertion, or whether a previous capturing subpattern +matched or not. The two possible forms of conditional subpattern are + + + +(?(condition)yes-pattern) +(?(condition)yes-pattern|no-pattern) + + + +If the condition is satisfied, the yes-pattern is used; otherwise the +no-pattern (if present) is used. If there are more than two alternatives +in the subpattern, a compile-time error occurs. + + + +There are four kinds of condition: references to subpatterns, references to +recursion, a pseudo-condition called DEFINE, and assertions. + + + +Checking for a used subpattern by number + +If the text between the parentheses consists of a sequence of digits, the +condition is true if the capturing subpattern of that number has previously +matched. + + + +Consider the following pattern, which contains non-significant white space +to make it more readable (assume the G_REGEX_EXTENDED) +and to divide it into three parts for ease of discussion: + + + +( \( )? [^()]+ (?(1) \) ) + + + +The first part matches an optional opening parenthesis, and if that +character is present, sets it as the first captured substring. The second +part matches one or more characters that are not parentheses. The +third part is a conditional subpattern that tests whether the first set +of parentheses matched or not. If they did, that is, if string started +with an opening parenthesis, the condition is true, and so the yes-pattern +is executed and a closing parenthesis is required. Otherwise, +since no-pattern is not present, the subpattern matches nothing. In +other words, this pattern matches a sequence of non-parentheses, +optionally enclosed in parentheses. + + + + +Checking for a used subpattern by name + +Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used +subpattern by name, the Python syntax (?(name)...) is also recognized. However, +there is a possible ambiguity with this syntax, because subpattern names may +consist entirely of digits. GRegex looks first for a named subpattern; if it +cannot find one and the name consists entirely of digits, GRegex looks for a +subpattern of that number, which must be greater than zero. Using subpattern +names that consist entirely of digits is not recommended. + + + +Rewriting the above example to use a named subpattern gives this: + + + +(?<OPEN> \( )? [^()]+ (?(<OPEN>) \) ) + + + + +Checking for pattern recursion + +If the condition is the string (R), and there is no subpattern with the name R, +the condition is true if a recursive call to the whole pattern or any +subpattern has been made. If digits or a name preceded by ampersand follow the +letter R, for example: + + + +(?(R3)...) +(?(R&name)...) + + + +the condition is true if the most recent recursion is into the subpattern whose +number or name is given. This condition does not check the entire recursion +stack. + + + +At "top level", all these recursion test conditions are false. Recursive +patterns are described below. + + + + +Defining subpatterns for use by reference only + +If the condition is the string (DEFINE), and there is no subpattern with the +name DEFINE, the condition is always false. In this case, there may be only one +alternative in the subpattern. It is always skipped if control reaches this +point in the pattern; the idea of DEFINE is that it can be used to define +"subroutines" that can be referenced from elsewhere. (The use of "subroutines" +is described below.) For example, a pattern to match an IPv4 address could be +written like this (ignore whitespace and line breaks): + + + +(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) +\b (?&byte) (\.(?&byte)){3} \b + + + +The first part of the pattern is a DEFINE group inside which a another group +named "byte" is defined. This matches an individual component of an IPv4 +address (a number less than 256). When matching takes place, this part of the +pattern is skipped because DEFINE acts like a false condition. + + + +The rest of the pattern uses references to the named group to match the four +dot-separated components of an IPv4 address, insisting on a word boundary at +each end. + + + + +Assertion conditions + +If the condition is not in any of the above formats, it must be an +assertion. This may be a positive or negative lookahead or lookbehind +assertion. Consider this pattern, again containing non-significant +white space, and with the two alternatives on the second line: + + + +(?(?=[^a-z]*[a-z]) +\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) + + + +The condition is a positive lookahead assertion that matches an +optional sequence of non-letters followed by a letter. In other words, +it tests for the presence of at least one letter in the string. If a +letter is found, the string is matched against the first alternative; +otherwise it is matched against the second. This pattern matches +strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are +letters and dd are digits. + + + + + +Comments + +The sequence (?# marks the start of a comment that continues up to the +next closing parenthesis. Nested parentheses are not permitted. The +characters that make up a comment play no part in the pattern matching +at all. + + + +If the G_REGEX_EXTENDED option is set, an unescaped # +character outside a character class introduces a comment that continues to +immediately after the next newline in the pattern. + + + + +Recursive patterns + +Consider the problem of matching a string in parentheses, allowing for +unlimited nested parentheses. Without the use of recursion, the best +that can be done is to use a pattern that matches up to some fixed +depth of nesting. It is not possible to handle an arbitrary nesting +depth. + + + +For some time, Perl has provided a facility that allows regular expressions to +recurse (amongst other things). It does this by interpolating Perl code in the +expression at run time, and the code can refer to the expression itself. A Perl +pattern using code interpolation to solve the parentheses problem can be +created like this: + + + +$re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; + + + +The (?p{...}) item interpolates Perl code at run time, and in this case refers +recursively to the pattern in which it appears. + + + +Obviously, GRegex cannot support the interpolation of Perl code. Instead, it +supports special syntax for recursion of the entire pattern, and also for +individual subpattern recursion. This kind of recursion was introduced into +Perl at release 5.10. + + + +A special item that consists of (? followed by a number greater than zero and a +closing parenthesis is a recursive call of the subpattern of the given number, +provided that it occurs inside that subpattern. (If not, it is a "subroutine" +call, which is described in the next section.) The special item (?R) or (?0) is +a recursive call of the entire regular expression. + + + +In GRegex (like Python, but unlike Perl), a recursive subpattern call is always +treated as an atomic group. That is, once it has matched some of the subject +string, it is never re-entered, even if it contains untried alternatives and +there is a subsequent matching failure. + + + +This pattern solves the nested parentheses problem (assume the +G_REGEX_EXTENDED option is set so that white space is +ignored): + + + +\( ( (?>[^()]+) | (?R) )* \) + + + +First it matches an opening parenthesis. Then it matches any number of +substrings which can either be a sequence of non-parentheses, or a +recursive match of the pattern itself (that is, a correctly parenthesized +substring). Finally there is a closing parenthesis. + + + +If this were part of a larger pattern, you would not want to recurse +the entire pattern, so instead you could use this: + + + +( \( ( (?>[^()]+) | (?1) )* \) ) + + + +We have put the pattern into parentheses, and caused the recursion to +refer to them instead of the whole pattern. In a larger pattern, keeping +track of parenthesis numbers can be tricky. It may be more convenient to +use named parentheses instead. +The Perl syntax for this is (?&name); GRegex also supports the(?P>name) +syntac. We could rewrite the above example as follows: + + + +(?<pn> \( ( (?>[^()]+) | (?&pn) )* \) ) + + + +If there is more than one subpattern with the same name, the earliest one is +used. This particular example pattern contains nested unlimited repeats, and so +the use of atomic grouping for matching strings of non-parentheses is important +when applying the pattern to strings that do not match. +For example, when this pattern is applied to + + + +(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + + + +it yields "no match" quickly. However, if atomic grouping is not used, +the match runs for a very long time indeed because there are so many +different ways the + and * repeats can carve up the string, and all +have to be tested before failure can be reported. + + + +At the end of a match, the values set for any capturing subpatterns are +those from the outermost level of the recursion at which the subpattern +value is set. + + + +If the pattern above is matched against + + + +(ab(cd)ef) + + + +the value for the capturing parentheses is "ef", which is the last +value taken on at the top level. If additional parentheses are added, +giving + + + +\( ( ( (?>[^()]+) | (?R) )* ) \) + ^ ^ + ^ ^ + + + +the string they capture is "ab(cd)ef", the contents of the top level +parentheses. + + + +Do not confuse the (?R) item with the condition (R), which tests for +recursion. Consider this pattern, which matches text in angle brackets, +allowing for arbitrary nesting. Only digits are allowed in nested +brackets (that is, when recursing), whereas any characters are permitted +at the outer level. + + + +< (?: (?(R) \d++ | [^<>]*+) | (?R)) * > + + + +In this pattern, (?(R) is the start of a conditional subpattern, with +two different alternatives for the recursive and non-recursive cases. +The (?R) item is the actual recursive call. + + + + +Subpatterns as subroutines + +If the syntax for a recursive subpattern reference (either by number or +by name) is used outside the parentheses to which it refers, it operates +like a subroutine in a programming language. The "called" subpattern may +be defined before or after the reference. An earlier example pointed out +that the pattern + + + +(sens|respons)e and \1ibility + + + +matches "sense and sensibility" and "response and responsibility", but +not "sense and responsibility". If instead the pattern + + + +(sens|respons)e and (?1)ibility + + + +is used, it does match "sense and responsibility" as well as the other +two strings. Another example is given in the discussion of DEFINE above. + + + +Like recursive subpatterns, a "subroutine" call is always treated as an atomic +group. That is, once it has matched some of the string, it is never +re-entered, even if it contains untried alternatives and there is a subsequent +matching failure. + + + +When a subpattern is used as a subroutine, processing options such as +case-independence are fixed when the subpattern is defined. They cannot be +changed for different calls. For example, consider this pattern: + + + +(abc)(?i:(?1)) + + + +It matches "abcabc". It does not match "abcABC" because the change of +processing option does not affect the called subpattern. + + + + + + +Copyright + +This document was copied and adapted from the PCRE documentation, +specifically from the man page for pcrepattern. +The original copyright note is: + + + +Copyright (c) 1997-2006 University of Cambridge. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the name of Google + Inc. nor the names of their contributors may be used to endorse or + promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + + +
diff --git a/docs/reference/glib/resources.sgml b/docs/reference/glib/resources.sgml new file mode 100644 index 0000000..5e5f302 --- /dev/null +++ b/docs/reference/glib/resources.sgml @@ -0,0 +1,115 @@ + + + + +Mailing lists and bug reports +3 +Mailing lists and bug reports + + + +Mailing lists and bug reports + +Getting help with GLib + + + + +Filing a bug report or feature request + + +If you encounter a bug, misfeature, or missing feature in GLib, please +file a bug report on +http://bugzilla.gnome.org. +We'd also appreciate reports of incomplete or misleading information in +the GLib documentation; file those against the "docs" component of the "glib" +product in Bugzilla. + + + +Don't hesitate to file a bug report, even if you think we may know +about it already, or aren't sure of the details. Just give us as much +information as you have, and if it's already fixed or has already been +discussed, we'll add a note to that effect in the report. + + + +The bug tracker should definitely be used for feature requests, it's +not only for bugs. We track all GLib development in Bugzilla, so it's +the way to be sure the GLib developers won't forget about an issue. + + + + + +Submitting Patches + + +If you develop a bugfix or enhancement for GLib, 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 GNU LGPL 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 +gtk-devel-list@gnome.org. +But be sure to file the Bugzilla report as well; if the patch is only on the +list and not in Bugzilla, it's likely to slip through the cracks. + + + + + +Mailing lists + + +There are several mailing lists dedicated to GTK+ and related +libraries. Discussion of GLib generally takes place on these lists. +You can subscribe or view the archives of these lists on +http://mail.gnome.org. + + + + + + +gtk-list@gnome.org + +gtk-list covers general GTK+ (and GLib) topics; questions about using GLib +in programs, GLib from a user standpoint, announcements of GLib-related projects +would all be on-topic. The bulk of the traffic consists of GTK+ programming +questions. + + + + +gtk-devel-list@gnome.org + +gtk-devel-list is for discussion of work on GTK+ (and GLib) itself, it is +not for asking questions about how to use GTK+ (or GLib) +in applications. gtk-devel-list is appropriate for discussion of patches, +bugs, proposed features, and so on. + + + + +gtk-doc-list@gnome.org + +gtk-doc-list is for discussion of the gtk-doc +documentation system (used to document GTK+ and Glib), and for work on the GTK+ +(and GLib) documentation. + + + + + + + + + + diff --git a/docs/reference/glib/running.sgml b/docs/reference/glib/running.sgml new file mode 100644 index 0000000..9c33da8 --- /dev/null +++ b/docs/reference/glib/running.sgml @@ -0,0 +1,325 @@ + + + + +Running GLib Applications +3 +GLib Library + + + +Running GLib Applications + +How to run and debug your GLib application + + + + +Running and debugging GLib Applications + + +Environment variables + + +GLib inspects a few of environment variables in addition to standard +variables like LANG, PATH or HOME. + + + + <envar>G_FILENAME_ENCODING</envar> + + + This environment variable can be set to a comma-separated list of character + set names. GLib assumes that filenames are encoded in the first character + set from that list rather than in UTF-8. The special token "@locale" can be + used to specify the character set for the current locale. + + + + + <envar>G_BROKEN_FILENAMES</envar> + + + If this environment variable is set, GLib assumes that filenames are in + the locale encoding rather than in UTF-8. G_FILENAME_ENCODING takes + priority over G_BROKEN_FILENAMES. + + + + + <envar>G_MESSAGES_PREFIXED</envar> + + + A list of log levels for which messages should be prefixed by the + program name and PID of the application. The default is to prefix + everything except G_LOG_LEVEL_MESSAGE and G_LOG_LEVEL_INFO. + + + + + <envar>G_DEBUG</envar> + + If GLib has been configured with , + this variable can be set to a list of debug options, which cause GLib + to print out different types of debugging information. + + + fatal_warnings + Causes GLib to abort the program at the first call + to g_warning() or + g_critical(). This option is + special in that it doesn't require GLib to be configured with + debugging support. + + + + fatal_criticals + Causes GLib to abort the program at the first call + to g_critical(). This option is + special in that it doesn't require GLib to be configured with + debugging support. + + + + gc-friendly + + + Newly allocated memory that isn't directly initialized, as well + as memory being freed will be reset to 0. The point here is to + allow memory checkers and similar programs that use bohem GC alike + algorithms to produce more accurate results. + This option is special in that it doesn't require GLib to be + configured with debugging support. + + + + + resident-modules + + + All modules loaded by GModule will be made resident. This can be useful + for tracking memory leaks in modules which are later unloaded; but it can + also hide bugs where code is accessed after the module would have normally + been unloaded. + This option is special in that it doesn't require GLib to be + configured with debugging support. + + + + + bind-now-modules + + + All modules loaded by GModule will bind their symbols at load time, even + when the code uses %G_MODULE_BIND_LAZY. + This option is special in that it doesn't require GLib to be + configured with debugging support. + + + + + The special value all can be used to turn on all debug options. + The special value help can be used to print all available options. + + + + + <envar>G_SLICE</envar> + + This environment variable allows reconfiguration of the GSlice + memory allocator. + + + always-malloc + + + This will cause all slices allocated through g_slice_alloc() and + released by g_slice_free1() to be actually allocated via direct + calls to g_malloc() and g_free(). + This is most useful for memory checkers and similar programs that + use Bohem GC alike algorithms to produce more accurate results. + It can also be in conjunction with debugging features of the system's + malloc implementation such as glibc's MALLOC_CHECK_=2 to debug + erroneous slice allocation code, allthough debug-blocks + usually is a better suited debugging tool. + + + + + debug-blocks + + + Using this option (present since GLib-2.13) engages extra code + which performs sanity checks on the released memory slices. + Invalid slice adresses or slice sizes will be reported and lead to + a program halt. + This option is for debugging scenarios. + In particular, client packages sporting their own test suite should + always enable this option when running tests. + Global slice validation is ensured by storing size and address information + for each allocated chunk, and maintaining a global hash table of that data. + That way, multi-thread scalability is given up, and memory consumption is + increased. However, the resulting code usually performs acceptably well, + possibly better than with comparable memory checking carried out using + external tools. An example of a memory corruption scenario that cannot be + reproduced with G_SLICE=always-malloc, but will be caught + by G_SLICE=debug-blocks is as follows: + + void *slist = g_slist_alloc(); /* void* gives up type-safety */ + g_list_free (slist); /* corruption: sizeof (GSList) != sizeof (GList) */ + + + + + + The special value all can be used to turn on all options. + The special value help can be used to print all available options. + + + + + <envar>G_RANDOM_VERSION</envar> + + + If this environment variable is set to '2.0', the outdated + pseudo-random number seeding and generation algorithms from + GLib-2.0 are used instead of the new better ones. Use the GLib-2.0 + algorithms only if you have sequences of numbers generated with + Glib-2.0 that you need to reproduce exactly. + + + + + <envar>LIBCHARSET_ALIAS_DIR</envar> + + + Allows to specify a nonstandard location for the + charset.aliases file that is used by the + character set conversion routines. The default location is the + libdir specified at compilation time. + + + + + + +Locale + + +A number of interfaces in GLib depend on the current locale in which +an application is running. Therefore, most GLib-using applications should +call setlocale (LC_ALL, "") to set up the current +locale. + + + +On Windows, in a C program there are several locale concepts +that not necessarily are synchronized. On one hand, there is the +system default ANSI code-page, which determines what encoding is used +for file names handled by the C library's functions and the Win32 +API. (We are talking about the "narrow" functions here that take +character pointers, not the "wide" ones.) + + + +On the other hand, there is the C library's current locale. The +character set (code-page) used by that is not necessarily the same as +the system default ANSI code-page. Strings in this character set are +returned by functions like strftime(). + + + + + +Traps and traces + + +g_trap_free_size +g_trap_realloc_size +g_trap_malloc_size +Some code portions contain trap variables that can be set during debugging +time if GLib has been configured with . +Such traps lead to immediate code halts to examine the current program state +and backtrace. + + + +Currently, the following trap variables exist: + +static volatile gulong g_trap_free_size; +static volatile gulong g_trap_realloc_size; +static volatile gulong g_trap_malloc_size; + +If set to a size > 0, g_free(), +g_realloc() and +g_malloc() will be intercepted if the size +matches the size of the corresponding memory block. This will only work with +g_mem_set_vtable (glib_mem_profiler_table) upon startup +though, because memory profiling is required to match on the memory block sizes. + + +Note that many modern debuggers support conditional breakpoints, which achieve +pretty much the same. E.g. in gdb, you can do + +break g_malloc +condition 1 n_bytes == 20 + +to break only on g_malloc() calls where the size of the allocated memory block +is 20. + + + + +Gdb debugging macros + + +glib ships with a set of python macros for the gdb debugger. These includes pretty +printers for lists, hashtables and gobject types. It also has a backtrace filter +that makes backtraces with signal emissions easier to read. + + + +To use this you need a recent enough gdb that supports python scripting. Gdb 7.0 +should be recent enough, but branches of the "archer" gdb tree as used in Fedora 11 +and Fedora 12 should work too. You then need to install glib in the same prefix as +gdb so that the python gdb autoloaded files get installed in the right place for +gdb to pick up. + + + +General pretty printing should just happen without having to do anything special. +To get the signal emission filtered backtrace you must use the "new-backtrace" command +instead of the standard one. + + + +There is also a new command called gforeach that can be used to apply a command +on each item in a list. E.g. you can do + +gforeach i in some_list_variable: print *(GtkWidget *)l + +Which would print the contents of each widget in a list of widgets. + + + + + +Memory statistics + + +g_mem_profile() will output a summary g_malloc() memory usage, if memory +profiling has been enabled by calling +g_mem_set_vtable (glib_mem_profiler_table) upon startup. + + + +If GLib has been configured with , +then g_slice_debug_tree_statistics() can be called in a debugger to +output details about the memory usage of the slice allocator. + + + + + diff --git a/docs/reference/glib/tmpl/allocators.sgml b/docs/reference/glib/tmpl/allocators.sgml new file mode 100644 index 0000000..191ff8a --- /dev/null +++ b/docs/reference/glib/tmpl/allocators.sgml @@ -0,0 +1,45 @@ + +Memory Allocators + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@name: +@n_preallocs: +@Returns: + + + + + + + +@allocator: + + diff --git a/docs/reference/glib/tmpl/arrays.sgml b/docs/reference/glib/tmpl/arrays.sgml new file mode 100644 index 0000000..e001919 --- /dev/null +++ b/docs/reference/glib/tmpl/arrays.sgml @@ -0,0 +1,220 @@ + +Arrays + + + + + + + + + + + + + + + + + + + + + + + + +@data: +@len: + + + + + + +@zero_terminated: +@clear_: +@element_size: +@Returns: + + + + + + + +@zero_terminated: +@clear_: +@element_size: +@reserved_size: +@Returns: + + + + + + + +@array: +@Returns: + + + + + + + +@array: + + + + + + + +@array: +@Returns: + + + + + + + +@a: +@v: + + + + + + + +@array: +@data: +@len: +@Returns: + + + + + + + +@a: +@v: + + + + + + + +@array: +@data: +@len: +@Returns: + + + + + + + +@a: +@i: +@v: + + + + + + + +@array: +@index_: +@data: +@len: +@Returns: + + + + + + + +@array: +@index_: +@Returns: + + + + + + + +@array: +@index_: +@Returns: + + + + + + + +@array: +@index_: +@length: +@Returns: + + + + + + + +@array: +@compare_func: + + + + + + + +@array: +@compare_func: +@user_data: + + + + + + + +@a: +@t: +@i: + + + + + + + +@array: +@length: +@Returns: + + + + + + + +@array: +@free_segment: +@Returns: + + diff --git a/docs/reference/glib/tmpl/arrays_byte.sgml b/docs/reference/glib/tmpl/arrays_byte.sgml new file mode 100644 index 0000000..59d9d85 --- /dev/null +++ b/docs/reference/glib/tmpl/arrays_byte.sgml @@ -0,0 +1,155 @@ + +Byte Arrays + + + + + + + + + + + + + + + + + + + + + + + + +@data: +@len: + + + + + + +@Returns: + + + + + + + +@reserved_size: +@Returns: + + + + + + + +@array: +@Returns: + + + + + + + +@array: + + + + + + + +@array: +@data: +@len: +@Returns: + + + + + + + +@array: +@data: +@len: +@Returns: + + + + + + + +@array: +@index_: +@Returns: + + + + + + + +@array: +@index_: +@Returns: + + + + + + + +@array: +@index_: +@length: +@Returns: + + + + + + + +@array: +@compare_func: + + + + + + + +@array: +@compare_func: +@user_data: + + + + + + + +@array: +@length: +@Returns: + + + + + + + +@array: +@free_segment: +@Returns: + + diff --git a/docs/reference/glib/tmpl/arrays_pointer.sgml b/docs/reference/glib/tmpl/arrays_pointer.sgml new file mode 100644 index 0000000..dec6dff --- /dev/null +++ b/docs/reference/glib/tmpl/arrays_pointer.sgml @@ -0,0 +1,197 @@ + +Pointer Arrays + + + + + + + + + + + + + + + + + + + + + + + + +@pdata: +@len: + + + + + + +@Returns: + + + + + + + +@reserved_size: +@Returns: + + + + + + + +@element_free_func: +@Returns: + + + + + + + +@array: +@element_free_func: + + + + + + + +@array: +@Returns: + + + + + + + +@array: + + + + + + + +@array: +@data: + + + + + + + +@array: +@data: +@Returns: + + + + + + + +@array: +@index_: +@Returns: + + + + + + + +@array: +@data: +@Returns: + + + + + + + +@array: +@index_: +@Returns: + + + + + + + +@array: +@index_: +@length: + + + + + + + +@array: +@compare_func: + + + + + + + +@array: +@compare_func: +@user_data: + + + + + + + +@array: +@length: + + + + + + + +@array: +@index_: + + + + + + + +@array: +@free_seg: +@Returns: + + + + + + + +@array: +@func: +@user_data: + + diff --git a/docs/reference/glib/tmpl/async_queues.sgml b/docs/reference/glib/tmpl/async_queues.sgml new file mode 100644 index 0000000..79dbec8 --- /dev/null +++ b/docs/reference/glib/tmpl/async_queues.sgml @@ -0,0 +1,242 @@ + +Asynchronous Queues + + +asynchronous communication between threads + + + +Often you need to communicate between different threads. In general +it's safer not to do this by shared memory, but by explicit message +passing. These messages only make sense asynchronously for +multi-threaded applications though, as a synchronous operation could as +well be done in the same thread. + + + +Asynchronous queues are an exception from most other GLib data +structures, as they can be used simultaneously from multiple threads +without explicit locking and they bring their own builtin reference +counting. This is because the nature of an asynchronous queue is that +it will always be used by at least 2 concurrent threads. + + + +For using an asynchronous queue you first have to create one with +g_async_queue_new(). A newly-created queue will get the reference +count 1. Whenever another thread is creating a new reference of (that +is, pointer to) the queue, it has to increase the reference count +(using g_async_queue_ref()). Also, before removing this reference, the +reference count has to be decreased (using +g_async_queue_unref()). After that the queue might no longer exist so +you must not access it after that point. + + + +A thread, which wants to send a message to that queue simply calls +g_async_queue_push() to push the message to the queue. + + + +A thread, which is expecting messages from an asynchronous queue +simply calls g_async_queue_pop() for that queue. If no message is +available in the queue at that point, the thread is now put to sleep +until a message arrives. The message will be removed from the queue +and returned. The functions g_async_queue_try_pop() and +g_async_queue_timed_pop() can be used to only check for the presence +of messages or to only wait a certain time for messages respectively. + + + +For almost every function there exist two variants, one that locks the +queue and one that doesn't. That way you can hold the queue lock +(acquire it with g_async_queue_lock() and release it with +g_async_queue_unlock()) over multiple queue accessing +instructions. This can be necessary to ensure the integrity of the +queue, but should only be used when really necessary, as it can make +your life harder if used unwisely. Normally you should only use the +locking function variants (those without the suffix _unlocked) + + + + + + + + + + + + +The #GAsyncQueue struct is an opaque data structure, which represents +an asynchronous queue. It should only be accessed through the +g_async_queue_* functions. + + + + + + +@Returns: + + + + + + + +@item_free_func: +@Returns: + + + + + +@queue: +@Returns: + + + + + +@queue: + + + + + +@queue: +@data: + + + + + + + +@queue: +@data: +@func: +@user_data: + + + + + +@queue: +@Returns: + + + + + +@queue: +@Returns: + + + + + +@queue: +@end_time: +@Returns: + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@func: +@user_data: + + + + + +@queue: + + + + + +@queue: + + + + + +@queue: + + + + + +@queue: + + + + + +@queue: +@data: + + + + + + + +@queue: +@data: +@func: +@user_data: + + + + + +@queue: +@Returns: + + + + + +@queue: +@Returns: + + + + + +@queue: +@end_time: +@Returns: + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@func: +@user_data: + + diff --git a/docs/reference/glib/tmpl/atomic_operations.sgml b/docs/reference/glib/tmpl/atomic_operations.sgml new file mode 100644 index 0000000..13ca69a --- /dev/null +++ b/docs/reference/glib/tmpl/atomic_operations.sgml @@ -0,0 +1,191 @@ + +Atomic Operations + + +basic atomic integer and pointer operations + + + +The following functions can be used to atomically access integers and +pointers. They are implemented as inline assembler function on most +platforms and use slower fall-backs otherwise. Using them can sometimes +save you from using a performance-expensive #GMutex to protect the +integer or pointer. + + + +The most important usage is reference counting. Using +g_atomic_int_inc() and g_atomic_int_dec_and_test() makes reference +counting a very fast operation. + + + + +You must not directly read integers or pointers concurrently accessed +by multiple threads, but use the atomic accessor functions instead. +That is, always use g_atomic_int_get() and g_atomic_pointer_get() for +read outs. +They provide the neccessary synchonization mechanisms like memory +barriers to access memory locations concurrently. + + + + + +If you are using those functions for anything apart from simple +reference counting, you should really be aware of the implications of +doing that. There are literally thousands of ways to shoot yourself in +the foot. So if in doubt, use a #GMutex. If you don't know, what +memory barriers are, do not use anything but g_atomic_int_inc() and +g_atomic_int_dec_and_test(). + + + + + +It is not safe to set an integer or pointer just by assigning to it, +when it is concurrently accessed by other threads with the following +functions. Use g_atomic_int_compare_and_exchange() or +g_atomic_pointer_compare_and_exchange() respectively. + + + + + + + + +#GMutex +GLib mutual exclusions. + + + + + + + + + + +Reads the value of the integer pointed to by @atomic. Also acts as +a memory barrier. + + +@Returns: the value of *@atomic +@Since: 2.4 + +@atomic: a pointer to an integer + + + + +Sets the value of the integer pointed to by @atomic. +Also acts as a memory barrier. + + +@Since: 2.10 + +@atomic: a pointer to an integer +@newval: the new value + + + + +Atomically adds @val to the integer pointed to by @atomic. +Also acts as a memory barrier. + + +@Since: 2.4 + +@atomic: a pointer to an integer. +@val: the value to add to *@atomic. + + + + +Atomically adds @val to the integer pointed to by @atomic. It returns +the value of *@atomic just before the addition took place. +Also acts as a memory barrier. + + +@Returns: the value of *@atomic before the addition. +@Since: 2.4 + +@atomic: a pointer to an integer. +@val: the value to add to *@atomic. + + + + +Compares @oldval with the integer pointed to by @atomic and +if they are equal, atomically exchanges *@atomic with @newval. +Also acts as a memory barrier. + + +@Returns: %TRUE, if *@atomic was equal @oldval. %FALSE otherwise. +@Since: 2.4 + +@atomic: a pointer to an integer. +@oldval: the assumed old value of *@atomic. +@newval: the new value of *@atomic. + + + + +Reads the value of the pointer pointed to by @atomic. Also acts as +a memory barrier. + + +@Returns: the value to add to *@atomic. +@Since: 2.4 + +@atomic: a pointer to a #gpointer. + + + + +Sets the value of the pointer pointed to by @atomic. +Also acts as a memory barrier. + + +@Since: 2.10 + +@atomic: a pointer to a #gpointer +@newval: the new value + + + + +Compares @oldval with the pointer pointed to by @atomic and +if they are equal, atomically exchanges *@atomic with @newval. +Also acts as a memory barrier. + + +@Returns: %TRUE, if *@atomic was equal @oldval. %FALSE otherwise. +@Since: 2.4 + +@atomic: a pointer to a #gpointer. +@oldval: the assumed old value of *@atomic. +@newval: the new value of *@atomic. + + + + +Atomically increments the integer pointed to by @atomic by 1. + + +@atomic: a pointer to an integer. +@Since: 2.4 + + + + +Atomically decrements the integer pointed to by @atomic by 1. + + +@atomic: a pointer to an integer. +@Returns: %TRUE, if the integer pointed to by @atomic is 0 after +decrementing it. +@Since: 2.4 + + diff --git a/docs/reference/glib/tmpl/base64.sgml b/docs/reference/glib/tmpl/base64.sgml new file mode 100644 index 0000000..e1b9d87 --- /dev/null +++ b/docs/reference/glib/tmpl/base64.sgml @@ -0,0 +1,90 @@ + +Base64 Encoding + + + + + + + + + + + + + + + + + + + + + + + + +@in: +@len: +@break_lines: +@out: +@state: +@save: +@Returns: + + + + + + + +@break_lines: +@out: +@state: +@save: +@Returns: + + + + + + + +@data: +@len: +@Returns: + + + + + + + +@in: +@len: +@out: +@state: +@save: +@Returns: + + + + + + + +@text: +@out_len: +@Returns: + + + + + + + +@text: +@out_len: +@Returns: + + diff --git a/docs/reference/glib/tmpl/bookmarkfile.sgml b/docs/reference/glib/tmpl/bookmarkfile.sgml new file mode 100644 index 0000000..5542b98 --- /dev/null +++ b/docs/reference/glib/tmpl/bookmarkfile.sgml @@ -0,0 +1,552 @@ + +Bookmark file parser + + +parses files containing bookmarks + + + +#GBookmarkFile lets you parse, edit or create files containing bookmarks +to URI, along with some meta-data about the resource pointed by the URI like +its MIME type, the application that is registering the bookmark and the +icon that should be used to represent the bookmark. The data is stored using +the +Desktop Bookmark +Specification. + + + +The syntax of the bookmark files is described in detail inside the Desktop +Bookmark Specification, here is a quick summary: bookmark files use a sub-class +of the +XML Bookmark Exchange Language specification, consisting +of valid UTF-8 encoded XML, under the xbel root element; +each bookmark is stored inside a bookmark element, using +its URI: no relative paths can be used inside a bookmark file. The bookmark +may have a user defined title and description, to be used instead of the URI. +Under the metadata element, with its owner +attribute set to http://freedesktop.org, is stored the +meta-data about a resource pointed by its URI. The meta-data consists of +the resource's MIME type; the applications that have registered a bookmark; +the groups to which a bookmark belongs to; a visibility flag, used to set +the bookmark as "private" to the applications and groups that has it +registered; the URI and MIME type of an icon, to be used when displaying the +bookmark inside a GUI. + + + + + + + + Desktop Bookmarks Spec + + + text/xml + + + + + + Editors + + + + + +]]> + + + +A bookmark file might contain more than one bookmark; each bookmark is accessed +through its URI. + + + +The important caveat of bookmark files is that when you add a new bookmark you +must also add the application that is registering it, using +g_bookmark_file_add_application() or g_bookmark_file_set_app_info(). If a +bookmark has no applications then it won't be dumped when creating the +on disk representation, using g_bookmark_file_to_data() or +g_bookmark_file_to_file(). + + + +The #GBookmarkFile parser was added in GLib 2.12. + + + + + + + + + + + + +The GBookmarkFile struct contains only private data +and should not be used directly. + + + + + +Error domain for bookmark file parsing. Errors in this domain will be +from the #GBookmarkFileError enumeration. See #GError for informations +on error domains. + + + + + + +Error codes returned by bookmark file parsing. + + +@G_BOOKMARK_FILE_ERROR_INVALID_URI: URI was ill-formed +@G_BOOKMARK_FILE_ERROR_INVALID_VALUE: a requested field was not found +@G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED: a requested application did not +register a bookmark +@G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND: a requested URI was not found +@G_BOOKMARK_FILE_ERROR_READ: document was ill formed +@G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was in an +unknown encoding +@G_BOOKMARK_FILE_ERROR_WRITE: an error occurred while writing +@G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND: requested file was not found + + + + + + +@Returns: + + + + + + + +@bookmark: + + + + + + + +@bookmark: +@filename: +@error: +@Returns: + + + + + + + +@bookmark: +@data: +@length: +@error: +@Returns: + + + + + + + +@bookmark: +@file: +@full_path: +@error: +@Returns: + + + + + + + +@bookmark: +@length: +@error: +@Returns: + + + + + + + +@bookmark: +@filename: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@Returns: + + + + + + + +@bookmark: +@uri: +@group: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@name: +@error: +@Returns: + + + + + + + +@bookmark: +@Returns: + + + + + + + +@bookmark: +@length: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@href: +@mime_type: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@length: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@length: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@name: +@exec: +@count: +@stamp: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@title: + + + + + + + +@bookmark: +@uri: +@description: + + + + + + + +@bookmark: +@uri: +@mime_type: + + + + + + + +@bookmark: +@uri: +@is_private: + + + + + + + +@bookmark: +@uri: +@href: +@mime_type: + + + + + + + +@bookmark: +@uri: +@added: + + + + + + + +@bookmark: +@uri: +@groups: +@length: + + + + + + + +@bookmark: +@uri: +@modified: + + + + + + + +@bookmark: +@uri: +@visited: + + + + + + + +@bookmark: +@uri: +@name: +@exec: +@count: +@stamp: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@group: + + + + + + + +@bookmark: +@uri: +@name: +@exec: + + + + + + + +@bookmark: +@uri: +@group: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@name: +@error: +@Returns: + + + + + + + +@bookmark: +@uri: +@error: +@Returns: + + + + + + + +@bookmark: +@old_uri: +@new_uri: +@error: +@Returns: + + diff --git a/docs/reference/glib/tmpl/byte_order.sgml b/docs/reference/glib/tmpl/byte_order.sgml new file mode 100644 index 0000000..3f60fd7 --- /dev/null +++ b/docs/reference/glib/tmpl/byte_order.sgml @@ -0,0 +1,625 @@ + +Byte Order Macros + + +a portable way to convert between different byte orders + + + +These macros provide a portable way to determine the host byte order +and to convert values between different byte orders. + + +The byte order is the order in which bytes are stored to create larger +data types such as the #gint and #glong values. +The host byte order is the byte order used on the current machine. + + +Some processors store the most significant bytes (i.e. the bytes that +hold the largest part of the value) first. These are known as big-endian +processors. + + +Other processors (notably the x86 family) store the most significant byte +last. These are known as little-endian processors. + + +Finally, to complicate matters, some other processors store the bytes in +a rather curious order known as PDP-endian. For a 4-byte word, the 3rd +most significant byte is stored first, then the 4th, then the 1st and finally +the 2nd. + + +Obviously there is a problem when these different processors communicate +with each other, for example over networks or by using binary file formats. +This is where these macros come in. +They are typically used to convert values into a byte order +which has been agreed on for use when communicating between different +processors. The Internet uses what is known as 'network byte order' +as the standard byte order (which is in fact the big-endian byte order). + + +Note that the byte order conversion macros may evaluate their arguments +multiple times, thus you should not use them with arguments which have +side-effects. + + + + + + + + + + + + +The host byte order. +This can be either #G_LITTLE_ENDIAN or #G_BIG_ENDIAN (support for +#G_PDP_ENDIAN may be added in future.) + + + + + + +Specifies one of the possible types of byte order. +See #G_BYTE_ORDER. + + + + + + +Specifies one of the possible types of byte order. +See #G_BYTE_ORDER. + + + + + + +Specifies one of the possible types of byte order (currently unused). +See #G_BYTE_ORDER. + + + + + + +Converts a 32-bit integer value from host to network byte order. + + +@val: a 32-bit integer value in host byte order. +@Returns: @val converted to network byte order. + + + + +Converts a 16-bit integer value from host to network byte order. + + +@val: a 16-bit integer value in host byte order. +@Returns: @val converted to network byte order. + + + + +Converts a 32-bit integer value from network to host byte order. + + +@val: a 32-bit integer value in network byte order. +@Returns: @val converted to host byte order. + + + + +Converts a 16-bit integer value from network to host byte order. + + +@val: a 16-bit integer value in network byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint value from big-endian to host byte order. + + +@val: a #gint value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint value from little-endian to host byte order. + + +@val: a #gint value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint value from host byte order to big-endian. + + +@val: a #gint value in host byte order. +@Returns: @val converted to big-endian byte order. + + + + +Converts a #gint value from host byte order to little-endian. + + +@val: a #gint value in host byte order. +@Returns: @val converted to little-endian byte order. + + + + +Converts a #guint value from big-endian to host byte order. + + +@val: a #guint value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint value from little-endian to host byte order. + + +@val: a #guint value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint value from host byte order to big-endian. + + +@val: a #guint value in host byte order. +@Returns: @val converted to big-endian byte order. + + + + +Converts a #guint value from host byte order to little-endian. + + +@val: a #guint value in host byte order. +@Returns: @val converted to little-endian byte order. + + + + +Converts a #glong value from big-endian to the host byte order. + + +@val: a #glong value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #glong value from little-endian to host byte order. + + +@val: a #glong value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #glong value from host byte order to big-endian. + + +@val: a #glong value in host byte order. +@Returns: @val converted to big-endian byte order. + + + + +Converts a #glong value from host byte order to little-endian. + + +@val: a #glong value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #gulong value from big-endian to host byte order. + + +@val: a #gulong value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gulong value from little-endian to host byte order. + + +@val: a #gulong value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gulong value from host byte order to big-endian. + + +@val: a #gulong value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #gulong value from host byte order to little-endian. + + +@val: a #gulong value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #gsize value from big-endian to the host byte order. + + +@val: a #gsize value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gsize value from little-endian to host byte order. + + +@val: a #gsize value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gsize value from host byte order to big-endian. + + +@val: a #gsize value in host byte order. +@Returns: @val converted to big-endian byte order. + + + + +Converts a #gsize value from host byte order to little-endian. + + +@val: a #gsize value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #gssize value from big-endian to host byte order. + + +@val: a #gssize value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gssize value from little-endian to host byte order. + + +@val: a #gssize value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gssize value from host byte order to big-endian. + + +@val: a #gssize value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #gssize value from host byte order to little-endian. + + +@val: a #gssize value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #gint16 value from big-endian to host byte order. + + +@val: a #gint16 value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint16 value from little-endian to host byte order. + + +@val: a #gint16 value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint16 value from host byte order to big-endian. + + +@val: a #gint16 value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #gint16 value from host byte order to little-endian. + + +@val: a #gint16 value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #guint16 value from big-endian to host byte order. + + +@val: a #guint16 value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint16 value from little-endian to host byte order. + + +@val: a #guint16 value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint16 value from host byte order to big-endian. + + +@val: a #guint16 value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #guint16 value from host byte order to little-endian. + + +@val: a #guint16 value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #gint32 value from big-endian to host byte order. + + +@val: a #gint32 value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint32 value from little-endian to host byte order. + + +@val: a #gint32 value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint32 value from host byte order to big-endian. + + +@val: a #gint32 value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #gint32 value from host byte order to little-endian. + + +@val: a #gint32 value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #guint32 value from big-endian to host byte order. + + +@val: a #guint32 value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint32 value from little-endian to host byte order. + + +@val: a #guint32 value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint32 value from host byte order to big-endian. + + +@val: a #guint32 value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #guint32 value from host byte order to little-endian. + + +@val: a #guint32 value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #gint64 value from big-endian to host byte order. + + +@val: a #gint64 value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint64 value from little-endian to host byte order. + + +@val: a #gint64 value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #gint64 value from host byte order to big-endian. + + +@val: a #gint64 value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #gint64 value from host byte order to little-endian. + + +@val: a #gint64 value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #guint64 value from big-endian to host byte order. + + +@val: a #guint64 value in big-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint64 value from little-endian to host byte order. + + +@val: a #guint64 value in little-endian byte order. +@Returns: @val converted to host byte order. + + + + +Converts a #guint64 value from host byte order to big-endian. + + +@val: a #guint64 value in host byte order. +@Returns: @val converted to big-endian. + + + + +Converts a #guint64 value from host byte order to little-endian. + + +@val: a #guint64 value in host byte order. +@Returns: @val converted to little-endian. + + + + +Converts a #guint16 value between big-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint16 value in big-endian or pdp-endian byte order. +@Returns: @val converted to the opposite byte order. + + + + +Converts a #guint16 value between little-endian and big-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint16 value in little-endian or big-endian byte order. +@Returns: @val converted to the opposite byte order. + + + + +Converts a #guint16 value between little-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint16 value in little-endian or pdp-endian byte order. +@Returns: @val converted to the opposite byte order. + + + + +Converts a #guint32 value between big-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint32 value in big-endian or pdp-endian byte order. +@Returns: @val converted to the opposite byte order. + + + + +Converts a #guint32 value between little-endian and big-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint32 value in little-endian or big-endian byte order. +@Returns: @val converted to the opposite byte order. + + + + +Converts a #guint32 value between little-endian and pdp-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint32 value in little-endian or pdp-endian byte order. +@Returns: @val converted to the opposite byte order. + + + + +Converts a #guint64 value between little-endian and big-endian byte order. +The conversion is symmetric so it can be used both ways. + + +@val: a #guint64 value in little-endian or big-endian byte order. +@Returns: @val converted to the opposite byte order. + + diff --git a/docs/reference/glib/tmpl/caches.sgml b/docs/reference/glib/tmpl/caches.sgml new file mode 100644 index 0000000..ed18018 --- /dev/null +++ b/docs/reference/glib/tmpl/caches.sgml @@ -0,0 +1,115 @@ + +Caches + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@value_new_func: +@value_destroy_func: +@key_dup_func: +@key_destroy_func: +@hash_key_func: +@hash_value_func: +@key_equal_func: +@Returns: + + + + + + + +@cache: +@key: +@Returns: + + + + + + + +@cache: +@value: + + + + + + + +@cache: + + + + + + + +@cache: +@func: +@user_data: + + + + + + + +@cache: +@func: +@user_data: + + + + + + + +@value: + + + + + + + +@value: +@Returns: + + + + + + + +@key: +@Returns: + + diff --git a/docs/reference/glib/tmpl/checksum.sgml b/docs/reference/glib/tmpl/checksum.sgml new file mode 100644 index 0000000..69640b4 --- /dev/null +++ b/docs/reference/glib/tmpl/checksum.sgml @@ -0,0 +1,130 @@ + +Data Checksums + + + + + + + + + + + + + + + + + + + + + + + + +@G_CHECKSUM_MD5: +@G_CHECKSUM_SHA1: +@G_CHECKSUM_SHA256: + + + + + + +@checksum_type: +@Returns: + + + + + + + + + + + + + +@checksum_type: +@Returns: + + + + + + + +@checksum: +@Returns: + + + + + + + +@checksum: + + + + + + + +@checksum: + + + + + + + +@checksum: +@data: +@length: + + + + + + + +@checksum: +@Returns: + + + + + + + +@checksum: +@buffer: +@digest_len: + + + + + + + +@checksum_type: +@data: +@length: +@Returns: + + + + + + + +@checksum_type: +@str: +@length: +@Returns: + + diff --git a/docs/reference/glib/tmpl/completion.sgml b/docs/reference/glib/tmpl/completion.sgml new file mode 100644 index 0000000..f5d5c16 --- /dev/null +++ b/docs/reference/glib/tmpl/completion.sgml @@ -0,0 +1,126 @@ + +Automatic String Completion + + + + + + + + + + + + + + + + + + + + + + + + +@items: +@func: +@prefix: +@cache: +@strncmp_func: + + + + + + +@func: +@Returns: + + + + + + + +@Param1: +@Returns: + + + + + + + +@cmp: +@items: + + + + + + + +@cmp: +@items: + + + + + + + +@cmp: + + + + + + + +@cmp: +@prefix: +@new_prefix: +@Returns: + + + + + + + +@cmp: +@prefix: +@new_prefix: +@Returns: + + + + + + + +@cmp: +@strncmp_func: + + + + + + + +@s1: +@s2: +@n: +@Returns: + + + + + + + +@cmp: + + diff --git a/docs/reference/glib/tmpl/conversions.sgml b/docs/reference/glib/tmpl/conversions.sgml new file mode 100644 index 0000000..b28ec41 --- /dev/null +++ b/docs/reference/glib/tmpl/conversions.sgml @@ -0,0 +1,391 @@ + +Character Set Conversion + + +convert strings between different character sets using iconv() + + + + + + + + File Name Encodings + + + Historically, Unix has not had a defined encoding for file + names: a file name is valid as long as it does not have path + separators in it ("/"). However, displaying file names may + require conversion: from the character set in which they were + created, to the character set in which the application + operates. Consider the Spanish file name + "Presentación.sxi". If the + application which created it uses ISO-8859-1 for its encoding, + then the actual file name on disk would look like this: + + + +Character: P r e s e n t a c i ó n . s x i +Hex code: 50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69 + + + + However, if the application use UTF-8, the actual file name on + disk would look like this: + + + +Character: P r e s e n t a c i ó n . s x i +Hex code: 50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69 + + + + Glib uses UTF-8 for its strings, and GUI toolkits like GTK+ + that use Glib do the same thing. If you get a file name from + the file system, for example, from + readdir(3) or from g_dir_read_name(), + and you wish to display the file name to the user, you + will need to convert it into UTF-8. The + opposite case is when the user types the name of a file he + wishes to save: the toolkit will give you that string in + UTF-8 encoding, and you will need to convert it to the + character set used for file names before you can create the + file with open(2) or + fopen(3). + + + + By default, Glib assumes that file names on disk are in UTF-8 + encoding. This is a valid assumption for file systems which + were created relatively recently: most applications use UTF-8 + encoding for their strings, and that is also what they use for + the file names they create. However, older file systems may + still contain file names created in "older" encodings, such as + ISO-8859-1. In this case, for compatibility reasons, you may + want to instruct Glib to use that particular encoding for file + names rather than UTF-8. You can do this by specifying the + encoding for file names in the G_FILENAME_ENCODING + environment variable. For example, if your installation uses + ISO-8859-1 for file names, you can put this in your + ~/.profile: + + + +export G_FILENAME_ENCODING=ISO-8859-1 + + + + Glib provides the functions g_filename_to_utf8() + and g_filename_from_utf8() + to perform the necessary conversions. These functions convert + file names from the encoding specified in + G_FILENAME_ENCODING to UTF-8 and vice-versa. + illustrates how + these functions are used to convert between UTF-8 and the + encoding for file names in the file system. + + +
+ Conversion between File Name Encodings + +
+ + + Checklist for Application Writers + + + This section is a practical summary of the detailed + description above. You can use this as a checklist of + things to do to make sure your applications process file + name encodings correctly. + + + + + + If you get a file name from the file system from a + function such as readdir(3) or + gtk_file_chooser_get_filename(), + you do not need to do any conversion to pass that + file name to functions like open(2), + rename(2), or + fopen(3) — those are "raw" + file names which the file system understands. + + + + + + If you need to display a file name, convert it to UTF-8 + first by using g_filename_to_utf8(). + If conversion fails, display a string like + "Unknown file name". Do + not convert this string back into the + encoding used for file names if you wish to pass it to + the file system; use the original file name instead. + For example, the document window of a word processor + could display "Unknown file name" in its title bar but + still let the user save the file, as it would keep the + raw file name internally. This can happen if the user + has not set the G_FILENAME_ENCODING + environment variable even though he has files whose + names are not encoded in UTF-8. + + + + + + If your user interface lets the user type a file name + for saving or renaming, convert it to the encoding used + for file names in the file system by using g_filename_from_utf8(). + Pass the converted file name to functions like + fopen(3). If conversion fails, ask + the user to enter a different file name. This can + happen if the user types Japanese characters when + G_FILENAME_ENCODING is set to + ISO-8859-1, for example. + + + + +
+ + + + + + + + + + + + + + +@str: +@len: +@to_codeset: +@from_codeset: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + + + + +@str: +@len: +@to_codeset: +@from_codeset: +@fallback: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + +The GIConv struct wraps an +iconv() conversion descriptor. It contains private data +and should only be accessed using the following functions. + + + + + + + + +@str: +@len: +@converter: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + +Error domain for character set conversions. Errors in this domain will +be from the #GConvertError enumeration. See #GError for information on +error domains. + + + + + + + + + +@to_codeset: +@from_codeset: +@Returns: + + + + + + + +@converter: +@inbuf: +@inbytes_left: +@outbuf: +@outbytes_left: +@Returns: + + + + + + + +@converter: +@Returns: + + + + + + + +@opsysstring: +@len: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + + + + +@opsysstring: +@len: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + + + + +@utf8string: +@len: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + + + + +@uri: +@hostname: +@error: +@Returns: + + + + + + + +@filename: +@hostname: +@error: +@Returns: + + + + + + + +@charsets: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@utf8string: +@len: +@bytes_read: +@bytes_written: +@error: +@Returns: + + + + +Error codes returned by character set conversion routines. + + +@G_CONVERT_ERROR_NO_CONVERSION: Conversion between the requested character sets +is not supported. +@G_CONVERT_ERROR_ILLEGAL_SEQUENCE: Invalid byte sequence in conversion input. +@G_CONVERT_ERROR_FAILED: Conversion failed for some reason. +@G_CONVERT_ERROR_PARTIAL_INPUT: Partial character sequence at end of input. +@G_CONVERT_ERROR_BAD_URI: URI is invalid. +@G_CONVERT_ERROR_NOT_ABSOLUTE_PATH: Pathname is not an absolute path. + + + + + + +@charset: +@Returns: + + + + + diff --git a/docs/reference/glib/tmpl/datalist.sgml b/docs/reference/glib/tmpl/datalist.sgml new file mode 100644 index 0000000..f41a613 --- /dev/null +++ b/docs/reference/glib/tmpl/datalist.sgml @@ -0,0 +1,185 @@ + +Keyed Data Lists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@datalist: + + + + + + + +@dl: +@q: +@d: + + + + + + + +@datalist: +@key_id: +@data: +@destroy_func: + + + + + + + +@datalist: +@key_id: +@Returns: + + + + + + + +@dl: +@q: + + + + + + + +@datalist: +@key_id: +@Returns: + + + + + + + +@dl: +@k: +@d: + + + + + + + +@dl: +@k: +@d: +@f: + + + + + + + +@dl: +@k: + + + + + + + +@dl: +@k: + + + + + + + +@dl: +@k: + + + + + + + +@datalist: +@func: +@user_data: + + + + + + + +@datalist: + + + + + + + +@datalist: +@flags: + + + + + + + +@datalist: +@flags: + + + + + + + +@datalist: +@Returns: + + + + + + + + + diff --git a/docs/reference/glib/tmpl/datasets.sgml b/docs/reference/glib/tmpl/datasets.sgml new file mode 100644 index 0000000..1ce7f4f --- /dev/null +++ b/docs/reference/glib/tmpl/datasets.sgml @@ -0,0 +1,155 @@ + +Datasets + + + + + + + + + + + + + + + + + + + + + + + + +@l: +@k: +@d: + + + + + + + +@dataset_location: +@key_id: +@data: +@destroy_func: + + + + + + + +@data: + + + + + + + +@dataset_location: +@key_id: +@Returns: + + + + + + + +@l: +@k: + + + + + + + +@dataset_location: +@key_id: +@Returns: + + + + + + + +@l: +@k: +@d: + + + + + + + +@l: +@k: +@d: +@f: + + + + + + + +@l: +@k: + + + + + + + +@l: +@k: + + + + + + + +@l: +@k: + + + + + + + +@dataset_location: +@func: +@user_data: + + + + + + + +@key_id: +@data: +@user_data: + + + + + + + +@dataset_location: + + diff --git a/docs/reference/glib/tmpl/date.sgml b/docs/reference/glib/tmpl/date.sgml new file mode 100644 index 0000000..5d2610b --- /dev/null +++ b/docs/reference/glib/tmpl/date.sgml @@ -0,0 +1,797 @@ + +Date and Time Functions + + +calendrical calculations and miscellaneous time stuff + + + +The #GDate data structure represents a day between January 1, Year 1, +and sometime a few thousand years in the future (right now it will go +to the year 65535 or so, but g_date_set_parse() only parses up to the +year 8000 or so - just count on "a few thousand"). #GDate is meant to +represent everyday dates, not astronomical dates or historical dates +or ISO timestamps or the like. It extrapolates the current Gregorian +calendar forward and backward in time; there is no attempt to change +the calendar to match time periods or locations. #GDate does not store +time information; it represents a day. + + + +The #GDate implementation has several nice features; it is only a +64-bit struct, so storing large numbers of dates is very efficient. It +can keep both a Julian and day-month-year representation of the date, +since some calculations are much easier with one representation or the +other. A Julian representation is simply a count of days since some +fixed day in the past; for #GDate the fixed day is January 1, 1 AD. +("Julian" dates in the #GDate API aren't really Julian dates in the +technical sense; technically, Julian dates count from the start of the +Julian period, Jan 1, 4713 BC). + + + +#GDate is simple to use. First you need a "blank" date; you can get a +dynamically allocated date from g_date_new(), or you can declare an +automatic variable or array and initialize it to a sane state by +calling g_date_clear(). A cleared date is sane; it's safe to call +g_date_set_dmy() and the other mutator functions to initialize the +value of a cleared date. However, a cleared date is initially +invalid, meaning that it doesn't represent a day +that exists. It is undefined to call any of the date calculation +routines on an invalid date. If you obtain a date from a user or other +unpredictable source, you should check its validity with the +g_date_valid() predicate. g_date_valid() is also used to check for +errors with g_date_set_parse() and other functions that can +fail. Dates can be invalidated by calling g_date_clear() again. + + + +It is very important to use the API to access the #GDate +struct. Often only the day-month-year or only the Julian +representation is valid. Sometimes neither is valid. Use the API. + + + +GLib doesn't contain any time-manipulation functions; however, there +is a #GTime typedef and a #GTimeVal struct which represents a more +precise time (with microseconds). You can request the current time as +a #GTimeVal with g_get_current_time(). + + + + + + + + + + + + +Number of microseconds in one second (1 million). This macro is provided for +code readability. + + + + + + +Represents a precise time, with seconds and microseconds. +Similar to the struct timeval returned by +the gettimeofday() UNIX call. + + +@tv_sec: seconds +@tv_usec: microseconds + + + + + +@result: + + + + +Pauses the current thread for the given number of microseconds. There +are 1 million microseconds per second (represented by the +#G_USEC_PER_SEC macro). g_usleep() may have limited precision, +depending on hardware and operating system; don't rely on the exact +length of the sleep. + + +@microseconds: number of microseconds to pause + + + + + + + +@time_: +@microseconds: + + + + + + + +@iso_date: +@time_: +@Returns: + + + + + + + +@time_: +@Returns: + + + + +Represents a day between January 1, Year 1 and a few thousand years in +the future. None of its members should be accessed directly. If the +GDate is obtained from g_date_new(), it will +be safe to mutate but invalid and thus not safe for calendrical computations. +If it's declared on the stack, it will contain garbage so must be +initialized with g_date_clear(). g_date_clear() makes the date invalid +but sane. An invalid date doesn't represent a day, it's "empty." A +date becomes valid after you set it to a Julian day or you set a day, +month, and year. + + +@julian_days: the Julian representation of the date +@julian: this bit is set if @julian_days is valid +@dmy: this is set if @day, @month and @year are valid +@day: the day of the day-month-year representation of the date, as + a number between 1 and 31 +@month: the day of the day-month-year representation of the date, as + a number between 1 and 12 +@year: the day of the day-month-year representation of the date + + + +Simply a replacement for time_t. It has been deprected +since it is not equivalent to time_t +on 64-bit platforms with a 64-bit time_t. +Unrelated to #GTimer. + + + + +Note that GTime is defined to always be a 32bit integer, +unlike time_t which may be 64bit on some systems. +Therefore, GTime will overflow in the year 2038, and +you cannot use the address of a GTime variable as argument +to the UNIX time() function. Instead, do the following: + + +time_t ttime; +GTime gtime; + +time (&ttime); +gtime = (GTime)ttime; + + + + + + + +This enumeration isn't used in the API, but may be useful if you need +to mark a number as a day, month, or year. + + +@G_DATE_DAY: a day +@G_DATE_MONTH: a month +@G_DATE_YEAR: a year + + + +Integer representing a day of the month; between 1 and +31. #G_DATE_BAD_DAY represents an invalid day of the month. + + + + + +Enumeration representing a month; values are #G_DATE_JANUARY, +#G_DATE_FEBRUARY, etc. #G_DATE_BAD_MONTH is the invalid value. + + +@G_DATE_BAD_MONTH: invalid value +@G_DATE_JANUARY: January +@G_DATE_FEBRUARY: February +@G_DATE_MARCH: March +@G_DATE_APRIL: April +@G_DATE_MAY: May +@G_DATE_JUNE: June +@G_DATE_JULY: July +@G_DATE_AUGUST: August +@G_DATE_SEPTEMBER: September +@G_DATE_OCTOBER: October +@G_DATE_NOVEMBER: November +@G_DATE_DECEMBER: December + + + +Integer representing a year; #G_DATE_BAD_YEAR is the invalid +value. The year must be 1 or higher; negative (BC) years are not +allowed. The year is represented with four digits. + + + + + +Enumeration representing a day of the week; #G_DATE_MONDAY, +#G_DATE_TUESDAY, etc. #G_DATE_BAD_WEEKDAY is an invalid weekday. + + +@G_DATE_BAD_WEEKDAY: invalid value +@G_DATE_MONDAY: Monday +@G_DATE_TUESDAY: Tuesday +@G_DATE_WEDNESDAY: Wednesday +@G_DATE_THURSDAY: Thursday +@G_DATE_FRIDAY: Friday +@G_DATE_SATURDAY: Saturday +@G_DATE_SUNDAY: Sunday + + + +Represents an invalid #GDateDay. + + + + + + +Represents an invalid Julian day number. + + + + + + +Represents an invalid year. + + + + + + +Allocates a #GDate and initializes it to a sane state. The new date will +be cleared (as if you'd called g_date_clear()) but invalid (it won't +represent an existing day). Free the return value with g_date_free(). + + +@Returns: a newly-allocated #GDate + + + + +Like g_date_new(), but also sets the value of the date. Assuming the +day-month-year triplet you pass in represents an existing day, the +returned date will be valid. + + +@day: day of the month +@month: month of the year +@year: year +@Returns: a newly-allocated #GDate initialized with @day, @month, and @year + + + + +Like g_date_new(), but also sets the value of the date. Assuming the +Julian day number you pass in is valid (greater than 0, less than an +unreasonably large number), the returned date will be valid. + + +@julian_day: days since January 1, Year 1 +@Returns: a newly-allocated #GDate initialized with @julian_day + + + + +Initializes one or more #GDate structs to a sane but invalid +state. The cleared dates will not represent an existing date, but will +not contain garbage. Useful to init a date declared on the stack. +Validity can be tested with g_date_valid(). + + +@date: pointer to one or more dates to clear +@n_dates: number of dates to clear + + + + +Frees a #GDate returned from g_date_new(). + + +@date: a #GDate + + + + +Sets the day of the month for a #GDate. If the resulting day-month-year +triplet is invalid, the date will be invalid. + + +@date: a #GDate +@day: day to set + + + + +Sets the month of the year for a #GDate. If the resulting +day-month-year triplet is invalid, the date will be invalid. + + +@date: a #GDate +@month: month to set + + + + +Sets the year for a #GDate. If the resulting day-month-year triplet is +invalid, the date will be invalid. + + +@date: a #GDate +@year: year to set + + + + +Sets the value of a #GDate from a day, month, and year. The day-month-year +triplet must be valid; if you aren't sure it is, call g_date_valid_dmy() to +check before you set it. + + +@date: a #GDate +@day: day +@month: month +@y: year + + + + +Sets the value of a #GDate from a Julian day number. + + +@date: a #GDate +@julian_date: Julian day number (days since January 1, Year 1) + + + + + + + +@date: +@time_: + + + + + + + +@date: +@timet: + + + + + + + +@date: +@timeval: + + + + +Parses a user-inputted string @str, and try to figure out what date it +represents, taking the current locale +into account. If the string is successfully parsed, the date will be +valid after the call. Otherwise, it will be invalid. You should check +using g_date_valid() to see whether the parsing succeeded. + + + +This function is not appropriate for file formats and the like; it +isn't very precise, and its exact behavior varies with the +locale. It's intended to be a heuristic routine that guesses what the +user means by a given string (and it does work pretty well in that +capacity). + + +@date: a #GDate to fill in +@str: string to parse + + + + +Increments a date some number of days. To move forward by weeks, add +weeks*7 days. The date must be valid. + + +@date: a #GDate to increment +@n_days: number of days to move the date forward + + + + +Moves a date some number of days into the past. To move by weeks, just +move by weeks*7 days. The date must be valid. + + +@date: a #GDate to decrement +@n_days: number of days to move + + + + +Increments a date by some number of months. If the day of the month is +greater than 28, this routine may change the day of the month (because +the destination month may not have the current day in it). The date +must be valid. + + +@date: a #GDate to increment +@n_months: number of months to move forward + + + + +Moves a date some number of months into the past. If the current day of +the month doesn't exist in the destination month, the day of the month +may change. The date must be valid. + + +@date: a #GDate to decrement +@n_months: number of months to move + + + + +Increments a date by some number of years. If the date is February 29, +and the destination year is not a leap year, the date will be changed +to February 28. The date must be valid. + + +@date: a #GDate to increment +@n_years: number of years to move forward + + + + +Moves a date some number of years into the past. If the current day +doesn't exist in the destination year (i.e. it's February 29 and you +move to a non-leap-year) then the day is changed to February 29. The date +must be valid. + + +@date: a #GDate to decrement +@n_years: number of years to move + + + + +Computes the number of days between two dates. +If @date2 is prior to @date1, the returned value is negative. +Both dates must be valid. + + +@date1: the first date +@date2: the second date +@Returns: the number of days between @date1 and @date2 + + + + +qsort()-style comparsion function for dates. Both +dates must be valid. + + +@lhs: first date to compare +@rhs: second date to compare +@Returns: 0 for equal, less than zero if @lhs is less than @rhs, + greater than zero if @lhs is greater than @rhs + + + + +If @date is prior to @min_date, sets @date equal to @min_date. +If @date falls after @max_date, sets @date equal to @max_date. +Otherwise, @date is unchanged. +Either of @min_date and @max_date may be %NULL. All non-%NULL dates +must be valid. + + +@date: a #GDate to clamp +@min_date: minimum accepted value for @date +@max_date: maximum accepted value for @date + + + + +Checks if @date1 is less than or equal to @date2, +and swap the values if this is not the case. + + +@date1: the first date +@date2: the second date + + + + +Returns the day of the month. The date must be valid. + + +@date: a #GDate to extract the day of the month from +@Returns: day of the month + + + + +Returns the month of the year. The date must be valid. + + +@date: a #GDate to get the month from +@Returns: month of the year as a #GDateMonth + + + + +Returns the year of a #GDate. The date must be valid. + + +@date: a #GDate +@Returns: year in which the date falls + + + + +Returns the Julian day or "serial number" of the #GDate. The +Julian day is simply the number of days since January 1, Year 1; i.e., +January 1, Year 1 is Julian day 1; January 2, Year 1 is Julian day 2, +etc. The date must be valid. + + +@date: a #GDate to extract the Julian day from +@Returns: Julian day + + + + +Returns the day of the week for a #GDate. The date must be valid. + + +@date: a #GDate. +@Returns: day of the week as a #GDateWeekday. + + + + +Returns the day of the year, where Jan 1 is the first day of the +year. The date must be valid. + + +@date: a #GDate to extract day of year from +@Returns: day of the year + + + + +Returns the number of days in a month, taking leap years into account. + + +@month: month +@year: year +@Returns: number of days in @month during the @year + + + + +Returns %TRUE if the date is on the first of a month. The date must be valid. + + +@date: a #GDate to check +@Returns: %TRUE if the date is the first of the month + + + + +Returns %TRUE if the date is the last day of the month. The date must be valid. + + +@date: a #GDate to check +@Returns: %TRUE if the date is the last day of the month + + + + +Returns %TRUE if the year is a leap year. +For the purposes of this function, leap year is every year divisible by +4 unless that year is divisible by 100. If it is divisible by 100 it would +be a leap year only if that year is also divisible by 400. + + +@year: year to check +@Returns: %TRUE if the year is a leap year + + + + +Returns the week of the year, where weeks are understood to start on +Monday. If the date is before the first Monday of the year, return +0. The date must be valid. + + +@date: a #GDate +@Returns: week of the year + + + + +Returns the number of weeks in the year, where weeks are taken to start +on Monday. Will be 52 or 53. The date must be valid. (Years always have 52 +7-day periods, plus 1 or 2 extra days depending on whether it's a leap +year. This function is basically telling you how many Mondays are in +the year, i.e. there are 53 Mondays if one of the extra days happens +to be a Monday.) + + +@year: a year +@Returns: number of Mondays in the year + + + + +Returns the week of the year during which this date falls, if weeks +are understood to being on Sunday. The date must be valid. Can return 0 if +the day is before the first Sunday of the year. + + +@date: a #GDate +@Returns: week number + + + + +Returns the number of weeks in the year, where weeks are taken to start +on Sunday. Will be 52 or 53. The date must be valid. (Years always have 52 +7-day periods, plus 1 or 2 extra days depending on whether it's a leap +year. This function is basically telling you how many Sundays are in +the year, i.e. there are 53 Sundays if one of the extra days happens +to be a Sunday.) + + +@year: year to count weeks in +@Returns: number of weeks + + + + + + + +@date: +@Returns: + + + + +Generates a printed representation of the date, in a +locale-specific way. Works just like +the platform's C library strftime() function, but only accepts date-related +formats; time-related formats give undefined results. Date must be valid. +Unlike strftime() (which uses the locale encoding), works on a UTF-8 format +string and stores a UTF-8 result. + + + +This function does not provide any conversion specifiers in addition +to those implemented by the platform's C library. For example, don't +expect that using g_date_strftime() would make the %F provided by the C99 +strftime() work on Windows where the C library only complies to C89. + + +@s: destination buffer +@slen: buffer size +@format: format string +@date: valid #GDate +@Returns: number of characters written to the buffer, or 0 the buffer was too small + + + + +Fills in the date-related bits of a struct tm +using the @date value. Initializes the non-date parts with something +sane but meaningless. + + +@date: a #GDate to set the struct tm from. +@tm: struct tm to fill. + + + + +Returns %TRUE if the #GDate represents an existing day. The date must not +contain garbage; it should have been initialized with g_date_clear() +if it wasn't allocated by one of the g_date_new() variants. + + +@date: a #GDate to check +@Returns: Whether the date is valid + + + + +Returns %TRUE if the day of the month is valid (a day is valid if it's +between 1 and 31 inclusive). + + +@day: day to check +@Returns: %TRUE if the day is valid + + + + +Returns %TRUE if the month value is valid. The 12 #GDateMonth +enumeration values are the only valid months. + + +@month: month +@Returns: %TRUE if the month is valid + + + + +Returns %TRUE if the year is valid. Any year greater than 0 is valid, +though there is a 16-bit limit to what #GDate will understand. + + +@year: year +@Returns: %TRUE if the year is valid + + + + +Returns %TRUE if the day-month-year triplet forms a valid, existing day +in the range of days #GDate understands (Year 1 or later, no more than +a few thousand years in the future). + + +@day: day +@month: month +@year: year +@Returns: %TRUE if the date is a valid one + + + + +Returns %TRUE if the Julian day is valid. Anything greater than zero +is basically a valid Julian, though there is a 32-bit limit. + + +@julian_date: Julian day to check +@Returns: %TRUE if the Julian day is valid + + + + +Returns %TRUE if the weekday is valid. The seven #GDateWeekday enumeration +values are the only valid weekdays. + + +@weekday: weekday +@Returns: %TRUE if the weekday is valid + + diff --git a/docs/reference/glib/tmpl/error_reporting.sgml b/docs/reference/glib/tmpl/error_reporting.sgml new file mode 100644 index 0000000..fc3284c --- /dev/null +++ b/docs/reference/glib/tmpl/error_reporting.sgml @@ -0,0 +1,523 @@ + +Error Reporting + + +a system for reporting errors + + + + +GLib provides a standard method of reporting errors from a called function to +the calling code. (This is the same problem solved by exceptions in other +languages.) It's important to understand that this method is both a +data type (the #GError object) and a set of +rules. If you use #GError incorrectly, then your code will not +properly interoperate with other code that uses #GError, and users of your API +will probably get confused. + + + +First and foremost: #GError should only be used to report +recoverable runtime errors, never to report programming errors. If +the programmer has screwed up, then you should use g_warning(), +g_return_if_fail(), g_assert(), g_error(), or some similar facility. +(Incidentally, remember that the g_error() function should +only be used for programming errors, it should not be used +to print any error reportable via #GError.) + + + +Examples of recoverable runtime errors are "file not found" or "failed to parse +input." Examples of programming errors are "NULL passed to strcmp()" or +"attempted to free the same pointer twice." These two kinds of errors are +fundamentally different: runtime errors should be handled or reported to the +user, programming errors should be eliminated by fixing the bug in the program. +This is why most functions in GLib and GTK+ do not use the #GError facility. + + + +Functions that can fail take a return location for a #GError as their last argument. +For example: + +gboolean g_file_get_contents (const gchar *filename, + gchar **contents, + gsize *length, + GError **error); + +If you pass a non-%NULL value for the error argument, it should +point to a location where an error can be placed. For example: + +gchar *contents; +GError *err = NULL; +g_file_get_contents ("foo.txt", &contents, NULL, &err); +g_assert ((contents == NULL && err != NULL) || (contents != NULL && err == NULL)); +if (err != NULL) + { + /* Report error to user, and free error */ + g_assert (contents == NULL); + fprintf (stderr, "Unable to read file: %s\n", err->message); + g_error_free (err); + } +else + { + /* Use file contents */ + g_assert (contents != NULL); + } + +Note that err != NULL in this example is a +reliable indicator of whether +g_file_get_contents() failed. Additionally, g_file_get_contents() returns +a boolean which indicates whether it was successful. + + + +Because g_file_get_contents() returns %FALSE on failure, if you are only +interested in whether it failed and don't need to display an error message, you +can pass %NULL for the error argument: + +if (g_file_get_contents ("foo.txt", &contents, NULL, NULL)) /* ignore errors */ + /* no error occurred */ ; +else + /* error */ ; + + + + +The #GError object contains three fields: domain indicates +the module the error-reporting function is located in, code +indicates the specific error that occurred, and message is a +user-readable error message with as many details as possible. Several functions +are provided to deal with an error received from a called function: +g_error_matches() returns %TRUE if the error matches a given domain and code, +g_propagate_error() copies an error into an error location (so the calling +function will receive it), and g_clear_error() clears an error location by +freeing the error and resetting the location to %NULL. To display an error to the +user, simply display error->message, perhaps along with +additional context known only to the calling function (the file being opened, or +whatever -- though in the g_file_get_contents() case, +error->message already contains a filename). + + + +When implementing a function that can report errors, the basic tool is +g_set_error(). Typically, if a fatal error occurs you want to g_set_error(), +then return immediately. g_set_error() does nothing if the error location passed +to it is %NULL. Here's an example: + +gint +foo_open_file (GError **error) +{ + gint fd; + + fd = open ("file.txt", O_RDONLY); + + if (fd < 0) + { + g_set_error (error, + FOO_ERROR, /* error domain */ + FOO_ERROR_BLAH, /* error code */ + "Failed to open file: %s", /* error message format string */ + g_strerror (errno)); + return -1; + } + else + return fd; +} + + + + +Things are somewhat more complicated if you yourself call another function that +can report a #GError. If the sub-function indicates fatal errors in some way +other than reporting a #GError, such as by returning %TRUE on success, you can +simply do the following: + +gboolean +my_function_that_can_fail (GError **err) +{ + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + if (!sub_function_that_can_fail (err)) + { + /* assert that error was set by the sub-function */ + g_assert (err == NULL || *err != NULL); + return FALSE; + } + + /* otherwise continue, no error occurred */ + g_assert (err == NULL || *err == NULL); +} + + + + +If the sub-function does not indicate errors other than by reporting a #GError, +you need to create a temporary #GError since the passed-in one may be %NULL. +g_propagate_error() is intended for use in this case. + +gboolean +my_function_that_can_fail (GError **err) +{ + GError *tmp_error; + + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + tmp_error = NULL; + sub_function_that_can_fail (&tmp_error); + + if (tmp_error != NULL) + { + /* store tmp_error in err, if err != NULL, + * otherwise call g_error_free() on tmp_error + */ + g_propagate_error (err, tmp_error); + return FALSE; + } + + /* otherwise continue, no error occurred */ +} + + + + +Error pileups are always a bug. For example, this code is incorrect: + +gboolean +my_function_that_can_fail (GError **err) +{ + GError *tmp_error; + + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + tmp_error = NULL; + sub_function_that_can_fail (&tmp_error); + other_function_that_can_fail (&tmp_error); + + if (tmp_error != NULL) + { + g_propagate_error (err, tmp_error); + return FALSE; + } +} + +tmp_error should be checked immediately after +sub_function_that_can_fail(), and either cleared or propagated upward. The rule +is: after each error, you must either handle the error, or return it to the +calling function. Note that passing %NULL for the error location is the +equivalent of handling an error by always doing nothing about it. So the +following code is fine, assuming errors in sub_function_that_can_fail() are not +fatal to my_function_that_can_fail(): + +gboolean +my_function_that_can_fail (GError **err) +{ + GError *tmp_error; + + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + sub_function_that_can_fail (NULL); /* ignore errors */ + + tmp_error = NULL; + other_function_that_can_fail (&tmp_error); + + if (tmp_error != NULL) + { + g_propagate_error (err, tmp_error); + return FALSE; + } +} + + + + +Note that passing %NULL for the error location ignores +errors; it's equivalent to try { sub_function_that_can_fail (); } catch +(...) {} in C++. It does not mean to leave errors +unhandled; it means to handle them by doing nothing. + + + +Error domains and codes are conventionally named as follows: + + + +The error domain is called +<NAMESPACE>_<MODULE>_ERROR, for example +%G_SPAWN_ERROR or %G_THREAD_ERROR: + +#define G_SPAWN_ERROR g_spawn_error_quark () + +GQuark +g_spawn_error_quark (void) +{ + return g_quark_from_static_string ("g-spawn-error-quark"); +} + + + + + +The error codes are in an enumeration called +<Namespace><Module>Error; for example, +#GThreadError or #GSpawnError. + + + + +Members of the error code enumeration are called <NAMESPACE>_<MODULE>_ERROR_<CODE>, for example %G_SPAWN_ERROR_FORK or %G_THREAD_ERROR_AGAIN. + + + + +If there's a "generic" or "unknown" error code for unrecoverable errors it +doesn't make sense to distinguish with specific codes, it should be called +<NAMESPACE>_<MODULE>_ERROR_FAILED, for +example %G_SPAWN_ERROR_FAILED or %G_THREAD_ERROR_FAILED. + + + + + + +Summary of rules for use of #GError: + + + + Do not report programming errors via #GError. + + + + + + The last argument of a function that returns an error should be a + location where a #GError can be placed (i.e. "#GError** error"). If + #GError is used with varargs, the #GError** should be the last + argument before the "...". + + + + + + The caller may pass %NULL for the #GError** if they are not interested + in details of the exact error that occurred. + + + + + + If %NULL is passed for the #GError** argument, then errors should + not be returned to the caller, but your function should still + abort and return if an error occurs. That is, control flow should + not be affected by whether the caller wants to get a #GError. + + + + + + If a #GError is reported, then your function by definition + had a fatal failure and did not complete whatever it was supposed + to do. If the failure was not fatal, then you handled it + and you should not report it. If it was fatal, then you must report it + and discontinue whatever you were doing immediately. + + + + + + A #GError* must be initialized to %NULL before passing its address to + a function that can report errors. + + + + + + "Piling up" errors is always a bug. That is, if you assign a new + #GError to a #GError* that is non-%NULL, thus overwriting the previous + error, it indicates that you should have aborted the operation instead + of continuing. If you were able to continue, you should have cleared + the previous error with g_clear_error(). g_set_error() will complain + if you pile up errors. + + + + + + + By convention, if you return a boolean value indicating success + then %TRUE means success and %FALSE means failure. If %FALSE is returned, + the error must be set to a non-%NULL value. + + + + + + + A %NULL return value is also frequently used to mean that an error + occurred. You should make clear in your documentation whether %NULL is + a valid return value in non-error cases; if %NULL is a valid value, + then users must check whether an error was returned to see if the + function succeeded. + + + + + + When implementing a function that can report errors, you may want to + add a check at the top of your function that the error return location + is either %NULL or contains a %NULL error + (e.g. g_return_if_fail (error == NULL || *error == + NULL);). + + + + + + + + + + + + + + + + + +The GError structure contains +information about an error that has occurred. + + +@domain: error domain, e.g. #G_FILE_ERROR. +@code: error code, e.g. %G_FILE_ERROR_NOENT. +@message: human-readable informative error message. + + + + + + +@domain: +@code: +@format: +@Varargs: +@Returns: + + + + + + + +@domain: +@code: +@message: +@Returns: + + + + + + + +@domain: +@code: +@format: +@args: +@Returns: + + + + + + + +@error: + + + + + + + +@error: +@Returns: + + + + + + + +@error: +@domain: +@code: +@Returns: + + + + + + + +@err: +@domain: +@code: +@format: +@Varargs: + + + + + + + +@err: +@domain: +@code: +@message: + + + + + + + +@dest: +@src: + + + + + + + +@err: + + + + + + + +@err: +@format: +@Varargs: + + + + + + + +@dest: +@src: +@format: +@Varargs: + + diff --git a/docs/reference/glib/tmpl/fileutils.sgml b/docs/reference/glib/tmpl/fileutils.sgml new file mode 100644 index 0000000..817aeb6 --- /dev/null +++ b/docs/reference/glib/tmpl/fileutils.sgml @@ -0,0 +1,498 @@ + +File Utilities + + +various file-related functions + + + +There is a group of functions which wrap the common POSIX functions +dealing with filenames (g_open(), g_rename(), g_mkdir(), g_stat(), +g_unlink(), g_remove(), g_fopen(), g_freopen()). The point of these +wrappers is to make it possible to handle file names with any Unicode +characters in them on Windows without having to use ifdefs and the +wide character API in the application code. + + +The pathname argument should be in the GLib file name encoding. On +POSIX this is the actual on-disk encoding which might correspond to +the locale settings of the process (or the +G_FILENAME_ENCODING environment variable), or not. + + +On Windows the GLib file name encoding is UTF-8. Note that the +Microsoft C library does not use UTF-8, but has separate APIs for +current system code page and wide characters (UTF-16). The GLib +wrappers call the wide character API if present (on modern Windows +systems), otherwise convert to/from the system code page. + + + +Another group of functions allows to open and read directories +in the GLib file name encoding. These are g_dir_open(), +g_dir_read_name(), g_dir_rewind(), g_dir_close(). + + + + + + + + + + + + +Values corresponding to errno codes returned from file operations +on UNIX. Unlike errno codes, #GFileError values are available on +all systems, even Windows. The exact meaning of each code depends on what +sort of file operation you were performing; the UNIX documentation +gives more details. The following error code descriptions come +from the GNU C Library manual, and are under the copyright +of that manual. + + + +It's not very portable to make detailed assumptions about exactly +which errors will be returned from a given operation. Some errors +don't occur on some systems, etc., sometimes there are subtle +differences in when a system will report a given error, etc. + + +@G_FILE_ERROR_EXIST: Operation not permitted; only the owner of the + file (or other resource) or processes with special privileges can + perform the operation. +@G_FILE_ERROR_ISDIR: File is a directory; you cannot open a directory + for writing, or create or remove hard links to it. +@G_FILE_ERROR_ACCES: Permission denied; the file permissions do not + allow the attempted operation. +@G_FILE_ERROR_NAMETOOLONG: Filename too long. +@G_FILE_ERROR_NOENT: No such file or directory. This is a "file + doesn't exist" error for ordinary files that are referenced in + contexts where they are expected to already exist. +@G_FILE_ERROR_NOTDIR: A file that isn't a directory was specified when + a directory is required. +@G_FILE_ERROR_NXIO: No such device or address. The system tried to + use the device represented by a file you specified, and it + couldn't find the device. This can mean that the device file was + installed incorrectly, or that the physical device is missing or + not correctly attached to the computer. +@G_FILE_ERROR_NODEV: This file is of a type that doesn't support + mapping. +@G_FILE_ERROR_ROFS: The directory containing the new link can't be + modified because it's on a read-only file system. +@G_FILE_ERROR_TXTBSY: Text file busy. +@G_FILE_ERROR_FAULT: You passed in a pointer to bad memory. + (GLib won't reliably return this, don't pass in pointers to bad + memory.) +@G_FILE_ERROR_LOOP: Too many levels of symbolic links were encountered + in looking up a file name. This often indicates a cycle of symbolic + links. +@G_FILE_ERROR_NOSPC: No space left on device; write operation on a + file failed because the disk is full. +@G_FILE_ERROR_NOMEM: No memory available. The system cannot allocate + more virtual memory because its capacity is full. +@G_FILE_ERROR_MFILE: The current process has too many files open and + can't open any more. Duplicate descriptors do count toward this + limit. +@G_FILE_ERROR_NFILE: There are too many distinct file openings in the + entire system. +@G_FILE_ERROR_BADF: Bad file descriptor; for example, I/O on a + descriptor that has been closed or reading from a descriptor open + only for writing (or vice versa). +@G_FILE_ERROR_INVAL: Invalid argument. This is used to indicate + various kinds of problems with passing the wrong argument to a + library function. +@G_FILE_ERROR_PIPE: Broken pipe; there is no process reading from the + other end of a pipe. Every library function that returns this + error code also generates a `SIGPIPE' signal; this signal + terminates the program if not handled or blocked. Thus, your + program will never actually see this code unless it has handled or + blocked `SIGPIPE'. +@G_FILE_ERROR_AGAIN: Resource temporarily unavailable; the call might + work if you try again later. +@G_FILE_ERROR_INTR: Interrupted function call; an asynchronous signal + occurred and prevented completion of the call. When this + happens, you should try the call again. +@G_FILE_ERROR_IO: Input/output error; usually used for physical read + or write errors. i.e. the disk or other physical device hardware + is returning errors. +@G_FILE_ERROR_PERM: Operation not permitted; only the owner of the + file (or other resource) or processes with special privileges can + perform the operation. +@G_FILE_ERROR_NOSYS: Function not implemented; this indicates that the + system is missing some functionality. +@G_FILE_ERROR_FAILED: Does not correspond to a UNIX error code; this + is the standard "failed for unspecified reason" error code present in + all #GError error code enumerations. Returned if no specific + code applies. + + + +Error domain for file operations. Errors in this domain will +be from the #GFileError enumeration. See #GError for information on +error domains. + + + + + + +A test to perform on a file using g_file_test(). + + +@G_FILE_TEST_IS_REGULAR: %TRUE if the file is a regular file (not a directory). + Note that this test will also return %TRUE if the tested file is a symlink + to a regular file. +@G_FILE_TEST_IS_SYMLINK: %TRUE if the file is a symlink. +@G_FILE_TEST_IS_DIR: %TRUE if the file is a directory. +@G_FILE_TEST_IS_EXECUTABLE: %TRUE if the file is executable. +@G_FILE_TEST_EXISTS: %TRUE if the file exists. + It may or may not be a regular file. + + + + + + +@err_no: +@Returns: + + + + + + + +@filename: +@contents: +@length: +@error: +@Returns: + + + + + + + +@filename: +@contents: +@length: +@error: +@Returns: + + + + + + + +@filename: +@test: +@Returns: + + + + + + + +@tmpl: +@Returns: + + + + + + + +@tmpl: +@flags: +@mode: +@Returns: + + + + + + + +@tmpl: +@name_used: +@error: +@Returns: + + + + + + + +@filename: +@error: +@Returns: + + + + + + + +@pathname: +@mode: +@Returns: + + + + +An opaque structure representing an opened directory. + + + + + + + + +@path: +@flags: +@error: +@Returns: + + + + + + + +@dir: +@Returns: + + + + + + + +@dir: + + + + + + + +@dir: + + + + +The #GMappedFile represents a file mapping created with +g_mapped_file_new(). It has only private members and should +not be accessed directly. + + + + + + + + +@filename: +@writable: +@error: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@file: + + + + + + + +@file: + + + + + + + +@file: +@Returns: + + + + + + + +@file: +@Returns: + + + + + + + +@filename: +@flags: +@mode: +@Returns: + + + + + + + +@oldfilename: +@newfilename: +@Returns: + + + + + + + +@filename: +@mode: +@Returns: + + + + + + + +@filename: +@buf: +@Returns: + + + + + + + +@filename: +@buf: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@Returns: + + + + + + + +@filename: +@mode: +@Returns: + + + + + + + +@filename: +@mode: +@stream: +@Returns: + + + + + + + +@filename: +@mode: +@Returns: + + + + + + + +@filename: +@mode: +@Returns: + + + + + + + +@filename: +@mode: +@Returns: + + + + + + + +@path: +@Returns: + + + + + + + +@filename: +@utb: +@Returns: + + diff --git a/docs/reference/glib/tmpl/ghostutils.sgml b/docs/reference/glib/tmpl/ghostutils.sgml new file mode 100644 index 0000000..b619912 --- /dev/null +++ b/docs/reference/glib/tmpl/ghostutils.sgml @@ -0,0 +1,66 @@ + +Hostname Utilities + + + + + + + + + + + + + + + + + + + + + + + + +@hostname: +@Returns: + + + + + + + +@hostname: +@Returns: + + + + + + + +@hostname: +@Returns: + + + + + + + +@hostname: +@Returns: + + + + + + + +@hostname: +@Returns: + + diff --git a/docs/reference/glib/tmpl/glib-unused.sgml b/docs/reference/glib/tmpl/glib-unused.sgml new file mode 100644 index 0000000..139c500 --- /dev/null +++ b/docs/reference/glib/tmpl/glib-unused.sgml @@ -0,0 +1,1037 @@ + + +The "GDesktopEntry" parser is intended to parse files written to +the Desktop +Entry Specification. It supports deserialization of +desktop entries from files and in-memory data. Desktop entries +are used for a variety of things including menus, application +MIME type registration, and launchers. + + + +To load an existing desktop entry from a data directory (as +returned by g_get_user_data_dir() and g_get_system_data_dirs()) +use g_desktop_entry_new_from_data_dirs(). To load an existing +desktop entry from an arbitrary location on the file system use +g_desktop_entry_new_from_file(). If the desktop entry is already +in memory use g_desktop_entry_new_from_data(). Once the desktop +entry is loaded its keys can be queried using the g_desktop_entry_get +family of functions. + + + +To create a new desktop entry first call g_desktop_entry_new(). +Then, call the g_desktop_entry_set family of functions. Next, +call g_desktop_entry_to_data() to output the desktop entry to +a byte array, which can be written to disk or sent over a +network. Finally, call g_desktop_entry_free() to deallocate the +#GDesktopEntry object returned by g_desktop_entry_new(). + + + + + + + + + + +serializes and deserializes a desktop entry. + + + +Desktop Entry Parser + + + + + + + + + + + + + + + + + + + + + + + + + + + +Testing + + + + + + + +@G_CHANNEL_ERROR_ACCES: +@G_CHANNEL_ERROR_BADF: +@G_CHANNEL_ERROR_DEADLK: +@G_CHANNEL_ERROR_FAULT: +@G_CHANNEL_ERROR_INVAL: +@G_CHANNEL_ERROR_IO: +@G_CHANNEL_ERROR_ISDIR: +@G_CHANNEL_ERROR_MFILE: +@G_CHANNEL_ERROR_NOLCK: +@G_CHANNEL_ERROR_NOSPC: +@G_CHANNEL_ERROR_PERM: +@G_CHANNEL_ERROR_PIPE: +@G_CHANNEL_ERROR_SPIPE: +@G_CHANNEL_ERROR_ENCODE_RW: +@G_CHANNEL_ERROR_FAILED: + + + + + + +@G_CHANNEL_STATUS_NORMAL: +@G_CHANNEL_STATUS_EOF: +@G_CHANNEL_STATUS_PARTIAL_CHARS: +@G_CHANNEL_STATUS_AGAIN: +@G_CHANNEL_STATUS_INTR: +@G_CHANNEL_STATUS_ERROR: +@G_CHANNEL_STATUS_BAD_INPUT: + + + + + + +@a: +@b: +@user_data: +@Returns: + + + + + + +@s1: +@s2: +@Returns: + + + + + + + + + +Error codes returned by desktop entry parsing. + + +@G_DESKTOP_ENTRY_ERROR_UNKNOWN_ENCODING: text being parsed is not UTF-8 and +cannot be guessed. +@G_DESKTOP_ENTRY_ERROR_BAD_START_GROUP: desktop entry does not start with a +legal start group. +@G_DESKTOP_ENTRY_ERROR_PARSE: desktop entry is empty or contains invalid +data. +@G_DESKTOP_ENTRY_ERROR_NOT_FOUND: valid desktop entry could not be found. +@G_DESKTOP_ENTRY_ERROR_KEY_NOT_FOUND: desktop entry does not have requested +key. +@G_DESKTOP_ENTRY_ERROR_GROUP_NOT_FOUND: desktop entry does not have requested +group +@G_DESKTOP_ENTRY_ERROR_INVALID_VALUE: desktop entry contains key which has +value that cannot be validated. + + + +#GDesktopEntry supports a few flags for tweaking performance during +deserialization. #G_DESKTOP_ENTRY_DISCARD_COMMENTS and +#G_DESKTOP_ENTRY_DISCARD_TRANSLATIONS will reduce memory footprint, +and #G_DESKTOP_ENTRY_GENERATE_LOOKUP_MAP will increase key lookup speed. + + +@G_DESKTOP_ENTRY_NONE: use parser defaults +@G_DESKTOP_ENTRY_DISCARD_COMMENTS: Discard all lines that are blank +or start with "#". +@G_DESKTOP_ENTRY_DISCARD_TRANSLATIONS: Only retain translations that +are returned by g_get_language_names(). +@G_DESKTOP_ENTRY_GENERATE_LOOKUP_MAP: Generate a lookup map for key names to make lookups constant time at the cost of more memory. + + + +Specifies the type of function passed to g_set_error_handler(). + + +@str: the error message. + + + + + + +@hook_list: +@hook: + + + + + + +@G_IO_FILE_MODE_READ: +@G_IO_FILE_MODE_WRITE: +@G_IO_FILE_MODE_APPEND: +@G_IO_FILE_MODE_READ_WRITE: +@G_IO_FILE_MODE_READ_WRITE_TRUNCATE: +@G_IO_FILE_MODE_READ_WRITE_APPEND: + + + +Enumeration representing different kinds of patterns. This is only used +internally for optimizing the match algorithm. + + +@G_MATCH_ALL: a general pattern. +@G_MATCH_ALL_TAIL: a general pattern which contains a fixed part matching +the end of the string. +@G_MATCH_HEAD: a pattern matching every string with a certain prefix. +@G_MATCH_TAIL: a pattern matching every string with a certain suffix. +@G_MATCH_EXACT: a pattern matching exactly one string. +@G_MATCH_LAST: + + + +Specifies the type of function passed to g_set_warning_handler(). + + +@str: the warning message. + + + + + + + + + +Error domain for desktop entry parsing. Errors in this domain will +be from the #GDesktopEntryError enumeration. See #GError for information on +error domains. + + + + + + + + + + + +One of %G_IO_CHANNEL_UNIX_LINE_TERM, %G_IO_CHANNEL_DOS_LINE_TERM, +or %G_IO_CHANNEL_MACINTOSH_LINE_TERM (unimplemented) +depending on the system type. + + + + + + + + + + + +Encoding for nonbuffered IO. With this encoding, data must be +read using g_io_channel_read_chars(); the other functions will +not work. + + + + + + + + + + + + + + + + + +Provided for UNIX emulation on Windows; equivalent to UNIX macro +%NAME_MAX, which is the maximum length of a single path component. +i.e. just the foo in /usr/bin/foo. + + + + + +Marks a string for translation, gets replaced with the translated string +at runtime. + + +@String: the string to be translated +@Since: 2.4 + + + + + + + + + + + + + + + +Provided for UNIX emulation on Windows; see documentation for closedir() +in any UNIX manual. + + +@Param1: +@Returns: + + + + + + + + + +Provided for UNIX emulation on Windows; see documentation for ftruncate() +in any UNIX manual. + + +@fd: +@size: + + + + + + +@en: +@Returns: + + + + + + +@Returns: + + + + + + +@Returns: + + + + + + +@entry: +@should_escape: + + + + + + +@entry: + + + + + + +@entry: +@group_name: +@key: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + +@entry: +@length: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@length: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@locale: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@locale: +@length: +@error: +@Returns: + + + + + + +@entry: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@Returns: + + + + + + +@entry: +@group_name: +@key: +@error: +@Returns: + + + + + + +@flags: +@error: +@Returns: + + + + + + +@data: +@length: +@legal_start_groups: +@flags: +@error: +@Returns: + + + + + + +@file: +@full_path: +@legal_start_groups: +@flags: +@error: +@Returns: + + + + + + +@file: +@legal_start_groups: +@flags: +@error: +@Returns: + + + + + + +@entry: +@group_name: +@error: + + + + + + +@entry: +@group_name: +@key: +@error: + + + + + + +@entry: +@group_name: +@key: +@boolean: +@error: + + + + + + +@entry: +@group_name: +@key: +@list: +@length: +@error: + + + + + + +@entry: +@group_name: +@key: +@integer: +@error: + + + + + + +@entry: +@group_name: +@key: +@list: +@length: +@error: + + + + + + +@entry: +@group_name: +@key: +@locale: +@string: +@error: + + + + + + +@entry: +@group_name: +@key: +@locale: +@list: +@length: +@error: + + + + + + +@entry: +@group_name: +@key: +@string: +@error: + + + + + + +@entry: +@group_name: +@key: +@list: +@length: +@error: + + + + + + +@entry: +@length: +@error: +@Returns: + + + + + + +@filename: +@contents: +@length: +@error: +@Returns: + + + + + + +@size: +@Returns: + + + + + + +@Returns: + + + +The log domain used for messages logged by GLib itself. + + + + + +Adds a file descriptor to be polled. +This is usually combined with g_source_add() to add an event source. +The event source's check function will typically test the revents +field in the #GPollFD struct and return TRUE if events need to be processed. + + +@fd: a #GPollFD, which is a file descriptor together with a bitwise +combination of #GIOCondition flags determining which events to poll for. +@priority: the priority of the poll, which should be the same as the priority +used for g_source_add() to ensure that the file descriptor is polled whenever +the results may be needed. +See #G_PRIORITY_DEFAULT, #G_PRIORITY_DEFAULT_IDLE, #G_PRIORITY_HIGH, +#G_PRIORITY_HIGH_IDLE, and #G_PRIORITY_LOW. + + + + + + +@thread: +@Returns: + + + + + + +@loop: + + + +Removes a file descriptor from the list being polled. + + +@fd: the #GPollFD to remove. + + + + + + +@Returns: + + + +Checks if the given memory has already been freed. If it has it outputs +a warning message. +To use this function you must configure glib with the flag +'--enable-mem-check=yes' before compiling. + + +@mem: the memory to check. + + + + + + +@Returns: + + + + + + +@regex: + + + +Gets the file attributes. +This is the st_mode field from the +stat structure. See the stat() +documentation. + + +@filename: the file name. +@Returns: the file attributes. + + + +Sets the function to be called to handle error messages. +This function is deprecated in favour of the new logging facilities. + + +@func: the function to be called to handle error messages. +@Returns: the old error handler. + + + +Sets the function to be called to handle messages. +This function is deprecated in favour of the new logging facilities. + + +@func: the function to be called to handle normal messages. +@Returns: the old message handler. + + + +Sets the function to be called to handle warning messages. +This function is deprecated in favour of the new logging facilities. + + +@func: the function to be called to handle warning messages. +@Returns: the old warning handler. + + + + + +@priority: +@can_recurse: +@funcs: +@source_data: +@user_data: +@notify: +@Returns: +@source: +@context: + + + + + + +@source: +@func: +@data: +@notify: + + + + + + +@source: +@callback_data: +@callback_funcs: + + + +Removes the first event source found with the given source data. + + +Event sources are sorted with the highest priority first. Sources with equal +priority are stored in the order in which they were added. + + +@source_data: the source data, which contains information specific to the +type of source. +@Returns: TRUE if an event source was found and removed. + + + + + + +@private_key: +@thread: +@Returns: + + + + + + +@private_key: +@thread: +@data: +@notify: + + + +Turns the argument into a string literal by using the '#' stringizing operator. + + +@x: text to convert to a literal string. + + + + + + +@domain: +@file: +@line: +@func: +@warnexpr: + + + + + + + + + + + + + + + +This is the binary age passed to libtool. If +libtool means nothing to you, don't worry +about it. ;-) + + + + + + + + +@required_major: +@required_minor: +@required_micro: +@Returns: + + + +This is the interface age passed to libtool. If +libtool means nothing to you, don't worry +about it. ;-) + + + + + +The major version number of the GLib library. +(e.g. in GLib version 1.2.5 this is 1.) + + + +This variable is in the library, so represents the +GLib library you have linked against. Contrast with the +#GLIB_MAJOR_VERSION macro, which represents the major version of the +GLib headers you have included. + + + + + +The micro version number of the GLib library. +(e.g. in GLib version 1.2.5 this is 5.) + + + +This variable is in the library, so represents the GLib library you +have linked against. Contrast with the #GLIB_MICRO_VERSION macro, which +represents the micro version of the GLib headers you have included. + + + + + +The minor version number of the GLib library. +(e.g. in GLib version 1.2.5 this is 2.) + + + +This variable is in the library, so represents the +GLib library you have linked against. Contrast with the +#GLIB_MINOR_VERSION macro, which represents the minor version of the +GLib headers you have included. + + + + + + + + + + + + + + + + + +Provided for UNIX emulation on Windows; see documentation for opendir() +in any UNIX manual. + + +@Param1: +@Returns: + + + + + + + + + +Provided for UNIX emulation on Windows; see documentation for pipe() +in any UNIX manual. + + +@phandles: file descriptors, the first one for reading, the second one for writing. + + + + + + + + + + + + + + + +Provided for UNIX emulation on Windows; see documentation for readdir() +in any UNIX manual. + + + + + +Provided for UNIX emulation on Windows; see documentation for rewinddir() +in any UNIX manual. + + +@Param1: + + + + + + + diff --git a/docs/reference/glib/tmpl/gregex.sgml b/docs/reference/glib/tmpl/gregex.sgml new file mode 100644 index 0000000..317aa59 --- /dev/null +++ b/docs/reference/glib/tmpl/gregex.sgml @@ -0,0 +1,632 @@ + +Perl-compatible regular expressions + + +matches strings against regular expressions + + + +The g_regex_*() functions implement regular +expression pattern matching using syntax and semantics similar to +Perl regular expression. + + +Some functions accept a start_position argument, +setting it differs from just passing over a shortened string and setting +#G_REGEX_MATCH_NOTBOL in the case of a pattern that begins with any kind +of lookbehind assertion. +For example, consider the pattern "\Biss\B" which finds occurrences of "iss" +in the middle of words. ("\B" matches only if the current position in the +subject is not a word boundary.) When applied to the string "Mississipi" +from the fourth byte, namely "issipi", it does not match, because "\B" is +always false at the start of the subject, which is deemed to be a word +boundary. However, if the entire string is passed , but with +start_position set to 4, it finds the second +occurrence of "iss" because it is able to look behind the starting point +to discover that it is preceded by a letter. + + +Note that, unless you set the #G_REGEX_RAW flag, all the strings passed +to these functions must be encoded in UTF-8. The lengths and the positions +inside the strings are in bytes and not in characters, so, for instance, +"\xc3\xa0" (i.e. "à") is two bytes long but it is treated as a single +character. If you set #G_REGEX_RAW the strings can be non-valid UTF-8 +strings and a byte is treated as a character, so "\xc3\xa0" is two bytes +and two characters long. + + +When matching a pattern, "\n" matches only against a "\n" character in the +string, and "\r" matches only a "\r" character. To match any newline sequence +use "\R". This particular group matches either the two-character sequence +CR + LF ("\r\n"), or one of the single characters LF (linefeed, U+000A, "\n"), VT +(vertical tab, U+000B, "\v"), FF (formfeed, U+000C, "\f"), CR (carriage return, +U+000D, "\r"), NEL (next line, U+0085), LS (line separator, U+2028), or PS +(paragraph separator, U+2029). + + +The behaviour of the dot, circumflex, and dollar metacharacters are affected by +newline characters, the default is to recognize any newline character (the same +characters recognized by "\R"). This can be changed with #G_REGEX_NEWLINE_CR, +#G_REGEX_NEWLINE_LF and #G_REGEX_NEWLINE_CRLF compile options, +and with #G_REGEX_MATCH_NEWLINE_ANY, #G_REGEX_MATCH_NEWLINE_CR, +#G_REGEX_MATCH_NEWLINE_LF and #G_REGEX_MATCH_NEWLINE_CRLF match options. +These settings are also relevant when compiling a pattern if +#G_REGEX_EXTENDED is set, and an unescaped "#" outside a character class is +encountered. This indicates a comment that lasts until after the next +newline. + + +Creating and manipulating the same #GRegex structure from different +threads is not a problem as #GRegex does not modify its internal +state between creation and destruction, on the other hand #GMatchInfo is +not threadsafe. + + +The regular expressions low level functionalities are obtained through +the excellent PCRE library +written by Philip Hazel. + + + + + + + + + + + + +Error codes returned by regular expressions functions. + + +@G_REGEX_ERROR_COMPILE: Compilation of the regular expression failed. +@G_REGEX_ERROR_OPTIMIZE: Optimization of the regular expression failed. +@G_REGEX_ERROR_REPLACE: Replacement failed due to an ill-formed replacement string. +@G_REGEX_ERROR_MATCH: The match process failed. +@G_REGEX_ERROR_INTERNAL: Internal error of the regular expression engine. Since 2.16 +@G_REGEX_ERROR_STRAY_BACKSLASH: "\\" at end of pattern. Since 2.16 +@G_REGEX_ERROR_MISSING_CONTROL_CHAR: "\\c" at end of pattern. Since 2.16 +@G_REGEX_ERROR_UNRECOGNIZED_ESCAPE: Unrecognized character follows "\\". Since 2.16 +@G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER: Numbers out of order in "{}" quantifier. Since 2.16 +@G_REGEX_ERROR_QUANTIFIER_TOO_BIG: Number too big in "{}" quantifier. Since 2.16 +@G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS: Missing terminating "]" for character class. Since 2.16 +@G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS: Invalid escape sequence in character class. Since 2.16 +@G_REGEX_ERROR_RANGE_OUT_OF_ORDER: Range out of order in character class. Since 2.16 +@G_REGEX_ERROR_NOTHING_TO_REPEAT: Nothing to repeat. Since 2.16 +@G_REGEX_ERROR_UNRECOGNIZED_CHARACTER: Unrecognized character after "(?", "(?<" or "(?P". Since 2.16 +@G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS: POSIX named classes are supported only within a class. Since 2.16 +@G_REGEX_ERROR_UNMATCHED_PARENTHESIS: Missing terminating ")" or ")" without opening "(". Since 2.16 +@G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE: Reference to non-existent subpattern. Since 2.16 +@G_REGEX_ERROR_UNTERMINATED_COMMENT: Missing terminating ")" after comment. Since 2.16 +@G_REGEX_ERROR_EXPRESSION_TOO_LARGE: Regular expression too large. Since 2.16 +@G_REGEX_ERROR_MEMORY_ERROR: Failed to get memory. Since 2.16 +@G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND: Lookbehind assertion is not fixed length. Since 2.16 +@G_REGEX_ERROR_MALFORMED_CONDITION: Malformed number or name after "(?(". Since 2.16 +@G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES: Conditional group contains more than two branches. Since 2.16 +@G_REGEX_ERROR_ASSERTION_EXPECTED: Assertion expected after "(?(". Since 2.16 +@G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME: Unknown POSIX class name. Since 2.16 +@G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED: POSIX collating elements are not supported. Since 2.16 +@G_REGEX_ERROR_HEX_CODE_TOO_LARGE: Character value in "\\x{...}" sequence is too large. Since 2.16 +@G_REGEX_ERROR_INVALID_CONDITION: Invalid condition "(?(0)". Since 2.16 +@G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND: \\C not allowed in lookbehind assertion. Since 2.16 +@G_REGEX_ERROR_INFINITE_LOOP: Recursive call could loop indefinitely. Since 2.16 +@G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR: Missing terminator in subpattern name. Since 2.16 +@G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME: Two named subpatterns have the same name. Since 2.16 +@G_REGEX_ERROR_MALFORMED_PROPERTY: Malformed "\\P" or "\\p" sequence. Since 2.16 +@G_REGEX_ERROR_UNKNOWN_PROPERTY: Unknown property name after "\\P" or "\\p". Since 2.16 +@G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG: Subpattern name is too long (maximum 32 characters). Since 2.16 +@G_REGEX_ERROR_TOO_MANY_SUBPATTERNS: Too many named subpatterns (maximum 10,000). Since 2.16 +@G_REGEX_ERROR_INVALID_OCTAL_VALUE: Octal value is greater than "\\377". Since 2.16 +@G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE: "DEFINE" group contains more than one branch. Since 2.16 +@G_REGEX_ERROR_DEFINE_REPETION: Repeating a "DEFINE" group is not allowed. Since 2.16 +@G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS: Inconsistent newline options. Since 2.16 +@G_REGEX_ERROR_MISSING_BACK_REFERENCE: "\\g" is not followed by a braced name or an +optionally braced non-zero number. Since 2.16 +@Since: 2.14 + + + +Error domain for regular expressions. Errors in this domain will be from the #GRegexError enumeration. See #GError for information on error domains. + + +@Since: 2.14 + + + + +Flags specifying compile-time options. + + +@G_REGEX_CASELESS: Letters in the pattern match both upper and lower case +letters. This option can be changed within a pattern by a "(?i)" option +setting. +@G_REGEX_MULTILINE: By default, GRegex treats the strings as consisting +of a single line of characters (even if it actually contains newlines). +The "start of line" metacharacter ("^") matches only at the start of the +string, while the "end of line" metacharacter ("$") matches only at the +end of the string, or before a terminating newline (unless +#G_REGEX_DOLLAR_ENDONLY is set). When #G_REGEX_MULTILINE is set, +the "start of line" and "end of line" constructs match immediately following +or immediately before any newline in the string, respectively, as well +as at the very start and end. This can be changed within a pattern by a +"(?m)" option setting. +@G_REGEX_DOTALL: A dot metacharater (".") in the pattern matches all +characters, including newlines. Without it, newlines are excluded. This +option can be changed within a pattern by a ("?s") option setting. +@G_REGEX_EXTENDED: Whitespace data characters in the pattern are +totally ignored except when escaped or inside a character class. +Whitespace does not include the VT character (code 11). In addition, +characters between an unescaped "#" outside a character class and +the next newline character, inclusive, are also ignored. This can be +changed within a pattern by a "(?x)" option setting. +@G_REGEX_ANCHORED: The pattern is forced to be "anchored", that is, +it is constrained to match only at the first matching point in the string +that is being searched. This effect can also be achieved by appropriate +constructs in the pattern itself such as the "^" metacharater. +@G_REGEX_DOLLAR_ENDONLY: A dollar metacharacter ("$") in the pattern +matches only at the end of the string. Without this option, a dollar also +matches immediately before the final character if it is a newline (but +not before any other newlines). This option is ignored if +#G_REGEX_MULTILINE is set. +@G_REGEX_UNGREEDY: Inverts the "greediness" of the +quantifiers so that they are not greedy by default, but become greedy +if followed by "?". It can also be set by a "(?U)" option setting within +the pattern. +@G_REGEX_RAW: Usually strings must be valid UTF-8 strings, using this +flag they are considered as a raw sequence of bytes. +@G_REGEX_NO_AUTO_CAPTURE: Disables the use of numbered capturing +parentheses in the pattern. Any opening parenthesis that is not followed +by "?" behaves as if it were followed by "?:" but named parentheses can +still be used for capturing (and they acquire numbers in the usual way). +@G_REGEX_OPTIMIZE: Optimize the regular expression. If the pattern will +be used many times, then it may be worth the effort to optimize it to +improve the speed of matches. +@G_REGEX_DUPNAMES: Names used to identify capturing subpatterns need not +be unique. This can be helpful for certain types of pattern when it is known +that only one instance of the named subpattern can ever be matched. +@G_REGEX_NEWLINE_CR: Usually any newline character is recognized, if this +option is set, the only recognized newline character is '\r'. +@G_REGEX_NEWLINE_LF: Usually any newline character is recognized, if this +option is set, the only recognized newline character is '\n'. +@G_REGEX_NEWLINE_CRLF: Usually any newline character is recognized, if this +option is set, the only recognized newline character sequence is '\r\n'. +@Since: 2.14 + + + +Flags specifying match-time options. + + +@G_REGEX_MATCH_ANCHORED: The pattern is forced to be "anchored", that is, +it is constrained to match only at the first matching point in the string +that is being searched. This effect can also be achieved by appropriate +constructs in the pattern itself such as the "^" metacharater. +@G_REGEX_MATCH_NOTBOL: Specifies that first character of the string is +not the beginning of a line, so the circumflex metacharacter should not +match before it. Setting this without G_REGEX_MULTILINE (at compile time) +causes circumflex never to match. This option affects only the behaviour of +the circumflex metacharacter, it does not affect "\A". +@G_REGEX_MATCH_NOTEOL: Specifies that the end of the subject string is +not the end of a line, so the dollar metacharacter should not match it nor +(except in multiline mode) a newline immediately before it. Setting this +without G_REGEX_MULTILINE (at compile time) causes dollar never to match. +This option affects only the behaviour of the dollar metacharacter, it does +not affect "\Z" or "\z". +@G_REGEX_MATCH_NOTEMPTY: An empty string is not considered to be a valid +match if this option is set. If there are alternatives in the pattern, they +are tried. If all the alternatives match the empty string, the entire match +fails. For example, if the pattern "a?b?" is applied to a string not beginning +with "a" or "b", it matches the empty string at the start of the string. +With this flag set, this match is not valid, so GRegex searches further +into the string for occurrences of "a" or "b". +@G_REGEX_MATCH_PARTIAL: Turns on the partial matching feature, for more +documentation on partial matching see g_match_info_is_partial_match(). +@G_REGEX_MATCH_NEWLINE_CR: Overrides the newline definition set when creating +a new #GRegex, setting the '\r' character as line terminator. +@G_REGEX_MATCH_NEWLINE_LF: Overrides the newline definition set when creating +a new #GRegex, setting the '\n' character as line terminator. +@G_REGEX_MATCH_NEWLINE_CRLF: Overrides the newline definition set when creating +a new #GRegex, setting the '\r\n' characters as line terminator. +@G_REGEX_MATCH_NEWLINE_ANY: Overrides the newline definition set when creating +a new #GRegex, any newline character or character sequence is recognized. +@Since: 2.14 + + + +A GRegex is the "compiled" form of a regular expression pattern. This +structure is opaque and its fields cannot be accessed directly. + + +@Since: 2.14 + + + +Specifies the type of the function passed to g_regex_replace_eval(). +It is called for each occurance of the pattern in the string passed +to g_regex_replace_eval(), and it should append the replacement to +@result. + + +@match_info: the #GMatchInfo generated by the match. +Use g_match_info_get_regex() and g_match_info_get_string() if you +need the #GRegex or the matched string. +@result: a #GString containing the new string +@user_data: user data passed to g_regex_replace_eval() +@Returns: %FALSE to continue the replacement process, %TRUE to stop it +@Since: 2.14 + + + + + + + +@pattern: +@compile_options: +@match_options: +@error: +@Returns: + + + + + + + +@regex: +@Returns: + + + + + + + +@regex: + + + + + + + +@regex: +@Returns: + + + + + + + +@regex: +@Returns: + + + + + + + +@regex: +@Returns: + + + + + + + +@regex: +@name: +@Returns: + + + + + + + +@string: +@length: +@Returns: + + + + + + + +@pattern: +@string: +@compile_options: +@match_options: +@Returns: + + + + + + + +@regex: +@string: +@match_options: +@match_info: +@Returns: + + + + + + + +@regex: +@string: +@string_len: +@start_position: +@match_options: +@match_info: +@error: +@Returns: + + + + + + + +@regex: +@string: +@match_options: +@match_info: +@Returns: + + + + + + + +@regex: +@string: +@string_len: +@start_position: +@match_options: +@match_info: +@error: +@Returns: + + + + + + + +@pattern: +@string: +@compile_options: +@match_options: +@Returns: + + + + + + + +@regex: +@string: +@match_options: +@Returns: + + + + + + + +@regex: +@string: +@string_len: +@start_position: +@match_options: +@max_tokens: +@error: +@Returns: + + + + + + + +@regex: +@string: +@string_len: +@start_position: +@replacement: +@match_options: +@error: +@Returns: + + + + + + + +@regex: +@string: +@string_len: +@start_position: +@replacement: +@match_options: +@error: +@Returns: + + + + + + + +@regex: +@string: +@string_len: +@start_position: +@match_options: +@eval: +@user_data: +@error: +@Returns: + + + + + + + +@replacement: +@has_references: +@error: +@Returns: + + + + +#GMatchInfo is used to retrieve information about the regular expression match +which created it. +This structure is opaque and its fields cannot be accessed directly. + + +@Since: 2.14 + + + + + + +@match_info: +@Returns: + + + + + + + +@match_info: +@Returns: + + + + + + + +@match_info: + + + + + + + +@match_info: +@Returns: + + + + + + + +@match_info: +@error: +@Returns: + + + + + + + +@match_info: +@Returns: + + + + + + + +@match_info: +@Returns: + + + + + + + +@match_info: +@string_to_expand: +@error: +@Returns: + + + + + + + +@match_info: +@match_num: +@Returns: + + + + + + + +@match_info: +@match_num: +@start_pos: +@end_pos: +@Returns: + + + + + + + +@match_info: +@name: +@Returns: + + + + + + + +@match_info: +@name: +@start_pos: +@end_pos: +@Returns: + + + + + + + +@match_info: +@Returns: + + diff --git a/docs/reference/glib/tmpl/gurifuncs.sgml b/docs/reference/glib/tmpl/gurifuncs.sgml new file mode 100644 index 0000000..82c0f7b --- /dev/null +++ b/docs/reference/glib/tmpl/gurifuncs.sgml @@ -0,0 +1,106 @@ + +URI Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@uri: +@Returns: + + + + + + + +@unescaped: +@reserved_chars_allowed: +@allow_utf8: +@Returns: + + + + + + + +@escaped_string: +@illegal_characters: +@Returns: + + + + + + + +@escaped_string: +@escaped_string_end: +@illegal_characters: +@Returns: + + + + + + + +@uri_list: +@Returns: + + diff --git a/docs/reference/glib/tmpl/gvariant.sgml b/docs/reference/glib/tmpl/gvariant.sgml new file mode 100644 index 0000000..99c4d47 --- /dev/null +++ b/docs/reference/glib/tmpl/gvariant.sgml @@ -0,0 +1,873 @@ + +GVariant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@value: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@type: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@G_VARIANT_CLASS_BOOLEAN: +@G_VARIANT_CLASS_BYTE: +@G_VARIANT_CLASS_INT16: +@G_VARIANT_CLASS_UINT16: +@G_VARIANT_CLASS_INT32: +@G_VARIANT_CLASS_UINT32: +@G_VARIANT_CLASS_INT64: +@G_VARIANT_CLASS_UINT64: +@G_VARIANT_CLASS_HANDLE: +@G_VARIANT_CLASS_DOUBLE: +@G_VARIANT_CLASS_STRING: +@G_VARIANT_CLASS_OBJECT_PATH: +@G_VARIANT_CLASS_SIGNATURE: +@G_VARIANT_CLASS_VARIANT: +@G_VARIANT_CLASS_MAYBE: +@G_VARIANT_CLASS_ARRAY: +@G_VARIANT_CLASS_TUPLE: +@G_VARIANT_CLASS_DICT_ENTRY: + + + + + + +@value: +@format_string: +@Varargs: + + + + + + + +@value: +@format_string: +@endptr: +@app: + + + + + + + +@format_string: +@Varargs: +@Returns: + + + + + + + +@format_string: +@endptr: +@app: +@Returns: + + + + + + + +@boolean: +@Returns: + + + + + + + +@byte: +@Returns: + + + + + + + +@int16: +@Returns: + + + + + + + +@uint16: +@Returns: + + + + + + + +@int32: +@Returns: + + + + + + + +@uint32: +@Returns: + + + + + + + +@int64: +@Returns: + + + + + + + +@uint64: +@Returns: + + + + + + + +@handle: +@Returns: + + + + + + + +@floating: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@object_path: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@signature: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@strv: +@length: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@length: +@Returns: + + + + + + + +@value: +@length: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@length: +@Returns: + + + + + + + +@value: +@length: +@Returns: + + + + + + + +@child_type: +@child: +@Returns: + + + + + + + +@child_type: +@children: +@n_children: +@Returns: + + + + + + + +@children: +@n_children: +@Returns: + + + + + + + +@key: +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@index_: +@Returns: + + + + + + + +@value: +@index_: +@format_string: +@Varargs: + + + + + + + +@value: +@n_elements: +@element_size: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@data: + + + + + + + +@type: +@data: +@size: +@trusted: +@notify: +@user_data: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@one: +@two: +@Returns: + + + + + + + +@value: +@type_annotate: +@Returns: + + + + + + + +@value: +@string: +@type_annotate: +@Returns: + + + + + + + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: + + + + + + + +@iter: +@value: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@format_string: +@Varargs: +@Returns: + + + + + + + +@iter: +@format_string: +@Varargs: +@Returns: + + + + + + + + + + + + + +@builder: + + + + + + + +@builder: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@builder: +@type: + + + + + + + +@builder: + + + + + + + +@builder: +@value: + + + + + + + +@builder: +@format_string: +@Varargs: + + + + + + + +@builder: +@Returns: + + + + + + + +@builder: +@type: + + + + + + + +@builder: + + + + + + + + + + + + + + +@type: +@text: +@limit: +@endptr: +@error: +@Returns: + + + + + + + +@format: +@app: +@Returns: + + + + + + + +@format: +@Varargs: +@Returns: + + diff --git a/docs/reference/glib/tmpl/gvarianttype.sgml b/docs/reference/glib/tmpl/gvarianttype.sgml new file mode 100644 index 0000000..d01675b --- /dev/null +++ b/docs/reference/glib/tmpl/gvarianttype.sgml @@ -0,0 +1,455 @@ + +GVariantType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@type_string: + + + + + + + +@type: + + + + + + + +@type: +@Returns: + + + + + + + +@type_string: +@Returns: + + + + + + + +@type_string: +@Returns: + + + + + + + +@string: +@limit: +@endptr: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type1: +@type2: +@Returns: + + + + + + + +@type: +@supertype: +@Returns: + + + + + + + +@element: +@Returns: + + + + + + + +@element: +@Returns: + + + + + + + +@items: +@length: +@Returns: + + + + + + + +@key: +@value: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + diff --git a/docs/reference/glib/tmpl/hash_tables.sgml b/docs/reference/glib/tmpl/hash_tables.sgml new file mode 100644 index 0000000..0f9b542 --- /dev/null +++ b/docs/reference/glib/tmpl/hash_tables.sgml @@ -0,0 +1,424 @@ + +Hash Tables + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@hash_func: +@key_equal_func: +@Returns: + + + + + + + +@hash_func: +@key_equal_func: +@key_destroy_func: +@value_destroy_func: +@Returns: + + + + + + + +@key: +@Returns: + + + + + + + +@a: +@b: +@Returns: + + + + + + + +@hash_table: +@key: +@value: + + + + + + + +@hash_table: +@key: +@value: + + + + + + + +@hash_table: +@Returns: + + + + + + + +@hash_table: +@key: +@Returns: + + + + + + + +@hash_table: +@lookup_key: +@orig_key: +@value: +@Returns: + + + + + + + +@hash_table: +@func: +@user_data: + + + + + + + +@hash_table: +@predicate: +@user_data: +@Returns: + + + + + + + +@key: +@value: +@user_data: + + + + + + + +@hash_table: +@key: +@Returns: + + + + + + + +@hash_table: +@key: +@Returns: + + + + + + + +@hash_table: +@func: +@user_data: +@Returns: + + + + + + + +@hash_table: +@func: +@user_data: +@Returns: + + + + + + + +@hash_table: + + + + + + + +@hash_table: + + + + + + + +@hash_table: +@Returns: + + + + + + + +@hash_table: +@Returns: + + + + + + + +@key: +@value: +@user_data: +@Returns: + + + + + + + +@hash_table: + + + + + + + +@hash_table: + + + + + + + +@hash_table: + + + + + + + +@hash_table: +@Returns: + + + + + + + +@hash_table: + + + + + + + + + + + + + +@iter: +@hash_table: + + + + + + + +@iter: +@key: +@value: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: + + + + + + + +@iter: + + + + + + + +@v1: +@v2: +@Returns: + + + + + + + +@v: +@Returns: + + + + + + + +@v1: +@v2: +@Returns: + + + + + + + +@v: +@Returns: + + + + + + + +@v1: +@v2: +@Returns: + + + + + + + +@v: +@Returns: + + + + + + + +@v1: +@v2: +@Returns: + + + + + + + +@v: +@Returns: + + + + + + + +@v1: +@v2: +@Returns: + + + + + + + +@v: +@Returns: + + diff --git a/docs/reference/glib/tmpl/hooks.sgml b/docs/reference/glib/tmpl/hooks.sgml new file mode 100644 index 0000000..f02dbf6 --- /dev/null +++ b/docs/reference/glib/tmpl/hooks.sgml @@ -0,0 +1,467 @@ + +Hook Functions + + +support for manipulating lists of hook functions + + + +The #GHookList, #GHook and their related functions provide support for +lists of hook functions. Functions can be added and removed from the lists, +and the list of hook functions can be invoked. + + + + + + + + + + + + + +The GHookList struct represents a +list of hook functions. + + +@seq_id: the next free #GHook id +@hook_size: the size of the #GHookList elements, in bytes +@is_setup: 1 if the #GHookList has been initialized +@hooks: the first #GHook element in the list +@dummy3: unused +@finalize_hook: the function to call to finalize a #GHook element. The +default behaviour is to call the hooks destroy function +@dummy: unused + + + +Defines the type of function to be called when a hook in a +list of hooks gets finalized. + + +@hook_list: a #GHookList +@hook: the hook in @hook_list that gets finalized + + + + +The GHook struct represents a single hook +function in a #GHookList. + + +@data: data which is passed to func when this hook is invoked +@next: pointer to the next hook in the list +@prev: pointer to the previous hook in the list +@ref_count: the reference count of this hook +@hook_id: the id of this hook, which is unique within its list +@flags: flags which are set for this hook. See #GHookFlagMask for + predefined flags +@func: the function to call when this hook is invoked. The possible +signatures for this function are #GHookFunc and #GHookCheckFunc +@destroy: the default finalize_hook function of a +#GHookList calls this member of the hook that is being finalized + + + +Defines the type of a hook function that can be invoked +by g_hook_list_invoke(). + + +@data: the data field of the #GHook is passed to the hook function here + + + + +Defines the type of a hook function that can be invoked +by g_hook_list_invoke_check(). + + +@data: the data field of the #GHook is passed to the hook function here +@Returns: %FALSE if the #GHook should be destroyed + + + + +Initializes a #GHookList. +This must be called before the #GHookList is used. + + +@hook_list: a #GHookList +@hook_size: the size of each element in the #GHookList, typically + sizeof (GHook) + + + + +Calls all of the #GHook functions in a #GHookList. + + +@hook_list: a #GHookList +@may_recurse: %TRUE if functions which are already running (e.g. in another + thread) can be called. If set to %FALSE, these are skipped + + + + +Calls all of the #GHook functions in a #GHookList. +Any function which returns %FALSE is removed from the #GHookList. + + +@hook_list: a #GHookList +@may_recurse: %TRUE if functions which are already running (e.g. in another +thread) can be called. If set to %FALSE, these are skipped + + + + +Calls a function on each valid #GHook. + + +@hook_list: a #GHookList +@may_recurse: %TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to %FALSE, these are skipped +@marshaller: the function to call for each #GHook +@marshal_data: data to pass to @marshaller + + + + +Defines the type of function used by g_hook_list_marshal(). + + +@hook: a #GHook +@marshal_data: user data + + + + +Calls a function on each valid #GHook and destroys it if the +function returns %FALSE. + + +@hook_list: a #GHookList +@may_recurse: %TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to %FALSE, these are skipped +@marshaller: the function to call for each #GHook +@marshal_data: data to pass to @marshaller + + + + +Defines the type of function used by g_hook_list_marshal_check(). + + +@hook: a #GHook +@marshal_data: user data +@Returns: %FALSE if @hook should be destroyed + + + + +Removes all the #GHook elements from a #GHookList. + + +@hook_list: a #GHookList + + + + +Allocates space for a #GHook and initializes it. + + +@hook_list: a #GHookList +@Returns: a new #GHook + + + + +Appends a #GHook onto the end of a #GHookList. + + +@hook_list: a #GHookList +@hook: the #GHook to add to the end of @hook_list + + + + +Prepends a #GHook on the start of a #GHookList. + + +@hook_list: a #GHookList +@hook: the #GHook to add to the start of @hook_list + + + + +Inserts a #GHook into a #GHookList, before a given #GHook. + + +@hook_list: a #GHookList +@sibling: the #GHook to insert the new #GHook before +@hook: the #GHook to insert + + + + +Inserts a #GHook into a #GHookList, sorted by the given function. + + +@hook_list: a #GHookList +@hook: the #GHook to insert +@func: the comparison function used to sort the #GHook elements + + + + +Defines the type of function used to compare #GHook elements in +g_hook_insert_sorted(). + + +@new_hook: the #GHook being inserted +@sibling: the #GHook to compare with @new_hook +@Returns: a value <= 0 if @new_hook should be before @sibling + + + + +Compares the ids of two #GHook elements, returning a negative value +if the second id is greater than the first. + + +@new_hook: a #GHook +@sibling: a #GHook to compare with @new_hook +@Returns: a value <= 0 if the id of @sibling is >= the id of @new_hook + + + + +Returns the #GHook with the given id, or %NULL if it is not found. + + +@hook_list: a #GHookList +@hook_id: a hook id +@Returns: the #GHook with the given id, or %NULL if it is not found + + + + +Finds a #GHook in a #GHookList using the given function to test for a match. + + +@hook_list: a #GHookList +@need_valids: %TRUE if #GHook elements which have been destroyed should be + skipped +@func: the function to call for each #GHook, which should return %TRUE when + the #GHook has been found +@data: the data to pass to @func +@Returns: the found #GHook or %NULL if no matching #GHook is found + + + + +Defines the type of the function passed to g_hook_find(). + + +@hook: a #GHook +@data: user data passed to g_hook_find_func() +@Returns: %TRUE if the required #GHook has been found + + + + +Finds a #GHook in a #GHookList with the given data. + + +@hook_list: a #GHookList +@need_valids: %TRUE if #GHook elements which have been destroyed should be + skipped +@data: the data to find +@Returns: the #GHook with the given @data or %NULL if no matching + #GHook is found + + + + +Finds a #GHook in a #GHookList with the given function. + + +@hook_list: a #GHookList +@need_valids: %TRUE if #GHook elements which have been destroyed should be + skipped +@func: the function to find +@Returns: the #GHook with the given @func or %NULL if no matching + #GHook is found + + + + +Finds a #GHook in a #GHookList with the given function and data. + + +@hook_list: a #GHookList +@need_valids: %TRUE if #GHook elements which have been destroyed should be + skipped +@func: the function to find +@data: the data to find +@Returns: the #GHook with the given @func and @data or %NULL if no matching + #GHook is found + + + + +Returns the first #GHook in a #GHookList which has not been destroyed. +The reference count for the #GHook is incremented, so you must call +g_hook_unref() to restore it when no longer needed. (Or call +g_hook_next_valid() if you are stepping through the #GHookList.) + + +@hook_list: a #GHookList +@may_be_in_call: %TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to %FALSE, these are skipped +@Returns: the first valid #GHook, or %NULL if none are valid + + + + +Returns the next #GHook in a #GHookList which has not been destroyed. +The reference count for the #GHook is incremented, so you must call +g_hook_unref() to restore it when no longer needed. (Or continue to call +g_hook_next_valid() until %NULL is returned.) + + + +@hook_list: a #GHookList +@hook: the current #GHook +@may_be_in_call: %TRUE if hooks which are currently running (e.g. in another + thread) are considered valid. If set to %FALSE, these are skipped +@Returns: the next valid #GHook, or %NULL if none are valid + + + + +Flags used internally in the #GHook implementation. + + +@G_HOOK_FLAG_ACTIVE: set if the hook has not been destroyed +@G_HOOK_FLAG_IN_CALL: set if the hook is currently being run +@G_HOOK_FLAG_MASK: A mask covering all bits reserved for + hook flags; see #G_HOOK_FLAGS_USER_SHIFT + + + +Returns the flags of a hook. + + +@hook: a #GHook + + + + +The position of the first bit which is not reserved for internal +use be the #GHook implementation, i.e. +1 << G_HOOK_FLAG_USER_SHIFT is the first bit +which can be used for application-defined flags. + + + + + + +Casts a pointer to a GHook*. + + +@hook: a pointer + + + + +Returns %TRUE if the #GHook is valid, i.e. it is in a #GHookList, it is active +and it has not been destroyed. + + +@hook: a #GHook +@Returns: %TRUE if the #GHook is valid + + + + +Returns %TRUE if the #GHook is active, which is normally %TRUE until the #GHook +is destroyed. + + +@hook: a #GHook +@Returns: %TRUE if the #GHook is active + + + + +Returns %TRUE if the #GHook function is currently executing. + + +@hook: a #GHook +@Returns: %TRUE if the #GHook function is currently executing + + + + +Returns %TRUE if the #GHook is not in a #GHookList. + + + +@hook: a #GHook +@Returns: %TRUE if the #GHook is not in a #GHookList + + + + +Increments the reference count for a #GHook. + + +@hook_list: a #GHookList +@hook: the #GHook to increment the reference count of +@Returns: the @hook that was passed in (since 2.6) + + + + +Decrements the reference count of a #GHook. +If the reference count falls to 0, the #GHook is removed from the #GHookList +and g_hook_free() is called to free it. + + +@hook_list: a #GHookList +@hook: the #GHook to unref + + + + +Calls the #GHookList @finalize_hook function if it exists, and frees the memory +allocated for the #GHook. + + +@hook_list: a #GHookList +@hook: the #GHook to free + + + + +Destroys a #GHook, given its ID. + + +@hook_list: a #GHookList +@hook_id: a hook ID +@Returns: %TRUE if the #GHook was found in the #GHookList and destroyed + + + + +Removes one #GHook from a #GHookList, marking it inactive and calling +g_hook_unref() on it. + + +@hook_list: a #GHookList +@hook: the #GHook to remove + + diff --git a/docs/reference/glib/tmpl/i18n.sgml b/docs/reference/glib/tmpl/i18n.sgml new file mode 100644 index 0000000..8afc7ae --- /dev/null +++ b/docs/reference/glib/tmpl/i18n.sgml @@ -0,0 +1,214 @@ + +Internationalization + + +gettext support macros + + + +GLib doesn't force any particular localization method upon its users. +But since GLib itself is localized using the gettext() mechanism, it seems +natural to offer the de-facto standard gettext() support macros in an +easy-to-use form. + + +In order to use these macros in an application, you must include +glib/gi18n.h. For use in a library, must include +glib/gi18n-lib.h after defining +the GETTEXT_PACKAGE macro suitably for your library: + +#define GETTEXT_PACKAGE "gtk20" +#include <glib/gi18n-lib.h> + +The gettext manual covers details of how to set up message extraction +with xgettext. + + + + +The gettext manual. + + + + + + + +Like _(), but handles context in message ids. This has the advantage that +the string can be adorned with a prefix to guarantee uniqueness and provide +context to the translator. + + +One use case given in the gettext manual is GUI translation, where one could +e.g. disambiguate two "Open" menu entries as "File|Open" and "Printer|Open". +Another use case is the string "Russian" which may have to be translated +differently depending on whether it's the name of a character set or a +language. This could be solved by using "charset|Russian" and +"language|Russian". + + +See the C_() macro for a different way to mark up translatable strings +with context. + + +If you are using the Q_() macro, you need to make sure that you +pass to xgettext when extracting messages. +If you are using GNU gettext >= 0.15, you can also use + to let xgettext split the context +string off into a msgctxt line in the po file. + + +@String: the string to be translated, with a '|'-separated prefix which + must not be translated +@Returns: the translated message +@Since: 2.4 + + + + +Uses gettext to get the translation for @msgid. @msgctxt is +used as a context. This is mainly useful for short strings which +may need different translations, depending on the context in which +they are used. + +label1 = C_("Navigation", "Back"); +label2 = C_("Body part", "Back"); + + + + +If you are using the C_() macro, you need to make sure that you +pass to xgettext when extracting +messages. Note that this only works with GNU gettext >= 0.15. + + +@Context: a message context, must be a string literal +@String: a message id, must be a string literal +@Returns: the translated message +@Since: 2.16 + + + + +Only marks a string for translation. +This is useful in situations where the translated strings can't +be directly used, e.g. in string array initializers. +To get the translated string, call gettext() at runtime. + + + { + static const char *messages[] = { + N_("some very meaningful message"), + N_("and another one") + }; + const char *string; + ... + string + = index > 1 ? _("a default message") : gettext (messages[index]); + + fputs (string); + ... + } + + +@String: the string to be translated +@Since: 2.4 + + + + +Only marks a string for translation, with context. +This is useful in situations where the translated strings can't +be directly used, e.g. in string array initializers. +To get the translated string, you should call g_dpgettext2() at runtime. + +|[ + { + static const char *messages[] = { + NC_("some context", "some very meaningful message"), + NC_("some context", "and another one") + }; + const char *string; + ... + string + = index > 1 ? g_dpgettext2 (NULL, "some context", "a default message") : g_dpgettext2 (NULL, "some context", messages[index]); + + fputs (string); + ... + } +]| + + +If you are using the NC_() macro, you need to make sure that you +pass to xgettext when extracting +messages. Note that this only works with GNU gettext >= 0.15. +Intltool has support for the NC_() macro since version 0.40.1. + + +@Context: a message context, must be a string literal +@String: a message id, must be a string literal +@Since: 2.18 + + + + + + + +@domain: +@msgid: +@Returns: + + + + + + + +@domain: +@msgid: +@msgid_plural: +@n: +@Returns: + + + + + + + +@domain: +@msgctxtid: +@msgidoffset: +@Returns: + + + + + + + +@domain: +@context: +@msgid: +@Returns: + + + + + + + +@msgid: +@msgval: +@Returns: + + + + + + + +@Returns: + + diff --git a/docs/reference/glib/tmpl/iochannels.sgml b/docs/reference/glib/tmpl/iochannels.sgml new file mode 100644 index 0000000..4829d71 --- /dev/null +++ b/docs/reference/glib/tmpl/iochannels.sgml @@ -0,0 +1,539 @@ + +IO Channels + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd: +@Returns: + + + + + + + +@channel: +@Returns: + + + + + + + +@fd: +@Returns: + + + + + + + +@socket: +@Returns: + + + + + + + +@hwnd: +@Returns: + + + + + + + +@channel: + + + + + + + +@filename: +@mode: +@error: +@Returns: + + + + + + + +@channel: +@buf: +@count: +@bytes_read: +@error: +@Returns: + + + + + + + +@channel: +@thechar: +@error: +@Returns: + + + + + + + +@channel: +@str_return: +@length: +@terminator_pos: +@error: +@Returns: + + + + + + + +@channel: +@buffer: +@terminator_pos: +@error: +@Returns: + + + + + + + +@channel: +@str_return: +@length: +@error: +@Returns: + + + + + + + +@channel: +@buf: +@count: +@bytes_written: +@error: +@Returns: + + + + + + + +@channel: +@thechar: +@error: +@Returns: + + + + + + + +@channel: +@error: +@Returns: + + + + + + + +@channel: +@offset: +@type: +@error: +@Returns: + + + + + + + +@G_SEEK_CUR: +@G_SEEK_SET: +@G_SEEK_END: + + + + + + +@channel: +@flush: +@err: +@Returns: + + + + + + + +@G_IO_STATUS_ERROR: +@G_IO_STATUS_NORMAL: +@G_IO_STATUS_EOF: +@G_IO_STATUS_AGAIN: + + + + + + +@G_IO_CHANNEL_ERROR_FBIG: +@G_IO_CHANNEL_ERROR_INVAL: +@G_IO_CHANNEL_ERROR_IO: +@G_IO_CHANNEL_ERROR_ISDIR: +@G_IO_CHANNEL_ERROR_NOSPC: +@G_IO_CHANNEL_ERROR_NXIO: +@G_IO_CHANNEL_ERROR_OVERFLOW: +@G_IO_CHANNEL_ERROR_PIPE: +@G_IO_CHANNEL_ERROR_FAILED: + + + + + + + + + + + + + +@en: +@Returns: + + + + + + + +@channel: +@Returns: + + + + + + + +@channel: + + + + + + + +@channel: +@condition: +@Returns: + + + + + + + +@channel: +@condition: +@func: +@user_data: +@Returns: + + + + + + + +@channel: +@priority: +@condition: +@func: +@user_data: +@notify: +@Returns: + + + + + + + +@G_IO_IN: +@G_IO_OUT: +@G_IO_PRI: +@G_IO_ERR: +@G_IO_HUP: +@G_IO_NVAL: + + + + + + +@source: +@condition: +@data: +@Returns: + + + + + + + +@io_read: +@io_write: +@io_seek: +@io_close: +@io_create_watch: +@io_free: +@io_set_flags: +@io_get_flags: + + + + + + +@channel: +@Returns: + + + + + + + +@channel: +@size: + + + + + + + +@channel: +@Returns: + + + + + + + +@channel: +@Returns: + + + + + + + +@channel: +@flags: +@error: +@Returns: + + + + + + + +@G_IO_FLAG_APPEND: +@G_IO_FLAG_NONBLOCK: +@G_IO_FLAG_IS_READABLE: +@G_IO_FLAG_IS_WRITEABLE: +@G_IO_FLAG_IS_SEEKABLE: +@G_IO_FLAG_MASK: +@G_IO_FLAG_GET_MASK: +@G_IO_FLAG_SET_MASK: + + + + + + +@channel: +@length: +@Returns: + + + + + + + +@channel: +@line_term: +@length: + + + + + + + +@channel: +@Returns: + + + + + + + +@channel: +@buffered: + + + + + + + +@channel: +@Returns: + + + + + + + +@channel: +@encoding: +@error: +@Returns: + + + + + + + +@channel: +@Returns: + + + + + + + +@channel: +@do_close: + + + + + + + +@channel: +@buf: +@count: +@bytes_read: +@Returns: + + + + + + + +@G_IO_ERROR_NONE: +@G_IO_ERROR_AGAIN: +@G_IO_ERROR_INVAL: +@G_IO_ERROR_UNKNOWN: + + + + + + +@channel: +@buf: +@count: +@bytes_written: +@Returns: + + + + + + + +@channel: +@offset: +@type: +@Returns: + + + + + + + +@channel: + + diff --git a/docs/reference/glib/tmpl/keyfile.sgml b/docs/reference/glib/tmpl/keyfile.sgml new file mode 100644 index 0000000..18ce443 --- /dev/null +++ b/docs/reference/glib/tmpl/keyfile.sgml @@ -0,0 +1,889 @@ + +Key-value file parser + + +parses .ini-like config files + + + +#GKeyFile lets you parse, edit or create files containing groups of +key-value pairs, which we call key files for +lack of a better name. Several freedesktop.org specifications use +key files now, e.g the +Desktop +Entry Specification and the +Icon +Theme Specification. + + + +The syntax of key files is described in detail in the +Desktop +Entry Specification, here is a quick summary: Key files +consists of groups of key-value pairs, interspersed with comments. + + + +# this is just an example +# there can be comments before the first group + +[First Group] + +Name=Key File Example\tthis value shows\nescaping + +# localized strings are stored in multiple key-value pairs +Welcome=Hello +Welcome[de]=Hallo +Welcome[fr_FR]=Bonjour +Welcome[it]=Ciao +Welcome[be@latin]=Hello + +[Another Group] + +Numbers=2;20;-200;0 + +Booleans=true;false;true;true + + + + +Lines beginning with a '#' and blank lines are considered comments. + + + +Groups are started by a header line containing the group name enclosed +in '[' and ']', and ended implicitly by the start of the next group or +the end of the file. Each key-value pair must be contained in a group. + + + +Key-value pairs generally have the form key=value, +with the exception of localized strings, which have the form +key[locale]=value, with a locale identifier of the form +lang_COUNTRY@MODIFIER where COUNTRY and +MODIFIER are optional. Space before and after the +'=' character are ignored. Newline, tab, carriage return and backslash +characters in value are escaped as \n, \t, \r, and \\, respectively. +To preserve leading spaces in values, these can also be escaped as \s. + + + +Key files can store strings (possibly with localized variants), integers, +booleans and lists of these. Lists are separated by a separator character, +typically ';' or ','. To use the list separator character in a value in +a list, it has to be escaped by prefixing it with a backslash. + + + +This syntax is obviously inspired by the .ini +files commonly met on Windows, but there are some important differences: + + +.ini files use the ';' character to begin comments, + key files use the '#' character. + + +Key files do not allow for ungrouped keys meaning only comments can precede the first group. + + +Key files are always encoded in UTF-8. + + +Key and Group names are case-sensitive, for example a group called +[GROUP] is a different group from [group]. + + +.ini files don't have a strongly typed boolean entry type, they only +have GetProfileInt. In GKeyFile only +true and false (in lower case) are allowed. + + + + + +Note that in contrast to the +Desktop +Entry Specification, groups in key files may contain the same +key multiple times; the last entry wins. Key files may also contain +multiple groups with the same name; they are merged together. +Another difference is that keys and group names in key files are not +restricted to ASCII characters. + + + + + + + + + + + + +The GKeyFile struct contains only private fields +and should not be used directly. + + + + + +Error domain for key file parsing. Errors in this domain will +be from the #GKeyFileError enumeration. See #GError for information on +error domains. + + + + + + +Error codes returned by key file parsing. + + +@G_KEY_FILE_ERROR_UNKNOWN_ENCODING: the text being parsed was in an unknown encoding +@G_KEY_FILE_ERROR_PARSE: document was ill-formed +@G_KEY_FILE_ERROR_NOT_FOUND: the file was not found +@G_KEY_FILE_ERROR_KEY_NOT_FOUND: a requested key was not found +@G_KEY_FILE_ERROR_GROUP_NOT_FOUND: a requested group was not found +@G_KEY_FILE_ERROR_INVALID_VALUE: a value could not be parsed + + + +Flags which influence the parsing. + + +@G_KEY_FILE_NONE: No flags, default behaviour +@G_KEY_FILE_KEEP_COMMENTS: Use this flag if you plan to write the (possibly modified) + contents of the key file back to a file; otherwise all comments will be lost when + the key file is written back. +@G_KEY_FILE_KEEP_TRANSLATIONS: Use this flag if you plan to write the (possibly modified) + contents of the key file back to a file; otherwise only the translations for the current + language will be written back. + + + + + + +@Returns: + + + + + + + +@key_file: + + + + + + + +@key_file: +@separator: + + + + + + + +@key_file: +@file: +@flags: +@error: +@Returns: + + + + + + + +@key_file: +@data: +@length: +@flags: +@error: +@Returns: + + + + + + + +@key_file: +@file: +@full_path: +@flags: +@error: +@Returns: + + + + + + + +@key_file: +@file: +@search_dirs: +@full_path: +@flags: +@error: +@Returns: + + + + + + + +@key_file: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@Returns: + + + + + + + +@key_file: +@length: +@Returns: + + + + + + + +@key_file: +@group_name: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@locale: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@locale: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@length: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@value: + + + + + + + +@key_file: +@group_name: +@key: +@string: + + + + + + + +@key_file: +@group_name: +@key: +@locale: +@string: + + + + + + + +@key_file: +@group_name: +@key: +@value: + + + + + + + +@key_file: +@group_name: +@key: +@value: + + + + + + + +@key_file: +@group_name: +@key: +@value: + + + + + + + +@key_file: +@group_name: +@key: +@list: +@length: + + + + + + + +@key_file: +@group_name: +@key: +@locale: +@list: +@length: + + + + + + + +@key_file: +@group_name: +@key: +@list: +@length: + + + + + + + +@key_file: +@group_name: +@key: +@list: +@length: + + + + + + + +@key_file: +@group_name: +@key: +@list: +@length: + + + + + + + +@key_file: +@group_name: +@key: +@comment: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + + + + +@key_file: +@group_name: +@key: +@error: +@Returns: + + + + +The name of the main group of a desktop entry file, as defined in the +Desktop +Entry Specification. Consult the specification for more +details about the meanings of the keys below. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the type of the desktop entry. Usually +G_KEY_FILE_DESKTOP_TYPE_APPLICATION, +G_KEY_FILE_DESKTOP_TYPE_LINK, or +G_KEY_FILE_DESKTOP_TYPE_DIRECTORY. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the version of the Desktop +Entry Specification used for the desktop entry file. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the specific name of the +desktop entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the generic name of the +desktop entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the desktop entry should be +shown in menus. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the tooltip for the desktop +entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a localized string giving the name of the icon to be +displayed for the desktop entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the desktop entry has been +deleted by the user. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings identifying the environments that +should display the desktop entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings identifying the environments that +should not display the desktop entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the file name of a binary on disk +used to determine if the program is actually installed. It is only +valid for desktop entries with the Application +type. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the command line to execute. It is only +valid for desktop entries with the Application +type. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string containing the working directory to run the +program in. It is only valid for desktop entries with the +Application type. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the program should be +run in a terminal window. It is only valid for desktop entries with +the Application type. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings giving the MIME types supported +by this desktop entry. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a list of strings giving the categories in which the +desktop entry should be shown in a menu. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a boolean stating whether the application supports +the Startup +Notification Protocol Specification. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is string identifying the WM class or name hint of a +window that the application will create, which can be used to emulate +Startup Notification with older applications. + + +@Since: 2.14 + + + + +A key under G_KEY_FILE_DESKTOP_GROUP +whose value is a string giving the URL to access. It is only valid +for desktop entries with the Link type. + + +@Since: 2.14 + + + + +The value of the G_KEY_FILE_DESKTOP_KEY_TYPE +key for desktop entries representing applications. + + +@Since: 2.14 + + + + +The value of the G_KEY_FILE_DESKTOP_KEY_TYPE +key for desktop entries representing links to documents. + + +@Since: 2.14 + + + + +The value of the G_KEY_FILE_DESKTOP_KEY_TYPE +key for desktop entries representing directories. + + +@Since: 2.14 + + diff --git a/docs/reference/glib/tmpl/limits.sgml b/docs/reference/glib/tmpl/limits.sgml new file mode 100644 index 0000000..c0fe16c --- /dev/null +++ b/docs/reference/glib/tmpl/limits.sgml @@ -0,0 +1,250 @@ + +Limits of Basic Types + + +portable method of determining the limits of the standard types + + + +These macros provide a portable method to determine the limits of some of +the standard integer and floating point types. + + + + + + + + + + + + +The minimum value which can be held in a #gint. + + + + + + +The maximum value which can be held in a #gint. + + + + + + +The maximum value which can be held in a #guint. + + + + + + +The minimum value which can be held in a #gshort. + + + + + + +The maximum value which can be held in a #gshort. + + + + + + +The maximum value which can be held in a #gushort. + + + + + + +The minimum value which can be held in a #glong. + + + + + + +The maximum value which can be held in a #glong. + + + + + + +The maximum value which can be held in a #gulong. + + + + + + +The minimum value which can be held in a #gint8. + + +@Since: 2.4 + + + + +The maximum value which can be held in a #gint8. + + +@Since: 2.4 + + + + +The maximum value which can be held in a #guint8. + + +@Since: 2.4 + + + + +The minimum value which can be held in a #gint16. + + +@Since: 2.4 + + + + +The maximum value which can be held in a #gint16. + + +@Since: 2.4 + + + + +The maximum value which can be held in a #guint16. + + +@Since: 2.4 + + + + +The minimum value which can be held in a #gint32. + + +@Since: 2.4 + + + + +The maximum value which can be held in a #gint32. + + +@Since: 2.4 + + + + +The maximum value which can be held in a #guint32. + + +@Since: 2.4 + + + + +The minimum value which can be held in a #gint64. + + + + + + +The maximum value which can be held in a #gint64. + + + + + + +The maximum value which can be held in a #guint64. + + + + + + +The maximum value which can be held in a #gsize. + + +@Since: 2.4 + + + + +The minimum value which can be held in a #gssize. + + +@Since: 2.14 + + + + +The maximum value which can be held in a #gssize. + + +@Since: 2.14 + + + + +The minimum value which can be held in a #goffset. + + + + + + +The maximum value which can be held in a #goffset. + + + + + + +The minimum positive value which can be held in a #gfloat. + + +If you are interested in the smallest value which can be held in a #gfloat, +use -G_MAX_FLOAT. + + + + + + +The maximum value which can be held in a #gfloat. + + + + + + +The minimum positive value which can be held in a #gdouble. + + +If you are interested in the smallest value which can be held in a #gdouble, +use -G_MAXDOUBLE. + + + + + + +The maximum value which can be held in a #gdouble. + + + + diff --git a/docs/reference/glib/tmpl/linked_lists_double.sgml b/docs/reference/glib/tmpl/linked_lists_double.sgml new file mode 100644 index 0000000..888783c --- /dev/null +++ b/docs/reference/glib/tmpl/linked_lists_double.sgml @@ -0,0 +1,384 @@ + +Doubly-Linked Lists + + + + + + + + + + + + + + + + + + + + + + + + +@data: +@next: +@prev: + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@data: +@position: +@Returns: + + + + + + + +@list: +@sibling: +@data: +@Returns: + + + + + + + +@list: +@data: +@func: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@llink: +@Returns: + + + + + + + +@list: +@link_: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: + + + + + + + +@Returns: + + + + + + + +@list: + + + + + + + + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@compare_func: +@Returns: + + + + + + + +@a: +@b: +@Returns: + + + + + + + +@list: +@data: +@func: +@user_data: +@Returns: + + + + + + + +@list: +@compare_func: +@user_data: +@Returns: + + + + + + + +@a: +@b: +@user_data: +@Returns: + + + + + + + +@list1: +@list2: +@Returns: + + + + + + + +@list: +@func: +@user_data: + + + + + + + +@data: +@user_data: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: + + + + + + + +@list: + + + + + + + +@list: +@n: +@Returns: + + + + + + + +@list: +@n: +@Returns: + + + + + + + +@list: +@n: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@data: +@func: +@Returns: + + + + + + + +@list: +@llink: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@allocator: + + + + + + + + + diff --git a/docs/reference/glib/tmpl/linked_lists_single.sgml b/docs/reference/glib/tmpl/linked_lists_single.sgml new file mode 100644 index 0000000..a8a3edd --- /dev/null +++ b/docs/reference/glib/tmpl/linked_lists_single.sgml @@ -0,0 +1,326 @@ + +Singly-Linked Lists + + + + + + + + + + + + + + + + + + + + + + + + +@data: +@next: + + + + + + +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@data: +@position: +@Returns: + + + + + + + +@slist: +@sibling: +@data: +@Returns: + + + + + + + +@list: +@data: +@func: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@link_: +@Returns: + + + + + + + +@list: +@link_: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: + + + + + + + +@list: + + + + + + + + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: +@data: +@func: +@user_data: +@Returns: + + + + + + + +@list: +@compare_func: +@Returns: + + + + + + + +@list: +@compare_func: +@user_data: +@Returns: + + + + + + + +@list1: +@list2: +@Returns: + + + + + + + +@list: +@func: +@user_data: + + + + + + + +@list: +@Returns: + + + + + + + +@slist: + + + + + + + +@list: +@n: +@Returns: + + + + + + + +@list: +@n: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@list: +@data: +@func: +@Returns: + + + + + + + +@list: +@llink: +@Returns: + + + + + + + +@list: +@data: +@Returns: + + + + + + + +@dummy: + + + + + + + + + diff --git a/docs/reference/glib/tmpl/macros.sgml b/docs/reference/glib/tmpl/macros.sgml new file mode 100644 index 0000000..efa2779 --- /dev/null +++ b/docs/reference/glib/tmpl/macros.sgml @@ -0,0 +1,228 @@ + +Standard Macros + + +commonly-used macros. + + + +These macros provide a few commonly-used features. + + + + + + + + + + + + +This macro is defined only on Windows. So you can bracket +Windows-specific code in "#ifdef G_OS_WIN32". + + + + + + +This macro is defined only on BeOS. So you can bracket +BeOS-specific code in "#ifdef G_OS_BEOS". + + + + + + +This macro is defined only on UNIX. So you can bracket +UNIX-specific code in "#ifdef G_OS_UNIX". + + + + + + +The directory separator character. +This is '/' on UNIX machines and '\' under Windows. + + + + + + +The directory separator as a string. +This is "/" on UNIX machines and "\" under Windows. + + + + + + +Checks whether a character is a directory +separator. It returns %TRUE for '/' on UNIX +machines and for '\' or '/' under Windows. + + +@c: a character +@Since: 2.6 + + + + +The search path separator character. +This is ':' on UNIX machines and ';' under Windows. + + + + + + +The search path separator as a string. +This is ":" on UNIX machines and ";" under Windows. + + + + + + +Defines the %TRUE value for the #gboolean type. + + + + + + +Defines the %FALSE value for the #gboolean type. + + + + + + +Defines the standard %NULL pointer. + + + + + + +Calculates the minimum of @a and @b. + + +@a: a numeric value. +@b: a numeric value. +@Returns: the minimum of @a and @b. + + + + +Calculates the maximum of @a and @b. + + +@a: a numeric value. +@b: a numeric value. +@Returns: the maximum of @a and @b. + + + + +Calculates the absolute value of @a. +The absolute value is simply the number with any negative sign taken away. + + +For example, + + +ABS(-10) is 10. + + +ABS(10) is also 10. + + + + +@a: a numeric value. +@Returns: the absolute value of @a. + + + + +Ensures that @x is between the limits set by @low and @high. If @low is +greater than @high the result is undefined. + + +For example, + + +CLAMP(5, 10, 15) is 10. + + +CLAMP(15, 5, 10) is 10. + + +CLAMP(20, 15, 25) is 20. + + + + +@x: the value to clamp. +@low: the minimum value allowed. +@high: the maximum value allowed. +@Returns: the value of @x clamped to the range between @low and @high. + + + + +Returns a member of a structure at a given offset, using the given type. + + +@member_type: the type of the struct field. +@struct_p: a pointer to a struct. +@struct_offset: the offset of the field from the start of the struct, in bytes. +@Returns: the struct member. + + + + +Returns an untyped pointer to a given offset of a struct. + + +@struct_p: a pointer to a struct. +@struct_offset: the offset from the start of the struct, in bytes. +@Returns: an untyped pointer to @struct_p plus @struct_offset bytes. + + + + +Returns the offset, in bytes, of a member of a struct. + + +@struct_type: a structure type, e.g. GtkWidget. +@member: a field in the structure, e.g. window. +@Returns: the offset of @member from the start of @struct_type. + + + + +Indicates the number of bytes to which memory will be aligned on the +current platform. + + + + + + +If %G_DISABLE_CONST_RETURNS is defined, this macro expands to nothing. +By default, the macro expands to const. The macro +should be used in place of const for functions that +return a value that should not be modified. The purpose of this macro is +to allow us to turn on const for returned constant +strings by default, while allowing programmers who find that annoying to +turn it off. This macro should only be used for return values and for +out parameters, it doesn't make sense for +in parameters. + + + + diff --git a/docs/reference/glib/tmpl/macros_misc.sgml b/docs/reference/glib/tmpl/macros_misc.sgml new file mode 100644 index 0000000..29ad670 --- /dev/null +++ b/docs/reference/glib/tmpl/macros_misc.sgml @@ -0,0 +1,656 @@ + +Miscellaneous Macros + + +specialized macros which are not used often + + + +These macros provide more specialized features which are not needed so often +by application programmers. + + + + + + + + + + + + +This macro is used to export function prototypes so they can be linked +with an external version when no inlining is performed. The file which +implements the functions should define %G_IMPLEMENTS_INLINES +before including the headers which contain %G_INLINE_FUNC declarations. +Since inlining is very compiler-dependent using these macros correctly +is very difficult. Their use is strongly discouraged. + + +This macro is often mistaken for a replacement for the inline keyword; +inline is already declared in a portable manner in the glib headers +and can be used normally. + + + + + + +Used within multi-statement macros so that they can be used in places where +only one statement is expected by the compiler. + + + + + + +Used within multi-statement macros so that they can be used in places where +only one statement is expected by the compiler. + + + + + + +Used (along with #G_END_DECLS) to bracket header files. If the +compiler in use is a C++ compiler, adds extern "C" +around the header. + + + + + + +Used (along with #G_BEGIN_DECLS) to bracket header files. If the +compiler in use is a C++ compiler, adds extern "C" +around the header. + + + + + + +Determines the number of elements in an array. The array must be +declared so the compiler knows its size at compile-time; this +macro will not work on an array allocated on the heap, only static +arrays or arrays on the stack. + + +@arr: the array + + + + +Portable way to copy va_list variables. + + +In order to use this function, you must include string.h +yourself, because this macro may use memmove() and GLib +does not include string.h for you. + + +@ap1: the va_list variable to place a copy of @ap2 in. +@ap2: a va_list. + + + + +Accepts a macro or a string and converts it into a string after +preprocessor argument expansion. + + +@macro_or_string: a macro or a string. + + + + +Yields a new preprocessor pasted identifier 'identifier1identifier2' +from its expanded arguments 'identifier1' and 'identifier2'. + + +@identifier1: an identifier +@identifier2: an identifier +@Since: 2.20 + + + + + + + +@identifier1: +@identifier2: + + + + +The G_STATIC_ASSERT macro lets the programmer check a condition at compile time, +the condition needs to be compile time computable. +The macro can be used in any place where a typedef is valid. +The macro should only be used once per source code line. + + +@expr: a constant expression. +@Since: 2.20 + + + + +Expands to __extension__ when gcc is +used as the compiler. +This simply tells gcc not to warn about the following non-standard code +when compiling with the option. + + + + + + +Expands to the GNU C const function attribute if the compiler is +gcc. Declaring a function as const enables better optimization of calls +to the function. A const function doesn't examine any values except its parameters, and has no +effects except its return value. See the GNU C documentation for details. + + +A function that has pointer arguments and examines the data pointed to +must not be declared const. Likewise, a function that +calls a non-const function usually must not be const. It doesn't make sense +for a const function to return void. + + + + + + +Expands to the GNU C pure function attribute if the compiler is +gcc. Declaring a function as pure enables better optimization of +calls to the function. A pure function has no effects except its return value and the +return value depends only on the parameters and/or global variables. +See the GNU C documentation for details. + + + + + + +Expands to the GNU C malloc function attribute if the +compiler is gcc. Declaring a function as malloc enables +better optimization of the function. A function can have the malloc attribute +if it returns a pointer which is guaranteed to not alias with any other pointer +when the function returns (in practice, this means newly allocated memory). +See the GNU C documentation for details. + + +@Since: 2.6 + + + + +Expands to the GNU C alloc_size function attribute if the +compiler is a new enough gcc. This attribute tells the +compiler that the function returns a pointer to memory of a size that is +specified by the @xth function parameter. +See the GNU C documentation for details. + + +@x: the index of the argument specifying the allocation size +@Since: 2.18 + + + + +Expands to the GNU C alloc_size function attribute if the +compiler is a new enough gcc. This attribute tells the +compiler that the function returns a pointer to memory of a size that is +specified by the product of two function parameters. +See the GNU C documentation for details. + + +@x: the index of the argument specifying one factor of the allocation size +@y: the index of the argument specifying the second factor of the allocation size +@Since: 2.18 + + + + +Expands to the GNU C deprecated attribute if the compiler +is gcc. +It can be used to mark typedefs, variables and functions as deprecated. +When called with the option, the compiler will +generate warnings when deprecated interfaces are used. +See the GNU C documentation for details. + + +@Since: 2.2 + + + + +Expands to the GNU C noreturn function attribute if the +compiler is gcc. It is used for declaring functions which never return. +It enables optimization of the function, and avoids possible compiler +warnings. See the GNU C documentation for details. + + + + + + +Expands to the GNU C unused function attribute if the compiler is +gcc. It is used for declaring functions which may never be used. +It avoids possible compiler warnings. See the GNU C documentation for details. + + + + + + +Expands to the GNU C format function attribute if the compiler is +gcc. This is used for declaring functions which take a variable number of +arguments, with the same syntax as printf(). +It allows the compiler to type-check the arguments passed to the function. +See the GNU C documentation for details. + + +gint g_snprintf (gchar *string, + gulong n, + gchar const *format, + ...) G_GNUC_PRINTF (3, 4); + + +@format_idx: the index of the argument corresponding to the format string. +(The arguments are numbered from 1). +@arg_idx: the index of the first of the format arguments. + + + + +Expands to the GNU C format function attribute if the compiler is gcc. +This is used for declaring functions which take a variable number of +arguments, with the same syntax as scanf(). +It allows the compiler to type-check the arguments passed to the function. +See the GNU C documentation for details. + + +@format_idx: the index of the argument corresponding to the format string. +(The arguments are numbered from 1). +@arg_idx: the index of the first of the format arguments. + + + + +Expands to the GNU C format_arg function attribute if the compiler is gcc. +This function attribute specifies that a function takes a format +string for a printf(), scanf(), +strftime() or strfmon() style +function and modifies it, so that the result can be passed to a +printf(), scanf(), +strftime() or strfmon() style +function (with the remaining arguments to the format function the same as +they would have been for the unmodified string). +See the GNU C documentation for details. + + +gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2); + + +@arg_idx: the index of the argument. + + + + +Expands to the GNU C sentinel function attribute if the +compiler is gcc, or "" if it isn't. This function attribute +only applies to variadic functions and instructs the compiler to check that +the argument list is terminated with an explicit %NULL. +See the GNU C documentation for details. + + +Since: 2.8 + + + + + +Expands to the GNU C warn_unused_result function attribute +if the compiler is gcc, or "" if it isn't. This function +attribute makes the compiler emit a warning if the result of a function call +is ignored. See the GNU C documentation for details. + + +@Since: 2.10 + + + + +Expands to "" on all modern compilers, and to __FUNCTION__ +on gcc version 2.x. Don't use it. + + +@Deprecated: 2.16: Use #G_STRFUNC instead. + + + + +Expands to "" on all modern compilers, and to +__PRETTY_FUNCTION__ on gcc version 2.x. +Don't use it. + + +@Deprecated: 2.16: Use #G_STRFUNC instead. + + + + +Expands to the GNU C no_instrument_function function +attribute if the compiler is gcc. Functions with this +attribute will not be +instrumented for profiling, when the compiler is called with the + option. +See the GNU C documentation for details. + + + + + + + + + + + + + +This attribute can be used for marking library functions as being used +internally to the library only, which may allow the compiler to handle +function calls more efficiently. +Note that static functions do not need to be marked as internal in this way. +See the GNU C documentation for details. + + +When using a compiler that supports the GNU C hidden visibility attribute, +this macro expands to __attribute__((visibility("hidden"))). +When using the Sun Studio compiler, it expands to __hidden. + + +Note that for portability, the attribute should be placed before the +function declaration. While GCC allows the macro after the declaration, +Sun Studio does not. + + +G_GNUC_INTERNAL +void _g_log_fallback_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data); + + +Since: 2.6 + + + + + +Expands to the GNU C may_alias type attribute +if the compiler is gcc. Types with this attribute +will not be subjected to type-based alias analysis, but are assumed +to alias with any other type, just like char. +See the GNU C documentation for details. + + +Since: 2.14 + + + + + +Hints the compiler that the expression is likely to evaluate to a true +value. The compiler may use this information for optimizations. + + +if (G_LIKELY (random () != 1)) + g_print ("not one"); + + +@expr: the expression +@Returns: the value of @expr +@Since: 2.2 + + + + +Hints the compiler that the expression is unlikely to evaluate to a true +value. The compiler may use this information for optimizations. + + +if (G_UNLIKELY (random () == 1)) + g_print ("a random one"); + + +@expr: the expression +@Returns: the value of @expr +@Since: 2.2 + + + + +Expands to a string identifying the current code position. + + + + + + +Expands to a string identifying the current function. + + +@Since: 2.4 + + + + +The platform dependent length modifier for conversion specifiers for scanning +and printing values of type #gint16 or #guint16. It is a string literal, +but doesn't include the percent-sign, such that you can add precision and +length modifiers between percent-sign and conversion specifier and append a +conversion specifier. + + + +The following example prints "0x7b"; + + +gint16 value = 123; +g_print ("%#" G_GINT16_MODIFIER "x", value); + + + + +@Since: 2.4 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #gint16. It is a string literal, but doesn't +include the percent-sign, such that you can add precision and length +modifiers between percent-sign and conversion specifier. + + + + + +gint16 in; +gint32 out; +sscanf ("42", "%" G_GINT16_FORMAT, &in) +out = in * 1000; +g_print ("%" G_GINT32_FORMAT, out); + + + + + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #guint16. See also #G_GINT16_FORMAT. + + + + + + +The platform dependent length modifier for conversion specifiers for scanning +and printing values of type #gint32 or #guint32. It is a string literal, +See also #G_GINT16_MODIFIER. + + +@Since: 2.4 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #gint32. See also #G_GINT16_FORMAT. + + + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #guint32. See also #G_GINT16_FORMAT. + + + + + + +The platform dependent length modifier for conversion specifiers for scanning +and printing values of type #gint64 or #guint64. It is a string literal. + + + + +Some platforms do not support printing 64 bit integers, +even though the types are supported. On such platforms #G_GINT64_MODIFIER +is not defined. + + + +@Since: 2.4 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #gint64. See also #G_GINT16_FORMAT. + + + + +Some platforms do not support scanning and printing 64 bit integers, +even though the types are supported. On such platforms #G_GINT64_FORMAT +is not defined. Note that scanf() may not support 64 bit integers, even +if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() +is not recommended for parsing anyway; consider using g_ascii_strtoull() +instead. + + + + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #guint64. See also #G_GINT16_FORMAT. + + + + +Some platforms do not support scanning and printing 64 bit integers, +even though the types are supported. On such platforms #G_GUINT64_FORMAT +is not defined. Note that scanf() may not support 64 bit integers, even +if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() is not +recommended for parsing anyway; consider using g_strtoull() instead. + + + + + + + +The platform dependent length modifier for conversion specifiers for scanning +and printing values of type #gsize or #gssize. It is a string literal, + + +@Since: 2.6 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #gsize. See also #G_GINT16_FORMAT. + + +@Since: 2.6 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #gssize. See also #G_GINT16_FORMAT. + + +@Since: 2.6 + + + + +The platform dependent length modifier for conversion specifiers for scanning +and printing values of type #goffset. It is a string literal. See also +#G_GINT64_MODIFIER. + + +@Since: 2.20 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #goffset. See also #G_GINT64_FORMAT. + + +Since: 2.20 + + + + + +The platform dependent length modifier for conversion specifiers for scanning +and printing values of type #gintptr or #guintptr. It is a string literal. + + +@Since: 2.22 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #gintptr. + + +@Since: 2.22 + + + + +This is the platform dependent conversion specifier for scanning and +printing values of type #guintptr. + + +@Since: 2.22 + + diff --git a/docs/reference/glib/tmpl/main.sgml b/docs/reference/glib/tmpl/main.sgml new file mode 100644 index 0000000..39a3b46 --- /dev/null +++ b/docs/reference/glib/tmpl/main.sgml @@ -0,0 +1,1061 @@ + +The Main Event Loop + + +manages all available sources of events + + + + The main event loop manages all the available sources of events for + GLib and GTK+ applications. These events can come from any number of + different types of sources such as file descriptors (plain files, + pipes or sockets) and timeouts. New types of event sources can also + be added using g_source_attach(). + + + To allow multiple independent sets of sources to be handled in + different threads, each source is associated with a #GMainContext. + A #GMainContext can only be running in a single thread, but + sources can be added to it and removed from it from other threads. + + + Each event source is assigned a priority. The default priority, + #G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher + priorities. Values greater than 0 denote lower priorities. Events + from high priority sources are always processed before events from + lower priority sources. + + + Idle functions can also be added, and assigned a priority. These will + be run whenever no events with a higher priority are ready to be + processed. + + + The #GMainLoop data type represents a main event loop. A #GMainLoop + is created with g_main_loop_new(). After adding the initial event sources, + g_main_loop_run() is called. This continuously checks for new events from + each of the event sources and dispatches them. Finally, the + processing of an event from one of the sources leads to a call to + g_main_loop_quit() to exit the main loop, and g_main_loop_run() returns. + + + It is possible to create new instances of #GMainLoop recursively. + This is often used in GTK+ applications when showing modal dialog + boxes. Note that event sources are associated with a particular + #GMainContext, and will be checked and dispatched for all main + loops associated with that #GMainContext. + + + GTK+ contains wrappers of some of these functions, e.g. gtk_main(), + gtk_main_quit() and gtk_events_pending(). + + + Creating new sources types + + One of the unusual features of the GTK+ main loop functionality + is that new types of event source can be created and used in + addition to the builtin type of event source. A new event source + type is used for handling GDK events. A new source type is + created by deriving from the #GSource + structure. The derived type of source is represented by a + structure that has the #GSource structure as a first element, + and other elements specific to the new source type. To create + an instance of the new source type, call g_source_new() passing + in the size of the derived structure and a table of functions. + These #GSourceFuncs determine the behavior of the new source + types. + + + New source types basically interact with the main context + in two ways. Their prepare function in #GSourceFuncs can set + a timeout to determine the maximum amount of time that the + main loop will sleep before checking the source again. In + addition, or as well, the source can add file descriptors to + the set that the main context checks using g_source_add_poll(). + + + + Customizing the main loop iteration + + Single iterations of a #GMainContext can be run with + g_main_context_iteration(). In some cases, more detailed control + of exactly how the details of the main loop work is desired, + for instance, when integrating the #GMainLoop with an external + main loop. In such cases, you can call the component functions + of g_main_context_iteration() directly. These functions + are g_main_context_prepare(), g_main_context_query(), + g_main_context_check() and g_main_context_dispatch(). + + + The operation of these functions can best be seen in terms + of a state diagram, as shown in . + +
+ States of a Main Context + +
+
+ + + + + + + + + + + +The GMainLoop struct is an opaque data type +representing the main event loop of a GLib or GTK+ application. + + + + + + + + +@context: +@is_running: +@Returns: + + + + + + + +@loop: +@Returns: + + + + + + + +@loop: + + + + + + + +@loop: + + + + + + + +@loop: + + + + + + + +@loop: +@Returns: + + + + + + + +@loop: +@Returns: + + + + +Creates a new #GMainLoop for the default main loop. + + +@is_running: set to %TRUE to indicate that the loop is running. This is not +very important since calling g_main_run() will set this to %TRUE anyway. +@Returns: a new #GMainLoop. +@Deprecated: 2.2: Use g_main_loop_new() instead. + + + + +Frees the memory allocated for the #GMainLoop. + + +@loop: a #GMainLoop. +@Deprecated: 2.2: Use g_main_loop_unref() instead. + + + + +Runs a main loop until it stops running. + + +@loop: a #GMainLoop. +@Deprecated: 2.2: Use g_main_loop_run() instead. + + + + +Stops the #GMainLoop. If g_main_run() was called to run the #GMainLoop, +it will now return. + + +@loop: a #GMainLoop. +@Deprecated: 2.2: Use g_main_loop_quit() instead. + + + + +Checks if the main loop is running. + + +@loop: a #GMainLoop. +@Returns: %TRUE if the main loop is running. +@Deprecated: 2.2: USe g_main_loop_is_running() instead. + + + + +Use this for high priority event sources. +It is not used within GLib or GTK+. + + + + + + +Use this for default priority event sources. +In GLib this priority is used when adding timeout functions with +g_timeout_add(). +In GDK this priority is used for events from the X server. + + + + + + +Use this for high priority idle functions. +GTK+ uses #G_PRIORITY_HIGH_IDLE + 10 for resizing operations, and +#G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is done to +ensure that any pending resizes are processed before any pending redraws, +so that widgets are not redrawn twice unnecessarily.) + + + + + + +Use this for default priority idle functions. +In GLib this priority is used when adding idle functions with g_idle_add(). + + + + + + +Use this for very low priority background tasks. +It is not used within GLib or GTK+. + + + + + + +The GMainContext struct is an opaque data type +representing a set of sources to be handled in a main loop. + + + + + + + + +@Returns: + + + + + + + +@context: +@Returns: + + + + + + + +@context: + + + + + + + +@Returns: + + + + + + + +@context: +@may_block: +@Returns: + + + + +Runs a single iteration for the default #GMainContext. + + +@may_block: set to %TRUE if it should block (i.e. wait) until an event source +becomes ready. It will return after an event source has been processed. +If set to %FALSE it will return immediately if no event source is ready to be +processed. +@Returns: %TRUE if more events are pending. +@Deprecated: 2.2: Use g_main_context_iteration() instead. + + + + + + + +@context: +@Returns: + + + + +Checks if any events are pending for the default #GMainContext +(i.e. ready to be processed). + + +@Returns: %TRUE if any events are pending. +@Deprecated: 2.2: Use g_main_context_pending() instead. + + + + + + + +@context: +@source_id: +@Returns: + + + + + + + +@context: +@user_data: +@Returns: + + + + + + + +@context: +@funcs: +@user_data: +@Returns: + + + + + + + +@context: + + + + + + + +@context: +@Returns: + + + + + + + +@context: + + + + + + + +@context: +@Returns: + + + + + + + +@context: +@cond: +@mutex: +@Returns: + + + + + + + +@context: +@priority: +@Returns: + + + + + + + +@context: +@max_priority: +@timeout_: +@fds: +@n_fds: +@Returns: + + + + + + + +@context: +@max_priority: +@fds: +@n_fds: +@Returns: + + + + + + + +@context: + + + + + + + +@context: +@func: + + + + + + + +@context: +@Returns: + + + + +Specifies the type of function passed to g_main_context_set_poll_func(). +The semantics of the function should match those of the +poll() system call. + + +@ufds: an array of #GPollFD elements. +@nfsd: the number of elements in @ufds. +@timeout_: the maximum time to wait for an event of the file descriptors. + A negative value indicates an infinite timeout. +@Returns: the number of #GPollFD elements which have events or errors reported, +or -1 if an error occurred. + + + + + + + +@context: +@fd: +@priority: + + + + + + + +@context: +@fd: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + +Sets the function to use for the handle polling of file descriptors +for the default main context. + + +@func: the function to call to poll all file descriptors. +@Deprecated: 2.2: Use g_main_context_set_poll_func() instead. + + + + + + + +@Returns: + + + + + + + +@context: + + + + + + + +@context: + + + + + + + +@interval: +@Returns: + + + + + + + +@interval: +@Returns: + + + + + + +@interval: +@function: +@data: +@Returns: + + + + + + +@priority: +@interval: +@function: +@data: +@notify: +@Returns: + + + + + + + +@interval: +@function: +@data: +@Returns: + + + + + + + +@priority: +@interval: +@function: +@data: +@notify: +@Returns: + + + + + + + +@Returns: + + + + + + +@function: +@data: +@Returns: + + + + + + +@priority: +@function: +@data: +@notify: +@Returns: + + + + + + +@data: +@Returns: + + + + +A type which is used to hold a process identification. +On Unix, processes are identified by a process id (an +integer), while Windows uses process handles (which are +pointers). + + + + + +The type of functions to be called when a child exists. + + +@pid: the process id of the child process +@status: Status information about the child process, + see waitpid(2) for more information about this field +@data: user data passed to g_child_watch_add() + + + + + + + +@pid: +@Returns: + + + + + + + +@pid: +@function: +@data: +@Returns: + + + + + + + +@priority: +@pid: +@function: +@data: +@notify: +@Returns: + + + + + + + + + + +#gint fd; +the file descriptor to poll (or a HANDLE on Win32 platforms). + + + +#gushort events; +a bitwise combination of flags from #GIOCondition, specifying which +events should be polled for. Typically for reading from a file descriptor +you would use %G_IO_IN | %G_IO_HUP | %G_IO_ERR, and for writing you would use +%G_IO_OUT | %G_IO_ERR. + + + + +#gushort revents; +a bitwise combination of flags from #GIOCondition, returned from the +poll() function to indicate which events occurred. + + + + + + +@fd: +@fd: +@events: +@revents: + + + + + + +@fds: +@nfds: +@timeout: +@Returns: + + + + + + + + + + + +The GSource struct is an opaque data type representing +an event source. + + + + + +This is just a placeholder for #GClosureMarshal, which cannot be used here +for dependency reasons. + + + + + + +The #GSourceFuncs struct contains a table of functions used to handle +event sources in a generic manner. + + +For idle sources, the prepare and check functions always return %TRUE to +indicate that the source is always ready to be processed. +The prepare function also returns a timeout value of 0 to ensure that the +poll() call doesn't block (since that would be time +wasted which could have been spent running the idle function). + + +For timeout sources, the prepare and check functions both return %TRUE if the +timeout interval has expired. The prepare function also returns a timeout +value to ensure that the poll() call doesn't block too +long and miss the next timeout. + + +For file descriptor sources, the prepare function typically returns %FALSE, +since it must wait until poll() has been called before +it knows whether any events need to be processed. It sets the returned +timeout to -1 to indicate that it doesn't mind how long the +poll() call blocks. +In the check function, it tests the results of the poll() +call to see if the required condition has been met, and returns %TRUE if so. + + +@prepare: Called before all the file descriptors are polled. +If the source can determine that it is ready here (without waiting for the +results of the poll() call) it should return %TRUE. +It can also return a @timeout_ value which should be the maximum timeout +(in milliseconds) which should be passed to the poll() call. +The actual timeout used will be -1 if all sources returned -1, or it will +be the minimum of all the @timeout_ values returned which were >= 0. +@check: Called after all the file descriptors are polled. +The source should return %TRUE if it is ready to be dispatched. +Note that some time may have passed since the previous prepare function was +called, so the source should be checked again here. +@dispatch: Called to dispatch the event source, after it has returned %TRUE in +either its @prepare or its @check function. The @dispatch function is +passed in a callback function and data. The callback function may be +%NULL if the source was never connected to a callback using +g_source_set_callback(). The @dispatch function should call the +callback function with @user_data and whatever additional parameters are +needed for this type of event source. +@finalize: Called when the source is finalized. +@closure_callback: +@closure_marshal: + + + +The GSourceCallbackFuncs struct contains +functions for managing callback objects. + + +@ref: Called when a reference is added to the callback object. +@unref: Called when a reference to the callback object is dropped. +@get: Called to extract the callback function and data from the callback object. + + + + + + +@source_funcs: +@struct_size: +@Returns: + + + + + + + +@source: +@Returns: + + + + + + + +@source: + + + + + + + +@source: +@funcs: + + + + + + + +@source: +@context: +@Returns: + + + + + + + +@source: + + + + + + + +@source: +@Returns: + + + + + + + +@source: +@priority: + + + + + + + +@source: +@Returns: + + + + + + + +@source: +@can_recurse: + + + + + + + +@source: +@Returns: + + + + + + + +@source: +@Returns: + + + + + + + +@source: +@Returns: + + + + + + + +@source: +@func: +@data: +@notify: + + + + +Specifies the type of function passed to g_timeout_add(), g_timeout_add_full(), +g_idle_add(), and g_idle_add_full(). + + +@data: data passed to the function, set when the source was created with one +of the above functions. +@Returns: it should return %FALSE if the source should be removed. + + + + + + + +@source: +@callback_data: +@callback_funcs: + + + + + + + +@source: +@fd: + + + + + + + +@source: +@fd: + + + + + + + +@source: +@timeval: + + + + + + +@tag: +@Returns: + + + + + + +@funcs: +@user_data: +@Returns: + + + + + + +@user_data: +@Returns: + + + + diff --git a/docs/reference/glib/tmpl/markup.sgml b/docs/reference/glib/tmpl/markup.sgml new file mode 100644 index 0000000..365f5cd --- /dev/null +++ b/docs/reference/glib/tmpl/markup.sgml @@ -0,0 +1,324 @@ + +Simple XML Subset Parser + + +parses a subset of XML + + + +The "GMarkup" parser is intended to parse a simple markup format +that's a subset of XML. This is a small, efficient, easy-to-use +parser. It should not be used if you expect to interoperate with other +applications generating full-scale XML. However, it's very useful for +application data files, config files, etc. where you know your +application will be the only one writing the file. Full-scale XML +parsers should be able to parse the subset used by GMarkup, so you can +easily migrate to full-scale XML at a later time if the need arises. + + + +GMarkup is not guaranteed to signal an error on all invalid XML; the +parser may accept documents that an XML parser would not. However, XML +documents which are not well-formedBeing wellformed +is a weaker condition than being valid. See the +XML specification for +definitions of these terms. are not considered valid GMarkup +documents. + + + +Simplifications to XML include: + + + +Only UTF-8 encoding is allowed. + + + + +No user-defined entities. + + + + +Processing instructions, comments and the doctype declaration are "passed +through" but are not interpreted in any way. + + + + +No DTD or validation. + + + + + + +The markup format does support: + + + +Elements + + + + +Attributes + + + + +5 standard entities: &amp; &lt; &gt; &quot; &apos; + + + + +Character references + + + + +Sections marked as CDATA + + + + + + + + + + + + + + + +Error codes returned by markup parsing. + + +@G_MARKUP_ERROR_BAD_UTF8: text being parsed was not valid UTF-8 +@G_MARKUP_ERROR_EMPTY: document contained nothing, or only whitespace +@G_MARKUP_ERROR_PARSE: document was ill-formed +@G_MARKUP_ERROR_UNKNOWN_ELEMENT: error should be set by #GMarkupParser functions; element wasn't known +@G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE: error should be set by #GMarkupParser functions; attribute wasn't known +@G_MARKUP_ERROR_INVALID_CONTENT: error should be set by #GMarkupParser functions; content was invalid +@G_MARKUP_ERROR_MISSING_ATTRIBUTE: error should be set by #GMarkupParser functions; a required attribute was missing + + + +Error domain for markup parsing. Errors in this domain will +be from the #GMarkupError enumeration. See #GError for information on +error domains. + + + + + + +Flags that affect the behaviour of the parser. + + +@G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG: flag you should not use. +@G_MARKUP_TREAT_CDATA_AS_TEXT: When this flag is set, CDATA marked + sections are not passed literally to the @passthrough function of + the parser. Instead, the content of the section (without the + <![CDATA[ and ]]>) is + passed to the @text function. This flag was added in GLib 2.12. +@G_MARKUP_PREFIX_ERROR_POSITION: Normally errors caught by GMarkup + itself have line/column information prefixed to them to let the + caller know the location of the error. When this flag is set the + location information is also prefixed to errors generated by the + #GMarkupParser implementation functions. + + + +A parse context is used to parse a stream of bytes that you expect to +contain marked-up text. See g_markup_parse_context_new(), +#GMarkupParser, and so on for more details. + + + + + +Any of the fields in #GMarkupParser can be %NULL, in which case they +will be ignored. Except for the @error function, any of these +callbacks can set an error; in particular the +%G_MARKUP_ERROR_UNKNOWN_ELEMENT, %G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, +and %G_MARKUP_ERROR_INVALID_CONTENT errors are intended to be set +from these callbacks. If you set an error from a callback, +g_markup_parse_context_parse() will report that error back to its caller. + + +@start_element: Callback to invoke when the opening tag of an element + is seen. +@end_element: Callback to invoke when the closing tag of an element is seen. + Note that this is also called for empty tags like + <empty/>. +@text: Callback to invoke when some text is seen (text is always + inside an element). Note that the text of an element may be spread + over multiple calls of this function. If the %G_MARKUP_TREAT_CDATA_AS_TEXT + flag is set, this function is also called for the content of CDATA marked + sections. +@passthrough: Callback to invoke for comments, processing instructions + and doctype declarations; if you're re-writing the parsed document, + write the passthrough text back out in the same position. If the + %G_MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also + called for CDATA marked sections. +@error: Callback to invoke when an error occurs. + + + + + + +@text: +@length: +@Returns: + + + + + + + +@format: +@Varargs: +@Returns: + + + + + + + +@format: +@args: +@Returns: + + + + + + + +@context: +@error: +@Returns: + + + + + + + +@context: + + + + + + + +@context: +@line_number: +@char_number: + + + + + + + +@context: +@Returns: + + + + + + + +@context: +@Returns: + + + + + + + +@context: +@Returns: + + + + + + + +@parser: +@flags: +@user_data: +@user_data_dnotify: +@Returns: + + + + + + + +@context: +@text: +@text_len: +@error: +@Returns: + + + + + + + +@context: +@parser: +@user_data: + + + + + + + +@context: +@Returns: + + + + + + + +@G_MARKUP_COLLECT_INVALID: +@G_MARKUP_COLLECT_STRING: +@G_MARKUP_COLLECT_STRDUP: +@G_MARKUP_COLLECT_BOOLEAN: +@G_MARKUP_COLLECT_TRISTATE: +@G_MARKUP_COLLECT_OPTIONAL: + + + + + + +@element_name: +@attribute_names: +@attribute_values: +@error: +@first_type: +@first_attr: +@Varargs: +@Returns: + + diff --git a/docs/reference/glib/tmpl/memory.sgml b/docs/reference/glib/tmpl/memory.sgml new file mode 100644 index 0000000..c113e48 --- /dev/null +++ b/docs/reference/glib/tmpl/memory.sgml @@ -0,0 +1,423 @@ + +Memory Allocation + + +general memory-handling + + + +These functions provide support for allocating and freeing memory. + + + + +If any call to allocate memory fails, the application is terminated. +This also means that there is no need to check if the call succeeded. + + + + + +It's important to match g_malloc() with g_free(), plain malloc() with free(), +and (if you're using C++) new with delete and new[] with delete[]. Otherwise +bad things can happen, since these allocators may use different memory +pools (and new/delete call constructors and destructors). See also +g_mem_set_vtable(). + + + + + + + + + + + + + +Allocates @n_structs elements of type @struct_type. +The returned pointer is cast to a pointer to the given type. +If @n_structs is 0 it returns %NULL. +Care is taken to avoid overflow when calculating the size of the allocated block. + + +Since the returned pointer is already casted to the right type, +it is normally unnecessary to cast it explicitly, and doing +so might hide memory allocation errors. + + +@struct_type: the type of the elements to allocate +@n_structs: the number of elements to allocate +@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type + + + + +Allocates @n_structs elements of type @struct_type, initialized to 0's. +The returned pointer is cast to a pointer to the given type. +If @n_structs is 0 it returns %NULL. +Care is taken to avoid overflow when calculating the size of the allocated block. + + +Since the returned pointer is already casted to the right type, +it is normally unnecessary to cast it explicitly, and doing +so might hide memory allocation errors. + + +@struct_type: the type of the elements to allocate. +@n_structs: the number of elements to allocate. +@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type. + + + + +Reallocates the memory pointed to by @mem, so that it now has space for +@n_structs elements of type @struct_type. It returns the new address of +the memory, which may have been moved. +Care is taken to avoid overflow when calculating the size of the allocated block. + + +@struct_type: the type of the elements to allocate +@mem: the currently allocated memory +@n_structs: the number of elements to allocate +@Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type + + + + +Attempts to allocate @n_structs elements of type @struct_type, and returns +%NULL on failure. Contrast with g_new(), which aborts the program on failure. +The returned pointer is cast to a pointer to the given type. +The function returns %NULL when @n_structs is 0 of if an overflow occurs. + + +@struct_type: the type of the elements to allocate +@n_structs: the number of elements to allocate +@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type +@Since: 2.8 + + + + +Attempts to allocate @n_structs elements of type @struct_type, initialized +to 0's, and returns %NULL on failure. Contrast with g_new0(), which aborts +the program on failure. +The returned pointer is cast to a pointer to the given type. +The function returns %NULL when @n_structs is 0 of if an overflow occurs. + + +@struct_type: the type of the elements to allocate +@n_structs: the number of elements to allocate +@Returns: a pointer to the allocated memory, cast to a pointer to @struct_type +@Since: 2.8 + + + + +Attempts to reallocate the memory pointed to by @mem, so that it now has +space for @n_structs elements of type @struct_type, and returns %NULL on +failure. Contrast with g_renew(), which aborts the program on failure. +It returns the new address of the memory, which may have been moved. +The function returns %NULL if an overflow occurs. + + +@struct_type: the type of the elements to allocate +@mem: the currently allocated memory +@n_structs: the number of elements to allocate +@Returns: a pointer to the new allocated memory, cast to a pointer to @struct_type +@Since: 2.8 + + + + +Allocates @n_bytes bytes of memory. +If @n_bytes is 0 it returns %NULL. + + +@n_bytes: the number of bytes to allocate +@Returns: a pointer to the allocated memory + + + + +Allocates @n_bytes bytes of memory, initialized to 0's. +If @n_bytes is 0 it returns %NULL. + + +@n_bytes: the number of bytes to allocate +@Returns: a pointer to the allocated memory + + + + +Reallocates the memory pointed to by @mem, so that it now has space for +@n_bytes bytes of memory. It returns the new address of the memory, which may +have been moved. @mem may be %NULL, in which case it's considered to +have zero-length. @n_bytes may be 0, in which case %NULL will be returned +and @mem will be freed unless it is %NULL. + + +@mem: the memory to reallocate +@n_bytes: new size of the memory in bytes +@Returns: the new address of the allocated memory + + + + +Attempts to allocate @n_bytes, and returns %NULL on failure. +Contrast with g_malloc(), which aborts the program on failure. + + +@n_bytes: number of bytes to allocate. +@Returns: the allocated memory, or %NULL. + + + + +Attempts to allocate @n_bytes, initialized to 0's, and returns %NULL on +failure. Contrast with g_malloc0(), which aborts the program on failure. + + +@n_bytes: number of bytes to allocate +@Returns: the allocated memory, or %NULL +@Since: 2.8 + + + + +Attempts to realloc @mem to a new size, @n_bytes, and returns %NULL +on failure. Contrast with g_realloc(), which aborts the program +on failure. If @mem is %NULL, behaves the same as g_try_malloc(). + + +@mem: previously-allocated memory, or %NULL. +@n_bytes: number of bytes to allocate. +@Returns: the allocated memory, or %NULL. + + + + +This function is similar to g_malloc(), allocating (@n_blocks * @n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. + + +@n_blocks: the number of blocks to allocate +@n_block_bytes: the size of each block in bytes +@Returns: a pointer to the allocated memory +@Since: 2.24 + + + + +This function is similar to g_malloc0(), allocating (@n_blocks * @n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. + + +@n_blocks: the number of blocks to allocate +@n_block_bytes: the size of each block in bytes +@Returns: a pointer to the allocated memory +@Since: 2.24 + + + + +This function is similar to g_realloc(), allocating (@n_blocks * @n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. + + +@mem: the memory to reallocate +@n_blocks: the number of blocks to allocate +@n_block_bytes: the size of each block in bytes +@Returns: the new address of the allocated memory +@Since: 2.24 + + + + +This function is similar to g_try_malloc(), allocating (@n_blocks * @n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. + + +@n_blocks: the number of blocks to allocate +@n_block_bytes: the size of each block in bytes +@Returns: the allocated memory, or %NULL. +@Since: 2.24 + + + + +This function is similar to g_try_malloc0(), allocating (@n_blocks * @n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. + + +@n_blocks: the number of blocks to allocate +@n_block_bytes: the size of each block in bytes +@Returns: the allocated memory, or %NULL +@Since: 2.24 + + + + +This function is similar to g_try_realloc(), allocating (@n_blocks * @n_block_bytes) bytes, +but care is taken to detect possible overflow during multiplication. + + +@mem: previously-allocated memory, or %NULL. +@n_blocks: the number of blocks to allocate +@n_block_bytes: the size of each block in bytes +@Returns: the allocated memory, or %NULL. +@Since: 2.24 + + + + +Frees the memory pointed to by @mem. +If @mem is %NULL it simply returns. + + +@mem: the memory to free + + + + +This variable is %TRUE if the G_DEBUG environment variable +includes the key gc-friendly. + + + + + +Allocates @size bytes on the stack; these bytes will be freed when the current +stack frame is cleaned up. This macro essentially just wraps the alloca() +function present on most UNIX variants. +Thus it provides the same advantages and pitfalls as alloca(): + + + + alloca() is very fast, as on most systems it's implemented by just adjusting + the stack pointer register. + + + + It doesn't cause any memory fragmentation, within its scope, separate alloca() + blocks just build up and are released together at function end. + + + - Allocation sizes have to fit into the current stack frame. For instance in a + threaded environment on Linux, the per-thread stack size is limited to 2 Megabytes, + so be sparse with alloca() uses. + + + - Allocation failure due to insufficient stack space is not indicated with a %NULL + return like e.g. with malloc(). Instead, most systems probably handle it the same + way as out of stack space situations from infinite function recursion, i.e. + with a segmentation fault. + + + - Special care has to be taken when mixing alloca() with GNU C variable sized arrays. + Stack space allocated with alloca() in the same scope as a variable sized array + will be freed together with the variable sized array upon exit of that scope, and + not upon exit of the enclosing function scope. + + + + + +@size: number of bytes to allocate. +@Returns: space for @size bytes, allocated on the stack + + + + +Wraps g_alloca() in a more typesafe manner. + + +@struct_type: Type of memory chunks to be allocated +@n_structs: Number of chunks to be allocated +@Returns: Pointer to stack space for @n_structs chunks of type @struct_type + + + + + + + +@dest: +@src: +@len: + + + + +Allocates @byte_size bytes of memory, and copies @byte_size bytes into it +from @mem. If @mem is %NULL it returns %NULL. + + +@mem: the memory to copy. +@byte_size: the number of bytes to copy. +@Returns: a pointer to the newly-allocated copy of the memory, or %NULL if @mem +is %NULL. + + + + +A set of functions used to perform memory allocation. The same #GMemVTable must +be used for all allocations in the same program; a call to g_mem_set_vtable(), +if it exists, should be prior to any use of GLib. + + +@malloc: function to use for allocating memory. +@realloc: function to use for reallocating memory. +@free: function to use to free memory. +@calloc: function to use for allocating zero-filled memory. +@try_malloc: function to use for allocating memory without a default error handler. +@try_realloc: function to use for reallocating memory without a default error handler. + + + +Sets the #GMemVTable to use for memory allocation. You can use this to provide +custom memory allocation routines. This function must be called +before using any other GLib functions. The @vtable only needs to +provide malloc(), realloc(), and free() functions; GLib can provide default +implementations of the others. The malloc() and realloc() implementations +should return %NULL on failure, GLib will handle error-checking for you. +@vtable is copied, so need not persist after this function has been called. + + +@vtable: table of memory allocation routines. + + + + + + + +@Returns: + + + + +A #GMemVTable containing profiling variants of the memory +allocation functions. Use them together with g_mem_profile() +in order to get information about the memory allocation pattern +of your program. + + + + + +Outputs a summary of memory usage. + + +It outputs the frequency of allocations of different sizes, +the total number of bytes which have been allocated, +the total number of bytes which have been freed, +and the difference between the previous two values, i.e. the number of bytes +still in use. + + +Note that this function will not output anything unless you have +previously installed the #glib_mem_profiler_table with g_mem_set_vtable(). + + + + diff --git a/docs/reference/glib/tmpl/memory_chunks.sgml b/docs/reference/glib/tmpl/memory_chunks.sgml new file mode 100644 index 0000000..0bb5eef --- /dev/null +++ b/docs/reference/glib/tmpl/memory_chunks.sgml @@ -0,0 +1,163 @@ + +Memory Chunks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@name: +@atom_size: +@area_size: +@type: +@Returns: + + + + + + + +@mem_chunk: +@Returns: + + + + + + + +@mem_chunk: +@Returns: + + + + + + + +@mem_chunk: +@mem: + + + + + + + +@mem_chunk: + + + + + + + +@type: +@pre_alloc: +@alloc_type: + + + + + + + +@type: +@chunk: + + + + + + + +@type: +@chunk: + + + + + + + +@mem: +@mem_chunk: + + + + + + + +@mem_chunk: + + + + + + + +@mem_chunk: + + + + + + + + + + + + + + + + + + + + + +@mem_chunk: + + diff --git a/docs/reference/glib/tmpl/memory_slices.sgml b/docs/reference/glib/tmpl/memory_slices.sgml new file mode 100644 index 0000000..2538fa1 --- /dev/null +++ b/docs/reference/glib/tmpl/memory_slices.sgml @@ -0,0 +1,253 @@ + +Memory Slices + + +efficient way to allocate groups of equal-sized chunks of memory + + + +Memory slices provide a space-efficient and multi-processing scalable +way to allocate equal-sized pieces of memory, just like the original +#GMemChunks (from GLib <= 2.8), while avoiding their excessive +memory-waste, scalability and performance problems. + + + +To achieve these goals, the slice allocator uses a sophisticated, +layered design that has been inspired by Bonwick's slab allocator + +[Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel +memory allocator. USENIX 1994, and +[Bonwick01] Bonwick and Jonathan Adams, Magazines and vmem: Extending the +slab allocator to many cpu's and arbitrary resources. USENIX 2001 +. +It uses posix_memalign() to optimize allocations of many equally-sized +chunks, and has per-thread free lists (the so-called magazine layer) +to quickly satisfy allocation requests of already known structure sizes. +This is accompanied by extra caching logic to keep freed memory around +for some time before returning it to the system. Memory that is unused +due to alignment constraints is used for cache colorization (random +distribution of chunk addresses) to improve CPU cache utilization. The +caching layer of the slice allocator adapts itself to high lock contention +to improve scalability. + + + +The slice allocator can allocate blocks as small as two pointers, and +unlike malloc(), it does not reserve extra space per block. For large block +sizes, g_slice_new() and g_slice_alloc() will automatically delegate to the +system malloc() implementation. For newly written code it is recommended +to use the new g_slice API instead of g_malloc() and +friends, as long as objects are not resized during their lifetime and the +object size used at allocation time is still available when freeing. + + + +Using the slice allocator + + gchar *mem[10000]; + gint i; + + /* Allocate 10000 blocks. */ + for (i = 0; i < 10000; i++) + { + mem[i] = g_slice_alloc (50); + + /* Fill in the memory with some junk. */ + for (j = 0; j < 50; j++) + mem[i][j] = i * j; + } + + /* Now free all of the blocks. */ + for (i = 0; i < 10000; i++) + { + g_slice_free1 (50, mem[i]); + } + + + +Using the slice allocator with data structures + + GRealArray *array; + + /* Allocate one block, using the g_slice_new() macro. */ + array = g_slice_new (GRealArray); + + /* We can now use array just like a normal pointer to a structure. */ + array->data = NULL; + array->len = 0; + array->alloc = 0; + array->zero_terminated = (zero_terminated ? 1 : 0); + array->clear = (clear ? 1 : 0); + array->elt_size = elt_size; + + /* We can free the block, so it can be reused. */ + g_slice_free (GRealArray, array); + + + + + + + + + + + +Allocates a block of memory from the slice allocator. +The block adress handed out can be expected to be aligned +to at least 1 * sizeof (void*), +though in general slices are 2 * sizeof (void*) bytes aligned, +if a malloc() fallback implementation is used instead, +the alignment may be reduced in a libc dependent fashion. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. + + +@block_size: the number of bytes to allocate +@Returns: a pointer to the allocated memory block +@Since: 2.10 + + + + +Allocates a block of memory via g_slice_alloc() +and initialize the returned memory to 0. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. + + +@block_size: the number of bytes to allocate +@Returns: a pointer to the allocated block +@Since: 2.10 + + + + +Allocates a block of memory from the slice allocator and copies +@block_size bytes into it from @mem_block. + + +@block_size: the number of bytes to allocate +@mem_block: the memory to copy +@Returns: a pointer to the allocated memory block +@Since: 2.14 + + + + +Frees a block of memory. The memory must have been allocated via +g_slice_alloc() or g_slice_alloc0() +and the @block_size has to match the size specified upon allocation. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. + + +@block_size: the size of the block +@mem_block: a pointer to the block to free +@Since: 2.10 + + + + +Frees a linked list of memory blocks of structure type @type. +The memory blocks must be equal-sized, allocated via +g_slice_alloc() or g_slice_alloc0() +and linked together by a @next pointer (similar to #GSList). The offset +of the @next field in each block is passed as third argument. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. + + +@block_size: the size of the blocks +@mem_chain: a pointer to the first block of the chain +@next_offset: the offset of the @next field in the blocks +@Since: 2.10 + + + + +A convenience macro to allocate a block of memory from the slice allocator. +It calls g_slice_alloc() with sizeof (@type) and casts +the returned pointer to a pointer of the given type, avoiding a type cast +in the source code. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. + + +@type: the type to allocate, typically a structure name +@Returns: a pointer to the allocated block, cast to a pointer to @type. +@Since: 2.10 + + + + +A convenience macro to allocate a block of memory from the slice allocator +and set the memory to 0. It calls g_slice_alloc0() with +sizeof (@type) and casts the returned pointer to a pointer +of the given type, avoiding a type cast in the source code. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. + + +@type: the type to allocate, typically a structure name +@Returns: a pointer to the allocated block, cast to a pointer to @type. +@Since: 2.10 + + + + +A convenience macro to duplicate a block of memory using the slice allocator. +It calls g_slice_copy() with sizeof (@type) and casts +the returned pointer to a pointer of the given type, avoiding a type cast +in the source code. +Note that the underlying slice allocation mechanism can +be changed with the G_SLICE=always-malloc +environment variable. + + +@type: the type to duplicate, typically a structure name +@mem: the memory to copy into the allocated block +@Returns: a pointer to the allocated block, cast to a pointer to @type. +@Since: 2.14 + + + + +A convenience macro to free a block of memory that has been allocated +from the slice allocator. It calls g_slice_free1() using +sizeof (type) as the block size. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. + + +@type: the type of the block to free, typically a structure name +@mem: a pointer to the block to free +@Since: 2.10 + + + + +Frees a linked list of memory blocks of structure type @type. +The memory blocks must be equal-sized, allocated via +g_slice_alloc() or g_slice_alloc0() and linked together by a +@next pointer (similar to #GSList). The name of the +@next field in @type is passed as third argument. +Note that the exact release behaviour can be changed with the +G_DEBUG=gc-friendly environment variable, +also see G_SLICE for related debugging options. + + +@type: the type of the @mem_chain blocks +@mem_chain: a pointer to the first block of the chain +@next: the field name of the next pointer in @type +@Since: 2.10 + + diff --git a/docs/reference/glib/tmpl/messages.sgml b/docs/reference/glib/tmpl/messages.sgml new file mode 100644 index 0000000..0915f55 --- /dev/null +++ b/docs/reference/glib/tmpl/messages.sgml @@ -0,0 +1,297 @@ + +Message Logging + + +versatile support for logging messages with different levels of importance + + + +These functions provide support for logging error messages or messages +used for debugging. + + + +There are several built-in levels of messages, defined in #GLogLevelFlags. +These can be extended with user-defined levels. + + + + + + + + + + + + +Defines the log domain. +For applications, this is typically left as the default %NULL (or "") domain. +Libraries should define this so that any messages which they log can +be differentiated from messages from other libraries and application code. +But be careful not to define it in any public header files. + + +For example, GTK+ uses this in its Makefile.am: + + +INCLUDES = -DG_LOG_DOMAIN=\"Gtk\" + + + + + + +GLib log levels that are considered fatal by default. + + + + + + +Log level shift offset for user defined log levels (0-7 are used by GLib). + + + + + + +Specifies the prototype of log handler functions. + + +@log_domain: the log domain of the message. +@log_level: the log level of the message (including the fatal and recursion +flags). +@message: the message to process. +@user_data: user data, set in g_log_set_handler(). + + + + +Flags specifying the level of log messages. It is possible to change +how GLib treats messages of the various levels using g_log_set_handler() +and g_log_set_fatal_mask(). + + +@G_LOG_FLAG_RECURSION: internal flag +@G_LOG_FLAG_FATAL: internal flag +@G_LOG_LEVEL_ERROR: log level for errors, see g_error(). + This level is also used for messages produced by g_assert(). +@G_LOG_LEVEL_CRITICAL: log level for critical messages, see g_critical(). + This level is also used for messages produced by g_return_if_fail() and + g_return_val_if_fail(). +@G_LOG_LEVEL_WARNING: log level for warnings, see g_warning() +@G_LOG_LEVEL_MESSAGE: log level for messages, see g_message() +@G_LOG_LEVEL_INFO: log level for informational messages +@G_LOG_LEVEL_DEBUG: log level for debug messages, see g_debug() +@G_LOG_LEVEL_MASK: a mask including all log levels. + + + +Logs an error or debugging message. +If the log level has been set as fatal, the abort() +function is called to terminate the program. + + +@log_domain: the log domain, usually #G_LOG_DOMAIN. +@log_level: the log level, either from #GLogLevelFlags or a user-defined level. +@format: the message format. See the printf() +documentation. +@Varargs: the parameters to insert into the format string. + + + + +Logs an error or debugging message. +If the log level has been set as fatal, the abort() +function is called to terminate the program. + + +@log_domain: the log domain. +@log_level: the log level. +@format: the message format. See the printf() +documentation. +@args: the parameters to insert into the format string. + + + + +A convenience function/macro to log a normal message. + + +@...: format string, followed by parameters to insert into the format string (as with printf()) + + + + +A convenience function/macro to log a warning message. + + + +You can make warnings fatal at runtime by setting the %G_DEBUG environment +variable (see Running GLib Applications). + + +@...: format string, followed by parameters to insert into the format string (as with printf()) + + + + +Logs a "critical warning" (#G_LOG_LEVEL_CRITICAL). It's more or less +application-defined what constitutes a critical vs. a regular +warning. You could call g_log_set_always_fatal() to make critical +warnings exit the program, then use g_critical() for fatal errors, for +example. + + + +You can also make critical warnings fatal at runtime by setting +the %G_DEBUG environment variable (see +Running GLib Applications). + + +@...: format string, followed by parameters to insert into the format string (as with printf()) + + + + +A convenience function/macro to log an error message. +Error messages are always fatal, resulting in a call to +abort() to terminate the application. +This function will result in a core dump; don't use it for errors you +expect. Using this function indicates a bug in your program, i.e. an +assertion failure. + + +@...: format string, followed by parameters to insert into the format string (as with printf()) + + + + +A convenience function/macro to log a debug message. + + +@...: format string, followed by parameters to insert into the format string (as with printf()) +@Since: 2.6 + + + + +Sets the log handler for a domain and a set of log levels. +To handle fatal and recursive messages the @log_levels parameter +must be combined with the #G_LOG_FLAG_FATAL and #G_LOG_FLAG_RECURSION +bit flags. + + +Note that since the #G_LOG_LEVEL_ERROR log level is always fatal, if +you want to set a handler for this log level you must combine it with +#G_LOG_FLAG_FATAL. + + + +Adding a log handler for all warning messages in the default +(application) domain + + g_log_set_handler (NULL, G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL + | G_LOG_FLAG_RECURSION, my_log_handler, NULL); + + + + +Adding a log handler for all critical messages from GTK+ + + g_log_set_handler ("Gtk", G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL + | G_LOG_FLAG_RECURSION, my_log_handler, NULL); + + + + +Adding a log handler for <emphasis>all</emphasis> messages from +GLib + + g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL + | G_LOG_FLAG_RECURSION, my_log_handler, NULL); + + + +@log_domain: the log domain, or %NULL for the default "" application domain. +@log_levels: the log levels to apply the log handler for. To handle fatal +and recursive messages as well, combine the log levels with the +#G_LOG_FLAG_FATAL and #G_LOG_FLAG_RECURSION bit flags. +@log_func: the log handler function. +@user_data: data passed to the log handler. +@Returns: the id of the new handler. + + + + +Removes the log handler. + + +@log_domain: the log domain. +@handler_id: the id of the handler, which was returned in g_log_set_handler(). + + + + +Sets the message levels which are always fatal, in any log domain. +When a message with any of these levels is logged the program terminates. +You can only set the levels defined by GLib to be fatal. +%G_LOG_LEVEL_ERROR is always fatal. + + + +You can also make some message levels +fatal at runtime by setting the %G_DEBUG environment variable (see +Running GLib Applications). + + +@fatal_mask: the mask containing bits set for each level of error which is +to be fatal. +@Returns: the old fatal mask. + + + + +Sets the log levels which are fatal in the given domain. +%G_LOG_LEVEL_ERROR is always fatal. + + +@log_domain: the log domain. +@fatal_mask: the new fatal mask. +@Returns: the old fatal mask for the log domain. + + + + +The default log handler set up by GLib; g_log_set_default_handler() +allows to install an alternate default log handler. +This is used if no log handler has been set for the particular log domain +and log level combination. It outputs the message to stderr or stdout +and if the log level is fatal it calls abort(). + + +stderr is used for levels %G_LOG_LEVEL_ERROR, %G_LOG_LEVEL_CRITICAL, +%G_LOG_LEVEL_WARNING and %G_LOG_LEVEL_MESSAGE. stdout is used for the rest. + + +@log_domain: the log domain of the message. +@log_level: the level of the message. +@message: the message. +@unused_data: data passed from g_log() which is unused. + + + + +Installs a default log handler which is used if no +log handler has been set for the particular log domain +and log level combination. By default, GLib uses +g_log_default_handler() as default log handler. + + +@log_func: the log handler function. +@user_data: data passed to the log handler. +@Returns: the previous default log handler +@Since: 2.6 + + diff --git a/docs/reference/glib/tmpl/misc_utils.sgml b/docs/reference/glib/tmpl/misc_utils.sgml new file mode 100644 index 0000000..9cfb65f --- /dev/null +++ b/docs/reference/glib/tmpl/misc_utils.sgml @@ -0,0 +1,439 @@ + +Miscellaneous Utility Functions + + +a selection of portable utility functions + + + +These are portable utility functions. + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@application_name: + + + + + + + +@Returns: + + + + + + + +@prgname: + + + + + + + +@variable: +@Returns: + + + + + + + +@variable: +@value: +@overwrite: +@Returns: + + + + + + + +@variable: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@G_USER_DIRECTORY_DESKTOP: +@G_USER_DIRECTORY_DOCUMENTS: +@G_USER_DIRECTORY_DOWNLOAD: +@G_USER_DIRECTORY_MUSIC: +@G_USER_DIRECTORY_PICTURES: +@G_USER_DIRECTORY_PUBLIC_SHARE: +@G_USER_DIRECTORY_TEMPLATES: +@G_USER_DIRECTORY_VIDEOS: +@G_USER_N_DIRECTORIES: + + + + + + +@directory: +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + +@file_name: +@Returns: + + + + +This function is deprecated and will be removed in the next major +release of GLib. Use g_path_get_dirname() instead. + + + +Gets the directory components of a file name. +If the file name has no directory components "." is returned. +The returned string should be freed when no longer needed. + + +@Returns: the directory components of the file. + + + + + + + +@file_name: +@Returns: + + + + + + + +@file_name: +@Returns: + + + + + + + +@file_name: +@Returns: + + + + + + + +@file_name: +@Returns: + + + + + + + +@first_element: +@Varargs: +@Returns: + + + + + + + +@args: +@Returns: + + + + + + + +@separator: +@first_element: +@Varargs: +@Returns: + + + + + + + +@separator: +@args: +@Returns: + + + + + + + +@size: +@Returns: + + + + + + + +@program: +@Returns: + + + + +Find the position of the first bit set in @mask, searching from (but not +including) @nth_bit upwards. Bits are numbered from 0 (least significant) +to sizeof(#gulong) * 8 - 1 (31 or 63, usually). To start searching from the +0th bit, set @nth_bit to -1. + + +@mask: a #gulong containing flags. +@nth_bit: the index of the bit to start the search from. +@Returns: the index of the first bit set which is higher than @nth_bit. + + + + +Find the position of the first bit set in @mask, searching from (but not +including) @nth_bit downwards. Bits are numbered from 0 (least significant) +to sizeof(#gulong) * 8 - 1 (31 or 63, usually). To start searching from the +last bit, set @nth_bit to -1 or GLIB_SIZEOF_LONG * 8. + + +@mask: a #gulong containing flags. +@nth_bit: the index of the bit to start the search from. +@Returns: the index of the first bit set which is lower than @nth_bit. + + + + +Gets the number of bits used to hold @number, +e.g. if @number is 4, 3 bits are needed. + + +@number: a guint. +@Returns: the number of bits used to hold @number. + + + + +Gets the smallest prime number from a built-in array of primes which +is larger than @num. This is used within GLib to calculate the optimum +size of a #GHashTable. + + +The built-in array of primes ranges from 11 to 13845163 such that +each prime is approximately 1.5-2 times the previous prime. + + +@num: a #guint. +@Returns: the smallest prime number from a built-in array of primes which is +larger than @num. + + + + + + + +@func: + + + + + + + +@string: +@keys: +@nkeys: +@Returns: + + + + +Associates a string with a bit flag. +Used in g_parse_debug_string(). + + +@key: the string +@value: the flag + + + +Declares a type of function which takes no arguments and has no return value. +It is used to specify the type function passed to g_atexit(). + + + + + + +Declares a type of function which takes an arbitrary data pointer argument +and has no return value. It is not currently used in GLib or GTK+. + + +@data: a data pointer. + + + + + + + +@pbase: +@total_elems: +@size: +@compare_func: +@user_data: + + + + + + + +@nullify_location: + + diff --git a/docs/reference/glib/tmpl/modules.sgml b/docs/reference/glib/tmpl/modules.sgml new file mode 100644 index 0000000..c47df35 --- /dev/null +++ b/docs/reference/glib/tmpl/modules.sgml @@ -0,0 +1,284 @@ + +Dynamic Loading of Modules + + +portable method for dynamically loading 'plug-ins' + + + +These functions provide a portable way to dynamically load object files +(commonly known as 'plug-ins'). +The current implementation supports all systems that provide +an implementation of dlopen() (e.g. Linux/Sun), as well as HP-UX via its +shl_load() mechanism, and Windows platforms via DLLs. + + + +A program which wants to use these functions must be linked to the +libraries output by the command pkg-config --libs gmodule-2.0. + + + +To use them you must first determine whether dynamic loading +is supported on the platform by calling g_module_supported(). +If it is, you can open a module with g_module_open(), +find the module's symbols (e.g. function names) with g_module_symbol(), +and later close the module with g_module_close(). +g_module_name() will return the file name of a currently opened module. + + +If any of the above functions fail, the error status can be found with +g_module_error(). + + +The #GModule implementation features reference counting for opened modules, +and supports hook functions within a module which are called when the +module is loaded and unloaded (see #GModuleCheckInit and #GModuleUnload). + + +If your module introduces static data to common subsystems in the running +program, e.g. through calling g_quark_from_static_string ("my-module-stuff"), +it must ensure that it is never unloaded, by calling g_module_make_resident(). + + + + +Calling a function defined in a <structname>GModule</structname> + +/* the function signature for 'say_hello' */ +typedef void (* SayHelloFunc) (const char *message); + +gboolean +just_say_hello (const char *filename, GError **error) +{ + SayHelloFunc say_hello; + GModule *module; + + module = g_module_open (filename, G_MODULE_BIND_LAZY); + if (!module) + { + g_set_error (error, FOO_ERROR, FOO_ERROR_BLAH, + "%s", g_module_error ()); + return FALSE; + } + + if (!g_module_symbol (module, "say_hello", (gpointer *)&say_hello)) + { + g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, + "%s: %s", filename, g_module_error ()); + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + return FALSE; + } + + if (say_hello == NULL) + { + g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, "symbol say_hello is NULL"); + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + return FALSE; + } + + /* call our function in the module */ + say_hello ("Hello world!"); + + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + + return TRUE; +} + + + + + + + + + + + + + + +The #GModule struct is an opaque data structure to represent a +Dynamically-Loaded Module. +It should only be accessed via the following functions. + + + + + +Checks if modules are supported on the current platform. + + +@Returns: %TRUE if modules are supported. + + + + +A portable way to build the filename of a module. The platform-specific +prefix and suffix are added to the filename, if needed, and the result is +added to the directory, using the correct separator character. + + +The directory should specify the directory where the module can be found. +It can be %NULL or an empty string to indicate that the module is in a standard +platform-specific directory, though this is not recommended since the +wrong module may be found. + + +For example, calling g_module_build_path() on a Linux system with a @directory +of /lib and a @module_name of "mylibrary" will return +/lib/libmylibrary.so. On a Windows system, using +\Windows as the directory it will return +\Windows\mylibrary.dll. + + +@directory: the directory where the module is. This can be %NULL or the empty +string to indicate that the standard platform-specific directories will be +used, though that is not recommended. +@module_name: the name of the module. +@Returns: the complete path of the module, including the standard library +prefix and suffix. This should be freed when no longer needed. + + + + +Opens a module. If the module has already been opened, its reference +count is incremented. + + + +First of all g_module_open() tries to open @file_name as a module. If +that fails and @file_name has the ".la"-suffix (and is a libtool archive) +it tries to open the corresponding module. If that fails and it doesn't +have the proper module suffix for the platform (#G_MODULE_SUFFIX), this +suffix will be appended and the corresponding module will be opended. If +that fails and @file_name doesn't have the ".la"-suffix, this suffix is +appended and g_module_open() tries to open the corresponding module. If +eventually that fails as well, %NULL is returned. + + +@file_name: the name of the file containing the module, or %NULL to obtain + a #GModule representing the main program itself. +@flags: the flags used for opening the module. This can be the logical +OR of any of the #GModuleFlags. +@Returns: a #GModule on success, or %NULL on failure. + + + + +Flags passed to g_module_open(). Note that these flags are +not supported on all platforms. + + +@G_MODULE_BIND_LAZY: specifies that symbols are only resolved when needed. + The default action is to bind all symbols when the module is loaded. +@G_MODULE_BIND_LOCAL: specifies that symbols in the module should + not be added to the global name space. The default action on most + platforms is to place symbols in the module in the global name space, + which may cause conflicts with existing symbols. +@G_MODULE_BIND_MASK: mask for all flags. + + + +Gets a symbol pointer from a module, such as one exported by #G_MODULE_EXPORT. + + +Note that a valid symbol can be %NULL. + + +@module: a #GModule. +@symbol_name: the name of the symbol to find. +@symbol: returns the pointer to the symbol value. +@Returns: %TRUE on success. + + + + +Gets the filename from a #GModule. + + +@module: a #GModule. +@Returns: the filename of the module, or "main" if the module is the main +program itself. + + + + +Ensures that a module will never be unloaded. +Any future g_module_close() calls on the module will be ignored. + + +@module: a #GModule to make permanently resident. + + + + +Closes a module. + + +@module: a #GModule to close. +@Returns: %TRUE on success. + + + + +Gets a string describing the last module error. + + +@Returns: a string describing the last module error. + + + + +Specifies the type of the module initialization function. +g_module_check_init +If a module contains a function named g_module_check_init() it is called +automatically when the module is loaded. It is passed the #GModule structure +and should return %NULL on success or a string describing the initialization +error. + + +@module: the #GModule corresponding to the module which has just been loaded. +@Returns: %NULL on success, or a string describing the initialization error. + + + + +g_module_unload +Specifies the type of the module function called when it is unloaded. +If a module contains a function named g_module_unload() it is called +automatically when the module is unloaded. +It is passed the #GModule structure. + + +@module: the #GModule about to be unloaded. + + + + +Expands to the proper shared library suffix for the current platform +without the leading dot. For the most Unices and Linux this is "so", +for some HP-UX versions this is "sl" and for Windows this is "dll". + + + + + + +Used to declare functions exported by modules. This is a no-op on Linux and +Unices, but when compiling for Windows, it marks a symbol to be exported from +the library or executable being built. + + + + + + +Used to declare functions imported from modules. + + + + diff --git a/docs/reference/glib/tmpl/numerical.sgml b/docs/reference/glib/tmpl/numerical.sgml new file mode 100644 index 0000000..271cf90 --- /dev/null +++ b/docs/reference/glib/tmpl/numerical.sgml @@ -0,0 +1,122 @@ + +Numerical Definitions + + +mathematical constants, and floating point decomposition + + + +GLib offers mathematical constants such as #G_PI for the value of pi; +many platforms have these in the C library, but some don't, the GLib +versions always exist. + + + +The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the + sign, mantissa and exponent of IEEE floats and doubles. These + unions are defined as appropriate for a given platform. + IEEE floats and doubles are supported (used for + storage) by at least Intel, PPC and Sparc, for reference: http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + + + + +See http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + + + +See http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + + + +The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the + sign, mantissa and exponent of IEEE floats and doubles. These + unions are defined as appropriate for a given platform. + IEEE floats and doubles are supported (used for + storage) by at least Intel, PPC and Sparc, for reference: +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + + +The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the + sign, mantissa and exponent of IEEE floats and doubles. These + unions are defined as appropriate for a given platform. + IEEE floats and doubles are supported (used for + storage) by at least Intel, PPC and Sparc, for reference: +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + + +The base of natural logarithms. + + + + + + +The natural logarithm of 2. + + + + + + +The natural logarithm of 10. + + + + + + +The value of pi (ratio of circle's circumference to its diameter). + + + + + + +Pi divided by 2. + + + + + + +Pi divided by 4. + + + + + + +The square root of two. + + + + + + +Used for fooling around with float formats, see +http://cch.loria.fr/documentation/IEEE754/numerical_comp_guide/ncg_math.doc.html + + + + diff --git a/docs/reference/glib/tmpl/option.sgml b/docs/reference/glib/tmpl/option.sgml new file mode 100644 index 0000000..3e65869 --- /dev/null +++ b/docs/reference/glib/tmpl/option.sgml @@ -0,0 +1,380 @@ + +Commandline option parser + + + + + + + + + + + + + + + + + + + + + + + + +@G_OPTION_ERROR_UNKNOWN_OPTION: +@G_OPTION_ERROR_BAD_VALUE: +@G_OPTION_ERROR_FAILED: + + + + + + + + + + + + + +@option_name: +@value: +@data: +@error: +@Returns: + + + + + + + + + + + + + +@parameter_string: +@Returns: + + + + + + + +@context: +@summary: + + + + + + + +@context: +@Returns: + + + + + + + +@context: +@description: + + + + + + + +@context: +@Returns: + + + + + + + +@str: +@data: +@Returns: + + + + + + + +@context: +@func: +@data: +@destroy_notify: + + + + + + + +@context: +@domain: + + + + + + + +@context: + + + + + + + +@context: +@argc: +@argv: +@error: +@Returns: + + + + + + + +@context: +@help_enabled: + + + + + + + +@context: +@Returns: + + + + + + + +@context: +@ignore_unknown: + + + + + + + +@context: +@Returns: + + + + + + + +@context: +@main_help: +@group: +@Returns: + + + + + + + +@G_OPTION_ARG_NONE: +@G_OPTION_ARG_STRING: +@G_OPTION_ARG_INT: +@G_OPTION_ARG_CALLBACK: +@G_OPTION_ARG_FILENAME: +@G_OPTION_ARG_STRING_ARRAY: +@G_OPTION_ARG_FILENAME_ARRAY: +@G_OPTION_ARG_DOUBLE: +@G_OPTION_ARG_INT64: + + + + + + +@G_OPTION_FLAG_HIDDEN: +@G_OPTION_FLAG_IN_MAIN: +@G_OPTION_FLAG_REVERSE: +@G_OPTION_FLAG_NO_ARG: +@G_OPTION_FLAG_FILENAME: +@G_OPTION_FLAG_OPTIONAL_ARG: +@G_OPTION_FLAG_NOALIAS: + + + + + + + + + + + + + +@long_name: +@short_name: +@flags: +@arg: +@arg_data: +@description: +@arg_description: + + + + + + +@context: +@entries: +@translation_domain: + + + + + + + + + + + + + +@context: +@group: + + + + + + + +@context: +@group: + + + + + + + +@context: +@Returns: + + + + + + + +@name: +@description: +@help_description: +@user_data: +@destroy: +@Returns: + + + + + + + +@group: + + + + + + + +@group: +@entries: + + + + + + + +@context: +@group: +@data: +@error: +@Returns: + + + + + + + +@group: +@pre_parse_func: +@post_parse_func: + + + + + + + +@context: +@group: +@data: +@error: + + + + + + + +@group: +@error_func: + + + + + + + +@group: +@func: +@data: +@destroy_notify: + + + + + + + +@group: +@domain: + + diff --git a/docs/reference/glib/tmpl/patterns.sgml b/docs/reference/glib/tmpl/patterns.sgml new file mode 100644 index 0000000..a749a32 --- /dev/null +++ b/docs/reference/glib/tmpl/patterns.sgml @@ -0,0 +1,86 @@ + +Glob-style pattern matching + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@pattern: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec1: +@pspec2: +@Returns: + + + + + + + +@pspec: +@string_length: +@string: +@string_reversed: +@Returns: + + + + + + + +@pspec: +@string: +@Returns: + + + + + + + +@pattern: +@string: +@Returns: + + diff --git a/docs/reference/glib/tmpl/quarks.sgml b/docs/reference/glib/tmpl/quarks.sgml new file mode 100644 index 0000000..e628bf8 --- /dev/null +++ b/docs/reference/glib/tmpl/quarks.sgml @@ -0,0 +1,81 @@ + +Quarks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@string: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@quark: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@string: +@Returns: + + diff --git a/docs/reference/glib/tmpl/queue.sgml b/docs/reference/glib/tmpl/queue.sgml new file mode 100644 index 0000000..fbc2667 --- /dev/null +++ b/docs/reference/glib/tmpl/queue.sgml @@ -0,0 +1,432 @@ + +Double-ended Queues + + +double-ended queue data structure + + + +The #GQueue structure and its associated functions provide a standard +queue data structure. Internally, #GQueue uses the same data structure as +#GList to store elements. + + +The data contained in each element can be either integer values, by using one +of the +Type Conversion Macros, +or simply pointers to any type of data. + + +To create a new #GQueue, use g_queue_new(). + + +To initialize a statically-allocated #GQueue, use #G_QUEUE_INIT or +g_queue_init(). + + +To add elements, use g_queue_push_head(), g_queue_push_head_link(), +g_queue_push_tail() and g_queue_push_tail_link(). + + +To remove elements, use g_queue_pop_head() and g_queue_pop_tail(). + + +To free the entire queue, use g_queue_free(). + + + + + + + + + + + + +Contains the public fields of a Queue. + + +@head: a pointer to the first element of the queue. +@tail: a pointer to the last element of the queue. +@length: the number of elements in the queue. + + + + + + +@Returns: + + + + + + + +@queue: + + + + +A statically-allocated #GQueue must be initialized with this macro before it +can be used. This macro can be used to initialize a variable, but it cannot +be assigned to a variable. In that case you have to use g_queue_init(). + + + + +GQueue my_queue = G_QUEUE_INIT; + + + +@Since: 2.14 + + + + + + + +@queue: + + + + + + + +@queue: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@func: +@user_data: + + + + + + + +@queue: +@data: +@Returns: + + + + + + + +@queue: +@data: +@func: +@Returns: + + + + + + + +@queue: +@compare_func: +@user_data: + + + + + + + +@queue: +@data: + + + + + + + +@queue: +@data: + + + + + + + +@queue: +@data: +@n: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@n: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@n: +@Returns: + + + + + + + +@queue: +@data: +@Returns: + + + + + + + +@queue: +@data: + + + + + + + +@queue: +@data: + + + + + + + +@queue: +@sibling: +@data: + + + + + + + +@queue: +@sibling: +@data: + + + + + + + +@queue: +@data: +@func: +@user_data: + + + + + + + +@queue: +@link_: + + + + + + + +@queue: +@link_: + + + + + + + +@queue: +@n: +@link_: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@n: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@Returns: + + + + + + + +@queue: +@n: +@Returns: + + + + + + + +@queue: +@link_: +@Returns: + + + + + + + +@queue: +@link_: + + + + + + + +@queue: +@link_: + + diff --git a/docs/reference/glib/tmpl/random_numbers.sgml b/docs/reference/glib/tmpl/random_numbers.sgml new file mode 100644 index 0000000..c59bf94 --- /dev/null +++ b/docs/reference/glib/tmpl/random_numbers.sgml @@ -0,0 +1,189 @@ + +Random Numbers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@seed: +@Returns: + + + + + + + +@seed: +@seed_length: +@Returns: + + + + + + + +@Returns: + + + + + + + +@rand_: +@Returns: + + + + + + + +@rand_: + + + + + + + +@rand_: +@seed: + + + + + + + +@rand_: +@seed: +@seed_length: + + + + + + + +@rand_: + + + + + + + +@rand_: +@Returns: + + + + + + + +@rand_: +@begin: +@end: +@Returns: + + + + + + + +@rand_: +@Returns: + + + + + + + +@rand_: +@begin: +@end: +@Returns: + + + + + + + +@seed: + + + + + + + + + + + + + + +@Returns: + + + + + + + +@begin: +@end: +@Returns: + + + + + + + +@Returns: + + + + + + + +@begin: +@end: +@Returns: + + diff --git a/docs/reference/glib/tmpl/relations.sgml b/docs/reference/glib/tmpl/relations.sgml new file mode 100644 index 0000000..a77f4c7 --- /dev/null +++ b/docs/reference/glib/tmpl/relations.sgml @@ -0,0 +1,141 @@ + +Relations and Tuples + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fields: +@Returns: + + + + + + + +@relation: +@field: +@hash_func: +@key_equal_func: + + + + + + + +@relation: +@Varargs: + + + + + + + +@relation: +@Varargs: +@Returns: + + + + + + + +@relation: +@key: +@field: +@Returns: + + + + + + + +@relation: +@key: +@field: +@Returns: + + + + + + + +@relation: +@key: +@field: +@Returns: + + + + + + + +@relation: + + + + + + + +@relation: + + + + + + + +@len: + + + + + + +@tuples: + + + + + + + +@tuples: +@index_: +@field: +@Returns: + + diff --git a/docs/reference/glib/tmpl/scanner.sgml b/docs/reference/glib/tmpl/scanner.sgml new file mode 100644 index 0000000..dc9da80 --- /dev/null +++ b/docs/reference/glib/tmpl/scanner.sgml @@ -0,0 +1,604 @@ + +Lexical Scanner + + +a general purpose lexical scanner + + + +The #GScanner and its associated functions provide a general purpose +lexical scanner. + + + + + + + + + + + + + + +The data structure representing a lexical scanner. + + +You should set input_name after creating +the scanner, since it is used by the default message handler when +displaying warnings and errors. If you are scanning a file, the file +name would be a good choice. + + +The user_data and +max_parse_errors fields are not used. +If you need to associate extra data with the scanner you can place them here. + + +If you want to use your own message handler you can set the +msg_handler field. The type of the message +handler function is declared by #GScannerMsgFunc. + + +@user_data: +@max_parse_errors: +@parse_errors: +@input_name: +@qdata: +@config: +@token: token parsed by the last g_scanner_get_next_token() +@value: value of the last token from g_scanner_get_next_token() +@line: line number of the last token from g_scanner_get_next_token() +@position: char number of the last token from g_scanner_get_next_token() +@next_token: token parsed by the last g_scanner_peek_next_token() +@next_value: value of the last token from g_scanner_peek_next_token() +@next_line: line number of the last token from g_scanner_peek_next_token() +@next_position: char number of the last token from g_scanner_peek_next_token() +@symbol_table: +@input_fd: +@text: +@text_end: +@buffer: +@scope_id: +@msg_handler: function to handle GScanner message output + + + +Specifies the #GScanner parser configuration. Most settings can be changed during +the parsing phase and will affect the lexical parsing of the next unpeeked token. + + +cset_skip_characters specifies which characters +should be skipped by the scanner (the default is the whitespace characters: +space, tab, carriage-return and line-feed). + + +cset_identifier_first specifies the characters +which can start identifiers (the default is #G_CSET_a_2_z, "_", and +#G_CSET_A_2_Z). + + +cset_identifier_nth specifies the characters +which can be used in identifiers, after the first character (the default +is #G_CSET_a_2_z, "_0123456789", #G_CSET_A_2_Z, #G_CSET_LATINS, +#G_CSET_LATINC). + + +cpair_comment_single specifies the characters +at the start and end of single-line comments. The default is "#\n" which +means that single-line comments start with a '#' and continue until a '\n' +(end of line). + + +case_sensitive specifies if symbols are +case sensitive (the default is %FALSE). + + +skip_comment_multi specifies if multi-line +comments are skipped and not returned as tokens (the default is %TRUE). + + +skip_comment_single specifies if single-line +comments are skipped and not returned as tokens (the default is %TRUE). + + +scan_comment_multi specifies if multi-line +comments are recognized (the default is %TRUE). + + +scan_identifier specifies if identifiers +are recognized (the default is %TRUE). + + +scan_identifier_1char specifies if single-character +identifiers are recognized (the default is %FALSE). + + +scan_identifier_NULL specifies if +NULL is reported as #G_TOKEN_IDENTIFIER_NULL. +(the default is %FALSE). + + +scan_symbols specifies if symbols are +recognized (the default is %TRUE). + + +scan_binary specifies if binary numbers +are recognized (the default is %FALSE). + + +scan_octal specifies if octal numbers +are recognized (the default is %TRUE). + + +scan_float specifies if floating point numbers +are recognized (the default is %TRUE). + + +scan_hex specifies if hexadecimal numbers +are recognized (the default is %TRUE). + + +scan_hex_dollar specifies if '$' is recognized +as a prefix for hexadecimal numbers (the default is %FALSE). + + +scan_string_sq specifies if strings can be +enclosed in single quotes (the default is %TRUE). + + +scan_string_dq specifies if strings can be +enclosed in double quotes (the default is %TRUE). + + +numbers_2_int specifies if binary, octal and +hexadecimal numbers are reported as #G_TOKEN_INT (the default is %TRUE). + + +int_2_float specifies if all numbers are +reported as #G_TOKEN_FLOAT (the default is %FALSE). + + +identifier_2_string specifies if identifiers +are reported as strings (the default is %FALSE). + + +char_2_token specifies if characters +are reported by setting token = ch or as #G_TOKEN_CHAR +(the default is %TRUE). + + +symbol_2_token specifies if symbols +are reported by setting token = v_symbol or as +#G_TOKEN_SYMBOL (the default is %FALSE). + + +scope_0_fallback specifies if a symbol +is searched for in the default scope in addition to the current scope +(the default is %FALSE). + + +@cset_skip_characters: +@cset_identifier_first: +@cset_identifier_nth: +@cpair_comment_single: +@case_sensitive: +@skip_comment_multi: +@skip_comment_single: +@scan_comment_multi: +@scan_identifier: +@scan_identifier_1char: +@scan_identifier_NULL: +@scan_symbols: +@scan_binary: +@scan_octal: +@scan_float: +@scan_hex: +@scan_hex_dollar: +@scan_string_sq: +@scan_string_dq: +@numbers_2_int: +@int_2_float: +@identifier_2_string: +@char_2_token: +@symbol_2_token: +@scope_0_fallback: +@store_int64: +@padding_dummy: + + + +Creates a new #GScanner. +The @config_templ structure specifies the initial settings of the scanner, +which are copied into the #GScanner config field. +If you pass %NULL then the default settings are used. + + +@config_templ: the initial scanner settings. +@Returns: the new #GScanner. + + + + +Frees all memory used by the #GScanner. + + +@scanner: a #GScanner. + + + + +Prepares to scan a file. + + +@scanner: a #GScanner. +@input_fd: a file descriptor. + + + + +Rewinds the filedescriptor to the current buffer position and blows +the file read ahead buffer. This is useful for third party uses of +the scanners filedescriptor, which hooks onto the current scanning +position. + + +@scanner: a #GScanner. + + + + +Prepares to scan a text buffer. + + +@scanner: a #GScanner. +@text: the text buffer to scan. +@text_len: the length of the text buffer. + + + + +Parses the next token, without removing it from the input stream. +The token data is placed in the +next_token, +next_value, +next_line, and +next_position fields of the #GScanner structure. + + +Note that, while the token is not removed from the input stream (i.e. +the next call to g_scanner_get_next_token() will return the same token), +it will not be reevaluated. This can lead to surprising results when +changing scope or the scanner configuration after peeking the next token. +Getting the next token after switching the scope or configuration will +return whatever was peeked before, regardless of any symbols that may +have been added or removed in the new scope. + + +@scanner: a #GScanner. +@Returns: the type of the token. + + + + +Parses the next token just like g_scanner_peek_next_token() and also +removes it from the input stream. +The token data is placed in the +token, +value, +line, and +position fields of the #GScanner structure. + + +@scanner: a #GScanner. +@Returns: the type of the token. + + + + +Returns %TRUE if the scanner has reached the end of the file or text buffer. + + +@scanner: a #GScanner. +@Returns: %TRUE if the scanner has reached the end of the file or text buffer. + + + + +Returns the current line in the input stream (counting from 1). +This is the line of the last token parsed via g_scanner_get_next_token(). + + +@scanner: a #GScanner. +@Returns: the current line. + + + + +Returns the current position in the current line (counting from 0). +This is the position of the last token parsed via g_scanner_get_next_token(). + + +@scanner: a #GScanner. +@Returns: the current position on the line. + + + + +Gets the current token type. +This is simply the token field in the #GScanner +structure. + + +@scanner: a #GScanner. +@Returns: the current token type. + + + + +Gets the current token value. +This is simply the value field in the #GScanner +structure. + + +@scanner: a #GScanner. +@Returns: the current token value. + + + + +Sets the current scope. + + +@scanner: a #GScanner. +@scope_id: the new scope id. +@Returns: the old scope id. + + + + +Adds a symbol to the given scope. + + +@scanner: a #GScanner. +@scope_id: the scope id. +@symbol: the symbol to add. +@value: the value of the symbol. + + + + +Calls the given function for each of the symbol/value pairs in the +given scope of the #GScanner. The function is passed the symbol and +value of each pair, and the given @user_data parameter. + + +@scanner: a #GScanner. +@scope_id: the scope id. +@func: the function to call for each symbol/value pair. +@user_data: user data to pass to the function. + + + + +Looks up a symbol in a scope and return its value. If the +symbol is not bound in the scope, %NULL is returned. + + +@scanner: a #GScanner. +@scope_id: the scope id. +@symbol: the symbol to look up. +@Returns: the value of @symbol in the given scope, or %NULL +if @symbol is not bound in the given scope. + + + + +Removes a symbol from a scope. + + +@scanner: a #GScanner. +@scope_id: the scope id. +@symbol: the symbol to remove. + + + + +Adds a symbol to the default scope. + + +@scanner: a #GScanner. +@symbol: the symbol to add. +@value: the value of the symbol. +@Deprecated: 2.2: Use g_scanner_scope_add_symbol() instead. + + + + +Removes a symbol from the default scope. + + +@scanner: a #GScanner. +@symbol: the symbol to remove. +@Deprecated: 2.2: Use g_scanner_scope_remove_symbol() instead. + + + + +Calls a function for each symbol in the default scope. + + +@scanner: a #GScanner. +@func: the function to call with each symbol. +@data: data to pass to the function. +@Deprecated: 2.2: Use g_scanner_scope_foreach_symbol() instead. + + + + +There is no reason to use this macro, since it does nothing. + + +@scanner: a #GScanner. +@Deprecated: 2.2: This macro does nothing. + + + + +There is no reason to use this macro, since it does nothing. + + +@scanner: a #GScanner. +@Deprecated: 2.2: This macro does nothing. + + + + +Looks up a symbol in the current scope and return its value. If the +symbol is not bound in the current scope, %NULL is returned. + + +@scanner: a #GScanner. +@symbol: the symbol to look up. +@Returns: the value of @symbol in the current scope, or %NULL +if @symbol is not bound in the current scope. + + + + +Outputs a warning message, via the #GScanner message handler. + + +@scanner: a #GScanner. +@format: the message format. See the printf() +documentation. +@Varargs: the parameters to insert into the format string. + + + + +Outputs an error message, via the #GScanner message handler. + + +@scanner: a #GScanner. +@format: the message format. See the printf() +documentation. +@Varargs: the parameters to insert into the format string. + + + + +Outputs a message through the scanner's msg_handler, resulting from an +unexpected token in the input stream. +Note that you should not call g_scanner_peek_next_token() followed by +g_scanner_unexp_token() without an intermediate call to +g_scanner_get_next_token(), as g_scanner_unexp_token() evaluates the +scanner's current token (not the peeked token) to construct part +of the message. + + +@scanner: a #GScanner. +@expected_token: the expected token. +@identifier_spec: a string describing how the scanner's user refers to + identifiers (%NULL defaults to "identifier"). + This is used if @expected_token is #G_TOKEN_IDENTIFIER + or #G_TOKEN_IDENTIFIER_NULL. +@symbol_spec: a string describing how the scanner's user refers to + symbols (%NULL defaults to "symbol"). + This is used if @expected_token is #G_TOKEN_SYMBOL or + any token value greater than #G_TOKEN_LAST. +@symbol_name: the name of the symbol, if the scanner's current token + is a symbol. +@message: a message string to output at the end of the warning/error, or %NULL. +@is_error: if %TRUE it is output as an error. If %FALSE it is output as a + warning. + + + + +Specifies the type of the message handler function. + + +@scanner: a #GScanner. +@message: the message. +@error: %TRUE if the message signals an error, %FALSE if it + signals a warning. + + + + +The set of lowercase ASCII alphabet characters. +Used for specifying valid identifier characters in #GScannerConfig. + + + + + + +The set of uppercase ASCII alphabet characters. +Used for specifying valid identifier characters in #GScannerConfig. + + + + + + +The set of digits. +Used for specifying valid identifier characters in #GScannerConfig. + + + + + + +The set of uppercase ISO 8859-1 alphabet characters which are +not ASCII characters. +Used for specifying valid identifier characters in #GScannerConfig. + + + + + + +The set of lowercase ISO 8859-1 alphabet characters which are +not ASCII characters. +Used for specifying valid identifier characters in #GScannerConfig. + + + + + + +The possible types of token returned from each g_scanner_get_next_token() call. + + +@G_TOKEN_EOF: the end of the file. +@G_TOKEN_LEFT_PAREN: a '(' character. +@G_TOKEN_LEFT_CURLY: a '{' character. +@G_TOKEN_RIGHT_CURLY: a '}' character. + + + +A union holding the value of the token. + + + + + +The possible errors, used in the v_error field +of #GTokenValue, when the token is a #G_TOKEN_ERROR. + + +@G_ERR_UNKNOWN: unknown error. +@G_ERR_UNEXP_EOF: unexpected end of file. +@G_ERR_UNEXP_EOF_IN_STRING: unterminated string constant. +@G_ERR_UNEXP_EOF_IN_COMMENT: unterminated comment. +@G_ERR_NON_DIGIT_IN_CONST: non-digit character in a number. +@G_ERR_DIGIT_RADIX: digit beyond radix in a number. +@G_ERR_FLOAT_RADIX: non-decimal floating point number. +@G_ERR_FLOAT_MALFORMED: malformed floating point number. + diff --git a/docs/reference/glib/tmpl/sequence.sgml b/docs/reference/glib/tmpl/sequence.sgml new file mode 100644 index 0000000..7428a6d --- /dev/null +++ b/docs/reference/glib/tmpl/sequence.sgml @@ -0,0 +1,384 @@ + +Sequences + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@a: +@b: +@data: +@Returns: + + + + + + + +@data_destroy: +@Returns: + + + + + + + +@seq: + + + + + + + +@seq: +@Returns: + + + + + + + +@seq: +@func: +@user_data: + + + + + + + +@begin: +@end: +@func: +@user_data: + + + + + + + +@seq: +@cmp_func: +@cmp_data: + + + + + + + +@seq: +@cmp_func: +@cmp_data: + + + + + + + +@seq: +@Returns: + + + + + + + +@seq: +@Returns: + + + + + + + +@seq: +@pos: +@Returns: + + + + + + + +@seq: +@data: +@Returns: + + + + + + + +@seq: +@data: +@Returns: + + + + + + + +@iter: +@data: +@Returns: + + + + + + + +@src: +@dest: + + + + + + + +@a: +@b: + + + + + + + +@seq: +@data: +@cmp_func: +@cmp_data: +@Returns: + + + + + + + +@seq: +@data: +@iter_cmp: +@cmp_data: +@Returns: + + + + + + + +@iter: +@cmp_func: +@cmp_data: + + + + + + + +@iter: +@iter_cmp: +@cmp_data: + + + + + + + +@iter: + + + + + + + +@begin: +@end: + + + + + + + +@dest: +@begin: +@end: + + + + + + + +@seq: +@data: +@cmp_func: +@cmp_data: +@Returns: + + + + + + + +@seq: +@data: +@iter_cmp: +@cmp_data: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@data: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@delta: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@a: +@b: +@Returns: + + + + + + + +@begin: +@end: +@Returns: + + diff --git a/docs/reference/glib/tmpl/shell.sgml b/docs/reference/glib/tmpl/shell.sgml new file mode 100644 index 0000000..26638ac --- /dev/null +++ b/docs/reference/glib/tmpl/shell.sgml @@ -0,0 +1,68 @@ + +Shell-related Utilities + + + + + + + + + + + + + + + + + + + + + + + + +@G_SHELL_ERROR_BAD_QUOTING: +@G_SHELL_ERROR_EMPTY_STRING: +@G_SHELL_ERROR_FAILED: + + + + + + + + + + + + + +@command_line: +@argcp: +@argvp: +@error: +@Returns: + + + + + + + +@unquoted_string: +@Returns: + + + + + + + +@quoted_string: +@error: +@Returns: + + diff --git a/docs/reference/glib/tmpl/spawn.sgml b/docs/reference/glib/tmpl/spawn.sgml new file mode 100644 index 0000000..c0f8d25 --- /dev/null +++ b/docs/reference/glib/tmpl/spawn.sgml @@ -0,0 +1,195 @@ + +Spawning Processes + + +process launching + + + + + + + + + + + + + + + + +Error codes returned by spawning processes. + + +@G_SPAWN_ERROR_FORK: Fork failed due to lack of memory. +@G_SPAWN_ERROR_READ: Read or select on pipes failed. +@G_SPAWN_ERROR_CHDIR: Changing to working directory failed. +@G_SPAWN_ERROR_ACCES: execv() returned %EACCES. +@G_SPAWN_ERROR_PERM: execv() returned %EPERM. +@G_SPAWN_ERROR_2BIG: execv() returned %E2BIG. +@G_SPAWN_ERROR_NOEXEC: execv() returned %ENOEXEC. +@G_SPAWN_ERROR_NAMETOOLONG: execv() returned %ENAMETOOLONG. +@G_SPAWN_ERROR_NOENT: execv() returned %ENOENT. +@G_SPAWN_ERROR_NOMEM: execv() returned %ENOMEM. +@G_SPAWN_ERROR_NOTDIR: execv() returned %ENOTDIR. +@G_SPAWN_ERROR_LOOP: execv() returned %ELOOP. +@G_SPAWN_ERROR_TXTBUSY: execv() returned %ETXTBUSY. +@G_SPAWN_ERROR_IO: execv() returned %EIO. +@G_SPAWN_ERROR_NFILE: execv() returned %ENFILE. +@G_SPAWN_ERROR_MFILE: execv() returned %EMFILE. +@G_SPAWN_ERROR_INVAL: execv() returned %EINVAL. +@G_SPAWN_ERROR_ISDIR: execv() returned %EISDIR. +@G_SPAWN_ERROR_LIBBAD: execv() returned %ELIBBAD. +@G_SPAWN_ERROR_FAILED: Some other fatal failure, error->message should explain. + + + +Error domain for spawning processes. Errors in this domain will +be from the #GSpawnError enumeration. See #GError for information on +error domains. + + + + + + +Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes(). + + +@G_SPAWN_LEAVE_DESCRIPTORS_OPEN: the parent's open file descriptors will be + inherited by the child; otherwise all descriptors except stdin/stdout/stderr + will be closed before calling exec() in the child. +@G_SPAWN_DO_NOT_REAP_CHILD: the child will not be automatically reaped; you + must use g_child_watch_add() yourself (or call waitpid() + or handle SIGCHLD yourself), or the child will become a zombie. +@G_SPAWN_SEARCH_PATH: argv[0] need not be an absolute path, + it will be looked for in the user's PATH. +@G_SPAWN_STDOUT_TO_DEV_NULL: the child's standard output will be discarded, + instead of going to the same location as the parent's standard output. +@G_SPAWN_STDERR_TO_DEV_NULL: the child's standard error will be discarded. +@G_SPAWN_CHILD_INHERITS_STDIN: the child will inherit the parent's standard + input (by default, the child's standard input is attached to + /dev/null). +@G_SPAWN_FILE_AND_ARGV_ZERO: the first element of argv is + the file to execute, while the remaining elements are the actual argument + vector to pass to the file. Normally g_spawn_async_with_pipes() uses + argv[0] as the file to execute, and passes all of + argv to the child. + + + +Specifies the type of the setup function passed to g_spawn_async(), +g_spawn_sync() and g_spawn_async_with_pipes(). On POSIX platforms it +is called in the child after GLib has performed all the setup it plans +to perform but before calling exec(). On POSIX actions taken in this +function will thus only affect the child, not the parent. + + + +Note that POSIX allows only async-signal-safe functions (see signal(7)) +to be called in the child between fork() and exec(), which drastically +limits the usefulness of child setup functions. + + + +Also note that modifying the environment from the child setup function +may not have the intended effect, since it will get overridden by +a non-%NULL @env argument to the g_spawn... functions. + + + +On Windows the function is called in the parent. Its usefulness on +Windows is thus questionable. In many cases executing the child setup +function in the parent can have ill effects, and you should be very +careful when porting software to Windows that uses child setup +functions. + + +@user_data: user data to pass to the function. + + + + + + + +@working_directory: +@argv: +@envp: +@flags: +@child_setup: +@user_data: +@child_pid: +@standard_input: +@standard_output: +@standard_error: +@error: +@Returns: + + + + + + + +@working_directory: +@argv: +@envp: +@flags: +@child_setup: +@user_data: +@child_pid: +@error: +@Returns: + + + + + + + +@working_directory: +@argv: +@envp: +@flags: +@child_setup: +@user_data: +@standard_output: +@standard_error: +@exit_status: +@error: +@Returns: + + + + + + + +@command_line: +@error: +@Returns: + + + + + + + +@command_line: +@standard_output: +@standard_error: +@exit_status: +@error: +@Returns: + + + + + + + +@pid: + + diff --git a/docs/reference/glib/tmpl/string_chunks.sgml b/docs/reference/glib/tmpl/string_chunks.sgml new file mode 100644 index 0000000..7da9591 --- /dev/null +++ b/docs/reference/glib/tmpl/string_chunks.sgml @@ -0,0 +1,83 @@ + +String Chunks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@size: +@Returns: + + + + + + + +@chunk: +@string: +@Returns: + + + + + + + +@chunk: +@string: +@Returns: + + + + + + + +@chunk: +@string: +@len: +@Returns: + + + + + + + +@chunk: + + + + + + + +@chunk: + + diff --git a/docs/reference/glib/tmpl/string_utils.sgml b/docs/reference/glib/tmpl/string_utils.sgml new file mode 100644 index 0000000..faaec7d --- /dev/null +++ b/docs/reference/glib/tmpl/string_utils.sgml @@ -0,0 +1,900 @@ + +String Utility Functions + + +various string-related functions + + + +This section describes a number of utility functions for creating, +duplicating, and manipulating strings. + + +Note that the functions g_printf(), g_fprintf(), g_sprintf(), g_snprintf(), +g_vprintf(), g_vfprintf(), g_vsprintf() and g_vsnprintf() are declared in +the header gprintf.h which is not +included in glib.h (otherwise using +glib.h would drag in stdio.h), so +you'll have to explicitly include <glib/gprintf.h> +in order to use the GLib printf() functions. + + +While you may use the printf() functions to format UTF-8 strings, notice that +the precision of a %Ns parameter is interpreted as the +number of bytes, not characters to print. +On top of that, the GNU libc implementation of the printf() functions has the "feature" +that it checks that the string given for the %Ns parameter +consists of a whole number of characters in the current encoding. So, unless you +are sure you are always going to be in an UTF-8 locale or your know your text is restricted +to ASCII, avoid using %Ns. +If your intention is to format strings for a certain number of columns, then +%Ns is not a correct solution anyway, since it fails to take +wide characters (see g_unichar_iswide()) into account. + + + + + + + + + + + + + + + +@str: +@Returns: + + + + + + + +@str: +@n: +@Returns: + + + + + + +@str_array: +@Returns: + + + + + + + +@length: +@fill_char: +@Returns: + + + + + + + +@dest: +@src: +@Returns: + + + + + + + +@haystack: +@haystack_len: +@needle: +@Returns: + + + + + + + +@haystack: +@needle: +@Returns: + + + + + + + +@haystack: +@haystack_len: +@needle: +@Returns: + + + + + + + +@str: +@prefix: +@Returns: + + + + + + + +@str: +@suffix: +@Returns: + + + + + + + +@str1: +@str2: +@Returns: + + + + + + + +@dest: +@src: +@dest_size: +@Returns: + + + + + + + +@dest: +@src: +@dest_size: +@Returns: + + + + + + +@format: +@Varargs: +@Returns: + + + + + + + +@format: +@args: +@Returns: + + + + + + + +@format: +@Varargs: +@Returns: + + + + + + + +@format: +@args: +@Returns: + + + + + + + +@file: +@format: +@Varargs: +@Returns: + + + + + + + +@file: +@format: +@args: +@Returns: + + + + + + + +@string: +@format: +@Varargs: +@Returns: + + + + + + + +@string: +@format: +@args: +@Returns: + + + + + + +@string: +@n: +@format: +@Varargs: +@Returns: + + + + + + +@string: +@n: +@format: +@args: +@Returns: + + + + + + + +@string: +@format: +@args: +@Returns: + + + + +Calculates the maximum space needed to store the output of the sprintf() +function. + + +@format: the format string. See the printf() documentation. +@args: the parameters to be inserted into the format string. +@Returns: the maximum space needed to store the formatted string. + + + + +Determines whether a character is alphanumeric. + + +Unlike the standard C library isalnum() function, this only +recognizes standard ASCII letters and ignores the locale, returning +%FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII alphanumeric character + + + + +Determines whether a character is alphabetic (i.e. a letter). + + +Unlike the standard C library isalpha() function, this only +recognizes standard ASCII letters and ignores the locale, returning +%FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII alphabetic character + + + + +Determines whether a character is a control character. + + +Unlike the standard C library iscntrl() function, this only +recognizes standard ASCII control characters and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII control character. + + + + +Determines whether a character is digit (0-9). + + +Unlike the standard C library isdigit() function, +this takes a char, not an int, so don't call it +on %EOF but no need to cast to #guchar before passing a possibly +non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII digit. + + + + +Determines whether a character is a printing character and not a space. + + +Unlike the standard C library isgraph() function, +this only recognizes standard ASCII characters and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII printing character other than space. + + + + +Determines whether a character is an ASCII lower case letter. + + +Unlike the standard C library islower() function, +this only recognizes standard ASCII letters and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to worry about casting to #guchar +before passing a possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII lower case letter + + + + +Determines whether a character is a printing character. + + +Unlike the standard C library isprint() function, +this only recognizes standard ASCII characters and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII printing character. + + + + +Determines whether a character is a punctuation character. + + +Unlike the standard C library ispunct() function, +this only recognizes standard ASCII letters and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII punctuation character. + + + + +Determines whether a character is a white-space character. + + +Unlike the standard C library isspace() function, +this only recognizes standard ASCII white-space and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII white-space character + + + + +Determines whether a character is an ASCII upper case letter. + + +Unlike the standard C library isupper() function, +this only recognizes standard ASCII letters and ignores the locale, +returning %FALSE for all non-ASCII characters. Also unlike the standard +library function, this takes a char, not an int, +so don't call it on %EOF but no need to worry about casting to #guchar +before passing a possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII upper case letter + + + + +Determines whether a character is a hexadecimal-digit character. + + +Unlike the standard C library isxdigit() function, +this takes a char, not an int, so +don't call it on %EOF but no need to cast to #guchar before passing a +possibly non-ASCII character in. + + +@c: any character +@Returns: %TRUE if @c is an ASCII hexadecimal-digit character. + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@s1: +@s2: +@Returns: + + + + + + + +@s1: +@s2: +@n: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + +@string: +@Returns: + + + + + + +@string: +@Returns: + + + + + + +@s1: +@s2: +@Returns: + + + + + + +@s1: +@s2: +@n: +@Returns: + + + + + + + +@string: +@Returns: + + + + + + + +@nptr: +@endptr: +@base: +@Returns: + + + + + + + +@nptr: +@endptr: +@base: +@Returns: + + + + +A good size for a buffer to be passed into g_ascii_dtostr(). +It is guaranteed to be enough for all output of that function on systems with + 64bit IEEE-compatible doubles. + + +The typical usage would be something like: + + char buf[G_ASCII_DTOSTR_BUF_SIZE]; + + fprintf (out, "value=%s\n", g_ascii_dtostr (buf, sizeof (buf), value)); + + + + + + + + + + +@nptr: +@endptr: +@Returns: + + + + + + + +@buffer: +@buf_len: +@d: +@Returns: + + + + + + + +@buffer: +@buf_len: +@format: +@d: +@Returns: + + + + + + + +@nptr: +@endptr: +@Returns: + + + + +Removes leading whitespace from a string, by moving the rest of the +characters forward. + + +This function doesn't allocate or reallocate any memory; it modifies @string +in place. The pointer to @string is returned to allow the nesting of functions. + + +Also see g_strchomp() and g_strstrip(). + + +@string: a string to remove the leading whitespace from. +@Returns: @string. + + + + +Removes trailing whitespace from a string. + + +This function doesn't allocate or reallocate any memory; it modifies @string in +place. The pointer to @string is returned to allow the nesting of functions. + + +Also see g_strchug() and g_strstrip(). + + +@string: a string to remove the trailing whitespace from. +@Returns: @string. + + + + +Removes leading and trailing whitespace from a string. See g_strchomp() and +g_strchug(). + + +@string: a string to remove the leading and trailing whitespace from. + + + + +Converts any delimiter characters in @string to @new_delimiter. +Any characters in @string which are found in @delimiters are changed +to the @new_delimiter character. Modifies @string in place, and returns +@string itself, not a copy. The return value is to allow nesting such as +g_ascii_strup (g_strdelimit (str, "abc", '?')). + + +@string: the string to convert. +@delimiters: a string containing the current delimiters, or %NULL to use the +standard delimiters defined in #G_STR_DELIMITERS. +@new_delimiter: the new delimiter character. +@Returns: @string. + + + + +The standard delimiters, used in g_strdelimit(). + + + + + + +Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\' and +'"' in the string @source by inserting a '\' before +them. Additionally all characters in the range 0x01-0x1F (everything +below SPACE) and in the range 0x7F-0xFF (all non-ASCII chars) are +replaced with a '\' followed by their octal representation. Characters +supplied in @exceptions are not escaped. + + + +g_strcompress() does the reverse conversion. + + +@source: a string to escape. +@exceptions: a string of characters not to escape in @source. +@Returns: a newly-allocated copy of @source with certain +characters escaped. See above. + + + + +Replaces all escaped characters with their one byte equivalent. It +does the reverse conversion of g_strescape(). + + +@source: a string to compress. +@Returns: a newly-allocated copy of @source with all escaped +character compressed. + + + + +For each character in @string, if the character is not in @valid_chars, +replaces the character with @substitutor. Modifies @string in place, +and return @string itself, not a copy. The return value is to allow +nesting such as g_ascii_strup (g_strcanon (str, "abc", '?')). + + +@string: a nul-terminated array of bytes. +@valid_chars: bytes permitted in @string. +@substitutor: replacement character for disallowed bytes. +@Returns: @string. + + + + + + +@string: +@delimiter: +@max_tokens: +@Returns: + + + + + + + +@string: +@delimiters: +@max_tokens: +@Returns: + + + + + + + +@str_array: + + + + + + + +@string1: +@Varargs: +@Returns: + + + + + + + +@separator: +@Varargs: +@Returns: + + + + + + + +@separator: +@str_array: +@Returns: + + + + + + + +@str_array: +@Returns: + + + + + + + +@errnum: +@Returns: + + + + + + + +@signum: +@Returns: + + diff --git a/docs/reference/glib/tmpl/strings.sgml b/docs/reference/glib/tmpl/strings.sgml new file mode 100644 index 0000000..58a1307 --- /dev/null +++ b/docs/reference/glib/tmpl/strings.sgml @@ -0,0 +1,365 @@ + +Strings + + +text buffers which grow automatically as text is added + + + +A #GString is similar to a standard C string, except that it grows +automatically as text is appended or inserted. Also, it stores the +length of the string, so can be used for binary data with embedded +nul bytes. + + + + + + + + + + + + +The #GString struct contains the public fields of a #GString. + + +@str: points to the character data. It may move as text is added. + The str field is nul-terminated and so + can be used as an ordinary C string. +@len: contains the length of the string, not including the + terminating nul byte. +@allocated_len: the number of bytes that can be stored in the + string before it needs to be reallocated. May be larger than @len. + + + + + + +@init: +@Returns: + + + + + + + +@init: +@len: +@Returns: + + + + + + + +@dfl_size: +@Returns: + + + + + + + +@string: +@rval: +@Returns: + + + + + + + + + + + + + + + + + + + + + +@string: +@format: +@args: + + + + + + + +@string: +@format: +@args: + + + + + + + +@string: +@format: +@Varargs: + + + + + + + +@string: +@format: +@Varargs: + + + + + + + +@string: +@val: +@Returns: + + + + + + + +@string: +@c: +@Returns: + + + + + + + +@string: +@wc: +@Returns: + + + + + + + +@string: +@val: +@len: +@Returns: + + + + + + + +@string: +@unescaped: +@reserved_chars_allowed: +@allow_utf8: +@Returns: + + + + + + + +@string: +@val: +@Returns: + + + + + + + +@string: +@c: +@Returns: + + + + + + + +@string: +@wc: +@Returns: + + + + + + + +@string: +@val: +@len: +@Returns: + + + + + + + +@string: +@pos: +@val: +@Returns: + + + + + + + +@string: +@pos: +@c: +@Returns: + + + + + + + +@string: +@pos: +@wc: +@Returns: + + + + + + + +@string: +@pos: +@val: +@len: +@Returns: + + + + + + + +@string: +@pos: +@val: +@Returns: + + + + + + + +@string: +@pos: +@val: +@len: +@Returns: + + + + + + + +@string: +@pos: +@len: +@Returns: + + + + + + + +@string: +@len: +@Returns: + + + + + + + +@string: +@len: +@Returns: + + + + + + + +@string: +@free_segment: +@Returns: + + + + + + +@string: +@Returns: + + + + + + +@string: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@v: +@v2: +@Returns: + + diff --git a/docs/reference/glib/tmpl/testing.sgml b/docs/reference/glib/tmpl/testing.sgml new file mode 100644 index 0000000..4dd819e --- /dev/null +++ b/docs/reference/glib/tmpl/testing.sgml @@ -0,0 +1,646 @@ + +Testing + + +a test framework + + + +GLib provides a framework for writing and maintaining unit tests +in parallel to the code they are testing. The API is designed according +to established concepts found in the other test frameworks (JUnit, NUnit, +RUnit), which in turn is based on smalltalk unit testing concepts. + + + Test case + + Tests (test methods) are grouped together with their + fixture into test cases. + + + + Fixture + + A test fixture consists of fixture data and setup and teardown methods + to establish the environment for the test functions. We use fresh + fixtures, i.e. fixtures are newly set up and torn down around each test + invocation to avoid dependencies between tests. + + + + Test suite + + Test cases can be grouped into test suites, to allow subsets of the + available tests to be run. Test suites can be grouped into other test + suites as well. + + + +The API is designed to handle creation and registration of test suites and +test cases implicitly. A simple call like + + g_test_add_func ("/misc/assertions", test_assertions); + +creates a test suite called "misc" with a single test case named "assertions", +which consists of running the test_assertions function. + + +In addition to the traditional g_assert(), the test framework provides +an extended set of assertions for string and numerical comparisons: +g_assert_cmpfloat(), g_assert_cmpint(), g_assert_cmpuint(), g_assert_cmphex(), +g_assert_cmpstr(). The advantage of these variants over plain g_assert() +is that the assertion messages can be more elaborate, and include the +values of the compared entities. + + +GLib ships with two utilities called gtester and gtester-report to +facilitate running tests and producing nicely formatted test reports. + + + + +gtester, +gtester-report + + + + + + + + + + +@minimized_quantity: +@format: +@Varargs: + + + + + + + +@maximized_quantity: +@format: +@Varargs: + + + + + + + +@argc: +@argv: +@Varargs: + + + + +Returns %TRUE if tests are run in quick mode. + + + + + + +Returns %TRUE if tests are run in slow mode. + + + + + + +Returns %TRUE if tests are run in thorough mode. + + + + + + +Returns %TRUE if tests are run in performance mode. + + + + + + +Returns %TRUE if tests are run in verbose mode. + + + + + + +Returns %TRUE if tests are run in quiet mode. + + + + + + + + + +@Returns: + + + + + + + +@testpath: +@test_func: + + + + + + + +@testpath: +@test_data: +@test_func: + + + + + + + +@testpath: +@Fixture: +@tdata: +@fsetup: +@ftest: +@fteardown: + + + + + + + +@format: +@Varargs: + + + + + + + +@uri_pattern: + + + + + + + +@bug_uri_snippet: + + + + + + + +@log_domain: +@log_level: +@message: +@user_data: +@Returns: + + + + + + + +@log_func: +@user_data: + + + + + + + + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@gfree_pointer: + + + + + + + +@destroy_func: +@destroy_data: + + + + +Enqueue an object to be released with g_object_unref() during +the next teardown phase. This is equivalent to calling g_test_queue_destroy() +with a destroy callback of g_object_unref(). + + +@gobject: the object to unref +@Since: 2.16 + + + + +Test traps are guards around forked tests. These flags +determine what traps to set. + + +@G_TEST_TRAP_SILENCE_STDOUT: Redirect stdout of the test child to + /dev/null so it cannot be observed on the + console during test runs. The actual output is still captured + though to allow later tests with g_test_trap_assert_stdout(). +@G_TEST_TRAP_SILENCE_STDERR: Redirect stderr of the test child to + /dev/null so it cannot be observed on the + console during test runs. The actual output is still captured + though to allow later tests with g_test_trap_assert_stderr(). +@G_TEST_TRAP_INHERIT_STDIN: If this flag is given, stdin of the forked + child process is shared with stdin of its parent process. It is + redirected to /dev/null otherwise. + + + + + + +@usec_timeout: +@test_trap_flags: +@Returns: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + +Assert that the last forked test passed. See g_test_trap_fork(). + + +@Since: 2.16 + + + + +Assert that the last forked test failed. See g_test_trap_fork(). + + +@Since: 2.16 + + + + +Assert that the stdout output of the last forked test matches @soutpattern. +See g_test_trap_fork(). + + +@soutpattern: a glob-style pattern +@Since: 2.16 + + + + +Assert that the stdout output of the last forked test does not match +@soutpattern. See g_test_trap_fork(). + + +@soutpattern: a glob-style pattern +@Since: 2.16 + + + + +Assert that the stderr output of the last forked test matches @serrpattern. +See g_test_trap_fork(). + + +@serrpattern: a glob-style pattern +@Since: 2.16 + + + + +Assert that the stderr output of the last forked test does not match +@serrpattern. See g_test_trap_fork(). + + +@serrpattern: a glob-style pattern +@Since: 2.16 + + + + +Get a reproducible random bit (0 or 1), +see g_test_rand_int() for details on test case random numbers. + + +@Since: 2.16 + + + + + + + +@Returns: + + + + + + + +@begin: +@end: +@Returns: + + + + + + + +@Returns: + + + + + + + +@range_start: +@range_end: +@Returns: + + + + +Debugging macro to terminate the application if the assertion fails. +If the assertion fails (i.e. the expression is not true), an error message +is logged and the application is terminated. + + +The macro can be turned off in final releases of code by defining +#G_DISABLE_ASSERT when compiling the application. + + +@expr: the expression to check. + + + + +Debugging macro to terminate the application if it is ever reached. +If it is reached, an error message is logged and the application is terminated. + + +The macro can be turned off in final releases of code by defining +#G_DISABLE_ASSERT when compiling the application. + + + + + + +Debugging macro to terminate the application with a warning message +if a string comparison fails. +The strings are compared using g_strcmp0(). + + +The effect of g_assert_cmpstr (s1, op, s2) is the same +as g_assert (g_strcmp0 (s1, s2) op 0). The advantage of this macro +is that it can produce a message that includes the actual values of @s1 +and @s2. + + + g_assert_cmpstr (mystring, ==, "fubar"); + + +@s1: a string (may be %NULL) +@cmp: The comparison operator to use. One of ==, !=, <, >, <=, >=. +@s2: another string (may be %NULL) +@Since: 2.16 + + + + +Debugging macro to terminate the application with a warning message +if an integer comparison fails. + + +The effect of g_assert_cmpint (n1, op, n2) is the same +as g_assert (n1 op n2). The advantage of this macro +is that it can produce a message that includes the actual values of @n1 +and @n2. + + +@n1: an integer +@cmp: The comparison operator to use. One of ==, !=, <, >, <=, >=. +@n2: another integer +@Since: 2.16 + + + + +Debugging macro to terminate the application with a warning message +if an unsigned integer comparison fails. + + +The effect of g_assert_cmpuint (n1, op, n2) is the same +as g_assert (n1 op n2). The advantage of this macro +is that it can produce a message that includes the actual values of @n1 +and @n2. + + +@n1: an unsigned integer +@cmp: The comparison operator to use. One of ==, !=, <, >, <=, >=. +@n2: another unsigned integer +@Since: 2.16 + + + + +Debugging macro to terminate the application with a warning message +if an unsigned integer comparison fails. This is a variant of +g_assert_cmpuint() that displays the numbers in hexadecimal notation +in the message. + + +@n1: an unsigned integer +@cmp: The comparison operator to use. One of ==, !=, <, >, <=, >=. +@n2: another unsigned integer +@Since: 2.16 + + + + +Debugging macro to terminate the application with a warning message +if a floating point number comparison fails. + + +The effect of g_assert_cmpfloat (n1, op, n2) is the same +as g_assert (n1 op n2). The advantage of this function +is that it can produce a message that includes the actual values of @n1 +and @n2. + + +@n1: an floating point number +@cmp: The comparison operator to use. One of ==, !=, <, >, <=, >=. +@n2: another floating point number +@Since: 2.16 + + + + +Debugging macro to terminate the application with a warning message +if a method has returned a #GError. + + +The effect of g_assert_no_error (err) is the same +as g_assert (err == NULL). The advantage of this macro +is that it can produce a message that includes the error message and code. + + +@err: a #GError, possibly %NULL +@Since: 2.20 + + + + +Debugging macro to terminate the application with a warning message +if a method has not returned the correct #GError. + + +The effect of g_assert_error (err, dom, c) is the same +as g_assert (err != NULL && err->domain == dom && err->code == c). +The advantage of this macro is that it can produce a message that +includes the incorrect error message and code. + + +This can only be used to test for a specific error. If you want to +test that @err is set, but don't care what it's set to, just use +g_assert (err != NULL) + + +@err: a #GError, possibly %NULL +@dom: the expected error domain (a #GQuark) +@c: the expected error code +@Since: 2.20 + + + + +An opaque structure representing a test case. + + + + + +An opaque structure representing a test suite. + + + + + + + + +@test_name: +@data_size: +@test_data: +@data_setup: +@data_test: +@data_teardown: +@Returns: + + + + + + + +@suite_name: +@Returns: + + + + + + + +@Returns: + + + + + + + +@suite: +@test_case: + + + + + + + +@suite: +@nestedsuite: + + + + + + + +@suite: +@Returns: + + diff --git a/docs/reference/glib/tmpl/thread_pools.sgml b/docs/reference/glib/tmpl/thread_pools.sgml new file mode 100644 index 0000000..f206209 --- /dev/null +++ b/docs/reference/glib/tmpl/thread_pools.sgml @@ -0,0 +1,157 @@ + +Thread Pools + + + + + + + + + + + + + + + + + + + + + + + + +@func: +@user_data: +@exclusive: + + + + + + +@func: +@user_data: +@max_threads: +@exclusive: +@error: +@Returns: + + + + + + + +@pool: +@data: +@error: + + + + + + + +@pool: +@max_threads: +@error: + + + + + + + +@pool: +@Returns: + + + + + + + +@pool: +@Returns: + + + + + + + +@pool: +@Returns: + + + + + + + +@pool: +@immediate: +@wait_: + + + + + + + +@max_threads: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + + + + + + + + +@pool: +@func: +@user_data: + + + + + + + +@interval: + + + + + + + +@Returns: + + diff --git a/docs/reference/glib/tmpl/threads.sgml b/docs/reference/glib/tmpl/threads.sgml new file mode 100644 index 0000000..ee501e4 --- /dev/null +++ b/docs/reference/glib/tmpl/threads.sgml @@ -0,0 +1,737 @@ + +Threads + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@G_THREAD_ERROR_AGAIN: + + + + + + +@mutex_new: +@mutex_lock: +@mutex_trylock: +@mutex_unlock: +@mutex_free: +@cond_new: +@cond_signal: +@cond_broadcast: +@cond_wait: +@cond_timed_wait: +@cond_free: +@private_new: +@private_get: +@private_set: +@thread_create: +@thread_yield: +@thread_join: +@thread_exit: +@thread_set_priority: +@thread_self: +@thread_equal: + + + + + + +@vtable: + + + + + + + +@Returns: + + + + + + + +@Returns: + + + + + + + +@data: +@Returns: + + + + + + + +@G_THREAD_PRIORITY_LOW: +@G_THREAD_PRIORITY_NORMAL: +@G_THREAD_PRIORITY_HIGH: +@G_THREAD_PRIORITY_URGENT: + + + + + + + + + + + + +@func: +@data: +@joinable: +@error: +@Returns: + + + + + + + +@func: +@data: +@stack_size: +@joinable: +@bound: +@priority: +@error: +@Returns: + + + + + + + +@Returns: + + + + + + + +@thread: +@Returns: + + + + + + + +@thread: +@priority: + + + + + + + + + + + + + + +@retval: + + + + + + + +@thread_func: +@user_data: + + + + + + + + + + + + + +@Returns: + + + + + + + +@mutex: + + + + + + + +@mutex: +@Returns: + + + + + + + +@mutex: + + + + + + + +@mutex: + + + + + + + + + + + + + + + + + + + + +@mutex: + + + + + + + +@mutex: + + + + + + + +@mutex: +@Returns: + + + + + + + +@mutex: + + + + + + + +@mutex: +@Returns: + + + + + + + +@mutex: + + + + + + + +@name: + + + + + + + +@name: + + + + + + + +@name: + + + + + + + +@name: + + + + + + + +@name: + + + + + + + +@name: + + + + + + + + + + + + + + + + + + + + +@mutex: + + + + + + + +@mutex: + + + + + + + +@mutex: +@Returns: + + + + + + + +@mutex: + + + + + + + +@mutex: +@depth: + + + + + + + +@mutex: +@Returns: + + + + + + + +@mutex: + + + + + + + + + + + + + + + + + + + + +@lock: + + + + + + + +@lock: + + + + + + + +@lock: +@Returns: + + + + + + + +@lock: + + + + + + + +@lock: + + + + + + + +@lock: +@Returns: + + + + + + + +@lock: + + + + + + + +@lock: + + + + + + + + + + + + + +@Returns: + + + + + + + +@cond: + + + + + + + +@cond: + + + + + + + +@cond: +@mutex: + + + + + + + +@cond: +@mutex: +@abs_time: +@Returns: + + + + + + + +@cond: + + + + + + + + + + + + + +@destructor: +@Returns: + + + + + + + +@private_key: +@Returns: + + + + + + + +@private_key: +@data: + + + + + + + + + + + + + + + + + + + + +@private_key: + + + + + + + +@private_key: +@Returns: + + + + + + + +@private_key: +@data: +@notify: + + + + + + + +@private_key: + + + + + + + +@status: +@retval: + + + + + + +@G_ONCE_STATUS_NOTCALLED: +@G_ONCE_STATUS_PROGRESS: +@G_ONCE_STATUS_READY: + + + + + + + + + + + + + +@once: +@func: +@arg: + + + + + + + +@value_location: +@Returns: + + + + + + + +@value_location: +@initialization_value: + + + + + + + +@address: +@lock_bit: + + + + + + + +@address: +@lock_bit: +@Returns: + + + + + + + +@address: +@lock_bit: + + diff --git a/docs/reference/glib/tmpl/timers.sgml b/docs/reference/glib/tmpl/timers.sgml new file mode 100644 index 0000000..bb3f563 --- /dev/null +++ b/docs/reference/glib/tmpl/timers.sgml @@ -0,0 +1,85 @@ + +Timers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@Returns: + + + + + + + +@timer: + + + + + + + +@timer: + + + + + + + +@timer: + + + + + + + +@timer: +@microseconds: +@Returns: + + + + + + + +@timer: + + + + + + + +@timer: + + diff --git a/docs/reference/glib/tmpl/trash_stack.sgml b/docs/reference/glib/tmpl/trash_stack.sgml new file mode 100644 index 0000000..ead22b8 --- /dev/null +++ b/docs/reference/glib/tmpl/trash_stack.sgml @@ -0,0 +1,74 @@ + +Trash Stacks + + +maintain a stack of unused allocated memory chunks + + + +A #GTrashStack is an efficient way to keep a stack of unused allocated +memory chunks. Each memory chunk is required to be large enough to hold +a #gpointer. This allows the stack to be maintained without any space +overhead, since the stack pointers can be stored inside the memory chunks. + + +There is no function to create a #GTrashStack. A %NULL #GTrashStack* +is a perfectly valid empty stack. + + + + + + + + + + + + +Each piece of memory that is pushed onto the stack +is cast to a GTrashStack*. + + +@next: pointer to the previous element of the stack, +gets stored in the first sizeof (gpointer) +bytes of the element. + + + +Pushes a piece of memory onto a #GTrashStack. + + +@stack_p: a pointer to a #GTrashStack. +@data_p: the piece of memory to push on the stack. + + + + +Pops a piece of memory off a #GTrashStack. + + +@stack_p: a pointer to a #GTrashStack. +@Returns: the element at the top of the stack. + + + + +Returns the element at the top of a #GTrashStack which may be %NULL. + + +@stack_p: a pointer to a #GTrashStack. +@Returns: the element at the top of the stack. + + + + +Returns the height of a #GTrashStack. +Note that execution of this function is of O(N) complexity +where N denotes the number of items on the stack. + + +@stack_p: a pointer to a #GTrashStack. +@Returns: the height of the stack. + + diff --git a/docs/reference/glib/tmpl/trees-binary.sgml b/docs/reference/glib/tmpl/trees-binary.sgml new file mode 100644 index 0000000..4a6f94a --- /dev/null +++ b/docs/reference/glib/tmpl/trees-binary.sgml @@ -0,0 +1,216 @@ + +Balanced Binary Trees + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@key_compare_func: +@Returns: + + + + + + + +@tree: +@Returns: + + + + + + + +@tree: + + + + + + + +@key_compare_func: +@key_compare_data: +@Returns: + + + + + + + +@key_compare_func: +@key_compare_data: +@key_destroy_func: +@value_destroy_func: +@Returns: + + + + + + + +@tree: +@key: +@value: + + + + + + + +@tree: +@key: +@value: + + + + + + + +@tree: +@Returns: + + + + + + + +@tree: +@Returns: + + + + + + + +@tree: +@key: +@Returns: + + + + + + + +@tree: +@lookup_key: +@orig_key: +@value: +@Returns: + + + + + + + +@tree: +@func: +@user_data: + + + + + + + +@tree: +@traverse_func: +@traverse_type: +@user_data: + + + + + + + +@key: +@value: +@data: +@Returns: + + + + + + + +@G_IN_ORDER: +@G_PRE_ORDER: +@G_POST_ORDER: +@G_LEVEL_ORDER: + + + + + + +@tree: +@search_func: +@user_data: +@Returns: + + + + + + + +@tree: +@key: +@Returns: + + + + + + + +@tree: +@key: +@Returns: + + + + + + + +@tree: + + diff --git a/docs/reference/glib/tmpl/trees-nary.sgml b/docs/reference/glib/tmpl/trees-nary.sgml new file mode 100644 index 0000000..d4aefd6 --- /dev/null +++ b/docs/reference/glib/tmpl/trees-nary.sgml @@ -0,0 +1,431 @@ + +N-ary Trees + + + + + + + + + + + + + + + + + + + + + + + + +@data: +@next: +@prev: +@parent: +@children: + + + + + + +@data: +@Returns: + + + + + + + +@node: +@Returns: + + + + + + + +@src: +@data: +@Returns: + + + + + + + +@node: +@copy_func: +@data: +@Returns: + + + + + + + +@parent: +@position: +@node: +@Returns: + + + + + + + +@parent: +@sibling: +@node: +@Returns: + + + + + + + +@parent: +@sibling: +@node: +@Returns: + + + + + + + +@parent: +@node: + + + + + + + +@parent: +@node: +@Returns: + + + + + + + +@parent: +@position: +@data: + + + + + + + +@parent: +@sibling: +@data: + + + + + + + +@parent: +@data: + + + + + + + +@parent: +@data: + + + + + + + +@node: + + + + + + + +@root: +@order: +@flags: +@max_depth: +@func: +@data: + + + + + + + +@G_TRAVERSE_LEAVES: +@G_TRAVERSE_NON_LEAVES: +@G_TRAVERSE_ALL: +@G_TRAVERSE_MASK: +@G_TRAVERSE_LEAFS: +@G_TRAVERSE_NON_LEAFS: + + + + + + +@node: +@data: +@Returns: + + + + + + + +@node: +@flags: +@func: +@data: + + + + + + + +@node: +@data: + + + + + + + +@node: +@Returns: + + + + + + + +@root: +@order: +@flags: +@data: +@Returns: + + + + + + + +@node: +@flags: +@data: +@Returns: + + + + + + + +@node: +@data: +@Returns: + + + + + + + +@node: +@child: +@Returns: + + + + + + + +@node: + + + + + + + +@node: +@Returns: + + + + + + + +@node: +@n: +@Returns: + + + + + + + +@node: +@Returns: + + + + + + + +@node: + + + + + + + +@node: + + + + + + + +@node: +@Returns: + + + + + + + +@node: + + + + + + + +@node: + + + + + + + +@node: +@Returns: + + + + + + + +@root: +@flags: +@Returns: + + + + + + + +@node: +@Returns: + + + + + + + +@node: +@descendant: +@Returns: + + + + + + + +@root: +@Returns: + + + + + + + +@node: + + + + + + + +@root: + + + + + + + +@dummy: + + + + + + + + + diff --git a/docs/reference/glib/tmpl/type_conversion.sgml b/docs/reference/glib/tmpl/type_conversion.sgml new file mode 100644 index 0000000..0d1d94b --- /dev/null +++ b/docs/reference/glib/tmpl/type_conversion.sgml @@ -0,0 +1,122 @@ + +Type Conversion Macros + + +portably storing integers in pointer variables + + + +Many times GLib, GTK+, and other libraries allow you to pass "user +data" to a callback, in the form of a void pointer. From time to time +you want to pass an integer instead of a pointer. You could allocate +an integer, with something like: + + int *ip = g_new (int, 1); + *ip = 42; + +But this is inconvenient, and it's annoying to have to free the +memory at some later time. + + +Pointers are always at least 32 bits in size (on all platforms GLib +intends to support). Thus you can store at least 32-bit integer values +in a pointer value. Naively, you might try this, but it's incorrect: + + gpointer p; + int i; + p = (void*) 42; + i = (int) p; + +Again, that example was not correct, don't copy it. +The problem is that on some systems you need to do this: + + gpointer p; + int i; + p = (void*) (long) 42; + i = (int) (long) p; + +So GPOINTER_TO_INT(), GINT_TO_POINTER(), etc. do the right thing +on the current platform. + + + + +YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE IN ANY +WAY SHAPE OR FORM. These macros ONLY allow +storing integers in pointers, and only preserve 32 bits of the +integer; values outside the range of a 32-bit integer will be mangled. + + + + + + + + + + + + + + +Stuffs an integer into a pointer type. + + +Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE +IN ANY WAY SHAPE OR FORM. These macros ONLY allow +storing integers in pointers, and only preserve 32 bits of the +integer; values outside the range of a 32-bit integer will be mangled. + + +@i: integer to stuff into a pointer. + + + + +Extracts an integer from a pointer. The integer must have +been stored in the pointer with GINT_TO_POINTER(). + + +Remember, YOU MAY NOT STORE POINTERS IN INTEGERS. THIS IS NOT PORTABLE +IN ANY WAY SHAPE OR FORM. These macros ONLY allow +storing integers in pointers, and only preserve 32 bits of the +integer; values outside the range of a 32-bit integer will be mangled. + + +@p: pointer containing an integer. + + + + +Stuffs an unsigned integer into a pointer type. + + +@u: unsigned integer to stuff into the pointer. + + + + +Extracts an unsigned integer from a pointer. The integer must have +been stored in the pointer with GUINT_TO_POINTER(). + + +@p: pointer to extract an unsigned integer from. + + + + +Stuffs a #gsize into a pointer type. + + +@s: #gsize to stuff into the pointer. + + + + +Extracts a #gsize from a pointer. The #gsize must have +been stored in the pointer with GSIZE_TO_POINTER(). + + +@p: pointer to extract a #gsize from. + + diff --git a/docs/reference/glib/tmpl/types.sgml b/docs/reference/glib/tmpl/types.sgml new file mode 100644 index 0000000..37efca2 --- /dev/null +++ b/docs/reference/glib/tmpl/types.sgml @@ -0,0 +1,324 @@ + +Basic Types + + +standard GLib types, defined for ease-of-use and portability + + + +GLib defines a number of commonly used types, which can be divided into +4 groups: + + + +New types which are not part of standard C (but are defined +in various C standard library header files) - +#gboolean, #gsize, #gssize, #goffset, #gintptr, #guintptr. + + + +Integer types which are guaranteed to be the same size across all platforms - +#gint8, #guint8, #gint16, #guint16, #gint32, #guint32, #gint64, #guint64. + + + +Types which are easier to use than their standard C counterparts - +#gpointer, #gconstpointer, #guchar, #guint, #gushort, #gulong. + + + +Types which correspond exactly to standard C types, but are included +for completeness - #gchar, #gint, #gshort, #glong, #gfloat, #gdouble. + + + + + + + + + + + + + + + +A standard boolean type. +Variables of this type should only contain the value %TRUE or %FALSE. + + + + + +An untyped pointer. +#gpointer looks better and is easier to use than void*. + + + + + +An untyped pointer to constant data. +The data pointed to should not be changed. + + +This is typically used in function prototypes to indicate that the +data pointed to will not be altered by the function. + + + + + +Corresponds to the standard C char type. + + + + + +Corresponds to the standard C unsigned char type. + + + + + +Corresponds to the standard C int type. +Values of this type can range from #G_MININT to #G_MAXINT. + + + + + +Corresponds to the standard C unsigned int type. +Values of this type can range from 0 to #G_MAXUINT. + + + + + +Corresponds to the standard C short type. +Values of this type can range from #G_MINSHORT to #G_MAXSHORT. + + + + + +Corresponds to the standard C unsigned short type. +Values of this type can range from 0 to #G_MAXUSHORT. + + + + + +Corresponds to the standard C long type. +Values of this type can range from #G_MINLONG to #G_MAXLONG. + + + + + +Corresponds to the standard C unsigned long type. +Values of this type can range from 0 to #G_MAXULONG. + + + + + +A signed integer guaranteed to be 8 bits on all platforms. +Values of this type can range from #G_MININT8 (= -128) to +#G_MAXINT8 (= 127). + + + + + +An unsigned integer guaranteed to be 8 bits on all platforms. +Values of this type can range from 0 to #G_MAXUINT8 (= 255). + + + + + +A signed integer guaranteed to be 16 bits on all platforms. +Values of this type can range from #G_MININT16 (= -32,768) to +#G_MAXINT16 (= 32,767). + + +To print or scan values of this type, use +%G_GINT16_MODIFIER and/or %G_GINT16_FORMAT. + + + + + +An unsigned integer guaranteed to be 16 bits on all platforms. +Values of this type can range from 0 to #G_MAXUINT16 (= 65,535). + + +To print or scan values of this type, use +%G_GINT16_MODIFIER and/or %G_GUINT16_FORMAT. + + + + + +A signed integer guaranteed to be 32 bits on all platforms. +Values of this type can range from #G_MININT32 (= -2,147,483,648) to +#G_MAXINT32 (= 2,147,483,647). + + +To print or scan values of this type, use +%G_GINT32_MODIFIER and/or %G_GINT32_FORMAT. + + + + + +An unsigned integer guaranteed to be 32 bits on all platforms. +Values of this type can range from 0 to #G_MAXUINT32 (= 4,294,967,295). + + +To print or scan values of this type, use +%G_GINT32_MODIFIER and/or %G_GUINT32_FORMAT. + + + + + +This macro is defined if 64-bit signed and unsigned integers are available +on the platform. + + +@Deprecated: GLib requires 64-bit integer support since version 2.0, therefore +%G_HAVE_GINT64 is always defined. + + + + +A signed integer guaranteed to be 64 bits on all platforms. +Values of this type can range from #G_MININT64 (= -9,223,372,036,854,775,808) to +#G_MAXINT64 (= 9,223,372,036,854,775,807). + + +To print or scan values of this type, use +%G_GINT64_MODIFIER and/or %G_GINT64_FORMAT. + + + + + +An unsigned integer guaranteed to be 64 bits on all platforms. +Values of this type can range from 0 to #G_MAXUINT64 (= 18,446,744,073,709,551,615). + + +To print or scan values of this type, use +%G_GINT64_MODIFIER and/or %G_GUINT64_FORMAT. + + + + + +This macro is used to insert 64-bit integer literals into the source code. + + +@val: a literal integer value, e.g. 0x1d636b02300a7aa7. + + + + +This macro is used to insert 64-bit unsigned integer literals into the +source code. + + +@val: a literal integer value, e.g. 0x1d636b02300a7aa7U. +@Since: 2.10 + + + + +Corresponds to the standard C float type. +Values of this type can range from -#G_MAXFLOAT to #G_MAXFLOAT. + + + + + +Corresponds to the standard C double type. +Values of this type can range from -#G_MAXDOUBLE to #G_MAXDOUBLE. + + + + + +An unsigned integer type of the result of the sizeof operator, corresponding +to the size_t type defined in C99. This type is wide enough to hold the numeric +value of a pointer, so it is usually 32bit wide on a 32bit platform and +64bit wide on a 64bit platform. +Values of this type can range from 0 to #G_MAXSIZE. + + +To print or scan values of this type, use +%G_GSIZE_MODIFIER and/or %G_GSIZE_FORMAT. + + + + + +A signed variant of gsize, corresponding to the ssize_t defined on most platforms. +Values of this type can range from #G_MINSSIZE to #G_MAXSSIZE. + + +To print or scan values of this type, use +%G_GSIZE_MODIFIER and/or %G_GSSIZE_FORMAT. + + + + + +A signed integer type that is used for file offsets, corresponding to the +C99 type off64_t. +Values of this type can range from #G_MINOFFSET to #G_MAXOFFSET. + + +To print or scan values of this type, use +%G_GOFFSET_MODIFIER and/or %G_GOFFSET_FORMAT. + + +Since: 2.14 + + + + +This macro is used to insert #goffset 64-bit integer literals into the source code. +See also #G_GINT64_CONSTANT. + + +@val: a literal integer value, e.g. 0x1d636b02300a7aa7. +Since: 2.20 + + + + +Corresponds to the C99 type intptr_t, a signed integer type that +can hold any pointer. + + +To print or scan values of this type, use +%G_GINTPTR_MODIFIER and/or %G_GINTPTR_FORMAT. + + +Since: 2.18 + + + + +Corresponds to the C99 type uintptr_t, an unsigned integer type that +can hold any pointer. + + +To print or scan values of this type, use +%G_GINTPTR_MODIFIER and/or %G_GUINTPTR_FORMAT. + + +Since: 2.18 + + diff --git a/docs/reference/glib/tmpl/unicode.sgml b/docs/reference/glib/tmpl/unicode.sgml new file mode 100644 index 0000000..e0596c1 --- /dev/null +++ b/docs/reference/glib/tmpl/unicode.sgml @@ -0,0 +1,886 @@ + +Unicode Manipulation + + +functions operating on Unicode characters and UTF-8 strings + + + +This section describes a number of functions for dealing with +Unicode characters and strings. There are analogues of the +traditional ctype.h character classification +and case conversion functions, UTF-8 analogues of some string utility +functions, functions to perform normalization, case conversion and +collation on UTF-8 strings and finally functions to convert between +the UTF-8, UTF-16 and UCS-4 encodings of Unicode. + + + +The implementations of the Unicode functions in GLib are based +on the Unicode Character Data tables, which are available from +www.unicode.org. +GLib 2.8 supports Unicode 4.0, GLib 2.10 supports Unicode 4.1, +GLib 2.12 supports Unicode 5.0, GLib 2.16.3 supports Unicode 5.1. + + + + + + + +g_locale_to_utf8(), g_locale_from_utf8() + +Convenience functions for converting between UTF-8 and the locale encoding. + + + + + + + + + + + +A type which can hold any UTF-32 or UCS-4 character code, also known +as a Unicode code point. + + +If you want to produce the UTF-8 representation of a #gunichar, +use g_ucs4_to_utf8(). See also g_utf8_to_ucs4() for the reverse process. + + +To print/scan values of this type as integer, use +%G_GINT32_MODIFIER and/or %G_GUINT32_FORMAT. + + +The notation to express a Unicode code point in running text is as a +hexadecimal number with four to six digits and uppercase letters, prefixed +by the string "U+". Leading zeros are omitted, unless the code point would +have fewer than four hexadecimal digits. +For example, "U+0041 LATIN CAPITAL LETTER A". +To print a code point in the U+-notation, use the format string +"U+%04"G_GINT32_FORMAT"X". +To scan, use the format string "U+%06"G_GINT32_FORMAT"X". + + +gunichar c; +sscanf ("U+0041", "U+%06"G_GINT32_FORMAT"X", &c) +g_print ("Read U+%04"G_GINT32_FORMAT"X", c); + + + + + + + +A type which can hold any UTF-16 code +pointUTF-16 also has so called +surrogate pairs to encode characters beyond the +BMP as pairs of 16bit numbers. Surrogate pairs cannot be stored in a +single gunichar2 field, but all GLib functions accepting gunichar2 arrays +will correctly interpret surrogate pairs.. + + +To print/scan values of this type to/from text you need to convert +to/from UTF-8, using g_utf16_to_utf8()/g_utf8_to_utf16(). + + +To print/scan values of this type as integer, use +%G_GINT16_MODIFIER and/or %G_GUINT16_FORMAT. + + + + + + + + +@ch: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + + + + +@c: +@Returns: + + + + +These are the possible character classifications from the +Unicode specification. +See http://www.unicode.org/Public/UNIDATA/UnicodeData.html. + + +@G_UNICODE_CONTROL: General category "Other, Control" (Cc) +@G_UNICODE_FORMAT: General category "Other, Format" (Cf) +@G_UNICODE_UNASSIGNED: General category "Other, Not Assigned" (Cn) +@G_UNICODE_PRIVATE_USE: General category "Other, Private Use" (Co) +@G_UNICODE_SURROGATE: General category "Other, Surrogate" (Cs) +@G_UNICODE_LOWERCASE_LETTER: General category "Letter, Lowercase" (Ll) +@G_UNICODE_MODIFIER_LETTER: General category "Letter, Modifier" (Lm) +@G_UNICODE_OTHER_LETTER: General category "Letter, Other" (Lo) +@G_UNICODE_TITLECASE_LETTER: General category "Letter, Titlecase" (Lt) +@G_UNICODE_UPPERCASE_LETTER: General category "Letter, Uppercase" (Lu) +@G_UNICODE_COMBINING_MARK: General category "Mark, Spacing Combining" (Mc) +@G_UNICODE_ENCLOSING_MARK: General category "Mark, Enclosing" (Me) +@G_UNICODE_NON_SPACING_MARK: General category "Mark, Nonspacing" (Mn) +@G_UNICODE_DECIMAL_NUMBER: General category "Number, Decimal Digit" (Nd) +@G_UNICODE_LETTER_NUMBER: General category "Number, Letter" (Nl) +@G_UNICODE_OTHER_NUMBER: General category "Number, Other" (No) +@G_UNICODE_CONNECT_PUNCTUATION: General category "Punctuation, Connector" (Pc) +@G_UNICODE_DASH_PUNCTUATION: General category "Punctuation, Dash" (Pd) +@G_UNICODE_CLOSE_PUNCTUATION: General category "Punctuation, Close" (Pe) +@G_UNICODE_FINAL_PUNCTUATION: General category "Punctuation, Final quote" (Pf) +@G_UNICODE_INITIAL_PUNCTUATION: General category "Punctuation, Initial quote" (Pi) +@G_UNICODE_OTHER_PUNCTUATION: General category "Punctuation, Other" (Po) +@G_UNICODE_OPEN_PUNCTUATION: General category "Punctuation, Open" (Ps) +@G_UNICODE_CURRENCY_SYMBOL: General category "Symbol, Currency" (Sc) +@G_UNICODE_MODIFIER_SYMBOL: General category "Symbol, Modifier" (Sk) +@G_UNICODE_MATH_SYMBOL: General category "Symbol, Math" (Sm) +@G_UNICODE_OTHER_SYMBOL: General category "Symbol, Other" (So) +@G_UNICODE_LINE_SEPARATOR: General category "Separator, Line" (Zl) +@G_UNICODE_PARAGRAPH_SEPARATOR: General category "Separator, Paragraph" (Zp) +@G_UNICODE_SPACE_SEPARATOR: General category "Separator, Space" (Zs) + + + + + + +@c: +@Returns: + + + + +These are the possible line break classifications. +The five Hangul types were added in Unicode 4.1, so, has been +introduced in GLib 2.10. Note that new types may be added in the future. +Applications should be ready to handle unknown values. +They may be regarded as %G_UNICODE_BREAK_UNKNOWN. +See http://www.unicode.org/unicode/reports/tr14/. + + +@G_UNICODE_BREAK_MANDATORY: Mandatory Break (BK) +@G_UNICODE_BREAK_CARRIAGE_RETURN: Carriage Return (CR) +@G_UNICODE_BREAK_LINE_FEED: Line Feed (LF) +@G_UNICODE_BREAK_COMBINING_MARK: Attached Characters and Combining Marks (CM) +@G_UNICODE_BREAK_SURROGATE: Surrogates (SG) +@G_UNICODE_BREAK_ZERO_WIDTH_SPACE: Zero Width Space (ZW) +@G_UNICODE_BREAK_INSEPARABLE: Inseparable (IN) +@G_UNICODE_BREAK_NON_BREAKING_GLUE: Non-breaking ("Glue") (GL) +@G_UNICODE_BREAK_CONTINGENT: Contingent Break Opportunity (CB) +@G_UNICODE_BREAK_SPACE: Space (SP) +@G_UNICODE_BREAK_AFTER: Break Opportunity After (BA) +@G_UNICODE_BREAK_BEFORE: Break Opportunity Before (BB) +@G_UNICODE_BREAK_BEFORE_AND_AFTER: Break Opportunity Before and After (B2) +@G_UNICODE_BREAK_HYPHEN: Hyphen (HY) +@G_UNICODE_BREAK_NON_STARTER: Nonstarter (NS) +@G_UNICODE_BREAK_OPEN_PUNCTUATION: Opening Punctuation (OP) +@G_UNICODE_BREAK_CLOSE_PUNCTUATION: Closing Punctuation (CL) +@G_UNICODE_BREAK_QUOTATION: Ambiguous Quotation (QU) +@G_UNICODE_BREAK_EXCLAMATION: Exclamation/Interrogation (EX) +@G_UNICODE_BREAK_IDEOGRAPHIC: Ideographic (ID) +@G_UNICODE_BREAK_NUMERIC: Numeric (NU) +@G_UNICODE_BREAK_INFIX_SEPARATOR: Infix Separator (Numeric) (IS) +@G_UNICODE_BREAK_SYMBOL: Symbols Allowing Break After (SY) +@G_UNICODE_BREAK_ALPHABETIC: Ordinary Alphabetic and Symbol Characters (AL) +@G_UNICODE_BREAK_PREFIX: Prefix (Numeric) (PR) +@G_UNICODE_BREAK_POSTFIX: Postfix (Numeric) (PO) +@G_UNICODE_BREAK_COMPLEX_CONTEXT: Complex Content Dependent (South East Asian) (SA) +@G_UNICODE_BREAK_AMBIGUOUS: Ambiguous (Alphabetic or Ideographic) (AI) +@G_UNICODE_BREAK_UNKNOWN: Unknown (XX) +@G_UNICODE_BREAK_NEXT_LINE: Next Line (NL) +@G_UNICODE_BREAK_WORD_JOINER: Word Joiner (WJ) +@G_UNICODE_BREAK_HANGUL_L_JAMO: Hangul L Jamo (JL) +@G_UNICODE_BREAK_HANGUL_V_JAMO: Hangul V Jamo (JV) +@G_UNICODE_BREAK_HANGUL_T_JAMO: Hangul T Jamo (JT) +@G_UNICODE_BREAK_HANGUL_LV_SYLLABLE: Hangul LV Syllable (H2) +@G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE: Hangul LVT Syllable (H3) + + + + + + +@c: +@Returns: + + + + + + + +@uc: +@Returns: + + + + + + + +@string: +@len: + + + + + + + +@ch: +@result_len: +@Returns: + + + + + + + +@ch: +@mirrored_ch: +@Returns: + + + + +The #GUnicodeScript enumeration identifies different writing +systems. The values correspond to the names as defined in the +Unicode standard. The enumeration has been added in GLib 2.14, +and is interchangeable with #PangoScript. +Note that new types may be added in the future. Applications +should be ready to handle unknown values. +See Unicode Standard Annex +#24: Script names. + + +@G_UNICODE_SCRIPT_INVALID_CODE: a value never returned from g_unichar_get_script() +@G_UNICODE_SCRIPT_COMMON: a character used by multiple different scripts +@G_UNICODE_SCRIPT_INHERITED: a mark glyph that takes its script from the + base glyph to which it is attached +@G_UNICODE_SCRIPT_ARABIC: Arabic +@G_UNICODE_SCRIPT_ARMENIAN: Armenian +@G_UNICODE_SCRIPT_BENGALI: Bengali +@G_UNICODE_SCRIPT_BOPOMOFO: Bopomofo +@G_UNICODE_SCRIPT_CHEROKEE: Cherokee +@G_UNICODE_SCRIPT_COPTIC: Coptic +@G_UNICODE_SCRIPT_CYRILLIC: Cyrillic +@G_UNICODE_SCRIPT_DESERET: Deseret +@G_UNICODE_SCRIPT_DEVANAGARI: Devanagari +@G_UNICODE_SCRIPT_ETHIOPIC: Ethiopic +@G_UNICODE_SCRIPT_GEORGIAN: Georgian +@G_UNICODE_SCRIPT_GOTHIC: Gothic +@G_UNICODE_SCRIPT_GREEK: Greek +@G_UNICODE_SCRIPT_GUJARATI: Gujarati +@G_UNICODE_SCRIPT_GURMUKHI: Gurmukhi +@G_UNICODE_SCRIPT_HAN: Han +@G_UNICODE_SCRIPT_HANGUL: Hangul +@G_UNICODE_SCRIPT_HEBREW: Hebrew +@G_UNICODE_SCRIPT_HIRAGANA: Hiragana +@G_UNICODE_SCRIPT_KANNADA: Kannada +@G_UNICODE_SCRIPT_KATAKANA: Katakana +@G_UNICODE_SCRIPT_KHMER: Khmer +@G_UNICODE_SCRIPT_LAO: Lao +@G_UNICODE_SCRIPT_LATIN: Latin +@G_UNICODE_SCRIPT_MALAYALAM: Malayalam +@G_UNICODE_SCRIPT_MONGOLIAN: Mongolian +@G_UNICODE_SCRIPT_MYANMAR: Myanmar +@G_UNICODE_SCRIPT_OGHAM: Ogham +@G_UNICODE_SCRIPT_OLD_ITALIC: Old Italic +@G_UNICODE_SCRIPT_ORIYA: Oriya +@G_UNICODE_SCRIPT_RUNIC: Runic +@G_UNICODE_SCRIPT_SINHALA: Sinhala +@G_UNICODE_SCRIPT_SYRIAC: Syriac +@G_UNICODE_SCRIPT_TAMIL: Tamil +@G_UNICODE_SCRIPT_TELUGU: Telugu +@G_UNICODE_SCRIPT_THAANA: Thaana +@G_UNICODE_SCRIPT_THAI: Thai +@G_UNICODE_SCRIPT_TIBETAN: Tibetan +@G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL: + Canadian Aboriginal +@G_UNICODE_SCRIPT_YI: Yi +@G_UNICODE_SCRIPT_TAGALOG: Tagalog +@G_UNICODE_SCRIPT_HANUNOO: Hanunoo +@G_UNICODE_SCRIPT_BUHID: Buhid +@G_UNICODE_SCRIPT_TAGBANWA: Tagbanwa +@G_UNICODE_SCRIPT_BRAILLE: Braille +@G_UNICODE_SCRIPT_CYPRIOT: Cypriot +@G_UNICODE_SCRIPT_LIMBU: Limbu +@G_UNICODE_SCRIPT_OSMANYA: Osmanya +@G_UNICODE_SCRIPT_SHAVIAN: Shavian +@G_UNICODE_SCRIPT_LINEAR_B: Linear B +@G_UNICODE_SCRIPT_TAI_LE: Tai Le +@G_UNICODE_SCRIPT_UGARITIC: Ugaritic +@G_UNICODE_SCRIPT_NEW_TAI_LUE: New Tai Lue +@G_UNICODE_SCRIPT_BUGINESE: Buginese +@G_UNICODE_SCRIPT_GLAGOLITIC: Glagolitic +@G_UNICODE_SCRIPT_TIFINAGH: Tifinagh +@G_UNICODE_SCRIPT_SYLOTI_NAGRI: Syloti Nagri +@G_UNICODE_SCRIPT_OLD_PERSIAN: Old Persian +@G_UNICODE_SCRIPT_KHAROSHTHI: Kharoshthi +@G_UNICODE_SCRIPT_UNKNOWN: an unassigned code point +@G_UNICODE_SCRIPT_BALINESE: Balinese +@G_UNICODE_SCRIPT_CUNEIFORM: Cuneiform +@G_UNICODE_SCRIPT_PHOENICIAN: Phoenician +@G_UNICODE_SCRIPT_PHAGS_PA: Phags-pa +@G_UNICODE_SCRIPT_NKO: N'Ko +@G_UNICODE_SCRIPT_KAYAH_LI: Kayah Li. Since 2.16.3 +@G_UNICODE_SCRIPT_LEPCHA: Lepcha. Since 2.16.3 +@G_UNICODE_SCRIPT_REJANG: Rejang. Since 2.16.3 +@G_UNICODE_SCRIPT_SUNDANESE: Sundanese. Since 2.16.3 +@G_UNICODE_SCRIPT_SAURASHTRA: Saurashtra. Since 2.16.3 +@G_UNICODE_SCRIPT_CHAM: Cham. Since 2.16.3 +@G_UNICODE_SCRIPT_OL_CHIKI: Ol Chiki. Since 2.16.3 +@G_UNICODE_SCRIPT_VAI: Vai. Since 2.16.3 +@G_UNICODE_SCRIPT_CARIAN: Carian. Since 2.16.3 +@G_UNICODE_SCRIPT_LYCIAN: Lycian. Since 2.16.3 +@G_UNICODE_SCRIPT_LYDIAN: Lydian. Since 2.16.3 + + + + + + +@ch: +@Returns: + + + + +Skips to the next character in a UTF-8 string. The string must be +valid; this macro is as fast as possible, and has no error-checking. +You would use this macro to iterate over a string character by +character. The macro returns the start of the next UTF-8 character. +Before using this macro, use g_utf8_validate() to validate strings +that may contain invalid UTF-8. + + +@p: Pointer to the start of a valid UTF-8 character. + + + + + + + +@p: +@Returns: + + + + + + + +@p: +@max_len: +@Returns: + + + + + + + +@str: +@offset: +@Returns: + + + + + + + +@str: +@pos: +@Returns: + + + + + + + +@p: +@Returns: + + + + + + + +@p: +@end: +@Returns: + + + + + + + +@str: +@p: +@Returns: + + + + + + + +@p: +@max: +@Returns: + + + + + + + +@dest: +@src: +@n: +@Returns: + + + + + + + +@p: +@len: +@c: +@Returns: + + + + + + + +@p: +@len: +@c: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@max_len: +@end: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@len: +@mode: +@Returns: + + + + +Defines how a Unicode string is transformed in a canonical +form, standardizing such issues as whether a character with an accent is +represented as a base character and combining accent or as a single precomposed +character. Unicode strings should generally be normalized before comparing them. + + +@G_NORMALIZE_DEFAULT: standardize differences that do not affect the + text content, such as the above-mentioned accent representation. +@G_NORMALIZE_NFD: another name for %G_NORMALIZE_DEFAULT. +@G_NORMALIZE_DEFAULT_COMPOSE: like %G_NORMALIZE_DEFAULT, but with composed + forms rather than a maximally decomposed form. +@G_NORMALIZE_NFC: another name for %G_NORMALIZE_DEFAULT_COMPOSE. +@G_NORMALIZE_ALL: beyond %G_NORMALIZE_DEFAULT also standardize the + "compatibility" characters in Unicode, such as SUPERSCRIPT THREE to the + standard forms (in this case DIGIT THREE). Formatting information may be + lost but for most text operations such characters should be considered the + same. +@G_NORMALIZE_NFKD: another name for %G_NORMALIZE_ALL. +@G_NORMALIZE_ALL_COMPOSE: like %G_NORMALIZE_ALL, but with composed + forms rather than a maximally decomposed form. +@G_NORMALIZE_NFKC: another name for %G_NORMALIZE_ALL_COMPOSE. + + + + + + +@str1: +@str2: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@len: +@Returns: + + + + + + + +@str: +@len: +@items_read: +@items_written: +@error: +@Returns: + + + + + + + +@str: +@len: +@items_read: +@items_written: +@error: +@Returns: + + + + + + + +@str: +@len: +@items_written: +@Returns: + + + + + + + +@str: +@len: +@items_read: +@items_written: +@error: +@Returns: + + + + + + + +@str: +@len: +@items_read: +@items_written: +@error: +@Returns: + + + + + + + +@str: +@len: +@items_read: +@items_written: +@error: +@Returns: + + + + + + + +@str: +@len: +@items_read: +@items_written: +@error: +@Returns: + + + + + + + +@c: +@outbuf: +@Returns: + + diff --git a/docs/reference/glib/tmpl/version.sgml b/docs/reference/glib/tmpl/version.sgml new file mode 100644 index 0000000..b1cf0bb --- /dev/null +++ b/docs/reference/glib/tmpl/version.sgml @@ -0,0 +1,71 @@ + +Version Information + + +Variables and functions to check the GLib version + + + +GLib provides version information, primarily useful in configure checks +for builds that have a configure script. Applications will not +typically use the features described here. + + + + + + + + + + + + +The major version number of the GLib library. +Like #glib_major_version, but from the headers used at +application compile time, rather than from the library linked against +at application run time. + + + + + + +The minor version number of the GLib library. +Like #gtk_minor_version, but from the headers used at +application compile time, rather than from the library linked against +at application run time. + + + + + + +The micro version number of the GLib library. +Like #gtk_micro_version, but from the headers used at +application compile time, rather than from the library linked against +at application run time. + + + + + + +Checks the version of the GLib library. +Returns %TRUE if the version of the GLib header files is the same +as or newer than the passed-in version. + + +Checking the version of the GLib library + + if (!GLIB_CHECK_VERSION (1, 2, 0)) + g_error ("GLib version 1.2.0 or above is needed"); + + + + +@major: the major version number. +@minor: the minor version number. +@micro: the micro version number. + + diff --git a/docs/reference/glib/tmpl/warnings.sgml b/docs/reference/glib/tmpl/warnings.sgml new file mode 100644 index 0000000..cc46878 --- /dev/null +++ b/docs/reference/glib/tmpl/warnings.sgml @@ -0,0 +1,233 @@ + +Message Output and Debugging Functions + + +functions to output messages and help debug applications + + + +These functions provide support for outputting messages. + + +The g_return family of macros (g_return_if_fail(), +g_return_val_if_fail(), g_return_if_reached(), g_return_val_if_reached()) +should only be used for programming errors, a typical use case is +checking for invalid parameters at the beginning of a public function. +They should not be used if you just mean "if (error) return", they +should only be used if you mean "if (bug in program) return". +The program behavior is generally considered undefined after one of these +checks fails. They are not intended for normal control flow, only to +give a perhaps-helpful warning before giving up. + + + + + + + + + + + + +Outputs a formatted message via the print handler. +The default print handler simply outputs the message to stdout. + + +g_print() should not be used from within libraries for debugging messages, +since it may be redirected by applications to special purpose message +windows or even files. +Instead, libraries should use g_log(), or the convenience functions +g_message(), g_warning() and g_error(). + + +@format: the message format. See the printf() documentation. +@Varargs: the parameters to insert into the format string. + + + + +Sets the print handler. +Any messages passed to g_print() will be output via the new handler. +The default handler simply outputs the message to stdout. +By providing your own handler you can redirect the output, to a GTK+ +widget or a log file for example. + + +@func: the new print handler. +@Returns: the old print handler. + + + + +Specifies the type of the print handler functions. +These are called with the complete formatted string to output. + + +@string: the message to be output. + + + + +Outputs a formatted message via the error message handler. +The default handler simply outputs the message to stderr. + + +g_printerr() should not be used from within libraries. Instead g_log() should +be used, or the convenience functions g_message(), g_warning() and g_error(). + + +@format: the message format. See the printf() documentation. +@Varargs: the parameters to insert into the format string. + + + + +Sets the handler for printing error messages. +Any messages passed to g_printerr() will be output via the new handler. +The default handler simply outputs the message to stderr. +By providing your own handler you can redirect the output, to a GTK+ +widget or a log file for example. + + +@func: the new error message handler. +@Returns: the old error message handler. + + + + +Returns from the current function if the expression is not true. +If the expression evaluates to %FALSE, a critical message is logged and +the function returns. This can only be used in functions which do not return +a value. + + +@expr: the expression to check. + + + + +Returns from the current function, returning the value @val, if the expression +is not true. +If the expression evaluates to %FALSE, a critical message is logged and +@val is returned. + + +@expr: the expression to check. +@val: the value to return from the current function if the expression is not +true. + + + + +Logs a critical message and returns from the current function. +This can only be used in functions which do not return a value. + + + + + + +Logs a critical message and returns @val. + + +@val: the value to return from the current function. + + + + +Logs a warning if the expression is not true. + + +@expr: the expression to check +@Since: 2.16 + + + + +Logs a critical warning. + + +@Since: 2.16 + + + + +Prompts the user with [E]xit, [H]alt, show [S]tack trace or [P]roceed. +This function is intended to be used for debugging use only. The following +example shows how it can be used together with the g_log() functions. + + +#include <glib.h> + +static void +log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + g_log_default_handler (log_domain, log_level, message, user_data); + + g_on_error_query (MY_PROGRAM_NAME); +} + +int main (int argc, char *argv[]) +{ + g_log_set_handler (MY_LOG_DOMAIN, + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_ERROR | + G_LOG_LEVEL_CRITICAL, + log_handler, + NULL); + + /* ... */ + + +If [E]xit is selected, the application terminates with a call to +_exit(0). + + +If [H]alt is selected, the application enters an infinite loop. +The infinite loop can only be stopped by killing the application, +or by setting #glib_on_error_halt to %FALSE (possibly via a debugger). + + +If [S]tack trace is selected, g_on_error_stack_trace() is called. This +invokes gdb, which attaches to the current process and shows a stack trace. +The prompt is then shown again. + + +If [P]roceed is selected, the function returns. + + +This function may cause different actions on non-UNIX platforms. + + +@prg_name: the program name, needed by gdb for the [S]tack trace option. +If @prg_name is %NULL, g_get_prgname() is called to get the program name +(which will work correctly if gdk_init() or gtk_init() has been called). + + + + +Invokes gdb, which attaches to the current process and shows a stack trace. +Called by g_on_error_query() when the [S]tack trace option is selected. + + +This function may cause different actions on non-UNIX platforms. + + +@prg_name: the program name, needed by gdb for the [S]tack trace option. +If @prg_name is %NULL, g_get_prgname() is called to get the program name +(which will work correctly if gdk_init() or gtk_init() has been called). + + + + +Inserts a breakpoint instruction into the code. On x86 and alpha systems +this is implemented as a soft interrupt and on other architectures it raises +a %SIGTRAP signal. + + + + diff --git a/docs/reference/glib/tmpl/windows.sgml b/docs/reference/glib/tmpl/windows.sgml new file mode 100644 index 0000000..2a5a961 --- /dev/null +++ b/docs/reference/glib/tmpl/windows.sgml @@ -0,0 +1,137 @@ + +Windows Compatibility Functions + + +UNIX emulation on Windows + + + +These functions provide some level of UNIX emulation on the Windows platform. +If your application really needs the POSIX APIs, we suggest you try the Cygwin +project. + + + + + + + + + + + + +Provided for UNIX emulation on Windows; equivalent to UNIX +macro %MAXPATHLEN, which is the maximum length of a filename +(including full path). + + + + + + + + + +@error: +@Returns: + + + + + + + +@Returns: + + + + + + + +@package: +@dll_name: +@Returns: + + + + + + + +@hmodule: +@Returns: + + + + + + + +@package: +@dll_name: +@subdir: +@Returns: + + + + + + + +@Returns: + + + + + + + +@utf8filename: +@Returns: + + + + +On Windows, this macro defines a DllMain() function that stores the actual +DLL name that the code being compiled will be included in. + + +On non-Windows platforms, expands to nothing. + + +@static: empty or "static". +@dll_name: the name of the (pointer to the) char array where the DLL name + will be stored. If this is used, you must also include + windows.h. If you need a more complex DLL entry + point function, you cannot use this. + + + + +On Windows, this macro defines an expression which evaluates to %TRUE +if the code is running on a version of Windows where the wide +character versions of the Win32 API functions, and the wide chaacter +versions of the C library functions work. (They are always present in +the DLLs, but don't work on Windows 9x and Me.) + + +On non-Windows platforms, it is not defined. + + +@Since: 2.6 + + + + +On Windows, this macro defines an expression which evaluates to %TRUE +if the code is running on an NT-based Windows operating system. + + +On non-Windows platforms, it is not defined. + + +@Since: 2.6 + + diff --git a/docs/reference/glib/version.xml.in b/docs/reference/glib/version.xml.in new file mode 100644 index 0000000..af9b9c4 --- /dev/null +++ b/docs/reference/glib/version.xml.in @@ -0,0 +1 @@ +@GLIB_VERSION@ diff --git a/docs/reference/gobject/Makefile.am b/docs/reference/gobject/Makefile.am new file mode 100644 index 0000000..0c88234 --- /dev/null +++ b/docs/reference/gobject/Makefile.am @@ -0,0 +1,85 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module. +DOC_MODULE=gobject + +# The top-level SGML file. +DOC_MAIN_SGML_FILE=gobject-docs.sgml + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR=../../../gobject + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED" \ + --ignore-decorators=G_GNUC_INTERNAL + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS=--sgml-mode --output-format=xml --name-space=g + +# Used for dependencies +HFILE_GLOB=$(top_srcdir)/gobject/*.h +CFILE_GLOB=$(top_srcdir)/gobject/*.c + +# Headers to ignore +IGNORE_HFILES=gobjectalias.h + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +INCLUDES = \ + -I$(srcdir) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_builddir) \ + -I$(top_builddir)/glib \ + $(GLIB_DEBUG_FLAGS) +GTKDOC_LIBS = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la + +# Images to copy into HTML directory +HTML_IMAGES = \ + $(srcdir)/images/glue.png + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = version.xml \ + glib-mkenums.xml \ + glib-genmarshal.xml \ + gobject-query.xml \ + tut_gobject.xml \ + tut_gsignal.xml \ + tut_gtype.xml \ + tut_howto.xml \ + tut_intro.xml \ + tut_tools.xml + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS=--extra-dir=$(srcdir)/../glib/html + +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +EXTRA_DIST += \ + gobject.cI \ + version.xml.in + +######################################################################## + +man_MANS = glib-mkenums.1 glib-genmarshal.1 gobject-query.1 + +if ENABLE_MAN + +%.1 : %.xml + @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +endif + +BUILT_EXTRA_DIST = $(man_MANS) + +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/gobject/Makefile.in b/docs/reference/gobject/Makefile.in new file mode 100644 index 0000000..c190cd9 --- /dev/null +++ b/docs/reference/gobject/Makefile.in @@ -0,0 +1,888 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +# -*- 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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/version.xml.in $(top_srcdir)/Makefile.decl \ + $(top_srcdir)/gtk-doc.make +subdir = docs/reference/gobject +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = version.xml +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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' +man1dir = $(mandir)/man1 +am__installdirs = "$(DESTDIR)$(man1dir)" +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# Other files to distribute +EXTRA_DIST = $(content_files) $(HTML_IMAGES) $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt \ + gobject.cI version.xml.in +TEST_PROGS = +AUTOMAKE_OPTIONS = 1.6 + +# The name of the module. +DOC_MODULE = gobject + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = gobject-docs.sgml + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR = ../../../gobject + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="G_DISABLE_DEPRECATED" \ + --ignore-decorators=G_GNUC_INTERNAL + + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --sgml-mode --output-format=xml --name-space=g + +# Used for dependencies +HFILE_GLOB = $(top_srcdir)/gobject/*.h +CFILE_GLOB = $(top_srcdir)/gobject/*.c + +# Headers to ignore +IGNORE_HFILES = gobjectalias.h + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +INCLUDES = \ + -I$(srcdir) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_builddir) \ + -I$(top_builddir)/glib \ + $(GLIB_DEBUG_FLAGS) + +GTKDOC_LIBS = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la + + +# Images to copy into HTML directory +HTML_IMAGES = \ + $(srcdir)/images/glue.png + + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = version.xml \ + glib-mkenums.xml \ + glib-genmarshal.xml \ + gobject-query.xml \ + tut_gobject.xml \ + tut_gsignal.xml \ + tut_gtype.xml \ + tut_howto.xml \ + tut_intro.xml \ + tut_tools.xml + + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS = --extra-dir=$(srcdir)/../glib/html +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(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) +DOC_STAMPS = scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + pdf-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \ + $(srcdir)/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 + +######################################################################## +man_MANS = glib-mkenums.1 glib-genmarshal.1 gobject-query.1 +BUILT_EXTRA_DIST = $(man_MANS) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu docs/reference/gobject/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu docs/reference/gobject/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): +version.xml: $(top_builddir)/config.status $(srcdir)/version.xml.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list=''; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(MANS) all-local +installdirs: + for dir in "$(DESTDIR)$(man1dir)"; 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-man + +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-man1 + +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 uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am all-local check check-am check-local 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-man1 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 uninstall-man uninstall-man1 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +@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 + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + 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: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + @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 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(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 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/html + @mkdir $(srcdir)/html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options=--path="$(srcdir)"; \ + fi; \ + cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + @cd $(srcdir) && 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 'gtk-doc: Building PDF' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/$(DOC_MODULE).pdf + @mkpdf_imgdirs=""; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +distclean-local: + cd $(srcdir) && \ + rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html + +install-data-local: + @installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- 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 '-- Installing '$$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; \ + mv -f $${installdir}/$(DOC_MODULE).devhelp \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \ + 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 $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + cp $(srcdir)/html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/ + cd $(distdir) && rm -f $(DISTCLEANFILES) + $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +@ENABLE_MAN_TRUE@%.1 : %.xml +@ENABLE_MAN_TRUE@ @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +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/gobject/glib-genmarshal.1 b/docs/reference/gobject/glib-genmarshal.1 new file mode 100644 index 0000000..cef295d --- /dev/null +++ b/docs/reference/gobject/glib-genmarshal.1 @@ -0,0 +1,307 @@ +'\" t +.\" Title: glib-genmarshal +.\" Author: [see the "Author" section] +.\" Generator: DocBook XSL Stylesheets v1.74.2 +.\" Date: 03/13/2009 +.\" Manual: [FIXME: manual] +.\" Source: [FIXME: source] +.\" Language: English +.\" +.TH "GLIB\-GENMARSHAL" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +glib-genmarshal \- C code marshaller generation utility for GLib closures +.SH "SYNOPSIS" +.HP \w'\fBglib\-genmarshal\fR\ 'u +\fBglib\-genmarshal\fR [options...] [files...] +.SH "DESCRIPTION" +.PP +\fBglib\-genmarshal\fR +is a small utility that generates C code marshallers for callback functions of the GClosure mechanism in the GObject sublibrary of GLib\&. The marshaller functions have a standard signature, they get passed in the invoking closure, an array of value structures holding the callback function parameters and a value structure for the return value of the callback\&. The marshaller is then responsible to call the respective C code function of the closure with all the parameters on the stack and to collect its return value\&. +.SH "INVOCATION" +.PP +\fBglib\-genmarshal\fR +takes a list of marshallers to generate as input\&. The marshaller list is either read from standard input or from files passed as additional arguments on the command line\&. +.SS "Options" +.PP +\fB\-\-header\fR +.RS 4 +Generate header file contents of the marshallers\&. +.RE +.PP +\fB\-\-body\fR +.RS 4 +Generate C code file contents of the marshallers\&. +.RE +.PP +\fB\-\-prefix=string\fR, \fB\-\-prefix string\fR +.RS 4 +Specify marshaller prefix\&. The default prefix is +`g_cclosure_marshal\'\&. +.RE +.PP +\fB\-\-skip\-source\fR +.RS 4 +Skip source location remarks in generated comments\&. +.RE +.PP +\fB\-\-nostdinc\fR +.RS 4 +Do not use the standard marshallers of the GObject library, and skip +gmarshal\&.h +include directive in generated header files\&. +.RE +.PP +\fB\-\-g\-fatal\-warnings\fR +.RS 4 +Make warnings fatal, that is, exit immediately once a warning occurs\&. +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print brief help and exit\&. +.RE +.PP +\fB\-v\fR, \fB\-\-version\fR +.RS 4 +Print version and exit\&. +.RE +.SS "Marshaller list format" +.PP +The marshaller lists are processed line by line, a line can contain a comment in the form of +.sp +.if n \{\ +.RS 4 +.\} +.nf +# this is a comment +.fi +.if n \{\ +.RE +.\} +.sp +or a marshaller specification of the form +.sp +.if n \{\ +.RS 4 +.\} +.nf +\fIRTYPE\fR:\fIPTYPE\fR +\fIRTYPE\fR:\fIPTYPE\fR,\fIPTYPE\fR +\fIRTYPE\fR:\fIPTYPE\fR,\fIPTYPE\fR,\fIPTYPE\fR +.fi +.if n \{\ +.RE +.\} +.sp +(up to 16 +\fIPTYPE\fRs may be present)\&. +.PP +The +\fIRTYPE\fR +part specifies the callback\'s return type and the +\fIPTYPE\fRs right to the colon specify the callback\'s parameter list, except for the first and the last arguments which are always pointers\&. +.SS "Parameter types" +.PP +Currently, the following types are supported: +.PP +\fIVOID\fR +.RS 4 +indicates no return type, or no extra parameters\&. If +\fIVOID\fR +is used as the parameter list, no additional parameters may be present\&. +.RE +.PP +\fIBOOLEAN\fR +.RS 4 +for boolean types (gboolean) +.RE +.PP +\fICHAR\fR +.RS 4 +for signed char types (gchar) +.RE +.PP +\fIUCHAR\fR +.RS 4 +for unsigned char types (guchar) +.RE +.PP +\fIINT\fR +.RS 4 +for signed integer types (gint) +.RE +.PP +\fIUINT\fR +.RS 4 +for unsigned integer types (guint) +.RE +.PP +\fILONG\fR +.RS 4 +for signed long integer types (glong) +.RE +.PP +\fIULONG\fR +.RS 4 +for unsigned long integer types (gulong) +.RE +.PP +\fIINT64\fR +.RS 4 +for signed 64bit integer types (gint64) +.RE +.PP +\fIUINT64\fR +.RS 4 +for unsigned 64bit integer types (guint64) +.RE +.PP +\fIENUM\fR +.RS 4 +for enumeration types (gint) +.RE +.PP +\fIFLAGS\fR +.RS 4 +for flag enumeration types (guint) +.RE +.PP +\fIFLOAT\fR +.RS 4 +for single\-precision float types (gfloat) +.RE +.PP +\fIDOUBLE\fR +.RS 4 +for double\-precision float types (gdouble) +.RE +.PP +\fISTRING\fR +.RS 4 +for string types (gchar*) +.RE +.PP +\fIBOXED\fR +.RS 4 +for boxed (anonymous but reference counted) types (GBoxed*) +.RE +.PP +\fIPARAM\fR +.RS 4 +for GParamSpec or derived types (GParamSpec*) +.RE +.PP +\fIPOINTER\fR +.RS 4 +for anonymous pointer types (gpointer) +.RE +.PP +\fIOBJECT\fR +.RS 4 +for GObject or derived types (GObject*) +.RE +.PP +\fINONE\fR +.RS 4 +deprecated alias for +\fIVOID\fR +.RE +.PP +\fIBOOL\fR +.RS 4 +deprecated alias for +\fIBOOLEAN\fR +.RE +.SH "EXAMPLE" +.PP +To generate marshallers for the following callback functions: +.sp +.if n \{\ +.RS 4 +.\} +.nf +void foo (gpointer data1, + gpointer data2); +void bar (gpointer data1, + gint param1, + gpointer data2); +gfloat baz (gpointer data1, + gboolean param1, + guchar param2, + gpointer data2); +.fi +.if n \{\ +.RE +.\} +.PP +The marshaller list has to look like this: +.sp +.if n \{\ +.RS 4 +.\} +.nf +VOID:VOID +VOID:INT +FLOAT:BOOLEAN,UCHAR +.fi +.if n \{\ +.RE +.\} +.PP +The generated marshallers have the arguments encoded in their function name\&. For this particular list, they are +.sp +.if n \{\ +.RS 4 +.\} +.nf +g_cclosure_marshal_VOID__VOID(), +g_cclosure_marshal_VOID__INT(), +g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR()\&. +.fi +.if n \{\ +.RE +.\} +.PP +They can be used directly for GClosures or be passed in as the GSignalCMarshaller c_marshaller; argument upon creation of signals: +.sp +.if n \{\ +.RS 4 +.\} +.nf +GClosure *cc_foo, *cc_bar, *cc_baz; + +cc_foo = g_cclosure_new (NULL, foo, NULL); +g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID); +cc_bar = g_cclosure_new (NULL, bar, NULL); +g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT); +cc_baz = g_cclosure_new (NULL, baz, NULL); +g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR); +.fi +.if n \{\ +.RE +.\} +.SH "SEE ALSO" +.PP + +\fBglib\-mkenums\fR(1) +.SH "BUGS" +.PP +None known yet\&. +.SH "AUTHOR" +.PP +\fBglib\-genmarshal\fR +has been written by Tim Janik +timj@gtk\&.org\&. +.PP +This manual page was provided by Tim Janik +timj@gtk\&.org\&. diff --git a/docs/reference/gobject/glib-genmarshal.xml b/docs/reference/gobject/glib-genmarshal.xml new file mode 100644 index 0000000..3bce42b --- /dev/null +++ b/docs/reference/gobject/glib-genmarshal.xml @@ -0,0 +1,347 @@ + + + +glib-genmarshal +1 + + + +glib-genmarshal +C code marshaller generation utility for GLib closures + + + + +glib-genmarshal +options +files + + + +Description +glib-genmarshal is a small utility that generates C code +marshallers for callback functions of the GClosure mechanism in the GObject +sublibrary of GLib. The marshaller functions have a standard signature, +they get passed in the invoking closure, an array of value structures holding +the callback function parameters and a value structure for the return value +of the callback. The marshaller is then responsible to call the respective C +code function of the closure with all the parameters on the stack and to +collect its return value. + + + +Invocation +glib-genmarshal takes a list of marshallers to generate as +input. The marshaller list is either read from standard input or from files +passed as additional arguments on the command line. + + +Options + + + + + +Generate header file contents of the marshallers. + + + + + + +Generate C code file contents of the marshallers. + + + + +, + +Specify marshaller prefix. The default prefix is `g_cclosure_marshal'. + + + + + + +Skip source location remarks in generated comments. + + + + + + +Do not use the standard marshallers of the GObject library, and skip +gmarshal.h include directive in generated header files. + + + + + + +Make warnings fatal, that is, exit immediately once a warning occurs. + + + + +, + +Print brief help and exit. + + + + +, + +Print version and exit. + + + + + + +Marshaller list format + +The marshaller lists are processed line by line, a line can contain a +comment in the form of + +# this is a comment + +or a marshaller specification of the form + +RTYPE:PTYPE +RTYPE:PTYPE,PTYPE +RTYPE:PTYPE,PTYPE,PTYPE + +(up to 16 PTYPEs may be present). + + +The RTYPE part specifies the callback's return +type and the PTYPEs right to the colon specify +the callback's parameter list, except for the first and the last arguments +which are always pointers. + + +Parameter types + +Currently, the following types are supported: + + +VOID + +indicates no return type, or no extra parameters. +If VOID is used as the parameter list, no +additional parameters may be present. + + + + +BOOLEAN + +for boolean types (gboolean) + + + + +CHAR + +for signed char types (gchar) + + + + +UCHAR + +for unsigned char types (guchar) + + + + +INT + +for signed integer types (gint) + + + + +UINT + +for unsigned integer types (guint) + + + + +LONG + +for signed long integer types (glong) + + + + +ULONG + +for unsigned long integer types (gulong) + + + + +INT64 + +for signed 64bit integer types (gint64) + + + + +UINT64 + +for unsigned 64bit integer types (guint64) + + + + +ENUM + +for enumeration types (gint) + + + + +FLAGS + +for flag enumeration types (guint) + + + + +FLOAT + +for single-precision float types (gfloat) + + + + +DOUBLE + +for double-precision float types (gdouble) + + + + +STRING + +for string types (gchar*) + + + + +BOXED + +for boxed (anonymous but reference counted) types (GBoxed*) + + + + +PARAM + +for GParamSpec or derived types (GParamSpec*) + + + + +POINTER + +for anonymous pointer types (gpointer) + + + + +OBJECT + +for GObject or derived types (GObject*) + + + + +NONE + +deprecated alias for VOID + + + + +BOOL + +deprecated alias for BOOLEAN + + + + + + +Example + +To generate marshallers for the following callback functions: + + +void foo (gpointer data1, + gpointer data2); +void bar (gpointer data1, + gint param1, + gpointer data2); +gfloat baz (gpointer data1, + gboolean param1, + guchar param2, + gpointer data2); + + +The marshaller list has to look like this: + + +VOID:VOID +VOID:INT +FLOAT:BOOLEAN,UCHAR + + +The generated marshallers have the arguments encoded in their function name. +For this particular list, they are + + +g_cclosure_marshal_VOID__VOID(), +g_cclosure_marshal_VOID__INT(), +g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR(). + + +They can be used directly for GClosures or be passed in as the +GSignalCMarshaller c_marshaller; argument upon creation of signals: + + +GClosure *cc_foo, *cc_bar, *cc_baz; + +cc_foo = g_cclosure_new (NULL, foo, NULL); +g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID); +cc_bar = g_cclosure_new (NULL, bar, NULL); +g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT); +cc_baz = g_cclosure_new (NULL, baz, NULL); +g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR); + + +See also + +glib-mkenums(1) + + +Bugs + +None known yet. + + +Author +glib-genmarshal has been written by Tim Janik +timj@gtk.org. + + +This manual page was provided by Tim Janik timj@gtk.org. + + + + + diff --git a/docs/reference/gobject/glib-mkenums.1 b/docs/reference/gobject/glib-mkenums.1 new file mode 100644 index 0000000..5b961f3 --- /dev/null +++ b/docs/reference/gobject/glib-mkenums.1 @@ -0,0 +1,234 @@ +'\" t +.\" Title: glib-mkenums +.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] +.\" Generator: DocBook XSL Stylesheets v1.75.1 +.\" Date: 07/05/2009 +.\" Manual: [FIXME: manual] +.\" Source: [FIXME: source] +.\" Language: English +.\" +.TH "GLIB\-MKENUMS" "1" "07/05/2009" "[FIXME: source]" "[FIXME: manual]" +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +glib-mkenums \- C language enum description generation utility +.SH "SYNOPSIS" +.HP \w'\fBglib\-mkenums\fR\ 'u +\fBglib\-mkenums\fR [options...] [files...] +.SH "DESCRIPTION" +.PP +\fBglib\-mkenums\fR +is a small perl\-script utility that parses C code to extract enum definitions and produces enum descriptions based on text templates specified by the user\&. Most frequently this script is used to produce C code that contains enum values as strings so programs can provide value name strings for introspection\&. +.SH "INVOCATION" +.PP +\fBglib\-mkenums\fR +takes a list of valid C code files as input\&. The options specified control the text that is output, certain substitutions are performed on the text templates for keywords enclosed in @ characters\&. +.SS "Options" +.PP +\fB\-\-fhead\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +prior to processing input files\&. +.RE +.PP +\fB\-\-fprod\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +everytime a new input file is being processed\&. +.RE +.PP +\fB\-\-ftail\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +after all input files have been processed\&. +.RE +.PP +\fB\-\-eprod\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +everytime an enum is encountered in the input files\&. +.RE +.PP +\fB\-\-vhead\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +before iterating over the set of values of an enum\&. +.RE +.PP +\fB\-\-vprod\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +for every value of an enum\&. +.RE +.PP +\fB\-\-vtail\fR \fItext\fR +.RS 4 +Put out +\fItext\fR +after iterating over all values of an enum\&. +.RE +.PP +\fB\-\-comments\fR \fItext\fR +.RS 4 +Template for auto\-generated comments, the default (for C code generations) is +"/* @comment@ */"\&. +.RE +.PP +\fB\-\-template\fR \fIfile\fR +.RS 4 +Read templates from the given file\&. The templates are enclosed in specially\-formatted C comments +.sp +.if n \{\ +.RS 4 +.\} +.nf +/*** BEGIN section ***/ +/*** END section ***/ +.fi +.if n \{\ +.RE +.\} +.sp +where section may be +file\-header, +file\-production, +file\-tail, +enumeration\-production, +value\-header, +value\-production, +value\-tail +or +comment\&. +.RE +.PP +\fB\-\-help\fR +.RS 4 +Print brief help and exit\&. +.RE +.PP +\fB\-\-version\fR +.RS 4 +Print version and exit\&. +.RE +.SS "Production text substitutions" +.PP +Certain keywords enclosed in @ characters will be substituted in the emitted text\&. For the substitution examples of the keywords below, the following example enum definition is assumed: +.sp +.if n \{\ +.RS 4 +.\} +.nf +typedef enum +{ + PREFIX_THE_XVALUE = 1 << 3, + PREFIX_ANOTHER_VALUE = 1 << 4 +} PrefixTheXEnum; +.fi +.if n \{\ +.RE +.\} +.PP +@EnumName@ +.RS 4 +The name of the enum currently being processed, enum names are assumed to be properly namespaced and to use mixed capitalization to separate words (e\&.g\&. PrefixTheXEnum)\&. +.RE +.PP +@enum_name@ +.RS 4 +The enum name with words lowercase and word\-separated by underscores (e\&.g\&. prefix_the_xenum)\&. +.RE +.PP +@ENUMNAME@ +.RS 4 +The enum name with words uppercase and word\-separated by underscores (e\&.g\&. PREFIX_THE_XENUM)\&. +.RE +.PP +@ENUMSHORT@ +.RS 4 +The enum name with words uppercase and word\-separated by underscores, prefix stripped (e\&.g\&. THE_XENUM)\&. +.RE +.PP +@VALUENAME@ +.RS 4 +The enum value name currently being processed with words uppercase and word\-separated by underscores, this is the assumed literal notation of enum values in the C sources (e\&.g\&. PREFIX_THE_XVALUE)\&. +.RE +.PP +@valuenick@ +.RS 4 +A nick name for the enum value currently being processed, this is usually generated by stripping common prefix words of all the enum values of the current enum, the words are lowercase and underscores are substituted by a minus (e\&.g\&. the\-xvalue)\&. +.RE +.PP +@type@ +.RS 4 +This is substituted either by "enum" or "flags", depending on whether the enum value definitions contained bit\-shift operators or not (e\&.g\&. flags)\&. +.RE +.PP +@Type@ +.RS 4 +The same as +@type@ +with the first letter capitalized (e\&.g\&. Flags)\&. +.RE +.PP +@TYPE@ +.RS 4 +The same as +@type@ +with all letters uppercased (e\&.g\&. FLAGS)\&. +.RE +.PP +@filename@ +.RS 4 +The name of the input file currently being processed (e\&.g\&. foo\&.h)\&. +.RE +.PP +@basename@ +.RS 4 +The base name of the input file currently being processed (e\&.g\&. foo\&.h)\&. (Since: 2\&.22) +.RE +.SS "Trigraph extensions" +.PP +Some C comments are treated specially in the parsed enum definitions, such comments start out with the trigraph sequence +/*< +and end with the trigraph sequence +>*/\&. Per enum definition, the options "skip" and "flags" can be specified, to indicate this enum definition to be skipped, or for it to be treated as a flags definition, or to specify the common prefix to be stripped from all values to generate value nicknames, respectively\&. The "lowercase_name" option can be used to specify the word separation used in the *_get_type() function\&. For instance, /*< lowercase_name=gnome_vfs_uri_hide_options >*/\&. +.PP +Per value definition, the options "skip" and "nick" are supported\&. The former causes the value to be skipped, and the latter can be used to specify the otherwise auto\-generated nickname\&. Examples: +.sp +.if n \{\ +.RS 4 +.\} +.nf +typedef enum /*< skip >*/ +{ + PREFIX_FOO +} PrefixThisEnumWillBeSkipped; +typedef enum /*< flags,prefix=PREFIX >*/ +{ + PREFIX_THE_ZEROTH_VALUE, /*< skip >*/ + PREFIX_THE_FIRST_VALUE, + PREFIX_THE_SECOND_VALUE, + PREFIX_THE_THIRD_VALUE, /*< nick=the\-last\-value >*/ +} PrefixTheFlagsEnum; +.fi +.if n \{\ +.RE +.\} +.sp +.SH "SEE ALSO" +.PP +\fBglib\-genmarshal\fR(1) diff --git a/docs/reference/gobject/glib-mkenums.xml b/docs/reference/gobject/glib-mkenums.xml new file mode 100644 index 0000000..1eeac9e --- /dev/null +++ b/docs/reference/gobject/glib-mkenums.xml @@ -0,0 +1,279 @@ + + + +glib-mkenums +1 + + + +glib-mkenums +C language enum description generation utility + + + + +glib-mkenums +options +files + + + +Description +glib-mkenums is a small perl-script utility that parses C +code to extract enum definitions and produces enum descriptions based on text +templates specified by the user. Most frequently this script is used to +produce C code that contains enum values as strings so programs can provide +value name strings for introspection. + + + +Invocation +glib-mkenums takes a list of valid C code files as +input. The options specified control the text that is output, certain +substitutions are performed on the text templates for keywords enclosed +in @ characters. + + +Options + + + + text + +Put out text prior to processing input files. + + + + + text + +Put out text everytime a new input file +is being processed. + + + + + text + +Put out text after all input files have been +processed. + + + + + text + +Put out text everytime an enum is encountered +in the input files. + + + + + text + +Put out text before iterating over the set of +values of an enum. + + + + + text + +Put out text for every value of an enum. + + + + + text + +Put out text after iterating over all values +of an enum. + + + + + text + +Template for auto-generated comments, the default (for C code generations) is +"/* @comment@ */". + + + + + file + +Read templates from the given file. The templates are enclosed in +specially-formatted C comments + +/*** BEGIN section ***/ +/*** END section ***/ + +where section may be file-header, +file-production, file-tail, +enumeration-production, value-header, +value-production, value-tail or +comment. + + + + + + +Print brief help and exit. + + + + + + +Print version and exit. + + + + + + +Production text substitutions + +Certain keywords enclosed in @ characters will be substituted in the +emitted text. For the substitution examples of the keywords below, +the following example enum definition is assumed: + +typedef enum +{ + PREFIX_THE_XVALUE = 1 << 3, + PREFIX_ANOTHER_VALUE = 1 << 4 +} PrefixTheXEnum; + + + +@EnumName@ + +The name of the enum currently being processed, enum names are assumed to be +properly namespaced and to use mixed capitalization to separate +words (e.g. PrefixTheXEnum). + + + + +@enum_name@ + +The enum name with words lowercase and word-separated by underscores +(e.g. prefix_the_xenum). + + + + +@ENUMNAME@ + +The enum name with words uppercase and word-separated by underscores +(e.g. PREFIX_THE_XENUM). + + + + +@ENUMSHORT@ + +The enum name with words uppercase and word-separated by underscores, +prefix stripped (e.g. THE_XENUM). + + + + +@VALUENAME@ + +The enum value name currently being processed with words uppercase and +word-separated by underscores, +this is the assumed literal notation of enum values in the C sources +(e.g. PREFIX_THE_XVALUE). + + + + +@valuenick@ + +A nick name for the enum value currently being processed, this is usually +generated by stripping common prefix words of all the enum values of the +current enum, the words are lowercase and underscores are substituted by a +minus (e.g. the-xvalue). + + + + +@type@ + +This is substituted either by "enum" or "flags", depending on whether the +enum value definitions contained bit-shift operators or not (e.g. flags). + + + + +@Type@ + +The same as @type@ with the first letter capitalized (e.g. Flags). + + + + +@TYPE@ + +The same as @type@ with all letters uppercased (e.g. FLAGS). + + + + +@filename@ + +The name of the input file currently being processed (e.g. foo.h). + + + + +@basename@ + +The base name of the input file currently being processed (e.g. foo.h). (Since: 2.22) + + + + + +Trigraph extensions + +Some C comments are treated specially in the parsed enum definitions, +such comments start out with the trigraph sequence /*< +and end with the trigraph sequence >*/. +Per enum definition, the options "skip" and "flags" can be specified, to +indicate this enum definition to be skipped, or for it to be treated as +a flags definition, or to specify the common prefix to be stripped from +all values to generate value nicknames, respectively. The "lowercase_name" +option can be used to specify the word separation used in the *_get_type() +function. For instance, /*< lowercase_name=gnome_vfs_uri_hide_options >*/. + + +Per value definition, the options "skip" and "nick" are supported. +The former causes the value to be skipped, and the latter can be used to +specify the otherwise auto-generated nickname. +Examples: + +typedef enum /*< skip >*/ +{ + PREFIX_FOO +} PrefixThisEnumWillBeSkipped; +typedef enum /*< flags,prefix=PREFIX >*/ +{ + PREFIX_THE_ZEROTH_VALUE, /*< skip >*/ + PREFIX_THE_FIRST_VALUE, + PREFIX_THE_SECOND_VALUE, + PREFIX_THE_THIRD_VALUE, /*< nick=the-last-value >*/ +} PrefixTheFlagsEnum; + + + + +See also +glib-genmarshal(1) + + + + + diff --git a/docs/reference/gobject/gobject-docs.sgml b/docs/reference/gobject/gobject-docs.sgml new file mode 100644 index 0000000..61704ea --- /dev/null +++ b/docs/reference/gobject/gobject-docs.sgml @@ -0,0 +1,147 @@ + + + +]> + + + GObject Reference Manual + + for GObject &version; + The latest version of this documentation can be found on-line at + http://library.gnome.org/devel/gobject/unstable/. + + + + + Introduction + + Most modern programming languages come with their own native object + systems and additional fundamental algorithmic language constructs. + Just as GLib serves as an implementation of such fundamental + types and algorithms (linked lists, hash tables and so forth), the + GLib Object System provides the required implementations of a + flexible extensible and intentionally easy to map (into other + languages) object-oriented framework for C. + The substantial elements that are provided can be summarized as: + + + A generic type system to register arbitrary single-inherited + flat and deep derived types as well as interfaces for + structured types. + It takes care of creation, initialization and memory management + of the assorted object and class structures, maintains + parent/child relationships and deals with dynamic implementations + of such types. That is, their type specific implementations are + relocatable/unloadable during runtime. + + + A collection of fundamental type implementations, such as integers, + doubles, enums and structured types, to name a few. + + + A sample fundamental type implementation to base object hierarchies + upon - the GObject fundamental type. + + + A signal system that allows very flexible user customization of + virtual/overridable object methods and can serve as a powerful + notification mechanism. + + + An extensible parameter/value system, supporting all the provided + fundamental types that can be used to generically handle object + properties or otherwise parameterized types. + + + + + + + Concepts + + + + + + + + API Reference + + + + + + + + + + + + + + + + + Tools Reference + + + + + + + + + + + Index + + + + Index of deprecated symbols + + + + Index of new symbols in 2.2 + + + + Index of new symbols in 2.4 + + + + Index of new symbols in 2.6 + + + + Index of new symbols in 2.8 + + + + Index of new symbols in 2.10 + + + + Index of new symbols in 2.12 + + + + Index of new symbols in 2.14 + + + + Index of new symbols in 2.18 + + + + Index of new symbols in 2.22 + + + + Index of new symbols in 2.24 + + + + diff --git a/docs/reference/gobject/gobject-overrides.txt b/docs/reference/gobject/gobject-overrides.txt new file mode 100644 index 0000000..e69de29 diff --git a/docs/reference/gobject/gobject-query.1 b/docs/reference/gobject/gobject-query.1 new file mode 100644 index 0000000..53903c3 --- /dev/null +++ b/docs/reference/gobject/gobject-query.1 @@ -0,0 +1,83 @@ +'\" t +.\" Title: gobject-query +.\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] +.\" Generator: DocBook XSL Stylesheets v1.74.2 +.\" Date: 03/13/2009 +.\" Manual: [FIXME: manual] +.\" Source: [FIXME: source] +.\" Language: English +.\" +.TH "GOBJECT\-QUERY" "1" "03/13/2009" "[FIXME: source]" "[FIXME: manual]" +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +gobject-query \- display a tree of types +.SH "SYNOPSIS" +.HP \w'\fBgobject\-query\fR\ 'u +\fBgobject\-query\fR froots [options...] +.HP \w'\fBgobject\-query\fR\ 'u +\fBgobject\-query\fR tree [options...] +.SH "DESCRIPTION" +.PP + +\fBgobject\-query\fR +is a small utility that draws a tree of types\&. +.SH "INVOCATION" +.PP + +\fBgobject\-query\fR +takes a mandatory argument that specifies whether it should iterate over the fundamental types or print a type tree\&. +.SS "Options" +.PP +\fBfroots\fR +.RS 4 +iterate over fundamental roots +.RE +.PP +\fBtree\fR +.RS 4 +print type tree +.RE +.PP +\fB\-r\fR \fItype\fR +.RS 4 +specify the root type +.RE +.PP +\fB\-n\fR +.RS 4 +don\'t descend type tree +.RE +.PP +\fB\-b\fR \fIstring\fR +.RS 4 +specify indent string +.RE +.PP +\fB\-i\fR \fIstring\fR +.RS 4 +specify incremental indent string +.RE +.PP +\fB\-s\fR \fInumber\fR +.RS 4 +specify line spacing +.RE +.PP +\fB\-h\fR, \fB\-\-help\fR +.RS 4 +Print brief help and exit\&. +.RE +.PP +\fB\-v\fR, \fB\-\-version\fR +.RS 4 +Print version and exit\&. +.RE diff --git a/docs/reference/gobject/gobject-query.xml b/docs/reference/gobject/gobject-query.xml new file mode 100644 index 0000000..af6fccc --- /dev/null +++ b/docs/reference/gobject/gobject-query.xml @@ -0,0 +1,111 @@ + + + +gobject-query +1 + + + +gobject-query +display a tree of types + + + + +gobject-query +froots +options + + +gobject-query +tree +options + + + +Description + +gobject-query is a small utility that draws a tree of +types. + + + +Invocation + +gobject-query takes a mandatory argument that specifies +whether it should iterate over the fundamental types or print a type tree. + + +Options + + + + + +iterate over fundamental roots + + + + + + +print type tree + + + + + type + +specify the root type + + + + + + +don't descend type tree + + + + + string + +specify indent string + + + + + string + +specify incremental indent string + + + + + + number + +specify line spacing + + + + +, + +Print brief help and exit. + + + + +, + +Print version and exit. + + + + + + + + + diff --git a/docs/reference/gobject/gobject-sections.txt b/docs/reference/gobject/gobject-sections.txt new file mode 100644 index 0000000..58bea93 --- /dev/null +++ b/docs/reference/gobject/gobject-sections.txt @@ -0,0 +1,837 @@ +glib-object.h + +
+gtype +Type Information +GType +G_TYPE_FUNDAMENTAL +G_TYPE_FUNDAMENTAL_MAX +G_TYPE_MAKE_FUNDAMENTAL +G_TYPE_IS_ABSTRACT +G_TYPE_IS_DERIVED +G_TYPE_IS_FUNDAMENTAL +G_TYPE_IS_VALUE_TYPE +G_TYPE_HAS_VALUE_TABLE +G_TYPE_IS_CLASSED +G_TYPE_IS_INSTANTIATABLE +G_TYPE_IS_DERIVABLE +G_TYPE_IS_DEEP_DERIVABLE +G_TYPE_IS_INTERFACE +GTypeInterface +GTypeInstance +GTypeClass +GTypeInfo +GTypeFundamentalInfo +GInterfaceInfo +GTypeValueTable +G_TYPE_FROM_INSTANCE +G_TYPE_FROM_CLASS +G_TYPE_FROM_INTERFACE +G_TYPE_INSTANCE_GET_CLASS +G_TYPE_INSTANCE_GET_INTERFACE +G_TYPE_INSTANCE_GET_PRIVATE +G_TYPE_CHECK_INSTANCE +G_TYPE_CHECK_INSTANCE_CAST +G_TYPE_CHECK_INSTANCE_TYPE +G_TYPE_CHECK_CLASS_CAST +G_TYPE_CHECK_CLASS_TYPE +G_TYPE_CHECK_VALUE +G_TYPE_CHECK_VALUE_TYPE +G_TYPE_FLAG_RESERVED_ID_BIT +g_type_init +GTypeDebugFlags +g_type_init_with_debug_flags +g_type_name +g_type_qname +g_type_from_name +g_type_parent +g_type_depth +g_type_next_base +g_type_is_a +g_type_class_ref +g_type_class_peek +g_type_class_peek_static +g_type_class_unref +g_type_class_peek_parent +g_type_class_add_private +g_type_add_class_private +g_type_interface_peek +g_type_interface_peek_parent +g_type_default_interface_ref +g_type_default_interface_peek +g_type_default_interface_unref +g_type_children +g_type_interfaces +g_type_interface_prerequisites +g_type_set_qdata +g_type_get_qdata +g_type_query +GTypeQuery +GBaseInitFunc +GBaseFinalizeFunc +GClassInitFunc +GClassFinalizeFunc +GInstanceInitFunc +GInterfaceInitFunc +GInterfaceFinalizeFunc +GTypeClassCacheFunc +GTypeFlags +GTypeFundamentalFlags +g_type_register_static +g_type_register_static_simple +g_type_register_dynamic +g_type_register_fundamental +g_type_add_interface_static +g_type_add_interface_dynamic +g_type_interface_add_prerequisite +g_type_get_plugin +g_type_interface_get_plugin +g_type_fundamental_next +g_type_fundamental +g_type_create_instance +g_type_free_instance +g_type_add_class_cache_func +g_type_remove_class_cache_func +g_type_class_unref_uncached +g_type_add_interface_check +g_type_remove_interface_check +GTypeInterfaceCheckFunc +g_type_value_table_peek + +G_DEFINE_TYPE +G_DEFINE_TYPE_WITH_CODE +G_DEFINE_ABSTRACT_TYPE +G_DEFINE_ABSTRACT_TYPE_WITH_CODE +G_DEFINE_INTERFACE +G_DEFINE_INTERFACE_WITH_CODE +G_IMPLEMENT_INTERFACE +G_DEFINE_TYPE_EXTENDED + + +G_TYPE_FUNDAMENTAL_SHIFT +g_type_check_instance +g_type_check_instance_cast +g_type_check_instance_is_a +g_type_check_class_cast +g_type_check_class_is_a +g_type_check_is_value_type +g_type_check_value +g_type_check_value_holds +g_type_instance_get_private +g_type_class_get_private +g_type_test_flags +g_type_name_from_instance +g_type_name_from_class + + +G_TYPE_INVALID +G_TYPE_NONE +G_TYPE_INTERFACE +G_TYPE_CHAR +G_TYPE_UCHAR +G_TYPE_BOOLEAN +G_TYPE_INT +G_TYPE_UINT +G_TYPE_LONG +G_TYPE_ULONG +G_TYPE_INT64 +G_TYPE_UINT64 +G_TYPE_ENUM +G_TYPE_FLAGS +G_TYPE_FLOAT +G_TYPE_DOUBLE +G_TYPE_STRING +G_TYPE_POINTER +G_TYPE_BOXED +G_TYPE_PARAM +G_TYPE_OBJECT +G_TYPE_GTYPE + + +G_TYPE_RESERVED_GLIB_FIRST +G_TYPE_RESERVED_GLIB_LAST +G_TYPE_RESERVED_BSE_FIRST +G_TYPE_RESERVED_BSE_LAST +G_TYPE_RESERVED_USER_FIRST + + +GOBJECT_VAR +g_value_c_init +g_value_types_init +g_enum_types_init +g_param_type_init +g_boxed_type_init +g_object_type_init +g_param_spec_types_init +g_value_transforms_init +g_signal_init +g_gtype_get_type +
+ +
+gtypeplugin +GTypePlugin +GTypePlugin +GTypePluginClass +GTypePluginUse +GTypePluginUnuse +GTypePluginCompleteTypeInfo +GTypePluginCompleteInterfaceInfo +g_type_plugin_use +g_type_plugin_unuse +g_type_plugin_complete_type_info +g_type_plugin_complete_interface_info + +G_TYPE_PLUGIN +G_IS_TYPE_PLUGIN +G_TYPE_TYPE_PLUGIN +g_type_plugin_get_type +G_TYPE_PLUGIN_CLASS +G_IS_TYPE_PLUGIN_CLASS +G_TYPE_PLUGIN_GET_CLASS +
+ +
+gtypemodule +GTypeModule +GTypeModule +GTypeModuleClass +g_type_module_use +g_type_module_unuse +g_type_module_set_name +g_type_module_register_type +g_type_module_add_interface +g_type_module_register_enum +g_type_module_register_flags + +G_DEFINE_DYNAMIC_TYPE +G_DEFINE_DYNAMIC_TYPE_EXTENDED +G_IMPLEMENT_INTERFACE_DYNAMIC + + +G_TYPE_MODULE +G_IS_TYPE_MODULE +G_TYPE_TYPE_MODULE +g_type_module_get_type +G_TYPE_MODULE_CLASS +G_IS_TYPE_MODULE_CLASS +G_TYPE_MODULE_GET_CLASS +
+ +
+The Base Object Type +objects +GObject +GObjectClass +GObjectConstructParam +GObjectGetPropertyFunc +GObjectSetPropertyFunc +GObjectFinalizeFunc +G_TYPE_IS_OBJECT +G_OBJECT +G_IS_OBJECT +G_OBJECT_CLASS +G_IS_OBJECT_CLASS +G_OBJECT_GET_CLASS +G_OBJECT_TYPE +G_OBJECT_TYPE_NAME +G_OBJECT_CLASS_TYPE +G_OBJECT_CLASS_NAME +g_object_class_install_property +g_object_class_find_property +g_object_class_list_properties +g_object_class_override_property +g_object_interface_install_property +g_object_interface_find_property +g_object_interface_list_properties +g_object_new +g_object_newv +GParameter +g_object_ref +g_object_unref +g_object_ref_sink +GInitiallyUnowned +GInitiallyUnownedClass +G_TYPE_INITIALLY_UNOWNED +g_object_is_floating +g_object_force_floating +GWeakNotify +g_object_weak_ref +g_object_weak_unref +g_object_add_weak_pointer +g_object_remove_weak_pointer +GToggleNotify +g_object_add_toggle_ref +g_object_remove_toggle_ref +g_object_connect +g_object_disconnect +g_object_set +g_object_get +g_object_notify +g_object_freeze_notify +g_object_thaw_notify +g_object_get_data +g_object_set_data +g_object_set_data_full +g_object_steal_data +g_object_get_qdata +g_object_set_qdata +g_object_set_qdata_full +g_object_steal_qdata +g_object_set_property +g_object_get_property +g_object_new_valist +g_object_set_valist +g_object_get_valist +g_object_watch_closure +g_object_run_dispose +G_OBJECT_WARN_INVALID_PROPERTY_ID + + +G_INITIALLY_UNOWNED +G_INITIALLY_UNOWNED_CLASS +G_INITIALLY_UNOWNED_GET_CLASS +G_IS_INITIALLY_UNOWNED +G_IS_INITIALLY_UNOWNED_CLASS + + +G_OBJECT_WARN_INVALID_PSPEC +g_initially_unowned_get_type +g_object_compat_control +g_object_get_type +
+ +
+Enumeration and Flag Types +enumerations_flags +GEnumClass +GFlagsClass +G_ENUM_CLASS_TYPE +G_ENUM_CLASS_TYPE_NAME +G_TYPE_IS_ENUM +G_ENUM_CLASS +G_IS_ENUM_CLASS +G_TYPE_IS_FLAGS +G_FLAGS_CLASS +G_IS_FLAGS_CLASS +G_FLAGS_CLASS_TYPE +G_FLAGS_CLASS_TYPE_NAME +GEnumValue +GFlagsValue +g_enum_get_value +g_enum_get_value_by_name +g_enum_get_value_by_nick +g_flags_get_first_value +g_flags_get_value_by_name +g_flags_get_value_by_nick +g_enum_register_static +g_flags_register_static +g_enum_complete_type_info +g_flags_complete_type_info +
+ +
+gboxed +Boxed Types +GBoxedCopyFunc +GBoxedFreeFunc +g_boxed_copy +g_boxed_free +g_boxed_type_register_static +g_pointer_type_register_static + + +G_TYPE_HASH_TABLE +G_TYPE_DATE +G_TYPE_GSTRING +G_TYPE_STRV +G_TYPE_REGEX +G_TYPE_ARRAY +G_TYPE_BYTE_ARRAY +G_TYPE_PTR_ARRAY +G_TYPE_VARIANT +G_TYPE_VARIANT_TYPE +GStrv + + +G_TYPE_IS_BOXED + + +g_gstring_get_type +g_strv_get_type +g_date_get_type +g_hash_table_get_type +g_regex_get_type +g_array_get_type +g_byte_array_get_type +g_ptr_array_get_type +g_variant_get_gtype +g_variant_type_get_gtype +
+ +
+Generic values +generic_values +G_VALUE_HOLDS +G_VALUE_TYPE +G_VALUE_TYPE_NAME +G_TYPE_IS_VALUE +G_TYPE_IS_VALUE_ABSTRACT +G_IS_VALUE +GValue +G_TYPE_VALUE +G_TYPE_VALUE_ARRAY +g_value_init +g_value_copy +g_value_reset +g_value_unset +g_value_set_instance +g_value_fits_pointer +g_value_peek_pointer +g_value_type_compatible +g_value_type_transformable +g_value_transform +GValueTransform +g_value_register_transform_func +g_strdup_value_contents + + +G_VALUE_NOCOPY_CONTENTS +g_value_get_type +g_value_array_get_type +
+ +
+Value arrays +value_arrays +GValueArray +g_value_array_get_nth +g_value_array_new +g_value_array_copy +g_value_array_free +g_value_array_append +g_value_array_prepend +g_value_array_insert +g_value_array_remove +g_value_array_sort +g_value_array_sort_with_data +
+ +
+GParamSpec +gparamspec +G_TYPE_IS_PARAM +G_PARAM_SPEC +G_IS_PARAM_SPEC +G_PARAM_SPEC_CLASS +G_IS_PARAM_SPEC_CLASS +G_PARAM_SPEC_GET_CLASS +G_PARAM_SPEC_TYPE +G_PARAM_SPEC_TYPE_NAME +G_PARAM_SPEC_VALUE_TYPE +GParamSpec +GParamSpecClass +GParamFlags +G_PARAM_READWRITE +G_PARAM_STATIC_STRINGS +G_PARAM_MASK +G_PARAM_USER_SHIFT +g_param_spec_ref +g_param_spec_unref +g_param_spec_sink +g_param_spec_ref_sink +g_param_value_set_default +g_param_value_defaults +g_param_value_validate +g_param_value_convert +g_param_values_cmp +g_param_spec_get_name +g_param_spec_get_nick +g_param_spec_get_blurb +g_param_spec_get_qdata +g_param_spec_set_qdata +g_param_spec_set_qdata_full +g_param_spec_steal_qdata +g_param_spec_get_redirect_target +g_param_spec_internal +GParamSpecTypeInfo +g_param_type_register_static +GParamSpecPool +g_param_spec_pool_new +g_param_spec_pool_insert +g_param_spec_pool_remove +g_param_spec_pool_lookup +g_param_spec_pool_list +g_param_spec_pool_list_owned +
+ +
+Standard Parameter and Value Types +param_value_types + + +G_IS_PARAM_SPEC_BOOLEAN +G_PARAM_SPEC_BOOLEAN +G_VALUE_HOLDS_BOOLEAN +G_TYPE_PARAM_BOOLEAN +GParamSpecBoolean +g_param_spec_boolean +g_value_set_boolean +g_value_get_boolean + + +G_IS_PARAM_SPEC_CHAR +G_PARAM_SPEC_CHAR +G_VALUE_HOLDS_CHAR +G_TYPE_PARAM_CHAR +GParamSpecChar +g_param_spec_char +g_value_set_char +g_value_get_char + + +G_IS_PARAM_SPEC_UCHAR +G_PARAM_SPEC_UCHAR +G_VALUE_HOLDS_UCHAR +G_TYPE_PARAM_UCHAR +GParamSpecUChar +g_param_spec_uchar +g_value_set_uchar +g_value_get_uchar + + +G_IS_PARAM_SPEC_INT +G_PARAM_SPEC_INT +G_VALUE_HOLDS_INT +G_TYPE_PARAM_INT +GParamSpecInt +g_param_spec_int +g_value_set_int +g_value_get_int + + +G_IS_PARAM_SPEC_UINT +G_PARAM_SPEC_UINT +G_VALUE_HOLDS_UINT +G_TYPE_PARAM_UINT +GParamSpecUInt +g_param_spec_uint +g_value_set_uint +g_value_get_uint + + +G_IS_PARAM_SPEC_LONG +G_PARAM_SPEC_LONG +G_VALUE_HOLDS_LONG +G_TYPE_PARAM_LONG +GParamSpecLong +g_param_spec_long +g_value_set_long +g_value_get_long + + +G_IS_PARAM_SPEC_ULONG +G_PARAM_SPEC_ULONG +G_VALUE_HOLDS_ULONG +G_TYPE_PARAM_ULONG +GParamSpecULong +g_param_spec_ulong +g_value_set_ulong +g_value_get_ulong + + +G_IS_PARAM_SPEC_INT64 +G_PARAM_SPEC_INT64 +G_VALUE_HOLDS_INT64 +G_TYPE_PARAM_INT64 +GParamSpecInt64 +g_param_spec_int64 +g_value_set_int64 +g_value_get_int64 + + +G_IS_PARAM_SPEC_UINT64 +G_PARAM_SPEC_UINT64 +G_VALUE_HOLDS_UINT64 +G_TYPE_PARAM_UINT64 +GParamSpecUInt64 +g_param_spec_uint64 +g_value_set_uint64 +g_value_get_uint64 + + +G_IS_PARAM_SPEC_FLOAT +G_PARAM_SPEC_FLOAT +G_VALUE_HOLDS_FLOAT +G_TYPE_PARAM_FLOAT +GParamSpecFloat +g_param_spec_float +g_value_set_float +g_value_get_float + + +G_IS_PARAM_SPEC_DOUBLE +G_PARAM_SPEC_DOUBLE +G_VALUE_HOLDS_DOUBLE +G_TYPE_PARAM_DOUBLE +GParamSpecDouble +g_param_spec_double +g_value_set_double +g_value_get_double + + +G_IS_PARAM_SPEC_ENUM +G_PARAM_SPEC_ENUM +G_VALUE_HOLDS_ENUM +G_TYPE_PARAM_ENUM +GParamSpecEnum +g_param_spec_enum +g_value_set_enum +g_value_get_enum + + +G_IS_PARAM_SPEC_FLAGS +G_PARAM_SPEC_FLAGS +G_VALUE_HOLDS_FLAGS +G_TYPE_PARAM_FLAGS +GParamSpecFlags +g_param_spec_flags +g_value_set_flags +g_value_get_flags + + +G_IS_PARAM_SPEC_STRING +G_PARAM_SPEC_STRING +G_VALUE_HOLDS_STRING +G_TYPE_PARAM_STRING +GParamSpecString +gchararray +g_param_spec_string +g_value_set_string +g_value_set_static_string +g_value_take_string +g_value_set_string_take_ownership +g_value_get_string +g_value_dup_string + + +G_IS_PARAM_SPEC_PARAM +G_PARAM_SPEC_PARAM +G_VALUE_HOLDS_PARAM +G_TYPE_PARAM_PARAM +GParamSpecParam +g_param_spec_param +g_value_set_param +g_value_take_param +g_value_set_param_take_ownership +g_value_get_param +g_value_dup_param + + +G_IS_PARAM_SPEC_BOXED +G_PARAM_SPEC_BOXED +G_VALUE_HOLDS_BOXED +G_TYPE_PARAM_BOXED +GParamSpecBoxed +g_param_spec_boxed +g_value_set_boxed +g_value_set_static_boxed +g_value_take_boxed +g_value_set_boxed_take_ownership +g_value_get_boxed +g_value_dup_boxed + + +G_IS_PARAM_SPEC_POINTER +G_PARAM_SPEC_POINTER +G_VALUE_HOLDS_POINTER +G_TYPE_PARAM_POINTER +GParamSpecPointer +g_param_spec_pointer +g_value_set_pointer +g_value_get_pointer + + +G_IS_PARAM_SPEC_OBJECT +G_PARAM_SPEC_OBJECT +G_VALUE_HOLDS_OBJECT +G_TYPE_PARAM_OBJECT +GParamSpecObject +g_param_spec_object +g_value_set_object +g_value_take_object +g_value_set_object_take_ownership +g_value_get_object +g_value_dup_object + + +G_IS_PARAM_SPEC_UNICHAR +G_PARAM_SPEC_UNICHAR +G_TYPE_PARAM_UNICHAR +GParamSpecUnichar +g_param_spec_unichar + + +G_IS_PARAM_SPEC_VALUE_ARRAY +G_PARAM_SPEC_VALUE_ARRAY +G_TYPE_PARAM_VALUE_ARRAY +GParamSpecValueArray +g_param_spec_value_array + + +G_IS_PARAM_SPEC_OVERRIDE +G_PARAM_SPEC_OVERRIDE +G_TYPE_PARAM_OVERRIDE +GParamSpecOverride +g_param_spec_override + + +G_IS_PARAM_SPEC_GTYPE +G_PARAM_SPEC_GTYPE +G_VALUE_HOLDS_GTYPE +G_TYPE_PARAM_GTYPE +GParamSpecGType +g_param_spec_gtype +g_value_get_gtype +g_value_set_gtype + + +g_value_set_instance +g_param_spec_types +
+ +
+Varargs Value Collection +value_collection +glib-object.h,gobject/gvaluecollector.h +GTypeCValue +G_VALUE_COLLECT +G_VALUE_LCOPY +G_VALUE_COLLECT_FORMAT_MAX_LENGTH +
+ +
+Signals +signals +GSignalInvocationHint +GSignalAccumulator +GSignalCMarshaller +GSignalEmissionHook +GSignalFlags +GSignalMatchType +GSignalQuery +G_SIGNAL_TYPE_STATIC_SCOPE +G_SIGNAL_MATCH_MASK +G_SIGNAL_FLAGS_MASK +g_signal_new +g_signal_newv +g_signal_new_valist +g_signal_query +g_signal_lookup +g_signal_name +g_signal_list_ids +g_signal_emit +g_signal_emit_by_name +g_signal_emitv +g_signal_emit_valist +g_signal_connect +g_signal_connect_after +g_signal_connect_swapped +g_signal_connect_object +GConnectFlags +g_signal_connect_data +g_signal_connect_closure +g_signal_connect_closure_by_id +g_signal_handler_block +g_signal_handler_unblock +g_signal_handler_disconnect +g_signal_handler_find +g_signal_handlers_block_matched +g_signal_handlers_unblock_matched +g_signal_handlers_disconnect_matched +g_signal_handler_is_connected +g_signal_handlers_block_by_func +g_signal_handlers_unblock_by_func +g_signal_handlers_disconnect_by_func +g_signal_has_handler_pending +g_signal_stop_emission +g_signal_stop_emission_by_name +g_signal_override_class_closure +g_signal_chain_from_overridden +g_signal_new_class_handler +g_signal_override_class_handler +g_signal_chain_from_overridden_handler +g_signal_add_emission_hook +g_signal_remove_emission_hook +g_signal_parse_name +g_signal_get_invocation_hint +g_signal_type_cclosure_new +g_signal_accumulator_true_handled + +g_signal_handlers_destroy +
+ +
+gclosure +Closures +G_CLOSURE_NEEDS_MARSHAL +G_CLOSURE_N_NOTIFIERS +G_CCLOSURE_SWAP_DATA +G_CALLBACK +GCallback +GClosure +G_TYPE_CLOSURE +GCClosure +GClosureMarshal +GClosureNotify +g_cclosure_new +g_cclosure_new_swap +g_cclosure_new_object +g_cclosure_new_object_swap +g_closure_new_object +g_closure_ref +g_closure_sink +g_closure_unref +g_closure_invoke +g_closure_invalidate +g_closure_add_finalize_notifier +g_closure_add_invalidate_notifier +g_closure_remove_finalize_notifier +g_closure_remove_invalidate_notifier +g_closure_new_simple +g_closure_set_marshal +g_closure_add_marshal_guards +g_closure_set_meta_marshal +g_source_set_closure +G_TYPE_IO_CHANNEL +G_TYPE_IO_CONDITION + + +g_cclosure_marshal_VOID__VOID +g_cclosure_marshal_VOID__BOOLEAN +g_cclosure_marshal_VOID__CHAR +g_cclosure_marshal_VOID__UCHAR +g_cclosure_marshal_VOID__INT +g_cclosure_marshal_VOID__UINT +g_cclosure_marshal_VOID__LONG +g_cclosure_marshal_VOID__ULONG +g_cclosure_marshal_VOID__ENUM +g_cclosure_marshal_VOID__FLAGS +g_cclosure_marshal_VOID__FLOAT +g_cclosure_marshal_VOID__DOUBLE +g_cclosure_marshal_VOID__STRING +g_cclosure_marshal_VOID__PARAM +g_cclosure_marshal_VOID__BOXED +g_cclosure_marshal_VOID__POINTER +g_cclosure_marshal_VOID__OBJECT +g_cclosure_marshal_STRING__OBJECT_POINTER +g_cclosure_marshal_VOID__UINT_POINTER +g_cclosure_marshal_BOOLEAN__FLAGS +g_cclosure_marshal_BOOL__FLAGS + + +GClosureNotifyData +g_closure_get_type +g_io_channel_get_type +g_io_condition_get_type +
diff --git a/docs/reference/gobject/gobject.cI b/docs/reference/gobject/gobject.cI new file mode 100644 index 0000000..2976940 --- /dev/null +++ b/docs/reference/gobject/gobject.cI @@ -0,0 +1,11 @@ +/* + * This is a hack to work around a limitation of gtkdoc-scan: it insists + * on putting () behind every symbol listed in gobject.types. Thus we + * can't put G_TYPE_OBJECT there, but have to sneak a g_object_get_type() + * function in the generated source via an #include. + */ +GType +g_object_get_type (void) +{ + return G_TYPE_OBJECT; +} diff --git a/docs/reference/gobject/gobject.types b/docs/reference/gobject/gobject.types new file mode 100644 index 0000000..b8d745f --- /dev/null +++ b/docs/reference/gobject/gobject.types @@ -0,0 +1,6 @@ +#include +#include "gobject.cI" + +g_object_get_type +g_type_module_get_type +g_type_plugin_get_type diff --git a/docs/reference/gobject/html/GTypeModule.html b/docs/reference/gobject/html/GTypeModule.html new file mode 100644 index 0000000..e605543 --- /dev/null +++ b/docs/reference/gobject/html/GTypeModule.html @@ -0,0 +1,652 @@ + + + + +GTypeModule + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GTypeModule

+

GTypeModule — Type loading modules

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+                    GTypeModule;
+                    GTypeModuleClass;
+gboolean            g_type_module_use                   (GTypeModule *module);
+void                g_type_module_unuse                 (GTypeModule *module);
+void                g_type_module_set_name              (GTypeModule *module,
+                                                         const gchar *name);
+GType               g_type_module_register_type         (GTypeModule *module,
+                                                         GType parent_type,
+                                                         const gchar *type_name,
+                                                         const GTypeInfo *type_info,
+                                                         GTypeFlags flags);
+void                g_type_module_add_interface         (GTypeModule *module,
+                                                         GType instance_type,
+                                                         GType interface_type,
+                                                         const GInterfaceInfo *interface_info);
+GType               g_type_module_register_enum         (GTypeModule *module,
+                                                         const gchar *name,
+                                                         const GEnumValue *const_static_values);
+GType               g_type_module_register_flags        (GTypeModule *module,
+                                                         const gchar *name,
+                                                         const GFlagsValue *const_static_values);
+#define             G_DEFINE_DYNAMIC_TYPE               (TN, t_n, T_P)
+#define             G_DEFINE_DYNAMIC_TYPE_EXTENDED      (TypeName, type_name, TYPE_PARENT, flags, CODE)
+#define             G_IMPLEMENT_INTERFACE_DYNAMIC       (TYPE_IFACE, iface_init)
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GTypeModule
+
+
+
+

Implemented Interfaces

+

+GTypeModule implements + GTypePlugin.

+
+
+

Description

+

+GTypeModule provides a simple implementation of the GTypePlugin +interface. The model of GTypeModule is a dynamically loaded module +which implements some number of types and interface +implementations. When the module is loaded, it registers its types +and interfaces using g_type_module_register_type() and +g_type_module_add_interface(). As long as any instances of these +types and interface implementations are in use, the module is kept +loaded. When the types and interfaces are gone, the module may be +unloaded. If the types and interfaces become used again, the module +will be reloaded. Note that the last unref can not happen in module +code, since that would lead to the caller's code being unloaded before +g_object_unref() returns to it. +

+

+Keeping track of whether the module should be loaded or not is done by +using a use count - it starts at zero, and whenever it is greater than +zero, the module is loaded. The use count is maintained internally by +the type system, but also can be explicitly controlled by +g_type_module_use() and g_type_module_unuse(). Typically, when loading +a module for the first type, g_type_module_use() will be used to load +it so that it can initialize its types. At some later point, when the +module no longer needs to be loaded except for the type +implementations it contains, g_type_module_unuse() is called. +

+

+GTypeModule does not actually provide any implementation of module +loading and unloading. To create a particular module type you must +derive from GTypeModule and implement the load and unload functions +in GTypeModuleClass.

+
+
+

Details

+
+

GTypeModule

+
typedef struct {
+  gchar *name;
+} GTypeModule;
+
+

+The members of the GTypeModule structure should not +be accessed directly, except for the name field.

+
++ + + + +

gchar *name;

the name of the module +
+
+
+
+

GTypeModuleClass

+
typedef struct {
+  GObjectClass parent_class;
+
+  gboolean (* load)   (GTypeModule *module);
+  void     (* unload) (GTypeModule *module);
+} GTypeModuleClass;
+
+

+In order to implement dynamic loading of types based on GTypeModule, +the load and unload functions in GTypeModuleClass must be implemented.

+
++ + + + + + + + + + + + + + +

GObjectClass parent_class;

the parent class +

load ()

loads the module and registers one or more types using + g_type_module_register_type(). +

unload ()

unloads the module +
+
+
+
+

g_type_module_use ()

+
gboolean            g_type_module_use                   (GTypeModule *module);
+

+Increases the use count of a GTypeModule by one. If the +use count was zero before, the plugin will be loaded. +If loading the plugin fails, the use count is reset to +its prior value.

+
++ + + + + + + + + + +

module :

a GTypeModule +

Returns :

FALSE if the plugin needed to be loaded and + loading the plugin failed. +
+
+
+
+

g_type_module_unuse ()

+
void                g_type_module_unuse                 (GTypeModule *module);
+

+Decreases the use count of a GTypeModule by one. If the +result is zero, the module will be unloaded. (However, the +GTypeModule will not be freed, and types associated with the +GTypeModule are not unregistered. Once a GTypeModule is +initialized, it must exist forever.)

+
++ + + + +

module :

a GTypeModule +
+
+
+
+

g_type_module_set_name ()

+
void                g_type_module_set_name              (GTypeModule *module,
+                                                         const gchar *name);
+

+Sets the name for a GTypeModule

+
++ + + + + + + + + + +

module :

a GTypeModule. +

name :

a human-readable name to use in error messages. +
+
+
+
+

g_type_module_register_type ()

+
GType               g_type_module_register_type         (GTypeModule *module,
+                                                         GType parent_type,
+                                                         const gchar *type_name,
+                                                         const GTypeInfo *type_info,
+                                                         GTypeFlags flags);
+

+Looks up or registers a type that is implemented with a particular +type plugin. If a type with name type_name was previously registered, +the GType identifier for the type is returned, otherwise the type +is newly registered, and the resulting GType identifier returned. +

+

+When reregistering a type (typically because a module is unloaded +then reloaded, and reinitialized), module and parent_type must +be the same as they were previously. +

+

+As long as any instances of the type exist, the type plugin will +not be unloaded.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

module :

a GTypeModule +

parent_type :

the type for the parent class +

type_name :

name for the type +

type_info :

type information structure +

flags :

flags field providing details about the type +

Returns :

the new or existing type ID +
+
+
+
+

g_type_module_add_interface ()

+
void                g_type_module_add_interface         (GTypeModule *module,
+                                                         GType instance_type,
+                                                         GType interface_type,
+                                                         const GInterfaceInfo *interface_info);
+

+Registers an additional interface for a type, whose interface lives +in the given type plugin. If the interface was already registered +for the type in this plugin, nothing will be done. +

+

+As long as any instances of the type exist, the type plugin will +not be unloaded.

+
++ + + + + + + + + + + + + + + + + + +

module :

a GTypeModule +

instance_type :

type to which to add the interface. +

interface_type :

interface type to add +

interface_info :

type information structure +
+
+
+
+

g_type_module_register_enum ()

+
GType               g_type_module_register_enum         (GTypeModule *module,
+                                                         const gchar *name,
+                                                         const GEnumValue *const_static_values);
+

+Looks up or registers an enumeration that is implemented with a particular +type plugin. If a type with name type_name was previously registered, +the GType identifier for the type is returned, otherwise the type +is newly registered, and the resulting GType identifier returned. +

+

+As long as any instances of the type exist, the type plugin will +not be unloaded.

+
++ + + + + + + + + + + + + + + + + + +

module :

a GTypeModule +

name :

name for the type +

const_static_values :

an array of GEnumValue structs for the + possible enumeration values. The array is + terminated by a struct with all members being + 0. +

Returns :

the new or existing type ID +
+

Since 2.6

+
+
+
+

g_type_module_register_flags ()

+
GType               g_type_module_register_flags        (GTypeModule *module,
+                                                         const gchar *name,
+                                                         const GFlagsValue *const_static_values);
+

+Looks up or registers a flags type that is implemented with a particular +type plugin. If a type with name type_name was previously registered, +the GType identifier for the type is returned, otherwise the type +is newly registered, and the resulting GType identifier returned. +

+

+As long as any instances of the type exist, the type plugin will +not be unloaded.

+
++ + + + + + + + + + + + + + + + + + +

module :

a GTypeModule +

name :

name for the type +

const_static_values :

an array of GFlagsValue structs for the + possible flags values. The array is + terminated by a struct with all members being + 0. +

Returns :

the new or existing type ID +
+

Since 2.6

+
+
+
+

G_DEFINE_DYNAMIC_TYPE()

+
#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P)          G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
+
+

+A convenience macro for dynamic type implementations, which declares a +class initialization function, an instance initialization function (see +GTypeInfo for information about these) and a static variable named +t_n_parent_class pointing to the parent class. Furthermore, +it defines a *_get_type() and a static +*_register_type() function for use in your +module_init(). +See G_DEFINE_DYNAMIC_TYPE_EXTENDED() for an example.

+
++ + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words + separated by '_'. +

T_P :

The GType of the parent type. +
+

Since 2.14

+
+
+
+

G_DEFINE_DYNAMIC_TYPE_EXTENDED()

+
#define             G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE)
+

+A more general version of G_DEFINE_DYNAMIC_TYPE() which +allows to specify GTypeFlags and custom code. +

+

+

+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget,
+                                gtk_gadget,
+                                GTK_TYPE_THING,
+                                0,
+                                G_IMPLEMENT_INTERFACE_DYNAMIC (TYPE_GIZMO,
+                                                               gtk_gadget_gizmo_init));
+
+

+expands to +

+
+static void     gtk_gadget_init              (GtkGadget      *self);
+static void     gtk_gadget_class_init        (GtkGadgetClass *klass);
+static void     gtk_gadget_class_finalize    (GtkGadgetClass *klass);
+
+static gpointer gtk_gadget_parent_class = NULL;
+static GType    gtk_gadget_type_id = 0;
+
+static void     gtk_gadget_class_intern_init (gpointer klass)
+{
+  gtk_gadget_parent_class = g_type_class_peek_parent (klass); 
+  gtk_gadget_class_init ((GtkGadgetClass*) klass); 
+}
+
+GType
+gtk_gadget_get_type (void)
+{
+  return gtk_gadget_type_id;
+}
+
+static void
+gtk_gadget_register_type (GTypeModule *type_module)
+{
+  const GTypeInfo g_define_type_info = {
+    sizeof (GtkGadgetClass),
+    (GBaseInitFunc) NULL,
+    (GBaseFinalizeFunc) NULL,
+    (GClassInitFunc) gtk_gadget_class_intern_init,
+    (GClassFinalizeFunc) gtk_gadget_class_finalize,
+    NULL,   // class_data
+    sizeof (GtkGadget),
+    0,      // n_preallocs
+    (GInstanceInitFunc) gtk_gadget_init, 
+    NULL    // value_table
+  };
+  gtk_gadget_type_id = g_type_module_register_type (type_module,
+                                                    GTK_TYPE_THING,
+                                                    GtkGadget,
+                                                    &g_define_type_info,
+                                                    (GTypeFlags) flags);
+  {
+    const GInterfaceInfo g_implement_interface_info = {
+      (GInterfaceInitFunc) gtk_gadget_gizmo_init
+    };
+    g_type_module_add_interface (type_module, g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
+  }
+}
+
+
++ + + + + + + + + + + + + + + + + + + + + + +

TypeName :

The name of the new type, in Camel case. +

type_name :

The name of the new type, in lowercase, with words + separated by '_'. +

TYPE_PARENT :

The GType of the parent type. +

flags :

GTypeFlags to pass to g_type_module_register_type() +

CODE :

Custom code that gets inserted in the *_get_type() function. +
+

Since 2.14

+
+
+
+

G_IMPLEMENT_INTERFACE_DYNAMIC()

+
#define             G_IMPLEMENT_INTERFACE_DYNAMIC(TYPE_IFACE, iface_init)
+

+A convenience macro to ease interface addition in the _C_ section +of G_DEFINE_DYNAMIC_TYPE_EXTENDED(). See G_DEFINE_DYNAMIC_TYPE_EXTENDED() +for an example. +

+

+Note that this macro can only be used together with the +G_DEFINE_DYNAMIC_TYPE_EXTENDED macros, since it depends on variable +names from that macro.

+
++ + + + + + + + + + +

TYPE_IFACE :

The GType of the interface to add +

iface_init :

The interface init function +
+

Since 2.24

+
+
+
+

See Also

+
++ + + + + + + + + + +

GTypePlugin

The abstract type loader interface.

GModule

Portable mechanism for dynamically loaded modules.

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/GTypePlugin.html b/docs/reference/gobject/html/GTypePlugin.html new file mode 100644 index 0000000..5bea32c --- /dev/null +++ b/docs/reference/gobject/html/GTypePlugin.html @@ -0,0 +1,461 @@ + + + + +GTypePlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GTypePlugin

+

GTypePlugin — An interface for dynamically loadable types

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+                    GTypePlugin;
+                    GTypePluginClass;
+void                (*GTypePluginUse)                   (GTypePlugin *plugin);
+void                (*GTypePluginUnuse)                 (GTypePlugin *plugin);
+void                (*GTypePluginCompleteTypeInfo)      (GTypePlugin *plugin,
+                                                         GType g_type,
+                                                         GTypeInfo *info,
+                                                         GTypeValueTable *value_table);
+void                (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
+                                                         GType instance_type,
+                                                         GType interface_type,
+                                                         GInterfaceInfo *info);
+void                g_type_plugin_use                   (GTypePlugin *plugin);
+void                g_type_plugin_unuse                 (GTypePlugin *plugin);
+void                g_type_plugin_complete_type_info    (GTypePlugin *plugin,
+                                                         GType g_type,
+                                                         GTypeInfo *info,
+                                                         GTypeValueTable *value_table);
+void                g_type_plugin_complete_interface_info
+                                                        (GTypePlugin *plugin,
+                                                         GType instance_type,
+                                                         GType interface_type,
+                                                         GInterfaceInfo *info);
+
+
+
+

Object Hierarchy

+
+  GInterface
+   +----GTypePlugin
+
+
+
+

Known Implementations

+

+GTypePlugin is implemented by + GTypeModule.

+
+
+

Description

+

+The GObject type system supports dynamic loading of types. The +GTypePlugin interface is used to handle the lifecycle of +dynamically loaded types. It goes as follows: +

+

+

+
    +
  1. +

    + The type is initially introduced (usually upon loading the module + the first time, or by your main application that knows what modules + introduces what types), like this: +

    +
    +  new_type_id = g_type_register_dynamic (parent_type_id,
    +                                                "TypeName",
    +                                                new_type_plugin,
    +                                                type_flags);
    +  
    +

    + where new_type_plugin is an implementation of the + GTypePlugin interface. +

    +
  2. +
  3. + The type's implementation is referenced, e.g. through + g_type_class_ref() or through g_type_create_instance() (this is + being called by g_object_new()) or through one of the above done on + a type derived from new_type_id. +

  4. +
  5. + This causes the type system to load the type's implementation by calling + g_type_plugin_use() and g_type_plugin_complete_type_info() on + new_type_plugin. +

  6. +
  7. + At some point the type's implementation isn't required anymore, e.g. after + g_type_class_unref() or g_type_free_instance() (called when the reference + count of an instance drops to zero). +

  8. +
  9. + This causes the type system to throw away the information retrieved from + g_type_plugin_complete_type_info() and then it calls + g_type_plugin_unuse() on new_type_plugin. +

  10. +
  11. + Things may repeat from the second step. +

  12. +
+

+

+

+So basically, you need to implement a GTypePlugin type that +carries a use_count, once use_count goes from zero to one, you need +to load the implementation to successfully handle the upcoming +g_type_plugin_complete_type_info() call. Later, maybe after +succeeding use/unuse calls, once use_count drops to zero, you can +unload the implementation again. The type system makes sure to call +g_type_plugin_use() and g_type_plugin_complete_type_info() again +when the type is needed again. +

+

+GTypeModule is an implementation of GTypePlugin that already +implements most of this except for the actual module loading and +unloading. It even handles multiple registered types per module.

+
+
+

Details

+
+

GTypePlugin

+
typedef struct _GTypePlugin GTypePlugin;
+

+The GTypePlugin typedef is used as a placeholder +for objects that implement the GTypePlugin +interface.

+
+
+
+

GTypePluginClass

+
typedef struct {
+  GTypePluginUse		   use_plugin;
+  GTypePluginUnuse		   unuse_plugin;
+  GTypePluginCompleteTypeInfo	   complete_type_info;
+  GTypePluginCompleteInterfaceInfo complete_interface_info;
+} GTypePluginClass;
+
+

+The GTypePlugin interface is used by the type system in order to handle +the lifecycle of dynamically loaded types.

+
++ + + + + + + + + + + + + + + + + + +

GTypePluginUse use_plugin;

Increases the use count of the plugin. +

GTypePluginUnuse unuse_plugin;

Decreases the use count of the plugin. +

GTypePluginCompleteTypeInfo complete_type_info;

Fills in the GTypeInfo and + GTypeValueTable structs for the type. The structs are initialized + with memset(s, 0, sizeof (s)) before calling + this function. +

GTypePluginCompleteInterfaceInfo complete_interface_info;

Fills in missing parts of the GInterfaceInfo + for the interface. The structs is initialized with + memset(s, 0, sizeof (s)) before calling + this function. +
+
+
+
+

GTypePluginUse ()

+
void                (*GTypePluginUse)                   (GTypePlugin *plugin);
+

+The type of the use_plugin function of GTypePluginClass, which gets called +to increase the use count of plugin.

+
++ + + + +

plugin :

the GTypePlugin whose use count should be increased +
+
+
+
+

GTypePluginUnuse ()

+
void                (*GTypePluginUnuse)                 (GTypePlugin *plugin);
+

+The type of the unuse_plugin function of GTypePluginClass.

+
++ + + + +

plugin :

the GTypePlugin whose use count should be decreased +
+
+
+
+

GTypePluginCompleteTypeInfo ()

+
void                (*GTypePluginCompleteTypeInfo)      (GTypePlugin *plugin,
+                                                         GType g_type,
+                                                         GTypeInfo *info,
+                                                         GTypeValueTable *value_table);
+

+The type of the complete_type_info function of GTypePluginClass.

+
++ + + + + + + + + + + + + + + + + + +

plugin :

the GTypePlugin +

g_type :

the GType whose info is completed +

info :

the GTypeInfo struct to fill in +

value_table :

the GTypeValueTable to fill in +
+
+
+
+

GTypePluginCompleteInterfaceInfo ()

+
void                (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
+                                                         GType instance_type,
+                                                         GType interface_type,
+                                                         GInterfaceInfo *info);
+

+The type of the complete_interface_info function of GTypePluginClass.

+
++ + + + + + + + + + + + + + + + + + +

plugin :

the GTypePlugin +

instance_type :

the GType of an instantiable type to which the interface + is added +

interface_type :

the GType of the interface whose info is completed +

info :

the GInterfaceInfo to fill in +
+
+
+
+

g_type_plugin_use ()

+
void                g_type_plugin_use                   (GTypePlugin *plugin);
+

+Calls the use_plugin function from the GTypePluginClass of +plugin. There should be no need to use this function outside of +the GObject type system itself.

+
++ + + + +

plugin :

a GTypePlugin +
+
+
+
+

g_type_plugin_unuse ()

+
void                g_type_plugin_unuse                 (GTypePlugin *plugin);
+

+Calls the unuse_plugin function from the GTypePluginClass of +plugin. There should be no need to use this function outside of +the GObject type system itself.

+
++ + + + +

plugin :

a GTypePlugin +
+
+
+
+

g_type_plugin_complete_type_info ()

+
void                g_type_plugin_complete_type_info    (GTypePlugin *plugin,
+                                                         GType g_type,
+                                                         GTypeInfo *info,
+                                                         GTypeValueTable *value_table);
+

+Calls the complete_type_info function from the GTypePluginClass of plugin. +There should be no need to use this function outside of the GObject +type system itself.

+
++ + + + + + + + + + + + + + + + + + +

plugin :

a GTypePlugin +

g_type :

the GType whose info is completed +

info :

the GTypeInfo struct to fill in +

value_table :

the GTypeValueTable to fill in +
+
+
+
+

g_type_plugin_complete_interface_info ()

+
void                g_type_plugin_complete_interface_info
+                                                        (GTypePlugin *plugin,
+                                                         GType instance_type,
+                                                         GType interface_type,
+                                                         GInterfaceInfo *info);
+

+Calls the complete_interface_info function from the +GTypePluginClass of plugin. There should be no need to use this +function outside of the GObject type system itself.

+
++ + + + + + + + + + + + + + + + + + +

plugin :

the GTypePlugin +

instance_type :

the GType of an instantiable type to which the interface + is added +

interface_type :

the GType of the interface whose info is completed +

info :

the GInterfaceInfo to fill in +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-10.html b/docs/reference/gobject/html/api-index-2-10.html new file mode 100644 index 0000000..4c18798 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-10.html @@ -0,0 +1,95 @@ + + + + +Index of new symbols in 2.10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-12.html b/docs/reference/gobject/html/api-index-2-12.html new file mode 100644 index 0000000..1e21e3c --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-12.html @@ -0,0 +1,77 @@ + + + + +Index of new symbols in 2.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.12

+

T

+
g_type_register_static_simple
+
+

V

+
g_value_get_gtype
+
+
G_VALUE_HOLDS_GTYPE
+
+
g_value_set_gtype
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-14.html b/docs/reference/gobject/html/api-index-2-14.html new file mode 100644 index 0000000..aa526d4 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-14.html @@ -0,0 +1,75 @@ + + + + +Index of new symbols in 2.14 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.14

+

D

+
G_DEFINE_DYNAMIC_TYPE
+
+
G_DEFINE_DYNAMIC_TYPE_EXTENDED
+
+

T

+
G_TYPE_REGEX
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-18.html b/docs/reference/gobject/html/api-index-2-18.html new file mode 100644 index 0000000..be3f264 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-18.html @@ -0,0 +1,70 @@ + + + + +Index of new symbols in 2.18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-2.html b/docs/reference/gobject/html/api-index-2-2.html new file mode 100644 index 0000000..c2ae135 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-2.html @@ -0,0 +1,66 @@ + + + + +Index of new symbols in 2.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.2

+

T

+
g_type_interface_prerequisites
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-22.html b/docs/reference/gobject/html/api-index-2-22.html new file mode 100644 index 0000000..3e47640 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-22.html @@ -0,0 +1,70 @@ + + + + +Index of new symbols in 2.22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.22

+

T

+
G_TYPE_ARRAY
+
+
G_TYPE_BYTE_ARRAY
+
+
G_TYPE_PTR_ARRAY
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-24.html b/docs/reference/gobject/html/api-index-2-24.html new file mode 100644 index 0000000..0c43c7f --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-24.html @@ -0,0 +1,85 @@ + + + + +Index of new symbols in 2.24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-4.html b/docs/reference/gobject/html/api-index-2-4.html new file mode 100644 index 0000000..017b89e --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-4.html @@ -0,0 +1,144 @@ + + + + +Index of new symbols in 2.4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-6.html b/docs/reference/gobject/html/api-index-2-6.html new file mode 100644 index 0000000..f648537 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-6.html @@ -0,0 +1,68 @@ + + + + +Index of new symbols in 2.6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.6

+

T

+
g_type_module_register_enum
+
+
g_type_module_register_flags
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-2-8.html b/docs/reference/gobject/html/api-index-2-8.html new file mode 100644 index 0000000..d2922a8 --- /dev/null +++ b/docs/reference/gobject/html/api-index-2-8.html @@ -0,0 +1,68 @@ + + + + +Index of new symbols in 2.8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index of new symbols in 2.8

+

O

+
g_object_add_toggle_ref
+
+
g_object_remove_toggle_ref
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-deprecated.html b/docs/reference/gobject/html/api-index-deprecated.html new file mode 100644 index 0000000..a3e109f --- /dev/null +++ b/docs/reference/gobject/html/api-index-deprecated.html @@ -0,0 +1,72 @@ + + + + +Index of deprecated symbols + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gobject/html/api-index-full.html b/docs/reference/gobject/html/api-index-full.html new file mode 100644 index 0000000..8ee0124 --- /dev/null +++ b/docs/reference/gobject/html/api-index-full.html @@ -0,0 +1,1351 @@ + + + + +Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Index

+

B

+
GBaseFinalizeFunc
+
+
GBaseInitFunc
+
+
GBoxedCopyFunc
+
+
GBoxedFreeFunc
+
+
g_boxed_copy
+
+
g_boxed_free
+
+
g_boxed_type_register_static
+
+

C

+
G_CALLBACK
+
+
GCallback
+
+
GCClosure
+
+
g_cclosure_marshal_BOOLEAN__FLAGS
+
+
g_cclosure_marshal_BOOL__FLAGS
+
+
g_cclosure_marshal_STRING__OBJECT_POINTER
+
+
g_cclosure_marshal_VOID__BOOLEAN
+
+
g_cclosure_marshal_VOID__BOXED
+
+
g_cclosure_marshal_VOID__CHAR
+
+
g_cclosure_marshal_VOID__DOUBLE
+
+
g_cclosure_marshal_VOID__ENUM
+
+
g_cclosure_marshal_VOID__FLAGS
+
+
g_cclosure_marshal_VOID__FLOAT
+
+
g_cclosure_marshal_VOID__INT
+
+
g_cclosure_marshal_VOID__LONG
+
+
g_cclosure_marshal_VOID__OBJECT
+
+
g_cclosure_marshal_VOID__PARAM
+
+
g_cclosure_marshal_VOID__POINTER
+
+
g_cclosure_marshal_VOID__STRING
+
+
g_cclosure_marshal_VOID__UCHAR
+
+
g_cclosure_marshal_VOID__UINT
+
+
g_cclosure_marshal_VOID__UINT_POINTER
+
+
g_cclosure_marshal_VOID__ULONG
+
+
g_cclosure_marshal_VOID__VOID
+
+
g_cclosure_new
+
+
g_cclosure_new_object
+
+
g_cclosure_new_object_swap
+
+
g_cclosure_new_swap
+
+
G_CCLOSURE_SWAP_DATA
+
+
gchararray
+
+
GClassFinalizeFunc
+
+
GClassInitFunc
+
+
GClosure
+
+
GClosureMarshal
+
+
GClosureNotify
+
+
g_closure_add_finalize_notifier
+
+
g_closure_add_invalidate_notifier
+
+
g_closure_add_marshal_guards
+
+
g_closure_invalidate
+
+
g_closure_invoke
+
+
G_CLOSURE_NEEDS_MARSHAL
+
+
g_closure_new_object
+
+
g_closure_new_simple
+
+
G_CLOSURE_N_NOTIFIERS
+
+
g_closure_ref
+
+
g_closure_remove_finalize_notifier
+
+
g_closure_remove_invalidate_notifier
+
+
g_closure_set_marshal
+
+
g_closure_set_meta_marshal
+
+
g_closure_sink
+
+
g_closure_unref
+
+
GConnectFlags
+
+

D

+
G_DEFINE_ABSTRACT_TYPE
+
+
G_DEFINE_ABSTRACT_TYPE_WITH_CODE
+
+
G_DEFINE_DYNAMIC_TYPE
+
+
G_DEFINE_DYNAMIC_TYPE_EXTENDED
+
+
G_DEFINE_INTERFACE
+
+
G_DEFINE_INTERFACE_WITH_CODE
+
+
G_DEFINE_TYPE
+
+
G_DEFINE_TYPE_EXTENDED
+
+
G_DEFINE_TYPE_WITH_CODE
+
+

E

+
GEnumClass
+
+
GEnumValue
+
+
G_ENUM_CLASS
+
+
G_ENUM_CLASS_TYPE
+
+
G_ENUM_CLASS_TYPE_NAME
+
+
g_enum_complete_type_info
+
+
g_enum_get_value
+
+
g_enum_get_value_by_name
+
+
g_enum_get_value_by_nick
+
+
g_enum_register_static
+
+

F

+
GFlagsClass
+
+
GFlagsValue
+
+
G_FLAGS_CLASS
+
+
G_FLAGS_CLASS_TYPE
+
+
G_FLAGS_CLASS_TYPE_NAME
+
+
g_flags_complete_type_info
+
+
g_flags_get_first_value
+
+
g_flags_get_value_by_name
+
+
g_flags_get_value_by_nick
+
+
g_flags_register_static
+
+

I

+
G_IMPLEMENT_INTERFACE
+
+
G_IMPLEMENT_INTERFACE_DYNAMIC
+
+
GInitiallyUnowned
+
+
GInitiallyUnownedClass
+
+
GInstanceInitFunc
+
+
GInterfaceFinalizeFunc
+
+
GInterfaceInfo
+
+
GInterfaceInitFunc
+
+
G_IS_ENUM_CLASS
+
+
G_IS_FLAGS_CLASS
+
+
G_IS_OBJECT
+
+
G_IS_OBJECT_CLASS
+
+
G_IS_PARAM_SPEC
+
+
G_IS_PARAM_SPEC_BOOLEAN
+
+
G_IS_PARAM_SPEC_BOXED
+
+
G_IS_PARAM_SPEC_CHAR
+
+
G_IS_PARAM_SPEC_CLASS
+
+
G_IS_PARAM_SPEC_DOUBLE
+
+
G_IS_PARAM_SPEC_ENUM
+
+
G_IS_PARAM_SPEC_FLAGS
+
+
G_IS_PARAM_SPEC_FLOAT
+
+
G_IS_PARAM_SPEC_GTYPE
+
+
G_IS_PARAM_SPEC_INT
+
+
G_IS_PARAM_SPEC_INT64
+
+
G_IS_PARAM_SPEC_LONG
+
+
G_IS_PARAM_SPEC_OBJECT
+
+
G_IS_PARAM_SPEC_OVERRIDE
+
+
G_IS_PARAM_SPEC_PARAM
+
+
G_IS_PARAM_SPEC_POINTER
+
+
G_IS_PARAM_SPEC_STRING
+
+
G_IS_PARAM_SPEC_UCHAR
+
+
G_IS_PARAM_SPEC_UINT
+
+
G_IS_PARAM_SPEC_UINT64
+
+
G_IS_PARAM_SPEC_ULONG
+
+
G_IS_PARAM_SPEC_UNICHAR
+
+
G_IS_PARAM_SPEC_VALUE_ARRAY
+
+
G_IS_VALUE
+
+

O

+
GObject
+
+
G_OBJECT
+
+
GObject::notify
+
+
GObjectClass
+
+
GObjectConstructParam
+
+
GObjectFinalizeFunc
+
+
GObjectGetPropertyFunc
+
+
GObjectSetPropertyFunc
+
+
g_object_add_toggle_ref
+
+
g_object_add_weak_pointer
+
+
G_OBJECT_CLASS
+
+
g_object_class_find_property
+
+
g_object_class_install_property
+
+
g_object_class_list_properties
+
+
G_OBJECT_CLASS_NAME
+
+
g_object_class_override_property
+
+
G_OBJECT_CLASS_TYPE
+
+
g_object_connect
+
+
g_object_disconnect
+
+
g_object_force_floating
+
+
g_object_freeze_notify
+
+
g_object_get
+
+
G_OBJECT_GET_CLASS
+
+
g_object_get_data
+
+
g_object_get_property
+
+
g_object_get_qdata
+
+
g_object_get_valist
+
+
g_object_interface_find_property
+
+
g_object_interface_install_property
+
+
g_object_interface_list_properties
+
+
g_object_is_floating
+
+
g_object_new
+
+
g_object_newv
+
+
g_object_new_valist
+
+
g_object_notify
+
+
g_object_ref
+
+
g_object_ref_sink
+
+
g_object_remove_toggle_ref
+
+
g_object_remove_weak_pointer
+
+
g_object_run_dispose
+
+
g_object_set
+
+
g_object_set_data
+
+
g_object_set_data_full
+
+
g_object_set_property
+
+
g_object_set_qdata
+
+
g_object_set_qdata_full
+
+
g_object_set_valist
+
+
g_object_steal_data
+
+
g_object_steal_qdata
+
+
g_object_thaw_notify
+
+
G_OBJECT_TYPE
+
+
G_OBJECT_TYPE_NAME
+
+
g_object_unref
+
+
G_OBJECT_WARN_INVALID_PROPERTY_ID
+
+
g_object_watch_closure
+
+
g_object_weak_ref
+
+
g_object_weak_unref
+
+

P

+
GParameter
+
+
GParamFlags
+
+
GParamSpec
+
+
GParamSpecBoolean
+
+
GParamSpecBoxed
+
+
GParamSpecChar
+
+
GParamSpecClass
+
+
GParamSpecDouble
+
+
GParamSpecEnum
+
+
GParamSpecFlags
+
+
GParamSpecFloat
+
+
GParamSpecGType
+
+
GParamSpecInt
+
+
GParamSpecInt64
+
+
GParamSpecLong
+
+
GParamSpecObject
+
+
GParamSpecOverride
+
+
GParamSpecParam
+
+
GParamSpecPointer
+
+
GParamSpecPool
+
+
GParamSpecString
+
+
GParamSpecTypeInfo
+
+
GParamSpecUChar
+
+
GParamSpecUInt
+
+
GParamSpecUInt64
+
+
GParamSpecULong
+
+
GParamSpecUnichar
+
+
GParamSpecValueArray
+
+
G_PARAM_MASK
+
+
G_PARAM_READWRITE
+
+
G_PARAM_SPEC
+
+
G_PARAM_SPEC_BOOLEAN
+
+
g_param_spec_boolean
+
+
G_PARAM_SPEC_BOXED
+
+
g_param_spec_boxed
+
+
g_param_spec_char
+
+
G_PARAM_SPEC_CHAR
+
+
G_PARAM_SPEC_CLASS
+
+
G_PARAM_SPEC_DOUBLE
+
+
g_param_spec_double
+
+
G_PARAM_SPEC_ENUM
+
+
g_param_spec_enum
+
+
G_PARAM_SPEC_FLAGS
+
+
g_param_spec_flags
+
+
G_PARAM_SPEC_FLOAT
+
+
g_param_spec_float
+
+
g_param_spec_get_blurb
+
+
G_PARAM_SPEC_GET_CLASS
+
+
g_param_spec_get_name
+
+
g_param_spec_get_nick
+
+
g_param_spec_get_qdata
+
+
g_param_spec_get_redirect_target
+
+
g_param_spec_gtype
+
+
G_PARAM_SPEC_GTYPE
+
+
g_param_spec_int
+
+
G_PARAM_SPEC_INT
+
+
g_param_spec_int64
+
+
G_PARAM_SPEC_INT64
+
+
g_param_spec_internal
+
+
G_PARAM_SPEC_LONG
+
+
g_param_spec_long
+
+
G_PARAM_SPEC_OBJECT
+
+
g_param_spec_object
+
+
g_param_spec_override
+
+
G_PARAM_SPEC_OVERRIDE
+
+
G_PARAM_SPEC_PARAM
+
+
g_param_spec_param
+
+
g_param_spec_pointer
+
+
G_PARAM_SPEC_POINTER
+
+
g_param_spec_pool_insert
+
+
g_param_spec_pool_list
+
+
g_param_spec_pool_list_owned
+
+
g_param_spec_pool_lookup
+
+
g_param_spec_pool_new
+
+
g_param_spec_pool_remove
+
+
g_param_spec_ref
+
+
g_param_spec_ref_sink
+
+
g_param_spec_set_qdata
+
+
g_param_spec_set_qdata_full
+
+
g_param_spec_sink
+
+
g_param_spec_steal_qdata
+
+
g_param_spec_string
+
+
G_PARAM_SPEC_STRING
+
+
G_PARAM_SPEC_TYPE
+
+
G_PARAM_SPEC_TYPE_NAME
+
+
g_param_spec_uchar
+
+
G_PARAM_SPEC_UCHAR
+
+
g_param_spec_uint
+
+
G_PARAM_SPEC_UINT
+
+
g_param_spec_uint64
+
+
G_PARAM_SPEC_UINT64
+
+
g_param_spec_ulong
+
+
G_PARAM_SPEC_ULONG
+
+
g_param_spec_unichar
+
+
G_PARAM_SPEC_UNICHAR
+
+
g_param_spec_unref
+
+
g_param_spec_value_array
+
+
G_PARAM_SPEC_VALUE_ARRAY
+
+
G_PARAM_SPEC_VALUE_TYPE
+
+
G_PARAM_STATIC_STRINGS
+
+
g_param_type_register_static
+
+
G_PARAM_USER_SHIFT
+
+
g_param_values_cmp
+
+
g_param_value_convert
+
+
g_param_value_defaults
+
+
g_param_value_set_default
+
+
g_param_value_validate
+
+
g_pointer_type_register_static
+
+

S

+
GSignalAccumulator
+
+
GSignalCMarshaller
+
+
GSignalEmissionHook
+
+
GSignalFlags
+
+
GSignalInvocationHint
+
+
GSignalMatchType
+
+
GSignalQuery
+
+
g_signal_accumulator_true_handled
+
+
g_signal_add_emission_hook
+
+
g_signal_chain_from_overridden
+
+
g_signal_chain_from_overridden_handler
+
+
g_signal_connect
+
+
g_signal_connect_after
+
+
g_signal_connect_closure
+
+
g_signal_connect_closure_by_id
+
+
g_signal_connect_data
+
+
g_signal_connect_object
+
+
g_signal_connect_swapped
+
+
g_signal_emit
+
+
g_signal_emitv
+
+
g_signal_emit_by_name
+
+
g_signal_emit_valist
+
+
G_SIGNAL_FLAGS_MASK
+
+
g_signal_get_invocation_hint
+
+
g_signal_handlers_block_by_func
+
+
g_signal_handlers_block_matched
+
+
g_signal_handlers_disconnect_by_func
+
+
g_signal_handlers_disconnect_matched
+
+
g_signal_handlers_unblock_by_func
+
+
g_signal_handlers_unblock_matched
+
+
g_signal_handler_block
+
+
g_signal_handler_disconnect
+
+
g_signal_handler_find
+
+
g_signal_handler_is_connected
+
+
g_signal_handler_unblock
+
+
g_signal_has_handler_pending
+
+
g_signal_list_ids
+
+
g_signal_lookup
+
+
G_SIGNAL_MATCH_MASK
+
+
g_signal_name
+
+
g_signal_new
+
+
g_signal_newv
+
+
g_signal_new_class_handler
+
+
g_signal_new_valist
+
+
g_signal_override_class_closure
+
+
g_signal_override_class_handler
+
+
g_signal_parse_name
+
+
g_signal_query
+
+
g_signal_remove_emission_hook
+
+
g_signal_stop_emission
+
+
g_signal_stop_emission_by_name
+
+
g_signal_type_cclosure_new
+
+
G_SIGNAL_TYPE_STATIC_SCOPE
+
+
g_source_set_closure
+
+
g_strdup_value_contents
+
+
GStrv
+
+

T

+
GToggleNotify
+
+
GType
+
+
GTypeClass
+
+
GTypeClassCacheFunc
+
+
GTypeCValue
+
+
GTypeDebugFlags
+
+
GTypeFlags
+
+
GTypeFundamentalFlags
+
+
GTypeFundamentalInfo
+
+
GTypeInfo
+
+
GTypeInstance
+
+
GTypeInterface
+
+
GTypeInterfaceCheckFunc
+
+
GTypeModule
+
+
GTypeModuleClass
+
+
GTypePlugin
+
+
GTypePluginClass
+
+
GTypePluginCompleteInterfaceInfo
+
+
GTypePluginCompleteTypeInfo
+
+
GTypePluginUnuse
+
+
GTypePluginUse
+
+
GTypeQuery
+
+
GTypeValueTable
+
+
g_type_add_class_cache_func
+
+
g_type_add_class_private
+
+
g_type_add_interface_check
+
+
g_type_add_interface_dynamic
+
+
g_type_add_interface_static
+
+
G_TYPE_ARRAY
+
+
G_TYPE_BOOLEAN
+
+
G_TYPE_BOXED
+
+
G_TYPE_BYTE_ARRAY
+
+
G_TYPE_CHAR
+
+
G_TYPE_CHECK_CLASS_CAST
+
+
G_TYPE_CHECK_CLASS_TYPE
+
+
G_TYPE_CHECK_INSTANCE
+
+
G_TYPE_CHECK_INSTANCE_CAST
+
+
G_TYPE_CHECK_INSTANCE_TYPE
+
+
G_TYPE_CHECK_VALUE
+
+
G_TYPE_CHECK_VALUE_TYPE
+
+
g_type_children
+
+
g_type_class_add_private
+
+
g_type_class_peek
+
+
g_type_class_peek_parent
+
+
g_type_class_peek_static
+
+
g_type_class_ref
+
+
g_type_class_unref
+
+
g_type_class_unref_uncached
+
+
G_TYPE_CLOSURE
+
+
g_type_create_instance
+
+
G_TYPE_DATE
+
+
g_type_default_interface_peek
+
+
g_type_default_interface_ref
+
+
g_type_default_interface_unref
+
+
g_type_depth
+
+
G_TYPE_DOUBLE
+
+
G_TYPE_ENUM
+
+
G_TYPE_FLAGS
+
+
G_TYPE_FLAG_RESERVED_ID_BIT
+
+
G_TYPE_FLOAT
+
+
g_type_free_instance
+
+
G_TYPE_FROM_CLASS
+
+
G_TYPE_FROM_INSTANCE
+
+
G_TYPE_FROM_INTERFACE
+
+
g_type_from_name
+
+
g_type_fundamental
+
+
G_TYPE_FUNDAMENTAL
+
+
G_TYPE_FUNDAMENTAL_MAX
+
+
g_type_fundamental_next
+
+
g_type_get_plugin
+
+
g_type_get_qdata
+
+
G_TYPE_GSTRING
+
+
G_TYPE_GTYPE
+
+
G_TYPE_HASH_TABLE
+
+
G_TYPE_HAS_VALUE_TABLE
+
+
g_type_init
+
+
G_TYPE_INITIALLY_UNOWNED
+
+
g_type_init_with_debug_flags
+
+
G_TYPE_INSTANCE_GET_CLASS
+
+
G_TYPE_INSTANCE_GET_INTERFACE
+
+
G_TYPE_INSTANCE_GET_PRIVATE
+
+
G_TYPE_INT
+
+
G_TYPE_INT64
+
+
G_TYPE_INTERFACE
+
+
g_type_interfaces
+
+
g_type_interface_add_prerequisite
+
+
g_type_interface_get_plugin
+
+
g_type_interface_peek
+
+
g_type_interface_peek_parent
+
+
g_type_interface_prerequisites
+
+
G_TYPE_INVALID
+
+
G_TYPE_IO_CHANNEL
+
+
G_TYPE_IO_CONDITION
+
+
g_type_is_a
+
+
G_TYPE_IS_ABSTRACT
+
+
G_TYPE_IS_CLASSED
+
+
G_TYPE_IS_DEEP_DERIVABLE
+
+
G_TYPE_IS_DERIVABLE
+
+
G_TYPE_IS_DERIVED
+
+
G_TYPE_IS_ENUM
+
+
G_TYPE_IS_FLAGS
+
+
G_TYPE_IS_FUNDAMENTAL
+
+
G_TYPE_IS_INSTANTIATABLE
+
+
G_TYPE_IS_INTERFACE
+
+
G_TYPE_IS_OBJECT
+
+
G_TYPE_IS_PARAM
+
+
G_TYPE_IS_VALUE
+
+
G_TYPE_IS_VALUE_ABSTRACT
+
+
G_TYPE_IS_VALUE_TYPE
+
+
G_TYPE_LONG
+
+
G_TYPE_MAKE_FUNDAMENTAL
+
+
g_type_module_add_interface
+
+
g_type_module_register_enum
+
+
g_type_module_register_flags
+
+
g_type_module_register_type
+
+
g_type_module_set_name
+
+
g_type_module_unuse
+
+
g_type_module_use
+
+
g_type_name
+
+
g_type_next_base
+
+
G_TYPE_NONE
+
+
G_TYPE_OBJECT
+
+
G_TYPE_PARAM
+
+
G_TYPE_PARAM_BOOLEAN
+
+
G_TYPE_PARAM_BOXED
+
+
G_TYPE_PARAM_CHAR
+
+
G_TYPE_PARAM_DOUBLE
+
+
G_TYPE_PARAM_ENUM
+
+
G_TYPE_PARAM_FLAGS
+
+
G_TYPE_PARAM_FLOAT
+
+
G_TYPE_PARAM_GTYPE
+
+
G_TYPE_PARAM_INT
+
+
G_TYPE_PARAM_INT64
+
+
G_TYPE_PARAM_LONG
+
+
G_TYPE_PARAM_OBJECT
+
+
G_TYPE_PARAM_OVERRIDE
+
+
G_TYPE_PARAM_PARAM
+
+
G_TYPE_PARAM_POINTER
+
+
G_TYPE_PARAM_STRING
+
+
G_TYPE_PARAM_UCHAR
+
+
G_TYPE_PARAM_UINT
+
+
G_TYPE_PARAM_UINT64
+
+
G_TYPE_PARAM_ULONG
+
+
G_TYPE_PARAM_UNICHAR
+
+
G_TYPE_PARAM_VALUE_ARRAY
+
+
g_type_parent
+
+
g_type_plugin_complete_interface_info
+
+
g_type_plugin_complete_type_info
+
+
g_type_plugin_unuse
+
+
g_type_plugin_use
+
+
G_TYPE_POINTER
+
+
G_TYPE_PTR_ARRAY
+
+
g_type_qname
+
+
g_type_query
+
+
G_TYPE_REGEX
+
+
g_type_register_dynamic
+
+
g_type_register_fundamental
+
+
g_type_register_static
+
+
g_type_register_static_simple
+
+
g_type_remove_class_cache_func
+
+
g_type_remove_interface_check
+
+
G_TYPE_RESERVED_BSE_FIRST
+
+
G_TYPE_RESERVED_BSE_LAST
+
+
G_TYPE_RESERVED_GLIB_FIRST
+
+
G_TYPE_RESERVED_GLIB_LAST
+
+
G_TYPE_RESERVED_USER_FIRST
+
+
g_type_set_qdata
+
+
G_TYPE_STRING
+
+
G_TYPE_STRV
+
+
G_TYPE_UCHAR
+
+
G_TYPE_UINT
+
+
G_TYPE_UINT64
+
+
G_TYPE_ULONG
+
+
G_TYPE_VALUE
+
+
G_TYPE_VALUE_ARRAY
+
+
g_type_value_table_peek
+
+
G_TYPE_VARIANT
+
+
G_TYPE_VARIANT_TYPE
+
+

V

+
GValue
+
+
GValueArray
+
+
GValueTransform
+
+
g_value_array_append
+
+
g_value_array_copy
+
+
g_value_array_free
+
+
g_value_array_get_nth
+
+
g_value_array_insert
+
+
g_value_array_new
+
+
g_value_array_prepend
+
+
g_value_array_remove
+
+
g_value_array_sort
+
+
g_value_array_sort_with_data
+
+
G_VALUE_COLLECT
+
+
G_VALUE_COLLECT_FORMAT_MAX_LENGTH
+
+
g_value_copy
+
+
g_value_dup_boxed
+
+
g_value_dup_object
+
+
g_value_dup_param
+
+
g_value_dup_string
+
+
g_value_fits_pointer
+
+
g_value_get_boolean
+
+
g_value_get_boxed
+
+
g_value_get_char
+
+
g_value_get_double
+
+
g_value_get_enum
+
+
g_value_get_flags
+
+
g_value_get_float
+
+
g_value_get_gtype
+
+
g_value_get_int
+
+
g_value_get_int64
+
+
g_value_get_long
+
+
g_value_get_object
+
+
g_value_get_param
+
+
g_value_get_pointer
+
+
g_value_get_string
+
+
g_value_get_uchar
+
+
g_value_get_uint
+
+
g_value_get_uint64
+
+
g_value_get_ulong
+
+
G_VALUE_HOLDS
+
+
G_VALUE_HOLDS_BOOLEAN
+
+
G_VALUE_HOLDS_BOXED
+
+
G_VALUE_HOLDS_CHAR
+
+
G_VALUE_HOLDS_DOUBLE
+
+
G_VALUE_HOLDS_ENUM
+
+
G_VALUE_HOLDS_FLAGS
+
+
G_VALUE_HOLDS_FLOAT
+
+
G_VALUE_HOLDS_GTYPE
+
+
G_VALUE_HOLDS_INT
+
+
G_VALUE_HOLDS_INT64
+
+
G_VALUE_HOLDS_LONG
+
+
G_VALUE_HOLDS_OBJECT
+
+
G_VALUE_HOLDS_PARAM
+
+
G_VALUE_HOLDS_POINTER
+
+
G_VALUE_HOLDS_STRING
+
+
G_VALUE_HOLDS_UCHAR
+
+
G_VALUE_HOLDS_UINT
+
+
G_VALUE_HOLDS_UINT64
+
+
G_VALUE_HOLDS_ULONG
+
+
g_value_init
+
+
G_VALUE_LCOPY
+
+
g_value_peek_pointer
+
+
g_value_register_transform_func
+
+
g_value_reset
+
+
g_value_set_boolean
+
+
g_value_set_boxed
+
+
g_value_set_boxed_take_ownership
+
+
g_value_set_char
+
+
g_value_set_double
+
+
g_value_set_enum
+
+
g_value_set_flags
+
+
g_value_set_float
+
+
g_value_set_gtype
+
+
g_value_set_instance
+
+
g_value_set_int
+
+
g_value_set_int64
+
+
g_value_set_long
+
+
g_value_set_object
+
+
g_value_set_object_take_ownership
+
+
g_value_set_param
+
+
g_value_set_param_take_ownership
+
+
g_value_set_pointer
+
+
g_value_set_static_boxed
+
+
g_value_set_static_string
+
+
g_value_set_string
+
+
g_value_set_string_take_ownership
+
+
g_value_set_uchar
+
+
g_value_set_uint
+
+
g_value_set_uint64
+
+
g_value_set_ulong
+
+
g_value_take_boxed
+
+
g_value_take_object
+
+
g_value_take_param
+
+
g_value_take_string
+
+
g_value_transform
+
+
G_VALUE_TYPE
+
+
g_value_type_compatible
+
+
G_VALUE_TYPE_NAME
+
+
g_value_type_transformable
+
+
g_value_unset
+
+

W

+
GWeakNotify
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/ch01s02.html b/docs/reference/gobject/html/ch01s02.html new file mode 100644 index 0000000..26c290a --- /dev/null +++ b/docs/reference/gobject/html/ch01s02.html @@ -0,0 +1,166 @@ + + + + +Exporting a C API + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Exporting a C API

+

+ C APIs are defined by a set of functions and global variables which are usually exported from a + binary. C functions have an arbitrary number of arguments and one return value. Each function is thus + uniquely identified by the function name and the set of C types which describe the function arguments + and return value. The global variables exported by the API are similarly identified by their name and + their type. +

+

+ A C API is thus merely defined by a set of names to which a set of types are associated. If you know the + function calling convention and the mapping of the C types to the machine types used by the platform you + are on, you can resolve the name of each function to find where the code associated to this function + is located in memory, and then construct a valid argument list for the function. Finally, all you have to + do is trigger a call to the target C function with the argument list. +

+

+ For the sake of discussion, here is a sample C function and the associated 32 bit x86 + assembly code generated by GCC on my Linux box: +

+
+static void function_foo (int foo)
+{}
+
+int main (int argc, char *argv[])
+{
+
+        function_foo (10);
+
+        return 0;
+}
+
+push   $0xa
+call   0x80482f4 <function_foo>
+
+

+ The assembly code shown above is pretty straightforward: the first instruction pushes + the hexadecimal value 0xa (decimal value 10) as a 32-bit integer on the stack and calls + function_foo. As you can see, C function calls are implemented by + gcc by native function calls (this is probably the fastest implementation possible). +

+

+ Now, let's say we want to call the C function function_foo from + a Python program. To do this, the Python interpreter needs to: +

+
    +
  • Find where the function is located. This probably means finding the binary generated by the C compiler + which exports this function.

  • +
  • Load the code of the function in executable memory.

  • +
  • Convert the Python parameters to C-compatible parameters before calling + the function.

  • +
  • Call the function with the right calling convention.

  • +
  • Convert the return values of the C function to Python-compatible + variables to return them to the Python code.

  • +
+

+

+

+ The process described above is pretty complex and there are a lot of ways to make it entirely automatic + and transparent to C and Python programmers: +

+
    +
  • The first solution is to write by hand a lot of glue code, once for each function exported or imported, + which does the Python-to-C parameter conversion and the C-to-Python return value conversion. This glue code is then + linked with the interpreter which allows Python programs to call Python functions which delegate work to + C functions.

  • +
  • Another, nicer solution is to automatically generate the glue code, once for each function exported or + imported, with a special compiler which + reads the original function signature.

  • +
  • The solution used by GLib is to use the GType library which holds at runtime a description of + all the objects manipulated by the programmer. This so-called dynamic type + [1] + library is then used by special generic glue code to automatically convert function parameters and + function calling conventions between different runtime domains.

  • +
+

+ The greatest advantage of the solution implemented by GType is that the glue code sitting at the runtime domain + boundaries is written once: the figure below states this more clearly. +

+
+

Figure 1. 

+
+
+


+ + Currently, there exist at least Python and Perl generic glue code which makes it possible to use + C objects written with GType directly in Python or Perl, with a minimum amount of work: there + is no need to generate huge amounts of glue code either automatically or by hand. +

+

+ Although that goal was arguably laudable, its pursuit has had a major influence on + the whole GType/GObject library. C programmers are likely to be puzzled at the complexity + of the features exposed in the following chapters if they forget that the GType/GObject library + was not only designed to offer OO-like features to C programmers but also transparent + cross-language interoperability. +

+
+

+

[1] + There are numerous different implementations of dynamic type systems: all C++ + compilers have one, Java and .NET have one too. A dynamic type system allows you + to get information about every instantiated object at runtime. It can be implemented + by a process-specific database: every new object created registers the characteristics + of its associated type in the type system. It can also be implemented by introspection + interfaces. The common point between all these different type systems and implementations + is that they all allow you to query for object metadata at runtime. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/ch06s03.html b/docs/reference/gobject/html/ch06s03.html new file mode 100644 index 0000000..f61561c --- /dev/null +++ b/docs/reference/gobject/html/ch06s03.html @@ -0,0 +1,143 @@ + + + + +Interface definition prerequisites + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Interface definition prerequisites

+

+ To specify that an interface requires the presence of other interfaces + when implemented, GObject introduces the concept of + prerequisites: it is possible to associate + a list of prerequisite interfaces to an interface. For example, if + object A wishes to implement interface I1, and if interface I1 has a + prerequisite on interface I2, A has to implement both I1 and I2. +

+

+ The mechanism described above is, in practice, very similar to + Java's interface I1 extends interface I2. The example below shows + the GObject equivalent: +

+
+  /* inside the GType function of the MamanIbar interface */
+  type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbar", &info, 0);
+
+  /* Make the MamanIbar interface require MamanIbaz interface. */
+  g_type_interface_add_prerequisite (type, MAMAN_TYPE_IBAZ);
+
+

+ The code shown above adds the MamanIbaz interface to the list of + prerequisites of MamanIbar while the code below shows how an + implementation can implement both interfaces and register their + implementations: +

+
+static void
+maman_ibar_do_another_action (MamanIbar *ibar)
+{
+  MamanBar *self = MAMAN_BAR (ibar);
+
+  g_print ("Bar implementation of IBar interface Another Action: 0x%x.\n",
+           self->instance_member);
+}
+
+static void
+maman_ibar_interface_init (MamanIbarInterface *iface)
+{
+  iface->do_another_action = maman_ibar_do_another_action;
+}
+
+static void
+maman_ibaz_do_action (MamanIbaz *ibaz)
+{
+  MamanBar *self = MAMAN_BAR (ibaz);
+
+  g_print ("Bar implementation of IBaz interface Action: 0x%x.\n",
+           self->instance_member);
+}
+
+static void
+maman_ibaz_interface_init (MamanIbazInterface *iface)
+{
+  iface->do_action = maman_ibaz_do_action;
+}
+
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+
+}
+
+static void
+maman_bar_init (MamanBar *self)
+{
+  self->instance_member = 0x666;
+}
+
+G_DEFINE_TYPE_WITH_CODE (MamanBar, maman_bar, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ,
+                                                maman_ibaz_interface_init)
+                         G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAR,
+                                                maman_ibar_interface_init));
+
+

+ It is very important to notice that the order in which interface + implementations are added to the main object is not random: + g_type_add_interface_static, + which is called by G_IMPLEMENT_INTERFACE, must be + invoked first on the interfaces which have no prerequisites and then on + the others. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/chapter-gobject.html b/docs/reference/gobject/html/chapter-gobject.html new file mode 100644 index 0000000..ebb23da --- /dev/null +++ b/docs/reference/gobject/html/chapter-gobject.html @@ -0,0 +1,323 @@ + + + + +The GObject base class + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+The GObject base class

+ +

+ The two previous chapters discussed the details of GLib's Dynamic Type System + and its signal control system. The GObject library also contains an implementation + for a base fundamental type named GObject. +

+

+ GObject is a fundamental classed instantiable type. It implements: +

+
    +
  • Memory management with reference counting

  • +
  • Construction/Destruction of instances

  • +
  • Generic per-object properties with set/get function pairs

  • +
  • Easy use of signals

  • +
+

+ All the GNOME libraries which use the GLib type system (like GTK+ and GStreamer) + inherit from GObject which is why it is important to understand + the details of how it works. +

+
+

+Object instantiation

+

+ The g_object_new + family of functions can be used to instantiate any GType which inherits + from the GObject base type. All these functions make sure the class and + instance structures have been correctly initialized by GLib's type system + and then invoke at one point or another the constructor class method + which is used to: +

+
    +
  • + Allocate and clear memory through g_type_create_instance, +

  • +
  • + Initialize the object's instance with the construction properties. +

  • +
+

+ Although one can expect all class and instance members (except the fields + pointing to the parents) to be set to zero, some consider it good practice + to explicitly set them. +

+

+ Objects which inherit from GObject are allowed to override this + constructor class method: they should however chain to their parent + constructor method before doing so: +

+
+  GObject *(* constructor) (GType                  gtype,
+                            guint                  n_properties,
+                            GObjectConstructParam *properties);
+
+

+

+

+ The example below shows how MamanBar overrides the parent's constructor: +

+
+#define MAMAN_TYPE_BAR                  (maman_bar_get_type ())
+#define MAMAN_BAR(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar))
+#define MAMAN_IS_BAR(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR))
+#define MAMAN_BAR_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass))
+#define MAMAN_IS_BAR_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR))
+#define MAMAN_BAR_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass))
+
+typedef struct _MamanBar        MamanBar;
+typedef struct _MamanBarClass   MamanBarClass;
+
+struct _MamanBar
+{
+  GObject parent_instance;
+
+  /* instance members */
+};
+
+struct _MamanBarClass
+{
+  GObjectClass parent_class;
+
+  /* class members */
+};
+
+/* will create maman_bar_get_type and set maman_bar_parent_class */
+G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT);
+
+static GObject *
+maman_bar_constructor (GType                  gtype,
+                       guint                  n_properties,
+                       GObjectConstructParam *properties)
+{
+  GObject *obj;
+
+  {
+    /* Always chain up to the parent constructor */
+    MamanBarClass *klass;
+    GObjectClass *parent_class;  
+    parent_class = G_OBJECT_CLASS (maman_bar_parent_class);
+    obj = parent_class->constructor (gtype, n_properties, properties);
+  }
+  
+  /* update the object state depending on constructor properties */
+
+  return obj;
+}
+
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->constructor = maman_bar_constructor;
+}
+
+static void
+maman_bar_init (MamanBar *self)
+{
+  /* initialize the object */
+}
+
+
+

+ If the user instantiates an object MamanBar with: +

+
+MamanBar *bar = g_object_new (MAMAN_TYPE_BAR, NULL);
+
+

+ If this is the first instantiation of such an object, the + maman_bar_class_init function will be invoked + after any maman_bar_base_class_init function. + This will make sure the class structure of this new object is + correctly initialized. Here, maman_bar_class_init + is expected to override the object's class methods and setup the + class' own methods. In the example above, the constructor method is + the only overridden method: it is set to + maman_bar_constructor. +

+

+ Once g_object_new has obtained a reference to an initialized + class structure, it invokes its constructor method to create an instance of the new + object. Since it has just been overridden by maman_bar_class_init + to maman_bar_constructor, the latter is called and, because it + was implemented correctly, it chains up to its parent's constructor. In + order to find the parent class and chain up to the parent class + constructor, we can use the maman_bar_parent_class + pointer that has been set up for us by the + G_DEFINE_TYPE macro. +

+

+ Finally, at one point or another, g_object_constructor is invoked + by the last constructor in the chain. This function allocates the object's instance' buffer + through g_type_create_instance + which means that the instance_init function is invoked at this point if one + was registered. After instance_init returns, the object is fully initialized and should be + ready to answer any user-request. When g_type_create_instance + returns, g_object_constructor sets the construction properties + (i.e. the properties which were given to g_object_new) and returns + to the user's constructor which is then allowed to do useful instance initialization... +

+

+ The process described above might seem a bit complicated, but it can be + summarized easily by the table below which lists the functions invoked + by g_object_new + and their order of invocation: +

+

+

+
+

Table 4. g_object_new

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parametersRemark
First call to g_object_new for target typetarget type's base_init functionOn the inheritance tree of classes from fundamental type to target type. + base_init is invoked once for each class structure. + I have no real idea on how this can be used. If you have a good real-life + example of how a class' base_init can be used, please, let me know. +
target type's class_init functionOn target type's class structure + Here, you should make sure to initialize or override class methods (that is, + assign to each class' method its function pointer) and create the signals and + the properties associated to your object. +
interface' base_init functionOn interface' vtable 
interface' interface_init functionOn interface' vtable 
Each call to g_object_new for target typetarget type's class constructor method: GObjectClass->constructorOn object's instance + If you need to complete the object initialization after all the construction properties + are set, override the constructor method and make sure to chain up to the object's + parent class before doing your own initialization. + In doubt, do not override the constructor method. +
type's instance_init functionOn the inheritance tree of classes from fundamental type to target type. + the instance_init provided for each type is invoked once for each instance + structure. + Provide an instance_init function to initialize your object before its construction + properties are set. This is the preferred way to initialize a GObject instance. + This function is equivalent to C++ constructors. +
+
+


+

+

+ Readers should feel concerned about one little twist in the order in + which functions are invoked: while, technically, the class' constructor + method is called before the GType's instance_init + function (since g_type_create_instance which calls instance_init is called by + g_object_constructor which is the top-level class + constructor method and to which users are expected to chain to), the + user's code which runs in a user-provided constructor will always + run after GType's instance_init function since the + user-provided constructor must (you've been warned) + chain up before doing anything useful. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/chapter-gtype.html b/docs/reference/gobject/html/chapter-gtype.html new file mode 100644 index 0000000..e5f79b1 --- /dev/null +++ b/docs/reference/gobject/html/chapter-gtype.html @@ -0,0 +1,293 @@ + + + + +The GLib Dynamic Type System + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+The GLib Dynamic Type System

+ +

+ A type, as manipulated by the GLib type system, is much more generic than what + is usually understood as an Object type. It is best explained by looking at the + structure and the functions used to register new types in the type system. +

+
+typedef struct _GTypeInfo               GTypeInfo;
+struct _GTypeInfo
+{
+  /* interface types, classed types, instantiated types */
+  guint16                class_size;
+  
+  GBaseInitFunc          base_init;
+  GBaseFinalizeFunc      base_finalize;
+  
+  /* classed types, instantiated types */
+  GClassInitFunc         class_init;
+  GClassFinalizeFunc     class_finalize;
+  gconstpointer          class_data;
+  
+  /* instantiated types */
+  guint16                instance_size;
+  guint16                n_preallocs;
+  GInstanceInitFunc      instance_init;
+  
+  /* value handling */
+  const GTypeValueTable *value_table;
+};
+GType g_type_register_static (GType             parent_type,
+                              const gchar      *type_name,
+                              const GTypeInfo  *info,
+                              GTypeFlags        flags);
+GType g_type_register_fundamental (GType                       type_id,
+                                   const gchar                *type_name,
+                                   const GTypeInfo            *info,
+                                   const GTypeFundamentalInfo *finfo,
+                                   GTypeFlags                  flags);
+        
+

+

+

+ g_type_register_static and + g_type_register_fundamental + are the C functions, defined in + gtype.h and implemented in gtype.c + which you should use to register a new GType in the program's type system. + It is not likely you will ever need to use + g_type_register_fundamental (you have to be Tim Janik + to do that) but in case you want to, the last chapter explains how to create + new fundamental types. + [2] +

+

+ Fundamental types are top-level types which do not derive from any other type + while other non-fundamental types derive from other types. + Upon initialization by g_type_init, the type system not + only initializes its internal data structures but it also registers a number of core + types: some of these are fundamental types. Others are types derived from these + fundamental types. +

+

+ Fundamental and non-fundamental types are defined by: +

+
    +
  • + class size: the class_size field in GTypeInfo. +

  • +
  • + class initialization functions (C++ constructor): the base_init and + class_init fields in GTypeInfo. +

  • +
  • + class destruction functions (C++ destructor): the base_finalize and + class_finalize fields in GTypeInfo. +

  • +
  • + instance size (C++ parameter to new): the instance_size field in + GTypeInfo. +

  • +
  • + instantiation policy (C++ type of new operator): the n_preallocs + field in GTypeInfo. +

  • +
  • + copy functions (C++ copy operators): the value_table field in + GTypeInfo. +

  • +
  • + type characteristic flags: GTypeFlags. +

  • +
+

+ Fundamental types are also defined by a set of GTypeFundamentalFlags + which are stored in a GTypeFundamentalInfo. + Non-fundamental types are furthermore defined by the type of their parent which is + passed as the parent_type parameter to g_type_register_static + and g_type_register_dynamic. +

+
+

+Copy functions

+

+ The major common point between all GLib types (fundamental and + non-fundamental, classed and non-classed, instantiable and non-instantiable) is that + they can all be manipulated through a single API to copy/assign them. +

+

+ The GValue structure is used as an abstract container for all of these + types. Its simplistic API (defined in gobject/gvalue.h) can be + used to invoke the value_table functions registered + during type registration: for example g_value_copy copies the + content of a GValue to another GValue. This is similar + to a C++ assignment which invokes the C++ copy operator to modify the default + bit-by-bit copy semantics of C++/C structures/classes. +

+

+ The following code shows how you can copy around a 64 bit integer, as well as a GObject + instance pointer (sample code for this is located in the source tarball for this document in + sample/gtype/test.c): +

+
+static void test_int (void)
+{
+  GValue a_value = {0, }; 
+  GValue b_value = {0, };
+  guint64 a, b;
+
+  a = 0xdeadbeaf;
+
+  g_value_init (&a_value, G_TYPE_UINT64);
+  g_value_set_uint64 (&a_value, a);
+
+  g_value_init (&b_value, G_TYPE_UINT64);
+  g_value_copy (&a_value, &b_value);
+
+  b = g_value_get_uint64 (&b_value);
+
+  if (a == b) {
+    g_print ("Yay !! 10 lines of code to copy around a uint64.\n");
+  } else {
+    g_print ("Are you sure this is not a Z80 ?\n");
+  }
+}
+
+static void test_object (void)
+{
+  GObject *obj;
+  GValue obj_vala = {0, };
+  GValue obj_valb = {0, };
+  obj = g_object_new (MAMAN_TYPE_BAR, NULL);
+
+  g_value_init (&obj_vala, MAMAN_TYPE_BAR);
+  g_value_set_object (&obj_vala, obj);
+
+  g_value_init (&obj_valb, G_TYPE_OBJECT);
+
+  /* g_value_copy's semantics for G_TYPE_OBJECT types is to copy the reference.
+     This function thus calls g_object_ref.
+     It is interesting to note that the assignment works here because
+     MAMAN_TYPE_BAR is a G_TYPE_OBJECT.
+   */
+  g_value_copy (&obj_vala, &obj_valb);
+
+  g_object_unref (G_OBJECT (obj));
+  g_object_unref (G_OBJECT (obj));
+}
+
+

+ The important point about the above code is that the exact semantics of the copy calls + is undefined since they depend on the implementation of the copy function. Certain + copy functions might decide to allocate a new chunk of memory and then to copy the + data from the source to the destination. Others might want to simply increment + the reference count of the instance and copy the reference to the new GValue. +

+

+ The value_table used to specify these assignment functions is defined in + gtype.h and is thoroughly described in the + API documentation provided with GObject (for once ;-) which is why we will + not detail its exact semantics. +

+
+typedef struct _GTypeValueTable         GTypeValueTable;
+struct _GTypeValueTable
+{
+  void     (*value_init)         (GValue       *value);
+  void     (*value_free)         (GValue       *value);
+  void     (*value_copy)         (const GValue *src_value,
+                                  GValue       *dest_value);
+  /* varargs functionality (optional) */
+  gpointer (*value_peek_pointer) (const GValue *value);
+  gchar            *collect_format;
+  gchar*   (*collect_value)      (GValue       *value,
+                                  guint         n_collect_values,
+                                  GTypeCValue  *collect_values,
+                                  guint                collect_flags);
+  gchar            *lcopy_format;
+  gchar*   (*lcopy_value)        (const GValue *value,
+                                  guint         n_collect_values,
+                                  GTypeCValue  *collect_values,
+                                  guint                collect_flags);
+};
+          
+

+ Interestingly, it is also very unlikely + you will ever need to specify a value_table during type registration + because these value_tables are inherited from the parent types for + non-fundamental types which means that unless you want to write a + fundamental type (not a great idea!), you will not need to provide + a new value_table since you will inherit the value_table structure + from your parent type. +

+
+
+

+

[2] + Please note that there exists another registration function: the + g_type_register_dynamic. We will not discuss this + function here since its use is very similar to the _static + version. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/chapter-intro.html b/docs/reference/gobject/html/chapter-intro.html new file mode 100644 index 0000000..8637ae5 --- /dev/null +++ b/docs/reference/gobject/html/chapter-intro.html @@ -0,0 +1,122 @@ + + + + +Background + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Background

+ +

+ GObject, and its lower-level type system, GType, are used by GTK+ and most GNOME libraries to + provide: +

+
    +
  • object-oriented C-based APIs and

  • +
  • automatic transparent API bindings to other compiled + or interpreted languages.

  • +
+

+

+

+ A lot of programmers are used to working with compiled-only or dynamically interpreted-only + languages and do not understand the challenges associated with cross-language interoperability. + This introduction tries to provide an insight into these challenges and briefly describes + the solution chosen by GLib. +

+

+ The following chapters go into greater detail into how GType and GObject work and + how you can use them as a C programmer. It is useful to keep in mind that + allowing access to C objects from other interpreted languages was one of the major design + goals: this can often explain the sometimes rather convoluted APIs and features present + in this library. +

+
+

+Data types and programming

+

+ One could say (I have seen such definitions used in some textbooks on programming language theory) + that a programming language is merely a way to create data types and manipulate them. Most languages + provide a number of language-native types and a few primitives to create more complex types based + on these primitive types. +

+

+ In C, the language provides types such as char, long, + pointer. During compilation of C code, the compiler maps these + language types to the compiler's target architecture machine types. If you are using a C interpreter + (I have never seen one myself but it is possible :), the interpreter (the program which interprets + the source code and executes it) maps the language types to the machine types of the target machine at + runtime, during the program execution (or just before execution if it uses a Just In Time compiler engine). +

+

+ Perl and Python are interpreted languages which do not really provide type definitions similar + to those used by C. Perl and Python programmers manipulate variables and the type of the variables + is decided only upon the first assignment or upon the first use which forces a type on the variable. + The interpreter also often provides a lot of automatic conversions from one type to the other. For example, + in Perl, a variable which holds an integer can be automatically converted to a string given the + required context: +

+
+my $tmp = 10;
+print "this is an integer converted to a string:" . $tmp . "\n";
+
+

+ Of course, it is also often possible to explicitly specify conversions when the default conversions provided + by the language are not intuitive. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/chapter-signal.html b/docs/reference/gobject/html/chapter-signal.html new file mode 100644 index 0000000..ab54721 --- /dev/null +++ b/docs/reference/gobject/html/chapter-signal.html @@ -0,0 +1,244 @@ + + + + +The GObject messaging system + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+The GObject messaging system

+ +
+

+Closures

+

+ Closures are central to the concept of asynchronous signal delivery + which is widely used throughout GTK+ and GNOME applications. A closure is an + abstraction, a generic representation of a callback. It is a small structure + which contains three objects: +

+
    +
  • +

    a function pointer (the callback itself) whose prototype looks like: +

    +
    +return_type function_callback (... , gpointer user_data);
    +
    +

    +

    +
  • +
  • + the user_data pointer which is passed to the callback upon invocation of the closure +

  • +
  • + a function pointer which represents the destructor of the closure: whenever the + closure's refcount reaches zero, this function will be called before the closure + structure is freed. +

  • +
+

+

+

+ The GClosure structure represents the common functionality of all + closure implementations: there exists a different Closure implementation for + each separate runtime which wants to use the GObject type system. + [6] + The GObject library provides a simple GCClosure type which + is a specific implementation of closures to be used with C/C++ callbacks. +

+

+ A GClosure provides simple services: +

+
+

+

+
+

+C Closures

+

+ If you are using C or C++ + to connect a callback to a given event, you will either use simple GCClosures + which have a pretty minimal API or the even simpler g_signal_connect + functions (which will be presented a bit later :). +

+
+GClosure *g_cclosure_new             (GCallback      callback_func,
+                                      gpointer       user_data,
+                                      GClosureNotify destroy_data);
+GClosure *g_cclosure_new_swap        (GCallback      callback_func,
+                                      gpointer       user_data,
+                                      GClosureNotify destroy_data);
+GClosure *g_signal_type_cclosure_new (GType          itype,
+                                      guint          struct_offset);
+
+

+

+

+ g_cclosure_new will create a new closure which can invoke the + user-provided callback_func with the user-provided user_data as last parameter. When the closure + is finalized (second stage of the destruction process), it will invoke the destroy_data function + if the user has supplied one. +

+

+ g_cclosure_new_swap will create a new closure which can invoke the + user-provided callback_func with the user-provided user_data as first parameter (instead of being the + last parameter as with g_cclosure_new). When the closure + is finalized (second stage of the destruction process), it will invoke the destroy_data + function if the user has supplied one. +

+
+
+

+Non-C closures (for the fearless)

+

+ As was explained above, closures hide the details of callback invocation. In C, + callback invocation is just like function invocation: it is a matter of creating + the correct stack frame for the called function and executing a call + assembly instruction. +

+

+ C closure marshallers transform the array of GValues which represent + the parameters to the target function into a C-style function parameter list, invoke + the user-supplied C function with this new parameter list, get the return value of the + function, transform it into a GValue and return this GValue to the marshaller caller. +

+

+ The following code implements a simple marshaller in C for a C function which takes an + integer as first parameter and returns void. +

+
+g_cclosure_marshal_VOID__INT (GClosure     *closure,
+                              GValue       *return_value,
+                              guint         n_param_values,
+                              const GValue *param_values,
+                              gpointer      invocation_hint,
+                              gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__INT) (gpointer     data1,
+                                          gint         arg_1,
+                                          gpointer     data2);
+  register GMarshalFunc_VOID__INT callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 2);
+
+  data1 = g_value_peek_pointer (param_values + 0);
+  data2 = closure->data;
+
+  callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_int (param_values + 1),
+            data2);
+}
+
+

+

+

+ Of course, there exist other kinds of marshallers. For example, James Henstridge + wrote a generic Python marshaller which is used by all Python closures (a Python closure + is used to have Python-based callback be invoked by the closure invocation process). + This Python marshaller transforms the input GValue list representing the function + parameters into a Python tuple which is the equivalent structure in Python (you can + look in pyg_closure_marshal in pygtype.c + in the pygobject module in the GNOME source code repository). +

+
+
+
+

+

[6] + In practice, closures sit at the boundary of language runtimes: if you are + writing Python code and one of your Python callbacks receives a signal from + a GTK+ widget, the C code in GTK+ needs to execute your Python + code. The closure invoked by the GTK+ object invokes the Python callback: + it behaves as a normal C object for GTK+ and as a normal Python object for + Python code. +

+

[7] + Closures are reference counted and notify listeners of their destruction in a two-stage + process: the invalidation notifiers are invoked before the finalization notifiers. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/glib-genmarshal.html b/docs/reference/gobject/html/glib-genmarshal.html new file mode 100644 index 0000000..e5e318a --- /dev/null +++ b/docs/reference/gobject/html/glib-genmarshal.html @@ -0,0 +1,385 @@ + + + + +glib-genmarshal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

glib-genmarshal

+

glib-genmarshal — C code marshaller generation utility for GLib closures

+
+
+

Synopsis

+

glib-genmarshal [options...] [files...]

+
+
+

Description

+

glib-genmarshal is a small utility that generates C code +marshallers for callback functions of the GClosure mechanism in the GObject +sublibrary of GLib. The marshaller functions have a standard signature, +they get passed in the invoking closure, an array of value structures holding +the callback function parameters and a value structure for the return value +of the callback. The marshaller is then responsible to call the respective C +code function of the closure with all the parameters on the stack and to +collect its return value. +

+
+
+

Invocation

+

glib-genmarshal takes a list of marshallers to generate as +input. The marshaller list is either read from standard input or from files +passed as additional arguments on the command line. +

+
+

Options

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

--header

+Generate header file contents of the marshallers. +

--body

+Generate C code file contents of the marshallers. +

--prefix=string, --prefix string

+Specify marshaller prefix. The default prefix is `g_cclosure_marshal'. +

--skip-source

+Skip source location remarks in generated comments. +

--nostdinc

+Do not use the standard marshallers of the GObject library, and skip +gmarshal.h include directive in generated header files. +

--g-fatal-warnings

+Make warnings fatal, that is, exit immediately once a warning occurs. +

-h, --help

+Print brief help and exit. +

-v, --version

+Print version and exit. +

+
+
+
+

Marshaller list format

+

+The marshaller lists are processed line by line, a line can contain a +comment in the form of +

+
+# this is a comment
+
+

+or a marshaller specification of the form +

+
+RTYPE:PTYPE
+RTYPE:PTYPE,PTYPE
+RTYPE:PTYPE,PTYPE,PTYPE
+
+

+(up to 16 PTYPEs may be present). +

+

+The RTYPE part specifies the callback's return +type and the PTYPEs right to the colon specify +the callback's parameter list, except for the first and the last arguments +which are always pointers. +

+
+
+
+

Parameter types

+

+Currently, the following types are supported: +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

VOID

+indicates no return type, or no extra parameters. +If VOID is used as the parameter list, no +additional parameters may be present. +

BOOLEAN

+for boolean types (gboolean) +

CHAR

+for signed char types (gchar) +

UCHAR

+for unsigned char types (guchar) +

INT

+for signed integer types (gint) +

UINT

+for unsigned integer types (guint) +

LONG

+for signed long integer types (glong) +

ULONG

+for unsigned long integer types (gulong) +

INT64

+for signed 64bit integer types (gint64) +

UINT64

+for unsigned 64bit integer types (guint64) +

ENUM

+for enumeration types (gint) +

FLAGS

+for flag enumeration types (guint) +

FLOAT

+for single-precision float types (gfloat) +

DOUBLE

+for double-precision float types (gdouble) +

STRING

+for string types (gchar*) +

BOXED

+for boxed (anonymous but reference counted) types (GBoxed*) +

PARAM

+for GParamSpec or derived types (GParamSpec*) +

POINTER

+for anonymous pointer types (gpointer) +

OBJECT

+for GObject or derived types (GObject*) +

NONE

+deprecated alias for VOID +

BOOL

+deprecated alias for BOOLEAN +

+

+

+
+
+
+

Example

+

+To generate marshallers for the following callback functions: +

+
+void   foo (gpointer data1,
+            gpointer data2);
+void   bar (gpointer data1,
+            gint     param1,
+            gpointer data2);
+gfloat baz (gpointer data1,
+            gboolean param1,
+            guchar   param2,
+            gpointer data2);
+
+

+The marshaller list has to look like this: +

+
+VOID:VOID
+VOID:INT
+FLOAT:BOOLEAN,UCHAR
+
+

+The generated marshallers have the arguments encoded in their function name. +For this particular list, they are +

+
+g_cclosure_marshal_VOID__VOID(),
+g_cclosure_marshal_VOID__INT(), 
+g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR().
+
+

+They can be used directly for GClosures or be passed in as the +GSignalCMarshaller c_marshaller; argument upon creation of signals: +

+
+GClosure *cc_foo, *cc_bar, *cc_baz;
+
+cc_foo = g_cclosure_new (NULL, foo, NULL);
+g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID);
+cc_bar = g_cclosure_new (NULL, bar, NULL);
+g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT);
+cc_baz = g_cclosure_new (NULL, baz, NULL);
+g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR);
+
+
+
+

See also

+

+glib-mkenums(1) +

+
+
+

Bugs

+

+None known yet. +

+
+
+

Author

+

glib-genmarshal has been written by Tim Janik +. +

+

+This manual page was provided by Tim Janik . +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/glib-mkenums.html b/docs/reference/gobject/html/glib-mkenums.html new file mode 100644 index 0000000..5e65b35 --- /dev/null +++ b/docs/reference/gobject/html/glib-mkenums.html @@ -0,0 +1,325 @@ + + + + +glib-mkenums + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

glib-mkenums

+

glib-mkenums — C language enum description generation utility

+
+
+

Synopsis

+

glib-mkenums [options...] [files...]

+
+
+

Description

+

glib-mkenums is a small perl-script utility that parses C +code to extract enum definitions and produces enum descriptions based on text +templates specified by the user. Most frequently this script is used to +produce C code that contains enum values as strings so programs can provide +value name strings for introspection. +

+
+
+

Invocation

+

glib-mkenums takes a list of valid C code files as +input. The options specified control the text that is output, certain +substitutions are performed on the text templates for keywords enclosed +in @ characters. +

+
+

Options

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

--fhead text

+Put out text prior to processing input files. +

--fprod text

+Put out text everytime a new input file +is being processed. +

--ftail text

+Put out text after all input files have been +processed. +

--eprod text

+Put out text everytime an enum is encountered +in the input files. +

--vhead text

+Put out text before iterating over the set of +values of an enum. +

--vprod text

+Put out text for every value of an enum. +

--vtail text

+Put out text after iterating over all values +of an enum. +

--comments text

+Template for auto-generated comments, the default (for C code generations) is +"/* @comment@ */". +

--template file

+

+Read templates from the given file. The templates are enclosed in +specially-formatted C comments +

+
+/*** BEGIN section ***/
+/*** END section ***/
+
+

+where section may be file-header, +file-production, file-tail, +enumeration-production, value-header, +value-production, value-tail or +comment. +

+

--help

+Print brief help and exit. +

--version

+Print version and exit. +

+
+
+
+

Production text substitutions

+

+Certain keywords enclosed in @ characters will be substituted in the +emitted text. For the substitution examples of the keywords below, +the following example enum definition is assumed: +

+
+typedef enum
+{
+  PREFIX_THE_XVALUE    = 1 << 3,
+  PREFIX_ANOTHER_VALUE = 1 << 4
+} PrefixTheXEnum;
+
+

+

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

@EnumName@

+The name of the enum currently being processed, enum names are assumed to be +properly namespaced and to use mixed capitalization to separate +words (e.g. PrefixTheXEnum). +

@enum_name@

+The enum name with words lowercase and word-separated by underscores +(e.g. prefix_the_xenum). +

@ENUMNAME@

+The enum name with words uppercase and word-separated by underscores +(e.g. PREFIX_THE_XENUM). +

@ENUMSHORT@

+The enum name with words uppercase and word-separated by underscores, +prefix stripped (e.g. THE_XENUM). +

@VALUENAME@

+The enum value name currently being processed with words uppercase and +word-separated by underscores, +this is the assumed literal notation of enum values in the C sources +(e.g. PREFIX_THE_XVALUE). +

@valuenick@

+A nick name for the enum value currently being processed, this is usually +generated by stripping common prefix words of all the enum values of the +current enum, the words are lowercase and underscores are substituted by a +minus (e.g. the-xvalue). +

@type@

+This is substituted either by "enum" or "flags", depending on whether the +enum value definitions contained bit-shift operators or not (e.g. flags). +

@Type@

+The same as @type@ with the first letter capitalized (e.g. Flags). +

@TYPE@

+The same as @type@ with all letters uppercased (e.g. FLAGS). +

@filename@

+The name of the input file currently being processed (e.g. foo.h). +

@basename@

+The base name of the input file currently being processed (e.g. foo.h). (Since: 2.22) +

+

+

+
+
+
+

Trigraph extensions

+

+Some C comments are treated specially in the parsed enum definitions, +such comments start out with the trigraph sequence /*< +and end with the trigraph sequence >*/. +Per enum definition, the options "skip" and "flags" can be specified, to +indicate this enum definition to be skipped, or for it to be treated as +a flags definition, or to specify the common prefix to be stripped from +all values to generate value nicknames, respectively. The "lowercase_name" +option can be used to specify the word separation used in the *_get_type() +function. For instance, /*< lowercase_name=gnome_vfs_uri_hide_options >*/. +

+

+Per value definition, the options "skip" and "nick" are supported. +The former causes the value to be skipped, and the latter can be used to +specify the otherwise auto-generated nickname. +Examples: +

+
+typedef enum /*< skip >*/
+{
+  PREFIX_FOO
+} PrefixThisEnumWillBeSkipped;
+typedef enum /*< flags,prefix=PREFIX >*/
+{
+  PREFIX_THE_ZEROTH_VALUE,	/*< skip >*/
+  PREFIX_THE_FIRST_VALUE,
+  PREFIX_THE_SECOND_VALUE,
+  PREFIX_THE_THIRD_VALUE,	/*< nick=the-last-value >*/
+} PrefixTheFlagsEnum;
+
+

+

+
+
+
+

See also

+

glib-genmarshal(1) +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/glue.png b/docs/reference/gobject/html/glue.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f3aab2fa34fa43b3d08fc5ac1829aa9f5e5bd3 GIT binary patch literal 12722 zcmd6O2T)Y~vgaTOBUwZN5fDW|lE@%AIiezxMY05eL6Dpz=O7tW!VpCSL_~7V20$3H zlA{QS3`ug{9`D_%`|f*hw`#YxYPn8k1R24p#jzFA8+?Bhb z;hM5I=AnJ+X}!$Ka$sPL-HC+O>vXbJ_ho5o=}Y~~Eo;)ahbeiI~ z-kr?#dc2UO`$hU&UrD~6?V_8mUfCeuxcmJTb)u8Gv`ZBvAEhdG4z7*tt6!ic5yY-| zA2gv9>rp$3vl8hl&#|5%uPu^j(a4?Mg#sEjX?<1I^Kl9dM~5DQ<+tSIT1|^X*t}iW zW;;Bk(--aVXWUbBpFMl#>+AdSC4KU5=fOMKR*q~#Z0q9pXX~O~TU3{ntbJiH#C3E; zhJ`8IyB8iAd7Y8cDx|IW_wV1~3|9>*?QZZVq)WOv^uD=kb;s1UdjU73TkuI*(EQ0> z>*1>bY>i4mrp0d6T-vGdFJ#o`1Q;oW61jMI;6!l>SyWV1RxOXAW`ON9l8{Ic) zay7UKUvYSN_{*6%JSqxPF<{I_6}I7J>eIbI`ej{wJcxqf+_`hN=f$Lt_SZgtmV5g2 zDGg0@PMZ6>j0|Hr%^Ih9b&UV(wSsO$Xt_3PN* z=;+|%<;AyOZNL{~#d-9os?mS3DPXSilEYs@6%uYr@Dt&tnCm!2pDvBwyISY8GI=9T z;endk)cpKT`q57M#p2n_JJEut;B*&@(S@A(f5Y0^n$2^i>D`08-6t6QEhDp5%0_aJ zHp)!xs*>X3agXJ?H*Yw?UUSghb#ZY)qy07Wu3LZ7zx``zN!fdkv_(`&O+#5(+0(PO zqGGEvRpJDDm*g5HyXo(5x#FqH9CS>{*2AS=2L`sfd=A$ruGZ3?K7HM0wDSFXUi35d zT>a9=YVz{(s;b=|9@gBp^=Qiewc%c-o8R*o$?mh;mmX2${r%m8<=V9ns`P0h@{ zw6yGPZ`ZCiGY8UUsaL`3VHJhF_qWa3ld|>n^iI*y@jt9yM~n!%7xWGaxfkT9atXQMA!%N4s`LtZ?XJ&%`=*hU z?cwfTTU%>sY58lyCGF{iS3>r@#M31KFU-!L8K0eY!&2RR<($2C!^1y&6G!8Ny|p4y ztS%lbf&rIem~NkeziwAJNQjATh)GL`i5Z(I^E}Rhcn&t55A-;NrbU7dVa&5 zLeC#=rt!9&2rA;y%y_MvBL*|OHQ}Su2RCof;O&J*qqViQeHM2-y)7)RuycrrJnfFt zlYVaP?!GIrTzj+6$;`}5QBl#vBr}M@UrMLeb+v`fCnX`F!fpyZjXQMjsdZa(!4JY> zY`A-AYWBn7`_r?DzBojAKql6ho@Z-+XKliLA^&@xR!vpaaWb-siV8x3@?F4J*o-AT ze@@51Ao8n7#G?1j%8K1Ax&MvDk&0!g9)5m)C76!3&Q5Ad%5%dQ--n4Pb81v;KyorO z%G}qW^y#ue5Sl%qea68}NvUJJ&Lf}sedP{I79INa>(`~ai--<& zb@jwOw4iO>#fulQn}%K+-(?P0X-rC<41AE^7R8oxaM3ZWu{{0?Y7!+vW;IcNKv*#)B{PYb8>Sdcnv{pj#_#V|WPfaNUa6lx zed4Pva7>>rlz}5dkHzaj=xb(eFVnquPl!At(L9fmWRz%yB^r%MO0twVsF%TFu~s1~ z%<%4mg9EL6-RpMuW}|8^UAh$i-escRi%0W4l9G}hNdl`_NP(Rq8oYs#oguCHI9eND z-!YK>~~{3yD(u;4L^!}cIq5w}BA%}7(`ND+uhIt?2@4*WM} z{&}$H^y72ruV0U$4*B>T@#&RAA;d_VnPe^>^SvH<8`Ij+K}Amf{HtkSwo=K;BYwuq z8a5J6a9*Wk;e+L)!vfv>dZ+nbcqp-{sU0q=h{occR!T^vtMGsZ41FFxd{~F+NP?A) zzDUPSNf|dny*OAjJ=qix8X8J}D=0AV=g*((5EeJFk)z>Ll|=ZF$EKt~=%Pno!U_uo z(5*kdgs);p#8>hJBs5f21srD;ryHO1URf479af z7l+GwqUjOu&DRA#B^Y{RV`94d`bvC`4r8O4ag(SDmaypPuC6Yh^`1MBD);(I6|(-U zuj31f?0*_yx*ry4D$^%YzGUc`t$W#qSd&dJ?mE!O{3HUnq-kZmSy6p zozELnQc?i?Kyc87%3ZL3`gH5hpXc%%X=!QF($erx+;OBNB$SS8M55$aB5YHeY879W zdM>6jWoJ5ChMdHoOj^ zi6IrE3;(jZx{5pb15hl)kH3M(^U{TWhCAnVadLuXxDflSYmS2C*z{FiGK>JDyNAd1 zvysX<3-E#Y`JTr@%_7iu7vTmWECID>R+RmX@^Z}w4*(j%)oE}m4U|LPiA;F*b#!#V zo`vY^Lve6$oIfwi9jBZk+A}h;*JL1qNWNZ-%_u4=%FZUm5|IYCS?97yxRh2@oI>MT z_yq=fdmXlx#=`!_AL#Y(xP#DY1_t9JBke-3xY}A;%s&R6SXx?w+j5-ijFabpZZ=+dl z!*VOEKED=soU^kteBuFj-1Y0%o72P8=`SU;b1J9EBX@p;Urk9(4G0JzCMGr$9BQ?p z_x;X@`UHiZ)LQZlj+TKT1Se3;Y$l>wMRuca9bkqM(wJHq-3pxsmTJ{2PcyI1Wl>j0 zN5{g#0$$zR+>DJgR=qcWPi@U?B7{iGHZ5tb(Jb6+* z_gmY@F(a`xoZWOYl_}{((_porHmMj$;0Jk{EHd7sP8b!HEJNADgTIR6Q z{<2aZ6q8%GZdKS$)O&0#smL6xH<7Ukq-&5IYq}UMNyo~{%FLXcn8?V+)-^q49%*Eq zm6a8Kh7XNllxn36K+n`SbV=`7eF-~lS+-jreOpcrI)k>@n`=N*piDrf_hF&00FqTA2`Isb_R<~9I8C!(8ad!lprV=_)QOiWNLlTuY#sp_GADEgZ=i3aX?c{ zeEepI$V4GCr}hM)INDBhy3ij9U%;|oxiY`KI^9Yc&sc)>L&Zt(@GSfT8I%p9%1cXM z0=s2kNQjSz%uba4IXPKq-o;Acqu-N`!{JKIyP|rXGd3ezrj@XQ01&R=8ibT4s-5!y z_l~{wJv~xkdk2GP9{fs~k~`mkY%G6Zf$)^@Y&4fq zD91M!&P{WL3D&h9Z$4{ET6tBXlT!cPsMXY}>xsX?EMf!Yqt12pk%57Mqa$j>o(PeQ zLw$lX0)Qs3bSE;nefze&{Ij5&>l^0ty;;y8OapG52>LiwV&1Sbo1D!cb#`WUmh|}X zucpNoec5p@Us7@kBU}-9OmM2i(+eoy({^PJKD+Zd@VGn=3+qv$?(1Brp0P2h{g}44 zHUsaSnSzExsPXO{N!NY$r`bXplo5<{rlgD%qB>RSZnI42)=xAt@B8KzC+L%@$rE3^ zIK{@c3>OU8Qgzc=Bp!08yROOa^jBKt35GIYwFCy7wyn%V) zd=IxCj(A<64?E4H85k6F5`E^XLB!L3gk~@fVM4;mvlV;s4w794;2&c7z4L#-qeF$p zHvuxjJwUY^E_(uetV639cAu{=0wZq>XbDQnRz>-qf{MyS*%OAo?TrD$uGUt@jE>`o z@bjofM&k;txB2>2&uQsSpU(Pjd4fGhCEa^#?CF&-aw@9)4&HGh*DY3s%kE09rNvnx}dKrBg-@i_$4|9f_}*+sPRK`W&T zDb~+!eZ=9ur*s4CQrhRq$r7?9fSE8xwUE3@sp8*VkKAUJ|3tu50bsjX0JLZK{rmTD zNOk4;{{H^G1pZVpM^du6XHbh|JhxY#U%K~3eg3^pNpVRDP~1Uka#3PzlL0%5R^sg_ z;Ayy<(C~1SR4)$7%4?S|UltYJ-kD36asK`C z+NWcq41xi5Xv}s+O3Jz6S^G=M?K<_h^oKT2PP`^sdcaGIob5~<86FnLzqMwl*&91_ zXVE&3q8z5g`mLo`7K9); ze;&mub@tpjs~OQIQg+nfHPhfjyKDzG2^Tzms6^BCb#QR-a{b;1XvqkiZytm%qP1^zGr{ z;n%M(%sOXtDexzR1P243{-9g-4s;XXSlQwC>C0Rehw*r;J9qB52qUa01p~ZfF^qJb z8a7q>oo$Q0fMcK`_4f7x>Yx7cL;e2!`}+Exn|PhRX#k#(Y2$101>@2@-Y3pz@i7-4L9uO_M6Bndz&cODEYeTyI2<418 zfzIiBpryq_9|mV{Zf*v!RP%Hh^fE}U>q0_|HRss@$?a}$3)nV;EHMXN9zYcQa%ze_ zPC-gi5(+7-=g?3&JABmA#zr&mJ9iwYWf=e?p;MKYm%|Uaxw-G&h0zvcI?ncWJauxS z1k`{;uB@(N#hrgcBRJUK2chASiOCjz2=(}5WJH9Mlhe1yLV+=#KYuo9i2}Y8@mu(q zHWJ$ee|A-?*htd5XvhhXbj{>;dI+d5H*emAF7D-3r;w%2MGs0Pd@rN|v{ul}vX}WI z0jC1S9w~rE4*|ec?!rkF|L2{xx#P$D0E5e(r~N00MDywVg66i-uZPaC6MaI=Xx&QL zTo}uA`!x3!@)Q!pW5vrasJgS^#sIkH<^sNgzhQ@fbXul6*59A4nTMUek)aBU=LA^L z#f1(Xbx!OfWsal*p!I)1WvHHjKHwFQH-IDx3P(rBH4s+d{ZF5=iP)s93Z?Ck`NQ&* zmX_wEd%Kem-&0cZS}YrY9w6zzKvF1eN@^N>GO(@V7y**X^EP$tv%vUdliC3fa&0wsK-7xkrzFq=-2VMt%J7%7GYRrw$5Kx%J3k)FV5b zvz^r)W33g-V+cFC=$21fGbX1#s1pAdWdC27zdkU##=9T}NxA*u7*V6N0U3aaiHUF` zf~X@p|CKWx$~|ZfR%C+6+2%}&GrUF;w0nMSQl@7kgEuBrdxe14VUuTJ{jXK@e19wi z8wUc{;SXzPP$0rcDV`d2c-jnoo_1x&lQo)?o*ekfj%U3#?-}wSbVm2kkPh#eaJdV! zXT0$?ya-Nh85BLF>(8I>4eEwPTZB=>x70Q^HZs@FMyS0Vz1cl7QUkyT0LQ@;jSpkw zMxMqyKog)>&HfEQ(!0CvaSFGPLqNp#mK!E|dYVQHD*lE4MHrY$UdCpAGZLUh|J6iG zI0QI3IYs`)EPo)-7{Ekyp@CH_1+XI&vWSR?K8<=JqR<#wOrfBL&AnWWcUY7;0PE;u zev^LDDp~3}kgCh$bx^RO&O)_?^0vFX3l|1uRyq>Ecx_!BcH~?5mmk~PuCqvc*q#vf z_Qp0&SO1;$?bx(^T<)eMz4<>=^B?JWHnMp;n2?}gGh}Aogk}H!8_E$xe}6w9eDE_g z2ru)){qJ?wW|M8JtEzVX1_-f)no2?H|>OMcB|G7V=+_U07!ca=<&ClKpE+N)O!GWcx-7+)%wK?{Lf z1Ld{Yto^4$m3r=bkPX~7-oX#KxfvEo7K&;w_4(69?JuzZ48K}$=i&l&7Sz#~UrjI8 zs39~>a0HajRJs}?cvD~hoZzQco0nsbFdzbr6tF1peL*ZPZQSIKt0Yk9I0aA&Pq3rR zJB7L~LV@Dr;{yd18UQHmz>tL5f7UG5OE~|g?*lmlx~EE_06Q-)uaJ-syk59~=8n^K z(?jr@r!hgz^urki;so9SE$tm2uebdEZn`Bpxf4G>FJ?C>3sm&(-LJ51xw*L$cf7s5 zq3r+xB`}g|T_dCOYmxnobIXJ{0{4e$PL+P6nc4QeepT_?w{M|Z0k){E)z47%++S@0 zN~*~0Co2H%Kw)7a{5~-;v9(n`MSz(3nk=RgAhf-Gkp*UDV}pu<;wDBQ1h)cPV9y!E z)rg3QA3q+gg(#;<4vmhUV`9RBXbrp#;`HfDXTtN@IC55Z_Tk$gKph_yeUUv65(do6H6?jRjt!H5||N2%q^l*Z6q*}GS zT+$`2SM(?dgv8}cV9EffG^s5jUU6}Y6Jpp2qoXqfoC}cm1Hc_1VIS;mp&Cp=pFJbc zT2oU~D2*?#+)s3LKxC3({rFlbvqkS$8TuS-fZJ1^xm|HHguweAC-U4?R+e_bC+hRF z#m3YWMz4+b%@}bPxM!SC+}^C>STrR+ve}na;L0_st=5*wy))5wJ@@xCJf@yA29nHjS95D1bWi#G4Fe z|4@owexN9`m1MOA!bf1MhglZ8Kq{f<;%^^+KUnW2AxJFHtV}rZ<-j-D*~PudaD6~F zx>6+)5)z(*sk5|XQ)eLK_Q%xZ$W;KuSCV)W-Z%C# zw_E?EhIw66GNmHDLo#>l zedvqys^z>crd;WOSwJMy%;V7Yrc>QWjXXsx>xB#bKZVc~&<6IdA`mC<5@rGPtNwfr zJ#`SNb=>HLDQPB%d*>uw1+HC-ef<_tJHRP|&}oh966A_&yA^&05Gu*>k@A3Jow67Kt$$JTN6M|4opS$6YiG;CXvUGK zmGUz+_ZB>(`|9dYaTKG49HC&fcXiQFQYzlNH&S9wL)kPv1c+2a4~nH3Rr zNB{3BqgdGMM7>ApVvfPP-(TGWk4OuJ!GX>R7`d=;1=>g^+q`TH(;*)xXGpo5erTUV zyzNP?a<9)7k9|E(Q;_(Bi~^0BTEcSV%aV6RgF(yb%mk)vApSs@ra`rSPWwpzLHdbo zl3t<3rKRzqp|3d5KYuSR)i1XNp{G`+o{NNoOrPeoa|6Nf7uI_U-WTJUZOIU5_>DD|@&eWmD(w@@(o_@Ip20NDU= zefREN1%)=R5zb4OSft#AL`4VN?ER_Gn8H#2;}pXqBMJNuhr7FJ>FA!Prh0+@C2gHp zLJ30&d7Al;X7SJxK+J0N&QgS_v5VW6`@Rx$8&fQry80B%=T4{ukeiaT>(xNt#K z)O8a-1jU`5oxQ242|8mon<}&@i(QlZ;86gtfo#?Bc+nWlj7&rpuv(#Y&%yw*7+D}VLNfA(H zZLOrFa z5!`Av?yZ2ywH>JZ5RiMn)?zgCtRFvq3l;aT!$ThQ8qg730IV9IoBaHa^|7qjzsAke zy*PM`5Xs5O06N3J1jfLK1vn{Cc>QG0)05x2a5BBiJljn&4IBj7^RKwVTBfmwy#d)4 zp9)HK`PKryjgK1u@#~uh)xqO$z!KDeQt9q44tp5FJ4-VUYz-{&pZYESm+~9{7{7ma z2B8>|1)81b@7$a-{QAG9rcTn+fA(|~O&QQRPb+up)JUs0eP2rIVLwk){Mz%=}6TbjBx7p4`9xLLm#Rr2E`)z>>kn%FkEI*F?1hpfd~Y#Y1(3S9rtR9Qca_YBV)91&2#Z(l(=_(-x9z zG$d73RRB2&54wXP%sCycyWDO)KoBIA;e6Wp*^ZSNf}$9u0qJ_RCf zL14vwAUOBUgH8b?1suJF4d`@kY}WftY$fNHwP3odYfeH`6d8nu6{kf)e}M=@v#-sL z2``S5B>NL*8YGW^&WuYvElk2!TqVOQ}*G@rzufoC)o09{6kJ znFvPErJ8v)Y^Y<}XTa~mNRT560gIZPsplj6UvqI*_P}h5@=w0k$m%*bjoJJ*G6r<~ zMW9_m?v{Tlv;Yzeo)QN~;G!&^3}(o*mtkBk;E@+$T(0`YwYsRe$w|AlS*7xTB8%h4 zkBg^Lx6C2Y1P*Y?6eW1+aXY3t7c6u5bpIsz{!?Nce*0>xeC4KD>eSW># zkI7>!@WiRXFrvN3M&*Tn=hhk{>Y|*UJ_Tt`F-a&F>)Y$6~2;$DD(h=57KMIj}_Du-Kt{oMMkaSxfJeQ+;~BqTSX__2sNa0m)Mr~Ly& zrjR9y1zmtLe*&X;ttt77gcF!|)()JU^#djEXgm7INIII6gQIZE%s1c8(eYv+2`Q;J zK=b!Yf*zRR1-etGbjGHHn@BxaHr3dKD+!nUkc}`$sKnni@K`9}sv(%fnziwPDTLku1t<%zflJQ4J3JzZUKm?i>p;o;^6(gaj?7>$IQTvW^h<56EhjsVk~ z#`y+C1$bnyOH1kN=n;+2U<(^viM(9`^8=vjLVC&^%&TOlJAwZJV}shEzmE==k64Ya zjEtT^Ae3ciW+TAi+n!7JIV?EZEdXM_c^9BU#(p6W!=_vCkP$N~jQoywbSQJ5X%{<#8X}s)-mXXmb+4HWj3860W8kPelgeG_8 zN@!y096TuRsUU{tXmANvp~+oVNqeu#6i~s4^x}wxWo+2JQ`NXZEzlcZ4gW{0yoLFh6{KZ7k3>H6?lr!5^RTxzx*+S{JwRe z2So5a$pVF}BzV)|!5(PyE}-XFkCZ=qhRoNLNU<(TxfDz6dmT(9Sm+X#AgR}W7h$&Y zvSOmZV^lyBEi*Guth}zC9##yR641KUA75|{P;&!gfPW_?olVMy)^&m%wEXz1do>dW z$~k@5PUCDtx0%!ER$vgfE%kQaPdFvrKmuE?;BY|b$s%FsDil)XknhSBCS^KdMoOST z#(*~zFH?ZrytSpGqQaITf7J02xfgDl$c#K_aFFzB&{$yR=-i>Dk`fFRtZSSN zk8QLqT#q6OR^*Ngle;h-@(?@`mGp;06G1~DkSYccNmofX7H2!cFa}WZChH8oL!8v( zpNMi_+G4jg3@2v}P@~?419|tEwm2AU0RaO%C@Km?u52!jz?2<1B_$;ll^5IqZ|LXB z%6WIioQ`xBUca@`l#?thkda<9ZKwONP;%D`E=97_B9ZJc)=;;tH{rR~@k-@diWyU> znM`fDogS~qek;*?69A9x@q8ZOb^yqihqFUB}bif2^Iwa6E zA%i+4mJ>hR$xsEdHQ$$$Eb|4@>1eZ}0gCBSwZn{pfU%vB! zFh?NJx3{%y&dsINM;c%ZdIzl66{S8PS>_+g@XMoxJy1%3Z^JkxHvGHoSoN3ED?B_f z`##~l$JeKruentr+^%<)G8nR{;b76$oxs&au3y)o3$u^2r-?Nvv86o2#DUfFVHJq@=dFHJFKOcrw60yVwvE zOFVe2ugzM35uo#9{5as!`<|YjFslNSLG!0AahY5BqwaOyP?u?>*1LhKfM~4G?*qPH zVhHFdERgqS&cKjp1#mf{evDf?EQ?CI^jKfteg1@oy``FXxktL&41BsAXTndNI)$}8 zyX)anNU|gf|8qs-CDE>b9c=p#Q*Qq_IHHkj^tY)N9A^Lr1#$P5vfKx>k^lbyQ>%u? literal 0 HcmV?d00001 diff --git a/docs/reference/gobject/html/gobject-Boxed-Types.html b/docs/reference/gobject/html/gobject-Boxed-Types.html new file mode 100644 index 0000000..678ab38 --- /dev/null +++ b/docs/reference/gobject/html/gobject-Boxed-Types.html @@ -0,0 +1,393 @@ + + + + +Boxed Types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Boxed Types

+

Boxed Types — A mechanism to wrap opaque C structures registered + by the type system

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+gpointer            (*GBoxedCopyFunc)                   (gpointer boxed);
+void                (*GBoxedFreeFunc)                   (gpointer boxed);
+gpointer            g_boxed_copy                        (GType boxed_type,
+                                                         gconstpointer src_boxed);
+void                g_boxed_free                        (GType boxed_type,
+                                                         gpointer boxed);
+GType               g_boxed_type_register_static        (const gchar *name,
+                                                         GBoxedCopyFunc boxed_copy,
+                                                         GBoxedFreeFunc boxed_free);
+GType               g_pointer_type_register_static      (const gchar *name);
+
+#define             G_TYPE_HASH_TABLE
+#define             G_TYPE_DATE
+#define             G_TYPE_GSTRING
+#define             G_TYPE_STRV
+#define             G_TYPE_REGEX
+#define             G_TYPE_ARRAY
+#define             G_TYPE_BYTE_ARRAY
+#define             G_TYPE_PTR_ARRAY
+#define             G_TYPE_VARIANT
+#define             G_TYPE_VARIANT_TYPE
+typedef             GStrv;
+
+
+
+

Description

+

+GBoxed is a generic wrapper mechanism for arbitrary C structures. The only +thing the type system needs to know about the structures is how to copy and +free them, beyond that they are treated as opaque chunks of memory. +

+

+Boxed types are useful for simple value-holder structures like rectangles or +points. They can also be used for wrapping structures defined in non-GObject +based libraries.

+
+
+

Details

+
+

GBoxedCopyFunc ()

+
gpointer            (*GBoxedCopyFunc)                   (gpointer boxed);
+

+This function is provided by the user and should produce a copy of the passed +in boxed structure.

+
++ + + + + + + + + + +

boxed :

The boxed structure to be copied. +

Returns :

The newly created copy of the boxed structure. +
+
+
+
+

GBoxedFreeFunc ()

+
void                (*GBoxedFreeFunc)                   (gpointer boxed);
+

+This function is provided by the user and should free the boxed +structure passed.

+
++ + + + +

boxed :

The boxed structure to be freed. +
+
+
+
+

g_boxed_copy ()

+
gpointer            g_boxed_copy                        (GType boxed_type,
+                                                         gconstpointer src_boxed);
+

+Provide a copy of a boxed structure src_boxed which is of type boxed_type.

+
++ + + + + + + + + + + + + + +

boxed_type :

The type of src_boxed. +

src_boxed :

The boxed structure to be copied. +

Returns :

The newly created copy of the boxed structure. +
+
+
+
+

g_boxed_free ()

+
void                g_boxed_free                        (GType boxed_type,
+                                                         gpointer boxed);
+

+Free the boxed structure boxed which is of type boxed_type.

+
++ + + + + + + + + + +

boxed_type :

The type of boxed. +

boxed :

The boxed structure to be freed. +
+
+
+
+

g_boxed_type_register_static ()

+
GType               g_boxed_type_register_static        (const gchar *name,
+                                                         GBoxedCopyFunc boxed_copy,
+                                                         GBoxedFreeFunc boxed_free);
+

+This function creates a new G_TYPE_BOXED derived type id for a new +boxed type with name name. Boxed type handling functions have to be +provided to copy and free opaque boxed structures of this type.

+
++ + + + + + + + + + + + + + + + + + +

name :

Name of the new boxed type. +

boxed_copy :

Boxed structure copy function. +

boxed_free :

Boxed structure free function. +

Returns :

New G_TYPE_BOXED derived type id for name. +
+
+
+
+

g_pointer_type_register_static ()

+
GType               g_pointer_type_register_static      (const gchar *name);
+

+Creates a new G_TYPE_POINTER derived type id for a new +pointer type with name name.

+
++ + + + + + + + + + +

name :

the name of the new pointer type. +

Returns :

a new G_TYPE_POINTER derived type id for name. +
+
+
+
+

G_TYPE_HASH_TABLE

+
#define G_TYPE_HASH_TABLE (g_hash_table_get_type ())
+
+

+The GType for a boxed type holding a GHashTable reference.

+

Since 2.10

+
+
+
+

G_TYPE_DATE

+
#define G_TYPE_DATE	        (g_date_get_type ())
+
+

+The GType for GDate.

+
+
+
+

G_TYPE_GSTRING

+
#define G_TYPE_GSTRING		(g_gstring_get_type ())
+
+

+The GType for GString.

+
+
+
+

G_TYPE_STRV

+
#define G_TYPE_STRV	        (g_strv_get_type ())
+
+

+The GType for a boxed type holding a NULL-terminated array of strings. +

+

+The code fragments in the following example show the use of a property of +type G_TYPE_STRV with g_object_class_install_property(), g_object_set() +and g_object_get(). +

+

+

+
+g_object_class_install_property (object_class,
+                                 PROP_AUTHORS,
+                                 g_param_spec_boxed ("authors",
+                                                     _("Authors"),
+                                                     _("List of authors"),
+                                                     G_TYPE_STRV,
+                                                     G_PARAM_READWRITE));
+
+
+gchar *authors[] = { "Owen", "Tim", NULL };
+g_object_set (obj, "authors", authors, NULL);
+
+
+gchar *writers[];
+g_object_get (obj, "authors", &writers, NULL);
+// do something with writers
+g_strfreev (writers);
+
+

Since 2.4

+
+
+
+

G_TYPE_REGEX

+
#define G_TYPE_REGEX (g_regex_get_type ())
+
+

+The GType for a boxed type holding a GRegex reference.

+

Since 2.14

+
+
+
+

G_TYPE_ARRAY

+
#define G_TYPE_ARRAY (g_array_get_type ())
+
+

+The GType for a boxed type holding a GArray reference.

+

Since 2.22

+
+
+
+

G_TYPE_BYTE_ARRAY

+
#define G_TYPE_BYTE_ARRAY (g_byte_array_get_type ())
+
+

+The GType for a boxed type holding a GByteArray reference.

+

Since 2.22

+
+
+
+

G_TYPE_PTR_ARRAY

+
#define G_TYPE_PTR_ARRAY (g_ptr_array_get_type ())
+
+

+The GType for a boxed type holding a GPtrArray reference.

+

Since 2.22

+
+
+
+

G_TYPE_VARIANT

+
#define G_TYPE_VARIANT (g_variant_get_gtype ())
+
+

+The GType for a boxed type holding a GVariant reference.

+

Since 2.24

+
+
+
+

G_TYPE_VARIANT_TYPE

+
#define G_TYPE_VARIANT_TYPE (g_variant_type_get_gtype ())
+
+

+The GType for a boxed type holding a GVariantType.

+

Since 2.24

+
+
+
+

GStrv

+
typedef gchar** GStrv;
+
+

+A C representable type name for G_TYPE_STRV.

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Closures.html b/docs/reference/gobject/html/gobject-Closures.html new file mode 100644 index 0000000..a47d151 --- /dev/null +++ b/docs/reference/gobject/html/gobject-Closures.html @@ -0,0 +1,2252 @@ + + + + +Closures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Closures

+

Closures — Functions as first-class objects

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+#define             G_CLOSURE_NEEDS_MARSHAL             (closure)
+#define             G_CLOSURE_N_NOTIFIERS               (cl)
+#define             G_CCLOSURE_SWAP_DATA                (cclosure)
+#define             G_CALLBACK                          (f)
+void                (*GCallback)                        (void);
+                    GClosure;
+#define             G_TYPE_CLOSURE
+                    GCClosure;
+void                (*GClosureMarshal)                  (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                (*GClosureNotify)                   (gpointer data,
+                                                         GClosure *closure);
+GClosure*           g_cclosure_new                      (GCallback callback_func,
+                                                         gpointer user_data,
+                                                         GClosureNotify destroy_data);
+GClosure*           g_cclosure_new_swap                 (GCallback callback_func,
+                                                         gpointer user_data,
+                                                         GClosureNotify destroy_data);
+GClosure*           g_cclosure_new_object               (GCallback callback_func,
+                                                         GObject *object);
+GClosure*           g_cclosure_new_object_swap          (GCallback callback_func,
+                                                         GObject *object);
+GClosure*           g_closure_new_object                (guint sizeof_closure,
+                                                         GObject *object);
+GClosure*           g_closure_ref                       (GClosure *closure);
+void                g_closure_sink                      (GClosure *closure);
+void                g_closure_unref                     (GClosure *closure);
+void                g_closure_invoke                    (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint);
+void                g_closure_invalidate                (GClosure *closure);
+void                g_closure_add_finalize_notifier     (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+void                g_closure_add_invalidate_notifier   (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+void                g_closure_remove_finalize_notifier  (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+void                g_closure_remove_invalidate_notifier
+                                                        (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+GClosure*           g_closure_new_simple                (guint sizeof_closure,
+                                                         gpointer data);
+void                g_closure_set_marshal               (GClosure *closure,
+                                                         GClosureMarshal marshal);
+void                g_closure_add_marshal_guards        (GClosure *closure,
+                                                         gpointer pre_marshal_data,
+                                                         GClosureNotify pre_marshal_notify,
+                                                         gpointer post_marshal_data,
+                                                         GClosureNotify post_marshal_notify);
+void                g_closure_set_meta_marshal          (GClosure *closure,
+                                                         gpointer marshal_data,
+                                                         GClosureMarshal meta_marshal);
+void                g_source_set_closure                (GSource *source,
+                                                         GClosure *closure);
+#define             G_TYPE_IO_CHANNEL
+#define             G_TYPE_IO_CONDITION
+
+void                g_cclosure_marshal_VOID__VOID       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__BOOLEAN    (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__CHAR       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__UCHAR      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__INT        (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__UINT       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__LONG       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__ULONG      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__ENUM       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__FLAGS      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__FLOAT      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__DOUBLE     (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__STRING     (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__PARAM      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__BOXED      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__POINTER    (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__OBJECT     (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_STRING__OBJECT_POINTER
+                                                        (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_VOID__UINT_POINTER
+                                                        (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+void                g_cclosure_marshal_BOOLEAN__FLAGS   (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+#define             g_cclosure_marshal_BOOL__FLAGS
+
+
+
+

Description

+

+A GClosure represents a callback supplied by the programmer. It +will generally comprise a function of some kind and a marshaller +used to call it. It is the reponsibility of the marshaller to +convert the arguments for the invocation from GValues into +a suitable form, perform the callback on the converted arguments, +and transform the return value back into a GValue. +

+

+In the case of C programs, a closure usually just holds a pointer +to a function and maybe a data argument, and the marshaller +converts between GValue and native C types. The GObject +library provides the GCClosure type for this purpose. Bindings for +other languages need marshallers which convert between GValues and suitable representations in the runtime of the language in +order to use functions written in that languages as callbacks. +

+

+Within GObject, closures play an important role in the +implementation of signals. When a signal is registered, the +c_marshaller argument to g_signal_new() specifies the default C +marshaller for any closure which is connected to this +signal. GObject provides a number of C marshallers for this +purpose, see the g_cclosure_marshal_*() functions. Additional C +marshallers can be generated with the glib-genmarshal utility. Closures +can be explicitly connected to signals with +g_signal_connect_closure(), but it usually more convenient to let +GObject create a closure automatically by using one of the +g_signal_connect_*() functions which take a callback function/user +data pair. +

+

+Using closures has a number of important advantages over a simple +callback function/data pointer combination: +

+
    +
  • +Closures allow the callee to get the types of the callback parameters, +which means that language bindings don't have to write individual glue +for each callback type. +

  • +
  • +The reference counting of GClosure makes it easy to handle reentrancy +right; if a callback is removed while it is being invoked, the closure +and its parameters won't be freed until the invocation finishes. +

  • +
  • +g_closure_invalidate() and invalidation notifiers allow callbacks to be +automatically removed when the objects they point to go away. +

  • +
+
+
+

Details

+
+

G_CLOSURE_NEEDS_MARSHAL()

+
#define G_CLOSURE_NEEDS_MARSHAL(closure) (((GClosure*) (closure))->marshal == NULL)
+
+

+Check if the closure still needs a marshaller. See g_closure_set_marshal().

+
++ + + + + + + + + + +

closure :

a GClosure +

Returns :

TRUE if a GClosureMarshal marshaller has not yet been set on +closure. +
+
+
+
+

G_CLOSURE_N_NOTIFIERS()

+
#define             G_CLOSURE_N_NOTIFIERS(cl)
+

+Get the total number of notifiers connected with the closure cl. +The count includes the meta marshaller, the finalize and invalidate notifiers +and the marshal guards. Note that each guard counts as two notifiers. +See g_closure_set_meta_marshal(), g_closure_add_finalize_notifier(), +g_closure_add_invalidate_notifier() and g_closure_add_marshal_guards().

+
++ + + + + + + + + + +

cl :

a GClosure +

Returns :

number of notifiers +
+
+
+
+

G_CCLOSURE_SWAP_DATA()

+
#define G_CCLOSURE_SWAP_DATA(cclosure)	 (((GClosure*) (cclosure))->derivative_flag)
+
+

+Checks whether the user data of the GCClosure should be passed as the +first parameter to the callback. See g_cclosure_new_swap().

+
++ + + + + + + + + + +

cclosure :

a GCClosure +

Returns :

TRUE if data has to be swapped. +
+
+
+
+

G_CALLBACK()

+
#define G_CALLBACK(f)			 ((GCallback) (f))
+
+

+Cast a function pointer to a GCallback.

+
++ + + + +

f :

a function pointer. +
+
+
+
+

GCallback ()

+
void                (*GCallback)                        (void);
+

+The type used for callback functions in structure definitions and function +signatures. This doesn't mean that all callback functions must take no +parameters and return void. The required signature of a callback function +is determined by the context in which is used (e.g. the signal to which it +is connected). Use G_CALLBACK() to cast the callback function to a GCallback.

+
+
+
+

GClosure

+
typedef struct {
+  volatile       	guint	 in_marshal : 1;
+  volatile       	guint	 is_invalid : 1;
+} GClosure;
+
+

+A GClosure represents a callback supplied by the programmer.

+
++ + + + + + + + + + +

volatile        guint in_marshal : 1;

Indicates whether the closure is currently being invoked with + g_closure_invoke() +

volatile        guint is_invalid : 1;

Indicates whether the closure has been invalidated by + g_closure_invalidate() +
+
+
+
+

G_TYPE_CLOSURE

+
#define G_TYPE_CLOSURE		(g_closure_get_type ())
+
+

+The GType for GClosure.

+
+
+
+

GCClosure

+
typedef struct {
+  GClosure closure;
+  gpointer callback;
+} GCClosure;
+
+

+A GCClosure is a specialization of GClosure for C function callbacks.

+
++ + + + + + + + + + +

GClosure closure;

the GClosure +

gpointer callback;

the callback function +
+
+
+
+

GClosureMarshal ()

+
void                (*GClosureMarshal)                  (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+The type used for marshaller functions.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

a GValue to store the return value. May be NULL if the + callback of closure doesn't return a value. +

n_param_values :

the length of the param_values array +

param_values :

an array of GValues holding the arguments on + which to invoke the callback of closure +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller, + see g_closure_set_marshal() and g_closure_set_meta_marshal() +
+
+
+
+

GClosureNotify ()

+
void                (*GClosureNotify)                   (gpointer data,
+                                                         GClosure *closure);
+

+The type used for the various notification callbacks which can be registered +on closures.

+
++ + + + + + + + + + +

data :

data specified when registering the notification callback +

closure :

the GClosure on which the notification is emitted +
+
+
+
+

g_cclosure_new ()

+
GClosure*           g_cclosure_new                      (GCallback callback_func,
+                                                         gpointer user_data,
+                                                         GClosureNotify destroy_data);
+

+Creates a new closure which invokes callback_func with user_data as +the last parameter.

+
++ + + + + + + + + + + + + + + + + + +

callback_func :

the function to invoke +

user_data :

user data to pass to callback_func +

destroy_data :

destroy notify to be called when user_data is no longer used +

Returns :

a new GCClosure +
+
+
+
+

g_cclosure_new_swap ()

+
GClosure*           g_cclosure_new_swap                 (GCallback callback_func,
+                                                         gpointer user_data,
+                                                         GClosureNotify destroy_data);
+

+Creates a new closure which invokes callback_func with user_data as +the first parameter.

+
++ + + + + + + + + + + + + + + + + + +

callback_func :

the function to invoke +

user_data :

user data to pass to callback_func +

destroy_data :

destroy notify to be called when user_data is no longer used +

Returns :

a new GCClosure +
+
+
+
+

g_cclosure_new_object ()

+
GClosure*           g_cclosure_new_object               (GCallback callback_func,
+                                                         GObject *object);
+

+A variant of g_cclosure_new() which uses object as user_data and +calls g_object_watch_closure() on object and the created +closure. This function is useful when you have a callback closely +associated with a GObject, and want the callback to no longer run +after the object is is freed.

+
++ + + + + + + + + + + + + + +

callback_func :

the function to invoke +

object :

a GObject pointer to pass to callback_func +

Returns :

a new GCClosure +
+
+
+
+

g_cclosure_new_object_swap ()

+
GClosure*           g_cclosure_new_object_swap          (GCallback callback_func,
+                                                         GObject *object);
+

+A variant of g_cclosure_new_swap() which uses object as user_data +and calls g_object_watch_closure() on object and the created +closure. This function is useful when you have a callback closely +associated with a GObject, and want the callback to no longer run +after the object is is freed.

+
++ + + + + + + + + + + + + + +

callback_func :

the function to invoke +

object :

a GObject pointer to pass to callback_func +

Returns :

a new GCClosure +
+
+
+
+

g_closure_new_object ()

+
GClosure*           g_closure_new_object                (guint sizeof_closure,
+                                                         GObject *object);
+

+A variant of g_closure_new_simple() which stores object in the +data field of the closure and calls g_object_watch_closure() on +object and the created closure. This function is mainly useful +when implementing new types of closures.

+
++ + + + + + + + + + + + + + +

sizeof_closure :

the size of the structure to allocate, must be at least + sizeof (GClosure) +

object :

a GObject pointer to store in the data field of the newly + allocated GClosure +

Returns :

a newly allocated GClosure +
+
+
+
+

g_closure_ref ()

+
GClosure*           g_closure_ref                       (GClosure *closure);
+

+Increments the reference count on a closure to force it staying +alive while the caller holds a pointer to it.

+
++ + + + + + + + + + +

closure :

GClosure to increment the reference count on +

Returns :

The closure passed in, for convenience +
+
+
+
+

g_closure_sink ()

+
void                g_closure_sink                      (GClosure *closure);
+

+Takes over the initial ownership of a closure. Each closure is +initially created in a floating state, which +means that the initial reference count is not owned by any caller. +g_closure_sink() checks to see if the object is still floating, and +if so, unsets the floating state and decreases the reference +count. If the closure is not floating, g_closure_sink() does +nothing. The reason for the existance of the floating state is to +prevent cumbersome code sequences like: +

+
+closure = g_cclosure_new (cb_func, cb_data);
+g_source_set_closure (source, closure);
+g_closure_unref (closure); // XXX GObject doesn't really need this
+
+

+Because g_source_set_closure() (and similar functions) take ownership of the +initial reference count, if it is unowned, we instead can write: +

+
+g_source_set_closure (source, g_cclosure_new (cb_func, cb_data));
+
+

+

+

+Generally, this function is used together with g_closure_ref(). Ane example +of storing a closure for later notification looks like: +

+
+static GClosure *notify_closure = NULL;
+void
+foo_notify_set_closure (GClosure *closure)
+{
+  if (notify_closure)
+    g_closure_unref (notify_closure);
+  notify_closure = closure;
+  if (notify_closure)
+    {
+      g_closure_ref (notify_closure);
+      g_closure_sink (notify_closure);
+    }
+}
+
+

+

+

+Because g_closure_sink() may decrement the reference count of a closure +(if it hasn't been called on closure yet) just like g_closure_unref(), +g_closure_ref() should be called prior to this function.

+
++ + + + +

closure :

GClosure to decrement the initial reference count on, if it's + still being held +
+
+
+
+

g_closure_unref ()

+
void                g_closure_unref                     (GClosure *closure);
+

+Decrements the reference count of a closure after it was previously +incremented by the same caller. If no other callers are using the +closure, then the closure will be destroyed and freed.

+
++ + + + +

closure :

GClosure to decrement the reference count on +
+
+
+
+

g_closure_invoke ()

+
void                g_closure_invoke                    (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint);
+

+Invokes the closure, i.e. executes the callback represented by the closure.

+
++ + + + + + + + + + + + + + + + + + + + + + +

closure :

a GClosure +

return_value :

a GValue to store the return value. May be NULL if the + callback of closure doesn't return a value. +

n_param_values :

the length of the param_values array +

param_values :

an array of GValues holding the arguments on + which to invoke the callback of closure +

invocation_hint :

a context-dependent invocation hint +
+
+
+
+

g_closure_invalidate ()

+
void                g_closure_invalidate                (GClosure *closure);
+

+Sets a flag on the closure to indicate that its calling +environment has become invalid, and thus causes any future +invocations of g_closure_invoke() on this closure to be +ignored. Also, invalidation notifiers installed on the closure will +be called at this point. Note that unless you are holding a +reference to the closure yourself, the invalidation notifiers may +unref the closure and cause it to be destroyed, so if you need to +access the closure after calling g_closure_invalidate(), make sure +that you've previously called g_closure_ref(). +

+

+Note that g_closure_invalidate() will also be called when the +reference count of a closure drops to zero (unless it has already +been invalidated before).

+
++ + + + +

closure :

GClosure to invalidate +
+
+
+
+

g_closure_add_finalize_notifier ()

+
void                g_closure_add_finalize_notifier     (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+

+Registers a finalization notifier which will be called when the +reference count of closure goes down to 0. Multiple finalization +notifiers on a single closure are invoked in unspecified order. If +a single call to g_closure_unref() results in the closure being +both invalidated and finalized, then the invalidate notifiers will +be run before the finalize notifiers.

+
++ + + + + + + + + + + + + + +

closure :

a GClosure +

notify_data :

data to pass to notify_func +

notify_func :

the callback function to register +
+
+
+
+

g_closure_add_invalidate_notifier ()

+
void                g_closure_add_invalidate_notifier   (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+

+Registers an invalidation notifier which will be called when the +closure is invalidated with g_closure_invalidate(). Invalidation +notifiers are invoked before finalization notifiers, in an +unspecified order.

+
++ + + + + + + + + + + + + + +

closure :

a GClosure +

notify_data :

data to pass to notify_func +

notify_func :

the callback function to register +
+
+
+
+

g_closure_remove_finalize_notifier ()

+
void                g_closure_remove_finalize_notifier  (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+

+Removes a finalization notifier. +

+

+Notice that notifiers are automatically removed after they are run.

+
++ + + + + + + + + + + + + + +

closure :

a GClosure +

notify_data :

data which was passed to g_closure_add_finalize_notifier() + when registering notify_func +

notify_func :

the callback function to remove +
+
+
+
+

g_closure_remove_invalidate_notifier ()

+
void                g_closure_remove_invalidate_notifier
+                                                        (GClosure *closure,
+                                                         gpointer notify_data,
+                                                         GClosureNotify notify_func);
+

+Removes an invalidation notifier. +

+

+Notice that notifiers are automatically removed after they are run.

+
++ + + + + + + + + + + + + + +

closure :

a GClosure +

notify_data :

data which was passed to g_closure_add_invalidate_notifier() + when registering notify_func +

notify_func :

the callback function to remove +
+
+
+
+

g_closure_new_simple ()

+
GClosure*           g_closure_new_simple                (guint sizeof_closure,
+                                                         gpointer data);
+

+Allocates a struct of the given size and initializes the initial +part as a GClosure. This function is mainly useful when +implementing new types of closures. +

+

+

+
+typedef struct _MyClosure MyClosure;
+struct _MyClosure
+{
+  GClosure closure;
+  // extra data goes here
+};
+
+static void
+my_closure_finalize (gpointer  notify_data,
+                     GClosure *closure)
+{
+  MyClosure *my_closure = (MyClosure *)closure;
+
+  // free extra data here
+}
+
+MyClosure *my_closure_new (gpointer data)
+{
+  GClosure *closure;
+  MyClosure *my_closure;
+
+  closure = g_closure_new_simple (sizeof (MyClosure), data);
+  my_closure = (MyClosure *) closure;
+
+  // initialize extra data here
+
+  g_closure_add_finalize_notifier (closure, notify_data,
+                                   my_closure_finalize);
+  return my_closure;
+}
+
+
++ + + + + + + + + + + + + + +

sizeof_closure :

the size of the structure to allocate, must be at least + sizeof (GClosure) +

data :

data to store in the data field of the newly allocated GClosure +

Returns :

a newly allocated GClosure +
+
+
+
+

g_closure_set_marshal ()

+
void                g_closure_set_marshal               (GClosure *closure,
+                                                         GClosureMarshal marshal);
+

+Sets the marshaller of closure. The marshal_data +of marshal provides a way for a meta marshaller to provide additional +information to the marshaller. (See g_closure_set_meta_marshal().) For +GObject's C predefined marshallers (the g_cclosure_marshal_*() +functions), what it provides is a callback function to use instead of +closure->callback.

+
++ + + + + + + + + + +

closure :

a GClosure +

marshal :

a GClosureMarshal function +
+
+
+
+

g_closure_add_marshal_guards ()

+
void                g_closure_add_marshal_guards        (GClosure *closure,
+                                                         gpointer pre_marshal_data,
+                                                         GClosureNotify pre_marshal_notify,
+                                                         gpointer post_marshal_data,
+                                                         GClosureNotify post_marshal_notify);
+

+Adds a pair of notifiers which get invoked before and after the +closure callback, respectively. This is typically used to protect +the extra arguments for the duration of the callback. See +g_object_watch_closure() for an example of marshal guards.

+
++ + + + + + + + + + + + + + + + + + + + + + +

closure :

a GClosure +

pre_marshal_data :

data to pass to pre_marshal_notify +

pre_marshal_notify :

a function to call before the closure callback +

post_marshal_data :

data to pass to post_marshal_notify +

post_marshal_notify :

a function to call after the closure callback +
+
+
+
+

g_closure_set_meta_marshal ()

+
void                g_closure_set_meta_marshal          (GClosure *closure,
+                                                         gpointer marshal_data,
+                                                         GClosureMarshal meta_marshal);
+

+Sets the meta marshaller of closure. A meta marshaller wraps +closure->marshal and modifies the way it is called in some +fashion. The most common use of this facility is for C callbacks. +The same marshallers (generated by glib-genmarshal) are used +everywhere, but the way that we get the callback function +differs. In most cases we want to use closure->callback, but in +other cases we want to use some different technique to retrieve the +callback function. +

+

+For example, class closures for signals (see +g_signal_type_cclosure_new()) retrieve the callback function from a +fixed offset in the class structure. The meta marshaller retrieves +the right callback and passes it to the marshaller as the +marshal_data argument.

+
++ + + + + + + + + + + + + + +

closure :

a GClosure +

marshal_data :

context-dependent data to pass to meta_marshal +

meta_marshal :

a GClosureMarshal function +
+
+
+
+

g_source_set_closure ()

+
void                g_source_set_closure                (GSource *source,
+                                                         GClosure *closure);
+

+Set the callback for a source as a GClosure. +

+

+If the source is not one of the standard GLib types, the closure_callback +and closure_marshal fields of the GSourceFuncs structure must have been +filled in with pointers to appropriate functions.

+
++ + + + + + + + + + +

source :

the source +

closure :

a GClosure +
+
+
+
+

G_TYPE_IO_CHANNEL

+
#define G_TYPE_IO_CHANNEL (g_io_channel_get_type ())
+
+

+The GType for GIOChannel.

+
+
+
+

G_TYPE_IO_CONDITION

+
#define G_TYPE_IO_CONDITION (g_io_condition_get_type ())
+
+

+The GType for GIOCondition.

+
+
+
+

g_cclosure_marshal_VOID__VOID ()

+
void                g_cclosure_marshal_VOID__VOID       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

1 +

param_values :

a GValue array holding only the instance +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__BOOLEAN ()

+
void                g_cclosure_marshal_VOID__BOOLEAN    (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gboolean arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gboolean parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__CHAR ()

+
void                g_cclosure_marshal_VOID__CHAR       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gchar arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gchar parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__UCHAR ()

+
void                g_cclosure_marshal_VOID__UCHAR      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, guchar arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the guchar parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__INT ()

+
void                g_cclosure_marshal_VOID__INT        (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gint arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gint parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__UINT ()

+
void                g_cclosure_marshal_VOID__UINT       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, guint arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the guint parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__LONG ()

+
void                g_cclosure_marshal_VOID__LONG       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, glong arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the glong parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__ULONG ()

+
void                g_cclosure_marshal_VOID__ULONG      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gulong arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gulong parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__ENUM ()

+
void                g_cclosure_marshal_VOID__ENUM       (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gint arg1, gpointer user_data) where the gint parameter denotes an enumeration type..

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the enumeration parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__FLAGS ()

+
void                g_cclosure_marshal_VOID__FLAGS      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gint arg1, gpointer user_data) where the gint parameter denotes a flags type.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the flags parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__FLOAT ()

+
void                g_cclosure_marshal_VOID__FLOAT      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gfloat arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gfloat parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__DOUBLE ()

+
void                g_cclosure_marshal_VOID__DOUBLE     (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gdouble arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gdouble parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__STRING ()

+
void                g_cclosure_marshal_VOID__STRING     (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, const gchar *arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gchar* parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__PARAM ()

+
void                g_cclosure_marshal_VOID__PARAM      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, GParamSpec *arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the GParamSpec* parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__BOXED ()

+
void                g_cclosure_marshal_VOID__BOXED      (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, GBoxed *arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the GBoxed* parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__POINTER ()

+
void                g_cclosure_marshal_VOID__POINTER    (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, gpointer arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the gpointer parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__OBJECT ()

+
void                g_cclosure_marshal_VOID__OBJECT     (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, GOBject *arg1, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

2 +

param_values :

a GValue array holding the instance and the GObject* parameter +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_STRING__OBJECT_POINTER ()

+
void                g_cclosure_marshal_STRING__OBJECT_POINTER
+                                                        (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +gchar* (*callback) (gpointer instance, GObject *arg1, gpointer arg2, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

a GValue, which can store the returned string +

n_param_values :

3 +

param_values :

a GValue array holding instance, arg1 and arg2 +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_VOID__UINT_POINTER ()

+
void                g_cclosure_marshal_VOID__UINT_POINTER
+                                                        (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +void (*callback) (gpointer instance, guint arg1, gpointer arg2, gpointer user_data).

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

ignored +

n_param_values :

3 +

param_values :

a GValue array holding instance, arg1 and arg2 +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_BOOLEAN__FLAGS ()

+
void                g_cclosure_marshal_BOOLEAN__FLAGS   (GClosure *closure,
+                                                         GValue *return_value,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer invocation_hint,
+                                                         gpointer marshal_data);
+

+A marshaller for a GCClosure with a callback of type +gboolean (*callback) (gpointer instance, gint arg1, gpointer user_data) where the gint parameter +denotes a flags type.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

closure :

the GClosure to which the marshaller belongs +

return_value :

a GValue which can store the returned gboolean +

n_param_values :

2 +

param_values :

a GValue array holding instance and arg1 +

invocation_hint :

the invocation hint given as the last argument + to g_closure_invoke() +

marshal_data :

additional data specified when registering the marshaller +
+
+
+
+

g_cclosure_marshal_BOOL__FLAGS

+
#define             g_cclosure_marshal_BOOL__FLAGS
+

+Another name for g_cclosure_marshal_BOOLEAN__FLAGS().

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Enumeration-and-Flag-Types.html b/docs/reference/gobject/html/gobject-Enumeration-and-Flag-Types.html new file mode 100644 index 0000000..a48b8a7 --- /dev/null +++ b/docs/reference/gobject/html/gobject-Enumeration-and-Flag-Types.html @@ -0,0 +1,830 @@ + + + + +Enumeration and Flag Types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Enumeration and Flag Types

+

Enumeration and Flag Types — Enumeration and flags types

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+                    GEnumClass;
+                    GFlagsClass;
+#define             G_ENUM_CLASS_TYPE                   (class)
+#define             G_ENUM_CLASS_TYPE_NAME              (class)
+#define             G_TYPE_IS_ENUM                      (type)
+#define             G_ENUM_CLASS                        (class)
+#define             G_IS_ENUM_CLASS                     (class)
+#define             G_TYPE_IS_FLAGS                     (type)
+#define             G_FLAGS_CLASS                       (class)
+#define             G_IS_FLAGS_CLASS                    (class)
+#define             G_FLAGS_CLASS_TYPE                  (class)
+#define             G_FLAGS_CLASS_TYPE_NAME             (class)
+                    GEnumValue;
+                    GFlagsValue;
+GEnumValue*         g_enum_get_value                    (GEnumClass *enum_class,
+                                                         gint value);
+GEnumValue*         g_enum_get_value_by_name            (GEnumClass *enum_class,
+                                                         const gchar *name);
+GEnumValue*         g_enum_get_value_by_nick            (GEnumClass *enum_class,
+                                                         const gchar *nick);
+GFlagsValue*        g_flags_get_first_value             (GFlagsClass *flags_class,
+                                                         guint value);
+GFlagsValue*        g_flags_get_value_by_name           (GFlagsClass *flags_class,
+                                                         const gchar *name);
+GFlagsValue*        g_flags_get_value_by_nick           (GFlagsClass *flags_class,
+                                                         const gchar *nick);
+GType               g_enum_register_static              (const gchar *name,
+                                                         const GEnumValue *const_static_values);
+GType               g_flags_register_static             (const gchar *name,
+                                                         const GFlagsValue *const_static_values);
+void                g_enum_complete_type_info           (GType g_enum_type,
+                                                         GTypeInfo *info,
+                                                         const GEnumValue *const_values);
+void                g_flags_complete_type_info          (GType g_flags_type,
+                                                         GTypeInfo *info,
+                                                         const GFlagsValue *const_values);
+
+
+
+

Description

+

+The GLib type system provides fundamental types for enumeration and +flags types. (Flags types are like enumerations, but allow their +values to be combined by bitwise or). A registered enumeration or +flags type associates a name and a nickname with each allowed +value, and the methods g_enum_get_value_by_name(), +g_enum_get_value_by_nick(), g_flags_get_value_by_name() and +g_flags_get_value_by_nick() can look up values by their name or +nickname. When an enumeration or flags type is registered with the +GLib type system, it can be used as value type for object +properties, using g_param_spec_enum() or g_param_spec_flags(). +

+

+GObject ships with a utility called glib-mkenums that can construct +suitable type registration functions from C enumeration +definitions.

+
+
+

Details

+
+

GEnumClass

+
typedef struct {
+  GTypeClass  g_type_class;
+
+  gint	      minimum;
+  gint	      maximum;
+  guint	      n_values;
+  GEnumValue *values;
+} GEnumClass;
+
+

+The class of an enumeration type holds information about its +possible values.

+
++ + + + + + + + + + + + + + + + + + + + + + +

GTypeClass g_type_class;

the parent class +

gint minimum;

the smallest possible value. +

gint maximum;

the largest possible value. +

guint n_values;

the number of possible values. +

GEnumValue *values;

an array of GEnumValue structs describing the + individual values. +
+
+
+
+

GFlagsClass

+
typedef struct {
+  GTypeClass   g_type_class;
+  
+  guint	       mask;
+  guint	       n_values;
+  GFlagsValue *values;
+} GFlagsClass;
+
+

+The class of a flags type holds information about its +possible values.

+
++ + + + + + + + + + + + + + + + + + +

GTypeClass g_type_class;

the parent class +

guint mask;

a mask covering all possible values. +

guint n_values;

the number of possible values. +

GFlagsValue *values;

an array of GFlagsValue structs describing the + individual values. +
+
+
+
+

G_ENUM_CLASS_TYPE()

+
#define G_ENUM_CLASS_TYPE(class)       (G_TYPE_FROM_CLASS (class))
+
+

+Get the type identifier from a given GEnumClass structure.

+
++ + + + + + + + + + +

class :

a GEnumClass +

Returns :

the GType +
+
+
+
+

G_ENUM_CLASS_TYPE_NAME()

+
#define G_ENUM_CLASS_TYPE_NAME(class)  (g_type_name (G_ENUM_CLASS_TYPE (class)))
+
+

+Get the static type name from a given GEnumClass structure.

+
++ + + + + + + + + + +

class :

a GEnumClass +

Returns :

the type name. +
+
+
+
+

G_TYPE_IS_ENUM()

+
#define G_TYPE_IS_ENUM(type)	       (G_TYPE_FUNDAMENTAL (type) == G_TYPE_ENUM)
+
+

+Checks whether type "is a" G_TYPE_ENUM.

+
++ + + + + + + + + + +

type :

a GType ID. +

Returns :

TRUE if type "is a" G_TYPE_ENUM. +
+
+
+
+

G_ENUM_CLASS()

+
#define G_ENUM_CLASS(class)	       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_ENUM, GEnumClass))
+
+

+Casts a derived GEnumClass structure into a GEnumClass structure.

+
++ + + + +

class :

a valid GEnumClass +
+
+
+
+

G_IS_ENUM_CLASS()

+
#define G_IS_ENUM_CLASS(class)	       (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_ENUM))
+
+

+Checks whether class "is a" valid GEnumClass structure of type G_TYPE_ENUM +or derived.

+
++ + + + +

class :

a GEnumClass +
+
+
+
+

G_TYPE_IS_FLAGS()

+
#define G_TYPE_IS_FLAGS(type)	       (G_TYPE_FUNDAMENTAL (type) == G_TYPE_FLAGS)
+
+

+Checks whether type "is a" G_TYPE_FLAGS.

+
++ + + + + + + + + + +

type :

a GType ID. +

Returns :

TRUE if type "is a" G_TYPE_FLAGS. +
+
+
+
+

G_FLAGS_CLASS()

+
#define G_FLAGS_CLASS(class)	       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_FLAGS, GFlagsClass))
+
+

+Casts a derived GFlagsClass structure into a GFlagsClass structure.

+
++ + + + +

class :

a valid GFlagsClass +
+
+
+
+

G_IS_FLAGS_CLASS()

+
#define G_IS_FLAGS_CLASS(class)        (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_FLAGS))
+
+

+Checks whether class "is a" valid GFlagsClass structure of type G_TYPE_FLAGS +or derived.

+
++ + + + +

class :

a GFlagsClass +
+
+
+
+

G_FLAGS_CLASS_TYPE()

+
#define G_FLAGS_CLASS_TYPE(class)      (G_TYPE_FROM_CLASS (class))
+
+

+Get the type identifier from a given GFlagsClass structure.

+
++ + + + + + + + + + +

class :

a GFlagsClass +

Returns :

the GType +
+
+
+
+

G_FLAGS_CLASS_TYPE_NAME()

+
#define G_FLAGS_CLASS_TYPE_NAME(class) (g_type_name (G_FLAGS_CLASS_TYPE (class)))
+
+

+Get the static type name from a given GFlagsClass structure.

+
++ + + + + + + + + + +

class :

a GFlagsClass +

Returns :

the type name. +
+
+
+
+

GEnumValue

+
typedef struct {
+  gint	 value;
+  const gchar *value_name;
+  const gchar *value_nick;
+} GEnumValue;
+
+

+A structure which contains a single enum value, its name, and its +nickname.

+
++ + + + + + + + + + + + + + +

gint value;

the enum value +

const gchar *value_name;

the name of the value +

const gchar *value_nick;

the nickname of the value +
+
+
+
+

GFlagsValue

+
typedef struct {
+  guint	 value;
+  const gchar *value_name;
+  const gchar *value_nick;
+} GFlagsValue;
+
+

+A structure which contains a single flags value, its name, and its +nickname.

+
++ + + + + + + + + + + + + + +

guint value;

the flags value +

const gchar *value_name;

the name of the value +

const gchar *value_nick;

the nickname of the value +
+
+
+
+

g_enum_get_value ()

+
GEnumValue*         g_enum_get_value                    (GEnumClass *enum_class,
+                                                         gint value);
+

+Returns the GEnumValue for a value.

+
++ + + + + + + + + + + + + + +

enum_class :

a GEnumClass +

value :

the value to look up +

Returns :

the GEnumValue for value, or NULL if value is not a + member of the enumeration +
+
+
+
+

g_enum_get_value_by_name ()

+
GEnumValue*         g_enum_get_value_by_name            (GEnumClass *enum_class,
+                                                         const gchar *name);
+

+Looks up a GEnumValue by name.

+
++ + + + + + + + + + + + + + +

enum_class :

a GEnumClass +

name :

the name to look up +

Returns :

the GEnumValue with name name, or NULL if the + enumeration doesn't have a member with that name +
+
+
+
+

g_enum_get_value_by_nick ()

+
GEnumValue*         g_enum_get_value_by_nick            (GEnumClass *enum_class,
+                                                         const gchar *nick);
+

+Looks up a GEnumValue by nickname.

+
++ + + + + + + + + + + + + + +

enum_class :

a GEnumClass +

nick :

the nickname to look up +

Returns :

the GEnumValue with nickname nick, or NULL if the + enumeration doesn't have a member with that nickname +
+
+
+
+

g_flags_get_first_value ()

+
GFlagsValue*        g_flags_get_first_value             (GFlagsClass *flags_class,
+                                                         guint value);
+

+Returns the first GFlagsValue which is set in value.

+
++ + + + + + + + + + + + + + +

flags_class :

a GFlagsClass +

value :

the value +

Returns :

the first GFlagsValue which is set in value, or NULL if + none is set +
+
+
+
+

g_flags_get_value_by_name ()

+
GFlagsValue*        g_flags_get_value_by_name           (GFlagsClass *flags_class,
+                                                         const gchar *name);
+

+Looks up a GFlagsValue by name.

+
++ + + + + + + + + + + + + + +

flags_class :

a GFlagsClass +

name :

the name to look up +

Returns :

the GFlagsValue with name name, or NULL if there is no + flag with that name +
+
+
+
+

g_flags_get_value_by_nick ()

+
GFlagsValue*        g_flags_get_value_by_nick           (GFlagsClass *flags_class,
+                                                         const gchar *nick);
+

+Looks up a GFlagsValue by nickname.

+
++ + + + + + + + + + + + + + +

flags_class :

a GFlagsClass +

nick :

the nickname to look up +

Returns :

the GFlagsValue with nickname nick, or NULL if there is + no flag with that nickname +
+
+
+
+

g_enum_register_static ()

+
GType               g_enum_register_static              (const gchar *name,
+                                                         const GEnumValue *const_static_values);
+

+Registers a new static enumeration type with the name name. +

+

+It is normally more convenient to let glib-mkenums generate a +my_enum_get_type() function from a usual C enumeration definition +than to write one yourself using g_enum_register_static().

+
++ + + + + + + + + + + + + + +

name :

A nul-terminated string used as the name of the new type. +

const_static_values :

An array of GEnumValue structs for the possible + enumeration values. The array is terminated by a struct with all + members being 0. GObject keeps a reference to the data, so it cannot + be stack-allocated. +

Returns :

The new type identifier. +
+
+
+
+

g_flags_register_static ()

+
GType               g_flags_register_static             (const gchar *name,
+                                                         const GFlagsValue *const_static_values);
+

+Registers a new static flags type with the name name. +

+

+It is normally more convenient to let glib-mkenums generate a +my_flags_get_type() function from a usual C enumeration definition +than to write one yourself using g_flags_register_static().

+
++ + + + + + + + + + + + + + +

name :

A nul-terminated string used as the name of the new type. +

const_static_values :

An array of GFlagsValue structs for the possible + flags values. The array is terminated by a struct with all members being 0. + GObject keeps a reference to the data, so it cannot be stack-allocated. +

Returns :

The new type identifier. +
+
+
+
+

g_enum_complete_type_info ()

+
void                g_enum_complete_type_info           (GType g_enum_type,
+                                                         GTypeInfo *info,
+                                                         const GEnumValue *const_values);
+

+This function is meant to be called from the complete_type_info() +function of a GTypePlugin implementation, as in the following +example: +

+

+

+
+static void
+my_enum_complete_type_info (GTypePlugin     *plugin,
+                            GType            g_type,
+                            GTypeInfo       *info,
+                            GTypeValueTable *value_table)
+{
+  static const GEnumValue values[] = {
+    { MY_ENUM_FOO, "MY_ENUM_FOO", "foo" },
+    { MY_ENUM_BAR, "MY_ENUM_BAR", "bar" },
+    { 0, NULL, NULL }
+  };
+
+  g_enum_complete_type_info (type, info, values);
+}
+
+
++ + + + + + + + + + + + + + +

g_enum_type :

the type identifier of the type being completed +

info :

the GTypeInfo struct to be filled in +

const_values :

An array of GEnumValue structs for the possible + enumeration values. The array is terminated by a struct with all + members being 0. +
+
+
+
+

g_flags_complete_type_info ()

+
void                g_flags_complete_type_info          (GType g_flags_type,
+                                                         GTypeInfo *info,
+                                                         const GFlagsValue *const_values);
+

+This function is meant to be called from the complete_type_info() +function of a GTypePlugin implementation, see the example for +g_enum_complete_type_info() above.

+
++ + + + + + + + + + + + + + +

g_flags_type :

the type identifier of the type being completed +

info :

the GTypeInfo struct to be filled in +

const_values :

An array of GFlagsValue structs for the possible + enumeration values. The array is terminated by a struct with all + members being 0. +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-GParamSpec.html b/docs/reference/gobject/html/gobject-GParamSpec.html new file mode 100644 index 0000000..7aead57 --- /dev/null +++ b/docs/reference/gobject/html/gobject-GParamSpec.html @@ -0,0 +1,1405 @@ + + + + +GParamSpec + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GParamSpec

+

GParamSpec — Metadata for parameter specifications

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+#define             G_TYPE_IS_PARAM                     (type)
+#define             G_PARAM_SPEC                        (pspec)
+#define             G_IS_PARAM_SPEC                     (pspec)
+#define             G_PARAM_SPEC_CLASS                  (pclass)
+#define             G_IS_PARAM_SPEC_CLASS               (pclass)
+#define             G_PARAM_SPEC_GET_CLASS              (pspec)
+#define             G_PARAM_SPEC_TYPE                   (pspec)
+#define             G_PARAM_SPEC_TYPE_NAME              (pspec)
+#define             G_PARAM_SPEC_VALUE_TYPE             (pspec)
+                    GParamSpec;
+                    GParamSpecClass;
+enum                GParamFlags;
+#define             G_PARAM_READWRITE
+#define             G_PARAM_STATIC_STRINGS
+#define             G_PARAM_MASK
+#define             G_PARAM_USER_SHIFT
+GParamSpec*         g_param_spec_ref                    (GParamSpec *pspec);
+void                g_param_spec_unref                  (GParamSpec *pspec);
+void                g_param_spec_sink                   (GParamSpec *pspec);
+GParamSpec*         g_param_spec_ref_sink               (GParamSpec *pspec);
+void                g_param_value_set_default           (GParamSpec *pspec,
+                                                         GValue *value);
+gboolean            g_param_value_defaults              (GParamSpec *pspec,
+                                                         GValue *value);
+gboolean            g_param_value_validate              (GParamSpec *pspec,
+                                                         GValue *value);
+gboolean            g_param_value_convert               (GParamSpec *pspec,
+                                                         const GValue *src_value,
+                                                         GValue *dest_value,
+                                                         gboolean strict_validation);
+gint                g_param_values_cmp                  (GParamSpec *pspec,
+                                                         const GValue *value1,
+                                                         const GValue *value2);
+const gchar*        g_param_spec_get_name               (GParamSpec *pspec);
+const gchar*        g_param_spec_get_nick               (GParamSpec *pspec);
+const gchar*        g_param_spec_get_blurb              (GParamSpec *pspec);
+gpointer            g_param_spec_get_qdata              (GParamSpec *pspec,
+                                                         GQuark quark);
+void                g_param_spec_set_qdata              (GParamSpec *pspec,
+                                                         GQuark quark,
+                                                         gpointer data);
+void                g_param_spec_set_qdata_full         (GParamSpec *pspec,
+                                                         GQuark quark,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy);
+gpointer            g_param_spec_steal_qdata            (GParamSpec *pspec,
+                                                         GQuark quark);
+GParamSpec*         g_param_spec_get_redirect_target    (GParamSpec *pspec);
+gpointer            g_param_spec_internal               (GType param_type,
+                                                         const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GParamFlags flags);
+                    GParamSpecTypeInfo;
+GType               g_param_type_register_static        (const gchar *name,
+                                                         const GParamSpecTypeInfo *pspec_info);
+                    GParamSpecPool;
+GParamSpecPool*     g_param_spec_pool_new               (gboolean type_prefixing);
+void                g_param_spec_pool_insert            (GParamSpecPool *pool,
+                                                         GParamSpec *pspec,
+                                                         GType owner_type);
+void                g_param_spec_pool_remove            (GParamSpecPool *pool,
+                                                         GParamSpec *pspec);
+GParamSpec*         g_param_spec_pool_lookup            (GParamSpecPool *pool,
+                                                         const gchar *param_name,
+                                                         GType owner_type,
+                                                         gboolean walk_ancestors);
+GParamSpec**        g_param_spec_pool_list              (GParamSpecPool *pool,
+                                                         GType owner_type,
+                                                         guint *n_pspecs_p);
+GList*              g_param_spec_pool_list_owned        (GParamSpecPool *pool,
+                                                         GType owner_type);
+
+
+
+

Description

+

+GParamSpec is an object structure that encapsulates the metadata +required to specify parameters, such as e.g. GObject properties. +

+

+

+

+Parameter names need to start with a letter (a-z or A-Z). Subsequent +characters can be letters, numbers or a '-'. +All other characters are replaced by a '-' during construction. +The result of this replacement is called the canonical name of the +parameter. +

+
+
+

Details

+
+

G_TYPE_IS_PARAM()

+
#define G_TYPE_IS_PARAM(type)		(G_TYPE_FUNDAMENTAL (type) == G_TYPE_PARAM)
+
+

+Checks whether type "is a" G_TYPE_PARAM.

+
++ + + + +

type :

a GType ID +
+
+
+
+

G_PARAM_SPEC()

+
#define G_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec))
+
+

+Casts a derived GParamSpec object (e.g. of type GParamSpecInt) into +a GParamSpec object.

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

G_IS_PARAM_SPEC()

+
#define G_IS_PARAM_SPEC(pspec)		(G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM))
+
+

+Checks whether pspec "is a" valid GParamSpec structure of type G_TYPE_PARAM +or derived.

+
++ + + + +

pspec :

a GParamSpec +
+
+
+
+

G_PARAM_SPEC_CLASS()

+
#define G_PARAM_SPEC_CLASS(pclass)      (G_TYPE_CHECK_CLASS_CAST ((pclass), G_TYPE_PARAM, GParamSpecClass))
+
+

+Casts a derived GParamSpecClass structure into a GParamSpecClass structure.

+
++ + + + +

pclass :

a valid GParamSpecClass +
+
+
+
+

G_IS_PARAM_SPEC_CLASS()

+
#define G_IS_PARAM_SPEC_CLASS(pclass)   (G_TYPE_CHECK_CLASS_TYPE ((pclass), G_TYPE_PARAM))
+
+

+Checks whether pclass "is a" valid GParamSpecClass structure of type +G_TYPE_PARAM or derived.

+
++ + + + +

pclass :

a GParamSpecClass +
+
+
+
+

G_PARAM_SPEC_GET_CLASS()

+
#define G_PARAM_SPEC_GET_CLASS(pspec) (G_TYPE_INSTANCE_GET_CLASS ((pspec), G_TYPE_PARAM, GParamSpecClass))
+
+

+Retrieves the GParamSpecClass of a GParamSpec.

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

G_PARAM_SPEC_TYPE()

+
#define G_PARAM_SPEC_TYPE(pspec) (G_TYPE_FROM_INSTANCE (pspec))
+
+

+Retrieves the GType of this pspec.

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

G_PARAM_SPEC_TYPE_NAME()

+
#define G_PARAM_SPEC_TYPE_NAME(pspec) (g_type_name (G_PARAM_SPEC_TYPE (pspec)))
+
+

+Retrieves the GType name of this pspec.

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

G_PARAM_SPEC_VALUE_TYPE()

+
#define G_PARAM_SPEC_VALUE_TYPE(pspec) (G_PARAM_SPEC (pspec)->value_type)
+
+

+Retrieves the GType to initialize a GValue for this parameter.

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

GParamSpec

+
typedef struct {
+  GTypeInstance  g_type_instance;
+
+  gchar         *name;
+  GParamFlags    flags;
+  GType		 value_type;
+  GType		 owner_type; /* class or interface using this property */
+} GParamSpec;
+
+

+All other fields of the GParamSpec struct are private and +should not be used directly.

+
++ + + + + + + + + + + + + + + + + + + + + + +

GTypeInstance g_type_instance;

private GTypeInstance portion +

gchar *name;

name of this parameter +

GParamFlags flags;

GParamFlags flags for this parameter +

GType value_type;

the GValue type for this parameter +

GType owner_type;

GType type that uses (introduces) this paremeter +
+
+
+
+

GParamSpecClass

+
typedef struct {
+  GTypeClass      g_type_class;
+
+  GType		  value_type;
+
+  void	        (*finalize)		(GParamSpec   *pspec);
+
+  /* GParam methods */
+  void          (*value_set_default)    (GParamSpec   *pspec,
+					 GValue       *value);
+  gboolean      (*value_validate)       (GParamSpec   *pspec,
+					 GValue       *value);
+  gint          (*values_cmp)           (GParamSpec   *pspec,
+					 const GValue *value1,
+					 const GValue *value2);
+} GParamSpecClass;
+
+

+The class structure for the GParamSpec type. +Normally, GParamSpec classes are filled by +g_param_type_register_static().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeClass g_type_class;

the parent class +

GType value_type;

the GValue type for this parameter +

finalize ()

The instance finalization function (optional), should chain + up to the finalize method of the parent class. +

value_set_default ()

Resets a value to the default value for this type + (recommended, the default is g_value_reset()), see + g_param_value_set_default(). +

value_validate ()

Ensures that the contents of value comply with the + specifications set out by this type (optional), see + g_param_value_set_validate(). +

values_cmp ()

Compares value1 with value2 according to this type + (recommended, the default is memcmp()), see g_param_values_cmp(). +
+
+
+
+

enum GParamFlags

+
typedef enum
+{
+  G_PARAM_READABLE            = 1 << 0,
+  G_PARAM_WRITABLE            = 1 << 1,
+  G_PARAM_CONSTRUCT	      = 1 << 2,
+  G_PARAM_CONSTRUCT_ONLY      = 1 << 3,
+  G_PARAM_LAX_VALIDATION      = 1 << 4,
+  G_PARAM_STATIC_NAME	      = 1 << 5,
+#ifndef G_DISABLE_DEPRECATED
+  G_PARAM_PRIVATE	      = G_PARAM_STATIC_NAME,
+#endif
+  G_PARAM_STATIC_NICK	      = 1 << 6,
+  G_PARAM_STATIC_BLURB	      = 1 << 7
+} GParamFlags;
+
+

+Through the GParamFlags flag values, certain aspects of parameters +can be configured.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_PARAM_READABLE

the parameter is readable +

G_PARAM_WRITABLE

the parameter is writable +

G_PARAM_CONSTRUCT

the parameter will be set upon object construction +

G_PARAM_CONSTRUCT_ONLY

the parameter will only be set upon object construction +

G_PARAM_LAX_VALIDATION

upon parameter conversion (see g_param_value_convert()) + strict validation is not required +

G_PARAM_STATIC_NAME

the string used as name when constructing the + parameter is guaranteed to remain valid and + unmodified for the lifetime of the parameter. + Since 2.8 +

G_PARAM_PRIVATE

internal +

G_PARAM_STATIC_NICK

the string used as nick when constructing the + parameter is guaranteed to remain valid and + unmmodified for the lifetime of the parameter. + Since 2.8 +

G_PARAM_STATIC_BLURB

the string used as blurb when constructing the + parameter is guaranteed to remain valid and + unmodified for the lifetime of the parameter. + Since 2.8 +
+
+
+
+

G_PARAM_READWRITE

+
#define G_PARAM_READWRITE (G_PARAM_READABLE | G_PARAM_WRITABLE)
+
+

+GParamFlags value alias for G_PARAM_READABLE | G_PARAM_WRITABLE.

+
+
+
+

G_PARAM_STATIC_STRINGS

+
#define G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)
+
+

+GParamFlags value alias for G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB. +

+

+Since 2.13.0

+
+
+
+

G_PARAM_MASK

+
#define G_PARAM_MASK		(0x000000ff)
+
+

+Mask containing the bits of GParamSpec.flags which are reserved for GLib.

+
+
+
+

G_PARAM_USER_SHIFT

+
#define G_PARAM_USER_SHIFT (8)
+
+

+Minimum shift count to be used for user defined flags, to be stored in +GParamSpec.flags.

+
+
+
+

g_param_spec_ref ()

+
GParamSpec*         g_param_spec_ref                    (GParamSpec *pspec);
+

+Increments the reference count of pspec.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec +

Returns :

the GParamSpec that was passed into this function +
+
+
+
+

g_param_spec_unref ()

+
void                g_param_spec_unref                  (GParamSpec *pspec);
+

+Decrements the reference count of a pspec.

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

g_param_spec_sink ()

+
void                g_param_spec_sink                   (GParamSpec *pspec);
+

+The initial reference count of a newly created GParamSpec is 1, +even though no one has explicitly called g_param_spec_ref() on it +yet. So the initial reference count is flagged as "floating", until +someone calls g_param_spec_ref (pspec); g_param_spec_sink +(pspec); in sequence on it, taking over the initial +reference count (thus ending up with a pspec that has a reference +count of 1 still, but is not flagged "floating" anymore).

+
++ + + + +

pspec :

a valid GParamSpec +
+
+
+
+

g_param_spec_ref_sink ()

+
GParamSpec*         g_param_spec_ref_sink               (GParamSpec *pspec);
+

+Convenience function to ref and sink a GParamSpec.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec +

Returns :

the GParamSpec that was passed into this function +
+

Since 2.10

+
+
+
+

g_param_value_set_default ()

+
void                g_param_value_set_default           (GParamSpec *pspec,
+                                                         GValue *value);
+

+Sets value to its default value as specified in pspec.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec +

value :

a GValue of correct type for pspec +
+
+
+
+

g_param_value_defaults ()

+
gboolean            g_param_value_defaults              (GParamSpec *pspec,
+                                                         GValue *value);
+

+Checks whether value contains the default value as specified in pspec.

+
++ + + + + + + + + + + + + + +

pspec :

a valid GParamSpec +

value :

a GValue of correct type for pspec +

Returns :

whether value contains the canonical default for this pspec +
+
+
+
+

g_param_value_validate ()

+
gboolean            g_param_value_validate              (GParamSpec *pspec,
+                                                         GValue *value);
+

+Ensures that the contents of value comply with the specifications +set out by pspec. For example, a GParamSpecInt might require +that integers stored in value may not be smaller than -42 and not be +greater than +42. If value contains an integer outside of this range, +it is modified accordingly, so the resulting value will fit into the +range -42 .. +42.

+
++ + + + + + + + + + + + + + +

pspec :

a valid GParamSpec +

value :

a GValue of correct type for pspec +

Returns :

whether modifying value was necessary to ensure validity +
+
+
+
+

g_param_value_convert ()

+
gboolean            g_param_value_convert               (GParamSpec *pspec,
+                                                         const GValue *src_value,
+                                                         GValue *dest_value,
+                                                         gboolean strict_validation);
+

+Transforms src_value into dest_value if possible, and then +validates dest_value, in order for it to conform to pspec. If +strict_validation is TRUE this function will only succeed if the +transformed dest_value complied to pspec without modifications. +

+

+See also g_value_type_transformable(), g_value_transform() and +g_param_value_validate().

+
++ + + + + + + + + + + + + + + + + + + + + + +

pspec :

a valid GParamSpec +

src_value :

souce GValue +

dest_value :

destination GValue of correct type for pspec +

strict_validation :

TRUE requires dest_value to conform to pspec +without modifications +

Returns :

TRUE if transformation and validation were successful, + FALSE otherwise and dest_value is left untouched. +
+
+
+
+

g_param_values_cmp ()

+
gint                g_param_values_cmp                  (GParamSpec *pspec,
+                                                         const GValue *value1,
+                                                         const GValue *value2);
+

+Compares value1 with value2 according to pspec, and return -1, 0 or +1, +if value1 is found to be less than, equal to or greater than value2, +respectively.

+
++ + + + + + + + + + + + + + + + + + +

pspec :

a valid GParamSpec +

value1 :

a GValue of correct type for pspec +

value2 :

a GValue of correct type for pspec +

Returns :

-1, 0 or +1, for a less than, equal to or greater than result +
+
+
+
+

g_param_spec_get_name ()

+
const gchar*        g_param_spec_get_name               (GParamSpec *pspec);
+

+Get the name of a GParamSpec.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec +

Returns :

the name of pspec. +
+
+
+
+

g_param_spec_get_nick ()

+
const gchar*        g_param_spec_get_nick               (GParamSpec *pspec);
+

+Get the nickname of a GParamSpec.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec +

Returns :

the nickname of pspec. +
+
+
+
+

g_param_spec_get_blurb ()

+
const gchar*        g_param_spec_get_blurb              (GParamSpec *pspec);
+

+Get the short description of a GParamSpec.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec +

Returns :

the short description of pspec. +
+
+
+
+

g_param_spec_get_qdata ()

+
gpointer            g_param_spec_get_qdata              (GParamSpec *pspec,
+                                                         GQuark quark);
+

+Gets back user data pointers stored via g_param_spec_set_qdata().

+
++ + + + + + + + + + + + + + +

pspec :

a valid GParamSpec +

quark :

a GQuark, naming the user data pointer +

Returns :

the user data pointer set, or NULL +
+
+
+
+

g_param_spec_set_qdata ()

+
void                g_param_spec_set_qdata              (GParamSpec *pspec,
+                                                         GQuark quark,
+                                                         gpointer data);
+

+Sets an opaque, named pointer on a GParamSpec. The name is +specified through a GQuark (retrieved e.g. via +g_quark_from_static_string()), and the pointer can be gotten back +from the pspec with g_param_spec_get_qdata(). Setting a +previously set user data pointer, overrides (frees) the old pointer +set, using NULL as pointer essentially removes the data stored.

+
++ + + + + + + + + + + + + + +

pspec :

the GParamSpec to set store a user data pointer +

quark :

a GQuark, naming the user data pointer +

data :

an opaque user data pointer +
+
+
+
+

g_param_spec_set_qdata_full ()

+
void                g_param_spec_set_qdata_full         (GParamSpec *pspec,
+                                                         GQuark quark,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy);
+

+This function works like g_param_spec_set_qdata(), but in addition, +a void (*destroy) (gpointer) function may be +specified which is called with data as argument when the pspec is +finalized, or the data is being overwritten by a call to +g_param_spec_set_qdata() with the same quark.

+
++ + + + + + + + + + + + + + + + + + +

pspec :

the GParamSpec to set store a user data pointer +

quark :

a GQuark, naming the user data pointer +

data :

an opaque user data pointer +

destroy :

function to invoke with data as argument, when data needs to + be freed +
+
+
+
+

g_param_spec_steal_qdata ()

+
gpointer            g_param_spec_steal_qdata            (GParamSpec *pspec,
+                                                         GQuark quark);
+

+Gets back user data pointers stored via g_param_spec_set_qdata() +and removes the data from pspec without invoking its destroy() +function (if any was set). Usually, calling this function is only +required to update user data pointers with a destroy notifier.

+
++ + + + + + + + + + + + + + +

pspec :

the GParamSpec to get a stored user data pointer from +

quark :

a GQuark, naming the user data pointer +

Returns :

the user data pointer set, or NULL +
+
+
+
+

g_param_spec_get_redirect_target ()

+
GParamSpec*         g_param_spec_get_redirect_target    (GParamSpec *pspec);
+

+If the paramspec redirects operations to another paramspec, +returns that paramspec. Redirect is used typically for +providing a new implementation of a property in a derived +type while preserving all the properties from the parent +type. Redirection is established by creating a property +of type GParamSpecOverride. See g_object_class_override_property() +for an example of the use of this capability.

+
++ + + + + + + + + + +

pspec :

a GParamSpec +

Returns :

paramspec to which requests on this paramspec should + be redirected, or NULL if none. +
+

Since 2.4

+
+
+
+

g_param_spec_internal ()

+
gpointer            g_param_spec_internal               (GType param_type,
+                                                         const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpec instance. +

+

+A property name consists of segments consisting of ASCII letters and +digits, separated by either the '-' or '_' character. The first +character of a property name must be a letter. Names which violate these +rules lead to undefined behaviour. +

+

+When creating and looking up a GParamSpec, either separator can be +used, but they cannot be mixed. Using '-' is considerably more +efficient and in fact required when using property names as detail +strings for signals. +

+

+Beyond the name, GParamSpecs have two more descriptive +strings associated with them, the nick, which should be suitable +for use as a label for the property in a property editor, and the +blurb, which should be a somewhat longer description, suitable for +e.g. a tooltip. The nick and blurb should ideally be localized.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

param_type :

the GType for the property; must be derived from G_TYPE_PARAM +

name :

the canonical name of the property +

nick :

the nickname of the property +

blurb :

a short description of the property +

flags :

a combination of GParamFlags +

Returns :

a newly allocated GParamSpec instance +
+
+
+
+

GParamSpecTypeInfo

+
typedef struct {
+  /* type system portion */
+  guint16         instance_size;                               /* obligatory */
+  guint16         n_preallocs;                                 /* optional */
+  void		(*instance_init) (GParamSpec   *pspec); /* optional */
+
+  /* class portion */
+  GType           value_type;				       /* obligatory */
+  void          (*finalize)             (GParamSpec   *pspec); /* optional */
+  void          (*value_set_default)    (GParamSpec   *pspec,  /* recommended */
+					 GValue       *value);
+  gboolean      (*value_validate)       (GParamSpec   *pspec,  /* optional */
+					 GValue       *value);
+  gint          (*values_cmp)           (GParamSpec   *pspec,  /* recommended */
+					 const GValue *value1,
+					 const GValue *value2);
+} GParamSpecTypeInfo;
+
+

+This structure is used to provide the type system with the information +required to initialize and destruct (finalize) a parameter's class and +instances thereof. +The initialized structure is passed to the g_param_type_register_static() +The type system will perform a deep copy of this structure, so its memory +does not need to be persistent across invocation of +g_param_type_register_static().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

guint16 instance_size;

Size of the instance (object) structure. +

guint16 n_preallocs;

Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the slice allocator now. +

instance_init ()

Location of the instance initialization function (optional). +

GType value_type;

The GType of values conforming to this GParamSpec +

finalize ()

The instance finalization function (optional). +

value_set_default ()

Resets a value to the default value for pspec + (recommended, the default is g_value_reset()), see + g_param_value_set_default(). +

value_validate ()

Ensures that the contents of value comply with the + specifications set out by pspec (optional), see + g_param_value_set_validate(). +

values_cmp ()

Compares value1 with value2 according to pspec + (recommended, the default is memcmp()), see g_param_values_cmp(). +
+
+
+
+

g_param_type_register_static ()

+
GType               g_param_type_register_static        (const gchar *name,
+                                                         const GParamSpecTypeInfo *pspec_info);
+

+Registers name as the name of a new static type derived from +G_TYPE_PARAM. The type system uses the information contained in +the GParamSpecTypeInfo structure pointed to by info to manage the +GParamSpec type and its instances.

+
++ + + + + + + + + + + + + + +

name :

0-terminated string used as the name of the new GParamSpec type. +

pspec_info :

The GParamSpecTypeInfo for this GParamSpec type. +

Returns :

The new type identifier. +
+
+
+
+

GParamSpecPool

+
typedef struct _GParamSpecPool GParamSpecPool;
+

+A GParamSpecPool maintains a collection of GParamSpecs which can be +quickly accessed by owner and name. The implementation of the GObject property +system uses such a pool to store the GParamSpecs of the properties all object +types.

+
+
+
+

g_param_spec_pool_new ()

+
GParamSpecPool*     g_param_spec_pool_new               (gboolean type_prefixing);
+

+Creates a new GParamSpecPool. +

+

+If type_prefixing is TRUE, lookups in the newly created pool will +allow to specify the owner as a colon-separated prefix of the +property name, like "GtkContainer:border-width". This feature is +deprecated, so you should always set type_prefixing to FALSE.

+
++ + + + + + + + + + +

type_prefixing :

Whether the pool will support type-prefixed property names. +

Returns :

a newly allocated GParamSpecPool. +
+
+
+
+

g_param_spec_pool_insert ()

+
void                g_param_spec_pool_insert            (GParamSpecPool *pool,
+                                                         GParamSpec *pspec,
+                                                         GType owner_type);
+

+Inserts a GParamSpec in the pool.

+
++ + + + + + + + + + + + + + +

pool :

a GParamSpecPool. +

pspec :

the GParamSpec to insert +

owner_type :

a GType identifying the owner of pspec +
+
+
+
+

g_param_spec_pool_remove ()

+
void                g_param_spec_pool_remove            (GParamSpecPool *pool,
+                                                         GParamSpec *pspec);
+

+Removes a GParamSpec from the pool.

+
++ + + + + + + + + + +

pool :

a GParamSpecPool +

pspec :

the GParamSpec to remove +
+
+
+
+

g_param_spec_pool_lookup ()

+
GParamSpec*         g_param_spec_pool_lookup            (GParamSpecPool *pool,
+                                                         const gchar *param_name,
+                                                         GType owner_type,
+                                                         gboolean walk_ancestors);
+

+Looks up a GParamSpec in the pool.

+
++ + + + + + + + + + + + + + + + + + + + + + +

pool :

a GParamSpecPool +

param_name :

the name to look for +

owner_type :

the owner to look for +

walk_ancestors :

If TRUE, also try to find a GParamSpec with param_name + owned by an ancestor of owner_type. +

Returns :

The found GParamSpec, or NULL if no matching GParamSpec was found. +
+
+
+
+

g_param_spec_pool_list ()

+
GParamSpec**        g_param_spec_pool_list              (GParamSpecPool *pool,
+                                                         GType owner_type,
+                                                         guint *n_pspecs_p);
+

+Gets an array of all GParamSpecs owned by owner_type in +the pool.

+
++ + + + + + + + + + + + + + + + + + +

pool :

a GParamSpecPool +

owner_type :

the owner to look for +

n_pspecs_p :

return location for the length of the returned array +

Returns :

a newly allocated array containing pointers to all + GParamSpecs owned by owner_type in the pool +
+
+
+
+

g_param_spec_pool_list_owned ()

+
GList*              g_param_spec_pool_list_owned        (GParamSpecPool *pool,
+                                                         GType owner_type);
+

+Gets an GList of all GParamSpecs owned by owner_type in +the pool.

+
++ + + + + + + + + + + + + + +

pool :

a GParamSpecPool +

owner_type :

the owner to look for +

Returns :

a GList of all GParamSpecs owned by owner_type + in the poolGParamSpecs. +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Generic-values.html b/docs/reference/gobject/html/gobject-Generic-values.html new file mode 100644 index 0000000..00ade73 --- /dev/null +++ b/docs/reference/gobject/html/gobject-Generic-values.html @@ -0,0 +1,719 @@ + + + + +Generic values + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Generic values

+

Generic values — A polymorphic type that can hold values of any + other type

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+#define             G_VALUE_HOLDS                       (value,type)
+#define             G_VALUE_TYPE                        (value)
+#define             G_VALUE_TYPE_NAME                   (value)
+#define             G_TYPE_IS_VALUE                     (type)
+#define             G_TYPE_IS_VALUE_ABSTRACT            (type)
+#define             G_IS_VALUE                          (value)
+                    GValue;
+#define             G_TYPE_VALUE
+#define             G_TYPE_VALUE_ARRAY
+GValue*             g_value_init                        (GValue *value,
+                                                         GType g_type);
+void                g_value_copy                        (const GValue *src_value,
+                                                         GValue *dest_value);
+GValue*             g_value_reset                       (GValue *value);
+void                g_value_unset                       (GValue *value);
+void                g_value_set_instance                (GValue *value,
+                                                         gpointer instance);
+gboolean            g_value_fits_pointer                (const GValue *value);
+gpointer            g_value_peek_pointer                (const GValue *value);
+gboolean            g_value_type_compatible             (GType src_type,
+                                                         GType dest_type);
+gboolean            g_value_type_transformable          (GType src_type,
+                                                         GType dest_type);
+gboolean            g_value_transform                   (const GValue *src_value,
+                                                         GValue *dest_value);
+void                (*GValueTransform)                  (const GValue *src_value,
+                                                         GValue *dest_value);
+void                g_value_register_transform_func     (GType src_type,
+                                                         GType dest_type,
+                                                         GValueTransform transform_func);
+gchar*              g_strdup_value_contents             (const GValue *value);
+
+
+
+

Description

+

+The GValue structure is basically a variable container that consists +of a type identifier and a specific value of that type. +The type identifier within a GValue structure always determines the +type of the associated value. +To create a undefined GValue structure, simply create a zero-filled +GValue structure. To initialize the GValue, use the g_value_init() +function. A GValue cannot be used until it is initialized. +The basic type operations (such as freeing and copying) are determined +by the GTypeValueTable associated with the type ID stored in the GValue. +Other GValue operations (such as converting values between types) are +provided by this interface. +

+

+The code in the example program below demonstrates GValue's +features. +

+

+

+
+#include <glib-object.h>
+
+static void
+int2string (const GValue *src_value,
+            GValue       *dest_value)
+{
+  if (g_value_get_int (src_value) == 42)
+    g_value_set_static_string (dest_value, "An important number");
+  else
+    g_value_set_static_string (dest_value, "What's that?");
+}
+
+int
+main (int   argc,
+      char *argv[])
+{
+  /* GValues must start zero-filled */
+  GValue a = {0};
+  GValue b = {0};
+  const gchar *message;
+
+  g_type_init ();
+
+  /* The GValue starts empty */
+  g_assert (!G_VALUE_HOLDS_STRING (&a));
+
+  /* Put a string in it */
+  g_value_init (&a, G_TYPE_STRING);
+  g_assert (G_VALUE_HOLDS_STRING (&a));
+  g_value_set_static_string (&a, "Hello, world!");
+  g_printf ("%s\n", g_value_get_string (&a));
+
+  /* Reset it to its pristine state */
+  g_value_unset (&a);
+
+  /* It can then be reused for another type */
+  g_value_init (&a, G_TYPE_INT);
+  g_value_set_int (&a, 42);
+
+  /* Attempt to transform it into a GValue of type STRING */
+  g_value_init (&b, G_TYPE_STRING);
+
+  /* An INT is transformable to a STRING */
+  g_assert (g_value_type_transformable (G_TYPE_INT, G_TYPE_STRING));
+
+  g_value_transform (&a, &b);
+  g_printf ("%s\n", g_value_get_string (&b));
+
+  /* Attempt to transform it again using a custom transform function */
+  g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, int2string);
+  g_value_transform (&a, &b);
+  g_printf ("%s\n", g_value_get_string (&b));
+  return 0;
+}
+
+
+
+

Details

+
+

G_VALUE_HOLDS()

+
#define G_VALUE_HOLDS(value,type) (G_TYPE_CHECK_VALUE_TYPE ((value), (type)))
+
+

+Checks if value holds (or contains) a value of type. +This macro will also check for value != NULL and issue a +warning if the check fails.

+
++ + + + + + + + + + + + + + +

value :

A GValue structure. +

type :

A GType value. +

Returns :

TRUE if value holds the type. +
+
+
+
+

G_VALUE_TYPE()

+
#define G_VALUE_TYPE(value)		(((GValue*) (value))->g_type)
+
+

+Get the type identifier of value.

+
++ + + + + + + + + + +

value :

A GValue structure. +

Returns :

the GType. +
+
+
+
+

G_VALUE_TYPE_NAME()

+
#define G_VALUE_TYPE_NAME(value) (g_type_name (G_VALUE_TYPE (value)))
+
+

+Gets the the type name of value.

+
++ + + + + + + + + + +

value :

A GValue structure. +

Returns :

the type name. +
+
+
+
+

G_TYPE_IS_VALUE()

+
#define G_TYPE_IS_VALUE(type)		(g_type_check_is_value_type (type))
+
+

+Checks whether the passed in type ID can be used for g_value_init(). +That is, this macro checks whether this type provides an implementation +of the GTypeValueTable functions required for a type to create a GValue of.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

Whether type is suitable as a GValue type. +
+
+
+
+

G_TYPE_IS_VALUE_ABSTRACT()

+
#define G_TYPE_IS_VALUE_ABSTRACT(type)          (g_type_test_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT))
+
+

+Checks if type is an abstract value type. An abstract value type introduces +a value table, but can't be used for g_value_init() and is normally used as +an abstract base type for derived value types.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_IS_VALUE()

+
#define G_IS_VALUE(value)		(G_TYPE_CHECK_VALUE (value))
+
+

+Checks if value is a valid and initialized GValue structure.

+
++ + + + + + + + + + +

value :

A GValue structure. +

Returns :

TRUE on success. +
+
+
+
+

GValue

+
typedef struct {
+} GValue;
+
+

+An opaque structure used to hold different types of values. +The data within the structure has protected scope: it is accessible only +to functions within a GTypeValueTable structure, or implementations of +the g_value_*() API. That is, code portions which implement new fundamental +types. +GValue users can not make any assumptions about how data is stored +within the 2 element data union, and the g_type member should +only be accessed through the G_VALUE_TYPE() macro.

+
+
+
+

G_TYPE_VALUE

+
#define G_TYPE_VALUE		(g_value_get_type ())
+
+

+The type ID of the "GValue" type which is a boxed type, +used to pass around pointers to GValues.

+
+
+
+

G_TYPE_VALUE_ARRAY

+
#define G_TYPE_VALUE_ARRAY (g_value_array_get_type ())
+
+

+The type ID of the "GValueArray" type which is a boxed type, +used to pass around pointers to GValueArrays.

+
+
+
+

g_value_init ()

+
GValue*             g_value_init                        (GValue *value,
+                                                         GType g_type);
+

+Initializes value with the default value of type.

+
++ + + + + + + + + + + + + + +

value :

A zero-filled (uninitialized) GValue structure. +

g_type :

Type the GValue should hold values of. +

Returns :

the GValue structure that has been passed in +
+
+
+
+

g_value_copy ()

+
void                g_value_copy                        (const GValue *src_value,
+                                                         GValue *dest_value);
+

+Copies the value of src_value into dest_value.

+
++ + + + + + + + + + +

src_value :

An initialized GValue structure. +

dest_value :

An initialized GValue structure of the same type as src_value. +
+
+
+
+

g_value_reset ()

+
GValue*             g_value_reset                       (GValue *value);
+

+Clears the current value in value and resets it to the default value +(as if the value had just been initialized).

+
++ + + + + + + + + + +

value :

An initialized GValue structure. +

Returns :

the GValue structure that has been passed in +
+
+
+
+

g_value_unset ()

+
void                g_value_unset                       (GValue *value);
+

+Clears the current value in value and "unsets" the type, +this releases all resources associated with this GValue. +An unset value is the same as an uninitialized (zero-filled) +GValue structure.

+
++ + + + +

value :

An initialized GValue structure. +
+
+
+
+

g_value_set_instance ()

+
void                g_value_set_instance                (GValue *value,
+                                                         gpointer instance);
+

+Sets value from an instantiatable type via the +value_table's collect_value() function.

+
++ + + + + + + + + + +

value :

An initialized GValue structure. +

instance :

the instance +
+
+
+
+

g_value_fits_pointer ()

+
gboolean            g_value_fits_pointer                (const GValue *value);
+

+Determines if value will fit inside the size of a pointer value. +This is an internal function introduced mainly for C marshallers.

+
++ + + + + + + + + + +

value :

An initialized GValue structure. +

Returns :

TRUE if value will fit inside a pointer value. +
+
+
+
+

g_value_peek_pointer ()

+
gpointer            g_value_peek_pointer                (const GValue *value);
+

+Return the value contents as pointer. This function asserts that +g_value_fits_pointer() returned TRUE for the passed in value. +This is an internal function introduced mainly for C marshallers.

+
++ + + + + + + + + + +

value :

An initialized GValue structure. +

Returns :

TRUE if value will fit inside a pointer value. +
+
+
+
+

g_value_type_compatible ()

+
gboolean            g_value_type_compatible             (GType src_type,
+                                                         GType dest_type);
+

+Returns whether a GValue of type src_type can be copied into +a GValue of type dest_type.

+
++ + + + + + + + + + + + + + +

src_type :

source type to be copied. +

dest_type :

destination type for copying. +

Returns :

TRUE if g_value_copy() is possible with src_type and dest_type. +
+
+
+
+

g_value_type_transformable ()

+
gboolean            g_value_type_transformable          (GType src_type,
+                                                         GType dest_type);
+

+Check whether g_value_transform() is able to transform values +of type src_type into values of type dest_type.

+
++ + + + + + + + + + + + + + +

src_type :

Source type. +

dest_type :

Target type. +

Returns :

TRUE if the transformation is possible, FALSE otherwise. +
+
+
+
+

g_value_transform ()

+
gboolean            g_value_transform                   (const GValue *src_value,
+                                                         GValue *dest_value);
+

+Tries to cast the contents of src_value into a type appropriate +to store in dest_value, e.g. to transform a G_TYPE_INT value +into a G_TYPE_FLOAT value. Performing transformations between +value types might incur precision lossage. Especially +transformations into strings might reveal seemingly arbitrary +results and shouldn't be relied upon for production code (such +as rcfile value or object property serialization).

+
++ + + + + + + + + + + + + + +

src_value :

Source value. +

dest_value :

Target value. +

Returns :

Whether a transformation rule was found and could be applied. + Upon failing transformations, dest_value is left untouched. +
+
+
+
+

GValueTransform ()

+
void                (*GValueTransform)                  (const GValue *src_value,
+                                                         GValue *dest_value);
+

+The type of value transformation functions which can be registered with +g_value_register_transform_func().

+
++ + + + + + + + + + +

src_value :

Source value. +

dest_value :

Target value. +
+
+
+
+

g_value_register_transform_func ()

+
void                g_value_register_transform_func     (GType src_type,
+                                                         GType dest_type,
+                                                         GValueTransform transform_func);
+

+Registers a value transformation function for use in g_value_transform(). +A previously registered transformation function for src_type and dest_type +will be replaced.

+
++ + + + + + + + + + + + + + +

src_type :

Source type. +

dest_type :

Target type. +

transform_func :

a function which transforms values of type src_type + into value of type dest_type +
+
+
+
+

g_strdup_value_contents ()

+
gchar*              g_strdup_value_contents             (const GValue *value);
+

+Return a newly allocated string, which describes the contents of a +GValue. The main purpose of this function is to describe GValue +contents for debugging output, the way in which the contents are +described may change between different GLib versions.

+
++ + + + + + + + + + +

value :

GValue which contents are to be described. +

Returns :

Newly allocated string. +
+
+
+
+

See Also

+The fundamental types which all support GValue + operations and thus can be used as a type initializer for + g_value_init() are defined by a separate interface. See the Standard + Values API for details. +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Signals.html b/docs/reference/gobject/html/gobject-Signals.html new file mode 100644 index 0000000..2cfa68f --- /dev/null +++ b/docs/reference/gobject/html/gobject-Signals.html @@ -0,0 +1,2674 @@ + + + + +Signals + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Signals

+

Signals — A means for customization of object behaviour + and a general purpose notification mechanism

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+                    GSignalInvocationHint;
+gboolean            (*GSignalAccumulator)               (GSignalInvocationHint *ihint,
+                                                         GValue *return_accu,
+                                                         const GValue *handler_return,
+                                                         gpointer data);
+typedef             GSignalCMarshaller;
+gboolean            (*GSignalEmissionHook)              (GSignalInvocationHint *ihint,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer data);
+enum                GSignalFlags;
+enum                GSignalMatchType;
+                    GSignalQuery;
+#define             G_SIGNAL_TYPE_STATIC_SCOPE
+#define             G_SIGNAL_MATCH_MASK
+#define             G_SIGNAL_FLAGS_MASK
+guint               g_signal_new                        (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         guint class_offset,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         ...);
+guint               g_signal_newv                       (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         GClosure *class_closure,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         GType *param_types);
+guint               g_signal_new_valist                 (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         GClosure *class_closure,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         va_list args);
+void                g_signal_query                      (guint signal_id,
+                                                         GSignalQuery *query);
+guint               g_signal_lookup                     (const gchar *name,
+                                                         GType itype);
+const gchar*        g_signal_name                       (guint signal_id);
+guint*              g_signal_list_ids                   (GType itype,
+                                                         guint *n_ids);
+void                g_signal_emit                       (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         ...);
+void                g_signal_emit_by_name               (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         ...);
+void                g_signal_emitv                      (const GValue *instance_and_params,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GValue *return_value);
+void                g_signal_emit_valist                (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         va_list var_args);
+#define             g_signal_connect                    (instance, detailed_signal, c_handler, data)
+#define             g_signal_connect_after              (instance, detailed_signal, c_handler, data)
+#define             g_signal_connect_swapped            (instance, detailed_signal, c_handler, data)
+gulong              g_signal_connect_object             (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         GCallback c_handler,
+                                                         gpointer gobject,
+                                                         GConnectFlags connect_flags);
+enum                GConnectFlags;
+gulong              g_signal_connect_data               (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         GCallback c_handler,
+                                                         gpointer data,
+                                                         GClosureNotify destroy_data,
+                                                         GConnectFlags connect_flags);
+gulong              g_signal_connect_closure            (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         GClosure *closure,
+                                                         gboolean after);
+gulong              g_signal_connect_closure_by_id      (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gboolean after);
+void                g_signal_handler_block              (gpointer instance,
+                                                         gulong handler_id);
+void                g_signal_handler_unblock            (gpointer instance,
+                                                         gulong handler_id);
+void                g_signal_handler_disconnect         (gpointer instance,
+                                                         gulong handler_id);
+gulong              g_signal_handler_find               (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+guint               g_signal_handlers_block_matched     (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+guint               g_signal_handlers_unblock_matched   (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+guint               g_signal_handlers_disconnect_matched
+                                                        (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+gboolean            g_signal_handler_is_connected       (gpointer instance,
+                                                         gulong handler_id);
+#define             g_signal_handlers_block_by_func     (instance, func, data)
+#define             g_signal_handlers_unblock_by_func   (instance, func, data)
+#define             g_signal_handlers_disconnect_by_func(instance, func, data)
+gboolean            g_signal_has_handler_pending        (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         gboolean may_be_blocked);
+void                g_signal_stop_emission              (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail);
+void                g_signal_stop_emission_by_name      (gpointer instance,
+                                                         const gchar *detailed_signal);
+void                g_signal_override_class_closure     (guint signal_id,
+                                                         GType instance_type,
+                                                         GClosure *class_closure);
+void                g_signal_chain_from_overridden      (const GValue *instance_and_params,
+                                                         GValue *return_value);
+guint               g_signal_new_class_handler          (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         GCallback class_handler,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         ...);
+void                g_signal_override_class_handler     (const gchar *signal_name,
+                                                         GType instance_type,
+                                                         GCallback class_handler);
+void                g_signal_chain_from_overridden_handler
+                                                        (gpointer instance,
+                                                         ...);
+gulong              g_signal_add_emission_hook          (guint signal_id,
+                                                         GQuark detail,
+                                                         GSignalEmissionHook hook_func,
+                                                         gpointer hook_data,
+                                                         GDestroyNotify data_destroy);
+void                g_signal_remove_emission_hook       (guint signal_id,
+                                                         gulong hook_id);
+gboolean            g_signal_parse_name                 (const gchar *detailed_signal,
+                                                         GType itype,
+                                                         guint *signal_id_p,
+                                                         GQuark *detail_p,
+                                                         gboolean force_detail_quark);
+GSignalInvocationHint* g_signal_get_invocation_hint     (gpointer instance);
+GClosure*           g_signal_type_cclosure_new          (GType itype,
+                                                         guint struct_offset);
+gboolean            g_signal_accumulator_true_handled   (GSignalInvocationHint *ihint,
+                                                         GValue *return_accu,
+                                                         const GValue *handler_return,
+                                                         gpointer dummy);
+
+
+
+

Description

+

+The basic concept of the signal system is that of the +emission of a signal. Signals are introduced +per-type and are identified through strings. Signals introduced +for a parent type are available in derived types as well, so +basically they are a per-type facility that is inherited. A signal +emission mainly involves invocation of a certain set of callbacks +in precisely defined manner. There are two main categories of such +callbacks, per-object +[10] +ones and user provided ones. +The per-object callbacks are most often referred to as "object method +handler" or "default (signal) handler", while user provided callbacks are +usually just called "signal handler". +The object method handler is provided at signal creation time (this most +frequently happens at the end of an object class' creation), while user +provided handlers are frequently connected and disconnected to/from a certain +signal on certain object instances. +

+

+A signal emission consists of five stages, unless prematurely stopped: +

+
++ + + + + + + + + + + + + + + + + + + + + + +

+ 1 - Invocation of the object method handler for G_SIGNAL_RUN_FIRST signals +

+ 2 - Invocation of normal user-provided signal handlers (after flag FALSE) +

+ 3 - Invocation of the object method handler for G_SIGNAL_RUN_LAST signals +

+ 4 - Invocation of user provided signal handlers, connected with an after flag of TRUE +

+ 5 - Invocation of the object method handler for G_SIGNAL_RUN_CLEANUP signals +

+

+The user-provided signal handlers are called in the order they were +connected in. +All handlers may prematurely stop a signal emission, and any number of +handlers may be connected, disconnected, blocked or unblocked during +a signal emission. +There are certain criteria for skipping user handlers in stages 2 and 4 +of a signal emission. +First, user handlers may be blocked, blocked handlers are omitted +during callback invocation, to return from the "blocked" state, a +handler has to get unblocked exactly the same amount of times +it has been blocked before. +Second, upon emission of a G_SIGNAL_DETAILED signal, an additional +"detail" argument passed in to g_signal_emit() has to match the detail +argument of the signal handler currently subject to invocation. +Specification of no detail argument for signal handlers (omission of the +detail part of the signal specification upon connection) serves as a +wildcard and matches any detail argument passed in to emission.

+
+
+

Details

+
+

GSignalInvocationHint

+
typedef struct {
+  guint		signal_id;
+  GQuark detail;
+  GSignalFlags run_type;
+} GSignalInvocationHint;
+
+

+The GSignalInvocationHint structure is used to pass on additional information +to callbacks during a signal emission.

+
++ + + + + + + + + + + + + + +

guint signal_id;

The signal id of the signal invoking the callback +

GQuark detail;

The detail passed on for this emission +

GSignalFlags run_type;

The stage the signal emission is currently in, this + field will contain one of G_SIGNAL_RUN_FIRST, + G_SIGNAL_RUN_LAST or G_SIGNAL_RUN_CLEANUP. +
+
+
+
+

GSignalAccumulator ()

+
gboolean            (*GSignalAccumulator)               (GSignalInvocationHint *ihint,
+                                                         GValue *return_accu,
+                                                         const GValue *handler_return,
+                                                         gpointer data);
+

+The signal accumulator is a special callback function that can be used +to collect return values of the various callbacks that are called +during a signal emission. The signal accumulator is specified at signal +creation time, if it is left NULL, no accumulation of callback return +values is performed. The return value of signal emissions is then the +value returned by the last callback.

+
++ + + + + + + + + + + + + + + + + + + + + + +

ihint :

Signal invocation hint, see GSignalInvocationHint. +

return_accu :

Accumulator to collect callback return values in, this + is the return value of the current signal emission. +

handler_return :

A GValue holding the return value of the signal handler. +

data :

Callback data that was specified when creating the signal. +

Returns :

The accumulator function returns whether the signal emission + should be aborted. Returning FALSE means to abort the + current emission and TRUE is returned for continuation. +
+
+
+
+

GSignalCMarshaller

+
typedef GClosureMarshal			 GSignalCMarshaller;
+
+

+This is the signature of marshaller functions, required to marshall +arrays of parameter values to signal emissions into C language callback +invocations. It is merely an alias to GClosureMarshal since the GClosure +mechanism takes over responsibility of actual function invocation for the +signal system.

+
+
+
+

GSignalEmissionHook ()

+
gboolean            (*GSignalEmissionHook)              (GSignalInvocationHint *ihint,
+                                                         guint n_param_values,
+                                                         const GValue *param_values,
+                                                         gpointer data);
+

+A simple function pointer to get invoked when the signal is emitted. This +allows you to tie a hook to the signal type, so that it will trap all +emissions of that signal, from any object. +

+

+You may not attach these to signals created with the G_SIGNAL_NO_HOOKS flag.

+
++ + + + + + + + + + + + + + + + + + + + + + +

ihint :

Signal invocation hint, see GSignalInvocationHint. +

n_param_values :

the number of parameters to the function, including + the instance on which the signal was emitted. +

param_values :

the instance on which the signal was emitted, followed by the + parameters of the emission. +

data :

user data associated with the hook. +

Returns :

whether it wants to stay connected. If it returns FALSE, the signal + hook is disconnected (and destroyed). +
+
+
+
+

enum GSignalFlags

+
typedef enum
+{
+  G_SIGNAL_RUN_FIRST = 1 << 0,
+  G_SIGNAL_RUN_LAST = 1 << 1,
+  G_SIGNAL_RUN_CLEANUP = 1 << 2,
+  G_SIGNAL_NO_RECURSE = 1 << 3,
+  G_SIGNAL_DETAILED = 1 << 4,
+  G_SIGNAL_ACTION = 1 << 5,
+  G_SIGNAL_NO_HOOKS = 1 << 6
+} GSignalFlags;
+
+

+The signal flags are used to specify a signal's behaviour, the overall +signal description outlines how especially the RUN flags control the +stages of a signal emission.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

G_SIGNAL_RUN_FIRST

Invoke the object method handler in the first emission stage. +

G_SIGNAL_RUN_LAST

Invoke the object method handler in the third emission stage. +

G_SIGNAL_RUN_CLEANUP

Invoke the object method handler in the last emission stage. +

G_SIGNAL_NO_RECURSE

Signals being emitted for an object while currently being in + emission for this very object will not be emitted recursively, + but instead cause the first emission to be restarted. +

G_SIGNAL_DETAILED

This signal supports "::detail" appendices to the signal name + upon handler connections and emissions. +

G_SIGNAL_ACTION

Action signals are signals that may freely be emitted on alive + objects from user code via g_signal_emit() and friends, without + the need of being embedded into extra code that performs pre or + post emission adjustments on the object. They can also be thought + of as object methods which can be called generically by + third-party code. +

G_SIGNAL_NO_HOOKS

No emissions hooks are supported for this signal. +
+
+
+
+

enum GSignalMatchType

+
typedef enum
+{
+  G_SIGNAL_MATCH_ID	   = 1 << 0,
+  G_SIGNAL_MATCH_DETAIL	   = 1 << 1,
+  G_SIGNAL_MATCH_CLOSURE   = 1 << 2,
+  G_SIGNAL_MATCH_FUNC	   = 1 << 3,
+  G_SIGNAL_MATCH_DATA	   = 1 << 4,
+  G_SIGNAL_MATCH_UNBLOCKED = 1 << 5
+} GSignalMatchType;
+
+

+The match types specify what g_signal_handlers_block_matched(), +g_signal_handlers_unblock_matched() and g_signal_handlers_disconnect_matched() +match signals by.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

G_SIGNAL_MATCH_ID

The signal id must be equal. +

G_SIGNAL_MATCH_DETAIL

The signal detail be equal. +

G_SIGNAL_MATCH_CLOSURE

The closure must be the same. +

G_SIGNAL_MATCH_FUNC

The C closure callback must be the same. +

G_SIGNAL_MATCH_DATA

The closure data must be the same. +

G_SIGNAL_MATCH_UNBLOCKED

Only unblocked signals may matched. +
+
+
+
+

GSignalQuery

+
typedef struct {
+  guint		signal_id;
+  const gchar  *signal_name;
+  GType		itype;
+  GSignalFlags signal_flags;
+  GType		return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
+  guint		n_params;
+  const GType  *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
+} GSignalQuery;
+
+

+A structure holding in-depth information for a specific signal. It is +filled in by the g_signal_query() function.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

guint signal_id;

The signal id of the signal being queried, or 0 if the + signal to be queried was unknown. +

const gchar *signal_name;

The signal name. +

GType itype;

The interface/instance type that this signal can be emitted for. +

GSignalFlags signal_flags;

The signal flags as passed in to g_signal_new(). +

GType return_type;

The return type for user callbacks. +

guint n_params;

The number of parameters that user callbacks take. +

const GType *param_types;

The individual parameter types for user callbacks, note that the + effective callback signature is: +
+ @return_type callback (gpointer     data1,
+ [param_types param_names,]
+ gpointer     data2);
+ 
+
+
+
+
+

G_SIGNAL_TYPE_STATIC_SCOPE

+
#define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT)
+
+

+This macro flags signal argument types for which the signal system may +assume that instances thereof remain persistent across all signal emissions +they are used in. This is only useful for non ref-counted, value-copy types. +

+

+To flag a signal argument in this way, add +| G_SIGNAL_TYPE_STATIC_SCOPE to the corresponding argument +of g_signal_new(). +

+
+g_signal_new ("size_request",
+  G_TYPE_FROM_CLASS (gobject_class),
+	 G_SIGNAL_RUN_FIRST,
+	 G_STRUCT_OFFSET (GtkWidgetClass, size_request),
+	 NULL, NULL,
+	 _gtk_marshal_VOID__BOXED,
+	 G_TYPE_NONE, 1,
+	 GTK_TYPE_REQUISITION | G_SIGNAL_TYPE_STATIC_SCOPE);
+
+
+
+
+

G_SIGNAL_MATCH_MASK

+
#define G_SIGNAL_MATCH_MASK  0x3f
+
+

+A mask for all GSignalMatchType bits.

+
+
+
+

G_SIGNAL_FLAGS_MASK

+
#define G_SIGNAL_FLAGS_MASK  0x7f
+
+

+A mask for all GSignalFlags bits.

+
+
+
+

g_signal_new ()

+
guint               g_signal_new                        (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         guint class_offset,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         ...);
+

+Creates a new signal. (This is usually done in the class initializer.) +

+

+A signal name consists of segments consisting of ASCII letters and +digits, separated by either the '-' or '_' character. The first +character of a signal name must be a letter. Names which violate these +rules lead to undefined behaviour of the GSignal system. +

+

+When registering a signal and looking up a signal, either separator can +be used, but they cannot be mixed. +

+

+If 0 is used for class_offset subclasses cannot override the class handler +in their class_init method by doing +super_class->signal_handler = my_signal_handler. Instead they +will have to use g_signal_override_class_handler().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

signal_name :

the name for the signal +

itype :

the type this signal pertains to. It will also pertain to + types which are derived from this type. +

signal_flags :

a combination of GSignalFlags specifying detail of when + the default handler is to be invoked. You should at least specify + G_SIGNAL_RUN_FIRST or G_SIGNAL_RUN_LAST. +

class_offset :

The offset of the function pointer in the class structure + for this type. Used to invoke a class method generically. Pass 0 to + not associate a class method slot with this signal. +

accumulator :

the accumulator for this signal; may be NULL. +

accu_data :

user data for the accumulator. +

c_marshaller :

the function to translate arrays of parameter values to + signal emissions into C language callback invocations. +

return_type :

the type of return value, or G_TYPE_NONE for a signal + without a return value. +

n_params :

the number of parameter types to follow. +

... :

a list of types, one for each parameter. +

Returns :

the signal id +
+
+
+
+

g_signal_newv ()

+
guint               g_signal_newv                       (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         GClosure *class_closure,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         GType *param_types);
+

+Creates a new signal. (This is usually done in the class initializer.) +

+

+See g_signal_new() for details on allowed signal names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

signal_name :

the name for the signal +

itype :

the type this signal pertains to. It will also pertain to + types which are derived from this type +

signal_flags :

a combination of GSignalFlags specifying detail of when + the default handler is to be invoked. You should at least specify + G_SIGNAL_RUN_FIRST or G_SIGNAL_RUN_LAST +

class_closure :

The closure to invoke on signal emission; may be NULL +

accumulator :

the accumulator for this signal; may be NULL +

accu_data :

user data for the accumulator +

c_marshaller :

the function to translate arrays of parameter values to + signal emissions into C language callback invocations +

return_type :

the type of return value, or G_TYPE_NONE for a signal + without a return value +

n_params :

the length of param_types +

param_types :

an array of types, one for each parameter +

Returns :

the signal id +
+
+
+
+

g_signal_new_valist ()

+
guint               g_signal_new_valist                 (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         GClosure *class_closure,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         va_list args);
+

+Creates a new signal. (This is usually done in the class initializer.) +

+

+See g_signal_new() for details on allowed signal names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

signal_name :

the name for the signal +

itype :

the type this signal pertains to. It will also pertain to + types which are derived from this type. +

signal_flags :

a combination of GSignalFlags specifying detail of when + the default handler is to be invoked. You should at least specify + G_SIGNAL_RUN_FIRST or G_SIGNAL_RUN_LAST. +

class_closure :

The closure to invoke on signal emission; may be NULL. +

accumulator :

the accumulator for this signal; may be NULL. +

accu_data :

user data for the accumulator. +

c_marshaller :

the function to translate arrays of parameter values to + signal emissions into C language callback invocations. +

return_type :

the type of return value, or G_TYPE_NONE for a signal + without a return value. +

n_params :

the number of parameter types in args. +

args :

va_list of GType, one for each parameter. +

Returns :

the signal id +
+
+
+
+

g_signal_query ()

+
void                g_signal_query                      (guint signal_id,
+                                                         GSignalQuery *query);
+

+Queries the signal system for in-depth information about a +specific signal. This function will fill in a user-provided +structure to hold signal-specific information. If an invalid +signal id is passed in, the signal_id member of the GSignalQuery +is 0. All members filled into the GSignalQuery structure should +be considered constant and have to be left untouched.

+
++ + + + + + + + + + +

signal_id :

The signal id of the signal to query information for. +

query :

A user provided structure that is filled in with constant + values upon success. +
+
+
+
+

g_signal_lookup ()

+
guint               g_signal_lookup                     (const gchar *name,
+                                                         GType itype);
+

+Given the name of the signal and the type of object it connects to, gets +the signal's identifying integer. Emitting the signal by number is +somewhat faster than using the name each time. +

+

+Also tries the ancestors of the given type. +

+

+See g_signal_new() for details on allowed signal names.

+
++ + + + + + + + + + + + + + +

name :

the signal's name. +

itype :

the type that the signal operates on. +

Returns :

the signal's identifying number, or 0 if no signal was found. +
+
+
+
+

g_signal_name ()

+
const gchar*        g_signal_name                       (guint signal_id);
+

+Given the signal's identifier, finds its name. +

+

+Two different signals may have the same name, if they have differing types.

+
++ + + + + + + + + + +

signal_id :

the signal's identifying number. +

Returns :

the signal name, or NULL if the signal number was invalid. +
+
+
+
+

g_signal_list_ids ()

+
guint*              g_signal_list_ids                   (GType itype,
+                                                         guint *n_ids);
+

+Lists the signals by id that a certain instance or interface type +created. Further information about the signals can be acquired through +g_signal_query().

+
++ + + + + + + + + + + + + + +

itype :

Instance or interface type. +

n_ids :

Location to store the number of signal ids for itype. +

Returns :

Newly allocated array of signal IDs. +
+
+
+
+

g_signal_emit ()

+
void                g_signal_emit                       (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         ...);
+

+Emits a signal. +

+

+Note that g_signal_emit() resets the return value to the default +if no handlers are connected, in contrast to g_signal_emitv().

+
++ + + + + + + + + + + + + + + + + + +

instance :

the instance the signal is being emitted on. +

signal_id :

the signal id +

detail :

the detail +

... :

parameters to be passed to the signal, followed by a + location for the return value. If the return type of the signal + is G_TYPE_NONE, the return value location can be omitted. +
+
+
+
+

g_signal_emit_by_name ()

+
void                g_signal_emit_by_name               (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         ...);
+

+Emits a signal. +

+

+Note that g_signal_emit_by_name() resets the return value to the default +if no handlers are connected, in contrast to g_signal_emitv().

+
++ + + + + + + + + + + + + + +

instance :

the instance the signal is being emitted on. +

detailed_signal :

a string of the form "signal-name::detail". +

... :

parameters to be passed to the signal, followed by a + location for the return value. If the return type of the signal + is G_TYPE_NONE, the return value location can be omitted. +
+
+
+
+

g_signal_emitv ()

+
void                g_signal_emitv                      (const GValue *instance_and_params,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GValue *return_value);
+

+Emits a signal. +

+

+Note that g_signal_emitv() doesn't change return_value if no handlers are +connected, in contrast to g_signal_emit() and g_signal_emit_valist().

+
++ + + + + + + + + + + + + + + + + + +

instance_and_params :

argument list for the signal emission. The first + element in the array is a GValue for the instance the signal is + being emitted on. The rest are any arguments to be passed to the + signal. +

signal_id :

the signal id +

detail :

the detail +

return_value :

Location to store the return value of the signal emission. +
+
+
+
+

g_signal_emit_valist ()

+
void                g_signal_emit_valist                (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         va_list var_args);
+

+Emits a signal. +

+

+Note that g_signal_emit_valist() resets the return value to the default +if no handlers are connected, in contrast to g_signal_emitv().

+
++ + + + + + + + + + + + + + + + + + +

instance :

the instance the signal is being emitted on. +

signal_id :

the signal id +

detail :

the detail +

var_args :

a list of parameters to be passed to the signal, followed by a + location for the return value. If the return type of the signal + is G_TYPE_NONE, the return value location can be omitted. +
+
+
+
+

g_signal_connect()

+
#define             g_signal_connect(instance, detailed_signal, c_handler, data)
+

+Connects a GCallback function to a signal for a particular object. +

+

+The handler will be called before the default handler of the signal.

+
++ + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

detailed_signal :

a string of the form "signal-name::detail". +

c_handler :

the GCallback to connect. +

data :

data to pass to c_handler calls. +

Returns :

the handler id +
+
+
+
+

g_signal_connect_after()

+
#define             g_signal_connect_after(instance, detailed_signal, c_handler, data)
+

+Connects a GCallback function to a signal for a particular object. +

+

+The handler will be called after the default handler of the signal.

+
++ + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

detailed_signal :

a string of the form "signal-name::detail". +

c_handler :

the GCallback to connect. +

data :

data to pass to c_handler calls. +

Returns :

the handler id +
+
+
+
+

g_signal_connect_swapped()

+
#define             g_signal_connect_swapped(instance, detailed_signal, c_handler, data)
+

+Connects a GCallback function to a signal for a particular object. +

+

+The instance on which the signal is emitted and data will be swapped when +calling the handler.

+
++ + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

detailed_signal :

a string of the form "signal-name::detail". +

c_handler :

the GCallback to connect. +

data :

data to pass to c_handler calls. +

Returns :

the handler id +
+
+
+
+

g_signal_connect_object ()

+
gulong              g_signal_connect_object             (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         GCallback c_handler,
+                                                         gpointer gobject,
+                                                         GConnectFlags connect_flags);
+

+This is similar to g_signal_connect_data(), but uses a closure which +ensures that the gobject stays alive during the call to c_handler +by temporarily adding a reference count to gobject. +

+

+Note that there is a bug in GObject that makes this function +much less useful than it might seem otherwise. Once gobject is +disposed, the callback will no longer be called, but, the signal +handler is not currently disconnected. If the +instance is itself being freed at the same time than this doesn't +matter, since the signal will automatically be removed, but +if instance persists, then the signal handler will leak. You +should not remove the signal yourself because in a future versions of +GObject, the handler will automatically +be disconnected. +

+

+It's possible to work around this problem in a way that will +continue to work with future versions of GObject by checking +that the signal handler is still connected before disconnected it: +

+
+ if (g_signal_handler_is_connected (instance, id))
+   g_signal_handler_disconnect (instance, id);
+
+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

detailed_signal :

a string of the form "signal-name::detail". +

c_handler :

the GCallback to connect. +

gobject :

the object to pass as data to c_handler. +

connect_flags :

a combination of GConnnectFlags. +

Returns :

the handler id. +
+
+
+
+

enum GConnectFlags

+
typedef enum
+{
+  G_CONNECT_AFTER = 1 << 0,
+  G_CONNECT_SWAPPED = 1 << 1
+} GConnectFlags;
+
+

+The connection flags are used to specify the behaviour of a signal's +connection.

+
++ + + + + + + + + + +

G_CONNECT_AFTER

whether the handler should be called before or after the + default handler of the signal. +

G_CONNECT_SWAPPED

whether the instance and data should be swapped when + calling the handler. +
+
+
+
+

g_signal_connect_data ()

+
gulong              g_signal_connect_data               (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         GCallback c_handler,
+                                                         gpointer data,
+                                                         GClosureNotify destroy_data,
+                                                         GConnectFlags connect_flags);
+

+Connects a GCallback function to a signal for a particular object. Similar +to g_signal_connect(), but allows to provide a GClosureNotify for the data +which will be called when the signal handler is disconnected and no longer +used. Specify connect_flags if you need ..._after() or +..._swapped() variants of this function.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

detailed_signal :

a string of the form "signal-name::detail". +

c_handler :

the GCallback to connect. +

data :

data to pass to c_handler calls. +

destroy_data :

a GClosureNotify for data. +

connect_flags :

a combination of GConnectFlags. +

Returns :

the handler id +
+
+
+
+

g_signal_connect_closure ()

+
gulong              g_signal_connect_closure            (gpointer instance,
+                                                         const gchar *detailed_signal,
+                                                         GClosure *closure,
+                                                         gboolean after);
+

+Connects a closure to a signal for a particular object.

+
++ + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

detailed_signal :

a string of the form "signal-name::detail". +

closure :

the closure to connect. +

after :

whether the handler should be called before or after the + default handler of the signal. +

Returns :

the handler id +
+
+
+
+

g_signal_connect_closure_by_id ()

+
gulong              g_signal_connect_closure_by_id      (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gboolean after);
+

+Connects a closure to a signal for a particular object.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

the instance to connect to. +

signal_id :

the id of the signal. +

detail :

the detail. +

closure :

the closure to connect. +

after :

whether the handler should be called before or after the + default handler of the signal. +

Returns :

the handler id +
+
+
+
+

g_signal_handler_block ()

+
void                g_signal_handler_block              (gpointer instance,
+                                                         gulong handler_id);
+

+Blocks a handler of an instance so it will not be called during any +signal emissions unless it is unblocked again. Thus "blocking" a +signal handler means to temporarily deactive it, a signal handler +has to be unblocked exactly the same amount of times it has been +blocked before to become active again. +

+

+The handler_id has to be a valid signal handler id, connected to a +signal of instance.

+
++ + + + + + + + + + +

instance :

The instance to block the signal handler of. +

handler_id :

Handler id of the handler to be blocked. +
+
+
+
+

g_signal_handler_unblock ()

+
void                g_signal_handler_unblock            (gpointer instance,
+                                                         gulong handler_id);
+

+Undoes the effect of a previous g_signal_handler_block() call. A +blocked handler is skipped during signal emissions and will not be +invoked, unblocking it (for exactly the amount of times it has been +blocked before) reverts its "blocked" state, so the handler will be +recognized by the signal system and is called upon future or +currently ongoing signal emissions (since the order in which +handlers are called during signal emissions is deterministic, +whether the unblocked handler in question is called as part of a +currently ongoing emission depends on how far that emission has +proceeded yet). +

+

+The handler_id has to be a valid id of a signal handler that is +connected to a signal of instance and is currently blocked.

+
++ + + + + + + + + + +

instance :

The instance to unblock the signal handler of. +

handler_id :

Handler id of the handler to be unblocked. +
+
+
+
+

g_signal_handler_disconnect ()

+
void                g_signal_handler_disconnect         (gpointer instance,
+                                                         gulong handler_id);
+

+Disconnects a handler from an instance so it will not be called during +any future or currently ongoing emissions of the signal it has been +connected to. The handler_id becomes invalid and may be reused. +

+

+The handler_id has to be a valid signal handler id, connected to a +signal of instance.

+
++ + + + + + + + + + +

instance :

The instance to remove the signal handler from. +

handler_id :

Handler id of the handler to be disconnected. +
+
+
+
+

g_signal_handler_find ()

+
gulong              g_signal_handler_find               (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+

+Finds the first signal handler that matches certain selection criteria. +The criteria mask is passed as an OR-ed combination of GSignalMatchType +flags, and the criteria values are passed as arguments. +The match mask has to be non-0 for successful matches. +If no handler was found, 0 is returned.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

The instance owning the signal handler to be found. +

mask :

Mask indicating which of signal_id, detail, closure, func + and/or data the handler has to match. +

signal_id :

Signal the handler has to be connected to. +

detail :

Signal detail the handler has to be connected to. +

closure :

The closure the handler will invoke. +

func :

The C closure callback of the handler (useless for non-C closures). +

data :

The closure data of the handler's closure. +

Returns :

A valid non-0 signal handler id for a successful match. +
+
+
+
+

g_signal_handlers_block_matched ()

+
guint               g_signal_handlers_block_matched     (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+

+Blocks all handlers on an instance that match a certain selection criteria. +The criteria mask is passed as an OR-ed combination of GSignalMatchType +flags, and the criteria values are passed as arguments. +Passing at least one of the G_SIGNAL_MATCH_CLOSURE, G_SIGNAL_MATCH_FUNC +or G_SIGNAL_MATCH_DATA match flags is required for successful matches. +If no handlers were found, 0 is returned, the number of blocked handlers +otherwise.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

The instance to block handlers from. +

mask :

Mask indicating which of signal_id, detail, closure, func + and/or data the handlers have to match. +

signal_id :

Signal the handlers have to be connected to. +

detail :

Signal detail the handlers have to be connected to. +

closure :

The closure the handlers will invoke. +

func :

The C closure callback of the handlers (useless for non-C closures). +

data :

The closure data of the handlers' closures. +

Returns :

The number of handlers that matched. +
+
+
+
+

g_signal_handlers_unblock_matched ()

+
guint               g_signal_handlers_unblock_matched   (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+

+Unblocks all handlers on an instance that match a certain selection +criteria. The criteria mask is passed as an OR-ed combination of +GSignalMatchType flags, and the criteria values are passed as arguments. +Passing at least one of the G_SIGNAL_MATCH_CLOSURE, G_SIGNAL_MATCH_FUNC +or G_SIGNAL_MATCH_DATA match flags is required for successful matches. +If no handlers were found, 0 is returned, the number of unblocked handlers +otherwise. The match criteria should not apply to any handlers that are +not currently blocked.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

The instance to unblock handlers from. +

mask :

Mask indicating which of signal_id, detail, closure, func + and/or data the handlers have to match. +

signal_id :

Signal the handlers have to be connected to. +

detail :

Signal detail the handlers have to be connected to. +

closure :

The closure the handlers will invoke. +

func :

The C closure callback of the handlers (useless for non-C closures). +

data :

The closure data of the handlers' closures. +

Returns :

The number of handlers that matched. +
+
+
+
+

g_signal_handlers_disconnect_matched ()

+
guint               g_signal_handlers_disconnect_matched
+                                                        (gpointer instance,
+                                                         GSignalMatchType mask,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         GClosure *closure,
+                                                         gpointer func,
+                                                         gpointer data);
+

+Disconnects all handlers on an instance that match a certain +selection criteria. The criteria mask is passed as an OR-ed +combination of GSignalMatchType flags, and the criteria values are +passed as arguments. Passing at least one of the +G_SIGNAL_MATCH_CLOSURE, G_SIGNAL_MATCH_FUNC or +G_SIGNAL_MATCH_DATA match flags is required for successful +matches. If no handlers were found, 0 is returned, the number of +disconnected handlers otherwise.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

instance :

The instance to remove handlers from. +

mask :

Mask indicating which of signal_id, detail, closure, func + and/or data the handlers have to match. +

signal_id :

Signal the handlers have to be connected to. +

detail :

Signal detail the handlers have to be connected to. +

closure :

The closure the handlers will invoke. +

func :

The C closure callback of the handlers (useless for non-C closures). +

data :

The closure data of the handlers' closures. +

Returns :

The number of handlers that matched. +
+
+
+
+

g_signal_handler_is_connected ()

+
gboolean            g_signal_handler_is_connected       (gpointer instance,
+                                                         gulong handler_id);
+

+Returns whether handler_id is the id of a handler connected to instance.

+
++ + + + + + + + + + + + + + +

instance :

The instance where a signal handler is sought. +

handler_id :

the handler id. +

Returns :

whether handler_id identifies a handler connected to instance. +
+
+
+
+

g_signal_handlers_block_by_func()

+
#define             g_signal_handlers_block_by_func(instance, func, data)
+

+Blocks all handlers on an instance that match func and data.

+
++ + + + + + + + + + + + + + + + + + +

instance :

The instance to block handlers from. +

func :

The C closure callback of the handlers (useless for non-C closures). +

data :

The closure data of the handlers' closures. +

Returns :

The number of handlers that matched. +
+
+
+
+

g_signal_handlers_unblock_by_func()

+
#define             g_signal_handlers_unblock_by_func(instance, func, data)
+

+Unblocks all handlers on an instance that match func and data.

+
++ + + + + + + + + + + + + + + + + + +

instance :

The instance to unblock handlers from. +

func :

The C closure callback of the handlers (useless for non-C closures). +

data :

The closure data of the handlers' closures. +

Returns :

The number of handlers that matched. +
+
+
+
+

g_signal_handlers_disconnect_by_func()

+
#define             g_signal_handlers_disconnect_by_func(instance, func, data)
+

+Disconnects all handlers on an instance that match func and data.

+
++ + + + + + + + + + + + + + + + + + +

instance :

The instance to remove handlers from. +

func :

The C closure callback of the handlers (useless for non-C closures). +

data :

The closure data of the handlers' closures. +

Returns :

The number of handlers that matched. +
+
+
+
+

g_signal_has_handler_pending ()

+
gboolean            g_signal_has_handler_pending        (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail,
+                                                         gboolean may_be_blocked);
+

+Returns whether there are any handlers connected to instance for the +given signal id and detail. +

+

+One example of when you might use this is when the arguments to the +signal are difficult to compute. A class implementor may opt to not +emit the signal if no one is attached anyway, thus saving the cost +of building the arguments.

+
++ + + + + + + + + + + + + + + + + + + + + + +

instance :

the object whose signal handlers are sought. +

signal_id :

the signal id. +

detail :

the detail. +

may_be_blocked :

whether blocked handlers should count as match. +

Returns :

TRUE if a handler is connected to the signal, FALSE + otherwise. +
+
+
+
+

g_signal_stop_emission ()

+
void                g_signal_stop_emission              (gpointer instance,
+                                                         guint signal_id,
+                                                         GQuark detail);
+

+Stops a signal's current emission. +

+

+This will prevent the default method from running, if the signal was +G_SIGNAL_RUN_LAST and you connected normally (i.e. without the "after" +flag). +

+

+Prints a warning if used on a signal which isn't being emitted.

+
++ + + + + + + + + + + + + + +

instance :

the object whose signal handlers you wish to stop. +

signal_id :

the signal identifier, as returned by g_signal_lookup(). +

detail :

the detail which the signal was emitted with. +
+
+
+
+

g_signal_stop_emission_by_name ()

+
void                g_signal_stop_emission_by_name      (gpointer instance,
+                                                         const gchar *detailed_signal);
+

+Stops a signal's current emission. +

+

+This is just like g_signal_stop_emission() except it will look up the +signal id for you.

+
++ + + + + + + + + + +

instance :

the object whose signal handlers you wish to stop. +

detailed_signal :

a string of the form "signal-name::detail". +
+
+
+
+

g_signal_override_class_closure ()

+
void                g_signal_override_class_closure     (guint signal_id,
+                                                         GType instance_type,
+                                                         GClosure *class_closure);
+

+Overrides the class closure (i.e. the default handler) for the given signal +for emissions on instances of instance_type. instance_type must be derived +from the type to which the signal belongs. +

+

+See g_signal_chain_from_overridden() and +g_signal_chain_from_overridden_handler() for how to chain up to the +parent class closure from inside the overridden one.

+
++ + + + + + + + + + + + + + +

signal_id :

the signal id +

instance_type :

the instance type on which to override the class closure + for the signal. +

class_closure :

the closure. +
+
+
+
+

g_signal_chain_from_overridden ()

+
void                g_signal_chain_from_overridden      (const GValue *instance_and_params,
+                                                         GValue *return_value);
+

+Calls the original class closure of a signal. This function should only +be called from an overridden class closure; see +g_signal_override_class_closure() and +g_signal_override_class_handler().

+
++ + + + + + + + + + +

instance_and_params :

the argument list of the signal emission. The first + element in the array is a GValue for the instance the signal is being + emitted on. The rest are any arguments to be passed to the signal. +

return_value :

Location for the return value. +
+
+
+
+

g_signal_new_class_handler ()

+
guint               g_signal_new_class_handler          (const gchar *signal_name,
+                                                         GType itype,
+                                                         GSignalFlags signal_flags,
+                                                         GCallback class_handler,
+                                                         GSignalAccumulator accumulator,
+                                                         gpointer accu_data,
+                                                         GSignalCMarshaller c_marshaller,
+                                                         GType return_type,
+                                                         guint n_params,
+                                                         ...);
+

+Creates a new signal. (This is usually done in the class initializer.) +

+

+This is a variant of g_signal_new() that takes a C callback instead +off a class offset for the signal's class handler. This function +doesn't need a function pointer exposed in the class structure of +an object definition, instead the function pointer is passed +directly and can be overriden by derived classes with +g_signal_override_class_closure() or +g_signal_override_class_handler()and chained to with +g_signal_chain_from_overridden() or +g_signal_chain_from_overridden_handler(). +

+

+See g_signal_new() for information about signal names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

signal_name :

the name for the signal +

itype :

the type this signal pertains to. It will also pertain to + types which are derived from this type. +

signal_flags :

a combination of GSignalFlags specifying detail of when + the default handler is to be invoked. You should at least specify + G_SIGNAL_RUN_FIRST or G_SIGNAL_RUN_LAST. +

class_handler :

a GCallback which acts as class implementation of + this signal. Used to invoke a class method generically. Pass NULL to + not associate a class method with this signal. +

accumulator :

the accumulator for this signal; may be NULL. +

accu_data :

user data for the accumulator. +

c_marshaller :

the function to translate arrays of parameter values to + signal emissions into C language callback invocations. +

return_type :

the type of return value, or G_TYPE_NONE for a signal + without a return value. +

n_params :

the number of parameter types to follow. +

... :

a list of types, one for each parameter. +

Returns :

the signal id + +
+

Since 2.18

+
+
+
+

g_signal_override_class_handler ()

+
void                g_signal_override_class_handler     (const gchar *signal_name,
+                                                         GType instance_type,
+                                                         GCallback class_handler);
+

+Overrides the class closure (i.e. the default handler) for the +given signal for emissions on instances of instance_type with +callabck class_handler. instance_type must be derived from the +type to which the signal belongs. +

+

+See g_signal_chain_from_overridden() and +g_signal_chain_from_overridden_handler() for how to chain up to the +parent class closure from inside the overridden one.

+
++ + + + + + + + + + + + + + +

signal_name :

the name for the signal +

instance_type :

the instance type on which to override the class handler + for the signal. +

class_handler :

the handler. +
+

Since 2.18

+
+
+
+

g_signal_chain_from_overridden_handler ()

+
void                g_signal_chain_from_overridden_handler
+                                                        (gpointer instance,
+                                                         ...);
+

+Calls the original class closure of a signal. This function should +only be called from an overridden class closure; see +g_signal_override_class_closure() and +g_signal_override_class_handler().

+
++ + + + + + + + + + +

instance :

the instance the signal is being emitted on. +

... :

parameters to be passed to the parent class closure, followed by a + location for the return value. If the return type of the signal + is G_TYPE_NONE, the return value location can be omitted. +
+

Since 2.18

+
+
+
+

g_signal_add_emission_hook ()

+
gulong              g_signal_add_emission_hook          (guint signal_id,
+                                                         GQuark detail,
+                                                         GSignalEmissionHook hook_func,
+                                                         gpointer hook_data,
+                                                         GDestroyNotify data_destroy);
+

+Adds an emission hook for a signal, which will get called for any emission +of that signal, independent of the instance. This is possible only +for signals which don't have G_SIGNAL_NO_HOOKS flag set.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

signal_id :

the signal identifier, as returned by g_signal_lookup(). +

detail :

the detail on which to call the hook. +

hook_func :

a GSignalEmissionHook function. +

hook_data :

user data for hook_func. +

data_destroy :

a GDestroyNotify for hook_data. +

Returns :

the hook id, for later use with g_signal_remove_emission_hook(). +
+
+
+
+

g_signal_remove_emission_hook ()

+
void                g_signal_remove_emission_hook       (guint signal_id,
+                                                         gulong hook_id);
+

+Deletes an emission hook.

+
++ + + + + + + + + + +

signal_id :

the id of the signal +

hook_id :

the id of the emission hook, as returned by + g_signal_add_emission_hook() +
+
+
+
+

g_signal_parse_name ()

+
gboolean            g_signal_parse_name                 (const gchar *detailed_signal,
+                                                         GType itype,
+                                                         guint *signal_id_p,
+                                                         GQuark *detail_p,
+                                                         gboolean force_detail_quark);
+

+Internal function to parse a signal name into its signal_id +and detail quark.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

detailed_signal :

a string of the form "signal-name::detail". +

itype :

The interface/instance type that introduced "signal-name". +

signal_id_p :

Location to store the signal id. +

detail_p :

Location to store the detail quark. +

force_detail_quark :

TRUE forces creation of a GQuark for the detail. +

Returns :

Whether the signal name could successfully be parsed and signal_id_p and detail_p contain valid return values. +
+
+
+
+

g_signal_get_invocation_hint ()

+
GSignalInvocationHint* g_signal_get_invocation_hint     (gpointer instance);
+

+Returns the invocation hint of the innermost signal emission of instance.

+
++ + + + + + + + + + +

instance :

the instance to query +

Returns :

the invocation hint of the innermost signal emission. +
+
+
+
+

g_signal_type_cclosure_new ()

+
GClosure*           g_signal_type_cclosure_new          (GType itype,
+                                                         guint struct_offset);
+

+Creates a new closure which invokes the function found at the offset +struct_offset in the class structure of the interface or classed type +identified by itype.

+
++ + + + + + + + + + + + + + +

itype :

the GType identifier of an interface or classed type +

struct_offset :

the offset of the member function of itype's class + structure which is to be invoked by the new closure +

Returns :

a new GCClosure +
+
+
+
+

g_signal_accumulator_true_handled ()

+
gboolean            g_signal_accumulator_true_handled   (GSignalInvocationHint *ihint,
+                                                         GValue *return_accu,
+                                                         const GValue *handler_return,
+                                                         gpointer dummy);
+

+A predefined GSignalAccumulator for signals that return a +boolean values. The behavior that this accumulator gives is +that a return of TRUE stops the signal emission: no further +callbacks will be invoked, while a return of FALSE allows +the emission to coninue. The idea here is that a TRUE return +indicates that the callback handled the signal, +and no further handling is needed.

+
++ + + + + + + + + + + + + + + + + + + + + + +

ihint :

standard GSignalAccumulator parameter +

return_accu :

standard GSignalAccumulator parameter +

handler_return :

standard GSignalAccumulator parameter +

dummy :

standard GSignalAccumulator parameter +

Returns :

standard GSignalAccumulator result +
+

Since 2.4

+
+
+
+

+

[10] Although signals can deal with any kind of instantiatable +type, i'm referring to those types as "object types" in the following, +simply because that is the context most users will encounter signals in. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Standard-Parameter-and-Value-Types.html b/docs/reference/gobject/html/gobject-Standard-Parameter-and-Value-Types.html new file mode 100644 index 0000000..4d5e53e --- /dev/null +++ b/docs/reference/gobject/html/gobject-Standard-Parameter-and-Value-Types.html @@ -0,0 +1,5086 @@ + + + + +Parameters and Values + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Parameters and Values

+

Parameters and Values — Standard Parameter and Value Types

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+#define             G_IS_PARAM_SPEC_BOOLEAN             (pspec)
+#define             G_PARAM_SPEC_BOOLEAN                (pspec)
+#define             G_VALUE_HOLDS_BOOLEAN               (value)
+#define             G_TYPE_PARAM_BOOLEAN
+                    GParamSpecBoolean;
+GParamSpec*         g_param_spec_boolean                (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gboolean default_value,
+                                                         GParamFlags flags);
+void                g_value_set_boolean                 (GValue *value,
+                                                         gboolean v_boolean);
+gboolean            g_value_get_boolean                 (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_CHAR                (pspec)
+#define             G_PARAM_SPEC_CHAR                   (pspec)
+#define             G_VALUE_HOLDS_CHAR                  (value)
+#define             G_TYPE_PARAM_CHAR
+                    GParamSpecChar;
+GParamSpec*         g_param_spec_char                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gint8 minimum,
+                                                         gint8 maximum,
+                                                         gint8 default_value,
+                                                         GParamFlags flags);
+void                g_value_set_char                    (GValue *value,
+                                                         gchar v_char);
+gchar               g_value_get_char                    (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_UCHAR               (pspec)
+#define             G_PARAM_SPEC_UCHAR                  (pspec)
+#define             G_VALUE_HOLDS_UCHAR                 (value)
+#define             G_TYPE_PARAM_UCHAR
+                    GParamSpecUChar;
+GParamSpec*         g_param_spec_uchar                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         guint8 minimum,
+                                                         guint8 maximum,
+                                                         guint8 default_value,
+                                                         GParamFlags flags);
+void                g_value_set_uchar                   (GValue *value,
+                                                         guchar v_uchar);
+guchar              g_value_get_uchar                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_INT                 (pspec)
+#define             G_PARAM_SPEC_INT                    (pspec)
+#define             G_VALUE_HOLDS_INT                   (value)
+#define             G_TYPE_PARAM_INT
+                    GParamSpecInt;
+GParamSpec*         g_param_spec_int                    (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gint minimum,
+                                                         gint maximum,
+                                                         gint default_value,
+                                                         GParamFlags flags);
+void                g_value_set_int                     (GValue *value,
+                                                         gint v_int);
+gint                g_value_get_int                     (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_UINT                (pspec)
+#define             G_PARAM_SPEC_UINT                   (pspec)
+#define             G_VALUE_HOLDS_UINT                  (value)
+#define             G_TYPE_PARAM_UINT
+                    GParamSpecUInt;
+GParamSpec*         g_param_spec_uint                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         guint minimum,
+                                                         guint maximum,
+                                                         guint default_value,
+                                                         GParamFlags flags);
+void                g_value_set_uint                    (GValue *value,
+                                                         guint v_uint);
+guint               g_value_get_uint                    (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_LONG                (pspec)
+#define             G_PARAM_SPEC_LONG                   (pspec)
+#define             G_VALUE_HOLDS_LONG                  (value)
+#define             G_TYPE_PARAM_LONG
+                    GParamSpecLong;
+GParamSpec*         g_param_spec_long                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         glong minimum,
+                                                         glong maximum,
+                                                         glong default_value,
+                                                         GParamFlags flags);
+void                g_value_set_long                    (GValue *value,
+                                                         glong v_long);
+glong               g_value_get_long                    (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_ULONG               (pspec)
+#define             G_PARAM_SPEC_ULONG                  (pspec)
+#define             G_VALUE_HOLDS_ULONG                 (value)
+#define             G_TYPE_PARAM_ULONG
+                    GParamSpecULong;
+GParamSpec*         g_param_spec_ulong                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gulong minimum,
+                                                         gulong maximum,
+                                                         gulong default_value,
+                                                         GParamFlags flags);
+void                g_value_set_ulong                   (GValue *value,
+                                                         gulong v_ulong);
+gulong              g_value_get_ulong                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_INT64               (pspec)
+#define             G_PARAM_SPEC_INT64                  (pspec)
+#define             G_VALUE_HOLDS_INT64                 (value)
+#define             G_TYPE_PARAM_INT64
+                    GParamSpecInt64;
+GParamSpec*         g_param_spec_int64                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gint64 minimum,
+                                                         gint64 maximum,
+                                                         gint64 default_value,
+                                                         GParamFlags flags);
+void                g_value_set_int64                   (GValue *value,
+                                                         gint64 v_int64);
+gint64              g_value_get_int64                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_UINT64              (pspec)
+#define             G_PARAM_SPEC_UINT64                 (pspec)
+#define             G_VALUE_HOLDS_UINT64                (value)
+#define             G_TYPE_PARAM_UINT64
+                    GParamSpecUInt64;
+GParamSpec*         g_param_spec_uint64                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         guint64 minimum,
+                                                         guint64 maximum,
+                                                         guint64 default_value,
+                                                         GParamFlags flags);
+void                g_value_set_uint64                  (GValue *value,
+                                                         guint64 v_uint64);
+guint64             g_value_get_uint64                  (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_FLOAT               (pspec)
+#define             G_PARAM_SPEC_FLOAT                  (pspec)
+#define             G_VALUE_HOLDS_FLOAT                 (value)
+#define             G_TYPE_PARAM_FLOAT
+                    GParamSpecFloat;
+GParamSpec*         g_param_spec_float                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gfloat minimum,
+                                                         gfloat maximum,
+                                                         gfloat default_value,
+                                                         GParamFlags flags);
+void                g_value_set_float                   (GValue *value,
+                                                         gfloat v_float);
+gfloat              g_value_get_float                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_DOUBLE              (pspec)
+#define             G_PARAM_SPEC_DOUBLE                 (pspec)
+#define             G_VALUE_HOLDS_DOUBLE                (value)
+#define             G_TYPE_PARAM_DOUBLE
+                    GParamSpecDouble;
+GParamSpec*         g_param_spec_double                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gdouble minimum,
+                                                         gdouble maximum,
+                                                         gdouble default_value,
+                                                         GParamFlags flags);
+void                g_value_set_double                  (GValue *value,
+                                                         gdouble v_double);
+gdouble             g_value_get_double                  (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_ENUM                (pspec)
+#define             G_PARAM_SPEC_ENUM                   (pspec)
+#define             G_VALUE_HOLDS_ENUM                  (value)
+#define             G_TYPE_PARAM_ENUM
+                    GParamSpecEnum;
+GParamSpec*         g_param_spec_enum                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType enum_type,
+                                                         gint default_value,
+                                                         GParamFlags flags);
+void                g_value_set_enum                    (GValue *value,
+                                                         gint v_enum);
+gint                g_value_get_enum                    (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_FLAGS               (pspec)
+#define             G_PARAM_SPEC_FLAGS                  (pspec)
+#define             G_VALUE_HOLDS_FLAGS                 (value)
+#define             G_TYPE_PARAM_FLAGS
+                    GParamSpecFlags;
+GParamSpec*         g_param_spec_flags                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType flags_type,
+                                                         guint default_value,
+                                                         GParamFlags flags);
+void                g_value_set_flags                   (GValue *value,
+                                                         guint v_flags);
+guint               g_value_get_flags                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_STRING              (pspec)
+#define             G_PARAM_SPEC_STRING                 (pspec)
+#define             G_VALUE_HOLDS_STRING                (value)
+#define             G_TYPE_PARAM_STRING
+                    GParamSpecString;
+typedef             gchararray;
+GParamSpec*         g_param_spec_string                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         const gchar *default_value,
+                                                         GParamFlags flags);
+void                g_value_set_string                  (GValue *value,
+                                                         const gchar *v_string);
+void                g_value_set_static_string           (GValue *value,
+                                                         const gchar *v_string);
+void                g_value_take_string                 (GValue *value,
+                                                         gchar *v_string);
+void                g_value_set_string_take_ownership   (GValue *value,
+                                                         gchar *v_string);
+const gchar*        g_value_get_string                  (const GValue *value);
+gchar*              g_value_dup_string                  (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_PARAM               (pspec)
+#define             G_PARAM_SPEC_PARAM                  (pspec)
+#define             G_VALUE_HOLDS_PARAM                 (value)
+#define             G_TYPE_PARAM_PARAM
+                    GParamSpecParam;
+GParamSpec*         g_param_spec_param                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType param_type,
+                                                         GParamFlags flags);
+void                g_value_set_param                   (GValue *value,
+                                                         GParamSpec *param);
+void                g_value_take_param                  (GValue *value,
+                                                         GParamSpec *param);
+void                g_value_set_param_take_ownership    (GValue *value,
+                                                         GParamSpec *param);
+GParamSpec*         g_value_get_param                   (const GValue *value);
+GParamSpec*         g_value_dup_param                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_BOXED               (pspec)
+#define             G_PARAM_SPEC_BOXED                  (pspec)
+#define             G_VALUE_HOLDS_BOXED                 (value)
+#define             G_TYPE_PARAM_BOXED
+                    GParamSpecBoxed;
+GParamSpec*         g_param_spec_boxed                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType boxed_type,
+                                                         GParamFlags flags);
+void                g_value_set_boxed                   (GValue *value,
+                                                         gconstpointer v_boxed);
+void                g_value_set_static_boxed            (GValue *value,
+                                                         gconstpointer v_boxed);
+void                g_value_take_boxed                  (GValue *value,
+                                                         gconstpointer v_boxed);
+void                g_value_set_boxed_take_ownership    (GValue *value,
+                                                         gconstpointer v_boxed);
+gpointer            g_value_get_boxed                   (const GValue *value);
+gpointer            g_value_dup_boxed                   (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_POINTER             (pspec)
+#define             G_PARAM_SPEC_POINTER                (pspec)
+#define             G_VALUE_HOLDS_POINTER               (value)
+#define             G_TYPE_PARAM_POINTER
+                    GParamSpecPointer;
+GParamSpec*         g_param_spec_pointer                (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GParamFlags flags);
+void                g_value_set_pointer                 (GValue *value,
+                                                         gpointer v_pointer);
+gpointer            g_value_get_pointer                 (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_OBJECT              (pspec)
+#define             G_PARAM_SPEC_OBJECT                 (pspec)
+#define             G_VALUE_HOLDS_OBJECT                (value)
+#define             G_TYPE_PARAM_OBJECT
+                    GParamSpecObject;
+GParamSpec*         g_param_spec_object                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType object_type,
+                                                         GParamFlags flags);
+void                g_value_set_object                  (GValue *value,
+                                                         gpointer v_object);
+void                g_value_take_object                 (GValue *value,
+                                                         gpointer v_object);
+void                g_value_set_object_take_ownership   (GValue *value,
+                                                         gpointer v_object);
+gpointer            g_value_get_object                  (const GValue *value);
+gpointer            g_value_dup_object                  (const GValue *value);
+
+#define             G_IS_PARAM_SPEC_UNICHAR             (pspec)
+#define             G_PARAM_SPEC_UNICHAR                (pspec)
+#define             G_TYPE_PARAM_UNICHAR
+                    GParamSpecUnichar;
+GParamSpec*         g_param_spec_unichar                (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gunichar default_value,
+                                                         GParamFlags flags);
+
+#define             G_IS_PARAM_SPEC_VALUE_ARRAY         (pspec)
+#define             G_PARAM_SPEC_VALUE_ARRAY            (pspec)
+#define             G_TYPE_PARAM_VALUE_ARRAY
+                    GParamSpecValueArray;
+GParamSpec*         g_param_spec_value_array            (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GParamSpec *element_spec,
+                                                         GParamFlags flags);
+
+#define             G_IS_PARAM_SPEC_OVERRIDE            (pspec)
+#define             G_PARAM_SPEC_OVERRIDE               (pspec)
+#define             G_TYPE_PARAM_OVERRIDE
+                    GParamSpecOverride;
+GParamSpec*         g_param_spec_override               (const gchar *name,
+                                                         GParamSpec *overridden);
+
+#define             G_IS_PARAM_SPEC_GTYPE               (pspec)
+#define             G_PARAM_SPEC_GTYPE                  (pspec)
+#define             G_VALUE_HOLDS_GTYPE                 (value)
+#define             G_TYPE_PARAM_GTYPE
+                    GParamSpecGType;
+GParamSpec*         g_param_spec_gtype                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType is_a_type,
+                                                         GParamFlags flags);
+GType               g_value_get_gtype                   (const GValue *value);
+void                g_value_set_gtype                   (GValue *value,
+                                                         GType v_gtype);
+
+
+
+

Description

+

+GValue provides an abstract container structure which can be +copied, transformed and compared while holding a value of any +(derived) type, which is registered as a GType with a +GTypeValueTable in its GTypeInfo structure. Parameter +specifications for most value types can be created as GParamSpec +derived instances, to implement e.g. GObject properties which +operate on GValue containers. +

+

+Parameter names need to start with a letter (a-z or A-Z). Subsequent +characters can be letters, numbers or a '-'. +All other characters are replaced by a '-' during construction.

+
+
+

Details

+
+

G_IS_PARAM_SPEC_BOOLEAN()

+
#define G_IS_PARAM_SPEC_BOOLEAN(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_BOOLEAN.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_BOOLEAN()

+
#define G_PARAM_SPEC_BOOLEAN(pspec)        (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean))
+
+

+Cast a GParamSpec instance into a GParamSpecBoolean.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_BOOLEAN()

+
#define G_VALUE_HOLDS_BOOLEAN(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOOLEAN))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_BOOLEAN.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_BOOLEAN

+
#define G_TYPE_PARAM_BOOLEAN		   (g_param_spec_types[2])
+
+

+The GType of GParamSpecBoolean.

+
+
+
+

GParamSpecBoolean

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gboolean      default_value;
+} GParamSpecBoolean;
+
+

+A GParamSpec derived structure that contains the meta data for boolean properties.

+
++ + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gboolean default_value;

default value for the property specified +
+
+
+
+

g_param_spec_boolean ()

+
GParamSpec*         g_param_spec_boolean                (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gboolean default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecBoolean instance specifying a G_TYPE_BOOLEAN +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_boolean ()

+
void                g_value_set_boolean                 (GValue *value,
+                                                         gboolean v_boolean);
+

+Set the contents of a G_TYPE_BOOLEAN GValue to v_boolean.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_BOOLEAN +

v_boolean :

boolean value to be set +
+
+
+
+

g_value_get_boolean ()

+
gboolean            g_value_get_boolean                 (const GValue *value);
+

+Get the contents of a G_TYPE_BOOLEAN GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_BOOLEAN +

Returns :

boolean contents of value +
+
+
+
+

G_IS_PARAM_SPEC_CHAR()

+
#define G_IS_PARAM_SPEC_CHAR(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CHAR))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_CHAR.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_CHAR()

+
#define G_PARAM_SPEC_CHAR(pspec)           (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CHAR, GParamSpecChar))
+
+

+Cast a GParamSpec instance into a GParamSpecChar.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_CHAR()

+
#define G_VALUE_HOLDS_CHAR(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CHAR))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_CHAR.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_CHAR

+
#define G_TYPE_PARAM_CHAR		   (g_param_spec_types[0])
+
+

+The GType of GParamSpecChar.

+
+
+
+

GParamSpecChar

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gint8         minimum;
+  gint8         maximum;
+  gint8         default_value;
+} GParamSpecChar;
+
+

+A GParamSpec derived structure that contains the meta data for character properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gint8 minimum;

minimum value for the property specified +

gint8 maximum;

maximum value for the property specified +

gint8 default_value;

default value for the property specified +
+
+
+
+

g_param_spec_char ()

+
GParamSpec*         g_param_spec_char                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gint8 minimum,
+                                                         gint8 maximum,
+                                                         gint8 default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecChar instance specifying a G_TYPE_CHAR property.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_char ()

+
void                g_value_set_char                    (GValue *value,
+                                                         gchar v_char);
+

+Set the contents of a G_TYPE_CHAR GValue to v_char.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_CHAR +

v_char :

character value to be set +
+
+
+
+

g_value_get_char ()

+
gchar               g_value_get_char                    (const GValue *value);
+

+Get the contents of a G_TYPE_CHAR GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_CHAR +

Returns :

character contents of value +
+
+
+
+

G_IS_PARAM_SPEC_UCHAR()

+
#define G_IS_PARAM_SPEC_UCHAR(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UCHAR))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_UCHAR.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_UCHAR()

+
#define G_PARAM_SPEC_UCHAR(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UCHAR, GParamSpecUChar))
+
+

+Cast a GParamSpec instance into a GParamSpecUChar.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_UCHAR()

+
#define G_VALUE_HOLDS_UCHAR(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UCHAR))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_UCHAR.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_UCHAR

+
#define G_TYPE_PARAM_UCHAR		   (g_param_spec_types[1])
+
+

+The GType of GParamSpecUChar.

+
+
+
+

GParamSpecUChar

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  guint8        minimum;
+  guint8        maximum;
+  guint8        default_value;
+} GParamSpecUChar;
+
+

+A GParamSpec derived structure that contains the meta data for unsigned character properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

guint8 minimum;

minimum value for the property specified +

guint8 maximum;

maximum value for the property specified +

guint8 default_value;

default value for the property specified +
+
+
+
+

g_param_spec_uchar ()

+
GParamSpec*         g_param_spec_uchar                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         guint8 minimum,
+                                                         guint8 maximum,
+                                                         guint8 default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecUChar instance specifying a G_TYPE_UCHAR property.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_uchar ()

+
void                g_value_set_uchar                   (GValue *value,
+                                                         guchar v_uchar);
+

+Set the contents of a G_TYPE_UCHAR GValue to v_uchar.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_UCHAR +

v_uchar :

unsigned character value to be set +
+
+
+
+

g_value_get_uchar ()

+
guchar              g_value_get_uchar                   (const GValue *value);
+

+Get the contents of a G_TYPE_UCHAR GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_UCHAR +

Returns :

unsigned character contents of value +
+
+
+
+

G_IS_PARAM_SPEC_INT()

+
#define G_IS_PARAM_SPEC_INT(pspec)         (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_INT.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_INT()

+
#define G_PARAM_SPEC_INT(pspec)            (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT, GParamSpecInt))
+
+

+Cast a GParamSpec instance into a GParamSpecInt.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_INT()

+
#define G_VALUE_HOLDS_INT(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_INT.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_INT

+
#define G_TYPE_PARAM_INT		   (g_param_spec_types[3])
+
+

+The GType of GParamSpecInt.

+
+
+
+

GParamSpecInt

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gint          minimum;
+  gint          maximum;
+  gint          default_value;
+} GParamSpecInt;
+
+

+A GParamSpec derived structure that contains the meta data for integer properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gint minimum;

minimum value for the property specified +

gint maximum;

maximum value for the property specified +

gint default_value;

default value for the property specified +
+
+
+
+

g_param_spec_int ()

+
GParamSpec*         g_param_spec_int                    (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gint minimum,
+                                                         gint maximum,
+                                                         gint default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecInt instance specifying a G_TYPE_INT property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_int ()

+
void                g_value_set_int                     (GValue *value,
+                                                         gint v_int);
+

+Set the contents of a G_TYPE_INT GValue to v_int.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_INT +

v_int :

integer value to be set +
+
+
+
+

g_value_get_int ()

+
gint                g_value_get_int                     (const GValue *value);
+

+Get the contents of a G_TYPE_INT GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_INT +

Returns :

integer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_UINT()

+
#define G_IS_PARAM_SPEC_UINT(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_UINT.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_UINT()

+
#define G_PARAM_SPEC_UINT(pspec)           (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT, GParamSpecUInt))
+
+

+Cast a GParamSpec instance into a GParamSpecUInt.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_UINT()

+
#define G_VALUE_HOLDS_UINT(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_UINT.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_UINT

+
#define G_TYPE_PARAM_UINT		   (g_param_spec_types[4])
+
+

+The GType of GParamSpecUInt.

+
+
+
+

GParamSpecUInt

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  guint         minimum;
+  guint         maximum;
+  guint         default_value;
+} GParamSpecUInt;
+
+

+A GParamSpec derived structure that contains the meta data for unsigned integer properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

guint minimum;

minimum value for the property specified +

guint maximum;

maximum value for the property specified +

guint default_value;

default value for the property specified +
+
+
+
+

g_param_spec_uint ()

+
GParamSpec*         g_param_spec_uint                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         guint minimum,
+                                                         guint maximum,
+                                                         guint default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecUInt instance specifying a G_TYPE_UINT property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_uint ()

+
void                g_value_set_uint                    (GValue *value,
+                                                         guint v_uint);
+

+Set the contents of a G_TYPE_UINT GValue to v_uint.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_UINT +

v_uint :

unsigned integer value to be set +
+
+
+
+

g_value_get_uint ()

+
guint               g_value_get_uint                    (const GValue *value);
+

+Get the contents of a G_TYPE_UINT GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_UINT +

Returns :

unsigned integer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_LONG()

+
#define G_IS_PARAM_SPEC_LONG(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_LONG.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_LONG()

+
#define G_PARAM_SPEC_LONG(pspec)           (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong))
+
+

+Cast a GParamSpec instance into a GParamSpecLong.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_LONG()

+
#define G_VALUE_HOLDS_LONG(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_LONG.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_LONG

+
#define G_TYPE_PARAM_LONG		   (g_param_spec_types[5])
+
+

+The GType of GParamSpecLong.

+
+
+
+

GParamSpecLong

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  glong         minimum;
+  glong         maximum;
+  glong         default_value;
+} GParamSpecLong;
+
+

+A GParamSpec derived structure that contains the meta data for long integer properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

glong minimum;

minimum value for the property specified +

glong maximum;

maximum value for the property specified +

glong default_value;

default value for the property specified +
+
+
+
+

g_param_spec_long ()

+
GParamSpec*         g_param_spec_long                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         glong minimum,
+                                                         glong maximum,
+                                                         glong default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecLong instance specifying a G_TYPE_LONG property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_long ()

+
void                g_value_set_long                    (GValue *value,
+                                                         glong v_long);
+

+Set the contents of a G_TYPE_LONG GValue to v_long.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_LONG +

v_long :

long integer value to be set +
+
+
+
+

g_value_get_long ()

+
glong               g_value_get_long                    (const GValue *value);
+

+Get the contents of a G_TYPE_LONG GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_LONG +

Returns :

long integer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_ULONG()

+
#define G_IS_PARAM_SPEC_ULONG(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_ULONG.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_ULONG()

+
#define G_PARAM_SPEC_ULONG(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong))
+
+

+Cast a GParamSpec instance into a GParamSpecULong.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_ULONG()

+
#define G_VALUE_HOLDS_ULONG(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_ULONG.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_ULONG

+
#define G_TYPE_PARAM_ULONG		   (g_param_spec_types[6])
+
+

+The GType of GParamSpecULong.

+
+
+
+

GParamSpecULong

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gulong        minimum;
+  gulong        maximum;
+  gulong        default_value;
+} GParamSpecULong;
+
+

+A GParamSpec derived structure that contains the meta data for unsigned long integer properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gulong minimum;

minimum value for the property specified +

gulong maximum;

maximum value for the property specified +

gulong default_value;

default value for the property specified +
+
+
+
+

g_param_spec_ulong ()

+
GParamSpec*         g_param_spec_ulong                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gulong minimum,
+                                                         gulong maximum,
+                                                         gulong default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecULong instance specifying a G_TYPE_ULONG +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_ulong ()

+
void                g_value_set_ulong                   (GValue *value,
+                                                         gulong v_ulong);
+

+Set the contents of a G_TYPE_ULONG GValue to v_ulong.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_ULONG +

v_ulong :

unsigned long integer value to be set +
+
+
+
+

g_value_get_ulong ()

+
gulong              g_value_get_ulong                   (const GValue *value);
+

+Get the contents of a G_TYPE_ULONG GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_ULONG +

Returns :

unsigned long integer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_INT64()

+
#define G_IS_PARAM_SPEC_INT64(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT64))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_INT64.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_INT64()

+
#define G_PARAM_SPEC_INT64(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT64, GParamSpecInt64))
+
+

+Cast a GParamSpec instance into a GParamSpecInt64.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_INT64()

+
#define G_VALUE_HOLDS_INT64(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT64))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_INT64.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_INT64

+
#define G_TYPE_PARAM_INT64		   (g_param_spec_types[7])
+
+

+The GType of GParamSpecInt64.

+
+
+
+

GParamSpecInt64

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gint64        minimum;
+  gint64        maximum;
+  gint64        default_value;
+} GParamSpecInt64;
+
+

+A GParamSpec derived structure that contains the meta data for 64bit integer properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gint64 minimum;

minimum value for the property specified +

gint64 maximum;

maximum value for the property specified +

gint64 default_value;

default value for the property specified +
+
+
+
+

g_param_spec_int64 ()

+
GParamSpec*         g_param_spec_int64                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gint64 minimum,
+                                                         gint64 maximum,
+                                                         gint64 default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecInt64 instance specifying a G_TYPE_INT64 property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_int64 ()

+
void                g_value_set_int64                   (GValue *value,
+                                                         gint64 v_int64);
+

+Set the contents of a G_TYPE_INT64 GValue to v_int64.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_INT64 +

v_int64 :

64bit integer value to be set +
+
+
+
+

g_value_get_int64 ()

+
gint64              g_value_get_int64                   (const GValue *value);
+

+Get the contents of a G_TYPE_INT64 GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_INT64 +

Returns :

64bit integer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_UINT64()

+
#define G_IS_PARAM_SPEC_UINT64(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_UINT64.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_UINT64()

+
#define G_PARAM_SPEC_UINT64(pspec)         (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT64, GParamSpecUInt64))
+
+

+Cast a GParamSpec instance into a GParamSpecUInt64.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_UINT64()

+
#define G_VALUE_HOLDS_UINT64(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT64))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_UINT64.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_UINT64

+
#define G_TYPE_PARAM_UINT64		   (g_param_spec_types[8])
+
+

+The GType of GParamSpecUInt64.

+
+
+
+

GParamSpecUInt64

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  guint64       minimum;
+  guint64       maximum;
+  guint64       default_value;
+} GParamSpecUInt64;
+
+

+A GParamSpec derived structure that contains the meta data for unsigned 64bit integer properties.

+
++ + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

guint64 minimum;

minimum value for the property specified +

guint64 maximum;

maximum value for the property specified +

guint64 default_value;

default value for the property specified +
+
+
+
+

g_param_spec_uint64 ()

+
GParamSpec*         g_param_spec_uint64                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         guint64 minimum,
+                                                         guint64 maximum,
+                                                         guint64 default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecUInt64 instance specifying a G_TYPE_UINT64 +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_uint64 ()

+
void                g_value_set_uint64                  (GValue *value,
+                                                         guint64 v_uint64);
+

+Set the contents of a G_TYPE_UINT64 GValue to v_uint64.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_UINT64 +

v_uint64 :

unsigned 64bit integer value to be set +
+
+
+
+

g_value_get_uint64 ()

+
guint64             g_value_get_uint64                  (const GValue *value);
+

+Get the contents of a G_TYPE_UINT64 GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_UINT64 +

Returns :

unsigned 64bit integer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_FLOAT()

+
#define G_IS_PARAM_SPEC_FLOAT(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLOAT))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_FLOAT.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_FLOAT()

+
#define G_PARAM_SPEC_FLOAT(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLOAT, GParamSpecFloat))
+
+

+Cast a GParamSpec instance into a GParamSpecFloat.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_FLOAT()

+
#define G_VALUE_HOLDS_FLOAT(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_FLOAT.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_FLOAT

+
#define G_TYPE_PARAM_FLOAT		   (g_param_spec_types[12])
+
+

+The GType of GParamSpecFloat.

+
+
+
+

GParamSpecFloat

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gfloat        minimum;
+  gfloat        maximum;
+  gfloat        default_value;
+  gfloat        epsilon;
+} GParamSpecFloat;
+
+

+A GParamSpec derived structure that contains the meta data for float properties.

+
++ + + + + + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gfloat minimum;

minimum value for the property specified +

gfloat maximum;

maximum value for the property specified +

gfloat default_value;

default value for the property specified +

gfloat epsilon;

values closer than epsilon will be considered identical + by g_param_values_cmp(); the default value is 1e-30. +
+
+
+
+

g_param_spec_float ()

+
GParamSpec*         g_param_spec_float                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gfloat minimum,
+                                                         gfloat maximum,
+                                                         gfloat default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecFloat instance specifying a G_TYPE_FLOAT property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_float ()

+
void                g_value_set_float                   (GValue *value,
+                                                         gfloat v_float);
+

+Set the contents of a G_TYPE_FLOAT GValue to v_float.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_FLOAT +

v_float :

float value to be set +
+
+
+
+

g_value_get_float ()

+
gfloat              g_value_get_float                   (const GValue *value);
+

+Get the contents of a G_TYPE_FLOAT GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_FLOAT +

Returns :

float contents of value +
+
+
+
+

G_IS_PARAM_SPEC_DOUBLE()

+
#define G_IS_PARAM_SPEC_DOUBLE(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_DOUBLE.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_DOUBLE()

+
#define G_PARAM_SPEC_DOUBLE(pspec)         (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_DOUBLE, GParamSpecDouble))
+
+

+Cast a GParamSpec instance into a GParamSpecDouble.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_DOUBLE()

+
#define G_VALUE_HOLDS_DOUBLE(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_DOUBLE.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_DOUBLE

+
#define G_TYPE_PARAM_DOUBLE		   (g_param_spec_types[13])
+
+

+The GType of GParamSpecDouble.

+
+
+
+

GParamSpecDouble

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gdouble       minimum;
+  gdouble       maximum;
+  gdouble       default_value;
+  gdouble       epsilon;
+} GParamSpecDouble;
+
+

+A GParamSpec derived structure that contains the meta data for double properties.

+
++ + + + + + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gdouble minimum;

minimum value for the property specified +

gdouble maximum;

maximum value for the property specified +

gdouble default_value;

default value for the property specified +

gdouble epsilon;

values closer than epsilon will be considered identical + by g_param_values_cmp(); the default value is 1e-90. +
+
+
+
+

g_param_spec_double ()

+
GParamSpec*         g_param_spec_double                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gdouble minimum,
+                                                         gdouble maximum,
+                                                         gdouble default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecDouble instance specifying a G_TYPE_DOUBLE +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

minimum :

minimum value for the property specified +

maximum :

maximum value for the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_double ()

+
void                g_value_set_double                  (GValue *value,
+                                                         gdouble v_double);
+

+Set the contents of a G_TYPE_DOUBLE GValue to v_double.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_DOUBLE +

v_double :

double value to be set +
+
+
+
+

g_value_get_double ()

+
gdouble             g_value_get_double                  (const GValue *value);
+

+Get the contents of a G_TYPE_DOUBLE GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_DOUBLE +

Returns :

double contents of value +
+
+
+
+

G_IS_PARAM_SPEC_ENUM()

+
#define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_ENUM.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_ENUM()

+
#define G_PARAM_SPEC_ENUM(pspec)           (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum))
+
+

+Cast a GParamSpec instance into a GParamSpecEnum.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_ENUM()

+
#define G_VALUE_HOLDS_ENUM(value)      (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ENUM))
+
+

+Checks whether the given GValue can hold values derived from type G_TYPE_ENUM.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_ENUM

+
#define G_TYPE_PARAM_ENUM		   (g_param_spec_types[10])
+
+

+The GType of GParamSpecEnum.

+
+
+
+

GParamSpecEnum

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  GEnumClass   *enum_class;
+  gint          default_value;
+} GParamSpecEnum;
+
+

+A GParamSpec derived structure that contains the meta data for enum +properties.

+
++ + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

GEnumClass *enum_class;

the GEnumClass for the enum +

gint default_value;

default value for the property specified +
+
+
+
+

g_param_spec_enum ()

+
GParamSpec*         g_param_spec_enum                   (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType enum_type,
+                                                         gint default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecEnum instance specifying a G_TYPE_ENUM +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

enum_type :

a GType derived from G_TYPE_ENUM +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_enum ()

+
void                g_value_set_enum                    (GValue *value,
+                                                         gint v_enum);
+

+Set the contents of a G_TYPE_ENUM GValue to v_enum.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_ENUM +

v_enum :

enum value to be set +
+
+
+
+

g_value_get_enum ()

+
gint                g_value_get_enum                    (const GValue *value);
+

+Get the contents of a G_TYPE_ENUM GValue.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_ENUM +

Returns :

enum contents of value +
+
+
+
+

G_IS_PARAM_SPEC_FLAGS()

+
#define G_IS_PARAM_SPEC_FLAGS(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_FLAGS.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_FLAGS()

+
#define G_PARAM_SPEC_FLAGS(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLAGS, GParamSpecFlags))
+
+

+Cast a GParamSpec instance into a GParamSpecFlags.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_FLAGS()

+
#define G_VALUE_HOLDS_FLAGS(value)     (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLAGS))
+
+

+Checks whether the given GValue can hold values derived from type G_TYPE_FLAGS.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_FLAGS

+
#define G_TYPE_PARAM_FLAGS		   (g_param_spec_types[11])
+
+

+The GType of GParamSpecFlags.

+
+
+
+

GParamSpecFlags

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  GFlagsClass  *flags_class;
+  guint         default_value;
+} GParamSpecFlags;
+
+

+A GParamSpec derived structure that contains the meta data for flags +properties.

+
++ + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

GFlagsClass *flags_class;

the GFlagsClass for the flags +

guint default_value;

default value for the property specified +
+
+
+
+

g_param_spec_flags ()

+
GParamSpec*         g_param_spec_flags                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType flags_type,
+                                                         guint default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecFlags instance specifying a G_TYPE_FLAGS +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

flags_type :

a GType derived from G_TYPE_FLAGS +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_flags ()

+
void                g_value_set_flags                   (GValue *value,
+                                                         guint v_flags);
+

+Set the contents of a G_TYPE_FLAGS GValue to v_flags.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_FLAGS +

v_flags :

flags value to be set +
+
+
+
+

g_value_get_flags ()

+
guint               g_value_get_flags                   (const GValue *value);
+

+Get the contents of a G_TYPE_FLAGS GValue.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_FLAGS +

Returns :

flags contents of value +
+
+
+
+

G_IS_PARAM_SPEC_STRING()

+
#define G_IS_PARAM_SPEC_STRING(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_STRING.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_STRING()

+
#define G_PARAM_SPEC_STRING(pspec)         (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_STRING, GParamSpecString))
+
+

+Casts a GParamSpec instance into a GParamSpecString.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_STRING()

+
#define G_VALUE_HOLDS_STRING(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_STRING.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_STRING

+
#define G_TYPE_PARAM_STRING		   (g_param_spec_types[14])
+
+

+The GType of GParamSpecString.

+
+
+
+

GParamSpecString

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gchar        *default_value;
+  gchar        *cset_first;
+  gchar        *cset_nth;
+  gchar         substitutor;
+  guint         null_fold_if_empty : 1;
+  guint         ensure_non_null : 1;
+} GParamSpecString;
+
+

+A GParamSpec derived structure that contains the meta data for string +properties.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gchar *default_value;

default value for the property specified +

gchar *cset_first;

a string containing the allowed values for the first byte +

gchar *cset_nth;

a string containing the allowed values for the subsequent bytes +

gchar substitutor;

the replacement byte for bytes which don't match cset_first or cset_nth. +

guint null_fold_if_empty : 1;

replace empty string by NULL +

guint ensure_non_null : 1;

replace NULL strings by an empty string +
+
+
+
+

gchararray

+
typedef gchar* gchararray;
+
+

+A C representable type name for G_TYPE_STRING.

+
+
+
+

g_param_spec_string ()

+
GParamSpec*         g_param_spec_string                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         const gchar *default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecString instance. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_string ()

+
void                g_value_set_string                  (GValue *value,
+                                                         const gchar *v_string);
+

+Set the contents of a G_TYPE_STRING GValue to v_string.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_STRING +

v_string :

caller-owned string to be duplicated for the GValue +
+
+
+
+

g_value_set_static_string ()

+
void                g_value_set_static_string           (GValue *value,
+                                                         const gchar *v_string);
+

+Set the contents of a G_TYPE_STRING GValue to v_string. +The string is assumed to be static, and is thus not duplicated +when setting the GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_STRING +

v_string :

static string to be set +
+
+
+
+

g_value_take_string ()

+
void                g_value_take_string                 (GValue *value,
+                                                         gchar *v_string);
+

+Sets the contents of a G_TYPE_STRING GValue to v_string.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_STRING +

v_string :

string to take ownership of +
+

Since 2.4

+
+
+
+

g_value_set_string_take_ownership ()

+
void                g_value_set_string_take_ownership   (GValue *value,
+                                                         gchar *v_string);
+
+

Warning

+

g_value_set_string_take_ownership has been deprecated since version 2.4 and should not be used in newly-written code. Use g_value_take_string() instead.

+
+

+This is an internal function introduced mainly for C marshallers.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_STRING +

v_string :

duplicated unowned string to be set +
+
+
+
+

g_value_get_string ()

+
const gchar*        g_value_get_string                  (const GValue *value);
+

+Get the contents of a G_TYPE_STRING GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_STRING +

Returns :

string content of value +
+
+
+
+

g_value_dup_string ()

+
gchar*              g_value_dup_string                  (const GValue *value);
+

+Get a copy the contents of a G_TYPE_STRING GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_STRING +

Returns :

a newly allocated copy of the string content of value +
+
+
+
+

G_IS_PARAM_SPEC_PARAM()

+
#define G_IS_PARAM_SPEC_PARAM(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_PARAM))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_PARAM.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_PARAM()

+
#define G_PARAM_SPEC_PARAM(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_PARAM, GParamSpecParam))
+
+

+Casts a GParamSpec instance into a GParamSpecParam.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_PARAM()

+
#define G_VALUE_HOLDS_PARAM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM))
+
+

+Checks whether the given GValue can hold values derived from type G_TYPE_PARAM.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_PARAM

+
#define G_TYPE_PARAM_PARAM		   (g_param_spec_types[15])
+
+

+The GType of GParamSpecParam.

+
+
+
+

GParamSpecParam

+
typedef struct {
+  GParamSpec    parent_instance;
+} GParamSpecParam;
+
+

+A GParamSpec derived structure that contains the meta data for G_TYPE_PARAM +properties.

+
++ + + + +

GParamSpec parent_instance;

private GParamSpec portion +
+
+
+
+

g_param_spec_param ()

+
GParamSpec*         g_param_spec_param                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType param_type,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecParam instance specifying a G_TYPE_PARAM +property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

param_type :

a GType derived from G_TYPE_PARAM +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_param ()

+
void                g_value_set_param                   (GValue *value,
+                                                         GParamSpec *param);
+

+Set the contents of a G_TYPE_PARAM GValue to param.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_PARAM +

param :

the GParamSpec to be set +
+
+
+
+

g_value_take_param ()

+
void                g_value_take_param                  (GValue *value,
+                                                         GParamSpec *param);
+

+Sets the contents of a G_TYPE_PARAM GValue to param and takes +over the ownership of the callers reference to param; the caller +doesn't have to unref it any more.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_PARAM +

param :

the GParamSpec to be set +
+

Since 2.4

+
+
+
+

g_value_set_param_take_ownership ()

+
void                g_value_set_param_take_ownership    (GValue *value,
+                                                         GParamSpec *param);
+
+

Warning

+

g_value_set_param_take_ownership has been deprecated since version 2.4 and should not be used in newly-written code. Use g_value_take_param() instead.

+
+

+This is an internal function introduced mainly for C marshallers.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_PARAM +

param :

the GParamSpec to be set +
+
+
+
+

g_value_get_param ()

+
GParamSpec*         g_value_get_param                   (const GValue *value);
+

+Get the contents of a G_TYPE_PARAM GValue.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_PARAM +

Returns :

GParamSpec content of value +
+
+
+
+

g_value_dup_param ()

+
GParamSpec*         g_value_dup_param                   (const GValue *value);
+

+Get the contents of a G_TYPE_PARAM GValue, increasing its +reference count.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_PARAM +

Returns :

GParamSpec content of value, should be unreferenced when + no longer needed. +
+
+
+
+

G_IS_PARAM_SPEC_BOXED()

+
#define G_IS_PARAM_SPEC_BOXED(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_BOXED.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_BOXED()

+
#define G_PARAM_SPEC_BOXED(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOXED, GParamSpecBoxed))
+
+

+Cast a GParamSpec instance into a GParamSpecBoxed.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_BOXED()

+
#define G_VALUE_HOLDS_BOXED(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED))
+
+

+Checks whether the given GValue can hold values derived from type G_TYPE_BOXED.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_BOXED

+
#define G_TYPE_PARAM_BOXED		   (g_param_spec_types[16])
+
+

+The GType of GParamSpecBoxed.

+
+
+
+

GParamSpecBoxed

+
typedef struct {
+  GParamSpec    parent_instance;
+} GParamSpecBoxed;
+
+

+A GParamSpec derived structure that contains the meta data for boxed properties.

+
++ + + + +

GParamSpec parent_instance;

private GParamSpec portion +
+
+
+
+

g_param_spec_boxed ()

+
GParamSpec*         g_param_spec_boxed                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType boxed_type,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecBoxed instance specifying a G_TYPE_BOXED +derived property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

boxed_type :

G_TYPE_BOXED derived type of this property +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_boxed ()

+
void                g_value_set_boxed                   (GValue *value,
+                                                         gconstpointer v_boxed);
+

+Set the contents of a G_TYPE_BOXED derived GValue to v_boxed.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_BOXED derived type +

v_boxed :

boxed value to be set +
+
+
+
+

g_value_set_static_boxed ()

+
void                g_value_set_static_boxed            (GValue *value,
+                                                         gconstpointer v_boxed);
+

+Set the contents of a G_TYPE_BOXED derived GValue to v_boxed. +The boxed value is assumed to be static, and is thus not duplicated +when setting the GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_BOXED derived type +

v_boxed :

static boxed value to be set +
+
+
+
+

g_value_take_boxed ()

+
void                g_value_take_boxed                  (GValue *value,
+                                                         gconstpointer v_boxed);
+

+Sets the contents of a G_TYPE_BOXED derived GValue to v_boxed +and takes over the ownership of the callers reference to v_boxed; +the caller doesn't have to unref it any more.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_BOXED derived type +

v_boxed :

duplicated unowned boxed value to be set +
+

Since 2.4

+
+
+
+

g_value_set_boxed_take_ownership ()

+
void                g_value_set_boxed_take_ownership    (GValue *value,
+                                                         gconstpointer v_boxed);
+
+

Warning

+

g_value_set_boxed_take_ownership has been deprecated since version 2.4 and should not be used in newly-written code. Use g_value_take_boxed() instead.

+
+

+This is an internal function introduced mainly for C marshallers.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_BOXED derived type +

v_boxed :

duplicated unowned boxed value to be set +
+
+
+
+

g_value_get_boxed ()

+
gpointer            g_value_get_boxed                   (const GValue *value);
+

+Get the contents of a G_TYPE_BOXED derived GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_BOXED derived type +

Returns :

boxed contents of value +
+
+
+
+

g_value_dup_boxed ()

+
gpointer            g_value_dup_boxed                   (const GValue *value);
+

+Get the contents of a G_TYPE_BOXED derived GValue. Upon getting, +the boxed value is duplicated and needs to be later freed with +g_boxed_free(), e.g. like: g_boxed_free (G_VALUE_TYPE (value), +return_value);

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_BOXED derived type +

Returns :

boxed contents of value +
+
+
+
+

G_IS_PARAM_SPEC_POINTER()

+
#define G_IS_PARAM_SPEC_POINTER(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_POINTER.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_POINTER()

+
#define G_PARAM_SPEC_POINTER(pspec)        (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_POINTER, GParamSpecPointer))
+
+

+Casts a GParamSpec instance into a GParamSpecPointer.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_POINTER()

+
#define G_VALUE_HOLDS_POINTER(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_POINTER.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_POINTER

+
#define G_TYPE_PARAM_POINTER		   (g_param_spec_types[17])
+
+

+The GType of GParamSpecPointer.

+
+
+
+

GParamSpecPointer

+
typedef struct {
+  GParamSpec    parent_instance;
+} GParamSpecPointer;
+
+

+A GParamSpec derived structure that contains the meta data for pointer properties.

+
++ + + + +

GParamSpec parent_instance;

private GParamSpec portion +
+
+
+
+

g_param_spec_pointer ()

+
GParamSpec*         g_param_spec_pointer                (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecPoiner instance specifying a pointer property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_pointer ()

+
void                g_value_set_pointer                 (GValue *value,
+                                                         gpointer v_pointer);
+

+Set the contents of a pointer GValue to v_pointer.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_POINTER +

v_pointer :

pointer value to be set +
+
+
+
+

g_value_get_pointer ()

+
gpointer            g_value_get_pointer                 (const GValue *value);
+

+Get the contents of a pointer GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_POINTER +

Returns :

pointer contents of value +
+
+
+
+

G_IS_PARAM_SPEC_OBJECT()

+
#define G_IS_PARAM_SPEC_OBJECT(pspec)      (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_OBJECT.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_OBJECT()

+
#define G_PARAM_SPEC_OBJECT(pspec)         (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OBJECT, GParamSpecObject))
+
+

+Casts a GParamSpec instance into a GParamSpecObject.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_VALUE_HOLDS_OBJECT()

+
#define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT))
+
+

+Checks whether the given GValue can hold values derived from type G_TYPE_OBJECT.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_PARAM_OBJECT

+
#define G_TYPE_PARAM_OBJECT		   (g_param_spec_types[19])
+
+

+The GType of GParamSpecObject.

+
+
+
+

GParamSpecObject

+
typedef struct {
+  GParamSpec    parent_instance;
+} GParamSpecObject;
+
+

+A GParamSpec derived structure that contains the meta data for object properties.

+
++ + + + +

GParamSpec parent_instance;

private GParamSpec portion +
+
+
+
+

g_param_spec_object ()

+
GParamSpec*         g_param_spec_object                 (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType object_type,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecBoxed instance specifying a G_TYPE_OBJECT +derived property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

object_type :

G_TYPE_OBJECT derived type of this property +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

g_value_set_object ()

+
void                g_value_set_object                  (GValue *value,
+                                                         gpointer v_object);
+

+Set the contents of a G_TYPE_OBJECT derived GValue to v_object. +

+

+g_value_set_object() increases the reference count of v_object +(the GValue holds a reference to v_object). If you do not wish +to increase the reference count of the object (i.e. you wish to +pass your current reference to the GValue because you no longer +need it), use g_value_take_object() instead. +

+

+It is important that your GValue holds a reference to v_object (either its +own, or one it has taken) to ensure that the object won't be destroyed while +the GValue still exists).

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_OBJECT derived type +

v_object :

object value to be set +
+
+
+
+

g_value_take_object ()

+
void                g_value_take_object                 (GValue *value,
+                                                         gpointer v_object);
+

+Sets the contents of a G_TYPE_OBJECT derived GValue to v_object +and takes over the ownership of the callers reference to v_object; +the caller doesn't have to unref it any more (i.e. the reference +count of the object is not increased). +

+

+If you want the GValue to hold its own reference to v_object, use +g_value_set_object() instead.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_OBJECT derived type +

v_object :

object value to be set +
+

Since 2.4

+
+
+
+

g_value_set_object_take_ownership ()

+
void                g_value_set_object_take_ownership   (GValue *value,
+                                                         gpointer v_object);
+
+

Warning

+

g_value_set_object_take_ownership has been deprecated since version 2.4 and should not be used in newly-written code. Use g_value_take_object() instead.

+
+

+This is an internal function introduced mainly for C marshallers.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_OBJECT derived type +

v_object :

object value to be set +
+
+
+
+

g_value_get_object ()

+
gpointer            g_value_get_object                  (const GValue *value);
+

+Get the contents of a G_TYPE_OBJECT derived GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of G_TYPE_OBJECT derived type +

Returns :

object contents of value +
+
+
+
+

g_value_dup_object ()

+
gpointer            g_value_dup_object                  (const GValue *value);
+

+Get the contents of a G_TYPE_OBJECT derived GValue, increasing +its reference count.

+
++ + + + + + + + + + +

value :

a valid GValue whose type is derived from G_TYPE_OBJECT +

Returns :

object content of value, should be unreferenced when no + longer needed. +
+
+
+
+

G_IS_PARAM_SPEC_UNICHAR()

+
#define G_IS_PARAM_SPEC_UNICHAR(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UNICHAR))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_UNICHAR.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_UNICHAR()

+
#define G_PARAM_SPEC_UNICHAR(pspec)        (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UNICHAR, GParamSpecUnichar))
+
+

+Cast a GParamSpec instance into a GParamSpecUnichar.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_TYPE_PARAM_UNICHAR

+
#define G_TYPE_PARAM_UNICHAR		   (g_param_spec_types[9])
+
+

+The GType of GParamSpecUnichar.

+
+
+
+

GParamSpecUnichar

+
typedef struct {
+  GParamSpec    parent_instance;
+  
+  gunichar      default_value;
+} GParamSpecUnichar;
+
+

+A GParamSpec derived structure that contains the meta data for unichar (unsigned integer) properties.

+
++ + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

gunichar default_value;

default value for the property specified +
+
+
+
+

g_param_spec_unichar ()

+
GParamSpec*         g_param_spec_unichar                (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         gunichar default_value,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecUnichar instance specifying a G_TYPE_UINT +property. GValue structures for this property can be accessed with +g_value_set_uint() and g_value_get_uint(). +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

default_value :

default value for the property specified +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

G_IS_PARAM_SPEC_VALUE_ARRAY()

+
#define G_IS_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VALUE_ARRAY))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_VALUE_ARRAY.

+
++ + + + + + + + + + +

pspec :

a valid GParamSpec instance +

Returns :

TRUE on success. +
+
+
+
+

G_PARAM_SPEC_VALUE_ARRAY()

+
#define G_PARAM_SPEC_VALUE_ARRAY(pspec)    (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VALUE_ARRAY, GParamSpecValueArray))
+
+

+Cast a GParamSpec instance into a GParamSpecValueArray.

+
++ + + + +

pspec :

a valid GParamSpec instance +
+
+
+
+

G_TYPE_PARAM_VALUE_ARRAY

+
#define G_TYPE_PARAM_VALUE_ARRAY	   (g_param_spec_types[18])
+
+

+The GType of GParamSpecValueArray.

+
+
+
+

GParamSpecValueArray

+
typedef struct {
+  GParamSpec    parent_instance;
+  GParamSpec   *element_spec;
+  guint		fixed_n_elements;
+} GParamSpecValueArray;
+
+

+A GParamSpec derived structure that contains the meta data for GValueArray properties.

+
++ + + + + + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

GParamSpec *element_spec;

a GParamSpec describing the elements contained in arrays of this property, may be NULL +

guint fixed_n_elements;

if greater than 0, arrays of this property will always have this many elements +
+
+
+
+

g_param_spec_value_array ()

+
GParamSpec*         g_param_spec_value_array            (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GParamSpec *element_spec,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecValueArray instance specifying a +G_TYPE_VALUE_ARRAY property. G_TYPE_VALUE_ARRAY is a +G_TYPE_BOXED type, as such, GValue structures for this property +can be accessed with g_value_set_boxed() and g_value_get_boxed(). +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

element_spec :

a GParamSpec describing the elements contained in + arrays of this property, may be NULL +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+
+
+
+

G_IS_PARAM_SPEC_OVERRIDE()

+
#define G_IS_PARAM_SPEC_OVERRIDE(pspec)    (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OVERRIDE))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_OVERRIDE.

+
++ + + + + + + + + + +

pspec :

a GParamSpec +

Returns :

TRUE on success. +
+

Since 2.4

+
+
+
+

G_PARAM_SPEC_OVERRIDE()

+
#define G_PARAM_SPEC_OVERRIDE(pspec)       (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OVERRIDE, GParamSpecOverride))
+
+

+Casts a GParamSpec into a GParamSpecOverride.

+
++ + + + +

pspec :

a GParamSpec +
+

Since 2.4

+
+
+
+

G_TYPE_PARAM_OVERRIDE

+
#define G_TYPE_PARAM_OVERRIDE		   (g_param_spec_types[20])
+
+

+The GType of GParamSpecOverride.

+

Since 2.4

+
+
+
+

GParamSpecOverride

+
typedef struct {
+} GParamSpecOverride;
+
+

+This is a type of GParamSpec type that simply redirects operations to +another paramspec. All operations other than getting or +setting the value are redirected, including accessing the nick and +blurb, validating a value, and so forth. See +g_param_spec_get_redirect_target() for retrieving the overidden +property. GParamSpecOverride is used in implementing +g_object_class_override_property(), and will not be directly useful +unless you are implementing a new base type similar to GObject.

+

Since 2.4

+
+
+
+

g_param_spec_override ()

+
GParamSpec*         g_param_spec_override               (const gchar *name,
+                                                         GParamSpec *overridden);
+

+Creates a new property of type GParamSpecOverride. This is used +to direct operations to another paramspec, and will not be directly +useful unless you are implementing a new base type similar to GObject.

+
++ + + + + + + + + + + + + + +

name :

the name of the property. +

overridden :

The property that is being overridden +

Returns :

the newly created GParamSpec +
+

Since 2.4

+
+
+
+

G_IS_PARAM_SPEC_GTYPE()

+
#define G_IS_PARAM_SPEC_GTYPE(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_GTYPE))
+
+

+Checks whether the given GParamSpec is of type G_TYPE_PARAM_GTYPE.

+
++ + + + + + + + + + +

pspec :

a GParamSpec +

Returns :

TRUE on success. +
+

Since 2.10

+
+
+
+

G_PARAM_SPEC_GTYPE()

+
#define G_PARAM_SPEC_GTYPE(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_GTYPE, GParamSpecGType))
+
+

+Casts a GParamSpec into a GParamSpecGType.

+
++ + + + +

pspec :

a GParamSpec +
+

Since 2.10

+
+
+
+

G_VALUE_HOLDS_GTYPE()

+
#define G_VALUE_HOLDS_GTYPE(value)	 (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_GTYPE))
+
+

+Checks whether the given GValue can hold values of type G_TYPE_GTYPE.

+
++ + + + + + + + + + +

value :

a valid GValue structure +

Returns :

TRUE on success. +
+

Since 2.12

+
+
+
+

G_TYPE_PARAM_GTYPE

+
#define G_TYPE_PARAM_GTYPE		   (g_param_spec_types[21])
+
+

+The GType of GParamSpecGType.

+

Since 2.10

+
+
+
+

GParamSpecGType

+
typedef struct {
+  GParamSpec    parent_instance;
+  GType         is_a_type;
+} GParamSpecGType;
+
+

+A GParamSpec derived structure that contains the meta data for GType properties.

+
++ + + + + + + + + + +

GParamSpec parent_instance;

private GParamSpec portion +

GType is_a_type;

a GType whose subtypes can occur as values +
+

Since 2.10

+
+
+
+

g_param_spec_gtype ()

+
GParamSpec*         g_param_spec_gtype                  (const gchar *name,
+                                                         const gchar *nick,
+                                                         const gchar *blurb,
+                                                         GType is_a_type,
+                                                         GParamFlags flags);
+

+Creates a new GParamSpecGType instance specifying a +G_TYPE_GTYPE property. +

+

+See g_param_spec_internal() for details on property names.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

name :

canonical name of the property specified +

nick :

nick name for the property specified +

blurb :

description of the property specified +

is_a_type :

a GType whose subtypes are allowed as values + of the property (use G_TYPE_NONE for any type) +

flags :

flags for the property specified +

Returns :

a newly created parameter specification +
+

Since 2.10

+
+
+
+

g_value_get_gtype ()

+
GType               g_value_get_gtype                   (const GValue *value);
+

+Get the contents of a G_TYPE_GTYPE GValue.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_GTYPE +

Returns :

the GType stored in value +
+

Since 2.12

+
+
+
+

g_value_set_gtype ()

+
void                g_value_set_gtype                   (GValue *value,
+                                                         GType v_gtype);
+

+Set the contents of a G_TYPE_GTYPE GValue to v_gtype.

+
++ + + + + + + + + + +

value :

a valid GValue of type G_TYPE_GTYPE +

v_gtype :

GType to be set +
+

Since 2.12

+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-The-Base-Object-Type.html b/docs/reference/gobject/html/gobject-The-Base-Object-Type.html new file mode 100644 index 0000000..495c447 --- /dev/null +++ b/docs/reference/gobject/html/gobject-The-Base-Object-Type.html @@ -0,0 +1,2438 @@ + + + + +The Base Object Type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

The Base Object Type

+

The Base Object Type — The base object type

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+                    GObject;
+                    GObjectClass;
+                    GObjectConstructParam;
+void                (*GObjectGetPropertyFunc)           (GObject *object,
+                                                         guint property_id,
+                                                         GValue *value,
+                                                         GParamSpec *pspec);
+void                (*GObjectSetPropertyFunc)           (GObject *object,
+                                                         guint property_id,
+                                                         const GValue *value,
+                                                         GParamSpec *pspec);
+void                (*GObjectFinalizeFunc)              (GObject *object);
+#define             G_TYPE_IS_OBJECT                    (type)
+#define             G_OBJECT                            (object)
+#define             G_IS_OBJECT                         (object)
+#define             G_OBJECT_CLASS                      (class)
+#define             G_IS_OBJECT_CLASS                   (class)
+#define             G_OBJECT_GET_CLASS                  (object)
+#define             G_OBJECT_TYPE                       (object)
+#define             G_OBJECT_TYPE_NAME                  (object)
+#define             G_OBJECT_CLASS_TYPE                 (class)
+#define             G_OBJECT_CLASS_NAME                 (class)
+void                g_object_class_install_property     (GObjectClass *oclass,
+                                                         guint property_id,
+                                                         GParamSpec *pspec);
+GParamSpec*         g_object_class_find_property        (GObjectClass *oclass,
+                                                         const gchar *property_name);
+GParamSpec**        g_object_class_list_properties      (GObjectClass *oclass,
+                                                         guint *n_properties);
+void                g_object_class_override_property    (GObjectClass *oclass,
+                                                         guint property_id,
+                                                         const gchar *name);
+void                g_object_interface_install_property (gpointer g_iface,
+                                                         GParamSpec *pspec);
+GParamSpec*         g_object_interface_find_property    (gpointer g_iface,
+                                                         const gchar *property_name);
+GParamSpec**        g_object_interface_list_properties  (gpointer g_iface,
+                                                         guint *n_properties_p);
+gpointer            g_object_new                        (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         ...);
+gpointer            g_object_newv                       (GType object_type,
+                                                         guint n_parameters,
+                                                         GParameter *parameters);
+                    GParameter;
+gpointer            g_object_ref                        (gpointer object);
+void                g_object_unref                      (gpointer object);
+gpointer            g_object_ref_sink                   (gpointer object);
+typedef             GInitiallyUnowned;
+typedef             GInitiallyUnownedClass;
+#define             G_TYPE_INITIALLY_UNOWNED
+gboolean            g_object_is_floating                (gpointer object);
+void                g_object_force_floating             (GObject *object);
+void                (*GWeakNotify)                      (gpointer data,
+                                                         GObject *where_the_object_was);
+void                g_object_weak_ref                   (GObject *object,
+                                                         GWeakNotify notify,
+                                                         gpointer data);
+void                g_object_weak_unref                 (GObject *object,
+                                                         GWeakNotify notify,
+                                                         gpointer data);
+void                g_object_add_weak_pointer           (GObject *object,
+                                                         gpointer *weak_pointer_location);
+void                g_object_remove_weak_pointer        (GObject *object,
+                                                         gpointer *weak_pointer_location);
+void                (*GToggleNotify)                    (gpointer data,
+                                                         GObject *object,
+                                                         gboolean is_last_ref);
+void                g_object_add_toggle_ref             (GObject *object,
+                                                         GToggleNotify notify,
+                                                         gpointer data);
+void                g_object_remove_toggle_ref          (GObject *object,
+                                                         GToggleNotify notify,
+                                                         gpointer data);
+gpointer            g_object_connect                    (gpointer object,
+                                                         const gchar *signal_spec,
+                                                         ...);
+void                g_object_disconnect                 (gpointer object,
+                                                         const gchar *signal_spec,
+                                                         ...);
+void                g_object_set                        (gpointer object,
+                                                         const gchar *first_property_name,
+                                                         ...);
+void                g_object_get                        (gpointer object,
+                                                         const gchar *first_property_name,
+                                                         ...);
+void                g_object_notify                     (GObject *object,
+                                                         const gchar *property_name);
+void                g_object_freeze_notify              (GObject *object);
+void                g_object_thaw_notify                (GObject *object);
+gpointer            g_object_get_data                   (GObject *object,
+                                                         const gchar *key);
+void                g_object_set_data                   (GObject *object,
+                                                         const gchar *key,
+                                                         gpointer data);
+void                g_object_set_data_full              (GObject *object,
+                                                         const gchar *key,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy);
+gpointer            g_object_steal_data                 (GObject *object,
+                                                         const gchar *key);
+gpointer            g_object_get_qdata                  (GObject *object,
+                                                         GQuark quark);
+void                g_object_set_qdata                  (GObject *object,
+                                                         GQuark quark,
+                                                         gpointer data);
+void                g_object_set_qdata_full             (GObject *object,
+                                                         GQuark quark,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy);
+gpointer            g_object_steal_qdata                (GObject *object,
+                                                         GQuark quark);
+void                g_object_set_property               (GObject *object,
+                                                         const gchar *property_name,
+                                                         const GValue *value);
+void                g_object_get_property               (GObject *object,
+                                                         const gchar *property_name,
+                                                         GValue *value);
+GObject*            g_object_new_valist                 (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args);
+void                g_object_set_valist                 (GObject *object,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args);
+void                g_object_get_valist                 (GObject *object,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args);
+void                g_object_watch_closure              (GObject *object,
+                                                         GClosure *closure);
+void                g_object_run_dispose                (GObject *object);
+#define             G_OBJECT_WARN_INVALID_PROPERTY_ID   (object, property_id, pspec)
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GTypeModule
+
+
+
+

Signals

+
+  "notify"                                         : Run First / No Recursion / Has Details / Action / No Hooks
+
+
+
+

Description

+

+GObject is the fundamental type providing the common attributes and +methods for all object types in GTK+, Pango and other libraries +based on GObject. The GObject class provides methods for object +construction and destruction, property access methods, and signal +support. Signals are described in detail in Signals(3). +

+

+

+

+GInitiallyUnowned is derived from GObject. The only difference between +the two is that the initial reference of a GInitiallyUnowned is flagged +as a floating reference. +This means that it is not specifically claimed to be "owned" by +any code portion. The main motivation for providing floating references is +C convenience. In particular, it allows code to be written as: +

+
+container = create_container();
+container_add_child (container, create_child());
+
+

+If container_add_child() will g_object_ref_sink() the +passed in child, no reference of the newly created child is leaked. +Without floating references, container_add_child() +can only g_object_ref() the new child, so to implement this code without +reference leaks, it would have to be written as: +

+
+Child *child;
+container = create_container();
+child = create_child();
+container_add_child (container, child);
+g_object_unref (child);
+
+

+The floating reference can be converted into +an ordinary reference by calling g_object_ref_sink(). +For already sunken objects (objects that don't have a floating reference +anymore), g_object_ref_sink() is equivalent to g_object_ref() and returns +a new reference. +Since floating references are useful almost exclusively for C convenience, +language bindings that provide automated reference and memory ownership +maintenance (such as smart pointers or garbage collection) therefore don't +need to expose floating references in their API. +

+

+

+

+Some object implementations may need to save an objects floating state +across certain code portions (an example is GtkMenu), to achive this, the +following sequence can be used: +

+

+

+
+// save floating state
+gboolean was_floating = g_object_is_floating (object);
+g_object_ref_sink (object);
+// protected code portion
+...;
+// restore floating state
+if (was_floating)
+  g_object_force_floating (object);
+g_obejct_unref (object); // release previously acquired reference
+
+
+
+

Details

+
+

GObject

+
typedef struct _GObject GObject;
+

+All the fields in the GObject structure are private +to the GObject implementation and should never be accessed directly.

+
+
+
+

GObjectClass

+
typedef struct {
+  GTypeClass   g_type_class;
+
+  /* seldomly overidden */
+  GObject*   (*constructor)     (GType                  type,
+                                 guint                  n_construct_properties,
+                                 GObjectConstructParam *construct_properties);
+  /* overridable methods */
+  void       (*set_property)		(GObject        *object,
+                                         guint           property_id,
+                                         const GValue   *value,
+                                         GParamSpec     *pspec);
+  void       (*get_property)		(GObject        *object,
+                                         guint           property_id,
+                                         GValue         *value,
+                                         GParamSpec     *pspec);
+  void       (*dispose)			(GObject        *object);
+  void       (*finalize)		(GObject        *object);
+  /* seldomly overidden */
+  void       (*dispatch_properties_changed) (GObject      *object,
+					     guint	   n_pspecs,
+					     GParamSpec  **pspecs);
+  /* signals */
+  void	     (*notify)			(GObject *object,
+					 GParamSpec *pspec);
+
+  /* called when done constructing */
+  void	     (*constructed)		(GObject *object);
+} GObjectClass;
+
+

+The class structure for the GObject type. +

+

+

+
+

Example 1. Implementing singletons using a constructor

+
+static MySingleton *the_singleton = NULL;
+
+static GObject*
+my_singleton_constructor (GType                  type,
+                          guint                  n_construct_params,
+                          GObjectConstructParam *construct_params)
+{
+  GObject *object;
+  
+  if (!the_singleton)
+    {
+      object = G_OBJECT_CLASS (parent_class)->constructor (type,
+                                                           n_construct_params,
+                                                           construct_params);
+      the_singleton = MY_SINGLETON (object);
+    }
+  else
+    object = g_object_ref (G_OBJECT (the_singleton));
+
+  return object;
+}
+
+
+


+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GTypeClass g_type_class;

the parent class +

constructor ()

the constructor function is called by g_object_new() to + complete the object initialization after all the construction properties are + set. The first thing a constructor implementation must do is chain up to the + constructor of the parent class. Overriding constructor should be rarely + needed, e.g. to handle construct properties, or to implement singletons. +

set_property ()

the generic setter for all properties of this type. Should be + overridden for every type with properties. Implementations of set_property + don't need to emit property change notification explicitly, this is handled + by the type system. +

get_property ()

the generic getter for all properties of this type. Should be + overridden for every type with properties. +

dispose ()

the dispose function is supposed to drop all references to other + objects, but keep the instance otherwise intact, so that client method + invocations still work. It may be run multiple times (due to reference + loops). Before returning, dispose should chain up to the dispose method + of the parent class. +

finalize ()

instance finalization function, should finish the finalization of + the instance begun in dispose and chain up to the finalize method of the + parent class. +

dispatch_properties_changed ()

emits property change notification for a bunch + of properties. Overriding dispatch_properties_changed should be rarely + needed. +

notify ()

the class closure for the notify signal +

constructed ()

the constructed function is called by g_object_new() as the + final step of the object creation process. At the point of the call, all + construction properties have been set on the object. The purpose of this + call is to allow for object initialisation steps that can only be performed + after construction properties have been set. constructed implementors + should chain up to the constructed call of their parent class to allow it + to complete its initialisation. +
+
+
+
+

GObjectConstructParam

+
typedef struct {
+  GParamSpec *pspec;
+  GValue     *value;
+} GObjectConstructParam;
+
+

+The GObjectConstructParam struct is an auxiliary +structure used to hand GParamSpec/GValue pairs to the constructor of +a GObjectClass.

+
++ + + + + + + + + + +

GParamSpec *pspec;

the GParamSpec of the construct parameter +

GValue *value;

the value to set the parameter to +
+
+
+
+

GObjectGetPropertyFunc ()

+
void                (*GObjectGetPropertyFunc)           (GObject *object,
+                                                         guint property_id,
+                                                         GValue *value,
+                                                         GParamSpec *pspec);
+

+The type of the get_property function of GObjectClass.

+
++ + + + + + + + + + + + + + + + + + +

object :

a GObject +

property_id :

the numeric id under which the property was registered with + g_object_class_install_property(). +

value :

a GValue to return the property value in +

pspec :

the GParamSpec describing the property +
+
+
+
+

GObjectSetPropertyFunc ()

+
void                (*GObjectSetPropertyFunc)           (GObject *object,
+                                                         guint property_id,
+                                                         const GValue *value,
+                                                         GParamSpec *pspec);
+

+The type of the set_property function of GObjectClass.

+
++ + + + + + + + + + + + + + + + + + +

object :

a GObject +

property_id :

the numeric id under which the property was registered with + g_object_class_install_property(). +

value :

the new value for the property +

pspec :

the GParamSpec describing the property +
+
+
+
+

GObjectFinalizeFunc ()

+
void                (*GObjectFinalizeFunc)              (GObject *object);
+

+The type of the finalize function of GObjectClass.

+
++ + + + +

object :

the GObject being finalized +
+
+
+
+

G_TYPE_IS_OBJECT()

+
#define G_TYPE_IS_OBJECT(type)      (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT)
+
+

+Check if the passed in type id is a G_TYPE_OBJECT or derived from it.

+
++ + + + + + + + + + +

type :

Type id to check +

Returns :

FALSE or TRUE, indicating whether type is a G_TYPE_OBJECT. +
+
+
+
+

G_OBJECT()

+
#define G_OBJECT(object)            (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject))
+
+

+Casts a GObject or derived pointer into a (GObject*) pointer. +Depending on the current debugging level, this function may invoke +certain runtime checks to identify invalid casts.

+
++ + + + +

object :

Object which is subject to casting. +
+
+
+
+

G_IS_OBJECT()

+
#define G_IS_OBJECT(object)         (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT))
+
+

+Checks whether a valid GTypeInstance pointer is of type G_TYPE_OBJECT.

+
++ + + + +

object :

Instance to check for being a G_TYPE_OBJECT. +
+
+
+
+

G_OBJECT_CLASS()

+
#define G_OBJECT_CLASS(class)       (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass))
+
+

+Casts a derived GObjectClass structure into a GObjectClass structure.

+
++ + + + +

class :

a valid GObjectClass +
+
+
+
+

G_IS_OBJECT_CLASS()

+
#define G_IS_OBJECT_CLASS(class)    (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT))
+
+

+Checks whether class "is a" valid GObjectClass structure of type +G_TYPE_OBJECT or derived.

+
++ + + + +

class :

a GObjectClass +
+
+
+
+

G_OBJECT_GET_CLASS()

+
#define G_OBJECT_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass))
+
+

+Get the class structure associated to a GObject instance.

+
++ + + + + + + + + + +

object :

a GObject instance. +

Returns :

pointer to object class structure. +
+
+
+
+

G_OBJECT_TYPE()

+
#define G_OBJECT_TYPE(object)       (G_TYPE_FROM_INSTANCE (object))
+
+

+Get the type id of an object.

+
++ + + + + + + + + + +

object :

Object to return the type id for. +

Returns :

Type id of object. +
+
+
+
+

G_OBJECT_TYPE_NAME()

+
#define G_OBJECT_TYPE_NAME(object)  (g_type_name (G_OBJECT_TYPE (object)))
+
+

+Get the name of an object's type.

+
++ + + + + + + + + + +

object :

Object to return the type name for. +

Returns :

Type name of object. The string is owned by the type system and + should not be freed. +
+
+
+
+

G_OBJECT_CLASS_TYPE()

+
#define G_OBJECT_CLASS_TYPE(class)  (G_TYPE_FROM_CLASS (class))
+
+

+Get the type id of a class structure.

+
++ + + + + + + + + + +

class :

a valid GObjectClass +

Returns :

Type id of class. +
+
+
+
+

G_OBJECT_CLASS_NAME()

+
#define G_OBJECT_CLASS_NAME(class)  (g_type_name (G_OBJECT_CLASS_TYPE (class)))
+
+

+Return the name of a class structure's type.

+
++ + + + + + + + + + +

class :

a valid GObjectClass +

Returns :

Type name of class. The string is owned by the type system and + should not be freed. +
+
+
+
+

g_object_class_install_property ()

+
void                g_object_class_install_property     (GObjectClass *oclass,
+                                                         guint property_id,
+                                                         GParamSpec *pspec);
+

+Installs a new property. This is usually done in the class initializer. +

+

+Note that it is possible to redefine a property in a derived class, +by installing a property with the same name. This can be useful at times, +e.g. to change the range of allowed values or the default value.

+
++ + + + + + + + + + + + + + +

oclass :

a GObjectClass +

property_id :

the id for the new property +

pspec :

the GParamSpec for the new property +
+
+
+
+

g_object_class_find_property ()

+
GParamSpec*         g_object_class_find_property        (GObjectClass *oclass,
+                                                         const gchar *property_name);
+

+Looks up the GParamSpec for a property of a class.

+
++ + + + + + + + + + + + + + +

oclass :

a GObjectClass +

property_name :

the name of the property to look up +

Returns :

the GParamSpec for the property, or NULL if the class + doesn't have a property of that name +
+
+
+
+

g_object_class_list_properties ()

+
GParamSpec**        g_object_class_list_properties      (GObjectClass *oclass,
+                                                         guint *n_properties);
+

+Get an array of GParamSpec* for all properties of a class.

+
++ + + + + + + + + + + + + + +

oclass :

a GObjectClass +

n_properties :

return location for the length of the returned array +

Returns :

an array of GParamSpec* which should be freed after use +
+
+
+
+

g_object_class_override_property ()

+
void                g_object_class_override_property    (GObjectClass *oclass,
+                                                         guint property_id,
+                                                         const gchar *name);
+

+Registers property_id as referring to a property with the +name name in a parent class or in an interface implemented +by oclass. This allows this class to override +a property implementation in a parent class or to provide +the implementation of a property from an interface. +

+

+

+
+

Note

+Internally, overriding is implemented by creating a property of type +GParamSpecOverride; generally operations that query the properties of +the object class, such as g_object_class_find_property() or +g_object_class_list_properties() will return the overridden +property. However, in one case, the construct_properties argument of +the constructor virtual function, the GParamSpecOverride is passed +instead, so that the param_id field of the GParamSpec will be +correct. For virtually all uses, this makes no difference. If you +need to get the overridden property, you can call +g_param_spec_get_redirect_target(). +
+
++ + + + + + + + + + + + + + +

oclass :

a GObjectClass +

property_id :

the new property ID +

name :

the name of a property registered in a parent class or + in an interface of this class. +
+

Since 2.4

+
+
+
+

g_object_interface_install_property ()

+
void                g_object_interface_install_property (gpointer g_iface,
+                                                         GParamSpec *pspec);
+

+Add a property to an interface; this is only useful for interfaces +that are added to GObject-derived types. Adding a property to an +interface forces all objects classes with that interface to have a +compatible property. The compatible property could be a newly +created GParamSpec, but normally +g_object_class_override_property() will be used so that the object +class only needs to provide an implementation and inherits the +property description, default value, bounds, and so forth from the +interface property. +

+

+This function is meant to be called from the interface's default +vtable initialization function (the class_init member of +GTypeInfo.) It must not be called after after class_init has +been called for any object types implementing this interface.

+
++ + + + + + + + + + +

g_iface :

any interface vtable for the interface, or the default + vtable for the interface. +

pspec :

the GParamSpec for the new property +
+

Since 2.4

+
+
+
+

g_object_interface_find_property ()

+
GParamSpec*         g_object_interface_find_property    (gpointer g_iface,
+                                                         const gchar *property_name);
+

+Find the GParamSpec with the given name for an +interface. Generally, the interface vtable passed in as g_iface +will be the default vtable from g_type_default_interface_ref(), or, +if you know the interface has already been loaded, +g_type_default_interface_peek().

+
++ + + + + + + + + + + + + + +

g_iface :

any interface vtable for the interface, or the default + vtable for the interface +

property_name :

name of a property to lookup. +

Returns :

the GParamSpec for the property of the interface with the + name property_name, or NULL if no such property exists. +
+

Since 2.4

+
+
+
+

g_object_interface_list_properties ()

+
GParamSpec**        g_object_interface_list_properties  (gpointer g_iface,
+                                                         guint *n_properties_p);
+

+Lists the properties of an interface.Generally, the interface +vtable passed in as g_iface will be the default vtable from +g_type_default_interface_ref(), or, if you know the interface has +already been loaded, g_type_default_interface_peek().

+
++ + + + + + + + + + + + + + +

g_iface :

any interface vtable for the interface, or the default + vtable for the interface +

n_properties_p :

location to store number of properties returned. +

Returns :

a pointer to an array of pointers to GParamSpec + structures. The paramspecs are owned by GLib, but the + array should be freed with g_free() when you are done with + it. +
+

Since 2.4

+
+
+
+

g_object_new ()

+
gpointer            g_object_new                        (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         ...);
+

+Creates a new instance of a GObject subtype and sets its properties. +

+

+Construction parameters (see G_PARAM_CONSTRUCT, G_PARAM_CONSTRUCT_ONLY) +which are not explicitly specified are set to their default values.

+
++ + + + + + + + + + + + + + + + + + +

object_type :

the type id of the GObject subtype to instantiate +

first_property_name :

the name of the first property +

... :

the value of the first property, followed optionally by more + name/value pairs, followed by NULL +

Returns :

a new instance of object_type +
+
+
+
+

g_object_newv ()

+
gpointer            g_object_newv                       (GType object_type,
+                                                         guint n_parameters,
+                                                         GParameter *parameters);
+

+Creates a new instance of a GObject subtype and sets its properties. +

+

+Construction parameters (see G_PARAM_CONSTRUCT, G_PARAM_CONSTRUCT_ONLY) +which are not explicitly specified are set to their default values.

+
++ + + + + + + + + + + + + + + + + + +

object_type :

the type id of the GObject subtype to instantiate +

n_parameters :

the length of the parameters array +

parameters :

an array of GParameter +

Returns :

a new instance of object_type +
+
+
+
+

GParameter

+
typedef struct {
+  const gchar *name;
+  GValue       value;
+} GParameter;
+
+

+The GParameter struct is an auxiliary structure used +to hand parameter name/value pairs to g_object_newv().

+
++ + + + + + + + + + +

const gchar *name;

the parameter name +

GValue value;

the parameter value +
+
+
+
+

g_object_ref ()

+
gpointer            g_object_ref                        (gpointer object);
+

+Increases the reference count of object.

+
++ + + + + + + + + + +

object :

a GObject +

Returns :

the same object +
+
+
+
+

g_object_unref ()

+
void                g_object_unref                      (gpointer object);
+

+Decreases the reference count of object. When its reference count +drops to 0, the object is finalized (i.e. its memory is freed).

+
++ + + + +

object :

a GObject +
+
+
+
+

g_object_ref_sink ()

+
gpointer            g_object_ref_sink                   (gpointer object);
+

+Increase the reference count of object, and possibly remove the +floating reference, if object +has a floating reference. +

+

+In other words, if the object is floating, then this call "assumes +ownership" of the floating reference, converting it to a normal +reference by clearing the floating flag while leaving the reference +count unchanged. If the object is not floating, then this call +adds a new normal reference increasing the reference count by one.

+
++ + + + + + + + + + +

object :

a GObject +

Returns :

object +
+

Since 2.10

+
+
+
+

GInitiallyUnowned

+
typedef struct _GObject                  GInitiallyUnowned;
+
+

+All the fields in the GInitiallyUnowned structure +are private to the GInitiallyUnowned implementation and should never be +accessed directly.

+
+
+
+

GInitiallyUnownedClass

+
typedef struct _GObjectClass             GInitiallyUnownedClass;
+
+

+The class structure for the GInitiallyUnowned type.

+
+
+
+

G_TYPE_INITIALLY_UNOWNED

+
#define G_TYPE_INITIALLY_UNOWNED	      (g_initially_unowned_get_type())
+
+

+The type for GInitiallyUnowned.

+
+
+
+

g_object_is_floating ()

+
gboolean            g_object_is_floating                (gpointer object);
+

+Checks wether object has a floating +reference.

+
++ + + + + + + + + + +

object :

a GObject +

Returns :

TRUE if object has a floating reference +
+

Since 2.10

+
+
+
+

g_object_force_floating ()

+
void                g_object_force_floating             (GObject *object);
+

+This function is intended for GObject implementations to re-enforce a +floating object reference. +Doing this is seldomly required, all +GInitiallyUnowneds are created with a floating reference which +usually just needs to be sunken by calling g_object_ref_sink().

+
++ + + + +

object :

a GObject +
+

Since 2.10

+
+
+
+

GWeakNotify ()

+
void                (*GWeakNotify)                      (gpointer data,
+                                                         GObject *where_the_object_was);
+

+A GWeakNotify function can be added to an object as a callback that gets +triggered when the object is finalized. Since the object is already being +finalized when the GWeakNotify is called, there's not much you could do +with the object, apart from e.g. using its adress as hash-index or the like.

+
++ + + + + + + + + + +

data :

data that was provided when the weak reference was established +

where_the_object_was :

the object being finalized +
+
+
+
+

g_object_weak_ref ()

+
void                g_object_weak_ref                   (GObject *object,
+                                                         GWeakNotify notify,
+                                                         gpointer data);
+

+Adds a weak reference callback to an object. Weak references are +used for notification when an object is finalized. They are called +"weak references" because they allow you to safely hold a pointer +to an object without calling g_object_ref() (g_object_ref() adds a +strong reference, that is, forces the object to stay alive).

+
++ + + + + + + + + + + + + + +

object :

GObject to reference weakly +

notify :

callback to invoke before the object is freed +

data :

extra data to pass to notify +
+
+
+
+

g_object_weak_unref ()

+
void                g_object_weak_unref                 (GObject *object,
+                                                         GWeakNotify notify,
+                                                         gpointer data);
+

+Removes a weak reference callback to an object.

+
++ + + + + + + + + + + + + + +

object :

GObject to remove a weak reference from +

notify :

callback to search for +

data :

data to search for +
+
+
+
+

g_object_add_weak_pointer ()

+
void                g_object_add_weak_pointer           (GObject *object,
+                                                         gpointer *weak_pointer_location);
+

+Adds a weak reference from weak_pointer to object to indicate that +the pointer located at weak_pointer_location is only valid during +the lifetime of object. When the object is finalized, +weak_pointer will be set to NULL.

+
++ + + + + + + + + + +

object :

The object that should be weak referenced. +

weak_pointer_location :

The memory address of a pointer. +
+
+
+
+

g_object_remove_weak_pointer ()

+
void                g_object_remove_weak_pointer        (GObject *object,
+                                                         gpointer *weak_pointer_location);
+

+Removes a weak reference from object that was previously added +using g_object_add_weak_pointer(). The weak_pointer_location has +to match the one used with g_object_add_weak_pointer().

+
++ + + + + + + + + + +

object :

The object that is weak referenced. +

weak_pointer_location :

The memory address of a pointer. +
+
+
+
+

GToggleNotify ()

+
void                (*GToggleNotify)                    (gpointer data,
+                                                         GObject *object,
+                                                         gboolean is_last_ref);
+

+A callback function used for notification when the state +of a toggle reference changes. See g_object_add_toggle_ref().

+
++ + + + + + + + + + + + + + +

data :

Callback data passed to g_object_add_toggle_ref() +

object :

The object on which g_object_add_toggle_ref() was called. +

is_last_ref :

TRUE if the toggle reference is now the + last reference to the object. FALSE if the toggle + reference was the last reference and there are now other + references. +
+
+
+
+

g_object_add_toggle_ref ()

+
void                g_object_add_toggle_ref             (GObject *object,
+                                                         GToggleNotify notify,
+                                                         gpointer data);
+

+Increases the reference count of the object by one and sets a +callback to be called when all other references to the object are +dropped, or when this is already the last reference to the object +and another reference is established. +

+

+This functionality is intended for binding object to a proxy +object managed by another memory manager. This is done with two +paired references: the strong reference added by +g_object_add_toggle_ref() and a reverse reference to the proxy +object which is either a strong reference or weak reference. +

+

+The setup is that when there are no other references to object, +only a weak reference is held in the reverse direction from object +to the proxy object, but when there are other references held to +object, a strong reference is held. The notify callback is called +when the reference from object to the proxy object should be +toggled from strong to weak (is_last_ref +true) or weak to strong (is_last_ref false). +

+

+Since a (normal) reference must be held to the object before +calling g_object_toggle_ref(), the initial state of the reverse +link is always strong. +

+

+Multiple toggle references may be added to the same gobject, +however if there are multiple toggle references to an object, none +of them will ever be notified until all but one are removed. For +this reason, you should only ever use a toggle reference if there +is important state in the proxy object.

+
++ + + + + + + + + + + + + + +

object :

a GObject +

notify :

a function to call when this reference is the + last reference to the object, or is no longer + the last reference. +

data :

data to pass to notify +
+

Since 2.8

+
+
+
+

g_object_remove_toggle_ref ()

+
void                g_object_remove_toggle_ref          (GObject *object,
+                                                         GToggleNotify notify,
+                                                         gpointer data);
+

+Removes a reference added with g_object_add_toggle_ref(). The +reference count of the object is decreased by one.

+
++ + + + + + + + + + + + + + +

object :

a GObject +

notify :

a function to call when this reference is the + last reference to the object, or is no longer + the last reference. +

data :

data to pass to notify +
+

Since 2.8

+
+
+
+

g_object_connect ()

+
gpointer            g_object_connect                    (gpointer object,
+                                                         const gchar *signal_spec,
+                                                         ...);
+

+A convenience function to connect multiple signals at once. +

+

+The signal specs expected by this function have the form +"modifier::signal_name", where modifier can be one of the following: +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

signal

+equivalent to g_signal_connect_data (..., NULL, 0) +

object_signal, object-signal

+equivalent to g_signal_connect_object (..., 0) +

swapped_signal, swapped-signal

+equivalent to g_signal_connect_data (..., NULL, G_CONNECT_SWAPPED) +

swapped_object_signal, swapped-object-signal

+equivalent to g_signal_connect_object (..., G_CONNECT_SWAPPED) +

signal_after, signal-after

+equivalent to g_signal_connect_data (..., NULL, G_CONNECT_AFTER) +

object_signal_after, object-signal-after

+equivalent to g_signal_connect_object (..., G_CONNECT_AFTER) +

swapped_signal_after, swapped-signal-after

+equivalent to g_signal_connect_data (..., NULL, G_CONNECT_SWAPPED | G_CONNECT_AFTER) +

swapped_object_signal_after, swapped-object-signal-after

+equivalent to g_signal_connect_object (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER) +

+

+

+

+

+
+  menu->toplevel = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
+						   "type", GTK_WINDOW_POPUP,
+						   "child", menu,
+						   NULL),
+				     "signal::event", gtk_menu_window_event, menu,
+				     "signal::size_request", gtk_menu_window_size_request, menu,
+				     "signal::destroy", gtk_widget_destroyed, &menu->toplevel,
+				     NULL);
+
+
++ + + + + + + + + + + + + + + + + + +

object :

a GObject +

signal_spec :

the spec for the first signal +

... :

GCallback for the first signal, followed by data for the + first signal, followed optionally by more signal + spec/callback/data triples, followed by NULL +

Returns :

object +
+
+
+
+

g_object_disconnect ()

+
void                g_object_disconnect                 (gpointer object,
+                                                         const gchar *signal_spec,
+                                                         ...);
+

+A convenience function to disconnect multiple signals at once. +

+

+The signal specs expected by this function have the form +"any_signal", which means to disconnect any signal with matching +callback and data, or "any_signal::signal_name", which only +disconnects the signal named "signal_name".

+
++ + + + + + + + + + + + + + +

object :

a GObject +

signal_spec :

the spec for the first signal +

... :

GCallback for the first signal, followed by data for the first signal, + followed optionally by more signal spec/callback/data triples, + followed by NULL +
+
+
+
+

g_object_set ()

+
void                g_object_set                        (gpointer object,
+                                                         const gchar *first_property_name,
+                                                         ...);
+

+Sets properties on an object.

+
++ + + + + + + + + + + + + + +

object :

a GObject +

first_property_name :

name of the first property to set +

... :

value for the first property, followed optionally by more + name/value pairs, followed by NULL +
+
+
+
+

g_object_get ()

+
void                g_object_get                        (gpointer object,
+                                                         const gchar *first_property_name,
+                                                         ...);
+

+Gets properties of an object. +

+

+In general, a copy is made of the property contents and the caller +is responsible for freeing the memory in the appropriate manner for +the type, for instance by calling g_free() or g_object_unref(). +

+

+

+
+

Example 2. Using g_object_get()

+
+An example of using g_object_get() to get the contents +of three properties - one of type G_TYPE_INT, +one of type G_TYPE_STRING, and one of type G_TYPE_OBJECT: +
+ gint intval;
+ gchar *strval;
+ GObject *objval;
+
+ g_object_get (my_object,
+               "int-property", &intval,
+               "str-property", &strval,
+               "obj-property", &objval,
+               NULL);
+
+ // Do something with intval, strval, objval
+
+ g_free (strval);
+ g_object_unref (objval);
+
+
+
+


+
++ + + + + + + + + + + + + + +

object :

a GObject +

first_property_name :

name of the first property to get +

... :

return location for the first property, followed optionally by more + name/return location pairs, followed by NULL +
+
+
+
+

g_object_notify ()

+
void                g_object_notify                     (GObject *object,
+                                                         const gchar *property_name);
+

+Emits a "notify" signal for the property property_name on object.

+
++ + + + + + + + + + +

object :

a GObject +

property_name :

the name of a property installed on the class of object. +
+
+
+
+

g_object_freeze_notify ()

+
void                g_object_freeze_notify              (GObject *object);
+

+Increases the freeze count on object. If the freeze count is +non-zero, the emission of "notify" signals on object is +stopped. The signals are queued until the freeze count is decreased +to zero. +

+

+This is necessary for accessors that modify multiple properties to prevent +premature notification while the object is still being modified.

+
++ + + + +

object :

a GObject +
+
+
+
+

g_object_thaw_notify ()

+
void                g_object_thaw_notify                (GObject *object);
+

+Reverts the effect of a previous call to +g_object_freeze_notify(). The freeze count is decreased on object +and when it reaches zero, all queued "notify" signals are emitted. +

+

+It is an error to call this function when the freeze count is zero.

+
++ + + + +

object :

a GObject +
+
+
+
+

g_object_get_data ()

+
gpointer            g_object_get_data                   (GObject *object,
+                                                         const gchar *key);
+

+Gets a named field from the objects table of associations (see g_object_set_data()).

+
++ + + + + + + + + + + + + + +

object :

GObject containing the associations +

key :

name of the key for that association +

Returns :

the data if found, or NULL if no such data exists. +
+
+
+
+

g_object_set_data ()

+
void                g_object_set_data                   (GObject *object,
+                                                         const gchar *key,
+                                                         gpointer data);
+

+Each object carries around a table of associations from +strings to pointers. This function lets you set an association. +

+

+If the object already had an association with that name, +the old association will be destroyed.

+
++ + + + + + + + + + + + + + +

object :

GObject containing the associations. +

key :

name of the key +

data :

data to associate with that key +
+
+
+
+

g_object_set_data_full ()

+
void                g_object_set_data_full              (GObject *object,
+                                                         const gchar *key,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy);
+

+Like g_object_set_data() except it adds notification +for when the association is destroyed, either by setting it +to a different value or when the object is destroyed. +

+

+Note that the destroy callback is not called if data is NULL.

+
++ + + + + + + + + + + + + + + + + + +

object :

GObject containing the associations +

key :

name of the key +

data :

data to associate with that key +

destroy :

function to call when the association is destroyed +
+
+
+
+

g_object_steal_data ()

+
gpointer            g_object_steal_data                 (GObject *object,
+                                                         const gchar *key);
+

+Remove a specified datum from the object's data associations, +without invoking the association's destroy handler.

+
++ + + + + + + + + + + + + + +

object :

GObject containing the associations +

key :

name of the key +

Returns :

the data if found, or NULL if no such data exists. +
+
+
+
+

g_object_get_qdata ()

+
gpointer            g_object_get_qdata                  (GObject *object,
+                                                         GQuark quark);
+

+This function gets back user data pointers stored via +g_object_set_qdata().

+
++ + + + + + + + + + + + + + +

object :

The GObject to get a stored user data pointer from +

quark :

A GQuark, naming the user data pointer +

Returns :

The user data pointer set, or NULL +
+
+
+
+

g_object_set_qdata ()

+
void                g_object_set_qdata                  (GObject *object,
+                                                         GQuark quark,
+                                                         gpointer data);
+

+This sets an opaque, named pointer on an object. +The name is specified through a GQuark (retrived e.g. via +g_quark_from_static_string()), and the pointer +can be gotten back from the object with g_object_get_qdata() +until the object is finalized. +Setting a previously set user data pointer, overrides (frees) +the old pointer set, using NULL as pointer essentially +removes the data stored.

+
++ + + + + + + + + + + + + + +

object :

The GObject to set store a user data pointer +

quark :

A GQuark, naming the user data pointer +

data :

An opaque user data pointer +
+
+
+
+

g_object_set_qdata_full ()

+
void                g_object_set_qdata_full             (GObject *object,
+                                                         GQuark quark,
+                                                         gpointer data,
+                                                         GDestroyNotify destroy);
+

+This function works like g_object_set_qdata(), but in addition, +a void (*destroy) (gpointer) function may be specified which is +called with data as argument when the object is finalized, or +the data is being overwritten by a call to g_object_set_qdata() +with the same quark.

+
++ + + + + + + + + + + + + + + + + + +

object :

The GObject to set store a user data pointer +

quark :

A GQuark, naming the user data pointer +

data :

An opaque user data pointer +

destroy :

Function to invoke with data as argument, when data + needs to be freed +
+
+
+
+

g_object_steal_qdata ()

+
gpointer            g_object_steal_qdata                (GObject *object,
+                                                         GQuark quark);
+

+This function gets back user data pointers stored via +g_object_set_qdata() and removes the data from object +without invoking its destroy() function (if any was +set). +Usually, calling this function is only required to update +user data pointers with a destroy notifier, for example: +

+
+void
+object_add_to_user_list (GObject     *object,
+                         const gchar *new_string)
+{
+  // the quark, naming the object data
+  GQuark quark_string_list = g_quark_from_static_string ("my-string-list");
+  // retrive the old string list
+  GList *list = g_object_steal_qdata (object, quark_string_list);
+
+  // prepend new string
+  list = g_list_prepend (list, g_strdup (new_string));
+  // this changed 'list', so we need to set it again
+  g_object_set_qdata_full (object, quark_string_list, list, free_string_list);
+}
+static void
+free_string_list (gpointer data)
+{
+  GList *node, *list = data;
+
+  for (node = list; node; node = node->next)
+    g_free (node->data);
+  g_list_free (list);
+}
+
+

+Using g_object_get_qdata() in the above example, instead of +g_object_steal_qdata() would have left the destroy function set, +and thus the partial string list would have been freed upon +g_object_set_qdata_full().

+
++ + + + + + + + + + + + + + +

object :

The GObject to get a stored user data pointer from +

quark :

A GQuark, naming the user data pointer +

Returns :

The user data pointer set, or NULL +
+
+
+
+

g_object_set_property ()

+
void                g_object_set_property               (GObject *object,
+                                                         const gchar *property_name,
+                                                         const GValue *value);
+

+Sets a property on an object.

+
++ + + + + + + + + + + + + + +

object :

a GObject +

property_name :

the name of the property to set +

value :

the value +
+
+
+
+

g_object_get_property ()

+
void                g_object_get_property               (GObject *object,
+                                                         const gchar *property_name,
+                                                         GValue *value);
+

+Gets a property of an object. +

+

+In general, a copy is made of the property contents and the caller is +responsible for freeing the memory by calling g_value_unset(). +

+

+Note that g_object_get_property() is really intended for language +bindings, g_object_get() is much more convenient for C programming.

+
++ + + + + + + + + + + + + + +

object :

a GObject +

property_name :

the name of the property to get +

value :

return location for the property value +
+
+
+
+

g_object_new_valist ()

+
GObject*            g_object_new_valist                 (GType object_type,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args);
+

+Creates a new instance of a GObject subtype and sets its properties. +

+

+Construction parameters (see G_PARAM_CONSTRUCT, G_PARAM_CONSTRUCT_ONLY) +which are not explicitly specified are set to their default values.

+
++ + + + + + + + + + + + + + + + + + +

object_type :

the type id of the GObject subtype to instantiate +

first_property_name :

the name of the first property +

var_args :

the value of the first property, followed optionally by more + name/value pairs, followed by NULL +

Returns :

a new instance of object_type +
+
+
+
+

g_object_set_valist ()

+
void                g_object_set_valist                 (GObject *object,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args);
+

+Sets properties on an object.

+
++ + + + + + + + + + + + + + +

object :

a GObject +

first_property_name :

name of the first property to set +

var_args :

value for the first property, followed optionally by more + name/value pairs, followed by NULL +
+
+
+
+

g_object_get_valist ()

+
void                g_object_get_valist                 (GObject *object,
+                                                         const gchar *first_property_name,
+                                                         va_list var_args);
+

+Gets properties of an object. +

+

+In general, a copy is made of the property contents and the caller +is responsible for freeing the memory in the appropriate manner for +the type, for instance by calling g_free() or g_object_unref(). +

+

+See g_object_get().

+
++ + + + + + + + + + + + + + +

object :

a GObject +

first_property_name :

name of the first property to get +

var_args :

return location for the first property, followed optionally by more + name/return location pairs, followed by NULL +
+
+
+
+

g_object_watch_closure ()

+
void                g_object_watch_closure              (GObject *object,
+                                                         GClosure *closure);
+

+This function essentially limits the life time of the closure to +the life time of the object. That is, when the object is finalized, +the closure is invalidated by calling g_closure_invalidate() on +it, in order to prevent invocations of the closure with a finalized +(nonexisting) object. Also, g_object_ref() and g_object_unref() are +added as marshal guards to the closure, to ensure that an extra +reference count is held on object during invocation of the +closure. Usually, this function will be called on closures that +use this object as closure data.

+
++ + + + + + + + + + +

object :

GObject restricting lifetime of closure +

closure :

GClosure to watch +
+
+
+
+

g_object_run_dispose ()

+
void                g_object_run_dispose                (GObject *object);
+

+Releases all references to other objects. This can be used to break +reference cycles. +

+

+This functions should only be called from object system implementations.

+
++ + + + +

object :

a GObject +
+
+
+
+

G_OBJECT_WARN_INVALID_PROPERTY_ID()

+
#define             G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec)
+

+This macro should be used to emit a standard warning about unexpected +properties in set_property() and get_property() implementations.

+
++ + + + + + + + + + + + + + +

object :

the GObject on which set_property() or get_property() was called +

property_id :

the numeric id of the property +

pspec :

the GParamSpec of the property +
+
+
+
+

Signal Details

+
+

The "notify" signal

+
void                user_function                      (GObject    *gobject,
+                                                        GParamSpec *pspec,
+                                                        gpointer    user_data)      : Run First / No Recursion / Has Details / Action / No Hooks
+

+The notify signal is emitted on an object when one of its +properties has been changed. Note that getting this signal +doesn't guarantee that the value of the property has actually +changed, it may also be emitted when the setter for the property +is called to reinstate the previous value. +

+

+This signal is typically used to obtain change notification for a +single property, by specifying the property name as a detail in the +g_signal_connect() call, like this: +

+
+g_signal_connect (text_view->buffer, "notify::paste-target-list",
+                  G_CALLBACK (gtk_text_view_target_list_notify),
+                  text_view)
+
+

+It is important to note that you must use +canonical parameter names as +detail strings for the notify signal.

+
++ + + + + + + + + + + + + + +

gobject :

the object which received the signal. +

pspec :

the GParamSpec of the property which changed. +

user_data :

user data set when the signal handler was connected.
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Type-Information.html b/docs/reference/gobject/html/gobject-Type-Information.html new file mode 100644 index 0000000..77ad9e7 --- /dev/null +++ b/docs/reference/gobject/html/gobject-Type-Information.html @@ -0,0 +1,3802 @@ + + + + +Type Information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Type Information

+

Type Information — The GLib Runtime type identification and + management system

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+typedef             GType;
+#define             G_TYPE_FUNDAMENTAL                  (type)
+#define             G_TYPE_FUNDAMENTAL_MAX
+#define             G_TYPE_MAKE_FUNDAMENTAL             (x)
+#define             G_TYPE_IS_ABSTRACT                  (type)
+#define             G_TYPE_IS_DERIVED                   (type)
+#define             G_TYPE_IS_FUNDAMENTAL               (type)
+#define             G_TYPE_IS_VALUE_TYPE                (type)
+#define             G_TYPE_HAS_VALUE_TABLE              (type)
+#define             G_TYPE_IS_CLASSED                   (type)
+#define             G_TYPE_IS_INSTANTIATABLE            (type)
+#define             G_TYPE_IS_DERIVABLE                 (type)
+#define             G_TYPE_IS_DEEP_DERIVABLE            (type)
+#define             G_TYPE_IS_INTERFACE                 (type)
+                    GTypeInterface;
+                    GTypeInstance;
+                    GTypeClass;
+                    GTypeInfo;
+                    GTypeFundamentalInfo;
+                    GInterfaceInfo;
+                    GTypeValueTable;
+#define             G_TYPE_FROM_INSTANCE                (instance)
+#define             G_TYPE_FROM_CLASS                   (g_class)
+#define             G_TYPE_FROM_INTERFACE               (g_iface)
+#define             G_TYPE_INSTANCE_GET_CLASS           (instance, g_type, c_type)
+#define             G_TYPE_INSTANCE_GET_INTERFACE       (instance, g_type, c_type)
+#define             G_TYPE_INSTANCE_GET_PRIVATE         (instance, g_type, c_type)
+#define             G_TYPE_CHECK_INSTANCE               (instance)
+#define             G_TYPE_CHECK_INSTANCE_CAST          (instance, g_type, c_type)
+#define             G_TYPE_CHECK_INSTANCE_TYPE          (instance, g_type)
+#define             G_TYPE_CHECK_CLASS_CAST             (g_class, g_type, c_type)
+#define             G_TYPE_CHECK_CLASS_TYPE             (g_class, g_type)
+#define             G_TYPE_CHECK_VALUE                  (value)
+#define             G_TYPE_CHECK_VALUE_TYPE             (value, g_type)
+#define             G_TYPE_FLAG_RESERVED_ID_BIT
+void                g_type_init                         (void);
+enum                GTypeDebugFlags;
+void                g_type_init_with_debug_flags        (GTypeDebugFlags debug_flags);
+const gchar*        g_type_name                         (GType type);
+GQuark              g_type_qname                        (GType type);
+GType               g_type_from_name                    (const gchar *name);
+GType               g_type_parent                       (GType type);
+guint               g_type_depth                        (GType type);
+GType               g_type_next_base                    (GType leaf_type,
+                                                         GType root_type);
+gboolean            g_type_is_a                         (GType type,
+                                                         GType is_a_type);
+gpointer            g_type_class_ref                    (GType type);
+gpointer            g_type_class_peek                   (GType type);
+gpointer            g_type_class_peek_static            (GType type);
+void                g_type_class_unref                  (gpointer g_class);
+gpointer            g_type_class_peek_parent            (gpointer g_class);
+void                g_type_class_add_private            (gpointer g_class,
+                                                         gsize private_size);
+void                g_type_add_class_private            (GType class_type,
+                                                         gsize private_size);
+gpointer            g_type_interface_peek               (gpointer instance_class,
+                                                         GType iface_type);
+gpointer            g_type_interface_peek_parent        (gpointer g_iface);
+gpointer            g_type_default_interface_ref        (GType g_type);
+gpointer            g_type_default_interface_peek       (GType g_type);
+void                g_type_default_interface_unref      (gpointer g_iface);
+GType*              g_type_children                     (GType type,
+                                                         guint *n_children);
+GType*              g_type_interfaces                   (GType type,
+                                                         guint *n_interfaces);
+GType*              g_type_interface_prerequisites      (GType interface_type,
+                                                         guint *n_prerequisites);
+void                g_type_set_qdata                    (GType type,
+                                                         GQuark quark,
+                                                         gpointer data);
+gpointer            g_type_get_qdata                    (GType type,
+                                                         GQuark quark);
+void                g_type_query                        (GType type,
+                                                         GTypeQuery *query);
+                    GTypeQuery;
+void                (*GBaseInitFunc)                    (gpointer g_class);
+void                (*GBaseFinalizeFunc)                (gpointer g_class);
+void                (*GClassInitFunc)                   (gpointer g_class,
+                                                         gpointer class_data);
+void                (*GClassFinalizeFunc)               (gpointer g_class,
+                                                         gpointer class_data);
+void                (*GInstanceInitFunc)                (GTypeInstance *instance,
+                                                         gpointer g_class);
+void                (*GInterfaceInitFunc)               (gpointer g_iface,
+                                                         gpointer iface_data);
+void                (*GInterfaceFinalizeFunc)           (gpointer g_iface,
+                                                         gpointer iface_data);
+gboolean            (*GTypeClassCacheFunc)              (gpointer cache_data,
+                                                         GTypeClass *g_class);
+enum                GTypeFlags;
+enum                GTypeFundamentalFlags;
+GType               g_type_register_static              (GType parent_type,
+                                                         const gchar *type_name,
+                                                         const GTypeInfo *info,
+                                                         GTypeFlags flags);
+GType               g_type_register_static_simple       (GType parent_type,
+                                                         const gchar *type_name,
+                                                         guint class_size,
+                                                         GClassInitFunc class_init,
+                                                         guint instance_size,
+                                                         GInstanceInitFunc instance_init,
+                                                         GTypeFlags flags);
+GType               g_type_register_dynamic             (GType parent_type,
+                                                         const gchar *type_name,
+                                                         GTypePlugin *plugin,
+                                                         GTypeFlags flags);
+GType               g_type_register_fundamental         (GType type_id,
+                                                         const gchar *type_name,
+                                                         const GTypeInfo *info,
+                                                         const GTypeFundamentalInfo *finfo,
+                                                         GTypeFlags flags);
+void                g_type_add_interface_static         (GType instance_type,
+                                                         GType interface_type,
+                                                         const GInterfaceInfo *info);
+void                g_type_add_interface_dynamic        (GType instance_type,
+                                                         GType interface_type,
+                                                         GTypePlugin *plugin);
+void                g_type_interface_add_prerequisite   (GType interface_type,
+                                                         GType prerequisite_type);
+GTypePlugin*        g_type_get_plugin                   (GType type);
+GTypePlugin*        g_type_interface_get_plugin         (GType instance_type,
+                                                         GType interface_type);
+GType               g_type_fundamental_next             (void);
+GType               g_type_fundamental                  (GType type_id);
+GTypeInstance*      g_type_create_instance              (GType type);
+void                g_type_free_instance                (GTypeInstance *instance);
+void                g_type_add_class_cache_func         (gpointer cache_data,
+                                                         GTypeClassCacheFunc cache_func);
+void                g_type_remove_class_cache_func      (gpointer cache_data,
+                                                         GTypeClassCacheFunc cache_func);
+void                g_type_class_unref_uncached         (gpointer g_class);
+void                g_type_add_interface_check          (gpointer check_data,
+                                                         GTypeInterfaceCheckFunc check_func);
+void                g_type_remove_interface_check       (gpointer check_data,
+                                                         GTypeInterfaceCheckFunc check_func);
+void                (*GTypeInterfaceCheckFunc)          (gpointer check_data,
+                                                         gpointer g_iface);
+GTypeValueTable*    g_type_value_table_peek             (GType type);
+#define             G_DEFINE_TYPE                       (TN, t_n, T_P)
+#define             G_DEFINE_TYPE_WITH_CODE             (TN, t_n, T_P, _C_)
+#define             G_DEFINE_ABSTRACT_TYPE              (TN, t_n, T_P)
+#define             G_DEFINE_ABSTRACT_TYPE_WITH_CODE    (TN, t_n, T_P, _C_)
+#define             G_DEFINE_INTERFACE                  (TN, t_n, T_P)
+#define             G_DEFINE_INTERFACE_WITH_CODE        (TN, t_n, T_P, _C_)
+#define             G_IMPLEMENT_INTERFACE               (TYPE_IFACE, iface_init)
+#define             G_DEFINE_TYPE_EXTENDED              (TN, t_n, T_P, _f_, _C_)
+
+
+#define             G_TYPE_INVALID
+#define             G_TYPE_NONE
+#define             G_TYPE_INTERFACE
+#define             G_TYPE_CHAR
+#define             G_TYPE_UCHAR
+#define             G_TYPE_BOOLEAN
+#define             G_TYPE_INT
+#define             G_TYPE_UINT
+#define             G_TYPE_LONG
+#define             G_TYPE_ULONG
+#define             G_TYPE_INT64
+#define             G_TYPE_UINT64
+#define             G_TYPE_ENUM
+#define             G_TYPE_FLAGS
+#define             G_TYPE_FLOAT
+#define             G_TYPE_DOUBLE
+#define             G_TYPE_STRING
+#define             G_TYPE_POINTER
+#define             G_TYPE_BOXED
+#define             G_TYPE_PARAM
+#define             G_TYPE_OBJECT
+#define             G_TYPE_GTYPE
+
+#define             G_TYPE_RESERVED_GLIB_FIRST
+#define             G_TYPE_RESERVED_GLIB_LAST
+#define             G_TYPE_RESERVED_BSE_FIRST
+#define             G_TYPE_RESERVED_BSE_LAST
+#define             G_TYPE_RESERVED_USER_FIRST
+
+
+
+

Description

+

+The GType API is the foundation of the GObject system. It provides the +facilities for registering and managing all fundamental data types, +user-defined object and interface types. Before using any GType +or GObject functions, g_type_init() must be called to initialize the +type system. +

+

+For type creation and registration purposes, all types fall into one of +two categories: static or dynamic. Static types are never loaded or +unloaded at run-time as dynamic types may be. Static types are created +with g_type_register_static() that gets type specific information passed +in via a GTypeInfo structure. +Dynamic types are created with g_type_register_dynamic() which takes a +GTypePlugin structure instead. The remaining type information (the +GTypeInfo structure) is retrieved during runtime through GTypePlugin +and the g_type_plugin_*() API. +These registration functions are usually called only once from a +function whose only purpose is to return the type identifier for a +specific class. Once the type (or class or interface) is registered, +it may be instantiated, inherited, or implemented depending on exactly +what sort of type it is. +There is also a third registration function for registering fundamental +types called g_type_register_fundamental() which requires both a GTypeInfo +structure and a GTypeFundamentalInfo structure but it is seldom used +since most fundamental types are predefined rather than user-defined. +

+

+A final word about type names. +Such an identifier needs to be at least three characters long. There is no +upper length limit. The first character needs to be a letter (a-z or A-Z) +or an underscore '_'. Subsequent characters can be letters, numbers or +any of '-_+'.

+
+
+

Details

+
+

GType

+

+A numerical value which represents the unique identifier of a registered +type.

+
+
+
+

G_TYPE_FUNDAMENTAL()

+
#define G_TYPE_FUNDAMENTAL(type) (g_type_fundamental (type))
+
+

+The fundamental type which is the ancestor of type. +Fundamental types are types that serve as ultimate bases for the derived types, +thus they are the roots of distinct inheritance hierarchies.

+
++ + + + +

type :

A GType value. +
+
+
+
+

G_TYPE_FUNDAMENTAL_MAX

+
#define G_TYPE_FUNDAMENTAL_MAX		(255 << G_TYPE_FUNDAMENTAL_SHIFT)
+
+

+An integer constant that represents the number of identifiers reserved +for types that are assigned at compile-time.

+
+
+
+

G_TYPE_MAKE_FUNDAMENTAL()

+
#define G_TYPE_MAKE_FUNDAMENTAL(x) ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT))
+
+

+Get the type ID for the fundamental type number x. +Use g_type_fundamental_next() instead of this macro to create new fundamental +types.

+
++ + + + + + + + + + +

x :

the fundamental type number. +

Returns :

the GType +
+
+
+
+

G_TYPE_IS_ABSTRACT()

+
#define G_TYPE_IS_ABSTRACT(type)                (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
+
+

+Checks if type is an abstract type. An abstract type can not be +instantiated and is normally used as an abstract base class for +derived classes.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_DERIVED()

+
#define G_TYPE_IS_DERIVED(type)                 ((type) > G_TYPE_FUNDAMENTAL_MAX)
+
+

+Checks if type is derived (or in object-oriented terminology: +inherited) from another type (this holds true for all non-fundamental +types).

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_FUNDAMENTAL()

+
#define G_TYPE_IS_FUNDAMENTAL(type)             ((type) <= G_TYPE_FUNDAMENTAL_MAX)
+
+

+Checks if type is a fundamental type.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_VALUE_TYPE()

+
#define G_TYPE_IS_VALUE_TYPE(type)              (g_type_check_is_value_type (type))
+
+

+Checks if type is a value type and can be used with g_value_init().

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_HAS_VALUE_TABLE()

+
#define G_TYPE_HAS_VALUE_TABLE(type)            (g_type_value_table_peek (type) != NULL)
+
+

+Checks if type has a GTypeValueTable.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_CLASSED()

+
#define G_TYPE_IS_CLASSED(type)                 (g_type_test_flags ((type), G_TYPE_FLAG_CLASSED))
+
+

+Checks if type is a classed type.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_INSTANTIATABLE()

+
#define G_TYPE_IS_INSTANTIATABLE(type)          (g_type_test_flags ((type), G_TYPE_FLAG_INSTANTIATABLE))
+
+

+Checks if type can be instantiated. Instantiation is the +process of creating an instance (object) of this type.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_DERIVABLE()

+
#define G_TYPE_IS_DERIVABLE(type)               (g_type_test_flags ((type), G_TYPE_FLAG_DERIVABLE))
+
+

+Checks if type is a derivable type. A derivable type can +be used as the base class of a flat (single-level) class hierarchy.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_DEEP_DERIVABLE()

+
#define G_TYPE_IS_DEEP_DERIVABLE(type)          (g_type_test_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE))
+
+

+Checks if type is a deep derivable type. A deep derivable type +can be used as the base class of a deep (multi-level) class hierarchy.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_IS_INTERFACE()

+
#define G_TYPE_IS_INTERFACE(type)               (G_TYPE_FUNDAMENTAL (type) == G_TYPE_INTERFACE)
+
+

+Checks if type is an interface type. +An interface type provides a pure API, the implementation +of which is provided by another type (which is then said to conform +to the interface). GLib interfaces are somewhat analogous to Java +interfaces and C++ classes containing only pure virtual functions, +with the difference that GType interfaces are not derivable (but see +g_type_interface_add_prerequisite() for an alternative).

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

TRUE on success. +
+
+
+
+

GTypeInterface

+
typedef struct {
+} GTypeInterface;
+
+

+An opaque structure used as the base of all interface types.

+
+
+
+

GTypeInstance

+
typedef struct {
+} GTypeInstance;
+
+

+An opaque structure used as the base of all type instances.

+
+
+
+

GTypeClass

+
typedef struct {
+} GTypeClass;
+
+

+An opaque structure used as the base of all classes.

+
+
+
+

GTypeInfo

+
typedef struct {
+  /* interface types, classed types, instantiated types */
+  guint16                class_size;
+  
+  GBaseInitFunc          base_init;
+  GBaseFinalizeFunc      base_finalize;
+  
+  /* interface types, classed types, instantiated types */
+  GClassInitFunc         class_init;
+  GClassFinalizeFunc     class_finalize;
+  gconstpointer          class_data;
+  
+  /* instantiated types */
+  guint16                instance_size;
+  guint16                n_preallocs;
+  GInstanceInitFunc      instance_init;
+  
+  /* value handling */
+  const GTypeValueTable *value_table;
+} GTypeInfo;
+
+

+This structure is used to provide the type system with the information +required to initialize and destruct (finalize) a type's class and +its instances. +The initialized structure is passed to the g_type_register_static() function +(or is copied into the provided GTypeInfo structure in the +g_type_plugin_complete_type_info()). The type system will perform a deep +copy of this structure, so its memory does not need to be persistent +across invocation of g_type_register_static().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

guint16 class_size;

Size of the class structure (required for interface, classed and instantiatable types). +

GBaseInitFunc base_init;

Location of the base initialization function (optional). +

GBaseFinalizeFunc base_finalize;

Location of the base finalization function (optional). +

GClassInitFunc class_init;

Location of the class initialization function for + classed and instantiatable types. Location of the default vtable + inititalization function for interface types. (optional) This function + is used both to fill in virtual functions in the class or default vtable, + and to do type-specific setup such as registering signals and object + properties. +

GClassFinalizeFunc class_finalize;

Location of the class finalization function for + classed and instantiatable types. Location fo the default vtable + finalization function for interface types. (optional) +

gconstpointer class_data;

User-supplied data passed to the class init/finalize functions. +

guint16 instance_size;

Size of the instance (object) structure (required for instantiatable types only). +

guint16 n_preallocs;

Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the slice allocator now. +

GInstanceInitFunc instance_init;

Location of the instance initialization function (optional, for instantiatable types only). +

const GTypeValueTable *value_table;

A GTypeValueTable function table for generic handling of GValues of this type (usually only + useful for fundamental types). +
+
+
+
+

GTypeFundamentalInfo

+
typedef struct {
+  GTypeFundamentalFlags  type_flags;
+} GTypeFundamentalInfo;
+
+

+A structure that provides information to the type system which is +used specifically for managing fundamental types.

+
++ + + + +

GTypeFundamentalFlags type_flags;

GTypeFundamentalFlags describing the characteristics of the fundamental type +
+
+
+
+

GInterfaceInfo

+
typedef struct {
+  GInterfaceInitFunc     interface_init;
+  GInterfaceFinalizeFunc interface_finalize;
+  gpointer               interface_data;
+} GInterfaceInfo;
+
+

+A structure that provides information to the type system which is +used specifically for managing interface types.

+
++ + + + + + + + + + + + + + +

GInterfaceInitFunc interface_init;

location of the interface initialization function +

GInterfaceFinalizeFunc interface_finalize;

location of the interface finalization function +

gpointer interface_data;

user-supplied data passed to the interface init/finalize functions +
+
+
+
+

GTypeValueTable

+
typedef struct {
+  void     (*value_init)         (GValue       *value);
+  void     (*value_free)         (GValue       *value);
+  void     (*value_copy)         (const GValue *src_value,
+				  GValue       *dest_value);
+  /* varargs functionality (optional) */
+  gpointer (*value_peek_pointer) (const GValue *value);
+  gchar	    *collect_format;
+  gchar*   (*collect_value)      (GValue       *value,
+				  guint         n_collect_values,
+				  GTypeCValue  *collect_values,
+				  guint		collect_flags);
+  gchar	    *lcopy_format;
+  gchar*   (*lcopy_value)        (const GValue *value,
+				  guint         n_collect_values,
+				  GTypeCValue  *collect_values,
+				  guint		collect_flags);
+} GTypeValueTable;
+
+

+The GTypeValueTable provides the functions required by the GValue implementation, +to serve as a container for values of a type.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

value_init ()

Default initialize values contents by poking values + directly into the value->data array. The data array of + the GValue passed into this function was zero-filled + with memset(), so no care has to + be taken to free any + old contents. E.g. for the implementation of a string + value that may never be NULL, the implementation might + look like: +
+ value->data[0].v_pointer = g_strdup ("");
+ 
+

value_free ()

Free any old contents that might be left in the + data array of the passed in value. No resources may + remain allocated through the GValue contents after + this function returns. E.g. for our above string type: +
+ // only free strings without a specific flag for static storage
+ if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+   g_free (value->data[0].v_pointer);
+ 
+

value_copy ()

dest_value is a GValue with zero-filled data section + and src_value is a properly setup GValue of same or + derived type. + The purpose of this function is to copy the contents of + src_value into dest_value in a way, that even after + src_value has been freed, the contents of dest_value + remain valid. String type example: +
+ dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
+ 
+

value_peek_pointer ()

If the value contents fit into a pointer, such as objects + or strings, return this pointer, so the caller can peek at + the current contents. To extend on our above string example: +
+ return value->data[0].v_pointer;
+ 
+

gchar *collect_format;

A string format describing how to collect the contents of + this value bit-by-bit. Each character in the format represents + an argument to be collected, and the characters themselves indicate + the type of the argument. Currently supported arguments are: +
++ + + + + + + + + + + + + + + + + + +

+ 'i' - Integers. passed as collect_values[].v_int. +

+ 'l' - Longs. passed as collect_values[].v_long. +

+ 'd' - Doubles. passed as collect_values[].v_double. +

+ 'p' - Pointers. passed as collect_values[].v_pointer. +

+ It should be noted that for variable argument list construction, + ANSI C promotes every type smaller than an integer to an int, and + floats to doubles. So for collection of short int or char, 'i' + needs to be used, and for collection of floats 'd'. +

collect_value ()

The collect_value() function is responsible for converting the + values collected from a variable argument list into contents + suitable for storage in a GValue. This function should setup + value similar to value_init(); e.g. for a string value that + does not allow NULL pointers, it needs to either spew an error, + or do an implicit conversion by storing an empty string. + The value passed in to this function has a zero-filled data + array, so just like for value_init() it is guaranteed to not + contain any old contents that might need freeing. + n_collect_values is exactly the string length of collect_format, + and collect_values is an array of unions GTypeCValue with + length n_collect_values, containing the collected values + according to collect_format. + collect_flags is an argument provided as a hint by the caller. + It may contain the flag G_VALUE_NOCOPY_CONTENTS indicating, + that the collected value contents may be considered "static" + for the duration of the value lifetime. + Thus an extra copy of the contents stored in collect_values is + not required for assignment to value. + For our above string example, we continue with: +
+ if (!collect_values[0].v_pointer)
+   value->data[0].v_pointer = g_strdup ("");
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+ {
+   value->data[0].v_pointer = collect_values[0].v_pointer;
+   // keep a flag for the value_free() implementation to not free this string
+   value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+ }
+ else
+   value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
+ return NULL;
+ 
+ It should be noted, that it is generally a bad idea to follow the + G_VALUE_NOCOPY_CONTENTS hint for reference counted types. Due to + reentrancy requirements and reference count assertions performed + by the GSignal code, reference counts should always be incremented + for reference counted contents stored in the value->data array. + To deviate from our string example for a moment, and taking a look + at an exemplary implementation for collect_value() of GObject: +
+ if (collect_values[0].v_pointer)
+ {
+   GObject *object = G_OBJECT (collect_values[0].v_pointer);
+   // never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types
+   value->data[0].v_pointer = g_object_ref (object);
+   return NULL;
+ }
+ else
+   return g_strdup_printf ("Object passed as invalid NULL pointer");
+ }
+ 
+ The reference count for valid objects is always incremented, + regardless of collect_flags. For invalid objects, the example + returns a newly allocated string without altering value. + Upon success, collect_value() needs to return NULL. If, however, + an error condition occurred, collect_value() may spew an + error by returning a newly allocated non-NULL string, giving + a suitable description of the error condition. + The calling code makes no assumptions about the value + contents being valid upon error returns, value + is simply thrown away without further freeing. As such, it is + a good idea to not allocate GValue contents, prior to returning + an error, however, collect_values() is not obliged to return + a correctly setup value for error returns, simply because + any non-NULL return is considered a fatal condition so further + program behaviour is undefined. +

gchar *lcopy_format;

Format description of the arguments to collect for lcopy_value, + analogous to collect_format. Usually, lcopy_format string consists + only of 'p's to provide lcopy_value() with pointers to storage locations. +

lcopy_value ()

This function is responsible for storing the value contents into + arguments passed through a variable argument list which got + collected into collect_values according to lcopy_format. + n_collect_values equals the string length of lcopy_format, + and collect_flags may contain G_VALUE_NOCOPY_CONTENTS. + In contrast to collect_value(), lcopy_value() is obliged to + always properly support G_VALUE_NOCOPY_CONTENTS. + Similar to collect_value() the function may prematurely abort + by returning a newly allocated string describing an error condition. + To complete the string example: +
+ gchar **string_p = collect_values[0].v_pointer;
+ if (!string_p)
+   return g_strdup_printf ("string location passed as NULL");
+ if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+   *string_p = value->data[0].v_pointer;
+ else
+   *string_p = g_strdup (value->data[0].v_pointer);
+ 
+ And an illustrative version of lcopy_value() for + reference-counted types: +
+ GObject **object_p = collect_values[0].v_pointer;
+ if (!object_p)
+   return g_strdup_printf ("object location passed as NULL");
+ if (!value->data[0].v_pointer)
+   *object_p = NULL;
+ else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) // always honour
+   *object_p = value->data[0].v_pointer;
+ else
+   *object_p = g_object_ref (value->data[0].v_pointer);
+ return NULL;
+ 
+
+
+
+
+

G_TYPE_FROM_INSTANCE()

+
#define G_TYPE_FROM_INSTANCE(instance)                          (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
+
+

+Get the type identifier from a given instance structure. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + +

instance :

Location of a valid GTypeInstance structure. +

Returns :

the GType +
+
+
+
+

G_TYPE_FROM_CLASS()

+
#define G_TYPE_FROM_CLASS(g_class)                              (((GTypeClass*) (g_class))->g_type)
+
+

+Get the type identifier from a given class structure. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + +

g_class :

Location of a valid GTypeClass structure. +

Returns :

the GType +
+
+
+
+

G_TYPE_FROM_INTERFACE()

+
#define G_TYPE_FROM_INTERFACE(g_iface)                          (((GTypeInterface*) (g_iface))->g_type)
+
+

+Get the type identifier from a given interface structure. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + +

g_iface :

Location of a valid GTypeInterface structure. +

Returns :

the GType +
+
+
+
+

G_TYPE_INSTANCE_GET_CLASS()

+
#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type)     (_G_TYPE_IGC ((instance), (g_type), c_type))
+
+

+Get the class structure of a given instance, casted +to a specified ancestor type g_type of the instance. +

+

+Note that while calling a GInstanceInitFunc(), the class pointer gets +modified, so it might not always return the expected pointer. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + + + + + +

instance :

Location of the GTypeInstance structure. +

g_type :

The GType of the class to be returned. +

c_type :

The C type of the class structure. +

Returns :

a pointer to the class structure +
+
+
+
+

G_TYPE_INSTANCE_GET_INTERFACE()

+
#define G_TYPE_INSTANCE_GET_INTERFACE(instance, g_type, c_type) (_G_TYPE_IGI ((instance), (g_type), c_type))
+
+

+Get the interface structure for interface g_type of a given instance. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + + + + + +

instance :

Location of the GTypeInstance structure. +

g_type :

The GType of the interface to be returned. +

c_type :

The C type of the interface structure. +

Returns :

a pointer to the interface structure +
+
+
+
+

G_TYPE_INSTANCE_GET_PRIVATE()

+
#define G_TYPE_INSTANCE_GET_PRIVATE(instance, g_type, c_type)   ((c_type*) g_type_instance_get_private ((GTypeInstance*) (instance), (g_type)))
+
+

+Gets the private structure for a particular type. +The private structure must have been registered in the +class_init function with g_type_class_add_private(). +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + + + + + +

instance :

the instance of a type deriving from private_type. +

g_type :

the type identifying which private data to retrieve. +

c_type :

The C type for the private structure. +

Returns :

a pointer to the private data structure. +
+

Since 2.4

+
+
+
+

G_TYPE_CHECK_INSTANCE()

+
#define G_TYPE_CHECK_INSTANCE(instance)				(_G_TYPE_CHI ((GTypeInstance*) (instance)))
+
+

+Checks if instance is a valid GTypeInstance structure, +otherwise issues a warning and returns FALSE. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + +

instance :

Location of a GTypeInstance structure. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_CHECK_INSTANCE_CAST()

+
#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)    (_G_TYPE_CIC ((instance), (g_type), c_type))
+
+

+Checks that instance is an instance of the type identified by g_type +and issues a warning if this is not the case. Returns instance casted +to a pointer to c_type. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + +

instance :

Location of a GTypeInstance structure. +

g_type :

The type to be returned. +

c_type :

The corresponding C type of g_type. +
+
+
+
+

G_TYPE_CHECK_INSTANCE_TYPE()

+
#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)            (_G_TYPE_CIT ((instance), (g_type)))
+
+

+Checks if instance is an instance of the type identified by g_type. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + +

instance :

Location of a GTypeInstance structure. +

g_type :

The type to be checked +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_CHECK_CLASS_CAST()

+
#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type)        (_G_TYPE_CCC ((g_class), (g_type), c_type))
+
+

+Checks that g_class is a class structure of the type identified by g_type +and issues a warning if this is not the case. Returns g_class casted +to a pointer to c_type. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + +

g_class :

Location of a GTypeClass structure. +

g_type :

The type to be returned. +

c_type :

The corresponding C type of class structure of g_type. +
+
+
+
+

G_TYPE_CHECK_CLASS_TYPE()

+
#define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type)                (_G_TYPE_CCT ((g_class), (g_type)))
+
+

+Checks if g_class is a class structure of the type identified by +g_type. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + +

g_class :

Location of a GTypeClass structure. +

g_type :

The type to be checked. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_CHECK_VALUE()

+
#define G_TYPE_CHECK_VALUE(value)				(_G_TYPE_CHV ((value)))
+
+

+Checks if value has been initialized to hold values +of a value type. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + +

value :

a GValue +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_CHECK_VALUE_TYPE()

+
#define G_TYPE_CHECK_VALUE_TYPE(value, g_type)			(_G_TYPE_CVH ((value), (g_type)))
+
+

+Checks if value has been initialized to hold values +of type g_type. +

+

+This macro should only be used in type implementations.

+
++ + + + + + + + + + + + + + +

value :

a GValue +

g_type :

The type to be checked. +

Returns :

TRUE on success. +
+
+
+
+

G_TYPE_FLAG_RESERVED_ID_BIT

+
#define G_TYPE_FLAG_RESERVED_ID_BIT ((GType) (1 << 0))
+
+

+A bit in the type number that's supposed to be left untouched.

+
+
+
+

g_type_init ()

+
void                g_type_init                         (void);
+

+Prior to any use of the type system, g_type_init() has to be called +to initialize the type system and assorted other code portions +(such as the various fundamental type implementations or the signal +system). +

+

+Since version 2.24 this also initializes the thread system

+
+
+
+

enum GTypeDebugFlags

+
typedef enum /*< skip >*/
+{
+  G_TYPE_DEBUG_NONE = 0,
+  G_TYPE_DEBUG_OBJECTS = 1 << 0,
+  G_TYPE_DEBUG_SIGNALS = 1 << 1,
+  G_TYPE_DEBUG_MASK = 0x03
+} GTypeDebugFlags;
+
+

+The GTypeDebugFlags enumeration values can be passed to +g_type_init_with_debug_flags() to trigger debugging messages during runtime. +Note that the messages can also be triggered by setting the +GOBJECT_DEBUG environment variable to a ':'-separated list of +"objects" and "signals".

+
++ + + + + + + + + + + + + + + + + + +

G_TYPE_DEBUG_NONE

Print no messages. +

G_TYPE_DEBUG_OBJECTS

Print messages about object bookkeeping. +

G_TYPE_DEBUG_SIGNALS

Print messages about signal emissions. +

G_TYPE_DEBUG_MASK

Mask covering all debug flags. +
+
+
+
+

g_type_init_with_debug_flags ()

+
void                g_type_init_with_debug_flags        (GTypeDebugFlags debug_flags);
+

+Similar to g_type_init(), but additionally sets debug flags.

+
++ + + + +

debug_flags :

Bitwise combination of GTypeDebugFlags values for + debugging purposes. +
+
+
+
+

g_type_name ()

+
const gchar*        g_type_name                         (GType type);
+

+Get the unique name that is assigned to a type ID. Note that this +function (like all other GType API) cannot cope with invalid type +IDs. G_TYPE_INVALID may be passed to this function, as may be any +other validly registered type ID, but randomized type IDs should +not be passed in and will most likely lead to a crash.

+
++ + + + + + + + + + +

type :

Type to return name for. +

Returns :

Static type name or NULL. +
+
+
+
+

g_type_qname ()

+
GQuark              g_type_qname                        (GType type);
+

+Get the corresponding quark of the type IDs name.

+
++ + + + + + + + + + +

type :

Type to return quark of type name for. +

Returns :

The type names quark or 0. +
+
+
+
+

g_type_from_name ()

+
GType               g_type_from_name                    (const gchar *name);
+

+Lookup the type ID from a given type name, returning 0 if no type +has been registered under this name (this is the preferred method +to find out by name whether a specific type has been registered +yet).

+
++ + + + + + + + + + +

name :

Type name to lookup. +

Returns :

Corresponding type ID or 0. +
+
+
+
+

g_type_parent ()

+
GType               g_type_parent                       (GType type);
+

+Return the direct parent type of the passed in type. If the passed +in type has no parent, i.e. is a fundamental type, 0 is returned.

+
++ + + + + + + + + + +

type :

The derived type. +

Returns :

The parent type. +
+
+
+
+

g_type_depth ()

+
guint               g_type_depth                        (GType type);
+

+Returns the length of the ancestry of the passed in type. This +includes the type itself, so that e.g. a fundamental type has depth 1.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

The depth of type. +
+
+
+
+

g_type_next_base ()

+
GType               g_type_next_base                    (GType leaf_type,
+                                                         GType root_type);
+

+Given a leaf_type and a root_type which is contained in its +anchestry, return the type that root_type is the immediate parent +of. In other words, this function determines the type that is +derived directly from root_type which is also a base class of +leaf_type. Given a root type and a leaf type, this function can +be used to determine the types and order in which the leaf type is +descended from the root type.

+
++ + + + + + + + + + + + + + +

leaf_type :

Descendant of root_type and the type to be returned. +

root_type :

Immediate parent of the returned type. +

Returns :

Immediate child of root_type and anchestor of leaf_type. +
+
+
+
+

g_type_is_a ()

+
gboolean            g_type_is_a                         (GType type,
+                                                         GType is_a_type);
+

+If is_a_type is a derivable type, check whether type is a +descendant of is_a_type. If is_a_type is an interface, check +whether type conforms to it.

+
++ + + + + + + + + + + + + + +

type :

Type to check anchestry for. +

is_a_type :

Possible anchestor of type or interface type could conform to. +

Returns :

TRUE if type is_a is_a_type holds true. +
+
+
+
+

g_type_class_ref ()

+
gpointer            g_type_class_ref                    (GType type);
+

+Increments the reference count of the class structure belonging to +type. This function will demand-create the class if it doesn't +exist already.

+
++ + + + + + + + + + +

type :

Type ID of a classed type. +

Returns :

The GTypeClass structure for the given type ID. +
+
+
+
+

g_type_class_peek ()

+
gpointer            g_type_class_peek                   (GType type);
+

+This function is essentially the same as g_type_class_ref(), except that +the classes reference count isn't incremented. As a consequence, this function +may return NULL if the class of the type passed in does not currently +exist (hasn't been referenced before).

+
++ + + + + + + + + + +

type :

Type ID of a classed type. +

Returns :

The GTypeClass structure for the given type ID or NULL + if the class does not currently exist. +
+
+
+
+

g_type_class_peek_static ()

+
gpointer            g_type_class_peek_static            (GType type);
+

+A more efficient version of g_type_class_peek() which works only for +static types.

+
++ + + + + + + + + + +

type :

Type ID of a classed type. +

Returns :

The GTypeClass structure for the given type ID or NULL + if the class does not currently exist or is dynamically loaded. +
+

Since 2.4

+
+
+
+

g_type_class_unref ()

+
void                g_type_class_unref                  (gpointer g_class);
+

+Decrements the reference count of the class structure being passed in. +Once the last reference count of a class has been released, classes +may be finalized by the type system, so further dereferencing of a +class pointer after g_type_class_unref() are invalid.

+
++ + + + +

g_class :

The GTypeClass structure to unreference. +
+
+
+
+

g_type_class_peek_parent ()

+
gpointer            g_type_class_peek_parent            (gpointer g_class);
+

+This is a convenience function often needed in class initializers. +It returns the class structure of the immediate parent type of the +class passed in. Since derived classes hold a reference count on +their parent classes as long as they are instantiated, the returned +class will always exist. This function is essentially equivalent +to: +

+

+

+
+g_type_class_peek (g_type_parent (G_TYPE_FROM_CLASS (g_class)));
+
+
++ + + + + + + + + + +

g_class :

The GTypeClass structure to retrieve the parent class for. +

Returns :

The parent class of g_class. +
+
+
+
+

g_type_class_add_private ()

+
void                g_type_class_add_private            (gpointer g_class,
+                                                         gsize private_size);
+

+Registers a private structure for an instantiatable type; +when an object is allocated, the private structures for +the type and all of its parent types are allocated +sequentially in the same memory block as the public +structures. This function should be called in the +type's class_init() function. +

+

+The private structure can be retrieved using the +G_TYPE_CLASS_GET_PRIVATE() macro.

+
++ + + + + + + + + + +

g_class :

class structure for an instantiatable type +

private_size :

size of private structure. +
+

Since 2.24

+
+
+
+

g_type_add_class_private ()

+
void                g_type_add_class_private            (GType class_type,
+                                                         gsize private_size);
+

+Registers a private class structure for a classed type; +when the class is allocated, the private structures for +the class and all of its parent types are allocated +sequentially in the same memory block as the public +structures. This function should be called in the +type's get_type() function after the type is registered. +The private structure can be retrieved using the +G_TYPE_CLASS_GET_PRIVATE() macro.

+
++ + + + + + + + + + +

class_type :

GType of an classed type. +

private_size :

size of private structure. +
+

Since 2.24

+
+
+
+

g_type_interface_peek ()

+
gpointer            g_type_interface_peek               (gpointer instance_class,
+                                                         GType iface_type);
+

+Returns the GTypeInterface structure of an interface to which the +passed in class conforms.

+
++ + + + + + + + + + + + + + +

instance_class :

A GTypeClass structure. +

iface_type :

An interface ID which this class conforms to. +

Returns :

The GTypeInterface structure of iface_type if implemented + by instance_class, NULL otherwise +
+
+
+
+

g_type_interface_peek_parent ()

+
gpointer            g_type_interface_peek_parent        (gpointer g_iface);
+

+Returns the corresponding GTypeInterface structure of the parent type +of the instance type to which g_iface belongs. This is useful when +deriving the implementation of an interface from the parent type and +then possibly overriding some methods.

+
++ + + + + + + + + + +

g_iface :

A GTypeInterface structure. +

Returns :

The corresponding GTypeInterface structure of the parent + type of the instance type to which g_iface belongs, or + NULL if the parent type doesn't conform to the interface. +
+
+
+
+

g_type_default_interface_ref ()

+
gpointer            g_type_default_interface_ref        (GType g_type);
+

+Increments the reference count for the interface type g_type, +and returns the default interface vtable for the type. +

+

+If the type is not currently in use, then the default vtable +for the type will be created and initalized by calling +the base interface init and default vtable init functions for +the type (the @base_init +and class_init members of GTypeInfo). +Calling g_type_default_interface_ref() is useful when you +want to make sure that signals and properties for an interface +have been installed.

+
++ + + + + + + + + + +

g_type :

an interface type +

Returns :

the default vtable for the interface; call + g_type_default_interface_unref() when you are done using + the interface. +
+

Since 2.4

+
+
+
+

g_type_default_interface_peek ()

+
gpointer            g_type_default_interface_peek       (GType g_type);
+

+If the interface type g_type is currently in use, returns its +default interface vtable.

+
++ + + + + + + + + + +

g_type :

an interface type +

Returns :

the default vtable for the interface, or NULL + if the type is not currently in use. +
+

Since 2.4

+
+
+
+

g_type_default_interface_unref ()

+
void                g_type_default_interface_unref      (gpointer g_iface);
+

+Decrements the reference count for the type corresponding to the +interface default vtable g_iface. If the type is dynamic, then +when no one is using the interface and all references have +been released, the finalize function for the interface's default +vtable (the class_finalize member of +GTypeInfo) will be called.

+
++ + + + +

g_iface :

the default vtable structure for a interface, as + returned by g_type_default_interface_ref() +
+

Since 2.4

+
+
+
+

g_type_children ()

+
GType*              g_type_children                     (GType type,
+                                                         guint *n_children);
+

+Return a newly allocated and 0-terminated array of type IDs, listing the +child types of type. The return value has to be g_free()ed after use.

+
++ + + + + + + + + + + + + + +

type :

The parent type. +

n_children :

Optional guint pointer to contain the number of child types. +

Returns :

Newly allocated and 0-terminated array of child types. +
+
+
+
+

g_type_interfaces ()

+
GType*              g_type_interfaces                   (GType type,
+                                                         guint *n_interfaces);
+

+Return a newly allocated and 0-terminated array of type IDs, listing the +interface types that type conforms to. The return value has to be +g_free()ed after use.

+
++ + + + + + + + + + + + + + +

type :

The type to list interface types for. +

n_interfaces :

Optional guint pointer to contain the number of + interface types. +

Returns :

Newly allocated and 0-terminated array of interface types. +
+
+
+
+

g_type_interface_prerequisites ()

+
GType*              g_type_interface_prerequisites      (GType interface_type,
+                                                         guint *n_prerequisites);
+

+Returns the prerequisites of an interfaces type.

+
++ + + + + + + + + + + + + + +

interface_type :

an interface type +

n_prerequisites :

location to return the number of prerequisites, or NULL +

Returns :

a newly-allocated zero-terminated array of GType containing + the prerequisites of interface_type +
+

Since 2.2

+
+
+
+

g_type_set_qdata ()

+
void                g_type_set_qdata                    (GType type,
+                                                         GQuark quark,
+                                                         gpointer data);
+

+Attaches arbitrary data to a type.

+
++ + + + + + + + + + + + + + +

type :

a GType +

quark :

a GQuark id to identify the data +

data :

the data +
+
+
+
+

g_type_get_qdata ()

+
gpointer            g_type_get_qdata                    (GType type,
+                                                         GQuark quark);
+

+Obtains data which has previously been attached to type +with g_type_set_qdata().

+
++ + + + + + + + + + + + + + +

type :

a GType +

quark :

a GQuark id to identify the data +

Returns :

the data, or NULL if no data was found +
+
+
+
+

g_type_query ()

+
void                g_type_query                        (GType type,
+                                                         GTypeQuery *query);
+

+Queries the type system for information about a specific type. +This function will fill in a user-provided structure to hold +type-specific information. If an invalid GType is passed in, the +type member of the GTypeQuery is 0. All members filled into the +GTypeQuery structure should be considered constant and have to be +left untouched.

+
++ + + + + + + + + + +

type :

the GType value of a static, classed type. +

query :

A user provided structure that is filled in with constant values + upon success. +
+
+
+
+

GTypeQuery

+
typedef struct {
+  GType		type;
+  const gchar  *type_name;
+  guint		class_size;
+  guint		instance_size;
+} GTypeQuery;
+
+

+A structure holding information for a specific type. It is +filled in by the g_type_query() function.

+
++ + + + + + + + + + + + + + + + + + +

GType type;

the GType value of the type. +

const gchar *type_name;

the name of the type. +

guint class_size;

the size of the class structure. +

guint instance_size;

the size of the instance structure. +
+
+
+
+

GBaseInitFunc ()

+
void                (*GBaseInitFunc)                    (gpointer g_class);
+

+A callback function used by the type system to do base initialization +of the class structures of derived types. It is called as part of the +initialization process of all derived classes and should reallocate +or reset all dynamic class members copied over from the parent class. +For example, class members (such as strings) that are not sufficiently +handled by a plain memory copy of the parent class into the derived class +have to be altered. See GClassInitFunc() for a discussion of the class +intialization process.

+
++ + + + +

g_class :

The GTypeClass structure to initialize. +
+
+
+
+

GBaseFinalizeFunc ()

+
void                (*GBaseFinalizeFunc)                (gpointer g_class);
+

+A callback function used by the type system to finalize those portions +of a derived types class structure that were setup from the corresponding +GBaseInitFunc() function. Class finalization basically works the inverse +way in which class intialization is performed. +See GClassInitFunc() for a discussion of the class intialization process.

+
++ + + + +

g_class :

The GTypeClass structure to finalize. +
+
+
+
+

GClassInitFunc ()

+
void                (*GClassInitFunc)                   (gpointer g_class,
+                                                         gpointer class_data);
+

+A callback function used by the type system to initialize the class +of a specific type. This function should initialize all static class +members. +The initialization process of a class involves: +

+
    +
  • + 1 - Copying common members from the parent class over to the + derived class structure. +

  • +
  • + 2 - Zero initialization of the remaining members not copied + over from the parent class. +

  • +
  • + 3 - Invocation of the GBaseInitFunc() initializers of all parent + types and the class' type. +

  • +
  • + 4 - Invocation of the class' GClassInitFunc() initializer. +

  • +
+

+Since derived classes are partially initialized through a memory copy +of the parent class, the general rule is that GBaseInitFunc() and +GBaseFinalizeFunc() should take care of necessary reinitialization +and release of those class members that were introduced by the type +that specified these GBaseInitFunc()/GBaseFinalizeFunc(). +GClassInitFunc() should only care about initializing static +class members, while dynamic class members (such as allocated strings +or reference counted resources) are better handled by a GBaseInitFunc() +for this type, so proper initialization of the dynamic class members +is performed for class initialization of derived types as well. +An example may help to correspond the intend of the different class +initializers: +

+

+

+
+typedef struct {
+  GObjectClass parent_class;
+  gint         static_integer;
+  gchar       *dynamic_string;
+} TypeAClass;
+static void
+type_a_base_class_init (TypeAClass *class)
+{
+  class->dynamic_string = g_strdup ("some string");
+}
+static void
+type_a_base_class_finalize (TypeAClass *class)
+{
+  g_free (class->dynamic_string);
+}
+static void
+type_a_class_init (TypeAClass *class)
+{
+  class->static_integer = 42;
+}
+
+typedef struct {
+  TypeAClass   parent_class;
+  gfloat       static_float;
+  GString     *dynamic_gstring;
+} TypeBClass;
+static void
+type_b_base_class_init (TypeBClass *class)
+{
+  class->dynamic_gstring = g_string_new ("some other string");
+}
+static void
+type_b_base_class_finalize (TypeBClass *class)
+{
+  g_string_free (class->dynamic_gstring);
+}
+static void
+type_b_class_init (TypeBClass *class)
+{
+  class->static_float = 3.14159265358979323846;
+}
+
+

+Initialization of TypeBClass will first cause initialization of +TypeAClass (derived classes reference their parent classes, see +g_type_class_ref() on this). +Initialization of TypeAClass roughly involves zero-initializing its fields, +then calling its GBaseInitFunc() type_a_base_class_init() to allocate +its dynamic members (dynamic_string), and finally calling its GClassInitFunc() +type_a_class_init() to initialize its static members (static_integer). +The first step in the initialization process of TypeBClass is then +a plain memory copy of the contents of TypeAClass into TypeBClass and +zero-initialization of the remaining fields in TypeBClass. +The dynamic members of TypeAClass within TypeBClass now need +reinitialization which is performed by calling type_a_base_class_init() +with an argument of TypeBClass. +After that, the GBaseInitFunc() of TypeBClass, type_b_base_class_init() +is called to allocate the dynamic members of TypeBClass (dynamic_gstring), +and finally the GClassInitFunc() of TypeBClass, type_b_class_init(), +is called to complete the initialization process with the static members +(static_float). +Corresponding finalization counter parts to the GBaseInitFunc() functions +have to be provided to release allocated resources at class finalization +time.

+
++ + + + + + + + + + +

g_class :

The GTypeClass structure to initialize. +

class_data :

The class_data member supplied via the GTypeInfo structure. +
+
+
+
+

GClassFinalizeFunc ()

+
void                (*GClassFinalizeFunc)               (gpointer g_class,
+                                                         gpointer class_data);
+

+A callback function used by the type system to finalize a class. +This function is rarely needed, as dynamically allocated class resources +should be handled by GBaseInitFunc() and GBaseFinalizeFunc(). +Also, specification of a GClassFinalizeFunc() in the GTypeInfo +structure of a static type is invalid, because classes of static types +will never be finalized (they are artificially kept alive when their +reference count drops to zero).

+
++ + + + + + + + + + +

g_class :

The GTypeClass structure to finalize. +

class_data :

The class_data member supplied via the GTypeInfo structure. +
+
+
+
+

GInstanceInitFunc ()

+
void                (*GInstanceInitFunc)                (GTypeInstance *instance,
+                                                         gpointer g_class);
+

+A callback function used by the type system to initialize a new +instance of a type. This function initializes all instance members and +allocates any resources required by it. +Initialization of a derived instance involves calling all its parent +types instance initializers, so the class member of the instance +is altered during its initialization to always point to the class that +belongs to the type the current initializer was introduced for.

+
++ + + + + + + + + + +

instance :

The instance to initialize. +

g_class :

The class of the type the instance is created for. +
+
+
+
+

GInterfaceInitFunc ()

+
void                (*GInterfaceInitFunc)               (gpointer g_iface,
+                                                         gpointer iface_data);
+

+A callback function used by the type system to initialize a new +interface. This function should initialize all internal data and +allocate any resources required by the interface.

+
++ + + + + + + + + + +

g_iface :

The interface structure to initialize. +

iface_data :

The interface_data supplied via the GInterfaceInfo structure. +
+
+
+
+

GInterfaceFinalizeFunc ()

+
void                (*GInterfaceFinalizeFunc)           (gpointer g_iface,
+                                                         gpointer iface_data);
+

+A callback function used by the type system to finalize an interface. +This function should destroy any internal data and release any resources +allocated by the corresponding GInterfaceInitFunc() function.

+
++ + + + + + + + + + +

g_iface :

The interface structure to finalize. +

iface_data :

The interface_data supplied via the GInterfaceInfo structure. +
+
+
+
+

GTypeClassCacheFunc ()

+
gboolean            (*GTypeClassCacheFunc)              (gpointer cache_data,
+                                                         GTypeClass *g_class);
+

+A callback function which is called when the reference count of a class +drops to zero. It may use g_type_class_ref() to prevent the class from +being freed. You should not call g_type_class_unref() from a +GTypeClassCacheFunc function to prevent infinite recursion, use +g_type_class_unref_uncached() instead. +

+

+The functions have to check the class id passed in to figure +whether they actually want to cache the class of this type, since all +classes are routed through the same GTypeClassCacheFunc chain.

+
++ + + + + + + + + + + + + + +

cache_data :

data that was given to the g_type_add_class_cache_func() call +

g_class :

The GTypeClass structure which is unreferenced +

Returns :

TRUE to stop further GTypeClassCacheFuncs from being + called, FALSE to continue. +
+
+
+
+

enum GTypeFlags

+
typedef enum    /*< skip >*/
+{
+  G_TYPE_FLAG_ABSTRACT		= (1 << 4),
+  G_TYPE_FLAG_VALUE_ABSTRACT = (1 << 5)
+} GTypeFlags;
+
+

+Bit masks used to check or determine characteristics of a type.

+
++ + + + + + + + + + +

G_TYPE_FLAG_ABSTRACT

Indicates an abstract type. No instances can be + created for an abstract type. +

G_TYPE_FLAG_VALUE_ABSTRACT

Indicates an abstract value type, i.e. a type + that introduces a value table, but can't be used for + g_value_init(). +
+
+
+
+

enum GTypeFundamentalFlags

+
typedef enum    /*< skip >*/
+{
+  G_TYPE_FLAG_CLASSED           = (1 << 0),
+  G_TYPE_FLAG_INSTANTIATABLE    = (1 << 1),
+  G_TYPE_FLAG_DERIVABLE         = (1 << 2),
+  G_TYPE_FLAG_DEEP_DERIVABLE    = (1 << 3)
+} GTypeFundamentalFlags;
+
+

+Bit masks used to check or determine specific characteristics of a +fundamental type.

+
++ + + + + + + + + + + + + + + + + + +

G_TYPE_FLAG_CLASSED

Indicates a classed type. +

G_TYPE_FLAG_INSTANTIATABLE

Indicates an instantiable type (implies classed). +

G_TYPE_FLAG_DERIVABLE

Indicates a flat derivable type. +

G_TYPE_FLAG_DEEP_DERIVABLE

Indicates a deep derivable type (implies derivable). +
+
+
+
+

g_type_register_static ()

+
GType               g_type_register_static              (GType parent_type,
+                                                         const gchar *type_name,
+                                                         const GTypeInfo *info,
+                                                         GTypeFlags flags);
+

+Registers type_name as the name of a new static type derived from +parent_type. The type system uses the information contained in the +GTypeInfo structure pointed to by info to manage the type and its +instances (if not abstract). The value of flags determines the nature +(e.g. abstract or not) of the type.

+
++ + + + + + + + + + + + + + + + + + + + + + +

parent_type :

Type from which this type will be derived. +

type_name :

0-terminated string used as the name of the new type. +

info :

The GTypeInfo structure for this type. +

flags :

Bitwise combination of GTypeFlags values. +

Returns :

The new type identifier. +
+
+
+
+

g_type_register_static_simple ()

+
GType               g_type_register_static_simple       (GType parent_type,
+                                                         const gchar *type_name,
+                                                         guint class_size,
+                                                         GClassInitFunc class_init,
+                                                         guint instance_size,
+                                                         GInstanceInitFunc instance_init,
+                                                         GTypeFlags flags);
+

+Registers type_name as the name of a new static type derived from +parent_type. The value of flags determines the nature (e.g. +abstract or not) of the type. It works by filling a GTypeInfo +struct and calling g_type_register_static().

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

parent_type :

Type from which this type will be derived. +

type_name :

0-terminated string used as the name of the new type. +

class_size :

Size of the class structure (see GTypeInfo) +

class_init :

Location of the class initialization function (see GTypeInfo) +

instance_size :

Size of the instance structure (see GTypeInfo) +

instance_init :

Location of the instance initialization function (see GTypeInfo) +

flags :

Bitwise combination of GTypeFlags values. +

Returns :

The new type identifier. +
+

Since 2.12

+
+
+
+

g_type_register_dynamic ()

+
GType               g_type_register_dynamic             (GType parent_type,
+                                                         const gchar *type_name,
+                                                         GTypePlugin *plugin,
+                                                         GTypeFlags flags);
+

+Registers type_name as the name of a new dynamic type derived from +parent_type. The type system uses the information contained in the +GTypePlugin structure pointed to by plugin to manage the type and its +instances (if not abstract). The value of flags determines the nature +(e.g. abstract or not) of the type.

+
++ + + + + + + + + + + + + + + + + + + + + + +

parent_type :

Type from which this type will be derived. +

type_name :

0-terminated string used as the name of the new type. +

plugin :

The GTypePlugin structure to retrieve the GTypeInfo from. +

flags :

Bitwise combination of GTypeFlags values. +

Returns :

The new type identifier or G_TYPE_INVALID if registration failed. +
+
+
+
+

g_type_register_fundamental ()

+
GType               g_type_register_fundamental         (GType type_id,
+                                                         const gchar *type_name,
+                                                         const GTypeInfo *info,
+                                                         const GTypeFundamentalInfo *finfo,
+                                                         GTypeFlags flags);
+

+Registers type_id as the predefined identifier and type_name as the +name of a fundamental type. The type system uses the information +contained in the GTypeInfo structure pointed to by info and the +GTypeFundamentalInfo structure pointed to by finfo to manage the +type and its instances. The value of flags determines additional +characteristics of the fundamental type.

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

type_id :

A predefined type identifier. +

type_name :

0-terminated string used as the name of the new type. +

info :

The GTypeInfo structure for this type. +

finfo :

The GTypeFundamentalInfo structure for this type. +

flags :

Bitwise combination of GTypeFlags values. +

Returns :

The predefined type identifier. +
+
+
+
+

g_type_add_interface_static ()

+
void                g_type_add_interface_static         (GType instance_type,
+                                                         GType interface_type,
+                                                         const GInterfaceInfo *info);
+

+Adds the static interface_type to instantiable_type. The information +contained in the GTypeInterfaceInfo structure pointed to by info +is used to manage the relationship.

+
++ + + + + + + + + + + + + + +

instance_type :

GType value of an instantiable type. +

interface_type :

GType value of an interface type. +

info :

The GInterfaceInfo structure for this + (instance_type, interface_type) combination. +
+
+
+
+

g_type_add_interface_dynamic ()

+
void                g_type_add_interface_dynamic        (GType instance_type,
+                                                         GType interface_type,
+                                                         GTypePlugin *plugin);
+

+Adds the dynamic interface_type to instantiable_type. The information +contained in the GTypePlugin structure pointed to by plugin +is used to manage the relationship.

+
++ + + + + + + + + + + + + + +

instance_type :

the GType value of an instantiable type. +

interface_type :

the GType value of an interface type. +

plugin :

the GTypePlugin structure to retrieve the GInterfaceInfo from. +
+
+
+
+

g_type_interface_add_prerequisite ()

+
void                g_type_interface_add_prerequisite   (GType interface_type,
+                                                         GType prerequisite_type);
+

+Adds prerequisite_type to the list of prerequisites of interface_type. +This means that any type implementing interface_type must also implement +prerequisite_type. Prerequisites can be thought of as an alternative to +interface derivation (which GType doesn't support). An interface can have +at most one instantiatable prerequisite type.

+
++ + + + + + + + + + +

interface_type :

GType value of an interface type. +

prerequisite_type :

GType value of an interface or instantiatable type. +
+
+
+
+

g_type_get_plugin ()

+
GTypePlugin*        g_type_get_plugin                   (GType type);
+

+Returns the GTypePlugin structure for type or +NULL if type does not have a GTypePlugin structure.

+
++ + + + + + + + + + +

type :

The GType to retrieve the plugin for. +

Returns :

The corresponding plugin if type is a dynamic type, + NULL otherwise. +
+
+
+
+

g_type_interface_get_plugin ()

+
GTypePlugin*        g_type_interface_get_plugin         (GType instance_type,
+                                                         GType interface_type);
+

+Returns the GTypePlugin structure for the dynamic interface +interface_type which has been added to instance_type, or NULL if +interface_type has not been added to instance_type or does not +have a GTypePlugin structure. See g_type_add_interface_dynamic().

+
++ + + + + + + + + + + + + + +

instance_type :

the GType value of an instantiatable type. +

interface_type :

the GType value of an interface type. +

Returns :

the GTypePlugin for the dynamic interface interface_type + of instance_type. +
+
+
+
+

g_type_fundamental_next ()

+
GType               g_type_fundamental_next             (void);
+

+Returns the next free fundamental type id which can be used to +register a new fundamental type with g_type_register_fundamental(). +The returned type ID represents the highest currently registered +fundamental type identifier.

+
++ + + + +

Returns :

The nextmost fundamental type ID to be registered, + or 0 if the type system ran out of fundamental type IDs. +
+
+
+
+

g_type_fundamental ()

+
GType               g_type_fundamental                  (GType type_id);
+

+Internal function, used to extract the fundamental type ID portion. +use G_TYPE_FUNDAMENTAL() instead.

+
++ + + + + + + + + + +

type_id :

valid type ID +

Returns :

fundamental type ID +
+
+
+
+

g_type_create_instance ()

+
GTypeInstance*      g_type_create_instance              (GType type);
+

+Creates and initializes an instance of type if type is valid and +can be instantiated. The type system only performs basic allocation +and structure setups for instances: actual instance creation should +happen through functions supplied by the type's fundamental type +implementation. So use of g_type_create_instance() is reserved for +implementators of fundamental types only. E.g. instances of the +GObject hierarchy should be created via g_object_new() and +never directly through +g_type_create_instance() which doesn't handle things like singleton +objects or object construction. Note: Do not +use this function, unless you're implementing a fundamental +type. Also language bindings should not use +this function but g_object_new() instead.

+
++ + + + + + + + + + +

type :

An instantiatable type to create an instance for. +

Returns :

An allocated and initialized instance, subject to further + treatment by the fundamental type implementation. +
+
+
+
+

g_type_free_instance ()

+
void                g_type_free_instance                (GTypeInstance *instance);
+

+Frees an instance of a type, returning it to the instance pool for +the type, if there is one. +

+

+Like g_type_create_instance(), this function is reserved for +implementors of fundamental types.

+
++ + + + +

instance :

an instance of a type. +
+
+
+
+

g_type_add_class_cache_func ()

+
void                g_type_add_class_cache_func         (gpointer cache_data,
+                                                         GTypeClassCacheFunc cache_func);
+

+Adds a GTypeClassCacheFunc to be called before the reference count of a +class goes from one to zero. This can be used to prevent premature class +destruction. All installed GTypeClassCacheFunc functions will be chained +until one of them returns TRUE. The functions have to check the class id +passed in to figure whether they actually want to cache the class of this +type, since all classes are routed through the same GTypeClassCacheFunc +chain.

+
++ + + + + + + + + + +

cache_data :

data to be passed to cache_func +

cache_func :

a GTypeClassCacheFunc +
+
+
+
+

g_type_remove_class_cache_func ()

+
void                g_type_remove_class_cache_func      (gpointer cache_data,
+                                                         GTypeClassCacheFunc cache_func);
+

+Removes a previously installed GTypeClassCacheFunc. The cache +maintained by cache_func has to be empty when calling +g_type_remove_class_cache_func() to avoid leaks.

+
++ + + + + + + + + + +

cache_data :

data that was given when adding cache_func +

cache_func :

a GTypeClassCacheFunc +
+
+
+
+

g_type_class_unref_uncached ()

+
void                g_type_class_unref_uncached         (gpointer g_class);
+

+A variant of g_type_class_unref() for use in GTypeClassCacheFunc +implementations. It unreferences a class without consulting the chain +of GTypeClassCacheFuncs, avoiding the recursion which would occur +otherwise.

+
++ + + + +

g_class :

The GTypeClass structure to unreference. +
+
+
+
+

g_type_add_interface_check ()

+
void                g_type_add_interface_check          (gpointer check_data,
+                                                         GTypeInterfaceCheckFunc check_func);
+

+Adds a function to be called after an interface vtable is +initialized for any class (i.e. after the interface_init member of +GInterfaceInfo has been called). +

+

+This function is useful when you want to check an invariant that +depends on the interfaces of a class. For instance, the +implementation of GObject uses this facility to check that an +object implements all of the properties that are defined on its +interfaces.

+
++ + + + + + + + + + +

check_data :

data to pass to check_func +

check_func :

function to be called after each interface + is initialized. +
+

Since 2.4

+
+
+
+

g_type_remove_interface_check ()

+
void                g_type_remove_interface_check       (gpointer check_data,
+                                                         GTypeInterfaceCheckFunc check_func);
+

+Removes an interface check function added with +g_type_add_interface_check().

+
++ + + + + + + + + + +

check_data :

callback data passed to g_type_add_interface_check() +

check_func :

callback function passed to g_type_add_interface_check() +
+

Since 2.4

+
+
+
+

GTypeInterfaceCheckFunc ()

+
void                (*GTypeInterfaceCheckFunc)          (gpointer check_data,
+                                                         gpointer g_iface);
+

+A callback called after an interface vtable is initialized. +See g_type_add_interface_check().

+
++ + + + + + + + + + +

check_data :

data passed to g_type_add_interface_check(). +

g_iface :

the interface that has been initialized +
+

Since 2.4

+
+
+
+

g_type_value_table_peek ()

+
GTypeValueTable*    g_type_value_table_peek             (GType type);
+

+Returns the location of the GTypeValueTable associated with type. +Note that this function should only be used from source code +that implements or has internal knowledge of the implementation of +type.

+
++ + + + + + + + + + +

type :

A GType value. +

Returns :

Location of the GTypeValueTable associated with type or + NULL if there is no GTypeValueTable associated with type. +
+
+
+
+

G_DEFINE_TYPE()

+
#define G_DEFINE_TYPE(TN, t_n, T_P)			    G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
+
+

+A convenience macro for type implementations, which declares a +class initialization function, an instance initialization function (see GTypeInfo for information about +these) and a static variable named t_n_parent_class pointing to the parent class. Furthermore, it defines +a *_get_type() function. See G_DEFINE_TYPE_EXTENDED() for an example.

+
++ + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words + separated by '_'. +

T_P :

The GType of the parent type. +
+

Since 2.4

+
+
+
+

G_DEFINE_TYPE_WITH_CODE()

+
#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_)	    _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
+
+

+A convenience macro for type implementations. +Similar to G_DEFINE_TYPE(), but allows you to insert custom code into the +*_get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE(). +See G_DEFINE_TYPE_EXTENDED() for an example.

+
++ + + + + + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type in lowercase, with words separated by '_'. +

T_P :

The GType of the parent type. +

_C_ :

Custom code that gets inserted in the *_get_type() function. +
+

Since 2.4

+
+
+
+

G_DEFINE_ABSTRACT_TYPE()

+
#define G_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P)		    G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {})
+
+

+A convenience macro for type implementations. +Similar to G_DEFINE_TYPE(), but defines an abstract type. +See G_DEFINE_TYPE_EXTENDED() for an example.

+
++ + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words + separated by '_'. +

T_P :

The GType of the parent type. +
+

Since 2.4

+
+
+
+

G_DEFINE_ABSTRACT_TYPE_WITH_CODE()

+
#define G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
+
+

+A convenience macro for type implementations. +Similar to G_DEFINE_TYPE_WITH_CODE(), but defines an abstract type and allows you to +insert custom code into the *_get_type() function, e.g. interface implementations +via G_IMPLEMENT_INTERFACE(). See G_DEFINE_TYPE_EXTENDED() for an example.

+
++ + + + + + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words + separated by '_'. +

T_P :

The GType of the parent type. +

_C_ :

Custom code that gets inserted in the @type_name_get_type() function. +
+

Since 2.4

+
+
+
+

G_DEFINE_INTERFACE()

+
#define G_DEFINE_INTERFACE(TN, t_n, T_P)		    G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, ;)
+
+

+A convenience macro for GTypeInterface definitions, which declares +a default vtable initialization function and defines a *_get_type() +function. +

+

+The macro expects the interface initialization function to have the +name t_n ## _default_init, and the interface +structure to have the name TN ## Interface.

+
++ + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words separated by '_'. +

T_P :

The GType of the prerequisite type for the interface, or 0 +(G_TYPE_INVALID) for no prerequisite type. +
+

Since 2.24

+
+
+
+

G_DEFINE_INTERFACE_WITH_CODE()

+
#define G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, _C_)     _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TN, t_n, T_P) {_C_;} _G_DEFINE_INTERFACE_EXTENDED_END()
+
+

+A convenience macro for GTypeInterface definitions. Similar to +G_DEFINE_INTERFACE(), but allows you to insert custom code into the +*_get_type() function, e.g. additional interface implementations +via G_IMPLEMENT_INTERFACE(), or additional prerequisite types. See +G_DEFINE_TYPE_EXTENDED() for a similar example using +G_DEFINE_TYPE_WITH_CODE().

+
++ + + + + + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words separated by '_'. +

T_P :

The GType of the prerequisite type for the interface, or 0 +(G_TYPE_INVALID) for no prerequisite type. +

_C_ :

Custom code that gets inserted in the *_get_type() function. +
+

Since 2.24

+
+
+
+

G_IMPLEMENT_INTERFACE()

+
#define             G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init)
+

+A convenience macro to ease interface addition in the _C_ section +of G_DEFINE_TYPE_WITH_CODE() or G_DEFINE_ABSTRACT_TYPE_WITH_CODE(). +See G_DEFINE_TYPE_EXTENDED() for an example. +

+

+Note that this macro can only be used together with the G_DEFINE_TYPE_* +macros, since it depends on variable names from those macros.

+
++ + + + + + + + + + +

TYPE_IFACE :

The GType of the interface to add +

iface_init :

The interface init function +
+

Since 2.4

+
+
+
+

G_DEFINE_TYPE_EXTENDED()

+
#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_)	    _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
+
+

+The most general convenience macro for type implementations, on which +G_DEFINE_TYPE(), etc are based. +

+

+

+
+G_DEFINE_TYPE_EXTENDED (GtkGadget,
+                        gtk_gadget,
+                        GTK_TYPE_WIDGET,
+                        0,
+                        G_IMPLEMENT_INTERFACE (TYPE_GIZMO,
+                                               gtk_gadget_gizmo_init));
+
+

+expands to +

+
+static void     gtk_gadget_init       (GtkGadget      *self);
+static void     gtk_gadget_class_init (GtkGadgetClass *klass);
+static gpointer gtk_gadget_parent_class = NULL;
+static void     gtk_gadget_class_intern_init (gpointer klass)
+{
+  gtk_gadget_parent_class = g_type_class_peek_parent (klass);
+  gtk_gadget_class_init ((GtkGadgetClass*) klass);
+}
+
+GType
+gtk_gadget_get_type (void)
+{
+  static volatile gsize g_define_type_id__volatile = 0;
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      GType g_define_type_id =
+        g_type_register_static_simple (GTK_TYPE_WIDGET,
+                                       g_intern_static_string ("GtkGadget"),
+                                       sizeof (GtkGadgetClass),
+                                       (GClassInitFunc) gtk_gadget_class_intern_init,
+                                       sizeof (GtkGadget),
+                                       (GInstanceInitFunc) gtk_gadget_init,
+                                       (GTypeFlags) flags);
+      {
+        static const GInterfaceInfo g_implement_interface_info = {
+          (GInterfaceInitFunc) gtk_gadget_gizmo_init
+        };
+        g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
+      }
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+    }
+  return g_define_type_id__volatile;
+}
+
+

+The only pieces which have to be manually provided are the definitions of +the instance and class structure and the definitions of the instance and +class init functions.

+
++ + + + + + + + + + + + + + + + + + + + + + +

TN :

The name of the new type, in Camel case. +

t_n :

The name of the new type, in lowercase, with words + separated by '_'. +

T_P :

The GType of the parent type. +

_f_ :

GTypeFlags to pass to g_type_register_static() +

_C_ :

Custom code that gets inserted in the *_get_type() function. +
+

Since 2.4

+
+
+
+

G_TYPE_INVALID

+
#define G_TYPE_INVALID			G_TYPE_MAKE_FUNDAMENTAL (0)
+
+

+An invalid GType used as error return value in some functions which return +a GType.

+
+
+
+

G_TYPE_NONE

+
#define G_TYPE_NONE			G_TYPE_MAKE_FUNDAMENTAL (1)
+
+

+A fundamental type which is used as a replacement for the C +void return type.

+
+
+
+

G_TYPE_INTERFACE

+
#define G_TYPE_INTERFACE		G_TYPE_MAKE_FUNDAMENTAL (2)
+
+

+The fundamental type from which all interfaces are derived.

+
+
+
+

G_TYPE_CHAR

+
#define G_TYPE_CHAR			G_TYPE_MAKE_FUNDAMENTAL (3)
+
+

+The fundamental type corresponding to gchar. +The type designated by G_TYPE_CHAR is unconditionally an 8-bit signed integer. +This may or may not be the same type a the C type "gchar".

+
+
+
+

G_TYPE_UCHAR

+
#define G_TYPE_UCHAR			G_TYPE_MAKE_FUNDAMENTAL (4)
+
+

+The fundamental type corresponding to guchar.

+
+
+
+

G_TYPE_BOOLEAN

+
#define G_TYPE_BOOLEAN			G_TYPE_MAKE_FUNDAMENTAL (5)
+
+

+The fundamental type corresponding to gboolean.

+
+
+
+

G_TYPE_INT

+
#define G_TYPE_INT			G_TYPE_MAKE_FUNDAMENTAL (6)
+
+

+The fundamental type corresponding to gint.

+
+
+
+

G_TYPE_UINT

+
#define G_TYPE_UINT			G_TYPE_MAKE_FUNDAMENTAL (7)
+
+

+The fundamental type corresponding to guint.

+
+
+
+

G_TYPE_LONG

+
#define G_TYPE_LONG			G_TYPE_MAKE_FUNDAMENTAL (8)
+
+

+The fundamental type corresponding to glong.

+
+
+
+

G_TYPE_ULONG

+
#define G_TYPE_ULONG			G_TYPE_MAKE_FUNDAMENTAL (9)
+
+

+The fundamental type corresponding to gulong.

+
+
+
+

G_TYPE_INT64

+
#define G_TYPE_INT64			G_TYPE_MAKE_FUNDAMENTAL (10)
+
+

+The fundamental type corresponding to gint64.

+
+
+
+

G_TYPE_UINT64

+
#define G_TYPE_UINT64			G_TYPE_MAKE_FUNDAMENTAL (11)
+
+

+The fundamental type corresponding to guint64.

+
+
+
+

G_TYPE_ENUM

+
#define G_TYPE_ENUM			G_TYPE_MAKE_FUNDAMENTAL (12)
+
+

+The fundamental type from which all enumeration types are derived.

+
+
+
+

G_TYPE_FLAGS

+
#define G_TYPE_FLAGS			G_TYPE_MAKE_FUNDAMENTAL (13)
+
+

+The fundamental type from which all flags types are derived.

+
+
+
+

G_TYPE_FLOAT

+
#define G_TYPE_FLOAT			G_TYPE_MAKE_FUNDAMENTAL (14)
+
+

+The fundamental type corresponding to gfloat.

+
+
+
+

G_TYPE_DOUBLE

+
#define G_TYPE_DOUBLE			G_TYPE_MAKE_FUNDAMENTAL (15)
+
+

+The fundamental type corresponding to gdouble.

+
+
+
+

G_TYPE_STRING

+
#define G_TYPE_STRING			G_TYPE_MAKE_FUNDAMENTAL (16)
+
+

+The fundamental type corresponding to nul-terminated C strings.

+
+
+
+

G_TYPE_POINTER

+
#define G_TYPE_POINTER			G_TYPE_MAKE_FUNDAMENTAL (17)
+
+

+The fundamental type corresponding to gpointer.

+
+
+
+

G_TYPE_BOXED

+
#define G_TYPE_BOXED			G_TYPE_MAKE_FUNDAMENTAL (18)
+
+

+The fundamental type from which all boxed types are derived.

+
+
+
+

G_TYPE_PARAM

+
#define G_TYPE_PARAM			G_TYPE_MAKE_FUNDAMENTAL (19)
+
+

+The fundamental type from which all GParamSpec types are derived.

+
+
+
+

G_TYPE_OBJECT

+
#define G_TYPE_OBJECT			G_TYPE_MAKE_FUNDAMENTAL (20)
+
+

+The fundamental type for GObject.

+
+
+
+

G_TYPE_GTYPE

+
#define G_TYPE_GTYPE			 (g_gtype_get_type())
+
+

+The type for GType.

+
+
+
+

G_TYPE_RESERVED_GLIB_FIRST

+
#define G_TYPE_RESERVED_GLIB_FIRST (21)
+
+

+First fundamental type number to create a new fundamental type id with +G_TYPE_MAKE_FUNDAMENTAL() reserved for GLib.

+
+
+
+

G_TYPE_RESERVED_GLIB_LAST

+
#define G_TYPE_RESERVED_GLIB_LAST (31)
+
+

+Last fundamental type number reserved for GLib.

+
+
+
+

G_TYPE_RESERVED_BSE_FIRST

+
#define G_TYPE_RESERVED_BSE_FIRST (32)
+
+

+First fundamental type number to create a new fundamental type id with +G_TYPE_MAKE_FUNDAMENTAL() reserved for BSE.

+
+
+
+

G_TYPE_RESERVED_BSE_LAST

+
#define G_TYPE_RESERVED_BSE_LAST (48)
+
+

+Last fundamental type number reserved for BSE.

+
+
+
+

G_TYPE_RESERVED_USER_FIRST

+
#define G_TYPE_RESERVED_USER_FIRST (49)
+
+

+First available fundamental type number to create new fundamental +type id with G_TYPE_MAKE_FUNDAMENTAL().

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Value-arrays.html b/docs/reference/gobject/html/gobject-Value-arrays.html new file mode 100644 index 0000000..54396ee --- /dev/null +++ b/docs/reference/gobject/html/gobject-Value-arrays.html @@ -0,0 +1,419 @@ + + + + +Value arrays + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Value arrays

+

Value arrays — A container structure to maintain an array of + generic values

+
+
+

Synopsis

+
+#include <glib-object.h>
+
+                    GValueArray;
+GValue*             g_value_array_get_nth               (GValueArray *value_array,
+                                                         guint index_);
+GValueArray*        g_value_array_new                   (guint n_prealloced);
+GValueArray*        g_value_array_copy                  (const GValueArray *value_array);
+void                g_value_array_free                  (GValueArray *value_array);
+GValueArray*        g_value_array_append                (GValueArray *value_array,
+                                                         const GValue *value);
+GValueArray*        g_value_array_prepend               (GValueArray *value_array,
+                                                         const GValue *value);
+GValueArray*        g_value_array_insert                (GValueArray *value_array,
+                                                         guint index_,
+                                                         const GValue *value);
+GValueArray*        g_value_array_remove                (GValueArray *value_array,
+                                                         guint index_);
+GValueArray*        g_value_array_sort                  (GValueArray *value_array,
+                                                         GCompareFunc compare_func);
+GValueArray*        g_value_array_sort_with_data        (GValueArray *value_array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+
+
+
+

Description

+

+The prime purpose of a GValueArray is for it to be used as an +object property that holds an array of values. A GValueArray wraps +an array of GValue elements in order for it to be used as a boxed +type through G_TYPE_VALUE_ARRAY.

+
+
+

Details

+
+

GValueArray

+
typedef struct {
+  guint   n_values;
+  GValue *values;
+} GValueArray;
+
+

+A GValueArray contains an array of GValue elements.

+
++ + + + + + + + + + +

guint n_values;

number of values contained in the array +

GValue *values;

array of values +
+
+
+
+

g_value_array_get_nth ()

+
GValue*             g_value_array_get_nth               (GValueArray *value_array,
+                                                         guint index_);
+

+Return a pointer to the value at index_ containd in value_array.

+
++ + + + + + + + + + + + + + +

value_array :

GValueArray to get a value from +

index_ :

index of the value of interest +

Returns :

pointer to a value at index_ in value_array +
+
+
+
+

g_value_array_new ()

+
GValueArray*        g_value_array_new                   (guint n_prealloced);
+

+Allocate and initialize a new GValueArray, optionally preserve space +for n_prealloced elements. New arrays always contain 0 elements, +regardless of the value of n_prealloced.

+
++ + + + + + + + + + +

n_prealloced :

number of values to preallocate space for +

Returns :

a newly allocated GValueArray with 0 values +
+
+
+
+

g_value_array_copy ()

+
GValueArray*        g_value_array_copy                  (const GValueArray *value_array);
+

+Construct an exact copy of a GValueArray by duplicating all its +contents.

+
++ + + + + + + + + + +

value_array :

GValueArray to copy +

Returns :

Newly allocated copy of GValueArray +
+
+
+
+

g_value_array_free ()

+
void                g_value_array_free                  (GValueArray *value_array);
+

+Free a GValueArray including its contents.

+
++ + + + +

value_array :

GValueArray to free +
+
+
+
+

g_value_array_append ()

+
GValueArray*        g_value_array_append                (GValueArray *value_array,
+                                                         const GValue *value);
+

+Insert a copy of value as last element of value_array.

+
++ + + + + + + + + + + + + + +

value_array :

GValueArray to add an element to +

value :

GValue to copy into GValueArray +

Returns :

the GValueArray passed in as value_array +
+
+
+
+

g_value_array_prepend ()

+
GValueArray*        g_value_array_prepend               (GValueArray *value_array,
+                                                         const GValue *value);
+

+Insert a copy of value as first element of value_array.

+
++ + + + + + + + + + + + + + +

value_array :

GValueArray to add an element to +

value :

GValue to copy into GValueArray +

Returns :

the GValueArray passed in as value_array +
+
+
+
+

g_value_array_insert ()

+
GValueArray*        g_value_array_insert                (GValueArray *value_array,
+                                                         guint index_,
+                                                         const GValue *value);
+

+Insert a copy of value at specified position into value_array.

+
++ + + + + + + + + + + + + + + + + + +

value_array :

GValueArray to add an element to +

index_ :

insertion position, must be <= value_array->n_values +

value :

GValue to copy into GValueArray +

Returns :

the GValueArray passed in as value_array +
+
+
+
+

g_value_array_remove ()

+
GValueArray*        g_value_array_remove                (GValueArray *value_array,
+                                                         guint index_);
+

+Remove the value at position index_ from value_array.

+
++ + + + + + + + + + + + + + +

value_array :

GValueArray to remove an element from +

index_ :

position of value to remove, must be < value_array->n_values +

Returns :

the GValueArray passed in as value_array +
+
+
+
+

g_value_array_sort ()

+
GValueArray*        g_value_array_sort                  (GValueArray *value_array,
+                                                         GCompareFunc compare_func);
+

+Sort value_array using compare_func to compare the elements accoring to +the semantics of GCompareFunc. +

+

+The current implementation uses Quick-Sort as sorting algorithm.

+
++ + + + + + + + + + + + + + +

value_array :

GValueArray to sort +

compare_func :

function to compare elements +

Returns :

the GValueArray passed in as value_array +
+
+
+
+

g_value_array_sort_with_data ()

+
GValueArray*        g_value_array_sort_with_data        (GValueArray *value_array,
+                                                         GCompareDataFunc compare_func,
+                                                         gpointer user_data);
+

+Sort value_array using compare_func to compare the elements accoring +to the semantics of GCompareDataFunc. +

+

+The current implementation uses Quick-Sort as sorting algorithm.

+
++ + + + + + + + + + + + + + + + + + +

value_array :

GValueArray to sort +

compare_func :

function to compare elements +

user_data :

extra data argument provided for compare_func +

Returns :

the GValueArray passed in as value_array +
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-Varargs-Value-Collection.html b/docs/reference/gobject/html/gobject-Varargs-Value-Collection.html new file mode 100644 index 0000000..454f811 --- /dev/null +++ b/docs/reference/gobject/html/gobject-Varargs-Value-Collection.html @@ -0,0 +1,201 @@ + + + + +Varargs Value Collection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Varargs Value Collection

+

Varargs Value Collection — Converting varargs to generic values

+
+
+

Synopsis

+
+#include <glib-object.h>
+#include <gobject/gvaluecollector.h>
+
+union               GTypeCValue;
+#define             G_VALUE_COLLECT                     (value, var_args, flags, __error)
+#define             G_VALUE_LCOPY                       (value, var_args, flags, __error)
+#define             G_VALUE_COLLECT_FORMAT_MAX_LENGTH
+
+
+
+

Description

+

+The macros in this section provide the varargs parsing support needed +in variadic GObject functions such as g_object_new() or g_object_set(). +They currently support the collection of integral types, floating point +types and pointers.

+
+
+

Details

+
+

union GTypeCValue

+
union GTypeCValue
+{
+  gint     v_int;
+  glong    v_long;
+  gint64   v_int64;
+  gdouble  v_double;
+  gpointer v_pointer;
+};
+
+

+A union holding one collected value.

+
+
+
+

G_VALUE_COLLECT()

+
#define             G_VALUE_COLLECT(value, var_args, flags, __error)
+

+Collects a variable argument value from a va_list. We have to +implement the varargs collection as a macro, because on some systems +va_list variables cannot be passed by reference. +

+

+Note: If you are creating the value argument just before calling this macro, +you should use the G_VALUE_COLLECT_INIT variant and pass the unitialized +GValue. That variant is faster than G_VALUE_COLLECT.

+
++ + + + + + + + + + + + + + + + + + +

value :

a GValue return location. value is supposed to be initialized + according to the value type to be collected +

var_args :

the va_list variable; it may be evaluated multiple times +

flags :

flags which are passed on to the collect_value() function of + the GTypeValueTable of value. +

__error :

a gchar** variable that will be modified to hold a g_new() + allocated error messages if something fails +
+
+
+
+

G_VALUE_LCOPY()

+
#define             G_VALUE_LCOPY(value, var_args, flags, __error)
+

+Collects a value's variable argument locations from a va_list. Usage is +analogous to G_VALUE_COLLECT().

+
++ + + + + + + + + + + + + + + + + + +

value :

a GValue return location. value is supposed to be initialized + according to the value type to be collected +

var_args :

the va_list variable; it may be evaluated multiple times +

flags :

flags which are passed on to the lcopy_value() function of + the GTypeValueTable of value. +

__error :

a gchar** variable that will be modified to hold a g_new() + allocated error messages if something fails +
+
+
+
+

G_VALUE_COLLECT_FORMAT_MAX_LENGTH

+
#define G_VALUE_COLLECT_FORMAT_MAX_LENGTH (8)
+
+

+The maximal number of GTypeCValues which can be collected for a +single GValue.

+
+
+
+

See Also

+GValueTable +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-memory.html b/docs/reference/gobject/html/gobject-memory.html new file mode 100644 index 0000000..e8f5124 --- /dev/null +++ b/docs/reference/gobject/html/gobject-memory.html @@ -0,0 +1,264 @@ + + + + +Object memory management + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Object memory management

+

+ The memory-management API for GObjects is a bit complicated but the idea behind it + is pretty simple: the goal is to provide a flexible model based on reference counting + which can be integrated in applications which use or require different memory management + models (such as garbage collection, aso...). The methods which are used to + manipulate this reference count are described below. +

+
+/*
+  Refcounting
+*/
+gpointer    g_object_ref                      (gpointer        object);
+void        g_object_unref                    (gpointer        object);
+
+/*
+ * Weak References
+ */
+typedef void (*GWeakNotify) (gpointer  data,
+                             GObject  *where_the_object_was);
+
+void g_object_weak_ref            (GObject     *object,
+                                   GWeakNotify  notify,
+                                   gpointer     data);
+void g_object_weak_unref          (GObject     *object,
+                                   GWeakNotify  notify,
+                                   gpointer     data);
+void g_object_add_weak_pointer    (GObject     *object, 
+                                   gpointer    *weak_pointer_location);
+void g_object_remove_weak_pointer (GObject     *object, 
+                                   gpointer    *weak_pointer_location);
+/*
+ * Cycle handling
+ */
+void g_object_run_dispose         (GObject     *object);
+
+

+

+
+

+Reference count

+

+ The functions g_object_ref/g_object_unref respectively + increase and decrease the reference count.These functions are thread-safe as of GLib 2.8. + The reference count is, unsurprisingly, initialized to one by + g_object_new which means that the caller + is currently the sole owner of the newly-created reference. + When the reference count reaches zero, that is, + when g_object_unref is called by the last client holding + a reference to the object, the dispose and the + finalize class methods are invoked. +

+

+ Finally, after finalize is invoked, + g_type_free_instance is called to free the object instance. + Depending on the memory allocation policy decided when the type was registered (through + one of the g_type_register_* functions), the object's instance + memory will be freed or returned to the object pool for this type. + Once the object has been freed, if it was the last instance of the type, the type's class + will be destroyed as described in the section called “Instantiable classed types: objects” and + the section called “Non-instantiable classed types: interfaces”. +

+

+ The table below summarizes the destruction process of a GObject: +

+
+

Table 5. g_object_unref

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parametersRemark
Last call to g_object_unref for an instance + of target type + target type's dispose class functionGObject instance + When dispose ends, the object should not hold any reference to any other + member object. The object is also expected to be able to answer client + method invocations (with possibly an error code but no memory violation) + until finalize is executed. dispose can be executed more than once. + dispose should chain up to its parent implementation just before returning + to the caller. +
target type's finalize class functionGObject instance + Finalize is expected to complete the destruction process initiated by + dispose. It should complete the object's destruction. finalize will be + executed only once. + finalize should chain up to its parent implementation just before returning + to the caller. + The reason why the destruction process is split is two different phases is + explained in the section called “Reference counts and cycles”. +
Last call to g_object_unref for the last + instance of target type + interface' interface_finalize functionOn interface' vtableNever used in practice. Unlikely you will need it.
interface' base_finalize functionOn interface' vtableNever used in practice. Unlikely you will need it.
target type's class_finalize functionOn target type's class structureNever used in practice. Unlikely you will need it.
type's base_finalize functionOn the inheritance tree of classes from fundamental type to target type. + base_init is invoked once for each class structure.Never used in practice. Unlikely you will need it.
+
+


+

+
+
+

+Weak References

+

+ Weak References are used to monitor object finalization: + g_object_weak_ref adds a monitoring callback which does + not hold a reference to the object but which is invoked when the object runs + its dispose method. As such, each weak ref can be invoked more than once upon + object finalization (since dispose can run more than once during object + finalization). +

+

+ g_object_weak_unref can be used to remove a monitoring + callback from the object. +

+

+ Weak References are also used to implement g_object_add_weak_pointer + and g_object_remove_weak_pointer. These functions add a weak reference + to the object they are applied to which makes sure to nullify the pointer given by the user + when object is finalized. +

+
+
+

+Reference counts and cycles

+

+ Note: the following section was inspired by James Henstridge. I guess this means that + all praise and all curses will be directly forwarded to him. +

+

+ GObject's memory management model was designed to be easily integrated in existing code + using garbage collection. This is why the destruction process is split in two phases: + the first phase, executed in the dispose handler is supposed to release all references + to other member objects. The second phase, executed by the finalize handler is supposed + to complete the object's destruction process. Object methods should be able to run + without program error (that is, without segfault :) in-between the two phases. +

+

+ This two-step destruction process is very useful to break reference counting cycles. + While the detection of the cycles is up to the external code, once the cycles have been + detected, the external code can invoke g_object_dispose which + will indeed break any existing cycles since it will run the dispose handler associated + to the object and thus release all references to other objects. +

+

+ Attentive readers might now have understood one of the rules about the dispose handler + we stated a bit sooner: the dispose handler can be invoked multiple times. Let's say we + have a reference count cycle: object A references B which itself references object A. + Let's say we have detected the cycle and we want to destroy the two objects. One way to + do this would be to invoke g_object_dispose on one of the + objects. +

+

+ If object A releases all its references to all objects, this means it releases its + reference to object B. If object B was not owned by anyone else, this is its last + reference count which means this last unref runs B's dispose handler which, in turn, + releases B's reference on object A. If this is A's last reference count, this last + unref runs A's dispose handler which is running for the second time before + A's finalize handler is invoked ! +

+

+ The above example, which might seem a bit contrived can really happen if your + GObject's are being handled by language bindings. I would thus suggest the rules stated above + for object destruction are closely followed. Otherwise, Bad Bad Things + will happen. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-properties.html b/docs/reference/gobject/html/gobject-properties.html new file mode 100644 index 0000000..4e41a02 --- /dev/null +++ b/docs/reference/gobject/html/gobject-properties.html @@ -0,0 +1,300 @@ + + + + +Object properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Object properties

+

+ One of GObject's nice features is its generic get/set mechanism for object + properties. When an object + is instantiated, the object's class_init handler should be used to register + the object's properties with g_object_class_install_property + (implemented in gobject.c). +

+

+ The best way to understand how object properties work is by looking at a real example + on how it is used: +

+
+/************************************************/
+/* Implementation                               */
+/************************************************/
+
+enum
+{
+  PROP_0,
+
+  PROP_MAMAN_NAME,
+  PROP_PAPA_NUMBER
+};
+
+static void
+maman_bar_set_property (GObject      *object,
+                        guint         property_id,
+                        const GValue *value,
+                        GParamSpec   *pspec)
+{
+  MamanBar *self = MAMAN_BAR (object);
+
+  switch (property_id)
+    {
+    case PROP_MAMAN_NAME:
+      g_free (self->priv->name);
+      self->priv->name = g_value_dup_string (value);
+      g_print ("maman: %s\n", self->priv->name);
+      break;
+
+    case PROP_PAPA_NUMBER:
+      self->priv->papa_number = g_value_get_uchar (value);
+      g_print ("papa: %u\n", self->priv->papa_number);
+      break;
+
+    default:
+      /* We don't have any other property... */
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+maman_bar_get_property (GObject    *object,
+                        guint       property_id,
+                        GValue     *value,
+                        GParamSpec *pspec)
+{
+  MamanBar *self = MAMAN_BAR (object);
+
+  switch (property_id)
+    {
+    case PROP_MAMAN_NAME:
+      g_value_set_string (value, self->priv->name);
+      break;
+
+    case PROP_PAPA_NUMBER:
+      g_value_set_uchar (value, self->priv->papa_number);
+      break;
+
+    default:
+      /* We don't have any other property... */
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GParamSpec *pspec;
+
+  gobject_class->set_property = maman_bar_set_property;
+  gobject_class->get_property = maman_bar_get_property;
+
+  pspec = g_param_spec_string ("maman-name",
+                               "Maman construct prop",
+                               "Set maman's name",
+                               "no-name-set" /* default value */,
+                               G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class,
+                                   PROP_MAMAN_NAME,
+                                   pspec);
+
+  pspec = g_param_spec_uchar ("papa-number",
+                              "Number of current Papa",
+                              "Set/Get papa's number",
+                              0  /* minimum value */,
+                              10 /* maximum value */,
+                              2  /* default value */,
+                              G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class,
+                                   PROP_PAPA_NUMBER,
+                                   pspec);
+}
+
+/************************************************/
+/* Use                                          */
+/************************************************/
+
+GObject *bar;
+GValue val = { 0, };
+
+bar = g_object_new (MAMAN_TYPE_SUBBAR, NULL);
+
+g_value_init (&val, G_TYPE_CHAR);
+g_value_set_char (&val, 11);
+
+g_object_set_property (G_OBJECT (bar), "papa-number", &val);
+
+g_value_unset (&val);
+
+

+ The client code just above looks simple but a lot of things happen under the hood: +

+

+ g_object_set_property first ensures a property + with this name was registered in bar's class_init handler. If so, it calls + object_set_property which first walks the class hierarchy, + from bottom, most derived type, to top, fundamental type to find the class + which registered that property. It then tries to convert the user-provided GValue + into a GValue whose type is that of the associated property. +

+

+ If the user provides a signed char GValue, as is shown + here, and if the object's property was registered as an unsigned int, + g_value_transform will try to transform the input signed char into + an unsigned int. Of course, the success of the transformation depends on the availability + of the required transform function. In practice, there will almost always be a transformation + [4] + which matches and conversion will be carried out if needed. +

+

+ After transformation, the GValue is validated by + g_param_value_validate which makes sure the user's + data stored in the GValue matches the characteristics specified by + the property's GParamSpec. Here, the GParamSpec we + provided in class_init has a validation function which makes sure that the GValue + contains a value which respects the minimum and maximum bounds of the + GParamSpec. In the example above, the client's GValue does not + respect these constraints (it is set to 11, while the maximum is 10). As such, the + g_object_set_property function will return with an error. +

+

+ If the user's GValue had been set to a valid value, g_object_set_property + would have proceeded with calling the object's set_property class method. Here, since our + implementation of Foo did override this method, the code path would jump to + foo_set_property after having retrieved from the + GParamSpec the param_id + [5] + which had been stored by + g_object_class_install_property. +

+

+ Once the property has been set by the object's set_property class method, the code path + returns to g_object_set_property which calls + g_object_notify_queue_thaw. This function makes sure that + the "notify" signal is emitted on the object's instance with the changed property as + parameter unless notifications were frozen by g_object_freeze_notify. +

+

+ g_object_thaw_notify can be used to re-enable notification of + property modifications through the "notify" signal. It is important to remember that + even if properties are changed while property change notification is frozen, the "notify" + signal will be emitted once for each of these changed properties as soon as the property + change notification is thawed: no property change is lost for the "notify" signal. Signal + can only be delayed by the notification freezing mechanism. +

+

+ It sounds like a tedious task to set up GValues every time when one wants to modify a property. + In practice one will rarely do this. The functions g_object_set_property + and g_object_get_property + are meant to be used by language bindings. For application there is an easier way and + that is described next. +

+
+

+Accessing multiple properties at once

+

+ It is interesting to note that the g_object_set and + g_object_set_valist (vararg version) functions can be used to set + multiple properties at once. The client code shown above can then be re-written as: +

+
+MamanBar *foo;
+foo = /* */;
+g_object_set (G_OBJECT (foo),
+              "papa-number", 2, 
+              "maman-name", "test", 
+              NULL);
+
+

+ This saves us from managing the GValues that we were needing to handle when using + g_object_set_property. + The code above will trigger one notify signal emission for each property modified. +

+

+ Of course, the _get versions are also available: g_object_get + and g_object_get_valist (vararg version) can be used to get numerous + properties at once. +

+

+ These high level functions have one drawback - they don't provide a return result. + One should pay attention to the argument types and ranges when using them. + A known source of errors is to e.g. pass a gfloat instead of a gdouble and thus + shifting all subsequent parameters by four bytes. Also forgetting the terminating + NULL will lead to unexpected behaviour. +

+

+ Really attentive readers now understand how g_object_new, + g_object_newv and g_object_new_valist + work: they parse the user-provided variable number of parameters and invoke + g_object_set on the parameters only after the object has been successfully constructed. + Of course, the "notify" signal will be emitted for each property set. +

+
+
+

+

[4] Its behaviour might not be what you expect but it is up to you to actually avoid + relying on these transformations. +

+

[5] + It should be noted that the param_id used here need only to uniquely identify each + GParamSpec within the FooClass such that the switch + used in the set and get methods actually works. Of course, this locally-unique + integer is purely an optimization: it would have been possible to use a set of + if (strcmp (a, b) == 0) {} else if (strcmp (a, b) == 0) {} statements. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject-query.html b/docs/reference/gobject/html/gobject-query.html new file mode 100644 index 0000000..b63dcc6 --- /dev/null +++ b/docs/reference/gobject/html/gobject-query.html @@ -0,0 +1,147 @@ + + + + +gobject-query + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gobject-query

+

gobject-query — display a tree of types

+
+
+

Synopsis

+

gobject-query froots [options...]

+

gobject-query tree [options...]

+
+
+

Description

+

+gobject-query is a small utility that draws a tree of +types. +

+
+
+

Invocation

+

+gobject-query takes a mandatory argument that specifies +whether it should iterate over the fundamental types or print a type tree. +

+
+

Options

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

froots

+iterate over fundamental roots +

tree

+print type tree +

-r type

+specify the root type +

-n

+don't descend type tree +

-b string

+specify indent string +

-i string

+specify incremental indent string +

-s number

+specify line spacing +

-h, --help

+Print brief help and exit. +

-v, --version

+Print version and exit. +

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gobject.devhelp b/docs/reference/gobject/html/gobject.devhelp new file mode 100644 index 0000000..103c96b --- /dev/null +++ b/docs/reference/gobject/html/gobject.devhelp @@ -0,0 +1,722 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gobject/html/gobject.devhelp2 b/docs/reference/gobject/html/gobject.devhelp2 new file mode 100644 index 0000000..a7e49d4 --- /dev/null +++ b/docs/reference/gobject/html/gobject.devhelp2 @@ -0,0 +1,756 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gobject/html/gtype-conventions.html b/docs/reference/gobject/html/gtype-conventions.html new file mode 100644 index 0000000..8cd2a64 --- /dev/null +++ b/docs/reference/gobject/html/gtype-conventions.html @@ -0,0 +1,173 @@ + + + + +Conventions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Conventions

+

+ There are a number of conventions users are expected to follow when creating new types + which are to be exported in a header file: +

+
    +
  • + Use the object_method pattern for function names: to invoke + the method named foo on an instance of object type bar, call + bar_foo. +

  • +
  • Use prefixing to avoid namespace conflicts with other projects. + If your library (or application) is named Maman, + [3] + + prefix all your function names with maman_. + For example: maman_object_method. +

  • +
  • Create a macro named PREFIX_TYPE_OBJECT which always + returns the GType for the associated object type. For an object of type + Bar in a library prefixed by maman, + use: MAMAN_TYPE_BAR. + It is common although not a convention to implement this macro using either a global + static variable or a function named prefix_object_get_type. + We will follow the function pattern wherever possible in this document. +

  • +
  • Create a macro named PREFIX_OBJECT (obj) which + returns a pointer of type PrefixObject. This macro is used to enforce + static type safety by doing explicit casts wherever needed. It also enforces + dynamic type safety by doing runtime checks. It is possible to disable the dynamic + type checks in production builds (see building glib). + For example, we would create + MAMAN_BAR (obj) to keep the previous example. +

  • +
  • If the type is classed, create a macro named + PREFIX_OBJECT_CLASS (klass). This macro + is strictly equivalent to the previous casting macro: it does static casting with + dynamic type checking of class structures. It is expected to return a pointer + to a class structure of type PrefixObjectClass. Again, an example is: + MAMAN_BAR_CLASS. +

  • +
  • Create a macro named PREFIX_IS_BAR (obj): this macro is expected + to return a gboolean which indicates whether or not the input + object instance pointer of type BAR. +

  • +
  • If the type is classed, create a macro named + PREFIX_IS_OBJECT_CLASS (klass) which, as above, returns a boolean + if the input class pointer is a pointer to a class of type OBJECT. +

  • +
  • If the type is classed, create a macro named + PREFIX_OBJECT_GET_CLASS (obj) + which returns the class pointer associated to an instance of a given type. This macro + is used for static and dynamic type safety purposes (just like the previous casting + macros). +

  • +
+

+ The implementation of these macros is pretty straightforward: a number of simple-to-use + macros are provided in gtype.h. For the example we used above, we would + write the following trivial code to declare the macros: +

+
+#define MAMAN_TYPE_BAR                  (maman_bar_get_type ())
+#define MAMAN_BAR(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar))
+#define MAMAN_BAR_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass))
+#define MAMAN_IS_BAR(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR))
+#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR))
+#define MAMAN_BAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass))
+
+

+

+
+

Note

+

Stick to the naming klass as class is a registered c++ keyword.

+
+

+

+

+ The following code shows how to implement the maman_bar_get_type + function: +

+
+GType maman_bar_get_type (void)
+{
+  static GType type = 0;
+  if (type == 0) {
+    static const GTypeInfo info = {
+      /* You fill this structure. */
+    };
+    type = g_type_register_static (G_TYPE_OBJECT,
+                                   "MamanBarType",
+                                   &info, 0);
+  }
+  return type;
+}
+
+

+

+

+ When having no special requirements you also can use the G_DEFINE_TYPE + macro: +

+
+G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT)
+
+

+

+
+

+

[3] + Maman is the French word for mum + or mother - nothing more and nothing less. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gtype-instantiable-classed.html b/docs/reference/gobject/html/gtype-instantiable-classed.html new file mode 100644 index 0000000..bfbd1f4 --- /dev/null +++ b/docs/reference/gobject/html/gtype-instantiable-classed.html @@ -0,0 +1,317 @@ + + + + +Instantiable classed types: objects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Instantiable classed types: objects

+

+ Types which are registered with a class and are declared instantiable are + what most closely resembles an object. + Although GObjects (detailed in The GObject base class) + are the most well known type of instantiable + classed types, other kinds of similar objects used as the base of an inheritance + hierarchy have been externally developed and they are all built on the fundamental + features described below. +

+

+ For example, the code below shows how you could register + such a fundamental object type in the type system: +

+
+typedef struct {
+  GObject parent;
+  /* instance members */
+  int field_a;
+} MamanBar;
+
+typedef struct {
+  GObjectClass parent;
+  /* class members */
+  void (*do_action_public_virtual) (MamanBar *self, guint8 i);
+
+  void (*do_action_public_pure_virtual) (MamanBar *self, guint8 i);
+} MamanBarClass;
+
+#define MAMAN_TYPE_BAR (maman_bar_get_type ())
+
+GType 
+maman_bar_get_type (void)
+{
+  static GType type = 0;
+  if (type == 0) {
+    static const GTypeInfo info = {
+      sizeof (MamanBarClass),
+      NULL,           /* base_init */
+      NULL,           /* base_finalize */
+      (GClassInitFunc) foo_class_init,
+      NULL,           /* class_finalize */
+      NULL,           /* class_data */
+      sizeof (MamanBar),
+      0,              /* n_preallocs */
+      (GInstanceInitFunc) NULL /* instance_init */
+    };
+    type = g_type_register_static (G_TYPE_OBJECT,
+                                   "BarType",
+                                   &info, 0);
+  }
+  return type;
+}
+
+

+ Upon the first call to maman_bar_get_type, the type named + BarType will be registered in the type system as inheriting + from the type G_TYPE_OBJECT. +

+

+ Every object must define two structures: its class structure and its + instance structure. All class structures must contain as first member + a GTypeClass structure. All instance structures must contain as first + member a GTypeInstance structure. The declaration of these C types, + coming from gtype.h is shown below: +

+
+struct _GTypeClass
+{
+  GType g_type;
+};
+struct _GTypeInstance
+{
+  GTypeClass *g_class;
+};
+
+

+ These constraints allow the type system to make sure that every object instance + (identified by a pointer to the object's instance structure) contains in its + first bytes a pointer to the object's class structure. +

+

+ This relationship is best explained by an example: let's take object B which + inherits from object A: +

+
+/* A definitions */
+typedef struct {
+  GTypeInstance parent;
+  int field_a;
+  int field_b;
+} A;
+typedef struct {
+  GTypeClass parent_class;
+  void (*method_a) (void);
+  void (*method_b) (void);
+} AClass;
+
+/* B definitions. */
+typedef struct {
+  A parent;
+  int field_c;
+  int field_d;
+} B;
+typedef struct {
+  AClass parent_class;
+  void (*method_c) (void);
+  void (*method_d) (void);
+} BClass;
+
+

+ The C standard mandates that the first field of a C structure is stored starting + in the first byte of the buffer used to hold the structure's fields in memory. + This means that the first field of an instance of an object B is A's first field + which in turn is GTypeInstance's first field which in turn is g_class, a pointer + to B's class structure. +

+

+ Thanks to these simple conditions, it is possible to detect the type of every + object instance by doing: +

+
+B *b;
+b->parent.parent.g_class->g_type
+
+

+ or, more quickly: +

+
+B *b;
+((GTypeInstance*)b)->g_class->g_type
+
+

+

+
+

+Initialization and Destruction

+

+ instantiation of these types can be done with + g_type_create_instance: +

+
+GTypeInstance* g_type_create_instance (GType          type);
+void           g_type_free_instance   (GTypeInstance *instance);
+
+

+ g_type_create_instance will look up the type information + structure associated to the type requested. Then, the instance size and instantiation + policy (if the n_preallocs field is set to a non-zero value, the type system allocates + the object's instance structures in chunks rather than mallocing for every instance) + declared by the user are used to get a buffer to hold the object's instance + structure. +

+

+ If this is the first instance of the object ever created, the type system must create + a class structure: it allocates a buffer to hold the object's class structure and + initializes it. It first copies the parent's class structure over this structure + (if there is no parent, it initializes it to zero). It then invokes the + base_class_initialization functions (GBaseInitFunc) from topmost + fundamental object to bottom-most most derived object. The object's class_init + (GClassInitFunc) function is invoked afterwards to complete + initialization of the class structure. + Finally, the object's interfaces are initialized (we will discuss interface initialization + in more detail later). +

+

+ Once the type system has a pointer to an initialized class structure, it sets the object's + instance class pointer to the object's class structure and invokes the object's + instance_init (GInstanceInitFunc)functions, from top-most fundamental + type to bottom-most most derived type. +

+

+ Object instance destruction through g_type_free_instance is very simple: + the instance structure is returned to the instance pool if there is one and if this was the + last living instance of the object, the class is destroyed. +

+

+ Class destruction (the concept of destruction is sometimes partly + referred to as finalization in GType) is the symmetric process of + the initialization: interfaces are destroyed first. + Then, the most derived + class_finalize (ClassFinalizeFunc) function is invoked. The + base_class_finalize (GBaseFinalizeFunc) functions are + Finally invoked from bottom-most most-derived type to top-most fundamental type and + the class structure is freed. +

+

+ As many readers have now understood it, the base initialization/finalization process is + very similar to the C++ constructor/destructor paradigm. The practical details are different + though and it is important not to get confused by superficial similarities. + GTypes have no instance destruction mechanism. It is + the user's responsibility to implement correct destruction semantics on top + of the existing GType code. (this is what GObject does. See + The GObject base class) + Furthermore, C++ code equivalent to the base_init + and class_init callbacks of GType is usually not needed because C++ cannot really create object + types at runtime. +

+

+ The instantiation/finalization process can be summarized as follows: +

+
+

Table 1. GType Instantiation/Finalization

+
+++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parameters
First call to g_type_create_instance for target typetype's base_init functionOn the inheritance tree of classes from fundamental type to target type. + base_init is invoked once for each class structure.
target type's class_init functionOn target type's class structure
interface initialization, see + the section called “Interface Initialization” + 
Each call to g_type_create_instance for target typetarget type's instance_init functionOn object's instance
Last call to g_type_free_instance for target typeinterface destruction, see + the section called “Interface Destruction” + 
target type's class_finalize functionOn target type's class structure
type's base_finalize functionOn the inheritance tree of classes from fundamental type to target type. + base_finalize is invoked once for each class structure.
+
+


+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gtype-non-instantiable-classed.html b/docs/reference/gobject/html/gtype-non-instantiable-classed.html new file mode 100644 index 0000000..d8fe97b --- /dev/null +++ b/docs/reference/gobject/html/gtype-non-instantiable-classed.html @@ -0,0 +1,346 @@ + + + + +Non-instantiable classed types: interfaces + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Non-instantiable classed types: interfaces

+

+ GType's interfaces are very similar to Java's interfaces. They allow + to describe a common API that several classes will adhere to. + Imagine the play, pause and stop buttons on hi-fi equipment - those can + be seen as a playback interface. Once you know what they do, you can + control your CD player, MP3 player or anything that uses these symbols. + To declare an interface you have to register a non-instantiable + classed type which derives from + GTypeInterface. The following piece of code declares such an interface. +

+
+#define MAMAN_IBAZ_TYPE                (maman_ibaz_get_type ())
+#define MAMAN_IBAZ(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_IBAZ_TYPE, MamanIbaz))
+#define MAMAN_IS_IBAZ(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_IBAZ_TYPE))
+#define MAMAN_IBAZ_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_IBAZ_TYPE, MamanIbazInterface))
+
+typedef struct _MamanIbaz MamanIbaz; /* dummy object */
+typedef struct _MamanIbazInterface MamanIbazInterface;
+
+struct _MamanIbazInterface {
+  GTypeInterface parent;
+
+  void (*do_action) (MamanIbaz *self);
+};
+
+GType maman_ibaz_get_type (void);
+
+void maman_ibaz_do_action (MamanIbaz *self);
+
+

+ The interface function, maman_ibaz_do_action is implemented + in a pretty simple way: +

+
+void maman_ibaz_do_action (MamanIbaz *self)
+{
+  MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self);
+}
+
+

+ maman_ibaz_get_type registers a type named MamanIBaz + which inherits from G_TYPE_INTERFACE. All interfaces must be children of G_TYPE_INTERFACE in the + inheritance tree. +

+

+ An interface is defined by only one structure which must contain as first member + a GTypeInterface structure. The interface structure is expected to + contain the function pointers of the interface methods. It is good style to + define helper functions for each of the interface methods which simply call + the interface' method directly: maman_ibaz_do_action + is one of these. +

+

+ Once an interface type is registered, you must register implementations for these + interfaces. The function named maman_baz_get_type registers + a new GType named MamanBaz which inherits from GObject and which + implements the interface MamanIBaz. +

+
+static void maman_baz_do_action (MamanIbaz *self)
+{
+  g_print ("Baz implementation of IBaz interface Action.\n");
+}
+
+
+static void
+baz_interface_init (gpointer         g_iface,
+                    gpointer         iface_data)
+{
+  MamanIbazInterface *iface = (MamanIbazInterface *)g_iface;
+  iface->do_action = maman_baz_do_action;
+}
+
+GType 
+maman_baz_get_type (void)
+{
+  static GType type = 0;
+  if (type == 0) {
+    static const GTypeInfo info = {
+      sizeof (MamanBazInterface),
+      NULL,   /* base_init */
+      NULL,   /* base_finalize */
+      NULL,   /* class_init */
+      NULL,   /* class_finalize */
+      NULL,   /* class_data */
+      sizeof (MamanBaz),
+      0,      /* n_preallocs */
+      NULL    /* instance_init */
+    };
+    static const GInterfaceInfo ibaz_info = {
+      (GInterfaceInitFunc) baz_interface_init,    /* interface_init */
+      NULL,               /* interface_finalize */
+      NULL          /* interface_data */
+    };
+    type = g_type_register_static (G_TYPE_OBJECT,
+                                   "MamanBazType",
+                                   &info, 0);
+    g_type_add_interface_static (type,
+                                 MAMAN_IBAZ_TYPE,
+                                 &ibaz_info);
+  }
+  return type;
+}
+
+

+

+

+ g_type_add_interface_static records in the type system that + a given type implements also FooInterface + (foo_interface_get_type returns the type of + FooInterface). + The GInterfaceInfo structure holds + information about the implementation of the interface: +

+
+struct _GInterfaceInfo
+{
+  GInterfaceInitFunc     interface_init;
+  GInterfaceFinalizeFunc interface_finalize;
+  gpointer               interface_data;
+};
+
+

+

+

+ When having no special requirements you also can use the G_DEFINE_INTERFACE macro: +

+
+G_DEFINE_INTERFACE (MamanBaz, maman_baz, G_TYPE_OBJECT)
+
+

+

+
+

+Interface Initialization

+

+ When an instantiable classed type which registered an interface + implementation is created for the first time, its class structure + is initialized following the process + described in the section called “Instantiable classed types: objects”. + After that, the interface implementations associated with + the type are initialized. +

+

+ First a memory buffer is allocated to hold the interface structure. The parent's + interface structure is then copied over to the new interface structure (the parent + interface is already initialized at that point). If there is no parent interface, + the interface structure is initialized with zeros. The g_type and the g_instance_type + fields are then initialized: g_type is set to the type of the most-derived interface + and g_instance_type is set to the type of the most derived type which implements + this interface. +

+

+ Finally, the interface' most-derived base_init function and then + the implementation's interface_init + function are invoked. It is important to understand that if there are multiple + implementations of an interface the base_init and + interface_init functions will be + invoked once for each implementation initialized. +

+

+ It is thus common for base_init functions to hold a local static boolean variable + which makes sure that the interface type is initialized only once even if there are + multiple implementations of the interface: +

+
+static void
+maman_ibaz_base_init (gpointer g_iface)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized) {
+    /* create interface signals here. */
+    initialized = TRUE;
+  }
+}
+
+

+

+

+ If you have found the stuff about interface hairy, you are right: it is hairy but + there is not much I can do about it. What I can do is summarize what you need to know + about interfaces: +

+

+ The above process can be summarized as follows: +

+
+

Table 2. Interface Initialization

+
+++++ + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parametersRemark
First call to g_type_create_instance for type + implementing interface + interface' base_init functionOn interface' vtableRegister interface' signals here (use a local static + boolean variable as described above to make sure not to register them + twice.).
interface' interface_init functionOn interface' vtable + Initialize interface' implementation. That is, initialize the interface + method pointers in the interface structure to the function's implementation. +
+
+


+ It is highly unlikely (i.e. I do not know of anyone who actually + used it) you will ever need other more fancy things such as the ones described in the + following section (the section called “Interface Destruction”). +

+
+
+

+Interface Destruction

+

+ When the last instance of an instantiable type which registered + an interface implementation is destroyed, the interface's + implementations associated to the type are destroyed. +

+

+ To destroy an interface implementation, GType first calls the + implementation's interface_finalize function + and then the interface's most-derived + base_finalize function. +

+

+ Again, it is important to understand, as in + the section called “Interface Initialization”, + that both interface_finalize and base_finalize + are invoked exactly once for the destruction of each implementation of an interface. Thus, + if you were to use one of these functions, you would need to use a static integer variable + which would hold the number of instances of implementations of an interface such that + the interface's class is destroyed only once (when the integer variable reaches zero). +

+

+ The above process can be summarized as follows: +

+
+

Table 3. Interface Finalization

+
+++++ + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parameters
Last call to g_type_free_instance for type + implementing interface + interface' interface_finalize functionOn interface' vtable
interface' base_finalize functionOn interface' vtable
+
+


+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/gtype-non-instantiable.html b/docs/reference/gobject/html/gtype-non-instantiable.html new file mode 100644 index 0000000..2a838ca --- /dev/null +++ b/docs/reference/gobject/html/gtype-non-instantiable.html @@ -0,0 +1,106 @@ + + + + +Non-instantiable non-classed fundamental types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Non-instantiable non-classed fundamental types

+

+ A lot of types are not instantiable by the type system and do not have + a class. Most of these types are fundamental trivial types such as gchar, + registered in g_value_types_init (in gvaluetypes.c). +

+

+ To register such a type in the type system, you just need to fill the + GTypeInfo structure with zeros since these types are also most of the time + fundamental: +

+
+  GTypeInfo info = {
+    0,                                /* class_size */
+    NULL,                        /* base_init */
+    NULL,                        /* base_destroy */
+    NULL,                        /* class_init */
+    NULL,                        /* class_destroy */
+    NULL,                        /* class_data */
+    0,                                /* instance_size */
+    0,                                /* n_preallocs */
+    NULL,                        /* instance_init */
+    NULL,                        /* value_table */
+  };
+  static const GTypeValueTable value_table = {
+    value_init_long0,                /* value_init */
+    NULL,                        /* value_free */
+    value_copy_long0,                /* value_copy */
+    NULL,                        /* value_peek_pointer */
+    "i",                        /* collect_format */
+    value_collect_int,        /* collect_value */
+    "p",                        /* lcopy_format */
+    value_lcopy_char,                /* lcopy_value */
+  };
+  info.value_table = &value_table;
+  type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0);
+          
+

+

+

+ Having non-instantiable types might seem a bit useless: what good is a type + if you cannot instantiate an instance of that type ? Most of these types + are used in conjunction with GValues: a GValue is initialized + with an integer or a string and it is passed around by using the registered + type's value_table. GValues (and by extension these trivial fundamental + types) are most useful when used in conjunction with object properties and signals. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/home.png b/docs/reference/gobject/html/home.png new file mode 100644 index 0000000000000000000000000000000000000000..17003611d9df2b066afc682cbde962f3a575002d GIT binary patch literal 654 zcmV;90&)F`P)~yY zO1cF+0vxb!W?!x?K+*#62Jq)nA4q`)5S6sgX4ao{=)(Mgq+YMr)7sjak|a^9)zS!j zlk{-n29mabXYF=7SYBQx&vO8xC}MYams+hxqtO7sImhPaCf@rq;I^3!#u*2aUP)55 zT2&N90xmEJ0s&fGT~(T<3d2xYmK9C>IP*x-M@ib*+0pFm>>uW37N2Wzaq-fCnIZE9 zpb8}0+uN+KuQM2oZVHfP8U6kQdo3?>Wo2dT)WeM9So8DqhLi#T0 z-i(>mfjhvbsYV`;4sgfJ-p>G-SqJ!fjR6BQYs1h*y9xaN0l{VB;o%`08yiy@)$8@~ z2PD1gcDuiy;j1tR0v#V8OH%W)25-YKyx(j#IXO9*YWf0mb8}QG6@b@;cHxh9{t7+@ o!Yd`f8L$sLH?yBt^q3C6015TtIu@BS5dZ)H07*qoM6N<$f*igdr~m)} literal 0 HcmV?d00001 diff --git a/docs/reference/gobject/html/howto-gobject-chainup.html b/docs/reference/gobject/html/howto-gobject-chainup.html new file mode 100644 index 0000000..01a1c8b --- /dev/null +++ b/docs/reference/gobject/html/howto-gobject-chainup.html @@ -0,0 +1,130 @@ + + + + +Chaining up + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Chaining up

+

Chaining up is often loosely defined by the following set of + conditions: +

+
    +
  • Parent class A defines a public virtual method named foo and + provides a default implementation.

  • +
  • Child class B re-implements method foo.

  • +
  • In the method B::foo, the child class B calls its parent class method A::foo.

  • +
+

+ There are many uses to this idiom: +

+
    +
  • You need to change the behaviour of a class without modifying its code. You create + a subclass to inherit its implementation, re-implement a public virtual method to modify the behaviour + slightly and chain up to ensure that the previous behaviour is not really modified, just extended. +

  • +
  • You are lazy, you have access to the source code of the parent class but you don't want + to modify it to add method calls to new specialized method calls: it is faster to hack the child class + to chain up than to modify the parent to call down.

  • +
  • You need to implement the Chain Of Responsibility pattern: each object of the inheritance + tree chains up to its parent (typically, at the beginning or the end of the method) to ensure that + they each handler is run in turn.

  • +
+

+ I am personally not really convinced any of the last two uses are really a good idea but since this + programming idiom is often used, this section attempts to explain how to implement it. +

+

+ To explicitly chain up to the implementation of the virtual method in the parent class, + you first need a handle to the original parent class structure. This pointer can then be used to + access the original class function pointer and invoke it directly. + [11] +

+

The function g_type_class_peek_parent is used to access the original parent + class structure. Its input is a pointer to the class of the derived object and it returns a pointer + to the original parent class structure. The code below shows how you could use it: +

+
+static void
+b_method_to_call (B *obj, int a)
+{
+  BClass *klass;
+  AClass *parent_class;
+
+  klass = B_GET_CLASS (obj);
+  parent_class = g_type_class_peek_parent (klass);
+
+  /* do stuff before chain up */
+
+  parent_class->method_to_call (obj, a);
+
+  /* do stuff after chain up */
+}
+
+

+

+
+

+

[11] + The original adjective used in this sentence is not innocuous. To fully + understand its meaning, you need to recall how class structures are initialized: for each object type, + the class structure associated to this object is created by first copying the class structure of its + parent type (a simple memcpy) and then by invoking the class_init callback on + the resulting class structure. Since the class_init callback is responsible for overwriting the class structure + with the user re-implementations of the class methods, we cannot merely use the modified copy of the parent class + structure stored in our derived instance. We want to get a copy of the class structure of an instance of the parent + class. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-gobject-code.html b/docs/reference/gobject/html/howto-gobject-code.html new file mode 100644 index 0000000..053ee63 --- /dev/null +++ b/docs/reference/gobject/html/howto-gobject-code.html @@ -0,0 +1,116 @@ + + + + +Boilerplate code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Boilerplate code

+

+ In your code, the first step is to #include the needed headers: depending + on your header include strategy, this can be as simple as + #include "maman-bar.h" or as complicated as tens + of #include lines ending with #include "maman-bar.h": +

+
+/*
+ * Copyright information
+ */
+
+#include "maman-bar.h"
+
+/* If you use Pimpls, include the private structure 
+ * definition here. Some people create a maman-bar-private.h header
+ * which is included by the maman-bar.c file and which contains the
+ * definition for this private structure.
+ */
+struct _MamanBarPrivate {
+  int member_1;
+  /* stuff */
+};
+
+/* 
+ * forward definitions
+ */
+
+

+

+

+ Call the G_DEFINE_TYPE macro using the name + of the type, the prefix of the functions and the parent GType to + reduce the amount of boilerplate needed. This macro will: + +

+
    +
  • implement the maman_bar_get_type + function
  • +
  • define a parent class pointer accessible from + the whole .c file
  • +
+

+ +

+
+G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT);
+
+

+

+

+ It is also possible to use the + G_DEFINE_TYPE_WITH_CODE macro to control the + get_type function implementation - for instance, to add a call to + G_IMPLEMENT_INTERFACE macro which will + call the g_type_implement_interface function. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-gobject-construction.html b/docs/reference/gobject/html/howto-gobject-construction.html new file mode 100644 index 0000000..df13a8d --- /dev/null +++ b/docs/reference/gobject/html/howto-gobject-construction.html @@ -0,0 +1,143 @@ + + + + +Object Construction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Object Construction

+

+ People often get confused when trying to construct their GObjects because of the + sheer number of different ways to hook into the objects's construction process: it is + difficult to figure which is the correct, recommended way. +

+

+ Table 4, “g_object_new” shows what user-provided functions + are invoked during object instantiation and in which order they are invoked. + A user looking for the equivalent of the simple C++ constructor function should use + the instance_init method. It will be invoked after all the parent's instance_init + functions have been invoked. It cannot take arbitrary construction parameters + (as in C++) but if your object needs arbitrary parameters to complete initialization, + you can use construction properties. +

+

+ Construction properties will be set only after all instance_init functions have run. + No object reference will be returned to the client of g_object_new + until all the construction properties have been set. +

+

+ As such, I would recommend writing the following code first: +

+
+static void
+maman_bar_init (MamanBar *self)
+{
+  self->priv = MAMAN_BAR_GET_PRIVATE (self); 
+
+  /* initialize all public and private members to reasonable default values. */
+
+  /* If you need specific construction properties to complete initialization,
+   * delay initialization completion until the property is set. 
+   */
+}
+
+

+

+

+ Now, if you need special construction properties, install the properties in the class_init function, + override the set and get methods and implement the get and set methods as described in + the section called “Object properties”. Make sure that these properties use a construct only + GParamSpec by setting the param spec's flag field to G_PARAM_CONSTRUCT_ONLY: this helps + GType ensure that these properties are not set again later by malicious user code. +

+
+static void
+bar_class_init (MamanBarClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GParamSpec *maman_param_spec;
+
+  gobject_class->set_property = bar_set_property;
+  gobject_class->get_property = bar_get_property;
+
+  maman_param_spec = g_param_spec_string ("maman",
+                                          "Maman construct prop",
+                                          "Set maman's name",
+                                          "no-name-set" /* default value */,
+                                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class,
+                                   PROP_MAMAN,
+                                   maman_param_spec);
+}
+
+

+ If you need this, make sure you can build and run code similar to the code shown above. Make sure + your construct properties can set correctly during construction, make sure you cannot set them + afterwards and make sure that if your users do not call g_object_new + with the required construction properties, these will be initialized with the default values. +

+

+ I consider good taste to halt program execution if a construction property is set its + default value. This allows you to catch client code which does not give a reasonable + value to the construction properties. Of course, you are free to disagree but you + should have a good reason to do so. +

+

+ Some people sometimes need to construct their object but only after + the construction properties have been set. This is possible through + the use of the constructor class method as described in + the section called “Object instantiation” or, more simply, using + the constructed class method available since GLib 2.12. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-gobject-destruction.html b/docs/reference/gobject/html/howto-gobject-destruction.html new file mode 100644 index 0000000..43d2b8c --- /dev/null +++ b/docs/reference/gobject/html/howto-gobject-destruction.html @@ -0,0 +1,152 @@ + + + + +Object Destruction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Object Destruction

+

+ Again, it is often difficult to figure out which mechanism to use to + hook into the object's destruction process: when the last + g_object_unref + function call is made, a lot of things happen as described in + Table 5, “g_object_unref”. +

+

+ The destruction process of your object might be split in two different + phases: dispose and the finalize. +

+
+#define MAMAN_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MAMAN_TYPE_BAR, MamanBarPrivate))
+
+struct _MamanBarPrivate
+{
+  GObject *an_object;
+
+  gchar *a_string;
+};
+
+G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT);
+
+static void
+maman_bar_dispose (GObject *gobject)
+{
+  MamanBar *self = MAMAN_BAR (gobject);
+
+  /* 
+   * In dispose, you are supposed to free all types referenced from this
+   * object which might themselves hold a reference to self. Generally,
+   * the most simple solution is to unref all members on which you own a 
+   * reference.
+   */
+
+  /* dispose might be called multiple times, so we must guard against
+   * calling g_object_unref() on an invalid GObject.
+   */
+  if (self->priv->an_object)
+    {
+      g_object_unref (self->priv->an_object);
+
+      self->priv->an_object = NULL;
+    }
+
+  /* Chain up to the parent class */
+  G_OBJECT_CLASS (maman_bar_parent_class)->dispose (gobject);
+}
+
+static void
+maman_bar_finalize (GObject *gobject)
+{
+  MamanBar *self = MAMAN_BAR (gobject);
+
+  g_free (self->priv->a_string);
+
+  /* Chain up to the parent class */
+  G_OBJECT_CLASS (maman_bar_parent_class)->finalize (gobject);
+}
+
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->dispose = maman_bar_dispose;
+  gobject_class->finalize = maman_bar_finalize;
+
+  g_type_class_add_private (klass, sizeof (MamanBarPrivate));
+}
+
+static void
+maman_bar_init (MamanBar *self);
+{
+  self->priv = MAMAN_BAR_GET_PRIVATE (self);
+
+  self->priv->an_object = g_object_new (MAMAN_TYPE_BAZ, NULL);
+  self->priv->a_string = g_strdup ("Maman");
+}
+
+

+

+

+ Add similar code to your GObject, make sure the code still builds + and runs: dispose and finalize must be called during the last unref. +

+

+ It is possible that object methods might be invoked after dispose is + run and before finalize runs. GObject does not consider this to be a + program error: you must gracefully detect this and neither crash nor + warn the user. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-gobject-methods.html b/docs/reference/gobject/html/howto-gobject-methods.html new file mode 100644 index 0000000..ff753a2 --- /dev/null +++ b/docs/reference/gobject/html/howto-gobject-methods.html @@ -0,0 +1,287 @@ + + + + +Object methods + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Object methods

+

+ Just as with C++, there are many different ways to define object + methods and extend them: the following list and sections draw on + C++ vocabulary. (Readers are expected to know basic C++ buzzwords. + Those who have not had to write C++ code recently can refer to e.g. + http://www.cplusplus.com/doc/tutorial/ to refresh + their memories.) +

+
    +
  • + non-virtual public methods, +

  • +
  • + virtual public methods and +

  • +
  • + virtual private methods +

  • +
+

+

+
+

+Non-virtual public methods

+

+ These are the simplest: you want to provide a simple method which + can act on your object. All you need to do is to provide a function + prototype in the header and an implementation of that prototype + in the source file. +

+
+/* declaration in the header. */
+void maman_bar_do_action (MamanBar *self, /* parameters */);
+
+/* implementation in the source file */
+void
+maman_bar_do_action (MamanBar *self, /* parameters */)
+{
+  g_return_if_fail (MAMAN_IS_BAR (self));
+
+  /* do stuff here. */
+}
+
+

+

+

There is really nothing scary about this.

+
+
+

+Virtual public methods

+

+ This is the preferred way to create polymorphic GObjects. All you + need to do is to define the common method and its class function in + the public header, implement the common method in the source file + and re-implement the class function in each object which inherits + from you. +

+
+/* declaration in maman-bar.h. */
+struct _MamanBarClass
+{
+  GObjectClass parent_class;
+
+  /* stuff */
+  void (*do_action) (MamanBar *self, /* parameters */);
+};
+
+void maman_bar_do_action (MamanBar *self, /* parameters */);
+
+/* implementation in maman-bar.c */
+void
+maman_bar_do_action (MamanBar *self, /* parameters */)
+{
+  g_return_if_fail (MAMAN_IS_BAR (self));
+
+  MAMAN_BAR_GET_CLASS (self)->do_action (self, /* parameters */);
+}
+
+

+ The code above simply redirects the do_action call to the relevant + class function. Some users, concerned about performance, do not + provide the maman_bar_do_action wrapper function + and require users to dereference the class pointer themselves. This + is not such a great idea in terms of encapsulation and makes it + difficult to change the object's implementation afterwards, should + this be needed. +

+

+ Other users, also concerned by performance issues, declare + the maman_bar_do_action function inline in the + header file. This, however, makes it difficult to change the + object's implementation later (although easier than requiring users + to directly dereference the class function) and is often difficult + to write in a portable way (the inline keyword + is part of the C99 standard but not every compiler supports it). +

+

+ In doubt, unless a user shows you hard numbers about the performance + cost of the function call, just implement maman_bar_do_action + in the source file. +

+

+ Please, note that it is possible for you to provide a default + implementation for this class method in the object's + class_init function: initialize the + klass->do_action field to a pointer to the actual implementation. + You can also make this class method pure virtual by initializing + the klass->do_action field to NULL: +

+
+static void
+maman_bar_real_do_action_two (MamanBar *self, /* parameters */)
+{
+  /* Default implementation for the virtual method. */
+}
+
+static void
+maman_bar_class_init (BarClass *klass)
+{
+  /* pure virtual method: mandates implementation in children. */
+  klass->do_action_one = NULL;
+
+  /* merely virtual method. */
+  klass->do_action_two = maman_bar_real_do_action_two;
+}
+
+void
+maman_bar_do_action_one (MamanBar *self, /* parameters */)
+{
+  g_return_if_fail (MAMAN_IS_BAR (self));
+
+  MAMAN_BAR_GET_CLASS (self)->do_action_one (self, /* parameters */);
+}
+
+void
+maman_bar_do_action_two (MamanBar *self, /* parameters */)
+{
+  g_return_if_fail (MAMAN_IS_BAR (self));
+
+  MAMAN_BAR_GET_CLASS (self)->do_action_two (self, /* parameters */);
+}
+
+

+

+
+
+

+Virtual private Methods

+

+ These are very similar to Virtual Public methods. They just don't + have a public function to call the function directly. The header + file contains only a declaration of the class function: +

+
+/* declaration in maman-bar.h. */
+struct _MamanBarClass
+{
+  GObjectClass parent;
+
+  /* stuff */
+  void (* helper_do_specific_action) (MamanBar *self, /* parameters */);
+};
+
+void maman_bar_do_any_action (MamanBar *self, /* parameters */);
+
+

+ These class functions are often used to delegate part of the job + to child classes: +

+
+/* this accessor function is static: it is not exported outside of this file. */
+static void 
+maman_bar_do_specific_action (MamanBar *self, /* parameters */)
+{
+  MAMAN_BAR_GET_CLASS (self)->do_specific_action (self, /* parameters */);
+}
+
+void
+maman_bar_do_any_action (MamanBar *self, /* parameters */)
+{
+  /* random code here */
+
+  /* 
+   * Try to execute the requested action. Maybe the requested action
+   * cannot be implemented here. So, we delegate its implementation
+   * to the child class:
+   */
+  maman_bar_do_specific_action (self, /* parameters */);
+
+  /* other random code here */
+}
+
+

+

+

+ Again, it is possible to provide a default implementation for this + private virtual class function: +

+
+static void
+maman_bar_class_init (MamanBarClass *klass)
+{
+  /* pure virtual method: mandates implementation in children. */
+  klass->do_specific_action_one = NULL;
+
+  /* merely virtual method. */
+  klass->do_specific_action_two = maman_bar_real_do_specific_action_two;
+}
+
+

+

+

+ Children can then implement the subclass with code such as: +

+
+static void
+maman_bar_subtype_class_init (MamanBarSubTypeClass *klass)
+{
+  MamanBarClass *bar_class = MAMAN_BAR_CLASS (klass);
+
+  /* implement pure virtual class function. */
+  bar_class->do_specific_action_one = maman_bar_subtype_do_specific_action_one;
+}
+
+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-gobject.html b/docs/reference/gobject/html/howto-gobject.html new file mode 100644 index 0000000..2b6141e --- /dev/null +++ b/docs/reference/gobject/html/howto-gobject.html @@ -0,0 +1,313 @@ + + + + +How to define and implement a new GObject + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+How to define and implement a new GObject

+ +

+ Clearly, this is one of the most common questions people ask: they just + want to crank code and implement a subclass of a GObject. Sometimes because + they want to create their own class hierarchy, sometimes because they want + to subclass one of GTK+'s widget. This chapter will focus on the + implementation of a subtype of GObject. +

+
+

+Boilerplate header code

+

+ The first step before writing the code for your GObject is to write the + type's header which contains the needed type, function and macro + definitions. Each of these elements is nothing but a convention which + is followed not only by GTK+'s code but also by most users of GObject. + If you feel the need not to obey the rules stated below, think about it + twice: +

+
    +
  • If your users are a bit accustomed to GTK+ code or any + GLib code, they will be a bit surprised and getting used to the + conventions you decided upon will take time (money) and will make them + grumpy (not a good thing)

  • +
  • You must assess the fact that these conventions might + have been designed by both smart and experienced people: maybe they + were at least partly right. Try to put your ego aside.

  • +
+

+

+

+ Pick a name convention for your headers and source code and stick to it: +

+
    +
  • use a dash to separate the prefix from the typename: + maman-bar.h and maman-bar.c + (this is the convention used by Nautilus and most GNOME libraries).

  • +
  • use an underscore to separate the prefix from the + typename: maman_bar.h and + maman_bar.c.

  • +
  • Do not separate the prefix from the typename: + mamanbar.h and mamanbar.c. + (this is the convention used by GTK+)

  • +
+

+ I personally like the first solution better: it makes reading file names + easier for those with poor eyesight like me. +

+

+ When you need some private (internal) declarations in several + (sub)classes, you can define them in a private header file which + is often named by appending the private keyword + to the public header name. For example, one could use + maman-bar-private.h, + maman_bar_private.h or + mamanbarprivate.h. Typically, such private header + files are not installed. +

+

+ The basic conventions for any header which exposes a GType are described + in the section called “Conventions”. Most GObject-based code also + obeys one of of the following conventions: pick one and stick to it. +

+
    +
  • +

    + If you want to declare a type named bar with prefix maman, name the type instance + MamanBar and its class MamanBarClass + (name is case-sensitive). It is customary to declare them with code similar to the + following: +

    +
    +/*
    + * Copyright/Licensing information.
    + */
    +
    +/* inclusion guard */
    +#ifndef __MAMAN_BAR_H__
    +#define __MAMAN_BAR_H__
    +
    +#include <glib-object.h>
    +/*
    + * Potentially, include other headers on which this header depends.
    + */
    +
    +/*
    + * Type macros.
    + */
    +#define MAMAN_TYPE_BAR                  (maman_bar_get_type ())
    +#define MAMAN_BAR(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar))
    +#define MAMAN_IS_BAR(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR))
    +#define MAMAN_BAR_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass))
    +#define MAMAN_IS_BAR_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR))
    +#define MAMAN_BAR_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass))
    +
    +typedef struct _MamanBar        MamanBar;
    +typedef struct _MamanBarClass   MamanBarClass;
    +
    +struct _MamanBar
    +{
    +  GObject parent_instance;
    +
    +  /* instance members */
    +};
    +
    +struct _MamanBarClass
    +{
    +  GObjectClass parent_class;
    +
    +  /* class members */
    +};
    +
    +/* used by MAMAN_TYPE_BAR */
    +GType maman_bar_get_type (void);
    +
    +/*
    + * Method definitions.
    + */
    +
    +#endif /* __MAMAN_BAR_H__ */
    +
    +

    +

    +
  • +
  • +

    + Most GTK+ types declare their private fields in the public header + with a /* private */ comment, relying on their user's intelligence + not to try to play with these fields. Fields not marked private + are considered public by default. The /* protected */ comment + (same semantics as those of C++) is also used, mainly in the GType + library, in code written by Tim Janik. +

    +
    +struct _MamanBar
    +{
    +  GObject parent_instance;
    +
    +  /*< private >*/
    +  int hsize;
    +};
    +
    +

    +

    +
  • +
  • +

    + All of Nautilus code and a lot of GNOME libraries use private + indirection members, as described by Herb Sutter in his Pimpl + articles(see Compilation Firewalls + and The Fast Pimpl Idiom: + he summarizes the different issues better than I will). +

    +
    +typedef struct _MamanBarPrivate MamanBarPrivate;
    +
    +struct _MamanBar
    +{
    +  GObject parent_instance;
    +    
    +  /*< private >*/
    +  MamanBarPrivate *priv;
    +};
    +
    +

    +

    +
    +

    Note

    +

    Do not call this private, as + that is a registered c++ keyword.

    +
    +

    + + The private structure is then defined in the .c file, using the + g_type_class_add_private() function to notify the presence of + a private memory area for each instance and it can either + be retrieved using G_TYPE_INSTANCE_GET_PRIVATE() + each time is needed, or assigned to the priv + member of the instance structure inside the object's + init function. +

    +
    +#define MAMAN_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MAMAN_TYPE_BAR, MamanBarPrivate))
    +
    +struct _MamanBarPrivate
    +{
    +  int hsize;
    +}
    +
    +static void
    +maman_bar_class_init (MamanBarClass *klass)
    +{
    +  g_type_class_add_private (klass, sizeof (MamanBarPrivate));
    +}
    +
    +static void
    +maman_bar_init (MamanBar *self)
    +{
    +  MamanBarPrivate *priv;
    +
    +  self->priv = priv = MAMAN_BAR_GET_PRIVATE (self);
    +
    +  priv->hsize = 42;
    +}
    +
    +

    +

    +
  • +
  • + You don't need to free or allocate the private structure, only the + objects or pointers that it may contain. Another advantage of this + to the previous version is that is lessens memory fragmentation, + as the public and private parts of the instance memory are + allocated at once. +

  • +
+

+

+

+ Finally, there are different header include conventions. Again, pick one + and stick to it. I personally use indifferently any of the two, depending + on the codebase I work on: the rule, as always, is consistency. +

+
    +
  • + Some people add at the top of their headers a number of #include + directives to pull in all the headers needed to compile client + code. This allows client code to simply #include "maman-bar.h". +

  • +
  • + Other do not #include anything and expect the client to #include + themselves the headers they need before including your header. This + speeds up compilation because it minimizes the amount of + pre-processor work. This can be used in conjunction with the + re-declaration of certain unused types in the client code to + minimize compile-time dependencies and thus speed up compilation. +

  • +
+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-interface-implement.html b/docs/reference/gobject/html/howto-interface-implement.html new file mode 100644 index 0000000..399acab --- /dev/null +++ b/docs/reference/gobject/html/howto-interface-implement.html @@ -0,0 +1,155 @@ + + + + +How To define implement an Interface? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+How To define implement an Interface?

+

+ Once the interface is defined, implementing it is rather trivial. +

+

+ The first step is to define a normal GObject class, like: +

+
+#ifndef __MAMAN_BAZ_H__
+#define __MAMAN_BAZ_H__
+
+#include <glib-object.h>
+
+#define MAMAN_TYPE_BAZ             (maman_baz_get_type ())
+#define MAMAN_BAZ(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAZ, Mamanbaz))
+#define MAMAN_IS_BAZ(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAZ))
+#define MAMAN_BAZ_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAZ, MamanbazClass))
+#define MAMAN_IS_BAZ_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAZ))
+#define MAMAN_BAZ_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAZ, MamanbazClass))
+
+
+typedef struct _MamanBaz        MamanBaz;
+typedef struct _MamanBazClass   MamanBazClass;
+
+struct _MamanBaz
+{
+  GObject parent_instance;
+
+  int instance_member;
+};
+
+struct _MamanBazClass
+{
+  GObjectClass parent_class;
+};
+
+GType maman_baz_get_type (void);
+
+#endif /* __MAMAN_BAZ_H__ */
+
+

+ There is clearly nothing specifically weird or scary about this header: + it does not define any weird API or derives from a weird type. +

+

+ The second step is to implement MamanBaz by defining + its GType. Instead of using G_DEFINE_TYPE we + use G_DEFINE_TYPE_WITH_CODE and the + G_IMPLEMENT_INTERFACE macros. +

+
+static void maman_ibaz_interface_init (MamanIbazInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MamanBar, maman_bar, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ,
+                                                maman_ibaz_interface_init));
+
+

+ This definition is very much like all the similar functions we looked + at previously. The only interface-specific code present here is the call + to G_IMPLEMENT_INTERFACE. +

+
+

Note

+

Classes can implement multiple interfaces by using multiple + calls to G_IMPLEMENT_INTERFACE inside the call + to G_DEFINE_TYPE_WITH_CODE.

+
+

+ maman_baz_interface_init, the interface + initialization function: inside it every virtual method of the interface + must be assigned to its implementation: +

+
+static void
+maman_baz_do_action (MamanBaz *self)
+{
+  g_print ("Baz implementation of IBaz interface Action: 0x%x.\n",
+           self->instance_member);
+}
+
+static void
+maman_ibaz_interface_init (MamanIbazInterface *iface)
+{
+  iface->do_action = baz_do_action;
+}
+
+static void
+maman_baz_init (MamanBaz *self)
+{
+  MamanBaz *self = MAMAN_BAZ (instance);
+  self->instance_member = 0xdeadbeaf;
+}
+
+

+

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-interface-properties.html b/docs/reference/gobject/html/howto-interface-properties.html new file mode 100644 index 0000000..b513f18 --- /dev/null +++ b/docs/reference/gobject/html/howto-interface-properties.html @@ -0,0 +1,197 @@ + + + + +Interface Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Interface Properties

+

+ Starting from version 2.4 of GLib, GObject interfaces can also have + properties. Declaration of the interface properties is similar to + declaring the properties of ordinary GObject types as explained in + the section called “Object properties”, + except that g_object_interface_install_property is used to + declare the properties instead of g_object_class_install_property. +

+

+ To include a property named 'name' of type string in the + maman_ibaz interface example code above, we only need to + add one + [12] + line in the maman_ibaz_base_init + [13] + as shown below: +

+
+static void
+maman_ibaz_base_init (gpointer g_iface)
+{
+  static gboolean is_initialized = FALSE;
+
+  if (!is_initialized)
+    {
+      g_object_interface_install_property (g_iface,
+                                           g_param_spec_string ("name",
+                                                                "Name",
+                                                                "Name of the MamanIbaz",
+                                                                "maman",
+                                                                G_PARAM_READWRITE));
+      is_initialized = TRUE;
+    }
+}
+
+

+

+

+ One point worth noting is that the declared property wasn't assigned an + integer ID. The reason being that integer IDs of properties are used + only inside the get and set methods and since interfaces do not + implement properties, there is no need to assign integer IDs to + interface properties. +

+

+ An implementation shall declare and define it's properties in the usual + way as explained in the section called “Object properties”, except for one + small change: it must declare the properties of the interface it + implements using g_object_class_override_property + instead of g_object_class_install_property. + The following code snippet shows the modifications needed in the + MamanBaz declaration and implementation above: +

+
+
+struct _MamanBaz
+{
+  GObject parent_instance;
+
+  gint instance_member;
+  gchar *name;
+};
+
+enum
+{
+  PROP_0,
+
+  PROP_NAME
+};
+
+static void
+maman_baz_set_property (GObject      *object,
+                        guint         property_id,
+                        const GValue *value,
+                        GParamSpec   *pspec)
+{
+  MamanBaz *baz = MAMAN_BAZ (object);
+  GObject *obj;
+
+  switch (prop_id)
+    {
+    case ARG_NAME:
+      g_free (baz->name);
+      baz->name = g_value_dup_string (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+maman_baz_get_property (GObject    *object,
+                        guint       prop_id,
+                        GValue     *value,
+                        GParamSpec *pspec)
+{
+  MamanBaz *baz = MAMAN_BAZ (object);
+
+  switch (prop_id)
+    {
+    case ARG_NAME:
+      g_value_set_string (value, baz->name);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+maman_baz_class_init (MamanBazClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = maman_baz_set_property;
+  gobject_class->get_property = maman_baz_get_property;
+
+  g_object_class_override_property (gobject_class, PROP_NAME, "name");
+}
+
+
+

+

+
+

+

[12] + That really is one line extended to six for the sake of clarity +

+

[13] + The g_object_interface_install_property + can also be called from class_init but it must + not be called after that point. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-interface.html b/docs/reference/gobject/html/howto-interface.html new file mode 100644 index 0000000..ad609a5 --- /dev/null +++ b/docs/reference/gobject/html/howto-interface.html @@ -0,0 +1,190 @@ + + + + +How to define and implement interfaces + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+How to define and implement interfaces

+ +
+

+How to define interfaces

+

+ The bulk of interface definition has already been shown in the section called “Non-instantiable classed types: interfaces” + but I feel it is needed to show exactly how to create an interface. +

+

+ As above, the first step is to get the header right: +

+
+#ifndef __MAMAN_IBAZ_H__
+#define __MAMAN_IBAZ_H__
+
+#include <glib-object.h>
+
+#define MAMAN_TYPE_IBAZ                 (maman_ibaz_get_type ())
+#define MAMAN_IBAZ(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_IBAZ, MamanIbaz))
+#define MAMAN_IS_IBAZ(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_IBAZ))
+#define MAMAN_IBAZ_GET_INTERFACE(inst)  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_TYPE_IBAZ, MamanIbazInterface))
+
+
+typedef struct _MamanIbaz               MamanIbaz; /* dummy object */
+typedef struct _MamanIbazInterface      MamanIbazInterface;
+
+struct _MamanIbazInterface
+{
+  GTypeInterface parent_iface;
+
+  void (*do_action) (MamanIbaz *self);
+};
+
+GType maman_ibaz_get_type (void);
+
+void maman_ibaz_do_action (MamanIbaz *self);
+
+#endif /* __MAMAN_IBAZ_H__ */
+
+

+ This code is the same as the code for a normal GType + which derives from a GObject except for a few details: +

+
    +
  • + The _GET_CLASS macro is called _GET_INTERFACE + and not implemented with G_TYPE_INSTANCE_GET_CLASS + but with G_TYPE_INSTANCE_GET_INTERFACE. +

  • +
  • + The instance type, MamanIbaz is not fully defined: it is + used merely as an abstract type which represents an instance of + whatever object which implements the interface. +

  • +
  • + The parent of the MamanIbazInterface is not + GObjectClass but GTypeInterface. +

  • +
+

+

+

+ The implementation of the MamanIbaz type itself is trivial: +

+
    +
  • maman_ibaz_get_type registers the + type in the type system. +

  • +
  • maman_ibaz_base_init is expected + to register the interface's signals if there are any (we will see a bit + (later how to use them). Make sure to use a static local boolean variable + to make sure not to run the initialization code twice (as described in + the section called “Interface Initialization”, + base_init is run once for each interface implementation + instantiation)

  • +
  • maman_ibaz_do_action dereferences + the class structure to access its associated class function and calls it. +

  • +
+

+

+
+static void
+maman_ibaz_base_init (gpointer g_class)
+{
+  static gboolean is_initialized = FALSE;
+
+  if (!is_initialized)
+    {
+      /* add properties and signals to the interface here */
+
+      is_initialized = TRUE;
+    }
+}
+
+GType
+maman_ibaz_get_type (void)
+{
+  static GType iface_type = 0;
+  if (iface_type == 0)
+    {
+      static const GTypeInfo info = {
+        sizeof (MamanIbazInterface),
+        maman_ibaz_base_init,   /* base_init */
+        NULL,   /* base_finalize */
+      };
+
+      iface_type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbaz",
+                                           &info, 0);
+    }
+
+  return iface_type;
+}
+
+void
+maman_ibaz_do_action (MamanIbaz *self)
+{
+  g_return_if_fail (MAMAN_IS_IBAZ (self));
+
+  MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self);
+}
+
+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/howto-signals.html b/docs/reference/gobject/html/howto-signals.html new file mode 100644 index 0000000..b5ab1f5 --- /dev/null +++ b/docs/reference/gobject/html/howto-signals.html @@ -0,0 +1,151 @@ + + + + +How to create and use signals + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+How to create and use signals

+ +

+ The signal system which was built in GType is pretty complex and + flexible: it is possible for its users to connect at runtime any + number of callbacks (implemented in any language for which a binding + exists) + [14] + to any signal and to stop the emission of any signal at any + state of the signal emission process. This flexibility makes it + possible to use GSignal for much more than just emit signals which + can be received by numerous clients. +

+
+

+Simple use of signals

+

+ The most basic use of signals is to implement simple event + notification: for example, if we have a MamanFile object, and + if this object has a write method, we might wish to be notified + whenever someone has changed something via our MamanFile instance. + The code below shows how the user can connect a callback to the + "changed" signal. +

+
+file = g_object_new (MAMAN_FILE_TYPE, NULL);
+
+g_signal_connect (file, "changed", G_CALLBACK (changed_event), NULL);
+
+maman_file_write (file, buffer, strlen (buffer));
+
+

+

+

+ The MamanFile signal is registered in the class_init + function: +

+
+file_signals[CHANGED] = 
+  g_signal_newv ("changed",
+                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+                 NULL /* closure */,
+                 NULL /* accumulator */,
+                 NULL /* accumulator data */,
+                 g_cclosure_marshal_VOID__VOID,
+                 G_TYPE_NONE /* return_type */,
+                 0     /* n_params */,
+                 NULL  /* param_types */);
+
+

+ and the signal is emitted in maman_file_write: +

+
+void
+maman_file_write (MamanFile    *self,
+                  const guchar *buffer,
+                  gssize        size)
+{
+  /* First write data. */
+
+  /* Then, notify user of data written. */
+  g_signal_emit (self, file_signals[CHANGED], 0 /* details */);
+}
+
+

+ As shown above, you can safely set the details parameter to zero if + you do not know what it can be used for. For a discussion of what you + could used it for, see the section called “The detail argument” +

+

+ The signature of the signal handler in the above example is defined as + g_cclosure_marshal_VOID__VOID. Its name follows + a simple convention which encodes the function parameter and return value + types in the function name. Specifically, the value in front of the + double underscore is the type of the return value, while the value(s) + after the double underscore denote the parameter types. +

+

+ The header gobject/gmarshal.h defines a set of + commonly needed closures that one can use. If you want to have complex + marshallers for your signals you should probably use glib-genmarshal + to autogenerate them from a file containing their return and + parameter types. +

+
+
+

+

[14] A Python callback can be connected to any signal on any + C-based GObject. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/index.html b/docs/reference/gobject/html/index.html new file mode 100644 index 0000000..eb6c0e1 --- /dev/null +++ b/docs/reference/gobject/html/index.html @@ -0,0 +1,217 @@ + + + + +GObject Reference Manual + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

+ for GObject 2.24.0 + + The latest version of this documentation can be found on-line at + http://library.gnome.org/devel/gobject/unstable/. +

+
+
+
+
+
Introduction
+
I. Concepts
+
+
Background
+
+
Data types and programming
+
Exporting a C API
+
+
The GLib Dynamic Type System
+
+
Copy functions
+
Conventions
+
Non-instantiable non-classed fundamental types
+
Instantiable classed types: objects
+
Initialization and Destruction
+
Non-instantiable classed types: interfaces
+
+
Interface Initialization
+
Interface Destruction
+
+
+
The GObject base class
+
+
Object instantiation
+
Object memory management
+
+
Reference count
+
Weak References
+
Reference counts and cycles
+
+
Object properties
+
Accessing multiple properties at once
+
+
The GObject messaging system
+
+
Closures
+
+
C Closures
+
Non-C closures (for the fearless)
+
+
Signals
+
+
Signal registration
+
Signal connection
+
Signal emission
+
The detail argument
+
+
+
+
II. API Reference
+
+
+Type Information — The GLib Runtime type identification and + management system +
+
+GTypePlugin — An interface for dynamically loadable types +
+
+GTypeModule — Type loading modules +
+
+The Base Object Type — The base object type +
+
+Enumeration and Flag Types — Enumeration and flags types +
+
+Boxed Types — A mechanism to wrap opaque C structures registered + by the type system +
+
+Generic values — A polymorphic type that can hold values of any + other type +
+
+Parameters and Values — Standard Parameter and Value Types +
+
+GParamSpec — Metadata for parameter specifications +
+
+Varargs Value Collection — Converting varargs to generic values +
+
+Signals — A means for customization of object behaviour + and a general purpose notification mechanism +
+
+Closures — Functions as first-class objects +
+
+Value arrays — A container structure to maintain an array of + generic values +
+
+
III. Tools Reference
+
+
+glib-mkenums — C language enum description generation utility +
+
+glib-genmarshal — C code marshaller generation utility for GLib closures +
+
+gobject-query — display a tree of types +
+
+
IV. Tutorial
+
+
How to define and implement a new GObject
+
+
Boilerplate header code
+
Boilerplate code
+
Object Construction
+
Object Destruction
+
Object methods
+
+
Non-virtual public methods
+
Virtual public methods
+
Virtual private Methods
+
+
Chaining up
+
+
How to define and implement interfaces
+
+
How to define interfaces
+
How To define implement an Interface?
+
Interface definition prerequisites
+
Interface Properties
+
+
How to create and use signals
+
Simple use of signals
+
+
V. Related Tools
+
+
Vala
+
GObject builder
+
Graphical inspection of GObjects
+
Debugging reference count problems
+
Writing API docs
+
+
Index
+
Index of deprecated symbols
+
Index of new symbols in 2.2
+
Index of new symbols in 2.4
+
Index of new symbols in 2.6
+
Index of new symbols in 2.8
+
Index of new symbols in 2.10
+
Index of new symbols in 2.12
+
Index of new symbols in 2.14
+
Index of new symbols in 2.18
+
Index of new symbols in 2.22
+
Index of new symbols in 2.24
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/index.sgml b/docs/reference/gobject/html/index.sgml new file mode 100644 index 0000000..723569f --- /dev/null +++ b/docs/reference/gobject/html/index.sgml @@ -0,0 +1,734 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gobject/html/left.png b/docs/reference/gobject/html/left.png new file mode 100644 index 0000000000000000000000000000000000000000..2d05b3d5b4aeec9384bbfe404bfc4ed0897051c4 GIT binary patch literal 459 zcmV;+0W|)JP)40xL?wO*>WZ(J#ML5j2<9jD6A%Q&kC}jOeEc;X{s;`zcnxLeZR6?6h#^ihmNF6NpGdilO$m<82oD9WQ|6nVv1`? z>KufRi{?QPXg;4;wroQu4?mN1Ydd@|kaQ|ZyWLK!)yi7Wb%=0{}lD)tfliHAUyWRQ+fD_;aV6j->y6!O_8bENg + + + +Introduction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Introduction

+

+ Most modern programming languages come with their own native object + systems and additional fundamental algorithmic language constructs. + Just as GLib serves as an implementation of such fundamental + types and algorithms (linked lists, hash tables and so forth), the + GLib Object System provides the required implementations of a + flexible extensible and intentionally easy to map (into other + languages) object-oriented framework for C. + The substantial elements that are provided can be summarized as: +

+
    +
  • + A generic type system to register arbitrary single-inherited + flat and deep derived types as well as interfaces for + structured types. + It takes care of creation, initialization and memory management + of the assorted object and class structures, maintains + parent/child relationships and deals with dynamic implementations + of such types. That is, their type specific implementations are + relocatable/unloadable during runtime. +

  • +
  • + A collection of fundamental type implementations, such as integers, + doubles, enums and structured types, to name a few. +

  • +
  • + A sample fundamental type implementation to base object hierarchies + upon - the GObject fundamental type. +

  • +
  • + A signal system that allows very flexible user customization of + virtual/overridable object methods and can serve as a powerful + notification mechanism. +

  • +
  • + An extensible parameter/value system, supporting all the provided + fundamental types that can be used to generically handle object + properties or otherwise parameterized types. +

  • +
+

+

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/pt01.html b/docs/reference/gobject/html/pt01.html new file mode 100644 index 0000000..7e43702 --- /dev/null +++ b/docs/reference/gobject/html/pt01.html @@ -0,0 +1,110 @@ + + + + +Part I. Concepts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/gobject/html/pt02.html b/docs/reference/gobject/html/pt02.html new file mode 100644 index 0000000..58eb8d7 --- /dev/null +++ b/docs/reference/gobject/html/pt02.html @@ -0,0 +1,96 @@ + + + + +Part IV. Tutorial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Part IV. Tutorial

+
+
+

+ This chapter tries to answer the real-life questions of users and presents + the most common scenario use cases I could come up with. + The use cases are presented from most likely to less likely. +

+ +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/pt03.html b/docs/reference/gobject/html/pt03.html new file mode 100644 index 0000000..ea6f79c --- /dev/null +++ b/docs/reference/gobject/html/pt03.html @@ -0,0 +1,85 @@ + + + + +Part V. Related Tools + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Part V. Related Tools

+
+
+

+ Several useful developer tools have been build around GObject + technology. The next sections briefly introduce them and link to + the respective project pages. +

+

+ For example, writing GObjects is often seen as a tedious task. It + requires a lot of typing and just doing a copy/paste requires a + great deal of care. A lot of projects and scripts have been + written to generate GObject skeleton form boilerplate code, or + even translating higher-level language into plain C. +

+ +
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/right.png b/docs/reference/gobject/html/right.png new file mode 100644 index 0000000000000000000000000000000000000000..92832e3a4566e59d6e4092010e08d28f3be3a68d GIT binary patch literal 472 zcmV;}0Vn>6P) + + + +API Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+API Reference

+
+
+
+

Table of Contents

+
+
+Type Information — The GLib Runtime type identification and + management system +
+
+GTypePlugin — An interface for dynamically loadable types +
+
+GTypeModule — Type loading modules +
+
+The Base Object Type — The base object type +
+
+Enumeration and Flag Types — Enumeration and flags types +
+
+Boxed Types — A mechanism to wrap opaque C structures registered + by the type system +
+
+Generic values — A polymorphic type that can hold values of any + other type +
+
+Parameters and Values — Standard Parameter and Value Types +
+
+GParamSpec — Metadata for parameter specifications +
+
+Varargs Value Collection — Converting varargs to generic values +
+
+Signals — A means for customization of object behaviour + and a general purpose notification mechanism +
+
+Closures — Functions as first-class objects +
+
+Value arrays — A container structure to maintain an array of + generic values +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/rn02.html b/docs/reference/gobject/html/rn02.html new file mode 100644 index 0000000..9f3ca7b --- /dev/null +++ b/docs/reference/gobject/html/rn02.html @@ -0,0 +1,77 @@ + + + + +Tools Reference + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+Tools Reference

+
+
+
+

Table of Contents

+
+
+glib-mkenums — C language enum description generation utility +
+
+glib-genmarshal — C code marshaller generation utility for GLib closures +
+
+gobject-query — display a tree of types +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/signal.html b/docs/reference/gobject/html/signal.html new file mode 100644 index 0000000..7bab83c --- /dev/null +++ b/docs/reference/gobject/html/signal.html @@ -0,0 +1,407 @@ + + + + +Signals + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Signals

+

+ GObject's signals have nothing to do with standard UNIX signals: they connect + arbitrary application-specific events with any number of listeners. + For example, in GTK+, every user event (keystroke or mouse move) is received + from the X server and generates a GTK+ event under the form of a signal emission + on a given object instance. +

+

+ Each signal is registered in the type system together with the type on which + it can be emitted: users of the type are said to connect + to the signal on a given type instance when they register a closure to be + invoked upon the signal emission. Users can also emit the signal by themselves + or stop the emission of the signal from within one of the closures connected + to the signal. +

+

+ When a signal is emitted on a given type instance, all the closures + connected to this signal on this type instance will be invoked. All the closures + connected to such a signal represent callbacks whose signature looks like: +

+
+return_type function_callback (gpointer instance, ... , gpointer user_data);
+
+

+

+
+

+Signal registration

+

+ To register a new signal on an existing type, we can use any of g_signal_newv, + g_signal_new_valist or g_signal_new functions: +

+
+guint g_signal_newv (const gchar        *signal_name,
+                     GType               itype,
+                     GSignalFlags        signal_flags,
+                     GClosure           *class_closure,
+                     GSignalAccumulator  accumulator,
+                     gpointer            accu_data,
+                     GSignalCMarshaller  c_marshaller,
+                     GType               return_type,
+                     guint               n_params,
+                     GType              *param_types);
+
+

+ The number of parameters to these functions is a bit intimidating but they are relatively + simple: +

+
    +
  • + signal_name: is a string which can be used to uniquely identify a given signal. +

  • +
  • + itype: is the instance type on which this signal can be emitted. +

  • +
  • + signal_flags: partly defines the order in which closures which were connected to the + signal are invoked. +

  • +
  • + class_closure: this is the default closure for the signal: if it is not NULL upon + the signal emission, it will be invoked upon this emission of the signal. The + moment where this closure is invoked compared to other closures connected to that + signal depends partly on the signal_flags. +

  • +
  • + accumulator: this is a function pointer which is invoked after each closure + has been invoked. If it returns FALSE, signal emission is stopped. If it returns + TRUE, signal emission proceeds normally. It is also used to compute the return + value of the signal based on the return value of all the invoked closures. +

  • +
  • + accumulator_data: this pointer will be passed down to each invocation of the + accumulator during emission. +

  • +
  • + c_marshaller: this is the default C marshaller for any closure which is connected to + this signal. +

  • +
  • + return_type: this is the type of the return value of the signal. +

  • +
  • + n_params: this is the number of parameters this signal takes. +

  • +
  • + param_types: this is an array of GTypes which indicate the type of each parameter + of the signal. The length of this array is indicated by n_params. +

  • +
+

+

+

+ As you can see from the above definition, a signal is basically a description + of the closures which can be connected to this signal and a description of the + order in which the closures connected to this signal will be invoked. +

+
+
+

+Signal connection

+

+ If you want to connect to a signal with a closure, you have three possibilities: +

+
    +
  • + You can register a class closure at signal registration: this is a + system-wide operation. i.e.: the class_closure will be invoked during each emission + of a given signal on all the instances of the type which supports that signal. +

  • +
  • + You can use g_signal_override_class_closure which + overrides the class_closure of a given type. It is possible to call this function + only on a derived type of the type on which the signal was registered. + This function is of use only to language bindings. +

  • +
  • + You can register a closure with the g_signal_connect + family of functions. This is an instance-specific operation: the closure + will be invoked only during emission of a given signal on a given instance. +

  • +
+

+ It is also possible to connect a different kind of callback on a given signal: + emission hooks are invoked whenever a given signal is emitted whatever the instance on + which it is emitted. Emission hooks are used for example to get all mouse_clicked + emissions in an application to be able to emit the small mouse click sound. + Emission hooks are connected with g_signal_add_emission_hook + and removed with g_signal_remove_emission_hook. +

+
+
+

+Signal emission

+

+ Signal emission is done through the use of the g_signal_emit family + of functions. +

+
+void g_signal_emitv (const GValue *instance_and_params,
+                     guint         signal_id,
+                     GQuark        detail,
+                     GValue       *return_value);
+
+

+

+
    +
  • + The instance_and_params array of GValues contains the list of input + parameters to the signal. The first element of the array is the + instance pointer on which to invoke the signal. The following elements of + the array contain the list of parameters to the signal. +

  • +
  • + signal_id identifies the signal to invoke. +

  • +
  • + detail identifies the specific detail of the signal to invoke. A detail is a kind of + magic token/argument which is passed around during signal emission and which is used + by closures connected to the signal to filter out unwanted signal emissions. In most + cases, you can safely set this value to zero. See the section called “The detail argument” for + more details about this parameter. +

  • +
  • + return_value holds the return value of the last closure invoked during emission if + no accumulator was specified. If an accumulator was specified during signal creation, + this accumulator is used to calculate the return_value as a function of the return + values of all the closures invoked during emission. + [8] + If no closure is invoked during + emission, the return_value is nonetheless initialized to zero/null. +

  • +
+

+

+

+ Internally, the GValue array is passed to the emission function proper, + signal_emit_unlocked_R (implemented in gsignal.c). + Signal emission can be decomposed in 5 steps: +

+
    +
  • + RUN_FIRST: if the G_SIGNAL_RUN_FIRST flag was used + during signal registration and if there exist a class_closure for this signal, + the class_closure is invoked. Jump to EMISSION_HOOK state. +

  • +
  • + EMISSION_HOOK: if any emission hook was added to + the signal, they are invoked from first to last added. Accumulate return values + and jump to HANDLER_RUN_FIRST state. +

  • +
  • + HANDLER_RUN_FIRST: if any closure were connected + with the g_signal_connect family of + functions, and if they are not blocked (with the g_signal_handler_block + family of functions) they are run here, from first to last connected. + Jump to RUN_LAST state. +

  • +
  • + RUN_LAST: if the G_SIGNAL_RUN_LAST + flag was set during registration and if a class_closure + was set, it is invoked here. Jump to + HANDLER_RUN_LAST state. +

  • +
  • + HANDLER_RUN_LAST: if any closure were connected + with the g_signal_connect_after family of + functions, if they were not invoked during HANDLER_RUN_FIRST and if they + are not blocked, they are run here, from first to last connected. + Jump to RUN_CLEANUP state. +

  • +
  • + RUN_CLEANUP: if the G_SIGNAL_RUN_CLEANUP flag + was set during registration and if a class_closure was set, + it is invoked here. Signal emission is completed here. +

  • +
+

+

+

+ If, at any point during emission (except in RUN_CLEANUP state), one of the + closures or emission hook stops the signal emission with + g_signal_stop, emission jumps to CLEANUP state. +

+

+ If, at any point during emission, one of the closures or emission hook + emits the same signal on the same instance, emission is restarted from + the RUN_FIRST state. +

+

+ The accumulator function is invoked in all states, after invocation + of each closure (except in EMISSION_HOOK and CLEANUP). It accumulates + the closure return value into the signal return value and returns TRUE or + FALSE. If, at any point, it does not return TRUE, emission jumps to CLEANUP state. +

+

+ If no accumulator function was provided, the value returned by the last handler + run will be returned by g_signal_emit. +

+
+
+

+The detail argument

+

All the functions related to signal emission or signal connection have a parameter + named the detail. Sometimes, this parameter is hidden by the API + but it is always there, under one form or another. +

+

+ Of the three main connection functions, + only one has an explicit detail parameter as a GQuark + [9]: +

+
+gulong     g_signal_connect_closure_by_id          (gpointer          instance,
+                           guint          signal_id,
+                           GQuark          detail,
+                           GClosure         *closure,
+                           gboolean          after);
+
+

+ The two other functions hide the detail parameter in the signal name identification: +

+
+gulong     g_signal_connect_closure          (gpointer          instance,
+                           const gchar       *detailed_signal,
+                           GClosure         *closure,
+                           gboolean          after);
+gulong     g_signal_connect_data              (gpointer          instance,
+                           const gchar     *detailed_signal,
+                           GCallback      c_handler,
+                           gpointer          data,
+                           GClosureNotify      destroy_data,
+                           GConnectFlags      connect_flags);
+
+

+ Their detailed_signal parameter is a string which identifies the name of the signal + to connect to. However, the format of this string is structured to look like + signal_name::detail_name. Connecting to the signal + named notify::cursor_position will actually connect to the signal + named notify with the cursor_position name. + Internally, the detail string is transformed to a GQuark if it is present. +

+

+ Of the four main signal emission functions, three have an explicit detail parameter as a + GQuark again: +

+
+void                  g_signal_emitv        (const GValue       *instance_and_params,
+                         guint               signal_id,
+                         GQuark              detail,
+                         GValue             *return_value);
+void                  g_signal_emit_valist  (gpointer            instance,
+                         guint               signal_id,
+                         GQuark              detail,
+                         va_list             var_args);
+void                  g_signal_emit         (gpointer            instance,
+                         guint               signal_id,
+                         GQuark              detail,
+                         ...);
+
+

+ The fourth function hides it in its signal name parameter: +

+
+void                  g_signal_emit_by_name (gpointer            instance,
+                         const gchar        *detailed_signal,
+                         ...);
+
+

+ The format of the detailed_signal parameter is exactly the same as the format used by + the g_signal_connect functions: signal_name::detail_name. +

+

+ If a detail is provided by the user to the emission function, it is used during emission to match + against the closures which also provide a detail. + If the closures' detail does not match the detail provided by the user, they will not be invoked + (even though they are connected to a signal which is being emitted). +

+

+ This completely optional filtering mechanism is mainly used as an optimization for signals + which are often emitted for many different reasons: the clients can filter out which events they are + interested in before the closure's marshalling code runs. For example, this is used extensively + by the notify signal of GObject: whenever a property is modified on a GObject, + instead of just emitting the notify signal, GObject associates as a detail to this + signal emission the name of the property modified. This allows clients who wish to be notified of changes + to only one property to filter most events before receiving them. +

+

+ As a simple rule, users can and should set the detail parameter to zero: this will disable completely + this optional filtering. +

+
+
+

+

[8] + James (again!!) gives a few non-trivial examples of accumulators: + “ + For instance, you may have an accumulator that ignores NULL returns from + closures, and only accumulates the non-NULL ones. Another accumulator may try + to return the list of values returned by the closures. + ” +

+

[9] A GQuark is an integer which uniquely represents a string. It is possible to transform + back and forth between the integer and string representations with the functions + g_quark_from_string and g_quark_to_string. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/style.css b/docs/reference/gobject/html/style.css new file mode 100644 index 0000000..e31596b --- /dev/null +++ b/docs/reference/gobject/html/style.css @@ -0,0 +1,257 @@ +.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] + { + position: relative; + padding-top:4.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; +} + +/* code listings */ + +.programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.programlisting .function { color: #000000; font-weight: bold; } +.programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.programlisting .normal { color: #000000; } +.programlisting .number { color: #75507b; } /* tango: plum 2 */ +.programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.programlisting .type { color: #000000; } +.programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.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/gobject/html/tools-ginspector.html b/docs/reference/gobject/html/tools-ginspector.html new file mode 100644 index 0000000..d3f48fc --- /dev/null +++ b/docs/reference/gobject/html/tools-ginspector.html @@ -0,0 +1,65 @@ + + + + +Graphical inspection of GObjects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Graphical inspection of GObjects

+

+ Yet another tool that you may find helpful when working with + GObjects is G-Inspector. It + is able to display GLib/GTK+ objects and their properties. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/tools-gob.html b/docs/reference/gobject/html/tools-gob.html new file mode 100644 index 0000000..2e1bfd5 --- /dev/null +++ b/docs/reference/gobject/html/tools-gob.html @@ -0,0 +1,70 @@ + + + + +GObject builder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+GObject builder

+

+ In order to help a GObject class developper, one obvious idea is + to use some sort of templates for the skeletons. and then run + them through a special tool to generate the real C files. GOB (or GOB2) is + such a tool. It is a preprocessor which can be used to build + GObjects with inline C code so that there is no need to edit the + generated C code. The syntax is inspired by Java and Yacc or + Lex. The implementation is intentionally kept simple: the inline C + code provided by the user is not parsed. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/tools-gtkdoc.html b/docs/reference/gobject/html/tools-gtkdoc.html new file mode 100644 index 0000000..f39418c --- /dev/null +++ b/docs/reference/gobject/html/tools-gtkdoc.html @@ -0,0 +1,93 @@ + + + + +Writing API docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Writing API docs

+

The API documentation for most of the GLib, GObject, GTK+ and GNOME + libraries is built with a combination of complex tools. Typically, the part of + the documentation which describes the behavior of each function is extracted + from the specially-formatted source code comments by a tool named gtk-doc which + generates DocBook XML and merges this DocBook XML with a set of master XML + DocBook files. These XML DocBook files are finally processed with xsltproc + (a small program part of the libxslt library) to generate the final HTML + output. Other tools can be used to generate PDF output from the source XML. + The following code excerpt shows what these comments look like. +

+
+/**
+ * gtk_widget_freeze_child_notify:
+ * @widget: a #GtkWidget
+ * 
+ * Stops emission of "child-notify" signals on @widget. The signals are
+ * queued until gtk_widget_thaw_child_notify() is called on @widget. 
+ *
+ * This is the analogue of g_object_freeze_notify() for child properties.
+ **/
+void
+gtk_widget_freeze_child_notify (GtkWidget *widget)
+{
+...
+      
+

+

+

+ Thorough + documentation + on how to set up and use gtk-doc in your + project is provided on the GNOME developer website. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/tools-refdb.html b/docs/reference/gobject/html/tools-refdb.html new file mode 100644 index 0000000..0addcf6 --- /dev/null +++ b/docs/reference/gobject/html/tools-refdb.html @@ -0,0 +1,85 @@ + + + + +Debugging reference count problems + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Debugging reference count problems

+

+ The reference counting scheme used by GObject does solve quite + a few memory management problems but also introduces new sources of bugs. + In large applications, finding the exact spot where the reference count + of an Object is not properly handled can be very difficult. Hopefully, + there exist a tool named refdbg + which can be used to automate the task of tracking down the location + of invalid code with regard to reference counting. This application + intercepts the reference counting calls and tries to detect invalid behavior. + It supports a filter-rule mechanism to let you trace only the objects you are + interested in and it can be used together with GDB. +

+

+ + Note that if GObject has been compiled with --enable-debug=yes, + it exports a trap variable +

+
+static volatile GObject *g_trap_object_ref;
+      
+

+ If set to a non-NULL value, g_object_ref() + and g_object_unref() will be intercepted + when called with that value. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/tools-vala.html b/docs/reference/gobject/html/tools-vala.html new file mode 100644 index 0000000..e5c9cdd --- /dev/null +++ b/docs/reference/gobject/html/tools-vala.html @@ -0,0 +1,73 @@ + + + + +Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+Vala

+

+ From the Vala + homepage itself: “Vala is a new programming language + that aims to bring modern programming language features to GNOME + developers without imposing any additional runtime requirements + and without using a different ABI compared to applications and + libraries written in C.” +

+

+ The syntax of Vala is similar to C#. The available compiler + translates Vala into GObject C code. It can also compile + non-GObject C, using plain C API. +

+
+ + + \ No newline at end of file diff --git a/docs/reference/gobject/html/up.png b/docs/reference/gobject/html/up.png new file mode 100644 index 0000000000000000000000000000000000000000..85b3e2a2755fece72d0d09fbf1cf28d51fa71077 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgf{4tZ81y*aK8HyIchl|5Y?Ln`LHoowrM#DT$We|~2y zm!kHPIYzBV#iFCm$l5qa=|7aUX_&jTHR3kct+f-3dJW1pZtj?HsP%l7!S0-YWnmjW zI3~>Cd4HCN^TYHBC0dz3r5|}*T3c5!K}0^NPTey!^rYo;W&eW{b1SE%dR-1ljcju- zJITo5P_e{cPDWDszO|97o#m$fni3V4d%~7^?0HU4-k!+X`e~w55Q}HA=c?CM9`EK` z^o5GF_RsnG`ey+9wOf8O4bzg>7W*;jU~M?g`OZAA$mNp|Lz<$s+~N9!2`ir8RcClo$(Q~19INM~9}j;&*|enC yGd}kJak0wj?aUKd8;%}`i}SSew>!A-2iw}^5}Rh(M>+vRkipZ{&t;ucLK6U4uc96R literal 0 HcmV?d00001 diff --git a/docs/reference/gobject/images/glue.png b/docs/reference/gobject/images/glue.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f3aab2fa34fa43b3d08fc5ac1829aa9f5e5bd3 GIT binary patch literal 12722 zcmd6O2T)Y~vgaTOBUwZN5fDW|lE@%AIiezxMY05eL6Dpz=O7tW!VpCSL_~7V20$3H zlA{QS3`ug{9`D_%`|f*hw`#YxYPn8k1R24p#jzFA8+?Bhb z;hM5I=AnJ+X}!$Ka$sPL-HC+O>vXbJ_ho5o=}Y~~Eo;)ahbeiI~ z-kr?#dc2UO`$hU&UrD~6?V_8mUfCeuxcmJTb)u8Gv`ZBvAEhdG4z7*tt6!ic5yY-| zA2gv9>rp$3vl8hl&#|5%uPu^j(a4?Mg#sEjX?<1I^Kl9dM~5DQ<+tSIT1|^X*t}iW zW;;Bk(--aVXWUbBpFMl#>+AdSC4KU5=fOMKR*q~#Z0q9pXX~O~TU3{ntbJiH#C3E; zhJ`8IyB8iAd7Y8cDx|IW_wV1~3|9>*?QZZVq)WOv^uD=kb;s1UdjU73TkuI*(EQ0> z>*1>bY>i4mrp0d6T-vGdFJ#o`1Q;oW61jMI;6!l>SyWV1RxOXAW`ON9l8{Ic) zay7UKUvYSN_{*6%JSqxPF<{I_6}I7J>eIbI`ej{wJcxqf+_`hN=f$Lt_SZgtmV5g2 zDGg0@PMZ6>j0|Hr%^Ih9b&UV(wSsO$Xt_3PN* z=;+|%<;AyOZNL{~#d-9os?mS3DPXSilEYs@6%uYr@Dt&tnCm!2pDvBwyISY8GI=9T z;endk)cpKT`q57M#p2n_JJEut;B*&@(S@A(f5Y0^n$2^i>D`08-6t6QEhDp5%0_aJ zHp)!xs*>X3agXJ?H*Yw?UUSghb#ZY)qy07Wu3LZ7zx``zN!fdkv_(`&O+#5(+0(PO zqGGEvRpJDDm*g5HyXo(5x#FqH9CS>{*2AS=2L`sfd=A$ruGZ3?K7HM0wDSFXUi35d zT>a9=YVz{(s;b=|9@gBp^=Qiewc%c-o8R*o$?mh;mmX2${r%m8<=V9ns`P0h@{ zw6yGPZ`ZCiGY8UUsaL`3VHJhF_qWa3ld|>n^iI*y@jt9yM~n!%7xWGaxfkT9atXQMA!%N4s`LtZ?XJ&%`=*hU z?cwfTTU%>sY58lyCGF{iS3>r@#M31KFU-!L8K0eY!&2RR<($2C!^1y&6G!8Ny|p4y ztS%lbf&rIem~NkeziwAJNQjATh)GL`i5Z(I^E}Rhcn&t55A-;NrbU7dVa&5 zLeC#=rt!9&2rA;y%y_MvBL*|OHQ}Su2RCof;O&J*qqViQeHM2-y)7)RuycrrJnfFt zlYVaP?!GIrTzj+6$;`}5QBl#vBr}M@UrMLeb+v`fCnX`F!fpyZjXQMjsdZa(!4JY> zY`A-AYWBn7`_r?DzBojAKql6ho@Z-+XKliLA^&@xR!vpaaWb-siV8x3@?F4J*o-AT ze@@51Ao8n7#G?1j%8K1Ax&MvDk&0!g9)5m)C76!3&Q5Ad%5%dQ--n4Pb81v;KyorO z%G}qW^y#ue5Sl%qea68}NvUJJ&Lf}sedP{I79INa>(`~ai--<& zb@jwOw4iO>#fulQn}%K+-(?P0X-rC<41AE^7R8oxaM3ZWu{{0?Y7!+vW;IcNKv*#)B{PYb8>Sdcnv{pj#_#V|WPfaNUa6lx zed4Pva7>>rlz}5dkHzaj=xb(eFVnquPl!At(L9fmWRz%yB^r%MO0twVsF%TFu~s1~ z%<%4mg9EL6-RpMuW}|8^UAh$i-escRi%0W4l9G}hNdl`_NP(Rq8oYs#oguCHI9eND z-!YK>~~{3yD(u;4L^!}cIq5w}BA%}7(`ND+uhIt?2@4*WM} z{&}$H^y72ruV0U$4*B>T@#&RAA;d_VnPe^>^SvH<8`Ij+K}Amf{HtkSwo=K;BYwuq z8a5J6a9*Wk;e+L)!vfv>dZ+nbcqp-{sU0q=h{occR!T^vtMGsZ41FFxd{~F+NP?A) zzDUPSNf|dny*OAjJ=qix8X8J}D=0AV=g*((5EeJFk)z>Ll|=ZF$EKt~=%Pno!U_uo z(5*kdgs);p#8>hJBs5f21srD;ryHO1URf479af z7l+GwqUjOu&DRA#B^Y{RV`94d`bvC`4r8O4ag(SDmaypPuC6Yh^`1MBD);(I6|(-U zuj31f?0*_yx*ry4D$^%YzGUc`t$W#qSd&dJ?mE!O{3HUnq-kZmSy6p zozELnQc?i?Kyc87%3ZL3`gH5hpXc%%X=!QF($erx+;OBNB$SS8M55$aB5YHeY879W zdM>6jWoJ5ChMdHoOj^ zi6IrE3;(jZx{5pb15hl)kH3M(^U{TWhCAnVadLuXxDflSYmS2C*z{FiGK>JDyNAd1 zvysX<3-E#Y`JTr@%_7iu7vTmWECID>R+RmX@^Z}w4*(j%)oE}m4U|LPiA;F*b#!#V zo`vY^Lve6$oIfwi9jBZk+A}h;*JL1qNWNZ-%_u4=%FZUm5|IYCS?97yxRh2@oI>MT z_yq=fdmXlx#=`!_AL#Y(xP#DY1_t9JBke-3xY}A;%s&R6SXx?w+j5-ijFabpZZ=+dl z!*VOEKED=soU^kteBuFj-1Y0%o72P8=`SU;b1J9EBX@p;Urk9(4G0JzCMGr$9BQ?p z_x;X@`UHiZ)LQZlj+TKT1Se3;Y$l>wMRuca9bkqM(wJHq-3pxsmTJ{2PcyI1Wl>j0 zN5{g#0$$zR+>DJgR=qcWPi@U?B7{iGHZ5tb(Jb6+* z_gmY@F(a`xoZWOYl_}{((_porHmMj$;0Jk{EHd7sP8b!HEJNADgTIR6Q z{<2aZ6q8%GZdKS$)O&0#smL6xH<7Ukq-&5IYq}UMNyo~{%FLXcn8?V+)-^q49%*Eq zm6a8Kh7XNllxn36K+n`SbV=`7eF-~lS+-jreOpcrI)k>@n`=N*piDrf_hF&00FqTA2`Isb_R<~9I8C!(8ad!lprV=_)QOiWNLlTuY#sp_GADEgZ=i3aX?c{ zeEepI$V4GCr}hM)INDBhy3ij9U%;|oxiY`KI^9Yc&sc)>L&Zt(@GSfT8I%p9%1cXM z0=s2kNQjSz%uba4IXPKq-o;Acqu-N`!{JKIyP|rXGd3ezrj@XQ01&R=8ibT4s-5!y z_l~{wJv~xkdk2GP9{fs~k~`mkY%G6Zf$)^@Y&4fq zD91M!&P{WL3D&h9Z$4{ET6tBXlT!cPsMXY}>xsX?EMf!Yqt12pk%57Mqa$j>o(PeQ zLw$lX0)Qs3bSE;nefze&{Ij5&>l^0ty;;y8OapG52>LiwV&1Sbo1D!cb#`WUmh|}X zucpNoec5p@Us7@kBU}-9OmM2i(+eoy({^PJKD+Zd@VGn=3+qv$?(1Brp0P2h{g}44 zHUsaSnSzExsPXO{N!NY$r`bXplo5<{rlgD%qB>RSZnI42)=xAt@B8KzC+L%@$rE3^ zIK{@c3>OU8Qgzc=Bp!08yROOa^jBKt35GIYwFCy7wyn%V) zd=IxCj(A<64?E4H85k6F5`E^XLB!L3gk~@fVM4;mvlV;s4w794;2&c7z4L#-qeF$p zHvuxjJwUY^E_(uetV639cAu{=0wZq>XbDQnRz>-qf{MyS*%OAo?TrD$uGUt@jE>`o z@bjofM&k;txB2>2&uQsSpU(Pjd4fGhCEa^#?CF&-aw@9)4&HGh*DY3s%kE09rNvnx}dKrBg-@i_$4|9f_}*+sPRK`W&T zDb~+!eZ=9ur*s4CQrhRq$r7?9fSE8xwUE3@sp8*VkKAUJ|3tu50bsjX0JLZK{rmTD zNOk4;{{H^G1pZVpM^du6XHbh|JhxY#U%K~3eg3^pNpVRDP~1Uka#3PzlL0%5R^sg_ z;Ayy<(C~1SR4)$7%4?S|UltYJ-kD36asK`C z+NWcq41xi5Xv}s+O3Jz6S^G=M?K<_h^oKT2PP`^sdcaGIob5~<86FnLzqMwl*&91_ zXVE&3q8z5g`mLo`7K9); ze;&mub@tpjs~OQIQg+nfHPhfjyKDzG2^Tzms6^BCb#QR-a{b;1XvqkiZytm%qP1^zGr{ z;n%M(%sOXtDexzR1P243{-9g-4s;XXSlQwC>C0Rehw*r;J9qB52qUa01p~ZfF^qJb z8a7q>oo$Q0fMcK`_4f7x>Yx7cL;e2!`}+Exn|PhRX#k#(Y2$101>@2@-Y3pz@i7-4L9uO_M6Bndz&cODEYeTyI2<418 zfzIiBpryq_9|mV{Zf*v!RP%Hh^fE}U>q0_|HRss@$?a}$3)nV;EHMXN9zYcQa%ze_ zPC-gi5(+7-=g?3&JABmA#zr&mJ9iwYWf=e?p;MKYm%|Uaxw-G&h0zvcI?ncWJauxS z1k`{;uB@(N#hrgcBRJUK2chASiOCjz2=(}5WJH9Mlhe1yLV+=#KYuo9i2}Y8@mu(q zHWJ$ee|A-?*htd5XvhhXbj{>;dI+d5H*emAF7D-3r;w%2MGs0Pd@rN|v{ul}vX}WI z0jC1S9w~rE4*|ec?!rkF|L2{xx#P$D0E5e(r~N00MDywVg66i-uZPaC6MaI=Xx&QL zTo}uA`!x3!@)Q!pW5vrasJgS^#sIkH<^sNgzhQ@fbXul6*59A4nTMUek)aBU=LA^L z#f1(Xbx!OfWsal*p!I)1WvHHjKHwFQH-IDx3P(rBH4s+d{ZF5=iP)s93Z?Ck`NQ&* zmX_wEd%Kem-&0cZS}YrY9w6zzKvF1eN@^N>GO(@V7y**X^EP$tv%vUdliC3fa&0wsK-7xkrzFq=-2VMt%J7%7GYRrw$5Kx%J3k)FV5b zvz^r)W33g-V+cFC=$21fGbX1#s1pAdWdC27zdkU##=9T}NxA*u7*V6N0U3aaiHUF` zf~X@p|CKWx$~|ZfR%C+6+2%}&GrUF;w0nMSQl@7kgEuBrdxe14VUuTJ{jXK@e19wi z8wUc{;SXzPP$0rcDV`d2c-jnoo_1x&lQo)?o*ekfj%U3#?-}wSbVm2kkPh#eaJdV! zXT0$?ya-Nh85BLF>(8I>4eEwPTZB=>x70Q^HZs@FMyS0Vz1cl7QUkyT0LQ@;jSpkw zMxMqyKog)>&HfEQ(!0CvaSFGPLqNp#mK!E|dYVQHD*lE4MHrY$UdCpAGZLUh|J6iG zI0QI3IYs`)EPo)-7{Ekyp@CH_1+XI&vWSR?K8<=JqR<#wOrfBL&AnWWcUY7;0PE;u zev^LDDp~3}kgCh$bx^RO&O)_?^0vFX3l|1uRyq>Ecx_!BcH~?5mmk~PuCqvc*q#vf z_Qp0&SO1;$?bx(^T<)eMz4<>=^B?JWHnMp;n2?}gGh}Aogk}H!8_E$xe}6w9eDE_g z2ru)){qJ?wW|M8JtEzVX1_-f)no2?H|>OMcB|G7V=+_U07!ca=<&ClKpE+N)O!GWcx-7+)%wK?{Lf z1Ld{Yto^4$m3r=bkPX~7-oX#KxfvEo7K&;w_4(69?JuzZ48K}$=i&l&7Sz#~UrjI8 zs39~>a0HajRJs}?cvD~hoZzQco0nsbFdzbr6tF1peL*ZPZQSIKt0Yk9I0aA&Pq3rR zJB7L~LV@Dr;{yd18UQHmz>tL5f7UG5OE~|g?*lmlx~EE_06Q-)uaJ-syk59~=8n^K z(?jr@r!hgz^urki;so9SE$tm2uebdEZn`Bpxf4G>FJ?C>3sm&(-LJ51xw*L$cf7s5 zq3r+xB`}g|T_dCOYmxnobIXJ{0{4e$PL+P6nc4QeepT_?w{M|Z0k){E)z47%++S@0 zN~*~0Co2H%Kw)7a{5~-;v9(n`MSz(3nk=RgAhf-Gkp*UDV}pu<;wDBQ1h)cPV9y!E z)rg3QA3q+gg(#;<4vmhUV`9RBXbrp#;`HfDXTtN@IC55Z_Tk$gKph_yeUUv65(do6H6?jRjt!H5||N2%q^l*Z6q*}GS zT+$`2SM(?dgv8}cV9EffG^s5jUU6}Y6Jpp2qoXqfoC}cm1Hc_1VIS;mp&Cp=pFJbc zT2oU~D2*?#+)s3LKxC3({rFlbvqkS$8TuS-fZJ1^xm|HHguweAC-U4?R+e_bC+hRF z#m3YWMz4+b%@}bPxM!SC+}^C>STrR+ve}na;L0_st=5*wy))5wJ@@xCJf@yA29nHjS95D1bWi#G4Fe z|4@owexN9`m1MOA!bf1MhglZ8Kq{f<;%^^+KUnW2AxJFHtV}rZ<-j-D*~PudaD6~F zx>6+)5)z(*sk5|XQ)eLK_Q%xZ$W;KuSCV)W-Z%C# zw_E?EhIw66GNmHDLo#>l zedvqys^z>crd;WOSwJMy%;V7Yrc>QWjXXsx>xB#bKZVc~&<6IdA`mC<5@rGPtNwfr zJ#`SNb=>HLDQPB%d*>uw1+HC-ef<_tJHRP|&}oh966A_&yA^&05Gu*>k@A3Jow67Kt$$JTN6M|4opS$6YiG;CXvUGK zmGUz+_ZB>(`|9dYaTKG49HC&fcXiQFQYzlNH&S9wL)kPv1c+2a4~nH3Rr zNB{3BqgdGMM7>ApVvfPP-(TGWk4OuJ!GX>R7`d=;1=>g^+q`TH(;*)xXGpo5erTUV zyzNP?a<9)7k9|E(Q;_(Bi~^0BTEcSV%aV6RgF(yb%mk)vApSs@ra`rSPWwpzLHdbo zl3t<3rKRzqp|3d5KYuSR)i1XNp{G`+o{NNoOrPeoa|6Nf7uI_U-WTJUZOIU5_>DD|@&eWmD(w@@(o_@Ip20NDU= zefREN1%)=R5zb4OSft#AL`4VN?ER_Gn8H#2;}pXqBMJNuhr7FJ>FA!Prh0+@C2gHp zLJ30&d7Al;X7SJxK+J0N&QgS_v5VW6`@Rx$8&fQry80B%=T4{ukeiaT>(xNt#K z)O8a-1jU`5oxQ242|8mon<}&@i(QlZ;86gtfo#?Bc+nWlj7&rpuv(#Y&%yw*7+D}VLNfA(H zZLOrFa z5!`Av?yZ2ywH>JZ5RiMn)?zgCtRFvq3l;aT!$ThQ8qg730IV9IoBaHa^|7qjzsAke zy*PM`5Xs5O06N3J1jfLK1vn{Cc>QG0)05x2a5BBiJljn&4IBj7^RKwVTBfmwy#d)4 zp9)HK`PKryjgK1u@#~uh)xqO$z!KDeQt9q44tp5FJ4-VUYz-{&pZYESm+~9{7{7ma z2B8>|1)81b@7$a-{QAG9rcTn+fA(|~O&QQRPb+up)JUs0eP2rIVLwk){Mz%=}6TbjBx7p4`9xLLm#Rr2E`)z>>kn%FkEI*F?1hpfd~Y#Y1(3S9rtR9Qca_YBV)91&2#Z(l(=_(-x9z zG$d73RRB2&54wXP%sCycyWDO)KoBIA;e6Wp*^ZSNf}$9u0qJ_RCf zL14vwAUOBUgH8b?1suJF4d`@kY}WftY$fNHwP3odYfeH`6d8nu6{kf)e}M=@v#-sL z2``S5B>NL*8YGW^&WuYvElk2!TqVOQ}*G@rzufoC)o09{6kJ znFvPErJ8v)Y^Y<}XTa~mNRT560gIZPsplj6UvqI*_P}h5@=w0k$m%*bjoJJ*G6r<~ zMW9_m?v{Tlv;Yzeo)QN~;G!&^3}(o*mtkBk;E@+$T(0`YwYsRe$w|AlS*7xTB8%h4 zkBg^Lx6C2Y1P*Y?6eW1+aXY3t7c6u5bpIsz{!?Nce*0>xeC4KD>eSW># zkI7>!@WiRXFrvN3M&*Tn=hhk{>Y|*UJ_Tt`F-a&F>)Y$6~2;$DD(h=57KMIj}_Du-Kt{oMMkaSxfJeQ+;~BqTSX__2sNa0m)Mr~Ly& zrjR9y1zmtLe*&X;ttt77gcF!|)()JU^#djEXgm7INIII6gQIZE%s1c8(eYv+2`Q;J zK=b!Yf*zRR1-etGbjGHHn@BxaHr3dKD+!nUkc}`$sKnni@K`9}sv(%fnziwPDTLku1t<%zflJQ4J3JzZUKm?i>p;o;^6(gaj?7>$IQTvW^h<56EhjsVk~ z#`y+C1$bnyOH1kN=n;+2U<(^viM(9`^8=vjLVC&^%&TOlJAwZJV}shEzmE==k64Ya zjEtT^Ae3ciW+TAi+n!7JIV?EZEdXM_c^9BU#(p6W!=_vCkP$N~jQoywbSQJ5X%{<#8X}s)-mXXmb+4HWj3860W8kPelgeG_8 zN@!y096TuRsUU{tXmANvp~+oVNqeu#6i~s4^x}wxWo+2JQ`NXZEzlcZ4gW{0yoLFh6{KZ7k3>H6?lr!5^RTxzx*+S{JwRe z2So5a$pVF}BzV)|!5(PyE}-XFkCZ=qhRoNLNU<(TxfDz6dmT(9Sm+X#AgR}W7h$&Y zvSOmZV^lyBEi*Guth}zC9##yR641KUA75|{P;&!gfPW_?olVMy)^&m%wEXz1do>dW z$~k@5PUCDtx0%!ER$vgfE%kQaPdFvrKmuE?;BY|b$s%FsDil)XknhSBCS^KdMoOST z#(*~zFH?ZrytSpGqQaITf7J02xfgDl$c#K_aFFzB&{$yR=-i>Dk`fFRtZSSN zk8QLqT#q6OR^*Ngle;h-@(?@`mGp;06G1~DkSYccNmofX7H2!cFa}WZChH8oL!8v( zpNMi_+G4jg3@2v}P@~?419|tEwm2AU0RaO%C@Km?u52!jz?2<1B_$;ll^5IqZ|LXB z%6WIioQ`xBUca@`l#?thkda<9ZKwONP;%D`E=97_B9ZJc)=;;tH{rR~@k-@diWyU> znM`fDogS~qek;*?69A9x@q8ZOb^yqihqFUB}bif2^Iwa6E zA%i+4mJ>hR$xsEdHQ$$$Eb|4@>1eZ}0gCBSwZn{pfU%vB! zFh?NJx3{%y&dsINM;c%ZdIzl66{S8PS>_+g@XMoxJy1%3Z^JkxHvGHoSoN3ED?B_f z`##~l$JeKruentr+^%<)G8nR{;b76$oxs&au3y)o3$u^2r-?Nvv86o2#DUfFVHJq@=dFHJFKOcrw60yVwvE zOFVe2ugzM35uo#9{5as!`<|YjFslNSLG!0AahY5BqwaOyP?u?>*1LhKfM~4G?*qPH zVhHFdERgqS&cKjp1#mf{evDf?EQ?CI^jKfteg1@oy``FXxktL&41BsAXTndNI)$}8 zyX)anNU|gf|8qs-CDE>b9c=p#Q*Qq_IHHkj^tY)N9A^Lr1#$P5vfKx>k^lbyQ>%u? literal 0 HcmV?d00001 diff --git a/docs/reference/gobject/tmpl/enumerations_flags.sgml b/docs/reference/gobject/tmpl/enumerations_flags.sgml new file mode 100644 index 0000000..95222eb --- /dev/null +++ b/docs/reference/gobject/tmpl/enumerations_flags.sgml @@ -0,0 +1,240 @@ + +Enumeration and Flag Types + + + + + + + + + + + + + + + + + + + + + + + + +@g_type_class: +@minimum: +@maximum: +@n_values: +@values: + + + + + + +@g_type_class: +@mask: +@n_values: +@values: + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@type: + + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@type: + + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@value: +@value_name: +@value_nick: + + + + + + +@value: +@value_name: +@value_nick: + + + + + + +@enum_class: +@value: +@Returns: + + + + + + + +@enum_class: +@name: +@Returns: + + + + + + + +@enum_class: +@nick: +@Returns: + + + + + + + +@flags_class: +@value: +@Returns: + + + + + + + +@flags_class: +@name: +@Returns: + + + + + + + +@flags_class: +@nick: +@Returns: + + + + + + + +@name: +@const_static_values: +@Returns: + + + + + + + +@name: +@const_static_values: +@Returns: + + + + + + + +@g_enum_type: +@info: +@const_values: + + + + + + + +@g_flags_type: +@info: +@const_values: + + diff --git a/docs/reference/gobject/tmpl/gboxed.sgml b/docs/reference/gobject/tmpl/gboxed.sgml new file mode 100644 index 0000000..75d286c --- /dev/null +++ b/docs/reference/gobject/tmpl/gboxed.sgml @@ -0,0 +1,153 @@ + +Boxed Types + + + + + + + + + + + + + + + + + + + + + + + + +@boxed: +@Returns: + + + + + + + +@boxed: + + + + + + + +@boxed_type: +@src_boxed: +@Returns: + + + + + + + +@boxed_type: +@boxed: + + + + + + + +@name: +@boxed_copy: +@boxed_free: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gobject/tmpl/gclosure.sgml b/docs/reference/gobject/tmpl/gclosure.sgml new file mode 100644 index 0000000..64ac123 --- /dev/null +++ b/docs/reference/gobject/tmpl/gclosure.sgml @@ -0,0 +1,573 @@ + +Closures + + + + + + + + + + + + + + + + + + + + + + + + +@closure: + + + + + + + +@cl: + + + + + + + +@cclosure: + + + + + + + +@f: + + + + + + + + + + + + + + +@in_marshal: +@is_invalid: + + + + + + + + + + + + + +@closure: +@callback: + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@data: +@closure: + + + + + + + +@callback_func: +@user_data: +@destroy_data: +@Returns: + + + + + + + +@callback_func: +@user_data: +@destroy_data: +@Returns: + + + + + + + +@callback_func: +@object: +@Returns: + + + + + + + +@callback_func: +@object: +@Returns: + + + + + + + +@sizeof_closure: +@object: +@Returns: + + + + + + + +@closure: +@Returns: + + + + + + + +@closure: + + + + + + + +@closure: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: + + + + + + + +@closure: + + + + + + + +@closure: +@notify_data: +@notify_func: + + + + + + + +@closure: +@notify_data: +@notify_func: + + + + + + + +@closure: +@notify_data: +@notify_func: + + + + + + + +@closure: +@notify_data: +@notify_func: + + + + + + + +@sizeof_closure: +@data: +@Returns: + + + + + + + +@closure: +@marshal: + + + + + + + +@closure: +@pre_marshal_data: +@pre_marshal_notify: +@post_marshal_data: +@post_marshal_notify: + + + + + + + +@closure: +@marshal_data: +@meta_marshal: + + + + + + + +@source: +@closure: + + + + + + + + + + + + + + + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + +@closure: +@return_value: +@n_param_values: +@param_values: +@invocation_hint: +@marshal_data: + + + + + + + + + diff --git a/docs/reference/gobject/tmpl/generic_values.sgml b/docs/reference/gobject/tmpl/generic_values.sgml new file mode 100644 index 0000000..9b525c6 --- /dev/null +++ b/docs/reference/gobject/tmpl/generic_values.sgml @@ -0,0 +1,211 @@ + +Generic values + + + + + + + + + + + + + + + + + + + + + + + + +@value: +@type: + + + + + + + +@value: + + + + + + + +@value: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@value: + + + + + + + + + + + + + + + + + + + + + + + + + + + +@value: +@g_type: +@Returns: + + + + + + + +@src_value: +@dest_value: + + + + + + + +@value: +@Returns: + + + + + + + +@value: + + + + + + + +@value: +@instance: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@src_type: +@dest_type: +@Returns: + + + + + + + +@src_type: +@dest_type: +@Returns: + + + + + + + +@src_value: +@dest_value: +@Returns: + + + + + + + +@src_value: +@dest_value: + + + + + + + +@src_type: +@dest_type: +@transform_func: + + + + + + + +@value: +@Returns: + + diff --git a/docs/reference/gobject/tmpl/gobject-unused.sgml b/docs/reference/gobject/tmpl/gobject-unused.sgml new file mode 100644 index 0000000..a2c641f --- /dev/null +++ b/docs/reference/gobject/tmpl/gobject-unused.sgml @@ -0,0 +1,96 @@ + + +The predefined identifiers of the reserved fundamental types. + + +@G_TYPE_INVALID: Usually a return value indicating an error. +@G_TYPE_NONE: A synonym for the "void" type in C. +@G_TYPE_INTERFACE: Root type of all interface types. +@G_TYPE_CHAR: Identifier for the built-in type "gchar". +@G_TYPE_UCHAR: Identifier for the built-in type "guchar". +@G_TYPE_BOOLEAN: Identifier for the built-in type "gboolean". +@G_TYPE_INT: Identifier for the built-in type "gint". +@G_TYPE_UINT: Identifier for the built-in type "guint". +@G_TYPE_LONG: Identifier for the built-in type "glong". +@G_TYPE_ULONG: Identifier for the built-in type "gulong". +@G_TYPE_INT64: +@G_TYPE_UINT64: +@G_TYPE_ENUM: Identifier for the "#GEnum" type. +@G_TYPE_FLAGS: Identifier for the "#GFlags" type. +@G_TYPE_FLOAT: Identifier for the built-in type "gfloat". +@G_TYPE_DOUBLE: Identifier for the built-in type "gdouble". +@G_TYPE_STRING: Identifier for a pointer to a null-terminated string "gchar*". +@G_TYPE_POINTER: Identifier for anonymous pointers "void*". +@G_TYPE_BOXED: Identifier for the "#GBoxed" type. +@G_TYPE_PARAM: Identifier for the "#GParam" type. +@G_TYPE_OBJECT: Identifier for the "#GObject" type. +@G_TYPE_RESERVED_BSE_FIRST: First fundamental type ID reserved for BSE. +@G_TYPE_RESERVED_BSE_LAST: Last fundamental type ID reserved for BSE. +@G_TYPE_RESERVED_LAST_FUNDAMENTAL: +@G_TYPE_CONSTANT_TYPES: +@G_TYPE_CLOSURE: +@G_TYPE_VALUE: +@G_TYPE_VALUE_ARRAY: +@G_TYPE_GSTRING: +@G_TYPE_PARAM_CHAR: +@G_TYPE_PARAM_UCHAR: +@G_TYPE_PARAM_BOOLEAN: +@G_TYPE_PARAM_INT: +@G_TYPE_PARAM_UINT: +@G_TYPE_PARAM_LONG: +@G_TYPE_PARAM_ULONG: +@G_TYPE_PARAM_INT64: +@G_TYPE_PARAM_UINT64: +@G_TYPE_PARAM_UNICHAR: +@G_TYPE_PARAM_ENUM: +@G_TYPE_PARAM_FLAGS: +@G_TYPE_PARAM_FLOAT: +@G_TYPE_PARAM_DOUBLE: +@G_TYPE_PARAM_STRING: +@G_TYPE_PARAM_PARAM: +@G_TYPE_PARAM_BOXED: +@G_TYPE_PARAM_POINTER: +@G_TYPE_PARAM_VALUE_ARRAY: +@G_TYPE_PARAM_CLOSURE: +@G_TYPE_PARAM_OBJECT: + + + +Determines whether a given set of #GTypeFlags and #GTypeFundamentalFlags +are set for @type. + + +@type: The type to check for flags. +@flags: Bitwise combination of #GTypeFlags and #GTypeFundamentalFlags. +@Returns: #TRUE if all @flags are set for @type, #FALSE otherwise. + + + + + + +@klass: +@private_type: +@Returns: + + + +Determines if @instance adheres to the interface exported +by @iface_type. @iface_type is either a type that @instance +is derived from, or an interface type that is supported by +the anchestry of @instance. + + +@instance: A valid #GTypeInstance structure. +@iface_type: A #GType value. +@Returns: #TRUE if @instance conforms to @iface_type, #FALSE otherwise. + + + +Determines if @value is a #GValue whose type conforms to @type. + + +@value: A valid #GValue structure. +@type: A #GType value. +@Returns: #TRUE if @value is a #GValue of @type or #FALSE if not. + diff --git a/docs/reference/gobject/tmpl/gparamspec.sgml b/docs/reference/gobject/tmpl/gparamspec.sgml new file mode 100644 index 0000000..55becfa --- /dev/null +++ b/docs/reference/gobject/tmpl/gparamspec.sgml @@ -0,0 +1,426 @@ + +GParamSpec + + + + + + + + + + + + + + + + + + + + + + + + +@type: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@pclass: + + + + + + + +@pclass: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@g_type_instance: +@name: +@flags: +@value_type: +@owner_type: + + + + + + +@g_type_class: +@value_type: +@finalize: +@value_set_default: +@value_validate: +@values_cmp: + + + + + + +@G_PARAM_READABLE: +@G_PARAM_WRITABLE: +@G_PARAM_CONSTRUCT: +@G_PARAM_CONSTRUCT_ONLY: +@G_PARAM_LAX_VALIDATION: +@G_PARAM_STATIC_NAME: +@G_PARAM_PRIVATE: +@G_PARAM_STATIC_NICK: +@G_PARAM_STATIC_BLURB: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@pspec: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@pspec: +@Returns: + + + + + + + +@pspec: +@value: + + + + + + + +@pspec: +@value: +@Returns: + + + + + + + +@pspec: +@value: +@Returns: + + + + + + + +@pspec: +@src_value: +@dest_value: +@strict_validation: +@Returns: + + + + + + + +@pspec: +@value1: +@value2: +@Returns: + + + + + + + +@pspec: +@Returns: + + + + + + + +@pspec: +@Returns: + + + + + + + +@pspec: +@Returns: + + + + + + + +@pspec: +@quark: +@Returns: + + + + + + + +@pspec: +@quark: +@data: + + + + + + + +@pspec: +@quark: +@data: +@destroy: + + + + + + + +@pspec: +@quark: +@Returns: + + + + + + + +@pspec: +@Returns: + + + + + + + +@param_type: +@name: +@nick: +@blurb: +@flags: +@Returns: + + + + + + + +@instance_size: +@n_preallocs: +@instance_init: +@value_type: +@finalize: +@value_set_default: +@value_validate: +@values_cmp: + + + + + + +@name: +@pspec_info: +@Returns: + + + + + + + + + + + + + +@type_prefixing: +@Returns: + + + + + + + +@pool: +@pspec: +@owner_type: + + + + + + + +@pool: +@pspec: + + + + + + + +@pool: +@param_name: +@owner_type: +@walk_ancestors: +@Returns: + + + + + + + +@pool: +@owner_type: +@n_pspecs_p: +@Returns: + + + + + + + +@pool: +@owner_type: +@Returns: + + diff --git a/docs/reference/gobject/tmpl/gtype.sgml b/docs/reference/gobject/tmpl/gtype.sgml new file mode 100644 index 0000000..9654798 --- /dev/null +++ b/docs/reference/gobject/tmpl/gtype.sgml @@ -0,0 +1,1142 @@ + +Type Information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@type: + + + + + + + + + + + + + + +@x: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + +@type: + + + + + + + + + + + + + + + + + + + + + + + + + +@class_size: +@base_init: +@base_finalize: +@class_init: +@class_finalize: +@class_data: +@instance_size: +@n_preallocs: +@instance_init: +@value_table: + + + + + + +@type_flags: + + + + + + +@interface_init: +@interface_finalize: +@interface_data: + + + + + + +@value_init: +@value_free: +@value_copy: +@value_peek_pointer: +@collect_format: +@collect_value: +@lcopy_format: +@lcopy_value: + + + + + + +@instance: + + + + + + + +@g_class: + + + + + + + +@g_iface: + + + + + + + +@instance: +@g_type: +@c_type: + + + + + + + +@instance: +@g_type: +@c_type: + + + + + + + +@instance: +@g_type: +@c_type: + + + + + + + +@instance: + + + + + + + +@instance: +@g_type: +@c_type: + + + + + + + +@instance: +@g_type: + + + + + + + +@g_class: +@g_type: +@c_type: + + + + + + + +@g_class: +@g_type: + + + + + + + +@value: + + + + + + + +@value: +@g_type: + + + + + + + + + + + + + + + + + + + + + +@G_TYPE_DEBUG_NONE: +@G_TYPE_DEBUG_OBJECTS: +@G_TYPE_DEBUG_SIGNALS: +@G_TYPE_DEBUG_MASK: + + + + + + +@debug_flags: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@name: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@leaf_type: +@root_type: +@Returns: + + + + + + + +@type: +@is_a_type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@g_class: + + + + + + + +@g_class: +@Returns: + + + + + + + +@g_class: +@private_size: + + + + + + + +@class_type: +@private_size: + + + + + + + +@instance_class: +@iface_type: +@Returns: + + + + + + + +@g_iface: +@Returns: + + + + + + + +@g_type: +@Returns: + + + + + + + +@g_type: +@Returns: + + + + + + + +@g_iface: + + + + + + + +@type: +@n_children: +@Returns: + + + + + + + +@type: +@n_interfaces: +@Returns: + + + + + + + +@interface_type: +@n_prerequisites: +@Returns: + + + + + + + +@type: +@quark: +@data: + + + + + + + +@type: +@quark: +@Returns: + + + + + + + +@type: +@query: + + + + + + + +@type: +@type_name: +@class_size: +@instance_size: + + + + + + +@g_class: + + + + + + + +@g_class: + + + + + + + +@g_class: +@class_data: + + + + + + + +@g_class: +@class_data: + + + + + + + +@instance: +@g_class: + + + + + + + +@g_iface: +@iface_data: + + + + + + + +@g_iface: +@iface_data: + + + + + + + +@cache_data: +@g_class: +@Returns: + + + + + + + +@G_TYPE_FLAG_ABSTRACT: +@G_TYPE_FLAG_VALUE_ABSTRACT: + + + + + + +@G_TYPE_FLAG_CLASSED: +@G_TYPE_FLAG_INSTANTIATABLE: +@G_TYPE_FLAG_DERIVABLE: +@G_TYPE_FLAG_DEEP_DERIVABLE: + + + + + + +@parent_type: +@type_name: +@info: +@flags: +@Returns: + + + + + + + +@parent_type: +@type_name: +@class_size: +@class_init: +@instance_size: +@instance_init: +@flags: +@Returns: + + + + + + + +@parent_type: +@type_name: +@plugin: +@flags: +@Returns: + + + + + + + +@type_id: +@type_name: +@info: +@finfo: +@flags: +@Returns: + + + + + + + +@instance_type: +@interface_type: +@info: + + + + + + + +@instance_type: +@interface_type: +@plugin: + + + + + + + +@interface_type: +@prerequisite_type: + + + + + + + +@type: +@Returns: + + + + + + + +@instance_type: +@interface_type: +@Returns: + + + + + + + +@Returns: + + + + + + + +@type_id: +@Returns: + + + + + + + +@type: +@Returns: + + + + + + + +@instance: + + + + + + + +@cache_data: +@cache_func: + + + + + + + +@cache_data: +@cache_func: + + + + + + + +@g_class: + + + + + + + +@check_data: +@check_func: + + + + + + + +@check_data: +@check_func: + + + + + + + +@check_data: +@g_iface: + + + + + + + +@type: +@Returns: + + + + + + + +@TN: +@t_n: +@T_P: + + + + + + + +@TN: +@t_n: +@T_P: +@_C_: + + + + + + + +@TN: +@t_n: +@T_P: + + + + + + + +@TN: +@t_n: +@T_P: +@_C_: + + + + + + + +@TN: +@t_n: +@T_P: + + + + + + + +@TN: +@t_n: +@T_P: +@_C_: + + + + + + + +@TYPE_IFACE: +@iface_init: + + + + + + + +@TN: +@t_n: +@T_P: +@_f_: +@_C_: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/gobject/tmpl/gtypemodule.sgml b/docs/reference/gobject/tmpl/gtypemodule.sgml new file mode 100644 index 0000000..915ee41 --- /dev/null +++ b/docs/reference/gobject/tmpl/gtypemodule.sgml @@ -0,0 +1,140 @@ + +GTypeModule + + + + + + + + + + + + + + + + + + + + + + + + +@name: + + + + + + +@parent_class: +@load: +@unload: + + + + + + +@module: +@Returns: + + + + + + + +@module: + + + + + + + +@module: +@name: + + + + + + + +@module: +@parent_type: +@type_name: +@type_info: +@flags: +@Returns: + + + + + + + +@module: +@instance_type: +@interface_type: +@interface_info: + + + + + + + +@module: +@name: +@const_static_values: +@Returns: + + + + + + + +@module: +@name: +@const_static_values: +@Returns: + + + + + + + +@TN: +@t_n: +@T_P: + + + + + + + +@TypeName: +@type_name: +@TYPE_PARENT: +@flags: +@CODE: + + + + + + + +@TYPE_IFACE: +@iface_init: + + diff --git a/docs/reference/gobject/tmpl/gtypeplugin.sgml b/docs/reference/gobject/tmpl/gtypeplugin.sgml new file mode 100644 index 0000000..2da1fc8 --- /dev/null +++ b/docs/reference/gobject/tmpl/gtypeplugin.sgml @@ -0,0 +1,113 @@ + +GTypePlugin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@use_plugin: +@unuse_plugin: +@complete_type_info: +@complete_interface_info: + + + + + + +@plugin: + + + + + + + +@plugin: + + + + + + + +@plugin: +@g_type: +@info: +@value_table: + + + + + + + +@plugin: +@instance_type: +@interface_type: +@info: + + + + + + + +@plugin: + + + + + + + +@plugin: + + + + + + + +@plugin: +@g_type: +@info: +@value_table: + + + + + + + +@plugin: +@instance_type: +@interface_type: +@info: + + diff --git a/docs/reference/gobject/tmpl/objects.sgml b/docs/reference/gobject/tmpl/objects.sgml new file mode 100644 index 0000000..ac08291 --- /dev/null +++ b/docs/reference/gobject/tmpl/objects.sgml @@ -0,0 +1,632 @@ + +The Base Object Type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@gobject: the object which received the signal. +@arg1: + + + + + + +@g_type_class: +@constructor: +@set_property: +@get_property: +@dispose: +@finalize: +@dispatch_properties_changed: +@notify: +@constructed: + + + + + + +@pspec: +@value: + + + + + + +@object: +@property_id: +@value: +@pspec: + + + + + + + +@object: +@property_id: +@value: +@pspec: + + + + + + + +@object: + + + + + + + +@type: + + + + + + + +@object: + + + + + + + +@object: + + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@object: + + + + + + + +@object: + + + + + + + +@object: + + + + + + + +@class: + + + + + + + +@class: + + + + + + + +@oclass: +@property_id: +@pspec: + + + + + + + +@oclass: +@property_name: +@Returns: + + + + + + + +@oclass: +@n_properties: +@Returns: + + + + + + + +@oclass: +@property_id: +@name: + + + + + + + +@g_iface: +@pspec: + + + + + + + +@g_iface: +@property_name: +@Returns: + + + + + + + +@g_iface: +@n_properties_p: +@Returns: + + + + + + + +@object_type: +@first_property_name: +@Varargs: +@Returns: + + + + + + + +@object_type: +@n_parameters: +@parameters: +@Returns: + + + + + + + +@name: +@value: + + + + + + +@object: +@Returns: + + + + + + + +@object: + + + + + + + +@object: +@Returns: + + + + + + + + + + + + + + + + + + + + + + + + + + +@object: +@Returns: + + + + + + + +@object: + + + + + + + +@data: +@where_the_object_was: + + + + + + + +@object: +@notify: +@data: + + + + + + + +@object: +@notify: +@data: + + + + + + + +@object: +@weak_pointer_location: + + + + + + + +@object: +@weak_pointer_location: + + + + + + + +@data: +@object: +@is_last_ref: + + + + + + + +@object: +@notify: +@data: + + + + + + + +@object: +@notify: +@data: + + + + + + + +@object: +@signal_spec: +@Varargs: +@Returns: + + + + + + + +@object: +@signal_spec: +@Varargs: + + + + + + + +@object: +@first_property_name: +@Varargs: + + + + + + + +@object: +@first_property_name: +@Varargs: + + + + + + + +@object: +@property_name: + + + + + + + +@object: + + + + + + + +@object: + + + + + + + +@object: +@key: +@Returns: + + + + + + + +@object: +@key: +@data: + + + + + + + +@object: +@key: +@data: +@destroy: + + + + + + + +@object: +@key: +@Returns: + + + + + + + +@object: +@quark: +@Returns: + + + + + + + +@object: +@quark: +@data: + + + + + + + +@object: +@quark: +@data: +@destroy: + + + + + + + +@object: +@quark: +@Returns: + + + + + + + +@object: +@property_name: +@value: + + + + + + + +@object: +@property_name: +@value: + + + + + + + +@object_type: +@first_property_name: +@var_args: +@Returns: + + + + + + + +@object: +@first_property_name: +@var_args: + + + + + + + +@object: +@first_property_name: +@var_args: + + + + + + + +@object: +@closure: + + + + + + + +@object: + + + + + + + +@object: +@property_id: +@pspec: + + diff --git a/docs/reference/gobject/tmpl/param_value_types.sgml b/docs/reference/gobject/tmpl/param_value_types.sgml new file mode 100644 index 0000000..681f73c --- /dev/null +++ b/docs/reference/gobject/tmpl/param_value_types.sgml @@ -0,0 +1,1657 @@ + +Standard Parameter and Value Types + + + + + + + + + + + + + + + + + + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_boolean: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_char: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_uchar: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_int: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_uint: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_long: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_ulong: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_int64: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_uint64: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: +@epsilon: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_float: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@minimum: +@maximum: +@default_value: +@epsilon: + + + + + + +@name: +@nick: +@blurb: +@minimum: +@maximum: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_double: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@enum_class: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@enum_type: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_enum: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@flags_class: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@flags_type: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_flags: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@default_value: +@cset_first: +@cset_nth: +@substitutor: +@null_fold_if_empty: +@ensure_non_null: + + + + + + + + + + + + +@name: +@nick: +@blurb: +@default_value: +@flags: +@Returns: + + + + + + + +@value: +@v_string: + + + + + + + +@value: +@v_string: + + + + + + + +@value: +@v_string: + + + + + + + +@value: +@v_string: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: + + + + + + +@name: +@nick: +@blurb: +@param_type: +@flags: +@Returns: + + + + + + + +@value: +@param: + + + + + + + +@value: +@param: + + + + + + + +@value: +@param: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: + + + + + + +@name: +@nick: +@blurb: +@boxed_type: +@flags: +@Returns: + + + + + + + +@value: +@v_boxed: + + + + + + + +@value: +@v_boxed: + + + + + + + +@value: +@v_boxed: + + + + + + + +@value: +@v_boxed: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: + + + + + + +@name: +@nick: +@blurb: +@flags: +@Returns: + + + + + + + +@value: +@v_pointer: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: + + + + + + +@name: +@nick: +@blurb: +@object_type: +@flags: +@Returns: + + + + + + + +@value: +@v_object: + + + + + + + +@value: +@v_object: + + + + + + + +@value: +@v_object: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + + + + + + + + +@parent_instance: +@default_value: + + + + + + +@name: +@nick: +@blurb: +@default_value: +@flags: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + + + + + + + + +@parent_instance: +@element_spec: +@fixed_n_elements: + + + + + + +@name: +@nick: +@blurb: +@element_spec: +@flags: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + + + + + + + + + + + + + + +@name: +@overridden: +@Returns: + + + + + + + +@pspec: + + + + + + + +@pspec: + + + + + + + +@value: + + + + + + + + + + + + + + +@parent_instance: +@is_a_type: + + + + + + +@name: +@nick: +@blurb: +@is_a_type: +@flags: +@Returns: + + + + + + + +@value: +@Returns: + + + + + + + +@value: +@v_gtype: + + diff --git a/docs/reference/gobject/tmpl/signals.sgml b/docs/reference/gobject/tmpl/signals.sgml new file mode 100644 index 0000000..be90c3b --- /dev/null +++ b/docs/reference/gobject/tmpl/signals.sgml @@ -0,0 +1,627 @@ + +Signals + + + + + + + + + + + + + + + + + + + + + + + + +@signal_id: +@detail: +@run_type: + + + + + + +@ihint: +@return_accu: +@handler_return: +@data: +@Returns: + + + + + + + + + + + + + +@ihint: +@n_param_values: +@param_values: +@data: +@Returns: + + + + + + + +@G_SIGNAL_RUN_FIRST: +@G_SIGNAL_RUN_LAST: +@G_SIGNAL_RUN_CLEANUP: +@G_SIGNAL_NO_RECURSE: +@G_SIGNAL_DETAILED: +@G_SIGNAL_ACTION: +@G_SIGNAL_NO_HOOKS: + + + + + + +@G_SIGNAL_MATCH_ID: +@G_SIGNAL_MATCH_DETAIL: +@G_SIGNAL_MATCH_CLOSURE: +@G_SIGNAL_MATCH_FUNC: +@G_SIGNAL_MATCH_DATA: +@G_SIGNAL_MATCH_UNBLOCKED: + + + + + + +@signal_id: +@signal_name: +@itype: +@signal_flags: +@return_type: +@n_params: +@param_types: + + + + + + + + + + + + + + + + + + + + + + + + + + + +@signal_name: +@itype: +@signal_flags: +@class_offset: +@accumulator: +@accu_data: +@c_marshaller: +@return_type: +@n_params: +@Varargs: +@Returns: + + + + + + + +@signal_name: +@itype: +@signal_flags: +@class_closure: +@accumulator: +@accu_data: +@c_marshaller: +@return_type: +@n_params: +@param_types: +@Returns: + + + + + + + +@signal_name: +@itype: +@signal_flags: +@class_closure: +@accumulator: +@accu_data: +@c_marshaller: +@return_type: +@n_params: +@args: +@Returns: + + + + + + + +@signal_id: +@query: + + + + + + + +@name: +@itype: +@Returns: + + + + + + + +@signal_id: +@Returns: + + + + + + + +@itype: +@n_ids: +@Returns: + + + + + + + +@instance: +@signal_id: +@detail: +@Varargs: + + + + + + + +@instance: +@detailed_signal: +@Varargs: + + + + + + + +@instance_and_params: +@signal_id: +@detail: +@return_value: + + + + + + + +@instance: +@signal_id: +@detail: +@var_args: + + + + + + + +@instance: +@detailed_signal: +@c_handler: +@data: + + + + + + + +@instance: +@detailed_signal: +@c_handler: +@data: + + + + + + + +@instance: +@detailed_signal: +@c_handler: +@data: + + + + + + + +@instance: +@detailed_signal: +@c_handler: +@gobject: +@connect_flags: +@Returns: + + + + + + + +@G_CONNECT_AFTER: +@G_CONNECT_SWAPPED: + + + + + + +@instance: +@detailed_signal: +@c_handler: +@data: +@destroy_data: +@connect_flags: +@Returns: + + + + + + + +@instance: +@detailed_signal: +@closure: +@after: +@Returns: + + + + + + + +@instance: +@signal_id: +@detail: +@closure: +@after: +@Returns: + + + + + + + +@instance: +@handler_id: + + + + + + + +@instance: +@handler_id: + + + + + + + +@instance: +@handler_id: + + + + + + + +@instance: +@mask: +@signal_id: +@detail: +@closure: +@func: +@data: +@Returns: + + + + + + + +@instance: +@mask: +@signal_id: +@detail: +@closure: +@func: +@data: +@Returns: + + + + + + + +@instance: +@mask: +@signal_id: +@detail: +@closure: +@func: +@data: +@Returns: + + + + + + + +@instance: +@mask: +@signal_id: +@detail: +@closure: +@func: +@data: +@Returns: + + + + + + + +@instance: +@handler_id: +@Returns: + + + + + + + +@instance: +@func: +@data: + + + + + + + +@instance: +@func: +@data: + + + + + + + +@instance: +@func: +@data: + + + + + + + +@instance: +@signal_id: +@detail: +@may_be_blocked: +@Returns: + + + + + + + +@instance: +@signal_id: +@detail: + + + + + + + +@instance: +@detailed_signal: + + + + + + + +@signal_id: +@instance_type: +@class_closure: + + + + + + + +@instance_and_params: +@return_value: + + + + + + + +@signal_name: +@itype: +@signal_flags: +@class_handler: +@accumulator: +@accu_data: +@c_marshaller: +@return_type: +@n_params: +@Varargs: +@Returns: + + + + + + + +@signal_name: +@instance_type: +@class_handler: + + + + + + + +@instance: +@Varargs: + + + + + + + +@signal_id: +@detail: +@hook_func: +@hook_data: +@data_destroy: +@Returns: + + + + + + + +@signal_id: +@hook_id: + + + + + + + +@detailed_signal: +@itype: +@signal_id_p: +@detail_p: +@force_detail_quark: +@Returns: + + + + + + + +@instance: +@Returns: + + + + + + + +@itype: +@struct_offset: +@Returns: + + + + + + + +@ihint: +@return_accu: +@handler_return: +@dummy: +@Returns: + + diff --git a/docs/reference/gobject/tmpl/value_arrays.sgml b/docs/reference/gobject/tmpl/value_arrays.sgml new file mode 100644 index 0000000..7bdc844 --- /dev/null +++ b/docs/reference/gobject/tmpl/value_arrays.sgml @@ -0,0 +1,127 @@ + +Value arrays + + + + + + + + + + + + + + + + + + + + + + + + +@n_values: +@values: + + + + + + +@value_array: +@index_: +@Returns: + + + + + + + +@n_prealloced: +@Returns: + + + + + + + +@value_array: +@Returns: + + + + + + + +@value_array: + + + + + + + +@value_array: +@value: +@Returns: + + + + + + + +@value_array: +@value: +@Returns: + + + + + + + +@value_array: +@index_: +@value: +@Returns: + + + + + + + +@value_array: +@index_: +@Returns: + + + + + + + +@value_array: +@compare_func: +@Returns: + + + + + + + +@value_array: +@compare_func: +@user_data: +@Returns: + + diff --git a/docs/reference/gobject/tmpl/value_collection.sgml b/docs/reference/gobject/tmpl/value_collection.sgml new file mode 100644 index 0000000..872ee85 --- /dev/null +++ b/docs/reference/gobject/tmpl/value_collection.sgml @@ -0,0 +1,56 @@ + +Varargs Value Collection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@value: +@var_args: +@flags: +@__error: + + + + + + + +@value: +@var_args: +@flags: +@__error: + + + + + + + + + diff --git a/docs/reference/gobject/tut_gobject.xml b/docs/reference/gobject/tut_gobject.xml new file mode 100644 index 0000000..4c5e707 --- /dev/null +++ b/docs/reference/gobject/tut_gobject.xml @@ -0,0 +1,750 @@ + + + + The GObject base class + + + The two previous chapters discussed the details of GLib's Dynamic Type System + and its signal control system. The GObject library also contains an implementation + for a base fundamental type named GObject. + + + + GObject is a fundamental classed instantiable type. It implements: + + Memory management with reference counting + Construction/Destruction of instances + Generic per-object properties with set/get function pairs + Easy use of signals + + All the GNOME libraries which use the GLib type system (like GTK+ and GStreamer) + inherit from GObject which is why it is important to understand + the details of how it works. + + + + Object instantiation + + + The g_object_new + family of functions can be used to instantiate any GType which inherits + from the GObject base type. All these functions make sure the class and + instance structures have been correctly initialized by GLib's type system + and then invoke at one point or another the constructor class method + which is used to: + + + Allocate and clear memory through g_type_create_instance, + + + Initialize the object's instance with the construction properties. + + + Although one can expect all class and instance members (except the fields + pointing to the parents) to be set to zero, some consider it good practice + to explicitly set them. + + + + Objects which inherit from GObject are allowed to override this + constructor class method: they should however chain to their parent + constructor method before doing so: + + GObject *(* constructor) (GType gtype, + guint n_properties, + GObjectConstructParam *properties); + + + + + The example below shows how MamanBar overrides the parent's constructor: + +#define MAMAN_TYPE_BAR (maman_bar_get_type ()) +#define MAMAN_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar)) +#define MAMAN_IS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR)) +#define MAMAN_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass)) +#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR)) +#define MAMAN_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass)) + +typedef struct _MamanBar MamanBar; +typedef struct _MamanBarClass MamanBarClass; + +struct _MamanBar +{ + GObject parent_instance; + + /* instance members */ +}; + +struct _MamanBarClass +{ + GObjectClass parent_class; + + /* class members */ +}; + +/* will create maman_bar_get_type and set maman_bar_parent_class */ +G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT); + +static GObject * +maman_bar_constructor (GType gtype, + guint n_properties, + GObjectConstructParam *properties) +{ + GObject *obj; + + { + /* Always chain up to the parent constructor */ + MamanBarClass *klass; + GObjectClass *parent_class; + parent_class = G_OBJECT_CLASS (maman_bar_parent_class); + obj = parent_class->constructor (gtype, n_properties, properties); + } + + /* update the object state depending on constructor properties */ + + return obj; +} + +static void +maman_bar_class_init (MamanBarClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->constructor = maman_bar_constructor; +} + +static void +maman_bar_init (MamanBar *self) +{ + /* initialize the object */ +} + + + If the user instantiates an object MamanBar with: + +MamanBar *bar = g_object_new (MAMAN_TYPE_BAR, NULL); + + If this is the first instantiation of such an object, the + maman_bar_class_init function will be invoked + after any maman_bar_base_class_init function. + This will make sure the class structure of this new object is + correctly initialized. Here, maman_bar_class_init + is expected to override the object's class methods and setup the + class' own methods. In the example above, the constructor method is + the only overridden method: it is set to + maman_bar_constructor. + + + + Once g_object_new has obtained a reference to an initialized + class structure, it invokes its constructor method to create an instance of the new + object. Since it has just been overridden by maman_bar_class_init + to maman_bar_constructor, the latter is called and, because it + was implemented correctly, it chains up to its parent's constructor. In + order to find the parent class and chain up to the parent class + constructor, we can use the maman_bar_parent_class + pointer that has been set up for us by the + G_DEFINE_TYPE macro. + + + + Finally, at one point or another, g_object_constructor is invoked + by the last constructor in the chain. This function allocates the object's instance' buffer + through g_type_create_instance + which means that the instance_init function is invoked at this point if one + was registered. After instance_init returns, the object is fully initialized and should be + ready to answer any user-request. When g_type_create_instance + returns, g_object_constructor sets the construction properties + (i.e. the properties which were given to g_object_new) and returns + to the user's constructor which is then allowed to do useful instance initialization... + + + + The process described above might seem a bit complicated, but it can be + summarized easily by the table below which lists the functions invoked + by g_object_new + and their order of invocation: + + + + + <function><link linkend="g-object-new">g_object_new</link></function> + + + + + + + + Invocation time + Function Invoked + Function's parameters + Remark + + + + + First call to g_object_new for target type + target type's base_init function + On the inheritance tree of classes from fundamental type to target type. + base_init is invoked once for each class structure. + + I have no real idea on how this can be used. If you have a good real-life + example of how a class' base_init can be used, please, let me know. + + + + + target type's class_init function + On target type's class structure + + Here, you should make sure to initialize or override class methods (that is, + assign to each class' method its function pointer) and create the signals and + the properties associated to your object. + + + + + interface' base_init function + On interface' vtable + + + + + interface' interface_init function + On interface' vtable + + + + Each call to g_object_new for target type + target type's class constructor method: GObjectClass->constructor + On object's instance + + If you need to complete the object initialization after all the construction properties + are set, override the constructor method and make sure to chain up to the object's + parent class before doing your own initialization. + In doubt, do not override the constructor method. + + + + + type's instance_init function + On the inheritance tree of classes from fundamental type to target type. + the instance_init provided for each type is invoked once for each instance + structure. + + Provide an instance_init function to initialize your object before its construction + properties are set. This is the preferred way to initialize a GObject instance. + This function is equivalent to C++ constructors. + + + + +
+
+ + + Readers should feel concerned about one little twist in the order in + which functions are invoked: while, technically, the class' constructor + method is called before the GType's instance_init + function (since g_type_create_instance which calls instance_init is called by + g_object_constructor which is the top-level class + constructor method and to which users are expected to chain to), the + user's code which runs in a user-provided constructor will always + run after GType's instance_init function since the + user-provided constructor must (you've been warned) + chain up before doing anything useful. + +
+ + + Object memory management + + + The memory-management API for GObjects is a bit complicated but the idea behind it + is pretty simple: the goal is to provide a flexible model based on reference counting + which can be integrated in applications which use or require different memory management + models (such as garbage collection, aso...). The methods which are used to + manipulate this reference count are described below. + +/* + Refcounting +*/ +gpointer g_object_ref (gpointer object); +void g_object_unref (gpointer object); + +/* + * Weak References + */ +typedef void (*GWeakNotify) (gpointer data, + GObject *where_the_object_was); + +void g_object_weak_ref (GObject *object, + GWeakNotify notify, + gpointer data); +void g_object_weak_unref (GObject *object, + GWeakNotify notify, + gpointer data); +void g_object_add_weak_pointer (GObject *object, + gpointer *weak_pointer_location); +void g_object_remove_weak_pointer (GObject *object, + gpointer *weak_pointer_location); +/* + * Cycle handling + */ +void g_object_run_dispose (GObject *object); + + + + + Reference count + + + The functions g_object_ref/g_object_unref respectively + increase and decrease the reference count.These functions are thread-safe as of GLib 2.8. + The reference count is, unsurprisingly, initialized to one by + g_object_new which means that the caller + is currently the sole owner of the newly-created reference. + When the reference count reaches zero, that is, + when g_object_unref is called by the last client holding + a reference to the object, the dispose and the + finalize class methods are invoked. + + + Finally, after finalize is invoked, + g_type_free_instance is called to free the object instance. + Depending on the memory allocation policy decided when the type was registered (through + one of the g_type_register_* functions), the object's instance + memory will be freed or returned to the object pool for this type. + Once the object has been freed, if it was the last instance of the type, the type's class + will be destroyed as described in and + . + + + + The table below summarizes the destruction process of a GObject: + + <function><link linkend="g-object-unref">g_object_unref</link></function> + + + + + + + + Invocation time + Function Invoked + Function's parameters + Remark + + + + + Last call to g_object_unref for an instance + of target type + + target type's dispose class function + GObject instance + + When dispose ends, the object should not hold any reference to any other + member object. The object is also expected to be able to answer client + method invocations (with possibly an error code but no memory violation) + until finalize is executed. dispose can be executed more than once. + dispose should chain up to its parent implementation just before returning + to the caller. + + + + + target type's finalize class function + GObject instance + + Finalize is expected to complete the destruction process initiated by + dispose. It should complete the object's destruction. finalize will be + executed only once. + finalize should chain up to its parent implementation just before returning + to the caller. + The reason why the destruction process is split is two different phases is + explained in . + + + + Last call to g_object_unref for the last + instance of target type + + interface' interface_finalize function + On interface' vtable + Never used in practice. Unlikely you will need it. + + + + interface' base_finalize function + On interface' vtable + Never used in practice. Unlikely you will need it. + + + + target type's class_finalize function + On target type's class structure + Never used in practice. Unlikely you will need it. + + + + type's base_finalize function + On the inheritance tree of classes from fundamental type to target type. + base_init is invoked once for each class structure. + Never used in practice. Unlikely you will need it. + + + +
+
+ +
+ + + Weak References + + + Weak References are used to monitor object finalization: + g_object_weak_ref adds a monitoring callback which does + not hold a reference to the object but which is invoked when the object runs + its dispose method. As such, each weak ref can be invoked more than once upon + object finalization (since dispose can run more than once during object + finalization). + + + + g_object_weak_unref can be used to remove a monitoring + callback from the object. + + + + Weak References are also used to implement g_object_add_weak_pointer + and g_object_remove_weak_pointer. These functions add a weak reference + to the object they are applied to which makes sure to nullify the pointer given by the user + when object is finalized. + + + + + + Reference counts and cycles + + + Note: the following section was inspired by James Henstridge. I guess this means that + all praise and all curses will be directly forwarded to him. + + + + GObject's memory management model was designed to be easily integrated in existing code + using garbage collection. This is why the destruction process is split in two phases: + the first phase, executed in the dispose handler is supposed to release all references + to other member objects. The second phase, executed by the finalize handler is supposed + to complete the object's destruction process. Object methods should be able to run + without program error (that is, without segfault :) in-between the two phases. + + + + This two-step destruction process is very useful to break reference counting cycles. + While the detection of the cycles is up to the external code, once the cycles have been + detected, the external code can invoke g_object_dispose which + will indeed break any existing cycles since it will run the dispose handler associated + to the object and thus release all references to other objects. + + + + Attentive readers might now have understood one of the rules about the dispose handler + we stated a bit sooner: the dispose handler can be invoked multiple times. Let's say we + have a reference count cycle: object A references B which itself references object A. + Let's say we have detected the cycle and we want to destroy the two objects. One way to + do this would be to invoke g_object_dispose on one of the + objects. + + + + If object A releases all its references to all objects, this means it releases its + reference to object B. If object B was not owned by anyone else, this is its last + reference count which means this last unref runs B's dispose handler which, in turn, + releases B's reference on object A. If this is A's last reference count, this last + unref runs A's dispose handler which is running for the second time before + A's finalize handler is invoked ! + + + + The above example, which might seem a bit contrived can really happen if your + GObject's are being handled by language bindings. I would thus suggest the rules stated above + for object destruction are closely followed. Otherwise, Bad Bad Things + will happen. + + +
+ + + Object properties + + + One of GObject's nice features is its generic get/set mechanism for object + properties. When an object + is instantiated, the object's class_init handler should be used to register + the object's properties with g_object_class_install_property + (implemented in gobject.c). + + + + The best way to understand how object properties work is by looking at a real example + on how it is used: + +/************************************************/ +/* Implementation */ +/************************************************/ + +enum +{ + PROP_0, + + PROP_MAMAN_NAME, + PROP_PAPA_NUMBER +}; + +static void +maman_bar_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + MamanBar *self = MAMAN_BAR (object); + + switch (property_id) + { + case PROP_MAMAN_NAME: + g_free (self->priv->name); + self->priv->name = g_value_dup_string (value); + g_print ("maman: %s\n", self->priv->name); + break; + + case PROP_PAPA_NUMBER: + self->priv->papa_number = g_value_get_uchar (value); + g_print ("papa: %u\n", self->priv->papa_number); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +maman_bar_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + MamanBar *self = MAMAN_BAR (object); + + switch (property_id) + { + case PROP_MAMAN_NAME: + g_value_set_string (value, self->priv->name); + break; + + case PROP_PAPA_NUMBER: + g_value_set_uchar (value, self->priv->papa_number); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +maman_bar_class_init (MamanBarClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; + + gobject_class->set_property = maman_bar_set_property; + gobject_class->get_property = maman_bar_get_property; + + pspec = g_param_spec_string ("maman-name", + "Maman construct prop", + "Set maman's name", + "no-name-set" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_MAMAN_NAME, + pspec); + + pspec = g_param_spec_uchar ("papa-number", + "Number of current Papa", + "Set/Get papa's number", + 0 /* minimum value */, + 10 /* maximum value */, + 2 /* default value */, + G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_PAPA_NUMBER, + pspec); +} + +/************************************************/ +/* Use */ +/************************************************/ + +GObject *bar; +GValue val = { 0, }; + +bar = g_object_new (MAMAN_TYPE_SUBBAR, NULL); + +g_value_init (&val, G_TYPE_CHAR); +g_value_set_char (&val, 11); + +g_object_set_property (G_OBJECT (bar), "papa-number", &val); + +g_value_unset (&val); + + The client code just above looks simple but a lot of things happen under the hood: + + + + g_object_set_property first ensures a property + with this name was registered in bar's class_init handler. If so, it calls + object_set_property which first walks the class hierarchy, + from bottom, most derived type, to top, fundamental type to find the class + which registered that property. It then tries to convert the user-provided GValue + into a GValue whose type is that of the associated property. + + + + If the user provides a signed char GValue, as is shown + here, and if the object's property was registered as an unsigned int, + g_value_transform will try to transform the input signed char into + an unsigned int. Of course, the success of the transformation depends on the availability + of the required transform function. In practice, there will almost always be a transformation + + Its behaviour might not be what you expect but it is up to you to actually avoid + relying on these transformations. + + + which matches and conversion will be carried out if needed. + + + + After transformation, the GValue is validated by + g_param_value_validate which makes sure the user's + data stored in the GValue matches the characteristics specified by + the property's GParamSpec. Here, the GParamSpec we + provided in class_init has a validation function which makes sure that the GValue + contains a value which respects the minimum and maximum bounds of the + GParamSpec. In the example above, the client's GValue does not + respect these constraints (it is set to 11, while the maximum is 10). As such, the + g_object_set_property function will return with an error. + + + + If the user's GValue had been set to a valid value, g_object_set_property + would have proceeded with calling the object's set_property class method. Here, since our + implementation of Foo did override this method, the code path would jump to + foo_set_property after having retrieved from the + GParamSpec the param_id + + + It should be noted that the param_id used here need only to uniquely identify each + GParamSpec within the FooClass such that the switch + used in the set and get methods actually works. Of course, this locally-unique + integer is purely an optimization: it would have been possible to use a set of + if (strcmp (a, b) == 0) {} else if (strcmp (a, b) == 0) {} statements. + + + which had been stored by + g_object_class_install_property. + + + + Once the property has been set by the object's set_property class method, the code path + returns to g_object_set_property which calls + g_object_notify_queue_thaw. This function makes sure that + the "notify" signal is emitted on the object's instance with the changed property as + parameter unless notifications were frozen by g_object_freeze_notify. + + + + g_object_thaw_notify can be used to re-enable notification of + property modifications through the "notify" signal. It is important to remember that + even if properties are changed while property change notification is frozen, the "notify" + signal will be emitted once for each of these changed properties as soon as the property + change notification is thawed: no property change is lost for the "notify" signal. Signal + can only be delayed by the notification freezing mechanism. + + + + It sounds like a tedious task to set up GValues every time when one wants to modify a property. + In practice one will rarely do this. The functions g_object_set_property + and g_object_get_property + are meant to be used by language bindings. For application there is an easier way and + that is described next. + + + + Accessing multiple properties at once + + + It is interesting to note that the g_object_set and + g_object_set_valist (vararg version) functions can be used to set + multiple properties at once. The client code shown above can then be re-written as: + +MamanBar *foo; +foo = /* */; +g_object_set (G_OBJECT (foo), + "papa-number", 2, + "maman-name", "test", + NULL); + + This saves us from managing the GValues that we were needing to handle when using + g_object_set_property. + The code above will trigger one notify signal emission for each property modified. + + + + Of course, the _get versions are also available: g_object_get + and g_object_get_valist (vararg version) can be used to get numerous + properties at once. + + + + These high level functions have one drawback - they don't provide a return result. + One should pay attention to the argument types and ranges when using them. + A known source of errors is to e.g. pass a gfloat instead of a gdouble and thus + shifting all subsequent parameters by four bytes. Also forgetting the terminating + NULL will lead to unexpected behaviour. + + + + Really attentive readers now understand how g_object_new, + g_object_newv and g_object_new_valist + work: they parse the user-provided variable number of parameters and invoke + g_object_set on the parameters only after the object has been successfully constructed. + Of course, the "notify" signal will be emitted for each property set. + + + + + + + + +
diff --git a/docs/reference/gobject/tut_gsignal.xml b/docs/reference/gobject/tut_gsignal.xml new file mode 100644 index 0000000..80f537a --- /dev/null +++ b/docs/reference/gobject/tut_gsignal.xml @@ -0,0 +1,523 @@ + + + + The GObject messaging system + + + Closures + + + Closures are central to the concept of asynchronous signal delivery + which is widely used throughout GTK+ and GNOME applications. A closure is an + abstraction, a generic representation of a callback. It is a small structure + which contains three objects: + + a function pointer (the callback itself) whose prototype looks like: + +return_type function_callback (... , gpointer user_data); + + + + the user_data pointer which is passed to the callback upon invocation of the closure + + + a function pointer which represents the destructor of the closure: whenever the + closure's refcount reaches zero, this function will be called before the closure + structure is freed. + + + + + + The GClosure structure represents the common functionality of all + closure implementations: there exists a different Closure implementation for + each separate runtime which wants to use the GObject type system. + + In practice, closures sit at the boundary of language runtimes: if you are + writing Python code and one of your Python callbacks receives a signal from + a GTK+ widget, the C code in GTK+ needs to execute your Python + code. The closure invoked by the GTK+ object invokes the Python callback: + it behaves as a normal C object for GTK+ and as a normal Python object for + Python code. + + The GObject library provides a simple GCClosure type which + is a specific implementation of closures to be used with C/C++ callbacks. + + + A GClosure provides simple services: + + + Invocation (g_closure_invoke): this is what closures + were created for: they hide the details of callback invocation from the + callback invoker. + + + Notification: the closure notifies listeners of certain events such as + closure invocation, closure invalidation and closure finalization. Listeners + can be registered with g_closure_add_finalize_notifier + (finalization notification), g_closure_add_invalidate_notifier + (invalidation notification) and + g_closure_add_marshal_guards (invocation notification). + There exist symmetric deregistration functions for finalization and invalidation + events (g_closure_remove_finalize_notifier and + g_closure_remove_invalidate_notifier) but not for the invocation + process. + + Closures are reference counted and notify listeners of their destruction in a two-stage + process: the invalidation notifiers are invoked before the finalization notifiers. + + + + + + + C Closures + + + If you are using C or C++ + to connect a callback to a given event, you will either use simple GCClosures + which have a pretty minimal API or the even simpler g_signal_connect + functions (which will be presented a bit later :). + +GClosure *g_cclosure_new (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data); +GClosure *g_cclosure_new_swap (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data); +GClosure *g_signal_type_cclosure_new (GType itype, + guint struct_offset); + + + + + g_cclosure_new will create a new closure which can invoke the + user-provided callback_func with the user-provided user_data as last parameter. When the closure + is finalized (second stage of the destruction process), it will invoke the destroy_data function + if the user has supplied one. + + + + g_cclosure_new_swap will create a new closure which can invoke the + user-provided callback_func with the user-provided user_data as first parameter (instead of being the + last parameter as with g_cclosure_new). When the closure + is finalized (second stage of the destruction process), it will invoke the destroy_data + function if the user has supplied one. + + + + + Non-C closures (for the fearless) + + + As was explained above, closures hide the details of callback invocation. In C, + callback invocation is just like function invocation: it is a matter of creating + the correct stack frame for the called function and executing a call + assembly instruction. + + + + C closure marshallers transform the array of GValues which represent + the parameters to the target function into a C-style function parameter list, invoke + the user-supplied C function with this new parameter list, get the return value of the + function, transform it into a GValue and return this GValue to the marshaller caller. + + + + The following code implements a simple marshaller in C for a C function which takes an + integer as first parameter and returns void. + +g_cclosure_marshal_VOID__INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__INT) (gpointer data1, + gint arg_1, + gpointer data2); + register GMarshalFunc_VOID__INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + + callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_int (param_values + 1), + data2); +} + + + + + Of course, there exist other kinds of marshallers. For example, James Henstridge + wrote a generic Python marshaller which is used by all Python closures (a Python closure + is used to have Python-based callback be invoked by the closure invocation process). + This Python marshaller transforms the input GValue list representing the function + parameters into a Python tuple which is the equivalent structure in Python (you can + look in pyg_closure_marshal in pygtype.c + in the pygobject module in the GNOME source code repository). + + + + + + + Signals + + + GObject's signals have nothing to do with standard UNIX signals: they connect + arbitrary application-specific events with any number of listeners. + For example, in GTK+, every user event (keystroke or mouse move) is received + from the X server and generates a GTK+ event under the form of a signal emission + on a given object instance. + + + + Each signal is registered in the type system together with the type on which + it can be emitted: users of the type are said to connect + to the signal on a given type instance when they register a closure to be + invoked upon the signal emission. Users can also emit the signal by themselves + or stop the emission of the signal from within one of the closures connected + to the signal. + + + + When a signal is emitted on a given type instance, all the closures + connected to this signal on this type instance will be invoked. All the closures + connected to such a signal represent callbacks whose signature looks like: + +return_type function_callback (gpointer instance, ... , gpointer user_data); + + + + + Signal registration + + + To register a new signal on an existing type, we can use any of g_signal_newv, + g_signal_new_valist or g_signal_new functions: + +guint g_signal_newv (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GClosure *class_closure, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + GType *param_types); + + The number of parameters to these functions is a bit intimidating but they are relatively + simple: + + + signal_name: is a string which can be used to uniquely identify a given signal. + + + itype: is the instance type on which this signal can be emitted. + + + signal_flags: partly defines the order in which closures which were connected to the + signal are invoked. + + + class_closure: this is the default closure for the signal: if it is not NULL upon + the signal emission, it will be invoked upon this emission of the signal. The + moment where this closure is invoked compared to other closures connected to that + signal depends partly on the signal_flags. + + + accumulator: this is a function pointer which is invoked after each closure + has been invoked. If it returns FALSE, signal emission is stopped. If it returns + TRUE, signal emission proceeds normally. It is also used to compute the return + value of the signal based on the return value of all the invoked closures. + + + accumulator_data: this pointer will be passed down to each invocation of the + accumulator during emission. + + + c_marshaller: this is the default C marshaller for any closure which is connected to + this signal. + + + return_type: this is the type of the return value of the signal. + + + n_params: this is the number of parameters this signal takes. + + + param_types: this is an array of GTypes which indicate the type of each parameter + of the signal. The length of this array is indicated by n_params. + + + + + + As you can see from the above definition, a signal is basically a description + of the closures which can be connected to this signal and a description of the + order in which the closures connected to this signal will be invoked. + + + + + + Signal connection + + + If you want to connect to a signal with a closure, you have three possibilities: + + + You can register a class closure at signal registration: this is a + system-wide operation. i.e.: the class_closure will be invoked during each emission + of a given signal on all the instances of the type which supports that signal. + + + You can use g_signal_override_class_closure which + overrides the class_closure of a given type. It is possible to call this function + only on a derived type of the type on which the signal was registered. + This function is of use only to language bindings. + + + You can register a closure with the g_signal_connect + family of functions. This is an instance-specific operation: the closure + will be invoked only during emission of a given signal on a given instance. + + + It is also possible to connect a different kind of callback on a given signal: + emission hooks are invoked whenever a given signal is emitted whatever the instance on + which it is emitted. Emission hooks are used for example to get all mouse_clicked + emissions in an application to be able to emit the small mouse click sound. + Emission hooks are connected with g_signal_add_emission_hook + and removed with g_signal_remove_emission_hook. + + + + + + Signal emission + + + Signal emission is done through the use of the g_signal_emit family + of functions. + +void g_signal_emitv (const GValue *instance_and_params, + guint signal_id, + GQuark detail, + GValue *return_value); + + + + The instance_and_params array of GValues contains the list of input + parameters to the signal. The first element of the array is the + instance pointer on which to invoke the signal. The following elements of + the array contain the list of parameters to the signal. + + + signal_id identifies the signal to invoke. + + + detail identifies the specific detail of the signal to invoke. A detail is a kind of + magic token/argument which is passed around during signal emission and which is used + by closures connected to the signal to filter out unwanted signal emissions. In most + cases, you can safely set this value to zero. See for + more details about this parameter. + + + return_value holds the return value of the last closure invoked during emission if + no accumulator was specified. If an accumulator was specified during signal creation, + this accumulator is used to calculate the return_value as a function of the return + values of all the closures invoked during emission. + + James (again!!) gives a few non-trivial examples of accumulators: + + For instance, you may have an accumulator that ignores NULL returns from + closures, and only accumulates the non-NULL ones. Another accumulator may try + to return the list of values returned by the closures. + + + If no closure is invoked during + emission, the return_value is nonetheless initialized to zero/null. + + + + + + Internally, the GValue array is passed to the emission function proper, + signal_emit_unlocked_R (implemented in gsignal.c). + Signal emission can be decomposed in 5 steps: + + + RUN_FIRST: if the G_SIGNAL_RUN_FIRST flag was used + during signal registration and if there exist a class_closure for this signal, + the class_closure is invoked. Jump to EMISSION_HOOK state. + + + EMISSION_HOOK: if any emission hook was added to + the signal, they are invoked from first to last added. Accumulate return values + and jump to HANDLER_RUN_FIRST state. + + + HANDLER_RUN_FIRST: if any closure were connected + with the g_signal_connect family of + functions, and if they are not blocked (with the g_signal_handler_block + family of functions) they are run here, from first to last connected. + Jump to RUN_LAST state. + + + RUN_LAST: if the G_SIGNAL_RUN_LAST + flag was set during registration and if a class_closure + was set, it is invoked here. Jump to + HANDLER_RUN_LAST state. + + + HANDLER_RUN_LAST: if any closure were connected + with the g_signal_connect_after family of + functions, if they were not invoked during HANDLER_RUN_FIRST and if they + are not blocked, they are run here, from first to last connected. + Jump to RUN_CLEANUP state. + + + RUN_CLEANUP: if the G_SIGNAL_RUN_CLEANUP flag + was set during registration and if a class_closure was set, + it is invoked here. Signal emission is completed here. + + + + + + If, at any point during emission (except in RUN_CLEANUP state), one of the + closures or emission hook stops the signal emission with + g_signal_stop, emission jumps to CLEANUP state. + + + + If, at any point during emission, one of the closures or emission hook + emits the same signal on the same instance, emission is restarted from + the RUN_FIRST state. + + + + The accumulator function is invoked in all states, after invocation + of each closure (except in EMISSION_HOOK and CLEANUP). It accumulates + the closure return value into the signal return value and returns TRUE or + FALSE. If, at any point, it does not return TRUE, emission jumps to CLEANUP state. + + + + If no accumulator function was provided, the value returned by the last handler + run will be returned by g_signal_emit. + + + + + + + The <emphasis>detail</emphasis> argument + + All the functions related to signal emission or signal connection have a parameter + named the detail. Sometimes, this parameter is hidden by the API + but it is always there, under one form or another. + + + + Of the three main connection functions, + only one has an explicit detail parameter as a GQuark + + A GQuark is an integer which uniquely represents a string. It is possible to transform + back and forth between the integer and string representations with the functions + g_quark_from_string and g_quark_to_string. + + : + +gulong g_signal_connect_closure_by_id (gpointer instance, + guint signal_id, + GQuark detail, + GClosure *closure, + gboolean after); + + The two other functions hide the detail parameter in the signal name identification: + +gulong g_signal_connect_closure (gpointer instance, + const gchar *detailed_signal, + GClosure *closure, + gboolean after); +gulong g_signal_connect_data (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer data, + GClosureNotify destroy_data, + GConnectFlags connect_flags); + + Their detailed_signal parameter is a string which identifies the name of the signal + to connect to. However, the format of this string is structured to look like + signal_name::detail_name. Connecting to the signal + named notify::cursor_position will actually connect to the signal + named notify with the cursor_position name. + Internally, the detail string is transformed to a GQuark if it is present. + + + + Of the four main signal emission functions, three have an explicit detail parameter as a + GQuark again: + +void g_signal_emitv (const GValue *instance_and_params, + guint signal_id, + GQuark detail, + GValue *return_value); +void g_signal_emit_valist (gpointer instance, + guint signal_id, + GQuark detail, + va_list var_args); +void g_signal_emit (gpointer instance, + guint signal_id, + GQuark detail, + ...); + + The fourth function hides it in its signal name parameter: + +void g_signal_emit_by_name (gpointer instance, + const gchar *detailed_signal, + ...); + + The format of the detailed_signal parameter is exactly the same as the format used by + the g_signal_connect functions: signal_name::detail_name. + + + + If a detail is provided by the user to the emission function, it is used during emission to match + against the closures which also provide a detail. + If the closures' detail does not match the detail provided by the user, they will not be invoked + (even though they are connected to a signal which is being emitted). + + + + This completely optional filtering mechanism is mainly used as an optimization for signals + which are often emitted for many different reasons: the clients can filter out which events they are + interested in before the closure's marshalling code runs. For example, this is used extensively + by the notify signal of GObject: whenever a property is modified on a GObject, + instead of just emitting the notify signal, GObject associates as a detail to this + signal emission the name of the property modified. This allows clients who wish to be notified of changes + to only one property to filter most events before receiving them. + + + + As a simple rule, users can and should set the detail parameter to zero: this will disable completely + this optional filtering. + + + + + + + diff --git a/docs/reference/gobject/tut_gtype.xml b/docs/reference/gobject/tut_gtype.xml new file mode 100644 index 0000000..b4df241 --- /dev/null +++ b/docs/reference/gobject/tut_gtype.xml @@ -0,0 +1,948 @@ + + + + The GLib Dynamic Type System + + + A type, as manipulated by the GLib type system, is much more generic than what + is usually understood as an Object type. It is best explained by looking at the + structure and the functions used to register new types in the type system. + +typedef struct _GTypeInfo GTypeInfo; +struct _GTypeInfo +{ + /* interface types, classed types, instantiated types */ + guint16 class_size; + + GBaseInitFunc base_init; + GBaseFinalizeFunc base_finalize; + + /* classed types, instantiated types */ + GClassInitFunc class_init; + GClassFinalizeFunc class_finalize; + gconstpointer class_data; + + /* instantiated types */ + guint16 instance_size; + guint16 n_preallocs; + GInstanceInitFunc instance_init; + + /* value handling */ + const GTypeValueTable *value_table; +}; +GType g_type_register_static (GType parent_type, + const gchar *type_name, + const GTypeInfo *info, + GTypeFlags flags); +GType g_type_register_fundamental (GType type_id, + const gchar *type_name, + const GTypeInfo *info, + const GTypeFundamentalInfo *finfo, + GTypeFlags flags); + + + + + g_type_register_static and + g_type_register_fundamental + are the C functions, defined in + gtype.h and implemented in gtype.c + which you should use to register a new GType in the program's type system. + It is not likely you will ever need to use + g_type_register_fundamental (you have to be Tim Janik + to do that) but in case you want to, the last chapter explains how to create + new fundamental types. + + + Please note that there exists another registration function: the + g_type_register_dynamic. We will not discuss this + function here since its use is very similar to the _static + version. + + + + + + Fundamental types are top-level types which do not derive from any other type + while other non-fundamental types derive from other types. + Upon initialization by g_type_init, the type system not + only initializes its internal data structures but it also registers a number of core + types: some of these are fundamental types. Others are types derived from these + fundamental types. + + + + Fundamental and non-fundamental types are defined by: + + + class size: the class_size field in GTypeInfo. + + + class initialization functions (C++ constructor): the base_init and + class_init fields in GTypeInfo. + + + class destruction functions (C++ destructor): the base_finalize and + class_finalize fields in GTypeInfo. + + + instance size (C++ parameter to new): the instance_size field in + GTypeInfo. + + + instantiation policy (C++ type of new operator): the n_preallocs + field in GTypeInfo. + + + copy functions (C++ copy operators): the value_table field in + GTypeInfo. + + + type characteristic flags: GTypeFlags. + + + Fundamental types are also defined by a set of GTypeFundamentalFlags + which are stored in a GTypeFundamentalInfo. + Non-fundamental types are furthermore defined by the type of their parent which is + passed as the parent_type parameter to g_type_register_static + and g_type_register_dynamic. + + + + Copy functions + + + The major common point between all GLib types (fundamental and + non-fundamental, classed and non-classed, instantiable and non-instantiable) is that + they can all be manipulated through a single API to copy/assign them. + + + + The GValue structure is used as an abstract container for all of these + types. Its simplistic API (defined in gobject/gvalue.h) can be + used to invoke the value_table functions registered + during type registration: for example g_value_copy copies the + content of a GValue to another GValue. This is similar + to a C++ assignment which invokes the C++ copy operator to modify the default + bit-by-bit copy semantics of C++/C structures/classes. + + + + The following code shows how you can copy around a 64 bit integer, as well as a GObject + instance pointer (sample code for this is located in the source tarball for this document in + sample/gtype/test.c): + +static void test_int (void) +{ + GValue a_value = {0, }; + GValue b_value = {0, }; + guint64 a, b; + + a = 0xdeadbeaf; + + g_value_init (&a_value, G_TYPE_UINT64); + g_value_set_uint64 (&a_value, a); + + g_value_init (&b_value, G_TYPE_UINT64); + g_value_copy (&a_value, &b_value); + + b = g_value_get_uint64 (&b_value); + + if (a == b) { + g_print ("Yay !! 10 lines of code to copy around a uint64.\n"); + } else { + g_print ("Are you sure this is not a Z80 ?\n"); + } +} + +static void test_object (void) +{ + GObject *obj; + GValue obj_vala = {0, }; + GValue obj_valb = {0, }; + obj = g_object_new (MAMAN_TYPE_BAR, NULL); + + g_value_init (&obj_vala, MAMAN_TYPE_BAR); + g_value_set_object (&obj_vala, obj); + + g_value_init (&obj_valb, G_TYPE_OBJECT); + + /* g_value_copy's semantics for G_TYPE_OBJECT types is to copy the reference. + This function thus calls g_object_ref. + It is interesting to note that the assignment works here because + MAMAN_TYPE_BAR is a G_TYPE_OBJECT. + */ + g_value_copy (&obj_vala, &obj_valb); + + g_object_unref (G_OBJECT (obj)); + g_object_unref (G_OBJECT (obj)); +} + + The important point about the above code is that the exact semantics of the copy calls + is undefined since they depend on the implementation of the copy function. Certain + copy functions might decide to allocate a new chunk of memory and then to copy the + data from the source to the destination. Others might want to simply increment + the reference count of the instance and copy the reference to the new GValue. + + + + The value_table used to specify these assignment functions is defined in + gtype.h and is thoroughly described in the + API documentation provided with GObject (for once ;-) which is why we will + not detail its exact semantics. + +typedef struct _GTypeValueTable GTypeValueTable; +struct _GTypeValueTable +{ + void (*value_init) (GValue *value); + void (*value_free) (GValue *value); + void (*value_copy) (const GValue *src_value, + GValue *dest_value); + /* varargs functionality (optional) */ + gpointer (*value_peek_pointer) (const GValue *value); + gchar *collect_format; + gchar* (*collect_value) (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); + gchar *lcopy_format; + gchar* (*lcopy_value) (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +}; + + Interestingly, it is also very unlikely + you will ever need to specify a value_table during type registration + because these value_tables are inherited from the parent types for + non-fundamental types which means that unless you want to write a + fundamental type (not a great idea!), you will not need to provide + a new value_table since you will inherit the value_table structure + from your parent type. + + + + + Conventions + + + + There are a number of conventions users are expected to follow when creating new types + which are to be exported in a header file: + + + Use the object_method pattern for function names: to invoke + the method named foo on an instance of object type bar, call + bar_foo. + + Use prefixing to avoid namespace conflicts with other projects. + If your library (or application) is named Maman, + + + Maman is the French word for mum + or mother - nothing more and nothing less. + + + + prefix all your function names with maman_. + For example: maman_object_method. + + Create a macro named PREFIX_TYPE_OBJECT which always + returns the GType for the associated object type. For an object of type + Bar in a library prefixed by maman, + use: MAMAN_TYPE_BAR. + It is common although not a convention to implement this macro using either a global + static variable or a function named prefix_object_get_type. + We will follow the function pattern wherever possible in this document. + + Create a macro named PREFIX_OBJECT (obj) which + returns a pointer of type PrefixObject. This macro is used to enforce + static type safety by doing explicit casts wherever needed. It also enforces + dynamic type safety by doing runtime checks. It is possible to disable the dynamic + type checks in production builds (see building glib). + For example, we would create + MAMAN_BAR (obj) to keep the previous example. + + If the type is classed, create a macro named + PREFIX_OBJECT_CLASS (klass). This macro + is strictly equivalent to the previous casting macro: it does static casting with + dynamic type checking of class structures. It is expected to return a pointer + to a class structure of type PrefixObjectClass. Again, an example is: + MAMAN_BAR_CLASS. + + Create a macro named PREFIX_IS_BAR (obj): this macro is expected + to return a gboolean which indicates whether or not the input + object instance pointer of type BAR. + + If the type is classed, create a macro named + PREFIX_IS_OBJECT_CLASS (klass) which, as above, returns a boolean + if the input class pointer is a pointer to a class of type OBJECT. + + If the type is classed, create a macro named + PREFIX_OBJECT_GET_CLASS (obj) + which returns the class pointer associated to an instance of a given type. This macro + is used for static and dynamic type safety purposes (just like the previous casting + macros). + + + The implementation of these macros is pretty straightforward: a number of simple-to-use + macros are provided in gtype.h. For the example we used above, we would + write the following trivial code to declare the macros: + +#define MAMAN_TYPE_BAR (maman_bar_get_type ()) +#define MAMAN_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar)) +#define MAMAN_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass)) +#define MAMAN_IS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR)) +#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR)) +#define MAMAN_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass)) + + Stick to the naming klass as class is a registered c++ keyword. + + + + The following code shows how to implement the maman_bar_get_type + function: + +GType maman_bar_get_type (void) +{ + static GType type = 0; + if (type == 0) { + static const GTypeInfo info = { + /* You fill this structure. */ + }; + type = g_type_register_static (G_TYPE_OBJECT, + "MamanBarType", + &info, 0); + } + return type; +} + + + + + When having no special requirements you also can use the G_DEFINE_TYPE + macro: + +G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT) + + + + + + + Non-instantiable non-classed fundamental types + + + A lot of types are not instantiable by the type system and do not have + a class. Most of these types are fundamental trivial types such as gchar, + registered in g_value_types_init (in gvaluetypes.c). + + + + To register such a type in the type system, you just need to fill the + GTypeInfo structure with zeros since these types are also most of the time + fundamental: + + GTypeInfo info = { + 0, /* class_size */ + NULL, /* base_init */ + NULL, /* base_destroy */ + NULL, /* class_init */ + NULL, /* class_destroy */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + NULL, /* value_table */ + }; + static const GTypeValueTable value_table = { + value_init_long0, /* value_init */ + NULL, /* value_free */ + value_copy_long0, /* value_copy */ + NULL, /* value_peek_pointer */ + "i", /* collect_format */ + value_collect_int, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_char, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0); + + + + + + Having non-instantiable types might seem a bit useless: what good is a type + if you cannot instantiate an instance of that type ? Most of these types + are used in conjunction with GValues: a GValue is initialized + with an integer or a string and it is passed around by using the registered + type's value_table. GValues (and by extension these trivial fundamental + types) are most useful when used in conjunction with object properties and signals. + + + + + + Instantiable classed types: objects + + + Types which are registered with a class and are declared instantiable are + what most closely resembles an object. + Although GObjects (detailed in ) + are the most well known type of instantiable + classed types, other kinds of similar objects used as the base of an inheritance + hierarchy have been externally developed and they are all built on the fundamental + features described below. + + + + For example, the code below shows how you could register + such a fundamental object type in the type system: + +typedef struct { + GObject parent; + /* instance members */ + int field_a; +} MamanBar; + +typedef struct { + GObjectClass parent; + /* class members */ + void (*do_action_public_virtual) (MamanBar *self, guint8 i); + + void (*do_action_public_pure_virtual) (MamanBar *self, guint8 i); +} MamanBarClass; + +#define MAMAN_TYPE_BAR (maman_bar_get_type ()) + +GType +maman_bar_get_type (void) +{ + static GType type = 0; + if (type == 0) { + static const GTypeInfo info = { + sizeof (MamanBarClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) foo_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (MamanBar), + 0, /* n_preallocs */ + (GInstanceInitFunc) NULL /* instance_init */ + }; + type = g_type_register_static (G_TYPE_OBJECT, + "BarType", + &info, 0); + } + return type; +} + + Upon the first call to maman_bar_get_type, the type named + BarType will be registered in the type system as inheriting + from the type G_TYPE_OBJECT. + + + + Every object must define two structures: its class structure and its + instance structure. All class structures must contain as first member + a GTypeClass structure. All instance structures must contain as first + member a GTypeInstance structure. The declaration of these C types, + coming from gtype.h is shown below: + +struct _GTypeClass +{ + GType g_type; +}; +struct _GTypeInstance +{ + GTypeClass *g_class; +}; + + These constraints allow the type system to make sure that every object instance + (identified by a pointer to the object's instance structure) contains in its + first bytes a pointer to the object's class structure. + + + This relationship is best explained by an example: let's take object B which + inherits from object A: + +/* A definitions */ +typedef struct { + GTypeInstance parent; + int field_a; + int field_b; +} A; +typedef struct { + GTypeClass parent_class; + void (*method_a) (void); + void (*method_b) (void); +} AClass; + +/* B definitions. */ +typedef struct { + A parent; + int field_c; + int field_d; +} B; +typedef struct { + AClass parent_class; + void (*method_c) (void); + void (*method_d) (void); +} BClass; + + The C standard mandates that the first field of a C structure is stored starting + in the first byte of the buffer used to hold the structure's fields in memory. + This means that the first field of an instance of an object B is A's first field + which in turn is GTypeInstance's first field which in turn is g_class, a pointer + to B's class structure. + + + + Thanks to these simple conditions, it is possible to detect the type of every + object instance by doing: + +B *b; +b->parent.parent.g_class->g_type + + or, more quickly: + +B *b; +((GTypeInstance*)b)->g_class->g_type + + + + + Initialization and Destruction + + + instantiation of these types can be done with + g_type_create_instance: + +GTypeInstance* g_type_create_instance (GType type); +void g_type_free_instance (GTypeInstance *instance); + + g_type_create_instance will look up the type information + structure associated to the type requested. Then, the instance size and instantiation + policy (if the n_preallocs field is set to a non-zero value, the type system allocates + the object's instance structures in chunks rather than mallocing for every instance) + declared by the user are used to get a buffer to hold the object's instance + structure. + + + + If this is the first instance of the object ever created, the type system must create + a class structure: it allocates a buffer to hold the object's class structure and + initializes it. It first copies the parent's class structure over this structure + (if there is no parent, it initializes it to zero). It then invokes the + base_class_initialization functions (GBaseInitFunc) from topmost + fundamental object to bottom-most most derived object. The object's class_init + (GClassInitFunc) function is invoked afterwards to complete + initialization of the class structure. + Finally, the object's interfaces are initialized (we will discuss interface initialization + in more detail later). + + + + Once the type system has a pointer to an initialized class structure, it sets the object's + instance class pointer to the object's class structure and invokes the object's + instance_init (GInstanceInitFunc)functions, from top-most fundamental + type to bottom-most most derived type. + + + + Object instance destruction through g_type_free_instance is very simple: + the instance structure is returned to the instance pool if there is one and if this was the + last living instance of the object, the class is destroyed. + + + + + Class destruction (the concept of destruction is sometimes partly + referred to as finalization in GType) is the symmetric process of + the initialization: interfaces are destroyed first. + Then, the most derived + class_finalize (ClassFinalizeFunc) function is invoked. The + base_class_finalize (GBaseFinalizeFunc) functions are + Finally invoked from bottom-most most-derived type to top-most fundamental type and + the class structure is freed. + + + + As many readers have now understood it, the base initialization/finalization process is + very similar to the C++ constructor/destructor paradigm. The practical details are different + though and it is important not to get confused by superficial similarities. + GTypes have no instance destruction mechanism. It is + the user's responsibility to implement correct destruction semantics on top + of the existing GType code. (this is what GObject does. See + ) + Furthermore, C++ code equivalent to the base_init + and class_init callbacks of GType is usually not needed because C++ cannot really create object + types at runtime. + + + + The instantiation/finalization process can be summarized as follows: + + GType Instantiation/Finalization + + + + + + + + Invocation time + Function Invoked + Function's parameters + + + + + First call to g_type_create_instance for target type + type's base_init function + On the inheritance tree of classes from fundamental type to target type. + base_init is invoked once for each class structure. + + + + target type's class_init function + On target type's class structure + + + + interface initialization, see + + + + + Each call to g_type_create_instance for target type + target type's instance_init function + On object's instance + + + Last call to g_type_free_instance for target type + interface destruction, see + + + + + + target type's class_finalize function + On target type's class structure + + + + type's base_finalize function + On the inheritance tree of classes from fundamental type to target type. + base_finalize is invoked once for each class structure. + + + +
+
+ +
+ +
+ + + Non-instantiable classed types: interfaces + + + GType's interfaces are very similar to Java's interfaces. They allow + to describe a common API that several classes will adhere to. + Imagine the play, pause and stop buttons on hi-fi equipment - those can + be seen as a playback interface. Once you know what they do, you can + control your CD player, MP3 player or anything that uses these symbols. + To declare an interface you have to register a non-instantiable + classed type which derives from + GTypeInterface. The following piece of code declares such an interface. + +#define MAMAN_IBAZ_TYPE (maman_ibaz_get_type ()) +#define MAMAN_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_IBAZ_TYPE, MamanIbaz)) +#define MAMAN_IS_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_IBAZ_TYPE)) +#define MAMAN_IBAZ_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_IBAZ_TYPE, MamanIbazInterface)) + +typedef struct _MamanIbaz MamanIbaz; /* dummy object */ +typedef struct _MamanIbazInterface MamanIbazInterface; + +struct _MamanIbazInterface { + GTypeInterface parent; + + void (*do_action) (MamanIbaz *self); +}; + +GType maman_ibaz_get_type (void); + +void maman_ibaz_do_action (MamanIbaz *self); + + The interface function, maman_ibaz_do_action is implemented + in a pretty simple way: + +void maman_ibaz_do_action (MamanIbaz *self) +{ + MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self); +} + + maman_ibaz_get_type registers a type named MamanIBaz + which inherits from G_TYPE_INTERFACE. All interfaces must be children of G_TYPE_INTERFACE in the + inheritance tree. + + + + An interface is defined by only one structure which must contain as first member + a GTypeInterface structure. The interface structure is expected to + contain the function pointers of the interface methods. It is good style to + define helper functions for each of the interface methods which simply call + the interface' method directly: maman_ibaz_do_action + is one of these. + + + + Once an interface type is registered, you must register implementations for these + interfaces. The function named maman_baz_get_type registers + a new GType named MamanBaz which inherits from GObject and which + implements the interface MamanIBaz. + +static void maman_baz_do_action (MamanIbaz *self) +{ + g_print ("Baz implementation of IBaz interface Action.\n"); +} + + +static void +baz_interface_init (gpointer g_iface, + gpointer iface_data) +{ + MamanIbazInterface *iface = (MamanIbazInterface *)g_iface; + iface->do_action = maman_baz_do_action; +} + +GType +maman_baz_get_type (void) +{ + static GType type = 0; + if (type == 0) { + static const GTypeInfo info = { + sizeof (MamanBazInterface), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (MamanBaz), + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + static const GInterfaceInfo ibaz_info = { + (GInterfaceInitFunc) baz_interface_init, /* interface_init */ + NULL, /* interface_finalize */ + NULL /* interface_data */ + }; + type = g_type_register_static (G_TYPE_OBJECT, + "MamanBazType", + &info, 0); + g_type_add_interface_static (type, + MAMAN_IBAZ_TYPE, + &ibaz_info); + } + return type; +} + + + + + g_type_add_interface_static records in the type system that + a given type implements also FooInterface + (foo_interface_get_type returns the type of + FooInterface). + The GInterfaceInfo structure holds + information about the implementation of the interface: + +struct _GInterfaceInfo +{ + GInterfaceInitFunc interface_init; + GInterfaceFinalizeFunc interface_finalize; + gpointer interface_data; +}; + + + + When having no special requirements you also can use the G_DEFINE_INTERFACE macro: + +G_DEFINE_INTERFACE (MamanBaz, maman_baz, G_TYPE_OBJECT) + + + + + + Interface Initialization + + + When an instantiable classed type which registered an interface + implementation is created for the first time, its class structure + is initialized following the process + described in . + After that, the interface implementations associated with + the type are initialized. + + + + First a memory buffer is allocated to hold the interface structure. The parent's + interface structure is then copied over to the new interface structure (the parent + interface is already initialized at that point). If there is no parent interface, + the interface structure is initialized with zeros. The g_type and the g_instance_type + fields are then initialized: g_type is set to the type of the most-derived interface + and g_instance_type is set to the type of the most derived type which implements + this interface. + + + + Finally, the interface' most-derived base_init function and then + the implementation's interface_init + function are invoked. It is important to understand that if there are multiple + implementations of an interface the base_init and + interface_init functions will be + invoked once for each implementation initialized. + + + + It is thus common for base_init functions to hold a local static boolean variable + which makes sure that the interface type is initialized only once even if there are + multiple implementations of the interface: + +static void +maman_ibaz_base_init (gpointer g_iface) +{ + static gboolean initialized = FALSE; + + if (!initialized) { + /* create interface signals here. */ + initialized = TRUE; + } +} + + + + + If you have found the stuff about interface hairy, you are right: it is hairy but + there is not much I can do about it. What I can do is summarize what you need to know + about interfaces: + + + + The above process can be summarized as follows: + + Interface Initialization + + + + + + + + Invocation time + Function Invoked + Function's parameters + Remark + + + + + First call to g_type_create_instance for type + implementing interface + + interface' base_init function + On interface' vtable + Register interface' signals here (use a local static + boolean variable as described above to make sure not to register them + twice.). + + + + interface' interface_init function + On interface' vtable + + Initialize interface' implementation. That is, initialize the interface + method pointers in the interface structure to the function's implementation. + + + + +
+ It is highly unlikely (i.e. I do not know of anyone who actually + used it) you will ever need other more fancy things such as the ones described in the + following section (). +
+ +
+ + + Interface Destruction + + + When the last instance of an instantiable type which registered + an interface implementation is destroyed, the interface's + implementations associated to the type are destroyed. + + + + To destroy an interface implementation, GType first calls the + implementation's interface_finalize function + and then the interface's most-derived + base_finalize function. + + + + Again, it is important to understand, as in + , + that both interface_finalize and base_finalize + are invoked exactly once for the destruction of each implementation of an interface. Thus, + if you were to use one of these functions, you would need to use a static integer variable + which would hold the number of instances of implementations of an interface such that + the interface's class is destroyed only once (when the integer variable reaches zero). + + + + The above process can be summarized as follows: + + Interface Finalization + + + + + + + + Invocation time + Function Invoked + Function's parameters + + + + + Last call to g_type_free_instance for type + implementing interface + + interface' interface_finalize function + On interface' vtable + + + + interface' base_finalize function + On interface' vtable + + + +
+
+
+
+
diff --git a/docs/reference/gobject/tut_howto.xml b/docs/reference/gobject/tut_howto.xml new file mode 100644 index 0000000..d428168 --- /dev/null +++ b/docs/reference/gobject/tut_howto.xml @@ -0,0 +1,1720 @@ + + + + Tutorial + + + This chapter tries to answer the real-life questions of users and presents + the most common scenario use cases I could come up with. + The use cases are presented from most likely to less likely. + + + + + How to define and implement a new GObject + + + Clearly, this is one of the most common questions people ask: they just + want to crank code and implement a subclass of a GObject. Sometimes because + they want to create their own class hierarchy, sometimes because they want + to subclass one of GTK+'s widget. This chapter will focus on the + implementation of a subtype of GObject. + + + + Boilerplate header code + + + The first step before writing the code for your GObject is to write the + type's header which contains the needed type, function and macro + definitions. Each of these elements is nothing but a convention which + is followed not only by GTK+'s code but also by most users of GObject. + If you feel the need not to obey the rules stated below, think about it + twice: + + If your users are a bit accustomed to GTK+ code or any + GLib code, they will be a bit surprised and getting used to the + conventions you decided upon will take time (money) and will make them + grumpy (not a good thing) + You must assess the fact that these conventions might + have been designed by both smart and experienced people: maybe they + were at least partly right. Try to put your ego aside. + + + + + Pick a name convention for your headers and source code and stick to it: + + use a dash to separate the prefix from the typename: + maman-bar.h and maman-bar.c + (this is the convention used by Nautilus and most GNOME libraries). + use an underscore to separate the prefix from the + typename: maman_bar.h and + maman_bar.c. + Do not separate the prefix from the typename: + mamanbar.h and mamanbar.c. + (this is the convention used by GTK+) + + I personally like the first solution better: it makes reading file names + easier for those with poor eyesight like me. + + + + When you need some private (internal) declarations in several + (sub)classes, you can define them in a private header file which + is often named by appending the private keyword + to the public header name. For example, one could use + maman-bar-private.h, + maman_bar_private.h or + mamanbarprivate.h. Typically, such private header + files are not installed. + + + + The basic conventions for any header which exposes a GType are described + in . Most GObject-based code also + obeys one of of the following conventions: pick one and stick to it. + + + If you want to declare a type named bar with prefix maman, name the type instance + MamanBar and its class MamanBarClass + (name is case-sensitive). It is customary to declare them with code similar to the + following: + +/* + * Copyright/Licensing information. + */ + +/* inclusion guard */ +#ifndef __MAMAN_BAR_H__ +#define __MAMAN_BAR_H__ + +#include <glib-object.h> +/* + * Potentially, include other headers on which this header depends. + */ + +/* + * Type macros. + */ +#define MAMAN_TYPE_BAR (maman_bar_get_type ()) +#define MAMAN_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar)) +#define MAMAN_IS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR)) +#define MAMAN_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass)) +#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR)) +#define MAMAN_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass)) + +typedef struct _MamanBar MamanBar; +typedef struct _MamanBarClass MamanBarClass; + +struct _MamanBar +{ + GObject parent_instance; + + /* instance members */ +}; + +struct _MamanBarClass +{ + GObjectClass parent_class; + + /* class members */ +}; + +/* used by MAMAN_TYPE_BAR */ +GType maman_bar_get_type (void); + +/* + * Method definitions. + */ + +#endif /* __MAMAN_BAR_H__ */ + + + + Most GTK+ types declare their private fields in the public header + with a /* private */ comment, relying on their user's intelligence + not to try to play with these fields. Fields not marked private + are considered public by default. The /* protected */ comment + (same semantics as those of C++) is also used, mainly in the GType + library, in code written by Tim Janik. + +struct _MamanBar +{ + GObject parent_instance; + + /*< private >*/ + int hsize; +}; + + + + All of Nautilus code and a lot of GNOME libraries use private + indirection members, as described by Herb Sutter in his Pimpl + articles(see Compilation Firewalls + and The Fast Pimpl Idiom: + he summarizes the different issues better than I will). + +typedef struct _MamanBarPrivate MamanBarPrivate; + +struct _MamanBar +{ + GObject parent_instance; + + /*< private >*/ + MamanBarPrivate *priv; +}; + + Do not call this private, as + that is a registered c++ keyword. + + The private structure is then defined in the .c file, using the + g_type_class_add_private() function to notify the presence of + a private memory area for each instance and it can either + be retrieved using G_TYPE_INSTANCE_GET_PRIVATE() + each time is needed, or assigned to the priv + member of the instance structure inside the object's + init function. + +#define MAMAN_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MAMAN_TYPE_BAR, MamanBarPrivate)) + +struct _MamanBarPrivate +{ + int hsize; +} + +static void +maman_bar_class_init (MamanBarClass *klass) +{ + g_type_class_add_private (klass, sizeof (MamanBarPrivate)); +} + +static void +maman_bar_init (MamanBar *self) +{ + MamanBarPrivate *priv; + + self->priv = priv = MAMAN_BAR_GET_PRIVATE (self); + + priv->hsize = 42; +} + + + + + You don't need to free or allocate the private structure, only the + objects or pointers that it may contain. Another advantage of this + to the previous version is that is lessens memory fragmentation, + as the public and private parts of the instance memory are + allocated at once. + + + + + + Finally, there are different header include conventions. Again, pick one + and stick to it. I personally use indifferently any of the two, depending + on the codebase I work on: the rule, as always, is consistency. + + + Some people add at the top of their headers a number of #include + directives to pull in all the headers needed to compile client + code. This allows client code to simply #include "maman-bar.h". + + + Other do not #include anything and expect the client to #include + themselves the headers they need before including your header. This + speeds up compilation because it minimizes the amount of + pre-processor work. This can be used in conjunction with the + re-declaration of certain unused types in the client code to + minimize compile-time dependencies and thus speed up compilation. + + + + + + + + Boilerplate code + + + In your code, the first step is to #include the needed headers: depending + on your header include strategy, this can be as simple as + #include "maman-bar.h" or as complicated as tens + of #include lines ending with #include "maman-bar.h": + +/* + * Copyright information + */ + +#include "maman-bar.h" + +/* If you use Pimpls, include the private structure + * definition here. Some people create a maman-bar-private.h header + * which is included by the maman-bar.c file and which contains the + * definition for this private structure. + */ +struct _MamanBarPrivate { + int member_1; + /* stuff */ +}; + +/* + * forward definitions + */ + + + + + Call the G_DEFINE_TYPE macro using the name + of the type, the prefix of the functions and the parent GType to + reduce the amount of boilerplate needed. This macro will: + + + implement the maman_bar_get_type + function + define a parent class pointer accessible from + the whole .c file + + + +G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT); + + + + + It is also possible to use the + G_DEFINE_TYPE_WITH_CODE macro to control the + get_type function implementation - for instance, to add a call to + G_IMPLEMENT_INTERFACE macro which will + call the g_type_implement_interface function. + + + + + Object Construction + + + People often get confused when trying to construct their GObjects because of the + sheer number of different ways to hook into the objects's construction process: it is + difficult to figure which is the correct, recommended way. + + + + shows what user-provided functions + are invoked during object instantiation and in which order they are invoked. + A user looking for the equivalent of the simple C++ constructor function should use + the instance_init method. It will be invoked after all the parent's instance_init + functions have been invoked. It cannot take arbitrary construction parameters + (as in C++) but if your object needs arbitrary parameters to complete initialization, + you can use construction properties. + + + + Construction properties will be set only after all instance_init functions have run. + No object reference will be returned to the client of g_object_new + until all the construction properties have been set. + + + + As such, I would recommend writing the following code first: + +static void +maman_bar_init (MamanBar *self) +{ + self->priv = MAMAN_BAR_GET_PRIVATE (self); + + /* initialize all public and private members to reasonable default values. */ + + /* If you need specific construction properties to complete initialization, + * delay initialization completion until the property is set. + */ +} + + + + + Now, if you need special construction properties, install the properties in the class_init function, + override the set and get methods and implement the get and set methods as described in + . Make sure that these properties use a construct only + GParamSpec by setting the param spec's flag field to G_PARAM_CONSTRUCT_ONLY: this helps + GType ensure that these properties are not set again later by malicious user code. + +static void +bar_class_init (MamanBarClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GParamSpec *maman_param_spec; + + gobject_class->set_property = bar_set_property; + gobject_class->get_property = bar_get_property; + + maman_param_spec = g_param_spec_string ("maman", + "Maman construct prop", + "Set maman's name", + "no-name-set" /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, + PROP_MAMAN, + maman_param_spec); +} + + If you need this, make sure you can build and run code similar to the code shown above. Make sure + your construct properties can set correctly during construction, make sure you cannot set them + afterwards and make sure that if your users do not call g_object_new + with the required construction properties, these will be initialized with the default values. + + + + I consider good taste to halt program execution if a construction property is set its + default value. This allows you to catch client code which does not give a reasonable + value to the construction properties. Of course, you are free to disagree but you + should have a good reason to do so. + + + + Some people sometimes need to construct their object but only after + the construction properties have been set. This is possible through + the use of the constructor class method as described in + or, more simply, using + the constructed class method available since GLib 2.12. + + + + + Object Destruction + + + Again, it is often difficult to figure out which mechanism to use to + hook into the object's destruction process: when the last + g_object_unref + function call is made, a lot of things happen as described in + . + + + + The destruction process of your object might be split in two different + phases: dispose and the finalize. + +#define MAMAN_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MAMAN_TYPE_BAR, MamanBarPrivate)) + +struct _MamanBarPrivate +{ + GObject *an_object; + + gchar *a_string; +}; + +G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT); + +static void +maman_bar_dispose (GObject *gobject) +{ + MamanBar *self = MAMAN_BAR (gobject); + + /* + * In dispose, you are supposed to free all types referenced from this + * object which might themselves hold a reference to self. Generally, + * the most simple solution is to unref all members on which you own a + * reference. + */ + + /* dispose might be called multiple times, so we must guard against + * calling g_object_unref() on an invalid GObject. + */ + if (self->priv->an_object) + { + g_object_unref (self->priv->an_object); + + self->priv->an_object = NULL; + } + + /* Chain up to the parent class */ + G_OBJECT_CLASS (maman_bar_parent_class)->dispose (gobject); +} + +static void +maman_bar_finalize (GObject *gobject) +{ + MamanBar *self = MAMAN_BAR (gobject); + + g_free (self->priv->a_string); + + /* Chain up to the parent class */ + G_OBJECT_CLASS (maman_bar_parent_class)->finalize (gobject); +} + +static void +maman_bar_class_init (MamanBarClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->dispose = maman_bar_dispose; + gobject_class->finalize = maman_bar_finalize; + + g_type_class_add_private (klass, sizeof (MamanBarPrivate)); +} + +static void +maman_bar_init (MamanBar *self); +{ + self->priv = MAMAN_BAR_GET_PRIVATE (self); + + self->priv->an_object = g_object_new (MAMAN_TYPE_BAZ, NULL); + self->priv->a_string = g_strdup ("Maman"); +} + + + + + Add similar code to your GObject, make sure the code still builds + and runs: dispose and finalize must be called during the last unref. + + + + It is possible that object methods might be invoked after dispose is + run and before finalize runs. GObject does not consider this to be a + program error: you must gracefully detect this and neither crash nor + warn the user. + + + + + Object methods + + + Just as with C++, there are many different ways to define object + methods and extend them: the following list and sections draw on + C++ vocabulary. (Readers are expected to know basic C++ buzzwords. + Those who have not had to write C++ code recently can refer to e.g. + to refresh + their memories.) + + + non-virtual public methods, + + + virtual public methods and + + + virtual private methods + + + + + + Non-virtual public methods + + + These are the simplest: you want to provide a simple method which + can act on your object. All you need to do is to provide a function + prototype in the header and an implementation of that prototype + in the source file. + +/* declaration in the header. */ +void maman_bar_do_action (MamanBar *self, /* parameters */); + +/* implementation in the source file */ +void +maman_bar_do_action (MamanBar *self, /* parameters */) +{ + g_return_if_fail (MAMAN_IS_BAR (self)); + + /* do stuff here. */ +} + + + + There is really nothing scary about this. + + + + Virtual public methods + + + This is the preferred way to create polymorphic GObjects. All you + need to do is to define the common method and its class function in + the public header, implement the common method in the source file + and re-implement the class function in each object which inherits + from you. + +/* declaration in maman-bar.h. */ +struct _MamanBarClass +{ + GObjectClass parent_class; + + /* stuff */ + void (*do_action) (MamanBar *self, /* parameters */); +}; + +void maman_bar_do_action (MamanBar *self, /* parameters */); + +/* implementation in maman-bar.c */ +void +maman_bar_do_action (MamanBar *self, /* parameters */) +{ + g_return_if_fail (MAMAN_IS_BAR (self)); + + MAMAN_BAR_GET_CLASS (self)->do_action (self, /* parameters */); +} + + The code above simply redirects the do_action call to the relevant + class function. Some users, concerned about performance, do not + provide the maman_bar_do_action wrapper function + and require users to dereference the class pointer themselves. This + is not such a great idea in terms of encapsulation and makes it + difficult to change the object's implementation afterwards, should + this be needed. + + + + Other users, also concerned by performance issues, declare + the maman_bar_do_action function inline in the + header file. This, however, makes it difficult to change the + object's implementation later (although easier than requiring users + to directly dereference the class function) and is often difficult + to write in a portable way (the inline keyword + is part of the C99 standard but not every compiler supports it). + + + + In doubt, unless a user shows you hard numbers about the performance + cost of the function call, just implement maman_bar_do_action + in the source file. + + + + Please, note that it is possible for you to provide a default + implementation for this class method in the object's + class_init function: initialize the + klass->do_action field to a pointer to the actual implementation. + You can also make this class method pure virtual by initializing + the klass->do_action field to NULL: + +static void +maman_bar_real_do_action_two (MamanBar *self, /* parameters */) +{ + /* Default implementation for the virtual method. */ +} + +static void +maman_bar_class_init (BarClass *klass) +{ + /* pure virtual method: mandates implementation in children. */ + klass->do_action_one = NULL; + + /* merely virtual method. */ + klass->do_action_two = maman_bar_real_do_action_two; +} + +void +maman_bar_do_action_one (MamanBar *self, /* parameters */) +{ + g_return_if_fail (MAMAN_IS_BAR (self)); + + MAMAN_BAR_GET_CLASS (self)->do_action_one (self, /* parameters */); +} + +void +maman_bar_do_action_two (MamanBar *self, /* parameters */) +{ + g_return_if_fail (MAMAN_IS_BAR (self)); + + MAMAN_BAR_GET_CLASS (self)->do_action_two (self, /* parameters */); +} + + + + + + Virtual private Methods + + + These are very similar to Virtual Public methods. They just don't + have a public function to call the function directly. The header + file contains only a declaration of the class function: + +/* declaration in maman-bar.h. */ +struct _MamanBarClass +{ + GObjectClass parent; + + /* stuff */ + void (* helper_do_specific_action) (MamanBar *self, /* parameters */); +}; + +void maman_bar_do_any_action (MamanBar *self, /* parameters */); + + These class functions are often used to delegate part of the job + to child classes: + +/* this accessor function is static: it is not exported outside of this file. */ +static void +maman_bar_do_specific_action (MamanBar *self, /* parameters */) +{ + MAMAN_BAR_GET_CLASS (self)->do_specific_action (self, /* parameters */); +} + +void +maman_bar_do_any_action (MamanBar *self, /* parameters */) +{ + /* random code here */ + + /* + * Try to execute the requested action. Maybe the requested action + * cannot be implemented here. So, we delegate its implementation + * to the child class: + */ + maman_bar_do_specific_action (self, /* parameters */); + + /* other random code here */ +} + + + + + Again, it is possible to provide a default implementation for this + private virtual class function: + +static void +maman_bar_class_init (MamanBarClass *klass) +{ + /* pure virtual method: mandates implementation in children. */ + klass->do_specific_action_one = NULL; + + /* merely virtual method. */ + klass->do_specific_action_two = maman_bar_real_do_specific_action_two; +} + + + + + Children can then implement the subclass with code such as: + +static void +maman_bar_subtype_class_init (MamanBarSubTypeClass *klass) +{ + MamanBarClass *bar_class = MAMAN_BAR_CLASS (klass); + + /* implement pure virtual class function. */ + bar_class->do_specific_action_one = maman_bar_subtype_do_specific_action_one; +} + + + + + + + Chaining up + + Chaining up is often loosely defined by the following set of + conditions: + + Parent class A defines a public virtual method named foo and + provides a default implementation. + Child class B re-implements method foo. + In the method B::foo, the child class B calls its parent class method A::foo. + + There are many uses to this idiom: + + You need to change the behaviour of a class without modifying its code. You create + a subclass to inherit its implementation, re-implement a public virtual method to modify the behaviour + slightly and chain up to ensure that the previous behaviour is not really modified, just extended. + + You are lazy, you have access to the source code of the parent class but you don't want + to modify it to add method calls to new specialized method calls: it is faster to hack the child class + to chain up than to modify the parent to call down. + You need to implement the Chain Of Responsibility pattern: each object of the inheritance + tree chains up to its parent (typically, at the beginning or the end of the method) to ensure that + they each handler is run in turn. + + I am personally not really convinced any of the last two uses are really a good idea but since this + programming idiom is often used, this section attempts to explain how to implement it. + + + + To explicitly chain up to the implementation of the virtual method in the parent class, + you first need a handle to the original parent class structure. This pointer can then be used to + access the original class function pointer and invoke it directly. + + + The original adjective used in this sentence is not innocuous. To fully + understand its meaning, you need to recall how class structures are initialized: for each object type, + the class structure associated to this object is created by first copying the class structure of its + parent type (a simple memcpy) and then by invoking the class_init callback on + the resulting class structure. Since the class_init callback is responsible for overwriting the class structure + with the user re-implementations of the class methods, we cannot merely use the modified copy of the parent class + structure stored in our derived instance. We want to get a copy of the class structure of an instance of the parent + class. + + + + + The function g_type_class_peek_parent is used to access the original parent + class structure. Its input is a pointer to the class of the derived object and it returns a pointer + to the original parent class structure. The code below shows how you could use it: + +static void +b_method_to_call (B *obj, int a) +{ + BClass *klass; + AClass *parent_class; + + klass = B_GET_CLASS (obj); + parent_class = g_type_class_peek_parent (klass); + + /* do stuff before chain up */ + + parent_class->method_to_call (obj, a); + + /* do stuff after chain up */ +} + + + + + + + + + + How to define and implement interfaces + + + How to define interfaces + + + The bulk of interface definition has already been shown in + but I feel it is needed to show exactly how to create an interface. + + + + As above, the first step is to get the header right: + +#ifndef __MAMAN_IBAZ_H__ +#define __MAMAN_IBAZ_H__ + +#include <glib-object.h> + +#define MAMAN_TYPE_IBAZ (maman_ibaz_get_type ()) +#define MAMAN_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_IBAZ, MamanIbaz)) +#define MAMAN_IS_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_IBAZ)) +#define MAMAN_IBAZ_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_TYPE_IBAZ, MamanIbazInterface)) + + +typedef struct _MamanIbaz MamanIbaz; /* dummy object */ +typedef struct _MamanIbazInterface MamanIbazInterface; + +struct _MamanIbazInterface +{ + GTypeInterface parent_iface; + + void (*do_action) (MamanIbaz *self); +}; + +GType maman_ibaz_get_type (void); + +void maman_ibaz_do_action (MamanIbaz *self); + +#endif /* __MAMAN_IBAZ_H__ */ + + This code is the same as the code for a normal GType + which derives from a GObject except for a few details: + + + The _GET_CLASS macro is called _GET_INTERFACE + and not implemented with G_TYPE_INSTANCE_GET_CLASS + but with G_TYPE_INSTANCE_GET_INTERFACE. + + + The instance type, MamanIbaz is not fully defined: it is + used merely as an abstract type which represents an instance of + whatever object which implements the interface. + + + The parent of the MamanIbazInterface is not + GObjectClass but GTypeInterface. + + + + + + The implementation of the MamanIbaz type itself is trivial: + + maman_ibaz_get_type registers the + type in the type system. + + maman_ibaz_base_init is expected + to register the interface's signals if there are any (we will see a bit + (later how to use them). Make sure to use a static local boolean variable + to make sure not to run the initialization code twice (as described in + , + base_init is run once for each interface implementation + instantiation) + maman_ibaz_do_action dereferences + the class structure to access its associated class function and calls it. + + + +static void +maman_ibaz_base_init (gpointer g_class) +{ + static gboolean is_initialized = FALSE; + + if (!is_initialized) + { + /* add properties and signals to the interface here */ + + is_initialized = TRUE; + } +} + +GType +maman_ibaz_get_type (void) +{ + static GType iface_type = 0; + if (iface_type == 0) + { + static const GTypeInfo info = { + sizeof (MamanIbazInterface), + maman_ibaz_base_init, /* base_init */ + NULL, /* base_finalize */ + }; + + iface_type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbaz", + &info, 0); + } + + return iface_type; +} + +void +maman_ibaz_do_action (MamanIbaz *self) +{ + g_return_if_fail (MAMAN_IS_IBAZ (self)); + + MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self); +} + + + + + + How To define implement an Interface? + + + Once the interface is defined, implementing it is rather trivial. + + + + The first step is to define a normal GObject class, like: + +#ifndef __MAMAN_BAZ_H__ +#define __MAMAN_BAZ_H__ + +#include <glib-object.h> + +#define MAMAN_TYPE_BAZ (maman_baz_get_type ()) +#define MAMAN_BAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAZ, Mamanbaz)) +#define MAMAN_IS_BAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAZ)) +#define MAMAN_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAZ, MamanbazClass)) +#define MAMAN_IS_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAZ)) +#define MAMAN_BAZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAZ, MamanbazClass)) + + +typedef struct _MamanBaz MamanBaz; +typedef struct _MamanBazClass MamanBazClass; + +struct _MamanBaz +{ + GObject parent_instance; + + int instance_member; +}; + +struct _MamanBazClass +{ + GObjectClass parent_class; +}; + +GType maman_baz_get_type (void); + +#endif /* __MAMAN_BAZ_H__ */ + + There is clearly nothing specifically weird or scary about this header: + it does not define any weird API or derives from a weird type. + + + + The second step is to implement MamanBaz by defining + its GType. Instead of using G_DEFINE_TYPE we + use G_DEFINE_TYPE_WITH_CODE and the + G_IMPLEMENT_INTERFACE macros. + +static void maman_ibaz_interface_init (MamanIbazInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (MamanBar, maman_bar, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ, + maman_ibaz_interface_init)); + + This definition is very much like all the similar functions we looked + at previously. The only interface-specific code present here is the call + to G_IMPLEMENT_INTERFACE. + + + Classes can implement multiple interfaces by using multiple + calls to G_IMPLEMENT_INTERFACE inside the call + to G_DEFINE_TYPE_WITH_CODE. + + + maman_baz_interface_init, the interface + initialization function: inside it every virtual method of the interface + must be assigned to its implementation: + +static void +maman_baz_do_action (MamanBaz *self) +{ + g_print ("Baz implementation of IBaz interface Action: 0x%x.\n", + self->instance_member); +} + +static void +maman_ibaz_interface_init (MamanIbazInterface *iface) +{ + iface->do_action = baz_do_action; +} + +static void +maman_baz_init (MamanBaz *self) +{ + MamanBaz *self = MAMAN_BAZ (instance); + self->instance_member = 0xdeadbeaf; +} + + + + + + + Interface definition prerequisites + + + To specify that an interface requires the presence of other interfaces + when implemented, GObject introduces the concept of + prerequisites: it is possible to associate + a list of prerequisite interfaces to an interface. For example, if + object A wishes to implement interface I1, and if interface I1 has a + prerequisite on interface I2, A has to implement both I1 and I2. + + + + The mechanism described above is, in practice, very similar to + Java's interface I1 extends interface I2. The example below shows + the GObject equivalent: + + /* inside the GType function of the MamanIbar interface */ + type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbar", &info, 0); + + /* Make the MamanIbar interface require MamanIbaz interface. */ + g_type_interface_add_prerequisite (type, MAMAN_TYPE_IBAZ); + + The code shown above adds the MamanIbaz interface to the list of + prerequisites of MamanIbar while the code below shows how an + implementation can implement both interfaces and register their + implementations: + +static void +maman_ibar_do_another_action (MamanIbar *ibar) +{ + MamanBar *self = MAMAN_BAR (ibar); + + g_print ("Bar implementation of IBar interface Another Action: 0x%x.\n", + self->instance_member); +} + +static void +maman_ibar_interface_init (MamanIbarInterface *iface) +{ + iface->do_another_action = maman_ibar_do_another_action; +} + +static void +maman_ibaz_do_action (MamanIbaz *ibaz) +{ + MamanBar *self = MAMAN_BAR (ibaz); + + g_print ("Bar implementation of IBaz interface Action: 0x%x.\n", + self->instance_member); +} + +static void +maman_ibaz_interface_init (MamanIbazInterface *iface) +{ + iface->do_action = maman_ibaz_do_action; +} + +static void +maman_bar_class_init (MamanBarClass *klass) +{ + +} + +static void +maman_bar_init (MamanBar *self) +{ + self->instance_member = 0x666; +} + +G_DEFINE_TYPE_WITH_CODE (MamanBar, maman_bar, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ, + maman_ibaz_interface_init) + G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAR, + maman_ibar_interface_init)); + + It is very important to notice that the order in which interface + implementations are added to the main object is not random: + g_type_add_interface_static, + which is called by G_IMPLEMENT_INTERFACE, must be + invoked first on the interfaces which have no prerequisites and then on + the others. + + + + + Interface Properties + + + Starting from version 2.4 of GLib, GObject interfaces can also have + properties. Declaration of the interface properties is similar to + declaring the properties of ordinary GObject types as explained in + , + except that g_object_interface_install_property is used to + declare the properties instead of g_object_class_install_property. + + + + To include a property named 'name' of type string in the + maman_ibaz interface example code above, we only need to + add one + + + That really is one line extended to six for the sake of clarity + + + line in the maman_ibaz_base_init + + + The g_object_interface_install_property + can also be called from class_init but it must + not be called after that point. + + + as shown below: + +static void +maman_ibaz_base_init (gpointer g_iface) +{ + static gboolean is_initialized = FALSE; + + if (!is_initialized) + { + g_object_interface_install_property (g_iface, + g_param_spec_string ("name", + "Name", + "Name of the MamanIbaz", + "maman", + G_PARAM_READWRITE)); + is_initialized = TRUE; + } +} + + + + + One point worth noting is that the declared property wasn't assigned an + integer ID. The reason being that integer IDs of properties are used + only inside the get and set methods and since interfaces do not + implement properties, there is no need to assign integer IDs to + interface properties. + + + + An implementation shall declare and define it's properties in the usual + way as explained in , except for one + small change: it must declare the properties of the interface it + implements using g_object_class_override_property + instead of g_object_class_install_property. + The following code snippet shows the modifications needed in the + MamanBaz declaration and implementation above: + + +struct _MamanBaz +{ + GObject parent_instance; + + gint instance_member; + gchar *name; +}; + +enum +{ + PROP_0, + + PROP_NAME +}; + +static void +maman_baz_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + MamanBaz *baz = MAMAN_BAZ (object); + GObject *obj; + + switch (prop_id) + { + case ARG_NAME: + g_free (baz->name); + baz->name = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +maman_baz_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MamanBaz *baz = MAMAN_BAZ (object); + + switch (prop_id) + { + case ARG_NAME: + g_value_set_string (value, baz->name); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +maman_baz_class_init (MamanBazClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = maman_baz_set_property; + gobject_class->get_property = maman_baz_get_property; + + g_object_class_override_property (gobject_class, PROP_NAME, "name"); +} + + + + + + + + + + How to create and use signals + + + The signal system which was built in GType is pretty complex and + flexible: it is possible for its users to connect at runtime any + number of callbacks (implemented in any language for which a binding + exists) + + A Python callback can be connected to any signal on any + C-based GObject. + + + to any signal and to stop the emission of any signal at any + state of the signal emission process. This flexibility makes it + possible to use GSignal for much more than just emit signals which + can be received by numerous clients. + + + + Simple use of signals + + + The most basic use of signals is to implement simple event + notification: for example, if we have a MamanFile object, and + if this object has a write method, we might wish to be notified + whenever someone has changed something via our MamanFile instance. + The code below shows how the user can connect a callback to the + "changed" signal. + +file = g_object_new (MAMAN_FILE_TYPE, NULL); + +g_signal_connect (file, "changed", G_CALLBACK (changed_event), NULL); + +maman_file_write (file, buffer, strlen (buffer)); + + + + + The MamanFile signal is registered in the class_init + function: + +file_signals[CHANGED] = + g_signal_newv ("changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + NULL /* closure */, + NULL /* accumulator */, + NULL /* accumulator data */, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE /* return_type */, + 0 /* n_params */, + NULL /* param_types */); + + and the signal is emitted in maman_file_write: + +void +maman_file_write (MamanFile *self, + const guchar *buffer, + gssize size) +{ + /* First write data. */ + + /* Then, notify user of data written. */ + g_signal_emit (self, file_signals[CHANGED], 0 /* details */); +} + + As shown above, you can safely set the details parameter to zero if + you do not know what it can be used for. For a discussion of what you + could used it for, see + + + + The signature of the signal handler in the above example is defined as + g_cclosure_marshal_VOID__VOID. Its name follows + a simple convention which encodes the function parameter and return value + types in the function name. Specifically, the value in front of the + double underscore is the type of the return value, while the value(s) + after the double underscore denote the parameter types. + + + + The header gobject/gmarshal.h defines a set of + commonly needed closures that one can use. If you want to have complex + marshallers for your signals you should probably use glib-genmarshal + to autogenerate them from a file containing their return and + parameter types. + + + + + + + + + + + + + diff --git a/docs/reference/gobject/tut_intro.xml b/docs/reference/gobject/tut_intro.xml new file mode 100644 index 0000000..54d46dc --- /dev/null +++ b/docs/reference/gobject/tut_intro.xml @@ -0,0 +1,182 @@ + + + + Background + + + GObject, and its lower-level type system, GType, are used by GTK+ and most GNOME libraries to + provide: + + object-oriented C-based APIs and + automatic transparent API bindings to other compiled + or interpreted languages. + + + + + A lot of programmers are used to working with compiled-only or dynamically interpreted-only + languages and do not understand the challenges associated with cross-language interoperability. + This introduction tries to provide an insight into these challenges and briefly describes + the solution chosen by GLib. + + + + The following chapters go into greater detail into how GType and GObject work and + how you can use them as a C programmer. It is useful to keep in mind that + allowing access to C objects from other interpreted languages was one of the major design + goals: this can often explain the sometimes rather convoluted APIs and features present + in this library. + + + + Data types and programming + + + One could say (I have seen such definitions used in some textbooks on programming language theory) + that a programming language is merely a way to create data types and manipulate them. Most languages + provide a number of language-native types and a few primitives to create more complex types based + on these primitive types. + + + + In C, the language provides types such as char, long, + pointer. During compilation of C code, the compiler maps these + language types to the compiler's target architecture machine types. If you are using a C interpreter + (I have never seen one myself but it is possible :), the interpreter (the program which interprets + the source code and executes it) maps the language types to the machine types of the target machine at + runtime, during the program execution (or just before execution if it uses a Just In Time compiler engine). + + + + Perl and Python are interpreted languages which do not really provide type definitions similar + to those used by C. Perl and Python programmers manipulate variables and the type of the variables + is decided only upon the first assignment or upon the first use which forces a type on the variable. + The interpreter also often provides a lot of automatic conversions from one type to the other. For example, + in Perl, a variable which holds an integer can be automatically converted to a string given the + required context: + +my $tmp = 10; +print "this is an integer converted to a string:" . $tmp . "\n"; + + Of course, it is also often possible to explicitly specify conversions when the default conversions provided + by the language are not intuitive. + + + + + + Exporting a C API + + + C APIs are defined by a set of functions and global variables which are usually exported from a + binary. C functions have an arbitrary number of arguments and one return value. Each function is thus + uniquely identified by the function name and the set of C types which describe the function arguments + and return value. The global variables exported by the API are similarly identified by their name and + their type. + + + + A C API is thus merely defined by a set of names to which a set of types are associated. If you know the + function calling convention and the mapping of the C types to the machine types used by the platform you + are on, you can resolve the name of each function to find where the code associated to this function + is located in memory, and then construct a valid argument list for the function. Finally, all you have to + do is trigger a call to the target C function with the argument list. + + + + For the sake of discussion, here is a sample C function and the associated 32 bit x86 + assembly code generated by GCC on my Linux box: + +static void function_foo (int foo) +{} + +int main (int argc, char *argv[]) +{ + + function_foo (10); + + return 0; +} + +push $0xa +call 0x80482f4 <function_foo> + + The assembly code shown above is pretty straightforward: the first instruction pushes + the hexadecimal value 0xa (decimal value 10) as a 32-bit integer on the stack and calls + function_foo. As you can see, C function calls are implemented by + gcc by native function calls (this is probably the fastest implementation possible). + + + + Now, let's say we want to call the C function function_foo from + a Python program. To do this, the Python interpreter needs to: + + Find where the function is located. This probably means finding the binary generated by the C compiler + which exports this function. + Load the code of the function in executable memory. + Convert the Python parameters to C-compatible parameters before calling + the function. + Call the function with the right calling convention. + Convert the return values of the C function to Python-compatible + variables to return them to the Python code. + + + + + The process described above is pretty complex and there are a lot of ways to make it entirely automatic + and transparent to C and Python programmers: + + The first solution is to write by hand a lot of glue code, once for each function exported or imported, + which does the Python-to-C parameter conversion and the C-to-Python return value conversion. This glue code is then + linked with the interpreter which allows Python programs to call Python functions which delegate work to + C functions. + Another, nicer solution is to automatically generate the glue code, once for each function exported or + imported, with a special compiler which + reads the original function signature. + The solution used by GLib is to use the GType library which holds at runtime a description of + all the objects manipulated by the programmer. This so-called dynamic type + + + There are numerous different implementations of dynamic type systems: all C++ + compilers have one, Java and .NET have one too. A dynamic type system allows you + to get information about every instantiated object at runtime. It can be implemented + by a process-specific database: every new object created registers the characteristics + of its associated type in the type system. It can also be implemented by introspection + interfaces. The common point between all these different type systems and implementations + is that they all allow you to query for object metadata at runtime. + + + library is then used by special generic glue code to automatically convert function parameters and + function calling conventions between different runtime domains. + + The greatest advantage of the solution implemented by GType is that the glue code sitting at the runtime domain + boundaries is written once: the figure below states this more clearly. +
+ + + + + + + + +
+ + Currently, there exist at least Python and Perl generic glue code which makes it possible to use + C objects written with GType directly in Python or Perl, with a minimum amount of work: there + is no need to generate huge amounts of glue code either automatically or by hand. +
+ + + Although that goal was arguably laudable, its pursuit has had a major influence on + the whole GType/GObject library. C programmers are likely to be puzzled at the complexity + of the features exposed in the following chapters if they forget that the GType/GObject library + was not only designed to offer OO-like features to C programmers but also transparent + cross-language interoperability. + + +
+ +
diff --git a/docs/reference/gobject/tut_tools.xml b/docs/reference/gobject/tut_tools.xml new file mode 100644 index 0000000..b344abb --- /dev/null +++ b/docs/reference/gobject/tut_tools.xml @@ -0,0 +1,132 @@ + + + + Related Tools + + + + Several useful developer tools have been build around GObject + technology. The next sections briefly introduce them and link to + the respective project pages. + + + + For example, writing GObjects is often seen as a tedious task. It + requires a lot of typing and just doing a copy/paste requires a + great deal of care. A lot of projects and scripts have been + written to generate GObject skeleton form boilerplate code, or + even translating higher-level language into plain C. + + + + + Vala + + From the Vala + homepage itself: Vala is a new programming language + that aims to bring modern programming language features to GNOME + developers without imposing any additional runtime requirements + and without using a different ABI compared to applications and + libraries written in C. + + + + The syntax of Vala is similar to C#. The available compiler + translates Vala into GObject C code. It can also compile + non-GObject C, using plain C API. + + + + + GObject builder + + + In order to help a GObject class developper, one obvious idea is + to use some sort of templates for the skeletons. and then run + them through a special tool to generate the real C files. GOB (or GOB2) is + such a tool. It is a preprocessor which can be used to build + GObjects with inline C code so that there is no need to edit the + generated C code. The syntax is inspired by Java and Yacc or + Lex. The implementation is intentionally kept simple: the inline C + code provided by the user is not parsed. + + + + + Graphical inspection of GObjects + + + Yet another tool that you may find helpful when working with + GObjects is G-Inspector. It + is able to display GLib/GTK+ objects and their properties. + + + + + Debugging reference count problems + + + The reference counting scheme used by GObject does solve quite + a few memory management problems but also introduces new sources of bugs. + In large applications, finding the exact spot where the reference count + of an Object is not properly handled can be very difficult. Hopefully, + there exist a tool named refdbg + which can be used to automate the task of tracking down the location + of invalid code with regard to reference counting. This application + intercepts the reference counting calls and tries to detect invalid behavior. + It supports a filter-rule mechanism to let you trace only the objects you are + interested in and it can be used together with GDB. + + + g_trap_object_ref + Note that if GObject has been compiled with , + it exports a trap variable + +static volatile GObject *g_trap_object_ref; + + If set to a non-NULL value, g_object_ref() + and g_object_unref() will be intercepted + when called with that value. + + + + + Writing API docs + + The API documentation for most of the GLib, GObject, GTK+ and GNOME + libraries is built with a combination of complex tools. Typically, the part of + the documentation which describes the behavior of each function is extracted + from the specially-formatted source code comments by a tool named gtk-doc which + generates DocBook XML and merges this DocBook XML with a set of master XML + DocBook files. These XML DocBook files are finally processed with xsltproc + (a small program part of the libxslt library) to generate the final HTML + output. Other tools can be used to generate PDF output from the source XML. + The following code excerpt shows what these comments look like. + +/** + * gtk_widget_freeze_child_notify: + * @widget: a #GtkWidget + * + * Stops emission of "child-notify" signals on @widget. The signals are + * queued until gtk_widget_thaw_child_notify() is called on @widget. + * + * This is the analogue of g_object_freeze_notify() for child properties. + **/ +void +gtk_widget_freeze_child_notify (GtkWidget *widget) +{ +... + + + + Thorough + documentation + on how to set up and use gtk-doc in your + project is provided on the GNOME developer website. + + + diff --git a/docs/reference/gobject/version.xml.in b/docs/reference/gobject/version.xml.in new file mode 100644 index 0000000..af9b9c4 --- /dev/null +++ b/docs/reference/gobject/version.xml.in @@ -0,0 +1 @@ +@GLIB_VERSION@ diff --git a/gio-2.0-uninstalled.pc.in b/gio-2.0-uninstalled.pc.in new file mode 100644 index 0000000..04da6ea --- /dev/null +++ b/gio-2.0-uninstalled.pc.in @@ -0,0 +1,6 @@ +Name: GIO Uninstalled +Description: glib I/O library, Not Installed +Version: @VERSION@ +Requires: glib-2.0-uninstalled,gobject-2.0-uninstalled,gmodule-no-export-2.0-uninstalled +Libs: ${pc_top_builddir}/${pcfiledir}/gio/libgio-2.0.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@ diff --git a/gio-2.0.pc.in b/gio-2.0.pc.in new file mode 100644 index 0000000..6550377 --- /dev/null +++ b/gio-2.0.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +giomoduledir=@GIO_MODULE_DIR@ + +Name: GIO +Description: glib I/O library +Version: @VERSION@ +Requires: glib-2.0,gobject-2.0,gmodule-no-export-2.0 +Libs: -L${libdir} -lgio-2.0 +Libs.private: @ZLIB_LIBS@ @LIBASYNCNS_LIBADD@ +Cflags: diff --git a/gio-unix-2.0-uninstalled.pc.in b/gio-unix-2.0-uninstalled.pc.in new file mode 100644 index 0000000..a45dc9e --- /dev/null +++ b/gio-unix-2.0-uninstalled.pc.in @@ -0,0 +1,6 @@ +Name: GIO unix specific APIs +Description: unix specific headers for glib I/O library, Not Installed +Version: @VERSION@ +Requires: gobject-2.0-uninstalled,gmodule-no-export-2.0-uninstalled,gio-2.0-uninstalled +Libs: ${pc_top_builddir}/${pcfiledir}/gio/libgio-2.0.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@ diff --git a/gio-unix-2.0.pc.in b/gio-unix-2.0.pc.in new file mode 100644 index 0000000..2e81c07 --- /dev/null +++ b/gio-unix-2.0.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: GIO unix specific APIs +Description: unix specific headers for glib I/O library +Version: @VERSION@ +Requires: gobject-2.0,gmodule-no-export-2.0,gio-2.0 +Libs: -L${libdir} -lgio-2.0 +Cflags: -I${includedir}/gio-unix-2.0/ diff --git a/gio/ChangeLog b/gio/ChangeLog new file mode 100644 index 0000000..65c5273 --- /dev/null +++ b/gio/ChangeLog @@ -0,0 +1,5966 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-26 Carlos Garnacho + + Bug 575270 – GVolumeMonitor::mount-pre-unmount not being emitted + + * gunixmount.c (eject_unmount_cb) (eject_unmount_do_cb) + (eject_unmount_do): Emit ::mount-pre-unmount and wait 500msec before + actually trying to unmount. + +2009-03-17 Colin Walters + + Bug 575708 - runaway inotify madness ... + + * gfilemonitor.c: Queue up events in a local list and + fire one idle, instead of queuing lots of individual + idles which has bad performance behavior. + +2009-03-17 Alexander Larsson + + * glocalfileinputstream.c: + * glocalfileoutputstream.c: + fix attributes argument of query_info methods to + be "const char *". + +2009-03-16 Alexander Larsson + + Bug 575555 – Use fsync() when replacing files to avoid data loss on crash + + * glocalfileoutputstream.c: + (g_local_file_output_stream_close): + (_g_local_file_output_stream_replace): + fsync temp file before closing if replacing target file + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + +2009-03-04 Alexander Larsson + + Bug 573843 – g_get_current_dir returns non-absolute path + + * glocalfile.c (canonicalize_filename): + Handle the case where g_get_current_dir() returns a non-absolute path. + +2009-03-04 Alexander Larsson + + Bug 573970 – crash in gunixvolumemonitor:update_mounts when unmounting + + * gunionvolumemonitor.c: + (g_union_volume_monitor_dispose): + Run dispose on child monitors when disposing. + + * gunixvolumemonitor.c: + Remove all volumes and mount on dispose to avoid circular + dependencies not freeing the monitor + +2009-03-03 Alexander Larsson + + Bug 561172 – gnome-open fails on local URIs with anchors + + * gdesktopappinfo.c: + Don't force uris to filenames if the uri has an anchor, because + that would strip the anchor. + + * glocalvfs.c: + Strip anchor from file:// uris when creating GFile, since + g_filename_from_uri doesn't handle them. + +2009-03-03 Alexander Larsson + + Bug 562613 – Missing const modifier in string parameters + + * gfileinputstream.[ch]: + * gfileoutputstream.[ch]: + * glocalfileinfo.[ch]: + Make string arguments const if used as such. + +2009-03-03 Alexander Larsson + + * glocalfile.c (g_local_file_query_filesystem_info): + Handle filesystems no supporting reporting how much is free. + This fixes bug 573454 where the filesystem not supporting this + is the gvfs smb backend over the fuse filesystem. + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-03-02 Matthias Clasen + + * gioenums.h: Add a Since: tag + +2009-03-01 Matthias Clasen + + Bug 573658 – Deadlock in giomodule.c + + * giomodule.c: Use a separate lock for extension point registration + to avoid deadlock. Discovered by Torsten Schoenfeld + +2009-03-01 Matthias Clasen + + * gdatainputstream.c: Fix docs + +2009-02-27 Matthias Clasen + + Bug 573421 – Clarify message format in GMountOperation + + * gmountoperation.c: Document that the first line of a + multi-line message should be interpreted as a heading. + +2009-02-27 David Zeuthen + + Bug 573462 – GEmblemedIcon leak + + * gemblemedicon.c (g_emblemed_icon_finalize): + Avoid leaking a GList. + +2009-02-27 Alexander Larsson + + * giomodule-priv.h: + * giomodule.c: + Split out the extension point registration code to its + own function. + + * glocalvfs.c: + Ensure extension points are registered before extending it. + It might not have happened yet if g_vfs_get_local() is called. + +2009-02-26 Alexander Larsson + + Bug 540461 – g_memory_output_stream_get_data_size() doesn't behave as document + * gmemoryoutputstream.c: + Track actual valid size, even if we later seek back. + + * tests/memory-output-stream.c: + Add testcase + +2009-02-26 Alexander Larsson + + Bug 543183 – Clarify docs for g_file_has_prefix + + * gfile.c: (g_file_has_prefix): + Clarify how the prefix matching works. + +2009-02-26 Alexander Larsson + + * gdesktopappinfo.c: + Support desktop file key X-GIO-NoFuse which disables + use of fuse pathnames for %u and %U arguments. + +2009-02-25 Alexander Larsson + + Bug 570073 – Add support for reading filesystems on Interix + + * gunixmounts.c (_g_get_unix_mounts): + Support Interix. Patch from Fabian Groffen + +2009-02-25 Paolo Borelli + + Bug 570069 – wrong preprocessor directive in gio/glocalfileinfo.c + + * glocalfileinfo.c: fix preprocessor condition. Patch by Markus Duft. + +2009-02-23 Alexander Larsson + + * glocalfile.c: + Remove accidentally commited spew + +2009-02-20 Alexander Larsson + + * gcontenttype.c: + (g_content_type_guess): + Don't ever sniff desktop files when the filename is known. + In other words, only allow desktop files with the .desktop extension + and when the filename isn't known. + This is a security precaution since desktop files can execute + arbitrary code when launched and we don't want to allow them to + try and hide as another type. There is no legit reason to not + have the .desktop extension anyway. + +2009-02-19 Alexander Larsson + + Bug 549298 – impossible to copy files with p (pipe) flag + + * gfile.c: + (file_copy_fallback): + Error out if the source file is a special file + +2009-02-18 Alexander Larsson + + Bug 560564 – Replacing a symlink with its linked file truncates the original file + + * gioenums.h: + Add G_FILE_CREATE_REPLACE_DESTINATION + + * glocalfileoutputstream.c: + (handle_overwrite_open): + (_g_local_file_output_stream_replace): + Handle G_FILE_CREATE_REPLACE_DESTINATION when overwriting files. + + * gfile.c: + (file_copy_fallback): + Pass G_FILE_CREATE_REPLACE_DESTINATION to g_file_replace when copying + with overwrite. + +2009-02-17 Ryan Lortie + + * gfileinfo.c: unref the destination's attribute matcher before + overwriting it. + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-17 Matthias Clasen + + * gio.symbols: Add missing exports for new API + + * gdatainputstream.c: Add missing Since: tags. + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-16 Matthias Clasen + + * gmountoperation.[hc]: Add an "aborted" signal to abort a + mount operation from the backend side. + + * gvolume.h: Add docs regarding the "aborted" signal. + +2009-02-16 Ryan Lortie + + Bug 505042 – add file attribute for actually used file size in bytes + + * gfileinfo.h: add G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE define to + "standard::allocated-size" + * gfileattribute.c: document + * glocalfileinfo.c: set the allocated size from st_blocks * 512 + +2009-02-16 Ryan Lortie + + Bug 571598 – GAsyncResult with NULL gobject + + * gsimpleasyncresult.c: remove various assertions and add some checks + to allow for a NULL source_object in GSimpleAsyncResult. + +2009-02-11 Matthias Clasen + + Bug 541225 – Can't compile gio on AIX : duplicate case value in + gioerror.c + + * gioerror.c (g_io_error_from_errno): Cope with EEXIST == ENOTEMPTY. + Reported by Nicolas Joseph + +2009-02-04 Alexander Larsson + + Bug 566747 - URIs opened with firefox %u load as local files + + * gdummyfile.c (g_dummy_file_get_path): + Dummy files are never used for local paths, so always return NULL + in get_path(). + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-01-31 Paolo Borelli + + * glocalfileinfo.c: plug a tiny mem leak. + +2009-01-29 Ryan Lortie + + * gioerror.c (g_io_error_from_errno): handle all possible cases of + EAGAIN and EWOULDBLOCK being (un)defined and (un)equal. + +2009-01-28 Ryan Lortie + + Bug 568575 – _async functions for GDataInputStream + + * gdatainputstream.h: + * gdatainputstream.c: add _async versions of read_line and read_until. + * gio.symbols: + * ../docs/reference/gio/gio-sections.txt: add new functions + * tests/sleepy-stream.c: new test case for async read line + * tests/Makefile.am: add new test + +2009-01-22 Ryan Lortie + + Bug 568723 – g_buffered_input_stream_fill_async doesn't take count == -1 + + * gbufferedinputstream.c (g_buffered_input_stream_fill_async, + g_buffered_input_stream_fill): check for count < -1 instead of count < + 0 and copy modified check to non-async version for consistency. + document the "count = -1" API. + +2009-01-22 Ryan Lortie + + Bug 568741 – g_buffered_input_stream_fill_async doesn't work + + * gbufferedinputstream.c (fill_async_callback): grow the buffer tail + after we have successfully read data from the base stream + +2009-01-20 Ryan Lortie + + Bug 568394 – dropping the last reference to a stream filter closes the + base stream + + * gfilterinputstream.h: + * gfilterinputstream.c: add "close-base-stream" property and only + close the base stream if it is true. issue async close callbacks from + correct source object. + * gfilteroutputstream.h: + * gfilteroutputstream.c: add a "close-base-stream" property and only + close the base stream if it is true. issue async close callbacks from + correct source object. + * gbufferedoutputstream: check g_filter_output_stream_get_close_base() + before closing the base stream. fix invalid source tag comparison in + close_async (was comparing to flush_async). + * ../docs/reference/gio/gio-sections.txt: + * gio.symbols: add + g_filter_{in,out}put_stream_{g,s}et_close_base_stream + * tests/filter-streams.c: new test cases + * tests/Makefile.am: add new test + * tests/.gitignore: add new test + +2009-01-19 Matthias Clasen + + * gdesktopappinfo.c (g_desktop_app_info_new): Expand the docs. + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-19 Matthias Clasen + + * gappinfo.h: Document get_commandline vfunc + +2009-01-19 Matthias Clasen + + * gunixmounts.c: Some stylistic fixes. + +2009-01-08 Matthias Clasen + + Bug 565484 – g_content_type_guess passes non-UTF8 text to XDG + functions in non-UTF8 locale + + * xdgmime/xdgmimecache.c: + * xdgmime/xdgmimeglob.c: Don't assume filenames are UTF-8. + +2009-01-08 Matthias Clasen + + * xdgmime/test-mime.c: Make tests work with current shared-mime-info. + +2009-01-07 Matthias Clasen + + Bug 566770 – error code 0 for Too many open files is useless + + * gioenums.h: Add a G_IO_ERROR_TOO_MANY_OPEN_FILES error code. + Requested by Olivier Sessink. + + * gioerror.c: Translate EMFILE to G_IO_ERROR_TOO_MANY_OPEN_FILES. + + * glocalfileenumerator.c: Translate G_FILE_ERROR_MFILE to + G_IO_ERROR_TOO_MANY_OPEN_FILES. + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + +2009-01-05 Dan Winship + + * gdesktopappinfo.c (update_mimeapps_list): cast a "char **" to + "const char **" to avoid a warning. + + * gemblem.c (g_emblem_from_tokens): + * gemblemedicon.c (g_emblemed_icon_from_tokens): + * xdgmime/xdgmime.c (xdg_mime_get_icon): remove unused + variables + +2009-01-05 Matthias Clasen + + Bug 566064 – Add NOATIME flag to query_info_flags + + * glocalfileinfo.c (get_content_type): Try using O_NOATIME when + sniffing for mime types. Based on a patch by A. Walton + +2009-01-05 Ryan Lortie + + * tests/.gitignore: improve + * tests/Makefile.am: add new simple-async-result test + * tests/simple-async-result.c: new file to test GSimpleAsyncResult + +2009-01-05 Ryan Lortie + + * gio.symbols: + * ../docs/reference/gio/gio-sections.txt: + * gsimpleasyncresult.h: + * gsimpleasyncresult.c: Add g_simple_async_result_is_valid(). + Implementation by Dan Winship. Closes #566170. + +2008-12-31 Matthias Clasen + + * gdesktopappinfo.c: + * gunixmounts.c: + * gunixinputstream.c: + * gunixoutputstream.c: Add a note about being UNIX-specific. + +2008-12-15 Matthias Clasen + + * === Released 2.19.3 === + +2008-12-12 Dan Winship + + * pltcheck.sh: make this work on x86_64 + +2008-12-12 Ryan Lortie + + * gio/gicon.c (g_icon_to_string_tokenized): free the tokens when done + with them + +2008-12-12 Ryan Lortie + + * gio/gunixmounts.c (g_unix_mount_at): fix leak that occurs when + multiple mount entries match the requested path + +2008-12-10 Alexander Larsson + + Bug 562452 - Ensure we return G_IO_ERROR_CANCELLED if cancelling + g_simple_async_result_run_in_thread + + * gsimpleasyncresult.c: + Make g_simple_async_result_run_in_thread check cancellation before + calling out to the user in the callback. This means we guarantee + reporting cancels of async operations from the main threads, which + is probably more in line with what users expect. + + Note that there are still no such guarantees for cancelling sync + operations or cancelling async operation from outside the main + thread. Furthermore, the exact behaviour of async implementations + not using run_in_thread may differ. + +2008-12-09 Alexander Larsson + + Bug 515777 - incorrect date&time on copy + + * glocalfile.c: + (g_local_file_class_init): + Copy mtime by default + + * gfile.c: + Change docs about G_FILE_COPY_ALL_METADATA to not mention + mtime as an example. + +2008-12-08 Matthias Clasen + + Bug 558298 – Hide ecryptfs mounts + + * gunixmounts.c: (guess_system_internal): Hide ecryptfs mounts, + so that the desktop does not show both the mount and the target + directory. Patch by Martin Pitt + +2008-12-08 Matthias Clasen + + Bug 555465 – GUnix{Input,Output}Stream lacks fd/close_fd_at_close + property + + * gio.symbols: + * gunixinputstream.[hc]: + * gunixoutputstream.[hc]: Add "fd" and "close-fd" properties + including getters and setters. Patch by Maciej Piechotka + +2008-12-07 Matthias Clasen + + Bug 558458 – Cannot build gio tests on Solaris using SUN cc + + * tests/live-g-file.c: Support compilers that don't understand + ISO C varargs macros. Patch by Eric Lamarque + +2008-12-07 Matthias Clasen + + Bug 526320 – should not list mounts that the user doesn't have + permission to use + + gunixmounts.c: Use g_access() to check accessibility of local devices. + Patch by Martin Pitt + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * gdatainputstream.c (g_data_input_stream_read_line): Revert the + behaviour change, and update the docs instead, to avoid breaking + existing users. + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + +2008-12-01 Alexander Larsson + + * gio.symbols: + * gmount.[ch]: + * gunionvolumemonitor.c: + * gvolume.c: + Add and document g_mount_is_shadowed plus calls + to set/unset a mount as shadowed + +2008-11-28 Matthias Clasen + + * gio/tests/g-icon.c: Comment out two failing tests + +2008-11-28 Matthias Clasen + + Bug 555486 – No way to recover command line from GAppInfo + + * gio.symbols: + * gappinfo.[hc]: Add g_app_info_get_commandline. Requested + by Hans Petter Jansson. + + * gdesktopappinfo.c: And implement it here. + +2008-11-28 Christian Dywan + + * gappinfo.c: Fix a typo, s/detext/detect. Patch by Enrico Tröger. + +2008-11-28 Matthias Clasen + + Bug 559633 – gtk_image_new_from_gicon does not always work for + .desktop files + + * gdesktopappinfo.c (g_desktop_app_info_new_from_keyfile): Ignore + extensions on icon names. Proposed by Axel von Bertoldi. + +2008-11-28 Matthias Clasen + + Bug 548163 – Nautilus displays wrong error message for too long file + names + + * glocalfile.c (g_local_file_set_display_name): Correctly set + error conditions if the new name is e.g. too long. Reported + by Leonardo Ferreira Fontenelle. + +2008-11-28 Matthias Clasen + + Bug 547481 – g_data_input_stream_read_line behaves not as stated in + the docs + + * gdatainputstream.c (g_data_input_stream_read_line): Behave as + documented and include the line end in the returned string. + Pointed out by Paul Pogonyshev. + + * tests/data-input-stream.c: Fix the read_line test to test the + documented behaviour. + +2008-11-28 Matthias Clasen + + * gdesktopappinfo.c (g_app_info_can_delete): Only allow deleting + files that have been created by g_app_info_create_from_commandline. + +2008-11-28 Matthias Clasen + + Bug 541715 – win32 : patch for warnings and signature problems in + recent code + + * glocalvfs.c: Avoid unused variables. Pointed out by Jody + Goldberg. + +2008-11-28 Matthias Clasen + + Bug 562393 – g_buffered_input_stream_read_byte broken if data + available + + * gbufferedinputstream.c (g_buffered_input_stream_read_byte): Fix + handling of buffered content. Patch by Philip Withnall + + * tests/buffered-input-stream.c: Add a testcase for this bug. + * tests/Makefile.am: And build it + +2008-11-28 Matthias Clasen + + Bug 561807 – inotify_sub.c :: dup_dirname() fails to remove trailing + '/' + + * inotify/inotify-sub.c (dup_dirname): Actually strip the trailing + '/' away. Spotted by Dan Williams. + +2008-11-21 Cosimo Cecchi + + Bug 561375 – Leaks mountpoint description + + * glocalfile.c: (get_mount_info): don't leak the mountpoint description + string. + +2008-11-21 Cosimo Cecchi + + Bug 561352 – Leak of icon description + + * gcontenttype.c: (g_content_type_get_icon): don't leak the XDG mimetype + generic icon string. + +2008-11-14 Matthias Clasen + + * gfileattribute.c: Add G_FILE_ATTRIBUTE_PREVIEW_ICON to doc table. + +2008-11-12 Tor Lillqvist + + Bug 556415 - Crash on Windows 2000 in g_winhttp_vfs_init() + + * win32/gwinhttpvfs.h: Move the set of function pointers to + winhttp.dll into a separate struct GWinHttpDllFuncs. Just have a + pointer to that in the GWinHttpVfsClass. + + * win32/gwinhttpvfs.c: Move the lookup of functions from + winhttp.dll into a function of its own, that stores the pointers + in a separate GWinHttpDllFuncs variable. Add two bookeeping + booleans lookup_done and funcs_found. + + Don't call g_io_extension_point_implement() to register the + winhttp extension unless winhttp.dll has been successfully loaded + and the required functions found in it. + + * win32/gwinhttp*.c: Adjust calls of the functions looked up from + winhttp.dll correspondingly. + +2008-10-28 Cosimo Cecchi + + reviewed by: Alexander Larsson + + * gdatainputstream.c: Make the docs of g_dada_input_stream_read_line () + clearer about the behavior when there's no more content to read. + +2008-10-27 Federico Mena Quintero + + * glocalfile.c (g_local_file_get_parse_name): Don't leak roundtripped_filename. + +2008-10-27 Tor Lillqvist + + Bug 557592 - Missing include in gwinhttpfile.c + + * win32/gwinhttpfile.c: Include to make it compile with + MSVC2008. + +2008-10-24 Matthias Clasen + + Bug 556910 – [fam-helper.c:223]: Memory leak: sub + + * fam/fam-helper.c: Fix a memory leak and formatting issues. + Reported by Daniel Marjamäki + +2008-10-23 Matthias Clasen + + * gdesktopappinfo.c (g_app_info_reset_type_associations): Fix docs. + +2008-10-23 Alexander Larsson + + Bug 528320 - Incorrect icons displayed for files with custom mimetype icons + + * glocalfileinfo.c: + (_g_local_file_info_get): + Don't return the fallback icon (text-x-generic) for all files. + This is causing problems with theme icon lookup and custom mime + icons, as the generic fallback overrides custom mime icons in + inherited themes. + + This is a slight change as applications might not get an icon wher + they previously did. But there is no guarantee to get on neither before + or after this change, so it should not break applications. Changes + to nautilus and gtk+ will be done to manually use the generic fallback + icon if no icon is found, but this is only required for rare cases. + +2008-10-21 Alexander Larsson + + * gfileinfo.h: + Add G_FILE_ATTRIBUTE_PREVIEW_ICON (#557182) + +2008-10-21 Alexander Larsson + + Bug 555740 - gicon serialization + Based on patch from David Zeuthen + + * gicon.[ch]: + * gio.symbols: + Add g_icon_to_string() and g_icon_new_for_string(). + + * gemblem.c: + * gemblemedicon.c: + * gfileicon.c: + * gthemedicon.c: + Implement icon serialization for built-in icon types + + * tests/Makefile.am: + * tests/g-icon.c: + Added GIcon serialization test + +2008-10-16 Matthias Clasen + + * === Released 2.19.0 === + +2008-10-16 Matthias Clasen + + Bug 556422 – g_file_enumerator_next_file: unclear whether return + value needs to be freed + + * gfileenumerator.c (g_file_enumerate_next_file): Clarify + the return value docs. Pointed out by Armin Burgmeier + +2008-10-14 Matthias Clasen + + Bug 556334 – Warning when building without selinux support + + * glocalfileinfo.c: Avoid compiler warnings when selinux is + disabled. Patch by Pascal Terjan + +2008-10-14 Matthias Clasen + + Bug 556335 – make check fails in abicheck.sh + + * gio.symbols: Add g_file_attribute_info_list_get_type. + Pointed out by Pascal Terjan. + +2008-10-13 Alexander Larsson + + * gdesktopappinfo.c: + When adding an application as handling a mime type (but + not as the default), copy the full list of desktop ids handling + that type in before adding the new one on the end of the list. + This means we're not accidentally changing the default by overriding + the info from the later directories in the search path. + + Also, fixes small leak of removed_entries. + +2008-10-12 David Zeuthen + + * gio.symbols: + * gunionvolumemonitor.c: + * gvolumemonitor.h: + Deprecate g_volume_monitor_adopt_orphan_mount() (#555331). + +2008-10-10 Alexander Larsson + + * gfileattribute.c (escape_byte_string): + Upper half of byte is >> 4, not >> 8. + Found by Kjartan Maraas via sparse + +2008-10-10 Matthias Clasen + + Bug 555711 – Wrong fallback order of mimetype icons + + * gcontenttype.c: Don't prefer generic icons over + default mimetype icons. + + * xdgmime/xdgmimecache.c (xdg_mime_cache_get_icon): + * xdgmime/xdgmime.c (xdg_mime_get_icon): Don't fall back + to generic icons. + Patch by Krysztof Kosiński + +2008-10-10 Matthias Clasen + + Bug 555121 – Improved build-time handling of gio module-dir + + * fam/Makefile.am: Use GIO_MODULE_DIR consistently. + * Makefile.am: Create the module dir. + +2008-10-10 Matthias Clasen + + * gio/glocalfileinfo.c: + * gio/tests/live-g-file.c: + * gio/gsimpleasyncresult.c: Fix gcc warnings. + +2008-10-09 Alexander Larsson + + * gunixinputstream.c (g_unix_input_stream_read): + Actually return -1 in case of cancelled, not old res value. + +2008-10-06 Colin Walters + + Bug 554745 - GFileAttributeInfoList should be boxed + + * gio/gfileattribute.c: Define a boxed type for GFileAttributeList + for convenience of bindings. + * gio/gfileattribute.h: Prototype it. + +2008-10-05 Pascal Terjan + + Bug 554970 – segfault when update-desktop-database is not available + on the system + + * gdesktopappinfo.c (run_update_command): Have the error set before + using it. + +2008-10-01 David Zeuthen + + * gdesktopappinfo.c (expand_macro): If possible, always pass FUSE + file:// URIs (such as '/home/davidz/.gvfs/sftp on foo/file.avi') + instead of the gio URI (such as sftp://foo/file.avi) when using + g_app_info_launch() and friends. With a sufficiently recent gvfs, + apps using gio+gvfs will map the FUSE file:// URI back to the gio + URI (and thus bypass the fuse daemon) thanks the patch from bug + #530654. Since Nautilus is an user of g_app_info_launch() it + means that non-gio POSIX apps, such as mplayer, will Just Work(tm) + when launced via the file manager. Win. Fixes bug #528670. + + * gappinfo.c: Add some notes about the FUSE POSIX URI <-> GIO URI + mapping to the description of GAppInfo. + +2008-09-30 Tor Lillqvist + + * tests/Makefile.am: Build desktop-app-info only on Unix. + + * glocalfile.c (get_volume_for_path) [Win32]: Avoid a + g_critical(). Pass a large enough result buffer to + GetVolumePathNameW(). Just use MAX_PATH. + +2008-09-29 David Zeuthen + + * gvolume.c: Clarify semantics of g_volume_mount_finish() (#552168) + +2008-09-26 Dan Winship + + * tests/data-input-stream.c: + * tests/data-output-stream.c: + * tests/live-g-file.c: + * tests/memory-input-stream.c: + * tests/memory-output-stream.c: Use g_assert_error() and + g_assert_no_error() + +2008-09-26 Matthias Clasen + + Bug 545350 – GAppInfo deletion + Bug 545351 – Reset associations for content type + + * gio.symbols: + * gappinfo.[hc]: New functions g_app_info_can_delete, + g_app_info_delete and g_app_info_reset_type_associations. + + * gdesktopappinfo.c: + * gwin32appinfo.c: Implementations of these. + + * tests/Makefile.am: + * tests/desktop-app-info.c: Tests for GAppInfo functionality. + +2008-09-26 Dan Winship + + Bug 505361 – gunixinputstream.c assumes poll() available + Bug 509446 – portable blocking gio cancellation + + * gcancellable.c (g_cancellable_make_pollfd): New method to make a + GPollFD for a cancellable (which is slightly more complicated on + Windows than Unix). + + * gunixinputstream.c (g_unix_input_stream_read): + * gunixoutputstream.c (g_unix_output_stream_write): Use + g_cancellable_make_pollfd() and g_poll() rather than using poll() + directly. + + * tests/unix-streams.c: test of GUnixInputStream, + GUnixOutputStream, and GCancellable. + +2008-09-26 Dan Winship + + * gdesktopappinfo.c (get_all_desktop_entries_for_mime_type): add a + cast to stop a gcc warning + + * gfile.c (g_file_copy_attributes): add parens to stop a gcc + warning + +2008-09-25 Dan Winship + + Bug 553426 - cancellable clarifications + + * gcancellable.c (g_cancellable_class_init): Add a note to the + "cancelled" signal docs warning about thread-safety issues + (g_cancellable_cancel): Note that cancelling an asynchronous + operation takes effect asynchronously, not immediately. + +2008-09-22 Nelson Benítez León + + * gioenums.h: Add new GFileCopyFlag, to leave target file with + default perms, instead of setting the source file perms, in a copy + operation. + + * gfile.c (g_file_copy_attributes) + (build_attribute_list_for_copy) + (should_copy): Not copy "unix::mode" attribute if we have received + G_FILE_COPY_TARGET_DEFAULT_PERMS flag. + +2008-09-20 Matthias Clasen + + * gdesktopappinfo.c (expand_macro_single): Plug a memory leak + +2008-09-17 Matthias Clasen + + * === Released 2.18.1 === + +2008-09-16 Michael Natterer + + * gcontenttype.c (g_content_type_guess): can't assign the return + value of g_strdupv() to an array. Fill the array manually with + const strings instead (it is never freed anyway). Fixes the + build. Also fixed indentation. + +2008-09-16 Wouter Bolsterlee + + * gdesktopappinfo.c (g_desktop_app_info_new_from_keyfile): + Fix trivial typo to unbreak the build (there was a colon + instead of a semicolon at the end of a statement). + +2008-09-15 Matthias Clasen + + Bug 552352 – g_app_info_launch doesn't work if "Path" key in .desktop + file is empty + + * gdesktopappinfo.c (g_desktop_app_info_new_from_keyfile): Ignore + an empty Path value. + +2008-09-15 Matthias Clasen + + Bug 551681 – g_content_type_guess() too naive with filenames + + * gcontenttype.c (g_content_type_guess): Check whether there's a '/' + at the end of the filename, and declare it a directory. + Patch by Bastien Nocera + +2008-09-14 Cosimo Cecchi + + Bug 551887 – Docs for g_desktop_app_info_new_from_filename () + aren't clear. + + * gdesktopappinfo.c: add a note in the docs clarifying what the + "filename" parameter really is. + +2008-09-12 Tor Lillqvist + + * gwin32appinfo.c (g_win32_app_info_launch): Don't call + FormatMessage() etc here. Call g_win32_error_message() instead + which already does all that. Besides, the code was broken as it + called the default "A" version of FormatMessage() but still + thought it produced a wide string. + +2008-09-12 Michael Natterer + + * gfileinfo.c (g_file_info_get_content_type): remove dangling 's' + in the documentation. + +2008-09-08 Christian Neumair + + * gunixmount.c (eject_unmount_read_error), (eject_unmount_do): + * gunixvolume.c (eject_mount_read_error), (eject_mount_do): + Use non-blocking pipe for mount helper I/O. Fixes #550647. + +2008-09-06 Matthias Clasen + + Bug 551149 – xdgmime mem leak + + * xdgmime/xdgmime.c (xdg_mime_init_from_directory): Plug + a memory leak. Patch by Christian Persch + +2008-09-04 Tor Lillqvist + + * gwin32mount.c (g_win32_mount_finalize): Don't unref icon if + NULL. + +2008-09-02 Matthias Clasen + + * === Released 2.18.0 === + +2008-09-02 Michael Natterer + + * *.h: big header formatting cleanup: indentation, vtable + formatting, consistent spacing in (* vfunc), trailing whitespace + removal. Formatting should be pretty consistent in all GIO headers + now. + +2008-09-02 Matthias Clasen + + * gmount.h: Document guess_content_type sync vfunc. + +2008-09-02 Michael Natterer + + * gbufferedoutputstream.h (struct _GBufferedOutputStreamClass): + fix parent_class member to be GFilterOutputStreamClass (not + GOutputStreamClass). Drop three pointers of padding, which is + exactly what GFilterOutputStreamClass adds to GOutputStreamClass, + so the class struct size stays the same. + +2008-09-02 Matthias Clasen + + Bug 550059 – Wrong docs for g_emblemed_icon_add_emblem + + * gemblemedicon.c (g_emblemed_icon_get_add_emblem): Don't document + nonexisting return values. Pointed out by Cosimo Cecchi. + +2008-08-23 Tor Lillqvist + + Bug 548988 - g_file_replace fails on Windows when the target file + exists already + + * glocalfileoutputstream.c (g_local_file_output_stream_close): On + Windows, close the file before potentially renaming it (in case we + have been writing to a file with a temporary name). + + (g_local_file_output_stream_close, handle_overwrite_open): Use + GLocalFileStat instead of plain struct stat, for passing to + _g_local_file_info_create_etag(). Thus also use _fstati64() + instead of plain fstat() on Windows. + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +2008-08-15 Padraig O'Briain + + * gunixmounts.c: Add zfs to ignore_fs array in guess_system_internal: + Fix for #542156. + +2008-08-13 Tor Lillqvist + + * win32/gwinhttpvfs.c + * win32/gwinhttpvfs.h + * win32/gwinhttpfile.c + * win32/gwinhttpfileinputstream.c + * win32/gwinhttpfileoutputstream.c: Refactor some common code + snippets into helper functions. Check HTTP response status + codes. Implement g_winhttp_file_query_info(), looking at + Content-Length, Content-Type and Last-Modified. + + * win32/winhttp.h: Add some symbolic constants that are not + publicly documented. Just a handful, so it should be OK to use + information from the Windows SDK's headers. + +2008-08-13 Tor Lillqvist + + Bug 546582 - Callbacks from GFileMonitor present a GFile in the + wrong folder + + * win32/gwin32directorymonitor.c + (g_win32_directory_monitor_callback): Patch by Erik van Pienbroek. + +2008-08-13 Matthias Clasen + + * ginputstream.c: + * goutputstream.c: Add intro docs. + +2008-08-13 Tor Lillqvist + + * win32/gwinhttpfileoutputstream.c + (g_winhttp_file_output_stream_write): Don't write the + Content-Length header ourselves, WinHttpSendRequest() takes care + of that when the dwTotalLength parameter is non-zero. Increment + offset by the number of actual bytes sent, although I wonder if + such a scenario is possible where less than requested would be + sent and accepted by the server without errors. + +2008-08-13 Tor Lillqvist + + * win32/gwinhttpvfs.c + * win32/gwinhttpvfs.h + * win32/gwinhttpfile.c + * win32/gwinhttpfile.h + * win32/gwinhttpfileinputstream.c + * win32/gwinhttpfileinputstream.h + * win32/gwinhttpfileoutputstream.c + * win32/gwinhttpfileoutputstream.h: New files implementing + GWinHttpVfs and related classes, a GVfs for HTTP and HTTPS URIs on + Windows. The implementation uses the WinHttp API. Both reading and + writing are supported, i.e. GET and PUT requests. When writing, + each write call is done using a separate PUT request with a + Content-Range header. Requests for file URIs and plain pathnames + are forwarded to GLocalVfs. + + * win32/winhttp.h: Reverse engineered , borrowed from + WINE. Used as there is no bundled with mingw, and + requiring people to download the Windows SDK just for this one + header is not reasonable. + + * win32/Makefile.am: Add above files. + + * giomodule.c: Call _g_winhttp_vfs_get_type() on Windows to set up + the plumbing for the above. + +2008-08-11 Sven Neumann + + * gfilenamecompleter.c + * glocaldirectorymonitor.c + * gmountoperation.c + * gunionvolumemonitor.c + * gunixmount.c + * gunixmounts.c + * gunixvolume.c + * gunixvolumemonitor.c + * gvolumemonitor.c + * gwin32mount.c + * gwin32volumemonitor.c: use canonical signal names. + +2008-08-11 Tor Lillqvist + + * Makefile.am: Put a list of the platform-dependent .la files in + the subdirectories in the platform_deps Make variable, and make + libgio-2.0.la depend on that, so that it gets relinked if one of + the dependent libraries has changed. + +2008-08-11 Tor Lillqvist + + * Makefile.am (platform_libadd): Remove -lwininet which had been + added by mistake. We will probably eventually be using WinHTTP, + not the older WinInet anyway. (Actually I am working on it.) + +2008-08-10 Felix Riemann + + Bug 547080 – g_file_copy leaks expected errors + + * gfile.c: (g_file_copy): Clear G_IO_ERROR_NOT_SUPPORTED errors + before trying the next fallback routine. + +2008-08-09 Loïc Minier + + Bug 535124 – umask 002 not being applied for new directories, new + files get the correct umask + + * gfile.c (g_file_make_directory) + (g_file_make_directory_with_parents): Document ownership and + permissions of newly created directories as being the default + ones of the process. + +2008-08-08 Loïc Minier + + Bug 535124 – umask 002 not being applied for new directories, new + files get the correct umask + + * glocalfile.c: (g_local_file_make_directory): Use 0777 instead of + 0755 as umask + +2008-08-08 Tor Lillqvist + + * gwin32mount.c: Remove unused code. Whitespace cleanup. + + * gwin32volumemonitor.c (get_connected_drives): Put questionable + code that didn't actually do anything inside #if 0, and add a + comment wondering what the code was supposed to do. This also gets + rid of a leftover debugging printout. + +2008-08-07 Paul Pogonyshev + + * gfileicon.c (g_file_icon_get_property) + (g_file_icon_set_property): New functions. + (g_file_icon_class_init): Hook them up. Install `GFileIcon:file' + property. + (g_file_icon_new): Use the property (bug #546132). + +2008-08-06 Paul Pogonyshev + + * gthemedicon.c (g_themed_icon_get_property): Also handle + `PROP_USE_DEFAULT_FALLBACKS'. + (g_themed_icon_class_init): Make + `GThemedIcon:use-default-fallbacks' read-write (bug #546483). + +2008-08-05 Behdad Esfahbod + + Bug 546371 – Improve docs re g_file_monitor + + * gfilemonitor.c: Mention g_file_monitor() in the docs. + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.5 === + +2008-08-04 Matthias Clasen + + Bug 546017 – Don't copy attributes when copying a symlink + + * gfile.c (g_file_copy_attributes): Specify + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS in the call to + g_file_set_attributes_from_info. Patch by Christian Kellner + +2008-08-04 Matthias Clasen + + * gemblemedicon.[hc]: + * gio.symbols: + * gemblem.[hc]: Add GEmblem to make the emblem mechanism + a bit more extensible. Work by Clemens Buss. + + * gioenums.h: Add GEmblemOrigin. + * Makefile.am: Glue + +2008-08-03 Carlos Garcia Campos + + Bug 546079 – leak in xdgmime + + * xdgmime/xdgmime.c (xdg_mime_shutdown): Fix memory leak. + +2008-08-03 Tor Lillqvist + + * win32/gwin32directorymonitor.h + * win32/gwin32directorymonitor.c: Whitespace cleanup to match GLib + style. + +2008-08-03 Tor Lillqvist + + * win32/gwin32directorymonitor.c + (g_win32_directory_monitor_callback): Make prototype match + LPOVERLAPPED_COMPLETION_ROUTINE to avoid warning. Cast + LPOVERLAPPED parameter to local GWin32DirectoryMonitorPrivate + pointer. + + (g_win32_directory_monitor_constructor): + GLocalDirectoryMonitor::dirname is in UTF-8 like all other file + names in the GLib API on Windows, so convert to UTF-16 and open + with CreateFileW(). + +2008-08-03 Tor Lillqvist + + Bug 541036 - Gnumeric crashes when trying to open Desktop or + user's folder under Windows + + * win32/gwin32directorymonitor.c + (g_win32_directory_monitor_constructor): Ignore error from + CreateFile() when opening directory. Instead of asserting, just + store INVALID_HANDLE_VALUE then in + GWin32DirectoryMonitorPrivate::hDirectory. Also ignore error from + ReadDirectoryChangesW(). + (g_win32_directory_monitor_cancel): Don't attempt to close + directory handle if it is INVALID_HANDLE_VALUE. + +2008-08-01 Matthias Clasen + + * gdesktopappinfo.c: Remove debug spew + +2008-08-01 Hans Breuer + + * makefile.msc : add gemblembedicon + +2008-07-30 Matthias Clasen + + Bug 545457 – gdmsetup crashed with SIGSEGV in + g_unix_mount_guess_should_display() + + * gunixvolumemonitor.c (get_mount_for_mount_path): Don't + crash if no mount is found. + +2008-07-28 Matthias Clasen + + Bug 545203 – gfile.c: argument is different type. + + * gfile.c (open_read_async_thread): Pass a GError ** + to g_file_set_error_literal. + Reported by Kazuki Iwamoto + +2008-07-28 Matthias Clasen + + Bug 545157 – wrong/no list of "open with" applications for .cc and + .cpp files + + * gdesktopappinfo.c (get_all_desktop_entries_for_mime_type): + Collect all ancestors, not just direct parents. Pointed + out by Bastien Nocera + +2008-07-28 Matthias Clasen + + * Makefile.am: Install gemblemedicon.h + +2008-07-28 Matthias Clasen + + * gemblemedicon.[hc]: Add a GIcon implementation that can + add an emblem to another icon. + + * gio.h: + * Makefile.am: + * gio.symbols: Glue + + * gloadableicon.c: + * gfileicon.c: Small documentation additions. + +2008-07-28 Tor Lillqvist + + * gwin32appinfo.c (g_win32_app_info_get_icon): Correct return + type. + +2008-07-27 Tor Lillqvist + + * Makefile.am (gio-2.0.lib): Pass appropriate -machine flag to lib.exe. + +2008-07-24 David Zeuthen + + * gmount.[ch]: + * gio.symbols: + Also export a g_mount_guess_content_type_sync() function. + +2008-07-23 Matthias Clasen + + 529694 – SELinux context setting support + + * gfileinfo.c: Support setting selinux attributes. + Patch by Tomas Bzatek + +2008-07-22 Priit Laes + + Bug 544140 - fam-helper 64-bit issue? + + * fam/fam-helper.c: Added missing include so compiler doesn't complain. + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + +2008-07-20 Matthias Clasen + + * gvolumemonitor.[hc]: + * gmountoperation.c: + * gioenums.h: + * gdrive.c: + * gvfs.c: + * gmount.c: Documentation fixes + +2008-07-19 Matthias Clasen + + 543504 – crash in Epiphany Web Browser: Opening local file + + * gappinfo.c: + * gasyncresult.c: + * gdesktopappinfo.c: + * gdrive.c: + * gfile.c: + * gicon.c: + * gloadableicon.c: + * gmount.c: + * gseekable.c: + * gvolume.c: Register types thread-safely. + Patch by Christian Persch + +2008-07-18 Matthias Clasen + + * gcontenttype.c: Remove debug spew + +2008-07-18 Matthias Clasen + + Bug 543560 – enable gio-FEN back-end warnings on Solaris will crash + any applications + + * fen/fen-kernel.c: Remove a warning that was causing + crashes. Reported by Lin Ma. + +2008-07-18 Matthias Clasen + + Bug 543040 – async reading on dummy file will crash on + GIO_USE_VFS=local + + * gfile.c (open_read_async_thread): Cope with read_fn being + NULL. Reported by Lin Ma. + +2008-07-18 Matthias Clasen + + * gio.symbols: + * gcontenttype.[hc]: Add g_content_type_guess_for_tree(). + +2008-07-16 Matthias Clasen + + * gvfs.h: + * gdesktopappinfo.h: + * giomodule.c: Rename a chapter id to avoid filename conflict. + +2008-07-16 Matthias Clasen + + Bug 540616 – mem leak in filechooser button + + * gunixvolumemonitor.c (get_mount_for_mount_path): Free + the mount entry. Reported by Chrisitan Persch + +2008-07-16 Matthias Clasen + + * gfile.c: Small documentation fixes. + +2008-07-15 Matthias Clasen + + * gunixmounts.c: Use g_strcmp0 instead of rolling our own. + +2008-07-08 Matthias Clasen + + * gvolumemonitor.c: + * gfile.c: + * gvolume.c: + * gmount.c: Documentation improvements. + +2008-07-08 Matthias Clasen + + * gio.symbols: + * gmount.[hc]: Add g_mount_guess_content_type(). + +2008-07-06 David Zeuthen + + * gio.symbols: + * gvolume.[ch]: Add new method g_volume_get_activation_root(). This + is needed for easily handling adoption of foreign volumes by + out-of-process volume monitors (#541793) + +2008-07-06 David Zeuthen + + * gvolumemonitor.[ch]: + * gunionvolumemonitor.c: Export the eject-button signal on the + volume monitor class (#541794). + +2008-07-06 Matthias Clasen + + * gappinfo.c: More doc tweaks + +2008-07-05 Matthias Clasen + + * gappinfo.c: Clarify some docs + +2008-07-03 Matthias Clasen + + * gdesktopappinfo.c: Fix a stupid mistake. + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-07-02 Matthias Clasen + + * gfilemonitor.c: Fix the build. + +2008-07-02 Matthias Clasen + + Bug 536160 – Add g_file_monitor() + + * gio.symbols: + * gfile.[hc]: Add g_file_monitor which can return either + a file or a directory monitor. Proposed by Behdad Esfahbod + +2008-07-02 Matthias Clasen + + 536733 – gio build failure on Irix + + * glocalfile.c: Use a configure check for structfs.f_bavail. + +2008-07-02 Matthias Clasen + + Bug 534639 – add g_desktop_app_info_new_from_keyfile + + * gio.symbols: + * gdesktopappinfo.[hc]: Add a function to create a + GDesktopAppInfo from a GKeyFile. Proposed by Josselin Mouette. + +2008-07-02 Wouter Bolsterlee + + * gappinfo.c: Fix ulink in doc to make gtk-doc happy. + +2008-07-01 Matthias Clasen + + * gunixmounts.c: Fix a doc typo. + +2008-07-01 Cody Russell + + * gio/gcontenttype.c: + * gio/gwin32appinfo.c: + * gio/gwin32volumemonitor.c: + * gio/gwin32mount.c: Fixed some include problems. + +2008-07-01 Cody Russell + + * gio/gioenums.h: + * gio/giotypes.h: + Moved all relevant typedefs into these files. + + * gio/*.[ch]: + Updated wrt added files. + + Split types into separate file for easier maintainership. (#538564) + +2008-06-30 Matthias Clasen + + Bug 540331 – g_file_append_to () documentation: can return NULL + + * gfile.c (g_file_append_to): Clarify docs. + Patch by Jared Moore + +2008-06-30 Matthias Clasen + + Bug 539090 – g_content_type_from_mime_type() should unalias + + * gcontentype.c (g_content_type_from_mime_type): Unalias. + Patch by Markus Bergman + +2008-06-30 Matthias Clasen + + Bug 538836 – make check failure on PPC and ALPHA: pltcheck.sh on + g_atomic_pointer_get + + * pltcheck.sh: Allow g_atomic_pointer_get, to fix 'make check' + on ppc and alpha. Reported by Mart Raudsepp + +2008-06-29 Matthias Clasen + + * tests/Makefile.am: + * tests/memory-output-stream.c: Add some tests for + GMemoryOutputStream. + +2008-06-29 Matthias Clasen + + Bug 540423 – unrecoverable error after g_seekable_truncate(seekable, + 0, ...) + + * gmemoryoutputstream.c (array_resize): Handle truncation to + zero correctly. Reported by Akira Tagoh + +2008-06-29 Matthias Clasen + + * gmemoryoutputstream.c: Trivial doc fixes + +2008-06-29 Matthias Clasen + + Bug 540802 – g_list_prepend doesn't concat lists + + * giomodule.c (_g_io_modules_ensure_loaded): Don't g_list_prepend + one list to another. Pointed out by Jan Arne Petersen + +2008-06-28 Michael Natterer + + * gfileicon.c: remove semicolons from G_IMPLEMENT_INTERFACE(). + +2008-06-18 Matthias Clasen + + * glocalfileinfo.c: Don't do fallback for user-home and user-desktop + to avoid problems with partial icon themes. + +2008-06-17 Hans Breuer + + * gwin32mount.[ch] gwin32volumemonitor.[ch] : bits and pieces from + gtk-2-12 and gunix*.[hc] to make the file chooser show drive letter + access again on win32, see bug #538127 + * giomodule.c : ensure GWin32VolumeMonitor is registered + * glocaldireoctorymonitor.c : initial state on win32 is_mounted=TRUE + * Makefile.am makefile.msc : updated + +2008-06-16 Hans Breuer + + * glocalfileenumerator.c(_g_local_file_enumerator_new) : declaration + and initialization in one step avoids c99ism + +2008-06-16 Christian Persch + + * gio/gappinfo.c + * gio/gbufferedinputstream.c + * gio/gcancellable.c + * gio/gdatainputstream.c + * gio/gdesktopappinfo.c + * gio/gfile.c + * gio/gfileenumerator.c + * gio/gfileinputstream.c + * gio/gfileoutputstream.c + * gio/ginputstream.c + * gio/glocaldirectorymonitor.c + * gio/glocalfile.c + * gio/glocalfileenumerator.c + * gio/glocalfileinfo.c + * gio/glocalfilemonitor.c + * gio/glocalfileoutputstream.c + * gio/gmemoryinputstream.c + * gio/gmemoryoutputstream.c + * gio/goutputstream.c + * gio/gwin32appinfo.c: Use g_set_error_literal where appropriate. Patch from + bug #535947. + +2008-06-16 Tor Lillqvist + + Bug 538362 - Get Win32 icons back in the file chooser + + * gcontenttype.c (g_content_type_get_icon): Look up the icon + corresponding to a file extension in the Registry. Patch by Hans + Breuer. + (get_registry_classes_key): Handle also REG_EXPAND_SZ type values. + +2008-06-16 Tor Lillqvist + + Patches by Hans Breuer: + + * glocalfile.c (is_xp_or_later): Handle compiling against older + SDK headers with missing VerifyVersionInfo(). Conditioned on + _MSC_VER, but should probably use some better test. + * glocalfile.c (g_local_file_query_filesystem_info): Don't test + uninitialised statfs_result variable on Win32. + +2008-06-16 Michael Natterer + + * *.c: chain up unconditionally in finalize() and dispose(). Also + don't dereference these function pointers when calling them since + that has no meaning at all. + +2008-06-16 Ross Burton + + * gfileenumerator.c: + Remove check for dispose implementation as it annoys Emmanuele. + +2008-06-16 Ross Burton + + Bug 536252 – GFileEnumerator should allow access to the containing + GFile + + * gfileenumerator.c: + * gfileenumerator.h: + * gfile.h: + Add g_file_enumerator_get_container() and a container writeable + construct-only property. Also shuffle around typedefs to make it + compile. + + * glocalfileenumerator.c: + * glocalfileenumerator.h: + * glocalfile.c: + Instead of a string filename take a GFile in the constructor and + use it to set the container property. + + * gio.symbols: + Update with new API. + +2008-06-16 Matthias Clasen + + * gfile.c: Make includes more uniform + +2008-06-12 Yevgen Muntyan + + * tests/live-g-file.c (sample_struct): + Use less fancy unicode filenames, so the test doesn't fail + on Mac OS X (#531476). + +2008-06-12 Matthias Clasen + + * === Released 2.17.2 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.1 === + +2008-06-11 A. Walton + + * tests/g-file.c (test_g_file_new_null): + Fix broken test case. + +2008-06-11 Matthias Clasen + + * pltcheck.sh: We use g_clear_error now. + +2008-06-11 Matthias Clasen + + * glocalfile.c (g_local_file_enumerate_children): Revert + an unintended change. + +2008-06-11 Matthias Clasen + + * gfile.c (g_file_replace_contents): Don't unref before the last use. + +2008-06-10 Matthias Clasen + + Bug 537546 – 'desktop' shortcut in file chooser looks like a generic + folder + + * glocalfileinfo.c (_g_local_file_info_get): Return user-desktop + as icon for the desktop directory, also make user-home and + user-desktop the preferred icons. + +2008-06-10 Matthias Clasen + + * gio.symbols: + * gthemedicon.[hc] (g_themed_icon_prepend_name): New function, + to add a name to the front of the list. + +2008-06-10 Matthias Clasen + + Bug 537392 – Additional colon in xattr name + + * glocalfileinfo.c (set_xattr): Skip the second colon of the prefix, + too. Reported by Alessandro Morandi + +2008-06-10 Matthias Clasen + + Bug 536641 – Filesystem querying in gio does not list AFS and autofs + file systems + + * glocalfile.c (get_fs_type): Add afs and autofs. + Patch by Danny Baumann. + +2008-06-10 Matthias Clasen + + Bug 528600 – g_dummy_file_get_parent("scheme://example.com/") + + * gdummyfile.c (g_dummy_file_get_parent): Return NULL if there + is no parent. (Owen Taylor, patch by Christian Neumair) + +2008-06-10 Paolo Borelli + + * gfile.c (g_file_replace_contents): do not leak the output stream. + +2008-06-10 Michael Natterer + + * gcontenttype.c (g_content_type_get_icon): fix SEGV by not using + uninitialized memory as array index. + +2008-06-10 Tor Lillqvist + + * gcontenttype.c (g_content_type_can_be_executable) + (g_content_type_get_icon) [Win32]: Add TODO comments. + +2008-06-09 Matthias Clasen + + * xdgmime/Makefile.am: Fix the build + +2008-06-09 Matthias Clasen + + * gcontenttype.c (g_content_type_get_icon): Use icons specified + in the shared mime database, if available. + + * xdgmime/*: Sync with upstream. This brings support for + glob weights, generic icons, and changes the cache format to + version 1.1. + +2008-05-28 Michael Natterer + + * Makefile.am: don't define G_DISABLE_SINGLE_INCLUDES, it's in + the global CPPFLAGS now. + + * tests/data-input-stream.c + * tests/data-output-stream.c + * tests/g-file-info.c + * tests/g-file.c + * tests/live-g-file.c + * tests/memory-input-stream.c: don't include + +2008-05-27 Matthias Clasen + + * === Released 2.17.0 === + + * tests/live-g-file.c: Clean up after the tests, so make distcheck + doesn't complain about leftover files. + +2008-05-27 simon.zheng + + * glocalfile.c: (g_local_file_query_filesystem_info): + Fix #533369. Make G_FILE_ATTRIBUTE_FILESYSTEM_TYPE work on Solaris. + +2008-05-26 Michael Natterer + + * gmemoryoutputstream.h: declare + g_memory_output_stream_get_data_size(). + +2008-05-26 Matthias Clasen + + * tests/*: Make tests work + +2008-05-26 Matthias Clasen + + * gio.symbols: Add g_memory_output_stream_get_data_size. + +2008-05-25 Ross Burton + + * glocalfile.c: + Fix typo in error message (#534764). + +2008-05-25 Ross Burton + + * Makefile.am: + Fix circular dependency loop for gioenumtypes.h (#534759). + +2008-05-19 Hans Breuer + + * Makefile.am : EXTRA_DIST += makefile.msc + +2008-05-17 Matthias Clasen + + * gcontenttype.h: + * gcontenttype.c: (g_content_type_from_mime_type): + New function to create a content type from a mime type. (#527175, + Milan Crha) + +2008-05-17 Matthias Clasen + + Bug 532965 – Should not return filesystem::free for certain file systems + + * glocalfile.c (g_local_file_query_filesystem_info) Don't return + free space for ncpfs. + +2008-05-17 Matthias Clasen + + Bug 530196 – _g_local_file_has_trash_dir() doesn't handle st_dev == 0 + + * glocalfile.c (_g_local_file_has_trash_dir): Handle the case that + st_dev might be zero. + +2008-05-16 Tor Lillqvist + + * win32/gwin32directorymonitor.c: #define _WIN32_WINNT 0x0400 to + get declaration of ReadDirectoryChangesW() from Platform SDK headers. + +2008-05-13 Bastien Nocera + + * gfile.c (has_valid_scheme): A URI scheme must start with a + letter, even if later more characters are allowed (#532852) + +2008-05-05 Michael Natterer + + * Makefile.am. build with G_DISABLE_SINGLE_INCLUDES to prevent + code from being checked in that breaks the build of applications + which use G_DISABLE_SINGLE_INCLUDES. + + * makegioalias.pl: make the alias file include "glib.h" instead of + "glibconfig.h". + + * gio.symbols: whitespace change to force regeneration of the + alias file after above script change. + + * gfileinfo.h: remove inlcusion of . + + * gfilenamecompleter.c: remove inclusion of "gurifuncs.h". + + * gioerror.h: #include instead of . + + * glocalfileinfo.c: remove inclusion of . + +2008-04-28 David Zeuthen + + * gunixmounts.c (g_unix_mount_guess_should_display): Avoid + displaying mounts in a subdirectory not accessible to the + user (#526320). + +2008-04-22 Michael Natterer + + * Makefile.am: fix library versioning (it was 0.0.0). + +2008-04-21 Lin Ma + + * fen/fen-data.c, fen/fen-helper.c, fen/fen-missing.c, fen/fen-node.c: + Default disable all loggings. + * fen/fen-kernel.c: (printevent), (port_add_kevent), + (port_fetch_event_cb): Fixed two macro nits. + +2008-04-16 Matthias Clasen + + * xdgmime/xdgmime.c: Rework the timestamp checking code + to protect against duplicate directories in XDG_DATA_DIRS. + Fixes fd.o bug 12513, reported by Joe Shaw. + +2008-04-16 Matthias Clasen + + Partically revert the last commit after realizing that + xdg_mime_media_type_equal doesn't have to init at all. + + * xdgmime/xdgmime.h: + * xdgmime/xdgmime.c: Get rid of _xdg_mime_media_type_equal + + * xdgmime/xdgmimecache.c: Use xdg_mime_media_type_equal + +2008-04-16 Matthias Clasen + + Avoid possible memory corruption in xdgmime, fd.o bug 12512, + reported by Joe Shaw and Federico Mena Quintero. + + * xdgmime/xdgmime.c(_xdg_mime_media_type_equal): Implement. + (xdg_mime_media_type_equal): Turn into a wrapper around the + _-prefixed version. + + * xdgmime/xdgmimecache.c: Use the _-prefixed versions of comparison + functions throughout. + +2008-04-16 Michael Meeks + + * gdesktopappinfo.c (g_desktop_app_info_new_from_filename): + tolerate an empty TryExec= line without failing; nautilus used + to create launchers with these in previous versions. Fixes #528433 + +2008-04-09 Padraig O'Briain + + * gdesktopappinfo.c: In g_app_info_create_from_commandline set comment + after name. Fixes #527132. + +2008-04-08 Tomas Bzatek + + * gfile.c: (g_file_replace): + Doc update + +2008-04-07 Matthias Clasen + + Bug 526796 – Wrong order of arguments in g_file_copy's fallback + + * gfile.c (file_copy_fallback): Fix the argument order. Patch + by Christian Kellner. + +2008-04-04 Sebastien Bacher + + * gunixmounts.c: (g_unix_mount_guess_should_display): + Don't list the user directory as a mount, fix potential issue + when other users have a similar naming and don't special case the + gvfs mounts there since that's not required (#525866) + +2008-03-31 Alexander Larsson + + * glocalfile.c (get_parent): + Don't leak parent. + +2008-03-31 A. Walton + + * gfile.c (g_file_query_file_type): + Always return a GFileType enum value (#520715). + +2008-03-31 Alexander Larsson + + * glocalfileenumerator.c: + Read readdir() info in chunks (of 1000) and sort + the chunks by inode before stat:ing. + This is a 20% performance increase in testing + gvfs-ls on /usr/bin with cold cache. + +2008-03-31 Alexander Larsson + + * gmemoryoutputstream.c: + Clarify docs for g_memory_output_stream_get_size. + Add g_memory_output_stream_get_data_size. + +2008-03-30 Matthias Clasen + + * gio.symbols: + * gfile.c: + * gfile.h: Add g_file_query_file_type convenience function + to query the type of a file. (#520715, Mikkel Kamstrup Erlandsen) + +2008-03-30 Matthias Clasen + + * gfileenumerator.c: + * gfile.c: Fix some documentation typos. (#524950, Rob Bradford) + +2008-03-28 A. Walton + + * giomodule.c (_g_io_modules_ensure_loaded): + Adds GIO_EXTRA_MODULES environment variable support, closing bug + #523039. + +2008-03-28 Alexander Larsson + + * gfile.c: + (copy_stream_with_progress): + Fix up last commit. + +2008-03-28 Alexander Larsson + + * gfile.c: + (copy_stream_with_progress): + (file_copy_fallback): + Fallback to g_file_query_info for source size + if g_file_input_stream_query_info fails. (#524579) + +2008-03-28 Alexander Larsson + + * glocalfile.c (g_local_file_move): + Reuse old string instead of adding new one. + +2008-03-28 Lin Ma + + * fen/*.[hc]: still copyright issue. I hate copyright. + +2008-03-27 Alexander Larsson + + * glocalfile.c (g_local_file_move): + Return G_IO_ERROR_IS_DIRECTORY, not G_IO_ERROR_WOULD_MERGE when moving + file over directory. This is according to the docs and what the move via + copy+remove fallback does. + +2008-03-27 Lin Ma + + * fen/*.[hc]: Updated copyright. + +2008-03-20 Lin Ma + + * fen/fen-data.c: (fdata_adjust_changed): Removed a bad formatted msg. + +2008-03-20 Lin Ma + + * fen/fen-data.c: (process_events), (fdata_add_event): Fixed FEN does + not emit attribute changed events when optimizing changed events. + * fen/fen-helper.c, fen/fen-kernel.c: Added ifdef to default disable + warning messages. + +2008-03-19 Matthias Clasen + + * gmountoperation.[hc]: Small documentation additions + +2008-03-19 Sebastien Bacher + + * gunixmounts.c: (guess_mount_type): + consider nfs4 mounts as G_UNIX_MOUNT_TYPE_NFS (Closes: #523338) + +2008-03-19 Alexander Larsson + + * gfile.c: + (copy_stream_with_progress): + Bump block side for copy to 64k to minimize + overhead for low latency links. (#523015) + +2008-03-16 Tor Lillqvist + + * Makefile.am (libgio_2_0_la_DEPENDENCIES): Make libgio-2.0.la + depend on gio.def on Windows. + +2008-03-12 David Zeuthen + + * gio.symbols: + * gunixmounts.[ch]: + Add g_unix_mount_monitor_set_rate_limit() function (#521946) + +2008-03-14 Alexander Larsson + + * gunixmounts.c: + (guess_mount_type): + Avoid redudant tests (#521851) + Patch from Josselin Mouette + +2008-03-14 Alexander Larsson + + * gfilemonitor.c: + (g_file_monitor_is_cancelled): + Fix C89 issue (#521672) + Patch from Jens Granseuer + +2008-03-14 Alexander Larsson + + * fam/fam-helper.[ch]: + * fam/fam-module.c: + Shut down fam (including removing fam GSource) when + module is unloaded (#521513) + Patch from Joe Marcus Clarke + +2008-03-14 Alexander Larsson + + * giomodule.c: + (_g_io_modules_ensure_loaded): + Fix up FEN ifdefs + +2008-03-14 Alexander Larsson + + * glocalfile.c: + (g_local_file_query_filesystem_info): + Use right define name for f_fstypename member check + +2008-03-14 Alexander Larsson + + * Makefile.am: + * fen/Makefile.am: Added. + * fen/fen-data.[ch]: Added. + * fen/fen-dump.[ch]: Added. + * fen/fen-helper.[ch]: Added. + * fen/fen-kernel.[ch]: Added. + * fen/fen-missing.[ch]: Added. + * fen/fen-node.[ch]: Added. + * fen/fen-sub.[ch]: Added. + * fen/gfendirectorymonitor.[ch]: Added. + * fen/gfenfilemonitor.[ch]: Added. + * giomodule.c: + Added Solaris FEN file notification backend. + Patch from Lin Ma + +2008-03-13 Tor Lillqvist + + * Makefile.am: Actually use the gio.def file when linking the + library on Windows. Produce .lib library for Microsoft's toolchain + when possible. Install the .lib and .def file like for the other + libraries of GLib. + +2008-03-13 Tomas Bzatek + + * tests/live-g-file.c: + Include live-g-file in standard set of tests, making a temporary + directory in source structure. + + Clean target directory before the tests (write mode only) + +2008-03-12 Tor Lillqvist + + Bug 517419 - gio win32 directory monitor + Implementation by Vlad Grecescu. + + * win32/Makefile.am + * win32/gwin32directorymonitor.h + * win32/gwin32directorymonitor.c: New files. + + * giomodule.c: Set up the GWin32DirectoryMonitor plumbing. + + * Makefile.am: Add the win32 subdirectory. + +2008-03-12 Tor Lillqvist + + * glocalfileinfo.h: Introduce a macro GLocalFileStat that is the + normal struct stat on Unix but struct _stati64 on Windows to have + access to 64-bit file size information. Use that instead of struct + stat in the functions declared here in this private header. + + * glocalfileinfo.c: Corresponding changes. Move some G_OS_WIN32, + S_ISLNK and HAVE_UTIMES ifdefs and add some more to avoid compiler + warnings about unused functions and variables. Don't set + meaningless attributes like inode numbers on Windows. + +2008-03-12 Benjamin Otte + + * gvfs.h: + trim whitespace so gtk-doc groks the function name + +2008-03-12 Tor Lillqvist + + * glocalfile.c (_g_local_file_has_trash_dir): Implement as empty, + returning FALSE, on Win32. + +2008-03-11 Alexander Larsson + + * glocalfile.c: + * glocalfileinfo.[ch]: + Correctly implement can_trash by actually + looking for a trash dir, not just assuming + one exists. + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + +2008-03-11 Alexander Larsson + + * gthemedicon.c: + Fix crashes in new constructor and properties code + +2008-03-10 Murray Cumming + + * gfile.c: Minor spelling correction in documentation: + existance -> existence. + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + +2008-03-10 Matthias Clasen + + * gio.symbols: Remove g_file_contains_file here, too. + +2008-03-10 Matthias Clasen + + * gthemedicon.c: Add properties to make bindings happy. (#517676, + Samuel Cormier-Iijima) + +2008-03-08 Tor Lillqvist + + * glocalfile.c: Define FILE_READ_ONLY_VOLUME if it is missing from + winnt.h. (#521145) + +2008-03-07 Alexander Larsson + + * glocalfile.c: + (g_local_file_query_filesystem_info): + Use struct statfs.f_fstypename if availible (e.g. on OpenBSD) + Patch from Jasper Lievisse Adriaanse + +2008-03-06 Tor Lillqvist + + * gfileinfo.h: Correct milliseconds to microseconds in the doc + comments for the *_USEC attributes. + +2008-03-06 Alexander Larsson + + * gfile.c (g_file_query_exists): + Add g_return_val_if_fail check (#520700) + +2008-03-06 Alexander Larsson + + * gdesktopappinfo.c: + * gfilemonitor.c: + * gthemedicon.c: + * gunionvolumemonitor.c: + * gunixmounts.c: + * tests/g-file.c: + * tests/live-g-file.c: + * xdgmime/xdgmimecache.c: + Fix sparse warnings (#519489) + +2008-03-05 Alexander Larsson + + * gfilemonitor.c: + Make cancellation threadsafe (i.e. + guarantee its only done once, and always + done) + + * glocaldirectorymonitor.c: + Make sure we the monitor lives while the + mounts_changed callback is being called (#520484) + +2008-03-04 Wouter Bolsterlee + + * gbufferedinputstream.c: Fix typo in parameter + documentation. + +2008-03-04 Alexander Larsson + + * gfile.c: + Remove deprecated symbols we kept for one release. + +2008-03-04 Murray Cumming + + * ginputstream.c: + * goutputstream.c: Tiny documentation corrections. + +2008-03-03 Alexander Larsson + + * gunionvolumemonitor.c: + * gvolumemonitor.h: + Fix the adopt_orphan_mount vfunc to take a + volume_monitor reference in an ABI compat way. + This change is not API compat, but the added + arg is not used in the only user of this vfunc, so + all we get is a harmless warning in gvfs (#520169) + +2008-03-01 Benjamin Otte + + * gfile.c: + clarify docs for g_file_delete(). + +2008-02-29 Alexander Larsson + + * glocalfileinfo.c: + (get_content_type): + Make sure empty files get text/plain type (#518720) + +2008-02-27 Alexander Larsson + + * gcontenttype.c: + Fix type warnings + + * gunixvolume.c: + (g_unix_volume_mount): + Add missing GMountMountFlags argument + +2008-02-26 Alexander Larsson + + * glocalfile.c: + (g_local_file_delete): + Handle filesystems (like ntfs-3g) that return EEXIST instead + of ENOTEMPTY (#518816) + +2008-02-25 Matthias Clasen + + * === Released 2.15.6 === + +2008-02-25 Wouter Bolsterlee + + * gfile.c (g_file_find_enclosing_mount): + * ginputstream.c (g_input_stream_set_pending): + * glocalfile.c (g_local_file_find_enclosing_mount): + * gmount.c (g_mount_unmount), (g_mount_eject), (g_mount_remount): + * goutputstream.c (g_output_stream_set_pending): + + Fixup translator comments (#518578). + +2008-02-25 Wouter Bolsterlee + + * gfile.c (g_file_find_enclosing_mount): + * giomodule.c: + * glocalfile.c (g_local_file_find_enclosing_mount): + * goutputstream.c: + + Fix a few typos in translator comments and documentation. + +2008-02-25 Alexander Larsson + + * gfile.c: + * ginputstream.c: + * glocalfile.c: + * gmount.c: + * goutputstream.c: + Add translator comments (#518578) + +2008-02-25 Alexander Larsson + + * gfile.c: + Reintroduce g_file_contains_file, keep around for one + unstable release cycle to avoid crashing to many apps. + Make sure to delete after release. + +2008-02-25 Alexander Larsson + + * gfile.[ch]: + Remove deprecated g_file_contains_file. + +2008-02-25 Alexander Larsson + + * gfilemonitor.c: + Emit actual change signals in an idle handler. + This avoids reentrance and locking problems in + the file notification backends. + +2008-02-25 Alexander Larsson + + * gunixmounts.c: + (g_unix_mount_guess_should_display): + Remove type guessing, instead just display + mounts in /media and in ~/. + +2008-02-25 Alexander Larsson + + * glocalfile.c: + Make new strings reuse old ones. + +2008-02-25 Alexander Larsson + + * glocalfile.c: + Implement trashing and filesystem::readonly for win32 (#517235) + Patch from Yevgen Muntyan + +2008-02-23 Matthias Clasen + + * gfileinfo.h: Documentation fixes. + +2008-02-22 Alexander Larsson + + * gcontenttype.c (g_content_type_get_icon): + Look at old-style gnome mime icon names too, as many + have not moved to the new style. + +2008-02-21 Matthias Clasen + + * *.c: Correct the @include in for section docs. + +2008-02-21 David Zeuthen + + * glocalfileinfo.c: (_g_local_file_info_get): + * gcontenttype.c: + (g_content_type_get_icon): Implement this function by + moving bits from glocalfileinfo.c + (g_content_type_get_description): Unalias before getting + description (#517687) + + * gfile.c: (g_file_class_init), + (g_file_query_filesystem_info_async), + (g_file_query_filesystem_info_finish), + (query_filesystem_info_data_free), + (query_filesystem_info_async_thread), + (g_file_real_query_filesystem_info_async), + (g_file_real_query_filesystem_info_finish): + * gfile.h: Implement async version of + g_file_query_filesystem_info() + + * gfileinfo.h: Add new attributes for filesystem::use-preview + + * gio.symbols: Update + + * gthemedicon.c: (g_themed_icon_append_name): + * gthemedicon.h: Add new new convenience function. + + * gunionvolumemonitor.c: (g_union_volume_monitor_dispose), + (get_mounts), (get_volumes), (get_connected_drives), + (get_volume_for_uuid), (get_mount_for_uuid), + (g_union_volume_monitor_init), (populate_union_monitor), + (g_volume_monitor_get), (_g_mount_get_for_mount_path), + (g_volume_monitor_adopt_orphan_mount): + * gvolumemonitor.c: + * gvolumemonitor.h: Use recursive locks so it's safe for volume + monitor implementations to call into the main volume monitor. Also + separate object initialization and volume monitor initialization + such that non-native volume monitors can properly adopt their + mounts away. + +2008-02-21 Alexander Larsson + + * gfile.c: + Fix doc typo + +2008-02-21 Alexander Larsson + + * gfile.c: + Add more documentation about how GFiles work (from #517086) + +2008-02-21 Alexander Larsson + + * gfile.[ch]: + * gio.symbols: + Add new g_file_has_prefix that does the same as g_file_contains_file. + Deprecate g_file_contains_file and add a macro that converts + it to g_file_has_prefix. + The reason for this change is that the contains_file() name seems to + imply that this does more work than what it does, but its really only + a name match (from #517086) + + * gdummyfile.c: + * glocalfile.c: + * tests/g-file.c: + Update to match the above change. + +2008-02-20 Benjamin Otte + + * gfile.c: (g_file_mount_mountable), (g_file_unmount_mountable), + (g_file_eject_mountable): + even more cases of not returning in error path + +2008-02-20 Benjamin Otte + + * gfile.c: (g_file_mount_mountable): + return from function in error path. + +2008-02-18 Sylvain Pasche + + * gfile.h: + Remove trailing coma in GMountMountFlags struct + +2008-02-18 Alexander Larsson + + * glocalfile.c: + * glocalfileinfo.c: + * glocalfileoutputstream.c: + Use g_unlink/g_rename instead of unlink/rename; + do not pass raw filenames to g_set_error. (#517239) + Patch from Yevgen Muntyan. + +2008-02-18 Alexander Larsson + + * glocalfile.c: + * glocalfileoutputstream.c: + Open files with O_BINARY on windows. (#517140) + +2008-02-14 Alexander Larsson + + * glocalfileoutputstream.c: + Correctly check for HAVE_FCHMOD and HAVE_FCHOWN + +2008-02-14 Alexander Larsson + + * glocalfile.c: + Copy permissions with file on copy (#514084) + This is what cp does and makes sure e.g. the + exec permissions are kept. + Its kinda weird in that it keeps the permission bits + the same while the uid and gid are different. However + the new uid is the user so its not a security issue, + and I've heard no complaints about cp on this issue. + +2008-02-13 Ryan Lortie + + * gfileinfo.h: add G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT + +2008-02-13 Alexander Larsson + + * inotify/inotify-path.c: + Define IN_ONLYDIR if not in header (#515346) + +2008-02-12 Alexander Larsson + + * tests/live-g-file.c: + C89 fixes (#515892) + +2008-02-11 Matthias Clasen + + * === Released 2.15.5 === + +2008-02-11 Matthias Clasen + + * gio.symbols: Add g_mount_mount_flags_get_type. + +2008-02-11 Alexander Larsson + + * gfileinfo.c: + (g_file_info_set_attribute_mask): + (g_file_attribute_matcher_matches_id): + Correctly handle NULL GAttributeMatcher meaning + matches nothing. (Fixes #513492) + +2008-02-11 Alexander Larsson + + * gfile.[ch]: + * gmount.[ch]: + * gvolume.[ch]: + Added GMountMountFlags enum and added a flags + argument to all mount calls. + + This is an API/ABI change for future extensibility, + as I think we will need at least an + inhibit-autorun flag (the panel needs this). + There are no flags defined yet though. + +2008-02-11 Alexander Larsson + + * gfileinfo.h: + Added new standard::description attribute. + Requested by Vincent, and useful for both + panel and nautilus + +2008-02-11 Alexander Larsson + + * gdesktopappinfo.c: + Minor docs cleanup + +2008-02-11 Matthias Clasen + + * *.c: Documentation additions + +2008-02-10 Matthias Clasen + + * gappinfo.h: Formatting cleanup + * gappinfo.c: Fix up docs. + +2008-02-09 Matthias Clasen + + * gunixmounts.c: Consistently use getmntent_r() and fall + back to getmntent(). (#515492) + +2008-02-09 Matthias Clasen + + * gbufferedinputstream.c: + * ginputstream.c: + * goutputstream.c: Use G_STRFUNC instead of __FUNCTION__. + + * tests/data-input-stream.c: + * tests/data-output-stream.c: Portability fixes. + +2008-02-08 Alexander Larsson + + * gio.symbols: + * gunixvolume.c: + * gvolume.[ch]: + Add g_volume_should_automount. + Docs needed. + +2008-02-07 Tor Lillqvist + + * tests/Makefile.am (TEST_PROGS): live-g-file won't build on + Win32, too Unix-specific. + +2008-02-06 Behdad Esfahbod + + * pltcheck.sh: Skip g_bit_*(). Inline functions may end up with + a local plt if the compiler doesn't support what we want. Bug #514702 + +2008-02-06 Murray Cumming,,, + + reviewed by: + + * gfile.c: + * gunixinputstream.c: + * gunixoutputstream.c: + +2008-02-06 Tomas Bzatek + + * tests/Makefile.am: + * tests/live-g-file.c: + * tests/live-g-file.txt: + New GIO testing module working over real data + +2008-02-06 Tomas Bzatek + + * glocalfileoutputstream.c (g_local_file_output_stream_close): + Fallback to rename() if link() is not available + (when no support on target filesystem) + +2008-02-06 Michael Natterer + + * gfileinfo.c (g_file_info_get_icon): replace + "icon && G_IS_ICON (icon)" by simply "G_IS_ICON (icon)". + +2008-02-06 Tomas Bzatek + + * gfile.c (g_file_create): + Documentation update of error codes + +2008-02-06 Alexander Larsson + + * gdesktopappinfo.c: + Update to use both mimeapps.list and + defaults.list as discussed on xdg list. + +2008-02-06 Benjamin Otte + + * gasyncresult.c: + * gfilenamecompleter.c: + Fix some typos in the documentation. + +2008-02-06 Alexander Larsson + + * glocalfile.c (g_local_file_trash): + Don't succeed with trash if newly created + trash dir has the wrong owner. (#514696) + +2008-02-05 Alexander Larsson + + * glocalfile.c (g_local_file_move): + Don't spew warnings when destination is not + a GLocalFile. + +2008-02-03 Hans Breuer + + * makefile.msc : update + +2008-02-01 Michael Natterer + + * gcontenttype.c (_g_unix_content_type_get_parents): assign the + return value of xdg_mime_list_mime_parents() to a variable of the + correct type. + +2008-02-01 Alexander Larsson + + * gappinfo.c (g_app_info_launch_uris): + Actually call the launch_uris method, not + launch. + +2008-02-01 Alexander Larsson + + * gdesktopappinfo.c (g_desktop_app_info_equal): + Ensure appinfos with no id but same pointer value + compare equal + +2008-02-01 Alexander Larsson + + * gappinfo.c (g_app_info_launch_default_for_uri): + Don't leak appinfo. + +2008-02-01 Alexander Larsson + + * gappinfo.[ch]: + * gio.symbols: + Add g_app_info_launch_default_for_uri utility + function. (#513256) + +2008-02-01 Cosimo Cecchi + + * gdesktopappinfo.c: + Doc fix for g_app_info_get_default_for_uri_scheme () + Bug #513483. + +2008-01-30 Alexander Larsson + + * gappinfo.c: + Add doc comment about uris vs GFiles to + g_app_info_launch() + + * gdesktopappinfo.c: + Ensure uris passed to g_app_info_launch_uris() + are not roundtriped through GFile (as that + may be slightly destructive for e.g. mailto: links) + +2008-01-30 Alexander Larsson + + * tests/data-input-stream.c: + * tests/data-output-stream.c: + C89 fixes from Jens Granseuer (#512849) + +2008-01-30 Alexander Larsson + + * fam/fam-helper.c: + Fix gamin/fam difference build issue. (#509419) + +2008-01-29 Alexander Larsson + + * gappinfo.h: + * gdesktopappinfo.c: + Add G_APP_INFO_CREATE_SUPPORTS_URIS flag + +2008-01-29 Alexander Larsson + + * gdesktopappinfo.c: + * gdesktopappinfo.h: + giomodule-priv.h include moved to .c file. + +2008-01-29 Alexander Larsson + + * gnativevolumemonitor.h (struct _GNativeVolumeMonitorClass): + Remove unused prio/name fields. + +2008-01-29 Alexander Larsson + + * gcontenttype.c (looks_like_text): + Don't treat whitespace as control chars. + +2008-01-29 Alexander Larsson + + * gdesktopappinfo.c: + Lazily create the desktop files for appinfos created + by g_app_info_create_from_commandline() when needed + for mime associations. This allows run-time use + of GAppInfo object without creating unnecessary + files on disk. + +2008-01-29 Alexander Larsson + + * gio.symbols: + Added new symbols to gio.symbols + +2008-01-29 Alexander Larsson + + * gfile.[ch]: + Add g_file_query_default_handler utility to easily look up + the GAppInfo that handles a file. + + * gdesktopappinfo.[ch]: + * giomodule.c: + Set up an extension point for g_app_info_get_default_for_uri_scheme() + + * gvfs.c: + Remove unused function + +2008-01-29 Alexander Larsson + + * gfileenumerator.c: + Mention need to free returned value in + g_file_enumerator_next_files_finish docs. + Fix leak if g_file_enumerator_next_files_finish() + not called. + +2008-01-29 Alexander Larsson + + * gcontenttype.c: + (_g_unix_content_type_get_parents): + Use list_parents, not get_parents from xdgmime, because + the later doesn't use the cache. + + * xdgmime/xdgmimecache.c: + (_xdg_mime_cache_list_mime_parents): + Don't list the same type as parent multiple times. + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + +2008-01-28 Alexander Larsson + + * glocalvfs.c: + Register local vfs with prio 0. + + * gvfs.h: + Remove old name and prio class members + +2008-01-28 Matthias Clasen + + * tests/g-file.c: Disable some tests that are failing in + the absence of a http backend. + +2008-01-28 Alexander Larsson + + * giomodule.[ch]: + * gio.symbols: + Add registration hooks for extension points. + Register the gio extension points. + + * fam/gfamdirectorymonitor.c: + * fam/gfamfilemonitor.c: + * glocaldirectorymonitor.[ch]: + * glocalfilemonitor.[ch]: + * gnativevolumemonitor.h: + * gunionvolumemonitor.c: + * gunixvolumemonitor.c: + * gvfs.[ch]: + * gvolumemonitor.h: + * inotify/ginotifydirectorymonitor.c: + * inotify/ginotifyfilemonitor.c: + Use the extension points registration instead + of g_type_children(). + +2008-01-28 Matthias Clasen + + * gdrive.[hc]: + * gvolume.[hc]: Document new API. + + * gfile.c (g_file_copy_async): Fix docs + +2008-01-27 Matthias Clasen + + * gbufferedinputstream.c: + * ginputstream.c: + * goutputstream.c: Replace uses of G_GNUC_PRETTY_FUNCTION by + __FUNCTION__. + +2008-01-27 Matthias Clasen + + * glocalfile.c: Avoid trivial differences in translatable strings. + +2008-01-25 Matthias Clasen + + * fam/fam-helper.c (fam_event_to_file_monitor_event): Make this + build with gcc 3.4 (#509419) + +2008-01-25 Matthias Clasen + + * gfilemonitor.c: Add references to g_file_monitor_file/directory() + (#509994, Murray Cumming) + +2008-01-25 Matthias Clasen + + * gioscheduler.h: Make GIOSchedulerJobFunc return boolean + * gioscheduler.c: Keep calling io jobs until they return FALSE; + this allows big jobs to be executed in chunks, instead of blocking + the main loop for a long time. + + * gsimpleasyncresult.c: + * giofile.c: Adapt callers. + +2008-01-25 Alexander Larsson + + * gdesktopappinfo.c: + Implement changes discussed on xdg list. + Now we can add supported mimetypes by just using defaults.list + We can also remove associations in defaults.list. + +2008-01-25 Alexander Larsson + + * gdesktopappinfo.c: + Don't make local copy of desktop file + for mimetype changes if the file already + supports the new mimetype. + +2008-01-25 Matthias Clasen + + * ginputstream.c: + * goutputstream.c: + * gbufferedinputstream.c: + * glocalfile.c: String improvements. (#511966, + Theppitak Karoonboonyanan) + +2008-01-24 Matthias Clasen + + * gioscheduler.h: Expand docs a bit. + +2008-01-24 Alexander Larsson + + * gdrive.[ch]: + Add g_drive_get_identifier and + g_drive_enumerate_identifiers + + * gvolume.[ch]: + Add g_volume_get_identifier and + g_volume_enumerate_identifiers + + * gio.symbols: + Add symbols + + * gunixvolume.c: + Implement identifiers for unix backend + +2008-01-24 Alexander Larsson + + * gfile.[ch]: + * gfile.h: + * gio.symbols: + Add g_file_copy_async() (#511580) + Based on patch from Carlos Garcia Campos + +2008-01-23 Matthias Clasen + + * gioscheduler.c: Some documentation additions. + +2008-01-22 Alexander Larsson + + * gdesktopappinfo.c: + (g_desktop_app_info_new): + Don't leak basename. + +2008-01-22 Alexander Larsson + + * gdesktopappinfo.c: + (g_desktop_app_info_new_from_filename): + Don't leak GKeyFile + +2008-01-22 Alexander Larsson + + * glocalfileinfo.c (get_thumbnail_attributes): + Fix leak of uri + +2008-01-22 Alexander Larsson + + * glocalfile.c: + (canonicalize_filename): + Canonicalize paths that start with more than + two slashes. + + * tests/g-file.c: + (compare_two_files): + (test_g_file_new_for_path): + Test the above + +2008-01-22 Alexander Larsson + + * glocalfile.c: + Allow UTF-8 in file:// parse names. + + * tests/Makefile.am: + * tests/data-input-stream.c: + * tests/data-output-stream.c: + * tests/g-file-info.c: + * tests/g-file.c: + Added a bunch of tests from Tomas Bzatek + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + +2008-01-21 Alexander Larsson + + * gfileinputstream.[ch]: + * gfileoutputstream.[ch]: + * gio.symbols: + Remove duplicated GSeekable functions. (#509990) + Just use the g_seekable_xxx() calls instead. + +2008-01-21 Matthias Clasen + + * glocal*.c: + * gvolumemanager.c: Whitespace cleanups. + + * glocalfileoutputsteam.c (_g_local_file_output_stream_create): + Use the right mode when creating the file. + +2008-01-21 Murray Cumming,,, + + * gfileenumerator.c: + * gfileinputstream.c: + * ginputstream.c: + * goutputstream.c: Documentation: Fixed minor typos + and added more mentions of specific _finish() functions. + +2008-01-21 Alexander Larsson + + * inotify/Makefile.am: + * inotify/inotify-helper.c: + * inotify/inotify-kernel.c: + * inotify/inotify-path.c: + * inotify/local_inotify.h: Removed. + * inotify/local_inotify_syscalls.h: Removed. + Removed the included copies of the inotify + headers. We now only use the + header which exists on modern systems. + This fixes problems on ARM and SH5 (#510448) + but is also generally much cleaner and future + safe. For instance, if other OSes add support + for inotify it should "just work". + +2008-01-20 Matthias Clasen + + * inotify/*.c: Coding style fixes. + * inotify/inotify-missing.c: Use g_timeout_add_seconds + for the 1/4 Hz timer. + +2008-01-20 Matthias Clasen + + * gfile.c: + * gfilemonitor.[hc]: + * gmemoryinputstream.c: + * gmemoryoutputstream.c: + * gmountoperation.c: + * gthemedicon.c: Documentation updates + +2008-01-20 Murray Cumming + + * gfile.c: documentation: Fixed more minor + typos. + +2008-01-18 Murray Cumming + + * gmount.c: (g_mount_remount): documentation: + Mention g_mount_remount_finish() instead of + g_mount_unmount_finish(). + +2008-01-18 Murray Cumming + + * gappinfo.c: + * gcancellable.c: + * gfile.c: Fixed some minor typos in the + documentation. + +2008-01-18 Murray Cumming + + * gio/gvolumemonitor.c: + (g_volume_monitor_get_connected_drives): + (g_volume_monitor_get_volumes): + (g_volume_monitor_get_mounts): Documentation: + Clarify the ownership of the regurn GLists. + +2008-01-17 Alexander Larsson + + * gfile.h: + Add the async find_enclosing_mount version + to the header file too. + +2008-01-17 Alexander Larsson + + * gfile.c: + Add async version of find_enclosing_mount + with default implementation. + +2008-01-17 Alexander Larsson + + * gfile.c: + (g_file_copy): + (g_file_move): + Allow calls to implementation of copy and write + even if the type of the file implementations is + different. This can be used to implement native + upload and download calls in a vfs. + + * glocalfile.c: + (g_local_file_move): + Protect against the case where move is called + with one file not being local. + + Make sure we call the progress callback once + in the native move operation so that the caller + knows how many bytes were copied. + +2008-01-16 Murray Cumming + + * gappinfo.c: + * gdatainputstream.c: + * gfile.c: + * gfileoutputstream.c: + * ginputstream.c: + * gmount.c: + * goutputstream.c: + * gseekable.c: + * gunixmounts.c: Corrected some typos in the documentation: + occured -> occurred. + its -> it's (where appropriate). + +2008-01-16 Alexander Larsson + + * gfile.[ch]: + * gio.symbols: + Add g_file_query_exists (#508771) + +2008-01-15 Murray Cumming + + * gdrive.c: + * gfile.c: + * gmount.c: + * gvolume.c: For async functions that have no non-async + version, document that the GAsyncReadyCallback may be NULL. + Bug #509626. + +2008-01-15 Alexander Larsson + + * gmemoryinputstream.c: + * gmemoryoutputstream.c: + Don't do pointer arithmetic on void * (#508602) + Patch from Kazuki IWAMOTO + +2008-01-14 Matthias Clasen + + * === Released 2.15.2 === + +2008-01-14 Alexander Larsson + + * gfile.c (g_file_monitor_file): + Don't set error here, since we fallback to polling monitor. + +2008-01-14 Alexander Larsson + + * gfile.[ch]: + (g_file_monitor_directory): + (g_file_monitor_file): + Add GError to file monitor calls + + * glocaldirectorymonitor.c: + * glocaldirectorymonitor.h: + * glocalfile.c: + * glocalfilemonitor.c: + * glocalfilemonitor.h: + * gunixmounts.c: + Update for above change + +2008-01-14 Alexander Larsson + + * glocalfile.c: + (match_prefix): + Handle root correctly in g_file_get_relative_path (#508719) + +2008-01-14 Alexander Larsson + + * gasyncresult.c: + Clean up docs and example for GAsyncResult (#508074) + +2008-01-11 Murray Cumming + + * gfile.c: Clarify the sentence about GAsyncReadyCallback, + and correct some spelling mistakes. Bug #508108. + +2008-01-11 Matthias Clasen + + * glocalfileinfo.c: Add a comment. + +2008-01-10 Murray Cumming + + * gfileinfo.c: GFileInfo description: Mention + how to actually set attributes in a GFile and how to discover + which attributes are settable. Bug #508378. + +2008-01-10 A. Walton + + * gdesktopappinfo.c: (g_app_info_get_all_for_type), + (g_app_info_get_default_for_type): + Check for NULL content types. + +2008-01-10 Frederic Crozat + + * gunixmounts.c: add rpc_pipefs to systemfs list (#508309). + +2008-01-09 Murray Cumming + + * gfile.c: *_async() functions: Several small corrections + to the documentation, mostly correcting copy/paste errors + and improving some sentences. + +2008-01-09 Dan Winship + + * glocalfile.c (get_unique_filename): x86_64 fix + +2008-01-09 Alexander Larsson + + * gio.symbols: + * gunixmount.c: + * gunixmounts.[ch]: + Add g_unix_mount_guess_should_display and use + for unix volume monitor backend. + This means we more or less show what the + gnome-vfs backend did. + Based on patch from Padraig O'Briain + +2008-01-09 Alexander Larsson + + * gio.symbols: + * gthemedicon.[ch]: + Add g_themed_icon_new_with_default_fallbacks + + * gunixmounts.c: + Use default fallbacks for icons + +2008-01-09 Alexander Larsson + + * gio-marshal.list: + * gmountoperation.[ch]: + Change the API a bit so that unhandled methods + get reported via the reply, rather than by + the signal emission return value. This is because + some handlers can't know this immediately without + doing I/O, and this is an async operation that + should not block. + +2008-01-09 Alexander Larsson + + * fam/fam-helper.c: + * fam/gfamdirectorymonitor.c: + * fam/gfamfilemonitor.c: + Fix double free crash (#508224) + Patch from Joe Marcus Clarke + +008-01-07 Matthias Clasen + + * === Released 2.15.1 === + +2008-01-07 Alexander Larsson + + * gunixinputstream.c (g_unix_input_stream_skip_finish): + Fix warning (#507835) + +2008-01-07 Alexander Larsson + + * Makefile.am: + Pass --internal to glib-genmarshal + + * gfilemonitor.c: + * gmountoperation.c: + * gio-marshal.list: + Use better types for signal arguments (#507822) + +2008-01-07 Alexander Larsson + + * Makefile.am: + Build test subdir after . + Remove gdirectorymonitor.[ch] + + * gdirectorymonitor.[ch]: + * gfilemonitor.c: + * gfile.[ch]: + * gio.h: + Remove GDirectoryMonitor and make + GFileMonitor the baseclass for both file and + directory monitors. Lift the more generic + rate limiting code from GDirectoryMonitor + into GFileMonitor. + + * fam/fam-helper.c: + * fam/gfamdirectorymonitor.[ch]: + * inotify/ginotifydirectorymonitor.[ch]: + * inotify/inotify-helper.c: + * glocaldirectorymonitor.[ch]: + * glocalfile.c: + * gvolumemonitor.c: + Update for the removed GDirectoryMonitor. + + * gmemoryoutputstream.c: + Remove ununsed variable + +2008-01-07 Alexander Larsson + + * gmemoryinputstream.c: + Translate error strings + + * gio.symbols: + * gmemoryoutputstream.[ch]: + New implementation that avoids using GByteArray + in implementation and API. (#506377) + +2008-01-06 Matthias Clasen + + * tests/*: Add a test for memory input streams. + + * Makefile.am: Add tests to SUBDIRS. + +2008-01-06 Matthias Clasen + + * glocalfilemonitor.c: + * glocaldirectorymonitor.c: Mark property nicks and blurbs + for translation. + +2008-01-06 Matthias Clasen + + * gdesktopappinfo.c: Fix a docs typo. + + * gfileattribute.c: Add information about extended attributes + to the documentation. (#505058) + +2008-01-04 Alexander Larsson + + * gio-marshal.list: + * gmountoperation.c: + Use the right type (uint) for the ask_password signal. + +2008-01-04 Alexander Larsson + + * gappinfo.[ch]: + * gwin32appinfo.c: + * gio.symbols: + Add g_app_info_supports_files() + Remove desktop arg from g_app_info_should_show(). + + * gdesktopappinfo.[ch]: + Implement g_app_info_supports_files() and new should_show() + Add g_desktop_app_info_set_desktop_env() to set the desktop + for should_show(). (This will be set by gtk+ later) + +2008-01-04 Alexander Larsson + + * gio.symbols: + * gmemoryinputstream.[ch]: + Improve API so that you can use multiple chunks + of memory and custom destroy functions. (#506374) + +2008-01-03 Alexander Larsson + + * gfileinfo.c: + Handle NULL attribute matchers safely, as we return this + for empty attribute matcher strings. + +2008-01-03 Alexander Larsson + + * gunixmounts.c (g_unix_is_mount_path_system_internal): + Add /usr/local to list of internal mountpoints + +2008-01-03 Alexander Larsson + + * glocalfileinfo.c: + Check for HAVE_LCHOWN (#505887) + +2008-01-03 Alexander Larsson + + * gfileinfo.h: + * glocalfileinfo.c: + Add define for selinux context attribute. + Fix missing : -> :: namespace separator change + Fix missing _ -> - name change for xattr-sys. + (#505058) + +2008-01-03 Alexander Larsson + + * fam/Makefile.am: + Link to libglib and libgobject directly (#504879) + Patch from Sebastien Bacher + +2008-01-01 Wouter Bolsterlee + + * gfile.c: Expanded the g_file_new_for_commandline_arg + description a bit, based on the code and the docs of the + other g_file_new_for_* functions. + +2007-12-31 Wouter Bolsterlee + + * gfilemonitor.h: Fixed typo in docs. + +2007-12-31 Mathias Hasselmann + + Updates to GIO documentation. (#506395, Mikael Hermansson) + + * gcontenttype.c: Describe memory management for return value of + g_content_types_get_registered(). Missing piece from #505815. + * gdrive.c, gmount.c, gvolumemonitor.c: Add more description to + GVolume, GDrive, GMounts, which hopefully gives the user less + confusions when using this API. Following explainations from + Alexander Larsson on gtk-devel-list. + +2007-12-30 Matthias Clasen + + * gfileinfo.c: Expand the long description. + +2007-12-30 Matthias Clasen + + * fam/Makefile.am: + * inotify/Makefile.am: Use GLIB_DEBUG_FLAGS. This should + fix builds with --disable-visibility. (#500273, Christian Persch) + +2007-12-30 Matthias Clasen + + * gdesktopfileinfo.c (g_app_info_get_all): Don't include NULLs + in the list of returned app infos. + +2007-12-30 Matthias Clasen + + * gappinfo.c: Fix a cross-reference + +2007-12-30 Matthias Clasen + + * gfileinputstream.c: + * gfileoutputstream.c: + * gloadableicon.h: + * gunixmounts.c: + * gmount.h: + * gdesktopappinfo.c: + * gvolumemonitor.c: + * gfileinfo.c: Documentation updates. + +2007-12-26 Matthias Clasen + + * gdesktopappinfo.c: Include crt_externs.h. (#505730, + Tommi Komulainen) + +2007-12-26 Matthias Clasen + + * gcontenttype.c (g_content_types_get_registered): Don't return + freed memory (#505815, Mikael Hermansson) + +2007-12-25 Paolo Borelli + + * glocalfileinfo.c (set_info_from_stat): fix typo in the ifdef + used to detect statbuf->st_blocks. (#505042) + +2007-12-24 Matthias Clasen + + * gdesktopappinfo.c (g_desktop_app_info_launch): Fix the + environment handling. (#504829, Cosimo Cecchi) + +2007-12-22 Matthias Clasen + + * gappinfo.c: Doc improvements + + * gdesktopappinfo.c (g_app_info_get_all): Return app infos, + not ids. + +2007-12-20 Matthias Clasen + + * === Released 2.15.0 === + +2007-12-20 Hans Breuer + + * makefile.msc : don't build gdesktopappinfo.obj, it collides + with symbols gwin32appinfo.obj, added gmount.obj + * gio.symbols : mark g_desktop_app_* as G_OS_UNIX + +2007-12-20 Alexander Larsson + + * gfile.c: + * gfileattribute.c: + * gfileinfo.c: + * gfileinfo.h: + * gfilenamecompleter.c: + * glocalfile.c: + * glocalfileinfo.c: + * gpollfilemonitor.c: + File attribute renames: + std:: -> standard:: + fs:: -> filesystem:: + id::fs -> id::filesystem + +2007-12-20 Alexander Larsson + + * gfile.[ch]: + * gdrive.[ch]: + * gmount.[ch]: + * gvolume.[ch]: + * gunixmount.c: + * gunixvolume.c: + * gio.symbols: + Add GMountUnmountFlags to all unmount and + eject calls. + Add g_mount_remount() call. + +2007-12-20 Alexander Larsson + + * gvfs.c (get_default_vfs): + Fix unused variable warning + +2007-12-19 Matthias Clasen + + * pltcheck.sh: Update + +2007-12-19 Matthias Clasen + + * gunionvolumemonitor.c: + * gunixmount.c: Remove C99 comments + +2007-12-19 Matthias Clasen + + * gio.symbols: Add some missing symbols + +2007-12-19 Alexander Larsson + + * giomodule.c: + Make g_io_modules_load_all_in_directory not unuse + loaded modules so that users of it can do stuff + before unloading. + Init internal "module" types. + Initialize static prio and name for types so that + we don't have to load modules to get it. + + * gnativevolumemonitor.h: + * gvolumemonitor.h: + Move is_supported to parent class so that + non-native monitors can avoid being initialized + too. (For instance GDaemonVolumeMonitor if we're + not using GDaemonVfs.) + + * glocaldirectorymonitor.[ch]: + * glocalfilemonitor.[ch]: + * gunionvolumemonitor.c: + * gunixvolumemonitor.c: + * gvfs.c: + Find plugins using the static prio+name to + avoid unnecessarily loading the modules. + +2007-12-19 Alexander Larsson + + * giomodule.c: + Remove warnings + +2007-12-19 Alexander Larsson + + * gunionvolumemonitor.c: + Store the native type as GType, not class so that + we can unload it. But still avoid unnecessarily + unload modules. + +2007-12-19 David Zeuthen + + Introduce g_volume_monitor_adopt_orphan_mount() function. Also + add signals 'disconnected' and 'eject-button' on GDrive. Add + signal 'removed' on GVolume and 'unmounted' on GMount. + + * gdrive.c: (g_drive_base_init): + * gdrive.h: + * gfile.c: (g_file_mount_mountable), + (g_file_mount_enclosing_volume): + * gio.symbols: + * gioerror.h: + * gmount.c: (g_mount_base_init): + * gmount.h: + * gunionvolumemonitor.c: (g_volume_monitor_adopt_orphan_mount): + * gunixvolumemonitor.c: (update_volumes), (update_mounts): + * gvolume.c: (g_volume_base_init), (g_volume_mount): + * gvolume.h: + * gvolumemonitor.h: + +2007-12-17 Matthias Clasen + + * *.c: Fix up includes in the section docs. + +2007-12-17 Alexander Larsson + + * gnativevolumemonitor.h: + * gunionvolumemonitor.c: + * gunixvolumemonitor.c: + Add is_supported() to GNativeVolumeMonitorClass so + that we can avoid having to create an object to see + if the backend is supported at runtime. + Also add name member and an env var to pick a specific + volume monitor backend. + + * gmountprivate.h: + * glocalfile.c: + Add cancellable to _g_mount_get_for_mount_path() + + * glocaldirectorymonitor.c: + * glocalfilemonitor.c: + Avoid loading and unloading modules while sorting. + +2007-12-17 Matthias Clasen + + * gio.symbols: + * gunixmounts.[hc]: Namespace waste reduction, move some + g_get_unix_mount functions to the g_unix_mount namespace. + + * gunixmounts.c: + * gunixvolumemonitor.c: + * glocalfile.c: + * glocaldirectorymonitor.c: Update all callers. + + * gunixmounts.h: Remove leftover g_unix_get_canonical_device_path + +2007-12-17 Alexander Larsson + + * gfile.c: + Add doc comments about what GFile operations are + guaranteed to not block. + +2007-12-17 Alexander Larsson + + * gunixmounts.c: + Add missing #ifdef fixing OSX build. + (#503334, patch from Richard Hult) + +2007-12-14 David Zeuthen + + * Makefile.am: + * gio.symbols: + * gmount.c: (g_mount_get_uuid), (g_mount_can_eject), + (g_mount_eject), (g_mount_eject_finish): + * gmount.h: + * gunionvolumemonitor.c: (g_union_volume_monitor_finalize), + (get_volume_for_uuid), (get_mount_for_uuid), + (g_union_volume_monitor_class_init), + (get_default_native_type_with_exclude), (get_default_native_type), + (get_native_type), (update_native_type), + (g_union_volume_monitor_init), (_g_mount_get_for_mount_path): + * gunixmount.c: (_g_unix_mount_new), (g_unix_mount_get_uuid), + (g_unix_mount_can_eject), (eject_unmount_cb), + (eject_unmount_read_error), (eject_unmount_do), + (g_unix_mount_unmount), (g_unix_mount_eject), + (g_unix_mount_eject_finish), (g_unix_mount_mount_iface_init): + * gunixmounts.c: (g_unix_mount_guess_can_eject), + (g_unix_mount_point_guess_can_eject): + * gunixmounts.h: + * gunixvolume.c: (_g_unix_volume_new), (g_unix_volume_get_uuid), + (g_unix_volume_can_eject), (g_unix_volume_get_drive), + (eject_mount_cb), (eject_mount_read_error), (eject_mount_do), + (g_unix_volume_mount), (g_unix_volume_eject), + (g_unix_volume_eject_finish), (g_unix_volume_volume_iface_init): + * gunixvolumemonitor.c: (get_volume_for_uuid), + (get_mount_for_uuid), (g_unix_volume_monitor_class_init), + (update_mounts): + * gvolume.c: (g_volume_get_uuid), (g_volume_can_eject), + (g_volume_eject), (g_volume_eject_finish): + * gvolume.h: + * gvolumemonitor.c: (g_volume_monitor_get_volume_for_uuid), + (g_volume_monitor_get_mount_for_uuid): + * gvolumemonitor.h: + + Provide eject() on both GMount and GVolume and utility functions + to guess whether a GUnixMountPoint or GUnixMountEntry should be + ejected. Introduce the concept of UUID's and wire it into GVolume + and GMount and provide API on GVolumeMonitor to find such + instances. Also handle the case where an external + GNativeVolumeMonitor fails to initialize. Lock around the + _g_get_mount_for_mount_path() function such that volume monitor + implementations won't have to do locking themselves. + +2007-12-17 Matthias Clasen + + * gdesktopappinfo.c: + * gunixmounts.c: + * gfileinfo.c: + * gvolumemonitor.c: + * gfile.h: + * gioscheduler.c: + * gvolume.h: Documentation updates + +2007-12-14 Matthias Clasen + + * gunixmounts.c: + * gfile.h: Doc updates + +2007-12-14 Matthias Clasen + + * gcontenttype.c: + * gdesktopappinfo.c: Use hash table iterators. + +2007-12-14 Alexander Larsson + + * Makefile.am: + * gfileattribute.[ch]: + * gfileattribute-priv.h: + Move GFileAttributeValue to a private header, as + its sort of ugly. + + * gfile.[ch]: + Make set_attribute take a type + a pointer instead + of a GFileAttributeValue. + + * gfileinfo.[ch]: + Fix up for above changes. + Add g_file_info_get_attribute_data to get + all info in one call, g_file_info_get_attribute_status + to get the status and g_file_info_get_attribute_as_string. + + * gio.symbols: + * glocalfile.c: + * glocalfileinfo.[ch]: + Update for changes + + * gunixmounts.c: + Make _guess_type static. + +2007-12-14 Yevgen Muntyan + + * Makefile.am: + * inotify/Makefile.am: Fixed build when srcdir != builddir, + made mkenums and friends use temporary files to avoid leaving + empty generated files on failure (#503470). + +2007-12-14 Alexander Larsson + + * gmountoperation.h: + Fix AKS -> ASK typo + +2007-12-14 Alexander Larsson + + * gappinfo.h: + * gfile.[ch]: + * gfileattribute.[ch]: + * gio.symbols: + * glocalfile.c: + * glocalfileoutputstream.c: + * gmountoperation.[ch]: + * goutputstream.[ch]: + Clean up all flags enums to not have _FLAGS in them + Make the names of some of the enums better. + + * glocalfileinfo.c: + Fix warning + +2007-12-14 Michael Natterer + + * gio.symbols: fix g_io_scheduler symbol names. + +2007-12-14 Alexander Larsson + + * Makefile.am: + * fam/Makefile.am: + * gappinfo.h: + * gasyncresult.h: + * gbufferedinputstream.h: + * gbufferedoutputstream.h: + * gcancellable.h: + * gcontenttype.h: + * gdatainputstream.h: + * gdataoutputstream.h: + * gdesktopappinfo.h: + * gdirectorymonitor.h: + * gdrive.h: + * gfile.h: + * gfileattribute.h: + * gfileenumerator.h: + * gfileicon.h: + * gfileinfo.h: + * gfileinputstream.h: + * gfilemonitor.h: + * gfilenamecompleter.h: + * gfileoutputstream.h: + * gfilterinputstream.h: + * gfilteroutputstream.h: + * gicon.h: + * ginputstream.h: + * gio.h: + * gioerror.h: + * giomodule.h: + * gioscheduler.h: + * gloadableicon.h: + * gmemoryinputstream.h: + * gmemoryoutputstream.h: + * gmount.h: + * gmountoperation.h: + * goutputstream.h: + * gseekable.h: + * gsimpleasyncresult.h: + * gthemedicon.h: + * gunixinputstream.h: + * gunixmounts.h: + * gunixoutputstream.h: + * gvfs.h: + * gvolume.h: + * gvolumemonitor.h: + * inotify/Makefile.am: + Only allow including from apps + +2007-12-14 Alexander Larsson + + * gioscheduler.[ch]: + * gsimpleasyncresult.c: + Rename gioscheduler calls so they all use the g_io_schedule_ prefix. + Split out the send_to_mainloop call into two versions instead + of having the block argument. + +2007-12-13 Alexander Larsson + + * gcancellable.[ch]: + * gio.symbols: + * gbufferedinputstream.c: + * gfileenumerator.c: + * gfileinputstream.c: + * gfileoutputstream.c: + * ginputstream.c: + * gioscheduler.c: + * goutputstream.c: + g_push/pop_current_cancellable -> + g_cancellable_push/pop_current + +2007-12-13 Alexander Larsson + + * gfile.[ch]: + * gio.symbols: + Rename g_mount_for_location to g_file_mount_enclosing_volume. + +2007-12-13 Alexander Larsson + + * gmountoperation.h: + G_PASSWORD_FLAGS_ANON_SUPPORTED -> G_PASSWORD_FLAGS_ANONYMOUS_SUPPORTED + +2007-12-12 Alexander Larsson + + * gioscheduler.c: + Fix race condition when freeing proxy in + g_io_job_send_to_mainloop(). + +2007-12-12 Alexander Larsson + + * gfileattribute.c: + * gfileinfo.[ch]: + * glocalfile.c: + * glocalfileinfo.c: + Make attribute namespace separator "::" instead of ":". + Use - instead of _ as separator in attribute names. + +2007-12-12 Alexander Larsson + + * gbufferedinputstream.h: + * gbufferedoutputstream.h: + * gdatainputstream.h: + * gdataoutputstream.h: + * gdirectorymonitor.h: + * gfileenumerator.h: + * gfileinputstream.h: + * gfilemonitor.h: + * gfileoutputstream.h: + * gfilterinputstream.h: + * gfilteroutputstream.h: + * ginputstream.h: + * glocalfileinputstream.h: + * glocalfileoutputstream.h: + * gmemoryinputstream.h: + * gmemoryoutputstream.h: + * gnativevolumemonitor.h: + * goutputstream.h: + * gunixinputstream.h: + * gunixoutputstream.h: + * gvfs.h: + * gvolumemonitor.h: + s/parent/parent_instance/ in GObjects + +2007-12-12 Alexander Larsson + + * gdrive.h: + * gmount.h: + * gvolume.h: + No need for padding for interfaces + +2007-12-12 Alexander Larsson + + * gappinfo.[ch]: + * gasyncresult.c: + * gbufferedinputstream.c: + * gbufferedoutputstream.c: + * gcancellable.c: + * gcontenttype.c: + * gdatainputstream.[ch]: + * gdesktopappinfo.c: + * gdirectorymonitor.c: + * gfile.[ch]: + * gfileattribute.[ch]: + * gfileicon.[ch]: + * gfileinfo.h: + * gfileinputstream.h: + * gfilemonitor.[ch]: + * gfileoutputstream.[ch]: + * gfilterinputstream.h: + * gfilteroutputstream.h: + * gicon.h: + * gioscheduler.c: + * gloadableicon.[ch]: + * gmemoryinputstream.c: + * gmountoperation.c: + * gthemedicon.c: + Fix up a bunch of details in the docs. + + * glocalfileinfo.c: + CR/LF -> LF fixups + +2007-12-11 David Zeuthen + + Rework how volumes, drives and volume monitoring is + done. Previosly the model was + + GDrive <1-1> GVolume + + where a GDrive instance represented a mount point and a GVolume + instance represented a mounted file system. This patch changes it + the model to + + GDrive <1-N> GVolume <1-1> GMount + + where GMount now serves the purpose of the old GVolume and the new + GVolume serves the purpose of the old GDrive. In addition the new + GDrive interface is used to represent a collection of GVolume + instances (typically partitions) and also contains utility to query + the state of the physical drive the GDrive object represents (such + as checking for media, polling the drive, ejecting the media etc.). + + Also implement mounting and unmounting in the Unix volume monitor + backend. A subquent patch will introduce GDrive support for ejection + of media. + + * Makefile.am: + * gdrive.c: (g_drive_is_media_check_automatic), + (g_drive_is_media_removable), (g_drive_has_media), + (g_drive_can_poll_for_media), (g_drive_eject), + (g_drive_eject_finish), (g_drive_poll_for_media), + (g_drive_poll_for_media_finish): + * gdrive.h: + * gfile.c: (g_file_find_enclosing_mount): + * gfile.h: + * gio.symbols: + * glocaldirectorymonitor.c: + (g_local_directory_monitor_constructor), (mounts_changed): + * glocalfile.c: (get_mount_info), + (g_local_file_find_enclosing_mount), + (g_local_file_file_iface_init): + * gnativevolumemonitor.h: + * gunionvolumemonitor.c: (get_mounts), (get_volumes), + (get_connected_drives), (g_union_volume_monitor_class_init), + (child_volume_added), (child_volume_removed), + (child_volume_changed), (child_mount_added), (child_mount_removed), + (child_mount_pre_unmount), (child_mount_changed), + (child_drive_changed), (g_union_volume_monitor_add_monitor), + (g_union_volume_monitor_remove_monitor), + (_g_mount_get_for_mount_path): + * gunixmounts.c: (g_unix_is_mount_path_system_internal), + (guess_system_internal), (_g_get_unix_mounts), + (_g_get_unix_mount_points), (g_get_unix_mount_at), + (g_unix_mount_free), (g_unix_mount_compare), + (g_unix_mount_get_mount_path), (g_unix_mount_get_device_path), + (g_unix_mount_get_fs_type), (g_unix_mount_is_readonly), + (g_unix_mount_is_system_internal), (g_unix_mount_guess_type), + (type_to_icon), (g_unix_mount_guess_name), + (g_unix_mount_guess_icon), (g_unix_mount_point_guess_name), + (g_unix_mount_point_guess_icon), (_canonicalize_filename), + (_resolve_symlink), (_resolve_dev_root): + * gunixmounts.h: + * gunixvolume.c: (g_unix_volume_finalize), (_g_unix_volume_new), + (_g_unix_volume_disconnected), (_g_unix_volume_set_mount), + (_g_unix_volume_unset_mount), (g_unix_volume_get_icon), + (g_unix_volume_get_name), (g_unix_volume_can_mount), + (g_unix_volume_get_drive), (g_unix_volume_get_mount), + (_g_unix_volume_has_mount_path), (mount_cb), (mount_read_error), + (g_unix_volume_mount), (g_unix_volume_mount_finish), + (g_unix_volume_volume_iface_init): + * gunixvolume.h: + * gunixvolumemonitor.c: (g_unix_volume_monitor_finalize), + (get_mounts), (get_volumes), (get_connected_drives), + (get_mount_for_mount_path), (g_unix_volume_monitor_class_init), + (mountpoints_changed), (mounts_changed), + (g_unix_volume_monitor_init), + (_g_unix_volume_monitor_lookup_volume_for_mount_path), + (find_mount_by_mountpath), (update_volumes), (update_mounts): + * gunixvolumemonitor.h: + * gvolume.c: (g_volume_get_mount), (g_volume_can_mount), + (g_volume_mount), (g_volume_mount_finish): + * gvolume.h: + * gvolumemonitor.c: (g_volume_monitor_class_init), + (g_volume_monitor_get_connected_drives), + (g_volume_monitor_get_volumes), (g_volume_monitor_get_mounts): + * gvolumemonitor.h: + +2007-12-10 Matthias Clasen + + * gmountoperation.h (GPasswordFlags): Close the gap + +2007-12-10 Matthias Clasen + + * Makefile.am: Install gdesktopappinfo.h as unix-specific header. + * gio.symbols: + * gdesktopappinfo.[hc]: Remove _-prefixes + +2007-12-10 Tor Lillqvist + + * glocalfile.c: Add some more G_OS_WIN32 conditionals to silence + gcc warnings. + +2007-12-10 Alexander Larsson + + * gfile.c (g_file_set_display_name): + Don't hardcode '/' (#502727) + +2007-12-09 Hans Breuer + + * makefile.msc : follow lib naming convention + * glocalfileinfo.c(win32_get_file_user_info) : working implementation + for user and group name, tested with ../tests/gio-ls + +2007-12-09 A. Walton + + * gdesktopappinfo.c: + * gdrive.c: + * gdrive.h: + * gfile.c: + * gfile.h: + * gfileattribute.c: + * gfileenumerator.c: + * gioerror.c: + * gioscheduler.c: + * gioscheduler.h: + * gloadableicon.c: + * gmemoryinputstream.c: + * gmemoryoutputstream.c: + * goutputstream.h: + * gsimpleasyncresult.c: + More documentation cleanup and filling in missing information, bringing + GIO to 99% symbol coverage. + +2007-12-08 Hans Breuer + + [gio compiles and links on win32, not sure how much already works] + * glocaldirectorymonitor.c : ifdefed out inotify emulation for win32 + * glocalfile.c : use HAVE_UNISTD_H; implement file system size info + base on win32 API; prefer g_lstat() over lstat(); instead of + localtime_r() use an all GLib implementation on win32; + get_mount_info() still needs a win32 specifc implementation + * glocalfileinfo.c : use HAVE_*_H; start of implementation of + win32_get_file_user_info to get owner/group info without uid/gid + * glocalfileinputstream.c : include on win32 + * glocalfileoutputstream.c : include on win32 and some S_IS* + definition, use g_win32_ftruncate() for G_OS_WIN32 + * gwin32appinfo.c : optionalize a bunch on #ifdef AssocQueryString + it is available with mingw/w32api but a mess with the M$ Platform SDKs + see: http://mail.gnome.org/archives/gtk-devel-list/2007-December/msg00014.html + * makefile.msc : updated + +2007-12-07 Alexander Larsson + + * glocalfileenumerator.c (_g_local_file_enumerator_new): + Avoid warning spew if error == NULL + +2007-12-07 Alexander Larsson + + * gfile.c: + Update docs wrt etags + +2007-12-06 Alexander Larsson + + * glocalfileinfo.h: + Include sys/types.h for dev_t (#501919) + +2007-12-06 Behdad Esfahbod + + * gio.symbols: + * pltcheck.sh: + Make abicheck and pltcheck pass. + +2007-12-05 Alexander Larsson + + * Makefile.am: + * giomodule-priv.h: Added. + * glocaldirectorymonitor.c: + * glocalfilemonitor.c: + * gunionvolumemonitor.c: + * gvfs.c: + Actually add the declaration of _g_io_modules_ensure_loaded + +2007-12-05 Alexander Larsson + + * gdatainputstream.c: + Fix warnings + + * gio.symbols: + * giomodule.[ch] + * glocaldirectorymonitor.c: + * glocalfilemonitor.c: + * gunionvolumemonitor.c: + * gvfs.c: + Make g_io_modules_ensure_loaded a private function and + don't pass in the dirname. This means we can do magic + directory finding in the win32 version. + Export the actual load-modules-in-directory code so that + gvfs can reuse that. + +2007-12-05 Alexander Larsson + + * gbufferedinputstream.c: + * gbufferedoutputstream.c: + * gdrive.[ch]: + * gfile.[ch]: + * gfileenumerator.[ch]: + * gfileinputstream.c: + * gfileoutputstream.[ch]: + * gfilterinputstream.c: + * gfilteroutputstream.c: + * ginputstream.[ch]: + * glocalfile.c: + * glocalfileenumerator.c: + * glocalfileinputstream.c: + * glocalfileoutputstream.c: + * gmemoryinputstream.c: + * gmemoryoutputstream.c: + * goutputstream.[ch]: + * gseekable.[ch]: + * gunixdrive.c: + * gunixinputstream.c: + * gunixoutputstream.c: + Rename all struct members named: + read, write, close, truncate, or mount + to foo_fn, as these are reserved names + and could be defined as macros in libc. + (#501645) + +2007-12-04 Alexander Larsson + + * goutputstream.c: + (g_output_stream_close): + Only call flush if non-null. + +2007-11-30 Dan Winship + + * ginputstream.c (g_input_stream_set_pending): Make this take a + GError and return a gboolean, and do the "outstanding operation" + check (and the "stream is already closed" check) itself. + (g_input_stream_clear_pending): Formerly set_pending(FALSE). + + * goutputstream.c (g_output_stream_set_pending) + (g_output_stream_clear_pending): Likewise + + * gbufferedinputstream.c: + * gfileinputstream.c: + * gfileoutputstream.c: Update for that + + * gsimpleasyncresult.c (g_simple_async_report_gerror_in_idle): + Like g_simple_async_report_error_in_idle, but takes a GError + rather than building one. + +2007-11-30 Dan Winship + + * goutputstream.c: Don't cheat and unset the "pending" flag around + inner calls. Instead, call the class method directly rather than + the wrapper function that checks "pending" + +2007-12-03 Behdad Esfahbod + + * glib/gnulib/Makefile.am: Fix EXTRA_DIST automake warnings. (#501107) + +2007-12-03 Hans Breuer + + [start of port to win32/msvc] + * gcancellable.c : HAVE_UNIST_H and _pipe() + * gcontenttype.c : only include in the UNIX branch + * gdatainputstream.c : pointer arithmetic on void* is a gcc extension + * gdummyfile.c glocalfileinputstream.c gsimpleasyncresult.c : use + HAVE_UNIST_H + * glocalfileoutputstream.c : use HAVE_UNIST_H and s/ssize_t/gssize/ + * glocalvfs.c : use HAVE_PWD_H + * gio.symbols : ifdef unix specific functions with G_OS_UNIX + * makefile.msc : new file (maybe later converted to makefile.msc.in) + * Makefile.am : added to EXTRA_DIST + +2007-12-03 Matthias Clasen + + * gfile.c (g_file_copy): Add a cross-reference to g_file_dup(). + (#499783) + +2007-12-03 Alexander Larsson + + * glocalfileinfo.c: + Handle OSX style xattrs API (#500506) + +2007-12-03 Alexander Larsson + + * gfile.[ch]: + * glocalfile.c: + Add G_FILE_COPY_NO_FALLBACK_FOR_MOVE flag + +2007-12-02 A. Walton + + * gfile.c: + * gfileattribute.c: + Documentation accuracy fixes. + +2007-12-01 Behdad Esfahbod + + * gioenumtypes.c.template: Fix typo. + +2007-12-01 Matthias Clasen + + * gioenumtypes.c.template: Make threadsafe get_type() functions. + +2007-12-01 Matthias Clasen + + * gdirectorymonitor.c: + * gfilemonitor.c: Add properties + + * gbufferedoutputstream.c: Don't mark buffer-size property + as construct-only. + +2007-12-01 Matthias Clasen + + * gbufferedoutputstream.c: Add auto-grow property. + +2007-11-30 Matthias Clasen + + * *.c: Unify the capitalization of section headings. + +2007-11-30 Matthias Clasen + + * gmountoperation.c: Add properties + + * gdatainputstream.c: Turn byte-order and newline-type into + properties. + +2007-11-30 Matthias Clasen + + * gioenumtypes.[hc].template: Templates for enum registration + + * Makefile.am: Generate gioenumtypes.[hc] + + * gio.h: Include gioenumtypes.h + * gappinfo.h: + * gfile.h: Add some explicit nicks. + + * gio.symbols: Add new symbols + + * pltcheck.sh: Adjust + +2007-11-30 Matthias Clasen + + * *.c: Explain etags and link to the explanation + +2007-11-29 Matthias Clasen + + * *.c: Explain I/O priority. + + * *.c: More coding style fixes. + +2007-11-29 Matthias Clasen + + * gasyncresult.c: Add another paragraph to the intro, + adjust coding style of example. + +2007-11-29 A. Walton + + * gappinfo.c: + Fixes unknown meaning in GAppLaunchContext docs. + * gfile.c: + Clarify asynchronous ops. + * gfileattribute.c: + Fix entity tag docs. + * gicon.c: + * gthemedicon.c: + Provides missing gtk-doc section, fixes API docs slighly. + * gsimpleasyncresult.c: + Fill in missing info in docs. + * gunixinputstream.c: + * gunixoutputstream.c: + Be more expressive in short description. + * gunixvolume.c: + Remove gtk-doc stubs for non-public API. + +2007-11-28 Matthias Clasen + + * *.c: Coding style fixups + +2007-11-28 Matthias Clasen + + * inotify/inotify-helper.c: Don't export the lock from libgio. + +2007-11-28 Matthias Clasen + + * Makefile.am: + * abicheck.sh: Fix copy-and-paste leftovers + +2007-11-28 Matthias Clasen + + * gfile.h: Add G_FILE_COPY_FLAGS_NONE for consistency. + +2007-11-28 Alexander Larsson + + * Makefile.am: + * gdriveprivate.h: + Removed unnecessary file + + * gdesktopappinfo.[ch]: + * gdummyfile.[ch]: + * gfile.c: + * glocaldirectorymonitor.[ch]: + * glocalfile.[ch]: + * glocalfileenumerator.[ch]: + * glocalfileinputstream.[ch]: + * glocalfilemonitor.[ch]: + * glocalfileoutputstream.[ch]: + * glocalvfs.[ch]: + * gnativevolumemonitor.c: + * gpollfilemonitor.[ch]: + * gunionvolumemonitor.[ch]: + * gunixdrive.[ch]: + * gunixvolume.[ch]: + * gunixvolumemonitor.[ch]: + * gvfs.c: + * gvolumeprivate.h: + * inotify/ginotifydirectorymonitor.[ch]: + * inotify/ginotifyfilemonitor.[ch]: + * inotify/inotify-helper.c: + Append _ to all internal functions + + * gio.symbols: + Add missing symbols + Export symbols needed for modules + +2007-11-28 Alexander Larsson + + * Makefile.am: + * abicheck.sh: Added. + * makegioalias.pl: Added. + * pltcheck.sh: Added. + * gio.symbols: Added. + * *.c: + * inotify/*.c + Initial work on adding symbol handling. + + * gvfs.h: + Correct ifdef guard name + + * fam/Makefile.am: + * inotify/Makefile.am: + * xdgmime/Makefile.am: + Include toplevel Makefile.decl + +2007-11-27 Matthias Clasen + + * gcontenttype.c: Move doc comments to the unix section. + + * *.[hc]: More trivial doc corrections. + +2007-11-27 Matthias Clasen + + * gpollfilemonitor.c: + * gunixmounts.c: + * gvfs.c: + * gfile.c: + * gdesktopappinfo.c: + * gwin32appinfo.c: + * gvolume.c: + * glocalvfs.c: + * gvolumemonitor.c: + * gdatainputstream.c: + * gdatainputstream.h: + * gdataoutputstream.c: + * gdataoutputstream.h: + * gfileinfo.h: Doc cleanups + +2007-11-28 Andre Klapper + + * gdesktopappinfo.c: Fix a typo. + +2007-11-27 Andre Klapper + + * glocalfileoutputstream.c: Fix a typo. + +2007-11-27 Alexander Larsson + + * gio.h: + Don't include removed headers + +2007-11-27 Alexander Larsson + + * Makefile.am: + * gsocketinputstream.[ch]: Removed. + * gsocketoutputstream.[ch]: Removed. + * gunixinputstream.[ch]: Added. + * gunixoutputstream.[ch]: Added. + Renamed GSocket*Stream to GUnix*Stream and made + it unix-only, since its not really only for sockets + and it only works on unix (but is highly useful there). + +2007-11-27 Andrew Walton + * gappinfo.c: + * gappinfo.h: + * gasynchelper.c: + * gasyncresult.c: + * gasyncresult.h: + * gbufferedinputstream.c: + * gbufferedinputstream.h: + * gbufferedoutputstream.c: + * gbufferedoutputstream.h: + * gcancellable.c: + * gcancellable.h: + * gcontenttype.c: + * gdatainputstream.c: + * gdatainputstream.h: + * gdataoutputstream.c: + * gdataoutputstream.h: + * gdirectorymonitor.c: + * gdirectorymonitor.h: + * gdrive.c: + * gdrive.h: + * gfile.c: + * gfile.h: + * gfileattribute.c: + * gfileattribute.h: + * gfileenumerator.c: + * gfileenumerator.h: + * gfileicon.c: + * gfileicon.h: + * gfileinfo.c: + * gfileinfo.h: + * gfileinputstream.c: + * gfileinputstream.h: + * gfilemonitor.c: + * gfilemonitor.h: + * gfilenamecompleter.c: + * gfilenamecompleter.h: + * gfileoutputstream.c: + * gfileoutputstream.h: + * gfilterinputstream.c: + * gfilterinputstream.h: + * gfilteroutputstream.c: + * gfilteroutputstream.h: + * gicon.c: + * gicon.h: + * ginputstream.c: + * ginputstream.h: + * gioerror.c: + * gioerror.h: + * giomodule.c: + * giomodule.h: + * gioscheduler.c: + * gioscheduler.h: + * gloadableicon.c: + * gloadableicon.h: + * glocalfileoutputstream.c: + * gmemoryinputstream.c: + * gmemoryinputstream.h: + * gmemoryoutputstream.c: + * gmemoryoutputstream.h: + * gmountoperation.c: + * gmountoperation.h: + * goutputstream.c: + * goutputstream.h: + * gpollfilemonitor.c: + * gseekable.c: + * gseekable.h: + * gsimpleasyncresult.c: + * gsimpleasyncresult.h: + * gsocketinputstream.c: + * gsocketinputstream.h: + * gsocketoutputstream.c: + * gsocketoutputstream.h: + * gthemedicon.c: + * gthemedicon.h: + * gunixdrive.c: + * gunixmounts.c: + * gunixmounts.h: + * gunixvolume.c: + * gunixvolumemonitor.c: + * gurifuncs.c: + * gurifuncs.h: + * gvfs.c: + * gvfs.h: + * gvolume.c: + * gvolume.h: + * gvolumemonitor.c: + * gvolumemonitor.h: + Bumps documentation to 93% symbol coverage, touching most + of the public files. Fixes broken function documentation prototypes. + Fixes GCancellable inaccuracies. Removes unnecessary incomplete + gtk-doc headers in private files. + +2007-11-27 Jürg Billeter + + * gbufferedinputstream.c: (g_buffered_input_stream_peek_buffer), + (g_buffered_input_stream_read_byte): + * gbufferedinputstream.h: + New functions for efficient access to buffer and simple single byte + reads. + + * gdatainputstream.c: (scan_for_newline), (scan_for_chars), + (g_data_input_stream_read_until): + * gdatainputstream.h: + Use peek_buffer to avoid memcpy in scan_for_newline, implement + read_until with multiple stop chars. + +2007-11-27 Alexander Larsson + + * Makefile.am: + * fam/Makefile.am: + * inotify/Makefile.am: + Use the user-specified giomoduledir + +2007-11-27 Alexander Larsson + + * Makefile.am + * gio.h: + Add catch-all gio.h header + Don't install gdummyfile.h + +2007-11-26 Alexander Larsson + + * Makefile.am (gioinclude_HEADERS): + Remove trailing whitespace + +2007-11-26 Alexander Larsson + + Merge gio-standalone into glib + +2007-11-25 Christian Kellner + + * gio/goutputstream.c: + Fix small mistake in the docs. + +2007-11-21 Christian Persch + + * gio/glocalfile.c: (g_local_file_trash): + Convert filenames to UTF-8 for GError. + Use g_mkdir_with_parent to create the Trash dir, and use mode 0700 + as per xdg base dir spec. + +2007-11-21 Christian Persch + + * gio/gdesktopappinfo.c: + Use that g_key_file_to_data cannot fail. + Some misc cleanups. + Use stock defines for the key file group and key names. + Use bitfields. + +2007-11-21 Alexander Larsson + + * gio/gfile.c: + (copy_stream_with_progress): + Make sure we do a final progress callback with + the full total size. + +2007-11-21 Alexander Larsson + + * gio/gfile.[ch]: + Export g_file_copy_attributes + Remove padding as its not needed for interfaces + +2007-11-20 Alexander Larsson + + * gio/gfile.c: + * gio/gioerror.h: + * gio/glocalfile.c: + Add G_IO_ERROR_WOULD_MERGE for + copy/move dir on dir with overwrite. + +2007-11-20 Alexander Larsson + + * gio/gfileinfo.h: + * gio/glocalfileinfo.c: + Add COPY_NAME (this is an optional + non-modified utf8 version of the name) that + can roundtrip. + +2007-11-20 Alexander Larsson + + * gio/glocalfileenumerator.c: + Report errors as GIOError, not GFileError + +2007-11-16 Alexander Larsson + + * gio/glocalfileoutputstream.c: + * gio/gwin32appinfo.c: + Fix typos in strings. + Patch from Luca Ferretti + +2007-11-15 Alexander Larsson + + * configure.ac: + Post release version bump + +=== gio-standalone 0.1.2 === + +2007-11-15 Alexander Larsson + + * docs/reference/gio/Makefile.am: + Fix up distcheck by removing weird + non-needed stuff + + * NEWS: + Update for release + +2007-11-14 Alexander Larsson + + * gio/gdesktopappinfo.c: + * gio/glocaldirectorymonitor.c: + * gio/glocalfile.c: + * gio/glocalfileinfo.c: + * gio/inotify/inotify-sub.c: + * programs/gio-cat.c: + * programs/gio-copy.c: + * programs/gio-info.c: + * programs/gio-ls.c: + * programs/gio-monitor-dir.c: + * programs/gio-monitor-file.c: + * programs/gio-mount.c: + * programs/gio-move.c: + * programs/gio-rm.c: + * programs/gio-save.c: + * programs/gio-trash.c: + Leak fixes from Kjartan Maraas + +2007-11-14 Alexander Larsson + + * gio/fam/fam-helper.c: + * gio/gdrive.[ch]: + * gio/glocalfileinfo.c: + * gio/gunixdrive.c: + * gio/gvfs.c: + * gio/gvolume.[ch]: + * gio/inotify/inotify-diag.c: + * gio/inotify/inotify-kernel.c: + Various code cleanups from Kjartan Maraas + +2007-11-14 Alexander Larsson + + * gio/gioscheduler.c: + (init_scheduler): + Set up threadpool so that we cache 2 unused + idle threads for at 15 secs. This means we + will reuse thread-local data (like dbus connections) + for them. + +2007-11-14 Alexander Larsson + + * gio/fam/fam-helper.c: + * gio/fam/gfamdirectorymonitor.c: + * gio/fam/gfamfilemonitor.c: + * gio/gappinfo.c: + * gio/gcontenttype.c: + * gio/gdatainputstream.c: + * gio/gdataoutputstream.c: + * gio/gdummyfile.c: + * gio/gfile.c: + * gio/gfile.h: + * gio/gfileattribute.h: + * gio/gfileenumerator.c: + * gio/gfileinfo.c: + * gio/ginputstream.c: + * gio/gioerror.h: + * gio/glocalfile.c: + * gio/glocalfileinfo.c: + * gio/goutputstream.c: + * gio/gpollfilemonitor.c: + * gio/gsimpleasyncresult.c: + * gio/gunixmounts.c: + * gio/gunixmounts.h: + * gio/inotify/ginotifydirectorymonitor.c: + * gio/inotify/ginotifyfilemonitor.c: + * gio/inotify/inotify-diag.c: + * gio/inotify/inotify-kernel.c: + * gio/inotify/inotify-path.c: + * gio/test-gio.c: + * gio/test-streams.c: + * programs/gio-info.c: + * programs/gio-monitor-dir.c: + * programs/gio-monitor-file.c: + Various code cleanups from Kjartan Maraas + +2007-11-13 Alexander Larsson + + * gio/gdummyfile.c: + Handle the uri-scheme calls for dummy files + +2007-11-13 Marko Anastasov + + * gio/gio/gfileinfo.[ch]: Use a different parameter name instead of + 'namespace' for in g_file_attribute_matcher_enumerate_namespace() + to avoid clash with the C++ keyword. + +2007-11-13 Marko Anastasov + + * gio/glocalfileinfo.c: Build fix, added missing semicolon + to an ifdef'ed call to getpwuid() in lookup_uid_data(). + +2007-11-11 Sebastian Dröge + + * gio/glocaldirectorymonitor.c: + * gio/glocalfilemonitor.c: + * gio/gunionvolumemonitor.c: + Don't use g_once_init_*() for initializations that could fail and + could leave the initialization variable set to 0 but use GOnce. + This prevents a deadlock on the second call when trying to create + a monitor and no monitor type is available. Thanks to Sven Herzberg + for reporting. + +2007-11-11 Sven Herzberg + + * gio/glocalfile.c: guard the #include by the correct + #ifdef (make it work on MacOS X again) + +2007-11-09 Andrew Walton + * Changelog: + Fixes Changelog for last two commits (sorry guys). + +2007-11-07 Andrew Walton + * gio/gappinfo.c: + * gio/gbufferedinputstream.c: + * gio/gdatainputstream.c: + * gio/gfile.c: + * gio/gfileoutputstream.c: + * gio/gfilterinputstream.c: + * gio/glocalfileinputstream.c: + * gio/gurifuncs.c: + * gio/gvfs.c: + More consistency fixes in g*stream.c files. + Significant clean of gfile's documentation, filling in of + asynchronous operations documentation. + +2007-11-07 Andrew Walton + * gio/gappinfo.c: + * gio/gasyncresult.c: + * gio/gbufferedinputstream.c: + * gio/gbufferedoutputstream.c: + * gio/gcancellable.c: + * gio/gcontenttype.c: + * gio/gdatainputstream.c: + * gio/gdataoutputstream.c: + * gio/gdesktopappinfo.c: + * gio/gdrive.c: + * gio/gfile.c: + * gio/gfileattribute.c: + * gio/gio/gfileenumerator.c: + * gio/gfileinfo.c: + * gio/gfileinputstream.c: + * gio/gfilemonitor.c: + * gio/gfileoutputstream.c: + * gio/ginputstream.c: + * gio/giomodule.c: + * gio/gioscheduler.c: + * gio/gloadableicon.c: + * gio/glocalfileoutputstream.c: + * gio/gmemoryoutputstream.c: + * gio/gmountoperation.c: + * gio/goutputstream.c: + * gio/gseekable.c: + * gio/gsimpleasyncresult.c: + * gio/gunionvolumemonitor.c: + * gio/gunixmounts.c: + * gio/gunixvolume.c: + * gio/gurifuncs.c: + * gio/gvfs.c: + * gio/gvolume.c: + * gio/gvolumemonitor.c: + Updated documentation stubs, working towards consistency and + completeness. + +2007-11-07 Sebastian Dröge + + * gio/gmemoryoutputstream.c: + * gio/gmemoryoutputstream.h: + Change g_memory_output_stream_set_free_on_close() to + g_memory_output_stream_set_free_data() as this makes more sense and + is more consistent with GMemoryInputStream. + +2007-11-07 Alexander Larsson + + * gio/gfile.c: + Fix some docs + + * gio/glocalvfs.c: + * gio/gvfs.[ch]: + Change how we find the default vfs so that + we can handle a gvfs failing to init + +2007-11-07 Sebastian Dröge + + * gio/gbufferedoutputstream.c: + * gio/gdatainputstream.c: + * gio/gdataoutputstream.c: + * gio/gfileinputstream.c: + * gio/gfileoutputstream.c: + * gio/gfilterinputstream.c: + * gio/gfilteroutputstream.c: + * gio/ginputstream.c: + * gio/gmemoryinputstream.c: + * gio/gmemoryoutputstream.c: + * gio/goutputstream.c: + * gio/gsimpleasyncresult.c: + * gio/gsocketinputstream.c: + * gio/gsocketoutputstream.c: + Add guards to the remaining public functions, add a TODO for + an unimplemented function and remove some useless guards. + +2007-11-07 Alexander Larsson + + * configure.ac: + Autoconf checks for the various types of + getpwuid_r and getgrgid_r + + * gio/glocalfileinfo.c: + Use the autoconf checks from above + +2007-11-07 Alexander Larsson + + * gio/glocalfile.c: + (g_local_file_query_filesystem_info): + Some fixes for the statvfs case + +2007-11-07 Alexander Larsson + + * gio/glocalfile.c: + (g_local_file_query_filesystem_info): + Pick the "best" of statfs / statvfs for the system + if both are availible. + +2007-11-07 Alexander Larsson + + Solaris fixes from Halton.Huo@Sun.COM: + + * gio/gdrive.c: + * gio/gfile.c: + * gio/gvolume.c: + Don't return void + + * gio/glocalfileinfo.c: + Fix for solaris definition of getpwuid_r + + * gio/test-streams.c: + Use G_GNUC_PRETTY_FUNCTION + +2007-11-07 Alexander Larsson + + * gio/gdesktopappinfo.c: + (update_default_list): + Remove double semicolon. + Patch from Jens Granseuer + +2007-11-06 Sebastian Dröge + + * docs/reference/gio/gio-sections.txt: + * gio/gbufferedinputstream.c: + * gio/gbufferedinputstream.h: + * gio/gdatainputstream.c: + * gio/gfileenumerator.c: + * gio/gioscheduler.c: + * gio/gunionvolumemonitor.c: + * gio/gvfs.c: + * programs/gio-save.c: + Fix typo: availible -> available. Unfortuntely this breaks API + and ABI as g_buffered_input_stream_get_available() was renamed. + + * gio/gunixmounts.c: + * gio/gbufferedinputstream.c: + Add guards for public functions. + +2007-11-06 Ross Burton + + * docs/reference/gio/Makefile.am: + Fix invalid += usage which automake 1.10 doesn't like. + +2007-11-06 Alexander Larsson + + * gio/gappinfo.c: + (g_app_launch_context_class_init): + Fix warning + + Patch from Ross Burton + +2007-11-06 Alexander Larsson + + * configure.ac: + Post release version bump + +=== gio-standalone 0.1.1 === + +2007-11-06 Alexander Larsson + + * configure.ac: + Bump version to 0.1.1 + + * gio/gsimpleasyncresult.c: + (g_simple_async_result_set_from_error): + Remove bogus g_return_if_fail + +2007-11-06 Alexander Larsson + + * configure.ac: + The name is gio-standalone + + * gio/Makefile.am: + Add top src/builddir to includedir + +2007-11-06 Alexander Larsson + + * docs/reference/gio/gio-sections.txt: + * gio/gappinfo.c: + * gio/gbufferedinputstream.c: + * gio/gbufferedoutputstream.c: + * gio/gcancellable.c: + * gio/gdatainputstream.h: + * gio/gdataoutputstream.c: + * gio/gdataoutputstream.h: + * gio/gdirectorymonitor.c: + * gio/gfile.c: + * gio/gfileattribute.c: + * gio/gfileattribute.h: + * gio/gfileenumerator.c: + * gio/gfileenumerator.h: + * gio/gfileinfo.c: + * gio/gfileinfo.h: + * gio/gfileinputstream.h: + * gio/gfilemonitor.c: + * gio/gfileoutputstream.h: + * gio/glocalfilemonitor.h: + * gio/glocalfileoutputstream.h: + * gio/gmemoryinputstream.c: + * gio/gmemoryoutputstream.c: + * gio/gmountoperation.c: + * gio/goutputstream.c: + * gio/goutputstream.h: + * gio/gseekable.h: + * gio/gsimpleasyncresult.c: + * gio/gunixmounts.c: + * gio/gunixmounts.h: + * gio/gurifuncs.h: + * gio/inotify/inotify-helper.c: + Fix gtk-doc warnings + + Patch from Ross Burton + +2007-11-06 Alexander Larsson + + * gio/gfilenamecompleter.c: + (g_filename_completer_get_completions): + fix warning + + * gio/gunixvolume.c: + Remove unused function + + Patches from Ross Burton + +2007-11-06 Alexander Larsson + + * gio/gdrive.h: + * gio/gseekable.h: + * gio/gvolume.h: + Padding not needed for interfaces + +2007-11-06 Alexander Larsson + + * gio/gfilemonitor.c: + Remove debug spew + + * gio/Makefile.am: + Make giotypes.h an internal file + + * gio/gappinfo.h: + * gio/gbufferedinputstream.h: + * gio/gbufferedoutputstream.h: + * gio/gcancellable.h: + * gio/gdatainputstream.h: + * gio/gdataoutputstream.h: + * gio/gdirectorymonitor.c: + * gio/gdirectorymonitor.h: + * gio/gdrive.c: + * gio/gdrive.h: + * gio/gfile.c: + * gio/gfile.h: + * gio/gfileattribute.h: + * gio/gfileenumerator.h: + * gio/gfileicon.c: + * gio/gfileicon.h: + * gio/gfileinfo.c: + * gio/gfileinfo.h: + * gio/gfilemonitor.c: + * gio/gfilemonitor.h: + * gio/gfilenamecompleter.c: + * gio/gfilenamecompleter.h: + * gio/gfilterinputstream.h: + * gio/gfilteroutputstream.h: + * gio/ginputstream.h: + * gio/gmemoryinputstream.h: + * gio/gmemoryoutputstream.h: + * gio/gmountoperation.c: + * gio/gmountoperation.h: + * gio/gnativevolumemonitor.c: + * gio/goutputstream.h: + * gio/gseekable.c: + * gio/gseekable.h: + * gio/gsimpleasyncresult.c: + * gio/gsimpleasyncresult.h: + * gio/gsocketinputstream.h: + * gio/gsocketoutputstream.h: + * gio/gthemedicon.c: + * gio/gthemedicon.h: + * gio/gvfs.h: + * gio/gvolume.c: + * gio/gvolume.h: + * gio/gvolumemonitor.c: + * gio/gvolumemonitor.h: + Add padding in classes where it seems useful + Don't include giotypes.h from public headers + Move in Class definitions into c file where possible + + * gio/glocalfile.c: + Fix warnings + +2007-11-06 Alexander Larsson + + * docs/reference/gio/gio-docs.xml: + Better structure for API docs + +2007-11-06 Sebastian Dröge + + * gio/gfileicon.c: + * gio/gloadableicon.c: + * gio/gsimpleasyncresult.c: + * gio/gthemedicon.c: + Add some more guards to public functions. Only files missing are now + g*stream*.c. + +2007-11-06 Alexander Larsson + + * docs/reference/gio/gio-docs.xml: + Remove old files, add missing ones + +2007-11-06 Alexander Larsson + + * docs/reference/gio/gio-sections.txt: + Restructure + Add missing stuff + Hide implementation classes + + * gio/gdriveprivate.h: + * gio/gvolumeprivate.h: + Remove non-existing function declarations + +2007-11-06 Sebastian Dröge + + * gio/gappinfo.c: + Fix compilation warnings and add guards to the new functions. + + * gio/gasyncresult.c: + * gio/gdummyfile.c: + Add guards to the public functions. + + * gio/gdummyfile.c: + Implement get_path(). + +2007-11-06 Alexander Larsson + + * gio/gfilenamecompleter.c: + Make g_filename_completer_get_completions + return char ** instead of GList for + typesafety. + + * docs/reference/gio/gio-docs.xml: + * docs/reference/gio/gio-sections.txt: + * gio/gappinfo.c: + * gio/gasyncresult.c: + * gio/gbufferedinputstream.c: + * gio/gbufferedoutputstream.c: + * gio/gcancellable.c: + * gio/gcontenttype.c: + * gio/gdatainputstream.c: + * gio/gdataoutputstream.c: + * gio/gdesktopappinfo.c: + * gio/gdirectorymonitor.c: + * gio/gdrive.c: + * gio/gdummyfile.c: + * gio/gfile.c: + * gio/gfileattribute.c: + * gio/gfileenumerator.c: + * gio/gfileicon.c: + * gio/gfileinfo.c: + * gio/gfileinputstream.c: + * gio/gfilemonitor.c: + * gio/gfilenamecompleter.c: + * gio/gfilenamecompleter.h: + * gio/gfileoutputstream.c: + * gio/gfilterinputstream.c: + * gio/gicon.c: + * gio/ginputstream.c: + * gio/giomodule.c: + * gio/gioscheduler.c: + * gio/gloadableicon.c: + * gio/glocaldirectorymonitor.c: + * gio/glocalfile.c: + * gio/glocalfileinputstream.c: + * gio/glocalfilemonitor.c: + * gio/glocalfileoutputstream.c: + * gio/glocalvfs.c: + * gio/gmemoryinputstream.c: + * gio/gmemoryoutputstream.c: + * gio/gmountoperation.c: + * gio/goutputstream.c: + * gio/gpollfilemonitor.c: + * gio/gseekable.c: + * gio/gsimpleasyncresult.c: + * gio/gsocketinputstream.c: + * gio/gsocketoutputstream.c: + * gio/gthemedicon.c: + * gio/gunionvolumemonitor.c: + * gio/gunixdrive.c: + * gio/gunixmounts.c: + * gio/gunixvolume.c: + * gio/gunixvolumemonitor.c: + * gio/gurifuncs.c: + * gio/gvfs.c: + * gio/gvolume.c: + * gio/gvolumemonitor.c: + * gio/gwin32appinfo.c: + Add (mostly stub) doc strings to public functions. + Patch from Andrew Walton (awalton@gmail.com) + +2007-11-06 Alexander Larsson + + * gio/gappinfo.[ch]: + Added GAppLaunchContext object and pass that to launch. + This allows simple implementation of both + launch-on-screen and startup notification via a gtk+ + subclass of GAppLaunchContext + + * gio/gdesktopappinfo.c: + Implement GAppLaunchContext API + + * gio/gwin32appinfo.c: + Update to new APIs + +2007-11-05 Sebastian Dröge + + * gio/gmountoperation.c: + Add some guards to GMountOperation's public functions. + +2007-11-05 Sebastian Dröge + + + * gio/gappinfo.c: + * gio/gcancellable.c: + * gio/gdirectorymonitor.c: + * gio/gdrive.c: + * gio/gfileenumerator.c: + * gio/gfilemonitor.c:, + * gio/gfilenamecompleter.c: + * gio/gicon.c: + * gio/giomodule.c: + * gio/gioscheduler.c: + * gio/gseekable.c: + * gio/gurifuncs.c: + * gio/gvolume.c: + * gio/gvolumemonitor.c: + Add even more guards to various public functions. + +2007-11-05 Sebastian Dröge + + * gio/gappinfo.c: + Add guards to the public functions of GAppInfo. + +2007-11-05 Sebastian Dröge + + * gio/gcontenttype.c: + Add some more guards for public functions. + +2007-11-05 Sebastian Dröge + + * gio/fam/fam-module.c: + * gio/fam/gfamdirectorymonitor.c: + * gio/fam/gfamdirectorymonitor.h: + * gio/fam/gfamfilemonitor.c: + * gio/fam/gfamfilemonitor.h: + * gio/inotify/ginotifydirectorymonitor.c: + * gio/inotify/ginotifydirectorymonitor.h: + * gio/inotify/ginotifyfilemonitor.c: + * gio/inotify/ginotifyfilemonitor.h: + Add proper copyright information and remove an unused variable + in the GInotifyFileMonitor constructor. + + * gio/gcancellable.c: + Add a guard for a public function and an assertion to prevent + an undefined program state. + +2007-11-05 Sebastian Dröge + + * gio/gfileattribute.c: + Don't run into an assertion if the given attribute value is NULL + in g_file_attribute_value_get_*() but instead return a fallback + value that makes sense in most situations. Passing them a attribute + value with the wrong type will still run into an assertion. + +2007-11-02 Sebastian Dröge + + * gio/gfileattribute.c: + * gio/gfileinfo.c: + Add even more guards to the public functions. Also fix the refcounting + of GFileAttributeInfoList and GFileAttributeMatcher to be atomic and + let g_file_info_list_attributes() filter the attributes by namespace + instead of simply ignoring the namespace parameter. + +2007-11-03 Sven Herzberg + + * gio/gdesktopappinfo.c: don't use environ. Use the glib API for that. + (This makes gio work on MacOS X again) + +2007-11-02 Sebastian Dröge + + * Makefile.am: + Build the gio subdirectory before the docs. Otherwise the build will + fail. + + * gio/gvfs.c: (g_vfs_get_name), (g_vfs_get_priority), + (g_vfs_get_file_for_path), (g_vfs_get_file_for_uri), + (g_vfs_get_supported_uri_schemes), (g_vfs_parse_name): + Add guards to the public functions. + +2007-11-02 Sebastian Dröge + + * gio/gfileattribute.c: (g_file_attribute_value_as_string): + Cast parameter to g_type_name_from_instance() to a GTypeInstance * + to prevent a compiler warning. + + * gio/glocalfile.c: (get_mount_info), (find_topdir_for): + Set the G_FILE_ATTRIBUTE_FS_READONLY as boolean, not as string and + return something in the non-void function find_topdir_for(). + +2007-11-01 Christian Kellner , Ryan Lortie + + * configure.ac: + * Makefile.am: + * docs/: + Gtkdocify! + +2007-11-01 Ryan Lortie + + * gappinfo.c (g_app_info_launch, g_app_info_launch_uris): + * gappinfo.h (g_app_info_launch, g_app_info_launch_uris): + * gwin32appinfo.c (g_win32_app_info_launch): + * gdesktopappinfo.c (expand_macro, equal_up_to_equals, + envp_for_startup_id, g_desktop_app_info_launch, + g_desktop_app_info_launch_uris): + + Give an opaque 'startup_id' string instead of 'envp'. + Support empty file lists for launching new windows. + Fix infinite recursion bug when launching URIs. + +2007-11-01 Sebastian Dröge + + * gio/gfile.c: + Add guard to the new g_file_get_uri_scheme() function. + +2007-11-01 Sebastian Dröge + + * gio/gfile.c: + Convert a g_return_val_if_fail() to setting the GError instead as + otherwise applications have to verify the parameter before otherwise + and the parameter might come directly from the user. + +2007-11-01 Sebastian Dröge + + * gio/inotify/ginotify*.[ch]: + Add missing copyright information. + +2007-11-01 Sebastian Dröge + + * gio/gfile.c: + Add guards in the beginning of public functions to check for valid + parameters and fix a bug in copy_stream_with_progress() that could've + caused writing less bytes than reading. + * gio/glocalfileinfo.c: + Check for a NULL parameter and set the GError accordingly then. + * gio/goutputstream.c: + Fix the same bug as in gfile.c that could've caused writing less bytes + than reading in g_output_stream_real_splice(). + +2007-11-01 Sebastien Bacher + + * gio/Makefile.am: + Use the correct gvolumeprivate.h naming + +2007-11-01 Christian Kellner + + * gio/Makefile.am: + Remove leftover "$(daemon_sources)" entry. + +2007-11-01 Christian Kellner + + * gio/fam/*.[ch]: + * gio/*.[ch]: + * programs/*.[ch]: + Add copyright information to source files. + +2007-11-01 Alexander Larsson + + * gio/gfile.[ch]: + * gio/glocalfile.c: + Add g_file_get_uri_scheme + +2007-11-01 Alexander Larsson + + * gio/gappinfo.h: + * gio/gdesktopappinfo.c: + * gio/gwin32appinfo.c: + Add g_app_info_get_default_for_uri_scheme. + +2007-11-01 Alexander Larsson + + * gio/Makefile.am: + Correct filename for gdriveprivate.h + +2007-10-31 Alexander Larsson + + * gio/gfileinfo.h: + Rename id:value to id:file + Add id:fs + + * gio/glocalfileinfo.c: + Implement id:fs + +2007-10-31 Alexander Larsson + + * gio/gunixvolume.c: + * gio/gvolume.[ch]: + Remove g_volume_get_platform_id, as thats not + needed with the simpler union volume monitor + +2007-10-31 Alexander Larsson + + * gio/Makefile.am: + * gio/guniondrive.[ch]: Removed. + * gio/gunionvolume.[ch]: Removed. + Remove GUnionDrive/Volume + + * gio/gunionvolumemonitor.c: + Simplify union volume monitor, now we + only have one native volume monitor and + we use the actual volumes/drives from the + child monitors instead of wrapping them + + * gio/gnativevolumemonitor.[ch]: + Base class for native volume monitors. + Includes priority and get_volume_for_mountpoint + + * gio/gfile.[ch]: + Add g_file_find_enclosing_volume + + * gio/gfileinfo.h: + Remove volume name fs attribute + Add readonly fs attribute + + * gio/glocalfile.c: + Implement readonly attribute + remove volume name attribute + Implement find_enclosing volume + + * gio/gunixmounts.c: + Add a volume for "/". + + * gio/gunixvolume.[ch]: + Set better name for / + + * gio/gunixvolumemonitor.[ch]: + Derive from GNativeVolumeMonitor + Implement get_volume_for_mountpoint + + * gio/gvolume.h: + GVolume typedef moved to gfile.h + + * gio/gvolumeprivate.h: + Add g_volume_get_for_mount_path + +2007-10-31 Alexander Larsson + + * gio/gunixmounts.[ch]: + Add cache info to unix mount listers + Make getmntent use threadsafe + Add is_system_internal attribute for GUnixMount + + * gio/gunixvolume.c: + (g_unix_volume_new): + Use is_system_internal instead of own code + + * gio/glocaldirectorymonitor.c: + * gio/gunixvolumemonitor.c: + Update to new gunixmounts API + + * gio/glocalfile.c: + Fix warning + +2007-10-30 Alexander Larsson + + * gio/gfileinfo.h: + Add volume name fsinfo attribute + + * gio/glocalfile.c: + Read volume name info + + * gio/gunionvolumemonitor.c: + Fix infinite loops when finalizing a union volume monitor + +2007-10-30 Alexander Larsson + + * gio/goutputstream.[ch]: + Add splice() with default implementation + + * gio/gsocketoutputstream.c: + (g_socket_output_stream_write): + Return error on cancellation correctly. + +2007-10-26 Paolo Borelli + + * gio/glocalfile.c (g_local_file_trash): + Do not leak a string. + +2007-10-26 Paolo Borelli + + * gio/gfile.c (g_file_load_contents): + Unref the stream after closing it. + +2007-10-25 Alexander Larsson + + * gio/gioscheduler.h: + Fix include + +2007-10-25 Alexander Larsson + + * gio/gfile.[ch]: + * gio/glocalfile.c: + Add g_file_has_uri_scheme and implement for local files + +2007-10-25 Paolo Borelli + + * gio/gdesktopappinfo.c: do not leak a string. + +2007-10-24 Sebastian Dröge + + * gio/glocaldirectorymonitor.c: (_compare_monitor_class_by_prio), + (g_local_directory_monitor_new): + * gio/glocalfilemonitor.c: (_compare_monitor_class_by_prio), + (g_local_file_monitor_new): + Only look for the monitor type that should be used the first time + and use g_qsort_with_data() instead of our own bubble sort + implementation. + +2007-10-24 Sebastian Dröge + + * gio/Makefile.am: + * gio/fam/Makefile.am: + * gio/fam/fam-helper.c: (_fam_sub_startup), (_fam_sub_add): + * gio/fam/fam-helper.h: + * gio/fam/fam-module.c: (g_io_module_load), (g_io_module_unload): + * gio/fam/gfamdirectorymonitor.c: + * gio/fam/gfamdirectorymonitor.h: + * gio/fam/gfamfilemonitor.c: (g_fam_file_monitor_finalize), + * gio/fam/gfamfilemonitor.h: + * gio/glocaldirectorymonitor.c: + * gio/glocaldirectorymonitor.h: + * gio/glocalfilemonitor.c: (g_local_file_monitor_init), + * gio/glocalfilemonitor.h: + * gio/inotify/Makefile.am: + * gio/inotify/ginotifydirectorymonitor.c: + * gio/inotify/ginotifydirectorymonitor.h: + * gio/inotify/ginotifyfilemonitor.c: + * gio/inotify/ginotifyfilemonitor.h: + Implement the FAM and Inotify monitors as + GLocal(Directory|File)Monitor subclasses and put the FAM monitors into + their own GIO module. GLocal(Directory|File)Monitor will use the + monitor with the highest rank that is supported on that machine. + +2007-10-23 Sebastian Dröge + + * gio/Makefile.am: + Change GIO module dir to $(libdir)/gio/modules and change + the log domain from GVFS to GIO. Also only export symbols starting + with g_ in the resulting library. + * gio/test-streams.c: (main): + Set log handler for the GIO log domain. + +2007-10-22 Alexander Larsson + + * gio/gfilenamecompleter.[ch]: + Add g_filename_completer_set_dirs_only + +2007-10-22 Alexander Larsson + + * gio/Makefile.am: + * gio/gurifuncs.[ch]: + Add some simple URI helpers + + * gio/gfilenamecompleter.[ch]: + Added object for filename (parse name actually) completion + + * gio/glocalvfs.c: + Handle ~ in parse names + +2007-10-17 Alexander Larsson + + * gio/gfileinfo.h: + * gio/glocalfileinfo.c: + Add and implement id:value attribute + +2007-10-17 Alexander Larsson + + * gio/gdrive.[ch]: + * gio/guniondrive.c: + * gio/gunixdrive.c: + Add and implement g_drive_has_volumes + +2007-10-17 Alexander Larsson + + * gio/gfileinfo.h: + * gio/glocalfileinfo.[ch]: + Add unix:is_mountpoint and implement for local files + +2007-10-16 Alexander Larsson + + * gio/gunionvolumemonitor.c: + (g_union_volume_monitor_init): + Fix up the unix type getting so that it works with gcc + +2007-10-12 Alexander Larsson + + * gio/gfileinfo.h: + * gio/glocalfileinfo.c: + Add thumbnail:failed to file info + +2007-10-12 Richard Hult + + * gio/gvfs.c (get_default_vfs): Make the type volatile to avoid + optimizing away the get_type call (happens with some gcc versions, + like the one shipped with OS X 10.4). + +2007-10-12 Alexander Larsson + + * gio/glocalfileinfo.c: + (_g_local_file_info_set_attribute): + Fix build if not HAVE_XATTR + Patch from Milosz Derezynski + +2007-10-11 Sven Herzberg + + * gio/gunixmounts.c: small build fix (sorry, Alex, you haven't been + around for review, otherwise I would have asked you before + committing) + +2007-10-11 Alexander Larsson + + * gio/gfileinfo.h: + Add thumbnail:path attribute + + * gio/glocalfileinfo.c: + Implement thumbnail:path for local files + +2007-10-11 Alexander Larsson + + * gio/glocalfileinfo.c: + (_g_local_file_info_get): + Avoid duplicate icon names + +2007-10-11 Alexander Larsson + + * gio/gthemedicon.[ch]: + Change g_themed_icon_get_names return type to const + +2007-10-10 Alexander Larsson + + * gio/glocalfileinfo.c: + Don't reference freed memory + +2007-10-10 Alexander Larsson + + * gio/gfileattribute.c: + Handle objects + + * gio/glocalfileinfo.c: + Return icon info + +2007-10-10 Alexander Larsson + + * gio/gfileinfo.c: + Check for NULL icons + + * gio/gfileattribute.c: + Don't dup when getting objects (same as for string attributes) + + * gio/gicon.c (g_icon_equal): + Safely handle NULLs in equal + +2007-10-10 Alexander Larsson + + * gio/gfileinfo.h: + Fix c++ compilation issues + Patch from Milosz Derezynski + +2007-10-10 Alexander Larsson + + * programs/gio-monitor-dir.c: + Don't crash if dir monitor not supported. + +2007-10-09 Alexander Larsson + + * gio/gioerror.h: + Add missing G_END_DECLS + +2007-10-09 Sebastian Dröge + + * gio/gfile.c: (g_file_set_display_name), + (g_file_query_settable_attributes), + (g_file_query_writable_namespaces): + Return NULL not FALSE on errors as the return type is a pointer. + +2007-10-09 Sebastian Dröge + + * gio/glocalfile.c: (g_local_file_monitor_file): + Don't call monitor_file on the default interface vtable (which + is NULL) but simply return NULL. The caller, GFile, will create a + polling monitor if NULL is returned. + +2007-10-09 Alexander Larsson + + * Makefile.am: + * configure.ac: + * gio-unix-2.0.pc.in: + Add gio-unix-2.0.pc if OS_UNIX + + * gio/Makefile.am: + Install gunixmounts.h into gio-unix-2.0 if OS_UNIX + +2007-10-09 Alexander Larsson + + * gio/gunixmounts.[ch]: + Make unix mount monitoring API sane. + Now its just a object with mounts_changed + and mountpoints_changed signals. + + * gio/glocaldirectorymonitor.c: + * gio/gunixvolumemonitor.c: + Use new mount monitor api + +2007-10-09 Alexander Larsson + + * gio/gunixmounts.[ch]: + Move guess type into one call for mounts and one for mountpoints + + * gio/gunixdrive.c: + * gio/gunixvolume.c: + Update + +2007-10-09 Alexander Larsson + + * gio/gunixmounts.[ch]: + Remove _ prefix in preparation to make this semi-public + Hide implementation of structs + + * gio/glocaldirectorymonitor.c: + * gio/gunixdrive.c: + * gio/gunixvolume.c: + * gio/gunixvolumemonitor.c: + Update for above API changes + +2007-10-08 Alexander Larsson + + * gio/gfile.c: + Better polling fallback. This also handles the case where we have + a monitor_file implementation, but it fails. + +2007-10-08 Alexander Larsson + + * gio/gfile.[ch]: + * gio/glocalfile.c: + * gio/gunixmounts.c: + * programs/gio-monitor-dir.c: + * programs/gio-monitor-file.c: + Added cancellable to file monitoring calls. + These are really sync calls and need this. + +2007-10-08 Sebastian Dröge + + * gio/glocalvfs.c: (g_local_vfs_get_supported_uri_schemes), + (g_local_vfs_class_init): + * gio/gvfs.c: (g_vfs_get_supported_uri_schemes): + * gio/gvfs.h: Add functions to get a list of supported URI schemes. + +2007-10-05 Alexander Larsson + + * gio/gdirectorymonitorprivate.h: + * gio/gfilemonitorprivate.h: + * gio/gdirectorymonitor.h: + * gio/gfilemonitor.h: + Remove *private.h and move to the public API, so that + we can do implementations outside gio (such as in gvfs) + + * gio/gdirectorymonitor.c: + * gio/gfilemonitor.c: + * gio/glocaldirectorymonitor.c: + * gio/gpollfilemonitor.c: + * gio/inotify/inotify-helper.c: + * gio/fam/fam-helper.c: + Update to the new header names + +2007-10-05 Sebastian Dröge + + * gio/gdirectorymonitor.c: + * gio/gfilemonitor.c: Mark the GFileMonitor and GDirectoryMonitor + GTypes as abstract. + +2007-10-04 Alexander Larsson + + * gio/glocalfileinfo.c (get_access_rights): + Set CAN_TRASH when we can move the file. + We should really also check for a parent trash dir. + +2007-10-04 Alexander Larsson + + * gio/gfileinfo.h (G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH): + Add can_trash access attribute + +2007-10-04 Alexander Larsson + + * gio/glocalfile.c: + (g_local_file_trash): + Create info file first. This is per-spec and allows + us to actually trash directories. + +2007-10-02 Alexander Larsson + + * gio/gdesktopappinfo.c: + Implement the new mime support code. + Always set app as handling mimetype when being set as default for it + +2007-10-01 Alexander Larsson + + * gio/glocalfileinfo.c (_g_local_file_info_set_attribute): + Fix up check for xattrs: + +2007-10-01 Alexander Larsson + + * gio/gappinfo.c: + (g_app_info_set_as_default_for_extension): + (g_app_info_add_supports_type): + (g_app_info_can_remove_supports_type): + (g_app_info_remove_supports_type): + Make these fail nicely if not implemented + +2007-10-01 Paolo Borelli + + * gio/glocalfileoutputstream.c: + * gio/glocalfileoutputstream.h: + * gio/test-gio.c: + * gio/gfile.c: + * gio/gfile.h: + * gio/glocalfile.c: + * programs/gio-save.c: + Add a GFileCreateFlags argument to operations that can create + a new file. + +2007-10-01 Alexander Larsson + + * gio/gappinfo.[ch]: + * gio/gdesktopappinfo.c: + Add more (stubbed out) mime API needed for nautilus + +2007-10-01 Alexander Larsson + + * gio/gappinfo.h: + Add GAppInfoCreateFlags flag to g_app_info_create_from_commandline. + Add g_app_info_set_as_default_for_extension. + + * gio/gdesktopappinfo.c: + Dummy for g_app_info_set_as_default_for_extension + Support flags in g_app_info_create_from_commandline + + * gio/gwin32appinfo.c: + * gio/test-gio.c: + Update for API changes + + * gio/gthemedicon.c: + Properly NULL-terminate list of icon names + +2007-09-28 Alexander Larsson + + * gio/gloadableicon.h: + Correct G_TYPE_LOADABLE_ICON, it was pointing to the GIcon type... + +2007-09-28 Alexander Larsson + + * gio/Makefile.am: + Install headers in $includedir/gio-standalone/ + + * gio-2.0.pc.in: Added. + * gio-standalone.pc.in: Removed. + * configure.ac: + * Makefile.am: + Renamed pkg-config file to match glib (for future move) + Update to the new include dir + + * gio/gappinfo.h: + Add more TODO comments + +2007-09-28 Alexander Larsson + + * gio/gdesktopappinfo.[ch]: + Expose new_from_filename + Add getter for is_hidden and handle it better + +2007-09-28 Alexander Larsson + + * gio/gfileinfo.[ch]: + Rename g_file_size_format_for_display to + g_format_file_size_for_display. + Now it doesn't have the g_file prefix, so we + can later move it to glib. + +2007-09-28 Alexander Larsson + + * gio/gappinfo.[ch]: + Add g_app_info_get_id and g_app_info_get_executable. + Make all getters non-reffing + Make g_app_info_launch take GFile arguments. + Add must_support_uris argument to g_app_info_get_default_for_type. + + * gio/gwin32appinfo.c: + Update to GAppInfo api changes + + * gio/gdesktopappinfo.c: + Update to GAppInfo api changes + Implement supports_xdg_startup_notify + + * gio/gfileicon.c (g_file_icon_get_file): + Make getter non-reffing. + + * gio/test-gio.c: + Update to new API + +2007-09-27 Alexander Larsson + + * gio/gfileinfo.[ch]: + Add g_file_size_format_for_display helper + +2007-09-27 Alexander Larsson + + * gio/glocalfileinfo.c: + Set UNIX_GID from gid, not from uid + +2007-09-27 Alexander Larsson + + * gio/gfile.[ch]: + Add g_file_set_attributes_async + +2007-09-27 Alexander Larsson + + * gio/glocalfile.c (g_local_file_set_display_name): + Fix set_display_name to actually rename to the right place. + Use lstat to look for existing files so we don't overwrite + broken links. + +2007-09-26 Alexander Larsson + + * gio/gfile.[ch]: + Add g_file_set_display_name_async() + +2007-09-26 Alexander Larsson + + * gio/gfile.[ch]: + Add load_partial_contents async calls + + * gio/glocalfile.c: + Make internal function static + +2007-09-26 Alexander Larsson + + * gio/glocalfileinfo.c: + Correctly detect broken symlinks + +2007-09-26 Alexander Larsson + + * gio/gcancellable.c (g_cancellable_cancel): + Allow cancel on NULL cancellable + +2007-09-25 Alexander Larsson + + * gio/gsimpleasyncresult.c: + Don't allocate g_error manually. + Fixes g_slice/g_new mixup crash + +2007-09-25 Alexander Larsson + + * gio/glocaldirectorymonitor.c (g_local_directory_monitor_new): + Actually set active_backend. + This means the monitor will be cancelled correctly. + +2007-09-25 Alexander Larsson + + * gio/gdirectorymonitor.c: + Set timeout to NULL when destroying + +2007-09-25 Alexander Larsson + + * gio/gioerror.h: + Rename G_IO_ERROR_NOT_MOUNTABLE to G_IO_ERROR_NOT_MOUNTABLE_FILE as + that is a better description of the error. + +2007-09-25 Sebastian Dröge + + * gio/gvfs.c: (g_vfs_get_local): + Make the local vfs variable static. The same instance should + always be returned. + +2007-09-24 Alexander Larsson + + * gio/glocalfileinfo.c: + Pass in actual length read into sniffer, not the length + we tried to read. + +2007-09-21 Alexander Larsson + + * gio/gfileenumerator.c: + * gio/gfileinfo.c: + * gio/gfileinfo.h: + * gio/gfileinputstream.c: + * gio/gfileoutputstream.c: + * gio/ginputstream.c: + * gio/goutputstream.c: + Don't crash if async callbacks are NULL + +2007-09-20 Alexander Larsson + + * gio/gfile.[ch]: + Add async enumerate_children method and default + implementation + +2007-09-20 Alexander Larsson + + * gio/gfile.[ch] + Add g_file_contains_file & g_file_get_relative_path, since they + were needed for nautilus. + Renamed g_file_resolve_relative to g_file_resolve_relative_path + to make it clearer. + + * gio/gdummyfile.c: + * gio/glocalfile.c: + Implement new methods + +2007-09-17 Alexander Larsson + + * gio/gfile.[ch]: + * gio/gfileinputstream.[ch]: + * gio/gfileoutputstream.[ch]: + * gio/glocalfile.c: + * gio/glocalfileenumerator.[ch]: + * gio/glocalfileinfo.[ch]: + * gio/glocalfileinputstream.c: + * gio/glocalfileoutputstream.c: + * gio/gpollfilemonitor.c: + * programs/gio-copy.c: + * programs/gio-info.c: + * programs/gio-move.c: + Rename get_file_info to query_info() to make it clearer + that these are not simple getters, but do i/o. + +2007-09-17 Alexander Larsson + + * gio/gdatainputstream.[ch]: + * gio/test-streams.c: + Use _read_XXX instead of _get_XXX for the i/o calls + in GDataInputStream + +2007-09-17 Alexander Larsson + + * gio/gappinfo.h: + Added needed stuff to TODO comment + +2007-09-17 Alexander Larsson + + * gio/glocalfileoutputstream.c (g_local_file_output_stream_close): + Don't error out removing the backup copy if it doesn't + already exist. + +2007-09-14 Alexander Larsson + + * programs/Makefile.am: + * programs/gvfs-*.c: + * programs/gio-*.c: + Renamed apps from gvfs-xxx to gio-xxx. + +2007-09-14 Alexander Larsson + + * gio/gfile.c: + * gio/gfileoutputstream.[ch]: + * gio/glocalfileoutputstream.c: + * programs/gvfs-save.c: + g_file_output_stream_get_etag doesn't do i/o, so remove + cancellation and error. + +2007-09-14 Alexander Larsson + + * gio/gfile.[ch]: + Add new_etag output to replace_contents functions + +2007-09-14 Alexander Larsson + + * gio/gfileoutputstream.[ch]: + Add async get_file_info and default implementation + +2007-09-14 Alexander Larsson + + * gio/gfileinputstream.c: + Implement fallback wrapper for async get_file_info + +2007-09-14 Alexander Larsson + + * gio/gfile.[ch]: + Add etag out argument to load_contents + + * gio/test-gio.c: + Update to new API + +2007-09-14 Alexander Larsson + + * gio/gcontenttype.c (looks_like_text): + Whitespace like tab, cr and lf do not make the + file binary. + +2007-09-14 Alexander Larsson + + * gio/gfileinputstream.[ch]: + Add async get_file_info. + +2007-09-13 Alexander Larsson + + * gio/goutputstream.c (g_output_stream_write_all): + Allow NULL for bytes_written + +2007-09-13 Alexander Larsson + + * gio/gmemoryinputstream.[ch]: + Add accessors for data + +2007-09-13 Alexander Larsson + + * gio/gdatainputstream.c (g_data_input_stream_get_until): + Don't crash if length is NULL + diff --git a/gio/Makefile.am b/gio/Makefile.am new file mode 100644 index 0000000..fd42438 --- /dev/null +++ b/gio/Makefile.am @@ -0,0 +1,494 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +SUBDIRS= + +if OS_UNIX +SUBDIRS += libasyncns xdgmime +endif + +if OS_WIN32_AND_DLL_COMPILATION +if MS_LIB_AVAILABLE +noinst_DATA = gio-2.0.lib + +install_ms_lib_cmd = $(INSTALL) gio-2.0.lib $(DESTDIR)$(libdir) +uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gio-2.0.lib +endif +endif + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +gio.def: gio.symbols + (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/gio.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gio.def.tmp && \ + mv gio.def.tmp gio.def + +gioalias.h: gio.symbols + $(PERL) $(srcdir)/makegioalias.pl < $(srcdir)/gio.symbols > gioalias.h.tmp && \ + mv gioalias.h.tmp gioalias.h + +gioaliasdef.c: gio.symbols + $(PERL) $(srcdir)/makegioalias.pl -def < $(srcdir)/gio.symbols > gioaliasdef.c.tmp && \ + mv gioaliasdef.c.tmp gioaliasdef.c + +if OS_LINUX +if HAVE_GNUC_VISIBILITY +TESTS = abicheck.sh pltcheck.sh +endif +endif + +if HAVE_THREADS +THREAD_FLAGS=-DG_THREADS_MANDATORY +endif + +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_builddir) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) \ + $(THREAD_FLAGS) \ + -DG_DISABLE_DEPRECATED \ + -DGIO_COMPILATION \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" + +lib_LTLIBRARIES = libgio-2.0.la + +marshal_sources = \ + gio-marshal.h \ + gio-marshal.c \ + $(NULL) + +if CROSS_COMPILING + glib_genmarshal=$(GLIB_GENMARSHAL) +else + glib_genmarshal=../gobject/glib-genmarshal +endif + +gio-marshal.h: gio-marshal.list + $(glib_genmarshal) --prefix=_gio_marshal $(srcdir)/gio-marshal.list --header --internal > $@.tmp && \ + mv $@.tmp $@ + +gio-marshal.c: gio-marshal.h gio-marshal.list + (echo "#include \"gio-marshal.h\""; \ + $(glib_genmarshal) --prefix=_gio_marshal $(srcdir)/gio-marshal.list --body --internal) > $@.tmp && \ + mv $@.tmp $@ + +local_sources = \ + glocaldirectorymonitor.c \ + glocaldirectorymonitor.h \ + glocalfile.c \ + glocalfile.h \ + glocalfileenumerator.c \ + glocalfileenumerator.h \ + glocalfileinfo.c \ + glocalfileinfo.h \ + glocalfileinputstream.c \ + glocalfileinputstream.h \ + glocalfilemonitor.c \ + glocalfilemonitor.h \ + glocalfileoutputstream.c \ + glocalfileoutputstream.h \ + glocalfileiostream.c \ + glocalfileiostream.h \ + glocalvfs.c \ + glocalvfs.h \ + $(NULL) + +platform_libadd = +platform_deps = +appinfo_sources = + +if HAVE_INOTIFY +SUBDIRS += inotify +platform_libadd += inotify/libinotify.la +platform_deps += inotify/libinotify.la +endif + +if HAVE_FEN +AM_CPPFLAGS += -DHAVE_FEN +SUBDIRS += fen +platform_libadd += fen/libfen.la +platform_deps += fen/libfen.la +endif + +if OS_WIN32 +SUBDIRS += win32 +platform_libadd += win32/libgiowin32.la +platform_deps += win32/libgiowin32.la +endif + + +SUBDIRS += . + +if HAVE_FAM +SUBDIRS += fam +endif + +if OS_UNIX +appinfo_sources += gdesktopappinfo.c gdesktopappinfo.h +platform_libadd += libasyncns/libasyncns.la xdgmime/libxdgmime.la +platform_deps += libasyncns/libasyncns.la xdgmime/libxdgmime.la +unix_sources = \ + gunixconnection.c \ + gunixfdlist.c \ + gunixfdmessage.c \ + gunixmount.c \ + gunixmount.h \ + gunixmounts.c \ + gunixmounts.h \ + gunixresolver.c \ + gunixresolver.h \ + gunixsocketaddress.c \ + gunixvolume.c \ + gunixvolume.h \ + gunixvolumemonitor.c \ + gunixvolumemonitor.h \ + gunixinputstream.c \ + gunixoutputstream.c \ + $(NULL) + + +giounixincludedir=$(includedir)/gio-unix-2.0/gio +giounixinclude_HEADERS = \ + gdesktopappinfo.h \ + gfiledescriptorbased.h \ + gunixconnection.h \ + gunixmounts.h \ + gunixfdlist.h \ + gunixfdmessage.h \ + gunixinputstream.h \ + gunixoutputstream.h \ + gunixsocketaddress.h \ + $(NULL) +endif + +if OS_WIN32 +appinfo_sources += gwin32appinfo.c gwin32appinfo.h +platform_libadd += -lshlwapi -lws2_32 -ldnsapi +win32_sources = \ + gwin32mount.c \ + gwin32mount.h \ + gwin32resolver.c \ + gwin32resolver.h \ + gwin32volumemonitor.c \ + gwin32volumemonitor.h \ + $(NULL) + +endif + +SUBDIRS += tests + +libgio_2_0_la_SOURCES = \ + gappinfo.c \ + gasynchelper.c \ + gasynchelper.h \ + gasyncinitable.c \ + gasyncresult.c \ + gbufferedinputstream.c \ + gbufferedoutputstream.c \ + gcancellable.c \ + gcontenttype.c \ + gcontenttypeprivate.h \ + gcharsetconverter.c \ + gconverter.c \ + gconverterinputstream.c \ + gconverteroutputstream.c \ + gdatainputstream.c \ + gdataoutputstream.c \ + gdrive.c \ + gdummyfile.h \ + gdummyfile.c \ + gemblem.h \ + gemblem.c \ + gemblemedicon.h \ + gemblemedicon.c \ + gfile.c \ + gfileattribute.c \ + gfileattribute-priv.h \ + gfiledescriptorbased.h \ + gfiledescriptorbased.c \ + gfileenumerator.c \ + gfileicon.c \ + gfileinfo.c \ + gfileinfo-priv.h \ + gfileinputstream.c \ + gfilemonitor.c \ + gfilenamecompleter.c \ + gfileoutputstream.c \ + gfileiostream.c \ + gfilterinputstream.c \ + gfilteroutputstream.c \ + gicon.c \ + ginetaddress.c \ + ginetsocketaddress.c \ + ginitable.c \ + ginputstream.c \ + gioenums.h \ + gioerror.c \ + giomodule.c \ + giomodule-priv.h \ + gioscheduler.c \ + giostream.c \ + gloadableicon.c \ + gmount.c \ + gmemoryinputstream.c \ + gmemoryoutputstream.c \ + gmountoperation.c \ + gnativevolumemonitor.c \ + gnativevolumemonitor.h \ + gnetworkaddress.c \ + gnetworkingprivate.h \ + gnetworkservice.c \ + goutputstream.c \ + gpollfilemonitor.c \ + gpollfilemonitor.h \ + gresolver.c \ + gseekable.c \ + gsimpleasyncresult.c \ + gsocket.c \ + gsocketaddress.c \ + gsocketaddressenumerator.c \ + gsocketclient.c \ + gsocketconnectable.c \ + gsocketconnection.c \ + gsocketcontrolmessage.c \ + gsocketinputstream.c \ + gsocketinputstream.h \ + gsocketlistener.c \ + gsocketoutputstream.c \ + gsocketoutputstream.h \ + gsocketservice.c \ + gsrvtarget.c \ + gtcpconnection.c \ + gthreadedsocketservice.c\ + gthemedicon.c \ + gthreadedresolver.c \ + gthreadedresolver.h \ + gunionvolumemonitor.c \ + gunionvolumemonitor.h \ + gvfs.c \ + gvolume.c \ + gvolumemonitor.c \ + gzlibcompressor.c \ + gzlibdecompressor.c \ + gmountprivate.h \ + gioenumtypes.h \ + gioenumtypes.c \ + gioalias.h \ + gioaliasdef.c \ + $(appinfo_sources) \ + $(unix_sources) \ + $(win32_sources) \ + $(local_sources) \ + $(marshal_sources) \ + $(NULL) + +$(libgio_2_0_la_OBJECTS): $(marshal_sources) + +libgio_2_0_la_LIBADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + $(platform_libadd) \ + $(ZLIB_LIBS) \ + $(SELINUX_LIBS) \ + $(GLIB_LIBS) \ + $(XATTR_LIBS) \ + $(NULL) + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +export_symbols = -export-symbols gio.def +gio_def = gio.def + +gio_win32_res = gio-win32-res.o +gio_win32_res_ldflag = -Wl,$(gio_win32_res) + +install-def-file: + $(INSTALL) gio.def $(DESTDIR)$(libdir)/gio-2.0.def + +uninstall-def-file: + -rm $(DESTDIR)$(libdir)/gio-2.0.def +else +install-def-file: +uninstall-def-file: + +export_symbols = -export-symbols-regex '^g_.*' +endif + +install-data-local: install-ms-lib install-def-file + $(mkinstalldirs) $(DESTDIR)$(GIO_MODULE_DIR) + +uninstall-local: uninstall-ms-lib uninstall-def-file + +libgio_2_0_la_LDFLAGS = \ + $(gio_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgio_2_0_la_DEPENDENCIES = $(gio_win32_res) $(gio_def) $(platform_deps) + +gio-win32-res.o: gio.rc + $(WINDRES) gio.rc $@ + +gio_headers = \ + gappinfo.h \ + gasyncinitable.h \ + gasyncresult.h \ + gbufferedinputstream.h \ + gbufferedoutputstream.h \ + gcancellable.h \ + gcontenttype.h \ + gcharsetconverter.h \ + gconverter.h \ + gconverterinputstream.h \ + gconverteroutputstream.h \ + gdatainputstream.h \ + gdataoutputstream.h \ + gdrive.h \ + gemblem.h \ + gemblemedicon.h \ + gfile.h \ + gfileattribute.h \ + gfileenumerator.h \ + gfileicon.h \ + gfileinfo.h \ + gfileinputstream.h \ + gfilemonitor.h \ + gfilenamecompleter.h \ + gfileoutputstream.h \ + gfileiostream.h \ + gfilterinputstream.h \ + gfilteroutputstream.h \ + gicon.h \ + ginetaddress.h \ + ginetsocketaddress.h \ + ginputstream.h \ + ginitable.h \ + gio.h \ + giotypes.h \ + gioenums.h \ + gioerror.h \ + giomodule.h \ + gioscheduler.h \ + giostream.h \ + gloadableicon.h \ + gmount.h \ + gmemoryinputstream.h \ + gmemoryoutputstream.h \ + gmountoperation.h \ + gnativevolumemonitor.h \ + gnetworkaddress.h \ + gnetworkservice.h \ + goutputstream.h \ + gresolver.h \ + gseekable.h \ + gsimpleasyncresult.h \ + gsocket.h \ + gsocketaddress.h \ + gsocketaddressenumerator.h \ + gsocketclient.h \ + gsocketconnectable.h \ + gsocketconnection.h \ + gsocketcontrolmessage.h \ + gsocketlistener.h \ + gsocketservice.h \ + gsrvtarget.h \ + gtcpconnection.h \ + gthreadedsocketservice.h\ + gthemedicon.h \ + gvfs.h \ + gvolume.h \ + gvolumemonitor.h \ + gzlibcompressor.h \ + gzlibdecompressor.h \ + $(NULL) + +gioincludedir=$(includedir)/glib-2.0/gio/ +gioinclude_HEADERS = \ + $(gio_headers) \ + gioenumtypes.h + +# these sources (also mentioned above) are generated. +BUILT_SOURCES = \ + gio-marshal.h \ + gio-marshal.c \ + gioalias.h \ + gioaliasdef.c \ + gioenumtypes.h \ + gioenumtypes.c \ + $(NULL) + +EXTRA_DIST += \ + gio-marshal.list \ + gio.symbols \ + gioenumtypes.h.template \ + gioenumtypes.c.template \ + makefile.msc \ + makegioalias.pl \ + abicheck.sh \ + pltcheck.sh \ + gio.rc.in \ + $(NULL) + +BUILT_EXTRA_DIST = \ + gio.rc + +CLEANFILES = \ + $(marshal_sources) \ + $(NULL) + +gioenumtypes.h: $(gio_headers) gioenumtypes.h.template + ( top_builddir=`cd $(top_builddir) && pwd`; \ + cd $(srcdir) && $$top_builddir/gobject/glib-mkenums --template gioenumtypes.h.template $(gio_headers) ) > \ + gioenumtypes.h.tmp && mv gioenumtypes.h.tmp gioenumtypes.h + +gioenumtypes.c: $(gio_headers) gioenumtypes.c.template + ( top_builddir=`cd $(top_builddir) && pwd`; \ + cd $(srcdir) && $$top_builddir/gobject/glib-mkenums --template gioenumtypes.c.template $(gio_headers) ) > \ + gioenumtypes.c.tmp && mv gioenumtypes.c.tmp gioenumtypes.c + +gio-2.0.lib: libgio-2.0.la gio.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgio-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gio.def -out:$@ + +bin_PROGRAMS = gio-querymodules +gio_querymodules_SOURCES = gio-querymodules.c +gio_querymodules_LDADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + libgio-2.0.la \ + $(NULL) + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/gio.vcproj + 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 + +../build/win32/vs9/gio.vcproj: $(top_srcdir)/build/win32/vs9/gio.vcprojin + for F in $(libgio_2_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libgio.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/gio.vcprojin >$@ + +if HAVE_GLIB_RUNTIME_LIBDIR +install-data-hook: + mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgio-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgio-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + rm -f $(DESTDIR)$(libdir)/libgio-2.0.so + ln -s $(GLIB_RUNTIME_LIBDIR)/libgio-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgio-2.0.so +endif diff --git a/gio/Makefile.in b/gio/Makefile.in new file mode 100644 index 0000000..6b96c3e --- /dev/null +++ b/gio/Makefile.in @@ -0,0 +1,1692 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + + + +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@ +DIST_COMMON = $(am__giounixinclude_HEADERS_DIST) $(gioinclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/gio.rc.in $(top_srcdir)/Makefile.decl ChangeLog +@OS_UNIX_TRUE@am__append_1 = libasyncns xdgmime +@HAVE_INOTIFY_TRUE@am__append_2 = inotify +@HAVE_INOTIFY_TRUE@am__append_3 = inotify/libinotify.la +@HAVE_INOTIFY_TRUE@am__append_4 = inotify/libinotify.la +@HAVE_FEN_TRUE@am__append_5 = -DHAVE_FEN +@HAVE_FEN_TRUE@am__append_6 = fen +@HAVE_FEN_TRUE@am__append_7 = fen/libfen.la +@HAVE_FEN_TRUE@am__append_8 = fen/libfen.la +@OS_WIN32_TRUE@am__append_9 = win32 +@OS_WIN32_TRUE@am__append_10 = win32/libgiowin32.la +@OS_WIN32_TRUE@am__append_11 = win32/libgiowin32.la +@HAVE_FAM_TRUE@am__append_12 = fam +@OS_UNIX_TRUE@am__append_13 = gdesktopappinfo.c gdesktopappinfo.h +@OS_UNIX_TRUE@am__append_14 = libasyncns/libasyncns.la xdgmime/libxdgmime.la +@OS_UNIX_TRUE@am__append_15 = libasyncns/libasyncns.la xdgmime/libxdgmime.la +@OS_WIN32_TRUE@am__append_16 = gwin32appinfo.c gwin32appinfo.h +@OS_WIN32_TRUE@am__append_17 = -lshlwapi -lws2_32 -ldnsapi +bin_PROGRAMS = gio-querymodules$(EXEEXT) +subdir = gio +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = gio.rc +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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(gioincludedir)" "$(DESTDIR)$(giounixincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(am__append_3) $(am__append_7) $(am__append_10) \ + $(am__append_14) $(am__DEPENDENCIES_1) +am__libgio_2_0_la_SOURCES_DIST = gappinfo.c gasynchelper.c \ + gasynchelper.h gasyncinitable.c gasyncresult.c \ + gbufferedinputstream.c gbufferedoutputstream.c gcancellable.c \ + gcontenttype.c gcontenttypeprivate.h gcharsetconverter.c \ + gconverter.c gconverterinputstream.c gconverteroutputstream.c \ + gdatainputstream.c gdataoutputstream.c gdrive.c gdummyfile.h \ + gdummyfile.c gemblem.h gemblem.c gemblemedicon.h \ + gemblemedicon.c gfile.c gfileattribute.c gfileattribute-priv.h \ + gfiledescriptorbased.h gfiledescriptorbased.c \ + gfileenumerator.c gfileicon.c gfileinfo.c gfileinfo-priv.h \ + gfileinputstream.c gfilemonitor.c gfilenamecompleter.c \ + gfileoutputstream.c gfileiostream.c gfilterinputstream.c \ + gfilteroutputstream.c gicon.c ginetaddress.c \ + ginetsocketaddress.c ginitable.c ginputstream.c gioenums.h \ + gioerror.c giomodule.c giomodule-priv.h gioscheduler.c \ + giostream.c gloadableicon.c gmount.c gmemoryinputstream.c \ + gmemoryoutputstream.c gmountoperation.c gnativevolumemonitor.c \ + gnativevolumemonitor.h gnetworkaddress.c gnetworkingprivate.h \ + gnetworkservice.c goutputstream.c gpollfilemonitor.c \ + gpollfilemonitor.h gresolver.c gseekable.c \ + gsimpleasyncresult.c gsocket.c gsocketaddress.c \ + gsocketaddressenumerator.c gsocketclient.c \ + gsocketconnectable.c gsocketconnection.c \ + gsocketcontrolmessage.c gsocketinputstream.c \ + gsocketinputstream.h gsocketlistener.c gsocketoutputstream.c \ + gsocketoutputstream.h gsocketservice.c gsrvtarget.c \ + gtcpconnection.c gthreadedsocketservice.c gthemedicon.c \ + gthreadedresolver.c gthreadedresolver.h gunionvolumemonitor.c \ + gunionvolumemonitor.h gvfs.c gvolume.c gvolumemonitor.c \ + gzlibcompressor.c gzlibdecompressor.c gmountprivate.h \ + gioenumtypes.h gioenumtypes.c gioalias.h gioaliasdef.c \ + gdesktopappinfo.c gdesktopappinfo.h gwin32appinfo.c \ + gwin32appinfo.h gunixconnection.c gunixfdlist.c \ + gunixfdmessage.c gunixmount.c gunixmount.h gunixmounts.c \ + gunixmounts.h gunixresolver.c gunixresolver.h \ + gunixsocketaddress.c gunixvolume.c gunixvolume.h \ + gunixvolumemonitor.c gunixvolumemonitor.h gunixinputstream.c \ + gunixoutputstream.c gwin32mount.c gwin32mount.h \ + gwin32resolver.c gwin32resolver.h gwin32volumemonitor.c \ + gwin32volumemonitor.h glocaldirectorymonitor.c \ + glocaldirectorymonitor.h glocalfile.c glocalfile.h \ + glocalfileenumerator.c glocalfileenumerator.h glocalfileinfo.c \ + glocalfileinfo.h glocalfileinputstream.c \ + glocalfileinputstream.h glocalfilemonitor.c \ + glocalfilemonitor.h glocalfileoutputstream.c \ + glocalfileoutputstream.h glocalfileiostream.c \ + glocalfileiostream.h glocalvfs.c glocalvfs.h gio-marshal.h \ + gio-marshal.c +@OS_UNIX_TRUE@am__objects_1 = gdesktopappinfo.lo +@OS_WIN32_TRUE@am__objects_2 = gwin32appinfo.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = +@OS_UNIX_TRUE@am__objects_5 = gunixconnection.lo gunixfdlist.lo \ +@OS_UNIX_TRUE@ gunixfdmessage.lo gunixmount.lo gunixmounts.lo \ +@OS_UNIX_TRUE@ gunixresolver.lo gunixsocketaddress.lo \ +@OS_UNIX_TRUE@ gunixvolume.lo gunixvolumemonitor.lo \ +@OS_UNIX_TRUE@ gunixinputstream.lo gunixoutputstream.lo \ +@OS_UNIX_TRUE@ $(am__objects_4) +@OS_WIN32_TRUE@am__objects_6 = gwin32mount.lo gwin32resolver.lo \ +@OS_WIN32_TRUE@ gwin32volumemonitor.lo $(am__objects_4) +am__objects_7 = glocaldirectorymonitor.lo glocalfile.lo \ + glocalfileenumerator.lo glocalfileinfo.lo \ + glocalfileinputstream.lo glocalfilemonitor.lo \ + glocalfileoutputstream.lo glocalfileiostream.lo glocalvfs.lo \ + $(am__objects_4) +am__objects_8 = gio-marshal.lo $(am__objects_4) +am_libgio_2_0_la_OBJECTS = gappinfo.lo gasynchelper.lo \ + gasyncinitable.lo gasyncresult.lo gbufferedinputstream.lo \ + gbufferedoutputstream.lo gcancellable.lo gcontenttype.lo \ + gcharsetconverter.lo gconverter.lo gconverterinputstream.lo \ + gconverteroutputstream.lo gdatainputstream.lo \ + gdataoutputstream.lo gdrive.lo gdummyfile.lo gemblem.lo \ + gemblemedicon.lo gfile.lo gfileattribute.lo \ + gfiledescriptorbased.lo gfileenumerator.lo gfileicon.lo \ + gfileinfo.lo gfileinputstream.lo gfilemonitor.lo \ + gfilenamecompleter.lo gfileoutputstream.lo gfileiostream.lo \ + gfilterinputstream.lo gfilteroutputstream.lo gicon.lo \ + ginetaddress.lo ginetsocketaddress.lo ginitable.lo \ + ginputstream.lo gioerror.lo giomodule.lo gioscheduler.lo \ + giostream.lo gloadableicon.lo gmount.lo gmemoryinputstream.lo \ + gmemoryoutputstream.lo gmountoperation.lo \ + gnativevolumemonitor.lo gnetworkaddress.lo gnetworkservice.lo \ + goutputstream.lo gpollfilemonitor.lo gresolver.lo gseekable.lo \ + gsimpleasyncresult.lo gsocket.lo gsocketaddress.lo \ + gsocketaddressenumerator.lo gsocketclient.lo \ + gsocketconnectable.lo gsocketconnection.lo \ + gsocketcontrolmessage.lo gsocketinputstream.lo \ + gsocketlistener.lo gsocketoutputstream.lo gsocketservice.lo \ + gsrvtarget.lo gtcpconnection.lo gthreadedsocketservice.lo \ + gthemedicon.lo gthreadedresolver.lo gunionvolumemonitor.lo \ + gvfs.lo gvolume.lo gvolumemonitor.lo gzlibcompressor.lo \ + gzlibdecompressor.lo gioenumtypes.lo gioaliasdef.lo \ + $(am__objects_3) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_4) +libgio_2_0_la_OBJECTS = $(am_libgio_2_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgio_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgio_2_0_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) +am_gio_querymodules_OBJECTS = gio-querymodules.$(OBJEXT) +gio_querymodules_OBJECTS = $(am_gio_querymodules_OBJECTS) +gio_querymodules_DEPENDENCIES = $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la libgio-2.0.la \ + $(am__DEPENDENCIES_1) +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgio_2_0_la_SOURCES) $(gio_querymodules_SOURCES) +DIST_SOURCES = $(am__libgio_2_0_la_SOURCES_DIST) \ + $(gio_querymodules_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 +DATA = $(noinst_DATA) +am__giounixinclude_HEADERS_DIST = gdesktopappinfo.h \ + gfiledescriptorbased.h gunixconnection.h gunixmounts.h \ + gunixfdlist.h gunixfdmessage.h gunixinputstream.h \ + gunixoutputstream.h gunixsocketaddress.h +HEADERS = $(gioinclude_HEADERS) $(giounixinclude_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 +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DIST_SUBDIRS = libasyncns xdgmime inotify fen win32 . fam tests +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = gio-marshal.list gio.symbols gioenumtypes.h.template \ + gioenumtypes.c.template makefile.msc makegioalias.pl \ + abicheck.sh pltcheck.sh gio.rc.in $(NULL) +TEST_PROGS = +NULL = +SUBDIRS = $(am__append_1) $(am__append_2) $(am__append_6) \ + $(am__append_9) . $(am__append_12) tests +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@noinst_DATA = gio-2.0.lib +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@install_ms_lib_cmd = $(INSTALL) gio-2.0.lib $(DESTDIR)$(libdir) +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gio-2.0.lib +@HAVE_GNUC_VISIBILITY_TRUE@@OS_LINUX_TRUE@TESTS = abicheck.sh pltcheck.sh +@HAVE_THREADS_TRUE@THREAD_FLAGS = -DG_THREADS_MANDATORY +AM_CPPFLAGS = -DG_LOG_DOMAIN=\"GLib-GIO\" -I$(top_builddir) \ + -I$(top_srcdir) -I$(top_srcdir)/glib -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) $(THREAD_FLAGS) -DG_DISABLE_DEPRECATED \ + -DGIO_COMPILATION -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + $(am__append_5) +lib_LTLIBRARIES = libgio-2.0.la +marshal_sources = \ + gio-marshal.h \ + gio-marshal.c \ + $(NULL) + +@CROSS_COMPILING_FALSE@glib_genmarshal = ../gobject/glib-genmarshal +@CROSS_COMPILING_TRUE@glib_genmarshal = $(GLIB_GENMARSHAL) +local_sources = \ + glocaldirectorymonitor.c \ + glocaldirectorymonitor.h \ + glocalfile.c \ + glocalfile.h \ + glocalfileenumerator.c \ + glocalfileenumerator.h \ + glocalfileinfo.c \ + glocalfileinfo.h \ + glocalfileinputstream.c \ + glocalfileinputstream.h \ + glocalfilemonitor.c \ + glocalfilemonitor.h \ + glocalfileoutputstream.c \ + glocalfileoutputstream.h \ + glocalfileiostream.c \ + glocalfileiostream.h \ + glocalvfs.c \ + glocalvfs.h \ + $(NULL) + +platform_libadd = $(am__append_3) $(am__append_7) $(am__append_10) \ + $(am__append_14) $(am__append_17) +platform_deps = $(am__append_4) $(am__append_8) $(am__append_11) \ + $(am__append_15) +appinfo_sources = $(am__append_13) $(am__append_16) +@OS_UNIX_TRUE@unix_sources = \ +@OS_UNIX_TRUE@ gunixconnection.c \ +@OS_UNIX_TRUE@ gunixfdlist.c \ +@OS_UNIX_TRUE@ gunixfdmessage.c \ +@OS_UNIX_TRUE@ gunixmount.c \ +@OS_UNIX_TRUE@ gunixmount.h \ +@OS_UNIX_TRUE@ gunixmounts.c \ +@OS_UNIX_TRUE@ gunixmounts.h \ +@OS_UNIX_TRUE@ gunixresolver.c \ +@OS_UNIX_TRUE@ gunixresolver.h \ +@OS_UNIX_TRUE@ gunixsocketaddress.c \ +@OS_UNIX_TRUE@ gunixvolume.c \ +@OS_UNIX_TRUE@ gunixvolume.h \ +@OS_UNIX_TRUE@ gunixvolumemonitor.c \ +@OS_UNIX_TRUE@ gunixvolumemonitor.h \ +@OS_UNIX_TRUE@ gunixinputstream.c \ +@OS_UNIX_TRUE@ gunixoutputstream.c \ +@OS_UNIX_TRUE@ $(NULL) + +@OS_UNIX_TRUE@giounixincludedir = $(includedir)/gio-unix-2.0/gio +@OS_UNIX_TRUE@giounixinclude_HEADERS = \ +@OS_UNIX_TRUE@ gdesktopappinfo.h \ +@OS_UNIX_TRUE@ gfiledescriptorbased.h \ +@OS_UNIX_TRUE@ gunixconnection.h \ +@OS_UNIX_TRUE@ gunixmounts.h \ +@OS_UNIX_TRUE@ gunixfdlist.h \ +@OS_UNIX_TRUE@ gunixfdmessage.h \ +@OS_UNIX_TRUE@ gunixinputstream.h \ +@OS_UNIX_TRUE@ gunixoutputstream.h \ +@OS_UNIX_TRUE@ gunixsocketaddress.h \ +@OS_UNIX_TRUE@ $(NULL) + +@OS_WIN32_TRUE@win32_sources = \ +@OS_WIN32_TRUE@ gwin32mount.c \ +@OS_WIN32_TRUE@ gwin32mount.h \ +@OS_WIN32_TRUE@ gwin32resolver.c \ +@OS_WIN32_TRUE@ gwin32resolver.h \ +@OS_WIN32_TRUE@ gwin32volumemonitor.c \ +@OS_WIN32_TRUE@ gwin32volumemonitor.h \ +@OS_WIN32_TRUE@ $(NULL) + +libgio_2_0_la_SOURCES = \ + gappinfo.c \ + gasynchelper.c \ + gasynchelper.h \ + gasyncinitable.c \ + gasyncresult.c \ + gbufferedinputstream.c \ + gbufferedoutputstream.c \ + gcancellable.c \ + gcontenttype.c \ + gcontenttypeprivate.h \ + gcharsetconverter.c \ + gconverter.c \ + gconverterinputstream.c \ + gconverteroutputstream.c \ + gdatainputstream.c \ + gdataoutputstream.c \ + gdrive.c \ + gdummyfile.h \ + gdummyfile.c \ + gemblem.h \ + gemblem.c \ + gemblemedicon.h \ + gemblemedicon.c \ + gfile.c \ + gfileattribute.c \ + gfileattribute-priv.h \ + gfiledescriptorbased.h \ + gfiledescriptorbased.c \ + gfileenumerator.c \ + gfileicon.c \ + gfileinfo.c \ + gfileinfo-priv.h \ + gfileinputstream.c \ + gfilemonitor.c \ + gfilenamecompleter.c \ + gfileoutputstream.c \ + gfileiostream.c \ + gfilterinputstream.c \ + gfilteroutputstream.c \ + gicon.c \ + ginetaddress.c \ + ginetsocketaddress.c \ + ginitable.c \ + ginputstream.c \ + gioenums.h \ + gioerror.c \ + giomodule.c \ + giomodule-priv.h \ + gioscheduler.c \ + giostream.c \ + gloadableicon.c \ + gmount.c \ + gmemoryinputstream.c \ + gmemoryoutputstream.c \ + gmountoperation.c \ + gnativevolumemonitor.c \ + gnativevolumemonitor.h \ + gnetworkaddress.c \ + gnetworkingprivate.h \ + gnetworkservice.c \ + goutputstream.c \ + gpollfilemonitor.c \ + gpollfilemonitor.h \ + gresolver.c \ + gseekable.c \ + gsimpleasyncresult.c \ + gsocket.c \ + gsocketaddress.c \ + gsocketaddressenumerator.c \ + gsocketclient.c \ + gsocketconnectable.c \ + gsocketconnection.c \ + gsocketcontrolmessage.c \ + gsocketinputstream.c \ + gsocketinputstream.h \ + gsocketlistener.c \ + gsocketoutputstream.c \ + gsocketoutputstream.h \ + gsocketservice.c \ + gsrvtarget.c \ + gtcpconnection.c \ + gthreadedsocketservice.c\ + gthemedicon.c \ + gthreadedresolver.c \ + gthreadedresolver.h \ + gunionvolumemonitor.c \ + gunionvolumemonitor.h \ + gvfs.c \ + gvolume.c \ + gvolumemonitor.c \ + gzlibcompressor.c \ + gzlibdecompressor.c \ + gmountprivate.h \ + gioenumtypes.h \ + gioenumtypes.c \ + gioalias.h \ + gioaliasdef.c \ + $(appinfo_sources) \ + $(unix_sources) \ + $(win32_sources) \ + $(local_sources) \ + $(marshal_sources) \ + $(NULL) + +libgio_2_0_la_LIBADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + $(platform_libadd) \ + $(ZLIB_LIBS) \ + $(SELINUX_LIBS) \ + $(GLIB_LIBS) \ + $(XATTR_LIBS) \ + $(NULL) + +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +@OS_WIN32_AND_DLL_COMPILATION_FALSE@export_symbols = -export-symbols-regex '^g_.*' +@OS_WIN32_AND_DLL_COMPILATION_TRUE@export_symbols = -export-symbols gio.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gio_def = gio.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gio_win32_res = gio-win32-res.o +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gio_win32_res_ldflag = -Wl,$(gio_win32_res) +libgio_2_0_la_LDFLAGS = \ + $(gio_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgio_2_0_la_DEPENDENCIES = $(gio_win32_res) $(gio_def) $(platform_deps) +gio_headers = \ + gappinfo.h \ + gasyncinitable.h \ + gasyncresult.h \ + gbufferedinputstream.h \ + gbufferedoutputstream.h \ + gcancellable.h \ + gcontenttype.h \ + gcharsetconverter.h \ + gconverter.h \ + gconverterinputstream.h \ + gconverteroutputstream.h \ + gdatainputstream.h \ + gdataoutputstream.h \ + gdrive.h \ + gemblem.h \ + gemblemedicon.h \ + gfile.h \ + gfileattribute.h \ + gfileenumerator.h \ + gfileicon.h \ + gfileinfo.h \ + gfileinputstream.h \ + gfilemonitor.h \ + gfilenamecompleter.h \ + gfileoutputstream.h \ + gfileiostream.h \ + gfilterinputstream.h \ + gfilteroutputstream.h \ + gicon.h \ + ginetaddress.h \ + ginetsocketaddress.h \ + ginputstream.h \ + ginitable.h \ + gio.h \ + giotypes.h \ + gioenums.h \ + gioerror.h \ + giomodule.h \ + gioscheduler.h \ + giostream.h \ + gloadableicon.h \ + gmount.h \ + gmemoryinputstream.h \ + gmemoryoutputstream.h \ + gmountoperation.h \ + gnativevolumemonitor.h \ + gnetworkaddress.h \ + gnetworkservice.h \ + goutputstream.h \ + gresolver.h \ + gseekable.h \ + gsimpleasyncresult.h \ + gsocket.h \ + gsocketaddress.h \ + gsocketaddressenumerator.h \ + gsocketclient.h \ + gsocketconnectable.h \ + gsocketconnection.h \ + gsocketcontrolmessage.h \ + gsocketlistener.h \ + gsocketservice.h \ + gsrvtarget.h \ + gtcpconnection.h \ + gthreadedsocketservice.h\ + gthemedicon.h \ + gvfs.h \ + gvolume.h \ + gvolumemonitor.h \ + gzlibcompressor.h \ + gzlibdecompressor.h \ + $(NULL) + +gioincludedir = $(includedir)/glib-2.0/gio/ +gioinclude_HEADERS = \ + $(gio_headers) \ + gioenumtypes.h + + +# these sources (also mentioned above) are generated. +BUILT_SOURCES = \ + gio-marshal.h \ + gio-marshal.c \ + gioalias.h \ + gioaliasdef.c \ + gioenumtypes.h \ + gioenumtypes.c \ + $(NULL) + +BUILT_EXTRA_DIST = \ + gio.rc + +CLEANFILES = \ + $(marshal_sources) \ + $(NULL) + +gio_querymodules_SOURCES = gio-querymodules.c +gio_querymodules_LDADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + libgio-2.0.la \ + $(NULL) + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/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): +gio.rc: $(top_builddir)/config.status $(srcdir)/gio.rc.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 +libgio-2.0.la: $(libgio_2_0_la_OBJECTS) $(libgio_2_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgio_2_0_la_LINK) -rpath $(libdir) $(libgio_2_0_la_OBJECTS) $(libgio_2_0_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_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 +gio-querymodules$(EXEEXT): $(gio_querymodules_OBJECTS) $(gio_querymodules_DEPENDENCIES) + @rm -f gio-querymodules$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gio_querymodules_OBJECTS) $(gio_querymodules_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gappinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gasynchelper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gasyncinitable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gasyncresult.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbufferedinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbufferedoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcancellable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcharsetconverter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcontenttype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gconverter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gconverterinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gconverteroutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdatainputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdataoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdesktopappinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdrive.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdummyfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gemblem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gemblemedicon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileattribute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfiledescriptorbased.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileenumerator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileicon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileiostream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfilemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfilenamecompleter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfilterinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfilteroutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gicon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ginetaddress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ginetsocketaddress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ginitable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ginputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gio-marshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gio-querymodules.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gioaliasdef.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gioenumtypes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gioerror.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/giomodule.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gioscheduler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/giostream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gloadableicon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocaldirectorymonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfileenumerator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfileinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfileinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfileiostream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfilemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalfileoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glocalvfs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmemoryinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmemoryoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmount.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmountoperation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnativevolumemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnetworkaddress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnetworkservice.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpollfilemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gresolver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gseekable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsimpleasyncresult.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocket.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketaddress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketaddressenumerator.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketclient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketconnectable.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketconnection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketcontrolmessage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketlistener.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsocketservice.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsrvtarget.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtcpconnection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gthemedicon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gthreadedresolver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gthreadedsocketservice.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunionvolumemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixconnection.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixfdlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixfdmessage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixmount.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixmounts.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixresolver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixsocketaddress.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixvolume.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunixvolumemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvfs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvolume.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvolumemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gwin32appinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gwin32mount.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gwin32resolver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gwin32volumemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzlibcompressor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gzlibdecompressor.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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-gioincludeHEADERS: $(gioinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(gioincludedir)" || $(MKDIR_P) "$(DESTDIR)$(gioincludedir)" + @list='$(gioinclude_HEADERS)'; test -n "$(gioincludedir)" || 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)$(gioincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(gioincludedir)" || exit $$?; \ + done + +uninstall-gioincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(gioinclude_HEADERS)'; test -n "$(gioincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(gioincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gioincludedir)" && rm -f $$files +install-giounixincludeHEADERS: $(giounixinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(giounixincludedir)" || $(MKDIR_P) "$(DESTDIR)$(giounixincludedir)" + @list='$(giounixinclude_HEADERS)'; test -n "$(giounixincludedir)" || 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)$(giounixincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(giounixincludedir)" || exit $$?; \ + done + +uninstall-giounixincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(giounixinclude_HEADERS)'; test -n "$(giounixincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(giounixincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(giounixincludedir)" && rm -f $$files + +# 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 + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gioincludedir)" "$(DESTDIR)$(giounixincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@HAVE_GLIB_RUNTIME_LIBDIR_FALSE@install-data-hook: +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool 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-gioincludeHEADERS \ + install-giounixincludeHEADERS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS 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-binPROGRAMS uninstall-gioincludeHEADERS \ + uninstall-giounixincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + check-am ctags-recursive install install-am install-data-am \ + install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-TESTS check-am check-local clean \ + clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool ctags ctags-recursive dist-hook distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-data-hook install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-gioincludeHEADERS install-giounixincludeHEADERS \ + 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-binPROGRAMS uninstall-gioincludeHEADERS \ + uninstall-giounixincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +gio.def: gio.symbols + (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/gio.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gio.def.tmp && \ + mv gio.def.tmp gio.def + +gioalias.h: gio.symbols + $(PERL) $(srcdir)/makegioalias.pl < $(srcdir)/gio.symbols > gioalias.h.tmp && \ + mv gioalias.h.tmp gioalias.h + +gioaliasdef.c: gio.symbols + $(PERL) $(srcdir)/makegioalias.pl -def < $(srcdir)/gio.symbols > gioaliasdef.c.tmp && \ + mv gioaliasdef.c.tmp gioaliasdef.c + +gio-marshal.h: gio-marshal.list + $(glib_genmarshal) --prefix=_gio_marshal $(srcdir)/gio-marshal.list --header --internal > $@.tmp && \ + mv $@.tmp $@ + +gio-marshal.c: gio-marshal.h gio-marshal.list + (echo "#include \"gio-marshal.h\""; \ + $(glib_genmarshal) --prefix=_gio_marshal $(srcdir)/gio-marshal.list --body --internal) > $@.tmp && \ + mv $@.tmp $@ + +$(libgio_2_0_la_OBJECTS): $(marshal_sources) + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ $(INSTALL) gio.def $(DESTDIR)$(libdir)/gio-2.0.def + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ -rm $(DESTDIR)$(libdir)/gio-2.0.def +@OS_WIN32_AND_DLL_COMPILATION_FALSE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_FALSE@uninstall-def-file: + +install-data-local: install-ms-lib install-def-file + $(mkinstalldirs) $(DESTDIR)$(GIO_MODULE_DIR) + +uninstall-local: uninstall-ms-lib uninstall-def-file + +gio-win32-res.o: gio.rc + $(WINDRES) gio.rc $@ + +gioenumtypes.h: $(gio_headers) gioenumtypes.h.template + ( top_builddir=`cd $(top_builddir) && pwd`; \ + cd $(srcdir) && $$top_builddir/gobject/glib-mkenums --template gioenumtypes.h.template $(gio_headers) ) > \ + gioenumtypes.h.tmp && mv gioenumtypes.h.tmp gioenumtypes.h + +gioenumtypes.c: $(gio_headers) gioenumtypes.c.template + ( top_builddir=`cd $(top_builddir) && pwd`; \ + cd $(srcdir) && $$top_builddir/gobject/glib-mkenums --template gioenumtypes.c.template $(gio_headers) ) > \ + gioenumtypes.c.tmp && mv gioenumtypes.c.tmp gioenumtypes.c + +gio-2.0.lib: libgio-2.0.la gio.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgio-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gio.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/gio.vcproj + 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 + +../build/win32/vs9/gio.vcproj: $(top_srcdir)/build/win32/vs9/gio.vcprojin + for F in $(libgio_2_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libgio.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/gio.vcprojin >$@ + +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@install-data-hook: +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgio-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgio-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ rm -f $(DESTDIR)$(libdir)/libgio-2.0.so +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ ln -s $(GLIB_RUNTIME_LIBDIR)/libgio-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgio-2.0.so + +# 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/gio/abicheck.sh b/gio/abicheck.sh new file mode 100755 index 0000000..5796399 --- /dev/null +++ b/gio/abicheck.sh @@ -0,0 +1,13 @@ +#! /bin/sh + +egrep '^#([^i]|if).*[^\]$' "${top_builddir:-..}/glibconfig.h" > glibconfig.cpp + +INCLUDES="-include ${top_builddir:-..}/config.h" +INCLUDES="$INCLUDES -include glibconfig.cpp" + +cpp -DINCLUDE_VARIABLES -P $INCLUDES -DALL_FILES ${srcdir:-.}/gio.symbols | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi +rm glibconfig.cpp + +nm -D -g --defined-only .libs/libgio-2.0.so | cut -d ' ' -f 3 | sort > actual-abi + +diff -u expected-abi actual-abi && rm expected-abi actual-abi diff --git a/gio/fam/Makefile.am b/gio/fam/Makefile.am new file mode 100644 index 0000000..e4183bd --- /dev/null +++ b/gio/fam/Makefile.am @@ -0,0 +1,52 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +module_flags = -export_dynamic -avoid-version -module -no-undefined -export-symbols-regex '^g_io_module_(load|unload|query)' + +giomodule_LTLIBRARIES = libgiofam.la +giomoduledir = $(GIO_MODULE_DIR) + +libgiofam_la_SOURCES = \ + fam-helper.c \ + fam-helper.h \ + fam-module.c \ + gfamdirectorymonitor.c \ + gfamdirectorymonitor.h \ + gfamfilemonitor.c \ + gfamfilemonitor.h \ + $(NULL) + +libgiofam_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + +libgiofam_la_LDFLAGS = $(module_flags) +libgiofam_la_LIBADD = \ + $(top_builddir)/gio/libgio-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/glib/libglib-2.0.la \ + $(GLIB_LIBS) \ + $(FAM_LIBS) \ + $(NULL) + +if CROSS_COMPILING +RUN_QUERY_MODULES=false +else +RUN_QUERY_MODULES=true +endif + +install-data-hook: + if $(RUN_QUERY_MODULES) && test -z "$(DESTDIR)" ; then \ + $(top_builddir)/gio/gio-querymodules$(EXEEXT) $(DESTDIR)$(GIO_MODULE_DIR) ; \ + fi + +uninstall-local: + $(RM) $(DESTDIR)$(GIO_MODULE_DIR)/giomodules.cache diff --git a/gio/fam/Makefile.in b/gio/fam/Makefile.in new file mode 100644 index 0000000..0368757 --- /dev/null +++ b/gio/fam/Makefile.in @@ -0,0 +1,788 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = gio/fam +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +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__installdirs = "$(DESTDIR)$(giomoduledir)" +LTLIBRARIES = $(giomodule_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgiofam_la_DEPENDENCIES = $(top_builddir)/gio/libgio-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/glib/libglib-2.0.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am__objects_1 = +am_libgiofam_la_OBJECTS = libgiofam_la-fam-helper.lo \ + libgiofam_la-fam-module.lo \ + libgiofam_la-gfamdirectorymonitor.lo \ + libgiofam_la-gfamfilemonitor.lo $(am__objects_1) +libgiofam_la_OBJECTS = $(am_libgiofam_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgiofam_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libgiofam_la_CFLAGS) \ + $(CFLAGS) $(libgiofam_la_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgiofam_la_SOURCES) +DIST_SOURCES = $(libgiofam_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +NULL = +module_flags = -export_dynamic -avoid-version -module -no-undefined -export-symbols-regex '^g_io_module_(load|unload|query)' +giomodule_LTLIBRARIES = libgiofam.la +giomoduledir = $(GIO_MODULE_DIR) +libgiofam_la_SOURCES = \ + fam-helper.c \ + fam-helper.h \ + fam-module.c \ + gfamdirectorymonitor.c \ + gfamdirectorymonitor.h \ + gfamfilemonitor.c \ + gfamfilemonitor.h \ + $(NULL) + +libgiofam_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + +libgiofam_la_LDFLAGS = $(module_flags) +libgiofam_la_LIBADD = \ + $(top_builddir)/gio/libgio-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/glib/libglib-2.0.la \ + $(GLIB_LIBS) \ + $(FAM_LIBS) \ + $(NULL) + +@CROSS_COMPILING_FALSE@RUN_QUERY_MODULES = true +@CROSS_COMPILING_TRUE@RUN_QUERY_MODULES = false +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/fam/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/fam/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): +install-giomoduleLTLIBRARIES: $(giomodule_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(giomoduledir)" || $(MKDIR_P) "$(DESTDIR)$(giomoduledir)" + @list='$(giomodule_LTLIBRARIES)'; test -n "$(giomoduledir)" || 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)$(giomoduledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(giomoduledir)"; \ + } + +uninstall-giomoduleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(giomodule_LTLIBRARIES)'; test -n "$(giomoduledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(giomoduledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(giomoduledir)/$$f"; \ + done + +clean-giomoduleLTLIBRARIES: + -test -z "$(giomodule_LTLIBRARIES)" || rm -f $(giomodule_LTLIBRARIES) + @list='$(giomodule_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 +libgiofam.la: $(libgiofam_la_OBJECTS) $(libgiofam_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgiofam_la_LINK) -rpath $(giomoduledir) $(libgiofam_la_OBJECTS) $(libgiofam_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiofam_la-fam-helper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiofam_la-fam-module.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiofam_la-gfamdirectorymonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiofam_la-gfamfilemonitor.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 $@ $< + +libgiofam_la-fam-helper.lo: fam-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -MT libgiofam_la-fam-helper.lo -MD -MP -MF $(DEPDIR)/libgiofam_la-fam-helper.Tpo -c -o libgiofam_la-fam-helper.lo `test -f 'fam-helper.c' || echo '$(srcdir)/'`fam-helper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiofam_la-fam-helper.Tpo $(DEPDIR)/libgiofam_la-fam-helper.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fam-helper.c' object='libgiofam_la-fam-helper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -c -o libgiofam_la-fam-helper.lo `test -f 'fam-helper.c' || echo '$(srcdir)/'`fam-helper.c + +libgiofam_la-fam-module.lo: fam-module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -MT libgiofam_la-fam-module.lo -MD -MP -MF $(DEPDIR)/libgiofam_la-fam-module.Tpo -c -o libgiofam_la-fam-module.lo `test -f 'fam-module.c' || echo '$(srcdir)/'`fam-module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiofam_la-fam-module.Tpo $(DEPDIR)/libgiofam_la-fam-module.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fam-module.c' object='libgiofam_la-fam-module.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -c -o libgiofam_la-fam-module.lo `test -f 'fam-module.c' || echo '$(srcdir)/'`fam-module.c + +libgiofam_la-gfamdirectorymonitor.lo: gfamdirectorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -MT libgiofam_la-gfamdirectorymonitor.lo -MD -MP -MF $(DEPDIR)/libgiofam_la-gfamdirectorymonitor.Tpo -c -o libgiofam_la-gfamdirectorymonitor.lo `test -f 'gfamdirectorymonitor.c' || echo '$(srcdir)/'`gfamdirectorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiofam_la-gfamdirectorymonitor.Tpo $(DEPDIR)/libgiofam_la-gfamdirectorymonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gfamdirectorymonitor.c' object='libgiofam_la-gfamdirectorymonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -c -o libgiofam_la-gfamdirectorymonitor.lo `test -f 'gfamdirectorymonitor.c' || echo '$(srcdir)/'`gfamdirectorymonitor.c + +libgiofam_la-gfamfilemonitor.lo: gfamfilemonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -MT libgiofam_la-gfamfilemonitor.lo -MD -MP -MF $(DEPDIR)/libgiofam_la-gfamfilemonitor.Tpo -c -o libgiofam_la-gfamfilemonitor.lo `test -f 'gfamfilemonitor.c' || echo '$(srcdir)/'`gfamfilemonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiofam_la-gfamfilemonitor.Tpo $(DEPDIR)/libgiofam_la-gfamfilemonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gfamfilemonitor.c' object='libgiofam_la-gfamfilemonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiofam_la_CFLAGS) $(CFLAGS) -c -o libgiofam_la-gfamfilemonitor.lo `test -f 'gfamfilemonitor.c' || echo '$(srcdir)/'`gfamfilemonitor.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(giomoduledir)"; 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-giomoduleLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-giomoduleLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-giomoduleLTLIBRARIES uninstall-local + +.MAKE: check-am install-am install-data-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-giomoduleLTLIBRARIES clean-libtool ctags \ + 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-hook install-dvi install-dvi-am \ + install-exec install-exec-am install-giomoduleLTLIBRARIES \ + 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-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-giomoduleLTLIBRARIES uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +install-data-hook: + if $(RUN_QUERY_MODULES) && test -z "$(DESTDIR)" ; then \ + $(top_builddir)/gio/gio-querymodules$(EXEEXT) $(DESTDIR)$(GIO_MODULE_DIR) ; \ + fi + +uninstall-local: + $(RM) $(DESTDIR)$(GIO_MODULE_DIR)/giomodules.cache + +# 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/gio/fam/fam-helper.c b/gio/fam/fam-helper.c new file mode 100644 index 0000000..840c497 --- /dev/null +++ b/gio/fam/fam-helper.c @@ -0,0 +1,276 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#include "config.h" +#include +#include + +#include "gfile.h" +#include "fam-helper.h" + +static FAMConnection* fam_connection = NULL; +static gint fam_watch_id = 0; +G_LOCK_DEFINE_STATIC(fam_connection); + +struct _fam_sub +{ + gchar *pathname; + gboolean directory; + gpointer user_data; + gboolean cancelled; + FAMRequest request; +}; + +/* This uses int as the argument type because the + real type differs between implementations: + gamin has "typedef enum FAMCodes {....} FAMCodes;" + fam has "enum FAMCodes { ... }". +*/ +static GFileMonitorEvent +fam_event_to_file_monitor_event (int code) +{ + switch (code) + { + case FAMChanged: + return G_FILE_MONITOR_EVENT_CHANGED; + break; + case FAMDeleted: + return G_FILE_MONITOR_EVENT_DELETED; + break; + case FAMCreated: + return G_FILE_MONITOR_EVENT_CREATED; + break; + default: + return -1; + break; + } +} + +static gboolean +fam_do_iter_unlocked (void) +{ + while (fam_connection != NULL && FAMPending (fam_connection)) + { + FAMEvent ev; + fam_sub* sub = NULL; + gboolean cancelled; + + if (FAMNextEvent (fam_connection, &ev) != 1) + { + FAMClose (fam_connection); + g_free (fam_connection); + g_source_remove (fam_watch_id); + fam_watch_id = 0; + fam_connection = NULL; + return FALSE; + } + + sub = (fam_sub*)ev.userdata; + cancelled = sub->cancelled; + if (ev.code == FAMAcknowledge && cancelled) + { + _fam_sub_free (sub); + continue; + } + + if (cancelled) + continue; + + if (sub->directory) + { + GFileMonitor* monitor = G_FILE_MONITOR (sub->user_data); + GFileMonitorEvent eflags = fam_event_to_file_monitor_event (ev.code); + gchar* path = NULL; + GFile *child, *parent; + + /* unsupported event */ + if (eflags == -1) + continue; + + if (ev.filename[0] == '/') + path = g_strdup (ev.filename); + else + path = g_strdup_printf ("%s/%s", sub->pathname, ev.filename); + + child = g_file_new_for_path (path); + parent = g_file_get_parent (child); + g_file_monitor_emit_event (monitor, child, NULL, eflags); + g_free (path); + g_object_unref (child); + g_object_unref (parent); + } + else + { + GFile *child; + GFileMonitor* monitor = G_FILE_MONITOR (sub->user_data); + GFileMonitorEvent eflags = fam_event_to_file_monitor_event (ev.code); + gchar* path = NULL; + + if (eflags == -1) + continue; + path = g_strdup (ev.filename); + child = g_file_new_for_path (path); + g_file_monitor_emit_event (monitor, child, NULL, eflags); + g_free (path); + g_object_unref (child); + } + } + + return TRUE; +} + +static gboolean +fam_callback (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + gboolean res; + G_LOCK (fam_connection); + + res = fam_do_iter_unlocked (); + + G_UNLOCK (fam_connection); + return res; +} + +gboolean +_fam_sub_startup (void) +{ + GIOChannel *ioc; + + G_LOCK (fam_connection); + + if (fam_connection == NULL) + { + fam_connection = g_new0 (FAMConnection, 1); + if (FAMOpen2 (fam_connection, "gvfs user") != 0) + { + g_warning ("FAMOpen failed, FAMErrno=%d\n", FAMErrno); + g_free (fam_connection); + fam_connection = NULL; + G_UNLOCK (fam_connection); + return FALSE; + } +#ifdef HAVE_FAM_NO_EXISTS + /* This is a gamin extension that avoids sending all the Exists event for dir monitors */ + FAMNoExists (fam_connection); +#endif + ioc = g_io_channel_unix_new (FAMCONNECTION_GETFD(fam_connection)); + fam_watch_id = g_io_add_watch (ioc, + G_IO_IN | G_IO_HUP | G_IO_ERR, + fam_callback, fam_connection); + g_io_channel_unref (ioc); + } + + G_UNLOCK (fam_connection); + + return TRUE; +} + +void +_fam_sub_shutdown (void) +{ + G_LOCK (fam_connection); + + if (fam_connection != NULL) + { + FAMClose (fam_connection); + g_free (fam_connection); + g_source_remove (fam_watch_id); + fam_watch_id = 0; + fam_connection = NULL; + } + + G_UNLOCK (fam_connection); +} + +fam_sub* +_fam_sub_add (const gchar *pathname, + gboolean directory, + gpointer user_data) +{ + fam_sub *sub; + + if (!_fam_sub_startup ()) + return NULL; + + G_LOCK (fam_connection); + /* We need to queue up incoming messages to avoid blocking on write + * if there are many monitors being canceled */ + fam_do_iter_unlocked (); + + if (fam_connection == NULL) + { + G_UNLOCK (fam_connection); + return NULL; + } + + sub = g_new0 (fam_sub, 1); + sub->pathname = g_strdup (pathname); + sub->directory = directory; + sub->user_data = user_data; + + if (directory) + FAMMonitorDirectory (fam_connection, pathname, &sub->request, sub); + else + FAMMonitorFile (fam_connection, pathname, &sub->request, sub); + + G_UNLOCK (fam_connection); + + return sub; +} + +gboolean +_fam_sub_cancel (fam_sub* sub) +{ + if (sub->cancelled) + return TRUE; + + sub->cancelled = TRUE; + + G_LOCK (fam_connection); + /* We need to queue up incoming messages to avoid blocking on write + * if there are many monitors being canceled */ + fam_do_iter_unlocked (); + + if (fam_connection == NULL) + { + G_UNLOCK (fam_connection); + return FALSE; + } + + FAMCancelMonitor (fam_connection, &sub->request); + + G_UNLOCK (fam_connection); + + return TRUE; +} + +void +_fam_sub_free (fam_sub* sub) +{ + g_free (sub->pathname); + g_free (sub); +} + diff --git a/gio/fam/fam-helper.h b/gio/fam/fam-helper.h new file mode 100644 index 0000000..05e67d1 --- /dev/null +++ b/gio/fam/fam-helper.h @@ -0,0 +1,38 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __FAM_HELPER_H__ +#define __FAM_HELPER_H__ + +typedef struct _fam_sub fam_sub; + +gboolean _fam_sub_startup (void); +void _fam_sub_shutdown (void); +fam_sub* _fam_sub_add (const gchar* pathname, + gboolean directory, + gpointer user_data); +gboolean _fam_sub_cancel (fam_sub* sub); +void _fam_sub_free (fam_sub* sub); + +#endif /* __FAM_HELPER_H__ */ diff --git a/gio/fam/fam-module.c b/gio/fam/fam-module.c new file mode 100644 index 0000000..91d6d62 --- /dev/null +++ b/gio/fam/fam-module.c @@ -0,0 +1,54 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#include "giomodule.h" +#include "gfamdirectorymonitor.h" +#include "gfamfilemonitor.h" +#include "fam-helper.h" + +void +g_io_module_load (GIOModule *module) +{ + g_fam_file_monitor_register (module); + g_fam_directory_monitor_register (module); +} + +void +g_io_module_unload (GIOModule *module) +{ + _fam_sub_shutdown (); +} + +char ** +g_io_module_query (void) +{ + char *eps[] = { + G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, + NULL + }; + return g_strdupv (eps); +} + diff --git a/gio/fam/gfamdirectorymonitor.c b/gio/fam/gfamdirectorymonitor.c new file mode 100644 index 0000000..831a2bc --- /dev/null +++ b/gio/fam/gfamdirectorymonitor.c @@ -0,0 +1,153 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#include "config.h" + +#include "gfamdirectorymonitor.h" +#include "giomodule.h" + +#include "fam-helper.h" + +struct _GFamDirectoryMonitor +{ + GLocalDirectoryMonitor parent_instance; + fam_sub *sub; +}; + +static gboolean g_fam_directory_monitor_cancel (GFileMonitor* monitor); + +G_DEFINE_DYNAMIC_TYPE (GFamDirectoryMonitor, g_fam_directory_monitor, G_TYPE_LOCAL_DIRECTORY_MONITOR) + +static void +g_fam_directory_monitor_finalize (GObject *object) +{ + GFamDirectoryMonitor *fam_monitor = G_FAM_DIRECTORY_MONITOR (object); + fam_sub *sub = fam_monitor->sub; + + if (sub) { + if (!_fam_sub_cancel (sub)) + g_warning ("Unexpected error cancelling fam monitor"); + + fam_monitor->sub = NULL; + } + + if (G_OBJECT_CLASS (g_fam_directory_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_fam_directory_monitor_parent_class)->finalize) (object); +} + +static GObject * +g_fam_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GFamDirectoryMonitorClass *klass; + GObjectClass *parent_class; + GFamDirectoryMonitor *fam_monitor; + const gchar *dirname = NULL; + fam_sub *sub = NULL; + + klass = G_FAM_DIRECTORY_MONITOR_CLASS (g_type_class_peek (G_TYPE_FAM_DIRECTORY_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + fam_monitor = G_FAM_DIRECTORY_MONITOR (obj); + + dirname = G_LOCAL_DIRECTORY_MONITOR (obj)->dirname; + g_assert (dirname != NULL); + + sub = _fam_sub_add (dirname, TRUE, fam_monitor); + /* FIXME: what to do about errors here? we can't return NULL or another + * kind of error and an assertion is probably too hard */ + g_assert (sub != NULL); + + fam_monitor->sub = sub; + + return obj; +} + +static void +g_fam_directory_monitor_class_finalize (GFamDirectoryMonitorClass *klass) +{ +} + +static gboolean +g_fam_directory_monitor_is_supported (void) +{ + return _fam_sub_startup (); +} + +static void +g_fam_directory_monitor_class_init (GFamDirectoryMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); + GLocalDirectoryMonitorClass *local_directory_monitor_class = G_LOCAL_DIRECTORY_MONITOR_CLASS (klass); + + gobject_class->finalize = g_fam_directory_monitor_finalize; + gobject_class->constructor = g_fam_directory_monitor_constructor; + file_monitor_class->cancel = g_fam_directory_monitor_cancel; + + local_directory_monitor_class->mount_notify = FALSE; + local_directory_monitor_class->is_supported = g_fam_directory_monitor_is_supported; +} + +static void +g_fam_directory_monitor_init (GFamDirectoryMonitor* monitor) +{ + +} + +static gboolean +g_fam_directory_monitor_cancel (GFileMonitor* monitor) +{ + GFamDirectoryMonitor *fam_monitor = G_FAM_DIRECTORY_MONITOR (monitor); + fam_sub *sub = fam_monitor->sub; + + if (sub) { + if (!_fam_sub_cancel (sub)) + g_warning ("Unexpected error cancelling fam monitor"); + + fam_monitor->sub = NULL; + } + + if (G_FILE_MONITOR_CLASS (g_fam_directory_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_fam_directory_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} + +void +g_fam_directory_monitor_register (GIOModule *module) +{ + g_fam_directory_monitor_register_type (G_TYPE_MODULE (module)); + g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + G_TYPE_FAM_DIRECTORY_MONITOR, + "fam", + 10); +} + diff --git a/gio/fam/gfamdirectorymonitor.h b/gio/fam/gfamdirectorymonitor.h new file mode 100644 index 0000000..48192d1 --- /dev/null +++ b/gio/fam/gfamdirectorymonitor.h @@ -0,0 +1,54 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __G_FAM_DIRECTORY_MONITOR_H__ +#define __G_FAM_DIRECTORY_MONITOR_H__ + +#include +#include +#include "glocaldirectorymonitor.h" +#include "giomodule.h" + +G_BEGIN_DECLS + +#define G_TYPE_FAM_DIRECTORY_MONITOR (g_fam_directory_monitor_get_type ()) +#define G_FAM_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FAM_DIRECTORY_MONITOR, GFamDirectoryMonitor)) +#define G_FAM_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_FAM_DIRECTORY_MONITOR, GFamDirectoryMonitorClass)) +#define G_IS_FAM_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FAM_DIRECTORY_MONITOR)) +#define G_IS_FAM_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FAM_DIRECTORY_MONITOR)) + +typedef struct _GFamDirectoryMonitor GFamDirectoryMonitor; +typedef struct _GFamDirectoryMonitorClass GFamDirectoryMonitorClass; + +struct _GFamDirectoryMonitorClass { + GLocalDirectoryMonitorClass parent_class; +}; + +GType g_fam_directory_monitor_get_type (void); +void g_fam_directory_monitor_register (GIOModule *module); + +G_END_DECLS + +#endif /* __G_FAM_DIRECTORY_MONITOR_H__ */ diff --git a/gio/fam/gfamfilemonitor.c b/gio/fam/gfamfilemonitor.c new file mode 100644 index 0000000..1855047 --- /dev/null +++ b/gio/fam/gfamfilemonitor.c @@ -0,0 +1,151 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#include "config.h" + +#include "gfamfilemonitor.h" +#include "giomodule.h" + +#include "fam-helper.h" + +struct _GFamFileMonitor +{ + GLocalFileMonitor parent_instance; + fam_sub *sub; +}; + +static gboolean g_fam_file_monitor_cancel (GFileMonitor* monitor); + +G_DEFINE_DYNAMIC_TYPE (GFamFileMonitor, g_fam_file_monitor, G_TYPE_LOCAL_FILE_MONITOR) + +static void +g_fam_file_monitor_finalize (GObject *object) +{ + GFamFileMonitor *fam_monitor = G_FAM_FILE_MONITOR (object); + fam_sub *sub = fam_monitor->sub; + + if (sub) { + if (!_fam_sub_cancel (sub)) + g_warning ("Unexpected error cancelling fam monitor"); + fam_monitor->sub = NULL; + } + + if (G_OBJECT_CLASS (g_fam_file_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_fam_file_monitor_parent_class)->finalize) (object); +} + +static GObject * +g_fam_file_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GFamFileMonitorClass *klass; + GObjectClass *parent_class; + GFamFileMonitor *fam_monitor; + const gchar *filename = NULL; + fam_sub *sub = NULL; + + klass = G_FAM_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_FAM_FILE_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + fam_monitor = G_FAM_FILE_MONITOR (obj); + + filename = G_LOCAL_FILE_MONITOR (obj)->filename; + + g_assert (filename != NULL); + + sub = _fam_sub_add (filename, FALSE, fam_monitor); + /* FIXME: what to do about errors here? we can't return NULL or another + * kind of error and an assertion is probably too hard */ + g_assert (sub != NULL); + + fam_monitor->sub = sub; + + return obj; +} + +static void +g_fam_file_monitor_class_finalize (GFamFileMonitorClass *klass) +{ +} + +static gboolean +g_fam_file_monitor_is_supported (void) +{ + return _fam_sub_startup (); +} + +static void +g_fam_file_monitor_class_init (GFamFileMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); + GLocalFileMonitorClass *local_file_monitor_class = G_LOCAL_FILE_MONITOR_CLASS (klass); + + gobject_class->finalize = g_fam_file_monitor_finalize; + gobject_class->constructor = g_fam_file_monitor_constructor; + file_monitor_class->cancel = g_fam_file_monitor_cancel; + + local_file_monitor_class->is_supported = g_fam_file_monitor_is_supported; +} + +static void +g_fam_file_monitor_init (GFamFileMonitor* monitor) +{ + +} + +static gboolean +g_fam_file_monitor_cancel (GFileMonitor* monitor) +{ + GFamFileMonitor *fam_monitor = G_FAM_FILE_MONITOR (monitor); + fam_sub *sub = fam_monitor->sub; + + if (sub) { + if (!_fam_sub_cancel (sub)) + g_warning ("Unexpected error cancelling fam monitor"); + fam_monitor->sub = NULL; + } + + if (G_FILE_MONITOR_CLASS (g_fam_file_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_fam_file_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} + +void +g_fam_file_monitor_register (GIOModule *module) +{ + g_fam_file_monitor_register_type (G_TYPE_MODULE (module)); + g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, + G_TYPE_FAM_FILE_MONITOR, + "fam", + 10); +} + diff --git a/gio/fam/gfamfilemonitor.h b/gio/fam/gfamfilemonitor.h new file mode 100644 index 0000000..559384e --- /dev/null +++ b/gio/fam/gfamfilemonitor.h @@ -0,0 +1,55 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __G_FAM_FILE_MONITOR_H__ +#define __G_FAM_FILE_MONITOR_H__ + +#include +#include +#include +#include "glocalfilemonitor.h" +#include "giomodule.h" + +G_BEGIN_DECLS + +#define G_TYPE_FAM_FILE_MONITOR (g_fam_file_monitor_get_type ()) +#define G_FAM_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FAM_FILE_MONITOR, GFamFileMonitor)) +#define G_FAM_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_FAM_FILE_MONITOR, GFamFileMonitorClass)) +#define G_IS_FAM_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FAM_FILE_MONITOR)) +#define G_IS_FAM_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FAM_FILE_MONITOR)) + +typedef struct _GFamFileMonitor GFamFileMonitor; +typedef struct _GFamFileMonitorClass GFamFileMonitorClass; + +struct _GFamFileMonitorClass { + GLocalFileMonitorClass parent_class; +}; + +GType g_fam_file_monitor_get_type (void); +void g_fam_file_monitor_register (GIOModule *module); + +G_END_DECLS + +#endif /* __G_FAM_FILE_MONITOR_H__ */ diff --git a/gio/fen/Makefile.am b/gio/fen/Makefile.am new file mode 100644 index 0000000..1acaa44 --- /dev/null +++ b/gio/fen/Makefile.am @@ -0,0 +1,38 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +noinst_LTLIBRARIES = libfen.la + +libfen_la_SOURCES = \ + fen-dump.c \ + fen-dump.h \ + fen-kernel.c \ + fen-kernel.h \ + fen-node.c \ + fen-node.h \ + fen-missing.c \ + fen-missing.h \ + fen-helper.c \ + fen-helper.h \ + fen-data.c \ + fen-data.h \ + fen-sub.c \ + fen-sub.h \ + gfenfilemonitor.c \ + gfenfilemonitor.h \ + gfendirectorymonitor.c \ + gfendirectorymonitor.h \ + $(NULL) + +libfen_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + -I$(top_builddir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED diff --git a/gio/fen/Makefile.in b/gio/fen/Makefile.in new file mode 100644 index 0000000..d7140be --- /dev/null +++ b/gio/fen/Makefile.in @@ -0,0 +1,772 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = gio/fen +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libfen_la_LIBADD = +am__objects_1 = +am_libfen_la_OBJECTS = libfen_la-fen-dump.lo libfen_la-fen-kernel.lo \ + libfen_la-fen-node.lo libfen_la-fen-missing.lo \ + libfen_la-fen-helper.lo libfen_la-fen-data.lo \ + libfen_la-fen-sub.lo libfen_la-gfenfilemonitor.lo \ + libfen_la-gfendirectorymonitor.lo $(am__objects_1) +libfen_la_OBJECTS = $(am_libfen_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libfen_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libfen_la_CFLAGS) \ + $(CFLAGS) $(AM_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libfen_la_SOURCES) +DIST_SOURCES = $(libfen_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +NULL = +noinst_LTLIBRARIES = libfen.la +libfen_la_SOURCES = \ + fen-dump.c \ + fen-dump.h \ + fen-kernel.c \ + fen-kernel.h \ + fen-node.c \ + fen-node.h \ + fen-missing.c \ + fen-missing.h \ + fen-helper.c \ + fen-helper.h \ + fen-data.c \ + fen-data.h \ + fen-sub.c \ + fen-sub.h \ + gfenfilemonitor.c \ + gfenfilemonitor.h \ + gfendirectorymonitor.c \ + gfendirectorymonitor.h \ + $(NULL) + +libfen_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + -I$(top_builddir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/fen/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/fen/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 +libfen.la: $(libfen_la_OBJECTS) $(libfen_la_DEPENDENCIES) + $(AM_V_CCLD)$(libfen_la_LINK) $(libfen_la_OBJECTS) $(libfen_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-data.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-dump.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-helper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-kernel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-missing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-node.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-fen-sub.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-gfendirectorymonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfen_la-gfenfilemonitor.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 $@ $< + +libfen_la-fen-dump.lo: fen-dump.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-dump.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-dump.Tpo -c -o libfen_la-fen-dump.lo `test -f 'fen-dump.c' || echo '$(srcdir)/'`fen-dump.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-dump.Tpo $(DEPDIR)/libfen_la-fen-dump.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-dump.c' object='libfen_la-fen-dump.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-dump.lo `test -f 'fen-dump.c' || echo '$(srcdir)/'`fen-dump.c + +libfen_la-fen-kernel.lo: fen-kernel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-kernel.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-kernel.Tpo -c -o libfen_la-fen-kernel.lo `test -f 'fen-kernel.c' || echo '$(srcdir)/'`fen-kernel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-kernel.Tpo $(DEPDIR)/libfen_la-fen-kernel.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-kernel.c' object='libfen_la-fen-kernel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-kernel.lo `test -f 'fen-kernel.c' || echo '$(srcdir)/'`fen-kernel.c + +libfen_la-fen-node.lo: fen-node.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-node.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-node.Tpo -c -o libfen_la-fen-node.lo `test -f 'fen-node.c' || echo '$(srcdir)/'`fen-node.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-node.Tpo $(DEPDIR)/libfen_la-fen-node.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-node.c' object='libfen_la-fen-node.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-node.lo `test -f 'fen-node.c' || echo '$(srcdir)/'`fen-node.c + +libfen_la-fen-missing.lo: fen-missing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-missing.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-missing.Tpo -c -o libfen_la-fen-missing.lo `test -f 'fen-missing.c' || echo '$(srcdir)/'`fen-missing.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-missing.Tpo $(DEPDIR)/libfen_la-fen-missing.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-missing.c' object='libfen_la-fen-missing.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-missing.lo `test -f 'fen-missing.c' || echo '$(srcdir)/'`fen-missing.c + +libfen_la-fen-helper.lo: fen-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-helper.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-helper.Tpo -c -o libfen_la-fen-helper.lo `test -f 'fen-helper.c' || echo '$(srcdir)/'`fen-helper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-helper.Tpo $(DEPDIR)/libfen_la-fen-helper.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-helper.c' object='libfen_la-fen-helper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-helper.lo `test -f 'fen-helper.c' || echo '$(srcdir)/'`fen-helper.c + +libfen_la-fen-data.lo: fen-data.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-data.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-data.Tpo -c -o libfen_la-fen-data.lo `test -f 'fen-data.c' || echo '$(srcdir)/'`fen-data.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-data.Tpo $(DEPDIR)/libfen_la-fen-data.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-data.c' object='libfen_la-fen-data.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-data.lo `test -f 'fen-data.c' || echo '$(srcdir)/'`fen-data.c + +libfen_la-fen-sub.lo: fen-sub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-fen-sub.lo -MD -MP -MF $(DEPDIR)/libfen_la-fen-sub.Tpo -c -o libfen_la-fen-sub.lo `test -f 'fen-sub.c' || echo '$(srcdir)/'`fen-sub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-fen-sub.Tpo $(DEPDIR)/libfen_la-fen-sub.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fen-sub.c' object='libfen_la-fen-sub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-fen-sub.lo `test -f 'fen-sub.c' || echo '$(srcdir)/'`fen-sub.c + +libfen_la-gfenfilemonitor.lo: gfenfilemonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-gfenfilemonitor.lo -MD -MP -MF $(DEPDIR)/libfen_la-gfenfilemonitor.Tpo -c -o libfen_la-gfenfilemonitor.lo `test -f 'gfenfilemonitor.c' || echo '$(srcdir)/'`gfenfilemonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-gfenfilemonitor.Tpo $(DEPDIR)/libfen_la-gfenfilemonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gfenfilemonitor.c' object='libfen_la-gfenfilemonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-gfenfilemonitor.lo `test -f 'gfenfilemonitor.c' || echo '$(srcdir)/'`gfenfilemonitor.c + +libfen_la-gfendirectorymonitor.lo: gfendirectorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -MT libfen_la-gfendirectorymonitor.lo -MD -MP -MF $(DEPDIR)/libfen_la-gfendirectorymonitor.Tpo -c -o libfen_la-gfendirectorymonitor.lo `test -f 'gfendirectorymonitor.c' || echo '$(srcdir)/'`gfendirectorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfen_la-gfendirectorymonitor.Tpo $(DEPDIR)/libfen_la-gfendirectorymonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gfendirectorymonitor.c' object='libfen_la-gfendirectorymonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfen_la_CFLAGS) $(CFLAGS) -c -o libfen_la-gfendirectorymonitor.lo `test -f 'gfendirectorymonitor.c' || echo '$(srcdir)/'`gfendirectorymonitor.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gio/fen/fen-data.c b/gio/fen/fen-data.c new file mode 100644 index 0000000..fed317f --- /dev/null +++ b/gio/fen/fen-data.c @@ -0,0 +1,718 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include "fen-data.h" +#include "fen-kernel.h" +#include "fen-missing.h" +#include "fen-dump.h" + +#define PROCESS_EVENTQ_TIME 10 /* in milliseconds */ +#define PAIR_EVENTS_TIMEVAL 00000 /* in microseconds */ +#define PAIR_EVENTS_INC_TIMEVAL 0000 /* in microseconds */ +#define SCAN_CHANGINGS_TIME 50 /* in milliseconds */ +#define SCAN_CHANGINGS_MAX_TIME (4*100) /* in milliseconds */ +#define SCAN_CHANGINGS_MIN_TIME (4*100) /* in milliseconds */ +#define INIT_CHANGES_NUM 2 +#define BASE_NUM 2 + +#ifdef GIO_COMPILATION +#define FD_W if (fd_debug_enabled) g_warning +static gboolean fd_debug_enabled = FALSE; +#else +#include "gam_error.h" +#define FD_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_LOCK_EXTERN (fen_lock); +static GList *deleting_data = NULL; +static guint deleting_data_id = 0; + +static void (*emit_once_cb) (fdata *f, int events, gpointer sub); +static void (*emit_cb) (fdata *f, int events); +static int (*_event_converter) (int event); + +static gboolean fdata_delete (fdata* f); +static gint fdata_sub_find (gpointer a, gpointer b); +static void scan_children (node_t *f); +static void scan_known_children (node_t* f); + +node_t* +_add_missing_cb (node_t* parent, gpointer user_data) +{ + g_assert (parent); + FD_W ("%s p:0x%p %s\n", __func__, parent, (gchar*)user_data); + return _add_node (parent, (gchar*)user_data); +} + +gboolean +_pre_del_cb (node_t* node, gpointer user_data) +{ + fdata* data; + + g_assert (node); + data = _node_get_data (node); + FD_W ("%s node:0x%p %s\n", __func__, node, NODE_NAME(node)); + if (data != NULL) { + if (!FN_IS_PASSIVE(data)) { + return FALSE; + } + fdata_delete (data); + } + return TRUE; +} + +static guint +_pow (guint x, guint y) +{ + guint z = 1; + g_assert (x >= 0 && y >= 0); + for (; y > 0; y--) { + z *= x; + } + return z; +} + +static guint +get_scalable_scan_time (fdata* data) +{ + guint sleep_time; + /* Caculate from num = 0 */ + sleep_time = _pow (BASE_NUM, data->changed_event_num) * SCAN_CHANGINGS_TIME; + if (sleep_time < SCAN_CHANGINGS_MIN_TIME) { + sleep_time = SCAN_CHANGINGS_MIN_TIME; + } else if (sleep_time > SCAN_CHANGINGS_MAX_TIME) { + sleep_time = SCAN_CHANGINGS_MAX_TIME; + data->change_update_id = INIT_CHANGES_NUM; + } + FD_W ("SCALABE SCAN num:time [ %4u : %4u ] %s\n", data->changed_event_num, sleep_time, FN_NAME(data)); + return sleep_time; +} + +static gboolean +g_timeval_lt (GTimeVal *val1, GTimeVal *val2) +{ + if (val1->tv_sec < val2->tv_sec) + return TRUE; + + if (val1->tv_sec > val2->tv_sec) + return FALSE; + + /* val1->tv_sec == val2->tv_sec */ + if (val1->tv_usec < val2->tv_usec) + return TRUE; + + return FALSE; +} + +/* + * If all active children nodes are ported, then cancel monitor the parent node + * + * Unsafe, need lock. + */ +static void +scan_known_children (node_t* f) +{ + GDir *dir; + GError *err = NULL; + fdata* pdata; + + FD_W ("%s %s [0x%p]\n", __func__, NODE_NAME(f), f); + pdata = _node_get_data (f); + /* + * Currect fdata must is directly monitored. Be sure it is 1 level monitor. + */ + dir = g_dir_open (NODE_NAME(f), 0, &err); + if (dir) { + const char *basename; + + while ((basename = g_dir_read_name (dir))) + { + node_t* childf = NULL; + fdata* data; + GList *idx; + /* + * If the node is existed, and isn't ported, then emit created + * event. Ignore others. + */ + childf = _children_find (f, basename); + if (childf && + (data = _node_get_data (childf)) != NULL && + !FN_IS_PASSIVE (data)) { + if (!is_monitoring (data) && + _port_add (&data->fobj, &data->len, data)) { + _fdata_emit_events (data, FN_EVENT_CREATED); + } + } + } + g_dir_close (dir); + } else { + FD_W (err->message); + g_error_free (err); + } +} + +static void +scan_children (node_t *f) +{ + GDir *dir; + GError *err = NULL; + fdata* pdata; + + FD_W ("%s %s [0x%p]\n", __func__, NODE_NAME(f), f); + pdata = _node_get_data (f); + /* + * Currect fdata must is directly monitored. Be sure it is 1 level monitor. + */ + dir = g_dir_open (NODE_NAME(f), 0, &err); + if (dir) { + const char *basename; + + while ((basename = g_dir_read_name (dir))) + { + node_t* childf = NULL; + fdata* data; + GList *idx; + + childf = _children_find (f, basename); + if (childf == NULL) { + gchar *filename; + + filename = g_build_filename (NODE_NAME(f), basename, NULL); + childf = _add_node (f, filename); + g_assert (childf); + data = _fdata_new (childf, FALSE); + g_free (filename); + } + if ((data = _node_get_data (childf)) == NULL) { + data = _fdata_new (childf, FALSE); + } + /* Be sure data isn't ported and add to port successfully */ + /* Don't need delete it, it will be deleted by the parent */ + if (is_monitoring (data)) { + /* Ignored */ + } else if (/* !_is_ported (data) && */ + _port_add (&data->fobj, &data->len, data)) { + _fdata_emit_events (data, FN_EVENT_CREATED); + } + } + g_dir_close (dir); + } else { + FD_W (err->message); + g_error_free (err); + } +} + +static gboolean +scan_deleting_data (gpointer data) +{ + fdata *f; + GList* i; + GList* deleted_list = NULL; + gboolean ret = TRUE; + + if (G_TRYLOCK (fen_lock)) { + for (i = deleting_data; i; i = i->next) { + f = (fdata*)i->data; + if (fdata_delete (f)) { + deleted_list = g_list_prepend (deleted_list, i); + } + } + + for (i = deleted_list; i; i = i->next) { + deleting_data = g_list_remove_link (deleting_data, + (GList *)i->data); + g_list_free_1 ((GList *)i->data); + } + g_list_free (deleted_list); + + if (deleting_data == NULL) { + deleting_data_id = 0; + ret = FALSE; + } + G_UNLOCK (fen_lock); + } + return ret; +} + +gboolean +is_monitoring (fdata* data) +{ + return _is_ported (data) || data->change_update_id > 0; +} + +fdata* +_get_parent_data (fdata* data) +{ + if (FN_NODE(data) && !IS_TOPNODE(FN_NODE(data))) { + return _node_get_data (FN_NODE(data)->parent); + } + return NULL; +} + +node_t* +_get_parent_node (fdata* data) +{ + if (FN_NODE(data)) { + return (FN_NODE(data)->parent); + } + return NULL; +} + +fdata * +_fdata_new (node_t* node, gboolean is_mondir) +{ + fdata *f = NULL; + + g_assert (node); + if ((f = g_new0 (fdata, 1)) != NULL) { + FN_NODE(f) = node; + FN_NAME(f) = g_strdup (NODE_NAME(node)); + f->is_dir = is_mondir; + f->eventq = g_queue_new (); + FD_W ("[ %s ] 0x%p %s\n", __func__, f, FN_NAME(f)); + _node_set_data (node, f); + } + return f; +} + +static gboolean +fdata_delete (fdata *f) +{ + fnode_event_t *ev; + + FD_W ("[ TRY %s ] 0x%p id[%4d:%4d] %s\n", __func__, f, f->eventq_id, f->change_update_id, FN_NAME(f)); + g_assert (FN_IS_PASSIVE(f)); + + _port_remove (f); + /* _missing_remove (f); */ + + if (f->node != NULL) { + _node_set_data (f->node, NULL); + f->node = NULL; + } + + if (f->change_update_id > 0 || f->eventq_id > 0) { + if (FN_IS_LIVING(f)) { + f->is_cancelled = TRUE; + deleting_data = g_list_prepend (deleting_data, f); + if (deleting_data_id == 0) { + deleting_data_id = g_idle_add (scan_deleting_data, NULL); + g_assert (deleting_data_id > 0); + } + } + return FALSE; + } + FD_W ("[ %s ] 0x%p %s\n", __func__, f, FN_NAME(f)); + + while ((ev = g_queue_pop_head (f->eventq)) != NULL) { + _fnode_event_delete (ev); + } + + g_queue_free (f->eventq); + g_free (FN_NAME(f)); + g_free (f); + return TRUE; +} + +void +_fdata_reset (fdata* data) +{ + fnode_event_t *ev; + + g_assert (data); + + while ((ev = g_queue_pop_head (data->eventq)) != NULL) { + _fnode_event_delete (ev); + } +} + +static gint +fdata_sub_find (gpointer a, gpointer b) +{ + if (a != b) { + return 1; + } else { + return 0; + } +} + +void +_fdata_sub_add (fdata *f, gpointer sub) +{ + FD_W ("[%s] [data: 0x%p ] [s: 0x%p ] %s\n", __func__, f, sub, FN_NAME(f)); + g_assert (g_list_find_custom (f->subs, sub, (GCompareFunc)fdata_sub_find) == NULL); + f->subs = g_list_prepend (f->subs, sub); +} + +void +_fdata_sub_remove (fdata *f, gpointer sub) +{ + GList *l; + FD_W ("[%s] [data: 0x%p ] [s: 0x%p ] %s\n", __func__, f, sub, FN_NAME(f)); + g_assert (g_list_find_custom (f->subs, sub, (GCompareFunc)fdata_sub_find) != NULL); + l = g_list_find_custom (f->subs, sub, (GCompareFunc)fdata_sub_find); + g_assert (l); + g_assert (sub == l->data); + f->subs = g_list_delete_link (f->subs, l); +} + +/* + * Adjust self on failing to Port + */ +void +_fdata_adjust_deleted (fdata* f) +{ + node_t* parent; + fdata* pdata; + node_op_t op = {NULL, NULL, _pre_del_cb, NULL}; + + /* + * It's a top node. We move it to missing list. + */ + parent = _get_parent_node (f); + pdata = _get_parent_data (f); + if (!FN_IS_PASSIVE(f) || + _children_num (FN_NODE(f)) > 0 || + (pdata && !FN_IS_PASSIVE(pdata))) { + if (parent) { + if (pdata == NULL) { + pdata = _fdata_new (parent, FALSE); + } + g_assert (pdata); + if (!_port_add (&pdata->fobj, &pdata->len, pdata)) { + _fdata_adjust_deleted (pdata); + } + } else { + /* f is root */ + g_assert (IS_TOPNODE(FN_NODE(f))); + _missing_add (f); + } + } else { +#ifdef GIO_COMPILATION + _pending_remove_node (FN_NODE(f), &op); +#else + _remove_node (FN_NODE(f), &op); +#endif + } +} + +static gboolean +fdata_adjust_changed (fdata *f) +{ + fnode_event_t *ev; + struct stat buf; + node_t* parent; + fdata* pdata; + + G_LOCK (fen_lock); + parent = _get_parent_node (f); + pdata = _get_parent_data (f); + + if (!FN_IS_LIVING(f) || + (_children_num (FN_NODE(f)) == 0 && + FN_IS_PASSIVE(f) && + pdata && FN_IS_PASSIVE(pdata))) { + f->change_update_id = 0; + G_UNLOCK (fen_lock); + return FALSE; + } + + FD_W ("[ %s ] %s\n", __func__, FN_NAME(f)); + if (FN_STAT (FN_NAME(f), &buf) != 0) { + FD_W ("LSTAT [%-20s] %s\n", FN_NAME(f), g_strerror (errno)); + goto L_delete; + } + f->is_dir = S_ISDIR (buf.st_mode) ? TRUE : FALSE; + if (f->len != buf.st_size) { + /* FD_W ("LEN [%lld:%lld] %s\n", f->len, buf.st_size, FN_NAME(f)); */ + f->len = buf.st_size; + ev = _fnode_event_new (FILE_MODIFIED, TRUE, f); + if (ev != NULL) { + ev->is_pending = TRUE; + _fdata_add_event (f, ev); + } + /* Fdata is still changing, so scalable scan */ + f->change_update_id = g_timeout_add (get_scalable_scan_time (f), + (GSourceFunc)fdata_adjust_changed, + (gpointer)f); + G_UNLOCK (fen_lock); + return FALSE; + } else { + f->changed_event_num = 0; + f->fobj.fo_atime = buf.st_atim; + f->fobj.fo_mtime = buf.st_mtim; + f->fobj.fo_ctime = buf.st_ctim; + if (FN_IS_DIR(f)) { + if (FN_IS_MONDIR(f)) { + scan_children (FN_NODE(f)); + } else { + scan_known_children (FN_NODE(f)); + if ((_children_num (FN_NODE(f)) == 0 && + FN_IS_PASSIVE(f) && + pdata && FN_IS_PASSIVE(pdata))) { + _port_remove (f); + goto L_exit; + } + } + } + if (!_port_add_simple (&f->fobj, f)) { + L_delete: + ev = _fnode_event_new (FILE_DELETE, FALSE, f); + if (ev != NULL) { + _fdata_add_event (f, ev); + } + } + } +L_exit: + f->change_update_id = 0; + G_UNLOCK (fen_lock); + return FALSE; +} + +void +_fdata_emit_events_once (fdata *f, int event, gpointer sub) +{ + emit_once_cb (f, _event_converter (event), sub); +} + +void +_fdata_emit_events (fdata *f, int event) +{ + emit_cb (f, _event_converter (event)); +} + +static gboolean +process_events (gpointer udata) +{ + node_op_t op = {NULL, NULL, _pre_del_cb, NULL}; + fdata* f; + fnode_event_t* ev; + int e; + + /* FD_W ("IN <======== %s\n", __func__); */ + + f = (fdata*)udata; + FD_W ("%s 0x%p id:%-4d %s\n", __func__, f, f->eventq_id, FN_NAME(f)); + + G_LOCK (fen_lock); + + if (!FN_IS_LIVING(f)) { + f->eventq_id = 0; + G_UNLOCK (fen_lock); + return FALSE; + } + + if ((ev = (fnode_event_t*)g_queue_pop_head (f->eventq)) != NULL) { + /* Send events to clients. */ + e = ev->e; + if (!ev->is_pending) { +#ifdef GIO_COMPILATION + if (ev->has_twin) { + _fdata_emit_events (f, FILE_ATTRIB); + } +#endif + _fdata_emit_events (f, ev->e); + } + + _fnode_event_delete (ev); + ev = NULL; + + /* Adjust node state. */ + /* + * Node the node has been created, so we can delete create event in + * optimizing. To reduce the statings, we add it to Port on discoving + * it then emit CREATED event. So we don't need to do anything here. + */ + switch (e) { + case FILE_MODIFIED: + case MOUNTEDOVER: + case UNMOUNTED: + /* If the event is a changed event, then pending process it */ + if (f->change_update_id == 0) { + f->change_update_id = g_timeout_add (get_scalable_scan_time(f), + (GSourceFunc)fdata_adjust_changed, + (gpointer)f); + g_assert (f->change_update_id > 0); + } + break; + case FILE_ATTRIB: + g_assert (f->change_update_id == 0); + if (!_port_add (&f->fobj, &f->len, f)) { + ev = _fnode_event_new (FILE_DELETE, FALSE, f); + if (ev != NULL) { + _fdata_add_event (f, ev); + } + } + break; + case FILE_DELETE: /* Ignored */ + break; + default: + g_assert_not_reached (); + break; + } + /* Process one event a time */ + G_UNLOCK (fen_lock); + return TRUE; + } + f->eventq_id = 0; + G_UNLOCK (fen_lock); + /* FD_W ("OUT ========> %s\n", __func__); */ + return FALSE; +} + +void +_fdata_add_event (fdata *f, fnode_event_t *ev) +{ + node_op_t op = {NULL, NULL, _pre_del_cb, NULL}; + fnode_event_t *tail; + + if (!FN_IS_LIVING(f)) { + _fnode_event_delete (ev); + return; + } + + FD_W ("%s %d\n", __func__, ev->e); + g_get_current_time (&ev->t); + /* + * If created/deleted events of child node happened, then we use parent + * event queue to handle. + * If child node emits deleted event, it seems no changes for the parent + * node, but the attr is changed. So we may try to cancel processing the + * coming changed events of the parent node. + */ + tail = (fnode_event_t*)g_queue_peek_tail (f->eventq); + switch (ev->e) { + case FILE_RENAME_FROM: + case FILE_RENAME_TO: + case FILE_ACCESS: + _fnode_event_delete (ev); + g_assert_not_reached (); + return; + case FILE_DELETE: + /* clear changed event number */ + f->changed_event_num = 0; + /* + * We will cancel all previous events. + */ + if (tail) { + g_queue_pop_tail (f->eventq); + do { + _fnode_event_delete (tail); + } while ((tail = (fnode_event_t*)g_queue_pop_tail (f->eventq)) != NULL); + } + /* + * Given a node "f" is deleted, process it ASAP. + */ + _fdata_emit_events (f, ev->e); + _fnode_event_delete (ev); + _fdata_adjust_deleted (f); + return; + case FILE_MODIFIED: + case UNMOUNTED: + case MOUNTEDOVER: + /* clear changed event number */ + f->changed_event_num ++; + case FILE_ATTRIB: + default: + /* + * If in the time range, we will try optimizing + * (changed+) to (changed) + * (attrchanged changed) to ([changed, attrchanged]) + * (event attrchanged) to ([event, attrchanged]) + */ + if (tail) { + do { + if (tail->e == ev->e) { + if (g_timeval_lt (&ev->t, &tail->t)) { + g_queue_peek_tail (f->eventq); + /* Add the increment */ + g_time_val_add (&ev->t, PAIR_EVENTS_INC_TIMEVAL); + /* skip the previous event */ + FD_W ("SKIPPED -- %s\n", _event_string (tail->e)); + _fnode_event_delete (tail); + } else { + break; + } + } else if (ev->e == FILE_MODIFIED && tail->e == FILE_ATTRIB) { + ev->has_twin = TRUE; + _fnode_event_delete (tail); + } else if (ev->e == FILE_ATTRIB && f->change_update_id > 0) { + tail->has_twin = TRUE; + /* skip the current event */ + _fnode_event_delete (ev); + return; + } else { + break; + } + } while ((tail = (fnode_event_t*)g_queue_peek_tail (f->eventq)) != NULL); + } + } + + /* must add the threshold time */ + g_time_val_add (&ev->t, PAIR_EVENTS_TIMEVAL); + + g_queue_push_tail (f->eventq, ev); + + /* starting process_events */ + if (f->eventq_id == 0) { + f->eventq_id = g_timeout_add (PROCESS_EVENTQ_TIME, + process_events, + (gpointer)f); + g_assert (f->eventq_id > 0); + } + FD_W ("%s 0x%p id:%-4d %s\n", __func__, f, f->eventq_id, FN_NAME(f)); +} + +gboolean +_fdata_class_init (void (*user_emit_cb) (fdata*, int), + void (*user_emit_once_cb) (fdata*, int, gpointer), + int (*user_event_converter) (int event)) +{ + FD_W ("%s\n", __func__); + if (user_emit_cb == NULL) { + return FALSE; + } + if (user_emit_once_cb == NULL) { + return FALSE; + } + if (user_event_converter == NULL) { + return FALSE; + } + emit_cb = user_emit_cb; + emit_once_cb = user_emit_once_cb; + _event_converter = user_event_converter; + + if (!_port_class_init (_fdata_add_event)) { + FD_W ("_port_class_init failed."); + return FALSE; + } + return TRUE; +} diff --git a/gio/fen/fen-data.h b/gio/fen/fen-data.h new file mode 100644 index 0000000..67419a2 --- /dev/null +++ b/gio/fen/fen-data.h @@ -0,0 +1,89 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include +#include +#include +#include "fen-node.h" +#include "fen-kernel.h" + +#ifndef _FEN_DATA_H_ +#define _FEN_DATA_H_ + +#define FN_EVENT_CREATED 0 +#define FN_NAME(fp) (((fdata*)(fp))->fobj.fo_name) +#define FN_NODE(fp) (((fdata*)(fp))->node) +#define FN_IS_DIR(fp) (((fdata*)(fp))->is_dir) +#define FN_IS_PASSIVE(fp) (((fdata*)(fp))->subs == NULL) +#define FN_IS_MONDIR(fp) (((fdata*)(fp))->mon_dir_num > 0) +#define FN_IS_LIVING(fp) (!((fdata*)(fp))->is_cancelled) + +typedef struct +{ + file_obj_t fobj; + off_t len; + gboolean is_cancelled; + + node_t* node; + /* to identify if the path is dir */ + gboolean is_dir; + guint mon_dir_num; + + /* List of subscriptions monitoring this fdata/path */ + GList *subs; + + /* prcessed changed events num */ + guint changed_event_num; + + /* process events source id */ + GQueue* eventq; + guint eventq_id; + guint change_update_id; +} fdata; + +/* fdata functions */ +fdata* _fdata_new (node_t* node, gboolean is_mondir); +void _fdata_reset (fdata* data); +void _fdata_emit_events_once (fdata *f, int event, gpointer sub); +void _fdata_emit_events (fdata *f, int event); +void _fdata_add_event (fdata *f, fnode_event_t *ev); +void _fdata_adjust_deleted (fdata *f); +fdata* _get_parent_data (fdata* data); +node_t* _get_parent_node (fdata* data); +gboolean _is_monitoring (fdata* data); + +/* sub */ +void _fdata_sub_add (fdata *f, gpointer sub); +void _fdata_sub_remove (fdata *f, gpointer sub); + +/* misc */ +node_t* _add_missing_cb (node_t* parent, gpointer user_data); +gboolean _pre_del_cb (node_t* node, gpointer user_data); + +/* init */ +gboolean _fdata_class_init (void (*user_emit_cb) (fdata*, int), + void (*user_emit_once_cb) (fdata*, int, gpointer), + int (*user_event_converter) (int event)); + +#endif /* _FEN_DATA_H_ */ diff --git a/gio/fen/fen-dump.c b/gio/fen/fen-dump.c new file mode 100644 index 0000000..d9ac363 --- /dev/null +++ b/gio/fen/fen-dump.c @@ -0,0 +1,100 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include +#include +#include "fen-node.h" +#include "fen-data.h" +#include "fen-kernel.h" +#include "fen-missing.h" +#include "fen-dump.h" + +G_LOCK_EXTERN (fen_lock); + +/*-------------------- node ------------------*/ +static void +dump_node (node_t* node, gpointer data) +{ + if (data && node->user_data) { + return; + } + g_printf ("[%s] < 0x%p : 0x%p > %s\n", __func__, node, node->user_data, NODE_NAME(node)); +} + +static gboolean +dump_node_tree (node_t* node, gpointer user_data) +{ + node_op_t op = {dump_node, NULL, NULL, user_data}; + GList* children; + GList* i; + if (G_TRYLOCK (fen_lock)) { + if (node) { + _travel_nodes (node, &op); + } + G_UNLOCK (fen_lock); + } + return TRUE; +} + +/* ------------------ fdata port hash --------------------*/ +void +dump_hash_cb (gpointer key, + gpointer value, + gpointer user_data) +{ + g_printf ("[%s] < 0x%p : 0x%p >\n", __func__, key, value); +} + +gboolean +dump_hash (GHashTable* hash, gpointer user_data) +{ + if (G_TRYLOCK (fen_lock)) { + if (g_hash_table_size (hash) > 0) { + g_hash_table_foreach (hash, dump_hash_cb, user_data); + } + G_UNLOCK (fen_lock); + } + return TRUE; +} + +/* ------------------ event --------------------*/ +void +dump_event (fnode_event_t* ev, gpointer user_data) +{ + fdata* data = ev->user_data; + g_printf ("[%s] < 0x%p : 0x%p > [ %10s ] %s\n", __func__, ev, ev->user_data, _event_string (ev->e), FN_NAME(data)); +} + +void +dump_event_queue (fdata* data, gpointer user_data) +{ + if (G_TRYLOCK (fen_lock)) { + if (data->eventq) { + g_queue_foreach (data->eventq, (GFunc)dump_event, user_data); + } + G_UNLOCK (fen_lock); + } +} + diff --git a/gio/fen/fen-dump.h b/gio/fen/fen-dump.h new file mode 100644 index 0000000..0e866fa --- /dev/null +++ b/gio/fen/fen-dump.h @@ -0,0 +1,29 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#ifndef _FEN_DUMP_H_ +#define _FEN_DUMP_H_ + + +#endif /* _FEN_DUMP_H_ */ diff --git a/gio/fen/fen-helper.c b/gio/fen/fen-helper.c new file mode 100644 index 0000000..c05cb41 --- /dev/null +++ b/gio/fen/fen-helper.c @@ -0,0 +1,337 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include +#include "fen-data.h" +#include "fen-helper.h" +#include "fen-kernel.h" +#ifdef GIO_COMPILATION +#include "gfile.h" +#include "gfilemonitor.h" +#else +#include "gam_event.h" +#include "gam_server.h" +#include "gam_protocol.h" +#endif + +#ifdef GIO_COMPILATION +#define FH_W if (fh_debug_enabled) g_warning +static gboolean fh_debug_enabled = FALSE; +#else +#include "gam_error.h" +#define FH_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_LOCK_EXTERN (fen_lock); + +static void default_emit_event_cb (fdata *f, int events); +static void default_emit_once_event_cb (fdata *f, int events, gpointer sub); +static int default_event_converter (int event); + +static void +scan_children_init (node_t *f, gpointer sub) +{ + GDir *dir; + GError *err = NULL; + node_op_t op = {NULL, NULL, _pre_del_cb, NULL}; + fdata* pdata; + + FH_W ("%s %s [0x%p]\n", __func__, NODE_NAME(f), f); + pdata = _node_get_data (f); + + dir = g_dir_open (NODE_NAME(f), 0, &err); + if (dir) { + const char *basename; + + while ((basename = g_dir_read_name (dir))) + { + node_t *childf = NULL; + fdata* data; + GList *idx; + + childf = _children_find (f, basename); + if (childf == NULL) { + gchar *filename; + + filename = g_build_filename (NODE_NAME(f), basename, NULL); + childf = _add_node (f, filename); + g_assert (childf); + g_free (filename); + } + if ((data = _node_get_data (childf)) == NULL) { + data = _fdata_new (childf, FALSE); + } + + if (is_monitoring (data)) { + /* Ignored */ + } else if (/* !_is_ported (data) && */ + _port_add (&data->fobj, &data->len, data)) { + /* Emit created to all other subs */ + _fdata_emit_events (data, FN_EVENT_CREATED); + } + /* Emit created to the new sub */ +#ifdef GIO_COMPILATION + /* _fdata_emit_events_once (data, FN_EVENT_CREATED, sub); */ +#else + gam_server_emit_one_event (NODE_NAME(childf), + gam_subscription_is_dir (sub), GAMIN_EVENT_EXISTS, sub, 1); +#endif + } + g_dir_close (dir); + } else { + FH_W (err->message); + g_error_free (err); + } +} + +/** + * _fen_add + * + * Won't hold a ref, we have a timout callback to clean unused fdata. + * If there is no value for a key, add it and return it; else return the old + * one. + */ +void +_fen_add (const gchar *filename, gpointer sub, gboolean is_mondir) +{ + node_op_t op = {NULL, _add_missing_cb, _pre_del_cb, (gpointer)filename}; + node_t* f; + fdata* data; + + g_assert (filename); + g_assert (sub); + + G_LOCK (fen_lock); + f = _find_node_full (filename, &op); + FH_W ("[ %s ] f[0x%p] sub[0x%p] %s\n", __func__, f, sub, filename); + g_assert (f); + data = _node_get_data (f); + if (data == NULL) { + data = _fdata_new (f, is_mondir); + } + + if (is_mondir) { + data->mon_dir_num ++; + } + + /* Change to active */ +#ifdef GIO_COMPILATION + if (_port_add (&data->fobj, &data->len, data) || + g_file_test (FN_NAME(data), G_FILE_TEST_EXISTS)) { + if (is_mondir) { + scan_children_init (f, sub); + } + _fdata_sub_add (data, sub); + } else { + _fdata_sub_add (data, sub); + _fdata_adjust_deleted (data); + } +#else + if (_port_add (&data->fobj, &data->len, data) || + g_file_test (FN_NAME(data), G_FILE_TEST_EXISTS)) { + gam_server_emit_one_event (FN_NAME(data), + gam_subscription_is_dir (sub), GAMIN_EVENT_EXISTS, sub, 1); + if (is_mondir) { + scan_children_init (f, sub); + } + gam_server_emit_one_event (FN_NAME(data), + gam_subscription_is_dir (sub), GAMIN_EVENT_ENDEXISTS, sub, 1); + _fdata_sub_add (data, sub); + } else { + _fdata_sub_add (data, sub); + gam_server_emit_one_event (FN_NAME(data), + gam_subscription_is_dir (sub), GAMIN_EVENT_DELETED, sub, 1); + _fdata_adjust_deleted (data); + gam_server_emit_one_event (FN_NAME(data), + gam_subscription_is_dir (sub), GAMIN_EVENT_ENDEXISTS, sub, 1); + } +#endif + G_UNLOCK (fen_lock); +} + +void +_fen_remove (const gchar *filename, gpointer sub, gboolean is_mondir) +{ + node_op_t op = {NULL, _add_missing_cb, _pre_del_cb, (gpointer)filename}; + node_t* f; + fdata* data; + + g_assert (filename); + g_assert (sub); + + G_LOCK (fen_lock); + f = _find_node (filename); + FH_W ("[ %s ] f[0x%p] sub[0x%p] %s\n", __func__, f, sub, filename); + + g_assert (f); + data = _node_get_data (f); + g_assert (data); + + if (is_mondir) { + data->mon_dir_num --; + } + _fdata_sub_remove (data, sub); + if (FN_IS_PASSIVE(data)) { +#ifdef GIO_COMPILATION + _pending_remove_node (f, &op); +#else + _remove_node (f, &op); +#endif + } + G_UNLOCK (fen_lock); +} + +static gboolean +fen_init_once_func (gpointer data) +{ + FH_W ("%s\n", __func__); + if (!_node_class_init ()) { + FH_W ("_node_class_init failed."); + return FALSE; + } + if (!_fdata_class_init (default_emit_event_cb, + default_emit_once_event_cb, + default_event_converter)) { + FH_W ("_fdata_class_init failed."); + return FALSE; + } + return TRUE; +} + +gboolean +_fen_init () +{ +#ifdef GIO_COMPILATION + static GOnce fen_init_once = G_ONCE_INIT; + g_once (&fen_init_once, (GThreadFunc)fen_init_once_func, NULL); + return (gboolean)fen_init_once.retval; +#else + return fen_init_once_func (NULL); +#endif +} + +static void +default_emit_once_event_cb (fdata *f, int events, gpointer sub) +{ +#ifdef GIO_COMPILATION + GFile* child; + fen_sub* _sub = (fen_sub*)sub; + child = g_file_new_for_path (FN_NAME(f)); + g_file_monitor_emit_event (G_FILE_MONITOR (_sub->user_data), + child, NULL, events); + g_object_unref (child); +#else + gam_server_emit_one_event (FN_NAME(f), + gam_subscription_is_dir (sub), events, sub, 1); +#endif +} + +static void +default_emit_event_cb (fdata *f, int events) +{ + GList* i; + fdata* pdata; + +#ifdef GIO_COMPILATION + GFile* child; + child = g_file_new_for_path (FN_NAME(f)); + for (i = f->subs; i; i = i->next) { + fen_sub* sub = (fen_sub*)i->data; + gboolean file_is_dir = sub->is_mondir; + if ((events != G_FILE_MONITOR_EVENT_CHANGED && + events != G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED) || + !file_is_dir) { + g_file_monitor_emit_event (G_FILE_MONITOR (sub->user_data), + child, NULL, events); + } + } + if ((pdata = _get_parent_data (f)) != NULL) { + for (i = pdata->subs; i; i = i->next) { + fen_sub* sub = (fen_sub*)i->data; + gboolean file_is_dir = sub->is_mondir; + g_file_monitor_emit_event (G_FILE_MONITOR (sub->user_data), + child, NULL, events); + } + } + g_object_unref (child); +#else + for (i = f->subs; i; i = i->next) { + gboolean file_is_dir = gam_subscription_is_dir (i->data); + if (events != GAMIN_EVENT_CHANGED || !file_is_dir) { + gam_server_emit_one_event (FN_NAME(f), file_is_dir, events, i->data, 1); + } + } + if ((pdata = _get_parent_data (f)) != NULL) { + for (i = pdata->subs; i; i = i->next) { + gboolean file_is_dir = gam_subscription_is_dir (i->data); + gam_server_emit_one_event (FN_NAME(f), file_is_dir, events, i->data, 1); + } + } +#endif +} + +static int +default_event_converter (int event) +{ +#ifdef GIO_COMPILATION + switch (event) { + case FN_EVENT_CREATED: + return G_FILE_MONITOR_EVENT_CREATED; + case FILE_DELETE: + case FILE_RENAME_FROM: + return G_FILE_MONITOR_EVENT_DELETED; + case UNMOUNTED: + return G_FILE_MONITOR_EVENT_UNMOUNTED; + case FILE_ATTRIB: + return G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED; + case MOUNTEDOVER: + case FILE_MODIFIED: + case FILE_RENAME_TO: + return G_FILE_MONITOR_EVENT_CHANGED; + default: + /* case FILE_ACCESS: */ + g_assert_not_reached (); + return -1; + } +#else + switch (event) { + case FN_EVENT_CREATED: + return GAMIN_EVENT_CREATED; + case FILE_DELETE: + case FILE_RENAME_FROM: + return GAMIN_EVENT_DELETED; + case FILE_ATTRIB: + case MOUNTEDOVER: + case UNMOUNTED: + case FILE_MODIFIED: + case FILE_RENAME_TO: + return GAMIN_EVENT_CHANGED; + default: + /* case FILE_ACCESS: */ + g_assert_not_reached (); + return -1; + } +#endif +} diff --git a/gio/fen/fen-helper.h b/gio/fen/fen-helper.h new file mode 100644 index 0000000..330d007 --- /dev/null +++ b/gio/fen/fen-helper.h @@ -0,0 +1,36 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "fen-sub.h" + +#ifndef _FEN_HELPER_H_ +#define _FEN_HELPER_H_ + +void _fen_add (const gchar *filename, gpointer sub, gboolean is_mondir); +void _fen_remove (const gchar *filename, gpointer sub, gboolean is_mondir); + +/* FEN subsystem initializing */ +gboolean _fen_init (); + +#endif /* _FEN_HELPER_H_ */ diff --git a/gio/fen/fen-kernel.c b/gio/fen/fen-kernel.c new file mode 100644 index 0000000..1747d8f --- /dev/null +++ b/gio/fen/fen-kernel.c @@ -0,0 +1,534 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include "fen-kernel.h" +#include "fen-dump.h" + +#ifdef GIO_COMPILATION +#define FK_W if (fk_debug_enabled) g_warning +static gboolean fk_debug_enabled = FALSE; +#else +#include "gam_error.h" +#define FK_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_GNUC_INTERNAL G_LOCK_DEFINE (fen_lock); +#define PE_ALLOC 64 +#define F_PORT(pfo) (((_f *)(pfo))->port->port) +#define F_NAME(pfo) (((_f *)(pfo))->fobj->fo_name) +#define FEN_ALL_EVENTS (FILE_MODIFIED | FILE_ATTRIB | FILE_NOFOLLOW) +#define FEN_IGNORE_EVENTS (FILE_ACCESS) +#define PROCESS_PORT_EVENTS_TIME 400 /* in milliseconds */ + +static GHashTable *_obj_fen_hash = NULL; /* */ +static ulong max_port_events = 512; +static GList *pn_vq; /* the queue of ports which don't have the max objs */ +static GList *pn_fq; /* the queue of ports which have the max objs */ +static GQueue *g_eventq = NULL; +static void (*add_event_cb) (gpointer, fnode_event_t*); + +typedef struct pnode +{ + long ref; /* how many fds are associated to this port */ + int port; + guint port_source_id; +} pnode_t; + +typedef struct { + pnode_t* port; + file_obj_t* fobj; + + gboolean is_active; + gpointer user_data; +} _f; + +static gboolean port_fetch_event_cb (void *arg); +static pnode_t *pnode_new (); +static void pnode_delete (pnode_t *pn); + +gboolean +_is_ported (gpointer f) +{ + _f* fo = g_hash_table_lookup (_obj_fen_hash, f); + + if (fo) { + return fo->is_active; + } + return FALSE; +} + +static gchar* +printevent (const char *pname, int event, const char *tag) +{ + static gchar *event_string = NULL; + GString *str; + + if (event_string) { + g_free(event_string); + } + + str = g_string_new (""); + g_string_printf (str, "[%s] [%-20s]", tag, pname); + if (event & FILE_ACCESS) { + str = g_string_append (str, " ACCESS"); + } + if (event & FILE_MODIFIED) { + str = g_string_append (str, " MODIFIED"); + } + if (event & FILE_ATTRIB) { + str = g_string_append (str, " ATTRIB"); + } + if (event & FILE_DELETE) { + str = g_string_append (str, " DELETE"); + } + if (event & FILE_RENAME_TO) { + str = g_string_append (str, " RENAME_TO"); + } + if (event & FILE_RENAME_FROM) { + str = g_string_append (str, " RENAME_FROM"); + } + if (event & UNMOUNTED) { + str = g_string_append (str, " UNMOUNTED"); + } + if (event & MOUNTEDOVER) { + str = g_string_append (str, " MOUNTEDOVER"); + } + event_string = str->str; + g_string_free (str, FALSE); + return event_string; +} + +static void +port_add_kevent (int e, gpointer f) +{ + fnode_event_t *ev, *tail; + GTimeVal t; + gboolean has_twin = FALSE; + + /* + * Child FILE_DELETE | FILE_RENAME_FROM will trigger parent FILE_MODIFIED. + * FILE_MODIFIED will trigger FILE_ATTRIB. + */ + + if ((e & FILE_ATTRIB) && e != FILE_ATTRIB) { + e ^= FILE_ATTRIB; + has_twin = TRUE; + } + if (e == FILE_RENAME_FROM) { + e = FILE_DELETE; + } + if (e == FILE_RENAME_TO) { + e = FILE_MODIFIED; + } + + switch (e) { + case FILE_DELETE: + case FILE_RENAME_FROM: + case FILE_MODIFIED: + case FILE_ATTRIB: + case UNMOUNTED: + case MOUNTEDOVER: + break; + case FILE_RENAME_TO: + case FILE_ACCESS: + default: + g_assert_not_reached (); + return; + } + + tail = (fnode_event_t*) g_queue_peek_tail (g_eventq); + if (tail) { + if (tail->user_data == f) { + if (tail->e == e) { + tail->has_twin = (has_twin | (tail->has_twin ^ has_twin)); + /* skip the current */ + return; + } else if (e == FILE_MODIFIED && !has_twin + && tail->e == FILE_ATTRIB) { + tail->e = FILE_MODIFIED; + tail->has_twin = TRUE; + return; + } else if (e == FILE_ATTRIB + && tail->e == FILE_MODIFIED && !tail->has_twin) { + tail->has_twin = TRUE; + return; + } + } + } + + if ((ev = _fnode_event_new (e, has_twin, f)) != NULL) { + g_queue_push_tail (g_eventq, ev); + } +} + +static void +port_process_kevents () +{ + fnode_event_t *ev; + + while ((ev = (fnode_event_t*)g_queue_pop_head (g_eventq)) != NULL) { + FK_W ("[%s] 0x%p %s\n", __func__, ev, _event_string (ev->e)); + add_event_cb (ev->user_data, ev); + } +} + +static gboolean +port_fetch_event_cb (void *arg) +{ + pnode_t *pn = (pnode_t *)arg; + _f* fo; + uint_t nget = 0; + port_event_t pe[PE_ALLOC]; + timespec_t timeout; + gpointer f; + gboolean ret = TRUE; + + /* FK_W ("IN <======== %s\n", __func__); */ + G_LOCK (fen_lock); + + memset (&timeout, 0, sizeof (timespec_t)); + do { + nget = 1; + if (port_getn (pn->port, pe, PE_ALLOC, &nget, &timeout) == 0) { + int i; + for (i = 0; i < nget; i++) { + fo = (_f*)pe[i].portev_user; + /* handle event */ + switch (pe[i].portev_source) { + case PORT_SOURCE_FILE: + /* If got FILE_EXCEPTION or add to port failed, + delete the pnode */ + fo->is_active = FALSE; + if (fo->user_data) { + FK_W("%s\n", + printevent(F_NAME(fo), pe[i].portev_events, "RAW")); + port_add_kevent (pe[i].portev_events, fo->user_data); + } else { + /* fnode is deleted */ + goto L_delete; + } + if (pe[i].portev_events & FILE_EXCEPTION) { + g_hash_table_remove (_obj_fen_hash, fo->user_data); + L_delete: + FK_W ("[ FREE_FO ] [0x%p]\n", fo); + pnode_delete (fo->port); + g_free (fo); + } + break; + default: + /* case PORT_SOURCE_TIMER: */ + FK_W ("[kernel] unknown portev_source %d\n", pe[i].portev_source); + } + } + } else { + FK_W ("[kernel] port_getn %s\n", g_strerror (errno)); + nget = 0; + } + } while (nget == PE_ALLOC); + + /* Processing g_eventq */ + port_process_kevents (); + + if (pn->ref == 0) { + pn->port_source_id = 0; + ret = FALSE; + } + G_UNLOCK (fen_lock); + /* FK_W ("OUT ========> %s\n", __func__); */ + return ret; +} + +/* + * ref - 1 if remove a watching file succeeded. + */ +static void +pnode_delete (pnode_t *pn) +{ + g_assert (pn->ref <= max_port_events); + + if (pn->ref == max_port_events) { + FK_W ("PORT : move to visible queue - [pn] 0x%p [ref] %d\n", pn, pn->ref); + pn_fq = g_list_remove (pn_fq, pn); + pn_vq = g_list_prepend (pn_vq, pn); + } + if ((-- pn->ref) == 0) { + /* Should dispatch the source */ + } + FK_W ("%s [pn] 0x%p [ref] %d\n", __func__, pn, pn->ref); +} + +/* + * malloc pnode_t and port_create, start thread at pnode_ref. + * if pnode_new succeeded, the pnode_t will never + * be freed. So pnode_t can be freed only in pnode_new. + * Note pnode_monitor_remove_all can also free pnode_t, but currently no one + * invork it. + */ +static pnode_t * +pnode_new () +{ + pnode_t *pn = NULL; + + if (pn_vq) { + pn = (pnode_t*)pn_vq->data; + g_assert (pn->ref < max_port_events); + } else { + pn = g_new0 (pnode_t, 1); + if (pn != NULL) { + if ((pn->port = port_create ()) >= 0) { + g_assert (g_list_find (pn_vq, pn) == NULL); + pn_vq = g_list_prepend (pn_vq, pn); + } else { + FK_W ("PORT_CREATE %s\n", g_strerror (errno)); + g_free (pn); + pn = NULL; + } + } + } + if (pn) { + FK_W ("%s [pn] 0x%p [ref] %d\n", __func__, pn, pn->ref); + pn->ref++; + if (pn->ref == max_port_events) { + FK_W ("PORT : move to full queue - [pn] 0x%p [ref] %d\n", pn, pn->ref); + pn_vq = g_list_remove (pn_vq, pn); + pn_fq = g_list_prepend (pn_fq, pn); + g_assert (g_list_find (pn_vq, pn) == NULL); + } + /* attach the source */ + if (pn->port_source_id == 0) { + pn->port_source_id = g_timeout_add (PROCESS_PORT_EVENTS_TIME, + port_fetch_event_cb, + (void *)pn); + g_assert (pn->port_source_id > 0); + } + } + + return pn; +} + +/* + * port_add_internal + * + * < private > + * Unsafe, need lock fen_lock. + */ +static gboolean +port_add_internal (file_obj_t* fobj, off_t* len, + gpointer f, gboolean need_stat) +{ + int ret; + struct stat buf; + _f* fo = NULL; + + g_assert (f && fobj); + FK_W ("%s [0x%p] %s\n", __func__, f, fobj->fo_name); + + if ((fo = g_hash_table_lookup (_obj_fen_hash, f)) == NULL) { + fo = g_new0 (_f, 1); + fo->fobj = fobj; + fo->user_data = f; + g_assert (fo); + FK_W ("[ NEW_FO ] [0x%p] %s\n", fo, F_NAME(fo)); + g_hash_table_insert (_obj_fen_hash, f, fo); + } + + if (fo->is_active) { + return TRUE; + } + + if (fo->port == NULL) { + fo->port = pnode_new (); + } + + if (need_stat) { + if (FN_STAT (F_NAME(fo), &buf) != 0) { + FK_W ("LSTAT [%-20s] %s\n", F_NAME(fo), g_strerror (errno)); + goto L_exit; + } + g_assert (len); + fo->fobj->fo_atime = buf.st_atim; + fo->fobj->fo_mtime = buf.st_mtim; + fo->fobj->fo_ctime = buf.st_ctim; + *len = buf.st_size; + } + + if (port_associate (F_PORT(fo), + PORT_SOURCE_FILE, + (uintptr_t)fo->fobj, + FEN_ALL_EVENTS, + (void *)fo) == 0) { + fo->is_active = TRUE; + FK_W ("%s %s\n", "PORT_ASSOCIATE", F_NAME(fo)); + return TRUE; + } else { + FK_W ("PORT_ASSOCIATE [%-20s] %s\n", F_NAME(fo), g_strerror (errno)); + L_exit: + FK_W ("[ FREE_FO ] [0x%p]\n", fo); + g_hash_table_remove (_obj_fen_hash, f); + pnode_delete (fo->port); + g_free (fo); + } + return FALSE; +} + +gboolean +_port_add (file_obj_t* fobj, off_t* len, gpointer f) +{ + return port_add_internal (fobj, len, f, TRUE); +} + +gboolean +_port_add_simple (file_obj_t* fobj, gpointer f) +{ + return port_add_internal (fobj, NULL, f, FALSE); +} + +/* + * port_remove: + * + * < private > + * Unsafe, need lock fen_lock. + */ +void +_port_remove (gpointer f) +{ + _f* fo = NULL; + + FK_W ("%s\n", __func__); + if ((fo = g_hash_table_lookup (_obj_fen_hash, f)) != NULL) { + /* Marked */ + fo->user_data = NULL; + g_hash_table_remove (_obj_fen_hash, f); + + if (port_dissociate (F_PORT(fo), + PORT_SOURCE_FILE, + (uintptr_t)fo->fobj) == 0) { + /* + * Note, we can run foode_delete if dissociating is failed, + * because there may be some pending events (mostly like + * FILE_DELETE) in the port_get. If we delete the foode + * the fnode may be deleted, then port_get will run on an invalid + * address. + */ + FK_W ("[ FREE_FO ] [0x%p]\n", fo); + pnode_delete (fo->port); + g_free (fo); + } else { + FK_W ("PORT_DISSOCIATE [%-20s] %s\n", F_NAME(fo), g_strerror (errno)); + } + } +} + +const gchar * +_event_string (int event) +{ + switch (event) { + case FILE_DELETE: + return "FILE_DELETE"; + case FILE_RENAME_FROM: + return "FILE_RENAME_FROM"; + case FILE_MODIFIED: + return "FILE_MODIFIED"; + case FILE_RENAME_TO: + return "FILE_RENAME_TO"; + case MOUNTEDOVER: + return "MOUNTEDOVER"; + case FILE_ATTRIB: + return "FILE_ATTRIB"; + case UNMOUNTED: + return "UNMOUNTED"; + case FILE_ACCESS: + return "FILE_ACCESS"; + default: + return "EVENT_UNKNOWN"; + } +} + +/* + * Get Solaris resouce values. + * + */ + +extern gboolean +_port_class_init (void (*user_add_event) (gpointer, fnode_event_t*)) +{ + rctlblk_t *rblk; + FK_W ("%s\n", __func__); + if ((rblk = malloc (rctlblk_size ())) == NULL) { + FK_W ("[kernel] rblk malloc %s\n", g_strerror (errno)); + return FALSE; + } + if (getrctl ("process.max-port-events", NULL, rblk, RCTL_FIRST) == -1) { + FK_W ("[kernel] getrctl %s\n", g_strerror (errno)); + free (rblk); + return FALSE; + } else { + max_port_events = rctlblk_get_value(rblk); + FK_W ("[kernel] max_port_events = %u\n", max_port_events); + free (rblk); + } + if ((_obj_fen_hash = g_hash_table_new(g_direct_hash, + g_direct_equal)) == NULL) { + FK_W ("[kernel] fobj hash initializing faild\n"); + return FALSE; + } + if ((g_eventq = g_queue_new ()) == NULL) { + FK_W ("[kernel] FEN global event queue initializing faild\n"); + } + if (user_add_event == NULL) { + return FALSE; + } + add_event_cb = user_add_event; + return TRUE; +} + +fnode_event_t* +_fnode_event_new (int event, gboolean has_twin, gpointer user_data) +{ + fnode_event_t *ev; + + if ((ev = g_new (fnode_event_t, 1)) != NULL) { + g_assert (ev); + ev->e = event; + ev->user_data = user_data; + ev->has_twin = has_twin; + /* Default isn't a pending event. */ + ev->is_pending = FALSE; + } + return ev; +} + +void +_fnode_event_delete (fnode_event_t* ev) +{ + g_free (ev); +} diff --git a/gio/fen/fen-kernel.h b/gio/fen/fen-kernel.h new file mode 100644 index 0000000..af1ab5c --- /dev/null +++ b/gio/fen/fen-kernel.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include +#include +#include + +#ifndef _FEN_KERNEL_H_ +#define _FEN_KERNEL_H_ + +#define FN_STAT lstat + +typedef struct fnode_event +{ + int e; + gboolean has_twin; + gboolean is_pending; + gpointer user_data; + GTimeVal t; +} fnode_event_t; + +gboolean _port_add (file_obj_t* fobj, off_t* len, gpointer f); +gboolean _port_add_simple (file_obj_t* fobj, gpointer f); +void _port_remove (gpointer f); +gboolean _is_ported (gpointer f); + +fnode_event_t* _fnode_event_new (int event, gboolean has_twin, gpointer user_data); +void _fnode_event_delete (fnode_event_t* ev); +const gchar * _event_string (int event); + +extern gboolean _port_class_init (); + +#endif /* _FEN_KERNEL_H_ */ diff --git a/gio/fen/fen-missing.c b/gio/fen/fen-missing.c new file mode 100644 index 0000000..9091587 --- /dev/null +++ b/gio/fen/fen-missing.c @@ -0,0 +1,121 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include +#include "fen-data.h" +#include "fen-missing.h" + +G_LOCK_EXTERN (fen_lock); +#define SCAN_MISSING_INTERVAL 4000 /* in milliseconds */ + +#ifdef GIO_COMPILATION +#define FM_W if (fm_debug_enabled) g_warning +gboolean fm_debug_enabled = FALSE; +#else +#include "gam_error.h" +#define FM_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +/* global data structure for scan missing files */ +static GList *missing_list = NULL; +static guint scan_missing_source_id = 0; + +static gboolean scan_missing_list (gpointer data); + +static gboolean +scan_missing_list (gpointer data) +{ + GList *existing_list = NULL; + GList *idx = NULL; + fdata *f; + gboolean ret = TRUE; + + G_LOCK (fen_lock); + + for (idx = missing_list; idx; idx = idx->next) { + f = (fdata*)idx->data; + + if (_port_add (&f->fobj, &f->len, f)) { + /* TODO - emit CREATE event */ + _fdata_emit_events (f, FN_EVENT_CREATED); + existing_list = g_list_prepend (existing_list, idx); + } + } + + for (idx = existing_list; idx; idx = idx->next) { + missing_list = g_list_remove_link (missing_list, (GList *)idx->data); + g_list_free_1 ((GList *)idx->data); + } + g_list_free (existing_list); + + if (missing_list == NULL) { + scan_missing_source_id = 0; + ret = FALSE; + } + + G_UNLOCK (fen_lock); + return ret; +} + +/** + * missing_add + * + * Unsafe, need lock fen_lock. + */ +void +_missing_add (fdata *f) +{ + GList *idx; + + g_assert (!_is_ported (f)); + + if (g_list_find (missing_list, f) != NULL) { + FM_W ("%s is ALREADY added %s\n", __func__, FN_NAME(f)); + return; + } + FM_W ("%s is added %s\n", __func__, FN_NAME(f)); + + missing_list = g_list_prepend (missing_list, f); + + /* if doesn't scan, then start */ + if (scan_missing_source_id == 0) { + scan_missing_source_id = g_timeout_add (SCAN_MISSING_INTERVAL, + scan_missing_list, + NULL); + g_assert (scan_missing_source_id > 0); + } +} + +/** + * missing_remove + * + * Unsafe, need lock fen_lock. + */ +void +_missing_remove (fdata *f) +{ + FM_W ("%s %s\n", __func__, FN_NAME(f)); + missing_list = g_list_remove (missing_list, f); +} diff --git a/gio/fen/fen-missing.h b/gio/fen/fen-missing.h new file mode 100644 index 0000000..d431a00 --- /dev/null +++ b/gio/fen/fen-missing.h @@ -0,0 +1,38 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#ifndef __GAM_FEN_H__ +#define __GAM_FEN_H__ + +#include "fen-data.h" + +G_BEGIN_DECLS + +extern void _missing_add (fdata *f); +extern void _missing_remove (fdata *f); + +G_END_DECLS + +#endif /* __GAM_FEN_H__ */ + diff --git a/gio/fen/fen-node.c b/gio/fen/fen-node.c new file mode 100644 index 0000000..a8fbf69 --- /dev/null +++ b/gio/fen/fen-node.c @@ -0,0 +1,466 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include +#include +#include +#include "fen-node.h" +#include "fen-dump.h" + +#define NODE_STAT(n) (((node_t*)(n))->stat) + +struct _dnode { + gchar* filename; + node_op_t* op; + GTimeVal tv; +}; + +#ifdef GIO_COMPILATION +#define FN_W if (fn_debug_enabled) g_warning +static gboolean fn_debug_enabled = FALSE; +#else +#include "gam_error.h" +#define FN_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_LOCK_EXTERN (fen_lock); +#define PROCESS_DELETING_INTERVAL 900 /* in second */ + +static node_t* _head = NULL; +static GList *deleting_nodes = NULL; +static guint deleting_nodes_id = 0; + +static node_t* node_new (node_t* parent, const gchar* basename); +static void node_delete (node_t* parent); +static gboolean remove_node_internal (node_t* node, node_op_t* op); +static void children_add (node_t *p, node_t *f); +static void children_remove (node_t *p, node_t *f); +static guint children_foreach_remove (node_t *f, GHRFunc func, gpointer user_data); +static void children_foreach (node_t *f, GHFunc func, gpointer user_data); +static gboolean children_remove_cb (gpointer key, + gpointer value, + gpointer user_data); + +static struct _dnode* +_dnode_new (const gchar* filename, node_op_t* op) +{ + struct _dnode* d; + + g_assert (op); + if ((d = g_new (struct _dnode, 1)) != NULL) { + d->filename = g_strdup (filename); + d->op = g_memdup (op, sizeof (node_op_t)); + g_assert (d->op); + g_get_current_time (&d->tv); + g_time_val_add (&d->tv, PROCESS_DELETING_INTERVAL); + } + return d; +} + +static void +_dnode_free (struct _dnode* d) +{ + g_assert (d); + g_free (d->filename); + g_free (d->op); + g_free (d); +} + +static gboolean +g_timeval_lt (GTimeVal *val1, GTimeVal *val2) +{ + if (val1->tv_sec < val2->tv_sec) + return TRUE; + + if (val1->tv_sec > val2->tv_sec) + return FALSE; + + /* val1->tv_sec == val2->tv_sec */ + if (val1->tv_usec < val2->tv_usec) + return TRUE; + + return FALSE; +} + +static gboolean +scan_deleting_nodes (gpointer data) +{ + struct _dnode* d; + GTimeVal tv_now; + GList* i; + GList* deleted_list = NULL; + gboolean ret = TRUE; + node_t* node; + + g_get_current_time (&tv_now); + + if (G_TRYLOCK (fen_lock)) { + for (i = deleting_nodes; i; i = i->next) { + d = (struct _dnode*)i->data; + /* Time to free, try only once */ + if (g_timeval_lt (&d->tv, &tv_now)) { + if ((node = _find_node (d->filename)) != NULL) { + remove_node_internal (node, d->op); + } + _dnode_free (d); + deleted_list = g_list_prepend (deleted_list, i); + } + } + + for (i = deleted_list; i; i = i->next) { + deleting_nodes = g_list_remove_link (deleting_nodes, + (GList *)i->data); + g_list_free_1 ((GList *)i->data); + } + g_list_free (deleted_list); + + if (deleting_nodes == NULL) { + deleting_nodes_id = 0; + ret = FALSE; + } + G_UNLOCK (fen_lock); + } + return ret; +} + +gpointer +_node_get_data (node_t* node) +{ + g_assert (node); + return node->user_data; +} + +gpointer +_node_set_data (node_t* node, gpointer user_data) +{ + gpointer data = node->user_data; + g_assert (node); + node->user_data = user_data; + return data; +} + +void +_travel_nodes (node_t* node, node_op_t* op) +{ + GList* children; + GList* i; + + if (node) { + if (op && op->hit) { + op->hit (node, op->user_data); + } + } + children = g_hash_table_get_values (node->children); + if (children) { + for (i = children; i; i = i->next) { + _travel_nodes (i->data, op); + } + g_list_free (children); + } +} + +static node_t* +find_node_internal (node_t* node, const gchar* filename, node_op_t* op) +{ + gchar* str; + gchar* token; + gchar* lasts; + node_t* parent; + node_t* child; + + g_assert (filename && filename[0] == '/'); + g_assert (node); + + parent = node; + str = g_strdup (filename + strlen (NODE_NAME(parent))); + + if ((token = strtok_r (str, G_DIR_SEPARATOR_S, &lasts)) != NULL) { + do { + FN_W ("%s %s + %s\n", __func__, NODE_NAME(parent), token); + child = _children_find (parent, token); + if (child) { + parent = child; + } else { + if (op && op->add_missing) { + child = op->add_missing (parent, op->user_data); + goto L_hit; + } + break; + } + } while ((token = strtok_r (NULL, G_DIR_SEPARATOR_S, &lasts)) != NULL); + } else { + /* It's the head */ + g_assert (parent == _head); + child = _head; + } + + if (token == NULL && child) { + L_hit: + if (op && op->hit) { + op->hit (child, op->user_data); + } + } + g_free (str); + return child; +} + +node_t* +_find_node (const gchar *filename) +{ + return find_node_internal (_head, filename, NULL); +} + +node_t* +_find_node_full (const gchar* filename, node_op_t* op) +{ + return find_node_internal (_head, filename, op); +} + +node_t* +_add_node (node_t* parent, const gchar* filename) +{ + gchar* str; + gchar* token; + gchar* lasts; + node_t* child = NULL; + + g_assert (_head); + g_assert (filename && filename[0] == '/'); + + if (parent == NULL) { + parent = _head; + } + + str = g_strdup (filename + strlen (NODE_NAME(parent))); + + if ((token = strtok_r (str, G_DIR_SEPARATOR_S, &lasts)) != NULL) { + do { + FN_W ("%s %s + %s\n", __func__, NODE_NAME(parent), token); + child = node_new (parent, token); + if (child) { + children_add (parent, child); + parent = child; + } else { + break; + } + } while ((token = strtok_r (NULL, G_DIR_SEPARATOR_S, &lasts)) != NULL); + } + g_free (str); + if (token == NULL) { + return child; + } else { + return NULL; + } +} + +/* + * delete recursively + */ +static gboolean +remove_children (node_t* node, node_op_t* op) +{ + FN_W ("%s 0x%p %s\n", __func__, node, NODE_NAME(node)); + if (_children_num (node) > 0) { + children_foreach_remove (node, children_remove_cb, + (gpointer)op); + } + if (_children_num (node) == 0) { + return TRUE; + } + return FALSE; +} + +static gboolean +remove_node_internal (node_t* node, node_op_t* op) +{ + node_t* parent = NULL; + /* + * If the parent is passive and doesn't have children, delete it. + * NOTE node_delete_deep is a depth first delete recursively. + * Top node is deleted in node_cancel_sub + */ + g_assert (node); + g_assert (op && op->pre_del); + if (node != _head) { + if (remove_children (node, op)) { + if (node->user_data) { + if (!op->pre_del (node, op->user_data)) { + return FALSE; + } + } + parent = node->parent; + children_remove (parent, node); + node_delete (node); + if (_children_num (parent) == 0) { + remove_node_internal (parent, op); + } + return TRUE; + } + return FALSE; + } + return TRUE; +} + +void +_pending_remove_node (node_t* node, node_op_t* op) +{ + struct _dnode* d; + GList* l; + + for (l = deleting_nodes; l; l=l->next) { + d = (struct _dnode*) l->data; + if (g_ascii_strcasecmp (d->filename, NODE_NAME(node)) == 0) { + return; + } + } + + d = _dnode_new (NODE_NAME(node), op); + g_assert (d); + deleting_nodes = g_list_prepend (deleting_nodes, d); + if (deleting_nodes_id == 0) { + deleting_nodes_id = g_timeout_add_seconds (PROCESS_DELETING_INTERVAL, + scan_deleting_nodes, + NULL); + g_assert (deleting_nodes_id > 0); + } +} + +void +_remove_node (node_t* node, node_op_t* op) +{ + remove_node_internal (node, op); +} + +static node_t* +node_new (node_t* parent, const gchar* basename) +{ + node_t *f = NULL; + + g_assert (basename && basename[0]); + if ((f = g_new0 (node_t, 1)) != NULL) { + if (parent) { + f->basename = g_strdup (basename); + f->filename = g_build_filename (G_DIR_SEPARATOR_S, + NODE_NAME(parent), basename, NULL); + } else { + f->basename = g_strdup (basename); + f->filename = g_strdup (basename); + } + f->children = g_hash_table_new_full (g_str_hash, g_str_equal, + NULL, (GDestroyNotify)node_delete); + FN_W ("[ %s ] 0x%p %s\n", __func__, f, NODE_NAME(f)); + } + return f; +} + +static void +node_delete (node_t *f) +{ + FN_W ("[ %s ] 0x%p %s\n", __func__, f, NODE_NAME(f)); + g_assert (g_hash_table_size (f->children) == 0); + g_assert (f->user_data == NULL); + + g_hash_table_unref (f->children); + g_free (f->basename); + g_free (f->filename); + g_free (f); +} + +static void +children_add (node_t *p, node_t *f) +{ + FN_W ("%s [p] %8s [c] %8s\n", __func__, p->basename, f->basename); + g_hash_table_insert (p->children, f->basename, f); + f->parent = p; +} + +static void +children_remove (node_t *p, node_t *f) +{ + FN_W ("%s [p] %8s [c] %8s\n", __func__, p->basename, f->basename); + g_hash_table_steal (p->children, f->basename); + f->parent = NULL; +} + +guint +_children_num (node_t *f) +{ + return g_hash_table_size (f->children); +} + +node_t * +_children_find (node_t *f, const gchar *basename) +{ + return (node_t *) g_hash_table_lookup (f->children, (gpointer)basename); +} + +/* + * depth first delete recursively + */ +static gboolean +children_remove_cb (gpointer key, + gpointer value, + gpointer user_data) +{ + node_t* f = (node_t*)value; + node_op_t* op = (node_op_t*) user_data; + + g_assert (f->parent); + + FN_W ("%s [p] %8s [c] %8s\n", __func__, f->parent->basename, f->basename); + if (remove_children (f, op)) { + if (f->user_data != NULL) { + return op->pre_del (f, op->user_data); + } + return TRUE; + } + return FALSE; +} + +static guint +children_foreach_remove (node_t *f, GHRFunc func, gpointer user_data) +{ + g_assert (f); + + return g_hash_table_foreach_remove (f->children, func, user_data); +} + +static void +children_foreach (node_t *f, GHFunc func, gpointer user_data) +{ + g_assert (f); + + g_hash_table_foreach (f->children, func, user_data); +} + +gboolean +_node_class_init () +{ + FN_W ("%s\n", __func__); + if (_head == NULL) { + _head = node_new (NULL, G_DIR_SEPARATOR_S); + } + return _head != NULL; +} diff --git a/gio/fen/fen-node.h b/gio/fen/fen-node.h new file mode 100644 index 0000000..f2ef1ea --- /dev/null +++ b/gio/fen/fen-node.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#ifndef _FEN_NODE_H_ +#define _FEN_NODE_H_ + +typedef struct node node_t; + +struct node +{ + gchar *filename; + gchar *basename; + gint stat; + + /* the parent and children of node */ + node_t *parent; + GHashTable *children; /* children in basename */ + + gpointer user_data; +}; + +#define IS_TOPNODE(fp) (((node_t *)(fp))->parent == NULL) +#define NODE_NAME(fp) (((node_t *)(fp))->filename) + +typedef struct node_op +{ + /* find */ + void (*hit) (node_t* node, gpointer user_data); + node_t* (*add_missing) (node_t* parent, gpointer user_data); + /* delete */ + gboolean (*pre_del) (node_t* node, gpointer user_data); + /* data */ + gpointer user_data; +} node_op_t; + +node_t* _add_node (node_t* parent, const gchar* filename); +void _remove_node (node_t* node, node_op_t* op); +void _pending_remove_node (node_t* node, node_op_t* op); + +void _travel_nodes (node_t* node, node_op_t* op); +node_t* _find_node_full (const gchar* filename, node_op_t* op); +node_t* _find_node (const gchar *filename); + +node_t* _children_find (node_t *f, const gchar *basename); +guint _children_num (node_t *f); + +gpointer _node_get_data (node_t* node); +gpointer _node_set_data (node_t* node, gpointer user_data); + +gboolean _node_class_init (); + +#endif /* _FEN_NODE_H_ */ diff --git a/gio/fen/fen-sub.c b/gio/fen/fen-sub.c new file mode 100644 index 0000000..780a825 --- /dev/null +++ b/gio/fen/fen-sub.c @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include "config.h" +#include "fen-sub.h" + +fen_sub* +_fen_sub_new (gpointer udata, gboolean is_mondir) +{ + fen_sub *sub; + sub = g_new (fen_sub, 1); + sub->user_data = udata; + sub->is_mondir = is_mondir; + return sub; +} + +void +_fen_sub_delete (fen_sub *sub) +{ + g_free (sub); +} diff --git a/gio/fen/fen-sub.h b/gio/fen/fen-sub.h new file mode 100644 index 0000000..ad232bc --- /dev/null +++ b/gio/fen/fen-sub.h @@ -0,0 +1,39 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Lin Ma + */ + +#include + +#ifndef _FEN_SUB_H_ +#define _FEN_SUB_H_ + +typedef struct _fen_sub +{ + gpointer user_data; + gboolean is_mondir; +} fen_sub; + +fen_sub* _fen_sub_new (gpointer udata, gboolean is_mondir); +void _fen_sub_delete (fen_sub *sub); + +#endif _FEN_SUB_H_ diff --git a/gio/fen/gfendirectorymonitor.c b/gio/fen/gfendirectorymonitor.c new file mode 100644 index 0000000..ba79713 --- /dev/null +++ b/gio/fen/gfendirectorymonitor.c @@ -0,0 +1,150 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + * Lin Ma + */ + +#include "config.h" + +#include "gfendirectorymonitor.h" +#include "giomodule.h" + +#include "fen-helper.h" + +#include "gioalias.h" + +struct _GFenDirectoryMonitor +{ + GLocalDirectoryMonitor parent_instance; + gboolean cancelled; + fen_sub* sub; +}; + +static gboolean g_fen_directory_monitor_cancel (GFileMonitor* monitor); + +#define g_fen_directory_monitor_get_type _g_fen_directory_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GFenDirectoryMonitor, g_fen_directory_monitor, G_TYPE_LOCAL_DIRECTORY_MONITOR, + g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "fen", + 20)) + +static void +g_fen_directory_monitor_finalize (GObject *object) +{ + GFenDirectoryMonitor *self = G_FEN_DIRECTORY_MONITOR (object); + + if (self->sub) { + _fen_remove (G_LOCAL_DIRECTORY_MONITOR (self)->dirname, self->sub, TRUE); + _fen_sub_delete (self->sub); + self->sub = NULL; + } + + if (G_OBJECT_CLASS (g_fen_directory_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_fen_directory_monitor_parent_class)->finalize) (object); +} + +static GObject * +g_fen_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GFenDirectoryMonitorClass *klass; + GObjectClass *parent_class; + GFenDirectoryMonitor *self; + const gchar *dirname = NULL; + + klass = G_FEN_DIRECTORY_MONITOR_CLASS (g_type_class_peek (G_TYPE_FEN_DIRECTORY_MONITOR)); + parent_class = g_fen_directory_monitor_parent_class; + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + self = G_FEN_DIRECTORY_MONITOR (obj); + + dirname = G_LOCAL_DIRECTORY_MONITOR (self)->dirname; + g_assert (dirname != NULL); + + /* Will never fail as is_supported() should be called before instanciating + * anyway */ + if (!_fen_init ()) + g_assert_not_reached (); + + /* FIXME: what to do about errors here? we can't return NULL or another + * kind of error and an assertion is probably too hard */ + self->sub = _fen_sub_new (self, TRUE); + g_assert (self->sub); + + _fen_add (dirname, self->sub, TRUE); + + return obj; +} + +static gboolean +g_fen_directory_monitor_is_supported (void) +{ + return _fen_init (); +} + +static void +g_fen_directory_monitor_class_init (GFenDirectoryMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *directory_monitor_class = G_FILE_MONITOR_CLASS (klass); + GLocalDirectoryMonitorClass *local_directory_monitor_class = G_LOCAL_DIRECTORY_MONITOR_CLASS (klass); + + gobject_class->finalize = g_fen_directory_monitor_finalize; + gobject_class->constructor = g_fen_directory_monitor_constructor; + directory_monitor_class->cancel = g_fen_directory_monitor_cancel; + + local_directory_monitor_class->mount_notify = TRUE; + local_directory_monitor_class->is_supported = g_fen_directory_monitor_is_supported; +} + +static void +g_fen_directory_monitor_init (GFenDirectoryMonitor* monitor) +{ +} + +static gboolean +g_fen_directory_monitor_cancel (GFileMonitor* monitor) +{ + GFenDirectoryMonitor *self = G_FEN_DIRECTORY_MONITOR (monitor); + + if (self->sub) { + _fen_remove (G_LOCAL_DIRECTORY_MONITOR (self)->dirname, self->sub, TRUE); + _fen_sub_delete (self->sub); + self->sub = NULL; + } + + if (G_FILE_MONITOR_CLASS (g_fen_directory_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_fen_directory_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} + diff --git a/gio/fen/gfendirectorymonitor.h b/gio/fen/gfendirectorymonitor.h new file mode 100644 index 0000000..c22998c --- /dev/null +++ b/gio/fen/gfendirectorymonitor.h @@ -0,0 +1,55 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __G_FEN_DIRECTORY_MONITOR_H__ +#define __G_FEN_DIRECTORY_MONITOR_H__ + +#include +#include +#include "glocaldirectorymonitor.h" +#include "giomodule.h" + +G_BEGIN_DECLS + +#define G_TYPE_FEN_DIRECTORY_MONITOR (_g_fen_directory_monitor_get_type ()) +#define G_FEN_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FEN_DIRECTORY_MONITOR, GFenDirectoryMonitor)) +#define G_FEN_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_FEN_DIRECTORY_MONITOR, GFenDirectoryMonitorClass)) +#define G_IS_FEN_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FEN_DIRECTORY_MONITOR)) +#define G_IS_FEN_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FEN_DIRECTORY_MONITOR)) + +typedef struct _GFenDirectoryMonitor GFenDirectoryMonitor; +typedef struct _GFenDirectoryMonitorClass GFenDirectoryMonitorClass; + +struct _GFenDirectoryMonitorClass { + GLocalDirectoryMonitorClass parent_class; +}; + +GType _g_fen_directory_monitor_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_FEN_DIRECTORY_MONITOR_H__ */ diff --git a/gio/fen/gfenfilemonitor.c b/gio/fen/gfenfilemonitor.c new file mode 100644 index 0000000..f075388 --- /dev/null +++ b/gio/fen/gfenfilemonitor.c @@ -0,0 +1,149 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * Copyright (C) 2008 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + * Lin Ma + */ + +#include "config.h" + +#include "gfenfilemonitor.h" +#include + +#include "fen-helper.h" + +#include "gioalias.h" + +struct _GFenFileMonitor +{ + GLocalFileMonitor parent_instance; + fen_sub* sub; +}; + +static gboolean g_fen_file_monitor_cancel (GFileMonitor* monitor); + +#define g_fen_file_monitor_get_type _g_fen_file_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GFenFileMonitor, g_fen_file_monitor, G_TYPE_LOCAL_FILE_MONITOR, + g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "fen", + 20)) + +static void +g_fen_file_monitor_finalize (GObject *object) +{ + GFenFileMonitor *self = G_FEN_FILE_MONITOR (object); + + if (self->sub) { + _fen_remove (G_LOCAL_FILE_MONITOR (self)->filename, self->sub, FALSE); + _fen_sub_delete (self->sub); + self->sub = NULL; + } + + if (G_OBJECT_CLASS (g_fen_file_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_fen_file_monitor_parent_class)->finalize) (object); +} + +static GObject * +g_fen_file_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GFenFileMonitorClass *klass; + GObjectClass *parent_class; + GFenFileMonitor *self; + const gchar *filename = NULL; + + klass = G_FEN_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_FEN_FILE_MONITOR)); + parent_class = g_fen_file_monitor_parent_class; + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + self = G_FEN_FILE_MONITOR (obj); + + filename = G_LOCAL_FILE_MONITOR (obj)->filename; + + g_assert (filename != NULL); + + /* Will never fail as is_supported() should be called before instanciating + * anyway */ + if (!_fen_init ()) + g_assert_not_reached (); + + /* FIXME: what to do about errors here? we can't return NULL or another + * kind of error and an assertion is probably too hard */ + self->sub = _fen_sub_new (self, FALSE); + g_assert (self->sub); + + _fen_add (filename, self->sub, FALSE); + + return obj; +} + +static gboolean +g_fen_file_monitor_is_supported (void) +{ + return _fen_init (); +} + +static void +g_fen_file_monitor_class_init (GFenFileMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); + GLocalFileMonitorClass *local_file_monitor_class = G_LOCAL_FILE_MONITOR_CLASS (klass); + + gobject_class->finalize = g_fen_file_monitor_finalize; + gobject_class->constructor = g_fen_file_monitor_constructor; + file_monitor_class->cancel = g_fen_file_monitor_cancel; + + local_file_monitor_class->is_supported = g_fen_file_monitor_is_supported; +} + +static void +g_fen_file_monitor_init (GFenFileMonitor* monitor) +{ +} + +static gboolean +g_fen_file_monitor_cancel (GFileMonitor* monitor) +{ + GFenFileMonitor *self = G_FEN_FILE_MONITOR (monitor); + + if (self->sub) { + _fen_remove (G_LOCAL_FILE_MONITOR (self)->filename, self->sub, FALSE); + _fen_sub_delete (self->sub); + self->sub = NULL; + } + + if (G_FILE_MONITOR_CLASS (g_fen_file_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_fen_file_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} + diff --git a/gio/fen/gfenfilemonitor.h b/gio/fen/gfenfilemonitor.h new file mode 100644 index 0000000..e8b2e6a --- /dev/null +++ b/gio/fen/gfenfilemonitor.h @@ -0,0 +1,56 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __G_FEN_FILE_MONITOR_H__ +#define __G_FEN_FILE_MONITOR_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_FEN_FILE_MONITOR (_g_fen_file_monitor_get_type ()) +#define G_FEN_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FEN_FILE_MONITOR, GFenFileMonitor)) +#define G_FEN_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_FEN_FILE_MONITOR, GFenFileMonitorClass)) +#define G_IS_FEN_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FEN_FILE_MONITOR)) +#define G_IS_FEN_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FEN_FILE_MONITOR)) + +typedef struct _GFenFileMonitor GFenFileMonitor; +typedef struct _GFenFileMonitorClass GFenFileMonitorClass; + +struct _GFenFileMonitorClass { + GLocalFileMonitorClass parent_class; +}; + +GType _g_fen_file_monitor_get_type (void); + +G_END_DECLS + +#endif /* __G_FEN_FILE_MONITOR_H__ */ diff --git a/gio/gappinfo.c b/gio/gappinfo.c new file mode 100644 index 0000000..6feec82 --- /dev/null +++ b/gio/gappinfo.c @@ -0,0 +1,814 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gappinfo.h" +#include "glibintl.h" +#include +#include + +#include "gioalias.h" + +/** + * SECTION:gappinfo + * @short_description: Application information and launch contexts + * @include: gio/gio.h + * + * #GAppInfo and #GAppLaunchContext are used for describing and launching + * applications installed on the system. + * + * As of GLib 2.20, URIs will always be converted to POSIX paths + * (using g_file_get_path()) when using g_app_info_launch() even if + * the application requested an URI and not a POSIX path. For example + * for an desktop-file based application with Exec key totem + * %%U and a single URI, + * sftp://foo/file.avi, then + * /home/user/.gvfs/sftp on foo/file.avi will be + * passed. This will only work if a set of suitable GIO extensions + * (such as gvfs 2.26 compiled with FUSE support), is available and + * operational; if this is not the case, the URI will be passed + * unmodified to the application. Some URIs, such as + * mailto:, of course cannot be mapped to a POSIX + * path (in gvfs there's no FUSE mount for it); such URIs will be + * passed unmodified to the application. + * + * Specifically for gvfs 2.26 and later, the POSIX URI will be mapped + * back to the GIO URI in the #GFile constructors (since gvfs + * implements the #GVfs extension point). As such, if the application + * needs to examine the URI, it needs to use g_file_get_uri() or + * similar on #GFile. In other words, an application cannot assume + * that the URI passed to e.g. g_file_new_for_commandline_arg() is + * equal to the result of g_file_get_uri(). The following snippet + * illustrates this: + * + * + * GFile *f; + * char *uri; + * + * file = g_file_new_for_commandline_arg (uri_from_commandline); + * + * uri = g_file_get_uri (file); + * strcmp (uri, uri_from_commandline) == 0; // FALSE + * g_free (uri); + * + * if (g_file_has_uri_scheme (file, "cdda")) + * { + * // do something special with uri + * } + * g_object_unref (file); + * + * + * This code will work when both cdda://sr0/Track + * 1.wav and /home/user/.gvfs/cdda on sr0/Track + * 1.wav is passed to the application. It should be noted + * that it's generally not safe for applications to rely on the format + * of a particular URIs. Different launcher applications (e.g. file + * managers) may have different ideas of what a given URI means. + * + **/ + +typedef GAppInfoIface GAppInfoInterface; +G_DEFINE_INTERFACE (GAppInfo, g_app_info, G_TYPE_OBJECT) + +static void +g_app_info_default_init (GAppInfoInterface *iface) +{ +} + + +/** + * g_app_info_dup: + * @appinfo: a #GAppInfo. + * + * Creates a duplicate of a #GAppInfo. + * + * Returns: a duplicate of @appinfo. + **/ +GAppInfo * +g_app_info_dup (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->dup) (appinfo); +} + +/** + * g_app_info_equal: + * @appinfo1: the first #GAppInfo. + * @appinfo2: the second #GAppInfo. + * + * Checks if two #GAppInfos are equal. + * + * Returns: %TRUE if @appinfo1 is equal to @appinfo2. %FALSE otherwise. + **/ +gboolean +g_app_info_equal (GAppInfo *appinfo1, + GAppInfo *appinfo2) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo1), FALSE); + g_return_val_if_fail (G_IS_APP_INFO (appinfo2), FALSE); + + if (G_TYPE_FROM_INSTANCE (appinfo1) != G_TYPE_FROM_INSTANCE (appinfo2)) + return FALSE; + + iface = G_APP_INFO_GET_IFACE (appinfo1); + + return (* iface->equal) (appinfo1, appinfo2); +} + +/** + * g_app_info_get_id: + * @appinfo: a #GAppInfo. + * + * Gets the ID of an application. An id is a string that + * identifies the application. The exact format of the id is + * platform dependent. For instance, on Unix this is the + * desktop file id from the xdg menu specification. + * + * Note that the returned ID may be %NULL, depending on how + * the @appinfo has been constructed. + * + * Returns: a string containing the application's ID. + **/ +const char * +g_app_info_get_id (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->get_id) (appinfo); +} + +/** + * g_app_info_get_name: + * @appinfo: a #GAppInfo. + * + * Gets the installed name of the application. + * + * Returns: the name of the application for @appinfo. + **/ +const char * +g_app_info_get_name (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->get_name) (appinfo); +} + +/** + * g_app_info_get_display_name: + * @appinfo: a #GAppInfo. + * + * Gets the display name of the application. The display name is often more + * descriptive to the user than the name itself. + * + * Returns: the display name of the application for @appinfo, or the name if + * no display name is available. + * + * Since: 2.24 + **/ +const char * +g_app_info_get_display_name (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->get_display_name == NULL) + return (* iface->get_name) (appinfo); + + return (* iface->get_display_name) (appinfo); +} + +/** + * g_app_info_get_description: + * @appinfo: a #GAppInfo. + * + * Gets a human-readable description of an installed application. + * + * Returns: a string containing a description of the + * application @appinfo, or %NULL if none. + **/ +const char * +g_app_info_get_description (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->get_description) (appinfo); +} + +/** + * g_app_info_get_executable: + * @appinfo: a #GAppInfo + * + * Gets the executable's name for the installed application. + * + * Returns: a string containing the @appinfo's application + * binaries name + **/ +const char * +g_app_info_get_executable (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->get_executable) (appinfo); +} + + +/** + * g_app_info_get_commandline: + * @appinfo: a #GAppInfo + * + * Gets the commandline with which the application will be + * started. + * + * Returns: a string containing the @appinfo's commandline, + * or %NULL if this information is not available + * + * Since: 2.20 + **/ +const char * +g_app_info_get_commandline (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->get_commandline) + return (* iface->get_commandline) (appinfo); + + return NULL; +} + +/** + * g_app_info_set_as_default_for_type: + * @appinfo: a #GAppInfo. + * @content_type: the content type. + * @error: a #GError. + * + * Sets the application as the default handler for a given type. + * + * Returns: %TRUE on success, %FALSE on error. + **/ +gboolean +g_app_info_set_as_default_for_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + g_return_val_if_fail (content_type != NULL, FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->set_as_default_for_type) (appinfo, content_type, error); +} + + +/** + * g_app_info_set_as_default_for_extension: + * @appinfo: a #GAppInfo. + * @extension: a string containing the file extension (without the dot). + * @error: a #GError. + * + * Sets the application as the default handler for the given file extension. + * + * Returns: %TRUE on success, %FALSE on error. + **/ +gboolean +g_app_info_set_as_default_for_extension (GAppInfo *appinfo, + const char *extension, + GError **error) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + g_return_val_if_fail (extension != NULL, FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->set_as_default_for_extension) + return (* iface->set_as_default_for_extension) (appinfo, extension, error); + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "g_app_info_set_as_default_for_extension not supported yet"); + return FALSE; +} + + +/** + * g_app_info_add_supports_type: + * @appinfo: a #GAppInfo. + * @content_type: a string. + * @error: a #GError. + * + * Adds a content type to the application information to indicate the + * application is capable of opening files with the given content type. + * + * Returns: %TRUE on success, %FALSE on error. + **/ +gboolean +g_app_info_add_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + g_return_val_if_fail (content_type != NULL, FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->add_supports_type) + return (* iface->add_supports_type) (appinfo, content_type, error); + + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + "g_app_info_add_supports_type not supported yet"); + + return FALSE; +} + + +/** + * g_app_info_can_remove_supports_type: + * @appinfo: a #GAppInfo. + * + * Checks if a supported content type can be removed from an application. + * + * Returns: %TRUE if it is possible to remove supported + * content types from a given @appinfo, %FALSE if not. + **/ +gboolean +g_app_info_can_remove_supports_type (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->can_remove_supports_type) + return (* iface->can_remove_supports_type) (appinfo); + + return FALSE; +} + + +/** + * g_app_info_remove_supports_type: + * @appinfo: a #GAppInfo. + * @content_type: a string. + * @error: a #GError. + * + * Removes a supported type from an application, if possible. + * + * Returns: %TRUE on success, %FALSE on error. + **/ +gboolean +g_app_info_remove_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + g_return_val_if_fail (content_type != NULL, FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->remove_supports_type) + return (* iface->remove_supports_type) (appinfo, content_type, error); + + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + "g_app_info_remove_supports_type not supported yet"); + + return FALSE; +} + + +/** + * g_app_info_get_icon: + * @appinfo: a #GAppInfo. + * + * Gets the icon for the application. + * + * Returns: the default #GIcon for @appinfo. + **/ +GIcon * +g_app_info_get_icon (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->get_icon) (appinfo); +} + + +/** + * g_app_info_launch: + * @appinfo: a #GAppInfo + * @files: a #GList of #GFile objects + * @launch_context: a #GAppLaunchContext or %NULL + * @error: a #GError + * + * Launches the application. Passes @files to the launched application + * as arguments, using the optional @launch_context to get information + * about the details of the launcher (like what screen it is on). + * On error, @error will be set accordingly. + * + * To lauch the application without arguments pass a %NULL @files list. + * + * Note that even if the launch is successful the application launched + * can fail to start if it runs into problems during startup. There is + * no way to detect this. + * + * Some URIs can be changed when passed through a GFile (for instance + * unsupported uris with strange formats like mailto:), so if you have + * a textual uri you want to pass in as argument, consider using + * g_app_info_launch_uris() instead. + * + * Returns: %TRUE on successful launch, %FALSE otherwise. + **/ +gboolean +g_app_info_launch (GAppInfo *appinfo, + GList *files, + GAppLaunchContext *launch_context, + GError **error) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->launch) (appinfo, files, launch_context, error); +} + + +/** + * g_app_info_supports_uris: + * @appinfo: a #GAppInfo. + * + * Checks if the application supports reading files and directories from URIs. + * + * Returns: %TRUE if the @appinfo supports URIs. + **/ +gboolean +g_app_info_supports_uris (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->supports_uris) (appinfo); +} + + +/** + * g_app_info_supports_files: + * @appinfo: a #GAppInfo. + * + * Checks if the application accepts files as arguments. + * + * Returns: %TRUE if the @appinfo supports files. + **/ +gboolean +g_app_info_supports_files (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->supports_files) (appinfo); +} + + +/** + * g_app_info_launch_uris: + * @appinfo: a #GAppInfo + * @uris: a #GList containing URIs to launch. + * @launch_context: a #GAppLaunchContext or %NULL + * @error: a #GError + * + * Launches the application. Passes @uris to the launched application + * as arguments, using the optional @launch_context to get information + * about the details of the launcher (like what screen it is on). + * On error, @error will be set accordingly. + * + * To lauch the application without arguments pass a %NULL @uris list. + * + * Note that even if the launch is successful the application launched + * can fail to start if it runs into problems during startup. There is + * no way to detect this. + * + * Returns: %TRUE on successful launch, %FALSE otherwise. + **/ +gboolean +g_app_info_launch_uris (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->launch_uris) (appinfo, uris, launch_context, error); +} + + +/** + * g_app_info_should_show: + * @appinfo: a #GAppInfo. + * + * Checks if the application info should be shown in menus that + * list available applications. + * + * Returns: %TRUE if the @appinfo should be shown, %FALSE otherwise. + **/ +gboolean +g_app_info_should_show (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + return (* iface->should_show) (appinfo); +} + +/** + * g_app_info_launch_default_for_uri: + * @uri: the uri to show + * @launch_context: an optional #GAppLaunchContext. + * @error: a #GError. + * + * Utility function that launches the default application + * registered to handle the specified uri. Synchronous I/O + * is done on the uri to detect the type of the file if + * required. + * + * Returns: %TRUE on success, %FALSE on error. + **/ +gboolean +g_app_info_launch_default_for_uri (const char *uri, + GAppLaunchContext *launch_context, + GError **error) +{ + GAppInfo *app_info; + GFile *file; + GList l; + gboolean res; + + file = g_file_new_for_uri (uri); + app_info = g_file_query_default_handler (file, NULL, error); + g_object_unref (file); + if (app_info == NULL) + return FALSE; + + /* Use the uri, not the GFile, as the GFile roundtrip may + * affect the uri which we don't want (for instance for a + * mailto: uri). + */ + l.data = (char *)uri; + l.next = l.prev = NULL; + res = g_app_info_launch_uris (app_info, &l, + launch_context, error); + + g_object_unref (app_info); + + return res; +} + +/** + * g_app_info_can_delete: + * @appinfo: a #GAppInfo + * + * Obtains the information whether the #GAppInfo can be deleted. + * See g_app_info_delete(). + * + * Returns: %TRUE if @appinfo can be deleted + * + * Since: 2.20 + */ +gboolean +g_app_info_can_delete (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->can_delete) + return (* iface->can_delete) (appinfo); + + return FALSE; +} + + +/** + * g_app_info_delete: + * @appinfo: a #GAppInfo + * + * Tries to delete a #GAppInfo. + * + * On some platforms, there may be a difference between user-defined + * #GAppInfos which can be deleted, and system-wide ones which + * cannot. See g_app_info_can_delete(). + * + * Returns: %TRUE if @appinfo has been deleted + * + * Since: 2.20 + */ +gboolean +g_app_info_delete (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), FALSE); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->do_delete) + return (* iface->do_delete) (appinfo); + + return FALSE; +} + + +G_DEFINE_TYPE (GAppLaunchContext, g_app_launch_context, G_TYPE_OBJECT); + +/** + * g_app_launch_context_new: + * + * Creates a new application launch context. This is not normally used, + * instead you instantiate a subclass of this, such as #GdkAppLaunchContext. + * + * Returns: a #GAppLaunchContext. + **/ +GAppLaunchContext * +g_app_launch_context_new (void) +{ + return g_object_new (G_TYPE_APP_LAUNCH_CONTEXT, NULL); +} + +static void +g_app_launch_context_class_init (GAppLaunchContextClass *klass) +{ +} + +static void +g_app_launch_context_init (GAppLaunchContext *launch_context) +{ +} + +/** + * g_app_launch_context_get_display: + * @context: a #GAppLaunchContext + * @info: a #GAppInfo + * @files: a #GList of #GFile objects + * + * Gets the display string for the display. This is used to ensure new + * applications are started on the same display as the launching + * application. + * + * Returns: a display string for the display. + **/ +char * +g_app_launch_context_get_display (GAppLaunchContext *context, + GAppInfo *info, + GList *files) +{ + GAppLaunchContextClass *class; + + g_return_val_if_fail (G_IS_APP_LAUNCH_CONTEXT (context), NULL); + g_return_val_if_fail (G_IS_APP_INFO (info), NULL); + + class = G_APP_LAUNCH_CONTEXT_GET_CLASS (context); + + if (class->get_display == NULL) + return NULL; + + return class->get_display (context, info, files); +} + +/** + * g_app_launch_context_get_startup_notify_id: + * @context: a #GAppLaunchContext + * @info: a #GAppInfo + * @files: a #GList of of #GFile objects + * + * Initiates startup notification for the application and returns the + * DESKTOP_STARTUP_ID for the launched operation, if supported. + * + * Startup notification IDs are defined in the + * FreeDesktop.Org Startup Notifications standard. + * + * Returns: a startup notification ID for the application, or %NULL if + * not supported. + **/ +char * +g_app_launch_context_get_startup_notify_id (GAppLaunchContext *context, + GAppInfo *info, + GList *files) +{ + GAppLaunchContextClass *class; + + g_return_val_if_fail (G_IS_APP_LAUNCH_CONTEXT (context), NULL); + g_return_val_if_fail (G_IS_APP_INFO (info), NULL); + + class = G_APP_LAUNCH_CONTEXT_GET_CLASS (context); + + if (class->get_startup_notify_id == NULL) + return NULL; + + return class->get_startup_notify_id (context, info, files); +} + + +/** + * g_app_launch_context_launch_failed: + * @context: a #GAppLaunchContext. + * @startup_notify_id: the startup notification id that was returned by g_app_launch_context_get_startup_notify_id(). + * + * Called when an application has failed to launch, so that it can cancel + * the application startup notification started in g_app_launch_context_get_startup_notify_id(). + * + **/ +void +g_app_launch_context_launch_failed (GAppLaunchContext *context, + const char *startup_notify_id) +{ + GAppLaunchContextClass *class; + + g_return_if_fail (G_IS_APP_LAUNCH_CONTEXT (context)); + g_return_if_fail (startup_notify_id != NULL); + + class = G_APP_LAUNCH_CONTEXT_GET_CLASS (context); + + if (class->launch_failed != NULL) + class->launch_failed (context, startup_notify_id); +} + + +#define __G_APP_INFO_C__ +#include "gioaliasdef.c" diff --git a/gio/gappinfo.h b/gio/gappinfo.h new file mode 100644 index 0000000..3746776 --- /dev/null +++ b/gio/gappinfo.h @@ -0,0 +1,237 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_APP_INFO_H__ +#define __G_APP_INFO_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_APP_INFO (g_app_info_get_type ()) +#define G_APP_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_APP_INFO, GAppInfo)) +#define G_IS_APP_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_APP_INFO)) +#define G_APP_INFO_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_APP_INFO, GAppInfoIface)) + +#define G_TYPE_APP_LAUNCH_CONTEXT (g_app_launch_context_get_type ()) +#define G_APP_LAUNCH_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_APP_LAUNCH_CONTEXT, GAppLaunchContext)) +#define G_APP_LAUNCH_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_APP_LAUNCH_CONTEXT, GAppLaunchContextClass)) +#define G_IS_APP_LAUNCH_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_APP_LAUNCH_CONTEXT)) +#define G_IS_APP_LAUNCH_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_APP_LAUNCH_CONTEXT)) +#define G_APP_LAUNCH_CONTEXT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_APP_LAUNCH_CONTEXT, GAppLaunchContextClass)) + +typedef struct _GAppLaunchContextClass GAppLaunchContextClass; +typedef struct _GAppLaunchContextPrivate GAppLaunchContextPrivate; + +/** + * GAppInfo: + * + * Information about an installed application and methods to launch + * it (with file arguments). + */ + +/** + * GAppInfoIface: + * @g_iface: The parent interface. + * @dup: Copies a #GAppInfo. + * @equal: Checks two #GAppInfos for equality. + * @get_id: Gets a string identifier for a #GAppInfo. + * @get_name: Gets the name of the application for a #GAppInfo. + * @get_description: Gets a short description for the application described by the #GAppInfo. + * @get_executable: Gets the executable name for the #GAppInfo. + * @get_icon: Gets the #GIcon for the #GAppInfo. + * @launch: Launches an application specified by the #GAppInfo. + * @supports_uris: Indicates whether the application specified supports launching URIs. + * @supports_files: Indicates whether the application specified accepts filename arguments. + * @launch_uris: Launches an application with a list of URIs. + * @should_show: Returns whether an application should be shown (e.g. when getting a list of installed applications). + * + * FreeDesktop.Org Startup Notification Specification. + * @set_as_default_for_type: Sets an application as default for a given content type. + * @set_as_default_for_extension: Sets an application as default for a given file extension. + * @add_supports_type: Adds to the #GAppInfo information about supported file types. + * @can_remove_supports_type: Checks for support for removing supported file types from a #GAppInfo. + * @remove_supports_type: Removes a supported application type from a #GAppInfo. + * @can_delete: Checks if a #GAppInfo can be deleted. Since 2.20 + * @do_delete: Deletes a #GAppInfo. Since 2.20 + * @get_commandline: Gets the commandline for the #GAppInfo. Since 2.20 + * @get_display_name: Gets the display name for the #GAppInfo. Since 2.24 + * + * Application Information interface, for operating system portability. + */ +typedef struct _GAppInfoIface GAppInfoIface; + +struct _GAppInfoIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GAppInfo * (* dup) (GAppInfo *appinfo); + gboolean (* equal) (GAppInfo *appinfo1, + GAppInfo *appinfo2); + const char * (* get_id) (GAppInfo *appinfo); + const char * (* get_name) (GAppInfo *appinfo); + const char * (* get_description) (GAppInfo *appinfo); + const char * (* get_executable) (GAppInfo *appinfo); + GIcon * (* get_icon) (GAppInfo *appinfo); + gboolean (* launch) (GAppInfo *appinfo, + GList *filenames, + GAppLaunchContext *launch_context, + GError **error); + gboolean (* supports_uris) (GAppInfo *appinfo); + gboolean (* supports_files) (GAppInfo *appinfo); + gboolean (* launch_uris) (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error); + gboolean (* should_show) (GAppInfo *appinfo); + + /* For changing associations */ + gboolean (* set_as_default_for_type) (GAppInfo *appinfo, + const char *content_type, + GError **error); + gboolean (* set_as_default_for_extension) (GAppInfo *appinfo, + const char *extension, + GError **error); + gboolean (* add_supports_type) (GAppInfo *appinfo, + const char *content_type, + GError **error); + gboolean (* can_remove_supports_type) (GAppInfo *appinfo); + gboolean (* remove_supports_type) (GAppInfo *appinfo, + const char *content_type, + GError **error); + gboolean (* can_delete) (GAppInfo *appinfo); + gboolean (* do_delete) (GAppInfo *appinfo); + const char * (* get_commandline) (GAppInfo *appinfo); + const char * (* get_display_name) (GAppInfo *appinfo); +}; + +GType g_app_info_get_type (void) G_GNUC_CONST; +GAppInfo * g_app_info_create_from_commandline (const char *commandline, + const char *application_name, + GAppInfoCreateFlags flags, + GError **error); +GAppInfo * g_app_info_dup (GAppInfo *appinfo); +gboolean g_app_info_equal (GAppInfo *appinfo1, + GAppInfo *appinfo2); +const char *g_app_info_get_id (GAppInfo *appinfo); +const char *g_app_info_get_name (GAppInfo *appinfo); +const char *g_app_info_get_display_name (GAppInfo *appinfo); +const char *g_app_info_get_description (GAppInfo *appinfo); +const char *g_app_info_get_executable (GAppInfo *appinfo); +const char *g_app_info_get_commandline (GAppInfo *appinfo); +GIcon * g_app_info_get_icon (GAppInfo *appinfo); +gboolean g_app_info_launch (GAppInfo *appinfo, + GList *files, + GAppLaunchContext *launch_context, + GError **error); +gboolean g_app_info_supports_uris (GAppInfo *appinfo); +gboolean g_app_info_supports_files (GAppInfo *appinfo); +gboolean g_app_info_launch_uris (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error); +gboolean g_app_info_should_show (GAppInfo *appinfo); + +gboolean g_app_info_set_as_default_for_type (GAppInfo *appinfo, + const char *content_type, + GError **error); +gboolean g_app_info_set_as_default_for_extension (GAppInfo *appinfo, + const char *extension, + GError **error); +gboolean g_app_info_add_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error); +gboolean g_app_info_can_remove_supports_type (GAppInfo *appinfo); +gboolean g_app_info_remove_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error); +gboolean g_app_info_can_delete (GAppInfo *appinfo); +gboolean g_app_info_delete (GAppInfo *appinfo); + +GList * g_app_info_get_all (void); +GList * g_app_info_get_all_for_type (const char *content_type); +void g_app_info_reset_type_associations (const char *content_type); +GAppInfo *g_app_info_get_default_for_type (const char *content_type, + gboolean must_support_uris); +GAppInfo *g_app_info_get_default_for_uri_scheme (const char *uri_scheme); + +gboolean g_app_info_launch_default_for_uri (const char *uri, + GAppLaunchContext *launch_context, + GError **error); + +/** + * GAppLaunchContext: + * @parent_instance: The parent instance. + * + * Integrating the launch with the launching application. This is used to + * handle for instance startup notification and launching the new application + * on the same screen as the launching window. + */ +struct _GAppLaunchContext +{ + GObject parent_instance; + + /*< private >*/ + GAppLaunchContextPrivate *priv; +}; + +struct _GAppLaunchContextClass +{ + GObjectClass parent_class; + + char * (* get_display) (GAppLaunchContext *context, + GAppInfo *info, + GList *files); + char * (* get_startup_notify_id) (GAppLaunchContext *context, + GAppInfo *info, + GList *files); + void (* launch_failed) (GAppLaunchContext *context, + const char *startup_notify_id); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_app_launch_context_get_type (void) G_GNUC_CONST; +GAppLaunchContext *g_app_launch_context_new (void); +char * g_app_launch_context_get_display (GAppLaunchContext *context, + GAppInfo *info, + GList *files); +char * g_app_launch_context_get_startup_notify_id (GAppLaunchContext *context, + GAppInfo *info, + GList *files); +void g_app_launch_context_launch_failed (GAppLaunchContext *context, + const char * startup_notify_id); + +G_END_DECLS + +#endif /* __G_APP_INFO_H__ */ diff --git a/gio/gasynchelper.c b/gio/gasynchelper.c new file mode 100644 index 0000000..6387bf9 --- /dev/null +++ b/gio/gasynchelper.c @@ -0,0 +1,159 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include "gasynchelper.h" + +#include "gioalias.h" + +/** + * SECTION:gasynchelper + * @short_description: Asynchronous Helper Functions + * @include: gio/gio.h + * @see_also: #GAsyncReady + * + * Provides helper functions for asynchronous operations. + * + **/ + +/************************************************************************* + * fd source * + ************************************************************************/ + +typedef struct +{ + GSource source; + GPollFD pollfd; + GCancellable *cancellable; + gulong cancelled_tag; + GObject *object; +} FDSource; + +static gboolean +fd_source_prepare (GSource *source, + gint *timeout) +{ + FDSource *fd_source = (FDSource *)source; + *timeout = -1; + + return g_cancellable_is_cancelled (fd_source->cancellable); +} + +static gboolean +fd_source_check (GSource *source) +{ + FDSource *fd_source = (FDSource *)source; + + return + g_cancellable_is_cancelled (fd_source->cancellable) || + fd_source->pollfd.revents != 0; +} + +static gboolean +fd_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) + +{ + GFDSourceFunc func = (GFDSourceFunc)callback; + GFDSourceObjectFunc func2 = (GFDSourceObjectFunc)callback; + FDSource *fd_source = (FDSource *)source; + + g_warn_if_fail (func != NULL); + + if (fd_source->object) + return (*func2) (fd_source->object, fd_source->pollfd.revents, user_data); + else + return (*func) (user_data, fd_source->pollfd.revents, fd_source->pollfd.fd); +} + +static void +fd_source_finalize (GSource *source) +{ + FDSource *fd_source = (FDSource *)source; + + if (fd_source->cancelled_tag) + g_cancellable_disconnect (fd_source->cancellable, + fd_source->cancelled_tag); + + if (fd_source->cancellable) + g_object_unref (fd_source->cancellable); + + if (fd_source->object) + g_object_unref (fd_source->object); +} + +static GSourceFuncs fd_source_funcs = { + fd_source_prepare, + fd_source_check, + fd_source_dispatch, + fd_source_finalize +}; + +/* Might be called on another thread */ +static void +fd_source_cancelled_cb (GCancellable *cancellable, + gpointer data) +{ + /* Wake up the mainloop in case we're waiting on async calls with FDSource */ + g_main_context_wakeup (NULL); +} + +GSource * +_g_fd_source_new_with_object (GObject *object, + int fd, + gushort events, + GCancellable *cancellable) +{ + GSource *source; + FDSource *fd_source; + + source = g_source_new (&fd_source_funcs, sizeof (FDSource)); + fd_source = (FDSource *)source; + + if (cancellable) + fd_source->cancellable = g_object_ref (cancellable); + + if (object) + fd_source->object = g_object_ref (object); + + fd_source->pollfd.fd = fd; + fd_source->pollfd.events = events; + g_source_add_poll (source, &fd_source->pollfd); + + if (cancellable) + fd_source->cancelled_tag = + g_cancellable_connect (cancellable, + (GCallback)fd_source_cancelled_cb, + NULL, NULL); + + return source; +} + +GSource * +_g_fd_source_new (int fd, + gushort events, + GCancellable *cancellable) +{ + return _g_fd_source_new_with_object (NULL, fd, events, cancellable); +} diff --git a/gio/gasynchelper.h b/gio/gasynchelper.h new file mode 100644 index 0000000..e95b405 --- /dev/null +++ b/gio/gasynchelper.h @@ -0,0 +1,61 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_ASYNC_HELPER_H__ +#define __G_ASYNC_HELPER_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct +{ + gpointer async_object; + GError * error; + gpointer user_data; +} GAsyncResultData; + +typedef gboolean (*GFDSourceFunc) (gpointer user_data, + GIOCondition condition, + int fd); +typedef gboolean (*GFDSourceObjectFunc) (GObject *object, + GIOCondition condition, + gpointer user_data); + +void _g_queue_async_result (GAsyncResultData *result, + gpointer async_object, + GError *error, + gpointer user_data, + GSourceFunc source_func); + +GSource *_g_fd_source_new_with_object (GObject *object, + int fd, + gushort events, + GCancellable *cancellable); +GSource *_g_fd_source_new (int fd, + gushort events, + GCancellable *cancellable); + +G_END_DECLS + +#endif /* __G_ASYNC_HELPER_H__ */ diff --git a/gio/gasyncinitable.c b/gio/gasyncinitable.c new file mode 100644 index 0000000..05e17e2 --- /dev/null +++ b/gio/gasyncinitable.c @@ -0,0 +1,393 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gasyncinitable.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gasyncinitable + * @short_description: Asynchronously failable object initialization interface + * @include: gio/gio.h + * @see_also: #GInitable + * + * This is the asynchronous version of #GInitable; it behaves the same + * in all ways except that initialization is asynchronous. For more details + * see the descriptions on #GInitable. + * + * A class may implement both the #GInitable and #GAsyncInitable interfaces. + * + * Users of objects implementing this are not intended to use the interface + * method directly; instead it will be used automatically in various ways. + * For C applications you generally just call g_async_initable_new_async() + * directly, or indirectly via a foo_thing_new_async() wrapper. This will call + * g_async_initable_init_async() under the cover, calling back with %NULL and + * a set %GError on failure. + */ + +static void g_async_initable_base_init (gpointer g_iface); +static void g_async_initable_real_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_async_initable_real_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error); + +GType +g_async_initable_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + const GTypeInfo initable_info = + { + sizeof (GAsyncInitableIface), /* class_size */ + g_async_initable_base_init, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL + }; + GType g_define_type_id = + g_type_register_static (G_TYPE_INTERFACE, I_("GAsyncInitable"), + &initable_info, 0); + + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +static void +g_async_initable_base_init (gpointer g_iface) +{ + GAsyncInitableIface *iface = g_iface; + + iface->init_async = g_async_initable_real_init_async; + iface->init_finish = g_async_initable_real_init_finish; +} + +/** + * g_async_initable_init_async: + * @initable: a #GAsyncInitable. + * @io_priority: the I/O priority + * of the operation. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Starts asynchronous initialization of the object implementing the + * interface. This must be done before any real use of the object after + * initial construction. If the object also implements #GInitable you can + * optionally call g_initable_init() instead. + * + * When the initialization is finished, @callback will be called. You can + * then call g_async_initable_init_finish() to get the result of the + * initialization. + * + * Implementations may also support cancellation. If @cancellable is not + * %NULL, then initialization can be cancelled by triggering the cancellable + * object from another thread. If the operation was cancelled, the error + * %G_IO_ERROR_CANCELLED will be returned. If @cancellable is not %NULL, and + * the object doesn't support cancellable initialization, the error + * %G_IO_ERROR_NOT_SUPPORTED will be returned. + * + * If this function is not called, or returns with an error, then all + * operations on the object should fail, generally returning the + * error %G_IO_ERROR_NOT_INITIALIZED. + * + * Implementations of this method must be idempotent: i.e. multiple calls + * to this function with the same argument should return the same results. + * Only the first call initializes the object; further calls return the result + * of the first call. This is so that it's safe to implement the singleton + * pattern in the GObject constructor function. + * + * For classes that also support the #GInitable interface, the default + * implementation of this method will run the g_initable_init() function + * in a thread, so if you want to support asynchronous initialization via + * threads, just implement the #GAsyncInitable interface without overriding + * any interface methods. + * + * Since: 2.22 + */ +void +g_async_initable_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GAsyncInitableIface *iface; + + g_return_if_fail (G_IS_ASYNC_INITABLE (initable)); + + iface = G_ASYNC_INITABLE_GET_IFACE (initable); + + (* iface->init_async) (initable, io_priority, cancellable, callback, user_data); +} + +/** + * g_async_initable_init_finish: + * @initable: a #GAsyncInitable. + * @res: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes asynchronous initialization and returns the result. + * See g_async_initable_init_async(). + * + * Returns: %TRUE if successful. If an error has occurred, this function + * will return %FALSE and set @error appropriately if present. + * + * Since: 2.22 + */ +gboolean +g_async_initable_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error) +{ + GAsyncInitableIface *iface; + + g_return_val_if_fail (G_IS_ASYNC_INITABLE (initable), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_ASYNC_INITABLE_GET_IFACE (initable); + + return (* iface->init_finish) (initable, res, error); +} + +static void +async_init_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error = NULL; + + if (!g_initable_init (G_INITABLE (res), cancellable, &error)) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } +} + +static void +g_async_initable_real_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + g_return_if_fail (G_IS_INITABLE (initable)); + + res = g_simple_async_result_new (G_OBJECT (initable), callback, user_data, + g_async_initable_real_init_async); + g_simple_async_result_run_in_thread (res, async_init_thread, + io_priority, cancellable); + g_object_unref (res); +} + +static gboolean +g_async_initable_real_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error) +{ + return TRUE; /* Errors handled by base impl */ +} + +/** + * g_async_initable_new_async: + * @object_type: a #GType supporting #GAsyncInitable. + * @io_priority: the I/O priority + * of the operation. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the initialization is + * finished + * @user_data: the data to pass to callback function + * @first_property_name: the name of the first property, or %NULL if no + * properties + * @...: the value of the first property, followed by other property + * value pairs, and ended by %NULL. + * + * Helper function for constructing #GAsyncInitiable object. This is + * similar to g_object_new() but also initializes the object asynchronously. + * + * When the initialization is finished, @callback will be called. You can + * then call g_async_initable_new_finish() to get the new object and check + * for any errors. + * + * Since: 2.22 + */ +void +g_async_initable_new_async (GType object_type, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + const gchar *first_property_name, + ...) +{ + va_list var_args; + + va_start (var_args, first_property_name); + g_async_initable_new_valist_async (object_type, + first_property_name, var_args, + io_priority, cancellable, + callback, user_data); + va_end (var_args); +} + +/** + * g_async_initable_newv_async: + * @object_type: a #GType supporting #GAsyncInitable. + * @n_parameters: the number of parameters in @parameters + * @parameters: the parameters to use to construct the object + * @io_priority: the I/O priority + * of the operation. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the initialization is + * finished + * @user_data: the data to pass to callback function + * + * Helper function for constructing #GAsyncInitiable object. This is + * similar to g_object_newv() but also initializes the object asynchronously. + * + * When the initialization is finished, @callback will be called. You can + * then call g_async_initable_new_finish() to get the new object and check + * for any errors. + * + * Since: 2.22 + */ +void +g_async_initable_newv_async (GType object_type, + guint n_parameters, + GParameter *parameters, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GObject *obj; + + g_return_if_fail (G_TYPE_IS_ASYNC_INITABLE (object_type)); + + obj = g_object_newv (object_type, n_parameters, parameters); + + g_async_initable_init_async (G_ASYNC_INITABLE (obj), + io_priority, cancellable, + callback, user_data); +} + +/** + * g_async_initable_new_valist_async: + * @object_type: a #GType supporting #GAsyncInitable. + * @first_property_name: the name of the first property, followed by + * the value, and other property value pairs, and ended by %NULL. + * @var_args: The var args list generated from @first_property_name. + * @io_priority: the I/O priority + * of the operation. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the initialization is + * finished + * @user_data: the data to pass to callback function + * + * Helper function for constructing #GAsyncInitiable object. This is + * similar to g_object_new_valist() but also initializes the object + * asynchronously. + * + * When the initialization is finished, @callback will be called. You can + * then call g_async_initable_new_finish() to get the new object and check + * for any errors. + * + * Since: 2.22 + */ +void +g_async_initable_new_valist_async (GType object_type, + const gchar *first_property_name, + va_list var_args, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GObject *obj; + + g_return_if_fail (G_TYPE_IS_ASYNC_INITABLE (object_type)); + + obj = g_object_new_valist (object_type, + first_property_name, + var_args); + + g_async_initable_init_async (G_ASYNC_INITABLE (obj), + io_priority, cancellable, + callback, user_data); + g_object_unref (obj); /* Passed ownership to async call */ +} + +/** + * g_async_initable_new_finish: + * @initable: the #GAsyncInitable from the callback + * @res: the #GAsyncResult.from the callback + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes the async construction for the various g_async_initable_new calls, + * returning the created object or %NULL on error. + * + * Returns: a newly created #GObject, or %NULL on error. Free with + * g_object_unref(). + * + * Since: 2.22 + */ +GObject * +g_async_initable_new_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error) +{ + if (g_async_initable_init_finish (initable, res, error)) + return g_object_ref (initable); + else + return NULL; +} + +#define __G_ASYNC_INITABLE_C__ +#include "gioaliasdef.c" diff --git a/gio/gasyncinitable.h b/gio/gasyncinitable.h new file mode 100644 index 0000000..8442821 --- /dev/null +++ b/gio/gasyncinitable.h @@ -0,0 +1,119 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ASYNC_INITABLE_H__ +#define __G_ASYNC_INITABLE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_ASYNC_INITABLE (g_async_initable_get_type ()) +#define G_ASYNC_INITABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_ASYNC_INITABLE, GAsyncInitable)) +#define G_IS_ASYNC_INITABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_ASYNC_INITABLE)) +#define G_ASYNC_INITABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_ASYNC_INITABLE, GAsyncInitableIface)) +#define G_TYPE_IS_ASYNC_INITABLE(type) (g_type_is_a ((type), G_TYPE_ASYNC_INITABLE)) + +/** + * GAsyncInitable: + * + * Interface for asynchronously initializable objects. + * + * Since: 2.22 + **/ +typedef struct _GAsyncInitableIface GAsyncInitableIface; + +/** + * GAsyncInitableIface: + * @g_iface: The parent interface. + * @init_async: Starts initialization of the object. + * @init_finish: Finishes initialization of the object. + * + * Provides an interface for asynchronous initializing object such that + * initialization may fail. + * + * Since: 2.22 + **/ +struct _GAsyncInitableIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + void (* init_async) (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* init_finish) (GAsyncInitable *initable, + GAsyncResult *res, + GError **error); +}; + +GType g_async_initable_get_type (void) G_GNUC_CONST; + + +void g_async_initable_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_async_initable_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error); + +void g_async_initable_new_async (GType object_type, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + const gchar *first_property_name, + ...); +void g_async_initable_newv_async (GType object_type, + guint n_parameters, + GParameter *parameters, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +void g_async_initable_new_valist_async (GType object_type, + const gchar *first_property_name, + va_list var_args, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GObject *g_async_initable_new_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error); + + + +G_END_DECLS + + +#endif /* __G_ASYNC_INITABLE_H__ */ diff --git a/gio/gasyncresult.c b/gio/gasyncresult.c new file mode 100644 index 0000000..5af2792 --- /dev/null +++ b/gio/gasyncresult.c @@ -0,0 +1,162 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gasyncresult.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gasyncresult + * @short_description: Asynchronous Function Results + * @include: gio/gio.h + * @see_also: #GSimpleAsyncResult + * + * Provides a base class for implementing asynchronous function results. + * + * Asynchronous operations are broken up into two separate operations + * which are chained together by a #GAsyncReadyCallback. To begin + * an asynchronous operation, provide a #GAsyncReadyCallback to the + * asynchronous function. This callback will be triggered when the + * operation has completed, and will be passed a #GAsyncResult instance + * filled with the details of the operation's success or failure, the + * object the asynchronous function was started for and any error codes + * returned. The asynchronous callback function is then expected to call + * the corresponding "_finish()" function, passing the object the + * function was called for, the #GAsyncResult instance, and (optionally) + * an @error to grab any error conditions that may have occurred. + * + * The "_finish()" function for an operation takes the generic result + * (of type #GAsyncResult) and returns the specific result that the + * operation in question yields (e.g. a #GFileEnumerator for a + * "enumerate children" operation). If the result or error status of the + * operation is not needed, there is no need to call the "_finish()" + * function; GIO will take care of cleaning up the result and error + * information after the #GAsyncReadyCallback returns. Applications may + * also take a reference to the #GAsyncResult and call "_finish()" + * later; however, the "_finish()" function may be called at most once. + * + * Example of a typical asynchronous operation flow: + * |[ + * void _theoretical_frobnitz_async (Theoretical *t, + * GCancellable *c, + * GAsyncReadyCallback *cb, + * gpointer u); + * + * gboolean _theoretical_frobnitz_finish (Theoretical *t, + * GAsyncResult *res, + * GError **e); + * + * static void + * frobnitz_result_func (GObject *source_object, + * GAsyncResult *res, + * gpointer user_data) + * { + * gboolean success = FALSE; + * + * success = _theoretical_frobnitz_finish (source_object, res, NULL); + * + * if (success) + * g_printf ("Hurray!\n"); + * else + * g_printf ("Uh oh!\n"); + * + * /* ... */ + * + * } + * + * int main (int argc, void *argv[]) + * { + * /* ... */ + * + * _theoretical_frobnitz_async (theoretical_data, + * NULL, + * frobnitz_result_func, + * NULL); + * + * /* ... */ + * } + * ]| + * + * The callback for an asynchronous operation is called only once, and is + * always called, even in the case of a cancelled operation. On cancellation + * the result is a %G_IO_ERROR_CANCELLED error. + * + * Some asynchronous operations are implemented using synchronous calls. + * These are run in a separate thread, if #GThread has been initialized, but + * otherwise they are sent to the Main Event Loop and processed in an idle + * function. So, if you truly need asynchronous operations, make sure to + * initialize #GThread. + **/ + +typedef GAsyncResultIface GAsyncResultInterface; +G_DEFINE_INTERFACE (GAsyncResult, g_async_result, G_TYPE_OBJECT) + +static void +g_async_result_default_init (GAsyncResultInterface *iface) +{ +} + +/** + * g_async_result_get_user_data: + * @res: a #GAsyncResult. + * + * Gets the user data from a #GAsyncResult. + * + * Returns: the user data for @res. + **/ +gpointer +g_async_result_get_user_data (GAsyncResult *res) +{ + GAsyncResultIface *iface; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + iface = G_ASYNC_RESULT_GET_IFACE (res); + + return (* iface->get_user_data) (res); +} + +/** + * g_async_result_get_source_object: + * @res: a #GAsyncResult + * + * Gets the source object from a #GAsyncResult. + * + * Returns: a new reference to the source object for the @res, + * or %NULL if there is none. + */ +GObject * +g_async_result_get_source_object (GAsyncResult *res) +{ + GAsyncResultIface *iface; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + iface = G_ASYNC_RESULT_GET_IFACE (res); + + return (* iface->get_source_object) (res); +} + +#define __G_ASYNC_RESULT_C__ +#include "gioaliasdef.c" diff --git a/gio/gasyncresult.h b/gio/gasyncresult.h new file mode 100644 index 0000000..1614586 --- /dev/null +++ b/gio/gasyncresult.h @@ -0,0 +1,73 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ASYNC_RESULT_H__ +#define __G_ASYNC_RESULT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_ASYNC_RESULT (g_async_result_get_type ()) +#define G_ASYNC_RESULT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_ASYNC_RESULT, GAsyncResult)) +#define G_IS_ASYNC_RESULT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_ASYNC_RESULT)) +#define G_ASYNC_RESULT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_ASYNC_RESULT, GAsyncResultIface)) + +/** + * GAsyncResult: + * + * Holds results information for an asynchronous operation, + * usually passed directly to a asynchronous _finish() operation. + **/ +typedef struct _GAsyncResultIface GAsyncResultIface; + + +/** + * GAsyncResultIface: + * @g_iface: The parent interface. + * @get_user_data: Gets the user data passed to the callback. + * @get_source_object: Gets the source object that issued the asynchronous operation. + * + * Interface definition for #GAsyncResult. + **/ +struct _GAsyncResultIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + gpointer (* get_user_data) (GAsyncResult *async_result); + GObject * (* get_source_object) (GAsyncResult *async_result); +}; + +GType g_async_result_get_type (void) G_GNUC_CONST; + +gpointer g_async_result_get_user_data (GAsyncResult *res); +GObject *g_async_result_get_source_object (GAsyncResult *res); + +G_END_DECLS + +#endif /* __G_ASYNC_RESULT_H__ */ diff --git a/gio/gbufferedinputstream.c b/gio/gbufferedinputstream.c new file mode 100644 index 0000000..50b5d8e --- /dev/null +++ b/gio/gbufferedinputstream.c @@ -0,0 +1,1373 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Jürg Billeter + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#include "config.h" +#include "gbufferedinputstream.h" +#include "ginputstream.h" +#include "gcancellable.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gbufferedinputstream + * @short_description: Buffered Input Stream + * @include: gio/gio.h + * @see_also: #GFilterInputStream, #GInputStream + * + * Buffered input stream implements #GFilterInputStream and provides + * for buffered reads. + * + * By default, #GBufferedInputStream's buffer size is set at 4 kilobytes. + * + * To create a buffered input stream, use g_buffered_input_stream_new(), + * or g_buffered_input_stream_new_sized() to specify the buffer's size at + * construction. + * + * To get the size of a buffer within a buffered input stream, use + * g_buffered_input_stream_get_buffer_size(). To change the size of a + * buffered input stream's buffer, use + * g_buffered_input_stream_set_buffer_size(). Note that the buffer's size + * cannot be reduced below the size of the data within the buffer. + * + **/ + + + +#define DEFAULT_BUFFER_SIZE 4096 + +struct _GBufferedInputStreamPrivate { + guint8 *buffer; + gsize len; + gsize pos; + gsize end; + GAsyncReadyCallback outstanding_callback; +}; + +enum { + PROP_0, + PROP_BUFSIZE +}; + +static void g_buffered_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static void g_buffered_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_buffered_input_stream_finalize (GObject *object); + + +static gssize g_buffered_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +static void g_buffered_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gssize g_buffered_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static gssize g_buffered_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static void g_buffered_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gssize g_buffered_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static gssize g_buffered_input_stream_real_fill (GBufferedInputStream *stream, + gssize count, + GCancellable *cancellable, + GError **error); +static void g_buffered_input_stream_real_fill_async (GBufferedInputStream *stream, + gssize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gssize g_buffered_input_stream_real_fill_finish (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error); + +static void compact_buffer (GBufferedInputStream *stream); + +G_DEFINE_TYPE (GBufferedInputStream, + g_buffered_input_stream, + G_TYPE_FILTER_INPUT_STREAM) + + +static void +g_buffered_input_stream_class_init (GBufferedInputStreamClass *klass) +{ + GObjectClass *object_class; + GInputStreamClass *istream_class; + GBufferedInputStreamClass *bstream_class; + + g_type_class_add_private (klass, sizeof (GBufferedInputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_buffered_input_stream_get_property; + object_class->set_property = g_buffered_input_stream_set_property; + object_class->finalize = g_buffered_input_stream_finalize; + + istream_class = G_INPUT_STREAM_CLASS (klass); + istream_class->skip = g_buffered_input_stream_skip; + istream_class->skip_async = g_buffered_input_stream_skip_async; + istream_class->skip_finish = g_buffered_input_stream_skip_finish; + istream_class->read_fn = g_buffered_input_stream_read; + istream_class->read_async = g_buffered_input_stream_read_async; + istream_class->read_finish = g_buffered_input_stream_read_finish; + + bstream_class = G_BUFFERED_INPUT_STREAM_CLASS (klass); + bstream_class->fill = g_buffered_input_stream_real_fill; + bstream_class->fill_async = g_buffered_input_stream_real_fill_async; + bstream_class->fill_finish = g_buffered_input_stream_real_fill_finish; + + g_object_class_install_property (object_class, + PROP_BUFSIZE, + g_param_spec_uint ("buffer-size", + P_("Buffer Size"), + P_("The size of the backend buffer"), + 1, + G_MAXUINT, + DEFAULT_BUFFER_SIZE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + +} + +/** + * g_buffered_input_stream_get_buffer_size: + * @stream: #GBufferedInputStream. + * + * Gets the size of the input buffer. + * + * Returns: the current buffer size. + **/ +gsize +g_buffered_input_stream_get_buffer_size (GBufferedInputStream *stream) +{ + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), 0); + + return stream->priv->len; +} + +/** + * g_buffered_input_stream_set_buffer_size: + * @stream: #GBufferedInputStream. + * @size: a #gsize. + * + * Sets the size of the internal buffer of @stream to @size, or to the + * size of the contents of the buffer. The buffer can never be resized + * smaller than its current contents. + **/ +void +g_buffered_input_stream_set_buffer_size (GBufferedInputStream *stream, + gsize size) +{ + GBufferedInputStreamPrivate *priv; + gsize in_buffer; + guint8 *buffer; + + g_return_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream)); + + priv = stream->priv; + + if (priv->len == size) + return; + + if (priv->buffer) + { + in_buffer = priv->end - priv->pos; + + /* Never resize smaller than current buffer contents */ + size = MAX (size, in_buffer); + + buffer = g_malloc (size); + memcpy (buffer, priv->buffer + priv->pos, in_buffer); + priv->len = size; + priv->pos = 0; + priv->end = in_buffer; + g_free (priv->buffer); + priv->buffer = buffer; + } + else + { + priv->len = size; + priv->pos = 0; + priv->end = 0; + priv->buffer = g_malloc (size); + } + + g_object_notify (G_OBJECT (stream), "buffer-size"); +} + +static void +g_buffered_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GBufferedInputStream *bstream; + + bstream = G_BUFFERED_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BUFSIZE: + g_buffered_input_stream_set_buffer_size (bstream, g_value_get_uint (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_buffered_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GBufferedInputStreamPrivate *priv; + GBufferedInputStream *bstream; + + bstream = G_BUFFERED_INPUT_STREAM (object); + priv = bstream->priv; + + switch (prop_id) + { + case PROP_BUFSIZE: + g_value_set_uint (value, priv->len); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_buffered_input_stream_finalize (GObject *object) +{ + GBufferedInputStreamPrivate *priv; + GBufferedInputStream *stream; + + stream = G_BUFFERED_INPUT_STREAM (object); + priv = stream->priv; + + g_free (priv->buffer); + + G_OBJECT_CLASS (g_buffered_input_stream_parent_class)->finalize (object); +} + +static void +g_buffered_input_stream_init (GBufferedInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_BUFFERED_INPUT_STREAM, + GBufferedInputStreamPrivate); +} + + +/** + * g_buffered_input_stream_new: + * @base_stream: a #GInputStream. + * + * Creates a new #GInputStream from the given @base_stream, with + * a buffer set to the default size (4 kilobytes). + * + * Returns: a #GInputStream for the given @base_stream. + **/ +GInputStream * +g_buffered_input_stream_new (GInputStream *base_stream) +{ + GInputStream *stream; + + g_return_val_if_fail (G_IS_INPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_BUFFERED_INPUT_STREAM, + "base-stream", base_stream, + NULL); + + return stream; +} + +/** + * g_buffered_input_stream_new_sized: + * @base_stream: a #GInputStream. + * @size: a #gsize. + * + * Creates a new #GBufferedInputStream from the given @base_stream, + * with a buffer set to @size. + * + * Returns: a #GInputStream. + **/ +GInputStream * +g_buffered_input_stream_new_sized (GInputStream *base_stream, + gsize size) +{ + GInputStream *stream; + + g_return_val_if_fail (G_IS_INPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_BUFFERED_INPUT_STREAM, + "base-stream", base_stream, + "buffer-size", (guint)size, + NULL); + + return stream; +} + +/** + * g_buffered_input_stream_fill: + * @stream: #GBufferedInputStream. + * @count: the number of bytes that will be read from the stream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore. + * + * Tries to read @count bytes from the stream into the buffer. + * Will block during this read. + * + * If @count is zero, returns zero and does nothing. A value of @count + * larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, the number of bytes read into the buffer is returned. + * It is not an error if this is not the same as the requested size, as it + * can happen e.g. near the end of a file. Zero is returned on end of file + * (or if @count is zero), but never otherwise. + * + * If @count is -1 then the attempted read size is equal to the number of + * bytes that are required to fill the buffer. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. If an + * operation was partially finished when the operation was cancelled the + * partial result will be returned, without an error. + * + * On error -1 is returned and @error is set accordingly. + * + * For the asynchronous, non-blocking, version of this function, see + * g_buffered_input_stream_fill_async(). + * + * Returns: the number of bytes read into @stream's buffer, up to @count, + * or -1 on error. + **/ +gssize +g_buffered_input_stream_fill (GBufferedInputStream *stream, + gssize count, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStreamClass *class; + GInputStream *input_stream; + gssize res; + + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), -1); + + input_stream = G_INPUT_STREAM (stream); + + if (count < -1) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), G_STRFUNC); + return -1; + } + + if (!g_input_stream_set_pending (input_stream, error)) + return -1; + + if (cancellable) + g_cancellable_push_current (cancellable); + + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + res = class->fill (stream, count, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (input_stream); + + return res; +} + +static void +async_fill_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GBufferedInputStream *stream = G_BUFFERED_INPUT_STREAM (source_object); + + g_input_stream_clear_pending (G_INPUT_STREAM (stream)); + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_buffered_input_stream_fill_async: + * @stream: #GBufferedInputStream. + * @count: the number of bytes that will be read from the stream. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object + * @callback: a #GAsyncReadyCallback. + * @user_data: a #gpointer. + * + * Reads data into @stream's buffer asynchronously, up to @count size. + * @io_priority can be used to prioritize reads. For the synchronous + * version of this function, see g_buffered_input_stream_fill(). + * + * If @count is -1 then the attempted read size is equal to the number + * of bytes that are required to fill the buffer. + **/ +void +g_buffered_input_stream_fill_async (GBufferedInputStream *stream, + gssize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GBufferedInputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream)); + + if (count == 0) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_buffered_input_stream_fill_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (count < -1) + { + g_simple_async_report_error_in_idle (G_OBJECT (stream), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), + G_STRFUNC); + return; + } + + if (!g_input_stream_set_pending (G_INPUT_STREAM (stream), &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->fill_async (stream, count, io_priority, cancellable, + async_fill_callback_wrapper, user_data); +} + +/** + * g_buffered_input_stream_fill_finish: + * @stream: a #GBufferedInputStream. + * @result: a #GAsyncResult. + * @error: a #GError. + * + * Finishes an asynchronous read. + * + * Returns: a #gssize of the read stream, or %-1 on an error. + **/ +gssize +g_buffered_input_stream_fill_finish (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GBufferedInputStreamClass *class; + + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), -1); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return -1; + + /* Special case read of 0 bytes */ + if (g_simple_async_result_get_source_tag (simple) == g_buffered_input_stream_fill_async) + return 0; + } + + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + return class->fill_finish (stream, result, error); +} + +/** + * g_buffered_input_stream_get_available: + * @stream: #GBufferedInputStream. + * + * Gets the size of the available data within the stream. + * + * Returns: size of the available stream. + **/ +gsize +g_buffered_input_stream_get_available (GBufferedInputStream *stream) +{ + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), -1); + + return stream->priv->end - stream->priv->pos; +} + +/** + * g_buffered_input_stream_peek: + * @stream: a #GBufferedInputStream. + * @buffer: a pointer to an allocated chunk of memory. + * @offset: a #gsize. + * @count: a #gsize. + * + * Peeks in the buffer, copying data of size @count into @buffer, + * offset @offset bytes. + * + * Returns: a #gsize of the number of bytes peeked, or %-1 on error. + **/ +gsize +g_buffered_input_stream_peek (GBufferedInputStream *stream, + void *buffer, + gsize offset, + gsize count) +{ + gsize available; + gsize end; + + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), -1); + g_return_val_if_fail (buffer != NULL, -1); + + available = g_buffered_input_stream_get_available (stream); + + if (offset > available) + return 0; + + end = MIN (offset + count, available); + count = end - offset; + + memcpy (buffer, stream->priv->buffer + stream->priv->pos + offset, count); + return count; +} + +/** + * g_buffered_input_stream_peek_buffer: + * @stream: a #GBufferedInputStream. + * @count: a #gsize to get the number of bytes available in the buffer. + * + * Returns the buffer with the currently available bytes. The returned + * buffer must not be modified and will become invalid when reading from + * the stream or filling the buffer. + * + * Returns: read-only buffer + **/ +const void* +g_buffered_input_stream_peek_buffer (GBufferedInputStream *stream, + gsize *count) +{ + GBufferedInputStreamPrivate *priv; + + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), NULL); + + priv = stream->priv; + + if (count) + *count = priv->end - priv->pos; + + return priv->buffer + priv->pos; +} + +static void +compact_buffer (GBufferedInputStream *stream) +{ + GBufferedInputStreamPrivate *priv; + gsize current_size; + + priv = stream->priv; + + current_size = priv->end - priv->pos; + + g_memmove (priv->buffer, priv->buffer + priv->pos, current_size); + + priv->pos = 0; + priv->end = current_size; +} + +static gssize +g_buffered_input_stream_real_fill (GBufferedInputStream *stream, + gssize count, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStreamPrivate *priv; + GInputStream *base_stream; + gssize nread; + gsize in_buffer; + + priv = stream->priv; + + if (count == -1) + count = priv->len; + + in_buffer = priv->end - priv->pos; + + /* Never fill more than can fit in the buffer */ + count = MIN (count, priv->len - in_buffer); + + /* If requested length does not fit at end, compact */ + if (priv->len - priv->end < count) + compact_buffer (stream); + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + nread = g_input_stream_read (base_stream, + priv->buffer + priv->end, + count, + cancellable, + error); + + if (nread > 0) + priv->end += nread; + + return nread; +} + +static gssize +g_buffered_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + GBufferedInputStreamClass *class; + GInputStream *base_stream; + gsize available, bytes_skipped; + gssize nread; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + priv = bstream->priv; + + available = priv->end - priv->pos; + + if (count <= available) + { + priv->pos += count; + return count; + } + + /* Full request not available, skip all currently available and + * request refill for more + */ + + priv->pos = 0; + priv->end = 0; + bytes_skipped = available; + count -= available; + + if (bytes_skipped > 0) + error = NULL; /* Ignore further errors if we already read some data */ + + if (count > priv->len) + { + /* Large request, shortcut buffer */ + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + + nread = g_input_stream_skip (base_stream, + count, + cancellable, + error); + + if (nread < 0 && bytes_skipped == 0) + return -1; + + if (nread > 0) + bytes_skipped += nread; + + return bytes_skipped; + } + + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + nread = class->fill (bstream, priv->len, cancellable, error); + + if (nread < 0) + { + if (bytes_skipped == 0) + return -1; + else + return bytes_skipped; + } + + available = priv->end - priv->pos; + count = MIN (count, available); + + bytes_skipped += count; + priv->pos += count; + + return bytes_skipped; +} + +static gssize +g_buffered_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + GBufferedInputStreamClass *class; + GInputStream *base_stream; + gsize available, bytes_read; + gssize nread; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + priv = bstream->priv; + + available = priv->end - priv->pos; + + if (count <= available) + { + memcpy (buffer, priv->buffer + priv->pos, count); + priv->pos += count; + return count; + } + + /* Full request not available, read all currently availbile and request refill for more */ + + memcpy (buffer, priv->buffer + priv->pos, available); + priv->pos = 0; + priv->end = 0; + bytes_read = available; + count -= available; + + if (bytes_read > 0) + error = NULL; /* Ignore further errors if we already read some data */ + + if (count > priv->len) + { + /* Large request, shortcut buffer */ + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + + nread = g_input_stream_read (base_stream, + (char *)buffer + bytes_read, + count, + cancellable, + error); + + if (nread < 0 && bytes_read == 0) + return -1; + + if (nread > 0) + bytes_read += nread; + + return bytes_read; + } + + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + nread = class->fill (bstream, priv->len, cancellable, error); + if (nread < 0) + { + if (bytes_read == 0) + return -1; + else + return bytes_read; + } + + available = priv->end - priv->pos; + count = MIN (count, available); + + memcpy ((char *)buffer + bytes_read, (char *)priv->buffer + priv->pos, count); + bytes_read += count; + priv->pos += count; + + return bytes_read; +} + +/** + * g_buffered_input_stream_read_byte: + * @stream: #GBufferedInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore. + * + * Tries to read a single byte from the stream or the buffer. Will block + * during this read. + * + * On success, the byte read from the stream is returned. On end of stream + * -1 is returned but it's not an exceptional error and @error is not set. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. If an + * operation was partially finished when the operation was cancelled the + * partial result will be returned, without an error. + * + * On error -1 is returned and @error is set accordingly. + * + * Returns: the byte read from the @stream, or -1 on end of stream or error. + **/ +int +g_buffered_input_stream_read_byte (GBufferedInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStreamPrivate *priv; + GBufferedInputStreamClass *class; + GInputStream *input_stream; + gsize available; + gssize nread; + + g_return_val_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream), -1); + + priv = stream->priv; + input_stream = G_INPUT_STREAM (stream); + + if (g_input_stream_is_closed (input_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Stream is already closed")); + return -1; + } + + if (!g_input_stream_set_pending (input_stream, error)) + return -1; + + available = priv->end - priv->pos; + + if (available != 0) + { + g_input_stream_clear_pending (input_stream); + return priv->buffer[priv->pos++]; + } + + /* Byte not available, request refill for more */ + + if (cancellable) + g_cancellable_push_current (cancellable); + + priv->pos = 0; + priv->end = 0; + + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + nread = class->fill (stream, priv->len, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (input_stream); + + if (nread <= 0) + return -1; /* error or end of stream */ + + return priv->buffer[priv->pos++]; +} + +/* ************************** */ +/* Async stuff implementation */ +/* ************************** */ + +static void +fill_async_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error; + gssize res; + GSimpleAsyncResult *simple; + + simple = user_data; + + error = NULL; + res = g_input_stream_read_finish (G_INPUT_STREAM (source_object), + result, &error); + + g_simple_async_result_set_op_res_gssize (simple, res); + if (res == -1) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + else + { + GBufferedInputStreamPrivate *priv; + GObject *object; + + object = g_async_result_get_source_object (G_ASYNC_RESULT (simple)); + priv = G_BUFFERED_INPUT_STREAM (object)->priv; + + g_assert_cmpint (priv->end + res, <=, priv->len); + priv->end += res; + + g_object_unref (object); + } + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +g_buffered_input_stream_real_fill_async (GBufferedInputStream *stream, + gssize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GBufferedInputStreamPrivate *priv; + GInputStream *base_stream; + GSimpleAsyncResult *simple; + gsize in_buffer; + + priv = stream->priv; + + if (count == -1) + count = priv->len; + + in_buffer = priv->end - priv->pos; + + /* Never fill more than can fit in the buffer */ + count = MIN (count, priv->len - in_buffer); + + /* If requested length does not fit at end, compact */ + if (priv->len - priv->end < count) + compact_buffer (stream); + + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, user_data, + g_buffered_input_stream_real_fill_async); + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + g_input_stream_read_async (base_stream, + priv->buffer + priv->end, + count, + io_priority, + cancellable, + fill_async_callback, + simple); +} + +static gssize +g_buffered_input_stream_real_fill_finish (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize nread; + + simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_buffered_input_stream_real_fill_async); + + nread = g_simple_async_result_get_op_res_gssize (simple); + return nread; +} + +typedef struct { + gssize bytes_read; + gssize count; + void *buffer; +} ReadAsyncData; + +static void +free_read_async_data (gpointer _data) +{ + ReadAsyncData *data = _data; + g_slice_free (ReadAsyncData, data); +} + +static void +large_read_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + ReadAsyncData *data; + GError *error; + gssize nread; + + data = g_simple_async_result_get_op_res_gpointer (simple); + + error = NULL; + nread = g_input_stream_read_finish (G_INPUT_STREAM (source_object), + result, &error); + + /* Only report the error if we've not already read some data */ + if (nread < 0 && data->bytes_read == 0) + g_simple_async_result_set_from_error (simple, error); + + if (nread > 0) + data->bytes_read += nread; + + if (error) + g_error_free (error); + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +read_fill_buffer_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + ReadAsyncData *data; + GError *error; + gssize nread; + gsize available; + + bstream = G_BUFFERED_INPUT_STREAM (source_object); + priv = bstream->priv; + + data = g_simple_async_result_get_op_res_gpointer (simple); + + error = NULL; + nread = g_buffered_input_stream_fill_finish (bstream, + result, &error); + + if (nread < 0 && data->bytes_read == 0) + g_simple_async_result_set_from_error (simple, error); + + + if (nread > 0) + { + available = priv->end - priv->pos; + data->count = MIN (data->count, available); + + memcpy ((char *)data->buffer + data->bytes_read, (char *)priv->buffer + priv->pos, data->count); + data->bytes_read += data->count; + priv->pos += data->count; + } + + if (error) + g_error_free (error); + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +g_buffered_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + GBufferedInputStreamClass *class; + GInputStream *base_stream; + gsize available; + GSimpleAsyncResult *simple; + ReadAsyncData *data; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + priv = bstream->priv; + + data = g_slice_new (ReadAsyncData); + data->buffer = buffer; + data->bytes_read = 0; + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, user_data, + g_buffered_input_stream_read_async); + g_simple_async_result_set_op_res_gpointer (simple, data, free_read_async_data); + + available = priv->end - priv->pos; + + if (count <= available) + { + memcpy (buffer, priv->buffer + priv->pos, count); + priv->pos += count; + data->bytes_read = count; + + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + + /* Full request not available, read all currently availbile and request refill for more */ + + memcpy (buffer, priv->buffer + priv->pos, available); + priv->pos = 0; + priv->end = 0; + + count -= available; + + data->bytes_read = available; + data->count = count; + + if (count > priv->len) + { + /* Large request, shortcut buffer */ + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + + g_input_stream_read_async (base_stream, + (char *)buffer + data->bytes_read, + count, + io_priority, cancellable, + large_read_callback, + simple); + } + else + { + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + class->fill_async (bstream, priv->len, io_priority, cancellable, + read_fill_buffer_callback, simple); + } +} + +static gssize +g_buffered_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + ReadAsyncData *data; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_buffered_input_stream_read_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + return data->bytes_read; +} + +typedef struct { + gssize bytes_skipped; + gssize count; +} SkipAsyncData; + +static void +free_skip_async_data (gpointer _data) +{ + SkipAsyncData *data = _data; + g_slice_free (SkipAsyncData, data); +} + +static void +large_skip_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + SkipAsyncData *data; + GError *error; + gssize nread; + + data = g_simple_async_result_get_op_res_gpointer (simple); + + error = NULL; + nread = g_input_stream_skip_finish (G_INPUT_STREAM (source_object), + result, &error); + + /* Only report the error if we've not already read some data */ + if (nread < 0 && data->bytes_skipped == 0) + g_simple_async_result_set_from_error (simple, error); + + if (nread > 0) + data->bytes_skipped += nread; + + if (error) + g_error_free (error); + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +skip_fill_buffer_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + SkipAsyncData *data; + GError *error; + gssize nread; + gsize available; + + bstream = G_BUFFERED_INPUT_STREAM (source_object); + priv = bstream->priv; + + data = g_simple_async_result_get_op_res_gpointer (simple); + + error = NULL; + nread = g_buffered_input_stream_fill_finish (bstream, + result, &error); + + if (nread < 0 && data->bytes_skipped == 0) + g_simple_async_result_set_from_error (simple, error); + + + if (nread > 0) + { + available = priv->end - priv->pos; + data->count = MIN (data->count, available); + + data->bytes_skipped += data->count; + priv->pos += data->count; + } + + if (error) + g_error_free (error); + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +g_buffered_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + GBufferedInputStreamClass *class; + GInputStream *base_stream; + gsize available; + GSimpleAsyncResult *simple; + SkipAsyncData *data; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + priv = bstream->priv; + + data = g_slice_new (SkipAsyncData); + data->bytes_skipped = 0; + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, user_data, + g_buffered_input_stream_skip_async); + g_simple_async_result_set_op_res_gpointer (simple, data, free_skip_async_data); + + available = priv->end - priv->pos; + + if (count <= available) + { + priv->pos += count; + data->bytes_skipped = count; + + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + + /* Full request not available, skip all currently availbile and request refill for more */ + + priv->pos = 0; + priv->end = 0; + + count -= available; + + data->bytes_skipped = available; + data->count = count; + + if (count > priv->len) + { + /* Large request, shortcut buffer */ + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + + g_input_stream_skip_async (base_stream, + count, + io_priority, cancellable, + large_skip_callback, + simple); + } + else + { + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + class->fill_async (bstream, priv->len, io_priority, cancellable, + skip_fill_buffer_callback, simple); + } +} + +static gssize +g_buffered_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + SkipAsyncData *data; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_buffered_input_stream_skip_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + return data->bytes_skipped; +} + + +#define __G_BUFFERED_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gbufferedinputstream.h b/gio/gbufferedinputstream.h new file mode 100644 index 0000000..029426c --- /dev/null +++ b/gio/gbufferedinputstream.h @@ -0,0 +1,123 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_BUFFERED_INPUT_STREAM_H__ +#define __G_BUFFERED_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_BUFFERED_INPUT_STREAM (g_buffered_input_stream_get_type ()) +#define G_BUFFERED_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_BUFFERED_INPUT_STREAM, GBufferedInputStream)) +#define G_BUFFERED_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_BUFFERED_INPUT_STREAM, GBufferedInputStreamClass)) +#define G_IS_BUFFERED_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_BUFFERED_INPUT_STREAM)) +#define G_IS_BUFFERED_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_BUFFERED_INPUT_STREAM)) +#define G_BUFFERED_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_BUFFERED_INPUT_STREAM, GBufferedInputStreamClass)) + +/** + * GBufferedInputStream: + * + * Implements #GFilterInputStream with a sized input buffer. + **/ +typedef struct _GBufferedInputStreamClass GBufferedInputStreamClass; +typedef struct _GBufferedInputStreamPrivate GBufferedInputStreamPrivate; + +struct _GBufferedInputStream +{ + GFilterInputStream parent_instance; + + /*< private >*/ + GBufferedInputStreamPrivate *priv; +}; + +struct _GBufferedInputStreamClass +{ + GFilterInputStreamClass parent_class; + + gssize (* fill) (GBufferedInputStream *stream, + gssize count, + GCancellable *cancellable, + GError **error); + + /* Async ops: (optional in derived classes) */ + void (* fill_async) (GBufferedInputStream *stream, + gssize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gssize (* fill_finish) (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + + +GType g_buffered_input_stream_get_type (void) G_GNUC_CONST; +GInputStream* g_buffered_input_stream_new (GInputStream *base_stream); +GInputStream* g_buffered_input_stream_new_sized (GInputStream *base_stream, + gsize size); + +gsize g_buffered_input_stream_get_buffer_size (GBufferedInputStream *stream); +void g_buffered_input_stream_set_buffer_size (GBufferedInputStream *stream, + gsize size); +gsize g_buffered_input_stream_get_available (GBufferedInputStream *stream); +gsize g_buffered_input_stream_peek (GBufferedInputStream *stream, + void *buffer, + gsize offset, + gsize count); +const void* g_buffered_input_stream_peek_buffer (GBufferedInputStream *stream, + gsize *count); + +gssize g_buffered_input_stream_fill (GBufferedInputStream *stream, + gssize count, + GCancellable *cancellable, + GError **error); +void g_buffered_input_stream_fill_async (GBufferedInputStream *stream, + gssize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gssize g_buffered_input_stream_fill_finish (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error); + +int g_buffered_input_stream_read_byte (GBufferedInputStream *stream, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_BUFFERED_INPUT_STREAM_H__ */ diff --git a/gio/gbufferedoutputstream.c b/gio/gbufferedoutputstream.c new file mode 100644 index 0000000..ec84a61 --- /dev/null +++ b/gio/gbufferedoutputstream.c @@ -0,0 +1,768 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#include "config.h" +#include "gbufferedoutputstream.h" +#include "goutputstream.h" +#include "gsimpleasyncresult.h" +#include "string.h" +#include "glibintl.h" + +#include + +/** + * SECTION:gbufferedoutputstream + * @short_description: Buffered Output Stream + * @include: gio/gio.h + * @see_also: #GFilterOutputStream, #GOutputStream + * + * Buffered output stream implements #GFilterOutputStream and provides + * for buffered writes. + * + * By default, #GBufferedOutputStream's buffer size is set at 4 kilobytes. + * + * To create a buffered output stream, use g_buffered_output_stream_new(), + * or g_buffered_output_stream_new_sized() to specify the buffer's size + * at construction. + * + * To get the size of a buffer within a buffered input stream, use + * g_buffered_output_stream_get_buffer_size(). To change the size of a + * buffered output stream's buffer, use + * g_buffered_output_stream_set_buffer_size(). Note that the buffer's + * size cannot be reduced below the size of the data within the buffer. + **/ + +#define DEFAULT_BUFFER_SIZE 4096 + +struct _GBufferedOutputStreamPrivate { + guint8 *buffer; + gsize len; + goffset pos; + gboolean auto_grow; +}; + +enum { + PROP_0, + PROP_BUFSIZE, + PROP_AUTO_GROW +}; + +static void g_buffered_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static void g_buffered_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_buffered_output_stream_finalize (GObject *object); + + +static gssize g_buffered_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_buffered_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +static gboolean g_buffered_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + +static void g_buffered_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_buffered_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_buffered_output_stream_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_buffered_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_buffered_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_buffered_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); + +G_DEFINE_TYPE (GBufferedOutputStream, + g_buffered_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM) + + +static void +g_buffered_output_stream_class_init (GBufferedOutputStreamClass *klass) +{ + GObjectClass *object_class; + GOutputStreamClass *ostream_class; + + g_type_class_add_private (klass, sizeof (GBufferedOutputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_buffered_output_stream_get_property; + object_class->set_property = g_buffered_output_stream_set_property; + object_class->finalize = g_buffered_output_stream_finalize; + + ostream_class = G_OUTPUT_STREAM_CLASS (klass); + ostream_class->write_fn = g_buffered_output_stream_write; + ostream_class->flush = g_buffered_output_stream_flush; + ostream_class->close_fn = g_buffered_output_stream_close; + ostream_class->write_async = g_buffered_output_stream_write_async; + ostream_class->write_finish = g_buffered_output_stream_write_finish; + ostream_class->flush_async = g_buffered_output_stream_flush_async; + ostream_class->flush_finish = g_buffered_output_stream_flush_finish; + ostream_class->close_async = g_buffered_output_stream_close_async; + ostream_class->close_finish = g_buffered_output_stream_close_finish; + + g_object_class_install_property (object_class, + PROP_BUFSIZE, + g_param_spec_uint ("buffer-size", + P_("Buffer Size"), + P_("The size of the backend buffer"), + 1, + G_MAXUINT, + DEFAULT_BUFFER_SIZE, + G_PARAM_READWRITE|G_PARAM_CONSTRUCT| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, + PROP_AUTO_GROW, + g_param_spec_boolean ("auto-grow", + P_("Auto-grow"), + P_("Whether the buffer should automatically grow"), + FALSE, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + +} + +/** + * g_buffered_output_stream_get_buffer_size: + * @stream: a #GBufferedOutputStream. + * + * Gets the size of the buffer in the @stream. + * + * Returns: the current size of the buffer. + **/ +gsize +g_buffered_output_stream_get_buffer_size (GBufferedOutputStream *stream) +{ + g_return_val_if_fail (G_IS_BUFFERED_OUTPUT_STREAM (stream), -1); + + return stream->priv->len; +} + +/** + * g_buffered_output_stream_set_buffer_size: + * @stream: a #GBufferedOutputStream. + * @size: a #gsize. + * + * Sets the size of the internal buffer to @size. + **/ +void +g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream, + gsize size) +{ + GBufferedOutputStreamPrivate *priv; + guint8 *buffer; + + g_return_if_fail (G_IS_BUFFERED_OUTPUT_STREAM (stream)); + + priv = stream->priv; + + if (size == priv->len) + return; + + if (priv->buffer) + { + size = MAX (size, priv->pos); + + buffer = g_malloc (size); + memcpy (buffer, priv->buffer, priv->pos); + g_free (priv->buffer); + priv->buffer = buffer; + priv->len = size; + /* Keep old pos */ + } + else + { + priv->buffer = g_malloc (size); + priv->len = size; + priv->pos = 0; + } + + g_object_notify (G_OBJECT (stream), "buffer-size"); +} + +/** + * g_buffered_output_stream_get_auto_grow: + * @stream: a #GBufferedOutputStream. + * + * Checks if the buffer automatically grows as data is added. + * + * Returns: %TRUE if the @stream's buffer automatically grows, + * %FALSE otherwise. + **/ +gboolean +g_buffered_output_stream_get_auto_grow (GBufferedOutputStream *stream) +{ + g_return_val_if_fail (G_IS_BUFFERED_OUTPUT_STREAM (stream), FALSE); + + return stream->priv->auto_grow; +} + +/** + * g_buffered_output_stream_set_auto_grow: + * @stream: a #GBufferedOutputStream. + * @auto_grow: a #gboolean. + * + * Sets whether or not the @stream's buffer should automatically grow. + * If @auto_grow is true, then each write will just make the buffer + * larger, and you must manually flush the buffer to actually write out + * the data to the underlying stream. + **/ +void +g_buffered_output_stream_set_auto_grow (GBufferedOutputStream *stream, + gboolean auto_grow) +{ + GBufferedOutputStreamPrivate *priv; + g_return_if_fail (G_IS_BUFFERED_OUTPUT_STREAM (stream)); + priv = stream->priv; + auto_grow = auto_grow != FALSE; + if (priv->auto_grow != auto_grow) + { + priv->auto_grow = auto_grow; + g_object_notify (G_OBJECT (stream), "auto-grow"); + } +} + +static void +g_buffered_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GBufferedOutputStream *stream; + + stream = G_BUFFERED_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BUFSIZE: + g_buffered_output_stream_set_buffer_size (stream, g_value_get_uint (value)); + break; + + case PROP_AUTO_GROW: + g_buffered_output_stream_set_auto_grow (stream, g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_buffered_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GBufferedOutputStream *buffered_stream; + GBufferedOutputStreamPrivate *priv; + + buffered_stream = G_BUFFERED_OUTPUT_STREAM (object); + priv = buffered_stream->priv; + + switch (prop_id) + { + case PROP_BUFSIZE: + g_value_set_uint (value, priv->len); + break; + + case PROP_AUTO_GROW: + g_value_set_boolean (value, priv->auto_grow); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_buffered_output_stream_finalize (GObject *object) +{ + GBufferedOutputStream *stream; + GBufferedOutputStreamPrivate *priv; + + stream = G_BUFFERED_OUTPUT_STREAM (object); + priv = stream->priv; + + g_free (priv->buffer); + + G_OBJECT_CLASS (g_buffered_output_stream_parent_class)->finalize (object); +} + +static void +g_buffered_output_stream_init (GBufferedOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_BUFFERED_OUTPUT_STREAM, + GBufferedOutputStreamPrivate); + +} + +/** + * g_buffered_output_stream_new: + * @base_stream: a #GOutputStream. + * + * Creates a new buffered output stream for a base stream. + * + * Returns: a #GOutputStream for the given @base_stream. + **/ +GOutputStream * +g_buffered_output_stream_new (GOutputStream *base_stream) +{ + GOutputStream *stream; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_BUFFERED_OUTPUT_STREAM, + "base-stream", base_stream, + NULL); + + return stream; +} + +/** + * g_buffered_output_stream_new_sized: + * @base_stream: a #GOutputStream. + * @size: a #gsize. + * + * Creates a new buffered output stream with a given buffer size. + * + * Returns: a #GOutputStream with an internal buffer set to @size. + **/ +GOutputStream * +g_buffered_output_stream_new_sized (GOutputStream *base_stream, + gsize size) +{ + GOutputStream *stream; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_BUFFERED_OUTPUT_STREAM, + "base-stream", base_stream, + "buffer-size", size, + NULL); + + return stream; +} + +static gboolean +flush_buffer (GBufferedOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GBufferedOutputStreamPrivate *priv; + GOutputStream *base_stream; + gboolean res; + gsize bytes_written; + gsize count; + + priv = stream->priv; + bytes_written = 0; + base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (base_stream), FALSE); + + res = g_output_stream_write_all (base_stream, + priv->buffer, + priv->pos, + &bytes_written, + cancellable, + error); + + count = priv->pos - bytes_written; + + if (count > 0) + g_memmove (priv->buffer, priv->buffer + bytes_written, count); + + priv->pos -= bytes_written; + + return res; +} + +static gssize +g_buffered_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GBufferedOutputStream *bstream; + GBufferedOutputStreamPrivate *priv; + gboolean res; + gsize n; + gsize new_size; + + bstream = G_BUFFERED_OUTPUT_STREAM (stream); + priv = bstream->priv; + + n = priv->len - priv->pos; + + if (priv->auto_grow && n < count) + { + new_size = MAX (priv->len * 2, priv->len + count); + g_buffered_output_stream_set_buffer_size (bstream, new_size); + } + else if (n == 0) + { + res = flush_buffer (bstream, cancellable, error); + + if (res == FALSE) + return -1; + } + + n = priv->len - priv->pos; + + count = MIN (count, n); + memcpy (priv->buffer + priv->pos, buffer, count); + priv->pos += count; + + return count; +} + +static gboolean +g_buffered_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GBufferedOutputStream *bstream; + GOutputStream *base_stream; + gboolean res; + + bstream = G_BUFFERED_OUTPUT_STREAM (stream); + base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + + res = flush_buffer (bstream, cancellable, error); + + if (res == FALSE) + return FALSE; + + res = g_output_stream_flush (base_stream, cancellable, error); + + return res; +} + +static gboolean +g_buffered_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GBufferedOutputStream *bstream; + GOutputStream *base_stream; + gboolean res; + + bstream = G_BUFFERED_OUTPUT_STREAM (stream); + base_stream = G_FILTER_OUTPUT_STREAM (bstream)->base_stream; + res = flush_buffer (bstream, cancellable, error); + + if (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (stream))) + { + /* report the first error but still close the stream */ + if (res) + res = g_output_stream_close (base_stream, cancellable, error); + else + g_output_stream_close (base_stream, cancellable, NULL); + } + + return res; +} + +/* ************************** */ +/* Async stuff implementation */ +/* ************************** */ + +/* TODO: This should be using the base class async ops, not threads */ + +typedef struct { + + guint flush_stream : 1; + guint close_stream : 1; + +} FlushData; + +static void +free_flush_data (gpointer data) +{ + g_slice_free (FlushData, data); +} + +/* This function is used by all three (i.e. + * _write, _flush, _close) functions since + * all of them will need to flush the buffer + * and so closing and writing is just a special + * case of flushing + some addition stuff */ +static void +flush_buffer_thread (GSimpleAsyncResult *result, + GObject *object, + GCancellable *cancellable) +{ + GBufferedOutputStream *stream; + GOutputStream *base_stream; + FlushData *fdata; + gboolean res; + GError *error = NULL; + + stream = G_BUFFERED_OUTPUT_STREAM (object); + fdata = g_simple_async_result_get_op_res_gpointer (result); + base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + + res = flush_buffer (stream, cancellable, &error); + + /* if flushing the buffer didn't work don't even bother + * to flush the stream but just report that error */ + if (res && fdata->flush_stream) + res = g_output_stream_flush (base_stream, cancellable, &error); + + if (fdata->close_stream) + { + + /* if flushing the buffer or the stream returned + * an error report that first error but still try + * close the stream */ + if (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (stream))) + { + if (res == FALSE) + g_output_stream_close (base_stream, cancellable, NULL); + else + res = g_output_stream_close (base_stream, cancellable, &error); + } + } + + if (res == FALSE) + { + g_simple_async_result_set_from_error (result, error); + g_error_free (error); + } +} + +typedef struct { + + FlushData fdata; + + gsize count; + const void *buffer; + +} WriteData; + +static void +free_write_data (gpointer data) +{ + g_slice_free (WriteData, data); +} + +static void +g_buffered_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GBufferedOutputStream *buffered_stream; + GBufferedOutputStreamPrivate *priv; + GSimpleAsyncResult *res; + WriteData *wdata; + + buffered_stream = G_BUFFERED_OUTPUT_STREAM (stream); + priv = buffered_stream->priv; + + wdata = g_slice_new (WriteData); + wdata->count = count; + wdata->buffer = buffer; + + res = g_simple_async_result_new (G_OBJECT (stream), + callback, + data, + g_buffered_output_stream_write_async); + + g_simple_async_result_set_op_res_gpointer (res, wdata, free_write_data); + + /* if we have space left directly call the + * callback (from idle) otherwise schedule a buffer + * flush in the thread. In both cases the actual + * copying of the data to the buffer will be done in + * the write_finish () func since that should + * be fast enough */ + if (priv->len - priv->pos > 0) + { + g_simple_async_result_complete_in_idle (res); + } + else + { + wdata->fdata.flush_stream = FALSE; + wdata->fdata.close_stream = FALSE; + g_simple_async_result_run_in_thread (res, + flush_buffer_thread, + io_priority, + cancellable); + g_object_unref (res); + } +} + +static gssize +g_buffered_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GBufferedOutputStreamPrivate *priv; + GBufferedOutputStream *buffered_stream; + GSimpleAsyncResult *simple; + WriteData *wdata; + gssize count; + + simple = G_SIMPLE_ASYNC_RESULT (result); + buffered_stream = G_BUFFERED_OUTPUT_STREAM (stream); + priv = buffered_stream->priv; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_buffered_output_stream_write_async); + + wdata = g_simple_async_result_get_op_res_gpointer (simple); + + /* Now do the real copying of data to the buffer */ + count = priv->len - priv->pos; + count = MIN (wdata->count, count); + + memcpy (priv->buffer + priv->pos, wdata->buffer, count); + + priv->pos += count; + + return count; +} + +static void +g_buffered_output_stream_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GSimpleAsyncResult *res; + FlushData *fdata; + + fdata = g_slice_new (FlushData); + fdata->flush_stream = TRUE; + fdata->close_stream = FALSE; + + res = g_simple_async_result_new (G_OBJECT (stream), + callback, + data, + g_buffered_output_stream_flush_async); + + g_simple_async_result_set_op_res_gpointer (res, fdata, free_flush_data); + + g_simple_async_result_run_in_thread (res, + flush_buffer_thread, + io_priority, + cancellable); + g_object_unref (res); +} + +static gboolean +g_buffered_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_buffered_output_stream_flush_async); + + return TRUE; +} + +static void +g_buffered_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GSimpleAsyncResult *res; + FlushData *fdata; + + fdata = g_slice_new (FlushData); + fdata->close_stream = TRUE; + + res = g_simple_async_result_new (G_OBJECT (stream), + callback, + data, + g_buffered_output_stream_close_async); + + g_simple_async_result_set_op_res_gpointer (res, fdata, free_flush_data); + + g_simple_async_result_run_in_thread (res, + flush_buffer_thread, + io_priority, + cancellable); + g_object_unref (res); +} + +static gboolean +g_buffered_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_buffered_output_stream_close_async); + + return TRUE; +} + +#define __G_BUFFERED_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gbufferedoutputstream.h b/gio/gbufferedoutputstream.h new file mode 100644 index 0000000..106bca7 --- /dev/null +++ b/gio/gbufferedoutputstream.h @@ -0,0 +1,82 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_BUFFERED_OUTPUT_STREAM_H__ +#define __G_BUFFERED_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_BUFFERED_OUTPUT_STREAM (g_buffered_output_stream_get_type ()) +#define G_BUFFERED_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_BUFFERED_OUTPUT_STREAM, GBufferedOutputStream)) +#define G_BUFFERED_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_BUFFERED_OUTPUT_STREAM, GBufferedOutputStreamClass)) +#define G_IS_BUFFERED_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_BUFFERED_OUTPUT_STREAM)) +#define G_IS_BUFFERED_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_BUFFERED_OUTPUT_STREAM)) +#define G_BUFFERED_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_BUFFERED_OUTPUT_STREAM, GBufferedOutputStreamClass)) + +/** + * GBufferedOutputStream: + * @parent_class: The parent class. + * + * An implementation of #GFilterOutputStream with a sized buffer. + **/ +typedef struct _GBufferedOutputStreamClass GBufferedOutputStreamClass; +typedef struct _GBufferedOutputStreamPrivate GBufferedOutputStreamPrivate; + +struct _GBufferedOutputStream +{ + GFilterOutputStream parent_instance; + + /*< protected >*/ + GBufferedOutputStreamPrivate *priv; +}; + +struct _GBufferedOutputStreamClass +{ + GFilterOutputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); +}; + + +GType g_buffered_output_stream_get_type (void) G_GNUC_CONST; +GOutputStream* g_buffered_output_stream_new (GOutputStream *base_stream); +GOutputStream* g_buffered_output_stream_new_sized (GOutputStream *base_stream, + gsize size); +gsize g_buffered_output_stream_get_buffer_size (GBufferedOutputStream *stream); +void g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream, + gsize size); +gboolean g_buffered_output_stream_get_auto_grow (GBufferedOutputStream *stream); +void g_buffered_output_stream_set_auto_grow (GBufferedOutputStream *stream, + gboolean auto_grow); + +G_END_DECLS + +#endif /* __G_BUFFERED_OUTPUT_STREAM_H__ */ diff --git a/gio/gcancellable.c b/gio/gcancellable.c new file mode 100644 index 0000000..07b61b7 --- /dev/null +++ b/gio/gcancellable.c @@ -0,0 +1,773 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#ifdef G_OS_WIN32 +#include +#include +#endif +#include "gcancellable.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gcancellable + * @short_description: Thread-safe Operation Cancellation Stack + * @include: gio/gio.h + * + * GCancellable is a thread-safe operation cancellation stack used + * throughout GIO to allow for cancellation of synchronous and + * asynchronous operations. + */ + +enum { + CANCELLED, + LAST_SIGNAL +}; + +struct _GCancellablePrivate +{ + guint cancelled : 1; + guint cancelled_running : 1; + guint cancelled_running_waiting : 1; + + guint fd_refcount; + int cancel_pipe[2]; + +#ifdef G_OS_WIN32 + HANDLE event; +#endif +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (GCancellable, g_cancellable, G_TYPE_OBJECT); + +static GStaticPrivate current_cancellable = G_STATIC_PRIVATE_INIT; +G_LOCK_DEFINE_STATIC(cancellable); +static GCond *cancellable_cond = NULL; + +static void +g_cancellable_close_pipe (GCancellable *cancellable) +{ + GCancellablePrivate *priv; + + priv = cancellable->priv; + + if (priv->cancel_pipe[0] != -1) + { + close (priv->cancel_pipe[0]); + priv->cancel_pipe[0] = -1; + } + + if (priv->cancel_pipe[1] != -1) + { + close (priv->cancel_pipe[1]); + priv->cancel_pipe[1] = -1; + } + +#ifdef G_OS_WIN32 + if (priv->event) + { + CloseHandle (priv->event); + priv->event = NULL; + } +#endif +} + +static void +g_cancellable_finalize (GObject *object) +{ + GCancellable *cancellable = G_CANCELLABLE (object); + + g_cancellable_close_pipe (cancellable); + + G_OBJECT_CLASS (g_cancellable_parent_class)->finalize (object); +} + +static void +g_cancellable_class_init (GCancellableClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GCancellablePrivate)); + + if (cancellable_cond == NULL && g_thread_supported ()) + cancellable_cond = g_cond_new (); + + gobject_class->finalize = g_cancellable_finalize; + + /** + * GCancellable::cancelled: + * @cancellable: a #GCancellable. + * + * Emitted when the operation has been cancelled. + * + * Can be used by implementations of cancellable operations. If the + * operation is cancelled from another thread, the signal will be + * emitted in the thread that cancelled the operation, not the + * thread that is running the operation. + * + * Note that disconnecting from this signal (or any signal) in a + * multi-threaded program is prone to race conditions. For instance + * it is possible that a signal handler may be invoked even + * after a call to + * g_signal_handler_disconnect() for that handler has already + * returned. + * + * There is also a problem when cancellation happen + * right before connecting to the signal. If this happens the + * signal will unexpectedly not be emitted, and checking before + * connecting to the signal leaves a race condition where this is + * still happening. + * + * In order to make it safe and easy to connect handlers there + * are two helper functions: g_cancellable_connect() and + * g_cancellable_disconnect() which protect against problems + * like this. + * + * An example of how to us this: + * |[ + * /* Make sure we don't do any unnecessary work if already cancelled */ + * if (g_cancellable_set_error_if_cancelled (cancellable)) + * return; + * + * /* Set up all the data needed to be able to + * * handle cancellation of the operation */ + * my_data = my_data_new (...); + * + * id = 0; + * if (cancellable) + * id = g_cancellable_connect (cancellable, + * G_CALLBACK (cancelled_handler) + * data, NULL); + * + * /* cancellable operation here... */ + * + * g_cancellable_disconnect (cancellable, id); + * + * /* cancelled_handler is never called after this, it + * * is now safe to free the data */ + * my_data_free (my_data); + * ]| + * + * Note that the cancelled signal is emitted in the thread that + * the user cancelled from, which may be the main thread. So, the + * cancellable signal should not do something that can block. + */ + signals[CANCELLED] = + g_signal_new (I_("cancelled"), + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GCancellableClass, cancelled), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + +} + +#ifndef G_OS_WIN32 +static void +set_fd_nonblocking (int fd) +{ +#ifdef F_GETFL + glong fcntl_flags; + fcntl_flags = fcntl (fd, F_GETFL); + +#ifdef O_NONBLOCK + fcntl_flags |= O_NONBLOCK; +#else + fcntl_flags |= O_NDELAY; +#endif + + fcntl (fd, F_SETFL, fcntl_flags); +#endif +} + +static void +set_fd_close_exec (int fd) +{ + int flags; + + flags = fcntl (fd, F_GETFD, 0); + if (flags != -1 && (flags & FD_CLOEXEC) == 0) + { + flags |= FD_CLOEXEC; + fcntl (fd, F_SETFD, flags); + } +} + + +static void +g_cancellable_open_pipe (GCancellable *cancellable) +{ + GCancellablePrivate *priv; + + priv = cancellable->priv; + if (pipe (priv->cancel_pipe) == 0) + { + /* Make them nonblocking, just to be sure we don't block + * on errors and stuff + */ + set_fd_nonblocking (priv->cancel_pipe[0]); + set_fd_nonblocking (priv->cancel_pipe[1]); + set_fd_close_exec (priv->cancel_pipe[0]); + set_fd_close_exec (priv->cancel_pipe[1]); + + if (priv->cancelled) + { + const char ch = 'x'; + gssize c; + + do + c = write (priv->cancel_pipe[1], &ch, 1); + while (c == -1 && errno == EINTR); + } + } +} +#endif + +static void +g_cancellable_init (GCancellable *cancellable) +{ + cancellable->priv = G_TYPE_INSTANCE_GET_PRIVATE (cancellable, + G_TYPE_CANCELLABLE, + GCancellablePrivate); + cancellable->priv->cancel_pipe[0] = -1; + cancellable->priv->cancel_pipe[1] = -1; +} + +/** + * g_cancellable_new: + * + * Creates a new #GCancellable object. + * + * Applications that want to start one or more operations + * that should be cancellable should create a #GCancellable + * and pass it to the operations. + * + * One #GCancellable can be used in multiple consecutive + * operations, but not in multiple concurrent operations. + * + * Returns: a #GCancellable. + **/ +GCancellable * +g_cancellable_new (void) +{ + return g_object_new (G_TYPE_CANCELLABLE, NULL); +} + +/** + * g_cancellable_push_current: + * @cancellable: a #GCancellable object + * + * Pushes @cancellable onto the cancellable stack. The current + * cancllable can then be recieved using g_cancellable_get_current(). + * + * This is useful when implementing cancellable operations in + * code that does not allow you to pass down the cancellable object. + * + * This is typically called automatically by e.g. #GFile operations, + * so you rarely have to call this yourself. + **/ +void +g_cancellable_push_current (GCancellable *cancellable) +{ + GSList *l; + + g_return_if_fail (cancellable != NULL); + + l = g_static_private_get (¤t_cancellable); + l = g_slist_prepend (l, cancellable); + g_static_private_set (¤t_cancellable, l, NULL); +} + +/** + * g_cancellable_pop_current: + * @cancellable: a #GCancellable object + * + * Pops @cancellable off the cancellable stack (verifying that @cancellable + * is on the top of the stack). + **/ +void +g_cancellable_pop_current (GCancellable *cancellable) +{ + GSList *l; + + l = g_static_private_get (¤t_cancellable); + + g_return_if_fail (l != NULL); + g_return_if_fail (l->data == cancellable); + + l = g_slist_delete_link (l, l); + g_static_private_set (¤t_cancellable, l, NULL); +} + +/** + * g_cancellable_get_current: + * + * Gets the top cancellable from the stack. + * + * Returns: a #GCancellable from the top of the stack, or %NULL + * if the stack is empty. + **/ +GCancellable * +g_cancellable_get_current (void) +{ + GSList *l; + + l = g_static_private_get (¤t_cancellable); + if (l == NULL) + return NULL; + + return G_CANCELLABLE (l->data); +} + +/** + * g_cancellable_reset: + * @cancellable: a #GCancellable object. + * + * Resets @cancellable to its uncancelled state. + **/ +void +g_cancellable_reset (GCancellable *cancellable) +{ + GCancellablePrivate *priv; + + g_return_if_fail (G_IS_CANCELLABLE (cancellable)); + + G_LOCK(cancellable); + + priv = cancellable->priv; + + while (priv->cancelled_running) + { + priv->cancelled_running_waiting = TRUE; + g_cond_wait (cancellable_cond, + g_static_mutex_get_mutex (& G_LOCK_NAME (cancellable))); + } + + if (priv->cancelled) + { + /* Make sure we're not leaving old cancel state around */ + +#ifdef G_OS_WIN32 + if (priv->event) + ResetEvent (priv->event); +#endif + if (priv->cancel_pipe[0] != -1) + { + gssize c; + char ch; + + do + c = read (priv->cancel_pipe[0], &ch, 1); + while (c == -1 && errno == EINTR); + } + + priv->cancelled = FALSE; + } + G_UNLOCK(cancellable); +} + +/** + * g_cancellable_is_cancelled: + * @cancellable: a #GCancellable or NULL. + * + * Checks if a cancellable job has been cancelled. + * + * Returns: %TRUE if @cancellable is cancelled, + * FALSE if called with %NULL or if item is not cancelled. + **/ +gboolean +g_cancellable_is_cancelled (GCancellable *cancellable) +{ + return cancellable != NULL && cancellable->priv->cancelled; +} + +/** + * g_cancellable_set_error_if_cancelled: + * @cancellable: a #GCancellable object. + * @error: #GError to append error state to. + * + * If the @cancellable is cancelled, sets the error to notify + * that the operation was cancelled. + * + * Returns: %TRUE if @cancellable was cancelled, %FALSE if it was not. + **/ +gboolean +g_cancellable_set_error_if_cancelled (GCancellable *cancellable, + GError **error) +{ + if (g_cancellable_is_cancelled (cancellable)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANCELLED, + _("Operation was cancelled")); + return TRUE; + } + + return FALSE; +} + +/** + * g_cancellable_get_fd: + * @cancellable: a #GCancellable. + * + * Gets the file descriptor for a cancellable job. This can be used to + * implement cancellable operations on Unix systems. The returned fd will + * turn readable when @cancellable is cancelled. + * + * You are not supposed to read from the fd yourself, just check for + * readable status. Reading to unset the readable status is done + * with g_cancellable_reset(). + * + * After a successful return from this function, you should use + * g_cancellable_release_fd() to free up resources allocated for + * the returned file descriptor. + * + * See also g_cancellable_make_pollfd(). + * + * Returns: A valid file descriptor. %-1 if the file descriptor + * is not supported, or on errors. + **/ +int +g_cancellable_get_fd (GCancellable *cancellable) +{ + GCancellablePrivate *priv; + int fd; + + if (cancellable == NULL) + return -1; + + priv = cancellable->priv; + +#ifdef G_OS_WIN32 + return -1; +#else + G_LOCK(cancellable); + if (priv->cancel_pipe[0] == -1) + g_cancellable_open_pipe (cancellable); + fd = priv->cancel_pipe[0]; + if (fd != -1) + priv->fd_refcount++; + G_UNLOCK(cancellable); +#endif + + return fd; +} + +/** + * g_cancellable_make_pollfd: + * @cancellable: a #GCancellable or %NULL + * @pollfd: a pointer to a #GPollFD + * + * Creates a #GPollFD corresponding to @cancellable; this can be passed + * to g_poll() and used to poll for cancellation. This is useful both + * for unix systems without a native poll and for portability to + * windows. + * + * When this function returns %TRUE, you should use + * g_cancellable_release_fd() to free up resources allocated for the + * @pollfd. After a %FALSE return, do not call g_cancellable_release_fd(). + * + * If this function returns %FALSE, either no @cancellable was given or + * resource limits prevent this function from allocating the necessary + * structures for polling. (On Linux, you will likely have reached + * the maximum number of file descriptors.) The suggested way to handle + * these cases is to ignore the @cancellable. + * + * You are not supposed to read from the fd yourself, just check for + * readable status. Reading to unset the readable status is done + * with g_cancellable_reset(). + * + * Returns: %TRUE if @pollfd was successfully initialized, %FALSE on + * failure to prepare the cancellable. + * + * Since: 2.22 + **/ +gboolean +g_cancellable_make_pollfd (GCancellable *cancellable, GPollFD *pollfd) +{ + g_return_val_if_fail (pollfd != NULL, FALSE); + if (cancellable == NULL) + return FALSE; + g_return_val_if_fail (G_IS_CANCELLABLE (cancellable), FALSE); + + { +#ifdef G_OS_WIN32 + GCancellablePrivate *priv; + + priv = cancellable->priv; + G_LOCK(cancellable); + if (priv->event == NULL) + { + /* A manual reset anonymous event, starting unset */ + priv->event = CreateEvent (NULL, TRUE, FALSE, NULL); + if (priv->event == NULL) + { + G_UNLOCK(cancellable); + return FALSE; + } + if (priv->cancelled) + SetEvent(priv->event); + } + priv->fd_refcount++; + G_UNLOCK(cancellable); + + pollfd->fd = (gintptr)priv->event; +#else /* !G_OS_WIN32 */ + int fd = g_cancellable_get_fd (cancellable); + + if (fd == -1) + return FALSE; + pollfd->fd = fd; +#endif /* G_OS_WIN32 */ + } + + pollfd->events = G_IO_IN; + pollfd->revents = 0; + + return TRUE; +} + +/** + * g_cancellable_release_fd: + * @cancellable: a #GCancellable + * + * Releases a resources previously allocated by g_cancellable_get_fd() + * or g_cancellable_make_pollfd(). + * + * For compatibility reasons with older releases, calling this function + * is not strictly required, the resources will be automatically freed + * when the @cancellable is finalized. However, the @cancellable will + * block scarce file descriptors until it is finalized if this function + * is not called. This can cause the application to run out of file + * descriptors when many #GCancellables are used at the same time. + * + * Since: 2.22 + **/ +void +g_cancellable_release_fd (GCancellable *cancellable) +{ + GCancellablePrivate *priv; + + g_return_if_fail (G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (cancellable->priv->fd_refcount > 0); + + priv = cancellable->priv; + + G_LOCK (cancellable); + priv->fd_refcount--; + if (priv->fd_refcount == 0) + g_cancellable_close_pipe (cancellable); + G_UNLOCK (cancellable); +} + +/** + * g_cancellable_cancel: + * @cancellable: a #GCancellable object. + * + * Will set @cancellable to cancelled, and will emit the + * #GCancellable::cancelled signal. (However, see the warning about + * race conditions in the documentation for that signal if you are + * planning to connect to it.) + * + * This function is thread-safe. In other words, you can safely call + * it from a thread other than the one running the operation that was + * passed the @cancellable. + * + * The convention within gio is that cancelling an asynchronous + * operation causes it to complete asynchronously. That is, if you + * cancel the operation from the same thread in which it is running, + * then the operation's #GAsyncReadyCallback will not be invoked until + * the application returns to the main loop. + **/ +void +g_cancellable_cancel (GCancellable *cancellable) +{ + gboolean cancel; + GCancellablePrivate *priv; + + if (cancellable == NULL || + cancellable->priv->cancelled) + return; + + priv = cancellable->priv; + cancel = FALSE; + + G_LOCK(cancellable); + cancel = TRUE; + priv->cancelled = TRUE; + priv->cancelled_running = TRUE; +#ifdef G_OS_WIN32 + if (priv->event) + SetEvent (priv->event); +#endif + if (priv->cancel_pipe[1] != -1) + { + const char ch = 'x'; + gssize c; + + do + c = write (priv->cancel_pipe[1], &ch, 1); + while (c == -1 && errno == EINTR); + } + G_UNLOCK(cancellable); + + if (cancel) + { + g_object_ref (cancellable); + g_signal_emit (cancellable, signals[CANCELLED], 0); + + G_LOCK(cancellable); + + priv->cancelled_running = FALSE; + if (priv->cancelled_running_waiting) + g_cond_broadcast (cancellable_cond); + priv->cancelled_running_waiting = FALSE; + + G_UNLOCK(cancellable); + + g_object_unref (cancellable); + } +} + +/** + * g_cancellable_connect: + * @cancellable: A #GCancellable. + * @callback: The #GCallback to connect. + * @data: Data to pass to @callback. + * @data_destroy_func: Free function for @data or %NULL. + * + * Convenience function to connect to the #GCancellable::cancelled + * signal. Also handles the race condition that may happen + * if the cancellable is cancelled right before connecting. + * + * @callback is called at most once, either directly at the + * time of the connect if @cancellable is already cancelled, + * or when @cancellable is cancelled in some thread. + * + * @data_destroy_func will be called when the handler is + * disconnected, or immediately if the cancellable is already + * cancelled. + * + * See #GCancellable::cancelled for details on how to use this. + * + * Returns: The id of the signal handler or 0 if @cancellable has already + * been cancelled. + * + * Since: 2.22 + */ +gulong +g_cancellable_connect (GCancellable *cancellable, + GCallback callback, + gpointer data, + GDestroyNotify data_destroy_func) +{ + gulong id; + + g_return_val_if_fail (G_IS_CANCELLABLE (cancellable), 0); + + G_LOCK (cancellable); + + if (cancellable->priv->cancelled) + { + void (*_callback) (GCancellable *cancellable, + gpointer user_data); + + _callback = (void *)callback; + id = 0; + + _callback (cancellable, data); + + if (data_destroy_func) + data_destroy_func (data); + } + else + { + id = g_signal_connect_data (cancellable, "cancelled", + callback, data, + (GClosureNotify) data_destroy_func, + 0); + } + G_UNLOCK (cancellable); + + return id; +} + +/** + * g_cancellable_disconnect: + * @cancellable: A #GCancellable or %NULL. + * @handler_id: Handler id of the handler to be disconnected, or %0. + * + * Disconnects a handler from a cancellable instance similar to + * g_signal_handler_disconnect(). Additionally, in the event that a + * signal handler is currently running, this call will block until the + * handler has finished. Calling this function from a + * #GCancellable::cancelled signal handler will therefore result in a + * deadlock. + * + * This avoids a race condition where a thread cancels at the + * same time as the cancellable operation is finished and the + * signal handler is removed. See #GCancellable::cancelled for + * details on how to use this. + * + * If @cancellable is %NULL or @handler_id is %0 this function does + * nothing. + * + * Since: 2.22 + */ +void +g_cancellable_disconnect (GCancellable *cancellable, + gulong handler_id) +{ + GCancellablePrivate *priv; + + if (handler_id == 0 || cancellable == NULL) + return; + + G_LOCK (cancellable); + + priv = cancellable->priv; + + while (priv->cancelled_running) + { + priv->cancelled_running_waiting = TRUE; + g_cond_wait (cancellable_cond, + g_static_mutex_get_mutex (& G_LOCK_NAME (cancellable))); + } + + g_signal_handler_disconnect (cancellable, handler_id); + G_UNLOCK (cancellable); +} + +#define __G_CANCELLABLE_C__ +#include "gioaliasdef.c" diff --git a/gio/gcancellable.h b/gio/gcancellable.h new file mode 100644 index 0000000..dc73ccd --- /dev/null +++ b/gio/gcancellable.h @@ -0,0 +1,103 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CANCELLABLE_H__ +#define __G_CANCELLABLE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_CANCELLABLE (g_cancellable_get_type ()) +#define G_CANCELLABLE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_CANCELLABLE, GCancellable)) +#define G_CANCELLABLE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_CANCELLABLE, GCancellableClass)) +#define G_IS_CANCELLABLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_CANCELLABLE)) +#define G_IS_CANCELLABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CANCELLABLE)) +#define G_CANCELLABLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CANCELLABLE, GCancellableClass)) + +/** + * GCancellable: + * + * Allows actions to be cancelled. + */ +typedef struct _GCancellableClass GCancellableClass; +typedef struct _GCancellablePrivate GCancellablePrivate; + +struct _GCancellable +{ + GObject parent_instance; + + /*< private >*/ + GCancellablePrivate *priv; +}; + +struct _GCancellableClass +{ + GObjectClass parent_class; + + void (* cancelled) (GCancellable *cancellable); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_cancellable_get_type (void) G_GNUC_CONST; + +GCancellable *g_cancellable_new (void); + +/* These are only safe to call inside a cancellable op */ +gboolean g_cancellable_is_cancelled (GCancellable *cancellable); +gboolean g_cancellable_set_error_if_cancelled (GCancellable *cancellable, + GError **error); + +int g_cancellable_get_fd (GCancellable *cancellable); +gboolean g_cancellable_make_pollfd (GCancellable *cancellable, + GPollFD *pollfd); +void g_cancellable_release_fd (GCancellable *cancellable); + +GCancellable *g_cancellable_get_current (void); +void g_cancellable_push_current (GCancellable *cancellable); +void g_cancellable_pop_current (GCancellable *cancellable); +void g_cancellable_reset (GCancellable *cancellable); +gulong g_cancellable_connect (GCancellable *cancellable, + GCallback callback, + gpointer data, + GDestroyNotify data_destroy_func); +void g_cancellable_disconnect (GCancellable *cancellable, + gulong handler_id); + + +/* This is safe to call from another thread */ +void g_cancellable_cancel (GCancellable *cancellable); + +G_END_DECLS + +#endif /* __G_CANCELLABLE_H__ */ diff --git a/gio/gcharsetconverter.c b/gio/gcharsetconverter.c new file mode 100644 index 0000000..35b0a5a --- /dev/null +++ b/gio/gcharsetconverter.c @@ -0,0 +1,478 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gcontenttypeprivate.h" +#include "gcharsetconverter.h" +#include "glib.h" +#include "ginitable.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +enum { + PROP_0, + PROP_FROM_CHARSET, + PROP_TO_CHARSET, + PROP_USE_FALLBACK +}; + +/** + * SECTION:gcharsetconverter + * @short_description: Convert between charsets + * @include: gio/gio.h + * + * #GCharsetConverter is an implementation of #GConverter based on + * GIConv. + */ + +static void g_charset_converter_iface_init (GConverterIface *iface); +static void g_charset_converter_initable_iface_init (GInitableIface *iface); + +/** + * GCharsetConverter: + * + * Conversions between character sets. + */ +struct _GCharsetConverter +{ + GObject parent_instance; + + char *from; + char *to; + GIConv iconv; + gboolean use_fallback; + guint n_fallback_errors; +}; + +G_DEFINE_TYPE_WITH_CODE (GCharsetConverter, g_charset_converter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, + g_charset_converter_iface_init); + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_charset_converter_initable_iface_init)) + +static void +g_charset_converter_finalize (GObject *object) +{ + GCharsetConverter *conv; + + conv = G_CHARSET_CONVERTER (object); + + g_free (conv->from); + g_free (conv->to); + if (conv->iconv) + g_iconv_close (conv->iconv); + + G_OBJECT_CLASS (g_charset_converter_parent_class)->finalize (object); +} + +static void +g_charset_converter_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GCharsetConverter *conv; + + conv = G_CHARSET_CONVERTER (object); + + switch (prop_id) + { + case PROP_TO_CHARSET: + g_free (conv->to); + conv->to = g_value_dup_string (value); + break; + + case PROP_FROM_CHARSET: + g_free (conv->from); + conv->from = g_value_dup_string (value); + break; + + case PROP_USE_FALLBACK: + conv->use_fallback = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_charset_converter_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GCharsetConverter *conv; + + conv = G_CHARSET_CONVERTER (object); + + switch (prop_id) + { + case PROP_TO_CHARSET: + g_value_set_string (value, conv->to); + break; + + case PROP_FROM_CHARSET: + g_value_set_string (value, conv->from); + break; + + case PROP_USE_FALLBACK: + g_value_set_boolean (value, conv->use_fallback); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_charset_converter_class_init (GCharsetConverterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_charset_converter_finalize; + gobject_class->get_property = g_charset_converter_get_property; + gobject_class->set_property = g_charset_converter_set_property; + + g_object_class_install_property (gobject_class, + PROP_TO_CHARSET, + g_param_spec_string ("to-charset", + P_("To Charset"), + P_("The character encoding to convert to"), + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_FROM_CHARSET, + g_param_spec_string ("from-charset", + P_("From Charset"), + P_("The character encoding to convert from"), + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_USE_FALLBACK, + g_param_spec_boolean ("use-fallback", + P_("Fallback enabled"), + P_("Use fallback (of form \\) for invalid bytes"), + FALSE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_charset_converter_init (GCharsetConverter *local) +{ +} + + +/** + * g_charset_converter_new: + * @to_charset: destination charset + * @from_charset: source charset + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GCharsetConverter. + * + * Returns: a new #GCharsetConverter or %NULL on error. + * + * Since: 2.24 + **/ +GCharsetConverter * +g_charset_converter_new (const gchar *to_charset, + const gchar *from_charset, + GError **error) +{ + GCharsetConverter *conv; + + conv = g_initable_new (G_TYPE_CHARSET_CONVERTER, + NULL, error, + "to-charset", to_charset, + "from-charset", from_charset, + NULL); + + return conv; +} + +static void +g_charset_converter_reset (GConverter *converter) +{ + GCharsetConverter *conv = G_CHARSET_CONVERTER (converter); + + if (conv->iconv == NULL) + { + g_warning ("Invalid object, not initialized"); + return; + } + + g_iconv (conv->iconv, NULL, NULL, NULL, NULL); + conv->n_fallback_errors = 0; +} + +static GConverterResult +g_charset_converter_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + GCharsetConverter *conv; + gsize res; + GConverterResult ret; + gchar *inbufp, *outbufp; + gsize in_left, out_left; + int errsv; + gboolean reset; + + conv = G_CHARSET_CONVERTER (converter); + + if (conv->iconv == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED, + _("Invalid object, not initialized")); + return G_CONVERTER_ERROR; + } + + inbufp = (char *)inbuf; + outbufp = (char *)outbuf; + in_left = inbuf_size; + out_left = outbuf_size; + reset = FALSE; + + /* if there is not input try to flush the data */ + if (inbuf_size == 0) + { + if (flags & G_CONVERTER_INPUT_AT_END || + flags & G_CONVERTER_FLUSH) + { + reset = TRUE; + } + else + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT, + _("Incomplete multibyte sequence in input")); + return G_CONVERTER_ERROR; + } + } + + if (reset) + /* call g_iconv with NULL inbuf to cleanup shift state */ + res = g_iconv (conv->iconv, + NULL, &in_left, + &outbufp, &out_left); + else + res = g_iconv (conv->iconv, + &inbufp, &in_left, + &outbufp, &out_left); + + *bytes_read = inbufp - (char *)inbuf; + *bytes_written = outbufp - (char *)outbuf; + + /* Don't report error if we converted anything */ + if (res == (gsize) -1 && *bytes_read == 0) + { + errsv = errno; + + switch (errsv) + { + case EINVAL: + /* Incomplete input text */ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT, + _("Incomplete multibyte sequence in input")); + break; + + case E2BIG: + /* Not enough destination space */ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, + _("Not enough space in destination")); + break; + + case EILSEQ: + /* Invalid code sequence */ + if (conv->use_fallback) + { + if (outbuf_size < 3) + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, + _("Not enough space in destination")); + else + { + const char hex[] = "0123456789ABCDEF"; + guint8 v = *(guint8 *)inbuf; + guint8 *out = (guint8 *)outbuf; + out[0] = '\\'; + out[1] = hex[(v & 0xf0) >> 4]; + out[2] = hex[(v & 0x0f) >> 0]; + *bytes_read = 1; + *bytes_written = 3; + in_left--; + conv->n_fallback_errors++; + goto ok; + } + } + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + _("Invalid byte sequence in conversion input")); + break; + + default: + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Error during conversion: %s"), + g_strerror (errsv)); + break; + } + ret = G_CONVERTER_ERROR; + } + else + { + ok: + ret = G_CONVERTER_CONVERTED; + + if (reset && + (flags & G_CONVERTER_INPUT_AT_END)) + ret = G_CONVERTER_FINISHED; + else if (reset && + (flags & G_CONVERTER_FLUSH)) + ret = G_CONVERTER_FLUSHED; + } + + return ret; +} + +/** + * g_charset_converter_set_use_fallback: + * @converter: a #GCharsetConverter + * @use_fallback: %TRUE to use fallbacks + * + * Sets the #GCharsetConverter:use-fallback property. + * + * Since: 2.24 + */ +void +g_charset_converter_set_use_fallback (GCharsetConverter *converter, + gboolean use_fallback) +{ + use_fallback = !!use_fallback; + + if (converter->use_fallback != use_fallback) + { + converter->use_fallback = use_fallback; + g_object_notify (G_OBJECT (converter), "use-fallback"); + } +} + +/** + * g_charset_converter_get_use_fallback: + * @converter: a #GCharsetConverter + * + * Gets the #GCharsetConverter:use-fallback property. + * + * Returns: %TRUE if fallbacks are used by @converter + * + * Since: 2.24 + */ +gboolean +g_charset_converter_get_use_fallback (GCharsetConverter *converter) +{ + return converter->use_fallback; +} + +/** + * g_charset_converter_get_num_fallbacks: + * @converter: a #GCharsetConverter + * + * Gets the number of fallbacks that @converter has applied so far. + * + * Returns: the number of fallbacks that @converter has applied + * + * Since: 2.24 + */ +guint +g_charset_converter_get_num_fallbacks (GCharsetConverter *converter) +{ + return converter->n_fallback_errors; +} + +static void +g_charset_converter_iface_init (GConverterIface *iface) +{ + iface->convert = g_charset_converter_convert; + iface->reset = g_charset_converter_reset; +} + +static gboolean +g_charset_converter_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GCharsetConverter *conv; + + g_return_val_if_fail (G_IS_CHARSET_CONVERTER (initable), FALSE); + + conv = G_CHARSET_CONVERTER (initable); + + if (cancellable != NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Cancellable initialization not supported")); + return FALSE; + } + + conv->iconv = + g_iconv_open (conv->to, conv->from); + + if (conv->iconv == NULL) + { + if (errno == EINVAL) + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Conversion from character set '%s' to '%s' is not supported"), + conv->from, conv->to); + else + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Could not open converter from '%s' to '%s'"), + conv->from, conv->to); + return FALSE; + } + + return TRUE; +} + +static void +g_charset_converter_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_charset_converter_initable_init; +} + +#define __G_CHARSET_CONVERTER_C__ +#include "gioaliasdef.c" diff --git a/gio/gcharsetconverter.h b/gio/gcharsetconverter.h new file mode 100644 index 0000000..5198d46 --- /dev/null +++ b/gio/gcharsetconverter.h @@ -0,0 +1,60 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CHARSET_CONVERTER_H__ +#define __G_CHARSET_CONVERTER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_CHARSET_CONVERTER (g_charset_converter_get_type ()) +#define G_CHARSET_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_CHARSET_CONVERTER, GCharsetConverter)) +#define G_CHARSET_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_CHARSET_CONVERTER, GCharsetConverterClass)) +#define G_IS_CHARSET_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_CHARSET_CONVERTER)) +#define G_IS_CHARSET_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CHARSET_CONVERTER)) +#define G_CHARSET_CONVERTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CHARSET_CONVERTER, GCharsetConverterClass)) + +typedef struct _GCharsetConverterClass GCharsetConverterClass; + +struct _GCharsetConverterClass +{ + GObjectClass parent_class; +}; + +GType g_charset_converter_get_type (void) G_GNUC_CONST; + +GCharsetConverter *g_charset_converter_new (const gchar *to_charset, + const gchar *from_charset, + GError **error); +void g_charset_converter_set_use_fallback (GCharsetConverter *converter, + gboolean use_fallback); +gboolean g_charset_converter_get_use_fallback (GCharsetConverter *converter); +guint g_charset_converter_get_num_fallbacks (GCharsetConverter *converter); + +G_END_DECLS + +#endif /* __G_CHARSET_CONVERTER_H__ */ diff --git a/gio/gcontenttype.c b/gio/gcontenttype.c new file mode 100644 index 0000000..925b0a4 --- /dev/null +++ b/gio/gcontenttype.c @@ -0,0 +1,1675 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include +#include +#include +#include +#include "gcontenttypeprivate.h" +#include "gthemedicon.h" +#include "gicon.h" +#include "gfile.h" +#include "gfileenumerator.h" +#include "gfileinfo.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gcontenttype + * @short_description: Platform-specific content typing + * @include: gio/gio.h + * + * A content type is a platform specific string that defines the type + * of a file. On unix it is a mime type, on win32 it is an extension string + * like ".doc", ".txt" or a percieved string like "audio". Such strings + * can be looked up in the registry at HKEY_CLASSES_ROOT. + **/ + +#ifdef G_OS_WIN32 + +#include + +static char * +get_registry_classes_key (const char *subdir, + const wchar_t *key_name) +{ + wchar_t *wc_key; + HKEY reg_key = NULL; + DWORD key_type; + DWORD nbytes; + char *value_utf8; + + value_utf8 = NULL; + + nbytes = 0; + wc_key = g_utf8_to_utf16 (subdir, -1, NULL, NULL, NULL); + if (RegOpenKeyExW (HKEY_CLASSES_ROOT, wc_key, 0, + KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS && + RegQueryValueExW (reg_key, key_name, 0, + &key_type, NULL, &nbytes) == ERROR_SUCCESS && + (key_type == REG_SZ || key_type == REG_EXPAND_SZ)) + { + wchar_t *wc_temp = g_new (wchar_t, (nbytes+1)/2 + 1); + RegQueryValueExW (reg_key, key_name, 0, + &key_type, (LPBYTE) wc_temp, &nbytes); + wc_temp[nbytes/2] = '\0'; + if (key_type == REG_EXPAND_SZ) + { + wchar_t dummy[1]; + int len = ExpandEnvironmentStringsW (wc_temp, dummy, 1); + if (len > 0) + { + wchar_t *wc_temp_expanded = g_new (wchar_t, len); + if (ExpandEnvironmentStringsW (wc_temp, wc_temp_expanded, len) == len) + value_utf8 = g_utf16_to_utf8 (wc_temp_expanded, -1, NULL, NULL, NULL); + g_free (wc_temp_expanded); + } + } + else + { + value_utf8 = g_utf16_to_utf8 (wc_temp, -1, NULL, NULL, NULL); + } + g_free (wc_temp); + + } + g_free (wc_key); + + if (reg_key != NULL) + RegCloseKey (reg_key); + + return value_utf8; +} + +gboolean +g_content_type_equals (const char *type1, + const char *type2) +{ + char *progid1, *progid2; + gboolean res; + + g_return_val_if_fail (type1 != NULL, FALSE); + g_return_val_if_fail (type2 != NULL, FALSE); + + if (g_ascii_strcasecmp (type1, type2) == 0) + return TRUE; + + res = FALSE; + progid1 = get_registry_classes_key (type1, NULL); + progid2 = get_registry_classes_key (type2, NULL); + if (progid1 != NULL && progid2 != NULL && + strcmp (progid1, progid2) == 0) + res = TRUE; + g_free (progid1); + g_free (progid2); + + return res; +} + +gboolean +g_content_type_is_a (const char *type, + const char *supertype) +{ + gboolean res; + char *value_utf8; + + g_return_val_if_fail (type != NULL, FALSE); + g_return_val_if_fail (supertype != NULL, FALSE); + + if (g_content_type_equals (type, supertype)) + return TRUE; + + res = FALSE; + value_utf8 = get_registry_classes_key (type, L"PerceivedType"); + if (value_utf8 && strcmp (value_utf8, supertype) == 0) + res = TRUE; + g_free (value_utf8); + + return res; +} + +gboolean +g_content_type_is_unknown (const char *type) +{ + g_return_val_if_fail (type != NULL, FALSE); + + return strcmp ("*", type) == 0; +} + +char * +g_content_type_get_description (const char *type) +{ + char *progid; + char *description; + + g_return_val_if_fail (type != NULL, NULL); + + progid = get_registry_classes_key (type, NULL); + if (progid) + { + description = get_registry_classes_key (progid, NULL); + g_free (progid); + + if (description) + return description; + } + + if (g_content_type_is_unknown (type)) + return g_strdup (_("Unknown type")); + return g_strdup_printf (_("%s filetype"), type); +} + +char * +g_content_type_get_mime_type (const char *type) +{ + char *mime; + + g_return_val_if_fail (type != NULL, NULL); + + mime = get_registry_classes_key (type, L"Content Type"); + if (mime) + return mime; + else if (g_content_type_is_unknown (type)) + return g_strdup ("application/octet-stream"); + else if (*type == '.') + return g_strdup_printf ("application/x-ext-%s", type+1); + /* TODO: Map "image" to "image/ *", etc? */ + + return g_strdup ("application/octet-stream"); +} + +G_LOCK_DEFINE_STATIC (_type_icons); +static GHashTable *_type_icons = NULL; + +GIcon * +g_content_type_get_icon (const char *type) +{ + GIcon *themed_icon; + char *name = NULL; + + g_return_val_if_fail (type != NULL, NULL); + + /* In the Registry icons are the default value of + HKEY_CLASSES_ROOT\\DefaultIcon with typical values like: + : + REG_EXPAND_SZ: %SystemRoot%\System32\Wscript.exe,3 + REG_SZ: shimgvw.dll,3 + */ + G_LOCK (_type_icons); + if (!_type_icons) + _type_icons = g_hash_table_new (g_str_hash, g_str_equal); + name = g_hash_table_lookup (_type_icons, type); + if (!name && type[0] == '.') + { + /* double lookup by extension */ + gchar *key = get_registry_classes_key (type, NULL); + if (!key) + key = g_strconcat (type+1, "file\\DefaultIcon", NULL); + else + { + gchar *key2 = g_strconcat (key, "\\DefaultIcon", NULL); + g_free (key); + key = key2; + } + name = get_registry_classes_key (key, NULL); + if (name && strcmp (name, "%1") == 0) + { + g_free (name); + name = NULL; + } + if (name) + g_hash_table_insert (_type_icons, g_strdup (type), g_strdup (name)); + g_free (key); + } + + /* icon-name similar to how it was with gtk-2-12 */ + if (name) + { + themed_icon = g_themed_icon_new (name); + } + else + { + /* if not found an icon fall back to gtk-builtins */ + name = strcmp (type, "inode/directory") == 0 ? "gtk-directory" : + g_content_type_can_be_executable (type) ? "gtk-execute" : "gtk-file"; + g_hash_table_insert (_type_icons, g_strdup (type), g_strdup (name)); + themed_icon = g_themed_icon_new_with_default_fallbacks (name); + } + G_UNLOCK (_type_icons); + + return G_ICON (themed_icon); +} + +gboolean +g_content_type_can_be_executable (const char *type) +{ + g_return_val_if_fail (type != NULL, FALSE); + + if (strcmp (type, ".exe") == 0 || + strcmp (type, ".com") == 0 || + strcmp (type, ".bat") == 0) + return TRUE; + + /* TODO: Also look at PATHEXT, which lists the extensions for + * "scripts" in addition to those for true binary executables. + * + * (PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH for me + * right now, for instance). And in a sense, all associated file + * types are "executable" on Windows... You can just type foo.jpg as + * a command name in cmd.exe, and it will run the application + * associated with .jpg. Hard to say what this API actually means + * with "executable". + */ + + return FALSE; +} + +static gboolean +looks_like_text (const guchar *data, + gsize data_size) +{ + gsize i; + guchar c; + for (i = 0; i < data_size; i++) + { + c = data[i]; + if (g_ascii_iscntrl (c) && !g_ascii_isspace (c) && c != '\b') + return FALSE; + } + return TRUE; +} + +char * +g_content_type_from_mime_type (const char *mime_type) +{ + char *key, *content_type; + + g_return_val_if_fail (mime_type != NULL, NULL); + + key = g_strconcat ("MIME\\DataBase\\Content Type\\", mime_type, NULL); + content_type = get_registry_classes_key (key, L"Extension"); + g_free (key); + + return content_type; +} + +char * +g_content_type_guess (const char *filename, + const guchar *data, + gsize data_size, + gboolean *result_uncertain) +{ + char *basename; + char *type; + char *dot; + + type = NULL; + + if (result_uncertain) + *result_uncertain = FALSE; + + if (filename) + { + basename = g_path_get_basename (filename); + dot = strrchr (basename, '.'); + if (dot) + type = g_strdup (dot); + g_free (basename); + } + + if (type) + return type; + + if (data && looks_like_text (data, data_size)) + return g_strdup (".txt"); + + return g_strdup ("*"); +} + +GList * +g_content_types_get_registered (void) +{ + DWORD index; + wchar_t keyname[256]; + DWORD key_len; + char *key_utf8; + GList *types; + + types = NULL; + index = 0; + key_len = 256; + while (RegEnumKeyExW(HKEY_CLASSES_ROOT, + index, + keyname, + &key_len, + NULL, + NULL, + NULL, + NULL) == ERROR_SUCCESS) + { + key_utf8 = g_utf16_to_utf8 (keyname, -1, NULL, NULL, NULL); + if (key_utf8) + { + if (*key_utf8 == '.') + types = g_list_prepend (types, key_utf8); + else + g_free (key_utf8); + } + index++; + key_len = 256; + } + + return g_list_reverse (types); +} + +char ** +g_content_type_guess_for_tree (GFile *root) +{ + /* FIXME: implement */ + return NULL; +} + +#else /* !G_OS_WIN32 - Unix specific version */ + +#include + +#define XDG_PREFIX _gio_xdg +#include "xdgmime/xdgmime.h" + +/* We lock this mutex whenever we modify global state in this module. */ +G_LOCK_DEFINE_STATIC (gio_xdgmime); + +gsize +_g_unix_content_type_get_sniff_len (void) +{ + gsize size; + + G_LOCK (gio_xdgmime); + size = xdg_mime_get_max_buffer_extents (); + G_UNLOCK (gio_xdgmime); + + return size; +} + +char * +_g_unix_content_type_unalias (const char *type) +{ + char *res; + + G_LOCK (gio_xdgmime); + res = g_strdup (xdg_mime_unalias_mime_type (type)); + G_UNLOCK (gio_xdgmime); + + return res; +} + +char ** +_g_unix_content_type_get_parents (const char *type) +{ + const char *umime; + char **parents; + GPtrArray *array; + int i; + + array = g_ptr_array_new (); + + G_LOCK (gio_xdgmime); + + umime = xdg_mime_unalias_mime_type (type); + + g_ptr_array_add (array, g_strdup (umime)); + + parents = xdg_mime_list_mime_parents (umime); + for (i = 0; parents && parents[i] != NULL; i++) + g_ptr_array_add (array, g_strdup (parents[i])); + + free (parents); + + G_UNLOCK (gio_xdgmime); + + g_ptr_array_add (array, NULL); + + return (char **)g_ptr_array_free (array, FALSE); +} + +/** + * g_content_type_equals: + * @type1: a content type string. + * @type2: a content type string. + * + * Compares two content types for equality. + * + * Returns: %TRUE if the two strings are identical or equivalent, + * %FALSE otherwise. + **/ +gboolean +g_content_type_equals (const char *type1, + const char *type2) +{ + gboolean res; + + g_return_val_if_fail (type1 != NULL, FALSE); + g_return_val_if_fail (type2 != NULL, FALSE); + + G_LOCK (gio_xdgmime); + res = xdg_mime_mime_type_equal (type1, type2); + G_UNLOCK (gio_xdgmime); + + return res; +} + +/** + * g_content_type_is_a: + * @type: a content type string. + * @supertype: a string. + * + * Determines if @type is a subset of @supertype. + * + * Returns: %TRUE if @type is a kind of @supertype, + * %FALSE otherwise. + **/ +gboolean +g_content_type_is_a (const char *type, + const char *supertype) +{ + gboolean res; + + g_return_val_if_fail (type != NULL, FALSE); + g_return_val_if_fail (supertype != NULL, FALSE); + + G_LOCK (gio_xdgmime); + res = xdg_mime_mime_type_subclass (type, supertype); + G_UNLOCK (gio_xdgmime); + + return res; +} + +/** + * g_content_type_is_unknown: + * @type: a content type string. + * + * Checks if the content type is the generic "unknown" type. + * On unix this is the "application/octet-stream" mimetype, + * while on win32 it is "*". + * + * Returns: %TRUE if the type is the unknown type. + **/ +gboolean +g_content_type_is_unknown (const char *type) +{ + g_return_val_if_fail (type != NULL, FALSE); + + return strcmp (XDG_MIME_TYPE_UNKNOWN, type) == 0; +} + + +typedef enum { + MIME_TAG_TYPE_OTHER, + MIME_TAG_TYPE_COMMENT +} MimeTagType; + +typedef struct { + int current_type; + int current_lang_level; + int comment_lang_level; + char *comment; +} MimeParser; + + +static int +language_level (const char *lang) +{ + const char * const *lang_list; + int i; + + /* The returned list is sorted from most desirable to least + desirable and always contains the default locale "C". */ + lang_list = g_get_language_names (); + + for (i = 0; lang_list[i]; i++) + if (strcmp (lang_list[i], lang) == 0) + return 1000-i; + + return 0; +} + +static void +mime_info_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + int i; + const char *lang; + MimeParser *parser = user_data; + + if (strcmp (element_name, "comment") == 0) + { + lang = "C"; + for (i = 0; attribute_names[i]; i++) + if (strcmp (attribute_names[i], "xml:lang") == 0) + { + lang = attribute_values[i]; + break; + } + + parser->current_lang_level = language_level (lang); + parser->current_type = MIME_TAG_TYPE_COMMENT; + } + else + parser->current_type = MIME_TAG_TYPE_OTHER; + +} + +static void +mime_info_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + MimeParser *parser = user_data; + + parser->current_type = MIME_TAG_TYPE_OTHER; +} + +static void +mime_info_text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + MimeParser *parser = user_data; + + if (parser->current_type == MIME_TAG_TYPE_COMMENT && + parser->current_lang_level > parser->comment_lang_level) + { + g_free (parser->comment); + parser->comment = g_strndup (text, text_len); + parser->comment_lang_level = parser->current_lang_level; + } +} + +static char * +load_comment_for_mime_helper (const char *dir, + const char *basename) +{ + GMarkupParseContext *context; + char *filename, *data; + gsize len; + gboolean res; + MimeParser parse_data = {0}; + GMarkupParser parser = { + mime_info_start_element, + mime_info_end_element, + mime_info_text + }; + + filename = g_build_filename (dir, "mime", basename, NULL); + + res = g_file_get_contents (filename, &data, &len, NULL); + g_free (filename); + if (!res) + return NULL; + + context = g_markup_parse_context_new (&parser, 0, &parse_data, NULL); + res = g_markup_parse_context_parse (context, data, len, NULL); + g_free (data); + g_markup_parse_context_free (context); + + if (!res) + return NULL; + + return parse_data.comment; +} + + +static char * +load_comment_for_mime (const char *mimetype) +{ + const char * const* dirs; + char *basename; + char *comment; + int i; + + basename = g_strdup_printf ("%s.xml", mimetype); + + comment = load_comment_for_mime_helper (g_get_user_data_dir (), basename); + if (comment) + { + g_free (basename); + return comment; + } + + dirs = g_get_system_data_dirs (); + + for (i = 0; dirs[i] != NULL; i++) + { + comment = load_comment_for_mime_helper (dirs[i], basename); + if (comment) + { + g_free (basename); + return comment; + } + } + g_free (basename); + + return g_strdup_printf (_("%s type"), mimetype); +} + +/** + * g_content_type_get_description: + * @type: a content type string. + * + * Gets the human readable description of the content type. + * + * Returns: a short description of the content type @type. + **/ +char * +g_content_type_get_description (const char *type) +{ + static GHashTable *type_comment_cache = NULL; + char *comment; + + g_return_val_if_fail (type != NULL, NULL); + + G_LOCK (gio_xdgmime); + type = xdg_mime_unalias_mime_type (type); + + if (type_comment_cache == NULL) + type_comment_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + comment = g_hash_table_lookup (type_comment_cache, type); + comment = g_strdup (comment); + G_UNLOCK (gio_xdgmime); + + if (comment != NULL) + return comment; + + comment = load_comment_for_mime (type); + + G_LOCK (gio_xdgmime); + g_hash_table_insert (type_comment_cache, + g_strdup (type), + g_strdup (comment)); + G_UNLOCK (gio_xdgmime); + + return comment; +} + +/** + * g_content_type_get_mime_type: + * @type: a content type string. + * + * Gets the mime-type for the content type. If one is registered + * + * Returns: the registered mime-type for the given @type, or NULL if unknown. + **/ +char * +g_content_type_get_mime_type (const char *type) +{ + g_return_val_if_fail (type != NULL, NULL); + + return g_strdup (type); +} + +/** + * g_content_type_get_icon: + * @type: a content type string. + * + * Gets the icon for a content type. + * + * Returns: #GIcon corresponding to the content type. + **/ +GIcon * +g_content_type_get_icon (const char *type) +{ + char *mimetype_icon, *generic_mimetype_icon, *q; + char *xdg_mimetype_icon, *legacy_mimetype_icon; + char *xdg_mimetype_generic_icon; + char *icon_names[5]; + int n = 0; + const char *p; + GIcon *themed_icon; + + g_return_val_if_fail (type != NULL, NULL); + + G_LOCK (gio_xdgmime); + xdg_mimetype_icon = g_strdup (xdg_mime_get_icon (type)); + xdg_mimetype_generic_icon = g_strdup (xdg_mime_get_generic_icon (type)); + G_UNLOCK (gio_xdgmime); + + mimetype_icon = g_strdup (type); + + while ((q = strchr (mimetype_icon, '/')) != NULL) + *q = '-'; + + p = strchr (type, '/'); + if (p == NULL) + p = type + strlen (type); + + /* Not all icons have migrated to the new icon theme spec, look for old names too */ + legacy_mimetype_icon = g_strconcat ("gnome-mime-", mimetype_icon, NULL); + + generic_mimetype_icon = g_malloc (p - type + strlen ("-x-generic") + 1); + memcpy (generic_mimetype_icon, type, p - type); + memcpy (generic_mimetype_icon + (p - type), "-x-generic", strlen ("-x-generic")); + generic_mimetype_icon[(p - type) + strlen ("-x-generic")] = 0; + + if (xdg_mimetype_icon) + icon_names[n++] = xdg_mimetype_icon; + + icon_names[n++] = mimetype_icon; + icon_names[n++] = legacy_mimetype_icon; + + if (xdg_mimetype_generic_icon) + icon_names[n++] = xdg_mimetype_generic_icon; + + icon_names[n++] = generic_mimetype_icon; + + themed_icon = g_themed_icon_new_from_names (icon_names, n); + + g_free (xdg_mimetype_icon); + g_free (xdg_mimetype_generic_icon); + g_free (mimetype_icon); + g_free (legacy_mimetype_icon); + g_free (generic_mimetype_icon); + + return themed_icon; +} + +/** + * g_content_type_can_be_executable: + * @type: a content type string. + * + * Checks if a content type can be executable. Note that for instance + * things like text files can be executables (i.e. scripts and batch files). + * + * Returns: %TRUE if the file type corresponds to a type that + * can be executable, %FALSE otherwise. + **/ +gboolean +g_content_type_can_be_executable (const char *type) +{ + g_return_val_if_fail (type != NULL, FALSE); + + if (g_content_type_is_a (type, "application/x-executable") || + g_content_type_is_a (type, "text/plain")) + return TRUE; + + return FALSE; +} + +static gboolean +looks_like_text (const guchar *data, gsize data_size) +{ + gsize i; + char c; + + for (i = 0; i < data_size; i++) + { + c = data[i]; + + if (g_ascii_iscntrl (c) && + !g_ascii_isspace (c) && + c != '\b') + return FALSE; + } + return TRUE; +} + +/** + * g_content_type_from_mime_type: + * @mime_type: a mime type string. + * + * Tries to find a content type based on the mime type name. + * + * Returns: Newly allocated string with content type or NULL when does not know. + * + * Since: 2.18 + **/ +char * +g_content_type_from_mime_type (const char *mime_type) +{ + char *umime; + + g_return_val_if_fail (mime_type != NULL, NULL); + + G_LOCK (gio_xdgmime); + /* mime type and content type are same on unixes */ + umime = g_strdup (xdg_mime_unalias_mime_type (mime_type)); + G_UNLOCK (gio_xdgmime); + + return umime; +} + +/** + * g_content_type_guess: + * @filename: a string, or %NULL + * @data: a stream of data, or %NULL + * @data_size: the size of @data + * @result_uncertain: a flag indicating the certainty of the result + * + * Guesses the content type based on example data. If the function is + * uncertain, @result_uncertain will be set to %TRUE. Either @filename + * or @data may be %NULL, in which case the guess will be based solely + * on the other argument. + * + * Returns: a string indicating a guessed content type for the + * given data. + **/ +char * +g_content_type_guess (const char *filename, + const guchar *data, + gsize data_size, + gboolean *result_uncertain) +{ + char *basename; + const char *name_mimetypes[10], *sniffed_mimetype; + char *mimetype; + int i; + int n_name_mimetypes; + int sniffed_prio; + + sniffed_prio = 0; + n_name_mimetypes = 0; + sniffed_mimetype = XDG_MIME_TYPE_UNKNOWN; + + if (result_uncertain) + *result_uncertain = FALSE; + + G_LOCK (gio_xdgmime); + + if (filename) + { + i = strlen (filename); + if (filename[i - 1] == '/') + { + name_mimetypes[0] = "inode/directory"; + name_mimetypes[1] = NULL; + n_name_mimetypes = 1; + if (result_uncertain) + *result_uncertain = TRUE; + } + else + { + basename = g_path_get_basename (filename); + n_name_mimetypes = xdg_mime_get_mime_types_from_file_name (basename, name_mimetypes, 10); + g_free (basename); + } + } + + /* Got an extension match, and no conflicts. This is it. */ + if (n_name_mimetypes == 1) + { + G_UNLOCK (gio_xdgmime); + return g_strdup (name_mimetypes[0]); + } + + if (data) + { + sniffed_mimetype = xdg_mime_get_mime_type_for_data (data, data_size, &sniffed_prio); + if (sniffed_mimetype == XDG_MIME_TYPE_UNKNOWN && + data && + looks_like_text (data, data_size)) + sniffed_mimetype = "text/plain"; + + /* For security reasons we don't ever want to sniff desktop files + * where we know the filename and it doesn't have a .desktop extension. + * This is because desktop files allow executing any application and + * we don't want to make it possible to hide them looking like something + * else. + */ + if (filename != NULL && + strcmp (sniffed_mimetype, "application/x-desktop") == 0) + sniffed_mimetype = "text/plain"; + } + + if (n_name_mimetypes == 0) + { + if (sniffed_mimetype == XDG_MIME_TYPE_UNKNOWN && + result_uncertain) + *result_uncertain = TRUE; + + mimetype = g_strdup (sniffed_mimetype); + } + else + { + mimetype = NULL; + if (sniffed_mimetype != XDG_MIME_TYPE_UNKNOWN) + { + if (sniffed_prio >= 80) /* High priority sniffing match, use that */ + mimetype = g_strdup (sniffed_mimetype); + else + { + /* There are conflicts between the name matches and we have a sniffed + type, use that as a tie breaker. */ + + for (i = 0; i < n_name_mimetypes; i++) + { + if ( xdg_mime_mime_type_subclass (name_mimetypes[i], sniffed_mimetype)) + { + /* This nametype match is derived from (or the same as) the sniffed type). + This is probably it. */ + mimetype = g_strdup (name_mimetypes[i]); + break; + } + } + } + } + + if (mimetype == NULL) + { + /* Conflicts, and sniffed type was no help or not there. Guess on the first one */ + mimetype = g_strdup (name_mimetypes[0]); + if (result_uncertain) + *result_uncertain = TRUE; + } + } + + G_UNLOCK (gio_xdgmime); + + return mimetype; +} + +static void +enumerate_mimetypes_subdir (const char *dir, + const char *prefix, + GHashTable *mimetypes) +{ + DIR *d; + struct dirent *ent; + char *mimetype; + + d = opendir (dir); + if (d) + { + while ((ent = readdir (d)) != NULL) + { + if (g_str_has_suffix (ent->d_name, ".xml")) + { + mimetype = g_strdup_printf ("%s/%.*s", prefix, (int) strlen (ent->d_name) - 4, ent->d_name); + g_hash_table_replace (mimetypes, mimetype, NULL); + } + } + closedir (d); + } +} + +static void +enumerate_mimetypes_dir (const char *dir, + GHashTable *mimetypes) +{ + DIR *d; + struct dirent *ent; + char *mimedir; + char *name; + + mimedir = g_build_filename (dir, "mime", NULL); + + d = opendir (mimedir); + if (d) + { + while ((ent = readdir (d)) != NULL) + { + if (strcmp (ent->d_name, "packages") != 0) + { + name = g_build_filename (mimedir, ent->d_name, NULL); + if (g_file_test (name, G_FILE_TEST_IS_DIR)) + enumerate_mimetypes_subdir (name, ent->d_name, mimetypes); + g_free (name); + } + } + closedir (d); + } + + g_free (mimedir); +} + +/** + * g_content_types_get_registered: + * + * Gets a list of strings containing all the registered content types + * known to the system. The list and its data should be freed using + * @g_list_foreach(list, g_free, NULL) and @g_list_free(list) + * Returns: #GList of the registered content types. + **/ +GList * +g_content_types_get_registered (void) +{ + const char * const* dirs; + GHashTable *mimetypes; + GHashTableIter iter; + gpointer key; + int i; + GList *l; + + mimetypes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + enumerate_mimetypes_dir (g_get_user_data_dir (), mimetypes); + dirs = g_get_system_data_dirs (); + + for (i = 0; dirs[i] != NULL; i++) + enumerate_mimetypes_dir (dirs[i], mimetypes); + + l = NULL; + g_hash_table_iter_init (&iter, mimetypes); + while (g_hash_table_iter_next (&iter, &key, NULL)) + { + l = g_list_prepend (l, key); + g_hash_table_iter_steal (&iter); + } + + g_hash_table_destroy (mimetypes); + + return l; +} + + +/* tree magic data */ +static GList *tree_matches = NULL; +static gboolean need_reload = FALSE; + +G_LOCK_DEFINE_STATIC (gio_treemagic); + +typedef struct +{ + gchar *path; + GFileType type; + guint match_case : 1; + guint executable : 1; + guint non_empty : 1; + guint on_disc : 1; + gchar *mimetype; + GList *matches; +} TreeMatchlet; + +typedef struct +{ + gchar *contenttype; + gint priority; + GList *matches; +} TreeMatch; + + +static void +tree_matchlet_free (TreeMatchlet *matchlet) +{ + g_list_foreach (matchlet->matches, (GFunc)tree_matchlet_free, NULL); + g_list_free (matchlet->matches); + g_free (matchlet->path); + g_free (matchlet->mimetype); + g_slice_free (TreeMatchlet, matchlet); +} + +static void +tree_match_free (TreeMatch *match) +{ + g_list_foreach (match->matches, (GFunc)tree_matchlet_free, NULL); + g_list_free (match->matches); + g_free (match->contenttype); + g_slice_free (TreeMatch, match); +} + +static TreeMatch * +parse_header (gchar *line) +{ + gint len; + gchar *s; + TreeMatch *match; + + len = strlen (line); + + if (line[0] != '[' || line[len - 1] != ']') + return NULL; + + line[len - 1] = 0; + s = strchr (line, ':'); + + match = g_slice_new0 (TreeMatch); + match->priority = atoi (line + 1); + match->contenttype = g_strdup (s + 1); + + return match; +} + +static TreeMatchlet * +parse_match_line (gchar *line, + gint *depth) +{ + gchar *s, *p; + TreeMatchlet *matchlet; + gchar **parts; + gint i; + + matchlet = g_slice_new0 (TreeMatchlet); + + if (line[0] == '>') + { + *depth = 0; + s = line; + } + else + { + *depth = atoi (line); + s = strchr (line, '>'); + } + s += 2; + p = strchr (s, '"'); + *p = 0; + + matchlet->path = g_strdup (s); + s = p + 1; + parts = g_strsplit (s, ",", 0); + if (strcmp (parts[0], "=file") == 0) + matchlet->type = G_FILE_TYPE_REGULAR; + else if (strcmp (parts[0], "=directory") == 0) + matchlet->type = G_FILE_TYPE_DIRECTORY; + else if (strcmp (parts[0], "=link") == 0) + matchlet->type = G_FILE_TYPE_SYMBOLIC_LINK; + else + matchlet->type = G_FILE_TYPE_UNKNOWN; + for (i = 1; parts[i]; i++) + { + if (strcmp (parts[i], "executable") == 0) + matchlet->executable = 1; + else if (strcmp (parts[i], "match-case") == 0) + matchlet->match_case = 1; + else if (strcmp (parts[i], "non-empty") == 0) + matchlet->non_empty = 1; + else if (strcmp (parts[i], "on-disc") == 0) + matchlet->on_disc = 1; + else + matchlet->mimetype = g_strdup (parts[i]); + } + + g_strfreev (parts); + + return matchlet; +} + +static gint +cmp_match (gconstpointer a, gconstpointer b) +{ + const TreeMatch *aa = (const TreeMatch *)a; + const TreeMatch *bb = (const TreeMatch *)b; + + return bb->priority - aa->priority; +} + +static void +insert_match (TreeMatch *match) +{ + tree_matches = g_list_insert_sorted (tree_matches, match, cmp_match); +} + +static void +insert_matchlet (TreeMatch *match, + TreeMatchlet *matchlet, + gint depth) +{ + if (depth == 0) + match->matches = g_list_append (match->matches, matchlet); + else + { + GList *last; + TreeMatchlet *m; + + last = g_list_last (match->matches); + if (!last) + { + tree_matchlet_free (matchlet); + g_warning ("can't insert tree matchlet at depth %d", depth); + return; + } + + m = (TreeMatchlet *) last->data; + while (--depth > 0) + { + last = g_list_last (m->matches); + if (!last) + { + tree_matchlet_free (matchlet); + g_warning ("can't insert tree matchlet at depth %d", depth); + return; + } + + m = (TreeMatchlet *) last->data; + } + m->matches = g_list_append (m->matches, matchlet); + } +} + +static void +read_tree_magic_from_directory (const gchar *prefix) +{ + gchar *filename; + gchar *text; + gsize len; + gchar **lines; + gint i; + TreeMatch *match; + TreeMatchlet *matchlet; + gint depth; + + filename = g_build_filename (prefix, "mime", "treemagic", NULL); + + if (g_file_get_contents (filename, &text, &len, NULL)) + { + if (strcmp (text, "MIME-TreeMagic") == 0) + { + lines = g_strsplit (text + strlen ("MIME-TreeMagic") + 2, "\n", 0); + match = NULL; + for (i = 0; lines[i] && lines[i][0]; i++) + { + if (lines[i][0] == '[') + { + match = parse_header (lines[i]); + insert_match (match); + } + else + { + matchlet = parse_match_line (lines[i], &depth); + insert_matchlet (match, matchlet, depth); + } + } + + g_strfreev (lines); + } + else + g_warning ("%s: header not found, skipping\n", filename); + + g_free (text); + } + + g_free (filename); +} + + +static void +xdg_mime_reload (void *user_data) +{ + need_reload = TRUE; +} + +static void +tree_magic_shutdown (void) +{ + g_list_foreach (tree_matches, (GFunc)tree_match_free, NULL); + g_list_free (tree_matches); + tree_matches = NULL; +} + +static void +tree_magic_init (void) +{ + static gboolean initialized = FALSE; + const gchar *dir; + const gchar * const * dirs; + int i; + + if (!initialized) + { + initialized = TRUE; + + xdg_mime_register_reload_callback (xdg_mime_reload, NULL, NULL); + need_reload = TRUE; + } + + if (need_reload) + { + need_reload = FALSE; + + tree_magic_shutdown (); + + dir = g_get_user_data_dir (); + read_tree_magic_from_directory (dir); + dirs = g_get_system_data_dirs (); + for (i = 0; dirs[i]; i++) + read_tree_magic_from_directory (dirs[i]); + } +} + +/* a filtering enumerator */ + +typedef struct +{ + gchar *path; + gint depth; + gboolean ignore_case; + gchar **components; + gchar **case_components; + GFileEnumerator **enumerators; + GFile **children; +} Enumerator; + +static gboolean +component_match (Enumerator *e, + gint depth, + const gchar *name) +{ + gchar *case_folded, *key; + gboolean found; + + if (strcmp (name, e->components[depth]) == 0) + return TRUE; + + if (!e->ignore_case) + return FALSE; + + case_folded = g_utf8_casefold (name, -1); + key = g_utf8_collate_key (case_folded, -1); + + found = strcmp (key, e->case_components[depth]) == 0; + + g_free (case_folded); + g_free (key); + + return found; +} + +static GFile * +next_match_recurse (Enumerator *e, + gint depth) +{ + GFile *file; + GFileInfo *info; + const gchar *name; + + while (TRUE) + { + if (e->enumerators[depth] == NULL) + { + if (depth > 0) + { + file = next_match_recurse (e, depth - 1); + if (file) + { + e->children[depth] = file; + e->enumerators[depth] = g_file_enumerate_children (file, + G_FILE_ATTRIBUTE_STANDARD_NAME, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + } + } + if (e->enumerators[depth] == NULL) + return NULL; + } + + while ((info = g_file_enumerator_next_file (e->enumerators[depth], NULL, NULL))) + { + name = g_file_info_get_name (info); + if (component_match (e, depth, name)) + { + file = g_file_get_child (e->children[depth], name); + g_object_unref (info); + return file; + } + g_object_unref (info); + } + + g_object_unref (e->enumerators[depth]); + e->enumerators[depth] = NULL; + g_object_unref (e->children[depth]); + e->children[depth] = NULL; + } +} + +static GFile * +enumerator_next (Enumerator *e) +{ + return next_match_recurse (e, e->depth - 1); +} + +static Enumerator * +enumerator_new (GFile *root, + const char *path, + gboolean ignore_case) +{ + Enumerator *e; + gint i; + gchar *case_folded; + + e = g_new0 (Enumerator, 1); + e->path = g_strdup (path); + e->ignore_case = ignore_case; + + e->components = g_strsplit (e->path, G_DIR_SEPARATOR_S, -1); + e->depth = g_strv_length (e->components); + if (e->ignore_case) + { + e->case_components = g_new0 (char *, e->depth + 1); + for (i = 0; e->components[i]; i++) + { + case_folded = g_utf8_casefold (e->components[i], -1); + e->case_components[i] = g_utf8_collate_key (case_folded, -1); + g_free (case_folded); + } + } + + e->children = g_new0 (GFile *, e->depth); + e->children[0] = g_object_ref (root); + e->enumerators = g_new0 (GFileEnumerator *, e->depth); + e->enumerators[0] = g_file_enumerate_children (root, + G_FILE_ATTRIBUTE_STANDARD_NAME, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + + return e; +} + +static void +enumerator_free (Enumerator *e) +{ + gint i; + + for (i = 0; i < e->depth; i++) + { + if (e->enumerators[i]) + g_object_unref (e->enumerators[i]); + if (e->children[i]) + g_object_unref (e->children[i]); + } + + g_free (e->enumerators); + g_free (e->children); + g_strfreev (e->components); + if (e->case_components) + g_strfreev (e->case_components); + g_free (e->path); + g_free (e); +} + +static gboolean +matchlet_match (TreeMatchlet *matchlet, + GFile *root) +{ + GFile *file; + GFileInfo *info; + gboolean result; + const gchar *attrs; + Enumerator *e; + GList *l; + + e = enumerator_new (root, matchlet->path, !matchlet->match_case); + + do + { + file = enumerator_next (e); + if (!file) + { + enumerator_free (e); + return FALSE; + } + + if (matchlet->mimetype) + attrs = G_FILE_ATTRIBUTE_STANDARD_TYPE "," + G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE "," + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE; + else + attrs = G_FILE_ATTRIBUTE_STANDARD_TYPE "," + G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE; + info = g_file_query_info (file, + attrs, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + if (info) + { + result = TRUE; + + if (matchlet->type != G_FILE_TYPE_UNKNOWN && + g_file_info_get_file_type (info) != matchlet->type) + result = FALSE; + + if (matchlet->executable && + !g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE)) + result = FALSE; + } + else + result = FALSE; + + if (result && matchlet->non_empty) + { + GFileEnumerator *child_enum; + GFileInfo *child_info; + + child_enum = g_file_enumerate_children (file, + G_FILE_ATTRIBUTE_STANDARD_NAME, + G_FILE_QUERY_INFO_NONE, + NULL, + NULL); + + if (child_enum) + { + child_info = g_file_enumerator_next_file (child_enum, NULL, NULL); + if (child_info) + g_object_unref (child_info); + else + result = FALSE; + g_object_unref (child_enum); + } + else + result = FALSE; + } + + if (result && matchlet->mimetype) + { + if (strcmp (matchlet->mimetype, g_file_info_get_content_type (info)) != 0) + result = FALSE; + } + + g_object_unref (info); + g_object_unref (file); + } + while (!result); + + enumerator_free (e); + + if (!matchlet->matches) + return TRUE; + + for (l = matchlet->matches; l; l = l->next) + { + TreeMatchlet *submatchlet; + + submatchlet = l->data; + if (matchlet_match (submatchlet, root)) + return TRUE; + } + + return FALSE; +} + +static void +match_match (TreeMatch *match, + GFile *root, + GPtrArray *types) +{ + GList *l; + + for (l = match->matches; l; l = l->next) + { + TreeMatchlet *matchlet = l->data; + if (matchlet_match (matchlet, root)) + { + g_ptr_array_add (types, g_strdup (match->contenttype)); + break; + } + } +} + +/** + * g_content_type_guess_for_tree: + * @root: the root of the tree to guess a type for + * + * Tries to guess the type of the tree with root @root, by + * looking at the files it contains. The result is an array + * of content types, with the best guess coming first. + * + * The types returned all have the form x-content/foo, e.g. + * x-content/audio-cdda (for audio CDs) or x-content/image-dcf + * (for a camera memory card). See the shared-mime-info + * specification for more on x-content types. + * + * This function is useful in the implementation of g_mount_guess_content_type(). + * + * Returns: an %NULL-terminated array of zero or more content types, or %NULL. + * Free with g_strfreev() + * + * Since: 2.18 + */ +char ** +g_content_type_guess_for_tree (GFile *root) +{ + GPtrArray *types; + GList *l; + + types = g_ptr_array_new (); + + G_LOCK (gio_treemagic); + + tree_magic_init (); + for (l = tree_matches; l; l = l->next) + { + TreeMatch *match = l->data; + match_match (match, root, types); + } + + G_UNLOCK (gio_treemagic); + + g_ptr_array_add (types, NULL); + + return (char **)g_ptr_array_free (types, FALSE); +} + +#endif /* Unix version */ + +#define __G_CONTENT_TYPE_C__ +#include "gioaliasdef.c" diff --git a/gio/gcontenttype.h b/gio/gcontenttype.h new file mode 100644 index 0000000..95c9475 --- /dev/null +++ b/gio/gcontenttype.h @@ -0,0 +1,57 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CONTENT_TYPE_H__ +#define __G_CONTENT_TYPE_H__ + +#include + +G_BEGIN_DECLS + +gboolean g_content_type_equals (const char *type1, + const char *type2); +gboolean g_content_type_is_a (const char *type, + const char *supertype); +gboolean g_content_type_is_unknown (const char *type); +char * g_content_type_get_description (const char *type); +char * g_content_type_get_mime_type (const char *type); +GIcon * g_content_type_get_icon (const char *type); +gboolean g_content_type_can_be_executable (const char *type); + +char * g_content_type_from_mime_type (const char *mime_type); + +char * g_content_type_guess (const char *filename, + const guchar *data, + gsize data_size, + gboolean *result_uncertain); + +char ** g_content_type_guess_for_tree (GFile *root); + +GList * g_content_types_get_registered (void); + +G_END_DECLS + +#endif /* __G_CONTENT_TYPE_H__ */ diff --git a/gio/gcontenttypeprivate.h b/gio/gcontenttypeprivate.h new file mode 100644 index 0000000..a94d138 --- /dev/null +++ b/gio/gcontenttypeprivate.h @@ -0,0 +1,36 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_CONTENT_TYPE_PRIVATE_H__ +#define __G_CONTENT_TYPE_PRIVATE_H__ + +#include "gcontenttype.h" + +G_BEGIN_DECLS + +gsize _g_unix_content_type_get_sniff_len (void); +char * _g_unix_content_type_unalias (const char *type); +char **_g_unix_content_type_get_parents (const char *type); + +G_END_DECLS + +#endif /* __G_CONTENT_TYPE_PRIVATE_H__ */ diff --git a/gio/gconverter.c b/gio/gconverter.c new file mode 100644 index 0000000..8305b00 --- /dev/null +++ b/gio/gconverter.c @@ -0,0 +1,234 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gconverter.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gconverter + * @short_description: Data conversion interface + * @include: gio/gio.h + * @see_also: #GInputStream, #GOutputStream + * + * #GConverter is implemented by objects that convert + * binary data in various ways. The conversion can be + * stateful and may fail at any place. + * + * Some example conversions are: character set conversion, + * compression, decompression and regular expression + * replace. + * + * Since: 2.24 + **/ + +static void g_converter_base_init (gpointer g_class); + +GType +g_converter_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + const GTypeInfo converter_info = + { + sizeof (GConverterIface), /* class_size */ + g_converter_base_init, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL + }; + GType g_define_type_id = + g_type_register_static (G_TYPE_INTERFACE, I_("GConverter"), + &converter_info, 0); + + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +static void +g_converter_base_init (gpointer g_class) +{ +} + +/** + * g_converter_convert: + * @converter: a #GConverter. + * @inbuf: the buffer containing the data to convert. + * @inbuf_size: the number of bytes in @inbuf + * @outbuf: a buffer to write converted data in. + * @outbuf_size: the number of bytes in @outbuf, must be at least one + * @flags: a #GConvertFlags controlling the conversion details + * @bytes_read: will be set to the number of bytes read from @inbuf on success + * @bytes_written: will be set to the number of bytes written to @outbuf on success + * @error: location to store the error occuring, or %NULL to ignore + * + * This is the main operation used when converting data. It is to be called + * multiple times in a loop, and each time it will do some work, i.e. + * producing some output (in @outbuf) or consuming some input (from @inbuf) or + * both. If its not possible to do any work an error is returned. + * + * Note that a single call may not consume all input (or any input at all). + * Also a call may produce output even if given no input, due to state stored + * in the converter producing output. + * + * If any data was either produced or consumed, and then an error happens, then + * only the successful conversion is reported and the error is returned on the + * next call. + * + * A full conversion loop involves calling this method repeatedly, each time + * giving it new input and space output space. When there is no more input + * data after the data in @inbuf, the flag %G_CONVERTER_INPUT_AT_END must be set. + * The loop will be (unless some error happens) returning %G_CONVERTER_CONVERTED + * each time until all data is consumed and all output is produced, then + * %G_CONVERTER_FINISHED is returned instead. Note, that %G_CONVERTER_FINISHED + * may be returned even if %G_CONVERTER_INPUT_AT_END is not set, for instance + * in a decompression converter where the end of data is detectable from the + * data (and there might even be other data after the end of the compressed data). + * + * When some data has successfully been converted @bytes_read and is set to + * the number of bytes read from @inbuf, and @bytes_written is set to indicate + * how many bytes was written to @outbuf. If there are more data to output + * or consume (i.e. unless the G_CONVERTER_INPUT_AT_END is specified) then + * G_CONVERTER_CONVERTED is returned, and if no more data is to be output + * then G_CONVERTER_FINISHED is returned. + * + * On error %G_CONVERTER_ERROR is returned and @error is set accordingly. + * Some errors need special handling: + * + * %G_IO_ERROR_NO_SPACE is returned if there is not enough space + * to write the resulting converted data, the application should + * call the function again with a larger @outbuf to continue. + * + * %G_IO_ERROR_PARTIAL_INPUT is returned if there is not enough + * input to fully determine what the conversion should produce, + * and the %G_CONVERTER_INPUT_AT_END flag is not set. This happens for + * example with an incomplete multibyte sequence when converting text, + * or when a regexp matches up to the end of the input (and may match + * further input). It may also happen when @inbuf_size is zero and + * there is no more data to produce. + * + * When this happens the application should read more input and then + * call the function again. If further input shows that there is no + * more data call the function again with the same data but with + * the %G_CONVERTER_INPUT_AT_END flag set. This may cause the conversion + * to finish as e.g. in the regexp match case (or, to fail again with + * %G_IO_ERROR_PARTIAL_INPUT in e.g. a charset conversion where the + * input is actually partial). + * + * After g_converter_convert() has returned %G_CONVERTER_FINISHED the + * converter object is in an invalid state where its not allowed + * to call g_converter_convert() anymore. At this time you can only + * free the object or call g_converter_reset() to reset it to the + * initial state. + * + * If the flag %G_CONVERTER_FLUSH is set then conversion is modified + * to try to write out all internal state to the output. The application + * has to call the function multiple times with the flag set, and when + * the availible input has been consumed and all internal state has + * been produced then %G_CONVERTER_FLUSHED (or %G_CONVERTER_FINISHED if + * really at the end) is returned instead of %G_CONVERTER_CONVERTED. + * This is somewhat similar to what happens at the end of the input stream, + * but done in the middle of the data. + * + * This has different meanings for different conversions. For instance + * in a compression converter it would mean that we flush all the + * compression state into output such that if you uncompress the + * compressed data you get back all the input data. Doing this may + * make the final file larger due to padding though. Another example + * is a regexp conversion, where if you at the end of the flushed data + * have a match, but there is also a potential longer match. In the + * non-flushed case we would ask for more input, but when flushing we + * treat this as the end of input and do the match. + * + * Flushing is not always possible (like if a charset converter flushes + * at a partial multibyte sequence). Converters are supposed to try + * to produce as much output as possible and then return an error + * (typically %G_IO_ERROR_PARTIAL_INPUT). + * + * Returns: a #GConverterResult, %G_CONVERTER_ERROR on error. + * + * Since: 2.24 + **/ +GConverterResult +g_converter_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + GConverterIface *iface; + + g_return_val_if_fail (G_IS_CONVERTER (converter), G_CONVERTER_ERROR); + g_return_val_if_fail (outbuf_size > 0, G_CONVERTER_ERROR); + + *bytes_read = 0; + *bytes_written = 0; + + iface = G_CONVERTER_GET_IFACE (converter); + + return (* iface->convert) (converter, + inbuf, inbuf_size, + outbuf, outbuf_size, + flags, + bytes_read, bytes_written, error); +} + +/** + * g_converter_reset: + * @converter: a #GConverter. + * + * Resets all internal state in the converter, making it behave + * as if it was just created. If the converter has any internal + * state that would produce output then that output is lost. + * + * Since: 2.24 + **/ +void +g_converter_reset (GConverter *converter) +{ + GConverterIface *iface; + + g_return_if_fail (G_IS_CONVERTER (converter)); + + iface = G_CONVERTER_GET_IFACE (converter); + + (* iface->reset) (converter); +} + +#define __G_CONVERTER_C__ +#include "gioaliasdef.c" diff --git a/gio/gconverter.h b/gio/gconverter.h new file mode 100644 index 0000000..6770aaf --- /dev/null +++ b/gio/gconverter.h @@ -0,0 +1,95 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CONVERTER_H__ +#define __G_CONVERTER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_CONVERTER (g_converter_get_type ()) +#define G_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_CONVERTER, GConverter)) +#define G_IS_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_CONVERTER)) +#define G_CONVERTER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_CONVERTER, GConverterIface)) + +/** + * GConverter: + * + * Seek object for streaming operations. + * + * Since: 2.24 + **/ +typedef struct _GConverterIface GConverterIface; + +/** + * GConverterIface: + * @g_iface: The parent interface. + * @convert: Converts data. + * @reset: Reverts the internal state of the converter to its initial state. + * + * Provides an interface for converting data from one type + * to another type. The conversion can be stateful + * and may fail at any place. + * + * Since: 2.24 + **/ +struct _GConverterIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GConverterResult (* convert) (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error); + void (* reset) (GConverter *converter); +}; + +GType g_converter_get_type (void) G_GNUC_CONST; + +GConverterResult g_converter_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error); +void g_converter_reset (GConverter *converter); + + +G_END_DECLS + + +#endif /* __G_CONVERTER_H__ */ diff --git a/gio/gconverterinputstream.c b/gio/gconverterinputstream.c new file mode 100644 index 0000000..5dad35d --- /dev/null +++ b/gio/gconverterinputstream.c @@ -0,0 +1,555 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gconverterinputstream.h" +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gconverterinputstream + * @short_description: Converter Input Stream + * @include: gio/gio.h + * @see_also: #GInputStream, #GConverter + * + * Converter input stream implements #GInputStream and allows + * conversion of data of various types during reading. + * + **/ + +#define INITIAL_BUFFER_SIZE 4096 + +typedef struct { + char *data; + gsize start; + gsize end; + gsize size; +} Buffer; + +struct _GConverterInputStreamPrivate { + gboolean at_input_end; + gboolean finished; + GConverter *converter; + Buffer input_buffer; + Buffer converted_buffer; +}; + +enum { + PROP_0, + PROP_CONVERTER +}; + +static void g_converter_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_converter_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_converter_input_stream_finalize (GObject *object); +static gssize g_converter_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE (GConverterInputStream, + g_converter_input_stream, + G_TYPE_FILTER_INPUT_STREAM) + +static void +g_converter_input_stream_class_init (GConverterInputStreamClass *klass) +{ + GObjectClass *object_class; + GInputStreamClass *istream_class; + + g_type_class_add_private (klass, sizeof (GConverterInputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_converter_input_stream_get_property; + object_class->set_property = g_converter_input_stream_set_property; + object_class->finalize = g_converter_input_stream_finalize; + + istream_class = G_INPUT_STREAM_CLASS (klass); + istream_class->read_fn = g_converter_input_stream_read; + + g_object_class_install_property (object_class, + PROP_CONVERTER, + g_param_spec_object ("converter", + P_("Converter"), + P_("The converter object"), + G_TYPE_CONVERTER, + G_PARAM_READWRITE| + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_STATIC_STRINGS)); + +} + +static void +g_converter_input_stream_finalize (GObject *object) +{ + GConverterInputStreamPrivate *priv; + GConverterInputStream *stream; + + stream = G_CONVERTER_INPUT_STREAM (object); + priv = stream->priv; + + g_free (priv->input_buffer.data); + g_free (priv->converted_buffer.data); + if (priv->converter) + g_object_unref (priv->converter); + + G_OBJECT_CLASS (g_converter_input_stream_parent_class)->finalize (object); +} + +static void +g_converter_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GConverterInputStream *cstream; + + cstream = G_CONVERTER_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_CONVERTER: + cstream->priv->converter = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_converter_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GConverterInputStreamPrivate *priv; + GConverterInputStream *cstream; + + cstream = G_CONVERTER_INPUT_STREAM (object); + priv = cstream->priv; + + switch (prop_id) + { + case PROP_CONVERTER: + g_value_set_object (value, priv->converter); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} +static void +g_converter_input_stream_init (GConverterInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_CONVERTER_INPUT_STREAM, + GConverterInputStreamPrivate); +} + +/** + * g_converter_input_stream_new: + * @base_stream: a #GInputStream + * @converter: a #GConverter + * + * Creates a new converter input stream for the @base_stream. + * + * Returns: a new #GInputStream. + **/ +GInputStream * +g_converter_input_stream_new (GInputStream *base_stream, + GConverter *converter) +{ + GInputStream *stream; + + g_return_val_if_fail (G_IS_INPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_CONVERTER_INPUT_STREAM, + "base-stream", base_stream, + "converter", converter, + NULL); + + return stream; +} + +static gsize +buffer_available (Buffer *buffer) +{ + return buffer->end - buffer->start; +} + +static gsize +buffer_tailspace (Buffer *buffer) +{ + return buffer->size - buffer->end; +} + +static char * +buffer_data (Buffer *buffer) +{ + return buffer->data + buffer->start; +} + +static void +buffer_consumed (Buffer *buffer, + gsize count) +{ + buffer->start += count; + if (buffer->start == buffer->end) + buffer->start = buffer->end = 0; +} + +static void +buffer_read (Buffer *buffer, + char *dest, + gsize count) +{ + memcpy (dest, buffer->data + buffer->start, count); + buffer_consumed (buffer, count); +} + +static void +compact_buffer (Buffer *buffer) +{ + gsize in_buffer; + + in_buffer = buffer_available (buffer); + memmove (buffer->data, + buffer->data + buffer->start, + in_buffer); + buffer->end -= buffer->start; + buffer->start = 0; +} + +static void +grow_buffer (Buffer *buffer) +{ + char *data; + gsize size, in_buffer; + + if (buffer->size == 0) + size = INITIAL_BUFFER_SIZE; + else + size = buffer->size * 2; + + data = g_malloc (size); + in_buffer = buffer_available (buffer); + + memcpy (data, + buffer->data + buffer->start, + in_buffer); + g_free (buffer->data); + buffer->data = data; + buffer->end -= buffer->start; + buffer->start = 0; + buffer->size = size; +} + +static void +buffer_ensure_space (Buffer *buffer, + gsize at_least_size) +{ + gsize in_buffer, left_to_fill; + + in_buffer = buffer_available (buffer); + + if (in_buffer >= at_least_size) + return; + + left_to_fill = buffer_tailspace (buffer); + + if (in_buffer + left_to_fill >= at_least_size) + { + /* We fit in remaining space at end */ + /* If the copy is small, compact now anyway so we can fill more */ + if (in_buffer < 256) + compact_buffer (buffer); + } + else if (buffer->size >= at_least_size) + { + /* We fit, but only if we compact */ + compact_buffer (buffer); + } + else + { + /* Need to grow buffer */ + while (buffer->size < at_least_size) + grow_buffer (buffer); + } +} + +static gssize +fill_input_buffer (GConverterInputStream *stream, + gsize at_least_size, + GCancellable *cancellable, + GError **error) +{ + GConverterInputStreamPrivate *priv; + GInputStream *base_stream; + gssize nread; + + priv = stream->priv; + + buffer_ensure_space (&priv->input_buffer, at_least_size); + + base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + nread = g_input_stream_read (base_stream, + priv->input_buffer.data + priv->input_buffer.end, + buffer_tailspace (&priv->input_buffer), + cancellable, + error); + + if (nread > 0) + priv->input_buffer.end += nread; + + return nread; +} + + +static gssize +g_converter_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GConverterInputStream *cstream; + GConverterInputStreamPrivate *priv; + gsize available, total_bytes_read; + gssize nread; + GConverterResult res; + gsize bytes_read; + gsize bytes_written; + GError *my_error; + GError *my_error2; + + cstream = G_CONVERTER_INPUT_STREAM (stream); + priv = cstream->priv; + + available = buffer_available (&priv->converted_buffer); + + if (available > 0 && + count <= available) + { + /* Converted data available, return that */ + buffer_read (&priv->converted_buffer, buffer, count); + return count; + } + + /* Full request not available, read all currently available and request + refill/conversion for more */ + + buffer_read (&priv->converted_buffer, buffer, available); + + total_bytes_read = available; + count -= available; + + /* If there is no data to convert, and no pre-converted data, + do some i/o for more input */ + if (buffer_available (&priv->input_buffer) == 0 && + total_bytes_read == 0 && + !priv->at_input_end) + { + nread = fill_input_buffer (cstream, count, cancellable, error); + if (nread < 0) + return -1; + if (nread == 0) + priv->at_input_end = TRUE; + } + + /* First try to convert any available data (or state) directly to the user buffer: */ + if (!priv->finished) + { + my_error = NULL; + res = g_converter_convert (priv->converter, + buffer_data (&priv->input_buffer), + buffer_available (&priv->input_buffer), + buffer, count, + priv->at_input_end ? G_CONVERTER_INPUT_AT_END : 0, + &bytes_read, + &bytes_written, + &my_error); + if (res != G_CONVERTER_ERROR) + { + total_bytes_read += bytes_written; + buffer_consumed (&priv->input_buffer, bytes_read); + if (res == G_CONVERTER_FINISHED) + priv->finished = TRUE; /* We're done converting */ + } + else if (total_bytes_read == 0 && + !g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_PARTIAL_INPUT) && + !g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE)) + { + /* No previously read data and no "special" error, return error */ + g_propagate_error (error, my_error); + return -1; + } + else + g_error_free (my_error); + } + + /* We had some pre-converted data and/or we converted directly to the + user buffer */ + if (total_bytes_read > 0) + return total_bytes_read; + + /* If there is no more to convert, return EOF */ + if (priv->finished) + { + g_assert (buffer_available (&priv->converted_buffer) == 0); + return 0; + } + + /* There was "complexity" in the straight-to-buffer conversion, + * convert to our own buffer and write from that. + * At this point we didn't produce any data into @buffer. + */ + + /* Ensure we have *some* initial target space */ + buffer_ensure_space (&priv->converted_buffer, count); + + while (TRUE) + { + g_assert (!priv->finished); + + /* Try to convert to our buffer */ + my_error = NULL; + res = g_converter_convert (priv->converter, + buffer_data (&priv->input_buffer), + buffer_available (&priv->input_buffer), + buffer_data (&priv->converted_buffer), + buffer_tailspace (&priv->converted_buffer), + priv->at_input_end ? G_CONVERTER_INPUT_AT_END : 0, + &bytes_read, + &bytes_written, + &my_error); + if (res != G_CONVERTER_ERROR) + { + priv->converted_buffer.end += bytes_written; + buffer_consumed (&priv->input_buffer, bytes_read); + + /* Maybe we consumed without producing any output */ + if (buffer_available (&priv->converted_buffer) == 0 && res != G_CONVERTER_FINISHED) + continue; /* Convert more */ + + if (res == G_CONVERTER_FINISHED) + priv->finished = TRUE; + + total_bytes_read = MIN (count, buffer_available (&priv->converted_buffer)); + buffer_read (&priv->converted_buffer, buffer, total_bytes_read); + + g_assert (priv->finished || total_bytes_read > 0); + + return total_bytes_read; + } + + /* There was some kind of error filling our buffer */ + + if (g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_PARTIAL_INPUT) && + !priv->at_input_end) + { + /* Need more data */ + my_error2 = NULL; + res = fill_input_buffer (cstream, + buffer_available (&priv->input_buffer) + 4096, + cancellable, + &my_error2); + if (res < 0) + { + /* Can't read any more data, return that error */ + g_error_free (my_error); + g_propagate_error (error, my_error2); + return -1; + } + else if (res == 0) + { + /* End of file, try INPUT_AT_END */ + priv->at_input_end = TRUE; + } + g_error_free (my_error); + continue; + } + + if (g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE)) + { + /* Need more destination space, grow it + * Note: if we actually grow the buffer (as opposed to compacting it), + * this will double the size, not just add one byte. */ + buffer_ensure_space (&priv->converted_buffer, + priv->converted_buffer.size + 1); + g_error_free (my_error); + continue; + } + + /* Any other random error, return it */ + g_propagate_error (error, my_error); + return -1; + } + + g_assert_not_reached (); +} + +/** + * g_converter_input_stream_get_converter: + * @converter_stream: a #GConverterInputStream + * + * Gets the #GConverter that is used by @converter_stream. + * + * Returns: the converter of the converter input stream + * + * Since: 2.24 + */ +GConverter * +g_converter_input_stream_get_converter (GConverterInputStream *converter_stream) +{ + return converter_stream->priv->converter; +} + +#define __G_CONVERTER_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gconverterinputstream.h b/gio/gconverterinputstream.h new file mode 100644 index 0000000..d2ef887 --- /dev/null +++ b/gio/gconverterinputstream.h @@ -0,0 +1,80 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CONVERTER_INPUT_STREAM_H__ +#define __G_CONVERTER_INPUT_STREAM_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_CONVERTER_INPUT_STREAM (g_converter_input_stream_get_type ()) +#define G_CONVERTER_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_CONVERTER_INPUT_STREAM, GConverterInputStream)) +#define G_CONVERTER_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_CONVERTER_INPUT_STREAM, GConverterInputStreamClass)) +#define G_IS_CONVERTER_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_CONVERTER_INPUT_STREAM)) +#define G_IS_CONVERTER_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CONVERTER_INPUT_STREAM)) +#define G_CONVERTER_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CONVERTER_INPUT_STREAM, GConverterInputStreamClass)) + +/** + * GConverterInputStream: + * @parent_interface: a #GFilterInputStream. + * + * An implementation of #GFilterInputStream that allows data + * conversion. + **/ +typedef struct _GConverterInputStreamClass GConverterInputStreamClass; +typedef struct _GConverterInputStreamPrivate GConverterInputStreamPrivate; + +struct _GConverterInputStream +{ + GFilterInputStream parent_instance; + + /*< private >*/ + GConverterInputStreamPrivate *priv; +}; + +struct _GConverterInputStreamClass +{ + GFilterInputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_converter_input_stream_get_type (void) G_GNUC_CONST; +GInputStream *g_converter_input_stream_new (GInputStream *base_stream, + GConverter *converter); +GConverter *g_converter_input_stream_get_converter (GConverterInputStream *converter_stream); + +G_END_DECLS + +#endif /* __G_CONVERTER_INPUT_STREAM_H__ */ diff --git a/gio/gconverteroutputstream.c b/gio/gconverteroutputstream.c new file mode 100644 index 0000000..d1e1b6f --- /dev/null +++ b/gio/gconverteroutputstream.c @@ -0,0 +1,606 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gconverteroutputstream.h" +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gconverteroutputstream + * @short_description: Converter Output Stream + * @include: gio/gio.h + * @see_also: #GOutputStream, #GConverter + * + * Converter output stream implements #GOutputStream and allows + * conversion of data of various types during reading. + * + **/ + +#define INITIAL_BUFFER_SIZE 4096 + +typedef struct { + char *data; + gsize start; + gsize end; + gsize size; +} Buffer; + +struct _GConverterOutputStreamPrivate { + gboolean at_output_end; + gboolean finished; + GConverter *converter; + Buffer output_buffer; /* To be converted and written */ + Buffer converted_buffer; /* Already converted */ +}; + +/* Buffering strategy: + * + * Each time we write we must at least consume some input, or + * return an error. Thus we start with writing all already + * converted data and *then* we start converting (reporting + * an error at any point in this). + * + * Its possible that what the user wrote is not enough data + * for the converter, so we must then buffer it in output_buffer + * and ask for more data, but we want to avoid this as much as + * possible, converting directly from the users buffer. + */ + +enum { + PROP_0, + PROP_CONVERTER +}; + +static void g_converter_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_converter_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_converter_output_stream_finalize (GObject *object); +static gssize g_converter_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_converter_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE (GConverterOutputStream, + g_converter_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM) + +static void +g_converter_output_stream_class_init (GConverterOutputStreamClass *klass) +{ + GObjectClass *object_class; + GOutputStreamClass *istream_class; + + g_type_class_add_private (klass, sizeof (GConverterOutputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_converter_output_stream_get_property; + object_class->set_property = g_converter_output_stream_set_property; + object_class->finalize = g_converter_output_stream_finalize; + + istream_class = G_OUTPUT_STREAM_CLASS (klass); + istream_class->write_fn = g_converter_output_stream_write; + istream_class->flush = g_converter_output_stream_flush; + + g_object_class_install_property (object_class, + PROP_CONVERTER, + g_param_spec_object ("converter", + P_("Converter"), + P_("The converter object"), + G_TYPE_CONVERTER, + G_PARAM_READWRITE| + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_STATIC_STRINGS)); + +} + +static void +g_converter_output_stream_finalize (GObject *object) +{ + GConverterOutputStreamPrivate *priv; + GConverterOutputStream *stream; + + stream = G_CONVERTER_OUTPUT_STREAM (object); + priv = stream->priv; + + g_free (priv->output_buffer.data); + g_free (priv->converted_buffer.data); + if (priv->converter) + g_object_unref (priv->converter); + + G_OBJECT_CLASS (g_converter_output_stream_parent_class)->finalize (object); +} + +static void +g_converter_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GConverterOutputStream *cstream; + + cstream = G_CONVERTER_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_CONVERTER: + cstream->priv->converter = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_converter_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GConverterOutputStreamPrivate *priv; + GConverterOutputStream *cstream; + + cstream = G_CONVERTER_OUTPUT_STREAM (object); + priv = cstream->priv; + + switch (prop_id) + { + case PROP_CONVERTER: + g_value_set_object (value, priv->converter); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_converter_output_stream_init (GConverterOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_CONVERTER_OUTPUT_STREAM, + GConverterOutputStreamPrivate); +} + +/** + * g_converter_output_stream_new: + * @base_stream: a #GOutputStream + * @converter: a #GConverter + * + * Creates a new converter output stream for the @base_stream. + * + * Returns: a new #GOutputStream. + **/ +GOutputStream * +g_converter_output_stream_new (GOutputStream *base_stream, + GConverter *converter) +{ + GOutputStream *stream; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_CONVERTER_OUTPUT_STREAM, + "base-stream", base_stream, + "converter", converter, + NULL); + + return stream; +} + +static gsize +buffer_available (Buffer *buffer) +{ + return buffer->end - buffer->start; +} + +static gsize +buffer_tailspace (Buffer *buffer) +{ + return buffer->size - buffer->end; +} + +static char * +buffer_data (Buffer *buffer) +{ + return buffer->data + buffer->start; +} + +static void +buffer_consumed (Buffer *buffer, + gsize count) +{ + buffer->start += count; + if (buffer->start == buffer->end) + buffer->start = buffer->end = 0; +} + +static void +compact_buffer (Buffer *buffer) +{ + gsize in_buffer; + + in_buffer = buffer_available (buffer); + memmove (buffer->data, + buffer->data + buffer->start, + in_buffer); + buffer->end -= buffer->start; + buffer->start = 0; +} + +static void +grow_buffer (Buffer *buffer) +{ + char *data; + gsize size, in_buffer; + + if (buffer->size == 0) + size = INITIAL_BUFFER_SIZE; + else + size = buffer->size * 2; + + data = g_malloc (size); + in_buffer = buffer_available (buffer); + + memcpy (data, + buffer->data + buffer->start, + in_buffer); + g_free (buffer->data); + buffer->data = data; + buffer->end -= buffer->start; + buffer->start = 0; + buffer->size = size; +} + +static void +buffer_ensure_space (Buffer *buffer, + gsize at_least_size) +{ + gsize in_buffer, left_to_fill; + + in_buffer = buffer_available (buffer); + + if (in_buffer >= at_least_size) + return; + + left_to_fill = buffer_tailspace (buffer); + + if (in_buffer + left_to_fill >= at_least_size) + { + /* We fit in remaining space at end */ + /* If the copy is small, compact now anyway so we can fill more */ + if (in_buffer < 256) + compact_buffer (buffer); + } + else if (buffer->size >= at_least_size) + { + /* We fit, but only if we compact */ + compact_buffer (buffer); + } + else + { + /* Need to grow buffer */ + while (buffer->size < at_least_size) + grow_buffer (buffer); + } +} + +static void +buffer_append (Buffer *buffer, + const char *data, + gsize data_size) +{ + buffer_ensure_space (buffer, + buffer_available (buffer) + data_size); + memcpy (buffer->data + buffer->end, data, data_size); + buffer->end += data_size; +} + + +static gboolean +flush_buffer (GConverterOutputStream *stream, + Buffer *buffer, + GCancellable *cancellable, + GError **error) +{ + GConverterOutputStreamPrivate *priv; + GOutputStream *base_stream; + gsize nwritten; + gsize available; + gboolean res; + + priv = stream->priv; + + base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + + available = buffer_available (&priv->converted_buffer); + if (available > 0) + { + res = g_output_stream_write_all (base_stream, + buffer_data (&priv->converted_buffer), + available, + &nwritten, + cancellable, + error); + buffer_consumed (&priv->converted_buffer, nwritten); + return res; + } + return TRUE; +} + + +static gssize +g_converter_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GConverterOutputStream *cstream; + GConverterOutputStreamPrivate *priv; + gssize retval; + GConverterResult res; + gsize bytes_read; + gsize bytes_written; + GError *my_error; + const char *to_convert; + gsize to_convert_size, converted_bytes; + gboolean converting_from_buffer; + + cstream = G_CONVERTER_OUTPUT_STREAM (stream); + priv = cstream->priv; + + /* Write out all available pre-converted data and fail if + not possible */ + if (!flush_buffer (cstream, &priv->converted_buffer, cancellable, error)) + return -1; + + if (priv->finished) + return 0; + + /* Convert as much as possible */ + if (buffer_available (&priv->output_buffer) > 0) + { + converting_from_buffer = TRUE; + buffer_append (&priv->output_buffer, buffer, count); + to_convert = buffer_data (&priv->output_buffer); + to_convert_size = buffer_available (&priv->output_buffer); + } + else + { + converting_from_buffer = FALSE; + to_convert = buffer; + to_convert_size = count; + } + + /* Ensure we have *some* initial target space */ + buffer_ensure_space (&priv->converted_buffer, to_convert_size); + + converted_bytes = 0; + while (!priv->finished && converted_bytes < to_convert_size) + { + /* Try to convert to our buffer */ + my_error = NULL; + res = g_converter_convert (priv->converter, + to_convert + converted_bytes, + to_convert_size - converted_bytes, + buffer_data (&priv->converted_buffer), + buffer_tailspace (&priv->converted_buffer), + 0, + &bytes_read, + &bytes_written, + &my_error); + + if (res != G_CONVERTER_ERROR) + { + priv->converted_buffer.end += bytes_written; + converted_bytes += bytes_read; + + if (res == G_CONVERTER_FINISHED) + priv->finished = TRUE; + } + else + { + /* No-space errors can be handled locally: */ + if (g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE)) + { + /* Need more destination space, grow it + * Note: if we actually grow the buffer (as opposed to compacting it), + * this will double the size, not just add one byte. */ + buffer_ensure_space (&priv->converted_buffer, + priv->converted_buffer.size + 1); + g_error_free (my_error); + continue; + } + + if (converted_bytes > 0) + { + /* We got an conversion error, but we did convert some bytes before + that, so handle those before reporting the error */ + g_error_free (my_error); + break; + } + + if (g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_PARTIAL_INPUT)) + { + /* Consume everything to buffer that we append to next time + we write */ + if (!converting_from_buffer) + buffer_append (&priv->output_buffer, buffer, count); + /* in the converting_from_buffer case we already appended this */ + + return count; /* consume everything */ + } + + /* Converted no data and got an normal error, return it */ + g_propagate_error (error, my_error); + return -1; + } + } + + if (converting_from_buffer) + { + buffer_consumed (&priv->output_buffer, converted_bytes); + retval = count; + } + else + retval = converted_bytes; + + /* We now successfully consumed retval bytes, so we can't return an error, + even if writing this to the base stream fails. If it does we'll just + stop early and report this error when we try again on the next + write call. */ + flush_buffer (cstream, &priv->converted_buffer, cancellable, NULL); + + return retval; +} + +static gboolean +g_converter_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GConverterOutputStream *cstream; + GConverterOutputStreamPrivate *priv; + GConverterResult res; + GError *my_error; + gboolean is_closing; + gboolean flushed; + gsize bytes_read; + gsize bytes_written; + + cstream = G_CONVERTER_OUTPUT_STREAM (stream); + priv = cstream->priv; + + is_closing = g_output_stream_is_closing (stream); + + /* Write out all available pre-converted data and fail if + not possible */ + if (!flush_buffer (cstream, &priv->converted_buffer, cancellable, error)) + return FALSE; + + /* Ensure we have *some* initial target space */ + buffer_ensure_space (&priv->converted_buffer, 1); + + /* Convert whole buffer */ + flushed = FALSE; + while (!priv->finished && !flushed) + { + /* Try to convert to our buffer */ + my_error = NULL; + res = g_converter_convert (priv->converter, + buffer_data (&priv->output_buffer), + buffer_available (&priv->output_buffer), + buffer_data (&priv->converted_buffer), + buffer_tailspace (&priv->converted_buffer), + is_closing ? G_CONVERTER_INPUT_AT_END : G_CONVERTER_FLUSH, + &bytes_read, + &bytes_written, + &my_error); + + if (res != G_CONVERTER_ERROR) + { + priv->converted_buffer.end += bytes_written; + buffer_consumed (&priv->output_buffer, bytes_read); + + if (res == G_CONVERTER_FINISHED) + priv->finished = TRUE; + if (!is_closing && + res == G_CONVERTER_FLUSHED) + { + /* Should not have retured FLUSHED with input left */ + g_assert (buffer_available (&priv->output_buffer) == 0); + flushed = TRUE; + } + } + else + { + /* No-space errors can be handled locally: */ + if (g_error_matches (my_error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE)) + { + /* Need more destination space, grow it + * Note: if we actually grow the buffer (as opposed to compacting it), + * this will double the size, not just add one byte. */ + buffer_ensure_space (&priv->converted_buffer, + priv->converted_buffer.size + 1); + g_error_free (my_error); + continue; + } + + /* Any other error, including PARTIAL_INPUT can't be fixed by now + and is an error */ + g_propagate_error (error, my_error); + return -1; + } + } + + /* Now write all converted data to base stream */ + if (!flush_buffer (cstream, &priv->converted_buffer, cancellable, error)) + return FALSE; + + return TRUE; +} + +/** + * g_converter_output_stream_get_converter: + * @converter_stream: a #GConverterOutputStream + * + * Gets the #GConverter that is used by @converter_stream. + * + * Returns: the converter of the converter output stream + * + * Since: 2.24 + */ +GConverter * +g_converter_output_stream_get_converter (GConverterOutputStream *converter_stream) +{ + return converter_stream->priv->converter; +} + +#define __G_CONVERTER_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gconverteroutputstream.h b/gio/gconverteroutputstream.h new file mode 100644 index 0000000..afcb74f --- /dev/null +++ b/gio/gconverteroutputstream.h @@ -0,0 +1,80 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CONVERTER_OUTPUT_STREAM_H__ +#define __G_CONVERTER_OUTPUT_STREAM_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_CONVERTER_OUTPUT_STREAM (g_converter_output_stream_get_type ()) +#define G_CONVERTER_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_CONVERTER_OUTPUT_STREAM, GConverterOutputStream)) +#define G_CONVERTER_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_CONVERTER_OUTPUT_STREAM, GConverterOutputStreamClass)) +#define G_IS_CONVERTER_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_CONVERTER_OUTPUT_STREAM)) +#define G_IS_CONVERTER_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CONVERTER_OUTPUT_STREAM)) +#define G_CONVERTER_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CONVERTER_OUTPUT_STREAM, GConverterOutputStreamClass)) + +/** + * GConverterOutputStream: + * @parent_instance: a #GFilterOutputStream. + * + * An implementation of #GFilterOutputStream that allows data + * conversion. + **/ +typedef struct _GConverterOutputStreamClass GConverterOutputStreamClass; +typedef struct _GConverterOutputStreamPrivate GConverterOutputStreamPrivate; + +struct _GConverterOutputStream +{ + GFilterOutputStream parent_instance; + + /*< private >*/ + GConverterOutputStreamPrivate *priv; +}; + +struct _GConverterOutputStreamClass +{ + GFilterOutputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_converter_output_stream_get_type (void) G_GNUC_CONST; +GOutputStream *g_converter_output_stream_new (GOutputStream *base_stream, + GConverter *converter); +GConverter *g_converter_output_stream_get_converter (GConverterOutputStream *converter_stream); + +G_END_DECLS + +#endif /* __G_CONVERTER_OUTPUT_STREAM_H__ */ diff --git a/gio/gdatainputstream.c b/gio/gdatainputstream.c new file mode 100644 index 0000000..4a380f7 --- /dev/null +++ b/gio/gdatainputstream.c @@ -0,0 +1,1252 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Jürg Billeter + * Copyright © 2009 Codethink Limited + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gdatainputstream.h" +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gdatainputstream + * @short_description: Data Input Stream + * @include: gio/gio.h + * @see_also: #GInputStream + * + * Data input stream implements #GInputStream and includes functions for + * reading structured data directly from a binary input stream. + * + **/ + +struct _GDataInputStreamPrivate { + GDataStreamByteOrder byte_order; + GDataStreamNewlineType newline_type; +}; + +enum { + PROP_0, + PROP_BYTE_ORDER, + PROP_NEWLINE_TYPE +}; + +static void g_data_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_data_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +G_DEFINE_TYPE (GDataInputStream, + g_data_input_stream, + G_TYPE_BUFFERED_INPUT_STREAM) + + +static void +g_data_input_stream_class_init (GDataInputStreamClass *klass) +{ + GObjectClass *object_class; + + g_type_class_add_private (klass, sizeof (GDataInputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_data_input_stream_get_property; + object_class->set_property = g_data_input_stream_set_property; + + /** + * GDataStream:byte-order: + * + * The ::byte-order property determines the byte ordering that + * is used when reading multi-byte entities (such as integers) + * from the stream. + */ + g_object_class_install_property (object_class, + PROP_BYTE_ORDER, + g_param_spec_enum ("byte-order", + P_("Byte order"), + P_("The byte order"), + G_TYPE_DATA_STREAM_BYTE_ORDER, + G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN, + G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB)); + + /** + * GDataStream:newline-type: + * + * The :newline-type property determines what is considered + * as a line ending when reading complete lines from the stream. + */ + g_object_class_install_property (object_class, + PROP_NEWLINE_TYPE, + g_param_spec_enum ("newline-type", + P_("Newline type"), + P_("The accepted types of line ending"), + G_TYPE_DATA_STREAM_NEWLINE_TYPE, + G_DATA_STREAM_NEWLINE_TYPE_LF, + G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB)); +} + +static void +g_data_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDataInputStream *dstream; + + dstream = G_DATA_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BYTE_ORDER: + g_data_input_stream_set_byte_order (dstream, g_value_get_enum (value)); + break; + + case PROP_NEWLINE_TYPE: + g_data_input_stream_set_newline_type (dstream, g_value_get_enum (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_data_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDataInputStreamPrivate *priv; + GDataInputStream *dstream; + + dstream = G_DATA_INPUT_STREAM (object); + priv = dstream->priv; + + switch (prop_id) + { + case PROP_BYTE_ORDER: + g_value_set_enum (value, priv->byte_order); + break; + + case PROP_NEWLINE_TYPE: + g_value_set_enum (value, priv->newline_type); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} +static void +g_data_input_stream_init (GDataInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_DATA_INPUT_STREAM, + GDataInputStreamPrivate); + + stream->priv->byte_order = G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN; + stream->priv->newline_type = G_DATA_STREAM_NEWLINE_TYPE_LF; +} + +/** + * g_data_input_stream_new: + * @base_stream: a #GInputStream. + * + * Creates a new data input stream for the @base_stream. + * + * Returns: a new #GDataInputStream. + **/ +GDataInputStream * +g_data_input_stream_new (GInputStream *base_stream) +{ + GDataInputStream *stream; + + g_return_val_if_fail (G_IS_INPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_DATA_INPUT_STREAM, + "base-stream", base_stream, + NULL); + + return stream; +} + +/** + * g_data_input_stream_set_byte_order: + * @stream: a given #GDataInputStream. + * @order: a #GDataStreamByteOrder to set. + * + * This function sets the byte order for the given @stream. All subsequent + * reads from the @stream will be read in the given @order. + * + **/ +void +g_data_input_stream_set_byte_order (GDataInputStream *stream, + GDataStreamByteOrder order) +{ + GDataInputStreamPrivate *priv; + + g_return_if_fail (G_IS_DATA_INPUT_STREAM (stream)); + + priv = stream->priv; + + if (priv->byte_order != order) + { + priv->byte_order = order; + + g_object_notify (G_OBJECT (stream), "byte-order"); + } +} + +/** + * g_data_input_stream_get_byte_order: + * @stream: a given #GDataInputStream. + * + * Gets the byte order for the data input stream. + * + * Returns: the @stream's current #GDataStreamByteOrder. + **/ +GDataStreamByteOrder +g_data_input_stream_get_byte_order (GDataInputStream *stream) +{ + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN); + + return stream->priv->byte_order; +} + +/** + * g_data_input_stream_set_newline_type: + * @stream: a #GDataInputStream. + * @type: the type of new line return as #GDataStreamNewlineType. + * + * Sets the newline type for the @stream. + * + * Note that using G_DATA_STREAM_NEWLINE_TYPE_ANY is slightly unsafe. If a read + * chunk ends in "CR" we must read an additional byte to know if this is "CR" or + * "CR LF", and this might block if there is no more data availible. + * + **/ +void +g_data_input_stream_set_newline_type (GDataInputStream *stream, + GDataStreamNewlineType type) +{ + GDataInputStreamPrivate *priv; + + g_return_if_fail (G_IS_DATA_INPUT_STREAM (stream)); + + priv = stream->priv; + + if (priv->newline_type != type) + { + priv->newline_type = type; + + g_object_notify (G_OBJECT (stream), "newline-type"); + } +} + +/** + * g_data_input_stream_get_newline_type: + * @stream: a given #GDataInputStream. + * + * Gets the current newline type for the @stream. + * + * Returns: #GDataStreamNewlineType for the given @stream. + **/ +GDataStreamNewlineType +g_data_input_stream_get_newline_type (GDataInputStream *stream) +{ + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), G_DATA_STREAM_NEWLINE_TYPE_ANY); + + return stream->priv->newline_type; +} + +static gboolean +read_data (GDataInputStream *stream, + void *buffer, + gsize size, + GCancellable *cancellable, + GError **error) +{ + gsize available; + gssize res; + + while ((available = g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (stream))) < size) + { + res = g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (stream), + size - available, + cancellable, error); + if (res < 0) + return FALSE; + if (res == 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unexpected early end-of-stream")); + return FALSE; + } + } + + /* This should always succeed, since it's in the buffer */ + res = g_input_stream_read (G_INPUT_STREAM (stream), + buffer, size, + NULL, NULL); + g_warn_if_fail (res == size); + return TRUE; +} + + +/** + * g_data_input_stream_read_byte: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads an unsigned 8-bit/1-byte value from @stream. + * + * Returns: an unsigned 8-bit/1-byte value read from the @stream or %0 + * if an error occurred. + **/ +guchar +g_data_input_stream_read_byte (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + guchar c; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), '\0'); + + if (read_data (stream, &c, 1, cancellable, error)) + return c; + + return 0; +} + + +/** + * g_data_input_stream_read_int16: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a 16-bit/2-byte value from @stream. + * + * In order to get the correct byte order for this read operation, + * see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). + * + * Returns: a signed 16-bit/2-byte value read from @stream or %0 if + * an error occurred. + **/ +gint16 +g_data_input_stream_read_int16 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + gint16 v; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), 0); + + if (read_data (stream, &v, 2, cancellable, error)) + { + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + v = GINT16_FROM_BE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + v = GINT16_FROM_LE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + return v; + } + + return 0; +} + + +/** + * g_data_input_stream_read_uint16: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads an unsigned 16-bit/2-byte value from @stream. + * + * In order to get the correct byte order for this read operation, + * see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). + * + * Returns: an unsigned 16-bit/2-byte value read from the @stream or %0 if + * an error occurred. + **/ +guint16 +g_data_input_stream_read_uint16 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + guint16 v; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), 0); + + if (read_data (stream, &v, 2, cancellable, error)) + { + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + v = GUINT16_FROM_BE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + v = GUINT16_FROM_LE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + return v; + } + + return 0; +} + + +/** + * g_data_input_stream_read_int32: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a signed 32-bit/4-byte value from @stream. + * + * In order to get the correct byte order for this read operation, + * see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a signed 32-bit/4-byte value read from the @stream or %0 if + * an error occurred. + **/ +gint32 +g_data_input_stream_read_int32 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + gint32 v; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), 0); + + if (read_data (stream, &v, 4, cancellable, error)) + { + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + v = GINT32_FROM_BE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + v = GINT32_FROM_LE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + return v; + } + + return 0; +} + + +/** + * g_data_input_stream_read_uint32: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads an unsigned 32-bit/4-byte value from @stream. + * + * In order to get the correct byte order for this read operation, + * see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: an unsigned 32-bit/4-byte value read from the @stream or %0 if + * an error occurred. + **/ +guint32 +g_data_input_stream_read_uint32 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + guint32 v; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), 0); + + if (read_data (stream, &v, 4, cancellable, error)) + { + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + v = GUINT32_FROM_BE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + v = GUINT32_FROM_LE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + return v; + } + + return 0; +} + + +/** + * g_data_input_stream_read_int64: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a 64-bit/8-byte value from @stream. + * + * In order to get the correct byte order for this read operation, + * see g_data_stream_get_byte_order() and g_data_stream_set_byte_order(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a signed 64-bit/8-byte value read from @stream or %0 if + * an error occurred. + **/ +gint64 +g_data_input_stream_read_int64 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + gint64 v; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), 0); + + if (read_data (stream, &v, 8, cancellable, error)) + { + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + v = GINT64_FROM_BE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + v = GINT64_FROM_LE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + return v; + } + + return 0; +} + + +/** + * g_data_input_stream_read_uint64: + * @stream: a given #GDataInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads an unsigned 64-bit/8-byte value from @stream. + * + * In order to get the correct byte order for this read operation, + * see g_data_stream_get_byte_order(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: an unsigned 64-bit/8-byte read from @stream or %0 if + * an error occurred. + **/ +guint64 +g_data_input_stream_read_uint64 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + guint64 v; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), 0); + + if (read_data (stream, &v, 8, cancellable, error)) + { + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + v = GUINT64_FROM_BE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + v = GUINT64_FROM_LE (v); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + return v; + } + + return 0; +} + +static gssize +scan_for_newline (GDataInputStream *stream, + gsize *checked_out, + gboolean *last_saw_cr_out, + int *newline_len_out) +{ + GBufferedInputStream *bstream; + GDataInputStreamPrivate *priv; + const char *buffer; + gsize start, end, peeked; + int i; + gssize found_pos; + int newline_len; + gsize available, checked; + gboolean last_saw_cr; + + priv = stream->priv; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + + checked = *checked_out; + last_saw_cr = *last_saw_cr_out; + found_pos = -1; + newline_len = 0; + + start = checked; + buffer = (const char*)g_buffered_input_stream_peek_buffer (bstream, &available) + start; + end = available; + peeked = end - start; + + for (i = 0; checked < available && i < peeked; i++) + { + switch (priv->newline_type) + { + case G_DATA_STREAM_NEWLINE_TYPE_LF: + if (buffer[i] == 10) + { + found_pos = start + i; + newline_len = 1; + } + break; + case G_DATA_STREAM_NEWLINE_TYPE_CR: + if (buffer[i] == 13) + { + found_pos = start + i; + newline_len = 1; + } + break; + case G_DATA_STREAM_NEWLINE_TYPE_CR_LF: + if (last_saw_cr && buffer[i] == 10) + { + found_pos = start + i - 1; + newline_len = 2; + } + break; + default: + case G_DATA_STREAM_NEWLINE_TYPE_ANY: + if (buffer[i] == 10) /* LF */ + { + if (last_saw_cr) + { + /* CR LF */ + found_pos = start + i - 1; + newline_len = 2; + } + else + { + /* LF */ + found_pos = start + i; + newline_len = 1; + } + } + else if (last_saw_cr) + { + /* Last was cr, this is not LF, end is CR */ + found_pos = start + i - 1; + newline_len = 1; + } + /* Don't check for CR here, instead look at last_saw_cr on next byte */ + break; + } + + last_saw_cr = (buffer[i] == 13); + + if (found_pos != -1) + { + *newline_len_out = newline_len; + return found_pos; + } + } + + checked = end; + + *checked_out = checked; + *last_saw_cr_out = last_saw_cr; + return -1; +} + + +/** + * g_data_input_stream_read_line: + * @stream: a given #GDataInputStream. + * @length: a #gsize to get the length of the data read in. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a line from the data input stream. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a string with the line that was read in (without the newlines). + * Set @length to a #gsize to get the length of the read line. + * On an error, it will return %NULL and @error will be set. If there's no + * content to read, it will still return %NULL, but @error won't be set. + **/ +char * +g_data_input_stream_read_line (GDataInputStream *stream, + gsize *length, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStream *bstream; + gsize checked; + gboolean last_saw_cr; + gssize found_pos; + gssize res; + int newline_len; + char *line; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), NULL); + + bstream = G_BUFFERED_INPUT_STREAM (stream); + + newline_len = 0; + checked = 0; + last_saw_cr = FALSE; + + while ((found_pos = scan_for_newline (stream, &checked, &last_saw_cr, &newline_len)) == -1) + { + if (g_buffered_input_stream_get_available (bstream) == + g_buffered_input_stream_get_buffer_size (bstream)) + g_buffered_input_stream_set_buffer_size (bstream, + 2 * g_buffered_input_stream_get_buffer_size (bstream)); + + res = g_buffered_input_stream_fill (bstream, -1, cancellable, error); + if (res < 0) + return NULL; + if (res == 0) + { + /* End of stream */ + if (g_buffered_input_stream_get_available (bstream) == 0) + { + if (length) + *length = 0; + return NULL; + } + else + { + found_pos = checked; + newline_len = 0; + break; + } + } + } + + line = g_malloc (found_pos + newline_len + 1); + + res = g_input_stream_read (G_INPUT_STREAM (stream), + line, + found_pos + newline_len, + NULL, NULL); + if (length) + *length = (gsize)found_pos; + g_warn_if_fail (res == found_pos + newline_len); + line[found_pos] = 0; + + return line; +} + +static gssize +scan_for_chars (GDataInputStream *stream, + gsize *checked_out, + const char *stop_chars) +{ + GBufferedInputStream *bstream; + const char *buffer; + gsize start, end, peeked; + int i; + gsize available, checked; + const char *stop_char; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + + checked = *checked_out; + + start = checked; + buffer = (const char *)g_buffered_input_stream_peek_buffer (bstream, &available) + start; + end = available; + peeked = end - start; + + for (i = 0; checked < available && i < peeked; i++) + { + for (stop_char = stop_chars; *stop_char != '\0'; stop_char++) + { + if (buffer[i] == *stop_char) + return (start + i); + } + } + + checked = end; + + *checked_out = checked; + return -1; +} + +/** + * g_data_input_stream_read_until: + * @stream: a given #GDataInputStream. + * @stop_chars: characters to terminate the read. + * @length: a #gsize to get the length of the data read in. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a string from the data input stream, up to the first + * occurrence of any of the stop characters. + * + * Note that, in contrast to g_data_input_stream_read_until_async(), + * this function consumes the stop character that it finds. + * + * Returns: a string with the data that was read before encountering + * any of the stop characters. Set @length to a #gsize to get the length + * of the string. This function will return %NULL on an error. + */ +char * +g_data_input_stream_read_until (GDataInputStream *stream, + const gchar *stop_chars, + gsize *length, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStream *bstream; + gsize checked; + gssize found_pos; + gssize res; + int stop_char_len; + char *data_until; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), NULL); + + bstream = G_BUFFERED_INPUT_STREAM (stream); + + stop_char_len = 1; + checked = 0; + + while ((found_pos = scan_for_chars (stream, &checked, stop_chars)) == -1) + { + if (g_buffered_input_stream_get_available (bstream) == + g_buffered_input_stream_get_buffer_size (bstream)) + g_buffered_input_stream_set_buffer_size (bstream, + 2 * g_buffered_input_stream_get_buffer_size (bstream)); + + res = g_buffered_input_stream_fill (bstream, -1, cancellable, error); + if (res < 0) + return NULL; + if (res == 0) + { + /* End of stream */ + if (g_buffered_input_stream_get_available (bstream) == 0) + { + if (length) + *length = 0; + return NULL; + } + else + { + found_pos = checked; + stop_char_len = 0; + break; + } + } + } + + data_until = g_malloc (found_pos + stop_char_len + 1); + + res = g_input_stream_read (G_INPUT_STREAM (stream), + data_until, + found_pos + stop_char_len, + NULL, NULL); + if (length) + *length = (gsize)found_pos; + g_warn_if_fail (res == found_pos + stop_char_len); + data_until[found_pos] = 0; + + return data_until; +} + +typedef struct +{ + GDataInputStream *stream; + GSimpleAsyncResult *simple; + gboolean last_saw_cr; + gsize checked; + gint io_priority; + GCancellable *cancellable; + + gchar *stop_chars; + gchar *line; + gsize length; +} GDataInputStreamReadData; + +static void +g_data_input_stream_read_complete (GDataInputStreamReadData *data, + gsize read_length, + gsize skip_length, + gboolean need_idle_dispatch) +{ + if (read_length || skip_length) + { + gssize bytes; + + data->length = read_length; + data->line = g_malloc (read_length + 1); + data->line[read_length] = '\0'; + + /* we already checked the buffer. this shouldn't fail. */ + bytes = g_input_stream_read (G_INPUT_STREAM (data->stream), + data->line, read_length, NULL, NULL); + g_assert_cmpint (bytes, ==, read_length); + + bytes = g_input_stream_skip (G_INPUT_STREAM (data->stream), + skip_length, NULL, NULL); + g_assert_cmpint (bytes, ==, skip_length); + } + + if (need_idle_dispatch) + g_simple_async_result_complete_in_idle (data->simple); + else + g_simple_async_result_complete (data->simple); + + g_object_unref (data->simple); +} + +static void +g_data_input_stream_read_line_ready (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GDataInputStreamReadData *data = user_data; + gssize found_pos; + gint newline_len; + + if (result) + /* this is a callback. finish the async call. */ + { + GBufferedInputStream *buffer = G_BUFFERED_INPUT_STREAM (data->stream); + GError *error = NULL; + gssize bytes; + + bytes = g_buffered_input_stream_fill_finish (buffer, result, &error); + + if (bytes <= 0) + { + if (bytes < 0) + /* stream error. */ + { + g_simple_async_result_set_from_error (data->simple, error); + g_error_free (error); + data->checked = 0; + } + + g_data_input_stream_read_complete (data, data->checked, 0, FALSE); + return; + } + + /* only proceed if we got more bytes... */ + } + + if (data->stop_chars) + { + found_pos = scan_for_chars (data->stream, + &data->checked, + data->stop_chars); + newline_len = 0; + } + else + found_pos = scan_for_newline (data->stream, &data->checked, + &data->last_saw_cr, &newline_len); + + if (found_pos == -1) + /* didn't find a full line; need to buffer some more bytes */ + { + GBufferedInputStream *buffer = G_BUFFERED_INPUT_STREAM (data->stream); + gsize size; + + size = g_buffered_input_stream_get_buffer_size (buffer); + + if (g_buffered_input_stream_get_available (buffer) == size) + /* need to grow the buffer */ + g_buffered_input_stream_set_buffer_size (buffer, size * 2); + + /* try again */ + g_buffered_input_stream_fill_async (buffer, -1, data->io_priority, + data->cancellable, + g_data_input_stream_read_line_ready, + user_data); + } + else + { + /* read the line and the EOL. no error is possible. */ + g_data_input_stream_read_complete (data, found_pos, + newline_len, result == NULL); + } +} + +static void +g_data_input_stream_read_data_free (gpointer user_data) +{ + GDataInputStreamReadData *data = user_data; + + /* we don't hold a ref to ->simple because it keeps a ref to us. + * we are called because it is being finalized. + */ + + g_free (data->stop_chars); + if (data->cancellable) + g_object_unref (data->cancellable); + g_free (data->line); + g_slice_free (GDataInputStreamReadData, data); +} + +static void +g_data_input_stream_read_async (GDataInputStream *stream, + const gchar *stop_chars, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer source_tag) +{ + GDataInputStreamReadData *data; + + data = g_slice_new (GDataInputStreamReadData); + data->stream = stream; + if (cancellable) + g_object_ref (cancellable); + data->cancellable = cancellable; + data->stop_chars = g_strdup (stop_chars); + data->io_priority = io_priority; + data->last_saw_cr = FALSE; + data->checked = 0; + data->line = NULL; + + data->simple = g_simple_async_result_new (G_OBJECT (stream), callback, + user_data, source_tag); + g_simple_async_result_set_op_res_gpointer (data->simple, data, + g_data_input_stream_read_data_free); + g_data_input_stream_read_line_ready (NULL, NULL, data); +} + +static gchar * +g_data_input_stream_read_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error) +{ + GDataInputStreamReadData *data; + GSimpleAsyncResult *simple; + gchar *line; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + data = g_simple_async_result_get_op_res_gpointer (simple); + + line = data->line; + data->line = NULL; + + if (length && line) + *length = data->length; + + return line; +} + +/** + * g_data_input_stream_read_line_async: + * @stream: a given #GDataInputStream. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied. + * @user_data: the data to pass to callback function. + * + * The asynchronous version of g_data_input_stream_read_line(). It is + * an error to have two outstanding calls to this function. + * + * When the operation is finished, @callback will be called. You + * can then call g_data_input_stream_read_line_finish() to get + * the result of the operation. + * + * Since: 2.20 + */ +void +g_data_input_stream_read_line_async (GDataInputStream *stream, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_DATA_INPUT_STREAM (stream)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + g_data_input_stream_read_async (stream, NULL, io_priority, + cancellable, callback, user_data, + g_data_input_stream_read_line_async); +} + +/** + * g_data_input_stream_read_until_async: + * @stream: a given #GDataInputStream. + * @stop_chars: characters to terminate the read. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied. + * @user_data: the data to pass to callback function. + * + * The asynchronous version of g_data_input_stream_read_until(). + * It is an error to have two outstanding calls to this function. + * + * Note that, in contrast to g_data_input_stream_read_until(), + * this function does not consume the stop character that it finds. You + * must read it for yourself. + * + * When the operation is finished, @callback will be called. You + * can then call g_data_input_stream_read_until_finish() to get + * the result of the operation. + * + * Since: 2.20 + */ +void +g_data_input_stream_read_until_async (GDataInputStream *stream, + const gchar *stop_chars, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_DATA_INPUT_STREAM (stream)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (stop_chars != NULL); + + g_data_input_stream_read_async (stream, stop_chars, io_priority, + cancellable, callback, user_data, + g_data_input_stream_read_until_async); +} + +/** + * g_data_input_stream_read_line_finish: + * @stream: a given #GDataInputStream. + * @result: the #GAsyncResult that was provided to the callback. + * @length: a #gsize to get the length of the data read in. + * @error: #GError for error reporting. + * + * Finish an asynchronous call started by + * g_data_input_stream_read_line_async(). + * + * Returns: a string with the line that was read in (without the newlines). + * Set @length to a #gsize to get the length of the read line. + * On an error, it will return %NULL and @error will be set. If there's no + * content to read, it will still return %NULL, but @error won't be set. + * + * Since: 2.20 + */ +gchar * +g_data_input_stream_read_line_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error) +{ + g_return_val_if_fail ( + g_simple_async_result_is_valid (result, G_OBJECT (stream), + g_data_input_stream_read_line_async), NULL); + + return g_data_input_stream_read_finish (stream, result, length, error); +} + +/** + * g_data_input_stream_read_until_finish: + * @stream: a given #GDataInputStream. + * @result: the #GAsyncResult that was provided to the callback. + * @length: a #gsize to get the length of the data read in. + * @error: #GError for error reporting. + * + * Finish an asynchronous call started by + * g_data_input_stream_read_until_async(). + * + * Since: 2.20 + * + * Returns: a string with the data that was read before encountering + * any of the stop characters. Set @length to a #gsize to get the length + * of the string. This function will return %NULL on an error. + */ +gchar * +g_data_input_stream_read_until_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error) +{ + g_return_val_if_fail ( + g_simple_async_result_is_valid (result, G_OBJECT (stream), + g_data_input_stream_read_until_async), NULL); + + return g_data_input_stream_read_finish (stream, result, length, error); +} + + +#define __G_DATA_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gdatainputstream.h b/gio/gdatainputstream.h new file mode 100644 index 0000000..c01ef87 --- /dev/null +++ b/gio/gdatainputstream.h @@ -0,0 +1,133 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_DATA_INPUT_STREAM_H__ +#define __G_DATA_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DATA_INPUT_STREAM (g_data_input_stream_get_type ()) +#define G_DATA_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DATA_INPUT_STREAM, GDataInputStream)) +#define G_DATA_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DATA_INPUT_STREAM, GDataInputStreamClass)) +#define G_IS_DATA_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DATA_INPUT_STREAM)) +#define G_IS_DATA_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DATA_INPUT_STREAM)) +#define G_DATA_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DATA_INPUT_STREAM, GDataInputStreamClass)) + +/** + * GDataInputStream: + * @parent: a #GBufferedInputStream. + * + * An implementation of #GBufferedInputStream that allows for high-level + * data manipulation of arbitrary data (including binary operations). + **/ +typedef struct _GDataInputStreamClass GDataInputStreamClass; +typedef struct _GDataInputStreamPrivate GDataInputStreamPrivate; + +struct _GDataInputStream +{ + GBufferedInputStream parent_instance; + + /*< private >*/ + GDataInputStreamPrivate *priv; +}; + +struct _GDataInputStreamClass +{ + GBufferedInputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_data_input_stream_get_type (void) G_GNUC_CONST; +GDataInputStream * g_data_input_stream_new (GInputStream *base_stream); + +void g_data_input_stream_set_byte_order (GDataInputStream *stream, + GDataStreamByteOrder order); +GDataStreamByteOrder g_data_input_stream_get_byte_order (GDataInputStream *stream); +void g_data_input_stream_set_newline_type (GDataInputStream *stream, + GDataStreamNewlineType type); +GDataStreamNewlineType g_data_input_stream_get_newline_type (GDataInputStream *stream); +guchar g_data_input_stream_read_byte (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +gint16 g_data_input_stream_read_int16 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +guint16 g_data_input_stream_read_uint16 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +gint32 g_data_input_stream_read_int32 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +guint32 g_data_input_stream_read_uint32 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +gint64 g_data_input_stream_read_int64 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +guint64 g_data_input_stream_read_uint64 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +char * g_data_input_stream_read_line (GDataInputStream *stream, + gsize *length, + GCancellable *cancellable, + GError **error); +void g_data_input_stream_read_line_async (GDataInputStream *stream, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +char * g_data_input_stream_read_line_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error); +char * g_data_input_stream_read_until (GDataInputStream *stream, + const gchar *stop_chars, + gsize *length, + GCancellable *cancellable, + GError **error); +void g_data_input_stream_read_until_async (GDataInputStream *stream, + const gchar *stop_chars, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +char * g_data_input_stream_read_until_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error); + +G_END_DECLS + +#endif /* __G_DATA_INPUT_STREAM_H__ */ diff --git a/gio/gdataoutputstream.c b/gio/gdataoutputstream.c new file mode 100644 index 0000000..1dc2dd8 --- /dev/null +++ b/gio/gdataoutputstream.c @@ -0,0 +1,506 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include +#include "gdataoutputstream.h" +#include "gioenumtypes.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gdataoutputstream + * @short_description: Data Output Stream + * @include: gio/gio.h + * @see_also: #GOutputStream + * + * Data output stream implements #GOutputStream and includes functions for + * writing data directly to an output stream. + * + **/ + + + +struct _GDataOutputStreamPrivate { + GDataStreamByteOrder byte_order; +}; + +enum { + PROP_0, + PROP_BYTE_ORDER +}; + +static void g_data_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_data_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +G_DEFINE_TYPE (GDataOutputStream, + g_data_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM) + + +static void +g_data_output_stream_class_init (GDataOutputStreamClass *klass) +{ + GObjectClass *object_class; + + g_type_class_add_private (klass, sizeof (GDataOutputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_data_output_stream_get_property; + object_class->set_property = g_data_output_stream_set_property; + + /** + * GDataOutputStream:byte-order: + * + * Determines the byte ordering that is used when writing + * multi-byte entities (such as integers) to the stream. + */ + g_object_class_install_property (object_class, + PROP_BYTE_ORDER, + g_param_spec_enum ("byte-order", + P_("Byte order"), + P_("The byte order"), + G_TYPE_DATA_STREAM_BYTE_ORDER, + G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN, + G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB)); + +} + +static void +g_data_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDataOutputStream *dstream; + + dstream = G_DATA_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BYTE_ORDER: + g_data_output_stream_set_byte_order (dstream, g_value_get_enum (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_data_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDataOutputStreamPrivate *priv; + GDataOutputStream *dstream; + + dstream = G_DATA_OUTPUT_STREAM (object); + priv = dstream->priv; + + switch (prop_id) + { + case PROP_BYTE_ORDER: + g_value_set_enum (value, priv->byte_order); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_data_output_stream_init (GDataOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_DATA_OUTPUT_STREAM, + GDataOutputStreamPrivate); + + stream->priv->byte_order = G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN; +} + +/** + * g_data_output_stream_new: + * @base_stream: a #GOutputStream. + * + * Creates a new data output stream for @base_stream. + * + * Returns: #GDataOutputStream. + **/ +GDataOutputStream * +g_data_output_stream_new (GOutputStream *base_stream) +{ + GDataOutputStream *stream; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (base_stream), NULL); + + stream = g_object_new (G_TYPE_DATA_OUTPUT_STREAM, + "base-stream", base_stream, + NULL); + + return stream; +} + +/** + * g_data_output_stream_set_byte_order: + * @stream: a #GDataOutputStream. + * @order: a %GDataStreamByteOrder. + * + * Sets the byte order of the data output stream to @order. + **/ +void +g_data_output_stream_set_byte_order (GDataOutputStream *stream, + GDataStreamByteOrder order) +{ + GDataOutputStreamPrivate *priv; + g_return_if_fail (G_IS_DATA_OUTPUT_STREAM (stream)); + priv = stream->priv; + if (priv->byte_order != order) + { + priv->byte_order = order; + g_object_notify (G_OBJECT (stream), "byte-order"); + } +} + +/** + * g_data_output_stream_get_byte_order: + * @stream: a #GDataOutputStream. + * + * Gets the byte order for the stream. + * + * Returns: the #GDataStreamByteOrder for the @stream. + **/ +GDataStreamByteOrder +g_data_output_stream_get_byte_order (GDataOutputStream *stream) +{ + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN); + + return stream->priv->byte_order; +} + +/** + * g_data_output_stream_put_byte: + * @stream: a #GDataOutputStream. + * @data: a #guchar. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts a byte into the output stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_byte (GDataOutputStream *stream, + guchar data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 1, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_int16: + * @stream: a #GDataOutputStream. + * @data: a #gint16. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts a signed 16-bit integer into the output stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_int16 (GDataOutputStream *stream, + gint16 data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + data = GINT16_TO_BE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + data = GINT16_TO_LE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 2, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_uint16: + * @stream: a #GDataOutputStream. + * @data: a #guint16. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts an unsigned 16-bit integer into the output stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_uint16 (GDataOutputStream *stream, + guint16 data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + data = GUINT16_TO_BE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + data = GUINT16_TO_LE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 2, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_int32: + * @stream: a #GDataOutputStream. + * @data: a #gint32. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts a signed 32-bit integer into the output stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_int32 (GDataOutputStream *stream, + gint32 data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + data = GINT32_TO_BE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + data = GINT32_TO_LE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 4, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_uint32: + * @stream: a #GDataOutputStream. + * @data: a #guint32. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts an unsigned 32-bit integer into the stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_uint32 (GDataOutputStream *stream, + guint32 data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + data = GUINT32_TO_BE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + data = GUINT32_TO_LE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 4, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_int64: + * @stream: a #GDataOutputStream. + * @data: a #gint64. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts a signed 64-bit integer into the stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_int64 (GDataOutputStream *stream, + gint64 data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + data = GINT64_TO_BE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + data = GINT64_TO_LE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 8, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_uint64: + * @stream: a #GDataOutputStream. + * @data: a #guint64. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts an unsigned 64-bit integer into the stream. + * + * Returns: %TRUE if @data was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_uint64 (GDataOutputStream *stream, + guint64 data, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + + switch (stream->priv->byte_order) + { + case G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: + data = GUINT64_TO_BE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: + data = GUINT64_TO_LE (data); + break; + case G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: + default: + break; + } + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + &data, 8, + &bytes_written, + cancellable, error); +} + +/** + * g_data_output_stream_put_string: + * @stream: a #GDataOutputStream. + * @str: a string. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Puts a string into the output stream. + * + * Returns: %TRUE if @string was successfully added to the @stream. + **/ +gboolean +g_data_output_stream_put_string (GDataOutputStream *stream, + const char *str, + GCancellable *cancellable, + GError **error) +{ + gsize bytes_written; + + g_return_val_if_fail (G_IS_DATA_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (str != NULL, FALSE); + + return g_output_stream_write_all (G_OUTPUT_STREAM (stream), + str, strlen (str), + &bytes_written, + cancellable, error); +} + +#define __G_DATA_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gdataoutputstream.h b/gio/gdataoutputstream.h new file mode 100644 index 0000000..f864b18 --- /dev/null +++ b/gio/gdataoutputstream.h @@ -0,0 +1,116 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_DATA_OUTPUT_STREAM_H__ +#define __G_DATA_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DATA_OUTPUT_STREAM (g_data_output_stream_get_type ()) +#define G_DATA_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DATA_OUTPUT_STREAM, GDataOutputStream)) +#define G_DATA_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DATA_OUTPUT_STREAM, GDataOutputStreamClass)) +#define G_IS_DATA_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DATA_OUTPUT_STREAM)) +#define G_IS_DATA_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DATA_OUTPUT_STREAM)) +#define G_DATA_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DATA_OUTPUT_STREAM, GDataOutputStreamClass)) + +/** + * GDataOutputStream: + * @parent_instance: a #GBufferedOutputStream. + * + * An implementation of #GBufferedOutputStream that allows for high-level + * data manipulation of arbitrary data (including binary operations). + **/ +typedef struct _GDataOutputStream GDataOutputStream; +typedef struct _GDataOutputStreamClass GDataOutputStreamClass; +typedef struct _GDataOutputStreamPrivate GDataOutputStreamPrivate; + +struct _GDataOutputStream +{ + GFilterOutputStream parent_instance; + + /*< private >*/ + GDataOutputStreamPrivate *priv; +}; + +struct _GDataOutputStreamClass +{ + GFilterOutputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + + +GType g_data_output_stream_get_type (void) G_GNUC_CONST; +GDataOutputStream * g_data_output_stream_new (GOutputStream *base_stream); + +void g_data_output_stream_set_byte_order (GDataOutputStream *stream, + GDataStreamByteOrder order); +GDataStreamByteOrder g_data_output_stream_get_byte_order (GDataOutputStream *stream); + +gboolean g_data_output_stream_put_byte (GDataOutputStream *stream, + guchar data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_int16 (GDataOutputStream *stream, + gint16 data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_uint16 (GDataOutputStream *stream, + guint16 data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_int32 (GDataOutputStream *stream, + gint32 data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_uint32 (GDataOutputStream *stream, + guint32 data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_int64 (GDataOutputStream *stream, + gint64 data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_uint64 (GDataOutputStream *stream, + guint64 data, + GCancellable *cancellable, + GError **error); +gboolean g_data_output_stream_put_string (GDataOutputStream *stream, + const char *str, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_DATA_OUTPUT_STREAM_H__ */ diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c new file mode 100644 index 0000000..97ffee5 --- /dev/null +++ b/gio/gdesktopappinfo.c @@ -0,0 +1,2699 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright © 2007 Ryan Lortie + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include + +#ifdef HAVE_CRT_EXTERNS_H +#include +#endif + +#include "gcontenttypeprivate.h" +#include "gdesktopappinfo.h" +#include "gfile.h" +#include "gioerror.h" +#include "gthemedicon.h" +#include "gfileicon.h" +#include +#include "glibintl.h" +#include "giomodule-priv.h" +#include "gappinfo.h" + +#include "gioalias.h" + +/** + * SECTION:gdesktopappinfo + * @short_description: Application information from desktop files + * @include: gio/gdesktopappinfo.h + * + * #GDesktopAppInfo is an implementation of #GAppInfo based on + * desktop files. + * + * Note that <gio/gdesktopappinfo.h> belongs to + * the UNIX-specific GIO interfaces, thus you have to use the + * gio-unix-2.0.pc pkg-config file when using it. + */ + +#define DEFAULT_APPLICATIONS_GROUP "Default Applications" +#define ADDED_ASSOCIATIONS_GROUP "Added Associations" +#define REMOVED_ASSOCIATIONS_GROUP "Removed Associations" +#define MIME_CACHE_GROUP "MIME Cache" +#define FULL_NAME_KEY "X-GNOME-FullName" + +static void g_desktop_app_info_iface_init (GAppInfoIface *iface); +static GList * get_all_desktop_entries_for_mime_type (const char *base_mime_type, + const char **except); +static void mime_info_cache_reload (const char *dir); +static gboolean g_desktop_app_info_ensure_saved (GDesktopAppInfo *info, + GError **error); + +/** + * GDesktopAppInfo: + * + * Information about an installed application from a desktop file. + */ +struct _GDesktopAppInfo +{ + GObject parent_instance; + + char *desktop_id; + char *filename; + + char *name; + /* FIXME: what about GenericName ? */ + char *fullname; + char *comment; + char *icon_name; + GIcon *icon; + char **only_show_in; + char **not_show_in; + char *try_exec; + char *exec; + char *binary; + char *path; + + guint nodisplay : 1; + guint hidden : 1; + guint terminal : 1; + guint startup_notify : 1; + guint no_fuse : 1; + /* FIXME: what about StartupWMClass ? */ +}; + +G_DEFINE_TYPE_WITH_CODE (GDesktopAppInfo, g_desktop_app_info, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_APP_INFO, + g_desktop_app_info_iface_init)) + +static gpointer +search_path_init (gpointer data) +{ + char **args = NULL; + const char * const *data_dirs; + const char *user_data_dir; + int i, length, j; + + data_dirs = g_get_system_data_dirs (); + length = g_strv_length ((char **) data_dirs); + + args = g_new (char *, length + 2); + + j = 0; + user_data_dir = g_get_user_data_dir (); + args[j++] = g_build_filename (user_data_dir, "applications", NULL); + for (i = 0; i < length; i++) + args[j++] = g_build_filename (data_dirs[i], + "applications", NULL); + args[j++] = NULL; + + return args; +} + +static const char * const * +get_applications_search_path (void) +{ + static GOnce once_init = G_ONCE_INIT; + return g_once (&once_init, search_path_init, NULL); +} + +static void +g_desktop_app_info_finalize (GObject *object) +{ + GDesktopAppInfo *info; + + info = G_DESKTOP_APP_INFO (object); + + g_free (info->desktop_id); + g_free (info->filename); + g_free (info->name); + g_free (info->fullname); + g_free (info->comment); + g_free (info->icon_name); + if (info->icon) + g_object_unref (info->icon); + g_strfreev (info->only_show_in); + g_strfreev (info->not_show_in); + g_free (info->try_exec); + g_free (info->exec); + g_free (info->binary); + g_free (info->path); + + G_OBJECT_CLASS (g_desktop_app_info_parent_class)->finalize (object); +} + +static void +g_desktop_app_info_class_init (GDesktopAppInfoClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_desktop_app_info_finalize; +} + +static void +g_desktop_app_info_init (GDesktopAppInfo *local) +{ +} + +static char * +binary_from_exec (const char *exec) +{ + const char *p, *start; + + p = exec; + while (*p == ' ') + p++; + start = p; + while (*p != ' ' && *p != 0) + p++; + + return g_strndup (start, p - start); + +} + +/** + * g_desktop_app_info_new_from_keyfile: + * @key_file: an opened #GKeyFile + * + * Creates a new #GDesktopAppInfo. + * + * Returns: a new #GDesktopAppInfo or %NULL on error. + * + * Since: 2.18 + **/ +GDesktopAppInfo * +g_desktop_app_info_new_from_keyfile (GKeyFile *key_file) +{ + GDesktopAppInfo *info; + char *start_group; + char *type; + char *try_exec; + + start_group = g_key_file_get_start_group (key_file); + if (start_group == NULL || strcmp (start_group, G_KEY_FILE_DESKTOP_GROUP) != 0) + { + g_free (start_group); + return NULL; + } + g_free (start_group); + + type = g_key_file_get_string (key_file, + G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_TYPE, + NULL); + if (type == NULL || strcmp (type, G_KEY_FILE_DESKTOP_TYPE_APPLICATION) != 0) + { + g_free (type); + return NULL; + } + g_free (type); + + try_exec = g_key_file_get_string (key_file, + G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_TRY_EXEC, + NULL); + if (try_exec && try_exec[0] != '\0') + { + char *t; + t = g_find_program_in_path (try_exec); + if (t == NULL) + { + g_free (try_exec); + return NULL; + } + g_free (t); + } + + info = g_object_new (G_TYPE_DESKTOP_APP_INFO, NULL); + info->filename = NULL; + + info->name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); + info->fullname = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, FULL_NAME_KEY, NULL, NULL); + info->comment = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, NULL, NULL); + info->nodisplay = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL) != FALSE; + info->icon_name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, NULL, NULL); + info->only_show_in = g_key_file_get_string_list (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN, NULL, NULL); + info->not_show_in = g_key_file_get_string_list (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN, NULL, NULL); + info->try_exec = try_exec; + info->exec = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL); + info->path = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_PATH, NULL); + info->terminal = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TERMINAL, NULL) != FALSE; + info->startup_notify = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY, NULL) != FALSE; + info->no_fuse = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GIO-NoFuse", NULL) != FALSE; + info->hidden = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL) != FALSE; + + info->icon = NULL; + if (info->icon_name) + { + if (g_path_is_absolute (info->icon_name)) + { + GFile *file; + + file = g_file_new_for_path (info->icon_name); + info->icon = g_file_icon_new (file); + g_object_unref (file); + } + else + { + char *p; + + /* Work around a common mistake in desktop files */ + if ((p = strrchr (info->icon_name, '.')) != NULL && + (strcmp (p, ".png") == 0 || + strcmp (p, ".xpm") == 0 || + strcmp (p, ".svg") == 0)) + *p = 0; + + info->icon = g_themed_icon_new (info->icon_name); + } + } + + if (info->exec) + info->binary = binary_from_exec (info->exec); + + if (info->path && info->path[0] == '\0') + { + g_free (info->path); + info->path = NULL; + } + + return info; +} + +/** + * g_desktop_app_info_new_from_filename: + * @filename: the path of a desktop file, in the GLib filename encoding + * + * Creates a new #GDesktopAppInfo. + * + * Returns: a new #GDesktopAppInfo or %NULL on error. + **/ +GDesktopAppInfo * +g_desktop_app_info_new_from_filename (const char *filename) +{ + GKeyFile *key_file; + GDesktopAppInfo *info = NULL; + + key_file = g_key_file_new (); + + if (g_key_file_load_from_file (key_file, + filename, + G_KEY_FILE_NONE, + NULL)) + { + info = g_desktop_app_info_new_from_keyfile (key_file); + if (info) + info->filename = g_strdup (filename); + } + + g_key_file_free (key_file); + + return info; +} + +/** + * g_desktop_app_info_new: + * @desktop_id: the desktop file id + * + * Creates a new #GDesktopAppInfo based on a desktop file id. + * + * A desktop file id is the basename of the desktop file, including the + * .desktop extension. GIO is looking for a desktop file with this name + * in the applications subdirectories of the XDG data + * directories (i.e. the directories specified in the + * XDG_DATA_HOME and XDG_DATA_DIRS environment + * variables). GIO also supports the prefix-to-subdirectory mapping that is + * described in the Menu Spec + * (i.e. a desktop id of kde-foo.desktop will match + * /usr/share/applications/kde/foo.desktop). + * + * Returns: a new #GDesktopAppInfo, or %NULL if no desktop file with that id + */ +GDesktopAppInfo * +g_desktop_app_info_new (const char *desktop_id) +{ + GDesktopAppInfo *appinfo; + const char * const *dirs; + char *basename; + int i; + + dirs = get_applications_search_path (); + + basename = g_strdup (desktop_id); + + for (i = 0; dirs[i] != NULL; i++) + { + char *filename; + char *p; + + filename = g_build_filename (dirs[i], desktop_id, NULL); + appinfo = g_desktop_app_info_new_from_filename (filename); + g_free (filename); + if (appinfo != NULL) + goto found; + + p = basename; + while ((p = strchr (p, '-')) != NULL) + { + *p = '/'; + + filename = g_build_filename (dirs[i], basename, NULL); + appinfo = g_desktop_app_info_new_from_filename (filename); + g_free (filename); + if (appinfo != NULL) + goto found; + *p = '-'; + p++; + } + } + + g_free (basename); + return NULL; + + found: + g_free (basename); + + appinfo->desktop_id = g_strdup (desktop_id); + + if (g_desktop_app_info_get_is_hidden (appinfo)) + { + g_object_unref (appinfo); + appinfo = NULL; + } + + return appinfo; +} + +static GAppInfo * +g_desktop_app_info_dup (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + GDesktopAppInfo *new_info; + + new_info = g_object_new (G_TYPE_DESKTOP_APP_INFO, NULL); + + new_info->filename = g_strdup (info->filename); + new_info->desktop_id = g_strdup (info->desktop_id); + + new_info->name = g_strdup (info->name); + new_info->fullname = g_strdup (info->fullname); + new_info->comment = g_strdup (info->comment); + new_info->nodisplay = info->nodisplay; + new_info->icon_name = g_strdup (info->icon_name); + if (info->icon) + new_info->icon = g_object_ref (info->icon); + new_info->only_show_in = g_strdupv (info->only_show_in); + new_info->not_show_in = g_strdupv (info->not_show_in); + new_info->try_exec = g_strdup (info->try_exec); + new_info->exec = g_strdup (info->exec); + new_info->binary = g_strdup (info->binary); + new_info->path = g_strdup (info->path); + new_info->hidden = info->hidden; + new_info->terminal = info->terminal; + new_info->startup_notify = info->startup_notify; + + return G_APP_INFO (new_info); +} + +static gboolean +g_desktop_app_info_equal (GAppInfo *appinfo1, + GAppInfo *appinfo2) +{ + GDesktopAppInfo *info1 = G_DESKTOP_APP_INFO (appinfo1); + GDesktopAppInfo *info2 = G_DESKTOP_APP_INFO (appinfo2); + + if (info1->desktop_id == NULL || + info2->desktop_id == NULL) + return info1 == info2; + + return strcmp (info1->desktop_id, info2->desktop_id) == 0; +} + +static const char * +g_desktop_app_info_get_id (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->desktop_id; +} + +static const char * +g_desktop_app_info_get_name (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (info->name == NULL) + return _("Unnamed"); + return info->name; +} + +static const char * +g_desktop_app_info_get_display_name (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (info->fullname == NULL) + return g_desktop_app_info_get_name (appinfo); + return info->fullname; +} + +/** + * g_desktop_app_info_get_is_hidden: + * @info: a #GDesktopAppInfo. + * + * A desktop file is hidden if the Hidden key in it is + * set to True. + * + * Returns: %TRUE if hidden, %FALSE otherwise. + **/ +gboolean +g_desktop_app_info_get_is_hidden (GDesktopAppInfo *info) +{ + return info->hidden; +} + +/** + * g_desktop_app_info_get_filename: + * @info: a #GDesktopAppInfo + * + * When @info was created from a known filename, return it. In some + * situations such as the #GDesktopAppInfo returned from + * g_desktop_app_info_new_from_keyfile(), this function will return %NULL. + * + * Returns: The full path to the file for @info, or %NULL if not known. + * Since: 2.24 + */ +const char * +g_desktop_app_info_get_filename (GDesktopAppInfo *info) +{ + return info->filename; +} + +static const char * +g_desktop_app_info_get_description (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->comment; +} + +static const char * +g_desktop_app_info_get_executable (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->binary; +} + +static const char * +g_desktop_app_info_get_commandline (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->exec; +} + +static GIcon * +g_desktop_app_info_get_icon (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->icon; +} + +static char * +expand_macro_single (char macro, char *uri) +{ + GFile *file; + char *result = NULL; + char *path, *name; + + file = g_file_new_for_uri (uri); + path = g_file_get_path (file); + g_object_unref (file); + + switch (macro) + { + case 'u': + case 'U': + result = g_shell_quote (uri); + break; + case 'f': + case 'F': + if (path) + result = g_shell_quote (path); + break; + case 'd': + case 'D': + if (path) + { + name = g_path_get_dirname (path); + result = g_shell_quote (name); + g_free (name); + } + break; + case 'n': + case 'N': + if (path) + { + name = g_path_get_basename (path); + result = g_shell_quote (name); + g_free (name); + } + break; + } + + g_free (path); + + return result; +} + +static void +expand_macro (char macro, + GString *exec, + GDesktopAppInfo *info, + GList **uri_list) +{ + GList *uris = *uri_list; + char *expanded; + gboolean force_file_uri; + char force_file_uri_macro; + char *uri; + + g_return_if_fail (exec != NULL); + + /* On %u and %U, pass POSIX file path pointing to the URI via + * the FUSE mount in ~/.gvfs. Note that if the FUSE daemon isn't + * running or the URI doesn't have a POSIX file path via FUSE + * we'll just pass the URI. + */ + force_file_uri_macro = macro; + force_file_uri = FALSE; + if (!info->no_fuse) + { + switch (macro) + { + case 'u': + force_file_uri_macro = 'f'; + force_file_uri = TRUE; + break; + case 'U': + force_file_uri_macro = 'F'; + force_file_uri = TRUE; + break; + default: + break; + } + } + + switch (macro) + { + case 'u': + case 'f': + case 'd': + case 'n': + if (uris) + { + uri = uris->data; + if (!force_file_uri || + /* Pass URI if it contains an anchor */ + strchr (uri, '#') != NULL) + { + expanded = expand_macro_single (macro, uri); + } + else + { + expanded = expand_macro_single (force_file_uri_macro, uri); + if (expanded == NULL) + expanded = expand_macro_single (macro, uri); + } + + if (expanded) + { + g_string_append (exec, expanded); + g_free (expanded); + } + uris = uris->next; + } + + break; + + case 'U': + case 'F': + case 'D': + case 'N': + while (uris) + { + uri = uris->data; + + if (!force_file_uri || + /* Pass URI if it contains an anchor */ + strchr (uri, '#') != NULL) + { + expanded = expand_macro_single (macro, uri); + } + else + { + expanded = expand_macro_single (force_file_uri_macro, uri); + if (expanded == NULL) + expanded = expand_macro_single (macro, uri); + } + + if (expanded) + { + g_string_append (exec, expanded); + g_free (expanded); + } + + uris = uris->next; + + if (uris != NULL && expanded) + g_string_append_c (exec, ' '); + } + + break; + + case 'i': + if (info->icon_name) + { + g_string_append (exec, "--icon "); + g_string_append (exec, info->icon_name); + } + break; + + case 'c': + if (info->name) + g_string_append (exec, info->name); + break; + + case 'k': + if (info->filename) + g_string_append (exec, info->filename); + break; + + case 'm': /* deprecated */ + break; + + case '%': + g_string_append_c (exec, '%'); + break; + } + + *uri_list = uris; +} + +static gboolean +expand_application_parameters (GDesktopAppInfo *info, + GList **uris, + int *argc, + char ***argv, + GError **error) +{ + GList *uri_list = *uris; + const char *p = info->exec; + GString *expanded_exec; + gboolean res; + + if (info->exec == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Desktop file didn't specify Exec field")); + return FALSE; + } + + expanded_exec = g_string_new (NULL); + + while (*p) + { + if (p[0] == '%' && p[1] != '\0') + { + expand_macro (p[1], expanded_exec, info, uris); + p++; + } + else + g_string_append_c (expanded_exec, *p); + + p++; + } + + /* No file substitutions */ + if (uri_list == *uris && uri_list != NULL) + { + /* If there is no macro default to %f. This is also what KDE does */ + g_string_append_c (expanded_exec, ' '); + expand_macro ('f', expanded_exec, info, uris); + } + + res = g_shell_parse_argv (expanded_exec->str, argc, argv, error); + g_string_free (expanded_exec, TRUE); + return res; +} + +static gboolean +prepend_terminal_to_vector (int *argc, + char ***argv) +{ +#ifndef G_OS_WIN32 + char **real_argv; + int real_argc; + int i, j; + char **term_argv = NULL; + int term_argc = 0; + char *check; + char **the_argv; + + g_return_val_if_fail (argc != NULL, FALSE); + g_return_val_if_fail (argv != NULL, FALSE); + + /* sanity */ + if(*argv == NULL) + *argc = 0; + + the_argv = *argv; + + /* compute size if not given */ + if (*argc < 0) + { + for (i = 0; the_argv[i] != NULL; i++) + ; + *argc = i; + } + + term_argc = 2; + term_argv = g_new0 (char *, 3); + + check = g_find_program_in_path ("gnome-terminal"); + if (check != NULL) + { + term_argv[0] = check; + /* Note that gnome-terminal takes -x and + * as -e in gnome-terminal is broken we use that. */ + term_argv[1] = g_strdup ("-x"); + } + else + { + if (check == NULL) + check = g_find_program_in_path ("nxterm"); + if (check == NULL) + check = g_find_program_in_path ("color-xterm"); + if (check == NULL) + check = g_find_program_in_path ("rxvt"); + if (check == NULL) + check = g_find_program_in_path ("xterm"); + if (check == NULL) + check = g_find_program_in_path ("dtterm"); + if (check == NULL) + { + check = g_strdup ("xterm"); + g_warning ("couldn't find a terminal, falling back to xterm"); + } + term_argv[0] = check; + term_argv[1] = g_strdup ("-e"); + } + + real_argc = term_argc + *argc; + real_argv = g_new (char *, real_argc + 1); + + for (i = 0; i < term_argc; i++) + real_argv[i] = term_argv[i]; + + for (j = 0; j < *argc; j++, i++) + real_argv[i] = (char *)the_argv[j]; + + real_argv[i] = NULL; + + g_free (*argv); + *argv = real_argv; + *argc = real_argc; + + /* we use g_free here as we sucked all the inner strings + * out from it into real_argv */ + g_free (term_argv); + return TRUE; +#else + return FALSE; +#endif /* G_OS_WIN32 */ +} + +static GList * +uri_list_segment_to_files (GList *start, + GList *end) +{ + GList *res; + GFile *file; + + res = NULL; + while (start != NULL && start != end) + { + file = g_file_new_for_uri ((char *)start->data); + res = g_list_prepend (res, file); + start = start->next; + } + + return g_list_reverse (res); +} + +typedef struct +{ + char *display; + char *sn_id; +} ChildSetupData; + +static void +child_setup (gpointer user_data) +{ + ChildSetupData *data = user_data; + + if (data->display) + g_setenv ("DISPLAY", data->display, TRUE); + + if (data->sn_id) + g_setenv ("DESKTOP_STARTUP_ID", data->sn_id, TRUE); +} + +static gboolean +g_desktop_app_info_launch_uris (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + gboolean completed = FALSE; + GList *old_uris; + GList *launched_files; + char **argv; + int argc; + ChildSetupData data; + + g_return_val_if_fail (appinfo != NULL, FALSE); + + argv = NULL; + + do + { + old_uris = uris; + if (!expand_application_parameters (info, &uris, + &argc, &argv, error)) + goto out; + + if (info->terminal && !prepend_terminal_to_vector (&argc, &argv)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unable to find terminal required for application")); + goto out; + } + + data.display = NULL; + data.sn_id = NULL; + + if (launch_context) + { + launched_files = uri_list_segment_to_files (old_uris, uris); + + data.display = g_app_launch_context_get_display (launch_context, + appinfo, + launched_files); + + if (info->startup_notify) + data.sn_id = g_app_launch_context_get_startup_notify_id (launch_context, + appinfo, + launched_files); + g_list_foreach (launched_files, (GFunc)g_object_unref, NULL); + g_list_free (launched_files); + } + + if (!g_spawn_async (info->path, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + child_setup, + &data, + NULL, + error)) + { + if (data.sn_id) + g_app_launch_context_launch_failed (launch_context, data.sn_id); + + g_free (data.sn_id); + g_free (data.display); + + goto out; + } + + g_free (data.sn_id); + g_free (data.display); + + g_strfreev (argv); + argv = NULL; + } + while (uris != NULL); + + completed = TRUE; + + out: + g_strfreev (argv); + + return completed; +} + +static gboolean +g_desktop_app_info_supports_uris (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->exec && + ((strstr (info->exec, "%u") != NULL) || + (strstr (info->exec, "%U") != NULL)); +} + +static gboolean +g_desktop_app_info_supports_files (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return info->exec && + ((strstr (info->exec, "%f") != NULL) || + (strstr (info->exec, "%F") != NULL)); +} + +static gboolean +g_desktop_app_info_launch (GAppInfo *appinfo, + GList *files, + GAppLaunchContext *launch_context, + GError **error) +{ + GList *uris; + char *uri; + gboolean res; + + uris = NULL; + while (files) + { + uri = g_file_get_uri (files->data); + uris = g_list_prepend (uris, uri); + files = files->next; + } + + uris = g_list_reverse (uris); + + res = g_desktop_app_info_launch_uris (appinfo, uris, launch_context, error); + + g_list_foreach (uris, (GFunc)g_free, NULL); + g_list_free (uris); + + return res; +} + +G_LOCK_DEFINE_STATIC (g_desktop_env); +static gchar *g_desktop_env = NULL; + +/** + * g_desktop_app_info_set_desktop_env: + * @desktop_env: a string specifying what desktop this is + * + * Sets the name of the desktop that the application is running in. + * This is used by g_app_info_should_show() to evaluate the + * OnlyShowIn and NotShowIn + * desktop entry fields. + * + * The Desktop + * Menu specification recognizes the following: + * + * GNOME + * KDE + * ROX + * XFCE + * Old + * + * + * Should be called only once; subsequent calls are ignored. + */ +void +g_desktop_app_info_set_desktop_env (const gchar *desktop_env) +{ + G_LOCK (g_desktop_env); + if (!g_desktop_env) + g_desktop_env = g_strdup (desktop_env); + G_UNLOCK (g_desktop_env); +} + +static gboolean +g_desktop_app_info_should_show (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + gboolean found; + const gchar *desktop_env; + int i; + + if (info->nodisplay) + return FALSE; + + G_LOCK (g_desktop_env); + desktop_env = g_desktop_env; + G_UNLOCK (g_desktop_env); + + if (info->only_show_in) + { + if (desktop_env == NULL) + return FALSE; + + found = FALSE; + for (i = 0; info->only_show_in[i] != NULL; i++) + { + if (strcmp (info->only_show_in[i], desktop_env) == 0) + { + found = TRUE; + break; + } + } + if (!found) + return FALSE; + } + + if (info->not_show_in && desktop_env) + { + for (i = 0; info->not_show_in[i] != NULL; i++) + { + if (strcmp (info->not_show_in[i], desktop_env) == 0) + return FALSE; + } + } + + return TRUE; +} + +typedef enum { + APP_DIR, + MIMETYPE_DIR +} DirType; + +static char * +ensure_dir (DirType type, + GError **error) +{ + char *path, *display_name; + int errsv; + + if (type == APP_DIR) + path = g_build_filename (g_get_user_data_dir (), "applications", NULL); + else + path = g_build_filename (g_get_user_data_dir (), "mime", "packages", NULL); + + errno = 0; + if (g_mkdir_with_parents (path, 0700) == 0) + return path; + + errsv = errno; + display_name = g_filename_display_name (path); + if (type == APP_DIR) + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Can't create user application configuration folder %s: %s"), + display_name, g_strerror (errsv)); + else + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Can't create user MIME configuration folder %s: %s"), + display_name, g_strerror (errsv)); + + g_free (display_name); + g_free (path); + + return NULL; +} + +static gboolean +update_mimeapps_list (const char *desktop_id, + const char *content_type, + gboolean add_as_default, + gboolean add_non_default, + gboolean remove, + GError **error) +{ + char *dirname, *filename; + GKeyFile *key_file; + gboolean load_succeeded, res; + char **old_list, **list; + GList *system_list, *l; + gsize length, data_size; + char *data; + int i, j, k; + char **content_types; + + /* Don't add both at start and end */ + g_assert (!(add_as_default && add_non_default)); + + dirname = ensure_dir (APP_DIR, error); + if (!dirname) + return FALSE; + + filename = g_build_filename (dirname, "mimeapps.list", NULL); + g_free (dirname); + + key_file = g_key_file_new (); + load_succeeded = g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL); + if (!load_succeeded || !g_key_file_has_group (key_file, ADDED_ASSOCIATIONS_GROUP)) + { + g_key_file_free (key_file); + key_file = g_key_file_new (); + } + + if (content_type) + { + content_types = g_new (char *, 2); + content_types[0] = g_strdup (content_type); + content_types[1] = NULL; + } + else + { + content_types = g_key_file_get_keys (key_file, ADDED_ASSOCIATIONS_GROUP, NULL, NULL); + } + + for (k = 0; content_types && content_types[k]; k++) + { + /* Add to the right place in the list */ + + length = 0; + old_list = g_key_file_get_string_list (key_file, ADDED_ASSOCIATIONS_GROUP, + content_types[k], &length, NULL); + + list = g_new (char *, 1 + length + 1); + + i = 0; + if (add_as_default) + list[i++] = g_strdup (desktop_id); + if (old_list) + { + for (j = 0; old_list[j] != NULL; j++) + { + if (g_strcmp0 (old_list[j], desktop_id) != 0) + list[i++] = g_strdup (old_list[j]); + else if (add_non_default) + { + /* If adding as non-default, and it's already in, + don't change order of desktop ids */ + add_non_default = FALSE; + list[i++] = g_strdup (old_list[j]); + } + } + } + + if (add_non_default) + { + /* We're adding as non-default, and it wasn't already in the list, + so we add at the end. But to avoid listing the app before the + current system default (thus changing the default) we have to + add the current list of (not yet listed) apps before it. */ + + list[i] = NULL; /* Terminate current list so we can use it */ + system_list = get_all_desktop_entries_for_mime_type (content_type, (const char **)list); + + list = g_renew (char *, list, 1 + length + g_list_length (system_list) + 1); + + for (l = system_list; l != NULL; l = l->next) + { + list[i++] = l->data; /* no strdup, taking ownership */ + if (g_strcmp0 (l->data, desktop_id) == 0) + add_non_default = FALSE; + } + g_list_free (system_list); + + if (add_non_default) + list[i++] = g_strdup (desktop_id); + } + + list[i] = NULL; + + g_strfreev (old_list); + + if (list[0] == NULL || desktop_id == NULL) + g_key_file_remove_key (key_file, + ADDED_ASSOCIATIONS_GROUP, + content_types[k], + NULL); + else + g_key_file_set_string_list (key_file, + ADDED_ASSOCIATIONS_GROUP, + content_types[k], + (const char * const *)list, i); + + g_strfreev (list); + } + + if (content_type) + { + /* reuse the list from above */ + } + else + { + g_strfreev (content_types); + content_types = g_key_file_get_keys (key_file, REMOVED_ASSOCIATIONS_GROUP, NULL, NULL); + } + + for (k = 0; content_types && content_types[k]; k++) + { + /* Remove from removed associations group (unless remove) */ + + length = 0; + old_list = g_key_file_get_string_list (key_file, REMOVED_ASSOCIATIONS_GROUP, + content_types[k], &length, NULL); + + list = g_new (char *, 1 + length + 1); + + i = 0; + if (remove) + list[i++] = g_strdup (desktop_id); + if (old_list) + { + for (j = 0; old_list[j] != NULL; j++) + { + if (g_strcmp0 (old_list[j], desktop_id) != 0) + list[i++] = g_strdup (old_list[j]); + } + } + list[i] = NULL; + + g_strfreev (old_list); + + if (list[0] == NULL || desktop_id == NULL) + g_key_file_remove_key (key_file, + REMOVED_ASSOCIATIONS_GROUP, + content_types[k], + NULL); + else + g_key_file_set_string_list (key_file, + REMOVED_ASSOCIATIONS_GROUP, + content_types[k], + (const char * const *)list, i); + + g_strfreev (list); + } + + g_strfreev (content_types); + + data = g_key_file_to_data (key_file, &data_size, error); + g_key_file_free (key_file); + + res = g_file_set_contents (filename, data, data_size, error); + + mime_info_cache_reload (NULL); + + g_free (filename); + g_free (data); + + return res; +} + +static gboolean +g_desktop_app_info_set_as_default_for_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (!g_desktop_app_info_ensure_saved (info, error)) + return FALSE; + + return update_mimeapps_list (info->desktop_id, content_type, TRUE, FALSE, FALSE, error); +} + +static void +update_program_done (GPid pid, + gint status, + gpointer data) +{ + /* Did the application exit correctly */ + if (WIFEXITED (status) && + WEXITSTATUS (status) == 0) + { + /* Here we could clean out any caches in use */ + } +} + +static void +run_update_command (char *command, + char *subdir) +{ + char *argv[3] = { + NULL, + NULL, + NULL, + }; + GPid pid = 0; + GError *error = NULL; + + argv[0] = command; + argv[1] = g_build_filename (g_get_user_data_dir (), subdir, NULL); + + if (g_spawn_async ("/", argv, + NULL, /* envp */ + G_SPAWN_SEARCH_PATH | + G_SPAWN_STDOUT_TO_DEV_NULL | + G_SPAWN_STDERR_TO_DEV_NULL | + G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, /* No setup function */ + &pid, + &error)) + g_child_watch_add (pid, update_program_done, NULL); + else + { + /* If we get an error at this point, it's quite likely the user doesn't + * have an installed copy of either 'update-mime-database' or + * 'update-desktop-database'. I don't think we want to popup an error + * dialog at this point, so we just do a g_warning to give the user a + * chance of debugging it. + */ + g_warning ("%s", error->message); + } + + g_free (argv[1]); +} + +static gboolean +g_desktop_app_info_set_as_default_for_extension (GAppInfo *appinfo, + const char *extension, + GError **error) +{ + char *filename, *basename, *mimetype; + char *dirname; + gboolean res; + + if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (appinfo), error)) + return FALSE; + + dirname = ensure_dir (MIMETYPE_DIR, error); + if (!dirname) + return FALSE; + + basename = g_strdup_printf ("user-extension-%s.xml", extension); + filename = g_build_filename (dirname, basename, NULL); + g_free (basename); + g_free (dirname); + + mimetype = g_strdup_printf ("application/x-extension-%s", extension); + + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) + { + char *contents; + + contents = + g_strdup_printf ("\n" + "\n" + " \n" + " %s document\n" + " \n" + " \n" + "\n", mimetype, extension, extension); + + g_file_set_contents (filename, contents, -1, NULL); + g_free (contents); + + run_update_command ("update-mime-database", "mime"); + } + g_free (filename); + + res = g_desktop_app_info_set_as_default_for_type (appinfo, + mimetype, + error); + + g_free (mimetype); + + return res; +} + +static gboolean +g_desktop_app_info_add_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error)) + return FALSE; + + return update_mimeapps_list (info->desktop_id, content_type, FALSE, TRUE, FALSE, error); +} + +static gboolean +g_desktop_app_info_can_remove_supports_type (GAppInfo *appinfo) +{ + return TRUE; +} + +static gboolean +g_desktop_app_info_remove_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error)) + return FALSE; + + return update_mimeapps_list (info->desktop_id, content_type, FALSE, FALSE, TRUE, error); +} + +static gboolean +g_desktop_app_info_ensure_saved (GDesktopAppInfo *info, + GError **error) +{ + GKeyFile *key_file; + char *dirname; + char *filename; + char *data, *desktop_id; + gsize data_size; + int fd; + gboolean res; + + if (info->filename != NULL) + return TRUE; + + /* This is only used for object created with + * g_app_info_create_from_commandline. All other + * object should have a filename + */ + + dirname = ensure_dir (APP_DIR, error); + if (!dirname) + return FALSE; + + key_file = g_key_file_new (); + + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + "Encoding", "UTF-8"); + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_VERSION, "1.0"); + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_TYPE, + G_KEY_FILE_DESKTOP_TYPE_APPLICATION); + if (info->terminal) + g_key_file_set_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_TERMINAL, TRUE); + + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_EXEC, info->exec); + + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_NAME, info->name); + + if (info->fullname != NULL) + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + FULL_NAME_KEY, info->fullname); + + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_COMMENT, info->comment); + + g_key_file_set_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, TRUE); + + data = g_key_file_to_data (key_file, &data_size, NULL); + g_key_file_free (key_file); + + desktop_id = g_strdup_printf ("userapp-%s-XXXXXX.desktop", info->name); + filename = g_build_filename (dirname, desktop_id, NULL); + g_free (desktop_id); + g_free (dirname); + + fd = g_mkstemp (filename); + if (fd == -1) + { + char *display_name; + + display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Can't create user desktop file %s"), display_name); + g_free (display_name); + g_free (filename); + g_free (data); + return FALSE; + } + + desktop_id = g_path_get_basename (filename); + + close (fd); + + res = g_file_set_contents (filename, data, data_size, error); + if (!res) + { + g_free (desktop_id); + g_free (filename); + return FALSE; + } + + info->filename = filename; + info->desktop_id = desktop_id; + + run_update_command ("update-desktop-database", "applications"); + + return TRUE; +} + +static gboolean +g_desktop_app_info_can_delete (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (info->filename) + { + if (strstr (info->filename, "/userapp-")) + return g_access (info->filename, W_OK) == 0; + } + + return FALSE; +} + +static gboolean +g_desktop_app_info_delete (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + if (info->filename) + { + if (g_remove (info->filename) == 0) + { + update_mimeapps_list (info->desktop_id, NULL, FALSE, FALSE, FALSE, NULL); + + g_free (info->filename); + info->filename = NULL; + g_free (info->desktop_id); + info->desktop_id = NULL; + + return TRUE; + } + } + + return FALSE; +} + +/** + * g_app_info_create_from_commandline: + * @commandline: the commandline to use + * @application_name: the application name, or %NULL to use @commandline + * @flags: flags that can specify details of the created #GAppInfo + * @error: a #GError location to store the error occuring, %NULL to ignore. + * + * Creates a new #GAppInfo from the given information. + * + * Returns: new #GAppInfo for given command. + **/ +GAppInfo * +g_app_info_create_from_commandline (const char *commandline, + const char *application_name, + GAppInfoCreateFlags flags, + GError **error) +{ + char **split; + char *basename; + GDesktopAppInfo *info; + + g_return_val_if_fail (commandline, NULL); + + info = g_object_new (G_TYPE_DESKTOP_APP_INFO, NULL); + + info->filename = NULL; + info->desktop_id = NULL; + + info->terminal = flags & G_APP_INFO_CREATE_NEEDS_TERMINAL; + info->startup_notify = FALSE; + info->hidden = FALSE; + if (flags & G_APP_INFO_CREATE_SUPPORTS_URIS) + info->exec = g_strconcat (commandline, " %u", NULL); + else + info->exec = g_strconcat (commandline, " %f", NULL); + info->nodisplay = TRUE; + info->binary = binary_from_exec (info->exec); + + if (application_name) + info->name = g_strdup (application_name); + else + { + /* FIXME: this should be more robust. Maybe g_shell_parse_argv and use argv[0] */ + split = g_strsplit (commandline, " ", 2); + basename = split[0] ? g_path_get_basename (split[0]) : NULL; + g_strfreev (split); + info->name = basename; + if (info->name == NULL) + info->name = g_strdup ("custom"); + } + info->comment = g_strdup_printf (_("Custom definition for %s"), info->name); + + return G_APP_INFO (info); +} + +static void +g_desktop_app_info_iface_init (GAppInfoIface *iface) +{ + iface->dup = g_desktop_app_info_dup; + iface->equal = g_desktop_app_info_equal; + iface->get_id = g_desktop_app_info_get_id; + iface->get_name = g_desktop_app_info_get_name; + iface->get_description = g_desktop_app_info_get_description; + iface->get_executable = g_desktop_app_info_get_executable; + iface->get_icon = g_desktop_app_info_get_icon; + iface->launch = g_desktop_app_info_launch; + iface->supports_uris = g_desktop_app_info_supports_uris; + iface->supports_files = g_desktop_app_info_supports_files; + iface->launch_uris = g_desktop_app_info_launch_uris; + iface->should_show = g_desktop_app_info_should_show; + iface->set_as_default_for_type = g_desktop_app_info_set_as_default_for_type; + iface->set_as_default_for_extension = g_desktop_app_info_set_as_default_for_extension; + iface->add_supports_type = g_desktop_app_info_add_supports_type; + iface->can_remove_supports_type = g_desktop_app_info_can_remove_supports_type; + iface->remove_supports_type = g_desktop_app_info_remove_supports_type; + iface->can_delete = g_desktop_app_info_can_delete; + iface->do_delete = g_desktop_app_info_delete; + iface->get_commandline = g_desktop_app_info_get_commandline; + iface->get_display_name = g_desktop_app_info_get_display_name; +} + +static gboolean +app_info_in_list (GAppInfo *info, + GList *list) +{ + while (list != NULL) + { + if (g_app_info_equal (info, list->data)) + return TRUE; + list = list->next; + } + return FALSE; +} + + +/** + * g_app_info_get_all_for_type: + * @content_type: the content type to find a #GAppInfo for + * + * Gets a list of all #GAppInfos for a given content type. + * + * Returns: #GList of #GAppInfos for given @content_type + * or %NULL on error. + **/ +GList * +g_app_info_get_all_for_type (const char *content_type) +{ + GList *desktop_entries, *l; + GList *infos; + GDesktopAppInfo *info; + + g_return_val_if_fail (content_type != NULL, NULL); + + desktop_entries = get_all_desktop_entries_for_mime_type (content_type, NULL); + + infos = NULL; + for (l = desktop_entries; l != NULL; l = l->next) + { + char *desktop_entry = l->data; + + info = g_desktop_app_info_new (desktop_entry); + if (info) + { + if (app_info_in_list (G_APP_INFO (info), infos)) + g_object_unref (info); + else + infos = g_list_prepend (infos, info); + } + g_free (desktop_entry); + } + + g_list_free (desktop_entries); + + return g_list_reverse (infos); +} + +/** + * g_app_info_reset_type_associations: + * @content_type: a content type + * + * Removes all changes to the type associations done by + * g_app_info_set_as_default_for_type(), + * g_app_info_set_as_default_for_extension(), + * g_app_info_add_supports_type() or g_app_info_remove_supports_type(). + * + * Since: 2.20 + */ +void +g_app_info_reset_type_associations (const char *content_type) +{ + update_mimeapps_list (NULL, content_type, FALSE, FALSE, FALSE, NULL); +} + +/** + * g_app_info_get_default_for_type: + * @content_type: the content type to find a #GAppInfo for + * @must_support_uris: if %TRUE, the #GAppInfo is expected to + * support URIs + * + * Gets the #GAppInfo that corresponds to a given content type. + * + * Returns: #GAppInfo for given @content_type or %NULL on error. + **/ +GAppInfo * +g_app_info_get_default_for_type (const char *content_type, + gboolean must_support_uris) +{ + GList *desktop_entries, *l; + GAppInfo *info; + + g_return_val_if_fail (content_type != NULL, NULL); + + desktop_entries = get_all_desktop_entries_for_mime_type (content_type, NULL); + + info = NULL; + for (l = desktop_entries; l != NULL; l = l->next) + { + char *desktop_entry = l->data; + + info = (GAppInfo *)g_desktop_app_info_new (desktop_entry); + if (info) + { + if (must_support_uris && !g_app_info_supports_uris (info)) + { + g_object_unref (info); + info = NULL; + } + else + break; + } + } + + g_list_foreach (desktop_entries, (GFunc)g_free, NULL); + g_list_free (desktop_entries); + + return info; +} + +/** + * g_app_info_get_default_for_uri_scheme: + * @uri_scheme: a string containing a URI scheme. + * + * Gets the default application for launching applications + * using this URI scheme. A URI scheme is the initial part + * of the URI, up to but not including the ':', e.g. "http", + * "ftp" or "sip". + * + * Returns: #GAppInfo for given @uri_scheme or %NULL on error. + **/ +GAppInfo * +g_app_info_get_default_for_uri_scheme (const char *uri_scheme) +{ + static gsize lookup = 0; + + if (g_once_init_enter (&lookup)) + { + gsize setup_value = 1; + GDesktopAppInfoLookup *lookup_instance; + const char *use_this; + GIOExtensionPoint *ep; + GIOExtension *extension; + GList *l; + + use_this = g_getenv ("GIO_USE_URI_ASSOCIATION"); + + /* Ensure vfs in modules loaded */ + _g_io_modules_ensure_loaded (); + + ep = g_io_extension_point_lookup (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME); + + lookup_instance = NULL; + if (use_this) + { + extension = g_io_extension_point_get_extension_by_name (ep, use_this); + if (extension) + lookup_instance = g_object_new (g_io_extension_get_type (extension), NULL); + } + + if (lookup_instance == NULL) + { + for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) + { + extension = l->data; + lookup_instance = g_object_new (g_io_extension_get_type (extension), NULL); + if (lookup_instance != NULL) + break; + } + } + + if (lookup_instance != NULL) + setup_value = (gsize)lookup_instance; + + g_once_init_leave (&lookup, setup_value); + } + + if (lookup == 1) + return NULL; + + return g_desktop_app_info_lookup_get_default_for_uri_scheme (G_DESKTOP_APP_INFO_LOOKUP (lookup), + uri_scheme); +} + + +static void +get_apps_from_dir (GHashTable *apps, + const char *dirname, + const char *prefix) +{ + GDir *dir; + const char *basename; + char *filename, *subprefix, *desktop_id; + gboolean hidden; + GDesktopAppInfo *appinfo; + + dir = g_dir_open (dirname, 0, NULL); + if (dir) + { + while ((basename = g_dir_read_name (dir)) != NULL) + { + filename = g_build_filename (dirname, basename, NULL); + if (g_str_has_suffix (basename, ".desktop")) + { + desktop_id = g_strconcat (prefix, basename, NULL); + + /* Use _extended so we catch NULLs too (hidden) */ + if (!g_hash_table_lookup_extended (apps, desktop_id, NULL, NULL)) + { + appinfo = g_desktop_app_info_new_from_filename (filename); + hidden = FALSE; + + if (appinfo && g_desktop_app_info_get_is_hidden (appinfo)) + { + g_object_unref (appinfo); + appinfo = NULL; + hidden = TRUE; + } + + if (appinfo || hidden) + { + g_hash_table_insert (apps, g_strdup (desktop_id), appinfo); + + if (appinfo) + { + /* Reuse instead of strdup here */ + appinfo->desktop_id = desktop_id; + desktop_id = NULL; + } + } + } + g_free (desktop_id); + } + else + { + if (g_file_test (filename, G_FILE_TEST_IS_DIR)) + { + subprefix = g_strconcat (prefix, basename, "-", NULL); + get_apps_from_dir (apps, filename, subprefix); + g_free (subprefix); + } + } + g_free (filename); + } + g_dir_close (dir); + } +} + + +/** + * g_app_info_get_all: + * + * Gets a list of all of the applications currently registered + * on this system. + * + * For desktop files, this includes applications that have + * NoDisplay=true set or are excluded from + * display by means of OnlyShowIn or + * NotShowIn. See g_app_info_should_show(). + * The returned list does not include applications which have + * the Hidden key set. + * + * Returns: a newly allocated #GList of references to #GAppInfos. + **/ +GList * +g_app_info_get_all (void) +{ + const char * const *dirs; + GHashTable *apps; + GHashTableIter iter; + gpointer value; + int i; + GList *infos; + + dirs = get_applications_search_path (); + + apps = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + + + for (i = 0; dirs[i] != NULL; i++) + get_apps_from_dir (apps, dirs[i], ""); + + + infos = NULL; + g_hash_table_iter_init (&iter, apps); + while (g_hash_table_iter_next (&iter, NULL, &value)) + { + if (value) + infos = g_list_prepend (infos, value); + } + + g_hash_table_destroy (apps); + + return g_list_reverse (infos); +} + +/* Cacheing of mimeinfo.cache and defaults.list files */ + +typedef struct { + char *path; + GHashTable *mime_info_cache_map; + GHashTable *defaults_list_map; + GHashTable *mimeapps_list_added_map; + GHashTable *mimeapps_list_removed_map; + time_t mime_info_cache_timestamp; + time_t defaults_list_timestamp; + time_t mimeapps_list_timestamp; +} MimeInfoCacheDir; + +typedef struct { + GList *dirs; /* mimeinfo.cache and defaults.list */ + GHashTable *global_defaults_cache; /* global results of defaults.list lookup and validation */ + time_t last_stat_time; + guint should_ping_mime_monitor : 1; +} MimeInfoCache; + +static MimeInfoCache *mime_info_cache = NULL; +G_LOCK_DEFINE_STATIC (mime_info_cache); + +static void mime_info_cache_dir_add_desktop_entries (MimeInfoCacheDir *dir, + const char *mime_type, + char **new_desktop_file_ids); + +static MimeInfoCache * mime_info_cache_new (void); + +static void +destroy_info_cache_value (gpointer key, + GList *value, + gpointer data) +{ + g_list_foreach (value, (GFunc)g_free, NULL); + g_list_free (value); +} + +static void +destroy_info_cache_map (GHashTable *info_cache_map) +{ + g_hash_table_foreach (info_cache_map, (GHFunc)destroy_info_cache_value, NULL); + g_hash_table_destroy (info_cache_map); +} + +static gboolean +mime_info_cache_dir_out_of_date (MimeInfoCacheDir *dir, + const char *cache_file, + time_t *timestamp) +{ + struct stat buf; + char *filename; + + filename = g_build_filename (dir->path, cache_file, NULL); + + if (g_stat (filename, &buf) < 0) + { + g_free (filename); + return TRUE; + } + g_free (filename); + + if (buf.st_mtime != *timestamp) + return TRUE; + + return FALSE; +} + +/* Call with lock held */ +static gboolean +remove_all (gpointer key, + gpointer value, + gpointer user_data) +{ + return TRUE; +} + + +static void +mime_info_cache_blow_global_cache (void) +{ + g_hash_table_foreach_remove (mime_info_cache->global_defaults_cache, + remove_all, NULL); +} + +static void +mime_info_cache_dir_init (MimeInfoCacheDir *dir) +{ + GError *load_error; + GKeyFile *key_file; + gchar *filename, **mime_types; + int i; + struct stat buf; + + load_error = NULL; + mime_types = NULL; + + if (dir->mime_info_cache_map != NULL && + !mime_info_cache_dir_out_of_date (dir, "mimeinfo.cache", + &dir->mime_info_cache_timestamp)) + return; + + if (dir->mime_info_cache_map != NULL) + destroy_info_cache_map (dir->mime_info_cache_map); + + dir->mime_info_cache_map = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + NULL); + + key_file = g_key_file_new (); + + filename = g_build_filename (dir->path, "mimeinfo.cache", NULL); + + if (g_stat (filename, &buf) < 0) + goto error; + + if (dir->mime_info_cache_timestamp > 0) + mime_info_cache->should_ping_mime_monitor = TRUE; + + dir->mime_info_cache_timestamp = buf.st_mtime; + + g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, &load_error); + + g_free (filename); + filename = NULL; + + if (load_error != NULL) + goto error; + + mime_types = g_key_file_get_keys (key_file, MIME_CACHE_GROUP, + NULL, &load_error); + + if (load_error != NULL) + goto error; + + for (i = 0; mime_types[i] != NULL; i++) + { + gchar **desktop_file_ids; + char *unaliased_type; + desktop_file_ids = g_key_file_get_string_list (key_file, + MIME_CACHE_GROUP, + mime_types[i], + NULL, + NULL); + + if (desktop_file_ids == NULL) + continue; + + unaliased_type = _g_unix_content_type_unalias (mime_types[i]); + mime_info_cache_dir_add_desktop_entries (dir, + unaliased_type, + desktop_file_ids); + g_free (unaliased_type); + + g_strfreev (desktop_file_ids); + } + + g_strfreev (mime_types); + g_key_file_free (key_file); + + return; + error: + g_free (filename); + g_key_file_free (key_file); + + if (mime_types != NULL) + g_strfreev (mime_types); + + if (load_error) + g_error_free (load_error); +} + +static void +mime_info_cache_dir_init_defaults_list (MimeInfoCacheDir *dir) +{ + GKeyFile *key_file; + GError *load_error; + gchar *filename, **mime_types; + char *unaliased_type; + char **desktop_file_ids; + int i; + struct stat buf; + + load_error = NULL; + mime_types = NULL; + + if (dir->defaults_list_map != NULL && + !mime_info_cache_dir_out_of_date (dir, "defaults.list", + &dir->defaults_list_timestamp)) + return; + + if (dir->defaults_list_map != NULL) + g_hash_table_destroy (dir->defaults_list_map); + dir->defaults_list_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify)g_strfreev); + + + key_file = g_key_file_new (); + + filename = g_build_filename (dir->path, "defaults.list", NULL); + if (g_stat (filename, &buf) < 0) + goto error; + + if (dir->defaults_list_timestamp > 0) + mime_info_cache->should_ping_mime_monitor = TRUE; + + dir->defaults_list_timestamp = buf.st_mtime; + + g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, &load_error); + g_free (filename); + filename = NULL; + + if (load_error != NULL) + goto error; + + mime_types = g_key_file_get_keys (key_file, DEFAULT_APPLICATIONS_GROUP, + NULL, NULL); + if (mime_types != NULL) + { + for (i = 0; mime_types[i] != NULL; i++) + { + desktop_file_ids = g_key_file_get_string_list (key_file, + DEFAULT_APPLICATIONS_GROUP, + mime_types[i], + NULL, + NULL); + if (desktop_file_ids == NULL) + continue; + + unaliased_type = _g_unix_content_type_unalias (mime_types[i]); + g_hash_table_replace (dir->defaults_list_map, + unaliased_type, + desktop_file_ids); + } + + g_strfreev (mime_types); + } + + g_key_file_free (key_file); + return; + + error: + g_free (filename); + g_key_file_free (key_file); + + if (mime_types != NULL) + g_strfreev (mime_types); + + if (load_error) + g_error_free (load_error); +} + +static void +mime_info_cache_dir_init_mimeapps_list (MimeInfoCacheDir *dir) +{ + GKeyFile *key_file; + GError *load_error; + gchar *filename, **mime_types; + char *unaliased_type; + char **desktop_file_ids; + int i; + struct stat buf; + + load_error = NULL; + mime_types = NULL; + + if (dir->mimeapps_list_added_map != NULL && + !mime_info_cache_dir_out_of_date (dir, "mimeapps.list", + &dir->mimeapps_list_timestamp)) + return; + + if (dir->mimeapps_list_added_map != NULL) + g_hash_table_destroy (dir->mimeapps_list_added_map); + dir->mimeapps_list_added_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify)g_strfreev); + + if (dir->mimeapps_list_removed_map != NULL) + g_hash_table_destroy (dir->mimeapps_list_removed_map); + dir->mimeapps_list_removed_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify)g_strfreev); + + key_file = g_key_file_new (); + + filename = g_build_filename (dir->path, "mimeapps.list", NULL); + if (g_stat (filename, &buf) < 0) + goto error; + + if (dir->mimeapps_list_timestamp > 0) + mime_info_cache->should_ping_mime_monitor = TRUE; + + dir->mimeapps_list_timestamp = buf.st_mtime; + + g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, &load_error); + g_free (filename); + filename = NULL; + + if (load_error != NULL) + goto error; + + mime_types = g_key_file_get_keys (key_file, ADDED_ASSOCIATIONS_GROUP, + NULL, NULL); + if (mime_types != NULL) + { + for (i = 0; mime_types[i] != NULL; i++) + { + desktop_file_ids = g_key_file_get_string_list (key_file, + ADDED_ASSOCIATIONS_GROUP, + mime_types[i], + NULL, + NULL); + if (desktop_file_ids == NULL) + continue; + + unaliased_type = _g_unix_content_type_unalias (mime_types[i]); + g_hash_table_replace (dir->mimeapps_list_added_map, + unaliased_type, + desktop_file_ids); + } + + g_strfreev (mime_types); + } + + mime_types = g_key_file_get_keys (key_file, REMOVED_ASSOCIATIONS_GROUP, + NULL, NULL); + if (mime_types != NULL) + { + for (i = 0; mime_types[i] != NULL; i++) + { + desktop_file_ids = g_key_file_get_string_list (key_file, + REMOVED_ASSOCIATIONS_GROUP, + mime_types[i], + NULL, + NULL); + if (desktop_file_ids == NULL) + continue; + + unaliased_type = _g_unix_content_type_unalias (mime_types[i]); + g_hash_table_replace (dir->mimeapps_list_removed_map, + unaliased_type, + desktop_file_ids); + } + + g_strfreev (mime_types); + } + + g_key_file_free (key_file); + return; + + error: + g_free (filename); + g_key_file_free (key_file); + + if (mime_types != NULL) + g_strfreev (mime_types); + + if (load_error) + g_error_free (load_error); +} + +static MimeInfoCacheDir * +mime_info_cache_dir_new (const char *path) +{ + MimeInfoCacheDir *dir; + + dir = g_new0 (MimeInfoCacheDir, 1); + dir->path = g_strdup (path); + + return dir; +} + +static void +mime_info_cache_dir_free (MimeInfoCacheDir *dir) +{ + if (dir == NULL) + return; + + if (dir->mime_info_cache_map != NULL) + { + destroy_info_cache_map (dir->mime_info_cache_map); + dir->mime_info_cache_map = NULL; + + } + + if (dir->defaults_list_map != NULL) + { + g_hash_table_destroy (dir->defaults_list_map); + dir->defaults_list_map = NULL; + } + + if (dir->mimeapps_list_added_map != NULL) + { + g_hash_table_destroy (dir->mimeapps_list_added_map); + dir->mimeapps_list_added_map = NULL; + } + + if (dir->mimeapps_list_removed_map != NULL) + { + g_hash_table_destroy (dir->mimeapps_list_removed_map); + dir->mimeapps_list_removed_map = NULL; + } + + g_free (dir); +} + +static void +mime_info_cache_dir_add_desktop_entries (MimeInfoCacheDir *dir, + const char *mime_type, + char **new_desktop_file_ids) +{ + GList *desktop_file_ids; + int i; + + desktop_file_ids = g_hash_table_lookup (dir->mime_info_cache_map, + mime_type); + + for (i = 0; new_desktop_file_ids[i] != NULL; i++) + { + if (!g_list_find_custom (desktop_file_ids, new_desktop_file_ids[i], (GCompareFunc) strcmp)) + desktop_file_ids = g_list_append (desktop_file_ids, + g_strdup (new_desktop_file_ids[i])); + } + + g_hash_table_insert (dir->mime_info_cache_map, g_strdup (mime_type), desktop_file_ids); +} + +static void +mime_info_cache_init_dir_lists (void) +{ + const char * const *dirs; + int i; + + mime_info_cache = mime_info_cache_new (); + + dirs = get_applications_search_path (); + + for (i = 0; dirs[i] != NULL; i++) + { + MimeInfoCacheDir *dir; + + dir = mime_info_cache_dir_new (dirs[i]); + + if (dir != NULL) + { + mime_info_cache_dir_init (dir); + mime_info_cache_dir_init_defaults_list (dir); + mime_info_cache_dir_init_mimeapps_list (dir); + + mime_info_cache->dirs = g_list_append (mime_info_cache->dirs, dir); + } + } +} + +static void +mime_info_cache_update_dir_lists (void) +{ + GList *tmp; + + tmp = mime_info_cache->dirs; + + while (tmp != NULL) + { + MimeInfoCacheDir *dir = (MimeInfoCacheDir *) tmp->data; + + /* No need to do this if we had file monitors... */ + mime_info_cache_blow_global_cache (); + mime_info_cache_dir_init (dir); + mime_info_cache_dir_init_defaults_list (dir); + mime_info_cache_dir_init_mimeapps_list (dir); + + tmp = tmp->next; + } +} + +static void +mime_info_cache_init (void) +{ + G_LOCK (mime_info_cache); + if (mime_info_cache == NULL) + mime_info_cache_init_dir_lists (); + else + { + time_t now; + + time (&now); + if (now >= mime_info_cache->last_stat_time + 10) + { + mime_info_cache_update_dir_lists (); + mime_info_cache->last_stat_time = now; + } + } + + if (mime_info_cache->should_ping_mime_monitor) + { + /* g_idle_add (emit_mime_changed, NULL); */ + mime_info_cache->should_ping_mime_monitor = FALSE; + } + + G_UNLOCK (mime_info_cache); +} + +static MimeInfoCache * +mime_info_cache_new (void) +{ + MimeInfoCache *cache; + + cache = g_new0 (MimeInfoCache, 1); + + cache->global_defaults_cache = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) g_free); + return cache; +} + +static void +mime_info_cache_free (MimeInfoCache *cache) +{ + if (cache == NULL) + return; + + g_list_foreach (cache->dirs, + (GFunc) mime_info_cache_dir_free, + NULL); + g_list_free (cache->dirs); + g_hash_table_destroy (cache->global_defaults_cache); + g_free (cache); +} + +/** + * mime_info_cache_reload: + * @dir: directory path which needs reloading. + * + * Reload the mime information for the @dir. + */ +static void +mime_info_cache_reload (const char *dir) +{ + /* FIXME: just reload the dir that needs reloading, + * don't blow the whole cache + */ + if (mime_info_cache != NULL) + { + G_LOCK (mime_info_cache); + mime_info_cache_free (mime_info_cache); + mime_info_cache = NULL; + G_UNLOCK (mime_info_cache); + } +} + +static GList * +append_desktop_entry (GList *list, + const char *desktop_entry, + GList *removed_entries) +{ + /* Add if not already in list, and valid */ + if (!g_list_find_custom (list, desktop_entry, (GCompareFunc) strcmp) && + !g_list_find_custom (removed_entries, desktop_entry, (GCompareFunc) strcmp)) + list = g_list_prepend (list, g_strdup (desktop_entry)); + + return list; +} + +/** + * get_all_desktop_entries_for_mime_type: + * @mime_type: a mime type. + * @except: NULL or a strv list + * + * Returns all the desktop ids for @mime_type. The desktop files + * are listed in an order so that default applications are listed before + * non-default ones, and handlers for inherited mimetypes are listed + * after the base ones. + * + * Optionally doesn't list the desktop ids given in the @except + * + * Return value: a #GList containing the desktop ids which claim + * to handle @mime_type. + */ +static GList * +get_all_desktop_entries_for_mime_type (const char *base_mime_type, + const char **except) +{ + GList *desktop_entries, *removed_entries, *list, *dir_list, *tmp; + MimeInfoCacheDir *dir; + char *mime_type; + char **mime_types; + char **default_entries; + char **removed_associations; + int i, j, k; + GPtrArray *array; + char **anc; + + mime_info_cache_init (); + + /* collect all ancestors */ + mime_types = _g_unix_content_type_get_parents (base_mime_type); + array = g_ptr_array_new (); + for (i = 0; mime_types[i]; i++) + g_ptr_array_add (array, mime_types[i]); + g_free (mime_types); + for (i = 0; i < array->len; i++) + { + anc = _g_unix_content_type_get_parents (g_ptr_array_index (array, i)); + for (j = 0; anc[j]; j++) + { + for (k = 0; k < array->len; k++) + { + if (strcmp (anc[j], g_ptr_array_index (array, k)) == 0) + break; + } + if (k == array->len) /* not found */ + g_ptr_array_add (array, g_strdup (anc[j])); + } + g_strfreev (anc); + } + g_ptr_array_add (array, NULL); + mime_types = (char **)g_ptr_array_free (array, FALSE); + + G_LOCK (mime_info_cache); + + removed_entries = NULL; + desktop_entries = NULL; + + for (i = 0; except != NULL && except[i] != NULL; i++) + removed_entries = g_list_prepend (removed_entries, g_strdup (except[i])); + + for (i = 0; mime_types[i] != NULL; i++) + { + mime_type = mime_types[i]; + + /* Go through all apps listed as defaults */ + for (dir_list = mime_info_cache->dirs; + dir_list != NULL; + dir_list = dir_list->next) + { + dir = dir_list->data; + + /* First added associations from mimeapps.list */ + default_entries = g_hash_table_lookup (dir->mimeapps_list_added_map, mime_type); + for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++) + desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries); + + /* Then removed associations from mimeapps.list */ + removed_associations = g_hash_table_lookup (dir->mimeapps_list_removed_map, mime_type); + for (j = 0; removed_associations != NULL && removed_associations[j] != NULL; j++) + removed_entries = append_desktop_entry (removed_entries, removed_associations[j], NULL); + + /* Then system defaults (or old per-user config) (using removed associations from this dir or earlier) */ + default_entries = g_hash_table_lookup (dir->defaults_list_map, mime_type); + for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++) + desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries); + } + + /* Go through all entries that support the mimetype */ + for (dir_list = mime_info_cache->dirs; + dir_list != NULL; + dir_list = dir_list->next) + { + dir = dir_list->data; + + list = g_hash_table_lookup (dir->mime_info_cache_map, mime_type); + for (tmp = list; tmp != NULL; tmp = tmp->next) + desktop_entries = append_desktop_entry (desktop_entries, tmp->data, removed_entries); + } + } + + G_UNLOCK (mime_info_cache); + + g_strfreev (mime_types); + + g_list_foreach (removed_entries, (GFunc)g_free, NULL); + g_list_free (removed_entries); + + desktop_entries = g_list_reverse (desktop_entries); + + return desktop_entries; +} + +/* GDesktopAppInfoLookup interface: */ + +typedef GDesktopAppInfoLookupIface GDesktopAppInfoLookupInterface; +G_DEFINE_INTERFACE (GDesktopAppInfoLookup, g_desktop_app_info_lookup, G_TYPE_OBJECT) + +static void +g_desktop_app_info_lookup_default_init (GDesktopAppInfoLookupInterface *iface) +{ +} + +/** + * g_desktop_app_info_lookup_get_default_for_uri_scheme: + * @lookup: a #GDesktopAppInfoLookup + * @uri_scheme: a string containing a URI scheme. + * + * Gets the default application for launching applications + * using this URI scheme for a particular GDesktopAppInfoLookup + * implementation. + * + * The GDesktopAppInfoLookup interface and this function is used + * to implement g_app_info_get_default_for_uri_scheme() backends + * in a GIO module. There is no reason for applications to use it + * directly. Applications should use g_app_info_get_default_for_uri_scheme(). + * + * Returns: #GAppInfo for given @uri_scheme or %NULL on error. + */ +GAppInfo * +g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup, + const char *uri_scheme) +{ + GDesktopAppInfoLookupIface *iface; + + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO_LOOKUP (lookup), NULL); + + iface = G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE (lookup); + + return (* iface->get_default_for_uri_scheme) (lookup, uri_scheme); +} + +#define __G_DESKTOP_APP_INFO_C__ +#include "gioaliasdef.c" diff --git a/gio/gdesktopappinfo.h b/gio/gdesktopappinfo.h new file mode 100644 index 0000000..48c9693 --- /dev/null +++ b/gio/gdesktopappinfo.h @@ -0,0 +1,96 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_DESKTOP_APP_INFO_H__ +#define __G_DESKTOP_APP_INFO_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DESKTOP_APP_INFO (g_desktop_app_info_get_type ()) +#define G_DESKTOP_APP_INFO(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DESKTOP_APP_INFO, GDesktopAppInfo)) +#define G_DESKTOP_APP_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DESKTOP_APP_INFO, GDesktopAppInfoClass)) +#define G_IS_DESKTOP_APP_INFO(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DESKTOP_APP_INFO)) +#define G_IS_DESKTOP_APP_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DESKTOP_APP_INFO)) +#define G_DESKTOP_APP_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DESKTOP_APP_INFO, GDesktopAppInfoClass)) + +typedef struct _GDesktopAppInfo GDesktopAppInfo; +typedef struct _GDesktopAppInfoClass GDesktopAppInfoClass; + +struct _GDesktopAppInfoClass +{ + GObjectClass parent_class; +}; + + +GType g_desktop_app_info_get_type (void) G_GNUC_CONST; + +GDesktopAppInfo *g_desktop_app_info_new_from_filename (const char *filename); +GDesktopAppInfo *g_desktop_app_info_new_from_keyfile (GKeyFile *key_file); + +const char * g_desktop_app_info_get_filename (GDesktopAppInfo *info); + +GDesktopAppInfo *g_desktop_app_info_new (const char *desktop_id); +gboolean g_desktop_app_info_get_is_hidden (GDesktopAppInfo *info); + +void g_desktop_app_info_set_desktop_env (const char *desktop_env); + + +#define G_TYPE_DESKTOP_APP_INFO_LOOKUP (g_desktop_app_info_lookup_get_type ()) +#define G_DESKTOP_APP_INFO_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP, GDesktopAppInfoLookup)) +#define G_IS_DESKTOP_APP_INFO_LOOKUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP)) +#define G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_DESKTOP_APP_INFO_LOOKUP, GDesktopAppInfoLookupIface)) + +/** + * G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME: + * + * Extension point for default handler to URI association. See + * Extending GIO. + */ +#define G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME "gio-desktop-app-info-lookup" + +/** + * GDesktopAppInfoLookup: + * + * Interface that is used by backends to associate default + * handlers with URI schemes. + */ +typedef struct _GDesktopAppInfoLookup GDesktopAppInfoLookup; +typedef struct _GDesktopAppInfoLookupIface GDesktopAppInfoLookupIface; + +struct _GDesktopAppInfoLookupIface +{ + GTypeInterface g_iface; + + GAppInfo * (* get_default_for_uri_scheme) (GDesktopAppInfoLookup *lookup, + const char *uri_scheme); +}; + +GType g_desktop_app_info_lookup_get_type (void) G_GNUC_CONST; + +GAppInfo *g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup, + const char *uri_scheme); + +G_END_DECLS + +#endif /* __G_DESKTOP_APP_INFO_H__ */ diff --git a/gio/gdrive.c b/gio/gdrive.c new file mode 100644 index 0000000..4a45dff --- /dev/null +++ b/gio/gdrive.c @@ -0,0 +1,871 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" +#include "gdrive.h" +#include "gsimpleasyncresult.h" +#include "gasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gdrive + * @short_description: Drive management + * @include: gio/gio.h + * + * #GDrive - this represent a piece of hardware connected to the machine. + * It's generally only created for removable hardware or hardware with + * removable media. + * + * #GDrive is a container class for #GVolume objects that stem from + * the same piece of media. As such, #GDrive abstracts a drive with + * (or without) removable media and provides operations for querying + * whether media is available, determing whether media change is + * automatically detected and ejecting the media. + * + * If the #GDrive reports that media isn't automatically detected, one + * can poll for media; typically one should not do this periodically + * as a poll for media operation is potententially expensive and may + * spin up the drive creating noise. + * + * #GDrive supports starting and stopping drives with authentication + * support for the former. This can be used to support a diverse set + * of use cases including connecting/disconnecting iSCSI devices, + * powering down external disk enclosures and starting/stopping + * multi-disk devices such as RAID devices. Note that the actual + * semantics and side-effects of starting/stopping a #GDrive may vary + * according to implementation. To choose the correct verbs in e.g. a + * file manager, use g_drive_get_start_stop_type(). + * + * For porting from GnomeVFS note that there is no equivalent of + * #GDrive in that API. + **/ + +typedef GDriveIface GDriveInterface; +G_DEFINE_INTERFACE(GDrive, g_drive, G_TYPE_OBJECT) + +static void +g_drive_default_init (GDriveInterface *iface) +{ + /** + * GDrive::changed: + * @drive: a #GDrive. + * + * Emitted when the drive's state has changed. + **/ + g_signal_new (I_("changed"), + G_TYPE_DRIVE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDriveIface, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GDrive::disconnected: + * @drive: a #GDrive. + * + * This signal is emitted when the #GDrive have been + * disconnected. If the recipient is holding references to the + * object they should release them so the object can be + * finalized. + **/ + g_signal_new (I_("disconnected"), + G_TYPE_DRIVE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDriveIface, disconnected), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GDrive::eject-button: + * @drive: a #GDrive. + * + * Emitted when the physical eject button (if any) of a drive has + * been pressed. + **/ + g_signal_new (I_("eject-button"), + G_TYPE_DRIVE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDriveIface, eject_button), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GDrive::stop-button: + * @drive: a #GDrive. + * + * Emitted when the physical stop button (if any) of a drive has + * been pressed. + * + * Since: 2.22 + **/ + g_signal_new (I_("stop-button"), + G_TYPE_DRIVE, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDriveIface, stop_button), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +/** + * g_drive_get_name: + * @drive: a #GDrive. + * + * Gets the name of @drive. + * + * Returns: a string containing @drive's name. The returned + * string should be freed when no longer needed. + **/ +char * +g_drive_get_name (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->get_name) (drive); +} + +/** + * g_drive_get_icon: + * @drive: a #GDrive. + * + * Gets the icon for @drive. + * + * Returns: #GIcon for the @drive. + * Free the returned object with g_object_unref(). + **/ +GIcon * +g_drive_get_icon (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->get_icon) (drive); +} + +/** + * g_drive_has_volumes: + * @drive: a #GDrive. + * + * Check if @drive has any mountable volumes. + * + * Returns: %TRUE if the @drive contains volumes, %FALSE otherwise. + **/ +gboolean +g_drive_has_volumes (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->has_volumes) (drive); +} + +/** + * g_drive_get_volumes: + * @drive: a #GDrive. + * + * Get a list of mountable volumes for @drive. + * + * The returned list should be freed with g_list_free(), after + * its elements have been unreffed with g_object_unref(). + * + * Returns: #GList containing any #GVolume objects on the given @drive. + **/ +GList * +g_drive_get_volumes (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->get_volumes) (drive); +} + +/** + * g_drive_is_media_check_automatic: + * @drive: a #GDrive. + * + * Checks if @drive is capabable of automatically detecting media changes. + * + * Returns: %TRUE if the @drive is capabable of automatically detecting + * media changes, %FALSE otherwise. + **/ +gboolean +g_drive_is_media_check_automatic (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->is_media_check_automatic) (drive); +} + +/** + * g_drive_is_media_removable: + * @drive: a #GDrive. + * + * Checks if the @drive supports removable media. + * + * Returns: %TRUE if @drive supports removable media, %FALSE otherwise. + **/ +gboolean +g_drive_is_media_removable (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->is_media_removable) (drive); +} + +/** + * g_drive_has_media: + * @drive: a #GDrive. + * + * Checks if the @drive has media. Note that the OS may not be polling + * the drive for media changes; see g_drive_is_media_check_automatic() + * for more details. + * + * Returns: %TRUE if @drive has media, %FALSE otherwise. + **/ +gboolean +g_drive_has_media (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->has_media) (drive); +} + +/** + * g_drive_can_eject: + * @drive: a #GDrive. + * + * Checks if a drive can be ejected. + * + * Returns: %TRUE if the @drive can be ejected, %FALSE otherwise. + **/ +gboolean +g_drive_can_eject (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->can_eject == NULL) + return FALSE; + + return (* iface->can_eject) (drive); +} + +/** + * g_drive_can_poll_for_media: + * @drive: a #GDrive. + * + * Checks if a drive can be polled for media changes. + * + * Returns: %TRUE if the @drive can be polled for media changes, + * %FALSE otherwise. + **/ +gboolean +g_drive_can_poll_for_media (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->poll_for_media == NULL) + return FALSE; + + return (* iface->can_poll_for_media) (drive); +} + +/** + * g_drive_eject: + * @drive: a #GDrive. + * @flags: flags affecting the unmount if required for eject + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data to pass to @callback + * + * Asynchronously ejects a drive. + * + * When the operation is finished, @callback will be called. + * You can then call g_drive_eject_finish() to obtain the + * result of the operation. + * + * Deprecated: 2.22: Use g_drive_eject_with_operation() instead. + **/ +void +g_drive_eject (GDrive *drive, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDriveIface *iface; + + g_return_if_fail (G_IS_DRIVE (drive)); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->eject == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("drive doesn't implement eject")); + + return; + } + + (* iface->eject) (drive, flags, cancellable, callback, user_data); +} + +/** + * g_drive_eject_finish: + * @drive: a #GDrive. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes ejecting a drive. + * + * Returns: %TRUE if the drive has been ejected successfully, + * %FALSE otherwise. + * + * Deprecated: 2.22: Use g_drive_eject_with_operation_finish() instead. + **/ +gboolean +g_drive_eject_finish (GDrive *drive, + GAsyncResult *result, + GError **error) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->eject_finish) (drive, result, error); +} + +/** + * g_drive_eject_with_operation: + * @drive: a #GDrive. + * @flags: flags affecting the unmount if required for eject + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Ejects a drive. This is an asynchronous operation, and is + * finished by calling g_drive_eject_with_operation_finish() with the @drive + * and #GAsyncResult data returned in the @callback. + * + * Since: 2.22 + **/ +void +g_drive_eject_with_operation (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDriveIface *iface; + + g_return_if_fail (G_IS_DRIVE (drive)); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->eject == NULL && iface->eject_with_operation == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (drive), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for drive objects that + * don't implement any of eject or eject_with_operation. */ + _("drive doesn't implement eject or eject_with_operation")); + return; + } + + if (iface->eject_with_operation != NULL) + (* iface->eject_with_operation) (drive, flags, mount_operation, cancellable, callback, user_data); + else + (* iface->eject) (drive, flags, cancellable, callback, user_data); +} + +/** + * g_drive_eject_with_operation_finish: + * @drive: a #GDrive. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes ejecting a drive. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the drive was successfully ejected. %FALSE otherwise. + * + * Since: 2.22 + **/ +gboolean +g_drive_eject_with_operation_finish (GDrive *drive, + GAsyncResult *result, + GError **error) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_DRIVE_GET_IFACE (drive); + if (iface->eject_with_operation_finish != NULL) + return (* iface->eject_with_operation_finish) (drive, result, error); + else + return (* iface->eject_finish) (drive, result, error); +} + +/** + * g_drive_poll_for_media: + * @drive: a #GDrive. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data to pass to @callback + * + * Asynchronously polls @drive to see if media has been inserted or removed. + * + * When the operation is finished, @callback will be called. + * You can then call g_drive_poll_for_media_finish() to obtain the + * result of the operation. + **/ +void +g_drive_poll_for_media (GDrive *drive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDriveIface *iface; + + g_return_if_fail (G_IS_DRIVE (drive)); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->poll_for_media == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("drive doesn't implement polling for media")); + + return; + } + + (* iface->poll_for_media) (drive, cancellable, callback, user_data); +} + +/** + * g_drive_poll_for_media_finish: + * @drive: a #GDrive. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an operation started with g_drive_poll_for_media() on a drive. + * + * Returns: %TRUE if the drive has been poll_for_mediaed successfully, + * %FALSE otherwise. + **/ +gboolean +g_drive_poll_for_media_finish (GDrive *drive, + GAsyncResult *result, + GError **error) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->poll_for_media_finish) (drive, result, error); +} + +/** + * g_drive_get_identifier: + * @drive: a #GDrive + * @kind: the kind of identifier to return + * + * Gets the identifier of the given kind for @drive. + * + * Returns: a newly allocated string containing the + * requested identfier, or %NULL if the #GDrive + * doesn't have this kind of identifier. + */ +char * +g_drive_get_identifier (GDrive *drive, + const char *kind) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + g_return_val_if_fail (kind != NULL, NULL); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->get_identifier == NULL) + return NULL; + + return (* iface->get_identifier) (drive, kind); +} + +/** + * g_drive_enumerate_identifiers: + * @drive: a #GDrive + * + * Gets the kinds of identifiers that @drive has. + * Use g_drive_get_identifer() to obtain the identifiers + * themselves. + * + * Returns: a %NULL-terminated array of strings containing + * kinds of identifiers. Use g_strfreev() to free. + */ +char ** +g_drive_enumerate_identifiers (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->enumerate_identifiers == NULL) + return NULL; + + return (* iface->enumerate_identifiers) (drive); +} + +/** + * g_drive_get_start_stop_type: + * @drive: a #GDrive. + * + * Gets a hint about how a drive can be started/stopped. + * + * Returns: A value from the #GDriveStartStopType enumeration. + * + * Since: 2.22 + */ +GDriveStartStopType +g_drive_get_start_stop_type (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->get_start_stop_type == NULL) + return G_DRIVE_START_STOP_TYPE_UNKNOWN; + + return (* iface->get_start_stop_type) (drive); +} + + +/** + * g_drive_can_start: + * @drive: a #GDrive. + * + * Checks if a drive can be started. + * + * Returns: %TRUE if the @drive can be started, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_drive_can_start (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->can_start == NULL) + return FALSE; + + return (* iface->can_start) (drive); +} + +/** + * g_drive_can_start_degraded: + * @drive: a #GDrive. + * + * Checks if a drive can be started degraded. + * + * Returns: %TRUE if the @drive can be started degraded, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_drive_can_start_degraded (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->can_start_degraded == NULL) + return FALSE; + + return (* iface->can_start_degraded) (drive); +} + +/** + * g_drive_start: + * @drive: a #GDrive. + * @flags: flags affecting the start operation. + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data to pass to @callback + * + * Asynchronously starts a drive. + * + * When the operation is finished, @callback will be called. + * You can then call g_drive_start_finish() to obtain the + * result of the operation. + * + * Since: 2.22 + */ +void +g_drive_start (GDrive *drive, + GDriveStartFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDriveIface *iface; + + g_return_if_fail (G_IS_DRIVE (drive)); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->start == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("drive doesn't implement start")); + return; + } + + (* iface->start) (drive, flags, mount_operation, cancellable, callback, user_data); +} + +/** + * g_drive_start_finish: + * @drive: a #GDrive. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes starting a drive. + * + * Returns: %TRUE if the drive has been started successfully, + * %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_drive_start_finish (GDrive *drive, + GAsyncResult *result, + GError **error) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->start_finish) (drive, result, error); +} + +/** + * g_drive_can_stop: + * @drive: a #GDrive. + * + * Checks if a drive can be stopped. + * + * Returns: %TRUE if the @drive can be stopped, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_drive_can_stop (GDrive *drive) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->can_stop == NULL) + return FALSE; + + return (* iface->can_stop) (drive); +} + +/** + * g_drive_stop: + * @drive: a #GDrive. + * @flags: flags affecting the unmount if required for stopping. + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data to pass to @callback + * + * Asynchronously stops a drive. + * + * When the operation is finished, @callback will be called. + * You can then call g_drive_stop_finish() to obtain the + * result of the operation. + * + * Since: 2.22 + */ +void +g_drive_stop (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDriveIface *iface; + + g_return_if_fail (G_IS_DRIVE (drive)); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->stop == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("drive doesn't implement stop")); + return; + } + + (* iface->stop) (drive, flags, mount_operation, cancellable, callback, user_data); +} + +/** + * g_drive_stop_finish: + * @drive: a #GDrive. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes stopping a drive. + * + * Returns: %TRUE if the drive has been stopped successfully, + * %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_drive_stop_finish (GDrive *drive, + GAsyncResult *result, + GError **error) +{ + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->stop_finish) (drive, result, error); +} + +#define __G_DRIVE_C__ +#include "gioaliasdef.c" diff --git a/gio/gdrive.h b/gio/gdrive.h new file mode 100644 index 0000000..b4bfc03 --- /dev/null +++ b/gio/gdrive.h @@ -0,0 +1,225 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_DRIVE_H__ +#define __G_DRIVE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DRIVE (g_drive_get_type ()) +#define G_DRIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_DRIVE, GDrive)) +#define G_IS_DRIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_DRIVE)) +#define G_DRIVE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_DRIVE, GDriveIface)) + +/** + * GDriveIface: + * @g_iface: The parent interface. + * @changed: Signal emitted when the drive is changed. + * @disconnected: The removed signal that is emitted when the #GDrive have been disconnected. If the recipient is holding references to the object they should release them so the object can be finalized. + * @eject_button: Signal emitted when the physical eject button (if any) of a drive have been pressed. + * @get_name: Returns the name for the given #GDrive. + * @get_icon: Returns a #GIcon for the given #GDrive. + * @has_volumes: Returns %TRUE if the #GDrive has mountable volumes. + * @get_volumes: Returns a list #GList of #GVolume for the #GDrive. + * @is_media_removable: Returns %TRUE if the #GDrive supports removal and insertion of media. + * @has_media: Returns %TRUE if the #GDrive has media inserted. + * @is_media_check_automatic: Returns %TRUE if the #GDrive is capabable of automatically detecting media changes. + * @can_poll_for_media: Returns %TRUE if the #GDrive is capable of manually polling for media change. + * @can_eject: Returns %TRUE if the #GDrive can eject media. + * @eject: Ejects a #GDrive. + * @eject_finish: Finishes an eject operation. + * @poll_for_media: Poll for media insertion/removal on a #GDrive. + * @poll_for_media_finish: Finishes a media poll operation. + * @get_identifier: Returns the identifier of the given kind, or %NULL if + * the #GDrive doesn't have one. + * @enumerate_identifiers: Returns an array strings listing the kinds + * of identifiers which the #GDrive has. + * @get_start_stop_type: Gets a #GDriveStartStopType with details about starting/stopping the drive. Since 2.22. + * @can_stop: Returns %TRUE if a #GDrive can be stopped. Since 2.22. + * @stop: Stops a #GDrive. Since 2.22. + * @stop_finish: Finishes a stop operation. Since 2.22. + * @can_start: Returns %TRUE if a #GDrive can be started. Since 2.22. + * @can_start_degraded: Returns %TRUE if a #GDrive can be started degraded. Since 2.22. + * @start: Starts a #GDrive. Since 2.22. + * @start_finish: Finishes a start operation. Since 2.22. + * @stop_button: Signal emitted when the physical stop button (if any) of a drive have been pressed. Since 2.22. + * @eject_with_operation: Starts ejecting a #GDrive using a #GMountOperation. Since 2.22. + * @eject_with_operation_finish: Finishes an eject operation using a #GMountOperation. Since 2.22. + * + * Interface for creating #GDrive implementations. + */ +typedef struct _GDriveIface GDriveIface; + +struct _GDriveIface +{ + GTypeInterface g_iface; + + /* signals */ + void (* changed) (GDrive *drive); + void (* disconnected) (GDrive *drive); + void (* eject_button) (GDrive *drive); + + /* Virtual Table */ + char * (* get_name) (GDrive *drive); + GIcon * (* get_icon) (GDrive *drive); + gboolean (* has_volumes) (GDrive *drive); + GList * (* get_volumes) (GDrive *drive); + gboolean (* is_media_removable) (GDrive *drive); + gboolean (* has_media) (GDrive *drive); + gboolean (* is_media_check_automatic) (GDrive *drive); + gboolean (* can_eject) (GDrive *drive); + gboolean (* can_poll_for_media) (GDrive *drive); + void (* eject) (GDrive *drive, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_finish) (GDrive *drive, + GAsyncResult *result, + GError **error); + void (* poll_for_media) (GDrive *drive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* poll_for_media_finish) (GDrive *drive, + GAsyncResult *result, + GError **error); + + char * (* get_identifier) (GDrive *drive, + const char *kind); + char ** (* enumerate_identifiers) (GDrive *drive); + + GDriveStartStopType (* get_start_stop_type) (GDrive *drive); + + gboolean (* can_start) (GDrive *drive); + gboolean (* can_start_degraded) (GDrive *drive); + void (* start) (GDrive *drive, + GDriveStartFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* start_finish) (GDrive *drive, + GAsyncResult *result, + GError **error); + + gboolean (* can_stop) (GDrive *drive); + void (* stop) (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* stop_finish) (GDrive *drive, + GAsyncResult *result, + GError **error); + /* signal, not VFunc */ + void (* stop_button) (GDrive *drive); + + void (* eject_with_operation) (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_with_operation_finish) (GDrive *drive, + GAsyncResult *result, + GError **error); +}; + +GType g_drive_get_type (void) G_GNUC_CONST; + +char * g_drive_get_name (GDrive *drive); +GIcon * g_drive_get_icon (GDrive *drive); +gboolean g_drive_has_volumes (GDrive *drive); +GList * g_drive_get_volumes (GDrive *drive); +gboolean g_drive_is_media_removable (GDrive *drive); +gboolean g_drive_has_media (GDrive *drive); +gboolean g_drive_is_media_check_automatic (GDrive *drive); +gboolean g_drive_can_poll_for_media (GDrive *drive); +gboolean g_drive_can_eject (GDrive *drive); +#ifndef G_DISABLE_DEPRECATED +void g_drive_eject (GDrive *drive, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_drive_eject_finish (GDrive *drive, + GAsyncResult *result, + GError **error); +#endif +void g_drive_poll_for_media (GDrive *drive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_drive_poll_for_media_finish (GDrive *drive, + GAsyncResult *result, + GError **error); +char * g_drive_get_identifier (GDrive *drive, + const char *kind); +char ** g_drive_enumerate_identifiers (GDrive *drive); + +GDriveStartStopType g_drive_get_start_stop_type (GDrive *drive); + +gboolean g_drive_can_start (GDrive *drive); +gboolean g_drive_can_start_degraded (GDrive *drive); +void g_drive_start (GDrive *drive, + GDriveStartFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_drive_start_finish (GDrive *drive, + GAsyncResult *result, + GError **error); + +gboolean g_drive_can_stop (GDrive *drive); +void g_drive_stop (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_drive_stop_finish (GDrive *drive, + GAsyncResult *result, + GError **error); + +void g_drive_eject_with_operation (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_drive_eject_with_operation_finish (GDrive *drive, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_DRIVE_H__ */ diff --git a/gio/gdummyfile.c b/gio/gdummyfile.c new file mode 100644 index 0000000..3e28b47 --- /dev/null +++ b/gio/gdummyfile.c @@ -0,0 +1,754 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include "gdummyfile.h" +#include "gfile.h" + +#include "gioalias.h" + +static void g_dummy_file_file_iface_init (GFileIface *iface); + +typedef struct { + char *scheme; + char *userinfo; + char *host; + int port; /* -1 => not in uri */ + char *path; + char *query; + char *fragment; +} GDecodedUri; + +struct _GDummyFile +{ + GObject parent_instance; + + GDecodedUri *decoded_uri; + char *text_uri; +}; + +#define g_dummy_file_get_type _g_dummy_file_get_type +G_DEFINE_TYPE_WITH_CODE (GDummyFile, g_dummy_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_FILE, + g_dummy_file_file_iface_init)) + +#define SUB_DELIM_CHARS "!$&'()*+,;=" + +static char * _g_encode_uri (GDecodedUri *decoded); +static void _g_decoded_uri_free (GDecodedUri *decoded); +static GDecodedUri *_g_decode_uri (const char *uri); +static GDecodedUri *_g_decoded_uri_new (void); + +static char * unescape_string (const gchar *escaped_string, + const gchar *escaped_string_end, + const gchar *illegal_characters); + +static void g_string_append_encoded (GString *string, + const char *encoded, + const char *reserved_chars_allowed); + +static void +g_dummy_file_finalize (GObject *object) +{ + GDummyFile *dummy; + + dummy = G_DUMMY_FILE (object); + + if (dummy->decoded_uri) + _g_decoded_uri_free (dummy->decoded_uri); + + g_free (dummy->text_uri); + + G_OBJECT_CLASS (g_dummy_file_parent_class)->finalize (object); +} + +static void +g_dummy_file_class_init (GDummyFileClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dummy_file_finalize; +} + +static void +g_dummy_file_init (GDummyFile *dummy) +{ +} + +GFile * +_g_dummy_file_new (const char *uri) +{ + GDummyFile *dummy; + + g_return_val_if_fail (uri != NULL, NULL); + + dummy = g_object_new (G_TYPE_DUMMY_FILE, NULL); + dummy->text_uri = g_strdup (uri); + dummy->decoded_uri = _g_decode_uri (uri); + + return G_FILE (dummy); +} + +static gboolean +g_dummy_file_is_native (GFile *file) +{ + return FALSE; +} + +static char * +g_dummy_file_get_basename (GFile *file) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + + if (dummy->decoded_uri) + return g_path_get_basename (dummy->decoded_uri->path); + return g_strdup (dummy->text_uri); +} + +static char * +g_dummy_file_get_path (GFile *file) +{ + return NULL; +} + +static char * +g_dummy_file_get_uri (GFile *file) +{ + return g_strdup (G_DUMMY_FILE (file)->text_uri); +} + +static char * +g_dummy_file_get_parse_name (GFile *file) +{ + return g_strdup (G_DUMMY_FILE (file)->text_uri); +} + +static GFile * +g_dummy_file_get_parent (GFile *file) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + GFile *parent; + char *dirname; + char *uri; + GDecodedUri new_decoded_uri; + + if (dummy->decoded_uri == NULL || + g_strcmp0 (dummy->decoded_uri->path, "/") == 0) + return NULL; + + dirname = g_path_get_dirname (dummy->decoded_uri->path); + + if (strcmp (dirname, ".") == 0) + { + g_free (dirname); + return NULL; + } + + new_decoded_uri = *dummy->decoded_uri; + new_decoded_uri.path = dirname; + uri = _g_encode_uri (&new_decoded_uri); + g_free (dirname); + + parent = _g_dummy_file_new (uri); + g_free (uri); + + return parent; +} + +static GFile * +g_dummy_file_dup (GFile *file) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + + return _g_dummy_file_new (dummy->text_uri); +} + +static guint +g_dummy_file_hash (GFile *file) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + + return g_str_hash (dummy->text_uri); +} + +static gboolean +g_dummy_file_equal (GFile *file1, + GFile *file2) +{ + GDummyFile *dummy1 = G_DUMMY_FILE (file1); + GDummyFile *dummy2 = G_DUMMY_FILE (file2); + + return g_str_equal (dummy1->text_uri, dummy2->text_uri); +} + +static int +safe_strcmp (const char *a, + const char *b) +{ + if (a == NULL) + a = ""; + if (b == NULL) + b = ""; + + return strcmp (a, b); +} + +static gboolean +uri_same_except_path (GDecodedUri *a, + GDecodedUri *b) +{ + if (safe_strcmp (a->scheme, b->scheme) != 0) + return FALSE; + if (safe_strcmp (a->userinfo, b->userinfo) != 0) + return FALSE; + if (safe_strcmp (a->host, b->host) != 0) + return FALSE; + if (a->port != b->port) + return FALSE; + + return TRUE; +} + +static const char * +match_prefix (const char *path, + const char *prefix) +{ + int prefix_len; + + prefix_len = strlen (prefix); + if (strncmp (path, prefix, prefix_len) != 0) + return NULL; + return path + prefix_len; +} + +static gboolean +g_dummy_file_prefix_matches (GFile *parent, GFile *descendant) +{ + GDummyFile *parent_dummy = G_DUMMY_FILE (parent); + GDummyFile *descendant_dummy = G_DUMMY_FILE (descendant); + const char *remainder; + + if (parent_dummy->decoded_uri != NULL && + descendant_dummy->decoded_uri != NULL) + { + if (uri_same_except_path (parent_dummy->decoded_uri, + descendant_dummy->decoded_uri)) + { + remainder = match_prefix (descendant_dummy->decoded_uri->path, + parent_dummy->decoded_uri->path); + if (remainder != NULL && *remainder == '/') + { + while (*remainder == '/') + remainder++; + if (*remainder != 0) + return TRUE; + } + } + } + else + { + remainder = match_prefix (descendant_dummy->text_uri, + parent_dummy->text_uri); + if (remainder != NULL && *remainder == '/') + { + while (*remainder == '/') + remainder++; + if (*remainder != 0) + return TRUE; + } + } + + return FALSE; +} + +static char * +g_dummy_file_get_relative_path (GFile *parent, + GFile *descendant) +{ + GDummyFile *parent_dummy = G_DUMMY_FILE (parent); + GDummyFile *descendant_dummy = G_DUMMY_FILE (descendant); + const char *remainder; + + if (parent_dummy->decoded_uri != NULL && + descendant_dummy->decoded_uri != NULL) + { + if (uri_same_except_path (parent_dummy->decoded_uri, + descendant_dummy->decoded_uri)) + { + remainder = match_prefix (descendant_dummy->decoded_uri->path, + parent_dummy->decoded_uri->path); + if (remainder != NULL && *remainder == '/') + { + while (*remainder == '/') + remainder++; + if (*remainder != 0) + return g_strdup (remainder); + } + } + } + else + { + remainder = match_prefix (descendant_dummy->text_uri, + parent_dummy->text_uri); + if (remainder != NULL && *remainder == '/') + { + while (*remainder == '/') + remainder++; + if (*remainder != 0) + return unescape_string (remainder, NULL, "/"); + } + } + + return NULL; +} + + +static GFile * +g_dummy_file_resolve_relative_path (GFile *file, + const char *relative_path) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + GFile *child; + char *uri; + GDecodedUri new_decoded_uri; + GString *str; + + if (dummy->decoded_uri == NULL) + { + str = g_string_new (dummy->text_uri); + g_string_append (str, "/"); + g_string_append_encoded (str, relative_path, SUB_DELIM_CHARS ":@/"); + child = _g_dummy_file_new (str->str); + g_string_free (str, TRUE); + } + else + { + new_decoded_uri = *dummy->decoded_uri; + + if (g_path_is_absolute (relative_path)) + new_decoded_uri.path = g_strdup (relative_path); + else + new_decoded_uri.path = g_build_filename (new_decoded_uri.path, relative_path, NULL); + + uri = _g_encode_uri (&new_decoded_uri); + g_free (new_decoded_uri.path); + + child = _g_dummy_file_new (uri); + g_free (uri); + } + + return child; +} + +static GFile * +g_dummy_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error) +{ + return g_file_get_child (file, display_name); +} + +static gboolean +g_dummy_file_has_uri_scheme (GFile *file, + const char *uri_scheme) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + + if (dummy->decoded_uri) + return g_ascii_strcasecmp (uri_scheme, dummy->decoded_uri->scheme) == 0; + return FALSE; +} + +static char * +g_dummy_file_get_uri_scheme (GFile *file) +{ + GDummyFile *dummy = G_DUMMY_FILE (file); + + if (dummy->decoded_uri) + return g_strdup (dummy->decoded_uri->scheme); + + return NULL; +} + + +static void +g_dummy_file_file_iface_init (GFileIface *iface) +{ + iface->dup = g_dummy_file_dup; + iface->hash = g_dummy_file_hash; + iface->equal = g_dummy_file_equal; + iface->is_native = g_dummy_file_is_native; + iface->has_uri_scheme = g_dummy_file_has_uri_scheme; + iface->get_uri_scheme = g_dummy_file_get_uri_scheme; + iface->get_basename = g_dummy_file_get_basename; + iface->get_path = g_dummy_file_get_path; + iface->get_uri = g_dummy_file_get_uri; + iface->get_parse_name = g_dummy_file_get_parse_name; + iface->get_parent = g_dummy_file_get_parent; + iface->prefix_matches = g_dummy_file_prefix_matches; + iface->get_relative_path = g_dummy_file_get_relative_path; + iface->resolve_relative_path = g_dummy_file_resolve_relative_path; + iface->get_child_for_display_name = g_dummy_file_get_child_for_display_name; + + iface->supports_thread_contexts = TRUE; +} + +/* Uri handling helper functions: */ + +static int +unescape_character (const char *scanner) +{ + int first_digit; + int second_digit; + + first_digit = g_ascii_xdigit_value (*scanner++); + if (first_digit < 0) + return -1; + + second_digit = g_ascii_xdigit_value (*scanner++); + if (second_digit < 0) + return -1; + + return (first_digit << 4) | second_digit; +} + +static char * +unescape_string (const gchar *escaped_string, + const gchar *escaped_string_end, + const gchar *illegal_characters) +{ + const gchar *in; + gchar *out, *result; + gint character; + + if (escaped_string == NULL) + return NULL; + + if (escaped_string_end == NULL) + escaped_string_end = escaped_string + strlen (escaped_string); + + result = g_malloc (escaped_string_end - escaped_string + 1); + + out = result; + for (in = escaped_string; in < escaped_string_end; in++) + { + character = *in; + if (*in == '%') + { + in++; + if (escaped_string_end - in < 2) + { + g_free (result); + return NULL; + } + + character = unescape_character (in); + + /* Check for an illegal character. We consider '\0' illegal here. */ + if (character <= 0 || + (illegal_characters != NULL && + strchr (illegal_characters, (char)character) != NULL)) + { + g_free (result); + return NULL; + } + in++; /* The other char will be eaten in the loop header */ + } + *out++ = (char)character; + } + + *out = '\0'; + g_warn_if_fail (out - result <= strlen (escaped_string)); + return result; +} + +void +_g_decoded_uri_free (GDecodedUri *decoded) +{ + if (decoded == NULL) + return; + + g_free (decoded->scheme); + g_free (decoded->query); + g_free (decoded->fragment); + g_free (decoded->userinfo); + g_free (decoded->host); + g_free (decoded->path); + g_free (decoded); +} + +GDecodedUri * +_g_decoded_uri_new (void) +{ + GDecodedUri *uri; + + uri = g_new0 (GDecodedUri, 1); + uri->port = -1; + + return uri; +} + +GDecodedUri * +_g_decode_uri (const char *uri) +{ + GDecodedUri *decoded; + const char *p, *in, *hier_part_start, *hier_part_end, *query_start, *fragment_start; + char *out; + char c; + + /* From RFC 3986 Decodes: + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + */ + + p = uri; + + /* Decode scheme: + scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + */ + + if (!g_ascii_isalpha (*p)) + return NULL; + + while (1) + { + c = *p++; + + if (c == ':') + break; + + if (!(g_ascii_isalnum(c) || + c == '+' || + c == '-' || + c == '.')) + return NULL; + } + + decoded = _g_decoded_uri_new (); + + decoded->scheme = g_malloc (p - uri); + out = decoded->scheme; + for (in = uri; in < p - 1; in++) + *out++ = g_ascii_tolower (*in); + *out = 0; + + hier_part_start = p; + + query_start = strchr (p, '?'); + if (query_start) + { + hier_part_end = query_start++; + fragment_start = strchr (query_start, '#'); + if (fragment_start) + { + decoded->query = g_strndup (query_start, fragment_start - query_start); + decoded->fragment = g_strdup (fragment_start+1); + } + else + { + decoded->query = g_strdup (query_start); + decoded->fragment = NULL; + } + } + else + { + /* No query */ + decoded->query = NULL; + fragment_start = strchr (p, '#'); + if (fragment_start) + { + hier_part_end = fragment_start++; + decoded->fragment = g_strdup (fragment_start); + } + else + { + hier_part_end = p + strlen (p); + decoded->fragment = NULL; + } + } + + /* 3: + hier-part = "//" authority path-abempty + / path-absolute + / path-rootless + / path-empty + + */ + + if (hier_part_start[0] == '/' && + hier_part_start[1] == '/') + { + const char *authority_start, *authority_end; + const char *userinfo_start, *userinfo_end; + const char *host_start, *host_end; + const char *port_start; + + authority_start = hier_part_start + 2; + /* authority is always followed by / or nothing */ + authority_end = memchr (authority_start, '/', hier_part_end - authority_start); + if (authority_end == NULL) + authority_end = hier_part_end; + + /* 3.2: + authority = [ userinfo "@" ] host [ ":" port ] + */ + + userinfo_end = memchr (authority_start, '@', authority_end - authority_start); + if (userinfo_end) + { + userinfo_start = authority_start; + decoded->userinfo = unescape_string (userinfo_start, userinfo_end, NULL); + if (decoded->userinfo == NULL) + { + _g_decoded_uri_free (decoded); + return NULL; + } + host_start = userinfo_end + 1; + } + else + host_start = authority_start; + + port_start = memchr (host_start, ':', authority_end - host_start); + if (port_start) + { + host_end = port_start++; + + decoded->port = atoi(port_start); + } + else + { + host_end = authority_end; + decoded->port = -1; + } + + decoded->host = g_strndup (host_start, host_end - host_start); + + hier_part_start = authority_end; + } + + decoded->path = unescape_string (hier_part_start, hier_part_end, "/"); + + if (decoded->path == NULL) + { + _g_decoded_uri_free (decoded); + return NULL; + } + + return decoded; +} + +static gboolean +is_valid (char c, const char *reserved_chars_allowed) +{ + if (g_ascii_isalnum (c) || + c == '-' || + c == '.' || + c == '_' || + c == '~') + return TRUE; + + if (reserved_chars_allowed && + strchr (reserved_chars_allowed, c) != NULL) + return TRUE; + + return FALSE; +} + +static void +g_string_append_encoded (GString *string, + const char *encoded, + const char *reserved_chars_allowed) +{ + unsigned char c; + static const gchar hex[16] = "0123456789ABCDEF"; + + while ((c = *encoded) != 0) + { + if (is_valid (c, reserved_chars_allowed)) + { + g_string_append_c (string, c); + encoded++; + } + else + { + g_string_append_c (string, '%'); + g_string_append_c (string, hex[((guchar)c) >> 4]); + g_string_append_c (string, hex[((guchar)c) & 0xf]); + encoded++; + } + } +} + +static char * +_g_encode_uri (GDecodedUri *decoded) +{ + GString *uri; + + uri = g_string_new (NULL); + + g_string_append (uri, decoded->scheme); + g_string_append (uri, "://"); + + if (decoded->host != NULL) + { + if (decoded->userinfo) + { + /* userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) */ + g_string_append_encoded (uri, decoded->userinfo, SUB_DELIM_CHARS ":"); + g_string_append_c (uri, '@'); + } + + g_string_append (uri, decoded->host); + + if (decoded->port != -1) + { + g_string_append_c (uri, ':'); + g_string_append_printf (uri, "%d", decoded->port); + } + } + + g_string_append_encoded (uri, decoded->path, SUB_DELIM_CHARS ":@/"); + + if (decoded->query) + { + g_string_append_c (uri, '?'); + g_string_append (uri, decoded->query); + } + + if (decoded->fragment) + { + g_string_append_c (uri, '#'); + g_string_append (uri, decoded->fragment); + } + + return g_string_free (uri, FALSE); +} diff --git a/gio/gdummyfile.h b/gio/gdummyfile.h new file mode 100644 index 0000000..791f233 --- /dev/null +++ b/gio/gdummyfile.h @@ -0,0 +1,51 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_DUMMY_FILE_H__ +#define __G_DUMMY_FILE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DUMMY_FILE (_g_dummy_file_get_type ()) +#define G_DUMMY_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DUMMY_FILE, GDummyFile)) +#define G_DUMMY_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DUMMY_FILE, GDummyFileClass)) +#define G_IS_DUMMY_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DUMMY_FILE)) +#define G_IS_DUMMY_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DUMMY_FILE)) +#define G_DUMMY_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DUMMY_FILE, GDummyFileClass)) + +typedef struct _GDummyFile GDummyFile; +typedef struct _GDummyFileClass GDummyFileClass; + +struct _GDummyFileClass +{ + GObjectClass parent_class; +}; + +GType _g_dummy_file_get_type (void) G_GNUC_CONST; + +GFile * _g_dummy_file_new (const char *uri); + +G_END_DECLS + +#endif /* __G_DUMMY_FILE_H__ */ diff --git a/gio/gemblem.c b/gio/gemblem.c new file mode 100644 index 0000000..461fe29 --- /dev/null +++ b/gio/gemblem.c @@ -0,0 +1,363 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Clemens N. Buss + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include "gicon.h" +#include "gemblem.h" +#include "glibintl.h" +#include "gioenums.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include +#include + +#include "gioalias.h" + +/** + * SECTION:gemblem + * @short_description: An object for emblems + * @include: gio/gio.h + * @see_also: #GIcon, #GEmblemedIcon, #GLoadableIcon, #GThemedIcon + * + * #GEmblem is an implementation of #GIcon that supports + * having an emblem, which is an icon with additional properties. + * It can than be added to a #GEmblemedIcon. + * + * Currently, only metainformation about the emblem's origin is + * supported. More may be added in the future. + */ + +static void g_emblem_iface_init (GIconIface *iface); + +struct _GEmblem +{ + GObject parent_instance; + + GIcon *icon; + GEmblemOrigin origin; +}; + +struct _GEmblemClass +{ + GObjectClass parent_class; +}; + +enum +{ + PROP_0_GEMBLEM, + PROP_ICON, + PROP_ORIGIN +}; + +G_DEFINE_TYPE_WITH_CODE (GEmblem, g_emblem, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ICON, g_emblem_iface_init)) + +static void +g_emblem_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GEmblem *emblem = G_EMBLEM (object); + + switch (prop_id) + { + case PROP_ICON: + g_value_set_object (value, emblem->icon); + break; + + case PROP_ORIGIN: + g_value_set_enum (value, emblem->origin); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_emblem_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GEmblem *emblem = G_EMBLEM (object); + + switch (prop_id) + { + case PROP_ICON: + emblem->icon = g_value_dup_object (value); + break; + + case PROP_ORIGIN: + emblem->origin = g_value_get_enum (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_emblem_finalize (GObject *object) +{ + GEmblem *emblem = G_EMBLEM (object); + + g_object_unref (emblem->icon); + + (*G_OBJECT_CLASS (g_emblem_parent_class)->finalize) (object); +} + +static void +g_emblem_class_init (GEmblemClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_emblem_finalize; + gobject_class->set_property = g_emblem_set_property; + gobject_class->get_property = g_emblem_get_property; + + g_object_class_install_property (gobject_class, + PROP_ORIGIN, + g_param_spec_enum ("origin", + P_("GEmblem's origin"), + P_("Tells which origin the emblem is derived from"), + G_TYPE_EMBLEM_ORIGIN, + G_EMBLEM_ORIGIN_UNKNOWN, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_ICON, + g_param_spec_object ("icon", + P_("The icon of the emblem"), + P_("The actual icon of the emblem"), + G_TYPE_OBJECT, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +} + +static void +g_emblem_init (GEmblem *emblem) +{ +} + +/** + * g_emblem_new: + * @icon: a GIcon containing the icon. + * + * Creates a new emblem for @icon. + * + * Returns: a new #GEmblem. + * + * Since: 2.18 + */ +GEmblem * +g_emblem_new (GIcon *icon) +{ + GEmblem* emblem; + + g_return_val_if_fail (icon != NULL, NULL); + g_return_val_if_fail (G_IS_ICON (icon), NULL); + g_return_val_if_fail (!G_IS_EMBLEM (icon), NULL); + + emblem = g_object_new (G_TYPE_EMBLEM, NULL); + emblem->icon = g_object_ref (icon); + emblem->origin = G_EMBLEM_ORIGIN_UNKNOWN; + + return emblem; +} + +/** + * g_emblem_new_with_origin: + * @icon: a GIcon containing the icon. + * @origin: a GEmblemOrigin enum defining the emblem's origin + * + * Creates a new emblem for @icon. + * + * Returns: a new #GEmblem. + * + * Since: 2.18 + */ +GEmblem * +g_emblem_new_with_origin (GIcon *icon, + GEmblemOrigin origin) +{ + GEmblem* emblem; + + g_return_val_if_fail (icon != NULL, NULL); + g_return_val_if_fail (G_IS_ICON (icon), NULL); + g_return_val_if_fail (!G_IS_EMBLEM (icon), NULL); + + emblem = g_object_new (G_TYPE_EMBLEM, NULL); + emblem->icon = g_object_ref (icon); + emblem->origin = origin; + + return emblem; +} + +/** + * g_emblem_get_icon: + * @emblem: a #GEmblem from which the icon should be extracted. + * + * Gives back the icon from @emblem. + * + * Returns: a #GIcon. The returned object belongs to the emblem + * and should not be modified or freed. + * + * Since: 2.18 + */ +GIcon * +g_emblem_get_icon (GEmblem *emblem) +{ + g_return_val_if_fail (G_IS_EMBLEM (emblem), NULL); + + return emblem->icon; +} + + +/** + * g_emblem_get_origin: + * @emblem: a #GEmblem + * + * Gets the origin of the emblem. + * + * Returns: the origin of the emblem + * + * Since: 2.18 + */ +GEmblemOrigin +g_emblem_get_origin (GEmblem *emblem) +{ + g_return_val_if_fail (G_IS_EMBLEM (emblem), G_EMBLEM_ORIGIN_UNKNOWN); + + return emblem->origin; +} + +static guint +g_emblem_hash (GIcon *icon) +{ + GEmblem *emblem = G_EMBLEM (icon); + guint hash; + + hash = g_icon_hash (g_emblem_get_icon (emblem)); + hash ^= emblem->origin; + + return hash; +} + +static gboolean +g_emblem_equal (GIcon *icon1, + GIcon *icon2) +{ + GEmblem *emblem1 = G_EMBLEM (icon1); + GEmblem *emblem2 = G_EMBLEM (icon2); + + return emblem1->origin == emblem2->origin && + g_icon_equal (emblem1->icon, emblem2->icon); +} + +static gboolean +g_emblem_to_tokens (GIcon *icon, + GPtrArray *tokens, + gint *out_version) +{ + GEmblem *emblem = G_EMBLEM (icon); + char *s; + + /* GEmblem are encoded as + * + * + */ + + g_return_val_if_fail (out_version != NULL, FALSE); + + *out_version = 0; + + s = g_icon_to_string (emblem->icon); + if (s == NULL) + return FALSE; + + g_ptr_array_add (tokens, s); + + s = g_strdup_printf ("%d", emblem->origin); + g_ptr_array_add (tokens, s); + + return TRUE; +} + +static GIcon * +g_emblem_from_tokens (gchar **tokens, + gint num_tokens, + gint version, + GError **error) +{ + GEmblem *emblem; + GIcon *icon; + GEmblemOrigin origin; + + emblem = NULL; + + if (version != 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Can't handle version %d of GEmblem encoding"), + version); + return NULL; + } + + if (num_tokens != 2) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Malformed number of tokens (%d) in GEmblem encoding"), + num_tokens); + return NULL; + } + + icon = g_icon_new_for_string (tokens[0], error); + + if (icon == NULL) + return NULL; + + origin = atoi (tokens[1]); + + emblem = g_emblem_new_with_origin (icon, origin); + g_object_unref (icon); + + return G_ICON (emblem); +} + +static void +g_emblem_iface_init (GIconIface *iface) +{ + iface->hash = g_emblem_hash; + iface->equal = g_emblem_equal; + iface->to_tokens = g_emblem_to_tokens; + iface->from_tokens = g_emblem_from_tokens; +} + +#define __G_EMBLEM_C__ +#include "gioaliasdef.c" diff --git a/gio/gemblem.h b/gio/gemblem.h new file mode 100644 index 0000000..06816e1 --- /dev/null +++ b/gio/gemblem.h @@ -0,0 +1,58 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Clemens N. Buss + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_EMBLEM_H__ +#define __G_EMBLEM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_EMBLEM (g_emblem_get_type ()) +#define G_EMBLEM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_EMBLEM, GEmblem)) +#define G_EMBLEM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_EMBLEM, GEmblemClass)) +#define G_IS_EMBLEM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_EMBLEM)) +#define G_IS_EMBLEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_EMBLEM)) +#define G_EMBLEM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_EMBLEM, GEmblemClass)) + +/** + * GEmblem: + * + * An object for Emblems + */ +typedef struct _GEmblem GEmblem; +typedef struct _GEmblemClass GEmblemClass; + +GType g_emblem_get_type (void) G_GNUC_CONST; + +GEmblem *g_emblem_new (GIcon *icon); +GEmblem *g_emblem_new_with_origin (GIcon *icon, + GEmblemOrigin origin); +GIcon *g_emblem_get_icon (GEmblem *emblem); +GEmblemOrigin g_emblem_get_origin (GEmblem *emblem); + +G_END_DECLS + +#endif /* __G_EMBLEM_H__ */ diff --git a/gio/gemblemedicon.c b/gio/gemblemedicon.c new file mode 100644 index 0000000..abfcf0c --- /dev/null +++ b/gio/gemblemedicon.c @@ -0,0 +1,355 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Matthias Clasen + * Clemens N. Buss + */ + +#include + +#include + +#include "gemblemedicon.h" +#include "glibintl.h" +#include "gioerror.h" + +#include "gioalias.h" + +/** + * SECTION:gemblemedicon + * @short_description: Icon with emblems + * @include: gio/gio.h + * @see_also: #GIcon, #GLoadableIcon, #GThemedIcon, #GEmblem + * + * #GEmblemedIcon is an implementation of #GIcon that supports + * adding an emblem to an icon. Adding multiple emblems to an + * icon is ensured via g_emblemed_icon_add_emblem(). + * + * Note that #GEmblemedIcon allows no control over the position + * of the emblems. See also #GEmblem for more information. + **/ + +static void g_emblemed_icon_icon_iface_init (GIconIface *iface); + +struct _GEmblemedIcon +{ + GObject parent_instance; + + GIcon *icon; + GList *emblems; +}; + +struct _GEmblemedIconClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE_WITH_CODE (GEmblemedIcon, g_emblemed_icon, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ICON, + g_emblemed_icon_icon_iface_init)) + + +static void +g_emblemed_icon_finalize (GObject *object) +{ + GEmblemedIcon *emblemed; + + emblemed = G_EMBLEMED_ICON (object); + + g_object_unref (emblemed->icon); + g_list_foreach (emblemed->emblems, (GFunc) g_object_unref, NULL); + g_list_free (emblemed->emblems); + + (*G_OBJECT_CLASS (g_emblemed_icon_parent_class)->finalize) (object); +} + +static void +g_emblemed_icon_class_init (GEmblemedIconClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = g_emblemed_icon_finalize; +} + +static void +g_emblemed_icon_init (GEmblemedIcon *emblemed) +{ +} + +/** + * g_emblemed_icon_new: + * @icon: a #GIcon + * @emblem: a #GEmblem + * + * Creates a new emblemed icon for @icon with the emblem @emblem. + * + * Returns: a new #GIcon + * + * Since: 2.18 + **/ +GIcon * +g_emblemed_icon_new (GIcon *icon, + GEmblem *emblem) +{ + GEmblemedIcon *emblemed; + + g_return_val_if_fail (G_IS_ICON (icon), NULL); + g_return_val_if_fail (!G_IS_EMBLEM (icon), NULL); + g_return_val_if_fail (G_IS_EMBLEM (emblem), NULL); + + emblemed = G_EMBLEMED_ICON (g_object_new (G_TYPE_EMBLEMED_ICON, NULL)); + emblemed->icon = g_object_ref (icon); + + g_emblemed_icon_add_emblem (emblemed, emblem); + + return G_ICON (emblemed); +} + + +/** + * g_emblemed_icon_get_icon: + * @emblemed: a #GEmblemedIcon + * + * Gets the main icon for @emblemed. + * + * Returns: a #GIcon that is owned by @emblemed + * + * Since: 2.18 + **/ +GIcon * +g_emblemed_icon_get_icon (GEmblemedIcon *emblemed) +{ + g_return_val_if_fail (G_IS_EMBLEMED_ICON (emblemed), NULL); + + return emblemed->icon; +} + +/** + * g_emblemed_icon_get_emblems: + * @emblemed: a #GEmblemedIcon + * + * Gets the list of emblems for the @icon. + * + * Returns: a #GList of #GEmblem s that is owned by @emblemed + * + * Since: 2.18 + **/ + +GList * +g_emblemed_icon_get_emblems (GEmblemedIcon *emblemed) +{ + g_return_val_if_fail (G_IS_EMBLEMED_ICON (emblemed), NULL); + + return emblemed->emblems; +} + + +/** + * g_emblemed_icon_add_emblem: + * @emblemed: a #GEmblemedIcon + * @emblem: a #GEmblem + * + * Adds @emblem to the #GList of #GEmblem s. + * + * Since: 2.18 + **/ +void +g_emblemed_icon_add_emblem (GEmblemedIcon *emblemed, + GEmblem *emblem) +{ + g_return_if_fail (G_IS_EMBLEMED_ICON (emblemed)); + g_return_if_fail (G_IS_EMBLEM (emblem)); + + g_object_ref (emblem); + emblemed->emblems = g_list_append (emblemed->emblems, emblem); +} + +static guint +g_emblemed_icon_hash (GIcon *icon) +{ + GEmblemedIcon *emblemed = G_EMBLEMED_ICON (icon); + GList *list; + guint hash = g_icon_hash (emblemed->icon); + + for (list = emblemed->emblems; list != NULL; list = list->next) + hash ^= g_icon_hash (G_ICON (list->data)); + + return hash; +} + +static gint +g_emblem_comp (GEmblem *a, + GEmblem *b) +{ + guint hash_a = g_icon_hash (G_ICON (a)); + guint hash_b = g_icon_hash (G_ICON (b)); + + if(hash_a < hash_b) + return -1; + + if(hash_a == hash_b) + return 0; + + return 1; +} + +static gboolean +g_emblemed_icon_equal (GIcon *icon1, + GIcon *icon2) +{ + GEmblemedIcon *emblemed1 = G_EMBLEMED_ICON (icon1); + GEmblemedIcon *emblemed2 = G_EMBLEMED_ICON (icon2); + GList *list1, *list2; + + if (!g_icon_equal (emblemed1->icon, emblemed2->icon)) + return FALSE; + + list1 = emblemed1->emblems; + list2 = emblemed2->emblems; + + list1 = g_list_sort (list1, (GCompareFunc) g_emblem_comp); + list2 = g_list_sort (list2, (GCompareFunc) g_emblem_comp); + + while (list1 && list2) + { + if (!g_icon_equal (G_ICON (list1->data), G_ICON (list2->data))) + return FALSE; + + list1 = list1->next; + list2 = list2->next; + } + + return list1 == NULL && list2 == NULL; +} + +static gboolean +g_emblemed_icon_to_tokens (GIcon *icon, + GPtrArray *tokens, + gint *out_version) +{ + GEmblemedIcon *emblemed_icon = G_EMBLEMED_ICON (icon); + GList *l; + char *s; + + /* GEmblemedIcons are encoded as + * + * []* + */ + + g_return_val_if_fail (out_version != NULL, FALSE); + + *out_version = 0; + + s = g_icon_to_string (emblemed_icon->icon); + if (s == NULL) + return FALSE; + + g_ptr_array_add (tokens, s); + + for (l = emblemed_icon->emblems; l != NULL; l = l->next) + { + GIcon *emblem_icon = G_ICON (l->data); + + s = g_icon_to_string (emblem_icon); + if (s == NULL) + return FALSE; + + g_ptr_array_add (tokens, s); + } + + return TRUE; +} + +static GIcon * +g_emblemed_icon_from_tokens (gchar **tokens, + gint num_tokens, + gint version, + GError **error) +{ + GEmblemedIcon *emblemed_icon; + int n; + + emblemed_icon = NULL; + + if (version != 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Can't handle version %d of GEmblemedIcon encoding"), + version); + goto fail; + } + + if (num_tokens < 1) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Malformed number of tokens (%d) in GEmblemedIcon encoding"), + num_tokens); + goto fail; + } + + emblemed_icon = g_object_new (G_TYPE_EMBLEMED_ICON, NULL); + emblemed_icon->icon = g_icon_new_for_string (tokens[0], error); + if (emblemed_icon->icon == NULL) + goto fail; + + for (n = 1; n < num_tokens; n++) + { + GIcon *emblem; + + emblem = g_icon_new_for_string (tokens[n], error); + if (emblem == NULL) + goto fail; + + if (!G_IS_EMBLEM (emblem)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Expected a GEmblem for GEmblemedIcon")); + g_object_unref (emblem); + goto fail; + } + + emblemed_icon->emblems = g_list_append (emblemed_icon->emblems, emblem); + } + + return G_ICON (emblemed_icon); + + fail: + if (emblemed_icon != NULL) + g_object_unref (emblemed_icon); + return NULL; +} + +static void +g_emblemed_icon_icon_iface_init (GIconIface *iface) +{ + iface->hash = g_emblemed_icon_hash; + iface->equal = g_emblemed_icon_equal; + iface->to_tokens = g_emblemed_icon_to_tokens; + iface->from_tokens = g_emblemed_icon_from_tokens; +} + +#define __G_EMBLEMED_ICON_C__ +#include "gioaliasdef.c" diff --git a/gio/gemblemedicon.h b/gio/gemblemedicon.h new file mode 100644 index 0000000..7a5dc4d --- /dev/null +++ b/gio/gemblemedicon.h @@ -0,0 +1,62 @@ +/* Gio - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Matthias Clasen + * Clemens N. Buss + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_EMBLEMED_ICON_H__ +#define __G_EMBLEMED_ICON_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_EMBLEMED_ICON (g_emblemed_icon_get_type ()) +#define G_EMBLEMED_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_EMBLEMED_ICON, GEmblemedIcon)) +#define G_EMBLEMED_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_EMBLEMED_ICON, GEmblemedIconClass)) +#define G_IS_EMBLEMED_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_EMBLEMED_ICON)) +#define G_IS_EMBLEMED_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_EMBLEMED_ICON)) +#define G_EMBLEMED_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_EMBLEMED_ICON, GEmblemedIconClass)) + +/** + * GEmblemedIcon: + * + * An implementation of #GIcon for icons with emblems. + **/ +typedef struct _GEmblemedIcon GEmblemedIcon; +typedef struct _GEmblemedIconClass GEmblemedIconClass; + +GType g_emblemed_icon_get_type (void) G_GNUC_CONST; + +GIcon *g_emblemed_icon_new (GIcon *icon, + GEmblem *emblem); +GIcon *g_emblemed_icon_get_icon (GEmblemedIcon *emblemed); +GList *g_emblemed_icon_get_emblems (GEmblemedIcon *emblemed); +void g_emblemed_icon_add_emblem (GEmblemedIcon *emblemed, + GEmblem *emblem); + +G_END_DECLS + +#endif /* __G_EMBLEMED_ICON_H__ */ diff --git a/gio/gfile.c b/gio/gfile.c new file mode 100644 index 0000000..b694ef3 --- /dev/null +++ b/gio/gfile.c @@ -0,0 +1,7230 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#ifdef HAVE_SPLICE +#define _GNU_SOURCE +#include +#include +#include +#include +#endif +#include +#include +#ifdef HAVE_PWD_H +#include +#endif +#include "gfile.h" +#include "gvfs.h" +#include "gioscheduler.h" +#include "gsimpleasyncresult.h" +#include "gfileattribute-priv.h" +#include "gfiledescriptorbased.h" +#include "gpollfilemonitor.h" +#include "gappinfo.h" +#include "gfileinputstream.h" +#include "gfileoutputstream.h" +#include "gcancellable.h" +#include "gasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfile + * @short_description: File and Directory Handling + * @include: gio/gio.h + * @see_also: #GFileInfo, #GFileEnumerator + * + * #GFile is a high level abstraction for manipulating files on a + * virtual file system. #GFiles are lightweight, immutable + * objects that do no I/O upon creation. It is necessary to understand that + * #GFile objects do not represent files, merely an identifier for a file. All + * file content I/O is implemented as streaming operations (see #GInputStream and + * #GOutputStream). + * + * To construct a #GFile, you can use: + * g_file_new_for_path() if you have a path. + * g_file_new_for_uri() if you have a URI. + * g_file_new_for_commandline_arg() for a command line argument. + * g_file_parse_name() from a utf8 string gotten from g_file_get_parse_name(). + * + * One way to think of a #GFile is as an abstraction of a pathname. For normal + * files the system pathname is what is stored internally, but as #GFiles + * are extensible it could also be something else that corresponds to a pathname + * in a userspace implementation of a filesystem. + * + * #GFiles make up hierarchies of directories and files that correspond to the + * files on a filesystem. You can move through the file system with #GFile using + * g_file_get_parent() to get an identifier for the parent directory, g_file_get_child() + * to get a child within a directory, g_file_resolve_relative_path() to resolve a relative + * path between two #GFiles. There can be multiple hierarchies, so you may not + * end up at the same root if you repeatedly call g_file_get_parent() on two different + * files. + * + * All #GFiles have a basename (get with g_file_get_basename()). These names + * are byte strings that are used to identify the file on the filesystem (relative to + * its parent directory) and there is no guarantees that they have any particular charset + * encoding or even make any sense at all. If you want to use filenames in a user + * interface you should use the display name that you can get by requesting the + * %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME attribute with g_file_query_info(). + * This is guaranteed to be in utf8 and can be used in a user interface. But always + * store the real basename or the #GFile to use to actually access the file, because + * there is no way to go from a display name to the actual name. + * + * Using #GFile as an identifier has the same weaknesses as using a path in that + * there may be multiple aliases for the same file. For instance, hard or + * soft links may cause two different #GFiles to refer to the same file. + * Other possible causes for aliases are: case insensitive filesystems, short + * and long names on Fat/NTFS, or bind mounts in Linux. If you want to check if + * two #GFiles point to the same file you can query for the + * %G_FILE_ATTRIBUTE_ID_FILE attribute. Note that #GFile does some trivial + * canonicalization of pathnames passed in, so that trivial differences in the + * path string used at creation (duplicated slashes, slash at end of path, "." + * or ".." path segments, etc) does not create different #GFiles. + * + * Many #GFile operations have both synchronous and asynchronous versions + * to suit your application. Asynchronous versions of synchronous functions + * simply have _async() appended to their function names. The asynchronous + * I/O functions call a #GAsyncReadyCallback which is then used to finalize + * the operation, producing a GAsyncResult which is then passed to the + * function's matching _finish() operation. + * + * Some #GFile operations do not have synchronous analogs, as they may + * take a very long time to finish, and blocking may leave an application + * unusable. Notable cases include: + * g_file_mount_mountable() to mount a mountable file. + * g_file_unmount_mountable_with_operation() to unmount a mountable file. + * g_file_eject_mountable_with_operation() to eject a mountable file. + * + * entity tag + * One notable feature of #GFiles are entity tags, or "etags" for + * short. Entity tags are somewhat like a more abstract version of the + * traditional mtime, and can be used to quickly determine if the file has + * been modified from the version on the file system. See the HTTP 1.1 + * specification + * for HTTP Etag headers, which are a very similar concept. + * + **/ + +static void g_file_real_query_info_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileInfo * g_file_real_query_info_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_query_filesystem_info_async (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileInfo * g_file_real_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_enumerate_children_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileEnumerator * g_file_real_enumerate_children_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_read_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileInputStream * g_file_real_read_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_append_to_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileOutputStream *g_file_real_append_to_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_create_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileOutputStream *g_file_real_create_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_replace_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileOutputStream *g_file_real_replace_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_open_readwrite_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileIOStream * g_file_real_open_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_create_readwrite_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileIOStream * g_file_real_create_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_replace_readwrite_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileIOStream * g_file_real_replace_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +static gboolean g_file_real_set_attributes_from_info (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +static void g_file_real_set_display_name_async (GFile *file, + const char *display_name, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFile * g_file_real_set_display_name_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_set_attributes_async (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_file_real_set_attributes_finish (GFile *file, + GAsyncResult *res, + GFileInfo **info, + GError **error); +static void g_file_real_find_enclosing_mount_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GMount * g_file_real_find_enclosing_mount_finish (GFile *file, + GAsyncResult *res, + GError **error); +static void g_file_real_copy_async (GFile *source, + GFile *destination, + GFileCopyFlags flags, + int io_priority, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_file_real_copy_finish (GFile *file, + GAsyncResult *res, + GError **error); + +typedef GFileIface GFileInterface; +G_DEFINE_INTERFACE (GFile, g_file, G_TYPE_OBJECT) + +static void +g_file_default_init (GFileIface *iface) +{ + iface->enumerate_children_async = g_file_real_enumerate_children_async; + iface->enumerate_children_finish = g_file_real_enumerate_children_finish; + iface->set_display_name_async = g_file_real_set_display_name_async; + iface->set_display_name_finish = g_file_real_set_display_name_finish; + iface->query_info_async = g_file_real_query_info_async; + iface->query_info_finish = g_file_real_query_info_finish; + iface->query_filesystem_info_async = g_file_real_query_filesystem_info_async; + iface->query_filesystem_info_finish = g_file_real_query_filesystem_info_finish; + iface->set_attributes_async = g_file_real_set_attributes_async; + iface->set_attributes_finish = g_file_real_set_attributes_finish; + iface->read_async = g_file_real_read_async; + iface->read_finish = g_file_real_read_finish; + iface->append_to_async = g_file_real_append_to_async; + iface->append_to_finish = g_file_real_append_to_finish; + iface->create_async = g_file_real_create_async; + iface->create_finish = g_file_real_create_finish; + iface->replace_async = g_file_real_replace_async; + iface->replace_finish = g_file_real_replace_finish; + iface->open_readwrite_async = g_file_real_open_readwrite_async; + iface->open_readwrite_finish = g_file_real_open_readwrite_finish; + iface->create_readwrite_async = g_file_real_create_readwrite_async; + iface->create_readwrite_finish = g_file_real_create_readwrite_finish; + iface->replace_readwrite_async = g_file_real_replace_readwrite_async; + iface->replace_readwrite_finish = g_file_real_replace_readwrite_finish; + iface->find_enclosing_mount_async = g_file_real_find_enclosing_mount_async; + iface->find_enclosing_mount_finish = g_file_real_find_enclosing_mount_finish; + iface->set_attributes_from_info = g_file_real_set_attributes_from_info; + iface->copy_async = g_file_real_copy_async; + iface->copy_finish = g_file_real_copy_finish; +} + + +/** + * g_file_is_native: + * @file: input #GFile. + * + * Checks to see if a file is native to the platform. + * + * A native file s one expressed in the platform-native filename format, + * e.g. "C:\Windows" or "/usr/bin/". This does not mean the file is local, + * as it might be on a locally mounted remote filesystem. + * + * On some systems non-native files may be available using + * the native filesystem via a userspace filesystem (FUSE), in + * these cases this call will return %FALSE, but g_file_get_path() + * will still return a native path. + * + * This call does no blocking i/o. + * + * Returns: %TRUE if file is native. + **/ +gboolean +g_file_is_native (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->is_native) (file); +} + + +/** + * g_file_has_uri_scheme: + * @file: input #GFile. + * @uri_scheme: a string containing a URI scheme. + * + * Checks to see if a #GFile has a given URI scheme. + * + * This call does no blocking i/o. + * + * Returns: %TRUE if #GFile's backend supports the + * given URI scheme, %FALSE if URI scheme is %NULL, + * not supported, or #GFile is invalid. + **/ +gboolean +g_file_has_uri_scheme (GFile *file, + const char *uri_scheme) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (uri_scheme != NULL, FALSE); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->has_uri_scheme) (file, uri_scheme); +} + + +/** + * g_file_get_uri_scheme: + * @file: input #GFile. + * + * Gets the URI scheme for a #GFile. + * RFC 3986 decodes the scheme as: + * + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * + * Common schemes include "file", "http", "ftp", etc. + * + * This call does no blocking i/o. + * + * Returns: a string containing the URI scheme for the given + * #GFile. The returned string should be freed with g_free() + * when no longer needed. + **/ +char * +g_file_get_uri_scheme (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_uri_scheme) (file); +} + + +/** + * g_file_get_basename: + * @file: input #GFile. + * + * Gets the base name (the last component of the path) for a given #GFile. + * + * If called for the top level of a system (such as the filesystem root + * or a uri like sftp://host/) it will return a single directory separator + * (and on Windows, possibly a drive letter). + * + * The base name is a byte string (*not* UTF-8). It has no defined encoding + * or rules other than it may not contain zero bytes. If you want to use + * filenames in a user interface you should use the display name that you + * can get by requesting the %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME + * attribute with g_file_query_info(). + * + * This call does no blocking i/o. + * + * Returns: string containing the #GFile's base name, or %NULL + * if given #GFile is invalid. The returned string should be + * freed with g_free() when no longer needed. + **/ +char * +g_file_get_basename (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_basename) (file); +} + +/** + * g_file_get_path: + * @file: input #GFile. + * + * Gets the local pathname for #GFile, if one exists. + * + * This call does no blocking i/o. + * + * Returns: string containing the #GFile's path, or %NULL if + * no such path exists. The returned string should be + * freed with g_free() when no longer needed. + **/ +char * +g_file_get_path (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_path) (file); +} + +/** + * g_file_get_uri: + * @file: input #GFile. + * + * Gets the URI for the @file. + * + * This call does no blocking i/o. + * + * Returns: a string containing the #GFile's URI. + * The returned string should be freed with g_free() when no longer needed. + **/ +char * +g_file_get_uri (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_uri) (file); +} + +/** + * g_file_get_parse_name: + * @file: input #GFile. + * + * Gets the parse name of the @file. + * A parse name is a UTF-8 string that describes the + * file such that one can get the #GFile back using + * g_file_parse_name(). + * + * This is generally used to show the #GFile as a nice + * full-pathname kind of string in a user interface, + * like in a location entry. + * + * For local files with names that can safely be converted + * to UTF8 the pathname is used, otherwise the IRI is used + * (a form of URI that allows UTF8 characters unescaped). + * + * This call does no blocking i/o. + * + * Returns: a string containing the #GFile's parse name. The returned + * string should be freed with g_free() when no longer needed. + **/ +char * +g_file_get_parse_name (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_parse_name) (file); +} + +/** + * g_file_dup: + * @file: input #GFile. + * + * Duplicates a #GFile handle. This operation does not duplicate + * the actual file or directory represented by the #GFile; see + * g_file_copy() if attempting to copy a file. + * + * This call does no blocking i/o. + * + * Returns: a new #GFile that is a duplicate of the given #GFile. + **/ +GFile * +g_file_dup (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->dup) (file); +} + +/** + * g_file_hash: + * @file: #gconstpointer to a #GFile. + * + * Creates a hash value for a #GFile. + * + * This call does no blocking i/o. + * + * Returns: 0 if @file is not a valid #GFile, otherwise an + * integer that can be used as hash value for the #GFile. + * This function is intended for easily hashing a #GFile to + * add to a #GHashTable or similar data structure. + **/ +guint +g_file_hash (gconstpointer file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), 0); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->hash) ((GFile *)file); +} + +/** + * g_file_equal: + * @file1: the first #GFile. + * @file2: the second #GFile. + * + * Checks equality of two given #GFiles. Note that two + * #GFiles that differ can still refer to the same + * file on the filesystem due to various forms of filename + * aliasing. + * + * This call does no blocking i/o. + * + * Returns: %TRUE if @file1 and @file2 are equal. + * %FALSE if either is not a #GFile. + **/ +gboolean +g_file_equal (GFile *file1, + GFile *file2) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file1), FALSE); + g_return_val_if_fail (G_IS_FILE (file2), FALSE); + + if (G_TYPE_FROM_INSTANCE (file1) != G_TYPE_FROM_INSTANCE (file2)) + return FALSE; + + iface = G_FILE_GET_IFACE (file1); + + return (* iface->equal) (file1, file2); +} + + +/** + * g_file_get_parent: + * @file: input #GFile. + * + * Gets the parent directory for the @file. + * If the @file represents the root directory of the + * file system, then %NULL will be returned. + * + * This call does no blocking i/o. + * + * Returns: a #GFile structure to the parent of the given + * #GFile or %NULL if there is no parent. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_get_parent (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_parent) (file); +} + +/** + * g_file_has_parent: + * @file: input #GFile + * @parent: the parent to check for, or %NULL + * + * Checks if @file has a parent, and optionally, if it is @parent. + * + * If @parent is %NULL then this function returns %TRUE if @file has any + * parent at all. If @parent is non-%NULL then %TRUE is only returned + * if @file is a child of @parent. + * + * Returns: %TRUE if @file is a child of @parent (or any parent in the + * case that @parent is %NULL). + * + * Since: 2.24 + **/ +gboolean +g_file_has_parent (GFile *file, + GFile *parent) +{ + GFile *actual_parent; + gboolean result; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (parent == NULL || G_IS_FILE (parent), FALSE); + + actual_parent = g_file_get_parent (file); + + if (actual_parent != NULL) + { + if (parent != NULL) + result = g_file_equal (parent, actual_parent); + else + result = TRUE; + + g_object_unref (actual_parent); + } + else + result = FALSE; + + return result; +} + +/** + * g_file_get_child: + * @file: input #GFile. + * @name: string containing the child's basename. + * + * Gets a child of @file with basename equal to @name. + * + * Note that the file with that specific name might not exist, but + * you can still have a #GFile that points to it. You can use this + * for instance to create that file. + * + * This call does no blocking i/o. + * + * Returns: a #GFile to a child specified by @name. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_get_child (GFile *file, + const char *name) +{ + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (name != NULL, NULL); + + return g_file_resolve_relative_path (file, name); +} + +/** + * g_file_get_child_for_display_name: + * @file: input #GFile. + * @display_name: string to a possible child. + * @error: #GError. + * + * Gets the child of @file for a given @display_name (i.e. a UTF8 + * version of the name). If this function fails, it returns %NULL and @error will be + * set. This is very useful when constructing a GFile for a new file + * and the user entered the filename in the user interface, for instance + * when you select a directory and type a filename in the file selector. + * + * This call does no blocking i/o. + * + * Returns: a #GFile to the specified child, or + * %NULL if the display name couldn't be converted. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (display_name != NULL, NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->get_child_for_display_name) (file, display_name, error); +} + +/** + * g_file_has_prefix: + * @file: input #GFile. + * @prefix: input #GFile. + * + * Checks whether @file has the prefix specified by @prefix. In other word, + * if the names of inital elements of @files pathname match @prefix. + * Only full pathname elements are matched, so a path like /foo is not + * considered a prefix of /foobar, only of /foo/bar. + * + * This call does no i/o, as it works purely on names. As such it can + * sometimes return %FALSE even if @file is inside a @prefix (from a + * filesystem point of view), because the prefix of @file is an alias + * of @prefix. + * + * Returns: %TRUE if the @files's parent, grandparent, etc is @prefix. + * %FALSE otherwise. + **/ +gboolean +g_file_has_prefix (GFile *file, + GFile *prefix) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_FILE (prefix), FALSE); + + if (G_TYPE_FROM_INSTANCE (file) != G_TYPE_FROM_INSTANCE (prefix)) + return FALSE; + + iface = G_FILE_GET_IFACE (file); + + /* The vtable function differs in arg order since we're + using the old contains_file call */ + return (* iface->prefix_matches) (prefix, file); +} + +/** + * g_file_get_relative_path: + * @parent: input #GFile. + * @descendant: input #GFile. + * + * Gets the path for @descendant relative to @parent. + * + * This call does no blocking i/o. + * + * Returns: string with the relative path from @descendant + * to @parent, or %NULL if @descendant doesn't have @parent as prefix. + * The returned string should be freed with g_free() when no longer needed. + **/ +char * +g_file_get_relative_path (GFile *parent, + GFile *descendant) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (parent), NULL); + g_return_val_if_fail (G_IS_FILE (descendant), NULL); + + if (G_TYPE_FROM_INSTANCE (parent) != G_TYPE_FROM_INSTANCE (descendant)) + return NULL; + + iface = G_FILE_GET_IFACE (parent); + + return (* iface->get_relative_path) (parent, descendant); +} + +/** + * g_file_resolve_relative_path: + * @file: input #GFile. + * @relative_path: a given relative path string. + * + * Resolves a relative path for @file to an absolute path. + * + * This call does no blocking i/o. + * + * Returns: #GFile to the resolved path. %NULL if @relative_path + * is %NULL or if @file is invalid. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_resolve_relative_path (GFile *file, + const char *relative_path) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (relative_path != NULL, NULL); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->resolve_relative_path) (file, relative_path); +} + +/** + * g_file_enumerate_children: + * @file: input #GFile. + * @attributes: an attribute query string. + * @flags: a set of #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Gets the requested information about the files in a directory. The result + * is a #GFileEnumerator object that will give out #GFileInfo objects for + * all the files in the directory. + * + * The @attribute value is a string that specifies the file attributes that + * should be gathered. It is not an error if it's not possible to read a particular + * requested attribute from a file - it just won't be set. @attribute should + * be a comma-separated list of attribute or attribute wildcards. The wildcard "*" + * means all attributes, and a wildcard like "standard::*" means all attributes in the standard + * namespace. An example attribute query be "standard::*,owner::user". + * The standard attributes are available as defines, like #G_FILE_ATTRIBUTE_STANDARD_NAME. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. + * If the file is not a directory, the G_FILE_ERROR_NOTDIR error will be returned. + * Other errors are possible too. + * + * Returns: A #GFileEnumerator if successful, %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileEnumerator * +g_file_enumerate_children (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) + +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->enumerate_children == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->enumerate_children) (file, attributes, flags, + cancellable, error); +} + +/** + * g_file_enumerate_children_async: + * @file: input #GFile. + * @attributes: an attribute query string. + * @flags: a set of #GFileQueryInfoFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously gets the requested information about the files in a directory. The result + * is a #GFileEnumerator object that will give out #GFileInfo objects for + * all the files in the directory. + * + * For more details, see g_file_enumerate_children() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_enumerate_children_finish() to get the result of the operation. + **/ +void +g_file_enumerate_children_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->enumerate_children_async) (file, + attributes, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_enumerate_children_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError. + * + * Finishes an async enumerate children operation. + * See g_file_enumerate_children_async(). + * + * Returns: a #GFileEnumerator or %NULL if an error occurred. + * Free the returned object with g_object_unref(). + **/ +GFileEnumerator * +g_file_enumerate_children_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->enumerate_children_finish) (file, res, error); +} + +/** + * g_file_query_exists: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * + * Utility function to check if a particular file exists. This is + * implemented using g_file_query_info() and as such does blocking I/O. + * + * Note that in many cases it is racy to first check for file existence + * and then execute something based on the outcome of that, because the + * file might have been created or removed in between the operations. The + * general approach to handling that is to not check, but just do the + * operation and handle the errors as they come. + * + * As an example of race-free checking, take the case of reading a file, and + * if it doesn't exist, creating it. There are two racy versions: read it, and + * on error create it; and: check if it exists, if not create it. These + * can both result in two processes creating the file (with perhaps a partially + * written file as the result). The correct approach is to always try to create + * the file with g_file_create() which will either atomically create the file + * or fail with a G_IO_ERROR_EXISTS error. + * + * However, in many cases an existence check is useful in a user + * interface, for instance to make a menu item sensitive/insensitive, so that + * you don't have to fool users that something is possible and then just show + * and error dialog. If you do this, you should make sure to also handle the + * errors that can happen due to races when you execute the operation. + * + * Returns: %TRUE if the file exists (and can be detected without error), %FALSE otherwise (or if cancelled). + */ +gboolean +g_file_query_exists (GFile *file, + GCancellable *cancellable) +{ + GFileInfo *info; + + g_return_val_if_fail (G_IS_FILE(file), FALSE); + + info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NONE, cancellable, NULL); + if (info != NULL) + { + g_object_unref (info); + return TRUE; + } + + return FALSE; +} + +/** + * g_file_query_file_type: + * @file: input #GFile. + * @flags: a set of #GFileQueryInfoFlags passed to g_file_query_info(). + * @cancellable: optional #GCancellable object, %NULL to ignore. + * + * Utility function to inspect the #GFileType of a file. This is + * implemented using g_file_query_info() and as such does blocking I/O. + * + * The primary use case of this method is to check if a file is a regular file, + * directory, or symlink. + * + * Returns: The #GFileType of the file and #G_FILE_TYPE_UNKNOWN if the file + * does not exist + * + * Since: 2.18 + */ +GFileType +g_file_query_file_type (GFile *file, + GFileQueryInfoFlags flags, + GCancellable *cancellable) +{ + GFileInfo *info; + GFileType file_type; + + g_return_val_if_fail (G_IS_FILE(file), G_FILE_TYPE_UNKNOWN); + info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, flags, + cancellable, NULL); + if (info != NULL) + { + file_type = g_file_info_get_file_type (info); + g_object_unref (info); + } + else + file_type = G_FILE_TYPE_UNKNOWN; + + return file_type; +} + +/** + * g_file_query_info: + * @file: input #GFile. + * @attributes: an attribute query string. + * @flags: a set of #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError. + * + * Gets the requested information about specified @file. The result + * is a #GFileInfo object that contains key-value attributes (such as + * the type or size of the file). + * + * The @attribute value is a string that specifies the file attributes that + * should be gathered. It is not an error if it's not possible to read a particular + * requested attribute from a file - it just won't be set. @attribute should + * be a comma-separated list of attribute or attribute wildcards. The wildcard "*" + * means all attributes, and a wildcard like "standard::*" means all attributes in the standard + * namespace. An example attribute query be "standard::*,owner::user". + * The standard attributes are available as defines, like #G_FILE_ATTRIBUTE_STANDARD_NAME. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * For symlinks, normally the information about the target of the + * symlink is returned, rather than information about the symlink itself. + * However if you pass #G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS in @flags the + * information about the symlink itself will be returned. Also, for symlinks + * that point to non-existing files the information about the symlink itself + * will be returned. + * + * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. + * Other errors are possible too, and depend on what kind of filesystem the file is on. + * + * Returns: a #GFileInfo for the given @file, or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileInfo * +g_file_query_info (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->query_info == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->query_info) (file, attributes, flags, cancellable, error); +} + +/** + * g_file_query_info_async: + * @file: input #GFile. + * @attributes: an attribute query string. + * @flags: a set of #GFileQueryInfoFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously gets the requested information about specified @file. The result + * is a #GFileInfo object that contains key-value attributes (such as type or size + * for the file). + * + * For more details, see g_file_query_info() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_query_info_finish() to get the result of the operation. + **/ +void +g_file_query_info_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->query_info_async) (file, + attributes, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_query_info_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError. + * + * Finishes an asynchronous file info query. + * See g_file_query_info_async(). + * + * Returns: #GFileInfo for given @file or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileInfo * +g_file_query_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->query_info_finish) (file, res, error); +} + +/** + * g_file_query_filesystem_info: + * @file: input #GFile. + * @attributes: an attribute query string. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError. + * + * Similar to g_file_query_info(), but obtains information + * about the filesystem the @file is on, rather than the file itself. + * For instance the amount of space available and the type of + * the filesystem. + * + * The @attribute value is a string that specifies the file attributes that + * should be gathered. It is not an error if it's not possible to read a particular + * requested attribute from a file - it just won't be set. @attribute should + * be a comma-separated list of attribute or attribute wildcards. The wildcard "*" + * means all attributes, and a wildcard like "fs:*" means all attributes in the fs + * namespace. The standard namespace for filesystem attributes is "fs". + * Common attributes of interest are #G_FILE_ATTRIBUTE_FILESYSTEM_SIZE + * (the total size of the filesystem in bytes), #G_FILE_ATTRIBUTE_FILESYSTEM_FREE (number of + * bytes available), and #G_FILE_ATTRIBUTE_FILESYSTEM_TYPE (type of the filesystem). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. + * Other errors are possible too, and depend on what kind of filesystem the file is on. + * + * Returns: a #GFileInfo or %NULL if there was an error. + * Free the returned object with g_object_unref(). + **/ +GFileInfo * +g_file_query_filesystem_info (GFile *file, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->query_filesystem_info == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->query_filesystem_info) (file, attributes, cancellable, error); +} + +/** + * g_file_query_filesystem_info_async: + * @file: input #GFile. + * @attributes: an attribute query string. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously gets the requested information about the filesystem + * that the specified @file is on. The result is a #GFileInfo object + * that contains key-value attributes (such as type or size for the + * file). + * + * For more details, see g_file_query_filesystem_info() which is the + * synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can + * then call g_file_query_info_finish() to get the result of the + * operation. + **/ +void +g_file_query_filesystem_info_async (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->query_filesystem_info_async) (file, + attributes, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_query_filesystem_info_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError. + * + * Finishes an asynchronous filesystem info query. See + * g_file_query_filesystem_info_async(). + * + * Returns: #GFileInfo for given @file or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileInfo * +g_file_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->query_filesystem_info_finish) (file, res, error); +} + +/** + * g_file_find_enclosing_mount: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError. + * + * Gets a #GMount for the #GFile. + * + * If the #GFileIface for @file does not have a mount (e.g. possibly a + * remote share), @error will be set to %G_IO_ERROR_NOT_FOUND and %NULL + * will be returned. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GMount where the @file is located or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GMount * +g_file_find_enclosing_mount (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + if (iface->find_enclosing_mount == NULL) + { + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + /* Translators: This is an error message when trying to find the + * enclosing (user visible) mount of a file, but none exists. */ + _("Containing mount does not exist")); + return NULL; + } + + return (* iface->find_enclosing_mount) (file, cancellable, error); +} + +/** + * g_file_find_enclosing_mount_async: + * @file: a #GFile + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously gets the mount for the file. + * + * For more details, see g_file_find_enclosing_mount() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_find_enclosing_mount_finish() to get the result of the operation. + */ +void +g_file_find_enclosing_mount_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->find_enclosing_mount_async) (file, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_find_enclosing_mount_finish: + * @file: a #GFile + * @res: a #GAsyncResult + * @error: a #GError + * + * Finishes an asynchronous find mount request. + * See g_file_find_enclosing_mount_async(). + * + * Returns: #GMount for given @file or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GMount * +g_file_find_enclosing_mount_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->find_enclosing_mount_finish) (file, res, error); +} + + +/** + * g_file_read: + * @file: #GFile to read. + * @cancellable: a #GCancellable + * @error: a #GError, or %NULL + * + * Opens a file for reading. The result is a #GFileInputStream that + * can be used to read the contents of the file. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. + * If the file is a directory, the G_IO_ERROR_IS_DIRECTORY error will be returned. + * Other errors are possible too, and depend on what kind of filesystem the file is on. + * + * Returns: #GFileInputStream or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileInputStream * +g_file_read (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->read_fn == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->read_fn) (file, cancellable, error); +} + +/** + * g_file_append_to: + * @file: input #GFile. + * @flags: a set of #GFileCreateFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Gets an output stream for appending data to the file. If + * the file doesn't already exist it is created. + * + * By default files created are generally readable by everyone, + * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file + * will be made readable only to the current user, to the level that + * is supported on the target filesystem. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Some file systems don't allow all file names, and may + * return an %G_IO_ERROR_INVALID_FILENAME error. + * If the file is a directory the %G_IO_ERROR_IS_DIRECTORY error will be + * returned. Other errors are possible too, and depend on what kind of + * filesystem the file is on. + * + * Returns: a #GFileOutputStream, or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileOutputStream * +g_file_append_to (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->append_to == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->append_to) (file, flags, cancellable, error); +} + +/** + * g_file_create: + * @file: input #GFile. + * @flags: a set of #GFileCreateFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Creates a new file and returns an output stream for writing to it. + * The file must not already exist. + * + * By default files created are generally readable by everyone, + * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file + * will be made readable only to the current user, to the level that + * is supported on the target filesystem. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If a file or directory with this name already exists the G_IO_ERROR_EXISTS + * error will be returned. + * Some file systems don't allow all file names, and may + * return an G_IO_ERROR_INVALID_FILENAME error, and if the name + * is to long G_IO_ERROR_FILENAME_TOO_LONG will be returned. + * Other errors are possible too, and depend on what kind of + * filesystem the file is on. + * + * Returns: a #GFileOutputStream for the newly created file, or + * %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileOutputStream * +g_file_create (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->create == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->create) (file, flags, cancellable, error); +} + +/** + * g_file_replace: + * @file: input #GFile. + * @etag: an optional entity tag for the + * current #GFile, or #NULL to ignore. + * @make_backup: %TRUE if a backup should be created. + * @flags: a set of #GFileCreateFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Returns an output stream for overwriting the file, possibly + * creating a backup copy of the file first. If the file doesn't exist, + * it will be created. + * + * This will try to replace the file in the safest way possible so + * that any errors during the writing will not affect an already + * existing copy of the file. For instance, for local files it + * may write to a temporary file and then atomically rename over + * the destination when the stream is closed. + * + * By default files created are generally readable by everyone, + * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file + * will be made readable only to the current user, to the level that + * is supported on the target filesystem. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If you pass in a non-#NULL @etag value, then this value is + * compared to the current entity tag of the file, and if they differ + * an G_IO_ERROR_WRONG_ETAG error is returned. This generally means + * that the file has been changed since you last read it. You can get + * the new etag from g_file_output_stream_get_etag() after you've + * finished writing and closed the #GFileOutputStream. When you load + * a new file you can use g_file_input_stream_query_info() to get + * the etag of the file. + * + * If @make_backup is %TRUE, this function will attempt to make a backup + * of the current file before overwriting it. If this fails a G_IO_ERROR_CANT_CREATE_BACKUP + * error will be returned. If you want to replace anyway, try again with + * @make_backup set to %FALSE. + * + * If the file is a directory the G_IO_ERROR_IS_DIRECTORY error will be returned, + * and if the file is some other form of non-regular file then a + * G_IO_ERROR_NOT_REGULAR_FILE error will be returned. + * Some file systems don't allow all file names, and may + * return an G_IO_ERROR_INVALID_FILENAME error, and if the name + * is to long G_IO_ERROR_FILENAME_TOO_LONG will be returned. + * Other errors are possible too, and depend on what kind of + * filesystem the file is on. + * + * Returns: a #GFileOutputStream or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileOutputStream * +g_file_replace (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->replace == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + + /* Handle empty tag string as NULL in consistent way. */ + if (etag && *etag == 0) + etag = NULL; + + return (* iface->replace) (file, etag, make_backup, flags, cancellable, error); +} + +/** + * g_file_open_readwrite: + * @file: #GFile to open + * @cancellable: a #GCancellable + * @error: a #GError, or %NULL + * + * Opens an existing file for reading and writing. The result is + * a #GFileIOStream that can be used to read and write the contents of the file. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If the file does not exist, the G_IO_ERROR_NOT_FOUND error will be returned. + * If the file is a directory, the G_IO_ERROR_IS_DIRECTORY error will be returned. + * Other errors are possible too, and depend on what kind of filesystem the file is on. + * Note that in many non-local file cases read and write streams are not supported, + * so make sure you really need to do read and write streaming, rather than + * just opening for reading or writing. + * + * Returns: #GFileIOStream or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + **/ +GFileIOStream * +g_file_open_readwrite (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->open_readwrite == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->open_readwrite) (file, cancellable, error); +} + +/** + * g_file_create_readwrite: + * @file: a #GFile + * @flags: a set of #GFileCreateFlags + * @cancellable: optional #GCancellable object, %NULL to ignore + * @error: return location for a #GError, or %NULL + * + * Creates a new file and returns a stream for reading and writing to it. + * The file must not already exist. + * + * By default files created are generally readable by everyone, + * but if you pass #G_FILE_CREATE_PRIVATE in @flags the file + * will be made readable only to the current user, to the level that + * is supported on the target filesystem. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If a file or directory with this name already exists the %G_IO_ERROR_EXISTS + * error will be returned. Some file systems don't allow all file names, + * and may return an %G_IO_ERROR_INVALID_FILENAME error, and if the name + * is too long, %G_IO_ERROR_FILENAME_TOO_LONG will be returned. Other errors + * are possible too, and depend on what kind of filesystem the file is on. + * + * Note that in many non-local file cases read and write streams are not + * supported, so make sure you really need to do read and write streaming, + * rather than just opening for reading or writing. + * + * Returns: a #GFileIOStream for the newly created file, or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GFileIOStream * +g_file_create_readwrite (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->create_readwrite == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->create_readwrite) (file, flags, cancellable, error); +} + +/** + * g_file_replace_readwrite: + * @file: a #GFile + * @etag: an optional entity tag for the + * current #GFile, or #NULL to ignore + * @make_backup: %TRUE if a backup should be created + * @flags: a set of #GFileCreateFlags + * @cancellable: optional #GCancellable object, %NULL to ignore + * @error: return location for a #GError, or %NULL + * + * Returns an output stream for overwriting the file in readwrite mode, + * possibly creating a backup copy of the file first. If the file doesn't + * exist, it will be created. + * + * For details about the behaviour, see g_file_replace() which does the same + * thing but returns an output stream only. + * + * Note that in many non-local file cases read and write streams are not + * supported, so make sure you really need to do read and write streaming, + * rather than just opening for reading or writing. + * + * Returns: a #GFileIOStream or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GFileIOStream * +g_file_replace_readwrite (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->replace_readwrite == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->replace_readwrite) (file, etag, make_backup, flags, cancellable, error); +} + +/** + * g_file_read_async: + * @file: input #GFile + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously opens @file for reading. + * + * For more details, see g_file_read() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_read_finish() to get the result of the operation. + **/ +void +g_file_read_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->read_async) (file, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_read_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file read operation started with + * g_file_read_async(). + * + * Returns: a #GFileInputStream or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileInputStream * +g_file_read_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->read_finish) (file, res, error); +} + +/** + * g_file_append_to_async: + * @file: input #GFile. + * @flags: a set of #GFileCreateFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously opens @file for appending. + * + * For more details, see g_file_append_to() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_append_to_finish() to get the result of the operation. + **/ +void +g_file_append_to_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->append_to_async) (file, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_append_to_finish: + * @file: input #GFile. + * @res: #GAsyncResult + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file append operation started with + * g_file_append_to_async(). + * + * Returns: a valid #GFileOutputStream or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileOutputStream * +g_file_append_to_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->append_to_finish) (file, res, error); +} + +/** + * g_file_create_async: + * @file: input #GFile. + * @flags: a set of #GFileCreateFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously creates a new file and returns an output stream for writing to it. + * The file must not already exist. + * + * For more details, see g_file_create() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_create_finish() to get the result of the operation. + **/ +void +g_file_create_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->create_async) (file, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_create_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file create operation started with + * g_file_create_async(). + * + * Returns: a #GFileOutputStream or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileOutputStream * +g_file_create_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->create_finish) (file, res, error); +} + +/** + * g_file_replace_async: + * @file: input #GFile. + * @etag: an entity tag for the + * current #GFile, or NULL to ignore. + * @make_backup: %TRUE if a backup should be created. + * @flags: a set of #GFileCreateFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously overwrites the file, replacing the contents, possibly + * creating a backup copy of the file first. + * + * For more details, see g_file_replace() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_replace_finish() to get the result of the operation. + **/ +void +g_file_replace_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->replace_async) (file, + etag, + make_backup, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_replace_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file replace operation started with + * g_file_replace_async(). + * + * Returns: a #GFileOutputStream, or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileOutputStream * +g_file_replace_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->replace_finish) (file, res, error); +} + + +/** + * g_file_open_readwrite_async: + * @file: input #GFile. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously opens @file for reading and writing. + * + * For more details, see g_file_open_readwrite() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_open_readwrite_finish() to get the result of the operation. + * + * Since: 2.22 + **/ +void +g_file_open_readwrite_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->open_readwrite_async) (file, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_open_readwrite_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file read operation started with + * g_file_open_readwrite_async(). + * + * Returns: a #GFileIOStream or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + **/ +GFileIOStream * +g_file_open_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->open_readwrite_finish) (file, res, error); +} + + +/** + * g_file_create_readwrite_async: + * @file: input #GFile + * @flags: a set of #GFileCreateFlags + * @io_priority: the I/O priority + * of the request + * @cancellable: optional #GCancellable object, %NULL to ignore + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously creates a new file and returns a stream for reading and + * writing to it. The file must not already exist. + * + * For more details, see g_file_create_readwrite() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then + * call g_file_create_readwrite_finish() to get the result of the operation. + * + * Since: 2.22 + */ +void +g_file_create_readwrite_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->create_readwrite_async) (file, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_create_readwrite_finish: + * @file: input #GFile + * @res: a #GAsyncResult + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file create operation started with + * g_file_create_readwrite_async(). + * + * Returns: a #GFileIOStream or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + **/ +GFileIOStream * +g_file_create_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->create_readwrite_finish) (file, res, error); +} + +/** + * g_file_replace_readwrite_async: + * @file: input #GFile. + * @etag: an entity tag for the + * current #GFile, or NULL to ignore. + * @make_backup: %TRUE if a backup should be created. + * @flags: a set of #GFileCreateFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously overwrites the file in read-write mode, replacing the + * contents, possibly creating a backup copy of the file first. + * + * For more details, see g_file_replace_readwrite() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then + * call g_file_replace_readwrite_finish() to get the result of the operation. + * + * Since: 2.22 + */ +void +g_file_replace_readwrite_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + (* iface->replace_readwrite_async) (file, + etag, + make_backup, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_replace_readwrite_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous file replace operation started with + * g_file_replace_readwrite_async(). + * + * Returns: a #GFileIOStream, or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GFileIOStream * +g_file_replace_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->replace_readwrite_finish) (file, res, error); +} + +static gboolean +copy_symlink (GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + const char *target, + GError **error) +{ + GError *my_error; + gboolean tried_delete; + GFileInfo *info; + GFileType file_type; + + tried_delete = FALSE; + + retry: + my_error = NULL; + if (!g_file_make_symbolic_link (destination, target, cancellable, &my_error)) + { + /* Maybe it already existed, and we want to overwrite? */ + if (!tried_delete && (flags & G_FILE_COPY_OVERWRITE) && + my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_EXISTS) + { + g_error_free (my_error); + + + /* Don't overwrite if the destination is a directory */ + info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + cancellable, &my_error); + if (info != NULL) + { + file_type = g_file_info_get_file_type (info); + g_object_unref (info); + + if (file_type == G_FILE_TYPE_DIRECTORY) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY, + _("Can't copy over directory")); + return FALSE; + } + } + + if (!g_file_delete (destination, cancellable, error)) + return FALSE; + + tried_delete = TRUE; + goto retry; + } + /* Nah, fail */ + g_propagate_error (error, my_error); + return FALSE; + } + + return TRUE; +} + +static GInputStream * +open_source_for_copy (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GError **error) +{ + GError *my_error; + GInputStream *in; + GFileInfo *info; + GFileType file_type; + + my_error = NULL; + in = (GInputStream *)g_file_read (source, cancellable, &my_error); + if (in != NULL) + return in; + + /* There was an error opening the source, try to set a good error for it: */ + + if (my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_IS_DIRECTORY) + { + /* The source is a directory, don't fail with WOULD_RECURSE immediately, + * as that is less useful to the app. Better check for errors on the + * target instead. + */ + g_error_free (my_error); + my_error = NULL; + + info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + cancellable, &my_error); + if (info != NULL) + { + file_type = g_file_info_get_file_type (info); + g_object_unref (info); + + if (flags & G_FILE_COPY_OVERWRITE) + { + if (file_type == G_FILE_TYPE_DIRECTORY) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_MERGE, + _("Can't copy directory over directory")); + return NULL; + } + /* continue to would_recurse error */ + } + else + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_EXISTS, + _("Target file exists")); + return NULL; + } + } + else + { + /* Error getting info from target, return that error + * (except for NOT_FOUND, which is no error here) + */ + if (my_error->domain != G_IO_ERROR && my_error->code != G_IO_ERROR_NOT_FOUND) + { + g_propagate_error (error, my_error); + return NULL; + } + g_error_free (my_error); + } + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE, + _("Can't recursively copy directory")); + return NULL; + } + + g_propagate_error (error, my_error); + return NULL; +} + +static gboolean +should_copy (GFileAttributeInfo *info, + gboolean as_move, + gboolean skip_perms) +{ + if (skip_perms && strcmp(info->name, "unix::mode") == 0) + return FALSE; + + if (as_move) + return info->flags & G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED; + return info->flags & G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE; +} + +static char * +build_attribute_list_for_copy (GFileAttributeInfoList *attributes, + GFileAttributeInfoList *namespaces, + gboolean as_move, + gboolean skip_perms) +{ + GString *s; + gboolean first; + int i; + + first = TRUE; + s = g_string_new (""); + + if (attributes) + { + for (i = 0; i < attributes->n_infos; i++) + { + if (should_copy (&attributes->infos[i], as_move, skip_perms)) + { + if (first) + first = FALSE; + else + g_string_append_c (s, ','); + + g_string_append (s, attributes->infos[i].name); + } + } + } + + if (namespaces) + { + for (i = 0; i < namespaces->n_infos; i++) + { + if (should_copy (&namespaces->infos[i], as_move, FALSE)) + { + if (first) + first = FALSE; + else + g_string_append_c (s, ','); + + g_string_append (s, namespaces->infos[i].name); + g_string_append (s, "::*"); + } + } + } + + return g_string_free (s, FALSE); +} + +/** + * g_file_copy_attributes: + * @source: a #GFile with attributes. + * @destination: a #GFile to copy attributes to. + * @flags: a set of #GFileCopyFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Copies the file attributes from @source to @destination. + * + * Normally only a subset of the file attributes are copied, + * those that are copies in a normal file copy operation + * (which for instance does not include e.g. owner). However + * if #G_FILE_COPY_ALL_METADATA is specified in @flags, then + * all the metadata that is possible to copy is copied. This + * is useful when implementing move by copy + delete source. + * + * Returns: %TRUE if the attributes were copied successfully, %FALSE otherwise. + **/ +gboolean +g_file_copy_attributes (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileAttributeInfoList *attributes, *namespaces; + char *attrs_to_read; + gboolean res; + GFileInfo *info; + gboolean as_move; + gboolean source_nofollow_symlinks; + gboolean skip_perms; + + as_move = flags & G_FILE_COPY_ALL_METADATA; + source_nofollow_symlinks = flags & G_FILE_COPY_NOFOLLOW_SYMLINKS; + skip_perms = (flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) != 0; + + /* Ignore errors here, if the target supports no attributes there is nothing to copy */ + attributes = g_file_query_settable_attributes (destination, cancellable, NULL); + namespaces = g_file_query_writable_namespaces (destination, cancellable, NULL); + + if (attributes == NULL && namespaces == NULL) + return TRUE; + + attrs_to_read = build_attribute_list_for_copy (attributes, namespaces, as_move, skip_perms); + + /* Ignore errors here, if we can't read some info (e.g. if it doesn't exist) + * we just don't copy it. + */ + info = g_file_query_info (source, attrs_to_read, + source_nofollow_symlinks ? G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS:0, + cancellable, + NULL); + + g_free (attrs_to_read); + + res = TRUE; + if (info) + { + res = g_file_set_attributes_from_info (destination, + info, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + cancellable, + error); + g_object_unref (info); + } + + g_file_attribute_info_list_unref (attributes); + g_file_attribute_info_list_unref (namespaces); + + return res; +} + +static gboolean +copy_stream_with_progress (GInputStream *in, + GOutputStream *out, + GFile *source, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + gssize n_read, n_written; + goffset current_size; + char buffer[1024*64], *p; + gboolean res; + goffset total_size; + GFileInfo *info; + + total_size = -1; + /* avoid performance impact of querying total size when it's not needed */ + if (progress_callback) + { + info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (in), + G_FILE_ATTRIBUTE_STANDARD_SIZE, + cancellable, NULL); + if (info) + { + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) + total_size = g_file_info_get_size (info); + g_object_unref (info); + } + + if (total_size == -1) + { + info = g_file_query_info (source, + G_FILE_ATTRIBUTE_STANDARD_SIZE, + G_FILE_QUERY_INFO_NONE, + cancellable, NULL); + if (info) + { + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) + total_size = g_file_info_get_size (info); + g_object_unref (info); + } + } + } + + if (total_size == -1) + total_size = 0; + + current_size = 0; + res = TRUE; + while (TRUE) + { + n_read = g_input_stream_read (in, buffer, sizeof (buffer), cancellable, error); + if (n_read == -1) + { + res = FALSE; + break; + } + + if (n_read == 0) + break; + + current_size += n_read; + + p = buffer; + while (n_read > 0) + { + n_written = g_output_stream_write (out, p, n_read, cancellable, error); + if (n_written == -1) + { + res = FALSE; + break; + } + + p += n_written; + n_read -= n_written; + } + + if (!res) + break; + + if (progress_callback) + progress_callback (current_size, total_size, progress_callback_data); + } + + /* Make sure we send full copied size */ + if (progress_callback) + progress_callback (current_size, total_size, progress_callback_data); + + return res; +} + +#ifdef HAVE_SPLICE + +static gboolean +do_splice (int fd_in, + loff_t *off_in, + int fd_out, + loff_t *off_out, + size_t len, + long *bytes_transferd, + GError **error) +{ + long result; + +retry: + result = splice (fd_in, off_in, fd_out, off_out, len, SPLICE_F_MORE); + + if (result == -1) + { + int errsv = errno; + + if (errsv == EINTR) + goto retry; + else if (errsv == ENOSYS || errsv == EINVAL) + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Splice not supported")); + else + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error splicing file: %s"), + g_strerror (errsv)); + + return FALSE; + } + + *bytes_transferd = result; + return TRUE; +} + +static gboolean +splice_stream_with_progress (GInputStream *in, + GOutputStream *out, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + int buffer[2]; + gboolean res; + goffset total_size; + loff_t offset_in; + loff_t offset_out; + int fd_in, fd_out; + + fd_in = g_file_descriptor_based_get_fd (G_FILE_DESCRIPTOR_BASED (in)); + fd_out = g_file_descriptor_based_get_fd (G_FILE_DESCRIPTOR_BASED (out)); + + if (pipe (buffer) != 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Pipe creation failed"); + return FALSE; + } + + total_size = -1; + /* avoid performance impact of querying total size when it's not needed */ + if (progress_callback) + { + struct stat sbuf; + + if (fstat (fd_in, &sbuf) == 0) + total_size = sbuf.st_size; + } + + if (total_size == -1) + total_size = 0; + + offset_in = offset_out = 0; + res = FALSE; + while (TRUE) + { + long n_read; + long n_written; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + break; + + if (!do_splice (fd_in, &offset_in, buffer[1], NULL, 1024*64, &n_read, error)) + break; + + if (n_read == 0) + { + res = TRUE; + break; + } + + while (n_read > 0) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto out; + + if (!do_splice (buffer[0], NULL, fd_out, &offset_out, n_read, &n_written, error)) + goto out; + + n_read -= n_written; + } + + if (progress_callback) + progress_callback (offset_in, total_size, progress_callback_data); + } + + /* Make sure we send full copied size */ + if (progress_callback) + progress_callback (offset_in, total_size, progress_callback_data); + + out: + close (buffer[0]); + close (buffer[1]); + + return res; +} +#endif + +static gboolean +file_copy_fallback (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + GInputStream *in; + GOutputStream *out; + GFileInfo *info; + const char *target; + gboolean result; +#ifdef HAVE_SPLICE + gboolean fallback = TRUE; +#endif + + /* need to know the file type */ + info = g_file_query_info (source, + G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + cancellable, + error); + + if (info == NULL) + return FALSE; + + /* Maybe copy the symlink? */ + if ((flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) && + g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK) + { + target = g_file_info_get_symlink_target (info); + if (target) + { + if (!copy_symlink (destination, flags, cancellable, target, error)) + { + g_object_unref (info); + return FALSE; + } + + g_object_unref (info); + goto copied_file; + } + /* ... else fall back on a regular file copy */ + g_object_unref (info); + } + /* Handle "special" files (pipes, device nodes, ...)? */ + else if (g_file_info_get_file_type (info) == G_FILE_TYPE_SPECIAL) + { + /* FIXME: could try to recreate device nodes and others? */ + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Can't copy special file")); + g_object_unref (info); + return FALSE; + } + /* Everything else should just fall back on a regular copy. */ + else + g_object_unref (info); + + in = open_source_for_copy (source, destination, flags, cancellable, error); + if (in == NULL) + return FALSE; + + if (flags & G_FILE_COPY_OVERWRITE) + { + out = (GOutputStream *)g_file_replace (destination, + NULL, + flags & G_FILE_COPY_BACKUP, + G_FILE_CREATE_REPLACE_DESTINATION, + cancellable, error); + } + else + { + out = (GOutputStream *)g_file_create (destination, 0, cancellable, error); + } + + if (out == NULL) + { + g_object_unref (in); + return FALSE; + } + +#ifdef HAVE_SPLICE + if (G_IS_FILE_DESCRIPTOR_BASED (in) && G_IS_FILE_DESCRIPTOR_BASED (out)) + { + GError *splice_err = NULL; + + result = splice_stream_with_progress (in, out, cancellable, + progress_callback, progress_callback_data, + &splice_err); + + if (result || !g_error_matches (splice_err, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) + { + fallback = FALSE; + if (!result) + g_propagate_error (error, splice_err); + } + else + g_clear_error (&splice_err); + } + + if (fallback) +#endif + result = copy_stream_with_progress (in, out, source, cancellable, + progress_callback, progress_callback_data, + error); + + /* Don't care about errors in source here */ + g_input_stream_close (in, cancellable, NULL); + + /* But write errors on close are bad! */ + if (!g_output_stream_close (out, cancellable, result ? error : NULL)) + result = FALSE; + + g_object_unref (in); + g_object_unref (out); + + if (result == FALSE) + return FALSE; + + copied_file: + /* Ignore errors here. Failure to copy metadata is not a hard error */ + g_file_copy_attributes (source, destination, + flags, cancellable, NULL); + + return TRUE; +} + +/** + * g_file_copy: + * @source: input #GFile. + * @destination: destination #GFile + * @flags: set of #GFileCopyFlags + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @progress_callback: function to callback with progress information + * @progress_callback_data: user data to pass to @progress_callback + * @error: #GError to set on error, or %NULL + * + * Copies the file @source to the location specified by @destination. + * Can not handle recursive copies of directories. + * + * If the flag #G_FILE_COPY_OVERWRITE is specified an already + * existing @destination file is overwritten. + * + * If the flag #G_FILE_COPY_NOFOLLOW_SYMLINKS is specified then symlinks + * will be copied as symlinks, otherwise the target of the + * @source symlink will be copied. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If @progress_callback is not %NULL, then the operation can be monitored by + * setting this to a #GFileProgressCallback function. @progress_callback_data + * will be passed to this function. It is guaranteed that this callback will + * be called after all data has been transferred with the total number of bytes + * copied during the operation. + * + * If the @source file does not exist then the G_IO_ERROR_NOT_FOUND + * error is returned, independent on the status of the @destination. + * + * If #G_FILE_COPY_OVERWRITE is not specified and the target exists, then the + * error G_IO_ERROR_EXISTS is returned. + * + * If trying to overwrite a file over a directory the G_IO_ERROR_IS_DIRECTORY + * error is returned. If trying to overwrite a directory with a directory the + * G_IO_ERROR_WOULD_MERGE error is returned. + * + * If the source is a directory and the target does not exist, or #G_FILE_COPY_OVERWRITE is + * specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error + * is returned. + * + * If you are interested in copying the #GFile object itself (not the on-disk + * file), see g_file_dup(). + * + * Returns: %TRUE on success, %FALSE otherwise. + **/ +gboolean +g_file_copy (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + GFileIface *iface; + GError *my_error; + gboolean res; + + g_return_val_if_fail (G_IS_FILE (source), FALSE); + g_return_val_if_fail (G_IS_FILE (destination), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (destination); + if (iface->copy) + { + my_error = NULL; + res = (* iface->copy) (source, destination, + flags, cancellable, + progress_callback, progress_callback_data, + &my_error); + + if (res) + return TRUE; + + if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) + { + g_propagate_error (error, my_error); + return FALSE; + } + else + g_clear_error (&my_error); + } + + /* If the types are different, and the destination method failed + also try the source method */ + if (G_OBJECT_TYPE (source) != G_OBJECT_TYPE (destination)) + { + iface = G_FILE_GET_IFACE (source); + + if (iface->copy) + { + my_error = NULL; + res = (* iface->copy) (source, destination, + flags, cancellable, + progress_callback, progress_callback_data, + &my_error); + + if (res) + return TRUE; + + if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) + { + g_propagate_error (error, my_error); + return FALSE; + } + else + g_clear_error (&my_error); + } + } + + return file_copy_fallback (source, destination, flags, cancellable, + progress_callback, progress_callback_data, + error); +} + +/** + * g_file_copy_async: + * @source: input #GFile. + * @destination: destination #GFile + * @flags: set of #GFileCopyFlags + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @progress_callback: function to callback with progress information + * @progress_callback_data: user data to pass to @progress_callback + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Copies the file @source to the location specified by @destination + * asynchronously. For details of the behaviour, see g_file_copy(). + * + * If @progress_callback is not %NULL, then that function that will be called + * just like in g_file_copy(), however the callback will run in the main loop, + * not in the thread that is doing the I/O operation. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_copy_finish() to get the result of the operation. + **/ +void +g_file_copy_async (GFile *source, + GFile *destination, + GFileCopyFlags flags, + int io_priority, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (source)); + g_return_if_fail (G_IS_FILE (destination)); + + iface = G_FILE_GET_IFACE (source); + (* iface->copy_async) (source, + destination, + flags, + io_priority, + cancellable, + progress_callback, + progress_callback_data, + callback, + user_data); +} + +/** + * g_file_copy_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes copying the file started with + * g_file_copy_async(). + * + * Returns: a %TRUE on success, %FALSE on error. + **/ +gboolean +g_file_copy_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->copy_finish) (file, res, error); +} + +/** + * g_file_move: + * @source: #GFile pointing to the source location. + * @destination: #GFile pointing to the destination location. + * @flags: set of #GFileCopyFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @progress_callback: #GFileProgressCallback function for updates. + * @progress_callback_data: gpointer to user data for the callback function. + * @error: #GError for returning error conditions, or %NULL + * + * + * Tries to move the file or directory @source to the location specified by @destination. + * If native move operations are supported then this is used, otherwise a copy + delete + * fallback is used. The native implementation may support moving directories (for instance + * on moves inside the same filesystem), but the fallback code does not. + * + * If the flag #G_FILE_COPY_OVERWRITE is specified an already + * existing @destination file is overwritten. + * + * If the flag #G_FILE_COPY_NOFOLLOW_SYMLINKS is specified then symlinks + * will be copied as symlinks, otherwise the target of the + * @source symlink will be copied. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If @progress_callback is not %NULL, then the operation can be monitored by + * setting this to a #GFileProgressCallback function. @progress_callback_data + * will be passed to this function. It is guaranteed that this callback will + * be called after all data has been transferred with the total number of bytes + * copied during the operation. + * + * If the @source file does not exist then the G_IO_ERROR_NOT_FOUND + * error is returned, independent on the status of the @destination. + * + * If #G_FILE_COPY_OVERWRITE is not specified and the target exists, then the + * error G_IO_ERROR_EXISTS is returned. + * + * If trying to overwrite a file over a directory the G_IO_ERROR_IS_DIRECTORY + * error is returned. If trying to overwrite a directory with a directory the + * G_IO_ERROR_WOULD_MERGE error is returned. + * + * If the source is a directory and the target does not exist, or #G_FILE_COPY_OVERWRITE is + * specified and the target is a file, then the G_IO_ERROR_WOULD_RECURSE error + * may be returned (if the native move operation isn't available). + * + * Returns: %TRUE on successful move, %FALSE otherwise. + **/ +gboolean +g_file_move (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + GFileIface *iface; + GError *my_error; + gboolean res; + + g_return_val_if_fail (G_IS_FILE (source), FALSE); + g_return_val_if_fail (G_IS_FILE (destination), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (destination); + if (iface->move) + { + my_error = NULL; + res = (* iface->move) (source, destination, + flags, cancellable, + progress_callback, progress_callback_data, + &my_error); + + if (res) + return TRUE; + + if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) + { + g_propagate_error (error, my_error); + return FALSE; + } + } + + /* If the types are different, and the destination method failed + also try the source method */ + if (G_OBJECT_TYPE (source) != G_OBJECT_TYPE (destination)) + { + iface = G_FILE_GET_IFACE (source); + + if (iface->move) + { + my_error = NULL; + res = (* iface->move) (source, destination, + flags, cancellable, + progress_callback, progress_callback_data, + &my_error); + + if (res) + return TRUE; + + if (my_error->domain != G_IO_ERROR || my_error->code != G_IO_ERROR_NOT_SUPPORTED) + { + g_propagate_error (error, my_error); + return FALSE; + } + } + } + + if (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return FALSE; + } + + flags |= G_FILE_COPY_ALL_METADATA; + if (!g_file_copy (source, destination, flags, cancellable, + progress_callback, progress_callback_data, + error)) + return FALSE; + + return g_file_delete (source, cancellable, error); +} + +/** + * g_file_make_directory + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Creates a directory. Note that this will only create a child directory of + * the immediate parent directory of the path or URI given by the #GFile. To + * recursively create directories, see g_file_make_directory_with_parents(). + * This function will fail if the parent directory does not exist, setting + * @error to %G_IO_ERROR_NOT_FOUND. If the file system doesn't support creating + * directories, this function will fail, setting @error to + * %G_IO_ERROR_NOT_SUPPORTED. + * + * For a local #GFile the newly created directory will have the default + * (current) ownership and permissions of the current process. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE on successful creation, %FALSE otherwise. + **/ +gboolean +g_file_make_directory (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (file); + + if (iface->make_directory == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return FALSE; + } + + return (* iface->make_directory) (file, cancellable, error); +} + +/** + * g_file_make_directory_with_parents: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Creates a directory and any parent directories that may not exist similar to + * 'mkdir -p'. If the file system does not support creating directories, this + * function will fail, setting @error to %G_IO_ERROR_NOT_SUPPORTED. + * + * For a local #GFile the newly created directories will have the default + * (current) ownership and permissions of the current process. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if all directories have been successfully created, %FALSE + * otherwise. + * + * Since: 2.18 + **/ +gboolean +g_file_make_directory_with_parents (GFile *file, + GCancellable *cancellable, + GError **error) +{ + gboolean result; + GFile *parent_file, *work_file; + GList *list = NULL, *l; + GError *my_error = NULL; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + result = g_file_make_directory (file, cancellable, &my_error); + if (result || my_error->code != G_IO_ERROR_NOT_FOUND) + { + if (my_error) + g_propagate_error (error, my_error); + return result; + } + + work_file = file; + + while (!result && my_error->code == G_IO_ERROR_NOT_FOUND) + { + g_clear_error (&my_error); + + parent_file = g_file_get_parent (work_file); + if (parent_file == NULL) + break; + result = g_file_make_directory (parent_file, cancellable, &my_error); + + if (!result && my_error->code == G_IO_ERROR_NOT_FOUND) + list = g_list_prepend (list, parent_file); + + work_file = parent_file; + } + + for (l = list; result && l; l = l->next) + { + result = g_file_make_directory ((GFile *) l->data, cancellable, &my_error); + } + + /* Clean up */ + while (list != NULL) + { + g_object_unref ((GFile *) list->data); + list = g_list_remove (list, list->data); + } + + if (!result) + { + g_propagate_error (error, my_error); + return result; + } + + return g_file_make_directory (file, cancellable, error); +} + +/** + * g_file_make_symbolic_link: + * @file: input #GFile. + * @symlink_value: a string with the value of the new symlink. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError. + * + * Creates a symbolic link. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE on the creation of a new symlink, %FALSE otherwise. + **/ +gboolean +g_file_make_symbolic_link (GFile *file, + const char *symlink_value, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (symlink_value != NULL, FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + if (*symlink_value == '\0') + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid symlink value given")); + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + + if (iface->make_symbolic_link == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return FALSE; + } + + return (* iface->make_symbolic_link) (file, symlink_value, cancellable, error); +} + +/** + * g_file_delete: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Deletes a file. If the @file is a directory, it will only be deleted if it + * is empty. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the file was deleted. %FALSE otherwise. + **/ +gboolean +g_file_delete (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (file); + + if (iface->delete_file == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return FALSE; + } + + return (* iface->delete_file) (file, cancellable, error); +} + +/** + * g_file_trash: + * @file: #GFile to send to trash. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sends @file to the "Trashcan", if possible. This is similar to + * deleting it, but the user can recover it before emptying the trashcan. + * Not all file systems support trashing, so this call can return the + * %G_IO_ERROR_NOT_SUPPORTED error. + * + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE on successful trash, %FALSE otherwise. + **/ +gboolean +g_file_trash (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (file); + + if (iface->trash == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Trash not supported")); + return FALSE; + } + + return (* iface->trash) (file, cancellable, error); +} + +/** + * g_file_set_display_name: + * @file: input #GFile. + * @display_name: a string. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Renames @file to the specified display name. + * + * The display name is converted from UTF8 to the correct encoding for the target + * filesystem if possible and the @file is renamed to this. + * + * If you want to implement a rename operation in the user interface the edit name + * (#G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME) should be used as the initial value in the rename + * widget, and then the result after editing should be passed to g_file_set_display_name(). + * + * On success the resulting converted filename is returned. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GFile specifying what @file was renamed to, or %NULL + * if there was an error. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_set_display_name (GFile *file, + const char *display_name, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (display_name != NULL, NULL); + + if (strchr (display_name, G_DIR_SEPARATOR) != NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("File names cannot contain '%c'"), G_DIR_SEPARATOR); + return NULL; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + return (* iface->set_display_name) (file, display_name, cancellable, error); +} + +/** + * g_file_set_display_name_async: + * @file: input #GFile. + * @display_name: a string. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously sets the display name for a given #GFile. + * + * For more details, see g_file_set_display_name() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_set_display_name_finish() to get the result of the operation. + **/ +void +g_file_set_display_name_async (GFile *file, + const char *display_name, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + g_return_if_fail (display_name != NULL); + + iface = G_FILE_GET_IFACE (file); + (* iface->set_display_name_async) (file, + display_name, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_set_display_name_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes setting a display name started with + * g_file_set_display_name_async(). + * + * Returns: a #GFile or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_set_display_name_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->set_display_name_finish) (file, res, error); +} + +/** + * g_file_query_settable_attributes: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Obtain the list of settable attributes for the file. + * + * Returns the type and full attribute name of all the attributes + * that can be set on this file. This doesn't mean setting it will always + * succeed though, you might get an access failure, or some specific + * file may not support a specific attribute. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GFileAttributeInfoList describing the settable attributes. + * When you are done with it, release it with g_file_attribute_info_list_unref() + **/ +GFileAttributeInfoList * +g_file_query_settable_attributes (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + GError *my_error; + GFileAttributeInfoList *list; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->query_settable_attributes == NULL) + return g_file_attribute_info_list_new (); + + my_error = NULL; + list = (* iface->query_settable_attributes) (file, cancellable, &my_error); + + if (list == NULL) + { + if (my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_NOT_SUPPORTED) + { + list = g_file_attribute_info_list_new (); + g_error_free (my_error); + } + else + g_propagate_error (error, my_error); + } + + return list; +} + +/** + * g_file_query_writable_namespaces: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Obtain the list of attribute namespaces where new attributes + * can be created by a user. An example of this is extended + * attributes (in the "xattr" namespace). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GFileAttributeInfoList describing the writable namespaces. + * When you are done with it, release it with g_file_attribute_info_list_unref() + **/ +GFileAttributeInfoList * +g_file_query_writable_namespaces (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + GError *my_error; + GFileAttributeInfoList *list; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->query_writable_namespaces == NULL) + return g_file_attribute_info_list_new (); + + my_error = NULL; + list = (* iface->query_writable_namespaces) (file, cancellable, &my_error); + + if (list == NULL) + { + if (my_error->domain == G_IO_ERROR && my_error->code == G_IO_ERROR_NOT_SUPPORTED) + { + list = g_file_attribute_info_list_new (); + g_error_free (my_error); + } + else + g_propagate_error (error, my_error); + } + + return list; +} + +/** + * g_file_set_attribute: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @type: The type of the attribute + * @value_p: a pointer to the value (or the pointer itself if the type is a pointer type) + * @flags: a set of #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets an attribute in the file with attribute name @attribute to @value. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the attribute was set, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute (GFile *file, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (file); + + if (iface->set_attribute == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return FALSE; + } + + return (* iface->set_attribute) (file, attribute, type, value_p, flags, cancellable, error); +} + +/** + * g_file_set_attributes_from_info: + * @file: input #GFile. + * @info: a #GFileInfo. + * @flags: #GFileQueryInfoFlags + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Tries to set all attributes in the #GFileInfo on the target values, + * not stopping on the first error. + * + * If there is any error during this operation then @error will be set to + * the first error. Error on particular fields are flagged by setting + * the "status" field in the attribute value to + * %G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING, which means you can also detect + * further errors. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if there was any error, %FALSE otherwise. + **/ +gboolean +g_file_set_attributes_from_info (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + g_file_info_clear_status (info); + + iface = G_FILE_GET_IFACE (file); + + return (* iface->set_attributes_from_info) (file, + info, + flags, + cancellable, + error); +} + + +static gboolean +g_file_real_set_attributes_from_info (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + char **attributes; + int i; + gboolean res; + GFileAttributeValue *value; + + res = TRUE; + + attributes = g_file_info_list_attributes (info, NULL); + + for (i = 0; attributes[i] != NULL; i++) + { + value = _g_file_info_get_attribute_value (info, attributes[i]); + + if (value->status != G_FILE_ATTRIBUTE_STATUS_UNSET) + continue; + + if (!g_file_set_attribute (file, attributes[i], + value->type, _g_file_attribute_value_peek_as_pointer (value), + flags, cancellable, error)) + { + value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + else + value->status = G_FILE_ATTRIBUTE_STATUS_SET; + } + + g_strfreev (attributes); + + return res; +} + +/** + * g_file_set_attributes_async: + * @file: input #GFile. + * @info: a #GFileInfo. + * @flags: a #GFileQueryInfoFlags. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback. + * @user_data: a #gpointer. + * + * Asynchronously sets the attributes of @file with @info. + * + * For more details, see g_file_set_attributes_from_info() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_set_attributes_finish() to get the result of the operation. + **/ +void +g_file_set_attributes_async (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + g_return_if_fail (G_IS_FILE_INFO (info)); + + iface = G_FILE_GET_IFACE (file); + (* iface->set_attributes_async) (file, + info, + flags, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_set_attributes_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @info: a #GFileInfo. + * @error: a #GError, or %NULL + * + * Finishes setting an attribute started in g_file_set_attributes_async(). + * + * Returns: %TRUE if the attributes were set correctly, %FALSE otherwise. + **/ +gboolean +g_file_set_attributes_finish (GFile *file, + GAsyncResult *result, + GFileInfo **info, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + /* No standard handling of errors here, as we must set info even + * on errors + */ + iface = G_FILE_GET_IFACE (file); + return (* iface->set_attributes_finish) (file, result, info, error); +} + +/** + * g_file_set_attribute_string: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @value: a string containing the attribute's value. + * @flags: #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_STRING to @value. + * If @attribute is of a different type, this operation will fail. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @attribute was successfully set, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute_string (GFile *file, + const char *attribute, + const char *value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + return g_file_set_attribute (file, attribute, + G_FILE_ATTRIBUTE_TYPE_STRING, (gpointer)value, + flags, cancellable, error); +} + +/** + * g_file_set_attribute_byte_string: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @value: a string containing the attribute's new value. + * @flags: a #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING to @value. + * If @attribute is of a different type, this operation will fail, + * returning %FALSE. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @attribute was successfully set to @value + * in the @file, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute_byte_string (GFile *file, + const char *attribute, + const char *value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + return g_file_set_attribute (file, attribute, + G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, (gpointer)value, + flags, cancellable, error); +} + +/** + * g_file_set_attribute_uint32: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @value: a #guint32 containing the attribute's new value. + * @flags: a #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_UINT32 to @value. + * If @attribute is of a different type, this operation will fail. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @attribute was successfully set to @value + * in the @file, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute_uint32 (GFile *file, + const char *attribute, + guint32 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + return g_file_set_attribute (file, attribute, + G_FILE_ATTRIBUTE_TYPE_UINT32, &value, + flags, cancellable, error); +} + +/** + * g_file_set_attribute_int32: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @value: a #gint32 containing the attribute's new value. + * @flags: a #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_INT32 to @value. + * If @attribute is of a different type, this operation will fail. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @attribute was successfully set to @value + * in the @file, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute_int32 (GFile *file, + const char *attribute, + gint32 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + return g_file_set_attribute (file, attribute, + G_FILE_ATTRIBUTE_TYPE_INT32, &value, + flags, cancellable, error); +} + +/** + * g_file_set_attribute_uint64: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @value: a #guint64 containing the attribute's new value. + * @flags: a #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_UINT64 to @value. + * If @attribute is of a different type, this operation will fail. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @attribute was successfully set to @value + * in the @file, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute_uint64 (GFile *file, + const char *attribute, + guint64 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) + { + return g_file_set_attribute (file, attribute, + G_FILE_ATTRIBUTE_TYPE_UINT64, &value, + flags, cancellable, error); +} + +/** + * g_file_set_attribute_int64: + * @file: input #GFile. + * @attribute: a string containing the attribute's name. + * @value: a #guint64 containing the attribute's new value. + * @flags: a #GFileQueryInfoFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Sets @attribute of type %G_FILE_ATTRIBUTE_TYPE_INT64 to @value. + * If @attribute is of a different type, this operation will fail. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @attribute was successfully set, %FALSE otherwise. + **/ +gboolean +g_file_set_attribute_int64 (GFile *file, + const char *attribute, + gint64 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + return g_file_set_attribute (file, attribute, + G_FILE_ATTRIBUTE_TYPE_INT64, &value, + flags, cancellable, error); +} + +/** + * g_file_mount_mountable: + * @file: input #GFile. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation, or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Mounts a file of type G_FILE_TYPE_MOUNTABLE. + * Using @mount_operation, you can request callbacks when, for instance, + * passwords are needed during authentication. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_mount_mountable_finish() to get the result of the operation. + **/ +void +g_file_mount_mountable (GFile *file, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->mount_mountable == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + (* iface->mount_mountable) (file, + flags, + mount_operation, + cancellable, + callback, + user_data); +} + +/** + * g_file_mount_mountable_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes a mount operation. See g_file_mount_mountable() for details. + * + * Finish an asynchronous mount operation that was started + * with g_file_mount_mountable(). + * + * Returns: a #GFile or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_file_mount_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->mount_mountable_finish) (file, result, error); +} + +/** + * g_file_unmount_mountable: + * @file: input #GFile. + * @flags: flags affecting the operation + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Unmounts a file of type G_FILE_TYPE_MOUNTABLE. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_unmount_mountable_finish() to get the result of the operation. + * + * Deprecated: 2.22: Use g_file_unmount_mountable_with_operation() instead. + **/ +void +g_file_unmount_mountable (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->unmount_mountable == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + (* iface->unmount_mountable) (file, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_file_unmount_mountable_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an unmount operation, see g_file_unmount_mountable() for details. + * + * Finish an asynchronous unmount operation that was started + * with g_file_unmount_mountable(). + * + * Returns: %TRUE if the operation finished successfully. %FALSE + * otherwise. + * + * Deprecated: 2.22: Use g_file_unmount_mountable_with_operation_finish() instead. + **/ +gboolean +g_file_unmount_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->unmount_mountable_finish) (file, result, error); +} + +/** + * g_file_unmount_mountable_with_operation: + * @file: input #GFile. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation, or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Unmounts a file of type G_FILE_TYPE_MOUNTABLE. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_unmount_mountable_finish() to get the result of the operation. + * + * Since: 2.22 + **/ +void +g_file_unmount_mountable_with_operation (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->unmount_mountable == NULL && iface->unmount_mountable_with_operation == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + if (iface->unmount_mountable_with_operation != NULL) + (* iface->unmount_mountable_with_operation) (file, + flags, + mount_operation, + cancellable, + callback, + user_data); + else + (* iface->unmount_mountable) (file, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_file_unmount_mountable_with_operation_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an unmount operation, see g_file_unmount_mountable_with_operation() for details. + * + * Finish an asynchronous unmount operation that was started + * with g_file_unmount_mountable_with_operation(). + * + * Returns: %TRUE if the operation finished successfully. %FALSE + * otherwise. + * + * Since: 2.22 + **/ +gboolean +g_file_unmount_mountable_with_operation_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + if (iface->unmount_mountable_with_operation_finish != NULL) + return (* iface->unmount_mountable_with_operation_finish) (file, result, error); + else + return (* iface->unmount_mountable_finish) (file, result, error); +} + +/** + * g_file_eject_mountable: + * @file: input #GFile. + * @flags: flags affecting the operation + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Starts an asynchronous eject on a mountable. + * When this operation has completed, @callback will be called with + * @user_user data, and the operation can be finalized with + * g_file_eject_mountable_finish(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Deprecated: 2.22: Use g_file_eject_mountable_with_operation() instead. + **/ +void +g_file_eject_mountable (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->eject_mountable == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + (* iface->eject_mountable) (file, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_file_eject_mountable_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous eject operation started by + * g_file_eject_mountable(). + * + * Returns: %TRUE if the @file was ejected successfully. %FALSE + * otherwise. + * + * Deprecated: 2.22: Use g_file_eject_mountable_with_operation_finish() instead. + **/ +gboolean +g_file_eject_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->eject_mountable_finish) (file, result, error); +} + +/** + * g_file_eject_mountable_with_operation: + * @file: input #GFile. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation, or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Starts an asynchronous eject on a mountable. + * When this operation has completed, @callback will be called with + * @user_user data, and the operation can be finalized with + * g_file_eject_mountable_with_operation_finish(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Since: 2.22 + **/ +void +g_file_eject_mountable_with_operation (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->eject_mountable == NULL && iface->eject_mountable_with_operation == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + if (iface->eject_mountable_with_operation != NULL) + (* iface->eject_mountable_with_operation) (file, + flags, + mount_operation, + cancellable, + callback, + user_data); + else + (* iface->eject_mountable) (file, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_file_eject_mountable_with_operation_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous eject operation started by + * g_file_eject_mountable_with_operation(). + * + * Returns: %TRUE if the @file was ejected successfully. %FALSE + * otherwise. + * + * Since: 2.22 + **/ +gboolean +g_file_eject_mountable_with_operation_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + if (iface->eject_mountable_with_operation_finish != NULL) + return (* iface->eject_mountable_with_operation_finish) (file, result, error); + else + return (* iface->eject_mountable_finish) (file, result, error); +} + +/** + * g_file_monitor_directory: + * @file: input #GFile. + * @flags: a set of #GFileMonitorFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL. + * + * Obtains a directory monitor for the given file. + * This may fail if directory monitoring is not supported. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GFileMonitor for the given @file, or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileMonitor* +g_file_monitor_directory (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + if (iface->monitor_dir == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return NULL; + } + + return (* iface->monitor_dir) (file, flags, cancellable, error); +} + +/** + * g_file_monitor_file: + * @file: input #GFile. + * @flags: a set of #GFileMonitorFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL. + * + * Obtains a file monitor for the given file. If no file notification + * mechanism exists, then regular polling of the file is used. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GFileMonitor for the given @file, or %NULL on error. + * Free the returned object with g_object_unref(). + **/ +GFileMonitor* +g_file_monitor_file (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileIface *iface; + GFileMonitor *monitor; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + + monitor = NULL; + + if (iface->monitor_file) + monitor = (* iface->monitor_file) (file, flags, cancellable, NULL); + +/* Fallback to polling */ + if (monitor == NULL) + monitor = _g_poll_file_monitor_new (file); + + return monitor; +} + +/** + * g_file_monitor: + * @file: input #GFile + * @flags: a set of #GFileMonitorFlags + * @cancellable: optional #GCancellable object, %NULL to ignore + * @error: a #GError, or %NULL + * + * Obtains a file or directory monitor for the given file, depending + * on the type of the file. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GFileMonitor for the given @file, or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.18 + */ +GFileMonitor* +g_file_monitor (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error) +{ + if (g_file_query_file_type (file, 0, cancellable) == G_FILE_TYPE_DIRECTORY) + return g_file_monitor_directory (file, flags, cancellable, error); + else + return g_file_monitor_file (file, flags, cancellable, error); +} + +/******************************************** + * Default implementation of async ops * + ********************************************/ + +typedef struct { + char *attributes; + GFileQueryInfoFlags flags; + GFileInfo *info; +} QueryInfoAsyncData; + +static void +query_info_data_free (QueryInfoAsyncData *data) +{ + if (data->info) + g_object_unref (data->info); + g_free (data->attributes); + g_free (data); +} + +static void +query_info_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error = NULL; + QueryInfoAsyncData *data; + GFileInfo *info; + + data = g_simple_async_result_get_op_res_gpointer (res); + + info = g_file_query_info (G_FILE (object), data->attributes, data->flags, cancellable, &error); + + if (info == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->info = info; +} + +static void +g_file_real_query_info_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + QueryInfoAsyncData *data; + + data = g_new0 (QueryInfoAsyncData, 1); + data->attributes = g_strdup (attributes); + data->flags = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_query_info_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)query_info_data_free); + + g_simple_async_result_run_in_thread (res, query_info_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileInfo * +g_file_real_query_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + QueryInfoAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_query_info_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->info) + return g_object_ref (data->info); + + return NULL; +} + +typedef struct { + char *attributes; + GFileInfo *info; +} QueryFilesystemInfoAsyncData; + +static void +query_filesystem_info_data_free (QueryFilesystemInfoAsyncData *data) +{ + if (data->info) + g_object_unref (data->info); + g_free (data->attributes); + g_free (data); +} + +static void +query_filesystem_info_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error = NULL; + QueryFilesystemInfoAsyncData *data; + GFileInfo *info; + + data = g_simple_async_result_get_op_res_gpointer (res); + + info = g_file_query_filesystem_info (G_FILE (object), data->attributes, cancellable, &error); + + if (info == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->info = info; +} + +static void +g_file_real_query_filesystem_info_async (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + QueryFilesystemInfoAsyncData *data; + + data = g_new0 (QueryFilesystemInfoAsyncData, 1); + data->attributes = g_strdup (attributes); + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_query_filesystem_info_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)query_filesystem_info_data_free); + + g_simple_async_result_run_in_thread (res, query_filesystem_info_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileInfo * +g_file_real_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + QueryFilesystemInfoAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_query_filesystem_info_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->info) + return g_object_ref (data->info); + + return NULL; +} + +typedef struct { + char *attributes; + GFileQueryInfoFlags flags; + GFileEnumerator *enumerator; +} EnumerateChildrenAsyncData; + +static void +enumerate_children_data_free (EnumerateChildrenAsyncData *data) +{ + if (data->enumerator) + g_object_unref (data->enumerator); + g_free (data->attributes); + g_free (data); +} + +static void +enumerate_children_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error = NULL; + EnumerateChildrenAsyncData *data; + GFileEnumerator *enumerator; + + data = g_simple_async_result_get_op_res_gpointer (res); + + enumerator = g_file_enumerate_children (G_FILE (object), data->attributes, data->flags, cancellable, &error); + + if (enumerator == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->enumerator = enumerator; +} + +static void +g_file_real_enumerate_children_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + EnumerateChildrenAsyncData *data; + + data = g_new0 (EnumerateChildrenAsyncData, 1); + data->attributes = g_strdup (attributes); + data->flags = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_enumerate_children_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)enumerate_children_data_free); + + g_simple_async_result_run_in_thread (res, enumerate_children_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileEnumerator * +g_file_real_enumerate_children_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + EnumerateChildrenAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_enumerate_children_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->enumerator) + return g_object_ref (data->enumerator); + + return NULL; +} + +static void +open_read_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileInputStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + if (iface->read_fn == NULL) + { + g_set_error_literal (&error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + + return; + } + + stream = iface->read_fn (G_FILE (object), cancellable, &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); +} + +static void +g_file_real_read_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_read_async); + + g_simple_async_result_run_in_thread (res, open_read_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileInputStream * +g_file_real_read_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gpointer op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_read_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + if (op) + return g_object_ref (op); + + return NULL; +} + +static void +append_to_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileCreateFlags *data; + GFileOutputStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + data = g_simple_async_result_get_op_res_gpointer (res); + + stream = iface->append_to (G_FILE (object), *data, cancellable, &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); +} + +static void +g_file_real_append_to_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileCreateFlags *data; + GSimpleAsyncResult *res; + + data = g_new0 (GFileCreateFlags, 1); + *data = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_append_to_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)g_free); + + g_simple_async_result_run_in_thread (res, append_to_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileOutputStream * +g_file_real_append_to_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gpointer op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_append_to_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + if (op) + return g_object_ref (op); + + return NULL; +} + +static void +create_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileCreateFlags *data; + GFileOutputStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + data = g_simple_async_result_get_op_res_gpointer (res); + + stream = iface->create (G_FILE (object), *data, cancellable, &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); +} + +static void +g_file_real_create_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileCreateFlags *data; + GSimpleAsyncResult *res; + + data = g_new0 (GFileCreateFlags, 1); + *data = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_create_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)g_free); + + g_simple_async_result_run_in_thread (res, create_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileOutputStream * +g_file_real_create_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gpointer op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_create_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + if (op) + return g_object_ref (op); + + return NULL; +} + +typedef struct { + GFileOutputStream *stream; + char *etag; + gboolean make_backup; + GFileCreateFlags flags; +} ReplaceAsyncData; + +static void +replace_async_data_free (ReplaceAsyncData *data) +{ + if (data->stream) + g_object_unref (data->stream); + g_free (data->etag); + g_free (data); +} + +static void +replace_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileOutputStream *stream; + GError *error = NULL; + ReplaceAsyncData *data; + + iface = G_FILE_GET_IFACE (object); + + data = g_simple_async_result_get_op_res_gpointer (res); + + stream = iface->replace (G_FILE (object), + data->etag, + data->make_backup, + data->flags, + cancellable, + &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->stream = stream; +} + +static void +g_file_real_replace_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + ReplaceAsyncData *data; + + data = g_new0 (ReplaceAsyncData, 1); + data->etag = g_strdup (etag); + data->make_backup = make_backup; + data->flags = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_replace_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)replace_async_data_free); + + g_simple_async_result_run_in_thread (res, replace_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileOutputStream * +g_file_real_replace_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + ReplaceAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_replace_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->stream) + return g_object_ref (data->stream); + + return NULL; +} + +static void +open_readwrite_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileIOStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + if (iface->open_readwrite == NULL) + { + g_set_error_literal (&error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + + return; + } + + stream = iface->open_readwrite (G_FILE (object), cancellable, &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); +} + +static void +g_file_real_open_readwrite_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_open_readwrite_async); + + g_simple_async_result_run_in_thread (res, open_readwrite_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileIOStream * +g_file_real_open_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gpointer op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_open_readwrite_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + if (op) + return g_object_ref (op); + + return NULL; +} + +static void +create_readwrite_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileCreateFlags *data; + GFileIOStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + data = g_simple_async_result_get_op_res_gpointer (res); + + if (iface->create_readwrite == NULL) + { + g_set_error_literal (&error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + + return; + } + + stream = iface->create_readwrite (G_FILE (object), *data, cancellable, &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + g_simple_async_result_set_op_res_gpointer (res, stream, g_object_unref); +} + +static void +g_file_real_create_readwrite_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileCreateFlags *data; + GSimpleAsyncResult *res; + + data = g_new0 (GFileCreateFlags, 1); + *data = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_create_readwrite_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)g_free); + + g_simple_async_result_run_in_thread (res, create_readwrite_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileIOStream * +g_file_real_create_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gpointer op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_create_readwrite_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + if (op) + return g_object_ref (op); + + return NULL; +} + +typedef struct { + GFileIOStream *stream; + char *etag; + gboolean make_backup; + GFileCreateFlags flags; +} ReplaceRWAsyncData; + +static void +replace_rw_async_data_free (ReplaceRWAsyncData *data) +{ + if (data->stream) + g_object_unref (data->stream); + g_free (data->etag); + g_free (data); +} + +static void +replace_readwrite_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileIOStream *stream; + GError *error = NULL; + ReplaceRWAsyncData *data; + + iface = G_FILE_GET_IFACE (object); + + data = g_simple_async_result_get_op_res_gpointer (res); + + stream = iface->replace_readwrite (G_FILE (object), + data->etag, + data->make_backup, + data->flags, + cancellable, + &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->stream = stream; +} + +static void +g_file_real_replace_readwrite_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + ReplaceRWAsyncData *data; + + data = g_new0 (ReplaceRWAsyncData, 1); + data->etag = g_strdup (etag); + data->make_backup = make_backup; + data->flags = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_replace_readwrite_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)replace_rw_async_data_free); + + g_simple_async_result_run_in_thread (res, replace_readwrite_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileIOStream * +g_file_real_replace_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + ReplaceRWAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_replace_readwrite_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->stream) + return g_object_ref (data->stream); + + return NULL; +} + +typedef struct { + char *name; + GFile *file; +} SetDisplayNameAsyncData; + +static void +set_display_name_data_free (SetDisplayNameAsyncData *data) +{ + g_free (data->name); + if (data->file) + g_object_unref (data->file); + g_free (data); +} + +static void +set_display_name_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error = NULL; + SetDisplayNameAsyncData *data; + GFile *file; + + data = g_simple_async_result_get_op_res_gpointer (res); + + file = g_file_set_display_name (G_FILE (object), data->name, cancellable, &error); + + if (file == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->file = file; +} + +static void +g_file_real_set_display_name_async (GFile *file, + const char *display_name, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + SetDisplayNameAsyncData *data; + + data = g_new0 (SetDisplayNameAsyncData, 1); + data->name = g_strdup (display_name); + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_set_display_name_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)set_display_name_data_free); + + g_simple_async_result_run_in_thread (res, set_display_name_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFile * +g_file_real_set_display_name_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + SetDisplayNameAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_set_display_name_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->file) + return g_object_ref (data->file); + + return NULL; +} + +typedef struct { + GFileQueryInfoFlags flags; + GFileInfo *info; + gboolean res; + GError *error; +} SetInfoAsyncData; + +static void +set_info_data_free (SetInfoAsyncData *data) +{ + if (data->info) + g_object_unref (data->info); + if (data->error) + g_error_free (data->error); + g_free (data); +} + +static void +set_info_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + SetInfoAsyncData *data; + + data = g_simple_async_result_get_op_res_gpointer (res); + + data->error = NULL; + data->res = g_file_set_attributes_from_info (G_FILE (object), + data->info, + data->flags, + cancellable, + &data->error); +} + +static void +g_file_real_set_attributes_async (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + SetInfoAsyncData *data; + + data = g_new0 (SetInfoAsyncData, 1); + data->info = g_file_info_dup (info); + data->flags = flags; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_set_attributes_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)set_info_data_free); + + g_simple_async_result_run_in_thread (res, set_info_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static gboolean +g_file_real_set_attributes_finish (GFile *file, + GAsyncResult *res, + GFileInfo **info, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + SetInfoAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_set_attributes_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + if (info) + *info = g_object_ref (data->info); + + if (error != NULL && data->error) + *error = g_error_copy (data->error); + + return data->res; +} + +static void +find_enclosing_mount_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error = NULL; + GMount *mount; + + mount = g_file_find_enclosing_mount (G_FILE (object), cancellable, &error); + + if (mount == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + g_simple_async_result_set_op_res_gpointer (res, mount, (GDestroyNotify)g_object_unref); +} + +static void +g_file_real_find_enclosing_mount_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (file), callback, user_data, g_file_real_find_enclosing_mount_async); + + g_simple_async_result_run_in_thread (res, find_enclosing_mount_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GMount * +g_file_real_find_enclosing_mount_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GMount *mount; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_real_find_enclosing_mount_async); + + mount = g_simple_async_result_get_op_res_gpointer (simple); + return g_object_ref (mount); +} + + +typedef struct { + GFile *source; + GFile *destination; + GFileCopyFlags flags; + GFileProgressCallback progress_cb; + gpointer progress_cb_data; + GIOSchedulerJob *job; +} CopyAsyncData; + +static void +copy_async_data_free (CopyAsyncData *data) +{ + g_object_unref (data->source); + g_object_unref (data->destination); + g_free (data); +} + +typedef struct { + CopyAsyncData *data; + goffset current_num_bytes; + goffset total_num_bytes; +} ProgressData; + +static gboolean +copy_async_progress_in_main (gpointer user_data) +{ + ProgressData *progress = user_data; + CopyAsyncData *data = progress->data; + + data->progress_cb (progress->current_num_bytes, + progress->total_num_bytes, + data->progress_cb_data); + + return FALSE; +} + +static gboolean +mainloop_barrier (gpointer user_data) +{ + /* Does nothing, but ensures all queued idles before + this are run */ + return FALSE; +} + + +static void +copy_async_progress_callback (goffset current_num_bytes, + goffset total_num_bytes, + gpointer user_data) +{ + CopyAsyncData *data = user_data; + ProgressData *progress; + + progress = g_new (ProgressData, 1); + progress->data = data; + progress->current_num_bytes = current_num_bytes; + progress->total_num_bytes = total_num_bytes; + + g_io_scheduler_job_send_to_mainloop_async (data->job, + copy_async_progress_in_main, + progress, + g_free); +} + +static gboolean +copy_async_thread (GIOSchedulerJob *job, + GCancellable *cancellable, + gpointer user_data) +{ + GSimpleAsyncResult *res; + CopyAsyncData *data; + gboolean result; + GError *error; + + res = user_data; + data = g_simple_async_result_get_op_res_gpointer (res); + + error = NULL; + data->job = job; + result = g_file_copy (data->source, + data->destination, + data->flags, + cancellable, + (data->progress_cb != NULL) ? copy_async_progress_callback : NULL, + data, + &error); + + /* Ensure all progress callbacks are done running in main thread */ + if (data->progress_cb != NULL) + g_io_scheduler_job_send_to_mainloop (job, + mainloop_barrier, + NULL, NULL); + + if (!result) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + + g_simple_async_result_complete_in_idle (res); + + return FALSE; +} + +static void +g_file_real_copy_async (GFile *source, + GFile *destination, + GFileCopyFlags flags, + int io_priority, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + CopyAsyncData *data; + + data = g_new0 (CopyAsyncData, 1); + data->source = g_object_ref (source); + data->destination = g_object_ref (destination); + data->flags = flags; + data->progress_cb = progress_callback; + data->progress_cb_data = progress_callback_data; + + res = g_simple_async_result_new (G_OBJECT (source), callback, user_data, g_file_real_copy_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)copy_async_data_free); + + g_io_scheduler_push_job (copy_async_thread, res, g_object_unref, io_priority, cancellable); +} + +static gboolean +g_file_real_copy_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + /* Error handled in g_file_copy_finish() */ + return TRUE; +} + + +/******************************************** + * Default VFS operations * + ********************************************/ + +/** + * g_file_new_for_path: + * @path: a string containing a relative or absolute path. + * + * Constructs a #GFile for a given path. This operation never + * fails, but the returned object might not support any I/O + * operation if @path is malformed. + * + * Returns: a new #GFile for the given @path. + **/ +GFile * +g_file_new_for_path (const char *path) +{ + g_return_val_if_fail (path != NULL, NULL); + + return g_vfs_get_file_for_path (g_vfs_get_default (), path); +} + +/** + * g_file_new_for_uri: + * @uri: a string containing a URI. + * + * Constructs a #GFile for a given URI. This operation never + * fails, but the returned object might not support any I/O + * operation if @uri is malformed or if the uri type is + * not supported. + * + * Returns: a #GFile for the given @uri. + **/ +GFile * +g_file_new_for_uri (const char *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return g_vfs_get_file_for_uri (g_vfs_get_default (), uri); +} + +/** + * g_file_parse_name: + * @parse_name: a file name or path to be parsed. + * + * Constructs a #GFile with the given @parse_name (i.e. something given by g_file_get_parse_name()). + * This operation never fails, but the returned object might not support any I/O + * operation if the @parse_name cannot be parsed. + * + * Returns: a new #GFile. + **/ +GFile * +g_file_parse_name (const char *parse_name) +{ + g_return_val_if_fail (parse_name != NULL, NULL); + + return g_vfs_parse_name (g_vfs_get_default (), parse_name); +} + +static gboolean +is_valid_scheme_character (char c) +{ + return g_ascii_isalnum (c) || c == '+' || c == '-' || c == '.'; +} + +/* Following RFC 2396, valid schemes are built like: + * scheme = alpha *( alpha | digit | "+" | "-" | "." ) + */ +static gboolean +has_valid_scheme (const char *uri) +{ + const char *p; + + p = uri; + + if (!g_ascii_isalpha (*p)) + return FALSE; + + do { + p++; + } while (is_valid_scheme_character (*p)); + + return *p == ':'; +} + +/** + * g_file_new_for_commandline_arg: + * @arg: a command line string. + * + * Creates a #GFile with the given argument from the command line. The value of + * @arg can be either a URI, an absolute path or a relative path resolved + * relative to the current working directory. + * This operation never fails, but the returned object might not support any + * I/O operation if @arg points to a malformed path. + * + * Returns: a new #GFile. + **/ +GFile * +g_file_new_for_commandline_arg (const char *arg) +{ + GFile *file; + char *filename; + char *current_dir; + + g_return_val_if_fail (arg != NULL, NULL); + + if (g_path_is_absolute (arg)) + return g_file_new_for_path (arg); + + if (has_valid_scheme (arg)) + return g_file_new_for_uri (arg); + + current_dir = g_get_current_dir (); + filename = g_build_filename (current_dir, arg, NULL); + g_free (current_dir); + + file = g_file_new_for_path (filename); + g_free (filename); + + return file; +} + +/** + * g_file_mount_enclosing_volume: + * @location: input #GFile. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Starts a @mount_operation, mounting the volume that contains the file @location. + * + * When this operation has completed, @callback will be called with + * @user_user data, and the operation can be finalized with + * g_file_mount_enclosing_volume_finish(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + **/ +void +g_file_mount_enclosing_volume (GFile *location, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (location)); + + iface = G_FILE_GET_IFACE (location); + + if (iface->mount_enclosing_volume == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (location), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("volume doesn't implement mount")); + + return; + } + + (* iface->mount_enclosing_volume) (location, flags, mount_operation, cancellable, callback, user_data); + +} + +/** + * g_file_mount_enclosing_volume_finish: + * @location: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes a mount operation started by g_file_mount_enclosing_volume(). + * + * Returns: %TRUE if successful. If an error + * has occurred, this function will return %FALSE and set @error + * appropriately if present. + **/ +gboolean +g_file_mount_enclosing_volume_finish (GFile *location, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (location), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (location); + + return (* iface->mount_enclosing_volume_finish) (location, result, error); +} + +/******************************************** + * Utility functions * + ********************************************/ + +/** + * g_file_query_default_handler: + * @file: a #GFile to open. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Returns the #GAppInfo that is registered as the default + * application to handle the file specified by @file. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GAppInfo if the handle was found, %NULL if there were errors. + * When you are done with it, release it with g_object_unref() + **/ +GAppInfo * +g_file_query_default_handler (GFile *file, + GCancellable *cancellable, + GError **error) +{ + char *uri_scheme; + const char *content_type; + GAppInfo *appinfo; + GFileInfo *info; + char *path; + + uri_scheme = g_file_get_uri_scheme (file); + if (uri_scheme && uri_scheme[0] != '\0') + { + appinfo = g_app_info_get_default_for_uri_scheme (uri_scheme); + g_free (uri_scheme); + + if (appinfo != NULL) + return appinfo; + } + + info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + 0, + cancellable, + error); + if (info == NULL) + return NULL; + + appinfo = NULL; + + content_type = g_file_info_get_content_type (info); + if (content_type) + { + /* Don't use is_native(), as we want to support fuse paths if availible */ + path = g_file_get_path (file); + appinfo = g_app_info_get_default_for_type (content_type, + path == NULL); + g_free (path); + } + + g_object_unref (info); + + if (appinfo != NULL) + return appinfo; + + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("No application is registered as handling this file")); + return NULL; + +} + + +#define GET_CONTENT_BLOCK_SIZE 8192 + +/** + * g_file_load_contents: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @contents: a location to place the contents of the file. + * @length: a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @etag_out: a location to place the current entity tag for the file, + * or %NULL if the entity tag is not needed + * @error: a #GError, or %NULL + * + * Loads the content of the file into memory. The data is always + * zero-terminated, but this is not included in the resultant @length. + * The returned @content should be freed with g_free() when no longer + * needed. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if the @file's contents were successfully loaded. + * %FALSE if there were errors. + **/ +gboolean +g_file_load_contents (GFile *file, + GCancellable *cancellable, + char **contents, + gsize *length, + char **etag_out, + GError **error) +{ + GFileInputStream *in; + GByteArray *content; + gsize pos; + gssize res; + GFileInfo *info; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (contents != NULL, FALSE); + + in = g_file_read (file, cancellable, error); + if (in == NULL) + return FALSE; + + content = g_byte_array_new (); + pos = 0; + + g_byte_array_set_size (content, pos + GET_CONTENT_BLOCK_SIZE + 1); + while ((res = g_input_stream_read (G_INPUT_STREAM (in), + content->data + pos, + GET_CONTENT_BLOCK_SIZE, + cancellable, error)) > 0) + { + pos += res; + g_byte_array_set_size (content, pos + GET_CONTENT_BLOCK_SIZE + 1); + } + + if (etag_out) + { + *etag_out = NULL; + + info = g_file_input_stream_query_info (in, + G_FILE_ATTRIBUTE_ETAG_VALUE, + cancellable, + NULL); + if (info) + { + *etag_out = g_strdup (g_file_info_get_etag (info)); + g_object_unref (info); + } + } + + /* Ignore errors on close */ + g_input_stream_close (G_INPUT_STREAM (in), cancellable, NULL); + g_object_unref (in); + + if (res < 0) + { + /* error is set already */ + g_byte_array_free (content, TRUE); + return FALSE; + } + + if (length) + *length = pos; + + /* Zero terminate (we got an extra byte allocated for this */ + content->data[pos] = 0; + + *contents = (char *)g_byte_array_free (content, FALSE); + + return TRUE; +} + +typedef struct { + GFile *file; + GError *error; + GCancellable *cancellable; + GFileReadMoreCallback read_more_callback; + GAsyncReadyCallback callback; + gpointer user_data; + GByteArray *content; + gsize pos; + char *etag; +} LoadContentsData; + + +static void +load_contents_data_free (LoadContentsData *data) +{ + if (data->error) + g_error_free (data->error); + if (data->cancellable) + g_object_unref (data->cancellable); + if (data->content) + g_byte_array_free (data->content, TRUE); + g_free (data->etag); + g_object_unref (data->file); + g_free (data); +} + +static void +load_contents_close_callback (GObject *obj, + GAsyncResult *close_res, + gpointer user_data) +{ + GInputStream *stream = G_INPUT_STREAM (obj); + LoadContentsData *data = user_data; + GSimpleAsyncResult *res; + + /* Ignore errors here, we're only reading anyway */ + g_input_stream_close_finish (stream, close_res, NULL); + g_object_unref (stream); + + res = g_simple_async_result_new (G_OBJECT (data->file), + data->callback, + data->user_data, + g_file_load_contents_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)load_contents_data_free); + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +load_contents_fstat_callback (GObject *obj, + GAsyncResult *stat_res, + gpointer user_data) +{ + GInputStream *stream = G_INPUT_STREAM (obj); + LoadContentsData *data = user_data; + GFileInfo *info; + + info = g_file_input_stream_query_info_finish (G_FILE_INPUT_STREAM (stream), + stat_res, NULL); + if (info) + { + data->etag = g_strdup (g_file_info_get_etag (info)); + g_object_unref (info); + } + + g_input_stream_close_async (stream, 0, + data->cancellable, + load_contents_close_callback, data); +} + +static void +load_contents_read_callback (GObject *obj, + GAsyncResult *read_res, + gpointer user_data) +{ + GInputStream *stream = G_INPUT_STREAM (obj); + LoadContentsData *data = user_data; + GError *error = NULL; + gssize read_size; + + read_size = g_input_stream_read_finish (stream, read_res, &error); + + if (read_size < 0) + { + /* Error or EOF, close the file */ + data->error = error; + g_input_stream_close_async (stream, 0, + data->cancellable, + load_contents_close_callback, data); + } + else if (read_size == 0) + { + g_file_input_stream_query_info_async (G_FILE_INPUT_STREAM (stream), + G_FILE_ATTRIBUTE_ETAG_VALUE, + 0, + data->cancellable, + load_contents_fstat_callback, + data); + } + else if (read_size > 0) + { + data->pos += read_size; + + g_byte_array_set_size (data->content, + data->pos + GET_CONTENT_BLOCK_SIZE); + + + if (data->read_more_callback && + !data->read_more_callback ((char *)data->content->data, data->pos, data->user_data)) + g_file_input_stream_query_info_async (G_FILE_INPUT_STREAM (stream), + G_FILE_ATTRIBUTE_ETAG_VALUE, + 0, + data->cancellable, + load_contents_fstat_callback, + data); + else + g_input_stream_read_async (stream, + data->content->data + data->pos, + GET_CONTENT_BLOCK_SIZE, + 0, + data->cancellable, + load_contents_read_callback, + data); + } +} + +static void +load_contents_open_callback (GObject *obj, + GAsyncResult *open_res, + gpointer user_data) +{ + GFile *file = G_FILE (obj); + GFileInputStream *stream; + LoadContentsData *data = user_data; + GError *error = NULL; + GSimpleAsyncResult *res; + + stream = g_file_read_finish (file, open_res, &error); + + if (stream) + { + g_byte_array_set_size (data->content, + data->pos + GET_CONTENT_BLOCK_SIZE); + g_input_stream_read_async (G_INPUT_STREAM (stream), + data->content->data + data->pos, + GET_CONTENT_BLOCK_SIZE, + 0, + data->cancellable, + load_contents_read_callback, + data); + + } + else + { + res = g_simple_async_result_new_from_error (G_OBJECT (data->file), + data->callback, + data->user_data, + error); + g_simple_async_result_complete (res); + g_error_free (error); + load_contents_data_free (data); + g_object_unref (res); + } +} + +/** + * g_file_load_partial_contents_async: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @read_more_callback: a #GFileReadMoreCallback to receive partial data and to specify whether further data should be read. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to the callback functions. + * + * Reads the partial contents of a file. A #GFileReadMoreCallback should be + * used to stop reading from the file when appropriate, else this function + * will behave exactly as g_file_load_contents_async(). This operation + * can be finished by g_file_load_partial_contents_finish(). + * + * Users of this function should be aware that @user_data is passed to + * both the @read_more_callback and the @callback. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + **/ +void +g_file_load_partial_contents_async (GFile *file, + GCancellable *cancellable, + GFileReadMoreCallback read_more_callback, + GAsyncReadyCallback callback, + gpointer user_data) +{ + LoadContentsData *data; + + g_return_if_fail (G_IS_FILE (file)); + + data = g_new0 (LoadContentsData, 1); + + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->read_more_callback = read_more_callback; + data->callback = callback; + data->user_data = user_data; + data->content = g_byte_array_new (); + data->file = g_object_ref (file); + + g_file_read_async (file, + 0, + cancellable, + load_contents_open_callback, + data); +} + +/** + * g_file_load_partial_contents_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @contents: a location to place the contents of the file. + * @length: a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @etag_out: a location to place the current entity tag for the file, + * or %NULL if the entity tag is not needed + * @error: a #GError, or %NULL + * + * Finishes an asynchronous partial load operation that was started + * with g_file_load_partial_contents_async(). The data is always + * zero-terminated, but this is not included in the resultant @length. + * The returned @content should be freed with g_free() when no longer + * needed. + * + * Returns: %TRUE if the load was successful. If %FALSE and @error is + * present, it will be set appropriately. + **/ +gboolean +g_file_load_partial_contents_finish (GFile *file, + GAsyncResult *res, + char **contents, + gsize *length, + char **etag_out, + GError **error) +{ + GSimpleAsyncResult *simple; + LoadContentsData *data; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (res), FALSE); + g_return_val_if_fail (contents != NULL, FALSE); + + simple = G_SIMPLE_ASYNC_RESULT (res); + + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_load_contents_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + if (data->error) + { + g_propagate_error (error, data->error); + data->error = NULL; + *contents = NULL; + if (length) + *length = 0; + return FALSE; + } + + if (length) + *length = data->pos; + + if (etag_out) + { + *etag_out = data->etag; + data->etag = NULL; + } + + /* Zero terminate */ + g_byte_array_set_size (data->content, data->pos + 1); + data->content->data[data->pos] = 0; + + *contents = (char *)g_byte_array_free (data->content, FALSE); + data->content = NULL; + + return TRUE; +} + +/** + * g_file_load_contents_async: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Starts an asynchronous load of the @file's contents. + * + * For more details, see g_file_load_contents() which is + * the synchronous version of this call. + * + * When the load operation has completed, @callback will be called + * with @user data. To finish the operation, call + * g_file_load_contents_finish() with the #GAsyncResult returned by + * the @callback. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + **/ +void +g_file_load_contents_async (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_file_load_partial_contents_async (file, + cancellable, + NULL, + callback, user_data); +} + +/** + * g_file_load_contents_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @contents: a location to place the contents of the file. + * @length: a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @etag_out: a location to place the current entity tag for the file, + * or %NULL if the entity tag is not needed + * @error: a #GError, or %NULL + * + * Finishes an asynchronous load of the @file's contents. + * The contents are placed in @contents, and @length is set to the + * size of the @contents string. The @content should be freed with + * g_free() when no longer needed. If @etag_out is present, it will be + * set to the new entity tag for the @file. + * + * Returns: %TRUE if the load was successful. If %FALSE and @error is + * present, it will be set appropriately. + **/ +gboolean +g_file_load_contents_finish (GFile *file, + GAsyncResult *res, + char **contents, + gsize *length, + char **etag_out, + GError **error) +{ + return g_file_load_partial_contents_finish (file, + res, + contents, + length, + etag_out, + error); +} + +/** + * g_file_replace_contents: + * @file: input #GFile. + * @contents: a string containing the new contents for @file. + * @length: the length of @contents in bytes. + * @etag: the old entity tag + * for the document, or %NULL + * @make_backup: %TRUE if a backup should be created. + * @flags: a set of #GFileCreateFlags. + * @new_etag: a location to a new entity tag + * for the document. This should be freed with g_free() when no longer + * needed, or %NULL + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, or %NULL + * + * Replaces the contents of @file with @contents of @length bytes. + + * If @etag is specified (not %NULL) any existing file must have that etag, or + * the error %G_IO_ERROR_WRONG_ETAG will be returned. + * + * If @make_backup is %TRUE, this function will attempt to make a backup of @file. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * The returned @new_etag can be used to verify that the file hasn't changed the + * next time it is saved over. + * + * Returns: %TRUE if successful. If an error + * has occurred, this function will return %FALSE and set @error + * appropriately if present. + **/ +gboolean +g_file_replace_contents (GFile *file, + const char *contents, + gsize length, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + char **new_etag, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStream *out; + gsize pos, remainder; + gssize res; + gboolean ret; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (contents != NULL, FALSE); + + out = g_file_replace (file, etag, make_backup, flags, cancellable, error); + if (out == NULL) + return FALSE; + + pos = 0; + remainder = length; + while (remainder > 0 && + (res = g_output_stream_write (G_OUTPUT_STREAM (out), + contents + pos, + MIN (remainder, GET_CONTENT_BLOCK_SIZE), + cancellable, + error)) > 0) + { + pos += res; + remainder -= res; + } + + if (remainder > 0 && res < 0) + { + /* Ignore errors on close */ + g_output_stream_close (G_OUTPUT_STREAM (out), cancellable, NULL); + g_object_unref (out); + + /* error is set already */ + return FALSE; + } + + ret = g_output_stream_close (G_OUTPUT_STREAM (out), cancellable, error); + + if (new_etag) + *new_etag = g_file_output_stream_get_etag (out); + + g_object_unref (out); + + return ret; +} + +typedef struct { + GFile *file; + GError *error; + GCancellable *cancellable; + GAsyncReadyCallback callback; + gpointer user_data; + const char *content; + gsize length; + gsize pos; + char *etag; +} ReplaceContentsData; + +static void +replace_contents_data_free (ReplaceContentsData *data) +{ + if (data->error) + g_error_free (data->error); + if (data->cancellable) + g_object_unref (data->cancellable); + g_object_unref (data->file); + g_free (data->etag); + g_free (data); +} + +static void +replace_contents_close_callback (GObject *obj, + GAsyncResult *close_res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (obj); + ReplaceContentsData *data = user_data; + GSimpleAsyncResult *res; + + /* Ignore errors here, we're only reading anyway */ + g_output_stream_close_finish (stream, close_res, NULL); + g_object_unref (stream); + + data->etag = g_file_output_stream_get_etag (G_FILE_OUTPUT_STREAM (stream)); + + res = g_simple_async_result_new (G_OBJECT (data->file), + data->callback, + data->user_data, + g_file_replace_contents_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)replace_contents_data_free); + g_simple_async_result_complete (res); + g_object_unref (res); +} + +static void +replace_contents_write_callback (GObject *obj, + GAsyncResult *read_res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (obj); + ReplaceContentsData *data = user_data; + GError *error = NULL; + gssize write_size; + + write_size = g_output_stream_write_finish (stream, read_res, &error); + + if (write_size <= 0) + { + /* Error or EOF, close the file */ + if (write_size < 0) + data->error = error; + g_output_stream_close_async (stream, 0, + data->cancellable, + replace_contents_close_callback, data); + } + else if (write_size > 0) + { + data->pos += write_size; + + if (data->pos >= data->length) + g_output_stream_close_async (stream, 0, + data->cancellable, + replace_contents_close_callback, data); + else + g_output_stream_write_async (stream, + data->content + data->pos, + data->length - data->pos, + 0, + data->cancellable, + replace_contents_write_callback, + data); + } +} + +static void +replace_contents_open_callback (GObject *obj, + GAsyncResult *open_res, + gpointer user_data) +{ + GFile *file = G_FILE (obj); + GFileOutputStream *stream; + ReplaceContentsData *data = user_data; + GError *error = NULL; + GSimpleAsyncResult *res; + + stream = g_file_replace_finish (file, open_res, &error); + + if (stream) + { + g_output_stream_write_async (G_OUTPUT_STREAM (stream), + data->content + data->pos, + data->length - data->pos, + 0, + data->cancellable, + replace_contents_write_callback, + data); + + } + else + { + res = g_simple_async_result_new_from_error (G_OBJECT (data->file), + data->callback, + data->user_data, + error); + g_simple_async_result_complete (res); + g_error_free (error); + replace_contents_data_free (data); + g_object_unref (res); + } +} + +/** + * g_file_replace_contents_async: + * @file: input #GFile. + * @contents: string of contents to replace the file with. + * @length: the length of @contents in bytes. + * @etag: a new entity tag for the @file, or %NULL + * @make_backup: %TRUE if a backup should be created. + * @flags: a set of #GFileCreateFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Starts an asynchronous replacement of @file with the given + * @contents of @length bytes. @etag will replace the document's + * current entity tag. + * + * When this operation has completed, @callback will be called with + * @user_user data, and the operation can be finalized with + * g_file_replace_contents_finish(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * If @make_backup is %TRUE, this function will attempt to + * make a backup of @file. + **/ +void +g_file_replace_contents_async (GFile *file, + const char *contents, + gsize length, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + ReplaceContentsData *data; + + g_return_if_fail (G_IS_FILE (file)); + g_return_if_fail (contents != NULL); + + data = g_new0 (ReplaceContentsData, 1); + + if (cancellable) + data->cancellable = g_object_ref (cancellable); + data->callback = callback; + data->user_data = user_data; + data->content = contents; + data->length = length; + data->pos = 0; + data->file = g_object_ref (file); + + g_file_replace_async (file, + etag, + make_backup, + flags, + 0, + cancellable, + replace_contents_open_callback, + data); +} + +/** + * g_file_replace_contents_finish: + * @file: input #GFile. + * @res: a #GAsyncResult. + * @new_etag: a location of a new entity tag + * for the document. This should be freed with g_free() when it is no + * longer needed, or %NULL + * @error: a #GError, or %NULL + * + * Finishes an asynchronous replace of the given @file. See + * g_file_replace_contents_async(). Sets @new_etag to the new entity + * tag for the document, if present. + * + * Returns: %TRUE on success, %FALSE on failure. + **/ +gboolean +g_file_replace_contents_finish (GFile *file, + GAsyncResult *res, + char **new_etag, + GError **error) +{ + GSimpleAsyncResult *simple; + ReplaceContentsData *data; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (res), FALSE); + + simple = G_SIMPLE_ASYNC_RESULT (res); + + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_replace_contents_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + if (data->error) + { + g_propagate_error (error, data->error); + data->error = NULL; + return FALSE; + } + + + if (new_etag) + { + *new_etag = data->etag; + data->etag = NULL; /* Take ownership */ + } + + return TRUE; +} + +/** + * g_file_start_mountable: + * @file: input #GFile. + * @flags: flags affecting the operation + * @start_operation: a #GMountOperation, or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Starts a file of type G_FILE_TYPE_MOUNTABLE. + * Using @start_operation, you can request callbacks when, for instance, + * passwords are needed during authentication. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_mount_mountable_finish() to get the result of the operation. + * + * Since: 2.22 + */ +void +g_file_start_mountable (GFile *file, + GDriveStartFlags flags, + GMountOperation *start_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->start_mountable == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + (* iface->start_mountable) (file, + flags, + start_operation, + cancellable, + callback, + user_data); +} + +/** + * g_file_start_mountable_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes a start operation. See g_file_start_mountable() for details. + * + * Finish an asynchronous start operation that was started + * with g_file_start_mountable(). + * + * Returns: %TRUE if the operation finished successfully. %FALSE + * otherwise. + * + * Since: 2.22 + */ +gboolean +g_file_start_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->start_mountable_finish) (file, result, error); +} + +/** + * g_file_stop_mountable: + * @file: input #GFile. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation, or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Stops a file of type G_FILE_TYPE_MOUNTABLE. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_stop_mountable_finish() to get the result of the operation. + * + * Since: 2.22 + */ +void +g_file_stop_mountable (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->stop_mountable == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + (* iface->stop_mountable) (file, + flags, + mount_operation, + cancellable, + callback, + user_data); +} + +/** + * g_file_stop_mountable_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an stop operation, see g_file_stop_mountable() for details. + * + * Finish an asynchronous stop operation that was started + * with g_file_stop_mountable(). + * + * Returns: %TRUE if the operation finished successfully. %FALSE + * otherwise. + * + * Since: 2.22 + */ +gboolean +g_file_stop_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->stop_mountable_finish) (file, result, error); +} + +/** + * g_file_poll_mountable: + * @file: input #GFile. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied, or %NULL. + * @user_data: the data to pass to callback function + * + * Polls a file of type G_FILE_TYPE_MOUNTABLE. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * When the operation is finished, @callback will be called. You can then call + * g_file_mount_mountable_finish() to get the result of the operation. + * + * Since: 2.22 + */ +void +g_file_poll_mountable (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIface *iface; + + g_return_if_fail (G_IS_FILE (file)); + + iface = G_FILE_GET_IFACE (file); + + if (iface->poll_mountable == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (file), + callback, + user_data, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + (* iface->poll_mountable) (file, + cancellable, + callback, + user_data); +} + +/** + * g_file_poll_mountable_finish: + * @file: input #GFile. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes a poll operation. See g_file_poll_mountable() for details. + * + * Finish an asynchronous poll operation that was polled + * with g_file_poll_mountable(). + * + * Returns: %TRUE if the operation finished successfully. %FALSE + * otherwise. + * + * Since: 2.22 + */ +gboolean +g_file_poll_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_FILE_GET_IFACE (file); + return (* iface->poll_mountable_finish) (file, result, error); +} + +/** + * g_file_supports_thread_contexts: + * @file: a #GFile. + * + * Checks if @file supports thread-default + * contexts. If this returns %FALSE, you cannot perform + * asynchronous operations on @file in a thread that has a + * thread-default context. + * + * Returns: Whether or not @file supports thread-default contexts. + * + * Since: 2.22 + */ +gboolean +g_file_supports_thread_contexts (GFile *file) +{ + GFileIface *iface; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + + iface = G_FILE_GET_IFACE (file); + return iface->supports_thread_contexts; +} + +#define __G_FILE_C__ +#include "gioaliasdef.c" diff --git a/gio/gfile.h b/gio/gfile.h new file mode 100644 index 0000000..918f26a --- /dev/null +++ b/gio/gfile.h @@ -0,0 +1,1017 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_H__ +#define __G_FILE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE (g_file_get_type ()) +#define G_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_FILE, GFile)) +#define G_IS_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_FILE)) +#define G_FILE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_FILE, GFileIface)) + +#if 0 +/** + * GFile: + * + * A handle to an object implementing the #GFileIface interface. + * Generally stores a location within the file system. Handles do not + * necessarily represent files or directories that currently exist. + **/ +typedef struct _GFile GFile; /* Dummy typedef */ +#endif +typedef struct _GFileIface GFileIface; + + +/** + * GFileIface: + * @g_iface: The parent interface. + * @dup: Duplicates a #GFile. + * @hash: Creates a hash of a #GFile. + * @equal: Checks equality of two given #GFiles. + * @is_native: Checks to see if a file is native to the system. + * @has_uri_scheme: Checks to see if a #GFile has a given URI scheme. + * @get_uri_scheme: Gets the URI scheme for a #GFile. + * @get_basename: Gets the basename for a given #GFile. + * @get_path: Gets the current path within a #GFile. + * @get_uri: Gets a URI for the path within a #GFile. + * @get_parse_name: Gets the parsed name for the #GFile. + * @get_parent: Gets the parent directory for the #GFile. + * @prefix_matches: Checks whether a #GFile contains a specified file. + * @get_relative_path: Gets the path for a #GFile relative to a given path. + * @resolve_relative_path: Resolves a relative path for a #GFile to an absolute path. + * @get_child_for_display_name: Gets the child #GFile for a given display name. + * @enumerate_children: Gets a #GFileEnumerator with the children of a #GFile. + * @enumerate_children_async: Asynchronously gets a #GFileEnumerator with the children of a #GFile. + * @enumerate_children_finish: Finishes asynchronously enumerating the children. + * @query_info: Gets the #GFileInfo for a #GFile. + * @query_info_async: Asynchronously gets the #GFileInfo for a #GFile. + * @query_info_finish: Finishes an asynchronous query info operation. + * @query_filesystem_info: Gets a #GFileInfo for the file system #GFile is on. + * @query_filesystem_info_async: Asynchronously gets a #GFileInfo for the file system #GFile is on. + * @query_filesystem_info_finish: Finishes asynchronously getting the file system info. + * @find_enclosing_mount: Gets a #GMount for the #GFile. + * @find_enclosing_mount_async: Asynchronously gets the #GMount for a #GFile. + * @find_enclosing_mount_finish: Finishes asynchronously getting the volume. + * @set_display_name: Sets the display name for a #GFile. + * @set_display_name_async: Asynchronously sets a #GFile's display name. + * @set_display_name_finish: Finishes asynchronously setting a #GFile's display name. + * @query_settable_attributes: Returns a list of #GFileAttributes that can be set. + * @_query_settable_attributes_async: Asynchronously gets a list of #GFileAttributes that can be set. + * @_query_settable_attributes_finish: Finishes asynchronously querying settable attributes. + * @query_writable_namespaces: Returns a list of #GFileAttribute namespaces that are writable. + * @_query_writable_namespaces_async: Asynchronously gets a list of #GFileAttribute namespaces that are writable. + * @_query_writable_namespaces_finish: Finishes asynchronously querying the writable namespaces. + * @set_attribute: Sets a #GFileAttribute. + * @set_attributes_from_info: Sets a #GFileAttribute with information from a #GFileInfo. + * @set_attributes_async: Asynchronously sets a file's attributes. + * @set_attributes_finish: Finishes setting a file's attributes asynchronously. + * @read_fn: Reads a file asynchronously. + * @read_async: Asynchronously reads a file. + * @read_finish: Finishes asynchronously reading a file. + * @append_to: Writes to the end of a file. + * @append_to_async: Asynchronously writes to the end of a file. + * @append_to_finish: Finishes an asynchronous file append operation. + * @create: Creates a new file. + * @create_async: Asynchronously creates a file. + * @create_finish: Finishes asynchronously creating a file. + * @replace: Replaces the contents of a file. + * @replace_async: Asynchronously replaces the contents of a file. + * @replace_finish: Finishes asynchronously replacing a file. + * @delete_file: Deletes a file. + * @_delete_file_async: Asynchronously deletes a file. + * @_delete_file_finish: Finishes an asynchronous delete. + * @trash: Sends a #GFile to the Trash location. + * @_trash_async: Asynchronously sends a #GFile to the Trash location. + * @_trash_finish: Finishes an asynchronous file trashing operation. + * @make_directory: Makes a directory. + * @_make_directory_async: Asynchronously makes a directory. + * @_make_directory_finish: Finishes making a directory asynchronously. + * @make_symbolic_link: Makes a symbolic link. + * @_make_symbolic_link_async: Asynchronously makes a symbolic link + * @_make_symbolic_link_finish: Finishes making a symbolic link asynchronously. + * @copy: Copies a file. + * @copy_async: Asynchronously copies a file. + * @copy_finish: Finishes an asynchronous copy operation. + * @move: Moves a file. + * @_move_async: Asynchronously moves a file. + * @_move_finish: Finishes an asynchronous move operation. + * @mount_mountable: Mounts a mountable object. + * @mount_mountable_finish: Finishes a mounting operation. + * @unmount_mountable: Unmounts a mountable object. + * @unmount_mountable_finish: Finishes an unmount operation. + * @eject_mountable: Ejects a mountable. + * @eject_mountable_finish: Finishes an eject operation. + * @mount_enclosing_volume: Mounts a specified location. + * @mount_enclosing_volume_finish: Finishes mounting a specified location. + * @monitor_dir: Creates a #GFileMonitor for the location. + * @monitor_file: Creates a #GFileMonitor for the location. + * @open_readwrite: Open file read/write. Since 2.22. + * @open_readwrite_async: Asynchronously opens file read/write. Since 2.22. + * @open_readwrite_finish: Finishes an asynchronous open read/write. Since 2.22. + * @create_readwrite: Creates file read/write. Since 2.22. + * @create_readwrite_async: Asynchronously creates file read/write. Since 2.22. + * @create_readwrite_finish: Finishes an asynchronous creates read/write. Since 2.22. + * @replace_readwrite: Replaces file read/write. Since 2.22. + * @replace_readwrite_async: Asynchronously replaces file read/write. Since 2.22. + * @replace_readwrite_finish: Finishes an asynchronous replace read/write. Since 2.22. + * @start_mountable: Starts a mountable object. Since 2.22. + * @start_mountable_finish: Finishes an start operation. Since 2.22. + * @stop_mountable: Stops a mountable. Since 2.22. + * @stop_mountable_finish: Finishes an stop operation. Since 2.22. + * @supports_thread_contexts: a boolean that indicates whether the #GFile implementation supports thread-default contexts. Since 2.22. + * @unmount_mountable_with_operation: Unmounts a mountable object using a #GMountOperation. Since 2.22. + * @unmount_mountable_with_operation_finish: Finishes an unmount operation using a #GMountOperation. Since 2.22. + * @eject_mountable_with_operation: Ejects a mountable object using a #GMountOperation. Since 2.22. + * @eject_mountable_with_operation_finish: Finishes an eject operation using a #GMountOperation. Since 2.22. + * @poll_mountable: Polls a mountable object for media changes. Since 2.22. + * @poll_mountable_finish: Finishes an poll operation for media changes. Since 2.22. + * + * An interface for writing VFS file handles. + **/ +struct _GFileIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GFile * (* dup) (GFile *file); + guint (* hash) (GFile *file); + gboolean (* equal) (GFile *file1, + GFile *file2); + gboolean (* is_native) (GFile *file); + gboolean (* has_uri_scheme) (GFile *file, + const char *uri_scheme); + char * (* get_uri_scheme) (GFile *file); + char * (* get_basename) (GFile *file); + char * (* get_path) (GFile *file); + char * (* get_uri) (GFile *file); + char * (* get_parse_name) (GFile *file); + GFile * (* get_parent) (GFile *file); + gboolean (* prefix_matches) (GFile *prefix, + GFile *file); + char * (* get_relative_path) (GFile *parent, + GFile *descendant); + GFile * (* resolve_relative_path) (GFile *file, + const char *relative_path); + GFile * (* get_child_for_display_name) (GFile *file, + const char *display_name, + GError **error); + + GFileEnumerator * (* enumerate_children) (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + void (* enumerate_children_async) (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileEnumerator * (* enumerate_children_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFileInfo * (* query_info) (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + void (* query_info_async) (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileInfo * (* query_info_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFileInfo * (* query_filesystem_info) (GFile *file, + const char *attributes, + GCancellable *cancellable, + GError **error); + void (* query_filesystem_info_async) (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileInfo * (* query_filesystem_info_finish)(GFile *file, + GAsyncResult *res, + GError **error); + + GMount * (* find_enclosing_mount) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* find_enclosing_mount_async) (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GMount * (* find_enclosing_mount_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFile * (* set_display_name) (GFile *file, + const char *display_name, + GCancellable *cancellable, + GError **error); + void (* set_display_name_async) (GFile *file, + const char *display_name, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFile * (* set_display_name_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFileAttributeInfoList * (* query_settable_attributes) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* _query_settable_attributes_async) (void); + void (* _query_settable_attributes_finish) (void); + + GFileAttributeInfoList * (* query_writable_namespaces) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* _query_writable_namespaces_async) (void); + void (* _query_writable_namespaces_finish) (void); + + gboolean (* set_attribute) (GFile *file, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + gboolean (* set_attributes_from_info) (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + void (* set_attributes_async) (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* set_attributes_finish) (GFile *file, + GAsyncResult *result, + GFileInfo **info, + GError **error); + + GFileInputStream * (* read_fn) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* read_async) (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileInputStream * (* read_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFileOutputStream * (* append_to) (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); + void (* append_to_async) (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileOutputStream * (* append_to_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFileOutputStream * (* create) (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); + void (* create_async) (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileOutputStream * (* create_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + GFileOutputStream * (* replace) (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); + void (* replace_async) (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileOutputStream * (* replace_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + gboolean (* delete_file) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* _delete_file_async) (void); + void (* _delete_file_finish) (void); + + gboolean (* trash) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* _trash_async) (void); + void (* _trash_finish) (void); + + gboolean (* make_directory) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* _make_directory_async) (void); + void (* _make_directory_finish) (void); + + gboolean (* make_symbolic_link) (GFile *file, + const char *symlink_value, + GCancellable *cancellable, + GError **error); + void (* _make_symbolic_link_async) (void); + void (* _make_symbolic_link_finish) (void); + + gboolean (* copy) (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error); + void (* copy_async) (GFile *source, + GFile *destination, + GFileCopyFlags flags, + int io_priority, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* copy_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + gboolean (* move) (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error); + void (* _move_async) (void); + void (* _move_finish) (void); + + void (* mount_mountable) (GFile *file, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFile * (* mount_mountable_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + void (* unmount_mountable) (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* unmount_mountable_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + void (* eject_mountable) (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_mountable_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + void (* mount_enclosing_volume) (GFile *location, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* mount_enclosing_volume_finish) (GFile *location, + GAsyncResult *result, + GError **error); + + GFileMonitor * (* monitor_dir) (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); + GFileMonitor * (* monitor_file) (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); + + GFileIOStream * (* open_readwrite) (GFile *file, + GCancellable *cancellable, + GError **error); + void (* open_readwrite_async) (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileIOStream * (* open_readwrite_finish) (GFile *file, + GAsyncResult *res, + GError **error); + GFileIOStream * (* create_readwrite) (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); + void (* create_readwrite_async) (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileIOStream * (* create_readwrite_finish) (GFile *file, + GAsyncResult *res, + GError **error); + GFileIOStream * (* replace_readwrite) (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); + void (* replace_readwrite_async) (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileIOStream * (* replace_readwrite_finish) (GFile *file, + GAsyncResult *res, + GError **error); + + void (* start_mountable) (GFile *file, + GDriveStartFlags flags, + GMountOperation *start_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* start_mountable_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + void (* stop_mountable) (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* stop_mountable_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + gboolean supports_thread_contexts; + + void (* unmount_mountable_with_operation) (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* unmount_mountable_with_operation_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + void (* eject_mountable_with_operation) (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_mountable_with_operation_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + void (* poll_mountable) (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* poll_mountable_finish) (GFile *file, + GAsyncResult *result, + GError **error); +}; + +GType g_file_get_type (void) G_GNUC_CONST; + +GFile * g_file_new_for_path (const char *path); +GFile * g_file_new_for_uri (const char *uri); +GFile * g_file_new_for_commandline_arg (const char *arg); +GFile * g_file_parse_name (const char *parse_name); +GFile * g_file_dup (GFile *file); +guint g_file_hash (gconstpointer file); +gboolean g_file_equal (GFile *file1, + GFile *file2); +char * g_file_get_basename (GFile *file); +char * g_file_get_path (GFile *file); +char * g_file_get_uri (GFile *file); +char * g_file_get_parse_name (GFile *file); +GFile * g_file_get_parent (GFile *file); +gboolean g_file_has_parent (GFile *file, + GFile *parent); +GFile * g_file_get_child (GFile *file, + const char *name); +GFile * g_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error); +gboolean g_file_has_prefix (GFile *file, + GFile *prefix); +char * g_file_get_relative_path (GFile *parent, + GFile *descendant); +GFile * g_file_resolve_relative_path (GFile *file, + const char *relative_path); +gboolean g_file_is_native (GFile *file); +gboolean g_file_has_uri_scheme (GFile *file, + const char *uri_scheme); +char * g_file_get_uri_scheme (GFile *file); +GFileInputStream * g_file_read (GFile *file, + GCancellable *cancellable, + GError **error); +void g_file_read_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInputStream * g_file_read_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFileOutputStream * g_file_append_to (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GFileOutputStream * g_file_create (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GFileOutputStream * g_file_replace (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_append_to_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileOutputStream * g_file_append_to_finish (GFile *file, + GAsyncResult *res, + GError **error); +void g_file_create_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileOutputStream * g_file_create_finish (GFile *file, + GAsyncResult *res, + GError **error); +void g_file_replace_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileOutputStream * g_file_replace_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFileIOStream * g_file_open_readwrite (GFile *file, + GCancellable *cancellable, + GError **error); +void g_file_open_readwrite_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileIOStream * g_file_open_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFileIOStream * g_file_create_readwrite (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_create_readwrite_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileIOStream * g_file_create_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFileIOStream * g_file_replace_readwrite (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_replace_readwrite_async (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileIOStream * g_file_replace_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +gboolean g_file_query_exists (GFile *file, + GCancellable *cancellable); +GFileType g_file_query_file_type (GFile *file, + GFileQueryInfoFlags flags, + GCancellable *cancellable); +GFileInfo * g_file_query_info (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_query_info_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInfo * g_file_query_info_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFileInfo * g_file_query_filesystem_info (GFile *file, + const char *attributes, + GCancellable *cancellable, + GError **error); +void g_file_query_filesystem_info_async (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInfo * g_file_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error); +GMount * g_file_find_enclosing_mount (GFile *file, + GCancellable *cancellable, + GError **error); +void g_file_find_enclosing_mount_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GMount * g_file_find_enclosing_mount_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFileEnumerator * g_file_enumerate_children (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_enumerate_children_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileEnumerator * g_file_enumerate_children_finish (GFile *file, + GAsyncResult *res, + GError **error); +GFile * g_file_set_display_name (GFile *file, + const char *display_name, + GCancellable *cancellable, + GError **error); +void g_file_set_display_name_async (GFile *file, + const char *display_name, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFile * g_file_set_display_name_finish (GFile *file, + GAsyncResult *res, + GError **error); +gboolean g_file_delete (GFile *file, + GCancellable *cancellable, + GError **error); +gboolean g_file_trash (GFile *file, + GCancellable *cancellable, + GError **error); +gboolean g_file_copy (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error); +void g_file_copy_async (GFile *source, + GFile *destination, + GFileCopyFlags flags, + int io_priority, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_copy_finish (GFile *file, + GAsyncResult *res, + GError **error); +gboolean g_file_move (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error); +gboolean g_file_make_directory (GFile *file, + GCancellable *cancellable, + GError **error); +gboolean g_file_make_directory_with_parents (GFile *file, + GCancellable *cancellable, + GError **error); +gboolean g_file_make_symbolic_link (GFile *file, + const char *symlink_value, + GCancellable *cancellable, + GError **error); +GFileAttributeInfoList *g_file_query_settable_attributes (GFile *file, + GCancellable *cancellable, + GError **error); +GFileAttributeInfoList *g_file_query_writable_namespaces (GFile *file, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attribute (GFile *file, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attributes_from_info (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_set_attributes_async (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_set_attributes_finish (GFile *file, + GAsyncResult *result, + GFileInfo **info, + GError **error); +gboolean g_file_set_attribute_string (GFile *file, + const char *attribute, + const char *value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attribute_byte_string (GFile *file, + const char *attribute, + const char *value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attribute_uint32 (GFile *file, + const char *attribute, + guint32 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attribute_int32 (GFile *file, + const char *attribute, + gint32 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attribute_uint64 (GFile *file, + const char *attribute, + guint64 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_file_set_attribute_int64 (GFile *file, + const char *attribute, + gint64 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +void g_file_mount_enclosing_volume (GFile *location, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_mount_enclosing_volume_finish (GFile *location, + GAsyncResult *result, + GError **error); +void g_file_mount_mountable (GFile *file, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFile * g_file_mount_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +#ifndef G_DISABLE_DEPRECATED +void g_file_unmount_mountable (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_unmount_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +#endif +void g_file_unmount_mountable_with_operation (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_unmount_mountable_with_operation_finish (GFile *file, + GAsyncResult *result, + GError **error); +#ifndef G_DISABLE_DEPRECATED +void g_file_eject_mountable (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_eject_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +#endif +void g_file_eject_mountable_with_operation (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_eject_mountable_with_operation_finish (GFile *file, + GAsyncResult *result, + GError **error); + +gboolean g_file_copy_attributes (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GError **error); + + +GFileMonitor* g_file_monitor_directory (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); +GFileMonitor* g_file_monitor_file (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); +GFileMonitor* g_file_monitor (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); + +void g_file_start_mountable (GFile *file, + GDriveStartFlags flags, + GMountOperation *start_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_start_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +void g_file_stop_mountable (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_stop_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); + +void g_file_poll_mountable (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_poll_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); + +/* Utilities */ + +GAppInfo *g_file_query_default_handler (GFile *file, + GCancellable *cancellable, + GError **error); +gboolean g_file_load_contents (GFile *file, + GCancellable *cancellable, + char **contents, + gsize *length, + char **etag_out, + GError **error); +void g_file_load_contents_async (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_load_contents_finish (GFile *file, + GAsyncResult *res, + char **contents, + gsize *length, + char **etag_out, + GError **error); +void g_file_load_partial_contents_async (GFile *file, + GCancellable *cancellable, + GFileReadMoreCallback read_more_callback, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_load_partial_contents_finish (GFile *file, + GAsyncResult *res, + char **contents, + gsize *length, + char **etag_out, + GError **error); +gboolean g_file_replace_contents (GFile *file, + const char *contents, + gsize length, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + char **new_etag, + GCancellable *cancellable, + GError **error); +void g_file_replace_contents_async (GFile *file, + const char *contents, + gsize length, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_replace_contents_finish (GFile *file, + GAsyncResult *res, + char **new_etag, + GError **error); + +gboolean g_file_supports_thread_contexts (GFile *file); + +G_END_DECLS + +#endif /* __G_FILE_H__ */ diff --git a/gio/gfileattribute-priv.h b/gio/gfileattribute-priv.h new file mode 100644 index 0000000..731c50b --- /dev/null +++ b/gio/gfileattribute-priv.h @@ -0,0 +1,93 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_FILE_ATTRIBUTE_PRIV_H__ +#define __G_FILE_ATTRIBUTE_PRIV_H__ + +#include "gfileattribute.h" +#include "gfileinfo.h" + +#define G_FILE_ATTRIBUTE_VALUE_INIT {0} + +typedef struct { + GFileAttributeType type : 8; + GFileAttributeStatus status : 8; + union { + gboolean boolean; + gint32 int32; + guint32 uint32; + gint64 int64; + guint64 uint64; + char *string; + GObject *obj; + char **stringv; + } u; +} GFileAttributeValue; + +GFileAttributeValue *_g_file_attribute_value_new (void); +void _g_file_attribute_value_free (GFileAttributeValue *attr); +void _g_file_attribute_value_clear (GFileAttributeValue *attr); +void _g_file_attribute_value_set (GFileAttributeValue *attr, + const GFileAttributeValue *new_value); +GFileAttributeValue *_g_file_attribute_value_dup (const GFileAttributeValue *other); +gpointer _g_file_attribute_value_peek_as_pointer (GFileAttributeValue *attr); + +char * _g_file_attribute_value_as_string (const GFileAttributeValue *attr); + +const char * _g_file_attribute_value_get_string (const GFileAttributeValue *attr); +const char * _g_file_attribute_value_get_byte_string (const GFileAttributeValue *attr); +gboolean _g_file_attribute_value_get_boolean (const GFileAttributeValue *attr); +guint32 _g_file_attribute_value_get_uint32 (const GFileAttributeValue *attr); +gint32 _g_file_attribute_value_get_int32 (const GFileAttributeValue *attr); +guint64 _g_file_attribute_value_get_uint64 (const GFileAttributeValue *attr); +gint64 _g_file_attribute_value_get_int64 (const GFileAttributeValue *attr); +GObject * _g_file_attribute_value_get_object (const GFileAttributeValue *attr); +char ** _g_file_attribute_value_get_stringv (const GFileAttributeValue *attr); + +void _g_file_attribute_value_set_from_pointer(GFileAttributeValue *attr, + GFileAttributeType type, + gpointer value_p, + gboolean dup); +void _g_file_attribute_value_set_string (GFileAttributeValue *attr, + const char *string); +void _g_file_attribute_value_set_byte_string (GFileAttributeValue *attr, + const char *string); +void _g_file_attribute_value_set_boolean (GFileAttributeValue *attr, + gboolean value); +void _g_file_attribute_value_set_uint32 (GFileAttributeValue *attr, + guint32 value); +void _g_file_attribute_value_set_int32 (GFileAttributeValue *attr, + gint32 value); +void _g_file_attribute_value_set_uint64 (GFileAttributeValue *attr, + guint64 value); +void _g_file_attribute_value_set_int64 (GFileAttributeValue *attr, + gint64 value); +void _g_file_attribute_value_set_object (GFileAttributeValue *attr, + GObject *obj); +void _g_file_attribute_value_set_stringv (GFileAttributeValue *attr, + char **value); + + +GFileAttributeValue *_g_file_info_get_attribute_value (GFileInfo *info, + const char *attribute); + +#endif /* __G_FILE_ATTRIBUTE_PRIV_H__ */ diff --git a/gio/gfileattribute.c b/gio/gfileattribute.c new file mode 100644 index 0000000..0aad1a7 --- /dev/null +++ b/gio/gfileattribute.c @@ -0,0 +1,1073 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gfileattribute.h" +#include "gfileattribute-priv.h" +#include +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfileattribute + * @short_description: Key-Value Paired File Attributes + * @include: gio/gio.h + * @see_also: #GFile, #GFileInfo + * + * File attributes in GIO consist of a list of key-value pairs. + * + * Keys are strings that contain a key namespace and a key name, separated + * by a colon, e.g. "namespace:keyname". Namespaces are included to sort + * key-value pairs by namespaces for relevance. Keys can be retrived + * using wildcards, e.g. "standard::*" will return all of the keys in the + * "standard" namespace. + * + * Values are stored within the list in #GFileAttributeValue structures. + * Values can store different types, listed in the enum #GFileAttributeType. + * Upon creation of a #GFileAttributeValue, the type will be set to + * %G_FILE_ATTRIBUTE_TYPE_INVALID. + * + * The list of possible attributes for a filesystem (pointed to by a #GFile) is + * availible as a #GFileAttributeInfoList. This list is queryable by key names + * as indicated earlier. + * + * Classes that implement #GFileIface will create a #GFileAttributeInfoList and + * install default keys and values for their given file system, architecture, + * and other possible implementation details (e.g., on a UNIX system, a file + * attribute key will be registered for the user id for a given file). + * + * + * + * GFileAttributes Default Namespaces + * + * NamspaceDescription + * + * + * "standard"The "Standard" namespace. General file + * information that any application may need should be put in this namespace. + * Examples include the file's name, type, and size. + * "etag"The "Entity Tag" + * namespace. Currently, the only key in this namespace is "value", which contains + * the value of the current entity tag. + * "id"The "Identification" namespace. This + * namespace is used by file managers and applications that list directories + * to check for loops and to uniquely identify files. + * "access"The "Access" namespace. Used to check + * if a user has the proper privilidges to access files and perform + * file operations. Keys in this namespace are made to be generic + * and easily understood, e.g. the "can_read" key is %TRUE if + * the current user has permission to read the file. UNIX permissions and + * NTFS ACLs in Windows should be mapped to these values. + * "mountable"The "Mountable" namespace. Includes + * simple boolean keys for checking if a file or path supports mount operations, e.g. + * mount, unmount, eject. These are used for files of type %G_FILE_TYPE_MOUNTABLE. + * "time"The "Time" namespace. Includes file + * access, changed, created times. + * "unix"The "Unix" namespace. Includes UNIX-specific + * information and may not be available for all files. Examples include + * the UNIX "UID", "GID", etc. + * "dos"The "DOS" namespace. Includes DOS-specific + * information and may not be available for all files. Examples include + * "is_system" for checking if a file is marked as a system file, and "is_archive" + * for checking if a file is marked as an archive file. + * "owner"The "Owner" namespace. Includes information + * about who owns a file. May not be available for all file systems. Examples include + * "user" for getting the user name of the file owner. This information is often mapped from + * some backend specific data such as a unix UID. + * "thumbnail"The "Thumbnail" namespace. Includes + * information about file thumbnails and their location within the file system. Exaples of + * keys in this namespace include "path" to get the location of a thumbnail, and "failed" + * to check if thumbnailing of the file failed. + * "filesystem"The "Filesystem" namespace. Gets information + * about the file system where a file is located, such as its type, how much + * space is left available, and the overall size of the file system. + * "gvfs"The "GVFS" namespace. Keys in this namespace + * contain information about the current GVFS backend in use. + * "xattr"The "xattr" namespace. Gets information + * about extended user attributes. See attr(5). The "user." prefix of the + * extended user attribute name is stripped away when constructing keys in + * this namespace, e.g. "xattr::mime_type" for the extended attribute with + * the name "user.mime_type". Note that this information is only available + * if GLib has been built with extended attribute support. + * "xattr-sys"The "xattr-sys" namespace. + * Gets information about extended attributes which are not user-specific. + * See attr(5). Note that this information is only available if GLib + * has been built with extended attribute support. + * "selinux"The "SELinux" namespace. Includes + * information about the SELinux context of files. Note that this information + * is only available if GLib has been built with SELinux support. + * + * + *
+ *
+ * + * Please note that these are not all of the possible namespaces. + * More namespaces can be added from GIO modules or by individual applications. + * For more information about writing GIO modules, see #GIOModule. + * + * + * + * + * GFileAttributes Built-in Keys and Value Types + * + * Enum ValueNamespace:KeyValue Type + * + * %G_FILE_ATTRIBUTE_STANDARD_TYPEstandard::typeuint32 (#GFileType) + * %G_FILE_ATTRIBUTE_STANDARD_IS_HIDDENstandard::is-hiddenboolean + * %G_FILE_ATTRIBUTE_STANDARD_IS_BACKUPstandard::is-backupboolean + * %G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINKstandard::is-symlinkboolean + * %G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUALstandard::is-virtualboolean + * %G_FILE_ATTRIBUTE_STANDARD_NAMEstandard::namebyte string + * %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAMEstandard::display-namestring + * %G_FILE_ATTRIBUTE_STANDARD_EDIT_NAMEstandard::edit-namestring + * %G_FILE_ATTRIBUTE_STANDARD_ICONstandard::iconobject (#GIcon) + * %G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPEstandard::content-typestring + * %G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPEstandard::fast-content-typestring + * %G_FILE_ATTRIBUTE_STANDARD_SIZEstandard::sizeuint64 + * %G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZEstandard::allocated-sizeuint64 + * %G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGETstandard::symlink-targetbyte string + * %G_FILE_ATTRIBUTE_STANDARD_TARGET_URIstandard::target-uristring + * %G_FILE_ATTRIBUTE_STANDARD_SORT_ORDERstandard::sort-orderint32 + * %G_FILE_ATTRIBUTE_ETAG_VALUEetag::valuestring + * %G_FILE_ATTRIBUTE_ID_FILEid::filestring + * %G_FILE_ATTRIBUTE_ID_FILESYSTEMid::filesystemstring + * %G_FILE_ATTRIBUTE_ACCESS_CAN_READaccess::can-readboolean + * %G_FILE_ATTRIBUTE_ACCESS_CAN_WRITEaccess::can-writeboolean + * %G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTEaccess::can-executeboolean + * %G_FILE_ATTRIBUTE_ACCESS_CAN_DELETEaccess::can-deleteboolean + * %G_FILE_ATTRIBUTE_ACCESS_CAN_TRASHaccess::can-trashboolean + * %G_FILE_ATTRIBUTE_ACCESS_CAN_RENAMEaccess::can-renameboolean + * %G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNTmountable::can-mountboolean + * %G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNTmountable::can-unmountboolean + * %G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECTmountable::can-ejectboolean + * %G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICEmountable::unix-deviceuint32 + * %G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILEmountable::unix-device-filestring + * %G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDImountable::hal-udistring + * %G_FILE_ATTRIBUTE_TIME_MODIFIEDtime::modifieduint64 + * %G_FILE_ATTRIBUTE_TIME_MODIFIED_USECtime::modified-usecuint32 + * %G_FILE_ATTRIBUTE_TIME_ACCESStime::accessuint64 + * %G_FILE_ATTRIBUTE_TIME_ACCESS_USECtime::access-usecuint32 + * %G_FILE_ATTRIBUTE_TIME_CHANGEDtime::changeduint64 + * %G_FILE_ATTRIBUTE_TIME_CHANGED_USECtime::changed-usecuint32 + * %G_FILE_ATTRIBUTE_TIME_CREATEDtime::createduint64 + * %G_FILE_ATTRIBUTE_TIME_CREATED_USECtime::created-usecuint32 + * %G_FILE_ATTRIBUTE_UNIX_DEVICEunix::deviceuint32 + * %G_FILE_ATTRIBUTE_UNIX_INODEunix::inodeuint64 + * %G_FILE_ATTRIBUTE_UNIX_MODEunix::modeuint32 + * %G_FILE_ATTRIBUTE_UNIX_NLINKunix::nlinkuint32 + * %G_FILE_ATTRIBUTE_UNIX_UIDunix::uiduint32 + * %G_FILE_ATTRIBUTE_UNIX_GIDunix::giduint32 + * %G_FILE_ATTRIBUTE_UNIX_RDEVunix::rdevuint32 + * %G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZEunix::block-sizeuint32 + * %G_FILE_ATTRIBUTE_UNIX_BLOCKSunix::blocksuint64 + * %G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINTunix::is-mountpointboolean + * %G_FILE_ATTRIBUTE_DOS_IS_ARCHIVEdos::is-archiveboolean + * %G_FILE_ATTRIBUTE_DOS_IS_SYSTEMdos::is-systemboolean + * %G_FILE_ATTRIBUTE_OWNER_USERowner::userstring + * %G_FILE_ATTRIBUTE_OWNER_USER_REALowner::user-realstring + * %G_FILE_ATTRIBUTE_OWNER_GROUPowner::groupstring + * %G_FILE_ATTRIBUTE_THUMBNAIL_PATHthumbnail::pathbytestring + * %G_FILE_ATTRIBUTE_THUMBNAILING_FAILEDthumbnail::failedboolean + * %G_FILE_ATTRIBUTE_PREVIEW_ICONpreview::iconobject (#GIcon) + * %G_FILE_ATTRIBUTE_FILESYSTEM_SIZEfilesystem::sizeuint64 + * %G_FILE_ATTRIBUTE_FILESYSTEM_FREEfilesystem::freeuint64 + * %G_FILE_ATTRIBUTE_FILESYSTEM_TYPEfilesystem::typestring + * %G_FILE_ATTRIBUTE_FILESYSTEM_READONLYfilesystem::readonlyboolean + * %G_FILE_ATTRIBUTE_GVFS_BACKENDgvfs::backendstring + * %G_FILE_ATTRIBUTE_SELINUX_CONTEXTselinux::contextstring + *
+ * + * Note that there are no predefined keys in the "xattr" and "xattr-sys" + * namespaces. Keys for the "xattr" namespace are constructed by stripping + * away the "user." prefix from the extended user attribute, and prepending + * "xattr::". Keys for the "xattr-sys" namespace are constructed by + * concatenating "xattr-sys::" with the extended attribute name. All extended + * attribute values are returned as hex-encoded strings in which bytes outside + * the ASCII range are encoded as hexadecimal escape sequences of the form + * \xnn. + **/ + +/* + * _g_file_attribute_value_free: + * @attr: a #GFileAttributeValue. + * + * Frees the memory used by @attr. + * + **/ +void +_g_file_attribute_value_free (GFileAttributeValue *attr) +{ + g_return_if_fail (attr != NULL); + + _g_file_attribute_value_clear (attr); + g_free (attr); +} + +/* + * _g_file_attribute_value_clear: + * @attr: a #GFileAttributeValue. + * + * Clears the value of @attr and sets its type to + * %G_FILE_ATTRIBUTE_TYPE_INVALID. + * + **/ +void +_g_file_attribute_value_clear (GFileAttributeValue *attr) +{ + g_return_if_fail (attr != NULL); + + if (attr->type == G_FILE_ATTRIBUTE_TYPE_STRING || + attr->type == G_FILE_ATTRIBUTE_TYPE_BYTE_STRING) + g_free (attr->u.string); + + if (attr->type == G_FILE_ATTRIBUTE_TYPE_STRINGV) + g_strfreev (attr->u.stringv); + + if (attr->type == G_FILE_ATTRIBUTE_TYPE_OBJECT && + attr->u.obj != NULL) + g_object_unref (attr->u.obj); + + attr->type = G_FILE_ATTRIBUTE_TYPE_INVALID; +} + +/* + * g_file_attribute_value_set: + * @attr: a #GFileAttributeValue to set the value in. + * @new_value: a #GFileAttributeValue to get the value from. + * + * Sets an attribute's value from another attribute. + **/ +void +_g_file_attribute_value_set (GFileAttributeValue *attr, + const GFileAttributeValue *new_value) +{ + g_return_if_fail (attr != NULL); + g_return_if_fail (new_value != NULL); + + _g_file_attribute_value_clear (attr); + *attr = *new_value; + + if (attr->type == G_FILE_ATTRIBUTE_TYPE_STRING || + attr->type == G_FILE_ATTRIBUTE_TYPE_BYTE_STRING) + attr->u.string = g_strdup (attr->u.string); + + if (attr->type == G_FILE_ATTRIBUTE_TYPE_STRINGV) + attr->u.stringv = g_strdupv (attr->u.stringv); + + if (attr->type == G_FILE_ATTRIBUTE_TYPE_OBJECT && + attr->u.obj != NULL) + g_object_ref (attr->u.obj); +} + +/* + * _g_file_attribute_value_new: + * + * Creates a new file attribute. + * + * Returns: a #GFileAttributeValue. + **/ +GFileAttributeValue * +_g_file_attribute_value_new (void) +{ + GFileAttributeValue *attr; + + attr = g_new (GFileAttributeValue, 1); + attr->type = G_FILE_ATTRIBUTE_TYPE_INVALID; + return attr; +} + +gpointer +_g_file_attribute_value_peek_as_pointer (GFileAttributeValue *attr) +{ + switch (attr->type) { + case G_FILE_ATTRIBUTE_TYPE_STRING: + case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING: + return attr->u.string; + case G_FILE_ATTRIBUTE_TYPE_STRINGV: + return attr->u.stringv; + case G_FILE_ATTRIBUTE_TYPE_OBJECT: + return attr->u.obj; + default: + return (gpointer) &attr->u; + } +} + +/* + * g_file_attribute_value_dup: + * @other: a #GFileAttributeValue to duplicate. + * + * Duplicates a file attribute. + * + * Returns: a duplicate of the @other. + **/ +GFileAttributeValue * +_g_file_attribute_value_dup (const GFileAttributeValue *other) +{ + GFileAttributeValue *attr; + + g_return_val_if_fail (other != NULL, NULL); + + attr = g_new (GFileAttributeValue, 1); + attr->type = G_FILE_ATTRIBUTE_TYPE_INVALID; + _g_file_attribute_value_set (attr, other); + return attr; +} + +GType +g_file_attribute_info_list_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + GType g_define_type_id = + g_boxed_type_register_static (I_("GFileAttributeInfoList"), + (GBoxedCopyFunc) g_file_attribute_info_list_dup, + (GBoxedFreeFunc) g_file_attribute_info_list_unref); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +static gboolean +valid_char (char c) +{ + return c >= 32 && c <= 126 && c != '\\'; +} + +static char * +escape_byte_string (const char *str) +{ + size_t len; + int num_invalid, i; + char *escaped_val, *p; + unsigned char c; + const char hex_digits[] = "0123456789abcdef"; + + len = strlen (str); + + num_invalid = 0; + for (i = 0; i < len; i++) + { + if (!valid_char (str[i])) + num_invalid++; + } + + if (num_invalid == 0) + return g_strdup (str); + else + { + escaped_val = g_malloc (len + num_invalid*3 + 1); + + p = escaped_val; + for (i = 0; i < len; i++) + { + c = str[i]; + if (valid_char (c)) + *p++ = c; + else + { + *p++ = '\\'; + *p++ = 'x'; + *p++ = hex_digits[(c >> 4) & 0xf]; + *p++ = hex_digits[c & 0xf]; + } + } + *p++ = 0; + return escaped_val; + } +} + +/* + * _g_file_attribute_value_as_string: + * @attr: a #GFileAttributeValue. + * + * Converts a #GFileAttributeValue to a string for display. + * The returned string should be freed when no longer needed. + * + * Returns: a string from the @attr, %NULL on error, or "<invalid>" + * if @attr is of type %G_FILE_ATTRIBUTE_TYPE_INVALID. + */ +char * +_g_file_attribute_value_as_string (const GFileAttributeValue *attr) +{ + GString *s; + int i; + char *str; + + g_return_val_if_fail (attr != NULL, NULL); + + switch (attr->type) + { + case G_FILE_ATTRIBUTE_TYPE_STRING: + str = g_strdup (attr->u.string); + break; + case G_FILE_ATTRIBUTE_TYPE_STRINGV: + s = g_string_new ("["); + for (i = 0; attr->u.stringv[i] != NULL; i++) + { + g_string_append (s, attr->u.stringv[i]); + if (attr->u.stringv[i+1] != NULL) + g_string_append (s, ", "); + } + g_string_append (s, "]"); + str = g_string_free (s, FALSE); + break; + case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING: + str = escape_byte_string (attr->u.string); + break; + case G_FILE_ATTRIBUTE_TYPE_BOOLEAN: + str = g_strdup_printf ("%s", attr->u.boolean?"TRUE":"FALSE"); + break; + case G_FILE_ATTRIBUTE_TYPE_UINT32: + str = g_strdup_printf ("%u", (unsigned int)attr->u.uint32); + break; + case G_FILE_ATTRIBUTE_TYPE_INT32: + str = g_strdup_printf ("%i", (int)attr->u.int32); + break; + case G_FILE_ATTRIBUTE_TYPE_UINT64: + str = g_strdup_printf ("%"G_GUINT64_FORMAT, attr->u.uint64); + break; + case G_FILE_ATTRIBUTE_TYPE_INT64: + str = g_strdup_printf ("%"G_GINT64_FORMAT, attr->u.int64); + break; + case G_FILE_ATTRIBUTE_TYPE_OBJECT: + str = g_strdup_printf ("%s:%p", g_type_name_from_instance + ((GTypeInstance *) attr->u.obj), + attr->u.obj); + break; + case G_FILE_ATTRIBUTE_TYPE_INVALID: + str = g_strdup (""); + break; + default: + g_warning ("Invalid type in GFileInfo attribute"); + str = g_strdup (""); + break; + } + + return str; +} + +/* + * _g_file_attribute_value_get_string: + * @attr: a #GFileAttributeValue. + * + * Gets the string from a file attribute value. If the value is not the + * right type then %NULL will be returned. + * + * Returns: the string value contained within the attribute, or %NULL. + */ +const char * +_g_file_attribute_value_get_string (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return NULL; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_STRING, NULL); + + return attr->u.string; +} + +/* + * _g_file_attribute_value_get_byte_string: + * @attr: a #GFileAttributeValue. + * + * Gets the byte string from a file attribute value. If the value is not the + * right type then %NULL will be returned. + * + * Returns: the byte string contained within the attribute or %NULL. + */ +const char * +_g_file_attribute_value_get_byte_string (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return NULL; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, NULL); + + return attr->u.string; +} + +char ** +_g_file_attribute_value_get_stringv (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return NULL; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_STRINGV, NULL); + + return attr->u.stringv; +} + +/* + * _g_file_attribute_value_get_boolean: + * @attr: a #GFileAttributeValue. + * + * Gets the boolean value from a file attribute value. If the value is not the + * right type then %FALSE will be returned. + * + * Returns: the boolean value contained within the attribute, or %FALSE. + */ +gboolean +_g_file_attribute_value_get_boolean (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return FALSE; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_BOOLEAN, FALSE); + + return attr->u.boolean; +} + +/* + * _g_file_attribute_value_get_uint32: + * @attr: a #GFileAttributeValue. + * + * Gets the unsigned 32-bit integer from a file attribute value. If the value + * is not the right type then 0 will be returned. + * + * Returns: the unsigned 32-bit integer from the attribute, or 0. + */ +guint32 +_g_file_attribute_value_get_uint32 (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return 0; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_UINT32, 0); + + return attr->u.uint32; +} + +/* + * _g_file_attribute_value_get_int32: + * @attr: a #GFileAttributeValue. + * + * Gets the signed 32-bit integer from a file attribute value. If the value + * is not the right type then 0 will be returned. + * + * Returns: the signed 32-bit integer from the attribute, or 0. + */ +gint32 +_g_file_attribute_value_get_int32 (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return 0; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_INT32, 0); + + return attr->u.int32; +} + +/* + * _g_file_attribute_value_get_uint64: + * @attr: a #GFileAttributeValue. + * + * Gets the unsigned 64-bit integer from a file attribute value. If the value + * is not the right type then 0 will be returned. + * + * Returns: the unsigned 64-bit integer from the attribute, or 0. + */ +guint64 +_g_file_attribute_value_get_uint64 (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return 0; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_UINT64, 0); + + return attr->u.uint64; +} + +/* + * _g_file_attribute_value_get_int64: + * @attr: a #GFileAttributeValue. + * + * Gets the signed 64-bit integer from a file attribute value. If the value + * is not the right type then 0 will be returned. + * + * Returns: the signed 64-bit integer from the attribute, or 0. + */ +gint64 +_g_file_attribute_value_get_int64 (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return 0; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_INT64, 0); + + return attr->u.int64; +} + +/* + * _g_file_attribute_value_get_object: + * @attr: a #GFileAttributeValue. + * + * Gets the GObject from a file attribute value. If the value + * is not the right type then %NULL will be returned. + * + * Returns: the GObject from the attribute, or %NULL. + **/ +GObject * +_g_file_attribute_value_get_object (const GFileAttributeValue *attr) +{ + if (attr == NULL) + return NULL; + + g_return_val_if_fail (attr->type == G_FILE_ATTRIBUTE_TYPE_OBJECT, NULL); + + return attr->u.obj; +} + + +void +_g_file_attribute_value_set_from_pointer (GFileAttributeValue *value, + GFileAttributeType type, + gpointer value_p, + gboolean dup) +{ + _g_file_attribute_value_clear (value); + value->type = type; + switch (type) + { + case G_FILE_ATTRIBUTE_TYPE_STRING: + case G_FILE_ATTRIBUTE_TYPE_BYTE_STRING: + if (dup) + value->u.string = g_strdup (value_p); + else + value->u.string = value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_STRINGV: + if (dup) + value->u.stringv = g_strdupv (value_p); + else + value->u.stringv = value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_OBJECT: + if (dup) + value->u.obj = g_object_ref (value_p); + else + value->u.obj = value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_BOOLEAN: + value->u.boolean = *(gboolean *)value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_UINT32: + value->u.uint32 = *(guint32 *)value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_INT32: + value->u.int32 = *(gint32 *)value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_UINT64: + value->u.uint64 = *(guint64 *)value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_INT64: + value->u.int64 = *(gint64 *)value_p; + break; + + case G_FILE_ATTRIBUTE_TYPE_INVALID: + break; + + default: + g_warning ("Unknown type specified in g_file_info_set_attribute\n"); + break; + } +} + +/* + * _g_file_attribute_value_set_string: + * @attr: a #GFileAttributeValue. + * @string: a string to set within the type. + * + * Sets the attribute value to a given string. + */ +void +_g_file_attribute_value_set_string (GFileAttributeValue *attr, + const char *string) +{ + g_return_if_fail (attr != NULL); + g_return_if_fail (string != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_STRING; + attr->u.string = g_strdup (string); +} + +/* + * _g_file_attribute_value_set_byte_string: + * @attr: a #GFileAttributeValue. + * @string: a byte string to set within the type. + * + * Sets the attribute value to a given byte string. + */ +void +_g_file_attribute_value_set_byte_string (GFileAttributeValue *attr, + const char *string) +{ + g_return_if_fail (attr != NULL); + g_return_if_fail (string != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_BYTE_STRING; + attr->u.string = g_strdup (string); +} + +void +_g_file_attribute_value_set_stringv (GFileAttributeValue *attr, + char **value) +{ + g_return_if_fail (attr != NULL); + g_return_if_fail (value != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_STRINGV; + attr->u.stringv = g_strdupv (value); +} + + +/* + * _g_file_attribute_value_set_boolean: + * @attr: a #GFileAttributeValue. + * @value: a #gboolean to set within the type. + * + * Sets the attribute value to the given boolean value. + */ +void +_g_file_attribute_value_set_boolean (GFileAttributeValue *attr, + gboolean value) +{ + g_return_if_fail (attr != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_BOOLEAN; + attr->u.boolean = !!value; +} + +/* + * _g_file_attribute_value_set_uint32: + * @attr: a #GFileAttributeValue. + * @value: a #guint32 to set within the type. + * + * Sets the attribute value to the given unsigned 32-bit integer. + */ +void +_g_file_attribute_value_set_uint32 (GFileAttributeValue *attr, + guint32 value) +{ + g_return_if_fail (attr != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_UINT32; + attr->u.uint32 = value; +} + +/* + * _g_file_attribute_value_set_int32: + * @attr: a #GFileAttributeValue. + * @value: a #gint32 to set within the type. + * + * Sets the attribute value to the given signed 32-bit integer. + */ +void +_g_file_attribute_value_set_int32 (GFileAttributeValue *attr, + gint32 value) +{ + g_return_if_fail (attr != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_INT32; + attr->u.int32 = value; +} + +/* + * _g_file_attribute_value_set_uint64: + * @attr: a #GFileAttributeValue. + * @value: a #guint64 to set within the type. + * + * Sets the attribute value to a given unsigned 64-bit integer. + */ +void +_g_file_attribute_value_set_uint64 (GFileAttributeValue *attr, + guint64 value) +{ + g_return_if_fail (attr != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_UINT64; + attr->u.uint64 = value; +} + +/* + * _g_file_attribute_value_set_int64: + * @attr: a #GFileAttributeValue. + * @value: a #gint64 to set within the type. + * + * Sets the attribute value to a given signed 64-bit integer. + */ +void +_g_file_attribute_value_set_int64 (GFileAttributeValue *attr, + gint64 value) +{ + g_return_if_fail (attr != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_INT64; + attr->u.int64 = value; +} + +/* + * _g_file_attribute_value_set_object: + * @attr: a #GFileAttributeValue. + * @obj: a #GObject. + * + * Sets the attribute to contain the value @obj. + * The @attr references the GObject internally. + */ +void +_g_file_attribute_value_set_object (GFileAttributeValue *attr, + GObject *obj) +{ + g_return_if_fail (attr != NULL); + g_return_if_fail (obj != NULL); + + _g_file_attribute_value_clear (attr); + attr->type = G_FILE_ATTRIBUTE_TYPE_OBJECT; + attr->u.obj = g_object_ref (obj); +} + +typedef struct { + GFileAttributeInfoList public; + GArray *array; + int ref_count; +} GFileAttributeInfoListPriv; + +static void +list_update_public (GFileAttributeInfoListPriv *priv) +{ + priv->public.infos = (GFileAttributeInfo *)priv->array->data; + priv->public.n_infos = priv->array->len; +} + +/** + * g_file_attribute_info_list_new: + * + * Creates a new file attribute info list. + * + * Returns: a #GFileAttributeInfoList. + */ +GFileAttributeInfoList * +g_file_attribute_info_list_new (void) +{ + GFileAttributeInfoListPriv *priv; + + priv = g_new0 (GFileAttributeInfoListPriv, 1); + + priv->ref_count = 1; + priv->array = g_array_new (TRUE, FALSE, sizeof (GFileAttributeInfo)); + + list_update_public (priv); + + return (GFileAttributeInfoList *)priv; +} + +/** + * g_file_attribute_info_list_dup: + * @list: a #GFileAttributeInfoList to duplicate. + * + * Makes a duplicate of a file attribute info list. + * + * Returns: a copy of the given @list. + */ +GFileAttributeInfoList * +g_file_attribute_info_list_dup (GFileAttributeInfoList *list) +{ + GFileAttributeInfoListPriv *new; + int i; + + g_return_val_if_fail (list != NULL, NULL); + + new = g_new0 (GFileAttributeInfoListPriv, 1); + new->ref_count = 1; + new->array = g_array_new (TRUE, FALSE, sizeof (GFileAttributeInfo)); + + g_array_set_size (new->array, list->n_infos); + list_update_public (new); + for (i = 0; i < list->n_infos; i++) + { + new->public.infos[i].name = g_strdup (list->infos[i].name); + new->public.infos[i].type = list->infos[i].type; + new->public.infos[i].flags = list->infos[i].flags; + } + + return (GFileAttributeInfoList *)new; +} + +/** + * g_file_attribute_info_list_ref: + * @list: a #GFileAttributeInfoList to reference. + * + * References a file attribute info list. + * + * Returns: #GFileAttributeInfoList or %NULL on error. + */ +GFileAttributeInfoList * +g_file_attribute_info_list_ref (GFileAttributeInfoList *list) +{ + GFileAttributeInfoListPriv *priv = (GFileAttributeInfoListPriv *)list; + + g_return_val_if_fail (list != NULL, NULL); + g_return_val_if_fail (priv->ref_count > 0, NULL); + + g_atomic_int_inc (&priv->ref_count); + + return list; +} + +/** + * g_file_attribute_info_list_unref: + * @list: The #GFileAttributeInfoList to unreference. + * + * Removes a reference from the given @list. If the reference count + * falls to zero, the @list is deleted. + */ +void +g_file_attribute_info_list_unref (GFileAttributeInfoList *list) +{ + GFileAttributeInfoListPriv *priv = (GFileAttributeInfoListPriv *)list; + int i; + + g_return_if_fail (list != NULL); + g_return_if_fail (priv->ref_count > 0); + + if (g_atomic_int_dec_and_test (&priv->ref_count)) + { + for (i = 0; i < list->n_infos; i++) + g_free (list->infos[i].name); + g_array_free (priv->array, TRUE); + } +} + +static int +g_file_attribute_info_list_bsearch (GFileAttributeInfoList *list, + const char *name) +{ + int start, end, mid; + + start = 0; + end = list->n_infos; + + while (start != end) + { + mid = start + (end - start) / 2; + + if (strcmp (name, list->infos[mid].name) < 0) + end = mid; + else if (strcmp (name, list->infos[mid].name) > 0) + start = mid + 1; + else + return mid; + } + return start; +} + +/** + * g_file_attribute_info_list_lookup: + * @list: a #GFileAttributeInfoList. + * @name: the name of the attribute to lookup. + * + * Gets the file attribute with the name @name from @list. + * + * Returns: a #GFileAttributeInfo for the @name, or %NULL if an + * attribute isn't found. + */ +const GFileAttributeInfo * +g_file_attribute_info_list_lookup (GFileAttributeInfoList *list, + const char *name) +{ + int i; + + g_return_val_if_fail (list != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + i = g_file_attribute_info_list_bsearch (list, name); + + if (i < list->n_infos && strcmp (list->infos[i].name, name) == 0) + return &list->infos[i]; + + return NULL; +} + +/** + * g_file_attribute_info_list_add: + * @list: a #GFileAttributeInfoList. + * @name: the name of the attribute to add. + * @type: the #GFileAttributeType for the attribute. + * @flags: #GFileAttributeInfoFlags for the attribute. + * + * Adds a new attribute with @name to the @list, setting + * its @type and @flags. + */ +void +g_file_attribute_info_list_add (GFileAttributeInfoList *list, + const char *name, + GFileAttributeType type, + GFileAttributeInfoFlags flags) +{ + GFileAttributeInfoListPriv *priv = (GFileAttributeInfoListPriv *)list; + GFileAttributeInfo info; + int i; + + g_return_if_fail (list != NULL); + g_return_if_fail (name != NULL); + + i = g_file_attribute_info_list_bsearch (list, name); + + if (i < list->n_infos && strcmp (list->infos[i].name, name) == 0) + { + list->infos[i].type = type; + return; + } + + info.name = g_strdup (name); + info.type = type; + info.flags = flags; + g_array_insert_vals (priv->array, i, &info, 1); + + list_update_public (priv); +} + +#define __G_FILE_ATTRIBUTE_C__ +#include "gioaliasdef.c" diff --git a/gio/gfileattribute.h b/gio/gfileattribute.h new file mode 100644 index 0000000..46803fb --- /dev/null +++ b/gio/gfileattribute.h @@ -0,0 +1,77 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_ATTRIBUTE_H__ +#define __G_FILE_ATTRIBUTE_H__ + +#include + +G_BEGIN_DECLS + +/** + * GFileAttributeInfo: + * @name: the name of the attribute. + * @type: the #GFileAttributeType type of the attribute. + * @flags: a set of #GFileAttributeInfoFlags. + * + * Information about a specific attribute. + **/ +struct _GFileAttributeInfo +{ + char *name; + GFileAttributeType type; + GFileAttributeInfoFlags flags; +}; + +/** + * GFileAttributeInfoList: + * @infos: an array of #GFileAttributeInfos. + * @n_infos: the number of values in the array. + * + * Acts as a lightweight registry for possible valid file attributes. + * The registry stores Key-Value pair formats as #GFileAttributeInfos. + **/ +struct _GFileAttributeInfoList +{ + GFileAttributeInfo *infos; + int n_infos; +}; + +GType g_file_attribute_info_list_get_type (void); +GFileAttributeInfoList * g_file_attribute_info_list_new (void); +GFileAttributeInfoList * g_file_attribute_info_list_ref (GFileAttributeInfoList *list); +void g_file_attribute_info_list_unref (GFileAttributeInfoList *list); +GFileAttributeInfoList * g_file_attribute_info_list_dup (GFileAttributeInfoList *list); +const GFileAttributeInfo *g_file_attribute_info_list_lookup (GFileAttributeInfoList *list, + const char *name); +void g_file_attribute_info_list_add (GFileAttributeInfoList *list, + const char *name, + GFileAttributeType type, + GFileAttributeInfoFlags flags); + +G_END_DECLS + +#endif /* __G_FILE_INFO_H__ */ diff --git a/gio/gfiledescriptorbased.c b/gio/gfiledescriptorbased.c new file mode 100644 index 0000000..c19da44 --- /dev/null +++ b/gio/gfiledescriptorbased.c @@ -0,0 +1,74 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Christian Kellner + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#include "config.h" +#include "gfiledescriptorbased.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfiledescriptorbased + * @short_description: Interface for file descriptor based IO + * @include: gio/gio.h + * @see_also: #GInputStream, #GOutputStream + * + * #GFileDescriptorBased is implemented by streams (implementations of + * #GInputStream or #GOutputStream) that are based on file descriptors. + * + * Since: 2.24 + * + **/ + +typedef GFileDescriptorBasedIface GFileDescriptorBasedInterface; +G_DEFINE_INTERFACE (GFileDescriptorBased, g_file_descriptor_based, G_TYPE_OBJECT) + +static void +g_file_descriptor_based_default_init (GFileDescriptorBasedInterface *iface) +{ +} + +/** + * g_file_descriptor_based_get_fd: + * @fd_based: a #GFileDescriptorBased. + * + * Gets the underlying file descriptor. + * + * Returns: The file descriptor + * + * Since: 2.24 + **/ +int +g_file_descriptor_based_get_fd (GFileDescriptorBased *fd_based) +{ + GFileDescriptorBasedIface *iface; + + g_return_val_if_fail (G_IS_FILE_DESCRIPTOR_BASED (fd_based), 0); + + iface = G_FILE_DESCRIPTOR_BASED_GET_IFACE (fd_based); + + return (* iface->get_fd) (fd_based); +} + + +#define __G_FILE_DESCRIPTOR_BASED_C__ +#include "gioaliasdef.c" diff --git a/gio/gfiledescriptorbased.h b/gio/gfiledescriptorbased.h new file mode 100644 index 0000000..3679286 --- /dev/null +++ b/gio/gfiledescriptorbased.h @@ -0,0 +1,63 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Christian Kellner + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#ifndef __G_FILE_DESCRIPTOR_BASED_H__ +#define __G_FILE_DESCRIPTOR_BASED_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_DESCRIPTOR_BASED (g_file_descriptor_based_get_type ()) +#define G_FILE_DESCRIPTOR_BASED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_FILE_DESCRIPTOR_BASED, GFileDescriptorBased)) +#define G_IS_FILE_DESCRIPTOR_BASED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_FILE_DESCRIPTOR_BASED)) +#define G_FILE_DESCRIPTOR_BASED_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_FILE_DESCRIPTOR_BASED, GFileDescriptorBasedIface)) + +/** + * GFileDescriptorBased: + * + * An interface for file descriptor based io objects. + **/ +typedef struct _GFileDescriptorBasedIface GFileDescriptorBasedIface; + +/** + * GFileDescriptorBasedIface: + * @g_iface: The parent interface. + * + **/ +struct _GFileDescriptorBasedIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + int (*get_fd) (GFileDescriptorBased *fd_based); +}; + +GType g_file_descriptor_based_get_type (void) G_GNUC_CONST; + +int g_file_descriptor_based_get_fd (GFileDescriptorBased *fd_based); + +G_END_DECLS + + +#endif /* __G_FILE_DESCRIPTOR_BASED_H__ */ + diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c new file mode 100644 index 0000000..f97ce91 --- /dev/null +++ b/gio/gfileenumerator.c @@ -0,0 +1,764 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gfileenumerator.h" +#include "gfile.h" +#include "gioscheduler.h" +#include "gasyncresult.h" +#include "gasynchelper.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfileenumerator + * @short_description: Enumerated Files Routines + * @include: gio/gio.h + * + * #GFileEnumerator allows you to operate on a set of #GFiles, + * returning a #GFileInfo structure for each file enumerated (e.g. + * g_file_enumerate_children() will return a #GFileEnumerator for each + * of the children within a directory). + * + * To get the next file's information from a #GFileEnumerator, use + * g_file_enumerator_next_file() or its asynchronous version, + * g_file_enumerator_next_files_async(). Note that the asynchronous + * version will return a list of #GFileInfos, whereas the + * synchronous will only return the next file in the enumerator. + * + * To close a #GFileEnumerator, use g_file_enumerator_close(), or + * its asynchronous version, g_file_enumerator_close_async(). Once + * a #GFileEnumerator is closed, no further actions may be performed + * on it, and it should be freed with g_object_unref(). + * + **/ + +G_DEFINE_TYPE (GFileEnumerator, g_file_enumerator, G_TYPE_OBJECT); + +struct _GFileEnumeratorPrivate { + /* TODO: Should be public for subclasses? */ + GFile *container; + guint closed : 1; + guint pending : 1; + GAsyncReadyCallback outstanding_callback; + GError *outstanding_error; +}; + +enum { + PROP_0, + PROP_CONTAINER +}; + +static void g_file_enumerator_real_next_files_async (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GList * g_file_enumerator_real_next_files_finish (GFileEnumerator *enumerator, + GAsyncResult *res, + GError **error); +static void g_file_enumerator_real_close_async (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_file_enumerator_real_close_finish (GFileEnumerator *enumerator, + GAsyncResult *res, + GError **error); + +static void +g_file_enumerator_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GFileEnumerator *enumerator; + + enumerator = G_FILE_ENUMERATOR (object); + + switch (property_id) { + case PROP_CONTAINER: + enumerator->priv->container = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_file_enumerator_dispose (GObject *object) +{ + GFileEnumerator *enumerator; + + enumerator = G_FILE_ENUMERATOR (object); + + if (enumerator->priv->container) { + g_object_unref (enumerator->priv->container); + enumerator->priv->container = NULL; + } + + G_OBJECT_CLASS (g_file_enumerator_parent_class)->dispose (object); +} + +static void +g_file_enumerator_finalize (GObject *object) +{ + GFileEnumerator *enumerator; + + enumerator = G_FILE_ENUMERATOR (object); + + if (!enumerator->priv->closed) + g_file_enumerator_close (enumerator, NULL, NULL); + + G_OBJECT_CLASS (g_file_enumerator_parent_class)->finalize (object); +} + +static void +g_file_enumerator_class_init (GFileEnumeratorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GFileEnumeratorPrivate)); + + gobject_class->set_property = g_file_enumerator_set_property; + gobject_class->dispose = g_file_enumerator_dispose; + gobject_class->finalize = g_file_enumerator_finalize; + + klass->next_files_async = g_file_enumerator_real_next_files_async; + klass->next_files_finish = g_file_enumerator_real_next_files_finish; + klass->close_async = g_file_enumerator_real_close_async; + klass->close_finish = g_file_enumerator_real_close_finish; + + g_object_class_install_property + (gobject_class, PROP_CONTAINER, + g_param_spec_object ("container", P_("Container"), + P_("The container that is being enumerated"), + G_TYPE_FILE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_file_enumerator_init (GFileEnumerator *enumerator) +{ + enumerator->priv = G_TYPE_INSTANCE_GET_PRIVATE (enumerator, + G_TYPE_FILE_ENUMERATOR, + GFileEnumeratorPrivate); +} + +/** + * g_file_enumerator_next_file: + * @enumerator: a #GFileEnumerator. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Returns information for the next file in the enumerated object. + * Will block until the information is available. The #GFileInfo + * returned from this function will contain attributes that match the + * attribute string that was passed when the #GFileEnumerator was created. + * + * On error, returns %NULL and sets @error to the error. If the + * enumerator is at the end, %NULL will be returned and @error will + * be unset. + * + * Return value: A #GFileInfo or %NULL on error or end of enumerator. + * Free the returned object with g_object_unref() when no longer needed. + **/ +GFileInfo * +g_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GFileEnumeratorClass *class; + GFileInfo *info; + + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); + g_return_val_if_fail (enumerator != NULL, NULL); + + if (enumerator->priv->closed) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Enumerator is closed")); + return NULL; + } + + if (enumerator->priv->pending) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + _("File enumerator has outstanding operation")); + return NULL; + } + + if (enumerator->priv->outstanding_error) + { + g_propagate_error (error, enumerator->priv->outstanding_error); + enumerator->priv->outstanding_error = NULL; + return NULL; + } + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + + if (cancellable) + g_cancellable_push_current (cancellable); + + enumerator->priv->pending = TRUE; + info = (* class->next_file) (enumerator, cancellable, error); + enumerator->priv->pending = FALSE; + + if (cancellable) + g_cancellable_pop_current (cancellable); + + return info; +} + +/** + * g_file_enumerator_close: + * @enumerator: a #GFileEnumerator. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Releases all resources used by this enumerator, making the + * enumerator return %G_IO_ERROR_CLOSED on all calls. + * + * This will be automatically called when the last reference + * is dropped, but you might want to call this function to make + * sure resources are released as early as possible. + * + * Return value: #TRUE on success or #FALSE on error. + **/ +gboolean +g_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GFileEnumeratorClass *class; + + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), FALSE); + g_return_val_if_fail (enumerator != NULL, FALSE); + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + + if (enumerator->priv->closed) + return TRUE; + + if (enumerator->priv->pending) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + _("File enumerator has outstanding operation")); + return FALSE; + } + + if (cancellable) + g_cancellable_push_current (cancellable); + + enumerator->priv->pending = TRUE; + (* class->close_fn) (enumerator, cancellable, error); + enumerator->priv->pending = FALSE; + enumerator->priv->closed = TRUE; + + if (cancellable) + g_cancellable_pop_current (cancellable); + + return TRUE; +} + +static void +next_async_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileEnumerator *enumerator = G_FILE_ENUMERATOR (source_object); + + enumerator->priv->pending = FALSE; + if (enumerator->priv->outstanding_callback) + (*enumerator->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (enumerator); +} + +/** + * g_file_enumerator_next_files_async: + * @enumerator: a #GFileEnumerator. + * @num_files: the number of file info objects to request + * @io_priority: the io priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Request information for a number of files from the enumerator asynchronously. + * When all i/o for the operation is finished the @callback will be called with + * the requested information. + * + * The callback can be called with less than @num_files files in case of error + * or at the end of the enumerator. In case of a partial error the callback will + * be called with any succeeding items and no error, and on the next request the + * error will be reported. If a request is cancelled the callback will be called + * with %G_IO_ERROR_CANCELLED. + * + * During an async request no other sync and async calls are allowed, and will + * result in %G_IO_ERROR_PENDING errors. + * + * Any outstanding i/o request with higher priority (lower numerical value) will + * be executed before an outstanding request with lower priority. Default + * priority is %G_PRIORITY_DEFAULT. + **/ +void +g_file_enumerator_next_files_async (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileEnumeratorClass *class; + GSimpleAsyncResult *simple; + + g_return_if_fail (G_IS_FILE_ENUMERATOR (enumerator)); + g_return_if_fail (enumerator != NULL); + g_return_if_fail (num_files >= 0); + + if (num_files == 0) + { + simple = g_simple_async_result_new (G_OBJECT (enumerator), + callback, + user_data, + g_file_enumerator_next_files_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (enumerator->priv->closed) + { + g_simple_async_report_error_in_idle (G_OBJECT (enumerator), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("File enumerator is already closed")); + return; + } + + if (enumerator->priv->pending) + { + g_simple_async_report_error_in_idle (G_OBJECT (enumerator), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_PENDING, + _("File enumerator has outstanding operation")); + return; + } + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + + enumerator->priv->pending = TRUE; + enumerator->priv->outstanding_callback = callback; + g_object_ref (enumerator); + (* class->next_files_async) (enumerator, num_files, io_priority, cancellable, + next_async_callback_wrapper, user_data); +} + +/** + * g_file_enumerator_next_files_finish: + * @enumerator: a #GFileEnumerator. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes the asynchronous operation started with g_file_enumerator_next_files_async(). + * + * Returns: a #GList of #GFileInfos. You must free the list with + * g_list_free() and unref the infos with g_object_unref() when you're + * done with them. + **/ +GList * +g_file_enumerator_next_files_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GFileEnumeratorClass *class; + GSimpleAsyncResult *simple; + + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + /* Special case read of 0 files */ + if (g_simple_async_result_get_source_tag (simple) == g_file_enumerator_next_files_async) + return NULL; + } + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + return class->next_files_finish (enumerator, result, error); +} + +static void +close_async_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileEnumerator *enumerator = G_FILE_ENUMERATOR (source_object); + + enumerator->priv->pending = FALSE; + enumerator->priv->closed = TRUE; + if (enumerator->priv->outstanding_callback) + (*enumerator->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (enumerator); +} + +/** + * g_file_enumerator_close_async: + * @enumerator: a #GFileEnumerator. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously closes the file enumerator. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned in + * g_file_enumerator_close_finish(). + **/ +void +g_file_enumerator_close_async (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileEnumeratorClass *class; + + g_return_if_fail (G_IS_FILE_ENUMERATOR (enumerator)); + + if (enumerator->priv->closed) + { + g_simple_async_report_error_in_idle (G_OBJECT (enumerator), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("File enumerator is already closed")); + return; + } + + if (enumerator->priv->pending) + { + g_simple_async_report_error_in_idle (G_OBJECT (enumerator), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_PENDING, + _("File enumerator has outstanding operation")); + return; + } + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + + enumerator->priv->pending = TRUE; + enumerator->priv->outstanding_callback = callback; + g_object_ref (enumerator); + (* class->close_async) (enumerator, io_priority, cancellable, + close_async_callback_wrapper, user_data); +} + +/** + * g_file_enumerator_close_finish: + * @enumerator: a #GFileEnumerator. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes closing a file enumerator, started from g_file_enumerator_close_async(). + * + * If the file enumerator was already closed when g_file_enumerator_close_async() + * was called, then this function will report %G_IO_ERROR_CLOSED in @error, and + * return %FALSE. If the file enumerator had pending operation when the close + * operation was started, then this function will report %G_IO_ERROR_PENDING, and + * return %FALSE. If @cancellable was not %NULL, then the operation may have been + * cancelled by triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be set, and %FALSE will be + * returned. + * + * Returns: %TRUE if the close operation has finished successfully. + **/ +gboolean +g_file_enumerator_close_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GFileEnumeratorClass *class; + + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + return class->close_finish (enumerator, result, error); +} + +/** + * g_file_enumerator_is_closed: + * @enumerator: a #GFileEnumerator. + * + * Checks if the file enumerator has been closed. + * + * Returns: %TRUE if the @enumerator is closed. + **/ +gboolean +g_file_enumerator_is_closed (GFileEnumerator *enumerator) +{ + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), TRUE); + + return enumerator->priv->closed; +} + +/** + * g_file_enumerator_has_pending: + * @enumerator: a #GFileEnumerator. + * + * Checks if the file enumerator has pending operations. + * + * Returns: %TRUE if the @enumerator has pending operations. + **/ +gboolean +g_file_enumerator_has_pending (GFileEnumerator *enumerator) +{ + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), TRUE); + + return enumerator->priv->pending; +} + +/** + * g_file_enumerator_set_pending: + * @enumerator: a #GFileEnumerator. + * @pending: a boolean value. + * + * Sets the file enumerator as having pending operations. + **/ +void +g_file_enumerator_set_pending (GFileEnumerator *enumerator, + gboolean pending) +{ + g_return_if_fail (G_IS_FILE_ENUMERATOR (enumerator)); + + enumerator->priv->pending = pending; +} + +/** + * g_file_enumerator_get_container: + * @enumerator: a #GFileEnumerator + * + * Get the #GFile container which is being enumerated. + * + * Returns: the #GFile which is being enumerated. + * + * Since: 2.18 + */ +GFile * +g_file_enumerator_get_container (GFileEnumerator *enumerator) +{ + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); + + return enumerator->priv->container; +} + +typedef struct { + int num_files; + GList *files; +} NextAsyncOp; + +static void +next_async_op_free (NextAsyncOp *op) +{ + /* Free the list, if finish wasn't called */ + g_list_foreach (op->files, (GFunc)g_object_unref, NULL); + g_list_free (op->files); + + g_free (op); +} + + + +static void +next_files_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + NextAsyncOp *op; + GFileEnumeratorClass *class; + GError *error = NULL; + GFileInfo *info; + GFileEnumerator *enumerator; + int i; + + enumerator = G_FILE_ENUMERATOR (object); + op = g_simple_async_result_get_op_res_gpointer (res); + + class = G_FILE_ENUMERATOR_GET_CLASS (object); + + for (i = 0; i < op->num_files; i++) + { + if (g_cancellable_set_error_if_cancelled (cancellable, &error)) + info = NULL; + else + info = class->next_file (enumerator, cancellable, &error); + + if (info == NULL) + { + /* If we get an error after first file, return that on next operation */ + if (error != NULL && i > 0) + { + if (error->domain == G_IO_ERROR && + error->code == G_IO_ERROR_CANCELLED) + g_error_free (error); /* Never propagate cancel errors to other call */ + else + enumerator->priv->outstanding_error = error; + error = NULL; + } + + break; + } + else + op->files = g_list_prepend (op->files, info); + } +} + +static void +g_file_enumerator_real_next_files_async (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + NextAsyncOp *op; + + op = g_new0 (NextAsyncOp, 1); + + op->num_files = num_files; + op->files = NULL; + + res = g_simple_async_result_new (G_OBJECT (enumerator), callback, user_data, g_file_enumerator_real_next_files_async); + g_simple_async_result_set_op_res_gpointer (res, op, (GDestroyNotify) next_async_op_free); + + g_simple_async_result_run_in_thread (res, next_files_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GList * +g_file_enumerator_real_next_files_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + NextAsyncOp *op; + GList *res; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_file_enumerator_real_next_files_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + + res = op->files; + op->files = NULL; + return res; +} + +static void +close_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileEnumeratorClass *class; + GError *error = NULL; + gboolean result; + + /* Auto handling of cancelation disabled, and ignore + cancellation, since we want to close things anyway, although + possibly in a quick-n-dirty way. At least we never want to leak + open handles */ + + class = G_FILE_ENUMERATOR_GET_CLASS (object); + result = class->close_fn (G_FILE_ENUMERATOR (object), cancellable, &error); + if (!result) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } +} + + +static void +g_file_enumerator_real_close_async (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (enumerator), + callback, + user_data, + g_file_enumerator_real_close_async); + + g_simple_async_result_set_handle_cancellation (res, FALSE); + + g_simple_async_result_run_in_thread (res, + close_async_thread, + io_priority, + cancellable); + g_object_unref (res); +} + +static gboolean +g_file_enumerator_real_close_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_file_enumerator_real_close_async); + return TRUE; +} + +#define __G_FILE_ENUMERATOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gfileenumerator.h b/gio/gfileenumerator.h new file mode 100644 index 0000000..1214b49 --- /dev/null +++ b/gio/gfileenumerator.h @@ -0,0 +1,133 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_ENUMERATOR_H__ +#define __G_FILE_ENUMERATOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_ENUMERATOR (g_file_enumerator_get_type ()) +#define G_FILE_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_ENUMERATOR, GFileEnumerator)) +#define G_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_ENUMERATOR, GFileEnumeratorClass)) +#define G_IS_FILE_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_ENUMERATOR)) +#define G_IS_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_ENUMERATOR)) +#define G_FILE_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_ENUMERATOR, GFileEnumeratorClass)) + +/** + * GFileEnumerator: + * @parent_instance: The parent class. + * + * A per matched file iterator. + **/ +typedef struct _GFileEnumeratorClass GFileEnumeratorClass; +typedef struct _GFileEnumeratorPrivate GFileEnumeratorPrivate; + +struct _GFileEnumerator +{ + GObject parent_instance; + + /*< private >*/ + GFileEnumeratorPrivate *priv; +}; + +struct _GFileEnumeratorClass +{ + GObjectClass parent_class; + + /* Virtual Table */ + + GFileInfo * (* next_file) (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + gboolean (* close_fn) (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + + void (* next_files_async) (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GList * (* next_files_finish) (GFileEnumerator *enumerator, + GAsyncResult *res, + GError **error); + void (* close_async) (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* close_finish) (GFileEnumerator *enumerator, + GAsyncResult *res, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + void (*_g_reserved7) (void); +}; + +GType g_file_enumerator_get_type (void) G_GNUC_CONST; + +GFileInfo *g_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); +gboolean g_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); +void g_file_enumerator_next_files_async (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GList * g_file_enumerator_next_files_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error); +void g_file_enumerator_close_async (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_file_enumerator_close_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error); +gboolean g_file_enumerator_is_closed (GFileEnumerator *enumerator); +gboolean g_file_enumerator_has_pending (GFileEnumerator *enumerator); +void g_file_enumerator_set_pending (GFileEnumerator *enumerator, + gboolean pending); +GFile * g_file_enumerator_get_container (GFileEnumerator *enumerator); + +G_END_DECLS + +#endif /* __G_FILE_ENUMERATOR_H__ */ diff --git a/gio/gfileicon.c b/gio/gfileicon.c new file mode 100644 index 0000000..4842fb6 --- /dev/null +++ b/gio/gfileicon.c @@ -0,0 +1,388 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include "gfileicon.h" +#include "gfile.h" +#include "gicon.h" +#include "glibintl.h" +#include "gloadableicon.h" +#include "ginputstream.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" + +#include "gioalias.h" + +/** + * SECTION:gfileicon + * @short_description: Icons pointing to an image file + * @include: gio/gio.h + * @see_also: #GIcon, #GLoadableIcon + * + * #GFileIcon specifies an icon by pointing to an image file + * to be used as icon. + * + **/ + +static void g_file_icon_icon_iface_init (GIconIface *iface); +static void g_file_icon_loadable_icon_iface_init (GLoadableIconIface *iface); +static void g_file_icon_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +struct _GFileIcon +{ + GObject parent_instance; + + GFile *file; +}; + +struct _GFileIconClass +{ + GObjectClass parent_class; +}; + +enum +{ + PROP_0, + PROP_FILE +}; + +G_DEFINE_TYPE_WITH_CODE (GFileIcon, g_file_icon, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ICON, + g_file_icon_icon_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_LOADABLE_ICON, + g_file_icon_loadable_icon_iface_init)) + +static void +g_file_icon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GFileIcon *icon = G_FILE_ICON (object); + + switch (prop_id) + { + case PROP_FILE: + g_value_set_object (value, icon->file); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_file_icon_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GFileIcon *icon = G_FILE_ICON (object); + + switch (prop_id) + { + case PROP_FILE: + icon->file = G_FILE (g_value_dup_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_file_icon_finalize (GObject *object) +{ + GFileIcon *icon; + + icon = G_FILE_ICON (object); + + g_object_unref (icon->file); + + G_OBJECT_CLASS (g_file_icon_parent_class)->finalize (object); +} + +static void +g_file_icon_class_init (GFileIconClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = g_file_icon_get_property; + gobject_class->set_property = g_file_icon_set_property; + gobject_class->finalize = g_file_icon_finalize; + + /** + * GFileIcon:file: + * + * The file containing the icon. + */ + g_object_class_install_property (gobject_class, PROP_FILE, + g_param_spec_object ("file", + P_("file"), + P_("The file containing the icon"), + G_TYPE_FILE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); +} + +static void +g_file_icon_init (GFileIcon *file) +{ +} + +/** + * g_file_icon_new: + * @file: a #GFile. + * + * Creates a new icon for a file. + * + * Returns: a #GIcon for the given @file, or %NULL on error. + **/ +GIcon * +g_file_icon_new (GFile *file) +{ + g_return_val_if_fail (G_IS_FILE (file), NULL); + + return G_ICON (g_object_new (G_TYPE_FILE_ICON, "file", file, NULL)); +} + +/** + * g_file_icon_get_file: + * @icon: a #GIcon. + * + * Gets the #GFile associated with the given @icon. + * + * Returns: a #GFile, or %NULL. + **/ +GFile * +g_file_icon_get_file (GFileIcon *icon) +{ + g_return_val_if_fail (G_IS_FILE_ICON (icon), NULL); + + return icon->file; +} + +static guint +g_file_icon_hash (GIcon *icon) +{ + GFileIcon *file_icon = G_FILE_ICON (icon); + + return g_file_hash (file_icon->file); +} + +static gboolean +g_file_icon_equal (GIcon *icon1, + GIcon *icon2) +{ + GFileIcon *file1 = G_FILE_ICON (icon1); + GFileIcon *file2 = G_FILE_ICON (icon2); + + return g_file_equal (file1->file, file2->file); +} + +static gboolean +g_file_icon_to_tokens (GIcon *icon, + GPtrArray *tokens, + gint *out_version) +{ + GFileIcon *file_icon = G_FILE_ICON (icon); + + g_return_val_if_fail (out_version != NULL, FALSE); + + *out_version = 0; + + g_ptr_array_add (tokens, g_file_get_uri (file_icon->file)); + return TRUE; +} + +static GIcon * +g_file_icon_from_tokens (gchar **tokens, + gint num_tokens, + gint version, + GError **error) +{ + GIcon *icon; + GFile *file; + + icon = NULL; + + if (version != 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Can't handle version %d of GFileIcon encoding"), + version); + goto out; + } + + if (num_tokens != 1) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Malformed input data for GFileIcon")); + goto out; + } + + file = g_file_new_for_uri (tokens[0]); + icon = g_file_icon_new (file); + g_object_unref (file); + + out: + return icon; +} + +static void +g_file_icon_icon_iface_init (GIconIface *iface) +{ + iface->hash = g_file_icon_hash; + iface->equal = g_file_icon_equal; + iface->to_tokens = g_file_icon_to_tokens; + iface->from_tokens = g_file_icon_from_tokens; +} + + +static GInputStream * +g_file_icon_load (GLoadableIcon *icon, + int size, + char **type, + GCancellable *cancellable, + GError **error) +{ + GFileInputStream *stream; + GFileIcon *file_icon = G_FILE_ICON (icon); + + stream = g_file_read (file_icon->file, + cancellable, + error); + + return G_INPUT_STREAM (stream); +} + +typedef struct { + GLoadableIcon *icon; + GAsyncReadyCallback callback; + gpointer user_data; +} LoadData; + +static void +load_data_free (LoadData *data) +{ + g_object_unref (data->icon); + g_free (data); +} + +static void +load_async_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileInputStream *stream; + GError *error = NULL; + GSimpleAsyncResult *simple; + LoadData *data = user_data; + + stream = g_file_read_finish (G_FILE (source_object), res, &error); + + if (stream == NULL) + { + simple = g_simple_async_result_new_from_error (G_OBJECT (data->icon), + data->callback, + data->user_data, + error); + g_error_free (error); + } + else + { + simple = g_simple_async_result_new (G_OBJECT (data->icon), + data->callback, + data->user_data, + g_file_icon_load_async); + + g_simple_async_result_set_op_res_gpointer (simple, + stream, + g_object_unref); + } + + + g_simple_async_result_complete (simple); + + load_data_free (data); +} + +static void +g_file_icon_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIcon *file_icon = G_FILE_ICON (icon); + LoadData *data; + + data = g_new0 (LoadData, 1); + data->icon = g_object_ref (icon); + data->callback = callback; + data->user_data = user_data; + + g_file_read_async (file_icon->file, 0, + cancellable, + load_async_callback, data); + +} + +static GInputStream * +g_file_icon_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gpointer op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_icon_load_async); + + if (type) + *type = NULL; + + op = g_simple_async_result_get_op_res_gpointer (simple); + if (op) + return g_object_ref (op); + + return NULL; +} + +static void +g_file_icon_loadable_icon_iface_init (GLoadableIconIface *iface) +{ + iface->load = g_file_icon_load; + iface->load_async = g_file_icon_load_async; + iface->load_finish = g_file_icon_load_finish; +} + +#define __G_FILE_ICON_C__ +#include "gioaliasdef.c" diff --git a/gio/gfileicon.h b/gio/gfileicon.h new file mode 100644 index 0000000..08ae791 --- /dev/null +++ b/gio/gfileicon.h @@ -0,0 +1,56 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_ICON_H__ +#define __G_FILE_ICON_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_ICON (g_file_icon_get_type ()) +#define G_FILE_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_ICON, GFileIcon)) +#define G_FILE_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_ICON, GFileIconClass)) +#define G_IS_FILE_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_ICON)) +#define G_IS_FILE_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_ICON)) +#define G_FILE_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_ICON, GFileIconClass)) + +/** + * GFileIcon: + * + * Gets an icon for a #GFile. Implements #GLoadableIcon. + **/ +typedef struct _GFileIconClass GFileIconClass; + +GType g_file_icon_get_type (void) G_GNUC_CONST; + +GIcon * g_file_icon_new (GFile *file); + +GFile * g_file_icon_get_file (GFileIcon *icon); + +G_END_DECLS + +#endif /* __G_FILE_ICON_H__ */ diff --git a/gio/gfileinfo-priv.h b/gio/gfileinfo-priv.h new file mode 100644 index 0000000..97fcf89 --- /dev/null +++ b/gio/gfileinfo-priv.h @@ -0,0 +1,141 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * 2009 Benjamin Otte + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Benjamin Otte + */ + +#ifndef __G_FILE_INFO_PRIV_H__ +#define __G_FILE_INFO_PRIV_H__ + +#include "gfileinfo.h" + +#define G_FILE_ATTRIBUTE_ID_STANDARD_TYPE (1048576 + 1) +#define G_FILE_ATTRIBUTE_ID_STANDARD_IS_HIDDEN (1048576 + 2) +#define G_FILE_ATTRIBUTE_ID_STANDARD_IS_BACKUP (1048576 + 3) +#define G_FILE_ATTRIBUTE_ID_STANDARD_IS_SYMLINK (1048576 + 4) +#define G_FILE_ATTRIBUTE_ID_STANDARD_IS_VIRTUAL (1048576 + 5) +#define G_FILE_ATTRIBUTE_ID_STANDARD_NAME (1048576 + 6) +#define G_FILE_ATTRIBUTE_ID_STANDARD_DISPLAY_NAME (1048576 + 7) +#define G_FILE_ATTRIBUTE_ID_STANDARD_EDIT_NAME (1048576 + 8) +#define G_FILE_ATTRIBUTE_ID_STANDARD_COPY_NAME (1048576 + 9) +#define G_FILE_ATTRIBUTE_ID_STANDARD_DESCRIPTION (1048576 + 10) +#define G_FILE_ATTRIBUTE_ID_STANDARD_ICON (1048576 + 11) +#define G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE (1048576 + 12) +#define G_FILE_ATTRIBUTE_ID_STANDARD_FAST_CONTENT_TYPE (1048576 + 13) +#define G_FILE_ATTRIBUTE_ID_STANDARD_SIZE (1048576 + 14) +#define G_FILE_ATTRIBUTE_ID_STANDARD_ALLOCATED_SIZE (1048576 + 15) +#define G_FILE_ATTRIBUTE_ID_STANDARD_SYMLINK_TARGET (1048576 + 16) +#define G_FILE_ATTRIBUTE_ID_STANDARD_TARGET_URI (1048576 + 17) +#define G_FILE_ATTRIBUTE_ID_STANDARD_SORT_ORDER (1048576 + 18) +#define G_FILE_ATTRIBUTE_ID_ETAG_VALUE (2097152 + 1) +#define G_FILE_ATTRIBUTE_ID_ID_FILE (3145728 + 1) +#define G_FILE_ATTRIBUTE_ID_ID_FILESYSTEM (3145728 + 2) +#define G_FILE_ATTRIBUTE_ID_ACCESS_CAN_READ (4194304 + 1) +#define G_FILE_ATTRIBUTE_ID_ACCESS_CAN_WRITE (4194304 + 2) +#define G_FILE_ATTRIBUTE_ID_ACCESS_CAN_EXECUTE (4194304 + 3) +#define G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE (4194304 + 4) +#define G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH (4194304 + 5) +#define G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME (4194304 + 6) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_MOUNT (5242880 + 1) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_UNMOUNT (5242880 + 2) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_EJECT (5242880 + 3) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_UNIX_DEVICE (5242880 + 4) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_UNIX_DEVICE_FILE (5242880 + 5) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_HAL_UDI (5242880 + 6) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_START (5242880 + 7) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_START_DEGRADED (5242880 + 8) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_STOP (5242880 + 9) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_START_STOP_TYPE (5242880 + 10) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_CAN_POLL (5242880 + 11) +#define G_FILE_ATTRIBUTE_ID_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC (5242880 + 12) +#define G_FILE_ATTRIBUTE_ID_TIME_MODIFIED (6291456 + 1) +#define G_FILE_ATTRIBUTE_ID_TIME_MODIFIED_USEC (6291456 + 2) +#define G_FILE_ATTRIBUTE_ID_TIME_ACCESS (6291456 + 3) +#define G_FILE_ATTRIBUTE_ID_TIME_ACCESS_USEC (6291456 + 4) +#define G_FILE_ATTRIBUTE_ID_TIME_CHANGED (6291456 + 5) +#define G_FILE_ATTRIBUTE_ID_TIME_CHANGED_USEC (6291456 + 6) +#define G_FILE_ATTRIBUTE_ID_TIME_CREATED (6291456 + 7) +#define G_FILE_ATTRIBUTE_ID_TIME_CREATED_USEC (6291456 + 8) +#define G_FILE_ATTRIBUTE_ID_UNIX_DEVICE (7340032 + 1) +#define G_FILE_ATTRIBUTE_ID_UNIX_INODE (7340032 + 2) +#define G_FILE_ATTRIBUTE_ID_UNIX_MODE (7340032 + 3) +#define G_FILE_ATTRIBUTE_ID_UNIX_NLINK (7340032 + 4) +#define G_FILE_ATTRIBUTE_ID_UNIX_UID (7340032 + 5) +#define G_FILE_ATTRIBUTE_ID_UNIX_GID (7340032 + 6) +#define G_FILE_ATTRIBUTE_ID_UNIX_RDEV (7340032 + 7) +#define G_FILE_ATTRIBUTE_ID_UNIX_BLOCK_SIZE (7340032 + 8) +#define G_FILE_ATTRIBUTE_ID_UNIX_BLOCKS (7340032 + 9) +#define G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT (7340032 + 10) +#define G_FILE_ATTRIBUTE_ID_DOS_IS_ARCHIVE (8388608 + 1) +#define G_FILE_ATTRIBUTE_ID_DOS_IS_SYSTEM (8388608 + 2) +#define G_FILE_ATTRIBUTE_ID_OWNER_USER (9437184 + 1) +#define G_FILE_ATTRIBUTE_ID_OWNER_USER_REAL (9437184 + 2) +#define G_FILE_ATTRIBUTE_ID_OWNER_GROUP (9437184 + 3) +#define G_FILE_ATTRIBUTE_ID_THUMBNAIL_PATH (10485760 + 1) +#define G_FILE_ATTRIBUTE_ID_THUMBNAILING_FAILED (10485760 + 2) +#define G_FILE_ATTRIBUTE_ID_PREVIEW_ICON (11534336 + 1) +#define G_FILE_ATTRIBUTE_ID_FILESYSTEM_SIZE (12582912 + 1) +#define G_FILE_ATTRIBUTE_ID_FILESYSTEM_FREE (12582912 + 2) +#define G_FILE_ATTRIBUTE_ID_FILESYSTEM_TYPE (12582912 + 3) +#define G_FILE_ATTRIBUTE_ID_FILESYSTEM_READONLY (12582912 + 4) +#define G_FILE_ATTRIBUTE_ID_FILESYSTEM_USE_PREVIEW (12582912 + 5) +#define G_FILE_ATTRIBUTE_ID_GVFS_BACKEND (13631488 + 1) +#define G_FILE_ATTRIBUTE_ID_SELINUX_CONTEXT (14680064 + 1) +#define G_FILE_ATTRIBUTE_ID_TRASH_ITEM_COUNT (15728640 + 1) +#define G_FILE_ATTRIBUTE_ID_TRASH_ORIG_PATH (15728640 + 2) +#define G_FILE_ATTRIBUTE_ID_TRASH_DELETION_DATE (15728640 + 3) + +gboolean _g_file_attribute_matcher_matches_id (GFileAttributeMatcher *matcher, + guint32 id); + +void _g_file_info_set_attribute_by_id (GFileInfo *info, + guint32 attribute, + GFileAttributeType type, + gpointer value_p); +void _g_file_info_set_attribute_string_by_id (GFileInfo *info, + guint32 attribute, + const char *attr_value); +void _g_file_info_set_attribute_byte_string_by_id (GFileInfo *info, + guint32 attribute, + const char *attr_value); +void _g_file_info_set_attribute_boolean_by_id (GFileInfo *info, + guint32 attribute, + gboolean attr_value); +void _g_file_info_set_attribute_uint32_by_id (GFileInfo *info, + guint32 attribute, + guint32 attr_value); +void _g_file_info_set_attribute_int32_by_id (GFileInfo *info, + guint32 attribute, + gint32 attr_value); +void _g_file_info_set_attribute_uint64_by_id (GFileInfo *info, + guint32 attribute, + guint64 attr_value); +void _g_file_info_set_attribute_int64_by_id (GFileInfo *info, + guint32 attribute, + gint64 attr_value); +void _g_file_info_set_attribute_object_by_id (GFileInfo *info, + guint32 attribute, + GObject *attr_value); +void _g_file_info_set_attribute_stringv_by_id (GFileInfo *info, + guint32 attribute, + char **attr_value); + + +#endif /* __G_FILE_INFO_PRIV_H__ */ diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c new file mode 100644 index 0000000..23cc888 --- /dev/null +++ b/gio/gfileinfo.c @@ -0,0 +1,2486 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +/** + * SECTION:gfileinfo + * @short_description: File Information and Attributes + * @include: gio/gio.h + * @see_also: #GFile, GFileAttribute + * + * Functionality for manipulating basic metadata for files. #GFileInfo + * implements methods for getting information that all files should + * contain, and allows for manipulation of extended attributes. + * + * See GFileAttribute for more + * information on how GIO handles file attributes. + * + * To obtain a #GFileInfo for a #GFile, use g_file_query_info() (or its + * async variant). To obtain a #GFileInfo for a file input or output + * stream, use g_file_input_stream_query_info() or + * g_file_output_stream_query_info() (or their async variants). + * + * To change the actual attributes of a file, you should then set the + * attribute in the #GFileInfo and call g_file_set_attributes_from_info() + * or g_file_set_attributes_async() on a GFile. + * + * However, not all attributes can be changed in the file. For instance, + * the actual size of a file cannot be changed via g_file_info_set_size(). + * You may call g_file_query_settable_attributes() and + * g_file_query_writable_namespaces() to discover the settable attributes + * of a particular file at runtime. + * + * #GFileAttributeMatcher allows for searching through a #GFileInfo for + * attributes. + **/ + +#include "config.h" + +#include + +#include "gfileinfo.h" +#include "gfileinfo-priv.h" +#include "gfileattribute-priv.h" +#include "gicon.h" +#include "glibintl.h" + +#include "gioalias.h" + +/* We use this nasty thing, because NULL is a valid attribute matcher (matches nothing) */ +#define NO_ATTRIBUTE_MASK ((GFileAttributeMatcher *)1) + +typedef struct { + guint32 attribute; + GFileAttributeValue value; +} GFileAttribute; + +struct _GFileInfo +{ + GObject parent_instance; + + GArray *attributes; + GFileAttributeMatcher *mask; +}; + +struct _GFileInfoClass +{ + GObjectClass parent_class; +}; + + +G_DEFINE_TYPE (GFileInfo, g_file_info, G_TYPE_OBJECT); + +typedef struct { + guint32 id; + guint32 attribute_id_counter; +} NSInfo; + +G_LOCK_DEFINE_STATIC (attribute_hash); +static int namespace_id_counter = 0; +static GHashTable *ns_hash = NULL; +static GHashTable *attribute_hash = NULL; +static char ***attributes = NULL; + +/* Attribute ids are 32bit, we split it up like this: + * |------------|--------------------| + * 12 bit 20 bit + * namespace attribute id + * + * This way the attributes gets sorted in namespace order + */ + +#define NS_POS 20 +#define NS_MASK ((guint32)((1<<12) - 1)) +#define ID_POS 0 +#define ID_MASK ((guint32)((1<<20) - 1)) + +#define GET_NS(_attr_id) \ + (((guint32) (_attr_id) >> NS_POS) & NS_MASK) +#define GET_ID(_attr_id) \ + (((guint32)(_attr_id) >> ID_POS) & ID_MASK) + +#define MAKE_ATTR_ID(_ns, _id) \ + ( ((((guint32) _ns) & NS_MASK) << NS_POS) | \ + ((((guint32) _id) & ID_MASK) << ID_POS) ) + +static NSInfo * +_lookup_namespace (const char *namespace) +{ + NSInfo *ns_info; + + ns_info = g_hash_table_lookup (ns_hash, namespace); + if (ns_info == NULL) + { + ns_info = g_new0 (NSInfo, 1); + ns_info->id = ++namespace_id_counter; + g_hash_table_insert (ns_hash, g_strdup (namespace), ns_info); + attributes = g_realloc (attributes, (ns_info->id + 1) * sizeof (char **)); + attributes[ns_info->id] = NULL; + } + return ns_info; +} + +static guint32 +_lookup_attribute (const char *attribute) +{ + guint32 attr_id, id; + char *ns; + const char *colon; + NSInfo *ns_info; + + attr_id = GPOINTER_TO_UINT (g_hash_table_lookup (attribute_hash, attribute)); + + if (attr_id != 0) + return attr_id; + + colon = strstr (attribute, "::"); + if (colon) + ns = g_strndup (attribute, colon - attribute); + else + ns = g_strdup (""); + + ns_info = _lookup_namespace (ns); + g_free (ns); + + id = ++ns_info->attribute_id_counter; + attributes[ns_info->id] = g_realloc (attributes[ns_info->id], (id + 1) * sizeof (char *)); + attributes[ns_info->id][id] = g_strdup (attribute); + + attr_id = MAKE_ATTR_ID (ns_info->id, id); + + g_hash_table_insert (attribute_hash, attributes[ns_info->id][id], GUINT_TO_POINTER (attr_id)); + + return attr_id; +} + +static void +ensure_attribute_hash (void) +{ + if (attribute_hash != NULL) + return; + + ns_hash = g_hash_table_new (g_str_hash, g_str_equal); + attribute_hash = g_hash_table_new (g_str_hash, g_str_equal); + +#define REGISTER_ATTRIBUTE(name) G_STMT_START{\ + guint _u = _lookup_attribute (G_FILE_ATTRIBUTE_ ## name); \ + /* use for generating the ID: g_print ("#define G_FILE_ATTRIBUTE_ID_%s (%u + %u)\n", #name + 17, _u & ~ID_MASK, _u & ID_MASK); */ \ + g_assert (_u == G_FILE_ATTRIBUTE_ID_ ## name); \ +}G_STMT_END + + REGISTER_ATTRIBUTE (STANDARD_TYPE); + REGISTER_ATTRIBUTE (STANDARD_IS_HIDDEN); + REGISTER_ATTRIBUTE (STANDARD_IS_BACKUP); + REGISTER_ATTRIBUTE (STANDARD_IS_SYMLINK); + REGISTER_ATTRIBUTE (STANDARD_IS_VIRTUAL); + REGISTER_ATTRIBUTE (STANDARD_NAME); + REGISTER_ATTRIBUTE (STANDARD_DISPLAY_NAME); + REGISTER_ATTRIBUTE (STANDARD_EDIT_NAME); + REGISTER_ATTRIBUTE (STANDARD_COPY_NAME); + REGISTER_ATTRIBUTE (STANDARD_DESCRIPTION); + REGISTER_ATTRIBUTE (STANDARD_ICON); + REGISTER_ATTRIBUTE (STANDARD_CONTENT_TYPE); + REGISTER_ATTRIBUTE (STANDARD_FAST_CONTENT_TYPE); + REGISTER_ATTRIBUTE (STANDARD_SIZE); + REGISTER_ATTRIBUTE (STANDARD_ALLOCATED_SIZE); + REGISTER_ATTRIBUTE (STANDARD_SYMLINK_TARGET); + REGISTER_ATTRIBUTE (STANDARD_TARGET_URI); + REGISTER_ATTRIBUTE (STANDARD_SORT_ORDER); + REGISTER_ATTRIBUTE (ETAG_VALUE); + REGISTER_ATTRIBUTE (ID_FILE); + REGISTER_ATTRIBUTE (ID_FILESYSTEM); + REGISTER_ATTRIBUTE (ACCESS_CAN_READ); + REGISTER_ATTRIBUTE (ACCESS_CAN_WRITE); + REGISTER_ATTRIBUTE (ACCESS_CAN_EXECUTE); + REGISTER_ATTRIBUTE (ACCESS_CAN_DELETE); + REGISTER_ATTRIBUTE (ACCESS_CAN_TRASH); + REGISTER_ATTRIBUTE (ACCESS_CAN_RENAME); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_MOUNT); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_UNMOUNT); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_EJECT); + REGISTER_ATTRIBUTE (MOUNTABLE_UNIX_DEVICE); + REGISTER_ATTRIBUTE (MOUNTABLE_UNIX_DEVICE_FILE); + REGISTER_ATTRIBUTE (MOUNTABLE_HAL_UDI); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_START); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_START_DEGRADED); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_STOP); + REGISTER_ATTRIBUTE (MOUNTABLE_START_STOP_TYPE); + REGISTER_ATTRIBUTE (MOUNTABLE_CAN_POLL); + REGISTER_ATTRIBUTE (MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC); + REGISTER_ATTRIBUTE (TIME_MODIFIED); + REGISTER_ATTRIBUTE (TIME_MODIFIED_USEC); + REGISTER_ATTRIBUTE (TIME_ACCESS); + REGISTER_ATTRIBUTE (TIME_ACCESS_USEC); + REGISTER_ATTRIBUTE (TIME_CHANGED); + REGISTER_ATTRIBUTE (TIME_CHANGED_USEC); + REGISTER_ATTRIBUTE (TIME_CREATED); + REGISTER_ATTRIBUTE (TIME_CREATED_USEC); + REGISTER_ATTRIBUTE (UNIX_DEVICE); + REGISTER_ATTRIBUTE (UNIX_INODE); + REGISTER_ATTRIBUTE (UNIX_MODE); + REGISTER_ATTRIBUTE (UNIX_NLINK); + REGISTER_ATTRIBUTE (UNIX_UID); + REGISTER_ATTRIBUTE (UNIX_GID); + REGISTER_ATTRIBUTE (UNIX_RDEV); + REGISTER_ATTRIBUTE (UNIX_BLOCK_SIZE); + REGISTER_ATTRIBUTE (UNIX_BLOCKS); + REGISTER_ATTRIBUTE (UNIX_IS_MOUNTPOINT); + REGISTER_ATTRIBUTE (DOS_IS_ARCHIVE); + REGISTER_ATTRIBUTE (DOS_IS_SYSTEM); + REGISTER_ATTRIBUTE (OWNER_USER); + REGISTER_ATTRIBUTE (OWNER_USER_REAL); + REGISTER_ATTRIBUTE (OWNER_GROUP); + REGISTER_ATTRIBUTE (THUMBNAIL_PATH); + REGISTER_ATTRIBUTE (THUMBNAILING_FAILED); + REGISTER_ATTRIBUTE (PREVIEW_ICON); + REGISTER_ATTRIBUTE (FILESYSTEM_SIZE); + REGISTER_ATTRIBUTE (FILESYSTEM_FREE); + REGISTER_ATTRIBUTE (FILESYSTEM_TYPE); + REGISTER_ATTRIBUTE (FILESYSTEM_READONLY); + REGISTER_ATTRIBUTE (FILESYSTEM_USE_PREVIEW); + REGISTER_ATTRIBUTE (GVFS_BACKEND); + REGISTER_ATTRIBUTE (SELINUX_CONTEXT); + REGISTER_ATTRIBUTE (TRASH_ITEM_COUNT); + REGISTER_ATTRIBUTE (TRASH_ORIG_PATH); + REGISTER_ATTRIBUTE (TRASH_DELETION_DATE); + +#undef REGISTER_ATTRIBUTE +} + +static guint32 +lookup_namespace (const char *namespace) +{ + NSInfo *ns_info; + guint32 id; + + G_LOCK (attribute_hash); + + ensure_attribute_hash (); + + ns_info = _lookup_namespace (namespace); + id = 0; + if (ns_info) + id = ns_info->id; + + G_UNLOCK (attribute_hash); + + return id; +} + +static char * +get_attribute_for_id (int attribute) +{ + char *s; + G_LOCK (attribute_hash); + s = attributes[GET_NS(attribute)][GET_ID(attribute)]; + G_UNLOCK (attribute_hash); + return s; +} + +static guint32 +lookup_attribute (const char *attribute) +{ + guint32 attr_id; + + G_LOCK (attribute_hash); + ensure_attribute_hash (); + + attr_id = _lookup_attribute (attribute); + + G_UNLOCK (attribute_hash); + + return attr_id; +} + +static void +g_file_info_finalize (GObject *object) +{ + GFileInfo *info; + int i; + GFileAttribute *attrs; + + info = G_FILE_INFO (object); + + attrs = (GFileAttribute *)info->attributes->data; + for (i = 0; i < info->attributes->len; i++) + _g_file_attribute_value_clear (&attrs[i].value); + g_array_free (info->attributes, TRUE); + + if (info->mask != NO_ATTRIBUTE_MASK) + g_file_attribute_matcher_unref (info->mask); + + G_OBJECT_CLASS (g_file_info_parent_class)->finalize (object); +} + +static void +g_file_info_class_init (GFileInfoClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_file_info_finalize; +} + +static void +g_file_info_init (GFileInfo *info) +{ + info->mask = NO_ATTRIBUTE_MASK; + info->attributes = g_array_new (FALSE, FALSE, + sizeof (GFileAttribute)); +} + +/** + * g_file_info_new: + * + * Creates a new file info structure. + * + * Returns: a #GFileInfo. + **/ +GFileInfo * +g_file_info_new (void) +{ + return g_object_new (G_TYPE_FILE_INFO, NULL); +} + +/** + * g_file_info_copy_into: + * @src_info: source to copy attributes from. + * @dest_info: destination to copy attributes to. + * + * Copies all of the #GFileAttributes from @src_info to @dest_info. + **/ +void +g_file_info_copy_into (GFileInfo *src_info, + GFileInfo *dest_info) +{ + GFileAttribute *source, *dest; + int i; + + g_return_if_fail (G_IS_FILE_INFO (src_info)); + g_return_if_fail (G_IS_FILE_INFO (dest_info)); + + dest = (GFileAttribute *)dest_info->attributes->data; + for (i = 0; i < dest_info->attributes->len; i++) + _g_file_attribute_value_clear (&dest[i].value); + + g_array_set_size (dest_info->attributes, + src_info->attributes->len); + + source = (GFileAttribute *)src_info->attributes->data; + dest = (GFileAttribute *)dest_info->attributes->data; + + for (i = 0; i < src_info->attributes->len; i++) + { + dest[i].attribute = source[i].attribute; + dest[i].value.type = G_FILE_ATTRIBUTE_TYPE_INVALID; + _g_file_attribute_value_set (&dest[i].value, &source[i].value); + } + + if (dest_info->mask != NO_ATTRIBUTE_MASK) + g_file_attribute_matcher_unref (dest_info->mask); + + if (src_info->mask == NO_ATTRIBUTE_MASK) + dest_info->mask = NO_ATTRIBUTE_MASK; + else + dest_info->mask = g_file_attribute_matcher_ref (src_info->mask); +} + +/** + * g_file_info_dup: + * @other: a #GFileInfo. + * + * Duplicates a file info structure. + * + * Returns: a duplicate #GFileInfo of @other. + **/ +GFileInfo * +g_file_info_dup (GFileInfo *other) +{ + GFileInfo *new; + + g_return_val_if_fail (G_IS_FILE_INFO (other), NULL); + + new = g_file_info_new (); + g_file_info_copy_into (other, new); + return new; +} + +/** + * g_file_info_set_attribute_mask: + * @info: a #GFileInfo. + * @mask: a #GFileAttributeMatcher. + * + * Sets @mask on @info to match specific attribute types. + **/ +void +g_file_info_set_attribute_mask (GFileInfo *info, + GFileAttributeMatcher *mask) +{ + GFileAttribute *attr; + int i; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (mask != info->mask) + { + if (info->mask != NO_ATTRIBUTE_MASK) + g_file_attribute_matcher_unref (info->mask); + info->mask = g_file_attribute_matcher_ref (mask); + + /* Remove non-matching attributes */ + for (i = 0; i < info->attributes->len; i++) + { + attr = &g_array_index (info->attributes, GFileAttribute, i); + if (!_g_file_attribute_matcher_matches_id (mask, + attr->attribute)) + { + _g_file_attribute_value_clear (&attr->value); + g_array_remove_index (info->attributes, i); + i--; + } + } + } +} + +/** + * g_file_info_unset_attribute_mask: + * @info: #GFileInfo. + * + * Unsets a mask set by g_file_info_set_attribute_mask(), if one + * is set. + **/ +void +g_file_info_unset_attribute_mask (GFileInfo *info) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (info->mask != NO_ATTRIBUTE_MASK) + g_file_attribute_matcher_unref (info->mask); + info->mask = NO_ATTRIBUTE_MASK; +} + +/** + * g_file_info_clear_status: + * @info: a #GFileInfo. + * + * Clears the status information from @info. + **/ +void +g_file_info_clear_status (GFileInfo *info) +{ + GFileAttribute *attrs; + int i; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + attrs = (GFileAttribute *)info->attributes->data; + for (i = 0; i < info->attributes->len; i++) + attrs[i].value.status = G_FILE_ATTRIBUTE_STATUS_UNSET; +} + +static int +g_file_info_find_place (GFileInfo *info, + guint32 attribute) +{ + int min, max, med; + GFileAttribute *attrs; + /* Binary search for the place where attribute would be, if it's + in the array */ + + min = 0; + max = info->attributes->len; + + attrs = (GFileAttribute *)info->attributes->data; + + while (min < max) + { + med = min + (max - min) / 2; + if (attrs[med].attribute == attribute) + { + min = med; + break; + } + else if (attrs[med].attribute < attribute) + min = med + 1; + else /* attrs[med].attribute > attribute */ + max = med; + } + + return min; +} + +static GFileAttributeValue * +g_file_info_find_value (GFileInfo *info, + guint32 attr_id) +{ + GFileAttribute *attrs; + int i; + + i = g_file_info_find_place (info, attr_id); + attrs = (GFileAttribute *)info->attributes->data; + if (i < info->attributes->len && + attrs[i].attribute == attr_id) + return &attrs[i].value; + + return NULL; +} + +static GFileAttributeValue * +g_file_info_find_value_by_name (GFileInfo *info, + const char *attribute) +{ + guint32 attr_id; + + attr_id = lookup_attribute (attribute); + return g_file_info_find_value (info, attr_id); +} + +/** + * g_file_info_has_attribute: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Checks if a file info structure has an attribute named @attribute. + * + * Returns: %TRUE if @Ginfo has an attribute named @attribute, + * %FALSE otherwise. + **/ +gboolean +g_file_info_has_attribute (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + value = g_file_info_find_value_by_name (info, attribute); + return value != NULL; +} + +/** + * g_file_info_has_namespace: + * @info: a #GFileInfo. + * @name_space: a file attribute namespace. + * + * Checks if a file info structure has an attribute in the + * specified @name_space. + * + * Returns: %TRUE if @Ginfo has an attribute in @name_space, + * %FALSE otherwise. + * + * Since: 2.22 + **/ +gboolean +g_file_info_has_namespace (GFileInfo *info, + const char *name_space) +{ + GFileAttribute *attrs; + guint32 ns_id; + int i; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + g_return_val_if_fail (name_space != NULL, FALSE); + + ns_id = lookup_namespace (name_space); + + attrs = (GFileAttribute *)info->attributes->data; + for (i = 0; i < info->attributes->len; i++) + { + if (GET_NS (attrs[i].attribute) == ns_id) + return TRUE; + } + + return FALSE; +} + +/** + * g_file_info_list_attributes: + * @info: a #GFileInfo. + * @name_space: a file attribute key's namespace. + * + * Lists the file info structure's attributes. + * + * Returns: a null-terminated array of strings of all of the + * possible attribute types for the given @name_space, or + * %NULL on error. + **/ +char ** +g_file_info_list_attributes (GFileInfo *info, + const char *name_space) +{ + GPtrArray *names; + GFileAttribute *attrs; + guint32 attribute; + guint32 ns_id = (name_space) ? lookup_namespace (name_space) : 0; + int i; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + names = g_ptr_array_new (); + attrs = (GFileAttribute *)info->attributes->data; + for (i = 0; i < info->attributes->len; i++) + { + attribute = attrs[i].attribute; + if (ns_id == 0 || GET_NS (attribute) == ns_id) + g_ptr_array_add (names, g_strdup (get_attribute_for_id (attribute))); + } + + /* NULL terminate */ + g_ptr_array_add (names, NULL); + + return (char **)g_ptr_array_free (names, FALSE); +} + +/** + * g_file_info_get_attribute_type: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the attribute type for an attribute key. + * + * Returns: a #GFileAttributeType for the given @attribute, or + * %G_FILE_ATTRIBUTE_TYPE_INVALID if the key is not set. + **/ +GFileAttributeType +g_file_info_get_attribute_type (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), G_FILE_ATTRIBUTE_TYPE_INVALID); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', G_FILE_ATTRIBUTE_TYPE_INVALID); + + value = g_file_info_find_value_by_name (info, attribute); + if (value) + return value->type; + else + return G_FILE_ATTRIBUTE_TYPE_INVALID; +} + +/** + * g_file_info_remove_attribute: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Removes all cases of @attribute from @info if it exists. + **/ +void +g_file_info_remove_attribute (GFileInfo *info, + const char *attribute) +{ + guint32 attr_id; + GFileAttribute *attrs; + int i; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + attr_id = lookup_attribute (attribute); + + i = g_file_info_find_place (info, attr_id); + attrs = (GFileAttribute *)info->attributes->data; + if (i < info->attributes->len && + attrs[i].attribute == attr_id) + { + _g_file_attribute_value_clear (&attrs[i].value); + g_array_remove_index (info->attributes, i); + } +} + +/** + * g_file_info_get_attribute_data: + * @info: a #GFileInfo + * @attribute: a file attribute key + * @type: return location for the attribute type, or %NULL + * @value_pp: return location for the attribute value, or %NULL + * @status: return location for the attribute status, or %NULL + * + * Gets the attribute type, value and status for an attribute key. + * + * Returns: %TRUE if @info has an attribute named @attribute, + * %FALSE otherwise. + */ +gboolean +g_file_info_get_attribute_data (GFileInfo *info, + const char *attribute, + GFileAttributeType *type, + gpointer *value_pp, + GFileAttributeStatus *status) +{ + GFileAttributeValue *value; + + value = g_file_info_find_value_by_name (info, attribute); + if (value == NULL) + return FALSE; + + if (status) + *status = value->status; + + if (type) + *type = value->type; + + if (value_pp) + *value_pp = _g_file_attribute_value_peek_as_pointer (value); + + return TRUE; +} + +/** + * g_file_info_get_attribute_status: + * @info: a #GFileInfo + * @attribute: a file attribute key + * + * Gets the attribute status for an attribute key. + * + * Returns: a #GFileAttributeStatus for the given @attribute, or + * %G_FILE_ATTRIBUTE_STATUS_UNSET if the key is invalid. + * + */ +GFileAttributeStatus +g_file_info_get_attribute_status (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *val; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', 0); + + val = g_file_info_find_value_by_name (info, attribute); + if (val) + return val->status; + + return G_FILE_ATTRIBUTE_STATUS_UNSET; +} + +/** + * g_file_info_set_attribute_status: + * @info: a #GFileInfo + * @attribute: a file attribute key + * @status: a #GFileAttributeStatus + * + * Sets the attribute status for an attribute key. This is only + * needed by external code that implement g_file_set_attributes_from_info() + * or similar functions. + * + * The attribute must exist in @info for this to work. Otherwise %FALSE + * is returned and @info is unchanged. + * + * Returns: %TRUE if the status was changed, %FALSE if the key was not set. + * + * Since: 2.22 + */ +gboolean +g_file_info_set_attribute_status (GFileInfo *info, + const char *attribute, + GFileAttributeStatus status) +{ + GFileAttributeValue *val; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', 0); + + val = g_file_info_find_value_by_name (info, attribute); + if (val) + { + val->status = status; + return TRUE; + } + + return FALSE; +} + +GFileAttributeValue * +_g_file_info_get_attribute_value (GFileInfo *info, + const char *attribute) + +{ + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', NULL); + + return g_file_info_find_value_by_name (info, attribute); +} + +/** + * g_file_info_get_attribute_as_string: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the value of a attribute, formated as a string. + * This escapes things as needed to make the string valid + * utf8. + * + * Returns: a UTF-8 string associated with the given @attribute. + * When you're done with the string it must be freed with g_free(). + **/ +char * +g_file_info_get_attribute_as_string (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *val; + val = _g_file_info_get_attribute_value (info, attribute); + if (val) + return _g_file_attribute_value_as_string (val); + return NULL; +} + + +/** + * g_file_info_get_attribute_object: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the value of a #GObject attribute. If the attribute does + * not contain a #GObject, %NULL will be returned. + * + * Returns: a #GObject associated with the given @attribute, or + * %NULL otherwise. + **/ +GObject * +g_file_info_get_attribute_object (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', NULL); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_object (value); +} + +/** + * g_file_info_get_attribute_string: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the value of a string attribute. If the attribute does + * not contain a string, %NULL will be returned. + * + * Returns: the contents of the @attribute value as a string, or + * %NULL otherwise. + **/ +const char * +g_file_info_get_attribute_string (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', NULL); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_string (value); +} + +/** + * g_file_info_get_attribute_byte_string: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the value of a byte string attribute. If the attribute does + * not contain a byte string, %NULL will be returned. + * + * Returns: the contents of the @attribute value as a byte string, or + * %NULL otherwise. + **/ +const char * +g_file_info_get_attribute_byte_string (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', NULL); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_byte_string (value); +} + +/** + * g_file_info_get_attribute_stringv: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the value of a stringv attribute. If the attribute does + * not contain a stringv, %NULL will be returned. + * + * Returns: the contents of the @attribute value as a stringv, or + * %NULL otherwise. Do not free. + * + * Since: 2.22 + **/ +char ** +g_file_info_get_attribute_stringv (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', NULL); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_stringv (value); +} + +/** + * g_file_info_get_attribute_boolean: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets the value of a boolean attribute. If the attribute does not + * contain a boolean value, %FALSE will be returned. + * + * Returns: the boolean value contained within the attribute. + **/ +gboolean +g_file_info_get_attribute_boolean (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_boolean (value); +} + +/** + * g_file_info_get_attribute_uint32: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets an unsigned 32-bit integer contained within the attribute. If the + * attribute does not contain an unsigned 32-bit integer, or is invalid, + * 0 will be returned. + * + * Returns: an unsigned 32-bit integer from the attribute. + **/ +guint32 +g_file_info_get_attribute_uint32 (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', 0); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_uint32 (value); +} + +/** + * g_file_info_get_attribute_int32: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets a signed 32-bit integer contained within the attribute. If the + * attribute does not contain a signed 32-bit integer, or is invalid, + * 0 will be returned. + * + * Returns: a signed 32-bit integer from the attribute. + **/ +gint32 +g_file_info_get_attribute_int32 (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', 0); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_int32 (value); +} + +/** + * g_file_info_get_attribute_uint64: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets a unsigned 64-bit integer contained within the attribute. If the + * attribute does not contain an unsigned 64-bit integer, or is invalid, + * 0 will be returned. + * + * Returns: a unsigned 64-bit integer from the attribute. + **/ +guint64 +g_file_info_get_attribute_uint64 (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', 0); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_uint64 (value); +} + +/** + * g_file_info_get_attribute_int64: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * + * Gets a signed 64-bit integer contained within the attribute. If the + * attribute does not contain an signed 64-bit integer, or is invalid, + * 0 will be returned. + * + * Returns: a signed 64-bit integer from the attribute. + **/ +gint64 +g_file_info_get_attribute_int64 (GFileInfo *info, + const char *attribute) +{ + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', 0); + + value = g_file_info_find_value_by_name (info, attribute); + return _g_file_attribute_value_get_int64 (value); +} + +static GFileAttributeValue * +g_file_info_create_value (GFileInfo *info, + guint32 attr_id) +{ + GFileAttribute *attrs; + int i; + + if (info->mask != NO_ATTRIBUTE_MASK && + !_g_file_attribute_matcher_matches_id (info->mask, attr_id)) + return NULL; + + i = g_file_info_find_place (info, attr_id); + + attrs = (GFileAttribute *)info->attributes->data; + if (i < info->attributes->len && + attrs[i].attribute == attr_id) + return &attrs[i].value; + else + { + GFileAttribute attr = { 0 }; + attr.attribute = attr_id; + g_array_insert_val (info->attributes, i, attr); + + attrs = (GFileAttribute *)info->attributes->data; + return &attrs[i].value; + } +} + +void +_g_file_info_set_attribute_by_id (GFileInfo *info, + guint32 attribute, + GFileAttributeType type, + gpointer value_p) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + + if (value) + _g_file_attribute_value_set_from_pointer (value, type, value_p, TRUE); +} + +/** + * g_file_info_set_attribute: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @type: a #GFileAttributeType + * @value_p: pointer to the value + * + * Sets the @attribute to contain the given value, if possible. + **/ +void +g_file_info_set_attribute (GFileInfo *info, + const char *attribute, + GFileAttributeType type, + gpointer value_p) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + _g_file_info_set_attribute_by_id (info, lookup_attribute (attribute), type, value_p); +} + +void +_g_file_info_set_attribute_object_by_id (GFileInfo *info, + guint32 attribute, + GObject *attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_object (value, attr_value); +} + +/** + * g_file_info_set_attribute_object: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: a #GObject. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_object (GFileInfo *info, + const char *attribute, + GObject *attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + g_return_if_fail (G_IS_OBJECT (attr_value)); + + _g_file_info_set_attribute_object_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_stringv_by_id (GFileInfo *info, + guint32 attribute, + char **attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_stringv (value, attr_value); +} + +/** + * g_file_info_set_attribute_stringv: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: a %NULL terminated string array + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + * + * Sinze: 2.22 + **/ +void +g_file_info_set_attribute_stringv (GFileInfo *info, + const char *attribute, + char **attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + g_return_if_fail (attr_value != NULL); + + _g_file_info_set_attribute_stringv_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_string_by_id (GFileInfo *info, + guint32 attribute, + const char *attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_string (value, attr_value); +} + +/** + * g_file_info_set_attribute_string: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: a string. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_string (GFileInfo *info, + const char *attribute, + const char *attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + g_return_if_fail (attr_value != NULL); + + _g_file_info_set_attribute_string_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_byte_string_by_id (GFileInfo *info, + guint32 attribute, + const char *attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_byte_string (value, attr_value); +} + +/** + * g_file_info_set_attribute_byte_string: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: a byte string. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_byte_string (GFileInfo *info, + const char *attribute, + const char *attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + g_return_if_fail (attr_value != NULL); + + _g_file_info_set_attribute_byte_string_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_boolean_by_id (GFileInfo *info, + guint32 attribute, + gboolean attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_boolean (value, attr_value); +} + +/** + * g_file_info_set_attribute_boolean: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: a boolean value. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_boolean (GFileInfo *info, + const char *attribute, + gboolean attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + _g_file_info_set_attribute_boolean_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_uint32_by_id (GFileInfo *info, + guint32 attribute, + guint32 attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_uint32 (value, attr_value); +} + +/** + * g_file_info_set_attribute_uint32: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: an unsigned 32-bit integer. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_uint32 (GFileInfo *info, + const char *attribute, + guint32 attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + _g_file_info_set_attribute_uint32_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_int32_by_id (GFileInfo *info, + guint32 attribute, + gint32 attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_int32 (value, attr_value); +} + +/** + * g_file_info_set_attribute_int32: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: a signed 32-bit integer + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_int32 (GFileInfo *info, + const char *attribute, + gint32 attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + _g_file_info_set_attribute_int32_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_uint64_by_id (GFileInfo *info, + guint32 attribute, + guint64 attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_uint64 (value, attr_value); +} + +/** + * g_file_info_set_attribute_uint64: + * @info: a #GFileInfo. + * @attribute: a file attribute key. + * @attr_value: an unsigned 64-bit integer. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + **/ +void +g_file_info_set_attribute_uint64 (GFileInfo *info, + const char *attribute, + guint64 attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + _g_file_info_set_attribute_uint64_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +void +_g_file_info_set_attribute_int64_by_id (GFileInfo *info, + guint32 attribute, + gint64 attr_value) +{ + GFileAttributeValue *value; + + value = g_file_info_create_value (info, attribute); + if (value) + _g_file_attribute_value_set_int64 (value, attr_value); +} + +/** + * g_file_info_set_attribute_int64: + * @info: a #GFileInfo. + * @attribute: attribute name to set. + * @attr_value: int64 value to set attribute to. + * + * Sets the @attribute to contain the given @attr_value, + * if possible. + * + **/ +void +g_file_info_set_attribute_int64 (GFileInfo *info, + const char *attribute, + gint64 attr_value) +{ + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (attribute != NULL && *attribute != '\0'); + + _g_file_info_set_attribute_int64_by_id (info, + lookup_attribute (attribute), + attr_value); +} + +/* Helper getters */ +/** + * g_file_info_get_file_type: + * @info: a #GFileInfo. + * + * Gets a file's type (whether it is a regular file, symlink, etc). + * This is different from the file's content type, see g_file_info_get_content_type(). + * + * Returns: a #GFileType for the given file. + **/ +GFileType +g_file_info_get_file_type (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), G_FILE_TYPE_UNKNOWN); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_TYPE); + + value = g_file_info_find_value (info, attr); + return (GFileType)_g_file_attribute_value_get_uint32 (value); +} + +/** + * g_file_info_get_is_hidden: + * @info: a #GFileInfo. + * + * Checks if a file is hidden. + * + * Returns: %TRUE if the file is a hidden file, %FALSE otherwise. + **/ +gboolean +g_file_info_get_is_hidden (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN); + + value = g_file_info_find_value (info, attr); + return (GFileType)_g_file_attribute_value_get_boolean (value); +} + +/** + * g_file_info_get_is_backup: + * @info: a #GFileInfo. + * + * Checks if a file is a backup file. + * + * Returns: %TRUE if file is a backup file, %FALSE otherwise. + **/ +gboolean +g_file_info_get_is_backup (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP); + + value = g_file_info_find_value (info, attr); + return (GFileType)_g_file_attribute_value_get_boolean (value); +} + +/** + * g_file_info_get_is_symlink: + * @info: a #GFileInfo. + * + * Checks if a file is a symlink. + * + * Returns: %TRUE if the given @info is a symlink. + **/ +gboolean +g_file_info_get_is_symlink (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK); + + value = g_file_info_find_value (info, attr); + return (GFileType)_g_file_attribute_value_get_boolean (value); +} + +/** + * g_file_info_get_name: + * @info: a #GFileInfo. + * + * Gets the name for a file. + * + * Returns: a string containing the file name. + **/ +const char * +g_file_info_get_name (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_NAME); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_byte_string (value); +} + +/** + * g_file_info_get_display_name: + * @info: a #GFileInfo. + * + * Gets a display name for a file. + * + * Returns: a string containing the display name. + **/ +const char * +g_file_info_get_display_name (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_string (value); +} + +/** + * g_file_info_get_edit_name: + * @info: a #GFileInfo. + * + * Gets the edit name for a file. + * + * Returns: a string containing the edit name. + **/ +const char * +g_file_info_get_edit_name (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_string (value); +} + +/** + * g_file_info_get_icon: + * @info: a #GFileInfo. + * + * Gets the icon for a file. + * + * Returns: #GIcon for the given @info. + **/ +GIcon * +g_file_info_get_icon (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + GObject *obj; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_ICON); + + value = g_file_info_find_value (info, attr); + obj = _g_file_attribute_value_get_object (value); + if (G_IS_ICON (obj)) + return G_ICON (obj); + return NULL; +} + +/** + * g_file_info_get_content_type: + * @info: a #GFileInfo. + * + * Gets the file's content type. + * + * Returns: a string containing the file's content type. + **/ +const char * +g_file_info_get_content_type (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_string (value); +} + +/** + * g_file_info_get_size: + * @info: a #GFileInfo. + * + * Gets the file's size. + * + * Returns: a #goffset containing the file's size. + **/ +goffset +g_file_info_get_size (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), (goffset) 0); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SIZE); + + value = g_file_info_find_value (info, attr); + return (goffset) _g_file_attribute_value_get_uint64 (value); +} + +/** + * g_file_info_get_modification_time: + * @info: a #GFileInfo. + * @result: a #GTimeVal. + * + * Gets the modification time of the current @info and sets it + * in @result. + **/ +void +g_file_info_get_modification_time (GFileInfo *info, + GTimeVal *result) +{ + static guint32 attr_mtime = 0, attr_mtime_usec; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (result != NULL); + + if (attr_mtime == 0) + { + attr_mtime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED); + attr_mtime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC); + } + + value = g_file_info_find_value (info, attr_mtime); + result->tv_sec = _g_file_attribute_value_get_uint64 (value); + value = g_file_info_find_value (info, attr_mtime_usec); + result->tv_usec = _g_file_attribute_value_get_uint32 (value); +} + +/** + * g_file_info_get_symlink_target: + * @info: a #GFileInfo. + * + * Gets the symlink target for a given #GFileInfo. + * + * Returns: a string containing the symlink target. + **/ +const char * +g_file_info_get_symlink_target (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_byte_string (value); +} + +/** + * g_file_info_get_etag: + * @info: a #GFileInfo. + * + * Gets the entity tag for a given + * #GFileInfo. See %G_FILE_ATTRIBUTE_ETAG_VALUE. + * + * Returns: a string containing the value of the "etag:value" attribute. + **/ +const char * +g_file_info_get_etag (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_ETAG_VALUE); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_string (value); +} + +/** + * g_file_info_get_sort_order: + * @info: a #GFileInfo. + * + * Gets the value of the sort_order attribute from the #GFileInfo. + * See %G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER. + * + * Returns: a #gint32 containing the value of the "standard::sort_order" attribute. + **/ +gint32 +g_file_info_get_sort_order (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_val_if_fail (G_IS_FILE_INFO (info), 0); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER); + + value = g_file_info_find_value (info, attr); + return _g_file_attribute_value_get_int32 (value); +} + +/* Helper setters: */ +/** + * g_file_info_set_file_type: + * @info: a #GFileInfo. + * @type: a #GFileType. + * + * Sets the file type in a #GFileInfo to @type. + * See %G_FILE_ATTRIBUTE_STANDARD_TYPE. + **/ +void +g_file_info_set_file_type (GFileInfo *info, + GFileType type) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_TYPE); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_uint32 (value, type); +} + +/** + * g_file_info_set_is_hidden: + * @info: a #GFileInfo. + * @is_hidden: a #gboolean. + * + * Sets the "is_hidden" attribute in a #GFileInfo according to @is_symlink. + * See %G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN. + **/ +void +g_file_info_set_is_hidden (GFileInfo *info, + gboolean is_hidden) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_boolean (value, is_hidden); +} + +/** + * g_file_info_set_is_symlink: + * @info: a #GFileInfo. + * @is_symlink: a #gboolean. + * + * Sets the "is_symlink" attribute in a #GFileInfo according to @is_symlink. + * See %G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK. + **/ +void +g_file_info_set_is_symlink (GFileInfo *info, + gboolean is_symlink) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_boolean (value, is_symlink); +} + +/** + * g_file_info_set_name: + * @info: a #GFileInfo. + * @name: a string containing a name. + * + * Sets the name attribute for the current #GFileInfo. + * See %G_FILE_ATTRIBUTE_STANDARD_NAME. + **/ +void +g_file_info_set_name (GFileInfo *info, + const char *name) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (name != NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_NAME); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_byte_string (value, name); +} + +/** + * g_file_info_set_display_name: + * @info: a #GFileInfo. + * @display_name: a string containing a display name. + * + * Sets the display name for the current #GFileInfo. + * See %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME. + **/ +void +g_file_info_set_display_name (GFileInfo *info, + const char *display_name) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (display_name != NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_string (value, display_name); +} + +/** + * g_file_info_set_edit_name: + * @info: a #GFileInfo. + * @edit_name: a string containing an edit name. + * + * Sets the edit name for the current file. + * See %G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME. + **/ +void +g_file_info_set_edit_name (GFileInfo *info, + const char *edit_name) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (edit_name != NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_string (value, edit_name); +} + +/** + * g_file_info_set_icon: + * @info: a #GFileInfo. + * @icon: a #GIcon. + * + * Sets the icon for a given #GFileInfo. + * See %G_FILE_ATTRIBUTE_STANDARD_ICON. + **/ +void +g_file_info_set_icon (GFileInfo *info, + GIcon *icon) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (G_IS_ICON (icon)); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_ICON); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_object (value, G_OBJECT (icon)); +} + +/** + * g_file_info_set_content_type: + * @info: a #GFileInfo. + * @content_type: a content type. See #GContentType. + * + * Sets the content type attribute for a given #GFileInfo. + * See %G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE. + **/ +void +g_file_info_set_content_type (GFileInfo *info, + const char *content_type) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (content_type != NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_string (value, content_type); +} + +/** + * g_file_info_set_size: + * @info: a #GFileInfo. + * @size: a #goffset containing the file's size. + * + * Sets the %G_FILE_ATTRIBUTE_STANDARD_SIZE attribute in the file info + * to the given size. + **/ +void +g_file_info_set_size (GFileInfo *info, + goffset size) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SIZE); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_uint64 (value, size); +} + +/** + * g_file_info_set_modification_time + * @info: a #GFileInfo. + * @mtime: a #GTimeVal. + * + * Sets the %G_FILE_ATTRIBUTE_TIME_MODIFIED attribute in the file + * info to the given time value. + **/ +void +g_file_info_set_modification_time (GFileInfo *info, + GTimeVal *mtime) +{ + static guint32 attr_mtime = 0, attr_mtime_usec; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (mtime != NULL); + + if (attr_mtime == 0) + { + attr_mtime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED); + attr_mtime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC); + } + + value = g_file_info_create_value (info, attr_mtime); + if (value) + _g_file_attribute_value_set_uint64 (value, mtime->tv_sec); + value = g_file_info_create_value (info, attr_mtime_usec); + if (value) + _g_file_attribute_value_set_uint32 (value, mtime->tv_usec); +} + +/** + * g_file_info_set_symlink_target: + * @info: a #GFileInfo. + * @symlink_target: a static string containing a path to a symlink target. + * + * Sets the %G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET attribute in the file info + * to the given symlink target. + **/ +void +g_file_info_set_symlink_target (GFileInfo *info, + const char *symlink_target) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (symlink_target != NULL); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_byte_string (value, symlink_target); +} + +/** + * g_file_info_set_sort_order: + * @info: a #GFileInfo. + * @sort_order: a sort order integer. + * + * Sets the sort order attribute in the file info structure. See + * %G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER. + **/ +void +g_file_info_set_sort_order (GFileInfo *info, + gint32 sort_order) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER); + + value = g_file_info_create_value (info, attr); + if (value) + _g_file_attribute_value_set_int32 (value, sort_order); +} + + +#define ON_STACK_MATCHERS 5 + +typedef struct { + guint32 id; + guint32 mask; +} SubMatcher; + +struct _GFileAttributeMatcher { + gboolean all; + SubMatcher sub_matchers[ON_STACK_MATCHERS]; + GArray *more_sub_matchers; + + /* Interator */ + guint32 iterator_ns; + int iterator_pos; + int ref; +}; + +static void +matcher_add (GFileAttributeMatcher *matcher, + guint id, + guint mask) +{ + SubMatcher *sub_matchers; + int i; + SubMatcher s; + + for (i = 0; i < ON_STACK_MATCHERS; i++) + { + /* First empty spot, not found, use this */ + if (matcher->sub_matchers[i].id == 0) + { + matcher->sub_matchers[i].id = id; + matcher->sub_matchers[i].mask = mask; + return; + } + + /* Already added */ + if (matcher->sub_matchers[i].id == id && + matcher->sub_matchers[i].mask == mask) + return; + } + + if (matcher->more_sub_matchers == NULL) + matcher->more_sub_matchers = g_array_new (FALSE, FALSE, sizeof (SubMatcher)); + + sub_matchers = (SubMatcher *)matcher->more_sub_matchers->data; + for (i = 0; i < matcher->more_sub_matchers->len; i++) + { + /* Already added */ + if (sub_matchers[i].id == id && + sub_matchers[i].mask == mask) + return; + } + + s.id = id; + s.mask = mask; + + g_array_append_val (matcher->more_sub_matchers, s); +} + +/** + * g_file_attribute_matcher_new: + * @attributes: an attribute string to match. + * + * Creates a new file attribute matcher, which matches attributes + * against a given string. #GFileAttributeMatchers are reference + * counted structures, and are created with a reference count of 1. If + * the number of references falls to 0, the #GFileAttributeMatcher is + * automatically destroyed. + * + * The @attribute string should be formatted with specific keys separated + * from namespaces with a double colon. Several "namespace::key" strings may be + * concatenated with a single comma (e.g. "standard::type,standard::is-hidden"). + * The wildcard "*" may be used to match all keys and namespaces, or + * "namespace::*" will match all keys in a given namespace. + * + * Examples of strings to use: + * + * File Attribute Matcher strings and results + * + * Matcher String Matches + * + * "*"matches all attributes. + * "standard::is-hidden"matches only the key is-hidden in the standard namespace. + * "standard::type,unix::*"matches the type key in the standard namespace and + * all keys in the unix namespace. + * + *
+ * + * Returns: a #GFileAttributeMatcher. + **/ +GFileAttributeMatcher * +g_file_attribute_matcher_new (const char *attributes) +{ + char **split; + char *colon; + int i; + GFileAttributeMatcher *matcher; + + if (attributes == NULL || *attributes == '\0') + return NULL; + + matcher = g_malloc0 (sizeof (GFileAttributeMatcher)); + matcher->ref = 1; + + split = g_strsplit (attributes, ",", -1); + + for (i = 0; split[i] != NULL; i++) + { + if (strcmp (split[i], "*") == 0) + matcher->all = TRUE; + else + { + guint32 id, mask; + + colon = strstr (split[i], "::"); + if (colon != NULL && + !(colon[2] == 0 || + (colon[2] == '*' && + colon[3] == 0))) + { + id = lookup_attribute (split[i]); + mask = 0xffffffff; + } + else + { + if (colon) + *colon = 0; + + id = lookup_namespace (split[i]) << NS_POS; + mask = NS_MASK << NS_POS; + } + + matcher_add (matcher, id, mask); + } + } + + g_strfreev (split); + + return matcher; +} + +/** + * g_file_attribute_matcher_ref: + * @matcher: a #GFileAttributeMatcher. + * + * References a file attribute matcher. + * + * Returns: a #GFileAttributeMatcher. + **/ +GFileAttributeMatcher * +g_file_attribute_matcher_ref (GFileAttributeMatcher *matcher) +{ + if (matcher) + { + g_return_val_if_fail (matcher->ref > 0, NULL); + g_atomic_int_inc (&matcher->ref); + } + return matcher; +} + +/** + * g_file_attribute_matcher_unref: + * @matcher: a #GFileAttributeMatcher. + * + * Unreferences @matcher. If the reference count falls below 1, + * the @matcher is automatically freed. + * + **/ +void +g_file_attribute_matcher_unref (GFileAttributeMatcher *matcher) +{ + if (matcher) + { + g_return_if_fail (matcher->ref > 0); + + if (g_atomic_int_dec_and_test (&matcher->ref)) + { + if (matcher->more_sub_matchers) + g_array_free (matcher->more_sub_matchers, TRUE); + + g_free (matcher); + } + } +} + +/** + * g_file_attribute_matcher_matches_only: + * @matcher: a #GFileAttributeMatcher. + * @attribute: a file attribute key. + * + * Checks if a attribute matcher only matches a given attribute. Always + * returns %FALSE if "*" was used when creating the matcher. + * + * Returns: %TRUE if the matcher only matches @attribute. %FALSE otherwise. + **/ +gboolean +g_file_attribute_matcher_matches_only (GFileAttributeMatcher *matcher, + const char *attribute) +{ + guint32 id; + + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + if (matcher == NULL || + matcher->all) + return FALSE; + + id = lookup_attribute (attribute); + + if (matcher->sub_matchers[0].id != 0 && + matcher->sub_matchers[1].id == 0 && + matcher->sub_matchers[0].mask == 0xffffffff && + matcher->sub_matchers[0].id == id) + return TRUE; + + return FALSE; +} + +static gboolean +matcher_matches_id (GFileAttributeMatcher *matcher, + guint32 id) +{ + SubMatcher *sub_matchers; + int i; + + for (i = 0; i < ON_STACK_MATCHERS; i++) + { + if (matcher->sub_matchers[i].id == 0) + return FALSE; + + if (matcher->sub_matchers[i].id == (id & matcher->sub_matchers[i].mask)) + return TRUE; + } + + if (matcher->more_sub_matchers) + { + sub_matchers = (SubMatcher *)matcher->more_sub_matchers->data; + for (i = 0; i < matcher->more_sub_matchers->len; i++) + { + if (sub_matchers[i].id == (id & sub_matchers[i].mask)) + return TRUE; + } + } + + return FALSE; +} + +gboolean +_g_file_attribute_matcher_matches_id (GFileAttributeMatcher *matcher, + guint32 id) +{ + /* We return a NULL matcher for an empty match string, so handle this */ + if (matcher == NULL) + return FALSE; + + if (matcher->all) + return TRUE; + + return matcher_matches_id (matcher, id); +} + +/** + * g_file_attribute_matcher_matches: + * @matcher: a #GFileAttributeMatcher. + * @attribute: a file attribute key. + * + * Checks if an attribute will be matched by an attribute matcher. If + * the matcher was created with the "*" matching string, this function + * will always return %TRUE. + * + * Returns: %TRUE if @attribute matches @matcher. %FALSE otherwise. + **/ +gboolean +g_file_attribute_matcher_matches (GFileAttributeMatcher *matcher, + const char *attribute) +{ + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + /* We return a NULL matcher for an empty match string, so handle this */ + if (matcher == NULL) + return FALSE; + + if (matcher->all) + return TRUE; + + return matcher_matches_id (matcher, lookup_attribute (attribute)); +} + +/* return TRUE -> all */ +/** + * g_file_attribute_matcher_enumerate_namespace: + * @matcher: a #GFileAttributeMatcher. + * @ns: a string containing a file attribute namespace. + * + * Checks if the matcher will match all of the keys in a given namespace. + * This will always return %TRUE if a wildcard character is in use (e.g. if + * matcher was created with "standard::*" and @ns is "standard", or if matcher was created + * using "*" and namespace is anything.) + * + * TODO: this is awkwardly worded. + * + * Returns: %TRUE if the matcher matches all of the entries + * in the given @ns, %FALSE otherwise. + **/ +gboolean +g_file_attribute_matcher_enumerate_namespace (GFileAttributeMatcher *matcher, + const char *ns) +{ + SubMatcher *sub_matchers; + int ns_id; + int i; + + g_return_val_if_fail (ns != NULL && *ns != '\0', FALSE); + + /* We return a NULL matcher for an empty match string, so handle this */ + if (matcher == NULL) + return FALSE; + + if (matcher->all) + return TRUE; + + ns_id = lookup_namespace (ns) << NS_POS; + + for (i = 0; i < ON_STACK_MATCHERS; i++) + { + if (matcher->sub_matchers[i].id == ns_id) + return TRUE; + } + + if (matcher->more_sub_matchers) + { + sub_matchers = (SubMatcher *)matcher->more_sub_matchers->data; + for (i = 0; i < matcher->more_sub_matchers->len; i++) + { + if (sub_matchers[i].id == ns_id) + return TRUE; + } + } + + matcher->iterator_ns = ns_id; + matcher->iterator_pos = 0; + + return FALSE; +} + +/** + * g_file_attribute_matcher_enumerate_next: + * @matcher: a #GFileAttributeMatcher. + * + * Gets the next matched attribute from a #GFileAttributeMatcher. + * + * Returns: a string containing the next attribute or %NULL if + * no more attribute exist. + **/ +const char * +g_file_attribute_matcher_enumerate_next (GFileAttributeMatcher *matcher) +{ + int i; + SubMatcher *sub_matcher; + + /* We return a NULL matcher for an empty match string, so handle this */ + if (matcher == NULL) + return NULL; + + while (1) + { + i = matcher->iterator_pos++; + + if (i < ON_STACK_MATCHERS) + { + if (matcher->sub_matchers[i].id == 0) + return NULL; + + sub_matcher = &matcher->sub_matchers[i]; + } + else + { + if (matcher->more_sub_matchers == NULL) + return NULL; + + i -= ON_STACK_MATCHERS; + if (i < matcher->more_sub_matchers->len) + sub_matcher = &g_array_index (matcher->more_sub_matchers, SubMatcher, i); + else + return NULL; + } + + if (sub_matcher->mask == 0xffffffff && + (sub_matcher->id & (NS_MASK << NS_POS)) == matcher->iterator_ns) + return get_attribute_for_id (sub_matcher->id); + } +} + +#define __G_FILE_INFO_C__ +#include "gioaliasdef.c" diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h new file mode 100644 index 0000000..2b5110f --- /dev/null +++ b/gio/gfileinfo.h @@ -0,0 +1,951 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_INFO_H__ +#define __G_FILE_INFO_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_INFO (g_file_info_get_type ()) +#define G_FILE_INFO(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_INFO, GFileInfo)) +#define G_FILE_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_INFO, GFileInfoClass)) +#define G_IS_FILE_INFO(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_INFO)) +#define G_IS_FILE_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_INFO)) +#define G_FILE_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_INFO, GFileInfoClass)) + +/** + * GFileInfo: + * + * Stores information about a file system object referenced by a #GFile. + **/ +typedef struct _GFileInfoClass GFileInfoClass; + + +/* Common Attributes: */ +/** + * G_FILE_ATTRIBUTE_STANDARD_TYPE: + * + * A key in the "standard" namespace for storing file types. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + * The value for this key should contain a #GFileType. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_TYPE "standard::type" /* uint32 (GFileType) */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN: + * + * A key in the "standard" namespace for checking if a file is hidden. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN "standard::is-hidden" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP: + * + * A key in the "standard" namespace for checking if a file is a backup file. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP "standard::is-backup" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK: + * + * A key in the "standard" namespace for checking if the file is a symlink. + * Typically the actual type is something else, if we followed the symlink + * to get the type. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK "standard::is-symlink" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL: + * + * A key in the "standard" namespace for checking if a file is virtual. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL "standard::is-virtual" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_NAME: + * + * A key in the "standard" namespace for getting the name of the file. + * The name is the on-disk filename which may not be in any known encoding, + * and can thus not be generally displayed as is. + * Use #G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME if you need to display the + * name in a user interface. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_NAME "standard::name" /* byte string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME: + * + * A key in the "standard" namespace for getting the display name of the file. + * A display name is guaranteed to be in UTF8 and can thus be displayed in + * the UI. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "standard::display-name" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME: + * + * A key in the "standard" namespace for edit name of the file. + * An edit name is similar to the display name, but it is meant to be + * used when you want to rename the file in the UI. The display name + * might contain information you don't want in the new filename (such as + * "(invalid unicode)" if the filename was in an invalid encoding). + * + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME "standard::edit-name" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_COPY_NAME: + * + * A key in the "standard" namespace for getting the copy name of the file. + * The copy name is an optional version of the name. If available it's always + * in UTF8, and corresponds directly to the original filename (only transcoded to + * UTF8). This is useful if you want to copy the file to another filesystem that + * might have a different encoding. If the filename is not a valid string in the + * encoding selected for the filesystem it is in then the copy name will not be set. + * + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_COPY_NAME "standard::copy-name" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION: + * + * A key in the "standard" namespace for getting the description of the file. + * The description is a utf8 string that describes the file, generally containing + * the filename, but can also contain furter information. Example descriptions + * could be "filename (on hostname)" for a remote file or "filename (in trash)" + * for a file in the trash. This is useful for instance as the window title + * when displaying a directory or for a bookmarks menu. + * + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION "standard::description" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_ICON: + * + * A key in the "standard" namespace for getting the icon for the file. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_OBJECT. + * The value for this key should contain a #GIcon. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_ICON "standard::icon" /* object (GIcon) */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE: + * + * A key in the "standard" namespace for getting the content type of the file. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + * The value for this key should contain a valid content type. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "standard::content-type" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE: + * + * A key in the "standard" namespace for getting the fast content type. + * The fast content type isn't as reliable as the regular one, as it + * only uses the filename to guess it, but it is faster to calculate than the + * regular content type. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + * + **/ +#define G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE "standard::fast-content-type" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_SIZE: + * + * A key in the "standard" namespace for getting the file's size (in bytes). + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT64. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_SIZE "standard::size" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE: + * + * A key in the "standard" namespace for getting the amount of disk space + * that is consumed by the file (in bytes). This will generally be larger + * than the file size (due to block size overhead) but can occasionally be + * smaller (for example, for sparse files). + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT64. + * + * Since: 2.20 + **/ +#define G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE "standard::allocated-size" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET: + * + * A key in the "standard" namespace for getting the symlink target, if the file + * is a symlink. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET "standard::symlink-target" /* byte string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_TARGET_URI: + * + * A key in the "standard" namespace for getting the target URI for the file, in + * the case of %G_FILE_TYPE_SHORTCUT or %G_FILE_TYPE_MOUNTABLE files. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_TARGET_URI "standard::target-uri" /* string */ + +/** + * G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER: + * + * A key in the "standard" namespace for setting the sort order of a file. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_INT32. + * An example use would be in file managers, which would use this key + * to set the order files are displayed. Files with smaller sort order + * should be sorted first, and files without sort order as if sort order + * was zero. + **/ +#define G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER "standard::sort-order" /* int32 */ + +/* Entity tags, used to avoid missing updates on save */ + +/** + * G_FILE_ATTRIBUTE_ETAG_VALUE: + * + * A key in the "etag" namespace for getting the value of the file's + * entity tag. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_ETAG_VALUE "etag::value" /* string */ + +/* File identifier, for e.g. avoiding loops when doing recursive + * directory scanning + */ + +/** + * G_FILE_ATTRIBUTE_ID_FILE: + * + * A key in the "id" namespace for getting a file identifier. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + * An example use would be during listing files, to avoid recursive + * directory scanning. + **/ +#define G_FILE_ATTRIBUTE_ID_FILE "id::file" /* string */ + +/** + * G_FILE_ATTRIBUTE_ID_FILESYSTEM: + * + * A key in the "id" namespace for getting the file system identifier. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + * An example use would be during drag and drop to see if the source + * and target are on the same filesystem (default to move) or not (default + * to copy). + **/ +#define G_FILE_ATTRIBUTE_ID_FILESYSTEM "id::filesystem" /* string */ + +/* Calculated Access Rights for current user */ + +/** + * G_FILE_ATTRIBUTE_ACCESS_CAN_READ: + * + * A key in the "access" namespace for getting read privileges. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * This attribute will be %TRUE if the user is able to read the file. + **/ +#define G_FILE_ATTRIBUTE_ACCESS_CAN_READ "access::can-read" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE: + * + * A key in the "access" namespace for getting write privileges. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * This attribute will be %TRUE if the user is able to write to the file. + **/ +#define G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE "access::can-write" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE: + * + * A key in the "access" namespace for getting execution privileges. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * This attribute will be %TRUE if the user is able to execute the file. + **/ +#define G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE "access::can-execute" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE: + * + * A key in the "access" namespace for checking deletion privileges. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * This attribute will be %TRUE if the user is able to delete the file. + **/ +#define G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE "access::can-delete" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH: + * + * A key in the "access" namespace for checking trashing privileges. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * This attribute will be %TRUE if the user is able to move the file to + * the trash. + **/ +#define G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH "access::can-trash" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME: + * + * A key in the "access" namespace for checking renaming privileges. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * This attribute will be %TRUE if the user is able to rename the file. + **/ +#define G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME "access::can-rename" /* boolean */ + +/* TODO: Should we have special version for directories? can_enumerate, etc */ + +/* Mountable attributes */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) is mountable. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT "mountable::can-mount" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) is unmountable. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT "mountable::can-unmount" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be ejected. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT "mountable::can-eject" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE: + * + * A key in the "mountable" namespace for getting the unix device. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE "mountable::unix-device" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE: + * + * A key in the "mountable" namespace for getting the unix device file. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + * + * Since: 2.22 + **/ +#define G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE "mountable::unix-device-file" /* string */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI: + * + * A key in the "mountable" namespace for getting the HAL UDI for the mountable + * file. Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI "mountable::hal-udi" /* string */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be started. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * + * Since: 2.22 + */ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START "mountable::can-start" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be started + * degraded. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * + * Since: 2.22 + */ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED "mountable::can-start-degraded" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be stopped. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * + * Since: 2.22 + */ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP "mountable::can-stop" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE: + * + * A key in the "mountable" namespace for getting the #GDriveStartStopType. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + * + * Since: 2.22 + */ +#define G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE "mountable::start-stop-type" /* uint32 (GDriveStartStopType) */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) can be polled. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * + * Since: 2.22 + */ +#define G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL "mountable::can-poll" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC: + * + * A key in the "mountable" namespace for checking if a file (of type G_FILE_TYPE_MOUNTABLE) + * is automatically polled for media. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + * + * Since: 2.22 + */ +#define G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC "mountable::is-media-check-automatic" /* boolean */ + +/* Time attributes */ + +/** + * G_FILE_ATTRIBUTE_TIME_MODIFIED: + * + * A key in the "time" namespace for getting the time the file was last + * modified. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT64, and contains the UNIX time since the + * file was modified. + **/ +#define G_FILE_ATTRIBUTE_TIME_MODIFIED "time::modified" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC: + * + * A key in the "time" namespace for getting the miliseconds of the time + * the file was last modified. This should be used in conjunction with + * #G_FILE_ATTRIBUTE_TIME_MODIFIED. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC "time::modified-usec" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_TIME_ACCESS: + * + * A key in the "time" namespace for getting the time the file was last + * accessed. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT64, and contains the UNIX time since the + * file was last accessed. + **/ +#define G_FILE_ATTRIBUTE_TIME_ACCESS "time::access" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_TIME_ACCESS_USEC: + * + * A key in the "time" namespace for getting the microseconds of the time + * the file was last accessed. This should be used in conjunction with + * #G_FILE_ATTRIBUTE_TIME_ACCESS. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_TIME_ACCESS_USEC "time::access-usec" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_TIME_CHANGED: + * + * A key in the "time" namespace for getting the time the file was last + * changed. Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT64, + * and contains the UNIX time since the file was last changed. + * + * This corresponds to the traditional UNIX ctime. + **/ +#define G_FILE_ATTRIBUTE_TIME_CHANGED "time::changed" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_TIME_CHANGED_USEC: + * + * A key in the "time" namespace for getting the microseconds of the time + * the file was last changed. This should be used in conjunction with + * #G_FILE_ATTRIBUTE_TIME_CHANGED. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_TIME_CHANGED_USEC "time::changed-usec" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_TIME_CREATED: + * + * A key in the "time" namespace for getting the time the file was created. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT64, + * and contains the UNIX time since the file was created. + * + * This corresponds to the NTFS ctime. + **/ +#define G_FILE_ATTRIBUTE_TIME_CREATED "time::created" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_TIME_CREATED_USEC: + * + * A key in the "time" namespace for getting the microseconds of the time + * the file was created. This should be used in conjunction with + * #G_FILE_ATTRIBUTE_TIME_CREATED. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_TIME_CREATED_USEC "time::created-usec" /* uint32 */ + +/* Unix specific attributes */ + +/** + * G_FILE_ATTRIBUTE_UNIX_DEVICE: + * + * A key in the "unix" namespace for getting the device id of the device the + * file is located on (see stat() documentation). This attribute is only + * available for UNIX file systems. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_DEVICE "unix::device" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_INODE: + * + * A key in the "unix" namespace for getting the inode of the file. + * This attribute is only available for UNIX file systems. Corresponding + * #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT64. + **/ +#define G_FILE_ATTRIBUTE_UNIX_INODE "unix::inode" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_MODE: + * + * A key in the "unix" namespace for getting the mode of the file + * (e.g. whether the file is a regular file, symlink, etc). See lstat() + * documentation. This attribute is only available for UNIX file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_MODE "unix::mode" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_NLINK: + * + * A key in the "unix" namespace for getting the number of hard links + * for a file. See lstat() documentation. This attribute is only available + * for UNIX file systems. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_NLINK "unix::nlink" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_UID: + * + * A key in the "unix" namespace for getting the user ID for the file. + * This attribute is only available for UNIX file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_UID "unix::uid" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_GID: + * + * A key in the "unix" namespace for getting the group ID for the file. + * This attribute is only available for UNIX file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_GID "unix::gid" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_RDEV: + * + * A key in the "unix" namespace for getting the device ID for the file + * (if it is a special file). See lstat() documentation. This attribute + * is only available for UNIX file systems. Corresponding #GFileAttributeType + * is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_RDEV "unix::rdev" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE: + * + * A key in the "unix" namespace for getting the block size for the file + * system. This attribute is only available for UNIX file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE "unix::block-size" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_BLOCKS: + * + * A key in the "unix" namespace for getting the number of blocks allocated + * for the file. This attribute is only available for UNIX file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT64. + **/ +#define G_FILE_ATTRIBUTE_UNIX_BLOCKS "unix::blocks" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT: + * + * A key in the "unix" namespace for checking if the file represents a + * UNIX mount point. This attribute is %TRUE if the file is a UNIX mount + * point. This attribute is only available for UNIX file systems. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT "unix::is-mountpoint" /* boolean */ + +/* DOS specific attributes */ + +/** + * G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE: + * + * A key in the "dos" namespace for checking if the file's archive flag + * is set. This attribute is %TRUE if the archive flag is set. This attribute + * is only available for DOS file systems. Corresponding #GFileAttributeType + * is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE "dos::is-archive" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_DOS_IS_SYSTEM: + * + * A key in the "dos" namespace for checking if the file's backup flag + * is set. This attribute is %TRUE if the backup flag is set. This attribute + * is only available for DOS file systems. Corresponding #GFileAttributeType + * is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_DOS_IS_SYSTEM "dos::is-system" /* boolean */ + +/* Owner attributes */ + +/** + * G_FILE_ATTRIBUTE_OWNER_USER: + * + * A key in the "owner" namespace for getting the user name of the + * file's owner. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_OWNER_USER "owner::user" /* string */ + +/** + * G_FILE_ATTRIBUTE_OWNER_USER_REAL: + * + * A key in the "owner" namespace for getting the real name of the + * user that owns the file. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_OWNER_USER_REAL "owner::user-real" /* string */ + +/** + * G_FILE_ATTRIBUTE_OWNER_GROUP: + * + * A key in the "owner" namespace for getting the file owner's group. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_OWNER_GROUP "owner::group" /* string */ + +/* Thumbnails */ + +/** + * G_FILE_ATTRIBUTE_THUMBNAIL_PATH: + * + * A key in the "thumbnail" namespace for getting the path to the thumbnail + * image. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING. + **/ +#define G_FILE_ATTRIBUTE_THUMBNAIL_PATH "thumbnail::path" /* bytestring */ +/** + * G_FILE_ATTRIBUTE_THUMBNAILING_FAILED: + * + * A key in the "thumbnail" namespace for checking if thumbnailing failed. + * This attribute is %TRUE if thumbnailing failed. Corresponding + * #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_THUMBNAILING_FAILED "thumbnail::failed" /* boolean */ + +/* Preview */ + +/** + * G_FILE_ATTRIBUTE_PREVIEW_ICON: + * + * A key in the "preview" namespace for getting a #GIcon that can be + * used to get preview of the file. For example, it may be a low + * resolution thumbnail without metadata. Corresponding + * #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_OBJECT. The value + * for this key should contain a #GIcon. + * + * Since: 2.20 + **/ +#define G_FILE_ATTRIBUTE_PREVIEW_ICON "preview::icon" /* object (GIcon) */ + +/* File system info (for g_file_get_filesystem_info) */ + +/** + * G_FILE_ATTRIBUTE_FILESYSTEM_SIZE: + * + * A key in the "filesystem" namespace for getting the total size (in bytes) of the file system, + * used in g_file_query_filesystem_info(). Corresponding #GFileAttributeType + * is %G_FILE_ATTRIBUTE_TYPE_UINT64. + **/ +#define G_FILE_ATTRIBUTE_FILESYSTEM_SIZE "filesystem::size" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_FILESYSTEM_FREE: + * + * A key in the "filesystem" namespace for getting the number of bytes of free space left on the + * file system. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT64. + **/ +#define G_FILE_ATTRIBUTE_FILESYSTEM_FREE "filesystem::free" /* uint64 */ + +/** + * G_FILE_ATTRIBUTE_FILESYSTEM_TYPE: + * + * A key in the "filesystem" namespace for getting the file system's type. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_FILESYSTEM_TYPE "filesystem::type" /* string */ + +/** + * G_FILE_ATTRIBUTE_FILESYSTEM_READONLY: + * + * A key in the "filesystem" namespace for checking if the file system + * is read only. Is set to %TRUE if the file system is read only. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BOOLEAN. + **/ +#define G_FILE_ATTRIBUTE_FILESYSTEM_READONLY "filesystem::readonly" /* boolean */ + +/** + * G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW: + * + * A key in the "filesystem" namespace for hinting a file manager + * application whether it should preview (e.g. thumbnail) files on the + * file system. The value for this key contain a + * #GFilesystemPreviewType. + **/ +#define G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW "filesystem::use-preview" /* uint32 (GFilesystemPreviewType) */ + +/** + * G_FILE_ATTRIBUTE_GVFS_BACKEND: + * + * A key in the "gvfs" namespace that gets the name of the current + * GVFS backend in use. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_STRING. + **/ +#define G_FILE_ATTRIBUTE_GVFS_BACKEND "gvfs::backend" /* string */ + +/** + * G_FILE_ATTRIBUTE_SELINUX_CONTEXT: + * + * A key in the "selinux" namespace for getting the file's SELinux + * context. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_STRING. Note that this attribute is only + * available if GLib has been built with SELinux support. + **/ +#define G_FILE_ATTRIBUTE_SELINUX_CONTEXT "selinux::context" /* string */ + +/** + * G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT: + * + * A key in the "trash" namespace. When requested against + * "trash:///" returns the number of (toplevel) items in the trash folder. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_UINT32. + **/ +#define G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT "trash::item-count" /* uint32 */ + +/** + * G_FILE_ATTRIBUTE_TRASH_ORIG_PATH: + * + * A key in the "trash" namespace. When requested against + * items in "trash:///", will return the original path to the file before it + * was trashed. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_STRING. + * + * Since: 2.24. + **/ +#define G_FILE_ATTRIBUTE_TRASH_ORIG_PATH "trash::orig-path" /* string */ + +/** + * G_FILE_ATTRIBUTE_TRASH_DELETION_DATE: + * + * A key in the "trash" namespace. When requested against + * items in "trash:///", will return the date and time when the file + * was trashed. The format of the returned string is YYYY-MM-DDThh:mm:ss. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. + * + * Since: 2.24. + **/ +#define G_FILE_ATTRIBUTE_TRASH_DELETION_DATE "trash::deletion-date" /* string */ + +GType g_file_info_get_type (void) G_GNUC_CONST; + +GFileInfo * g_file_info_new (void); +GFileInfo * g_file_info_dup (GFileInfo *other); +void g_file_info_copy_into (GFileInfo *src_info, + GFileInfo *dest_info); +gboolean g_file_info_has_attribute (GFileInfo *info, + const char *attribute); +gboolean g_file_info_has_namespace (GFileInfo *info, + const char *name_space); +char ** g_file_info_list_attributes (GFileInfo *info, + const char *name_space); +gboolean g_file_info_get_attribute_data (GFileInfo *info, + const char *attribute, + GFileAttributeType *type, + gpointer *value_pp, + GFileAttributeStatus *status); +GFileAttributeType g_file_info_get_attribute_type (GFileInfo *info, + const char *attribute); +void g_file_info_remove_attribute (GFileInfo *info, + const char *attribute); +GFileAttributeStatus g_file_info_get_attribute_status (GFileInfo *info, + const char *attribute); +gboolean g_file_info_set_attribute_status (GFileInfo *info, + const char *attribute, + GFileAttributeStatus status); +char * g_file_info_get_attribute_as_string (GFileInfo *info, + const char *attribute); +const char * g_file_info_get_attribute_string (GFileInfo *info, + const char *attribute); +const char * g_file_info_get_attribute_byte_string (GFileInfo *info, + const char *attribute); +gboolean g_file_info_get_attribute_boolean (GFileInfo *info, + const char *attribute); +guint32 g_file_info_get_attribute_uint32 (GFileInfo *info, + const char *attribute); +gint32 g_file_info_get_attribute_int32 (GFileInfo *info, + const char *attribute); +guint64 g_file_info_get_attribute_uint64 (GFileInfo *info, + const char *attribute); +gint64 g_file_info_get_attribute_int64 (GFileInfo *info, + const char *attribute); +GObject * g_file_info_get_attribute_object (GFileInfo *info, + const char *attribute); +char ** g_file_info_get_attribute_stringv (GFileInfo *info, + const char *attribute); + +void g_file_info_set_attribute (GFileInfo *info, + const char *attribute, + GFileAttributeType type, + gpointer value_p); +void g_file_info_set_attribute_string (GFileInfo *info, + const char *attribute, + const char *attr_value); +void g_file_info_set_attribute_byte_string (GFileInfo *info, + const char *attribute, + const char *attr_value); +void g_file_info_set_attribute_boolean (GFileInfo *info, + const char *attribute, + gboolean attr_value); +void g_file_info_set_attribute_uint32 (GFileInfo *info, + const char *attribute, + guint32 attr_value); +void g_file_info_set_attribute_int32 (GFileInfo *info, + const char *attribute, + gint32 attr_value); +void g_file_info_set_attribute_uint64 (GFileInfo *info, + const char *attribute, + guint64 attr_value); +void g_file_info_set_attribute_int64 (GFileInfo *info, + const char *attribute, + gint64 attr_value); +void g_file_info_set_attribute_object (GFileInfo *info, + const char *attribute, + GObject *attr_value); +void g_file_info_set_attribute_stringv (GFileInfo *info, + const char *attribute, + char **attr_value); + +void g_file_info_clear_status (GFileInfo *info); + +/* Helper getters: */ +GFileType g_file_info_get_file_type (GFileInfo *info); +gboolean g_file_info_get_is_hidden (GFileInfo *info); +gboolean g_file_info_get_is_backup (GFileInfo *info); +gboolean g_file_info_get_is_symlink (GFileInfo *info); +const char * g_file_info_get_name (GFileInfo *info); +const char * g_file_info_get_display_name (GFileInfo *info); +const char * g_file_info_get_edit_name (GFileInfo *info); +GIcon * g_file_info_get_icon (GFileInfo *info); +const char * g_file_info_get_content_type (GFileInfo *info); +goffset g_file_info_get_size (GFileInfo *info); +void g_file_info_get_modification_time (GFileInfo *info, + GTimeVal *result); +const char * g_file_info_get_symlink_target (GFileInfo *info); +const char * g_file_info_get_etag (GFileInfo *info); +gint32 g_file_info_get_sort_order (GFileInfo *info); + +void g_file_info_set_attribute_mask (GFileInfo *info, + GFileAttributeMatcher *mask); +void g_file_info_unset_attribute_mask (GFileInfo *info); + +/* Helper setters: */ +void g_file_info_set_file_type (GFileInfo *info, + GFileType type); +void g_file_info_set_is_hidden (GFileInfo *info, + gboolean is_hidden); +void g_file_info_set_is_symlink (GFileInfo *info, + gboolean is_symlink); +void g_file_info_set_name (GFileInfo *info, + const char *name); +void g_file_info_set_display_name (GFileInfo *info, + const char *display_name); +void g_file_info_set_edit_name (GFileInfo *info, + const char *edit_name); +void g_file_info_set_icon (GFileInfo *info, + GIcon *icon); +void g_file_info_set_content_type (GFileInfo *info, + const char *content_type); +void g_file_info_set_size (GFileInfo *info, + goffset size); +void g_file_info_set_modification_time (GFileInfo *info, + GTimeVal *mtime); +void g_file_info_set_symlink_target (GFileInfo *info, + const char *symlink_target); +void g_file_info_set_sort_order (GFileInfo *info, + gint32 sort_order); + +GFileAttributeMatcher *g_file_attribute_matcher_new (const char *attributes); +GFileAttributeMatcher *g_file_attribute_matcher_ref (GFileAttributeMatcher *matcher); +void g_file_attribute_matcher_unref (GFileAttributeMatcher *matcher); +gboolean g_file_attribute_matcher_matches (GFileAttributeMatcher *matcher, + const char *attribute); +gboolean g_file_attribute_matcher_matches_only (GFileAttributeMatcher *matcher, + const char *attribute); +gboolean g_file_attribute_matcher_enumerate_namespace (GFileAttributeMatcher *matcher, + const char *ns); +const char * g_file_attribute_matcher_enumerate_next (GFileAttributeMatcher *matcher); + +G_END_DECLS + +#endif /* __G_FILE_INFO_H__ */ diff --git a/gio/gfileinputstream.c b/gio/gfileinputstream.c new file mode 100644 index 0000000..502584b --- /dev/null +++ b/gio/gfileinputstream.c @@ -0,0 +1,473 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfileinputstream + * @short_description: File input streaming operations + * @include: gio/gio.h + * @see_also: #GInputStream, #GDataInputStream, #GSeekable + * + * GFileInputStream provides input streams that take their + * content from a file. + * + * GFileInputStream implements #GSeekable, which allows the input + * stream to jump to arbitrary positions in the file, provided the + * filesystem of the file allows it. To find the position of a file + * input stream, use g_seekable_tell(). To find out if a file input + * stream supports seeking, use g_seekable_stream_can_seek(). + * To position a file input stream, use g_seekable_seek(). + **/ + +static void g_file_input_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_file_input_stream_seekable_tell (GSeekable *seekable); +static gboolean g_file_input_stream_seekable_can_seek (GSeekable *seekable); +static gboolean g_file_input_stream_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_file_input_stream_seekable_can_truncate (GSeekable *seekable); +static gboolean g_file_input_stream_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); +static void g_file_input_stream_real_query_info_async (GFileInputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileInfo *g_file_input_stream_real_query_info_finish (GFileInputStream *stream, + GAsyncResult *result, + GError **error); + + +G_DEFINE_TYPE_WITH_CODE (GFileInputStream, g_file_input_stream, G_TYPE_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_file_input_stream_seekable_iface_init)) + +struct _GFileInputStreamPrivate { + GAsyncReadyCallback outstanding_callback; +}; + +static void +g_file_input_stream_class_init (GFileInputStreamClass *klass) +{ + g_type_class_add_private (klass, sizeof (GFileInputStreamPrivate)); + + klass->query_info_async = g_file_input_stream_real_query_info_async; + klass->query_info_finish = g_file_input_stream_real_query_info_finish; +} + +static void +g_file_input_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_file_input_stream_seekable_tell; + iface->can_seek = g_file_input_stream_seekable_can_seek; + iface->seek = g_file_input_stream_seekable_seek; + iface->can_truncate = g_file_input_stream_seekable_can_truncate; + iface->truncate_fn = g_file_input_stream_seekable_truncate; +} + +static void +g_file_input_stream_init (GFileInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_FILE_INPUT_STREAM, + GFileInputStreamPrivate); +} + +/** + * g_file_input_stream_query_info: + * @stream: a #GFileInputStream. + * @attributes: a file attribute query string. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Queries a file input stream the given @attributes. This function blocks + * while querying the stream. For the asynchronous (non-blocking) version + * of this function, see g_file_input_stream_query_info_async(). While the + * stream is blocked, the stream will set the pending flag internally, and + * any other operations on the stream will fail with %G_IO_ERROR_PENDING. + * + * Returns: a #GFileInfo, or %NULL on error. + **/ +GFileInfo * +g_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GFileInputStreamClass *class; + GInputStream *input_stream; + GFileInfo *info; + + g_return_val_if_fail (G_IS_FILE_INPUT_STREAM (stream), NULL); + + input_stream = G_INPUT_STREAM (stream); + + if (!g_input_stream_set_pending (input_stream, error)) + return NULL; + + info = NULL; + + if (cancellable) + g_cancellable_push_current (cancellable); + + class = G_FILE_INPUT_STREAM_GET_CLASS (stream); + if (class->query_info) + info = class->query_info (stream, attributes, cancellable, error); + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Stream doesn't support query_info")); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (input_stream); + + return info; +} + +static void +async_ready_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileInputStream *stream = G_FILE_INPUT_STREAM (source_object); + + g_input_stream_clear_pending (G_INPUT_STREAM (stream)); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_file_input_stream_query_info_async: + * @stream: a #GFileInputStream. + * @attributes: a file attribute query string. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Queries the stream information asynchronously. + * When the operation is finished @callback will be called. + * You can then call g_file_input_stream_query_info_finish() + * to get the result of the operation. + * + * For the synchronous version of this function, + * see g_file_input_stream_query_info(). + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be set + * + **/ +void +g_file_input_stream_query_info_async (GFileInputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileInputStreamClass *klass; + GInputStream *input_stream; + GError *error = NULL; + + g_return_if_fail (G_IS_FILE_INPUT_STREAM (stream)); + + input_stream = G_INPUT_STREAM (stream); + + if (!g_input_stream_set_pending (input_stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + klass = G_FILE_INPUT_STREAM_GET_CLASS (stream); + + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + klass->query_info_async (stream, attributes, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_file_input_stream_query_info_finish: + * @stream: a #GFileInputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, + * or %NULL to ignore. + * + * Finishes an asynchronous info query operation. + * + * Returns: #GFileInfo. + **/ +GFileInfo * +g_file_input_stream_query_info_finish (GFileInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GFileInputStreamClass *class; + + g_return_val_if_fail (G_IS_FILE_INPUT_STREAM (stream), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + class = G_FILE_INPUT_STREAM_GET_CLASS (stream); + return class->query_info_finish (stream, result, error); +} + +static goffset +g_file_input_stream_tell (GFileInputStream *stream) +{ + GFileInputStreamClass *class; + goffset offset; + + g_return_val_if_fail (G_IS_FILE_INPUT_STREAM (stream), 0); + + class = G_FILE_INPUT_STREAM_GET_CLASS (stream); + + offset = 0; + if (class->tell) + offset = class->tell (stream); + + return offset; +} + +static goffset +g_file_input_stream_seekable_tell (GSeekable *seekable) +{ + return g_file_input_stream_tell (G_FILE_INPUT_STREAM (seekable)); +} + +static gboolean +g_file_input_stream_can_seek (GFileInputStream *stream) +{ + GFileInputStreamClass *class; + gboolean can_seek; + + g_return_val_if_fail (G_IS_FILE_INPUT_STREAM (stream), FALSE); + + class = G_FILE_INPUT_STREAM_GET_CLASS (stream); + + can_seek = FALSE; + if (class->seek) + { + can_seek = TRUE; + if (class->can_seek) + can_seek = class->can_seek (stream); + } + + return can_seek; +} + +static gboolean +g_file_input_stream_seekable_can_seek (GSeekable *seekable) +{ + return g_file_input_stream_can_seek (G_FILE_INPUT_STREAM (seekable)); +} + +static gboolean +g_file_input_stream_seek (GFileInputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GFileInputStreamClass *class; + GInputStream *input_stream; + gboolean res; + + g_return_val_if_fail (G_IS_FILE_INPUT_STREAM (stream), FALSE); + + input_stream = G_INPUT_STREAM (stream); + class = G_FILE_INPUT_STREAM_GET_CLASS (stream); + + if (!class->seek) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on stream")); + return FALSE; + } + + if (!g_input_stream_set_pending (input_stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->seek (stream, offset, type, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (input_stream); + + return res; +} + +static gboolean +g_file_input_stream_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + return g_file_input_stream_seek (G_FILE_INPUT_STREAM (seekable), + offset, type, cancellable, error); +} + +static gboolean +g_file_input_stream_seekable_can_truncate (GSeekable *seekable) +{ + return FALSE; +} + +static gboolean +g_file_input_stream_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Truncate not allowed on input stream")); + return FALSE; +} + +/******************************************** + * Default implementation of async ops * + ********************************************/ + +typedef struct { + char *attributes; + GFileInfo *info; +} QueryInfoAsyncData; + +static void +query_info_data_free (QueryInfoAsyncData *data) +{ + if (data->info) + g_object_unref (data->info); + g_free (data->attributes); + g_free (data); +} + +static void +query_info_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileInputStreamClass *class; + GError *error = NULL; + QueryInfoAsyncData *data; + GFileInfo *info; + + data = g_simple_async_result_get_op_res_gpointer (res); + + info = NULL; + + class = G_FILE_INPUT_STREAM_GET_CLASS (object); + if (class->query_info) + info = class->query_info (G_FILE_INPUT_STREAM (object), data->attributes, cancellable, &error); + else + g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Stream doesn't support query_info")); + + if (info == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->info = info; +} + +static void +g_file_input_stream_real_query_info_async (GFileInputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + QueryInfoAsyncData *data; + + data = g_new0 (QueryInfoAsyncData, 1); + data->attributes = g_strdup (attributes); + + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_file_input_stream_real_query_info_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)query_info_data_free); + + g_simple_async_result_run_in_thread (res, query_info_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileInfo * +g_file_input_stream_real_query_info_finish (GFileInputStream *stream, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + QueryInfoAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_input_stream_real_query_info_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->info) + return g_object_ref (data->info); + + return NULL; +} + +#define __G_FILE_INPUT_STREAM_C__ +#include "gioaliasdef.c" + diff --git a/gio/gfileinputstream.h b/gio/gfileinputstream.h new file mode 100644 index 0000000..3c162c7 --- /dev/null +++ b/gio/gfileinputstream.h @@ -0,0 +1,112 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_INPUT_STREAM_H__ +#define __G_FILE_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_INPUT_STREAM (g_file_input_stream_get_type ()) +#define G_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_INPUT_STREAM, GFileInputStream)) +#define G_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_INPUT_STREAM, GFileInputStreamClass)) +#define G_IS_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_INPUT_STREAM)) +#define G_IS_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_INPUT_STREAM)) +#define G_FILE_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_INPUT_STREAM, GFileInputStreamClass)) + +/** + * GFileInputStream: + * + * A subclass of GInputStream for opened files. This adds + * a few file-specific operations and seeking. + * + * #GFileInputStream implements #GSeekable. + **/ +typedef struct _GFileInputStreamClass GFileInputStreamClass; +typedef struct _GFileInputStreamPrivate GFileInputStreamPrivate; + +struct _GFileInputStream +{ + GInputStream parent_instance; + + /*< private >*/ + GFileInputStreamPrivate *priv; +}; + +struct _GFileInputStreamClass +{ + GInputStreamClass parent_class; + + goffset (* tell) (GFileInputStream *stream); + gboolean (* can_seek) (GFileInputStream *stream); + gboolean (* seek) (GFileInputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); + GFileInfo * (* query_info) (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); + void (* query_info_async) (GFileInputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileInfo * (* query_info_finish) (GFileInputStream *stream, + GAsyncResult *res, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_file_input_stream_get_type (void) G_GNUC_CONST; + +GFileInfo *g_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +void g_file_input_stream_query_info_async (GFileInputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInfo *g_file_input_stream_query_info_finish (GFileInputStream *stream, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_FILE_FILE_INPUT_STREAM_H__ */ diff --git a/gio/gfileiostream.c b/gio/gfileiostream.c new file mode 100644 index 0000000..d7bff9d --- /dev/null +++ b/gio/gfileiostream.c @@ -0,0 +1,677 @@ +/* GIO - GLib Input, IO and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include "gsimpleasyncresult.h" +#include "gasyncresult.h" +#include "gcancellable.h" +#include "gioerror.h" +#include "gfileoutputstream.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfileiostream + * @short_description: File read and write streaming operations + * @include: gio/gio.h + * @see_also: #GIOStream, #GFileInputStream, #GFileOutputStream, #GSeekable + * + * GFileIOStream provides io streams that both read and write to the same + * file handle. + * + * GFileIOStream implements #GSeekable, which allows the io + * stream to jump to arbitrary positions in the file and to truncate + * the file, provided the filesystem of the file supports these + * operations. + * + * To find the position of a file io stream, use + * g_seekable_tell(). + * + * To find out if a file io stream supports seeking, use g_seekable_can_seek(). + * To position a file io stream, use g_seekable_seek(). + * To find out if a file io stream supports truncating, use + * g_seekable_can_truncate(). To truncate a file io + * stream, use g_seekable_truncate(). + * + * The default implementation of all the #GFileIOStream operations + * and the implementation of #GSeekable just call into the same operations + * on the output stream. + * Since: 2.22 + **/ + +static void g_file_io_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_file_io_stream_seekable_tell (GSeekable *seekable); +static gboolean g_file_io_stream_seekable_can_seek (GSeekable *seekable); +static gboolean g_file_io_stream_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_file_io_stream_seekable_can_truncate (GSeekable *seekable); +static gboolean g_file_io_stream_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); +static void g_file_io_stream_real_query_info_async (GFileIOStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileInfo *g_file_io_stream_real_query_info_finish (GFileIOStream *stream, + GAsyncResult *result, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GFileIOStream, g_file_io_stream, G_TYPE_IO_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_file_io_stream_seekable_iface_init)); + +struct _GFileIOStreamPrivate { + GAsyncReadyCallback outstanding_callback; +}; + +static void +g_file_io_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_file_io_stream_seekable_tell; + iface->can_seek = g_file_io_stream_seekable_can_seek; + iface->seek = g_file_io_stream_seekable_seek; + iface->can_truncate = g_file_io_stream_seekable_can_truncate; + iface->truncate_fn = g_file_io_stream_seekable_truncate; +} + +static void +g_file_io_stream_init (GFileIOStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_FILE_IO_STREAM, + GFileIOStreamPrivate); +} + +/** + * g_file_io_stream_query_info: + * @stream: a #GFileIOStream. + * @attributes: a file attribute query string. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Queries a file io stream for the given @attributes. + * This function blocks while querying the stream. For the asynchronous + * version of this function, see g_file_io_stream_query_info_async(). + * While the stream is blocked, the stream will set the pending flag + * internally, and any other operations on the stream will fail with + * %G_IO_ERROR_PENDING. + * + * Can fail if the stream was already closed (with @error being set to + * %G_IO_ERROR_CLOSED), the stream has pending operations (with @error being + * set to %G_IO_ERROR_PENDING), or if querying info is not supported for + * the stream's interface (with @error being set to %G_IO_ERROR_NOT_SUPPORTED). I + * all cases of failure, %NULL will be returned. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be set, and %NULL will + * be returned. + * + * Returns: a #GFileInfo for the @stream, or %NULL on error. + * + * Since: 2.22 + **/ +GFileInfo * +g_file_io_stream_query_info (GFileIOStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GFileIOStreamClass *class; + GIOStream *io_stream; + GFileInfo *info; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), NULL); + + io_stream = G_IO_STREAM (stream); + + if (!g_io_stream_set_pending (io_stream, error)) + return NULL; + + info = NULL; + + if (cancellable) + g_cancellable_push_current (cancellable); + + class = G_FILE_IO_STREAM_GET_CLASS (stream); + if (class->query_info) + info = class->query_info (stream, attributes, cancellable, error); + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Stream doesn't support query_info")); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_io_stream_clear_pending (io_stream); + + return info; +} + +static void +async_ready_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileIOStream *stream = G_FILE_IO_STREAM (source_object); + + g_io_stream_clear_pending (G_IO_STREAM (stream)); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_file_io_stream_query_info_async: + * @stream: a #GFileIOStream. + * @attributes: a file attribute query string. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously queries the @stream for a #GFileInfo. When completed, + * @callback will be called with a #GAsyncResult which can be used to + * finish the operation with g_file_io_stream_query_info_finish(). + * + * For the synchronous version of this function, see + * g_file_io_stream_query_info(). + * + * Since: 2.22 + **/ +void +g_file_io_stream_query_info_async (GFileIOStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileIOStreamClass *klass; + GIOStream *io_stream; + GError *error = NULL; + + g_return_if_fail (G_IS_FILE_IO_STREAM (stream)); + + io_stream = G_IO_STREAM (stream); + + if (!g_io_stream_set_pending (io_stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + klass = G_FILE_IO_STREAM_GET_CLASS (stream); + + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + klass->query_info_async (stream, attributes, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_file_io_stream_query_info_finish: + * @stream: a #GFileIOStream. + * @result: a #GAsyncResult. + * @error: a #GError, %NULL to ignore. + * + * Finalizes the asynchronous query started + * by g_file_io_stream_query_info_async(). + * + * Returns: A #GFileInfo for the finished query. + * + * Since: 2.22 + **/ +GFileInfo * +g_file_io_stream_query_info_finish (GFileIOStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GFileIOStreamClass *class; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + class = G_FILE_IO_STREAM_GET_CLASS (stream); + return class->query_info_finish (stream, result, error); +} + +/** + * g_file_io_stream_get_etag: + * @stream: a #GFileIOStream. + * + * Gets the entity tag for the file when it has been written. + * This must be called after the stream has been written + * and closed, as the etag can change while writing. + * + * Returns: the entity tag for the stream. + * + * Since: 2.22 + **/ +char * +g_file_io_stream_get_etag (GFileIOStream *stream) +{ + GFileIOStreamClass *class; + GIOStream *io_stream; + char *etag; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), NULL); + + io_stream = G_IO_STREAM (stream); + + if (!g_io_stream_is_closed (io_stream)) + { + g_warning ("stream is not closed yet, can't get etag"); + return NULL; + } + + etag = NULL; + + class = G_FILE_IO_STREAM_GET_CLASS (stream); + if (class->get_etag) + etag = class->get_etag (stream); + + return etag; +} + +static goffset +g_file_io_stream_tell (GFileIOStream *stream) +{ + GFileIOStreamClass *class; + goffset offset; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), 0); + + class = G_FILE_IO_STREAM_GET_CLASS (stream); + + offset = 0; + if (class->tell) + offset = class->tell (stream); + + return offset; +} + +static goffset +g_file_io_stream_seekable_tell (GSeekable *seekable) +{ + return g_file_io_stream_tell (G_FILE_IO_STREAM (seekable)); +} + +static gboolean +g_file_io_stream_can_seek (GFileIOStream *stream) +{ + GFileIOStreamClass *class; + gboolean can_seek; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), FALSE); + + class = G_FILE_IO_STREAM_GET_CLASS (stream); + + can_seek = FALSE; + if (class->seek) + { + can_seek = TRUE; + if (class->can_seek) + can_seek = class->can_seek (stream); + } + + return can_seek; +} + +static gboolean +g_file_io_stream_seekable_can_seek (GSeekable *seekable) +{ + return g_file_io_stream_can_seek (G_FILE_IO_STREAM (seekable)); +} + +static gboolean +g_file_io_stream_seek (GFileIOStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GFileIOStreamClass *class; + GIOStream *io_stream; + gboolean res; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), FALSE); + + io_stream = G_IO_STREAM (stream); + class = G_FILE_IO_STREAM_GET_CLASS (stream); + + if (!class->seek) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on stream")); + return FALSE; + } + + if (!g_io_stream_set_pending (io_stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->seek (stream, offset, type, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_io_stream_clear_pending (io_stream); + + return res; +} + +static gboolean +g_file_io_stream_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + return g_file_io_stream_seek (G_FILE_IO_STREAM (seekable), + offset, type, cancellable, error); +} + +static gboolean +g_file_io_stream_can_truncate (GFileIOStream *stream) +{ + GFileIOStreamClass *class; + gboolean can_truncate; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), FALSE); + + class = G_FILE_IO_STREAM_GET_CLASS (stream); + + can_truncate = FALSE; + if (class->truncate_fn) + { + can_truncate = TRUE; + if (class->can_truncate) + can_truncate = class->can_truncate (stream); + } + + return can_truncate; +} + +static gboolean +g_file_io_stream_seekable_can_truncate (GSeekable *seekable) +{ + return g_file_io_stream_can_truncate (G_FILE_IO_STREAM (seekable)); +} + +static gboolean +g_file_io_stream_truncate (GFileIOStream *stream, + goffset size, + GCancellable *cancellable, + GError **error) +{ + GFileIOStreamClass *class; + GIOStream *io_stream; + gboolean res; + + g_return_val_if_fail (G_IS_FILE_IO_STREAM (stream), FALSE); + + io_stream = G_IO_STREAM (stream); + class = G_FILE_IO_STREAM_GET_CLASS (stream); + + if (!class->truncate_fn) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Truncate not supported on stream")); + return FALSE; + } + + if (!g_io_stream_set_pending (io_stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->truncate_fn (stream, size, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_io_stream_clear_pending (io_stream); + + return res; +} + +static gboolean +g_file_io_stream_seekable_truncate (GSeekable *seekable, + goffset size, + GCancellable *cancellable, + GError **error) +{ + return g_file_io_stream_truncate (G_FILE_IO_STREAM (seekable), + size, cancellable, error); +} +/***************************************************** + * Default implementations based on output stream * + *****************************************************/ + +static goffset +g_file_io_stream_real_tell (GFileIOStream *stream) +{ + GOutputStream *out; + GSeekable *seekable; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + seekable = G_SEEKABLE (out); + + return g_seekable_tell (seekable); +} + +static gboolean +g_file_io_stream_real_can_seek (GFileIOStream *stream) +{ + GOutputStream *out; + GSeekable *seekable; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + seekable = G_SEEKABLE (out); + + return g_seekable_can_seek (seekable); +} + +static gboolean +g_file_io_stream_real_seek (GFileIOStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *out; + GSeekable *seekable; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + seekable = G_SEEKABLE (out); + + return g_seekable_seek (seekable, offset, type, cancellable, error); +} + +static gboolean +g_file_io_stream_real_can_truncate (GFileIOStream *stream) +{ + GOutputStream *out; + GSeekable *seekable; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + seekable = G_SEEKABLE (out); + + return g_seekable_can_truncate (seekable); +} + +static gboolean +g_file_io_stream_real_truncate_fn (GFileIOStream *stream, + goffset size, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *out; + GSeekable *seekable; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + seekable = G_SEEKABLE (out); + + return g_seekable_truncate (seekable, size, cancellable, error); +} + +static char * +g_file_io_stream_real_get_etag (GFileIOStream *stream) +{ + GOutputStream *out; + GFileOutputStream *file_out; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + file_out = G_FILE_OUTPUT_STREAM (out); + + return g_file_output_stream_get_etag (file_out); +} + +static GFileInfo * +g_file_io_stream_real_query_info (GFileIOStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *out; + GFileOutputStream *file_out; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + file_out = G_FILE_OUTPUT_STREAM (out); + + return g_file_output_stream_query_info (file_out, + attributes, cancellable, error); +} + +typedef struct { + GObject *object; + GAsyncReadyCallback callback; + gpointer user_data; +} AsyncOpWrapper; + +static AsyncOpWrapper * +async_op_wrapper_new (gpointer object, + GAsyncReadyCallback callback, + gpointer user_data) +{ + AsyncOpWrapper *data; + + data = g_new0 (AsyncOpWrapper, 1); + data->object = g_object_ref (object); + data->callback = callback; + data->user_data = user_data; + + return data; +} + +static void +async_op_wrapper_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + AsyncOpWrapper *data = user_data; + data->callback (data->object, res, data->user_data); + g_object_unref (data->object); + g_free (data); +} + +static void +g_file_io_stream_real_query_info_async (GFileIOStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GOutputStream *out; + GFileOutputStream *file_out; + AsyncOpWrapper *data; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + file_out = G_FILE_OUTPUT_STREAM (out); + + data = async_op_wrapper_new (stream, callback, user_data); + g_file_output_stream_query_info_async (file_out, + attributes, io_priority, + cancellable, async_op_wrapper_callback, data); +} + +static GFileInfo * +g_file_io_stream_real_query_info_finish (GFileIOStream *stream, + GAsyncResult *res, + GError **error) +{ + GOutputStream *out; + GFileOutputStream *file_out; + + out = g_io_stream_get_output_stream (G_IO_STREAM (stream)); + file_out = G_FILE_OUTPUT_STREAM (out); + + return g_file_output_stream_query_info_finish (file_out, res, error); +} + +static void +g_file_io_stream_class_init (GFileIOStreamClass *klass) +{ + g_type_class_add_private (klass, sizeof (GFileIOStreamPrivate)); + + klass->tell = g_file_io_stream_real_tell; + klass->can_seek = g_file_io_stream_real_can_seek; + klass->seek = g_file_io_stream_real_seek; + klass->can_truncate = g_file_io_stream_real_can_truncate; + klass->truncate_fn = g_file_io_stream_real_truncate_fn; + klass->query_info = g_file_io_stream_real_query_info; + klass->query_info_async = g_file_io_stream_real_query_info_async; + klass->query_info_finish = g_file_io_stream_real_query_info_finish; + klass->get_etag = g_file_io_stream_real_get_etag; +} + +#define __G_FILE_IO_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gfileiostream.h b/gio/gfileiostream.h new file mode 100644 index 0000000..09c9922 --- /dev/null +++ b/gio/gfileiostream.h @@ -0,0 +1,118 @@ +/* GIO - GLib Input, Io and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_IO_STREAM_H__ +#define __G_FILE_IO_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_IO_STREAM (g_file_io_stream_get_type ()) +#define G_FILE_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_IO_STREAM, GFileIOStream)) +#define G_FILE_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_IO_STREAM, GFileIOStreamClass)) +#define G_IS_FILE_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_IO_STREAM)) +#define G_IS_FILE_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_IO_STREAM)) +#define G_FILE_IO_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_IO_STREAM, GFileIOStreamClass)) + +/** + * GFileIOStream: + * + * A subclass of GIOStream for opened files. This adds + * a few file-specific operations and seeking and truncating. + * + * #GFileIOStream implements GSeekable. + **/ +typedef struct _GFileIOStreamClass GFileIOStreamClass; +typedef struct _GFileIOStreamPrivate GFileIOStreamPrivate; + +struct _GFileIOStream +{ + GIOStream parent_instance; + + /*< private >*/ + GFileIOStreamPrivate *priv; +}; + +struct _GFileIOStreamClass +{ + GIOStreamClass parent_class; + + goffset (* tell) (GFileIOStream *stream); + gboolean (* can_seek) (GFileIOStream *stream); + gboolean (* seek) (GFileIOStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); + gboolean (* can_truncate) (GFileIOStream *stream); + gboolean (* truncate_fn) (GFileIOStream *stream, + goffset size, + GCancellable *cancellable, + GError **error); + GFileInfo * (* query_info) (GFileIOStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); + void (* query_info_async) (GFileIOStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileInfo * (* query_info_finish) (GFileIOStream *stream, + GAsyncResult *res, + GError **error); + char * (* get_etag) (GFileIOStream *stream); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_file_io_stream_get_type (void) G_GNUC_CONST; + +GFileInfo *g_file_io_stream_query_info (GFileIOStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +void g_file_io_stream_query_info_async (GFileIOStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInfo *g_file_io_stream_query_info_finish (GFileIOStream *stream, + GAsyncResult *result, + GError **error); +char * g_file_io_stream_get_etag (GFileIOStream *stream); + +G_END_DECLS + +#endif /* __G_FILE_FILE_IO_STREAM_H__ */ diff --git a/gio/gfilemonitor.c b/gio/gfilemonitor.c new file mode 100644 index 0000000..a470baa --- /dev/null +++ b/gio/gfilemonitor.c @@ -0,0 +1,731 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include + +#include "gfilemonitor.h" +#include "gio-marshal.h" +#include "gioenumtypes.h" +#include "gfile.h" +#include "gvfs.h" +#include "glibintl.h" + +#include "gioalias.h" + +struct _FileChange; +typedef struct _FileChange FileChange; +static void file_change_free (FileChange *change); + +/** + * SECTION:gfilemonitor + * @short_description: File Monitor + * @include: gio/gio.h + * + * Monitors a file or directory for changes. + * + * To obtain a #GFileMonitor for a file or directory, use + * g_file_monitor(), g_file_monitor_file(), or + * g_file_monitor_directory(). + * + * To get informed about changes to the file or directory you are + * monitoring, connect to the #GFileMonitor::changed signal. The + * signal will be emitted in the thread-default main + * context of the thread that the monitor was created in + * (though if the global default main context is blocked, this may + * cause notifications to be blocked even if the thread-default + * context is still running). + **/ + +G_LOCK_DEFINE_STATIC(cancelled); + +enum { + CHANGED, + LAST_SIGNAL +}; + +/* work around a limitation of the aliasing foo */ +#undef g_file_monitor + +G_DEFINE_ABSTRACT_TYPE (GFileMonitor, g_file_monitor, G_TYPE_OBJECT); + +typedef struct { + GFile *file; + guint32 last_sent_change_time; /* 0 == not sent */ + guint32 send_delayed_change_at; /* 0 == never */ + guint32 send_virtual_changes_done_at; /* 0 == never */ +} RateLimiter; + +struct _GFileMonitorPrivate { + gboolean cancelled; + int rate_limit_msec; + + /* Rate limiting change events */ + GHashTable *rate_limiter; + + GSource *pending_file_change_source; + GSList *pending_file_changes; /* FileChange */ + + GSource *timeout; + guint32 timeout_fires_at; + + GMainContext *context; +}; + +enum { + PROP_0, + PROP_RATE_LIMIT, + PROP_CANCELLED +}; + +static void +g_file_monitor_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GFileMonitor *monitor; + + monitor = G_FILE_MONITOR (object); + + switch (prop_id) + { + case PROP_RATE_LIMIT: + g_file_monitor_set_rate_limit (monitor, g_value_get_int (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_file_monitor_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GFileMonitor *monitor; + GFileMonitorPrivate *priv; + + monitor = G_FILE_MONITOR (object); + priv = monitor->priv; + + switch (prop_id) + { + case PROP_RATE_LIMIT: + g_value_set_int (value, priv->rate_limit_msec); + break; + + case PROP_CANCELLED: + G_LOCK (cancelled); + g_value_set_boolean (value, priv->cancelled); + G_UNLOCK (cancelled); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +#define DEFAULT_RATE_LIMIT_MSECS 800 +#define DEFAULT_VIRTUAL_CHANGES_DONE_DELAY_SECS 2 + +static guint signals[LAST_SIGNAL] = { 0 }; + +static void +rate_limiter_free (RateLimiter *limiter) +{ + g_object_unref (limiter->file); + g_slice_free (RateLimiter, limiter); +} + +static void +g_file_monitor_finalize (GObject *object) +{ + GFileMonitor *monitor; + + monitor = G_FILE_MONITOR (object); + + if (monitor->priv->timeout) + { + g_source_destroy (monitor->priv->timeout); + g_source_unref (monitor->priv->timeout); + } + + g_hash_table_destroy (monitor->priv->rate_limiter); + + if (monitor->priv->context) + g_main_context_unref (monitor->priv->context); + + G_OBJECT_CLASS (g_file_monitor_parent_class)->finalize (object); +} + +static void +g_file_monitor_dispose (GObject *object) +{ + GFileMonitor *monitor; + GFileMonitorPrivate *priv; + + monitor = G_FILE_MONITOR (object); + priv = monitor->priv; + + if (priv->pending_file_change_source) + { + g_source_destroy (priv->pending_file_change_source); + g_source_unref (priv->pending_file_change_source); + priv->pending_file_change_source = NULL; + } + g_slist_foreach (priv->pending_file_changes, (GFunc) file_change_free, NULL); + g_slist_free (priv->pending_file_changes); + priv->pending_file_changes = NULL; + + /* Make sure we cancel on last unref */ + g_file_monitor_cancel (monitor); + + G_OBJECT_CLASS (g_file_monitor_parent_class)->dispose (object); +} + +static void +g_file_monitor_class_init (GFileMonitorClass *klass) +{ + GObjectClass *object_class; + + g_type_class_add_private (klass, sizeof (GFileMonitorPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = g_file_monitor_finalize; + object_class->dispose = g_file_monitor_dispose; + object_class->get_property = g_file_monitor_get_property; + object_class->set_property = g_file_monitor_set_property; + + /** + * GFileMonitor::changed: + * @monitor: a #GFileMonitor. + * @file: a #GFile. + * @other_file: a #GFile. + * @event_type: a #GFileMonitorEvent. + * + * Emitted when a file has been changed. + **/ + signals[CHANGED] = + g_signal_new (I_("changed"), + G_TYPE_FILE_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GFileMonitorClass, changed), + NULL, NULL, + _gio_marshal_VOID__OBJECT_OBJECT_ENUM, + G_TYPE_NONE, 3, + G_TYPE_FILE, G_TYPE_FILE, G_TYPE_FILE_MONITOR_EVENT); + + g_object_class_install_property (object_class, + PROP_RATE_LIMIT, + g_param_spec_int ("rate-limit", + P_("Rate limit"), + P_("The limit of the monitor to watch for changes, in milliseconds"), + 0, G_MAXINT, + DEFAULT_RATE_LIMIT_MSECS, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, + PROP_CANCELLED, + g_param_spec_boolean ("cancelled", + P_("Cancelled"), + P_("Whether the monitor has been cancelled"), + FALSE, + G_PARAM_READABLE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); +} + +static void +g_file_monitor_init (GFileMonitor *monitor) +{ + monitor->priv = G_TYPE_INSTANCE_GET_PRIVATE (monitor, + G_TYPE_FILE_MONITOR, + GFileMonitorPrivate); + monitor->priv->rate_limit_msec = DEFAULT_RATE_LIMIT_MSECS; + monitor->priv->rate_limiter = g_hash_table_new_full (g_file_hash, (GEqualFunc)g_file_equal, + NULL, (GDestroyNotify) rate_limiter_free); + monitor->priv->context = g_main_context_get_thread_default (); +} + +/** + * g_file_monitor_is_cancelled: + * @monitor: a #GFileMonitor + * + * Returns whether the monitor is canceled. + * + * Returns: %TRUE if monitor is canceled. %FALSE otherwise. + **/ +gboolean +g_file_monitor_is_cancelled (GFileMonitor *monitor) +{ + gboolean res; + + g_return_val_if_fail (G_IS_FILE_MONITOR (monitor), FALSE); + + G_LOCK (cancelled); + res = monitor->priv->cancelled; + G_UNLOCK (cancelled); + + return res; +} + +/** + * g_file_monitor_cancel: + * @monitor: a #GFileMonitor. + * + * Cancels a file monitor. + * + * Returns: %TRUE if monitor was cancelled. + **/ +gboolean +g_file_monitor_cancel (GFileMonitor* monitor) +{ + GFileMonitorClass *klass; + + g_return_val_if_fail (G_IS_FILE_MONITOR (monitor), FALSE); + + G_LOCK (cancelled); + if (monitor->priv->cancelled) + { + G_UNLOCK (cancelled); + return TRUE; + } + + monitor->priv->cancelled = TRUE; + G_UNLOCK (cancelled); + + g_object_notify (G_OBJECT (monitor), "cancelled"); + + klass = G_FILE_MONITOR_GET_CLASS (monitor); + return (* klass->cancel) (monitor); +} + +/** + * g_file_monitor_set_rate_limit: + * @monitor: a #GFileMonitor. + * @limit_msecs: a integer with the limit in milliseconds to + * poll for changes. + * + * Sets the rate limit to which the @monitor will report + * consecutive change events to the same file. + * + **/ +void +g_file_monitor_set_rate_limit (GFileMonitor *monitor, + int limit_msecs) +{ + GFileMonitorPrivate *priv; + + g_return_if_fail (G_IS_FILE_MONITOR (monitor)); + + priv = monitor->priv; + if (priv->rate_limit_msec != limit_msecs) + { + monitor->priv->rate_limit_msec = limit_msecs; + g_object_notify (G_OBJECT (monitor), "rate-limit"); + } +} + +struct _FileChange { + GFile *child; + GFile *other_file; + GFileMonitorEvent event_type; +}; + +static void +file_change_free (FileChange *change) +{ + g_object_unref (change->child); + if (change->other_file) + g_object_unref (change->other_file); + + g_slice_free (FileChange, change); +} + +static gboolean +emit_cb (gpointer data) +{ + GFileMonitor *monitor = G_FILE_MONITOR (data); + GSList *pending, *iter; + + pending = g_slist_reverse (monitor->priv->pending_file_changes); + monitor->priv->pending_file_changes = NULL; + if (monitor->priv->pending_file_change_source) + { + g_source_unref (monitor->priv->pending_file_change_source); + monitor->priv->pending_file_change_source = NULL; + } + + g_object_ref (monitor); + for (iter = pending; iter; iter = iter->next) + { + FileChange *change = iter->data; + g_signal_emit (monitor, signals[CHANGED], 0, + change->child, change->other_file, change->event_type); + file_change_free (change); + } + g_slist_free (pending); + g_object_unref (monitor); + + return FALSE; +} + +static void +emit_in_idle (GFileMonitor *monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent event_type) +{ + GSource *source; + FileChange *change; + GFileMonitorPrivate *priv; + + priv = monitor->priv; + + change = g_slice_new (FileChange); + + change->child = g_object_ref (child); + if (other_file) + change->other_file = g_object_ref (other_file); + else + change->other_file = NULL; + change->event_type = event_type; + + if (!priv->pending_file_change_source) + { + source = g_idle_source_new (); + priv->pending_file_change_source = source; + g_source_set_priority (source, 0); + + /* We don't ref monitor here - instead dispose will free any + * pending idles. + */ + g_source_set_callback (source, emit_cb, monitor, NULL); + g_source_attach (source, monitor->priv->context); + } + /* We reverse this in the processor */ + priv->pending_file_changes = g_slist_prepend (priv->pending_file_changes, change); +} + +static guint32 +get_time_msecs (void) +{ + return g_thread_gettime() / (1000 * 1000); +} + +static guint32 +time_difference (guint32 from, guint32 to) +{ + if (from > to) + return 0; + return to - from; +} + +/* Change event rate limiting support: */ + +static RateLimiter * +new_limiter (GFileMonitor *monitor, + GFile *file) +{ + RateLimiter *limiter; + + limiter = g_slice_new0 (RateLimiter); + limiter->file = g_object_ref (file); + g_hash_table_insert (monitor->priv->rate_limiter, file, limiter); + + return limiter; +} + +static void +rate_limiter_send_virtual_changes_done_now (GFileMonitor *monitor, + RateLimiter *limiter) +{ + if (limiter->send_virtual_changes_done_at != 0) + { + emit_in_idle (monitor, limiter->file, NULL, + G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT); + limiter->send_virtual_changes_done_at = 0; + } +} + +static void +rate_limiter_send_delayed_change_now (GFileMonitor *monitor, + RateLimiter *limiter, + guint32 time_now) +{ + if (limiter->send_delayed_change_at != 0) + { + emit_in_idle (monitor, + limiter->file, NULL, + G_FILE_MONITOR_EVENT_CHANGED); + limiter->send_delayed_change_at = 0; + limiter->last_sent_change_time = time_now; + } +} + +typedef struct { + guint32 min_time; + guint32 time_now; + GFileMonitor *monitor; +} ForEachData; + +static gboolean +calc_min_time (GFileMonitor *monitor, + RateLimiter *limiter, + guint32 time_now, + guint32 *min_time) +{ + gboolean delete_me; + guint32 expire_at; + + delete_me = TRUE; + + if (limiter->last_sent_change_time != 0) + { + /* Set a timeout at 2*rate limit so that we can clear out the change from the hash eventualy */ + expire_at = limiter->last_sent_change_time + 2 * monitor->priv->rate_limit_msec; + + if (time_difference (time_now, expire_at) > 0) + { + delete_me = FALSE; + *min_time = MIN (*min_time, + time_difference (time_now, expire_at)); + } + } + + if (limiter->send_delayed_change_at != 0) + { + delete_me = FALSE; + *min_time = MIN (*min_time, + time_difference (time_now, limiter->send_delayed_change_at)); + } + + if (limiter->send_virtual_changes_done_at != 0) + { + delete_me = FALSE; + *min_time = MIN (*min_time, + time_difference (time_now, limiter->send_virtual_changes_done_at)); + } + + return delete_me; +} + +static gboolean +foreach_rate_limiter_fire (gpointer key, + gpointer value, + gpointer user_data) +{ + RateLimiter *limiter = value; + ForEachData *data = user_data; + + if (limiter->send_delayed_change_at != 0 && + time_difference (data->time_now, limiter->send_delayed_change_at) == 0) + rate_limiter_send_delayed_change_now (data->monitor, limiter, data->time_now); + + if (limiter->send_virtual_changes_done_at != 0 && + time_difference (data->time_now, limiter->send_virtual_changes_done_at) == 0) + rate_limiter_send_virtual_changes_done_now (data->monitor, limiter); + + return calc_min_time (data->monitor, limiter, data->time_now, &data->min_time); +} + +static gboolean +rate_limiter_timeout (gpointer timeout_data) +{ + GFileMonitor *monitor = timeout_data; + ForEachData data; + GSource *source; + + data.min_time = G_MAXUINT32; + data.monitor = monitor; + data.time_now = get_time_msecs (); + g_hash_table_foreach_remove (monitor->priv->rate_limiter, + foreach_rate_limiter_fire, + &data); + + /* Remove old timeout */ + if (monitor->priv->timeout) + { + g_source_destroy (monitor->priv->timeout); + g_source_unref (monitor->priv->timeout); + monitor->priv->timeout = NULL; + monitor->priv->timeout_fires_at = 0; + } + + /* Set up new timeout */ + if (data.min_time != G_MAXUINT32) + { + source = g_timeout_source_new (data.min_time + 1); /* + 1 to make sure we've really passed the time */ + g_source_set_callback (source, rate_limiter_timeout, monitor, NULL); + g_source_attach (source, monitor->priv->context); + + monitor->priv->timeout = source; + monitor->priv->timeout_fires_at = data.time_now + data.min_time; + } + + return FALSE; +} + +static gboolean +foreach_rate_limiter_update (gpointer key, + gpointer value, + gpointer user_data) +{ + RateLimiter *limiter = value; + ForEachData *data = user_data; + + return calc_min_time (data->monitor, limiter, data->time_now, &data->min_time); +} + +static void +update_rate_limiter_timeout (GFileMonitor *monitor, + guint new_time) +{ + ForEachData data; + GSource *source; + + if (monitor->priv->timeout_fires_at != 0 && new_time != 0 && + time_difference (new_time, monitor->priv->timeout_fires_at) == 0) + return; /* Nothing to do, we already fire earlier than that */ + + data.min_time = G_MAXUINT32; + data.monitor = monitor; + data.time_now = get_time_msecs (); + g_hash_table_foreach_remove (monitor->priv->rate_limiter, + foreach_rate_limiter_update, + &data); + + /* Remove old timeout */ + if (monitor->priv->timeout) + { + g_source_destroy (monitor->priv->timeout); + g_source_unref (monitor->priv->timeout); + monitor->priv->timeout_fires_at = 0; + monitor->priv->timeout = NULL; + } + + /* Set up new timeout */ + if (data.min_time != G_MAXUINT32) + { + source = g_timeout_source_new (data.min_time + 1); /* + 1 to make sure we've really passed the time */ + g_source_set_callback (source, rate_limiter_timeout, monitor, NULL); + g_source_attach (source, monitor->priv->context); + + monitor->priv->timeout = source; + monitor->priv->timeout_fires_at = data.time_now + data.min_time; + } +} + +/** + * g_file_monitor_emit_event: + * @monitor: a #GFileMonitor. + * @child: a #GFile. + * @other_file: a #GFile. + * @event_type: a set of #GFileMonitorEvent flags. + * + * Emits the #GFileMonitor::changed signal if a change + * has taken place. Should be called from file monitor + * implementations only. + * + * The signal will be emitted from an idle handler (in the thread-default main + * context). + **/ +void +g_file_monitor_emit_event (GFileMonitor *monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent event_type) +{ + guint32 time_now, since_last; + gboolean emit_now; + RateLimiter *limiter; + + g_return_if_fail (G_IS_FILE_MONITOR (monitor)); + g_return_if_fail (G_IS_FILE (child)); + + limiter = g_hash_table_lookup (monitor->priv->rate_limiter, child); + + if (event_type != G_FILE_MONITOR_EVENT_CHANGED) + { + if (limiter) + { + rate_limiter_send_delayed_change_now (monitor, limiter, get_time_msecs ()); + if (event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) + limiter->send_virtual_changes_done_at = 0; + else + rate_limiter_send_virtual_changes_done_now (monitor, limiter); + update_rate_limiter_timeout (monitor, 0); + } + emit_in_idle (monitor, child, other_file, event_type); + } + else + { + /* Changed event, rate limit */ + time_now = get_time_msecs (); + emit_now = TRUE; + + if (limiter) + { + since_last = time_difference (limiter->last_sent_change_time, time_now); + if (since_last < monitor->priv->rate_limit_msec) + { + /* We ignore this change, but arm a timer so that we can fire it later if we + don't get any other events (that kill this timeout) */ + emit_now = FALSE; + if (limiter->send_delayed_change_at == 0) + { + limiter->send_delayed_change_at = time_now + monitor->priv->rate_limit_msec; + update_rate_limiter_timeout (monitor, limiter->send_delayed_change_at); + } + } + } + + if (limiter == NULL) + limiter = new_limiter (monitor, child); + + if (emit_now) + { + emit_in_idle (monitor, child, other_file, event_type); + + limiter->last_sent_change_time = time_now; + limiter->send_delayed_change_at = 0; + /* Set a timeout of 2*rate limit so that we can clear out the change from the hash eventualy */ + update_rate_limiter_timeout (monitor, time_now + 2 * monitor->priv->rate_limit_msec); + } + + /* Schedule a virtual change done. This is removed if we get a real one, and + postponed if we get more change events. */ + + limiter->send_virtual_changes_done_at = time_now + DEFAULT_VIRTUAL_CHANGES_DONE_DELAY_SECS * 1000; + update_rate_limiter_timeout (monitor, limiter->send_virtual_changes_done_at); + } +} + +#define __G_FILE_MONITOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gfilemonitor.h b/gio/gfilemonitor.h new file mode 100644 index 0000000..cf6f6be --- /dev/null +++ b/gio/gfilemonitor.h @@ -0,0 +1,95 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_MONITOR_H__ +#define __G_FILE_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_MONITOR (g_file_monitor_get_type ()) +#define G_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_MONITOR, GFileMonitor)) +#define G_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_MONITOR, GFileMonitorClass)) +#define G_IS_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_MONITOR)) +#define G_IS_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_MONITOR)) +#define G_FILE_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_MONITOR, GFileMonitorClass)) + +typedef struct _GFileMonitorClass GFileMonitorClass; +typedef struct _GFileMonitorPrivate GFileMonitorPrivate; + +/** + * GFileMonitor: + * + * Watches for changes to a file. + **/ +struct _GFileMonitor +{ + GObject parent_instance; + + /*< private >*/ + GFileMonitorPrivate *priv; +}; + +struct _GFileMonitorClass +{ + GObjectClass parent_class; + + /* Signals */ + void (* changed) (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type); + + /* Virtual Table */ + gboolean (* cancel) (GFileMonitor *monitor); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_file_monitor_get_type (void) G_GNUC_CONST; + +gboolean g_file_monitor_cancel (GFileMonitor *monitor); +gboolean g_file_monitor_is_cancelled (GFileMonitor *monitor); +void g_file_monitor_set_rate_limit (GFileMonitor *monitor, + int limit_msecs); + + +/* For implementations */ +void g_file_monitor_emit_event (GFileMonitor *monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent event_type); + +G_END_DECLS + +#endif /* __G_FILE_MONITOR_H__ */ diff --git a/gio/gfilenamecompleter.c b/gio/gfilenamecompleter.c new file mode 100644 index 0000000..5247677 --- /dev/null +++ b/gio/gfilenamecompleter.c @@ -0,0 +1,520 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gfilenamecompleter.h" +#include "gfileenumerator.h" +#include "gfileattribute.h" +#include "gfile.h" +#include "gfileinfo.h" +#include "gcancellable.h" +#include +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfilenamecompleter + * @short_description: Filename Completer + * @include: gio/gio.h + * + * Completes partial file and directory names given a partial string by + * looking in the file system for clues. Can return a list of possible + * completion strings for widget implementations. + * + **/ + +enum { + GOT_COMPLETION_DATA, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +typedef struct { + GFilenameCompleter *completer; + GFileEnumerator *enumerator; + GCancellable *cancellable; + gboolean should_escape; + GFile *dir; + GList *basenames; + gboolean dirs_only; +} LoadBasenamesData; + +struct _GFilenameCompleter { + GObject parent; + + GFile *basenames_dir; + gboolean basenames_are_escaped; + GList *basenames; + gboolean dirs_only; + + LoadBasenamesData *basename_loader; +}; + +G_DEFINE_TYPE (GFilenameCompleter, g_filename_completer, G_TYPE_OBJECT); + +static void cancel_load_basenames (GFilenameCompleter *completer); + +static void +g_filename_completer_finalize (GObject *object) +{ + GFilenameCompleter *completer; + + completer = G_FILENAME_COMPLETER (object); + + cancel_load_basenames (completer); + + if (completer->basenames_dir) + g_object_unref (completer->basenames_dir); + + g_list_foreach (completer->basenames, (GFunc)g_free, NULL); + g_list_free (completer->basenames); + + G_OBJECT_CLASS (g_filename_completer_parent_class)->finalize (object); +} + +static void +g_filename_completer_class_init (GFilenameCompleterClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_filename_completer_finalize; + /** + * GFilenameCompleter::got-completion-data: + * + * Emitted when the file name completion information comes available. + **/ + signals[GOT_COMPLETION_DATA] = g_signal_new (I_("got-completion-data"), + G_TYPE_FILENAME_COMPLETER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GFilenameCompleterClass, got_completion_data), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +g_filename_completer_init (GFilenameCompleter *completer) +{ +} + +/** + * g_filename_completer_new: + * + * Creates a new filename completer. + * + * Returns: a #GFilenameCompleter. + **/ +GFilenameCompleter * +g_filename_completer_new (void) +{ + return g_object_new (G_TYPE_FILENAME_COMPLETER, NULL); +} + +static char * +longest_common_prefix (char *a, char *b) +{ + char *start; + + start = a; + + while (g_utf8_get_char (a) == g_utf8_get_char (b)) + { + a = g_utf8_next_char (a); + b = g_utf8_next_char (b); + } + + return g_strndup (start, a - start); +} + +static void +load_basenames_data_free (LoadBasenamesData *data) +{ + if (data->enumerator) + g_object_unref (data->enumerator); + + g_object_unref (data->cancellable); + g_object_unref (data->dir); + + g_list_foreach (data->basenames, (GFunc)g_free, NULL); + g_list_free (data->basenames); + + g_free (data); +} + +static void +got_more_files (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + LoadBasenamesData *data = user_data; + GList *infos, *l; + GFileInfo *info; + const char *name; + gboolean append_slash; + char *t; + char *basename; + + if (data->completer == NULL) + { + /* Was cancelled */ + load_basenames_data_free (data); + return; + } + + infos = g_file_enumerator_next_files_finish (data->enumerator, res, NULL); + + for (l = infos; l != NULL; l = l->next) + { + info = l->data; + + if (data->dirs_only && + g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY) + { + g_object_unref (info); + continue; + } + + append_slash = g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY; + name = g_file_info_get_name (info); + if (name == NULL) + { + g_object_unref (info); + continue; + } + + + if (data->should_escape) + basename = g_uri_escape_string (name, + G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, + TRUE); + else + /* If not should_escape, must be a local filename, convert to utf8 */ + basename = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); + + if (basename) + { + if (append_slash) + { + t = basename; + basename = g_strconcat (basename, "/", NULL); + g_free (t); + } + + data->basenames = g_list_prepend (data->basenames, basename); + } + + g_object_unref (info); + } + + g_list_free (infos); + + if (infos) + { + /* Not last, get more files */ + g_file_enumerator_next_files_async (data->enumerator, + 100, + 0, + data->cancellable, + got_more_files, data); + } + else + { + data->completer->basename_loader = NULL; + + if (data->completer->basenames_dir) + g_object_unref (data->completer->basenames_dir); + g_list_foreach (data->completer->basenames, (GFunc)g_free, NULL); + g_list_free (data->completer->basenames); + + data->completer->basenames_dir = g_object_ref (data->dir); + data->completer->basenames = data->basenames; + data->completer->basenames_are_escaped = data->should_escape; + data->basenames = NULL; + + g_file_enumerator_close_async (data->enumerator, 0, NULL, NULL, NULL); + + g_signal_emit (data->completer, signals[GOT_COMPLETION_DATA], 0); + load_basenames_data_free (data); + } +} + + +static void +got_enum (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + LoadBasenamesData *data = user_data; + + if (data->completer == NULL) + { + /* Was cancelled */ + load_basenames_data_free (data); + return; + } + + data->enumerator = g_file_enumerate_children_finish (G_FILE (source_object), res, NULL); + + if (data->enumerator == NULL) + { + data->completer->basename_loader = NULL; + + if (data->completer->basenames_dir) + g_object_unref (data->completer->basenames_dir); + g_list_foreach (data->completer->basenames, (GFunc)g_free, NULL); + g_list_free (data->completer->basenames); + + /* Mark uptodate with no basenames */ + data->completer->basenames_dir = g_object_ref (data->dir); + data->completer->basenames = NULL; + data->completer->basenames_are_escaped = data->should_escape; + + load_basenames_data_free (data); + return; + } + + g_file_enumerator_next_files_async (data->enumerator, + 100, + 0, + data->cancellable, + got_more_files, data); +} + +static void +schedule_load_basenames (GFilenameCompleter *completer, + GFile *dir, + gboolean should_escape) +{ + LoadBasenamesData *data; + + cancel_load_basenames (completer); + + data = g_new0 (LoadBasenamesData, 1); + data->completer = completer; + data->cancellable = g_cancellable_new (); + data->dir = g_object_ref (dir); + data->should_escape = should_escape; + data->dirs_only = completer->dirs_only; + + completer->basename_loader = data; + + g_file_enumerate_children_async (dir, + G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE, + 0, 0, + data->cancellable, + got_enum, data); +} + +static void +cancel_load_basenames (GFilenameCompleter *completer) +{ + LoadBasenamesData *loader; + + if (completer->basename_loader) + { + loader = completer->basename_loader; + loader->completer = NULL; + + g_cancellable_cancel (loader->cancellable); + + completer->basename_loader = NULL; + } +} + + +/* Returns a list of possible matches and the basename to use for it */ +static GList * +init_completion (GFilenameCompleter *completer, + const char *initial_text, + char **basename_out) +{ + gboolean should_escape; + GFile *file, *parent; + char *basename; + char *t; + int len; + + *basename_out = NULL; + + should_escape = ! (g_path_is_absolute (initial_text) || *initial_text == '~'); + + len = strlen (initial_text); + + if (len > 0 && + initial_text[len - 1] == '/') + return NULL; + + file = g_file_parse_name (initial_text); + parent = g_file_get_parent (file); + if (parent == NULL) + { + g_object_unref (file); + return NULL; + } + + if (completer->basenames_dir == NULL || + completer->basenames_are_escaped != should_escape || + !g_file_equal (parent, completer->basenames_dir)) + { + schedule_load_basenames (completer, parent, should_escape); + g_object_unref (file); + return NULL; + } + + basename = g_file_get_basename (file); + if (should_escape) + { + t = basename; + basename = g_uri_escape_string (basename, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE); + g_free (t); + } + else + { + t = basename; + basename = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL); + g_free (t); + + if (basename == NULL) + return NULL; + } + + *basename_out = basename; + + return completer->basenames; +} + +/** + * g_filename_completer_get_completion_suffix: + * @completer: the filename completer. + * @initial_text: text to be completed. + * + * Obtains a completion for @initial_text from @completer. + * + * Returns: a completed string, or %NULL if no completion exists. + * This string is not owned by GIO, so remember to g_free() it + * when finished. + **/ +char * +g_filename_completer_get_completion_suffix (GFilenameCompleter *completer, + const char *initial_text) +{ + GList *possible_matches, *l; + char *prefix; + char *suffix; + char *possible_match; + char *lcp; + + g_return_val_if_fail (G_IS_FILENAME_COMPLETER (completer), NULL); + g_return_val_if_fail (initial_text != NULL, NULL); + + possible_matches = init_completion (completer, initial_text, &prefix); + + suffix = NULL; + + for (l = possible_matches; l != NULL; l = l->next) + { + possible_match = l->data; + + if (g_str_has_prefix (possible_match, prefix)) + { + if (suffix == NULL) + suffix = g_strdup (possible_match + strlen (prefix)); + else + { + lcp = longest_common_prefix (suffix, + possible_match + strlen (prefix)); + g_free (suffix); + suffix = lcp; + + if (*suffix == 0) + break; + } + } + } + + g_free (prefix); + + return suffix; +} + +/** + * g_filename_completer_get_completions: + * @completer: the filename completer. + * @initial_text: text to be completed. + * + * Gets an array of completion strings for a given initial text. + * + * Returns: array of strings with possible completions for @initial_text. + * This array must be freed by g_strfreev() when finished. + **/ +char ** +g_filename_completer_get_completions (GFilenameCompleter *completer, + const char *initial_text) +{ + GList *possible_matches, *l; + char *prefix; + char *possible_match; + GPtrArray *res; + + g_return_val_if_fail (G_IS_FILENAME_COMPLETER (completer), NULL); + g_return_val_if_fail (initial_text != NULL, NULL); + + possible_matches = init_completion (completer, initial_text, &prefix); + + res = g_ptr_array_new (); + for (l = possible_matches; l != NULL; l = l->next) + { + possible_match = l->data; + + if (g_str_has_prefix (possible_match, prefix)) + g_ptr_array_add (res, + g_strconcat (initial_text, possible_match + strlen (prefix), NULL)); + } + + g_free (prefix); + + g_ptr_array_add (res, NULL); + + return (char**)g_ptr_array_free (res, FALSE); +} + +/** + * g_filename_completer_set_dirs_only: + * @completer: the filename completer. + * @dirs_only: a #gboolean. + * + * If @dirs_only is %TRUE, @completer will only + * complete directory names, and not file names. + **/ +void +g_filename_completer_set_dirs_only (GFilenameCompleter *completer, + gboolean dirs_only) +{ + g_return_if_fail (G_IS_FILENAME_COMPLETER (completer)); + + completer->dirs_only = dirs_only; +} + +#define __G_FILENAME_COMPLETER_C__ +#include "gioaliasdef.c" diff --git a/gio/gfilenamecompleter.h b/gio/gfilenamecompleter.h new file mode 100644 index 0000000..1899c27 --- /dev/null +++ b/gio/gfilenamecompleter.h @@ -0,0 +1,76 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILENAME_COMPLETER_H__ +#define __G_FILENAME_COMPLETER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILENAME_COMPLETER (g_filename_completer_get_type ()) +#define G_FILENAME_COMPLETER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILENAME_COMPLETER, GFilenameCompleter)) +#define G_FILENAME_COMPLETER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILENAME_COMPLETER, GFilenameCompleterClass)) +#define G_FILENAME_COMPLETER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILENAME_COMPLETER, GFilenameCompleterClass)) +#define G_IS_FILENAME_COMPLETER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILENAME_COMPLETER)) +#define G_IS_FILENAME_COMPLETER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILENAME_COMPLETER)) + +/** + * GFilenameCompleter: + * + * Completes filenames based on files that exist within the file system. + **/ +typedef struct _GFilenameCompleterClass GFilenameCompleterClass; + +struct _GFilenameCompleterClass +{ + GObjectClass parent_class; + + /*< public >*/ + /* signals */ + void (* got_completion_data) (GFilenameCompleter *filename_completer); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); +}; + +GType g_filename_completer_get_type (void) G_GNUC_CONST; + +GFilenameCompleter *g_filename_completer_new (void); + +char * g_filename_completer_get_completion_suffix (GFilenameCompleter *completer, + const char *initial_text); +char ** g_filename_completer_get_completions (GFilenameCompleter *completer, + const char *initial_text); +void g_filename_completer_set_dirs_only (GFilenameCompleter *completer, + gboolean dirs_only); + +G_END_DECLS + +#endif /* __G_FILENAME_COMPLETER_H__ */ diff --git a/gio/gfileoutputstream.c b/gio/gfileoutputstream.c new file mode 100644 index 0000000..832042e --- /dev/null +++ b/gio/gfileoutputstream.c @@ -0,0 +1,575 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include "gsimpleasyncresult.h" +#include "gasyncresult.h" +#include "gcancellable.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfileoutputstream + * @short_description: File output streaming operations + * @include: gio/gio.h + * @see_also: #GOutputStream, #GDataOutputStream, #GSeekable + * + * GFileOutputStream provides output streams that write their + * content to a file. + * + * GFileOutputStream implements #GSeekable, which allows the output + * stream to jump to arbitrary positions in the file and to truncate + * the file, provided the filesystem of the file supports these + * operations. + * + * To find the position of a file output stream, use g_seekable_tell(). + * To find out if a file output stream supports seeking, use + * g_seekable_can_seek().To position a file output stream, use + * g_seekable_seek(). To find out if a file output stream supports + * truncating, use g_seekable_can_truncate(). To truncate a file output + * stream, use g_seekable_truncate(). + **/ + +static void g_file_output_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_file_output_stream_seekable_tell (GSeekable *seekable); +static gboolean g_file_output_stream_seekable_can_seek (GSeekable *seekable); +static gboolean g_file_output_stream_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_file_output_stream_seekable_can_truncate (GSeekable *seekable); +static gboolean g_file_output_stream_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); +static void g_file_output_stream_real_query_info_async (GFileOutputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GFileInfo *g_file_output_stream_real_query_info_finish (GFileOutputStream *stream, + GAsyncResult *result, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GFileOutputStream, g_file_output_stream, G_TYPE_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_file_output_stream_seekable_iface_init)); + +struct _GFileOutputStreamPrivate { + GAsyncReadyCallback outstanding_callback; +}; + +static void +g_file_output_stream_class_init (GFileOutputStreamClass *klass) +{ + g_type_class_add_private (klass, sizeof (GFileOutputStreamPrivate)); + + klass->query_info_async = g_file_output_stream_real_query_info_async; + klass->query_info_finish = g_file_output_stream_real_query_info_finish; +} + +static void +g_file_output_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_file_output_stream_seekable_tell; + iface->can_seek = g_file_output_stream_seekable_can_seek; + iface->seek = g_file_output_stream_seekable_seek; + iface->can_truncate = g_file_output_stream_seekable_can_truncate; + iface->truncate_fn = g_file_output_stream_seekable_truncate; +} + +static void +g_file_output_stream_init (GFileOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_FILE_OUTPUT_STREAM, + GFileOutputStreamPrivate); +} + +/** + * g_file_output_stream_query_info: + * @stream: a #GFileOutputStream. + * @attributes: a file attribute query string. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError, %NULL to ignore. + * + * Queries a file output stream for the given @attributes. + * This function blocks while querying the stream. For the asynchronous + * version of this function, see g_file_output_stream_query_info_async(). + * While the stream is blocked, the stream will set the pending flag + * internally, and any other operations on the stream will fail with + * %G_IO_ERROR_PENDING. + * + * Can fail if the stream was already closed (with @error being set to + * %G_IO_ERROR_CLOSED), the stream has pending operations (with @error being + * set to %G_IO_ERROR_PENDING), or if querying info is not supported for + * the stream's interface (with @error being set to %G_IO_ERROR_NOT_SUPPORTED). In + * all cases of failure, %NULL will be returned. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be set, and %NULL will + * be returned. + * + * Returns: a #GFileInfo for the @stream, or %NULL on error. + **/ +GFileInfo * +g_file_output_stream_query_info (GFileOutputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStreamClass *class; + GOutputStream *output_stream; + GFileInfo *info; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), NULL); + + output_stream = G_OUTPUT_STREAM (stream); + + if (!g_output_stream_set_pending (output_stream, error)) + return NULL; + + info = NULL; + + if (cancellable) + g_cancellable_push_current (cancellable); + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + if (class->query_info) + info = class->query_info (stream, attributes, cancellable, error); + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Stream doesn't support query_info")); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_output_stream_clear_pending (output_stream); + + return info; +} + +static void +async_ready_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileOutputStream *stream = G_FILE_OUTPUT_STREAM (source_object); + + g_output_stream_clear_pending (G_OUTPUT_STREAM (stream)); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_file_output_stream_query_info_async: + * @stream: a #GFileOutputStream. + * @attributes: a file attribute query string. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously queries the @stream for a #GFileInfo. When completed, + * @callback will be called with a #GAsyncResult which can be used to + * finish the operation with g_file_output_stream_query_info_finish(). + * + * For the synchronous version of this function, see + * g_file_output_stream_query_info(). + * + **/ +void +g_file_output_stream_query_info_async (GFileOutputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileOutputStreamClass *klass; + GOutputStream *output_stream; + GError *error = NULL; + + g_return_if_fail (G_IS_FILE_OUTPUT_STREAM (stream)); + + output_stream = G_OUTPUT_STREAM (stream); + + if (!g_output_stream_set_pending (output_stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + klass = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + klass->query_info_async (stream, attributes, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_file_output_stream_query_info_finish: + * @stream: a #GFileOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError, %NULL to ignore. + * + * Finalizes the asynchronous query started + * by g_file_output_stream_query_info_async(). + * + * Returns: A #GFileInfo for the finished query. + **/ +GFileInfo * +g_file_output_stream_query_info_finish (GFileOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GFileOutputStreamClass *class; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + return class->query_info_finish (stream, result, error); +} + +/** + * g_file_output_stream_get_etag: + * @stream: a #GFileOutputStream. + * + * Gets the entity tag for the file when it has been written. + * This must be called after the stream has been written + * and closed, as the etag can change while writing. + * + * Returns: the entity tag for the stream. + **/ +char * +g_file_output_stream_get_etag (GFileOutputStream *stream) +{ + GFileOutputStreamClass *class; + GOutputStream *output_stream; + char *etag; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), NULL); + + output_stream = G_OUTPUT_STREAM (stream); + + if (!g_output_stream_is_closed (output_stream)) + { + g_warning ("stream is not closed yet, can't get etag"); + return NULL; + } + + etag = NULL; + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + if (class->get_etag) + etag = class->get_etag (stream); + + return etag; +} + +static goffset +g_file_output_stream_tell (GFileOutputStream *stream) +{ + GFileOutputStreamClass *class; + goffset offset; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), 0); + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + + offset = 0; + if (class->tell) + offset = class->tell (stream); + + return offset; +} + +static goffset +g_file_output_stream_seekable_tell (GSeekable *seekable) +{ + return g_file_output_stream_tell (G_FILE_OUTPUT_STREAM (seekable)); +} + +static gboolean +g_file_output_stream_can_seek (GFileOutputStream *stream) +{ + GFileOutputStreamClass *class; + gboolean can_seek; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), FALSE); + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + + can_seek = FALSE; + if (class->seek) + { + can_seek = TRUE; + if (class->can_seek) + can_seek = class->can_seek (stream); + } + + return can_seek; +} + +static gboolean +g_file_output_stream_seekable_can_seek (GSeekable *seekable) +{ + return g_file_output_stream_can_seek (G_FILE_OUTPUT_STREAM (seekable)); +} + +static gboolean +g_file_output_stream_seek (GFileOutputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStreamClass *class; + GOutputStream *output_stream; + gboolean res; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), FALSE); + + output_stream = G_OUTPUT_STREAM (stream); + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + + if (!class->seek) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on stream")); + return FALSE; + } + + if (!g_output_stream_set_pending (output_stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->seek (stream, offset, type, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_output_stream_clear_pending (output_stream); + + return res; +} + +static gboolean +g_file_output_stream_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + return g_file_output_stream_seek (G_FILE_OUTPUT_STREAM (seekable), + offset, type, cancellable, error); +} + +static gboolean +g_file_output_stream_can_truncate (GFileOutputStream *stream) +{ + GFileOutputStreamClass *class; + gboolean can_truncate; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), FALSE); + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + + can_truncate = FALSE; + if (class->truncate_fn) + { + can_truncate = TRUE; + if (class->can_truncate) + can_truncate = class->can_truncate (stream); + } + + return can_truncate; +} + +static gboolean +g_file_output_stream_seekable_can_truncate (GSeekable *seekable) +{ + return g_file_output_stream_can_truncate (G_FILE_OUTPUT_STREAM (seekable)); +} + +static gboolean +g_file_output_stream_truncate (GFileOutputStream *stream, + goffset size, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStreamClass *class; + GOutputStream *output_stream; + gboolean res; + + g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), FALSE); + + output_stream = G_OUTPUT_STREAM (stream); + class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream); + + if (!class->truncate_fn) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Truncate not supported on stream")); + return FALSE; + } + + if (!g_output_stream_set_pending (output_stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->truncate_fn (stream, size, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_output_stream_clear_pending (output_stream); + + return res; +} + +static gboolean +g_file_output_stream_seekable_truncate (GSeekable *seekable, + goffset size, + GCancellable *cancellable, + GError **error) +{ + return g_file_output_stream_truncate (G_FILE_OUTPUT_STREAM (seekable), + size, cancellable, error); +} +/******************************************** + * Default implementation of async ops * + ********************************************/ + +typedef struct { + char *attributes; + GFileInfo *info; +} QueryInfoAsyncData; + +static void +query_info_data_free (QueryInfoAsyncData *data) +{ + if (data->info) + g_object_unref (data->info); + g_free (data->attributes); + g_free (data); +} + +static void +query_info_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GFileOutputStreamClass *class; + GError *error = NULL; + QueryInfoAsyncData *data; + GFileInfo *info; + + data = g_simple_async_result_get_op_res_gpointer (res); + + info = NULL; + + class = G_FILE_OUTPUT_STREAM_GET_CLASS (object); + if (class->query_info) + info = class->query_info (G_FILE_OUTPUT_STREAM (object), data->attributes, cancellable, &error); + else + g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Stream doesn't support query_info")); + + if (info == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + data->info = info; +} + +static void +g_file_output_stream_real_query_info_async (GFileOutputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + QueryInfoAsyncData *data; + + data = g_new0 (QueryInfoAsyncData, 1); + data->attributes = g_strdup (attributes); + + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_file_output_stream_real_query_info_async); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify)query_info_data_free); + + g_simple_async_result_run_in_thread (res, query_info_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static GFileInfo * +g_file_output_stream_real_query_info_finish (GFileOutputStream *stream, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + QueryInfoAsyncData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_file_output_stream_real_query_info_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (data->info) + return g_object_ref (data->info); + + return NULL; +} + +#define __G_FILE_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gfileoutputstream.h b/gio/gfileoutputstream.h new file mode 100644 index 0000000..b2c27f5 --- /dev/null +++ b/gio/gfileoutputstream.h @@ -0,0 +1,119 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILE_OUTPUT_STREAM_H__ +#define __G_FILE_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILE_OUTPUT_STREAM (g_file_output_stream_get_type ()) +#define G_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStream)) +#define G_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStreamClass)) +#define G_IS_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_OUTPUT_STREAM)) +#define G_IS_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_OUTPUT_STREAM)) +#define G_FILE_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStreamClass)) + +/** + * GFileOutputStream: + * + * A subclass of GOutputStream for opened files. This adds + * a few file-specific operations and seeking and truncating. + * + * #GFileOutputStream implements GSeekable. + **/ +typedef struct _GFileOutputStreamClass GFileOutputStreamClass; +typedef struct _GFileOutputStreamPrivate GFileOutputStreamPrivate; + +struct _GFileOutputStream +{ + GOutputStream parent_instance; + + /*< private >*/ + GFileOutputStreamPrivate *priv; +}; + +struct _GFileOutputStreamClass +{ + GOutputStreamClass parent_class; + + goffset (* tell) (GFileOutputStream *stream); + gboolean (* can_seek) (GFileOutputStream *stream); + gboolean (* seek) (GFileOutputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); + gboolean (* can_truncate) (GFileOutputStream *stream); + gboolean (* truncate_fn) (GFileOutputStream *stream, + goffset size, + GCancellable *cancellable, + GError **error); + GFileInfo * (* query_info) (GFileOutputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); + void (* query_info_async) (GFileOutputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GFileInfo * (* query_info_finish) (GFileOutputStream *stream, + GAsyncResult *res, + GError **error); + char * (* get_etag) (GFileOutputStream *stream); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_file_output_stream_get_type (void) G_GNUC_CONST; + + +GFileInfo *g_file_output_stream_query_info (GFileOutputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +void g_file_output_stream_query_info_async (GFileOutputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GFileInfo *g_file_output_stream_query_info_finish (GFileOutputStream *stream, + GAsyncResult *result, + GError **error); +char * g_file_output_stream_get_etag (GFileOutputStream *stream); + +G_END_DECLS + +#endif /* __G_FILE_FILE_OUTPUT_STREAM_H__ */ diff --git a/gio/gfilterinputstream.c b/gio/gfilterinputstream.c new file mode 100644 index 0000000..53e305a --- /dev/null +++ b/gio/gfilterinputstream.c @@ -0,0 +1,318 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#include "config.h" +#include "gfilterinputstream.h" +#include "ginputstream.h" +#include "gsimpleasyncresult.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfilterinputstream + * @short_description: Filter Input Stream + * @include: gio/gio.h + * + **/ + +enum { + PROP_0, + PROP_BASE_STREAM, + PROP_CLOSE_BASE +}; + +static void g_filter_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static void g_filter_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_filter_input_stream_finalize (GObject *object); + + +static gssize g_filter_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gssize g_filter_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_filter_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE (GFilterInputStream, g_filter_input_stream, G_TYPE_INPUT_STREAM) + +#define GET_PRIVATE(inst) G_TYPE_INSTANCE_GET_PRIVATE (inst, \ + G_TYPE_FILTER_INPUT_STREAM, GFilterInputStreamPrivate) + +typedef struct +{ + gboolean close_base; + GAsyncReadyCallback outstanding_callback; + gpointer outstanding_user_data; +} GFilterInputStreamPrivate; + +static void +g_filter_input_stream_class_init (GFilterInputStreamClass *klass) +{ + GObjectClass *object_class; + GInputStreamClass *istream_class; + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_filter_input_stream_get_property; + object_class->set_property = g_filter_input_stream_set_property; + object_class->finalize = g_filter_input_stream_finalize; + + istream_class = G_INPUT_STREAM_CLASS (klass); + istream_class->read_fn = g_filter_input_stream_read; + istream_class->skip = g_filter_input_stream_skip; + istream_class->close_fn = g_filter_input_stream_close; + + g_type_class_add_private (klass, sizeof (GFilterInputStreamPrivate)); + + g_object_class_install_property (object_class, + PROP_BASE_STREAM, + g_param_spec_object ("base-stream", + P_("The Filter Base Stream"), + P_("The underlying base stream on which the io ops will be done."), + G_TYPE_INPUT_STREAM, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, + PROP_CLOSE_BASE, + g_param_spec_boolean ("close-base-stream", + P_("Close Base Stream"), + P_("If the base stream should be closed when the filter stream is closed."), + TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); +} + +static void +g_filter_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GFilterInputStream *filter_stream; + GObject *obj; + + filter_stream = G_FILTER_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BASE_STREAM: + obj = g_value_dup_object (value); + filter_stream->base_stream = G_INPUT_STREAM (obj); + break; + + case PROP_CLOSE_BASE: + g_filter_input_stream_set_close_base_stream (filter_stream, + g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_filter_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GFilterInputStream *filter_stream; + + filter_stream = G_FILTER_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BASE_STREAM: + g_value_set_object (value, filter_stream->base_stream); + break; + + case PROP_CLOSE_BASE: + g_value_set_boolean (value, GET_PRIVATE (filter_stream)->close_base); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_filter_input_stream_finalize (GObject *object) +{ + GFilterInputStream *stream; + + stream = G_FILTER_INPUT_STREAM (object); + + g_object_unref (stream->base_stream); + + G_OBJECT_CLASS (g_filter_input_stream_parent_class)->finalize (object); +} + +static void +g_filter_input_stream_init (GFilterInputStream *stream) +{ + +} + +/** + * g_filter_input_stream_get_base_stream: + * @stream: a #GFilterInputStream. + * + * Gets the base stream for the filter stream. + * + * Returns: a #GInputStream. + **/ +GInputStream * +g_filter_input_stream_get_base_stream (GFilterInputStream *stream) +{ + g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), NULL); + + return stream->base_stream; +} + +/** + * g_filter_input_stream_get_close_base_stream: + * @stream: a #GFilterInputStream. + * + * Returns whether the base stream will be closed when @stream is + * closed. + * + * Return value: %TRUE if the base stream will be closed. + **/ +gboolean +g_filter_input_stream_get_close_base_stream (GFilterInputStream *stream) +{ + g_return_val_if_fail (G_IS_FILTER_INPUT_STREAM (stream), FALSE); + + return GET_PRIVATE (stream)->close_base; +} + +/** + * g_filter_input_stream_set_close_base_stream: + * @stream: a #GFilterInputStream. + * @close_base: %TRUE to close the base stream. + * + * Sets whether the base stream will be closed when @stream is closed. + **/ +void +g_filter_input_stream_set_close_base_stream (GFilterInputStream *stream, + gboolean close_base) +{ + GFilterInputStreamPrivate *priv; + + g_return_if_fail (G_IS_FILTER_INPUT_STREAM (stream)); + + close_base = !!close_base; + + priv = GET_PRIVATE (stream); + + if (priv->close_base != close_base) + { + priv->close_base = close_base; + g_object_notify (G_OBJECT (stream), "close-base-stream"); + } +} + +static gssize +g_filter_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GFilterInputStream *filter_stream; + GInputStream *base_stream; + gssize nread; + + filter_stream = G_FILTER_INPUT_STREAM (stream); + base_stream = filter_stream->base_stream; + + nread = g_input_stream_read (base_stream, + buffer, + count, + cancellable, + error); + + return nread; +} + +static gssize +g_filter_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GFilterInputStream *filter_stream; + GInputStream *base_stream; + gssize nskipped; + + filter_stream = G_FILTER_INPUT_STREAM (stream); + base_stream = filter_stream->base_stream; + + nskipped = g_input_stream_skip (base_stream, + count, + cancellable, + error); + return nskipped; +} + +static gboolean +g_filter_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + gboolean res = TRUE; + + if (GET_PRIVATE (stream)->close_base) + { + GFilterInputStream *filter_stream; + GInputStream *base_stream; + + filter_stream = G_FILTER_INPUT_STREAM (stream); + base_stream = filter_stream->base_stream; + + res = g_input_stream_close (base_stream, + cancellable, + error); + } + + return res; +} + +#define __G_FILTER_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gfilterinputstream.h b/gio/gfilterinputstream.h new file mode 100644 index 0000000..1514104 --- /dev/null +++ b/gio/gfilterinputstream.h @@ -0,0 +1,76 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILTER_INPUT_STREAM_H__ +#define __G_FILTER_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILTER_INPUT_STREAM (g_filter_input_stream_get_type ()) +#define G_FILTER_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILTER_INPUT_STREAM, GFilterInputStream)) +#define G_FILTER_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILTER_INPUT_STREAM, GFilterInputStreamClass)) +#define G_IS_FILTER_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILTER_INPUT_STREAM)) +#define G_IS_FILTER_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILTER_INPUT_STREAM)) +#define G_FILTER_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILTER_INPUT_STREAM, GFilterInputStreamClass)) + +/** + * GFilterInputStream: + * + * A base class for all input streams that work on an underlying stream. + **/ +typedef struct _GFilterInputStreamClass GFilterInputStreamClass; + +struct _GFilterInputStream +{ + GInputStream parent_instance; + + /**/ + GInputStream *base_stream; +}; + +struct _GFilterInputStreamClass +{ + GInputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); +}; + + +GType g_filter_input_stream_get_type (void) G_GNUC_CONST; +GInputStream * g_filter_input_stream_get_base_stream (GFilterInputStream *stream); +gboolean g_filter_input_stream_get_close_base_stream (GFilterInputStream *stream); +void g_filter_input_stream_set_close_base_stream (GFilterInputStream *stream, + gboolean close_base); + +G_END_DECLS + +#endif /* __G_FILTER_INPUT_STREAM_H__ */ diff --git a/gio/gfilteroutputstream.c b/gio/gfilteroutputstream.c new file mode 100644 index 0000000..606f669 --- /dev/null +++ b/gio/gfilteroutputstream.c @@ -0,0 +1,312 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#include "config.h" +#include "gfilteroutputstream.h" +#include "gsimpleasyncresult.h" +#include "goutputstream.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gfilteroutputstream + * @short_description: Filter Output Stream + * @include: gio/gio.h + * + **/ + +enum { + PROP_0, + PROP_BASE_STREAM, + PROP_CLOSE_BASE +}; + +static void g_filter_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static void g_filter_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_filter_output_stream_dispose (GObject *object); + + +static gssize g_filter_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_filter_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +static gboolean g_filter_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE (GFilterOutputStream, g_filter_output_stream, G_TYPE_OUTPUT_STREAM) + +#define GET_PRIVATE(inst) G_TYPE_INSTANCE_GET_PRIVATE (inst, \ + G_TYPE_FILTER_OUTPUT_STREAM, GFilterOutputStreamPrivate) + +typedef struct +{ + gboolean close_base; +} GFilterOutputStreamPrivate; + +static void +g_filter_output_stream_class_init (GFilterOutputStreamClass *klass) +{ + GObjectClass *object_class; + GOutputStreamClass *ostream_class; + + object_class = G_OBJECT_CLASS (klass); + object_class->get_property = g_filter_output_stream_get_property; + object_class->set_property = g_filter_output_stream_set_property; + object_class->dispose = g_filter_output_stream_dispose; + + ostream_class = G_OUTPUT_STREAM_CLASS (klass); + ostream_class->write_fn = g_filter_output_stream_write; + ostream_class->flush = g_filter_output_stream_flush; + ostream_class->close_fn = g_filter_output_stream_close; + + g_type_class_add_private (klass, sizeof (GFilterOutputStreamPrivate)); + + g_object_class_install_property (object_class, + PROP_BASE_STREAM, + g_param_spec_object ("base-stream", + P_("The Filter Base Stream"), + P_("The underlying base stream on which the io ops will be done."), + G_TYPE_OUTPUT_STREAM, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (object_class, + PROP_CLOSE_BASE, + g_param_spec_boolean ("close-base-stream", + P_("Close Base Stream"), + P_("If the base stream should be closed when the filter stream is closed."), + TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); +} + +static void +g_filter_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GFilterOutputStream *filter_stream; + GObject *obj; + + filter_stream = G_FILTER_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BASE_STREAM: + obj = g_value_dup_object (value); + filter_stream->base_stream = G_OUTPUT_STREAM (obj); + break; + + case PROP_CLOSE_BASE: + g_filter_output_stream_set_close_base_stream (filter_stream, + g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_filter_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GFilterOutputStream *filter_stream; + + filter_stream = G_FILTER_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_BASE_STREAM: + g_value_set_object (value, filter_stream->base_stream); + break; + + case PROP_CLOSE_BASE: + g_value_set_boolean (value, GET_PRIVATE (filter_stream)->close_base); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_filter_output_stream_dispose (GObject *object) +{ + GFilterOutputStream *stream; + + stream = G_FILTER_OUTPUT_STREAM (object); + + G_OBJECT_CLASS (g_filter_output_stream_parent_class)->dispose (object); + + if (stream->base_stream) + { + g_object_unref (stream->base_stream); + stream->base_stream = NULL; + } +} + + +static void +g_filter_output_stream_init (GFilterOutputStream *stream) +{ +} + +/** + * g_filter_output_stream_get_base_stream: + * @stream: a #GFilterOutputStream. + * + * Gets the base stream for the filter stream. + * + * Returns: a #GOutputStream. + **/ +GOutputStream * +g_filter_output_stream_get_base_stream (GFilterOutputStream *stream) +{ + g_return_val_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream), NULL); + + return stream->base_stream; +} + +/** + * g_filter_output_stream_get_close_base_stream: + * @stream: a #GFilterOutputStream. + * + * Returns whether the base stream will be closed when @stream is + * closed. + * + * Return value: %TRUE if the base stream will be closed. + **/ +gboolean +g_filter_output_stream_get_close_base_stream (GFilterOutputStream *stream) +{ + g_return_val_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream), FALSE); + + return GET_PRIVATE (stream)->close_base; +} + +/** + * g_filter_output_stream_set_close_base_stream: + * @stream: a #GFilterOutputStream. + * @close_base: %TRUE to close the base stream. + * + * Sets whether the base stream will be closed when @stream is closed. + **/ +void +g_filter_output_stream_set_close_base_stream (GFilterOutputStream *stream, + gboolean close_base) +{ + GFilterOutputStreamPrivate *priv; + + g_return_if_fail (G_IS_FILTER_OUTPUT_STREAM (stream)); + + close_base = !!close_base; + + priv = GET_PRIVATE (stream); + + if (priv->close_base != close_base) + { + priv->close_base = close_base; + g_object_notify (G_OBJECT (stream), "close-base-stream"); + } +} + +static gssize +g_filter_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GFilterOutputStream *filter_stream; + gssize nwritten; + + filter_stream = G_FILTER_OUTPUT_STREAM (stream); + + nwritten = g_output_stream_write (filter_stream->base_stream, + buffer, + count, + cancellable, + error); + + return nwritten; +} + +static gboolean +g_filter_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GFilterOutputStream *filter_stream; + gboolean res; + + filter_stream = G_FILTER_OUTPUT_STREAM (stream); + + res = g_output_stream_flush (filter_stream->base_stream, + cancellable, + error); + + return res; +} + +static gboolean +g_filter_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + gboolean res = TRUE; + + if (GET_PRIVATE (stream)->close_base) + { + GFilterOutputStream *filter_stream; + + filter_stream = G_FILTER_OUTPUT_STREAM (stream); + + res = g_output_stream_close (filter_stream->base_stream, + cancellable, + error); + } + + return res; +} + +#define __G_FILTER_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gfilteroutputstream.h b/gio/gfilteroutputstream.h new file mode 100644 index 0000000..10350e5 --- /dev/null +++ b/gio/gfilteroutputstream.h @@ -0,0 +1,76 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILTER_OUTPUT_STREAM_H__ +#define __G_FILTER_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_FILTER_OUTPUT_STREAM (g_filter_output_stream_get_type ()) +#define G_FILTER_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILTER_OUTPUT_STREAM, GFilterOutputStream)) +#define G_FILTER_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILTER_OUTPUT_STREAM, GFilterOutputStreamClass)) +#define G_IS_FILTER_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILTER_OUTPUT_STREAM)) +#define G_IS_FILTER_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILTER_OUTPUT_STREAM)) +#define G_FILTER_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILTER_OUTPUT_STREAM, GFilterOutputStreamClass)) + +/** + * GFilterOutputStream: + * + * A base class for all output streams that work on an underlying stream. + **/ +typedef struct _GFilterOutputStreamClass GFilterOutputStreamClass; + +struct _GFilterOutputStream +{ + GOutputStream parent_instance; + + /*< protected >*/ + GOutputStream *base_stream; +}; + +struct _GFilterOutputStreamClass +{ + GOutputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); +}; + + +GType g_filter_output_stream_get_type (void) G_GNUC_CONST; +GOutputStream * g_filter_output_stream_get_base_stream (GFilterOutputStream *stream); +gboolean g_filter_output_stream_get_close_base_stream (GFilterOutputStream *stream); +void g_filter_output_stream_set_close_base_stream (GFilterOutputStream *stream, + gboolean close_base); + +G_END_DECLS + +#endif /* __G_FILTER_OUTPUT_STREAM_H__ */ diff --git a/gio/gicon.c b/gio/gicon.c new file mode 100644 index 0000000..5c0083e --- /dev/null +++ b/gio/gicon.c @@ -0,0 +1,456 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include +#include + +#include "gicon.h" +#include "gthemedicon.h" +#include "gfileicon.h" +#include "gemblemedicon.h" +#include "gfile.h" +#include "gioerror.h" + +#include "glibintl.h" + +#include "gioalias.h" + +/* There versioning of this is implicit, version 1 would be ".1 " */ +#define G_ICON_SERIALIZATION_MAGIC0 ". " + +/** + * SECTION:gicon + * @short_description: Interface for icons + * @include: gio/gio.h + * + * #GIcon is a very minimal interface for icons. It provides functions + * for checking the equality of two icons, hashing of icons and + * serializing an icon to and from strings. + * + * #GIcon does not provide the actual pixmap for the icon as this is out + * of GIO's scope, however implementations of #GIcon may contain the name + * of an icon (see #GThemedIcon), or the path to an icon (see #GLoadableIcon). + * + * To obtain a hash of a #GIcon, see g_icon_hash(). + * + * To check if two #GIcons are equal, see g_icon_equal(). + * + * For serializing a #GIcon, use g_icon_to_string() and + * g_icon_new_for_string(). + * + * If your application or library provides one or more #GIcon + * implementations you need to ensure that each #GType is registered + * with the type system prior to calling g_icon_new_for_string(). + **/ + +typedef GIconIface GIconInterface; +G_DEFINE_INTERFACE(GIcon, g_icon, G_TYPE_OBJECT) + +static void +g_icon_default_init (GIconInterface *iface) +{ +} + +/** + * g_icon_hash: + * @icon: #gconstpointer to an icon object. + * + * Gets a hash for an icon. + * + * Returns: a #guint containing a hash for the @icon, suitable for + * use in a #GHashTable or similar data structure. + **/ +guint +g_icon_hash (gconstpointer icon) +{ + GIconIface *iface; + + g_return_val_if_fail (G_IS_ICON (icon), 0); + + iface = G_ICON_GET_IFACE (icon); + + return (* iface->hash) ((GIcon *)icon); +} + +/** + * g_icon_equal: + * @icon1: pointer to the first #GIcon. + * @icon2: pointer to the second #GIcon. + * + * Checks if two icons are equal. + * + * Returns: %TRUE if @icon1 is equal to @icon2. %FALSE otherwise. + **/ +gboolean +g_icon_equal (GIcon *icon1, + GIcon *icon2) +{ + GIconIface *iface; + + if (icon1 == NULL && icon2 == NULL) + return TRUE; + + if (icon1 == NULL || icon2 == NULL) + return FALSE; + + if (G_TYPE_FROM_INSTANCE (icon1) != G_TYPE_FROM_INSTANCE (icon2)) + return FALSE; + + iface = G_ICON_GET_IFACE (icon1); + + return (* iface->equal) (icon1, icon2); +} + +static gboolean +g_icon_to_string_tokenized (GIcon *icon, GString *s) +{ + char *ret; + GPtrArray *tokens; + gint version; + GIconIface *icon_iface; + int i; + + g_return_val_if_fail (icon != NULL, FALSE); + g_return_val_if_fail (G_IS_ICON (icon), FALSE); + + ret = NULL; + + icon_iface = G_ICON_GET_IFACE (icon); + if (icon_iface->to_tokens == NULL) + return FALSE; + + tokens = g_ptr_array_new (); + if (!icon_iface->to_tokens (icon, tokens, &version)) + { + g_ptr_array_free (tokens, TRUE); + return FALSE; + } + + /* format: TypeName[.Version] .. + version 0 is implicit and can be omitted + all the tokens are url escaped to ensure they have no spaces in them */ + + g_string_append (s, g_type_name_from_instance ((GTypeInstance *)icon)); + if (version != 0) + g_string_append_printf (s, ".%d", version); + + for (i = 0; i < tokens->len; i++) + { + char *token; + + token = g_ptr_array_index (tokens, i); + + g_string_append_c (s, ' '); + /* We really only need to escape spaces here, so allow lots of otherwise reserved chars */ + g_string_append_uri_escaped (s, token, + G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, TRUE); + + g_free (token); + } + + g_ptr_array_free (tokens, TRUE); + + return TRUE; +} + +/** + * g_icon_to_string: + * @icon: a #GIcon. + * + * Generates a textual representation of @icon that can be used for + * serialization such as when passing @icon to a different process or + * saving it to persistent storage. Use g_icon_new_for_string() to + * get @icon back from the returned string. + * + * The encoding of the returned string is proprietary to #GIcon except + * in the following two cases + * + * + * + * If @icon is a #GFileIcon, the returned string is a native path + * (such as /path/to/my icon.png) without escaping + * if the #GFile for @icon is a native file. If the file is not + * native, the returned string is the result of g_file_get_uri() + * (such as sftp://path/to/my%%20icon.png). + * + * + * If @icon is a #GThemedIcon with exactly one name, the encoding is + * simply the name (such as network-server). + * + * + * + * Returns: An allocated NUL-terminated UTF8 string or %NULL if @icon can't + * be serialized. Use g_free() to free. + * + * Since: 2.20 + */ +gchar * +g_icon_to_string (GIcon *icon) +{ + gchar *ret; + + g_return_val_if_fail (icon != NULL, NULL); + g_return_val_if_fail (G_IS_ICON (icon), NULL); + + ret = NULL; + + if (G_IS_FILE_ICON (icon)) + { + GFile *file; + + file = g_file_icon_get_file (G_FILE_ICON (icon)); + if (g_file_is_native (file)) + { + ret = g_file_get_path (file); + if (!g_utf8_validate (ret, -1, NULL)) + { + g_free (ret); + ret = NULL; + } + } + else + ret = g_file_get_uri (file); + } + else if (G_IS_THEMED_ICON (icon)) + { + const char * const *names; + + names = g_themed_icon_get_names (G_THEMED_ICON (icon)); + if (names != NULL && + names[0] != NULL && + names[0][0] != '.' && /* Allowing icons starting with dot would break G_ICON_SERIALIZATION_MAGIC0 */ + g_utf8_validate (names[0], -1, NULL) && /* Only return utf8 strings */ + names[1] == NULL) + ret = g_strdup (names[0]); + } + + if (ret == NULL) + { + GString *s; + + s = g_string_new (G_ICON_SERIALIZATION_MAGIC0); + + if (g_icon_to_string_tokenized (icon, s)) + ret = g_string_free (s, FALSE); + else + g_string_free (s, TRUE); + } + + return ret; +} + +static GIcon * +g_icon_new_from_tokens (char **tokens, + GError **error) +{ + GIcon *icon; + char *typename, *version_str; + GType type; + gpointer klass; + GIconIface *icon_iface; + gint version; + char *endp; + int num_tokens; + int i; + + icon = NULL; + klass = NULL; + + num_tokens = g_strv_length (tokens); + + if (num_tokens < 1) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Wrong number of tokens (%d)"), + num_tokens); + goto out; + } + + typename = tokens[0]; + version_str = strchr (typename, '.'); + if (version_str) + { + *version_str = 0; + version_str += 1; + } + + + type = g_type_from_name (tokens[0]); + if (type == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("No type for class name %s"), + tokens[0]); + goto out; + } + + if (!g_type_is_a (type, G_TYPE_ICON)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Type %s does not implement the GIcon interface"), + tokens[0]); + goto out; + } + + klass = g_type_class_ref (type); + if (klass == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Type %s is not classed"), + tokens[0]); + goto out; + } + + version = 0; + if (version_str) + { + version = strtol (version_str, &endp, 10); + if (endp == NULL || *endp != '\0') + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Malformed version number: %s"), + version_str); + goto out; + } + } + + icon_iface = g_type_interface_peek (klass, G_TYPE_ICON); + g_assert (icon_iface != NULL); + + if (icon_iface->from_tokens == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Type %s does not implement from_tokens() on the GIcon interface"), + tokens[0]); + goto out; + } + + for (i = 1; i < num_tokens; i++) + { + char *escaped; + + escaped = tokens[i]; + tokens[i] = g_uri_unescape_string (escaped, NULL); + g_free (escaped); + } + + icon = icon_iface->from_tokens (tokens + 1, num_tokens - 1, version, error); + + out: + if (klass != NULL) + g_type_class_unref (klass); + return icon; +} + +static void +ensure_builtin_icon_types (void) +{ + static volatile GType t; + t = g_themed_icon_get_type (); + t = g_file_icon_get_type (); + t = g_emblemed_icon_get_type (); + t = g_emblem_get_type (); +} + +/** + * g_icon_new_for_string: + * @str: A string obtained via g_icon_to_string(). + * @error: Return location for error. + * + * Generate a #GIcon instance from @str. This function can fail if + * @str is not valid - see g_icon_to_string() for discussion. + * + * If your application or library provides one or more #GIcon + * implementations you need to ensure that each #GType is registered + * with the type system prior to calling g_icon_new_for_string(). + * + * Returns: An object implementing the #GIcon interface or %NULL if + * @error is set. + * + * Since: 2.20 + **/ +GIcon * +g_icon_new_for_string (const gchar *str, + GError **error) +{ + GIcon *icon; + + g_return_val_if_fail (str != NULL, NULL); + + ensure_builtin_icon_types (); + + icon = NULL; + + if (*str == '.') + { + if (g_str_has_prefix (str, G_ICON_SERIALIZATION_MAGIC0)) + { + gchar **tokens; + + /* handle tokenized encoding */ + tokens = g_strsplit (str + sizeof (G_ICON_SERIALIZATION_MAGIC0) - 1, " ", 0); + icon = g_icon_new_from_tokens (tokens, error); + g_strfreev (tokens); + } + else + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Can't handle the supplied version the icon encoding")); + } + else + { + gchar *scheme; + + /* handle special GFileIcon and GThemedIcon cases */ + scheme = g_uri_parse_scheme (str); + if (scheme != NULL || str[0] == '/') + { + GFile *location; + location = g_file_new_for_commandline_arg (str); + icon = g_file_icon_new (location); + g_object_unref (location); + } + else + icon = g_themed_icon_new (str); + g_free (scheme); + } + + return icon; +} + + +#define __G_ICON_C__ +#include "gioaliasdef.c" diff --git a/gio/gicon.h b/gio/gicon.h new file mode 100644 index 0000000..8f339f6 --- /dev/null +++ b/gio/gicon.h @@ -0,0 +1,91 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ICON_H__ +#define __G_ICON_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_ICON (g_icon_get_type ()) +#define G_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_ICON, GIcon)) +#define G_IS_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_ICON)) +#define G_ICON_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_ICON, GIconIface)) + +/** + * GIcon: + * + * An abstract type that specifies an icon. + **/ +typedef struct _GIconIface GIconIface; + +/** + * GIconIface: + * @g_iface: The parent interface. + * @hash: A hash for a given #GIcon. + * @equal: Checks if two #GIcons are equal. + * @to_tokens: Serializes a #GIcon into tokens. The tokens must not + * contain any whitespace. Don't implement if the #GIcon can't be + * serialized (Since 2.20). + * @from_tokens: Constructs a #GIcon from tokens. Set the #GError if + * the tokens are malformed. Don't implement if the #GIcon can't be + * serialized (Since 2.20). + * + * GIconIface is used to implement GIcon types for various + * different systems. See #GThemedIcon and #GLoadableIcon for + * examples of how to implement this interface. + */ +struct _GIconIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + guint (* hash) (GIcon *icon); + gboolean (* equal) (GIcon *icon1, + GIcon *icon2); + gboolean (* to_tokens) (GIcon *icon, + GPtrArray *tokens, + gint *out_version); + GIcon * (* from_tokens) (gchar **tokens, + gint num_tokens, + gint version, + GError **error); +}; + +GType g_icon_get_type (void) G_GNUC_CONST; + +guint g_icon_hash (gconstpointer icon); +gboolean g_icon_equal (GIcon *icon1, + GIcon *icon2); +gchar *g_icon_to_string (GIcon *icon); +GIcon *g_icon_new_for_string (const gchar *str, + GError **error); + +G_END_DECLS + +#endif /* __G_ICON_H__ */ diff --git a/gio/ginetaddress.c b/gio/ginetaddress.c new file mode 100644 index 0000000..f6c5d5b --- /dev/null +++ b/gio/ginetaddress.c @@ -0,0 +1,871 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#include + +#include + +#include + +#include "ginetaddress.h" +#include "gioenums.h" +#include "gioenumtypes.h" +#include "glibintl.h" +#include "gnetworkingprivate.h" + +#include "gioalias.h" + +/** + * SECTION:ginetaddress + * @short_description: An IPv4/IPv6 address + * + * #GInetAddress represents an IPv4 or IPv6 internet address. Use + * g_resolver_lookup_by_name() or g_resolver_lookup_by_name_async() to + * look up the #GInetAddress for a hostname. Use + * g_resolver_lookup_by_address() or + * g_resolver_lookup_by_address_async() to look up the hostname for a + * #GInetAddress. + * + * To actually connect to a remote host, you will need a + * #GInetSocketAddress (which includes a #GInetAddress as well as a + * port number). + */ + +/** + * GInetAddress: + * + * An IPv4 or IPv6 internet address. + */ + +/* Networking initialization function, called from inside the g_once of + * g_inet_address_get_type() + */ +static void +_g_networking_init (void) +{ +#ifdef G_OS_WIN32 + WSADATA wsadata; + if (WSAStartup (MAKEWORD (2, 0), &wsadata) != 0) + g_error ("Windows Sockets could not be initialized"); +#endif +} + +G_DEFINE_TYPE_WITH_CODE (GInetAddress, g_inet_address, G_TYPE_OBJECT, + _g_networking_init ();) + +struct _GInetAddressPrivate +{ + GSocketFamily family; + union { + struct in_addr ipv4; + struct in6_addr ipv6; + } addr; +}; + +enum +{ + PROP_0, + PROP_FAMILY, + PROP_BYTES, + PROP_IS_ANY, + PROP_IS_LOOPBACK, + PROP_IS_LINK_LOCAL, + PROP_IS_SITE_LOCAL, + PROP_IS_MULTICAST, + PROP_IS_MC_GLOBAL, + PROP_IS_MC_LINK_LOCAL, + PROP_IS_MC_NODE_LOCAL, + PROP_IS_MC_ORG_LOCAL, + PROP_IS_MC_SITE_LOCAL, +}; + +static void +g_inet_address_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GInetAddress *address = G_INET_ADDRESS (object); + + switch (prop_id) + { + case PROP_FAMILY: + address->priv->family = g_value_get_enum (value); + break; + + case PROP_BYTES: + memcpy (&address->priv->addr, g_value_get_pointer (value), + address->priv->family == AF_INET ? + sizeof (address->priv->addr.ipv4) : + sizeof (address->priv->addr.ipv6)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_inet_address_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GInetAddress *address = G_INET_ADDRESS (object); + + switch (prop_id) + { + case PROP_FAMILY: + g_value_set_enum (value, address->priv->family); + break; + + case PROP_BYTES: + g_value_set_pointer (value, &address->priv->addr); + break; + + case PROP_IS_ANY: + g_value_set_boolean (value, g_inet_address_get_is_any (address)); + break; + + case PROP_IS_LOOPBACK: + g_value_set_boolean (value, g_inet_address_get_is_loopback (address)); + break; + + case PROP_IS_LINK_LOCAL: + g_value_set_boolean (value, g_inet_address_get_is_link_local (address)); + break; + + case PROP_IS_SITE_LOCAL: + g_value_set_boolean (value, g_inet_address_get_is_site_local (address)); + break; + + case PROP_IS_MULTICAST: + g_value_set_boolean (value, g_inet_address_get_is_multicast (address)); + break; + + case PROP_IS_MC_GLOBAL: + g_value_set_boolean (value, g_inet_address_get_is_mc_global (address)); + break; + + case PROP_IS_MC_LINK_LOCAL: + g_value_set_boolean (value, g_inet_address_get_is_mc_link_local (address)); + break; + + case PROP_IS_MC_NODE_LOCAL: + g_value_set_boolean (value, g_inet_address_get_is_mc_node_local (address)); + break; + + case PROP_IS_MC_ORG_LOCAL: + g_value_set_boolean (value, g_inet_address_get_is_mc_org_local (address)); + break; + + case PROP_IS_MC_SITE_LOCAL: + g_value_set_boolean (value, g_inet_address_get_is_mc_site_local (address)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_inet_address_class_init (GInetAddressClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GInetAddressPrivate)); + + gobject_class->set_property = g_inet_address_set_property; + gobject_class->get_property = g_inet_address_get_property; + + g_object_class_install_property (gobject_class, PROP_FAMILY, + g_param_spec_enum ("family", + P_("Address family"), + P_("The address family (IPv4 or IPv6)"), + G_TYPE_SOCKET_FAMILY, + G_SOCKET_FAMILY_INVALID, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_BYTES, + g_param_spec_pointer ("bytes", + P_("Bytes"), + P_("The raw address data"), + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-any: + * + * Whether this is the "any" address for its family. + * See g_inet_address_get_is_any(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_ANY, + g_param_spec_boolean ("is-any", + P_("Is any"), + P_("Whether this is the \"any\" address for its family"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-link-local: + * + * Whether this is a link-local address. + * See g_inet_address_get_is_link_local(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_LINK_LOCAL, + g_param_spec_boolean ("is-link-local", + P_("Is link-local"), + P_("Whether this is a link-local address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-loopback: + * + * Whether this is the loopback address for its family. + * See g_inet_address_get_is_loopback(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_LOOPBACK, + g_param_spec_boolean ("is-loopback", + P_("Is loopback"), + P_("Whether this is the loopback address for its family"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-site-local: + * + * Whether this is a site-local address. + * See g_inet_address_get_is_loopback(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_SITE_LOCAL, + g_param_spec_boolean ("is-site-local", + P_("Is site-local"), + P_("Whether this is a site-local address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-multicast: + * + * Whether this is a multicast address. + * See g_inet_address_get_is_multicast(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_MULTICAST, + g_param_spec_boolean ("is-multicast", + P_("Is multicast"), + P_("Whether this is a multicast address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-mc-global: + * + * Whether this is a global multicast address. + * See g_inet_address_get_is_mc_global(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_MC_GLOBAL, + g_param_spec_boolean ("is-mc-global", + P_("Is multicast global"), + P_("Whether this is a global multicast address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + + /** + * GInetAddress:is-mc-link-local: + * + * Whether this is a link-local multicast address. + * See g_inet_address_get_is_mc_link_local(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_MC_LINK_LOCAL, + g_param_spec_boolean ("is-mc-link-local", + P_("Is multicast link-local"), + P_("Whether this is a link-local multicast address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-mc-node-local: + * + * Whether this is a node-local multicast address. + * See g_inet_address_get_is_mc_node_local(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_MC_NODE_LOCAL, + g_param_spec_boolean ("is-mc-node-local", + P_("Is multicast node-local"), + P_("Whether this is a node-local multicast address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-mc-org-local: + * + * Whether this is an organization-local multicast address. + * See g_inet_address_get_is_mc_org_local(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_MC_ORG_LOCAL, + g_param_spec_boolean ("is-mc-org-local", + P_("Is multicast org-local"), + P_("Whether this is an organization-local multicast address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddress:is-mc-site-local: + * + * Whether this is a site-local multicast address. + * See g_inet_address_get_is_mc_site_local(). + * + * Since: 2.22 + */ + g_object_class_install_property (gobject_class, PROP_IS_MC_SITE_LOCAL, + g_param_spec_boolean ("is-mc-site-local", + P_("Is multicast site-local"), + P_("Whether this is a site-local multicast address"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_inet_address_init (GInetAddress *address) +{ + address->priv = G_TYPE_INSTANCE_GET_PRIVATE (address, + G_TYPE_INET_ADDRESS, + GInetAddressPrivate); +} + +/** + * g_inet_address_new_from_string: + * @string: a string representation of an IP address + * + * Parses @string as an IP address and creates a new #GInetAddress. + * + * Returns: a new #GInetAddress corresponding to @string, or %NULL if + * @string could not be parsed. + * + * Since: 2.22 + */ +GInetAddress * +g_inet_address_new_from_string (const gchar *string) +{ + volatile GType type; +#ifdef G_OS_WIN32 + struct sockaddr_storage sa; + struct sockaddr_in *sin = (struct sockaddr_in *)&sa; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; + gint len; +#else /* !G_OS_WIN32 */ + struct in_addr in_addr; + struct in6_addr in6_addr; +#endif + + /* Make sure _g_networking_init() has been called */ + type = g_inet_address_get_type (); + +#ifdef G_OS_WIN32 + memset (&sa, 0, sizeof (sa)); + len = sizeof (sa); + if (WSAStringToAddress ((LPTSTR) string, AF_INET, NULL, (LPSOCKADDR) &sa, &len) == 0) + return g_inet_address_new_from_bytes ((guint8 *)&sin->sin_addr, AF_INET); + else if (WSAStringToAddress ((LPTSTR) string, AF_INET6, NULL, (LPSOCKADDR) &sa, &len) == 0) + return g_inet_address_new_from_bytes ((guint8 *)&sin6->sin6_addr, AF_INET6); + +#else /* !G_OS_WIN32 */ + + if (inet_pton (AF_INET, string, &in_addr) > 0) + return g_inet_address_new_from_bytes ((guint8 *)&in_addr, AF_INET); + else if (inet_pton (AF_INET6, string, &in6_addr) > 0) + return g_inet_address_new_from_bytes ((guint8 *)&in6_addr, AF_INET6); +#endif + + return NULL; +} + +#define G_INET_ADDRESS_FAMILY_IS_VALID(family) ((family) == AF_INET || (family) == AF_INET6) + +/** + * g_inet_address_new_from_bytes: + * @bytes: raw address data + * @family: the address family of @bytes + * + * Creates a new #GInetAddress from the given @family and @bytes. + * @bytes should be 4 bytes for %G_INET_ADDRESS_IPV4 and 16 bytes for + * %G_INET_ADDRESS_IPV6. + * + * Returns: a new #GInetAddress corresponding to @family and @bytes. + * + * Since: 2.22 + */ +GInetAddress * +g_inet_address_new_from_bytes (const guint8 *bytes, + GSocketFamily family) +{ + g_return_val_if_fail (G_INET_ADDRESS_FAMILY_IS_VALID (family), NULL); + + return g_object_new (G_TYPE_INET_ADDRESS, + "family", family, + "bytes", bytes, + NULL); +} + +/** + * g_inet_address_new_loopback: + * @family: the address family + * + * Creates a #GInetAddress for the loopback address for @family. + * + * Returns: a new #GInetAddress corresponding to the loopback address + * for @family. + * + * Since: 2.22 + */ +GInetAddress * +g_inet_address_new_loopback (GSocketFamily family) +{ + g_return_val_if_fail (G_INET_ADDRESS_FAMILY_IS_VALID (family), NULL); + + if (family == AF_INET) + { + guint8 addr[4] = {127, 0, 0, 1}; + + return g_inet_address_new_from_bytes (addr, family); + } + else + return g_inet_address_new_from_bytes (in6addr_loopback.s6_addr, family); +} + +/** + * g_inet_address_new_any: + * @family: the address family + * + * Creates a #GInetAddress for the "any" address (unassigned/"don't + * care") for @family. + * + * Returns: a new #GInetAddress corresponding to the "any" address + * for @family. + * + * Since: 2.22 + */ +GInetAddress * +g_inet_address_new_any (GSocketFamily family) +{ + g_return_val_if_fail (G_INET_ADDRESS_FAMILY_IS_VALID (family), NULL); + + if (family == AF_INET) + { + guint8 addr[4] = {0, 0, 0, 0}; + + return g_inet_address_new_from_bytes (addr, family); + } + else + return g_inet_address_new_from_bytes (in6addr_any.s6_addr, family); +} + + +/** + * g_inet_address_to_string: + * @address: a #GInetAddress + * + * Converts @address to string form. + * + * Returns: a representation of @address as a string, which should be + * freed after use. + * + * Since: 2.22 + */ +gchar * +g_inet_address_to_string (GInetAddress *address) +{ + gchar buffer[INET6_ADDRSTRLEN]; +#ifdef G_OS_WIN32 + DWORD buflen = sizeof (buffer), addrlen; + struct sockaddr_storage sa; + struct sockaddr_in *sin = (struct sockaddr_in *)&sa; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&sa; +#endif + + g_return_val_if_fail (G_IS_INET_ADDRESS (address), NULL); + +#ifdef G_OS_WIN32 + sa.ss_family = address->priv->family; + if (address->priv->family == AF_INET) + { + addrlen = sizeof (*sin); + memcpy (&sin->sin_addr, &address->priv->addr.ipv4, + sizeof (sin->sin_addr)); + sin->sin_port = 0; + } + else + { + addrlen = sizeof (*sin6); + memcpy (&sin6->sin6_addr, &address->priv->addr.ipv6, + sizeof (sin6->sin6_addr)); + sin6->sin6_port = 0; + } + if (WSAAddressToString ((LPSOCKADDR) &sa, addrlen, NULL, buffer, &buflen) != 0) + return NULL; + +#else /* !G_OS_WIN32 */ + + if (address->priv->family == AF_INET) + inet_ntop (AF_INET, &address->priv->addr.ipv4, buffer, sizeof (buffer)); + else + inet_ntop (AF_INET6, &address->priv->addr.ipv6, buffer, sizeof (buffer)); +#endif + + return g_strdup (buffer); +} + +/** + * g_inet_address_to_bytes: + * @address: a #GInetAddress + * + * Gets the raw binary address data from @address. + * + * Returns: a pointer to an internal array of the bytes in @address, + * which should not be modified, stored, or freed. The size of this + * array can be gotten with g_inet_address_get_native_size(). + * + * Since: 2.22 + */ +const guint8 * +g_inet_address_to_bytes (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), NULL); + + return (guint8 *)&address->priv->addr; +} + +/** + * g_inet_address_get_native_size: + * @address: a #GInetAddress + * + * Gets the size of the native raw binary address for @address. This + * is the size of the data that you get from g_inet_address_to_bytes(). + * + * Returns: the number of bytes used for the native version of @address. + * + * Since: 2.22 + */ +gsize +g_inet_address_get_native_size (GInetAddress *address) +{ + if (address->priv->family == AF_INET) + return sizeof (address->priv->addr.ipv4); + return sizeof (address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_family: + * @address: a #GInetAddress + * + * Gets @address's family + * + * Returns: @address's family + * + * Since: 2.22 + */ +GSocketFamily +g_inet_address_get_family (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + return address->priv->family; +} + +/** + * g_inet_address_get_is_any: + * @address: a #GInetAddress + * + * Tests whether @address is the "any" address for its family. + * + * Returns: %TRUE if @address is the "any" address for its family. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_any (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + { + guint32 addr4 = g_ntohl (address->priv->addr.ipv4.s_addr); + + return addr4 == INADDR_ANY; + } + else + return IN6_IS_ADDR_UNSPECIFIED (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_loopback: + * @address: a #GInetAddress + * + * Tests whether @address is the loopback address for its family. + * + * Returns: %TRUE if @address is the loopback address for its family. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_loopback (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + { + guint32 addr4 = g_ntohl (address->priv->addr.ipv4.s_addr); + + /* 127.0.0.0/8 */ + return ((addr4 & 0xff000000) == 0x7f000000); + } + else + return IN6_IS_ADDR_LOOPBACK (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_link_local: + * @address: a #GInetAddress + * + * Tests whether @address is a link-local address (that is, if it + * identifies a host on a local network that is not connected to the + * Internet). + * + * Returns: %TRUE if @address is a link-local address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_link_local (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + { + guint32 addr4 = g_ntohl (address->priv->addr.ipv4.s_addr); + + /* 169.254.0.0/16 */ + return ((addr4 & 0xffff0000) == 0xa9fe0000); + } + else + return IN6_IS_ADDR_LINKLOCAL (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_site_local: + * @address: a #GInetAddress + * + * Tests whether @address is a site-local address such as 10.0.0.1 + * (that is, the address identifies a host on a local network that can + * not be reached directly from the Internet, but which may have + * outgoing Internet connectivity via a NAT or firewall). + * + * Returns: %TRUE if @address is a site-local address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_site_local (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + { + guint32 addr4 = g_ntohl (address->priv->addr.ipv4.s_addr); + + /* 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 */ + return ((addr4 & 0xff000000) == 0x0a000000 || + (addr4 & 0xfff00000) == 0xac100000 || + (addr4 & 0xffff0000) == 0xc0a80000); + } + else + return IN6_IS_ADDR_SITELOCAL (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_multicast: + * @address: a #GInetAddress + * + * Tests whether @address is a multicast address. + * + * Returns: %TRUE if @address is a multicast address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_multicast (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + { + guint32 addr4 = g_ntohl (address->priv->addr.ipv4.s_addr); + + return IN_MULTICAST (addr4); + } + else + return IN6_IS_ADDR_MULTICAST (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_mc_global: + * @address: a #GInetAddress + * + * Tests whether @address is a global multicast address. + * + * Returns: %TRUE if @address is a global multicast address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_mc_global (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + return FALSE; + else + return IN6_IS_ADDR_MC_GLOBAL (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_mc_link_local: + * @address: a #GInetAddress + * + * Tests whether @address is a link-local multicast address. + * + * Returns: %TRUE if @address is a link-local multicast address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_mc_link_local (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + return FALSE; + else + return IN6_IS_ADDR_MC_LINKLOCAL (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_mc_node_local: + * @address: a #GInetAddress + * + * Tests whether @address is a node-local multicast address. + * + * Returns: %TRUE if @address is a node-local multicast address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_mc_node_local (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + return FALSE; + else + return IN6_IS_ADDR_MC_NODELOCAL (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_mc_org_local: + * @address: a #GInetAddress + * + * Tests whether @address is an organization-local multicast address. + * + * Returns: %TRUE if @address is an organization-local multicast address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_mc_org_local (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + return FALSE; + else + return IN6_IS_ADDR_MC_ORGLOCAL (&address->priv->addr.ipv6); +} + +/** + * g_inet_address_get_is_mc_site_local: + * @address: a #GInetAddress + * + * Tests whether @address is a site-local multicast address. + * + * Returns: %TRUE if @address is a site-local multicast address. + * + * Since: 2.22 + */ +gboolean +g_inet_address_get_is_mc_site_local (GInetAddress *address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (address->priv->family == AF_INET) + return FALSE; + else + return IN6_IS_ADDR_MC_SITELOCAL (&address->priv->addr.ipv6); +} + +#define __G_INET_ADDRESS_C__ +#include "gioaliasdef.c" diff --git a/gio/ginetaddress.h b/gio/ginetaddress.h new file mode 100644 index 0000000..9c11efe --- /dev/null +++ b/gio/ginetaddress.h @@ -0,0 +1,103 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_INET_ADDRESS_H__ +#define __G_INET_ADDRESS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_INET_ADDRESS (g_inet_address_get_type ()) +#define G_INET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_INET_ADDRESS, GInetAddress)) +#define G_INET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_INET_ADDRESS, GInetAddressClass)) +#define G_IS_INET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_INET_ADDRESS)) +#define G_IS_INET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INET_ADDRESS)) +#define G_INET_ADDRESS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_INET_ADDRESS, GInetAddressClass)) + +typedef struct _GInetAddressClass GInetAddressClass; +typedef struct _GInetAddressPrivate GInetAddressPrivate; + +struct _GInetAddress +{ + GObject parent_instance; + + /*< private >*/ + GInetAddressPrivate *priv; +}; + +struct _GInetAddressClass +{ + GObjectClass parent_class; + + gchar * (*to_string) (GInetAddress *address); + const guint8 * (*to_bytes) (GInetAddress *address); +}; + +GType g_inet_address_get_type (void) G_GNUC_CONST; + +GInetAddress * g_inet_address_new_from_string (const gchar *string); + +GInetAddress * g_inet_address_new_from_bytes (const guint8 *bytes, + GSocketFamily family); + +GInetAddress * g_inet_address_new_loopback (GSocketFamily family); + +GInetAddress * g_inet_address_new_any (GSocketFamily family); + +gchar * g_inet_address_to_string (GInetAddress *address); + +const guint8 * g_inet_address_to_bytes (GInetAddress *address); + +gsize g_inet_address_get_native_size (GInetAddress *address); + +GSocketFamily g_inet_address_get_family (GInetAddress *address); + +gboolean g_inet_address_get_is_any (GInetAddress *address); + +gboolean g_inet_address_get_is_loopback (GInetAddress *address); + +gboolean g_inet_address_get_is_link_local (GInetAddress *address); + +gboolean g_inet_address_get_is_site_local (GInetAddress *address); + +gboolean g_inet_address_get_is_multicast (GInetAddress *address); + +gboolean g_inet_address_get_is_mc_global (GInetAddress *address); + +gboolean g_inet_address_get_is_mc_link_local (GInetAddress *address); + +gboolean g_inet_address_get_is_mc_node_local (GInetAddress *address); + +gboolean g_inet_address_get_is_mc_org_local (GInetAddress *address); + +gboolean g_inet_address_get_is_mc_site_local (GInetAddress *address); + +G_END_DECLS + +#endif /* __G_INET_ADDRESS_H__ */ + diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c new file mode 100644 index 0000000..3fc584a --- /dev/null +++ b/gio/ginetsocketaddress.c @@ -0,0 +1,325 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#include +#include +#include + +#include "ginetsocketaddress.h" +#include "ginetaddress.h" +#include "gnetworkingprivate.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:ginetsocketaddress + * @short_description: Internet GSocketAddress + * + * An IPv4 or IPv6 socket address; that is, the combination of a + * #GInetAddress and a port number. + */ + +/** + * GInetSocketAddress: + * + * An IPv4 or IPv6 socket address, corresponding to a struct + * sockaddr_in or struct sockaddr_in6. + */ +G_DEFINE_TYPE (GInetSocketAddress, g_inet_socket_address, G_TYPE_SOCKET_ADDRESS); + +enum { + PROP_0, + PROP_ADDRESS, + PROP_PORT +}; + +struct _GInetSocketAddressPrivate +{ + GInetAddress *address; + guint16 port; +}; + +static void +g_inet_socket_address_finalize (GObject *object) +{ + GInetSocketAddress *address G_GNUC_UNUSED = G_INET_SOCKET_ADDRESS (object); + + if (G_OBJECT_CLASS (g_inet_socket_address_parent_class)->finalize) + (*G_OBJECT_CLASS (g_inet_socket_address_parent_class)->finalize) (object); +} + +static void +g_inet_socket_address_dispose (GObject *object) +{ + GInetSocketAddress *address G_GNUC_UNUSED = G_INET_SOCKET_ADDRESS (object); + + g_object_unref (address->priv->address); + + if (G_OBJECT_CLASS (g_inet_socket_address_parent_class)->dispose) + (*G_OBJECT_CLASS (g_inet_socket_address_parent_class)->dispose) (object); +} + +static void +g_inet_socket_address_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (object); + + switch (prop_id) + { + case PROP_ADDRESS: + g_value_set_object (value, address->priv->address); + break; + + case PROP_PORT: + g_value_set_uint (value, address->priv->port); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_inet_socket_address_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (object); + + switch (prop_id) + { + case PROP_ADDRESS: + address->priv->address = g_object_ref (g_value_get_object (value)); + break; + + case PROP_PORT: + address->priv->port = (guint16) g_value_get_uint (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static GSocketFamily +g_inet_socket_address_get_family (GSocketAddress *address) +{ + GInetSocketAddress *addr; + + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); + + addr = G_INET_SOCKET_ADDRESS (address); + + return g_inet_address_get_family (addr->priv->address); +} + +static gssize +g_inet_socket_address_get_native_size (GSocketAddress *address) +{ + GInetSocketAddress *addr; + GSocketFamily family; + + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); + + addr = G_INET_SOCKET_ADDRESS (address); + family = g_inet_address_get_family (addr->priv->address); + + if (family == AF_INET) + return sizeof (struct sockaddr_in); + else if (family == AF_INET6) + return sizeof (struct sockaddr_in6); + else + return -1; +} + +static gboolean +g_inet_socket_address_to_native (GSocketAddress *address, + gpointer dest, + gsize destlen, + GError **error) +{ + GInetSocketAddress *addr; + GSocketFamily family; + + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); + + addr = G_INET_SOCKET_ADDRESS (address); + family = g_inet_address_get_family (addr->priv->address); + + if (family == AF_INET) + { + struct sockaddr_in *sock = (struct sockaddr_in *) dest; + + if (destlen < sizeof (*sock)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, + _("Not enough space for socket address")); + return FALSE; + } + + sock->sin_family = AF_INET; + sock->sin_port = g_htons (addr->priv->port); + memcpy (&(sock->sin_addr.s_addr), g_inet_address_to_bytes (addr->priv->address), sizeof (sock->sin_addr)); + memset (sock->sin_zero, 0, sizeof (sock->sin_zero)); + return TRUE; + } + else if (family == AF_INET6) + { + struct sockaddr_in6 *sock = (struct sockaddr_in6 *) dest; + + if (destlen < sizeof (*sock)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, + _("Not enough space for socket address")); + return FALSE; + } + + memset (sock, 0, sizeof (*sock)); + sock->sin6_family = AF_INET6; + sock->sin6_port = g_htons (addr->priv->port); + memcpy (&(sock->sin6_addr.s6_addr), g_inet_address_to_bytes (addr->priv->address), sizeof (sock->sin6_addr)); + return TRUE; + } + else + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Unsupported socket address")); + return FALSE; + } +} + +static void +g_inet_socket_address_class_init (GInetSocketAddressClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GSocketAddressClass *gsocketaddress_class = G_SOCKET_ADDRESS_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GInetSocketAddressPrivate)); + + gobject_class->finalize = g_inet_socket_address_finalize; + gobject_class->dispose = g_inet_socket_address_dispose; + gobject_class->set_property = g_inet_socket_address_set_property; + gobject_class->get_property = g_inet_socket_address_get_property; + + gsocketaddress_class->get_family = g_inet_socket_address_get_family; + gsocketaddress_class->to_native = g_inet_socket_address_to_native; + gsocketaddress_class->get_native_size = g_inet_socket_address_get_native_size; + + g_object_class_install_property (gobject_class, PROP_ADDRESS, + g_param_spec_object ("address", + P_("Address"), + P_("The address"), + G_TYPE_INET_ADDRESS, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_PORT, + g_param_spec_uint ("port", + P_("Port"), + P_("The port"), + 0, + 65535, + 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_inet_socket_address_init (GInetSocketAddress *address) +{ + address->priv = G_TYPE_INSTANCE_GET_PRIVATE (address, + G_TYPE_INET_SOCKET_ADDRESS, + GInetSocketAddressPrivate); + + address->priv->address = NULL; + address->priv->port = 0; +} + +/** + * g_inet_socket_address_new: + * @address: a #GInetAddress + * @port: a port number + * + * Creates a new #GInetSocketAddress for @address and @port. + * + * Returns: a new #GInetSocketAddress + * + * Since: 2.22 + */ +GSocketAddress * +g_inet_socket_address_new (GInetAddress *address, + guint16 port) +{ + return g_object_new (G_TYPE_INET_SOCKET_ADDRESS, + "address", address, + "port", port, + NULL); +} + +/** + * g_inet_socket_address_get_address: + * @address: a #GInetSocketAddress + * + * Gets @address's #GInetAddress. + * + * Returns: the #GInetAddress for @address, which must be + * g_object_ref()'d if it will be stored + * + * Since: 2.22 + */ +GInetAddress * +g_inet_socket_address_get_address (GInetSocketAddress *address) +{ + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), NULL); + + return address->priv->address; +} + +/** + * g_inet_socket_address_get_port: + * @address: a #GInetSocketAddress + * + * Gets @address's port. + * + * Returns: the port for @address + * + * Since: 2.22 + */ +guint16 +g_inet_socket_address_get_port (GInetSocketAddress *address) +{ + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); + + return address->priv->port; +} + +#define __G_INET_SOCKET_ADDRESS_C__ +#include "gioaliasdef.c" diff --git a/gio/ginetsocketaddress.h b/gio/ginetsocketaddress.h new file mode 100644 index 0000000..b455ac5 --- /dev/null +++ b/gio/ginetsocketaddress.h @@ -0,0 +1,69 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_INET_SOCKET_ADDRESS_H__ +#define __G_INET_SOCKET_ADDRESS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_INET_SOCKET_ADDRESS (g_inet_socket_address_get_type ()) +#define G_INET_SOCKET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_INET_SOCKET_ADDRESS, GInetSocketAddress)) +#define G_INET_SOCKET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_INET_SOCKET_ADDRESS, GInetSocketAddressClass)) +#define G_IS_INET_SOCKET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_INET_SOCKET_ADDRESS)) +#define G_IS_INET_SOCKET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INET_SOCKET_ADDRESS)) +#define G_INET_SOCKET_ADDRESS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_INET_SOCKET_ADDRESS, GInetSocketAddressClass)) + +typedef struct _GInetSocketAddressClass GInetSocketAddressClass; +typedef struct _GInetSocketAddressPrivate GInetSocketAddressPrivate; + +struct _GInetSocketAddress +{ + GSocketAddress parent_instance; + + /*< private >*/ + GInetSocketAddressPrivate *priv; +}; + +struct _GInetSocketAddressClass +{ + GSocketAddressClass parent_class; +}; + +GType g_inet_socket_address_get_type (void) G_GNUC_CONST; + +GSocketAddress *g_inet_socket_address_new (GInetAddress *address, + guint16 port); + +GInetAddress * g_inet_socket_address_get_address (GInetSocketAddress *address); + +guint16 g_inet_socket_address_get_port (GInetSocketAddress *address); + +G_END_DECLS + +#endif /* __G_INET_SOCKET_ADDRESS_H__ */ diff --git a/gio/ginitable.c b/gio/ginitable.c new file mode 100644 index 0000000..f243b73 --- /dev/null +++ b/gio/ginitable.c @@ -0,0 +1,252 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "ginitable.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:ginitable + * @short_description: Failable object initialization interface + * @include: gio/gio.h + * @see_also: #GAsyncInitable + * + * #GInitable is implemented by objects that can fail during + * initialization. If an object implements this interface the + * g_initable_init() function must be called as the first thing + * after construction. If g_initable_init() is not called, or if + * it returns an error, all further operations on the object + * should fail, generally with a %G_IO_ERROR_NOT_INITIALIZED error. + * + * Users of objects implementing this are not intended to use + * the interface method directly, instead it will be used automatically + * in various ways. For C applications you generally just call + * g_initable_new() directly, or indirectly via a foo_thing_new() wrapper. + * This will call g_initable_init() under the cover, returning %NULL and + * setting a %GError on failure. + * + * For bindings in languages where the native constructor supports + * exceptions the binding could check for objects implemention %GInitable + * during normal construction and automatically initialize them, throwing + * an exception on failure. + */ + +GType +g_initable_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + const GTypeInfo initable_info = + { + sizeof (GInitableIface), /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL + }; + GType g_define_type_id = + g_type_register_static (G_TYPE_INTERFACE, I_("GInitable"), + &initable_info, 0); + + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/** + * g_initable_init: + * @initable: a #GInitable. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Initializes the object implementing the interface. This must be + * done before any real use of the object after initial construction. + * + * Implementations may also support cancellation. If @cancellable is not %NULL, + * then initialization can be cancelled by triggering the cancellable object + * from another thread. If the operation was cancelled, the error + * %G_IO_ERROR_CANCELLED will be returned. If @cancellable is not %NULL and + * the object doesn't support cancellable initialization the error + * %G_IO_ERROR_NOT_SUPPORTED will be returned. + * + * If this function is not called, or returns with an error then all + * operations on the object should fail, generally returning the + * error %G_IO_ERROR_NOT_INITIALIZED. + * + * Implementations of this method must be idempotent, i.e. multiple calls + * to this function with the same argument should return the same results. + * Only the first call initializes the object, further calls return the result + * of the first call. This is so that its safe to implement the singleton + * pattern in the GObject constructor function. + * + * Returns: %TRUE if successful. If an error has occurred, this function will + * return %FALSE and set @error appropriately if present. + * + * Since: 2.22 + */ +gboolean +g_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GInitableIface *iface; + + g_return_val_if_fail (G_IS_INITABLE (initable), FALSE); + + iface = G_INITABLE_GET_IFACE (initable); + + return (* iface->init) (initable, cancellable, error); +} + +/** + * g_initable_new: + * @object_type: a #GType supporting #GInitable. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * @first_property_name: the name of the first property, or %NULL if no + * properties + * @...: the value if the first property, followed by and other property + * value pairs, and ended by %NULL. + * + * Helper function for constructing #GInitiable object. This is + * similar to g_object_new() but also initializes the object + * and returns %NULL, setting an error on failure. + * + * Return value: a newly allocated #GObject, or %NULL on error + * + * Since: 2.22 + */ +gpointer +g_initable_new (GType object_type, + GCancellable *cancellable, + GError **error, + const gchar *first_property_name, + ...) +{ + GObject *object; + va_list var_args; + + va_start (var_args, first_property_name); + object = g_initable_new_valist (object_type, + first_property_name, var_args, + cancellable, error); + va_end (var_args); + + return object; +} + +/** + * g_initable_newv: + * @object_type: a #GType supporting #GInitable. + * @n_parameters: the number of parameters in @parameters + * @parameters: the parameters to use to construct the object + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Helper function for constructing #GInitiable object. This is + * similar to g_object_newv() but also initializes the object + * and returns %NULL, setting an error on failure. + * + * Return value: a newly allocated #GObject, or %NULL on error + * + * Since: 2.22 + */ +gpointer +g_initable_newv (GType object_type, + guint n_parameters, + GParameter *parameters, + GCancellable *cancellable, + GError **error) +{ + GObject *obj; + + g_return_val_if_fail (G_TYPE_IS_INITABLE (object_type), NULL); + + obj = g_object_newv (object_type, n_parameters, parameters); + + if (!g_initable_init (G_INITABLE (obj), cancellable, error)) + { + g_object_unref (obj); + return NULL; + } + + return (gpointer)obj; +} + +/** + * g_initable_new_valist: + * @object_type: a #GType supporting #GInitable. + * @first_property_name: the name of the first property, followed by + * the value, and other property value pairs, and ended by %NULL. + * @var_args: The var args list generated from @first_property_name. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Helper function for constructing #GInitiable object. This is + * similar to g_object_new_valist() but also initializes the object + * and returns %NULL, setting an error on failure. + * + * Return value: a newly allocated #GObject, or %NULL on error + * + * Since: 2.22 + */ +GObject* +g_initable_new_valist (GType object_type, + const gchar *first_property_name, + va_list var_args, + GCancellable *cancellable, + GError **error) +{ + GObject *obj; + + g_return_val_if_fail (G_TYPE_IS_INITABLE (object_type), NULL); + + obj = g_object_new_valist (object_type, + first_property_name, + var_args); + + if (!g_initable_init (G_INITABLE (obj), cancellable, error)) + { + g_object_unref (obj); + return NULL; + } + + return obj; +} + +#define __G_INITABLE_C__ +#include "gioaliasdef.c" diff --git a/gio/ginitable.h b/gio/ginitable.h new file mode 100644 index 0000000..1a2d13d --- /dev/null +++ b/gio/ginitable.h @@ -0,0 +1,96 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_INITABLE_H__ +#define __G_INITABLE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_INITABLE (g_initable_get_type ()) +#define G_INITABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_INITABLE, GInitable)) +#define G_IS_INITABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_INITABLE)) +#define G_INITABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_INITABLE, GInitableIface)) +#define G_TYPE_IS_INITABLE(type) (g_type_is_a ((type), G_TYPE_INITABLE)) + +/** + * GInitable: + * + * Interface for initializable objects. + * + * Since: 2.22 + **/ +typedef struct _GInitableIface GInitableIface; + +/** + * GInitableIface: + * @g_iface: The parent interface. + * @init: Initializes the object. + * + * Provides an interface for initializing object such that initialization + * may fail. + * + * Since: 2.22 + **/ +struct _GInitableIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + gboolean (* init) (GInitable *initable, + GCancellable *cancellable, + GError **error); +}; + + +GType g_initable_get_type (void) G_GNUC_CONST; + +gboolean g_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error); + +gpointer g_initable_new (GType object_type, + GCancellable *cancellable, + GError **error, + const gchar *first_property_name, + ...); +gpointer g_initable_newv (GType object_type, + guint n_parameters, + GParameter *parameters, + GCancellable *cancellable, + GError **error); +GObject* g_initable_new_valist (GType object_type, + const gchar *first_property_name, + va_list var_args, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + + +#endif /* __G_INITABLE_H__ */ diff --git a/gio/ginputstream.c b/gio/ginputstream.c new file mode 100644 index 0000000..215d6ac --- /dev/null +++ b/gio/ginputstream.c @@ -0,0 +1,1209 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include "ginputstream.h" +#include "gseekable.h" +#include "gcancellable.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" + +#include "gioalias.h" + +/** + * SECTION:ginputstream + * @short_description: Base class for implementing streaming input + * @include: gio/gio.h + * + * GInputStream has functions to read from a stream (g_input_stream_read()), + * to close a stream (g_input_stream_close()) and to skip some content + * (g_input_stream_skip()). + * + * To copy the content of an input stream to an output stream without + * manually handling the reads and writes, use g_output_stream_splice(). + * + * All of these functions have async variants too. + **/ + +G_DEFINE_TYPE (GInputStream, g_input_stream, G_TYPE_OBJECT); + +struct _GInputStreamPrivate { + guint closed : 1; + guint pending : 1; + GAsyncReadyCallback outstanding_callback; +}; + +static gssize g_input_stream_real_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +static void g_input_stream_real_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gssize g_input_stream_real_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static void g_input_stream_real_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_input_stream_real_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static void g_input_stream_real_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_input_stream_real_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); + +static void +g_input_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_input_stream_parent_class)->finalize (object); +} + +static void +g_input_stream_dispose (GObject *object) +{ + GInputStream *stream; + + stream = G_INPUT_STREAM (object); + + if (!stream->priv->closed) + g_input_stream_close (stream, NULL, NULL); + + G_OBJECT_CLASS (g_input_stream_parent_class)->dispose (object); +} + + +static void +g_input_stream_class_init (GInputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GInputStreamPrivate)); + + gobject_class->finalize = g_input_stream_finalize; + gobject_class->dispose = g_input_stream_dispose; + + klass->skip = g_input_stream_real_skip; + klass->read_async = g_input_stream_real_read_async; + klass->read_finish = g_input_stream_real_read_finish; + klass->skip_async = g_input_stream_real_skip_async; + klass->skip_finish = g_input_stream_real_skip_finish; + klass->close_async = g_input_stream_real_close_async; + klass->close_finish = g_input_stream_real_close_finish; +} + +static void +g_input_stream_init (GInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_INPUT_STREAM, + GInputStreamPrivate); +} + +/** + * g_input_stream_read: + * @stream: a #GInputStream. + * @buffer: a buffer to read data into (which should be at least count bytes long). + * @count: the number of bytes that will be read from the stream + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Tries to read @count bytes from the stream into the buffer starting at + * @buffer. Will block during this read. + * + * If count is zero returns zero and does nothing. A value of @count + * larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, the number of bytes read into the buffer is returned. + * It is not an error if this is not the same as the requested size, as it + * can happen e.g. near the end of a file. Zero is returned on end of file + * (or if @count is zero), but never otherwise. + * + * If @cancellable is not NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an + * operation was partially finished when the operation was cancelled the + * partial result will be returned, without an error. + * + * On error -1 is returned and @error is set accordingly. + * + * Return value: Number of bytes read, or -1 on error + **/ +gssize +g_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GInputStreamClass *class; + gssize res; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), -1); + g_return_val_if_fail (buffer != NULL, 0); + + if (count == 0) + return 0; + + if (((gssize) count) < 0) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), G_STRFUNC); + return -1; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + + if (class->read_fn == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Input stream doesn't implement read")); + return -1; + } + + if (!g_input_stream_set_pending (stream, error)) + return -1; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->read_fn (stream, buffer, count, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (stream); + + return res; +} + +/** + * g_input_stream_read_all: + * @stream: a #GInputStream. + * @buffer: a buffer to read data into (which should be at least count bytes long). + * @count: the number of bytes that will be read from the stream + * @bytes_read: location to store the number of bytes that was read from the stream + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Tries to read @count bytes from the stream into the buffer starting at + * @buffer. Will block during this read. + * + * This function is similar to g_input_stream_read(), except it tries to + * read as many bytes as requested, only stopping on an error or end of stream. + * + * On a successful read of @count bytes, or if we reached the end of the + * stream, %TRUE is returned, and @bytes_read is set to the number of bytes + * read into @buffer. + * + * If there is an error during the operation %FALSE is returned and @error + * is set to indicate the error status, @bytes_read is updated to contain + * the number of bytes read into @buffer before the error occurred. + * + * Return value: %TRUE on success, %FALSE if there was an error + **/ +gboolean +g_input_stream_read_all (GInputStream *stream, + void *buffer, + gsize count, + gsize *bytes_read, + GCancellable *cancellable, + GError **error) +{ + gsize _bytes_read; + gssize res; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE); + g_return_val_if_fail (buffer != NULL, FALSE); + + _bytes_read = 0; + while (_bytes_read < count) + { + res = g_input_stream_read (stream, (char *)buffer + _bytes_read, count - _bytes_read, + cancellable, error); + if (res == -1) + { + if (bytes_read) + *bytes_read = _bytes_read; + return FALSE; + } + + if (res == 0) + break; + + _bytes_read += res; + } + + if (bytes_read) + *bytes_read = _bytes_read; + return TRUE; +} + +/** + * g_input_stream_skip: + * @stream: a #GInputStream. + * @count: the number of bytes that will be skipped from the stream + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Tries to skip @count bytes from the stream. Will block during the operation. + * + * This is identical to g_input_stream_read(), from a behaviour standpoint, + * but the bytes that are skipped are not returned to the user. Some + * streams have an implementation that is more efficient than reading the data. + * + * This function is optional for inherited classes, as the default implementation + * emulates it using read. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. If an + * operation was partially finished when the operation was cancelled the + * partial result will be returned, without an error. + * + * Return value: Number of bytes skipped, or -1 on error + **/ +gssize +g_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GInputStreamClass *class; + gssize res; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), -1); + + if (count == 0) + return 0; + + if (((gssize) count) < 0) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), G_STRFUNC); + return -1; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + + if (!g_input_stream_set_pending (stream, error)) + return -1; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->skip (stream, count, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (stream); + + return res; +} + +static gssize +g_input_stream_real_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GInputStreamClass *class; + gssize ret, read_bytes; + char buffer[8192]; + GError *my_error; + + if (G_IS_SEEKABLE (stream) && g_seekable_can_seek (G_SEEKABLE (stream))) + { + if (g_seekable_seek (G_SEEKABLE (stream), + count, + G_SEEK_CUR, + cancellable, + NULL)) + return count; + } + + /* If not seekable, or seek failed, fall back to reading data: */ + + class = G_INPUT_STREAM_GET_CLASS (stream); + + read_bytes = 0; + while (1) + { + my_error = NULL; + + ret = class->read_fn (stream, buffer, MIN (sizeof (buffer), count), + cancellable, &my_error); + if (ret == -1) + { + if (read_bytes > 0 && + my_error->domain == G_IO_ERROR && + my_error->code == G_IO_ERROR_CANCELLED) + { + g_error_free (my_error); + return read_bytes; + } + + g_propagate_error (error, my_error); + return -1; + } + + count -= ret; + read_bytes += ret; + + if (ret == 0 || count == 0) + return read_bytes; + } +} + +/** + * g_input_stream_close: + * @stream: A #GInputStream. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Closes the stream, releasing resources related to it. + * + * Once the stream is closed, all other operations will return %G_IO_ERROR_CLOSED. + * Closing a stream multiple times will not return an error. + * + * Streams will be automatically closed when the last reference + * is dropped, but you might want to call this function to make sure + * resources are released as early as possible. + * + * Some streams might keep the backing store of the stream (e.g. a file descriptor) + * open after the stream is closed. See the documentation for the individual + * stream for details. + * + * On failure the first error that happened will be reported, but the close + * operation will finish as much as possible. A stream that failed to + * close will still return %G_IO_ERROR_CLOSED for all operations. Still, it + * is important to check and report the error to the user. + * + * If @cancellable is not NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * Cancelling a close will still leave the stream closed, but some streams + * can use a faster close that doesn't block to e.g. check errors. + * + * Return value: %TRUE on success, %FALSE on failure + **/ +gboolean +g_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GInputStreamClass *class; + gboolean res; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE); + + class = G_INPUT_STREAM_GET_CLASS (stream); + + if (stream->priv->closed) + return TRUE; + + res = TRUE; + + if (!g_input_stream_set_pending (stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + if (class->close_fn) + res = class->close_fn (stream, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_input_stream_clear_pending (stream); + + stream->priv->closed = TRUE; + + return res; +} + +static void +async_ready_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GInputStream *stream = G_INPUT_STREAM (source_object); + + g_input_stream_clear_pending (stream); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +static void +async_ready_close_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GInputStream *stream = G_INPUT_STREAM (source_object); + + g_input_stream_clear_pending (stream); + stream->priv->closed = TRUE; + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_input_stream_read_async: + * @stream: A #GInputStream. + * @buffer: a buffer to read data into (which should be at least count bytes long). + * @count: the number of bytes that will be read from the stream + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Request an asynchronous read of @count bytes from the stream into the buffer + * starting at @buffer. When the operation is finished @callback will be called. + * You can then call g_input_stream_read_finish() to get the result of the + * operation. + * + * During an async request no other sync and async calls are allowed on @stream, and will + * result in %G_IO_ERROR_PENDING errors. + * + * A value of @count larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, the number of bytes read into the buffer will be passed to the + * callback. It is not an error if this is not the same as the requested size, as it + * can happen e.g. near the end of a file, but generally we try to read + * as many bytes as requested. Zero is returned on end of file + * (or if @count is zero), but never otherwise. + * + * Any outstanding i/o request with higher priority (lower numerical value) will + * be executed before an outstanding request with lower priority. Default + * priority is %G_PRIORITY_DEFAULT. + * + * The asyncronous methods have a default fallback that uses threads to implement + * asynchronicity, so they are optional for inheriting classes. However, if you + * override one you must override all. + **/ +void +g_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + g_return_if_fail (buffer != NULL); + + if (count == 0) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_input_stream_read_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (((gssize) count) < 0) + { + g_simple_async_report_error_in_idle (G_OBJECT (stream), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), + G_STRFUNC); + return; + } + + if (!g_input_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->read_async (stream, buffer, count, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_input_stream_read_finish: + * @stream: a #GInputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an asynchronous stream read operation. + * + * Returns: number of bytes read in, or -1 on error. + **/ +gssize +g_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GInputStreamClass *class; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), -1); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return -1; + + /* Special case read of 0 bytes */ + if (g_simple_async_result_get_source_tag (simple) == g_input_stream_read_async) + return 0; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + return class->read_finish (stream, result, error); +} + +/** + * g_input_stream_skip_async: + * @stream: A #GInputStream. + * @count: the number of bytes that will be skipped from the stream + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Request an asynchronous skip of @count bytes from the stream. + * When the operation is finished @callback will be called. + * You can then call g_input_stream_skip_finish() to get the result of the + * operation. + * + * During an async request no other sync and async calls are allowed, and will + * result in %G_IO_ERROR_PENDING errors. + * + * A value of @count larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, the number of bytes skipped will be passed to the + * callback. It is not an error if this is not the same as the requested size, as it + * can happen e.g. near the end of a file, but generally we try to skip + * as many bytes as requested. Zero is returned on end of file + * (or if @count is zero), but never otherwise. + * + * Any outstanding i/o request with higher priority (lower numerical value) will + * be executed before an outstanding request with lower priority. Default + * priority is %G_PRIORITY_DEFAULT. + * + * The asyncronous methods have a default fallback that uses threads to implement + * asynchronicity, so they are optional for inheriting classes. However, if you + * override one you must override all. + **/ +void +g_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + + if (count == 0) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_input_stream_skip_async); + + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (((gssize) count) < 0) + { + g_simple_async_report_error_in_idle (G_OBJECT (stream), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), + G_STRFUNC); + return; + } + + if (!g_input_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->skip_async (stream, count, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_input_stream_skip_finish: + * @stream: a #GInputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes a stream skip operation. + * + * Returns: the size of the bytes skipped, or %-1 on error. + **/ +gssize +g_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GInputStreamClass *class; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), -1); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return -1; + + /* Special case skip of 0 bytes */ + if (g_simple_async_result_get_source_tag (simple) == g_input_stream_skip_async) + return 0; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + return class->skip_finish (stream, result, error); +} + +/** + * g_input_stream_close_async: + * @stream: A #GInputStream. + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional cancellable object + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Requests an asynchronous closes of the stream, releasing resources related to it. + * When the operation is finished @callback will be called. + * You can then call g_input_stream_close_finish() to get the result of the + * operation. + * + * For behaviour details see g_input_stream_close(). + * + * The asyncronous methods have a default fallback that uses threads to implement + * asynchronicity, so they are optional for inheriting classes. However, if you + * override one you must override all. + **/ +void +g_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + + if (stream->priv->closed) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_input_stream_close_async); + + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (!g_input_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->close_async (stream, io_priority, cancellable, + async_ready_close_callback_wrapper, user_data); +} + +/** + * g_input_stream_close_finish: + * @stream: a #GInputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes closing a stream asynchronously, started from g_input_stream_close_async(). + * + * Returns: %TRUE if the stream was closed successfully. + **/ +gboolean +g_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GInputStreamClass *class; + + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + /* Special case already closed */ + if (g_simple_async_result_get_source_tag (simple) == g_input_stream_close_async) + return TRUE; + } + + class = G_INPUT_STREAM_GET_CLASS (stream); + return class->close_finish (stream, result, error); +} + +/** + * g_input_stream_is_closed: + * @stream: input stream. + * + * Checks if an input stream is closed. + * + * Returns: %TRUE if the stream is closed. + **/ +gboolean +g_input_stream_is_closed (GInputStream *stream) +{ + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), TRUE); + + return stream->priv->closed; +} + +/** + * g_input_stream_has_pending: + * @stream: input stream. + * + * Checks if an input stream has pending actions. + * + * Returns: %TRUE if @stream has pending actions. + **/ +gboolean +g_input_stream_has_pending (GInputStream *stream) +{ + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), TRUE); + + return stream->priv->pending; +} + +/** + * g_input_stream_set_pending: + * @stream: input stream + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Sets @stream to have actions pending. If the pending flag is + * already set or @stream is closed, it will return %FALSE and set + * @error. + * + * Return value: %TRUE if pending was previously unset and is now set. + **/ +gboolean +g_input_stream_set_pending (GInputStream *stream, GError **error) +{ + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), FALSE); + + if (stream->priv->closed) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Stream is already closed")); + return FALSE; + } + + if (stream->priv->pending) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + /* Translators: This is an error you get if there is already an + * operation running against this stream when you try to start + * one */ + _("Stream has outstanding operation")); + return FALSE; + } + + stream->priv->pending = TRUE; + return TRUE; +} + +/** + * g_input_stream_clear_pending: + * @stream: input stream + * + * Clears the pending flag on @stream. + **/ +void +g_input_stream_clear_pending (GInputStream *stream) +{ + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + + stream->priv->pending = FALSE; +} + +/******************************************** + * Default implementation of async ops * + ********************************************/ + +typedef struct { + void *buffer; + gsize count_requested; + gssize count_read; +} ReadData; + +static void +read_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + ReadData *op; + GInputStreamClass *class; + GError *error = NULL; + + op = g_simple_async_result_get_op_res_gpointer (res); + + class = G_INPUT_STREAM_GET_CLASS (object); + + op->count_read = class->read_fn (G_INPUT_STREAM (object), + op->buffer, op->count_requested, + cancellable, &error); + if (op->count_read == -1) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } +} + +static void +g_input_stream_real_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + ReadData *op; + + op = g_new (ReadData, 1); + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_input_stream_real_read_async); + g_simple_async_result_set_op_res_gpointer (res, op, g_free); + op->buffer = buffer; + op->count_requested = count; + + g_simple_async_result_run_in_thread (res, read_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static gssize +g_input_stream_real_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + ReadData *op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_input_stream_real_read_async); + + op = g_simple_async_result_get_op_res_gpointer (simple); + + return op->count_read; +} + +typedef struct { + gsize count_requested; + gssize count_skipped; +} SkipData; + + +static void +skip_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + SkipData *op; + GInputStreamClass *class; + GError *error = NULL; + + class = G_INPUT_STREAM_GET_CLASS (object); + op = g_simple_async_result_get_op_res_gpointer (res); + op->count_skipped = class->skip (G_INPUT_STREAM (object), + op->count_requested, + cancellable, &error); + if (op->count_skipped == -1) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } +} + +typedef struct { + char buffer[8192]; + gsize count; + gsize count_skipped; + int io_prio; + GCancellable *cancellable; + gpointer user_data; + GAsyncReadyCallback callback; +} SkipFallbackAsyncData; + +static void +skip_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GInputStreamClass *class; + SkipFallbackAsyncData *data = user_data; + SkipData *op; + GSimpleAsyncResult *simple; + GError *error = NULL; + gssize ret; + + ret = g_input_stream_read_finish (G_INPUT_STREAM (source_object), res, &error); + + if (ret > 0) + { + data->count -= ret; + data->count_skipped += ret; + + if (data->count > 0) + { + class = G_INPUT_STREAM_GET_CLASS (source_object); + class->read_async (G_INPUT_STREAM (source_object), data->buffer, MIN (8192, data->count), data->io_prio, data->cancellable, + skip_callback_wrapper, data); + return; + } + } + + op = g_new0 (SkipData, 1); + op->count_skipped = data->count_skipped; + simple = g_simple_async_result_new (source_object, + data->callback, data->user_data, + g_input_stream_real_skip_async); + + g_simple_async_result_set_op_res_gpointer (simple, op, g_free); + + if (ret == -1) + { + if (data->count_skipped && + error->domain == G_IO_ERROR && + error->code == G_IO_ERROR_CANCELLED) + { /* No error, return partial read */ } + else + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); + + g_free (data); + } + +static void +g_input_stream_real_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInputStreamClass *class; + SkipData *op; + SkipFallbackAsyncData *data; + GSimpleAsyncResult *res; + + class = G_INPUT_STREAM_GET_CLASS (stream); + + if (class->read_async == g_input_stream_real_read_async) + { + /* Read is thread-using async fallback. + * Make skip use threads too, so that we can use a possible sync skip + * implementation. */ + op = g_new0 (SkipData, 1); + + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, + g_input_stream_real_skip_async); + + g_simple_async_result_set_op_res_gpointer (res, op, g_free); + + op->count_requested = count; + + g_simple_async_result_run_in_thread (res, skip_async_thread, io_priority, cancellable); + g_object_unref (res); + } + else + { + /* TODO: Skip fallback uses too much memory, should do multiple read calls */ + + /* There is a custom async read function, lets use that. */ + data = g_new (SkipFallbackAsyncData, 1); + data->count = count; + data->count_skipped = 0; + data->io_prio = io_priority; + data->cancellable = cancellable; + data->callback = callback; + data->user_data = user_data; + class->read_async (stream, data->buffer, MIN (8192, count), io_priority, cancellable, + skip_callback_wrapper, data); + } + +} + +static gssize +g_input_stream_real_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + SkipData *op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_input_stream_real_skip_async); + op = g_simple_async_result_get_op_res_gpointer (simple); + return op->count_skipped; +} + +static void +close_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GInputStreamClass *class; + GError *error = NULL; + gboolean result; + + /* Auto handling of cancelation disabled, and ignore + cancellation, since we want to close things anyway, although + possibly in a quick-n-dirty way. At least we never want to leak + open handles */ + + class = G_INPUT_STREAM_GET_CLASS (object); + if (class->close_fn) + { + result = class->close_fn (G_INPUT_STREAM (object), cancellable, &error); + if (!result) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + } +} + +static void +g_input_stream_real_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_input_stream_real_close_async); + + g_simple_async_result_set_handle_cancellation (res, FALSE); + + g_simple_async_result_run_in_thread (res, + close_async_thread, + io_priority, + cancellable); + g_object_unref (res); +} + +static gboolean +g_input_stream_real_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_input_stream_real_close_async); + return TRUE; +} + +#define __G_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/ginputstream.h b/gio/ginputstream.h new file mode 100644 index 0000000..8179529 --- /dev/null +++ b/gio/ginputstream.h @@ -0,0 +1,172 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_INPUT_STREAM_H__ +#define __G_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_INPUT_STREAM (g_input_stream_get_type ()) +#define G_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_INPUT_STREAM, GInputStream)) +#define G_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_INPUT_STREAM, GInputStreamClass)) +#define G_IS_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_INPUT_STREAM)) +#define G_IS_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INPUT_STREAM)) +#define G_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_INPUT_STREAM, GInputStreamClass)) + +/** + * GInputStream: + * + * Base class for streaming input operations. + **/ +typedef struct _GInputStreamClass GInputStreamClass; +typedef struct _GInputStreamPrivate GInputStreamPrivate; + +struct _GInputStream +{ + GObject parent_instance; + + /*< private >*/ + GInputStreamPrivate *priv; +}; + +struct _GInputStreamClass +{ + GObjectClass parent_class; + + /* Sync ops: */ + + gssize (* read_fn) (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + gssize (* skip) (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); + gboolean (* close_fn) (GInputStream *stream, + GCancellable *cancellable, + GError **error); + + /* Async ops: (optional in derived classes) */ + void (* read_async) (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gssize (* read_finish) (GInputStream *stream, + GAsyncResult *result, + GError **error); + void (* skip_async) (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gssize (* skip_finish) (GInputStream *stream, + GAsyncResult *result, + GError **error); + void (* close_async) (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* close_finish) (GInputStream *stream, + GAsyncResult *result, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_input_stream_get_type (void) G_GNUC_CONST; + +gssize g_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +gboolean g_input_stream_read_all (GInputStream *stream, + void *buffer, + gsize count, + gsize *bytes_read, + GCancellable *cancellable, + GError **error); +gssize g_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +gboolean g_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); +void g_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gssize g_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +void g_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gssize g_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +void g_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); + +/* For implementations: */ + +gboolean g_input_stream_is_closed (GInputStream *stream); +gboolean g_input_stream_has_pending (GInputStream *stream); +gboolean g_input_stream_set_pending (GInputStream *stream, + GError **error); +void g_input_stream_clear_pending (GInputStream *stream); + +G_END_DECLS + +#endif /* __G_INPUT_STREAM_H__ */ diff --git a/gio/gio-marshal.list b/gio/gio-marshal.list new file mode 100644 index 0000000..269ec35 --- /dev/null +++ b/gio/gio-marshal.list @@ -0,0 +1,6 @@ +VOID:STRING,STRING,STRING,FLAGS +VOID:STRING,BOXED +VOID:BOOLEAN,POINTER +VOID:OBJECT,OBJECT,ENUM +BOOLEAN:OBJECT,OBJECT +VOID:STRING,BOXED,BOXED diff --git a/gio/gio-querymodules.c b/gio/gio-querymodules.c new file mode 100644 index 0000000..716a7b8 --- /dev/null +++ b/gio/gio-querymodules.c @@ -0,0 +1,133 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "giomodule.h" + +static gboolean +is_valid_module_name (const gchar *basename) +{ +#if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) + return + g_str_has_prefix (basename, "lib") && + g_str_has_suffix (basename, ".so"); +#else + return g_str_has_suffix (basename, ".dll"); +#endif +} + +static void +query_dir (const char *dirname) +{ + GString *data; + GDir *dir; + const char *name; + char *cachename; + char **(* query) (void); + GError *error; + int i; + + if (!g_module_supported ()) + return; + + error = NULL; + dir = g_dir_open (dirname, 0, &error); + if (!dir) + { + g_printerr ("Unable to open directory %s: %s\n", dirname, error->message); + g_error_free (error); + return; + } + + data = g_string_new (""); + + while ((name = g_dir_read_name (dir))) + { + GModule *module; + gchar *path; + char **extension_points; + + if (!is_valid_module_name (name)) + continue; + + path = g_build_filename (dirname, name, NULL); + module = g_module_open (path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); + g_free (path); + + if (module) + { + g_module_symbol (module, "g_io_module_query", (gpointer) &query); + + if (query) + { + extension_points = query (); + + if (extension_points) + { + g_string_append_printf (data, "%s: ", name); + + for (i = 0; extension_points[i] != NULL; i++) + g_string_append_printf (data, "%s%s", i == 0 ? "" : ",", extension_points[i]); + + g_string_append (data, "\n"); + g_strfreev (extension_points); + } + } + + g_module_close (module); + } + } + + g_dir_close (dir); + + cachename = g_build_filename (dirname, "giomodule.cache", NULL); + + error = NULL; + if (!g_file_set_contents (cachename, data->str, data->len, &error)) + { + g_printerr ("Unable to create %s: %s\n", cachename, error->message); + g_error_free (error); + } + + g_string_free (data, TRUE); +} + +int +main (gint argc, + gchar *argv[]) +{ + int i; + + g_type_init (); + + if (argc == 1) + { + g_print ("Usage: gio-querymodules [ ...]\n"); + g_print ("Will update giomodule.cache in the listed directories\n"); + return 1; + } + + for (i = 1; i < argc; i++) + query_dir (argv[i]); + + return 0; +} diff --git a/gio/gio.h b/gio/gio.h new file mode 100644 index 0000000..861f172 --- /dev/null +++ b/gio/gio.h @@ -0,0 +1,101 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_IO_H__ +#define __G_IO_H__ + +#define __GIO_GIO_H_INSIDE__ + +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef __GIO_GIO_H_INSIDE__ + +#endif /* __G_IO_H__ */ diff --git a/gio/gio.rc.in b/gio/gio.rc.in new file mode 100644 index 0000000..2e1d00f --- /dev/null +++ b/gio/gio.rc.in @@ -0,0 +1,30 @@ +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "The GLib developer community" + VALUE "FileDescription", "Gio" + VALUE "FileVersion", "@GLIB_VERSION@.0" + VALUE "InternalName", "libgio-2.0-@LT_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright © 2006-2010 Red Hat, Inc. and others." + VALUE "OriginalFilename", "libgio-2.0-@LT_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "GLib" + VALUE "ProductVersion", "@GLIB_VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END diff --git a/gio/gio.symbols b/gio/gio.symbols new file mode 100644 index 0000000..62a99d7 --- /dev/null +++ b/gio/gio.symbols @@ -0,0 +1,1342 @@ +/* This file lists all exported symbols. It is used to generate + * the gio.def file used to control exports on Windows and the + * gioalias.h/gioaliasdef.c files used to avoid PLT entries for + * internal uses of exported functions (see makegioalias.pl). + * + * Every symbol must be included in the right + * #ifdef IN_HEADER(sym) #endif and + * #ifdef IN_FILE(sym) #endif sections. + */ + +#ifdef ALL_FILES +#define IN_FILE(x) 1 +#define IN_HEADER(x) 1 +#endif + +#if IN_HEADER(__G_VFS_H__) +#if IN_FILE(__G_VFS_C__) +g_vfs_get_type G_GNUC_CONST +g_vfs_is_active +g_vfs_get_file_for_path +g_vfs_get_file_for_uri +g_vfs_get_supported_uri_schemes +g_vfs_parse_name +g_vfs_get_default +g_vfs_get_local +#endif +#endif + +#if IN_HEADER(__G_APP_INFO_H__) +#if IN_FILE(__G_APP_INFO_C__) +g_app_info_get_type G_GNUC_CONST +g_app_launch_context_get_type G_GNUC_CONST +g_app_info_dup +g_app_info_equal +g_app_info_get_id +g_app_info_get_name +g_app_info_get_display_name +g_app_info_get_description +g_app_info_get_executable +g_app_info_get_commandline +g_app_info_get_icon +g_app_info_launch +g_app_info_supports_uris +g_app_info_supports_files +g_app_info_launch_uris +g_app_info_should_show +g_app_info_set_as_default_for_type +g_app_info_set_as_default_for_extension +g_app_info_add_supports_type +g_app_info_can_remove_supports_type +g_app_info_remove_supports_type +g_app_info_launch_default_for_uri +g_app_info_can_delete +g_app_info_delete +g_app_launch_context_new +g_app_launch_context_get_display +g_app_launch_context_get_startup_notify_id +g_app_launch_context_launch_failed +#endif + +#if IN_FILE(__G_DESKTOP_APP_INFO_C__) +g_app_info_create_from_commandline +g_app_info_get_all +g_app_info_get_all_for_type +g_app_info_get_default_for_type +g_app_info_get_default_for_uri_scheme +g_app_info_reset_type_associations +#endif +#endif + + +#if IN_HEADER(__G_DESKTOP_APP_INFO_H__) +#if IN_FILE(__G_DESKTOP_APP_INFO_C__) +#ifdef G_OS_UNIX +g_desktop_app_info_new_from_filename +g_desktop_app_info_new_from_keyfile +g_desktop_app_info_new +g_desktop_app_info_get_filename +g_desktop_app_info_get_type G_GNUC_CONST +g_desktop_app_info_get_is_hidden +g_desktop_app_info_set_desktop_env +g_desktop_app_info_lookup_get_type G_GNUC_CONST +g_desktop_app_info_lookup_get_default_for_uri_scheme +#endif +#endif +#endif + + +#if IN_HEADER(__G_ASYNC_RESULT_H__) +#if IN_FILE(__G_ASYNC_RESULT_C__) +g_async_result_get_type G_GNUC_CONST +g_async_result_get_user_data +g_async_result_get_source_object +#endif +#endif + +#if IN_HEADER(__G_BUFFERED_INPUT_STREAM_H__) +#if IN_FILE(__G_BUFFERED_INPUT_STREAM_C__) +g_buffered_input_stream_get_type G_GNUC_CONST +g_buffered_input_stream_new +g_buffered_input_stream_new_sized +g_buffered_input_stream_get_buffer_size +g_buffered_input_stream_set_buffer_size +g_buffered_input_stream_get_available +g_buffered_input_stream_peek +g_buffered_input_stream_peek_buffer +g_buffered_input_stream_fill +g_buffered_input_stream_fill_async +g_buffered_input_stream_fill_finish +g_buffered_input_stream_read_byte +#endif +#endif + +#if IN_HEADER(__G_BUFFERED_OUTPUT_STREAM_H__) +#if IN_FILE(__G_BUFFERED_OUTPUT_STREAM_C__) +g_buffered_output_stream_get_type G_GNUC_CONST; +g_buffered_output_stream_new +g_buffered_output_stream_new_sized +g_buffered_output_stream_get_buffer_size +g_buffered_output_stream_set_buffer_size +g_buffered_output_stream_get_auto_grow +g_buffered_output_stream_set_auto_grow +#endif +#endif + +#if IN_HEADER(__G_CANCELLABLE_H__) +#if IN_FILE(__G_CANCELLABLE_C__) +g_cancellable_get_type G_GNUC_CONST +g_cancellable_new +g_cancellable_is_cancelled +g_cancellable_set_error_if_cancelled +g_cancellable_get_fd +g_cancellable_make_pollfd +g_cancellable_release_fd +g_cancellable_get_current +g_cancellable_push_current +g_cancellable_pop_current +g_cancellable_reset +g_cancellable_cancel +g_cancellable_connect +g_cancellable_disconnect +#endif +#endif + +#if IN_HEADER(__G_CONTENT_TYPE_H__) +#if IN_FILE(__G_CONTENT_TYPE_C__) +g_content_type_equals +g_content_type_is_a +g_content_type_is_unknown +g_content_type_get_description +g_content_type_get_mime_type +g_content_type_get_icon +g_content_type_can_be_executable +g_content_type_from_mime_type +g_content_type_guess +g_content_type_guess_for_tree +g_content_types_get_registered +#endif +#endif + +#if IN_HEADER(__G_CONVERTER_H__) +#if IN_FILE(__G_CONVERTER_C__) +g_converter_get_type G_GNUC_CONST +g_converter_reset +g_converter_convert +#endif +#endif + +#if IN_HEADER(__G_CONVERTER_INPUT_STREAM_H__) +#if IN_FILE(__G_CONVERTER_INPUT_STREAM_C__) +g_converter_input_stream_get_type +g_converter_input_stream_new +g_converter_input_stream_get_converter +#endif +#endif + +#if IN_HEADER(__G_CONVERTER_OUTPUT_STREAM_H__) +#if IN_FILE(__G_CONVERTER_OUTPUT_STREAM_C__) +g_converter_output_stream_get_type +g_converter_output_stream_new +g_converter_output_stream_get_converter +#endif +#endif + +#if IN_HEADER(__G_CHARSET_CONVERTER_H__) +#if IN_FILE(__G_CHARSET_CONVERTER_C__) +g_charset_converter_get_type +g_charset_converter_new +g_charset_converter_get_num_fallbacks +g_charset_converter_get_use_fallback +g_charset_converter_set_use_fallback +#endif +#endif + +#if IN_HEADER(__G_DATA_INPUT_STREAM_H__) +#if IN_FILE(__G_DATA_INPUT_STREAM_C__) +g_data_input_stream_get_type G_GNUC_CONST +g_data_input_stream_new +g_data_input_stream_set_byte_order +g_data_input_stream_get_byte_order +g_data_input_stream_set_newline_type +g_data_input_stream_get_newline_type +g_data_input_stream_read_byte +g_data_input_stream_read_int16 +g_data_input_stream_read_uint16 +g_data_input_stream_read_int32 +g_data_input_stream_read_uint32 +g_data_input_stream_read_int64 +g_data_input_stream_read_uint64 +g_data_input_stream_read_line +g_data_input_stream_read_line_async +g_data_input_stream_read_line_finish +g_data_input_stream_read_until +g_data_input_stream_read_until_async +g_data_input_stream_read_until_finish +#endif +#endif + +#if IN_HEADER(__G_DATA_OUTPUT_STREAM_H__) +#if IN_FILE(__G_DATA_OUTPUT_STREAM_C__) +g_data_output_stream_get_type G_GNUC_CONST +g_data_output_stream_new +g_data_output_stream_set_byte_order +g_data_output_stream_get_byte_order +g_data_output_stream_put_byte +g_data_output_stream_put_int16 +g_data_output_stream_put_uint16 +g_data_output_stream_put_int32 +g_data_output_stream_put_uint32 +g_data_output_stream_put_int64 +g_data_output_stream_put_uint64 +g_data_output_stream_put_string +#endif +#endif + +#if IN_HEADER(__G_DRIVE_H__) +#if IN_FILE(__G_DRIVE_C__) +g_drive_get_type G_GNUC_CONST +g_drive_get_name +g_drive_get_icon +g_drive_has_volumes +g_drive_get_volumes +g_drive_is_media_removable +g_drive_has_media +g_drive_is_media_check_automatic +g_drive_can_poll_for_media +g_drive_can_eject +g_drive_eject_with_operation +g_drive_eject_with_operation_finish +g_drive_poll_for_media +g_drive_poll_for_media_finish +g_drive_get_identifier +g_drive_enumerate_identifiers +g_drive_get_start_stop_type +g_drive_can_start +g_drive_can_start_degraded +g_drive_start +g_drive_start_finish +g_drive_can_stop +g_drive_stop +g_drive_stop_finish +#ifndef G_DISABLE_DEPRECATED +g_drive_eject +g_drive_eject_finish +#endif +#endif +#endif + +#if IN_HEADER(__G_FILE_ATTRIBUTE_H__) +#if IN_FILE(__G_FILE_ATTRIBUTE_C__) +g_file_attribute_info_list_new +g_file_attribute_info_list_ref +g_file_attribute_info_list_unref +g_file_attribute_info_list_dup +g_file_attribute_info_list_get_type G_GNUC_CONST +g_file_attribute_info_list_lookup +g_file_attribute_info_list_add +#endif +#endif + +#if IN_HEADER(__G_FILE_H__) +#if IN_FILE(__G_FILE_C__) +g_file_get_type G_GNUC_CONST +g_file_new_for_path +g_file_new_for_uri +g_file_new_for_commandline_arg +g_file_parse_name +g_file_dup +g_file_hash +g_file_equal +g_file_get_basename +g_file_get_path +g_file_get_uri +g_file_get_parse_name +g_file_get_parent +g_file_has_parent +g_file_get_child +g_file_get_child_for_display_name +g_file_has_prefix +g_file_get_relative_path +g_file_resolve_relative_path +g_file_is_native +g_file_has_uri_scheme +g_file_get_uri_scheme +g_file_read +g_file_read_async +g_file_read_finish +g_file_append_to +g_file_create +g_file_replace +g_file_append_to_async +g_file_append_to_finish +g_file_create_async +g_file_create_finish +g_file_replace_async +g_file_replace_finish +g_file_query_exists +g_file_query_info +g_file_query_info_async +g_file_query_info_finish +g_file_query_file_type +g_file_query_filesystem_info +g_file_query_filesystem_info_async +g_file_query_filesystem_info_finish +g_file_find_enclosing_mount +g_file_find_enclosing_mount_async +g_file_find_enclosing_mount_finish +g_file_enumerate_children +g_file_enumerate_children_async +g_file_enumerate_children_finish +g_file_set_display_name +g_file_set_display_name_async +g_file_set_display_name_finish +g_file_delete +g_file_trash +g_file_copy +g_file_copy_async +g_file_copy_finish +g_file_move +g_file_make_directory +g_file_make_directory_with_parents +g_file_make_symbolic_link +g_file_query_settable_attributes +g_file_query_writable_namespaces +g_file_set_attribute +g_file_set_attributes_from_info +g_file_set_attributes_async +g_file_set_attributes_finish +g_file_set_attribute_string +g_file_set_attribute_byte_string +g_file_set_attribute_uint32 +g_file_set_attribute_int32 +g_file_set_attribute_uint64 +g_file_set_attribute_int64 +g_file_mount_enclosing_volume +g_file_mount_enclosing_volume_finish +g_file_mount_mountable +g_file_mount_mountable_finish +g_file_unmount_mountable_with_operation +g_file_unmount_mountable_with_operation_finish +g_file_eject_mountable_with_operation +g_file_eject_mountable_with_operation_finish +g_file_copy_attributes +g_file_monitor_directory +g_file_monitor_file +g_file_monitor +g_file_query_default_handler +g_file_load_contents +g_file_load_contents_async +g_file_load_contents_finish +g_file_load_partial_contents_async +g_file_load_partial_contents_finish +g_file_replace_contents +g_file_replace_contents_async +g_file_replace_contents_finish +g_file_create_readwrite +g_file_create_readwrite_async +g_file_create_readwrite_finish +g_file_open_readwrite +g_file_open_readwrite_async +g_file_open_readwrite_finish +g_file_replace_readwrite +g_file_replace_readwrite_async +g_file_replace_readwrite_finish +g_file_start_mountable +g_file_start_mountable_finish +g_file_stop_mountable +g_file_stop_mountable_finish +g_file_supports_thread_contexts +g_file_poll_mountable +g_file_poll_mountable_finish +#ifndef G_DISABLE_DEPRECATED +g_file_unmount_mountable +g_file_unmount_mountable_finish +g_file_eject_mountable +g_file_eject_mountable_finish +#endif +#endif +#endif + +#if IN_HEADER(__G_FILE_ENUMERATOR_H__) +#if IN_FILE(__G_FILE_ENUMERATOR_C__) +g_file_enumerator_get_type G_GNUC_CONST +g_file_enumerator_next_file +g_file_enumerator_close +g_file_enumerator_next_files_async +g_file_enumerator_next_files_finish +g_file_enumerator_close_async +g_file_enumerator_close_finish +g_file_enumerator_is_closed +g_file_enumerator_has_pending +g_file_enumerator_set_pending +g_file_enumerator_get_container +#endif +#endif + +#if IN_HEADER(__G_FILE_ICON_H__) +#if IN_FILE(__G_FILE_ICON_C__) +g_file_icon_get_type G_GNUC_CONST +g_file_icon_new +g_file_icon_get_file +#endif +#endif + +#if IN_HEADER(__G_FILE_INFO_H__) +#if IN_FILE(__G_FILE_INFO_C__) +g_file_info_get_type G_GNUC_CONST +g_file_info_new +g_file_info_dup +g_file_info_copy_into +g_file_info_has_attribute +g_file_info_has_namespace +g_file_info_list_attributes +g_file_info_get_attribute_type +g_file_info_remove_attribute +g_file_info_get_attribute_status +g_file_info_get_attribute_data +g_file_info_get_attribute_as_string +g_file_info_get_attribute_string +g_file_info_get_attribute_byte_string +g_file_info_get_attribute_boolean +g_file_info_get_attribute_uint32 +g_file_info_get_attribute_int32 +g_file_info_get_attribute_uint64 +g_file_info_get_attribute_int64 +g_file_info_get_attribute_object +g_file_info_get_attribute_stringv +g_file_info_set_attribute_status +g_file_info_set_attribute +g_file_info_set_attribute_string +g_file_info_set_attribute_byte_string +g_file_info_set_attribute_boolean +g_file_info_set_attribute_uint32 +g_file_info_set_attribute_int32 +g_file_info_set_attribute_uint64 +g_file_info_set_attribute_int64 +g_file_info_set_attribute_object +g_file_info_set_attribute_stringv +g_file_info_clear_status +g_file_info_get_file_type +g_file_info_get_is_hidden +g_file_info_get_is_backup +g_file_info_get_is_symlink +g_file_info_get_name +g_file_info_get_display_name +g_file_info_get_edit_name +g_file_info_get_icon +g_file_info_get_content_type +g_file_info_get_size +g_file_info_get_modification_time +g_file_info_get_symlink_target +g_file_info_get_etag +g_file_info_get_sort_order +g_file_info_set_attribute_mask +g_file_info_unset_attribute_mask +g_file_info_set_file_type +g_file_info_set_is_hidden +g_file_info_set_is_symlink +g_file_info_set_name +g_file_info_set_display_name +g_file_info_set_edit_name +g_file_info_set_icon +g_file_info_set_content_type +g_file_info_set_size +g_file_info_set_modification_time +g_file_info_set_symlink_target +g_file_info_set_sort_order +g_file_attribute_matcher_new +g_file_attribute_matcher_ref +g_file_attribute_matcher_unref +g_file_attribute_matcher_matches +g_file_attribute_matcher_matches_only +g_file_attribute_matcher_enumerate_namespace +g_file_attribute_matcher_enumerate_next +#endif +#endif + +#if IN_HEADER(__G_FILE_INPUT_STREAM_H__) +#if IN_FILE(__G_FILE_INPUT_STREAM_C__) +g_file_input_stream_get_type G_GNUC_CONST +g_file_input_stream_query_info +g_file_input_stream_query_info_async +g_file_input_stream_query_info_finish +#endif +#endif + +#if IN_HEADER(__G_FILE_MONITOR_H__) +#if IN_FILE(__G_FILE_MONITOR_C__) +g_file_monitor_get_type G_GNUC_CONST +g_file_monitor_cancel +g_file_monitor_is_cancelled +g_file_monitor_set_rate_limit +g_file_monitor_emit_event +#endif +#endif + +#if IN_HEADER(__G_FILENAME_COMPLETER_H__) +#if IN_FILE(__G_FILENAME_COMPLETER_C__) +g_filename_completer_get_type G_GNUC_CONST +g_filename_completer_new +g_filename_completer_get_completion_suffix +g_filename_completer_get_completions +g_filename_completer_set_dirs_only +#endif +#endif + +#if IN_HEADER(__G_FILE_OUTPUT_STREAM_H__) +#if IN_FILE(__G_FILE_OUTPUT_STREAM_C__) +g_file_output_stream_get_type G_GNUC_CONST +g_file_output_stream_query_info +g_file_output_stream_query_info_async +g_file_output_stream_query_info_finish +g_file_output_stream_get_etag +#endif +#endif + +#if IN_HEADER(__G_FILE_IO_STREAM_H__) +#if IN_FILE(__G_FILE_IO_STREAM_C__) +g_file_io_stream_get_type G_GNUC_CONST +g_file_io_stream_query_info +g_file_io_stream_query_info_async +g_file_io_stream_query_info_finish +g_file_io_stream_get_etag +#endif +#endif + +#if IN_HEADER(__G_FILTER_INPUT_STREAM_H__) +#if IN_FILE(__G_FILTER_INPUT_STREAM_C__) +g_filter_input_stream_get_type G_GNUC_CONST +g_filter_input_stream_get_base_stream +g_filter_input_stream_get_close_base_stream +g_filter_input_stream_set_close_base_stream +#endif +#endif + +#if IN_HEADER(__G_FILTER_OUTPUT_STREAM_H__) +#if IN_FILE(__G_FILTER_OUTPUT_STREAM_C__) +g_filter_output_stream_get_type G_GNUC_CONST +g_filter_output_stream_get_base_stream +g_filter_output_stream_get_close_base_stream +g_filter_output_stream_set_close_base_stream +#endif +#endif + +#if IN_HEADER(__G_ICON_H__) +#if IN_FILE(__G_ICON_C__) +g_icon_get_type G_GNUC_CONST +g_icon_hash +g_icon_equal +g_icon_to_string +g_icon_new_for_string +#endif +#endif + +#if IN_HEADER(__G_INPUT_STREAM_H__) +#if IN_FILE(__G_INPUT_STREAM_C__) +g_input_stream_get_type G_GNUC_CONST +g_input_stream_read +g_input_stream_read_all +g_input_stream_skip +g_input_stream_close +g_input_stream_read_async +g_input_stream_read_finish +g_input_stream_skip_async +g_input_stream_skip_finish +g_input_stream_close_async +g_input_stream_close_finish +g_input_stream_is_closed +g_input_stream_has_pending +g_input_stream_set_pending +g_input_stream_clear_pending +#endif +#endif + +#if IN_HEADER(__G_IO_STREAM_H__) +#if IN_FILE(__G_IO_STREAM_C__) +g_io_stream_get_type G_GNUC_CONST +g_io_stream_get_input_stream +g_io_stream_get_output_stream +g_io_stream_close +g_io_stream_close_async +g_io_stream_close_finish +g_io_stream_is_closed +g_io_stream_has_pending +g_io_stream_set_pending +g_io_stream_clear_pending +#endif +#endif + +#if IN_HEADER(__G_IO_ERROR_H__) +#if IN_FILE(__G_IO_ERROR_C__) +g_io_error_quark +g_io_error_from_errno +#endif +#endif + +#if IN_HEADER(__G_IO_MODULE_H__) +#if IN_FILE(__G_IO_MODULE_C__) +g_io_module_get_type G_GNUC_CONST +g_io_module_new +g_io_modules_scan_all_in_directory +g_io_modules_load_all_in_directory +g_io_extension_point_register +g_io_extension_point_lookup +g_io_extension_point_set_required_type +g_io_extension_point_get_required_type +g_io_extension_point_get_extensions +g_io_extension_point_get_extension_by_name +g_io_extension_point_implement +g_io_extension_get_type +g_io_extension_get_name +g_io_extension_get_priority +g_io_extension_ref_class +#endif +#endif + +#if IN_HEADER(__G_IO_SCHEDULER_H__) +#if IN_FILE(__G_IO_SCHEDULER_C__) +g_io_scheduler_push_job +g_io_scheduler_cancel_all_jobs +g_io_scheduler_job_send_to_mainloop +g_io_scheduler_job_send_to_mainloop_async +#endif +#endif + +#if IN_HEADER(__G_LOADABLE_ICON_H__) +#if IN_FILE(__G_LOADABLE_ICON_C__) +g_loadable_icon_get_type G_GNUC_CONST +g_loadable_icon_load +g_loadable_icon_load_async +g_loadable_icon_load_finish +#endif +#endif + +#if IN_HEADER(__G_MEMORY_INPUT_STREAM_H__) +#if IN_FILE(__G_MEMORY_INPUT_STREAM_C__) +g_memory_input_stream_get_type G_GNUC_CONST +g_memory_input_stream_new +g_memory_input_stream_new_from_data +g_memory_input_stream_add_data +#endif +#endif + +#if IN_HEADER(__G_MEMORY_OUTPUT_STREAM_H__) +#if IN_FILE(__G_MEMORY_OUTPUT_STREAM_C__) +g_memory_output_stream_get_type G_GNUC_CONST +g_memory_output_stream_new +g_memory_output_stream_get_data +g_memory_output_stream_get_data_size +g_memory_output_stream_get_size +#endif +#endif + +#if IN_HEADER(__G_MOUNT_OPERATION_H__) +#if IN_FILE(__G_MOUNT_OPERATION_C__) +g_mount_operation_get_type G_GNUC_CONST +g_mount_operation_new +g_mount_operation_get_username +g_mount_operation_set_username +g_mount_operation_get_password +g_mount_operation_set_password +g_mount_operation_get_anonymous +g_mount_operation_set_anonymous +g_mount_operation_get_domain +g_mount_operation_set_domain +g_mount_operation_get_password_save +g_mount_operation_set_password_save +g_mount_operation_get_choice +g_mount_operation_set_choice +g_mount_operation_reply +#endif +#endif + +#if IN_HEADER(__G_OUTPUT_STREAM_H__) +#if IN_FILE(__G_OUTPUT_STREAM_C__) +g_output_stream_get_type G_GNUC_CONST +g_output_stream_write +g_output_stream_write_all +g_output_stream_splice +g_output_stream_flush +g_output_stream_close +g_output_stream_write_async +g_output_stream_write_finish +g_output_stream_splice_async +g_output_stream_splice_finish +g_output_stream_flush_async +g_output_stream_flush_finish +g_output_stream_close_async +g_output_stream_close_finish +g_output_stream_is_closed +g_output_stream_is_closing +g_output_stream_has_pending +g_output_stream_set_pending +g_output_stream_clear_pending +#endif +#endif + +#if IN_HEADER(__G_SEEKABLE_H__) +#if IN_FILE(__G_SEEKABLE_C__) +g_seekable_get_type G_GNUC_CONST +g_seekable_tell +g_seekable_can_seek +g_seekable_seek +g_seekable_can_truncate +g_seekable_truncate +#endif +#endif + +#if IN_HEADER(__G_SIMPLE_ASYNC_RESULT_H__) +#if IN_FILE(__G_SIMPLE_ASYNC_RESULT_C__) +g_simple_async_result_get_type G_GNUC_CONST +g_simple_async_result_new +g_simple_async_result_new_error +g_simple_async_result_new_from_error +g_simple_async_result_set_op_res_gpointer +g_simple_async_result_get_op_res_gpointer +g_simple_async_result_set_op_res_gssize +g_simple_async_result_get_op_res_gssize +g_simple_async_result_set_op_res_gboolean +g_simple_async_result_get_op_res_gboolean +g_simple_async_result_get_source_tag +g_simple_async_result_set_handle_cancellation +g_simple_async_result_complete +g_simple_async_result_complete_in_idle +g_simple_async_result_run_in_thread +g_simple_async_result_set_from_error +g_simple_async_result_propagate_error +g_simple_async_result_set_error +g_simple_async_result_set_error_va +g_simple_async_result_is_valid +g_simple_async_report_error_in_idle +g_simple_async_report_gerror_in_idle +#endif +#endif + +#if IN_HEADER(__G_THEMED_ICON_H__) +#if IN_FILE(__G_THEMED_ICON_C__) +g_themed_icon_get_type G_GNUC_CONST +g_themed_icon_new +g_themed_icon_new_with_default_fallbacks +g_themed_icon_new_from_names +g_themed_icon_get_names +g_themed_icon_prepend_name +g_themed_icon_append_name +#endif +#endif + +#if IN_HEADER(__G_UNIX_MOUNTS_H__) +#if IN_FILE(__G_UNIX_MOUNTS_C__) +#ifdef G_OS_UNIX +g_unix_mount_free +g_unix_mount_point_free +g_unix_mount_compare +g_unix_mount_get_mount_path +g_unix_mount_get_device_path +g_unix_mount_get_fs_type +g_unix_mount_is_readonly +g_unix_mount_is_system_internal +g_unix_mount_guess_can_eject +g_unix_mount_guess_should_display +g_unix_mount_guess_name +g_unix_mount_guess_icon +g_unix_mount_point_compare +g_unix_mount_point_get_mount_path +g_unix_mount_point_get_device_path +g_unix_mount_point_get_fs_type +g_unix_mount_point_is_readonly +g_unix_mount_point_is_user_mountable +g_unix_mount_point_is_loopback +g_unix_mount_point_guess_can_eject +g_unix_mount_point_guess_name +g_unix_mount_point_guess_icon +g_unix_mount_points_get +g_unix_mounts_get +g_unix_mount_at +g_unix_mounts_changed_since +g_unix_mount_points_changed_since +g_unix_mount_monitor_get_type G_GNUC_CONST +g_unix_mount_monitor_new +g_unix_mount_monitor_set_rate_limit +g_unix_is_mount_path_system_internal +#endif /* G_OS_UNIX */ +#endif +#endif + +#if IN_HEADER(__G_UNIX_INPUT_STREAM_H__) +#if IN_FILE(__G_UNIX_INPUT_STREAM_C__) +#ifdef G_OS_UNIX +g_unix_input_stream_get_type G_GNUC_CONST +g_unix_input_stream_new +g_unix_input_stream_set_close_fd +g_unix_input_stream_get_close_fd +g_unix_input_stream_get_fd +#endif /* G_OS_UNIX */ +#endif +#endif + +#if IN_HEADER(__G_UNIX_OUTPUT_STREAM_H__) +#if IN_FILE(__G_UNIX_OUTPUT_STREAM_C__) +#ifdef G_OS_UNIX +g_unix_output_stream_get_type G_GNUC_CONST +g_unix_output_stream_new +g_unix_output_stream_set_close_fd +g_unix_output_stream_get_close_fd +g_unix_output_stream_get_fd +#endif /* G_OS_UNIX */ +#endif +#endif + +#if IN_HEADER(__G_MOUNT_H__) +#if IN_FILE(__G_MOUNT_C__) +g_mount_get_type G_GNUC_CONST +g_mount_get_root +g_mount_get_name +g_mount_get_icon +g_mount_get_uuid +g_mount_get_volume +g_mount_get_drive +g_mount_can_unmount +g_mount_can_eject +g_mount_unmount_with_operation +g_mount_unmount_with_operation_finish +g_mount_eject_with_operation +g_mount_eject_with_operation_finish +g_mount_get_default_location +g_mount_remount +g_mount_remount_finish +g_mount_guess_content_type +g_mount_guess_content_type_finish +g_mount_guess_content_type_sync +g_mount_is_shadowed +g_mount_shadow +g_mount_unshadow +#ifndef G_DISABLE_DEPRECATED +g_mount_unmount +g_mount_unmount_finish +g_mount_eject +g_mount_eject_finish +#endif +#endif +#endif + +#if IN_HEADER(__G_VOLUME_H__) +#if IN_FILE(__G_VOLUME_C__) +g_volume_get_type G_GNUC_CONST +g_volume_get_name +g_volume_get_icon +g_volume_get_uuid +g_volume_get_drive +g_volume_get_mount +g_volume_should_automount +g_volume_can_mount +g_volume_can_eject +g_volume_mount +g_volume_mount_finish +g_volume_eject_with_operation +g_volume_eject_with_operation_finish +g_volume_get_identifier +g_volume_enumerate_identifiers +g_volume_get_activation_root +#ifndef G_DISABLE_DEPRECATED +g_volume_eject +g_volume_eject_finish +#endif +#endif +#endif + +#if IN_HEADER(__G_VOLUME_MONITOR_H__) +#if IN_FILE(__G_VOLUME_MONITOR_C__) +g_volume_monitor_get_type G_GNUC_CONST +g_volume_monitor_get_connected_drives +g_volume_monitor_get_volume_for_uuid +g_volume_monitor_get_volumes +g_volume_monitor_get_mounts +g_volume_monitor_get_mount_for_uuid +#endif +#if IN_FILE(__G_UNION_VOLUME_MONITOR_C__) +g_volume_monitor_get +#ifndef G_DISABLE_DEPRECATED +g_volume_monitor_adopt_orphan_mount +#endif +#endif +#endif + +#if IN_HEADER(__G_NATIVE_VOLUME_MONITOR_H__) +#if IN_FILE(__G_NATIVE_VOLUME_MONITOR_C__) +g_native_volume_monitor_get_type G_GNUC_CONST +#endif +#endif + +#if IN_HEADER(__G_LOCAL_FILE_MONITOR_H__) +#if IN_FILE(__G_LOCAL_FILE_MONITOR_C__) +#ifdef G_OS_UNIX +g_local_file_monitor_get_type G_GNUC_CONST +#endif +#endif +#endif + +#if IN_HEADER(__G_LOCAL_DIRECTORY_MONITOR_H__) +#if IN_FILE(__G_LOCAL_DIRECTORY_MONITOR_C__) +#ifdef G_OS_UNIX +g_local_directory_monitor_get_type G_GNUC_CONST +#endif +#endif +#endif + +#if IN_HEADER(__GIO_ENUM_TYPES_H__) +#if IN_FILE(__GIO_ENUM_TYPES_C__) +g_mount_unmount_flags_get_type G_GNUC_CONST +g_app_info_create_flags_get_type G_GNUC_CONST +g_converter_flags_get_type G_GNUC_CONST +g_converter_result_get_type G_GNUC_CONST +g_data_stream_byte_order_get_type G_GNUC_CONST +g_data_stream_newline_type_get_type G_GNUC_CONST +g_file_attribute_info_flags_get_type G_GNUC_CONST +g_file_attribute_status_get_type G_GNUC_CONST +g_file_attribute_type_get_type G_GNUC_CONST +g_file_copy_flags_get_type G_GNUC_CONST +g_file_create_flags_get_type G_GNUC_CONST +g_file_monitor_event_get_type G_GNUC_CONST +g_file_monitor_flags_get_type G_GNUC_CONST +g_file_query_info_flags_get_type G_GNUC_CONST +g_file_type_get_type G_GNUC_CONST +g_filesystem_preview_type_get_type G_GNUC_CONST +g_io_error_enum_get_type G_GNUC_CONST +g_mount_mount_flags_get_type G_GNUC_CONST +g_mount_operation_result_get_type G_GNUC_CONST +g_drive_start_flags_get_type G_GNUC_CONST +g_drive_start_stop_type_get_type G_GNUC_CONST +g_output_stream_splice_flags_get_type G_GNUC_CONST +g_ask_password_flags_get_type G_GNUC_CONST +g_password_save_get_type G_GNUC_CONST +g_emblem_origin_get_type G_GNUC_CONST +g_socket_family_get_type G_GNUC_CONST +g_socket_type_get_type G_GNUC_CONST +g_socket_protocol_get_type G_GNUC_CONST +g_socket_msg_flags_get_type G_GNUC_CONST +g_resolver_error_get_type G_GNUC_CONST +g_zlib_compressor_format_get_type +#endif +#endif + + +#if IN_HEADER(__G_EMBLEMED_ICON_H__) +#if IN_FILE(__G_EMBLEMED_ICON_C__) +g_emblemed_icon_get_type G_GNUC_CONST +g_emblemed_icon_new +g_emblemed_icon_get_icon +g_emblemed_icon_get_emblems +g_emblemed_icon_add_emblem +#endif +#endif + +#if IN_HEADER(__G_EMBLEM_H__) +#if IN_FILE(__G_EMBLEM_C__) +g_emblem_get_type G_GNUC_CONST +g_emblem_new +g_emblem_new_with_origin +g_emblem_get_icon +g_emblem_get_origin +#endif +#endif + +#if IN_HEADER(__G_INET_ADDRESS_H__) +#if IN_FILE(__G_INET_ADDRESS_C__) +g_inet_address_new_from_string +g_inet_address_new_from_bytes +g_inet_address_new_any +g_inet_address_new_loopback +g_inet_address_get_family +g_inet_address_get_type G_GNUC_CONST +g_inet_address_get_is_any +g_inet_address_get_is_link_local +g_inet_address_get_is_loopback +g_inet_address_get_is_mc_global +g_inet_address_get_is_mc_link_local +g_inet_address_get_is_mc_node_local +g_inet_address_get_is_mc_org_local +g_inet_address_get_is_mc_site_local +g_inet_address_get_is_multicast +g_inet_address_get_is_site_local +g_inet_address_to_bytes +g_inet_address_get_native_size +g_inet_address_to_string +#endif +#endif + +#if IN_HEADER(__G_INET_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_INET_SOCKET_ADDRESS_C__) +g_inet_socket_address_get_address +g_inet_socket_address_get_port +g_inet_socket_address_get_type G_GNUC_CONST +g_inet_socket_address_new +#endif +#endif + +#if IN_HEADER(__G_UNIX_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_UNIX_SOCKET_ADDRESS_C__) +#ifdef G_OS_UNIX +g_unix_socket_address_get_type G_GNUC_CONST +g_unix_socket_address_new +g_unix_socket_address_new_abstract +g_unix_socket_address_abstract_names_supported +g_unix_socket_address_get_is_abstract +g_unix_socket_address_get_path +g_unix_socket_address_get_path_len +#endif +#endif +#endif + +#if IN_HEADER(__G_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_SOCKET_ADDRESS_C__) +g_socket_address_new_from_native +g_socket_address_get_type G_GNUC_CONST +g_socket_address_get_family +g_socket_address_get_native_size +g_socket_address_to_native +#endif +#endif + +#if IN_HEADER(__G_RESOLVER_H__) +#if IN_FILE(__G_RESOLVER_C__) +g_resolver_error_quark +g_resolver_free_addresses +g_resolver_free_targets +g_resolver_get_type G_GNUC_CONST +g_resolver_get_default +g_resolver_set_default +g_resolver_lookup_by_name +g_resolver_lookup_by_name_async +g_resolver_lookup_by_name_finish +g_resolver_lookup_by_address +g_resolver_lookup_by_address_async +g_resolver_lookup_by_address_finish +g_resolver_lookup_service +g_resolver_lookup_service_async +g_resolver_lookup_service_finish +#endif +#endif + +#if IN_HEADER(__G_THREADED_RESOLVER_H__) +#if IN_FILE(__G_THREADED_RESOLVER_C__) +g_threaded_resolver_get_type G_GNUC_CONST +#endif +#endif + +#if IN_HEADER(__G_UNIX_RESOLVER_H__) +#if IN_FILE(__G_UNIX_RESOLVER_C__) +#ifdef G_OS_UNIX +g_unix_resolver_get_type G_GNUC_CONST +#endif +#endif +#endif + +#if IN_HEADER(__G_WIN32_RESOLVER_H__) +#if IN_FILE(__G_WIN32_RESOLVER_C__) +#ifdef G_OS_WIN32 +g_win32_resolver_get_type G_GNUC_CONST +#endif +#endif +#endif + +#if IN_HEADER(__G_SRV_TARGET_H__) +#if IN_FILE(__G_SRV_TARGET_C__) +g_srv_target_get_type G_GNUC_CONST +g_srv_target_new +g_srv_target_copy +g_srv_target_free +g_srv_target_get_hostname +g_srv_target_get_port +g_srv_target_get_priority +g_srv_target_get_weight +g_srv_target_list_sort +#endif +#endif + +#if IN_HEADER(__G_NETWORK_ADDRESS_H__) +#if IN_FILE(__G_NETWORK_ADDRESS_C__) +g_network_address_get_type G_GNUC_CONST +g_network_address_get_hostname +g_network_address_get_port +g_network_address_new +g_network_address_parse +#endif +#endif + +#if IN_HEADER(__G_NETWORK_SERVICE_H__) +#if IN_FILE(__G_NETWORK_SERVICE_C__) +g_network_service_get_type G_GNUC_CONST +g_network_service_get_service +g_network_service_get_protocol +g_network_service_get_domain +g_network_service_new +#endif +#endif + +#if IN_HEADER(__G_SOCKET_CONNECTABLE_H__) +#if IN_FILE(__G_SOCKET_CONNECTABLE_C__) +g_socket_connectable_enumerate +g_socket_connectable_get_type G_GNUC_CONST +#endif +#endif + +#if IN_HEADER(__G_SOCKET_ADDRESS_ENUMERATOR_H__) +#if IN_FILE(__G_SOCKET_ADDRESS_ENUMERATOR_C__) +g_socket_address_enumerator_get_type G_GNUC_CONST +g_socket_address_enumerator_next +g_socket_address_enumerator_next_async +g_socket_address_enumerator_next_finish +#endif +#endif + +#if IN_HEADER(__G_ASYNC_INITABLE_H__) +#if IN_FILE(__G_ASYNC_INITABLE_C__) +g_async_initable_get_type G_GNUC_CONST +g_async_initable_init_async +g_async_initable_init_finish +g_async_initable_new_async +g_async_initable_new_finish +g_async_initable_new_valist_async +g_async_initable_newv_async +#endif +#endif + +#if IN_HEADER(__G_INITABLE_H__) +#if IN_FILE(__G_INITABLE_C__) +g_initable_get_type G_GNUC_CONST +g_initable_init +g_initable_new +g_initable_newv +g_initable_new_valist +#endif +#endif + +#if IN_HEADER(__G_SOCKET_H__) +#if IN_FILE(__G_SOCKET_C__) +g_socket_get_type G_GNUC_CONST +g_socket_accept +g_socket_bind +g_socket_check_connect_result +g_socket_close +g_socket_shutdown +g_socket_condition_check +g_socket_condition_wait +g_socket_connect +g_socket_create_source +g_socket_get_blocking +g_socket_get_family +g_socket_get_fd +g_socket_get_keepalive +g_socket_get_listen_backlog +g_socket_get_local_address +g_socket_get_protocol +g_socket_get_remote_address +g_socket_get_socket_type +g_socket_is_closed +g_socket_is_connected +g_socket_listen +g_socket_new +g_socket_new_from_fd +g_socket_receive +g_socket_receive_from +g_socket_receive_message +g_socket_send +g_socket_send_message +g_socket_send_to +g_socket_set_blocking +g_socket_set_keepalive +g_socket_set_listen_backlog +g_socket_speaks_ipv4 +#endif +#endif + +#if IN_HEADER(__G_SOCKET_CONTROL_MESSAGE_H__) +#if IN_FILE(__G_SOCKET_CONTROL_MESSAGE_C__) +g_socket_control_message_get_type G_GNUC_CONST +g_socket_control_message_deserialize +g_socket_control_message_get_level +g_socket_control_message_get_msg_type +g_socket_control_message_get_size +g_socket_control_message_serialize +#endif +#endif + +#if IN_HEADER(__G_SOCKET_CLIENT_H__) +#if IN_FILE(__G_SOCKET_CLIENT_C__) +g_socket_client_get_type G_GNUC_CONST +g_socket_client_connect +g_socket_client_connect_async +g_socket_client_connect_finish +g_socket_client_connect_to_host +g_socket_client_connect_to_host_async +g_socket_client_connect_to_host_finish +g_socket_client_connect_to_service +g_socket_client_connect_to_service_async +g_socket_client_connect_to_service_finish +g_socket_client_get_family +g_socket_client_get_local_address +g_socket_client_get_protocol +g_socket_client_get_socket_type +g_socket_client_new +g_socket_client_set_family +g_socket_client_set_local_address +g_socket_client_set_protocol +g_socket_client_set_socket_type +#endif +#endif + +#if IN_HEADER(__G_SOCKET_CONNECTION_H__) +#if IN_FILE(__G_SOCKET_CONNECTION_C__) +g_socket_connection_get_type G_GNUC_CONST +g_socket_connection_factory_create_connection +g_socket_connection_factory_lookup_type +g_socket_connection_factory_register_type +g_socket_connection_get_local_address +g_socket_connection_get_remote_address +g_socket_connection_get_socket +#endif +#endif + +#if IN_HEADER(__G_SOCKET_LISTENER_H__) +#if IN_FILE(__G_SOCKET_LISTENER_C__) +g_socket_listener_get_type G_GNUC_CONST +g_socket_listener_accept +g_socket_listener_accept_async +g_socket_listener_accept_finish +g_socket_listener_accept_socket +g_socket_listener_accept_socket_async +g_socket_listener_accept_socket_finish +g_socket_listener_add_address +g_socket_listener_add_inet_port +g_socket_listener_add_any_inet_port +g_socket_listener_add_socket +g_socket_listener_close +g_socket_listener_new +g_socket_listener_set_backlog +#endif +#endif + +#if IN_HEADER(__G_SOCKET_SERVICE_H__) +#if IN_FILE(__G_SOCKET_SERVICE_C__) +g_socket_service_get_type G_GNUC_CONST +g_socket_service_is_active +g_socket_service_new +g_socket_service_start +g_socket_service_stop +#endif +#endif + +#if IN_HEADER(__G_THREADED_SOCKET_SERVICE_H__) +#if IN_FILE(__G_THREADED_SOCKET_SERVICE_C__) +g_threaded_socket_service_get_type G_GNUC_CONST +g_threaded_socket_service_new +#endif +#endif + +#if IN_HEADER(__G_TCP_CONNECTION_H__) +#if IN_FILE(__G_TCP_CONNECTION_C__) +g_tcp_connection_get_type G_GNUC_CONST +g_tcp_connection_set_graceful_disconnect +g_tcp_connection_get_graceful_disconnect +#endif +#endif + +#if IN_HEADER(__G_UNIX_CONNECTION_H__) +#if IN_FILE(__G_UNIX_CONNECTION_C__) +#ifndef G_OS_WIN32 +g_unix_connection_get_type G_GNUC_CONST +g_unix_connection_receive_fd +g_unix_connection_send_fd +#endif +#endif +#endif + +#if IN_HEADER(__G_UNIX_FD_MESSAGE_H__) +#if IN_FILE(__G_UNIX_FD_MESSAGE_C__) +#ifndef G_OS_WIN32 +g_unix_fd_message_get_type G_GNUC_CONST +g_unix_fd_message_append_fd +g_unix_fd_message_new +g_unix_fd_message_steal_fds +g_unix_fd_message_get_fd_list +g_unix_fd_message_new_with_fd_list +#endif +#endif +#endif + +#if IN_HEADER(__G_UNIX_FD_LIST_H__) +#if IN_FILE(__G_UNIX_FD_LIST_C__) +#ifndef G_OS_WIN32 +g_unix_fd_list_append +g_unix_fd_list_get +g_unix_fd_list_get_length +g_unix_fd_list_get_type G_GNUC_CONST +g_unix_fd_list_new +g_unix_fd_list_new_from_array +g_unix_fd_list_peek_fds +g_unix_fd_list_steal_fds +#endif +#endif +#endif + +#if IN_HEADER(__G_ZLIB_COMPRESSOR_H__) +#if IN_FILE(__G_ZLIB_COMPRESSOR_C__) +g_zlib_compressor_get_type G_GNUC_CONST +g_zlib_compressor_new +#endif +#endif + +#if IN_HEADER(__G_ZLIB_DECOMPRESSOR_H__) +#if IN_FILE(__G_ZLIB_DECOMPRESSOR_C__) +g_zlib_decompressor_get_type G_GNUC_CONST +g_zlib_decompressor_new +#endif +#endif + +#if IN_HEADER(__G_FILE_DESCRIPTOR_BASED_H__) +#if IN_FILE(__G_FILE_DESCRIPTOR_BASED_C__) +g_file_descriptor_based_get_type G_GNUC_CONST +g_file_descriptor_based_get_fd +#endif +#endif diff --git a/gio/gioalias.h b/gio/gioalias.h new file mode 100644 index 0000000..989a0fd --- /dev/null +++ b/gio/gioalias.h @@ -0,0 +1,3008 @@ +/* Generated by makegioalias.pl */ + +#ifndef DISABLE_VISIBILITY + +#include "glib.h" + +#ifdef G_HAVE_GNUC_VISIBILITY + +#define IN_FILE(x) 1 +#define IN_HEADER defined + +#if IN_HEADER(__G_VFS_H__) +#if IN_FILE(__G_VFS_C__) +extern __typeof (g_vfs_get_type) IA__g_vfs_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_vfs_get_type IA__g_vfs_get_type + +extern __typeof (g_vfs_is_active) IA__g_vfs_is_active __attribute((visibility("hidden"))); +#define g_vfs_is_active IA__g_vfs_is_active + +extern __typeof (g_vfs_get_file_for_path) IA__g_vfs_get_file_for_path __attribute((visibility("hidden"))); +#define g_vfs_get_file_for_path IA__g_vfs_get_file_for_path + +extern __typeof (g_vfs_get_file_for_uri) IA__g_vfs_get_file_for_uri __attribute((visibility("hidden"))); +#define g_vfs_get_file_for_uri IA__g_vfs_get_file_for_uri + +extern __typeof (g_vfs_get_supported_uri_schemes) IA__g_vfs_get_supported_uri_schemes __attribute((visibility("hidden"))); +#define g_vfs_get_supported_uri_schemes IA__g_vfs_get_supported_uri_schemes + +extern __typeof (g_vfs_parse_name) IA__g_vfs_parse_name __attribute((visibility("hidden"))); +#define g_vfs_parse_name IA__g_vfs_parse_name + +extern __typeof (g_vfs_get_default) IA__g_vfs_get_default __attribute((visibility("hidden"))); +#define g_vfs_get_default IA__g_vfs_get_default + +extern __typeof (g_vfs_get_local) IA__g_vfs_get_local __attribute((visibility("hidden"))); +#define g_vfs_get_local IA__g_vfs_get_local + +#endif +#endif +#if IN_HEADER(__G_APP_INFO_H__) +#if IN_FILE(__G_APP_INFO_C__) +extern __typeof (g_app_info_get_type) IA__g_app_info_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_app_info_get_type IA__g_app_info_get_type + +extern __typeof (g_app_launch_context_get_type) IA__g_app_launch_context_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_app_launch_context_get_type IA__g_app_launch_context_get_type + +extern __typeof (g_app_info_dup) IA__g_app_info_dup __attribute((visibility("hidden"))); +#define g_app_info_dup IA__g_app_info_dup + +extern __typeof (g_app_info_equal) IA__g_app_info_equal __attribute((visibility("hidden"))); +#define g_app_info_equal IA__g_app_info_equal + +extern __typeof (g_app_info_get_id) IA__g_app_info_get_id __attribute((visibility("hidden"))); +#define g_app_info_get_id IA__g_app_info_get_id + +extern __typeof (g_app_info_get_name) IA__g_app_info_get_name __attribute((visibility("hidden"))); +#define g_app_info_get_name IA__g_app_info_get_name + +extern __typeof (g_app_info_get_display_name) IA__g_app_info_get_display_name __attribute((visibility("hidden"))); +#define g_app_info_get_display_name IA__g_app_info_get_display_name + +extern __typeof (g_app_info_get_description) IA__g_app_info_get_description __attribute((visibility("hidden"))); +#define g_app_info_get_description IA__g_app_info_get_description + +extern __typeof (g_app_info_get_executable) IA__g_app_info_get_executable __attribute((visibility("hidden"))); +#define g_app_info_get_executable IA__g_app_info_get_executable + +extern __typeof (g_app_info_get_commandline) IA__g_app_info_get_commandline __attribute((visibility("hidden"))); +#define g_app_info_get_commandline IA__g_app_info_get_commandline + +extern __typeof (g_app_info_get_icon) IA__g_app_info_get_icon __attribute((visibility("hidden"))); +#define g_app_info_get_icon IA__g_app_info_get_icon + +extern __typeof (g_app_info_launch) IA__g_app_info_launch __attribute((visibility("hidden"))); +#define g_app_info_launch IA__g_app_info_launch + +extern __typeof (g_app_info_supports_uris) IA__g_app_info_supports_uris __attribute((visibility("hidden"))); +#define g_app_info_supports_uris IA__g_app_info_supports_uris + +extern __typeof (g_app_info_supports_files) IA__g_app_info_supports_files __attribute((visibility("hidden"))); +#define g_app_info_supports_files IA__g_app_info_supports_files + +extern __typeof (g_app_info_launch_uris) IA__g_app_info_launch_uris __attribute((visibility("hidden"))); +#define g_app_info_launch_uris IA__g_app_info_launch_uris + +extern __typeof (g_app_info_should_show) IA__g_app_info_should_show __attribute((visibility("hidden"))); +#define g_app_info_should_show IA__g_app_info_should_show + +extern __typeof (g_app_info_set_as_default_for_type) IA__g_app_info_set_as_default_for_type __attribute((visibility("hidden"))); +#define g_app_info_set_as_default_for_type IA__g_app_info_set_as_default_for_type + +extern __typeof (g_app_info_set_as_default_for_extension) IA__g_app_info_set_as_default_for_extension __attribute((visibility("hidden"))); +#define g_app_info_set_as_default_for_extension IA__g_app_info_set_as_default_for_extension + +extern __typeof (g_app_info_add_supports_type) IA__g_app_info_add_supports_type __attribute((visibility("hidden"))); +#define g_app_info_add_supports_type IA__g_app_info_add_supports_type + +extern __typeof (g_app_info_can_remove_supports_type) IA__g_app_info_can_remove_supports_type __attribute((visibility("hidden"))); +#define g_app_info_can_remove_supports_type IA__g_app_info_can_remove_supports_type + +extern __typeof (g_app_info_remove_supports_type) IA__g_app_info_remove_supports_type __attribute((visibility("hidden"))); +#define g_app_info_remove_supports_type IA__g_app_info_remove_supports_type + +extern __typeof (g_app_info_launch_default_for_uri) IA__g_app_info_launch_default_for_uri __attribute((visibility("hidden"))); +#define g_app_info_launch_default_for_uri IA__g_app_info_launch_default_for_uri + +extern __typeof (g_app_info_can_delete) IA__g_app_info_can_delete __attribute((visibility("hidden"))); +#define g_app_info_can_delete IA__g_app_info_can_delete + +extern __typeof (g_app_info_delete) IA__g_app_info_delete __attribute((visibility("hidden"))); +#define g_app_info_delete IA__g_app_info_delete + +extern __typeof (g_app_launch_context_new) IA__g_app_launch_context_new __attribute((visibility("hidden"))); +#define g_app_launch_context_new IA__g_app_launch_context_new + +extern __typeof (g_app_launch_context_get_display) IA__g_app_launch_context_get_display __attribute((visibility("hidden"))); +#define g_app_launch_context_get_display IA__g_app_launch_context_get_display + +extern __typeof (g_app_launch_context_get_startup_notify_id) IA__g_app_launch_context_get_startup_notify_id __attribute((visibility("hidden"))); +#define g_app_launch_context_get_startup_notify_id IA__g_app_launch_context_get_startup_notify_id + +extern __typeof (g_app_launch_context_launch_failed) IA__g_app_launch_context_launch_failed __attribute((visibility("hidden"))); +#define g_app_launch_context_launch_failed IA__g_app_launch_context_launch_failed + +#endif +#if IN_FILE(__G_DESKTOP_APP_INFO_C__) +extern __typeof (g_app_info_create_from_commandline) IA__g_app_info_create_from_commandline __attribute((visibility("hidden"))); +#define g_app_info_create_from_commandline IA__g_app_info_create_from_commandline + +extern __typeof (g_app_info_get_all) IA__g_app_info_get_all __attribute((visibility("hidden"))); +#define g_app_info_get_all IA__g_app_info_get_all + +extern __typeof (g_app_info_get_all_for_type) IA__g_app_info_get_all_for_type __attribute((visibility("hidden"))); +#define g_app_info_get_all_for_type IA__g_app_info_get_all_for_type + +extern __typeof (g_app_info_get_default_for_type) IA__g_app_info_get_default_for_type __attribute((visibility("hidden"))); +#define g_app_info_get_default_for_type IA__g_app_info_get_default_for_type + +extern __typeof (g_app_info_get_default_for_uri_scheme) IA__g_app_info_get_default_for_uri_scheme __attribute((visibility("hidden"))); +#define g_app_info_get_default_for_uri_scheme IA__g_app_info_get_default_for_uri_scheme + +extern __typeof (g_app_info_reset_type_associations) IA__g_app_info_reset_type_associations __attribute((visibility("hidden"))); +#define g_app_info_reset_type_associations IA__g_app_info_reset_type_associations + +#endif +#endif +#if IN_HEADER(__G_DESKTOP_APP_INFO_H__) +#if IN_FILE(__G_DESKTOP_APP_INFO_C__) +#ifdef G_OS_UNIX +extern __typeof (g_desktop_app_info_new_from_filename) IA__g_desktop_app_info_new_from_filename __attribute((visibility("hidden"))); +#define g_desktop_app_info_new_from_filename IA__g_desktop_app_info_new_from_filename + +extern __typeof (g_desktop_app_info_new_from_keyfile) IA__g_desktop_app_info_new_from_keyfile __attribute((visibility("hidden"))); +#define g_desktop_app_info_new_from_keyfile IA__g_desktop_app_info_new_from_keyfile + +extern __typeof (g_desktop_app_info_new) IA__g_desktop_app_info_new __attribute((visibility("hidden"))); +#define g_desktop_app_info_new IA__g_desktop_app_info_new + +extern __typeof (g_desktop_app_info_get_filename) IA__g_desktop_app_info_get_filename __attribute((visibility("hidden"))); +#define g_desktop_app_info_get_filename IA__g_desktop_app_info_get_filename + +extern __typeof (g_desktop_app_info_get_type) IA__g_desktop_app_info_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_desktop_app_info_get_type IA__g_desktop_app_info_get_type + +extern __typeof (g_desktop_app_info_get_is_hidden) IA__g_desktop_app_info_get_is_hidden __attribute((visibility("hidden"))); +#define g_desktop_app_info_get_is_hidden IA__g_desktop_app_info_get_is_hidden + +extern __typeof (g_desktop_app_info_set_desktop_env) IA__g_desktop_app_info_set_desktop_env __attribute((visibility("hidden"))); +#define g_desktop_app_info_set_desktop_env IA__g_desktop_app_info_set_desktop_env + +extern __typeof (g_desktop_app_info_lookup_get_type) IA__g_desktop_app_info_lookup_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_desktop_app_info_lookup_get_type IA__g_desktop_app_info_lookup_get_type + +extern __typeof (g_desktop_app_info_lookup_get_default_for_uri_scheme) IA__g_desktop_app_info_lookup_get_default_for_uri_scheme __attribute((visibility("hidden"))); +#define g_desktop_app_info_lookup_get_default_for_uri_scheme IA__g_desktop_app_info_lookup_get_default_for_uri_scheme + +#endif +#endif +#endif +#if IN_HEADER(__G_ASYNC_RESULT_H__) +#if IN_FILE(__G_ASYNC_RESULT_C__) +extern __typeof (g_async_result_get_type) IA__g_async_result_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_async_result_get_type IA__g_async_result_get_type + +extern __typeof (g_async_result_get_user_data) IA__g_async_result_get_user_data __attribute((visibility("hidden"))); +#define g_async_result_get_user_data IA__g_async_result_get_user_data + +extern __typeof (g_async_result_get_source_object) IA__g_async_result_get_source_object __attribute((visibility("hidden"))); +#define g_async_result_get_source_object IA__g_async_result_get_source_object + +#endif +#endif +#if IN_HEADER(__G_BUFFERED_INPUT_STREAM_H__) +#if IN_FILE(__G_BUFFERED_INPUT_STREAM_C__) +extern __typeof (g_buffered_input_stream_get_type) IA__g_buffered_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_buffered_input_stream_get_type IA__g_buffered_input_stream_get_type + +extern __typeof (g_buffered_input_stream_new) IA__g_buffered_input_stream_new __attribute((visibility("hidden"))); +#define g_buffered_input_stream_new IA__g_buffered_input_stream_new + +extern __typeof (g_buffered_input_stream_new_sized) IA__g_buffered_input_stream_new_sized __attribute((visibility("hidden"))); +#define g_buffered_input_stream_new_sized IA__g_buffered_input_stream_new_sized + +extern __typeof (g_buffered_input_stream_get_buffer_size) IA__g_buffered_input_stream_get_buffer_size __attribute((visibility("hidden"))); +#define g_buffered_input_stream_get_buffer_size IA__g_buffered_input_stream_get_buffer_size + +extern __typeof (g_buffered_input_stream_set_buffer_size) IA__g_buffered_input_stream_set_buffer_size __attribute((visibility("hidden"))); +#define g_buffered_input_stream_set_buffer_size IA__g_buffered_input_stream_set_buffer_size + +extern __typeof (g_buffered_input_stream_get_available) IA__g_buffered_input_stream_get_available __attribute((visibility("hidden"))); +#define g_buffered_input_stream_get_available IA__g_buffered_input_stream_get_available + +extern __typeof (g_buffered_input_stream_peek) IA__g_buffered_input_stream_peek __attribute((visibility("hidden"))); +#define g_buffered_input_stream_peek IA__g_buffered_input_stream_peek + +extern __typeof (g_buffered_input_stream_peek_buffer) IA__g_buffered_input_stream_peek_buffer __attribute((visibility("hidden"))); +#define g_buffered_input_stream_peek_buffer IA__g_buffered_input_stream_peek_buffer + +extern __typeof (g_buffered_input_stream_fill) IA__g_buffered_input_stream_fill __attribute((visibility("hidden"))); +#define g_buffered_input_stream_fill IA__g_buffered_input_stream_fill + +extern __typeof (g_buffered_input_stream_fill_async) IA__g_buffered_input_stream_fill_async __attribute((visibility("hidden"))); +#define g_buffered_input_stream_fill_async IA__g_buffered_input_stream_fill_async + +extern __typeof (g_buffered_input_stream_fill_finish) IA__g_buffered_input_stream_fill_finish __attribute((visibility("hidden"))); +#define g_buffered_input_stream_fill_finish IA__g_buffered_input_stream_fill_finish + +extern __typeof (g_buffered_input_stream_read_byte) IA__g_buffered_input_stream_read_byte __attribute((visibility("hidden"))); +#define g_buffered_input_stream_read_byte IA__g_buffered_input_stream_read_byte + +#endif +#endif +#if IN_HEADER(__G_BUFFERED_OUTPUT_STREAM_H__) +#if IN_FILE(__G_BUFFERED_OUTPUT_STREAM_C__) +extern __typeof (g_buffered_output_stream_get_type) IA__g_buffered_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST;; +#define g_buffered_output_stream_get_type IA__g_buffered_output_stream_get_type + +extern __typeof (g_buffered_output_stream_new) IA__g_buffered_output_stream_new __attribute((visibility("hidden"))); +#define g_buffered_output_stream_new IA__g_buffered_output_stream_new + +extern __typeof (g_buffered_output_stream_new_sized) IA__g_buffered_output_stream_new_sized __attribute((visibility("hidden"))); +#define g_buffered_output_stream_new_sized IA__g_buffered_output_stream_new_sized + +extern __typeof (g_buffered_output_stream_get_buffer_size) IA__g_buffered_output_stream_get_buffer_size __attribute((visibility("hidden"))); +#define g_buffered_output_stream_get_buffer_size IA__g_buffered_output_stream_get_buffer_size + +extern __typeof (g_buffered_output_stream_set_buffer_size) IA__g_buffered_output_stream_set_buffer_size __attribute((visibility("hidden"))); +#define g_buffered_output_stream_set_buffer_size IA__g_buffered_output_stream_set_buffer_size + +extern __typeof (g_buffered_output_stream_get_auto_grow) IA__g_buffered_output_stream_get_auto_grow __attribute((visibility("hidden"))); +#define g_buffered_output_stream_get_auto_grow IA__g_buffered_output_stream_get_auto_grow + +extern __typeof (g_buffered_output_stream_set_auto_grow) IA__g_buffered_output_stream_set_auto_grow __attribute((visibility("hidden"))); +#define g_buffered_output_stream_set_auto_grow IA__g_buffered_output_stream_set_auto_grow + +#endif +#endif +#if IN_HEADER(__G_CANCELLABLE_H__) +#if IN_FILE(__G_CANCELLABLE_C__) +extern __typeof (g_cancellable_get_type) IA__g_cancellable_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_cancellable_get_type IA__g_cancellable_get_type + +extern __typeof (g_cancellable_new) IA__g_cancellable_new __attribute((visibility("hidden"))); +#define g_cancellable_new IA__g_cancellable_new + +extern __typeof (g_cancellable_is_cancelled) IA__g_cancellable_is_cancelled __attribute((visibility("hidden"))); +#define g_cancellable_is_cancelled IA__g_cancellable_is_cancelled + +extern __typeof (g_cancellable_set_error_if_cancelled) IA__g_cancellable_set_error_if_cancelled __attribute((visibility("hidden"))); +#define g_cancellable_set_error_if_cancelled IA__g_cancellable_set_error_if_cancelled + +extern __typeof (g_cancellable_get_fd) IA__g_cancellable_get_fd __attribute((visibility("hidden"))); +#define g_cancellable_get_fd IA__g_cancellable_get_fd + +extern __typeof (g_cancellable_make_pollfd) IA__g_cancellable_make_pollfd __attribute((visibility("hidden"))); +#define g_cancellable_make_pollfd IA__g_cancellable_make_pollfd + +extern __typeof (g_cancellable_release_fd) IA__g_cancellable_release_fd __attribute((visibility("hidden"))); +#define g_cancellable_release_fd IA__g_cancellable_release_fd + +extern __typeof (g_cancellable_get_current) IA__g_cancellable_get_current __attribute((visibility("hidden"))); +#define g_cancellable_get_current IA__g_cancellable_get_current + +extern __typeof (g_cancellable_push_current) IA__g_cancellable_push_current __attribute((visibility("hidden"))); +#define g_cancellable_push_current IA__g_cancellable_push_current + +extern __typeof (g_cancellable_pop_current) IA__g_cancellable_pop_current __attribute((visibility("hidden"))); +#define g_cancellable_pop_current IA__g_cancellable_pop_current + +extern __typeof (g_cancellable_reset) IA__g_cancellable_reset __attribute((visibility("hidden"))); +#define g_cancellable_reset IA__g_cancellable_reset + +extern __typeof (g_cancellable_cancel) IA__g_cancellable_cancel __attribute((visibility("hidden"))); +#define g_cancellable_cancel IA__g_cancellable_cancel + +extern __typeof (g_cancellable_connect) IA__g_cancellable_connect __attribute((visibility("hidden"))); +#define g_cancellable_connect IA__g_cancellable_connect + +extern __typeof (g_cancellable_disconnect) IA__g_cancellable_disconnect __attribute((visibility("hidden"))); +#define g_cancellable_disconnect IA__g_cancellable_disconnect + +#endif +#endif +#if IN_HEADER(__G_CONTENT_TYPE_H__) +#if IN_FILE(__G_CONTENT_TYPE_C__) +extern __typeof (g_content_type_equals) IA__g_content_type_equals __attribute((visibility("hidden"))); +#define g_content_type_equals IA__g_content_type_equals + +extern __typeof (g_content_type_is_a) IA__g_content_type_is_a __attribute((visibility("hidden"))); +#define g_content_type_is_a IA__g_content_type_is_a + +extern __typeof (g_content_type_is_unknown) IA__g_content_type_is_unknown __attribute((visibility("hidden"))); +#define g_content_type_is_unknown IA__g_content_type_is_unknown + +extern __typeof (g_content_type_get_description) IA__g_content_type_get_description __attribute((visibility("hidden"))); +#define g_content_type_get_description IA__g_content_type_get_description + +extern __typeof (g_content_type_get_mime_type) IA__g_content_type_get_mime_type __attribute((visibility("hidden"))); +#define g_content_type_get_mime_type IA__g_content_type_get_mime_type + +extern __typeof (g_content_type_get_icon) IA__g_content_type_get_icon __attribute((visibility("hidden"))); +#define g_content_type_get_icon IA__g_content_type_get_icon + +extern __typeof (g_content_type_can_be_executable) IA__g_content_type_can_be_executable __attribute((visibility("hidden"))); +#define g_content_type_can_be_executable IA__g_content_type_can_be_executable + +extern __typeof (g_content_type_from_mime_type) IA__g_content_type_from_mime_type __attribute((visibility("hidden"))); +#define g_content_type_from_mime_type IA__g_content_type_from_mime_type + +extern __typeof (g_content_type_guess) IA__g_content_type_guess __attribute((visibility("hidden"))); +#define g_content_type_guess IA__g_content_type_guess + +extern __typeof (g_content_type_guess_for_tree) IA__g_content_type_guess_for_tree __attribute((visibility("hidden"))); +#define g_content_type_guess_for_tree IA__g_content_type_guess_for_tree + +extern __typeof (g_content_types_get_registered) IA__g_content_types_get_registered __attribute((visibility("hidden"))); +#define g_content_types_get_registered IA__g_content_types_get_registered + +#endif +#endif +#if IN_HEADER(__G_CONVERTER_H__) +#if IN_FILE(__G_CONVERTER_C__) +extern __typeof (g_converter_get_type) IA__g_converter_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_converter_get_type IA__g_converter_get_type + +extern __typeof (g_converter_reset) IA__g_converter_reset __attribute((visibility("hidden"))); +#define g_converter_reset IA__g_converter_reset + +extern __typeof (g_converter_convert) IA__g_converter_convert __attribute((visibility("hidden"))); +#define g_converter_convert IA__g_converter_convert + +#endif +#endif +#if IN_HEADER(__G_CONVERTER_INPUT_STREAM_H__) +#if IN_FILE(__G_CONVERTER_INPUT_STREAM_C__) +extern __typeof (g_converter_input_stream_get_type) IA__g_converter_input_stream_get_type __attribute((visibility("hidden"))); +#define g_converter_input_stream_get_type IA__g_converter_input_stream_get_type + +extern __typeof (g_converter_input_stream_new) IA__g_converter_input_stream_new __attribute((visibility("hidden"))); +#define g_converter_input_stream_new IA__g_converter_input_stream_new + +extern __typeof (g_converter_input_stream_get_converter) IA__g_converter_input_stream_get_converter __attribute((visibility("hidden"))); +#define g_converter_input_stream_get_converter IA__g_converter_input_stream_get_converter + +#endif +#endif +#if IN_HEADER(__G_CONVERTER_OUTPUT_STREAM_H__) +#if IN_FILE(__G_CONVERTER_OUTPUT_STREAM_C__) +extern __typeof (g_converter_output_stream_get_type) IA__g_converter_output_stream_get_type __attribute((visibility("hidden"))); +#define g_converter_output_stream_get_type IA__g_converter_output_stream_get_type + +extern __typeof (g_converter_output_stream_new) IA__g_converter_output_stream_new __attribute((visibility("hidden"))); +#define g_converter_output_stream_new IA__g_converter_output_stream_new + +extern __typeof (g_converter_output_stream_get_converter) IA__g_converter_output_stream_get_converter __attribute((visibility("hidden"))); +#define g_converter_output_stream_get_converter IA__g_converter_output_stream_get_converter + +#endif +#endif +#if IN_HEADER(__G_CHARSET_CONVERTER_H__) +#if IN_FILE(__G_CHARSET_CONVERTER_C__) +extern __typeof (g_charset_converter_get_type) IA__g_charset_converter_get_type __attribute((visibility("hidden"))); +#define g_charset_converter_get_type IA__g_charset_converter_get_type + +extern __typeof (g_charset_converter_new) IA__g_charset_converter_new __attribute((visibility("hidden"))); +#define g_charset_converter_new IA__g_charset_converter_new + +extern __typeof (g_charset_converter_get_num_fallbacks) IA__g_charset_converter_get_num_fallbacks __attribute((visibility("hidden"))); +#define g_charset_converter_get_num_fallbacks IA__g_charset_converter_get_num_fallbacks + +extern __typeof (g_charset_converter_get_use_fallback) IA__g_charset_converter_get_use_fallback __attribute((visibility("hidden"))); +#define g_charset_converter_get_use_fallback IA__g_charset_converter_get_use_fallback + +extern __typeof (g_charset_converter_set_use_fallback) IA__g_charset_converter_set_use_fallback __attribute((visibility("hidden"))); +#define g_charset_converter_set_use_fallback IA__g_charset_converter_set_use_fallback + +#endif +#endif +#if IN_HEADER(__G_DATA_INPUT_STREAM_H__) +#if IN_FILE(__G_DATA_INPUT_STREAM_C__) +extern __typeof (g_data_input_stream_get_type) IA__g_data_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_data_input_stream_get_type IA__g_data_input_stream_get_type + +extern __typeof (g_data_input_stream_new) IA__g_data_input_stream_new __attribute((visibility("hidden"))); +#define g_data_input_stream_new IA__g_data_input_stream_new + +extern __typeof (g_data_input_stream_set_byte_order) IA__g_data_input_stream_set_byte_order __attribute((visibility("hidden"))); +#define g_data_input_stream_set_byte_order IA__g_data_input_stream_set_byte_order + +extern __typeof (g_data_input_stream_get_byte_order) IA__g_data_input_stream_get_byte_order __attribute((visibility("hidden"))); +#define g_data_input_stream_get_byte_order IA__g_data_input_stream_get_byte_order + +extern __typeof (g_data_input_stream_set_newline_type) IA__g_data_input_stream_set_newline_type __attribute((visibility("hidden"))); +#define g_data_input_stream_set_newline_type IA__g_data_input_stream_set_newline_type + +extern __typeof (g_data_input_stream_get_newline_type) IA__g_data_input_stream_get_newline_type __attribute((visibility("hidden"))); +#define g_data_input_stream_get_newline_type IA__g_data_input_stream_get_newline_type + +extern __typeof (g_data_input_stream_read_byte) IA__g_data_input_stream_read_byte __attribute((visibility("hidden"))); +#define g_data_input_stream_read_byte IA__g_data_input_stream_read_byte + +extern __typeof (g_data_input_stream_read_int16) IA__g_data_input_stream_read_int16 __attribute((visibility("hidden"))); +#define g_data_input_stream_read_int16 IA__g_data_input_stream_read_int16 + +extern __typeof (g_data_input_stream_read_uint16) IA__g_data_input_stream_read_uint16 __attribute((visibility("hidden"))); +#define g_data_input_stream_read_uint16 IA__g_data_input_stream_read_uint16 + +extern __typeof (g_data_input_stream_read_int32) IA__g_data_input_stream_read_int32 __attribute((visibility("hidden"))); +#define g_data_input_stream_read_int32 IA__g_data_input_stream_read_int32 + +extern __typeof (g_data_input_stream_read_uint32) IA__g_data_input_stream_read_uint32 __attribute((visibility("hidden"))); +#define g_data_input_stream_read_uint32 IA__g_data_input_stream_read_uint32 + +extern __typeof (g_data_input_stream_read_int64) IA__g_data_input_stream_read_int64 __attribute((visibility("hidden"))); +#define g_data_input_stream_read_int64 IA__g_data_input_stream_read_int64 + +extern __typeof (g_data_input_stream_read_uint64) IA__g_data_input_stream_read_uint64 __attribute((visibility("hidden"))); +#define g_data_input_stream_read_uint64 IA__g_data_input_stream_read_uint64 + +extern __typeof (g_data_input_stream_read_line) IA__g_data_input_stream_read_line __attribute((visibility("hidden"))); +#define g_data_input_stream_read_line IA__g_data_input_stream_read_line + +extern __typeof (g_data_input_stream_read_line_async) IA__g_data_input_stream_read_line_async __attribute((visibility("hidden"))); +#define g_data_input_stream_read_line_async IA__g_data_input_stream_read_line_async + +extern __typeof (g_data_input_stream_read_line_finish) IA__g_data_input_stream_read_line_finish __attribute((visibility("hidden"))); +#define g_data_input_stream_read_line_finish IA__g_data_input_stream_read_line_finish + +extern __typeof (g_data_input_stream_read_until) IA__g_data_input_stream_read_until __attribute((visibility("hidden"))); +#define g_data_input_stream_read_until IA__g_data_input_stream_read_until + +extern __typeof (g_data_input_stream_read_until_async) IA__g_data_input_stream_read_until_async __attribute((visibility("hidden"))); +#define g_data_input_stream_read_until_async IA__g_data_input_stream_read_until_async + +extern __typeof (g_data_input_stream_read_until_finish) IA__g_data_input_stream_read_until_finish __attribute((visibility("hidden"))); +#define g_data_input_stream_read_until_finish IA__g_data_input_stream_read_until_finish + +#endif +#endif +#if IN_HEADER(__G_DATA_OUTPUT_STREAM_H__) +#if IN_FILE(__G_DATA_OUTPUT_STREAM_C__) +extern __typeof (g_data_output_stream_get_type) IA__g_data_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_data_output_stream_get_type IA__g_data_output_stream_get_type + +extern __typeof (g_data_output_stream_new) IA__g_data_output_stream_new __attribute((visibility("hidden"))); +#define g_data_output_stream_new IA__g_data_output_stream_new + +extern __typeof (g_data_output_stream_set_byte_order) IA__g_data_output_stream_set_byte_order __attribute((visibility("hidden"))); +#define g_data_output_stream_set_byte_order IA__g_data_output_stream_set_byte_order + +extern __typeof (g_data_output_stream_get_byte_order) IA__g_data_output_stream_get_byte_order __attribute((visibility("hidden"))); +#define g_data_output_stream_get_byte_order IA__g_data_output_stream_get_byte_order + +extern __typeof (g_data_output_stream_put_byte) IA__g_data_output_stream_put_byte __attribute((visibility("hidden"))); +#define g_data_output_stream_put_byte IA__g_data_output_stream_put_byte + +extern __typeof (g_data_output_stream_put_int16) IA__g_data_output_stream_put_int16 __attribute((visibility("hidden"))); +#define g_data_output_stream_put_int16 IA__g_data_output_stream_put_int16 + +extern __typeof (g_data_output_stream_put_uint16) IA__g_data_output_stream_put_uint16 __attribute((visibility("hidden"))); +#define g_data_output_stream_put_uint16 IA__g_data_output_stream_put_uint16 + +extern __typeof (g_data_output_stream_put_int32) IA__g_data_output_stream_put_int32 __attribute((visibility("hidden"))); +#define g_data_output_stream_put_int32 IA__g_data_output_stream_put_int32 + +extern __typeof (g_data_output_stream_put_uint32) IA__g_data_output_stream_put_uint32 __attribute((visibility("hidden"))); +#define g_data_output_stream_put_uint32 IA__g_data_output_stream_put_uint32 + +extern __typeof (g_data_output_stream_put_int64) IA__g_data_output_stream_put_int64 __attribute((visibility("hidden"))); +#define g_data_output_stream_put_int64 IA__g_data_output_stream_put_int64 + +extern __typeof (g_data_output_stream_put_uint64) IA__g_data_output_stream_put_uint64 __attribute((visibility("hidden"))); +#define g_data_output_stream_put_uint64 IA__g_data_output_stream_put_uint64 + +extern __typeof (g_data_output_stream_put_string) IA__g_data_output_stream_put_string __attribute((visibility("hidden"))); +#define g_data_output_stream_put_string IA__g_data_output_stream_put_string + +#endif +#endif +#if IN_HEADER(__G_DRIVE_H__) +#if IN_FILE(__G_DRIVE_C__) +extern __typeof (g_drive_get_type) IA__g_drive_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_drive_get_type IA__g_drive_get_type + +extern __typeof (g_drive_get_name) IA__g_drive_get_name __attribute((visibility("hidden"))); +#define g_drive_get_name IA__g_drive_get_name + +extern __typeof (g_drive_get_icon) IA__g_drive_get_icon __attribute((visibility("hidden"))); +#define g_drive_get_icon IA__g_drive_get_icon + +extern __typeof (g_drive_has_volumes) IA__g_drive_has_volumes __attribute((visibility("hidden"))); +#define g_drive_has_volumes IA__g_drive_has_volumes + +extern __typeof (g_drive_get_volumes) IA__g_drive_get_volumes __attribute((visibility("hidden"))); +#define g_drive_get_volumes IA__g_drive_get_volumes + +extern __typeof (g_drive_is_media_removable) IA__g_drive_is_media_removable __attribute((visibility("hidden"))); +#define g_drive_is_media_removable IA__g_drive_is_media_removable + +extern __typeof (g_drive_has_media) IA__g_drive_has_media __attribute((visibility("hidden"))); +#define g_drive_has_media IA__g_drive_has_media + +extern __typeof (g_drive_is_media_check_automatic) IA__g_drive_is_media_check_automatic __attribute((visibility("hidden"))); +#define g_drive_is_media_check_automatic IA__g_drive_is_media_check_automatic + +extern __typeof (g_drive_can_poll_for_media) IA__g_drive_can_poll_for_media __attribute((visibility("hidden"))); +#define g_drive_can_poll_for_media IA__g_drive_can_poll_for_media + +extern __typeof (g_drive_can_eject) IA__g_drive_can_eject __attribute((visibility("hidden"))); +#define g_drive_can_eject IA__g_drive_can_eject + +extern __typeof (g_drive_eject_with_operation) IA__g_drive_eject_with_operation __attribute((visibility("hidden"))); +#define g_drive_eject_with_operation IA__g_drive_eject_with_operation + +extern __typeof (g_drive_eject_with_operation_finish) IA__g_drive_eject_with_operation_finish __attribute((visibility("hidden"))); +#define g_drive_eject_with_operation_finish IA__g_drive_eject_with_operation_finish + +extern __typeof (g_drive_poll_for_media) IA__g_drive_poll_for_media __attribute((visibility("hidden"))); +#define g_drive_poll_for_media IA__g_drive_poll_for_media + +extern __typeof (g_drive_poll_for_media_finish) IA__g_drive_poll_for_media_finish __attribute((visibility("hidden"))); +#define g_drive_poll_for_media_finish IA__g_drive_poll_for_media_finish + +extern __typeof (g_drive_get_identifier) IA__g_drive_get_identifier __attribute((visibility("hidden"))); +#define g_drive_get_identifier IA__g_drive_get_identifier + +extern __typeof (g_drive_enumerate_identifiers) IA__g_drive_enumerate_identifiers __attribute((visibility("hidden"))); +#define g_drive_enumerate_identifiers IA__g_drive_enumerate_identifiers + +extern __typeof (g_drive_get_start_stop_type) IA__g_drive_get_start_stop_type __attribute((visibility("hidden"))); +#define g_drive_get_start_stop_type IA__g_drive_get_start_stop_type + +extern __typeof (g_drive_can_start) IA__g_drive_can_start __attribute((visibility("hidden"))); +#define g_drive_can_start IA__g_drive_can_start + +extern __typeof (g_drive_can_start_degraded) IA__g_drive_can_start_degraded __attribute((visibility("hidden"))); +#define g_drive_can_start_degraded IA__g_drive_can_start_degraded + +extern __typeof (g_drive_start) IA__g_drive_start __attribute((visibility("hidden"))); +#define g_drive_start IA__g_drive_start + +extern __typeof (g_drive_start_finish) IA__g_drive_start_finish __attribute((visibility("hidden"))); +#define g_drive_start_finish IA__g_drive_start_finish + +extern __typeof (g_drive_can_stop) IA__g_drive_can_stop __attribute((visibility("hidden"))); +#define g_drive_can_stop IA__g_drive_can_stop + +extern __typeof (g_drive_stop) IA__g_drive_stop __attribute((visibility("hidden"))); +#define g_drive_stop IA__g_drive_stop + +extern __typeof (g_drive_stop_finish) IA__g_drive_stop_finish __attribute((visibility("hidden"))); +#define g_drive_stop_finish IA__g_drive_stop_finish + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_drive_eject) IA__g_drive_eject __attribute((visibility("hidden"))); +#define g_drive_eject IA__g_drive_eject + +extern __typeof (g_drive_eject_finish) IA__g_drive_eject_finish __attribute((visibility("hidden"))); +#define g_drive_eject_finish IA__g_drive_eject_finish + +#endif +#endif +#endif +#if IN_HEADER(__G_FILE_ATTRIBUTE_H__) +#if IN_FILE(__G_FILE_ATTRIBUTE_C__) +extern __typeof (g_file_attribute_info_list_new) IA__g_file_attribute_info_list_new __attribute((visibility("hidden"))); +#define g_file_attribute_info_list_new IA__g_file_attribute_info_list_new + +extern __typeof (g_file_attribute_info_list_ref) IA__g_file_attribute_info_list_ref __attribute((visibility("hidden"))); +#define g_file_attribute_info_list_ref IA__g_file_attribute_info_list_ref + +extern __typeof (g_file_attribute_info_list_unref) IA__g_file_attribute_info_list_unref __attribute((visibility("hidden"))); +#define g_file_attribute_info_list_unref IA__g_file_attribute_info_list_unref + +extern __typeof (g_file_attribute_info_list_dup) IA__g_file_attribute_info_list_dup __attribute((visibility("hidden"))); +#define g_file_attribute_info_list_dup IA__g_file_attribute_info_list_dup + +extern __typeof (g_file_attribute_info_list_get_type) IA__g_file_attribute_info_list_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_attribute_info_list_get_type IA__g_file_attribute_info_list_get_type + +extern __typeof (g_file_attribute_info_list_lookup) IA__g_file_attribute_info_list_lookup __attribute((visibility("hidden"))); +#define g_file_attribute_info_list_lookup IA__g_file_attribute_info_list_lookup + +extern __typeof (g_file_attribute_info_list_add) IA__g_file_attribute_info_list_add __attribute((visibility("hidden"))); +#define g_file_attribute_info_list_add IA__g_file_attribute_info_list_add + +#endif +#endif +#if IN_HEADER(__G_FILE_H__) +#if IN_FILE(__G_FILE_C__) +extern __typeof (g_file_get_type) IA__g_file_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_get_type IA__g_file_get_type + +extern __typeof (g_file_new_for_path) IA__g_file_new_for_path __attribute((visibility("hidden"))); +#define g_file_new_for_path IA__g_file_new_for_path + +extern __typeof (g_file_new_for_uri) IA__g_file_new_for_uri __attribute((visibility("hidden"))); +#define g_file_new_for_uri IA__g_file_new_for_uri + +extern __typeof (g_file_new_for_commandline_arg) IA__g_file_new_for_commandline_arg __attribute((visibility("hidden"))); +#define g_file_new_for_commandline_arg IA__g_file_new_for_commandline_arg + +extern __typeof (g_file_parse_name) IA__g_file_parse_name __attribute((visibility("hidden"))); +#define g_file_parse_name IA__g_file_parse_name + +extern __typeof (g_file_dup) IA__g_file_dup __attribute((visibility("hidden"))); +#define g_file_dup IA__g_file_dup + +extern __typeof (g_file_hash) IA__g_file_hash __attribute((visibility("hidden"))); +#define g_file_hash IA__g_file_hash + +extern __typeof (g_file_equal) IA__g_file_equal __attribute((visibility("hidden"))); +#define g_file_equal IA__g_file_equal + +extern __typeof (g_file_get_basename) IA__g_file_get_basename __attribute((visibility("hidden"))); +#define g_file_get_basename IA__g_file_get_basename + +extern __typeof (g_file_get_path) IA__g_file_get_path __attribute((visibility("hidden"))); +#define g_file_get_path IA__g_file_get_path + +extern __typeof (g_file_get_uri) IA__g_file_get_uri __attribute((visibility("hidden"))); +#define g_file_get_uri IA__g_file_get_uri + +extern __typeof (g_file_get_parse_name) IA__g_file_get_parse_name __attribute((visibility("hidden"))); +#define g_file_get_parse_name IA__g_file_get_parse_name + +extern __typeof (g_file_get_parent) IA__g_file_get_parent __attribute((visibility("hidden"))); +#define g_file_get_parent IA__g_file_get_parent + +extern __typeof (g_file_has_parent) IA__g_file_has_parent __attribute((visibility("hidden"))); +#define g_file_has_parent IA__g_file_has_parent + +extern __typeof (g_file_get_child) IA__g_file_get_child __attribute((visibility("hidden"))); +#define g_file_get_child IA__g_file_get_child + +extern __typeof (g_file_get_child_for_display_name) IA__g_file_get_child_for_display_name __attribute((visibility("hidden"))); +#define g_file_get_child_for_display_name IA__g_file_get_child_for_display_name + +extern __typeof (g_file_has_prefix) IA__g_file_has_prefix __attribute((visibility("hidden"))); +#define g_file_has_prefix IA__g_file_has_prefix + +extern __typeof (g_file_get_relative_path) IA__g_file_get_relative_path __attribute((visibility("hidden"))); +#define g_file_get_relative_path IA__g_file_get_relative_path + +extern __typeof (g_file_resolve_relative_path) IA__g_file_resolve_relative_path __attribute((visibility("hidden"))); +#define g_file_resolve_relative_path IA__g_file_resolve_relative_path + +extern __typeof (g_file_is_native) IA__g_file_is_native __attribute((visibility("hidden"))); +#define g_file_is_native IA__g_file_is_native + +extern __typeof (g_file_has_uri_scheme) IA__g_file_has_uri_scheme __attribute((visibility("hidden"))); +#define g_file_has_uri_scheme IA__g_file_has_uri_scheme + +extern __typeof (g_file_get_uri_scheme) IA__g_file_get_uri_scheme __attribute((visibility("hidden"))); +#define g_file_get_uri_scheme IA__g_file_get_uri_scheme + +extern __typeof (g_file_read) IA__g_file_read __attribute((visibility("hidden"))); +#define g_file_read IA__g_file_read + +extern __typeof (g_file_read_async) IA__g_file_read_async __attribute((visibility("hidden"))); +#define g_file_read_async IA__g_file_read_async + +extern __typeof (g_file_read_finish) IA__g_file_read_finish __attribute((visibility("hidden"))); +#define g_file_read_finish IA__g_file_read_finish + +extern __typeof (g_file_append_to) IA__g_file_append_to __attribute((visibility("hidden"))); +#define g_file_append_to IA__g_file_append_to + +extern __typeof (g_file_create) IA__g_file_create __attribute((visibility("hidden"))); +#define g_file_create IA__g_file_create + +extern __typeof (g_file_replace) IA__g_file_replace __attribute((visibility("hidden"))); +#define g_file_replace IA__g_file_replace + +extern __typeof (g_file_append_to_async) IA__g_file_append_to_async __attribute((visibility("hidden"))); +#define g_file_append_to_async IA__g_file_append_to_async + +extern __typeof (g_file_append_to_finish) IA__g_file_append_to_finish __attribute((visibility("hidden"))); +#define g_file_append_to_finish IA__g_file_append_to_finish + +extern __typeof (g_file_create_async) IA__g_file_create_async __attribute((visibility("hidden"))); +#define g_file_create_async IA__g_file_create_async + +extern __typeof (g_file_create_finish) IA__g_file_create_finish __attribute((visibility("hidden"))); +#define g_file_create_finish IA__g_file_create_finish + +extern __typeof (g_file_replace_async) IA__g_file_replace_async __attribute((visibility("hidden"))); +#define g_file_replace_async IA__g_file_replace_async + +extern __typeof (g_file_replace_finish) IA__g_file_replace_finish __attribute((visibility("hidden"))); +#define g_file_replace_finish IA__g_file_replace_finish + +extern __typeof (g_file_query_exists) IA__g_file_query_exists __attribute((visibility("hidden"))); +#define g_file_query_exists IA__g_file_query_exists + +extern __typeof (g_file_query_info) IA__g_file_query_info __attribute((visibility("hidden"))); +#define g_file_query_info IA__g_file_query_info + +extern __typeof (g_file_query_info_async) IA__g_file_query_info_async __attribute((visibility("hidden"))); +#define g_file_query_info_async IA__g_file_query_info_async + +extern __typeof (g_file_query_info_finish) IA__g_file_query_info_finish __attribute((visibility("hidden"))); +#define g_file_query_info_finish IA__g_file_query_info_finish + +extern __typeof (g_file_query_file_type) IA__g_file_query_file_type __attribute((visibility("hidden"))); +#define g_file_query_file_type IA__g_file_query_file_type + +extern __typeof (g_file_query_filesystem_info) IA__g_file_query_filesystem_info __attribute((visibility("hidden"))); +#define g_file_query_filesystem_info IA__g_file_query_filesystem_info + +extern __typeof (g_file_query_filesystem_info_async) IA__g_file_query_filesystem_info_async __attribute((visibility("hidden"))); +#define g_file_query_filesystem_info_async IA__g_file_query_filesystem_info_async + +extern __typeof (g_file_query_filesystem_info_finish) IA__g_file_query_filesystem_info_finish __attribute((visibility("hidden"))); +#define g_file_query_filesystem_info_finish IA__g_file_query_filesystem_info_finish + +extern __typeof (g_file_find_enclosing_mount) IA__g_file_find_enclosing_mount __attribute((visibility("hidden"))); +#define g_file_find_enclosing_mount IA__g_file_find_enclosing_mount + +extern __typeof (g_file_find_enclosing_mount_async) IA__g_file_find_enclosing_mount_async __attribute((visibility("hidden"))); +#define g_file_find_enclosing_mount_async IA__g_file_find_enclosing_mount_async + +extern __typeof (g_file_find_enclosing_mount_finish) IA__g_file_find_enclosing_mount_finish __attribute((visibility("hidden"))); +#define g_file_find_enclosing_mount_finish IA__g_file_find_enclosing_mount_finish + +extern __typeof (g_file_enumerate_children) IA__g_file_enumerate_children __attribute((visibility("hidden"))); +#define g_file_enumerate_children IA__g_file_enumerate_children + +extern __typeof (g_file_enumerate_children_async) IA__g_file_enumerate_children_async __attribute((visibility("hidden"))); +#define g_file_enumerate_children_async IA__g_file_enumerate_children_async + +extern __typeof (g_file_enumerate_children_finish) IA__g_file_enumerate_children_finish __attribute((visibility("hidden"))); +#define g_file_enumerate_children_finish IA__g_file_enumerate_children_finish + +extern __typeof (g_file_set_display_name) IA__g_file_set_display_name __attribute((visibility("hidden"))); +#define g_file_set_display_name IA__g_file_set_display_name + +extern __typeof (g_file_set_display_name_async) IA__g_file_set_display_name_async __attribute((visibility("hidden"))); +#define g_file_set_display_name_async IA__g_file_set_display_name_async + +extern __typeof (g_file_set_display_name_finish) IA__g_file_set_display_name_finish __attribute((visibility("hidden"))); +#define g_file_set_display_name_finish IA__g_file_set_display_name_finish + +extern __typeof (g_file_delete) IA__g_file_delete __attribute((visibility("hidden"))); +#define g_file_delete IA__g_file_delete + +extern __typeof (g_file_trash) IA__g_file_trash __attribute((visibility("hidden"))); +#define g_file_trash IA__g_file_trash + +extern __typeof (g_file_copy) IA__g_file_copy __attribute((visibility("hidden"))); +#define g_file_copy IA__g_file_copy + +extern __typeof (g_file_copy_async) IA__g_file_copy_async __attribute((visibility("hidden"))); +#define g_file_copy_async IA__g_file_copy_async + +extern __typeof (g_file_copy_finish) IA__g_file_copy_finish __attribute((visibility("hidden"))); +#define g_file_copy_finish IA__g_file_copy_finish + +extern __typeof (g_file_move) IA__g_file_move __attribute((visibility("hidden"))); +#define g_file_move IA__g_file_move + +extern __typeof (g_file_make_directory) IA__g_file_make_directory __attribute((visibility("hidden"))); +#define g_file_make_directory IA__g_file_make_directory + +extern __typeof (g_file_make_directory_with_parents) IA__g_file_make_directory_with_parents __attribute((visibility("hidden"))); +#define g_file_make_directory_with_parents IA__g_file_make_directory_with_parents + +extern __typeof (g_file_make_symbolic_link) IA__g_file_make_symbolic_link __attribute((visibility("hidden"))); +#define g_file_make_symbolic_link IA__g_file_make_symbolic_link + +extern __typeof (g_file_query_settable_attributes) IA__g_file_query_settable_attributes __attribute((visibility("hidden"))); +#define g_file_query_settable_attributes IA__g_file_query_settable_attributes + +extern __typeof (g_file_query_writable_namespaces) IA__g_file_query_writable_namespaces __attribute((visibility("hidden"))); +#define g_file_query_writable_namespaces IA__g_file_query_writable_namespaces + +extern __typeof (g_file_set_attribute) IA__g_file_set_attribute __attribute((visibility("hidden"))); +#define g_file_set_attribute IA__g_file_set_attribute + +extern __typeof (g_file_set_attributes_from_info) IA__g_file_set_attributes_from_info __attribute((visibility("hidden"))); +#define g_file_set_attributes_from_info IA__g_file_set_attributes_from_info + +extern __typeof (g_file_set_attributes_async) IA__g_file_set_attributes_async __attribute((visibility("hidden"))); +#define g_file_set_attributes_async IA__g_file_set_attributes_async + +extern __typeof (g_file_set_attributes_finish) IA__g_file_set_attributes_finish __attribute((visibility("hidden"))); +#define g_file_set_attributes_finish IA__g_file_set_attributes_finish + +extern __typeof (g_file_set_attribute_string) IA__g_file_set_attribute_string __attribute((visibility("hidden"))); +#define g_file_set_attribute_string IA__g_file_set_attribute_string + +extern __typeof (g_file_set_attribute_byte_string) IA__g_file_set_attribute_byte_string __attribute((visibility("hidden"))); +#define g_file_set_attribute_byte_string IA__g_file_set_attribute_byte_string + +extern __typeof (g_file_set_attribute_uint32) IA__g_file_set_attribute_uint32 __attribute((visibility("hidden"))); +#define g_file_set_attribute_uint32 IA__g_file_set_attribute_uint32 + +extern __typeof (g_file_set_attribute_int32) IA__g_file_set_attribute_int32 __attribute((visibility("hidden"))); +#define g_file_set_attribute_int32 IA__g_file_set_attribute_int32 + +extern __typeof (g_file_set_attribute_uint64) IA__g_file_set_attribute_uint64 __attribute((visibility("hidden"))); +#define g_file_set_attribute_uint64 IA__g_file_set_attribute_uint64 + +extern __typeof (g_file_set_attribute_int64) IA__g_file_set_attribute_int64 __attribute((visibility("hidden"))); +#define g_file_set_attribute_int64 IA__g_file_set_attribute_int64 + +extern __typeof (g_file_mount_enclosing_volume) IA__g_file_mount_enclosing_volume __attribute((visibility("hidden"))); +#define g_file_mount_enclosing_volume IA__g_file_mount_enclosing_volume + +extern __typeof (g_file_mount_enclosing_volume_finish) IA__g_file_mount_enclosing_volume_finish __attribute((visibility("hidden"))); +#define g_file_mount_enclosing_volume_finish IA__g_file_mount_enclosing_volume_finish + +extern __typeof (g_file_mount_mountable) IA__g_file_mount_mountable __attribute((visibility("hidden"))); +#define g_file_mount_mountable IA__g_file_mount_mountable + +extern __typeof (g_file_mount_mountable_finish) IA__g_file_mount_mountable_finish __attribute((visibility("hidden"))); +#define g_file_mount_mountable_finish IA__g_file_mount_mountable_finish + +extern __typeof (g_file_unmount_mountable_with_operation) IA__g_file_unmount_mountable_with_operation __attribute((visibility("hidden"))); +#define g_file_unmount_mountable_with_operation IA__g_file_unmount_mountable_with_operation + +extern __typeof (g_file_unmount_mountable_with_operation_finish) IA__g_file_unmount_mountable_with_operation_finish __attribute((visibility("hidden"))); +#define g_file_unmount_mountable_with_operation_finish IA__g_file_unmount_mountable_with_operation_finish + +extern __typeof (g_file_eject_mountable_with_operation) IA__g_file_eject_mountable_with_operation __attribute((visibility("hidden"))); +#define g_file_eject_mountable_with_operation IA__g_file_eject_mountable_with_operation + +extern __typeof (g_file_eject_mountable_with_operation_finish) IA__g_file_eject_mountable_with_operation_finish __attribute((visibility("hidden"))); +#define g_file_eject_mountable_with_operation_finish IA__g_file_eject_mountable_with_operation_finish + +extern __typeof (g_file_copy_attributes) IA__g_file_copy_attributes __attribute((visibility("hidden"))); +#define g_file_copy_attributes IA__g_file_copy_attributes + +extern __typeof (g_file_monitor_directory) IA__g_file_monitor_directory __attribute((visibility("hidden"))); +#define g_file_monitor_directory IA__g_file_monitor_directory + +extern __typeof (g_file_monitor_file) IA__g_file_monitor_file __attribute((visibility("hidden"))); +#define g_file_monitor_file IA__g_file_monitor_file + +extern __typeof (g_file_monitor) IA__g_file_monitor __attribute((visibility("hidden"))); +#define g_file_monitor IA__g_file_monitor + +extern __typeof (g_file_query_default_handler) IA__g_file_query_default_handler __attribute((visibility("hidden"))); +#define g_file_query_default_handler IA__g_file_query_default_handler + +extern __typeof (g_file_load_contents) IA__g_file_load_contents __attribute((visibility("hidden"))); +#define g_file_load_contents IA__g_file_load_contents + +extern __typeof (g_file_load_contents_async) IA__g_file_load_contents_async __attribute((visibility("hidden"))); +#define g_file_load_contents_async IA__g_file_load_contents_async + +extern __typeof (g_file_load_contents_finish) IA__g_file_load_contents_finish __attribute((visibility("hidden"))); +#define g_file_load_contents_finish IA__g_file_load_contents_finish + +extern __typeof (g_file_load_partial_contents_async) IA__g_file_load_partial_contents_async __attribute((visibility("hidden"))); +#define g_file_load_partial_contents_async IA__g_file_load_partial_contents_async + +extern __typeof (g_file_load_partial_contents_finish) IA__g_file_load_partial_contents_finish __attribute((visibility("hidden"))); +#define g_file_load_partial_contents_finish IA__g_file_load_partial_contents_finish + +extern __typeof (g_file_replace_contents) IA__g_file_replace_contents __attribute((visibility("hidden"))); +#define g_file_replace_contents IA__g_file_replace_contents + +extern __typeof (g_file_replace_contents_async) IA__g_file_replace_contents_async __attribute((visibility("hidden"))); +#define g_file_replace_contents_async IA__g_file_replace_contents_async + +extern __typeof (g_file_replace_contents_finish) IA__g_file_replace_contents_finish __attribute((visibility("hidden"))); +#define g_file_replace_contents_finish IA__g_file_replace_contents_finish + +extern __typeof (g_file_create_readwrite) IA__g_file_create_readwrite __attribute((visibility("hidden"))); +#define g_file_create_readwrite IA__g_file_create_readwrite + +extern __typeof (g_file_create_readwrite_async) IA__g_file_create_readwrite_async __attribute((visibility("hidden"))); +#define g_file_create_readwrite_async IA__g_file_create_readwrite_async + +extern __typeof (g_file_create_readwrite_finish) IA__g_file_create_readwrite_finish __attribute((visibility("hidden"))); +#define g_file_create_readwrite_finish IA__g_file_create_readwrite_finish + +extern __typeof (g_file_open_readwrite) IA__g_file_open_readwrite __attribute((visibility("hidden"))); +#define g_file_open_readwrite IA__g_file_open_readwrite + +extern __typeof (g_file_open_readwrite_async) IA__g_file_open_readwrite_async __attribute((visibility("hidden"))); +#define g_file_open_readwrite_async IA__g_file_open_readwrite_async + +extern __typeof (g_file_open_readwrite_finish) IA__g_file_open_readwrite_finish __attribute((visibility("hidden"))); +#define g_file_open_readwrite_finish IA__g_file_open_readwrite_finish + +extern __typeof (g_file_replace_readwrite) IA__g_file_replace_readwrite __attribute((visibility("hidden"))); +#define g_file_replace_readwrite IA__g_file_replace_readwrite + +extern __typeof (g_file_replace_readwrite_async) IA__g_file_replace_readwrite_async __attribute((visibility("hidden"))); +#define g_file_replace_readwrite_async IA__g_file_replace_readwrite_async + +extern __typeof (g_file_replace_readwrite_finish) IA__g_file_replace_readwrite_finish __attribute((visibility("hidden"))); +#define g_file_replace_readwrite_finish IA__g_file_replace_readwrite_finish + +extern __typeof (g_file_start_mountable) IA__g_file_start_mountable __attribute((visibility("hidden"))); +#define g_file_start_mountable IA__g_file_start_mountable + +extern __typeof (g_file_start_mountable_finish) IA__g_file_start_mountable_finish __attribute((visibility("hidden"))); +#define g_file_start_mountable_finish IA__g_file_start_mountable_finish + +extern __typeof (g_file_stop_mountable) IA__g_file_stop_mountable __attribute((visibility("hidden"))); +#define g_file_stop_mountable IA__g_file_stop_mountable + +extern __typeof (g_file_stop_mountable_finish) IA__g_file_stop_mountable_finish __attribute((visibility("hidden"))); +#define g_file_stop_mountable_finish IA__g_file_stop_mountable_finish + +extern __typeof (g_file_supports_thread_contexts) IA__g_file_supports_thread_contexts __attribute((visibility("hidden"))); +#define g_file_supports_thread_contexts IA__g_file_supports_thread_contexts + +extern __typeof (g_file_poll_mountable) IA__g_file_poll_mountable __attribute((visibility("hidden"))); +#define g_file_poll_mountable IA__g_file_poll_mountable + +extern __typeof (g_file_poll_mountable_finish) IA__g_file_poll_mountable_finish __attribute((visibility("hidden"))); +#define g_file_poll_mountable_finish IA__g_file_poll_mountable_finish + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_file_unmount_mountable) IA__g_file_unmount_mountable __attribute((visibility("hidden"))); +#define g_file_unmount_mountable IA__g_file_unmount_mountable + +extern __typeof (g_file_unmount_mountable_finish) IA__g_file_unmount_mountable_finish __attribute((visibility("hidden"))); +#define g_file_unmount_mountable_finish IA__g_file_unmount_mountable_finish + +extern __typeof (g_file_eject_mountable) IA__g_file_eject_mountable __attribute((visibility("hidden"))); +#define g_file_eject_mountable IA__g_file_eject_mountable + +extern __typeof (g_file_eject_mountable_finish) IA__g_file_eject_mountable_finish __attribute((visibility("hidden"))); +#define g_file_eject_mountable_finish IA__g_file_eject_mountable_finish + +#endif +#endif +#endif +#if IN_HEADER(__G_FILE_ENUMERATOR_H__) +#if IN_FILE(__G_FILE_ENUMERATOR_C__) +extern __typeof (g_file_enumerator_get_type) IA__g_file_enumerator_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_enumerator_get_type IA__g_file_enumerator_get_type + +extern __typeof (g_file_enumerator_next_file) IA__g_file_enumerator_next_file __attribute((visibility("hidden"))); +#define g_file_enumerator_next_file IA__g_file_enumerator_next_file + +extern __typeof (g_file_enumerator_close) IA__g_file_enumerator_close __attribute((visibility("hidden"))); +#define g_file_enumerator_close IA__g_file_enumerator_close + +extern __typeof (g_file_enumerator_next_files_async) IA__g_file_enumerator_next_files_async __attribute((visibility("hidden"))); +#define g_file_enumerator_next_files_async IA__g_file_enumerator_next_files_async + +extern __typeof (g_file_enumerator_next_files_finish) IA__g_file_enumerator_next_files_finish __attribute((visibility("hidden"))); +#define g_file_enumerator_next_files_finish IA__g_file_enumerator_next_files_finish + +extern __typeof (g_file_enumerator_close_async) IA__g_file_enumerator_close_async __attribute((visibility("hidden"))); +#define g_file_enumerator_close_async IA__g_file_enumerator_close_async + +extern __typeof (g_file_enumerator_close_finish) IA__g_file_enumerator_close_finish __attribute((visibility("hidden"))); +#define g_file_enumerator_close_finish IA__g_file_enumerator_close_finish + +extern __typeof (g_file_enumerator_is_closed) IA__g_file_enumerator_is_closed __attribute((visibility("hidden"))); +#define g_file_enumerator_is_closed IA__g_file_enumerator_is_closed + +extern __typeof (g_file_enumerator_has_pending) IA__g_file_enumerator_has_pending __attribute((visibility("hidden"))); +#define g_file_enumerator_has_pending IA__g_file_enumerator_has_pending + +extern __typeof (g_file_enumerator_set_pending) IA__g_file_enumerator_set_pending __attribute((visibility("hidden"))); +#define g_file_enumerator_set_pending IA__g_file_enumerator_set_pending + +extern __typeof (g_file_enumerator_get_container) IA__g_file_enumerator_get_container __attribute((visibility("hidden"))); +#define g_file_enumerator_get_container IA__g_file_enumerator_get_container + +#endif +#endif +#if IN_HEADER(__G_FILE_ICON_H__) +#if IN_FILE(__G_FILE_ICON_C__) +extern __typeof (g_file_icon_get_type) IA__g_file_icon_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_icon_get_type IA__g_file_icon_get_type + +extern __typeof (g_file_icon_new) IA__g_file_icon_new __attribute((visibility("hidden"))); +#define g_file_icon_new IA__g_file_icon_new + +extern __typeof (g_file_icon_get_file) IA__g_file_icon_get_file __attribute((visibility("hidden"))); +#define g_file_icon_get_file IA__g_file_icon_get_file + +#endif +#endif +#if IN_HEADER(__G_FILE_INFO_H__) +#if IN_FILE(__G_FILE_INFO_C__) +extern __typeof (g_file_info_get_type) IA__g_file_info_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_info_get_type IA__g_file_info_get_type + +extern __typeof (g_file_info_new) IA__g_file_info_new __attribute((visibility("hidden"))); +#define g_file_info_new IA__g_file_info_new + +extern __typeof (g_file_info_dup) IA__g_file_info_dup __attribute((visibility("hidden"))); +#define g_file_info_dup IA__g_file_info_dup + +extern __typeof (g_file_info_copy_into) IA__g_file_info_copy_into __attribute((visibility("hidden"))); +#define g_file_info_copy_into IA__g_file_info_copy_into + +extern __typeof (g_file_info_has_attribute) IA__g_file_info_has_attribute __attribute((visibility("hidden"))); +#define g_file_info_has_attribute IA__g_file_info_has_attribute + +extern __typeof (g_file_info_has_namespace) IA__g_file_info_has_namespace __attribute((visibility("hidden"))); +#define g_file_info_has_namespace IA__g_file_info_has_namespace + +extern __typeof (g_file_info_list_attributes) IA__g_file_info_list_attributes __attribute((visibility("hidden"))); +#define g_file_info_list_attributes IA__g_file_info_list_attributes + +extern __typeof (g_file_info_get_attribute_type) IA__g_file_info_get_attribute_type __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_type IA__g_file_info_get_attribute_type + +extern __typeof (g_file_info_remove_attribute) IA__g_file_info_remove_attribute __attribute((visibility("hidden"))); +#define g_file_info_remove_attribute IA__g_file_info_remove_attribute + +extern __typeof (g_file_info_get_attribute_status) IA__g_file_info_get_attribute_status __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_status IA__g_file_info_get_attribute_status + +extern __typeof (g_file_info_get_attribute_data) IA__g_file_info_get_attribute_data __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_data IA__g_file_info_get_attribute_data + +extern __typeof (g_file_info_get_attribute_as_string) IA__g_file_info_get_attribute_as_string __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_as_string IA__g_file_info_get_attribute_as_string + +extern __typeof (g_file_info_get_attribute_string) IA__g_file_info_get_attribute_string __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_string IA__g_file_info_get_attribute_string + +extern __typeof (g_file_info_get_attribute_byte_string) IA__g_file_info_get_attribute_byte_string __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_byte_string IA__g_file_info_get_attribute_byte_string + +extern __typeof (g_file_info_get_attribute_boolean) IA__g_file_info_get_attribute_boolean __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_boolean IA__g_file_info_get_attribute_boolean + +extern __typeof (g_file_info_get_attribute_uint32) IA__g_file_info_get_attribute_uint32 __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_uint32 IA__g_file_info_get_attribute_uint32 + +extern __typeof (g_file_info_get_attribute_int32) IA__g_file_info_get_attribute_int32 __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_int32 IA__g_file_info_get_attribute_int32 + +extern __typeof (g_file_info_get_attribute_uint64) IA__g_file_info_get_attribute_uint64 __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_uint64 IA__g_file_info_get_attribute_uint64 + +extern __typeof (g_file_info_get_attribute_int64) IA__g_file_info_get_attribute_int64 __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_int64 IA__g_file_info_get_attribute_int64 + +extern __typeof (g_file_info_get_attribute_object) IA__g_file_info_get_attribute_object __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_object IA__g_file_info_get_attribute_object + +extern __typeof (g_file_info_get_attribute_stringv) IA__g_file_info_get_attribute_stringv __attribute((visibility("hidden"))); +#define g_file_info_get_attribute_stringv IA__g_file_info_get_attribute_stringv + +extern __typeof (g_file_info_set_attribute_status) IA__g_file_info_set_attribute_status __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_status IA__g_file_info_set_attribute_status + +extern __typeof (g_file_info_set_attribute) IA__g_file_info_set_attribute __attribute((visibility("hidden"))); +#define g_file_info_set_attribute IA__g_file_info_set_attribute + +extern __typeof (g_file_info_set_attribute_string) IA__g_file_info_set_attribute_string __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_string IA__g_file_info_set_attribute_string + +extern __typeof (g_file_info_set_attribute_byte_string) IA__g_file_info_set_attribute_byte_string __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_byte_string IA__g_file_info_set_attribute_byte_string + +extern __typeof (g_file_info_set_attribute_boolean) IA__g_file_info_set_attribute_boolean __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_boolean IA__g_file_info_set_attribute_boolean + +extern __typeof (g_file_info_set_attribute_uint32) IA__g_file_info_set_attribute_uint32 __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_uint32 IA__g_file_info_set_attribute_uint32 + +extern __typeof (g_file_info_set_attribute_int32) IA__g_file_info_set_attribute_int32 __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_int32 IA__g_file_info_set_attribute_int32 + +extern __typeof (g_file_info_set_attribute_uint64) IA__g_file_info_set_attribute_uint64 __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_uint64 IA__g_file_info_set_attribute_uint64 + +extern __typeof (g_file_info_set_attribute_int64) IA__g_file_info_set_attribute_int64 __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_int64 IA__g_file_info_set_attribute_int64 + +extern __typeof (g_file_info_set_attribute_object) IA__g_file_info_set_attribute_object __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_object IA__g_file_info_set_attribute_object + +extern __typeof (g_file_info_set_attribute_stringv) IA__g_file_info_set_attribute_stringv __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_stringv IA__g_file_info_set_attribute_stringv + +extern __typeof (g_file_info_clear_status) IA__g_file_info_clear_status __attribute((visibility("hidden"))); +#define g_file_info_clear_status IA__g_file_info_clear_status + +extern __typeof (g_file_info_get_file_type) IA__g_file_info_get_file_type __attribute((visibility("hidden"))); +#define g_file_info_get_file_type IA__g_file_info_get_file_type + +extern __typeof (g_file_info_get_is_hidden) IA__g_file_info_get_is_hidden __attribute((visibility("hidden"))); +#define g_file_info_get_is_hidden IA__g_file_info_get_is_hidden + +extern __typeof (g_file_info_get_is_backup) IA__g_file_info_get_is_backup __attribute((visibility("hidden"))); +#define g_file_info_get_is_backup IA__g_file_info_get_is_backup + +extern __typeof (g_file_info_get_is_symlink) IA__g_file_info_get_is_symlink __attribute((visibility("hidden"))); +#define g_file_info_get_is_symlink IA__g_file_info_get_is_symlink + +extern __typeof (g_file_info_get_name) IA__g_file_info_get_name __attribute((visibility("hidden"))); +#define g_file_info_get_name IA__g_file_info_get_name + +extern __typeof (g_file_info_get_display_name) IA__g_file_info_get_display_name __attribute((visibility("hidden"))); +#define g_file_info_get_display_name IA__g_file_info_get_display_name + +extern __typeof (g_file_info_get_edit_name) IA__g_file_info_get_edit_name __attribute((visibility("hidden"))); +#define g_file_info_get_edit_name IA__g_file_info_get_edit_name + +extern __typeof (g_file_info_get_icon) IA__g_file_info_get_icon __attribute((visibility("hidden"))); +#define g_file_info_get_icon IA__g_file_info_get_icon + +extern __typeof (g_file_info_get_content_type) IA__g_file_info_get_content_type __attribute((visibility("hidden"))); +#define g_file_info_get_content_type IA__g_file_info_get_content_type + +extern __typeof (g_file_info_get_size) IA__g_file_info_get_size __attribute((visibility("hidden"))); +#define g_file_info_get_size IA__g_file_info_get_size + +extern __typeof (g_file_info_get_modification_time) IA__g_file_info_get_modification_time __attribute((visibility("hidden"))); +#define g_file_info_get_modification_time IA__g_file_info_get_modification_time + +extern __typeof (g_file_info_get_symlink_target) IA__g_file_info_get_symlink_target __attribute((visibility("hidden"))); +#define g_file_info_get_symlink_target IA__g_file_info_get_symlink_target + +extern __typeof (g_file_info_get_etag) IA__g_file_info_get_etag __attribute((visibility("hidden"))); +#define g_file_info_get_etag IA__g_file_info_get_etag + +extern __typeof (g_file_info_get_sort_order) IA__g_file_info_get_sort_order __attribute((visibility("hidden"))); +#define g_file_info_get_sort_order IA__g_file_info_get_sort_order + +extern __typeof (g_file_info_set_attribute_mask) IA__g_file_info_set_attribute_mask __attribute((visibility("hidden"))); +#define g_file_info_set_attribute_mask IA__g_file_info_set_attribute_mask + +extern __typeof (g_file_info_unset_attribute_mask) IA__g_file_info_unset_attribute_mask __attribute((visibility("hidden"))); +#define g_file_info_unset_attribute_mask IA__g_file_info_unset_attribute_mask + +extern __typeof (g_file_info_set_file_type) IA__g_file_info_set_file_type __attribute((visibility("hidden"))); +#define g_file_info_set_file_type IA__g_file_info_set_file_type + +extern __typeof (g_file_info_set_is_hidden) IA__g_file_info_set_is_hidden __attribute((visibility("hidden"))); +#define g_file_info_set_is_hidden IA__g_file_info_set_is_hidden + +extern __typeof (g_file_info_set_is_symlink) IA__g_file_info_set_is_symlink __attribute((visibility("hidden"))); +#define g_file_info_set_is_symlink IA__g_file_info_set_is_symlink + +extern __typeof (g_file_info_set_name) IA__g_file_info_set_name __attribute((visibility("hidden"))); +#define g_file_info_set_name IA__g_file_info_set_name + +extern __typeof (g_file_info_set_display_name) IA__g_file_info_set_display_name __attribute((visibility("hidden"))); +#define g_file_info_set_display_name IA__g_file_info_set_display_name + +extern __typeof (g_file_info_set_edit_name) IA__g_file_info_set_edit_name __attribute((visibility("hidden"))); +#define g_file_info_set_edit_name IA__g_file_info_set_edit_name + +extern __typeof (g_file_info_set_icon) IA__g_file_info_set_icon __attribute((visibility("hidden"))); +#define g_file_info_set_icon IA__g_file_info_set_icon + +extern __typeof (g_file_info_set_content_type) IA__g_file_info_set_content_type __attribute((visibility("hidden"))); +#define g_file_info_set_content_type IA__g_file_info_set_content_type + +extern __typeof (g_file_info_set_size) IA__g_file_info_set_size __attribute((visibility("hidden"))); +#define g_file_info_set_size IA__g_file_info_set_size + +extern __typeof (g_file_info_set_modification_time) IA__g_file_info_set_modification_time __attribute((visibility("hidden"))); +#define g_file_info_set_modification_time IA__g_file_info_set_modification_time + +extern __typeof (g_file_info_set_symlink_target) IA__g_file_info_set_symlink_target __attribute((visibility("hidden"))); +#define g_file_info_set_symlink_target IA__g_file_info_set_symlink_target + +extern __typeof (g_file_info_set_sort_order) IA__g_file_info_set_sort_order __attribute((visibility("hidden"))); +#define g_file_info_set_sort_order IA__g_file_info_set_sort_order + +extern __typeof (g_file_attribute_matcher_new) IA__g_file_attribute_matcher_new __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_new IA__g_file_attribute_matcher_new + +extern __typeof (g_file_attribute_matcher_ref) IA__g_file_attribute_matcher_ref __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_ref IA__g_file_attribute_matcher_ref + +extern __typeof (g_file_attribute_matcher_unref) IA__g_file_attribute_matcher_unref __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_unref IA__g_file_attribute_matcher_unref + +extern __typeof (g_file_attribute_matcher_matches) IA__g_file_attribute_matcher_matches __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_matches IA__g_file_attribute_matcher_matches + +extern __typeof (g_file_attribute_matcher_matches_only) IA__g_file_attribute_matcher_matches_only __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_matches_only IA__g_file_attribute_matcher_matches_only + +extern __typeof (g_file_attribute_matcher_enumerate_namespace) IA__g_file_attribute_matcher_enumerate_namespace __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_enumerate_namespace IA__g_file_attribute_matcher_enumerate_namespace + +extern __typeof (g_file_attribute_matcher_enumerate_next) IA__g_file_attribute_matcher_enumerate_next __attribute((visibility("hidden"))); +#define g_file_attribute_matcher_enumerate_next IA__g_file_attribute_matcher_enumerate_next + +#endif +#endif +#if IN_HEADER(__G_FILE_INPUT_STREAM_H__) +#if IN_FILE(__G_FILE_INPUT_STREAM_C__) +extern __typeof (g_file_input_stream_get_type) IA__g_file_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_input_stream_get_type IA__g_file_input_stream_get_type + +extern __typeof (g_file_input_stream_query_info) IA__g_file_input_stream_query_info __attribute((visibility("hidden"))); +#define g_file_input_stream_query_info IA__g_file_input_stream_query_info + +extern __typeof (g_file_input_stream_query_info_async) IA__g_file_input_stream_query_info_async __attribute((visibility("hidden"))); +#define g_file_input_stream_query_info_async IA__g_file_input_stream_query_info_async + +extern __typeof (g_file_input_stream_query_info_finish) IA__g_file_input_stream_query_info_finish __attribute((visibility("hidden"))); +#define g_file_input_stream_query_info_finish IA__g_file_input_stream_query_info_finish + +#endif +#endif +#if IN_HEADER(__G_FILE_MONITOR_H__) +#if IN_FILE(__G_FILE_MONITOR_C__) +extern __typeof (g_file_monitor_get_type) IA__g_file_monitor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_monitor_get_type IA__g_file_monitor_get_type + +extern __typeof (g_file_monitor_cancel) IA__g_file_monitor_cancel __attribute((visibility("hidden"))); +#define g_file_monitor_cancel IA__g_file_monitor_cancel + +extern __typeof (g_file_monitor_is_cancelled) IA__g_file_monitor_is_cancelled __attribute((visibility("hidden"))); +#define g_file_monitor_is_cancelled IA__g_file_monitor_is_cancelled + +extern __typeof (g_file_monitor_set_rate_limit) IA__g_file_monitor_set_rate_limit __attribute((visibility("hidden"))); +#define g_file_monitor_set_rate_limit IA__g_file_monitor_set_rate_limit + +extern __typeof (g_file_monitor_emit_event) IA__g_file_monitor_emit_event __attribute((visibility("hidden"))); +#define g_file_monitor_emit_event IA__g_file_monitor_emit_event + +#endif +#endif +#if IN_HEADER(__G_FILENAME_COMPLETER_H__) +#if IN_FILE(__G_FILENAME_COMPLETER_C__) +extern __typeof (g_filename_completer_get_type) IA__g_filename_completer_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_filename_completer_get_type IA__g_filename_completer_get_type + +extern __typeof (g_filename_completer_new) IA__g_filename_completer_new __attribute((visibility("hidden"))); +#define g_filename_completer_new IA__g_filename_completer_new + +extern __typeof (g_filename_completer_get_completion_suffix) IA__g_filename_completer_get_completion_suffix __attribute((visibility("hidden"))); +#define g_filename_completer_get_completion_suffix IA__g_filename_completer_get_completion_suffix + +extern __typeof (g_filename_completer_get_completions) IA__g_filename_completer_get_completions __attribute((visibility("hidden"))); +#define g_filename_completer_get_completions IA__g_filename_completer_get_completions + +extern __typeof (g_filename_completer_set_dirs_only) IA__g_filename_completer_set_dirs_only __attribute((visibility("hidden"))); +#define g_filename_completer_set_dirs_only IA__g_filename_completer_set_dirs_only + +#endif +#endif +#if IN_HEADER(__G_FILE_OUTPUT_STREAM_H__) +#if IN_FILE(__G_FILE_OUTPUT_STREAM_C__) +extern __typeof (g_file_output_stream_get_type) IA__g_file_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_output_stream_get_type IA__g_file_output_stream_get_type + +extern __typeof (g_file_output_stream_query_info) IA__g_file_output_stream_query_info __attribute((visibility("hidden"))); +#define g_file_output_stream_query_info IA__g_file_output_stream_query_info + +extern __typeof (g_file_output_stream_query_info_async) IA__g_file_output_stream_query_info_async __attribute((visibility("hidden"))); +#define g_file_output_stream_query_info_async IA__g_file_output_stream_query_info_async + +extern __typeof (g_file_output_stream_query_info_finish) IA__g_file_output_stream_query_info_finish __attribute((visibility("hidden"))); +#define g_file_output_stream_query_info_finish IA__g_file_output_stream_query_info_finish + +extern __typeof (g_file_output_stream_get_etag) IA__g_file_output_stream_get_etag __attribute((visibility("hidden"))); +#define g_file_output_stream_get_etag IA__g_file_output_stream_get_etag + +#endif +#endif +#if IN_HEADER(__G_FILE_IO_STREAM_H__) +#if IN_FILE(__G_FILE_IO_STREAM_C__) +extern __typeof (g_file_io_stream_get_type) IA__g_file_io_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_io_stream_get_type IA__g_file_io_stream_get_type + +extern __typeof (g_file_io_stream_query_info) IA__g_file_io_stream_query_info __attribute((visibility("hidden"))); +#define g_file_io_stream_query_info IA__g_file_io_stream_query_info + +extern __typeof (g_file_io_stream_query_info_async) IA__g_file_io_stream_query_info_async __attribute((visibility("hidden"))); +#define g_file_io_stream_query_info_async IA__g_file_io_stream_query_info_async + +extern __typeof (g_file_io_stream_query_info_finish) IA__g_file_io_stream_query_info_finish __attribute((visibility("hidden"))); +#define g_file_io_stream_query_info_finish IA__g_file_io_stream_query_info_finish + +extern __typeof (g_file_io_stream_get_etag) IA__g_file_io_stream_get_etag __attribute((visibility("hidden"))); +#define g_file_io_stream_get_etag IA__g_file_io_stream_get_etag + +#endif +#endif +#if IN_HEADER(__G_FILTER_INPUT_STREAM_H__) +#if IN_FILE(__G_FILTER_INPUT_STREAM_C__) +extern __typeof (g_filter_input_stream_get_type) IA__g_filter_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_filter_input_stream_get_type IA__g_filter_input_stream_get_type + +extern __typeof (g_filter_input_stream_get_base_stream) IA__g_filter_input_stream_get_base_stream __attribute((visibility("hidden"))); +#define g_filter_input_stream_get_base_stream IA__g_filter_input_stream_get_base_stream + +extern __typeof (g_filter_input_stream_get_close_base_stream) IA__g_filter_input_stream_get_close_base_stream __attribute((visibility("hidden"))); +#define g_filter_input_stream_get_close_base_stream IA__g_filter_input_stream_get_close_base_stream + +extern __typeof (g_filter_input_stream_set_close_base_stream) IA__g_filter_input_stream_set_close_base_stream __attribute((visibility("hidden"))); +#define g_filter_input_stream_set_close_base_stream IA__g_filter_input_stream_set_close_base_stream + +#endif +#endif +#if IN_HEADER(__G_FILTER_OUTPUT_STREAM_H__) +#if IN_FILE(__G_FILTER_OUTPUT_STREAM_C__) +extern __typeof (g_filter_output_stream_get_type) IA__g_filter_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_filter_output_stream_get_type IA__g_filter_output_stream_get_type + +extern __typeof (g_filter_output_stream_get_base_stream) IA__g_filter_output_stream_get_base_stream __attribute((visibility("hidden"))); +#define g_filter_output_stream_get_base_stream IA__g_filter_output_stream_get_base_stream + +extern __typeof (g_filter_output_stream_get_close_base_stream) IA__g_filter_output_stream_get_close_base_stream __attribute((visibility("hidden"))); +#define g_filter_output_stream_get_close_base_stream IA__g_filter_output_stream_get_close_base_stream + +extern __typeof (g_filter_output_stream_set_close_base_stream) IA__g_filter_output_stream_set_close_base_stream __attribute((visibility("hidden"))); +#define g_filter_output_stream_set_close_base_stream IA__g_filter_output_stream_set_close_base_stream + +#endif +#endif +#if IN_HEADER(__G_ICON_H__) +#if IN_FILE(__G_ICON_C__) +extern __typeof (g_icon_get_type) IA__g_icon_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_icon_get_type IA__g_icon_get_type + +extern __typeof (g_icon_hash) IA__g_icon_hash __attribute((visibility("hidden"))); +#define g_icon_hash IA__g_icon_hash + +extern __typeof (g_icon_equal) IA__g_icon_equal __attribute((visibility("hidden"))); +#define g_icon_equal IA__g_icon_equal + +extern __typeof (g_icon_to_string) IA__g_icon_to_string __attribute((visibility("hidden"))); +#define g_icon_to_string IA__g_icon_to_string + +extern __typeof (g_icon_new_for_string) IA__g_icon_new_for_string __attribute((visibility("hidden"))); +#define g_icon_new_for_string IA__g_icon_new_for_string + +#endif +#endif +#if IN_HEADER(__G_INPUT_STREAM_H__) +#if IN_FILE(__G_INPUT_STREAM_C__) +extern __typeof (g_input_stream_get_type) IA__g_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_input_stream_get_type IA__g_input_stream_get_type + +extern __typeof (g_input_stream_read) IA__g_input_stream_read __attribute((visibility("hidden"))); +#define g_input_stream_read IA__g_input_stream_read + +extern __typeof (g_input_stream_read_all) IA__g_input_stream_read_all __attribute((visibility("hidden"))); +#define g_input_stream_read_all IA__g_input_stream_read_all + +extern __typeof (g_input_stream_skip) IA__g_input_stream_skip __attribute((visibility("hidden"))); +#define g_input_stream_skip IA__g_input_stream_skip + +extern __typeof (g_input_stream_close) IA__g_input_stream_close __attribute((visibility("hidden"))); +#define g_input_stream_close IA__g_input_stream_close + +extern __typeof (g_input_stream_read_async) IA__g_input_stream_read_async __attribute((visibility("hidden"))); +#define g_input_stream_read_async IA__g_input_stream_read_async + +extern __typeof (g_input_stream_read_finish) IA__g_input_stream_read_finish __attribute((visibility("hidden"))); +#define g_input_stream_read_finish IA__g_input_stream_read_finish + +extern __typeof (g_input_stream_skip_async) IA__g_input_stream_skip_async __attribute((visibility("hidden"))); +#define g_input_stream_skip_async IA__g_input_stream_skip_async + +extern __typeof (g_input_stream_skip_finish) IA__g_input_stream_skip_finish __attribute((visibility("hidden"))); +#define g_input_stream_skip_finish IA__g_input_stream_skip_finish + +extern __typeof (g_input_stream_close_async) IA__g_input_stream_close_async __attribute((visibility("hidden"))); +#define g_input_stream_close_async IA__g_input_stream_close_async + +extern __typeof (g_input_stream_close_finish) IA__g_input_stream_close_finish __attribute((visibility("hidden"))); +#define g_input_stream_close_finish IA__g_input_stream_close_finish + +extern __typeof (g_input_stream_is_closed) IA__g_input_stream_is_closed __attribute((visibility("hidden"))); +#define g_input_stream_is_closed IA__g_input_stream_is_closed + +extern __typeof (g_input_stream_has_pending) IA__g_input_stream_has_pending __attribute((visibility("hidden"))); +#define g_input_stream_has_pending IA__g_input_stream_has_pending + +extern __typeof (g_input_stream_set_pending) IA__g_input_stream_set_pending __attribute((visibility("hidden"))); +#define g_input_stream_set_pending IA__g_input_stream_set_pending + +extern __typeof (g_input_stream_clear_pending) IA__g_input_stream_clear_pending __attribute((visibility("hidden"))); +#define g_input_stream_clear_pending IA__g_input_stream_clear_pending + +#endif +#endif +#if IN_HEADER(__G_IO_STREAM_H__) +#if IN_FILE(__G_IO_STREAM_C__) +extern __typeof (g_io_stream_get_type) IA__g_io_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_io_stream_get_type IA__g_io_stream_get_type + +extern __typeof (g_io_stream_get_input_stream) IA__g_io_stream_get_input_stream __attribute((visibility("hidden"))); +#define g_io_stream_get_input_stream IA__g_io_stream_get_input_stream + +extern __typeof (g_io_stream_get_output_stream) IA__g_io_stream_get_output_stream __attribute((visibility("hidden"))); +#define g_io_stream_get_output_stream IA__g_io_stream_get_output_stream + +extern __typeof (g_io_stream_close) IA__g_io_stream_close __attribute((visibility("hidden"))); +#define g_io_stream_close IA__g_io_stream_close + +extern __typeof (g_io_stream_close_async) IA__g_io_stream_close_async __attribute((visibility("hidden"))); +#define g_io_stream_close_async IA__g_io_stream_close_async + +extern __typeof (g_io_stream_close_finish) IA__g_io_stream_close_finish __attribute((visibility("hidden"))); +#define g_io_stream_close_finish IA__g_io_stream_close_finish + +extern __typeof (g_io_stream_is_closed) IA__g_io_stream_is_closed __attribute((visibility("hidden"))); +#define g_io_stream_is_closed IA__g_io_stream_is_closed + +extern __typeof (g_io_stream_has_pending) IA__g_io_stream_has_pending __attribute((visibility("hidden"))); +#define g_io_stream_has_pending IA__g_io_stream_has_pending + +extern __typeof (g_io_stream_set_pending) IA__g_io_stream_set_pending __attribute((visibility("hidden"))); +#define g_io_stream_set_pending IA__g_io_stream_set_pending + +extern __typeof (g_io_stream_clear_pending) IA__g_io_stream_clear_pending __attribute((visibility("hidden"))); +#define g_io_stream_clear_pending IA__g_io_stream_clear_pending + +#endif +#endif +#if IN_HEADER(__G_IO_ERROR_H__) +#if IN_FILE(__G_IO_ERROR_C__) +extern __typeof (g_io_error_quark) IA__g_io_error_quark __attribute((visibility("hidden"))); +#define g_io_error_quark IA__g_io_error_quark + +extern __typeof (g_io_error_from_errno) IA__g_io_error_from_errno __attribute((visibility("hidden"))); +#define g_io_error_from_errno IA__g_io_error_from_errno + +#endif +#endif +#if IN_HEADER(__G_IO_MODULE_H__) +#if IN_FILE(__G_IO_MODULE_C__) +extern __typeof (g_io_module_get_type) IA__g_io_module_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_io_module_get_type IA__g_io_module_get_type + +extern __typeof (g_io_module_new) IA__g_io_module_new __attribute((visibility("hidden"))); +#define g_io_module_new IA__g_io_module_new + +extern __typeof (g_io_modules_scan_all_in_directory) IA__g_io_modules_scan_all_in_directory __attribute((visibility("hidden"))); +#define g_io_modules_scan_all_in_directory IA__g_io_modules_scan_all_in_directory + +extern __typeof (g_io_modules_load_all_in_directory) IA__g_io_modules_load_all_in_directory __attribute((visibility("hidden"))); +#define g_io_modules_load_all_in_directory IA__g_io_modules_load_all_in_directory + +extern __typeof (g_io_extension_point_register) IA__g_io_extension_point_register __attribute((visibility("hidden"))); +#define g_io_extension_point_register IA__g_io_extension_point_register + +extern __typeof (g_io_extension_point_lookup) IA__g_io_extension_point_lookup __attribute((visibility("hidden"))); +#define g_io_extension_point_lookup IA__g_io_extension_point_lookup + +extern __typeof (g_io_extension_point_set_required_type) IA__g_io_extension_point_set_required_type __attribute((visibility("hidden"))); +#define g_io_extension_point_set_required_type IA__g_io_extension_point_set_required_type + +extern __typeof (g_io_extension_point_get_required_type) IA__g_io_extension_point_get_required_type __attribute((visibility("hidden"))); +#define g_io_extension_point_get_required_type IA__g_io_extension_point_get_required_type + +extern __typeof (g_io_extension_point_get_extensions) IA__g_io_extension_point_get_extensions __attribute((visibility("hidden"))); +#define g_io_extension_point_get_extensions IA__g_io_extension_point_get_extensions + +extern __typeof (g_io_extension_point_get_extension_by_name) IA__g_io_extension_point_get_extension_by_name __attribute((visibility("hidden"))); +#define g_io_extension_point_get_extension_by_name IA__g_io_extension_point_get_extension_by_name + +extern __typeof (g_io_extension_point_implement) IA__g_io_extension_point_implement __attribute((visibility("hidden"))); +#define g_io_extension_point_implement IA__g_io_extension_point_implement + +extern __typeof (g_io_extension_get_type) IA__g_io_extension_get_type __attribute((visibility("hidden"))); +#define g_io_extension_get_type IA__g_io_extension_get_type + +extern __typeof (g_io_extension_get_name) IA__g_io_extension_get_name __attribute((visibility("hidden"))); +#define g_io_extension_get_name IA__g_io_extension_get_name + +extern __typeof (g_io_extension_get_priority) IA__g_io_extension_get_priority __attribute((visibility("hidden"))); +#define g_io_extension_get_priority IA__g_io_extension_get_priority + +extern __typeof (g_io_extension_ref_class) IA__g_io_extension_ref_class __attribute((visibility("hidden"))); +#define g_io_extension_ref_class IA__g_io_extension_ref_class + +#endif +#endif +#if IN_HEADER(__G_IO_SCHEDULER_H__) +#if IN_FILE(__G_IO_SCHEDULER_C__) +extern __typeof (g_io_scheduler_push_job) IA__g_io_scheduler_push_job __attribute((visibility("hidden"))); +#define g_io_scheduler_push_job IA__g_io_scheduler_push_job + +extern __typeof (g_io_scheduler_cancel_all_jobs) IA__g_io_scheduler_cancel_all_jobs __attribute((visibility("hidden"))); +#define g_io_scheduler_cancel_all_jobs IA__g_io_scheduler_cancel_all_jobs + +extern __typeof (g_io_scheduler_job_send_to_mainloop) IA__g_io_scheduler_job_send_to_mainloop __attribute((visibility("hidden"))); +#define g_io_scheduler_job_send_to_mainloop IA__g_io_scheduler_job_send_to_mainloop + +extern __typeof (g_io_scheduler_job_send_to_mainloop_async) IA__g_io_scheduler_job_send_to_mainloop_async __attribute((visibility("hidden"))); +#define g_io_scheduler_job_send_to_mainloop_async IA__g_io_scheduler_job_send_to_mainloop_async + +#endif +#endif +#if IN_HEADER(__G_LOADABLE_ICON_H__) +#if IN_FILE(__G_LOADABLE_ICON_C__) +extern __typeof (g_loadable_icon_get_type) IA__g_loadable_icon_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_loadable_icon_get_type IA__g_loadable_icon_get_type + +extern __typeof (g_loadable_icon_load) IA__g_loadable_icon_load __attribute((visibility("hidden"))); +#define g_loadable_icon_load IA__g_loadable_icon_load + +extern __typeof (g_loadable_icon_load_async) IA__g_loadable_icon_load_async __attribute((visibility("hidden"))); +#define g_loadable_icon_load_async IA__g_loadable_icon_load_async + +extern __typeof (g_loadable_icon_load_finish) IA__g_loadable_icon_load_finish __attribute((visibility("hidden"))); +#define g_loadable_icon_load_finish IA__g_loadable_icon_load_finish + +#endif +#endif +#if IN_HEADER(__G_MEMORY_INPUT_STREAM_H__) +#if IN_FILE(__G_MEMORY_INPUT_STREAM_C__) +extern __typeof (g_memory_input_stream_get_type) IA__g_memory_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_memory_input_stream_get_type IA__g_memory_input_stream_get_type + +extern __typeof (g_memory_input_stream_new) IA__g_memory_input_stream_new __attribute((visibility("hidden"))); +#define g_memory_input_stream_new IA__g_memory_input_stream_new + +extern __typeof (g_memory_input_stream_new_from_data) IA__g_memory_input_stream_new_from_data __attribute((visibility("hidden"))); +#define g_memory_input_stream_new_from_data IA__g_memory_input_stream_new_from_data + +extern __typeof (g_memory_input_stream_add_data) IA__g_memory_input_stream_add_data __attribute((visibility("hidden"))); +#define g_memory_input_stream_add_data IA__g_memory_input_stream_add_data + +#endif +#endif +#if IN_HEADER(__G_MEMORY_OUTPUT_STREAM_H__) +#if IN_FILE(__G_MEMORY_OUTPUT_STREAM_C__) +extern __typeof (g_memory_output_stream_get_type) IA__g_memory_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_memory_output_stream_get_type IA__g_memory_output_stream_get_type + +extern __typeof (g_memory_output_stream_new) IA__g_memory_output_stream_new __attribute((visibility("hidden"))); +#define g_memory_output_stream_new IA__g_memory_output_stream_new + +extern __typeof (g_memory_output_stream_get_data) IA__g_memory_output_stream_get_data __attribute((visibility("hidden"))); +#define g_memory_output_stream_get_data IA__g_memory_output_stream_get_data + +extern __typeof (g_memory_output_stream_get_data_size) IA__g_memory_output_stream_get_data_size __attribute((visibility("hidden"))); +#define g_memory_output_stream_get_data_size IA__g_memory_output_stream_get_data_size + +extern __typeof (g_memory_output_stream_get_size) IA__g_memory_output_stream_get_size __attribute((visibility("hidden"))); +#define g_memory_output_stream_get_size IA__g_memory_output_stream_get_size + +#endif +#endif +#if IN_HEADER(__G_MOUNT_OPERATION_H__) +#if IN_FILE(__G_MOUNT_OPERATION_C__) +extern __typeof (g_mount_operation_get_type) IA__g_mount_operation_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_mount_operation_get_type IA__g_mount_operation_get_type + +extern __typeof (g_mount_operation_new) IA__g_mount_operation_new __attribute((visibility("hidden"))); +#define g_mount_operation_new IA__g_mount_operation_new + +extern __typeof (g_mount_operation_get_username) IA__g_mount_operation_get_username __attribute((visibility("hidden"))); +#define g_mount_operation_get_username IA__g_mount_operation_get_username + +extern __typeof (g_mount_operation_set_username) IA__g_mount_operation_set_username __attribute((visibility("hidden"))); +#define g_mount_operation_set_username IA__g_mount_operation_set_username + +extern __typeof (g_mount_operation_get_password) IA__g_mount_operation_get_password __attribute((visibility("hidden"))); +#define g_mount_operation_get_password IA__g_mount_operation_get_password + +extern __typeof (g_mount_operation_set_password) IA__g_mount_operation_set_password __attribute((visibility("hidden"))); +#define g_mount_operation_set_password IA__g_mount_operation_set_password + +extern __typeof (g_mount_operation_get_anonymous) IA__g_mount_operation_get_anonymous __attribute((visibility("hidden"))); +#define g_mount_operation_get_anonymous IA__g_mount_operation_get_anonymous + +extern __typeof (g_mount_operation_set_anonymous) IA__g_mount_operation_set_anonymous __attribute((visibility("hidden"))); +#define g_mount_operation_set_anonymous IA__g_mount_operation_set_anonymous + +extern __typeof (g_mount_operation_get_domain) IA__g_mount_operation_get_domain __attribute((visibility("hidden"))); +#define g_mount_operation_get_domain IA__g_mount_operation_get_domain + +extern __typeof (g_mount_operation_set_domain) IA__g_mount_operation_set_domain __attribute((visibility("hidden"))); +#define g_mount_operation_set_domain IA__g_mount_operation_set_domain + +extern __typeof (g_mount_operation_get_password_save) IA__g_mount_operation_get_password_save __attribute((visibility("hidden"))); +#define g_mount_operation_get_password_save IA__g_mount_operation_get_password_save + +extern __typeof (g_mount_operation_set_password_save) IA__g_mount_operation_set_password_save __attribute((visibility("hidden"))); +#define g_mount_operation_set_password_save IA__g_mount_operation_set_password_save + +extern __typeof (g_mount_operation_get_choice) IA__g_mount_operation_get_choice __attribute((visibility("hidden"))); +#define g_mount_operation_get_choice IA__g_mount_operation_get_choice + +extern __typeof (g_mount_operation_set_choice) IA__g_mount_operation_set_choice __attribute((visibility("hidden"))); +#define g_mount_operation_set_choice IA__g_mount_operation_set_choice + +extern __typeof (g_mount_operation_reply) IA__g_mount_operation_reply __attribute((visibility("hidden"))); +#define g_mount_operation_reply IA__g_mount_operation_reply + +#endif +#endif +#if IN_HEADER(__G_OUTPUT_STREAM_H__) +#if IN_FILE(__G_OUTPUT_STREAM_C__) +extern __typeof (g_output_stream_get_type) IA__g_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_output_stream_get_type IA__g_output_stream_get_type + +extern __typeof (g_output_stream_write) IA__g_output_stream_write __attribute((visibility("hidden"))); +#define g_output_stream_write IA__g_output_stream_write + +extern __typeof (g_output_stream_write_all) IA__g_output_stream_write_all __attribute((visibility("hidden"))); +#define g_output_stream_write_all IA__g_output_stream_write_all + +extern __typeof (g_output_stream_splice) IA__g_output_stream_splice __attribute((visibility("hidden"))); +#define g_output_stream_splice IA__g_output_stream_splice + +extern __typeof (g_output_stream_flush) IA__g_output_stream_flush __attribute((visibility("hidden"))); +#define g_output_stream_flush IA__g_output_stream_flush + +extern __typeof (g_output_stream_close) IA__g_output_stream_close __attribute((visibility("hidden"))); +#define g_output_stream_close IA__g_output_stream_close + +extern __typeof (g_output_stream_write_async) IA__g_output_stream_write_async __attribute((visibility("hidden"))); +#define g_output_stream_write_async IA__g_output_stream_write_async + +extern __typeof (g_output_stream_write_finish) IA__g_output_stream_write_finish __attribute((visibility("hidden"))); +#define g_output_stream_write_finish IA__g_output_stream_write_finish + +extern __typeof (g_output_stream_splice_async) IA__g_output_stream_splice_async __attribute((visibility("hidden"))); +#define g_output_stream_splice_async IA__g_output_stream_splice_async + +extern __typeof (g_output_stream_splice_finish) IA__g_output_stream_splice_finish __attribute((visibility("hidden"))); +#define g_output_stream_splice_finish IA__g_output_stream_splice_finish + +extern __typeof (g_output_stream_flush_async) IA__g_output_stream_flush_async __attribute((visibility("hidden"))); +#define g_output_stream_flush_async IA__g_output_stream_flush_async + +extern __typeof (g_output_stream_flush_finish) IA__g_output_stream_flush_finish __attribute((visibility("hidden"))); +#define g_output_stream_flush_finish IA__g_output_stream_flush_finish + +extern __typeof (g_output_stream_close_async) IA__g_output_stream_close_async __attribute((visibility("hidden"))); +#define g_output_stream_close_async IA__g_output_stream_close_async + +extern __typeof (g_output_stream_close_finish) IA__g_output_stream_close_finish __attribute((visibility("hidden"))); +#define g_output_stream_close_finish IA__g_output_stream_close_finish + +extern __typeof (g_output_stream_is_closed) IA__g_output_stream_is_closed __attribute((visibility("hidden"))); +#define g_output_stream_is_closed IA__g_output_stream_is_closed + +extern __typeof (g_output_stream_is_closing) IA__g_output_stream_is_closing __attribute((visibility("hidden"))); +#define g_output_stream_is_closing IA__g_output_stream_is_closing + +extern __typeof (g_output_stream_has_pending) IA__g_output_stream_has_pending __attribute((visibility("hidden"))); +#define g_output_stream_has_pending IA__g_output_stream_has_pending + +extern __typeof (g_output_stream_set_pending) IA__g_output_stream_set_pending __attribute((visibility("hidden"))); +#define g_output_stream_set_pending IA__g_output_stream_set_pending + +extern __typeof (g_output_stream_clear_pending) IA__g_output_stream_clear_pending __attribute((visibility("hidden"))); +#define g_output_stream_clear_pending IA__g_output_stream_clear_pending + +#endif +#endif +#if IN_HEADER(__G_SEEKABLE_H__) +#if IN_FILE(__G_SEEKABLE_C__) +extern __typeof (g_seekable_get_type) IA__g_seekable_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_seekable_get_type IA__g_seekable_get_type + +extern __typeof (g_seekable_tell) IA__g_seekable_tell __attribute((visibility("hidden"))); +#define g_seekable_tell IA__g_seekable_tell + +extern __typeof (g_seekable_can_seek) IA__g_seekable_can_seek __attribute((visibility("hidden"))); +#define g_seekable_can_seek IA__g_seekable_can_seek + +extern __typeof (g_seekable_seek) IA__g_seekable_seek __attribute((visibility("hidden"))); +#define g_seekable_seek IA__g_seekable_seek + +extern __typeof (g_seekable_can_truncate) IA__g_seekable_can_truncate __attribute((visibility("hidden"))); +#define g_seekable_can_truncate IA__g_seekable_can_truncate + +extern __typeof (g_seekable_truncate) IA__g_seekable_truncate __attribute((visibility("hidden"))); +#define g_seekable_truncate IA__g_seekable_truncate + +#endif +#endif +#if IN_HEADER(__G_SIMPLE_ASYNC_RESULT_H__) +#if IN_FILE(__G_SIMPLE_ASYNC_RESULT_C__) +extern __typeof (g_simple_async_result_get_type) IA__g_simple_async_result_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_simple_async_result_get_type IA__g_simple_async_result_get_type + +extern __typeof (g_simple_async_result_new) IA__g_simple_async_result_new __attribute((visibility("hidden"))); +#define g_simple_async_result_new IA__g_simple_async_result_new + +extern __typeof (g_simple_async_result_new_error) IA__g_simple_async_result_new_error __attribute((visibility("hidden"))); +#define g_simple_async_result_new_error IA__g_simple_async_result_new_error + +extern __typeof (g_simple_async_result_new_from_error) IA__g_simple_async_result_new_from_error __attribute((visibility("hidden"))); +#define g_simple_async_result_new_from_error IA__g_simple_async_result_new_from_error + +extern __typeof (g_simple_async_result_set_op_res_gpointer) IA__g_simple_async_result_set_op_res_gpointer __attribute((visibility("hidden"))); +#define g_simple_async_result_set_op_res_gpointer IA__g_simple_async_result_set_op_res_gpointer + +extern __typeof (g_simple_async_result_get_op_res_gpointer) IA__g_simple_async_result_get_op_res_gpointer __attribute((visibility("hidden"))); +#define g_simple_async_result_get_op_res_gpointer IA__g_simple_async_result_get_op_res_gpointer + +extern __typeof (g_simple_async_result_set_op_res_gssize) IA__g_simple_async_result_set_op_res_gssize __attribute((visibility("hidden"))); +#define g_simple_async_result_set_op_res_gssize IA__g_simple_async_result_set_op_res_gssize + +extern __typeof (g_simple_async_result_get_op_res_gssize) IA__g_simple_async_result_get_op_res_gssize __attribute((visibility("hidden"))); +#define g_simple_async_result_get_op_res_gssize IA__g_simple_async_result_get_op_res_gssize + +extern __typeof (g_simple_async_result_set_op_res_gboolean) IA__g_simple_async_result_set_op_res_gboolean __attribute((visibility("hidden"))); +#define g_simple_async_result_set_op_res_gboolean IA__g_simple_async_result_set_op_res_gboolean + +extern __typeof (g_simple_async_result_get_op_res_gboolean) IA__g_simple_async_result_get_op_res_gboolean __attribute((visibility("hidden"))); +#define g_simple_async_result_get_op_res_gboolean IA__g_simple_async_result_get_op_res_gboolean + +extern __typeof (g_simple_async_result_get_source_tag) IA__g_simple_async_result_get_source_tag __attribute((visibility("hidden"))); +#define g_simple_async_result_get_source_tag IA__g_simple_async_result_get_source_tag + +extern __typeof (g_simple_async_result_set_handle_cancellation) IA__g_simple_async_result_set_handle_cancellation __attribute((visibility("hidden"))); +#define g_simple_async_result_set_handle_cancellation IA__g_simple_async_result_set_handle_cancellation + +extern __typeof (g_simple_async_result_complete) IA__g_simple_async_result_complete __attribute((visibility("hidden"))); +#define g_simple_async_result_complete IA__g_simple_async_result_complete + +extern __typeof (g_simple_async_result_complete_in_idle) IA__g_simple_async_result_complete_in_idle __attribute((visibility("hidden"))); +#define g_simple_async_result_complete_in_idle IA__g_simple_async_result_complete_in_idle + +extern __typeof (g_simple_async_result_run_in_thread) IA__g_simple_async_result_run_in_thread __attribute((visibility("hidden"))); +#define g_simple_async_result_run_in_thread IA__g_simple_async_result_run_in_thread + +extern __typeof (g_simple_async_result_set_from_error) IA__g_simple_async_result_set_from_error __attribute((visibility("hidden"))); +#define g_simple_async_result_set_from_error IA__g_simple_async_result_set_from_error + +extern __typeof (g_simple_async_result_propagate_error) IA__g_simple_async_result_propagate_error __attribute((visibility("hidden"))); +#define g_simple_async_result_propagate_error IA__g_simple_async_result_propagate_error + +extern __typeof (g_simple_async_result_set_error) IA__g_simple_async_result_set_error __attribute((visibility("hidden"))); +#define g_simple_async_result_set_error IA__g_simple_async_result_set_error + +extern __typeof (g_simple_async_result_set_error_va) IA__g_simple_async_result_set_error_va __attribute((visibility("hidden"))); +#define g_simple_async_result_set_error_va IA__g_simple_async_result_set_error_va + +extern __typeof (g_simple_async_result_is_valid) IA__g_simple_async_result_is_valid __attribute((visibility("hidden"))); +#define g_simple_async_result_is_valid IA__g_simple_async_result_is_valid + +extern __typeof (g_simple_async_report_error_in_idle) IA__g_simple_async_report_error_in_idle __attribute((visibility("hidden"))); +#define g_simple_async_report_error_in_idle IA__g_simple_async_report_error_in_idle + +extern __typeof (g_simple_async_report_gerror_in_idle) IA__g_simple_async_report_gerror_in_idle __attribute((visibility("hidden"))); +#define g_simple_async_report_gerror_in_idle IA__g_simple_async_report_gerror_in_idle + +#endif +#endif +#if IN_HEADER(__G_THEMED_ICON_H__) +#if IN_FILE(__G_THEMED_ICON_C__) +extern __typeof (g_themed_icon_get_type) IA__g_themed_icon_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_themed_icon_get_type IA__g_themed_icon_get_type + +extern __typeof (g_themed_icon_new) IA__g_themed_icon_new __attribute((visibility("hidden"))); +#define g_themed_icon_new IA__g_themed_icon_new + +extern __typeof (g_themed_icon_new_with_default_fallbacks) IA__g_themed_icon_new_with_default_fallbacks __attribute((visibility("hidden"))); +#define g_themed_icon_new_with_default_fallbacks IA__g_themed_icon_new_with_default_fallbacks + +extern __typeof (g_themed_icon_new_from_names) IA__g_themed_icon_new_from_names __attribute((visibility("hidden"))); +#define g_themed_icon_new_from_names IA__g_themed_icon_new_from_names + +extern __typeof (g_themed_icon_get_names) IA__g_themed_icon_get_names __attribute((visibility("hidden"))); +#define g_themed_icon_get_names IA__g_themed_icon_get_names + +extern __typeof (g_themed_icon_prepend_name) IA__g_themed_icon_prepend_name __attribute((visibility("hidden"))); +#define g_themed_icon_prepend_name IA__g_themed_icon_prepend_name + +extern __typeof (g_themed_icon_append_name) IA__g_themed_icon_append_name __attribute((visibility("hidden"))); +#define g_themed_icon_append_name IA__g_themed_icon_append_name + +#endif +#endif +#if IN_HEADER(__G_UNIX_MOUNTS_H__) +#if IN_FILE(__G_UNIX_MOUNTS_C__) +#ifdef G_OS_UNIX +extern __typeof (g_unix_mount_free) IA__g_unix_mount_free __attribute((visibility("hidden"))); +#define g_unix_mount_free IA__g_unix_mount_free + +extern __typeof (g_unix_mount_point_free) IA__g_unix_mount_point_free __attribute((visibility("hidden"))); +#define g_unix_mount_point_free IA__g_unix_mount_point_free + +extern __typeof (g_unix_mount_compare) IA__g_unix_mount_compare __attribute((visibility("hidden"))); +#define g_unix_mount_compare IA__g_unix_mount_compare + +extern __typeof (g_unix_mount_get_mount_path) IA__g_unix_mount_get_mount_path __attribute((visibility("hidden"))); +#define g_unix_mount_get_mount_path IA__g_unix_mount_get_mount_path + +extern __typeof (g_unix_mount_get_device_path) IA__g_unix_mount_get_device_path __attribute((visibility("hidden"))); +#define g_unix_mount_get_device_path IA__g_unix_mount_get_device_path + +extern __typeof (g_unix_mount_get_fs_type) IA__g_unix_mount_get_fs_type __attribute((visibility("hidden"))); +#define g_unix_mount_get_fs_type IA__g_unix_mount_get_fs_type + +extern __typeof (g_unix_mount_is_readonly) IA__g_unix_mount_is_readonly __attribute((visibility("hidden"))); +#define g_unix_mount_is_readonly IA__g_unix_mount_is_readonly + +extern __typeof (g_unix_mount_is_system_internal) IA__g_unix_mount_is_system_internal __attribute((visibility("hidden"))); +#define g_unix_mount_is_system_internal IA__g_unix_mount_is_system_internal + +extern __typeof (g_unix_mount_guess_can_eject) IA__g_unix_mount_guess_can_eject __attribute((visibility("hidden"))); +#define g_unix_mount_guess_can_eject IA__g_unix_mount_guess_can_eject + +extern __typeof (g_unix_mount_guess_should_display) IA__g_unix_mount_guess_should_display __attribute((visibility("hidden"))); +#define g_unix_mount_guess_should_display IA__g_unix_mount_guess_should_display + +extern __typeof (g_unix_mount_guess_name) IA__g_unix_mount_guess_name __attribute((visibility("hidden"))); +#define g_unix_mount_guess_name IA__g_unix_mount_guess_name + +extern __typeof (g_unix_mount_guess_icon) IA__g_unix_mount_guess_icon __attribute((visibility("hidden"))); +#define g_unix_mount_guess_icon IA__g_unix_mount_guess_icon + +extern __typeof (g_unix_mount_point_compare) IA__g_unix_mount_point_compare __attribute((visibility("hidden"))); +#define g_unix_mount_point_compare IA__g_unix_mount_point_compare + +extern __typeof (g_unix_mount_point_get_mount_path) IA__g_unix_mount_point_get_mount_path __attribute((visibility("hidden"))); +#define g_unix_mount_point_get_mount_path IA__g_unix_mount_point_get_mount_path + +extern __typeof (g_unix_mount_point_get_device_path) IA__g_unix_mount_point_get_device_path __attribute((visibility("hidden"))); +#define g_unix_mount_point_get_device_path IA__g_unix_mount_point_get_device_path + +extern __typeof (g_unix_mount_point_get_fs_type) IA__g_unix_mount_point_get_fs_type __attribute((visibility("hidden"))); +#define g_unix_mount_point_get_fs_type IA__g_unix_mount_point_get_fs_type + +extern __typeof (g_unix_mount_point_is_readonly) IA__g_unix_mount_point_is_readonly __attribute((visibility("hidden"))); +#define g_unix_mount_point_is_readonly IA__g_unix_mount_point_is_readonly + +extern __typeof (g_unix_mount_point_is_user_mountable) IA__g_unix_mount_point_is_user_mountable __attribute((visibility("hidden"))); +#define g_unix_mount_point_is_user_mountable IA__g_unix_mount_point_is_user_mountable + +extern __typeof (g_unix_mount_point_is_loopback) IA__g_unix_mount_point_is_loopback __attribute((visibility("hidden"))); +#define g_unix_mount_point_is_loopback IA__g_unix_mount_point_is_loopback + +extern __typeof (g_unix_mount_point_guess_can_eject) IA__g_unix_mount_point_guess_can_eject __attribute((visibility("hidden"))); +#define g_unix_mount_point_guess_can_eject IA__g_unix_mount_point_guess_can_eject + +extern __typeof (g_unix_mount_point_guess_name) IA__g_unix_mount_point_guess_name __attribute((visibility("hidden"))); +#define g_unix_mount_point_guess_name IA__g_unix_mount_point_guess_name + +extern __typeof (g_unix_mount_point_guess_icon) IA__g_unix_mount_point_guess_icon __attribute((visibility("hidden"))); +#define g_unix_mount_point_guess_icon IA__g_unix_mount_point_guess_icon + +extern __typeof (g_unix_mount_points_get) IA__g_unix_mount_points_get __attribute((visibility("hidden"))); +#define g_unix_mount_points_get IA__g_unix_mount_points_get + +extern __typeof (g_unix_mounts_get) IA__g_unix_mounts_get __attribute((visibility("hidden"))); +#define g_unix_mounts_get IA__g_unix_mounts_get + +extern __typeof (g_unix_mount_at) IA__g_unix_mount_at __attribute((visibility("hidden"))); +#define g_unix_mount_at IA__g_unix_mount_at + +extern __typeof (g_unix_mounts_changed_since) IA__g_unix_mounts_changed_since __attribute((visibility("hidden"))); +#define g_unix_mounts_changed_since IA__g_unix_mounts_changed_since + +extern __typeof (g_unix_mount_points_changed_since) IA__g_unix_mount_points_changed_since __attribute((visibility("hidden"))); +#define g_unix_mount_points_changed_since IA__g_unix_mount_points_changed_since + +extern __typeof (g_unix_mount_monitor_get_type) IA__g_unix_mount_monitor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_mount_monitor_get_type IA__g_unix_mount_monitor_get_type + +extern __typeof (g_unix_mount_monitor_new) IA__g_unix_mount_monitor_new __attribute((visibility("hidden"))); +#define g_unix_mount_monitor_new IA__g_unix_mount_monitor_new + +extern __typeof (g_unix_mount_monitor_set_rate_limit) IA__g_unix_mount_monitor_set_rate_limit __attribute((visibility("hidden"))); +#define g_unix_mount_monitor_set_rate_limit IA__g_unix_mount_monitor_set_rate_limit + +extern __typeof (g_unix_is_mount_path_system_internal) IA__g_unix_is_mount_path_system_internal __attribute((visibility("hidden"))); +#define g_unix_is_mount_path_system_internal IA__g_unix_is_mount_path_system_internal + +#endif /* G_OS_UNIX */ +#endif +#endif +#if IN_HEADER(__G_UNIX_INPUT_STREAM_H__) +#if IN_FILE(__G_UNIX_INPUT_STREAM_C__) +#ifdef G_OS_UNIX +extern __typeof (g_unix_input_stream_get_type) IA__g_unix_input_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_input_stream_get_type IA__g_unix_input_stream_get_type + +extern __typeof (g_unix_input_stream_new) IA__g_unix_input_stream_new __attribute((visibility("hidden"))); +#define g_unix_input_stream_new IA__g_unix_input_stream_new + +extern __typeof (g_unix_input_stream_set_close_fd) IA__g_unix_input_stream_set_close_fd __attribute((visibility("hidden"))); +#define g_unix_input_stream_set_close_fd IA__g_unix_input_stream_set_close_fd + +extern __typeof (g_unix_input_stream_get_close_fd) IA__g_unix_input_stream_get_close_fd __attribute((visibility("hidden"))); +#define g_unix_input_stream_get_close_fd IA__g_unix_input_stream_get_close_fd + +extern __typeof (g_unix_input_stream_get_fd) IA__g_unix_input_stream_get_fd __attribute((visibility("hidden"))); +#define g_unix_input_stream_get_fd IA__g_unix_input_stream_get_fd + +#endif /* G_OS_UNIX */ +#endif +#endif +#if IN_HEADER(__G_UNIX_OUTPUT_STREAM_H__) +#if IN_FILE(__G_UNIX_OUTPUT_STREAM_C__) +#ifdef G_OS_UNIX +extern __typeof (g_unix_output_stream_get_type) IA__g_unix_output_stream_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_output_stream_get_type IA__g_unix_output_stream_get_type + +extern __typeof (g_unix_output_stream_new) IA__g_unix_output_stream_new __attribute((visibility("hidden"))); +#define g_unix_output_stream_new IA__g_unix_output_stream_new + +extern __typeof (g_unix_output_stream_set_close_fd) IA__g_unix_output_stream_set_close_fd __attribute((visibility("hidden"))); +#define g_unix_output_stream_set_close_fd IA__g_unix_output_stream_set_close_fd + +extern __typeof (g_unix_output_stream_get_close_fd) IA__g_unix_output_stream_get_close_fd __attribute((visibility("hidden"))); +#define g_unix_output_stream_get_close_fd IA__g_unix_output_stream_get_close_fd + +extern __typeof (g_unix_output_stream_get_fd) IA__g_unix_output_stream_get_fd __attribute((visibility("hidden"))); +#define g_unix_output_stream_get_fd IA__g_unix_output_stream_get_fd + +#endif /* G_OS_UNIX */ +#endif +#endif +#if IN_HEADER(__G_MOUNT_H__) +#if IN_FILE(__G_MOUNT_C__) +extern __typeof (g_mount_get_type) IA__g_mount_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_mount_get_type IA__g_mount_get_type + +extern __typeof (g_mount_get_root) IA__g_mount_get_root __attribute((visibility("hidden"))); +#define g_mount_get_root IA__g_mount_get_root + +extern __typeof (g_mount_get_name) IA__g_mount_get_name __attribute((visibility("hidden"))); +#define g_mount_get_name IA__g_mount_get_name + +extern __typeof (g_mount_get_icon) IA__g_mount_get_icon __attribute((visibility("hidden"))); +#define g_mount_get_icon IA__g_mount_get_icon + +extern __typeof (g_mount_get_uuid) IA__g_mount_get_uuid __attribute((visibility("hidden"))); +#define g_mount_get_uuid IA__g_mount_get_uuid + +extern __typeof (g_mount_get_volume) IA__g_mount_get_volume __attribute((visibility("hidden"))); +#define g_mount_get_volume IA__g_mount_get_volume + +extern __typeof (g_mount_get_drive) IA__g_mount_get_drive __attribute((visibility("hidden"))); +#define g_mount_get_drive IA__g_mount_get_drive + +extern __typeof (g_mount_can_unmount) IA__g_mount_can_unmount __attribute((visibility("hidden"))); +#define g_mount_can_unmount IA__g_mount_can_unmount + +extern __typeof (g_mount_can_eject) IA__g_mount_can_eject __attribute((visibility("hidden"))); +#define g_mount_can_eject IA__g_mount_can_eject + +extern __typeof (g_mount_unmount_with_operation) IA__g_mount_unmount_with_operation __attribute((visibility("hidden"))); +#define g_mount_unmount_with_operation IA__g_mount_unmount_with_operation + +extern __typeof (g_mount_unmount_with_operation_finish) IA__g_mount_unmount_with_operation_finish __attribute((visibility("hidden"))); +#define g_mount_unmount_with_operation_finish IA__g_mount_unmount_with_operation_finish + +extern __typeof (g_mount_eject_with_operation) IA__g_mount_eject_with_operation __attribute((visibility("hidden"))); +#define g_mount_eject_with_operation IA__g_mount_eject_with_operation + +extern __typeof (g_mount_eject_with_operation_finish) IA__g_mount_eject_with_operation_finish __attribute((visibility("hidden"))); +#define g_mount_eject_with_operation_finish IA__g_mount_eject_with_operation_finish + +extern __typeof (g_mount_get_default_location) IA__g_mount_get_default_location __attribute((visibility("hidden"))); +#define g_mount_get_default_location IA__g_mount_get_default_location + +extern __typeof (g_mount_remount) IA__g_mount_remount __attribute((visibility("hidden"))); +#define g_mount_remount IA__g_mount_remount + +extern __typeof (g_mount_remount_finish) IA__g_mount_remount_finish __attribute((visibility("hidden"))); +#define g_mount_remount_finish IA__g_mount_remount_finish + +extern __typeof (g_mount_guess_content_type) IA__g_mount_guess_content_type __attribute((visibility("hidden"))); +#define g_mount_guess_content_type IA__g_mount_guess_content_type + +extern __typeof (g_mount_guess_content_type_finish) IA__g_mount_guess_content_type_finish __attribute((visibility("hidden"))); +#define g_mount_guess_content_type_finish IA__g_mount_guess_content_type_finish + +extern __typeof (g_mount_guess_content_type_sync) IA__g_mount_guess_content_type_sync __attribute((visibility("hidden"))); +#define g_mount_guess_content_type_sync IA__g_mount_guess_content_type_sync + +extern __typeof (g_mount_is_shadowed) IA__g_mount_is_shadowed __attribute((visibility("hidden"))); +#define g_mount_is_shadowed IA__g_mount_is_shadowed + +extern __typeof (g_mount_shadow) IA__g_mount_shadow __attribute((visibility("hidden"))); +#define g_mount_shadow IA__g_mount_shadow + +extern __typeof (g_mount_unshadow) IA__g_mount_unshadow __attribute((visibility("hidden"))); +#define g_mount_unshadow IA__g_mount_unshadow + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_mount_unmount) IA__g_mount_unmount __attribute((visibility("hidden"))); +#define g_mount_unmount IA__g_mount_unmount + +extern __typeof (g_mount_unmount_finish) IA__g_mount_unmount_finish __attribute((visibility("hidden"))); +#define g_mount_unmount_finish IA__g_mount_unmount_finish + +extern __typeof (g_mount_eject) IA__g_mount_eject __attribute((visibility("hidden"))); +#define g_mount_eject IA__g_mount_eject + +extern __typeof (g_mount_eject_finish) IA__g_mount_eject_finish __attribute((visibility("hidden"))); +#define g_mount_eject_finish IA__g_mount_eject_finish + +#endif +#endif +#endif +#if IN_HEADER(__G_VOLUME_H__) +#if IN_FILE(__G_VOLUME_C__) +extern __typeof (g_volume_get_type) IA__g_volume_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_volume_get_type IA__g_volume_get_type + +extern __typeof (g_volume_get_name) IA__g_volume_get_name __attribute((visibility("hidden"))); +#define g_volume_get_name IA__g_volume_get_name + +extern __typeof (g_volume_get_icon) IA__g_volume_get_icon __attribute((visibility("hidden"))); +#define g_volume_get_icon IA__g_volume_get_icon + +extern __typeof (g_volume_get_uuid) IA__g_volume_get_uuid __attribute((visibility("hidden"))); +#define g_volume_get_uuid IA__g_volume_get_uuid + +extern __typeof (g_volume_get_drive) IA__g_volume_get_drive __attribute((visibility("hidden"))); +#define g_volume_get_drive IA__g_volume_get_drive + +extern __typeof (g_volume_get_mount) IA__g_volume_get_mount __attribute((visibility("hidden"))); +#define g_volume_get_mount IA__g_volume_get_mount + +extern __typeof (g_volume_should_automount) IA__g_volume_should_automount __attribute((visibility("hidden"))); +#define g_volume_should_automount IA__g_volume_should_automount + +extern __typeof (g_volume_can_mount) IA__g_volume_can_mount __attribute((visibility("hidden"))); +#define g_volume_can_mount IA__g_volume_can_mount + +extern __typeof (g_volume_can_eject) IA__g_volume_can_eject __attribute((visibility("hidden"))); +#define g_volume_can_eject IA__g_volume_can_eject + +extern __typeof (g_volume_mount) IA__g_volume_mount __attribute((visibility("hidden"))); +#define g_volume_mount IA__g_volume_mount + +extern __typeof (g_volume_mount_finish) IA__g_volume_mount_finish __attribute((visibility("hidden"))); +#define g_volume_mount_finish IA__g_volume_mount_finish + +extern __typeof (g_volume_eject_with_operation) IA__g_volume_eject_with_operation __attribute((visibility("hidden"))); +#define g_volume_eject_with_operation IA__g_volume_eject_with_operation + +extern __typeof (g_volume_eject_with_operation_finish) IA__g_volume_eject_with_operation_finish __attribute((visibility("hidden"))); +#define g_volume_eject_with_operation_finish IA__g_volume_eject_with_operation_finish + +extern __typeof (g_volume_get_identifier) IA__g_volume_get_identifier __attribute((visibility("hidden"))); +#define g_volume_get_identifier IA__g_volume_get_identifier + +extern __typeof (g_volume_enumerate_identifiers) IA__g_volume_enumerate_identifiers __attribute((visibility("hidden"))); +#define g_volume_enumerate_identifiers IA__g_volume_enumerate_identifiers + +extern __typeof (g_volume_get_activation_root) IA__g_volume_get_activation_root __attribute((visibility("hidden"))); +#define g_volume_get_activation_root IA__g_volume_get_activation_root + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_volume_eject) IA__g_volume_eject __attribute((visibility("hidden"))); +#define g_volume_eject IA__g_volume_eject + +extern __typeof (g_volume_eject_finish) IA__g_volume_eject_finish __attribute((visibility("hidden"))); +#define g_volume_eject_finish IA__g_volume_eject_finish + +#endif +#endif +#endif +#if IN_HEADER(__G_VOLUME_MONITOR_H__) +#if IN_FILE(__G_VOLUME_MONITOR_C__) +extern __typeof (g_volume_monitor_get_type) IA__g_volume_monitor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_volume_monitor_get_type IA__g_volume_monitor_get_type + +extern __typeof (g_volume_monitor_get_connected_drives) IA__g_volume_monitor_get_connected_drives __attribute((visibility("hidden"))); +#define g_volume_monitor_get_connected_drives IA__g_volume_monitor_get_connected_drives + +extern __typeof (g_volume_monitor_get_volume_for_uuid) IA__g_volume_monitor_get_volume_for_uuid __attribute((visibility("hidden"))); +#define g_volume_monitor_get_volume_for_uuid IA__g_volume_monitor_get_volume_for_uuid + +extern __typeof (g_volume_monitor_get_volumes) IA__g_volume_monitor_get_volumes __attribute((visibility("hidden"))); +#define g_volume_monitor_get_volumes IA__g_volume_monitor_get_volumes + +extern __typeof (g_volume_monitor_get_mounts) IA__g_volume_monitor_get_mounts __attribute((visibility("hidden"))); +#define g_volume_monitor_get_mounts IA__g_volume_monitor_get_mounts + +extern __typeof (g_volume_monitor_get_mount_for_uuid) IA__g_volume_monitor_get_mount_for_uuid __attribute((visibility("hidden"))); +#define g_volume_monitor_get_mount_for_uuid IA__g_volume_monitor_get_mount_for_uuid + +#endif +#if IN_FILE(__G_UNION_VOLUME_MONITOR_C__) +extern __typeof (g_volume_monitor_get) IA__g_volume_monitor_get __attribute((visibility("hidden"))); +#define g_volume_monitor_get IA__g_volume_monitor_get + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_volume_monitor_adopt_orphan_mount) IA__g_volume_monitor_adopt_orphan_mount __attribute((visibility("hidden"))); +#define g_volume_monitor_adopt_orphan_mount IA__g_volume_monitor_adopt_orphan_mount + +#endif +#endif +#endif +#if IN_HEADER(__G_NATIVE_VOLUME_MONITOR_H__) +#if IN_FILE(__G_NATIVE_VOLUME_MONITOR_C__) +extern __typeof (g_native_volume_monitor_get_type) IA__g_native_volume_monitor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_native_volume_monitor_get_type IA__g_native_volume_monitor_get_type + +#endif +#endif +#if IN_HEADER(__G_LOCAL_FILE_MONITOR_H__) +#if IN_FILE(__G_LOCAL_FILE_MONITOR_C__) +#ifdef G_OS_UNIX +extern __typeof (g_local_file_monitor_get_type) IA__g_local_file_monitor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_local_file_monitor_get_type IA__g_local_file_monitor_get_type + +#endif +#endif +#endif +#if IN_HEADER(__G_LOCAL_DIRECTORY_MONITOR_H__) +#if IN_FILE(__G_LOCAL_DIRECTORY_MONITOR_C__) +#ifdef G_OS_UNIX +extern __typeof (g_local_directory_monitor_get_type) IA__g_local_directory_monitor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_local_directory_monitor_get_type IA__g_local_directory_monitor_get_type + +#endif +#endif +#endif +#if IN_HEADER(__GIO_ENUM_TYPES_H__) +#if IN_FILE(__GIO_ENUM_TYPES_C__) +extern __typeof (g_mount_unmount_flags_get_type) IA__g_mount_unmount_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_mount_unmount_flags_get_type IA__g_mount_unmount_flags_get_type + +extern __typeof (g_app_info_create_flags_get_type) IA__g_app_info_create_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_app_info_create_flags_get_type IA__g_app_info_create_flags_get_type + +extern __typeof (g_converter_flags_get_type) IA__g_converter_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_converter_flags_get_type IA__g_converter_flags_get_type + +extern __typeof (g_converter_result_get_type) IA__g_converter_result_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_converter_result_get_type IA__g_converter_result_get_type + +extern __typeof (g_data_stream_byte_order_get_type) IA__g_data_stream_byte_order_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_data_stream_byte_order_get_type IA__g_data_stream_byte_order_get_type + +extern __typeof (g_data_stream_newline_type_get_type) IA__g_data_stream_newline_type_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_data_stream_newline_type_get_type IA__g_data_stream_newline_type_get_type + +extern __typeof (g_file_attribute_info_flags_get_type) IA__g_file_attribute_info_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_attribute_info_flags_get_type IA__g_file_attribute_info_flags_get_type + +extern __typeof (g_file_attribute_status_get_type) IA__g_file_attribute_status_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_attribute_status_get_type IA__g_file_attribute_status_get_type + +extern __typeof (g_file_attribute_type_get_type) IA__g_file_attribute_type_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_attribute_type_get_type IA__g_file_attribute_type_get_type + +extern __typeof (g_file_copy_flags_get_type) IA__g_file_copy_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_copy_flags_get_type IA__g_file_copy_flags_get_type + +extern __typeof (g_file_create_flags_get_type) IA__g_file_create_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_create_flags_get_type IA__g_file_create_flags_get_type + +extern __typeof (g_file_monitor_event_get_type) IA__g_file_monitor_event_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_monitor_event_get_type IA__g_file_monitor_event_get_type + +extern __typeof (g_file_monitor_flags_get_type) IA__g_file_monitor_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_monitor_flags_get_type IA__g_file_monitor_flags_get_type + +extern __typeof (g_file_query_info_flags_get_type) IA__g_file_query_info_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_query_info_flags_get_type IA__g_file_query_info_flags_get_type + +extern __typeof (g_file_type_get_type) IA__g_file_type_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_type_get_type IA__g_file_type_get_type + +extern __typeof (g_filesystem_preview_type_get_type) IA__g_filesystem_preview_type_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_filesystem_preview_type_get_type IA__g_filesystem_preview_type_get_type + +extern __typeof (g_io_error_enum_get_type) IA__g_io_error_enum_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_io_error_enum_get_type IA__g_io_error_enum_get_type + +extern __typeof (g_mount_mount_flags_get_type) IA__g_mount_mount_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_mount_mount_flags_get_type IA__g_mount_mount_flags_get_type + +extern __typeof (g_mount_operation_result_get_type) IA__g_mount_operation_result_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_mount_operation_result_get_type IA__g_mount_operation_result_get_type + +extern __typeof (g_drive_start_flags_get_type) IA__g_drive_start_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_drive_start_flags_get_type IA__g_drive_start_flags_get_type + +extern __typeof (g_drive_start_stop_type_get_type) IA__g_drive_start_stop_type_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_drive_start_stop_type_get_type IA__g_drive_start_stop_type_get_type + +extern __typeof (g_output_stream_splice_flags_get_type) IA__g_output_stream_splice_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_output_stream_splice_flags_get_type IA__g_output_stream_splice_flags_get_type + +extern __typeof (g_ask_password_flags_get_type) IA__g_ask_password_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_ask_password_flags_get_type IA__g_ask_password_flags_get_type + +extern __typeof (g_password_save_get_type) IA__g_password_save_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_password_save_get_type IA__g_password_save_get_type + +extern __typeof (g_emblem_origin_get_type) IA__g_emblem_origin_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_emblem_origin_get_type IA__g_emblem_origin_get_type + +extern __typeof (g_socket_family_get_type) IA__g_socket_family_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_family_get_type IA__g_socket_family_get_type + +extern __typeof (g_socket_type_get_type) IA__g_socket_type_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_type_get_type IA__g_socket_type_get_type + +extern __typeof (g_socket_protocol_get_type) IA__g_socket_protocol_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_protocol_get_type IA__g_socket_protocol_get_type + +extern __typeof (g_socket_msg_flags_get_type) IA__g_socket_msg_flags_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_msg_flags_get_type IA__g_socket_msg_flags_get_type + +extern __typeof (g_resolver_error_get_type) IA__g_resolver_error_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_resolver_error_get_type IA__g_resolver_error_get_type + +extern __typeof (g_zlib_compressor_format_get_type) IA__g_zlib_compressor_format_get_type __attribute((visibility("hidden"))); +#define g_zlib_compressor_format_get_type IA__g_zlib_compressor_format_get_type + +#endif +#endif +#if IN_HEADER(__G_EMBLEMED_ICON_H__) +#if IN_FILE(__G_EMBLEMED_ICON_C__) +extern __typeof (g_emblemed_icon_get_type) IA__g_emblemed_icon_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_emblemed_icon_get_type IA__g_emblemed_icon_get_type + +extern __typeof (g_emblemed_icon_new) IA__g_emblemed_icon_new __attribute((visibility("hidden"))); +#define g_emblemed_icon_new IA__g_emblemed_icon_new + +extern __typeof (g_emblemed_icon_get_icon) IA__g_emblemed_icon_get_icon __attribute((visibility("hidden"))); +#define g_emblemed_icon_get_icon IA__g_emblemed_icon_get_icon + +extern __typeof (g_emblemed_icon_get_emblems) IA__g_emblemed_icon_get_emblems __attribute((visibility("hidden"))); +#define g_emblemed_icon_get_emblems IA__g_emblemed_icon_get_emblems + +extern __typeof (g_emblemed_icon_add_emblem) IA__g_emblemed_icon_add_emblem __attribute((visibility("hidden"))); +#define g_emblemed_icon_add_emblem IA__g_emblemed_icon_add_emblem + +#endif +#endif +#if IN_HEADER(__G_EMBLEM_H__) +#if IN_FILE(__G_EMBLEM_C__) +extern __typeof (g_emblem_get_type) IA__g_emblem_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_emblem_get_type IA__g_emblem_get_type + +extern __typeof (g_emblem_new) IA__g_emblem_new __attribute((visibility("hidden"))); +#define g_emblem_new IA__g_emblem_new + +extern __typeof (g_emblem_new_with_origin) IA__g_emblem_new_with_origin __attribute((visibility("hidden"))); +#define g_emblem_new_with_origin IA__g_emblem_new_with_origin + +extern __typeof (g_emblem_get_icon) IA__g_emblem_get_icon __attribute((visibility("hidden"))); +#define g_emblem_get_icon IA__g_emblem_get_icon + +extern __typeof (g_emblem_get_origin) IA__g_emblem_get_origin __attribute((visibility("hidden"))); +#define g_emblem_get_origin IA__g_emblem_get_origin + +#endif +#endif +#if IN_HEADER(__G_INET_ADDRESS_H__) +#if IN_FILE(__G_INET_ADDRESS_C__) +extern __typeof (g_inet_address_new_from_string) IA__g_inet_address_new_from_string __attribute((visibility("hidden"))); +#define g_inet_address_new_from_string IA__g_inet_address_new_from_string + +extern __typeof (g_inet_address_new_from_bytes) IA__g_inet_address_new_from_bytes __attribute((visibility("hidden"))); +#define g_inet_address_new_from_bytes IA__g_inet_address_new_from_bytes + +extern __typeof (g_inet_address_new_any) IA__g_inet_address_new_any __attribute((visibility("hidden"))); +#define g_inet_address_new_any IA__g_inet_address_new_any + +extern __typeof (g_inet_address_new_loopback) IA__g_inet_address_new_loopback __attribute((visibility("hidden"))); +#define g_inet_address_new_loopback IA__g_inet_address_new_loopback + +extern __typeof (g_inet_address_get_family) IA__g_inet_address_get_family __attribute((visibility("hidden"))); +#define g_inet_address_get_family IA__g_inet_address_get_family + +extern __typeof (g_inet_address_get_type) IA__g_inet_address_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_inet_address_get_type IA__g_inet_address_get_type + +extern __typeof (g_inet_address_get_is_any) IA__g_inet_address_get_is_any __attribute((visibility("hidden"))); +#define g_inet_address_get_is_any IA__g_inet_address_get_is_any + +extern __typeof (g_inet_address_get_is_link_local) IA__g_inet_address_get_is_link_local __attribute((visibility("hidden"))); +#define g_inet_address_get_is_link_local IA__g_inet_address_get_is_link_local + +extern __typeof (g_inet_address_get_is_loopback) IA__g_inet_address_get_is_loopback __attribute((visibility("hidden"))); +#define g_inet_address_get_is_loopback IA__g_inet_address_get_is_loopback + +extern __typeof (g_inet_address_get_is_mc_global) IA__g_inet_address_get_is_mc_global __attribute((visibility("hidden"))); +#define g_inet_address_get_is_mc_global IA__g_inet_address_get_is_mc_global + +extern __typeof (g_inet_address_get_is_mc_link_local) IA__g_inet_address_get_is_mc_link_local __attribute((visibility("hidden"))); +#define g_inet_address_get_is_mc_link_local IA__g_inet_address_get_is_mc_link_local + +extern __typeof (g_inet_address_get_is_mc_node_local) IA__g_inet_address_get_is_mc_node_local __attribute((visibility("hidden"))); +#define g_inet_address_get_is_mc_node_local IA__g_inet_address_get_is_mc_node_local + +extern __typeof (g_inet_address_get_is_mc_org_local) IA__g_inet_address_get_is_mc_org_local __attribute((visibility("hidden"))); +#define g_inet_address_get_is_mc_org_local IA__g_inet_address_get_is_mc_org_local + +extern __typeof (g_inet_address_get_is_mc_site_local) IA__g_inet_address_get_is_mc_site_local __attribute((visibility("hidden"))); +#define g_inet_address_get_is_mc_site_local IA__g_inet_address_get_is_mc_site_local + +extern __typeof (g_inet_address_get_is_multicast) IA__g_inet_address_get_is_multicast __attribute((visibility("hidden"))); +#define g_inet_address_get_is_multicast IA__g_inet_address_get_is_multicast + +extern __typeof (g_inet_address_get_is_site_local) IA__g_inet_address_get_is_site_local __attribute((visibility("hidden"))); +#define g_inet_address_get_is_site_local IA__g_inet_address_get_is_site_local + +extern __typeof (g_inet_address_to_bytes) IA__g_inet_address_to_bytes __attribute((visibility("hidden"))); +#define g_inet_address_to_bytes IA__g_inet_address_to_bytes + +extern __typeof (g_inet_address_get_native_size) IA__g_inet_address_get_native_size __attribute((visibility("hidden"))); +#define g_inet_address_get_native_size IA__g_inet_address_get_native_size + +extern __typeof (g_inet_address_to_string) IA__g_inet_address_to_string __attribute((visibility("hidden"))); +#define g_inet_address_to_string IA__g_inet_address_to_string + +#endif +#endif +#if IN_HEADER(__G_INET_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_INET_SOCKET_ADDRESS_C__) +extern __typeof (g_inet_socket_address_get_address) IA__g_inet_socket_address_get_address __attribute((visibility("hidden"))); +#define g_inet_socket_address_get_address IA__g_inet_socket_address_get_address + +extern __typeof (g_inet_socket_address_get_port) IA__g_inet_socket_address_get_port __attribute((visibility("hidden"))); +#define g_inet_socket_address_get_port IA__g_inet_socket_address_get_port + +extern __typeof (g_inet_socket_address_get_type) IA__g_inet_socket_address_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_inet_socket_address_get_type IA__g_inet_socket_address_get_type + +extern __typeof (g_inet_socket_address_new) IA__g_inet_socket_address_new __attribute((visibility("hidden"))); +#define g_inet_socket_address_new IA__g_inet_socket_address_new + +#endif +#endif +#if IN_HEADER(__G_UNIX_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_UNIX_SOCKET_ADDRESS_C__) +#ifdef G_OS_UNIX +extern __typeof (g_unix_socket_address_get_type) IA__g_unix_socket_address_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_socket_address_get_type IA__g_unix_socket_address_get_type + +extern __typeof (g_unix_socket_address_new) IA__g_unix_socket_address_new __attribute((visibility("hidden"))); +#define g_unix_socket_address_new IA__g_unix_socket_address_new + +extern __typeof (g_unix_socket_address_new_abstract) IA__g_unix_socket_address_new_abstract __attribute((visibility("hidden"))); +#define g_unix_socket_address_new_abstract IA__g_unix_socket_address_new_abstract + +extern __typeof (g_unix_socket_address_abstract_names_supported) IA__g_unix_socket_address_abstract_names_supported __attribute((visibility("hidden"))); +#define g_unix_socket_address_abstract_names_supported IA__g_unix_socket_address_abstract_names_supported + +extern __typeof (g_unix_socket_address_get_is_abstract) IA__g_unix_socket_address_get_is_abstract __attribute((visibility("hidden"))); +#define g_unix_socket_address_get_is_abstract IA__g_unix_socket_address_get_is_abstract + +extern __typeof (g_unix_socket_address_get_path) IA__g_unix_socket_address_get_path __attribute((visibility("hidden"))); +#define g_unix_socket_address_get_path IA__g_unix_socket_address_get_path + +extern __typeof (g_unix_socket_address_get_path_len) IA__g_unix_socket_address_get_path_len __attribute((visibility("hidden"))); +#define g_unix_socket_address_get_path_len IA__g_unix_socket_address_get_path_len + +#endif +#endif +#endif +#if IN_HEADER(__G_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_SOCKET_ADDRESS_C__) +extern __typeof (g_socket_address_new_from_native) IA__g_socket_address_new_from_native __attribute((visibility("hidden"))); +#define g_socket_address_new_from_native IA__g_socket_address_new_from_native + +extern __typeof (g_socket_address_get_type) IA__g_socket_address_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_address_get_type IA__g_socket_address_get_type + +extern __typeof (g_socket_address_get_family) IA__g_socket_address_get_family __attribute((visibility("hidden"))); +#define g_socket_address_get_family IA__g_socket_address_get_family + +extern __typeof (g_socket_address_get_native_size) IA__g_socket_address_get_native_size __attribute((visibility("hidden"))); +#define g_socket_address_get_native_size IA__g_socket_address_get_native_size + +extern __typeof (g_socket_address_to_native) IA__g_socket_address_to_native __attribute((visibility("hidden"))); +#define g_socket_address_to_native IA__g_socket_address_to_native + +#endif +#endif +#if IN_HEADER(__G_RESOLVER_H__) +#if IN_FILE(__G_RESOLVER_C__) +extern __typeof (g_resolver_error_quark) IA__g_resolver_error_quark __attribute((visibility("hidden"))); +#define g_resolver_error_quark IA__g_resolver_error_quark + +extern __typeof (g_resolver_free_addresses) IA__g_resolver_free_addresses __attribute((visibility("hidden"))); +#define g_resolver_free_addresses IA__g_resolver_free_addresses + +extern __typeof (g_resolver_free_targets) IA__g_resolver_free_targets __attribute((visibility("hidden"))); +#define g_resolver_free_targets IA__g_resolver_free_targets + +extern __typeof (g_resolver_get_type) IA__g_resolver_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_resolver_get_type IA__g_resolver_get_type + +extern __typeof (g_resolver_get_default) IA__g_resolver_get_default __attribute((visibility("hidden"))); +#define g_resolver_get_default IA__g_resolver_get_default + +extern __typeof (g_resolver_set_default) IA__g_resolver_set_default __attribute((visibility("hidden"))); +#define g_resolver_set_default IA__g_resolver_set_default + +extern __typeof (g_resolver_lookup_by_name) IA__g_resolver_lookup_by_name __attribute((visibility("hidden"))); +#define g_resolver_lookup_by_name IA__g_resolver_lookup_by_name + +extern __typeof (g_resolver_lookup_by_name_async) IA__g_resolver_lookup_by_name_async __attribute((visibility("hidden"))); +#define g_resolver_lookup_by_name_async IA__g_resolver_lookup_by_name_async + +extern __typeof (g_resolver_lookup_by_name_finish) IA__g_resolver_lookup_by_name_finish __attribute((visibility("hidden"))); +#define g_resolver_lookup_by_name_finish IA__g_resolver_lookup_by_name_finish + +extern __typeof (g_resolver_lookup_by_address) IA__g_resolver_lookup_by_address __attribute((visibility("hidden"))); +#define g_resolver_lookup_by_address IA__g_resolver_lookup_by_address + +extern __typeof (g_resolver_lookup_by_address_async) IA__g_resolver_lookup_by_address_async __attribute((visibility("hidden"))); +#define g_resolver_lookup_by_address_async IA__g_resolver_lookup_by_address_async + +extern __typeof (g_resolver_lookup_by_address_finish) IA__g_resolver_lookup_by_address_finish __attribute((visibility("hidden"))); +#define g_resolver_lookup_by_address_finish IA__g_resolver_lookup_by_address_finish + +extern __typeof (g_resolver_lookup_service) IA__g_resolver_lookup_service __attribute((visibility("hidden"))); +#define g_resolver_lookup_service IA__g_resolver_lookup_service + +extern __typeof (g_resolver_lookup_service_async) IA__g_resolver_lookup_service_async __attribute((visibility("hidden"))); +#define g_resolver_lookup_service_async IA__g_resolver_lookup_service_async + +extern __typeof (g_resolver_lookup_service_finish) IA__g_resolver_lookup_service_finish __attribute((visibility("hidden"))); +#define g_resolver_lookup_service_finish IA__g_resolver_lookup_service_finish + +#endif +#endif +#if IN_HEADER(__G_THREADED_RESOLVER_H__) +#if IN_FILE(__G_THREADED_RESOLVER_C__) +extern __typeof (g_threaded_resolver_get_type) IA__g_threaded_resolver_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_threaded_resolver_get_type IA__g_threaded_resolver_get_type + +#endif +#endif +#if IN_HEADER(__G_UNIX_RESOLVER_H__) +#if IN_FILE(__G_UNIX_RESOLVER_C__) +#ifdef G_OS_UNIX +extern __typeof (g_unix_resolver_get_type) IA__g_unix_resolver_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_resolver_get_type IA__g_unix_resolver_get_type + +#endif +#endif +#endif +#if IN_HEADER(__G_WIN32_RESOLVER_H__) +#if IN_FILE(__G_WIN32_RESOLVER_C__) +#ifdef G_OS_WIN32 +extern __typeof (g_win32_resolver_get_type) IA__g_win32_resolver_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_win32_resolver_get_type IA__g_win32_resolver_get_type + +#endif +#endif +#endif +#if IN_HEADER(__G_SRV_TARGET_H__) +#if IN_FILE(__G_SRV_TARGET_C__) +extern __typeof (g_srv_target_get_type) IA__g_srv_target_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_srv_target_get_type IA__g_srv_target_get_type + +extern __typeof (g_srv_target_new) IA__g_srv_target_new __attribute((visibility("hidden"))); +#define g_srv_target_new IA__g_srv_target_new + +extern __typeof (g_srv_target_copy) IA__g_srv_target_copy __attribute((visibility("hidden"))); +#define g_srv_target_copy IA__g_srv_target_copy + +extern __typeof (g_srv_target_free) IA__g_srv_target_free __attribute((visibility("hidden"))); +#define g_srv_target_free IA__g_srv_target_free + +extern __typeof (g_srv_target_get_hostname) IA__g_srv_target_get_hostname __attribute((visibility("hidden"))); +#define g_srv_target_get_hostname IA__g_srv_target_get_hostname + +extern __typeof (g_srv_target_get_port) IA__g_srv_target_get_port __attribute((visibility("hidden"))); +#define g_srv_target_get_port IA__g_srv_target_get_port + +extern __typeof (g_srv_target_get_priority) IA__g_srv_target_get_priority __attribute((visibility("hidden"))); +#define g_srv_target_get_priority IA__g_srv_target_get_priority + +extern __typeof (g_srv_target_get_weight) IA__g_srv_target_get_weight __attribute((visibility("hidden"))); +#define g_srv_target_get_weight IA__g_srv_target_get_weight + +extern __typeof (g_srv_target_list_sort) IA__g_srv_target_list_sort __attribute((visibility("hidden"))); +#define g_srv_target_list_sort IA__g_srv_target_list_sort + +#endif +#endif +#if IN_HEADER(__G_NETWORK_ADDRESS_H__) +#if IN_FILE(__G_NETWORK_ADDRESS_C__) +extern __typeof (g_network_address_get_type) IA__g_network_address_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_network_address_get_type IA__g_network_address_get_type + +extern __typeof (g_network_address_get_hostname) IA__g_network_address_get_hostname __attribute((visibility("hidden"))); +#define g_network_address_get_hostname IA__g_network_address_get_hostname + +extern __typeof (g_network_address_get_port) IA__g_network_address_get_port __attribute((visibility("hidden"))); +#define g_network_address_get_port IA__g_network_address_get_port + +extern __typeof (g_network_address_new) IA__g_network_address_new __attribute((visibility("hidden"))); +#define g_network_address_new IA__g_network_address_new + +extern __typeof (g_network_address_parse) IA__g_network_address_parse __attribute((visibility("hidden"))); +#define g_network_address_parse IA__g_network_address_parse + +#endif +#endif +#if IN_HEADER(__G_NETWORK_SERVICE_H__) +#if IN_FILE(__G_NETWORK_SERVICE_C__) +extern __typeof (g_network_service_get_type) IA__g_network_service_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_network_service_get_type IA__g_network_service_get_type + +extern __typeof (g_network_service_get_service) IA__g_network_service_get_service __attribute((visibility("hidden"))); +#define g_network_service_get_service IA__g_network_service_get_service + +extern __typeof (g_network_service_get_protocol) IA__g_network_service_get_protocol __attribute((visibility("hidden"))); +#define g_network_service_get_protocol IA__g_network_service_get_protocol + +extern __typeof (g_network_service_get_domain) IA__g_network_service_get_domain __attribute((visibility("hidden"))); +#define g_network_service_get_domain IA__g_network_service_get_domain + +extern __typeof (g_network_service_new) IA__g_network_service_new __attribute((visibility("hidden"))); +#define g_network_service_new IA__g_network_service_new + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CONNECTABLE_H__) +#if IN_FILE(__G_SOCKET_CONNECTABLE_C__) +extern __typeof (g_socket_connectable_enumerate) IA__g_socket_connectable_enumerate __attribute((visibility("hidden"))); +#define g_socket_connectable_enumerate IA__g_socket_connectable_enumerate + +extern __typeof (g_socket_connectable_get_type) IA__g_socket_connectable_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_connectable_get_type IA__g_socket_connectable_get_type + +#endif +#endif +#if IN_HEADER(__G_SOCKET_ADDRESS_ENUMERATOR_H__) +#if IN_FILE(__G_SOCKET_ADDRESS_ENUMERATOR_C__) +extern __typeof (g_socket_address_enumerator_get_type) IA__g_socket_address_enumerator_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_address_enumerator_get_type IA__g_socket_address_enumerator_get_type + +extern __typeof (g_socket_address_enumerator_next) IA__g_socket_address_enumerator_next __attribute((visibility("hidden"))); +#define g_socket_address_enumerator_next IA__g_socket_address_enumerator_next + +extern __typeof (g_socket_address_enumerator_next_async) IA__g_socket_address_enumerator_next_async __attribute((visibility("hidden"))); +#define g_socket_address_enumerator_next_async IA__g_socket_address_enumerator_next_async + +extern __typeof (g_socket_address_enumerator_next_finish) IA__g_socket_address_enumerator_next_finish __attribute((visibility("hidden"))); +#define g_socket_address_enumerator_next_finish IA__g_socket_address_enumerator_next_finish + +#endif +#endif +#if IN_HEADER(__G_ASYNC_INITABLE_H__) +#if IN_FILE(__G_ASYNC_INITABLE_C__) +extern __typeof (g_async_initable_get_type) IA__g_async_initable_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_async_initable_get_type IA__g_async_initable_get_type + +extern __typeof (g_async_initable_init_async) IA__g_async_initable_init_async __attribute((visibility("hidden"))); +#define g_async_initable_init_async IA__g_async_initable_init_async + +extern __typeof (g_async_initable_init_finish) IA__g_async_initable_init_finish __attribute((visibility("hidden"))); +#define g_async_initable_init_finish IA__g_async_initable_init_finish + +extern __typeof (g_async_initable_new_async) IA__g_async_initable_new_async __attribute((visibility("hidden"))); +#define g_async_initable_new_async IA__g_async_initable_new_async + +extern __typeof (g_async_initable_new_finish) IA__g_async_initable_new_finish __attribute((visibility("hidden"))); +#define g_async_initable_new_finish IA__g_async_initable_new_finish + +extern __typeof (g_async_initable_new_valist_async) IA__g_async_initable_new_valist_async __attribute((visibility("hidden"))); +#define g_async_initable_new_valist_async IA__g_async_initable_new_valist_async + +extern __typeof (g_async_initable_newv_async) IA__g_async_initable_newv_async __attribute((visibility("hidden"))); +#define g_async_initable_newv_async IA__g_async_initable_newv_async + +#endif +#endif +#if IN_HEADER(__G_INITABLE_H__) +#if IN_FILE(__G_INITABLE_C__) +extern __typeof (g_initable_get_type) IA__g_initable_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_initable_get_type IA__g_initable_get_type + +extern __typeof (g_initable_init) IA__g_initable_init __attribute((visibility("hidden"))); +#define g_initable_init IA__g_initable_init + +extern __typeof (g_initable_new) IA__g_initable_new __attribute((visibility("hidden"))); +#define g_initable_new IA__g_initable_new + +extern __typeof (g_initable_newv) IA__g_initable_newv __attribute((visibility("hidden"))); +#define g_initable_newv IA__g_initable_newv + +extern __typeof (g_initable_new_valist) IA__g_initable_new_valist __attribute((visibility("hidden"))); +#define g_initable_new_valist IA__g_initable_new_valist + +#endif +#endif +#if IN_HEADER(__G_SOCKET_H__) +#if IN_FILE(__G_SOCKET_C__) +extern __typeof (g_socket_get_type) IA__g_socket_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_get_type IA__g_socket_get_type + +extern __typeof (g_socket_accept) IA__g_socket_accept __attribute((visibility("hidden"))); +#define g_socket_accept IA__g_socket_accept + +extern __typeof (g_socket_bind) IA__g_socket_bind __attribute((visibility("hidden"))); +#define g_socket_bind IA__g_socket_bind + +extern __typeof (g_socket_check_connect_result) IA__g_socket_check_connect_result __attribute((visibility("hidden"))); +#define g_socket_check_connect_result IA__g_socket_check_connect_result + +extern __typeof (g_socket_close) IA__g_socket_close __attribute((visibility("hidden"))); +#define g_socket_close IA__g_socket_close + +extern __typeof (g_socket_shutdown) IA__g_socket_shutdown __attribute((visibility("hidden"))); +#define g_socket_shutdown IA__g_socket_shutdown + +extern __typeof (g_socket_condition_check) IA__g_socket_condition_check __attribute((visibility("hidden"))); +#define g_socket_condition_check IA__g_socket_condition_check + +extern __typeof (g_socket_condition_wait) IA__g_socket_condition_wait __attribute((visibility("hidden"))); +#define g_socket_condition_wait IA__g_socket_condition_wait + +extern __typeof (g_socket_connect) IA__g_socket_connect __attribute((visibility("hidden"))); +#define g_socket_connect IA__g_socket_connect + +extern __typeof (g_socket_create_source) IA__g_socket_create_source __attribute((visibility("hidden"))); +#define g_socket_create_source IA__g_socket_create_source + +extern __typeof (g_socket_get_blocking) IA__g_socket_get_blocking __attribute((visibility("hidden"))); +#define g_socket_get_blocking IA__g_socket_get_blocking + +extern __typeof (g_socket_get_family) IA__g_socket_get_family __attribute((visibility("hidden"))); +#define g_socket_get_family IA__g_socket_get_family + +extern __typeof (g_socket_get_fd) IA__g_socket_get_fd __attribute((visibility("hidden"))); +#define g_socket_get_fd IA__g_socket_get_fd + +extern __typeof (g_socket_get_keepalive) IA__g_socket_get_keepalive __attribute((visibility("hidden"))); +#define g_socket_get_keepalive IA__g_socket_get_keepalive + +extern __typeof (g_socket_get_listen_backlog) IA__g_socket_get_listen_backlog __attribute((visibility("hidden"))); +#define g_socket_get_listen_backlog IA__g_socket_get_listen_backlog + +extern __typeof (g_socket_get_local_address) IA__g_socket_get_local_address __attribute((visibility("hidden"))); +#define g_socket_get_local_address IA__g_socket_get_local_address + +extern __typeof (g_socket_get_protocol) IA__g_socket_get_protocol __attribute((visibility("hidden"))); +#define g_socket_get_protocol IA__g_socket_get_protocol + +extern __typeof (g_socket_get_remote_address) IA__g_socket_get_remote_address __attribute((visibility("hidden"))); +#define g_socket_get_remote_address IA__g_socket_get_remote_address + +extern __typeof (g_socket_get_socket_type) IA__g_socket_get_socket_type __attribute((visibility("hidden"))); +#define g_socket_get_socket_type IA__g_socket_get_socket_type + +extern __typeof (g_socket_is_closed) IA__g_socket_is_closed __attribute((visibility("hidden"))); +#define g_socket_is_closed IA__g_socket_is_closed + +extern __typeof (g_socket_is_connected) IA__g_socket_is_connected __attribute((visibility("hidden"))); +#define g_socket_is_connected IA__g_socket_is_connected + +extern __typeof (g_socket_listen) IA__g_socket_listen __attribute((visibility("hidden"))); +#define g_socket_listen IA__g_socket_listen + +extern __typeof (g_socket_new) IA__g_socket_new __attribute((visibility("hidden"))); +#define g_socket_new IA__g_socket_new + +extern __typeof (g_socket_new_from_fd) IA__g_socket_new_from_fd __attribute((visibility("hidden"))); +#define g_socket_new_from_fd IA__g_socket_new_from_fd + +extern __typeof (g_socket_receive) IA__g_socket_receive __attribute((visibility("hidden"))); +#define g_socket_receive IA__g_socket_receive + +extern __typeof (g_socket_receive_from) IA__g_socket_receive_from __attribute((visibility("hidden"))); +#define g_socket_receive_from IA__g_socket_receive_from + +extern __typeof (g_socket_receive_message) IA__g_socket_receive_message __attribute((visibility("hidden"))); +#define g_socket_receive_message IA__g_socket_receive_message + +extern __typeof (g_socket_send) IA__g_socket_send __attribute((visibility("hidden"))); +#define g_socket_send IA__g_socket_send + +extern __typeof (g_socket_send_message) IA__g_socket_send_message __attribute((visibility("hidden"))); +#define g_socket_send_message IA__g_socket_send_message + +extern __typeof (g_socket_send_to) IA__g_socket_send_to __attribute((visibility("hidden"))); +#define g_socket_send_to IA__g_socket_send_to + +extern __typeof (g_socket_set_blocking) IA__g_socket_set_blocking __attribute((visibility("hidden"))); +#define g_socket_set_blocking IA__g_socket_set_blocking + +extern __typeof (g_socket_set_keepalive) IA__g_socket_set_keepalive __attribute((visibility("hidden"))); +#define g_socket_set_keepalive IA__g_socket_set_keepalive + +extern __typeof (g_socket_set_listen_backlog) IA__g_socket_set_listen_backlog __attribute((visibility("hidden"))); +#define g_socket_set_listen_backlog IA__g_socket_set_listen_backlog + +extern __typeof (g_socket_speaks_ipv4) IA__g_socket_speaks_ipv4 __attribute((visibility("hidden"))); +#define g_socket_speaks_ipv4 IA__g_socket_speaks_ipv4 + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CONTROL_MESSAGE_H__) +#if IN_FILE(__G_SOCKET_CONTROL_MESSAGE_C__) +extern __typeof (g_socket_control_message_get_type) IA__g_socket_control_message_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_control_message_get_type IA__g_socket_control_message_get_type + +extern __typeof (g_socket_control_message_deserialize) IA__g_socket_control_message_deserialize __attribute((visibility("hidden"))); +#define g_socket_control_message_deserialize IA__g_socket_control_message_deserialize + +extern __typeof (g_socket_control_message_get_level) IA__g_socket_control_message_get_level __attribute((visibility("hidden"))); +#define g_socket_control_message_get_level IA__g_socket_control_message_get_level + +extern __typeof (g_socket_control_message_get_msg_type) IA__g_socket_control_message_get_msg_type __attribute((visibility("hidden"))); +#define g_socket_control_message_get_msg_type IA__g_socket_control_message_get_msg_type + +extern __typeof (g_socket_control_message_get_size) IA__g_socket_control_message_get_size __attribute((visibility("hidden"))); +#define g_socket_control_message_get_size IA__g_socket_control_message_get_size + +extern __typeof (g_socket_control_message_serialize) IA__g_socket_control_message_serialize __attribute((visibility("hidden"))); +#define g_socket_control_message_serialize IA__g_socket_control_message_serialize + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CLIENT_H__) +#if IN_FILE(__G_SOCKET_CLIENT_C__) +extern __typeof (g_socket_client_get_type) IA__g_socket_client_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_client_get_type IA__g_socket_client_get_type + +extern __typeof (g_socket_client_connect) IA__g_socket_client_connect __attribute((visibility("hidden"))); +#define g_socket_client_connect IA__g_socket_client_connect + +extern __typeof (g_socket_client_connect_async) IA__g_socket_client_connect_async __attribute((visibility("hidden"))); +#define g_socket_client_connect_async IA__g_socket_client_connect_async + +extern __typeof (g_socket_client_connect_finish) IA__g_socket_client_connect_finish __attribute((visibility("hidden"))); +#define g_socket_client_connect_finish IA__g_socket_client_connect_finish + +extern __typeof (g_socket_client_connect_to_host) IA__g_socket_client_connect_to_host __attribute((visibility("hidden"))); +#define g_socket_client_connect_to_host IA__g_socket_client_connect_to_host + +extern __typeof (g_socket_client_connect_to_host_async) IA__g_socket_client_connect_to_host_async __attribute((visibility("hidden"))); +#define g_socket_client_connect_to_host_async IA__g_socket_client_connect_to_host_async + +extern __typeof (g_socket_client_connect_to_host_finish) IA__g_socket_client_connect_to_host_finish __attribute((visibility("hidden"))); +#define g_socket_client_connect_to_host_finish IA__g_socket_client_connect_to_host_finish + +extern __typeof (g_socket_client_connect_to_service) IA__g_socket_client_connect_to_service __attribute((visibility("hidden"))); +#define g_socket_client_connect_to_service IA__g_socket_client_connect_to_service + +extern __typeof (g_socket_client_connect_to_service_async) IA__g_socket_client_connect_to_service_async __attribute((visibility("hidden"))); +#define g_socket_client_connect_to_service_async IA__g_socket_client_connect_to_service_async + +extern __typeof (g_socket_client_connect_to_service_finish) IA__g_socket_client_connect_to_service_finish __attribute((visibility("hidden"))); +#define g_socket_client_connect_to_service_finish IA__g_socket_client_connect_to_service_finish + +extern __typeof (g_socket_client_get_family) IA__g_socket_client_get_family __attribute((visibility("hidden"))); +#define g_socket_client_get_family IA__g_socket_client_get_family + +extern __typeof (g_socket_client_get_local_address) IA__g_socket_client_get_local_address __attribute((visibility("hidden"))); +#define g_socket_client_get_local_address IA__g_socket_client_get_local_address + +extern __typeof (g_socket_client_get_protocol) IA__g_socket_client_get_protocol __attribute((visibility("hidden"))); +#define g_socket_client_get_protocol IA__g_socket_client_get_protocol + +extern __typeof (g_socket_client_get_socket_type) IA__g_socket_client_get_socket_type __attribute((visibility("hidden"))); +#define g_socket_client_get_socket_type IA__g_socket_client_get_socket_type + +extern __typeof (g_socket_client_new) IA__g_socket_client_new __attribute((visibility("hidden"))); +#define g_socket_client_new IA__g_socket_client_new + +extern __typeof (g_socket_client_set_family) IA__g_socket_client_set_family __attribute((visibility("hidden"))); +#define g_socket_client_set_family IA__g_socket_client_set_family + +extern __typeof (g_socket_client_set_local_address) IA__g_socket_client_set_local_address __attribute((visibility("hidden"))); +#define g_socket_client_set_local_address IA__g_socket_client_set_local_address + +extern __typeof (g_socket_client_set_protocol) IA__g_socket_client_set_protocol __attribute((visibility("hidden"))); +#define g_socket_client_set_protocol IA__g_socket_client_set_protocol + +extern __typeof (g_socket_client_set_socket_type) IA__g_socket_client_set_socket_type __attribute((visibility("hidden"))); +#define g_socket_client_set_socket_type IA__g_socket_client_set_socket_type + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CONNECTION_H__) +#if IN_FILE(__G_SOCKET_CONNECTION_C__) +extern __typeof (g_socket_connection_get_type) IA__g_socket_connection_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_connection_get_type IA__g_socket_connection_get_type + +extern __typeof (g_socket_connection_factory_create_connection) IA__g_socket_connection_factory_create_connection __attribute((visibility("hidden"))); +#define g_socket_connection_factory_create_connection IA__g_socket_connection_factory_create_connection + +extern __typeof (g_socket_connection_factory_lookup_type) IA__g_socket_connection_factory_lookup_type __attribute((visibility("hidden"))); +#define g_socket_connection_factory_lookup_type IA__g_socket_connection_factory_lookup_type + +extern __typeof (g_socket_connection_factory_register_type) IA__g_socket_connection_factory_register_type __attribute((visibility("hidden"))); +#define g_socket_connection_factory_register_type IA__g_socket_connection_factory_register_type + +extern __typeof (g_socket_connection_get_local_address) IA__g_socket_connection_get_local_address __attribute((visibility("hidden"))); +#define g_socket_connection_get_local_address IA__g_socket_connection_get_local_address + +extern __typeof (g_socket_connection_get_remote_address) IA__g_socket_connection_get_remote_address __attribute((visibility("hidden"))); +#define g_socket_connection_get_remote_address IA__g_socket_connection_get_remote_address + +extern __typeof (g_socket_connection_get_socket) IA__g_socket_connection_get_socket __attribute((visibility("hidden"))); +#define g_socket_connection_get_socket IA__g_socket_connection_get_socket + +#endif +#endif +#if IN_HEADER(__G_SOCKET_LISTENER_H__) +#if IN_FILE(__G_SOCKET_LISTENER_C__) +extern __typeof (g_socket_listener_get_type) IA__g_socket_listener_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_listener_get_type IA__g_socket_listener_get_type + +extern __typeof (g_socket_listener_accept) IA__g_socket_listener_accept __attribute((visibility("hidden"))); +#define g_socket_listener_accept IA__g_socket_listener_accept + +extern __typeof (g_socket_listener_accept_async) IA__g_socket_listener_accept_async __attribute((visibility("hidden"))); +#define g_socket_listener_accept_async IA__g_socket_listener_accept_async + +extern __typeof (g_socket_listener_accept_finish) IA__g_socket_listener_accept_finish __attribute((visibility("hidden"))); +#define g_socket_listener_accept_finish IA__g_socket_listener_accept_finish + +extern __typeof (g_socket_listener_accept_socket) IA__g_socket_listener_accept_socket __attribute((visibility("hidden"))); +#define g_socket_listener_accept_socket IA__g_socket_listener_accept_socket + +extern __typeof (g_socket_listener_accept_socket_async) IA__g_socket_listener_accept_socket_async __attribute((visibility("hidden"))); +#define g_socket_listener_accept_socket_async IA__g_socket_listener_accept_socket_async + +extern __typeof (g_socket_listener_accept_socket_finish) IA__g_socket_listener_accept_socket_finish __attribute((visibility("hidden"))); +#define g_socket_listener_accept_socket_finish IA__g_socket_listener_accept_socket_finish + +extern __typeof (g_socket_listener_add_address) IA__g_socket_listener_add_address __attribute((visibility("hidden"))); +#define g_socket_listener_add_address IA__g_socket_listener_add_address + +extern __typeof (g_socket_listener_add_inet_port) IA__g_socket_listener_add_inet_port __attribute((visibility("hidden"))); +#define g_socket_listener_add_inet_port IA__g_socket_listener_add_inet_port + +extern __typeof (g_socket_listener_add_any_inet_port) IA__g_socket_listener_add_any_inet_port __attribute((visibility("hidden"))); +#define g_socket_listener_add_any_inet_port IA__g_socket_listener_add_any_inet_port + +extern __typeof (g_socket_listener_add_socket) IA__g_socket_listener_add_socket __attribute((visibility("hidden"))); +#define g_socket_listener_add_socket IA__g_socket_listener_add_socket + +extern __typeof (g_socket_listener_close) IA__g_socket_listener_close __attribute((visibility("hidden"))); +#define g_socket_listener_close IA__g_socket_listener_close + +extern __typeof (g_socket_listener_new) IA__g_socket_listener_new __attribute((visibility("hidden"))); +#define g_socket_listener_new IA__g_socket_listener_new + +extern __typeof (g_socket_listener_set_backlog) IA__g_socket_listener_set_backlog __attribute((visibility("hidden"))); +#define g_socket_listener_set_backlog IA__g_socket_listener_set_backlog + +#endif +#endif +#if IN_HEADER(__G_SOCKET_SERVICE_H__) +#if IN_FILE(__G_SOCKET_SERVICE_C__) +extern __typeof (g_socket_service_get_type) IA__g_socket_service_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_socket_service_get_type IA__g_socket_service_get_type + +extern __typeof (g_socket_service_is_active) IA__g_socket_service_is_active __attribute((visibility("hidden"))); +#define g_socket_service_is_active IA__g_socket_service_is_active + +extern __typeof (g_socket_service_new) IA__g_socket_service_new __attribute((visibility("hidden"))); +#define g_socket_service_new IA__g_socket_service_new + +extern __typeof (g_socket_service_start) IA__g_socket_service_start __attribute((visibility("hidden"))); +#define g_socket_service_start IA__g_socket_service_start + +extern __typeof (g_socket_service_stop) IA__g_socket_service_stop __attribute((visibility("hidden"))); +#define g_socket_service_stop IA__g_socket_service_stop + +#endif +#endif +#if IN_HEADER(__G_THREADED_SOCKET_SERVICE_H__) +#if IN_FILE(__G_THREADED_SOCKET_SERVICE_C__) +extern __typeof (g_threaded_socket_service_get_type) IA__g_threaded_socket_service_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_threaded_socket_service_get_type IA__g_threaded_socket_service_get_type + +extern __typeof (g_threaded_socket_service_new) IA__g_threaded_socket_service_new __attribute((visibility("hidden"))); +#define g_threaded_socket_service_new IA__g_threaded_socket_service_new + +#endif +#endif +#if IN_HEADER(__G_TCP_CONNECTION_H__) +#if IN_FILE(__G_TCP_CONNECTION_C__) +extern __typeof (g_tcp_connection_get_type) IA__g_tcp_connection_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_tcp_connection_get_type IA__g_tcp_connection_get_type + +extern __typeof (g_tcp_connection_set_graceful_disconnect) IA__g_tcp_connection_set_graceful_disconnect __attribute((visibility("hidden"))); +#define g_tcp_connection_set_graceful_disconnect IA__g_tcp_connection_set_graceful_disconnect + +extern __typeof (g_tcp_connection_get_graceful_disconnect) IA__g_tcp_connection_get_graceful_disconnect __attribute((visibility("hidden"))); +#define g_tcp_connection_get_graceful_disconnect IA__g_tcp_connection_get_graceful_disconnect + +#endif +#endif +#if IN_HEADER(__G_UNIX_CONNECTION_H__) +#if IN_FILE(__G_UNIX_CONNECTION_C__) +#ifndef G_OS_WIN32 +extern __typeof (g_unix_connection_get_type) IA__g_unix_connection_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_connection_get_type IA__g_unix_connection_get_type + +extern __typeof (g_unix_connection_receive_fd) IA__g_unix_connection_receive_fd __attribute((visibility("hidden"))); +#define g_unix_connection_receive_fd IA__g_unix_connection_receive_fd + +extern __typeof (g_unix_connection_send_fd) IA__g_unix_connection_send_fd __attribute((visibility("hidden"))); +#define g_unix_connection_send_fd IA__g_unix_connection_send_fd + +#endif +#endif +#endif +#if IN_HEADER(__G_UNIX_FD_MESSAGE_H__) +#if IN_FILE(__G_UNIX_FD_MESSAGE_C__) +#ifndef G_OS_WIN32 +extern __typeof (g_unix_fd_message_get_type) IA__g_unix_fd_message_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_fd_message_get_type IA__g_unix_fd_message_get_type + +extern __typeof (g_unix_fd_message_append_fd) IA__g_unix_fd_message_append_fd __attribute((visibility("hidden"))); +#define g_unix_fd_message_append_fd IA__g_unix_fd_message_append_fd + +extern __typeof (g_unix_fd_message_new) IA__g_unix_fd_message_new __attribute((visibility("hidden"))); +#define g_unix_fd_message_new IA__g_unix_fd_message_new + +extern __typeof (g_unix_fd_message_steal_fds) IA__g_unix_fd_message_steal_fds __attribute((visibility("hidden"))); +#define g_unix_fd_message_steal_fds IA__g_unix_fd_message_steal_fds + +extern __typeof (g_unix_fd_message_get_fd_list) IA__g_unix_fd_message_get_fd_list __attribute((visibility("hidden"))); +#define g_unix_fd_message_get_fd_list IA__g_unix_fd_message_get_fd_list + +extern __typeof (g_unix_fd_message_new_with_fd_list) IA__g_unix_fd_message_new_with_fd_list __attribute((visibility("hidden"))); +#define g_unix_fd_message_new_with_fd_list IA__g_unix_fd_message_new_with_fd_list + +#endif +#endif +#endif +#if IN_HEADER(__G_UNIX_FD_LIST_H__) +#if IN_FILE(__G_UNIX_FD_LIST_C__) +#ifndef G_OS_WIN32 +extern __typeof (g_unix_fd_list_append) IA__g_unix_fd_list_append __attribute((visibility("hidden"))); +#define g_unix_fd_list_append IA__g_unix_fd_list_append + +extern __typeof (g_unix_fd_list_get) IA__g_unix_fd_list_get __attribute((visibility("hidden"))); +#define g_unix_fd_list_get IA__g_unix_fd_list_get + +extern __typeof (g_unix_fd_list_get_length) IA__g_unix_fd_list_get_length __attribute((visibility("hidden"))); +#define g_unix_fd_list_get_length IA__g_unix_fd_list_get_length + +extern __typeof (g_unix_fd_list_get_type) IA__g_unix_fd_list_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unix_fd_list_get_type IA__g_unix_fd_list_get_type + +extern __typeof (g_unix_fd_list_new) IA__g_unix_fd_list_new __attribute((visibility("hidden"))); +#define g_unix_fd_list_new IA__g_unix_fd_list_new + +extern __typeof (g_unix_fd_list_new_from_array) IA__g_unix_fd_list_new_from_array __attribute((visibility("hidden"))); +#define g_unix_fd_list_new_from_array IA__g_unix_fd_list_new_from_array + +extern __typeof (g_unix_fd_list_peek_fds) IA__g_unix_fd_list_peek_fds __attribute((visibility("hidden"))); +#define g_unix_fd_list_peek_fds IA__g_unix_fd_list_peek_fds + +extern __typeof (g_unix_fd_list_steal_fds) IA__g_unix_fd_list_steal_fds __attribute((visibility("hidden"))); +#define g_unix_fd_list_steal_fds IA__g_unix_fd_list_steal_fds + +#endif +#endif +#endif +#if IN_HEADER(__G_ZLIB_COMPRESSOR_H__) +#if IN_FILE(__G_ZLIB_COMPRESSOR_C__) +extern __typeof (g_zlib_compressor_get_type) IA__g_zlib_compressor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_zlib_compressor_get_type IA__g_zlib_compressor_get_type + +extern __typeof (g_zlib_compressor_new) IA__g_zlib_compressor_new __attribute((visibility("hidden"))); +#define g_zlib_compressor_new IA__g_zlib_compressor_new + +#endif +#endif +#if IN_HEADER(__G_ZLIB_DECOMPRESSOR_H__) +#if IN_FILE(__G_ZLIB_DECOMPRESSOR_C__) +extern __typeof (g_zlib_decompressor_get_type) IA__g_zlib_decompressor_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_zlib_decompressor_get_type IA__g_zlib_decompressor_get_type + +extern __typeof (g_zlib_decompressor_new) IA__g_zlib_decompressor_new __attribute((visibility("hidden"))); +#define g_zlib_decompressor_new IA__g_zlib_decompressor_new + +#endif +#endif +#if IN_HEADER(__G_FILE_DESCRIPTOR_BASED_H__) +#if IN_FILE(__G_FILE_DESCRIPTOR_BASED_C__) +extern __typeof (g_file_descriptor_based_get_type) IA__g_file_descriptor_based_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_file_descriptor_based_get_type IA__g_file_descriptor_based_get_type + +extern __typeof (g_file_descriptor_based_get_fd) IA__g_file_descriptor_based_get_fd __attribute((visibility("hidden"))); +#define g_file_descriptor_based_get_fd IA__g_file_descriptor_based_get_fd + +#endif +#endif + +#endif /* G_HAVE_GNUC_VISIBILITY */ +#endif /* DISABLE_VISIBILITY */ diff --git a/gio/gioaliasdef.c b/gio/gioaliasdef.c new file mode 100644 index 0000000..6af8b5f --- /dev/null +++ b/gio/gioaliasdef.c @@ -0,0 +1,3011 @@ +/* Generated by makegioalias.pl */ + +#ifndef DISABLE_VISIBILITY + +#include "glib.h" + +#ifdef G_HAVE_GNUC_VISIBILITY + +#undef IN_FILE +#define IN_FILE defined + +#undef IN_HEADER +#define IN_HEADER(x) 1 + +#if IN_HEADER(__G_VFS_H__) +#if IN_FILE(__G_VFS_C__) +#undef g_vfs_get_type +extern __typeof (g_vfs_get_type) g_vfs_get_type __attribute((alias("IA__g_vfs_get_type"), visibility("default"))); + +#undef g_vfs_is_active +extern __typeof (g_vfs_is_active) g_vfs_is_active __attribute((alias("IA__g_vfs_is_active"), visibility("default"))); + +#undef g_vfs_get_file_for_path +extern __typeof (g_vfs_get_file_for_path) g_vfs_get_file_for_path __attribute((alias("IA__g_vfs_get_file_for_path"), visibility("default"))); + +#undef g_vfs_get_file_for_uri +extern __typeof (g_vfs_get_file_for_uri) g_vfs_get_file_for_uri __attribute((alias("IA__g_vfs_get_file_for_uri"), visibility("default"))); + +#undef g_vfs_get_supported_uri_schemes +extern __typeof (g_vfs_get_supported_uri_schemes) g_vfs_get_supported_uri_schemes __attribute((alias("IA__g_vfs_get_supported_uri_schemes"), visibility("default"))); + +#undef g_vfs_parse_name +extern __typeof (g_vfs_parse_name) g_vfs_parse_name __attribute((alias("IA__g_vfs_parse_name"), visibility("default"))); + +#undef g_vfs_get_default +extern __typeof (g_vfs_get_default) g_vfs_get_default __attribute((alias("IA__g_vfs_get_default"), visibility("default"))); + +#undef g_vfs_get_local +extern __typeof (g_vfs_get_local) g_vfs_get_local __attribute((alias("IA__g_vfs_get_local"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_APP_INFO_H__) +#if IN_FILE(__G_APP_INFO_C__) +#undef g_app_info_get_type +extern __typeof (g_app_info_get_type) g_app_info_get_type __attribute((alias("IA__g_app_info_get_type"), visibility("default"))); + +#undef g_app_launch_context_get_type +extern __typeof (g_app_launch_context_get_type) g_app_launch_context_get_type __attribute((alias("IA__g_app_launch_context_get_type"), visibility("default"))); + +#undef g_app_info_dup +extern __typeof (g_app_info_dup) g_app_info_dup __attribute((alias("IA__g_app_info_dup"), visibility("default"))); + +#undef g_app_info_equal +extern __typeof (g_app_info_equal) g_app_info_equal __attribute((alias("IA__g_app_info_equal"), visibility("default"))); + +#undef g_app_info_get_id +extern __typeof (g_app_info_get_id) g_app_info_get_id __attribute((alias("IA__g_app_info_get_id"), visibility("default"))); + +#undef g_app_info_get_name +extern __typeof (g_app_info_get_name) g_app_info_get_name __attribute((alias("IA__g_app_info_get_name"), visibility("default"))); + +#undef g_app_info_get_display_name +extern __typeof (g_app_info_get_display_name) g_app_info_get_display_name __attribute((alias("IA__g_app_info_get_display_name"), visibility("default"))); + +#undef g_app_info_get_description +extern __typeof (g_app_info_get_description) g_app_info_get_description __attribute((alias("IA__g_app_info_get_description"), visibility("default"))); + +#undef g_app_info_get_executable +extern __typeof (g_app_info_get_executable) g_app_info_get_executable __attribute((alias("IA__g_app_info_get_executable"), visibility("default"))); + +#undef g_app_info_get_commandline +extern __typeof (g_app_info_get_commandline) g_app_info_get_commandline __attribute((alias("IA__g_app_info_get_commandline"), visibility("default"))); + +#undef g_app_info_get_icon +extern __typeof (g_app_info_get_icon) g_app_info_get_icon __attribute((alias("IA__g_app_info_get_icon"), visibility("default"))); + +#undef g_app_info_launch +extern __typeof (g_app_info_launch) g_app_info_launch __attribute((alias("IA__g_app_info_launch"), visibility("default"))); + +#undef g_app_info_supports_uris +extern __typeof (g_app_info_supports_uris) g_app_info_supports_uris __attribute((alias("IA__g_app_info_supports_uris"), visibility("default"))); + +#undef g_app_info_supports_files +extern __typeof (g_app_info_supports_files) g_app_info_supports_files __attribute((alias("IA__g_app_info_supports_files"), visibility("default"))); + +#undef g_app_info_launch_uris +extern __typeof (g_app_info_launch_uris) g_app_info_launch_uris __attribute((alias("IA__g_app_info_launch_uris"), visibility("default"))); + +#undef g_app_info_should_show +extern __typeof (g_app_info_should_show) g_app_info_should_show __attribute((alias("IA__g_app_info_should_show"), visibility("default"))); + +#undef g_app_info_set_as_default_for_type +extern __typeof (g_app_info_set_as_default_for_type) g_app_info_set_as_default_for_type __attribute((alias("IA__g_app_info_set_as_default_for_type"), visibility("default"))); + +#undef g_app_info_set_as_default_for_extension +extern __typeof (g_app_info_set_as_default_for_extension) g_app_info_set_as_default_for_extension __attribute((alias("IA__g_app_info_set_as_default_for_extension"), visibility("default"))); + +#undef g_app_info_add_supports_type +extern __typeof (g_app_info_add_supports_type) g_app_info_add_supports_type __attribute((alias("IA__g_app_info_add_supports_type"), visibility("default"))); + +#undef g_app_info_can_remove_supports_type +extern __typeof (g_app_info_can_remove_supports_type) g_app_info_can_remove_supports_type __attribute((alias("IA__g_app_info_can_remove_supports_type"), visibility("default"))); + +#undef g_app_info_remove_supports_type +extern __typeof (g_app_info_remove_supports_type) g_app_info_remove_supports_type __attribute((alias("IA__g_app_info_remove_supports_type"), visibility("default"))); + +#undef g_app_info_launch_default_for_uri +extern __typeof (g_app_info_launch_default_for_uri) g_app_info_launch_default_for_uri __attribute((alias("IA__g_app_info_launch_default_for_uri"), visibility("default"))); + +#undef g_app_info_can_delete +extern __typeof (g_app_info_can_delete) g_app_info_can_delete __attribute((alias("IA__g_app_info_can_delete"), visibility("default"))); + +#undef g_app_info_delete +extern __typeof (g_app_info_delete) g_app_info_delete __attribute((alias("IA__g_app_info_delete"), visibility("default"))); + +#undef g_app_launch_context_new +extern __typeof (g_app_launch_context_new) g_app_launch_context_new __attribute((alias("IA__g_app_launch_context_new"), visibility("default"))); + +#undef g_app_launch_context_get_display +extern __typeof (g_app_launch_context_get_display) g_app_launch_context_get_display __attribute((alias("IA__g_app_launch_context_get_display"), visibility("default"))); + +#undef g_app_launch_context_get_startup_notify_id +extern __typeof (g_app_launch_context_get_startup_notify_id) g_app_launch_context_get_startup_notify_id __attribute((alias("IA__g_app_launch_context_get_startup_notify_id"), visibility("default"))); + +#undef g_app_launch_context_launch_failed +extern __typeof (g_app_launch_context_launch_failed) g_app_launch_context_launch_failed __attribute((alias("IA__g_app_launch_context_launch_failed"), visibility("default"))); + +#endif +#if IN_FILE(__G_DESKTOP_APP_INFO_C__) +#undef g_app_info_create_from_commandline +extern __typeof (g_app_info_create_from_commandline) g_app_info_create_from_commandline __attribute((alias("IA__g_app_info_create_from_commandline"), visibility("default"))); + +#undef g_app_info_get_all +extern __typeof (g_app_info_get_all) g_app_info_get_all __attribute((alias("IA__g_app_info_get_all"), visibility("default"))); + +#undef g_app_info_get_all_for_type +extern __typeof (g_app_info_get_all_for_type) g_app_info_get_all_for_type __attribute((alias("IA__g_app_info_get_all_for_type"), visibility("default"))); + +#undef g_app_info_get_default_for_type +extern __typeof (g_app_info_get_default_for_type) g_app_info_get_default_for_type __attribute((alias("IA__g_app_info_get_default_for_type"), visibility("default"))); + +#undef g_app_info_get_default_for_uri_scheme +extern __typeof (g_app_info_get_default_for_uri_scheme) g_app_info_get_default_for_uri_scheme __attribute((alias("IA__g_app_info_get_default_for_uri_scheme"), visibility("default"))); + +#undef g_app_info_reset_type_associations +extern __typeof (g_app_info_reset_type_associations) g_app_info_reset_type_associations __attribute((alias("IA__g_app_info_reset_type_associations"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DESKTOP_APP_INFO_H__) +#if IN_FILE(__G_DESKTOP_APP_INFO_C__) +#ifdef G_OS_UNIX +#undef g_desktop_app_info_new_from_filename +extern __typeof (g_desktop_app_info_new_from_filename) g_desktop_app_info_new_from_filename __attribute((alias("IA__g_desktop_app_info_new_from_filename"), visibility("default"))); + +#undef g_desktop_app_info_new_from_keyfile +extern __typeof (g_desktop_app_info_new_from_keyfile) g_desktop_app_info_new_from_keyfile __attribute((alias("IA__g_desktop_app_info_new_from_keyfile"), visibility("default"))); + +#undef g_desktop_app_info_new +extern __typeof (g_desktop_app_info_new) g_desktop_app_info_new __attribute((alias("IA__g_desktop_app_info_new"), visibility("default"))); + +#undef g_desktop_app_info_get_filename +extern __typeof (g_desktop_app_info_get_filename) g_desktop_app_info_get_filename __attribute((alias("IA__g_desktop_app_info_get_filename"), visibility("default"))); + +#undef g_desktop_app_info_get_type +extern __typeof (g_desktop_app_info_get_type) g_desktop_app_info_get_type __attribute((alias("IA__g_desktop_app_info_get_type"), visibility("default"))); + +#undef g_desktop_app_info_get_is_hidden +extern __typeof (g_desktop_app_info_get_is_hidden) g_desktop_app_info_get_is_hidden __attribute((alias("IA__g_desktop_app_info_get_is_hidden"), visibility("default"))); + +#undef g_desktop_app_info_set_desktop_env +extern __typeof (g_desktop_app_info_set_desktop_env) g_desktop_app_info_set_desktop_env __attribute((alias("IA__g_desktop_app_info_set_desktop_env"), visibility("default"))); + +#undef g_desktop_app_info_lookup_get_type +extern __typeof (g_desktop_app_info_lookup_get_type) g_desktop_app_info_lookup_get_type __attribute((alias("IA__g_desktop_app_info_lookup_get_type"), visibility("default"))); + +#undef g_desktop_app_info_lookup_get_default_for_uri_scheme +extern __typeof (g_desktop_app_info_lookup_get_default_for_uri_scheme) g_desktop_app_info_lookup_get_default_for_uri_scheme __attribute((alias("IA__g_desktop_app_info_lookup_get_default_for_uri_scheme"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_ASYNC_RESULT_H__) +#if IN_FILE(__G_ASYNC_RESULT_C__) +#undef g_async_result_get_type +extern __typeof (g_async_result_get_type) g_async_result_get_type __attribute((alias("IA__g_async_result_get_type"), visibility("default"))); + +#undef g_async_result_get_user_data +extern __typeof (g_async_result_get_user_data) g_async_result_get_user_data __attribute((alias("IA__g_async_result_get_user_data"), visibility("default"))); + +#undef g_async_result_get_source_object +extern __typeof (g_async_result_get_source_object) g_async_result_get_source_object __attribute((alias("IA__g_async_result_get_source_object"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_BUFFERED_INPUT_STREAM_H__) +#if IN_FILE(__G_BUFFERED_INPUT_STREAM_C__) +#undef g_buffered_input_stream_get_type +extern __typeof (g_buffered_input_stream_get_type) g_buffered_input_stream_get_type __attribute((alias("IA__g_buffered_input_stream_get_type"), visibility("default"))); + +#undef g_buffered_input_stream_new +extern __typeof (g_buffered_input_stream_new) g_buffered_input_stream_new __attribute((alias("IA__g_buffered_input_stream_new"), visibility("default"))); + +#undef g_buffered_input_stream_new_sized +extern __typeof (g_buffered_input_stream_new_sized) g_buffered_input_stream_new_sized __attribute((alias("IA__g_buffered_input_stream_new_sized"), visibility("default"))); + +#undef g_buffered_input_stream_get_buffer_size +extern __typeof (g_buffered_input_stream_get_buffer_size) g_buffered_input_stream_get_buffer_size __attribute((alias("IA__g_buffered_input_stream_get_buffer_size"), visibility("default"))); + +#undef g_buffered_input_stream_set_buffer_size +extern __typeof (g_buffered_input_stream_set_buffer_size) g_buffered_input_stream_set_buffer_size __attribute((alias("IA__g_buffered_input_stream_set_buffer_size"), visibility("default"))); + +#undef g_buffered_input_stream_get_available +extern __typeof (g_buffered_input_stream_get_available) g_buffered_input_stream_get_available __attribute((alias("IA__g_buffered_input_stream_get_available"), visibility("default"))); + +#undef g_buffered_input_stream_peek +extern __typeof (g_buffered_input_stream_peek) g_buffered_input_stream_peek __attribute((alias("IA__g_buffered_input_stream_peek"), visibility("default"))); + +#undef g_buffered_input_stream_peek_buffer +extern __typeof (g_buffered_input_stream_peek_buffer) g_buffered_input_stream_peek_buffer __attribute((alias("IA__g_buffered_input_stream_peek_buffer"), visibility("default"))); + +#undef g_buffered_input_stream_fill +extern __typeof (g_buffered_input_stream_fill) g_buffered_input_stream_fill __attribute((alias("IA__g_buffered_input_stream_fill"), visibility("default"))); + +#undef g_buffered_input_stream_fill_async +extern __typeof (g_buffered_input_stream_fill_async) g_buffered_input_stream_fill_async __attribute((alias("IA__g_buffered_input_stream_fill_async"), visibility("default"))); + +#undef g_buffered_input_stream_fill_finish +extern __typeof (g_buffered_input_stream_fill_finish) g_buffered_input_stream_fill_finish __attribute((alias("IA__g_buffered_input_stream_fill_finish"), visibility("default"))); + +#undef g_buffered_input_stream_read_byte +extern __typeof (g_buffered_input_stream_read_byte) g_buffered_input_stream_read_byte __attribute((alias("IA__g_buffered_input_stream_read_byte"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_BUFFERED_OUTPUT_STREAM_H__) +#if IN_FILE(__G_BUFFERED_OUTPUT_STREAM_C__) +#undef g_buffered_output_stream_get_type +extern __typeof (g_buffered_output_stream_get_type) g_buffered_output_stream_get_type __attribute((alias("IA__g_buffered_output_stream_get_type"), visibility("default"))); + +#undef g_buffered_output_stream_new +extern __typeof (g_buffered_output_stream_new) g_buffered_output_stream_new __attribute((alias("IA__g_buffered_output_stream_new"), visibility("default"))); + +#undef g_buffered_output_stream_new_sized +extern __typeof (g_buffered_output_stream_new_sized) g_buffered_output_stream_new_sized __attribute((alias("IA__g_buffered_output_stream_new_sized"), visibility("default"))); + +#undef g_buffered_output_stream_get_buffer_size +extern __typeof (g_buffered_output_stream_get_buffer_size) g_buffered_output_stream_get_buffer_size __attribute((alias("IA__g_buffered_output_stream_get_buffer_size"), visibility("default"))); + +#undef g_buffered_output_stream_set_buffer_size +extern __typeof (g_buffered_output_stream_set_buffer_size) g_buffered_output_stream_set_buffer_size __attribute((alias("IA__g_buffered_output_stream_set_buffer_size"), visibility("default"))); + +#undef g_buffered_output_stream_get_auto_grow +extern __typeof (g_buffered_output_stream_get_auto_grow) g_buffered_output_stream_get_auto_grow __attribute((alias("IA__g_buffered_output_stream_get_auto_grow"), visibility("default"))); + +#undef g_buffered_output_stream_set_auto_grow +extern __typeof (g_buffered_output_stream_set_auto_grow) g_buffered_output_stream_set_auto_grow __attribute((alias("IA__g_buffered_output_stream_set_auto_grow"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CANCELLABLE_H__) +#if IN_FILE(__G_CANCELLABLE_C__) +#undef g_cancellable_get_type +extern __typeof (g_cancellable_get_type) g_cancellable_get_type __attribute((alias("IA__g_cancellable_get_type"), visibility("default"))); + +#undef g_cancellable_new +extern __typeof (g_cancellable_new) g_cancellable_new __attribute((alias("IA__g_cancellable_new"), visibility("default"))); + +#undef g_cancellable_is_cancelled +extern __typeof (g_cancellable_is_cancelled) g_cancellable_is_cancelled __attribute((alias("IA__g_cancellable_is_cancelled"), visibility("default"))); + +#undef g_cancellable_set_error_if_cancelled +extern __typeof (g_cancellable_set_error_if_cancelled) g_cancellable_set_error_if_cancelled __attribute((alias("IA__g_cancellable_set_error_if_cancelled"), visibility("default"))); + +#undef g_cancellable_get_fd +extern __typeof (g_cancellable_get_fd) g_cancellable_get_fd __attribute((alias("IA__g_cancellable_get_fd"), visibility("default"))); + +#undef g_cancellable_make_pollfd +extern __typeof (g_cancellable_make_pollfd) g_cancellable_make_pollfd __attribute((alias("IA__g_cancellable_make_pollfd"), visibility("default"))); + +#undef g_cancellable_release_fd +extern __typeof (g_cancellable_release_fd) g_cancellable_release_fd __attribute((alias("IA__g_cancellable_release_fd"), visibility("default"))); + +#undef g_cancellable_get_current +extern __typeof (g_cancellable_get_current) g_cancellable_get_current __attribute((alias("IA__g_cancellable_get_current"), visibility("default"))); + +#undef g_cancellable_push_current +extern __typeof (g_cancellable_push_current) g_cancellable_push_current __attribute((alias("IA__g_cancellable_push_current"), visibility("default"))); + +#undef g_cancellable_pop_current +extern __typeof (g_cancellable_pop_current) g_cancellable_pop_current __attribute((alias("IA__g_cancellable_pop_current"), visibility("default"))); + +#undef g_cancellable_reset +extern __typeof (g_cancellable_reset) g_cancellable_reset __attribute((alias("IA__g_cancellable_reset"), visibility("default"))); + +#undef g_cancellable_cancel +extern __typeof (g_cancellable_cancel) g_cancellable_cancel __attribute((alias("IA__g_cancellable_cancel"), visibility("default"))); + +#undef g_cancellable_connect +extern __typeof (g_cancellable_connect) g_cancellable_connect __attribute((alias("IA__g_cancellable_connect"), visibility("default"))); + +#undef g_cancellable_disconnect +extern __typeof (g_cancellable_disconnect) g_cancellable_disconnect __attribute((alias("IA__g_cancellable_disconnect"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CONTENT_TYPE_H__) +#if IN_FILE(__G_CONTENT_TYPE_C__) +#undef g_content_type_equals +extern __typeof (g_content_type_equals) g_content_type_equals __attribute((alias("IA__g_content_type_equals"), visibility("default"))); + +#undef g_content_type_is_a +extern __typeof (g_content_type_is_a) g_content_type_is_a __attribute((alias("IA__g_content_type_is_a"), visibility("default"))); + +#undef g_content_type_is_unknown +extern __typeof (g_content_type_is_unknown) g_content_type_is_unknown __attribute((alias("IA__g_content_type_is_unknown"), visibility("default"))); + +#undef g_content_type_get_description +extern __typeof (g_content_type_get_description) g_content_type_get_description __attribute((alias("IA__g_content_type_get_description"), visibility("default"))); + +#undef g_content_type_get_mime_type +extern __typeof (g_content_type_get_mime_type) g_content_type_get_mime_type __attribute((alias("IA__g_content_type_get_mime_type"), visibility("default"))); + +#undef g_content_type_get_icon +extern __typeof (g_content_type_get_icon) g_content_type_get_icon __attribute((alias("IA__g_content_type_get_icon"), visibility("default"))); + +#undef g_content_type_can_be_executable +extern __typeof (g_content_type_can_be_executable) g_content_type_can_be_executable __attribute((alias("IA__g_content_type_can_be_executable"), visibility("default"))); + +#undef g_content_type_from_mime_type +extern __typeof (g_content_type_from_mime_type) g_content_type_from_mime_type __attribute((alias("IA__g_content_type_from_mime_type"), visibility("default"))); + +#undef g_content_type_guess +extern __typeof (g_content_type_guess) g_content_type_guess __attribute((alias("IA__g_content_type_guess"), visibility("default"))); + +#undef g_content_type_guess_for_tree +extern __typeof (g_content_type_guess_for_tree) g_content_type_guess_for_tree __attribute((alias("IA__g_content_type_guess_for_tree"), visibility("default"))); + +#undef g_content_types_get_registered +extern __typeof (g_content_types_get_registered) g_content_types_get_registered __attribute((alias("IA__g_content_types_get_registered"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CONVERTER_H__) +#if IN_FILE(__G_CONVERTER_C__) +#undef g_converter_get_type +extern __typeof (g_converter_get_type) g_converter_get_type __attribute((alias("IA__g_converter_get_type"), visibility("default"))); + +#undef g_converter_reset +extern __typeof (g_converter_reset) g_converter_reset __attribute((alias("IA__g_converter_reset"), visibility("default"))); + +#undef g_converter_convert +extern __typeof (g_converter_convert) g_converter_convert __attribute((alias("IA__g_converter_convert"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CONVERTER_INPUT_STREAM_H__) +#if IN_FILE(__G_CONVERTER_INPUT_STREAM_C__) +#undef g_converter_input_stream_get_type +extern __typeof (g_converter_input_stream_get_type) g_converter_input_stream_get_type __attribute((alias("IA__g_converter_input_stream_get_type"), visibility("default"))); + +#undef g_converter_input_stream_new +extern __typeof (g_converter_input_stream_new) g_converter_input_stream_new __attribute((alias("IA__g_converter_input_stream_new"), visibility("default"))); + +#undef g_converter_input_stream_get_converter +extern __typeof (g_converter_input_stream_get_converter) g_converter_input_stream_get_converter __attribute((alias("IA__g_converter_input_stream_get_converter"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CONVERTER_OUTPUT_STREAM_H__) +#if IN_FILE(__G_CONVERTER_OUTPUT_STREAM_C__) +#undef g_converter_output_stream_get_type +extern __typeof (g_converter_output_stream_get_type) g_converter_output_stream_get_type __attribute((alias("IA__g_converter_output_stream_get_type"), visibility("default"))); + +#undef g_converter_output_stream_new +extern __typeof (g_converter_output_stream_new) g_converter_output_stream_new __attribute((alias("IA__g_converter_output_stream_new"), visibility("default"))); + +#undef g_converter_output_stream_get_converter +extern __typeof (g_converter_output_stream_get_converter) g_converter_output_stream_get_converter __attribute((alias("IA__g_converter_output_stream_get_converter"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CHARSET_CONVERTER_H__) +#if IN_FILE(__G_CHARSET_CONVERTER_C__) +#undef g_charset_converter_get_type +extern __typeof (g_charset_converter_get_type) g_charset_converter_get_type __attribute((alias("IA__g_charset_converter_get_type"), visibility("default"))); + +#undef g_charset_converter_new +extern __typeof (g_charset_converter_new) g_charset_converter_new __attribute((alias("IA__g_charset_converter_new"), visibility("default"))); + +#undef g_charset_converter_get_num_fallbacks +extern __typeof (g_charset_converter_get_num_fallbacks) g_charset_converter_get_num_fallbacks __attribute((alias("IA__g_charset_converter_get_num_fallbacks"), visibility("default"))); + +#undef g_charset_converter_get_use_fallback +extern __typeof (g_charset_converter_get_use_fallback) g_charset_converter_get_use_fallback __attribute((alias("IA__g_charset_converter_get_use_fallback"), visibility("default"))); + +#undef g_charset_converter_set_use_fallback +extern __typeof (g_charset_converter_set_use_fallback) g_charset_converter_set_use_fallback __attribute((alias("IA__g_charset_converter_set_use_fallback"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DATA_INPUT_STREAM_H__) +#if IN_FILE(__G_DATA_INPUT_STREAM_C__) +#undef g_data_input_stream_get_type +extern __typeof (g_data_input_stream_get_type) g_data_input_stream_get_type __attribute((alias("IA__g_data_input_stream_get_type"), visibility("default"))); + +#undef g_data_input_stream_new +extern __typeof (g_data_input_stream_new) g_data_input_stream_new __attribute((alias("IA__g_data_input_stream_new"), visibility("default"))); + +#undef g_data_input_stream_set_byte_order +extern __typeof (g_data_input_stream_set_byte_order) g_data_input_stream_set_byte_order __attribute((alias("IA__g_data_input_stream_set_byte_order"), visibility("default"))); + +#undef g_data_input_stream_get_byte_order +extern __typeof (g_data_input_stream_get_byte_order) g_data_input_stream_get_byte_order __attribute((alias("IA__g_data_input_stream_get_byte_order"), visibility("default"))); + +#undef g_data_input_stream_set_newline_type +extern __typeof (g_data_input_stream_set_newline_type) g_data_input_stream_set_newline_type __attribute((alias("IA__g_data_input_stream_set_newline_type"), visibility("default"))); + +#undef g_data_input_stream_get_newline_type +extern __typeof (g_data_input_stream_get_newline_type) g_data_input_stream_get_newline_type __attribute((alias("IA__g_data_input_stream_get_newline_type"), visibility("default"))); + +#undef g_data_input_stream_read_byte +extern __typeof (g_data_input_stream_read_byte) g_data_input_stream_read_byte __attribute((alias("IA__g_data_input_stream_read_byte"), visibility("default"))); + +#undef g_data_input_stream_read_int16 +extern __typeof (g_data_input_stream_read_int16) g_data_input_stream_read_int16 __attribute((alias("IA__g_data_input_stream_read_int16"), visibility("default"))); + +#undef g_data_input_stream_read_uint16 +extern __typeof (g_data_input_stream_read_uint16) g_data_input_stream_read_uint16 __attribute((alias("IA__g_data_input_stream_read_uint16"), visibility("default"))); + +#undef g_data_input_stream_read_int32 +extern __typeof (g_data_input_stream_read_int32) g_data_input_stream_read_int32 __attribute((alias("IA__g_data_input_stream_read_int32"), visibility("default"))); + +#undef g_data_input_stream_read_uint32 +extern __typeof (g_data_input_stream_read_uint32) g_data_input_stream_read_uint32 __attribute((alias("IA__g_data_input_stream_read_uint32"), visibility("default"))); + +#undef g_data_input_stream_read_int64 +extern __typeof (g_data_input_stream_read_int64) g_data_input_stream_read_int64 __attribute((alias("IA__g_data_input_stream_read_int64"), visibility("default"))); + +#undef g_data_input_stream_read_uint64 +extern __typeof (g_data_input_stream_read_uint64) g_data_input_stream_read_uint64 __attribute((alias("IA__g_data_input_stream_read_uint64"), visibility("default"))); + +#undef g_data_input_stream_read_line +extern __typeof (g_data_input_stream_read_line) g_data_input_stream_read_line __attribute((alias("IA__g_data_input_stream_read_line"), visibility("default"))); + +#undef g_data_input_stream_read_line_async +extern __typeof (g_data_input_stream_read_line_async) g_data_input_stream_read_line_async __attribute((alias("IA__g_data_input_stream_read_line_async"), visibility("default"))); + +#undef g_data_input_stream_read_line_finish +extern __typeof (g_data_input_stream_read_line_finish) g_data_input_stream_read_line_finish __attribute((alias("IA__g_data_input_stream_read_line_finish"), visibility("default"))); + +#undef g_data_input_stream_read_until +extern __typeof (g_data_input_stream_read_until) g_data_input_stream_read_until __attribute((alias("IA__g_data_input_stream_read_until"), visibility("default"))); + +#undef g_data_input_stream_read_until_async +extern __typeof (g_data_input_stream_read_until_async) g_data_input_stream_read_until_async __attribute((alias("IA__g_data_input_stream_read_until_async"), visibility("default"))); + +#undef g_data_input_stream_read_until_finish +extern __typeof (g_data_input_stream_read_until_finish) g_data_input_stream_read_until_finish __attribute((alias("IA__g_data_input_stream_read_until_finish"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DATA_OUTPUT_STREAM_H__) +#if IN_FILE(__G_DATA_OUTPUT_STREAM_C__) +#undef g_data_output_stream_get_type +extern __typeof (g_data_output_stream_get_type) g_data_output_stream_get_type __attribute((alias("IA__g_data_output_stream_get_type"), visibility("default"))); + +#undef g_data_output_stream_new +extern __typeof (g_data_output_stream_new) g_data_output_stream_new __attribute((alias("IA__g_data_output_stream_new"), visibility("default"))); + +#undef g_data_output_stream_set_byte_order +extern __typeof (g_data_output_stream_set_byte_order) g_data_output_stream_set_byte_order __attribute((alias("IA__g_data_output_stream_set_byte_order"), visibility("default"))); + +#undef g_data_output_stream_get_byte_order +extern __typeof (g_data_output_stream_get_byte_order) g_data_output_stream_get_byte_order __attribute((alias("IA__g_data_output_stream_get_byte_order"), visibility("default"))); + +#undef g_data_output_stream_put_byte +extern __typeof (g_data_output_stream_put_byte) g_data_output_stream_put_byte __attribute((alias("IA__g_data_output_stream_put_byte"), visibility("default"))); + +#undef g_data_output_stream_put_int16 +extern __typeof (g_data_output_stream_put_int16) g_data_output_stream_put_int16 __attribute((alias("IA__g_data_output_stream_put_int16"), visibility("default"))); + +#undef g_data_output_stream_put_uint16 +extern __typeof (g_data_output_stream_put_uint16) g_data_output_stream_put_uint16 __attribute((alias("IA__g_data_output_stream_put_uint16"), visibility("default"))); + +#undef g_data_output_stream_put_int32 +extern __typeof (g_data_output_stream_put_int32) g_data_output_stream_put_int32 __attribute((alias("IA__g_data_output_stream_put_int32"), visibility("default"))); + +#undef g_data_output_stream_put_uint32 +extern __typeof (g_data_output_stream_put_uint32) g_data_output_stream_put_uint32 __attribute((alias("IA__g_data_output_stream_put_uint32"), visibility("default"))); + +#undef g_data_output_stream_put_int64 +extern __typeof (g_data_output_stream_put_int64) g_data_output_stream_put_int64 __attribute((alias("IA__g_data_output_stream_put_int64"), visibility("default"))); + +#undef g_data_output_stream_put_uint64 +extern __typeof (g_data_output_stream_put_uint64) g_data_output_stream_put_uint64 __attribute((alias("IA__g_data_output_stream_put_uint64"), visibility("default"))); + +#undef g_data_output_stream_put_string +extern __typeof (g_data_output_stream_put_string) g_data_output_stream_put_string __attribute((alias("IA__g_data_output_stream_put_string"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DRIVE_H__) +#if IN_FILE(__G_DRIVE_C__) +#undef g_drive_get_type +extern __typeof (g_drive_get_type) g_drive_get_type __attribute((alias("IA__g_drive_get_type"), visibility("default"))); + +#undef g_drive_get_name +extern __typeof (g_drive_get_name) g_drive_get_name __attribute((alias("IA__g_drive_get_name"), visibility("default"))); + +#undef g_drive_get_icon +extern __typeof (g_drive_get_icon) g_drive_get_icon __attribute((alias("IA__g_drive_get_icon"), visibility("default"))); + +#undef g_drive_has_volumes +extern __typeof (g_drive_has_volumes) g_drive_has_volumes __attribute((alias("IA__g_drive_has_volumes"), visibility("default"))); + +#undef g_drive_get_volumes +extern __typeof (g_drive_get_volumes) g_drive_get_volumes __attribute((alias("IA__g_drive_get_volumes"), visibility("default"))); + +#undef g_drive_is_media_removable +extern __typeof (g_drive_is_media_removable) g_drive_is_media_removable __attribute((alias("IA__g_drive_is_media_removable"), visibility("default"))); + +#undef g_drive_has_media +extern __typeof (g_drive_has_media) g_drive_has_media __attribute((alias("IA__g_drive_has_media"), visibility("default"))); + +#undef g_drive_is_media_check_automatic +extern __typeof (g_drive_is_media_check_automatic) g_drive_is_media_check_automatic __attribute((alias("IA__g_drive_is_media_check_automatic"), visibility("default"))); + +#undef g_drive_can_poll_for_media +extern __typeof (g_drive_can_poll_for_media) g_drive_can_poll_for_media __attribute((alias("IA__g_drive_can_poll_for_media"), visibility("default"))); + +#undef g_drive_can_eject +extern __typeof (g_drive_can_eject) g_drive_can_eject __attribute((alias("IA__g_drive_can_eject"), visibility("default"))); + +#undef g_drive_eject_with_operation +extern __typeof (g_drive_eject_with_operation) g_drive_eject_with_operation __attribute((alias("IA__g_drive_eject_with_operation"), visibility("default"))); + +#undef g_drive_eject_with_operation_finish +extern __typeof (g_drive_eject_with_operation_finish) g_drive_eject_with_operation_finish __attribute((alias("IA__g_drive_eject_with_operation_finish"), visibility("default"))); + +#undef g_drive_poll_for_media +extern __typeof (g_drive_poll_for_media) g_drive_poll_for_media __attribute((alias("IA__g_drive_poll_for_media"), visibility("default"))); + +#undef g_drive_poll_for_media_finish +extern __typeof (g_drive_poll_for_media_finish) g_drive_poll_for_media_finish __attribute((alias("IA__g_drive_poll_for_media_finish"), visibility("default"))); + +#undef g_drive_get_identifier +extern __typeof (g_drive_get_identifier) g_drive_get_identifier __attribute((alias("IA__g_drive_get_identifier"), visibility("default"))); + +#undef g_drive_enumerate_identifiers +extern __typeof (g_drive_enumerate_identifiers) g_drive_enumerate_identifiers __attribute((alias("IA__g_drive_enumerate_identifiers"), visibility("default"))); + +#undef g_drive_get_start_stop_type +extern __typeof (g_drive_get_start_stop_type) g_drive_get_start_stop_type __attribute((alias("IA__g_drive_get_start_stop_type"), visibility("default"))); + +#undef g_drive_can_start +extern __typeof (g_drive_can_start) g_drive_can_start __attribute((alias("IA__g_drive_can_start"), visibility("default"))); + +#undef g_drive_can_start_degraded +extern __typeof (g_drive_can_start_degraded) g_drive_can_start_degraded __attribute((alias("IA__g_drive_can_start_degraded"), visibility("default"))); + +#undef g_drive_start +extern __typeof (g_drive_start) g_drive_start __attribute((alias("IA__g_drive_start"), visibility("default"))); + +#undef g_drive_start_finish +extern __typeof (g_drive_start_finish) g_drive_start_finish __attribute((alias("IA__g_drive_start_finish"), visibility("default"))); + +#undef g_drive_can_stop +extern __typeof (g_drive_can_stop) g_drive_can_stop __attribute((alias("IA__g_drive_can_stop"), visibility("default"))); + +#undef g_drive_stop +extern __typeof (g_drive_stop) g_drive_stop __attribute((alias("IA__g_drive_stop"), visibility("default"))); + +#undef g_drive_stop_finish +extern __typeof (g_drive_stop_finish) g_drive_stop_finish __attribute((alias("IA__g_drive_stop_finish"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_drive_eject +extern __typeof (g_drive_eject) g_drive_eject __attribute((alias("IA__g_drive_eject"), visibility("default"))); + +#undef g_drive_eject_finish +extern __typeof (g_drive_eject_finish) g_drive_eject_finish __attribute((alias("IA__g_drive_eject_finish"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_FILE_ATTRIBUTE_H__) +#if IN_FILE(__G_FILE_ATTRIBUTE_C__) +#undef g_file_attribute_info_list_new +extern __typeof (g_file_attribute_info_list_new) g_file_attribute_info_list_new __attribute((alias("IA__g_file_attribute_info_list_new"), visibility("default"))); + +#undef g_file_attribute_info_list_ref +extern __typeof (g_file_attribute_info_list_ref) g_file_attribute_info_list_ref __attribute((alias("IA__g_file_attribute_info_list_ref"), visibility("default"))); + +#undef g_file_attribute_info_list_unref +extern __typeof (g_file_attribute_info_list_unref) g_file_attribute_info_list_unref __attribute((alias("IA__g_file_attribute_info_list_unref"), visibility("default"))); + +#undef g_file_attribute_info_list_dup +extern __typeof (g_file_attribute_info_list_dup) g_file_attribute_info_list_dup __attribute((alias("IA__g_file_attribute_info_list_dup"), visibility("default"))); + +#undef g_file_attribute_info_list_get_type +extern __typeof (g_file_attribute_info_list_get_type) g_file_attribute_info_list_get_type __attribute((alias("IA__g_file_attribute_info_list_get_type"), visibility("default"))); + +#undef g_file_attribute_info_list_lookup +extern __typeof (g_file_attribute_info_list_lookup) g_file_attribute_info_list_lookup __attribute((alias("IA__g_file_attribute_info_list_lookup"), visibility("default"))); + +#undef g_file_attribute_info_list_add +extern __typeof (g_file_attribute_info_list_add) g_file_attribute_info_list_add __attribute((alias("IA__g_file_attribute_info_list_add"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_H__) +#if IN_FILE(__G_FILE_C__) +#undef g_file_get_type +extern __typeof (g_file_get_type) g_file_get_type __attribute((alias("IA__g_file_get_type"), visibility("default"))); + +#undef g_file_new_for_path +extern __typeof (g_file_new_for_path) g_file_new_for_path __attribute((alias("IA__g_file_new_for_path"), visibility("default"))); + +#undef g_file_new_for_uri +extern __typeof (g_file_new_for_uri) g_file_new_for_uri __attribute((alias("IA__g_file_new_for_uri"), visibility("default"))); + +#undef g_file_new_for_commandline_arg +extern __typeof (g_file_new_for_commandline_arg) g_file_new_for_commandline_arg __attribute((alias("IA__g_file_new_for_commandline_arg"), visibility("default"))); + +#undef g_file_parse_name +extern __typeof (g_file_parse_name) g_file_parse_name __attribute((alias("IA__g_file_parse_name"), visibility("default"))); + +#undef g_file_dup +extern __typeof (g_file_dup) g_file_dup __attribute((alias("IA__g_file_dup"), visibility("default"))); + +#undef g_file_hash +extern __typeof (g_file_hash) g_file_hash __attribute((alias("IA__g_file_hash"), visibility("default"))); + +#undef g_file_equal +extern __typeof (g_file_equal) g_file_equal __attribute((alias("IA__g_file_equal"), visibility("default"))); + +#undef g_file_get_basename +extern __typeof (g_file_get_basename) g_file_get_basename __attribute((alias("IA__g_file_get_basename"), visibility("default"))); + +#undef g_file_get_path +extern __typeof (g_file_get_path) g_file_get_path __attribute((alias("IA__g_file_get_path"), visibility("default"))); + +#undef g_file_get_uri +extern __typeof (g_file_get_uri) g_file_get_uri __attribute((alias("IA__g_file_get_uri"), visibility("default"))); + +#undef g_file_get_parse_name +extern __typeof (g_file_get_parse_name) g_file_get_parse_name __attribute((alias("IA__g_file_get_parse_name"), visibility("default"))); + +#undef g_file_get_parent +extern __typeof (g_file_get_parent) g_file_get_parent __attribute((alias("IA__g_file_get_parent"), visibility("default"))); + +#undef g_file_has_parent +extern __typeof (g_file_has_parent) g_file_has_parent __attribute((alias("IA__g_file_has_parent"), visibility("default"))); + +#undef g_file_get_child +extern __typeof (g_file_get_child) g_file_get_child __attribute((alias("IA__g_file_get_child"), visibility("default"))); + +#undef g_file_get_child_for_display_name +extern __typeof (g_file_get_child_for_display_name) g_file_get_child_for_display_name __attribute((alias("IA__g_file_get_child_for_display_name"), visibility("default"))); + +#undef g_file_has_prefix +extern __typeof (g_file_has_prefix) g_file_has_prefix __attribute((alias("IA__g_file_has_prefix"), visibility("default"))); + +#undef g_file_get_relative_path +extern __typeof (g_file_get_relative_path) g_file_get_relative_path __attribute((alias("IA__g_file_get_relative_path"), visibility("default"))); + +#undef g_file_resolve_relative_path +extern __typeof (g_file_resolve_relative_path) g_file_resolve_relative_path __attribute((alias("IA__g_file_resolve_relative_path"), visibility("default"))); + +#undef g_file_is_native +extern __typeof (g_file_is_native) g_file_is_native __attribute((alias("IA__g_file_is_native"), visibility("default"))); + +#undef g_file_has_uri_scheme +extern __typeof (g_file_has_uri_scheme) g_file_has_uri_scheme __attribute((alias("IA__g_file_has_uri_scheme"), visibility("default"))); + +#undef g_file_get_uri_scheme +extern __typeof (g_file_get_uri_scheme) g_file_get_uri_scheme __attribute((alias("IA__g_file_get_uri_scheme"), visibility("default"))); + +#undef g_file_read +extern __typeof (g_file_read) g_file_read __attribute((alias("IA__g_file_read"), visibility("default"))); + +#undef g_file_read_async +extern __typeof (g_file_read_async) g_file_read_async __attribute((alias("IA__g_file_read_async"), visibility("default"))); + +#undef g_file_read_finish +extern __typeof (g_file_read_finish) g_file_read_finish __attribute((alias("IA__g_file_read_finish"), visibility("default"))); + +#undef g_file_append_to +extern __typeof (g_file_append_to) g_file_append_to __attribute((alias("IA__g_file_append_to"), visibility("default"))); + +#undef g_file_create +extern __typeof (g_file_create) g_file_create __attribute((alias("IA__g_file_create"), visibility("default"))); + +#undef g_file_replace +extern __typeof (g_file_replace) g_file_replace __attribute((alias("IA__g_file_replace"), visibility("default"))); + +#undef g_file_append_to_async +extern __typeof (g_file_append_to_async) g_file_append_to_async __attribute((alias("IA__g_file_append_to_async"), visibility("default"))); + +#undef g_file_append_to_finish +extern __typeof (g_file_append_to_finish) g_file_append_to_finish __attribute((alias("IA__g_file_append_to_finish"), visibility("default"))); + +#undef g_file_create_async +extern __typeof (g_file_create_async) g_file_create_async __attribute((alias("IA__g_file_create_async"), visibility("default"))); + +#undef g_file_create_finish +extern __typeof (g_file_create_finish) g_file_create_finish __attribute((alias("IA__g_file_create_finish"), visibility("default"))); + +#undef g_file_replace_async +extern __typeof (g_file_replace_async) g_file_replace_async __attribute((alias("IA__g_file_replace_async"), visibility("default"))); + +#undef g_file_replace_finish +extern __typeof (g_file_replace_finish) g_file_replace_finish __attribute((alias("IA__g_file_replace_finish"), visibility("default"))); + +#undef g_file_query_exists +extern __typeof (g_file_query_exists) g_file_query_exists __attribute((alias("IA__g_file_query_exists"), visibility("default"))); + +#undef g_file_query_info +extern __typeof (g_file_query_info) g_file_query_info __attribute((alias("IA__g_file_query_info"), visibility("default"))); + +#undef g_file_query_info_async +extern __typeof (g_file_query_info_async) g_file_query_info_async __attribute((alias("IA__g_file_query_info_async"), visibility("default"))); + +#undef g_file_query_info_finish +extern __typeof (g_file_query_info_finish) g_file_query_info_finish __attribute((alias("IA__g_file_query_info_finish"), visibility("default"))); + +#undef g_file_query_file_type +extern __typeof (g_file_query_file_type) g_file_query_file_type __attribute((alias("IA__g_file_query_file_type"), visibility("default"))); + +#undef g_file_query_filesystem_info +extern __typeof (g_file_query_filesystem_info) g_file_query_filesystem_info __attribute((alias("IA__g_file_query_filesystem_info"), visibility("default"))); + +#undef g_file_query_filesystem_info_async +extern __typeof (g_file_query_filesystem_info_async) g_file_query_filesystem_info_async __attribute((alias("IA__g_file_query_filesystem_info_async"), visibility("default"))); + +#undef g_file_query_filesystem_info_finish +extern __typeof (g_file_query_filesystem_info_finish) g_file_query_filesystem_info_finish __attribute((alias("IA__g_file_query_filesystem_info_finish"), visibility("default"))); + +#undef g_file_find_enclosing_mount +extern __typeof (g_file_find_enclosing_mount) g_file_find_enclosing_mount __attribute((alias("IA__g_file_find_enclosing_mount"), visibility("default"))); + +#undef g_file_find_enclosing_mount_async +extern __typeof (g_file_find_enclosing_mount_async) g_file_find_enclosing_mount_async __attribute((alias("IA__g_file_find_enclosing_mount_async"), visibility("default"))); + +#undef g_file_find_enclosing_mount_finish +extern __typeof (g_file_find_enclosing_mount_finish) g_file_find_enclosing_mount_finish __attribute((alias("IA__g_file_find_enclosing_mount_finish"), visibility("default"))); + +#undef g_file_enumerate_children +extern __typeof (g_file_enumerate_children) g_file_enumerate_children __attribute((alias("IA__g_file_enumerate_children"), visibility("default"))); + +#undef g_file_enumerate_children_async +extern __typeof (g_file_enumerate_children_async) g_file_enumerate_children_async __attribute((alias("IA__g_file_enumerate_children_async"), visibility("default"))); + +#undef g_file_enumerate_children_finish +extern __typeof (g_file_enumerate_children_finish) g_file_enumerate_children_finish __attribute((alias("IA__g_file_enumerate_children_finish"), visibility("default"))); + +#undef g_file_set_display_name +extern __typeof (g_file_set_display_name) g_file_set_display_name __attribute((alias("IA__g_file_set_display_name"), visibility("default"))); + +#undef g_file_set_display_name_async +extern __typeof (g_file_set_display_name_async) g_file_set_display_name_async __attribute((alias("IA__g_file_set_display_name_async"), visibility("default"))); + +#undef g_file_set_display_name_finish +extern __typeof (g_file_set_display_name_finish) g_file_set_display_name_finish __attribute((alias("IA__g_file_set_display_name_finish"), visibility("default"))); + +#undef g_file_delete +extern __typeof (g_file_delete) g_file_delete __attribute((alias("IA__g_file_delete"), visibility("default"))); + +#undef g_file_trash +extern __typeof (g_file_trash) g_file_trash __attribute((alias("IA__g_file_trash"), visibility("default"))); + +#undef g_file_copy +extern __typeof (g_file_copy) g_file_copy __attribute((alias("IA__g_file_copy"), visibility("default"))); + +#undef g_file_copy_async +extern __typeof (g_file_copy_async) g_file_copy_async __attribute((alias("IA__g_file_copy_async"), visibility("default"))); + +#undef g_file_copy_finish +extern __typeof (g_file_copy_finish) g_file_copy_finish __attribute((alias("IA__g_file_copy_finish"), visibility("default"))); + +#undef g_file_move +extern __typeof (g_file_move) g_file_move __attribute((alias("IA__g_file_move"), visibility("default"))); + +#undef g_file_make_directory +extern __typeof (g_file_make_directory) g_file_make_directory __attribute((alias("IA__g_file_make_directory"), visibility("default"))); + +#undef g_file_make_directory_with_parents +extern __typeof (g_file_make_directory_with_parents) g_file_make_directory_with_parents __attribute((alias("IA__g_file_make_directory_with_parents"), visibility("default"))); + +#undef g_file_make_symbolic_link +extern __typeof (g_file_make_symbolic_link) g_file_make_symbolic_link __attribute((alias("IA__g_file_make_symbolic_link"), visibility("default"))); + +#undef g_file_query_settable_attributes +extern __typeof (g_file_query_settable_attributes) g_file_query_settable_attributes __attribute((alias("IA__g_file_query_settable_attributes"), visibility("default"))); + +#undef g_file_query_writable_namespaces +extern __typeof (g_file_query_writable_namespaces) g_file_query_writable_namespaces __attribute((alias("IA__g_file_query_writable_namespaces"), visibility("default"))); + +#undef g_file_set_attribute +extern __typeof (g_file_set_attribute) g_file_set_attribute __attribute((alias("IA__g_file_set_attribute"), visibility("default"))); + +#undef g_file_set_attributes_from_info +extern __typeof (g_file_set_attributes_from_info) g_file_set_attributes_from_info __attribute((alias("IA__g_file_set_attributes_from_info"), visibility("default"))); + +#undef g_file_set_attributes_async +extern __typeof (g_file_set_attributes_async) g_file_set_attributes_async __attribute((alias("IA__g_file_set_attributes_async"), visibility("default"))); + +#undef g_file_set_attributes_finish +extern __typeof (g_file_set_attributes_finish) g_file_set_attributes_finish __attribute((alias("IA__g_file_set_attributes_finish"), visibility("default"))); + +#undef g_file_set_attribute_string +extern __typeof (g_file_set_attribute_string) g_file_set_attribute_string __attribute((alias("IA__g_file_set_attribute_string"), visibility("default"))); + +#undef g_file_set_attribute_byte_string +extern __typeof (g_file_set_attribute_byte_string) g_file_set_attribute_byte_string __attribute((alias("IA__g_file_set_attribute_byte_string"), visibility("default"))); + +#undef g_file_set_attribute_uint32 +extern __typeof (g_file_set_attribute_uint32) g_file_set_attribute_uint32 __attribute((alias("IA__g_file_set_attribute_uint32"), visibility("default"))); + +#undef g_file_set_attribute_int32 +extern __typeof (g_file_set_attribute_int32) g_file_set_attribute_int32 __attribute((alias("IA__g_file_set_attribute_int32"), visibility("default"))); + +#undef g_file_set_attribute_uint64 +extern __typeof (g_file_set_attribute_uint64) g_file_set_attribute_uint64 __attribute((alias("IA__g_file_set_attribute_uint64"), visibility("default"))); + +#undef g_file_set_attribute_int64 +extern __typeof (g_file_set_attribute_int64) g_file_set_attribute_int64 __attribute((alias("IA__g_file_set_attribute_int64"), visibility("default"))); + +#undef g_file_mount_enclosing_volume +extern __typeof (g_file_mount_enclosing_volume) g_file_mount_enclosing_volume __attribute((alias("IA__g_file_mount_enclosing_volume"), visibility("default"))); + +#undef g_file_mount_enclosing_volume_finish +extern __typeof (g_file_mount_enclosing_volume_finish) g_file_mount_enclosing_volume_finish __attribute((alias("IA__g_file_mount_enclosing_volume_finish"), visibility("default"))); + +#undef g_file_mount_mountable +extern __typeof (g_file_mount_mountable) g_file_mount_mountable __attribute((alias("IA__g_file_mount_mountable"), visibility("default"))); + +#undef g_file_mount_mountable_finish +extern __typeof (g_file_mount_mountable_finish) g_file_mount_mountable_finish __attribute((alias("IA__g_file_mount_mountable_finish"), visibility("default"))); + +#undef g_file_unmount_mountable_with_operation +extern __typeof (g_file_unmount_mountable_with_operation) g_file_unmount_mountable_with_operation __attribute((alias("IA__g_file_unmount_mountable_with_operation"), visibility("default"))); + +#undef g_file_unmount_mountable_with_operation_finish +extern __typeof (g_file_unmount_mountable_with_operation_finish) g_file_unmount_mountable_with_operation_finish __attribute((alias("IA__g_file_unmount_mountable_with_operation_finish"), visibility("default"))); + +#undef g_file_eject_mountable_with_operation +extern __typeof (g_file_eject_mountable_with_operation) g_file_eject_mountable_with_operation __attribute((alias("IA__g_file_eject_mountable_with_operation"), visibility("default"))); + +#undef g_file_eject_mountable_with_operation_finish +extern __typeof (g_file_eject_mountable_with_operation_finish) g_file_eject_mountable_with_operation_finish __attribute((alias("IA__g_file_eject_mountable_with_operation_finish"), visibility("default"))); + +#undef g_file_copy_attributes +extern __typeof (g_file_copy_attributes) g_file_copy_attributes __attribute((alias("IA__g_file_copy_attributes"), visibility("default"))); + +#undef g_file_monitor_directory +extern __typeof (g_file_monitor_directory) g_file_monitor_directory __attribute((alias("IA__g_file_monitor_directory"), visibility("default"))); + +#undef g_file_monitor_file +extern __typeof (g_file_monitor_file) g_file_monitor_file __attribute((alias("IA__g_file_monitor_file"), visibility("default"))); + +#undef g_file_monitor +extern __typeof (g_file_monitor) g_file_monitor __attribute((alias("IA__g_file_monitor"), visibility("default"))); + +#undef g_file_query_default_handler +extern __typeof (g_file_query_default_handler) g_file_query_default_handler __attribute((alias("IA__g_file_query_default_handler"), visibility("default"))); + +#undef g_file_load_contents +extern __typeof (g_file_load_contents) g_file_load_contents __attribute((alias("IA__g_file_load_contents"), visibility("default"))); + +#undef g_file_load_contents_async +extern __typeof (g_file_load_contents_async) g_file_load_contents_async __attribute((alias("IA__g_file_load_contents_async"), visibility("default"))); + +#undef g_file_load_contents_finish +extern __typeof (g_file_load_contents_finish) g_file_load_contents_finish __attribute((alias("IA__g_file_load_contents_finish"), visibility("default"))); + +#undef g_file_load_partial_contents_async +extern __typeof (g_file_load_partial_contents_async) g_file_load_partial_contents_async __attribute((alias("IA__g_file_load_partial_contents_async"), visibility("default"))); + +#undef g_file_load_partial_contents_finish +extern __typeof (g_file_load_partial_contents_finish) g_file_load_partial_contents_finish __attribute((alias("IA__g_file_load_partial_contents_finish"), visibility("default"))); + +#undef g_file_replace_contents +extern __typeof (g_file_replace_contents) g_file_replace_contents __attribute((alias("IA__g_file_replace_contents"), visibility("default"))); + +#undef g_file_replace_contents_async +extern __typeof (g_file_replace_contents_async) g_file_replace_contents_async __attribute((alias("IA__g_file_replace_contents_async"), visibility("default"))); + +#undef g_file_replace_contents_finish +extern __typeof (g_file_replace_contents_finish) g_file_replace_contents_finish __attribute((alias("IA__g_file_replace_contents_finish"), visibility("default"))); + +#undef g_file_create_readwrite +extern __typeof (g_file_create_readwrite) g_file_create_readwrite __attribute((alias("IA__g_file_create_readwrite"), visibility("default"))); + +#undef g_file_create_readwrite_async +extern __typeof (g_file_create_readwrite_async) g_file_create_readwrite_async __attribute((alias("IA__g_file_create_readwrite_async"), visibility("default"))); + +#undef g_file_create_readwrite_finish +extern __typeof (g_file_create_readwrite_finish) g_file_create_readwrite_finish __attribute((alias("IA__g_file_create_readwrite_finish"), visibility("default"))); + +#undef g_file_open_readwrite +extern __typeof (g_file_open_readwrite) g_file_open_readwrite __attribute((alias("IA__g_file_open_readwrite"), visibility("default"))); + +#undef g_file_open_readwrite_async +extern __typeof (g_file_open_readwrite_async) g_file_open_readwrite_async __attribute((alias("IA__g_file_open_readwrite_async"), visibility("default"))); + +#undef g_file_open_readwrite_finish +extern __typeof (g_file_open_readwrite_finish) g_file_open_readwrite_finish __attribute((alias("IA__g_file_open_readwrite_finish"), visibility("default"))); + +#undef g_file_replace_readwrite +extern __typeof (g_file_replace_readwrite) g_file_replace_readwrite __attribute((alias("IA__g_file_replace_readwrite"), visibility("default"))); + +#undef g_file_replace_readwrite_async +extern __typeof (g_file_replace_readwrite_async) g_file_replace_readwrite_async __attribute((alias("IA__g_file_replace_readwrite_async"), visibility("default"))); + +#undef g_file_replace_readwrite_finish +extern __typeof (g_file_replace_readwrite_finish) g_file_replace_readwrite_finish __attribute((alias("IA__g_file_replace_readwrite_finish"), visibility("default"))); + +#undef g_file_start_mountable +extern __typeof (g_file_start_mountable) g_file_start_mountable __attribute((alias("IA__g_file_start_mountable"), visibility("default"))); + +#undef g_file_start_mountable_finish +extern __typeof (g_file_start_mountable_finish) g_file_start_mountable_finish __attribute((alias("IA__g_file_start_mountable_finish"), visibility("default"))); + +#undef g_file_stop_mountable +extern __typeof (g_file_stop_mountable) g_file_stop_mountable __attribute((alias("IA__g_file_stop_mountable"), visibility("default"))); + +#undef g_file_stop_mountable_finish +extern __typeof (g_file_stop_mountable_finish) g_file_stop_mountable_finish __attribute((alias("IA__g_file_stop_mountable_finish"), visibility("default"))); + +#undef g_file_supports_thread_contexts +extern __typeof (g_file_supports_thread_contexts) g_file_supports_thread_contexts __attribute((alias("IA__g_file_supports_thread_contexts"), visibility("default"))); + +#undef g_file_poll_mountable +extern __typeof (g_file_poll_mountable) g_file_poll_mountable __attribute((alias("IA__g_file_poll_mountable"), visibility("default"))); + +#undef g_file_poll_mountable_finish +extern __typeof (g_file_poll_mountable_finish) g_file_poll_mountable_finish __attribute((alias("IA__g_file_poll_mountable_finish"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_file_unmount_mountable +extern __typeof (g_file_unmount_mountable) g_file_unmount_mountable __attribute((alias("IA__g_file_unmount_mountable"), visibility("default"))); + +#undef g_file_unmount_mountable_finish +extern __typeof (g_file_unmount_mountable_finish) g_file_unmount_mountable_finish __attribute((alias("IA__g_file_unmount_mountable_finish"), visibility("default"))); + +#undef g_file_eject_mountable +extern __typeof (g_file_eject_mountable) g_file_eject_mountable __attribute((alias("IA__g_file_eject_mountable"), visibility("default"))); + +#undef g_file_eject_mountable_finish +extern __typeof (g_file_eject_mountable_finish) g_file_eject_mountable_finish __attribute((alias("IA__g_file_eject_mountable_finish"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_FILE_ENUMERATOR_H__) +#if IN_FILE(__G_FILE_ENUMERATOR_C__) +#undef g_file_enumerator_get_type +extern __typeof (g_file_enumerator_get_type) g_file_enumerator_get_type __attribute((alias("IA__g_file_enumerator_get_type"), visibility("default"))); + +#undef g_file_enumerator_next_file +extern __typeof (g_file_enumerator_next_file) g_file_enumerator_next_file __attribute((alias("IA__g_file_enumerator_next_file"), visibility("default"))); + +#undef g_file_enumerator_close +extern __typeof (g_file_enumerator_close) g_file_enumerator_close __attribute((alias("IA__g_file_enumerator_close"), visibility("default"))); + +#undef g_file_enumerator_next_files_async +extern __typeof (g_file_enumerator_next_files_async) g_file_enumerator_next_files_async __attribute((alias("IA__g_file_enumerator_next_files_async"), visibility("default"))); + +#undef g_file_enumerator_next_files_finish +extern __typeof (g_file_enumerator_next_files_finish) g_file_enumerator_next_files_finish __attribute((alias("IA__g_file_enumerator_next_files_finish"), visibility("default"))); + +#undef g_file_enumerator_close_async +extern __typeof (g_file_enumerator_close_async) g_file_enumerator_close_async __attribute((alias("IA__g_file_enumerator_close_async"), visibility("default"))); + +#undef g_file_enumerator_close_finish +extern __typeof (g_file_enumerator_close_finish) g_file_enumerator_close_finish __attribute((alias("IA__g_file_enumerator_close_finish"), visibility("default"))); + +#undef g_file_enumerator_is_closed +extern __typeof (g_file_enumerator_is_closed) g_file_enumerator_is_closed __attribute((alias("IA__g_file_enumerator_is_closed"), visibility("default"))); + +#undef g_file_enumerator_has_pending +extern __typeof (g_file_enumerator_has_pending) g_file_enumerator_has_pending __attribute((alias("IA__g_file_enumerator_has_pending"), visibility("default"))); + +#undef g_file_enumerator_set_pending +extern __typeof (g_file_enumerator_set_pending) g_file_enumerator_set_pending __attribute((alias("IA__g_file_enumerator_set_pending"), visibility("default"))); + +#undef g_file_enumerator_get_container +extern __typeof (g_file_enumerator_get_container) g_file_enumerator_get_container __attribute((alias("IA__g_file_enumerator_get_container"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_ICON_H__) +#if IN_FILE(__G_FILE_ICON_C__) +#undef g_file_icon_get_type +extern __typeof (g_file_icon_get_type) g_file_icon_get_type __attribute((alias("IA__g_file_icon_get_type"), visibility("default"))); + +#undef g_file_icon_new +extern __typeof (g_file_icon_new) g_file_icon_new __attribute((alias("IA__g_file_icon_new"), visibility("default"))); + +#undef g_file_icon_get_file +extern __typeof (g_file_icon_get_file) g_file_icon_get_file __attribute((alias("IA__g_file_icon_get_file"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_INFO_H__) +#if IN_FILE(__G_FILE_INFO_C__) +#undef g_file_info_get_type +extern __typeof (g_file_info_get_type) g_file_info_get_type __attribute((alias("IA__g_file_info_get_type"), visibility("default"))); + +#undef g_file_info_new +extern __typeof (g_file_info_new) g_file_info_new __attribute((alias("IA__g_file_info_new"), visibility("default"))); + +#undef g_file_info_dup +extern __typeof (g_file_info_dup) g_file_info_dup __attribute((alias("IA__g_file_info_dup"), visibility("default"))); + +#undef g_file_info_copy_into +extern __typeof (g_file_info_copy_into) g_file_info_copy_into __attribute((alias("IA__g_file_info_copy_into"), visibility("default"))); + +#undef g_file_info_has_attribute +extern __typeof (g_file_info_has_attribute) g_file_info_has_attribute __attribute((alias("IA__g_file_info_has_attribute"), visibility("default"))); + +#undef g_file_info_has_namespace +extern __typeof (g_file_info_has_namespace) g_file_info_has_namespace __attribute((alias("IA__g_file_info_has_namespace"), visibility("default"))); + +#undef g_file_info_list_attributes +extern __typeof (g_file_info_list_attributes) g_file_info_list_attributes __attribute((alias("IA__g_file_info_list_attributes"), visibility("default"))); + +#undef g_file_info_get_attribute_type +extern __typeof (g_file_info_get_attribute_type) g_file_info_get_attribute_type __attribute((alias("IA__g_file_info_get_attribute_type"), visibility("default"))); + +#undef g_file_info_remove_attribute +extern __typeof (g_file_info_remove_attribute) g_file_info_remove_attribute __attribute((alias("IA__g_file_info_remove_attribute"), visibility("default"))); + +#undef g_file_info_get_attribute_status +extern __typeof (g_file_info_get_attribute_status) g_file_info_get_attribute_status __attribute((alias("IA__g_file_info_get_attribute_status"), visibility("default"))); + +#undef g_file_info_get_attribute_data +extern __typeof (g_file_info_get_attribute_data) g_file_info_get_attribute_data __attribute((alias("IA__g_file_info_get_attribute_data"), visibility("default"))); + +#undef g_file_info_get_attribute_as_string +extern __typeof (g_file_info_get_attribute_as_string) g_file_info_get_attribute_as_string __attribute((alias("IA__g_file_info_get_attribute_as_string"), visibility("default"))); + +#undef g_file_info_get_attribute_string +extern __typeof (g_file_info_get_attribute_string) g_file_info_get_attribute_string __attribute((alias("IA__g_file_info_get_attribute_string"), visibility("default"))); + +#undef g_file_info_get_attribute_byte_string +extern __typeof (g_file_info_get_attribute_byte_string) g_file_info_get_attribute_byte_string __attribute((alias("IA__g_file_info_get_attribute_byte_string"), visibility("default"))); + +#undef g_file_info_get_attribute_boolean +extern __typeof (g_file_info_get_attribute_boolean) g_file_info_get_attribute_boolean __attribute((alias("IA__g_file_info_get_attribute_boolean"), visibility("default"))); + +#undef g_file_info_get_attribute_uint32 +extern __typeof (g_file_info_get_attribute_uint32) g_file_info_get_attribute_uint32 __attribute((alias("IA__g_file_info_get_attribute_uint32"), visibility("default"))); + +#undef g_file_info_get_attribute_int32 +extern __typeof (g_file_info_get_attribute_int32) g_file_info_get_attribute_int32 __attribute((alias("IA__g_file_info_get_attribute_int32"), visibility("default"))); + +#undef g_file_info_get_attribute_uint64 +extern __typeof (g_file_info_get_attribute_uint64) g_file_info_get_attribute_uint64 __attribute((alias("IA__g_file_info_get_attribute_uint64"), visibility("default"))); + +#undef g_file_info_get_attribute_int64 +extern __typeof (g_file_info_get_attribute_int64) g_file_info_get_attribute_int64 __attribute((alias("IA__g_file_info_get_attribute_int64"), visibility("default"))); + +#undef g_file_info_get_attribute_object +extern __typeof (g_file_info_get_attribute_object) g_file_info_get_attribute_object __attribute((alias("IA__g_file_info_get_attribute_object"), visibility("default"))); + +#undef g_file_info_get_attribute_stringv +extern __typeof (g_file_info_get_attribute_stringv) g_file_info_get_attribute_stringv __attribute((alias("IA__g_file_info_get_attribute_stringv"), visibility("default"))); + +#undef g_file_info_set_attribute_status +extern __typeof (g_file_info_set_attribute_status) g_file_info_set_attribute_status __attribute((alias("IA__g_file_info_set_attribute_status"), visibility("default"))); + +#undef g_file_info_set_attribute +extern __typeof (g_file_info_set_attribute) g_file_info_set_attribute __attribute((alias("IA__g_file_info_set_attribute"), visibility("default"))); + +#undef g_file_info_set_attribute_string +extern __typeof (g_file_info_set_attribute_string) g_file_info_set_attribute_string __attribute((alias("IA__g_file_info_set_attribute_string"), visibility("default"))); + +#undef g_file_info_set_attribute_byte_string +extern __typeof (g_file_info_set_attribute_byte_string) g_file_info_set_attribute_byte_string __attribute((alias("IA__g_file_info_set_attribute_byte_string"), visibility("default"))); + +#undef g_file_info_set_attribute_boolean +extern __typeof (g_file_info_set_attribute_boolean) g_file_info_set_attribute_boolean __attribute((alias("IA__g_file_info_set_attribute_boolean"), visibility("default"))); + +#undef g_file_info_set_attribute_uint32 +extern __typeof (g_file_info_set_attribute_uint32) g_file_info_set_attribute_uint32 __attribute((alias("IA__g_file_info_set_attribute_uint32"), visibility("default"))); + +#undef g_file_info_set_attribute_int32 +extern __typeof (g_file_info_set_attribute_int32) g_file_info_set_attribute_int32 __attribute((alias("IA__g_file_info_set_attribute_int32"), visibility("default"))); + +#undef g_file_info_set_attribute_uint64 +extern __typeof (g_file_info_set_attribute_uint64) g_file_info_set_attribute_uint64 __attribute((alias("IA__g_file_info_set_attribute_uint64"), visibility("default"))); + +#undef g_file_info_set_attribute_int64 +extern __typeof (g_file_info_set_attribute_int64) g_file_info_set_attribute_int64 __attribute((alias("IA__g_file_info_set_attribute_int64"), visibility("default"))); + +#undef g_file_info_set_attribute_object +extern __typeof (g_file_info_set_attribute_object) g_file_info_set_attribute_object __attribute((alias("IA__g_file_info_set_attribute_object"), visibility("default"))); + +#undef g_file_info_set_attribute_stringv +extern __typeof (g_file_info_set_attribute_stringv) g_file_info_set_attribute_stringv __attribute((alias("IA__g_file_info_set_attribute_stringv"), visibility("default"))); + +#undef g_file_info_clear_status +extern __typeof (g_file_info_clear_status) g_file_info_clear_status __attribute((alias("IA__g_file_info_clear_status"), visibility("default"))); + +#undef g_file_info_get_file_type +extern __typeof (g_file_info_get_file_type) g_file_info_get_file_type __attribute((alias("IA__g_file_info_get_file_type"), visibility("default"))); + +#undef g_file_info_get_is_hidden +extern __typeof (g_file_info_get_is_hidden) g_file_info_get_is_hidden __attribute((alias("IA__g_file_info_get_is_hidden"), visibility("default"))); + +#undef g_file_info_get_is_backup +extern __typeof (g_file_info_get_is_backup) g_file_info_get_is_backup __attribute((alias("IA__g_file_info_get_is_backup"), visibility("default"))); + +#undef g_file_info_get_is_symlink +extern __typeof (g_file_info_get_is_symlink) g_file_info_get_is_symlink __attribute((alias("IA__g_file_info_get_is_symlink"), visibility("default"))); + +#undef g_file_info_get_name +extern __typeof (g_file_info_get_name) g_file_info_get_name __attribute((alias("IA__g_file_info_get_name"), visibility("default"))); + +#undef g_file_info_get_display_name +extern __typeof (g_file_info_get_display_name) g_file_info_get_display_name __attribute((alias("IA__g_file_info_get_display_name"), visibility("default"))); + +#undef g_file_info_get_edit_name +extern __typeof (g_file_info_get_edit_name) g_file_info_get_edit_name __attribute((alias("IA__g_file_info_get_edit_name"), visibility("default"))); + +#undef g_file_info_get_icon +extern __typeof (g_file_info_get_icon) g_file_info_get_icon __attribute((alias("IA__g_file_info_get_icon"), visibility("default"))); + +#undef g_file_info_get_content_type +extern __typeof (g_file_info_get_content_type) g_file_info_get_content_type __attribute((alias("IA__g_file_info_get_content_type"), visibility("default"))); + +#undef g_file_info_get_size +extern __typeof (g_file_info_get_size) g_file_info_get_size __attribute((alias("IA__g_file_info_get_size"), visibility("default"))); + +#undef g_file_info_get_modification_time +extern __typeof (g_file_info_get_modification_time) g_file_info_get_modification_time __attribute((alias("IA__g_file_info_get_modification_time"), visibility("default"))); + +#undef g_file_info_get_symlink_target +extern __typeof (g_file_info_get_symlink_target) g_file_info_get_symlink_target __attribute((alias("IA__g_file_info_get_symlink_target"), visibility("default"))); + +#undef g_file_info_get_etag +extern __typeof (g_file_info_get_etag) g_file_info_get_etag __attribute((alias("IA__g_file_info_get_etag"), visibility("default"))); + +#undef g_file_info_get_sort_order +extern __typeof (g_file_info_get_sort_order) g_file_info_get_sort_order __attribute((alias("IA__g_file_info_get_sort_order"), visibility("default"))); + +#undef g_file_info_set_attribute_mask +extern __typeof (g_file_info_set_attribute_mask) g_file_info_set_attribute_mask __attribute((alias("IA__g_file_info_set_attribute_mask"), visibility("default"))); + +#undef g_file_info_unset_attribute_mask +extern __typeof (g_file_info_unset_attribute_mask) g_file_info_unset_attribute_mask __attribute((alias("IA__g_file_info_unset_attribute_mask"), visibility("default"))); + +#undef g_file_info_set_file_type +extern __typeof (g_file_info_set_file_type) g_file_info_set_file_type __attribute((alias("IA__g_file_info_set_file_type"), visibility("default"))); + +#undef g_file_info_set_is_hidden +extern __typeof (g_file_info_set_is_hidden) g_file_info_set_is_hidden __attribute((alias("IA__g_file_info_set_is_hidden"), visibility("default"))); + +#undef g_file_info_set_is_symlink +extern __typeof (g_file_info_set_is_symlink) g_file_info_set_is_symlink __attribute((alias("IA__g_file_info_set_is_symlink"), visibility("default"))); + +#undef g_file_info_set_name +extern __typeof (g_file_info_set_name) g_file_info_set_name __attribute((alias("IA__g_file_info_set_name"), visibility("default"))); + +#undef g_file_info_set_display_name +extern __typeof (g_file_info_set_display_name) g_file_info_set_display_name __attribute((alias("IA__g_file_info_set_display_name"), visibility("default"))); + +#undef g_file_info_set_edit_name +extern __typeof (g_file_info_set_edit_name) g_file_info_set_edit_name __attribute((alias("IA__g_file_info_set_edit_name"), visibility("default"))); + +#undef g_file_info_set_icon +extern __typeof (g_file_info_set_icon) g_file_info_set_icon __attribute((alias("IA__g_file_info_set_icon"), visibility("default"))); + +#undef g_file_info_set_content_type +extern __typeof (g_file_info_set_content_type) g_file_info_set_content_type __attribute((alias("IA__g_file_info_set_content_type"), visibility("default"))); + +#undef g_file_info_set_size +extern __typeof (g_file_info_set_size) g_file_info_set_size __attribute((alias("IA__g_file_info_set_size"), visibility("default"))); + +#undef g_file_info_set_modification_time +extern __typeof (g_file_info_set_modification_time) g_file_info_set_modification_time __attribute((alias("IA__g_file_info_set_modification_time"), visibility("default"))); + +#undef g_file_info_set_symlink_target +extern __typeof (g_file_info_set_symlink_target) g_file_info_set_symlink_target __attribute((alias("IA__g_file_info_set_symlink_target"), visibility("default"))); + +#undef g_file_info_set_sort_order +extern __typeof (g_file_info_set_sort_order) g_file_info_set_sort_order __attribute((alias("IA__g_file_info_set_sort_order"), visibility("default"))); + +#undef g_file_attribute_matcher_new +extern __typeof (g_file_attribute_matcher_new) g_file_attribute_matcher_new __attribute((alias("IA__g_file_attribute_matcher_new"), visibility("default"))); + +#undef g_file_attribute_matcher_ref +extern __typeof (g_file_attribute_matcher_ref) g_file_attribute_matcher_ref __attribute((alias("IA__g_file_attribute_matcher_ref"), visibility("default"))); + +#undef g_file_attribute_matcher_unref +extern __typeof (g_file_attribute_matcher_unref) g_file_attribute_matcher_unref __attribute((alias("IA__g_file_attribute_matcher_unref"), visibility("default"))); + +#undef g_file_attribute_matcher_matches +extern __typeof (g_file_attribute_matcher_matches) g_file_attribute_matcher_matches __attribute((alias("IA__g_file_attribute_matcher_matches"), visibility("default"))); + +#undef g_file_attribute_matcher_matches_only +extern __typeof (g_file_attribute_matcher_matches_only) g_file_attribute_matcher_matches_only __attribute((alias("IA__g_file_attribute_matcher_matches_only"), visibility("default"))); + +#undef g_file_attribute_matcher_enumerate_namespace +extern __typeof (g_file_attribute_matcher_enumerate_namespace) g_file_attribute_matcher_enumerate_namespace __attribute((alias("IA__g_file_attribute_matcher_enumerate_namespace"), visibility("default"))); + +#undef g_file_attribute_matcher_enumerate_next +extern __typeof (g_file_attribute_matcher_enumerate_next) g_file_attribute_matcher_enumerate_next __attribute((alias("IA__g_file_attribute_matcher_enumerate_next"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_INPUT_STREAM_H__) +#if IN_FILE(__G_FILE_INPUT_STREAM_C__) +#undef g_file_input_stream_get_type +extern __typeof (g_file_input_stream_get_type) g_file_input_stream_get_type __attribute((alias("IA__g_file_input_stream_get_type"), visibility("default"))); + +#undef g_file_input_stream_query_info +extern __typeof (g_file_input_stream_query_info) g_file_input_stream_query_info __attribute((alias("IA__g_file_input_stream_query_info"), visibility("default"))); + +#undef g_file_input_stream_query_info_async +extern __typeof (g_file_input_stream_query_info_async) g_file_input_stream_query_info_async __attribute((alias("IA__g_file_input_stream_query_info_async"), visibility("default"))); + +#undef g_file_input_stream_query_info_finish +extern __typeof (g_file_input_stream_query_info_finish) g_file_input_stream_query_info_finish __attribute((alias("IA__g_file_input_stream_query_info_finish"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_MONITOR_H__) +#if IN_FILE(__G_FILE_MONITOR_C__) +#undef g_file_monitor_get_type +extern __typeof (g_file_monitor_get_type) g_file_monitor_get_type __attribute((alias("IA__g_file_monitor_get_type"), visibility("default"))); + +#undef g_file_monitor_cancel +extern __typeof (g_file_monitor_cancel) g_file_monitor_cancel __attribute((alias("IA__g_file_monitor_cancel"), visibility("default"))); + +#undef g_file_monitor_is_cancelled +extern __typeof (g_file_monitor_is_cancelled) g_file_monitor_is_cancelled __attribute((alias("IA__g_file_monitor_is_cancelled"), visibility("default"))); + +#undef g_file_monitor_set_rate_limit +extern __typeof (g_file_monitor_set_rate_limit) g_file_monitor_set_rate_limit __attribute((alias("IA__g_file_monitor_set_rate_limit"), visibility("default"))); + +#undef g_file_monitor_emit_event +extern __typeof (g_file_monitor_emit_event) g_file_monitor_emit_event __attribute((alias("IA__g_file_monitor_emit_event"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILENAME_COMPLETER_H__) +#if IN_FILE(__G_FILENAME_COMPLETER_C__) +#undef g_filename_completer_get_type +extern __typeof (g_filename_completer_get_type) g_filename_completer_get_type __attribute((alias("IA__g_filename_completer_get_type"), visibility("default"))); + +#undef g_filename_completer_new +extern __typeof (g_filename_completer_new) g_filename_completer_new __attribute((alias("IA__g_filename_completer_new"), visibility("default"))); + +#undef g_filename_completer_get_completion_suffix +extern __typeof (g_filename_completer_get_completion_suffix) g_filename_completer_get_completion_suffix __attribute((alias("IA__g_filename_completer_get_completion_suffix"), visibility("default"))); + +#undef g_filename_completer_get_completions +extern __typeof (g_filename_completer_get_completions) g_filename_completer_get_completions __attribute((alias("IA__g_filename_completer_get_completions"), visibility("default"))); + +#undef g_filename_completer_set_dirs_only +extern __typeof (g_filename_completer_set_dirs_only) g_filename_completer_set_dirs_only __attribute((alias("IA__g_filename_completer_set_dirs_only"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_OUTPUT_STREAM_H__) +#if IN_FILE(__G_FILE_OUTPUT_STREAM_C__) +#undef g_file_output_stream_get_type +extern __typeof (g_file_output_stream_get_type) g_file_output_stream_get_type __attribute((alias("IA__g_file_output_stream_get_type"), visibility("default"))); + +#undef g_file_output_stream_query_info +extern __typeof (g_file_output_stream_query_info) g_file_output_stream_query_info __attribute((alias("IA__g_file_output_stream_query_info"), visibility("default"))); + +#undef g_file_output_stream_query_info_async +extern __typeof (g_file_output_stream_query_info_async) g_file_output_stream_query_info_async __attribute((alias("IA__g_file_output_stream_query_info_async"), visibility("default"))); + +#undef g_file_output_stream_query_info_finish +extern __typeof (g_file_output_stream_query_info_finish) g_file_output_stream_query_info_finish __attribute((alias("IA__g_file_output_stream_query_info_finish"), visibility("default"))); + +#undef g_file_output_stream_get_etag +extern __typeof (g_file_output_stream_get_etag) g_file_output_stream_get_etag __attribute((alias("IA__g_file_output_stream_get_etag"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_IO_STREAM_H__) +#if IN_FILE(__G_FILE_IO_STREAM_C__) +#undef g_file_io_stream_get_type +extern __typeof (g_file_io_stream_get_type) g_file_io_stream_get_type __attribute((alias("IA__g_file_io_stream_get_type"), visibility("default"))); + +#undef g_file_io_stream_query_info +extern __typeof (g_file_io_stream_query_info) g_file_io_stream_query_info __attribute((alias("IA__g_file_io_stream_query_info"), visibility("default"))); + +#undef g_file_io_stream_query_info_async +extern __typeof (g_file_io_stream_query_info_async) g_file_io_stream_query_info_async __attribute((alias("IA__g_file_io_stream_query_info_async"), visibility("default"))); + +#undef g_file_io_stream_query_info_finish +extern __typeof (g_file_io_stream_query_info_finish) g_file_io_stream_query_info_finish __attribute((alias("IA__g_file_io_stream_query_info_finish"), visibility("default"))); + +#undef g_file_io_stream_get_etag +extern __typeof (g_file_io_stream_get_etag) g_file_io_stream_get_etag __attribute((alias("IA__g_file_io_stream_get_etag"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILTER_INPUT_STREAM_H__) +#if IN_FILE(__G_FILTER_INPUT_STREAM_C__) +#undef g_filter_input_stream_get_type +extern __typeof (g_filter_input_stream_get_type) g_filter_input_stream_get_type __attribute((alias("IA__g_filter_input_stream_get_type"), visibility("default"))); + +#undef g_filter_input_stream_get_base_stream +extern __typeof (g_filter_input_stream_get_base_stream) g_filter_input_stream_get_base_stream __attribute((alias("IA__g_filter_input_stream_get_base_stream"), visibility("default"))); + +#undef g_filter_input_stream_get_close_base_stream +extern __typeof (g_filter_input_stream_get_close_base_stream) g_filter_input_stream_get_close_base_stream __attribute((alias("IA__g_filter_input_stream_get_close_base_stream"), visibility("default"))); + +#undef g_filter_input_stream_set_close_base_stream +extern __typeof (g_filter_input_stream_set_close_base_stream) g_filter_input_stream_set_close_base_stream __attribute((alias("IA__g_filter_input_stream_set_close_base_stream"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILTER_OUTPUT_STREAM_H__) +#if IN_FILE(__G_FILTER_OUTPUT_STREAM_C__) +#undef g_filter_output_stream_get_type +extern __typeof (g_filter_output_stream_get_type) g_filter_output_stream_get_type __attribute((alias("IA__g_filter_output_stream_get_type"), visibility("default"))); + +#undef g_filter_output_stream_get_base_stream +extern __typeof (g_filter_output_stream_get_base_stream) g_filter_output_stream_get_base_stream __attribute((alias("IA__g_filter_output_stream_get_base_stream"), visibility("default"))); + +#undef g_filter_output_stream_get_close_base_stream +extern __typeof (g_filter_output_stream_get_close_base_stream) g_filter_output_stream_get_close_base_stream __attribute((alias("IA__g_filter_output_stream_get_close_base_stream"), visibility("default"))); + +#undef g_filter_output_stream_set_close_base_stream +extern __typeof (g_filter_output_stream_set_close_base_stream) g_filter_output_stream_set_close_base_stream __attribute((alias("IA__g_filter_output_stream_set_close_base_stream"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_ICON_H__) +#if IN_FILE(__G_ICON_C__) +#undef g_icon_get_type +extern __typeof (g_icon_get_type) g_icon_get_type __attribute((alias("IA__g_icon_get_type"), visibility("default"))); + +#undef g_icon_hash +extern __typeof (g_icon_hash) g_icon_hash __attribute((alias("IA__g_icon_hash"), visibility("default"))); + +#undef g_icon_equal +extern __typeof (g_icon_equal) g_icon_equal __attribute((alias("IA__g_icon_equal"), visibility("default"))); + +#undef g_icon_to_string +extern __typeof (g_icon_to_string) g_icon_to_string __attribute((alias("IA__g_icon_to_string"), visibility("default"))); + +#undef g_icon_new_for_string +extern __typeof (g_icon_new_for_string) g_icon_new_for_string __attribute((alias("IA__g_icon_new_for_string"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_INPUT_STREAM_H__) +#if IN_FILE(__G_INPUT_STREAM_C__) +#undef g_input_stream_get_type +extern __typeof (g_input_stream_get_type) g_input_stream_get_type __attribute((alias("IA__g_input_stream_get_type"), visibility("default"))); + +#undef g_input_stream_read +extern __typeof (g_input_stream_read) g_input_stream_read __attribute((alias("IA__g_input_stream_read"), visibility("default"))); + +#undef g_input_stream_read_all +extern __typeof (g_input_stream_read_all) g_input_stream_read_all __attribute((alias("IA__g_input_stream_read_all"), visibility("default"))); + +#undef g_input_stream_skip +extern __typeof (g_input_stream_skip) g_input_stream_skip __attribute((alias("IA__g_input_stream_skip"), visibility("default"))); + +#undef g_input_stream_close +extern __typeof (g_input_stream_close) g_input_stream_close __attribute((alias("IA__g_input_stream_close"), visibility("default"))); + +#undef g_input_stream_read_async +extern __typeof (g_input_stream_read_async) g_input_stream_read_async __attribute((alias("IA__g_input_stream_read_async"), visibility("default"))); + +#undef g_input_stream_read_finish +extern __typeof (g_input_stream_read_finish) g_input_stream_read_finish __attribute((alias("IA__g_input_stream_read_finish"), visibility("default"))); + +#undef g_input_stream_skip_async +extern __typeof (g_input_stream_skip_async) g_input_stream_skip_async __attribute((alias("IA__g_input_stream_skip_async"), visibility("default"))); + +#undef g_input_stream_skip_finish +extern __typeof (g_input_stream_skip_finish) g_input_stream_skip_finish __attribute((alias("IA__g_input_stream_skip_finish"), visibility("default"))); + +#undef g_input_stream_close_async +extern __typeof (g_input_stream_close_async) g_input_stream_close_async __attribute((alias("IA__g_input_stream_close_async"), visibility("default"))); + +#undef g_input_stream_close_finish +extern __typeof (g_input_stream_close_finish) g_input_stream_close_finish __attribute((alias("IA__g_input_stream_close_finish"), visibility("default"))); + +#undef g_input_stream_is_closed +extern __typeof (g_input_stream_is_closed) g_input_stream_is_closed __attribute((alias("IA__g_input_stream_is_closed"), visibility("default"))); + +#undef g_input_stream_has_pending +extern __typeof (g_input_stream_has_pending) g_input_stream_has_pending __attribute((alias("IA__g_input_stream_has_pending"), visibility("default"))); + +#undef g_input_stream_set_pending +extern __typeof (g_input_stream_set_pending) g_input_stream_set_pending __attribute((alias("IA__g_input_stream_set_pending"), visibility("default"))); + +#undef g_input_stream_clear_pending +extern __typeof (g_input_stream_clear_pending) g_input_stream_clear_pending __attribute((alias("IA__g_input_stream_clear_pending"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_IO_STREAM_H__) +#if IN_FILE(__G_IO_STREAM_C__) +#undef g_io_stream_get_type +extern __typeof (g_io_stream_get_type) g_io_stream_get_type __attribute((alias("IA__g_io_stream_get_type"), visibility("default"))); + +#undef g_io_stream_get_input_stream +extern __typeof (g_io_stream_get_input_stream) g_io_stream_get_input_stream __attribute((alias("IA__g_io_stream_get_input_stream"), visibility("default"))); + +#undef g_io_stream_get_output_stream +extern __typeof (g_io_stream_get_output_stream) g_io_stream_get_output_stream __attribute((alias("IA__g_io_stream_get_output_stream"), visibility("default"))); + +#undef g_io_stream_close +extern __typeof (g_io_stream_close) g_io_stream_close __attribute((alias("IA__g_io_stream_close"), visibility("default"))); + +#undef g_io_stream_close_async +extern __typeof (g_io_stream_close_async) g_io_stream_close_async __attribute((alias("IA__g_io_stream_close_async"), visibility("default"))); + +#undef g_io_stream_close_finish +extern __typeof (g_io_stream_close_finish) g_io_stream_close_finish __attribute((alias("IA__g_io_stream_close_finish"), visibility("default"))); + +#undef g_io_stream_is_closed +extern __typeof (g_io_stream_is_closed) g_io_stream_is_closed __attribute((alias("IA__g_io_stream_is_closed"), visibility("default"))); + +#undef g_io_stream_has_pending +extern __typeof (g_io_stream_has_pending) g_io_stream_has_pending __attribute((alias("IA__g_io_stream_has_pending"), visibility("default"))); + +#undef g_io_stream_set_pending +extern __typeof (g_io_stream_set_pending) g_io_stream_set_pending __attribute((alias("IA__g_io_stream_set_pending"), visibility("default"))); + +#undef g_io_stream_clear_pending +extern __typeof (g_io_stream_clear_pending) g_io_stream_clear_pending __attribute((alias("IA__g_io_stream_clear_pending"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_IO_ERROR_H__) +#if IN_FILE(__G_IO_ERROR_C__) +#undef g_io_error_quark +extern __typeof (g_io_error_quark) g_io_error_quark __attribute((alias("IA__g_io_error_quark"), visibility("default"))); + +#undef g_io_error_from_errno +extern __typeof (g_io_error_from_errno) g_io_error_from_errno __attribute((alias("IA__g_io_error_from_errno"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_IO_MODULE_H__) +#if IN_FILE(__G_IO_MODULE_C__) +#undef g_io_module_get_type +extern __typeof (g_io_module_get_type) g_io_module_get_type __attribute((alias("IA__g_io_module_get_type"), visibility("default"))); + +#undef g_io_module_new +extern __typeof (g_io_module_new) g_io_module_new __attribute((alias("IA__g_io_module_new"), visibility("default"))); + +#undef g_io_modules_scan_all_in_directory +extern __typeof (g_io_modules_scan_all_in_directory) g_io_modules_scan_all_in_directory __attribute((alias("IA__g_io_modules_scan_all_in_directory"), visibility("default"))); + +#undef g_io_modules_load_all_in_directory +extern __typeof (g_io_modules_load_all_in_directory) g_io_modules_load_all_in_directory __attribute((alias("IA__g_io_modules_load_all_in_directory"), visibility("default"))); + +#undef g_io_extension_point_register +extern __typeof (g_io_extension_point_register) g_io_extension_point_register __attribute((alias("IA__g_io_extension_point_register"), visibility("default"))); + +#undef g_io_extension_point_lookup +extern __typeof (g_io_extension_point_lookup) g_io_extension_point_lookup __attribute((alias("IA__g_io_extension_point_lookup"), visibility("default"))); + +#undef g_io_extension_point_set_required_type +extern __typeof (g_io_extension_point_set_required_type) g_io_extension_point_set_required_type __attribute((alias("IA__g_io_extension_point_set_required_type"), visibility("default"))); + +#undef g_io_extension_point_get_required_type +extern __typeof (g_io_extension_point_get_required_type) g_io_extension_point_get_required_type __attribute((alias("IA__g_io_extension_point_get_required_type"), visibility("default"))); + +#undef g_io_extension_point_get_extensions +extern __typeof (g_io_extension_point_get_extensions) g_io_extension_point_get_extensions __attribute((alias("IA__g_io_extension_point_get_extensions"), visibility("default"))); + +#undef g_io_extension_point_get_extension_by_name +extern __typeof (g_io_extension_point_get_extension_by_name) g_io_extension_point_get_extension_by_name __attribute((alias("IA__g_io_extension_point_get_extension_by_name"), visibility("default"))); + +#undef g_io_extension_point_implement +extern __typeof (g_io_extension_point_implement) g_io_extension_point_implement __attribute((alias("IA__g_io_extension_point_implement"), visibility("default"))); + +#undef g_io_extension_get_type +extern __typeof (g_io_extension_get_type) g_io_extension_get_type __attribute((alias("IA__g_io_extension_get_type"), visibility("default"))); + +#undef g_io_extension_get_name +extern __typeof (g_io_extension_get_name) g_io_extension_get_name __attribute((alias("IA__g_io_extension_get_name"), visibility("default"))); + +#undef g_io_extension_get_priority +extern __typeof (g_io_extension_get_priority) g_io_extension_get_priority __attribute((alias("IA__g_io_extension_get_priority"), visibility("default"))); + +#undef g_io_extension_ref_class +extern __typeof (g_io_extension_ref_class) g_io_extension_ref_class __attribute((alias("IA__g_io_extension_ref_class"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_IO_SCHEDULER_H__) +#if IN_FILE(__G_IO_SCHEDULER_C__) +#undef g_io_scheduler_push_job +extern __typeof (g_io_scheduler_push_job) g_io_scheduler_push_job __attribute((alias("IA__g_io_scheduler_push_job"), visibility("default"))); + +#undef g_io_scheduler_cancel_all_jobs +extern __typeof (g_io_scheduler_cancel_all_jobs) g_io_scheduler_cancel_all_jobs __attribute((alias("IA__g_io_scheduler_cancel_all_jobs"), visibility("default"))); + +#undef g_io_scheduler_job_send_to_mainloop +extern __typeof (g_io_scheduler_job_send_to_mainloop) g_io_scheduler_job_send_to_mainloop __attribute((alias("IA__g_io_scheduler_job_send_to_mainloop"), visibility("default"))); + +#undef g_io_scheduler_job_send_to_mainloop_async +extern __typeof (g_io_scheduler_job_send_to_mainloop_async) g_io_scheduler_job_send_to_mainloop_async __attribute((alias("IA__g_io_scheduler_job_send_to_mainloop_async"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_LOADABLE_ICON_H__) +#if IN_FILE(__G_LOADABLE_ICON_C__) +#undef g_loadable_icon_get_type +extern __typeof (g_loadable_icon_get_type) g_loadable_icon_get_type __attribute((alias("IA__g_loadable_icon_get_type"), visibility("default"))); + +#undef g_loadable_icon_load +extern __typeof (g_loadable_icon_load) g_loadable_icon_load __attribute((alias("IA__g_loadable_icon_load"), visibility("default"))); + +#undef g_loadable_icon_load_async +extern __typeof (g_loadable_icon_load_async) g_loadable_icon_load_async __attribute((alias("IA__g_loadable_icon_load_async"), visibility("default"))); + +#undef g_loadable_icon_load_finish +extern __typeof (g_loadable_icon_load_finish) g_loadable_icon_load_finish __attribute((alias("IA__g_loadable_icon_load_finish"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_MEMORY_INPUT_STREAM_H__) +#if IN_FILE(__G_MEMORY_INPUT_STREAM_C__) +#undef g_memory_input_stream_get_type +extern __typeof (g_memory_input_stream_get_type) g_memory_input_stream_get_type __attribute((alias("IA__g_memory_input_stream_get_type"), visibility("default"))); + +#undef g_memory_input_stream_new +extern __typeof (g_memory_input_stream_new) g_memory_input_stream_new __attribute((alias("IA__g_memory_input_stream_new"), visibility("default"))); + +#undef g_memory_input_stream_new_from_data +extern __typeof (g_memory_input_stream_new_from_data) g_memory_input_stream_new_from_data __attribute((alias("IA__g_memory_input_stream_new_from_data"), visibility("default"))); + +#undef g_memory_input_stream_add_data +extern __typeof (g_memory_input_stream_add_data) g_memory_input_stream_add_data __attribute((alias("IA__g_memory_input_stream_add_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_MEMORY_OUTPUT_STREAM_H__) +#if IN_FILE(__G_MEMORY_OUTPUT_STREAM_C__) +#undef g_memory_output_stream_get_type +extern __typeof (g_memory_output_stream_get_type) g_memory_output_stream_get_type __attribute((alias("IA__g_memory_output_stream_get_type"), visibility("default"))); + +#undef g_memory_output_stream_new +extern __typeof (g_memory_output_stream_new) g_memory_output_stream_new __attribute((alias("IA__g_memory_output_stream_new"), visibility("default"))); + +#undef g_memory_output_stream_get_data +extern __typeof (g_memory_output_stream_get_data) g_memory_output_stream_get_data __attribute((alias("IA__g_memory_output_stream_get_data"), visibility("default"))); + +#undef g_memory_output_stream_get_data_size +extern __typeof (g_memory_output_stream_get_data_size) g_memory_output_stream_get_data_size __attribute((alias("IA__g_memory_output_stream_get_data_size"), visibility("default"))); + +#undef g_memory_output_stream_get_size +extern __typeof (g_memory_output_stream_get_size) g_memory_output_stream_get_size __attribute((alias("IA__g_memory_output_stream_get_size"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_MOUNT_OPERATION_H__) +#if IN_FILE(__G_MOUNT_OPERATION_C__) +#undef g_mount_operation_get_type +extern __typeof (g_mount_operation_get_type) g_mount_operation_get_type __attribute((alias("IA__g_mount_operation_get_type"), visibility("default"))); + +#undef g_mount_operation_new +extern __typeof (g_mount_operation_new) g_mount_operation_new __attribute((alias("IA__g_mount_operation_new"), visibility("default"))); + +#undef g_mount_operation_get_username +extern __typeof (g_mount_operation_get_username) g_mount_operation_get_username __attribute((alias("IA__g_mount_operation_get_username"), visibility("default"))); + +#undef g_mount_operation_set_username +extern __typeof (g_mount_operation_set_username) g_mount_operation_set_username __attribute((alias("IA__g_mount_operation_set_username"), visibility("default"))); + +#undef g_mount_operation_get_password +extern __typeof (g_mount_operation_get_password) g_mount_operation_get_password __attribute((alias("IA__g_mount_operation_get_password"), visibility("default"))); + +#undef g_mount_operation_set_password +extern __typeof (g_mount_operation_set_password) g_mount_operation_set_password __attribute((alias("IA__g_mount_operation_set_password"), visibility("default"))); + +#undef g_mount_operation_get_anonymous +extern __typeof (g_mount_operation_get_anonymous) g_mount_operation_get_anonymous __attribute((alias("IA__g_mount_operation_get_anonymous"), visibility("default"))); + +#undef g_mount_operation_set_anonymous +extern __typeof (g_mount_operation_set_anonymous) g_mount_operation_set_anonymous __attribute((alias("IA__g_mount_operation_set_anonymous"), visibility("default"))); + +#undef g_mount_operation_get_domain +extern __typeof (g_mount_operation_get_domain) g_mount_operation_get_domain __attribute((alias("IA__g_mount_operation_get_domain"), visibility("default"))); + +#undef g_mount_operation_set_domain +extern __typeof (g_mount_operation_set_domain) g_mount_operation_set_domain __attribute((alias("IA__g_mount_operation_set_domain"), visibility("default"))); + +#undef g_mount_operation_get_password_save +extern __typeof (g_mount_operation_get_password_save) g_mount_operation_get_password_save __attribute((alias("IA__g_mount_operation_get_password_save"), visibility("default"))); + +#undef g_mount_operation_set_password_save +extern __typeof (g_mount_operation_set_password_save) g_mount_operation_set_password_save __attribute((alias("IA__g_mount_operation_set_password_save"), visibility("default"))); + +#undef g_mount_operation_get_choice +extern __typeof (g_mount_operation_get_choice) g_mount_operation_get_choice __attribute((alias("IA__g_mount_operation_get_choice"), visibility("default"))); + +#undef g_mount_operation_set_choice +extern __typeof (g_mount_operation_set_choice) g_mount_operation_set_choice __attribute((alias("IA__g_mount_operation_set_choice"), visibility("default"))); + +#undef g_mount_operation_reply +extern __typeof (g_mount_operation_reply) g_mount_operation_reply __attribute((alias("IA__g_mount_operation_reply"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_OUTPUT_STREAM_H__) +#if IN_FILE(__G_OUTPUT_STREAM_C__) +#undef g_output_stream_get_type +extern __typeof (g_output_stream_get_type) g_output_stream_get_type __attribute((alias("IA__g_output_stream_get_type"), visibility("default"))); + +#undef g_output_stream_write +extern __typeof (g_output_stream_write) g_output_stream_write __attribute((alias("IA__g_output_stream_write"), visibility("default"))); + +#undef g_output_stream_write_all +extern __typeof (g_output_stream_write_all) g_output_stream_write_all __attribute((alias("IA__g_output_stream_write_all"), visibility("default"))); + +#undef g_output_stream_splice +extern __typeof (g_output_stream_splice) g_output_stream_splice __attribute((alias("IA__g_output_stream_splice"), visibility("default"))); + +#undef g_output_stream_flush +extern __typeof (g_output_stream_flush) g_output_stream_flush __attribute((alias("IA__g_output_stream_flush"), visibility("default"))); + +#undef g_output_stream_close +extern __typeof (g_output_stream_close) g_output_stream_close __attribute((alias("IA__g_output_stream_close"), visibility("default"))); + +#undef g_output_stream_write_async +extern __typeof (g_output_stream_write_async) g_output_stream_write_async __attribute((alias("IA__g_output_stream_write_async"), visibility("default"))); + +#undef g_output_stream_write_finish +extern __typeof (g_output_stream_write_finish) g_output_stream_write_finish __attribute((alias("IA__g_output_stream_write_finish"), visibility("default"))); + +#undef g_output_stream_splice_async +extern __typeof (g_output_stream_splice_async) g_output_stream_splice_async __attribute((alias("IA__g_output_stream_splice_async"), visibility("default"))); + +#undef g_output_stream_splice_finish +extern __typeof (g_output_stream_splice_finish) g_output_stream_splice_finish __attribute((alias("IA__g_output_stream_splice_finish"), visibility("default"))); + +#undef g_output_stream_flush_async +extern __typeof (g_output_stream_flush_async) g_output_stream_flush_async __attribute((alias("IA__g_output_stream_flush_async"), visibility("default"))); + +#undef g_output_stream_flush_finish +extern __typeof (g_output_stream_flush_finish) g_output_stream_flush_finish __attribute((alias("IA__g_output_stream_flush_finish"), visibility("default"))); + +#undef g_output_stream_close_async +extern __typeof (g_output_stream_close_async) g_output_stream_close_async __attribute((alias("IA__g_output_stream_close_async"), visibility("default"))); + +#undef g_output_stream_close_finish +extern __typeof (g_output_stream_close_finish) g_output_stream_close_finish __attribute((alias("IA__g_output_stream_close_finish"), visibility("default"))); + +#undef g_output_stream_is_closed +extern __typeof (g_output_stream_is_closed) g_output_stream_is_closed __attribute((alias("IA__g_output_stream_is_closed"), visibility("default"))); + +#undef g_output_stream_is_closing +extern __typeof (g_output_stream_is_closing) g_output_stream_is_closing __attribute((alias("IA__g_output_stream_is_closing"), visibility("default"))); + +#undef g_output_stream_has_pending +extern __typeof (g_output_stream_has_pending) g_output_stream_has_pending __attribute((alias("IA__g_output_stream_has_pending"), visibility("default"))); + +#undef g_output_stream_set_pending +extern __typeof (g_output_stream_set_pending) g_output_stream_set_pending __attribute((alias("IA__g_output_stream_set_pending"), visibility("default"))); + +#undef g_output_stream_clear_pending +extern __typeof (g_output_stream_clear_pending) g_output_stream_clear_pending __attribute((alias("IA__g_output_stream_clear_pending"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SEEKABLE_H__) +#if IN_FILE(__G_SEEKABLE_C__) +#undef g_seekable_get_type +extern __typeof (g_seekable_get_type) g_seekable_get_type __attribute((alias("IA__g_seekable_get_type"), visibility("default"))); + +#undef g_seekable_tell +extern __typeof (g_seekable_tell) g_seekable_tell __attribute((alias("IA__g_seekable_tell"), visibility("default"))); + +#undef g_seekable_can_seek +extern __typeof (g_seekable_can_seek) g_seekable_can_seek __attribute((alias("IA__g_seekable_can_seek"), visibility("default"))); + +#undef g_seekable_seek +extern __typeof (g_seekable_seek) g_seekable_seek __attribute((alias("IA__g_seekable_seek"), visibility("default"))); + +#undef g_seekable_can_truncate +extern __typeof (g_seekable_can_truncate) g_seekable_can_truncate __attribute((alias("IA__g_seekable_can_truncate"), visibility("default"))); + +#undef g_seekable_truncate +extern __typeof (g_seekable_truncate) g_seekable_truncate __attribute((alias("IA__g_seekable_truncate"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SIMPLE_ASYNC_RESULT_H__) +#if IN_FILE(__G_SIMPLE_ASYNC_RESULT_C__) +#undef g_simple_async_result_get_type +extern __typeof (g_simple_async_result_get_type) g_simple_async_result_get_type __attribute((alias("IA__g_simple_async_result_get_type"), visibility("default"))); + +#undef g_simple_async_result_new +extern __typeof (g_simple_async_result_new) g_simple_async_result_new __attribute((alias("IA__g_simple_async_result_new"), visibility("default"))); + +#undef g_simple_async_result_new_error +extern __typeof (g_simple_async_result_new_error) g_simple_async_result_new_error __attribute((alias("IA__g_simple_async_result_new_error"), visibility("default"))); + +#undef g_simple_async_result_new_from_error +extern __typeof (g_simple_async_result_new_from_error) g_simple_async_result_new_from_error __attribute((alias("IA__g_simple_async_result_new_from_error"), visibility("default"))); + +#undef g_simple_async_result_set_op_res_gpointer +extern __typeof (g_simple_async_result_set_op_res_gpointer) g_simple_async_result_set_op_res_gpointer __attribute((alias("IA__g_simple_async_result_set_op_res_gpointer"), visibility("default"))); + +#undef g_simple_async_result_get_op_res_gpointer +extern __typeof (g_simple_async_result_get_op_res_gpointer) g_simple_async_result_get_op_res_gpointer __attribute((alias("IA__g_simple_async_result_get_op_res_gpointer"), visibility("default"))); + +#undef g_simple_async_result_set_op_res_gssize +extern __typeof (g_simple_async_result_set_op_res_gssize) g_simple_async_result_set_op_res_gssize __attribute((alias("IA__g_simple_async_result_set_op_res_gssize"), visibility("default"))); + +#undef g_simple_async_result_get_op_res_gssize +extern __typeof (g_simple_async_result_get_op_res_gssize) g_simple_async_result_get_op_res_gssize __attribute((alias("IA__g_simple_async_result_get_op_res_gssize"), visibility("default"))); + +#undef g_simple_async_result_set_op_res_gboolean +extern __typeof (g_simple_async_result_set_op_res_gboolean) g_simple_async_result_set_op_res_gboolean __attribute((alias("IA__g_simple_async_result_set_op_res_gboolean"), visibility("default"))); + +#undef g_simple_async_result_get_op_res_gboolean +extern __typeof (g_simple_async_result_get_op_res_gboolean) g_simple_async_result_get_op_res_gboolean __attribute((alias("IA__g_simple_async_result_get_op_res_gboolean"), visibility("default"))); + +#undef g_simple_async_result_get_source_tag +extern __typeof (g_simple_async_result_get_source_tag) g_simple_async_result_get_source_tag __attribute((alias("IA__g_simple_async_result_get_source_tag"), visibility("default"))); + +#undef g_simple_async_result_set_handle_cancellation +extern __typeof (g_simple_async_result_set_handle_cancellation) g_simple_async_result_set_handle_cancellation __attribute((alias("IA__g_simple_async_result_set_handle_cancellation"), visibility("default"))); + +#undef g_simple_async_result_complete +extern __typeof (g_simple_async_result_complete) g_simple_async_result_complete __attribute((alias("IA__g_simple_async_result_complete"), visibility("default"))); + +#undef g_simple_async_result_complete_in_idle +extern __typeof (g_simple_async_result_complete_in_idle) g_simple_async_result_complete_in_idle __attribute((alias("IA__g_simple_async_result_complete_in_idle"), visibility("default"))); + +#undef g_simple_async_result_run_in_thread +extern __typeof (g_simple_async_result_run_in_thread) g_simple_async_result_run_in_thread __attribute((alias("IA__g_simple_async_result_run_in_thread"), visibility("default"))); + +#undef g_simple_async_result_set_from_error +extern __typeof (g_simple_async_result_set_from_error) g_simple_async_result_set_from_error __attribute((alias("IA__g_simple_async_result_set_from_error"), visibility("default"))); + +#undef g_simple_async_result_propagate_error +extern __typeof (g_simple_async_result_propagate_error) g_simple_async_result_propagate_error __attribute((alias("IA__g_simple_async_result_propagate_error"), visibility("default"))); + +#undef g_simple_async_result_set_error +extern __typeof (g_simple_async_result_set_error) g_simple_async_result_set_error __attribute((alias("IA__g_simple_async_result_set_error"), visibility("default"))); + +#undef g_simple_async_result_set_error_va +extern __typeof (g_simple_async_result_set_error_va) g_simple_async_result_set_error_va __attribute((alias("IA__g_simple_async_result_set_error_va"), visibility("default"))); + +#undef g_simple_async_result_is_valid +extern __typeof (g_simple_async_result_is_valid) g_simple_async_result_is_valid __attribute((alias("IA__g_simple_async_result_is_valid"), visibility("default"))); + +#undef g_simple_async_report_error_in_idle +extern __typeof (g_simple_async_report_error_in_idle) g_simple_async_report_error_in_idle __attribute((alias("IA__g_simple_async_report_error_in_idle"), visibility("default"))); + +#undef g_simple_async_report_gerror_in_idle +extern __typeof (g_simple_async_report_gerror_in_idle) g_simple_async_report_gerror_in_idle __attribute((alias("IA__g_simple_async_report_gerror_in_idle"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_THEMED_ICON_H__) +#if IN_FILE(__G_THEMED_ICON_C__) +#undef g_themed_icon_get_type +extern __typeof (g_themed_icon_get_type) g_themed_icon_get_type __attribute((alias("IA__g_themed_icon_get_type"), visibility("default"))); + +#undef g_themed_icon_new +extern __typeof (g_themed_icon_new) g_themed_icon_new __attribute((alias("IA__g_themed_icon_new"), visibility("default"))); + +#undef g_themed_icon_new_with_default_fallbacks +extern __typeof (g_themed_icon_new_with_default_fallbacks) g_themed_icon_new_with_default_fallbacks __attribute((alias("IA__g_themed_icon_new_with_default_fallbacks"), visibility("default"))); + +#undef g_themed_icon_new_from_names +extern __typeof (g_themed_icon_new_from_names) g_themed_icon_new_from_names __attribute((alias("IA__g_themed_icon_new_from_names"), visibility("default"))); + +#undef g_themed_icon_get_names +extern __typeof (g_themed_icon_get_names) g_themed_icon_get_names __attribute((alias("IA__g_themed_icon_get_names"), visibility("default"))); + +#undef g_themed_icon_prepend_name +extern __typeof (g_themed_icon_prepend_name) g_themed_icon_prepend_name __attribute((alias("IA__g_themed_icon_prepend_name"), visibility("default"))); + +#undef g_themed_icon_append_name +extern __typeof (g_themed_icon_append_name) g_themed_icon_append_name __attribute((alias("IA__g_themed_icon_append_name"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNIX_MOUNTS_H__) +#if IN_FILE(__G_UNIX_MOUNTS_C__) +#ifdef G_OS_UNIX +#undef g_unix_mount_free +extern __typeof (g_unix_mount_free) g_unix_mount_free __attribute((alias("IA__g_unix_mount_free"), visibility("default"))); + +#undef g_unix_mount_point_free +extern __typeof (g_unix_mount_point_free) g_unix_mount_point_free __attribute((alias("IA__g_unix_mount_point_free"), visibility("default"))); + +#undef g_unix_mount_compare +extern __typeof (g_unix_mount_compare) g_unix_mount_compare __attribute((alias("IA__g_unix_mount_compare"), visibility("default"))); + +#undef g_unix_mount_get_mount_path +extern __typeof (g_unix_mount_get_mount_path) g_unix_mount_get_mount_path __attribute((alias("IA__g_unix_mount_get_mount_path"), visibility("default"))); + +#undef g_unix_mount_get_device_path +extern __typeof (g_unix_mount_get_device_path) g_unix_mount_get_device_path __attribute((alias("IA__g_unix_mount_get_device_path"), visibility("default"))); + +#undef g_unix_mount_get_fs_type +extern __typeof (g_unix_mount_get_fs_type) g_unix_mount_get_fs_type __attribute((alias("IA__g_unix_mount_get_fs_type"), visibility("default"))); + +#undef g_unix_mount_is_readonly +extern __typeof (g_unix_mount_is_readonly) g_unix_mount_is_readonly __attribute((alias("IA__g_unix_mount_is_readonly"), visibility("default"))); + +#undef g_unix_mount_is_system_internal +extern __typeof (g_unix_mount_is_system_internal) g_unix_mount_is_system_internal __attribute((alias("IA__g_unix_mount_is_system_internal"), visibility("default"))); + +#undef g_unix_mount_guess_can_eject +extern __typeof (g_unix_mount_guess_can_eject) g_unix_mount_guess_can_eject __attribute((alias("IA__g_unix_mount_guess_can_eject"), visibility("default"))); + +#undef g_unix_mount_guess_should_display +extern __typeof (g_unix_mount_guess_should_display) g_unix_mount_guess_should_display __attribute((alias("IA__g_unix_mount_guess_should_display"), visibility("default"))); + +#undef g_unix_mount_guess_name +extern __typeof (g_unix_mount_guess_name) g_unix_mount_guess_name __attribute((alias("IA__g_unix_mount_guess_name"), visibility("default"))); + +#undef g_unix_mount_guess_icon +extern __typeof (g_unix_mount_guess_icon) g_unix_mount_guess_icon __attribute((alias("IA__g_unix_mount_guess_icon"), visibility("default"))); + +#undef g_unix_mount_point_compare +extern __typeof (g_unix_mount_point_compare) g_unix_mount_point_compare __attribute((alias("IA__g_unix_mount_point_compare"), visibility("default"))); + +#undef g_unix_mount_point_get_mount_path +extern __typeof (g_unix_mount_point_get_mount_path) g_unix_mount_point_get_mount_path __attribute((alias("IA__g_unix_mount_point_get_mount_path"), visibility("default"))); + +#undef g_unix_mount_point_get_device_path +extern __typeof (g_unix_mount_point_get_device_path) g_unix_mount_point_get_device_path __attribute((alias("IA__g_unix_mount_point_get_device_path"), visibility("default"))); + +#undef g_unix_mount_point_get_fs_type +extern __typeof (g_unix_mount_point_get_fs_type) g_unix_mount_point_get_fs_type __attribute((alias("IA__g_unix_mount_point_get_fs_type"), visibility("default"))); + +#undef g_unix_mount_point_is_readonly +extern __typeof (g_unix_mount_point_is_readonly) g_unix_mount_point_is_readonly __attribute((alias("IA__g_unix_mount_point_is_readonly"), visibility("default"))); + +#undef g_unix_mount_point_is_user_mountable +extern __typeof (g_unix_mount_point_is_user_mountable) g_unix_mount_point_is_user_mountable __attribute((alias("IA__g_unix_mount_point_is_user_mountable"), visibility("default"))); + +#undef g_unix_mount_point_is_loopback +extern __typeof (g_unix_mount_point_is_loopback) g_unix_mount_point_is_loopback __attribute((alias("IA__g_unix_mount_point_is_loopback"), visibility("default"))); + +#undef g_unix_mount_point_guess_can_eject +extern __typeof (g_unix_mount_point_guess_can_eject) g_unix_mount_point_guess_can_eject __attribute((alias("IA__g_unix_mount_point_guess_can_eject"), visibility("default"))); + +#undef g_unix_mount_point_guess_name +extern __typeof (g_unix_mount_point_guess_name) g_unix_mount_point_guess_name __attribute((alias("IA__g_unix_mount_point_guess_name"), visibility("default"))); + +#undef g_unix_mount_point_guess_icon +extern __typeof (g_unix_mount_point_guess_icon) g_unix_mount_point_guess_icon __attribute((alias("IA__g_unix_mount_point_guess_icon"), visibility("default"))); + +#undef g_unix_mount_points_get +extern __typeof (g_unix_mount_points_get) g_unix_mount_points_get __attribute((alias("IA__g_unix_mount_points_get"), visibility("default"))); + +#undef g_unix_mounts_get +extern __typeof (g_unix_mounts_get) g_unix_mounts_get __attribute((alias("IA__g_unix_mounts_get"), visibility("default"))); + +#undef g_unix_mount_at +extern __typeof (g_unix_mount_at) g_unix_mount_at __attribute((alias("IA__g_unix_mount_at"), visibility("default"))); + +#undef g_unix_mounts_changed_since +extern __typeof (g_unix_mounts_changed_since) g_unix_mounts_changed_since __attribute((alias("IA__g_unix_mounts_changed_since"), visibility("default"))); + +#undef g_unix_mount_points_changed_since +extern __typeof (g_unix_mount_points_changed_since) g_unix_mount_points_changed_since __attribute((alias("IA__g_unix_mount_points_changed_since"), visibility("default"))); + +#undef g_unix_mount_monitor_get_type +extern __typeof (g_unix_mount_monitor_get_type) g_unix_mount_monitor_get_type __attribute((alias("IA__g_unix_mount_monitor_get_type"), visibility("default"))); + +#undef g_unix_mount_monitor_new +extern __typeof (g_unix_mount_monitor_new) g_unix_mount_monitor_new __attribute((alias("IA__g_unix_mount_monitor_new"), visibility("default"))); + +#undef g_unix_mount_monitor_set_rate_limit +extern __typeof (g_unix_mount_monitor_set_rate_limit) g_unix_mount_monitor_set_rate_limit __attribute((alias("IA__g_unix_mount_monitor_set_rate_limit"), visibility("default"))); + +#undef g_unix_is_mount_path_system_internal +extern __typeof (g_unix_is_mount_path_system_internal) g_unix_is_mount_path_system_internal __attribute((alias("IA__g_unix_is_mount_path_system_internal"), visibility("default"))); + +#endif /* G_OS_UNIX */ +#endif +#endif +#if IN_HEADER(__G_UNIX_INPUT_STREAM_H__) +#if IN_FILE(__G_UNIX_INPUT_STREAM_C__) +#ifdef G_OS_UNIX +#undef g_unix_input_stream_get_type +extern __typeof (g_unix_input_stream_get_type) g_unix_input_stream_get_type __attribute((alias("IA__g_unix_input_stream_get_type"), visibility("default"))); + +#undef g_unix_input_stream_new +extern __typeof (g_unix_input_stream_new) g_unix_input_stream_new __attribute((alias("IA__g_unix_input_stream_new"), visibility("default"))); + +#undef g_unix_input_stream_set_close_fd +extern __typeof (g_unix_input_stream_set_close_fd) g_unix_input_stream_set_close_fd __attribute((alias("IA__g_unix_input_stream_set_close_fd"), visibility("default"))); + +#undef g_unix_input_stream_get_close_fd +extern __typeof (g_unix_input_stream_get_close_fd) g_unix_input_stream_get_close_fd __attribute((alias("IA__g_unix_input_stream_get_close_fd"), visibility("default"))); + +#undef g_unix_input_stream_get_fd +extern __typeof (g_unix_input_stream_get_fd) g_unix_input_stream_get_fd __attribute((alias("IA__g_unix_input_stream_get_fd"), visibility("default"))); + +#endif /* G_OS_UNIX */ +#endif +#endif +#if IN_HEADER(__G_UNIX_OUTPUT_STREAM_H__) +#if IN_FILE(__G_UNIX_OUTPUT_STREAM_C__) +#ifdef G_OS_UNIX +#undef g_unix_output_stream_get_type +extern __typeof (g_unix_output_stream_get_type) g_unix_output_stream_get_type __attribute((alias("IA__g_unix_output_stream_get_type"), visibility("default"))); + +#undef g_unix_output_stream_new +extern __typeof (g_unix_output_stream_new) g_unix_output_stream_new __attribute((alias("IA__g_unix_output_stream_new"), visibility("default"))); + +#undef g_unix_output_stream_set_close_fd +extern __typeof (g_unix_output_stream_set_close_fd) g_unix_output_stream_set_close_fd __attribute((alias("IA__g_unix_output_stream_set_close_fd"), visibility("default"))); + +#undef g_unix_output_stream_get_close_fd +extern __typeof (g_unix_output_stream_get_close_fd) g_unix_output_stream_get_close_fd __attribute((alias("IA__g_unix_output_stream_get_close_fd"), visibility("default"))); + +#undef g_unix_output_stream_get_fd +extern __typeof (g_unix_output_stream_get_fd) g_unix_output_stream_get_fd __attribute((alias("IA__g_unix_output_stream_get_fd"), visibility("default"))); + +#endif /* G_OS_UNIX */ +#endif +#endif +#if IN_HEADER(__G_MOUNT_H__) +#if IN_FILE(__G_MOUNT_C__) +#undef g_mount_get_type +extern __typeof (g_mount_get_type) g_mount_get_type __attribute((alias("IA__g_mount_get_type"), visibility("default"))); + +#undef g_mount_get_root +extern __typeof (g_mount_get_root) g_mount_get_root __attribute((alias("IA__g_mount_get_root"), visibility("default"))); + +#undef g_mount_get_name +extern __typeof (g_mount_get_name) g_mount_get_name __attribute((alias("IA__g_mount_get_name"), visibility("default"))); + +#undef g_mount_get_icon +extern __typeof (g_mount_get_icon) g_mount_get_icon __attribute((alias("IA__g_mount_get_icon"), visibility("default"))); + +#undef g_mount_get_uuid +extern __typeof (g_mount_get_uuid) g_mount_get_uuid __attribute((alias("IA__g_mount_get_uuid"), visibility("default"))); + +#undef g_mount_get_volume +extern __typeof (g_mount_get_volume) g_mount_get_volume __attribute((alias("IA__g_mount_get_volume"), visibility("default"))); + +#undef g_mount_get_drive +extern __typeof (g_mount_get_drive) g_mount_get_drive __attribute((alias("IA__g_mount_get_drive"), visibility("default"))); + +#undef g_mount_can_unmount +extern __typeof (g_mount_can_unmount) g_mount_can_unmount __attribute((alias("IA__g_mount_can_unmount"), visibility("default"))); + +#undef g_mount_can_eject +extern __typeof (g_mount_can_eject) g_mount_can_eject __attribute((alias("IA__g_mount_can_eject"), visibility("default"))); + +#undef g_mount_unmount_with_operation +extern __typeof (g_mount_unmount_with_operation) g_mount_unmount_with_operation __attribute((alias("IA__g_mount_unmount_with_operation"), visibility("default"))); + +#undef g_mount_unmount_with_operation_finish +extern __typeof (g_mount_unmount_with_operation_finish) g_mount_unmount_with_operation_finish __attribute((alias("IA__g_mount_unmount_with_operation_finish"), visibility("default"))); + +#undef g_mount_eject_with_operation +extern __typeof (g_mount_eject_with_operation) g_mount_eject_with_operation __attribute((alias("IA__g_mount_eject_with_operation"), visibility("default"))); + +#undef g_mount_eject_with_operation_finish +extern __typeof (g_mount_eject_with_operation_finish) g_mount_eject_with_operation_finish __attribute((alias("IA__g_mount_eject_with_operation_finish"), visibility("default"))); + +#undef g_mount_get_default_location +extern __typeof (g_mount_get_default_location) g_mount_get_default_location __attribute((alias("IA__g_mount_get_default_location"), visibility("default"))); + +#undef g_mount_remount +extern __typeof (g_mount_remount) g_mount_remount __attribute((alias("IA__g_mount_remount"), visibility("default"))); + +#undef g_mount_remount_finish +extern __typeof (g_mount_remount_finish) g_mount_remount_finish __attribute((alias("IA__g_mount_remount_finish"), visibility("default"))); + +#undef g_mount_guess_content_type +extern __typeof (g_mount_guess_content_type) g_mount_guess_content_type __attribute((alias("IA__g_mount_guess_content_type"), visibility("default"))); + +#undef g_mount_guess_content_type_finish +extern __typeof (g_mount_guess_content_type_finish) g_mount_guess_content_type_finish __attribute((alias("IA__g_mount_guess_content_type_finish"), visibility("default"))); + +#undef g_mount_guess_content_type_sync +extern __typeof (g_mount_guess_content_type_sync) g_mount_guess_content_type_sync __attribute((alias("IA__g_mount_guess_content_type_sync"), visibility("default"))); + +#undef g_mount_is_shadowed +extern __typeof (g_mount_is_shadowed) g_mount_is_shadowed __attribute((alias("IA__g_mount_is_shadowed"), visibility("default"))); + +#undef g_mount_shadow +extern __typeof (g_mount_shadow) g_mount_shadow __attribute((alias("IA__g_mount_shadow"), visibility("default"))); + +#undef g_mount_unshadow +extern __typeof (g_mount_unshadow) g_mount_unshadow __attribute((alias("IA__g_mount_unshadow"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_mount_unmount +extern __typeof (g_mount_unmount) g_mount_unmount __attribute((alias("IA__g_mount_unmount"), visibility("default"))); + +#undef g_mount_unmount_finish +extern __typeof (g_mount_unmount_finish) g_mount_unmount_finish __attribute((alias("IA__g_mount_unmount_finish"), visibility("default"))); + +#undef g_mount_eject +extern __typeof (g_mount_eject) g_mount_eject __attribute((alias("IA__g_mount_eject"), visibility("default"))); + +#undef g_mount_eject_finish +extern __typeof (g_mount_eject_finish) g_mount_eject_finish __attribute((alias("IA__g_mount_eject_finish"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_VOLUME_H__) +#if IN_FILE(__G_VOLUME_C__) +#undef g_volume_get_type +extern __typeof (g_volume_get_type) g_volume_get_type __attribute((alias("IA__g_volume_get_type"), visibility("default"))); + +#undef g_volume_get_name +extern __typeof (g_volume_get_name) g_volume_get_name __attribute((alias("IA__g_volume_get_name"), visibility("default"))); + +#undef g_volume_get_icon +extern __typeof (g_volume_get_icon) g_volume_get_icon __attribute((alias("IA__g_volume_get_icon"), visibility("default"))); + +#undef g_volume_get_uuid +extern __typeof (g_volume_get_uuid) g_volume_get_uuid __attribute((alias("IA__g_volume_get_uuid"), visibility("default"))); + +#undef g_volume_get_drive +extern __typeof (g_volume_get_drive) g_volume_get_drive __attribute((alias("IA__g_volume_get_drive"), visibility("default"))); + +#undef g_volume_get_mount +extern __typeof (g_volume_get_mount) g_volume_get_mount __attribute((alias("IA__g_volume_get_mount"), visibility("default"))); + +#undef g_volume_should_automount +extern __typeof (g_volume_should_automount) g_volume_should_automount __attribute((alias("IA__g_volume_should_automount"), visibility("default"))); + +#undef g_volume_can_mount +extern __typeof (g_volume_can_mount) g_volume_can_mount __attribute((alias("IA__g_volume_can_mount"), visibility("default"))); + +#undef g_volume_can_eject +extern __typeof (g_volume_can_eject) g_volume_can_eject __attribute((alias("IA__g_volume_can_eject"), visibility("default"))); + +#undef g_volume_mount +extern __typeof (g_volume_mount) g_volume_mount __attribute((alias("IA__g_volume_mount"), visibility("default"))); + +#undef g_volume_mount_finish +extern __typeof (g_volume_mount_finish) g_volume_mount_finish __attribute((alias("IA__g_volume_mount_finish"), visibility("default"))); + +#undef g_volume_eject_with_operation +extern __typeof (g_volume_eject_with_operation) g_volume_eject_with_operation __attribute((alias("IA__g_volume_eject_with_operation"), visibility("default"))); + +#undef g_volume_eject_with_operation_finish +extern __typeof (g_volume_eject_with_operation_finish) g_volume_eject_with_operation_finish __attribute((alias("IA__g_volume_eject_with_operation_finish"), visibility("default"))); + +#undef g_volume_get_identifier +extern __typeof (g_volume_get_identifier) g_volume_get_identifier __attribute((alias("IA__g_volume_get_identifier"), visibility("default"))); + +#undef g_volume_enumerate_identifiers +extern __typeof (g_volume_enumerate_identifiers) g_volume_enumerate_identifiers __attribute((alias("IA__g_volume_enumerate_identifiers"), visibility("default"))); + +#undef g_volume_get_activation_root +extern __typeof (g_volume_get_activation_root) g_volume_get_activation_root __attribute((alias("IA__g_volume_get_activation_root"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_volume_eject +extern __typeof (g_volume_eject) g_volume_eject __attribute((alias("IA__g_volume_eject"), visibility("default"))); + +#undef g_volume_eject_finish +extern __typeof (g_volume_eject_finish) g_volume_eject_finish __attribute((alias("IA__g_volume_eject_finish"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_VOLUME_MONITOR_H__) +#if IN_FILE(__G_VOLUME_MONITOR_C__) +#undef g_volume_monitor_get_type +extern __typeof (g_volume_monitor_get_type) g_volume_monitor_get_type __attribute((alias("IA__g_volume_monitor_get_type"), visibility("default"))); + +#undef g_volume_monitor_get_connected_drives +extern __typeof (g_volume_monitor_get_connected_drives) g_volume_monitor_get_connected_drives __attribute((alias("IA__g_volume_monitor_get_connected_drives"), visibility("default"))); + +#undef g_volume_monitor_get_volume_for_uuid +extern __typeof (g_volume_monitor_get_volume_for_uuid) g_volume_monitor_get_volume_for_uuid __attribute((alias("IA__g_volume_monitor_get_volume_for_uuid"), visibility("default"))); + +#undef g_volume_monitor_get_volumes +extern __typeof (g_volume_monitor_get_volumes) g_volume_monitor_get_volumes __attribute((alias("IA__g_volume_monitor_get_volumes"), visibility("default"))); + +#undef g_volume_monitor_get_mounts +extern __typeof (g_volume_monitor_get_mounts) g_volume_monitor_get_mounts __attribute((alias("IA__g_volume_monitor_get_mounts"), visibility("default"))); + +#undef g_volume_monitor_get_mount_for_uuid +extern __typeof (g_volume_monitor_get_mount_for_uuid) g_volume_monitor_get_mount_for_uuid __attribute((alias("IA__g_volume_monitor_get_mount_for_uuid"), visibility("default"))); + +#endif +#if IN_FILE(__G_UNION_VOLUME_MONITOR_C__) +#undef g_volume_monitor_get +extern __typeof (g_volume_monitor_get) g_volume_monitor_get __attribute((alias("IA__g_volume_monitor_get"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_volume_monitor_adopt_orphan_mount +extern __typeof (g_volume_monitor_adopt_orphan_mount) g_volume_monitor_adopt_orphan_mount __attribute((alias("IA__g_volume_monitor_adopt_orphan_mount"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_NATIVE_VOLUME_MONITOR_H__) +#if IN_FILE(__G_NATIVE_VOLUME_MONITOR_C__) +#undef g_native_volume_monitor_get_type +extern __typeof (g_native_volume_monitor_get_type) g_native_volume_monitor_get_type __attribute((alias("IA__g_native_volume_monitor_get_type"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_LOCAL_FILE_MONITOR_H__) +#if IN_FILE(__G_LOCAL_FILE_MONITOR_C__) +#ifdef G_OS_UNIX +#undef g_local_file_monitor_get_type +extern __typeof (g_local_file_monitor_get_type) g_local_file_monitor_get_type __attribute((alias("IA__g_local_file_monitor_get_type"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_LOCAL_DIRECTORY_MONITOR_H__) +#if IN_FILE(__G_LOCAL_DIRECTORY_MONITOR_C__) +#ifdef G_OS_UNIX +#undef g_local_directory_monitor_get_type +extern __typeof (g_local_directory_monitor_get_type) g_local_directory_monitor_get_type __attribute((alias("IA__g_local_directory_monitor_get_type"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__GIO_ENUM_TYPES_H__) +#if IN_FILE(__GIO_ENUM_TYPES_C__) +#undef g_mount_unmount_flags_get_type +extern __typeof (g_mount_unmount_flags_get_type) g_mount_unmount_flags_get_type __attribute((alias("IA__g_mount_unmount_flags_get_type"), visibility("default"))); + +#undef g_app_info_create_flags_get_type +extern __typeof (g_app_info_create_flags_get_type) g_app_info_create_flags_get_type __attribute((alias("IA__g_app_info_create_flags_get_type"), visibility("default"))); + +#undef g_converter_flags_get_type +extern __typeof (g_converter_flags_get_type) g_converter_flags_get_type __attribute((alias("IA__g_converter_flags_get_type"), visibility("default"))); + +#undef g_converter_result_get_type +extern __typeof (g_converter_result_get_type) g_converter_result_get_type __attribute((alias("IA__g_converter_result_get_type"), visibility("default"))); + +#undef g_data_stream_byte_order_get_type +extern __typeof (g_data_stream_byte_order_get_type) g_data_stream_byte_order_get_type __attribute((alias("IA__g_data_stream_byte_order_get_type"), visibility("default"))); + +#undef g_data_stream_newline_type_get_type +extern __typeof (g_data_stream_newline_type_get_type) g_data_stream_newline_type_get_type __attribute((alias("IA__g_data_stream_newline_type_get_type"), visibility("default"))); + +#undef g_file_attribute_info_flags_get_type +extern __typeof (g_file_attribute_info_flags_get_type) g_file_attribute_info_flags_get_type __attribute((alias("IA__g_file_attribute_info_flags_get_type"), visibility("default"))); + +#undef g_file_attribute_status_get_type +extern __typeof (g_file_attribute_status_get_type) g_file_attribute_status_get_type __attribute((alias("IA__g_file_attribute_status_get_type"), visibility("default"))); + +#undef g_file_attribute_type_get_type +extern __typeof (g_file_attribute_type_get_type) g_file_attribute_type_get_type __attribute((alias("IA__g_file_attribute_type_get_type"), visibility("default"))); + +#undef g_file_copy_flags_get_type +extern __typeof (g_file_copy_flags_get_type) g_file_copy_flags_get_type __attribute((alias("IA__g_file_copy_flags_get_type"), visibility("default"))); + +#undef g_file_create_flags_get_type +extern __typeof (g_file_create_flags_get_type) g_file_create_flags_get_type __attribute((alias("IA__g_file_create_flags_get_type"), visibility("default"))); + +#undef g_file_monitor_event_get_type +extern __typeof (g_file_monitor_event_get_type) g_file_monitor_event_get_type __attribute((alias("IA__g_file_monitor_event_get_type"), visibility("default"))); + +#undef g_file_monitor_flags_get_type +extern __typeof (g_file_monitor_flags_get_type) g_file_monitor_flags_get_type __attribute((alias("IA__g_file_monitor_flags_get_type"), visibility("default"))); + +#undef g_file_query_info_flags_get_type +extern __typeof (g_file_query_info_flags_get_type) g_file_query_info_flags_get_type __attribute((alias("IA__g_file_query_info_flags_get_type"), visibility("default"))); + +#undef g_file_type_get_type +extern __typeof (g_file_type_get_type) g_file_type_get_type __attribute((alias("IA__g_file_type_get_type"), visibility("default"))); + +#undef g_filesystem_preview_type_get_type +extern __typeof (g_filesystem_preview_type_get_type) g_filesystem_preview_type_get_type __attribute((alias("IA__g_filesystem_preview_type_get_type"), visibility("default"))); + +#undef g_io_error_enum_get_type +extern __typeof (g_io_error_enum_get_type) g_io_error_enum_get_type __attribute((alias("IA__g_io_error_enum_get_type"), visibility("default"))); + +#undef g_mount_mount_flags_get_type +extern __typeof (g_mount_mount_flags_get_type) g_mount_mount_flags_get_type __attribute((alias("IA__g_mount_mount_flags_get_type"), visibility("default"))); + +#undef g_mount_operation_result_get_type +extern __typeof (g_mount_operation_result_get_type) g_mount_operation_result_get_type __attribute((alias("IA__g_mount_operation_result_get_type"), visibility("default"))); + +#undef g_drive_start_flags_get_type +extern __typeof (g_drive_start_flags_get_type) g_drive_start_flags_get_type __attribute((alias("IA__g_drive_start_flags_get_type"), visibility("default"))); + +#undef g_drive_start_stop_type_get_type +extern __typeof (g_drive_start_stop_type_get_type) g_drive_start_stop_type_get_type __attribute((alias("IA__g_drive_start_stop_type_get_type"), visibility("default"))); + +#undef g_output_stream_splice_flags_get_type +extern __typeof (g_output_stream_splice_flags_get_type) g_output_stream_splice_flags_get_type __attribute((alias("IA__g_output_stream_splice_flags_get_type"), visibility("default"))); + +#undef g_ask_password_flags_get_type +extern __typeof (g_ask_password_flags_get_type) g_ask_password_flags_get_type __attribute((alias("IA__g_ask_password_flags_get_type"), visibility("default"))); + +#undef g_password_save_get_type +extern __typeof (g_password_save_get_type) g_password_save_get_type __attribute((alias("IA__g_password_save_get_type"), visibility("default"))); + +#undef g_emblem_origin_get_type +extern __typeof (g_emblem_origin_get_type) g_emblem_origin_get_type __attribute((alias("IA__g_emblem_origin_get_type"), visibility("default"))); + +#undef g_socket_family_get_type +extern __typeof (g_socket_family_get_type) g_socket_family_get_type __attribute((alias("IA__g_socket_family_get_type"), visibility("default"))); + +#undef g_socket_type_get_type +extern __typeof (g_socket_type_get_type) g_socket_type_get_type __attribute((alias("IA__g_socket_type_get_type"), visibility("default"))); + +#undef g_socket_protocol_get_type +extern __typeof (g_socket_protocol_get_type) g_socket_protocol_get_type __attribute((alias("IA__g_socket_protocol_get_type"), visibility("default"))); + +#undef g_socket_msg_flags_get_type +extern __typeof (g_socket_msg_flags_get_type) g_socket_msg_flags_get_type __attribute((alias("IA__g_socket_msg_flags_get_type"), visibility("default"))); + +#undef g_resolver_error_get_type +extern __typeof (g_resolver_error_get_type) g_resolver_error_get_type __attribute((alias("IA__g_resolver_error_get_type"), visibility("default"))); + +#undef g_zlib_compressor_format_get_type +extern __typeof (g_zlib_compressor_format_get_type) g_zlib_compressor_format_get_type __attribute((alias("IA__g_zlib_compressor_format_get_type"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_EMBLEMED_ICON_H__) +#if IN_FILE(__G_EMBLEMED_ICON_C__) +#undef g_emblemed_icon_get_type +extern __typeof (g_emblemed_icon_get_type) g_emblemed_icon_get_type __attribute((alias("IA__g_emblemed_icon_get_type"), visibility("default"))); + +#undef g_emblemed_icon_new +extern __typeof (g_emblemed_icon_new) g_emblemed_icon_new __attribute((alias("IA__g_emblemed_icon_new"), visibility("default"))); + +#undef g_emblemed_icon_get_icon +extern __typeof (g_emblemed_icon_get_icon) g_emblemed_icon_get_icon __attribute((alias("IA__g_emblemed_icon_get_icon"), visibility("default"))); + +#undef g_emblemed_icon_get_emblems +extern __typeof (g_emblemed_icon_get_emblems) g_emblemed_icon_get_emblems __attribute((alias("IA__g_emblemed_icon_get_emblems"), visibility("default"))); + +#undef g_emblemed_icon_add_emblem +extern __typeof (g_emblemed_icon_add_emblem) g_emblemed_icon_add_emblem __attribute((alias("IA__g_emblemed_icon_add_emblem"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_EMBLEM_H__) +#if IN_FILE(__G_EMBLEM_C__) +#undef g_emblem_get_type +extern __typeof (g_emblem_get_type) g_emblem_get_type __attribute((alias("IA__g_emblem_get_type"), visibility("default"))); + +#undef g_emblem_new +extern __typeof (g_emblem_new) g_emblem_new __attribute((alias("IA__g_emblem_new"), visibility("default"))); + +#undef g_emblem_new_with_origin +extern __typeof (g_emblem_new_with_origin) g_emblem_new_with_origin __attribute((alias("IA__g_emblem_new_with_origin"), visibility("default"))); + +#undef g_emblem_get_icon +extern __typeof (g_emblem_get_icon) g_emblem_get_icon __attribute((alias("IA__g_emblem_get_icon"), visibility("default"))); + +#undef g_emblem_get_origin +extern __typeof (g_emblem_get_origin) g_emblem_get_origin __attribute((alias("IA__g_emblem_get_origin"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_INET_ADDRESS_H__) +#if IN_FILE(__G_INET_ADDRESS_C__) +#undef g_inet_address_new_from_string +extern __typeof (g_inet_address_new_from_string) g_inet_address_new_from_string __attribute((alias("IA__g_inet_address_new_from_string"), visibility("default"))); + +#undef g_inet_address_new_from_bytes +extern __typeof (g_inet_address_new_from_bytes) g_inet_address_new_from_bytes __attribute((alias("IA__g_inet_address_new_from_bytes"), visibility("default"))); + +#undef g_inet_address_new_any +extern __typeof (g_inet_address_new_any) g_inet_address_new_any __attribute((alias("IA__g_inet_address_new_any"), visibility("default"))); + +#undef g_inet_address_new_loopback +extern __typeof (g_inet_address_new_loopback) g_inet_address_new_loopback __attribute((alias("IA__g_inet_address_new_loopback"), visibility("default"))); + +#undef g_inet_address_get_family +extern __typeof (g_inet_address_get_family) g_inet_address_get_family __attribute((alias("IA__g_inet_address_get_family"), visibility("default"))); + +#undef g_inet_address_get_type +extern __typeof (g_inet_address_get_type) g_inet_address_get_type __attribute((alias("IA__g_inet_address_get_type"), visibility("default"))); + +#undef g_inet_address_get_is_any +extern __typeof (g_inet_address_get_is_any) g_inet_address_get_is_any __attribute((alias("IA__g_inet_address_get_is_any"), visibility("default"))); + +#undef g_inet_address_get_is_link_local +extern __typeof (g_inet_address_get_is_link_local) g_inet_address_get_is_link_local __attribute((alias("IA__g_inet_address_get_is_link_local"), visibility("default"))); + +#undef g_inet_address_get_is_loopback +extern __typeof (g_inet_address_get_is_loopback) g_inet_address_get_is_loopback __attribute((alias("IA__g_inet_address_get_is_loopback"), visibility("default"))); + +#undef g_inet_address_get_is_mc_global +extern __typeof (g_inet_address_get_is_mc_global) g_inet_address_get_is_mc_global __attribute((alias("IA__g_inet_address_get_is_mc_global"), visibility("default"))); + +#undef g_inet_address_get_is_mc_link_local +extern __typeof (g_inet_address_get_is_mc_link_local) g_inet_address_get_is_mc_link_local __attribute((alias("IA__g_inet_address_get_is_mc_link_local"), visibility("default"))); + +#undef g_inet_address_get_is_mc_node_local +extern __typeof (g_inet_address_get_is_mc_node_local) g_inet_address_get_is_mc_node_local __attribute((alias("IA__g_inet_address_get_is_mc_node_local"), visibility("default"))); + +#undef g_inet_address_get_is_mc_org_local +extern __typeof (g_inet_address_get_is_mc_org_local) g_inet_address_get_is_mc_org_local __attribute((alias("IA__g_inet_address_get_is_mc_org_local"), visibility("default"))); + +#undef g_inet_address_get_is_mc_site_local +extern __typeof (g_inet_address_get_is_mc_site_local) g_inet_address_get_is_mc_site_local __attribute((alias("IA__g_inet_address_get_is_mc_site_local"), visibility("default"))); + +#undef g_inet_address_get_is_multicast +extern __typeof (g_inet_address_get_is_multicast) g_inet_address_get_is_multicast __attribute((alias("IA__g_inet_address_get_is_multicast"), visibility("default"))); + +#undef g_inet_address_get_is_site_local +extern __typeof (g_inet_address_get_is_site_local) g_inet_address_get_is_site_local __attribute((alias("IA__g_inet_address_get_is_site_local"), visibility("default"))); + +#undef g_inet_address_to_bytes +extern __typeof (g_inet_address_to_bytes) g_inet_address_to_bytes __attribute((alias("IA__g_inet_address_to_bytes"), visibility("default"))); + +#undef g_inet_address_get_native_size +extern __typeof (g_inet_address_get_native_size) g_inet_address_get_native_size __attribute((alias("IA__g_inet_address_get_native_size"), visibility("default"))); + +#undef g_inet_address_to_string +extern __typeof (g_inet_address_to_string) g_inet_address_to_string __attribute((alias("IA__g_inet_address_to_string"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_INET_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_INET_SOCKET_ADDRESS_C__) +#undef g_inet_socket_address_get_address +extern __typeof (g_inet_socket_address_get_address) g_inet_socket_address_get_address __attribute((alias("IA__g_inet_socket_address_get_address"), visibility("default"))); + +#undef g_inet_socket_address_get_port +extern __typeof (g_inet_socket_address_get_port) g_inet_socket_address_get_port __attribute((alias("IA__g_inet_socket_address_get_port"), visibility("default"))); + +#undef g_inet_socket_address_get_type +extern __typeof (g_inet_socket_address_get_type) g_inet_socket_address_get_type __attribute((alias("IA__g_inet_socket_address_get_type"), visibility("default"))); + +#undef g_inet_socket_address_new +extern __typeof (g_inet_socket_address_new) g_inet_socket_address_new __attribute((alias("IA__g_inet_socket_address_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNIX_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_UNIX_SOCKET_ADDRESS_C__) +#ifdef G_OS_UNIX +#undef g_unix_socket_address_get_type +extern __typeof (g_unix_socket_address_get_type) g_unix_socket_address_get_type __attribute((alias("IA__g_unix_socket_address_get_type"), visibility("default"))); + +#undef g_unix_socket_address_new +extern __typeof (g_unix_socket_address_new) g_unix_socket_address_new __attribute((alias("IA__g_unix_socket_address_new"), visibility("default"))); + +#undef g_unix_socket_address_new_abstract +extern __typeof (g_unix_socket_address_new_abstract) g_unix_socket_address_new_abstract __attribute((alias("IA__g_unix_socket_address_new_abstract"), visibility("default"))); + +#undef g_unix_socket_address_abstract_names_supported +extern __typeof (g_unix_socket_address_abstract_names_supported) g_unix_socket_address_abstract_names_supported __attribute((alias("IA__g_unix_socket_address_abstract_names_supported"), visibility("default"))); + +#undef g_unix_socket_address_get_is_abstract +extern __typeof (g_unix_socket_address_get_is_abstract) g_unix_socket_address_get_is_abstract __attribute((alias("IA__g_unix_socket_address_get_is_abstract"), visibility("default"))); + +#undef g_unix_socket_address_get_path +extern __typeof (g_unix_socket_address_get_path) g_unix_socket_address_get_path __attribute((alias("IA__g_unix_socket_address_get_path"), visibility("default"))); + +#undef g_unix_socket_address_get_path_len +extern __typeof (g_unix_socket_address_get_path_len) g_unix_socket_address_get_path_len __attribute((alias("IA__g_unix_socket_address_get_path_len"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_SOCKET_ADDRESS_H__) +#if IN_FILE(__G_SOCKET_ADDRESS_C__) +#undef g_socket_address_new_from_native +extern __typeof (g_socket_address_new_from_native) g_socket_address_new_from_native __attribute((alias("IA__g_socket_address_new_from_native"), visibility("default"))); + +#undef g_socket_address_get_type +extern __typeof (g_socket_address_get_type) g_socket_address_get_type __attribute((alias("IA__g_socket_address_get_type"), visibility("default"))); + +#undef g_socket_address_get_family +extern __typeof (g_socket_address_get_family) g_socket_address_get_family __attribute((alias("IA__g_socket_address_get_family"), visibility("default"))); + +#undef g_socket_address_get_native_size +extern __typeof (g_socket_address_get_native_size) g_socket_address_get_native_size __attribute((alias("IA__g_socket_address_get_native_size"), visibility("default"))); + +#undef g_socket_address_to_native +extern __typeof (g_socket_address_to_native) g_socket_address_to_native __attribute((alias("IA__g_socket_address_to_native"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_RESOLVER_H__) +#if IN_FILE(__G_RESOLVER_C__) +#undef g_resolver_error_quark +extern __typeof (g_resolver_error_quark) g_resolver_error_quark __attribute((alias("IA__g_resolver_error_quark"), visibility("default"))); + +#undef g_resolver_free_addresses +extern __typeof (g_resolver_free_addresses) g_resolver_free_addresses __attribute((alias("IA__g_resolver_free_addresses"), visibility("default"))); + +#undef g_resolver_free_targets +extern __typeof (g_resolver_free_targets) g_resolver_free_targets __attribute((alias("IA__g_resolver_free_targets"), visibility("default"))); + +#undef g_resolver_get_type +extern __typeof (g_resolver_get_type) g_resolver_get_type __attribute((alias("IA__g_resolver_get_type"), visibility("default"))); + +#undef g_resolver_get_default +extern __typeof (g_resolver_get_default) g_resolver_get_default __attribute((alias("IA__g_resolver_get_default"), visibility("default"))); + +#undef g_resolver_set_default +extern __typeof (g_resolver_set_default) g_resolver_set_default __attribute((alias("IA__g_resolver_set_default"), visibility("default"))); + +#undef g_resolver_lookup_by_name +extern __typeof (g_resolver_lookup_by_name) g_resolver_lookup_by_name __attribute((alias("IA__g_resolver_lookup_by_name"), visibility("default"))); + +#undef g_resolver_lookup_by_name_async +extern __typeof (g_resolver_lookup_by_name_async) g_resolver_lookup_by_name_async __attribute((alias("IA__g_resolver_lookup_by_name_async"), visibility("default"))); + +#undef g_resolver_lookup_by_name_finish +extern __typeof (g_resolver_lookup_by_name_finish) g_resolver_lookup_by_name_finish __attribute((alias("IA__g_resolver_lookup_by_name_finish"), visibility("default"))); + +#undef g_resolver_lookup_by_address +extern __typeof (g_resolver_lookup_by_address) g_resolver_lookup_by_address __attribute((alias("IA__g_resolver_lookup_by_address"), visibility("default"))); + +#undef g_resolver_lookup_by_address_async +extern __typeof (g_resolver_lookup_by_address_async) g_resolver_lookup_by_address_async __attribute((alias("IA__g_resolver_lookup_by_address_async"), visibility("default"))); + +#undef g_resolver_lookup_by_address_finish +extern __typeof (g_resolver_lookup_by_address_finish) g_resolver_lookup_by_address_finish __attribute((alias("IA__g_resolver_lookup_by_address_finish"), visibility("default"))); + +#undef g_resolver_lookup_service +extern __typeof (g_resolver_lookup_service) g_resolver_lookup_service __attribute((alias("IA__g_resolver_lookup_service"), visibility("default"))); + +#undef g_resolver_lookup_service_async +extern __typeof (g_resolver_lookup_service_async) g_resolver_lookup_service_async __attribute((alias("IA__g_resolver_lookup_service_async"), visibility("default"))); + +#undef g_resolver_lookup_service_finish +extern __typeof (g_resolver_lookup_service_finish) g_resolver_lookup_service_finish __attribute((alias("IA__g_resolver_lookup_service_finish"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_THREADED_RESOLVER_H__) +#if IN_FILE(__G_THREADED_RESOLVER_C__) +#undef g_threaded_resolver_get_type +extern __typeof (g_threaded_resolver_get_type) g_threaded_resolver_get_type __attribute((alias("IA__g_threaded_resolver_get_type"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNIX_RESOLVER_H__) +#if IN_FILE(__G_UNIX_RESOLVER_C__) +#ifdef G_OS_UNIX +#undef g_unix_resolver_get_type +extern __typeof (g_unix_resolver_get_type) g_unix_resolver_get_type __attribute((alias("IA__g_unix_resolver_get_type"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_WIN32_RESOLVER_H__) +#if IN_FILE(__G_WIN32_RESOLVER_C__) +#ifdef G_OS_WIN32 +#undef g_win32_resolver_get_type +extern __typeof (g_win32_resolver_get_type) g_win32_resolver_get_type __attribute((alias("IA__g_win32_resolver_get_type"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_SRV_TARGET_H__) +#if IN_FILE(__G_SRV_TARGET_C__) +#undef g_srv_target_get_type +extern __typeof (g_srv_target_get_type) g_srv_target_get_type __attribute((alias("IA__g_srv_target_get_type"), visibility("default"))); + +#undef g_srv_target_new +extern __typeof (g_srv_target_new) g_srv_target_new __attribute((alias("IA__g_srv_target_new"), visibility("default"))); + +#undef g_srv_target_copy +extern __typeof (g_srv_target_copy) g_srv_target_copy __attribute((alias("IA__g_srv_target_copy"), visibility("default"))); + +#undef g_srv_target_free +extern __typeof (g_srv_target_free) g_srv_target_free __attribute((alias("IA__g_srv_target_free"), visibility("default"))); + +#undef g_srv_target_get_hostname +extern __typeof (g_srv_target_get_hostname) g_srv_target_get_hostname __attribute((alias("IA__g_srv_target_get_hostname"), visibility("default"))); + +#undef g_srv_target_get_port +extern __typeof (g_srv_target_get_port) g_srv_target_get_port __attribute((alias("IA__g_srv_target_get_port"), visibility("default"))); + +#undef g_srv_target_get_priority +extern __typeof (g_srv_target_get_priority) g_srv_target_get_priority __attribute((alias("IA__g_srv_target_get_priority"), visibility("default"))); + +#undef g_srv_target_get_weight +extern __typeof (g_srv_target_get_weight) g_srv_target_get_weight __attribute((alias("IA__g_srv_target_get_weight"), visibility("default"))); + +#undef g_srv_target_list_sort +extern __typeof (g_srv_target_list_sort) g_srv_target_list_sort __attribute((alias("IA__g_srv_target_list_sort"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_NETWORK_ADDRESS_H__) +#if IN_FILE(__G_NETWORK_ADDRESS_C__) +#undef g_network_address_get_type +extern __typeof (g_network_address_get_type) g_network_address_get_type __attribute((alias("IA__g_network_address_get_type"), visibility("default"))); + +#undef g_network_address_get_hostname +extern __typeof (g_network_address_get_hostname) g_network_address_get_hostname __attribute((alias("IA__g_network_address_get_hostname"), visibility("default"))); + +#undef g_network_address_get_port +extern __typeof (g_network_address_get_port) g_network_address_get_port __attribute((alias("IA__g_network_address_get_port"), visibility("default"))); + +#undef g_network_address_new +extern __typeof (g_network_address_new) g_network_address_new __attribute((alias("IA__g_network_address_new"), visibility("default"))); + +#undef g_network_address_parse +extern __typeof (g_network_address_parse) g_network_address_parse __attribute((alias("IA__g_network_address_parse"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_NETWORK_SERVICE_H__) +#if IN_FILE(__G_NETWORK_SERVICE_C__) +#undef g_network_service_get_type +extern __typeof (g_network_service_get_type) g_network_service_get_type __attribute((alias("IA__g_network_service_get_type"), visibility("default"))); + +#undef g_network_service_get_service +extern __typeof (g_network_service_get_service) g_network_service_get_service __attribute((alias("IA__g_network_service_get_service"), visibility("default"))); + +#undef g_network_service_get_protocol +extern __typeof (g_network_service_get_protocol) g_network_service_get_protocol __attribute((alias("IA__g_network_service_get_protocol"), visibility("default"))); + +#undef g_network_service_get_domain +extern __typeof (g_network_service_get_domain) g_network_service_get_domain __attribute((alias("IA__g_network_service_get_domain"), visibility("default"))); + +#undef g_network_service_new +extern __typeof (g_network_service_new) g_network_service_new __attribute((alias("IA__g_network_service_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CONNECTABLE_H__) +#if IN_FILE(__G_SOCKET_CONNECTABLE_C__) +#undef g_socket_connectable_enumerate +extern __typeof (g_socket_connectable_enumerate) g_socket_connectable_enumerate __attribute((alias("IA__g_socket_connectable_enumerate"), visibility("default"))); + +#undef g_socket_connectable_get_type +extern __typeof (g_socket_connectable_get_type) g_socket_connectable_get_type __attribute((alias("IA__g_socket_connectable_get_type"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_ADDRESS_ENUMERATOR_H__) +#if IN_FILE(__G_SOCKET_ADDRESS_ENUMERATOR_C__) +#undef g_socket_address_enumerator_get_type +extern __typeof (g_socket_address_enumerator_get_type) g_socket_address_enumerator_get_type __attribute((alias("IA__g_socket_address_enumerator_get_type"), visibility("default"))); + +#undef g_socket_address_enumerator_next +extern __typeof (g_socket_address_enumerator_next) g_socket_address_enumerator_next __attribute((alias("IA__g_socket_address_enumerator_next"), visibility("default"))); + +#undef g_socket_address_enumerator_next_async +extern __typeof (g_socket_address_enumerator_next_async) g_socket_address_enumerator_next_async __attribute((alias("IA__g_socket_address_enumerator_next_async"), visibility("default"))); + +#undef g_socket_address_enumerator_next_finish +extern __typeof (g_socket_address_enumerator_next_finish) g_socket_address_enumerator_next_finish __attribute((alias("IA__g_socket_address_enumerator_next_finish"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_ASYNC_INITABLE_H__) +#if IN_FILE(__G_ASYNC_INITABLE_C__) +#undef g_async_initable_get_type +extern __typeof (g_async_initable_get_type) g_async_initable_get_type __attribute((alias("IA__g_async_initable_get_type"), visibility("default"))); + +#undef g_async_initable_init_async +extern __typeof (g_async_initable_init_async) g_async_initable_init_async __attribute((alias("IA__g_async_initable_init_async"), visibility("default"))); + +#undef g_async_initable_init_finish +extern __typeof (g_async_initable_init_finish) g_async_initable_init_finish __attribute((alias("IA__g_async_initable_init_finish"), visibility("default"))); + +#undef g_async_initable_new_async +extern __typeof (g_async_initable_new_async) g_async_initable_new_async __attribute((alias("IA__g_async_initable_new_async"), visibility("default"))); + +#undef g_async_initable_new_finish +extern __typeof (g_async_initable_new_finish) g_async_initable_new_finish __attribute((alias("IA__g_async_initable_new_finish"), visibility("default"))); + +#undef g_async_initable_new_valist_async +extern __typeof (g_async_initable_new_valist_async) g_async_initable_new_valist_async __attribute((alias("IA__g_async_initable_new_valist_async"), visibility("default"))); + +#undef g_async_initable_newv_async +extern __typeof (g_async_initable_newv_async) g_async_initable_newv_async __attribute((alias("IA__g_async_initable_newv_async"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_INITABLE_H__) +#if IN_FILE(__G_INITABLE_C__) +#undef g_initable_get_type +extern __typeof (g_initable_get_type) g_initable_get_type __attribute((alias("IA__g_initable_get_type"), visibility("default"))); + +#undef g_initable_init +extern __typeof (g_initable_init) g_initable_init __attribute((alias("IA__g_initable_init"), visibility("default"))); + +#undef g_initable_new +extern __typeof (g_initable_new) g_initable_new __attribute((alias("IA__g_initable_new"), visibility("default"))); + +#undef g_initable_newv +extern __typeof (g_initable_newv) g_initable_newv __attribute((alias("IA__g_initable_newv"), visibility("default"))); + +#undef g_initable_new_valist +extern __typeof (g_initable_new_valist) g_initable_new_valist __attribute((alias("IA__g_initable_new_valist"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_H__) +#if IN_FILE(__G_SOCKET_C__) +#undef g_socket_get_type +extern __typeof (g_socket_get_type) g_socket_get_type __attribute((alias("IA__g_socket_get_type"), visibility("default"))); + +#undef g_socket_accept +extern __typeof (g_socket_accept) g_socket_accept __attribute((alias("IA__g_socket_accept"), visibility("default"))); + +#undef g_socket_bind +extern __typeof (g_socket_bind) g_socket_bind __attribute((alias("IA__g_socket_bind"), visibility("default"))); + +#undef g_socket_check_connect_result +extern __typeof (g_socket_check_connect_result) g_socket_check_connect_result __attribute((alias("IA__g_socket_check_connect_result"), visibility("default"))); + +#undef g_socket_close +extern __typeof (g_socket_close) g_socket_close __attribute((alias("IA__g_socket_close"), visibility("default"))); + +#undef g_socket_shutdown +extern __typeof (g_socket_shutdown) g_socket_shutdown __attribute((alias("IA__g_socket_shutdown"), visibility("default"))); + +#undef g_socket_condition_check +extern __typeof (g_socket_condition_check) g_socket_condition_check __attribute((alias("IA__g_socket_condition_check"), visibility("default"))); + +#undef g_socket_condition_wait +extern __typeof (g_socket_condition_wait) g_socket_condition_wait __attribute((alias("IA__g_socket_condition_wait"), visibility("default"))); + +#undef g_socket_connect +extern __typeof (g_socket_connect) g_socket_connect __attribute((alias("IA__g_socket_connect"), visibility("default"))); + +#undef g_socket_create_source +extern __typeof (g_socket_create_source) g_socket_create_source __attribute((alias("IA__g_socket_create_source"), visibility("default"))); + +#undef g_socket_get_blocking +extern __typeof (g_socket_get_blocking) g_socket_get_blocking __attribute((alias("IA__g_socket_get_blocking"), visibility("default"))); + +#undef g_socket_get_family +extern __typeof (g_socket_get_family) g_socket_get_family __attribute((alias("IA__g_socket_get_family"), visibility("default"))); + +#undef g_socket_get_fd +extern __typeof (g_socket_get_fd) g_socket_get_fd __attribute((alias("IA__g_socket_get_fd"), visibility("default"))); + +#undef g_socket_get_keepalive +extern __typeof (g_socket_get_keepalive) g_socket_get_keepalive __attribute((alias("IA__g_socket_get_keepalive"), visibility("default"))); + +#undef g_socket_get_listen_backlog +extern __typeof (g_socket_get_listen_backlog) g_socket_get_listen_backlog __attribute((alias("IA__g_socket_get_listen_backlog"), visibility("default"))); + +#undef g_socket_get_local_address +extern __typeof (g_socket_get_local_address) g_socket_get_local_address __attribute((alias("IA__g_socket_get_local_address"), visibility("default"))); + +#undef g_socket_get_protocol +extern __typeof (g_socket_get_protocol) g_socket_get_protocol __attribute((alias("IA__g_socket_get_protocol"), visibility("default"))); + +#undef g_socket_get_remote_address +extern __typeof (g_socket_get_remote_address) g_socket_get_remote_address __attribute((alias("IA__g_socket_get_remote_address"), visibility("default"))); + +#undef g_socket_get_socket_type +extern __typeof (g_socket_get_socket_type) g_socket_get_socket_type __attribute((alias("IA__g_socket_get_socket_type"), visibility("default"))); + +#undef g_socket_is_closed +extern __typeof (g_socket_is_closed) g_socket_is_closed __attribute((alias("IA__g_socket_is_closed"), visibility("default"))); + +#undef g_socket_is_connected +extern __typeof (g_socket_is_connected) g_socket_is_connected __attribute((alias("IA__g_socket_is_connected"), visibility("default"))); + +#undef g_socket_listen +extern __typeof (g_socket_listen) g_socket_listen __attribute((alias("IA__g_socket_listen"), visibility("default"))); + +#undef g_socket_new +extern __typeof (g_socket_new) g_socket_new __attribute((alias("IA__g_socket_new"), visibility("default"))); + +#undef g_socket_new_from_fd +extern __typeof (g_socket_new_from_fd) g_socket_new_from_fd __attribute((alias("IA__g_socket_new_from_fd"), visibility("default"))); + +#undef g_socket_receive +extern __typeof (g_socket_receive) g_socket_receive __attribute((alias("IA__g_socket_receive"), visibility("default"))); + +#undef g_socket_receive_from +extern __typeof (g_socket_receive_from) g_socket_receive_from __attribute((alias("IA__g_socket_receive_from"), visibility("default"))); + +#undef g_socket_receive_message +extern __typeof (g_socket_receive_message) g_socket_receive_message __attribute((alias("IA__g_socket_receive_message"), visibility("default"))); + +#undef g_socket_send +extern __typeof (g_socket_send) g_socket_send __attribute((alias("IA__g_socket_send"), visibility("default"))); + +#undef g_socket_send_message +extern __typeof (g_socket_send_message) g_socket_send_message __attribute((alias("IA__g_socket_send_message"), visibility("default"))); + +#undef g_socket_send_to +extern __typeof (g_socket_send_to) g_socket_send_to __attribute((alias("IA__g_socket_send_to"), visibility("default"))); + +#undef g_socket_set_blocking +extern __typeof (g_socket_set_blocking) g_socket_set_blocking __attribute((alias("IA__g_socket_set_blocking"), visibility("default"))); + +#undef g_socket_set_keepalive +extern __typeof (g_socket_set_keepalive) g_socket_set_keepalive __attribute((alias("IA__g_socket_set_keepalive"), visibility("default"))); + +#undef g_socket_set_listen_backlog +extern __typeof (g_socket_set_listen_backlog) g_socket_set_listen_backlog __attribute((alias("IA__g_socket_set_listen_backlog"), visibility("default"))); + +#undef g_socket_speaks_ipv4 +extern __typeof (g_socket_speaks_ipv4) g_socket_speaks_ipv4 __attribute((alias("IA__g_socket_speaks_ipv4"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CONTROL_MESSAGE_H__) +#if IN_FILE(__G_SOCKET_CONTROL_MESSAGE_C__) +#undef g_socket_control_message_get_type +extern __typeof (g_socket_control_message_get_type) g_socket_control_message_get_type __attribute((alias("IA__g_socket_control_message_get_type"), visibility("default"))); + +#undef g_socket_control_message_deserialize +extern __typeof (g_socket_control_message_deserialize) g_socket_control_message_deserialize __attribute((alias("IA__g_socket_control_message_deserialize"), visibility("default"))); + +#undef g_socket_control_message_get_level +extern __typeof (g_socket_control_message_get_level) g_socket_control_message_get_level __attribute((alias("IA__g_socket_control_message_get_level"), visibility("default"))); + +#undef g_socket_control_message_get_msg_type +extern __typeof (g_socket_control_message_get_msg_type) g_socket_control_message_get_msg_type __attribute((alias("IA__g_socket_control_message_get_msg_type"), visibility("default"))); + +#undef g_socket_control_message_get_size +extern __typeof (g_socket_control_message_get_size) g_socket_control_message_get_size __attribute((alias("IA__g_socket_control_message_get_size"), visibility("default"))); + +#undef g_socket_control_message_serialize +extern __typeof (g_socket_control_message_serialize) g_socket_control_message_serialize __attribute((alias("IA__g_socket_control_message_serialize"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CLIENT_H__) +#if IN_FILE(__G_SOCKET_CLIENT_C__) +#undef g_socket_client_get_type +extern __typeof (g_socket_client_get_type) g_socket_client_get_type __attribute((alias("IA__g_socket_client_get_type"), visibility("default"))); + +#undef g_socket_client_connect +extern __typeof (g_socket_client_connect) g_socket_client_connect __attribute((alias("IA__g_socket_client_connect"), visibility("default"))); + +#undef g_socket_client_connect_async +extern __typeof (g_socket_client_connect_async) g_socket_client_connect_async __attribute((alias("IA__g_socket_client_connect_async"), visibility("default"))); + +#undef g_socket_client_connect_finish +extern __typeof (g_socket_client_connect_finish) g_socket_client_connect_finish __attribute((alias("IA__g_socket_client_connect_finish"), visibility("default"))); + +#undef g_socket_client_connect_to_host +extern __typeof (g_socket_client_connect_to_host) g_socket_client_connect_to_host __attribute((alias("IA__g_socket_client_connect_to_host"), visibility("default"))); + +#undef g_socket_client_connect_to_host_async +extern __typeof (g_socket_client_connect_to_host_async) g_socket_client_connect_to_host_async __attribute((alias("IA__g_socket_client_connect_to_host_async"), visibility("default"))); + +#undef g_socket_client_connect_to_host_finish +extern __typeof (g_socket_client_connect_to_host_finish) g_socket_client_connect_to_host_finish __attribute((alias("IA__g_socket_client_connect_to_host_finish"), visibility("default"))); + +#undef g_socket_client_connect_to_service +extern __typeof (g_socket_client_connect_to_service) g_socket_client_connect_to_service __attribute((alias("IA__g_socket_client_connect_to_service"), visibility("default"))); + +#undef g_socket_client_connect_to_service_async +extern __typeof (g_socket_client_connect_to_service_async) g_socket_client_connect_to_service_async __attribute((alias("IA__g_socket_client_connect_to_service_async"), visibility("default"))); + +#undef g_socket_client_connect_to_service_finish +extern __typeof (g_socket_client_connect_to_service_finish) g_socket_client_connect_to_service_finish __attribute((alias("IA__g_socket_client_connect_to_service_finish"), visibility("default"))); + +#undef g_socket_client_get_family +extern __typeof (g_socket_client_get_family) g_socket_client_get_family __attribute((alias("IA__g_socket_client_get_family"), visibility("default"))); + +#undef g_socket_client_get_local_address +extern __typeof (g_socket_client_get_local_address) g_socket_client_get_local_address __attribute((alias("IA__g_socket_client_get_local_address"), visibility("default"))); + +#undef g_socket_client_get_protocol +extern __typeof (g_socket_client_get_protocol) g_socket_client_get_protocol __attribute((alias("IA__g_socket_client_get_protocol"), visibility("default"))); + +#undef g_socket_client_get_socket_type +extern __typeof (g_socket_client_get_socket_type) g_socket_client_get_socket_type __attribute((alias("IA__g_socket_client_get_socket_type"), visibility("default"))); + +#undef g_socket_client_new +extern __typeof (g_socket_client_new) g_socket_client_new __attribute((alias("IA__g_socket_client_new"), visibility("default"))); + +#undef g_socket_client_set_family +extern __typeof (g_socket_client_set_family) g_socket_client_set_family __attribute((alias("IA__g_socket_client_set_family"), visibility("default"))); + +#undef g_socket_client_set_local_address +extern __typeof (g_socket_client_set_local_address) g_socket_client_set_local_address __attribute((alias("IA__g_socket_client_set_local_address"), visibility("default"))); + +#undef g_socket_client_set_protocol +extern __typeof (g_socket_client_set_protocol) g_socket_client_set_protocol __attribute((alias("IA__g_socket_client_set_protocol"), visibility("default"))); + +#undef g_socket_client_set_socket_type +extern __typeof (g_socket_client_set_socket_type) g_socket_client_set_socket_type __attribute((alias("IA__g_socket_client_set_socket_type"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_CONNECTION_H__) +#if IN_FILE(__G_SOCKET_CONNECTION_C__) +#undef g_socket_connection_get_type +extern __typeof (g_socket_connection_get_type) g_socket_connection_get_type __attribute((alias("IA__g_socket_connection_get_type"), visibility("default"))); + +#undef g_socket_connection_factory_create_connection +extern __typeof (g_socket_connection_factory_create_connection) g_socket_connection_factory_create_connection __attribute((alias("IA__g_socket_connection_factory_create_connection"), visibility("default"))); + +#undef g_socket_connection_factory_lookup_type +extern __typeof (g_socket_connection_factory_lookup_type) g_socket_connection_factory_lookup_type __attribute((alias("IA__g_socket_connection_factory_lookup_type"), visibility("default"))); + +#undef g_socket_connection_factory_register_type +extern __typeof (g_socket_connection_factory_register_type) g_socket_connection_factory_register_type __attribute((alias("IA__g_socket_connection_factory_register_type"), visibility("default"))); + +#undef g_socket_connection_get_local_address +extern __typeof (g_socket_connection_get_local_address) g_socket_connection_get_local_address __attribute((alias("IA__g_socket_connection_get_local_address"), visibility("default"))); + +#undef g_socket_connection_get_remote_address +extern __typeof (g_socket_connection_get_remote_address) g_socket_connection_get_remote_address __attribute((alias("IA__g_socket_connection_get_remote_address"), visibility("default"))); + +#undef g_socket_connection_get_socket +extern __typeof (g_socket_connection_get_socket) g_socket_connection_get_socket __attribute((alias("IA__g_socket_connection_get_socket"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_LISTENER_H__) +#if IN_FILE(__G_SOCKET_LISTENER_C__) +#undef g_socket_listener_get_type +extern __typeof (g_socket_listener_get_type) g_socket_listener_get_type __attribute((alias("IA__g_socket_listener_get_type"), visibility("default"))); + +#undef g_socket_listener_accept +extern __typeof (g_socket_listener_accept) g_socket_listener_accept __attribute((alias("IA__g_socket_listener_accept"), visibility("default"))); + +#undef g_socket_listener_accept_async +extern __typeof (g_socket_listener_accept_async) g_socket_listener_accept_async __attribute((alias("IA__g_socket_listener_accept_async"), visibility("default"))); + +#undef g_socket_listener_accept_finish +extern __typeof (g_socket_listener_accept_finish) g_socket_listener_accept_finish __attribute((alias("IA__g_socket_listener_accept_finish"), visibility("default"))); + +#undef g_socket_listener_accept_socket +extern __typeof (g_socket_listener_accept_socket) g_socket_listener_accept_socket __attribute((alias("IA__g_socket_listener_accept_socket"), visibility("default"))); + +#undef g_socket_listener_accept_socket_async +extern __typeof (g_socket_listener_accept_socket_async) g_socket_listener_accept_socket_async __attribute((alias("IA__g_socket_listener_accept_socket_async"), visibility("default"))); + +#undef g_socket_listener_accept_socket_finish +extern __typeof (g_socket_listener_accept_socket_finish) g_socket_listener_accept_socket_finish __attribute((alias("IA__g_socket_listener_accept_socket_finish"), visibility("default"))); + +#undef g_socket_listener_add_address +extern __typeof (g_socket_listener_add_address) g_socket_listener_add_address __attribute((alias("IA__g_socket_listener_add_address"), visibility("default"))); + +#undef g_socket_listener_add_inet_port +extern __typeof (g_socket_listener_add_inet_port) g_socket_listener_add_inet_port __attribute((alias("IA__g_socket_listener_add_inet_port"), visibility("default"))); + +#undef g_socket_listener_add_any_inet_port +extern __typeof (g_socket_listener_add_any_inet_port) g_socket_listener_add_any_inet_port __attribute((alias("IA__g_socket_listener_add_any_inet_port"), visibility("default"))); + +#undef g_socket_listener_add_socket +extern __typeof (g_socket_listener_add_socket) g_socket_listener_add_socket __attribute((alias("IA__g_socket_listener_add_socket"), visibility("default"))); + +#undef g_socket_listener_close +extern __typeof (g_socket_listener_close) g_socket_listener_close __attribute((alias("IA__g_socket_listener_close"), visibility("default"))); + +#undef g_socket_listener_new +extern __typeof (g_socket_listener_new) g_socket_listener_new __attribute((alias("IA__g_socket_listener_new"), visibility("default"))); + +#undef g_socket_listener_set_backlog +extern __typeof (g_socket_listener_set_backlog) g_socket_listener_set_backlog __attribute((alias("IA__g_socket_listener_set_backlog"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOCKET_SERVICE_H__) +#if IN_FILE(__G_SOCKET_SERVICE_C__) +#undef g_socket_service_get_type +extern __typeof (g_socket_service_get_type) g_socket_service_get_type __attribute((alias("IA__g_socket_service_get_type"), visibility("default"))); + +#undef g_socket_service_is_active +extern __typeof (g_socket_service_is_active) g_socket_service_is_active __attribute((alias("IA__g_socket_service_is_active"), visibility("default"))); + +#undef g_socket_service_new +extern __typeof (g_socket_service_new) g_socket_service_new __attribute((alias("IA__g_socket_service_new"), visibility("default"))); + +#undef g_socket_service_start +extern __typeof (g_socket_service_start) g_socket_service_start __attribute((alias("IA__g_socket_service_start"), visibility("default"))); + +#undef g_socket_service_stop +extern __typeof (g_socket_service_stop) g_socket_service_stop __attribute((alias("IA__g_socket_service_stop"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_THREADED_SOCKET_SERVICE_H__) +#if IN_FILE(__G_THREADED_SOCKET_SERVICE_C__) +#undef g_threaded_socket_service_get_type +extern __typeof (g_threaded_socket_service_get_type) g_threaded_socket_service_get_type __attribute((alias("IA__g_threaded_socket_service_get_type"), visibility("default"))); + +#undef g_threaded_socket_service_new +extern __typeof (g_threaded_socket_service_new) g_threaded_socket_service_new __attribute((alias("IA__g_threaded_socket_service_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TCP_CONNECTION_H__) +#if IN_FILE(__G_TCP_CONNECTION_C__) +#undef g_tcp_connection_get_type +extern __typeof (g_tcp_connection_get_type) g_tcp_connection_get_type __attribute((alias("IA__g_tcp_connection_get_type"), visibility("default"))); + +#undef g_tcp_connection_set_graceful_disconnect +extern __typeof (g_tcp_connection_set_graceful_disconnect) g_tcp_connection_set_graceful_disconnect __attribute((alias("IA__g_tcp_connection_set_graceful_disconnect"), visibility("default"))); + +#undef g_tcp_connection_get_graceful_disconnect +extern __typeof (g_tcp_connection_get_graceful_disconnect) g_tcp_connection_get_graceful_disconnect __attribute((alias("IA__g_tcp_connection_get_graceful_disconnect"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNIX_CONNECTION_H__) +#if IN_FILE(__G_UNIX_CONNECTION_C__) +#ifndef G_OS_WIN32 +#undef g_unix_connection_get_type +extern __typeof (g_unix_connection_get_type) g_unix_connection_get_type __attribute((alias("IA__g_unix_connection_get_type"), visibility("default"))); + +#undef g_unix_connection_receive_fd +extern __typeof (g_unix_connection_receive_fd) g_unix_connection_receive_fd __attribute((alias("IA__g_unix_connection_receive_fd"), visibility("default"))); + +#undef g_unix_connection_send_fd +extern __typeof (g_unix_connection_send_fd) g_unix_connection_send_fd __attribute((alias("IA__g_unix_connection_send_fd"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_UNIX_FD_MESSAGE_H__) +#if IN_FILE(__G_UNIX_FD_MESSAGE_C__) +#ifndef G_OS_WIN32 +#undef g_unix_fd_message_get_type +extern __typeof (g_unix_fd_message_get_type) g_unix_fd_message_get_type __attribute((alias("IA__g_unix_fd_message_get_type"), visibility("default"))); + +#undef g_unix_fd_message_append_fd +extern __typeof (g_unix_fd_message_append_fd) g_unix_fd_message_append_fd __attribute((alias("IA__g_unix_fd_message_append_fd"), visibility("default"))); + +#undef g_unix_fd_message_new +extern __typeof (g_unix_fd_message_new) g_unix_fd_message_new __attribute((alias("IA__g_unix_fd_message_new"), visibility("default"))); + +#undef g_unix_fd_message_steal_fds +extern __typeof (g_unix_fd_message_steal_fds) g_unix_fd_message_steal_fds __attribute((alias("IA__g_unix_fd_message_steal_fds"), visibility("default"))); + +#undef g_unix_fd_message_get_fd_list +extern __typeof (g_unix_fd_message_get_fd_list) g_unix_fd_message_get_fd_list __attribute((alias("IA__g_unix_fd_message_get_fd_list"), visibility("default"))); + +#undef g_unix_fd_message_new_with_fd_list +extern __typeof (g_unix_fd_message_new_with_fd_list) g_unix_fd_message_new_with_fd_list __attribute((alias("IA__g_unix_fd_message_new_with_fd_list"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_UNIX_FD_LIST_H__) +#if IN_FILE(__G_UNIX_FD_LIST_C__) +#ifndef G_OS_WIN32 +#undef g_unix_fd_list_append +extern __typeof (g_unix_fd_list_append) g_unix_fd_list_append __attribute((alias("IA__g_unix_fd_list_append"), visibility("default"))); + +#undef g_unix_fd_list_get +extern __typeof (g_unix_fd_list_get) g_unix_fd_list_get __attribute((alias("IA__g_unix_fd_list_get"), visibility("default"))); + +#undef g_unix_fd_list_get_length +extern __typeof (g_unix_fd_list_get_length) g_unix_fd_list_get_length __attribute((alias("IA__g_unix_fd_list_get_length"), visibility("default"))); + +#undef g_unix_fd_list_get_type +extern __typeof (g_unix_fd_list_get_type) g_unix_fd_list_get_type __attribute((alias("IA__g_unix_fd_list_get_type"), visibility("default"))); + +#undef g_unix_fd_list_new +extern __typeof (g_unix_fd_list_new) g_unix_fd_list_new __attribute((alias("IA__g_unix_fd_list_new"), visibility("default"))); + +#undef g_unix_fd_list_new_from_array +extern __typeof (g_unix_fd_list_new_from_array) g_unix_fd_list_new_from_array __attribute((alias("IA__g_unix_fd_list_new_from_array"), visibility("default"))); + +#undef g_unix_fd_list_peek_fds +extern __typeof (g_unix_fd_list_peek_fds) g_unix_fd_list_peek_fds __attribute((alias("IA__g_unix_fd_list_peek_fds"), visibility("default"))); + +#undef g_unix_fd_list_steal_fds +extern __typeof (g_unix_fd_list_steal_fds) g_unix_fd_list_steal_fds __attribute((alias("IA__g_unix_fd_list_steal_fds"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_ZLIB_COMPRESSOR_H__) +#if IN_FILE(__G_ZLIB_COMPRESSOR_C__) +#undef g_zlib_compressor_get_type +extern __typeof (g_zlib_compressor_get_type) g_zlib_compressor_get_type __attribute((alias("IA__g_zlib_compressor_get_type"), visibility("default"))); + +#undef g_zlib_compressor_new +extern __typeof (g_zlib_compressor_new) g_zlib_compressor_new __attribute((alias("IA__g_zlib_compressor_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_ZLIB_DECOMPRESSOR_H__) +#if IN_FILE(__G_ZLIB_DECOMPRESSOR_C__) +#undef g_zlib_decompressor_get_type +extern __typeof (g_zlib_decompressor_get_type) g_zlib_decompressor_get_type __attribute((alias("IA__g_zlib_decompressor_get_type"), visibility("default"))); + +#undef g_zlib_decompressor_new +extern __typeof (g_zlib_decompressor_new) g_zlib_decompressor_new __attribute((alias("IA__g_zlib_decompressor_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILE_DESCRIPTOR_BASED_H__) +#if IN_FILE(__G_FILE_DESCRIPTOR_BASED_C__) +#undef g_file_descriptor_based_get_type +extern __typeof (g_file_descriptor_based_get_type) g_file_descriptor_based_get_type __attribute((alias("IA__g_file_descriptor_based_get_type"), visibility("default"))); + +#undef g_file_descriptor_based_get_fd +extern __typeof (g_file_descriptor_based_get_fd) g_file_descriptor_based_get_fd __attribute((alias("IA__g_file_descriptor_based_get_fd"), visibility("default"))); + +#endif +#endif + +#endif /* G_HAVE_GNUC_VISIBILITY */ +#endif /* DISABLE_VISIBILITY */ diff --git a/gio/gioenums.h b/gio/gioenums.h new file mode 100644 index 0000000..12242a8 --- /dev/null +++ b/gio/gioenums.h @@ -0,0 +1,703 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GIO_ENUMS_H__ +#define __GIO_ENUMS_H__ + +#include + +G_BEGIN_DECLS + + +/** + * GAppInfoCreateFlags: + * @G_APP_INFO_CREATE_NONE: No flags. + * @G_APP_INFO_CREATE_NEEDS_TERMINAL: Application opens in a terminal window. + * @G_APP_INFO_CREATE_SUPPORTS_URIS: Application supports URI arguments. + * + * Flags used when creating a #GAppInfo. + */ +typedef enum { + G_APP_INFO_CREATE_NONE = 0, /*< nick=none >*/ + G_APP_INFO_CREATE_NEEDS_TERMINAL = (1 << 0), /*< nick=needs-terminal >*/ + G_APP_INFO_CREATE_SUPPORTS_URIS = (1 << 1) /*< nick=supports-uris >*/ +} GAppInfoCreateFlags; + +/** + * GConverterFlags: + * @G_CONVERTER_NO_FLAGS: No flags. + * @G_CONVERTER_INPUT_AT_END: At end of input data + * @G_CONVERTER_FLUSH: Flush data + * + * Flags used when calling a g_converter_convert(). + * + * Since: 2.24 + */ +typedef enum { + G_CONVERTER_NO_FLAGS = 0, /*< nick=none >*/ + G_CONVERTER_INPUT_AT_END = (1 << 0), /*< nick=input-at-end >*/ + G_CONVERTER_FLUSH = (1 << 1) /*< nick=flush >*/ +} GConverterFlags; + +/** + * GConverterResult: + * @G_CONVERTER_ERROR: There was an error during conversion. + * @G_CONVERTER_CONVERTED: Some data was consumed or produced + * @G_CONVERTER_FINISHED: The conversion is finished + * @G_CONVERTER_FLUSHED: Flushing is finished + * + * Results returned from g_converter_convert(). + * + * Since: 2.24 + */ +typedef enum { + G_CONVERTER_ERROR = 0, /*< nick=error >*/ + G_CONVERTER_CONVERTED = 1, /*< nick=converted >*/ + G_CONVERTER_FINISHED = 2, /*< nick=finished >*/ + G_CONVERTER_FLUSHED = 3 /*< nick=flushed >*/ +} GConverterResult; + + +/** + * GDataStreamByteOrder: + * @G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN: Selects Big Endian byte order. + * @G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN: Selects Little Endian byte order. + * @G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN: Selects endianness based on host machine's architecture. + * + * #GDataStreamByteOrder is used to ensure proper endianness of streaming data sources + * across various machine architectures. + * + **/ +typedef enum { + G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN, + G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN, + G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN +} GDataStreamByteOrder; + + +/** + * GDataStreamNewlineType: + * @G_DATA_STREAM_NEWLINE_TYPE_LF: Selects "LF" line endings, common on most modern UNIX platforms. + * @G_DATA_STREAM_NEWLINE_TYPE_CR: Selects "CR" line endings. + * @G_DATA_STREAM_NEWLINE_TYPE_CR_LF: Selects "CR, LF" line ending, common on Microsoft Windows. + * @G_DATA_STREAM_NEWLINE_TYPE_ANY: Automatically try to handle any line ending type. + * + * #GDataStreamNewlineType is used when checking for or setting the line endings for a given file. + **/ +typedef enum { + G_DATA_STREAM_NEWLINE_TYPE_LF, + G_DATA_STREAM_NEWLINE_TYPE_CR, + G_DATA_STREAM_NEWLINE_TYPE_CR_LF, + G_DATA_STREAM_NEWLINE_TYPE_ANY +} GDataStreamNewlineType; + + +/** + * GFileAttributeType: + * @G_FILE_ATTRIBUTE_TYPE_INVALID: indicates an invalid or uninitalized type. + * @G_FILE_ATTRIBUTE_TYPE_STRING: a null terminated UTF8 string. + * @G_FILE_ATTRIBUTE_TYPE_BYTE_STRING: a zero terminated string of non-zero bytes. + * @G_FILE_ATTRIBUTE_TYPE_BOOLEAN: a boolean value. + * @G_FILE_ATTRIBUTE_TYPE_UINT32: an unsigned 4-byte/32-bit integer. + * @G_FILE_ATTRIBUTE_TYPE_INT32: a signed 4-byte/32-bit integer. + * @G_FILE_ATTRIBUTE_TYPE_UINT64: an unsigned 8-byte/64-bit integer. + * @G_FILE_ATTRIBUTE_TYPE_INT64: a signed 8-byte/64-bit integer. + * @G_FILE_ATTRIBUTE_TYPE_OBJECT: a #GObject. + * @G_FILE_ATTRIBUTE_TYPE_STRINGV: a %NULL terminated char **. Since 2.22 + * + * The data types for file attributes. + **/ +typedef enum { + G_FILE_ATTRIBUTE_TYPE_INVALID = 0, + G_FILE_ATTRIBUTE_TYPE_STRING, + G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, /* zero terminated string of non-zero bytes */ + G_FILE_ATTRIBUTE_TYPE_BOOLEAN, + G_FILE_ATTRIBUTE_TYPE_UINT32, + G_FILE_ATTRIBUTE_TYPE_INT32, + G_FILE_ATTRIBUTE_TYPE_UINT64, + G_FILE_ATTRIBUTE_TYPE_INT64, + G_FILE_ATTRIBUTE_TYPE_OBJECT, + G_FILE_ATTRIBUTE_TYPE_STRINGV +} GFileAttributeType; + + +/** + * GFileAttributeInfoFlags: + * @G_FILE_ATTRIBUTE_INFO_NONE: no flags set. + * @G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE: copy the attribute values when the file is copied. + * @G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED: copy the attribute values when the file is moved. + * + * Flags specifying the behaviour of an attribute. + **/ +typedef enum { + G_FILE_ATTRIBUTE_INFO_NONE = 0, + G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE = (1 << 0), + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED = (1 << 1) +} GFileAttributeInfoFlags; + + +/** + * GFileAttributeStatus: + * @G_FILE_ATTRIBUTE_STATUS_UNSET: Attribute value is unset (empty). + * @G_FILE_ATTRIBUTE_STATUS_SET: Attribute value is set. + * @G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING: Indicates an error in setting the value. + * + * Used by g_file_set_attributes_from_info() when setting file attributes. + **/ +typedef enum { + G_FILE_ATTRIBUTE_STATUS_UNSET = 0, + G_FILE_ATTRIBUTE_STATUS_SET, + G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING +} GFileAttributeStatus; + + +/** + * GFileQueryInfoFlags: + * @G_FILE_QUERY_INFO_NONE: No flags set. + * @G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS: Don't follow symlinks. + * + * Flags used when querying a #GFileInfo. + */ +typedef enum { + G_FILE_QUERY_INFO_NONE = 0, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS = (1 << 0) /*< nick=nofollow-symlinks >*/ +} GFileQueryInfoFlags; + + +/** + * GFileCreateFlags: + * @G_FILE_CREATE_NONE: No flags set. + * @G_FILE_CREATE_PRIVATE: Create a file that can only be + * accessed by the current user. + * @G_FILE_CREATE_REPLACE_DESTINATION: Replace the destination + * as if it didn't exist before. Don't try to keep any old + * permissions, replace instead of following links. This + * is generally useful if you're doing a "copy over" + * rather than a "save new version of" replace operation. + * You can think of it as "unlink destination" before + * writing to it, although the implementation may not + * be exactly like that. Since 2.20 + * + * Flags used when an operation may create a file. + */ +typedef enum { + G_FILE_CREATE_NONE = 0, + G_FILE_CREATE_PRIVATE = (1 << 0), + G_FILE_CREATE_REPLACE_DESTINATION = (1 << 1) +} GFileCreateFlags; + + +/** + * GMountMountFlags: + * @G_MOUNT_MOUNT_NONE: No flags set. + * + * Flags used when mounting a mount. + */ +typedef enum { + G_MOUNT_MOUNT_NONE = 0 +} GMountMountFlags; + + +/** + * GMountUnmountFlags: + * @G_MOUNT_UNMOUNT_NONE: No flags set. + * @G_MOUNT_UNMOUNT_FORCE: Unmount even if there are outstanding + * file operations on the mount. + * + * Flags used when an unmounting a mount. + */ +typedef enum { + G_MOUNT_UNMOUNT_NONE = 0, + G_MOUNT_UNMOUNT_FORCE = (1 << 0) +} GMountUnmountFlags; + +/** + * GDriveStartFlags: + * @G_DRIVE_START_NONE: No flags set. + * + * Flags used when starting a drive. + * + * Since: 2.22 + */ +typedef enum { + G_DRIVE_START_NONE = 0 +} GDriveStartFlags; + +/** + * GDriveStartStopType: + * @G_DRIVE_START_STOP_TYPE_UNKNOWN: Unknown or drive doesn't support + * start/stop. + * @G_DRIVE_START_STOP_TYPE_SHUTDOWN: The stop method will physically + * shut down the drive and e.g. power down the port the drive is + * attached to. + * @G_DRIVE_START_STOP_TYPE_NETWORK: The start/stop methods are used + * for connecting/disconnect to the drive over the network. + * @G_DRIVE_START_STOP_TYPE_MULTIDISK: The start/stop methods will + * assemble/disassemble a virtual drive from several physical + * drives. + * @G_DRIVE_START_STOP_TYPE_PASSWORD: The start/stop methods will + * unlock/lock the disk (for example using the ATA SECURITY + * UNLOCK DEVICE command) + * + * Enumeration describing how a drive can be started/stopped. + * + * Since: 2.22 + */ +typedef enum { + G_DRIVE_START_STOP_TYPE_UNKNOWN, + G_DRIVE_START_STOP_TYPE_SHUTDOWN, + G_DRIVE_START_STOP_TYPE_NETWORK, + G_DRIVE_START_STOP_TYPE_MULTIDISK, + G_DRIVE_START_STOP_TYPE_PASSWORD +} GDriveStartStopType; + +/** + * GFileCopyFlags: + * @G_FILE_COPY_NONE: No flags set. + * @G_FILE_COPY_OVERWRITE: Overwrite any existing files + * @G_FILE_COPY_BACKUP: Make a backup of any existing files. + * @G_FILE_COPY_NOFOLLOW_SYMLINKS: Don't follow symlinks. + * @G_FILE_COPY_ALL_METADATA: Copy all file metadata instead of just default set used for copy (see #GFileInfo). + * @G_FILE_COPY_NO_FALLBACK_FOR_MOVE: Don't use copy and delete fallback if native move not supported. + * @G_FILE_COPY_TARGET_DEFAULT_PERMS: Leaves target file with default perms, instead of setting the source file perms. + * + * Flags used when copying or moving files. + */ +typedef enum { + G_FILE_COPY_NONE = 0, /*< nick=none >*/ + G_FILE_COPY_OVERWRITE = (1 << 0), + G_FILE_COPY_BACKUP = (1 << 1), + G_FILE_COPY_NOFOLLOW_SYMLINKS = (1 << 2), + G_FILE_COPY_ALL_METADATA = (1 << 3), + G_FILE_COPY_NO_FALLBACK_FOR_MOVE = (1 << 4), + G_FILE_COPY_TARGET_DEFAULT_PERMS = (1 << 5) +} GFileCopyFlags; + + +/** + * GFileMonitorFlags: + * @G_FILE_MONITOR_NONE: No flags set. + * @G_FILE_MONITOR_WATCH_MOUNTS: Watch for mount events. + * @G_FILE_MONITOR_SEND_MOVED: Pair DELETED and CREATED events caused + * by file renames (moves) and send a single G_FILE_MONITOR_EVENT_MOVED + * event instead (NB: not supported on all backends; the default + * behaviour -without specifying this flag- is to send single DELETED + * and CREATED events). + * + * Flags used to set what a #GFileMonitor will watch for. + */ +typedef enum { + G_FILE_MONITOR_NONE = 0, + G_FILE_MONITOR_WATCH_MOUNTS = (1 << 0), + G_FILE_MONITOR_SEND_MOVED = (1 << 1) +} GFileMonitorFlags; + + +/** + * GFileType: + * @G_FILE_TYPE_UNKNOWN: File's type is unknown. + * @G_FILE_TYPE_REGULAR: File handle represents a regular file. + * @G_FILE_TYPE_DIRECTORY: File handle represents a directory. + * @G_FILE_TYPE_SYMBOLIC_LINK: File handle represents a symbolic link + * (Unix systems). + * @G_FILE_TYPE_SPECIAL: File is a "special" file, such as a socket, fifo, + * block device, or character device. + * @G_FILE_TYPE_SHORTCUT: File is a shortcut (Windows systems). + * @G_FILE_TYPE_MOUNTABLE: File is a mountable location. + * + * Indicates the file's on-disk type. + **/ +typedef enum { + G_FILE_TYPE_UNKNOWN = 0, + G_FILE_TYPE_REGULAR, + G_FILE_TYPE_DIRECTORY, + G_FILE_TYPE_SYMBOLIC_LINK, + G_FILE_TYPE_SPECIAL, /* socket, fifo, blockdev, chardev */ + G_FILE_TYPE_SHORTCUT, + G_FILE_TYPE_MOUNTABLE +} GFileType; + + +/** + * GFilesystemPreviewType: + * @G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS: Only preview files if user has explicitly requested it. + * @G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL: Preview files if user has requested preview of "local" files. + * @G_FILESYSTEM_PREVIEW_TYPE_NEVER: Never preview files. + * + * Indicates a hint from the file system whether files should be + * previewed in a file manager. Returned as the value of the key + * #G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW. + **/ +typedef enum { + G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS = 0, + G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL, + G_FILESYSTEM_PREVIEW_TYPE_NEVER +} GFilesystemPreviewType; + + +/** + * GFileMonitorEvent: + * @G_FILE_MONITOR_EVENT_CHANGED: a file changed. + * @G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: a hint that this was probably the last change in a set of changes. + * @G_FILE_MONITOR_EVENT_DELETED: a file was deleted. + * @G_FILE_MONITOR_EVENT_CREATED: a file was created. + * @G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED: a file attribute was changed. + * @G_FILE_MONITOR_EVENT_PRE_UNMOUNT: the file location will soon be unmounted. + * @G_FILE_MONITOR_EVENT_UNMOUNTED: the file location was unmounted. + * @G_FILE_MONITOR_EVENT_MOVED: the file was moved. + * + * Specifies what type of event a monitor event is. + **/ +typedef enum { + G_FILE_MONITOR_EVENT_CHANGED, + G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT, + G_FILE_MONITOR_EVENT_DELETED, + G_FILE_MONITOR_EVENT_CREATED, + G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED, + G_FILE_MONITOR_EVENT_PRE_UNMOUNT, + G_FILE_MONITOR_EVENT_UNMOUNTED, + G_FILE_MONITOR_EVENT_MOVED +} GFileMonitorEvent; + + +/* This enumeration conflicts with GIOError in giochannel.h. However, + * that is only used as a return value in some deprecated functions. + * So, we reuse the same prefix for the enumeration values, but call + * the actual enumeration (which is rarely used) GIOErrorEnum. + */ +/** + * GIOErrorEnum: + * @G_IO_ERROR_FAILED: Generic error condition for when any operation fails. + * @G_IO_ERROR_NOT_FOUND: File not found error. + * @G_IO_ERROR_EXISTS: File already exists error. + * @G_IO_ERROR_IS_DIRECTORY: File is a directory error. + * @G_IO_ERROR_NOT_DIRECTORY: File is not a directory. + * @G_IO_ERROR_NOT_EMPTY: File is a directory that isn't empty. + * @G_IO_ERROR_NOT_REGULAR_FILE: File is not a regular file. + * @G_IO_ERROR_NOT_SYMBOLIC_LINK: File is not a symbolic link. + * @G_IO_ERROR_NOT_MOUNTABLE_FILE: File cannot be mounted. + * @G_IO_ERROR_FILENAME_TOO_LONG: Filename is too many characters. + * @G_IO_ERROR_INVALID_FILENAME: Filename is invalid or contains invalid characters. + * @G_IO_ERROR_TOO_MANY_LINKS: File contains too many symbolic links. + * @G_IO_ERROR_NO_SPACE: No space left on drive. + * @G_IO_ERROR_INVALID_ARGUMENT: Invalid argument. + * @G_IO_ERROR_PERMISSION_DENIED: Permission denied. + * @G_IO_ERROR_NOT_SUPPORTED: Operation not supported for the current backend. + * @G_IO_ERROR_NOT_MOUNTED: File isn't mounted. + * @G_IO_ERROR_ALREADY_MOUNTED: File is already mounted. + * @G_IO_ERROR_CLOSED: File was closed. + * @G_IO_ERROR_CANCELLED: Operation was cancelled. See #GCancellable. + * @G_IO_ERROR_PENDING: Operations are still pending. + * @G_IO_ERROR_READ_ONLY: File is read only. + * @G_IO_ERROR_CANT_CREATE_BACKUP: Backup couldn't be created. + * @G_IO_ERROR_WRONG_ETAG: File's Entity Tag was incorrect. + * @G_IO_ERROR_TIMED_OUT: Operation timed out. + * @G_IO_ERROR_WOULD_RECURSE: Operation would be recursive. + * @G_IO_ERROR_BUSY: File is busy. + * @G_IO_ERROR_WOULD_BLOCK: Operation would block. + * @G_IO_ERROR_HOST_NOT_FOUND: Host couldn't be found (remote operations). + * @G_IO_ERROR_WOULD_MERGE: Operation would merge files. + * @G_IO_ERROR_FAILED_HANDLED: Operation failed and a helper program has + * already interacted with the user. Do not display any error dialog. + * @G_IO_ERROR_TOO_MANY_OPEN_FILES: The current process has too many files + * open and can't open any more. Duplicate descriptors do count toward + * this limit. Since 2.20 + * @G_IO_ERROR_NOT_INITIALIZED: The object has not been initialized. Since 2.22 + * @G_IO_ERROR_ADDRESS_IN_USE: The requested address is already in use. Since 2.22 + * @G_IO_ERROR_PARTIAL_INPUT: Need more input to finish operation. Since 2.24 + * @G_IO_ERROR_INVALID_DATA: There input data was invalid. Since 2.24 + * + * Error codes returned by GIO functions. + * + **/ +typedef enum { + G_IO_ERROR_FAILED, + G_IO_ERROR_NOT_FOUND, + G_IO_ERROR_EXISTS, + G_IO_ERROR_IS_DIRECTORY, + G_IO_ERROR_NOT_DIRECTORY, + G_IO_ERROR_NOT_EMPTY, + G_IO_ERROR_NOT_REGULAR_FILE, + G_IO_ERROR_NOT_SYMBOLIC_LINK, + G_IO_ERROR_NOT_MOUNTABLE_FILE, + G_IO_ERROR_FILENAME_TOO_LONG, + G_IO_ERROR_INVALID_FILENAME, + G_IO_ERROR_TOO_MANY_LINKS, + G_IO_ERROR_NO_SPACE, + G_IO_ERROR_INVALID_ARGUMENT, + G_IO_ERROR_PERMISSION_DENIED, + G_IO_ERROR_NOT_SUPPORTED, + G_IO_ERROR_NOT_MOUNTED, + G_IO_ERROR_ALREADY_MOUNTED, + G_IO_ERROR_CLOSED, + G_IO_ERROR_CANCELLED, + G_IO_ERROR_PENDING, + G_IO_ERROR_READ_ONLY, + G_IO_ERROR_CANT_CREATE_BACKUP, + G_IO_ERROR_WRONG_ETAG, + G_IO_ERROR_TIMED_OUT, + G_IO_ERROR_WOULD_RECURSE, + G_IO_ERROR_BUSY, + G_IO_ERROR_WOULD_BLOCK, + G_IO_ERROR_HOST_NOT_FOUND, + G_IO_ERROR_WOULD_MERGE, + G_IO_ERROR_FAILED_HANDLED, + G_IO_ERROR_TOO_MANY_OPEN_FILES, + G_IO_ERROR_NOT_INITIALIZED, + G_IO_ERROR_ADDRESS_IN_USE, + G_IO_ERROR_PARTIAL_INPUT, + G_IO_ERROR_INVALID_DATA +} GIOErrorEnum; + + +/** + * GAskPasswordFlags: + * @G_ASK_PASSWORD_NEED_PASSWORD: operation requires a password. + * @G_ASK_PASSWORD_NEED_USERNAME: operation requires a username. + * @G_ASK_PASSWORD_NEED_DOMAIN: operation requires a domain. + * @G_ASK_PASSWORD_SAVING_SUPPORTED: operation supports saving settings. + * @G_ASK_PASSWORD_ANONYMOUS_SUPPORTED: operation supports anonymous users. + * + * #GAskPasswordFlags are used to request specific information from the + * user, or to notify the user of their choices in an authentication + * situation. + **/ +typedef enum { + G_ASK_PASSWORD_NEED_PASSWORD = (1 << 0), + G_ASK_PASSWORD_NEED_USERNAME = (1 << 1), + G_ASK_PASSWORD_NEED_DOMAIN = (1 << 2), + G_ASK_PASSWORD_SAVING_SUPPORTED = (1 << 3), + G_ASK_PASSWORD_ANONYMOUS_SUPPORTED = (1 << 4) +} GAskPasswordFlags; + + +/** + * GPasswordSave: + * @G_PASSWORD_SAVE_NEVER: never save a password. + * @G_PASSWORD_SAVE_FOR_SESSION: save a password for the session. + * @G_PASSWORD_SAVE_PERMANENTLY: save a password permanently. + * + * #GPasswordSave is used to indicate the lifespan of a saved password. + * + * #Gvfs stores passwords in the Gnome keyring when this flag allows it + * to, and later retrieves it again from there. + **/ +typedef enum { + G_PASSWORD_SAVE_NEVER, + G_PASSWORD_SAVE_FOR_SESSION, + G_PASSWORD_SAVE_PERMANENTLY +} GPasswordSave; + + +/** + * GMountOperationResult: + * @G_MOUNT_OPERATION_HANDLED: The request was fulfilled and the + * user specified data is now available + * @G_MOUNT_OPERATION_ABORTED: The user requested the mount operation + * to be aborted + * @G_MOUNT_OPERATION_UNHANDLED: The request was unhandled (i.e. not + * implemented) + * + * #GMountOperationResult is returned as a result when a request for + * information is send by the mounting operation. + **/ +typedef enum { + G_MOUNT_OPERATION_HANDLED, + G_MOUNT_OPERATION_ABORTED, + G_MOUNT_OPERATION_UNHANDLED +} GMountOperationResult; + + +/** + * GOutputStreamSpliceFlags: + * @G_OUTPUT_STREAM_SPLICE_NONE: Do not close either stream. + * @G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE: Close the source stream after + * the splice. + * @G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET: Close the target stream after + * the splice. + * + * GOutputStreamSpliceFlags determine how streams should be spliced. + **/ +typedef enum { + G_OUTPUT_STREAM_SPLICE_NONE = 0, + G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE = (1 << 0), + G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET = (1 << 1) +} GOutputStreamSpliceFlags; + + +/** + * GEmblemOrigin: + * @G_EMBLEM_ORIGIN_UNKNOWN: Emblem of unknown origin + * @G_EMBLEM_ORIGIN_DEVICE: Emblem adds device-specific information + * @G_EMBLEM_ORIGIN_LIVEMETADATA: Emblem depicts live metadata, such as "readonly" + * @G_EMBLEM_ORIGIN_TAG: Emblem comes from a user-defined tag, e.g. set by nautilus (in the future) + * + * GEmblemOrigin is used to add information about the origin of the emblem + * to #GEmblem. + * + * Since: 2.18 + */ +typedef enum { + G_EMBLEM_ORIGIN_UNKNOWN, + G_EMBLEM_ORIGIN_DEVICE, + G_EMBLEM_ORIGIN_LIVEMETADATA, + G_EMBLEM_ORIGIN_TAG +} GEmblemOrigin; + +/** + * GResolverError: + * @G_RESOLVER_ERROR_NOT_FOUND: the requested name/address/service was not + * found + * @G_RESOLVER_ERROR_TEMPORARY_FAILURE: the requested information could not + * be looked up due to a network error or similar problem + * @G_RESOLVER_ERROR_INTERNAL: unknown error + * + * An error code used with %G_RESOLVER_ERROR in a #GError returned + * from a #GResolver routine. + * + * Since: 2.22 + */ +typedef enum { + G_RESOLVER_ERROR_NOT_FOUND, + G_RESOLVER_ERROR_TEMPORARY_FAILURE, + G_RESOLVER_ERROR_INTERNAL +} GResolverError; + +/** + * GSocketFamily: + * @G_SOCKET_FAMILY_INVALID: no address family + * @G_SOCKET_FAMILY_IPV4: the IPv4 family + * @G_SOCKET_FAMILY_IPV6: the IPv6 family + * @G_SOCKET_FAMILY_UNIX: the UNIX domain family + * + * The protocol family of a #GSocketAddress. (These values are + * identical to the system defines %AF_INET, %AF_INET6 and %AF_UNIX, + * if available.) + * + * Since: 2.22 + */ +typedef enum { + G_SOCKET_FAMILY_INVALID, +#ifdef GLIB_SYSDEF_AF_UNIX + G_SOCKET_FAMILY_UNIX = GLIB_SYSDEF_AF_UNIX, +#endif + G_SOCKET_FAMILY_IPV4 = GLIB_SYSDEF_AF_INET, + G_SOCKET_FAMILY_IPV6 = GLIB_SYSDEF_AF_INET6 +} GSocketFamily; + +/** + * GSocketType: + * @G_SOCKET_TYPE_INVALID: Type unknown or wrong + * @G_SOCKET_TYPE_STREAM: Reliable connection-based byte streams (e.g. TCP). + * @G_SOCKET_TYPE_DATAGRAM: Connectionless, unreliable datagram passing. + * (e.g. UDP) + * @G_SOCKET_TYPE_SEQPACKET: Reliable connection-based passing of datagrams + * of fixed maximum length (e.g. SCTP). + * + * Flags used when creating a #GSocket. Some protocols may not implement + * all the socket types. + * + * Since: 2.22 + */ +typedef enum +{ + G_SOCKET_TYPE_INVALID, + G_SOCKET_TYPE_STREAM, + G_SOCKET_TYPE_DATAGRAM, + G_SOCKET_TYPE_SEQPACKET +} GSocketType; + +/** + * GSocketMsgFlags: + * @G_SOCKET_MSG_NONE: No flags. + * @G_SOCKET_MSG_OOB: Request to send/receive out of band data. + * @G_SOCKET_MSG_PEEK: Read data from the socket without removing it from + * the queue. + * @G_SOCKET_MSG_DONTROUTE: Don't use a gateway to send out the packet, + * only send to hosts on directly connected networks. + * + * Flags used in g_socket_receive_message() and g_socket_send_message(). + * The flags listed in the enum are some commonly available flags, but the + * values used for them are the same as on the platform, and any other flags + * are passed in/out as is. So to use a platform specific flag, just include + * the right system header and pass in the flag. + * + * Since: 2.22 + */ +typedef enum +{ + G_SOCKET_MSG_NONE, + G_SOCKET_MSG_OOB = GLIB_SYSDEF_MSG_OOB, + G_SOCKET_MSG_PEEK = GLIB_SYSDEF_MSG_PEEK, + G_SOCKET_MSG_DONTROUTE = GLIB_SYSDEF_MSG_DONTROUTE +} GSocketMsgFlags; + +/** + * GSocketProtocol: + * @G_SOCKET_PROTOCOL_UNKNOWN: The protocol type is unknown + * @G_SOCKET_PROTOCOL_DEFAULT: The default protocol for the family/type + * @G_SOCKET_PROTOCOL_TCP: TCP over IP + * @G_SOCKET_PROTOCOL_UDP: UDP over IP + * @G_SOCKET_PROTOCOL_SCTP: SCTP over IP + * + * A protocol identifier is specified when creating a #GSocket, which is a + * family/type specific identifier, where 0 means the default protocol for + * the particular family/type. + * + * This enum contains a set of commonly available and used protocols. You + * can also pass any other identifiers handled by the platform in order to + * use protocols not listed here. + * + * Since: 2.22 + */ +typedef enum { + G_SOCKET_PROTOCOL_UNKNOWN = -1, + G_SOCKET_PROTOCOL_DEFAULT = 0, + G_SOCKET_PROTOCOL_TCP = 6, + G_SOCKET_PROTOCOL_UDP = 17, + G_SOCKET_PROTOCOL_SCTP = 132 +} GSocketProtocol; + +/** + * GZlibCompressorFormat: + * @G_ZLIB_COMPRESSOR_FORMAT_ZLIB: deflate compression with zlib header + * @G_ZLIB_COMPRESSOR_FORMAT_GZIP: gzip file format + * @G_ZLIB_COMPRESSOR_FORMAT_RAW: deflate compression with no header + * + * Used to select the type of data format to use for #GZlibDecompressor + * and #GZlibCompressor. + * + * Since: 2.24 + */ +typedef enum { + G_ZLIB_COMPRESSOR_FORMAT_ZLIB, + G_ZLIB_COMPRESSOR_FORMAT_GZIP, + G_ZLIB_COMPRESSOR_FORMAT_RAW +} GZlibCompressorFormat; + +G_END_DECLS + +#endif /* __GIO_ENUMS_H__ */ diff --git a/gio/gioenumtypes.c b/gio/gioenumtypes.c new file mode 100644 index 0000000..86e89cc --- /dev/null +++ b/gio/gioenumtypes.c @@ -0,0 +1,722 @@ + +/* Generated data (by glib-mkenums) */ + +#include +#include "gioalias.h" + +/* enumerations from "gioenums.h" */ +GType +g_app_info_create_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_APP_INFO_CREATE_NONE, "G_APP_INFO_CREATE_NONE", "none" }, + { G_APP_INFO_CREATE_NEEDS_TERMINAL, "G_APP_INFO_CREATE_NEEDS_TERMINAL", "needs-terminal" }, + { G_APP_INFO_CREATE_SUPPORTS_URIS, "G_APP_INFO_CREATE_SUPPORTS_URIS", "supports-uris" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GAppInfoCreateFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_converter_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_CONVERTER_NO_FLAGS, "G_CONVERTER_NO_FLAGS", "none" }, + { G_CONVERTER_INPUT_AT_END, "G_CONVERTER_INPUT_AT_END", "input-at-end" }, + { G_CONVERTER_FLUSH, "G_CONVERTER_FLUSH", "flush" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GConverterFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_converter_result_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_CONVERTER_ERROR, "G_CONVERTER_ERROR", "error" }, + { G_CONVERTER_CONVERTED, "G_CONVERTER_CONVERTED", "converted" }, + { G_CONVERTER_FINISHED, "G_CONVERTER_FINISHED", "finished" }, + { G_CONVERTER_FLUSHED, "G_CONVERTER_FLUSHED", "flushed" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GConverterResult"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_data_stream_byte_order_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN, "G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN", "big-endian" }, + { G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN, "G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN", "little-endian" }, + { G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN, "G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN", "host-endian" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GDataStreamByteOrder"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_data_stream_newline_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_DATA_STREAM_NEWLINE_TYPE_LF, "G_DATA_STREAM_NEWLINE_TYPE_LF", "lf" }, + { G_DATA_STREAM_NEWLINE_TYPE_CR, "G_DATA_STREAM_NEWLINE_TYPE_CR", "cr" }, + { G_DATA_STREAM_NEWLINE_TYPE_CR_LF, "G_DATA_STREAM_NEWLINE_TYPE_CR_LF", "cr-lf" }, + { G_DATA_STREAM_NEWLINE_TYPE_ANY, "G_DATA_STREAM_NEWLINE_TYPE_ANY", "any" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GDataStreamNewlineType"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_attribute_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_FILE_ATTRIBUTE_TYPE_INVALID, "G_FILE_ATTRIBUTE_TYPE_INVALID", "invalid" }, + { G_FILE_ATTRIBUTE_TYPE_STRING, "G_FILE_ATTRIBUTE_TYPE_STRING", "string" }, + { G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, "G_FILE_ATTRIBUTE_TYPE_BYTE_STRING", "byte-string" }, + { G_FILE_ATTRIBUTE_TYPE_BOOLEAN, "G_FILE_ATTRIBUTE_TYPE_BOOLEAN", "boolean" }, + { G_FILE_ATTRIBUTE_TYPE_UINT32, "G_FILE_ATTRIBUTE_TYPE_UINT32", "uint32" }, + { G_FILE_ATTRIBUTE_TYPE_INT32, "G_FILE_ATTRIBUTE_TYPE_INT32", "int32" }, + { G_FILE_ATTRIBUTE_TYPE_UINT64, "G_FILE_ATTRIBUTE_TYPE_UINT64", "uint64" }, + { G_FILE_ATTRIBUTE_TYPE_INT64, "G_FILE_ATTRIBUTE_TYPE_INT64", "int64" }, + { G_FILE_ATTRIBUTE_TYPE_OBJECT, "G_FILE_ATTRIBUTE_TYPE_OBJECT", "object" }, + { G_FILE_ATTRIBUTE_TYPE_STRINGV, "G_FILE_ATTRIBUTE_TYPE_STRINGV", "stringv" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GFileAttributeType"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_attribute_info_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_FILE_ATTRIBUTE_INFO_NONE, "G_FILE_ATTRIBUTE_INFO_NONE", "none" }, + { G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE, "G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE", "copy-with-file" }, + { G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED, "G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED", "copy-when-moved" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GFileAttributeInfoFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_attribute_status_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_FILE_ATTRIBUTE_STATUS_UNSET, "G_FILE_ATTRIBUTE_STATUS_UNSET", "unset" }, + { G_FILE_ATTRIBUTE_STATUS_SET, "G_FILE_ATTRIBUTE_STATUS_SET", "set" }, + { G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING, "G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING", "error-setting" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GFileAttributeStatus"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_query_info_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_FILE_QUERY_INFO_NONE, "G_FILE_QUERY_INFO_NONE", "none" }, + { G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, "G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS", "nofollow-symlinks" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GFileQueryInfoFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_create_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_FILE_CREATE_NONE, "G_FILE_CREATE_NONE", "none" }, + { G_FILE_CREATE_PRIVATE, "G_FILE_CREATE_PRIVATE", "private" }, + { G_FILE_CREATE_REPLACE_DESTINATION, "G_FILE_CREATE_REPLACE_DESTINATION", "replace-destination" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GFileCreateFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_mount_mount_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_MOUNT_MOUNT_NONE, "G_MOUNT_MOUNT_NONE", "none" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GMountMountFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_mount_unmount_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_MOUNT_UNMOUNT_NONE, "G_MOUNT_UNMOUNT_NONE", "none" }, + { G_MOUNT_UNMOUNT_FORCE, "G_MOUNT_UNMOUNT_FORCE", "force" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GMountUnmountFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_drive_start_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_DRIVE_START_NONE, "G_DRIVE_START_NONE", "none" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GDriveStartFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_drive_start_stop_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_DRIVE_START_STOP_TYPE_UNKNOWN, "G_DRIVE_START_STOP_TYPE_UNKNOWN", "unknown" }, + { G_DRIVE_START_STOP_TYPE_SHUTDOWN, "G_DRIVE_START_STOP_TYPE_SHUTDOWN", "shutdown" }, + { G_DRIVE_START_STOP_TYPE_NETWORK, "G_DRIVE_START_STOP_TYPE_NETWORK", "network" }, + { G_DRIVE_START_STOP_TYPE_MULTIDISK, "G_DRIVE_START_STOP_TYPE_MULTIDISK", "multidisk" }, + { G_DRIVE_START_STOP_TYPE_PASSWORD, "G_DRIVE_START_STOP_TYPE_PASSWORD", "password" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GDriveStartStopType"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_copy_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_FILE_COPY_NONE, "G_FILE_COPY_NONE", "none" }, + { G_FILE_COPY_OVERWRITE, "G_FILE_COPY_OVERWRITE", "overwrite" }, + { G_FILE_COPY_BACKUP, "G_FILE_COPY_BACKUP", "backup" }, + { G_FILE_COPY_NOFOLLOW_SYMLINKS, "G_FILE_COPY_NOFOLLOW_SYMLINKS", "nofollow-symlinks" }, + { G_FILE_COPY_ALL_METADATA, "G_FILE_COPY_ALL_METADATA", "all-metadata" }, + { G_FILE_COPY_NO_FALLBACK_FOR_MOVE, "G_FILE_COPY_NO_FALLBACK_FOR_MOVE", "no-fallback-for-move" }, + { G_FILE_COPY_TARGET_DEFAULT_PERMS, "G_FILE_COPY_TARGET_DEFAULT_PERMS", "target-default-perms" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GFileCopyFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_monitor_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_FILE_MONITOR_NONE, "G_FILE_MONITOR_NONE", "none" }, + { G_FILE_MONITOR_WATCH_MOUNTS, "G_FILE_MONITOR_WATCH_MOUNTS", "watch-mounts" }, + { G_FILE_MONITOR_SEND_MOVED, "G_FILE_MONITOR_SEND_MOVED", "send-moved" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GFileMonitorFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_FILE_TYPE_UNKNOWN, "G_FILE_TYPE_UNKNOWN", "unknown" }, + { G_FILE_TYPE_REGULAR, "G_FILE_TYPE_REGULAR", "regular" }, + { G_FILE_TYPE_DIRECTORY, "G_FILE_TYPE_DIRECTORY", "directory" }, + { G_FILE_TYPE_SYMBOLIC_LINK, "G_FILE_TYPE_SYMBOLIC_LINK", "symbolic-link" }, + { G_FILE_TYPE_SPECIAL, "G_FILE_TYPE_SPECIAL", "special" }, + { G_FILE_TYPE_SHORTCUT, "G_FILE_TYPE_SHORTCUT", "shortcut" }, + { G_FILE_TYPE_MOUNTABLE, "G_FILE_TYPE_MOUNTABLE", "mountable" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GFileType"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_filesystem_preview_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS, "G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS", "if-always" }, + { G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL, "G_FILESYSTEM_PREVIEW_TYPE_IF_LOCAL", "if-local" }, + { G_FILESYSTEM_PREVIEW_TYPE_NEVER, "G_FILESYSTEM_PREVIEW_TYPE_NEVER", "never" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GFilesystemPreviewType"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_file_monitor_event_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_FILE_MONITOR_EVENT_CHANGED, "G_FILE_MONITOR_EVENT_CHANGED", "changed" }, + { G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT, "G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT", "changes-done-hint" }, + { G_FILE_MONITOR_EVENT_DELETED, "G_FILE_MONITOR_EVENT_DELETED", "deleted" }, + { G_FILE_MONITOR_EVENT_CREATED, "G_FILE_MONITOR_EVENT_CREATED", "created" }, + { G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED, "G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED", "attribute-changed" }, + { G_FILE_MONITOR_EVENT_PRE_UNMOUNT, "G_FILE_MONITOR_EVENT_PRE_UNMOUNT", "pre-unmount" }, + { G_FILE_MONITOR_EVENT_UNMOUNTED, "G_FILE_MONITOR_EVENT_UNMOUNTED", "unmounted" }, + { G_FILE_MONITOR_EVENT_MOVED, "G_FILE_MONITOR_EVENT_MOVED", "moved" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GFileMonitorEvent"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_io_error_enum_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_IO_ERROR_FAILED, "G_IO_ERROR_FAILED", "failed" }, + { G_IO_ERROR_NOT_FOUND, "G_IO_ERROR_NOT_FOUND", "not-found" }, + { G_IO_ERROR_EXISTS, "G_IO_ERROR_EXISTS", "exists" }, + { G_IO_ERROR_IS_DIRECTORY, "G_IO_ERROR_IS_DIRECTORY", "is-directory" }, + { G_IO_ERROR_NOT_DIRECTORY, "G_IO_ERROR_NOT_DIRECTORY", "not-directory" }, + { G_IO_ERROR_NOT_EMPTY, "G_IO_ERROR_NOT_EMPTY", "not-empty" }, + { G_IO_ERROR_NOT_REGULAR_FILE, "G_IO_ERROR_NOT_REGULAR_FILE", "not-regular-file" }, + { G_IO_ERROR_NOT_SYMBOLIC_LINK, "G_IO_ERROR_NOT_SYMBOLIC_LINK", "not-symbolic-link" }, + { G_IO_ERROR_NOT_MOUNTABLE_FILE, "G_IO_ERROR_NOT_MOUNTABLE_FILE", "not-mountable-file" }, + { G_IO_ERROR_FILENAME_TOO_LONG, "G_IO_ERROR_FILENAME_TOO_LONG", "filename-too-long" }, + { G_IO_ERROR_INVALID_FILENAME, "G_IO_ERROR_INVALID_FILENAME", "invalid-filename" }, + { G_IO_ERROR_TOO_MANY_LINKS, "G_IO_ERROR_TOO_MANY_LINKS", "too-many-links" }, + { G_IO_ERROR_NO_SPACE, "G_IO_ERROR_NO_SPACE", "no-space" }, + { G_IO_ERROR_INVALID_ARGUMENT, "G_IO_ERROR_INVALID_ARGUMENT", "invalid-argument" }, + { G_IO_ERROR_PERMISSION_DENIED, "G_IO_ERROR_PERMISSION_DENIED", "permission-denied" }, + { G_IO_ERROR_NOT_SUPPORTED, "G_IO_ERROR_NOT_SUPPORTED", "not-supported" }, + { G_IO_ERROR_NOT_MOUNTED, "G_IO_ERROR_NOT_MOUNTED", "not-mounted" }, + { G_IO_ERROR_ALREADY_MOUNTED, "G_IO_ERROR_ALREADY_MOUNTED", "already-mounted" }, + { G_IO_ERROR_CLOSED, "G_IO_ERROR_CLOSED", "closed" }, + { G_IO_ERROR_CANCELLED, "G_IO_ERROR_CANCELLED", "cancelled" }, + { G_IO_ERROR_PENDING, "G_IO_ERROR_PENDING", "pending" }, + { G_IO_ERROR_READ_ONLY, "G_IO_ERROR_READ_ONLY", "read-only" }, + { G_IO_ERROR_CANT_CREATE_BACKUP, "G_IO_ERROR_CANT_CREATE_BACKUP", "cant-create-backup" }, + { G_IO_ERROR_WRONG_ETAG, "G_IO_ERROR_WRONG_ETAG", "wrong-etag" }, + { G_IO_ERROR_TIMED_OUT, "G_IO_ERROR_TIMED_OUT", "timed-out" }, + { G_IO_ERROR_WOULD_RECURSE, "G_IO_ERROR_WOULD_RECURSE", "would-recurse" }, + { G_IO_ERROR_BUSY, "G_IO_ERROR_BUSY", "busy" }, + { G_IO_ERROR_WOULD_BLOCK, "G_IO_ERROR_WOULD_BLOCK", "would-block" }, + { G_IO_ERROR_HOST_NOT_FOUND, "G_IO_ERROR_HOST_NOT_FOUND", "host-not-found" }, + { G_IO_ERROR_WOULD_MERGE, "G_IO_ERROR_WOULD_MERGE", "would-merge" }, + { G_IO_ERROR_FAILED_HANDLED, "G_IO_ERROR_FAILED_HANDLED", "failed-handled" }, + { G_IO_ERROR_TOO_MANY_OPEN_FILES, "G_IO_ERROR_TOO_MANY_OPEN_FILES", "too-many-open-files" }, + { G_IO_ERROR_NOT_INITIALIZED, "G_IO_ERROR_NOT_INITIALIZED", "not-initialized" }, + { G_IO_ERROR_ADDRESS_IN_USE, "G_IO_ERROR_ADDRESS_IN_USE", "address-in-use" }, + { G_IO_ERROR_PARTIAL_INPUT, "G_IO_ERROR_PARTIAL_INPUT", "partial-input" }, + { G_IO_ERROR_INVALID_DATA, "G_IO_ERROR_INVALID_DATA", "invalid-data" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GIOErrorEnum"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_ask_password_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_ASK_PASSWORD_NEED_PASSWORD, "G_ASK_PASSWORD_NEED_PASSWORD", "need-password" }, + { G_ASK_PASSWORD_NEED_USERNAME, "G_ASK_PASSWORD_NEED_USERNAME", "need-username" }, + { G_ASK_PASSWORD_NEED_DOMAIN, "G_ASK_PASSWORD_NEED_DOMAIN", "need-domain" }, + { G_ASK_PASSWORD_SAVING_SUPPORTED, "G_ASK_PASSWORD_SAVING_SUPPORTED", "saving-supported" }, + { G_ASK_PASSWORD_ANONYMOUS_SUPPORTED, "G_ASK_PASSWORD_ANONYMOUS_SUPPORTED", "anonymous-supported" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GAskPasswordFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_password_save_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_PASSWORD_SAVE_NEVER, "G_PASSWORD_SAVE_NEVER", "never" }, + { G_PASSWORD_SAVE_FOR_SESSION, "G_PASSWORD_SAVE_FOR_SESSION", "for-session" }, + { G_PASSWORD_SAVE_PERMANENTLY, "G_PASSWORD_SAVE_PERMANENTLY", "permanently" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GPasswordSave"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_mount_operation_result_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_MOUNT_OPERATION_HANDLED, "G_MOUNT_OPERATION_HANDLED", "handled" }, + { G_MOUNT_OPERATION_ABORTED, "G_MOUNT_OPERATION_ABORTED", "aborted" }, + { G_MOUNT_OPERATION_UNHANDLED, "G_MOUNT_OPERATION_UNHANDLED", "unhandled" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GMountOperationResult"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_output_stream_splice_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GFlagsValue values[] = { + { G_OUTPUT_STREAM_SPLICE_NONE, "G_OUTPUT_STREAM_SPLICE_NONE", "none" }, + { G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE, "G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE", "close-source" }, + { G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, "G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET", "close-target" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GOutputStreamSpliceFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_emblem_origin_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_EMBLEM_ORIGIN_UNKNOWN, "G_EMBLEM_ORIGIN_UNKNOWN", "unknown" }, + { G_EMBLEM_ORIGIN_DEVICE, "G_EMBLEM_ORIGIN_DEVICE", "device" }, + { G_EMBLEM_ORIGIN_LIVEMETADATA, "G_EMBLEM_ORIGIN_LIVEMETADATA", "livemetadata" }, + { G_EMBLEM_ORIGIN_TAG, "G_EMBLEM_ORIGIN_TAG", "tag" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GEmblemOrigin"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_resolver_error_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_RESOLVER_ERROR_NOT_FOUND, "G_RESOLVER_ERROR_NOT_FOUND", "not-found" }, + { G_RESOLVER_ERROR_TEMPORARY_FAILURE, "G_RESOLVER_ERROR_TEMPORARY_FAILURE", "temporary-failure" }, + { G_RESOLVER_ERROR_INTERNAL, "G_RESOLVER_ERROR_INTERNAL", "internal" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GResolverError"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_socket_family_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_SOCKET_FAMILY_INVALID, "G_SOCKET_FAMILY_INVALID", "invalid" }, + { G_SOCKET_FAMILY_UNIX, "G_SOCKET_FAMILY_UNIX", "unix" }, + { G_SOCKET_FAMILY_IPV4, "G_SOCKET_FAMILY_IPV4", "ipv4" }, + { G_SOCKET_FAMILY_IPV6, "G_SOCKET_FAMILY_IPV6", "ipv6" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GSocketFamily"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_socket_type_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_SOCKET_TYPE_INVALID, "G_SOCKET_TYPE_INVALID", "invalid" }, + { G_SOCKET_TYPE_STREAM, "G_SOCKET_TYPE_STREAM", "stream" }, + { G_SOCKET_TYPE_DATAGRAM, "G_SOCKET_TYPE_DATAGRAM", "datagram" }, + { G_SOCKET_TYPE_SEQPACKET, "G_SOCKET_TYPE_SEQPACKET", "seqpacket" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GSocketType"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_socket_msg_flags_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_SOCKET_MSG_NONE, "G_SOCKET_MSG_NONE", "none" }, + { G_SOCKET_MSG_OOB, "G_SOCKET_MSG_OOB", "oob" }, + { G_SOCKET_MSG_PEEK, "G_SOCKET_MSG_PEEK", "peek" }, + { G_SOCKET_MSG_DONTROUTE, "G_SOCKET_MSG_DONTROUTE", "dontroute" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GSocketMsgFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_socket_protocol_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_SOCKET_PROTOCOL_UNKNOWN, "G_SOCKET_PROTOCOL_UNKNOWN", "unknown" }, + { G_SOCKET_PROTOCOL_DEFAULT, "G_SOCKET_PROTOCOL_DEFAULT", "default" }, + { G_SOCKET_PROTOCOL_TCP, "G_SOCKET_PROTOCOL_TCP", "tcp" }, + { G_SOCKET_PROTOCOL_UDP, "G_SOCKET_PROTOCOL_UDP", "udp" }, + { G_SOCKET_PROTOCOL_SCTP, "G_SOCKET_PROTOCOL_SCTP", "sctp" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GSocketProtocol"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +GType +g_zlib_compressor_format_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const GEnumValue values[] = { + { G_ZLIB_COMPRESSOR_FORMAT_ZLIB, "G_ZLIB_COMPRESSOR_FORMAT_ZLIB", "zlib" }, + { G_ZLIB_COMPRESSOR_FORMAT_GZIP, "G_ZLIB_COMPRESSOR_FORMAT_GZIP", "gzip" }, + { G_ZLIB_COMPRESSOR_FORMAT_RAW, "G_ZLIB_COMPRESSOR_FORMAT_RAW", "raw" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("GZlibCompressorFormat"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +#define __GIO_ENUM_TYPES_C__ +#include "gioaliasdef.c" + +/* Generated data ends here */ + diff --git a/gio/gioenumtypes.c.template b/gio/gioenumtypes.c.template new file mode 100644 index 0000000..46db905 --- /dev/null +++ b/gio/gioenumtypes.c.template @@ -0,0 +1,42 @@ +/*** BEGIN file-header ***/ +#include +#include "gioalias.h" + +/*** END file-header ***/ + +/*** BEGIN file-production ***/ +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType +@enum_name@_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + static const G@Type@Value values[] = { +/*** END value-header ***/ + +/*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, +/*** END value-production ***/ + +/*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/*** END value-tail ***/ + +/*** BEGIN file-tail ***/ +#define __GIO_ENUM_TYPES_C__ +#include "gioaliasdef.c" +/*** END file-tail ***/ diff --git a/gio/gioenumtypes.h b/gio/gioenumtypes.h new file mode 100644 index 0000000..1b81c4b --- /dev/null +++ b/gio/gioenumtypes.h @@ -0,0 +1,79 @@ + +/* Generated data (by glib-mkenums) */ + +#ifndef __GIO_ENUM_TYPES_H__ +#define __GIO_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS + +/* enumerations from "gioenums.h" */ +GType g_app_info_create_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_APP_INFO_CREATE_FLAGS (g_app_info_create_flags_get_type ()) +GType g_converter_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_CONVERTER_FLAGS (g_converter_flags_get_type ()) +GType g_converter_result_get_type (void) G_GNUC_CONST; +#define G_TYPE_CONVERTER_RESULT (g_converter_result_get_type ()) +GType g_data_stream_byte_order_get_type (void) G_GNUC_CONST; +#define G_TYPE_DATA_STREAM_BYTE_ORDER (g_data_stream_byte_order_get_type ()) +GType g_data_stream_newline_type_get_type (void) G_GNUC_CONST; +#define G_TYPE_DATA_STREAM_NEWLINE_TYPE (g_data_stream_newline_type_get_type ()) +GType g_file_attribute_type_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_ATTRIBUTE_TYPE (g_file_attribute_type_get_type ()) +GType g_file_attribute_info_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_ATTRIBUTE_INFO_FLAGS (g_file_attribute_info_flags_get_type ()) +GType g_file_attribute_status_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_ATTRIBUTE_STATUS (g_file_attribute_status_get_type ()) +GType g_file_query_info_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_QUERY_INFO_FLAGS (g_file_query_info_flags_get_type ()) +GType g_file_create_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_CREATE_FLAGS (g_file_create_flags_get_type ()) +GType g_mount_mount_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_MOUNT_MOUNT_FLAGS (g_mount_mount_flags_get_type ()) +GType g_mount_unmount_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_MOUNT_UNMOUNT_FLAGS (g_mount_unmount_flags_get_type ()) +GType g_drive_start_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_DRIVE_START_FLAGS (g_drive_start_flags_get_type ()) +GType g_drive_start_stop_type_get_type (void) G_GNUC_CONST; +#define G_TYPE_DRIVE_START_STOP_TYPE (g_drive_start_stop_type_get_type ()) +GType g_file_copy_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_COPY_FLAGS (g_file_copy_flags_get_type ()) +GType g_file_monitor_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_MONITOR_FLAGS (g_file_monitor_flags_get_type ()) +GType g_file_type_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_TYPE (g_file_type_get_type ()) +GType g_filesystem_preview_type_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILESYSTEM_PREVIEW_TYPE (g_filesystem_preview_type_get_type ()) +GType g_file_monitor_event_get_type (void) G_GNUC_CONST; +#define G_TYPE_FILE_MONITOR_EVENT (g_file_monitor_event_get_type ()) +GType g_io_error_enum_get_type (void) G_GNUC_CONST; +#define G_TYPE_IO_ERROR_ENUM (g_io_error_enum_get_type ()) +GType g_ask_password_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_ASK_PASSWORD_FLAGS (g_ask_password_flags_get_type ()) +GType g_password_save_get_type (void) G_GNUC_CONST; +#define G_TYPE_PASSWORD_SAVE (g_password_save_get_type ()) +GType g_mount_operation_result_get_type (void) G_GNUC_CONST; +#define G_TYPE_MOUNT_OPERATION_RESULT (g_mount_operation_result_get_type ()) +GType g_output_stream_splice_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_OUTPUT_STREAM_SPLICE_FLAGS (g_output_stream_splice_flags_get_type ()) +GType g_emblem_origin_get_type (void) G_GNUC_CONST; +#define G_TYPE_EMBLEM_ORIGIN (g_emblem_origin_get_type ()) +GType g_resolver_error_get_type (void) G_GNUC_CONST; +#define G_TYPE_RESOLVER_ERROR (g_resolver_error_get_type ()) +GType g_socket_family_get_type (void) G_GNUC_CONST; +#define G_TYPE_SOCKET_FAMILY (g_socket_family_get_type ()) +GType g_socket_type_get_type (void) G_GNUC_CONST; +#define G_TYPE_SOCKET_TYPE (g_socket_type_get_type ()) +GType g_socket_msg_flags_get_type (void) G_GNUC_CONST; +#define G_TYPE_SOCKET_MSG_FLAGS (g_socket_msg_flags_get_type ()) +GType g_socket_protocol_get_type (void) G_GNUC_CONST; +#define G_TYPE_SOCKET_PROTOCOL (g_socket_protocol_get_type ()) +GType g_zlib_compressor_format_get_type (void) G_GNUC_CONST; +#define G_TYPE_ZLIB_COMPRESSOR_FORMAT (g_zlib_compressor_format_get_type ()) +G_END_DECLS + +#endif /* __GIO_ENUM_TYPES_H__ */ + +/* Generated data ends here */ + diff --git a/gio/gioenumtypes.h.template b/gio/gioenumtypes.h.template new file mode 100644 index 0000000..174bd62 --- /dev/null +++ b/gio/gioenumtypes.h.template @@ -0,0 +1,24 @@ +/*** BEGIN file-header ***/ +#ifndef __GIO_ENUM_TYPES_H__ +#define __GIO_ENUM_TYPES_H__ + +#include + +G_BEGIN_DECLS +/*** END file-header ***/ + +/*** BEGIN file-production ***/ + +/* enumerations from "@filename@" */ +/*** END file-production ***/ + +/*** BEGIN value-header ***/ +GType @enum_name@_get_type (void) G_GNUC_CONST; +#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) +/*** END value-header ***/ + +/*** BEGIN file-tail ***/ +G_END_DECLS + +#endif /* __GIO_ENUM_TYPES_H__ */ +/*** END file-tail ***/ diff --git a/gio/gioerror.c b/gio/gioerror.c new file mode 100644 index 0000000..287cb2b --- /dev/null +++ b/gio/gioerror.c @@ -0,0 +1,210 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include +#include "gioerror.h" + +#include "gioalias.h" + +/** + * SECTION:gioerror + * @short_description: Error helper functions + * @include: gio/gio.h + * + * Contains helper functions for reporting errors to the user. + **/ + +/** + * g_io_error_quark: + * + * Gets the GIO Error Quark. + * + * Return value: a #GQuark. + **/ +GQuark +g_io_error_quark (void) +{ + return g_quark_from_static_string ("g-io-error-quark"); +} + +/** + * g_io_error_from_errno: + * @err_no: Error number as defined in errno.h. + * + * Converts errno.h error codes into GIO error codes. + * + * Returns: #GIOErrorEnum value for the given errno.h error number. + **/ +GIOErrorEnum +g_io_error_from_errno (gint err_no) +{ + switch (err_no) + { +#ifdef EEXIST + case EEXIST: + return G_IO_ERROR_EXISTS; + break; +#endif + +#ifdef EISDIR + case EISDIR: + return G_IO_ERROR_IS_DIRECTORY; + break; +#endif + +#ifdef EACCES + case EACCES: + return G_IO_ERROR_PERMISSION_DENIED; + break; +#endif + +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + return G_IO_ERROR_FILENAME_TOO_LONG; + break; +#endif + +#ifdef ENOENT + case ENOENT: + return G_IO_ERROR_NOT_FOUND; + break; +#endif + +#ifdef ENOTDIR + case ENOTDIR: + return G_IO_ERROR_NOT_DIRECTORY; + break; +#endif + +#ifdef EROFS + case EROFS: + return G_IO_ERROR_READ_ONLY; + break; +#endif + +#ifdef ELOOP + case ELOOP: + return G_IO_ERROR_TOO_MANY_LINKS; + break; +#endif + +#ifdef ENOSPC + case ENOSPC: + return G_IO_ERROR_NO_SPACE; + break; +#endif + +#ifdef ENOMEM + case ENOMEM: + return G_IO_ERROR_NO_SPACE; + break; +#endif + +#ifdef EINVAL + case EINVAL: + return G_IO_ERROR_INVALID_ARGUMENT; + break; +#endif + +#ifdef EPERM + case EPERM: + return G_IO_ERROR_PERMISSION_DENIED; + break; +#endif + +#ifdef ECANCELED + case ECANCELED: + return G_IO_ERROR_CANCELLED; + break; +#endif + +#if defined(ENOTEMPTY) && (!defined (EEXIST) || (ENOTEMPTY != EEXIST)) + case ENOTEMPTY: + return G_IO_ERROR_NOT_EMPTY; + break; +#endif + +#ifdef ENOTSUP + case ENOTSUP: + return G_IO_ERROR_NOT_SUPPORTED; + break; +#endif + +#ifdef ETIMEDOUT + case ETIMEDOUT: + return G_IO_ERROR_TIMED_OUT; + break; +#endif + +#ifdef EBUSY + case EBUSY: + return G_IO_ERROR_BUSY; + break; +#endif + +/* some magic to deal with EWOULDBLOCK and EAGAIN. + * apparently on HP-UX these are actually defined to different values, + * but on Linux, for example, they are the same. + */ +#if defined(EWOULDBLOCK) && defined(EAGAIN) && EWOULDBLOCK == EAGAIN + /* we have both and they are the same: only emit one case. */ + case EAGAIN: + return G_IO_ERROR_WOULD_BLOCK; + break; +#else + /* else: consider each of them separately. this handles both the + * case of having only one and the case where they are different values. + */ +# ifdef EAGAIN + case EAGAIN: + return G_IO_ERROR_WOULD_BLOCK; + break; +# endif + +# ifdef EWOULDBLOCK + case EWOULDBLOCK: + return G_IO_ERROR_WOULD_BLOCK; + break; +# endif +#endif + +#ifdef EMFILE + case EMFILE: + return G_IO_ERROR_TOO_MANY_OPEN_FILES; + break; +#endif + +#ifdef EADDRINUSE + case EADDRINUSE: + return G_IO_ERROR_ADDRESS_IN_USE; + break; +#endif + + default: + return G_IO_ERROR_FAILED; + break; + } +} + +#define __G_IO_ERROR_C__ +#include "gioaliasdef.c" diff --git a/gio/gioerror.h b/gio/gioerror.h new file mode 100644 index 0000000..c1dc377 --- /dev/null +++ b/gio/gioerror.h @@ -0,0 +1,48 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_IO_ERROR_H__ +#define __G_IO_ERROR_H__ + +#include +#include + +G_BEGIN_DECLS + +/** + * G_IO_ERROR: + * + * Error domain for GIO. Errors in this domain will be from the #GIOErrorEnum enumeration. + * See #GError for more information on error domains. + **/ +#define G_IO_ERROR g_io_error_quark() + +GQuark g_io_error_quark (void); +GIOErrorEnum g_io_error_from_errno (gint err_no); + +G_END_DECLS + +#endif /* __G_IO_ERROR_H__ */ diff --git a/gio/giomodule-priv.h b/gio/giomodule-priv.h new file mode 100644 index 0000000..a4677b0 --- /dev/null +++ b/gio/giomodule-priv.h @@ -0,0 +1,35 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_IO_MODULE_PRIV_H__ +#define __G_IO_MODULE_PRIV_H__ + +#include "giomodule.h" + +G_BEGIN_DECLS + +void _g_io_modules_ensure_extension_points_registered (void); +void _g_io_modules_ensure_loaded (void); + +G_END_DECLS + +#endif /* __G_IO_MODULE_PRIV_H__ */ diff --git a/gio/giomodule.c b/gio/giomodule.c new file mode 100644 index 0000000..1f2e0bc --- /dev/null +++ b/gio/giomodule.c @@ -0,0 +1,897 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "giomodule.h" +#include "giomodule-priv.h" +#include "glocalfilemonitor.h" +#include "glocaldirectorymonitor.h" +#include "gnativevolumemonitor.h" +#include "gvfs.h" +#ifdef G_OS_UNIX +#include "gdesktopappinfo.h" +#endif +#include "gioalias.h" +#include + +/** + * SECTION:giomodule + * @short_description: Loadable GIO Modules + * @include: gio/gio.h + * + * Provides an interface and default functions for loading and unloading + * modules. This is used internally to make GIO extensible, but can also + * be used by others to implement module loading. + * + **/ + +/** + * SECTION:extensionpoints + * @short_description: Extension Points + * @include: gio.h + * @see_also: Extending GIO + * + * #GIOExtensionPoint provides a mechanism for modules to extend the + * functionality of the library or application that loaded it in an + * organized fashion. + * + * An extension point is identified by a name, and it may optionally + * require that any implementation must by of a certain type (or derived + * thereof). Use g_io_extension_point_register() to register an + * extension point, and g_io_extension_point_set_required_type() to + * set a required type. + * + * A module can implement an extension point by specifying the #GType + * that implements the functionality. Additionally, each implementation + * of an extension point has a name, and a priority. Use + * g_io_extension_point_implement() to implement an extension point. + * + * |[ + * GIOExtensionPoint *ep; + * + * /* Register an extension point */ + * ep = g_io_extension_point_register ("my-extension-point"); + * g_io_extension_point_set_required_type (ep, MY_TYPE_EXAMPLE); + * ]| + * + * |[ + * /* Implement an extension point */ + * G_DEFINE_TYPE (MyExampleImpl, my_example_impl, MY_TYPE_EXAMPLE); + * g_io_extension_point_implement ("my-extension-point", + * my_example_impl_get_type (), + * "my-example", + * 10); + * ]| + * + * It is up to the code that registered the extension point how + * it uses the implementations that have been associated with it. + * Depending on the use case, it may use all implementations, or + * only the one with the highest priority, or pick a specific + * one by name. + */ +struct _GIOModule { + GTypeModule parent_instance; + + gchar *filename; + GModule *library; + gboolean initialized; /* The module was loaded at least once */ + + void (* load) (GIOModule *module); + void (* unload) (GIOModule *module); +}; + +struct _GIOModuleClass +{ + GTypeModuleClass parent_class; + +}; + +static void g_io_module_finalize (GObject *object); +static gboolean g_io_module_load_module (GTypeModule *gmodule); +static void g_io_module_unload_module (GTypeModule *gmodule); + +struct _GIOExtension { + char *name; + GType type; + gint priority; +}; + +struct _GIOExtensionPoint { + GType required_type; + char *name; + GList *extensions; + GList *lazy_load_modules; +}; + +static GHashTable *extension_points = NULL; +G_LOCK_DEFINE_STATIC(extension_points); + +G_DEFINE_TYPE (GIOModule, g_io_module, G_TYPE_TYPE_MODULE); + +static void +g_io_module_class_init (GIOModuleClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GTypeModuleClass *type_module_class = G_TYPE_MODULE_CLASS (class); + + object_class->finalize = g_io_module_finalize; + + type_module_class->load = g_io_module_load_module; + type_module_class->unload = g_io_module_unload_module; +} + +static void +g_io_module_init (GIOModule *module) +{ +} + +static void +g_io_module_finalize (GObject *object) +{ + GIOModule *module = G_IO_MODULE (object); + + g_free (module->filename); + + G_OBJECT_CLASS (g_io_module_parent_class)->finalize (object); +} + +static gboolean +g_io_module_load_module (GTypeModule *gmodule) +{ + GIOModule *module = G_IO_MODULE (gmodule); + + if (!module->filename) + { + g_warning ("GIOModule path not set"); + return FALSE; + } + + module->library = g_module_open (module->filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); + + if (!module->library) + { + g_printerr ("%s\n", g_module_error ()); + return FALSE; + } + + /* Make sure that the loaded library contains the required methods */ + if (! g_module_symbol (module->library, + "g_io_module_load", + (gpointer) &module->load) || + ! g_module_symbol (module->library, + "g_io_module_unload", + (gpointer) &module->unload)) + { + g_printerr ("%s\n", g_module_error ()); + g_module_close (module->library); + + return FALSE; + } + + /* Initialize the loaded module */ + module->load (module); + module->initialized = TRUE; + + return TRUE; +} + +static void +g_io_module_unload_module (GTypeModule *gmodule) +{ + GIOModule *module = G_IO_MODULE (gmodule); + + module->unload (module); + + g_module_close (module->library); + module->library = NULL; + + module->load = NULL; + module->unload = NULL; +} + +/** + * g_io_module_new: + * @filename: filename of the shared library module. + * + * Creates a new GIOModule that will load the specific + * shared library when in use. + * + * Returns: a #GIOModule from given @filename, + * or %NULL on error. + **/ +GIOModule * +g_io_module_new (const gchar *filename) +{ + GIOModule *module; + + g_return_val_if_fail (filename != NULL, NULL); + + module = g_object_new (G_IO_TYPE_MODULE, NULL); + module->filename = g_strdup (filename); + + return module; +} + +static gboolean +is_valid_module_name (const gchar *basename) +{ +#if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) + return + g_str_has_prefix (basename, "lib") && + g_str_has_suffix (basename, ".so"); +#else + return g_str_has_suffix (basename, ".dll"); +#endif +} + +/** + * g_io_modules_scan_all_in_directory: + * @dirname: pathname for a directory containing modules to scan. + * + * Scans all the modules in the specified directory, ensuring that + * any extension point implemented by a module is registered. + * + * This may not actually load and initialize all the types in each + * module, some modules may be lazily loaded and initialized when + * an extension point it implementes is used with e.g. + * g_io_extension_point_get_extensions() or + * g_io_extension_point_get_extension_by_name(). + * + * If you need to guarantee that all types are loaded in all the modules, + * use g_io_modules_scan_all_in_directory(). + * + * Since: 2.24 + **/ +void +g_io_modules_scan_all_in_directory (const char *dirname) +{ + const gchar *name; + char *filename; + GDir *dir; +#ifdef G_OS_WIN32 + struct _g_stat_struct statbuf; +#else + struct stat statbuf; +#endif + char *data; + time_t cache_mtime; + GHashTable *cache; + + if (!g_module_supported ()) + return; + + dir = g_dir_open (dirname, 0, NULL); + if (!dir) + return; + + filename = g_build_filename (dirname, "giomodule.cache", NULL); + + cache = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify)g_strfreev); + + cache_mtime = 0; + if (g_stat (filename, &statbuf) == 0 && + g_file_get_contents (filename, &data, NULL, NULL)) + { + char **lines; + int i; + + /* Cache mtime is the time the cache file was created, any file + * that has a ctime before this was created then and not modified + * since then (userspace can't change ctime). Its possible to change + * the ctime forward without changing the file content, by e.g. + * chmoding the file, but this is uncommon and will only cause us + * to not use the cache so will not cause bugs. + */ + cache_mtime = statbuf.st_mtime; + + lines = g_strsplit (data, "\n", -1); + g_free (data); + + for (i = 0; lines[i] != NULL; i++) + { + char *line = lines[i]; + char *file; + char *colon; + char **extension_points; + + if (line[0] == '#') + continue; + + colon = strchr (line, ':'); + if (colon == NULL || line == colon) + continue; /* Invalid line, ignore */ + + *colon = 0; /* terminate filename */ + file = g_strdup (line); + colon++; /* after colon */ + + while (g_ascii_isspace (*colon)) + colon++; + + extension_points = g_strsplit (colon, ",", -1); + g_hash_table_insert (cache, file, extension_points); + } + g_strfreev (lines); + } + + while ((name = g_dir_read_name (dir))) + { + if (is_valid_module_name (name)) + { + GIOExtensionPoint *extension_point; + GIOModule *module; + gchar *path; + char **extension_points; + int i; + + path = g_build_filename (dirname, name, NULL); + module = g_io_module_new (path); + + extension_points = g_hash_table_lookup (cache, name); + if (extension_points != NULL && + g_stat (path, &statbuf) == 0 && + statbuf.st_ctime <= cache_mtime) + { + /* Lazy load/init the library when first required */ + for (i = 0; extension_points[i] != NULL; i++) + { + extension_point = + g_io_extension_point_register (extension_points[i]); + extension_point->lazy_load_modules = + g_list_prepend (extension_point->lazy_load_modules, + module); + } + } + else + { + /* Try to load and init types */ + if (g_type_module_use (G_TYPE_MODULE (module))) + g_type_module_unuse (G_TYPE_MODULE (module)); /* Unload */ + else + { /* Failure to load */ + g_printerr ("Failed to load module: %s\n", path); + g_object_unref (module); + g_free (path); + continue; + } + } + + g_free (path); + } + } + + g_dir_close (dir); + + g_hash_table_destroy (cache); + + g_free (filename); +} + + +/** + * g_io_modules_load_all_in_directory: + * @dirname: pathname for a directory containing modules to load. + * + * Loads all the modules in the specified directory. + * + * If don't require all modules to be initialized (and thus registering + * all gtypes) then you can use g_io_modules_scan_all_in_directory() + * which allows delayed/lazy loading of modules. + * + * Returns: a list of #GIOModules loaded from the directory, + * All the modules are loaded into memory, if you want to + * unload them (enabling on-demand loading) you must call + * g_type_module_unuse() on all the modules. Free the list + * with g_list_free(). + **/ +GList * +g_io_modules_load_all_in_directory (const char *dirname) +{ + const gchar *name; + GDir *dir; + GList *modules; + + if (!g_module_supported ()) + return NULL; + + dir = g_dir_open (dirname, 0, NULL); + if (!dir) + return NULL; + + modules = NULL; + while ((name = g_dir_read_name (dir))) + { + if (is_valid_module_name (name)) + { + GIOModule *module; + gchar *path; + + path = g_build_filename (dirname, name, NULL); + module = g_io_module_new (path); + + if (!g_type_module_use (G_TYPE_MODULE (module))) + { + g_printerr ("Failed to load module: %s\n", path); + g_object_unref (module); + g_free (path); + continue; + } + + g_free (path); + + modules = g_list_prepend (modules, module); + } + } + + g_dir_close (dir); + + return modules; +} + +G_LOCK_DEFINE_STATIC (registered_extensions); +G_LOCK_DEFINE_STATIC (loaded_dirs); + +extern GType _g_fen_directory_monitor_get_type (void); +extern GType _g_fen_file_monitor_get_type (void); +extern GType _g_inotify_directory_monitor_get_type (void); +extern GType _g_inotify_file_monitor_get_type (void); +extern GType _g_unix_volume_monitor_get_type (void); +extern GType _g_local_vfs_get_type (void); + +extern GType _g_win32_volume_monitor_get_type (void); +extern GType g_win32_directory_monitor_get_type (void); +extern GType _g_winhttp_vfs_get_type (void); + +#ifdef G_PLATFORM_WIN32 + +#include + +static HMODULE gio_dll = NULL; + +#ifdef DLL_EXPORT + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + gio_dll = hinstDLL; + + return TRUE; +} + +#endif + +#undef GIO_MODULE_DIR + +/* GIO_MODULE_DIR is used only in code called just once, + * so no problem leaking this + */ +#define GIO_MODULE_DIR \ + g_build_filename (g_win32_get_package_installation_directory_of_module (gio_dll), \ + "lib/gio/modules", \ + NULL) + +#endif + +void +_g_io_modules_ensure_extension_points_registered (void) +{ + static gboolean registered_extensions = FALSE; + GIOExtensionPoint *ep; + + G_LOCK (registered_extensions); + + if (!registered_extensions) + { + registered_extensions = TRUE; + +#ifdef G_OS_UNIX + ep = g_io_extension_point_register (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_DESKTOP_APP_INFO_LOOKUP); +#endif + + ep = g_io_extension_point_register (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_LOCAL_DIRECTORY_MONITOR); + + ep = g_io_extension_point_register (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_LOCAL_FILE_MONITOR); + + ep = g_io_extension_point_register (G_VOLUME_MONITOR_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_VOLUME_MONITOR); + + ep = g_io_extension_point_register (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_NATIVE_VOLUME_MONITOR); + + ep = g_io_extension_point_register (G_VFS_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_VFS); + + ep = g_io_extension_point_register ("gsettings-backend"); + g_io_extension_point_set_required_type (ep, G_TYPE_OBJECT); + } + + G_UNLOCK (registered_extensions); + } + +void +_g_io_modules_ensure_loaded (void) +{ + static gboolean loaded_dirs = FALSE; + const char *module_path; + + _g_io_modules_ensure_extension_points_registered (); + + G_LOCK (loaded_dirs); + + if (!loaded_dirs) + { + loaded_dirs = TRUE; + + g_io_modules_scan_all_in_directory (GIO_MODULE_DIR); + + module_path = g_getenv ("GIO_EXTRA_MODULES"); + + if (module_path) + { + gchar **paths; + int i; + + paths = g_strsplit (module_path, ":", 0); + + for (i = 0; paths[i] != NULL; i++) + g_io_modules_scan_all_in_directory (paths[i]); + + g_strfreev (paths); + } + + /* Initialize types from built-in "modules" */ +#if defined(HAVE_SYS_INOTIFY_H) || defined(HAVE_LINUX_INOTIFY_H) + _g_inotify_directory_monitor_get_type (); + _g_inotify_file_monitor_get_type (); +#endif +#if defined(HAVE_FEN) + _g_fen_directory_monitor_get_type (); + _g_fen_file_monitor_get_type (); +#endif +#ifdef G_OS_WIN32 + _g_win32_volume_monitor_get_type (); + g_win32_directory_monitor_get_type (); +#endif +#ifdef G_OS_UNIX + _g_unix_volume_monitor_get_type (); +#endif +#ifdef G_OS_WIN32 + _g_winhttp_vfs_get_type (); +#endif + _g_local_vfs_get_type (); + } + + G_UNLOCK (loaded_dirs); +} + +static void +g_io_extension_point_free (GIOExtensionPoint *ep) +{ + g_free (ep->name); + g_free (ep); +} + +/** + * g_io_extension_point_register: + * @name: The name of the extension point + * + * Registers an extension point. + * + * Returns: the new #GIOExtensionPoint. This object is owned by GIO + * and should not be freed + */ +GIOExtensionPoint * +g_io_extension_point_register (const char *name) +{ + GIOExtensionPoint *ep; + + G_LOCK (extension_points); + if (extension_points == NULL) + extension_points = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify)g_io_extension_point_free); + + ep = g_hash_table_lookup (extension_points, name); + if (ep != NULL) + { + G_UNLOCK (extension_points); + return ep; + } + + ep = g_new0 (GIOExtensionPoint, 1); + ep->name = g_strdup (name); + + g_hash_table_insert (extension_points, ep->name, ep); + + G_UNLOCK (extension_points); + + return ep; +} + +/** + * g_io_extension_point_lookup: + * @name: the name of the extension point + * + * Looks up an existing extension point. + * + * Returns: the #GIOExtensionPoint, or %NULL if there is no + * registered extension point with the given name + */ +GIOExtensionPoint * +g_io_extension_point_lookup (const char *name) +{ + GIOExtensionPoint *ep; + + G_LOCK (extension_points); + ep = NULL; + if (extension_points != NULL) + ep = g_hash_table_lookup (extension_points, name); + + G_UNLOCK (extension_points); + + return ep; + +} + +/** + * g_io_extension_point_set_required_type: + * @extension_point: a #GIOExtensionPoint + * @type: the #GType to require + * + * Sets the required type for @extension_point to @type. + * All implementations must henceforth have this type. + */ +void +g_io_extension_point_set_required_type (GIOExtensionPoint *extension_point, + GType type) +{ + extension_point->required_type = type; +} + +/** + * g_io_extension_point_get_required_type: + * @extension_point: a #GIOExtensionPoint + * + * Gets the required type for @extension_point. + * + * Returns: the #GType that all implementations must have, + * or #G_TYPE_INVALID if the extension point has no required type + */ +GType +g_io_extension_point_get_required_type (GIOExtensionPoint *extension_point) +{ + return extension_point->required_type; +} + +void +lazy_load_modules (GIOExtensionPoint *extension_point) +{ + GIOModule *module; + GList *l; + + for (l = extension_point->lazy_load_modules; l != NULL; l = l->next) + { + module = l->data; + + if (!module->initialized) + { + if (g_type_module_use (G_TYPE_MODULE (module))) + g_type_module_unuse (G_TYPE_MODULE (module)); /* Unload */ + else + g_printerr ("Failed to load module: %s\n", + module->filename); + } + } +} + +/** + * g_io_extension_point_get_extensions: + * @extension_point: a #GIOExtensionPoint + * + * Gets a list of all extensions that implement this extension point. + * The list is sorted by priority, beginning with the highest priority. + * + * Returns: a #GList of #GIOExtensions. The list is owned by + * GIO and should not be modified + */ +GList * +g_io_extension_point_get_extensions (GIOExtensionPoint *extension_point) +{ + lazy_load_modules (extension_point); + return extension_point->extensions; +} + +/** + * g_io_extension_point_get_extension_by_name: + * @extension_point: a #GIOExtensionPoint + * @name: the name of the extension to get + * + * Finds a #GIOExtension for an extension point by name. + * + * Returns: the #GIOExtension for @extension_point that has the + * given name, or %NULL if there is no extension with that name + */ +GIOExtension * +g_io_extension_point_get_extension_by_name (GIOExtensionPoint *extension_point, + const char *name) +{ + GList *l; + + lazy_load_modules (extension_point); + for (l = extension_point->extensions; l != NULL; l = l->next) + { + GIOExtension *e = l->data; + + if (e->name != NULL && + strcmp (e->name, name) == 0) + return e; + } + + return NULL; +} + +static gint +extension_prio_compare (gconstpointer a, + gconstpointer b) +{ + const GIOExtension *extension_a = a, *extension_b = b; + + return extension_b->priority - extension_a->priority; +} + +/** + * g_io_extension_point_implement: + * @extension_point_name: the name of the extension point + * @type: the #GType to register as extension + * @extension_name: the name for the extension + * @priority: the priority for the extension + * + * Registers @type as extension for the extension point with name + * @extension_point_name. + * + * If @type has already been registered as an extension for this + * extension point, the existing #GIOExtension object is returned. + * + * Returns: a #GIOExtension object for #GType + */ +GIOExtension * +g_io_extension_point_implement (const char *extension_point_name, + GType type, + const char *extension_name, + gint priority) +{ + GIOExtensionPoint *extension_point; + GIOExtension *extension; + GList *l; + + g_return_val_if_fail (extension_point_name != NULL, NULL); + + extension_point = g_io_extension_point_lookup (extension_point_name); + if (extension_point == NULL) + { + g_warning ("Tried to implement non-registered extension point %s", extension_point_name); + return NULL; + } + + if (extension_point->required_type != 0 && + !g_type_is_a (type, extension_point->required_type)) + { + g_warning ("Tried to register an extension of the type %s to extension point %s. " + "Expected type is %s.", + g_type_name (type), + extension_point_name, + g_type_name (extension_point->required_type)); + return NULL; + } + + /* It's safe to register the same type multiple times */ + for (l = extension_point->extensions; l != NULL; l = l->next) + { + extension = l->data; + if (extension->type == type) + return extension; + } + + extension = g_slice_new0 (GIOExtension); + extension->type = type; + extension->name = g_strdup (extension_name); + extension->priority = priority; + + extension_point->extensions = g_list_insert_sorted (extension_point->extensions, + extension, extension_prio_compare); + + return extension; +} + +/** + * g_io_extension_ref_class: + * @extension: a #GIOExtension + * + * Gets a reference to the class for the type that is + * associated with @extension. + * + * Returns: the #GTypeClass for the type of @extension + */ +GTypeClass * +g_io_extension_ref_class (GIOExtension *extension) +{ + return g_type_class_ref (extension->type); +} + +/** + * g_io_extension_get_type: + * @extension: a #GIOExtension + * + * Gets the type associated with @extension. + * + * Returns: the type of @extension + */ +GType +g_io_extension_get_type (GIOExtension *extension) +{ + return extension->type; +} + +/** + * g_io_extension_get_name: + * @extension: a #GIOExtension + * + * Gets the name under which @extension was registered. + * + * Note that the same type may be registered as extension + * for multiple extension points, under different names. + * + * Returns: the name of @extension. + */ +const char * +g_io_extension_get_name (GIOExtension *extension) +{ + return extension->name; +} + +/** + * g_io_extension_get_priority: + * @extension: a #GIOExtension + * + * Gets the priority with which @extension was registered. + * + * Returns: the priority of @extension + */ +gint +g_io_extension_get_priority (GIOExtension *extension) +{ + return extension->priority; +} + +#define __G_IO_MODULE_C__ +#include "gioaliasdef.c" diff --git a/gio/giomodule.h b/gio/giomodule.h new file mode 100644 index 0000000..035059a --- /dev/null +++ b/gio/giomodule.h @@ -0,0 +1,132 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_IO_MODULE_H__ +#define __G_IO_MODULE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_IO_TYPE_MODULE (g_io_module_get_type ()) +#define G_IO_MODULE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_IO_TYPE_MODULE, GIOModule)) +#define G_IO_MODULE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_IO_TYPE_MODULE, GIOModuleClass)) +#define G_IO_IS_MODULE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_IO_TYPE_MODULE)) +#define G_IO_IS_MODULE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_IO_TYPE_MODULE)) +#define G_IO_MODULE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_IO_TYPE_MODULE, GIOModuleClass)) + +/** + * GIOModule: + * + * Opaque module base class for extending GIO. + **/ +typedef struct _GIOModuleClass GIOModuleClass; + +GType g_io_module_get_type (void) G_GNUC_CONST; +GIOModule *g_io_module_new (const gchar *filename); + +void g_io_modules_scan_all_in_directory (const char *dirname); +GList *g_io_modules_load_all_in_directory (const gchar *dirname); + +GIOExtensionPoint *g_io_extension_point_register (const char *name); +GIOExtensionPoint *g_io_extension_point_lookup (const char *name); +void g_io_extension_point_set_required_type (GIOExtensionPoint *extension_point, + GType type); +GType g_io_extension_point_get_required_type (GIOExtensionPoint *extension_point); +GList *g_io_extension_point_get_extensions (GIOExtensionPoint *extension_point); +GIOExtension * g_io_extension_point_get_extension_by_name (GIOExtensionPoint *extension_point, + const char *name); +GIOExtension * g_io_extension_point_implement (const char *extension_point_name, + GType type, + const char *extension_name, + gint priority); + +GType g_io_extension_get_type (GIOExtension *extension); +const char * g_io_extension_get_name (GIOExtension *extension); +gint g_io_extension_get_priority (GIOExtension *extension); +GTypeClass* g_io_extension_ref_class (GIOExtension *extension); + + +/* API for the modules to implement */ + +/** + * g_io_module_load: + * @module: a #GIOModule. + * + * Required API for GIO modules to implement. + * This function is ran after the module has been loaded into GIO, + * to initialize the module. + **/ +void g_io_module_load (GIOModule *module); + +/** + * g_io_module_unload: + * @module: a #GIOModule. + * + * Required API for GIO modules to implement. + * This function is ran when the module is being unloaded from GIO, + * to finalize the module. + **/ +void g_io_module_unload (GIOModule *module); + +/** + * g_io_module_query: + * + * Optional API for GIO modules to implement. + * + * Should return a list of all the extension points that may be + * implemented in this module. + * + * This method will not be called in normal use, however it may be + * called when probing existing modules and recording which extension + * points that this modle is used for. This means we won't have to + * load and initialze this module unless its needed. + * + * If this function is not implemented by the module the module will + * always be loaded, initialized and then unloaded on application startup + * so that it can register its extension points during init. + * + * Note that a module need not actually implement all the extension points + * that g_io_module_query returns, since the exact list of extension may + * depend on runtime issues. However all extension points actually implemented + * must be returned by g_io_module_query() (if defined). + * + * When installing a module that implements g_io_module_query you must + * run gio-querymodules in order to build the cache files required for + * lazy loading. + * + * Returns: A %NULL-terminated array of strings, listing the supported + * extension points of the module. The array must be suitable for + * freeing with g_strfreev(). + * + * Since: 2.24 + **/ +char **g_io_module_query (void); + +G_END_DECLS + +#endif /* __G_IO_MODULE_H__ */ diff --git a/gio/gioscheduler.c b/gio/gioscheduler.c new file mode 100644 index 0000000..1787266 --- /dev/null +++ b/gio/gioscheduler.c @@ -0,0 +1,466 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include "gioscheduler.h" +#include "gcancellable.h" + +#include "gioalias.h" + +/** + * SECTION:gioscheduler + * @short_description: I/O Scheduler + * @include: gio/gio.h + * + * Schedules asynchronous I/O operations. #GIOScheduler integrates + * into the main event loop (#GMainLoop) and may use threads if they + * are available. + * + * I/O priority + * Each I/O operation has a priority, and the scheduler uses the priorities + * to determine the order in which operations are executed. They are + * not used to determine system-wide I/O scheduling. + * Priorities are integers, with lower numbers indicating higher priority. + * It is recommended to choose priorities between %G_PRIORITY_LOW and + * %G_PRIORITY_HIGH, with %G_PRIORITY_DEFAULT as a default. + * + **/ + +struct _GIOSchedulerJob { + GSList *active_link; + GIOSchedulerJobFunc job_func; + GSourceFunc cancel_func; /* Runs under job map lock */ + gpointer data; + GDestroyNotify destroy_notify; + + gint io_priority; + GCancellable *cancellable; + GMainContext *context; + + guint idle_tag; +}; + +G_LOCK_DEFINE_STATIC(active_jobs); +static GSList *active_jobs = NULL; + +static GThreadPool *job_thread_pool = NULL; + +static void io_job_thread (gpointer data, + gpointer user_data); + +static void +g_io_job_free (GIOSchedulerJob *job) +{ + if (job->cancellable) + g_object_unref (job->cancellable); + if (job->context) + g_main_context_unref (job->context); + g_free (job); +} + +static gint +g_io_job_compare (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const GIOSchedulerJob *aa = a; + const GIOSchedulerJob *bb = b; + + /* Cancelled jobs are set prio == -1, so that + they are executed as quickly as possible */ + + /* Lower value => higher priority */ + if (aa->io_priority < bb->io_priority) + return -1; + if (aa->io_priority == bb->io_priority) + return 0; + return 1; +} + +static gpointer +init_scheduler (gpointer arg) +{ + if (job_thread_pool == NULL) + { + /* TODO: thread_pool_new can fail */ + job_thread_pool = g_thread_pool_new (io_job_thread, + NULL, + 10, + FALSE, + NULL); + if (job_thread_pool != NULL) + { + g_thread_pool_set_sort_function (job_thread_pool, + g_io_job_compare, + NULL); + /* It's kinda weird that this is a global setting + * instead of per threadpool. However, we really + * want to cache some threads, but not keep around + * those threads forever. */ + g_thread_pool_set_max_idle_time (15 * 1000); + g_thread_pool_set_max_unused_threads (2); + } + } + return NULL; +} + +static void +remove_active_job (GIOSchedulerJob *job) +{ + GIOSchedulerJob *other_job; + GSList *l; + gboolean resort_jobs; + + G_LOCK (active_jobs); + active_jobs = g_slist_delete_link (active_jobs, job->active_link); + + resort_jobs = FALSE; + for (l = active_jobs; l != NULL; l = l->next) + { + other_job = l->data; + if (other_job->io_priority >= 0 && + g_cancellable_is_cancelled (other_job->cancellable)) + { + other_job->io_priority = -1; + resort_jobs = TRUE; + } + } + G_UNLOCK (active_jobs); + + if (resort_jobs && + job_thread_pool != NULL) + g_thread_pool_set_sort_function (job_thread_pool, + g_io_job_compare, + NULL); + +} + +static void +job_destroy (gpointer data) +{ + GIOSchedulerJob *job = data; + + if (job->destroy_notify) + job->destroy_notify (job->data); + + remove_active_job (job); + g_io_job_free (job); +} + +static void +io_job_thread (gpointer data, + gpointer user_data) +{ + GIOSchedulerJob *job = data; + gboolean result; + + if (job->cancellable) + g_cancellable_push_current (job->cancellable); + + do + { + result = job->job_func (job, job->cancellable, job->data); + } + while (result); + + if (job->cancellable) + g_cancellable_pop_current (job->cancellable); + + job_destroy (job); +} + +static gboolean +run_job_at_idle (gpointer data) +{ + GIOSchedulerJob *job = data; + gboolean result; + + if (job->cancellable) + g_cancellable_push_current (job->cancellable); + + result = job->job_func (job, job->cancellable, job->data); + + if (job->cancellable) + g_cancellable_pop_current (job->cancellable); + + return result; +} + +/** + * g_io_scheduler_push_job: + * @job_func: a #GIOSchedulerJobFunc. + * @user_data: data to pass to @job_func + * @notify: a #GDestroyNotify for @user_data, or %NULL + * @io_priority: the I/O priority + * of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * + * Schedules the I/O job to run. + * + * @notify will be called on @user_data after @job_func has returned, + * regardless whether the job was cancelled or has run to completion. + * + * If @cancellable is not %NULL, it can be used to cancel the I/O job + * by calling g_cancellable_cancel() or by calling + * g_io_scheduler_cancel_all_jobs(). + **/ +void +g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, + gpointer user_data, + GDestroyNotify notify, + gint io_priority, + GCancellable *cancellable) +{ + static GOnce once_init = G_ONCE_INIT; + GIOSchedulerJob *job; + + g_return_if_fail (job_func != NULL); + + job = g_new0 (GIOSchedulerJob, 1); + job->job_func = job_func; + job->data = user_data; + job->destroy_notify = notify; + job->io_priority = io_priority; + + if (cancellable) + job->cancellable = g_object_ref (cancellable); + + job->context = g_main_context_get_thread_default (); + if (job->context) + g_main_context_ref (job->context); + + G_LOCK (active_jobs); + active_jobs = g_slist_prepend (active_jobs, job); + job->active_link = active_jobs; + G_UNLOCK (active_jobs); + + if (g_thread_supported()) + { + g_once (&once_init, init_scheduler, NULL); + g_thread_pool_push (job_thread_pool, job, NULL); + } + else + { + /* Threads not available, instead do the i/o sync inside a + * low prio idle handler + */ + job->idle_tag = g_idle_add_full (io_priority, + run_job_at_idle, + job, job_destroy); + } +} + +/** + * g_io_scheduler_cancel_all_jobs: + * + * Cancels all cancellable I/O jobs. + * + * A job is cancellable if a #GCancellable was passed into + * g_io_scheduler_push_job(). + **/ +void +g_io_scheduler_cancel_all_jobs (void) +{ + GSList *cancellable_list, *l; + + G_LOCK (active_jobs); + cancellable_list = NULL; + for (l = active_jobs; l != NULL; l = l->next) + { + GIOSchedulerJob *job = l->data; + if (job->cancellable) + cancellable_list = g_slist_prepend (cancellable_list, + g_object_ref (job->cancellable)); + } + G_UNLOCK (active_jobs); + + for (l = cancellable_list; l != NULL; l = l->next) + { + GCancellable *c = l->data; + g_cancellable_cancel (c); + g_object_unref (c); + } + g_slist_free (cancellable_list); +} + +typedef struct { + GSourceFunc func; + gboolean ret_val; + gpointer data; + GDestroyNotify notify; + + GMutex *ack_lock; + GCond *ack_condition; +} MainLoopProxy; + +static gboolean +mainloop_proxy_func (gpointer data) +{ + MainLoopProxy *proxy = data; + + proxy->ret_val = proxy->func (proxy->data); + + if (proxy->notify) + proxy->notify (proxy->data); + + if (proxy->ack_lock) + { + g_mutex_lock (proxy->ack_lock); + g_cond_signal (proxy->ack_condition); + g_mutex_unlock (proxy->ack_lock); + } + + return FALSE; +} + +static void +mainloop_proxy_free (MainLoopProxy *proxy) +{ + if (proxy->ack_lock) + { + g_mutex_free (proxy->ack_lock); + g_cond_free (proxy->ack_condition); + } + + g_free (proxy); +} + +/** + * g_io_scheduler_job_send_to_mainloop: + * @job: a #GIOSchedulerJob + * @func: a #GSourceFunc callback that will be called in the original thread + * @user_data: data to pass to @func + * @notify: a #GDestroyNotify for @user_data, or %NULL + * + * Used from an I/O job to send a callback to be run in the thread + * that the job was started from, waiting for the result (and thus + * blocking the I/O job). + * + * Returns: The return value of @func + **/ +gboolean +g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job, + GSourceFunc func, + gpointer user_data, + GDestroyNotify notify) +{ + GSource *source; + MainLoopProxy *proxy; + gboolean ret_val; + + g_return_val_if_fail (job != NULL, FALSE); + g_return_val_if_fail (func != NULL, FALSE); + + if (job->idle_tag) + { + /* We just immediately re-enter in the case of idles (non-threads) + * Anything else would just deadlock. If you can't handle this, enable threads. + */ + ret_val = func (user_data); + if (notify) + notify (user_data); + return ret_val; + } + + proxy = g_new0 (MainLoopProxy, 1); + proxy->func = func; + proxy->data = user_data; + proxy->notify = notify; + proxy->ack_lock = g_mutex_new (); + proxy->ack_condition = g_cond_new (); + g_mutex_lock (proxy->ack_lock); + + source = g_idle_source_new (); + g_source_set_priority (source, G_PRIORITY_DEFAULT); + g_source_set_callback (source, mainloop_proxy_func, proxy, + NULL); + + g_source_attach (source, job->context); + g_source_unref (source); + + g_cond_wait (proxy->ack_condition, proxy->ack_lock); + g_mutex_unlock (proxy->ack_lock); + + ret_val = proxy->ret_val; + mainloop_proxy_free (proxy); + + return ret_val; +} + +/** + * g_io_scheduler_job_send_to_mainloop_async: + * @job: a #GIOSchedulerJob + * @func: a #GSourceFunc callback that will be called in the original thread + * @user_data: data to pass to @func + * @notify: a #GDestroyNotify for @user_data, or %NULL + * + * Used from an I/O job to send a callback to be run asynchronously in + * the thread that the job was started from. The callback will be run + * when the main loop is available, but at that time the I/O job might + * have finished. The return value from the callback is ignored. + * + * Note that if you are passing the @user_data from g_io_scheduler_push_job() + * on to this function you have to ensure that it is not freed before + * @func is called, either by passing %NULL as @notify to + * g_io_scheduler_push_job() or by using refcounting for @user_data. + **/ +void +g_io_scheduler_job_send_to_mainloop_async (GIOSchedulerJob *job, + GSourceFunc func, + gpointer user_data, + GDestroyNotify notify) +{ + GSource *source; + MainLoopProxy *proxy; + + g_return_if_fail (job != NULL); + g_return_if_fail (func != NULL); + + if (job->idle_tag) + { + /* We just immediately re-enter in the case of idles (non-threads) + * Anything else would just deadlock. If you can't handle this, enable threads. + */ + func (user_data); + if (notify) + notify (user_data); + return; + } + + proxy = g_new0 (MainLoopProxy, 1); + proxy->func = func; + proxy->data = user_data; + proxy->notify = notify; + + source = g_idle_source_new (); + g_source_set_priority (source, G_PRIORITY_DEFAULT); + g_source_set_callback (source, mainloop_proxy_func, proxy, + (GDestroyNotify)mainloop_proxy_free); + + g_source_attach (source, job->context); + g_source_unref (source); +} + + +#define __G_IO_SCHEDULER_C__ +#include "gioaliasdef.c" diff --git a/gio/gioscheduler.h b/gio/gioscheduler.h new file mode 100644 index 0000000..7d6b527 --- /dev/null +++ b/gio/gioscheduler.h @@ -0,0 +1,52 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_IO_SCHEDULER_H__ +#define __G_IO_SCHEDULER_H__ + +#include + +G_BEGIN_DECLS + + +void g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, + gpointer user_data, + GDestroyNotify notify, + gint io_priority, + GCancellable *cancellable); +void g_io_scheduler_cancel_all_jobs (void); +gboolean g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job, + GSourceFunc func, + gpointer user_data, + GDestroyNotify notify); +void g_io_scheduler_job_send_to_mainloop_async (GIOSchedulerJob *job, + GSourceFunc func, + gpointer user_data, + GDestroyNotify notify); + +G_END_DECLS + +#endif /* __G_IO_SCHEDULER_H__ */ diff --git a/gio/giostream.c b/gio/giostream.c new file mode 100644 index 0000000..d785011 --- /dev/null +++ b/gio/giostream.c @@ -0,0 +1,614 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 codethink + * Copyright © 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include "giostream.h" +#include +#include + +#include "gioalias.h" + +G_DEFINE_TYPE (GIOStream, g_io_stream, G_TYPE_OBJECT); + +/** + * SECTION:giostream + * @short_description: Base class for implementing read/write streams + * @include: gio/gio.h + * @see_also: #GInputStream, #GOutputStream + * + * GIOStream represents an object that has both read and write streams. + * Generally the two streams acts as separate input and output streams, + * but they share some common resources and state. For instance, for + * seekable streams they may use the same position in both streams. + * + * Examples of #GIOStream objects are #GSocketConnection which represents + * a two-way network connection, and #GFileIOStream which represent a + * file handle opened in read-write mode. + * + * To do the actual reading and writing you need to get the substreams + * with g_io_stream_get_input_stream() and g_io_stream_get_output_stream(). + * + * The #GIOStream object owns the input and the output streams, not the other + * way around, so keeping the substreams alive will not keep the #GIOStream + * object alive. If the #GIOStream object is freed it will be closed, thus + * closing the substream, so even if the substreams stay alive they will + * always just return a %G_IO_ERROR_CLOSED for all operations. + * + * To close a stream use g_io_stream_close() which will close the common + * stream object and also the individual substreams. You can also close + * the substreams themselves. In most cases this only marks the + * substream as closed, so further I/O on it fails. However, some streams + * may support "half-closed" states where one direction of the stream + * is actually shut down. + * + * Since: 2.22 + */ + +enum +{ + PROP_0, + PROP_INPUT_STREAM, + PROP_OUTPUT_STREAM, + PROP_CLOSED +}; + +struct _GIOStreamPrivate { + guint closed : 1; + guint pending : 1; + GAsyncReadyCallback outstanding_callback; +}; + +static gboolean g_io_stream_real_close (GIOStream *stream, + GCancellable *cancellable, + GError **error); +static void g_io_stream_real_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_io_stream_real_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error); + +static void +g_io_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_io_stream_parent_class)->finalize (object); +} + +static void +g_io_stream_dispose (GObject *object) +{ + GIOStream *stream; + + stream = G_IO_STREAM (object); + + if (!stream->priv->closed) + g_io_stream_close (stream, NULL, NULL); + + G_OBJECT_CLASS (g_io_stream_parent_class)->dispose (object); +} + +static void +g_io_stream_init (GIOStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_IO_STREAM, + GIOStreamPrivate); +} + +static void +g_io_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GIOStream *stream = G_IO_STREAM (object); + + switch (prop_id) + { + case PROP_CLOSED: + g_value_set_boolean (value, stream->priv->closed); + break; + + case PROP_INPUT_STREAM: + g_value_set_object (value, g_io_stream_get_input_stream (stream)); + break; + + case PROP_OUTPUT_STREAM: + g_value_set_object (value, g_io_stream_get_output_stream (stream)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_io_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_io_stream_class_init (GIOStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GIOStreamPrivate)); + + gobject_class->finalize = g_io_stream_finalize; + gobject_class->dispose = g_io_stream_dispose; + gobject_class->set_property = g_io_stream_set_property; + gobject_class->get_property = g_io_stream_get_property; + + klass->close_fn = g_io_stream_real_close; + klass->close_async = g_io_stream_real_close_async; + klass->close_finish = g_io_stream_real_close_finish; + + g_object_class_install_property (gobject_class, PROP_CLOSED, + g_param_spec_boolean ("closed", + P_("Closed"), + P_("Is the stream closed"), + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_INPUT_STREAM, + g_param_spec_object ("input-stream", + P_("Input stream"), + P_("The GInputStream to read from"), + G_TYPE_INPUT_STREAM, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_OUTPUT_STREAM, + g_param_spec_object ("output-stream", + P_("Output stream"), + P_("The GOutputStream to write to"), + G_TYPE_OUTPUT_STREAM, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +/** + * g_io_stream_is_closed: + * @stream: a #GIOStream + * + * Checks if a stream is closed. + * + * Returns: %TRUE if the stream is closed. + * + * Since: 2.22 + */ +gboolean +g_io_stream_is_closed (GIOStream *stream) +{ + g_return_val_if_fail (G_IS_IO_STREAM (stream), TRUE); + + return stream->priv->closed; +} + +/** + * g_io_stream_get_input_stream: + * @stream: a #GIOStream + * + * Gets the input stream for this object. This is used + * for reading. + * + * Returns: a #GInputStream, owned by the #GIOStream. Do not free. + * + * Since: 2.22 + */ +GInputStream * +g_io_stream_get_input_stream (GIOStream *stream) +{ + GIOStreamClass *klass; + + klass = G_IO_STREAM_GET_CLASS (stream); + + g_assert (klass->get_input_stream != NULL); + + return klass->get_input_stream (stream); +} + +/** + * g_io_stream_get_output_stream: + * @stream: a #GIOStream + * + * Gets the output stream for this object. This is used for + * writing. + * + * Returns: a #GOutputStream, owned by the #GIOStream. Do not free. + * + * Since: 2.22 + */ +GOutputStream * +g_io_stream_get_output_stream (GIOStream *stream) +{ + GIOStreamClass *klass; + + klass = G_IO_STREAM_GET_CLASS (stream); + + g_assert (klass->get_output_stream != NULL); + return klass->get_output_stream (stream); +} + +/** + * g_io_stream_has_pending: + * @stream: a #GIOStream + * + * Checks if a stream has pending actions. + * + * Returns: %TRUE if @stream has pending actions. + * + * Since: 2.22 + **/ +gboolean +g_io_stream_has_pending (GIOStream *stream) +{ + g_return_val_if_fail (G_IS_IO_STREAM (stream), FALSE); + + return stream->priv->pending; +} + +/** + * g_io_stream_set_pending: + * @stream: a #GIOStream + * @error: a #GError location to store the error occuring, or %NULL to + * ignore + * + * Sets @stream to have actions pending. If the pending flag is + * already set or @stream is closed, it will return %FALSE and set + * @error. + * + * Return value: %TRUE if pending was previously unset and is now set. + * + * Since: 2.22 + */ +gboolean +g_io_stream_set_pending (GIOStream *stream, + GError **error) +{ + g_return_val_if_fail (G_IS_IO_STREAM (stream), FALSE); + + if (stream->priv->closed) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Stream is already closed")); + return FALSE; + } + + if (stream->priv->pending) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + /* Translators: This is an error you get if there is + * already an operation running against this stream when + * you try to start one */ + _("Stream has outstanding operation")); + return FALSE; + } + + stream->priv->pending = TRUE; + return TRUE; +} + +/** + * g_io_stream_clear_pending: + * @stream: a #GIOStream + * + * Clears the pending flag on @stream. + * + * Since: 2.22 + */ +void +g_io_stream_clear_pending (GIOStream *stream) +{ + g_return_if_fail (G_IS_IO_STREAM (stream)); + + stream->priv->pending = FALSE; +} + +static gboolean +g_io_stream_real_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + gboolean res; + + res = g_output_stream_close (g_io_stream_get_output_stream (stream), + cancellable, error); + + /* If this errored out, unset error so that we don't report + further errors, but still do the following ops */ + if (error != NULL && *error != NULL) + error = NULL; + + res &= g_input_stream_close (g_io_stream_get_input_stream (stream), + cancellable, error); + + return res; +} + +/** + * g_io_stream_close: + * @stream: a #GIOStream + * @cancellable: optional #GCancellable object, %NULL to ignore + * @error: location to store the error occuring, or %NULL to ignore + * + * Closes the stream, releasing resources related to it. This will also + * closes the individual input and output streams, if they are not already + * closed. + * + * Once the stream is closed, all other operations will return + * %G_IO_ERROR_CLOSED. Closing a stream multiple times will not + * return an error. + * + * Closing a stream will automatically flush any outstanding buffers + * in the stream. + * + * Streams will be automatically closed when the last reference + * is dropped, but you might want to call this function to make sure + * resources are released as early as possible. + * + * Some streams might keep the backing store of the stream (e.g. a file + * descriptor) open after the stream is closed. See the documentation for + * the individual stream for details. + * + * On failure the first error that happened will be reported, but the + * close operation will finish as much as possible. A stream that failed + * to close will still return %G_IO_ERROR_CLOSED for all operations. + * Still, it is important to check and report the error to the user, + * otherwise there might be a loss of data as all data might not be written. + * + * If @cancellable is not NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * Cancelling a close will still leave the stream closed, but some streams + * can use a faster close that doesn't block to e.g. check errors. + * + * The default implementation of this method just calls close on the + * individual input/output streams. + * + * Return value: %TRUE on success, %FALSE on failure + * + * Since: 2.22 + */ +gboolean +g_io_stream_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + GIOStreamClass *class; + gboolean res; + + g_return_val_if_fail (G_IS_IO_STREAM (stream), FALSE); + + class = G_IO_STREAM_GET_CLASS (stream); + + if (stream->priv->closed) + return TRUE; + + if (!g_io_stream_set_pending (stream, error)) + return FALSE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = TRUE; + if (class->close_fn) + res = class->close_fn (stream, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + stream->priv->closed = TRUE; + g_io_stream_clear_pending (stream); + + return res; +} + +static void +async_ready_close_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GIOStream *stream = G_IO_STREAM (source_object); + + stream->priv->closed = TRUE; + g_io_stream_clear_pending (stream); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_io_stream_close_async: + * @stream: a #GIOStream + * @io_priority: the io priority of the request + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * @cancellable: optional cancellable object + * + * Requests an asynchronous close of the stream, releasing resources + * related to it. When the operation is finished @callback will be + * called. You can then call g_io_stream_close_finish() to get + * the result of the operation. + * + * For behaviour details see g_io_stream_close(). + * + * The asynchronous methods have a default fallback that uses threads + * to implement asynchronicity, so they are optional for inheriting + * classes. However, if you override one you must override all. + * + * Since: 2.22 + */ +void +g_io_stream_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GIOStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_IO_STREAM (stream)); + + if (stream->priv->closed) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_io_stream_close_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (!g_io_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_IO_STREAM_GET_CLASS (stream); + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->close_async (stream, io_priority, cancellable, + async_ready_close_callback_wrapper, user_data); +} + +/** + * g_io_stream_close_finish: + * @stream: a #GIOStream + * @result: a #GAsyncResult + * @error: a #GError location to store the error occuring, or %NULL to + * ignore + * + * Closes a stream. + * + * Returns: %TRUE if stream was successfully closed, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_io_stream_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GIOStreamClass *class; + + g_return_val_if_fail (G_IS_IO_STREAM (stream), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + /* Special case already closed */ + if (g_simple_async_result_get_source_tag (simple) == g_io_stream_close_async) + return TRUE; + } + + class = G_IO_STREAM_GET_CLASS (stream); + return class->close_finish (stream, result, error); +} + + +static void +close_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GIOStreamClass *class; + GError *error = NULL; + gboolean result; + + /* Auto handling of cancelation disabled, and ignore cancellation, + * since we want to close things anyway, although possibly in a + * quick-n-dirty way. At least we never want to leak open handles + */ + class = G_IO_STREAM_GET_CLASS (object); + if (class->close_fn) + { + result = class->close_fn (G_IO_STREAM (object), cancellable, &error); + if (!result) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + } +} + +static void +g_io_stream_real_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_io_stream_real_close_async); + + g_simple_async_result_set_handle_cancellation (res, FALSE); + + g_simple_async_result_run_in_thread (res, + close_async_thread, + io_priority, + cancellable); + g_object_unref (res); +} + +static gboolean +g_io_stream_real_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_io_stream_real_close_async); + return TRUE; +} + +#define __G_IO_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/giostream.h b/gio/giostream.h new file mode 100644 index 0000000..048fd4f --- /dev/null +++ b/gio/giostream.h @@ -0,0 +1,112 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008, 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc. + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_IO_STREAM_H__ +#define __G_IO_STREAM_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_IO_STREAM (g_io_stream_get_type ()) +#define G_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_IO_STREAM, GIOStream)) +#define G_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_IO_STREAM, GIOStreamClass)) +#define G_IS_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_IO_STREAM)) +#define G_IS_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_IO_STREAM)) +#define G_IO_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_IO_STREAM, GIOStreamClass)) + +typedef struct _GIOStreamPrivate GIOStreamPrivate; +typedef struct _GIOStreamClass GIOStreamClass; + +/** + * GIOStream: + * + * Base class for read-write streams. + **/ +struct _GIOStream +{ + GObject parent_instance; + + /*< private >*/ + GIOStreamPrivate *priv; +}; + +struct _GIOStreamClass +{ + GObjectClass parent_class; + + GInputStream * (*get_input_stream) (GIOStream *stream); + GOutputStream * (*get_output_stream) (GIOStream *stream); + + gboolean (* close_fn) (GIOStream *stream, + GCancellable *cancellable, + GError **error); + void (* close_async) (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* close_finish) (GIOStream *stream, + GAsyncResult *result, + GError **error); + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + void (*_g_reserved7) (void); + void (*_g_reserved8) (void); + void (*_g_reserved9) (void); + void (*_g_reserved10) (void); +}; + +GType g_io_stream_get_type (void) G_GNUC_CONST; + +GInputStream * g_io_stream_get_input_stream (GIOStream *stream); +GOutputStream *g_io_stream_get_output_stream (GIOStream *stream); + +gboolean g_io_stream_close (GIOStream *stream, + GCancellable *cancellable, + GError **error); + +void g_io_stream_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_io_stream_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error); + +gboolean g_io_stream_is_closed (GIOStream *stream); +gboolean g_io_stream_has_pending (GIOStream *stream); +gboolean g_io_stream_set_pending (GIOStream *stream, + GError **error); +void g_io_stream_clear_pending (GIOStream *stream); + +G_END_DECLS + +#endif /* __G_IO_STREAM_H__ */ diff --git a/gio/giotypes.h b/gio/giotypes.h new file mode 100644 index 0000000..2abc87d --- /dev/null +++ b/gio/giotypes.h @@ -0,0 +1,339 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GIO_TYPES_H__ +#define __GIO_TYPES_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GAppLaunchContext GAppLaunchContext; +typedef struct _GAppInfo GAppInfo; /* Dummy typedef */ +typedef struct _GAsyncResult GAsyncResult; /* Dummy typedef */ +typedef struct _GAsyncInitable GAsyncInitable; +typedef struct _GBufferedInputStream GBufferedInputStream; +typedef struct _GBufferedOutputStream GBufferedOutputStream; +typedef struct _GCancellable GCancellable; +typedef struct _GCharsetConverter GCharsetConverter; +typedef struct _GConverter GConverter; +typedef struct _GConverterInputStream GConverterInputStream; +typedef struct _GConverterOutputStream GConverterOutputStream; +typedef struct _GDataInputStream GDataInputStream; +typedef struct _GZlibCompressor GZlibCompressor; +typedef struct _GZlibDecompressor GZlibDecompressor; + +/** + * GDrive: + * + * Opaque drive object. + **/ +typedef struct _GDrive GDrive; /* Dummy typedef */ +typedef struct _GFileEnumerator GFileEnumerator; +typedef struct _GFileMonitor GFileMonitor; +typedef struct _GFilterInputStream GFilterInputStream; +typedef struct _GFilterOutputStream GFilterOutputStream; + +/** + * GFile: + * + * A handle to an object implementing the #GFileIface interface. + * Generally stores a location within the file system. Handles do not + * necessarily represent files or directories that currently exist. + **/ +typedef struct _GFile GFile; /* Dummy typedef */ +typedef struct _GFileInfo GFileInfo; + +/** + * GFileAttributeMatcher: + * + * Determines if a string matches a file attribute. + **/ +typedef struct _GFileAttributeMatcher GFileAttributeMatcher; +typedef struct _GFileAttributeInfo GFileAttributeInfo; +typedef struct _GFileAttributeInfoList GFileAttributeInfoList; +typedef struct _GFileDescriptorBased GFileDescriptorBased; +typedef struct _GFileInputStream GFileInputStream; +typedef struct _GFileOutputStream GFileOutputStream; +typedef struct _GFileIOStream GFileIOStream; +typedef struct _GFileIcon GFileIcon; +typedef struct _GFilenameCompleter GFilenameCompleter; + + +typedef struct _GIcon GIcon; /* Dummy typedef */ +typedef struct _GInetAddress GInetAddress; +typedef struct _GInetSocketAddress GInetSocketAddress; +typedef struct _GInputStream GInputStream; +typedef struct _GInitable GInitable; +typedef struct _GIOModule GIOModule; +typedef struct _GIOExtensionPoint GIOExtensionPoint; +typedef struct _GIOExtension GIOExtension; + +/** + * GIOSchedulerJob: + * + * Opaque class for definining and scheduling IO jobs. + **/ +typedef struct _GIOSchedulerJob GIOSchedulerJob; +typedef struct _GLoadableIcon GLoadableIcon; /* Dummy typedef */ +typedef struct _GMemoryInputStream GMemoryInputStream; +typedef struct _GMemoryOutputStream GMemoryOutputStream; + +/** + * GMount: + * + * A handle to an object implementing the #GMountIface interface. + **/ +typedef struct _GMount GMount; /* Dummy typedef */ +typedef struct _GMountOperation GMountOperation; +typedef struct _GNetworkAddress GNetworkAddress; +typedef struct _GNetworkService GNetworkService; +typedef struct _GOutputStream GOutputStream; +typedef struct _GIOStream GIOStream; +typedef struct _GResolver GResolver; +typedef struct _GSeekable GSeekable; +typedef struct _GSimpleAsyncResult GSimpleAsyncResult; + +/** + * GSocket: + * + * A lowlevel network socket object. + * + * Since: 2.22 + **/ +typedef struct _GSocket GSocket; + +/** + * GSocketControlMessage: + * + * Base class for socket-type specific control messages that can be sent and + * received over #GSocket. + **/ +typedef struct _GSocketControlMessage GSocketControlMessage; +/** + * GSocketClient: + * + * A helper class for network clients to make connections. + * + * Since: 2.22 + **/ +typedef struct _GSocketClient GSocketClient; +/** + * GSocketConnection: + * + * A socket connection GIOStream object for connection-oriented sockets. + * + * Since: 2.22 + **/ +typedef struct _GSocketConnection GSocketConnection; +/** + * GSocketClient: + * + * A helper class for network servers to listen for and accept connections. + * + * Since: 2.22 + **/ +typedef struct _GSocketListener GSocketListener; +/** + * GSocketService: + * + * A helper class for handling accepting incomming connections in the + * glib mainloop. + * + * Since: 2.22 + **/ +typedef struct _GSocketService GSocketService; +typedef struct _GSocketAddress GSocketAddress; +typedef struct _GSocketAddressEnumerator GSocketAddressEnumerator; +typedef struct _GSocketConnectable GSocketConnectable; +typedef struct _GSrvTarget GSrvTarget; +/** + * GTcpConnection: + * + * A #GSocketConnection for TCP/IP connections. + * + * Since: 2.22 + **/ +typedef struct _GTcpConnection GTcpConnection; +/** + * GThreadedSocketService: + * + * A helper class for handling accepting incomming connections in the + * glib mainloop and handling them in a thread. + * + * Since: 2.22 + **/ +typedef struct _GThreadedSocketService GThreadedSocketService; +typedef struct _GThemedIcon GThemedIcon; +typedef struct _GVfs GVfs; /* Dummy typedef */ + +/** + * GVolume: + * + * Opaque mountable volume object. + **/ +typedef struct _GVolume GVolume; /* Dummy typedef */ +typedef struct _GVolumeMonitor GVolumeMonitor; + +/** + * GAsyncReadyCallback: + * @source_object: the object the asynchronous operation was started with. + * @res: a #GAsyncResult. + * @user_data: user data passed to the callback. + * + * Type definition for a function that will be called back when an asynchronous + * operation within GIO has been completed. + **/ +typedef void (*GAsyncReadyCallback) (GObject *source_object, + GAsyncResult *res, + gpointer user_data); + +/** + * GFileProgressCallback: + * @current_num_bytes: the current number of bytes in the operation. + * @total_num_bytes: the total number of bytes in the operation. + * @user_data: user data passed to the callback. + * + * When doing file operations that may take a while, such as moving + * a file or copying a file, a progress callback is used to pass how + * far along that operation is to the application. + **/ +typedef void (*GFileProgressCallback) (goffset current_num_bytes, + goffset total_num_bytes, + gpointer user_data); + +/** + * GFileReadMoreCallback: + * @file_contents: the data as currently read. + * @file_size: the size of the data currently read. + * @callback_data: data passed to the callback. + * + * When loading the partial contents of a file with g_file_load_partial_contents_async(), + * it may become necessary to determine if any more data from the file should be loaded. + * A #GFileReadMoreCallback function facilitates this by returning %TRUE if more data + * should be read, or %FALSE otherwise. + * + * Returns: %TRUE if more data should be read back. %FALSE otherwise. + **/ +typedef gboolean (* GFileReadMoreCallback) (const char *file_contents, + goffset file_size, + gpointer callback_data); + + +/** + * GIOSchedulerJobFunc: + * @job: a #GIOSchedulerJob. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @user_data: the data to pass to callback function + * + * I/O Job function. + * + * Note that depending on whether threads are available, the + * #GIOScheduler may run jobs in separate threads or in an idle + * in the mainloop. + * + * Long-running jobs should periodically check the @cancellable + * to see if they have been cancelled. + * + * Returns: %TRUE if this function should be called again to + * complete the job, %FALSE if the job is complete (or cancelled) + **/ +typedef gboolean (*GIOSchedulerJobFunc) (GIOSchedulerJob *job, + GCancellable *cancellable, + gpointer user_data); + +/** + * GSimpleAsyncThreadFunc: + * @res: a #GSimpleAsyncResult. + * @object: a #GObject. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * + * Simple thread function that runs an asynchronous operation and + * checks for cancellation. + **/ +typedef void (*GSimpleAsyncThreadFunc) (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable); + +/** + * GSocketSourceFunc: + * @socket: the #GSocket + * @condition: the current condition at the source fired. + * @user_data: data passed in by the user. + * + * This is the function type of the callback used for the #GSource + * returned by g_socket_create_source(). + * + * Returns: it should return %FALSE if the source should be removed. + * + * Since: 2.22 + */ +typedef gboolean (*GSocketSourceFunc) (GSocket *socket, + GIOCondition condition, + gpointer user_data); + +/** + * GInputVector: + * @buffer: Pointer to a buffer where data will be written. + * @size: the available size in @buffer. + * + * Structure used for scatter/gather data input. + * You generally pass in an array of #GInputVectors + * and the operation will store the read data starting in the + * first buffer, switching to the next as needed. + * + * Since: 2.22 + */ +typedef struct _GInputVector GInputVector; + +struct _GInputVector { + gpointer buffer; + gsize size; +}; + +/** + * GOutputVector: + * @buffer: Pointer to a buffer of data to read. + * @size: the size of @buffer. + * + * Structure used for scatter/gather data output. + * You generally pass in an array of #GOutputVectors + * and the operation will use all the buffers as if they were + * one buffer. + * + * Since: 2.22 + */ +typedef struct _GOutputVector GOutputVector; + +struct _GOutputVector { + gconstpointer buffer; + gsize size; +}; + + +G_END_DECLS + +#endif /* __GIO_TYPES_H__ */ diff --git a/gio/gloadableicon.c b/gio/gloadableicon.c new file mode 100644 index 0000000..9221d35 --- /dev/null +++ b/gio/gloadableicon.c @@ -0,0 +1,244 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gicon.h" +#include "gloadableicon.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gloadableicon + * @short_description: Loadable Icons + * @include: gio/gio.h + * @see_also: #GIcon, #GThemedIcon + * + * Extends the #GIcon interface and adds the ability to + * load icons from streams. + **/ + +static void g_loadable_icon_real_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GInputStream *g_loadable_icon_real_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error); + +typedef GLoadableIconIface GLoadableIconInterface; +G_DEFINE_INTERFACE(GLoadableIcon, g_loadable_icon, G_TYPE_ICON) + +static void +g_loadable_icon_default_init (GLoadableIconIface *iface) +{ + iface->load_async = g_loadable_icon_real_load_async; + iface->load_finish = g_loadable_icon_real_load_finish; +} + +/** + * g_loadable_icon_load: + * @icon: a #GLoadableIcon. + * @size: an integer. + * @type: a location to store the type of the loaded icon, %NULL to ignore. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Loads a loadable icon. For the asynchronous version of this function, + * see g_loadable_icon_load_async(). + * + * Returns: a #GInputStream to read the icon from. + **/ +GInputStream * +g_loadable_icon_load (GLoadableIcon *icon, + int size, + char **type, + GCancellable *cancellable, + GError **error) +{ + GLoadableIconIface *iface; + + g_return_val_if_fail (G_IS_LOADABLE_ICON (icon), NULL); + + iface = G_LOADABLE_ICON_GET_IFACE (icon); + + return (* iface->load) (icon, size, type, cancellable, error); +} + +/** + * g_loadable_icon_load_async: + * @icon: a #GLoadableIcon. + * @size: an integer. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Loads an icon asynchronously. To finish this function, see + * g_loadable_icon_load_finish(). For the synchronous, blocking + * version of this function, see g_loadable_icon_load(). + **/ +void +g_loadable_icon_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GLoadableIconIface *iface; + + g_return_if_fail (G_IS_LOADABLE_ICON (icon)); + + iface = G_LOADABLE_ICON_GET_IFACE (icon); + + (* iface->load_async) (icon, size, cancellable, callback, user_data); +} + +/** + * g_loadable_icon_load_finish: + * @icon: a #GLoadableIcon. + * @res: a #GAsyncResult. + * @type: a location to store the type of the loaded icon, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an asynchronous icon load started in g_loadable_icon_load_async(). + * + * Returns: a #GInputStream to read the icon from. + **/ +GInputStream * +g_loadable_icon_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error) +{ + GLoadableIconIface *iface; + + g_return_val_if_fail (G_IS_LOADABLE_ICON (icon), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + iface = G_LOADABLE_ICON_GET_IFACE (icon); + + return (* iface->load_finish) (icon, res, type, error); +} + +/******************************************** + * Default implementation of async load * + ********************************************/ + +typedef struct { + int size; + char *type; + GInputStream *stream; +} LoadData; + +static void +load_data_free (LoadData *data) +{ + if (data->stream) + g_object_unref (data->stream); + g_free (data->type); + g_free (data); +} + +static void +load_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GLoadableIconIface *iface; + GInputStream *stream; + LoadData *data; + GError *error = NULL; + char *type = NULL; + + data = g_simple_async_result_get_op_res_gpointer (res); + + iface = G_LOADABLE_ICON_GET_IFACE (object); + stream = iface->load (G_LOADABLE_ICON (object), data->size, &type, cancellable, &error); + + if (stream == NULL) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + else + { + data->stream = stream; + data->type = type; + } +} + + + +static void +g_loadable_icon_real_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + LoadData *data; + + res = g_simple_async_result_new (G_OBJECT (icon), callback, user_data, g_loadable_icon_real_load_async); + data = g_new0 (LoadData, 1); + g_simple_async_result_set_op_res_gpointer (res, data, (GDestroyNotify) load_data_free); + g_simple_async_result_run_in_thread (res, load_async_thread, 0, cancellable); + g_object_unref (res); +} + +static GInputStream * +g_loadable_icon_real_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + LoadData *data; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_loadable_icon_real_load_async); + + data = g_simple_async_result_get_op_res_gpointer (simple); + + if (type) + { + *type = data->type; + data->type = NULL; + } + + return g_object_ref (data->stream); +} + +#define __G_LOADABLE_ICON_C__ +#include "gioaliasdef.c" diff --git a/gio/gloadableicon.h b/gio/gloadableicon.h new file mode 100644 index 0000000..754090f --- /dev/null +++ b/gio/gloadableicon.h @@ -0,0 +1,97 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_LOADABLE_ICON_H__ +#define __G_LOADABLE_ICON_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOADABLE_ICON (g_loadable_icon_get_type ()) +#define G_LOADABLE_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_LOADABLE_ICON, GLoadableIcon)) +#define G_IS_LOADABLE_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_LOADABLE_ICON)) +#define G_LOADABLE_ICON_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_LOADABLE_ICON, GLoadableIconIface)) + +/** + * GLoadableIcon: + * + * Generic type for all kinds of icons that can be loaded + * as a stream. + **/ +typedef struct _GLoadableIconIface GLoadableIconIface; + +/** + * GLoadableIconIface: + * @g_iface: The parent interface. + * @load: Loads an icon. + * @load_async: Loads an icon asynchronously. + * @load_finish: Finishes an asynchronous icon load. + * + * Interface for icons that can be loaded as a stream. + **/ +struct _GLoadableIconIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GInputStream * (* load) (GLoadableIcon *icon, + int size, + char **type, + GCancellable *cancellable, + GError **error); + void (* load_async) (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GInputStream * (* load_finish) (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error); +}; + +GType g_loadable_icon_get_type (void) G_GNUC_CONST; + +GInputStream *g_loadable_icon_load (GLoadableIcon *icon, + int size, + char **type, + GCancellable *cancellable, + GError **error); +void g_loadable_icon_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GInputStream *g_loadable_icon_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error); + +G_END_DECLS + +#endif /* __G_LOADABLE_ICON_H__ */ diff --git a/gio/glocaldirectorymonitor.c b/gio/glocaldirectorymonitor.c new file mode 100644 index 0000000..6aea9a0 --- /dev/null +++ b/gio/glocaldirectorymonitor.c @@ -0,0 +1,318 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include "glocaldirectorymonitor.h" +#include "gunixmounts.h" +#include "giomodule-priv.h" +#include "gfile.h" +#include "gioerror.h" +#include "glibintl.h" + +#include + +#include "gioalias.h" + +enum +{ + PROP_0, + PROP_DIRNAME, + PROP_FLAGS +}; + +static gboolean g_local_directory_monitor_cancel (GFileMonitor *monitor); +static void mounts_changed (GUnixMountMonitor *mount_monitor, + gpointer user_data); + +G_DEFINE_ABSTRACT_TYPE (GLocalDirectoryMonitor, g_local_directory_monitor, G_TYPE_FILE_MONITOR) + +static void +g_local_directory_monitor_finalize (GObject *object) +{ + GLocalDirectoryMonitor *local_monitor; + local_monitor = G_LOCAL_DIRECTORY_MONITOR (object); + + g_free (local_monitor->dirname); + + if (local_monitor->mount_monitor) + { + g_signal_handlers_disconnect_by_func (local_monitor->mount_monitor, mounts_changed, local_monitor); + g_object_unref (local_monitor->mount_monitor); + local_monitor->mount_monitor = NULL; + } + + G_OBJECT_CLASS (g_local_directory_monitor_parent_class)->finalize (object); +} + +static void +g_local_directory_monitor_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + case PROP_DIRNAME: + /* Do nothing */ + break; + case PROP_FLAGS: + /* Do nothing */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static GObject * +g_local_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GLocalDirectoryMonitorClass *klass; + GObjectClass *parent_class; + GLocalDirectoryMonitor *local_monitor; + GFileMonitorFlags flags = 0; + const gchar *dirname = NULL; + gint i; + + klass = G_LOCAL_DIRECTORY_MONITOR_CLASS (g_type_class_peek (G_TYPE_LOCAL_DIRECTORY_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + local_monitor = G_LOCAL_DIRECTORY_MONITOR (obj); + + for (i = 0; i < n_construct_properties; i++) + { + if (strcmp ("dirname", g_param_spec_get_name (construct_properties[i].pspec)) == 0) + { + g_warn_if_fail (G_VALUE_HOLDS_STRING (construct_properties[i].value)); + dirname = g_value_get_string (construct_properties[i].value); + } + if (strcmp ("flags", g_param_spec_get_name (construct_properties[i].pspec)) == 0) + { + g_warn_if_fail (G_VALUE_HOLDS_FLAGS (construct_properties[i].value)); + flags = g_value_get_flags (construct_properties[i].value); + } + } + + local_monitor->dirname = g_strdup (dirname); + local_monitor->flags = flags; + + if (!klass->mount_notify && + (flags & G_FILE_MONITOR_WATCH_MOUNTS)) + { +#ifdef G_OS_WIN32 + /*claim everything was mounted */ + local_monitor->was_mounted = TRUE; +#else + GUnixMountEntry *mount; + + /* Emulate unmount detection */ + + mount = g_unix_mount_at (local_monitor->dirname, NULL); + + local_monitor->was_mounted = mount != NULL; + + if (mount) + g_unix_mount_free (mount); + + local_monitor->mount_monitor = g_unix_mount_monitor_new (); + g_signal_connect_object (local_monitor->mount_monitor, "mounts-changed", + G_CALLBACK (mounts_changed), local_monitor, 0); +#endif + } + + return obj; +} + +static void +g_local_directory_monitor_class_init (GLocalDirectoryMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); + + gobject_class->finalize = g_local_directory_monitor_finalize; + gobject_class->set_property = g_local_directory_monitor_set_property; + gobject_class->constructor = g_local_directory_monitor_constructor; + + file_monitor_class->cancel = g_local_directory_monitor_cancel; + + g_object_class_install_property (gobject_class, + PROP_DIRNAME, + g_param_spec_string ("dirname", + P_("Directory name"), + P_("Directory to monitor"), + NULL, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_WRITABLE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + g_object_class_install_property (gobject_class, + PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Monitor flags"), + P_("Monitor flags"), + G_TYPE_FILE_MONITOR_FLAGS, + 0, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_WRITABLE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + klass->mount_notify = FALSE; +} + +static void +g_local_directory_monitor_init (GLocalDirectoryMonitor *local_monitor) +{ +} + +static void +mounts_changed (GUnixMountMonitor *mount_monitor, + gpointer user_data) +{ + GLocalDirectoryMonitor *local_monitor = user_data; + GUnixMountEntry *mount; + gboolean is_mounted; + GFile *file; + + /* Emulate unmount detection */ +#ifdef G_OS_WIN32 + mount = NULL; + /*claim everything was mounted */ + is_mounted = TRUE; +#else + mount = g_unix_mount_at (local_monitor->dirname, NULL); + + is_mounted = mount != NULL; + + if (mount) + g_unix_mount_free (mount); +#endif + + if (local_monitor->was_mounted != is_mounted) + { + if (local_monitor->was_mounted && !is_mounted) + { + file = g_file_new_for_path (local_monitor->dirname); + g_file_monitor_emit_event (G_FILE_MONITOR (local_monitor), + file, NULL, + G_FILE_MONITOR_EVENT_UNMOUNTED); + g_object_unref (file); + } + local_monitor->was_mounted = is_mounted; + } +} + +static gpointer +get_default_local_directory_monitor (gpointer data) +{ + GLocalDirectoryMonitorClass *chosen_class; + GLocalDirectoryMonitorClass **ret = data; + GIOExtensionPoint *ep; + GList *extensions, *l; + + _g_io_modules_ensure_loaded (); + + ep = g_io_extension_point_lookup (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME); + + extensions = g_io_extension_point_get_extensions (ep); + + chosen_class = NULL; + for (l = extensions; l != NULL; l = l->next) + { + GIOExtension *extension = l->data; + GLocalDirectoryMonitorClass *klass; + + klass = G_LOCAL_DIRECTORY_MONITOR_CLASS (g_io_extension_ref_class (extension)); + + if (klass->is_supported ()) + { + chosen_class = klass; + break; + } + else + g_type_class_unref (klass); + } + + if (chosen_class) + { + *ret = chosen_class; + return (gpointer)G_TYPE_FROM_CLASS (chosen_class); + } + else + return (gpointer)G_TYPE_INVALID; +} + +GFileMonitor* +_g_local_directory_monitor_new (const char *dirname, + GFileMonitorFlags flags, + GError **error) +{ + static GOnce once_init = G_ONCE_INIT; + GTypeClass *type_class; + GFileMonitor *monitor; + GType type; + + type_class = NULL; + g_once (&once_init, get_default_local_directory_monitor, &type_class); + type = (GType)once_init.retval; + + monitor = NULL; + if (type != G_TYPE_INVALID) + monitor = G_FILE_MONITOR (g_object_new (type, "dirname", dirname, "flags", flags, NULL)); + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unable to find default local directory monitor type")); + + /* This is non-null on first pass here. Unref the class now. + * This is to avoid unloading the module and then loading it + * again which would happen if we unrefed the class + * before creating the monitor. + */ + + if (type_class) + g_type_class_unref (type_class); + + return monitor; +} + +static gboolean +g_local_directory_monitor_cancel (GFileMonitor *monitor) +{ + GLocalDirectoryMonitor *local_monitor = G_LOCAL_DIRECTORY_MONITOR (monitor); + + if (local_monitor->mount_monitor) + { + g_signal_handlers_disconnect_by_func (local_monitor->mount_monitor, mounts_changed, local_monitor); + g_object_unref (local_monitor->mount_monitor); + local_monitor->mount_monitor = NULL; + } + + return TRUE; +} + +#define __G_LOCAL_DIRECTORY_MONITOR_C__ +#include "gioaliasdef.c" diff --git a/gio/glocaldirectorymonitor.h b/gio/glocaldirectorymonitor.h new file mode 100644 index 0000000..418634e --- /dev/null +++ b/gio/glocaldirectorymonitor.h @@ -0,0 +1,71 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_DIRECTORY_MONITOR_H__ +#define __G_LOCAL_DIRECTORY_MONITOR_H__ + +#include + +#include "gunixmounts.h" + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_DIRECTORY_MONITOR (g_local_directory_monitor_get_type ()) +#define G_LOCAL_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_DIRECTORY_MONITOR, GLocalDirectoryMonitor)) +#define G_LOCAL_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_LOCAL_DIRECTORY_MONITOR, GLocalDirectoryMonitorClass)) +#define G_IS_LOCAL_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_DIRECTORY_MONITOR)) +#define G_IS_LOCAL_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_DIRECTORY_MONITOR)) + +#define G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME "gio-local-directory-monitor" + +typedef struct _GLocalDirectoryMonitor GLocalDirectoryMonitor; +typedef struct _GLocalDirectoryMonitorClass GLocalDirectoryMonitorClass; + +struct _GLocalDirectoryMonitor +{ + GFileMonitor parent_instance; + + gchar *dirname; + GFileMonitorFlags flags; + /* For mount emulation */ + GUnixMountMonitor *mount_monitor; + gboolean was_mounted; +}; + +struct _GLocalDirectoryMonitorClass +{ + GFileMonitorClass parent_class; + + gboolean mount_notify; + + gboolean (* is_supported) (void); +}; + +GType g_local_directory_monitor_get_type (void) G_GNUC_CONST; + +GFileMonitor * _g_local_directory_monitor_new (const char *dirname, + GFileMonitorFlags flags, + GError **error); + +G_END_DECLS + +#endif /* __G_LOCAL_DIRECTORY_MONITOR_H__ */ diff --git a/gio/glocalfile.c b/gio/glocalfile.c new file mode 100644 index 0000000..ec290e7 --- /dev/null +++ b/gio/glocalfile.c @@ -0,0 +1,2411 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#if HAVE_SYS_STATFS_H +#include +#endif +#if HAVE_SYS_STATVFS_H +#include +#endif +#if HAVE_SYS_VFS_H +#include +#elif HAVE_SYS_MOUNT_H +#if HAVE_SYS_PARAM_H +#include +#endif +#include +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#if defined(HAVE_STATFS) && defined(HAVE_STATVFS) +/* Some systems have both statfs and statvfs, pick the + most "native" for these */ +# if !defined(HAVE_STRUCT_STATFS_F_BAVAIL) + /* on solaris and irix, statfs doesn't even have the + f_bavail field */ +# define USE_STATVFS +# else + /* at least on linux, statfs is the actual syscall */ +# define USE_STATFS +# endif + +#elif defined(HAVE_STATFS) + +# define USE_STATFS + +#elif defined(HAVE_STATVFS) + +# define USE_STATVFS + +#endif + +#include "gfileattribute.h" +#include "glocalfile.h" +#include "glocalfileinfo.h" +#include "glocalfileenumerator.h" +#include "glocalfileinputstream.h" +#include "glocalfileoutputstream.h" +#include "glocalfileiostream.h" +#include "glocaldirectorymonitor.h" +#include "glocalfilemonitor.h" +#include "gmountprivate.h" +#include "gunixmounts.h" +#include "gioerror.h" +#include +#include "glibintl.h" + +#ifdef G_OS_WIN32 +#define _WIN32_WINNT 0x0500 +#include +#include +#include + +#ifndef FILE_READ_ONLY_VOLUME +#define FILE_READ_ONLY_VOLUME 0x00080000 +#endif + +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#endif +#ifndef S_ISLNK +#define S_ISLNK(m) (0) +#endif +#endif + +#include "gioalias.h" + +/* See gstdio.h */ +#ifndef G_OS_WIN32 +#define _g_stat_struct stat +#endif + +static void g_local_file_file_iface_init (GFileIface *iface); + +static GFileAttributeInfoList *local_writable_attributes = NULL; +static /* GFileAttributeInfoList * */ gsize local_writable_namespaces = 0; + +struct _GLocalFile +{ + GObject parent_instance; + + char *filename; +}; + +#define g_local_file_get_type _g_local_file_get_type +G_DEFINE_TYPE_WITH_CODE (GLocalFile, g_local_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_FILE, + g_local_file_file_iface_init)) + +static char *find_mountpoint_for (const char *file, dev_t dev); + +static void +g_local_file_finalize (GObject *object) +{ + GLocalFile *local; + + local = G_LOCAL_FILE (object); + + g_free (local->filename); + + G_OBJECT_CLASS (g_local_file_parent_class)->finalize (object); +} + +static void +g_local_file_class_init (GLocalFileClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GFileAttributeInfoList *list; + + gobject_class->finalize = g_local_file_finalize; + + /* Set up attribute lists */ + + /* Writable attributes: */ + + list = g_file_attribute_info_list_new (); + + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_UNIX_MODE, + G_FILE_ATTRIBUTE_TYPE_UINT32, + G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE | + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); + +#ifdef HAVE_CHOWN + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_UNIX_UID, + G_FILE_ATTRIBUTE_TYPE_UINT32, + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_UNIX_GID, + G_FILE_ATTRIBUTE_TYPE_UINT32, + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); +#endif + +#ifdef HAVE_SYMLINK + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET, + G_FILE_ATTRIBUTE_TYPE_BYTE_STRING, + 0); +#endif + +#ifdef HAVE_UTIMES + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_TIME_MODIFIED, + G_FILE_ATTRIBUTE_TYPE_UINT64, + G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE | + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, + G_FILE_ATTRIBUTE_TYPE_UINT32, + G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE | + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); + /* When copying, the target file is accessed. Replicating + * the source access time does not make sense in this case. + */ + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_TIME_ACCESS, + G_FILE_ATTRIBUTE_TYPE_UINT64, + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); + g_file_attribute_info_list_add (list, + G_FILE_ATTRIBUTE_TIME_ACCESS_USEC, + G_FILE_ATTRIBUTE_TYPE_UINT32, + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); +#endif + + local_writable_attributes = list; +} + +static void +g_local_file_init (GLocalFile *local) +{ +} + + +static char * +canonicalize_filename (const char *filename) +{ + char *canon, *start, *p, *q; + char *cwd; + int i; + + if (!g_path_is_absolute (filename)) + { + cwd = g_get_current_dir (); + canon = g_build_filename (cwd, filename, NULL); + g_free (cwd); + } + else + canon = g_strdup (filename); + + start = (char *)g_path_skip_root (canon); + + if (start == NULL) + { + /* This shouldn't really happen, as g_get_current_dir() should + return an absolute pathname, but bug 573843 shows this is + not always happening */ + g_free (canon); + return g_build_filename (G_DIR_SEPARATOR_S, filename, NULL); + } + + /* POSIX allows double slashes at the start to + * mean something special (as does windows too). + * So, "//" != "/", but more than two slashes + * is treated as "/". + */ + i = 0; + for (p = start - 1; + (p >= canon) && + G_IS_DIR_SEPARATOR (*p); + p--) + i++; + if (i > 2) + { + i -= 1; + start -= i; + memmove (start, start+i, strlen (start+i)+1); + } + + p = start; + while (*p != 0) + { + if (p[0] == '.' && (p[1] == 0 || G_IS_DIR_SEPARATOR (p[1]))) + { + memmove (p, p+1, strlen (p+1)+1); + } + else if (p[0] == '.' && p[1] == '.' && (p[2] == 0 || G_IS_DIR_SEPARATOR (p[2]))) + { + q = p + 2; + /* Skip previous separator */ + p = p - 2; + if (p < start) + p = start; + while (p > start && !G_IS_DIR_SEPARATOR (*p)) + p--; + if (G_IS_DIR_SEPARATOR (*p)) + *p++ = G_DIR_SEPARATOR; + memmove (p, q, strlen (q)+1); + } + else + { + /* Skip until next separator */ + while (*p != 0 && !G_IS_DIR_SEPARATOR (*p)) + p++; + + if (*p != 0) + { + /* Canonicalize one separator */ + *p++ = G_DIR_SEPARATOR; + } + } + + /* Remove additional separators */ + q = p; + while (*q && G_IS_DIR_SEPARATOR (*q)) + q++; + + if (p != q) + memmove (p, q, strlen (q)+1); + } + + /* Remove trailing slashes */ + if (p > start && G_IS_DIR_SEPARATOR (*(p-1))) + *(p-1) = 0; + + return canon; +} + +GFile * +_g_local_file_new (const char *filename) +{ + GLocalFile *local; + + local = g_object_new (G_TYPE_LOCAL_FILE, NULL); + local->filename = canonicalize_filename (filename); + + return G_FILE (local); +} + +static gboolean +g_local_file_is_native (GFile *file) +{ + return TRUE; +} + +static gboolean +g_local_file_has_uri_scheme (GFile *file, + const char *uri_scheme) +{ + return g_ascii_strcasecmp (uri_scheme, "file") == 0; +} + +static char * +g_local_file_get_uri_scheme (GFile *file) +{ + return g_strdup ("file"); +} + +static char * +g_local_file_get_basename (GFile *file) +{ + return g_path_get_basename (G_LOCAL_FILE (file)->filename); +} + +static char * +g_local_file_get_path (GFile *file) +{ + return g_strdup (G_LOCAL_FILE (file)->filename); +} + +static char * +g_local_file_get_uri (GFile *file) +{ + return g_filename_to_uri (G_LOCAL_FILE (file)->filename, NULL, NULL); +} + +static gboolean +get_filename_charset (const gchar **filename_charset) +{ + const gchar **charsets; + gboolean is_utf8; + + is_utf8 = g_get_filename_charsets (&charsets); + + if (filename_charset) + *filename_charset = charsets[0]; + + return is_utf8; +} + +static gboolean +name_is_valid_for_display (const char *string, + gboolean is_valid_utf8) +{ + char c; + + if (!is_valid_utf8 && + !g_utf8_validate (string, -1, NULL)) + return FALSE; + + while ((c = *string++) != 0) + { + if (g_ascii_iscntrl (c)) + return FALSE; + } + + return TRUE; +} + +static char * +g_local_file_get_parse_name (GFile *file) +{ + const char *filename; + char *parse_name; + const gchar *charset; + char *utf8_filename; + char *roundtripped_filename; + gboolean free_utf8_filename; + gboolean is_valid_utf8; + char *escaped_path; + + filename = G_LOCAL_FILE (file)->filename; + if (get_filename_charset (&charset)) + { + utf8_filename = (char *)filename; + free_utf8_filename = FALSE; + is_valid_utf8 = FALSE; /* Can't guarantee this */ + } + else + { + utf8_filename = g_convert (filename, -1, + "UTF-8", charset, NULL, NULL, NULL); + free_utf8_filename = TRUE; + is_valid_utf8 = TRUE; + + if (utf8_filename != NULL) + { + /* Make sure we can roundtrip: */ + roundtripped_filename = g_convert (utf8_filename, -1, + charset, "UTF-8", NULL, NULL, NULL); + + if (roundtripped_filename == NULL || + strcmp (filename, roundtripped_filename) != 0) + { + g_free (utf8_filename); + utf8_filename = NULL; + } + + g_free (roundtripped_filename); + } + } + + if (utf8_filename != NULL && + name_is_valid_for_display (utf8_filename, is_valid_utf8)) + { + if (free_utf8_filename) + parse_name = utf8_filename; + else + parse_name = g_strdup (utf8_filename); + } + else + { + escaped_path = g_uri_escape_string (filename, + G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/", + TRUE); + parse_name = g_strconcat ("file://", + (*escaped_path != '/') ? "/" : "", + escaped_path, + NULL); + + g_free (escaped_path); + + if (free_utf8_filename) + g_free (utf8_filename); + } + + return parse_name; +} + +static GFile * +g_local_file_get_parent (GFile *file) +{ + GLocalFile *local = G_LOCAL_FILE (file); + const char *non_root; + char *dirname; + GFile *parent; + + /* Check for root */ + non_root = g_path_skip_root (local->filename); + if (*non_root == 0) + return NULL; + + dirname = g_path_get_dirname (local->filename); + parent = _g_local_file_new (dirname); + g_free (dirname); + return parent; +} + +static GFile * +g_local_file_dup (GFile *file) +{ + GLocalFile *local = G_LOCAL_FILE (file); + + return _g_local_file_new (local->filename); +} + +static guint +g_local_file_hash (GFile *file) +{ + GLocalFile *local = G_LOCAL_FILE (file); + + return g_str_hash (local->filename); +} + +static gboolean +g_local_file_equal (GFile *file1, + GFile *file2) +{ + GLocalFile *local1 = G_LOCAL_FILE (file1); + GLocalFile *local2 = G_LOCAL_FILE (file2); + + return g_str_equal (local1->filename, local2->filename); +} + +static const char * +match_prefix (const char *path, + const char *prefix) +{ + int prefix_len; + + prefix_len = strlen (prefix); + if (strncmp (path, prefix, prefix_len) != 0) + return NULL; + + /* Handle the case where prefix is the root, so that + * the IS_DIR_SEPRARATOR check below works */ + if (prefix_len > 0 && + G_IS_DIR_SEPARATOR (prefix[prefix_len-1])) + prefix_len--; + + return path + prefix_len; +} + +static gboolean +g_local_file_prefix_matches (GFile *parent, + GFile *descendant) +{ + GLocalFile *parent_local = G_LOCAL_FILE (parent); + GLocalFile *descendant_local = G_LOCAL_FILE (descendant); + const char *remainder; + + remainder = match_prefix (descendant_local->filename, parent_local->filename); + if (remainder != NULL && G_IS_DIR_SEPARATOR (*remainder)) + return TRUE; + return FALSE; +} + +static char * +g_local_file_get_relative_path (GFile *parent, + GFile *descendant) +{ + GLocalFile *parent_local = G_LOCAL_FILE (parent); + GLocalFile *descendant_local = G_LOCAL_FILE (descendant); + const char *remainder; + + remainder = match_prefix (descendant_local->filename, parent_local->filename); + + if (remainder != NULL && G_IS_DIR_SEPARATOR (*remainder)) + return g_strdup (remainder + 1); + return NULL; +} + +static GFile * +g_local_file_resolve_relative_path (GFile *file, + const char *relative_path) +{ + GLocalFile *local = G_LOCAL_FILE (file); + char *filename; + GFile *child; + + if (g_path_is_absolute (relative_path)) + return _g_local_file_new (relative_path); + + filename = g_build_filename (local->filename, relative_path, NULL); + child = _g_local_file_new (filename); + g_free (filename); + + return child; +} + +static GFileEnumerator * +g_local_file_enumerate_children (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + return _g_local_file_enumerator_new (local, + attributes, flags, + cancellable, error); +} + +static GFile * +g_local_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error) +{ + GFile *new_file; + char *basename; + + basename = g_filename_from_utf8 (display_name, -1, NULL, NULL, NULL); + if (basename == NULL) + { + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename %s"), display_name); + return NULL; + } + + new_file = g_file_get_child (file, basename); + g_free (basename); + + return new_file; +} + +#ifdef USE_STATFS +static const char * +get_fs_type (long f_type) +{ + /* filesystem ids taken from linux manpage */ + switch (f_type) + { + case 0xadf5: + return "adfs"; + case 0x5346414f: + return "afs"; + case 0x0187: + return "autofs"; + case 0xADFF: + return "affs"; + case 0x42465331: + return "befs"; + case 0x1BADFACE: + return "bfs"; + case 0x9123683E: + return "btrfs"; + case 0xFF534D42: + return "cifs"; + case 0x73757245: + return "coda"; + case 0x012FF7B7: + return "coh"; + case 0x28cd3d45: + return "cramfs"; + case 0x1373: + return "devfs"; + case 0x00414A53: + return "efs"; + case 0x137D: + return "ext"; + case 0xEF51: + return "ext2"; + case 0xEF53: + return "ext3/ext4"; + case 0x4244: + return "hfs"; + case 0xF995E849: + return "hpfs"; + case 0x958458f6: + return "hugetlbfs"; + case 0x9660: + return "isofs"; + case 0x72b6: + return "jffs2"; + case 0x3153464a: + return "jfs"; + case 0x137F: + return "minix"; + case 0x138F: + return "minix2"; + case 0x2468: + return "minix2"; + case 0x2478: + return "minix22"; + case 0x4d44: + return "msdos"; + case 0x564c: + return "ncp"; + case 0x6969: + return "nfs"; + case 0x5346544e: + return "ntfs"; + case 0x9fa1: + return "openprom"; + case 0x9fa0: + return "proc"; + case 0x002f: + return "qnx4"; + case 0x52654973: + return "reiserfs"; + case 0x7275: + return "romfs"; + case 0x517B: + return "smb"; + case 0x73717368: + return "squashfs"; + case 0x012FF7B6: + return "sysv2"; + case 0x012FF7B5: + return "sysv4"; + case 0x01021994: + return "tmpfs"; + case 0x15013346: + return "udf"; + case 0x00011954: + return "ufs"; + case 0x9fa2: + return "usbdevice"; + case 0xa501FCF5: + return "vxfs"; + case 0x012FF7B4: + return "xenix"; + case 0x58465342: + return "xfs"; + case 0x012FD16D: + return "xiafs"; + default: + return NULL; + } +} +#endif + +#ifndef G_OS_WIN32 + +G_LOCK_DEFINE_STATIC(mount_info_hash); +static GHashTable *mount_info_hash = NULL; +static guint64 mount_info_hash_cache_time = 0; + +typedef enum { + MOUNT_INFO_READONLY = 1<<0 +} MountInfo; + +static gboolean +device_equal (gconstpointer v1, + gconstpointer v2) +{ + return *(dev_t *)v1 == *(dev_t *)v2; +} + +static guint +device_hash (gconstpointer v) +{ + return (guint) *(dev_t *)v; +} + +static void +get_mount_info (GFileInfo *fs_info, + const char *path, + GFileAttributeMatcher *matcher) +{ + struct _g_stat_struct buf; + gboolean got_info; + gpointer info_as_ptr; + guint mount_info; + char *mountpoint; + dev_t *dev; + GUnixMountEntry *mount; + guint64 cache_time; + + if (g_lstat (path, &buf) != 0) + return; + + G_LOCK (mount_info_hash); + + if (mount_info_hash == NULL) + mount_info_hash = g_hash_table_new_full (device_hash, device_equal, + g_free, NULL); + + + if (g_unix_mounts_changed_since (mount_info_hash_cache_time)) + g_hash_table_remove_all (mount_info_hash); + + got_info = g_hash_table_lookup_extended (mount_info_hash, + &buf.st_dev, + NULL, + &info_as_ptr); + + G_UNLOCK (mount_info_hash); + + mount_info = GPOINTER_TO_UINT (info_as_ptr); + + if (!got_info) + { + mount_info = 0; + + mountpoint = find_mountpoint_for (path, buf.st_dev); + if (mountpoint == NULL) + mountpoint = g_strdup ("/"); + + mount = g_unix_mount_at (mountpoint, &cache_time); + if (mount) + { + if (g_unix_mount_is_readonly (mount)) + mount_info |= MOUNT_INFO_READONLY; + + g_unix_mount_free (mount); + } + + g_free (mountpoint); + + dev = g_new0 (dev_t, 1); + *dev = buf.st_dev; + + G_LOCK (mount_info_hash); + mount_info_hash_cache_time = cache_time; + g_hash_table_insert (mount_info_hash, dev, GUINT_TO_POINTER (mount_info)); + G_UNLOCK (mount_info_hash); + } + + if (mount_info & MOUNT_INFO_READONLY) + g_file_info_set_attribute_boolean (fs_info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, TRUE); +} + +#endif + +#ifdef G_OS_WIN32 + +static gboolean +is_xp_or_later (void) +{ + static int result = -1; + + if (result == -1) + { +#ifndef _MSC_VER + OSVERSIONINFOEX ver_info = {0}; + DWORDLONG cond_mask = 0; + int op = VER_GREATER_EQUAL; + + ver_info.dwOSVersionInfoSize = sizeof ver_info; + ver_info.dwMajorVersion = 5; + ver_info.dwMinorVersion = 1; + + VER_SET_CONDITION (cond_mask, VER_MAJORVERSION, op); + VER_SET_CONDITION (cond_mask, VER_MINORVERSION, op); + + result = VerifyVersionInfo (&ver_info, + VER_MAJORVERSION | VER_MINORVERSION, + cond_mask) != 0; +#else + result = ((DWORD)(LOBYTE (LOWORD (GetVersion ())))) >= 5; +#endif + } + + return result; +} + +static wchar_t * +get_volume_for_path (const char *path) +{ + long len; + wchar_t *wpath; + wchar_t *result; + + wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); + result = g_new (wchar_t, MAX_PATH); + + if (!GetVolumePathNameW (wpath, result, MAX_PATH)) + { + char *msg = g_win32_error_message (GetLastError ()); + g_critical ("GetVolumePathName failed: %s", msg); + g_free (msg); + g_free (result); + g_free (wpath); + return NULL; + } + + len = wcslen (result); + if (len > 0 && result[len-1] != L'\\') + { + result = g_renew (wchar_t, result, len + 2); + result[len] = L'\\'; + result[len + 1] = 0; + } + + g_free (wpath); + return result; +} + +static char * +find_mountpoint_for (const char *file, dev_t dev) +{ + wchar_t *wpath; + char *utf8_path; + + wpath = get_volume_for_path (file); + if (!wpath) + return NULL; + + utf8_path = g_utf16_to_utf8 (wpath, -1, NULL, NULL, NULL); + + g_free (wpath); + return utf8_path; +} + +static void +get_filesystem_readonly (GFileInfo *info, + const char *path) +{ + wchar_t *rootdir; + + rootdir = get_volume_for_path (path); + + if (rootdir) + { + if (is_xp_or_later ()) + { + DWORD flags; + if (GetVolumeInformationW (rootdir, NULL, 0, NULL, NULL, &flags, NULL, 0)) + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, + (flags & FILE_READ_ONLY_VOLUME) != 0); + } + else + { + if (GetDriveTypeW (rootdir) == DRIVE_CDROM) + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, TRUE); + } + } + + g_free (rootdir); +} + +#endif /* G_OS_WIN32 */ + +static GFileInfo * +g_local_file_query_filesystem_info (GFile *file, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + GFileInfo *info; + int statfs_result = 0; + gboolean no_size; +#ifndef G_OS_WIN32 + guint64 block_size; + const char *fstype; +#ifdef USE_STATFS + struct statfs statfs_buffer; +#elif defined(USE_STATVFS) + struct statvfs statfs_buffer; +#endif +#endif + GFileAttributeMatcher *attribute_matcher; + + no_size = FALSE; + +#ifdef USE_STATFS + +#if STATFS_ARGS == 2 + statfs_result = statfs (local->filename, &statfs_buffer); +#elif STATFS_ARGS == 4 + statfs_result = statfs (local->filename, &statfs_buffer, + sizeof (statfs_buffer), 0); +#endif + block_size = statfs_buffer.f_bsize; + + /* Many backends can't report free size (for instance the gvfs fuse + backend for backend not supporting this), and set f_bfree to 0, + but it can be 0 for real too. We treat the availible == 0 and + free == 0 case as "both of these are invalid". + */ +#ifndef G_OS_WIN32 + if (statfs_result == 0 && + statfs_buffer.f_bavail == 0 && statfs_buffer.f_bfree == 0) + no_size = TRUE; +#endif + +#elif defined(USE_STATVFS) + statfs_result = statvfs (local->filename, &statfs_buffer); + block_size = statfs_buffer.f_frsize; +#endif + + if (statfs_result == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error getting filesystem info: %s"), + g_strerror (errsv)); + return NULL; + } + + info = g_file_info_new (); + + attribute_matcher = g_file_attribute_matcher_new (attributes); + + if (!no_size && + g_file_attribute_matcher_matches (attribute_matcher, + G_FILE_ATTRIBUTE_FILESYSTEM_FREE)) + { +#ifdef G_OS_WIN32 + gchar *localdir = g_path_get_dirname (local->filename); + wchar_t *wdirname = g_utf8_to_utf16 (localdir, -1, NULL, NULL, NULL); + ULARGE_INTEGER li; + + g_free (localdir); + if (GetDiskFreeSpaceExW (wdirname, &li, NULL, NULL)) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, (guint64)li.QuadPart); + g_free (wdirname); +#else + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, block_size * statfs_buffer.f_bavail); +#endif + } + if (!no_size && + g_file_attribute_matcher_matches (attribute_matcher, + G_FILE_ATTRIBUTE_FILESYSTEM_SIZE)) + { +#ifdef G_OS_WIN32 + gchar *localdir = g_path_get_dirname (local->filename); + wchar_t *wdirname = g_utf8_to_utf16 (localdir, -1, NULL, NULL, NULL); + ULARGE_INTEGER li; + + g_free (localdir); + if (GetDiskFreeSpaceExW (wdirname, NULL, &li, NULL)) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, (guint64)li.QuadPart); + g_free (wdirname); +#else + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, block_size * statfs_buffer.f_blocks); +#endif + } +#ifdef USE_STATFS +#if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) + fstype = g_strdup(statfs_buffer.f_fstypename); +#else + fstype = get_fs_type (statfs_buffer.f_type); +#endif + +#elif defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_BASETYPE) + fstype = g_strdup(statfs_buffer.f_basetype); +#endif + +#ifndef G_OS_WIN32 + if (fstype && + g_file_attribute_matcher_matches (attribute_matcher, + G_FILE_ATTRIBUTE_FILESYSTEM_TYPE)) + g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, fstype); +#endif + + if (g_file_attribute_matcher_matches (attribute_matcher, + G_FILE_ATTRIBUTE_FILESYSTEM_READONLY)) + { +#ifdef G_OS_WIN32 + get_filesystem_readonly (info, local->filename); +#else + get_mount_info (info, local->filename, attribute_matcher); +#endif + } + + g_file_attribute_matcher_unref (attribute_matcher); + + return info; +} + +static GMount * +g_local_file_find_enclosing_mount (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + struct _g_stat_struct buf; + char *mountpoint; + GMount *mount; + + if (g_lstat (local->filename, &buf) != 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + /* Translators: This is an error message when trying to + * find the enclosing (user visible) mount of a file, but + * none exists. */ + _("Containing mount does not exist")); + return NULL; + } + + mountpoint = find_mountpoint_for (local->filename, buf.st_dev); + if (mountpoint == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + /* Translators: This is an error message when trying to + * find the enclosing (user visible) mount of a file, but + * none exists. */ + _("Containing mount does not exist")); + return NULL; + } + + mount = _g_mount_get_for_mount_path (mountpoint, cancellable); + g_free (mountpoint); + if (mount) + return mount; + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + /* Translators: This is an error message when trying to find + * the enclosing (user visible) mount of a file, but none + * exists. */ + _("Containing mount does not exist")); + return NULL; +} + +static GFile * +g_local_file_set_display_name (GFile *file, + const char *display_name, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local, *new_local; + GFile *new_file, *parent; + struct _g_stat_struct statbuf; + GVfsClass *class; + GVfs *vfs; + int errsv; + + parent = g_file_get_parent (file); + if (parent == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Can't rename root directory")); + return NULL; + } + + new_file = g_file_get_child_for_display_name (parent, display_name, error); + g_object_unref (parent); + + if (new_file == NULL) + return NULL; + local = G_LOCAL_FILE (file); + new_local = G_LOCAL_FILE (new_file); + + if (g_lstat (new_local->filename, &statbuf) == -1) + { + errsv = errno; + + if (errsv != ENOENT) + { + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error renaming file: %s"), + g_strerror (errsv)); + return NULL; + } + } + else + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_EXISTS, + _("Can't rename file, filename already exist")); + return NULL; + } + + if (g_rename (local->filename, new_local->filename) == -1) + { + errsv = errno; + + if (errsv == EINVAL) + /* We can't get a rename file into itself error herer, + so this must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error renaming file: %s"), + g_strerror (errsv)); + g_object_unref (new_file); + return NULL; + } + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_moved) + class->local_file_moved (vfs, local->filename, new_local->filename); + + return new_file; +} + +static GFileInfo * +g_local_file_query_info (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + GFileInfo *info; + GFileAttributeMatcher *matcher; + char *basename, *dirname; + GLocalParentFileInfo parent_info; + + matcher = g_file_attribute_matcher_new (attributes); + + basename = g_path_get_basename (local->filename); + + dirname = g_path_get_dirname (local->filename); + _g_local_file_info_get_parent_info (dirname, matcher, &parent_info); + g_free (dirname); + + info = _g_local_file_info_get (basename, local->filename, + matcher, flags, &parent_info, + error); + + + _g_local_file_info_free_parent_info (&parent_info); + g_free (basename); + + g_file_attribute_matcher_unref (matcher); + + return info; +} + +static GFileAttributeInfoList * +g_local_file_query_settable_attributes (GFile *file, + GCancellable *cancellable, + GError **error) +{ + return g_file_attribute_info_list_ref (local_writable_attributes); +} + +static GFileAttributeInfoList * +g_local_file_query_writable_namespaces (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileAttributeInfoList *list; + GVfsClass *class; + GVfs *vfs; + + if (g_once_init_enter (&local_writable_namespaces)) + { + /* Writable namespaces: */ + + list = g_file_attribute_info_list_new (); + +#ifdef HAVE_XATTR + g_file_attribute_info_list_add (list, + "xattr", + G_FILE_ATTRIBUTE_TYPE_STRING, + G_FILE_ATTRIBUTE_INFO_COPY_WITH_FILE | + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); + g_file_attribute_info_list_add (list, + "xattr-sys", + G_FILE_ATTRIBUTE_TYPE_STRING, + G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); +#endif + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->add_writable_namespaces) + class->add_writable_namespaces (vfs, list); + + g_once_init_leave (&local_writable_namespaces, (gsize)list); + } + list = (GFileAttributeInfoList *)local_writable_namespaces; + + return g_file_attribute_info_list_ref (list); +} + +static gboolean +g_local_file_set_attribute (GFile *file, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + + return _g_local_file_info_set_attribute (local->filename, + attribute, + type, + value_p, + flags, + cancellable, + error); +} + +static gboolean +g_local_file_set_attributes_from_info (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + int res, chained_res; + GFileIface *default_iface; + + res = _g_local_file_info_set_attributes (local->filename, + info, flags, + cancellable, + error); + + if (!res) + error = NULL; /* Don't write over error if further errors */ + + default_iface = g_type_default_interface_peek (G_TYPE_FILE); + + chained_res = (default_iface->set_attributes_from_info) (file, info, flags, cancellable, error); + + return res && chained_res; +} + +static GFileInputStream * +g_local_file_read (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + int fd; + struct stat buf; + + fd = g_open (local->filename, O_RDONLY|O_BINARY, 0); + if (fd == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file: %s"), + g_strerror (errsv)); + return NULL; + } + + if (fstat(fd, &buf) == 0 && S_ISDIR (buf.st_mode)) + { + close (fd); + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_IS_DIRECTORY, + _("Can't open directory")); + return NULL; + } + + return _g_local_file_input_stream_new (fd); +} + +static GFileOutputStream * +g_local_file_append_to (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + return _g_local_file_output_stream_append (G_LOCAL_FILE (file)->filename, + flags, cancellable, error); +} + +static GFileOutputStream * +g_local_file_create (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + return _g_local_file_output_stream_create (G_LOCAL_FILE (file)->filename, + FALSE, + flags, cancellable, error); +} + +static GFileOutputStream * +g_local_file_replace (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + return _g_local_file_output_stream_replace (G_LOCAL_FILE (file)->filename, + FALSE, + etag, make_backup, flags, + cancellable, error); +} + +static GFileIOStream * +g_local_file_open_readwrite (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStream *output; + GFileIOStream *res; + + output = _g_local_file_output_stream_open (G_LOCAL_FILE (file)->filename, + TRUE, + cancellable, error); + if (output == NULL) + return NULL; + + res = _g_local_file_io_stream_new (G_LOCAL_FILE_OUTPUT_STREAM (output)); + g_object_unref (output); + return res; +} + +static GFileIOStream * +g_local_file_create_readwrite (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStream *output; + GFileIOStream *res; + + output = _g_local_file_output_stream_create (G_LOCAL_FILE (file)->filename, + TRUE, flags, + cancellable, error); + if (output == NULL) + return NULL; + + res = _g_local_file_io_stream_new (G_LOCAL_FILE_OUTPUT_STREAM (output)); + g_object_unref (output); + return res; +} + +static GFileIOStream * +g_local_file_replace_readwrite (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileOutputStream *output; + GFileIOStream *res; + + output = _g_local_file_output_stream_replace (G_LOCAL_FILE (file)->filename, + TRUE, + etag, make_backup, flags, + cancellable, error); + if (output == NULL) + return NULL; + + res = _g_local_file_io_stream_new (G_LOCAL_FILE_OUTPUT_STREAM (output)); + g_object_unref (output); + return res; +} + +static gboolean +g_local_file_delete (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + GVfsClass *class; + GVfs *vfs; + + if (g_remove (local->filename) == -1) + { + int errsv = errno; + + /* Posix allows EEXIST too, but the more sane error + is G_IO_ERROR_NOT_FOUND, and it's what nautilus + expects */ + if (errsv == EEXIST) + errsv = ENOTEMPTY; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error removing file: %s"), + g_strerror (errsv)); + return FALSE; + } + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_removed) + class->local_file_removed (vfs, local->filename); + + return TRUE; +} + +static char * +strip_trailing_slashes (const char *path) +{ + char *path_copy; + int len; + + path_copy = g_strdup (path); + len = strlen (path_copy); + while (len > 1 && path_copy[len-1] == '/') + path_copy[--len] = 0; + + return path_copy; + } + +static char * +expand_symlink (const char *link) +{ + char *resolved, *canonical, *parent, *link2; + char symlink_value[4096]; +#ifdef G_OS_WIN32 +#else + ssize_t res; +#endif + +#ifdef G_OS_WIN32 +#else + res = readlink (link, symlink_value, sizeof (symlink_value) - 1); + + if (res == -1) + return g_strdup (link); + symlink_value[res] = 0; +#endif + + if (g_path_is_absolute (symlink_value)) + return canonicalize_filename (symlink_value); + else + { + link2 = strip_trailing_slashes (link); + parent = g_path_get_dirname (link2); + g_free (link2); + + resolved = g_build_filename (parent, symlink_value, NULL); + g_free (parent); + + canonical = canonicalize_filename (resolved); + + g_free (resolved); + + return canonical; + } +} + +static char * +get_parent (const char *path, + dev_t *parent_dev) +{ + char *parent, *tmp; + struct _g_stat_struct parent_stat; + int num_recursions; + char *path_copy; + + path_copy = strip_trailing_slashes (path); + + parent = g_path_get_dirname (path_copy); + if (strcmp (parent, ".") == 0 || + strcmp (parent, path_copy) == 0) + { + g_free (parent); + g_free (path_copy); + return NULL; + } + g_free (path_copy); + + num_recursions = 0; + do { + if (g_lstat (parent, &parent_stat) != 0) + { + g_free (parent); + return NULL; + } + + if (S_ISLNK (parent_stat.st_mode)) + { + tmp = parent; + parent = expand_symlink (parent); + g_free (tmp); + } + + num_recursions++; + if (num_recursions > 12) + { + g_free (parent); + return NULL; + } + } while (S_ISLNK (parent_stat.st_mode)); + + *parent_dev = parent_stat.st_dev; + + return parent; +} + +static char * +expand_all_symlinks (const char *path) +{ + char *parent, *parent_expanded; + char *basename, *res; + dev_t parent_dev; + + parent = get_parent (path, &parent_dev); + if (parent) + { + parent_expanded = expand_all_symlinks (parent); + g_free (parent); + basename = g_path_get_basename (path); + res = g_build_filename (parent_expanded, basename, NULL); + g_free (basename); + g_free (parent_expanded); + } + else + res = g_strdup (path); + + return res; +} + +#ifndef G_OS_WIN32 + +static char * +find_mountpoint_for (const char *file, + dev_t dev) +{ + char *dir, *parent; + dev_t dir_dev, parent_dev; + + dir = g_strdup (file); + dir_dev = dev; + + while (1) + { + parent = get_parent (dir, &parent_dev); + if (parent == NULL) + return dir; + + if (parent_dev != dir_dev) + { + g_free (parent); + return dir; + } + + g_free (dir); + dir = parent; + } +} + +static char * +find_topdir_for (const char *file) +{ + char *dir; + dev_t dir_dev; + + dir = get_parent (file, &dir_dev); + if (dir == NULL) + return NULL; + + return find_mountpoint_for (dir, dir_dev); +} + +static char * +get_unique_filename (const char *basename, + int id) +{ + const char *dot; + + if (id == 1) + return g_strdup (basename); + + dot = strchr (basename, '.'); + if (dot) + return g_strdup_printf ("%.*s.%d%s", (int)(dot - basename), basename, id, dot); + else + return g_strdup_printf ("%s.%d", basename, id); +} + +static gboolean +path_has_prefix (const char *path, + const char *prefix) +{ + int prefix_len; + + if (prefix == NULL) + return TRUE; + + prefix_len = strlen (prefix); + + if (strncmp (path, prefix, prefix_len) == 0 && + (prefix_len == 0 || /* empty prefix always matches */ + prefix[prefix_len - 1] == '/' || /* last char in prefix was a /, so it must be in path too */ + path[prefix_len] == 0 || + path[prefix_len] == '/')) + return TRUE; + + return FALSE; +} + +static char * +try_make_relative (const char *path, + const char *base) +{ + char *path2, *base2; + char *relative; + + path2 = expand_all_symlinks (path); + base2 = expand_all_symlinks (base); + + relative = NULL; + if (path_has_prefix (path2, base2)) + { + relative = path2 + strlen (base2); + while (*relative == '/') + relative ++; + relative = g_strdup (relative); + } + g_free (path2); + g_free (base2); + + if (relative) + return relative; + + /* Failed, use abs path */ + return g_strdup (path); +} + +static char * +escape_trash_name (char *name) +{ + GString *str; + const gchar hex[16] = "0123456789ABCDEF"; + + str = g_string_new (""); + + while (*name != 0) + { + char c; + + c = *name++; + + if (g_ascii_isprint (c)) + g_string_append_c (str, c); + else + { + g_string_append_c (str, '%'); + g_string_append_c (str, hex[((guchar)c) >> 4]); + g_string_append_c (str, hex[((guchar)c) & 0xf]); + } + } + + return g_string_free (str, FALSE); +} + +gboolean +_g_local_file_has_trash_dir (const char *dirname, dev_t dir_dev) +{ + static gsize home_dev_set = 0; + static dev_t home_dev; + char *topdir, *globaldir, *trashdir, *tmpname; + uid_t uid; + char uid_str[32]; + struct _g_stat_struct global_stat, trash_stat; + gboolean res; + + if (g_once_init_enter (&home_dev_set)) + { + struct _g_stat_struct home_stat; + + g_stat (g_get_home_dir (), &home_stat); + home_dev = home_stat.st_dev; + g_once_init_leave (&home_dev_set, 1); + } + + /* Assume we can trash to the home */ + if (dir_dev == home_dev) + return TRUE; + + topdir = find_mountpoint_for (dirname, dir_dev); + if (topdir == NULL) + return FALSE; + + globaldir = g_build_filename (topdir, ".Trash", NULL); + if (g_lstat (globaldir, &global_stat) == 0 && + S_ISDIR (global_stat.st_mode) && + (global_stat.st_mode & S_ISVTX) != 0) + { + /* got a toplevel sysadmin created dir, assume we + * can trash to it (we should be able to create a dir) + * This fails for the FAT case where the ownership of + * that dir would be wrong though.. + */ + g_free (globaldir); + g_free (topdir); + return TRUE; + } + g_free (globaldir); + + /* No global trash dir, or it failed the tests, fall back to $topdir/.Trash-$uid */ + uid = geteuid (); + g_snprintf (uid_str, sizeof (uid_str), "%lu", (unsigned long) uid); + + tmpname = g_strdup_printf (".Trash-%s", uid_str); + trashdir = g_build_filename (topdir, tmpname, NULL); + g_free (tmpname); + + if (g_lstat (trashdir, &trash_stat) == 0) + { + g_free (topdir); + g_free (trashdir); + return S_ISDIR (trash_stat.st_mode) && + trash_stat.st_uid == uid; + } + g_free (trashdir); + + /* User specific trash didn't exist, can we create it? */ + res = g_access (topdir, W_OK) == 0; + g_free (topdir); + + return res; +} + + +static gboolean +g_local_file_trash (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + struct _g_stat_struct file_stat, home_stat; + const char *homedir; + char *trashdir, *topdir, *infodir, *filesdir; + char *basename, *trashname, *trashfile, *infoname, *infofile; + char *original_name, *original_name_escaped; + int i; + char *data; + gboolean is_homedir_trash; + char delete_time[32]; + int fd; + struct _g_stat_struct trash_stat, global_stat; + char *dirname, *globaldir; + GVfsClass *class; + GVfs *vfs; + + if (g_lstat (local->filename, &file_stat) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error trashing file: %s"), + g_strerror (errsv)); + return FALSE; + } + + homedir = g_get_home_dir (); + g_stat (homedir, &home_stat); + + is_homedir_trash = FALSE; + trashdir = NULL; + if (file_stat.st_dev == home_stat.st_dev) + { + is_homedir_trash = TRUE; + errno = 0; + trashdir = g_build_filename (g_get_user_data_dir (), "Trash", NULL); + if (g_mkdir_with_parents (trashdir, 0700) < 0) + { + char *display_name; + int errsv = errno; + + display_name = g_filename_display_name (trashdir); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Unable to create trash dir %s: %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + g_free (trashdir); + return FALSE; + } + topdir = g_strdup (g_get_user_data_dir ()); + } + else + { + uid_t uid; + char uid_str[32]; + + uid = geteuid (); + g_snprintf (uid_str, sizeof (uid_str), "%lu", (unsigned long)uid); + + topdir = find_topdir_for (local->filename); + if (topdir == NULL) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Unable to find toplevel directory for trash")); + return FALSE; + } + + /* Try looking for global trash dir $topdir/.Trash/$uid */ + globaldir = g_build_filename (topdir, ".Trash", NULL); + if (g_lstat (globaldir, &global_stat) == 0 && + S_ISDIR (global_stat.st_mode) && + (global_stat.st_mode & S_ISVTX) != 0) + { + trashdir = g_build_filename (globaldir, uid_str, NULL); + + if (g_lstat (trashdir, &trash_stat) == 0) + { + if (!S_ISDIR (trash_stat.st_mode) || + trash_stat.st_uid != uid) + { + /* Not a directory or not owned by user, ignore */ + g_free (trashdir); + trashdir = NULL; + } + } + else if (g_mkdir (trashdir, 0700) == -1) + { + g_free (trashdir); + trashdir = NULL; + } + } + g_free (globaldir); + + if (trashdir == NULL) + { + gboolean tried_create; + + /* No global trash dir, or it failed the tests, fall back to $topdir/.Trash-$uid */ + dirname = g_strdup_printf (".Trash-%s", uid_str); + trashdir = g_build_filename (topdir, dirname, NULL); + g_free (dirname); + + tried_create = FALSE; + + retry: + if (g_lstat (trashdir, &trash_stat) == 0) + { + if (!S_ISDIR (trash_stat.st_mode) || + trash_stat.st_uid != uid) + { + /* Remove the failed directory */ + if (tried_create) + g_remove (trashdir); + + /* Not a directory or not owned by user, ignore */ + g_free (trashdir); + trashdir = NULL; + } + } + else + { + if (!tried_create && + g_mkdir (trashdir, 0700) != -1) + { + /* Ensure that the created dir has the right uid etc. + This might fail on e.g. a FAT dir */ + tried_create = TRUE; + goto retry; + } + else + { + g_free (trashdir); + trashdir = NULL; + } + } + } + + if (trashdir == NULL) + { + g_free (topdir); + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Unable to find or create trash directory")); + return FALSE; + } + } + + /* Trashdir points to the trash dir with the "info" and "files" subdirectories */ + + infodir = g_build_filename (trashdir, "info", NULL); + filesdir = g_build_filename (trashdir, "files", NULL); + g_free (trashdir); + + /* Make sure we have the subdirectories */ + if ((g_mkdir (infodir, 0700) == -1 && errno != EEXIST) || + (g_mkdir (filesdir, 0700) == -1 && errno != EEXIST)) + { + g_free (topdir); + g_free (infodir); + g_free (filesdir); + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Unable to find or create trash directory")); + return FALSE; + } + + basename = g_path_get_basename (local->filename); + i = 1; + trashname = NULL; + infofile = NULL; + do { + g_free (trashname); + g_free (infofile); + + trashname = get_unique_filename (basename, i++); + infoname = g_strconcat (trashname, ".trashinfo", NULL); + infofile = g_build_filename (infodir, infoname, NULL); + g_free (infoname); + + fd = open (infofile, O_CREAT | O_EXCL, 0666); + } while (fd == -1 && errno == EEXIST); + + g_free (basename); + g_free (infodir); + + if (fd == -1) + { + int errsv = errno; + + g_free (filesdir); + g_free (topdir); + g_free (trashname); + g_free (infofile); + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Unable to create trashing info file: %s"), + g_strerror (errsv)); + return FALSE; + } + + close (fd); + + /* TODO: Maybe we should verify that you can delete the file from the trash + before moving it? OTOH, that is hard, as it needs a recursive scan */ + + trashfile = g_build_filename (filesdir, trashname, NULL); + + g_free (filesdir); + + if (g_rename (local->filename, trashfile) == -1) + { + int errsv = errno; + + g_free (topdir); + g_free (trashname); + g_free (infofile); + g_free (trashfile); + + if (errsv == EXDEV) + /* The trash dir was actually on another fs anyway!? + This can happen when the same device is mounted multiple + times, or with bind mounts of the same fs. */ + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Unable to trash file: %s"), + g_strerror (errsv)); + else + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Unable to trash file: %s"), + g_strerror (errsv)); + return FALSE; + } + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_moved) + class->local_file_moved (vfs, local->filename, trashfile); + + g_free (trashfile); + + /* TODO: Do we need to update mtime/atime here after the move? */ + + /* Use absolute names for homedir */ + if (is_homedir_trash) + original_name = g_strdup (local->filename); + else + original_name = try_make_relative (local->filename, topdir); + original_name_escaped = escape_trash_name (original_name); + + g_free (original_name); + g_free (topdir); + + { + time_t t; + struct tm now; + t = time (NULL); + localtime_r (&t, &now); + delete_time[0] = 0; + strftime(delete_time, sizeof (delete_time), "%Y-%m-%dT%H:%M:%S", &now); + } + + data = g_strdup_printf ("[Trash Info]\nPath=%s\nDeletionDate=%s\n", + original_name_escaped, delete_time); + + g_file_set_contents (infofile, data, -1, NULL); + g_free (infofile); + g_free (data); + + g_free (original_name_escaped); + g_free (trashname); + + return TRUE; +} +#else /* G_OS_WIN32 */ +gboolean +_g_local_file_has_trash_dir (const char *dirname, dev_t dir_dev) +{ + return FALSE; /* XXX ??? */ +} + +static gboolean +g_local_file_trash (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + SHFILEOPSTRUCTW op = {0}; + gboolean success; + wchar_t *wfilename; + long len; + + wfilename = g_utf8_to_utf16 (local->filename, -1, NULL, &len, NULL); + /* SHFILEOPSTRUCT.pFrom is double-zero-terminated */ + wfilename = g_renew (wchar_t, wfilename, len + 2); + wfilename[len + 1] = 0; + + op.wFunc = FO_DELETE; + op.pFrom = wfilename; + op.fFlags = FOF_ALLOWUNDO; + + success = SHFileOperationW (&op) == 0; + + if (success && op.fAnyOperationsAborted) + { + if (cancellable && !g_cancellable_is_cancelled (cancellable)) + g_cancellable_cancel (cancellable); + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_CANCELLED, + _("Unable to trash file: %s"), + _("Operation was cancelled")); + success = FALSE; + } + else if (!success) + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unable to trash file: %s"), + _("internal error")); + + g_free (wfilename); + return success; +} +#endif /* G_OS_WIN32 */ + +static gboolean +g_local_file_make_directory (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + + if (g_mkdir (local->filename, 0777) == -1) + { + int errsv = errno; + + if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error creating directory: %s"), + g_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + +static gboolean +g_local_file_make_symbolic_link (GFile *file, + const char *symlink_value, + GCancellable *cancellable, + GError **error) +{ +#ifdef HAVE_SYMLINK + GLocalFile *local = G_LOCAL_FILE (file); + + if (symlink (symlink_value, local->filename) == -1) + { + int errsv = errno; + + if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else if (errsv == EPERM) + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Filesystem does not support symbolic links")); + else + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error making symbolic link: %s"), + g_strerror (errsv)); + return FALSE; + } + return TRUE; +#else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Symlinks not supported"); + return FALSE; +#endif +} + + +static gboolean +g_local_file_copy (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + /* Fall back to default copy */ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Copy not supported"); + return FALSE; +} + +static gboolean +g_local_file_move (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + GLocalFile *local_source, *local_destination; + struct _g_stat_struct statbuf; + gboolean destination_exist, source_is_dir; + char *backup_name; + int res; + off_t source_size; + GVfsClass *class; + GVfs *vfs; + + if (!G_IS_LOCAL_FILE (source) || + !G_IS_LOCAL_FILE (destination)) + { + /* Fall back to default move */ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Move not supported"); + return FALSE; + } + + local_source = G_LOCAL_FILE (source); + local_destination = G_LOCAL_FILE (destination); + + res = g_lstat (local_source->filename, &statbuf); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error moving file: %s"), + g_strerror (errsv)); + return FALSE; + } + + source_is_dir = S_ISDIR (statbuf.st_mode); + source_size = statbuf.st_size; + + destination_exist = FALSE; + res = g_lstat (local_destination->filename, &statbuf); + if (res == 0) + { + destination_exist = TRUE; /* Target file exists */ + + if (flags & G_FILE_COPY_OVERWRITE) + { + /* Always fail on dirs, even with overwrite */ + if (S_ISDIR (statbuf.st_mode)) + { + if (source_is_dir) + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_WOULD_MERGE, + _("Can't move directory over directory")); + else + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_IS_DIRECTORY, + _("Can't copy over directory")); + return FALSE; + } + } + else + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_EXISTS, + _("Target file exists")); + return FALSE; + } + } + + if (flags & G_FILE_COPY_BACKUP && destination_exist) + { + backup_name = g_strconcat (local_destination->filename, "~", NULL); + if (g_rename (local_destination->filename, backup_name) == -1) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Backup file creation failed")); + g_free (backup_name); + return FALSE; + } + g_free (backup_name); + destination_exist = FALSE; /* It did, but no more */ + } + + if (source_is_dir && destination_exist && (flags & G_FILE_COPY_OVERWRITE)) + { + /* Source is a dir, destination exists (and is not a dir, because that would have failed + earlier), and we're overwriting. Manually remove the target so we can do the rename. */ + res = g_unlink (local_destination->filename); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error removing target file: %s"), + g_strerror (errsv)); + return FALSE; + } + } + + if (g_rename (local_source->filename, local_destination->filename) == -1) + { + int errsv = errno; + + if (errsv == EXDEV) + /* This will cause the fallback code to run */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Move between mounts not supported")); + else if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT, or + we're trying to move the file into itself... + We return invalid filename for both... */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error moving file: %s"), + g_strerror (errsv)); + return FALSE; + } + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_moved) + class->local_file_moved (vfs, local_source->filename, local_destination->filename); + + /* Make sure we send full copied size */ + if (progress_callback) + progress_callback (source_size, source_size, progress_callback_data); + + return TRUE; +} + +static GFileMonitor* +g_local_file_monitor_dir (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFile* local_file = G_LOCAL_FILE(file); + return _g_local_directory_monitor_new (local_file->filename, flags, error); +} + +static GFileMonitor* +g_local_file_monitor_file (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFile* local_file = G_LOCAL_FILE(file); + return _g_local_file_monitor_new (local_file->filename, flags, error); +} + +static void +g_local_file_file_iface_init (GFileIface *iface) +{ + iface->dup = g_local_file_dup; + iface->hash = g_local_file_hash; + iface->equal = g_local_file_equal; + iface->is_native = g_local_file_is_native; + iface->has_uri_scheme = g_local_file_has_uri_scheme; + iface->get_uri_scheme = g_local_file_get_uri_scheme; + iface->get_basename = g_local_file_get_basename; + iface->get_path = g_local_file_get_path; + iface->get_uri = g_local_file_get_uri; + iface->get_parse_name = g_local_file_get_parse_name; + iface->get_parent = g_local_file_get_parent; + iface->prefix_matches = g_local_file_prefix_matches; + iface->get_relative_path = g_local_file_get_relative_path; + iface->resolve_relative_path = g_local_file_resolve_relative_path; + iface->get_child_for_display_name = g_local_file_get_child_for_display_name; + iface->set_display_name = g_local_file_set_display_name; + iface->enumerate_children = g_local_file_enumerate_children; + iface->query_info = g_local_file_query_info; + iface->query_filesystem_info = g_local_file_query_filesystem_info; + iface->find_enclosing_mount = g_local_file_find_enclosing_mount; + iface->query_settable_attributes = g_local_file_query_settable_attributes; + iface->query_writable_namespaces = g_local_file_query_writable_namespaces; + iface->set_attribute = g_local_file_set_attribute; + iface->set_attributes_from_info = g_local_file_set_attributes_from_info; + iface->read_fn = g_local_file_read; + iface->append_to = g_local_file_append_to; + iface->create = g_local_file_create; + iface->replace = g_local_file_replace; + iface->open_readwrite = g_local_file_open_readwrite; + iface->create_readwrite = g_local_file_create_readwrite; + iface->replace_readwrite = g_local_file_replace_readwrite; + iface->delete_file = g_local_file_delete; + iface->trash = g_local_file_trash; + iface->make_directory = g_local_file_make_directory; + iface->make_symbolic_link = g_local_file_make_symbolic_link; + iface->copy = g_local_file_copy; + iface->move = g_local_file_move; + iface->monitor_dir = g_local_file_monitor_dir; + iface->monitor_file = g_local_file_monitor_file; + + iface->supports_thread_contexts = TRUE; +} diff --git a/gio/glocalfile.h b/gio/glocalfile.h new file mode 100644 index 0000000..abb36fa --- /dev/null +++ b/gio/glocalfile.h @@ -0,0 +1,51 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_H__ +#define __G_LOCAL_FILE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_FILE (_g_local_file_get_type ()) +#define G_LOCAL_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_FILE, GLocalFile)) +#define G_LOCAL_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_LOCAL_FILE, GLocalFileClass)) +#define G_IS_LOCAL_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE)) +#define G_IS_LOCAL_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE)) +#define G_LOCAL_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_LOCAL_FILE, GLocalFileClass)) + +typedef struct _GLocalFile GLocalFile; +typedef struct _GLocalFileClass GLocalFileClass; + +struct _GLocalFileClass +{ + GObjectClass parent_class; +}; + +GType _g_local_file_get_type (void) G_GNUC_CONST; + +GFile * _g_local_file_new (const char *filename); + +G_END_DECLS + +#endif /* __G_LOCAL_FILE_H__ */ diff --git a/gio/glocalfileenumerator.c b/gio/glocalfileenumerator.c new file mode 100644 index 0000000..e39c050 --- /dev/null +++ b/gio/glocalfileenumerator.c @@ -0,0 +1,391 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include "glibintl.h" + +#include "gioalias.h" + +#define CHUNK_SIZE 1000 + + /* TODO: + * It would be nice to use the dirent->d_type to check file type without + * needing to stat each files on linux and other systems that support it. + * (question: does that following symlink or not?) + */ + +#ifdef G_OS_WIN32 +#define USE_GDIR +#endif + +#ifndef USE_GDIR + +#include +#include +#include + +typedef struct { + char *name; + long inode; +} DirEntry; + +#endif + +struct _GLocalFileEnumerator +{ + GFileEnumerator parent; + + GFileAttributeMatcher *matcher; + char *filename; + char *attributes; + GFileQueryInfoFlags flags; + + gboolean got_parent_info; + GLocalParentFileInfo parent_info; + +#ifdef USE_GDIR + GDir *dir; +#else + DIR *dir; + DirEntry *entries; + int entries_pos; + gboolean at_end; +#endif + + gboolean follow_symlinks; +}; + +#define g_local_file_enumerator_get_type _g_local_file_enumerator_get_type +G_DEFINE_TYPE (GLocalFileEnumerator, g_local_file_enumerator, G_TYPE_FILE_ENUMERATOR); + +static GFileInfo *g_local_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); +static gboolean g_local_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + + +static void +free_entries (GLocalFileEnumerator *local) +{ +#ifndef USE_GDIR + int i; + + if (local->entries != NULL) + { + for (i = 0; local->entries[i].name != NULL; i++) + g_free (local->entries[i].name); + + g_free (local->entries); + } +#endif +} + +static void +g_local_file_enumerator_finalize (GObject *object) +{ + GLocalFileEnumerator *local; + + local = G_LOCAL_FILE_ENUMERATOR (object); + + if (local->got_parent_info) + _g_local_file_info_free_parent_info (&local->parent_info); + g_free (local->filename); + g_file_attribute_matcher_unref (local->matcher); + if (local->dir) + { +#ifdef USE_GDIR + g_dir_close (local->dir); +#else + closedir (local->dir); +#endif + local->dir = NULL; + } + + free_entries (local); + + G_OBJECT_CLASS (g_local_file_enumerator_parent_class)->finalize (object); +} + + +static void +g_local_file_enumerator_class_init (GLocalFileEnumeratorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GFileEnumeratorClass *enumerator_class = G_FILE_ENUMERATOR_CLASS (klass); + + gobject_class->finalize = g_local_file_enumerator_finalize; + + enumerator_class->next_file = g_local_file_enumerator_next_file; + enumerator_class->close_fn = g_local_file_enumerator_close; +} + +static void +g_local_file_enumerator_init (GLocalFileEnumerator *local) +{ +} + +#ifdef USE_GDIR +static void +convert_file_to_io_error (GError **error, + GError *file_error) +{ + int new_code; + + if (file_error == NULL) + return; + + new_code = G_IO_ERROR_FAILED; + + if (file_error->domain == G_FILE_ERROR) + { + switch (file_error->code) + { + case G_FILE_ERROR_NOENT: + new_code = G_IO_ERROR_NOT_FOUND; + break; + case G_FILE_ERROR_ACCES: + new_code = G_IO_ERROR_PERMISSION_DENIED; + break; + case G_FILE_ERROR_NOTDIR: + new_code = G_IO_ERROR_NOT_DIRECTORY; + break; + case G_FILE_ERROR_MFILE: + new_code = G_IO_ERROR_TOO_MANY_OPEN_FILES; + break; + default: + break; + } + } + + g_set_error_literal (error, G_IO_ERROR, + new_code, + file_error->message); +} +#endif + +GFileEnumerator * +_g_local_file_enumerator_new (GLocalFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFileEnumerator *local; + char *filename = g_file_get_path (G_FILE (file)); + +#ifdef USE_GDIR + GError *dir_error; + GDir *dir; + + dir_error = NULL; + dir = g_dir_open (filename, 0, error != NULL ? &dir_error : NULL); + if (dir == NULL) + { + if (error != NULL) + { + convert_file_to_io_error (error, dir_error); + g_error_free (dir_error); + } + g_free (filename); + return NULL; + } +#else + DIR *dir; + int errsv; + + dir = opendir (filename); + if (dir == NULL) + { + errsv = errno; + + g_set_error_literal (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + g_strerror (errsv)); + g_free (filename); + return NULL; + } + +#endif + + local = g_object_new (G_TYPE_LOCAL_FILE_ENUMERATOR, + "container", file, + NULL); + + local->dir = dir; + local->filename = filename; + local->matcher = g_file_attribute_matcher_new (attributes); + local->flags = flags; + + return G_FILE_ENUMERATOR (local); +} + +#ifndef USE_GDIR +static int +sort_by_inode (const void *_a, const void *_b) +{ + const DirEntry *a, *b; + + a = _a; + b = _b; + return a->inode - b->inode; +} + +static const char * +next_file_helper (GLocalFileEnumerator *local) +{ + struct dirent *entry; + const char *filename; + int i; + + if (local->at_end) + return NULL; + + if (local->entries == NULL || + (local->entries[local->entries_pos].name == NULL)) + { + if (local->entries == NULL) + local->entries = g_new (DirEntry, CHUNK_SIZE + 1); + else + { + /* Restart by clearing old names */ + for (i = 0; local->entries[i].name != NULL; i++) + g_free (local->entries[i].name); + } + + for (i = 0; i < CHUNK_SIZE; i++) + { + entry = readdir (local->dir); + while (entry + && (0 == strcmp (entry->d_name, ".") || + 0 == strcmp (entry->d_name, ".."))) + entry = readdir (local->dir); + + if (entry) + { + local->entries[i].name = g_strdup (entry->d_name); + local->entries[i].inode = entry->d_ino; + } + else + break; + } + local->entries[i].name = NULL; + local->entries_pos = 0; + + qsort (local->entries, i, sizeof (DirEntry), sort_by_inode); + } + + filename = local->entries[local->entries_pos++].name; + if (filename == NULL) + local->at_end = TRUE; + + return filename; +} + +#endif + +static GFileInfo * +g_local_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GLocalFileEnumerator *local = G_LOCAL_FILE_ENUMERATOR (enumerator); + const char *filename; + char *path; + GFileInfo *info; + GError *my_error; + + if (!local->got_parent_info) + { + _g_local_file_info_get_parent_info (local->filename, local->matcher, &local->parent_info); + local->got_parent_info = TRUE; + } + + next_file: + +#ifdef USE_GDIR + filename = g_dir_read_name (local->dir); +#else + filename = next_file_helper (local); +#endif + + if (filename == NULL) + return NULL; + + my_error = NULL; + path = g_build_filename (local->filename, filename, NULL); + info = _g_local_file_info_get (filename, path, + local->matcher, + local->flags, + &local->parent_info, + &my_error); + g_free (path); + + if (info == NULL) + { + /* Failed to get info */ + /* If the file does not exist there might have been a race where + * the file was removed between the readdir and the stat, so we + * ignore the file. */ + if (my_error->domain == G_IO_ERROR && + my_error->code == G_IO_ERROR_NOT_FOUND) + { + g_error_free (my_error); + goto next_file; + } + else + g_propagate_error (error, my_error); + } + + return info; +} + +static gboolean +g_local_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GLocalFileEnumerator *local = G_LOCAL_FILE_ENUMERATOR (enumerator); + + if (local->dir) + { +#ifdef USE_GDIR + g_dir_close (local->dir); +#else + closedir (local->dir); +#endif + local->dir = NULL; + } + + return TRUE; +} + + diff --git a/gio/glocalfileenumerator.h b/gio/glocalfileenumerator.h new file mode 100644 index 0000000..1269be3 --- /dev/null +++ b/gio/glocalfileenumerator.h @@ -0,0 +1,57 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_ENUMERATOR_H__ +#define __G_LOCAL_FILE_ENUMERATOR_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_FILE_ENUMERATOR (_g_local_file_enumerator_get_type ()) +#define G_LOCAL_FILE_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_FILE_ENUMERATOR, GLocalFileEnumerator)) +#define G_LOCAL_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_LOCAL_FILE_ENUMERATOR, GLocalFileEnumeratorClass)) +#define G_IS_LOCAL_FILE_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE_ENUMERATOR)) +#define G_IS_LOCAL_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE_ENUMERATOR)) +#define G_LOCAL_FILE_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_LOCAL_FILE_ENUMERATOR, GLocalFileEnumeratorClass)) + +typedef struct _GLocalFileEnumerator GLocalFileEnumerator; +typedef struct _GLocalFileEnumeratorClass GLocalFileEnumeratorClass; +typedef struct _GLocalFileEnumeratorPrivate GLocalFileEnumeratorPrivate; + +struct _GLocalFileEnumeratorClass +{ + GFileEnumeratorClass parent_class; +}; + +GType _g_local_file_enumerator_get_type (void) G_GNUC_CONST; + +GFileEnumerator * _g_local_file_enumerator_new (GLocalFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_FILE_LOCAL_FILE_ENUMERATOR_H__ */ diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c new file mode 100644 index 0000000..a913e82 --- /dev/null +++ b/gio/glocalfileinfo.c @@ -0,0 +1,2423 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#define _GNU_SOURCE +#include +#include +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_SELINUX +#include +#endif + +#ifdef HAVE_XATTR + +#if defined HAVE_SYS_XATTR_H + #include +#elif defined HAVE_ATTR_XATTR_H + #include +#else + #error "Neither nor is present but extended attribute support is enabled." +#endif /* defined HAVE_SYS_XATTR_H || HAVE_ATTR_XATTR_H */ + +#endif /* HAVE_XATTR */ + +#include +#include +#include +#include + +#include "glibintl.h" + +#ifdef G_OS_WIN32 +#include +#include +#ifndef W_OK +#define W_OK 2 +#endif +#ifndef R_OK +#define R_OK 4 +#endif +#ifndef X_OK +#define X_OK 0 /* not really */ +#endif +#ifndef S_ISREG +#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#endif +#ifndef S_IXUSR +#define S_IXUSR _S_IEXEC +#endif +#endif + +#include "glocalfileinfo.h" +#include "gioerror.h" +#include "gthemedicon.h" +#include "gcontenttype.h" +#include "gcontenttypeprivate.h" + +#include "gioalias.h" + +/* See gstdio.h */ +#ifndef G_OS_WIN32 +#define _g_stat_struct stat +#endif + +struct ThumbMD5Context { + guint32 buf[4]; + guint32 bits[2]; + unsigned char in[64]; +}; + +#ifndef G_OS_WIN32 + +typedef struct { + char *user_name; + char *real_name; +} UidData; + +G_LOCK_DEFINE_STATIC (uid_cache); +static GHashTable *uid_cache = NULL; + +G_LOCK_DEFINE_STATIC (gid_cache); +static GHashTable *gid_cache = NULL; + +#endif /* !G_OS_WIN32 */ + +char * +_g_local_file_info_create_etag (GLocalFileStat *statbuf) +{ + GTimeVal tv; + + tv.tv_sec = statbuf->st_mtime; +#if defined (HAVE_STRUCT_STAT_ST_MTIMENSEC) + tv.tv_usec = statbuf->st_mtimensec / 1000; +#elif defined (HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) + tv.tv_usec = statbuf->st_mtim.tv_nsec / 1000; +#else + tv.tv_usec = 0; +#endif + + return g_strdup_printf ("%lu:%lu", tv.tv_sec, tv.tv_usec); +} + +static char * +_g_local_file_info_create_file_id (GLocalFileStat *statbuf) +{ + return g_strdup_printf ("l%" G_GUINT64_FORMAT ":%" G_GUINT64_FORMAT, + (guint64) statbuf->st_dev, + (guint64) statbuf->st_ino); +} + +static char * +_g_local_file_info_create_fs_id (GLocalFileStat *statbuf) +{ + return g_strdup_printf ("l%" G_GUINT64_FORMAT, + (guint64) statbuf->st_dev); +} + + +#ifdef S_ISLNK + +static gchar * +read_link (const gchar *full_name) +{ +#ifdef HAVE_READLINK + gchar *buffer; + guint size; + + size = 256; + buffer = g_malloc (size); + + while (1) + { + int read_size; + + read_size = readlink (full_name, buffer, size); + if (read_size < 0) + { + g_free (buffer); + return NULL; + } + if (read_size < size) + { + buffer[read_size] = 0; + return buffer; + } + size *= 2; + buffer = g_realloc (buffer, size); + } +#else + return NULL; +#endif +} + +#endif /* S_ISLNK */ + +#ifdef HAVE_SELINUX +/* Get the SELinux security context */ +static void +get_selinux_context (const char *path, + GFileInfo *info, + GFileAttributeMatcher *attribute_matcher, + gboolean follow_symlinks) +{ + char *context; + + if (!_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_SELINUX_CONTEXT)) + return; + + if (is_selinux_enabled ()) + { + if (follow_symlinks) + { + if (lgetfilecon_raw (path, &context) < 0) + return; + } + else + { + if (getfilecon_raw (path, &context) < 0) + return; + } + + if (context) + { + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_SELINUX_CONTEXT, context); + freecon (context); + } + } +} +#endif + +#ifdef HAVE_XATTR + +/* Wrappers to hide away differences between (Linux) getxattr/lgetxattr and + * (Mac) getxattr(..., XATTR_NOFOLLOW) + */ +#ifdef HAVE_XATTR_NOFOLLOW +#define g_fgetxattr(fd,name,value,size) fgetxattr(fd,name,value,size,0,0) +#define g_flistxattr(fd,name,size) flistxattr(fd,name,size,0) +#define g_setxattr(path,name,value,size) setxattr(path,name,value,size,0,0) +#else +#define g_fgetxattr fgetxattr +#define g_flistxattr flistxattr +#define g_setxattr(path,name,value,size) setxattr(path,name,value,size,0) +#endif + +static ssize_t +g_getxattr (const char *path, const char *name, void *value, size_t size, + gboolean follow_symlinks) +{ +#ifdef HAVE_XATTR_NOFOLLOW + return getxattr (path, name, value, size, 0, follow_symlinks ? 0 : XATTR_NOFOLLOW); +#else + if (follow_symlinks) + return getxattr (path, name, value, size); + else + return lgetxattr (path, name, value, size); +#endif +} + +static ssize_t +g_listxattr(const char *path, char *namebuf, size_t size, + gboolean follow_symlinks) +{ +#ifdef HAVE_XATTR_NOFOLLOW + return listxattr (path, namebuf, size, follow_symlinks ? 0 : XATTR_NOFOLLOW); +#else + if (follow_symlinks) + return listxattr (path, namebuf, size); + else + return llistxattr (path, namebuf, size); +#endif +} + +static gboolean +valid_char (char c) +{ + return c >= 32 && c <= 126 && c != '\\'; +} + +static gboolean +name_is_valid (const char *str) +{ + while (*str) + { + if (!valid_char (*str++)) + return FALSE; + } + return TRUE; +} + +static char * +hex_escape_string (const char *str, + gboolean *free_return) +{ + int num_invalid, i; + char *escaped_str, *p; + unsigned char c; + static char *hex_digits = "0123456789abcdef"; + int len; + + len = strlen (str); + + num_invalid = 0; + for (i = 0; i < len; i++) + { + if (!valid_char (str[i])) + num_invalid++; + } + + if (num_invalid == 0) + { + *free_return = FALSE; + return (char *)str; + } + + escaped_str = g_malloc (len + num_invalid*3 + 1); + + p = escaped_str; + for (i = 0; i < len; i++) + { + if (valid_char (str[i])) + *p++ = str[i]; + else + { + c = str[i]; + *p++ = '\\'; + *p++ = 'x'; + *p++ = hex_digits[(c >> 4) & 0xf]; + *p++ = hex_digits[c & 0xf]; + } + } + *p = 0; + + *free_return = TRUE; + return escaped_str; +} + +static char * +hex_unescape_string (const char *str, + int *out_len, + gboolean *free_return) +{ + int i; + char *unescaped_str, *p; + unsigned char c; + int len; + + len = strlen (str); + + if (strchr (str, '\\') == NULL) + { + if (out_len) + *out_len = len; + *free_return = FALSE; + return (char *)str; + } + + unescaped_str = g_malloc (len + 1); + + p = unescaped_str; + for (i = 0; i < len; i++) + { + if (str[i] == '\\' && + str[i+1] == 'x' && + len - i >= 4) + { + c = + (g_ascii_xdigit_value (str[i+2]) << 4) | + g_ascii_xdigit_value (str[i+3]); + *p++ = c; + i += 3; + } + else + *p++ = str[i]; + } + *p++ = 0; + + if (out_len) + *out_len = p - unescaped_str; + *free_return = TRUE; + return unescaped_str; +} + +static void +escape_xattr (GFileInfo *info, + const char *gio_attr, /* gio attribute name */ + const char *value, /* Is zero terminated */ + size_t len /* not including zero termination */) +{ + char *escaped_val; + gboolean free_escaped_val; + + escaped_val = hex_escape_string (value, &free_escaped_val); + + g_file_info_set_attribute_string (info, gio_attr, escaped_val); + + if (free_escaped_val) + g_free (escaped_val); +} + +static void +get_one_xattr (const char *path, + GFileInfo *info, + const char *gio_attr, + const char *xattr, + gboolean follow_symlinks) +{ + char value[64]; + char *value_p; + ssize_t len; + + len = g_getxattr (path, xattr, value, sizeof (value)-1, follow_symlinks); + + value_p = NULL; + if (len >= 0) + value_p = value; + else if (len == -1 && errno == ERANGE) + { + len = g_getxattr (path, xattr, NULL, 0, follow_symlinks); + + if (len < 0) + return; + + value_p = g_malloc (len+1); + + len = g_getxattr (path, xattr, value_p, len, follow_symlinks); + + if (len < 0) + { + g_free (value_p); + return; + } + } + else + return; + + /* Null terminate */ + value_p[len] = 0; + + escape_xattr (info, gio_attr, value_p, len); + + if (value_p != value) + g_free (value_p); +} + +#endif /* defined HAVE_XATTR */ + +static void +get_xattrs (const char *path, + gboolean user, + GFileInfo *info, + GFileAttributeMatcher *matcher, + gboolean follow_symlinks) +{ +#ifdef HAVE_XATTR + gboolean all; + gsize list_size; + ssize_t list_res_size; + size_t len; + char *list; + const char *attr, *attr2; + + if (user) + all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr"); + else + all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr-sys"); + + if (all) + { + list_res_size = g_listxattr (path, NULL, 0, follow_symlinks); + + if (list_res_size == -1 || + list_res_size == 0) + return; + + list_size = list_res_size; + list = g_malloc (list_size); + + retry: + + list_res_size = g_listxattr (path, list, list_size, follow_symlinks); + + if (list_res_size == -1 && errno == ERANGE) + { + list_size = list_size * 2; + list = g_realloc (list, list_size); + goto retry; + } + + if (list_res_size == -1) + return; + + attr = list; + while (list_res_size > 0) + { + if ((user && g_str_has_prefix (attr, "user.")) || + (!user && !g_str_has_prefix (attr, "user."))) + { + char *escaped_attr, *gio_attr; + gboolean free_escaped_attr; + + if (user) + { + escaped_attr = hex_escape_string (attr + 5, &free_escaped_attr); + gio_attr = g_strconcat ("xattr::", escaped_attr, NULL); + } + else + { + escaped_attr = hex_escape_string (attr, &free_escaped_attr); + gio_attr = g_strconcat ("xattr-sys::", escaped_attr, NULL); + } + + if (free_escaped_attr) + g_free (escaped_attr); + + get_one_xattr (path, info, gio_attr, attr, follow_symlinks); + + g_free (gio_attr); + } + + len = strlen (attr) + 1; + attr += len; + list_res_size -= len; + } + + g_free (list); + } + else + { + while ((attr = g_file_attribute_matcher_enumerate_next (matcher)) != NULL) + { + char *unescaped_attribute, *a; + gboolean free_unescaped_attribute; + + attr2 = strchr (attr, ':'); + if (attr2) + { + attr2 += 2; /* Skip '::' */ + unescaped_attribute = hex_unescape_string (attr2, NULL, &free_unescaped_attribute); + if (user) + a = g_strconcat ("user.", unescaped_attribute, NULL); + else + a = unescaped_attribute; + + get_one_xattr (path, info, attr, a, follow_symlinks); + + if (user) + g_free (a); + + if (free_unescaped_attribute) + g_free (unescaped_attribute); + } + } + } +#endif /* defined HAVE_XATTR */ +} + +#ifdef HAVE_XATTR +static void +get_one_xattr_from_fd (int fd, + GFileInfo *info, + const char *gio_attr, + const char *xattr) +{ + char value[64]; + char *value_p; + ssize_t len; + + len = g_fgetxattr (fd, xattr, value, sizeof (value) - 1); + + value_p = NULL; + if (len >= 0) + value_p = value; + else if (len == -1 && errno == ERANGE) + { + len = g_fgetxattr (fd, xattr, NULL, 0); + + if (len < 0) + return; + + value_p = g_malloc (len + 1); + + len = g_fgetxattr (fd, xattr, value_p, len); + + if (len < 0) + { + g_free (value_p); + return; + } + } + else + return; + + /* Null terminate */ + value_p[len] = 0; + + escape_xattr (info, gio_attr, value_p, len); + + if (value_p != value) + g_free (value_p); +} +#endif /* defined HAVE_XATTR */ + +static void +get_xattrs_from_fd (int fd, + gboolean user, + GFileInfo *info, + GFileAttributeMatcher *matcher) +{ +#ifdef HAVE_XATTR + gboolean all; + gsize list_size; + ssize_t list_res_size; + size_t len; + char *list; + const char *attr, *attr2; + + if (user) + all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr"); + else + all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr-sys"); + + if (all) + { + list_res_size = g_flistxattr (fd, NULL, 0); + + if (list_res_size == -1 || + list_res_size == 0) + return; + + list_size = list_res_size; + list = g_malloc (list_size); + + retry: + + list_res_size = g_flistxattr (fd, list, list_size); + + if (list_res_size == -1 && errno == ERANGE) + { + list_size = list_size * 2; + list = g_realloc (list, list_size); + goto retry; + } + + if (list_res_size == -1) + return; + + attr = list; + while (list_res_size > 0) + { + if ((user && g_str_has_prefix (attr, "user.")) || + (!user && !g_str_has_prefix (attr, "user."))) + { + char *escaped_attr, *gio_attr; + gboolean free_escaped_attr; + + if (user) + { + escaped_attr = hex_escape_string (attr + 5, &free_escaped_attr); + gio_attr = g_strconcat ("xattr::", escaped_attr, NULL); + } + else + { + escaped_attr = hex_escape_string (attr, &free_escaped_attr); + gio_attr = g_strconcat ("xattr-sys::", escaped_attr, NULL); + } + + if (free_escaped_attr) + g_free (escaped_attr); + + get_one_xattr_from_fd (fd, info, gio_attr, attr); + } + + len = strlen (attr) + 1; + attr += len; + list_res_size -= len; + } + + g_free (list); + } + else + { + while ((attr = g_file_attribute_matcher_enumerate_next (matcher)) != NULL) + { + char *unescaped_attribute, *a; + gboolean free_unescaped_attribute; + + attr2 = strchr (attr, ':'); + if (attr2) + { + attr2++; /* Skip ':' */ + unescaped_attribute = hex_unescape_string (attr2, NULL, &free_unescaped_attribute); + if (user) + a = g_strconcat ("user.", unescaped_attribute, NULL); + else + a = unescaped_attribute; + + get_one_xattr_from_fd (fd, info, attr, a); + + if (user) + g_free (a); + + if (free_unescaped_attribute) + g_free (unescaped_attribute); + } + } + } +#endif /* defined HAVE_XATTR */ +} + +#ifdef HAVE_XATTR +static gboolean +set_xattr (char *filename, + const char *escaped_attribute, + const GFileAttributeValue *attr_value, + GError **error) +{ + char *attribute, *value; + gboolean free_attribute, free_value; + int val_len, res, errsv; + gboolean is_user; + char *a; + + if (attr_value == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Attribute value must be non-NULL")); + return FALSE; + } + + if (attr_value->type != G_FILE_ATTRIBUTE_TYPE_STRING) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid attribute type (string expected)")); + return FALSE; + } + + if (!name_is_valid (escaped_attribute)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid extended attribute name")); + return FALSE; + } + + if (g_str_has_prefix (escaped_attribute, "xattr::")) + { + escaped_attribute += strlen ("xattr::"); + is_user = TRUE; + } + else + { + g_warn_if_fail (g_str_has_prefix (escaped_attribute, "xattr-sys::")); + escaped_attribute += strlen ("xattr-sys::"); + is_user = FALSE; + } + + attribute = hex_unescape_string (escaped_attribute, NULL, &free_attribute); + value = hex_unescape_string (attr_value->u.string, &val_len, &free_value); + + if (is_user) + a = g_strconcat ("user.", attribute, NULL); + else + a = attribute; + + res = g_setxattr (filename, a, value, val_len); + errsv = errno; + + if (is_user) + g_free (a); + + if (free_attribute) + g_free (attribute); + + if (free_value) + g_free (value); + + if (res == -1) + { + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting extended attribute '%s': %s"), + escaped_attribute, g_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + +#endif + + +void +_g_local_file_info_get_parent_info (const char *dir, + GFileAttributeMatcher *attribute_matcher, + GLocalParentFileInfo *parent_info) +{ + struct _g_stat_struct statbuf; + int res; + + parent_info->extra_data = NULL; + parent_info->free_extra_data = NULL; + parent_info->writable = FALSE; + parent_info->is_sticky = FALSE; + parent_info->has_trash_dir = FALSE; + parent_info->device = 0; + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME) || + _g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE) || + _g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH) || + _g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT)) + { + /* FIXME: Windows: The underlying _waccess() call in the C + * library is mostly pointless as it only looks at the READONLY + * FAT-style attribute of the file, it doesn't check the ACL at + * all. + */ + parent_info->writable = (g_access (dir, W_OK) == 0); + + res = g_stat (dir, &statbuf); + + /* + * The sticky bit (S_ISVTX) on a directory means that a file in that directory can be + * renamed or deleted only by the owner of the file, by the owner of the directory, and + * by a privileged process. + */ + if (res == 0) + { +#ifdef S_ISVTX + parent_info->is_sticky = (statbuf.st_mode & S_ISVTX) != 0; +#else + parent_info->is_sticky = FALSE; +#endif + parent_info->owner = statbuf.st_uid; + parent_info->device = statbuf.st_dev; + /* No need to find trash dir if it's not writable anyway */ + if (parent_info->writable && + _g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH)) + parent_info->has_trash_dir = _g_local_file_has_trash_dir (dir, statbuf.st_dev); + } + } +} + +void +_g_local_file_info_free_parent_info (GLocalParentFileInfo *parent_info) +{ + if (parent_info->extra_data && + parent_info->free_extra_data) + parent_info->free_extra_data (parent_info->extra_data); +} + +static void +get_access_rights (GFileAttributeMatcher *attribute_matcher, + GFileInfo *info, + const gchar *path, + GLocalFileStat *statbuf, + GLocalParentFileInfo *parent_info) +{ + /* FIXME: Windows: The underlyin _waccess() is mostly pointless */ + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_ACCESS_CAN_READ)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_READ, + g_access (path, R_OK) == 0); + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_ACCESS_CAN_WRITE)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_WRITE, + g_access (path, W_OK) == 0); + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_ACCESS_CAN_EXECUTE)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_EXECUTE, + g_access (path, X_OK) == 0); + + + if (parent_info) + { + gboolean writable; + + writable = FALSE; + if (parent_info->writable) + { + if (parent_info->is_sticky) + { +#ifndef G_OS_WIN32 + uid_t uid = geteuid (); + + if (uid == statbuf->st_uid || + uid == parent_info->owner || + uid == 0) +#endif + writable = TRUE; + } + else + writable = TRUE; + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME, + writable); + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE, + writable); + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH, + writable && parent_info->has_trash_dir); + } +} + +static void +set_info_from_stat (GFileInfo *info, + GLocalFileStat *statbuf, + GFileAttributeMatcher *attribute_matcher) +{ + GFileType file_type; + + file_type = G_FILE_TYPE_UNKNOWN; + + if (S_ISREG (statbuf->st_mode)) + file_type = G_FILE_TYPE_REGULAR; + else if (S_ISDIR (statbuf->st_mode)) + file_type = G_FILE_TYPE_DIRECTORY; +#ifndef G_OS_WIN32 + else if (S_ISCHR (statbuf->st_mode) || + S_ISBLK (statbuf->st_mode) || + S_ISFIFO (statbuf->st_mode) +#ifdef S_ISSOCK + || S_ISSOCK (statbuf->st_mode) +#endif + ) + file_type = G_FILE_TYPE_SPECIAL; +#endif +#ifdef S_ISLNK + else if (S_ISLNK (statbuf->st_mode)) + file_type = G_FILE_TYPE_SYMBOLIC_LINK; +#endif + + g_file_info_set_file_type (info, file_type); + g_file_info_set_size (info, statbuf->st_size); + + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_DEVICE, statbuf->st_dev); +#ifndef G_OS_WIN32 + /* Pointless setting these on Windows even if they exist in the struct */ + _g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_INODE, statbuf->st_ino); + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_NLINK, statbuf->st_nlink); + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_UID, statbuf->st_uid); + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_GID, statbuf->st_gid); + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_RDEV, statbuf->st_rdev); +#endif + /* FIXME: st_mode is mostly pointless on Windows, too. Set the attribute or not? */ + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_MODE, statbuf->st_mode); +#if defined (HAVE_STRUCT_STAT_ST_BLKSIZE) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_BLOCK_SIZE, statbuf->st_blksize); +#endif +#if defined (HAVE_STRUCT_STAT_ST_BLOCKS) + _g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_BLOCKS, statbuf->st_blocks); + _g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_STANDARD_ALLOCATED_SIZE, + statbuf->st_blocks * G_GUINT64_CONSTANT (512)); +#endif + + _g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_MODIFIED, statbuf->st_mtime); +#if defined (HAVE_STRUCT_STAT_ST_MTIMENSEC) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_MODIFIED_USEC, statbuf->st_mtimensec / 1000); +#elif defined (HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_MODIFIED_USEC, statbuf->st_mtim.tv_nsec / 1000); +#endif + + _g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_ACCESS, statbuf->st_atime); +#if defined (HAVE_STRUCT_STAT_ST_ATIMENSEC) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_ACCESS_USEC, statbuf->st_atimensec / 1000); +#elif defined (HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_ACCESS_USEC, statbuf->st_atim.tv_nsec / 1000); +#endif + + _g_file_info_set_attribute_uint64_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CHANGED, statbuf->st_ctime); +#if defined (HAVE_STRUCT_STAT_ST_CTIMENSEC) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CHANGED_USEC, statbuf->st_ctimensec / 1000); +#elif defined (HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC) + _g_file_info_set_attribute_uint32_by_id (info, G_FILE_ATTRIBUTE_ID_TIME_CHANGED_USEC, statbuf->st_ctim.tv_nsec / 1000); +#endif + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_ETAG_VALUE)) + { + char *etag = _g_local_file_info_create_etag (statbuf); + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_ETAG_VALUE, etag); + g_free (etag); + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_ID_FILE)) + { + char *id = _g_local_file_info_create_file_id (statbuf); + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_ID_FILE, id); + g_free (id); + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_ID_FILESYSTEM)) + { + char *id = _g_local_file_info_create_fs_id (statbuf); + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_ID_FILESYSTEM, id); + g_free (id); + } +} + +#ifndef G_OS_WIN32 + +static char * +make_valid_utf8 (const char *name) +{ + GString *string; + const gchar *remainder, *invalid; + gint remaining_bytes, valid_bytes; + + string = NULL; + remainder = name; + remaining_bytes = strlen (name); + + while (remaining_bytes != 0) + { + if (g_utf8_validate (remainder, remaining_bytes, &invalid)) + break; + valid_bytes = invalid - remainder; + + if (string == NULL) + string = g_string_sized_new (remaining_bytes); + + g_string_append_len (string, remainder, valid_bytes); + /* append U+FFFD REPLACEMENT CHARACTER */ + g_string_append (string, "\357\277\275"); + + remaining_bytes -= valid_bytes + 1; + remainder = invalid + 1; + } + + if (string == NULL) + return g_strdup (name); + + g_string_append (string, remainder); + + g_warn_if_fail (g_utf8_validate (string->str, -1, NULL)); + + return g_string_free (string, FALSE); +} + +static char * +convert_pwd_string_to_utf8 (char *pwd_str) +{ + char *utf8_string; + + if (!g_utf8_validate (pwd_str, -1, NULL)) + { + utf8_string = g_locale_to_utf8 (pwd_str, -1, NULL, NULL, NULL); + if (utf8_string == NULL) + utf8_string = make_valid_utf8 (pwd_str); + } + else + utf8_string = g_strdup (pwd_str); + + return utf8_string; +} + +static void +uid_data_free (UidData *data) +{ + g_free (data->user_name); + g_free (data->real_name); + g_free (data); +} + +/* called with lock held */ +static UidData * +lookup_uid_data (uid_t uid) +{ + UidData *data; + char buffer[4096]; + struct passwd pwbuf; + struct passwd *pwbufp; + char *gecos, *comma; + + if (uid_cache == NULL) + uid_cache = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)uid_data_free); + + data = g_hash_table_lookup (uid_cache, GINT_TO_POINTER (uid)); + + if (data) + return data; + + data = g_new0 (UidData, 1); + +#if defined(HAVE_POSIX_GETPWUID_R) + getpwuid_r (uid, &pwbuf, buffer, sizeof(buffer), &pwbufp); +#elif defined(HAVE_NONPOSIX_GETPWUID_R) + pwbufp = getpwuid_r (uid, &pwbuf, buffer, sizeof(buffer)); +#else + pwbufp = getpwuid (uid); +#endif + + if (pwbufp != NULL) + { + if (pwbufp->pw_name != NULL && pwbufp->pw_name[0] != 0) + data->user_name = convert_pwd_string_to_utf8 (pwbufp->pw_name); + + gecos = pwbufp->pw_gecos; + + if (gecos) + { + comma = strchr (gecos, ','); + if (comma) + *comma = 0; + data->real_name = convert_pwd_string_to_utf8 (gecos); + } + } + + /* Default fallbacks */ + if (data->real_name == NULL) + { + if (data->user_name != NULL) + data->real_name = g_strdup (data->user_name); + else + data->real_name = g_strdup_printf ("user #%d", (int)uid); + } + + if (data->user_name == NULL) + data->user_name = g_strdup_printf ("%d", (int)uid); + + g_hash_table_replace (uid_cache, GINT_TO_POINTER (uid), data); + + return data; +} + +static char * +get_username_from_uid (uid_t uid) +{ + char *res; + UidData *data; + + G_LOCK (uid_cache); + data = lookup_uid_data (uid); + res = g_strdup (data->user_name); + G_UNLOCK (uid_cache); + + return res; +} + +static char * +get_realname_from_uid (uid_t uid) +{ + char *res; + UidData *data; + + G_LOCK (uid_cache); + data = lookup_uid_data (uid); + res = g_strdup (data->real_name); + G_UNLOCK (uid_cache); + + return res; +} + +/* called with lock held */ +static char * +lookup_gid_name (gid_t gid) +{ + char *name; + char buffer[4096]; + struct group gbuf; + struct group *gbufp; + + if (gid_cache == NULL) + gid_cache = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_free); + + name = g_hash_table_lookup (gid_cache, GINT_TO_POINTER (gid)); + + if (name) + return name; + +#if defined (HAVE_POSIX_GETGRGID_R) + getgrgid_r (gid, &gbuf, buffer, sizeof(buffer), &gbufp); +#elif defined (HAVE_NONPOSIX_GETGRGID_R) + gbufp = getgrgid_r (gid, &gbuf, buffer, sizeof(buffer)); +#else + gbufp = getgrgid (gid); +#endif + + if (gbufp != NULL && + gbufp->gr_name != NULL && + gbufp->gr_name[0] != 0) + name = convert_pwd_string_to_utf8 (gbufp->gr_name); + else + name = g_strdup_printf("%d", (int)gid); + + g_hash_table_replace (gid_cache, GINT_TO_POINTER (gid), name); + + return name; +} + +static char * +get_groupname_from_gid (gid_t gid) +{ + char *res; + char *name; + + G_LOCK (gid_cache); + name = lookup_gid_name (gid); + res = g_strdup (name); + G_UNLOCK (gid_cache); + return res; +} + +#endif /* !G_OS_WIN32 */ + +static char * +get_content_type (const char *basename, + const char *path, + GLocalFileStat *statbuf, + gboolean is_symlink, + gboolean symlink_broken, + GFileQueryInfoFlags flags, + gboolean fast) +{ + if (is_symlink && + (symlink_broken || (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS))) + return g_strdup ("inode/symlink"); + else if (S_ISDIR(statbuf->st_mode)) + return g_strdup ("inode/directory"); +#ifndef G_OS_WIN32 + else if (S_ISCHR(statbuf->st_mode)) + return g_strdup ("inode/chardevice"); + else if (S_ISBLK(statbuf->st_mode)) + return g_strdup ("inode/blockdevice"); + else if (S_ISFIFO(statbuf->st_mode)) + return g_strdup ("inode/fifo"); +#endif +#ifdef S_ISSOCK + else if (S_ISSOCK(statbuf->st_mode)) + return g_strdup ("inode/socket"); +#endif + else + { + char *content_type; + gboolean result_uncertain; + + content_type = g_content_type_guess (basename, NULL, 0, &result_uncertain); + +#ifndef G_OS_WIN32 + if (!fast && result_uncertain && path != NULL) + { + guchar sniff_buffer[4096]; + gsize sniff_length; + int fd; + + sniff_length = _g_unix_content_type_get_sniff_len (); + if (sniff_length > 4096) + sniff_length = 4096; + +#ifdef O_NOATIME + fd = open (path, O_RDONLY | O_NOATIME); + if (fd < 0 && errno == EPERM) +#endif + fd = open (path, O_RDONLY); + + if (fd != -1) + { + ssize_t res; + + res = read (fd, sniff_buffer, sniff_length); + close (fd); + if (res >= 0) + { + g_free (content_type); + content_type = g_content_type_guess (basename, sniff_buffer, res, NULL); + } + } + } +#endif + + return content_type; + } + +} + +static void +get_thumbnail_attributes (const char *path, + GFileInfo *info) +{ + GChecksum *checksum; + char *uri; + char *filename; + char *basename; + + uri = g_filename_to_uri (path, NULL, NULL); + + checksum = g_checksum_new (G_CHECKSUM_MD5); + g_checksum_update (checksum, (const guchar *) uri, strlen (uri)); + + g_free (uri); + + basename = g_strconcat (g_checksum_get_string (checksum), ".png", NULL); + g_checksum_free (checksum); + + filename = g_build_filename (g_get_home_dir (), + ".thumbnails", "normal", basename, + NULL); + + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) + _g_file_info_set_attribute_byte_string_by_id (info, G_FILE_ATTRIBUTE_ID_THUMBNAIL_PATH, filename); + else + { + g_free (filename); + filename = g_build_filename (g_get_home_dir (), + ".thumbnails", "fail", + "gnome-thumbnail-factory", + basename, + NULL); + + if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_THUMBNAILING_FAILED, TRUE); + } + g_free (basename); + g_free (filename); +} + +#ifdef G_OS_WIN32 +static void +win32_get_file_user_info (const gchar *filename, + gchar **group_name, + gchar **user_name, + gchar **real_name) +{ + PSECURITY_DESCRIPTOR psd = NULL; + DWORD sd_size = 0; /* first call calculates the size required */ + + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + if ((GetFileSecurityW (wfilename, + GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, + NULL, + sd_size, + &sd_size) || (ERROR_INSUFFICIENT_BUFFER == GetLastError())) && + (psd = g_try_malloc (sd_size)) != NULL && + GetFileSecurityW (wfilename, + GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, + psd, + sd_size, + &sd_size)) + { + PSID psid = 0; + BOOL defaulted; + SID_NAME_USE name_use = 0; /* don't care? */ + wchar_t *name = NULL; + wchar_t *domain = NULL; + DWORD name_len = 0; + DWORD domain_len = 0; + /* get the user name */ + do { + if (!user_name) + break; + if (!GetSecurityDescriptorOwner (psd, &psid, &defaulted)) + break; + if (!LookupAccountSidW (NULL, /* local machine */ + psid, + name, &name_len, + domain, &domain_len, /* no domain info yet */ + &name_use) && (ERROR_INSUFFICIENT_BUFFER != GetLastError())) + break; + name = g_try_malloc (name_len * sizeof (wchar_t)); + domain = g_try_malloc (domain_len * sizeof (wchar_t)); + if (name && domain && + LookupAccountSidW (NULL, /* local machine */ + psid, + name, &name_len, + domain, &domain_len, /* no domain info yet */ + &name_use)) + { + *user_name = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL); + } + g_free (name); + g_free (domain); + } while (FALSE); + + /* get the group name */ + do { + if (!group_name) + break; + if (!GetSecurityDescriptorGroup (psd, &psid, &defaulted)) + break; + if (!LookupAccountSidW (NULL, /* local machine */ + psid, + name, &name_len, + domain, &domain_len, /* no domain info yet */ + &name_use) && (ERROR_INSUFFICIENT_BUFFER != GetLastError())) + break; + name = g_try_malloc (name_len * sizeof (wchar_t)); + domain = g_try_malloc (domain_len * sizeof (wchar_t)); + if (name && domain && + LookupAccountSidW (NULL, /* local machine */ + psid, + name, &name_len, + domain, &domain_len, /* no domain info yet */ + &name_use)) + { + *group_name = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL); + } + g_free (name); + g_free (domain); + } while (FALSE); + + /* TODO: get real name */ + + g_free (psd); + } + g_free (wfilename); +} +#endif /* G_OS_WIN32 */ + +GFileInfo * +_g_local_file_info_get (const char *basename, + const char *path, + GFileAttributeMatcher *attribute_matcher, + GFileQueryInfoFlags flags, + GLocalParentFileInfo *parent_info, + GError **error) +{ + GFileInfo *info; + GLocalFileStat statbuf; +#ifdef S_ISLNK + struct stat statbuf2; +#endif + int res; + gboolean is_symlink, symlink_broken; +#ifdef G_OS_WIN32 + DWORD dos_attributes; +#endif + char *symlink_target; + GVfs *vfs; + GVfsClass *class; + guint64 device; + + info = g_file_info_new (); + + /* Make sure we don't set any unwanted attributes */ + g_file_info_set_attribute_mask (info, attribute_matcher); + + g_file_info_set_name (info, basename); + + /* Avoid stat in trivial case */ + if (attribute_matcher == NULL) + return info; + +#ifndef G_OS_WIN32 + res = g_lstat (path, &statbuf); +#else + { + wchar_t *wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, error); + int len; + + if (wpath == NULL) + { + g_object_unref (info); + return NULL; + } + + len = wcslen (wpath); + while (len > 0 && G_IS_DIR_SEPARATOR (wpath[len-1])) + len--; + if (len > 0 && + (!g_path_is_absolute (path) || len > g_path_skip_root (path) - path)) + wpath[len] = '\0'; + + res = _wstati64 (wpath, &statbuf); + dos_attributes = GetFileAttributesW (wpath); + + g_free (wpath); + } +#endif + + if (res == -1) + { + int errsv = errno; + char *display_name = g_filename_display_name (path); + g_object_unref (info); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error stating file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + return NULL; + } + + device = statbuf.st_dev; + +#ifdef S_ISLNK + is_symlink = S_ISLNK (statbuf.st_mode); +#else + is_symlink = FALSE; +#endif + symlink_broken = FALSE; +#ifdef S_ISLNK + if (is_symlink) + { + g_file_info_set_is_symlink (info, TRUE); + + /* Unless NOFOLLOW was set we default to following symlinks */ + if (!(flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS)) + { + res = stat (path, &statbuf2); + + /* Report broken links as symlinks */ + if (res != -1) + statbuf = statbuf2; + else + symlink_broken = TRUE; + } + } +#endif + + set_info_from_stat (info, &statbuf, attribute_matcher); + +#ifndef G_OS_WIN32 + if (basename != NULL && basename[0] == '.') + g_file_info_set_is_hidden (info, TRUE); + + if (basename != NULL && basename[strlen (basename) -1] == '~' && + S_ISREG (statbuf.st_mode)) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_STANDARD_IS_BACKUP, TRUE); +#else + if (dos_attributes & FILE_ATTRIBUTE_HIDDEN) + g_file_info_set_is_hidden (info, TRUE); + + if (dos_attributes & FILE_ATTRIBUTE_ARCHIVE) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_DOS_IS_ARCHIVE, TRUE); + + if (dos_attributes & FILE_ATTRIBUTE_SYSTEM) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_DOS_IS_SYSTEM, TRUE); +#endif + + symlink_target = NULL; +#ifdef S_ISLNK + if (is_symlink) + { + symlink_target = read_link (path); + if (symlink_target && + _g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_SYMLINK_TARGET)) + g_file_info_set_symlink_target (info, symlink_target); + } +#endif + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_DISPLAY_NAME)) + { + char *display_name = g_filename_display_basename (path); + + /* look for U+FFFD REPLACEMENT CHARACTER */ + if (strstr (display_name, "\357\277\275") != NULL) + { + char *p = display_name; + display_name = g_strconcat (display_name, _(" (invalid encoding)"), NULL); + g_free (p); + } + g_file_info_set_display_name (info, display_name); + g_free (display_name); + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_EDIT_NAME)) + { + char *edit_name = g_filename_display_basename (path); + g_file_info_set_edit_name (info, edit_name); + g_free (edit_name); + } + + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_COPY_NAME)) + { + char *copy_name = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL); + if (copy_name) + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_STANDARD_COPY_NAME, copy_name); + g_free (copy_name); + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE) || + _g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_ICON)) + { + char *content_type = get_content_type (basename, path, &statbuf, is_symlink, symlink_broken, flags, FALSE); + + if (content_type) + { + g_file_info_set_content_type (info, content_type); + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_ICON)) + { + GIcon *icon; + + if (strcmp (path, g_get_home_dir ()) == 0) + icon = g_themed_icon_new ("user-home"); + else if (strcmp (path, g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)) == 0) + icon = g_themed_icon_new ("user-desktop"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-documents"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-download"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-music"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PICTURES)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-pictures"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-publicshare"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_TEMPLATES)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-templates"); + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS)) == 0) + icon = g_themed_icon_new_with_default_fallbacks ("folder-videos"); + else + { + icon = g_content_type_get_icon (content_type); + if (G_IS_THEMED_ICON (icon)) + { + const char *type_icon = NULL; + + if (S_ISDIR (statbuf.st_mode)) + type_icon = "folder"; + if (type_icon) + g_themed_icon_append_name (G_THEMED_ICON (icon), type_icon); + } + } + + if (icon != NULL) + { + g_file_info_set_icon (info, icon); + g_object_unref (icon); + } + } + + g_free (content_type); + } + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_FAST_CONTENT_TYPE)) + { + char *content_type = get_content_type (basename, path, &statbuf, is_symlink, symlink_broken, flags, TRUE); + + if (content_type) + { + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_STANDARD_FAST_CONTENT_TYPE, content_type); + g_free (content_type); + } + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_OWNER_USER)) + { + char *name = NULL; + +#ifdef G_OS_WIN32 + win32_get_file_user_info (path, NULL, &name, NULL); +#else + name = get_username_from_uid (statbuf.st_uid); +#endif + if (name) + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_OWNER_USER, name); + g_free (name); + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_OWNER_USER_REAL)) + { + char *name = NULL; +#ifdef G_OS_WIN32 + win32_get_file_user_info (path, NULL, NULL, &name); +#else + name = get_realname_from_uid (statbuf.st_uid); +#endif + if (name) + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_OWNER_USER_REAL, name); + g_free (name); + } + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_OWNER_GROUP)) + { + char *name = NULL; +#ifdef G_OS_WIN32 + win32_get_file_user_info (path, &name, NULL, NULL); +#else + name = get_groupname_from_gid (statbuf.st_gid); +#endif + if (name) + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_OWNER_GROUP, name); + g_free (name); + } + + if (parent_info && parent_info->device != 0 && + _g_file_attribute_matcher_matches_id (attribute_matcher, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT) && + statbuf.st_dev != parent_info->device) + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_UNIX_IS_MOUNTPOINT, TRUE); + + get_access_rights (attribute_matcher, info, path, &statbuf, parent_info); + +#ifdef HAVE_SELINUX + get_selinux_context (path, info, attribute_matcher, (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) == 0); +#endif + get_xattrs (path, TRUE, info, attribute_matcher, (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) == 0); + get_xattrs (path, FALSE, info, attribute_matcher, (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) == 0); + + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_THUMBNAIL_PATH)) + get_thumbnail_attributes (path, info); + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_add_info) + { + class->local_file_add_info (vfs, + path, + device, + attribute_matcher, + info, + NULL, + &parent_info->extra_data, + &parent_info->free_extra_data); + } + + g_file_info_unset_attribute_mask (info); + + g_free (symlink_target); + + return info; +} + +GFileInfo * +_g_local_file_info_get_from_fd (int fd, + const char *attributes, + GError **error) +{ + GLocalFileStat stat_buf; + GFileAttributeMatcher *matcher; + GFileInfo *info; + +#ifdef G_OS_WIN32 +#define FSTAT _fstati64 +#else +#define FSTAT fstat +#endif + + if (FSTAT (fd, &stat_buf) == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error stating file descriptor: %s"), + g_strerror (errsv)); + return NULL; + } + + info = g_file_info_new (); + + matcher = g_file_attribute_matcher_new (attributes); + + /* Make sure we don't set any unwanted attributes */ + g_file_info_set_attribute_mask (info, matcher); + + set_info_from_stat (info, &stat_buf, matcher); + +#ifdef HAVE_SELINUX + if (_g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_SELINUX_CONTEXT) && + is_selinux_enabled ()) + { + char *context; + if (fgetfilecon_raw (fd, &context) >= 0) + { + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_SELINUX_CONTEXT, context); + freecon (context); + } + } +#endif + + get_xattrs_from_fd (fd, TRUE, info, matcher); + get_xattrs_from_fd (fd, FALSE, info, matcher); + + g_file_attribute_matcher_unref (matcher); + + g_file_info_unset_attribute_mask (info); + + return info; +} + +static gboolean +get_uint32 (const GFileAttributeValue *value, + guint32 *val_out, + GError **error) +{ + if (value->type != G_FILE_ATTRIBUTE_TYPE_UINT32) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid attribute type (uint32 expected)")); + return FALSE; + } + + *val_out = value->u.uint32; + + return TRUE; +} + +#ifdef HAVE_UTIMES +static gboolean +get_uint64 (const GFileAttributeValue *value, + guint64 *val_out, + GError **error) +{ + if (value->type != G_FILE_ATTRIBUTE_TYPE_UINT64) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid attribute type (uint64 expected)")); + return FALSE; + } + + *val_out = value->u.uint64; + + return TRUE; +} +#endif + +#if defined(HAVE_SYMLINK) +static gboolean +get_byte_string (const GFileAttributeValue *value, + const char **val_out, + GError **error) +{ + if (value->type != G_FILE_ATTRIBUTE_TYPE_BYTE_STRING) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid attribute type (byte string expected)")); + return FALSE; + } + + *val_out = value->u.string; + + return TRUE; +} +#endif + +#ifdef HAVE_SELINUX +static gboolean +get_string (const GFileAttributeValue *value, + const char **val_out, + GError **error) +{ + if (value->type != G_FILE_ATTRIBUTE_TYPE_STRING) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid attribute type (byte string expected)")); + return FALSE; + } + + *val_out = value->u.string; + + return TRUE; +} +#endif + +static gboolean +set_unix_mode (char *filename, + GFileQueryInfoFlags flags, + const GFileAttributeValue *value, + GError **error) +{ + guint32 val; + int res = 0; + + if (!get_uint32 (value, &val, error)) + return FALSE; + +#ifdef HAVE_SYMLINK + if (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) { +#ifdef HAVE_LCHMOD + res = lchmod (filename, val); +#else + struct stat statbuf; + /* Calling chmod on a symlink changes permissions on the symlink. + * We don't want to do this, so we need to check for a symlink */ + res = g_lstat (filename, &statbuf); + if (res == 0 && S_ISLNK (statbuf.st_mode)) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Cannot set permissions on symlinks")); + return FALSE; + } + else if (res == 0) + res = g_chmod (filename, val); +#endif + } else +#endif + res = g_chmod (filename, val); + + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting permissions: %s"), + g_strerror (errsv)); + return FALSE; + } + return TRUE; +} + +#ifdef HAVE_CHOWN +static gboolean +set_unix_uid_gid (char *filename, + const GFileAttributeValue *uid_value, + const GFileAttributeValue *gid_value, + GFileQueryInfoFlags flags, + GError **error) +{ + int res; + guint32 val; + uid_t uid; + gid_t gid; + + if (uid_value) + { + if (!get_uint32 (uid_value, &val, error)) + return FALSE; + uid = val; + } + else + uid = -1; + + if (gid_value) + { + if (!get_uint32 (gid_value, &val, error)) + return FALSE; + gid = val; + } + else + gid = -1; + +#ifdef HAVE_LCHOWN + if (flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS) + res = lchown (filename, uid, gid); + else +#endif + res = chown (filename, uid, gid); + + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting owner: %s"), + g_strerror (errsv)); + return FALSE; + } + return TRUE; +} +#endif + +#ifdef HAVE_SYMLINK +static gboolean +set_symlink (char *filename, + const GFileAttributeValue *value, + GError **error) +{ + const char *val; + struct stat statbuf; + + if (!get_byte_string (value, &val, error)) + return FALSE; + + if (val == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("symlink must be non-NULL")); + return FALSE; + } + + if (g_lstat (filename, &statbuf)) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting symlink: %s"), + g_strerror (errsv)); + return FALSE; + } + + if (!S_ISLNK (statbuf.st_mode)) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SYMBOLIC_LINK, + _("Error setting symlink: file is not a symlink")); + return FALSE; + } + + if (g_unlink (filename)) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting symlink: %s"), + g_strerror (errsv)); + return FALSE; + } + + if (symlink (filename, val) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting symlink: %s"), + g_strerror (errsv)); + return FALSE; + } + + return TRUE; +} +#endif + +#ifdef HAVE_UTIMES +static int +lazy_stat (char *filename, + struct stat *statbuf, + gboolean *called_stat) +{ + int res; + + if (*called_stat) + return 0; + + res = g_stat (filename, statbuf); + + if (res == 0) + *called_stat = TRUE; + + return res; +} + + +static gboolean +set_mtime_atime (char *filename, + const GFileAttributeValue *mtime_value, + const GFileAttributeValue *mtime_usec_value, + const GFileAttributeValue *atime_value, + const GFileAttributeValue *atime_usec_value, + GError **error) +{ + int res; + guint64 val; + guint32 val_usec; + struct stat statbuf; + gboolean got_stat = FALSE; + struct timeval times[2] = { {0, 0}, {0, 0} }; + + /* ATIME */ + if (atime_value) + { + if (!get_uint64 (atime_value, &val, error)) + return FALSE; + times[0].tv_sec = val; + } + else + { + if (lazy_stat (filename, &statbuf, &got_stat) == 0) + { + times[0].tv_sec = statbuf.st_mtime; +#if defined (HAVE_STRUCT_STAT_ST_ATIMENSEC) + times[0].tv_usec = statbuf.st_atimensec / 1000; +#elif defined (HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC) + times[0].tv_usec = statbuf.st_atim.tv_nsec / 1000; +#endif + } + } + + if (atime_usec_value) + { + if (!get_uint32 (atime_usec_value, &val_usec, error)) + return FALSE; + times[0].tv_usec = val_usec; + } + + /* MTIME */ + if (mtime_value) + { + if (!get_uint64 (mtime_value, &val, error)) + return FALSE; + times[1].tv_sec = val; + } + else + { + if (lazy_stat (filename, &statbuf, &got_stat) == 0) + { + times[1].tv_sec = statbuf.st_mtime; +#if defined (HAVE_STRUCT_STAT_ST_MTIMENSEC) + times[1].tv_usec = statbuf.st_mtimensec / 1000; +#elif defined (HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) + times[1].tv_usec = statbuf.st_mtim.tv_nsec / 1000; +#endif + } + } + + if (mtime_usec_value) + { + if (!get_uint32 (mtime_usec_value, &val_usec, error)) + return FALSE; + times[1].tv_usec = val_usec; + } + + res = utimes (filename, times); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting modification or access time: %s"), + g_strerror (errsv)); + return FALSE; + } + return TRUE; +} +#endif + + +#ifdef HAVE_SELINUX +static gboolean +set_selinux_context (char *filename, + const GFileAttributeValue *value, + GError **error) +{ + const char *val; + + if (!get_string (value, &val, error)) + return FALSE; + + if (val == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("SELinux context must be non-NULL")); + return FALSE; + } + + if (is_selinux_enabled ()) { + security_context_t val_s; + + val_s = g_strdup (val); + + if (setfilecon_raw (filename, val_s) < 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error setting SELinux context: %s"), + g_strerror (errsv)); + return FALSE; + } + g_free (val_s); + } else { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("SELinux is not enabled on this system")); + return FALSE; + } + + return TRUE; +} +#endif + + +gboolean +_g_local_file_info_set_attribute (char *filename, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileAttributeValue value = { 0 }; + GVfsClass *class; + GVfs *vfs; + + _g_file_attribute_value_set_from_pointer (&value, type, value_p, FALSE); + + if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_MODE) == 0) + return set_unix_mode (filename, flags, &value, error); + +#ifdef HAVE_CHOWN + else if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_UID) == 0) + return set_unix_uid_gid (filename, &value, NULL, flags, error); + else if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_GID) == 0) + return set_unix_uid_gid (filename, NULL, &value, flags, error); +#endif + +#ifdef HAVE_SYMLINK + else if (strcmp (attribute, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET) == 0) + return set_symlink (filename, &value, error); +#endif + +#ifdef HAVE_UTIMES + else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_MODIFIED) == 0) + return set_mtime_atime (filename, &value, NULL, NULL, NULL, error); + else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC) == 0) + return set_mtime_atime (filename, NULL, &value, NULL, NULL, error); + else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_ACCESS) == 0) + return set_mtime_atime (filename, NULL, NULL, &value, NULL, error); + else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_ACCESS_USEC) == 0) + return set_mtime_atime (filename, NULL, NULL, NULL, &value, error); +#endif + +#ifdef HAVE_XATTR + else if (g_str_has_prefix (attribute, "xattr::")) + return set_xattr (filename, attribute, &value, error); + else if (g_str_has_prefix (attribute, "xattr-sys::")) + return set_xattr (filename, attribute, &value, error); +#endif + +#ifdef HAVE_SELINUX + else if (strcmp (attribute, G_FILE_ATTRIBUTE_SELINUX_CONTEXT) == 0) + return set_selinux_context (filename, &value, error); +#endif + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_set_attributes) + { + GFileInfo *info; + + info = g_file_info_new (); + g_file_info_set_attribute (info, + attribute, + type, + value_p); + if (!class->local_file_set_attributes (vfs, filename, + info, + flags, cancellable, + error)) + { + g_object_unref (info); + return FALSE; + } + + if (g_file_info_get_attribute_status (info, attribute) == G_FILE_ATTRIBUTE_STATUS_SET) + { + g_object_unref (info); + return TRUE; + } + + g_object_unref (info); + } + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Setting attribute %s not supported"), attribute); + return FALSE; +} + +gboolean +_g_local_file_info_set_attributes (char *filename, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GFileAttributeValue *value; +#ifdef HAVE_CHOWN + GFileAttributeValue *uid, *gid; +#endif +#ifdef HAVE_UTIMES + GFileAttributeValue *mtime, *mtime_usec, *atime, *atime_usec; +#endif +#if defined (HAVE_CHOWN) || defined (HAVE_UTIMES) + GFileAttributeStatus status; +#endif + gboolean res; + GVfsClass *class; + GVfs *vfs; + + /* Handles setting multiple specified data in a single set, and takes care + of ordering restrictions when setting attributes */ + + res = TRUE; + + /* Set symlink first, since this recreates the file */ +#ifdef HAVE_SYMLINK + value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET); + if (value) + { + if (!set_symlink (filename, value, error)) + { + value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + else + value->status = G_FILE_ATTRIBUTE_STATUS_SET; + + } +#endif + +#ifdef HAVE_CHOWN + /* Group uid and gid setting into one call + * Change ownership before permissions, since ownership changes can + change permissions (e.g. setuid) + */ + uid = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_UID); + gid = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_GID); + + if (uid || gid) + { + if (!set_unix_uid_gid (filename, uid, gid, flags, error)) + { + status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + else + status = G_FILE_ATTRIBUTE_STATUS_SET; + if (uid) + uid->status = status; + if (gid) + gid->status = status; + } +#endif + + value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_MODE); + if (value) + { + if (!set_unix_mode (filename, flags, value, error)) + { + value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + else + value->status = G_FILE_ATTRIBUTE_STATUS_SET; + + } + +#ifdef HAVE_UTIMES + /* Group all time settings into one call + * Change times as the last thing to avoid it changing due to metadata changes + */ + + mtime = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); + mtime_usec = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC); + atime = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_ACCESS); + atime_usec = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_ACCESS_USEC); + + if (mtime || mtime_usec || atime || atime_usec) + { + if (!set_mtime_atime (filename, mtime, mtime_usec, atime, atime_usec, error)) + { + status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + else + status = G_FILE_ATTRIBUTE_STATUS_SET; + + if (mtime) + mtime->status = status; + if (mtime_usec) + mtime_usec->status = status; + if (atime) + atime->status = status; + if (atime_usec) + atime_usec->status = status; + } +#endif + + /* xattrs are handled by default callback */ + + + /* SELinux context */ +#ifdef HAVE_SELINUX + if (is_selinux_enabled ()) { + value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_SELINUX_CONTEXT); + if (value) + { + if (!set_selinux_context (filename, value, error)) + { + value->status = G_FILE_ATTRIBUTE_STATUS_ERROR_SETTING; + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + else + value->status = G_FILE_ATTRIBUTE_STATUS_SET; + } + } +#endif + + vfs = g_vfs_get_default (); + class = G_VFS_GET_CLASS (vfs); + if (class->local_file_set_attributes) + { + if (!class->local_file_set_attributes (vfs, filename, + info, + flags, cancellable, + error)) + { + res = FALSE; + /* Don't set error multiple times */ + error = NULL; + } + } + + return res; +} diff --git a/gio/glocalfileinfo.h b/gio/glocalfileinfo.h new file mode 100644 index 0000000..82ad746 --- /dev/null +++ b/gio/glocalfileinfo.h @@ -0,0 +1,86 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_INFO_H__ +#define __G_LOCAL_FILE_INFO_H__ + +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +G_BEGIN_DECLS + +typedef struct +{ + gboolean writable; + gboolean is_sticky; + gboolean has_trash_dir; + int owner; + dev_t device; + gpointer extra_data; + GDestroyNotify free_extra_data; +} GLocalParentFileInfo; + +#ifdef G_OS_WIN32 +/* We want 64-bit file size support */ +#define GLocalFileStat struct _stati64 +#else +#define GLocalFileStat struct stat +#endif + +gboolean _g_local_file_has_trash_dir (const char *dirname, + dev_t dir_dev); +void _g_local_file_info_get_parent_info (const char *dir, + GFileAttributeMatcher *attribute_matcher, + GLocalParentFileInfo *parent_info); +void _g_local_file_info_free_parent_info (GLocalParentFileInfo *parent_info); +GFileInfo *_g_local_file_info_get (const char *basename, + const char *path, + GFileAttributeMatcher *attribute_matcher, + GFileQueryInfoFlags flags, + GLocalParentFileInfo *parent_info, + GError **error); +GFileInfo *_g_local_file_info_get_from_fd (int fd, + const char *attributes, + GError **error); +char * _g_local_file_info_create_etag (GLocalFileStat *statbuf); +gboolean _g_local_file_info_set_attribute (char *filename, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +gboolean _g_local_file_info_set_attributes (char *filename, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_FILE_LOCAL_FILE_INFO_H__ */ + + diff --git a/gio/glocalfileinputstream.c b/gio/glocalfileinputstream.c new file mode 100644 index 0000000..2411ceb --- /dev/null +++ b/gio/glocalfileinputstream.c @@ -0,0 +1,358 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include +#include +#include "gcancellable.h" +#include "gfiledescriptorbased.h" +#include "gioerror.h" +#include "glocalfileinputstream.h" +#include "glocalfileinfo.h" +#include "glibintl.h" + +#ifdef G_OS_WIN32 +#include +#endif + +#include "gioalias.h" + + +static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); +#define g_local_file_input_stream_get_type _g_local_file_input_stream_get_type +G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, + g_file_descriptor_based_iface_init)); + +struct _GLocalFileInputStreamPrivate { + int fd; + guint do_close : 1; +}; + +static gssize g_local_file_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gssize g_local_file_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_local_file_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); +static goffset g_local_file_input_stream_tell (GFileInputStream *stream); +static gboolean g_local_file_input_stream_can_seek (GFileInputStream *stream); +static gboolean g_local_file_input_stream_seek (GFileInputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static GFileInfo *g_local_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +static int g_local_file_input_stream_get_fd (GFileDescriptorBased *stream); + +static void +g_local_file_input_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_local_file_input_stream_parent_class)->finalize (object); +} + +void +_g_local_file_input_stream_set_do_close (GLocalFileInputStream *in, + gboolean do_close) +{ + in->priv->do_close = do_close; +} + +static void +g_local_file_input_stream_class_init (GLocalFileInputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); + GFileInputStreamClass *file_stream_class = G_FILE_INPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GLocalFileInputStreamPrivate)); + + gobject_class->finalize = g_local_file_input_stream_finalize; + + stream_class->read_fn = g_local_file_input_stream_read; + stream_class->skip = g_local_file_input_stream_skip; + stream_class->close_fn = g_local_file_input_stream_close; + file_stream_class->tell = g_local_file_input_stream_tell; + file_stream_class->can_seek = g_local_file_input_stream_can_seek; + file_stream_class->seek = g_local_file_input_stream_seek; + file_stream_class->query_info = g_local_file_input_stream_query_info; +} + +static void +g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = g_local_file_input_stream_get_fd; +} + +static void +g_local_file_input_stream_init (GLocalFileInputStream *info) +{ + info->priv = G_TYPE_INSTANCE_GET_PRIVATE (info, + G_TYPE_LOCAL_FILE_INPUT_STREAM, + GLocalFileInputStreamPrivate); + info->priv->do_close = TRUE; +} + +GFileInputStream * +_g_local_file_input_stream_new (int fd) +{ + GLocalFileInputStream *stream; + + stream = g_object_new (G_TYPE_LOCAL_FILE_INPUT_STREAM, NULL); + stream->priv->fd = fd; + + return G_FILE_INPUT_STREAM (stream); +} + +static gssize +g_local_file_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GLocalFileInputStream *file; + gssize res; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + res = -1; + while (1) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + break; + res = read (file->priv->fd, buffer, count); + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from file: %s"), + g_strerror (errsv)); + } + + break; + } + + return res; +} + +static gssize +g_local_file_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + off_t res, start; + GLocalFileInputStream *file; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + start = lseek (file->priv->fd, 0, SEEK_CUR); + if (start == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error seeking in file: %s"), + g_strerror (errsv)); + return -1; + } + + res = lseek (file->priv->fd, count, SEEK_CUR); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error seeking in file: %s"), + g_strerror (errsv)); + return -1; + } + + return res - start; +} + +static gboolean +g_local_file_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GLocalFileInputStream *file; + int res; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + if (!file->priv->do_close) + return TRUE; + + if (file->priv->fd == -1) + return TRUE; + + while (1) + { + res = close (file->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing file: %s"), + g_strerror (errsv)); + } + break; + } + + return res != -1; +} + + +static goffset +g_local_file_input_stream_tell (GFileInputStream *stream) +{ + GLocalFileInputStream *file; + off_t pos; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + pos = lseek (file->priv->fd, 0, SEEK_CUR); + + if (pos == (off_t)-1) + return 0; + + return pos; +} + +static gboolean +g_local_file_input_stream_can_seek (GFileInputStream *stream) +{ + GLocalFileInputStream *file; + off_t pos; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + pos = lseek (file->priv->fd, 0, SEEK_CUR); + + if (pos == (off_t)-1 && errno == ESPIPE) + return FALSE; + + return TRUE; +} + +static int +seek_type_to_lseek (GSeekType type) +{ + switch (type) + { + default: + case G_SEEK_CUR: + return SEEK_CUR; + + case G_SEEK_SET: + return SEEK_SET; + + case G_SEEK_END: + return SEEK_END; + } +} + +static gboolean +g_local_file_input_stream_seek (GFileInputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GLocalFileInputStream *file; + off_t pos; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + pos = lseek (file->priv->fd, offset, seek_type_to_lseek (type)); + + if (pos == (off_t)-1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error seeking in file: %s"), + g_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + +static GFileInfo * +g_local_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GLocalFileInputStream *file; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + return _g_local_file_info_get_from_fd (file->priv->fd, + attributes, + error); +} + +static int +g_local_file_input_stream_get_fd (GFileDescriptorBased *fd_based) +{ + GLocalFileInputStream *stream = G_LOCAL_FILE_INPUT_STREAM (fd_based); + return stream->priv->fd; +} + diff --git a/gio/glocalfileinputstream.h b/gio/glocalfileinputstream.h new file mode 100644 index 0000000..28f28bf --- /dev/null +++ b/gio/glocalfileinputstream.h @@ -0,0 +1,63 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_INPUT_STREAM_H__ +#define __G_LOCAL_FILE_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_FILE_INPUT_STREAM (_g_local_file_input_stream_get_type ()) +#define G_LOCAL_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_FILE_INPUT_STREAM, GLocalFileInputStream)) +#define G_LOCAL_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_LOCAL_FILE_INPUT_STREAM, GLocalFileInputStreamClass)) +#define G_IS_LOCAL_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE_INPUT_STREAM)) +#define G_IS_LOCAL_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE_INPUT_STREAM)) +#define G_LOCAL_FILE_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_LOCAL_FILE_INPUT_STREAM, GLocalFileInputStreamClass)) + +typedef struct _GLocalFileInputStream GLocalFileInputStream; +typedef struct _GLocalFileInputStreamClass GLocalFileInputStreamClass; +typedef struct _GLocalFileInputStreamPrivate GLocalFileInputStreamPrivate; + +struct _GLocalFileInputStream +{ + GFileInputStream parent_instance; + + /*< private >*/ + GLocalFileInputStreamPrivate *priv; +}; + +struct _GLocalFileInputStreamClass +{ + GFileInputStreamClass parent_class; +}; + +GType _g_local_file_input_stream_get_type (void) G_GNUC_CONST; + +GFileInputStream *_g_local_file_input_stream_new (int fd); +void _g_local_file_input_stream_set_do_close (GLocalFileInputStream *in, + gboolean do_close); + + +G_END_DECLS + +#endif /* __G_LOCAL_FILE_INPUT_STREAM_H__ */ diff --git a/gio/glocalfileiostream.c b/gio/glocalfileiostream.c new file mode 100644 index 0000000..e1f295c --- /dev/null +++ b/gio/glocalfileiostream.c @@ -0,0 +1,115 @@ +/* GIO - GLib Input, IO and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include "glibintl.h" +#include "gioerror.h" +#include "gcancellable.h" +#include "gfiledescriptorbased.h" +#include "glocalfileiostream.h" +#include "glocalfileinputstream.h" +#include "glocalfileinfo.h" + +#include "gioalias.h" + +#define g_local_file_io_stream_get_type _g_local_file_io_stream_get_type +G_DEFINE_TYPE (GLocalFileIOStream, g_local_file_io_stream, G_TYPE_FILE_IO_STREAM); + +static void +g_local_file_io_stream_finalize (GObject *object) +{ + GLocalFileIOStream *file; + + file = G_LOCAL_FILE_IO_STREAM (object); + + g_object_unref (file->input_stream); + g_object_unref (file->output_stream); + + G_OBJECT_CLASS (g_local_file_io_stream_parent_class)->finalize (object); +} + +GFileIOStream * +_g_local_file_io_stream_new (GLocalFileOutputStream *output_stream) +{ + GLocalFileIOStream *stream; + int fd; + + stream = g_object_new (G_TYPE_LOCAL_FILE_IO_STREAM, NULL); + stream->output_stream = g_object_ref (output_stream); + _g_local_file_output_stream_set_do_close (output_stream, FALSE); + fd = g_file_descriptor_based_get_fd (G_FILE_DESCRIPTOR_BASED (output_stream)); + stream->input_stream = (GInputStream *)_g_local_file_input_stream_new (fd); + _g_local_file_input_stream_set_do_close (G_LOCAL_FILE_INPUT_STREAM (stream->input_stream), + FALSE); + + return G_FILE_IO_STREAM (stream); +} + +static GInputStream * +g_local_file_io_stream_get_input_stream (GIOStream *stream) +{ + return G_LOCAL_FILE_IO_STREAM (stream)->input_stream; +} + +static GOutputStream * +g_local_file_io_stream_get_output_stream (GIOStream *stream) +{ + return G_LOCAL_FILE_IO_STREAM (stream)->output_stream; +} + + +static gboolean +g_local_file_io_stream_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + GLocalFileIOStream *file = G_LOCAL_FILE_IO_STREAM (stream); + + /* There are shortcutted and can't fail */ + g_output_stream_close (file->output_stream, cancellable, NULL); + g_input_stream_close (file->input_stream, cancellable, NULL); + + return + _g_local_file_output_stream_really_close (G_LOCAL_FILE_OUTPUT_STREAM (file->output_stream), + cancellable, error); +} + +static void +g_local_file_io_stream_class_init (GLocalFileIOStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass); + + gobject_class->finalize = g_local_file_io_stream_finalize; + + stream_class->get_input_stream = g_local_file_io_stream_get_input_stream; + stream_class->get_output_stream = g_local_file_io_stream_get_output_stream; + stream_class->close_fn = g_local_file_io_stream_close; +} + +static void +g_local_file_io_stream_init (GLocalFileIOStream *stream) +{ +} diff --git a/gio/glocalfileiostream.h b/gio/glocalfileiostream.h new file mode 100644 index 0000000..be7c786 --- /dev/null +++ b/gio/glocalfileiostream.h @@ -0,0 +1,60 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_IO_STREAM_H__ +#define __G_LOCAL_FILE_IO_STREAM_H__ + +#include +#include "glocalfileoutputstream.h" + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_FILE_IO_STREAM (_g_local_file_io_stream_get_type ()) +#define G_LOCAL_FILE_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_FILE_IO_STREAM, GLocalFileIOStream)) +#define G_LOCAL_FILE_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_LOCAL_FILE_IO_STREAM, GLocalFileIOStreamClass)) +#define G_IS_LOCAL_FILE_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE_IO_STREAM)) +#define G_IS_LOCAL_FILE_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE_IO_STREAM)) +#define G_LOCAL_FILE_IO_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_LOCAL_FILE_IO_STREAM, GLocalFileIOStreamClass)) + +typedef struct _GLocalFileIOStream GLocalFileIOStream; +typedef struct _GLocalFileIOStreamClass GLocalFileIOStreamClass; +typedef struct _GLocalFileIOStreamPrivate GLocalFileIOStreamPrivate; + +struct _GLocalFileIOStream +{ + GFileIOStream parent_instance; + + GInputStream *input_stream; + GOutputStream *output_stream; +}; + +struct _GLocalFileIOStreamClass +{ + GFileIOStreamClass parent_class; +}; + +GType _g_local_file_io_stream_get_type (void) G_GNUC_CONST; +GFileIOStream * _g_local_file_io_stream_new (GLocalFileOutputStream *output_stream); + +G_END_DECLS + +#endif /* __G_LOCAL_FILE_IO_STREAM_H__ */ diff --git a/gio/glocalfilemonitor.c b/gio/glocalfilemonitor.c new file mode 100644 index 0000000..8405d3a --- /dev/null +++ b/gio/glocalfilemonitor.c @@ -0,0 +1,228 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include "gioenumtypes.h" +#include "glocalfilemonitor.h" +#include "giomodule-priv.h" +#include "gioerror.h" +#include "glibintl.h" + +#include + +#include "gioalias.h" + +enum +{ + PROP_0, + PROP_FILENAME, + PROP_FLAGS +}; + +G_DEFINE_ABSTRACT_TYPE (GLocalFileMonitor, g_local_file_monitor, G_TYPE_FILE_MONITOR) + +static void +g_local_file_monitor_init (GLocalFileMonitor* local_monitor) +{ +} + +static void +g_local_file_monitor_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + case PROP_FILENAME: + /* Do nothing */ + break; + case PROP_FLAGS: + /* Do nothing as well */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static GObject * +g_local_file_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GLocalFileMonitorClass *klass; + GObjectClass *parent_class; + GLocalFileMonitor *local_monitor; + const gchar *filename = NULL; + GFileMonitorFlags flags = 0; + gint i; + + klass = G_LOCAL_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_LOCAL_FILE_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + local_monitor = G_LOCAL_FILE_MONITOR (obj); + + for (i = 0; i < n_construct_properties; i++) + { + if (strcmp ("filename", g_param_spec_get_name (construct_properties[i].pspec)) == 0) + { + g_warn_if_fail (G_VALUE_HOLDS_STRING (construct_properties[i].value)); + filename = g_value_get_string (construct_properties[i].value); + } + else if (strcmp ("flags", g_param_spec_get_name (construct_properties[i].pspec)) == 0) + { + g_warn_if_fail (G_VALUE_HOLDS_FLAGS (construct_properties[i].value)); + flags = g_value_get_flags (construct_properties[i].value); + } + } + + g_warn_if_fail (filename != NULL); + + local_monitor->filename = g_strdup (filename); + local_monitor->flags = flags; + return obj; +} + +static void +g_local_file_monitor_finalize (GObject *object) +{ + GLocalFileMonitor *local_monitor = G_LOCAL_FILE_MONITOR (object); + if (local_monitor->filename) + { + g_free (local_monitor->filename); + local_monitor->filename = NULL; + } + + G_OBJECT_CLASS (g_local_file_monitor_parent_class)->finalize (object); +} + +static void g_local_file_monitor_class_init (GLocalFileMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = g_local_file_monitor_set_property; + gobject_class->finalize = g_local_file_monitor_finalize; + gobject_class->constructor = g_local_file_monitor_constructor; + + g_object_class_install_property (gobject_class, + PROP_FILENAME, + g_param_spec_string ("filename", + P_("File name"), + P_("File name to monitor"), + NULL, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_WRITABLE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + g_object_class_install_property (gobject_class, + PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Monitor flags"), + P_("Monitor flags"), + G_TYPE_FILE_MONITOR_FLAGS, + 0, + G_PARAM_CONSTRUCT_ONLY| + G_PARAM_WRITABLE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); +} + +static gpointer +get_default_local_file_monitor (gpointer data) +{ + GLocalFileMonitorClass *chosen_class; + GLocalFileMonitorClass **ret = data; + GIOExtensionPoint *ep; + GList *extensions, *l; + + _g_io_modules_ensure_loaded (); + + ep = g_io_extension_point_lookup (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME); + + extensions = g_io_extension_point_get_extensions (ep); + + chosen_class = NULL; + for (l = extensions; l != NULL; l = l->next) + { + GIOExtension *extension = l->data; + GLocalFileMonitorClass *klass; + + klass = G_LOCAL_FILE_MONITOR_CLASS (g_io_extension_ref_class (extension)); + + if (klass->is_supported ()) + { + chosen_class = klass; + break; + } + else + g_type_class_unref (klass); + } + + if (chosen_class) + { + *ret = chosen_class; + return (gpointer)G_TYPE_FROM_CLASS (chosen_class); + } + else + return (gpointer)G_TYPE_INVALID; +} + +GFileMonitor* +_g_local_file_monitor_new (const char *pathname, + GFileMonitorFlags flags, + GError **error) +{ + static GOnce once_init = G_ONCE_INIT; + GTypeClass *type_class; + GFileMonitor *monitor; + GType type; + + type_class = NULL; + g_once (&once_init, get_default_local_file_monitor, &type_class); + type = (GType)once_init.retval; + + monitor = NULL; + if (type != G_TYPE_INVALID) + monitor = G_FILE_MONITOR (g_object_new (type, "filename", pathname, "flags", flags, NULL)); + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unable to find default local file monitor type")); + + /* This is non-null on first pass here. Unref the class now. + * This is to avoid unloading the module and then loading it + * again which would happen if we unrefed the class + * before creating the monitor. + */ + + if (type_class) + g_type_class_unref (type_class); + + return monitor; +} + +#define __G_LOCAL_FILE_MONITOR_C__ +#include "gioaliasdef.c" diff --git a/gio/glocalfilemonitor.h b/gio/glocalfilemonitor.h new file mode 100644 index 0000000..6643866 --- /dev/null +++ b/gio/glocalfilemonitor.h @@ -0,0 +1,64 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_MONITOR_H__ +#define __G_LOCAL_FILE_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_FILE_MONITOR (g_local_file_monitor_get_type ()) +#define G_LOCAL_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_FILE_MONITOR, GLocalFileMonitor)) +#define G_LOCAL_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_LOCAL_FILE_MONITOR, GLocalFileMonitorClass)) +#define G_IS_LOCAL_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE_MONITOR)) +#define G_IS_LOCAL_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE_MONITOR)) + +#define G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME "gio-local-file-monitor" + +typedef struct _GLocalFileMonitor GLocalFileMonitor; +typedef struct _GLocalFileMonitorClass GLocalFileMonitorClass; + +struct _GLocalFileMonitor +{ + GFileMonitor parent_instance; + + gchar *filename; + GFileMonitorFlags flags; +}; + +struct _GLocalFileMonitorClass +{ + GFileMonitorClass parent_class; + + gboolean (* is_supported) (void); +}; + +GType g_local_file_monitor_get_type (void) G_GNUC_CONST; + +GFileMonitor * _g_local_file_monitor_new (const char *pathname, + GFileMonitorFlags flags, + GError **error); + +G_END_DECLS + +#endif /* __G_LOCAL_FILE_MONITOR_H__ */ diff --git a/gio/glocalfileoutputstream.c b/gio/glocalfileoutputstream.c new file mode 100644 index 0000000..f870d7b --- /dev/null +++ b/gio/glocalfileoutputstream.c @@ -0,0 +1,1169 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#include +#include +#include "glibintl.h" +#include "gioerror.h" +#include "gcancellable.h" +#include "gfiledescriptorbased.h" +#include "glocalfileoutputstream.h" +#include "glocalfileinfo.h" + +#ifdef G_OS_WIN32 +#include +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#endif +#ifndef S_ISREG +#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#include "gioalias.h" + +static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); +#define g_local_file_output_stream_get_type _g_local_file_output_stream_get_type +G_DEFINE_TYPE_WITH_CODE (GLocalFileOutputStream, g_local_file_output_stream, G_TYPE_FILE_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, + g_file_descriptor_based_iface_init)); + + +/* Some of the file replacement code was based on the code from gedit, + * relicenced to LGPL with permissions from the authors. + */ + +#define BACKUP_EXTENSION "~" + +struct _GLocalFileOutputStreamPrivate { + char *tmp_filename; + char *original_filename; + char *backup_filename; + char *etag; + guint sync_on_close : 1; + guint do_close : 1; + int fd; +}; + +static gssize g_local_file_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_local_file_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +static GFileInfo *g_local_file_output_stream_query_info (GFileOutputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +static char * g_local_file_output_stream_get_etag (GFileOutputStream *stream); +static goffset g_local_file_output_stream_tell (GFileOutputStream *stream); +static gboolean g_local_file_output_stream_can_seek (GFileOutputStream *stream); +static gboolean g_local_file_output_stream_seek (GFileOutputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_local_file_output_stream_can_truncate (GFileOutputStream *stream); +static gboolean g_local_file_output_stream_truncate (GFileOutputStream *stream, + goffset size, + GCancellable *cancellable, + GError **error); +static int g_local_file_output_stream_get_fd (GFileDescriptorBased *stream); + +static void +g_local_file_output_stream_finalize (GObject *object) +{ + GLocalFileOutputStream *file; + + file = G_LOCAL_FILE_OUTPUT_STREAM (object); + + g_free (file->priv->tmp_filename); + g_free (file->priv->original_filename); + g_free (file->priv->backup_filename); + g_free (file->priv->etag); + + G_OBJECT_CLASS (g_local_file_output_stream_parent_class)->finalize (object); +} + + +static void +g_local_file_output_stream_class_init (GLocalFileOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); + GFileOutputStreamClass *file_stream_class = G_FILE_OUTPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GLocalFileOutputStreamPrivate)); + + gobject_class->finalize = g_local_file_output_stream_finalize; + + stream_class->write_fn = g_local_file_output_stream_write; + stream_class->close_fn = g_local_file_output_stream_close; + file_stream_class->query_info = g_local_file_output_stream_query_info; + file_stream_class->get_etag = g_local_file_output_stream_get_etag; + file_stream_class->tell = g_local_file_output_stream_tell; + file_stream_class->can_seek = g_local_file_output_stream_can_seek; + file_stream_class->seek = g_local_file_output_stream_seek; + file_stream_class->can_truncate = g_local_file_output_stream_can_truncate; + file_stream_class->truncate_fn = g_local_file_output_stream_truncate; +} + +static void +g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = g_local_file_output_stream_get_fd; +} + +static void +g_local_file_output_stream_init (GLocalFileOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_LOCAL_FILE_OUTPUT_STREAM, + GLocalFileOutputStreamPrivate); + stream->priv->do_close = TRUE; +} + +static gssize +g_local_file_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *file; + gssize res; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + while (1) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + res = write (file->priv->fd, buffer, count); + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to file: %s"), + g_strerror (errsv)); + } + + break; + } + + return res; +} + +void +_g_local_file_output_stream_set_do_close (GLocalFileOutputStream *out, + gboolean do_close) +{ + out->priv->do_close = do_close; +} + +gboolean +_g_local_file_output_stream_really_close (GLocalFileOutputStream *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFileStat final_stat; + int res; + +#ifdef HAVE_FSYNC + if (file->priv->sync_on_close && + fsync (file->priv->fd) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to file: %s"), + g_strerror (errsv)); + goto err_out; + } +#endif + +#ifdef G_OS_WIN32 + + /* Must close before renaming on Windows, so just do the close first + * in all cases for now. + */ + if (_fstati64 (file->priv->fd, &final_stat) == 0) + file->priv->etag = _g_local_file_info_create_etag (&final_stat); + + res = close (file->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing file: %s"), + g_strerror (errsv)); + return FALSE; + } + +#endif + + if (file->priv->tmp_filename) + { + /* We need to move the temp file to its final place, + * and possibly create the backup file + */ + + if (file->priv->backup_filename) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto err_out; + +#ifdef HAVE_LINK + /* create original -> backup link, the original is then renamed over */ + if (g_unlink (file->priv->backup_filename) != 0 && + errno != ENOENT) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Error removing old backup link: %s"), + g_strerror (errsv)); + goto err_out; + } + + if (link (file->priv->original_filename, file->priv->backup_filename) != 0) + { + /* link failed or is not supported, try rename */ + if (g_rename (file->priv->original_filename, file->priv->backup_filename) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Error creating backup copy: %s"), + g_strerror (errsv)); + goto err_out; + } + } +#else + /* If link not supported, just rename... */ + if (g_rename (file->priv->original_filename, file->priv->backup_filename) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Error creating backup copy: %s"), + g_strerror (errsv)); + goto err_out; + } +#endif + } + + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto err_out; + + /* tmp -> original */ + if (g_rename (file->priv->tmp_filename, file->priv->original_filename) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error renaming temporary file: %s"), + g_strerror (errsv)); + goto err_out; + } + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto err_out; + +#ifndef G_OS_WIN32 /* Already did the fstat() and close() above on Win32 */ + + if (fstat (file->priv->fd, &final_stat) == 0) + file->priv->etag = _g_local_file_info_create_etag (&final_stat); + + while (1) + { + res = close (file->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing file: %s"), + g_strerror (errsv)); + } + break; + } + + return res != -1; + +#else + + return TRUE; + +#endif + + err_out: + +#ifndef G_OS_WIN32 + /* A simple try to close the fd in case we fail before the actual close */ + close (file->priv->fd); +#endif + return FALSE; +} + + +static gboolean +g_local_file_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *file; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + if (file->priv->do_close) + return _g_local_file_output_stream_really_close (file, + cancellable, + error); + return TRUE; +} + +static char * +g_local_file_output_stream_get_etag (GFileOutputStream *stream) +{ + GLocalFileOutputStream *file; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + return g_strdup (file->priv->etag); +} + +static goffset +g_local_file_output_stream_tell (GFileOutputStream *stream) +{ + GLocalFileOutputStream *file; + off_t pos; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + pos = lseek (file->priv->fd, 0, SEEK_CUR); + + if (pos == (off_t)-1) + return 0; + + return pos; +} + +static gboolean +g_local_file_output_stream_can_seek (GFileOutputStream *stream) +{ + GLocalFileOutputStream *file; + off_t pos; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + pos = lseek (file->priv->fd, 0, SEEK_CUR); + + if (pos == (off_t)-1 && errno == ESPIPE) + return FALSE; + + return TRUE; +} + +static int +seek_type_to_lseek (GSeekType type) +{ + switch (type) + { + default: + case G_SEEK_CUR: + return SEEK_CUR; + + case G_SEEK_SET: + return SEEK_SET; + + case G_SEEK_END: + return SEEK_END; + } +} + +static gboolean +g_local_file_output_stream_seek (GFileOutputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *file; + off_t pos; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + pos = lseek (file->priv->fd, offset, seek_type_to_lseek (type)); + + if (pos == (off_t)-1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error seeking in file: %s"), + g_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + +static gboolean +g_local_file_output_stream_can_truncate (GFileOutputStream *stream) +{ + /* We can't truncate pipes and stuff where we can't seek */ + return g_local_file_output_stream_can_seek (stream); +} + +static gboolean +g_local_file_output_stream_truncate (GFileOutputStream *stream, + goffset size, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *file; + int res; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + restart: +#ifdef G_OS_WIN32 + res = g_win32_ftruncate (file->priv->fd, size); +#else + res = ftruncate (file->priv->fd, size); +#endif + + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + goto restart; + } + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error truncating file: %s"), + g_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + + +static GFileInfo * +g_local_file_output_stream_query_info (GFileOutputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *file; + + file = G_LOCAL_FILE_OUTPUT_STREAM (stream); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + return _g_local_file_info_get_from_fd (file->priv->fd, + attributes, + error); +} + +GFileOutputStream * +_g_local_file_output_stream_open (const char *filename, + gboolean readable, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *stream; + int fd; + int open_flags; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + open_flags = O_BINARY; + if (readable) + open_flags |= O_RDWR; + else + open_flags |= O_WRONLY; + + fd = g_open (filename, open_flags, 0666); + if (fd == -1) + { + int errsv = errno; + + if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + { + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + } + return NULL; + } + + stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL); + stream->priv->fd = fd; + return G_FILE_OUTPUT_STREAM (stream); +} + +GFileOutputStream * +_g_local_file_output_stream_create (const char *filename, + gboolean readable, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *stream; + int mode; + int fd; + int open_flags; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + if (flags & G_FILE_CREATE_PRIVATE) + mode = 0600; + else + mode = 0666; + + open_flags = O_CREAT | O_EXCL | O_BINARY; + if (readable) + open_flags |= O_RDWR; + else + open_flags |= O_WRONLY; + + fd = g_open (filename, open_flags, mode); + if (fd == -1) + { + int errsv = errno; + + if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + { + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + } + return NULL; + } + + stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL); + stream->priv->fd = fd; + return G_FILE_OUTPUT_STREAM (stream); +} + +GFileOutputStream * +_g_local_file_output_stream_append (const char *filename, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *stream; + int mode; + int fd; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + if (flags & G_FILE_CREATE_PRIVATE) + mode = 0600; + else + mode = 0666; + + fd = g_open (filename, O_CREAT | O_APPEND | O_WRONLY | O_BINARY, mode); + if (fd == -1) + { + int errsv = errno; + + if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + { + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + } + return NULL; + } + + stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL); + stream->priv->fd = fd; + + return G_FILE_OUTPUT_STREAM (stream); +} + +static char * +create_backup_filename (const char *filename) +{ + return g_strconcat (filename, BACKUP_EXTENSION, NULL); +} + +#define BUFSIZE 8192 /* size of normal write buffer */ + +static gboolean +copy_file_data (gint sfd, + gint dfd, + GError **error) +{ + gboolean ret = TRUE; + gpointer buffer; + const gchar *write_buffer; + gssize bytes_read; + gssize bytes_to_write; + gssize bytes_written; + + buffer = g_malloc (BUFSIZE); + + do + { + bytes_read = read (sfd, buffer, BUFSIZE); + if (bytes_read == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from file: %s"), + g_strerror (errsv)); + ret = FALSE; + break; + } + + bytes_to_write = bytes_read; + write_buffer = buffer; + + do + { + bytes_written = write (dfd, write_buffer, bytes_to_write); + if (bytes_written == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to file: %s"), + g_strerror (errsv)); + ret = FALSE; + break; + } + + bytes_to_write -= bytes_written; + write_buffer += bytes_written; + } + while (bytes_to_write > 0); + + } while ((bytes_read != 0) && (ret == TRUE)); + + g_free (buffer); + + return ret; +} + +static int +handle_overwrite_open (const char *filename, + gboolean readable, + const char *etag, + gboolean create_backup, + char **temp_filename, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + int fd = -1; + GLocalFileStat original_stat; + char *current_etag; + gboolean is_symlink; + int open_flags; + int res; + int mode; + + if (flags & G_FILE_CREATE_PRIVATE) + mode = 0600; + else + mode = 0666; + + /* We only need read access to the original file if we are creating a backup. + * We also add O_CREATE to avoid a race if the file was just removed */ + if (create_backup || readable) + open_flags = O_RDWR | O_CREAT | O_BINARY; + else + open_flags = O_WRONLY | O_CREAT | O_BINARY; + + /* Some systems have O_NOFOLLOW, which lets us avoid some races + * when finding out if the file we opened was a symlink */ +#ifdef O_NOFOLLOW + is_symlink = FALSE; + fd = g_open (filename, open_flags | O_NOFOLLOW, mode); + if (fd == -1 && errno == ELOOP) + { + /* Could be a symlink, or it could be a regular ELOOP error, + * but then the next open will fail too. */ + is_symlink = TRUE; + fd = g_open (filename, open_flags, mode); + } +#else + fd = g_open (filename, open_flags, mode); + /* This is racy, but we do it as soon as possible to minimize the race */ + is_symlink = g_file_test (filename, G_FILE_TEST_IS_SYMLINK); +#endif + + if (fd == -1) + { + int errsv = errno; + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + return -1; + } + +#ifdef G_OS_WIN32 + res = _fstati64 (fd, &original_stat); +#else + res = fstat (fd, &original_stat); +#endif + + if (res != 0) + { + int errsv = errno; + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error stating file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + goto err_out; + } + + /* not a regular file */ + if (!S_ISREG (original_stat.st_mode)) + { + if (S_ISDIR (original_stat.st_mode)) + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_IS_DIRECTORY, + _("Target file is a directory")); + else + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_REGULAR_FILE, + _("Target file is not a regular file")); + goto err_out; + } + + if (etag != NULL) + { + current_etag = _g_local_file_info_create_etag (&original_stat); + if (strcmp (etag, current_etag) != 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_WRONG_ETAG, + _("The file was externally modified")); + g_free (current_etag); + goto err_out; + } + g_free (current_etag); + } + + /* We use two backup strategies. + * The first one (which is faster) consist in saving to a + * tmp file then rename the original file to the backup and the + * tmp file to the original name. This is fast but doesn't work + * when the file is a link (hard or symbolic) or when we can't + * write to the current dir or can't set the permissions on the + * new file. + * The second strategy consist simply in copying the old file + * to a backup file and rewrite the contents of the file. + */ + + if ((flags & G_FILE_CREATE_REPLACE_DESTINATION) || + (!(original_stat.st_nlink > 1) && !is_symlink)) + { + char *dirname, *tmp_filename; + int tmpfd; + + dirname = g_path_get_dirname (filename); + tmp_filename = g_build_filename (dirname, ".goutputstream-XXXXXX", NULL); + g_free (dirname); + + tmpfd = g_mkstemp_full (tmp_filename, (readable ? O_RDWR : O_WRONLY) | O_BINARY, mode); + if (tmpfd == -1) + { + g_free (tmp_filename); + goto fallback_strategy; + } + + /* try to keep permissions (unless replacing) */ + + if ( ! (flags & G_FILE_CREATE_REPLACE_DESTINATION) && + ( +#ifdef HAVE_FCHOWN + fchown (tmpfd, original_stat.st_uid, original_stat.st_gid) == -1 || +#endif +#ifdef HAVE_FCHMOD + fchmod (tmpfd, original_stat.st_mode) == -1 || +#endif + 0 + ) + ) + { + struct stat tmp_statbuf; + + /* Check that we really needed to change something */ + if (fstat (tmpfd, &tmp_statbuf) != 0 || + original_stat.st_uid != tmp_statbuf.st_uid || + original_stat.st_gid != tmp_statbuf.st_gid || + original_stat.st_mode != tmp_statbuf.st_mode) + { + close (tmpfd); + g_unlink (tmp_filename); + g_free (tmp_filename); + goto fallback_strategy; + } + } + + close (fd); + *temp_filename = tmp_filename; + return tmpfd; + } + + fallback_strategy: + + if (create_backup) + { +#if defined(HAVE_FCHOWN) && defined(HAVE_FCHMOD) + struct stat tmp_statbuf; +#endif + char *backup_filename; + int bfd; + + backup_filename = create_backup_filename (filename); + + if (g_unlink (backup_filename) == -1 && errno != ENOENT) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Backup file creation failed")); + g_free (backup_filename); + goto err_out; + } + + bfd = g_open (backup_filename, + O_WRONLY | O_CREAT | O_EXCL | O_BINARY, + original_stat.st_mode & 0777); + + if (bfd == -1) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Backup file creation failed")); + g_free (backup_filename); + goto err_out; + } + + /* If needed, Try to set the group of the backup same as the + * original file. If this fails, set the protection + * bits for the group same as the protection bits for + * others. */ +#if defined(HAVE_FCHOWN) && defined(HAVE_FCHMOD) + if (fstat (bfd, &tmp_statbuf) != 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Backup file creation failed")); + g_unlink (backup_filename); + g_free (backup_filename); + goto err_out; + } + + if ((original_stat.st_gid != tmp_statbuf.st_gid) && + fchown (bfd, (uid_t) -1, original_stat.st_gid) != 0) + { + if (fchmod (bfd, + (original_stat.st_mode & 0707) | + ((original_stat.st_mode & 07) << 3)) != 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Backup file creation failed")); + g_unlink (backup_filename); + close (bfd); + g_free (backup_filename); + goto err_out; + } + } +#endif + + if (!copy_file_data (fd, bfd, NULL)) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CANT_CREATE_BACKUP, + _("Backup file creation failed")); + g_unlink (backup_filename); + close (bfd); + g_free (backup_filename); + + goto err_out; + } + + close (bfd); + g_free (backup_filename); + + /* Seek back to the start of the file after the backup copy */ + if (lseek (fd, 0, SEEK_SET) == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error seeking in file: %s"), + g_strerror (errsv)); + goto err_out; + } + } + + if (flags & G_FILE_CREATE_REPLACE_DESTINATION) + { + close (fd); + + if (g_unlink (filename) != 0) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error removing old file: %s"), + g_strerror (errsv)); + goto err_out2; + } + + if (readable) + open_flags = O_RDWR | O_CREAT | O_BINARY; + else + open_flags = O_WRONLY | O_CREAT | O_BINARY; + fd = g_open (filename, open_flags, mode); + if (fd == -1) + { + int errsv = errno; + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + goto err_out2; + } + } + else + { + /* Truncate the file at the start */ +#ifdef G_OS_WIN32 + if (g_win32_ftruncate (fd, 0) == -1) +#else + if (ftruncate (fd, 0) == -1) +#endif + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error truncating file: %s"), + g_strerror (errsv)); + goto err_out; + } + } + + return fd; + + err_out: + close (fd); + err_out2: + return -1; +} + +GFileOutputStream * +_g_local_file_output_stream_replace (const char *filename, + gboolean readable, + const char *etag, + gboolean create_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GLocalFileOutputStream *stream; + int mode; + int fd; + char *temp_file; + gboolean sync_on_close; + int open_flags; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + temp_file = NULL; + + if (flags & G_FILE_CREATE_PRIVATE) + mode = 0600; + else + mode = 0666; + sync_on_close = FALSE; + + /* If the file doesn't exist, create it */ + open_flags = O_CREAT | O_EXCL | O_BINARY; + if (readable) + open_flags |= O_RDWR; + else + open_flags |= O_WRONLY; + fd = g_open (filename, open_flags, mode); + + if (fd == -1 && errno == EEXIST) + { + /* The file already exists */ + fd = handle_overwrite_open (filename, readable, etag, + create_backup, &temp_file, + flags, cancellable, error); + if (fd == -1) + return NULL; + + /* If the final destination exists, we want to sync the newly written + * file to ensure the data is on disk when we rename over the destination. + * otherwise if we get a system crash we can lose both the new and the + * old file on some filesystems. (I.E. those that don't guarantee the + * data is written to the disk before the metadata.) + */ + sync_on_close = TRUE; + } + else if (fd == -1) + { + int errsv = errno; + + if (errsv == EINVAL) + /* This must be an invalid filename, on e.g. FAT */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename")); + else + { + char *display_name = g_filename_display_name (filename); + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + } + return NULL; + } + + + stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL); + stream->priv->fd = fd; + stream->priv->sync_on_close = sync_on_close; + stream->priv->tmp_filename = temp_file; + if (create_backup) + stream->priv->backup_filename = create_backup_filename (filename); + stream->priv->original_filename = g_strdup (filename); + + return G_FILE_OUTPUT_STREAM (stream); +} + +static int +g_local_file_output_stream_get_fd (GFileDescriptorBased *fd_based) +{ + GLocalFileOutputStream *stream = G_LOCAL_FILE_OUTPUT_STREAM (fd_based); + + return stream->priv->fd; +} + diff --git a/gio/glocalfileoutputstream.h b/gio/glocalfileoutputstream.h new file mode 100644 index 0000000..a8ec736 --- /dev/null +++ b/gio/glocalfileoutputstream.h @@ -0,0 +1,85 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_FILE_OUTPUT_STREAM_H__ +#define __G_LOCAL_FILE_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_FILE_OUTPUT_STREAM (_g_local_file_output_stream_get_type ()) +#define G_LOCAL_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LOCAL_FILE_OUTPUT_STREAM, GLocalFileOutputStream)) +#define G_LOCAL_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_LOCAL_FILE_OUTPUT_STREAM, GLocalFileOutputStreamClass)) +#define G_IS_LOCAL_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LOCAL_FILE_OUTPUT_STREAM)) +#define G_IS_LOCAL_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LOCAL_FILE_OUTPUT_STREAM)) +#define G_LOCAL_FILE_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_LOCAL_FILE_OUTPUT_STREAM, GLocalFileOutputStreamClass)) + +typedef struct _GLocalFileOutputStream GLocalFileOutputStream; +typedef struct _GLocalFileOutputStreamClass GLocalFileOutputStreamClass; +typedef struct _GLocalFileOutputStreamPrivate GLocalFileOutputStreamPrivate; + +struct _GLocalFileOutputStream +{ + GFileOutputStream parent_instance; + + /*< private >*/ + GLocalFileOutputStreamPrivate *priv; +}; + +struct _GLocalFileOutputStreamClass +{ + GFileOutputStreamClass parent_class; +}; + +GType _g_local_file_output_stream_get_type (void) G_GNUC_CONST; + +void _g_local_file_output_stream_set_do_close (GLocalFileOutputStream *out, + gboolean do_close); +gboolean _g_local_file_output_stream_really_close (GLocalFileOutputStream *out, + GCancellable *cancellable, + GError **error); + +GFileOutputStream * _g_local_file_output_stream_open (const char *filename, + gboolean readable, + GCancellable *cancellable, + GError **error); +GFileOutputStream * _g_local_file_output_stream_create (const char *filename, + gboolean readable, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GFileOutputStream * _g_local_file_output_stream_append (const char *filename, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GFileOutputStream * _g_local_file_output_stream_replace (const char *filename, + gboolean readable, + const char *etag, + gboolean create_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_LOCAL_FILE_OUTPUT_STREAM_H__ */ diff --git a/gio/glocalvfs.c b/gio/glocalvfs.c new file mode 100644 index 0000000..cd535e3 --- /dev/null +++ b/gio/glocalvfs.c @@ -0,0 +1,219 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "glocalvfs.h" +#include "glocalfile.h" +#include "giomodule.h" +#include "giomodule-priv.h" +#include "gvfs.h" +#include +#include +#ifdef HAVE_PWD_H +#include +#endif +#include + +#include "gioalias.h" + +struct _GLocalVfs +{ + GVfs parent; +}; + +struct _GLocalVfsClass +{ + GVfsClass parent_class; + +}; + +#define g_local_vfs_get_type _g_local_vfs_get_type +G_DEFINE_TYPE_WITH_CODE (GLocalVfs, g_local_vfs, G_TYPE_VFS, + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_VFS_EXTENSION_POINT_NAME, + g_define_type_id, + "local", + 0)) +static void +g_local_vfs_finalize (GObject *object) +{ + /* must chain up */ + G_OBJECT_CLASS (g_local_vfs_parent_class)->finalize (object); +} + +static void +g_local_vfs_init (GLocalVfs *vfs) +{ +} + +/** + * g_local_vfs_new: + * + * Returns a new #GVfs handle for a local vfs. + * + * Returns: a new #GVfs handle. + **/ +GVfs * +_g_local_vfs_new (void) +{ + return g_object_new (G_TYPE_LOCAL_VFS, NULL); +} + +static GFile * +g_local_vfs_get_file_for_path (GVfs *vfs, + const char *path) +{ + return _g_local_file_new (path); +} + +static GFile * +g_local_vfs_get_file_for_uri (GVfs *vfs, + const char *uri) +{ + char *path; + GFile *file; + char *stripped_uri, *hash; + + if (strchr (uri, '#') != NULL) + { + stripped_uri = g_strdup (uri); + hash = strchr (stripped_uri, '#'); + *hash = 0; + } + else + stripped_uri = (char *)uri; + + path = g_filename_from_uri (stripped_uri, NULL, NULL); + + if (stripped_uri != uri) + g_free (stripped_uri); + + if (path != NULL) + file = _g_local_file_new (path); + else + file = _g_dummy_file_new (uri); + + g_free (path); + + return file; +} + +static const gchar * const * +g_local_vfs_get_supported_uri_schemes (GVfs *vfs) +{ + static const gchar * uri_schemes[] = { "file", NULL }; + + return uri_schemes; +} + +static GFile * +g_local_vfs_parse_name (GVfs *vfs, + const char *parse_name) +{ + GFile *file; + char *filename; + char *user_prefix; + const char *user_start, *user_end; + char *rest; + + g_return_val_if_fail (G_IS_VFS (vfs), NULL); + g_return_val_if_fail (parse_name != NULL, NULL); + + if (g_ascii_strncasecmp ("file:", parse_name, 5) == 0) + filename = g_filename_from_uri (parse_name, NULL, NULL); + else + { + if (*parse_name == '~') + { + parse_name ++; + user_start = parse_name; + + while (*parse_name != 0 && *parse_name != '/') + parse_name++; + + user_end = parse_name; + + if (user_end == user_start) + user_prefix = g_strdup (g_get_home_dir ()); + else + { +#ifdef HAVE_PWD_H + struct passwd *passwd_file_entry; + char *user_name; + + user_name = g_strndup (user_start, user_end - user_start); + passwd_file_entry = getpwnam (user_name); + g_free (user_name); + + if (passwd_file_entry != NULL && + passwd_file_entry->pw_dir != NULL) + user_prefix = g_strdup (passwd_file_entry->pw_dir); + else +#endif + user_prefix = g_strdup (g_get_home_dir ()); + } + + rest = NULL; + if (*user_end != 0) + rest = g_filename_from_utf8 (user_end, -1, NULL, NULL, NULL); + + filename = g_build_filename (user_prefix, rest, NULL); + g_free (rest); + g_free (user_prefix); + } + else + filename = g_filename_from_utf8 (parse_name, -1, NULL, NULL, NULL); + } + + if (filename == NULL) + filename = g_strdup (parse_name); + + file = _g_local_file_new (filename); + g_free (filename); + + return file; +} + +static gboolean +g_local_vfs_is_active (GVfs *vfs) +{ + return TRUE; +} + +static void +g_local_vfs_class_init (GLocalVfsClass *class) +{ + GObjectClass *object_class; + GVfsClass *vfs_class; + + object_class = (GObjectClass *) class; + + object_class->finalize = g_local_vfs_finalize; + + vfs_class = G_VFS_CLASS (class); + + vfs_class->is_active = g_local_vfs_is_active; + vfs_class->get_file_for_path = g_local_vfs_get_file_for_path; + vfs_class->get_file_for_uri = g_local_vfs_get_file_for_uri; + vfs_class->get_supported_uri_schemes = g_local_vfs_get_supported_uri_schemes; + vfs_class->parse_name = g_local_vfs_parse_name; +} diff --git a/gio/glocalvfs.h b/gio/glocalvfs.h new file mode 100644 index 0000000..5d9de2f --- /dev/null +++ b/gio/glocalvfs.h @@ -0,0 +1,46 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_LOCAL_VFS_H__ +#define __G_LOCAL_VFS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_LOCAL_VFS (_g_local_vfs_get_type ()) +#define G_LOCAL_VFS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_LOCAL_VFS, GLocalVfs)) +#define G_LOCAL_VFS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_LOCAL_VFS, GLocalVfsClass)) +#define G_IS_LOCAL_VFS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_LOCAL_VFS)) +#define G_IS_LOCAL_VFS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), G_TYPE_LOCAL_VFS)) +#define G_LOCAL_VFS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_LOCAL_VFS, GLocalVfsClass)) + +typedef struct _GLocalVfs GLocalVfs; +typedef struct _GLocalVfsClass GLocalVfsClass; + +GType _g_local_vfs_get_type (void) G_GNUC_CONST; + +GVfs * _g_local_vfs_new (void); + +G_END_DECLS + +#endif /* __G_LOCAL_VFS_H__ */ diff --git a/gio/gmemoryinputstream.c b/gio/gmemoryinputstream.c new file mode 100644 index 0000000..bb6001b --- /dev/null +++ b/gio/gmemoryinputstream.c @@ -0,0 +1,526 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#include "config.h" +#include "gmemoryinputstream.h" +#include "ginputstream.h" +#include "gseekable.h" +#include "string.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gmemoryinputstream + * @short_description: Streaming input operations on memory chunks + * @include: gio/gio.h + * @see_also: #GMemoryOutputStream + * + * #GMemoryInputStream is a class for using arbitrary + * memory chunks as input for GIO streaming input operations. + * + */ + +typedef struct _Chunk Chunk; + +struct _Chunk { + guint8 *data; + gsize len; + GDestroyNotify destroy; +}; + +struct _GMemoryInputStreamPrivate { + GSList *chunks; + gsize len; + gsize pos; +}; + +static gssize g_memory_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gssize g_memory_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_memory_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); +static void g_memory_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gssize g_memory_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static void g_memory_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellabl, + GAsyncReadyCallback callback, + gpointer datae); +static gssize g_memory_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static void g_memory_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellabl, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_memory_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); + +static void g_memory_input_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_memory_input_stream_tell (GSeekable *seekable); +static gboolean g_memory_input_stream_can_seek (GSeekable *seekable); +static gboolean g_memory_input_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_memory_input_stream_can_truncate (GSeekable *seekable); +static gboolean g_memory_input_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); +static void g_memory_input_stream_finalize (GObject *object); + +G_DEFINE_TYPE_WITH_CODE (GMemoryInputStream, g_memory_input_stream, G_TYPE_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_memory_input_stream_seekable_iface_init)) + + +static void +g_memory_input_stream_class_init (GMemoryInputStreamClass *klass) +{ + GObjectClass *object_class; + GInputStreamClass *istream_class; + + g_type_class_add_private (klass, sizeof (GMemoryInputStreamPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = g_memory_input_stream_finalize; + + istream_class = G_INPUT_STREAM_CLASS (klass); + istream_class->read_fn = g_memory_input_stream_read; + istream_class->skip = g_memory_input_stream_skip; + istream_class->close_fn = g_memory_input_stream_close; + + istream_class->read_async = g_memory_input_stream_read_async; + istream_class->read_finish = g_memory_input_stream_read_finish; + istream_class->skip_async = g_memory_input_stream_skip_async; + istream_class->skip_finish = g_memory_input_stream_skip_finish; + istream_class->close_async = g_memory_input_stream_close_async; + istream_class->close_finish = g_memory_input_stream_close_finish; +} + +static void +free_chunk (gpointer data, + gpointer user_data) +{ + Chunk *chunk = data; + + if (chunk->destroy) + chunk->destroy (chunk->data); + + g_slice_free (Chunk, chunk); +} + +static void +g_memory_input_stream_finalize (GObject *object) +{ + GMemoryInputStream *stream; + GMemoryInputStreamPrivate *priv; + + stream = G_MEMORY_INPUT_STREAM (object); + priv = stream->priv; + + g_slist_foreach (priv->chunks, free_chunk, NULL); + g_slist_free (priv->chunks); + + G_OBJECT_CLASS (g_memory_input_stream_parent_class)->finalize (object); +} + +static void +g_memory_input_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_memory_input_stream_tell; + iface->can_seek = g_memory_input_stream_can_seek; + iface->seek = g_memory_input_stream_seek; + iface->can_truncate = g_memory_input_stream_can_truncate; + iface->truncate_fn = g_memory_input_stream_truncate; +} + +static void +g_memory_input_stream_init (GMemoryInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_MEMORY_INPUT_STREAM, + GMemoryInputStreamPrivate); +} + +/** + * g_memory_input_stream_new: + * + * Creates a new empty #GMemoryInputStream. + * + * Returns: a new #GInputStream + */ +GInputStream * +g_memory_input_stream_new (void) +{ + GInputStream *stream; + + stream = g_object_new (G_TYPE_MEMORY_INPUT_STREAM, NULL); + + return stream; +} + +/** + * g_memory_input_stream_new_from_data: + * @data: input data + * @len: length of the data, may be -1 if @data is a nul-terminated string + * @destroy: function that is called to free @data, or %NULL + * + * Creates a new #GMemoryInputStream with data in memory of a given size. + * + * Returns: new #GInputStream read from @data of @len bytes. + **/ +GInputStream * +g_memory_input_stream_new_from_data (const void *data, + gssize len, + GDestroyNotify destroy) +{ + GInputStream *stream; + + stream = g_memory_input_stream_new (); + + g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (stream), + data, len, destroy); + + return stream; +} + +/** + * g_memory_input_stream_add_data: + * @stream: a #GMemoryInputStream + * @data: input data + * @len: length of the data, may be -1 if @data is a nul-terminated string + * @destroy: function that is called to free @data, or %NULL + * + * Appends @data to data that can be read from the input stream + */ +void +g_memory_input_stream_add_data (GMemoryInputStream *stream, + const void *data, + gssize len, + GDestroyNotify destroy) +{ + GMemoryInputStreamPrivate *priv; + Chunk *chunk; + + g_return_if_fail (G_IS_MEMORY_INPUT_STREAM (stream)); + g_return_if_fail (data != NULL); + + priv = stream->priv; + + if (len == -1) + len = strlen (data); + + chunk = g_slice_new (Chunk); + chunk->data = (guint8 *)data; + chunk->len = len; + chunk->destroy = destroy; + + priv->chunks = g_slist_append (priv->chunks, chunk); + priv->len += chunk->len; +} + +static gssize +g_memory_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GMemoryInputStream *memory_stream; + GMemoryInputStreamPrivate *priv; + GSList *l; + Chunk *chunk; + gsize offset, start, rest, size; + + memory_stream = G_MEMORY_INPUT_STREAM (stream); + priv = memory_stream->priv; + + count = MIN (count, priv->len - priv->pos); + + offset = 0; + for (l = priv->chunks; l; l = l->next) + { + chunk = (Chunk *)l->data; + + if (offset + chunk->len > priv->pos) + break; + + offset += chunk->len; + } + + start = priv->pos - offset; + rest = count; + + for (; l && rest > 0; l = l->next) + { + chunk = (Chunk *)l->data; + size = MIN (rest, chunk->len - start); + + memcpy ((guint8 *)buffer + (count - rest), chunk->data + start, size); + rest -= size; + + start = 0; + } + + priv->pos += count; + + return count; +} + +static gssize +g_memory_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GMemoryInputStream *memory_stream; + GMemoryInputStreamPrivate *priv; + + memory_stream = G_MEMORY_INPUT_STREAM (stream); + priv = memory_stream->priv; + + count = MIN (count, priv->len - priv->pos); + priv->pos += count; + + return count; +} + +static gboolean +g_memory_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + +static void +g_memory_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + gssize nread; + + nread = g_memory_input_stream_read (stream, buffer, count, cancellable, NULL); + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_memory_input_stream_read_async); + g_simple_async_result_set_op_res_gssize (simple, nread); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +static gssize +g_memory_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize nread; + + simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_memory_input_stream_read_async); + + nread = g_simple_async_result_get_op_res_gssize (simple); + return nread; +} + +static void +g_memory_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + gssize nskipped; + + nskipped = g_memory_input_stream_skip (stream, count, cancellable, NULL); + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_memory_input_stream_skip_async); + g_simple_async_result_set_op_res_gssize (simple, nskipped); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +static gssize +g_memory_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize nskipped; + + simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_memory_input_stream_skip_async); + + nskipped = g_simple_async_result_get_op_res_gssize (simple); + return nskipped; +} + +static void +g_memory_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_memory_input_stream_close_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +static gboolean +g_memory_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +static goffset +g_memory_input_stream_tell (GSeekable *seekable) +{ + GMemoryInputStream *memory_stream; + GMemoryInputStreamPrivate *priv; + + memory_stream = G_MEMORY_INPUT_STREAM (seekable); + priv = memory_stream->priv; + + return priv->pos; +} + +static +gboolean g_memory_input_stream_can_seek (GSeekable *seekable) +{ + return TRUE; +} + +static gboolean +g_memory_input_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GMemoryInputStream *memory_stream; + GMemoryInputStreamPrivate *priv; + goffset absolute; + + memory_stream = G_MEMORY_INPUT_STREAM (seekable); + priv = memory_stream->priv; + + switch (type) + { + case G_SEEK_CUR: + absolute = priv->pos + offset; + break; + + case G_SEEK_SET: + absolute = offset; + break; + + case G_SEEK_END: + absolute = priv->len + offset; + break; + + default: + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid GSeekType supplied")); + + return FALSE; + } + + if (absolute < 0 || absolute > priv->len) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid seek request")); + return FALSE; + } + + priv->pos = absolute; + + return TRUE; +} + +static gboolean +g_memory_input_stream_can_truncate (GSeekable *seekable) +{ + return FALSE; +} + +static gboolean +g_memory_input_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Cannot truncate GMemoryInputStream")); + return FALSE; +} + +#define __G_MEMORY_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gmemoryinputstream.h b/gio/gmemoryinputstream.h new file mode 100644 index 0000000..e629db1 --- /dev/null +++ b/gio/gmemoryinputstream.h @@ -0,0 +1,82 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MEMORY_INPUT_STREAM_H__ +#define __G_MEMORY_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_MEMORY_INPUT_STREAM (g_memory_input_stream_get_type ()) +#define G_MEMORY_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_MEMORY_INPUT_STREAM, GMemoryInputStream)) +#define G_MEMORY_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_MEMORY_INPUT_STREAM, GMemoryInputStreamClass)) +#define G_IS_MEMORY_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_MEMORY_INPUT_STREAM)) +#define G_IS_MEMORY_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_MEMORY_INPUT_STREAM)) +#define G_MEMORY_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MEMORY_INPUT_STREAM, GMemoryInputStreamClass)) + +/** + * GMemoryInputStream: + * + * Implements #GInputStream for arbitrary memory chunks. + **/ +typedef struct _GMemoryInputStreamClass GMemoryInputStreamClass; +typedef struct _GMemoryInputStreamPrivate GMemoryInputStreamPrivate; + +struct _GMemoryInputStream +{ + GInputStream parent_instance; + + /*< private >*/ + GMemoryInputStreamPrivate *priv; +}; + +struct _GMemoryInputStreamClass +{ + GInputStreamClass parent_class; + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + + +GType g_memory_input_stream_get_type (void) G_GNUC_CONST; +GInputStream * g_memory_input_stream_new (void); +GInputStream * g_memory_input_stream_new_from_data (const void *data, + gssize len, + GDestroyNotify destroy); +void g_memory_input_stream_add_data (GMemoryInputStream *stream, + const void *data, + gssize len, + GDestroyNotify destroy); + +G_END_DECLS + +#endif /* __G_MEMORY_INPUT_STREAM_H__ */ diff --git a/gio/gmemoryoutputstream.c b/gio/gmemoryoutputstream.c new file mode 100644 index 0000000..6b20c0a --- /dev/null +++ b/gio/gmemoryoutputstream.c @@ -0,0 +1,773 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: + * Christian Kellner + * Krzysztof Kosiński + */ + +#include "config.h" +#include "gmemoryoutputstream.h" +#include "goutputstream.h" +#include "gseekable.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "string.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gmemoryoutputstream + * @short_description: Streaming output operations on memory chunks + * @include: gio/gio.h + * @see_also: #GMemoryInputStream + * + * #GMemoryOutputStream is a class for using arbitrary + * memory chunks as output for GIO streaming output operations. + * + */ + +#define MIN_ARRAY_SIZE 16 + +enum { + PROP_0, + PROP_DATA, + PROP_SIZE, + PROP_DATA_SIZE, + PROP_REALLOC_FUNCTION, + PROP_DESTROY_FUNCTION +}; + +struct _GMemoryOutputStreamPrivate { + + gpointer data; /* Write buffer */ + gsize len; /* Current length of the data buffer. Can change with resizing. */ + gsize valid_len; /* The part of data that has been written to */ + gsize pos; /* Current position in the stream. Distinct from valid_len, + because the stream is seekable. */ + + GReallocFunc realloc_fn; + GDestroyNotify destroy; +}; + +static void g_memory_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_memory_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_memory_output_stream_finalize (GObject *object); + +static gssize g_memory_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + +static gboolean g_memory_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + +static void g_memory_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_memory_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_memory_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_memory_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); + +static void g_memory_output_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_memory_output_stream_tell (GSeekable *seekable); +static gboolean g_memory_output_stream_can_seek (GSeekable *seekable); +static gboolean g_memory_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_memory_output_stream_can_truncate (GSeekable *seekable); +static gboolean g_memory_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GMemoryOutputStream, g_memory_output_stream, G_TYPE_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_memory_output_stream_seekable_iface_init)) + + +static void +g_memory_output_stream_class_init (GMemoryOutputStreamClass *klass) +{ + GOutputStreamClass *ostream_class; + GObjectClass *gobject_class; + + g_type_class_add_private (klass, sizeof (GMemoryOutputStreamPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->set_property = g_memory_output_stream_set_property; + gobject_class->get_property = g_memory_output_stream_get_property; + gobject_class->finalize = g_memory_output_stream_finalize; + + ostream_class = G_OUTPUT_STREAM_CLASS (klass); + + ostream_class->write_fn = g_memory_output_stream_write; + ostream_class->close_fn = g_memory_output_stream_close; + ostream_class->write_async = g_memory_output_stream_write_async; + ostream_class->write_finish = g_memory_output_stream_write_finish; + ostream_class->close_async = g_memory_output_stream_close_async; + ostream_class->close_finish = g_memory_output_stream_close_finish; + + /** + * GMemoryOutputStream:data: + * + * Pointer to buffer where data will be written. + * + * Since: 2.24 + **/ + g_object_class_install_property (gobject_class, + PROP_DATA, + g_param_spec_pointer ("data", + P_("Data Buffer"), + P_("Pointer to buffer where data will be written."), + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GMemoryOutputStream:size: + * + * Current size of the data buffer. + * + * Since: 2.24 + **/ + g_object_class_install_property (gobject_class, + PROP_SIZE, + g_param_spec_ulong ("size", + P_("Data Buffer Size"), + P_("Current size of the data buffer."), + 0, G_MAXULONG, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GMemoryOutputStream:data-size: + * + * Size of data written to the buffer. + * + * Since: 2.24 + **/ + g_object_class_install_property (gobject_class, + PROP_DATA_SIZE, + g_param_spec_ulong ("data-size", + P_("Data Size"), + P_("Size of data written to the buffer."), + 0, G_MAXULONG, 0, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GMemoryOutputStream:realloc-function: + * + * Function with realloc semantics called to enlarge the buffer. + * + * Since: 2.24 + **/ + g_object_class_install_property (gobject_class, + PROP_REALLOC_FUNCTION, + g_param_spec_pointer ("realloc-function", + P_("Memory Reallocation Function"), + P_("Function with realloc semantics called to enlarge the buffer."), + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GMemoryOutputStream:destroy-function: + * + * Function called with the buffer as argument when the stream is destroyed. + * + * Since: 2.24 + **/ + g_object_class_install_property (gobject_class, + PROP_DESTROY_FUNCTION, + g_param_spec_pointer ("destroy-function", + P_("Destroy Notification Function"), + P_("Function called with the buffer as argument when the stream is destroyed."), + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_memory_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GMemoryOutputStream *stream; + GMemoryOutputStreamPrivate *priv; + + stream = G_MEMORY_OUTPUT_STREAM (object); + priv = stream->priv; + + switch (prop_id) + { + case PROP_DATA: + priv->data = g_value_get_pointer (value); + break; + case PROP_SIZE: + priv->len = g_value_get_ulong (value); + break; + case PROP_REALLOC_FUNCTION: + priv->realloc_fn = g_value_get_pointer (value); + break; + case PROP_DESTROY_FUNCTION: + priv->destroy = g_value_get_pointer (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_memory_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GMemoryOutputStream *stream; + GMemoryOutputStreamPrivate *priv; + + stream = G_MEMORY_OUTPUT_STREAM (object); + priv = stream->priv; + + switch (prop_id) + { + case PROP_DATA: + g_value_set_pointer (value, priv->data); + break; + case PROP_SIZE: + g_value_set_ulong (value, priv->len); + break; + case PROP_DATA_SIZE: + g_value_set_ulong (value, priv->valid_len); + break; + case PROP_REALLOC_FUNCTION: + g_value_set_pointer (value, priv->realloc_fn); + break; + case PROP_DESTROY_FUNCTION: + g_value_set_pointer (value, priv->destroy); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_memory_output_stream_finalize (GObject *object) +{ + GMemoryOutputStream *stream; + GMemoryOutputStreamPrivate *priv; + + stream = G_MEMORY_OUTPUT_STREAM (object); + priv = stream->priv; + + if (priv->destroy) + priv->destroy (priv->data); + + G_OBJECT_CLASS (g_memory_output_stream_parent_class)->finalize (object); +} + +static void +g_memory_output_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_memory_output_stream_tell; + iface->can_seek = g_memory_output_stream_can_seek; + iface->seek = g_memory_output_stream_seek; + iface->can_truncate = g_memory_output_stream_can_truncate; + iface->truncate_fn = g_memory_output_stream_truncate; +} + + +static void +g_memory_output_stream_init (GMemoryOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_MEMORY_OUTPUT_STREAM, + GMemoryOutputStreamPrivate); + stream->priv->pos = 0; + stream->priv->valid_len = 0; +} + +/** + * g_memory_output_stream_new: + * @data: pointer to a chunk of memory to use, or %NULL + * @size: the size of @data + * @realloc_function: a function with realloc() semantics (like g_realloc()) + * to be called when @data needs to be grown, or %NULL + * @destroy_function: a function to be called on @data when the stream is + * finalized, or %NULL + * + * Creates a new #GMemoryOutputStream. + * + * If @data is non-%NULL, the stream will use that for its internal storage. + * If @realloc_fn is non-%NULL, it will be used for resizing the internal + * storage when necessary. To construct a fixed-size output stream, + * pass %NULL as @realloc_fn. + * + * |[ + * /* a stream that can grow */ + * stream = g_memory_output_stream_new (NULL, 0, realloc, free); + * + * /* another stream that can grow */ + * stream2 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + * + * /* a fixed-size stream */ + * data = malloc (200); + * stream3 = g_memory_output_stream_new (data, 200, NULL, free); + * ]| + * + * Return value: A newly created #GMemoryOutputStream object. + **/ +GOutputStream * +g_memory_output_stream_new (gpointer data, + gsize size, + GReallocFunc realloc_function, + GDestroyNotify destroy_function) +{ + GOutputStream *stream; + + stream = g_object_new (G_TYPE_MEMORY_OUTPUT_STREAM, + "data", data, + "size", size, + "realloc-function", realloc_function, + "destroy-function", destroy_function, + NULL); + + return stream; +} + +/** + * g_memory_output_stream_get_data: + * @ostream: a #GMemoryOutputStream + * + * Gets any loaded data from the @ostream. + * + * Note that the returned pointer may become invalid on the next + * write or truncate operation on the stream. + * + * Returns: pointer to the stream's data + **/ +gpointer +g_memory_output_stream_get_data (GMemoryOutputStream *ostream) +{ + g_return_val_if_fail (G_IS_MEMORY_OUTPUT_STREAM (ostream), NULL); + + return ostream->priv->data; +} + +/** + * g_memory_output_stream_get_size: + * @ostream: a #GMemoryOutputStream + * + * Gets the size of the currently allocated data area (availible from + * g_memory_output_stream_get_data()). If the stream isn't + * growable (no realloc was passed to g_memory_output_stream_new()) then + * this is the maximum size of the stream and further writes + * will return %G_IO_ERROR_NO_SPACE. + * + * Note that for growable streams the returned size may become invalid on + * the next write or truncate operation on the stream. + * + * If you want the number of bytes currently written to the stream, use + * g_memory_output_stream_get_data_size(). + * + * Returns: the number of bytes allocated for the data buffer + */ +gsize +g_memory_output_stream_get_size (GMemoryOutputStream *ostream) +{ + g_return_val_if_fail (G_IS_MEMORY_OUTPUT_STREAM (ostream), 0); + + return ostream->priv->len; +} + +/** + * g_memory_output_stream_get_data_size: + * @ostream: a #GMemoryOutputStream + * + * Returns the number of bytes from the start up + * to including the last byte written in the stream + * that has not been truncated away. + * + * Returns: the number of bytes written to the stream + * + * Since: 2.18 + */ +gsize +g_memory_output_stream_get_data_size (GMemoryOutputStream *ostream) +{ + g_return_val_if_fail (G_IS_MEMORY_OUTPUT_STREAM (ostream), 0); + + return ostream->priv->valid_len; +} + +static gboolean +array_resize (GMemoryOutputStream *ostream, + gsize size, + gboolean allow_partial, + GError **error) +{ + GMemoryOutputStreamPrivate *priv; + gpointer data; + gsize len; + + priv = ostream->priv; + + if (priv->len == size) + return TRUE; + + if (!priv->realloc_fn) + { + if (allow_partial && + priv->pos < priv->len) + return TRUE; /* Short write */ + + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE, + _("Memory output stream not resizable")); + return FALSE; + } + + len = priv->len; + data = priv->realloc_fn (priv->data, size); + + if (size > 0 && !data) + { + if (allow_partial && + priv->pos < priv->len) + return TRUE; /* Short write */ + + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE, + _("Failed to resize memory output stream")); + return FALSE; + } + + if (size > len) + memset ((guint8 *)data + len, 0, size - len); + + priv->data = data; + priv->len = size; + + if (priv->len < priv->valid_len) + priv->valid_len = priv->len; + + return TRUE; +} + +static gint +g_nearest_pow (gint num) +{ + gint n = 1; + + while (n < num) + n <<= 1; + + return n; +} + +static gssize +g_memory_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GMemoryOutputStream *ostream; + GMemoryOutputStreamPrivate *priv; + guint8 *dest; + gsize new_size; + + ostream = G_MEMORY_OUTPUT_STREAM (stream); + priv = ostream->priv; + + if (count == 0) + return 0; + + /* Check for address space overflow, but only if the buffer is resizable. + Otherwise we just do a short write and don't worry. */ + if (priv->realloc_fn && priv->pos + count < priv->pos) + goto overflow; + + if (priv->pos + count > priv->len) + { + /* At least enought to fit the write, rounded up + for greater than linear growth. + TODO: This wastes a lot of memory at large stream sizes. + Figure out a more rational allocation strategy. */ + new_size = g_nearest_pow (priv->pos + count); + /* Check for overflow again. We have only checked if + pos + count > G_MAXSIZE, but it only catches the case of writing + more than 4GiB total on a 32-bit system. There's still the problem + of g_nearest_pow overflowing above 0x7fffffff, so we're + effectively limited to 2GiB. */ + if (new_size < priv->len) + goto overflow; + + new_size = MAX (new_size, MIN_ARRAY_SIZE); + if (!array_resize (ostream, new_size, TRUE, error)) + return -1; + } + + /* Make sure we handle short writes if the array_resize + only added part of the required memory */ + count = MIN (count, priv->len - priv->pos); + + dest = (guint8 *)priv->data + priv->pos; + memcpy (dest, buffer, count); + priv->pos += count; + + if (priv->pos > priv->valid_len) + priv->valid_len = priv->pos; + + return count; + + overflow: + /* Overflow: buffer size would need to be bigger than G_MAXSIZE. */ + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NO_SPACE, + _("Amount of memory required to process the write is " + "larger than available address space")); + return -1; +} + +static gboolean +g_memory_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + +static void +g_memory_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GSimpleAsyncResult *simple; + gssize nwritten; + + nwritten = g_memory_output_stream_write (stream, + buffer, + count, + cancellable, + NULL); + + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + data, + g_memory_output_stream_write_async); + + g_simple_async_result_set_op_res_gssize (simple, nwritten); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +static gssize +g_memory_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize nwritten; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_memory_output_stream_write_async); + + nwritten = g_simple_async_result_get_op_res_gssize (simple); + + return nwritten; +} + +static void +g_memory_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GSimpleAsyncResult *simple; + + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + data, + g_memory_output_stream_close_async); + + + /* will always return TRUE */ + g_memory_output_stream_close (stream, cancellable, NULL); + + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +static gboolean +g_memory_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == + g_memory_output_stream_close_async); + + return TRUE; +} + +static goffset +g_memory_output_stream_tell (GSeekable *seekable) +{ + GMemoryOutputStream *stream; + GMemoryOutputStreamPrivate *priv; + + stream = G_MEMORY_OUTPUT_STREAM (seekable); + priv = stream->priv; + + return priv->pos; +} + +static gboolean +g_memory_output_stream_can_seek (GSeekable *seekable) +{ + return TRUE; +} + +static gboolean +g_memory_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GMemoryOutputStream *stream; + GMemoryOutputStreamPrivate *priv; + goffset absolute; + + stream = G_MEMORY_OUTPUT_STREAM (seekable); + priv = stream->priv; + + switch (type) + { + case G_SEEK_CUR: + absolute = priv->pos + offset; + break; + + case G_SEEK_SET: + absolute = offset; + break; + + case G_SEEK_END: + absolute = priv->len + offset; + break; + + default: + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid GSeekType supplied")); + + return FALSE; + } + + if (absolute < 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Requested seek before the beginning of the stream")); + return FALSE; + } + + if (absolute > priv->len) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Requested seek beyond the end of the stream")); + return FALSE; + } + + priv->pos = absolute; + + return TRUE; +} + +static gboolean +g_memory_output_stream_can_truncate (GSeekable *seekable) +{ + GMemoryOutputStream *ostream; + GMemoryOutputStreamPrivate *priv; + + ostream = G_MEMORY_OUTPUT_STREAM (seekable); + priv = ostream->priv; + + return priv->realloc_fn != NULL; +} + +static gboolean +g_memory_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + GMemoryOutputStream *ostream = G_MEMORY_OUTPUT_STREAM (seekable); + + if (!array_resize (ostream, offset, FALSE, error)) + return FALSE; + + return TRUE; +} + +#define __G_MEMORY_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gmemoryoutputstream.h b/gio/gmemoryoutputstream.h new file mode 100644 index 0000000..ddb4051 --- /dev/null +++ b/gio/gmemoryoutputstream.h @@ -0,0 +1,97 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Christian Kellner + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MEMORY_OUTPUT_STREAM_H__ +#define __G_MEMORY_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_MEMORY_OUTPUT_STREAM (g_memory_output_stream_get_type ()) +#define G_MEMORY_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_MEMORY_OUTPUT_STREAM, GMemoryOutputStream)) +#define G_MEMORY_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_MEMORY_OUTPUT_STREAM, GMemoryOutputStreamClass)) +#define G_IS_MEMORY_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_MEMORY_OUTPUT_STREAM)) +#define G_IS_MEMORY_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_MEMORY_OUTPUT_STREAM)) +#define G_MEMORY_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MEMORY_OUTPUT_STREAM, GMemoryOutputStreamClass)) + +/** + * GMemoryOutputStream: + * + * Implements #GOutputStream for arbitrary memory chunks. + **/ +typedef struct _GMemoryOutputStreamClass GMemoryOutputStreamClass; +typedef struct _GMemoryOutputStreamPrivate GMemoryOutputStreamPrivate; + +struct _GMemoryOutputStream +{ + GOutputStream parent_instance; + + /*< private >*/ + GMemoryOutputStreamPrivate *priv; +}; + +struct _GMemoryOutputStreamClass +{ + GOutputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +/** + * GReallocFunc: + * @data: memory block to reallocate + * @size: size to reallocate @data to + * + * Changes the size of the memory block pointed to by @data to + * @size bytes. + * + * The function should have the same semantics as realloc(). + * + * Returns: a pointer to the reallocated memory + */ +typedef gpointer (* GReallocFunc) (gpointer data, + gsize size); + +GType g_memory_output_stream_get_type (void) G_GNUC_CONST; + +GOutputStream *g_memory_output_stream_new (gpointer data, + gsize size, + GReallocFunc realloc_function, + GDestroyNotify destroy_function); +gpointer g_memory_output_stream_get_data (GMemoryOutputStream *ostream); +gsize g_memory_output_stream_get_size (GMemoryOutputStream *ostream); +gsize g_memory_output_stream_get_data_size (GMemoryOutputStream *ostream); + +G_END_DECLS + +#endif /* __G_MEMORY_OUTPUT_STREAM_H__ */ diff --git a/gio/gmount.c b/gio/gmount.c new file mode 100644 index 0000000..3e80dfb --- /dev/null +++ b/gio/gmount.c @@ -0,0 +1,1015 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" + +#include + +#include "gmount.h" +#include "gmountprivate.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gmount + * @short_description: Mount management + * @include: gio/gio.h + * @see also: GVolume, GUnixMount + * + * The #GMount interface represents user-visible mounts. Note, when + * porting from GnomeVFS, #GMount is the moral equivalent of #GnomeVFSVolume. + * + * #GMount is a "mounted" filesystem that you can access. Mounted is in + * quotes because it's not the same as a unix mount, it might be a gvfs + * mount, but you can still access the files on it if you use GIO. Might or + * might not be related to a volume object. + * + * Unmounting a #GMount instance is an asynchronous operation. For + * more information about asynchronous operations, see #GAsyncReady + * and #GSimpleAsyncReady. To unmount a #GMount instance, first call + * g_mount_unmount_with_operation() with (at least) the #GMount instance and a + * #GAsyncReadyCallback. The callback will be fired when the + * operation has resolved (either with success or failure), and a + * #GAsyncReady structure will be passed to the callback. That + * callback should then call g_mount_unmount_with_operation_finish() with the #GMount + * and the #GAsyncReady data to see if the operation was completed + * successfully. If an @error is present when g_mount_unmount_with_operation_finish() + * is called, then it will be filled with any error information. + **/ + +typedef GMountIface GMountInterface; +G_DEFINE_INTERFACE (GMount, g_mount, G_TYPE_OBJECT) + +static void +g_mount_default_init (GMountInterface *iface) +{ + /** + * GMount::changed: + * @mount: the object on which the signal is emitted + * + * Emitted when the mount has been changed. + **/ + g_signal_new (I_("changed"), + G_TYPE_MOUNT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountIface, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GMount::unmounted: + * @mount: the object on which the signal is emitted + * + * This signal is emitted when the #GMount have been + * unmounted. If the recipient is holding references to the + * object they should release them so the object can be + * finalized. + **/ + g_signal_new (I_("unmounted"), + G_TYPE_MOUNT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountIface, unmounted), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + /** + * GMount::pre-unmount: + * @mount: the object on which the signal is emitted + * + * This signal is emitted when the #GMount is about to be + * unmounted. + * + * Since: 2.22 + **/ + g_signal_new (I_("pre-unmount"), + G_TYPE_MOUNT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountIface, pre_unmount), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +/** + * g_mount_get_root: + * @mount: a #GMount. + * + * Gets the root directory on @mount. + * + * Returns: a #GFile. + * The returned object should be unreffed with + * g_object_unref() when no longer needed. + **/ +GFile * +g_mount_get_root (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->get_root) (mount); +} + +/** + * g_mount_get_default_location: + * @mount: a #GMount. + * + * Gets the default location of @mount. The default location of the given + * @mount is a path that reflects the main entry point for the user (e.g. + * the home directory, or the root of the volume). + * + * Returns: a #GFile. + * The returned object should be unreffed with + * g_object_unref() when no longer needed. + **/ +GFile * +g_mount_get_default_location (GMount *mount) +{ + GMountIface *iface; + GFile *file; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + /* Fallback to get_root when default_location () is not available */ + if (iface->get_default_location) + file = (* iface->get_default_location) (mount); + else + file = (* iface->get_root) (mount); + + return file; +} + +/** + * g_mount_get_name: + * @mount: a #GMount. + * + * Gets the name of @mount. + * + * Returns: the name for the given @mount. + * The returned string should be freed with g_free() + * when no longer needed. + **/ +char * +g_mount_get_name (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->get_name) (mount); +} + +/** + * g_mount_get_icon: + * @mount: a #GMount. + * + * Gets the icon for @mount. + * + * Returns: a #GIcon. + * The returned object should be unreffed with + * g_object_unref() when no longer needed. + **/ +GIcon * +g_mount_get_icon (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->get_icon) (mount); +} + +/** + * g_mount_get_uuid: + * @mount: a #GMount. + * + * Gets the UUID for the @mount. The reference is typically based on + * the file system UUID for the mount in question and should be + * considered an opaque string. Returns %NULL if there is no UUID + * available. + * + * Returns: the UUID for @mount or %NULL if no UUID can be computed. + * The returned string should be freed with g_free() + * when no longer needed. + **/ +char * +g_mount_get_uuid (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->get_uuid) (mount); +} + +/** + * g_mount_get_volume: + * @mount: a #GMount. + * + * Gets the volume for the @mount. + * + * Returns: a #GVolume or %NULL if @mount is not associated with a volume. + * The returned object should be unreffed with + * g_object_unref() when no longer needed. + **/ +GVolume * +g_mount_get_volume (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->get_volume) (mount); +} + +/** + * g_mount_get_drive: + * @mount: a #GMount. + * + * Gets the drive for the @mount. + * + * This is a convenience method for getting the #GVolume and then + * using that object to get the #GDrive. + * + * Returns: a #GDrive or %NULL if @mount is not associated with a volume or a drive. + * The returned object should be unreffed with + * g_object_unref() when no longer needed. + **/ +GDrive * +g_mount_get_drive (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->get_drive) (mount); +} + +/** + * g_mount_can_unmount: + * @mount: a #GMount. + * + * Checks if @mount can be mounted. + * + * Returns: %TRUE if the @mount can be unmounted. + **/ +gboolean +g_mount_can_unmount (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->can_unmount) (mount); +} + +/** + * g_mount_can_eject: + * @mount: a #GMount. + * + * Checks if @mount can be eject. + * + * Returns: %TRUE if the @mount can be ejected. + **/ +gboolean +g_mount_can_eject (GMount *mount) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + + iface = G_MOUNT_GET_IFACE (mount); + + return (* iface->can_eject) (mount); +} + +/** + * g_mount_unmount: + * @mount: a #GMount. + * @flags: flags affecting the operation + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Unmounts a mount. This is an asynchronous operation, and is + * finished by calling g_mount_unmount_finish() with the @mount + * and #GAsyncResult data returned in the @callback. + * + * Deprecated: 2.22: Use g_mount_unmount_with_operation() instead. + **/ +void +g_mount_unmount (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GMountIface *iface; + + g_return_if_fail (G_IS_MOUNT (mount)); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->unmount == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (mount), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement unmount. */ + _("mount doesn't implement \"unmount\"")); + + return; + } + + (* iface->unmount) (mount, flags, cancellable, callback, user_data); +} + +/** + * g_mount_unmount_finish: + * @mount: a #GMount. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes unmounting a mount. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the mount was successfully unmounted. %FALSE otherwise. + * + * Deprecated: 2.22: Use g_mount_unmount_with_operation_finish() instead. + **/ +gboolean +g_mount_unmount_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_MOUNT_GET_IFACE (mount); + return (* iface->unmount_finish) (mount, result, error); +} + + +/** + * g_mount_eject: + * @mount: a #GMount. + * @flags: flags affecting the unmount if required for eject + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Ejects a mount. This is an asynchronous operation, and is + * finished by calling g_mount_eject_finish() with the @mount + * and #GAsyncResult data returned in the @callback. + * + * Deprecated: 2.22: Use g_mount_eject_with_operation() instead. + **/ +void +g_mount_eject (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GMountIface *iface; + + g_return_if_fail (G_IS_MOUNT (mount)); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->eject == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (mount), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement eject. */ + _("mount doesn't implement \"eject\"")); + + return; + } + + (* iface->eject) (mount, flags, cancellable, callback, user_data); +} + +/** + * g_mount_eject_finish: + * @mount: a #GMount. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes ejecting a mount. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the mount was successfully ejected. %FALSE otherwise. + * + * Deprecated: 2.22: Use g_mount_eject_with_operation_finish() instead. + **/ +gboolean +g_mount_eject_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_MOUNT_GET_IFACE (mount); + return (* iface->eject_finish) (mount, result, error); +} + +/** + * g_mount_unmount_with_operation: + * @mount: a #GMount. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Unmounts a mount. This is an asynchronous operation, and is + * finished by calling g_mount_unmount_with_operation_finish() with the @mount + * and #GAsyncResult data returned in the @callback. + * + * Since: 2.22 + **/ +void +g_mount_unmount_with_operation (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GMountIface *iface; + + g_return_if_fail (G_IS_MOUNT (mount)); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->unmount == NULL && iface->unmount_with_operation == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (mount), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement any of unmount or unmount_with_operation. */ + _("mount doesn't implement \"unmount\" or \"unmount_with_operation\"")); + + return; + } + + if (iface->unmount_with_operation != NULL) + (* iface->unmount_with_operation) (mount, flags, mount_operation, cancellable, callback, user_data); + else + (* iface->unmount) (mount, flags, cancellable, callback, user_data); +} + +/** + * g_mount_unmount_with_operation_finish: + * @mount: a #GMount. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes unmounting a mount. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the mount was successfully unmounted. %FALSE otherwise. + * + * Since: 2.22 + **/ +gboolean +g_mount_unmount_with_operation_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_MOUNT_GET_IFACE (mount); + if (iface->unmount_with_operation_finish != NULL) + return (* iface->unmount_with_operation_finish) (mount, result, error); + else + return (* iface->unmount_finish) (mount, result, error); +} + + +/** + * g_mount_eject_with_operation: + * @mount: a #GMount. + * @flags: flags affecting the unmount if required for eject + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Ejects a mount. This is an asynchronous operation, and is + * finished by calling g_mount_eject_with_operation_finish() with the @mount + * and #GAsyncResult data returned in the @callback. + * + * Since: 2.22 + **/ +void +g_mount_eject_with_operation (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GMountIface *iface; + + g_return_if_fail (G_IS_MOUNT (mount)); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->eject == NULL && iface->eject_with_operation == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (mount), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement any of eject or eject_with_operation. */ + _("mount doesn't implement \"eject\" or \"eject_with_operation\"")); + return; + } + + if (iface->eject_with_operation != NULL) + (* iface->eject_with_operation) (mount, flags, mount_operation, cancellable, callback, user_data); + else + (* iface->eject) (mount, flags, cancellable, callback, user_data); +} + +/** + * g_mount_eject_with_operation_finish: + * @mount: a #GMount. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes ejecting a mount. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the mount was successfully ejected. %FALSE otherwise. + * + * Since: 2.22 + **/ +gboolean +g_mount_eject_with_operation_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_MOUNT_GET_IFACE (mount); + if (iface->eject_with_operation_finish != NULL) + return (* iface->eject_with_operation_finish) (mount, result, error); + else + return (* iface->eject_finish) (mount, result, error); +} + +/** + * g_mount_remount: + * @mount: a #GMount. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Remounts a mount. This is an asynchronous operation, and is + * finished by calling g_mount_remount_finish() with the @mount + * and #GAsyncResults data returned in the @callback. + * + * Remounting is useful when some setting affecting the operation + * of the volume has been changed, as these may need a remount to + * take affect. While this is semantically equivalent with unmounting + * and then remounting not all backends might need to actually be + * unmounted. + **/ +void +g_mount_remount (GMount *mount, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GMountIface *iface; + + g_return_if_fail (G_IS_MOUNT (mount)); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->remount == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (mount), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement remount. */ + _("mount doesn't implement \"remount\"")); + + return; + } + + (* iface->remount) (mount, flags, mount_operation, cancellable, callback, user_data); +} + +/** + * g_mount_remount_finish: + * @mount: a #GMount. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes remounting a mount. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the mount was successfully remounted. %FALSE otherwise. + **/ +gboolean +g_mount_remount_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_MOUNT_GET_IFACE (mount); + return (* iface->remount_finish) (mount, result, error); +} + +/** + * g_mount_guess_content_type: + * @mount: a #GMount + * @force_rescan: Whether to force a rescan of the content. + * Otherwise a cached result will be used if available + * @cancellable: optional #GCancellable object, %NULL to ignore + * @callback: a #GAsyncReadyCallback + * @user_data: user data passed to @callback + * + * Tries to guess the type of content stored on @mount. Returns one or + * more textual identifiers of well-known content types (typically + * prefixed with "x-content/"), e.g. x-content/image-dcf for camera + * memory cards. See the shared-mime-info + * specification for more on x-content types. + * + * This is an asynchronous operation (see + * g_mount_guess_content_type_sync() for the synchronous version), and + * is finished by calling g_mount_guess_content_type_finish() with the + * @mount and #GAsyncResult data returned in the @callback. + * + * Since: 2.18 + */ +void +g_mount_guess_content_type (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GMountIface *iface; + + g_return_if_fail (G_IS_MOUNT (mount)); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->guess_content_type == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (mount), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement content type guessing. */ + _("mount doesn't implement content type guessing")); + + return; + } + + (* iface->guess_content_type) (mount, force_rescan, cancellable, callback, user_data); +} + +/** + * g_mount_guess_content_type_finish: + * @mount: a #GMount + * @result: a #GAsyncResult + * @error: a #GError location to store the error occuring, or %NULL to + * ignore + * + * Finishes guessing content types of @mount. If any errors occured + * during the operation, @error will be set to contain the errors and + * %FALSE will be returned. In particular, you may get an + * %G_IO_ERROR_NOT_SUPPORTED if the mount does not support content + * guessing. + * + * Returns: a %NULL-terminated array of content types or %NULL on error. + * Caller should free this array with g_strfreev() when done with it. + * + * Since: 2.18 + **/ +gchar ** +g_mount_guess_content_type_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_MOUNT_GET_IFACE (mount); + return (* iface->guess_content_type_finish) (mount, result, error); +} + +/** + * g_mount_guess_content_type_sync: + * @mount: a #GMount + * @force_rescan: Whether to force a rescan of the content. + * Otherwise a cached result will be used if available + * @cancellable: optional #GCancellable object, %NULL to ignore + * @error: a #GError location to store the error occuring, or %NULL to + * ignore + * + * Tries to guess the type of content stored on @mount. Returns one or + * more textual identifiers of well-known content types (typically + * prefixed with "x-content/"), e.g. x-content/image-dcf for camera + * memory cards. See the shared-mime-info + * specification for more on x-content types. + * + * This is an synchronous operation and as such may block doing IO; + * see g_mount_guess_content_type() for the asynchronous version. + * + * Returns: a %NULL-terminated array of content types or %NULL on error. + * Caller should free this array with g_strfreev() when done with it. + * + * Since: 2.18 + */ +char ** +g_mount_guess_content_type_sync (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GError **error) +{ + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->guess_content_type_sync == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for mount objects that + * don't implement content type guessing. */ + _("mount doesn't implement synchronous content type guessing")); + + return NULL; + } + + return (* iface->guess_content_type_sync) (mount, force_rescan, cancellable, error); +} + +G_LOCK_DEFINE_STATIC (priv_lock); + +/* only access this structure when holding priv_lock */ +typedef struct +{ + gint shadow_ref_count; +} GMountPrivate; + +static void +free_private (GMountPrivate *private) +{ + G_LOCK (priv_lock); + g_free (private); + G_UNLOCK (priv_lock); +} + +/* may only be called when holding priv_lock */ +static GMountPrivate * +get_private (GMount *mount) +{ + GMountPrivate *private; + + private = g_object_get_data (G_OBJECT (mount), "g-mount-private"); + if (G_LIKELY (private != NULL)) + goto out; + + private = g_new0 (GMountPrivate, 1); + g_object_set_data_full (G_OBJECT (mount), + "g-mount-private", + private, + (GDestroyNotify) free_private); + + out: + return private; +} + +/** + * g_mount_is_shadowed: + * @mount: A #GMount. + * + * Determines if @mount is shadowed. Applications or libraries should + * avoid displaying @mount in the user interface if it is shadowed. + * + * A mount is said to be shadowed if there exists one or more user + * visible objects (currently #GMount objects) with a root that is + * inside the root of @mount. + * + * One application of shadow mounts is when exposing a single file + * system that is used to address several logical volumes. In this + * situation, a #GVolumeMonitor implementation would create two + * #GVolume objects (for example, one for the camera functionality of + * the device and one for a SD card reader on the device) with + * activation URIs gphoto2://[usb:001,002]/store1/ + * and gphoto2://[usb:001,002]/store2/. When the + * underlying mount (with root + * gphoto2://[usb:001,002]/) is mounted, said + * #GVolumeMonitor implementation would create two #GMount objects + * (each with their root matching the corresponding volume activation + * root) that would shadow the original mount. + * + * The proxy monitor in GVfs 2.26 and later, automatically creates and + * manage shadow mounts (and shadows the underlying mount) if the + * activation root on a #GVolume is set. + * + * Returns: %TRUE if @mount is shadowed. + * + * Since: 2.20 + **/ +gboolean +g_mount_is_shadowed (GMount *mount) +{ + GMountPrivate *priv; + gboolean ret; + + g_return_val_if_fail (G_IS_MOUNT (mount), FALSE); + + G_LOCK (priv_lock); + priv = get_private (mount); + ret = (priv->shadow_ref_count > 0); + G_UNLOCK (priv_lock); + + return ret; +} + +/** + * g_mount_shadow: + * @mount: A #GMount. + * + * Increments the shadow count on @mount. Usually used by + * #GVolumeMonitor implementations when creating a shadow mount for + * @mount, see g_mount_is_shadowed() for more information. The caller + * will need to emit the #GMount::changed signal on @mount manually. + * + * Since: 2.20 + **/ +void +g_mount_shadow (GMount *mount) +{ + GMountPrivate *priv; + + g_return_if_fail (G_IS_MOUNT (mount)); + + G_LOCK (priv_lock); + priv = get_private (mount); + priv->shadow_ref_count += 1; + G_UNLOCK (priv_lock); +} + +/** + * g_mount_unshadow: + * @mount: A #GMount. + * + * Decrements the shadow count on @mount. Usually used by + * #GVolumeMonitor implementations when destroying a shadow mount for + * @mount, see g_mount_is_shadowed() for more information. The caller + * will need to emit the #GMount::changed signal on @mount manually. + * + * Since: 2.20 + **/ +void +g_mount_unshadow (GMount *mount) +{ + GMountPrivate *priv; + + g_return_if_fail (G_IS_MOUNT (mount)); + + G_LOCK (priv_lock); + priv = get_private (mount); + priv->shadow_ref_count -= 1; + if (priv->shadow_ref_count < 0) + g_warning ("Shadow ref count on GMount is negative"); + G_UNLOCK (priv_lock); +} + +#define __G_MOUNT_C__ +#include "gioaliasdef.c" diff --git a/gio/gmount.h b/gio/gmount.h new file mode 100644 index 0000000..779bac5 --- /dev/null +++ b/gio/gmount.h @@ -0,0 +1,242 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MOUNT_H__ +#define __G_MOUNT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_MOUNT (g_mount_get_type ()) +#define G_MOUNT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_MOUNT, GMount)) +#define G_IS_MOUNT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_MOUNT)) +#define G_MOUNT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_MOUNT, GMountIface)) + +typedef struct _GMountIface GMountIface; + +/** + * GMountIface: + * @g_iface: The parent interface. + * @changed: Changed signal that is emitted when the mount's state has changed. + * @unmounted: The unmounted signal that is emitted when the #GMount have been unmounted. If the recipient is holding references to the object they should release them so the object can be finalized. + * @pre_unmount: The pre_unmout signal that is emitted when the #GMount will soon be emitted. If the recipient is somehow holding the mount open by keeping an open file on it it should close the file. + * @get_root: Gets a #GFile to the root directory of the #GMount. + * @get_name: Gets a string containing the name of the #GMount. + * @get_icon: Gets a #GIcon for the #GMount. + * @get_uuid: Gets the UUID for the #GMount. The reference is typically based on the file system UUID for the mount in question and should be considered an opaque string. Returns %NULL if there is no UUID available. + * @get_volume: Gets a #GVolume the mount is located on. Returns %NULL if the #GMount is not associated with a #GVolume. + * @get_drive: Gets a #GDrive the volume of the mount is located on. Returns %NULL if the #GMount is not associated with a #GDrive or a #GVolume. This is convenience method for getting the #GVolume and using that to get the #GDrive. + * @can_unmount: Checks if a #GMount can be unmounted. + * @can_eject: Checks if a #GMount can be ejected. + * @unmount: Starts unmounting a #GMount. + * @unmount_finish: Finishes an unmounting operation. + * @eject: Starts ejecting a #GMount. + * @eject_finish: Finishes an eject operation. + * @remount: Starts remounting a #GMount. + * @remount_finish: Finishes a remounting operation. + * @guess_content_type: Starts guessing the type of the content of a #GMount. + * See g_mount_guess_content_type() for more information on content + * type guessing. This operation was added in 2.18. + * @guess_content_type_finish: Finishes a contenet type guessing operation. Added in 2.18. + * @guess_content_type_sync: Synchronous variant of @guess_content_type. Added in 2.18 + * @unmount_with_operation: Starts unmounting a #GMount using a #GMountOperation. Since 2.22. + * @unmount_with_operation_finish: Finishes an unmounting operation using a #GMountOperation. Since 2.22. + * @eject_with_operation: Starts ejecting a #GMount using a #GMountOperation. Since 2.22. + * @eject_with_operation_finish: Finishes an eject operation using a #GMountOperation. Since 2.22. + * @get_default_location: Gets a #GFile indication a start location that can be use as the entry point for this mount. Since 2.24. + * + * Interface for implementing operations for mounts. + **/ +struct _GMountIface +{ + GTypeInterface g_iface; + + /* signals */ + + void (* changed) (GMount *mount); + void (* unmounted) (GMount *mount); + + /* Virtual Table */ + + GFile * (* get_root) (GMount *mount); + char * (* get_name) (GMount *mount); + GIcon * (* get_icon) (GMount *mount); + char * (* get_uuid) (GMount *mount); + GVolume * (* get_volume) (GMount *mount); + GDrive * (* get_drive) (GMount *mount); + gboolean (* can_unmount) (GMount *mount); + gboolean (* can_eject) (GMount *mount); + + void (* unmount) (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* unmount_finish) (GMount *mount, + GAsyncResult *result, + GError **error); + + void (* eject) (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_finish) (GMount *mount, + GAsyncResult *result, + GError **error); + + void (* remount) (GMount *mount, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* remount_finish) (GMount *mount, + GAsyncResult *result, + GError **error); + + void (* guess_content_type) (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gchar ** (* guess_content_type_finish) (GMount *mount, + GAsyncResult *result, + GError **error); + gchar ** (* guess_content_type_sync) (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GError **error); + + /* Signal, not VFunc */ + void (* pre_unmount) (GMount *mount); + + void (* unmount_with_operation) (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* unmount_with_operation_finish) (GMount *mount, + GAsyncResult *result, + GError **error); + + void (* eject_with_operation) (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_with_operation_finish) (GMount *mount, + GAsyncResult *result, + GError **error); + GFile * (* get_default_location) (GMount *mount); +}; + +GType g_mount_get_type (void) G_GNUC_CONST; + +GFile * g_mount_get_root (GMount *mount); +GFile * g_mount_get_default_location (GMount *mount); +char * g_mount_get_name (GMount *mount); +GIcon * g_mount_get_icon (GMount *mount); +char * g_mount_get_uuid (GMount *mount); +GVolume * g_mount_get_volume (GMount *mount); +GDrive * g_mount_get_drive (GMount *mount); +gboolean g_mount_can_unmount (GMount *mount); +gboolean g_mount_can_eject (GMount *mount); + +#ifndef G_DISABLE_DEPRECATED +void g_mount_unmount (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_mount_unmount_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +void g_mount_eject (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_mount_eject_finish (GMount *mount, + GAsyncResult *result, + GError **error); +#endif + +void g_mount_remount (GMount *mount, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_mount_remount_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +void g_mount_guess_content_type (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gchar ** g_mount_guess_content_type_finish (GMount *mount, + GAsyncResult *result, + GError **error); +gchar ** g_mount_guess_content_type_sync (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GError **error); + +gboolean g_mount_is_shadowed (GMount *mount); +void g_mount_shadow (GMount *mount); +void g_mount_unshadow (GMount *mount); + +void g_mount_unmount_with_operation (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_mount_unmount_with_operation_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +void g_mount_eject_with_operation (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_mount_eject_with_operation_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_MOUNT_H__ */ diff --git a/gio/gmountoperation.c b/gio/gmountoperation.c new file mode 100644 index 0000000..35927d4 --- /dev/null +++ b/gio/gmountoperation.c @@ -0,0 +1,713 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gmountoperation.h" +#include "gioenumtypes.h" +#include "gio-marshal.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gmountoperation + * @short_description: Object used for authentication and user interaction + * @include: gio/gio.h + * + * #GMountOperation provides a mechanism for interacting with the user. + * It can be used for authenticating mountable operations, such as loop + * mounting files, hard drive partitions or server locations. It can + * also be used to ask the user questions or show a list of applications + * preventing unmount or eject operations from completing. + * + * Note that #GMountOperation is used for more than just #GMount + * objects – for example it is also used in g_drive_start() and + * g_drive_stop(). + * + * Users should instantiate a subclass of this that implements all the + * various callbacks to show the required dialogs, such as + * #GtkMountOperation. If no user interaction is desired (for example + * when automounting filesystems at login time), usually %NULL can be + * passed, see each method taking a #GMountOperation for details. + */ + +G_DEFINE_TYPE (GMountOperation, g_mount_operation, G_TYPE_OBJECT); + +enum { + ASK_PASSWORD, + ASK_QUESTION, + REPLY, + ABORTED, + SHOW_PROCESSES, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +struct _GMountOperationPrivate { + char *password; + char *user; + char *domain; + gboolean anonymous; + GPasswordSave password_save; + int choice; +}; + +enum { + PROP_0, + PROP_USERNAME, + PROP_PASSWORD, + PROP_ANONYMOUS, + PROP_DOMAIN, + PROP_PASSWORD_SAVE, + PROP_CHOICE +}; + +static void +g_mount_operation_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GMountOperation *operation; + + operation = G_MOUNT_OPERATION (object); + + switch (prop_id) + { + case PROP_USERNAME: + g_mount_operation_set_username (operation, + g_value_get_string (value)); + break; + + case PROP_PASSWORD: + g_mount_operation_set_password (operation, + g_value_get_string (value)); + break; + + case PROP_ANONYMOUS: + g_mount_operation_set_anonymous (operation, + g_value_get_boolean (value)); + break; + + case PROP_DOMAIN: + g_mount_operation_set_domain (operation, + g_value_get_string (value)); + break; + + case PROP_PASSWORD_SAVE: + g_mount_operation_set_password_save (operation, + g_value_get_enum (value)); + break; + + case PROP_CHOICE: + g_mount_operation_set_choice (operation, + g_value_get_int (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void +g_mount_operation_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GMountOperation *operation; + GMountOperationPrivate *priv; + + operation = G_MOUNT_OPERATION (object); + priv = operation->priv; + + switch (prop_id) + { + case PROP_USERNAME: + g_value_set_string (value, priv->user); + break; + + case PROP_PASSWORD: + g_value_set_string (value, priv->password); + break; + + case PROP_ANONYMOUS: + g_value_set_boolean (value, priv->anonymous); + break; + + case PROP_DOMAIN: + g_value_set_string (value, priv->domain); + break; + + case PROP_PASSWORD_SAVE: + g_value_set_enum (value, priv->password_save); + break; + + case PROP_CHOICE: + g_value_set_int (value, priv->choice); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + + +static void +g_mount_operation_finalize (GObject *object) +{ + GMountOperation *operation; + GMountOperationPrivate *priv; + + operation = G_MOUNT_OPERATION (object); + + priv = operation->priv; + + g_free (priv->password); + g_free (priv->user); + g_free (priv->domain); + + G_OBJECT_CLASS (g_mount_operation_parent_class)->finalize (object); +} + +static gboolean +reply_non_handled_in_idle (gpointer data) +{ + GMountOperation *op = data; + + g_mount_operation_reply (op, G_MOUNT_OPERATION_UNHANDLED); + return FALSE; +} + +static void +ask_password (GMountOperation *op, + const char *message, + const char *default_user, + const char *default_domain, + GAskPasswordFlags flags) +{ + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + reply_non_handled_in_idle, + g_object_ref (op), + g_object_unref); +} + +static void +ask_question (GMountOperation *op, + const char *message, + const char *choices[]) +{ + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + reply_non_handled_in_idle, + g_object_ref (op), + g_object_unref); +} + +static void +show_processes (GMountOperation *op, + const gchar *message, + GArray *processes, + const gchar *choices[]) +{ + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + reply_non_handled_in_idle, + g_object_ref (op), + g_object_unref); +} + +static void +g_mount_operation_class_init (GMountOperationClass *klass) +{ + GObjectClass *object_class; + + g_type_class_add_private (klass, sizeof (GMountOperationPrivate)); + + object_class = G_OBJECT_CLASS (klass); + object_class->finalize = g_mount_operation_finalize; + object_class->get_property = g_mount_operation_get_property; + object_class->set_property = g_mount_operation_set_property; + + klass->ask_password = ask_password; + klass->ask_question = ask_question; + klass->show_processes = show_processes; + + /** + * GMountOperation::ask-password: + * @op: a #GMountOperation requesting a password. + * @message: string containing a message to display to the user. + * @default_user: string containing the default user name. + * @default_domain: string containing the default domain. + * @flags: a set of #GAskPasswordFlags. + * + * Emitted when a mount operation asks the user for a password. + * + * If the message contains a line break, the first line should be + * presented as a heading. For example, it may be used as the + * primary text in a #GtkMessageDialog. + */ + signals[ASK_PASSWORD] = + g_signal_new (I_("ask-password"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountOperationClass, ask_password), + NULL, NULL, + _gio_marshal_VOID__STRING_STRING_STRING_FLAGS, + G_TYPE_NONE, 4, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ASK_PASSWORD_FLAGS); + + /** + * GMountOperation::ask-question: + * @op: a #GMountOperation asking a question. + * @message: string containing a message to display to the user. + * @choices: an array of strings for each possible choice. + * + * Emitted when asking the user a question and gives a list of + * choices for the user to choose from. + * + * If the message contains a line break, the first line should be + * presented as a heading. For example, it may be used as the + * primary text in a #GtkMessageDialog. + */ + signals[ASK_QUESTION] = + g_signal_new (I_("ask-question"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountOperationClass, ask_question), + NULL, NULL, + _gio_marshal_VOID__STRING_BOXED, + G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_STRV); + + /** + * GMountOperation::reply: + * @op: a #GMountOperation. + * @result: a #GMountOperationResult indicating how the request was handled + * + * Emitted when the user has replied to the mount operation. + */ + signals[REPLY] = + g_signal_new (I_("reply"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountOperationClass, reply), + NULL, NULL, + g_cclosure_marshal_VOID__ENUM, + G_TYPE_NONE, 1, + G_TYPE_MOUNT_OPERATION_RESULT); + + /** + * GMountOperation::aborted: + * + * Emitted by the backend when e.g. a device becomes unavailable + * while a mount operation is in progress. + * + * Implementations of GMountOperation should handle this signal + * by dismissing open password dialogs. + * + * Since: 2.20 + */ + signals[ABORTED] = + g_signal_new (I_("aborted"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountOperationClass, aborted), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GMountOperation::show-processes: + * @op: a #GMountOperation. + * @message: string containing a message to display to the user. + * @processes: an array of #GPid for processes blocking the operation. + * @choices: an array of strings for each possible choice. + * + * Emitted when one or more processes are blocking an operation + * e.g. unmounting/ejecting a #GMount or stopping a #GDrive. + * + * Note that this signal may be emitted several times to update the + * list of blocking processes as processes close files. The + * application should only respond with g_mount_operation_reply() to + * the latest signal (setting #GMountOperation:choice to the choice + * the user made). + * + * If the message contains a line break, the first line should be + * presented as a heading. For example, it may be used as the + * primary text in a #GtkMessageDialog. + * + * Since: 2.22 + */ + signals[SHOW_PROCESSES] = + g_signal_new (I_("show-processes"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountOperationClass, show_processes), + NULL, NULL, + _gio_marshal_VOID__STRING_BOXED_BOXED, + G_TYPE_NONE, 3, + G_TYPE_STRING, G_TYPE_ARRAY, G_TYPE_STRV); + + /** + * GMountOperation:username: + * + * The user name that is used for authentication when carrying out + * the mount operation. + */ + g_object_class_install_property (object_class, + PROP_USERNAME, + g_param_spec_string ("username", + P_("Username"), + P_("The user name"), + NULL, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + /** + * GMountOperation:password: + * + * The password that is used for authentication when carrying out + * the mount operation. + */ + g_object_class_install_property (object_class, + PROP_PASSWORD, + g_param_spec_string ("password", + P_("Password"), + P_("The password"), + NULL, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + /** + * GMountOperation:anonymous: + * + * Whether to use an anonymous user when authenticating. + */ + g_object_class_install_property (object_class, + PROP_ANONYMOUS, + g_param_spec_boolean ("anonymous", + P_("Anonymous"), + P_("Whether to use an anonymous user"), + FALSE, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + /** + * GMountOperation:domain: + * + * The domain to use for the mount operation. + */ + g_object_class_install_property (object_class, + PROP_DOMAIN, + g_param_spec_string ("domain", + P_("Domain"), + P_("The domain of the mount operation"), + NULL, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + /** + * GMountOperation:password-save: + * + * Determines if and how the password information should be saved. + */ + g_object_class_install_property (object_class, + PROP_PASSWORD_SAVE, + g_param_spec_enum ("password-save", + P_("Password save"), + P_("How passwords should be saved"), + G_TYPE_PASSWORD_SAVE, + G_PASSWORD_SAVE_NEVER, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + + /** + * GMountOperation:choice: + * + * The index of the user's choice when a question is asked during the + * mount operation. See the #GMountOperation::ask-question signal. + */ + g_object_class_install_property (object_class, + PROP_CHOICE, + g_param_spec_int ("choice", + P_("Choice"), + P_("The users choice"), + 0, G_MAXINT, 0, + G_PARAM_READWRITE| + G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); +} + +static void +g_mount_operation_init (GMountOperation *operation) +{ + operation->priv = G_TYPE_INSTANCE_GET_PRIVATE (operation, + G_TYPE_MOUNT_OPERATION, + GMountOperationPrivate); +} + +/** + * g_mount_operation_new: + * + * Creates a new mount operation. + * + * Returns: a #GMountOperation. + **/ +GMountOperation * +g_mount_operation_new (void) +{ + return g_object_new (G_TYPE_MOUNT_OPERATION, NULL); +} + +/** + * g_mount_operation_get_username + * @op: a #GMountOperation. + * + * Get the user name from the mount operation. + * + * Returns: a string containing the user name. + **/ +const char * +g_mount_operation_get_username (GMountOperation *op) +{ + g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), NULL); + return op->priv->user; +} + +/** + * g_mount_operation_set_username: + * @op: a #GMountOperation. + * @username: input username. + * + * Sets the user name within @op to @username. + **/ +void +g_mount_operation_set_username (GMountOperation *op, + const char *username) +{ + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + g_free (op->priv->user); + op->priv->user = g_strdup (username); + g_object_notify (G_OBJECT (op), "username"); +} + +/** + * g_mount_operation_get_password: + * @op: a #GMountOperation. + * + * Gets a password from the mount operation. + * + * Returns: a string containing the password within @op. + **/ +const char * +g_mount_operation_get_password (GMountOperation *op) +{ + g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), NULL); + return op->priv->password; +} + +/** + * g_mount_operation_set_password: + * @op: a #GMountOperation. + * @password: password to set. + * + * Sets the mount operation's password to @password. + * + **/ +void +g_mount_operation_set_password (GMountOperation *op, + const char *password) +{ + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + g_free (op->priv->password); + op->priv->password = g_strdup (password); + g_object_notify (G_OBJECT (op), "password"); +} + +/** + * g_mount_operation_get_anonymous: + * @op: a #GMountOperation. + * + * Check to see whether the mount operation is being used + * for an anonymous user. + * + * Returns: %TRUE if mount operation is anonymous. + **/ +gboolean +g_mount_operation_get_anonymous (GMountOperation *op) +{ + g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), FALSE); + return op->priv->anonymous; +} + +/** + * g_mount_operation_set_anonymous: + * @op: a #GMountOperation. + * @anonymous: boolean value. + * + * Sets the mount operation to use an anonymous user if @anonymous is %TRUE. + **/ +void +g_mount_operation_set_anonymous (GMountOperation *op, + gboolean anonymous) +{ + GMountOperationPrivate *priv; + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + priv = op->priv; + + if (priv->anonymous != anonymous) + { + priv->anonymous = anonymous; + g_object_notify (G_OBJECT (op), "anonymous"); + } +} + +/** + * g_mount_operation_get_domain: + * @op: a #GMountOperation. + * + * Gets the domain of the mount operation. + * + * Returns: a string set to the domain. + **/ +const char * +g_mount_operation_get_domain (GMountOperation *op) +{ + g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), NULL); + return op->priv->domain; +} + +/** + * g_mount_operation_set_domain: + * @op: a #GMountOperation. + * @domain: the domain to set. + * + * Sets the mount operation's domain. + **/ +void +g_mount_operation_set_domain (GMountOperation *op, + const char *domain) +{ + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + g_free (op->priv->domain); + op->priv->domain = g_strdup (domain); + g_object_notify (G_OBJECT (op), "domain"); +} + +/** + * g_mount_operation_get_password_save: + * @op: a #GMountOperation. + * + * Gets the state of saving passwords for the mount operation. + * + * Returns: a #GPasswordSave flag. + **/ + +GPasswordSave +g_mount_operation_get_password_save (GMountOperation *op) +{ + g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), G_PASSWORD_SAVE_NEVER); + return op->priv->password_save; +} + +/** + * g_mount_operation_set_password_save: + * @op: a #GMountOperation. + * @save: a set of #GPasswordSave flags. + * + * Sets the state of saving passwords for the mount operation. + * + **/ +void +g_mount_operation_set_password_save (GMountOperation *op, + GPasswordSave save) +{ + GMountOperationPrivate *priv; + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + priv = op->priv; + + if (priv->password_save != save) + { + priv->password_save = save; + g_object_notify (G_OBJECT (op), "password-save"); + } +} + +/** + * g_mount_operation_get_choice: + * @op: a #GMountOperation. + * + * Gets a choice from the mount operation. + * + * Returns: an integer containing an index of the user's choice from + * the choice's list, or %0. + **/ +int +g_mount_operation_get_choice (GMountOperation *op) +{ + g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), 0); + return op->priv->choice; +} + +/** + * g_mount_operation_set_choice: + * @op: a #GMountOperation. + * @choice: an integer. + * + * Sets a default choice for the mount operation. + **/ +void +g_mount_operation_set_choice (GMountOperation *op, + int choice) +{ + GMountOperationPrivate *priv; + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + priv = op->priv; + if (priv->choice != choice) + { + priv->choice = choice; + g_object_notify (G_OBJECT (op), "choice"); + } +} + +/** + * g_mount_operation_reply: + * @op: a #GMountOperation + * @result: a #GMountOperationResult + * + * Emits the #GMountOperation::reply signal. + **/ +void +g_mount_operation_reply (GMountOperation *op, + GMountOperationResult result) +{ + g_return_if_fail (G_IS_MOUNT_OPERATION (op)); + g_signal_emit (op, signals[REPLY], 0, result); +} + +#define __G_MOUNT_OPERATION_C__ +#include "gioaliasdef.c" diff --git a/gio/gmountoperation.h b/gio/gmountoperation.h new file mode 100644 index 0000000..8432b80 --- /dev/null +++ b/gio/gmountoperation.h @@ -0,0 +1,123 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MOUNT_OPERATION_H__ +#define __G_MOUNT_OPERATION_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_MOUNT_OPERATION (g_mount_operation_get_type ()) +#define G_MOUNT_OPERATION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_MOUNT_OPERATION, GMountOperation)) +#define G_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_MOUNT_OPERATION, GMountOperationClass)) +#define G_IS_MOUNT_OPERATION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_MOUNT_OPERATION)) +#define G_IS_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_MOUNT_OPERATION)) +#define G_MOUNT_OPERATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MOUNT_OPERATION, GMountOperationClass)) + +/** + * GMountOperation: + * + * Class for providing authentication methods for mounting operations, + * such as mounting a file locally, or authenticating with a server. + **/ +typedef struct _GMountOperationClass GMountOperationClass; +typedef struct _GMountOperationPrivate GMountOperationPrivate; + +struct _GMountOperation +{ + GObject parent_instance; + + GMountOperationPrivate *priv; +}; + +struct _GMountOperationClass +{ + GObjectClass parent_class; + + /* signals: */ + + void (* ask_password) (GMountOperation *op, + const char *message, + const char *default_user, + const char *default_domain, + GAskPasswordFlags flags); + + void (* ask_question) (GMountOperation *op, + const char *message, + const char *choices[]); + + void (* reply) (GMountOperation *op, + GMountOperationResult result); + + void (* aborted) (GMountOperation *op); + + void (* show_processes) (GMountOperation *op, + const gchar *message, + GArray *processes, + const gchar *choices[]); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + void (*_g_reserved7) (void); + void (*_g_reserved8) (void); + void (*_g_reserved9) (void); + void (*_g_reserved10) (void); +}; + +GType g_mount_operation_get_type (void) G_GNUC_CONST; +GMountOperation * g_mount_operation_new (void); + +const char * g_mount_operation_get_username (GMountOperation *op); +void g_mount_operation_set_username (GMountOperation *op, + const char *username); +const char * g_mount_operation_get_password (GMountOperation *op); +void g_mount_operation_set_password (GMountOperation *op, + const char *password); +gboolean g_mount_operation_get_anonymous (GMountOperation *op); +void g_mount_operation_set_anonymous (GMountOperation *op, + gboolean anonymous); +const char * g_mount_operation_get_domain (GMountOperation *op); +void g_mount_operation_set_domain (GMountOperation *op, + const char *domain); +GPasswordSave g_mount_operation_get_password_save (GMountOperation *op); +void g_mount_operation_set_password_save (GMountOperation *op, + GPasswordSave save); +int g_mount_operation_get_choice (GMountOperation *op); +void g_mount_operation_set_choice (GMountOperation *op, + int choice); +void g_mount_operation_reply (GMountOperation *op, + GMountOperationResult result); + +G_END_DECLS + +#endif /* __G_MOUNT_OPERATION_H__ */ diff --git a/gio/gmountprivate.h b/gio/gmountprivate.h new file mode 100644 index 0000000..74e9852 --- /dev/null +++ b/gio/gmountprivate.h @@ -0,0 +1,35 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_VOLUMEPRIV_H__ +#define __G_VOLUMEPRIV_H__ + +#include + +G_BEGIN_DECLS + +GMount *_g_mount_get_for_mount_path (const char *mount_path, + GCancellable *cancellable); + +G_END_DECLS + +#endif /* __G_VOLUMEPRIV_H__ */ diff --git a/gio/gnativevolumemonitor.c b/gio/gnativevolumemonitor.c new file mode 100644 index 0000000..71c0c5a --- /dev/null +++ b/gio/gnativevolumemonitor.c @@ -0,0 +1,56 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include +#include "gnativevolumemonitor.h" + +#include "gioalias.h" + +G_DEFINE_ABSTRACT_TYPE (GNativeVolumeMonitor, g_native_volume_monitor, G_TYPE_VOLUME_MONITOR); + +static void +g_native_volume_monitor_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_native_volume_monitor_parent_class)->finalize (object); +} + + +static void +g_native_volume_monitor_class_init (GNativeVolumeMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_native_volume_monitor_finalize; +} + + +static void +g_native_volume_monitor_init (GNativeVolumeMonitor *native_monitor) +{ +} + +#define __G_NATIVE_VOLUME_MONITOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gnativevolumemonitor.h b/gio/gnativevolumemonitor.h new file mode 100644 index 0000000..e072576 --- /dev/null +++ b/gio/gnativevolumemonitor.h @@ -0,0 +1,62 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_NATIVE_VOLUME_MONITOR_H__ +#define __G_NATIVE_VOLUME_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_NATIVE_VOLUME_MONITOR (g_native_volume_monitor_get_type ()) +#define G_NATIVE_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_NATIVE_VOLUME_MONITOR, GNativeVolumeMonitor)) +#define G_NATIVE_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_NATIVE_VOLUME_MONITOR, GNativeVolumeMonitorClass)) +#define G_IS_NATIVE_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NATIVE_VOLUME_MONITOR)) +#define G_IS_NATIVE_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_NATIVE_VOLUME_MONITOR)) + +#define G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME "gio-native-volume-monitor" + +typedef struct _GNativeVolumeMonitor GNativeVolumeMonitor; +typedef struct _GNativeVolumeMonitorClass GNativeVolumeMonitorClass; + +struct _GNativeVolumeMonitor +{ + GVolumeMonitor parent_instance; +}; + +struct _GNativeVolumeMonitorClass +{ + GVolumeMonitorClass parent_class; + + GMount * (* get_mount_for_mount_path) (const char *mount_path, + GCancellable *cancellable); +}; + +GType g_native_volume_monitor_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_NATIVE_VOLUME_MONITOR_H__ */ diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c new file mode 100644 index 0000000..16af7f5 --- /dev/null +++ b/gio/gnetworkaddress.c @@ -0,0 +1,620 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include +#include "gnetworkaddress.h" +#include "gasyncresult.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "gnetworkingprivate.h" +#include "gresolver.h" +#include "gsimpleasyncresult.h" +#include "gsocketaddressenumerator.h" +#include "gioerror.h" +#include "gsocketconnectable.h" + +#include + +#include "gioalias.h" + +/** + * SECTION:gnetworkaddress + * @short_description: A GSocketConnectable for resolving hostnames + * @include: gio/gio.h + * + * #GNetworkAddress provides an easy way to resolve a hostname and + * then attempt to connect to that host, handling the possibility of + * multiple IP addresses and multiple address families. + * + * See #GSocketConnectable for and example of using the connectable + * interface. + */ + +/** + * GNetworkAddress: + * + * A #GSocketConnectable for resolving a hostname and connecting to + * that host. + */ + +struct _GNetworkAddressPrivate { + gchar *hostname; + guint16 port; + GList *sockaddrs; +}; + +enum { + PROP_0, + PROP_HOSTNAME, + PROP_PORT, +}; + +static void g_network_address_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_network_address_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void g_network_address_connectable_iface_init (GSocketConnectableIface *iface); +static GSocketAddressEnumerator *g_network_address_connectable_enumerate (GSocketConnectable *connectable); + +G_DEFINE_TYPE_WITH_CODE (GNetworkAddress, g_network_address, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_SOCKET_CONNECTABLE, + g_network_address_connectable_iface_init)) + +static void +g_network_address_finalize (GObject *object) +{ + GNetworkAddress *addr = G_NETWORK_ADDRESS (object); + + g_free (addr->priv->hostname); + + if (addr->priv->sockaddrs) + { + GList *a; + + for (a = addr->priv->sockaddrs; a; a = a->next) + g_object_unref (a->data); + g_list_free (addr->priv->sockaddrs); + } + + G_OBJECT_CLASS (g_network_address_parent_class)->finalize (object); +} + +static void +g_network_address_class_init (GNetworkAddressClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GNetworkAddressPrivate)); + + gobject_class->set_property = g_network_address_set_property; + gobject_class->get_property = g_network_address_get_property; + gobject_class->finalize = g_network_address_finalize; + + g_object_class_install_property (gobject_class, PROP_HOSTNAME, + g_param_spec_string ("hostname", + P_("Hostname"), + P_("Hostname to resolve"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PORT, + g_param_spec_uint ("port", + P_("Port"), + P_("Network port"), + 0, 65535, 0, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_network_address_connectable_iface_init (GSocketConnectableIface *connectable_iface) +{ + connectable_iface->enumerate = g_network_address_connectable_enumerate; +} + +static void +g_network_address_init (GNetworkAddress *addr) +{ + addr->priv = G_TYPE_INSTANCE_GET_PRIVATE (addr, G_TYPE_NETWORK_ADDRESS, + GNetworkAddressPrivate); +} + +static void +g_network_address_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GNetworkAddress *addr = G_NETWORK_ADDRESS (object); + + switch (prop_id) + { + case PROP_HOSTNAME: + if (addr->priv->hostname) + g_free (addr->priv->hostname); + addr->priv->hostname = g_value_dup_string (value); + break; + + case PROP_PORT: + addr->priv->port = g_value_get_uint (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_network_address_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GNetworkAddress *addr = G_NETWORK_ADDRESS (object); + + switch (prop_id) + { + case PROP_HOSTNAME: + g_value_set_string (value, addr->priv->hostname); + break; + + case PROP_PORT: + g_value_set_uint (value, addr->priv->port); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_network_address_set_addresses (GNetworkAddress *addr, + GList *addresses) +{ + GList *a; + GSocketAddress *sockaddr; + + g_return_if_fail (addresses != NULL && addr->priv->sockaddrs == NULL); + + for (a = addresses; a; a = a->next) + { + sockaddr = g_inet_socket_address_new (a->data, addr->priv->port); + addr->priv->sockaddrs = g_list_prepend (addr->priv->sockaddrs, sockaddr); + g_object_unref (a->data); + } + g_list_free (addresses); + addr->priv->sockaddrs = g_list_reverse (addr->priv->sockaddrs); +} + +/** + * g_network_address_new: + * @hostname: the hostname + * @port: the port + * + * Creates a new #GSocketConnectable for connecting to the given + * @hostname and @port. + * + * Return value: the new #GNetworkAddress + * + * Since: 2.22 + */ +GSocketConnectable * +g_network_address_new (const gchar *hostname, + guint16 port) +{ + return g_object_new (G_TYPE_NETWORK_ADDRESS, + "hostname", hostname, + "port", port, + NULL); +} + +/** + * g_network_address_parse: + * @host_and_port: the hostname and optionally a port + * @default_port: the default port if not in @host_and_port + * @error: a pointer to a #GError, or %NULL + * + * Creates a new #GSocketConnectable for connecting to the given + * @hostname and @port. May fail and return %NULL in case + * parsing @host_and_port fails. + * + * @host_and_port may be in any of a number of recognised formats: an IPv6 + * address, an IPv4 address, or a domain name (in which case a DNS + * lookup is performed). Quoting with [] is supported for all address + * types. A port override may be specified in the usual way with a + * colon. Ports may be given as decimal numbers or symbolic names (in + * which case an /etc/services lookup is performed). + * + * If no port is specified in @host_and_port then @default_port will be + * used as the port number to connect to. + * + * In general, @host_and_port is expected to be provided by the user + * (allowing them to give the hostname, and a port overide if necessary) + * and @default_port is expected to be provided by the application. + * + * Return value: the new #GNetworkAddress, or %NULL on error + * + * Since: 2.22 + */ +GSocketConnectable * +g_network_address_parse (const gchar *host_and_port, + guint16 default_port, + GError **error) +{ + GSocketConnectable *connectable; + const gchar *port; + guint16 portnum; + gchar *name; + + g_return_val_if_fail (host_and_port != NULL, NULL); + + port = NULL; + if (host_and_port[0] == '[') + /* escaped host part (to allow, eg. "[2001:db8::1]:888") */ + { + const gchar *end; + + end = strchr (host_and_port, ']'); + if (end == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Hostname '%s' contains '[' but not ']'"), host_and_port); + return NULL; + } + + if (end[1] == '\0') + port = NULL; + else if (end[1] == ':') + port = &end[2]; + else + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "The ']' character (in hostname '%s') must come at the" + " end or be immediately followed by ':' and a port", + host_and_port); + return NULL; + } + + name = g_strndup (host_and_port + 1, end - host_and_port - 1); + } + + else if ((port = strchr (host_and_port, ':'))) + /* string has a ':' in it */ + { + /* skip ':' */ + port++; + + if (strchr (port, ':')) + /* more than one ':' in string */ + { + /* this is actually an unescaped IPv6 address */ + name = g_strdup (host_and_port); + port = NULL; + } + else + name = g_strndup (host_and_port, port - host_and_port - 1); + } + + else + /* plain hostname, no port */ + name = g_strdup (host_and_port); + + if (port != NULL) + { + if (port[0] == '\0') + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "If a ':' character is given, it must be followed by a " + "port (in hostname '%s').", host_and_port); + g_free (name); + return NULL; + } + + else if ('0' <= port[0] && port[0] <= '9') + { + char *end; + long value; + + value = strtol (port, &end, 10); + if (*end != '\0' || value < 0 || value > G_MAXUINT16) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Invalid numeric port '%s' specified in hostname '%s'", + port, host_and_port); + g_free (name); + return NULL; + } + + portnum = value; + } + + else + { + struct servent *entry; + + entry = getservbyname (port, "tcp"); + if (entry == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Unknown service '%s' specified in hostname '%s'", + port, host_and_port); +#ifdef HAVE_ENDSERVENT + endservent (); +#endif + g_free (name); + return NULL; + } + + portnum = g_ntohs (entry->s_port); + +#ifdef HAVE_ENDSERVENT + endservent (); +#endif + } + } + else + { + /* No port in host_and_port */ + portnum = default_port; + } + + connectable = g_network_address_new (name, portnum); + g_free (name); + + return connectable; +} + +/** + * g_network_address_get_hostname: + * @addr: a #GNetworkAddress + * + * Gets @addr's hostname. This might be either UTF-8 or ASCII-encoded, + * depending on what @addr was created with. + * + * Return value: @addr's hostname + * + * Since: 2.22 + */ +const gchar * +g_network_address_get_hostname (GNetworkAddress *addr) +{ + g_return_val_if_fail (G_IS_NETWORK_ADDRESS (addr), NULL); + + return addr->priv->hostname; +} + +/** + * g_network_address_get_port: + * @addr: a #GNetworkAddress + * + * Gets @addr's port number + * + * Return value: @addr's port (which may be 0) + * + * Since: 2.22 + */ +guint16 +g_network_address_get_port (GNetworkAddress *addr) +{ + g_return_val_if_fail (G_IS_NETWORK_ADDRESS (addr), 0); + + return addr->priv->port; +} + +#define G_TYPE_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (_g_network_address_address_enumerator_get_type ()) +#define G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_NETWORK_ADDRESS_ADDRESS_ENUMERATOR, GNetworkAddressAddressEnumerator)) + +typedef struct { + GSocketAddressEnumerator parent_instance; + + GNetworkAddress *addr; + GList *a; +} GNetworkAddressAddressEnumerator; + +typedef struct { + GSocketAddressEnumeratorClass parent_class; + +} GNetworkAddressAddressEnumeratorClass; + +G_DEFINE_TYPE (GNetworkAddressAddressEnumerator, _g_network_address_address_enumerator, G_TYPE_SOCKET_ADDRESS_ENUMERATOR) + +static void +g_network_address_address_enumerator_finalize (GObject *object) +{ + GNetworkAddressAddressEnumerator *addr_enum = + G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (object); + + g_object_unref (addr_enum->addr); + + G_OBJECT_CLASS (_g_network_address_address_enumerator_parent_class)->finalize (object); +} + +static GSocketAddress * +g_network_address_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GNetworkAddressAddressEnumerator *addr_enum = + G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (enumerator); + GSocketAddress *sockaddr; + + if (!addr_enum->addr->priv->sockaddrs) + { + GResolver *resolver = g_resolver_get_default (); + GList *addresses; + + addresses = g_resolver_lookup_by_name (resolver, + addr_enum->addr->priv->hostname, + cancellable, error); + g_object_unref (resolver); + + if (!addresses) + return NULL; + + g_network_address_set_addresses (addr_enum->addr, addresses); + addr_enum->a = addr_enum->addr->priv->sockaddrs; + } + + if (!addr_enum->a) + return NULL; + else + { + sockaddr = addr_enum->a->data; + addr_enum->a = addr_enum->a->next; + return g_object_ref (sockaddr); + } +} + +static void +got_addresses (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *simple = user_data; + GNetworkAddressAddressEnumerator *addr_enum = + g_simple_async_result_get_op_res_gpointer (simple); + GResolver *resolver = G_RESOLVER (source_object); + GList *addresses; + GError *error = NULL; + + addresses = g_resolver_lookup_by_name_finish (resolver, result, &error); + if (!addr_enum->addr->priv->sockaddrs) + { + if (error) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + else + { + g_network_address_set_addresses (addr_enum->addr, addresses); + addr_enum->a = addr_enum->addr->priv->sockaddrs; + } + } + else if (error) + g_error_free (error); + + g_object_unref (resolver); + + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +g_network_address_address_enumerator_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GNetworkAddressAddressEnumerator *addr_enum = + G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (enumerator); + GSimpleAsyncResult *simple; + + simple = g_simple_async_result_new (G_OBJECT (enumerator), + callback, user_data, + g_network_address_address_enumerator_next_async); + + if (!addr_enum->addr->priv->sockaddrs) + { + GResolver *resolver = g_resolver_get_default (); + + g_simple_async_result_set_op_res_gpointer (simple, g_object_ref (addr_enum), g_object_unref); + g_resolver_lookup_by_name_async (resolver, + addr_enum->addr->priv->hostname, + cancellable, + got_addresses, simple); + } + else + { + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + } +} + +static GSocketAddress * +g_network_address_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GNetworkAddressAddressEnumerator *addr_enum = + G_NETWORK_ADDRESS_ADDRESS_ENUMERATOR (enumerator); + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + GSocketAddress *sockaddr; + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + else if (!addr_enum->a) + return NULL; + else + { + sockaddr = addr_enum->a->data; + addr_enum->a = addr_enum->a->next; + return g_object_ref (sockaddr); + } +} + +static void +_g_network_address_address_enumerator_init (GNetworkAddressAddressEnumerator *enumerator) +{ +} + +static void +_g_network_address_address_enumerator_class_init (GNetworkAddressAddressEnumeratorClass *addrenum_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (addrenum_class); + GSocketAddressEnumeratorClass *enumerator_class = + G_SOCKET_ADDRESS_ENUMERATOR_CLASS (addrenum_class); + + enumerator_class->next = g_network_address_address_enumerator_next; + enumerator_class->next_async = g_network_address_address_enumerator_next_async; + enumerator_class->next_finish = g_network_address_address_enumerator_next_finish; + object_class->finalize = g_network_address_address_enumerator_finalize; +} + +static GSocketAddressEnumerator * +g_network_address_connectable_enumerate (GSocketConnectable *connectable) +{ + GNetworkAddressAddressEnumerator *addr_enum; + + addr_enum = g_object_new (G_TYPE_NETWORK_ADDRESS_ADDRESS_ENUMERATOR, NULL); + addr_enum->addr = g_object_ref (connectable); + + return (GSocketAddressEnumerator *)addr_enum; +} + +#define __G_NETWORK_ADDRESS_C__ +#include "gioaliasdef.c" diff --git a/gio/gnetworkaddress.h b/gio/gnetworkaddress.h new file mode 100644 index 0000000..0111f70 --- /dev/null +++ b/gio/gnetworkaddress.h @@ -0,0 +1,69 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_NETWORK_ADDRESS_H__ +#define __G_NETWORK_ADDRESS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_NETWORK_ADDRESS (g_network_address_get_type ()) +#define G_NETWORK_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_NETWORK_ADDRESS, GNetworkAddress)) +#define G_NETWORK_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_NETWORK_ADDRESS, GNetworkAddressClass)) +#define G_IS_NETWORK_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NETWORK_ADDRESS)) +#define G_IS_NETWORK_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_NETWORK_ADDRESS)) +#define G_NETWORK_ADDRESS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_NETWORK_ADDRESS, GNetworkAddressClass)) + +typedef struct _GNetworkAddressClass GNetworkAddressClass; +typedef struct _GNetworkAddressPrivate GNetworkAddressPrivate; + +struct _GNetworkAddress +{ + GObject parent_instance; + + /*< private >*/ + GNetworkAddressPrivate *priv; +}; + +struct _GNetworkAddressClass +{ + GObjectClass parent_class; + +}; + +GType g_network_address_get_type (void) G_GNUC_CONST; + +GSocketConnectable *g_network_address_new (const gchar *hostname, + guint16 port); +GSocketConnectable *g_network_address_parse (const gchar *host_and_port, + guint16 default_port, + GError **error); +const gchar *g_network_address_get_hostname (GNetworkAddress *addr); +guint16 g_network_address_get_port (GNetworkAddress *addr); + + +G_END_DECLS + +#endif /* __G_NETWORK_ADDRESS_H__ */ diff --git a/gio/gnetworkingprivate.h b/gio/gnetworkingprivate.h new file mode 100644 index 0000000..4477032 --- /dev/null +++ b/gio/gnetworkingprivate.h @@ -0,0 +1,105 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_NETWORKINGPRIVATE_H__ +#define __G_NETWORKINGPRIVATE_H__ + +#ifdef G_OS_WIN32 + +#define _WIN32_WINNT 0x0501 +#include +#undef interface +#include +#include +#include + +#ifdef HAVE_WSPIAPI_H +/* in the Windows SDK and in mingw-w64 has wrappers for + * inline workarounds for getaddrinfo, getnameinfo and freeaddrinfo if + * they aren't present at run-time (on Windows 2000). + */ +#include +#endif + +#else /* !G_OS_WIN32 */ + +#include +#include +#include +#if defined(HAVE_ARPA_NAMESER_COMPAT_H) && !defined(GETSHORT) +#include +#endif + +#ifndef T_SRV +#define T_SRV 33 +#endif + +/* We're supposed to define _GNU_SOURCE to get EAI_NODATA, but that + * won't actually work since has already been included at + * this point. So we define __USE_GNU instead. + */ +#define __USE_GNU +#include +#undef __USE_GNU +#include +#include +#include +#include +#include + +#ifndef _PATH_RESCONF +#define _PATH_RESCONF "/etc/resolv.conf" +#endif + +#endif + +G_BEGIN_DECLS + +extern struct addrinfo _g_resolver_addrinfo_hints; + +GList *_g_resolver_addresses_from_addrinfo (const char *hostname, + struct addrinfo *res, + gint gai_retval, + GError **error); + +void _g_resolver_address_to_sockaddr (GInetAddress *address, + struct sockaddr_storage *sa, + gsize *len); +char *_g_resolver_name_from_nameinfo (GInetAddress *address, + const gchar *name, + gint gni_retval, + GError **error); + +#if defined(G_OS_UNIX) +GList *_g_resolver_targets_from_res_query (const gchar *rrname, + guchar *answer, + gint len, + gint herr, + GError **error); +#elif defined(G_OS_WIN32) +GList *_g_resolver_targets_from_DnsQuery (const gchar *rrname, + DNS_STATUS status, + DNS_RECORD *results, + GError **error); +#endif + +G_END_DECLS + +#endif /* __G_NETWORKINGPRIVATE_H__ */ diff --git a/gio/gnetworkservice.c b/gio/gnetworkservice.c new file mode 100644 index 0000000..31bbf6a --- /dev/null +++ b/gio/gnetworkservice.c @@ -0,0 +1,665 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include "gnetworkservice.h" +#include "gcancellable.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "gresolver.h" +#include "gsimpleasyncresult.h" +#include "gsocketaddressenumerator.h" +#include "gsocketconnectable.h" +#include "gsrvtarget.h" + +#include +#include + +#include "gioalias.h" + +/** + * SECTION:gnetworkservice + * @short_description: A GSocketConnectable for resolving SRV records + * @include: gio/gio.h + * + * Like #GNetworkAddress does with hostnames, #GNetworkService + * provides an easy way to resolve a SRV record, and then attempt to + * connect to one of the hosts that implements that service, handling + * service priority/weighting, multiple IP addresses, and multiple + * address families. + * + * See #GSrvTarget for more information about SRV records, and see + * #GSocketConnectable for and example of using the connectable + * interface. + */ + +/** + * GNetworkService: + * + * A #GSocketConnectable for resolving a SRV record and connecting to + * that service. + */ + +struct _GNetworkServicePrivate +{ + gchar *service, *protocol, *domain; + GList *targets; +}; + +enum { + PROP_0, + PROP_SERVICE, + PROP_PROTOCOL, + PROP_DOMAIN, +}; + +static void g_network_service_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_network_service_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void g_network_service_connectable_iface_init (GSocketConnectableIface *iface); +static GSocketAddressEnumerator *g_network_service_connectable_enumerate (GSocketConnectable *connectable); + +G_DEFINE_TYPE_WITH_CODE (GNetworkService, g_network_service, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_SOCKET_CONNECTABLE, + g_network_service_connectable_iface_init)) + +static void +g_network_service_finalize (GObject *object) +{ + GNetworkService *srv = G_NETWORK_SERVICE (object); + + g_free (srv->priv->service); + g_free (srv->priv->protocol); + g_free (srv->priv->domain); + + if (srv->priv->targets) + g_resolver_free_targets (srv->priv->targets); + + G_OBJECT_CLASS (g_network_service_parent_class)->finalize (object); +} + +static void +g_network_service_class_init (GNetworkServiceClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GNetworkServicePrivate)); + + gobject_class->set_property = g_network_service_set_property; + gobject_class->get_property = g_network_service_get_property; + gobject_class->finalize = g_network_service_finalize; + + g_object_class_install_property (gobject_class, PROP_SERVICE, + g_param_spec_string ("service", + P_("Service"), + P_("Service name, eg \"ldap\""), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PROTOCOL, + g_param_spec_string ("protocol", + P_("Protocol"), + P_("Network protocol, eg \"tcp\""), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DOMAIN, + g_param_spec_string ("domain", + P_("Domain"), + P_("Network domain, eg, \"example.com\""), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_network_service_connectable_iface_init (GSocketConnectableIface *connectable_iface) +{ + connectable_iface->enumerate = g_network_service_connectable_enumerate; +} + +static void +g_network_service_init (GNetworkService *srv) +{ + srv->priv = G_TYPE_INSTANCE_GET_PRIVATE (srv, G_TYPE_NETWORK_SERVICE, + GNetworkServicePrivate); +} + +static void +g_network_service_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GNetworkService *srv = G_NETWORK_SERVICE (object); + + switch (prop_id) + { + case PROP_SERVICE: + srv->priv->service = g_value_dup_string (value); + break; + + case PROP_PROTOCOL: + srv->priv->protocol = g_value_dup_string (value); + break; + + case PROP_DOMAIN: + srv->priv->domain = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_network_service_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GNetworkService *srv = G_NETWORK_SERVICE (object); + + switch (prop_id) + { + case PROP_SERVICE: + g_value_set_string (value, g_network_service_get_service (srv)); + break; + + case PROP_PROTOCOL: + g_value_set_string (value, g_network_service_get_protocol (srv)); + break; + + case PROP_DOMAIN: + g_value_set_string (value, g_network_service_get_domain (srv)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * g_network_service_new: + * @service: the service type to look up (eg, "ldap") + * @protocol: the networking protocol to use for @service (eg, "tcp") + * @domain: the DNS domain to look up the service in + * + * Creates a new #GNetworkService representing the given @service, + * @protocol, and @domain. This will initially be unresolved; use the + * #GSocketConnectable interface to resolve it. + * + * Return value: a new #GNetworkService + * + * Since: 2.22 + */ +GSocketConnectable * +g_network_service_new (const gchar *service, + const gchar *protocol, + const gchar *domain) +{ + return g_object_new (G_TYPE_NETWORK_SERVICE, + "service", service, + "protocol", protocol, + "domain", domain, + NULL); +} + +/** + * g_network_service_get_service: + * @srv: a #GNetworkService + * + * Gets @srv's service name (eg, "ldap"). + * + * Return value: @srv's service name + * + * Since: 2.22 + */ +const gchar * +g_network_service_get_service (GNetworkService *srv) +{ + g_return_val_if_fail (G_IS_NETWORK_SERVICE (srv), NULL); + + return srv->priv->service; +} + +/** + * g_network_service_get_protocol: + * @srv: a #GNetworkService + * + * Gets @srv's protocol name (eg, "tcp"). + * + * Return value: @srv's protocol name + * + * Since: 2.22 + */ +const gchar * +g_network_service_get_protocol (GNetworkService *srv) +{ + g_return_val_if_fail (G_IS_NETWORK_SERVICE (srv), NULL); + + return srv->priv->protocol; +} + +/** + * g_network_service_get_domain: + * @srv: a #GNetworkService + * + * Gets the domain that @srv serves. This might be either UTF-8 or + * ASCII-encoded, depending on what @srv was created with. + * + * Return value: @srv's domain name + * + * Since: 2.22 + */ +const gchar * +g_network_service_get_domain (GNetworkService *srv) +{ + g_return_val_if_fail (G_IS_NETWORK_SERVICE (srv), NULL); + + return srv->priv->domain; +} + +#define G_TYPE_NETWORK_SERVICE_ADDRESS_ENUMERATOR (_g_network_service_address_enumerator_get_type ()) +#define G_NETWORK_SERVICE_ADDRESS_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_NETWORK_SERVICE_ADDRESS_ENUMERATOR, GNetworkServiceAddressEnumerator)) + +typedef struct { + GSocketAddressEnumerator parent_instance; + + GResolver *resolver; + GNetworkService *srv; + GList *addrs, *a, *t; + + GError *error; + + /* For async operation */ + GCancellable *cancellable; + GSimpleAsyncResult *result; +} GNetworkServiceAddressEnumerator; + +typedef struct { + GSocketAddressEnumeratorClass parent_class; + +} GNetworkServiceAddressEnumeratorClass; + +G_DEFINE_TYPE (GNetworkServiceAddressEnumerator, _g_network_service_address_enumerator, G_TYPE_SOCKET_ADDRESS_ENUMERATOR) + +static void +g_network_service_address_enumerator_finalize (GObject *object) +{ + GNetworkServiceAddressEnumerator *srv_enum = + G_NETWORK_SERVICE_ADDRESS_ENUMERATOR (object); + + g_object_unref (srv_enum->srv); + if (srv_enum->addrs) + { + while (srv_enum->a) + { + g_object_unref (srv_enum->a->data); + srv_enum->a = srv_enum->a->next; + } + g_list_free (srv_enum->addrs); + } + g_object_unref (srv_enum->resolver); + if (srv_enum->error) + g_error_free (srv_enum->error); + + G_OBJECT_CLASS (_g_network_service_address_enumerator_parent_class)->finalize (object); +} + +static GSocketAddress * +g_network_service_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GNetworkServiceAddressEnumerator *srv_enum = + G_NETWORK_SERVICE_ADDRESS_ENUMERATOR (enumerator); + GSrvTarget *target; + GSocketAddress *sockaddr; + + /* If we haven't yet resolved srv, do that */ + if (!srv_enum->srv->priv->targets) + { + GList *targets; + + targets = g_resolver_lookup_service (srv_enum->resolver, + srv_enum->srv->priv->service, + srv_enum->srv->priv->protocol, + srv_enum->srv->priv->domain, + cancellable, error); + if (!targets) + return NULL; + + if (!srv_enum->srv->priv->targets) + srv_enum->srv->priv->targets = targets; + srv_enum->t = srv_enum->srv->priv->targets; + } + + /* Make sure we have a set of resolved addresses for the current + * target. When resolving the first target, we save the GError, if + * any. If any later target succeeds, we'll free the earlier error, + * but if we get to the last target without any of them resolving, + * we return that initial error. + */ + do + { + /* Return if we're out of targets. */ + if (!srv_enum->t) + { + if (srv_enum->error) + { + g_propagate_error (error, srv_enum->error); + srv_enum->error = NULL; + } + return NULL; + } + target = srv_enum->t->data; + + /* If we haven't resolved the addrs for the current target, do that */ + if (!srv_enum->addrs) + { + GError **error_p; + + error_p = (srv_enum->t == srv_enum->srv->priv->targets) ? &srv_enum->error : NULL; + srv_enum->addrs = g_resolver_lookup_by_name (srv_enum->resolver, + g_srv_target_get_hostname (target), + cancellable, error_p); + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + if (srv_enum->addrs) + { + srv_enum->a = srv_enum->addrs; + if (srv_enum->error) + { + g_error_free (srv_enum->error); + srv_enum->error = NULL; + } + } + else + { + /* Try the next target */ + srv_enum->t = srv_enum->t->next; + } + } + } + while (!srv_enum->addrs); + + /* Return the next address for this target. If it's the last one, + * advance the target counter. + */ + sockaddr = g_inet_socket_address_new (srv_enum->a->data, + g_srv_target_get_port (target)); + g_object_unref (srv_enum->a->data); + srv_enum->a = srv_enum->a->next; + + if (!srv_enum->a) + { + g_list_free (srv_enum->addrs); + srv_enum->addrs = NULL; + srv_enum->t = srv_enum->t->next; + } + + return sockaddr; +} + +static void next_async_resolved_targets (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void next_async_have_targets (GNetworkServiceAddressEnumerator *srv_enum); +static void next_async_resolved_addresses (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void next_async_have_addresses (GNetworkServiceAddressEnumerator *srv_enum); + +/* The async version is basically the same as the sync, except we have + * to split it into multiple functions. + */ +static void +g_network_service_address_enumerator_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GNetworkServiceAddressEnumerator *srv_enum = + G_NETWORK_SERVICE_ADDRESS_ENUMERATOR (enumerator); + + g_return_if_fail (srv_enum->result == NULL); + + srv_enum->result = g_simple_async_result_new (G_OBJECT (enumerator), + callback, user_data, + g_network_service_address_enumerator_next_async); + srv_enum->cancellable = cancellable; + + /* If we haven't yet resolved srv, do that */ + if (!srv_enum->srv->priv->targets) + { + g_resolver_lookup_service_async (srv_enum->resolver, + srv_enum->srv->priv->service, + srv_enum->srv->priv->protocol, + srv_enum->srv->priv->domain, + cancellable, + next_async_resolved_targets, + srv_enum); + } + else + next_async_have_targets (srv_enum); +} + +static void +next_async_resolved_targets (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GNetworkServiceAddressEnumerator *srv_enum = user_data; + GList *targets; + GError *error = NULL; + + targets = g_resolver_lookup_service_finish (srv_enum->resolver, result, &error); + if (!srv_enum->srv->priv->targets) + { + if (error) + { + GSimpleAsyncResult *simple = srv_enum->result; + + srv_enum->result = NULL; + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + return; + } + + srv_enum->srv->priv->targets = targets; + srv_enum->t = srv_enum->srv->priv->targets; + } + + next_async_have_targets (srv_enum); +} + +static void +next_async_have_targets (GNetworkServiceAddressEnumerator *srv_enum) +{ + GSrvTarget *target; + + /* Get the current target, check if we're already done. */ + if (!srv_enum->t) + { + if (srv_enum->error) + { + g_simple_async_result_set_from_error (srv_enum->result, srv_enum->error); + g_error_free (srv_enum->error); + srv_enum->error = NULL; + } + g_simple_async_result_complete_in_idle (srv_enum->result); + g_object_unref (srv_enum->result); + srv_enum->result = NULL; + return; + } + target = srv_enum->t->data; + + /* If we haven't resolved the addrs for the current target, do that */ + if (!srv_enum->addrs) + { + g_resolver_lookup_by_name_async (srv_enum->resolver, + g_srv_target_get_hostname (target), + srv_enum->cancellable, + next_async_resolved_addresses, + srv_enum); + } + else + next_async_have_addresses (srv_enum); +} + +static void +next_async_resolved_addresses (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GNetworkServiceAddressEnumerator *srv_enum = user_data; + GError *error = NULL; + + srv_enum->addrs = g_resolver_lookup_by_name_finish (srv_enum->resolver, result, &error); + if (srv_enum->addrs) + { + srv_enum->a = srv_enum->addrs; + if (srv_enum->error) + { + g_error_free (srv_enum->error); + srv_enum->error = NULL; + } + next_async_have_addresses (srv_enum); + } + else + { + if (g_cancellable_is_cancelled (srv_enum->cancellable)) + { + GSimpleAsyncResult *simple = srv_enum->result; + + srv_enum->result = NULL; + g_simple_async_result_set_from_error (srv_enum->result, error); + g_error_free (error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + } + else + { + if (srv_enum->t == srv_enum->srv->priv->targets) + srv_enum->error = error; + else + g_error_free (error); + + /* Try the next target */ + srv_enum->t = srv_enum->t->next; + next_async_have_targets (srv_enum); + } + } +} + +static void +next_async_have_addresses (GNetworkServiceAddressEnumerator *srv_enum) +{ + GSocketAddress *sockaddr; + GSimpleAsyncResult *simple = srv_enum->result; + + /* Return the next address for this target. If it's the last one, + * advance the target counter. + */ + sockaddr = g_inet_socket_address_new (srv_enum->a->data, + g_srv_target_get_port (srv_enum->t->data)); + g_object_unref (srv_enum->a->data); + + srv_enum->a = srv_enum->a->next; + if (!srv_enum->a) + { + g_list_free (srv_enum->addrs); + srv_enum->addrs = NULL; + srv_enum->t = srv_enum->t->next; + } + + srv_enum->result = NULL; + g_simple_async_result_set_op_res_gpointer (simple, sockaddr, NULL); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +static GSocketAddress * +g_network_service_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + GSocketAddress *sockaddr; + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + sockaddr = g_simple_async_result_get_op_res_gpointer (simple); + return sockaddr ? g_object_ref (sockaddr) : NULL; +} + +static void +_g_network_service_address_enumerator_init (GNetworkServiceAddressEnumerator *enumerator) +{ +} + +static void +_g_network_service_address_enumerator_class_init (GNetworkServiceAddressEnumeratorClass *addrenum_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (addrenum_class); + GSocketAddressEnumeratorClass *enumerator_class = + G_SOCKET_ADDRESS_ENUMERATOR_CLASS (addrenum_class); + + enumerator_class->next = g_network_service_address_enumerator_next; + enumerator_class->next_async = g_network_service_address_enumerator_next_async; + enumerator_class->next_finish = g_network_service_address_enumerator_next_finish; + object_class->finalize = g_network_service_address_enumerator_finalize; +} + +static GSocketAddressEnumerator * +g_network_service_connectable_enumerate (GSocketConnectable *connectable) +{ + GNetworkServiceAddressEnumerator *srv_enum; + + srv_enum = g_object_new (G_TYPE_NETWORK_SERVICE_ADDRESS_ENUMERATOR, NULL); + srv_enum->srv = g_object_ref (connectable); + srv_enum->resolver = g_resolver_get_default (); + + return (GSocketAddressEnumerator *)srv_enum; +} + +#define __G_NETWORK_SERVICE_C__ +#include "gioaliasdef.c" diff --git a/gio/gnetworkservice.h b/gio/gnetworkservice.h new file mode 100644 index 0000000..b1a754b --- /dev/null +++ b/gio/gnetworkservice.h @@ -0,0 +1,69 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_NETWORK_SERVICE_H__ +#define __G_NETWORK_SERVICE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_NETWORK_SERVICE (g_network_service_get_type ()) +#define G_NETWORK_SERVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_NETWORK_SERVICE, GNetworkService)) +#define G_NETWORK_SERVICE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_NETWORK_SERVICE, GNetworkServiceClass)) +#define G_IS_NETWORK_SERVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NETWORK_SERVICE)) +#define G_IS_NETWORK_SERVICE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_NETWORK_SERVICE)) +#define G_NETWORK_SERVICE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_NETWORK_SERVICE, GNetworkServiceClass)) + +typedef struct _GNetworkServiceClass GNetworkServiceClass; +typedef struct _GNetworkServicePrivate GNetworkServicePrivate; + +struct _GNetworkService +{ + GObject parent_instance; + + /*< private >*/ + GNetworkServicePrivate *priv; +}; + +struct _GNetworkServiceClass +{ + GObjectClass parent_class; + +}; + +GType g_network_service_get_type (void) G_GNUC_CONST; + +GSocketConnectable *g_network_service_new (const gchar *service, + const gchar *protocol, + const gchar *domain); + +const gchar *g_network_service_get_service (GNetworkService *srv); +const gchar *g_network_service_get_protocol (GNetworkService *srv); +const gchar *g_network_service_get_domain (GNetworkService *srv); + +G_END_DECLS + +#endif /* __G_NETWORK_SERVICE_H__ */ + diff --git a/gio/goutputstream.c b/gio/goutputstream.c new file mode 100644 index 0000000..38d5419 --- /dev/null +++ b/gio/goutputstream.c @@ -0,0 +1,1375 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "goutputstream.h" +#include "gcancellable.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "ginputstream.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:goutputstream + * @short_description: Base class for implementing streaming output + * @include: gio/gio.h + * + * GOutputStream has functions to write to a stream (g_output_stream_write()), + * to close a stream (g_output_stream_close()) and to flush pending writes + * (g_output_stream_flush()). + * + * To copy the content of an input stream to an output stream without + * manually handling the reads and writes, use g_output_stream_splice(). + * + * All of these functions have async variants too. + **/ + +G_DEFINE_TYPE (GOutputStream, g_output_stream, G_TYPE_OBJECT); + +struct _GOutputStreamPrivate { + guint closed : 1; + guint pending : 1; + guint closing : 1; + GAsyncReadyCallback outstanding_callback; +}; + +static gssize g_output_stream_real_splice (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + GCancellable *cancellable, + GError **error); +static void g_output_stream_real_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_output_stream_real_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_output_stream_real_splice_async (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_output_stream_real_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_output_stream_real_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_output_stream_real_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_output_stream_real_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_output_stream_real_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); + +static void +g_output_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_output_stream_parent_class)->finalize (object); +} + +static void +g_output_stream_dispose (GObject *object) +{ + GOutputStream *stream; + + stream = G_OUTPUT_STREAM (object); + + if (!stream->priv->closed) + g_output_stream_close (stream, NULL, NULL); + + G_OBJECT_CLASS (g_output_stream_parent_class)->dispose (object); +} + +static void +g_output_stream_class_init (GOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GOutputStreamPrivate)); + + gobject_class->finalize = g_output_stream_finalize; + gobject_class->dispose = g_output_stream_dispose; + + klass->splice = g_output_stream_real_splice; + + klass->write_async = g_output_stream_real_write_async; + klass->write_finish = g_output_stream_real_write_finish; + klass->splice_async = g_output_stream_real_splice_async; + klass->splice_finish = g_output_stream_real_splice_finish; + klass->flush_async = g_output_stream_real_flush_async; + klass->flush_finish = g_output_stream_real_flush_finish; + klass->close_async = g_output_stream_real_close_async; + klass->close_finish = g_output_stream_real_close_finish; +} + +static void +g_output_stream_init (GOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, + G_TYPE_OUTPUT_STREAM, + GOutputStreamPrivate); +} + +/** + * g_output_stream_write: + * @stream: a #GOutputStream. + * @buffer: the buffer containing the data to write. + * @count: the number of bytes to write + * @cancellable: optional cancellable object + * @error: location to store the error occuring, or %NULL to ignore + * + * Tries to write @count bytes from @buffer into the stream. Will block + * during the operation. + * + * If count is zero returns zero and does nothing. A value of @count + * larger than %G_MAXSSIZE will cause a %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, the number of bytes written to the stream is returned. + * It is not an error if this is not the same as the requested size, as it + * can happen e.g. on a partial i/o error, or if there is not enough + * storage in the stream. All writes either block until at least one byte + * is written, so zero is never returned (unless @count is zero). + * + * If @cancellable is not NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error G_IO_ERROR_CANCELLED will be returned. If an + * operation was partially finished when the operation was cancelled the + * partial result will be returned, without an error. + * + * On error -1 is returned and @error is set accordingly. + * + * Return value: Number of bytes written, or -1 on error + **/ +gssize +g_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GOutputStreamClass *class; + gssize res; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (buffer != NULL, 0); + + if (count == 0) + return 0; + + if (((gssize) count) < 0) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), G_STRFUNC); + return -1; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + if (class->write_fn == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Output stream doesn't implement write")); + return -1; + } + + if (!g_output_stream_set_pending (stream, error)) + return -1; + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->write_fn (stream, buffer, count, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_output_stream_clear_pending (stream); + + return res; +} + +/** + * g_output_stream_write_all: + * @stream: a #GOutputStream. + * @buffer: the buffer containing the data to write. + * @count: the number of bytes to write + * @bytes_written: location to store the number of bytes that was + * written to the stream + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occuring, or %NULL to ignore + * + * Tries to write @count bytes from @buffer into the stream. Will block + * during the operation. + * + * This function is similar to g_output_stream_write(), except it tries to + * write as many bytes as requested, only stopping on an error. + * + * On a successful write of @count bytes, %TRUE is returned, and @bytes_written + * is set to @count. + * + * If there is an error during the operation FALSE is returned and @error + * is set to indicate the error status, @bytes_written is updated to contain + * the number of bytes written into the stream before the error occurred. + * + * Return value: %TRUE on success, %FALSE if there was an error + **/ +gboolean +g_output_stream_write_all (GOutputStream *stream, + const void *buffer, + gsize count, + gsize *bytes_written, + GCancellable *cancellable, + GError **error) +{ + gsize _bytes_written; + gssize res; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (buffer != NULL, FALSE); + + _bytes_written = 0; + while (_bytes_written < count) + { + res = g_output_stream_write (stream, (char *)buffer + _bytes_written, count - _bytes_written, + cancellable, error); + if (res == -1) + { + if (bytes_written) + *bytes_written = _bytes_written; + return FALSE; + } + + if (res == 0) + g_warning ("Write returned zero without error"); + + _bytes_written += res; + } + + if (bytes_written) + *bytes_written = _bytes_written; + + return TRUE; +} + +/** + * g_output_stream_flush: + * @stream: a #GOutputStream. + * @cancellable: optional cancellable object + * @error: location to store the error occuring, or %NULL to ignore + * + * Flushed any outstanding buffers in the stream. Will block during + * the operation. Closing the stream will implicitly cause a flush. + * + * This function is optional for inherited classes. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Return value: %TRUE on success, %FALSE on error + **/ +gboolean +g_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GOutputStreamClass *class; + gboolean res; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + + if (!g_output_stream_set_pending (stream, error)) + return FALSE; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + res = TRUE; + if (class->flush) + { + if (cancellable) + g_cancellable_push_current (cancellable); + + res = class->flush (stream, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + } + + g_output_stream_clear_pending (stream); + + return res; +} + +/** + * g_output_stream_splice: + * @stream: a #GOutputStream. + * @source: a #GInputStream. + * @flags: a set of #GOutputStreamSpliceFlags. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Splices an input stream into an output stream. + * + * Returns: a #gssize containing the size of the data spliced, or + * -1 if an error occurred. + **/ +gssize +g_output_stream_splice (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + GCancellable *cancellable, + GError **error) +{ + GOutputStreamClass *class; + gssize bytes_copied; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (G_IS_INPUT_STREAM (source), -1); + + if (g_input_stream_is_closed (source)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Source stream is already closed")); + return -1; + } + + if (!g_output_stream_set_pending (stream, error)) + return -1; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + if (cancellable) + g_cancellable_push_current (cancellable); + + bytes_copied = class->splice (stream, source, flags, cancellable, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + g_output_stream_clear_pending (stream); + + return bytes_copied; +} + +static gssize +g_output_stream_real_splice (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + GCancellable *cancellable, + GError **error) +{ + GOutputStreamClass *class = G_OUTPUT_STREAM_GET_CLASS (stream); + gssize n_read, n_written; + gssize bytes_copied; + char buffer[8192], *p; + gboolean res; + + bytes_copied = 0; + if (class->write_fn == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Output stream doesn't implement write")); + res = FALSE; + goto notsupported; + } + + res = TRUE; + do + { + n_read = g_input_stream_read (source, buffer, sizeof (buffer), cancellable, error); + if (n_read == -1) + { + res = FALSE; + break; + } + + if (n_read == 0) + break; + + p = buffer; + while (n_read > 0) + { + n_written = class->write_fn (stream, p, n_read, cancellable, error); + if (n_written == -1) + { + res = FALSE; + break; + } + + p += n_written; + n_read -= n_written; + bytes_copied += n_written; + } + } + while (res); + + notsupported: + if (!res) + error = NULL; /* Ignore further errors */ + + if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE) + { + /* Don't care about errors in source here */ + g_input_stream_close (source, cancellable, NULL); + } + + if (flags & G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET) + { + /* But write errors on close are bad! */ + if (class->close_fn && + !class->close_fn (stream, cancellable, error)) + res = FALSE; + } + + if (res) + return bytes_copied; + + return -1; +} + + +/** + * g_output_stream_close: + * @stream: A #GOutputStream. + * @cancellable: optional cancellable object + * @error: location to store the error occuring, or %NULL to ignore + * + * Closes the stream, releasing resources related to it. + * + * Once the stream is closed, all other operations will return %G_IO_ERROR_CLOSED. + * Closing a stream multiple times will not return an error. + * + * Closing a stream will automatically flush any outstanding buffers in the + * stream. + * + * Streams will be automatically closed when the last reference + * is dropped, but you might want to call this function to make sure + * resources are released as early as possible. + * + * Some streams might keep the backing store of the stream (e.g. a file descriptor) + * open after the stream is closed. See the documentation for the individual + * stream for details. + * + * On failure the first error that happened will be reported, but the close + * operation will finish as much as possible. A stream that failed to + * close will still return %G_IO_ERROR_CLOSED for all operations. Still, it + * is important to check and report the error to the user, otherwise + * there might be a loss of data as all data might not be written. + * + * If @cancellable is not NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * Cancelling a close will still leave the stream closed, but there some streams + * can use a faster close that doesn't block to e.g. check errors. On + * cancellation (as with any error) there is no guarantee that all written + * data will reach the target. + * + * Return value: %TRUE on success, %FALSE on failure + **/ +gboolean +g_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GOutputStreamClass *class; + gboolean res; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + if (stream->priv->closed) + return TRUE; + + if (!g_output_stream_set_pending (stream, error)) + return FALSE; + + stream->priv->closing = TRUE; + + if (cancellable) + g_cancellable_push_current (cancellable); + + if (class->flush) + res = class->flush (stream, cancellable, error); + else + res = TRUE; + + if (!res) + { + /* flushing caused the error that we want to return, + * but we still want to close the underlying stream if possible + */ + if (class->close_fn) + class->close_fn (stream, cancellable, NULL); + } + else + { + res = TRUE; + if (class->close_fn) + res = class->close_fn (stream, cancellable, error); + } + + if (cancellable) + g_cancellable_pop_current (cancellable); + + stream->priv->closing = FALSE; + stream->priv->closed = TRUE; + g_output_stream_clear_pending (stream); + + return res; +} + +static void +async_ready_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + + g_output_stream_clear_pending (stream); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +static void +async_ready_close_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + + stream->priv->closing = FALSE; + stream->priv->closed = TRUE; + g_output_stream_clear_pending (stream); + if (stream->priv->outstanding_callback) + (*stream->priv->outstanding_callback) (source_object, res, user_data); + g_object_unref (stream); +} + +/** + * g_output_stream_write_async: + * @stream: A #GOutputStream. + * @buffer: the buffer containing the data to write. + * @count: the number of bytes to write + * @io_priority: the io priority of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Request an asynchronous write of @count bytes from @buffer into + * the stream. When the operation is finished @callback will be called. + * You can then call g_output_stream_write_finish() to get the result of the + * operation. + * + * During an async request no other sync and async calls are allowed, + * and will result in %G_IO_ERROR_PENDING errors. + * + * A value of @count larger than %G_MAXSSIZE will cause a + * %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, the number of bytes written will be passed to the + * @callback. It is not an error if this is not the same as the + * requested size, as it can happen e.g. on a partial I/O error, + * but generally we try to write as many bytes as requested. + * + * Any outstanding I/O request with higher priority (lower numerical + * value) will be executed before an outstanding request with lower + * priority. Default priority is %G_PRIORITY_DEFAULT. + * + * The asyncronous methods have a default fallback that uses threads + * to implement asynchronicity, so they are optional for inheriting + * classes. However, if you override one you must override all. + * + * For the synchronous, blocking version of this function, see + * g_output_stream_write(). + **/ +void +g_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GOutputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + g_return_if_fail (buffer != NULL); + + if (count == 0) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_output_stream_write_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (((gssize) count) < 0) + { + g_simple_async_report_error_in_idle (G_OBJECT (stream), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), + G_STRFUNC); + return; + } + + if (!g_output_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->write_async (stream, buffer, count, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_output_stream_write_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes a stream write operation. + * + * Returns: a #gssize containing the number of bytes written to the stream. + **/ +gssize +g_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GOutputStreamClass *class; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return -1; + + /* Special case writes of 0 bytes */ + if (g_simple_async_result_get_source_tag (simple) == g_output_stream_write_async) + return 0; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + return class->write_finish (stream, result, error); +} + +typedef struct { + GInputStream *source; + gpointer user_data; + GAsyncReadyCallback callback; +} SpliceUserData; + +static void +async_ready_splice_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer _data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + SpliceUserData *data = _data; + + g_output_stream_clear_pending (stream); + + if (data->callback) + (*data->callback) (source_object, res, data->user_data); + + g_object_unref (stream); + g_object_unref (data->source); + g_free (data); +} + +/** + * g_output_stream_splice_async: + * @stream: a #GOutputStream. + * @source: a #GInputStream. + * @flags: a set of #GOutputStreamSpliceFlags. + * @io_priority: the io priority of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * + * Splices a stream asynchronously. + * When the operation is finished @callback will be called. + * You can then call g_output_stream_splice_finish() to get the + * result of the operation. + * + * For the synchronous, blocking version of this function, see + * g_output_stream_splice(). + **/ +void +g_output_stream_splice_async (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GOutputStreamClass *class; + SpliceUserData *data; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + g_return_if_fail (G_IS_INPUT_STREAM (source)); + + if (g_input_stream_is_closed (source)) + { + g_simple_async_report_error_in_idle (G_OBJECT (stream), + callback, + user_data, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Source stream is already closed")); + return; + } + + if (!g_output_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + data = g_new0 (SpliceUserData, 1); + data->callback = callback; + data->user_data = user_data; + data->source = g_object_ref (source); + + g_object_ref (stream); + class->splice_async (stream, source, flags, io_priority, cancellable, + async_ready_splice_callback_wrapper, data); +} + +/** + * g_output_stream_splice_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an asynchronous stream splice operation. + * + * Returns: a #gssize of the number of bytes spliced. + **/ +gssize +g_output_stream_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GOutputStreamClass *class; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), -1); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return -1; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + return class->splice_finish (stream, result, error); +} + +/** + * g_output_stream_flush_async: + * @stream: a #GOutputStream. + * @io_priority: the io priority of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Flushes a stream asynchronously. + * For behaviour details see g_output_stream_flush(). + * + * When the operation is finished @callback will be + * called. You can then call g_output_stream_flush_finish() to get the + * result of the operation. + **/ +void +g_output_stream_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GOutputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + + if (!g_output_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + if (class->flush_async == NULL) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + async_ready_callback_wrapper, + user_data, + g_output_stream_flush_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + class->flush_async (stream, io_priority, cancellable, + async_ready_callback_wrapper, user_data); +} + +/** + * g_output_stream_flush_finish: + * @stream: a #GOutputStream. + * @result: a GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes flushing an output stream. + * + * Returns: %TRUE if flush operation suceeded, %FALSE otherwise. + **/ +gboolean +g_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GOutputStreamClass *klass; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + /* Special case default implementation */ + if (g_simple_async_result_get_source_tag (simple) == g_output_stream_flush_async) + return TRUE; + } + + klass = G_OUTPUT_STREAM_GET_CLASS (stream); + return klass->flush_finish (stream, result, error); +} + + +/** + * g_output_stream_close_async: + * @stream: A #GOutputStream. + * @io_priority: the io priority of the request. + * @callback: callback to call when the request is satisfied + * @user_data: the data to pass to callback function + * @cancellable: optional cancellable object + * + * Requests an asynchronous close of the stream, releasing resources + * related to it. When the operation is finished @callback will be + * called. You can then call g_output_stream_close_finish() to get + * the result of the operation. + * + * For behaviour details see g_output_stream_close(). + * + * The asyncronous methods have a default fallback that uses threads + * to implement asynchronicity, so they are optional for inheriting + * classes. However, if you override one you must override all. + **/ +void +g_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GOutputStreamClass *class; + GSimpleAsyncResult *simple; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + + if (stream->priv->closed) + { + simple = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_output_stream_close_async); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (!g_output_stream_set_pending (stream, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, + user_data, + error); + g_error_free (error); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + stream->priv->closing = TRUE; + stream->priv->outstanding_callback = callback; + g_object_ref (stream); + class->close_async (stream, io_priority, cancellable, + async_ready_close_callback_wrapper, user_data); +} + +/** + * g_output_stream_close_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Closes an output stream. + * + * Returns: %TRUE if stream was successfully closed, %FALSE otherwise. + **/ +gboolean +g_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GOutputStreamClass *class; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + + /* Special case already closed */ + if (g_simple_async_result_get_source_tag (simple) == g_output_stream_close_async) + return TRUE; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + return class->close_finish (stream, result, error); +} + +/** + * g_output_stream_is_closed: + * @stream: a #GOutputStream. + * + * Checks if an output stream has already been closed. + * + * Returns: %TRUE if @stream is closed. %FALSE otherwise. + **/ +gboolean +g_output_stream_is_closed (GOutputStream *stream) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), TRUE); + + return stream->priv->closed; +} + +/** + * g_output_stream_is_closing: + * @stream: a #GOutputStream. + * + * Checks if an output stream is being closed. This can be + * used inside e.g. a flush implementation to see if the + * flush (or other i/o operation) is called from within + * the closing operation. + * + * Returns: %TRUE if @stream is being closed. %FALSE otherwise. + * + * Since: 2.24 + **/ +gboolean +g_output_stream_is_closing (GOutputStream *stream) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), TRUE); + + return stream->priv->closing; +} + +/** + * g_output_stream_has_pending: + * @stream: a #GOutputStream. + * + * Checks if an ouput stream has pending actions. + * + * Returns: %TRUE if @stream has pending actions. + **/ +gboolean +g_output_stream_has_pending (GOutputStream *stream) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + + return stream->priv->pending; +} + +/** + * g_output_stream_set_pending: + * @stream: a #GOutputStream. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Sets @stream to have actions pending. If the pending flag is + * already set or @stream is closed, it will return %FALSE and set + * @error. + * + * Return value: %TRUE if pending was previously unset and is now set. + **/ +gboolean +g_output_stream_set_pending (GOutputStream *stream, + GError **error) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + + if (stream->priv->closed) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Stream is already closed")); + return FALSE; + } + + if (stream->priv->pending) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + /* Translators: This is an error you get if there is + * already an operation running against this stream when + * you try to start one */ + _("Stream has outstanding operation")); + return FALSE; + } + + stream->priv->pending = TRUE; + return TRUE; +} + +/** + * g_output_stream_clear_pending: + * @stream: output stream + * + * Clears the pending flag on @stream. + **/ +void +g_output_stream_clear_pending (GOutputStream *stream) +{ + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + + stream->priv->pending = FALSE; +} + + +/******************************************** + * Default implementation of async ops * + ********************************************/ + +typedef struct { + const void *buffer; + gsize count_requested; + gssize count_written; +} WriteData; + +static void +write_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + WriteData *op; + GOutputStreamClass *class; + GError *error = NULL; + + class = G_OUTPUT_STREAM_GET_CLASS (object); + op = g_simple_async_result_get_op_res_gpointer (res); + op->count_written = class->write_fn (G_OUTPUT_STREAM (object), op->buffer, op->count_requested, + cancellable, &error); + if (op->count_written == -1) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } +} + +static void +g_output_stream_real_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + WriteData *op; + + op = g_new0 (WriteData, 1); + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_write_async); + g_simple_async_result_set_op_res_gpointer (res, op, g_free); + op->buffer = buffer; + op->count_requested = count; + + g_simple_async_result_run_in_thread (res, write_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static gssize +g_output_stream_real_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + WriteData *op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_output_stream_real_write_async); + op = g_simple_async_result_get_op_res_gpointer (simple); + return op->count_written; +} + +typedef struct { + GInputStream *source; + GOutputStreamSpliceFlags flags; + gssize bytes_copied; +} SpliceData; + +static void +splice_async_thread (GSimpleAsyncResult *result, + GObject *object, + GCancellable *cancellable) +{ + SpliceData *op; + GOutputStreamClass *class; + GError *error = NULL; + GOutputStream *stream; + + stream = G_OUTPUT_STREAM (object); + class = G_OUTPUT_STREAM_GET_CLASS (object); + op = g_simple_async_result_get_op_res_gpointer (result); + + op->bytes_copied = class->splice (stream, + op->source, + op->flags, + cancellable, + &error); + if (op->bytes_copied == -1) + { + g_simple_async_result_set_from_error (result, error); + g_error_free (error); + } +} + +static void +g_output_stream_real_splice_async (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + SpliceData *op; + + op = g_new0 (SpliceData, 1); + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_splice_async); + g_simple_async_result_set_op_res_gpointer (res, op, g_free); + op->flags = flags; + op->source = source; + + /* TODO: In the case where both source and destintion have + non-threadbased async calls we can use a true async copy here */ + + g_simple_async_result_run_in_thread (res, splice_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static gssize +g_output_stream_real_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + SpliceData *op; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_output_stream_real_splice_async); + op = g_simple_async_result_get_op_res_gpointer (simple); + return op->bytes_copied; +} + + +static void +flush_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GOutputStreamClass *class; + gboolean result; + GError *error = NULL; + + class = G_OUTPUT_STREAM_GET_CLASS (object); + result = TRUE; + if (class->flush) + result = class->flush (G_OUTPUT_STREAM (object), cancellable, &error); + + if (!result) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } +} + +static void +g_output_stream_real_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_write_async); + + g_simple_async_result_run_in_thread (res, flush_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static gboolean +g_output_stream_real_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +static void +close_async_thread (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GOutputStreamClass *class; + GError *error = NULL; + gboolean result; + + /* Auto handling of cancelation disabled, and ignore + cancellation, since we want to close things anyway, although + possibly in a quick-n-dirty way. At least we never want to leak + open handles */ + + class = G_OUTPUT_STREAM_GET_CLASS (object); + if (class->close_fn) + { + result = class->close_fn (G_OUTPUT_STREAM (object), cancellable, &error); + if (!result) + { + g_simple_async_result_set_from_error (res, error); + g_error_free (error); + } + } +} + +static void +g_output_stream_real_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + + res = g_simple_async_result_new (G_OBJECT (stream), callback, user_data, g_output_stream_real_close_async); + + g_simple_async_result_set_handle_cancellation (res, FALSE); + + g_simple_async_result_run_in_thread (res, close_async_thread, io_priority, cancellable); + g_object_unref (res); +} + +static gboolean +g_output_stream_real_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_output_stream_real_close_async); + return TRUE; +} + +#define __G_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/goutputstream.h b/gio/goutputstream.h new file mode 100644 index 0000000..e28bded --- /dev/null +++ b/gio/goutputstream.h @@ -0,0 +1,207 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_OUTPUT_STREAM_H__ +#define __G_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_OUTPUT_STREAM (g_output_stream_get_type ()) +#define G_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_OUTPUT_STREAM, GOutputStream)) +#define G_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_OUTPUT_STREAM, GOutputStreamClass)) +#define G_IS_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_OUTPUT_STREAM)) +#define G_IS_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_OUTPUT_STREAM)) +#define G_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_OUTPUT_STREAM, GOutputStreamClass)) + +/** + * GOutputStream: + * + * Base class for writing output. + * + * All classes derived from GOutputStream should implement synchronous + * writing, splicing, flushing and closing streams, but may implement + * asynchronous versions. + **/ +typedef struct _GOutputStreamClass GOutputStreamClass; +typedef struct _GOutputStreamPrivate GOutputStreamPrivate; + +struct _GOutputStream +{ + GObject parent_instance; + + /*< private >*/ + GOutputStreamPrivate *priv; +}; + + +struct _GOutputStreamClass +{ + GObjectClass parent_class; + + /* Sync ops: */ + + gssize (* write_fn) (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + gssize (* splice) (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + GCancellable *cancellable, + GError **error); + gboolean (* flush) (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + gboolean (* close_fn) (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + + /* Async ops: (optional in derived classes) */ + + void (* write_async) (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gssize (* write_finish) (GOutputStream *stream, + GAsyncResult *result, + GError **error); + void (* splice_async) (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); + gssize (* splice_finish) (GOutputStream *stream, + GAsyncResult *result, + GError **error); + void (* flush_async) (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* flush_finish) (GOutputStream *stream, + GAsyncResult *result, + GError **error); + void (* close_async) (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* close_finish) (GOutputStream *stream, + GAsyncResult *result, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + void (*_g_reserved7) (void); + void (*_g_reserved8) (void); +}; + +GType g_output_stream_get_type (void) G_GNUC_CONST; + +gssize g_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +gboolean g_output_stream_write_all (GOutputStream *stream, + const void *buffer, + gsize count, + gsize *bytes_written, + GCancellable *cancellable, + GError **error); +gssize g_output_stream_splice (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + GCancellable *cancellable, + GError **error); +gboolean g_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +gboolean g_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +void g_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gssize g_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +void g_output_stream_splice_async (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gssize g_output_stream_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +void g_output_stream_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +void g_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); + +gboolean g_output_stream_is_closed (GOutputStream *stream); +gboolean g_output_stream_is_closing (GOutputStream *stream); +gboolean g_output_stream_has_pending (GOutputStream *stream); +gboolean g_output_stream_set_pending (GOutputStream *stream, + GError **error); +void g_output_stream_clear_pending (GOutputStream *stream); + + +G_END_DECLS + +#endif /* __G_OUTPUT_STREAM_H__ */ diff --git a/gio/gpollfilemonitor.c b/gio/gpollfilemonitor.c new file mode 100644 index 0000000..51d04ef --- /dev/null +++ b/gio/gpollfilemonitor.c @@ -0,0 +1,233 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include + +#include "gpollfilemonitor.h" +#include "gfile.h" +#include "gfilemonitor.h" +#include "gfileinfo.h" + +#include "gioalias.h" + +static gboolean g_poll_file_monitor_cancel (GFileMonitor* monitor); +static void schedule_poll_timeout (GPollFileMonitor* poll_monitor); + +struct _GPollFileMonitor +{ + GFileMonitor parent_instance; + GFile *file; + GFileInfo *last_info; + guint timeout; +}; + +#define POLL_TIME_SECS 5 + +#define g_poll_file_monitor_get_type _g_poll_file_monitor_get_type +G_DEFINE_TYPE (GPollFileMonitor, g_poll_file_monitor, G_TYPE_FILE_MONITOR) + +static void +g_poll_file_monitor_finalize (GObject* object) +{ + GPollFileMonitor* poll_monitor; + + poll_monitor = G_POLL_FILE_MONITOR (object); + + g_object_unref (poll_monitor->file); + + G_OBJECT_CLASS (g_poll_file_monitor_parent_class)->finalize (object); +} + + +static void +g_poll_file_monitor_class_init (GPollFileMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); + + gobject_class->finalize = g_poll_file_monitor_finalize; + + file_monitor_class->cancel = g_poll_file_monitor_cancel; +} + +static void +g_poll_file_monitor_init (GPollFileMonitor* poll_monitor) +{ +} + +static int +safe_strcmp (const char *a, + const char *b) +{ + if (a == NULL && b == NULL) + return 0; + if (a == NULL) + return -1; + if (b == NULL) + return 1; + + return strcmp (a, b); +} + +static int +calc_event_type (GFileInfo *last, + GFileInfo *new) +{ + if (last == NULL && new == NULL) + return -1; + + if (last == NULL && new != NULL) + return G_FILE_MONITOR_EVENT_CREATED; + + if (last != NULL && new == NULL) + return G_FILE_MONITOR_EVENT_DELETED; + + if (safe_strcmp (g_file_info_get_etag (last), + g_file_info_get_etag (new))) + return G_FILE_MONITOR_EVENT_CHANGED; + + if (g_file_info_get_size (last) != + g_file_info_get_size (new)) + return G_FILE_MONITOR_EVENT_CHANGED; + + return -1; +} + +static void +got_new_info (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GPollFileMonitor* poll_monitor = user_data; + GFileInfo *info; + int event; + + info = g_file_query_info_finish (poll_monitor->file, res, NULL); + + if (!g_file_monitor_is_cancelled (G_FILE_MONITOR (poll_monitor))) + { + event = calc_event_type (poll_monitor->last_info, info); + + if (event != -1) + { + g_file_monitor_emit_event (G_FILE_MONITOR (poll_monitor), + poll_monitor->file, + NULL, event); + /* We're polling so slowly anyway, so always emit the done hint */ + if (event == G_FILE_MONITOR_EVENT_CHANGED) + g_file_monitor_emit_event (G_FILE_MONITOR (poll_monitor), + poll_monitor->file, + NULL, G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT); + } + + if (poll_monitor->last_info) + { + g_object_unref (poll_monitor->last_info); + poll_monitor->last_info = NULL; + } + + if (info) + poll_monitor->last_info = g_object_ref (info); + + schedule_poll_timeout (poll_monitor); + } + + if (info) + g_object_unref (info); + + g_object_unref (poll_monitor); +} + +static gboolean +poll_file_timeout (gpointer data) +{ + GPollFileMonitor* poll_monitor = data; + + poll_monitor->timeout = FALSE; + + g_file_query_info_async (poll_monitor->file, G_FILE_ATTRIBUTE_ETAG_VALUE "," G_FILE_ATTRIBUTE_STANDARD_SIZE, + 0, 0, NULL, got_new_info, g_object_ref (poll_monitor)); + + return FALSE; +} + +static void +schedule_poll_timeout (GPollFileMonitor* poll_monitor) +{ + poll_monitor->timeout = g_timeout_add_seconds (POLL_TIME_SECS, poll_file_timeout, poll_monitor); + } + +static void +got_initial_info (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GPollFileMonitor* poll_monitor = user_data; + GFileInfo *info; + + info = g_file_query_info_finish (poll_monitor->file, res, NULL); + + poll_monitor->last_info = info; + + if (!g_file_monitor_is_cancelled (G_FILE_MONITOR (poll_monitor))) + schedule_poll_timeout (poll_monitor); + + g_object_unref (poll_monitor); +} + +/** + * g_poll_file_monitor_new: + * @file: a #GFile. + * + * Polls @file for changes. + * + * Returns: a new #GFileMonitor for the given #GFile. + **/ +GFileMonitor* +_g_poll_file_monitor_new (GFile *file) +{ + GPollFileMonitor* poll_monitor; + + poll_monitor = g_object_new (G_TYPE_POLL_FILE_MONITOR, NULL); + + poll_monitor->file = g_object_ref (file); + + g_file_query_info_async (file, G_FILE_ATTRIBUTE_ETAG_VALUE "," G_FILE_ATTRIBUTE_STANDARD_SIZE, + 0, 0, NULL, got_initial_info, g_object_ref (poll_monitor)); + + return G_FILE_MONITOR (poll_monitor); +} + +static gboolean +g_poll_file_monitor_cancel (GFileMonitor* monitor) +{ + GPollFileMonitor *poll_monitor = G_POLL_FILE_MONITOR (monitor); + + if (poll_monitor->timeout) + { + g_source_remove (poll_monitor->timeout); + poll_monitor->timeout = 0; + } + + return TRUE; +} diff --git a/gio/gpollfilemonitor.h b/gio/gpollfilemonitor.h new file mode 100644 index 0000000..6537f5a --- /dev/null +++ b/gio/gpollfilemonitor.h @@ -0,0 +1,50 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_POLL_FILE_MONITOR_H__ +#define __G_POLL_FILE_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_POLL_FILE_MONITOR (_g_poll_file_monitor_get_type ()) +#define G_POLL_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_POLL_FILE_MONITOR, GPollFileMonitor)) +#define G_POLL_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_POLL_FILE_MONITOR, GPollFileMonitorClass)) +#define G_IS_POLL_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_POLL_FILE_MONITOR)) +#define G_IS_POLL_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_POLL_FILE_MONITOR)) + +typedef struct _GPollFileMonitor GPollFileMonitor; +typedef struct _GPollFileMonitorClass GPollFileMonitorClass; + +struct _GPollFileMonitorClass +{ + GFileMonitorClass parent_class; +}; + +GType _g_poll_file_monitor_get_type (void) G_GNUC_CONST; + +GFileMonitor * _g_poll_file_monitor_new (GFile *file); + +G_END_DECLS + +#endif /* __G_POLL_FILE_MONITOR_H__ */ diff --git a/gio/gresolver.c b/gio/gresolver.c new file mode 100644 index 0000000..e7dd8ad --- /dev/null +++ b/gio/gresolver.c @@ -0,0 +1,935 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include "gresolver.h" +#include "gnetworkingprivate.h" +#include "gasyncresult.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "gsimpleasyncresult.h" +#include "gsrvtarget.h" + +#ifdef G_OS_UNIX +#include "gunixresolver.h" +#include +#endif +#ifdef G_OS_WIN32 +#include "gwin32resolver.h" +#endif + +#include + +#include "gioalias.h" + +/** + * SECTION:gresolver + * @short_description: Asynchronous and cancellable DNS resolver + * @include: gio/gio.h + * + * #GResolver provides cancellable synchronous and asynchronous DNS + * resolution, for hostnames (g_resolver_lookup_by_address(), + * g_resolver_lookup_by_name() and their async variants) and SRV + * (service) records (g_resolver_lookup_service()). + * + * #GNetworkAddress and #GNetworkService provide wrappers around + * #GResolver functionality that also implement #GSocketConnectable, + * making it easy to connect to a remote host/service. + */ + +enum { + RELOAD, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +struct _GResolverPrivate { +#ifdef G_OS_UNIX + time_t resolv_conf_timestamp; +#else + int dummy; +#endif +}; + +/** + * GResolver: + * + * The object that handles DNS resolution. Use g_resolver_get_default() + * to get the default resolver. + */ +G_DEFINE_TYPE (GResolver, g_resolver, G_TYPE_OBJECT) + +static void +g_resolver_class_init (GResolverClass *resolver_class) +{ + volatile GType type; + + g_type_class_add_private (resolver_class, sizeof (GResolverPrivate)); + + /* Make sure _g_networking_init() has been called */ + type = g_inet_address_get_type (); + + /* Initialize _g_resolver_addrinfo_hints */ +#ifdef AI_ADDRCONFIG + _g_resolver_addrinfo_hints.ai_flags |= AI_ADDRCONFIG; +#endif + /* These two don't actually matter, they just get copied into the + * returned addrinfo structures (and then we ignore them). But if + * we leave them unset, we'll get back duplicate answers. + */ + _g_resolver_addrinfo_hints.ai_socktype = SOCK_STREAM; + _g_resolver_addrinfo_hints.ai_protocol = IPPROTO_TCP; + + /** + * GResolver::reload: + * @resolver: a #GResolver + * + * Emitted when the resolver notices that the system resolver + * configuration has changed. + **/ + signals[RELOAD] = + g_signal_new (I_("reload"), + G_TYPE_RESOLVER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GResolverClass, reload), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +g_resolver_init (GResolver *resolver) +{ +#ifdef G_OS_UNIX + struct stat st; +#endif + + resolver->priv = G_TYPE_INSTANCE_GET_PRIVATE (resolver, G_TYPE_RESOLVER, GResolverPrivate); + +#ifdef G_OS_UNIX + if (stat (_PATH_RESCONF, &st) == 0) + resolver->priv->resolv_conf_timestamp = st.st_mtime; +#endif +} + +static GResolver *default_resolver; + +/** + * g_resolver_get_default: + * + * Gets the default #GResolver. You should unref it when you are done + * with it. #GResolver may use its reference count as a hint about how + * many threads/processes, etc it should allocate for concurrent DNS + * resolutions. + * + * Return value: the default #GResolver. + * + * Since: 2.22 + */ +GResolver * +g_resolver_get_default (void) +{ + if (!default_resolver) + { + if (g_thread_supported ()) + default_resolver = g_object_new (G_TYPE_THREADED_RESOLVER, NULL); + else + { +#if defined(G_OS_UNIX) + default_resolver = g_object_new (G_TYPE_UNIX_RESOLVER, NULL); +#elif defined(G_OS_WIN32) + default_resolver = g_object_new (G_TYPE_WIN32_RESOLVER, NULL); +#endif + } + } + + return g_object_ref (default_resolver); +} + +/** + * g_resolver_set_default: + * @resolver: the new default #GResolver + * + * Sets @resolver to be the application's default resolver (reffing + * @resolver, and unreffing the previous default resolver, if any). + * Future calls to g_resolver_get_default() will return this resolver. + * + * This can be used if an application wants to perform any sort of DNS + * caching or "pinning"; it can implement its own #GResolver that + * calls the original default resolver for DNS operations, and + * implements its own cache policies on top of that, and then set + * itself as the default resolver for all later code to use. + * + * Since: 2.22 + */ +void +g_resolver_set_default (GResolver *resolver) +{ + if (default_resolver) + g_object_unref (default_resolver); + default_resolver = g_object_ref (resolver); +} + + +static void +g_resolver_maybe_reload (GResolver *resolver) +{ +#ifdef G_OS_UNIX + struct stat st; + + if (stat (_PATH_RESCONF, &st) == 0) + { + if (st.st_mtime != resolver->priv->resolv_conf_timestamp) + { + resolver->priv->resolv_conf_timestamp = st.st_mtime; + res_init (); + g_signal_emit (resolver, signals[RELOAD], 0); + } + } +#endif +} + +/** + * g_resolver_lookup_by_name: + * @resolver: a #GResolver + * @hostname: the hostname to look up + * @cancellable: a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Synchronously resolves @hostname to determine its associated IP + * address(es). @hostname may be an ASCII-only or UTF-8 hostname, or + * the textual form of an IP address (in which case this just becomes + * a wrapper around g_inet_address_new_from_string()). + * + * On success, g_resolver_lookup_by_name() will return a #GList of + * #GInetAddress, sorted in order of preference. (That is, you should + * attempt to connect to the first address first, then the second if + * the first fails, etc.) + * + * If the DNS resolution fails, @error (if non-%NULL) will be set to a + * value from #GResolverError. + * + * If @cancellable is non-%NULL, it can be used to cancel the + * operation, in which case @error (if non-%NULL) will be set to + * %G_IO_ERROR_CANCELLED. + * + * If you are planning to connect to a socket on the resolved IP + * address, it may be easier to create a #GNetworkAddress and use its + * #GSocketConnectable interface. + * + * Return value: a #GList of #GInetAddress, or %NULL on error. You + * must unref each of the addresses and free the list when you are + * done with it. (You can use g_resolver_free_addresses() to do this.) + * + * Since: 2.22 + */ +GList * +g_resolver_lookup_by_name (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error) +{ + GInetAddress *addr; + GList *addrs; + gchar *ascii_hostname = NULL; + + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + g_return_val_if_fail (hostname != NULL, NULL); + + /* Check if @hostname is just an IP address */ + addr = g_inet_address_new_from_string (hostname); + if (addr) + return g_list_append (NULL, addr); + + if (g_hostname_is_non_ascii (hostname)) + hostname = ascii_hostname = g_hostname_to_ascii (hostname); + + g_resolver_maybe_reload (resolver); + addrs = G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_name (resolver, hostname, cancellable, error); + + g_free (ascii_hostname); + return addrs; +} + +/** + * g_resolver_lookup_by_name_async: + * @resolver: a #GResolver + * @hostname: the hostname to look up the address of + * @cancellable: a #GCancellable, or %NULL + * @callback: callback to call after resolution completes + * @user_data: data for @callback + * + * Begins asynchronously resolving @hostname to determine its + * associated IP address(es), and eventually calls @callback, which + * must call g_resolver_lookup_by_name_finish() to get the result. + * See g_resolver_lookup_by_name() for more details. + * + * Since: 2.22 + */ +void +g_resolver_lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInetAddress *addr; + gchar *ascii_hostname = NULL; + + g_return_if_fail (G_IS_RESOLVER (resolver)); + g_return_if_fail (hostname != NULL); + + /* Check if @hostname is just an IP address */ + addr = g_inet_address_new_from_string (hostname); + if (addr) + { + GSimpleAsyncResult *simple; + + simple = g_simple_async_result_new (G_OBJECT (resolver), + callback, user_data, + g_resolver_lookup_by_name_async); + + g_simple_async_result_set_op_res_gpointer (simple, addr, g_object_unref); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + return; + } + + if (g_hostname_is_non_ascii (hostname)) + hostname = ascii_hostname = g_hostname_to_ascii (hostname); + + g_resolver_maybe_reload (resolver); + G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_name_async (resolver, hostname, cancellable, callback, user_data); + + g_free (ascii_hostname); +} + +/** + * g_resolver_lookup_by_name_finish: + * @resolver: a #GResolver + * @result: the result passed to your #GAsyncReadyCallback + * @error: return location for a #GError, or %NULL + * + * Retrieves the result of a call to + * g_resolver_lookup_by_name_async(). + * + * If the DNS resolution failed, @error (if non-%NULL) will be set to + * a value from #GResolverError. If the operation was cancelled, + * @error will be set to %G_IO_ERROR_CANCELLED. + * + * Return value: a #GList of #GInetAddress, or %NULL on error. See + * g_resolver_lookup_by_name() for more details. + * + * Since: 2.22 + */ +GList * +g_resolver_lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + /* Handle the stringified-IP-addr case */ + if (g_simple_async_result_get_source_tag (simple) == g_resolver_lookup_by_name_async) + { + GInetAddress *addr; + + addr = g_simple_async_result_get_op_res_gpointer (simple); + return g_list_append (NULL, g_object_ref (addr)); + } + } + + return G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_name_finish (resolver, result, error); +} + +/** + * g_resolver_free_addresses: + * @addresses: a #GList of #GInetAddress + * + * Frees @addresses (which should be the return value from + * g_resolver_lookup_by_name() or g_resolver_lookup_by_name_finish()). + * (This is a convenience method; you can also simply free the results + * by hand.) + * + * Since: 2.22 + */ +void +g_resolver_free_addresses (GList *addresses) +{ + GList *a; + + for (a = addresses; a; a = a->next) + g_object_unref (a->data); + g_list_free (addresses); +} + +/** + * g_resolver_lookup_by_address: + * @resolver: a #GResolver + * @address: the address to reverse-resolve + * @cancellable: a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Synchronously reverse-resolves @address to determine its + * associated hostname. + * + * If the DNS resolution fails, @error (if non-%NULL) will be set to + * a value from #GResolverError. + * + * If @cancellable is non-%NULL, it can be used to cancel the + * operation, in which case @error (if non-%NULL) will be set to + * %G_IO_ERROR_CANCELLED. + * + * Return value: a hostname (either ASCII-only, or in ASCII-encoded + * form), or %NULL on error. + * + * Since: 2.22 + */ +gchar * +g_resolver_lookup_by_address (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + g_return_val_if_fail (G_IS_INET_ADDRESS (address), NULL); + + g_resolver_maybe_reload (resolver); + return G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_address (resolver, address, cancellable, error); +} + +/** + * g_resolver_lookup_by_address_async: + * @resolver: a #GResolver + * @address: the address to reverse-resolve + * @cancellable: a #GCancellable, or %NULL + * @callback: callback to call after resolution completes + * @user_data: data for @callback + * + * Begins asynchronously reverse-resolving @address to determine its + * associated hostname, and eventually calls @callback, which must + * call g_resolver_lookup_by_address_finish() to get the final result. + * + * Since: 2.22 + */ +void +g_resolver_lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_RESOLVER (resolver)); + g_return_if_fail (G_IS_INET_ADDRESS (address)); + + g_resolver_maybe_reload (resolver); + G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_address_async (resolver, address, cancellable, callback, user_data); +} + +/** + * g_resolver_lookup_by_address_finish: + * @resolver: a #GResolver + * @result: the result passed to your #GAsyncReadyCallback + * @error: return location for a #GError, or %NULL + * + * Retrieves the result of a previous call to + * g_resolver_lookup_by_address_async(). + * + * If the DNS resolution failed, @error (if non-%NULL) will be set to + * a value from #GResolverError. If the operation was cancelled, + * @error will be set to %G_IO_ERROR_CANCELLED. + * + * Return value: a hostname (either ASCII-only, or in ASCII-encoded + * form), or %NULL on error. + * + * Since: 2.22 + */ +gchar * +g_resolver_lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + return G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_address_finish (resolver, result, error); +} + +static gchar * +g_resolver_get_service_rrname (const char *service, + const char *protocol, + const char *domain) +{ + gchar *rrname, *ascii_domain = NULL; + + if (g_hostname_is_non_ascii (domain)) + domain = ascii_domain = g_hostname_to_ascii (domain); + + rrname = g_strdup_printf ("_%s._%s.%s", service, protocol, domain); + + g_free (ascii_domain); + return rrname; +} + +/** + * g_resolver_lookup_service: + * @resolver: a #GResolver + * @service: the service type to look up (eg, "ldap") + * @protocol: the networking protocol to use for @service (eg, "tcp") + * @domain: the DNS domain to look up the service in + * @cancellable: a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Synchronously performs a DNS SRV lookup for the given @service and + * @protocol in the given @domain and returns an array of #GSrvTarget. + * @domain may be an ASCII-only or UTF-8 hostname. Note also that the + * @service and @protocol arguments do not + * include the leading underscore that appears in the actual DNS + * entry. + * + * On success, g_resolver_lookup_service() will return a #GList of + * #GSrvTarget, sorted in order of preference. (That is, you should + * attempt to connect to the first target first, then the second if + * the first fails, etc.) + * + * If the DNS resolution fails, @error (if non-%NULL) will be set to + * a value from #GResolverError. + * + * If @cancellable is non-%NULL, it can be used to cancel the + * operation, in which case @error (if non-%NULL) will be set to + * %G_IO_ERROR_CANCELLED. + * + * If you are planning to connect to the service, it is usually easier + * to create a #GNetworkService and use its #GSocketConnectable + * interface. + * + * Return value: a #GList of #GSrvTarget, or %NULL on error. You must + * free each of the targets and the list when you are done with it. + * (You can use g_resolver_free_targets() to do this.) + * + * Since: 2.22 + */ +GList * +g_resolver_lookup_service (GResolver *resolver, + const gchar *service, + const gchar *protocol, + const gchar *domain, + GCancellable *cancellable, + GError **error) +{ + GList *targets; + gchar *rrname; + + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + g_return_val_if_fail (service != NULL, NULL); + g_return_val_if_fail (protocol != NULL, NULL); + g_return_val_if_fail (domain != NULL, NULL); + + rrname = g_resolver_get_service_rrname (service, protocol, domain); + + g_resolver_maybe_reload (resolver); + targets = G_RESOLVER_GET_CLASS (resolver)-> + lookup_service (resolver, rrname, cancellable, error); + + g_free (rrname); + return targets; +} + +/** + * g_resolver_lookup_service_async: + * @resolver: a #GResolver + * @service: the service type to look up (eg, "ldap") + * @protocol: the networking protocol to use for @service (eg, "tcp") + * @domain: the DNS domain to look up the service in + * @cancellable: a #GCancellable, or %NULL + * @callback: callback to call after resolution completes + * @user_data: data for @callback + * + * Begins asynchronously performing a DNS SRV lookup for the given + * @service and @protocol in the given @domain, and eventually calls + * @callback, which must call g_resolver_lookup_service_finish() to + * get the final result. See g_resolver_lookup_service() for more + * details. + * + * Since: 2.22 + */ +void +g_resolver_lookup_service_async (GResolver *resolver, + const gchar *service, + const gchar *protocol, + const gchar *domain, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + gchar *rrname; + + g_return_if_fail (G_IS_RESOLVER (resolver)); + g_return_if_fail (service != NULL); + g_return_if_fail (protocol != NULL); + g_return_if_fail (domain != NULL); + + rrname = g_resolver_get_service_rrname (service, protocol, domain); + + g_resolver_maybe_reload (resolver); + G_RESOLVER_GET_CLASS (resolver)-> + lookup_service_async (resolver, rrname, cancellable, callback, user_data); + + g_free (rrname); +} + +/** + * g_resolver_lookup_service_finish: + * @resolver: a #GResolver + * @result: the result passed to your #GAsyncReadyCallback + * @error: return location for a #GError, or %NULL + * + * Retrieves the result of a previous call to + * g_resolver_lookup_service_async(). + * + * If the DNS resolution failed, @error (if non-%NULL) will be set to + * a value from #GResolverError. If the operation was cancelled, + * @error will be set to %G_IO_ERROR_CANCELLED. + * + * Return value: a #GList of #GSrvTarget, or %NULL on error. See + * g_resolver_lookup_service() for more details. + * + * Since: 2.22 + */ +GList * +g_resolver_lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + } + + return G_RESOLVER_GET_CLASS (resolver)-> + lookup_service_finish (resolver, result, error); +} + +/** + * g_resolver_free_targets: + * @targets: a #GList of #GSrvTarget + * + * Frees @targets (which should be the return value from + * g_resolver_lookup_service() or g_resolver_lookup_service_finish()). + * (This is a convenience method; you can also simply free the + * results by hand.) + * + * Since: 2.22 + */ +void +g_resolver_free_targets (GList *targets) +{ + GList *t; + + for (t = targets; t; t = t->next) + g_srv_target_free (t->data); + g_list_free (targets); +} + +/** + * g_resolver_error_quark: + * + * Gets the #GResolver Error Quark. + * + * Return value: a #GQuark. + * + * Since: 2.22 + */ +GQuark +g_resolver_error_quark (void) +{ + return g_quark_from_static_string ("g-resolver-error-quark"); +} + + +static GResolverError +g_resolver_error_from_addrinfo_error (gint err) +{ + switch (err) + { + case EAI_FAIL: +#if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME) + case EAI_NODATA: +#endif + case EAI_NONAME: + return G_RESOLVER_ERROR_NOT_FOUND; + + case EAI_AGAIN: + return G_RESOLVER_ERROR_TEMPORARY_FAILURE; + + default: + return G_RESOLVER_ERROR_INTERNAL; + } +} + +struct addrinfo _g_resolver_addrinfo_hints; + +/* Private method to process a getaddrinfo() response. */ +GList * +_g_resolver_addresses_from_addrinfo (const char *hostname, + struct addrinfo *res, + gint gai_retval, + GError **error) +{ + struct addrinfo *ai; + GSocketAddress *sockaddr; + GInetAddress *addr; + GList *addrs; + + if (gai_retval != 0) + { + g_set_error (error, G_RESOLVER_ERROR, + g_resolver_error_from_addrinfo_error (gai_retval), + _("Error resolving '%s': %s"), + hostname, gai_strerror (gai_retval)); + return NULL; + } + + g_return_val_if_fail (res != NULL, NULL); + + addrs = NULL; + for (ai = res; ai; ai = ai->ai_next) + { + sockaddr = g_socket_address_new_from_native (ai->ai_addr, ai->ai_addrlen); + if (!sockaddr || !G_IS_INET_SOCKET_ADDRESS (sockaddr)) + continue; + + addr = g_object_ref (g_inet_socket_address_get_address ((GInetSocketAddress *)sockaddr)); + addrs = g_list_prepend (addrs, addr); + g_object_unref (sockaddr); + } + + return g_list_reverse (addrs); +} + +/* Private method to set up a getnameinfo() request */ +void +_g_resolver_address_to_sockaddr (GInetAddress *address, + struct sockaddr_storage *sa, + gsize *len) +{ + GSocketAddress *sockaddr; + + sockaddr = g_inet_socket_address_new (address, 0); + g_socket_address_to_native (sockaddr, (struct sockaddr *)sa, sizeof (*sa), NULL); + *len = g_socket_address_get_native_size (sockaddr); + g_object_unref (sockaddr); +} + +/* Private method to process a getnameinfo() response. */ +char * +_g_resolver_name_from_nameinfo (GInetAddress *address, + const gchar *name, + gint gni_retval, + GError **error) +{ + if (gni_retval != 0) + { + gchar *phys; + + phys = g_inet_address_to_string (address); + g_set_error (error, G_RESOLVER_ERROR, + g_resolver_error_from_addrinfo_error (gni_retval), + _("Error reverse-resolving '%s': %s"), + phys ? phys : "(unknown)", gai_strerror (gni_retval)); + g_free (phys); + return NULL; + } + + return g_strdup (name); +} + +#if defined(G_OS_UNIX) +/* Private method to process a res_query response into GSrvTargets */ +GList * +_g_resolver_targets_from_res_query (const gchar *rrname, + guchar *answer, + gint len, + gint herr, + GError **error) +{ + gint count; + gchar namebuf[1024]; + guchar *end, *p; + guint16 type, qclass, rdlength, priority, weight, port; + guint32 ttl; + HEADER *header; + GSrvTarget *target; + GList *targets; + + if (len <= 0) + { + GResolverError errnum; + const gchar *format; + + if (len == 0 || herr == HOST_NOT_FOUND || herr == NO_DATA) + { + errnum = G_RESOLVER_ERROR_NOT_FOUND; + format = _("No service record for '%s'"); + } + else if (herr == TRY_AGAIN) + { + errnum = G_RESOLVER_ERROR_TEMPORARY_FAILURE; + format = _("Temporarily unable to resolve '%s'"); + } + else + { + errnum = G_RESOLVER_ERROR_INTERNAL; + format = _("Error resolving '%s'"); + } + + g_set_error (error, G_RESOLVER_ERROR, errnum, format, rrname); + return NULL; + } + + targets = NULL; + + header = (HEADER *)answer; + p = answer + sizeof (HEADER); + end = answer + len; + + /* Skip query */ + count = ntohs (header->qdcount); + while (count-- && p < end) + { + p += dn_expand (answer, end, p, namebuf, sizeof (namebuf)); + p += 4; + } + + /* Read answers */ + count = ntohs (header->ancount); + while (count-- && p < end) + { + p += dn_expand (answer, end, p, namebuf, sizeof (namebuf)); + GETSHORT (type, p); + GETSHORT (qclass, p); + GETLONG (ttl, p); + GETSHORT (rdlength, p); + + if (type != T_SRV || qclass != C_IN) + { + p += rdlength; + continue; + } + + GETSHORT (priority, p); + GETSHORT (weight, p); + GETSHORT (port, p); + p += dn_expand (answer, end, p, namebuf, sizeof (namebuf)); + + target = g_srv_target_new (namebuf, port, priority, weight); + targets = g_list_prepend (targets, target); + } + + return g_srv_target_list_sort (targets); +} +#elif defined(G_OS_WIN32) +/* Private method to process a DnsQuery response into GSrvTargets */ +GList * +_g_resolver_targets_from_DnsQuery (const gchar *rrname, + DNS_STATUS status, + DNS_RECORD *results, + GError **error) +{ + DNS_RECORD *rec; + GSrvTarget *target; + GList *targets; + + if (status != ERROR_SUCCESS) + { + GResolverError errnum; + const gchar *format; + + if (status == DNS_ERROR_RCODE_NAME_ERROR) + { + errnum = G_RESOLVER_ERROR_NOT_FOUND; + format = _("No service record for '%s'"); + } + else if (status == DNS_ERROR_RCODE_SERVER_FAILURE) + { + errnum = G_RESOLVER_ERROR_TEMPORARY_FAILURE; + format = _("Temporarily unable to resolve '%s'"); + } + else + { + errnum = G_RESOLVER_ERROR_INTERNAL; + format = _("Error resolving '%s'"); + } + + g_set_error (error, G_RESOLVER_ERROR, errnum, format, rrname); + return NULL; + } + + targets = NULL; + for (rec = results; rec; rec = rec->pNext) + { + if (rec->wType != DNS_TYPE_SRV) + continue; + + target = g_srv_target_new (rec->Data.SRV.pNameTarget, + rec->Data.SRV.wPort, + rec->Data.SRV.wPriority, + rec->Data.SRV.wWeight); + targets = g_list_prepend (targets, target); + } + + return g_srv_target_list_sort (targets); +} + +#endif + +#define __G_RESOLVER_C__ +#include "gioaliasdef.c" diff --git a/gio/gresolver.h b/gio/gresolver.h new file mode 100644 index 0000000..1187a3f --- /dev/null +++ b/gio/gresolver.h @@ -0,0 +1,167 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_RESOLVER_H__ +#define __G_RESOLVER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_RESOLVER (g_resolver_get_type ()) +#define G_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_RESOLVER, GResolver)) +#define G_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_RESOLVER, GResolverClass)) +#define G_IS_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_RESOLVER)) +#define G_IS_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_RESOLVER)) +#define G_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_RESOLVER, GResolverClass)) + +typedef struct _GResolverPrivate GResolverPrivate; +typedef struct _GResolverClass GResolverClass; + +struct _GResolver { + GObject parent_instance; + + GResolverPrivate *priv; +}; + +struct _GResolverClass { + GObjectClass parent_class; + + /* Signals */ + void ( *reload) (GResolver *resolver); + + /* Virtual methods */ + GList * ( *lookup_by_name) (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error); + void ( *lookup_by_name_async) (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GList * ( *lookup_by_name_finish) (GResolver *resolver, + GAsyncResult *result, + GError **error); + + gchar * ( *lookup_by_address) (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GError **error); + void ( *lookup_by_address_async) (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gchar * ( *lookup_by_address_finish) (GResolver *resolver, + GAsyncResult *result, + GError **error); + + GList * ( *lookup_service) (GResolver *resolver, + const gchar *rrname, + GCancellable *cancellable, + GError **error); + void ( *lookup_service_async) (GResolver *resolver, + const gchar *rrname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GList * ( *lookup_service_finish) (GResolver *resolver, + GAsyncResult *result, + GError **error); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + +}; + +GType g_resolver_get_type (void) G_GNUC_CONST; +GResolver *g_resolver_get_default (void); +void g_resolver_set_default (GResolver *resolver); + +GList *g_resolver_lookup_by_name (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error); +void g_resolver_lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GList *g_resolver_lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +void g_resolver_free_addresses (GList *addresses); + +gchar *g_resolver_lookup_by_address (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GError **error); +void g_resolver_lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gchar *g_resolver_lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +GList *g_resolver_lookup_service (GResolver *resolver, + const gchar *service, + const gchar *protocol, + const gchar *domain, + GCancellable *cancellable, + GError **error); +void g_resolver_lookup_service_async (GResolver *resolver, + const gchar *service, + const gchar *protocol, + const gchar *domain, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GList *g_resolver_lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +void g_resolver_free_targets (GList *targets); + +/** + * G_RESOLVER_ERROR: + * + * Error domain for #GResolver. Errors in this domain will be from the + * #GResolverError enumeration. See #GError for more information on + * error domains. + */ +#define G_RESOLVER_ERROR (g_resolver_error_quark ()) +GQuark g_resolver_error_quark (void); + +G_END_DECLS + +#endif /* __G_RESOLVER_H__ */ diff --git a/gio/gseekable.c b/gio/gseekable.c new file mode 100644 index 0000000..04af1f8 --- /dev/null +++ b/gio/gseekable.c @@ -0,0 +1,179 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include "gseekable.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gseekable + * @short_description: Stream seeking interface + * @include: gio/gio.h + * @see_also: #GInputStream, #GOutputStream + * + * #GSeekable is implemented by streams (implementations of + * #GInputStream or #GOutputStream) that support seeking. + * + **/ + +typedef GSeekableIface GSeekableInterface; +G_DEFINE_INTERFACE (GSeekable, g_seekable, G_TYPE_OBJECT) + +static void +g_seekable_default_init (GSeekableInterface *iface) +{ +} + +/** + * g_seekable_tell: + * @seekable: a #GSeekable. + * + * Tells the current position within the stream. + * + * Returns: the offset from the beginning of the buffer. + **/ +goffset +g_seekable_tell (GSeekable *seekable) +{ + GSeekableIface *iface; + + g_return_val_if_fail (G_IS_SEEKABLE (seekable), 0); + + iface = G_SEEKABLE_GET_IFACE (seekable); + + return (* iface->tell) (seekable); +} + +/** + * g_seekable_can_seek: + * @seekable: a #GSeekable. + * + * Tests if the stream supports the #GSeekableIface. + * + * Returns: %TRUE if @seekable can be seeked. %FALSE otherwise. + **/ +gboolean +g_seekable_can_seek (GSeekable *seekable) +{ + GSeekableIface *iface; + + g_return_val_if_fail (G_IS_SEEKABLE (seekable), FALSE); + + iface = G_SEEKABLE_GET_IFACE (seekable); + + return (* iface->can_seek) (seekable); +} + +/** + * g_seekable_seek: + * @seekable: a #GSeekable. + * @offset: a #goffset. + * @type: a #GSeekType. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Seeks in the stream by the given @offset, modified by @type. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: %TRUE if successful. If an error + * has occurred, this function will return %FALSE and set @error + * appropriately if present. + **/ +gboolean +g_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GSeekableIface *iface; + + g_return_val_if_fail (G_IS_SEEKABLE (seekable), FALSE); + + iface = G_SEEKABLE_GET_IFACE (seekable); + + return (* iface->seek) (seekable, offset, type, cancellable, error); +} + +/** + * g_seekable_can_truncate: + * @seekable: a #GSeekable. + * + * Tests if the stream can be truncated. + * + * Returns: %TRUE if the stream can be truncated, %FALSE otherwise. + **/ +gboolean +g_seekable_can_truncate (GSeekable *seekable) +{ + GSeekableIface *iface; + + g_return_val_if_fail (G_IS_SEEKABLE (seekable), FALSE); + + iface = G_SEEKABLE_GET_IFACE (seekable); + + return (* iface->can_truncate) (seekable); +} + +/** + * g_seekable_truncate: + * @seekable: a #GSeekable. + * @offset: a #goffset. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Truncates a stream with a given #offset. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. If an + * operation was partially finished when the operation was cancelled the + * partial result will be returned, without an error. + * + * Returns: %TRUE if successful. If an error + * has occurred, this function will return %FALSE and set @error + * appropriately if present. + **/ +gboolean +g_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + GSeekableIface *iface; + + g_return_val_if_fail (G_IS_SEEKABLE (seekable), FALSE); + + iface = G_SEEKABLE_GET_IFACE (seekable); + + return (* iface->truncate_fn) (seekable, offset, cancellable, error); +} + +#define __G_SEEKABLE_C__ +#include "gioaliasdef.c" diff --git a/gio/gseekable.h b/gio/gseekable.h new file mode 100644 index 0000000..0cba50f --- /dev/null +++ b/gio/gseekable.h @@ -0,0 +1,99 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SEEKABLE_H__ +#define __G_SEEKABLE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SEEKABLE (g_seekable_get_type ()) +#define G_SEEKABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_SEEKABLE, GSeekable)) +#define G_IS_SEEKABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_SEEKABLE)) +#define G_SEEKABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_SEEKABLE, GSeekableIface)) + +/** + * GSeekable: + * + * Seek object for streaming operations. + **/ +typedef struct _GSeekableIface GSeekableIface; + +/** + * GSeekableIface: + * @g_iface: The parent interface. + * @tell: Tells the current location within a stream. + * @can_seek: Checks if seeking is supported by the stream. + * @seek: Seeks to a location within a stream. + * @can_truncate: Chekcs if truncation is suppored by the stream. + * @truncate_fn: Truncates a stream. + * + * Provides an interface for implementing seekable functionality on I/O Streams. + **/ +struct _GSeekableIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + goffset (* tell) (GSeekable *seekable); + + gboolean (* can_seek) (GSeekable *seekable); + gboolean (* seek) (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); + + gboolean (* can_truncate) (GSeekable *seekable); + gboolean (* truncate_fn) (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + + /* TODO: Async seek/truncate */ +}; + +GType g_seekable_get_type (void) G_GNUC_CONST; + +goffset g_seekable_tell (GSeekable *seekable); +gboolean g_seekable_can_seek (GSeekable *seekable); +gboolean g_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +gboolean g_seekable_can_truncate (GSeekable *seekable); +gboolean g_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + + +#endif /* __G_SEEKABLE_H__ */ diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c new file mode 100644 index 0000000..6121dc0 --- /dev/null +++ b/gio/gsimpleasyncresult.c @@ -0,0 +1,841 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gsimpleasyncresult.h" +#include "gasyncresult.h" +#include "gcancellable.h" +#include "gioscheduler.h" +#include +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gsimpleasyncresult + * @short_description: Simple asynchronous results implementation + * @include: gio/gio.h + * @see_also: #GAsyncResult + * + * Implements #GAsyncResult for simple cases. Most of the time, this + * will be all an application needs, and will be used transparently. + * Because of this, #GSimpleAsyncResult is used throughout GIO for + * handling asynchronous functions. + * + * GSimpleAsyncResult handles #GAsyncReadyCallbacks, error + * reporting, operation cancellation and the final state of an operation, + * completely transparent to the application. Results can be returned + * as a pointer e.g. for functions that return data that is collected + * asynchronously, a boolean value for checking the success or failure + * of an operation, or a #gssize for operations which return the number + * of bytes modified by the operation; all of the simple return cases + * are covered. + * + * Most of the time, an application will not need to know of the details + * of this API; it is handled transparently, and any necessary operations + * are handled by #GAsyncResult's interface. However, if implementing a + * new GIO module, for writing language bindings, or for complex + * applications that need better control of how asynchronous operations + * are completed, it is important to understand this functionality. + * + * GSimpleAsyncResults are tagged with the calling function to ensure + * that asynchronous functions and their finishing functions are used + * together correctly. + * + * To create a new #GSimpleAsyncResult, call g_simple_async_result_new(). + * If the result needs to be created for a #GError, use + * g_simple_async_result_new_from_error(). If a #GError is not available + * (e.g. the asynchronous operation's doesn't take a #GError argument), + * but the result still needs to be created for an error condition, use + * g_simple_async_result_new_error() (or g_simple_async_result_set_error_va() + * if your application or binding requires passing a variable argument list + * directly), and the error can then be propagated through the use of + * g_simple_async_result_propagate_error(). + * + * An asynchronous operation can be made to ignore a cancellation event by + * calling g_simple_async_result_set_handle_cancellation() with a + * #GSimpleAsyncResult for the operation and %FALSE. This is useful for + * operations that are dangerous to cancel, such as close (which would + * cause a leak if cancelled before being run). + * + * GSimpleAsyncResult can integrate into GLib's event loop, #GMainLoop, + * or it can use #GThreads if available. + * g_simple_async_result_complete() will finish an I/O task directly + * from the point where it is called. g_simple_async_result_complete_in_idle() + * will finish it from an idle handler in the thread-default main + * context. g_simple_async_result_run_in_thread() will run the + * job in a separate thread and then deliver the result to the + * thread-default main context. + * + * To set the results of an asynchronous function, + * g_simple_async_result_set_op_res_gpointer(), + * g_simple_async_result_set_op_res_gboolean(), and + * g_simple_async_result_set_op_res_gssize() + * are provided, setting the operation's result to a gpointer, gboolean, or + * gssize, respectively. + * + * Likewise, to get the result of an asynchronous function, + * g_simple_async_result_get_op_res_gpointer(), + * g_simple_async_result_get_op_res_gboolean(), and + * g_simple_async_result_get_op_res_gssize() are + * provided, getting the operation's result as a gpointer, gboolean, and + * gssize, respectively. + **/ + +static void g_simple_async_result_async_result_iface_init (GAsyncResultIface *iface); + +struct _GSimpleAsyncResult +{ + GObject parent_instance; + + GObject *source_object; + GAsyncReadyCallback callback; + gpointer user_data; + GMainContext *context; + GError *error; + gboolean failed; + gboolean handle_cancellation; + + gpointer source_tag; + + union { + gpointer v_pointer; + gboolean v_boolean; + gssize v_ssize; + } op_res; + + GDestroyNotify destroy_op_res; +}; + +struct _GSimpleAsyncResultClass +{ + GObjectClass parent_class; +}; + + +G_DEFINE_TYPE_WITH_CODE (GSimpleAsyncResult, g_simple_async_result, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, + g_simple_async_result_async_result_iface_init)) + +static void +clear_op_res (GSimpleAsyncResult *simple) +{ + if (simple->destroy_op_res) + simple->destroy_op_res (simple->op_res.v_pointer); + simple->destroy_op_res = NULL; + simple->op_res.v_ssize = 0; +} + +static void +g_simple_async_result_finalize (GObject *object) +{ + GSimpleAsyncResult *simple; + + simple = G_SIMPLE_ASYNC_RESULT (object); + + if (simple->source_object) + g_object_unref (simple->source_object); + + if (simple->context) + g_main_context_unref (simple->context); + + clear_op_res (simple); + + if (simple->error) + g_error_free (simple->error); + + G_OBJECT_CLASS (g_simple_async_result_parent_class)->finalize (object); +} + +static void +g_simple_async_result_class_init (GSimpleAsyncResultClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_simple_async_result_finalize; +} + +static void +g_simple_async_result_init (GSimpleAsyncResult *simple) +{ + simple->handle_cancellation = TRUE; + + simple->context = g_main_context_get_thread_default (); + if (simple->context) + g_main_context_ref (simple->context); +} + +/** + * g_simple_async_result_new: + * @source_object: a #GObject the asynchronous function was called with, + * or %NULL. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * @source_tag: the asynchronous function. + * + * Creates a #GSimpleAsyncResult. + * + * Returns: a #GSimpleAsyncResult. + **/ +GSimpleAsyncResult * +g_simple_async_result_new (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer source_tag) +{ + GSimpleAsyncResult *simple; + + g_return_val_if_fail (!source_object || G_IS_OBJECT (source_object), NULL); + + simple = g_object_new (G_TYPE_SIMPLE_ASYNC_RESULT, NULL); + simple->callback = callback; + if (source_object) + simple->source_object = g_object_ref (source_object); + else + simple->source_object = NULL; + simple->user_data = user_data; + simple->source_tag = source_tag; + + return simple; +} + +/** + * g_simple_async_result_new_from_error: + * @source_object: a #GObject, or %NULL. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * @error: a #GError location. + * + * Creates a #GSimpleAsyncResult from an error condition. + * + * Returns: a #GSimpleAsyncResult. + **/ +GSimpleAsyncResult * +g_simple_async_result_new_from_error (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error) +{ + GSimpleAsyncResult *simple; + + g_return_val_if_fail (!source_object || G_IS_OBJECT (source_object), NULL); + + simple = g_simple_async_result_new (source_object, + callback, + user_data, NULL); + g_simple_async_result_set_from_error (simple, error); + + return simple; +} + +/** + * g_simple_async_result_new_error: + * @source_object: a #GObject, or %NULL. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * @domain: a #GQuark. + * @code: an error code. + * @format: a string with format characters. + * @...: a list of values to insert into @format. + * + * Creates a new #GSimpleAsyncResult with a set error. + * + * Returns: a #GSimpleAsyncResult. + **/ +GSimpleAsyncResult * +g_simple_async_result_new_error (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + GQuark domain, + gint code, + const char *format, + ...) +{ + GSimpleAsyncResult *simple; + va_list args; + + g_return_val_if_fail (!source_object || G_IS_OBJECT (source_object), NULL); + g_return_val_if_fail (domain != 0, NULL); + g_return_val_if_fail (format != NULL, NULL); + + simple = g_simple_async_result_new (source_object, + callback, + user_data, NULL); + + va_start (args, format); + g_simple_async_result_set_error_va (simple, domain, code, format, args); + va_end (args); + + return simple; +} + + +static gpointer +g_simple_async_result_get_user_data (GAsyncResult *res) +{ + return G_SIMPLE_ASYNC_RESULT (res)->user_data; +} + +static GObject * +g_simple_async_result_get_source_object (GAsyncResult *res) +{ + if (G_SIMPLE_ASYNC_RESULT (res)->source_object) + return g_object_ref (G_SIMPLE_ASYNC_RESULT (res)->source_object); + return NULL; +} + +static void +g_simple_async_result_async_result_iface_init (GAsyncResultIface *iface) +{ + iface->get_user_data = g_simple_async_result_get_user_data; + iface->get_source_object = g_simple_async_result_get_source_object; +} + +/** + * g_simple_async_result_set_handle_cancellation: + * @simple: a #GSimpleAsyncResult. + * @handle_cancellation: a #gboolean. + * + * Sets whether to handle cancellation within the asynchronous operation. + * + **/ +void +g_simple_async_result_set_handle_cancellation (GSimpleAsyncResult *simple, + gboolean handle_cancellation) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + simple->handle_cancellation = handle_cancellation; +} + +/** + * g_simple_async_result_get_source_tag: + * @simple: a #GSimpleAsyncResult. + * + * Gets the source tag for the #GSimpleAsyncResult. + * + * Returns: a #gpointer to the source object for the #GSimpleAsyncResult. + **/ +gpointer +g_simple_async_result_get_source_tag (GSimpleAsyncResult *simple) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple), NULL); + return simple->source_tag; +} + +/** + * g_simple_async_result_propagate_error: + * @simple: a #GSimpleAsyncResult. + * @dest: a location to propegate the error to. + * + * Propagates an error from within the simple asynchronous result to + * a given destination. + * + * Returns: %TRUE if the error was propagated to @dest. %FALSE otherwise. + **/ +gboolean +g_simple_async_result_propagate_error (GSimpleAsyncResult *simple, + GError **dest) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple), FALSE); + + if (simple->failed) + { + g_propagate_error (dest, simple->error); + simple->error = NULL; + return TRUE; + } + + return FALSE; +} + +/** + * g_simple_async_result_set_op_res_gpointer: + * @simple: a #GSimpleAsyncResult. + * @op_res: a pointer result from an asynchronous function. + * @destroy_op_res: a #GDestroyNotify function. + * + * Sets the operation result within the asynchronous result to a pointer. + **/ +void +g_simple_async_result_set_op_res_gpointer (GSimpleAsyncResult *simple, + gpointer op_res, + GDestroyNotify destroy_op_res) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + + clear_op_res (simple); + simple->op_res.v_pointer = op_res; + simple->destroy_op_res = destroy_op_res; +} + +/** + * g_simple_async_result_get_op_res_gpointer: + * @simple: a #GSimpleAsyncResult. + * + * Gets a pointer result as returned by the asynchronous function. + * + * Returns: a pointer from the result. + **/ +gpointer +g_simple_async_result_get_op_res_gpointer (GSimpleAsyncResult *simple) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple), NULL); + return simple->op_res.v_pointer; +} + +/** + * g_simple_async_result_set_op_res_gssize: + * @simple: a #GSimpleAsyncResult. + * @op_res: a #gssize. + * + * Sets the operation result within the asynchronous result to + * the given @op_res. + **/ +void +g_simple_async_result_set_op_res_gssize (GSimpleAsyncResult *simple, + gssize op_res) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + clear_op_res (simple); + simple->op_res.v_ssize = op_res; +} + +/** + * g_simple_async_result_get_op_res_gssize: + * @simple: a #GSimpleAsyncResult. + * + * Gets a gssize from the asynchronous result. + * + * Returns: a gssize returned from the asynchronous function. + **/ +gssize +g_simple_async_result_get_op_res_gssize (GSimpleAsyncResult *simple) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple), 0); + return simple->op_res.v_ssize; +} + +/** + * g_simple_async_result_set_op_res_gboolean: + * @simple: a #GSimpleAsyncResult. + * @op_res: a #gboolean. + * + * Sets the operation result to a boolean within the asynchronous result. + **/ +void +g_simple_async_result_set_op_res_gboolean (GSimpleAsyncResult *simple, + gboolean op_res) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + clear_op_res (simple); + simple->op_res.v_boolean = !!op_res; +} + +/** + * g_simple_async_result_get_op_res_gboolean: + * @simple: a #GSimpleAsyncResult. + * + * Gets the operation result boolean from within the asynchronous result. + * + * Returns: %TRUE if the operation's result was %TRUE, %FALSE + * if the operation's result was %FALSE. + **/ +gboolean +g_simple_async_result_get_op_res_gboolean (GSimpleAsyncResult *simple) +{ + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple), FALSE); + return simple->op_res.v_boolean; +} + +/** + * g_simple_async_result_set_from_error: + * @simple: a #GSimpleAsyncResult. + * @error: #GError. + * + * Sets the result from a #GError. + **/ +void +g_simple_async_result_set_from_error (GSimpleAsyncResult *simple, + const GError *error) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + g_return_if_fail (error != NULL); + + if (simple->error) + g_error_free (simple->error); + simple->error = g_error_copy (error); + simple->failed = TRUE; +} + +/** + * g_simple_async_result_set_error_va: + * @simple: a #GSimpleAsyncResult. + * @domain: a #GQuark (usually #G_IO_ERROR). + * @code: an error code. + * @format: a formatted error reporting string. + * @args: va_list of arguments. + * + * Sets an error within the asynchronous result without a #GError. + * Unless writing a binding, see g_simple_async_result_set_error(). + **/ +void +g_simple_async_result_set_error_va (GSimpleAsyncResult *simple, + GQuark domain, + gint code, + const char *format, + va_list args) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + g_return_if_fail (domain != 0); + g_return_if_fail (format != NULL); + + if (simple->error) + g_error_free (simple->error); + simple->error = g_error_new_valist (domain, code, format, args); + simple->failed = TRUE; +} + +/** + * g_simple_async_result_set_error: + * @simple: a #GSimpleAsyncResult. + * @domain: a #GQuark (usually #G_IO_ERROR). + * @code: an error code. + * @format: a formatted error reporting string. + * @...: a list of variables to fill in @format. + * + * Sets an error within the asynchronous result without a #GError. + **/ +void +g_simple_async_result_set_error (GSimpleAsyncResult *simple, + GQuark domain, + gint code, + const char *format, + ...) +{ + va_list args; + + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + g_return_if_fail (domain != 0); + g_return_if_fail (format != NULL); + + va_start (args, format); + g_simple_async_result_set_error_va (simple, domain, code, format, args); + va_end (args); +} + +/** + * g_simple_async_result_complete: + * @simple: a #GSimpleAsyncResult. + * + * Completes an asynchronous I/O job immediately. Must be called in + * the thread where the asynchronous result was to be delivered, as it + * invokes the callback directly. If you are in a different thread use + * g_simple_async_result_complete_in_idle(). + **/ +void +g_simple_async_result_complete (GSimpleAsyncResult *simple) +{ +#ifndef G_DISABLE_CHECKS + GSource *current_source; + GMainContext *current_context; +#endif + + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + +#ifndef G_DISABLE_CHECKS + current_source = g_main_current_source (); + if (current_source && !g_source_is_destroyed (current_source)) + { + current_context = g_source_get_context (current_source); + if (current_context == g_main_context_default ()) + current_context = NULL; + if (simple->context != current_context) + g_warning ("g_simple_async_result_complete() called from wrong context!"); + } +#endif + + if (simple->callback) + simple->callback (simple->source_object, + G_ASYNC_RESULT (simple), + simple->user_data); +} + +static gboolean +complete_in_idle_cb (gpointer data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (data); + + g_simple_async_result_complete (simple); + + return FALSE; +} + +/** + * g_simple_async_result_complete_in_idle: + * @simple: a #GSimpleAsyncResult. + * + * Completes an asynchronous function in an idle handler in the thread-default main + * loop of the thread that @simple was initially created in. + * + * Calling this function takes a reference to @simple for as long as + * is needed to complete the call. + */ +void +g_simple_async_result_complete_in_idle (GSimpleAsyncResult *simple) +{ + GSource *source; + + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + + g_object_ref (simple); + + source = g_idle_source_new (); + g_source_set_priority (source, G_PRIORITY_DEFAULT); + g_source_set_callback (source, complete_in_idle_cb, simple, g_object_unref); + + g_source_attach (source, simple->context); + g_source_unref (source); +} + +typedef struct { + GSimpleAsyncResult *simple; + GCancellable *cancellable; + GSimpleAsyncThreadFunc func; +} RunInThreadData; + + +static gboolean +complete_in_idle_cb_for_thread (gpointer _data) +{ + RunInThreadData *data = _data; + GSimpleAsyncResult *simple; + + simple = data->simple; + + if (simple->handle_cancellation && + g_cancellable_is_cancelled (data->cancellable)) + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_CANCELLED, + "%s", _("Operation was cancelled")); + + g_simple_async_result_complete (simple); + + if (data->cancellable) + g_object_unref (data->cancellable); + g_object_unref (data->simple); + g_free (data); + + return FALSE; +} + +static gboolean +run_in_thread (GIOSchedulerJob *job, + GCancellable *c, + gpointer _data) +{ + RunInThreadData *data = _data; + GSimpleAsyncResult *simple = data->simple; + GSource *source; + + if (simple->handle_cancellation && + g_cancellable_is_cancelled (c)) + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_CANCELLED, + "%s", _("Operation was cancelled")); + else + data->func (simple, + simple->source_object, + c); + + source = g_idle_source_new (); + g_source_set_priority (source, G_PRIORITY_DEFAULT); + g_source_set_callback (source, complete_in_idle_cb_for_thread, data, NULL); + + g_source_attach (source, simple->context); + g_source_unref (source); + + return FALSE; +} + +/** + * g_simple_async_result_run_in_thread: + * @simple: a #GSimpleAsyncResult. + * @func: a #GSimpleAsyncThreadFunc. + * @io_priority: the io priority of the request. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * + * Runs the asynchronous job in a separate thread and then calls + * g_simple_async_result_complete_in_idle() on @simple to return + * the result to the appropriate main loop. + * + * Calling this function takes a reference to @simple for as long as + * is needed to run the job and report its completion. + */ +void +g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple, + GSimpleAsyncThreadFunc func, + int io_priority, + GCancellable *cancellable) +{ + RunInThreadData *data; + + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + g_return_if_fail (func != NULL); + + data = g_new (RunInThreadData, 1); + data->func = func; + data->simple = g_object_ref (simple); + data->cancellable = cancellable; + if (cancellable) + g_object_ref (cancellable); + g_io_scheduler_push_job (run_in_thread, data, NULL, io_priority, cancellable); +} + +/** + * g_simple_async_result_is_valid: + * @result: the #GAsyncResult passed to the _finish function. + * @source: the #GObject passed to the _finish function. + * @source_tag: the asynchronous function. + * + * Ensures that the data passed to the _finish function of an async + * operation is consistent. Three checks are performed. + * + * First, @result is checked to ensure that it is really a + * #GSimpleAsyncResult. Second, @source is checked to ensure that it + * matches the source object of @result. Third, @source_tag is + * checked to ensure that it is equal to the source_tag argument given + * to g_simple_async_result_new() (which, by convention, is a pointer + * to the _async function corresponding to the _finish function from + * which this function is called). + * + * Returns: #TRUE if all checks passed or #FALSE if any failed. + **/ +gboolean +g_simple_async_result_is_valid (GAsyncResult *result, + GObject *source, + gpointer source_tag) +{ + GSimpleAsyncResult *simple; + GObject *cmp_source; + + if (!G_IS_SIMPLE_ASYNC_RESULT (result)) + return FALSE; + simple = (GSimpleAsyncResult *)result; + + cmp_source = g_async_result_get_source_object (result); + if (cmp_source != source) + { + g_object_unref (cmp_source); + return FALSE; + } + g_object_unref (cmp_source); + + return source_tag == g_simple_async_result_get_source_tag (simple); +} + +/** + * g_simple_async_report_error_in_idle: + * @object: a #GObject. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * @domain: a #GQuark containing the error domain (usually #G_IO_ERROR). + * @code: a specific error code. + * @format: a formatted error reporting string. + * @...: a list of variables to fill in @format. + * + * Reports an error in an asynchronous function in an idle function by + * directly setting the contents of the #GAsyncResult with the given error + * information. + **/ +void +g_simple_async_report_error_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GQuark domain, + gint code, + const char *format, + ...) +{ + GSimpleAsyncResult *simple; + va_list args; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (domain != 0); + g_return_if_fail (format != NULL); + + simple = g_simple_async_result_new (object, + callback, + user_data, NULL); + + va_start (args, format); + g_simple_async_result_set_error_va (simple, domain, code, format, args); + va_end (args); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +/** + * g_simple_async_report_gerror_in_idle: + * @object: a #GObject. + * @callback: a #GAsyncReadyCallback. + * @user_data: user data passed to @callback. + * @error: the #GError to report + * + * Reports an error in an idle function. Similar to + * g_simple_async_report_error_in_idle(), but takes a #GError rather + * than building a new one. + **/ +void +g_simple_async_report_gerror_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (error != NULL); + + simple = g_simple_async_result_new_from_error (object, + callback, + user_data, + error); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +#define __G_SIMPLE_ASYNC_RESULT_C__ +#include "gioaliasdef.c" diff --git a/gio/gsimpleasyncresult.h b/gio/gsimpleasyncresult.h new file mode 100644 index 0000000..073796c --- /dev/null +++ b/gio/gsimpleasyncresult.h @@ -0,0 +1,125 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SIMPLE_ASYNC_RESULT_H__ +#define __G_SIMPLE_ASYNC_RESULT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SIMPLE_ASYNC_RESULT (g_simple_async_result_get_type ()) +#define G_SIMPLE_ASYNC_RESULT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SIMPLE_ASYNC_RESULT, GSimpleAsyncResult)) +#define G_SIMPLE_ASYNC_RESULT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SIMPLE_ASYNC_RESULT, GSimpleAsyncResultClass)) +#define G_IS_SIMPLE_ASYNC_RESULT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SIMPLE_ASYNC_RESULT)) +#define G_IS_SIMPLE_ASYNC_RESULT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SIMPLE_ASYNC_RESULT)) +#define G_SIMPLE_ASYNC_RESULT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SIMPLE_ASYNC_RESULT, GSimpleAsyncResultClass)) + +/** + * GSimpleAsyncResult: + * + * A simple implementation of #GAsyncResult. + **/ +typedef struct _GSimpleAsyncResultClass GSimpleAsyncResultClass; + + +GType g_simple_async_result_get_type (void) G_GNUC_CONST; + +GSimpleAsyncResult *g_simple_async_result_new (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer source_tag); +GSimpleAsyncResult *g_simple_async_result_new_error (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + GQuark domain, + gint code, + const char *format, + ...) G_GNUC_PRINTF (6, 7); +GSimpleAsyncResult *g_simple_async_result_new_from_error (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error); + +void g_simple_async_result_set_op_res_gpointer (GSimpleAsyncResult *simple, + gpointer op_res, + GDestroyNotify destroy_op_res); +gpointer g_simple_async_result_get_op_res_gpointer (GSimpleAsyncResult *simple); + +void g_simple_async_result_set_op_res_gssize (GSimpleAsyncResult *simple, + gssize op_res); +gssize g_simple_async_result_get_op_res_gssize (GSimpleAsyncResult *simple); + +void g_simple_async_result_set_op_res_gboolean (GSimpleAsyncResult *simple, + gboolean op_res); +gboolean g_simple_async_result_get_op_res_gboolean (GSimpleAsyncResult *simple); + + + +gpointer g_simple_async_result_get_source_tag (GSimpleAsyncResult *simple); +void g_simple_async_result_set_handle_cancellation (GSimpleAsyncResult *simple, + gboolean handle_cancellation); +void g_simple_async_result_complete (GSimpleAsyncResult *simple); +void g_simple_async_result_complete_in_idle (GSimpleAsyncResult *simple); +void g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple, + GSimpleAsyncThreadFunc func, + int io_priority, + GCancellable *cancellable); +void g_simple_async_result_set_from_error (GSimpleAsyncResult *simple, + const GError *error); +gboolean g_simple_async_result_propagate_error (GSimpleAsyncResult *simple, + GError **dest); +void g_simple_async_result_set_error (GSimpleAsyncResult *simple, + GQuark domain, + gint code, + const char *format, + ...) G_GNUC_PRINTF (4, 5); +void g_simple_async_result_set_error_va (GSimpleAsyncResult *simple, + GQuark domain, + gint code, + const char *format, + va_list args); +gboolean g_simple_async_result_is_valid (GAsyncResult *result, + GObject *source, + gpointer source_tag); + +void g_simple_async_report_error_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GQuark domain, + gint code, + const char *format, + ...); +void g_simple_async_report_gerror_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error); + +G_END_DECLS + + + +#endif /* __G_SIMPLE_ASYNC_RESULT_H__ */ diff --git a/gio/gsocket.c b/gio/gsocket.c new file mode 100644 index 0000000..91983e4 --- /dev/null +++ b/gio/gsocket.c @@ -0,0 +1,3168 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + * Alexander Larsson + */ + +#include "config.h" +#include "glib.h" + +#include +#include +#include +#include + +#ifndef G_OS_WIN32 +# include +# include +#endif + +#ifdef HAVE_SYS_UIO_H +#include +#endif + +#include "gsocket.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "ginitable.h" +#include "gasynchelper.h" +#include "gioerror.h" +#include "gioenums.h" +#include "gioerror.h" +#include "gnetworkingprivate.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gsocket + * @short_description: Low-level socket object + * @include: gio/gio.h + * @see_also: #GInitable + * + * A #GSocket is a low-level networking primitive. It is a more or less + * direct mapping of the BSD socket API in a portable GObject based API. + * It supports both the UNIX socket implementations and winsock2 on Windows. + * + * #GSocket is the platform independent base upon which the higher level + * network primitives are based. Applications are not typically meant to + * use it directly, but rather through classes like #GSocketClient, + * #GSocketService and #GSocketConnection. However there may be cases where + * direct use of #GSocket is useful. + * + * #GSocket implements the #GInitable interface, so if it is manually constructed + * by e.g. g_object_new() you must call g_initable_init() and check the + * results before using the object. This is done automatically in + * g_socket_new() and g_socket_new_from_fd(), so these functions can return + * %NULL. + * + * Sockets operate in two general modes, blocking or non-blocking. When + * in blocking mode all operations block until the requested operation + * is finished or there is an error. In non-blocking mode all calls that + * would block return immediately with a %G_IO_ERROR_WOULD_BLOCK error. + * To know when a call would successfully run you can call g_socket_condition_check(), + * or g_socket_condition_wait(). You can also use g_socket_create_source() and + * attach it to a #GMainContext to get callbacks when I/O is possible. + * Note that all sockets are always set to non blocking mode in the system, and + * blocking mode is emulated in GSocket. + * + * When working in non-blocking mode applications should always be able to + * handle getting a %G_IO_ERROR_WOULD_BLOCK error even when some other + * function said that I/O was possible. This can easily happen in case + * of a race condition in the application, but it can also happen for other + * reasons. For instance, on Windows a socket is always seen as writable + * until a write returns %G_IO_ERROR_WOULD_BLOCK. + * + * #GSockets can be either connection oriented or datagram based. + * For connection oriented types you must first establish a connection by + * either connecting to an address or accepting a connection from another + * address. For connectionless socket types the target/source address is + * specified or received in each I/O operation. + * + * All socket file descriptors are set to be close-on-exec. + * + * Note that creating a #GSocket causes the signal %SIGPIPE to be + * ignored for the remainder of the program. If you are writing a + * command-line utility that uses #GSocket, you may need to take into + * account the fact that your program will not automatically be killed + * if it tries to write to %stdout after it has been closed. + * + * Since: 2.22 + */ + +static void g_socket_initable_iface_init (GInitableIface *iface); +static gboolean g_socket_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GSocket, g_socket, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_socket_initable_iface_init)); + +enum +{ + PROP_0, + PROP_FAMILY, + PROP_TYPE, + PROP_PROTOCOL, + PROP_FD, + PROP_BLOCKING, + PROP_LISTEN_BACKLOG, + PROP_KEEPALIVE, + PROP_LOCAL_ADDRESS, + PROP_REMOTE_ADDRESS +}; + +struct _GSocketPrivate +{ + GSocketFamily family; + GSocketType type; + GSocketProtocol protocol; + gint fd; + gint listen_backlog; + GError *construct_error; + guint inited : 1; + guint blocking : 1; + guint keepalive : 1; + guint closed : 1; + guint connected : 1; + guint listening : 1; +#ifdef G_OS_WIN32 + WSAEVENT event; + int current_events; + int current_errors; + int selected_events; + GList *requested_conditions; /* list of requested GIOCondition * */ +#endif +}; + +static int +get_socket_errno (void) +{ +#ifndef G_OS_WIN32 + return errno; +#else + return WSAGetLastError (); +#endif +} + +static GIOErrorEnum +socket_io_error_from_errno (int err) +{ +#ifndef G_OS_WIN32 + return g_io_error_from_errno (err); +#else + switch (err) + { + case WSAEADDRINUSE: + return G_IO_ERROR_ADDRESS_IN_USE; + case WSAEWOULDBLOCK: + return G_IO_ERROR_WOULD_BLOCK; + case WSAEACCES: + return G_IO_ERROR_PERMISSION_DENIED; + case WSA_INVALID_HANDLE: + case WSA_INVALID_PARAMETER: + case WSAEBADF: + case WSAENOTSOCK: + return G_IO_ERROR_INVALID_ARGUMENT; + case WSAEPROTONOSUPPORT: + return G_IO_ERROR_NOT_SUPPORTED; + case WSAECANCELLED: + return G_IO_ERROR_CANCELLED; + case WSAESOCKTNOSUPPORT: + case WSAEOPNOTSUPP: + case WSAEPFNOSUPPORT: + case WSAEAFNOSUPPORT: + return G_IO_ERROR_NOT_SUPPORTED; + default: + return G_IO_ERROR_FAILED; + } +#endif +} + +static const char * +socket_strerror (int err) +{ +#ifndef G_OS_WIN32 + return g_strerror (err); +#else + static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT; + char *buf, *msg; + + buf = g_static_private_get (&msg_private); + if (!buf) + { + buf = g_new (gchar, 128); + g_static_private_set (&msg_private, buf, g_free); + } + + msg = g_win32_error_message (err); + strncpy (buf, msg, 128); + g_free (msg); + return buf; +#endif +} + +#ifdef G_OS_WIN32 +#define win32_unset_event_mask(_socket, _mask) _win32_unset_event_mask (_socket, _mask) +static void +_win32_unset_event_mask (GSocket *socket, int mask) +{ + socket->priv->current_events &= ~mask; + socket->priv->current_errors &= ~mask; +} +#else +#define win32_unset_event_mask(_socket, _mask) +#endif + +static void +set_fd_nonblocking (int fd) +{ +#ifndef G_OS_WIN32 + glong arg; +#else + gulong arg; +#endif + +#ifndef G_OS_WIN32 + if ((arg = fcntl (fd, F_GETFL, NULL)) < 0) + { + g_warning ("Error getting socket status flags: %s", socket_strerror (errno)); + arg = 0; + } + + arg = arg | O_NONBLOCK; + + if (fcntl (fd, F_SETFL, arg) < 0) + g_warning ("Error setting socket status flags: %s", socket_strerror (errno)); +#else + arg = TRUE; + + if (ioctlsocket (fd, FIONBIO, &arg) == SOCKET_ERROR) + { + int errsv = get_socket_errno (); + g_warning ("Error setting socket status flags: %s", socket_strerror (errsv)); + } +#endif +} + +static gboolean +check_socket (GSocket *socket, + GError **error) +{ + if (!socket->priv->inited) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED, + _("Invalid socket, not initialized")); + return FALSE; + } + + if (socket->priv->construct_error) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED, + _("Invalid socket, initialization failed due to: %s"), + socket->priv->construct_error->message); + return FALSE; + } + + if (socket->priv->closed) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Socket is already closed")); + return FALSE; + } + return TRUE; +} + +static void +g_socket_details_from_fd (GSocket *socket) +{ + struct sockaddr_storage address; + gint fd; + guint addrlen; + guint optlen; + int value; + int errsv; +#ifdef G_OS_WIN32 + /* See bug #611756 */ + BOOL bool_val = FALSE; +#else + int bool_val; +#endif + + fd = socket->priv->fd; + optlen = sizeof value; + if (getsockopt (fd, SOL_SOCKET, SO_TYPE, (void *)&value, &optlen) != 0) + { + errsv = get_socket_errno (); + + switch (errsv) + { +#ifdef ENOTSOCK + case ENOTSOCK: +#endif +#ifdef WSAENOTSOCK + case WSAENOTSOCK: +#endif + case EBADF: + /* programmer error */ + g_error ("creating GSocket from fd %d: %s\n", + fd, socket_strerror (errsv)); + default: + break; + } + + goto err; + } + + g_assert (optlen == sizeof value); + switch (value) + { + case SOCK_STREAM: + socket->priv->type = G_SOCKET_TYPE_STREAM; + break; + + case SOCK_DGRAM: + socket->priv->type = G_SOCKET_TYPE_DATAGRAM; + break; + + case SOCK_SEQPACKET: + socket->priv->type = G_SOCKET_TYPE_SEQPACKET; + break; + + default: + socket->priv->type = G_SOCKET_TYPE_INVALID; + break; + } + + addrlen = sizeof address; + if (getsockname (fd, (struct sockaddr *) &address, &addrlen) != 0) + { + errsv = get_socket_errno (); + goto err; + } + + g_assert (G_STRUCT_OFFSET (struct sockaddr, sa_family) + + sizeof address.ss_family <= addrlen); + switch (address.ss_family) + { + case G_SOCKET_FAMILY_IPV4: + case G_SOCKET_FAMILY_IPV6: + case G_SOCKET_FAMILY_UNIX: + socket->priv->family = address.ss_family; + break; + + default: + socket->priv->family = G_SOCKET_FAMILY_INVALID; + break; + } + + if (socket->priv->family != G_SOCKET_FAMILY_INVALID) + { + addrlen = sizeof address; + if (getpeername (fd, (struct sockaddr *) &address, &addrlen) >= 0) + socket->priv->connected = TRUE; + } + + optlen = sizeof bool_val; + if (getsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, + (void *)&bool_val, &optlen) == 0) + { +#ifndef G_OS_WIN32 + /* Experimentation indicates that the SO_KEEPALIVE value is + * actually a char on Windows, even if documentation claims it + * to be a BOOL which is a typedef for int. So this g_assert() + * fails. See bug #611756. + */ + g_assert (optlen == sizeof bool_val); +#endif + socket->priv->keepalive = !!bool_val; + } + else + { + /* Can't read, maybe not supported, assume FALSE */ + socket->priv->keepalive = FALSE; + } + + return; + + err: + g_set_error (&socket->priv->construct_error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("creating GSocket from fd: %s"), + socket_strerror (errsv)); +} + +static gint +g_socket_create_socket (GSocketFamily family, + GSocketType type, + int protocol, + GError **error) +{ + gint native_type; + gint fd; + + switch (type) + { + case G_SOCKET_TYPE_STREAM: + native_type = SOCK_STREAM; + break; + + case G_SOCKET_TYPE_DATAGRAM: + native_type = SOCK_DGRAM; + break; + + case G_SOCKET_TYPE_SEQPACKET: + native_type = SOCK_SEQPACKET; + break; + + default: + g_assert_not_reached (); + } + + if (protocol == -1) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Unable to create socket: %s"), _("Unknown protocol was specified")); + return -1; + } + +#ifdef SOCK_CLOEXEC + native_type |= SOCK_CLOEXEC; +#endif + fd = socket (family, native_type, protocol); + + if (fd < 0) + { + int errsv = get_socket_errno (); + + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + _("Unable to create socket: %s"), socket_strerror (errsv)); + } + +#ifndef G_OS_WIN32 + { + int flags; + + /* We always want to set close-on-exec to protect users. If you + need to so some weird inheritance to exec you can re-enable this + using lower level hacks with g_socket_get_fd(). */ + flags = fcntl (fd, F_GETFD, 0); + if (flags != -1 && + (flags & FD_CLOEXEC) == 0) + { + flags |= FD_CLOEXEC; + fcntl (fd, F_SETFD, flags); + } + } +#endif + + return fd; +} + +static void +g_socket_constructed (GObject *object) +{ + GSocket *socket = G_SOCKET (object); + + if (socket->priv->fd >= 0) + /* create socket->priv info from the fd */ + g_socket_details_from_fd (socket); + + else + /* create the fd from socket->priv info */ + socket->priv->fd = g_socket_create_socket (socket->priv->family, + socket->priv->type, + socket->priv->protocol, + &socket->priv->construct_error); + + /* Always use native nonblocking sockets, as + windows sets sockets to nonblocking automatically + in certain operations. This way we make things work + the same on all platforms */ + if (socket->priv->fd != -1) + set_fd_nonblocking (socket->priv->fd); +} + +static void +g_socket_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSocket *socket = G_SOCKET (object); + GSocketAddress *address; + + switch (prop_id) + { + case PROP_FAMILY: + g_value_set_enum (value, socket->priv->family); + break; + + case PROP_TYPE: + g_value_set_enum (value, socket->priv->type); + break; + + case PROP_PROTOCOL: + g_value_set_enum (value, socket->priv->protocol); + break; + + case PROP_FD: + g_value_set_int (value, socket->priv->fd); + break; + + case PROP_BLOCKING: + g_value_set_boolean (value, socket->priv->blocking); + break; + + case PROP_LISTEN_BACKLOG: + g_value_set_int (value, socket->priv->listen_backlog); + break; + + case PROP_KEEPALIVE: + g_value_set_boolean (value, socket->priv->keepalive); + break; + + case PROP_LOCAL_ADDRESS: + address = g_socket_get_local_address (socket, NULL); + g_value_take_object (value, address); + break; + + case PROP_REMOTE_ADDRESS: + address = g_socket_get_remote_address (socket, NULL); + g_value_take_object (value, address); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSocket *socket = G_SOCKET (object); + + switch (prop_id) + { + case PROP_FAMILY: + socket->priv->family = g_value_get_enum (value); + break; + + case PROP_TYPE: + socket->priv->type = g_value_get_enum (value); + break; + + case PROP_PROTOCOL: + socket->priv->protocol = g_value_get_enum (value); + break; + + case PROP_FD: + socket->priv->fd = g_value_get_int (value); + break; + + case PROP_BLOCKING: + g_socket_set_blocking (socket, g_value_get_boolean (value)); + break; + + case PROP_LISTEN_BACKLOG: + g_socket_set_listen_backlog (socket, g_value_get_int (value)); + break; + + case PROP_KEEPALIVE: + g_socket_set_keepalive (socket, g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_finalize (GObject *object) +{ + GSocket *socket = G_SOCKET (object); + + g_clear_error (&socket->priv->construct_error); + + if (socket->priv->fd != -1 && + !socket->priv->closed) + g_socket_close (socket, NULL); + +#ifdef G_OS_WIN32 + if (socket->priv->event != WSA_INVALID_EVENT) + { + WSACloseEvent (socket->priv->event); + socket->priv->event = WSA_INVALID_EVENT; + } + + g_assert (socket->priv->requested_conditions == NULL); +#endif + + if (G_OBJECT_CLASS (g_socket_parent_class)->finalize) + (*G_OBJECT_CLASS (g_socket_parent_class)->finalize) (object); +} + +static void +g_socket_class_init (GSocketClass *klass) +{ + GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass); + volatile GType type; + + /* Make sure winsock has been initialized */ + type = g_inet_address_get_type (); + +#ifdef SIGPIPE + /* There is no portable, thread-safe way to avoid having the process + * be killed by SIGPIPE when calling send() or sendmsg(), so we are + * forced to simply ignore the signal process-wide. + */ + signal (SIGPIPE, SIG_IGN); +#endif + + g_type_class_add_private (klass, sizeof (GSocketPrivate)); + + gobject_class->finalize = g_socket_finalize; + gobject_class->constructed = g_socket_constructed; + gobject_class->set_property = g_socket_set_property; + gobject_class->get_property = g_socket_get_property; + + g_object_class_install_property (gobject_class, PROP_FAMILY, + g_param_spec_enum ("family", + P_("Socket family"), + P_("The sockets address family"), + G_TYPE_SOCKET_FAMILY, + G_SOCKET_FAMILY_INVALID, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TYPE, + g_param_spec_enum ("type", + P_("Socket type"), + P_("The sockets type"), + G_TYPE_SOCKET_TYPE, + G_SOCKET_TYPE_STREAM, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_PROTOCOL, + g_param_spec_enum ("protocol", + P_("Socket protocol"), + P_("The id of the protocol to use, or -1 for unknown"), + G_TYPE_SOCKET_PROTOCOL, + G_SOCKET_PROTOCOL_UNKNOWN, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_FD, + g_param_spec_int ("fd", + P_("File descriptor"), + P_("The sockets file descriptor"), + G_MININT, + G_MAXINT, + -1, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_BLOCKING, + g_param_spec_boolean ("blocking", + P_("blocking"), + P_("Whether or not I/O on this socket is blocking"), + TRUE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_LISTEN_BACKLOG, + g_param_spec_int ("listen-backlog", + P_("Listen backlog"), + P_("Outstanding connections in the listen queue"), + 0, + SOMAXCONN, + 10, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_KEEPALIVE, + g_param_spec_boolean ("keepalive", + P_("Keep connection alive"), + P_("Keep connection alive by sending periodic pings"), + FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS, + g_param_spec_object ("local-address", + P_("Local address"), + P_("The local address the socket is bound to"), + G_TYPE_SOCKET_ADDRESS, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_REMOTE_ADDRESS, + g_param_spec_object ("remote-address", + P_("Remote address"), + P_("The remote address the socket is connected to"), + G_TYPE_SOCKET_ADDRESS, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_socket_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_socket_initable_init; +} + +static void +g_socket_init (GSocket *socket) +{ + socket->priv = G_TYPE_INSTANCE_GET_PRIVATE (socket, G_TYPE_SOCKET, GSocketPrivate); + + socket->priv->fd = -1; + socket->priv->blocking = TRUE; + socket->priv->listen_backlog = 10; + socket->priv->construct_error = NULL; +#ifdef G_OS_WIN32 + socket->priv->event = WSA_INVALID_EVENT; +#endif +} + +static gboolean +g_socket_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GSocket *socket; + + g_return_val_if_fail (G_IS_SOCKET (initable), FALSE); + + socket = G_SOCKET (initable); + + if (cancellable != NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Cancellable initialization not supported")); + return FALSE; + } + + socket->priv->inited = TRUE; + + if (socket->priv->construct_error) + { + if (error) + *error = g_error_copy (socket->priv->construct_error); + return FALSE; + } + + + return TRUE; +} + +/** + * g_socket_new: + * @family: the socket family to use, e.g. %G_SOCKET_FAMILY_IPV4. + * @type: the socket type to use. + * @protocol: the id of the protocol to use, or 0 for default. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GSocket with the defined family, type and protocol. + * If @protocol is 0 (%G_SOCKET_PROTOCOL_DEFAULT) the default protocol type + * for the family and type is used. + * + * The @protocol is a family and type specific int that specifies what + * kind of protocol to use. #GSocketProtocol lists several common ones. + * Many families only support one protocol, and use 0 for this, others + * support several and using 0 means to use the default protocol for + * the family and type. + * + * The protocol id is passed directly to the operating + * system, so you can use protocols not listed in #GSocketProtocol if you + * know the protocol number used for it. + * + * Returns: a #GSocket or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocket * +g_socket_new (GSocketFamily family, + GSocketType type, + GSocketProtocol protocol, + GError **error) +{ + return G_SOCKET (g_initable_new (G_TYPE_SOCKET, + NULL, error, + "family", family, + "type", type, + "protocol", protocol, + NULL)); +} + +/** + * g_socket_new_from_fd: + * @fd: a native socket file descriptor. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GSocket from a native file descriptor + * or winsock SOCKET handle. + * + * This reads all the settings from the file descriptor so that + * all properties should work. Note that the file descriptor + * will be set to non-blocking mode, independent on the blocking + * mode of the #GSocket. + * + * Returns: a #GSocket or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocket * +g_socket_new_from_fd (gint fd, + GError **error) +{ + return G_SOCKET (g_initable_new (G_TYPE_SOCKET, + NULL, error, + "fd", fd, + NULL)); +} + +/** + * g_socket_set_blocking: + * @socket: a #GSocket. + * @blocking: Whether to use blocking I/O or not. + * + * Sets the blocking mode of the socket. In blocking mode + * all operations block until they succeed or there is an error. In + * non-blocking mode all functions return results immediately or + * with a %G_IO_ERROR_WOULD_BLOCK error. + * + * All sockets are created in blocking mode. However, note that the + * platform level socket is always non-blocking, and blocking mode + * is a GSocket level feature. + * + * Since: 2.22 + */ +void +g_socket_set_blocking (GSocket *socket, + gboolean blocking) +{ + g_return_if_fail (G_IS_SOCKET (socket)); + + blocking = !!blocking; + + if (socket->priv->blocking == blocking) + return; + + socket->priv->blocking = blocking; + g_object_notify (G_OBJECT (socket), "blocking"); +} + +/** + * g_socket_get_blocking: + * @socket: a #GSocket. + * + * Gets the blocking mode of the socket. For details on blocking I/O, + * see g_socket_set_blocking(). + * + * Returns: %TRUE if blocking I/O is used, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_socket_get_blocking (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + return socket->priv->blocking; +} + +/** + * g_socket_set_keepalive: + * @socket: a #GSocket. + * @keepalive: Value for the keepalive flag + * + * Sets or unsets the %SO_KEEPALIVE flag on the underlying socket. When + * this flag is set on a socket, the system will attempt to verify that the + * remote socket endpoint is still present if a sufficiently long period of + * time passes with no data being exchanged. If the system is unable to + * verify the presence of the remote endpoint, it will automatically close + * the connection. + * + * This option is only functional on certain kinds of sockets. (Notably, + * %G_SOCKET_PROTOCOL_TCP sockets.) + * + * The exact time between pings is system- and protocol-dependent, but will + * normally be at least two hours. Most commonly, you would set this flag + * on a server socket if you want to allow clients to remain idle for long + * periods of time, but also want to ensure that connections are eventually + * garbage-collected if clients crash or become unreachable. + * + * Since: 2.22 + */ +void +g_socket_set_keepalive (GSocket *socket, + gboolean keepalive) +{ + int value; + + g_return_if_fail (G_IS_SOCKET (socket)); + + keepalive = !!keepalive; + if (socket->priv->keepalive == keepalive) + return; + + value = (gint) keepalive; + if (setsockopt (socket->priv->fd, SOL_SOCKET, SO_KEEPALIVE, + (gpointer) &value, sizeof (value)) < 0) + { + int errsv = get_socket_errno (); + g_warning ("error setting keepalive: %s", socket_strerror (errsv)); + return; + } + + socket->priv->keepalive = keepalive; + g_object_notify (G_OBJECT (socket), "keepalive"); +} + +/** + * g_socket_get_keepalive: + * @socket: a #GSocket. + * + * Gets the keepalive mode of the socket. For details on this, + * see g_socket_set_keepalive(). + * + * Returns: %TRUE if keepalive is active, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_socket_get_keepalive (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + return socket->priv->keepalive; +} + +/** + * g_socket_get_listen_backlog: + * @socket: a #GSocket. + * + * Gets the listen backlog setting of the socket. For details on this, + * see g_socket_set_listen_backlog(). + * + * Returns: the maximum number of pending connections. + * + * Since: 2.22 + */ +gint +g_socket_get_listen_backlog (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + + return socket->priv->listen_backlog; +} + +/** + * g_socket_set_listen_backlog: + * @socket: a #GSocket. + * @backlog: the maximum number of pending connections. + * + * Sets the maximum number of outstanding connections allowed + * when listening on this socket. If more clients than this are + * connecting to the socket and the application is not handling them + * on time then the new connections will be refused. + * + * Note that this must be called before g_socket_listen() and has no + * effect if called after that. + * + * Since: 2.22 + */ +void +g_socket_set_listen_backlog (GSocket *socket, + gint backlog) +{ + g_return_if_fail (G_IS_SOCKET (socket)); + g_return_if_fail (!socket->priv->listening); + + if (backlog != socket->priv->listen_backlog) + { + socket->priv->listen_backlog = backlog; + g_object_notify (G_OBJECT (socket), "listen-backlog"); + } +} + +/** + * g_socket_get_family: + * @socket: a #GSocket. + * + * Gets the socket family of the socket. + * + * Returns: a #GSocketFamily + * + * Since: 2.22 + */ +GSocketFamily +g_socket_get_family (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), G_SOCKET_FAMILY_INVALID); + + return socket->priv->family; +} + +/** + * g_socket_get_socket_type: + * @socket: a #GSocket. + * + * Gets the socket type of the socket. + * + * Returns: a #GSocketType + * + * Since: 2.22 + */ +GSocketType +g_socket_get_socket_type (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), G_SOCKET_TYPE_INVALID); + + return socket->priv->type; +} + +/** + * g_socket_get_protocol: + * @socket: a #GSocket. + * + * Gets the socket protocol id the socket was created with. + * In case the protocol is unknown, -1 is returned. + * + * Returns: a protocol id, or -1 if unknown + * + * Since: 2.22 + */ +GSocketProtocol +g_socket_get_protocol (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), -1); + + return socket->priv->protocol; +} + +/** + * g_socket_get_fd: + * @socket: a #GSocket. + * + * Returns the underlying OS socket object. On unix this + * is a socket file descriptor, and on windows this is + * a Winsock2 SOCKET handle. This may be useful for + * doing platform specific or otherwise unusual operations + * on the socket. + * + * Returns: the file descriptor of the socket. + * + * Since: 2.22 + */ +int +g_socket_get_fd (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), -1); + + return socket->priv->fd; +} + +/** + * g_socket_get_local_address: + * @socket: a #GSocket. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Try to get the local address of a bound socket. This is only + * useful if the socket has been bound to a local address, + * either explicitly or implicitly when connecting. + * + * Returns: a #GSocketAddress or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocketAddress * +g_socket_get_local_address (GSocket *socket, + GError **error) +{ + struct sockaddr_storage buffer; + guint32 len = sizeof (buffer); + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + + if (getsockname (socket->priv->fd, (struct sockaddr *) &buffer, &len) < 0) + { + int errsv = get_socket_errno (); + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + _("could not get local address: %s"), socket_strerror (errsv)); + return NULL; + } + + return g_socket_address_new_from_native (&buffer, len); +} + +/** + * g_socket_get_remote_address: + * @socket: a #GSocket. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Try to get the remove address of a connected socket. This is only + * useful for connection oriented sockets that have been connected. + * + * Returns: a #GSocketAddress or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocketAddress * +g_socket_get_remote_address (GSocket *socket, + GError **error) +{ + struct sockaddr_storage buffer; + guint32 len = sizeof (buffer); + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + + if (getpeername (socket->priv->fd, (struct sockaddr *) &buffer, &len) < 0) + { + int errsv = get_socket_errno (); + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + _("could not get remote address: %s"), socket_strerror (errsv)); + return NULL; + } + + return g_socket_address_new_from_native (&buffer, len); +} + +/** + * g_socket_is_connected: + * @socket: a #GSocket. + * + * Check whether the socket is connected. This is only useful for + * connection-oriented sockets. + * + * Returns: %TRUE if socket is connected, %FALSE otherwise. + * + * Since: 2.22 + */ +gboolean +g_socket_is_connected (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + return socket->priv->connected; +} + +/** + * g_socket_listen: + * @socket: a #GSocket. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Marks the socket as a server socket, i.e. a socket that is used + * to accept incoming requests using g_socket_accept(). + * + * Before calling this the socket must be bound to a local address using + * g_socket_bind(). + * + * To set the maximum amount of outstanding clients, use + * g_socket_set_listen_backlog(). + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.22 + */ +gboolean +g_socket_listen (GSocket *socket, + GError **error) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + if (!check_socket (socket, error)) + return FALSE; + + if (listen (socket->priv->fd, socket->priv->listen_backlog) < 0) + { + int errsv = get_socket_errno (); + + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + _("could not listen: %s"), socket_strerror (errsv)); + return FALSE; + } + + socket->priv->listening = TRUE; + + return TRUE; +} + +/** + * g_socket_bind: + * @socket: a #GSocket. + * @address: a #GSocketAddress specifying the local address. + * @allow_reuse: whether to allow reusing this address + * @error: #GError for error reporting, or %NULL to ignore. + * + * When a socket is created it is attached to an address family, but it + * doesn't have an address in this family. g_socket_bind() assigns the + * address (sometimes called name) of the socket. + * + * It is generally required to bind to a local address before you can + * receive connections. (See g_socket_listen() and g_socket_accept() ). + * In certain situations, you may also want to bind a socket that will be + * used to initiate connections, though this is not normally required. + * + * @allow_reuse should be %TRUE for server sockets (sockets that you will + * eventually call g_socket_accept() on), and %FALSE for client sockets. + * (Specifically, if it is %TRUE, then g_socket_bind() will set the + * %SO_REUSEADDR flag on the socket, allowing it to bind @address even if + * that address was previously used by another socket that has not yet been + * fully cleaned-up by the kernel. Failing to set this flag on a server + * socket may cause the bind call to return %G_IO_ERROR_ADDRESS_IN_USE if + * the server program is stopped and then immediately restarted.) + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.22 + */ +gboolean +g_socket_bind (GSocket *socket, + GSocketAddress *address, + gboolean reuse_address, + GError **error) +{ + struct sockaddr_storage addr; + + g_return_val_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address), FALSE); + + if (!check_socket (socket, error)) + return FALSE; + + /* SO_REUSEADDR on windows means something else and is not what we want. + It always allows the unix variant of SO_REUSEADDR anyway */ +#ifndef G_OS_WIN32 + { + int value; + + value = (int) !!reuse_address; + /* Ignore errors here, the only likely error is "not supported", and + this is a "best effort" thing mainly */ + setsockopt (socket->priv->fd, SOL_SOCKET, SO_REUSEADDR, + (gpointer) &value, sizeof (value)); + } +#endif + + if (!g_socket_address_to_native (address, &addr, sizeof addr, error)) + return FALSE; + + if (bind (socket->priv->fd, (struct sockaddr *) &addr, + g_socket_address_get_native_size (address)) < 0) + { + int errsv = get_socket_errno (); + g_set_error (error, + G_IO_ERROR, socket_io_error_from_errno (errsv), + _("Error binding to address: %s"), socket_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + +/** + * g_socket_speaks_ipv4: + * @socket: a #GSocket + * + * Checks if a socket is capable of speaking IPv4. + * + * IPv4 sockets are capable of speaking IPv4. On some operating systems + * and under some combinations of circumstances IPv6 sockets are also + * capable of speaking IPv4. See RFC 3493 section 3.7 for more + * information. + * + * No other types of sockets are currently considered as being capable + * of speaking IPv4. + * + * Returns: %TRUE if this socket can be used with IPv4. + * + * Since: 2.22 + **/ +gboolean +g_socket_speaks_ipv4 (GSocket *socket) +{ + switch (socket->priv->family) + { + case G_SOCKET_FAMILY_IPV4: + return TRUE; + + case G_SOCKET_FAMILY_IPV6: +#if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY) + { + guint sizeof_int = sizeof (int); + gint v6_only; + + if (getsockopt (socket->priv->fd, + IPPROTO_IPV6, IPV6_V6ONLY, + &v6_only, &sizeof_int) != 0) + return FALSE; + + return !v6_only; + } +#else + return FALSE; +#endif + + default: + return FALSE; + } +} + +/** + * g_socket_accept: + * @socket: a #GSocket. + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Accept incoming connections on a connection-based socket. This removes + * the first outstanding connection request from the listening socket and + * creates a #GSocket object for it. + * + * The @socket must be bound to a local address with g_socket_bind() and + * must be listening for incoming connections (g_socket_listen()). + * + * If there are no outstanding connections then the operation will block + * or return %G_IO_ERROR_WOULD_BLOCK if non-blocking I/O is enabled. + * To be notified of an incoming connection, wait for the %G_IO_IN condition. + * + * Returns: a new #GSocket, or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocket * +g_socket_accept (GSocket *socket, + GCancellable *cancellable, + GError **error) +{ + GSocket *new_socket; + gint ret; + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + + if (!check_socket (socket, error)) + return NULL; + + while (TRUE) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_IN, cancellable, error)) + return NULL; + + if ((ret = accept (socket->priv->fd, NULL, 0)) < 0) + { + int errsv = get_socket_errno (); + + win32_unset_event_mask (socket, FD_ACCEPT); + + if (errsv == EINTR) + continue; + + if (socket->priv->blocking) + { +#ifdef WSAEWOULDBLOCK + if (errsv == WSAEWOULDBLOCK) + continue; +#else + if (errsv == EWOULDBLOCK || + errsv == EAGAIN) + continue; +#endif + } + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error accepting connection: %s"), socket_strerror (errsv)); + return NULL; + } + break; + } + + win32_unset_event_mask (socket, FD_ACCEPT); + +#ifdef G_OS_WIN32 + { + /* The socket inherits the accepting sockets event mask and even object, + we need to remove that */ + WSAEventSelect (ret, NULL, 0); + } +#else + { + int flags; + + /* We always want to set close-on-exec to protect users. If you + need to so some weird inheritance to exec you can re-enable this + using lower level hacks with g_socket_get_fd(). */ + flags = fcntl (ret, F_GETFD, 0); + if (flags != -1 && + (flags & FD_CLOEXEC) == 0) + { + flags |= FD_CLOEXEC; + fcntl (ret, F_SETFD, flags); + } + } +#endif + + new_socket = g_socket_new_from_fd (ret, error); + if (new_socket == NULL) + { +#ifdef G_OS_WIN32 + closesocket (ret); +#else + close (ret); +#endif + } + else + new_socket->priv->protocol = socket->priv->protocol; + + return new_socket; +} + +/** + * g_socket_connect: + * @socket: a #GSocket. + * @address: a #GSocketAddress specifying the remote address. + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Connect the socket to the specified remote address. + * + * For connection oriented socket this generally means we attempt to make + * a connection to the @address. For a connection-less socket it sets + * the default address for g_socket_send() and discards all incoming datagrams + * from other sources. + * + * Generally connection oriented sockets can only connect once, but + * connection-less sockets can connect multiple times to change the + * default address. + * + * If the connect call needs to do network I/O it will block, unless + * non-blocking I/O is enabled. Then %G_IO_ERROR_PENDING is returned + * and the user can be notified of the connection finishing by waiting + * for the G_IO_OUT condition. The result of the connection can then be + * checked with g_socket_check_connect_result(). + * + * Returns: %TRUE if connected, %FALSE on error. + * + * Since: 2.22 + */ +gboolean +g_socket_connect (GSocket *socket, + GSocketAddress *address, + GCancellable *cancellable, + GError **error) +{ + struct sockaddr_storage buffer; + + g_return_val_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address), FALSE); + + if (!check_socket (socket, error)) + return FALSE; + + if (!g_socket_address_to_native (address, &buffer, sizeof buffer, error)) + return FALSE; + + while (1) + { + if (connect (socket->priv->fd, (struct sockaddr *) &buffer, + g_socket_address_get_native_size (address)) < 0) + { + int errsv = get_socket_errno (); + + if (errsv == EINTR) + continue; + +#ifndef G_OS_WIN32 + if (errsv == EINPROGRESS) +#else + if (errsv == WSAEWOULDBLOCK) +#endif + { + if (socket->priv->blocking) + { + if (g_socket_condition_wait (socket, G_IO_OUT, cancellable, error)) + { + if (g_socket_check_connect_result (socket, error)) + break; + } + g_prefix_error (error, _("Error connecting: ")); + } + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + _("Connection in progress")); + } + else + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error connecting: %s"), socket_strerror (errsv)); + + return FALSE; + } + break; + } + + win32_unset_event_mask (socket, FD_CONNECT); + + socket->priv->connected = TRUE; + + return TRUE; +} + +/** + * g_socket_check_connect_result: + * @socket: a #GSocket + * @error: #GError for error reporting, or %NULL to ignore. + * + * Checks and resets the pending connect error for the socket. + * This is used to check for errors when g_socket_connect() is + * used in non-blocking mode. + * + * Returns: %TRUE if no error, %FALSE otherwise, setting @error to the error + * + * Since: 2.22 + */ +gboolean +g_socket_check_connect_result (GSocket *socket, + GError **error) +{ + guint optlen; + int value; + + optlen = sizeof (value); + if (getsockopt (socket->priv->fd, SOL_SOCKET, SO_ERROR, (void *)&value, &optlen) != 0) + { + int errsv = get_socket_errno (); + + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + _("Unable to get pending error: %s"), socket_strerror (errsv)); + return FALSE; + } + + if (value != 0) + { + g_set_error_literal (error, G_IO_ERROR, socket_io_error_from_errno (value), + socket_strerror (value)); + return FALSE; + } + return TRUE; +} + +/** + * g_socket_receive: + * @socket: a #GSocket + * @buffer: a buffer to read data into (which should be at least @size + * bytes long). + * @size: the number of bytes you want to read from the socket + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Receive data (up to @size bytes) from a socket. This is mainly used by + * connection-oriented sockets; it is identical to g_socket_receive_from() + * with @address set to %NULL. + * + * For %G_SOCKET_TYPE_DATAGRAM and %G_SOCKET_TYPE_SEQPACKET sockets, + * g_socket_receive() will always read either 0 or 1 complete messages from + * the socket. If the received message is too large to fit in @buffer, then + * the data beyond @size bytes will be discarded, without any explicit + * indication that this has occurred. + * + * For %G_SOCKET_TYPE_STREAM sockets, g_socket_receive() can return any + * number of bytes, up to @size. If more than @size bytes have been + * received, the additional data will be returned in future calls to + * g_socket_receive(). + * + * If the socket is in blocking mode the call will block until there is + * some data to receive or there is an error. If there is no data available + * and the socket is in non-blocking mode, a %G_IO_ERROR_WOULD_BLOCK error + * will be returned. To be notified when data is available, wait for the + * %G_IO_IN condition. + * + * On error -1 is returned and @error is set accordingly. + * + * Returns: Number of bytes read, or -1 on error + * + * Since: 2.22 + */ +gssize +g_socket_receive (GSocket *socket, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error) +{ + gssize ret; + + g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, FALSE); + + if (!check_socket (socket, error)) + return -1; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + while (1) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_IN, cancellable, error)) + return -1; + + if ((ret = recv (socket->priv->fd, buffer, size, 0)) < 0) + { + int errsv = get_socket_errno (); + + if (errsv == EINTR) + continue; + + if (socket->priv->blocking) + { +#ifdef WSAEWOULDBLOCK + if (errsv == WSAEWOULDBLOCK) + continue; +#else + if (errsv == EWOULDBLOCK || + errsv == EAGAIN) + continue; +#endif + } + + win32_unset_event_mask (socket, FD_READ); + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error receiving data: %s"), socket_strerror (errsv)); + return -1; + } + + win32_unset_event_mask (socket, FD_READ); + + break; + } + + return ret; +} + +/** + * g_socket_receive_from: + * @socket: a #GSocket + * @address: a pointer to a #GSocketAddress pointer, or %NULL + * @buffer: a buffer to read data into (which should be at least @size + * bytes long). + * @size: the number of bytes you want to read from the socket + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Receive data (up to @size bytes) from a socket. + * + * If @address is non-%NULL then @address will be set equal to the + * source address of the received packet. + * @address is owned by the caller. + * + * See g_socket_receive() for additional information. + * + * Returns: Number of bytes read, or -1 on error + * + * Since: 2.22 + */ +gssize +g_socket_receive_from (GSocket *socket, + GSocketAddress **address, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error) +{ + GInputVector v; + + v.buffer = buffer; + v.size = size; + + return g_socket_receive_message (socket, + address, + &v, 1, + NULL, 0, NULL, + cancellable, + error); +} + +/* Although we ignore SIGPIPE, gdb will still stop if the app receives + * one, which can be confusing and annoying. So if possible, we want + * to suppress the signal entirely. + */ +#ifdef MSG_NOSIGNAL +#define G_SOCKET_DEFAULT_SEND_FLAGS MSG_NOSIGNAL +#else +#define G_SOCKET_DEFAULT_SEND_FLAGS 0 +#endif + +/** + * g_socket_send: + * @socket: a #GSocket + * @buffer: the buffer containing the data to send. + * @size: the number of bytes to send + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Tries to send @size bytes from @buffer on the socket. This is + * mainly used by connection-oriented sockets; it is identical to + * g_socket_send_to() with @address set to %NULL. + * + * If the socket is in blocking mode the call will block until there is + * space for the data in the socket queue. If there is no space available + * and the socket is in non-blocking mode a %G_IO_ERROR_WOULD_BLOCK error + * will be returned. To be notified when space is available, wait for the + * %G_IO_OUT condition. Note though that you may still receive + * %G_IO_ERROR_WOULD_BLOCK from g_socket_send() even if you were previously + * notified of a %G_IO_OUT condition. (On Windows in particular, this is + * very common due to the way the underlying APIs work.) + * + * On error -1 is returned and @error is set accordingly. + * + * Returns: Number of bytes written (which may be less than @size), or -1 + * on error + * + * Since: 2.22 + */ +gssize +g_socket_send (GSocket *socket, + const gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error) +{ + gssize ret; + + g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, FALSE); + + if (!check_socket (socket, error)) + return -1; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + while (1) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_OUT, cancellable, error)) + return -1; + + if ((ret = send (socket->priv->fd, buffer, size, G_SOCKET_DEFAULT_SEND_FLAGS)) < 0) + { + int errsv = get_socket_errno (); + + if (errsv == EINTR) + continue; + +#ifdef WSAEWOULDBLOCK + if (errsv == WSAEWOULDBLOCK) + win32_unset_event_mask (socket, FD_WRITE); +#endif + + if (socket->priv->blocking) + { +#ifdef WSAEWOULDBLOCK + if (errsv == WSAEWOULDBLOCK) + continue; +#else + if (errsv == EWOULDBLOCK || + errsv == EAGAIN) + continue; +#endif + } + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error sending data: %s"), socket_strerror (errsv)); + return -1; + } + break; + } + + return ret; +} + +/** + * g_socket_send_to: + * @socket: a #GSocket + * @address: a #GSocketAddress, or %NULL + * @buffer: the buffer containing the data to send. + * @size: the number of bytes to send + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Tries to send @size bytes from @buffer to @address. If @address is + * %NULL then the message is sent to the default receiver (set by + * g_socket_connect()). + * + * See g_socket_send() for additional information. + * + * Returns: Number of bytes written (which may be less than @size), or -1 + * on error + * + * Since: 2.22 + */ +gssize +g_socket_send_to (GSocket *socket, + GSocketAddress *address, + const gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error) +{ + GOutputVector v; + + v.buffer = buffer; + v.size = size; + + return g_socket_send_message (socket, + address, + &v, 1, + NULL, 0, + 0, + cancellable, + error); +} + +/** + * g_socket_shutdown: + * @socket: a #GSocket + * @shutdown_read: whether to shut down the read side + * @shutdown_write: whether to shut down the write side + * @error: #GError for error reporting, or %NULL to ignore. + * + * Shut down part of a full-duplex connection. + * + * If @shutdown_read is %TRUE then the recieving side of the connection + * is shut down, and further reading is disallowed. + * + * If @shutdown_write is %TRUE then the sending side of the connection + * is shut down, and further writing is disallowed. + * + * It is allowed for both @shutdown_read and @shutdown_write to be %TRUE. + * + * One example where this is used is graceful disconnect for TCP connections + * where you close the sending side, then wait for the other side to close + * the connection, thus ensuring that the other side saw all sent data. + * + * Returns: %TRUE on success, %FALSE on error + * + * Since: 2.22 + */ +gboolean +g_socket_shutdown (GSocket *socket, + gboolean shutdown_read, + gboolean shutdown_write, + GError **error) +{ + int how; + + g_return_val_if_fail (G_IS_SOCKET (socket), TRUE); + + if (!check_socket (socket, NULL)) + return FALSE; + + /* Do nothing? */ + if (!shutdown_read && !shutdown_write) + return TRUE; + +#ifndef G_OS_WIN32 + if (shutdown_read && shutdown_write) + how = SHUT_RDWR; + else if (shutdown_read) + how = SHUT_RD; + else + how = SHUT_WR; +#else + if (shutdown_read && shutdown_write) + how = SD_BOTH; + else if (shutdown_read) + how = SD_RECEIVE; + else + how = SD_SEND; +#endif + + if (shutdown (socket->priv->fd, how) != 0) + { + int errsv = get_socket_errno (); + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + _("Unable to create socket: %s"), socket_strerror (errsv)); + return FALSE; + } + + if (shutdown_read && shutdown_write) + socket->priv->connected = FALSE; + + return TRUE; +} + +/** + * g_socket_close: + * @socket: a #GSocket + * @error: #GError for error reporting, or %NULL to ignore. + * + * Closes the socket, shutting down any active connection. + * + * Closing a socket does not wait for all outstanding I/O operations + * to finish, so the caller should not rely on them to be guaranteed + * to complete even if the close returns with no error. + * + * Once the socket is closed, all other operations will return + * %G_IO_ERROR_CLOSED. Closing a socket multiple times will not + * return an error. + * + * Sockets will be automatically closed when the last reference + * is dropped, but you might want to call this function to make sure + * resources are released as early as possible. + * + * Beware that due to the way that TCP works, it is possible for + * recently-sent data to be lost if either you close a socket while the + * %G_IO_IN condition is set, or else if the remote connection tries to + * send something to you after you close the socket but before it has + * finished reading all of the data you sent. There is no easy generic + * way to avoid this problem; the easiest fix is to design the network + * protocol such that the client will never send data "out of turn". + * Another solution is for the server to half-close the connection by + * calling g_socket_shutdown() with only the @shutdown_write flag set, + * and then wait for the client to notice this and close its side of the + * connection, after which the server can safely call g_socket_close(). + * (This is what #GTcpConnection does if you call + * g_tcp_connection_set_graceful_disconnect(). But of course, this + * only works if the client will close its connection after the server + * does.) + * + * Returns: %TRUE on success, %FALSE on error + * + * Since: 2.22 + */ +gboolean +g_socket_close (GSocket *socket, + GError **error) +{ + int res; + + g_return_val_if_fail (G_IS_SOCKET (socket), TRUE); + + if (socket->priv->closed) + return TRUE; /* Multiple close not an error */ + + if (!check_socket (socket, NULL)) + return FALSE; + + while (1) + { +#ifdef G_OS_WIN32 + res = closesocket (socket->priv->fd); +#else + res = close (socket->priv->fd); +#endif + if (res == -1) + { + int errsv = get_socket_errno (); + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error closing socket: %s"), + socket_strerror (errsv)); + return FALSE; + } + break; + } + + socket->priv->connected = FALSE; + socket->priv->closed = TRUE; + + return TRUE; +} + +/** + * g_socket_is_closed: + * @socket: a #GSocket + * + * Checks whether a socket is closed. + * + * Returns: %TRUE if socket is closed, %FALSE otherwise + * + * Since: 2.22 + */ +gboolean +g_socket_is_closed (GSocket *socket) +{ + return socket->priv->closed; +} + +#ifdef G_OS_WIN32 +/* Broken source, used on errors */ +static gboolean +broken_prepare (GSource *source, + gint *timeout) +{ + return FALSE; +} + +static gboolean +broken_check (GSource *source) +{ + return FALSE; +} + +static gboolean +broken_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + return TRUE; +} + +static GSourceFuncs broken_funcs = +{ + broken_prepare, + broken_check, + broken_dispatch, + NULL +}; + +static gint +network_events_for_condition (GIOCondition condition) +{ + int event_mask = 0; + + if (condition & G_IO_IN) + event_mask |= (FD_READ | FD_ACCEPT); + if (condition & G_IO_OUT) + event_mask |= (FD_WRITE | FD_CONNECT); + event_mask |= FD_CLOSE; + + return event_mask; +} + +static void +ensure_event (GSocket *socket) +{ + if (socket->priv->event == WSA_INVALID_EVENT) + socket->priv->event = WSACreateEvent(); +} + +static void +update_select_events (GSocket *socket) +{ + int event_mask; + GIOCondition *ptr; + GList *l; + WSAEVENT event; + + ensure_event (socket); + + event_mask = 0; + for (l = socket->priv->requested_conditions; l != NULL; l = l->next) + { + ptr = l->data; + event_mask |= network_events_for_condition (*ptr); + } + + if (event_mask != socket->priv->selected_events) + { + /* If no events selected, disable event so we can unset + nonblocking mode */ + + if (event_mask == 0) + event = NULL; + else + event = socket->priv->event; + + if (WSAEventSelect (socket->priv->fd, event, event_mask) == 0) + socket->priv->selected_events = event_mask; + } +} + +static void +add_condition_watch (GSocket *socket, + GIOCondition *condition) +{ + g_assert (g_list_find (socket->priv->requested_conditions, condition) == NULL); + + socket->priv->requested_conditions = + g_list_prepend (socket->priv->requested_conditions, condition); + + update_select_events (socket); +} + +static void +remove_condition_watch (GSocket *socket, + GIOCondition *condition) +{ + g_assert (g_list_find (socket->priv->requested_conditions, condition) != NULL); + + socket->priv->requested_conditions = + g_list_remove (socket->priv->requested_conditions, condition); + + update_select_events (socket); +} + +static GIOCondition +update_condition (GSocket *socket) +{ + WSANETWORKEVENTS events; + GIOCondition condition; + + if (WSAEnumNetworkEvents (socket->priv->fd, + socket->priv->event, + &events) == 0) + { + socket->priv->current_events |= events.lNetworkEvents; + if (events.lNetworkEvents & FD_WRITE && + events.iErrorCode[FD_WRITE_BIT] != 0) + socket->priv->current_errors |= FD_WRITE; + if (events.lNetworkEvents & FD_CONNECT && + events.iErrorCode[FD_CONNECT_BIT] != 0) + socket->priv->current_errors |= FD_CONNECT; + } + + condition = 0; + if (socket->priv->current_events & (FD_READ | FD_ACCEPT)) + condition |= G_IO_IN; + + if (socket->priv->current_events & FD_CLOSE || + socket->priv->closed) + condition |= G_IO_HUP; + + /* Never report both G_IO_OUT and HUP, these are + mutually exclusive (can't write to a closed socket) */ + if ((condition & G_IO_HUP) == 0 && + socket->priv->current_events & FD_WRITE) + { + if (socket->priv->current_errors & FD_WRITE) + condition |= G_IO_ERR; + else + condition |= G_IO_OUT; + } + else + { + if (socket->priv->current_events & FD_CONNECT) + { + if (socket->priv->current_errors & FD_CONNECT) + condition |= (G_IO_HUP | G_IO_ERR); + else + condition |= G_IO_OUT; + } + } + + return condition; +} + +typedef struct { + GSource source; + GPollFD pollfd; + GSocket *socket; + GIOCondition condition; + GCancellable *cancellable; + GPollFD cancel_pollfd; + GIOCondition result_condition; +} GWinsockSource; + +static gboolean +winsock_prepare (GSource *source, + gint *timeout) +{ + GWinsockSource *winsock_source = (GWinsockSource *)source; + GIOCondition current_condition; + + current_condition = update_condition (winsock_source->socket); + + if (g_cancellable_is_cancelled (winsock_source->cancellable)) + { + winsock_source->result_condition = current_condition; + return TRUE; + } + + if ((winsock_source->condition & current_condition) != 0) + { + winsock_source->result_condition = current_condition; + return TRUE; + } + + return FALSE; +} + +static gboolean +winsock_check (GSource *source) +{ + GWinsockSource *winsock_source = (GWinsockSource *)source; + GIOCondition current_condition; + + current_condition = update_condition (winsock_source->socket); + + if (g_cancellable_is_cancelled (winsock_source->cancellable)) + { + winsock_source->result_condition = current_condition; + return TRUE; + } + + if ((winsock_source->condition & current_condition) != 0) + { + winsock_source->result_condition = current_condition; + return TRUE; + } + + return FALSE; +} + +static gboolean +winsock_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GSocketSourceFunc func = (GSocketSourceFunc)callback; + GWinsockSource *winsock_source = (GWinsockSource *)source; + + return (*func) (winsock_source->socket, + winsock_source->result_condition & winsock_source->condition, + user_data); +} + +static void +winsock_finalize (GSource *source) +{ + GWinsockSource *winsock_source = (GWinsockSource *)source; + GSocket *socket; + + socket = winsock_source->socket; + + remove_condition_watch (socket, &winsock_source->condition); + g_object_unref (socket); + + if (winsock_source->cancellable) + { + g_cancellable_release_fd (winsock_source->cancellable); + g_object_unref (winsock_source->cancellable); + } +} + +static GSourceFuncs winsock_funcs = +{ + winsock_prepare, + winsock_check, + winsock_dispatch, + winsock_finalize +}; + +static GSource * +winsock_source_new (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable) +{ + GSource *source; + GWinsockSource *winsock_source; + + ensure_event (socket); + + if (socket->priv->event == WSA_INVALID_EVENT) + { + g_warning ("Failed to create WSAEvent"); + return g_source_new (&broken_funcs, sizeof (GSource)); + } + + condition |= G_IO_HUP | G_IO_ERR; + + source = g_source_new (&winsock_funcs, sizeof (GWinsockSource)); + winsock_source = (GWinsockSource *)source; + + winsock_source->socket = g_object_ref (socket); + winsock_source->condition = condition; + add_condition_watch (socket, &winsock_source->condition); + + if (g_cancellable_make_pollfd (cancellable, + &winsock_source->cancel_pollfd)) + { + winsock_source->cancellable = g_object_ref (cancellable); + g_source_add_poll (source, &winsock_source->cancel_pollfd); + } + + winsock_source->pollfd.fd = (gintptr) socket->priv->event; + winsock_source->pollfd.events = condition; + g_source_add_poll (source, &winsock_source->pollfd); + + return source; +} +#endif + +/** + * g_socket_create_source: + * @socket: a #GSocket + * @condition: a #GIOCondition mask to monitor + * @cancellable: a %GCancellable or %NULL + * + * Creates a %GSource that can be attached to a %GMainContext to monitor + * for the availibility of the specified @condition on the socket. + * + * The callback on the source is of the #GSocketSourceFunc type. + * + * It is meaningless to specify %G_IO_ERR or %G_IO_HUP in condition; + * these conditions will always be reported output if they are true. + * + * @cancellable if not %NULL can be used to cancel the source, which will + * cause the source to trigger, reporting the current condition (which + * is likely 0 unless cancellation happened at the same time as a + * condition change). You can check for this in the callback using + * g_cancellable_is_cancelled(). + * + * Returns: a newly allocated %GSource, free with g_source_unref(). + * + * Since: 2.22 + */ +GSource * +g_socket_create_source (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable) +{ + GSource *source; + g_return_val_if_fail (G_IS_SOCKET (socket) && (cancellable == NULL || G_IS_CANCELLABLE (cancellable)), NULL); + +#ifdef G_OS_WIN32 + source = winsock_source_new (socket, condition, cancellable); +#else + source =_g_fd_source_new_with_object (G_OBJECT (socket), socket->priv->fd, + condition, cancellable); +#endif + return source; +} + +/** + * g_socket_condition_check: + * @socket: a #GSocket + * @condition: a #GIOCondition mask to check + * + * Checks on the readiness of @socket to perform operations. + * The operations specified in @condition are checked for and masked + * against the currently-satisfied conditions on @socket. The result + * is returned. + * + * It is meaningless to specify %G_IO_ERR or %G_IO_HUP in condition; + * these conditions will always be set in the output if they are true. + * + * This call never blocks. + * + * Returns: the @GIOCondition mask of the current state + * + * Since: 2.22 + */ +GIOCondition +g_socket_condition_check (GSocket *socket, + GIOCondition condition) +{ + if (!check_socket (socket, NULL)) + return 0; + +#ifdef G_OS_WIN32 + { + GIOCondition current_condition; + + condition |= G_IO_ERR | G_IO_HUP; + + add_condition_watch (socket, &condition); + current_condition = update_condition (socket); + remove_condition_watch (socket, &condition); + return condition & current_condition; + } +#else + { + GPollFD poll_fd; + gint result; + poll_fd.fd = socket->priv->fd; + poll_fd.events = condition; + + do + result = g_poll (&poll_fd, 1, 0); + while (result == -1 && get_socket_errno () == EINTR); + + return poll_fd.revents; + } +#endif +} + +/** + * g_socket_condition_wait: + * @socket: a #GSocket + * @condition: a #GIOCondition mask to wait for + * @cancellable: a #GCancellable, or %NULL + * @error: a #GError pointer, or %NULL + * + * Waits for @condition to become true on @socket. When the condition + * is met, %TRUE is returned. + * + * If @cancellable is cancelled before the condition is met then %FALSE + * is returned and @error, if non-%NULL, is set to %G_IO_ERROR_CANCELLED. + * + * Returns: %TRUE if the condition was met, %FALSE otherwise + * + * Since: 2.22 + */ +gboolean +g_socket_condition_wait (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable, + GError **error) +{ + if (!check_socket (socket, error)) + return FALSE; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + +#ifdef G_OS_WIN32 + { + GIOCondition current_condition; + WSAEVENT events[2]; + DWORD res; + GPollFD cancel_fd; + int num_events; + + /* Always check these */ + condition |= G_IO_ERR | G_IO_HUP; + + add_condition_watch (socket, &condition); + + num_events = 0; + events[num_events++] = socket->priv->event; + + if (g_cancellable_make_pollfd (cancellable, &cancel_fd)) + events[num_events++] = (WSAEVENT)cancel_fd.fd; + + current_condition = update_condition (socket); + while ((condition & current_condition) == 0) + { + res = WSAWaitForMultipleEvents(num_events, events, + FALSE, WSA_INFINITE, FALSE); + if (res == WSA_WAIT_FAILED) + { + int errsv = get_socket_errno (); + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Waiting for socket condition: %s"), + socket_strerror (errsv)); + break; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + break; + + current_condition = update_condition (socket); + } + remove_condition_watch (socket, &condition); + if (num_events > 1) + g_cancellable_release_fd (cancellable); + + return (condition & current_condition) != 0; + } +#else + { + GPollFD poll_fd[2]; + gint result; + gint num; + + poll_fd[0].fd = socket->priv->fd; + poll_fd[0].events = condition; + num = 1; + + if (g_cancellable_make_pollfd (cancellable, &poll_fd[1])) + num++; + + do + result = g_poll (poll_fd, num, -1); + while (result == -1 && get_socket_errno () == EINTR); + + if (num > 1) + g_cancellable_release_fd (cancellable); + + return cancellable == NULL || + !g_cancellable_set_error_if_cancelled (cancellable, error); + } + #endif +} + +/** + * g_socket_send_message: + * @socket: a #GSocket + * @address: a #GSocketAddress, or %NULL + * @vectors: an array of #GOutputVector structs + * @num_vectors: the number of elements in @vectors, or -1 + * @messages: a pointer to an array of #GSocketControlMessages, or + * %NULL. + * @num_messages: number of elements in @messages, or -1. + * @flags: an int containing #GSocketMsgFlags flags + * @cancellable: a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Send data to @address on @socket. This is the most complicated and + * fully-featured version of this call. For easier use, see + * g_socket_send() and g_socket_send_to(). + * + * If @address is %NULL then the message is sent to the default receiver + * (set by g_socket_connect()). + * + * @vectors must point to an array of #GOutputVector structs and + * @num_vectors must be the length of this array. (If @num_vectors is -1, + * then @vectors is assumed to be terminated by a #GOutputVector with a + * %NULL buffer pointer.) The #GOutputVector structs describe the buffers + * that the sent data will be gathered from. Using multiple + * #GOutputVectors is more memory-efficient than manually copying + * data from multiple sources into a single buffer, and more + * network-efficient than making multiple calls to g_socket_send(). + * + * @messages, if non-%NULL, is taken to point to an array of @num_messages + * #GSocketControlMessage instances. These correspond to the control + * messages to be sent on the socket. + * If @num_messages is -1 then @messages is treated as a %NULL-terminated + * array. + * + * @flags modify how the message is sent. The commonly available arguments + * for this are available in the #GSocketMsgFlags enum, but the + * values there are the same as the system values, and the flags + * are passed in as-is, so you can pass in system-specific flags too. + * + * If the socket is in blocking mode the call will block until there is + * space for the data in the socket queue. If there is no space available + * and the socket is in non-blocking mode a %G_IO_ERROR_WOULD_BLOCK error + * will be returned. To be notified when space is available, wait for the + * %G_IO_OUT condition. Note though that you may still receive + * %G_IO_ERROR_WOULD_BLOCK from g_socket_send() even if you were previously + * notified of a %G_IO_OUT condition. (On Windows in particular, this is + * very common due to the way the underlying APIs work.) + * + * On error -1 is returned and @error is set accordingly. + * + * Returns: Number of bytes written (which may be less than @size), or -1 + * on error + * + * Since: 2.22 + */ +gssize +g_socket_send_message (GSocket *socket, + GSocketAddress *address, + GOutputVector *vectors, + gint num_vectors, + GSocketControlMessage **messages, + gint num_messages, + gint flags, + GCancellable *cancellable, + GError **error) +{ + GOutputVector one_vector; + char zero; + + if (!check_socket (socket, error)) + return -1; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + if (num_vectors == -1) + { + for (num_vectors = 0; + vectors[num_vectors].buffer != NULL; + num_vectors++) + ; + } + + if (num_messages == -1) + { + for (num_messages = 0; + messages != NULL && messages[num_messages] != NULL; + num_messages++) + ; + } + + if (num_vectors == 0) + { + zero = '\0'; + + one_vector.buffer = &zero; + one_vector.size = 1; + num_vectors = 1; + vectors = &one_vector; + } + +#ifndef G_OS_WIN32 + { + struct msghdr msg; + gssize result; + + /* name */ + if (address) + { + msg.msg_namelen = g_socket_address_get_native_size (address); + msg.msg_name = g_alloca (msg.msg_namelen); + if (!g_socket_address_to_native (address, msg.msg_name, msg.msg_namelen, error)) + return -1; + } + else + { + msg.msg_name = NULL; + msg.msg_namelen = 0; + } + + /* iov */ + { + /* this entire expression will be evaluated at compile time */ + if (sizeof *msg.msg_iov == sizeof *vectors && + sizeof msg.msg_iov->iov_base == sizeof vectors->buffer && + G_STRUCT_OFFSET (struct iovec, iov_base) == + G_STRUCT_OFFSET (GOutputVector, buffer) && + sizeof msg.msg_iov->iov_len == sizeof vectors->size && + G_STRUCT_OFFSET (struct iovec, iov_len) == + G_STRUCT_OFFSET (GOutputVector, size)) + /* ABI is compatible */ + { + msg.msg_iov = (struct iovec *) vectors; + msg.msg_iovlen = num_vectors; + } + else + /* ABI is incompatible */ + { + gint i; + + msg.msg_iov = g_newa (struct iovec, num_vectors); + for (i = 0; i < num_vectors; i++) + { + msg.msg_iov[i].iov_base = (void *) vectors[i].buffer; + msg.msg_iov[i].iov_len = vectors[i].size; + } + msg.msg_iovlen = num_vectors; + } + } + + /* control */ + { + struct cmsghdr *cmsg; + gint i; + + msg.msg_controllen = 0; + for (i = 0; i < num_messages; i++) + msg.msg_controllen += CMSG_SPACE (g_socket_control_message_get_size (messages[i])); + + msg.msg_control = g_alloca (msg.msg_controllen); + + cmsg = CMSG_FIRSTHDR (&msg); + for (i = 0; i < num_messages; i++) + { + cmsg->cmsg_level = g_socket_control_message_get_level (messages[i]); + cmsg->cmsg_type = g_socket_control_message_get_msg_type (messages[i]); + cmsg->cmsg_len = CMSG_LEN (g_socket_control_message_get_size (messages[i])); + g_socket_control_message_serialize (messages[i], + CMSG_DATA (cmsg)); + cmsg = CMSG_NXTHDR (&msg, cmsg); + } + g_assert (cmsg == NULL); + } + + while (1) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_OUT, cancellable, error)) + return -1; + + result = sendmsg (socket->priv->fd, &msg, flags | G_SOCKET_DEFAULT_SEND_FLAGS); + if (result < 0) + { + int errsv = get_socket_errno (); + + if (errsv == EINTR) + continue; + + if (socket->priv->blocking && + (errsv == EWOULDBLOCK || + errsv == EAGAIN)) + continue; + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error sending message: %s"), socket_strerror (errsv)); + + return -1; + } + break; + } + + return result; + } +#else + { + struct sockaddr_storage addr; + guint addrlen; + DWORD bytes_sent; + int result; + WSABUF *bufs; + gint i; + + /* Win32 doesn't support control messages. + Actually this is possible for raw and datagram sockets + via WSASendMessage on Vista or later, but that doesn't + seem very useful */ + if (num_messages != 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("GSocketControlMessage not supported on windows")); + return -1; + } + + /* iov */ + bufs = g_newa (WSABUF, num_vectors); + for (i = 0; i < num_vectors; i++) + { + bufs[i].buf = (char *)vectors[i].buffer; + bufs[i].len = (gulong)vectors[i].size; + } + + /* name */ + addrlen = 0; /* Avoid warning */ + if (address) + { + addrlen = g_socket_address_get_native_size (address); + if (!g_socket_address_to_native (address, &addr, sizeof addr, error)) + return -1; + } + + while (1) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_OUT, cancellable, error)) + return -1; + + if (address) + result = WSASendTo (socket->priv->fd, + bufs, num_vectors, + &bytes_sent, flags, + (const struct sockaddr *)&addr, addrlen, + NULL, NULL); + else + result = WSASend (socket->priv->fd, + bufs, num_vectors, + &bytes_sent, flags, + NULL, NULL); + + if (result != 0) + { + int errsv = get_socket_errno (); + + if (errsv == WSAEINTR) + continue; + + if (errsv == WSAEWOULDBLOCK) + win32_unset_event_mask (socket, FD_WRITE); + + if (socket->priv->blocking && + errsv == WSAEWOULDBLOCK) + continue; + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error sending message: %s"), socket_strerror (errsv)); + + return -1; + } + break; + } + + return bytes_sent; + } +#endif +} + +/** + * g_socket_receive_message: + * @socket: a #GSocket + * @address: a pointer to a #GSocketAddress pointer, or %NULL + * @vectors: an array of #GInputVector structs + * @num_vectors: the number of elements in @vectors, or -1 + * @messages: a pointer which will be filled with an array of + * #GSocketControlMessages, or %NULL + * @num_messages: a pointer which will be filled with the number of + * elements in @messages, or %NULL + * @flags: a pointer to an int containing #GSocketMsgFlags flags + * @cancellable: a %GCancellable or %NULL + * @error: a #GError pointer, or %NULL + * + * Receive data from a socket. This is the most complicated and + * fully-featured version of this call. For easier use, see + * g_socket_receive() and g_socket_receive_from(). + * + * If @address is non-%NULL then @address will be set equal to the + * source address of the received packet. + * @address is owned by the caller. + * + * @vector must point to an array of #GInputVector structs and + * @num_vectors must be the length of this array. These structs + * describe the buffers that received data will be scattered into. + * If @num_vectors is -1, then @vectors is assumed to be terminated + * by a #GInputVector with a %NULL buffer pointer. + * + * As a special case, if @num_vectors is 0 (in which case, @vectors + * may of course be %NULL), then a single byte is received and + * discarded. This is to facilitate the common practice of sending a + * single '\0' byte for the purposes of transferring ancillary data. + * + * @messages, if non-%NULL, will be set to point to a newly-allocated + * array of #GSocketControlMessage instances. These correspond to the + * control messages received from the kernel, one + * #GSocketControlMessage per message from the kernel. This array is + * %NULL-terminated and must be freed by the caller using g_free(). If + * @messages is %NULL, any control messages received will be + * discarded. + * + * @num_messages, if non-%NULL, will be set to the number of control + * messages received. + * + * If both @messages and @num_messages are non-%NULL, then + * @num_messages gives the number of #GSocketControlMessage instances + * in @messages (ie: not including the %NULL terminator). + * + * @flags is an in/out parameter. The commonly available arguments + * for this are available in the #GSocketMsgFlags enum, but the + * values there are the same as the system values, and the flags + * are passed in as-is, so you can pass in system-specific flags too + * (and g_socket_receive_message() may pass system-specific flags out). + * + * As with g_socket_receive(), data may be discarded if @socket is + * %G_SOCKET_TYPE_DATAGRAM or %G_SOCKET_TYPE_SEQPACKET and you do not + * provide enough buffer space to read a complete message. You can pass + * %G_SOCKET_MSG_PEEK in @flags to peek at the current message without + * removing it from the receive queue, but there is no portable way to find + * out the length of the message other than by reading it into a + * sufficiently-large buffer. + * + * If the socket is in blocking mode the call will block until there + * is some data to receive or there is an error. If there is no data + * available and the socket is in non-blocking mode, a + * %G_IO_ERROR_WOULD_BLOCK error will be returned. To be notified when + * data is available, wait for the %G_IO_IN condition. + * + * On error -1 is returned and @error is set accordingly. + * + * Returns: Number of bytes read, or -1 on error + * + * Since: 2.22 + */ +gssize +g_socket_receive_message (GSocket *socket, + GSocketAddress **address, + GInputVector *vectors, + gint num_vectors, + GSocketControlMessage ***messages, + gint *num_messages, + gint *flags, + GCancellable *cancellable, + GError **error) +{ + GInputVector one_vector; + char one_byte; + + if (!check_socket (socket, error)) + return -1; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + if (num_vectors == -1) + { + for (num_vectors = 0; + vectors[num_vectors].buffer != NULL; + num_vectors++) + ; + } + + if (num_vectors == 0) + { + one_vector.buffer = &one_byte; + one_vector.size = 1; + num_vectors = 1; + vectors = &one_vector; + } + +#ifndef G_OS_WIN32 + { + struct msghdr msg; + gssize result; + struct sockaddr_storage one_sockaddr; + + /* name */ + if (address) + { + msg.msg_name = &one_sockaddr; + msg.msg_namelen = sizeof (struct sockaddr_storage); + } + else + { + msg.msg_name = NULL; + msg.msg_namelen = 0; + } + + /* iov */ + /* this entire expression will be evaluated at compile time */ + if (sizeof *msg.msg_iov == sizeof *vectors && + sizeof msg.msg_iov->iov_base == sizeof vectors->buffer && + G_STRUCT_OFFSET (struct iovec, iov_base) == + G_STRUCT_OFFSET (GInputVector, buffer) && + sizeof msg.msg_iov->iov_len == sizeof vectors->size && + G_STRUCT_OFFSET (struct iovec, iov_len) == + G_STRUCT_OFFSET (GInputVector, size)) + /* ABI is compatible */ + { + msg.msg_iov = (struct iovec *) vectors; + msg.msg_iovlen = num_vectors; + } + else + /* ABI is incompatible */ + { + gint i; + + msg.msg_iov = g_newa (struct iovec, num_vectors); + for (i = 0; i < num_vectors; i++) + { + msg.msg_iov[i].iov_base = vectors[i].buffer; + msg.msg_iov[i].iov_len = vectors[i].size; + } + msg.msg_iovlen = num_vectors; + } + + /* control */ + msg.msg_control = g_alloca (2048); + msg.msg_controllen = 2048; + + /* flags */ + if (flags != NULL) + msg.msg_flags = *flags; + else + msg.msg_flags = 0; + + /* do it */ + while (1) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_IN, cancellable, error)) + return -1; + + result = recvmsg (socket->priv->fd, &msg, msg.msg_flags); + + if (result < 0) + { + int errsv = get_socket_errno (); + + if (errsv == EINTR) + continue; + + if (socket->priv->blocking && + (errsv == EWOULDBLOCK || + errsv == EAGAIN)) + continue; + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error receiving message: %s"), socket_strerror (errsv)); + + return -1; + } + break; + } + + /* decode address */ + if (address != NULL) + { + if (msg.msg_namelen > 0) + *address = g_socket_address_new_from_native (msg.msg_name, + msg.msg_namelen); + else + *address = NULL; + } + + /* decode control messages */ + { + GSocketControlMessage **my_messages = NULL; + gint allocated = 0, index = 0; + const gchar *scm_pointer; + struct cmsghdr *cmsg; + gsize scm_size; + + scm_pointer = (const gchar *) msg.msg_control; + scm_size = msg.msg_controllen; + + for (cmsg = CMSG_FIRSTHDR (&msg); cmsg; cmsg = CMSG_NXTHDR (&msg, cmsg)) + { + GSocketControlMessage *message; + + message = g_socket_control_message_deserialize (cmsg->cmsg_level, + cmsg->cmsg_type, + cmsg->cmsg_len - ((char *)CMSG_DATA (cmsg) - (char *)cmsg), + CMSG_DATA (cmsg)); + if (message == NULL) + /* We've already spewed about the problem in the + deserialization code, so just continue */ + continue; + + if (index == allocated) + { + /* estimated 99% case: exactly 1 control message */ + allocated = MAX (allocated * 2, 1); + my_messages = g_new (GSocketControlMessage *, (allocated + 1)); + } + + my_messages[index++] = message; + } + + if (num_messages) + *num_messages = index; + + if (messages) + { + my_messages[index++] = NULL; + *messages = my_messages; + } + else + { + gint i; + + /* free all those messages we just constructed. + * we have to do it this way if the user ignores the + * messages so that we will close any received fds. + */ + for (i = 0; i < index; i++) + g_object_unref (my_messages[i]); + g_free (my_messages); + } + } + + /* capture the flags */ + if (flags != NULL) + *flags = msg.msg_flags; + + return result; + } +#else + { + struct sockaddr_storage addr; + int addrlen; + DWORD bytes_received; + DWORD win_flags; + int result; + WSABUF *bufs; + gint i; + + /* iov */ + bufs = g_newa (WSABUF, num_vectors); + for (i = 0; i < num_vectors; i++) + { + bufs[i].buf = (char *)vectors[i].buffer; + bufs[i].len = (gulong)vectors[i].size; + } + + /* flags */ + if (flags != NULL) + win_flags = *flags; + else + win_flags = 0; + + /* do it */ + while (1) + { + if (socket->priv->blocking && + !g_socket_condition_wait (socket, + G_IO_IN, cancellable, error)) + return -1; + + addrlen = sizeof addr; + if (address) + result = WSARecvFrom (socket->priv->fd, + bufs, num_vectors, + &bytes_received, &win_flags, + (struct sockaddr *)&addr, &addrlen, + NULL, NULL); + else + result = WSARecv (socket->priv->fd, + bufs, num_vectors, + &bytes_received, &win_flags, + NULL, NULL); + if (result != 0) + { + int errsv = get_socket_errno (); + + if (errsv == WSAEINTR) + continue; + + win32_unset_event_mask (socket, FD_READ); + + if (socket->priv->blocking && + errsv == WSAEWOULDBLOCK) + continue; + + g_set_error (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + _("Error receiving message: %s"), socket_strerror (errsv)); + + return -1; + } + win32_unset_event_mask (socket, FD_READ); + break; + } + + /* decode address */ + if (address != NULL) + { + if (addrlen > 0) + *address = g_socket_address_new_from_native (&addr, addrlen); + else + *address = NULL; + } + + /* capture the flags */ + if (flags != NULL) + *flags = win_flags; + + return bytes_received; + } +#endif +} + +#define __G_SOCKET_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocket.h b/gio/gsocket.h new file mode 100644 index 0000000..c56a14c --- /dev/null +++ b/gio/gsocket.h @@ -0,0 +1,176 @@ +/* + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 Codethink Limited + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_H__ +#define __G_SOCKET_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET (g_socket_get_type ()) +#define G_SOCKET(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET, GSocket)) +#define G_SOCKET_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET, GSocketClass)) +#define G_IS_SOCKET(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET)) +#define G_IS_SOCKET_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET)) +#define G_SOCKET_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET, GSocketClass)) + +typedef struct _GSocketPrivate GSocketPrivate; +typedef struct _GSocketClass GSocketClass; + +struct _GSocketClass +{ + GObjectClass parent_class; + + /*< private >*/ + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + void (*_g_reserved7) (void); + void (*_g_reserved8) (void); + void (*_g_reserved9) (void); + void (*_g_reserved10) (void); +}; + +struct _GSocket +{ + GObject parent_instance; + GSocketPrivate *priv; +}; + +GType g_socket_get_type (void) G_GNUC_CONST; +GSocket * g_socket_new (GSocketFamily family, + GSocketType type, + GSocketProtocol protocol, + GError **error); +GSocket * g_socket_new_from_fd (gint fd, + GError **error); +int g_socket_get_fd (GSocket *socket); +GSocketFamily g_socket_get_family (GSocket *socket); +GSocketType g_socket_get_socket_type (GSocket *socket); +GSocketProtocol g_socket_get_protocol (GSocket *socket); +GSocketAddress * g_socket_get_local_address (GSocket *socket, + GError **error); +GSocketAddress * g_socket_get_remote_address (GSocket *socket, + GError **error); +void g_socket_set_blocking (GSocket *socket, + gboolean blocking); +gboolean g_socket_get_blocking (GSocket *socket); +void g_socket_set_keepalive (GSocket *socket, + gboolean keepalive); +gboolean g_socket_get_keepalive (GSocket *socket); +gint g_socket_get_listen_backlog (GSocket *socket); +void g_socket_set_listen_backlog (GSocket *socket, + gint backlog); +gboolean g_socket_is_connected (GSocket *socket); +gboolean g_socket_bind (GSocket *socket, + GSocketAddress *address, + gboolean allow_reuse, + GError **error); +gboolean g_socket_connect (GSocket *socket, + GSocketAddress *address, + GCancellable *cancellable, + GError **error); +gboolean g_socket_check_connect_result (GSocket *socket, + GError **error); +GIOCondition g_socket_condition_check (GSocket *socket, + GIOCondition condition); +gboolean g_socket_condition_wait (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable, + GError **error); +GSocket * g_socket_accept (GSocket *socket, + GCancellable *cancellable, + GError **error); +gboolean g_socket_listen (GSocket *socket, + GError **error); +gssize g_socket_receive (GSocket *socket, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +gssize g_socket_receive_from (GSocket *socket, + GSocketAddress **address, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +gssize g_socket_send (GSocket *socket, + const gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +gssize g_socket_send_to (GSocket *socket, + GSocketAddress *address, + const gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +gssize g_socket_receive_message (GSocket *socket, + GSocketAddress **address, + GInputVector *vectors, + gint num_vectors, + GSocketControlMessage ***messages, + gint *num_messages, + gint *flags, + GCancellable *cancellable, + GError **error); +gssize g_socket_send_message (GSocket *socket, + GSocketAddress *address, + GOutputVector *vectors, + gint num_vectors, + GSocketControlMessage **messages, + gint num_messages, + gint flags, + GCancellable *cancellable, + GError **error); +gboolean g_socket_close (GSocket *socket, + GError **error); +gboolean g_socket_shutdown (GSocket *socket, + gboolean shutdown_read, + gboolean shutdown_write, + GError **error); +gboolean g_socket_is_closed (GSocket *socket); +GSource * g_socket_create_source (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable); +gboolean g_socket_speaks_ipv4 (GSocket *socket); + +G_END_DECLS + +#endif /* __G_SOCKET_H__ */ diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c new file mode 100644 index 0000000..70c9e36 --- /dev/null +++ b/gio/gsocketaddress.c @@ -0,0 +1,330 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#include +#include + +#include "gsocketaddress.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "gnetworkingprivate.h" +#include "gsocketaddressenumerator.h" +#include "gsocketconnectable.h" +#include "glibintl.h" +#include "gioenumtypes.h" + +#ifdef G_OS_UNIX +#include "gunixsocketaddress.h" +#endif + +#include "gioalias.h" + +/** + * SECTION:gsocketaddress + * @short_description: Abstract base class representing endpoints for + * socket communication + * + * #GSocketAddress is the equivalent of struct sockaddr + * in the BSD sockets API. This is an abstract class; use + * #GInetSocketAddress for internet sockets, or #GUnixSocketAddress + * for UNIX domain sockets. + */ + +/** + * GSocketAddress: + * + * A socket endpoint address, corresponding to struct sockaddr + * or one of its subtypes. + */ + +enum +{ + PROP_NONE, + PROP_FAMILY +}; + +static void g_socket_address_connectable_iface_init (GSocketConnectableIface *iface); +static GSocketAddressEnumerator *g_socket_address_connectable_enumerate (GSocketConnectable *connectable); + +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GSocketAddress, g_socket_address, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_SOCKET_CONNECTABLE, + g_socket_address_connectable_iface_init)) + +/** + * g_socket_address_get_family: + * @address: a #GSocketAddress + * + * Gets the socket family type of @address. + * + * Returns: the socket family type of @address. + * + * Since: 2.22 + */ +GSocketFamily +g_socket_address_get_family (GSocketAddress *address) +{ + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), 0); + + return G_SOCKET_ADDRESS_GET_CLASS (address)->get_family (address); +} + +static void +g_socket_address_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GSocketAddress *address = G_SOCKET_ADDRESS (object); + + switch (prop_id) + { + case PROP_FAMILY: + g_value_set_enum (value, g_socket_address_get_family (address)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_address_class_init (GSocketAddressClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = g_socket_address_get_property; + + g_object_class_install_property (gobject_class, PROP_FAMILY, + g_param_spec_enum ("family", + P_("Address family"), + P_("The family of the socket address"), + G_TYPE_SOCKET_FAMILY, + G_SOCKET_FAMILY_INVALID, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_socket_address_connectable_iface_init (GSocketConnectableIface *connectable_iface) +{ + connectable_iface->enumerate = g_socket_address_connectable_enumerate; +} + +static void +g_socket_address_init (GSocketAddress *address) +{ + +} + +/** + * g_socket_address_get_native_size: + * @address: a #GSocketAddress + * + * Gets the size of @address's native struct sockaddr. + * You can use this to allocate memory to pass to + * g_socket_address_to_native(). + * + * Returns: the size of the native struct sockaddr that + * @address represents + * + * Since: 2.22 + */ +gssize +g_socket_address_get_native_size (GSocketAddress *address) +{ + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), -1); + + return G_SOCKET_ADDRESS_GET_CLASS (address)->get_native_size (address); +} + +/** + * g_socket_address_to_native: + * @address: a #GSocketAddress + * @dest: a pointer to a memory location that will contain the native + * struct sockaddr. + * @destlen: the size of @dest. Must be at least as large as + * g_socket_address_get_native_size(). + * @error: #GError for error reporting, or %NULL to ignore. + * + * Converts a #GSocketAddress to a native struct + * sockaddr, which can be passed to low-level functions like + * connect() or bind(). + * + * If not enough space is availible, a %G_IO_ERROR_NO_SPACE error is + * returned. If the address type is not known on the system + * then a %G_IO_ERROR_NOT_SUPPORTED error is returned. + * + * Returns: %TRUE if @dest was filled in, %FALSE on error + * + * Since: 2.22 + */ +gboolean +g_socket_address_to_native (GSocketAddress *address, + gpointer dest, + gsize destlen, + GError **error) +{ + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), FALSE); + + return G_SOCKET_ADDRESS_GET_CLASS (address)->to_native (address, dest, destlen, error); +} + +/** + * g_socket_address_new_from_native: + * @native: a pointer to a struct sockaddr + * @len: the size of the memory location pointed to by @native + * + * Creates a #GSocketAddress subclass corresponding to the native + * struct sockaddr @native. + * + * Returns: a new #GSocketAddress if @native could successfully be converted, + * otherwise %NULL. + * + * Since: 2.22 + */ +GSocketAddress * +g_socket_address_new_from_native (gpointer native, + gsize len) +{ + gshort family; + + if (len < sizeof (gshort)) + return NULL; + + family = ((struct sockaddr *) native)->sa_family; + + if (family == AF_UNSPEC) + return NULL; + + if (family == AF_INET) + { + struct sockaddr_in *addr = (struct sockaddr_in *) native; + GInetAddress *iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin_addr), AF_INET); + GSocketAddress *sockaddr; + + sockaddr = g_inet_socket_address_new (iaddr, g_ntohs (addr->sin_port)); + g_object_unref (iaddr); + return sockaddr; + } + + if (family == AF_INET6) + { + struct sockaddr_in6 *addr = (struct sockaddr_in6 *) native; + GInetAddress *iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin6_addr), AF_INET6); + GSocketAddress *sockaddr; + + sockaddr = g_inet_socket_address_new (iaddr, g_ntohs (addr->sin6_port)); + g_object_unref (iaddr); + return sockaddr; + } + +#ifdef G_OS_UNIX + if (family == AF_UNIX) + { + struct sockaddr_un *addr = (struct sockaddr_un *) native; + + if (addr->sun_path[0] == 0) + return g_unix_socket_address_new_abstract (addr->sun_path+1, + sizeof (addr->sun_path) - 1); + return g_unix_socket_address_new (addr->sun_path); + } +#endif + + return NULL; +} + + +#define G_TYPE_SOCKET_ADDRESS_ADDRESS_ENUMERATOR (_g_socket_address_address_enumerator_get_type ()) +#define G_SOCKET_ADDRESS_ADDRESS_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_SOCKET_ADDRESS_ADDRESS_ENUMERATOR, GSocketAddressAddressEnumerator)) + +typedef struct { + GSocketAddressEnumerator parent_instance; + + GSocketAddress *sockaddr; +} GSocketAddressAddressEnumerator; + +typedef struct { + GSocketAddressEnumeratorClass parent_class; + +} GSocketAddressAddressEnumeratorClass; + +G_DEFINE_TYPE (GSocketAddressAddressEnumerator, _g_socket_address_address_enumerator, G_TYPE_SOCKET_ADDRESS_ENUMERATOR) + +static void +g_socket_address_address_enumerator_finalize (GObject *object) +{ + GSocketAddressAddressEnumerator *sockaddr_enum = + G_SOCKET_ADDRESS_ADDRESS_ENUMERATOR (object); + + if (sockaddr_enum->sockaddr) + g_object_unref (sockaddr_enum->sockaddr); + + G_OBJECT_CLASS (_g_socket_address_address_enumerator_parent_class)->finalize (object); +} + +static GSocketAddress * +g_socket_address_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GSocketAddressAddressEnumerator *sockaddr_enum = + G_SOCKET_ADDRESS_ADDRESS_ENUMERATOR (enumerator); + + if (sockaddr_enum->sockaddr) + { + GSocketAddress *ret = sockaddr_enum->sockaddr; + + sockaddr_enum->sockaddr = NULL; + return ret; + } + else + return NULL; +} + +static void +_g_socket_address_address_enumerator_init (GSocketAddressAddressEnumerator *enumerator) +{ +} + +static void +_g_socket_address_address_enumerator_class_init (GSocketAddressAddressEnumeratorClass *sockaddrenum_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (sockaddrenum_class); + GSocketAddressEnumeratorClass *enumerator_class = + G_SOCKET_ADDRESS_ENUMERATOR_CLASS (sockaddrenum_class); + + enumerator_class->next = g_socket_address_address_enumerator_next; + object_class->finalize = g_socket_address_address_enumerator_finalize; +} + +static GSocketAddressEnumerator * +g_socket_address_connectable_enumerate (GSocketConnectable *connectable) +{ + GSocketAddressAddressEnumerator *sockaddr_enum; + + sockaddr_enum = g_object_new (G_TYPE_SOCKET_ADDRESS_ADDRESS_ENUMERATOR, NULL); + sockaddr_enum->sockaddr = g_object_ref (connectable); + + return (GSocketAddressEnumerator *)sockaddr_enum; +} + +#define __G_SOCKET_ADDRESS_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketaddress.h b/gio/gsocketaddress.h new file mode 100644 index 0000000..356e2b0 --- /dev/null +++ b/gio/gsocketaddress.h @@ -0,0 +1,79 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_ADDRESS_H__ +#define __G_SOCKET_ADDRESS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_ADDRESS (g_socket_address_get_type ()) +#define G_SOCKET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SOCKET_ADDRESS, GSocketAddress)) +#define G_SOCKET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SOCKET_ADDRESS, GSocketAddressClass)) +#define G_IS_SOCKET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SOCKET_ADDRESS)) +#define G_IS_SOCKET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SOCKET_ADDRESS)) +#define G_SOCKET_ADDRESS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SOCKET_ADDRESS, GSocketAddressClass)) + +typedef struct _GSocketAddressClass GSocketAddressClass; + +struct _GSocketAddress +{ + GObject parent_instance; +}; + +struct _GSocketAddressClass +{ + GObjectClass parent_class; + + GSocketFamily (*get_family) (GSocketAddress *address); + + gssize (*get_native_size) (GSocketAddress *address); + + gboolean (*to_native) (GSocketAddress *address, + gpointer dest, + gsize destlen, + GError **error); +}; + +GType g_socket_address_get_type (void) G_GNUC_CONST; + +GSocketFamily g_socket_address_get_family (GSocketAddress *address); + +GSocketAddress * g_socket_address_new_from_native (gpointer native, + gsize len); + +gboolean g_socket_address_to_native (GSocketAddress *address, + gpointer dest, + gsize destlen, + GError **error); + +gssize g_socket_address_get_native_size (GSocketAddress *address); + +G_END_DECLS + +#endif /* __G_SOCKET_ADDRESS_H__ */ diff --git a/gio/gsocketaddressenumerator.c b/gio/gsocketaddressenumerator.c new file mode 100644 index 0000000..1ae69d2 --- /dev/null +++ b/gio/gsocketaddressenumerator.c @@ -0,0 +1,191 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include "gsocketaddressenumerator.h" +#include "glibintl.h" + +#include "gsimpleasyncresult.h" + +#include "gioalias.h" + +G_DEFINE_ABSTRACT_TYPE (GSocketAddressEnumerator, g_socket_address_enumerator, G_TYPE_OBJECT); + +static void g_socket_address_enumerator_real_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static GSocketAddress *g_socket_address_enumerator_real_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error); + +static void +g_socket_address_enumerator_init (GSocketAddressEnumerator *enumerator) +{ +} + +static void +g_socket_address_enumerator_class_init (GSocketAddressEnumeratorClass *enumerator_class) +{ + enumerator_class->next_async = g_socket_address_enumerator_real_next_async; + enumerator_class->next_finish = g_socket_address_enumerator_real_next_finish; +} + +/** + * g_socket_address_enumerator_next: + * @enumerator: a #GSocketAddressEnumerator + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError. + * + * Retrieves the next #GSocketAddress from @enumerator. Note that this + * may block for some amount of time. (Eg, a #GNetworkAddress may need + * to do a DNS lookup before it can return an address.) Use + * g_socket_address_enumerator_next_async() if you need to avoid + * blocking. + * + * If @enumerator is expected to yield addresses, but for some reason + * is unable to (eg, because of a DNS error), then the first call to + * g_socket_address_enumerator_next() will return an appropriate error + * in *@error. However, if the first call to + * g_socket_address_enumerator_next() succeeds, then any further + * internal errors (other than @cancellable being triggered) will be + * ignored. + * + * Return value: a #GSocketAddress (owned by the caller), or %NULL on + * error (in which case *@error will be set) or if there are no + * more addresses. + */ +GSocketAddress * +g_socket_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GSocketAddressEnumeratorClass *klass; + + g_return_val_if_fail (G_IS_SOCKET_ADDRESS_ENUMERATOR (enumerator), NULL); + + klass = G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS (enumerator); + + return (* klass->next) (enumerator, cancellable, error); +} + +/* Default implementation just calls the synchronous method; this can + * be used if the implementation already knows all of its addresses, + * and so the synchronous method will never block. + */ +static void +g_socket_address_enumerator_real_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; + GSocketAddress *address; + GError *error = NULL; + + result = g_simple_async_result_new (G_OBJECT (enumerator), + callback, user_data, + g_socket_address_enumerator_real_next_async); + address = g_socket_address_enumerator_next (enumerator, cancellable, &error); + if (address) + g_simple_async_result_set_op_res_gpointer (result, address, NULL); + else if (error) + { + g_simple_async_result_set_from_error (result, error); + g_error_free (error); + } + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); +} + +/** + * g_socket_address_enumerator_next_async: + * @enumerator: a #GSocketAddressEnumerator + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: the data to pass to callback function + * + * Asynchronously retrieves the next #GSocketAddress from @enumerator + * and then calls @callback, which must call + * g_socket_address_enumerator_next_finish() to get the result. + */ +void +g_socket_address_enumerator_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketAddressEnumeratorClass *klass; + + g_return_if_fail (G_IS_SOCKET_ADDRESS_ENUMERATOR (enumerator)); + + klass = G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS (enumerator); + + (* klass->next_async) (enumerator, cancellable, callback, user_data); +} + +static GSocketAddress * +g_socket_address_enumerator_real_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + + g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), NULL); + simple = G_SIMPLE_ASYNC_RESULT (result); + g_return_val_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_address_enumerator_real_next_async, NULL); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + else + return g_simple_async_result_get_op_res_gpointer (simple); +} + +/** + * g_socket_address_enumerator_next_finish: + * @enumerator: a #GSocketAddressEnumerator + * @result: a #GAsyncResult + * @error: a #GError + * + * Retrieves the result of a completed call to + * g_socket_address_enumerator_next_async(). See + * g_socket_address_enumerator_next() for more information about + * error handling. + * + * Return value: a #GSocketAddress (owned by the caller), or %NULL on + * error (in which case *@error will be set) or if there are no + * more addresses. + */ +GSocketAddress * +g_socket_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + GSocketAddressEnumeratorClass *klass; + + g_return_val_if_fail (G_IS_SOCKET_ADDRESS_ENUMERATOR (enumerator), NULL); + + klass = G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS (enumerator); + + return (* klass->next_finish) (enumerator, result, error); +} + +#define __G_SOCKET_ADDRESS_ENUMERATOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketaddressenumerator.h b/gio/gsocketaddressenumerator.h new file mode 100644 index 0000000..c69be2f --- /dev/null +++ b/gio/gsocketaddressenumerator.h @@ -0,0 +1,89 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_ADDRESS_ENUMERATOR_H__ +#define __G_SOCKET_ADDRESS_ENUMERATOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_ADDRESS_ENUMERATOR (g_socket_address_enumerator_get_type ()) +#define G_SOCKET_ADDRESS_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SOCKET_ADDRESS_ENUMERATOR, GSocketAddressEnumerator)) +#define G_SOCKET_ADDRESS_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SOCKET_ADDRESS_ENUMERATOR, GSocketAddressEnumeratorClass)) +#define G_IS_SOCKET_ADDRESS_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SOCKET_ADDRESS_ENUMERATOR)) +#define G_IS_SOCKET_ADDRESS_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SOCKET_ADDRESS_ENUMERATOR)) +#define G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SOCKET_ADDRESS_ENUMERATOR, GSocketAddressEnumeratorClass)) + +/** + * GSocketAddressEnumerator: + * + * Enumerator type for objects that contain or generate + * #GSocketAddresses. + */ +typedef struct _GSocketAddressEnumeratorClass GSocketAddressEnumeratorClass; + +struct _GSocketAddressEnumerator +{ + GObject parent_instance; + +}; + +struct _GSocketAddressEnumeratorClass +{ + GObjectClass parent_class; + + /* Virtual Table */ + + GSocketAddress * (* next) (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + + void (* next_async) (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + GSocketAddress * (* next_finish) (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error); +}; + +GType g_socket_address_enumerator_get_type (void) G_GNUC_CONST; + +GSocketAddress *g_socket_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + +void g_socket_address_enumerator_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GSocketAddress *g_socket_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error); + +G_END_DECLS + + +#endif /* __G_SOCKET_ADDRESS_ENUMERATOR_H__ */ diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c new file mode 100644 index 0000000..7908aec --- /dev/null +++ b/gio/gsocketclient.c @@ -0,0 +1,1013 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008, 2009 codethink + * Copyright © 2009 Red Hat, Inc + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +#include "config.h" +#include "gsocketclient.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gsocketclient + * @short_description: Helper for connecting to a network service + * @include: gio/gio.h + * @see_also: #GSocketConnection, #GSocketListener + * + * #GSocketClient is a high-level utility class for connecting to a + * network host using a connection oriented socket type. + * + * You create a #GSocketClient object, set any options you want, then + * call a sync or async connect operation, which returns a #GSocketConnection + * subclass on success. + * + * The type of the #GSocketConnection object returned depends on the type of + * the underlying socket that is in use. For instance, for a TCP/IP connection + * it will be a #GTcpConnection. + * + * Since: 2.22 + */ + + +G_DEFINE_TYPE (GSocketClient, g_socket_client, G_TYPE_OBJECT); + +enum +{ + PROP_NONE, + PROP_FAMILY, + PROP_TYPE, + PROP_PROTOCOL, + PROP_LOCAL_ADDRESS +}; + +struct _GSocketClientPrivate +{ + GSocketFamily family; + GSocketType type; + GSocketProtocol protocol; + GSocketAddress *local_address; +}; + +static GSocket * +create_socket (GSocketClient *client, + GSocketAddress *dest_address, + GError **error) +{ + GSocketFamily family; + GSocket *socket; + + family = client->priv->family; + if (family == G_SOCKET_FAMILY_INVALID && + client->priv->local_address != NULL) + family = g_socket_address_get_family (client->priv->local_address); + if (family == G_SOCKET_FAMILY_INVALID) + family = g_socket_address_get_family (dest_address); + + socket = g_socket_new (family, + client->priv->type, + client->priv->protocol, + error); + if (socket == NULL) + return NULL; + + if (client->priv->local_address) + { + if (!g_socket_bind (socket, + client->priv->local_address, + FALSE, + error)) + { + g_object_unref (socket); + return NULL; + } + } + + return socket; +} + +static void +g_socket_client_init (GSocketClient *client) +{ + client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client, + G_TYPE_SOCKET_CLIENT, + GSocketClientPrivate); + client->priv->type = G_SOCKET_TYPE_STREAM; +} + +/** + * g_socket_client_new: + * + * Creates a new #GSocketClient with the default options. + * + * Returns: a #GSocketClient. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocketClient * +g_socket_client_new (void) +{ + return g_object_new (G_TYPE_SOCKET_CLIENT, NULL); +} + +static void +g_socket_client_finalize (GObject *object) +{ + GSocketClient *client = G_SOCKET_CLIENT (object); + + if (client->priv->local_address) + g_object_unref (client->priv->local_address); + + if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) + (*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object); +} + +static void +g_socket_client_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSocketClient *client = G_SOCKET_CLIENT (object); + + switch (prop_id) + { + case PROP_FAMILY: + g_value_set_enum (value, client->priv->family); + break; + + case PROP_TYPE: + g_value_set_enum (value, client->priv->type); + break; + + case PROP_PROTOCOL: + g_value_set_enum (value, client->priv->protocol); + break; + + case PROP_LOCAL_ADDRESS: + g_value_set_object (value, client->priv->local_address); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_client_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSocketClient *client = G_SOCKET_CLIENT (object); + + switch (prop_id) + { + case PROP_FAMILY: + g_socket_client_set_family (client, g_value_get_enum (value)); + break; + + case PROP_TYPE: + g_socket_client_set_socket_type (client, g_value_get_enum (value)); + break; + + case PROP_PROTOCOL: + g_socket_client_set_protocol (client, g_value_get_enum (value)); + break; + + case PROP_LOCAL_ADDRESS: + g_socket_client_set_local_address (client, g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +/** + * g_socket_client_get_family: + * @client: a #GSocketClient. + * + * Gets the socket family of the socket client. + * + * See g_socket_client_set_family() for details. + * + * Returns: a #GSocketFamily + * + * Since: 2.22 + */ +GSocketFamily +g_socket_client_get_family (GSocketClient *client) +{ + return client->priv->family; +} + +/** + * g_socket_client_set_family: + * @client: a #GSocketClient. + * @family: a #GSocketFamily + * + * Sets the socket family of the socket client. + * If this is set to something other than %G_SOCKET_FAMILY_INVALID + * then the sockets created by this object will be of the specified + * family. + * + * This might be useful for instance if you want to force the local + * connection to be an ipv4 socket, even though the address might + * be an ipv6 mapped to ipv4 address. + * + * Since: 2.22 + */ +void +g_socket_client_set_family (GSocketClient *client, + GSocketFamily family) +{ + if (client->priv->family == family) + return; + + client->priv->family = family; + g_object_notify (G_OBJECT (client), "family"); +} + +/** + * g_socket_client_get_socket_type: + * @client: a #GSocketClient. + * + * Gets the socket type of the socket client. + * + * See g_socket_client_set_socket_type() for details. + * + * Returns: a #GSocketFamily + * + * Since: 2.22 + */ +GSocketType +g_socket_client_get_socket_type (GSocketClient *client) +{ + return client->priv->type; +} + +/** + * g_socket_client_set_socket_type: + * @client: a #GSocketClient. + * @type: a #GSocketType + * + * Sets the socket type of the socket client. + * The sockets created by this object will be of the specified + * type. + * + * It doesn't make sense to specify a type of %G_SOCKET_TYPE_DATAGRAM, + * as GSocketClient is used for connection oriented services. + * + * Since: 2.22 + */ +void +g_socket_client_set_socket_type (GSocketClient *client, + GSocketType type) +{ + if (client->priv->type == type) + return; + + client->priv->type = type; + g_object_notify (G_OBJECT (client), "type"); +} + +/** + * g_socket_client_get_protocol: + * @client: a #GSocketClient + * + * Gets the protocol name type of the socket client. + * + * See g_socket_client_set_protocol() for details. + * + * Returns: a #GSocketProtocol + * + * Since: 2.22 + */ +GSocketProtocol +g_socket_client_get_protocol (GSocketClient *client) +{ + return client->priv->protocol; +} + +/** + * g_socket_client_set_protocol: + * @client: a #GSocketClient. + * @protocol: a #GSocketProtocol + * + * Sets the protocol of the socket client. + * The sockets created by this object will use of the specified + * protocol. + * + * If @protocol is %0 that means to use the default + * protocol for the socket family and type. + * + * Since: 2.22 + */ +void +g_socket_client_set_protocol (GSocketClient *client, + GSocketProtocol protocol) +{ + if (client->priv->protocol == protocol) + return; + + client->priv->protocol = protocol; + g_object_notify (G_OBJECT (client), "protocol"); +} + +/** + * g_socket_client_get_local_address: + * @client: a #GSocketClient. + * + * Gets the local address of the socket client. + * + * See g_socket_client_set_local_address() for details. + * + * Returns: a #GSocketAddres or %NULL. don't free + * + * Since: 2.22 + */ +GSocketAddress * +g_socket_client_get_local_address (GSocketClient *client) +{ + return client->priv->local_address; +} + +/** + * g_socket_client_set_local_address: + * @client: a #GSocketClient. + * @address: a #GSocketAddress, or %NULL + * + * Sets the local address of the socket client. + * The sockets created by this object will bound to the + * specified address (if not %NULL) before connecting. + * + * This is useful if you want to ensure the the local + * side of the connection is on a specific port, or on + * a specific interface. + * + * Since: 2.22 + */ +void +g_socket_client_set_local_address (GSocketClient *client, + GSocketAddress *address) +{ + if (address) + g_object_ref (address); + + if (client->priv->local_address) + { + g_object_unref (client->priv->local_address); + } + client->priv->local_address = address; + g_object_notify (G_OBJECT (client), "local-address"); +} + +static void +g_socket_client_class_init (GSocketClientClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + g_type_class_add_private (class, sizeof (GSocketClientPrivate)); + + gobject_class->finalize = g_socket_client_finalize; + gobject_class->set_property = g_socket_client_set_property; + gobject_class->get_property = g_socket_client_get_property; + + g_object_class_install_property (gobject_class, PROP_FAMILY, + g_param_spec_enum ("family", + P_("Socket family"), + P_("The sockets address family to use for socket construction"), + G_TYPE_SOCKET_FAMILY, + G_SOCKET_FAMILY_INVALID, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TYPE, + g_param_spec_enum ("type", + P_("Socket type"), + P_("The sockets type to use for socket construction"), + G_TYPE_SOCKET_TYPE, + G_SOCKET_TYPE_STREAM, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_PROTOCOL, + g_param_spec_enum ("protocol", + P_("Socket protocol"), + P_("The protocol to use for socket construction, or 0 for default"), + G_TYPE_SOCKET_PROTOCOL, + G_SOCKET_PROTOCOL_DEFAULT, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS, + g_param_spec_object ("local-address", + P_("Local address"), + P_("The local address constructed sockets will be bound to"), + G_TYPE_SOCKET_ADDRESS, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_socket_client_connect: + * @client: a #GSocketClient. + * @connectable: a #GSocketConnectable specifying the remote address. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Tries to resolve the @connectable and make a network connection to it.. + * + * Upon a successful connection, a new #GSocketConnection is constructed + * and returned. The caller owns this new object and must drop their + * reference to it when finished with it. + * + * The type of the #GSocketConnection object returned depends on the type of + * the underlying socket that is used. For instance, for a TCP/IP connection + * it will be a #GTcpConnection. + * + * The socket created will be the same family as the the address that the + * @connectable resolves to, unless family is set with g_socket_client_set_family() + * or indirectly via g_socket_client_set_local_address(). The socket type + * defaults to %G_SOCKET_TYPE_STREAM but can be set with + * g_socket_client_set_socket_type(). + * + * If a local address is specified with g_socket_client_set_local_address() the + * socket will be bound to this address before connecting. + * + * Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error) +{ + GSocketConnection *connection = NULL; + GSocketAddressEnumerator *enumerator; + GError *last_error, *tmp_error; + + last_error = NULL; + enumerator = g_socket_connectable_enumerate (connectable); + while (connection == NULL) + { + GSocketAddress *address; + GSocket *socket; + + if (g_cancellable_is_cancelled (cancellable)) + { + g_clear_error (error); + g_cancellable_set_error_if_cancelled (cancellable, error); + break; + } + + tmp_error = NULL; + address = g_socket_address_enumerator_next (enumerator, cancellable, + &tmp_error); + if (address == NULL) + { + if (tmp_error) + { + g_clear_error (&last_error); + g_propagate_error (error, tmp_error); + } + else if (last_error) + { + g_propagate_error (error, last_error); + } + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unknown error on connect")); + break; + } + + /* clear error from previous attempt */ + g_clear_error (&last_error); + + socket = create_socket (client, address, &last_error); + if (socket != NULL) + { + if (g_socket_connect (socket, address, cancellable, &last_error)) + connection = g_socket_connection_factory_create_connection (socket); + + g_object_unref (socket); + } + + g_object_unref (address); + } + g_object_unref (enumerator); + + return connection; +} + +/** + * g_socket_client_connect_to_host: + * @client: a #SocketClient + * @host_and_port: the name and optionally port of the host to connect to + * @default_port: the default port to connect to + * @cancellable: a #GCancellable, or %NULL + * @error: a pointer to a #GError, or %NULL + * + * This is a helper function for g_socket_client_connect(). + * + * Attempts to create a TCP connection to the named host. + * + * @host_and_port may be in any of a number of recognised formats: an IPv6 + * address, an IPv4 address, or a domain name (in which case a DNS + * lookup is performed). Quoting with [] is supported for all address + * types. A port override may be specified in the usual way with a + * colon. Ports may be given as decimal numbers or symbolic names (in + * which case an /etc/services lookup is performed). + * + * If no port override is given in @host_and_port then @default_port will be + * used as the port number to connect to. + * + * In general, @host_and_port is expected to be provided by the user (allowing + * them to give the hostname, and a port overide if necessary) and + * @default_port is expected to be provided by the application. + * + * In the case that an IP address is given, a single connection + * attempt is made. In the case that a name is given, multiple + * connection attempts may be made, in turn and according to the + * number of address records in DNS, until a connection succeeds. + * + * Upon a successful connection, a new #GSocketConnection is constructed + * and returned. The caller owns this new object and must drop their + * reference to it when finished with it. + * + * In the event of any failure (DNS error, service not found, no hosts + * connectable) %NULL is returned and @error (if non-%NULL) is set + * accordingly. + * + Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect_to_host (GSocketClient *client, + const gchar *host_and_port, + guint16 default_port, + GCancellable *cancellable, + GError **error) +{ + GSocketConnectable *connectable; + GSocketConnection *connection; + + connectable = g_network_address_parse (host_and_port, default_port, error); + if (connectable == NULL) + return NULL; + + connection = g_socket_client_connect (client, connectable, + cancellable, error); + g_object_unref (connectable); + + return connection; +} + +/** + * g_socket_client_connect_to_service: + * @client: a #GSocketConnection + * @domain: a domain name + * @service: the name of the service to connect to + * @cancellable: a #GCancellable, or %NULL + * @error: a pointer to a #GError, or %NULL + * @returns: a #GSocketConnection if successful, or %NULL on error + * + * Attempts to create a TCP connection to a service. + * + * This call looks up the SRV record for @service at @domain for the + * "tcp" protocol. It then attempts to connect, in turn, to each of + * the hosts providing the service until either a connection succeeds + * or there are no hosts remaining. + * + * Upon a successful connection, a new #GSocketConnection is constructed + * and returned. The caller owns this new object and must drop their + * reference to it when finished with it. + * + * In the event of any failure (DNS error, service not found, no hosts + * connectable) %NULL is returned and @error (if non-%NULL) is set + * accordingly. + */ +GSocketConnection * +g_socket_client_connect_to_service (GSocketClient *client, + const gchar *domain, + const gchar *service, + GCancellable *cancellable, + GError **error) +{ + GSocketConnectable *connectable; + GSocketConnection *connection; + + connectable = g_network_service_new (service, "tcp", domain); + connection = g_socket_client_connect (client, connectable, + cancellable, error); + g_object_unref (connectable); + + return connection; +} + +typedef struct +{ + GSimpleAsyncResult *result; + GCancellable *cancellable; + GSocketClient *client; + + GSocketAddressEnumerator *enumerator; + GSocket *current_socket; + + GError *last_error; +} GSocketClientAsyncConnectData; + +static void +g_socket_client_async_connect_complete (GSocketClientAsyncConnectData *data) +{ + GSocketConnection *connection; + + if (data->last_error) + { + g_simple_async_result_set_from_error (data->result, data->last_error); + g_error_free (data->last_error); + } + else + { + g_assert (data->current_socket); + + g_socket_set_blocking (data->current_socket, TRUE); + + connection = g_socket_connection_factory_create_connection (data->current_socket); + g_object_unref (data->current_socket); + g_simple_async_result_set_op_res_gpointer (data->result, + connection, + g_object_unref); + } + + g_simple_async_result_complete (data->result); + g_object_unref (data->result); + g_object_unref (data->enumerator); + g_slice_free (GSocketClientAsyncConnectData, data); +} + + +static void +g_socket_client_enumerator_callback (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static void +set_last_error (GSocketClientAsyncConnectData *data, + GError *error) +{ + g_clear_error (&data->last_error); + data->last_error = error; +} + +static gboolean +g_socket_client_socket_callback (GSocket *socket, + GIOCondition condition, + GSocketClientAsyncConnectData *data) +{ + GError *error = NULL; + + if (g_cancellable_is_cancelled (data->cancellable)) + { + /* Cancelled, return done with last error being cancelled */ + g_clear_error (&data->last_error); + g_object_unref (data->current_socket); + data->current_socket = NULL; + g_cancellable_set_error_if_cancelled (data->cancellable, + &data->last_error); + } + else + { + /* socket is ready for writing means connect done, did it succeed? */ + if (!g_socket_check_connect_result (data->current_socket, &error)) + { + set_last_error (data, error); + + /* try next one */ + g_socket_address_enumerator_next_async (data->enumerator, + data->cancellable, + g_socket_client_enumerator_callback, + data); + + return FALSE; + } + } + + g_socket_client_async_connect_complete (data); + + return FALSE; +} + +static void +g_socket_client_enumerator_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClientAsyncConnectData *data = user_data; + GSocketAddress *address; + GSocket *socket; + GError *tmp_error = NULL; + + if (g_cancellable_is_cancelled (data->cancellable)) + { + g_clear_error (&data->last_error); + g_cancellable_set_error_if_cancelled (data->cancellable, &data->last_error); + g_socket_client_async_connect_complete (data); + return; + } + + address = g_socket_address_enumerator_next_finish (data->enumerator, + result, &tmp_error); + + if (address == NULL) + { + if (tmp_error) + set_last_error (data, tmp_error); + else if (data->last_error == NULL) + g_set_error_literal (&data->last_error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unknown error on connect")); + + g_socket_client_async_connect_complete (data); + return; + } + + g_clear_error (&data->last_error); + + socket = create_socket (data->client, address, &data->last_error); + if (socket != NULL) + { + g_socket_set_blocking (socket, FALSE); + if (g_socket_connect (socket, address, data->cancellable, &tmp_error)) + { + data->current_socket = socket; + g_socket_client_async_connect_complete (data); + + g_object_unref (address); + return; + } + else if (g_error_matches (tmp_error, G_IO_ERROR, G_IO_ERROR_PENDING)) + { + GSource *source; + + data->current_socket = socket; + g_error_free (tmp_error); + + source = g_socket_create_source (socket, G_IO_OUT, + data->cancellable); + g_source_set_callback (source, + (GSourceFunc) g_socket_client_socket_callback, + data, NULL); + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); + + g_object_unref (address); + return; + } + else + { + data->last_error = tmp_error; + g_object_unref (socket); + } + g_object_unref (address); + } + + g_socket_address_enumerator_next_async (data->enumerator, + data->cancellable, + g_socket_client_enumerator_callback, + data); +} + +/** + * g_socket_client_connect_async: + * @client: a #GTcpClient + * @connectable: a #GSocketConnectable specifying the remote address. + * @cancellable: a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback + * @user_data: user data for the callback + * + * This is the asynchronous version of g_socket_client_connect(). + * + * When the operation is finished @callback will be + * called. You can then call g_socket_client_connect_finish() to get + * the result of the operation. + * + * Since: 2.22 + */ +void +g_socket_client_connect_async (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketClientAsyncConnectData *data; + + g_return_if_fail (G_IS_SOCKET_CLIENT (client)); + + data = g_slice_new (GSocketClientAsyncConnectData); + + data->result = g_simple_async_result_new (G_OBJECT (client), + callback, user_data, + g_socket_client_connect_async); + data->client = client; + if (cancellable) + data->cancellable = g_object_ref (cancellable); + else + data->cancellable = NULL; + data->last_error = NULL; + data->enumerator = g_socket_connectable_enumerate (connectable); + + g_socket_address_enumerator_next_async (data->enumerator, cancellable, + g_socket_client_enumerator_callback, + data); +} + +/** + * g_socket_client_connect_to_host_async: + * @client: a #GTcpClient + * @host_and_port: the name and optionally the port of the host to connect to + * @default_port: the default port to connect to + * @cancellable: a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback + * @user_data: user data for the callback + * + * This is the asynchronous version of g_socket_client_connect_to_host(). + * + * When the operation is finished @callback will be + * called. You can then call g_socket_client_connect_to_host_finish() to get + * the result of the operation. + * + * Since: 2.22 + */ +void +g_socket_client_connect_to_host_async (GSocketClient *client, + const gchar *host_and_port, + guint16 default_port, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketConnectable *connectable; + GError *error; + + error = NULL; + connectable = g_network_address_parse (host_and_port, default_port, + &error); + if (connectable == NULL) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (client), + callback, user_data, error); + g_error_free (error); + } + else + { + g_socket_client_connect_async (client, + connectable, cancellable, + callback, user_data); + g_object_unref (connectable); + } +} + +/** + * g_socket_client_connect_to_service_async: + * @client: a #GSocketClient + * @domain: a domain name + * @service: the name of the service to connect to + * @cancellable: a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback + * @user_data: user data for the callback + * + * This is the asynchronous version of + * g_socket_client_connect_to_service(). + * + * Since: 2.22 + */ +void +g_socket_client_connect_to_service_async (GSocketClient *client, + const gchar *domain, + const gchar *service, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketConnectable *connectable; + + connectable = g_network_service_new (service, "tcp", domain); + g_socket_client_connect_async (client, + connectable, cancellable, + callback, user_data); + g_object_unref (connectable); +} + +/** + * g_socket_client_connect_finish: + * @client: a #GSocketClient. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_async() + * + * Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect_finish (GSocketClient *client, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); +} + +/** + * g_socket_client_connect_to_host_finish: + * @client: a #GSocketClient. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_to_host_async() + * + * Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect_to_host_finish (GSocketClient *client, + GAsyncResult *result, + GError **error) +{ + return g_socket_client_connect_finish (client, result, error); +} + +/** + * g_socket_client_connect_to_service_finish: + * @client: a #GSocketClient. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_to_service_async() + * + * Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect_to_service_finish (GSocketClient *client, + GAsyncResult *result, + GError **error) +{ + return g_socket_client_connect_finish (client, result, error); +} + +#define __G_SOCKET_CLIENT_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketclient.h b/gio/gsocketclient.h new file mode 100644 index 0000000..0576614 --- /dev/null +++ b/gio/gsocketclient.h @@ -0,0 +1,130 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008, 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_CLIENT_H__ +#define __G_SOCKET_CLIENT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_CLIENT (g_socket_client_get_type ()) +#define G_SOCKET_CLIENT(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_CLIENT, GSocketClient)) +#define G_SOCKET_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_CLIENT, GSocketClientClass)) +#define G_IS_SOCKET_CLIENT(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_CLIENT)) +#define G_IS_SOCKET_CLIENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_CLIENT)) +#define G_SOCKET_CLIENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_CLIENT, GSocketClientClass)) + +typedef struct _GSocketClientPrivate GSocketClientPrivate; +typedef struct _GSocketClientClass GSocketClientClass; + +struct _GSocketClientClass +{ + GObjectClass parent_class; + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +struct _GSocketClient +{ + GObject parent_instance; + GSocketClientPrivate *priv; +}; + +GType g_socket_client_get_type (void) G_GNUC_CONST; + +GSocketClient *g_socket_client_new (void); + +GSocketFamily g_socket_client_get_family (GSocketClient *client); +void g_socket_client_set_family (GSocketClient *client, + GSocketFamily family); +GSocketType g_socket_client_get_socket_type (GSocketClient *client); +void g_socket_client_set_socket_type (GSocketClient *client, + GSocketType type); +GSocketProtocol g_socket_client_get_protocol (GSocketClient *client); +void g_socket_client_set_protocol (GSocketClient *client, + GSocketProtocol protocol); +GSocketAddress *g_socket_client_get_local_address (GSocketClient *client); +void g_socket_client_set_local_address (GSocketClient *client, + GSocketAddress *address); + +GSocketConnection * g_socket_client_connect (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error); +GSocketConnection * g_socket_client_connect_to_host (GSocketClient *client, + const gchar *host_and_port, + guint16 default_port, + GCancellable *cancellable, + GError **error); +GSocketConnection * g_socket_client_connect_to_service (GSocketClient *client, + const gchar *domain, + const gchar *service, + GCancellable *cancellable, + GError **error); +void g_socket_client_connect_async (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GSocketConnection * g_socket_client_connect_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); +void g_socket_client_connect_to_host_async (GSocketClient *client, + const gchar *host_and_port, + guint16 default_port, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GSocketConnection * g_socket_client_connect_to_host_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); + +void g_socket_client_connect_to_service_async (GSocketClient *client, + const gchar *domain, + const gchar *service, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GSocketConnection * g_socket_client_connect_to_service_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_SOCKET_CLIENT_H___ */ diff --git a/gio/gsocketconnectable.c b/gio/gsocketconnectable.c new file mode 100644 index 0000000..a57a001 --- /dev/null +++ b/gio/gsocketconnectable.c @@ -0,0 +1,148 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include "gsocketconnectable.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gsocketconnectable + * @short_description: Interface for potential socket endpoints + * + * Objects that describe one or more potential socket endpoints + * implement #GSocketConnectable. Callers can then use + * g_socket_connectable_enumerate() to get a #GSocketAddressEnumerator + * to try out each socket address in turn until one succeeds, as shown + * in the sample code below. + * + * |[ + * MyConnectionType * + * connect_to_host (const char *hostname, + * guint16 port, + * GCancellable *cancellable, + * GError **error) + * { + * MyConnection *conn = NULL; + * GSocketConnectable *addr; + * GSocketAddressEnumerator *enumerator; + * GSocketAddress *sockaddr; + * GError *conn_error = NULL; + * + * addr = g_network_address_new ("www.gnome.org", 80); + * enumerator = g_socket_connectable_enumerate (addr); + * g_object_unref (addr); + * + * /* Try each sockaddr until we succeed. Record the first + * * connection error, but not any further ones (since they'll probably + * * be basically the same as the first). + * */ + * while (!conn && (sockaddr = g_socket_address_enumerator_next (enumerator, cancellable, error)) + * { + * conn = connect_to_sockaddr (sockaddr, conn_error ? NULL : &conn_error); + * g_object_unref (sockaddr); + * } + * g_object_unref (enumerator); + * + * if (conn) + * { + * if (conn_error) + * { + * /* We couldn't connect to the first address, but we succeeded + * * in connecting to a later address. + * */ + * g_error_free (conn_error); + * } + * return conn; + * } + * else if (error) + * { + * /* Either the initial lookup failed, or else the caller + * * cancelled us. + * */ + * if (conn_error) + * g_error_free (conn_error); + * return NULL; + * } + * else + * { + * g_error_propagate (error, conn_error); + * return NULL; + * } + * } + * ]| + */ + +GType +g_socket_connectable_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) + { + const GTypeInfo connectable_info = + { + sizeof (GSocketConnectableIface), /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, + 0, /* n_preallocs */ + NULL + }; + GType g_define_type_id = + g_type_register_static (G_TYPE_INTERFACE, I_("GSocketConnectable"), + &connectable_info, 0); + + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_OBJECT); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/** + * g_socket_connectable_enumerate: + * @connectable: a #GSocketConnectable + * + * Creates a #GSocketAddressEnumerator for @connectable. + * + * Return value: a new #GSocketAddressEnumerator. + * + * Since: 2.22 + */ +GSocketAddressEnumerator * +g_socket_connectable_enumerate (GSocketConnectable *connectable) +{ + GSocketConnectableIface *iface; + + g_return_val_if_fail (G_IS_SOCKET_CONNECTABLE (connectable), NULL); + + iface = G_SOCKET_CONNECTABLE_GET_IFACE (connectable); + + return (* iface->enumerate) (connectable); +} + +#define __G_SOCKET_CONNECTABLE_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketconnectable.h b/gio/gsocketconnectable.h new file mode 100644 index 0000000..5952b4f --- /dev/null +++ b/gio/gsocketconnectable.h @@ -0,0 +1,68 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_CONNECTABLE_H__ +#define __G_SOCKET_CONNECTABLE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_CONNECTABLE (g_socket_connectable_get_type ()) +#define G_SOCKET_CONNECTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_SOCKET_CONNECTABLE, GSocketConnectable)) +#define G_IS_SOCKET_CONNECTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_SOCKET_CONNECTABLE)) +#define G_SOCKET_CONNECTABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_SOCKET_CONNECTABLE, GSocketConnectableIface)) + +/** + * GSocketConnectable: + * + * Interface for objects that contain or generate #GSocketAddresses. + */ +typedef struct _GSocketConnectableIface GSocketConnectableIface; + +/** + * GSocketConnectableIface: + * @g_iface: The parent interface. + * @enumerate: Creates a #GSocketAddressEnumerator + * + * Provides an interface for returning a #GSocketAddressEnumerator + */ +struct _GSocketConnectableIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GSocketAddressEnumerator * (* enumerate) (GSocketConnectable *connectable); + +}; + +GType g_socket_connectable_get_type (void) G_GNUC_CONST; + +GSocketAddressEnumerator *g_socket_connectable_enumerate (GSocketConnectable *connectable); + +G_END_DECLS + + +#endif /* __G_SOCKET_CONNECTABLE_H__ */ diff --git a/gio/gsocketconnection.c b/gio/gsocketconnection.c new file mode 100644 index 0000000..cb8bb5c --- /dev/null +++ b/gio/gsocketconnection.c @@ -0,0 +1,499 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * © 2008 codethink + * Copyright © 2009 Red Hat, Inc + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + * Alexander Larsson + */ + +#include "config.h" + +#include "gsocketconnection.h" + +#include "gsocketoutputstream.h" +#include "gsocketinputstream.h" +#include +#include +#include "gunixconnection.h" +#include "gtcpconnection.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gsocketconnection + * @short_description: A socket connection + * @include: gio/gio.h + * @see_also: #GIOStream, #GSocketClient, #GSocketListener + * + * #GSocketConnection is a #GIOStream for a connected socket. They + * can be created either by #GSocketClient when connecting to a host, + * or by #GSocketListener when accepting a new client. + * + * The type of the #GSocketConnection object returned from these calls + * depends on the type of the underlying socket that is in use. For + * instance, for a TCP/IP connection it will be a #GTcpConnection. + * + * Chosing what type of object to construct is done with the socket + * connection factory, and it is possible for 3rd parties to register + * custom socket connection types for specific combination of socket + * family/type/protocol using g_socket_connection_factory_register_type(). + * + * Since: 2.22 + */ + +G_DEFINE_TYPE (GSocketConnection, + g_socket_connection, G_TYPE_IO_STREAM); + +enum +{ + PROP_NONE, + PROP_SOCKET, +}; + +struct _GSocketConnectionPrivate +{ + GSocket *socket; + GInputStream *input_stream; + GOutputStream *output_stream; +}; + +static gboolean g_socket_connection_close (GIOStream *stream, + GCancellable *cancellable, + GError **error); +static void g_socket_connection_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_socket_connection_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error); + +static GInputStream * +g_socket_connection_get_input_stream (GIOStream *io_stream) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (io_stream); + + if (connection->priv->input_stream == NULL) + connection->priv->input_stream = (GInputStream *) + _g_socket_input_stream_new (connection->priv->socket); + + return connection->priv->input_stream; +} + +static GOutputStream * +g_socket_connection_get_output_stream (GIOStream *io_stream) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (io_stream); + + if (connection->priv->output_stream == NULL) + connection->priv->output_stream = (GOutputStream *) + _g_socket_output_stream_new (connection->priv->socket); + + return connection->priv->output_stream; +} + +/** + * g_socket_connection_get_socket: + * @connection: a #GSocketConnection + * + * Gets the underlying #GSocket object of the connection. + * This can be useful if you want to do something unusual on it + * not supported by the #GSocketConnection APIs. + * + * Returns: a #GSocketAddress or %NULL on error. + * + * Since: 2.22 + */ +GSocket * +g_socket_connection_get_socket (GSocketConnection *connection) +{ + g_return_val_if_fail (G_IS_SOCKET_CONNECTION (connection), NULL); + + return connection->priv->socket; +} + +/** + * g_socket_connection_get_local_address: + * @connection: a #GSocketConnection + * @error: #GError for error reporting, or %NULL to ignore. + * + * Try to get the local address of a socket connection. + * + * Returns: a #GSocketAddress or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocketAddress * +g_socket_connection_get_local_address (GSocketConnection *connection, + GError **error) +{ + return g_socket_get_local_address (connection->priv->socket, error); +} + +/** + * g_socket_connection_get_remote_address: + * @connection: a #GSocketConnection + * @error: #GError for error reporting, or %NULL to ignore. + * + * Try to get the remote address of a socket connection. + * + * Returns: a #GSocketAddress or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.22 + */ +GSocketAddress * +g_socket_connection_get_remote_address (GSocketConnection *connection, + GError **error) +{ + return g_socket_get_remote_address (connection->priv->socket, error); +} + +static void +g_socket_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (object); + + switch (prop_id) + { + case PROP_SOCKET: + g_value_set_object (value, connection->priv->socket); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (object); + + switch (prop_id) + { + case PROP_SOCKET: + connection->priv->socket = G_SOCKET (g_value_dup_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_connection_constructed (GObject *object) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (object); + + g_assert (connection->priv->socket != NULL); +} + +static void +g_socket_connection_finalize (GObject *object) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (object); + + if (connection->priv->input_stream) + g_object_unref (connection->priv->input_stream); + + if (connection->priv->output_stream) + g_object_unref (connection->priv->output_stream); + + g_object_unref (connection->priv->socket); + + G_OBJECT_CLASS (g_socket_connection_parent_class) + ->finalize (object); +} + +static void +g_socket_connection_class_init (GSocketConnectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GSocketConnectionPrivate)); + + gobject_class->set_property = g_socket_connection_set_property; + gobject_class->get_property = g_socket_connection_get_property; + gobject_class->constructed = g_socket_connection_constructed; + gobject_class->finalize = g_socket_connection_finalize; + + stream_class->get_input_stream = g_socket_connection_get_input_stream; + stream_class->get_output_stream = g_socket_connection_get_output_stream; + stream_class->close_fn = g_socket_connection_close; + stream_class->close_async = g_socket_connection_close_async; + stream_class->close_finish = g_socket_connection_close_finish; + + g_object_class_install_property (gobject_class, + PROP_SOCKET, + g_param_spec_object ("socket", + P_("Socket"), + P_("The underlying GSocket"), + G_TYPE_SOCKET, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_socket_connection_init (GSocketConnection *connection) +{ + connection->priv = G_TYPE_INSTANCE_GET_PRIVATE (connection, + G_TYPE_SOCKET_CONNECTION, + GSocketConnectionPrivate); +} + +static gboolean +g_socket_connection_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (stream); + + if (connection->priv->output_stream) + g_output_stream_close (connection->priv->output_stream, + cancellable, NULL); + if (connection->priv->input_stream) + g_input_stream_close (connection->priv->input_stream, + cancellable, NULL); + + return g_socket_close (connection->priv->socket, error); +} + + +static void +g_socket_connection_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + GIOStreamClass *class; + GError *error; + + class = G_IO_STREAM_GET_CLASS (stream); + + /* socket close is not blocked, just do it! */ + error = NULL; + if (class->close_fn && + !class->close_fn (stream, cancellable, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (stream), + callback, user_data, + error); + g_error_free (error); + return; + } + + res = g_simple_async_result_new (G_OBJECT (stream), + callback, + user_data, + g_socket_connection_close_async); + g_simple_async_result_complete_in_idle (res); + g_object_unref (res); +} + +static gboolean +g_socket_connection_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +typedef struct { + GSocketFamily socket_family; + GSocketType socket_type; + int protocol; + GType implementation; +} ConnectionFactory; + +static guint +connection_factory_hash (gconstpointer key) +{ + const ConnectionFactory *factory = key; + guint h; + + h = factory->socket_family ^ (factory->socket_type << 4) ^ (factory->protocol << 8); + /* This is likely to be small, so spread over whole + hash space to get some distribution */ + h = h ^ (h << 8) ^ (h << 16) ^ (h << 24); + + return h; +} + +static gboolean +connection_factory_equal (gconstpointer _a, + gconstpointer _b) +{ + const ConnectionFactory *a = _a; + const ConnectionFactory *b = _b; + + if (a->socket_family != b->socket_family) + return FALSE; + + if (a->socket_type != b->socket_type) + return FALSE; + + if (a->protocol != b->protocol) + return FALSE; + + return TRUE; +} + +static GHashTable *connection_factories = NULL; +G_LOCK_DEFINE_STATIC(connection_factories); + +/** + * g_socket_connection_factory_register_type: + * @g_type: a #GType, inheriting from %G_TYPE_SOCKET_CONNECTION + * @family: a #GSocketFamily + * @type: a #GSocketType + * @protocol: a protocol id + * + * Looks up the #GType to be used when creating socket connections on + * sockets with the specified @family,@type and @protocol. + * + * If no type is registered, the #GSocketConnection base type is returned. + * + * Since: 2.22 + */ +void +g_socket_connection_factory_register_type (GType g_type, + GSocketFamily family, + GSocketType type, + gint protocol) +{ + ConnectionFactory *factory; + + g_return_if_fail (g_type_is_a (g_type, G_TYPE_SOCKET_CONNECTION)); + + G_LOCK (connection_factories); + + if (connection_factories == NULL) + connection_factories = g_hash_table_new_full (connection_factory_hash, + connection_factory_equal, + (GDestroyNotify)g_free, + NULL); + + factory = g_new0 (ConnectionFactory, 1); + factory->socket_family = family; + factory->socket_type = type; + factory->protocol = protocol; + factory->implementation = g_type; + + g_hash_table_insert (connection_factories, + factory, factory); + + G_UNLOCK (connection_factories); +} + +static void +init_builtin_types (void) +{ + volatile GType a_type; +#ifndef G_OS_WIN32 + a_type = g_unix_connection_get_type (); +#endif + a_type = g_tcp_connection_get_type (); +} + +/** + * g_socket_connection_factory_lookup_type: + * @family: a #GSocketFamily + * @type: a #GSocketType + * @protocol_id: a protocol id + * + * Looks up the #GType to be used when creating socket connections on + * sockets with the specified @family,@type and @protocol_id. + * + * If no type is registered, the #GSocketConnection base type is returned. + * + * Returns: a #GType + * + * Since: 2.22 + */ +GType +g_socket_connection_factory_lookup_type (GSocketFamily family, + GSocketType type, + gint protocol_id) +{ + ConnectionFactory *factory, key; + GType g_type; + + init_builtin_types (); + + G_LOCK (connection_factories); + + g_type = G_TYPE_SOCKET_CONNECTION; + + if (connection_factories) + { + key.socket_family = family; + key.socket_type = type; + key.protocol = protocol_id; + + factory = g_hash_table_lookup (connection_factories, &key); + if (factory) + g_type = factory->implementation; + } + + G_UNLOCK (connection_factories); + + return g_type; +} + +/** + * g_socket_connection_factory_create_connection: + * @socket: a #GSocket + * + * Creates a #GSocketConnection subclass of the right type for + * @socket. + * + * Returns: a #GSocketConnection + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_connection_factory_create_connection (GSocket *socket) +{ + GType type; + + type = g_socket_connection_factory_lookup_type (g_socket_get_family (socket), + g_socket_get_socket_type (socket), + g_socket_get_protocol (socket)); + return g_object_new (type, "socket", socket, NULL); +} + +#define __G_SOCKET_CONNECTION_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketconnection.h b/gio/gsocketconnection.h new file mode 100644 index 0000000..1edc2f4 --- /dev/null +++ b/gio/gsocketconnection.h @@ -0,0 +1,91 @@ +/* GIO - GLib Input, Output and Streaming Library + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + * Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_CONNECTION_H__ +#define __G_SOCKET_CONNECTION_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_CONNECTION (g_socket_connection_get_type ()) +#define G_SOCKET_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_CONNECTION, GSocketConnection)) +#define G_SOCKET_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_CONNECTION, GSocketConnectionClass)) +#define G_IS_SOCKET_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_CONNECTION)) +#define G_IS_SOCKET_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_CONNECTION)) +#define G_SOCKET_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_CONNECTION, GSocketConnectionClass)) + +typedef struct _GSocketConnectionPrivate GSocketConnectionPrivate; +typedef struct _GSocketConnectionClass GSocketConnectionClass; + +struct _GSocketConnectionClass +{ + GIOStreamClass parent_class; + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); +}; + +struct _GSocketConnection +{ + GIOStream parent_instance; + GSocketConnectionPrivate *priv; +}; + +GType g_socket_connection_get_type (void) G_GNUC_CONST; + +GSocket *g_socket_connection_get_socket (GSocketConnection *connection); +GSocketAddress *g_socket_connection_get_local_address (GSocketConnection *connection, + GError **error); +GSocketAddress *g_socket_connection_get_remote_address (GSocketConnection *connection, + GError **error); +void g_socket_connection_factory_register_type (GType g_type, + GSocketFamily family, + GSocketType type, + gint protocol); +GType g_socket_connection_factory_lookup_type (GSocketFamily family, + GSocketType type, + gint protocol_id); +GSocketConnection *g_socket_connection_factory_create_connection (GSocket *socket); + +G_END_DECLS + +#endif /* __G_SOCKET_CONNECTION_H__ */ diff --git a/gio/gsocketcontrolmessage.c b/gio/gsocketcontrolmessage.c new file mode 100644 index 0000000..f576a34 --- /dev/null +++ b/gio/gsocketcontrolmessage.c @@ -0,0 +1,216 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Ryan Lortie + */ + +/** + * SECTION: gsocketcontrolmessage + * @title: GSocketControlMessage + * @short_description: A GSocket control message + * @see_also: #GSocket. + * + * A #GSocketControlMessage is a special-purpose utility message that + * can be sent to or received from a #GSocket. These types of + * messages are often called "ancillary data". + * + * The message can represent some sort of special instruction to or + * information from the socket or can represent a special kind of + * transfer to the peer (for example, sending a file description over + * a UNIX socket). + * + * These messages are sent with g_socket_send_message() and received + * with g_socket_receive_message(). + * + * To extend the set of control message that can be sent, subclass this + * class and override the get_size, get_level, get_type and serialize + * methods. + * + * To extend the set of control messages that can be received, subclass + * this class and implement the deserialize method. Also, make sure your + * class is registered with the GType typesystem before calling + * g_socket_receive_message() to read such a message. + * + * Since: 2.22 + */ + +#include "config.h" +#include "gsocketcontrolmessage.h" +#include "gnetworkingprivate.h" +#include "glibintl.h" + +#ifndef G_OS_WIN32 +#include "gunixfdmessage.h" +#endif + +#include "gioalias.h" + +G_DEFINE_ABSTRACT_TYPE (GSocketControlMessage, + g_socket_control_message, + G_TYPE_OBJECT); + +/** + * g_socket_control_message_get_size: + * @message: a #GSocketControlMessage + * + * Returns the space required for the control message, not including + * headers or alignment. + * + * Returns: The number of bytes required. + * + * Since: 2.22 + */ +gsize +g_socket_control_message_get_size (GSocketControlMessage *message) +{ + g_return_val_if_fail (G_IS_SOCKET_CONTROL_MESSAGE (message), 0); + + return G_SOCKET_CONTROL_MESSAGE_GET_CLASS (message)->get_size (message); +} + +/** + * g_socket_control_message_get_level: + * @message: a #GSocketControlMessage + * + * Returns the "level" (i.e. the originating protocol) of the control message. + * This is often SOL_SOCKET. + * + * Returns: an integer describing the level + * + * Since: 2.22 + */ +int +g_socket_control_message_get_level (GSocketControlMessage *message) +{ + g_return_val_if_fail (G_IS_SOCKET_CONTROL_MESSAGE (message), 0); + + return G_SOCKET_CONTROL_MESSAGE_GET_CLASS (message)->get_level (message); +} + +/** + * g_socket_control_message_get_msg_type: + * @message: a #GSocketControlMessage + * + * Returns the protocol specific type of the control message. + * For instance, for UNIX fd passing this would be SCM_RIGHTS. + * + * Returns: an integer describing the type of control message + * + * Since: 2.22 + */ +int +g_socket_control_message_get_msg_type (GSocketControlMessage *message) +{ + g_return_val_if_fail (G_IS_SOCKET_CONTROL_MESSAGE (message), 0); + + return G_SOCKET_CONTROL_MESSAGE_GET_CLASS (message)->get_type (message); +} + +/** + * g_socket_control_message_serialize: + * @message: a #GSocketControlMessage + * @data: A buffer to write data to + * + * Converts the data in the message to bytes placed in the + * message. + * + * @data is guaranteed to have enough space to fit the size + * returned by g_socket_control_message_get_size() on this + * object. + * + * Since: 2.22 + */ +void +g_socket_control_message_serialize (GSocketControlMessage *message, + gpointer data) +{ + g_return_if_fail (G_IS_SOCKET_CONTROL_MESSAGE (message)); + + G_SOCKET_CONTROL_MESSAGE_GET_CLASS (message)->serialize (message, data); +} + + +static void +g_socket_control_message_init (GSocketControlMessage *message) +{ +} + +static void +g_socket_control_message_class_init (GSocketControlMessageClass *class) +{ +} + +/** + * g_socket_control_message_deserialize: + * @level: a socket level + * @type: a socket control message type for the given @level + * @size: the size of the data in bytes + * @data: pointer to the message data + * + * Tries to deserialize a socket control message of a given + * @level and @type. This will ask all known (to GType) subclasses + * of #GSocketControlMessage if they can understand this kind + * of message and if so deserialize it into a #GSocketControlMessage. + * + * If there is no implementation for this kind of control message, %NULL + * will be returned. + * + * Returns: the deserialized message or %NULL + * + * Since: 2.22 + */ +GSocketControlMessage * +g_socket_control_message_deserialize (int level, + int type, + gsize size, + gpointer data) +{ + GSocketControlMessageClass *klass; + GSocketControlMessage *message; + GType *message_types; + guint n_message_types; + int i; +#ifndef G_OS_WIN32 + volatile GType a_type; +#endif + + /* Ensure we know about the built in types */ +#ifndef G_OS_WIN32 + a_type = g_unix_fd_message_get_type (); +#endif + + message_types = g_type_children (G_TYPE_SOCKET_CONTROL_MESSAGE, &n_message_types); + + message = NULL; + for (i = 0; i < n_message_types; i++) + { + klass = (GSocketControlMessageClass *)g_type_class_ref (message_types[i]); + + if (klass && klass->deserialize) + { + message = klass->deserialize (level, type, size, data); + g_type_class_unref ((GTypeClass *) klass); + } + + if (message != NULL) + break; + } + + g_free (message_types); + + if (message == NULL) + g_warning ("unknown control message type %d:%d", level, type); + + return message; +} + +#define __G_SOCKET_CONTROL_MESSAGE_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketcontrolmessage.h b/gio/gsocketcontrolmessage.h new file mode 100644 index 0000000..6af300c --- /dev/null +++ b/gio/gsocketcontrolmessage.h @@ -0,0 +1,105 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_CONTROL_MESSAGE_H__ +#define __G_SOCKET_CONTROL_MESSAGE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_CONTROL_MESSAGE (g_socket_control_message_get_type ()) +#define G_SOCKET_CONTROL_MESSAGE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_CONTROL_MESSAGE, \ + GSocketControlMessage)) +#define G_SOCKET_CONTROL_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_CONTROL_MESSAGE, \ + GSocketControlMessageClass)) +#define G_IS_SOCKET_CONTROL_MESSAGE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_CONTROL_MESSAGE)) +#define G_IS_SOCKET_CONTROL_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_CONTROL_MESSAGE)) +#define G_SOCKET_CONTROL_MESSAGE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_CONTROL_MESSAGE, \ + GSocketControlMessageClass)) + +typedef struct _GSocketControlMessagePrivate GSocketControlMessagePrivate; +typedef struct _GSocketControlMessageClass GSocketControlMessageClass; + +/** + * GSocketControlMessageClass: + * @get_size: gets the size of the message. + * @get_level: gets the protocol of the message. + * @get_type: gets the protocol specific type of the message. + * @serialize: Writes out the message data. + * @deserialize: Tries to deserialize a message. + **/ + +struct _GSocketControlMessageClass +{ + GObjectClass parent_class; + + gsize (* get_size) (GSocketControlMessage *message); + int (* get_level) (GSocketControlMessage *message); + int (* get_type) (GSocketControlMessage *message); + void (* serialize) (GSocketControlMessage *message, + gpointer data); + GSocketControlMessage *(* deserialize) (int level, + int type, + gsize size, + gpointer data); + + /*< private >*/ + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +struct _GSocketControlMessage +{ + GObject parent_instance; + GSocketControlMessagePrivate *priv; +}; + +GType g_socket_control_message_get_type (void) G_GNUC_CONST; +gsize g_socket_control_message_get_size (GSocketControlMessage *message); +int g_socket_control_message_get_level (GSocketControlMessage *message); +int g_socket_control_message_get_msg_type (GSocketControlMessage *message); +void g_socket_control_message_serialize (GSocketControlMessage *message, + gpointer data); +GSocketControlMessage *g_socket_control_message_deserialize (int level, + int type, + gsize size, + gpointer data); + + +G_END_DECLS + +#endif /* __G_SOCKET_CONTROL_MESSAGE_H__ */ diff --git a/gio/gsocketinputstream.c b/gio/gsocketinputstream.c new file mode 100644 index 0000000..046970f --- /dev/null +++ b/gio/gsocketinputstream.c @@ -0,0 +1,257 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * © 2009 codethink + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + */ + +#include "config.h" +#include "gsocketinputstream.h" +#include "glibintl.h" + +#include +#include + +#include "gioalias.h" + +#define g_socket_input_stream_get_type _g_socket_input_stream_get_type +G_DEFINE_TYPE (GSocketInputStream, g_socket_input_stream, G_TYPE_INPUT_STREAM); + +enum +{ + PROP_0, + PROP_SOCKET +}; + +struct _GSocketInputStreamPrivate +{ + GSocket *socket; + + /* pending operation metadata */ + GSimpleAsyncResult *result; + GCancellable *cancellable; + gboolean from_mainloop; + gpointer buffer; + gsize count; +}; + +static void +g_socket_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSocketInputStream *stream = G_SOCKET_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_SOCKET: + g_value_set_object (value, stream->priv->socket); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSocketInputStream *stream = G_SOCKET_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_SOCKET: + stream->priv->socket = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_input_stream_finalize (GObject *object) +{ + GSocketInputStream *stream = G_SOCKET_INPUT_STREAM (object); + + if (stream->priv->socket) + g_object_unref (stream->priv->socket); + + if (G_OBJECT_CLASS (g_socket_input_stream_parent_class)->finalize) + (*G_OBJECT_CLASS (g_socket_input_stream_parent_class)->finalize) (object); +} + +static gssize +g_socket_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (stream); + + return g_socket_receive (input_stream->priv->socket, buffer, count, + cancellable, error); +} + +static gboolean +g_socket_input_stream_read_ready (GSocket *socket, + GIOCondition condition, + GSocketInputStream *stream) +{ + GSimpleAsyncResult *simple; + GError *error = NULL; + gssize result; + + simple = stream->priv->result; + stream->priv->result = NULL; + + result = g_socket_receive (stream->priv->socket, + stream->priv->buffer, + stream->priv->count, + stream->priv->cancellable, + &error); + if (result >= 0) + g_simple_async_result_set_op_res_gssize (simple, result); + + if (error) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + if (stream->priv->cancellable) + g_object_unref (stream->priv->cancellable); + + if (stream->priv->from_mainloop) + g_simple_async_result_complete (simple); + else + g_simple_async_result_complete_in_idle (simple); + + g_object_unref (simple); + + return FALSE; +} + +static void +g_socket_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (stream); + + g_assert (input_stream->priv->result == NULL); + + input_stream->priv->result = + g_simple_async_result_new (G_OBJECT (stream), callback, user_data, + g_socket_input_stream_read_async); + if (cancellable) + g_object_ref (cancellable); + input_stream->priv->cancellable = cancellable; + input_stream->priv->buffer = buffer; + input_stream->priv->count = count; + + if (!g_socket_condition_check (input_stream->priv->socket, G_IO_IN)) + { + GSource *source; + + input_stream->priv->from_mainloop = TRUE; + source = g_socket_create_source (input_stream->priv->socket, + G_IO_IN | G_IO_HUP | G_IO_ERR, + cancellable); + g_source_set_callback (source, + (GSourceFunc) g_socket_input_stream_read_ready, + g_object_ref (input_stream), g_object_unref); + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); + } + else + { + input_stream->priv->from_mainloop = FALSE; + g_socket_input_stream_read_ready (input_stream->priv->socket, G_IO_IN, input_stream); + } +} + +static gssize +g_socket_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize count; + + g_return_val_if_fail (G_IS_SOCKET_INPUT_STREAM (stream), -1); + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_input_stream_read_async); + + count = g_simple_async_result_get_op_res_gssize (simple); + + return count; +} + +static void +g_socket_input_stream_class_init (GSocketInputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInputStreamClass *ginputstream_class = G_INPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GSocketInputStreamPrivate)); + + gobject_class->finalize = g_socket_input_stream_finalize; + gobject_class->get_property = g_socket_input_stream_get_property; + gobject_class->set_property = g_socket_input_stream_set_property; + + ginputstream_class->read_fn = g_socket_input_stream_read; + ginputstream_class->read_async = g_socket_input_stream_read_async; + ginputstream_class->read_finish = g_socket_input_stream_read_finish; + + g_object_class_install_property (gobject_class, PROP_SOCKET, + g_param_spec_object ("socket", + P_("socket"), + P_("The socket that this stream wraps"), + G_TYPE_SOCKET, G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +g_socket_input_stream_init (GSocketInputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, G_TYPE_SOCKET_INPUT_STREAM, GSocketInputStreamPrivate); +} + +GSocketInputStream * +_g_socket_input_stream_new (GSocket *socket) +{ + return G_SOCKET_INPUT_STREAM (g_object_new (G_TYPE_SOCKET_INPUT_STREAM, "socket", socket, NULL)); +} + +#define __G_SOCKET_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketinputstream.h b/gio/gsocketinputstream.h new file mode 100644 index 0000000..8e5776f --- /dev/null +++ b/gio/gsocketinputstream.h @@ -0,0 +1,58 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + */ + +#ifndef __G_SOCKET_INPUT_STREAM_H__ +#define __G_SOCKET_INPUT_STREAM_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_INPUT_STREAM (_g_socket_input_stream_get_type ()) +#define G_SOCKET_INPUT_STREAM(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_INPUT_STREAM, GSocketInputStream)) +#define G_SOCKET_INPUT_STREAM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_INPUT_STREAM, GSocketInputStreamClass)) +#define G_IS_SOCKET_INPUT_STREAM(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_INPUT_STREAM)) +#define G_IS_SOCKET_INPUT_STREAM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_INPUT_STREAM)) +#define G_SOCKET_INPUT_STREAM_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_INPUT_STREAM, GSocketInputStreamClass)) + +typedef struct _GSocketInputStreamPrivate GSocketInputStreamPrivate; +typedef struct _GSocketInputStreamClass GSocketInputStreamClass; +typedef struct _GSocketInputStream GSocketInputStream; + +struct _GSocketInputStreamClass +{ + GInputStreamClass parent_class; +}; + +struct _GSocketInputStream +{ + GInputStream parent_instance; + GSocketInputStreamPrivate *priv; +}; + +GType _g_socket_input_stream_get_type (void) G_GNUC_CONST; +GSocketInputStream * _g_socket_input_stream_new (GSocket *socket); + +G_END_DECLS + +#endif /* __G_SOCKET_INPUT_STREAM_H___ */ diff --git a/gio/gsocketlistener.c b/gio/gsocketlistener.c new file mode 100644 index 0000000..adbac5c --- /dev/null +++ b/gio/gsocketlistener.c @@ -0,0 +1,1156 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 codethink + * Copyright © 2009 Red Hat, Inc + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + * Alexander Larsson + */ + +#include "config.h" +#include "gsocketlistener.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION: gsocketlistener + * @title: GSocketListener + * @short_description: Helper for accepting network client connections + * @see_also: #GThreadedSocketService, #GSocketService. + * + * A #GSocketListener is an object that keeps track of a set + * of server sockets and helps you accept sockets from any of the + * socket, either sync or async. + * + * If you want to implement a network server, also look at #GSocketService + * and #GThreadedSocketService which are subclass of #GSocketListener + * that makes this even easier. + * + * Since: 2.22 + */ + +G_DEFINE_TYPE (GSocketListener, g_socket_listener, G_TYPE_OBJECT); + +enum +{ + PROP_0, + PROP_LISTEN_BACKLOG +}; + + +static GQuark source_quark = 0; + +struct _GSocketListenerPrivate +{ + GPtrArray *sockets; + GMainContext *main_context; + int listen_backlog; + guint closed : 1; +}; + +static void +g_socket_listener_finalize (GObject *object) +{ + GSocketListener *listener = G_SOCKET_LISTENER (object); + + if (listener->priv->main_context) + g_main_context_unref (listener->priv->main_context); + + if (!listener->priv->closed) + g_socket_listener_close (listener); + + g_ptr_array_free (listener->priv->sockets, TRUE); + + G_OBJECT_CLASS (g_socket_listener_parent_class) + ->finalize (object); +} + +static void +g_socket_listener_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSocketListener *listener = G_SOCKET_LISTENER (object); + + switch (prop_id) + { + case PROP_LISTEN_BACKLOG: + g_value_set_int (value, listener->priv->listen_backlog); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_listener_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSocketListener *listener = G_SOCKET_LISTENER (object); + + switch (prop_id) + { + case PROP_LISTEN_BACKLOG: + g_socket_listener_set_backlog (listener, g_value_get_int (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + + +static void +g_socket_listener_class_init (GSocketListenerClass *klass) +{ + GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GSocketListenerPrivate)); + + gobject_class->finalize = g_socket_listener_finalize; + gobject_class->set_property = g_socket_listener_set_property; + gobject_class->get_property = g_socket_listener_get_property; + g_object_class_install_property (gobject_class, PROP_LISTEN_BACKLOG, + g_param_spec_int ("listen-backlog", + P_("Listen backlog"), + P_("outstanding connections in the listen queue"), + 0, + 2000, + 10, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + source_quark = g_quark_from_static_string ("g-socket-listener-source"); +} + +static void +g_socket_listener_init (GSocketListener *listener) +{ + listener->priv = G_TYPE_INSTANCE_GET_PRIVATE (listener, + G_TYPE_SOCKET_LISTENER, + GSocketListenerPrivate); + listener->priv->sockets = + g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + listener->priv->listen_backlog = 10; +} + +/** + * g_socket_listener_new: + * + * Creates a new #GSocketListener with no sockets to listen for. + * New listeners can be added with e.g. g_socket_listener_add_address() + * or g_socket_listener_add_inet_port(). + * + * Returns: a new #GSocketListener. + * + * Since: 2.22 + */ +GSocketListener * +g_socket_listener_new (void) +{ + return g_object_new (G_TYPE_SOCKET_LISTENER, NULL); +} + +static gboolean +check_listener (GSocketListener *listener, + GError **error) +{ + if (listener->priv->closed) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Listener is already closed")); + return FALSE; + } + + return TRUE; +} + +/** + * g_socket_listener_add_socket: + * @listener: a #GSocketListener + * @socket: a listening #GSocket + * @source_object: Optional #GObject identifying this source + * @error: #GError for error reporting, or %NULL to ignore. + * + * Adds @socket to the set of sockets that we try to accept + * new clients from. The socket must be bound to a local + * address and listened to. + * + * @source_object will be passed out in the various calls + * to accept to identify this particular source, which is + * useful if you're listening on multiple addresses and do + * different things depending on what address is connected to. + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.22 + */ +gboolean +g_socket_listener_add_socket (GSocketListener *listener, + GSocket *socket, + GObject *source_object, + GError **error) +{ + if (!check_listener (listener, error)) + return FALSE; + + /* TODO: Check that socket it is bound & not closed? */ + + if (g_socket_is_closed (socket)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Added socket is closed")); + return FALSE; + } + + g_object_ref (socket); + g_ptr_array_add (listener->priv->sockets, socket); + + if (source_object) + g_object_set_qdata_full (G_OBJECT (socket), source_quark, + g_object_ref (source_object), g_object_unref); + + + if (G_SOCKET_LISTENER_GET_CLASS (listener)->changed) + G_SOCKET_LISTENER_GET_CLASS (listener)->changed (listener); + + return TRUE; +} + +/** + * g_socket_listener_add_address: + * @listener: a #GSocketListener + * @address: a #GSocketAddress + * @type: a #GSocketType + * @protocol: a #GSocketProtocol + * @source_object: Optional #GObject identifying this source + * @effective_address: location to store the address that was bound to, or %NULL. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a socket of type @type and protocol @protocol, binds + * it to @address and adds it to the set of sockets we're accepting + * sockets from. + * + * Note that adding an IPv6 address, depending on the platform, + * may or may not result in a listener that also accepts IPv4 + * connections. For more determinstic behaviour, see + * g_socket_listener_add_inet_port(). + * + * @source_object will be passed out in the various calls + * to accept to identify this particular source, which is + * useful if you're listening on multiple addresses and do + * different things depending on what address is connected to. + * + * If successful and @effective_address is non-%NULL then it will + * be set to the address that the binding actually occured at. This + * is helpful for determining the port number that was used for when + * requesting a binding to port 0 (ie: "any port"). This address, if + * requested, belongs to the caller and must be freed. + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.22 + */ +gboolean +g_socket_listener_add_address (GSocketListener *listener, + GSocketAddress *address, + GSocketType type, + GSocketProtocol protocol, + GObject *source_object, + GSocketAddress **effective_address, + GError **error) +{ + GSocketAddress *local_address; + GSocketFamily family; + GSocket *socket; + + if (!check_listener (listener, error)) + return FALSE; + + family = g_socket_address_get_family (address); + socket = g_socket_new (family, type, protocol, error); + if (socket == NULL) + return FALSE; + + g_socket_set_listen_backlog (socket, listener->priv->listen_backlog); + + if (!g_socket_bind (socket, address, TRUE, error) || + !g_socket_listen (socket, error)) + { + g_object_unref (socket); + return FALSE; + } + + local_address = NULL; + if (effective_address) + { + local_address = g_socket_get_local_address (socket, error); + if (local_address == NULL) + { + g_object_unref (socket); + return FALSE; + } + } + + if (!g_socket_listener_add_socket (listener, socket, + source_object, + error)) + { + if (local_address) + g_object_unref (local_address); + g_object_unref (socket); + return FALSE; + } + + if (effective_address) + *effective_address = local_address; + + g_object_unref (socket); /* add_socket refs this */ + + return TRUE; +} + +/** + * g_socket_listener_add_inet_port: + * @listener: a #GSocketListener + * @port: an IP port number (non-zero) + * @source_object: Optional #GObject identifying this source + * @error: #GError for error reporting, or %NULL to ignore. + * + * Helper function for g_socket_listener_add_address() that + * creates a TCP/IP socket listening on IPv4 and IPv6 (if + * supported) on the specified port on all interfaces. + * + * @source_object will be passed out in the various calls + * to accept to identify this particular source, which is + * useful if you're listening on multiple addresses and do + * different things depending on what address is connected to. + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.22 + */ +gboolean +g_socket_listener_add_inet_port (GSocketListener *listener, + guint16 port, + GObject *source_object, + GError **error) +{ + gboolean need_ipv4_socket = TRUE; + GSocket *socket4 = NULL; + GSocket *socket6; + + g_return_val_if_fail (listener != NULL, FALSE); + g_return_val_if_fail (port != 0, FALSE); + + if (!check_listener (listener, error)) + return FALSE; + + /* first try to create an IPv6 socket */ + socket6 = g_socket_new (G_SOCKET_FAMILY_IPV6, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + NULL); + + if (socket6 != NULL) + /* IPv6 is supported on this platform, so if we fail now it is + * a result of being unable to bind to our port. Don't fail + * silently as a result of this! + */ + { + GInetAddress *inet_address; + GSocketAddress *address; + gboolean result; + + inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV6); + address = g_inet_socket_address_new (inet_address, port); + g_object_unref (inet_address); + + g_socket_set_listen_backlog (socket6, listener->priv->listen_backlog); + + result = g_socket_bind (socket6, address, TRUE, error) && + g_socket_listen (socket6, error); + + g_object_unref (address); + + if (!result) + { + g_object_unref (socket6); + + return FALSE; + } + + if (source_object) + g_object_set_qdata_full (G_OBJECT (socket6), source_quark, + g_object_ref (source_object), + g_object_unref); + + /* If this socket already speaks IPv4 then we are done. */ + if (g_socket_speaks_ipv4 (socket6)) + need_ipv4_socket = FALSE; + } + + if (need_ipv4_socket) + /* We are here for exactly one of the following reasons: + * + * - our platform doesn't support IPv6 + * - we successfully created an IPv6 socket but it's V6ONLY + * + * In either case, we need to go ahead and create an IPv4 socket + * and fail the call if we can't bind to it. + */ + { + socket4 = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + error); + + if (socket4 != NULL) + /* IPv4 is supported on this platform, so if we fail now it is + * a result of being unable to bind to our port. Don't fail + * silently as a result of this! + */ + { + GInetAddress *inet_address; + GSocketAddress *address; + gboolean result; + + inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4); + address = g_inet_socket_address_new (inet_address, port); + g_object_unref (inet_address); + + g_socket_set_listen_backlog (socket4, + listener->priv->listen_backlog); + + result = g_socket_bind (socket4, address, TRUE, error) && + g_socket_listen (socket4, error); + + g_object_unref (address); + + if (!result) + { + g_object_unref (socket4); + + if (socket6 != NULL) + g_object_unref (socket6); + + return FALSE; + } + + if (source_object) + g_object_set_qdata_full (G_OBJECT (socket4), source_quark, + g_object_ref (source_object), + g_object_unref); + } + else + /* Ok. So IPv4 is not supported on this platform. If we + * succeeded at creating an IPv6 socket then that's OK, but + * otherwise we need to tell the user we failed. + */ + { + if (socket6 != NULL) + g_clear_error (error); + else + return FALSE; + } + } + + g_assert (socket6 != NULL || socket4 != NULL); + + if (socket6 != NULL) + g_ptr_array_add (listener->priv->sockets, socket6); + + if (socket4 != NULL) + g_ptr_array_add (listener->priv->sockets, socket4); + + if (G_SOCKET_LISTENER_GET_CLASS (listener)->changed) + G_SOCKET_LISTENER_GET_CLASS (listener)->changed (listener); + + return TRUE; +} + +static GList * +add_sources (GSocketListener *listener, + GSocketSourceFunc callback, + gpointer callback_data, + GCancellable *cancellable, + GMainContext *context) +{ + GSocket *socket; + GSource *source; + GList *sources; + int i; + + sources = NULL; + for (i = 0; i < listener->priv->sockets->len; i++) + { + socket = listener->priv->sockets->pdata[i]; + + source = g_socket_create_source (socket, G_IO_IN, cancellable); + g_source_set_callback (source, + (GSourceFunc) callback, + callback_data, NULL); + g_source_attach (source, context); + + sources = g_list_prepend (sources, source); + } + + return sources; +} + +static void +free_sources (GList *sources) +{ + GSource *source; + while (sources != NULL) + { + source = sources->data; + sources = g_list_delete_link (sources, sources); + g_source_destroy (source); + g_source_unref (source); + } +} + +struct AcceptData { + GMainLoop *loop; + GSocket *socket; +}; + +static gboolean +accept_callback (GSocket *socket, + GIOCondition condition, + gpointer user_data) +{ + struct AcceptData *data = user_data; + + data->socket = socket; + g_main_loop_quit (data->loop); + + return TRUE; +} + +/** + * g_socket_listener_accept_socket: + * @listener: a #GSocketListener + * @source_object: location where #GObject pointer will be stored, or %NULL + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Blocks waiting for a client to connect to any of the sockets added + * to the listener. Returns the #GSocket that was accepted. + * + * If you want to accept the high-level #GSocketConnection, not a #GSocket, + * which is often the case, then you should use g_socket_listener_accept() + * instead. + * + * If @source_object is not %NULL it will be filled out with the source + * object specified when the corresponding socket or address was added + * to the listener. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GSocket on success, %NULL on error. + * + * Since: 2.22 + */ +GSocket * +g_socket_listener_accept_socket (GSocketListener *listener, + GObject **source_object, + GCancellable *cancellable, + GError **error) +{ + GSocket *accept_socket, *socket; + + g_return_val_if_fail (G_IS_SOCKET_LISTENER (listener), NULL); + + if (!check_listener (listener, error)) + return NULL; + + if (listener->priv->sockets->len == 1) + { + accept_socket = listener->priv->sockets->pdata[0]; + if (!g_socket_condition_wait (accept_socket, G_IO_IN, + cancellable, error)) + return NULL; + } + else + { + GList *sources; + struct AcceptData data; + GMainLoop *loop; + + if (listener->priv->main_context == NULL) + listener->priv->main_context = g_main_context_new (); + + loop = g_main_loop_new (listener->priv->main_context, FALSE); + data.loop = loop; + sources = add_sources (listener, + accept_callback, + &data, + cancellable, + listener->priv->main_context); + g_main_loop_run (loop); + accept_socket = data.socket; + free_sources (sources); + g_main_loop_unref (loop); + } + + if (!(socket = g_socket_accept (accept_socket, cancellable, error))) + return NULL; + + if (source_object) + *source_object = g_object_get_qdata (G_OBJECT (accept_socket), source_quark); + + return socket; +} + +/** + * g_socket_listener_accept: + * @listener: a #GSocketListener + * @source_object: location where #GObject pointer will be stored, or %NULL + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Blocks waiting for a client to connect to any of the sockets added + * to the listener. Returns a #GSocketConnection for the socket that was + * accepted. + * + * If @source_object is not %NULL it will be filled out with the source + * object specified when the corresponding socket or address was added + * to the listener. + * + * If @cancellable is not %NULL, then the operation can be cancelled by + * triggering the cancellable object from another thread. If the operation + * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. + * + * Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_listener_accept (GSocketListener *listener, + GObject **source_object, + GCancellable *cancellable, + GError **error) +{ + GSocketConnection *connection; + GSocket *socket; + + socket = g_socket_listener_accept_socket (listener, + source_object, + cancellable, + error); + if (socket == NULL) + return NULL; + + connection = g_socket_connection_factory_create_connection (socket); + g_object_unref (socket); + + return connection; +} + +struct AcceptAsyncData { + GSimpleAsyncResult *simple; + GCancellable *cancellable; + GList *sources; +}; + +static gboolean +accept_ready (GSocket *accept_socket, + GIOCondition condition, + gpointer _data) +{ + struct AcceptAsyncData *data = _data; + GError *error = NULL; + GSocket *socket; + GObject *source_object; + + socket = g_socket_accept (accept_socket, data->cancellable, &error); + if (socket) + { + g_simple_async_result_set_op_res_gpointer (data->simple, socket, + g_object_unref); + source_object = g_object_get_qdata (G_OBJECT (accept_socket), source_quark); + if (source_object) + g_object_set_qdata_full (G_OBJECT (data->simple), + source_quark, + g_object_ref (source_object), g_object_unref); + } + else + { + g_simple_async_result_set_from_error (data->simple, error); + g_error_free (error); + } + + g_simple_async_result_complete_in_idle (data->simple); + g_object_unref (data->simple); + free_sources (data->sources); + g_free (data); + + return FALSE; +} + +/** + * g_socket_listener_accept_socket_async: + * @listener: a #GSocketListener + * @cancellable: a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback + * @user_data: user data for the callback + * + * This is the asynchronous version of g_socket_listener_accept_socket(). + * + * When the operation is finished @callback will be + * called. You can then call g_socket_listener_accept_socket_finish() + * to get the result of the operation. + * + * Since: 2.22 + */ +void +g_socket_listener_accept_socket_async (GSocketListener *listener, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + struct AcceptAsyncData *data; + GError *error = NULL; + + if (!check_listener (listener, &error)) + { + g_simple_async_report_gerror_in_idle (G_OBJECT (listener), + callback, user_data, + error); + g_error_free (error); + return; + } + + data = g_new0 (struct AcceptAsyncData, 1); + data->simple = g_simple_async_result_new (G_OBJECT (listener), + callback, user_data, + g_socket_listener_accept_socket_async); + data->cancellable = cancellable; + data->sources = add_sources (listener, + accept_ready, + data, + cancellable, + g_main_context_get_thread_default ()); +} + +/** + * g_socket_listener_accept_socket_finish: + * @listener: a #GSocketListener + * @result: a #GAsyncResult. + * @source_object: Optional #GObject identifying this source + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an async accept operation. See g_socket_listener_accept_socket_async() + * + * Returns: a #GSocket on success, %NULL on error. + * + * Since: 2.22 + */ +GSocket * +g_socket_listener_accept_socket_finish (GSocketListener *listener, + GAsyncResult *result, + GObject **source_object, + GError **error) +{ + GSocket *socket; + GSimpleAsyncResult *simple; + + g_return_val_if_fail (G_IS_SOCKET_LISTENER (listener), FALSE); + + simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_listener_accept_socket_async); + + socket = g_simple_async_result_get_op_res_gpointer (simple); + + if (source_object) + *source_object = g_object_get_qdata (G_OBJECT (result), source_quark); + + return g_object_ref (socket); +} + +/** + * g_socket_listener_accept_async: + * @listener: a #GSocketListener + * @cancellable: a #GCancellable, or %NULL + * @callback: a #GAsyncReadyCallback + * @user_data: user data for the callback + * + * This is the asynchronous version of g_socket_listener_accept(). + * + * When the operation is finished @callback will be + * called. You can then call g_socket_listener_accept_socket() + * to get the result of the operation. + * + * Since: 2.22 + */ +void +g_socket_listener_accept_async (GSocketListener *listener, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_socket_listener_accept_socket_async (listener, + cancellable, + callback, + user_data); +} + +/** + * g_socket_listener_accept_finish: + * @listener: a #GSocketListener + * @result: a #GAsyncResult. + * @source_object: Optional #GObject identifying this source + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes an async accept operation. See g_socket_listener_accept_async() + * + * Returns: a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_listener_accept_finish (GSocketListener *listener, + GAsyncResult *result, + GObject **source_object, + GError **error) +{ + GSocket *socket; + GSocketConnection *connection; + + socket = g_socket_listener_accept_socket_finish (listener, + result, + source_object, + error); + if (socket == NULL) + return NULL; + + connection = g_socket_connection_factory_create_connection (socket); + g_object_unref (socket); + return connection; +} + +/** + * g_socket_listener_set_backlog: + * @listener: a #GSocketListener + * @listen_backlog: an integer + * + * Sets the listen backlog on the sockets in the listener. + * + * See g_socket_set_listen_backlog() for details + * + * Since: 2.22 + */ +void +g_socket_listener_set_backlog (GSocketListener *listener, + int listen_backlog) +{ + GSocket *socket; + int i; + + if (listener->priv->closed) + return; + + listener->priv->listen_backlog = listen_backlog; + + for (i = 0; i < listener->priv->sockets->len; i++) + { + socket = listener->priv->sockets->pdata[i]; + g_socket_set_listen_backlog (socket, listen_backlog); + } +} + +/** + * g_socket_listener_close: + * @listener: a #GSocketListener + * + * Closes all the sockets in the listener. + * + * Since: 2.22 + */ +void +g_socket_listener_close (GSocketListener *listener) +{ + GSocket *socket; + int i; + + g_return_if_fail (G_IS_SOCKET_LISTENER (listener)); + + if (listener->priv->closed) + return; + + for (i = 0; i < listener->priv->sockets->len; i++) + { + socket = listener->priv->sockets->pdata[i]; + g_socket_close (socket, NULL); + } + listener->priv->closed = TRUE; +} + +/** + * g_socket_listener_add_any_inet_port: + * @listener: a #GSocketListener + * @source_object: Optional #GObject identifying this source + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Listens for TCP connections on any available port number for both + * IPv6 and IPv4 (if each are available). + * + * This is useful if you need to have a socket for incoming connections + * but don't care about the specific port number. + * + * @source_object will be passed out in the various calls + * to accept to identify this particular source, which is + * useful if you're listening on multiple addresses and do + * different things depending on what address is connected to. + * + * Returns: the port number, or 0 in case of failure. + * + * Since: 2.24 + **/ +guint16 +g_socket_listener_add_any_inet_port (GSocketListener *listener, + GObject *source_object, + GError **error) +{ + GSList *sockets_to_close = NULL; + guint16 candidate_port = 0; + GSocket *socket6 = NULL; + GSocket *socket4 = NULL; + gint attempts = 37; + + /* + * multi-step process: + * - first, create an IPv6 socket. + * - if that fails, create an IPv4 socket and bind it to port 0 and + * that's it. no retries if that fails (why would it?). + * - if our IPv6 socket also speaks IPv4 then we are done. + * - if not, then we need to create a IPv4 socket with the same port + * number. this might fail, of course. so we try this a bunch of + * times -- leaving the old IPv6 sockets open so that we get a + * different port number to try each time. + * - if all that fails then just give up. + */ + + while (attempts--) + { + GInetAddress *inet_address; + GSocketAddress *address; + gboolean result; + + g_assert (socket6 == NULL); + socket6 = g_socket_new (G_SOCKET_FAMILY_IPV6, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + NULL); + + if (socket6 != NULL) + { + inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV6); + address = g_inet_socket_address_new (inet_address, 0); + g_object_unref (inet_address); + result = g_socket_bind (socket6, address, TRUE, error); + g_object_unref (address); + + if (!result || + !(address = g_socket_get_local_address (socket6, error))) + { + g_object_unref (socket6); + socket6 = NULL; + break; + } + + g_assert (G_IS_INET_SOCKET_ADDRESS (address)); + candidate_port = + g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); + g_assert (candidate_port != 0); + g_object_unref (address); + + if (g_socket_speaks_ipv4 (socket6)) + break; + } + + g_assert (socket4 == NULL); + socket4 = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + socket6 ? NULL : error); + + if (socket4 == NULL) + /* IPv4 not supported. + * if IPv6 is supported then candidate_port will be non-zero + * (and the error parameter above will have been NULL) + * if IPv6 is unsupported then candidate_port will be zero + * (and error will have been set by the above call) + */ + break; + + inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4); + address = g_inet_socket_address_new (inet_address, candidate_port); + g_object_unref (inet_address); + /* a note on the 'error' clause below: + * + * if candidate_port is 0 then we report the error right away + * since it is strange that this binding would fail at all. + * otherwise, we ignore the error message (ie: NULL). + * + * the exception to this rule is the last time through the loop + * (ie: attempts == 0) in which case we want to set the error + * because failure here means that the entire call will fail and + * we need something to show to the user. + * + * an english summary of the situation: "if we gave a candidate + * port number AND we have more attempts to try, then ignore the + * error for now". + */ + result = g_socket_bind (socket4, address, TRUE, + (candidate_port && attempts) ? NULL : error); + g_object_unref (address); + + if (candidate_port) + { + g_assert (socket6 != NULL); + + if (result) + /* got our candidate port successfully */ + break; + + else + /* we failed to bind to the specified port. try again. */ + { + g_object_unref (socket4); + socket4 = NULL; + + /* keep this open so we get a different port number */ + sockets_to_close = g_slist_prepend (sockets_to_close, + socket6); + candidate_port = 0; + socket6 = NULL; + } + } + else + /* we didn't tell it a port. this means two things. + * - if we failed, then something really bad happened. + * - if we succeeded, then we need to find out the port number. + */ + { + g_assert (socket6 == NULL); + + if (!result || + !(address = g_socket_get_local_address (socket4, error))) + { + g_object_unref (socket4); + socket4 = NULL; + break; + } + + g_assert (G_IS_INET_SOCKET_ADDRESS (address)); + candidate_port = + g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); + g_assert (candidate_port != 0); + g_object_unref (address); + break; + } + } + + /* should only be non-zero if we have a socket */ + g_assert ((candidate_port != 0) == (socket4 || socket6)); + + while (sockets_to_close) + { + g_object_unref (sockets_to_close->data); + sockets_to_close = g_slist_delete_link (sockets_to_close, + sockets_to_close); + } + + /* now we actually listen() the sockets and add them to the listener */ + if (socket6 != NULL) + { + g_socket_set_listen_backlog (socket6, listener->priv->listen_backlog); + if (!g_socket_listen (socket6, error)) + { + g_object_unref (socket6); + if (socket4) + g_object_unref (socket4); + + return 0; + } + + if (source_object) + g_object_set_qdata_full (G_OBJECT (socket6), source_quark, + g_object_ref (source_object), + g_object_unref); + + g_ptr_array_add (listener->priv->sockets, socket6); + } + + if (socket4 != NULL) + { + g_socket_set_listen_backlog (socket4, listener->priv->listen_backlog); + if (!g_socket_listen (socket4, error)) + { + g_object_unref (socket4); + if (socket6) + g_object_unref (socket6); + + return 0; + } + + if (source_object) + g_object_set_qdata_full (G_OBJECT (socket4), source_quark, + g_object_ref (source_object), + g_object_unref); + + g_ptr_array_add (listener->priv->sockets, socket4); + } + + if ((socket4 != NULL || socket6 != NULL) && + G_SOCKET_LISTENER_GET_CLASS (listener)->changed) + G_SOCKET_LISTENER_GET_CLASS (listener)->changed (listener); + + return candidate_port; +} + +#define __G_SOCKET_LISTENER_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketlistener.h b/gio/gsocketlistener.h new file mode 100644 index 0000000..da09a78 --- /dev/null +++ b/gio/gsocketlistener.h @@ -0,0 +1,138 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + * Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_LISTENER_H__ +#define __G_SOCKET_LISTENER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_LISTENER (g_socket_listener_get_type ()) +#define G_SOCKET_LISTENER(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_LISTENER, GSocketListener)) +#define G_SOCKET_LISTENER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_LISTENER, GSocketListenerClass)) +#define G_IS_SOCKET_LISTENER(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_LISTENER)) +#define G_IS_SOCKET_LISTENER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_LISTENER)) +#define G_SOCKET_LISTENER_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_LISTENER, GSocketListenerClass)) + +typedef struct _GSocketListenerPrivate GSocketListenerPrivate; +typedef struct _GSocketListenerClass GSocketListenerClass; + +/** + * GSocketListenerClass: + * @changed: virtual method called when the set of socket listened to changes + **/ +struct _GSocketListenerClass +{ + GObjectClass parent_class; + + void (* changed) (GSocketListener *listener); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); +}; + +struct _GSocketListener +{ + GObject parent_instance; + GSocketListenerPrivate *priv; +}; + +GType g_socket_listener_get_type (void) G_GNUC_CONST; + +GSocketListener * g_socket_listener_new (void); + +void g_socket_listener_set_backlog (GSocketListener *listener, + int listen_backlog); + +gboolean g_socket_listener_add_socket (GSocketListener *listener, + GSocket *socket, + GObject *source_object, + GError **error); +gboolean g_socket_listener_add_address (GSocketListener *listener, + GSocketAddress *address, + GSocketType type, + GSocketProtocol protocol, + GObject *source_object, + GSocketAddress **effective_address, + GError **error); +gboolean g_socket_listener_add_inet_port (GSocketListener *listener, + guint16 port, + GObject *source_object, + GError **error); +guint16 g_socket_listener_add_any_inet_port (GSocketListener *listener, + GObject *source_object, + GError **error); + +GSocket * g_socket_listener_accept_socket (GSocketListener *listener, + GObject **source_object, + GCancellable *cancellable, + GError **error); +void g_socket_listener_accept_socket_async (GSocketListener *listener, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GSocket * g_socket_listener_accept_socket_finish (GSocketListener *listener, + GAsyncResult *result, + GObject **source_object, + GError **error); + + +GSocketConnection * g_socket_listener_accept (GSocketListener *listener, + GObject **source_object, + GCancellable *cancellable, + GError **error); + +void g_socket_listener_accept_async (GSocketListener *listener, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GSocketConnection * g_socket_listener_accept_finish (GSocketListener *listener, + GAsyncResult *result, + GObject **source_object, + GError **error); + +void g_socket_listener_close (GSocketListener *listener); + +G_END_DECLS + +#endif /* __G_SOCKET_LISTENER_H__ */ diff --git a/gio/gsocketoutputstream.c b/gio/gsocketoutputstream.c new file mode 100644 index 0000000..7aa9680 --- /dev/null +++ b/gio/gsocketoutputstream.c @@ -0,0 +1,259 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * © 2009 codethink + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + */ + +#include "config.h" +#include "goutputstream.h" +#include "gsocketoutputstream.h" +#include "gsocket.h" + +#include +#include +#include "glibintl.h" + +#include "gioalias.h" + +#define g_socket_output_stream_get_type _g_socket_output_stream_get_type +G_DEFINE_TYPE (GSocketOutputStream, g_socket_output_stream, G_TYPE_OUTPUT_STREAM); + +enum +{ + PROP_0, + PROP_SOCKET +}; + +struct _GSocketOutputStreamPrivate +{ + GSocket *socket; + + /* pending operation metadata */ + GSimpleAsyncResult *result; + GCancellable *cancellable; + gboolean from_mainloop; + gconstpointer buffer; + gsize count; +}; + +static void +g_socket_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSocketOutputStream *stream = G_SOCKET_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_SOCKET: + g_value_set_object (value, stream->priv->socket); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSocketOutputStream *stream = G_SOCKET_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_SOCKET: + stream->priv->socket = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_socket_output_stream_finalize (GObject *object) +{ + GSocketOutputStream *stream = G_SOCKET_OUTPUT_STREAM (object); + + if (stream->priv->socket) + g_object_unref (stream->priv->socket); + + if (G_OBJECT_CLASS (g_socket_output_stream_parent_class)->finalize) + (*G_OBJECT_CLASS (g_socket_output_stream_parent_class)->finalize) (object); +} + +static gssize +g_socket_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GSocketOutputStream *onput_stream = G_SOCKET_OUTPUT_STREAM (stream); + + return g_socket_send (onput_stream->priv->socket, buffer, count, + cancellable, error); +} + +static gboolean +g_socket_output_stream_write_ready (GSocket *socket, + GIOCondition condition, + GSocketOutputStream *stream) +{ + GSimpleAsyncResult *simple; + GError *error = NULL; + gssize result; + + simple = stream->priv->result; + stream->priv->result = NULL; + + result = g_socket_send (stream->priv->socket, + stream->priv->buffer, + stream->priv->count, + stream->priv->cancellable, + &error); + if (result >= 0) + g_simple_async_result_set_op_res_gssize (simple, result); + + if (error) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + if (stream->priv->cancellable) + g_object_unref (stream->priv->cancellable); + + if (stream->priv->from_mainloop) + g_simple_async_result_complete (simple); + else + g_simple_async_result_complete_in_idle (simple); + + g_object_unref (simple); + + return FALSE; +} + +static void +g_socket_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (stream); + + g_assert (output_stream->priv->result == NULL); + + output_stream->priv->result = + g_simple_async_result_new (G_OBJECT (stream), callback, user_data, + g_socket_output_stream_write_async); + if (cancellable) + g_object_ref (cancellable); + output_stream->priv->cancellable = cancellable; + output_stream->priv->buffer = buffer; + output_stream->priv->count = count; + + if (!g_socket_condition_check (output_stream->priv->socket, G_IO_OUT)) + { + GSource *source; + + output_stream->priv->from_mainloop = TRUE; + source = g_socket_create_source (output_stream->priv->socket, + G_IO_OUT | G_IO_HUP | G_IO_ERR, + cancellable); + g_source_set_callback (source, + (GSourceFunc) g_socket_output_stream_write_ready, + g_object_ref (output_stream), g_object_unref); + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); + } + else + { + output_stream->priv->from_mainloop = FALSE; + g_socket_output_stream_write_ready (output_stream->priv->socket, G_IO_OUT, output_stream); + } +} + +static gssize +g_socket_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize count; + + g_return_val_if_fail (G_IS_SOCKET_OUTPUT_STREAM (stream), -1); + + simple = G_SIMPLE_ASYNC_RESULT (result); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_output_stream_write_async); + + count = g_simple_async_result_get_op_res_gssize (simple); + + return count; +} + +static void +g_socket_output_stream_class_init (GSocketOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *goutputstream_class = G_OUTPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GSocketOutputStreamPrivate)); + + gobject_class->finalize = g_socket_output_stream_finalize; + gobject_class->get_property = g_socket_output_stream_get_property; + gobject_class->set_property = g_socket_output_stream_set_property; + + goutputstream_class->write_fn = g_socket_output_stream_write; + goutputstream_class->write_async = g_socket_output_stream_write_async; + goutputstream_class->write_finish = g_socket_output_stream_write_finish; + + g_object_class_install_property (gobject_class, PROP_SOCKET, + g_param_spec_object ("socket", + P_("socket"), + P_("The socket that this stream wraps"), + G_TYPE_SOCKET, G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +g_socket_output_stream_init (GSocketOutputStream *stream) +{ + stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, G_TYPE_SOCKET_OUTPUT_STREAM, GSocketOutputStreamPrivate); +} + +GSocketOutputStream * +_g_socket_output_stream_new (GSocket *socket) +{ + return G_SOCKET_OUTPUT_STREAM (g_object_new (G_TYPE_SOCKET_OUTPUT_STREAM, "socket", socket, NULL)); +} + +#define __G_SOCKET_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketoutputstream.h b/gio/gsocketoutputstream.h new file mode 100644 index 0000000..e3514d1 --- /dev/null +++ b/gio/gsocketoutputstream.h @@ -0,0 +1,58 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + * Ryan Lortie + */ + +#ifndef __G_SOCKET_OUTPUT_STREAM_H__ +#define __G_SOCKET_OUTPUT_STREAM_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_OUTPUT_STREAM (_g_socket_output_stream_get_type ()) +#define G_SOCKET_OUTPUT_STREAM(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_OUTPUT_STREAM, GSocketOutputStream)) +#define G_SOCKET_OUTPUT_STREAM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_OUTPUT_STREAM, GSocketOutputStreamClass)) +#define G_IS_SOCKET_OUTPUT_STREAM(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_OUTPUT_STREAM)) +#define G_IS_SOCKET_OUTPUT_STREAM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_OUTPUT_STREAM)) +#define G_SOCKET_OUTPUT_STREAM_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_OUTPUT_STREAM, GSocketOutputStreamClass)) + +typedef struct _GSocketOutputStreamPrivate GSocketOutputStreamPrivate; +typedef struct _GSocketOutputStreamClass GSocketOutputStreamClass; +typedef struct _GSocketOutputStream GSocketOutputStream; + +struct _GSocketOutputStreamClass +{ + GOutputStreamClass parent_class; +}; + +struct _GSocketOutputStream +{ + GOutputStream parent_instance; + GSocketOutputStreamPrivate *priv; +}; + +GType _g_socket_output_stream_get_type (void) G_GNUC_CONST; +GSocketOutputStream * _g_socket_output_stream_new (GSocket *socket); + +G_END_DECLS + +#endif /* __G_SOCKET_OUTPUT_STREAM_H__ */ diff --git a/gio/gsocketservice.c b/gio/gsocketservice.c new file mode 100644 index 0000000..a7bd8f1 --- /dev/null +++ b/gio/gsocketservice.c @@ -0,0 +1,331 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +/** + * SECTION: gsocketservice + * @title: GSocketService + * @short_description: Make it easy to implement a network service + * @see_also: #GThreadedSocketService, #GSocketListener. + * + * A #GSocketService is an object that represents a service that is + * provided to the network or over local sockets. When a new + * connection is made to the service the #GSocketService:incoming + * signal is emitted. + * + * A #GSocketService is a subclass of #GSocketListener and you need + * to add the addresses you want to accept connections on to the + * with the #GSocketListener APIs. + * + * There are two options for implementing a network service based on + * #GSocketService. The first is to create the service using + * g_socket_service_new() and to connect to the #GSocketService:incoming + * signal. The second is to subclass #GSocketService and override the + * default signal handler implementation. + * + * In either case, the handler must immediately return, or else it + * will block additional incoming connections from being serviced. + * If you are interested in writing connection handlers that contain + * blocking code then see #GThreadedSocketService. + * + * The socket service runs on the main loop in the main thread, and is + * not threadsafe in general. However, the calls to start and stop + * the service are threadsafe so these can be used from threads that + * handle incoming clients. + * + * Since: 2.22 + */ + +#include "config.h" +#include "gsocketservice.h" + +#include "gio-marshal.h" +#include +#include "gsocketlistener.h" +#include "gsocketconnection.h" + +#include "gioalias.h" + +static guint g_socket_service_incoming_signal; + +G_DEFINE_TYPE (GSocketService, g_socket_service, G_TYPE_SOCKET_LISTENER); + +G_LOCK_DEFINE_STATIC(active); + +struct _GSocketServicePrivate +{ + GCancellable *cancellable; + guint active : 1; + guint outstanding_accept : 1; +}; + +static void g_socket_service_ready (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static gboolean +g_socket_service_real_incoming (GSocketService *service, + GSocketConnection *connection, + GObject *source_object) +{ + return FALSE; +} + +static void +g_socket_service_init (GSocketService *service) +{ + service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service, + G_TYPE_SOCKET_SERVICE, + GSocketServicePrivate); + service->priv->cancellable = g_cancellable_new (); + service->priv->active = TRUE; +} + +static void +g_socket_service_finalize (GObject *object) +{ + GSocketService *service = G_SOCKET_SERVICE (object); + + g_object_unref (service->priv->cancellable); + + G_OBJECT_CLASS (g_socket_service_parent_class) + ->finalize (object); +} + +static void +do_accept (GSocketService *service) +{ + g_socket_listener_accept_async (G_SOCKET_LISTENER (service), + service->priv->cancellable, + g_socket_service_ready, NULL); + service->priv->outstanding_accept = TRUE; +} + +static void +g_socket_service_changed (GSocketListener *listener) +{ + GSocketService *service = G_SOCKET_SERVICE (listener); + + G_LOCK (active); + + if (service->priv->active) + { + if (service->priv->outstanding_accept) + g_cancellable_cancel (service->priv->cancellable); + else + { + g_socket_listener_accept_async (listener, service->priv->cancellable, + g_socket_service_ready, NULL); + service->priv->outstanding_accept = TRUE; + } + } + + G_UNLOCK (active); +} + +/** + * g_socket_service_is_active: + * @service: a #GSocketService + * + * Check whether the service is active or not. An active + * service will accept new clients that connect, while + * a non-active service will let connecting clients queue + * up until the service is started. + * + * Returns: %TRUE if the service is active, %FALSE otherwise + * + * Since: 2.22 + */ +gboolean +g_socket_service_is_active (GSocketService *service) +{ + gboolean active; + + G_LOCK (active); + active = service->priv->active; + G_UNLOCK (active); + return active; +} + +/** + * g_socket_service_start: + * @service: a #GSocketService + * + * Starts the service, i.e. start accepting connections + * from the added sockets when the mainloop runs. + * + * This call is threadsafe, so it may be called from a thread + * handling an incomming client request. + * + * Since: 2.22 + */ +void +g_socket_service_start (GSocketService *service) +{ + G_LOCK (active); + + if (!service->priv->active) + { + service->priv->active = TRUE; + + if (service->priv->outstanding_accept) + g_cancellable_cancel (service->priv->cancellable); + else + do_accept (service); + } + + G_UNLOCK (active); +} + +/** + * g_socket_service_stop: + * @service: a #GSocketService + * + * Stops the service, i.e. stops accepting connections + * from the added sockets when the mainloop runs. + * + * This call is threadsafe, so it may be called from a thread + * handling an incomming client request. + * + * Since: 2.22 + */ +void +g_socket_service_stop (GSocketService *service) +{ + G_LOCK (active); + + if (service->priv->active) + { + service->priv->active = FALSE; + + if (service->priv->outstanding_accept) + g_cancellable_cancel (service->priv->cancellable); + } + + G_UNLOCK (active); +} + + +static gboolean +g_socket_service_incoming (GSocketService *service, + GSocketConnection *connection, + GObject *source_object) +{ + gboolean result; + + g_signal_emit (service, g_socket_service_incoming_signal, + 0, connection, source_object, &result); + return result; +} + +static void +g_socket_service_class_init (GSocketServiceClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GSocketListenerClass *listener_class = G_SOCKET_LISTENER_CLASS (class); + + g_type_class_add_private (class, sizeof (GSocketServicePrivate)); + + gobject_class->finalize = g_socket_service_finalize; + listener_class->changed = g_socket_service_changed; + class->incoming = g_socket_service_real_incoming; + + /** + * GSocketService::incoming: + * @service: the #GSocketService. + * @connection: a new #GSocketConnection object. + * @source_object: the source_object passed to g_socket_listener_add_address(). + * + * The ::incoming signal is emitted when a new incoming connection + * to @service needs to be handled. The handler must initiate the + * handling of @connection, but may not block; in essence, + * asynchronous operations must be used. + * + * Returns: %TRUE to stop other handlers from being called + * + * Since: 2.22 + */ + g_socket_service_incoming_signal = + g_signal_new ("incoming", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GSocketServiceClass, incoming), + g_signal_accumulator_true_handled, NULL, + _gio_marshal_BOOLEAN__OBJECT_OBJECT, G_TYPE_BOOLEAN, + 2, G_TYPE_SOCKET_CONNECTION, G_TYPE_OBJECT); +} + +static void +g_socket_service_ready (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GSocketListener *listener = G_SOCKET_LISTENER (object); + GSocketService *service = G_SOCKET_SERVICE (object); + GSocketConnection *connection; + GObject *source_object; + GError *error = NULL; + + connection = g_socket_listener_accept_finish (listener, result, &source_object, &error); + if (error) + { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("fail: %s", error->message); + g_error_free (error); + } + else + { + g_socket_service_incoming (service, connection, source_object); + g_object_unref (connection); + } + + G_LOCK (active); + + g_cancellable_reset (service->priv->cancellable); + + /* requeue */ + service->priv->outstanding_accept = FALSE; + if (service->priv->active) + do_accept (service); + + G_UNLOCK (active); +} + + +/** + * g_socket_service_new: + * + * Creates a new #GSocketService with no sockets to listen for. + * New listeners can be added with e.g. g_socket_listener_add_address() + * or g_socket_listener_add_inet_port(). + * + * Returns: a new #GSocketService. + * + * Since: 2.22 + */ +GSocketService * +g_socket_service_new (void) +{ + return g_object_new (G_TYPE_SOCKET_SERVICE, NULL); +} + +#define __G_SOCKET_SERVICE_C__ +#include "gioaliasdef.c" diff --git a/gio/gsocketservice.h b/gio/gsocketservice.h new file mode 100644 index 0000000..27cc0a2 --- /dev/null +++ b/gio/gsocketservice.h @@ -0,0 +1,88 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOCKET_SERVICE_H__ +#define __G_SOCKET_SERVICE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKET_SERVICE (g_socket_service_get_type ()) +#define G_SOCKET_SERVICE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SOCKET_SERVICE, GSocketService)) +#define G_SOCKET_SERVICE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SOCKET_SERVICE, GSocketServiceClass)) +#define G_IS_SOCKET_SERVICE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SOCKET_SERVICE)) +#define G_IS_SOCKET_SERVICE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SOCKET_SERVICE)) +#define G_SOCKET_SERVICE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SOCKET_SERVICE, GSocketServiceClass)) + +typedef struct _GSocketServicePrivate GSocketServicePrivate; +typedef struct _GSocketServiceClass GSocketServiceClass; + +/** + * GSocketServiceClass: + * @incomming: signal emitted when new connections are accepted + */ +struct _GSocketServiceClass +{ + GSocketListenerClass parent_class; + + gboolean (* incoming) (GSocketService *service, + GSocketConnection *connection, + GObject *source_object); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); +}; + +struct _GSocketService +{ + GSocketListener parent_instance; + GSocketServicePrivate *priv; +}; + +GType g_socket_service_get_type (void); + +GSocketService *g_socket_service_new (void); +void g_socket_service_start (GSocketService *service); +void g_socket_service_stop (GSocketService *service); +gboolean g_socket_service_is_active (GSocketService *service); + + +G_END_DECLS + +#endif /* __G_SOCKET_SERVICE_H__ */ diff --git a/gio/gsrvtarget.c b/gio/gsrvtarget.c new file mode 100644 index 0000000..526b0dd --- /dev/null +++ b/gio/gsrvtarget.c @@ -0,0 +1,331 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include "gsrvtarget.h" + +#include +#include + +#include "gioalias.h" + +/** + * SECTION:gsrvtarget + * @short_description: DNS SRV record target + * @include: gio/gio.h + * + * SRV (service) records are used by some network protocols to provide + * service-specific aliasing and load-balancing. For example, XMPP + * (Jabber) uses SRV records to locate the XMPP server for a domain; + * rather than connecting directly to "example.com" or assuming a + * specific server hostname like "xmpp.example.com", an XMPP client + * would look up the "xmpp-client" SRV record for "example.com", and + * then connect to whatever host was pointed to by that record. + * + * You can use g_resolver_lookup_service() or + * g_resolver_lookup_service_async() to find the #GSrvTargets + * for a given service. However, if you are simply planning to connect + * to the remote service, you can use #GNetworkService's + * #GSocketConnectable interface and not need to worry about + * #GSrvTarget at all. + */ + +struct _GSrvTarget { + gchar *hostname; + guint16 port; + + guint16 priority; + guint16 weight; +}; + +/** + * GSrvTarget: + * + * A single target host/port that a network service is running on. + */ + +GType +g_srv_target_get_type (void) +{ + static volatile gsize type_volatile = 0; + + if (g_once_init_enter (&type_volatile)) + { + GType type = g_boxed_type_register_static ( + g_intern_static_string ("GSrvTarget"), + (GBoxedCopyFunc) g_srv_target_copy, + (GBoxedFreeFunc) g_srv_target_free); + g_once_init_leave (&type_volatile, type); + } + return type_volatile; +} + +/** + * g_srv_target_new: + * @hostname: the host that the service is running on + * @port: the port that the service is running on + * @priority: the target's priority + * @weight: the target's weight + * + * Creates a new #GSrvTarget with the given parameters. + * + * You should not need to use this; normally #GSrvTargets are + * created by #GResolver. + * + * Return value: a new #GSrvTarget. + * + * Since: 2.22 + */ +GSrvTarget * +g_srv_target_new (const gchar *hostname, + guint16 port, + guint16 priority, + guint16 weight) +{ + GSrvTarget *target = g_slice_new0 (GSrvTarget); + + target->hostname = g_strdup (hostname); + target->port = port; + target->priority = priority; + target->weight = weight; + + return target; +} + +/** + * g_srv_target_copy: + * @target: a #GSrvTarget + * + * Copies @target + * + * Return value: a copy of @target + * + * Since: 2.22 + */ +GSrvTarget * +g_srv_target_copy (GSrvTarget *target) +{ + return g_srv_target_new (target->hostname, target->port, + target->priority, target->weight); +} + +/** + * g_srv_target_free: + * @target: a #GSrvTarget + * + * Frees @target + * + * Since: 2.22 + */ +void +g_srv_target_free (GSrvTarget *target) +{ + g_free (target->hostname); + g_slice_free (GSrvTarget, target); +} + +/** + * g_srv_target_get_hostname: + * @target: a #GSrvTarget + * + * Gets @target's hostname (in ASCII form; if you are going to present + * this to the user, you should use g_hostname_is_ascii_encoded() to + * check if it contains encoded Unicode segments, and use + * g_hostname_to_unicode() to convert it if it does.) + * + * Return value: @target's hostname + * + * Since: 2.22 + */ +const gchar * +g_srv_target_get_hostname (GSrvTarget *target) +{ + return target->hostname; +} + +/** + * g_srv_target_get_port: + * @target: a #GSrvTarget + * + * Gets @target's port + * + * Return value: @target's port + * + * Since: 2.22 + */ +guint16 +g_srv_target_get_port (GSrvTarget *target) +{ + return target->port; +} + +/** + * g_srv_target_get_priority: + * @target: a #GSrvTarget + * + * Gets @target's priority. You should not need to look at this; + * #GResolver already sorts the targets according to the algorithm in + * RFC 2782. + * + * Return value: @target's priority + * + * Since: 2.22 + */ +guint16 +g_srv_target_get_priority (GSrvTarget *target) +{ + return target->priority; +} + +/** + * g_srv_target_get_weight: + * @target: a #GSrvTarget + * + * Gets @target's weight. You should not need to look at this; + * #GResolver already sorts the targets according to the algorithm in + * RFC 2782. + * + * Return value: @target's weight + * + * Since: 2.22 + */ +guint16 +g_srv_target_get_weight (GSrvTarget *target) +{ + return target->weight; +} + +gint +compare_target (gconstpointer a, gconstpointer b) +{ + GSrvTarget *ta = (GSrvTarget *)a; + GSrvTarget *tb = (GSrvTarget *)b; + + if (ta->priority == tb->priority) + { + /* Arrange targets of the same priority "in any order, except + * that all those with weight 0 are placed at the beginning of + * the list" + */ + return ta->weight - tb->weight; + } + else + return ta->priority - tb->priority; +} + +/** + * g_srv_target_list_sort: + * @targets: a #GList of #GSrvTarget + * + * Sorts @targets in place according to the algorithm in RFC 2782. + * + * Return value: the head of the sorted list. + * + * Since: 2.22 + */ +GList * +g_srv_target_list_sort (GList *targets) +{ + gint sum, num, val, priority, weight; + GList *t, *out, *tail; + GSrvTarget *target; + + if (!targets) + return NULL; + + if (!targets->next) + { + target = targets->data; + if (!strcmp (target->hostname, ".")) + { + /* 'A Target of "." means that the service is decidedly not + * available at this domain.' + */ + g_srv_target_free (target); + g_list_free (targets); + return NULL; + } + } + + /* Sort input list by priority, and put the 0-weight targets first + * in each priority group. Initialize output list to %NULL. + */ + targets = g_list_sort (targets, compare_target); + out = tail = NULL; + + /* For each group of targets with the same priority, remove them + * from @targets and append them to @out in a valid order. + */ + while (targets) + { + priority = ((GSrvTarget *)targets->data)->priority; + + /* Count the number of targets at this priority level, and + * compute the sum of their weights. + */ + sum = num = 0; + for (t = targets; t; t = t->next) + { + target = (GSrvTarget *)t->data; + if (target->priority != priority) + break; + sum += target->weight; + num++; + } + + /* While there are still targets at this priority level... */ + while (num) + { + /* Randomly select from the targets at this priority level, + * giving precedence to the ones with higher weight, + * according to the rules from RFC 2782. + */ + val = g_random_int_range (0, sum + 1); + for (t = targets; ; t = t->next) + { + weight = ((GSrvTarget *)t->data)->weight; + if (weight >= val) + break; + val -= weight; + } + + targets = g_list_remove_link (targets, t); + + if (!out) + out = t; + else + tail->next = t; + tail = t; + + sum -= weight; + num--; + } + } + + return out; +} + +#define __G_SRV_TARGET_C__ +#include "gioaliasdef.c" diff --git a/gio/gsrvtarget.h b/gio/gsrvtarget.h new file mode 100644 index 0000000..67ce2a9 --- /dev/null +++ b/gio/gsrvtarget.h @@ -0,0 +1,52 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SRV_TARGET_H__ +#define __G_SRV_TARGET_H__ + +#include + +G_BEGIN_DECLS + +GType g_srv_target_get_type (void) G_GNUC_CONST; +#define G_TYPE_SRV_TARGET (g_srv_target_get_type ()) + +GSrvTarget *g_srv_target_new (const gchar *hostname, + guint16 port, + guint16 priority, + guint16 weight); +GSrvTarget *g_srv_target_copy (GSrvTarget *target); +void g_srv_target_free (GSrvTarget *target); + +const gchar *g_srv_target_get_hostname (GSrvTarget *target); +guint16 g_srv_target_get_port (GSrvTarget *target); +guint16 g_srv_target_get_priority (GSrvTarget *target); +guint16 g_srv_target_get_weight (GSrvTarget *target); + +GList *g_srv_target_list_sort (GList *targets); + +G_END_DECLS + +#endif /* __G_SRV_TARGET_H__ */ + diff --git a/gio/gtcpconnection.c b/gio/gtcpconnection.c new file mode 100644 index 0000000..59f9c1b --- /dev/null +++ b/gio/gtcpconnection.c @@ -0,0 +1,382 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008, 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + */ + +/** + * SECTION: gtcpconnection + * @title: GTcpConnection + * @short_description: a TCP #GSocketConnection + * @see_also: #GSocketConnection. + * + * This is the subclass of #GSocketConnection that is created + * for TCP/IP sockets. + * + * It is currently empty; it offers no additional functionality + * over its base class. + * + * Eventually, some TCP-specific socket stuff will be added. + * + * Since: 2.22 + */ + +#include "config.h" +#include "gtcpconnection.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "giostream.h" +#include "glibintl.h" + +#include "gioalias.h" + +G_DEFINE_TYPE_WITH_CODE (GTcpConnection, g_tcp_connection, + G_TYPE_SOCKET_CONNECTION, + g_socket_connection_factory_register_type (g_define_type_id, + G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT); + g_socket_connection_factory_register_type (g_define_type_id, + G_SOCKET_FAMILY_IPV6, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT); + g_socket_connection_factory_register_type (g_define_type_id, + G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_TCP); + g_socket_connection_factory_register_type (g_define_type_id, + G_SOCKET_FAMILY_IPV6, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_TCP); + ); + +static gboolean g_tcp_connection_close (GIOStream *stream, + GCancellable *cancellable, + GError **error); +static void g_tcp_connection_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +struct _GTcpConnectionPrivate +{ + guint graceful_disconnect : 1; +}; + + +enum +{ + PROP_0, + PROP_GRACEFUL_DISCONNECT +}; + +static void +g_tcp_connection_init (GTcpConnection *connection) +{ + connection->priv = G_TYPE_INSTANCE_GET_PRIVATE (connection, + G_TYPE_TCP_CONNECTION, + GTcpConnectionPrivate); + connection->priv->graceful_disconnect = FALSE; +} + +static void +g_tcp_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTcpConnection *connection = G_TCP_CONNECTION (object); + + switch (prop_id) + { + case PROP_GRACEFUL_DISCONNECT: + g_value_set_boolean (value, connection->priv->graceful_disconnect); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_tcp_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTcpConnection *connection = G_TCP_CONNECTION (object); + + switch (prop_id) + { + case PROP_GRACEFUL_DISCONNECT: + g_tcp_connection_set_graceful_disconnect (connection, + g_value_get_boolean (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_tcp_connection_class_init (GTcpConnectionClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GIOStreamClass *stream_class = G_IO_STREAM_CLASS (class); + + g_type_class_add_private (class, sizeof (GTcpConnectionPrivate)); + + gobject_class->set_property = g_tcp_connection_set_property; + gobject_class->get_property = g_tcp_connection_get_property; + + stream_class->close_fn = g_tcp_connection_close; + stream_class->close_async = g_tcp_connection_close_async; + + g_object_class_install_property (gobject_class, PROP_GRACEFUL_DISCONNECT, + g_param_spec_boolean ("graceful-disconnect", + P_("Graceful Disconnect"), + P_("Whether or not close does a graceful disconnect"), + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + +} + +static gboolean +g_tcp_connection_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + GTcpConnection *connection = G_TCP_CONNECTION (stream); + GSocket *socket; + char buffer[1024]; + gssize ret; + GError *my_error; + gboolean had_error; + + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (stream)); + had_error = FALSE; + + if (connection->priv->graceful_disconnect && + !g_cancellable_is_cancelled (cancellable) /* Cancelled -> close fast */) + { + if (!g_socket_shutdown (socket, FALSE, TRUE, error)) + { + error = NULL; /* Ignore further errors */ + had_error = TRUE; + } + else + { + while (TRUE) + { + my_error = NULL; + ret = g_socket_receive (socket, buffer, sizeof (buffer), + cancellable, &my_error); + if (ret < 0) + { + if (g_error_matches (my_error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) + g_error_free (my_error); + else + { + had_error = TRUE; + g_propagate_error (error, my_error); + error = NULL; + break; + } + } + if (ret == 0) + break; + } + } + } + + return G_IO_STREAM_CLASS (g_tcp_connection_parent_class) + ->close_fn (stream, cancellable, error) && !had_error; +} + +typedef struct { + GSimpleAsyncResult *res; + GCancellable *cancellable; +} CloseAsyncData; + +static void +close_async_data_free (CloseAsyncData *data) +{ + g_object_unref (data->res); + if (data->cancellable) + g_object_unref (data->cancellable); + g_free (data); +} + +static void +async_close_finish (CloseAsyncData *data, + GError *error, + gboolean in_mainloop) +{ + GIOStreamClass *parent = G_IO_STREAM_CLASS (g_tcp_connection_parent_class); + GIOStream *stream; + GError *my_error; + + stream = G_IO_STREAM (g_async_result_get_source_object (G_ASYNC_RESULT (data->res))); + + /* Doesn't block, ignore error */ + if (error) + { + parent->close_fn (stream, data->cancellable, NULL); + g_simple_async_result_set_from_error (data->res, error); + } + else + { + my_error = NULL; + parent->close_fn (stream, data->cancellable, &my_error); + if (my_error) + { + g_simple_async_result_set_from_error (data->res, my_error); + g_error_free (my_error); + } + } + + if (in_mainloop) + g_simple_async_result_complete (data->res); + else + g_simple_async_result_complete_in_idle (data->res); +} + +static gboolean +close_read_ready (GSocket *socket, + GIOCondition condition, + CloseAsyncData *data) +{ + GError *error = NULL; + char buffer[1024]; + gssize ret; + + ret = g_socket_receive (socket, buffer, sizeof (buffer), + data->cancellable, &error); + if (ret < 0) + { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) + g_error_free (error); + else + { + async_close_finish (data, error, TRUE); + g_error_free (error); + return FALSE; + } + } + + if (ret == 0) + { + async_close_finish (data, NULL, TRUE); + return FALSE; + } + + return TRUE; +} + + +static void +g_tcp_connection_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTcpConnection *connection = G_TCP_CONNECTION (stream); + CloseAsyncData *data; + GSocket *socket; + GSource *source; + GError *error; + + if (connection->priv->graceful_disconnect && + !g_cancellable_is_cancelled (cancellable) /* Cancelled -> close fast */) + { + data = g_new (CloseAsyncData, 1); + data->res = + g_simple_async_result_new (G_OBJECT (stream), callback, user_data, + g_tcp_connection_close_async); + if (cancellable) + data->cancellable = g_object_ref (cancellable); + else + data->cancellable = NULL; + + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (stream)); + + error = NULL; + if (!g_socket_shutdown (socket, FALSE, TRUE, &error)) + { + async_close_finish (data, error, FALSE); + g_error_free (error); + close_async_data_free (data); + return; + } + + source = g_socket_create_source (socket, G_IO_IN, cancellable); + g_source_set_callback (source, + (GSourceFunc) close_read_ready, + data, (GDestroyNotify)close_async_data_free); + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); + + return; + } + + G_IO_STREAM_CLASS (g_tcp_connection_parent_class) + ->close_async (stream, io_priority, cancellable, callback, user_data); +} + +/** + * g_tcp_connection_set_graceful_disconnect: + * @connection: a #GTcpConnection + * @graceful_disconnect: Whether to do graceful disconnects or not + * + * This enabled graceful disconnects on close. A graceful disconnect + * means that we signal the recieving end that the connection is terminated + * and wait for it to close the connection before closing the connection. + * + * A graceful disconnect means that we can be sure that we successfully sent + * all the outstanding data to the other end, or get an error reported. + * However, it also means we have to wait for all the data to reach the + * other side and for it to acknowledge this by closing the socket, which may + * take a while. For this reason it is disabled by default. + * + * Since: 2.22 + */ +void +g_tcp_connection_set_graceful_disconnect (GTcpConnection *connection, + gboolean graceful_disconnect) +{ + graceful_disconnect = !!graceful_disconnect; + if (graceful_disconnect != connection->priv->graceful_disconnect) + { + connection->priv->graceful_disconnect = graceful_disconnect; + g_object_notify (G_OBJECT (connection), "graceful-disconnect"); + } +} + +/** + * g_tcp_connection_get_graceful_disconnect: + * @connection: a #GTcpConnection + * + * Checks if graceful disconnects are used. See + * g_tcp_connection_set_graceful_disconnect(). + * + * Returns: %TRUE if graceful disconnect is used on close, %FALSE otherwise + * + * Since: 2.22 + */ +gboolean +g_tcp_connection_get_graceful_disconnect (GTcpConnection *connection) +{ + return connection->priv->graceful_disconnect; +} + + +#define __G_TCP_CONNECTION_C__ +#include "gioaliasdef.c" diff --git a/gio/gtcpconnection.h b/gio/gtcpconnection.h new file mode 100644 index 0000000..3928825 --- /dev/null +++ b/gio/gtcpconnection.h @@ -0,0 +1,68 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2008, 2009 Codethink Limited + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TCP_CONNECTION_H__ +#define __G_TCP_CONNECTION_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TCP_CONNECTION (g_tcp_connection_get_type ()) +#define G_TCP_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_TCP_CONNECTION, GTcpConnection)) +#define G_TCP_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_TCP_CONNECTION, GTcpConnectionClass)) +#define G_IS_TCP_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_TCP_CONNECTION)) +#define G_IS_TCP_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_TCP_CONNECTION)) +#define G_TCP_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_TCP_CONNECTION, GTcpConnectionClass)) + +typedef struct _GTcpConnectionPrivate GTcpConnectionPrivate; +typedef struct _GTcpConnectionClass GTcpConnectionClass; + +struct _GTcpConnectionClass +{ + GSocketConnectionClass parent_class; +}; + +struct _GTcpConnection +{ + GSocketConnection parent_instance; + GTcpConnectionPrivate *priv; +}; + +GType g_tcp_connection_get_type (void) G_GNUC_CONST; + +void g_tcp_connection_set_graceful_disconnect (GTcpConnection *connection, + gboolean graceful_disconnect); +gboolean g_tcp_connection_get_graceful_disconnect (GTcpConnection *connection); + +G_END_DECLS + +#endif /* __G_TCP_CONNECTION_H__ */ diff --git a/gio/gthemedicon.c b/gio/gthemedicon.c new file mode 100644 index 0000000..7b6f193 --- /dev/null +++ b/gio/gthemedicon.c @@ -0,0 +1,526 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gthemedicon.h" +#include "gicon.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gthemedicon + * @short_description: Icon theming support + * @include: gio/gio.h + * @see_also: #GIcon, #GLoadableIcon + * + * #GThemedIcon is an implementation of #GIcon that supports icon themes. + * #GThemedIcon contains a list of all of the icons present in an icon + * theme, so that icons can be looked up quickly. #GThemedIcon does + * not provide actual pixmaps for icons, just the icon names. + * Ideally something like gtk_icon_theme_choose_icon() should be used to + * resolve the list of names so that fallback icons work nicely with + * themes that inherit other themes. + **/ + +static void g_themed_icon_icon_iface_init (GIconIface *iface); + +struct _GThemedIcon +{ + GObject parent_instance; + + char **names; + gboolean use_default_fallbacks; +}; + +struct _GThemedIconClass +{ + GObjectClass parent_class; +}; + +enum +{ + PROP_0, + PROP_NAME, + PROP_NAMES, + PROP_USE_DEFAULT_FALLBACKS +}; + +G_DEFINE_TYPE_WITH_CODE (GThemedIcon, g_themed_icon, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ICON, + g_themed_icon_icon_iface_init)) + +static void +g_themed_icon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GThemedIcon *icon = G_THEMED_ICON (object); + + switch (prop_id) + { + case PROP_NAMES: + g_value_set_boxed (value, icon->names); + break; + + case PROP_USE_DEFAULT_FALLBACKS: + g_value_set_boolean (value, icon->use_default_fallbacks); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_themed_icon_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GThemedIcon *icon = G_THEMED_ICON (object); + gchar **names; + const gchar *name; + + switch (prop_id) + { + case PROP_NAME: + name = g_value_get_string (value); + + if (!name) + break; + + if (icon->names) + g_strfreev (icon->names); + + icon->names = g_new (char *, 2); + icon->names[0] = g_strdup (name); + icon->names[1] = NULL; + break; + + case PROP_NAMES: + names = g_value_dup_boxed (value); + + if (!names) + break; + + if (icon->names) + g_strfreev (icon->names); + + icon->names = names; + break; + + case PROP_USE_DEFAULT_FALLBACKS: + icon->use_default_fallbacks = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_themed_icon_constructed (GObject *object) +{ + GThemedIcon *themed = G_THEMED_ICON (object); + + g_return_if_fail (themed->names != NULL && themed->names[0] != NULL); + + if (themed->use_default_fallbacks) + { + int i = 0, dashes = 0; + const char *p; + char *dashp; + char *last; + + p = themed->names[0]; + while (*p) + { + if (*p == '-') + dashes++; + p++; + } + + last = g_strdup (themed->names[0]); + + g_strfreev (themed->names); + + themed->names = g_new (char *, dashes + 1 + 1); + themed->names[i++] = last; + + while ((dashp = strrchr (last, '-')) != NULL) + themed->names[i++] = last = g_strndup (last, dashp - last); + + themed->names[i++] = NULL; + } +} + +static void +g_themed_icon_finalize (GObject *object) +{ + GThemedIcon *themed; + + themed = G_THEMED_ICON (object); + + g_strfreev (themed->names); + + G_OBJECT_CLASS (g_themed_icon_parent_class)->finalize (object); +} + +static void +g_themed_icon_class_init (GThemedIconClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_themed_icon_finalize; + gobject_class->constructed = g_themed_icon_constructed; + gobject_class->set_property = g_themed_icon_set_property; + gobject_class->get_property = g_themed_icon_get_property; + + /** + * GThemedIcon:name: + * + * The icon name. + */ + g_object_class_install_property (gobject_class, PROP_NAME, + g_param_spec_string ("name", + P_("name"), + P_("The name of the icon"), + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); + + /** + * GThemedIcon:names: + * + * A %NULL-terminated array of icon names. + */ + g_object_class_install_property (gobject_class, PROP_NAMES, + g_param_spec_boxed ("names", + P_("names"), + P_("An array containing the icon names"), + G_TYPE_STRV, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); + + /** + * GThemedIcon:use-default-fallbacks: + * + * Whether to use the default fallbacks found by shortening the icon name + * at '-' characters. If the "names" array has more than one element, + * ignores any past the first. + * + * For example, if the icon name was "gnome-dev-cdrom-audio", the array + * would become + * |[ + * { + * "gnome-dev-cdrom-audio", + * "gnome-dev-cdrom", + * "gnome-dev", + * "gnome", + * NULL + * }; + * ]| + */ + g_object_class_install_property (gobject_class, PROP_USE_DEFAULT_FALLBACKS, + g_param_spec_boolean ("use-default-fallbacks", + P_("use default fallbacks"), + P_("Whether to use default fallbacks found by shortening the name at '-' characters. Ignores names after the first if multiple names are given."), + FALSE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); +} + +static void +g_themed_icon_init (GThemedIcon *themed) +{ + themed->names = NULL; +} + +/** + * g_themed_icon_new: + * @iconname: a string containing an icon name. + * + * Creates a new themed icon for @iconname. + * + * Returns: a new #GThemedIcon. + **/ +GIcon * +g_themed_icon_new (const char *iconname) +{ + g_return_val_if_fail (iconname != NULL, NULL); + + return G_ICON (g_object_new (G_TYPE_THEMED_ICON, "name", iconname, NULL)); +} + +/** + * g_themed_icon_new_from_names: + * @iconnames: an array of strings containing icon names. + * @len: the length of the @iconnames array, or -1 if @iconnames is + * %NULL-terminated + * + * Creates a new themed icon for @iconnames. + * + * Returns: a new #GThemedIcon + **/ +GIcon * +g_themed_icon_new_from_names (char **iconnames, + int len) +{ + GIcon *icon; + + g_return_val_if_fail (iconnames != NULL, NULL); + + if (len >= 0) + { + char **names; + int i; + + names = g_new (char *, len + 1); + + for (i = 0; i < len; i++) + names[i] = iconnames[i]; + + names[i] = NULL; + + icon = G_ICON (g_object_new (G_TYPE_THEMED_ICON, "names", names, NULL)); + + g_free (names); + } + else + icon = G_ICON (g_object_new (G_TYPE_THEMED_ICON, "names", iconnames, NULL)); + + return icon; +} + +/** + * g_themed_icon_new_with_default_fallbacks: + * @iconname: a string containing an icon name + * + * Creates a new themed icon for @iconname, and all the names + * that can be created by shortening @iconname at '-' characters. + * + * In the following example, @icon1 and @icon2 are equivalent: + * |[ + * const char *names[] = { + * "gnome-dev-cdrom-audio", + * "gnome-dev-cdrom", + * "gnome-dev", + * "gnome" + * }; + * + * icon1 = g_themed_icon_new_from_names (names, 4); + * icon2 = g_themed_icon_new_with_default_fallbacks ("gnome-dev-cdrom-audio"); + * ]| + * + * Returns: a new #GThemedIcon. + */ +GIcon * +g_themed_icon_new_with_default_fallbacks (const char *iconname) +{ + g_return_val_if_fail (iconname != NULL, NULL); + + return G_ICON (g_object_new (G_TYPE_THEMED_ICON, "name", iconname, "use-default-fallbacks", TRUE, NULL)); +} + + +/** + * g_themed_icon_get_names: + * @icon: a #GThemedIcon. + * + * Gets the names of icons from within @icon. + * + * Returns: a list of icon names. + */ +const char * const * +g_themed_icon_get_names (GThemedIcon *icon) +{ + g_return_val_if_fail (G_IS_THEMED_ICON (icon), NULL); + return (const char * const *)icon->names; +} + +/** + * g_themed_icon_append_name: + * @icon: a #GThemedIcon + * @iconname: name of icon to append to list of icons from within @icon. + * + * Append a name to the list of icons from within @icon. + * + * + * Note that doing so invalidates the hash computed by prior calls + * to g_icon_hash(). + * + */ +void +g_themed_icon_append_name (GThemedIcon *icon, + const char *iconname) +{ + guint num_names; + + g_return_if_fail (G_IS_THEMED_ICON (icon)); + g_return_if_fail (iconname != NULL); + + num_names = g_strv_length (icon->names); + icon->names = g_realloc (icon->names, sizeof (char*) * (num_names + 2)); + icon->names[num_names] = g_strdup (iconname); + icon->names[num_names + 1] = NULL; + + g_object_notify (G_OBJECT (icon), "names"); +} + +/** + * g_themed_icon_prepend_name: + * @icon: a #GThemedIcon + * @iconname: name of icon to prepend to list of icons from within @icon. + * + * Prepend a name to the list of icons from within @icon. + * + * + * Note that doing so invalidates the hash computed by prior calls + * to g_icon_hash(). + * + * + * Since: 2.18 + */ +void +g_themed_icon_prepend_name (GThemedIcon *icon, + const char *iconname) +{ + guint num_names; + gchar **names; + gint i; + + g_return_if_fail (G_IS_THEMED_ICON (icon)); + g_return_if_fail (iconname != NULL); + + num_names = g_strv_length (icon->names); + names = g_new (char*, num_names + 2); + for (i = 0; icon->names[i]; i++) + names[i + 1] = icon->names[i]; + names[0] = g_strdup (iconname); + names[num_names + 1] = NULL; + + g_free (icon->names); + icon->names = names; + + g_object_notify (G_OBJECT (icon), "names"); +} + +static guint +g_themed_icon_hash (GIcon *icon) +{ + GThemedIcon *themed = G_THEMED_ICON (icon); + guint hash; + int i; + + hash = 0; + + for (i = 0; themed->names[i] != NULL; i++) + hash ^= g_str_hash (themed->names[i]); + + return hash; +} + +static gboolean +g_themed_icon_equal (GIcon *icon1, + GIcon *icon2) +{ + GThemedIcon *themed1 = G_THEMED_ICON (icon1); + GThemedIcon *themed2 = G_THEMED_ICON (icon2); + int i; + + for (i = 0; themed1->names[i] != NULL && themed2->names[i] != NULL; i++) + { + if (!g_str_equal (themed1->names[i], themed2->names[i])) + return FALSE; + } + + return themed1->names[i] == NULL && themed2->names[i] == NULL; +} + + +static gboolean +g_themed_icon_to_tokens (GIcon *icon, + GPtrArray *tokens, + gint *out_version) +{ + GThemedIcon *themed_icon = G_THEMED_ICON (icon); + int n; + + g_return_val_if_fail (out_version != NULL, FALSE); + + *out_version = 0; + + for (n = 0; themed_icon->names[n] != NULL; n++) + g_ptr_array_add (tokens, + g_strdup (themed_icon->names[n])); + + return TRUE; +} + +static GIcon * +g_themed_icon_from_tokens (gchar **tokens, + gint num_tokens, + gint version, + GError **error) +{ + GIcon *icon; + gchar **names; + int n; + + icon = NULL; + + if (version != 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Can't handle version %d of GThemedIcon encoding"), + version); + goto out; + } + + names = g_new0 (gchar *, num_tokens + 1); + for (n = 0; n < num_tokens; n++) + names[n] = tokens[n]; + names[n] = NULL; + + icon = g_themed_icon_new_from_names (names, num_tokens); + g_free (names); + + out: + return icon; +} + +static void +g_themed_icon_icon_iface_init (GIconIface *iface) +{ + iface->hash = g_themed_icon_hash; + iface->equal = g_themed_icon_equal; + iface->to_tokens = g_themed_icon_to_tokens; + iface->from_tokens = g_themed_icon_from_tokens; +} + +#define __G_THEMED_ICON_C__ +#include "gioaliasdef.c" diff --git a/gio/gthemedicon.h b/gio/gthemedicon.h new file mode 100644 index 0000000..b0085e6 --- /dev/null +++ b/gio/gthemedicon.h @@ -0,0 +1,63 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_THEMED_ICON_H__ +#define __G_THEMED_ICON_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_THEMED_ICON (g_themed_icon_get_type ()) +#define G_THEMED_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_THEMED_ICON, GThemedIcon)) +#define G_THEMED_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_THEMED_ICON, GThemedIconClass)) +#define G_IS_THEMED_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_THEMED_ICON)) +#define G_IS_THEMED_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_THEMED_ICON)) +#define G_THEMED_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_THEMED_ICON, GThemedIconClass)) + +/** + * GThemedIcon: + * + * An implementation of #GIcon for themed icons. + **/ +typedef struct _GThemedIconClass GThemedIconClass; + +GType g_themed_icon_get_type (void) G_GNUC_CONST; + +GIcon *g_themed_icon_new (const char *iconname); +GIcon *g_themed_icon_new_with_default_fallbacks (const char *iconname); +GIcon *g_themed_icon_new_from_names (char **iconnames, + int len); +void g_themed_icon_prepend_name (GThemedIcon *icon, + const char *iconname); +void g_themed_icon_append_name (GThemedIcon *icon, + const char *iconname); + +const gchar* const * g_themed_icon_get_names (GThemedIcon *icon); + +G_END_DECLS + +#endif /* __G_THEMED_ICON_H__ */ diff --git a/gio/gthreadedresolver.c b/gio/gthreadedresolver.c new file mode 100644 index 0000000..bd7a829 --- /dev/null +++ b/gio/gthreadedresolver.c @@ -0,0 +1,620 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include +#include + +#include "gthreadedresolver.h" +#include "gnetworkingprivate.h" + +#include "gcancellable.h" +#include "gsimpleasyncresult.h" +#include "gsocketaddress.h" + +#include "gioalias.h" + +G_DEFINE_TYPE (GThreadedResolver, g_threaded_resolver, G_TYPE_RESOLVER) + +static void threaded_resolver_thread (gpointer thread_data, gpointer pool_data); + +static void +g_threaded_resolver_init (GThreadedResolver *gtr) +{ + if (g_thread_supported ()) + gtr->thread_pool = g_thread_pool_new (threaded_resolver_thread, gtr, + -1, FALSE, NULL); +} + +static void +finalize (GObject *object) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (object); + + g_thread_pool_free (gtr->thread_pool, FALSE, FALSE); + + G_OBJECT_CLASS (g_threaded_resolver_parent_class)->finalize (object); +} + +/* A GThreadedResolverRequest represents a request in progress + * (usually, but see case 1). It is refcounted, to make sure that it + * doesn't get freed too soon. In particular, it can't be freed until + * (a) the resolver thread has finished resolving, (b) the calling + * thread has received an answer, and (c) no other thread could be in + * the process of trying to cancel it. + * + * The possibilities: + * + * 1. Synchronous non-cancellable request: in this case, the request + * is simply done in the calling thread, without using + * GThreadedResolverRequest at all. + * + * 2. Synchronous cancellable request: A req is created with a GCond, + * and 3 refs (for the resolution thread, the calling thread, and + * the cancellation signal handler). + * + * a. If the resolution completes successfully, the thread pool + * function (threaded_resolver_thread()) will call + * g_threaded_resolver_request_complete(), which will detach + * the "cancelled" signal handler (dropping one ref on req) + * and signal the GCond, and then unref the req. The calling + * thread receives the signal from the GCond, processes the + * response, and unrefs the req, causing it to be freed. + * + * b. If the resolution is cancelled before completing, + * request_cancelled() will call + * g_threaded_resolver_request_complete(), which will detach + * the signal handler (as above, unreffing the req), set + * req->error to indicate that it was cancelled, and signal + * the GCond. The calling thread receives the signal from the + * GCond, processes the response, and unrefs the req. + * Eventually, the resolver thread finishes resolving (or + * times out in the resolver) and calls + * g_threaded_resolver_request_complete() again, but + * _request_complete() does nothing this time since the + * request is already complete. The thread pool func then + * unrefs the req, causing it to be freed. + * + * 3. Asynchronous request: A req is created with a GSimpleAsyncResult + * (and no GCond). The calling thread's ref on req is set up to be + * automatically dropped when the async_result is freed. Two + * sub-possibilities: + * + * a. If the resolution completes, the thread pool function + * (threaded_resolver_thread()) will call + * g_threaded_resolver_request_complete(), which will detach + * the "cancelled" signal handler (if it was present) + * (unreffing the req), queue the async_result to complete in + * an idle handler, unref the async_result (which is still + * reffed by the idle handler though), and then unref the req. + * The main thread then invokes the async_result's callback + * and processes the response. When it finishes, the + * async_result drops the ref that was taken by + * g_simple_async_result_complete_in_idle(), which causes the + * async_result to be freed, which causes req to be unreffed + * and freed. + * + * b. If the resolution is cancelled, request_cancelled() will + * call g_threaded_resolver_request_complete(), which will + * detach the signal handler (as above, unreffing the req) set + * req->error to indicate that it was cancelled, and queue and + * unref the async_result. The main thread completes the + * async_request and unrefs it and the req, as above. + * Eventually, the resolver thread finishes resolving (or + * times out in the resolver) and calls + * g_threaded_resolver_request_complete() again, but + * _request_complete() does nothing this time since the + * request is already complete. The thread pool func then + * unrefs the req, causing it to be freed. + * + * g_threaded_resolver_request_complete() ensures that if the request + * completes and cancels "at the same time" that only one of the two + * conditions gets processed. + */ + +typedef struct _GThreadedResolverRequest GThreadedResolverRequest; +typedef void (*GThreadedResolverResolveFunc) (GThreadedResolverRequest *, GError **); +typedef void (*GThreadedResolverFreeFunc) (GThreadedResolverRequest *); + +struct _GThreadedResolverRequest { + GThreadedResolverResolveFunc resolve_func; + GThreadedResolverFreeFunc free_func; + + union { + struct { + gchar *hostname; + GList *addresses; + } name; + struct { + GInetAddress *address; + gchar *name; + } address; + struct { + gchar *rrname; + GList *targets; + } service; + } u; + + GCancellable *cancellable; + GError *error; + + GMutex *mutex; + guint ref_count; + + GCond *cond; + GSimpleAsyncResult *async_result; + gboolean complete; + +}; + +static void g_threaded_resolver_request_unref (GThreadedResolverRequest *req); +static void request_cancelled (GCancellable *cancellable, gpointer req); +static void request_cancelled_disconnect_notify (gpointer req, GClosure *closure); + +static GThreadedResolverRequest * +g_threaded_resolver_request_new (GThreadedResolverResolveFunc resolve_func, + GThreadedResolverFreeFunc free_func, + GCancellable *cancellable) +{ + GThreadedResolverRequest *req; + + req = g_slice_new0 (GThreadedResolverRequest); + req->resolve_func = resolve_func; + req->free_func = free_func; + + /* Initial refcount is 2; one for the caller and one for resolve_func */ + req->ref_count = 2; + + if (g_thread_supported ()) + req->mutex = g_mutex_new (); + /* Initially locked; caller must unlock */ + g_mutex_lock (req->mutex); + + if (cancellable) + { + req->ref_count++; + req->cancellable = g_object_ref (cancellable); + g_signal_connect_data (cancellable, "cancelled", + G_CALLBACK (request_cancelled), req, + request_cancelled_disconnect_notify, 0); + } + + return req; +} + +static void +g_threaded_resolver_request_unref (GThreadedResolverRequest *req) +{ + guint ref_count; + + g_mutex_lock (req->mutex); + ref_count = --req->ref_count; + g_mutex_unlock (req->mutex); + if (ref_count > 0) + return; + + g_mutex_free (req->mutex); + + if (req->cond) + g_cond_free (req->cond); + + if (req->error) + g_error_free (req->error); + + if (req->free_func) + req->free_func (req); + + /* We don't have to free req->cancellable or req->async_result, + * since (if set), they must already have been freed by + * request_complete() in order to get here. + */ + + g_slice_free (GThreadedResolverRequest, req); +} + +static void +g_threaded_resolver_request_complete (GThreadedResolverRequest *req, + gboolean cancelled) +{ + g_mutex_lock (req->mutex); + if (req->complete) + { + /* The req was cancelled, and now it has finished resolving as + * well. But we have nowhere to send the result, so just return. + */ + g_mutex_unlock (req->mutex); + return; + } + + req->complete = TRUE; + g_mutex_unlock (req->mutex); + + if (req->cancellable) + { + /* Possibly propagate a cancellation error */ + if (cancelled && !req->error) + g_cancellable_set_error_if_cancelled (req->cancellable, &req->error); + + /* Drop the signal handler's ref on @req */ + g_signal_handlers_disconnect_by_func (req->cancellable, request_cancelled, req); + g_object_unref (req->cancellable); + req->cancellable = NULL; + } + + if (req->cond) + g_cond_signal (req->cond); + else if (req->async_result) + { + if (req->error) + g_simple_async_result_set_from_error (req->async_result, req->error); + g_simple_async_result_complete_in_idle (req->async_result); + + /* Drop our ref on the async_result, which will eventually cause + * it to drop its ref on req. + */ + g_object_unref (req->async_result); + req->async_result = NULL; + } +} + +static void +request_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + GThreadedResolverRequest *req = user_data; + + g_threaded_resolver_request_complete (req, TRUE); + + /* We can't actually cancel the resolver thread; it will eventually + * complete on its own and call request_complete() again, which will + * do nothing the second time. + */ +} + +static void +request_cancelled_disconnect_notify (gpointer req, + GClosure *closure) +{ + g_threaded_resolver_request_unref (req); +} + +static void +threaded_resolver_thread (gpointer thread_data, + gpointer pool_data) +{ + GThreadedResolverRequest *req = thread_data; + + req->resolve_func (req, &req->error); + g_threaded_resolver_request_complete (req, FALSE); + g_threaded_resolver_request_unref (req); +} + +static void +resolve_sync (GThreadedResolver *gtr, + GThreadedResolverRequest *req, + GError **error) +{ + if (!req->cancellable || !gtr->thread_pool) + { + req->resolve_func (req, error); + g_mutex_unlock (req->mutex); + + g_threaded_resolver_request_complete (req, FALSE); + g_threaded_resolver_request_unref (req); + return; + } + + req->cond = g_cond_new (); + g_thread_pool_push (gtr->thread_pool, req, NULL); + g_cond_wait (req->cond, req->mutex); + g_mutex_unlock (req->mutex); + + if (req->error) + { + g_propagate_error (error, req->error); + req->error = NULL; + } +} + +static void +resolve_async (GThreadedResolver *gtr, + GThreadedResolverRequest *req, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer tag) +{ + req->async_result = g_simple_async_result_new (G_OBJECT (gtr), + callback, user_data, tag); + g_simple_async_result_set_op_res_gpointer (req->async_result, req, + (GDestroyNotify)g_threaded_resolver_request_unref); + g_thread_pool_push (gtr->thread_pool, req, NULL); + g_mutex_unlock (req->mutex); +} + +static GThreadedResolverRequest * +resolve_finish (GResolver *resolver, + GAsyncResult *result, + gpointer tag, + GError **error) +{ + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), tag), NULL); + + return g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)); +} + +static void +do_lookup_by_name (GThreadedResolverRequest *req, + GError **error) +{ + struct addrinfo *res = NULL; + gint retval; + + retval = getaddrinfo (req->u.name.hostname, NULL, + &_g_resolver_addrinfo_hints, &res); + req->u.name.addresses = + _g_resolver_addresses_from_addrinfo (req->u.name.hostname, res, retval, error); + if (res) + freeaddrinfo (res); +} + +static GList * +lookup_by_name (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (resolver); + GThreadedResolverRequest *req; + GList *addresses; + + req = g_threaded_resolver_request_new (do_lookup_by_name, NULL, cancellable); + req->u.name.hostname = (gchar *)hostname; + resolve_sync (gtr, req, error); + + addresses = req->u.name.addresses; + g_threaded_resolver_request_unref (req); + return addresses; +} + +static void +free_lookup_by_name (GThreadedResolverRequest *req) +{ + g_free (req->u.name.hostname); + if (req->u.name.addresses) + g_resolver_free_addresses (req->u.name.addresses); +} + +static void +lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (resolver); + GThreadedResolverRequest *req; + + req = g_threaded_resolver_request_new (do_lookup_by_name, free_lookup_by_name, + cancellable); + req->u.name.hostname = g_strdup (hostname); + resolve_async (gtr, req, callback, user_data, lookup_by_name_async); +} + +static GList * +lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GThreadedResolverRequest *req; + GList *addresses; + + req = resolve_finish (resolver, result, lookup_by_name_async, error); + addresses = req->u.name.addresses; + req->u.name.addresses = NULL; + return addresses; +} + + +static void +do_lookup_by_address (GThreadedResolverRequest *req, + GError **error) +{ + struct sockaddr_storage sockaddr; + gsize sockaddr_size; + gchar name[NI_MAXHOST]; + gint retval; + + _g_resolver_address_to_sockaddr (req->u.address.address, + &sockaddr, &sockaddr_size); + + retval = getnameinfo ((struct sockaddr *)&sockaddr, sockaddr_size, + name, sizeof (name), NULL, 0, NI_NAMEREQD); + req->u.address.name = _g_resolver_name_from_nameinfo (req->u.address.address, + name, retval, error); +} + +static gchar * +lookup_by_address (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GError **error) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (resolver); + GThreadedResolverRequest *req; + gchar *name; + + req = g_threaded_resolver_request_new (do_lookup_by_address, NULL, cancellable); + req->u.address.address = address; + resolve_sync (gtr, req, error); + + name = req->u.address.name; + g_threaded_resolver_request_unref (req); + return name; +} + +static void +free_lookup_by_address (GThreadedResolverRequest *req) +{ + g_object_unref (req->u.address.address); + if (req->u.address.name) + g_free (req->u.address.name); +} + +static void +lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (resolver); + GThreadedResolverRequest *req; + + req = g_threaded_resolver_request_new (do_lookup_by_address, + free_lookup_by_address, + cancellable); + req->u.address.address = g_object_ref (address); + resolve_async (gtr, req, callback, user_data, lookup_by_address_async); +} + +static gchar * +lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GThreadedResolverRequest *req; + gchar *name; + + req = resolve_finish (resolver, result, lookup_by_address_async, error); + name = req->u.address.name; + req->u.address.name = NULL; + return name; +} + + +static void +do_lookup_service (GThreadedResolverRequest *req, + GError **error) +{ +#if defined(G_OS_UNIX) + gint len, herr; + guchar answer[1024]; +#elif defined(G_OS_WIN32) + DNS_STATUS status; + DNS_RECORD *results; +#endif + +#if defined(G_OS_UNIX) + len = res_query (req->u.service.rrname, C_IN, T_SRV, answer, sizeof (answer)); + herr = h_errno; + req->u.service.targets = _g_resolver_targets_from_res_query (req->u.service.rrname, answer, len, herr, error); +#elif defined(G_OS_WIN32) + status = DnsQuery_A (req->u.service.rrname, DNS_TYPE_SRV, + DNS_QUERY_STANDARD, NULL, &results, NULL); + req->u.service.targets = _g_resolver_targets_from_DnsQuery (req->u.service.rrname, status, results, error); + DnsRecordListFree (results, DnsFreeRecordList); +#endif +} + +static GList * +lookup_service (GResolver *resolver, + const gchar *rrname, + GCancellable *cancellable, + GError **error) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (resolver); + GThreadedResolverRequest *req; + GList *targets; + + req = g_threaded_resolver_request_new (do_lookup_service, NULL, cancellable); + req->u.service.rrname = (char *)rrname; + resolve_sync (gtr, req, error); + + targets = req->u.service.targets; + g_threaded_resolver_request_unref (req); + return targets; +} + +static void +free_lookup_service (GThreadedResolverRequest *req) +{ + g_free (req->u.service.rrname); + if (req->u.service.targets) + g_resolver_free_targets (req->u.service.targets); +} + +static void +lookup_service_async (GResolver *resolver, + const char *rrname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GThreadedResolver *gtr = G_THREADED_RESOLVER (resolver); + GThreadedResolverRequest *req; + + req = g_threaded_resolver_request_new (do_lookup_service, + free_lookup_service, + cancellable); + req->u.service.rrname = g_strdup (rrname); + resolve_async (gtr, req, callback, user_data, lookup_service_async); +} + +static GList * +lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GThreadedResolverRequest *req; + GList *targets; + + req = resolve_finish (resolver, result, lookup_service_async, error); + targets = req->u.service.targets; + req->u.service.targets = NULL; + return targets; +} + + +static void +g_threaded_resolver_class_init (GThreadedResolverClass *threaded_class) +{ + GResolverClass *resolver_class = G_RESOLVER_CLASS (threaded_class); + GObjectClass *object_class = G_OBJECT_CLASS (threaded_class); + + resolver_class->lookup_by_name = lookup_by_name; + resolver_class->lookup_by_name_async = lookup_by_name_async; + resolver_class->lookup_by_name_finish = lookup_by_name_finish; + resolver_class->lookup_by_address = lookup_by_address; + resolver_class->lookup_by_address_async = lookup_by_address_async; + resolver_class->lookup_by_address_finish = lookup_by_address_finish; + resolver_class->lookup_service = lookup_service; + resolver_class->lookup_service_async = lookup_service_async; + resolver_class->lookup_service_finish = lookup_service_finish; + + object_class->finalize = finalize; +} + +#define __G_THREADED_RESOLVER_C__ +#include "gioaliasdef.c" diff --git a/gio/gthreadedresolver.h b/gio/gthreadedresolver.h new file mode 100644 index 0000000..79d3327 --- /dev/null +++ b/gio/gthreadedresolver.h @@ -0,0 +1,50 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_THREADED_RESOLVER_H__ +#define __G_THREADED_RESOLVER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_THREADED_RESOLVER (g_threaded_resolver_get_type ()) +#define G_THREADED_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_THREADED_RESOLVER, GThreadedResolver)) +#define G_THREADED_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_THREADED_RESOLVER, GThreadedResolverClass)) +#define G_IS_THREADED_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_THREADED_RESOLVER)) +#define G_IS_THREADED_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_THREADED_RESOLVER)) +#define G_THREADED_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_THREADED_RESOLVER, GThreadedResolverClass)) + +typedef struct { + GResolver parent_instance; + + GThreadPool *thread_pool; +} GThreadedResolver; + +typedef struct { + GResolverClass parent_class; + +} GThreadedResolverClass; + +GType g_threaded_resolver_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_RESOLVER_H__ */ diff --git a/gio/gthreadedsocketservice.c b/gio/gthreadedsocketservice.c new file mode 100644 index 0000000..57ca737 --- /dev/null +++ b/gio/gthreadedsocketservice.c @@ -0,0 +1,278 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +/** + * SECTION: gthreadedsocketservice + * @title: GThreadedSocketService + * @short_description: A threaded GSocketService + * @see_also: #GSocketService. + * + * A #GThreadedSocketService is a simple subclass of #GSocketService + * that handles incoming connections by creating a worker thread and + * dispatching the connection to it by emitting the ::run signal in + * the new thread. + * + * The signal handler may perform blocking IO and need not return + * until the connection is closed. + * + * The service is implemented using a thread pool, so there is a + * limited amount of threads availible to serve incomming requests. + * The service automatically stops the #GSocketService from accepting + * new connections when all threads are busy. + * + * As with #GSocketService, you may connect to #GThreadedSocketService:run, + * or subclass and override the default handler. + */ + +#include "config.h" +#include "gsocketconnection.h" +#include "gthreadedsocketservice.h" +#include "glibintl.h" + +#include "gio-marshal.h" + +#include "gioalias.h" + +static guint g_threaded_socket_service_run_signal; + +G_DEFINE_TYPE (GThreadedSocketService, + g_threaded_socket_service, + G_TYPE_SOCKET_SERVICE); + +enum +{ + PROP_0, + PROP_MAX_THREADS +}; + + +G_LOCK_DEFINE_STATIC(job_count); + +struct _GThreadedSocketServicePrivate +{ + GThreadPool *thread_pool; + int max_threads; + gint job_count; +}; + +typedef struct +{ + GThreadedSocketService *service; + GSocketConnection *connection; + GObject *source_object; +} GThreadedSocketServiceData; + +static void +g_threaded_socket_service_func (gpointer _data, + gpointer user_data) +{ + GThreadedSocketService *threaded = user_data; + GThreadedSocketServiceData *data = _data; + gboolean result; + + g_signal_emit (data->service, g_threaded_socket_service_run_signal, + 0, data->connection, data->source_object, &result); + + g_object_unref (data->service); + g_object_unref (data->connection); + if (data->source_object) + g_object_unref (data->source_object); + g_slice_free (GThreadedSocketServiceData, data); + + G_LOCK (job_count); + if (threaded->priv->job_count-- == threaded->priv->max_threads) + g_socket_service_start (G_SOCKET_SERVICE (threaded)); + G_UNLOCK (job_count); +} + +static gboolean +g_threaded_socket_service_incoming (GSocketService *service, + GSocketConnection *connection, + GObject *source_object) +{ + GThreadedSocketService *threaded; + GThreadedSocketServiceData *data; + + threaded = G_THREADED_SOCKET_SERVICE (service); + + data = g_slice_new (GThreadedSocketServiceData); + data->service = g_object_ref (service); + data->connection = g_object_ref (connection); + if (source_object) + data->source_object = g_object_ref (source_object); + else + data->source_object = NULL; + + G_LOCK (job_count); + if (++threaded->priv->job_count == threaded->priv->max_threads) + g_socket_service_stop (service); + G_UNLOCK (job_count); + + g_thread_pool_push (threaded->priv->thread_pool, data, NULL); + + + + return FALSE; +} + +static void +g_threaded_socket_service_init (GThreadedSocketService *service) +{ + service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service, + G_TYPE_THREADED_SOCKET_SERVICE, + GThreadedSocketServicePrivate); + service->priv->max_threads = 10; +} + +static void +g_threaded_socket_service_constructed (GObject *object) +{ + GThreadedSocketService *service = G_THREADED_SOCKET_SERVICE (object); + + service->priv->thread_pool = + g_thread_pool_new (g_threaded_socket_service_func, + service, + service->priv->max_threads, + FALSE, + NULL); +} + + +static void +g_threaded_socket_service_finalize (GObject *object) +{ + GThreadedSocketService *service = G_THREADED_SOCKET_SERVICE (object); + + g_thread_pool_free (service->priv->thread_pool, FALSE, TRUE); + + G_OBJECT_CLASS (g_threaded_socket_service_parent_class) + ->finalize (object); +} + +static void +g_threaded_socket_service_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GThreadedSocketService *service = G_THREADED_SOCKET_SERVICE (object); + + switch (prop_id) + { + case PROP_MAX_THREADS: + g_value_set_int (value, service->priv->max_threads); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_threaded_socket_service_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GThreadedSocketService *service = G_THREADED_SOCKET_SERVICE (object); + + switch (prop_id) + { + case PROP_MAX_THREADS: + service->priv->max_threads = g_value_get_int (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + + +static void +g_threaded_socket_service_class_init (GThreadedSocketServiceClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GSocketServiceClass *ss_class = &class->parent_class; + + g_type_class_add_private (class, sizeof (GThreadedSocketServicePrivate)); + + gobject_class->constructed = g_threaded_socket_service_constructed; + gobject_class->finalize = g_threaded_socket_service_finalize; + gobject_class->set_property = g_threaded_socket_service_set_property; + gobject_class->get_property = g_threaded_socket_service_get_property; + + ss_class->incoming = g_threaded_socket_service_incoming; + + /** + * GThreadedSocketService::run: + * @service: the #GThreadedSocketService. + * @connection: a new #GSocketConnection object. + * @source_object: the source_object passed to g_socket_listener_add_address(). + * + * The ::run signal is emitted in a worker thread in response to an + * incoming connection. This thread is dedicated to handling + * @connection and may perform blocking IO. The signal handler need + * not return until the connection is closed. + * + * Returns: %TRUE to stope further signal handlers from being called + */ + g_threaded_socket_service_run_signal = + g_signal_new ("run", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GThreadedSocketServiceClass, run), + g_signal_accumulator_true_handled, NULL, + _gio_marshal_BOOLEAN__OBJECT_OBJECT, G_TYPE_BOOLEAN, + 2, G_TYPE_SOCKET_CONNECTION, G_TYPE_OBJECT); + + g_object_class_install_property (gobject_class, PROP_MAX_THREADS, + g_param_spec_int ("max-threads", + P_("Max threads"), + P_("The max number of threads handling clients for this service"), + -1, + G_MAXINT, + 10, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +/** + * g_threaded_socket_service_new: + * @max_threads: the maximal number of threads to execute concurrently + * handling incoming clients, -1 means no limit + * + * Creates a new #GThreadedSocketService with no listeners. Listeners + * must be added with g_socket_service_add_listeners(). + * + * Returns: a new #GSocketService. + * + * Since: 2.22 + */ +GSocketService * +g_threaded_socket_service_new (int max_threads) +{ + return g_object_new (G_TYPE_THREADED_SOCKET_SERVICE, + "max-threads", max_threads, + NULL); +} + +#define __G_THREADED_SOCKET_SERVICE_C__ +#include "gioaliasdef.c" diff --git a/gio/gthreadedsocketservice.h b/gio/gthreadedsocketservice.h new file mode 100644 index 0000000..f947090 --- /dev/null +++ b/gio/gthreadedsocketservice.h @@ -0,0 +1,81 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * Copyright © 2009 Red Hat, Inc + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + * Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_THREADED_SOCKET_SERVICE_H__ +#define __G_THREADED_SOCKET_SERVICE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_THREADED_SOCKET_SERVICE (g_threaded_socket_service_get_type ()) +#define G_THREADED_SOCKET_SERVICE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_THREADED_SOCKET_SERVICE, \ + GThreadedSocketService)) +#define G_THREADED_SOCKET_SERVICE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_THREADED_SOCKET_SERVICE, \ + GThreadedSocketServiceClass)) +#define G_IS_THREADED_SOCKET_SERVICE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_THREADED_SOCKET_SERVICE)) +#define G_IS_THREADED_SOCKET_SERVICE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_THREADED_SOCKET_SERVICE)) +#define G_THREADED_SOCKET_SERVICE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_THREADED_SOCKET_SERVICE, \ + GThreadedSocketServiceClass)) + +typedef struct _GThreadedSocketServicePrivate GThreadedSocketServicePrivate; +typedef struct _GThreadedSocketServiceClass GThreadedSocketServiceClass; + +struct _GThreadedSocketServiceClass +{ + GSocketServiceClass parent_class; + + gboolean (* run) (GThreadedSocketService *service, + GSocketConnection *connection, + GObject *source_object); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +struct _GThreadedSocketService +{ + GSocketService parent_instance; + GThreadedSocketServicePrivate *priv; +}; + +GType g_threaded_socket_service_get_type (void); +GSocketService * g_threaded_socket_service_new (int max_threads); + +G_END_DECLS + +#endif /* __G_THREADED_SOCKET_SERVICE_H__ */ diff --git a/gio/gunionvolumemonitor.c b/gio/gunionvolumemonitor.c new file mode 100644 index 0000000..a0a3634 --- /dev/null +++ b/gio/gunionvolumemonitor.c @@ -0,0 +1,695 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" + +#include + +#include +#include "gunionvolumemonitor.h" +#include "gmountprivate.h" +#include "giomodule-priv.h" +#ifdef G_OS_UNIX +#include "gunixvolumemonitor.h" +#endif +#include "gnativevolumemonitor.h" + +#include "glibintl.h" + +#include "gioalias.h" + +struct _GUnionVolumeMonitor { + GVolumeMonitor parent; + + GList *monitors; +}; + +static void g_union_volume_monitor_remove_monitor (GUnionVolumeMonitor *union_monitor, + GVolumeMonitor *child_monitor); + + +#define g_union_volume_monitor_get_type _g_union_volume_monitor_get_type +G_DEFINE_TYPE (GUnionVolumeMonitor, g_union_volume_monitor, G_TYPE_VOLUME_MONITOR); + +static GStaticRecMutex the_volume_monitor_mutex = G_STATIC_REC_MUTEX_INIT; + +static GUnionVolumeMonitor *the_volume_monitor = NULL; + +static void +g_union_volume_monitor_finalize (GObject *object) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + + monitor = G_UNION_VOLUME_MONITOR (object); + + while (monitor->monitors != NULL) + { + child_monitor = monitor->monitors->data; + g_union_volume_monitor_remove_monitor (monitor, + child_monitor); + g_object_unref (child_monitor); + } + + G_OBJECT_CLASS (g_union_volume_monitor_parent_class)->finalize (object); +} + +static void +g_union_volume_monitor_dispose (GObject *object) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + GList *l; + + monitor = G_UNION_VOLUME_MONITOR (object); + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + the_volume_monitor = NULL; + + for (l = monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + g_object_run_dispose (G_OBJECT (child_monitor)); + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + G_OBJECT_CLASS (g_union_volume_monitor_parent_class)->dispose (object); +} + +static GList * +get_mounts (GVolumeMonitor *volume_monitor) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + GList *res; + GList *l; + + monitor = G_UNION_VOLUME_MONITOR (volume_monitor); + + res = NULL; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + for (l = monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + + res = g_list_concat (res, g_volume_monitor_get_mounts (child_monitor)); + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return res; +} + +static GList * +get_volumes (GVolumeMonitor *volume_monitor) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + GList *res; + GList *l; + + monitor = G_UNION_VOLUME_MONITOR (volume_monitor); + + res = NULL; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + for (l = monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + + res = g_list_concat (res, g_volume_monitor_get_volumes (child_monitor)); + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return res; +} + +static GList * +get_connected_drives (GVolumeMonitor *volume_monitor) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + GList *res; + GList *l; + + monitor = G_UNION_VOLUME_MONITOR (volume_monitor); + + res = NULL; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + for (l = monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + + res = g_list_concat (res, g_volume_monitor_get_connected_drives (child_monitor)); + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return res; +} + +static GVolume * +get_volume_for_uuid (GVolumeMonitor *volume_monitor, const char *uuid) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + GVolume *volume; + GList *l; + + monitor = G_UNION_VOLUME_MONITOR (volume_monitor); + + volume = NULL; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + for (l = monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + + volume = g_volume_monitor_get_volume_for_uuid (child_monitor, uuid); + if (volume != NULL) + break; + + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return volume; +} + +static GMount * +get_mount_for_uuid (GVolumeMonitor *volume_monitor, const char *uuid) +{ + GUnionVolumeMonitor *monitor; + GVolumeMonitor *child_monitor; + GMount *mount; + GList *l; + + monitor = G_UNION_VOLUME_MONITOR (volume_monitor); + + mount = NULL; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + for (l = monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + + mount = g_volume_monitor_get_mount_for_uuid (child_monitor, uuid); + if (mount != NULL) + break; + + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return mount; +} + +static void +g_union_volume_monitor_class_init (GUnionVolumeMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GVolumeMonitorClass *monitor_class = G_VOLUME_MONITOR_CLASS (klass); + + gobject_class->finalize = g_union_volume_monitor_finalize; + gobject_class->dispose = g_union_volume_monitor_dispose; + + monitor_class->get_connected_drives = get_connected_drives; + monitor_class->get_volumes = get_volumes; + monitor_class->get_mounts = get_mounts; + monitor_class->get_volume_for_uuid = get_volume_for_uuid; + monitor_class->get_mount_for_uuid = get_mount_for_uuid; +} + +static void +child_volume_added (GVolumeMonitor *child_monitor, + GVolume *child_volume, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "volume-added", + child_volume); +} + +static void +child_volume_removed (GVolumeMonitor *child_monitor, + GVolume *child_volume, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "volume-removed", + child_volume); +} + +static void +child_volume_changed (GVolumeMonitor *child_monitor, + GVolume *child_volume, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "volume-changed", + child_volume); +} + +static void +child_mount_added (GVolumeMonitor *child_monitor, + GMount *child_mount, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "mount-added", + child_mount); +} + +static void +child_mount_removed (GVolumeMonitor *child_monitor, + GMount *child_mount, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "mount-removed", + child_mount); +} + +static void +child_mount_pre_unmount (GVolumeMonitor *child_monitor, + GMount *child_mount, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "mount-pre-unmount", + child_mount); +} + + +static void +child_mount_changed (GVolumeMonitor *child_monitor, + GMount *child_mount, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "mount-changed", + child_mount); +} + +static void +child_drive_connected (GVolumeMonitor *child_monitor, + GDrive *child_drive, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "drive-connected", + child_drive); +} + +static void +child_drive_disconnected (GVolumeMonitor *child_monitor, + GDrive *child_drive, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "drive-disconnected", + child_drive); +} + +static void +child_drive_changed (GVolumeMonitor *child_monitor, + GDrive *child_drive, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "drive-changed", + child_drive); +} + +static void +child_drive_eject_button (GVolumeMonitor *child_monitor, + GDrive *child_drive, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "drive-eject-button", + child_drive); +} + +static void +child_drive_stop_button (GVolumeMonitor *child_monitor, + GDrive *child_drive, + GUnionVolumeMonitor *union_monitor) +{ + g_signal_emit_by_name (union_monitor, + "drive-stop-button", + child_drive); +} + +static void +g_union_volume_monitor_add_monitor (GUnionVolumeMonitor *union_monitor, + GVolumeMonitor *volume_monitor) +{ + if (g_list_find (union_monitor->monitors, volume_monitor)) + return; + + union_monitor->monitors = + g_list_prepend (union_monitor->monitors, + g_object_ref (volume_monitor)); + + g_signal_connect (volume_monitor, "volume-added", (GCallback)child_volume_added, union_monitor); + g_signal_connect (volume_monitor, "volume-removed", (GCallback)child_volume_removed, union_monitor); + g_signal_connect (volume_monitor, "volume-changed", (GCallback)child_volume_changed, union_monitor); + g_signal_connect (volume_monitor, "mount-added", (GCallback)child_mount_added, union_monitor); + g_signal_connect (volume_monitor, "mount-removed", (GCallback)child_mount_removed, union_monitor); + g_signal_connect (volume_monitor, "mount-pre-unmount", (GCallback)child_mount_pre_unmount, union_monitor); + g_signal_connect (volume_monitor, "mount-changed", (GCallback)child_mount_changed, union_monitor); + g_signal_connect (volume_monitor, "drive-connected", (GCallback)child_drive_connected, union_monitor); + g_signal_connect (volume_monitor, "drive-disconnected", (GCallback)child_drive_disconnected, union_monitor); + g_signal_connect (volume_monitor, "drive-changed", (GCallback)child_drive_changed, union_monitor); + g_signal_connect (volume_monitor, "drive-eject-button", (GCallback)child_drive_eject_button, union_monitor); + g_signal_connect (volume_monitor, "drive-stop-button", (GCallback)child_drive_stop_button, union_monitor); +} + +static void +g_union_volume_monitor_remove_monitor (GUnionVolumeMonitor *union_monitor, + GVolumeMonitor *child_monitor) +{ + GList *l; + + l = g_list_find (union_monitor->monitors, child_monitor); + if (l == NULL) + return; + + union_monitor->monitors = g_list_delete_link (union_monitor->monitors, l); + + g_signal_handlers_disconnect_by_func (child_monitor, child_volume_added, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_volume_removed, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_volume_changed, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_mount_added, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_mount_removed, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_mount_pre_unmount, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_mount_changed, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_drive_connected, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_drive_disconnected, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_drive_changed, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_drive_eject_button, union_monitor); + g_signal_handlers_disconnect_by_func (child_monitor, child_drive_stop_button, union_monitor); +} + +static GType +get_default_native_class (gpointer data) +{ + GNativeVolumeMonitorClass *klass, *native_class, **native_class_out; + const char *use_this; + GIOExtensionPoint *ep; + GIOExtension *extension; + GList *l; + + native_class_out = data; + + use_this = g_getenv ("GIO_USE_VOLUME_MONITOR"); + + /* Ensure vfs in modules loaded */ + _g_io_modules_ensure_loaded (); + + ep = g_io_extension_point_lookup (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME); + + native_class = NULL; + if (use_this) + { + extension = g_io_extension_point_get_extension_by_name (ep, use_this); + if (extension) + { + klass = G_NATIVE_VOLUME_MONITOR_CLASS (g_io_extension_ref_class (extension)); + if (G_VOLUME_MONITOR_CLASS (klass)->is_supported()) + native_class = klass; + else + g_type_class_unref (klass); + } + } + + if (native_class == NULL) + { + for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) + { + extension = l->data; + klass = G_NATIVE_VOLUME_MONITOR_CLASS (g_io_extension_ref_class (extension)); + if (G_VOLUME_MONITOR_CLASS (klass)->is_supported()) + { + native_class = klass; + break; + } + else + g_type_class_unref (klass); + } + } + + if (native_class) + { + *native_class_out = native_class; + return G_TYPE_FROM_CLASS (native_class); + } + else + return G_TYPE_INVALID; +} + +/* We return the class, with a ref taken. + * This way we avoid unloading the class/module + * between selecting the type and creating the + * instance on the first call. + */ +static GNativeVolumeMonitorClass * +get_native_class (void) +{ + static GOnce once_init = G_ONCE_INIT; + GTypeClass *type_class; + + type_class = NULL; + g_once (&once_init, (GThreadFunc)get_default_native_class, &type_class); + + if (type_class == NULL && once_init.retval != GUINT_TO_POINTER(G_TYPE_INVALID)) + type_class = g_type_class_ref ((GType)once_init.retval); + + return (GNativeVolumeMonitorClass *)type_class; +} + +static void +g_union_volume_monitor_init (GUnionVolumeMonitor *union_monitor) +{ +} + +static void +populate_union_monitor (GUnionVolumeMonitor *union_monitor) +{ + GVolumeMonitor *monitor; + GNativeVolumeMonitorClass *native_class; + GVolumeMonitorClass *klass; + GIOExtensionPoint *ep; + GIOExtension *extension; + GList *l; + + native_class = get_native_class (); + + if (native_class != NULL) + { + monitor = g_object_new (G_TYPE_FROM_CLASS (native_class), NULL); + g_union_volume_monitor_add_monitor (union_monitor, monitor); + g_object_unref (monitor); + g_type_class_unref (native_class); + } + + ep = g_io_extension_point_lookup (G_VOLUME_MONITOR_EXTENSION_POINT_NAME); + for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) + { + extension = l->data; + + klass = G_VOLUME_MONITOR_CLASS (g_io_extension_ref_class (extension)); + if (klass->is_supported == NULL || klass->is_supported()) + { + monitor = g_object_new (g_io_extension_get_type (extension), NULL); + g_union_volume_monitor_add_monitor (union_monitor, monitor); + g_object_unref (monitor); + } + g_type_class_unref (klass); + } +} + +static GUnionVolumeMonitor * +g_union_volume_monitor_new (void) +{ + GUnionVolumeMonitor *monitor; + + monitor = g_object_new (G_TYPE_UNION_VOLUME_MONITOR, NULL); + + return monitor; +} + +/** + * g_volume_monitor_get: + * + * Gets the volume monitor used by gio. + * + * Returns: a reference to the #GVolumeMonitor used by gio. Call + * g_object_unref() when done with it. + **/ +GVolumeMonitor * +g_volume_monitor_get (void) +{ + GVolumeMonitor *vm; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + if (the_volume_monitor) + vm = G_VOLUME_MONITOR (g_object_ref (the_volume_monitor)); + else + { + the_volume_monitor = g_union_volume_monitor_new (); + populate_union_monitor (the_volume_monitor); + vm = G_VOLUME_MONITOR (the_volume_monitor); + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return vm; +} + +GMount * +_g_mount_get_for_mount_path (const gchar *mount_path, + GCancellable *cancellable) +{ + GNativeVolumeMonitorClass *klass; + GMount *mount; + + klass = get_native_class (); + if (klass == NULL) + return NULL; + + mount = NULL; + + if (klass->get_mount_for_mount_path) + { + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + mount = klass->get_mount_for_mount_path (mount_path, cancellable); + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + } + + /* TODO: How do we know this succeeded? Keep in mind that the native + * volume monitor may fail (e.g. not being able to connect to + * hald). Is the get_mount_for_mount_path() method allowed to + * return NULL? Seems like it is ... probably the method needs + * to take a boolean and write if it succeeds or not.. Messy. + * Very messy. + */ + + g_type_class_unref (klass); + + return mount; +} + +/** + * g_volume_monitor_adopt_orphan_mount: + * @mount: a #GMount object to find a parent for + * + * This function should be called by any #GVolumeMonitor + * implementation when a new #GMount object is created that is not + * associated with a #GVolume object. It must be called just before + * emitting the @mount_added signal. + * + * If the return value is not %NULL, the caller must associate the + * returned #GVolume object with the #GMount. This involves returning + * it in its g_mount_get_volume() implementation. The caller must + * also listen for the "removed" signal on the returned object + * and give up its reference when handling that signal + * + * Similary, if implementing g_volume_monitor_adopt_orphan_mount(), + * the implementor must take a reference to @mount and return it in + * its g_volume_get_mount() implemented. Also, the implementor must + * listen for the "unmounted" signal on @mount and give up its + * reference upon handling that signal. + * + * There are two main use cases for this function. + * + * One is when implementing a user space file system driver that reads + * blocks of a block device that is already represented by the native + * volume monitor (for example a CD Audio file system driver). Such + * a driver will generate its own #GMount object that needs to be + * assoicated with the #GVolume object that represents the volume. + * + * The other is for implementing a #GVolumeMonitor whose sole purpose + * is to return #GVolume objects representing entries in the users + * "favorite servers" list or similar. + * + * Returns: the #GVolume object that is the parent for @mount or %NULL + * if no wants to adopt the #GMount. + * + * Deprecated: 2.20: Instead of using this function, #GVolumeMonitor + * implementations should instead create shadow mounts with the URI of + * the mount they intend to adopt. See the proxy volume monitor in + * gvfs for an example of this. Also see g_mount_is_shadowed(), + * g_mount_shadow() and g_mount_unshadow() functions. + */ +GVolume * +g_volume_monitor_adopt_orphan_mount (GMount *mount) +{ + GVolumeMonitor *child_monitor; + GVolumeMonitorClass *child_monitor_class; + GVolume *volume; + GList *l; + + g_return_val_if_fail (mount != NULL, NULL); + + if (the_volume_monitor == NULL) + return NULL; + + volume = NULL; + + g_static_rec_mutex_lock (&the_volume_monitor_mutex); + + for (l = the_volume_monitor->monitors; l != NULL; l = l->next) + { + child_monitor = l->data; + child_monitor_class = G_VOLUME_MONITOR_GET_CLASS (child_monitor); + + if (child_monitor_class->adopt_orphan_mount != NULL) + { + volume = child_monitor_class->adopt_orphan_mount (mount, child_monitor); + if (volume != NULL) + break; + } + } + + g_static_rec_mutex_unlock (&the_volume_monitor_mutex); + + return volume; +} + + +#define __G_UNION_VOLUME_MONITOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gunionvolumemonitor.h b/gio/gunionvolumemonitor.h new file mode 100644 index 0000000..2924b66 --- /dev/null +++ b/gio/gunionvolumemonitor.h @@ -0,0 +1,49 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#ifndef __G_UNION_VOLUME_MONITOR_H__ +#define __G_UNION_VOLUME_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNION_VOLUME_MONITOR (_g_union_volume_monitor_get_type ()) +#define G_UNION_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNION_VOLUME_MONITOR, GUnionVolumeMonitor)) +#define G_UNION_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNION_VOLUME_MONITOR, GUnionVolumeMonitorClass)) +#define G_IS_UNION_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNION_VOLUME_MONITOR)) +#define G_IS_UNION_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNION_VOLUME_MONITOR)) + +typedef struct _GUnionVolumeMonitor GUnionVolumeMonitor; +typedef struct _GUnionVolumeMonitorClass GUnionVolumeMonitorClass; + +struct _GUnionVolumeMonitorClass +{ + GVolumeMonitorClass parent_class; +}; + +GType _g_union_volume_monitor_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_UNION_VOLUME_MONITOR_H__ */ diff --git a/gio/gunixconnection.c b/gio/gunixconnection.c new file mode 100644 index 0000000..92ad246 --- /dev/null +++ b/gio/gunixconnection.c @@ -0,0 +1,291 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Ryan Lortie + */ + +#include "config.h" +#include "gunixconnection.h" +#include "glibintl.h" + +/** + * SECTION: gunixconnection + * @title: GUnixConnection + * @short_description: a Unix domain #GSocketConnection + * @see_also: #GSocketConnection. + * + * This is the subclass of #GSocketConnection that is created + * for UNIX domain sockets. + * + * It contains functions to do some of the unix socket specific + * functionallity like passing file descriptors. + * + * Since: 2.22 + */ + +#include +#include +#include +#include + +#include "gioalias.h" + +G_DEFINE_TYPE_WITH_CODE (GUnixConnection, g_unix_connection, + G_TYPE_SOCKET_CONNECTION, + g_socket_connection_factory_register_type (g_define_type_id, + G_SOCKET_FAMILY_UNIX, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT); + ); + +/** + * g_unix_connection_send_fd: + * @connection: a #GUnixConnection + * @fd: a file descriptor + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Passes a file descriptor to the recieving side of the + * connection. The recieving end has to call g_unix_connection_receive_fd() + * to accept the file descriptor. + * + * As well as sending the fd this also writes a single byte to the + * stream, as this is required for fd passing to work on some + * implementations. + * + * Returns: a %TRUE on success, %NULL on error. + * + * Since: 2.22 + */ +gboolean +g_unix_connection_send_fd (GUnixConnection *connection, + gint fd, + GCancellable *cancellable, + GError **error) +{ + GSocketControlMessage *scm; + GSocket *socket; + + g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), FALSE); + g_return_val_if_fail (fd >= 0, FALSE); + + scm = g_unix_fd_message_new (); + + if (!g_unix_fd_message_append_fd (G_UNIX_FD_MESSAGE (scm), fd, error)) + { + g_object_unref (scm); + return FALSE; + } + + g_object_get (connection, "socket", &socket, NULL); + if (g_socket_send_message (socket, NULL, NULL, 0, &scm, 1, 0, cancellable, error) != 1) + /* XXX could it 'fail' with zero? */ + { + g_object_unref (socket); + g_object_unref (scm); + + return FALSE; + } + + g_object_unref (socket); + g_object_unref (scm); + + return TRUE; +} + +/** + * g_unix_connection_receive_fd: + * @connection: a #GUnixConnection + * @cancellable: optional #GCancellable object, %NULL to ignore + * @error: #GError for error reporting, or %NULL to ignore + * + * Receives a file descriptor from the sending end of the connection. + * The sending end has to call g_unix_connection_send_fd() for this + * to work. + * + * As well as reading the fd this also reads a single byte from the + * stream, as this is required for fd passing to work on some + * implementations. + * + * Returns: a file descriptor on success, -1 on error. + * + * Since: 2.22 + */ +gint +g_unix_connection_receive_fd (GUnixConnection *connection, + GCancellable *cancellable, + GError **error) +{ + GSocketControlMessage **scms; + gint *fds, nfd, fd, nscm; + GUnixFDMessage *fdmsg; + GSocket *socket; + + g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), -1); + + g_object_get (connection, "socket", &socket, NULL); + if (g_socket_receive_message (socket, NULL, NULL, 0, + &scms, &nscm, NULL, cancellable, error) != 1) + /* XXX it _could_ 'fail' with zero. */ + { + g_object_unref (socket); + + return -1; + } + + g_object_unref (socket); + + if (nscm != 1) + { + gint i; + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Expecting 1 control message, got %d"), nscm); + + for (i = 0; i < nscm; i++) + g_object_unref (scms[i]); + + g_free (scms); + + return -1; + } + + if (!G_IS_UNIX_FD_MESSAGE (scms[0])) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unexpected type of ancillary data")); + g_object_unref (scms[0]); + g_free (scms); + + return -1; + } + + fdmsg = G_UNIX_FD_MESSAGE (scms[0]); + g_free (scms); + + fds = g_unix_fd_message_steal_fds (fdmsg, &nfd); + g_object_unref (fdmsg); + + if (nfd != 1) + { + gint i; + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Expecting one fd, but got %d\n"), nfd); + + for (i = 0; i < nfd; i++) + close (fds[i]); + + g_free (fds); + + return -1; + } + + fd = *fds; + g_free (fds); + + if (fd < 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Received invalid fd")); + fd = -1; + } + + return fd; +} + +static void +g_unix_connection_init (GUnixConnection *connection) +{ +} + +static void +g_unix_connection_class_init (GUnixConnectionClass *class) +{ +} + +/* TODO: Other stuff we might want to add are: +void g_unix_connection_send_fd_async (GUnixConnection *connection, + gint fd, + gboolean close, + gint io_priority, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_unix_connection_send_fd_finish (GUnixConnection *connection, + GError **error); + +gboolean g_unix_connection_send_fds (GUnixConnection *connection, + gint *fds, + gint nfds, + GError **error); +void g_unix_connection_send_fds_async (GUnixConnection *connection, + gint *fds, + gint nfds, + gint io_priority, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_unix_connection_send_fds_finish (GUnixConnection *connection, + GError **error); + +void g_unix_connection_receive_fd_async (GUnixConnection *connection, + gint io_priority, + GAsyncReadyCallback callback, + gpointer user_data); +gint g_unix_connection_receive_fd_finish (GUnixConnection *connection, + GError **error); + + +gboolean g_unix_connection_send_credentials (GUnixConnection *connection, + GError **error); +void g_unix_connection_send_credentials_async (GUnixConnection *connection, + gint io_priority, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_unix_connection_send_credentials_finish (GUnixConnection *connection, + GError **error); + +gboolean g_unix_connection_send_fake_credentials (GUnixConnection *connection, + guint64 pid, + guint64 uid, + guint64 gid, + GError **error); +void g_unix_connection_send_fake_credentials_async (GUnixConnection *connection, + guint64 pid, + guint64 uid, + guint64 gid, + gint io_priority, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_unix_connection_send_fake_credentials_finish (GUnixConnection *connection, + GError **error); + +gboolean g_unix_connection_receive_credentials (GUnixConnection *connection, + guint64 *pid, + guint64 *uid, + guint64 *gid, + GError **error); +void g_unix_connection_receive_credentials_async (GUnixConnection *connection, + gint io_priority, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_unix_connection_receive_credentials_finish (GUnixConnection *connection, + guint64 *pid, + guint64 *uid, + guint64 *gid, + GError **error); + +gboolean g_unix_connection_create_pair (GUnixConnection **one, + GUnixConnection **two, + GError **error); +*/ + +#define __G_UNIX_CONNECTION_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixconnection.h b/gio/gunixconnection.h new file mode 100644 index 0000000..7435e97 --- /dev/null +++ b/gio/gunixconnection.h @@ -0,0 +1,76 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + */ + +#ifndef __G_UNIX_CONNECTION_H__ +#define __G_UNIX_CONNECTION_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_CONNECTION (g_unix_connection_get_type ()) +#define G_UNIX_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_UNIX_CONNECTION, GUnixConnection)) +#define G_UNIX_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_UNIX_CONNECTION, GUnixConnectionClass)) +#define G_IS_UNIX_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_UNIX_CONNECTION)) +#define G_IS_UNIX_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_UNIX_CONNECTION)) +#define G_UNIX_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_UNIX_CONNECTION, GUnixConnectionClass)) + +/** + * GTcpConnection: + * + * A #GSocketConnection for UNIX domain socket connections. + * + * Since: 2.22 + */ +typedef struct _GUnixConnection GUnixConnection; +typedef struct _GUnixConnectionPrivate GUnixConnectionPrivate; +typedef struct _GUnixConnectionClass GUnixConnectionClass; + +struct _GUnixConnectionClass +{ + GSocketConnectionClass parent_class; +}; + +struct _GUnixConnection +{ + GSocketConnection parent_instance; + GUnixConnectionPrivate *priv; +}; + +GType g_unix_connection_get_type (void); + +gboolean g_unix_connection_send_fd (GUnixConnection *connection, + gint fd, + GCancellable *cancellable, + GError **error); +gint g_unix_connection_receive_fd (GUnixConnection *connection, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_UNIX_CONNECTION_H__ */ diff --git a/gio/gunixfdlist.c b/gio/gunixfdlist.c new file mode 100644 index 0000000..026c127 --- /dev/null +++ b/gio/gunixfdlist.c @@ -0,0 +1,396 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Ryan Lortie + */ + +/** + * SECTION: gunixfdlist + * @title: GUnixFDList + * @short_description: An object containing a set of file descriptors + * @see_also: #GUnixFDMessage + * + * A #GUnixFDList contains a list of file descriptors. It owns the file + * descriptors that it contains, closing them when finalized. + * + * It may be wrapped in a #GUnixFDMessage and sent over a #GSocket in + * the %G_SOCKET_ADDRESS_UNIX family by using g_socket_send_message() + * and received using g_socket_receive_message(). + */ + +#define _GNU_SOURCE /* for F_DUPFD_CLOEXEC */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gunixfdlist.h" +#include "gioerror.h" + +#include "gioalias.h" + + +G_DEFINE_TYPE (GUnixFDList, g_unix_fd_list, G_TYPE_OBJECT) + +struct _GUnixFDListPrivate +{ + gint *fds; + gint nfd; +}; + +static void +g_unix_fd_list_init (GUnixFDList *list) +{ + list->priv = G_TYPE_INSTANCE_GET_PRIVATE (list, + G_TYPE_UNIX_FD_LIST, + GUnixFDListPrivate); +} + +static void +g_unix_fd_list_finalize (GObject *object) +{ + GUnixFDList *list = G_UNIX_FD_LIST (object); + gint i; + + for (i = 0; i < list->priv->nfd; i++) + close (list->priv->fds[i]); + g_free (list->priv->fds); + + G_OBJECT_CLASS (g_unix_fd_list_parent_class) + ->finalize (object); +} + +static void +g_unix_fd_list_class_init (GUnixFDListClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + g_type_class_add_private (class, sizeof (GUnixFDListPrivate)); + object_class->finalize = g_unix_fd_list_finalize; +} + +static int +dup_close_on_exec_fd (gint fd, + GError **error) +{ + gint new_fd; + gint s; + +#ifdef F_DUPFD_CLOEXEC + do + new_fd = fcntl (fd, F_DUPFD_CLOEXEC, 0l); + while (new_fd < 0 && (errno == EINTR)); + + if (new_fd >= 0) + return new_fd; + + /* if that didn't work (new libc/old kernel?), try it the other way. */ +#endif + + do + new_fd = dup (fd); + while (new_fd < 0 && (errno == EINTR)); + + if (new_fd < 0) + { + int saved_errno = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (saved_errno), + "dup: %s", g_strerror (saved_errno)); + close (new_fd); + + return -1; + } + + do + { + s = fcntl (new_fd, F_GETFD); + + if (s >= 0) + s = fcntl (new_fd, F_SETFD, (long) (s | FD_CLOEXEC)); + } + while (s < 0 && (errno == EINTR)); + + if (s < 0) + { + int saved_errno = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (saved_errno), + "fcntl: %s", g_strerror (saved_errno)); + close (new_fd); + + return -1; + } + + return new_fd; +} + +/** + * g_unix_fd_list_new: + * + * Creates a new #GUnixFDList containing no file descriptors. + * + * Returns: a new #GUnixFDList + * + * Since: 2.24 + **/ +GUnixFDList * +g_unix_fd_list_new (void) +{ + return g_object_new (G_TYPE_UNIX_FD_LIST, NULL); +} + +/** + * g_unix_fd_list_new_from_array: + * @fds: the initial list of file descriptors + * @n_fds: the length of #fds, or -1 + * + * Creates a new #GUnixFDList containing the file descriptors given in + * @fds. The file descriptors become the property of the new list and + * may no longer be used by the caller. The array itself is owned by + * the caller. + * + * Each file descriptor in the array should be set to close-on-exec. + * + * If @n_fds is -1 then @fds must be terminated with -1. + * + * Returns: a new #GUnixFDList + * + * Since: 2.24 + **/ +GUnixFDList * +g_unix_fd_list_new_from_array (const gint *fds, + gint n_fds) +{ + GUnixFDList *list; + + g_return_val_if_fail (fds != NULL || n_fds == 0, NULL); + + if (n_fds == -1) + for (n_fds = 0; fds[n_fds] != -1; n_fds++); + + list = g_object_new (G_TYPE_UNIX_FD_LIST, NULL); + list->priv->fds = g_new (gint, n_fds + 1); + list->priv->nfd = n_fds; + + memcpy (list->priv->fds, fds, sizeof (gint) * n_fds); + list->priv->fds[n_fds] = -1; + + return list; +} + +/** + * g_unix_fd_list_steal_fds: + * @list: a #GUnixFDList + * @length: pointer to the length of the returned array, or %NULL + * + * Returns the array of file descriptors that is contained in this + * object. + * + * After this call, the descriptors are no longer contained in + * @list. Further calls will return an empty list (unless more + * descriptors have been added). + * + * The return result of this function must be freed with g_free(). + * The caller is also responsible for closing all of the file + * descriptors. The file descriptors in the array are set to + * close-on-exec. + * + * If @length is non-%NULL then it is set to the number of file + * descriptors in the returned array. The returned array is also + * terminated with -1. + * + * This function never returns %NULL. In case there are no file + * descriptors contained in @list, an empty array is returned. + * + * Returns: an array of file descriptors + * + * Since: 2.24 + */ +gint * +g_unix_fd_list_steal_fds (GUnixFDList *list, + gint *length) +{ + gint *result; + + g_return_val_if_fail (G_IS_UNIX_FD_LIST (list), NULL); + + /* will be true for fresh object or if we were just called */ + if (list->priv->fds == NULL) + { + list->priv->fds = g_new (gint, 1); + list->priv->fds[0] = -1; + list->priv->nfd = 0; + } + + if (length) + *length = list->priv->nfd; + result = list->priv->fds; + + list->priv->fds = NULL; + list->priv->nfd = 0; + + return result; +} + +/** + * g_unix_fd_list_peek_fds: + * @list: a #GUnixFDList + * @length: pointer to the length of the returned array, or %NULL + * + * Returns the array of file descriptors that is contained in this + * object. + * + * After this call, the descriptors remain the property of @list. The + * caller must not close them and must not free the array. The array is + * valid only until @list is changed in any way. + * + * If @length is non-%NULL then it is set to the number of file + * descriptors in the returned array. The returned array is also + * terminated with -1. + * + * This function never returns %NULL. In case there are no file + * descriptors contained in @list, an empty array is returned. + * + * Returns: an array of file descriptors + * + * Since: 2.24 + */ +const gint * +g_unix_fd_list_peek_fds (GUnixFDList *list, + gint *length) +{ + g_return_val_if_fail (G_IS_UNIX_FD_LIST (list), NULL); + + /* will be true for fresh object or if steal() was just called */ + if (list->priv->fds == NULL) + { + list->priv->fds = g_new (gint, 1); + list->priv->fds[0] = -1; + list->priv->nfd = 0; + } + + if (length) + *length = list->priv->nfd; + + return list->priv->fds; +} + +/** + * g_unix_fd_list_append: + * @list: a #GUnixFDList + * @fd: a valid open file descriptor + * @error: a #GError pointer + * + * Adds a file descriptor to @list. + * + * The file descriptor is duplicated using dup(). You keep your copy + * of the descriptor and the copy contained in @list will be closed + * when @list is finalized. + * + * A possible cause of failure is exceeding the per-process or + * system-wide file descriptor limit. + * + * The index of the file descriptor in the list is returned. If you use + * this index with g_unix_fd_list_get() then you will receive back a + * duplicated copy of the same file descriptor. + * + * Returns: the index of the appended fd in case of success, else -1 + * (and @error is set) + * + * Since: 2.24 + */ +gint +g_unix_fd_list_append (GUnixFDList *list, + gint fd, + GError **error) +{ + gint new_fd; + + g_return_val_if_fail (G_IS_UNIX_FD_LIST (list), -1); + g_return_val_if_fail (fd >= 0, -1); + g_return_val_if_fail (error == NULL || *error == NULL, -1); + + if ((new_fd = dup_close_on_exec_fd (fd, error)) < 0) + return -1; + + list->priv->fds = g_realloc (list->priv->fds, + sizeof (gint) * + (list->priv->nfd + 2)); + list->priv->fds[list->priv->nfd++] = new_fd; + list->priv->fds[list->priv->nfd] = -1; + + return list->priv->nfd - 1; +} + +/** + * g_unix_fd_list_get: + * @list: a #GUnixFDList + * @index_: the index into the list + * @error: a #GError pointer + * + * Gets a file descriptor out of @list. + * + * @index_ specifies the index of the file descriptor to get. It is a + * programmer error for @index_ to be out of range; see + * g_unix_fd_list_get_length(). + * + * The file descriptor is duplicated using dup() and set as + * close-on-exec before being returned. You must call close() on it + * when you are done. + * + * A possible cause of failure is exceeding the per-process or + * system-wide file descriptor limit. + * + * Returns: the file descriptor, or -1 in case of error + * + * Since: 2.24 + **/ +gint +g_unix_fd_list_get (GUnixFDList *list, + gint index_, + GError **error) +{ + g_return_val_if_fail (G_IS_UNIX_FD_LIST (list), -1); + g_return_val_if_fail (index_ < list->priv->nfd, -1); + g_return_val_if_fail (error == NULL || *error == NULL, -1); + + return dup_close_on_exec_fd (list->priv->fds[index_], error); +} + +/** + * g_unix_fd_list_get_length: + * @list: a #GUnixFDList + * + * Gets the length of @list (ie: the number of file descriptors + * contained within). + * + * Returns: the length of @list + * + * Since: 2.24 + **/ +gint +g_unix_fd_list_get_length (GUnixFDList *list) +{ + g_return_val_if_fail (G_IS_UNIX_FD_LIST (list), 0); + + return list->priv->nfd; +} + +#define __G_UNIX_FD_LIST_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixfdlist.h b/gio/gunixfdlist.h new file mode 100644 index 0000000..638b685 --- /dev/null +++ b/gio/gunixfdlist.h @@ -0,0 +1,89 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + */ + +#ifndef __G_UNIX_FD_LIST_H__ +#define __G_UNIX_FD_LIST_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_FD_LIST (g_unix_fd_list_get_type ()) +#define G_UNIX_FD_LIST(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_UNIX_FD_LIST, GUnixFDList)) +#define G_UNIX_FD_LIST_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_UNIX_FD_LIST, GUnixFDListClass)) +#define G_IS_UNIX_FD_LIST(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_UNIX_FD_LIST)) +#define G_IS_UNIX_FD_LIST_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_UNIX_FD_LIST)) +#define G_UNIX_FD_LIST_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_UNIX_FD_LIST, GUnixFDListClass)) + +typedef struct _GUnixFDListPrivate GUnixFDListPrivate; +typedef struct _GUnixFDListClass GUnixFDListClass; +typedef struct _GUnixFDList GUnixFDList; + +struct _GUnixFDListClass +{ + GObjectClass parent_class; + + /*< private >*/ + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +struct _GUnixFDList +{ + GObject parent_instance; + GUnixFDListPrivate *priv; +}; + +GType g_unix_fd_list_get_type (void) G_GNUC_CONST; +GUnixFDList * g_unix_fd_list_new (void); +GUnixFDList * g_unix_fd_list_new_from_array (const gint *fds, + gint n_fds); + +gint g_unix_fd_list_append (GUnixFDList *list, + gint fd, + GError **error); + +gint g_unix_fd_list_get_length (GUnixFDList *list); + +gint g_unix_fd_list_get (GUnixFDList *list, + gint index_, + GError **error); + +const gint * g_unix_fd_list_peek_fds (GUnixFDList *list, + gint *length); + +gint * g_unix_fd_list_steal_fds (GUnixFDList *list, + gint *length); + +G_END_DECLS + +#endif /* __G_UNIX_FD_LIST_H__ */ diff --git a/gio/gunixfdmessage.c b/gio/gunixfdmessage.c new file mode 100644 index 0000000..bb37d5f --- /dev/null +++ b/gio/gunixfdmessage.c @@ -0,0 +1,318 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Authors: Ryan Lortie + */ + +/** + * SECTION: gunixfdmessage + * @title: GUnixFDMessage + * @short_description: A GSocketControlMessage containing a #GUnixFDList + * @see_also: #GUnixConnection, #GUnixFDList, #GSocketControlMessage + * + * This #GSocketControlMessage contains a #GUnixFDList. It may be sent + * using g_socket_send_message() and received using + * g_socket_receive_message() over UNIX sockets (ie: sockets in the + * %G_SOCKET_ADDRESS_UNIX family). The file descriptors are copied + * between processes by the kernel. + * + * For an easier way to send and receive file descriptors over + * stream-oriented UNIX sockets, see g_unix_connection_send_fd() and + * g_unix_connection_receive_fd(). + **/ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "gunixfdmessage.h" +#include "gioerror.h" + +#include "gioalias.h" + + +G_DEFINE_TYPE (GUnixFDMessage, g_unix_fd_message, + G_TYPE_SOCKET_CONTROL_MESSAGE); + +struct _GUnixFDMessagePrivate +{ + GUnixFDList *list; +}; + +static gsize +g_unix_fd_message_get_size (GSocketControlMessage *message) +{ + GUnixFDMessage *fd_message = G_UNIX_FD_MESSAGE (message); + + return g_unix_fd_list_get_length (fd_message->priv->list) * sizeof (gint); +} + +static int +g_unix_fd_message_get_level (GSocketControlMessage *message) +{ + return SOL_SOCKET; +} + +static int +g_unix_fd_message_get_msg_type (GSocketControlMessage *message) +{ + return SCM_RIGHTS; +} + +static GSocketControlMessage * +g_unix_fd_message_deserialize (int level, + int type, + gsize size, + gpointer data) +{ + GSocketControlMessage *message; + GUnixFDList *list; + gint n, s, i; + gint *fds; + + if (level != SOL_SOCKET || + type != SCM_RIGHTS) + return NULL; + + if (size % 4 > 0) + { + g_warning ("Kernel returned non-integral number of fds"); + return NULL; + } + + fds = data; + n = size / sizeof (gint); + + for (i = 0; i < n; i++) + { + do + s = fcntl (fds[i], F_SETFD, FD_CLOEXEC); + while (s < 0 && errno == EINTR); + + if (s < 0) + { + g_warning ("Error setting close-on-exec flag on incoming fd: %s", + g_strerror (errno)); + return NULL; + } + } + + list = g_unix_fd_list_new_from_array (fds, n); + message = g_unix_fd_message_new_with_fd_list (list); + g_object_unref (list); + + return message; +} + +static void +g_unix_fd_message_serialize (GSocketControlMessage *message, + gpointer data) +{ + GUnixFDMessage *fd_message = G_UNIX_FD_MESSAGE (message); + const gint *fds; + gint n_fds; + + fds = g_unix_fd_list_peek_fds (fd_message->priv->list, &n_fds); + memcpy (data, fds, sizeof (gint) * n_fds); +} + +static void +g_unix_fd_message_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + GUnixFDMessage *message = G_UNIX_FD_MESSAGE (object); + + g_assert (message->priv->list == NULL); + g_assert_cmpint (prop_id, ==, 1); + + message->priv->list = g_value_dup_object (value); + + if (message->priv->list == NULL) + message->priv->list = g_unix_fd_list_new (); +} + +/** + * g_unix_fd_message_get_fd_list: + * @message: a #GUnixFDMessage + * + * Gets the #GUnixFDList contained in @message. This function does not + * return a reference to the caller, but the returned list is valid for + * the lifetime of @message. + * + * Returns: the #GUnixFDList from @message + * + * Since: 2.24 + **/ +GUnixFDList * +g_unix_fd_message_get_fd_list (GUnixFDMessage *message) +{ + return message->priv->list; +} + +static void +g_unix_fd_message_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GUnixFDMessage *message = G_UNIX_FD_MESSAGE (object); + + g_assert_cmpint (prop_id, ==, 1); + + g_value_set_object (value, g_unix_fd_message_get_fd_list (message)); +} + +static void +g_unix_fd_message_init (GUnixFDMessage *message) +{ + message->priv = G_TYPE_INSTANCE_GET_PRIVATE (message, + G_TYPE_UNIX_FD_MESSAGE, + GUnixFDMessagePrivate); +} + +static void +g_unix_fd_message_finalize (GObject *object) +{ + GUnixFDMessage *message = G_UNIX_FD_MESSAGE (object); + + g_object_unref (message->priv->list); + + G_OBJECT_CLASS (g_unix_fd_message_parent_class) + ->finalize (object); +} + +static void +g_unix_fd_message_class_init (GUnixFDMessageClass *class) +{ + GSocketControlMessageClass *scm_class = G_SOCKET_CONTROL_MESSAGE_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + + g_type_class_add_private (class, sizeof (GUnixFDMessagePrivate)); + scm_class->get_size = g_unix_fd_message_get_size; + scm_class->get_level = g_unix_fd_message_get_level; + scm_class->get_type = g_unix_fd_message_get_msg_type; + scm_class->serialize = g_unix_fd_message_serialize; + scm_class->deserialize = g_unix_fd_message_deserialize; + object_class->finalize = g_unix_fd_message_finalize; + object_class->set_property = g_unix_fd_message_set_property; + object_class->get_property = g_unix_fd_message_get_property; + + g_object_class_install_property (object_class, 1, + g_param_spec_object ("fd-list", "file descriptor list", + "The GUnixFDList object to send with the message", + G_TYPE_UNIX_FD_LIST, G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +/** + * g_unix_fd_message_new: + * + * Creates a new #GUnixFDMessage containing an empty file descriptor + * list. + * + * Returns: a new #GUnixFDMessage + * + * Since: 2.22 + **/ +GSocketControlMessage * +g_unix_fd_message_new (void) +{ + return g_object_new (G_TYPE_UNIX_FD_MESSAGE, NULL); +} + +/** + * g_unix_fd_message_new_with_fd_list: + * @fd_list: a #GUnixFDList + * + * Creates a new #GUnixFDMessage containing @list. + * + * Returns: a new #GUnixFDMessage + * + * Since: 2.24 + **/ +GSocketControlMessage * +g_unix_fd_message_new_with_fd_list (GUnixFDList *fd_list) +{ + return g_object_new (G_TYPE_UNIX_FD_MESSAGE, + "fd-list", fd_list, + NULL); +} + +/** + * g_unix_fd_message_steal_fds: + * @message: a #GUnixFDMessage + * @length: pointer to the length of the returned array, or %NULL + * + * Returns the array of file descriptors that is contained in this + * object. + * + * After this call, the descriptors are no longer contained in + * @message. Further calls will return an empty list (unless more + * descriptors have been added). + * + * The return result of this function must be freed with g_free(). + * The caller is also responsible for closing all of the file + * descriptors. + * + * If @length is non-%NULL then it is set to the number of file + * descriptors in the returned array. The returned array is also + * terminated with -1. + * + * This function never returns %NULL. In case there are no file + * descriptors contained in @message, an empty array is returned. + * + * Returns: an array of file descriptors + * + * Since: 2.22 + **/ +gint * +g_unix_fd_message_steal_fds (GUnixFDMessage *message, + gint *length) +{ + g_return_val_if_fail (G_UNIX_FD_MESSAGE (message), FALSE); + + return g_unix_fd_list_steal_fds (message->priv->list, length); +} + +/** + * g_unix_fd_message_append_fd: + * @message: a #GUnixFDMessage + * @fd: a valid open file descriptor + * @error: a #GError pointer + * + * Adds a file descriptor to @message. + * + * The file descriptor is duplicated using dup(). You keep your copy + * of the descriptor and the copy contained in @message will be closed + * when @message is finalized. + * + * A possible cause of failure is exceeding the per-process or + * system-wide file descriptor limit. + * + * Returns: %TRUE in case of success, else %FALSE (and @error is set) + * + * Since: 2.22 + **/ +gboolean +g_unix_fd_message_append_fd (GUnixFDMessage *message, + gint fd, + GError **error) +{ + g_return_val_if_fail (G_UNIX_FD_MESSAGE (message), FALSE); + + return g_unix_fd_list_append (message->priv->list, fd, error) > 0; +} + +#define __G_UNIX_FD_MESSAGE_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixfdmessage.h b/gio/gunixfdmessage.h new file mode 100644 index 0000000..44b47c1 --- /dev/null +++ b/gio/gunixfdmessage.h @@ -0,0 +1,78 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Ryan Lortie + */ + +#ifndef __G_UNIX_FD_MESSAGE_H__ +#define __G_UNIX_FD_MESSAGE_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_FD_MESSAGE (g_unix_fd_message_get_type ()) +#define G_UNIX_FD_MESSAGE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_UNIX_FD_MESSAGE, GUnixFDMessage)) +#define G_UNIX_FD_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_UNIX_FD_MESSAGE, GUnixFDMessageClass)) +#define G_IS_UNIX_FD_MESSAGE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_UNIX_FD_MESSAGE)) +#define G_IS_UNIX_FD_MESSAGE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_UNIX_FD_MESSAGE)) +#define G_UNIX_FD_MESSAGE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_UNIX_FD_MESSAGE, GUnixFDMessageClass)) + +typedef struct _GUnixFDMessagePrivate GUnixFDMessagePrivate; +typedef struct _GUnixFDMessageClass GUnixFDMessageClass; +typedef struct _GUnixFDMessage GUnixFDMessage; + +struct _GUnixFDMessageClass +{ + GSocketControlMessageClass parent_class; + + /*< private >*/ + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); +}; + +struct _GUnixFDMessage +{ + GSocketControlMessage parent_instance; + GUnixFDMessagePrivate *priv; +}; + +GType g_unix_fd_message_get_type (void) G_GNUC_CONST; +GSocketControlMessage * g_unix_fd_message_new_with_fd_list (GUnixFDList *fd_list); +GSocketControlMessage * g_unix_fd_message_new (void); + +GUnixFDList * g_unix_fd_message_get_fd_list (GUnixFDMessage *message); + +gint * g_unix_fd_message_steal_fds (GUnixFDMessage *message, + gint *length); +gboolean g_unix_fd_message_append_fd (GUnixFDMessage *message, + gint fd, + GError **error); + +G_END_DECLS + +#endif /* __G_UNIX_FD_MESSAGE_H__ */ diff --git a/gio/gunixinputstream.c b/gio/gunixinputstream.c new file mode 100644 index 0000000..4253e50 --- /dev/null +++ b/gio/gunixinputstream.c @@ -0,0 +1,648 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include "gioerror.h" +#include "gsimpleasyncresult.h" +#include "gunixinputstream.h" +#include "gcancellable.h" +#include "gasynchelper.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gunixinputstream + * @short_description: Streaming input operations for UNIX file descriptors + * @include: gio/gunixinputstream.h + * @see_also: #GInputStream + * + * #GUnixInputStream implements #GInputStream for reading from a + * UNIX file descriptor, including asynchronous operations. The file + * descriptor must be selectable, so it doesn't work with opened files. + * + * Note that <gio/gunixinputstream.h> belongs + * to the UNIX-specific GIO interfaces, thus you have to use the + * gio-unix-2.0.pc pkg-config file when using it. + */ + +enum { + PROP_0, + PROP_FD, + PROP_CLOSE_FD +}; + +G_DEFINE_TYPE (GUnixInputStream, g_unix_input_stream, G_TYPE_INPUT_STREAM); + +struct _GUnixInputStreamPrivate { + int fd; + gboolean close_fd; +}; + +static void g_unix_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_unix_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static gssize g_unix_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_unix_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); +static void g_unix_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_unix_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static void g_unix_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_unix_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +static void g_unix_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_unix_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); + + +static void +g_unix_input_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_unix_input_stream_parent_class)->finalize (object); +} + +static void +g_unix_input_stream_class_init (GUnixInputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GUnixInputStreamPrivate)); + + gobject_class->get_property = g_unix_input_stream_get_property; + gobject_class->set_property = g_unix_input_stream_set_property; + gobject_class->finalize = g_unix_input_stream_finalize; + + stream_class->read_fn = g_unix_input_stream_read; + stream_class->close_fn = g_unix_input_stream_close; + stream_class->read_async = g_unix_input_stream_read_async; + stream_class->read_finish = g_unix_input_stream_read_finish; + if (0) + { + /* TODO: Implement instead of using fallbacks */ + stream_class->skip_async = g_unix_input_stream_skip_async; + stream_class->skip_finish = g_unix_input_stream_skip_finish; + } + stream_class->close_async = g_unix_input_stream_close_async; + stream_class->close_finish = g_unix_input_stream_close_finish; + + /** + * GUnixInputStream:fd: + * + * The file descriptor that the stream reads from. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_FD, + g_param_spec_int ("fd", + P_("File descriptor"), + P_("The file descriptor to read from"), + G_MININT, G_MAXINT, -1, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + /** + * GUnixInputStream:close-fd: + * + * Whether to close the file descriptor when the stream is closed. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSE_FD, + g_param_spec_boolean ("close-fd", + P_("Close file descriptor"), + P_("Whether to close the file descriptor when the stream is closed"), + TRUE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); +} + +static void +g_unix_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GUnixInputStream *unix_stream; + + unix_stream = G_UNIX_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + unix_stream->priv->fd = g_value_get_int (value); + break; + case PROP_CLOSE_FD: + unix_stream->priv->close_fd = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_unix_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GUnixInputStream *unix_stream; + + unix_stream = G_UNIX_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + g_value_set_int (value, unix_stream->priv->fd); + break; + case PROP_CLOSE_FD: + g_value_set_boolean (value, unix_stream->priv->close_fd); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_unix_input_stream_init (GUnixInputStream *unix_stream) +{ + unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream, + G_TYPE_UNIX_INPUT_STREAM, + GUnixInputStreamPrivate); + + unix_stream->priv->fd = -1; + unix_stream->priv->close_fd = TRUE; +} + +/** + * g_unix_input_stream_new: + * @fd: a UNIX file descriptor + * @close_fd: %TRUE to close the file descriptor when done + * + * Creates a new #GUnixInputStream for the given @fd. + * + * If @close_fd is %TRUE, the file descriptor will be closed + * when the stream is closed. + * + * Returns: a new #GUnixInputStream + **/ +GInputStream * +g_unix_input_stream_new (gint fd, + gboolean close_fd) +{ + GUnixInputStream *stream; + + g_return_val_if_fail (fd != -1, NULL); + + stream = g_object_new (G_TYPE_UNIX_INPUT_STREAM, + "fd", fd, + "close-fd", close_fd, + NULL); + + return G_INPUT_STREAM (stream); +} + +/** + * g_unix_input_stream_set_close_fd: + * @stream: a #GUnixInputStream + * @close_fd: %TRUE to close the file descriptor when done + * + * Sets whether the file descriptor of @stream shall be closed + * when the stream is closed. + * + * Since: 2.20 + */ +void +g_unix_input_stream_set_close_fd (GUnixInputStream *stream, + gboolean close_fd) +{ + g_return_if_fail (G_IS_UNIX_INPUT_STREAM (stream)); + + close_fd = close_fd != FALSE; + if (stream->priv->close_fd != close_fd) + { + stream->priv->close_fd = close_fd; + g_object_notify (G_OBJECT (stream), "close-fd"); + } +} + +/** + * g_unix_input_stream_get_close_fd: + * @stream: a #GUnixInputStream + * + * Returns whether the file descriptor of @stream will be + * closed when the stream is closed. + * + * Return value: %TRUE if the file descriptor is closed when done + * + * Since: 2.20 + */ +gboolean +g_unix_input_stream_get_close_fd (GUnixInputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_INPUT_STREAM (stream), FALSE); + + return stream->priv->close_fd; +} + +/** + * g_unix_input_stream_get_fd: + * @stream: a #GUnixInputStream + * + * Return the UNIX file descriptor that the stream reads from. + * + * Return value: The file descriptor of @stream + * + * Since: 2.20 + */ +gint +g_unix_input_stream_get_fd (GUnixInputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_INPUT_STREAM (stream), -1); + + return stream->priv->fd; +} + +static gssize +g_unix_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GUnixInputStream *unix_stream; + gssize res; + GPollFD poll_fds[2]; + int poll_ret; + + unix_stream = G_UNIX_INPUT_STREAM (stream); + + if (g_cancellable_make_pollfd (cancellable, &poll_fds[1])) + { + poll_fds[0].fd = unix_stream->priv->fd; + poll_fds[0].events = G_IO_IN; + do + poll_ret = g_poll (poll_fds, 2, -1); + while (poll_ret == -1 && errno == EINTR); + g_cancellable_release_fd (cancellable); + + if (poll_ret == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from unix: %s"), + g_strerror (errsv)); + return -1; + } + } + + while (1) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + res = read (unix_stream->priv->fd, buffer, count); + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from unix: %s"), + g_strerror (errsv)); + } + + break; + } + + return res; +} + +static gboolean +g_unix_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GUnixInputStream *unix_stream; + int res; + + unix_stream = G_UNIX_INPUT_STREAM (stream); + + if (!unix_stream->priv->close_fd) + return TRUE; + + while (1) + { + /* This might block during the close. Doesn't seem to be a way to avoid it though. */ + res = close (unix_stream->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing unix: %s"), + g_strerror (errsv)); + } + break; + } + + return res != -1; +} + +typedef struct { + gsize count; + void *buffer; + GAsyncReadyCallback callback; + gpointer user_data; + GCancellable *cancellable; + GUnixInputStream *stream; +} ReadAsyncData; + +static gboolean +read_async_cb (ReadAsyncData *data, + GIOCondition condition, + int fd) +{ + GSimpleAsyncResult *simple; + GError *error = NULL; + gssize count_read; + + /* We know that we can read from fd once without blocking */ + while (1) + { + if (g_cancellable_set_error_if_cancelled (data->cancellable, &error)) + { + count_read = -1; + break; + } + count_read = read (data->stream->priv->fd, data->buffer, data->count); + if (count_read == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (&error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from unix: %s"), + g_strerror (errsv)); + } + break; + } + + simple = g_simple_async_result_new (G_OBJECT (data->stream), + data->callback, + data->user_data, + g_unix_input_stream_read_async); + + g_simple_async_result_set_op_res_gssize (simple, count_read); + + if (count_read == -1) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); + + return FALSE; +} + +static void +g_unix_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSource *source; + GUnixInputStream *unix_stream; + ReadAsyncData *data; + + unix_stream = G_UNIX_INPUT_STREAM (stream); + + data = g_new0 (ReadAsyncData, 1); + data->count = count; + data->buffer = buffer; + data->callback = callback; + data->user_data = user_data; + data->cancellable = cancellable; + data->stream = unix_stream; + + source = _g_fd_source_new (unix_stream->priv->fd, + G_IO_IN, + cancellable); + + g_source_set_callback (source, (GSourceFunc)read_async_cb, data, g_free); + g_source_attach (source, g_main_context_get_thread_default ()); + + g_source_unref (source); +} + +static gssize +g_unix_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize nread; + + simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_unix_input_stream_read_async); + + nread = g_simple_async_result_get_op_res_gssize (simple); + return nread; +} + +static void +g_unix_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + g_warn_if_reached (); + /* TODO: Not implemented */ +} + +static gssize +g_unix_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_warn_if_reached (); + return 0; + /* TODO: Not implemented */ +} + + +typedef struct { + GInputStream *stream; + GAsyncReadyCallback callback; + gpointer user_data; +} CloseAsyncData; + +static void +close_async_data_free (gpointer _data) +{ + CloseAsyncData *data = _data; + + g_free (data); +} + +static gboolean +close_async_cb (CloseAsyncData *data) +{ + GUnixInputStream *unix_stream; + GSimpleAsyncResult *simple; + GError *error = NULL; + gboolean result; + int res; + + unix_stream = G_UNIX_INPUT_STREAM (data->stream); + + if (!unix_stream->priv->close_fd) + { + result = TRUE; + goto out; + } + + while (1) + { + res = close (unix_stream->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (&error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing unix: %s"), + g_strerror (errsv)); + } + break; + } + + result = res != -1; + + out: + simple = g_simple_async_result_new (G_OBJECT (data->stream), + data->callback, + data->user_data, + g_unix_input_stream_close_async); + + if (!result) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); + + return FALSE; +} + +static void +g_unix_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSource *idle; + CloseAsyncData *data; + + data = g_new0 (CloseAsyncData, 1); + + data->stream = stream; + data->callback = callback; + data->user_data = user_data; + + idle = g_idle_source_new (); + g_source_set_callback (idle, (GSourceFunc)close_async_cb, data, close_async_data_free); + g_source_attach (idle, g_main_context_get_thread_default ()); + g_source_unref (idle); +} + +static gboolean +g_unix_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + /* Failures handled in generic close_finish code */ + return TRUE; +} + +#define __G_UNIX_INPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixinputstream.h b/gio/gunixinputstream.h new file mode 100644 index 0000000..cbdbe54 --- /dev/null +++ b/gio/gunixinputstream.h @@ -0,0 +1,78 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_UNIX_INPUT_STREAM_H__ +#define __G_UNIX_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_INPUT_STREAM (g_unix_input_stream_get_type ()) +#define G_UNIX_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_INPUT_STREAM, GUnixInputStream)) +#define G_UNIX_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_INPUT_STREAM, GUnixInputStreamClass)) +#define G_IS_UNIX_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_INPUT_STREAM)) +#define G_IS_UNIX_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_INPUT_STREAM)) +#define G_UNIX_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_INPUT_STREAM, GUnixInputStreamClass)) + +/** + * GUnixInputStream: + * + * Implements #GInputStream for reading from selectable unix file descriptors + **/ +typedef struct _GUnixInputStream GUnixInputStream; +typedef struct _GUnixInputStreamClass GUnixInputStreamClass; +typedef struct _GUnixInputStreamPrivate GUnixInputStreamPrivate; + +struct _GUnixInputStream +{ + GInputStream parent_instance; + + /*< private >*/ + GUnixInputStreamPrivate *priv; +}; + +struct _GUnixInputStreamClass +{ + GInputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_unix_input_stream_get_type (void) G_GNUC_CONST; + +GInputStream * g_unix_input_stream_new (gint fd, + gboolean close_fd); +void g_unix_input_stream_set_close_fd (GUnixInputStream *stream, + gboolean close_fd); +gboolean g_unix_input_stream_get_close_fd (GUnixInputStream *stream); +gint g_unix_input_stream_get_fd (GUnixInputStream *stream); + +G_END_DECLS + +#endif /* __G_UNIX_INPUT_STREAM_H__ */ diff --git a/gio/gunixmount.c b/gio/gunixmount.c new file mode 100644 index 0000000..c475ff9 --- /dev/null +++ b/gio/gunixmount.c @@ -0,0 +1,487 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" + +#include +#include +#include + +#include +#include "gunixvolumemonitor.h" +#include "gunixmount.h" +#include "gunixmounts.h" +#include "gunixvolume.h" +#include "gmountprivate.h" +#include "gmount.h" +#include "gfile.h" +#include "gvolumemonitor.h" +#include "gthemedicon.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" +/* for BUFSIZ */ +#include + +#include "gioalias.h" + +struct _GUnixMount { + GObject parent; + + GVolumeMonitor *volume_monitor; + + GUnixVolume *volume; /* owned by volume monitor */ + + char *name; + GIcon *icon; + char *device_path; + char *mount_path; + + gboolean can_eject; +}; + +static void g_unix_mount_mount_iface_init (GMountIface *iface); + +#define g_unix_mount_get_type _g_unix_mount_get_type +G_DEFINE_TYPE_WITH_CODE (GUnixMount, g_unix_mount, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_MOUNT, + g_unix_mount_mount_iface_init)) + + +static void +g_unix_mount_finalize (GObject *object) +{ + GUnixMount *mount; + + mount = G_UNIX_MOUNT (object); + + if (mount->volume_monitor != NULL) + g_object_unref (mount->volume_monitor); + + if (mount->volume) + _g_unix_volume_unset_mount (mount->volume, mount); + + /* TODO: g_warn_if_fail (volume->volume == NULL); */ + g_object_unref (mount->icon); + g_free (mount->name); + g_free (mount->device_path); + g_free (mount->mount_path); + + G_OBJECT_CLASS (g_unix_mount_parent_class)->finalize (object); +} + +static void +g_unix_mount_class_init (GUnixMountClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_unix_mount_finalize; +} + +static void +g_unix_mount_init (GUnixMount *unix_mount) +{ +} + +GUnixMount * +_g_unix_mount_new (GVolumeMonitor *volume_monitor, + GUnixMountEntry *mount_entry, + GUnixVolume *volume) +{ + GUnixMount *mount; + + /* No volume for mount: Ignore internal things */ + if (volume == NULL && !g_unix_mount_guess_should_display (mount_entry)) + return NULL; + + mount = g_object_new (G_TYPE_UNIX_MOUNT, NULL); + mount->volume_monitor = volume_monitor != NULL ? g_object_ref (volume_monitor) : NULL; + mount->device_path = g_strdup (g_unix_mount_get_device_path (mount_entry)); + mount->mount_path = g_strdup (g_unix_mount_get_mount_path (mount_entry)); + mount->can_eject = g_unix_mount_guess_can_eject (mount_entry); + + mount->name = g_unix_mount_guess_name (mount_entry); + mount->icon = g_unix_mount_guess_icon (mount_entry); + + /* need to do this last */ + mount->volume = volume; + if (volume != NULL) + _g_unix_volume_set_mount (volume, mount); + + return mount; +} + +void +_g_unix_mount_unmounted (GUnixMount *mount) +{ + if (mount->volume != NULL) + { + _g_unix_volume_unset_mount (mount->volume, mount); + mount->volume = NULL; + g_signal_emit_by_name (mount, "changed"); + /* there's really no need to emit mount_changed on the volume monitor + * as we're going to be deleted.. */ + } +} + +void +_g_unix_mount_unset_volume (GUnixMount *mount, + GUnixVolume *volume) +{ + if (mount->volume == volume) + { + mount->volume = NULL; + /* TODO: Emit changed in idle to avoid locking issues */ + g_signal_emit_by_name (mount, "changed"); + if (mount->volume_monitor != NULL) + g_signal_emit_by_name (mount->volume_monitor, "mount-changed", mount); + } +} + +static GFile * +g_unix_mount_get_root (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + + return g_file_new_for_path (unix_mount->mount_path); +} + +static GIcon * +g_unix_mount_get_icon (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + + return g_object_ref (unix_mount->icon); +} + +static char * +g_unix_mount_get_uuid (GMount *mount) +{ + return NULL; +} + +static char * +g_unix_mount_get_name (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + + return g_strdup (unix_mount->name); +} + +gboolean +_g_unix_mount_has_mount_path (GUnixMount *mount, + const char *mount_path) +{ + return strcmp (mount->mount_path, mount_path) == 0; +} + +static GDrive * +g_unix_mount_get_drive (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + + if (unix_mount->volume != NULL) + return g_volume_get_drive (G_VOLUME (unix_mount->volume)); + + return NULL; +} + +static GVolume * +g_unix_mount_get_volume (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + + if (unix_mount->volume) + return G_VOLUME (g_object_ref (unix_mount->volume)); + + return NULL; +} + +static gboolean +g_unix_mount_can_unmount (GMount *mount) +{ + return TRUE; +} + +static gboolean +g_unix_mount_can_eject (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + return unix_mount->can_eject; +} + + +typedef struct { + GUnixMount *unix_mount; + GAsyncReadyCallback callback; + gpointer user_data; + GCancellable *cancellable; + int error_fd; + GIOChannel *error_channel; + GSource *error_channel_source; + GString *error_string; + gchar **argv; +} UnmountEjectOp; + +static void +eject_unmount_cb (GPid pid, gint status, gpointer user_data) +{ + UnmountEjectOp *data = user_data; + GSimpleAsyncResult *simple; + + if (WEXITSTATUS (status) != 0) + { + GError *error; + error = g_error_new_literal (G_IO_ERROR, + G_IO_ERROR_FAILED, + data->error_string->str); + simple = g_simple_async_result_new_from_error (G_OBJECT (data->unix_mount), + data->callback, + data->user_data, + error); + g_error_free (error); + } + else + { + simple = g_simple_async_result_new (G_OBJECT (data->unix_mount), + data->callback, + data->user_data, + NULL); + } + + g_simple_async_result_complete (simple); + g_object_unref (simple); + + if (data->error_channel_source) + { + g_source_destroy (data->error_channel_source); + g_source_unref (data->error_channel_source); + } + g_io_channel_unref (data->error_channel); + g_string_free (data->error_string, TRUE); + g_strfreev (data->argv); + close (data->error_fd); + g_spawn_close_pid (pid); + g_free (data); +} + +static gboolean +eject_unmount_read_error (GIOChannel *channel, + GIOCondition condition, + gpointer user_data) +{ + UnmountEjectOp *data = user_data; + char buf[BUFSIZ]; + gsize bytes_read; + GError *error; + GIOStatus status; + + error = NULL; +read: + status = g_io_channel_read_chars (channel, buf, sizeof (buf), &bytes_read, &error); + if (status == G_IO_STATUS_NORMAL) + { + g_string_append_len (data->error_string, buf, bytes_read); + if (bytes_read == sizeof (buf)) + goto read; + } + else if (status == G_IO_STATUS_EOF) + g_string_append_len (data->error_string, buf, bytes_read); + else if (status == G_IO_STATUS_ERROR) + { + if (data->error_string->len > 0) + g_string_append (data->error_string, "\n"); + + g_string_append (data->error_string, error->message); + g_error_free (error); + + if (data->error_channel_source) + { + g_source_unref (data->error_channel_source); + data->error_channel_source = NULL; + } + return FALSE; + } + + return TRUE; +} + +static gboolean +eject_unmount_do_cb (gpointer user_data) +{ + UnmountEjectOp *data = (UnmountEjectOp *) user_data; + GPid child_pid; + GSource *child_watch; + GError *error = NULL; + + if (!g_spawn_async_with_pipes (NULL, /* working dir */ + data->argv, + NULL, /* envp */ + G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_SEARCH_PATH, + NULL, /* child_setup */ + NULL, /* user_data for child_setup */ + &child_pid, + NULL, /* standard_input */ + NULL, /* standard_output */ + &(data->error_fd), + &error)) { + g_assert (error != NULL); + goto handle_error; + } + + data->error_string = g_string_new (""); + + data->error_channel = g_io_channel_unix_new (data->error_fd); + g_io_channel_set_flags (data->error_channel, G_IO_FLAG_NONBLOCK, &error); + if (error != NULL) + goto handle_error; + + data->error_channel_source = g_io_create_watch (data->error_channel, G_IO_IN); + g_source_set_callback (data->error_channel_source, + (GSourceFunc) eject_unmount_read_error, data, NULL); + g_source_attach (data->error_channel_source, g_main_context_get_thread_default ()); + + child_watch = g_child_watch_source_new (child_pid); + g_source_set_callback (child_watch, (GSourceFunc) eject_unmount_cb, data, NULL); + g_source_attach (child_watch, g_main_context_get_thread_default ()); + g_source_unref (child_watch); + +handle_error: + if (error != NULL) { + GSimpleAsyncResult *simple; + simple = g_simple_async_result_new_from_error (G_OBJECT (data->unix_mount), + data->callback, + data->user_data, + error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + + if (data->error_string != NULL) + g_string_free (data->error_string, TRUE); + + if (data->error_channel != NULL) + g_io_channel_unref (data->error_channel); + + g_strfreev (data->argv); + g_error_free (error); + g_free (data); + } + + return FALSE; +} + +static void +eject_unmount_do (GMount *mount, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + char **argv) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + UnmountEjectOp *data; + + data = g_new0 (UnmountEjectOp, 1); + data->unix_mount = unix_mount; + data->callback = callback; + data->user_data = user_data; + data->cancellable = cancellable; + data->argv = g_strdupv (argv); + + if (unix_mount->volume_monitor != NULL) + g_signal_emit_by_name (unix_mount->volume_monitor, "mount-pre-unmount", mount); + + g_signal_emit_by_name (mount, "pre-unmount", 0); + + g_timeout_add (500, (GSourceFunc) eject_unmount_do_cb, data); +} + +static void +g_unix_mount_unmount (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + char *argv[] = {"umount", NULL, NULL}; + + if (unix_mount->mount_path != NULL) + argv[1] = unix_mount->mount_path; + else + argv[1] = unix_mount->device_path; + + eject_unmount_do (mount, cancellable, callback, user_data, argv); +} + +static gboolean +g_unix_mount_unmount_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +static void +g_unix_mount_eject (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + char *argv[] = {"eject", NULL, NULL}; + + if (unix_mount->mount_path != NULL) + argv[1] = unix_mount->mount_path; + else + argv[1] = unix_mount->device_path; + + eject_unmount_do (mount, cancellable, callback, user_data, argv); +} + +static gboolean +g_unix_mount_eject_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +static void +g_unix_mount_mount_iface_init (GMountIface *iface) +{ + iface->get_root = g_unix_mount_get_root; + iface->get_name = g_unix_mount_get_name; + iface->get_icon = g_unix_mount_get_icon; + iface->get_uuid = g_unix_mount_get_uuid; + iface->get_drive = g_unix_mount_get_drive; + iface->get_volume = g_unix_mount_get_volume; + iface->can_unmount = g_unix_mount_can_unmount; + iface->can_eject = g_unix_mount_can_eject; + iface->unmount = g_unix_mount_unmount; + iface->unmount_finish = g_unix_mount_unmount_finish; + iface->eject = g_unix_mount_eject; + iface->eject_finish = g_unix_mount_eject_finish; +} diff --git a/gio/gunixmount.h b/gio/gunixmount.h new file mode 100644 index 0000000..35cd64d --- /dev/null +++ b/gio/gunixmount.h @@ -0,0 +1,59 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#ifndef __G_UNIX_MOUNT_H__ +#define __G_UNIX_MOUNT_H__ + +#include + +#include "gunixmounts.h" + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_MOUNT (_g_unix_mount_get_type ()) +#define G_UNIX_MOUNT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_MOUNT, GUnixMount)) +#define G_UNIX_MOUNT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_MOUNT, GUnixMountClass)) +#define G_IS_UNIX_MOUNT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_MOUNT)) +#define G_IS_UNIX_MOUNT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_MOUNT)) + +typedef struct _GUnixMountClass GUnixMountClass; + +struct _GUnixMountClass +{ + GObjectClass parent_class; +}; + +GType _g_unix_mount_get_type (void) G_GNUC_CONST; + +GUnixMount * _g_unix_mount_new (GVolumeMonitor *volume_monitor, + GUnixMountEntry *mount_entry, + GUnixVolume *volume); +gboolean _g_unix_mount_has_mount_path (GUnixMount *mount, + const char *mount_path); +void _g_unix_mount_unset_volume (GUnixMount *mount, + GUnixVolume *volume); +void _g_unix_mount_unmounted (GUnixMount *mount); + +G_END_DECLS + +#endif /* __G_UNIX_MOUNT_H__ */ diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c new file mode 100644 index 0000000..48dc7c5 --- /dev/null +++ b/gio/gunixmounts.c @@ -0,0 +1,2196 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#ifndef HAVE_SYSCTLBYNAME +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif +#endif +#ifdef HAVE_POLL_H +#include +#endif +#if HAVE_SYS_STATVFS_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gunixmounts.h" +#include "gfile.h" +#include "gfilemonitor.h" +#include "glibintl.h" +#include "gthemedicon.h" + +#include "gioalias.h" + +static const char *_resolve_dev_root (void); + +/** + * SECTION:gunixmounts + * @include: gio/gunixmounts.h + * @short_description: Unix Mounts + * + * Routines for managing mounted UNIX mount points and paths. + * + * Note that <gio/gunixmounts.h> belongs to the + * UNIX-specific GIO interfaces, thus you have to use the + * gio-unix-2.0.pc pkg-config file when using it. + */ + +/* + * GUnixMountType: + * @G_UNIX_MOUNT_TYPE_UNKNOWN: Unknown UNIX mount type. + * @G_UNIX_MOUNT_TYPE_FLOPPY: Floppy disk UNIX mount type. + * @G_UNIX_MOUNT_TYPE_CDROM: CDROM UNIX mount type. + * @G_UNIX_MOUNT_TYPE_NFS: Network File System (NFS) UNIX mount type. + * @G_UNIX_MOUNT_TYPE_ZIP: ZIP UNIX mount type. + * @G_UNIX_MOUNT_TYPE_JAZ: JAZZ UNIX mount type. + * @G_UNIX_MOUNT_TYPE_MEMSTICK: Memory Stick UNIX mount type. + * @G_UNIX_MOUNT_TYPE_CF: Compact Flash UNIX mount type. + * @G_UNIX_MOUNT_TYPE_SM: Smart Media UNIX mount type. + * @G_UNIX_MOUNT_TYPE_SDMMC: SD/MMC UNIX mount type. + * @G_UNIX_MOUNT_TYPE_IPOD: iPod UNIX mount type. + * @G_UNIX_MOUNT_TYPE_CAMERA: Digital camera UNIX mount type. + * @G_UNIX_MOUNT_TYPE_HD: Hard drive UNIX mount type. + * + * Types of UNIX mounts. + **/ +typedef enum { + G_UNIX_MOUNT_TYPE_UNKNOWN, + G_UNIX_MOUNT_TYPE_FLOPPY, + G_UNIX_MOUNT_TYPE_CDROM, + G_UNIX_MOUNT_TYPE_NFS, + G_UNIX_MOUNT_TYPE_ZIP, + G_UNIX_MOUNT_TYPE_JAZ, + G_UNIX_MOUNT_TYPE_MEMSTICK, + G_UNIX_MOUNT_TYPE_CF, + G_UNIX_MOUNT_TYPE_SM, + G_UNIX_MOUNT_TYPE_SDMMC, + G_UNIX_MOUNT_TYPE_IPOD, + G_UNIX_MOUNT_TYPE_CAMERA, + G_UNIX_MOUNT_TYPE_HD +} GUnixMountType; + +struct _GUnixMountEntry { + char *mount_path; + char *device_path; + char *filesystem_type; + gboolean is_read_only; + gboolean is_system_internal; +}; + +struct _GUnixMountPoint { + char *mount_path; + char *device_path; + char *filesystem_type; + gboolean is_read_only; + gboolean is_user_mountable; + gboolean is_loopback; +}; + +enum { + MOUNTS_CHANGED, + MOUNTPOINTS_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + +struct _GUnixMountMonitor { + GObject parent; + + GFileMonitor *fstab_monitor; + GFileMonitor *mtab_monitor; +}; + +struct _GUnixMountMonitorClass { + GObjectClass parent_class; +}; + +static GUnixMountMonitor *the_mount_monitor = NULL; + +static GList *_g_get_unix_mounts (void); +static GList *_g_get_unix_mount_points (void); + +G_DEFINE_TYPE (GUnixMountMonitor, g_unix_mount_monitor, G_TYPE_OBJECT); + +#define MOUNT_POLL_INTERVAL 4000 + +#ifdef HAVE_SYS_MNTTAB_H +#define MNTOPT_RO "ro" +#endif + +#ifdef HAVE_MNTENT_H +#include +#elif defined (HAVE_SYS_MNTTAB_H) +#include +#endif + +#ifdef HAVE_SYS_VFSTAB_H +#include +#endif + +#if defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H) +#include +#include +#include +#include +#endif + +#if defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H) +#include +#include +#include +#ifdef HAVE_SYS_SYSCTL_H +#include +#endif +#endif + +#ifndef HAVE_SETMNTENT +#define setmntent(f,m) fopen(f,m) +#endif +#ifndef HAVE_ENDMNTENT +#define endmntent(f) fclose(f) +#endif + +static gboolean +is_in (const char *value, const char *set[]) +{ + int i; + for (i = 0; set[i] != NULL; i++) + { + if (strcmp (set[i], value) == 0) + return TRUE; + } + return FALSE; +} + +/** + * g_unix_is_mount_path_system_internal: + * @mount_path: a mount path, e.g. /media/disk + * or /usr + * + * Determines if @mount_path is considered an implementation of the + * OS. This is primarily used for hiding mountable and mounted volumes + * that only are used in the OS and has little to no relevance to the + * casual user. + * + * Returns: %TRUE if @mount_path is considered an implementation detail + * of the OS. + **/ +gboolean +g_unix_is_mount_path_system_internal (const char *mount_path) +{ + const char *ignore_mountpoints[] = { + /* Includes all FHS 2.3 toplevel dirs and other specilized + * directories that we want to hide from the user. + */ + "/", /* we already have "Filesystem root" in Nautilus */ + "/bin", + "/boot", + "/dev", + "/etc", + "/home", + "/lib", + "/lib64", + "/media", + "/mnt", + "/opt", + "/root", + "/sbin", + "/srv", + "/tmp", + "/usr", + "/usr/local", + "/var", + "/var/log/audit", /* https://bugzilla.redhat.com/show_bug.cgi?id=333041 */ + "/var/tmp", /* https://bugzilla.redhat.com/show_bug.cgi?id=335241 */ + "/proc", + "/sbin", + "/net", + NULL + }; + + if (is_in (mount_path, ignore_mountpoints)) + return TRUE; + + if (g_str_has_prefix (mount_path, "/dev") || + g_str_has_prefix (mount_path, "/proc") || + g_str_has_prefix (mount_path, "/sys")) + return TRUE; + + if (strstr (mount_path, "/.gvfs") != NULL) + return TRUE; + + return FALSE; +} + +static gboolean +guess_system_internal (const char *mountpoint, + const char *fs, + const char *device) +{ + const char *ignore_fs[] = { + "auto", + "autofs", + "devfs", + "devpts", + "ecryptfs", + "kernfs", + "linprocfs", + "proc", + "procfs", + "ptyfs", + "rootfs", + "selinuxfs", + "sysfs", + "tmpfs", + "usbfs", + "nfsd", + "rpc_pipefs", + "zfs", + NULL + }; + const char *ignore_devices[] = { + "none", + "sunrpc", + "devpts", + "nfsd", + "/dev/loop", + "/dev/vn", + NULL + }; + + if (is_in (fs, ignore_fs)) + return TRUE; + + if (is_in (device, ignore_devices)) + return TRUE; + + if (g_unix_is_mount_path_system_internal (mountpoint)) + return TRUE; + + return FALSE; +} + +#ifdef HAVE_MNTENT_H + +static char * +get_mtab_read_file (void) +{ +#ifdef _PATH_MOUNTED +# ifdef __linux__ + return "/proc/mounts"; +# else + return _PATH_MOUNTED; +# endif +#else + return "/etc/mtab"; +#endif +} + +static char * +get_mtab_monitor_file (void) +{ +#ifdef _PATH_MOUNTED + return _PATH_MOUNTED; +#else + return "/etc/mtab"; +#endif +} + +#ifndef HAVE_GETMNTENT_R +G_LOCK_DEFINE_STATIC(getmntent); +#endif + +static GList * +_g_get_unix_mounts (void) +{ +#ifdef HAVE_GETMNTENT_R + struct mntent ent; + char buf[1024]; +#endif + struct mntent *mntent; + FILE *file; + char *read_file; + GUnixMountEntry *mount_entry; + GHashTable *mounts_hash; + GList *return_list; + + read_file = get_mtab_read_file (); + + file = setmntent (read_file, "r"); + if (file == NULL) + return NULL; + + return_list = NULL; + + mounts_hash = g_hash_table_new (g_str_hash, g_str_equal); + +#ifdef HAVE_GETMNTENT_R + while ((mntent = getmntent_r (file, &ent, buf, sizeof (buf))) != NULL) +#else + G_LOCK (getmntent); + while ((mntent = getmntent (file)) != NULL) +#endif + { + /* ignore any mnt_fsname that is repeated and begins with a '/' + * + * We do this to avoid being fooled by --bind mounts, since + * these have the same device as the location they bind to. + * It's not an ideal solution to the problem, but it's likely that + * the most important mountpoint is first and the --bind ones after + * that aren't as important. So it should work. + * + * The '/' is to handle procfs, tmpfs and other no device mounts. + */ + if (mntent->mnt_fsname != NULL && + mntent->mnt_fsname[0] == '/' && + g_hash_table_lookup (mounts_hash, mntent->mnt_fsname)) + continue; + + mount_entry = g_new0 (GUnixMountEntry, 1); + mount_entry->mount_path = g_strdup (mntent->mnt_dir); + if (strcmp (mntent->mnt_fsname, "/dev/root") == 0) + mount_entry->device_path = g_strdup (_resolve_dev_root ()); + else + mount_entry->device_path = g_strdup (mntent->mnt_fsname); + mount_entry->filesystem_type = g_strdup (mntent->mnt_type); + +#if defined (HAVE_HASMNTOPT) + if (hasmntopt (mntent, MNTOPT_RO) != NULL) + mount_entry->is_read_only = TRUE; +#endif + + mount_entry->is_system_internal = + guess_system_internal (mount_entry->mount_path, + mount_entry->filesystem_type, + mount_entry->device_path); + + g_hash_table_insert (mounts_hash, + mount_entry->device_path, + mount_entry->device_path); + + return_list = g_list_prepend (return_list, mount_entry); + } + g_hash_table_destroy (mounts_hash); + + endmntent (file); + +#ifndef HAVE_GETMNTENT_R + G_UNLOCK (getmntent); +#endif + + return g_list_reverse (return_list); +} + +#elif defined (HAVE_SYS_MNTTAB_H) + +G_LOCK_DEFINE_STATIC(getmntent); + +static char * +get_mtab_read_file (void) +{ +#ifdef _PATH_MOUNTED + return _PATH_MOUNTED; +#else + return "/etc/mnttab"; +#endif +} + +static char * +get_mtab_monitor_file (void) +{ + return get_mtab_read_file (); +} + +static GList * +_g_get_unix_mounts (void) +{ + struct mnttab mntent; + FILE *file; + char *read_file; + GUnixMountEntry *mount_entry; + GList *return_list; + + read_file = get_mtab_read_file (); + + file = setmntent (read_file, "r"); + if (file == NULL) + return NULL; + + return_list = NULL; + + G_LOCK (getmntent); + while (! getmntent (file, &mntent)) + { + mount_entry = g_new0 (GUnixMountEntry, 1); + + mount_entry->mount_path = g_strdup (mntent.mnt_mountp); + mount_entry->device_path = g_strdup (mntent.mnt_special); + mount_entry->filesystem_type = g_strdup (mntent.mnt_fstype); + +#if defined (HAVE_HASMNTOPT) + if (hasmntopt (&mntent, MNTOPT_RO) != NULL) + mount_entry->is_read_only = TRUE; +#endif + + mount_entry->is_system_internal = + guess_system_internal (mount_entry->mount_path, + mount_entry->filesystem_type, + mount_entry->device_path); + + return_list = g_list_prepend (return_list, mount_entry); + } + + endmntent (file); + + G_UNLOCK (getmntent); + + return g_list_reverse (return_list); +} + +#elif defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H) + +static char * +get_mtab_monitor_file (void) +{ + return NULL; +} + +static GList * +_g_get_unix_mounts (void) +{ + struct vfs_ent *fs_info; + struct vmount *vmount_info; + int vmount_number; + unsigned int vmount_size; + int current; + GList *return_list; + + if (mntctl (MCTL_QUERY, sizeof (vmount_size), &vmount_size) != 0) + { + g_warning ("Unable to know the number of mounted volumes\n"); + + return NULL; + } + + vmount_info = (struct vmount*)g_malloc (vmount_size); + + vmount_number = mntctl (MCTL_QUERY, vmount_size, vmount_info); + + if (vmount_info->vmt_revision != VMT_REVISION) + g_warning ("Bad vmount structure revision number, want %d, got %d\n", VMT_REVISION, vmount_info->vmt_revision); + + if (vmount_number < 0) + { + g_warning ("Unable to recover mounted volumes information\n"); + + g_free (vmount_info); + return NULL; + } + + return_list = NULL; + while (vmount_number > 0) + { + mount_entry = g_new0 (GUnixMountEntry, 1); + + mount_entry->device_path = g_strdup (vmt2dataptr (vmount_info, VMT_OBJECT)); + mount_entry->mount_path = g_strdup (vmt2dataptr (vmount_info, VMT_STUB)); + /* is_removable = (vmount_info->vmt_flags & MNT_REMOVABLE) ? 1 : 0; */ + mount_entry->is_read_only = (vmount_info->vmt_flags & MNT_READONLY) ? 1 : 0; + + fs_info = getvfsbytype (vmount_info->vmt_gfstype); + + if (fs_info == NULL) + mount_entry->filesystem_type = g_strdup ("unknown"); + else + mount_entry->filesystem_type = g_strdup (fs_info->vfsent_name); + + mount_entry->is_system_internal = + guess_system_internal (mount_entry->mount_path, + mount_entry->filesystem_type, + mount_entry->device_path); + + return_list = g_list_prepend (return_list, mount_entry); + + vmount_info = (struct vmount *)( (char*)vmount_info + + vmount_info->vmt_length); + vmount_number--; + } + + g_free (vmount_info); + + return g_list_reverse (return_list); +} + +#elif defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H) + +static char * +get_mtab_monitor_file (void) +{ + return NULL; +} + +static GList * +_g_get_unix_mounts (void) +{ + struct statfs *mntent = NULL; + int num_mounts, i; + GUnixMountEntry *mount_entry; + GList *return_list; + + /* Pass MNT_NOWAIT to avoid blocking trying to update NFS mounts. */ + if ((num_mounts = getmntinfo (&mntent, MNT_NOWAIT)) == 0) + return NULL; + + return_list = NULL; + + for (i = 0; i < num_mounts; i++) + { + mount_entry = g_new0 (GUnixMountEntry, 1); + + mount_entry->mount_path = g_strdup (mntent[i].f_mntonname); + mount_entry->device_path = g_strdup (mntent[i].f_mntfromname); + mount_entry->filesystem_type = g_strdup (mntent[i].f_fstypename); + if (mntent[i].f_flags & MNT_RDONLY) + mount_entry->is_read_only = TRUE; + + mount_entry->is_system_internal = + guess_system_internal (mount_entry->mount_path, + mount_entry->filesystem_type, + mount_entry->device_path); + + return_list = g_list_prepend (return_list, mount_entry); + } + + return g_list_reverse (return_list); +} +#elif defined(__INTERIX) + +static char * +get_mtab_monitor_file (void) +{ + return NULL; +} + +static GList * +_g_get_unix_mounts (void) +{ + DIR *dirp; + GList* return_list = NULL; + char filename[9 + NAME_MAX]; + + dirp = opendir ("/dev/fs"); + if (!dirp) + { + g_warning ("unable to read /dev/fs!"); + return NULL; + } + + while (1) + { + struct statvfs statbuf; + struct dirent entry; + struct dirent* result; + + if (readdir_r (dirp, &entry, &result) || result == NULL) + break; + + strcpy (filename, "/dev/fs/"); + strcat (filename, entry.d_name); + + if (statvfs (filename, &statbuf) == 0) + { + GUnixMountEntry* mount_entry = g_new0(GUnixMountEntry, 1); + + mount_entry->mount_path = g_strdup (statbuf.f_mntonname); + mount_entry->device_path = g_strdup (statbuf.f_mntfromname); + mount_entry->filesystem_type = g_strdup (statbuf.f_fstypename); + + if (statbuf.f_flag & ST_RDONLY) + mount_entry->is_read_only = TRUE; + + return_list = g_list_prepend(return_list, mount_entry); + } + } + + return_list = g_list_reverse (return_list); + + closedir (dirp); + + return return_list; +} +#else +#error No _g_get_unix_mounts() implementation for system +#endif + +/* _g_get_unix_mount_points(): + * read the fstab. + * don't return swap and ignore mounts. + */ + +static char * +get_fstab_file (void) +{ +#if defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H) + /* AIX */ + return "/etc/filesystems"; +#elif defined(_PATH_MNTTAB) + return _PATH_MNTTAB; +#elif defined(VFSTAB) + return VFSTAB; +#else + return "/etc/fstab"; +#endif +} + +#ifdef HAVE_MNTENT_H +static GList * +_g_get_unix_mount_points (void) +{ +#ifdef HAVE_GETMNTENT_R + struct mntent ent; + char buf[1024]; +#endif + struct mntent *mntent; + FILE *file; + char *read_file; + GUnixMountPoint *mount_entry; + GList *return_list; + + read_file = get_fstab_file (); + + file = setmntent (read_file, "r"); + if (file == NULL) + return NULL; + + return_list = NULL; + +#ifdef HAVE_GETMNTENT_R + while ((mntent = getmntent_r (file, &ent, buf, sizeof (buf))) != NULL) +#else + G_LOCK (getmntent); + while ((mntent = getmntent (file)) != NULL) +#endif + { + if ((strcmp (mntent->mnt_dir, "ignore") == 0) || + (strcmp (mntent->mnt_dir, "swap") == 0)) + continue; + + mount_entry = g_new0 (GUnixMountPoint, 1); + mount_entry->mount_path = g_strdup (mntent->mnt_dir); + if (strcmp (mntent->mnt_fsname, "/dev/root") == 0) + mount_entry->device_path = g_strdup (_resolve_dev_root ()); + else + mount_entry->device_path = g_strdup (mntent->mnt_fsname); + mount_entry->filesystem_type = g_strdup (mntent->mnt_type); + +#ifdef HAVE_HASMNTOPT + if (hasmntopt (mntent, MNTOPT_RO) != NULL) + mount_entry->is_read_only = TRUE; + + if (hasmntopt (mntent, "loop") != NULL) + mount_entry->is_loopback = TRUE; + +#endif + + if ((mntent->mnt_type != NULL && strcmp ("supermount", mntent->mnt_type) == 0) +#ifdef HAVE_HASMNTOPT + || (hasmntopt (mntent, "user") != NULL + && hasmntopt (mntent, "user") != hasmntopt (mntent, "user_xattr")) + || hasmntopt (mntent, "pamconsole") != NULL + || hasmntopt (mntent, "users") != NULL + || hasmntopt (mntent, "owner") != NULL +#endif + ) + mount_entry->is_user_mountable = TRUE; + + return_list = g_list_prepend (return_list, mount_entry); + } + + endmntent (file); + +#ifndef HAVE_GETMNTENT_R + G_UNLOCK (getmntent); +#endif + + return g_list_reverse (return_list); +} + +#elif defined (HAVE_SYS_MNTTAB_H) + +static GList * +_g_get_unix_mount_points (void) +{ + struct mnttab mntent; + FILE *file; + char *read_file; + GUnixMountPoint *mount_entry; + GList *return_list; + + read_file = get_fstab_file (); + + file = setmntent (read_file, "r"); + if (file == NULL) + return NULL; + + return_list = NULL; + + G_LOCK (getmntent); + while (! getmntent (file, &mntent)) + { + if ((strcmp (mntent.mnt_mountp, "ignore") == 0) || + (strcmp (mntent.mnt_mountp, "swap") == 0)) + continue; + + mount_entry = g_new0 (GUnixMountPoint, 1); + + mount_entry->mount_path = g_strdup (mntent.mnt_mountp); + mount_entry->device_path = g_strdup (mntent.mnt_special); + mount_entry->filesystem_type = g_strdup (mntent.mnt_fstype); + +#ifdef HAVE_HASMNTOPT + if (hasmntopt (&mntent, MNTOPT_RO) != NULL) + mount_entry->is_read_only = TRUE; + + if (hasmntopt (&mntent, "lofs") != NULL) + mount_entry->is_loopback = TRUE; +#endif + + if ((mntent.mnt_fstype != NULL) +#ifdef HAVE_HASMNTOPT + || (hasmntopt (&mntent, "user") != NULL + && hasmntopt (&mntent, "user") != hasmntopt (&mntent, "user_xattr")) + || hasmntopt (&mntent, "pamconsole") != NULL + || hasmntopt (&mntent, "users") != NULL + || hasmntopt (&mntent, "owner") != NULL +#endif + ) + mount_entry->is_user_mountable = TRUE; + + return_list = g_list_prepend (return_list, mount_entry); + } + + endmntent (file); + G_UNLOCK (getmntent); + + return g_list_reverse (return_list); +} +#elif defined(HAVE_SYS_MNTCTL_H) && defined(HAVE_SYS_VMOUNT_H) && defined(HAVE_SYS_VFS_H) + +/* functions to parse /etc/filesystems on aix */ + +/* read character, ignoring comments (begin with '*', end with '\n' */ +static int +aix_fs_getc (FILE *fd) +{ + int c; + + while ((c = getc (fd)) == '*') + { + while (((c = getc (fd)) != '\n') && (c != EOF)) + ; + } +} + +/* eat all continuous spaces in a file */ +static int +aix_fs_ignorespace (FILE *fd) +{ + int c; + + while ((c = aix_fs_getc (fd)) != EOF) + { + if (!g_ascii_isspace (c)) + { + ungetc (c,fd); + return c; + } + } + + return EOF; +} + +/* read one word from file */ +static int +aix_fs_getword (FILE *fd, + char *word) +{ + int c; + + aix_fs_ignorespace (fd); + + while (((c = aix_fs_getc (fd)) != EOF) && !g_ascii_isspace (c)) + { + if (c == '"') + { + while (((c = aix_fs_getc (fd)) != EOF) && (c != '"')) + *word++ = c; + else + *word++ = c; + } + } + *word = 0; + + return c; +} + +typedef struct { + char mnt_mount[PATH_MAX]; + char mnt_special[PATH_MAX]; + char mnt_fstype[16]; + char mnt_options[128]; +} AixMountTableEntry; + +/* read mount points properties */ +static int +aix_fs_get (FILE *fd, + AixMountTableEntry *prop) +{ + static char word[PATH_MAX] = { 0 }; + char value[PATH_MAX]; + + /* read stanza */ + if (word[0] == 0) + { + if (aix_fs_getword (fd, word) == EOF) + return EOF; + } + + word[strlen(word) - 1] = 0; + strcpy (prop->mnt_mount, word); + + /* read attributes and value */ + + while (aix_fs_getword (fd, word) != EOF) + { + /* test if is attribute or new stanza */ + if (word[strlen(word) - 1] == ':') + return 0; + + /* read "=" */ + aix_fs_getword (fd, value); + + /* read value */ + aix_fs_getword (fd, value); + + if (strcmp (word, "dev") == 0) + strcpy (prop->mnt_special, value); + else if (strcmp (word, "vfs") == 0) + strcpy (prop->mnt_fstype, value); + else if (strcmp (word, "options") == 0) + strcpy(prop->mnt_options, value); + } + + return 0; +} + +static GList * +_g_get_unix_mount_points (void) +{ + struct mntent *mntent; + FILE *file; + char *read_file; + GUnixMountPoint *mount_entry; + AixMountTableEntry mntent; + GList *return_list; + + read_file = get_fstab_file (); + + file = setmntent (read_file, "r"); + if (file == NULL) + return NULL; + + return_list = NULL; + + while (!aix_fs_get (file, &mntent)) + { + if (strcmp ("cdrfs", mntent.mnt_fstype) == 0) + { + mount_entry = g_new0 (GUnixMountPoint, 1); + + mount_entry->mount_path = g_strdup (mntent.mnt_mount); + mount_entry->device_path = g_strdup (mntent.mnt_special); + mount_entry->filesystem_type = g_strdup (mntent.mnt_fstype); + mount_entry->is_read_only = TRUE; + mount_entry->is_user_mountable = TRUE; + + return_list = g_list_prepend (return_list, mount_entry); + } + } + + endmntent (file); + + return g_list_reverse (return_list); +} + +#elif defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H) + +static GList * +_g_get_unix_mount_points (void) +{ + struct fstab *fstab = NULL; + GUnixMountPoint *mount_entry; + GList *return_list; +#ifdef HAVE_SYS_SYSCTL_H + int usermnt = 0; + size_t len = sizeof(usermnt); + struct stat sb; +#endif + + if (!setfsent ()) + return NULL; + + return_list = NULL; + +#ifdef HAVE_SYS_SYSCTL_H +#if defined(HAVE_SYSCTLBYNAME) + sysctlbyname ("vfs.usermount", &usermnt, &len, NULL, 0); +#elif defined(CTL_VFS) && defined(VFS_USERMOUNT) + { + int mib[2]; + + mib[0] = CTL_VFS; + mib[1] = VFS_USERMOUNT; + sysctl (mib, 2, &usermnt, &len, NULL, 0); + } +#elif defined(CTL_KERN) && defined(KERN_USERMOUNT) + { + int mib[2]; + + mib[0] = CTL_KERN; + mib[1] = KERN_USERMOUNT; + sysctl (mib, 2, &usermnt, &len, NULL, 0); + } +#endif +#endif + + while ((fstab = getfsent ()) != NULL) + { + if (strcmp (fstab->fs_vfstype, "swap") == 0) + continue; + + mount_entry = g_new0 (GUnixMountPoint, 1); + + mount_entry->mount_path = g_strdup (fstab->fs_file); + mount_entry->device_path = g_strdup (fstab->fs_spec); + mount_entry->filesystem_type = g_strdup (fstab->fs_vfstype); + + if (strcmp (fstab->fs_type, "ro") == 0) + mount_entry->is_read_only = TRUE; + +#ifdef HAVE_SYS_SYSCTL_H + if (usermnt != 0) + { + uid_t uid = getuid (); + if (stat (fstab->fs_file, &sb) == 0) + { + if (uid == 0 || sb.st_uid == uid) + mount_entry->is_user_mountable = TRUE; + } + } +#endif + + return_list = g_list_prepend (return_list, mount_entry); + } + + endfsent (); + + return g_list_reverse (return_list); +} +#elif defined(__INTERIX) +static GList * +_g_get_unix_mount_points (void) +{ + return _g_get_unix_mounts (); +} +#else +#error No g_get_mount_table() implementation for system +#endif + +static guint64 +get_mounts_timestamp (void) +{ + const char *monitor_file; + struct stat buf; + + monitor_file = get_mtab_monitor_file (); + if (monitor_file) + { + if (stat (monitor_file, &buf) == 0) + return (guint64)buf.st_mtime; + } + return 0; +} + +static guint64 +get_mount_points_timestamp (void) +{ + const char *monitor_file; + struct stat buf; + + monitor_file = get_fstab_file (); + if (monitor_file) + { + if (stat (monitor_file, &buf) == 0) + return (guint64)buf.st_mtime; + } + return 0; +} + +/** + * g_unix_mounts_get: + * @time_read: guint64 to contain a timestamp. + * + * Gets a #GList of strings containing the unix mounts. + * If @time_read is set, it will be filled with the mount + * timestamp, allowing for checking if the mounts have changed + * with g_unix_mounts_changed_since(). + * + * Returns: a #GList of the UNIX mounts. + **/ +GList * +g_unix_mounts_get (guint64 *time_read) +{ + if (time_read) + *time_read = get_mounts_timestamp (); + + return _g_get_unix_mounts (); +} + +/** + * g_unix_mount_at: + * @mount_path: path for a possible unix mount. + * @time_read: guint64 to contain a timestamp. + * + * Gets a #GUnixMountEntry for a given mount path. If @time_read + * is set, it will be filled with a unix timestamp for checking + * if the mounts have changed since with g_unix_mounts_changed_since(). + * + * Returns: a #GUnixMount. + **/ +GUnixMountEntry * +g_unix_mount_at (const char *mount_path, + guint64 *time_read) +{ + GList *mounts, *l; + GUnixMountEntry *mount_entry, *found; + + mounts = g_unix_mounts_get (time_read); + + found = NULL; + for (l = mounts; l != NULL; l = l->next) + { + mount_entry = l->data; + + if (!found && strcmp (mount_path, mount_entry->mount_path) == 0) + found = mount_entry; + else + g_unix_mount_free (mount_entry); + } + g_list_free (mounts); + + return found; +} + +/** + * g_unix_mount_points_get: + * @time_read: guint64 to contain a timestamp. + * + * Gets a #GList of strings containing the unix mount points. + * If @time_read is set, it will be filled with the mount timestamp, + * allowing for checking if the mounts have changed with + * g_unix_mounts_points_changed_since(). + * + * Returns: a #GList of the UNIX mountpoints. + **/ +GList * +g_unix_mount_points_get (guint64 *time_read) +{ + if (time_read) + *time_read = get_mount_points_timestamp (); + + return _g_get_unix_mount_points (); +} + +/** + * g_unix_mounts_changed_since: + * @time: guint64 to contain a timestamp. + * + * Checks if the unix mounts have changed since a given unix time. + * + * Returns: %TRUE if the mounts have changed since @time. + **/ +gboolean +g_unix_mounts_changed_since (guint64 time) +{ + return get_mounts_timestamp () != time; +} + +/** + * g_unix_mount_points_changed_since: + * @time: guint64 to contain a timestamp. + * + * Checks if the unix mount points have changed since a given unix time. + * + * Returns: %TRUE if the mount points have changed since @time. + **/ +gboolean +g_unix_mount_points_changed_since (guint64 time) +{ + return get_mount_points_timestamp () != time; +} + +static void +g_unix_mount_monitor_finalize (GObject *object) +{ + GUnixMountMonitor *monitor; + + monitor = G_UNIX_MOUNT_MONITOR (object); + + if (monitor->fstab_monitor) + { + g_file_monitor_cancel (monitor->fstab_monitor); + g_object_unref (monitor->fstab_monitor); + } + + if (monitor->mtab_monitor) + { + g_file_monitor_cancel (monitor->mtab_monitor); + g_object_unref (monitor->mtab_monitor); + } + + the_mount_monitor = NULL; + + G_OBJECT_CLASS (g_unix_mount_monitor_parent_class)->finalize (object); +} + + +static void +g_unix_mount_monitor_class_init (GUnixMountMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_unix_mount_monitor_finalize; + + /** + * GUnixMountMonitor::mounts-changed: + * @monitor: the object on which the signal is emitted + * + * Emitted when the unix mounts have changed. + */ + signals[MOUNTS_CHANGED] = + g_signal_new ("mounts-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GUnixMountMonitor::mountpoints-changed: + * @monitor: the object on which the signal is emitted + * + * Emitted when the unix mount points have changed. + */ + signals[MOUNTPOINTS_CHANGED] = + g_signal_new ("mountpoints-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +static void +fstab_file_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GUnixMountMonitor *mount_monitor; + + if (event_type != G_FILE_MONITOR_EVENT_CHANGED && + event_type != G_FILE_MONITOR_EVENT_CREATED && + event_type != G_FILE_MONITOR_EVENT_DELETED) + return; + + mount_monitor = user_data; + g_signal_emit (mount_monitor, signals[MOUNTPOINTS_CHANGED], 0); +} + +static void +mtab_file_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GUnixMountMonitor *mount_monitor; + + if (event_type != G_FILE_MONITOR_EVENT_CHANGED && + event_type != G_FILE_MONITOR_EVENT_CREATED && + event_type != G_FILE_MONITOR_EVENT_DELETED) + return; + + mount_monitor = user_data; + g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0); +} + +static void +g_unix_mount_monitor_init (GUnixMountMonitor *monitor) +{ + GFile *file; + + if (get_fstab_file () != NULL) + { + file = g_file_new_for_path (get_fstab_file ()); + monitor->fstab_monitor = g_file_monitor_file (file, 0, NULL, NULL); + g_object_unref (file); + + g_signal_connect (monitor->fstab_monitor, "changed", (GCallback)fstab_file_changed, monitor); + } + + if (get_mtab_monitor_file () != NULL) + { + file = g_file_new_for_path (get_mtab_monitor_file ()); + monitor->mtab_monitor = g_file_monitor_file (file, 0, NULL, NULL); + g_object_unref (file); + + g_signal_connect (monitor->mtab_monitor, "changed", (GCallback)mtab_file_changed, monitor); + } +} + +/** + * g_unix_mount_monitor_set_rate_limit: + * @mount_monitor: a #GUnixMountMonitor + * @limit_msec: a integer with the limit in milliseconds to + * poll for changes. + * + * Sets the rate limit to which the @mount_monitor will report + * consecutive change events to the mount and mount point entry files. + * + * Since: 2.18 + */ +void +g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor, + gint limit_msec) +{ + g_return_if_fail (G_IS_UNIX_MOUNT_MONITOR (mount_monitor)); + + if (mount_monitor->fstab_monitor != NULL) + g_file_monitor_set_rate_limit (mount_monitor->fstab_monitor, limit_msec); + + if (mount_monitor->mtab_monitor != NULL) + g_file_monitor_set_rate_limit (mount_monitor->mtab_monitor, limit_msec); +} + +/** + * g_unix_mount_monitor_new: + * + * Gets a new #GUnixMountMonitor. The default rate limit for which the + * monitor will report consecutive changes for the mount and mount + * point entry files is the default for a #GFileMonitor. Use + * g_unix_mount_monitor_set_rate_limit() to change this. + * + * Returns: a #GUnixMountMonitor. + */ +GUnixMountMonitor * +g_unix_mount_monitor_new (void) +{ + if (the_mount_monitor == NULL) + { + the_mount_monitor = g_object_new (G_TYPE_UNIX_MOUNT_MONITOR, NULL); + return the_mount_monitor; + } + + return g_object_ref (the_mount_monitor); +} + +/** + * g_unix_mount_free: + * @mount_entry: a #GUnixMount. + * + * Frees a unix mount. + */ +void +g_unix_mount_free (GUnixMountEntry *mount_entry) +{ + g_return_if_fail (mount_entry != NULL); + + g_free (mount_entry->mount_path); + g_free (mount_entry->device_path); + g_free (mount_entry->filesystem_type); + g_free (mount_entry); +} + +/** + * g_unix_mount_point_free: + * @mount_point: unix mount point to free. + * + * Frees a unix mount point. + */ +void +g_unix_mount_point_free (GUnixMountPoint *mount_point) +{ + g_return_if_fail (mount_point != NULL); + + g_free (mount_point->mount_path); + g_free (mount_point->device_path); + g_free (mount_point->filesystem_type); + g_free (mount_point); +} + +/** + * g_unix_mount_compare: + * @mount1: first #GUnixMountEntry to compare. + * @mount2: second #GUnixMountEntry to compare. + * + * Compares two unix mounts. + * + * Returns: 1, 0 or -1 if @mount1 is greater than, equal to, + * or less than @mount2, respectively. + */ +gint +g_unix_mount_compare (GUnixMountEntry *mount1, + GUnixMountEntry *mount2) +{ + int res; + + g_return_val_if_fail (mount1 != NULL && mount2 != NULL, 0); + + res = g_strcmp0 (mount1->mount_path, mount2->mount_path); + if (res != 0) + return res; + + res = g_strcmp0 (mount1->device_path, mount2->device_path); + if (res != 0) + return res; + + res = g_strcmp0 (mount1->filesystem_type, mount2->filesystem_type); + if (res != 0) + return res; + + res = mount1->is_read_only - mount2->is_read_only; + if (res != 0) + return res; + + return 0; +} + +/** + * g_unix_mount_get_mount_path: + * @mount_entry: input #GUnixMountEntry to get the mount path for. + * + * Gets the mount path for a unix mount. + * + * Returns: the mount path for @mount_entry. + */ +const gchar * +g_unix_mount_get_mount_path (GUnixMountEntry *mount_entry) +{ + g_return_val_if_fail (mount_entry != NULL, NULL); + + return mount_entry->mount_path; +} + +/** + * g_unix_mount_get_device_path: + * @mount_entry: a #GUnixMount. + * + * Gets the device path for a unix mount. + * + * Returns: a string containing the device path. + */ +const gchar * +g_unix_mount_get_device_path (GUnixMountEntry *mount_entry) +{ + g_return_val_if_fail (mount_entry != NULL, NULL); + + return mount_entry->device_path; +} + +/** + * g_unix_mount_get_fs_type: + * @mount_entry: a #GUnixMount. + * + * Gets the filesystem type for the unix mount. + * + * Returns: a string containing the file system type. + */ +const gchar * +g_unix_mount_get_fs_type (GUnixMountEntry *mount_entry) +{ + g_return_val_if_fail (mount_entry != NULL, NULL); + + return mount_entry->filesystem_type; +} + +/** + * g_unix_mount_is_readonly: + * @mount_entry: a #GUnixMount. + * + * Checks if a unix mount is mounted read only. + * + * Returns: %TRUE if @mount_entry is read only. + */ +gboolean +g_unix_mount_is_readonly (GUnixMountEntry *mount_entry) +{ + g_return_val_if_fail (mount_entry != NULL, FALSE); + + return mount_entry->is_read_only; +} + +/** + * g_unix_mount_is_system_internal: + * @mount_entry: a #GUnixMount. + * + * Checks if a unix mount is a system path. + * + * Returns: %TRUE if the unix mount is for a system path. + */ +gboolean +g_unix_mount_is_system_internal (GUnixMountEntry *mount_entry) +{ + g_return_val_if_fail (mount_entry != NULL, FALSE); + + return mount_entry->is_system_internal; +} + +/** + * g_unix_mount_point_compare: + * @mount1: a #GUnixMount. + * @mount2: a #GUnixMount. + * + * Compares two unix mount points. + * + * Returns: 1, 0 or -1 if @mount1 is greater than, equal to, + * or less than @mount2, respectively. + */ +gint +g_unix_mount_point_compare (GUnixMountPoint *mount1, + GUnixMountPoint *mount2) +{ + int res; + + g_return_val_if_fail (mount1 != NULL && mount2 != NULL, 0); + + res = g_strcmp0 (mount1->mount_path, mount2->mount_path); + if (res != 0) + return res; + + res = g_strcmp0 (mount1->device_path, mount2->device_path); + if (res != 0) + return res; + + res = g_strcmp0 (mount1->filesystem_type, mount2->filesystem_type); + if (res != 0) + return res; + + res = mount1->is_read_only - mount2->is_read_only; + if (res != 0) + return res; + + res = mount1->is_user_mountable - mount2->is_user_mountable; + if (res != 0) + return res; + + res = mount1->is_loopback - mount2->is_loopback; + if (res != 0) + return res; + + return 0; +} + +/** + * g_unix_mount_point_get_mount_path: + * @mount_point: a #GUnixMountPoint. + * + * Gets the mount path for a unix mount point. + * + * Returns: a string containing the mount path. + */ +const gchar * +g_unix_mount_point_get_mount_path (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, NULL); + + return mount_point->mount_path; +} + +/** + * g_unix_mount_point_get_device_path: + * @mount_point: a #GUnixMountPoint. + * + * Gets the device path for a unix mount point. + * + * Returns: a string containing the device path. + */ +const gchar * +g_unix_mount_point_get_device_path (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, NULL); + + return mount_point->device_path; +} + +/** + * g_unix_mount_point_get_fs_type: + * @mount_point: a #GUnixMountPoint. + * + * Gets the file system type for the mount point. + * + * Returns: a string containing the file system type. + */ +const gchar * +g_unix_mount_point_get_fs_type (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, NULL); + + return mount_point->filesystem_type; +} + +/** + * g_unix_mount_point_is_readonly: + * @mount_point: a #GUnixMountPoint. + * + * Checks if a unix mount point is read only. + * + * Returns: %TRUE if a mount point is read only. + */ +gboolean +g_unix_mount_point_is_readonly (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, FALSE); + + return mount_point->is_read_only; +} + +/** + * g_unix_mount_point_is_user_mountable: + * @mount_point: a #GUnixMountPoint. + * + * Checks if a unix mount point is mountable by the user. + * + * Returns: %TRUE if the mount point is user mountable. + */ +gboolean +g_unix_mount_point_is_user_mountable (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, FALSE); + + return mount_point->is_user_mountable; +} + +/** + * g_unix_mount_point_is_loopback: + * @mount_point: a #GUnixMountPoint. + * + * Checks if a unix mount point is a loopback device. + * + * Returns: %TRUE if the mount point is a loopback. %FALSE otherwise. + */ +gboolean +g_unix_mount_point_is_loopback (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, FALSE); + + return mount_point->is_loopback; +} + +static GUnixMountType +guess_mount_type (const char *mount_path, + const char *device_path, + const char *filesystem_type) +{ + GUnixMountType type; + char *basename; + + type = G_UNIX_MOUNT_TYPE_UNKNOWN; + + if ((strcmp (filesystem_type, "udf") == 0) || + (strcmp (filesystem_type, "iso9660") == 0) || + (strcmp (filesystem_type, "cd9660") == 0)) + type = G_UNIX_MOUNT_TYPE_CDROM; + else if ((strcmp (filesystem_type, "nfs") == 0) || + (strcmp (filesystem_type, "nfs4") == 0)) + type = G_UNIX_MOUNT_TYPE_NFS; + else if (g_str_has_prefix (device_path, "/vol/dev/diskette/") || + g_str_has_prefix (device_path, "/dev/fd") || + g_str_has_prefix (device_path, "/dev/floppy")) + type = G_UNIX_MOUNT_TYPE_FLOPPY; + else if (g_str_has_prefix (device_path, "/dev/cdrom") || + g_str_has_prefix (device_path, "/dev/acd") || + g_str_has_prefix (device_path, "/dev/cd")) + type = G_UNIX_MOUNT_TYPE_CDROM; + else if (g_str_has_prefix (device_path, "/vol/")) + { + const char *name = mount_path + strlen ("/"); + + if (g_str_has_prefix (name, "cdrom")) + type = G_UNIX_MOUNT_TYPE_CDROM; + else if (g_str_has_prefix (name, "floppy") || + g_str_has_prefix (device_path, "/vol/dev/diskette/")) + type = G_UNIX_MOUNT_TYPE_FLOPPY; + else if (g_str_has_prefix (name, "rmdisk")) + type = G_UNIX_MOUNT_TYPE_ZIP; + else if (g_str_has_prefix (name, "jaz")) + type = G_UNIX_MOUNT_TYPE_JAZ; + else if (g_str_has_prefix (name, "memstick")) + type = G_UNIX_MOUNT_TYPE_MEMSTICK; + } + else + { + basename = g_path_get_basename (mount_path); + + if (g_str_has_prefix (basename, "cdr") || + g_str_has_prefix (basename, "cdwriter") || + g_str_has_prefix (basename, "burn") || + g_str_has_prefix (basename, "dvdr")) + type = G_UNIX_MOUNT_TYPE_CDROM; + else if (g_str_has_prefix (basename, "floppy")) + type = G_UNIX_MOUNT_TYPE_FLOPPY; + else if (g_str_has_prefix (basename, "zip")) + type = G_UNIX_MOUNT_TYPE_ZIP; + else if (g_str_has_prefix (basename, "jaz")) + type = G_UNIX_MOUNT_TYPE_JAZ; + else if (g_str_has_prefix (basename, "camera")) + type = G_UNIX_MOUNT_TYPE_CAMERA; + else if (g_str_has_prefix (basename, "memstick") || + g_str_has_prefix (basename, "memory_stick") || + g_str_has_prefix (basename, "ram")) + type = G_UNIX_MOUNT_TYPE_MEMSTICK; + else if (g_str_has_prefix (basename, "compact_flash")) + type = G_UNIX_MOUNT_TYPE_CF; + else if (g_str_has_prefix (basename, "smart_media")) + type = G_UNIX_MOUNT_TYPE_SM; + else if (g_str_has_prefix (basename, "sd_mmc")) + type = G_UNIX_MOUNT_TYPE_SDMMC; + else if (g_str_has_prefix (basename, "ipod")) + type = G_UNIX_MOUNT_TYPE_IPOD; + + g_free (basename); + } + + if (type == G_UNIX_MOUNT_TYPE_UNKNOWN) + type = G_UNIX_MOUNT_TYPE_HD; + + return type; +} + +/* + * g_unix_mount_guess_type: + * @mount_entry: a #GUnixMount. + * + * Guesses the type of a unix mount. If the mount type cannot be + * determined, returns %G_UNIX_MOUNT_TYPE_UNKNOWN. + * + * Returns: a #GUnixMountType. + */ +static GUnixMountType +g_unix_mount_guess_type (GUnixMountEntry *mount_entry) +{ + g_return_val_if_fail (mount_entry != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + g_return_val_if_fail (mount_entry->mount_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + g_return_val_if_fail (mount_entry->device_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + g_return_val_if_fail (mount_entry->filesystem_type != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + + return guess_mount_type (mount_entry->mount_path, + mount_entry->device_path, + mount_entry->filesystem_type); +} + +/* + * g_unix_mount_point_guess_type: + * @mount_point: a #GUnixMountPoint. + * + * Guesses the type of a unix mount point. + * If the mount type cannot be determined, + * returns %G_UNIX_MOUNT_TYPE_UNKNOWN. + * + * Returns: a #GUnixMountType. + */ +static GUnixMountType +g_unix_mount_point_guess_type (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + g_return_val_if_fail (mount_point->mount_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + g_return_val_if_fail (mount_point->device_path != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + g_return_val_if_fail (mount_point->filesystem_type != NULL, G_UNIX_MOUNT_TYPE_UNKNOWN); + + return guess_mount_type (mount_point->mount_path, + mount_point->device_path, + mount_point->filesystem_type); +} + +static const char * +type_to_icon (GUnixMountType type, gboolean is_mount_point) +{ + const char *icon_name; + + switch (type) + { + case G_UNIX_MOUNT_TYPE_HD: + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "drive-harddisk"; + break; + case G_UNIX_MOUNT_TYPE_FLOPPY: + case G_UNIX_MOUNT_TYPE_ZIP: + case G_UNIX_MOUNT_TYPE_JAZ: + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "media-floppy"; + break; + case G_UNIX_MOUNT_TYPE_CDROM: + if (is_mount_point) + icon_name = "drive-optical"; + else + icon_name = "media-optical"; + break; + case G_UNIX_MOUNT_TYPE_NFS: + /* TODO: Would like a better icon here... */ + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "drive-harddisk"; + break; + case G_UNIX_MOUNT_TYPE_MEMSTICK: + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "media-flash"; + break; + case G_UNIX_MOUNT_TYPE_CAMERA: + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "camera-photo"; + break; + case G_UNIX_MOUNT_TYPE_IPOD: + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "multimedia-player"; + break; + case G_UNIX_MOUNT_TYPE_UNKNOWN: + default: + if (is_mount_point) + icon_name = "drive-removable-media"; + else + icon_name = "drive-harddisk"; + break; + } + + return icon_name; +} + +/** + * g_unix_mount_guess_name: + * @mount_entry: a #GUnixMountEntry + * + * Guesses the name of a Unix mount. + * The result is a translated string. + * + * Returns: A newly allocated string that must + * be freed with g_free() + */ +gchar * +g_unix_mount_guess_name (GUnixMountEntry *mount_entry) +{ + char *name; + + if (strcmp (mount_entry->mount_path, "/") == 0) + name = g_strdup (_("Filesystem root")); + else + name = g_filename_display_basename (mount_entry->mount_path); + + return name; +} + +/** + * g_unix_mount_guess_icon: + * @mount_entry: a #GUnixMountEntry + * + * Guesses the icon of a Unix mount. + * + * Returns: a #GIcon + */ +GIcon * +g_unix_mount_guess_icon (GUnixMountEntry *mount_entry) +{ + return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_guess_type (mount_entry), FALSE)); +} + +/** + * g_unix_mount_point_guess_name: + * @mount_point: a #GUnixMountPoint + * + * Guesses the name of a Unix mount point. + * The result is a translated string. + * + * Returns: A newly allocated string that must + * be freed with g_free() + */ +gchar * +g_unix_mount_point_guess_name (GUnixMountPoint *mount_point) +{ + char *name; + + if (strcmp (mount_point->mount_path, "/") == 0) + name = g_strdup (_("Filesystem root")); + else + name = g_filename_display_basename (mount_point->mount_path); + + return name; +} + +/** + * g_unix_mount_point_guess_icon: + * @mount_point: a #GUnixMountPoint + * + * Guesses the icon of a Unix mount point. + * + * Returns: a #GIcon + */ +GIcon * +g_unix_mount_point_guess_icon (GUnixMountPoint *mount_point) +{ + return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_point_guess_type (mount_point), TRUE)); +} + +/** + * g_unix_mount_guess_can_eject: + * @mount_entry: a #GUnixMountEntry + * + * Guesses whether a Unix mount can be ejected. + * + * Returns: %TRUE if @mount_entry is deemed to be ejectable. + */ +gboolean +g_unix_mount_guess_can_eject (GUnixMountEntry *mount_entry) +{ + GUnixMountType guessed_type; + + guessed_type = g_unix_mount_guess_type (mount_entry); + if (guessed_type == G_UNIX_MOUNT_TYPE_IPOD || + guessed_type == G_UNIX_MOUNT_TYPE_CDROM) + return TRUE; + + return FALSE; +} + +/** + * g_unix_mount_guess_should_display: + * @mount_entry: a #GUnixMountEntry + * + * Guesses whether a Unix mount should be displayed in the UI. + * + * Returns: %TRUE if @mount_entry is deemed to be displayable. + */ +gboolean +g_unix_mount_guess_should_display (GUnixMountEntry *mount_entry) +{ + const char *mount_path; + + /* Never display internal mountpoints */ + if (g_unix_mount_is_system_internal (mount_entry)) + return FALSE; + + /* Only display things in /media (which are generally user mountable) + and home dir (fuse stuff) */ + mount_path = mount_entry->mount_path; + if (mount_path != NULL) + { + if (g_str_has_prefix (mount_path, "/media/")) + { + char *path; + /* Avoid displaying mounts that are not accessible to the user. + * + * See http://bugzilla.gnome.org/show_bug.cgi?id=526320 for why we + * want to avoid g_access() for mount points which can potentially + * block or fail stat()'ing, such as network mounts. + */ + path = g_path_get_dirname (mount_path); + if (g_str_has_prefix (path, "/media/")) + { + if (g_access (path, R_OK|X_OK) != 0) + { + g_free (path); + return FALSE; + } + } + g_free (path); + + if (mount_entry->device_path && mount_entry->device_path[0] == '/') + { + struct stat st; + if (g_stat (mount_entry->device_path, &st) == 0 && + S_ISBLK(st.st_mode) && + g_access (mount_path, R_OK|X_OK) != 0) + return FALSE; + } + return TRUE; + } + + if (g_str_has_prefix (mount_path, g_get_home_dir ()) && + mount_path[strlen (g_get_home_dir())] == G_DIR_SEPARATOR) + return TRUE; + } + + return FALSE; +} + +/** + * g_unix_mount_point_guess_can_eject: + * @mount_point: a #GUnixMountPoint + * + * Guesses whether a Unix mount point can be ejected. + * + * Returns: %TRUE if @mount_point is deemed to be ejectable. + */ +gboolean +g_unix_mount_point_guess_can_eject (GUnixMountPoint *mount_point) +{ + GUnixMountType guessed_type; + + guessed_type = g_unix_mount_point_guess_type (mount_point); + if (guessed_type == G_UNIX_MOUNT_TYPE_IPOD || + guessed_type == G_UNIX_MOUNT_TYPE_CDROM) + return TRUE; + + return FALSE; +} + + +/* borrowed from gtk/gtkfilesystemunix.c in GTK+ on 02/23/2006 */ +static void +_canonicalize_filename (gchar *filename) +{ + gchar *p, *q; + gboolean last_was_slash = FALSE; + + p = filename; + q = filename; + + while (*p) + { + if (*p == G_DIR_SEPARATOR) + { + if (!last_was_slash) + *q++ = G_DIR_SEPARATOR; + + last_was_slash = TRUE; + } + else + { + if (last_was_slash && *p == '.') + { + if (*(p + 1) == G_DIR_SEPARATOR || + *(p + 1) == '\0') + { + if (*(p + 1) == '\0') + break; + + p += 1; + } + else if (*(p + 1) == '.' && + (*(p + 2) == G_DIR_SEPARATOR || + *(p + 2) == '\0')) + { + if (q > filename + 1) + { + q--; + while (q > filename + 1 && + *(q - 1) != G_DIR_SEPARATOR) + q--; + } + + if (*(p + 2) == '\0') + break; + + p += 2; + } + else + { + *q++ = *p; + last_was_slash = FALSE; + } + } + else + { + *q++ = *p; + last_was_slash = FALSE; + } + } + + p++; + } + + if (q > filename + 1 && *(q - 1) == G_DIR_SEPARATOR) + q--; + + *q = '\0'; +} + +static char * +_resolve_symlink (const char *file) +{ + GError *error; + char *dir; + char *link; + char *f; + char *f1; + + f = g_strdup (file); + + while (g_file_test (f, G_FILE_TEST_IS_SYMLINK)) + { + link = g_file_read_link (f, &error); + if (link == NULL) + { + g_error_free (error); + g_free (f); + f = NULL; + goto out; + } + + dir = g_path_get_dirname (f); + f1 = g_strdup_printf ("%s/%s", dir, link); + g_free (dir); + g_free (link); + g_free (f); + f = f1; + } + + out: + if (f != NULL) + _canonicalize_filename (f); + return f; +} + +#ifdef HAVE_MNTENT_H +static const char * +_resolve_dev_root (void) +{ + static gboolean have_real_dev_root = FALSE; + static char real_dev_root[256]; + struct stat statbuf; + + /* see if it's cached already */ + if (have_real_dev_root) + goto found; + + /* otherwise we're going to find it right away.. */ + have_real_dev_root = TRUE; + + if (stat ("/dev/root", &statbuf) == 0) + { + if (! S_ISLNK (statbuf.st_mode)) + { + dev_t root_dev = statbuf.st_dev; + FILE *f; + char buf[1024]; + + /* see if device with similar major:minor as /dev/root is mention + * in /etc/mtab (it usually is) + */ + f = fopen ("/etc/mtab", "r"); + if (f != NULL) + { + struct mntent *entp; +#ifdef HAVE_GETMNTENT_R + struct mntent ent; + while ((entp = getmntent_r (f, &ent, buf, sizeof (buf))) != NULL) + { +#else + G_LOCK (getmntent); + while ((entp = getmntent (f)) != NULL) + { +#endif + if (stat (entp->mnt_fsname, &statbuf) == 0 && + statbuf.st_dev == root_dev) + { + strncpy (real_dev_root, entp->mnt_fsname, sizeof (real_dev_root) - 1); + real_dev_root[sizeof (real_dev_root) - 1] = '\0'; + fclose (f); + goto found; + } + } + + endmntent (f); + +#ifndef HAVE_GETMNTENT_R + G_UNLOCK (getmntent); +#endif + } + + /* no, that didn't work.. next we could scan /dev ... but I digress.. */ + + } + else + { + char *resolved; + resolved = _resolve_symlink ("/dev/root"); + if (resolved != NULL) + { + strncpy (real_dev_root, resolved, sizeof (real_dev_root) - 1); + real_dev_root[sizeof (real_dev_root) - 1] = '\0'; + g_free (resolved); + goto found; + } + } + } + + /* bah sucks.. */ + strcpy (real_dev_root, "/dev/root"); + +found: + return real_dev_root; +} +#endif + +#define __G_UNIX_MOUNTS_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixmounts.h b/gio/gunixmounts.h new file mode 100644 index 0000000..55aa3cc --- /dev/null +++ b/gio/gunixmounts.h @@ -0,0 +1,102 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_UNIX_MOUNTS_H__ +#define __G_UNIX_MOUNTS_H__ + +#include + +G_BEGIN_DECLS + +/** + * GUnixMountEntry: + * + * Defines a Unix mount entry (e.g. /media/cdrom). + * This corresponds roughly to a mtab entry. + **/ +typedef struct _GUnixMountEntry GUnixMountEntry; + +/** + * GUnixMountPoint: + * + * Defines a Unix mount point (e.g. /dev). + * This corresponds roughly to a fstab entry. + **/ +typedef struct _GUnixMountPoint GUnixMountPoint; + +/** + * GUnixMountMonitor: + * + * Watches #GUnixMounts for changes. + **/ +typedef struct _GUnixMountMonitor GUnixMountMonitor; +typedef struct _GUnixMountMonitorClass GUnixMountMonitorClass; + +#define G_TYPE_UNIX_MOUNT_MONITOR (g_unix_mount_monitor_get_type ()) +#define G_UNIX_MOUNT_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_MOUNT_MONITOR, GUnixMountMonitor)) +#define G_UNIX_MOUNT_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_MOUNT_MONITOR, GUnixMountMonitorClass)) +#define G_IS_UNIX_MOUNT_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_MOUNT_MONITOR)) +#define G_IS_UNIX_MOUNT_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_MOUNT_MONITOR)) + +void g_unix_mount_free (GUnixMountEntry *mount_entry); +void g_unix_mount_point_free (GUnixMountPoint *mount_point); +gint g_unix_mount_compare (GUnixMountEntry *mount1, + GUnixMountEntry *mount2); +const char * g_unix_mount_get_mount_path (GUnixMountEntry *mount_entry); +const char * g_unix_mount_get_device_path (GUnixMountEntry *mount_entry); +const char * g_unix_mount_get_fs_type (GUnixMountEntry *mount_entry); +gboolean g_unix_mount_is_readonly (GUnixMountEntry *mount_entry); +gboolean g_unix_mount_is_system_internal (GUnixMountEntry *mount_entry); +gboolean g_unix_mount_guess_can_eject (GUnixMountEntry *mount_entry); +gboolean g_unix_mount_guess_should_display (GUnixMountEntry *mount_entry); +char * g_unix_mount_guess_name (GUnixMountEntry *mount_entry); +GIcon * g_unix_mount_guess_icon (GUnixMountEntry *mount_entry); + +gint g_unix_mount_point_compare (GUnixMountPoint *mount1, + GUnixMountPoint *mount2); +const char * g_unix_mount_point_get_mount_path (GUnixMountPoint *mount_point); +const char * g_unix_mount_point_get_device_path (GUnixMountPoint *mount_point); +const char * g_unix_mount_point_get_fs_type (GUnixMountPoint *mount_point); +gboolean g_unix_mount_point_is_readonly (GUnixMountPoint *mount_point); +gboolean g_unix_mount_point_is_user_mountable (GUnixMountPoint *mount_point); +gboolean g_unix_mount_point_is_loopback (GUnixMountPoint *mount_point); +gboolean g_unix_mount_point_guess_can_eject (GUnixMountPoint *mount_point); +char * g_unix_mount_point_guess_name (GUnixMountPoint *mount_point); +GIcon * g_unix_mount_point_guess_icon (GUnixMountPoint *mount_point); + +GList * g_unix_mount_points_get (guint64 *time_read); +GList * g_unix_mounts_get (guint64 *time_read); +GUnixMountEntry *g_unix_mount_at (const char *mount_path, + guint64 *time_read); +gboolean g_unix_mounts_changed_since (guint64 time); +gboolean g_unix_mount_points_changed_since (guint64 time); + +GType g_unix_mount_monitor_get_type (void) G_GNUC_CONST; +GUnixMountMonitor *g_unix_mount_monitor_new (void); +void g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor, + int limit_msec); + +gboolean g_unix_is_mount_path_system_internal (const char *mount_path); + +G_END_DECLS + +#endif /* __G_UNIX_MOUNTS_H__ */ diff --git a/gio/gunixoutputstream.c b/gio/gunixoutputstream.c new file mode 100644 index 0000000..c294b86 --- /dev/null +++ b/gio/gunixoutputstream.c @@ -0,0 +1,604 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include "gioerror.h" +#include "gunixoutputstream.h" +#include "gcancellable.h" +#include "gsimpleasyncresult.h" +#include "gasynchelper.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gunixoutputstream + * @short_description: Streaming output operations for Unix file descriptors + * @include: gio/gunixoutputstream.h + * @see_also: #GOutputStream + * + * #GUnixOutputStream implements #GOutputStream for writing to a + * unix file descriptor, including asynchronous operations. The file + * descriptor must be selectable, so it doesn't work with opened files. + * + * Note that <gio/gunixoutputstream.h> belongs + * to the UNIX-specific GIO interfaces, thus you have to use the + * gio-unix-2.0.pc pkg-config file when using it. + */ + +enum { + PROP_0, + PROP_FD, + PROP_CLOSE_FD +}; + +G_DEFINE_TYPE (GUnixOutputStream, g_unix_output_stream, G_TYPE_OUTPUT_STREAM); + + +struct _GUnixOutputStreamPrivate { + int fd; + gboolean close_fd; +}; + +static void g_unix_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_unix_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static gssize g_unix_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_unix_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +static void g_unix_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gssize g_unix_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +static void g_unix_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data); +static gboolean g_unix_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); + + +static void +g_unix_output_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_unix_output_stream_parent_class)->finalize (object); +} + +static void +g_unix_output_stream_class_init (GUnixOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GUnixOutputStreamPrivate)); + + gobject_class->get_property = g_unix_output_stream_get_property; + gobject_class->set_property = g_unix_output_stream_set_property; + gobject_class->finalize = g_unix_output_stream_finalize; + + stream_class->write_fn = g_unix_output_stream_write; + stream_class->close_fn = g_unix_output_stream_close; + stream_class->write_async = g_unix_output_stream_write_async; + stream_class->write_finish = g_unix_output_stream_write_finish; + stream_class->close_async = g_unix_output_stream_close_async; + stream_class->close_finish = g_unix_output_stream_close_finish; + + /** + * GUnixOutputStream:fd: + * + * The file descriptor that the stream writes to. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_FD, + g_param_spec_int ("fd", + P_("File descriptor"), + P_("The file descriptor to write to"), + G_MININT, G_MAXINT, -1, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + /** + * GUnixOutputStream:close-fd: + * + * Whether to close the file descriptor when the stream is closed. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSE_FD, + g_param_spec_boolean ("close-fd", + P_("Close file descriptor"), + P_("Whether to close the file descriptor when the stream is closed"), + TRUE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); +} + +static void +g_unix_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GUnixOutputStream *unix_stream; + + unix_stream = G_UNIX_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + unix_stream->priv->fd = g_value_get_int (value); + break; + case PROP_CLOSE_FD: + unix_stream->priv->close_fd = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_unix_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GUnixOutputStream *unix_stream; + + unix_stream = G_UNIX_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + g_value_set_int (value, unix_stream->priv->fd); + break; + case PROP_CLOSE_FD: + g_value_set_boolean (value, unix_stream->priv->close_fd); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_unix_output_stream_init (GUnixOutputStream *unix_stream) +{ + unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream, + G_TYPE_UNIX_OUTPUT_STREAM, + GUnixOutputStreamPrivate); + + unix_stream->priv->fd = -1; + unix_stream->priv->close_fd = TRUE; +} + +/** + * g_unix_output_stream_new: + * @fd: a UNIX file descriptor + * @close_fd: %TRUE to close the file descriptor when done + * + * Creates a new #GUnixOutputStream for the given @fd. + * + * If @close_fd, is %TRUE, the file descriptor will be closed when + * the output stream is destroyed. + * + * Returns: a new #GOutputStream + **/ +GOutputStream * +g_unix_output_stream_new (gint fd, + gboolean close_fd) +{ + GUnixOutputStream *stream; + + g_return_val_if_fail (fd != -1, NULL); + + stream = g_object_new (G_TYPE_UNIX_OUTPUT_STREAM, + "fd", fd, + "close-fd", close_fd, + NULL); + + return G_OUTPUT_STREAM (stream); +} + +/** + * g_unix_output_stream_set_close_fd: + * @stream: a #GUnixOutputStream + * @close_fd: %TRUE to close the file descriptor when done + * + * Sets whether the file descriptor of @stream shall be closed + * when the stream is closed. + * + * Since: 2.20 + */ +void +g_unix_output_stream_set_close_fd (GUnixOutputStream *stream, + gboolean close_fd) +{ + g_return_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream)); + + close_fd = close_fd != FALSE; + if (stream->priv->close_fd != close_fd) + { + stream->priv->close_fd = close_fd; + g_object_notify (G_OBJECT (stream), "close-fd"); + } +} + +/** + * g_unix_output_stream_get_close_fd: + * @stream: a #GUnixOutputStream + * + * Returns whether the file descriptor of @stream will be + * closed when the stream is closed. + * + * Return value: %TRUE if the file descriptor is closed when done + * + * Since: 2.20 + */ +gboolean +g_unix_output_stream_get_close_fd (GUnixOutputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream), FALSE); + + return stream->priv->close_fd; +} + +/** + * g_unix_output_stream_get_fd: + * @stream: a #GUnixOutputStream + * + * Return the UNIX file descriptor that the stream writes to. + * + * Return value: The file descriptor of @stream + * + * Since: 2.20 + */ +gint +g_unix_output_stream_get_fd (GUnixOutputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream), -1); + + return stream->priv->fd; +} + +static gssize +g_unix_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GUnixOutputStream *unix_stream; + gssize res; + GPollFD poll_fds[2]; + int poll_ret; + + unix_stream = G_UNIX_OUTPUT_STREAM (stream); + + if (g_cancellable_make_pollfd (cancellable, &poll_fds[1])) + { + poll_fds[0].fd = unix_stream->priv->fd; + poll_fds[0].events = G_IO_OUT; + do + poll_ret = g_poll (poll_fds, 2, -1); + while (poll_ret == -1 && errno == EINTR); + g_cancellable_release_fd (cancellable); + + if (poll_ret == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to unix: %s"), + g_strerror (errsv)); + return -1; + } + } + + while (1) + { + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + res = write (unix_stream->priv->fd, buffer, count); + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to unix: %s"), + g_strerror (errsv)); + } + + break; + } + + return res; +} + +static gboolean +g_unix_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GUnixOutputStream *unix_stream; + int res; + + unix_stream = G_UNIX_OUTPUT_STREAM (stream); + + if (!unix_stream->priv->close_fd) + return TRUE; + + while (1) + { + /* This might block during the close. Doesn't seem to be a way to avoid it though. */ + res = close (unix_stream->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing unix: %s"), + g_strerror (errsv)); + } + break; + } + + return res != -1; +} + +typedef struct { + gsize count; + const void *buffer; + GAsyncReadyCallback callback; + gpointer user_data; + GCancellable *cancellable; + GUnixOutputStream *stream; +} WriteAsyncData; + +static gboolean +write_async_cb (WriteAsyncData *data, + GIOCondition condition, + int fd) +{ + GSimpleAsyncResult *simple; + GError *error = NULL; + gssize count_written; + + while (1) + { + if (g_cancellable_set_error_if_cancelled (data->cancellable, &error)) + { + count_written = -1; + break; + } + + count_written = write (data->stream->priv->fd, data->buffer, data->count); + if (count_written == -1) + { + int errsv = errno; + + if (errsv == EINTR) + continue; + + g_set_error (&error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from unix: %s"), + g_strerror (errsv)); + } + break; + } + + simple = g_simple_async_result_new (G_OBJECT (data->stream), + data->callback, + data->user_data, + g_unix_output_stream_write_async); + + g_simple_async_result_set_op_res_gssize (simple, count_written); + + if (count_written == -1) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); + + return FALSE; +} + +static void +g_unix_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSource *source; + GUnixOutputStream *unix_stream; + WriteAsyncData *data; + + unix_stream = G_UNIX_OUTPUT_STREAM (stream); + + data = g_new0 (WriteAsyncData, 1); + data->count = count; + data->buffer = buffer; + data->callback = callback; + data->user_data = user_data; + data->cancellable = cancellable; + data->stream = unix_stream; + + source = _g_fd_source_new (unix_stream->priv->fd, + G_IO_OUT, + cancellable); + + g_source_set_callback (source, (GSourceFunc)write_async_cb, data, g_free); + g_source_attach (source, g_main_context_get_thread_default ()); + + g_source_unref (source); +} + +static gssize +g_unix_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + gssize nwritten; + + simple = G_SIMPLE_ASYNC_RESULT (result); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_unix_output_stream_write_async); + + nwritten = g_simple_async_result_get_op_res_gssize (simple); + return nwritten; +} + +typedef struct { + GOutputStream *stream; + GAsyncReadyCallback callback; + gpointer user_data; +} CloseAsyncData; + +static gboolean +close_async_cb (CloseAsyncData *data) +{ + GUnixOutputStream *unix_stream; + GSimpleAsyncResult *simple; + GError *error = NULL; + gboolean result; + int res; + + unix_stream = G_UNIX_OUTPUT_STREAM (data->stream); + + if (!unix_stream->priv->close_fd) + { + result = TRUE; + goto out; + } + + while (1) + { + res = close (unix_stream->priv->fd); + if (res == -1) + { + int errsv = errno; + + g_set_error (&error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing unix: %s"), + g_strerror (errsv)); + } + break; + } + + result = res != -1; + + out: + simple = g_simple_async_result_new (G_OBJECT (data->stream), + data->callback, + data->user_data, + g_unix_output_stream_close_async); + + if (!result) + { + g_simple_async_result_set_from_error (simple, error); + g_error_free (error); + } + + /* Complete immediately, not in idle, since we're already in a mainloop callout */ + g_simple_async_result_complete (simple); + g_object_unref (simple); + + return FALSE; +} + +static void +g_unix_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSource *idle; + CloseAsyncData *data; + + data = g_new0 (CloseAsyncData, 1); + + data->stream = stream; + data->callback = callback; + data->user_data = user_data; + + idle = g_idle_source_new (); + g_source_set_callback (idle, (GSourceFunc)close_async_cb, data, g_free); + g_source_attach (idle, g_main_context_get_thread_default ()); + g_source_unref (idle); +} + +static gboolean +g_unix_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + /* Failures handled in generic close_finish code */ + return TRUE; +} + +#define __G_UNIX_OUTPUT_STREAM_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixoutputstream.h b/gio/gunixoutputstream.h new file mode 100644 index 0000000..ad42923 --- /dev/null +++ b/gio/gunixoutputstream.h @@ -0,0 +1,77 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_UNIX_OUTPUT_STREAM_H__ +#define __G_UNIX_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_OUTPUT_STREAM (g_unix_output_stream_get_type ()) +#define G_UNIX_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_OUTPUT_STREAM, GUnixOutputStream)) +#define G_UNIX_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_OUTPUT_STREAM, GUnixOutputStreamClass)) +#define G_IS_UNIX_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_OUTPUT_STREAM)) +#define G_IS_UNIX_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_OUTPUT_STREAM)) +#define G_UNIX_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_OUTPUT_STREAM, GUnixOutputStreamClass)) + +/** + * GUnixOutputStream: + * + * Implements #GOutputStream for outputting to selectable unix file descriptors + **/ +typedef struct _GUnixOutputStream GUnixOutputStream; +typedef struct _GUnixOutputStreamClass GUnixOutputStreamClass; +typedef struct _GUnixOutputStreamPrivate GUnixOutputStreamPrivate; + +struct _GUnixOutputStream +{ + GOutputStream parent_instance; + + /*< private >*/ + GUnixOutputStreamPrivate *priv; +}; + +struct _GUnixOutputStreamClass +{ + GOutputStreamClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); +}; + +GType g_unix_output_stream_get_type (void) G_GNUC_CONST; + +GOutputStream * g_unix_output_stream_new (gint fd, + gboolean close_fd); +void g_unix_output_stream_set_close_fd (GUnixOutputStream *stream, + gboolean close_fd); +gboolean g_unix_output_stream_get_close_fd (GUnixOutputStream *stream); +gint g_unix_output_stream_get_fd (GUnixOutputStream *stream); +G_END_DECLS + +#endif /* __G_UNIX_OUTPUT_STREAM_H__ */ diff --git a/gio/gunixresolver.c b/gio/gunixresolver.c new file mode 100644 index 0000000..2155c66 --- /dev/null +++ b/gio/gunixresolver.c @@ -0,0 +1,527 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include +#include + +#include "gunixresolver.h" +#include "gnetworkingprivate.h" + +#include "gcancellable.h" +#include "gsimpleasyncresult.h" +#include "gsocketaddress.h" + +#include "gioalias.h" + +G_DEFINE_TYPE (GUnixResolver, g_unix_resolver, G_TYPE_THREADED_RESOLVER) + +static gboolean g_unix_resolver_watch (GIOChannel *iochannel, + GIOCondition condition, + gpointer user_data); +static void g_unix_resolver_reload (GResolver *resolver); + +static void +g_unix_resolver_init (GUnixResolver *gur) +{ + g_unix_resolver_reload (G_RESOLVER (gur)); +} + +static void +g_unix_resolver_finalize (GObject *object) +{ + GUnixResolver *gur = G_UNIX_RESOLVER (object); + + if (gur->watch) + g_source_remove (gur->watch); + _g_asyncns_free (gur->asyncns); + + G_OBJECT_CLASS (g_unix_resolver_parent_class)->finalize (object); +} + +static void +g_unix_resolver_reload (GResolver *resolver) +{ + GUnixResolver *gur = G_UNIX_RESOLVER (resolver); + gint fd; + GIOChannel *io; + + if (gur->asyncns) + { + if (_g_asyncns_getnqueries (gur->asyncns) == 0) + { + g_source_remove (gur->watch); + _g_asyncns_free (gur->asyncns); + } + /* else, we will free it later from g_unix_resolver_watch */ + } + + /* FIXME: how many workers? */ + gur->asyncns = _g_asyncns_new (2); + + fd = _g_asyncns_fd (gur->asyncns); + io = g_io_channel_unix_new (fd); + gur->watch = g_io_add_watch (io, G_IO_IN | G_IO_HUP | G_IO_ERR, + g_unix_resolver_watch, gur->asyncns); + g_io_channel_unref (io); +} + +/* The various request possibilities: + * + * 1. Synchronous: handed off to the base class (GThreadedResolver); + * since it's never possible to cancel a synchronous request in a + * single-threaded program, the request is done in the calling + * thread. + * + * 2. Asynchronous: An appropriate _g_asyncns_query_t is created, and + * then a GUnixResolverRequest is created with that query and a + * GSimpleAsyncResult. Two sub-possibilities: + * + * a. The resolution completes: g_unix_resolver_watch() sees that + * the request has completed, and calls + * g_unix_resolver_request_complete(), which detaches the + * "cancelled" signal handler (if it was present), queues the + * async_result to be completed, and then unrefs it. + * + * b. The resolution is cancelled: request_cancelled() calls + * _g_asyncns_cancel() to cancel the resolution. Then it calls + * g_unix_resolver_request_complete(), which detaches the + * signal handler, and queues async_result to complete in an + * idle handler. Because the asyncns resolution was cancelled, + * g_unix_resolver_watch() will never be triggered for this + * req. + * + * Since there's only a single thread, it's not possible for the + * request to both complete and be cancelled "at the same time", + * and each of the two possibilities takes steps to block the other + * from being able to happen later, so it's always safe to free req + * after the async_result completes. + */ + +typedef struct _GUnixResolverRequest GUnixResolverRequest; +typedef void (*GUnixResolverFunc) (GUnixResolverRequest *); + +struct _GUnixResolverRequest { + GUnixResolver *gur; + _g_asyncns_t *asyncns; + + _g_asyncns_query_t *qy; + union { + struct { + gchar *hostname; + GList *addresses; + } name; + + struct { + GInetAddress *address; + gchar *hostname; + } address; + + struct { + gchar *service; + GList *targets; + } service; + } u; + GUnixResolverFunc process_func, free_func; + + GCancellable *cancellable; + GSimpleAsyncResult *async_result; + +}; + +static void g_unix_resolver_request_free (GUnixResolverRequest *req); +static void request_cancelled (GCancellable *cancellable, + gpointer user_data); + +static GUnixResolverRequest * +g_unix_resolver_request_new (GUnixResolver *gur, + _g_asyncns_query_t *qy, + GUnixResolverFunc process_func, + GUnixResolverFunc free_func, + GCancellable *cancellable, + GSimpleAsyncResult *async_result) +{ + GUnixResolverRequest *req; + + req = g_slice_new0 (GUnixResolverRequest); + req->gur = g_object_ref (gur); + req->asyncns = gur->asyncns; + req->qy = qy; + req->process_func = process_func; + req->free_func = free_func; + + if (cancellable) + { + req->cancellable = g_object_ref (cancellable); + g_signal_connect (cancellable, "cancelled", + G_CALLBACK (request_cancelled), req); + } + + req->async_result = g_object_ref (async_result); + + g_simple_async_result_set_op_res_gpointer (req->async_result, req, (GDestroyNotify)g_unix_resolver_request_free); + + return req; +} + +static void +g_unix_resolver_request_free (GUnixResolverRequest *req) +{ + req->free_func (req); + + /* We don't have to free req->cancellable and req->async_result, + * since they must already have been freed if we're here. + */ + + /* Check if this was the last request remaining on an old asyncns. */ + if (req->asyncns != req->gur->asyncns && + _g_asyncns_getnqueries (req->asyncns) == 0) + _g_asyncns_free (req->asyncns); + + g_object_unref (req->gur); + g_slice_free (GUnixResolverRequest, req); +} + +static void +g_unix_resolver_request_complete (GUnixResolverRequest *req) +{ + if (req->cancellable) + { + g_signal_handlers_disconnect_by_func (req->cancellable, request_cancelled, req); + g_object_unref (req->cancellable); + req->cancellable = NULL; + } + + /* We always complete_in_idle, even if we were called from + * g_unix_resolver_watch(), since we might have been started under a + * non-default g_main_context_get_thread_default(). + */ + g_simple_async_result_complete_in_idle (req->async_result); + g_object_unref (req->async_result); +} + +static void +request_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + GUnixResolverRequest *req = user_data; + GError *error = NULL; + + _g_asyncns_cancel (req->asyncns, req->qy); + req->qy = NULL; + + g_cancellable_set_error_if_cancelled (cancellable, &error); + g_simple_async_result_set_from_error (req->async_result, error); + g_error_free (error); + + g_unix_resolver_request_complete (req); +} + +static gboolean +g_unix_resolver_watch (GIOChannel *iochannel, + GIOCondition condition, + gpointer user_data) +{ + _g_asyncns_t *asyncns = user_data; + _g_asyncns_query_t *qy; + GUnixResolverRequest *req; + + if (condition & (G_IO_HUP | G_IO_ERR)) + { + /* Will happen if we reload, and then eventually kill the old + * _g_asyncns_t when it's done processing requests. + */ + return FALSE; + } + + while (_g_asyncns_wait (asyncns, FALSE) == 0 && + (qy = _g_asyncns_getnext (asyncns)) != NULL) + { + req = _g_asyncns_getuserdata (asyncns, qy); + req->process_func (req); + g_unix_resolver_request_complete (req); + } + + return TRUE; +} + +static GUnixResolverRequest * +resolve_async (GUnixResolver *gur, + _g_asyncns_query_t *qy, + GUnixResolverFunc process_func, + GUnixResolverFunc free_func, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer tag) +{ + GSimpleAsyncResult *result; + GUnixResolverRequest *req; + + result = g_simple_async_result_new (G_OBJECT (gur), callback, user_data, tag); + req = g_unix_resolver_request_new (gur, qy, process_func, free_func, + cancellable, result); + g_object_unref (result); + _g_asyncns_setuserdata (gur->asyncns, qy, req); + + return req; +} + +static void +lookup_by_name_process (GUnixResolverRequest *req) +{ + struct addrinfo *res; + gint retval; + GError *error = NULL; + + retval = _g_asyncns_getaddrinfo_done (req->asyncns, req->qy, &res); + req->u.name.addresses = + _g_resolver_addresses_from_addrinfo (req->u.name.hostname, + res, retval, &error); + if (res) + freeaddrinfo (res); + + if (error) + { + g_simple_async_result_set_from_error (req->async_result, error); + g_error_free (error); + } +} + +static void +lookup_by_name_free (GUnixResolverRequest *req) +{ + g_free (req->u.name.hostname); + if (req->u.name.addresses) + g_resolver_free_addresses (req->u.name.addresses); +} + +static void +lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixResolver *gur = G_UNIX_RESOLVER (resolver); + GUnixResolverRequest *req; + _g_asyncns_query_t *qy; + + qy = _g_asyncns_getaddrinfo (gur->asyncns, hostname, NULL, + &_g_resolver_addrinfo_hints); + req = resolve_async (gur, qy, lookup_by_name_process, lookup_by_name_free, + cancellable, callback, user_data, lookup_by_name_async); + req->u.name.hostname = g_strdup (hostname); +} + +static GList * +lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GUnixResolverRequest *req; + GList *addresses; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), lookup_by_name_async), FALSE); + simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + req = g_simple_async_result_get_op_res_gpointer (simple); + addresses = req->u.name.addresses; + req->u.name.addresses = NULL; + + return addresses; +} + + +static void +lookup_by_address_process (GUnixResolverRequest *req) +{ + gchar host[NI_MAXHOST]; + gint retval; + GError *error = NULL; + + retval = _g_asyncns_getnameinfo_done (req->asyncns, req->qy, + host, sizeof (host), NULL, 0); + req->u.address.hostname = + _g_resolver_name_from_nameinfo (req->u.address.address, + host, retval, &error); + + if (error) + { + g_simple_async_result_set_from_error (req->async_result, error); + g_error_free (error); + } +} + +static void +lookup_by_address_free (GUnixResolverRequest *req) +{ + g_object_unref (req->u.address.address); + if (req->u.address.hostname) + g_free (req->u.address.hostname); +} + +static void +lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixResolver *gur = G_UNIX_RESOLVER (resolver); + GUnixResolverRequest *req; + _g_asyncns_query_t *qy; + struct sockaddr_storage sockaddr; + gsize sockaddr_size; + + _g_resolver_address_to_sockaddr (address, &sockaddr, &sockaddr_size); + qy = _g_asyncns_getnameinfo (gur->asyncns, + (struct sockaddr *)&sockaddr, sockaddr_size, + NI_NAMEREQD, TRUE, FALSE); + req = resolve_async (gur, qy, lookup_by_address_process, + lookup_by_address_free, cancellable, + callback, user_data, lookup_by_address_async); + req->u.address.address = g_object_ref (address); +} + +static gchar * +lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GUnixResolverRequest *req; + gchar *name; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), lookup_by_address_async), FALSE); + simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + req = g_simple_async_result_get_op_res_gpointer (simple); + name = req->u.address.hostname; + req->u.address.hostname = NULL; + + return name; +} + + +static void +lookup_service_process (GUnixResolverRequest *req) +{ + guchar *answer; + gint len, herr; + GError *error = NULL; + + len = _g_asyncns_res_done (req->asyncns, req->qy, &answer); + if (len < 0) + herr = h_errno; + else + herr = 0; + + req->u.service.targets = + _g_resolver_targets_from_res_query (req->u.service.service, + answer, len, herr, &error); + _g_asyncns_freeanswer (answer); + + if (error) + { + g_simple_async_result_set_from_error (req->async_result, error); + g_error_free (error); + } +} + +static void +lookup_service_free (GUnixResolverRequest *req) +{ + g_free (req->u.service.service); + if (req->u.service.targets) + g_resolver_free_targets (req->u.service.targets); +} + +static void +lookup_service_async (GResolver *resolver, + const char *rrname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixResolver *gur = G_UNIX_RESOLVER (resolver); + GUnixResolverRequest *req; + _g_asyncns_query_t *qy; + + qy = _g_asyncns_res_query (gur->asyncns, rrname, C_IN, T_SRV); + req = resolve_async (gur, qy, lookup_service_process, lookup_service_free, + cancellable, callback, user_data, lookup_service_async); + req->u.service.service = g_strdup (rrname); +} + +static GList * +lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GUnixResolverRequest *req; + GList *targets; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), lookup_service_async), FALSE); + simple = G_SIMPLE_ASYNC_RESULT (result); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + req = g_simple_async_result_get_op_res_gpointer (simple); + targets = req->u.service.targets; + req->u.service.targets = NULL; + + return targets; +} + + +static void +g_unix_resolver_class_init (GUnixResolverClass *unix_class) +{ + GResolverClass *resolver_class = G_RESOLVER_CLASS (unix_class); + GObjectClass *object_class = G_OBJECT_CLASS (unix_class); + + resolver_class->reload = g_unix_resolver_reload; + resolver_class->lookup_by_name_async = lookup_by_name_async; + resolver_class->lookup_by_name_finish = lookup_by_name_finish; + resolver_class->lookup_by_address_async = lookup_by_address_async; + resolver_class->lookup_by_address_finish = lookup_by_address_finish; + resolver_class->lookup_service_async = lookup_service_async; + resolver_class->lookup_service_finish = lookup_service_finish; + + object_class->finalize = g_unix_resolver_finalize; +} + +#define __G_UNIX_RESOLVER_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixresolver.h b/gio/gunixresolver.h new file mode 100644 index 0000000..cf7765b --- /dev/null +++ b/gio/gunixresolver.h @@ -0,0 +1,53 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_UNIX_RESOLVER_H__ +#define __G_UNIX_RESOLVER_H__ + +#include +#include "libasyncns/asyncns.h" + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_RESOLVER (g_unix_resolver_get_type ()) +#define G_UNIX_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_RESOLVER, GUnixResolver)) +#define G_UNIX_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_RESOLVER, GUnixResolverClass)) +#define G_IS_UNIX_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_RESOLVER)) +#define G_IS_UNIX_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_RESOLVER)) +#define G_UNIX_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_RESOLVER, GUnixResolverClass)) + +typedef struct { + GThreadedResolver parent_instance; + + _g_asyncns_t *asyncns; + guint watch; + +} GUnixResolver; + +typedef struct { + GThreadedResolverClass parent_class; + +} GUnixResolverClass; + +GType g_unix_resolver_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_RESOLVER_H__ */ diff --git a/gio/gunixsocketaddress.c b/gio/gunixsocketaddress.c new file mode 100644 index 0000000..89cc643 --- /dev/null +++ b/gio/gunixsocketaddress.c @@ -0,0 +1,400 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#include +#include +#include + +#include "gunixsocketaddress.h" +#include "glibintl.h" +#include "gnetworkingprivate.h" + +#include "gioalias.h" + +/** + * SECTION:gunixsocketaddress + * @short_description: UNIX GSocketAddress + * + * Support for UNIX-domain (aka local) sockets. + */ + +/** + * GUnixSocketAddress: + * + * A UNIX-domain (local) socket address, corresponding to a + * struct sockaddr_un. + */ +G_DEFINE_TYPE (GUnixSocketAddress, g_unix_socket_address, G_TYPE_SOCKET_ADDRESS); + +enum +{ + PROP_0, + PROP_PATH, + PROP_PATH_AS_ARRAY, + PROP_ABSTRACT, +}; + +#define UNIX_PATH_MAX sizeof (((struct sockaddr_un *) 0)->sun_path) + +struct _GUnixSocketAddressPrivate +{ + char path[UNIX_PATH_MAX]; /* Not including the initial zero in abstract case, so + we can guarantee zero termination of abstract + pathnames in the get_path() API */ + gsize path_len; /* Not including any terminating zeros */ + gboolean abstract; +}; + +static void +g_unix_socket_address_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GUnixSocketAddress *address = G_UNIX_SOCKET_ADDRESS (object); + const char *str; + GByteArray *array; + gsize len; + + switch (prop_id) + { + case PROP_PATH: + str = g_value_get_string (value); + if (str) + { + g_strlcpy (address->priv->path, str, + sizeof (address->priv->path)); + address->priv->path_len = strlen (address->priv->path); + } + break; + + case PROP_PATH_AS_ARRAY: + array = g_value_get_boxed (value); + + if (array) + { + /* Clip to fit in UNIX_PATH_MAX with zero termination or first byte */ + len = MIN (array->len, UNIX_PATH_MAX-1); + + /* Remove any trailing zeros from path_len */ + while (len > 0 && array->data[len-1] == 0) + len--; + + memcpy (address->priv->path, array->data, len); + address->priv->path[len] = 0; /* Ensure null-terminated */ + address->priv->path_len = len; + } + break; + + case PROP_ABSTRACT: + address->priv->abstract = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_unix_socket_address_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GUnixSocketAddress *address = G_UNIX_SOCKET_ADDRESS (object); + GByteArray *array; + + switch (prop_id) + { + case PROP_PATH: + g_value_set_string (value, address->priv->path); + break; + + case PROP_PATH_AS_ARRAY: + array = g_byte_array_sized_new (address->priv->path_len); + g_byte_array_append (array, (guint8 *)address->priv->path, address->priv->path_len); + g_value_take_boxed (value, array); + break; + + case PROP_ABSTRACT: + g_value_set_boolean (value, address->priv->abstract); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static GSocketFamily +g_unix_socket_address_get_family (GSocketAddress *address) +{ + g_assert (PF_UNIX == G_SOCKET_FAMILY_UNIX); + + return G_SOCKET_FAMILY_UNIX; +} + +static gssize +g_unix_socket_address_get_native_size (GSocketAddress *address) +{ + return sizeof (struct sockaddr_un); +} + +static gboolean +g_unix_socket_address_to_native (GSocketAddress *address, + gpointer dest, + gsize destlen, + GError **error) +{ + GUnixSocketAddress *addr = G_UNIX_SOCKET_ADDRESS (address); + struct sockaddr_un *sock; + + if (destlen < sizeof (*sock)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, + _("Not enough space for socket address")); + return FALSE; + } + + if (addr->priv->abstract && + !g_unix_socket_address_abstract_names_supported ()) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Abstract unix domain socket addresses not supported on this system")); + return FALSE; + } + + sock = (struct sockaddr_un *) dest; + sock->sun_family = AF_UNIX; + memset (sock->sun_path, 0, sizeof (sock->sun_path)); + if (addr->priv->abstract) + { + sock->sun_path[0] = 0; + memcpy (sock->sun_path+1, addr->priv->path, addr->priv->path_len); + } + else + strcpy (sock->sun_path, addr->priv->path); + + return TRUE; +} + +static void +g_unix_socket_address_class_init (GUnixSocketAddressClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GSocketAddressClass *gsocketaddress_class = G_SOCKET_ADDRESS_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GUnixSocketAddressPrivate)); + + gobject_class->set_property = g_unix_socket_address_set_property; + gobject_class->get_property = g_unix_socket_address_get_property; + + gsocketaddress_class->get_family = g_unix_socket_address_get_family; + gsocketaddress_class->to_native = g_unix_socket_address_to_native; + gsocketaddress_class->get_native_size = g_unix_socket_address_get_native_size; + + g_object_class_install_property (gobject_class, + PROP_PATH, + g_param_spec_string ("path", + P_("Path"), + P_("UNIX socket path"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PATH_AS_ARRAY, + g_param_spec_boxed ("path-as-array", + P_("Path array"), + P_("UNIX socket path, as byte array"), + G_TYPE_BYTE_ARRAY, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_ABSTRACT, + g_param_spec_boolean ("abstract", + P_("Abstract"), + P_("Whether or not this is an abstract address"), + FALSE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_unix_socket_address_init (GUnixSocketAddress *address) +{ + address->priv = G_TYPE_INSTANCE_GET_PRIVATE (address, + G_TYPE_UNIX_SOCKET_ADDRESS, + GUnixSocketAddressPrivate); + + memset (address->priv->path, 0, sizeof (address->priv->path)); + address->priv->path_len = -1; +} + +/** + * g_unix_socket_address_new: + * @path: the socket path + * + * Creates a new #GUnixSocketAddress for @path. + * + * To create abstract socket addresses, on systems that support that, + * use g_unix_socket_address_new_abstract(). + * + * Returns: a new #GUnixSocketAddress + * + * Since: 2.22 + */ +GSocketAddress * +g_unix_socket_address_new (const gchar *path) +{ + return g_object_new (G_TYPE_UNIX_SOCKET_ADDRESS, + "path", path, + "abstract", FALSE, + NULL); +} + +/** + * g_unix_socket_address_new_abstract: + * @path: the abstract name + * @path_len: the length of @path, or -1 + * + * Creates a new abstract #GUnixSocketAddress for @path. + * + * Unix domain sockets are generally visible in the filesystem. However, some + * systems support abstract socket name which are not visible in the + * filesystem and not affected by the filesystem permissions, visibility, etc. + * + * Note that not all systems (really only Linux) support abstract + * socket names, so if you use them on other systems function calls may + * return %G_IO_ERROR_NOT_SUPPORTED errors. You can use + * g_unix_socket_address_abstract_names_supported() to see if abstract + * names are supported. + * + * If @path_len is -1 then @path is assumed to be a zero terminated + * string (although in general abstract names need not be zero terminated + * and can have embedded nuls). All bytes after @path_len up to the max size + * of an abstract unix domain name is filled with zero bytes. + * + * Returns: a new #GUnixSocketAddress + * + * Since: 2.22 + */ +GSocketAddress * +g_unix_socket_address_new_abstract (const gchar *path, + int path_len) +{ + GSocketAddress *address; + GByteArray *array; + + if (path_len == -1) + path_len = strlen (path); + + array = g_byte_array_sized_new (path_len); + + g_byte_array_append (array, (guint8 *)path, path_len); + + address = g_object_new (G_TYPE_UNIX_SOCKET_ADDRESS, + "path-as-array", array, + "abstract", TRUE, + NULL); + + g_byte_array_unref (array); + + return address; +} + +/** + * g_unix_socket_address_get_path: + * @address: a #GInetSocketAddress + * + * Gets @address's path, or for abstract sockets the "name". + * + * Guaranteed to be zero-terminated, but an abstract socket + * may contain embedded zeros, and thus you should use + * g_unix_socket_address_get_path_len() to get the true length + * of this string. + * + * Returns: the path for @address + * + * Since: 2.22 + */ +const char * +g_unix_socket_address_get_path (GUnixSocketAddress *address) +{ + return address->priv->path; +} + +/** + * g_unix_socket_address_get_path_len: + * @address: a #GInetSocketAddress + * + * Gets the length of @address's path. + * + * For details, see g_unix_socket_address_get_path(). + * + * Returns: the length of the path + * + * Since: 2.22 + */ +gsize +g_unix_socket_address_get_path_len (GUnixSocketAddress *address) +{ + return address->priv->path_len; +} + +/** + * g_unix_socket_address_get_is_abstract: + * @address: a #GInetSocketAddress + * + * Gets @address's path. + * + * Returns: %TRUE if the address is abstract, %FALSE otherwise + * + * Since: 2.22 + */ +gboolean +g_unix_socket_address_get_is_abstract (GUnixSocketAddress *address) +{ + return address->priv->abstract; +} + +/** + * g_unix_socket_address_abstract_names_supported: + * + * Checks if abstract unix domain socket names are supported. + * + * Returns: %TRUE if supported, %FALSE otherwise + * + * Since: 2.22 + */ +gboolean +g_unix_socket_address_abstract_names_supported (void) +{ +#ifdef __linux__ + return TRUE; +#else + return FALSE; +#endif +} + +#define __G_UNIX_SOCKET_ADDRESS_C__ +#include "gioaliasdef.c" diff --git a/gio/gunixsocketaddress.h b/gio/gunixsocketaddress.h new file mode 100644 index 0000000..fabddd8 --- /dev/null +++ b/gio/gunixsocketaddress.h @@ -0,0 +1,68 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Christian Kellner, Samuel Cormier-Iijima + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Christian Kellner + * Samuel Cormier-Iijima + */ + +#ifndef __G_UNIX_SOCKET_ADDRESS_H__ +#define __G_UNIX_SOCKET_ADDRESS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_SOCKET_ADDRESS (g_unix_socket_address_get_type ()) +#define G_UNIX_SOCKET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_SOCKET_ADDRESS, GUnixSocketAddress)) +#define G_UNIX_SOCKET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_SOCKET_ADDRESS, GUnixSocketAddressClass)) +#define G_IS_UNIX_SOCKET_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_SOCKET_ADDRESS)) +#define G_IS_UNIX_SOCKET_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_SOCKET_ADDRESS)) +#define G_UNIX_SOCKET_ADDRESS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_SOCKET_ADDRESS, GUnixSocketAddressClass)) + +typedef struct _GUnixSocketAddress GUnixSocketAddress; +typedef struct _GUnixSocketAddressClass GUnixSocketAddressClass; +typedef struct _GUnixSocketAddressPrivate GUnixSocketAddressPrivate; + +struct _GUnixSocketAddress +{ + GSocketAddress parent_instance; + + /*< private >*/ + GUnixSocketAddressPrivate *priv; +}; + +struct _GUnixSocketAddressClass +{ + GSocketAddressClass parent_class; +}; + +GType g_unix_socket_address_get_type (void) G_GNUC_CONST; + +GSocketAddress *g_unix_socket_address_new (const gchar *path); +GSocketAddress *g_unix_socket_address_new_abstract (const gchar *path, + int path_len); +const char * g_unix_socket_address_get_path (GUnixSocketAddress *address); +gsize g_unix_socket_address_get_path_len (GUnixSocketAddress *address); +gboolean g_unix_socket_address_get_is_abstract (GUnixSocketAddress *address); + +gboolean g_unix_socket_address_abstract_names_supported (void); + +G_END_DECLS + +#endif /* __G_UNIX_SOCKET_ADDRESS_H__ */ diff --git a/gio/gunixvolume.c b/gio/gunixvolume.c new file mode 100644 index 0000000..28c4f2e --- /dev/null +++ b/gio/gunixvolume.c @@ -0,0 +1,534 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" + +#include +#include +#include + +#include +#include "gunixvolume.h" +#include "gunixmount.h" +#include "gunixmounts.h" +#include "gthemedicon.h" +#include "gvolume.h" +#include "gvolumemonitor.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" +/* for BUFSIZ */ +#include + +#include "gioalias.h" + +struct _GUnixVolume { + GObject parent; + + GVolumeMonitor *volume_monitor; + GUnixMount *mount; /* owned by volume monitor */ + + char *device_path; + char *mount_path; + gboolean can_eject; + + char *identifier; + char *identifier_type; + + char *name; + GIcon *icon; +}; + +static void g_unix_volume_volume_iface_init (GVolumeIface *iface); + +#define g_unix_volume_get_type _g_unix_volume_get_type +G_DEFINE_TYPE_WITH_CODE (GUnixVolume, g_unix_volume, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_VOLUME, + g_unix_volume_volume_iface_init)) + +static void +g_unix_volume_finalize (GObject *object) +{ + GUnixVolume *volume; + + volume = G_UNIX_VOLUME (object); + + if (volume->volume_monitor != NULL) + g_object_unref (volume->volume_monitor); + + if (volume->mount) + _g_unix_mount_unset_volume (volume->mount, volume); + + g_object_unref (volume->icon); + g_free (volume->name); + g_free (volume->mount_path); + g_free (volume->device_path); + g_free (volume->identifier); + g_free (volume->identifier_type); + + G_OBJECT_CLASS (g_unix_volume_parent_class)->finalize (object); +} + +static void +g_unix_volume_class_init (GUnixVolumeClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_unix_volume_finalize; +} + +static void +g_unix_volume_init (GUnixVolume *unix_volume) +{ +} + +GUnixVolume * +_g_unix_volume_new (GVolumeMonitor *volume_monitor, + GUnixMountPoint *mountpoint) +{ + GUnixVolume *volume; + + if (!(g_unix_mount_point_is_user_mountable (mountpoint) || + g_str_has_prefix (g_unix_mount_point_get_device_path (mountpoint), "/vol/")) || + g_unix_mount_point_is_loopback (mountpoint)) + return NULL; + + volume = g_object_new (G_TYPE_UNIX_VOLUME, NULL); + volume->volume_monitor = volume_monitor != NULL ? g_object_ref (volume_monitor) : NULL; + volume->mount_path = g_strdup (g_unix_mount_point_get_mount_path (mountpoint)); + volume->device_path = g_strdup (g_unix_mount_point_get_device_path (mountpoint)); + volume->can_eject = g_unix_mount_point_guess_can_eject (mountpoint); + + volume->name = g_unix_mount_point_guess_name (mountpoint); + volume->icon = g_unix_mount_point_guess_icon (mountpoint); + + + if (strcmp (g_unix_mount_point_get_fs_type (mountpoint), "nfs") == 0) + { + volume->identifier_type = g_strdup (G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT); + volume->identifier = g_strdup (volume->device_path); + } + else if (g_str_has_prefix (volume->device_path, "LABEL=")) + { + volume->identifier_type = g_strdup (G_VOLUME_IDENTIFIER_KIND_LABEL); + volume->identifier = g_strdup (volume->device_path + 6); + } + else if (g_str_has_prefix (volume->device_path, "UUID=")) + { + volume->identifier_type = g_strdup (G_VOLUME_IDENTIFIER_KIND_UUID); + volume->identifier = g_strdup (volume->device_path + 5); + } + else if (g_path_is_absolute (volume->device_path)) + { + volume->identifier_type = g_strdup (G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); + volume->identifier = g_strdup (volume->device_path); + } + + return volume; +} + +void +_g_unix_volume_disconnected (GUnixVolume *volume) +{ + if (volume->mount) + { + _g_unix_mount_unset_volume (volume->mount, volume); + volume->mount = NULL; + } +} + +void +_g_unix_volume_set_mount (GUnixVolume *volume, + GUnixMount *mount) +{ + if (volume->mount == mount) + return; + + if (volume->mount) + _g_unix_mount_unset_volume (volume->mount, volume); + + volume->mount = mount; + + /* TODO: Emit changed in idle to avoid locking issues */ + g_signal_emit_by_name (volume, "changed"); + if (volume->volume_monitor != NULL) + g_signal_emit_by_name (volume->volume_monitor, "volume-changed", volume); +} + +void +_g_unix_volume_unset_mount (GUnixVolume *volume, + GUnixMount *mount) +{ + if (volume->mount == mount) + { + volume->mount = NULL; + /* TODO: Emit changed in idle to avoid locking issues */ + g_signal_emit_by_name (volume, "changed"); + if (volume->volume_monitor != NULL) + g_signal_emit_by_name (volume->volume_monitor, "volume-changed", volume); + } +} + +static GIcon * +g_unix_volume_get_icon (GVolume *volume) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + return g_object_ref (unix_volume->icon); +} + +static char * +g_unix_volume_get_name (GVolume *volume) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + return g_strdup (unix_volume->name); +} + +static char * +g_unix_volume_get_uuid (GVolume *volume) +{ + return NULL; +} + +static gboolean +g_unix_volume_can_mount (GVolume *volume) +{ + return TRUE; +} + +static gboolean +g_unix_volume_can_eject (GVolume *volume) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + return unix_volume->can_eject; +} + +static gboolean +g_unix_volume_should_automount (GVolume *volume) +{ + /* We automount all local volumes because we don't even + * make the internal stuff visible + */ + return TRUE; +} + +static GDrive * +g_unix_volume_get_drive (GVolume *volume) +{ + return NULL; +} + +static GMount * +g_unix_volume_get_mount (GVolume *volume) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + + if (unix_volume->mount != NULL) + return g_object_ref (unix_volume->mount); + + return NULL; +} + + +gboolean +_g_unix_volume_has_mount_path (GUnixVolume *volume, + const char *mount_path) +{ + return strcmp (volume->mount_path, mount_path) == 0; +} + + +typedef struct { + GUnixVolume *unix_volume; + GAsyncReadyCallback callback; + gpointer user_data; + GCancellable *cancellable; + int error_fd; + GIOChannel *error_channel; + GSource *error_channel_source; + GString *error_string; +} EjectMountOp; + +static void +eject_mount_cb (GPid pid, + gint status, + gpointer user_data) +{ + EjectMountOp *data = user_data; + GSimpleAsyncResult *simple; + + if (WEXITSTATUS (status) != 0) + { + GError *error; + error = g_error_new_literal (G_IO_ERROR, + G_IO_ERROR_FAILED, + data->error_string->str); + simple = g_simple_async_result_new_from_error (G_OBJECT (data->unix_volume), + data->callback, + data->user_data, + error); + g_error_free (error); + } + else + { + simple = g_simple_async_result_new (G_OBJECT (data->unix_volume), + data->callback, + data->user_data, + NULL); + } + + g_simple_async_result_complete (simple); + g_object_unref (simple); + + if (data->error_channel_source) + { + g_source_destroy (data->error_channel_source); + g_source_unref (data->error_channel_source); + } + g_io_channel_unref (data->error_channel); + g_string_free (data->error_string, TRUE); + close (data->error_fd); + g_spawn_close_pid (pid); + g_free (data); +} + +static gboolean +eject_mount_read_error (GIOChannel *channel, + GIOCondition condition, + gpointer user_data) +{ + EjectMountOp *data = user_data; + char buf[BUFSIZ]; + gsize bytes_read; + GError *error; + GIOStatus status; + + error = NULL; +read: + status = g_io_channel_read_chars (channel, buf, sizeof (buf), &bytes_read, &error); + if (status == G_IO_STATUS_NORMAL) + { + g_string_append_len (data->error_string, buf, bytes_read); + if (bytes_read == sizeof (buf)) + goto read; + } + else if (status == G_IO_STATUS_EOF) + g_string_append_len (data->error_string, buf, bytes_read); + else if (status == G_IO_STATUS_ERROR) + { + if (data->error_string->len > 0) + g_string_append (data->error_string, "\n"); + + g_string_append (data->error_string, error->message); + g_error_free (error); + + if (data->error_channel_source) + { + g_source_unref (data->error_channel_source); + data->error_channel_source = NULL; + } + return FALSE; + } + + return TRUE; +} + +static void +eject_mount_do (GVolume *volume, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + char **argv) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + EjectMountOp *data; + GPid child_pid; + GSource *child_watch; + GError *error; + + data = g_new0 (EjectMountOp, 1); + data->unix_volume = unix_volume; + data->callback = callback; + data->user_data = user_data; + data->cancellable = cancellable; + + error = NULL; + if (!g_spawn_async_with_pipes (NULL, /* working dir */ + argv, + NULL, /* envp */ + G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_SEARCH_PATH, + NULL, /* child_setup */ + NULL, /* user_data for child_setup */ + &child_pid, + NULL, /* standard_input */ + NULL, /* standard_output */ + &(data->error_fd), + &error)) + { + g_assert (error != NULL); + goto handle_error; + } + + data->error_string = g_string_new (""); + + data->error_channel = g_io_channel_unix_new (data->error_fd); + g_io_channel_set_flags (data->error_channel, G_IO_FLAG_NONBLOCK, &error); + if (error != NULL) + goto handle_error; + + data->error_channel_source = g_io_create_watch (data->error_channel, G_IO_IN); + g_source_set_callback (data->error_channel_source, + (GSourceFunc) eject_mount_read_error, data, NULL); + g_source_attach (data->error_channel_source, g_main_context_get_thread_default ()); + + child_watch = g_child_watch_source_new (child_pid); + g_source_set_callback (child_watch, (GSourceFunc) eject_mount_cb, data, NULL); + g_source_attach (child_watch, g_main_context_get_thread_default ()); + g_source_unref (child_watch); + +handle_error: + if (error != NULL) + { + GSimpleAsyncResult *simple; + simple = g_simple_async_result_new_from_error (G_OBJECT (data->unix_volume), + data->callback, + data->user_data, + error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + + if (data->error_string != NULL) + g_string_free (data->error_string, TRUE); + + if (data->error_channel != NULL) + g_io_channel_unref (data->error_channel); + + g_error_free (error); + g_free (data); + } +} + + +static void +g_unix_volume_mount (GVolume *volume, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + char *argv[] = { "mount", NULL, NULL }; + + if (unix_volume->mount_path != NULL) + argv[1] = unix_volume->mount_path; + else + argv[1] = unix_volume->device_path; + + eject_mount_do (volume, cancellable, callback, user_data, argv); +} + +static gboolean +g_unix_volume_mount_finish (GVolume *volume, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +static void +g_unix_volume_eject (GVolume *volume, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + char *argv[] = { "eject", NULL, NULL }; + + argv[1] = unix_volume->device_path; + + eject_mount_do (volume, cancellable, callback, user_data, argv); +} + +static gboolean +g_unix_volume_eject_finish (GVolume *volume, + GAsyncResult *result, + GError **error) +{ + return TRUE; +} + +static gchar * +g_unix_volume_get_identifier (GVolume *volume, + const gchar *kind) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + + if (unix_volume->identifier_type != NULL && + strcmp (kind, unix_volume->identifier_type) == 0) + return g_strdup (unix_volume->identifier); + + return NULL; +} + +static gchar ** +g_unix_volume_enumerate_identifiers (GVolume *volume) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + gchar **res; + + if (unix_volume->identifier_type) + { + res = g_new (gchar *, 2); + res[0] = g_strdup (unix_volume->identifier_type); + res[1] = NULL; + } + else + { + res = g_new (gchar *, 1); + res[0] = NULL; + } + + return res; +} + +static void +g_unix_volume_volume_iface_init (GVolumeIface *iface) +{ + iface->get_name = g_unix_volume_get_name; + iface->get_icon = g_unix_volume_get_icon; + iface->get_uuid = g_unix_volume_get_uuid; + iface->get_drive = g_unix_volume_get_drive; + iface->get_mount = g_unix_volume_get_mount; + iface->can_mount = g_unix_volume_can_mount; + iface->can_eject = g_unix_volume_can_eject; + iface->should_automount = g_unix_volume_should_automount; + iface->mount_fn = g_unix_volume_mount; + iface->mount_finish = g_unix_volume_mount_finish; + iface->eject = g_unix_volume_eject; + iface->eject_finish = g_unix_volume_eject_finish; + iface->get_identifier = g_unix_volume_get_identifier; + iface->enumerate_identifiers = g_unix_volume_enumerate_identifiers; +} diff --git a/gio/gunixvolume.h b/gio/gunixvolume.h new file mode 100644 index 0000000..3d51d3f --- /dev/null +++ b/gio/gunixvolume.h @@ -0,0 +1,60 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#ifndef __G_UNIX_VOLUME_H__ +#define __G_UNIX_VOLUME_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_VOLUME (_g_unix_volume_get_type ()) +#define G_UNIX_VOLUME(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_VOLUME, GUnixVolume)) +#define G_UNIX_VOLUME_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_VOLUME, GUnixVolumeClass)) +#define G_IS_UNIX_VOLUME(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_VOLUME)) +#define G_IS_UNIX_VOLUME_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_VOLUME)) + +typedef struct _GUnixVolumeClass GUnixVolumeClass; + +struct _GUnixVolumeClass +{ + GObjectClass parent_class; +}; + +GType _g_unix_volume_get_type (void) G_GNUC_CONST; + +GUnixVolume * _g_unix_volume_new (GVolumeMonitor *volume_monitor, + GUnixMountPoint *mountpoint); +gboolean _g_unix_volume_has_mount_path (GUnixVolume *volume, + const char *mount_path); +void _g_unix_volume_set_mount (GUnixVolume *volume, + GUnixMount *mount); +void _g_unix_volume_unset_mount (GUnixVolume *volume, + GUnixMount *mount); +void _g_unix_volume_disconnected (GUnixVolume *volume); + +G_END_DECLS + +#endif /* __G_UNIX_VOLUME_H__ */ diff --git a/gio/gunixvolumemonitor.c b/gio/gunixvolumemonitor.c new file mode 100644 index 0000000..b44e614 --- /dev/null +++ b/gio/gunixvolumemonitor.c @@ -0,0 +1,436 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" + +#include + +#include +#include "gunixvolumemonitor.h" +#include "gunixmounts.h" +#include "gunixmount.h" +#include "gunixvolume.h" +#include "gmount.h" +#include "gmountprivate.h" +#include "giomodule.h" +#include "glibintl.h" + +#include "gioalias.h" + +struct _GUnixVolumeMonitor { + GNativeVolumeMonitor parent; + + GUnixMountMonitor *mount_monitor; + + GList *last_mountpoints; + GList *last_mounts; + + GList *volumes; + GList *mounts; +}; + +static void mountpoints_changed (GUnixMountMonitor *mount_monitor, + gpointer user_data); +static void mounts_changed (GUnixMountMonitor *mount_monitor, + gpointer user_data); +static void update_volumes (GUnixVolumeMonitor *monitor); +static void update_mounts (GUnixVolumeMonitor *monitor); + +#define g_unix_volume_monitor_get_type _g_unix_volume_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GUnixVolumeMonitor, g_unix_volume_monitor, G_TYPE_NATIVE_VOLUME_MONITOR, + g_io_extension_point_implement (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "unix", + 0)); + +static void +g_unix_volume_monitor_finalize (GObject *object) +{ + GUnixVolumeMonitor *monitor; + + monitor = G_UNIX_VOLUME_MONITOR (object); + + g_signal_handlers_disconnect_by_func (monitor->mount_monitor, mountpoints_changed, monitor); + g_signal_handlers_disconnect_by_func (monitor->mount_monitor, mounts_changed, monitor); + + g_object_unref (monitor->mount_monitor); + + g_list_foreach (monitor->last_mountpoints, (GFunc)g_unix_mount_point_free, NULL); + g_list_free (monitor->last_mountpoints); + g_list_foreach (monitor->last_mounts, (GFunc)g_unix_mount_free, NULL); + g_list_free (monitor->last_mounts); + + g_list_foreach (monitor->volumes, (GFunc)g_object_unref, NULL); + g_list_free (monitor->volumes); + g_list_foreach (monitor->mounts, (GFunc)g_object_unref, NULL); + g_list_free (monitor->mounts); + + G_OBJECT_CLASS (g_unix_volume_monitor_parent_class)->finalize (object); +} + +static void +g_unix_volume_monitor_dispose (GObject *object) +{ + GUnixVolumeMonitor *monitor; + + monitor = G_UNIX_VOLUME_MONITOR (object); + g_list_foreach (monitor->volumes, (GFunc)g_object_unref, NULL); + g_list_free (monitor->volumes); + monitor->volumes = NULL; + + g_list_foreach (monitor->mounts, (GFunc)g_object_unref, NULL); + g_list_free (monitor->mounts); + monitor->mounts = NULL; + + G_OBJECT_CLASS (g_unix_volume_monitor_parent_class)->dispose (object); +} + +static GList * +get_mounts (GVolumeMonitor *volume_monitor) +{ + GUnixVolumeMonitor *monitor; + GList *l; + + monitor = G_UNIX_VOLUME_MONITOR (volume_monitor); + + l = g_list_copy (monitor->mounts); + g_list_foreach (l, (GFunc)g_object_ref, NULL); + + return l; +} + +static GList * +get_volumes (GVolumeMonitor *volume_monitor) +{ + GUnixVolumeMonitor *monitor; + GList *l; + + monitor = G_UNIX_VOLUME_MONITOR (volume_monitor); + + l = g_list_copy (monitor->volumes); + g_list_foreach (l, (GFunc)g_object_ref, NULL); + + return l; +} + +static GList * +get_connected_drives (GVolumeMonitor *volume_monitor) +{ + return NULL; +} + +static GVolume * +get_volume_for_uuid (GVolumeMonitor *volume_monitor, const char *uuid) +{ + return NULL; +} + +static GMount * +get_mount_for_uuid (GVolumeMonitor *volume_monitor, const char *uuid) +{ + return NULL; +} + +static gboolean +is_supported (void) +{ + return TRUE; +} + +static GMount * +get_mount_for_mount_path (const char *mount_path, + GCancellable *cancellable) +{ + GUnixMountEntry *mount_entry; + GUnixMount *mount; + + mount_entry = g_unix_mount_at (mount_path, NULL); + + if (!mount_entry) + return NULL; + + /* TODO: Set mountable volume? */ + mount = _g_unix_mount_new (NULL, mount_entry, NULL); + + g_unix_mount_free (mount_entry); + + return G_MOUNT (mount); +} + +static void +g_unix_volume_monitor_class_init (GUnixVolumeMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GVolumeMonitorClass *monitor_class = G_VOLUME_MONITOR_CLASS (klass); + GNativeVolumeMonitorClass *native_class = G_NATIVE_VOLUME_MONITOR_CLASS (klass); + + gobject_class->finalize = g_unix_volume_monitor_finalize; + gobject_class->dispose = g_unix_volume_monitor_dispose; + + monitor_class->get_mounts = get_mounts; + monitor_class->get_volumes = get_volumes; + monitor_class->get_connected_drives = get_connected_drives; + monitor_class->get_volume_for_uuid = get_volume_for_uuid; + monitor_class->get_mount_for_uuid = get_mount_for_uuid; + monitor_class->is_supported = is_supported; + + native_class->get_mount_for_mount_path = get_mount_for_mount_path; +} + +static void +mountpoints_changed (GUnixMountMonitor *mount_monitor, + gpointer user_data) +{ + GUnixVolumeMonitor *unix_monitor = user_data; + + /* Update both to make sure volumes are created before mounts */ + update_volumes (unix_monitor); + update_mounts (unix_monitor); +} + +static void +mounts_changed (GUnixMountMonitor *mount_monitor, + gpointer user_data) +{ + GUnixVolumeMonitor *unix_monitor = user_data; + + /* Update both to make sure volumes are created before mounts */ + update_volumes (unix_monitor); + update_mounts (unix_monitor); +} + +static void +g_unix_volume_monitor_init (GUnixVolumeMonitor *unix_monitor) +{ + + unix_monitor->mount_monitor = g_unix_mount_monitor_new (); + + g_signal_connect (unix_monitor->mount_monitor, + "mounts-changed", G_CALLBACK (mounts_changed), + unix_monitor); + + g_signal_connect (unix_monitor->mount_monitor, + "mountpoints-changed", G_CALLBACK (mountpoints_changed), + unix_monitor); + + update_volumes (unix_monitor); + update_mounts (unix_monitor); +} + +GVolumeMonitor * +_g_unix_volume_monitor_new (void) +{ + GUnixVolumeMonitor *monitor; + + monitor = g_object_new (G_TYPE_UNIX_VOLUME_MONITOR, NULL); + + return G_VOLUME_MONITOR (monitor); +} + +static void +diff_sorted_lists (GList *list1, + GList *list2, + GCompareFunc compare, + GList **added, + GList **removed) +{ + int order; + + *added = *removed = NULL; + + while (list1 != NULL && + list2 != NULL) + { + order = (*compare) (list1->data, list2->data); + if (order < 0) + { + *removed = g_list_prepend (*removed, list1->data); + list1 = list1->next; + } + else if (order > 0) + { + *added = g_list_prepend (*added, list2->data); + list2 = list2->next; + } + else + { /* same item */ + list1 = list1->next; + list2 = list2->next; + } + } + + while (list1 != NULL) + { + *removed = g_list_prepend (*removed, list1->data); + list1 = list1->next; + } + while (list2 != NULL) + { + *added = g_list_prepend (*added, list2->data); + list2 = list2->next; + } +} + +GUnixVolume * +_g_unix_volume_monitor_lookup_volume_for_mount_path (GUnixVolumeMonitor *monitor, + const char *mount_path) +{ + GList *l; + + for (l = monitor->volumes; l != NULL; l = l->next) + { + GUnixVolume *volume = l->data; + + if (_g_unix_volume_has_mount_path (volume, mount_path)) + return volume; + } + + return NULL; +} + +static GUnixMount * +find_mount_by_mountpath (GUnixVolumeMonitor *monitor, + const char *mount_path) +{ + GList *l; + + for (l = monitor->mounts; l != NULL; l = l->next) + { + GUnixMount *mount = l->data; + + if (_g_unix_mount_has_mount_path (mount, mount_path)) + return mount; + } + + return NULL; +} + +static void +update_volumes (GUnixVolumeMonitor *monitor) +{ + GList *new_mountpoints; + GList *removed, *added; + GList *l; + GUnixVolume *volume; + + new_mountpoints = g_unix_mount_points_get (NULL); + + new_mountpoints = g_list_sort (new_mountpoints, (GCompareFunc) g_unix_mount_point_compare); + + diff_sorted_lists (monitor->last_mountpoints, + new_mountpoints, (GCompareFunc) g_unix_mount_point_compare, + &added, &removed); + + for (l = removed; l != NULL; l = l->next) + { + GUnixMountPoint *mountpoint = l->data; + + volume = _g_unix_volume_monitor_lookup_volume_for_mount_path (monitor, + g_unix_mount_point_get_mount_path (mountpoint)); + if (volume) + { + _g_unix_volume_disconnected (volume); + monitor->volumes = g_list_remove (monitor->volumes, volume); + g_signal_emit_by_name (monitor, "volume-removed", volume); + g_signal_emit_by_name (volume, "removed"); + g_object_unref (volume); + } + } + + for (l = added; l != NULL; l = l->next) + { + GUnixMountPoint *mountpoint = l->data; + + volume = _g_unix_volume_new (G_VOLUME_MONITOR (monitor), mountpoint); + if (volume) + { + monitor->volumes = g_list_prepend (monitor->volumes, volume); + g_signal_emit_by_name (monitor, "volume-added", volume); + } + } + + g_list_free (added); + g_list_free (removed); + g_list_foreach (monitor->last_mountpoints, + (GFunc)g_unix_mount_point_free, NULL); + g_list_free (monitor->last_mountpoints); + monitor->last_mountpoints = new_mountpoints; +} + +static void +update_mounts (GUnixVolumeMonitor *monitor) +{ + GList *new_mounts; + GList *removed, *added; + GList *l; + GUnixMount *mount; + GUnixVolume *volume; + const char *mount_path; + + new_mounts = g_unix_mounts_get (NULL); + + new_mounts = g_list_sort (new_mounts, (GCompareFunc) g_unix_mount_compare); + + diff_sorted_lists (monitor->last_mounts, + new_mounts, (GCompareFunc) g_unix_mount_compare, + &added, &removed); + + for (l = removed; l != NULL; l = l->next) + { + GUnixMountEntry *mount_entry = l->data; + + mount = find_mount_by_mountpath (monitor, g_unix_mount_get_mount_path (mount_entry)); + if (mount) + { + _g_unix_mount_unmounted (mount); + monitor->mounts = g_list_remove (monitor->mounts, mount); + g_signal_emit_by_name (monitor, "mount-removed", mount); + g_signal_emit_by_name (mount, "unmounted"); + g_object_unref (mount); + } + } + + for (l = added; l != NULL; l = l->next) + { + GUnixMountEntry *mount_entry = l->data; + + mount_path = g_unix_mount_get_mount_path (mount_entry); + + volume = _g_unix_volume_monitor_lookup_volume_for_mount_path (monitor, mount_path); + mount = _g_unix_mount_new (G_VOLUME_MONITOR (monitor), mount_entry, volume); + if (mount) + { + monitor->mounts = g_list_prepend (monitor->mounts, mount); + g_signal_emit_by_name (monitor, "mount-added", mount); + } + } + + g_list_free (added); + g_list_free (removed); + g_list_foreach (monitor->last_mounts, + (GFunc)g_unix_mount_free, NULL); + g_list_free (monitor->last_mounts); + monitor->last_mounts = new_mounts; +} diff --git a/gio/gunixvolumemonitor.h b/gio/gunixvolumemonitor.h new file mode 100644 index 0000000..9c09cf6 --- /dev/null +++ b/gio/gunixvolumemonitor.h @@ -0,0 +1,63 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#ifndef __G_UNIX_VOLUME_MONITOR_H__ +#define __G_UNIX_VOLUME_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_VOLUME_MONITOR (_g_unix_volume_monitor_get_type ()) +#define G_UNIX_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_VOLUME_MONITOR, GUnixVolumeMonitor)) +#define G_UNIX_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_UNIX_VOLUME_MONITOR, GUnixVolumeMonitorClass)) +#define G_IS_UNIX_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_VOLUME_MONITOR)) +#define G_IS_UNIX_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_VOLUME_MONITOR)) + +typedef struct _GUnixVolumeMonitor GUnixVolumeMonitor; +typedef struct _GUnixVolumeMonitorClass GUnixVolumeMonitorClass; + +/* Forward definitions */ + +/** + * GUnixMount: + * + * Implementation of the #GMount interface for Unix systems. + */ +typedef struct _GUnixMount GUnixMount; +typedef struct _GUnixVolume GUnixVolume; + +struct _GUnixVolumeMonitorClass +{ + GNativeVolumeMonitorClass parent_class; +}; + +GType _g_unix_volume_monitor_get_type (void) G_GNUC_CONST; + +GVolumeMonitor * _g_unix_volume_monitor_new (void); +GUnixVolume * _g_unix_volume_monitor_lookup_volume_for_mount_path (GUnixVolumeMonitor *monitor, + const char *mount_path); + +G_END_DECLS + +#endif /* __G_UNIX_VOLUME_MONITOR_H__ */ diff --git a/gio/gvfs.c b/gio/gvfs.c new file mode 100644 index 0000000..df59c62 --- /dev/null +++ b/gio/gvfs.c @@ -0,0 +1,255 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" +#include +#include "gvfs.h" +#include "glocalvfs.h" +#include "giomodule-priv.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gvfs + * @short_description: Virtual File System + * @include: gio/gio.h + * + * Entry point for using GIO functionality. + * + **/ + +G_DEFINE_TYPE (GVfs, g_vfs, G_TYPE_OBJECT); + +static void +g_vfs_class_init (GVfsClass *klass) +{ +} + +static void +g_vfs_init (GVfs *vfs) +{ +} + +/** + * g_vfs_is_active: + * @vfs: a #GVfs. + * + * Checks if the VFS is active. + * + * Returns: %TRUE if construction of the @vfs was successful and it is now active. + **/ +gboolean +g_vfs_is_active (GVfs *vfs) +{ + GVfsClass *class; + + g_return_val_if_fail (G_IS_VFS (vfs), FALSE); + + class = G_VFS_GET_CLASS (vfs); + + return (* class->is_active) (vfs); +} + + +/** + * g_vfs_get_file_for_path: + * @vfs: a #GVfs. + * @path: a string containing a VFS path. + * + * Gets a #GFile for @path. + * + * Returns: a #GFile. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_vfs_get_file_for_path (GVfs *vfs, + const char *path) +{ + GVfsClass *class; + + g_return_val_if_fail (G_IS_VFS (vfs), NULL); + g_return_val_if_fail (path != NULL, NULL); + + class = G_VFS_GET_CLASS (vfs); + + return (* class->get_file_for_path) (vfs, path); +} + +/** + * g_vfs_get_file_for_uri: + * @vfs: a#GVfs. + * @uri: a string containing a URI + * + * Gets a #GFile for @uri. + * + * This operation never fails, but the returned object + * might not support any I/O operation if the URI + * is malformed or if the URI scheme is not supported. + * + * Returns: a #GFile. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_vfs_get_file_for_uri (GVfs *vfs, + const char *uri) +{ + GVfsClass *class; + + g_return_val_if_fail (G_IS_VFS (vfs), NULL); + g_return_val_if_fail (uri != NULL, NULL); + + class = G_VFS_GET_CLASS (vfs); + + return (* class->get_file_for_uri) (vfs, uri); +} + +/** + * g_vfs_get_supported_uri_schemes: + * @vfs: a #GVfs. + * + * Gets a list of URI schemes supported by @vfs. + * + * Returns: a %NULL-terminated array of strings. + * The returned array belongs to GIO and must + * not be freed or modified. + **/ +const gchar * const * +g_vfs_get_supported_uri_schemes (GVfs *vfs) +{ + GVfsClass *class; + + g_return_val_if_fail (G_IS_VFS (vfs), NULL); + + class = G_VFS_GET_CLASS (vfs); + + return (* class->get_supported_uri_schemes) (vfs); +} + +/** + * g_vfs_parse_name: + * @vfs: a #GVfs. + * @parse_name: a string to be parsed by the VFS module. + * + * This operation never fails, but the returned object might + * not support any I/O operations if the @parse_name cannot + * be parsed by the #GVfs module. + * + * Returns: a #GFile for the given @parse_name. + * Free the returned object with g_object_unref(). + **/ +GFile * +g_vfs_parse_name (GVfs *vfs, + const char *parse_name) +{ + GVfsClass *class; + + g_return_val_if_fail (G_IS_VFS (vfs), NULL); + g_return_val_if_fail (parse_name != NULL, NULL); + + class = G_VFS_GET_CLASS (vfs); + + return (* class->parse_name) (vfs, parse_name); +} + +static gpointer +get_default_vfs (gpointer arg) +{ + const char *use_this; + GVfs *vfs; + GList *l; + GIOExtensionPoint *ep; + GIOExtension *extension; + + + use_this = g_getenv ("GIO_USE_VFS"); + + /* Ensure vfs in modules loaded */ + _g_io_modules_ensure_loaded (); + + ep = g_io_extension_point_lookup (G_VFS_EXTENSION_POINT_NAME); + + if (use_this) + { + extension = g_io_extension_point_get_extension_by_name (ep, use_this); + if (extension) + { + vfs = g_object_new (g_io_extension_get_type (extension), NULL); + + if (g_vfs_is_active (vfs)) + return vfs; + + g_object_unref (vfs); + } + } + + for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) + { + extension = l->data; + + vfs = g_object_new (g_io_extension_get_type (extension), NULL); + + if (g_vfs_is_active (vfs)) + return vfs; + + g_object_unref (vfs); + } + + + return NULL; +} + +/** + * g_vfs_get_default: + * + * Gets the default #GVfs for the system. + * + * Returns: a #GVfs. + **/ +GVfs * +g_vfs_get_default (void) +{ + static GOnce once_init = G_ONCE_INIT; + + return g_once (&once_init, get_default_vfs, NULL); +} + +/** + * g_vfs_get_local: + * + * Gets the local #GVfs for the system. + * + * Returns: a #GVfs. + **/ +GVfs * +g_vfs_get_local (void) +{ + static gsize vfs = 0; + + if (g_once_init_enter (&vfs)) + g_once_init_leave (&vfs, (gsize)_g_local_vfs_new ()); + + return G_VFS (vfs); +} + +#define __G_VFS_C__ +#include "gioaliasdef.c" diff --git a/gio/gvfs.h b/gio/gvfs.h new file mode 100644 index 0000000..bacbe8b --- /dev/null +++ b/gio/gvfs.h @@ -0,0 +1,125 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_VFS_H__ +#define __G_VFS_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_VFS (g_vfs_get_type ()) +#define G_VFS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_VFS, GVfs)) +#define G_VFS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_VFS, GVfsClass)) +#define G_VFS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_VFS, GVfsClass)) +#define G_IS_VFS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_VFS)) +#define G_IS_VFS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_VFS)) + +/** + * G_VFS_EXTENSION_POINT_NAME: + * + * Extension point for #GVfs functionality. + * See Extending GIO. + */ +#define G_VFS_EXTENSION_POINT_NAME "gio-vfs" + +/** + * GVfs: + * + * Virtual File System object. + **/ +typedef struct _GVfsClass GVfsClass; + +struct _GVfs +{ + GObject parent_instance; +}; + +struct _GVfsClass +{ + GObjectClass parent_class; + + /* Virtual Table */ + + gboolean (* is_active) (GVfs *vfs); + GFile * (* get_file_for_path) (GVfs *vfs, + const char *path); + GFile * (* get_file_for_uri) (GVfs *vfs, + const char *uri); + const gchar * const * (* get_supported_uri_schemes) (GVfs *vfs); + GFile * (* parse_name) (GVfs *vfs, + const char *parse_name); + + /*< private >*/ + void (* local_file_add_info) (GVfs *vfs, + const char *filename, + guint64 device, + GFileAttributeMatcher *attribute_matcher, + GFileInfo *info, + GCancellable *cancellable, + gpointer *extra_data, + GDestroyNotify *free_extra_data); + void (* add_writable_namespaces) (GVfs *vfs, + GFileAttributeInfoList *list); + gboolean (* local_file_set_attributes) (GVfs *vfs, + const char *filename, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + void (* local_file_removed) (GVfs *vfs, + const char *filename); + void (* local_file_moved) (GVfs *vfs, + const char *source, + const char *dest); + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + void (*_g_reserved7) (void); +}; + +GType g_vfs_get_type (void) G_GNUC_CONST; + +gboolean g_vfs_is_active (GVfs *vfs); +GFile * g_vfs_get_file_for_path (GVfs *vfs, + const char *path); +GFile * g_vfs_get_file_for_uri (GVfs *vfs, + const char *uri); +const gchar* const * g_vfs_get_supported_uri_schemes (GVfs *vfs); + +GFile * g_vfs_parse_name (GVfs *vfs, + const char *parse_name); + +GVfs * g_vfs_get_default (void); +GVfs * g_vfs_get_local (void); + +G_END_DECLS + +#endif /* __G_VFS_H__ */ diff --git a/gio/gvolume.c b/gio/gvolume.c new file mode 100644 index 0000000..b2b85bb --- /dev/null +++ b/gio/gvolume.c @@ -0,0 +1,645 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" +#include "gmount.h" +#include "gvolume.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gioerror.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gvolume + * @short_description: Volume management + * @include: gio/gio.h + * + * The #GVolume interface represents user-visible objects that can be + * mounted. Note, when porting from GnomeVFS, #GVolume is the moral + * equivalent of #GnomeVFSDrive. + * + * Mounting a #GVolume instance is an asynchronous operation. For more + * information about asynchronous operations, see #GAsyncReady and + * #GSimpleAsyncReady. To mount a #GVolume, first call + * g_volume_mount() with (at least) the #GVolume instance, optionally + * a #GMountOperation object and a #GAsyncReadyCallback. + * + * Typically, one will only want to pass %NULL for the + * #GMountOperation if automounting all volumes when a desktop session + * starts since it's not desirable to put up a lot of dialogs asking + * for credentials. + * + * The callback will be fired when the operation has resolved (either + * with success or failure), and a #GAsyncReady structure will be + * passed to the callback. That callback should then call + * g_volume_mount_finish() with the #GVolume instance and the + * #GAsyncReady data to see if the operation was completed + * successfully. If an @error is present when g_volume_mount_finish() + * is called, then it will be filled with any error information. + * + * + * It is sometimes necessary to directly access the underlying + * operating system object behind a volume (e.g. for passing a volume + * to an application via the commandline). For this purpose, GIO + * allows to obtain an 'identifier' for the volume. There can be + * different kinds of identifiers, such as Hal UDIs, filesystem labels, + * traditional Unix devices (e.g. /dev/sda2), + * uuids. GIO uses predefind strings as names for the different kinds + * of identifiers: #G_VOLUME_IDENTIFIER_KIND_HAL_UDI, + * #G_VOLUME_IDENTIFIER_KIND_LABEL, etc. Use g_volume_get_identifier() + * to obtain an identifier for a volume. + * + * + * Note that #G_VOLUME_IDENTIFIER_KIND_HAL_UDI will only be available + * when the gvfs hal volume monitor is in use. Other volume monitors + * will generally be able to provide the #G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE + * identifier, which can be used to obtain a hal device by means of + * libhal_manger_find_device_string_match(). + */ + +typedef GVolumeIface GVolumeInterface; +G_DEFINE_INTERFACE(GVolume, g_volume, G_TYPE_OBJECT) + +static void +g_volume_default_init (GVolumeInterface *iface) +{ + /** + * GVolume::changed: + * + * Emitted when the volume has been changed. + **/ + g_signal_new (I_("changed"), + G_TYPE_VOLUME, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeIface, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** + * GVolume::removed: + * + * This signal is emitted when the #GVolume have been removed. If + * the recipient is holding references to the object they should + * release them so the object can be finalized. + **/ + g_signal_new (I_("removed"), + G_TYPE_VOLUME, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeIface, removed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); +} + +/** + * g_volume_get_name: + * @volume: a #GVolume. + * + * Gets the name of @volume. + * + * Returns: the name for the given @volume. The returned string should + * be freed with g_free() when no longer needed. + **/ +char * +g_volume_get_name (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + return (* iface->get_name) (volume); +} + +/** + * g_volume_get_icon: + * @volume: a #GVolume. + * + * Gets the icon for @volume. + * + * Returns: a #GIcon. + * The returned object should be unreffed with g_object_unref() + * when no longer needed. + **/ +GIcon * +g_volume_get_icon (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + return (* iface->get_icon) (volume); +} + +/** + * g_volume_get_uuid: + * @volume: a #GVolume. + * + * Gets the UUID for the @volume. The reference is typically based on + * the file system UUID for the volume in question and should be + * considered an opaque string. Returns %NULL if there is no UUID + * available. + * + * Returns: the UUID for @volume or %NULL if no UUID can be computed. + * The returned string should be freed with g_free() + * when no longer needed. + **/ +char * +g_volume_get_uuid (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + return (* iface->get_uuid) (volume); +} + +/** + * g_volume_get_drive: + * @volume: a #GVolume. + * + * Gets the drive for the @volume. + * + * Returns: a #GDrive or %NULL if @volume is not associated with a drive. + * The returned object should be unreffed with g_object_unref() + * when no longer needed. + **/ +GDrive * +g_volume_get_drive (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + return (* iface->get_drive) (volume); +} + +/** + * g_volume_get_mount: + * @volume: a #GVolume. + * + * Gets the mount for the @volume. + * + * Returns: a #GMount or %NULL if @volume isn't mounted. + * The returned object should be unreffed with g_object_unref() + * when no longer needed. + **/ +GMount * +g_volume_get_mount (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + return (* iface->get_mount) (volume); +} + + +/** + * g_volume_can_mount: + * @volume: a #GVolume. + * + * Checks if a volume can be mounted. + * + * Returns: %TRUE if the @volume can be mounted. %FALSE otherwise. + **/ +gboolean +g_volume_can_mount (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), FALSE); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->can_mount == NULL) + return FALSE; + + return (* iface->can_mount) (volume); +} + +/** + * g_volume_can_eject: + * @volume: a #GVolume. + * + * Checks if a volume can be ejected. + * + * Returns: %TRUE if the @volume can be ejected. %FALSE otherwise. + **/ +gboolean +g_volume_can_eject (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), FALSE); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->can_eject == NULL) + return FALSE; + + return (* iface->can_eject) (volume); +} + +/** + * g_volume_should_automount: + * @volume: a #GVolume + * + * Returns whether the volume should be automatically mounted. + * + * Returns: %TRUE if the volume should be automatically mounted. + */ +gboolean +g_volume_should_automount (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), FALSE); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->should_automount == NULL) + return FALSE; + + return (* iface->should_automount) (volume); +} + + +/** + * g_volume_mount: + * @volume: a #GVolume. + * @flags: flags affecting the operation + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data that gets passed to @callback + * + * Mounts a volume. This is an asynchronous operation, and is + * finished by calling g_volume_mount_finish() with the @volume + * and #GAsyncResult returned in the @callback. + **/ +void +g_volume_mount (GVolume *volume, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GVolumeIface *iface; + + g_return_if_fail (G_IS_VOLUME (volume)); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->mount_fn == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (volume), callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("volume doesn't implement mount")); + + return; + } + + (* iface->mount_fn) (volume, flags, mount_operation, cancellable, callback, user_data); +} + +/** + * g_volume_mount_finish: + * @volume: a #GVolume + * @result: a #GAsyncResult + * @error: a #GError location to store an error, or %NULL to ignore + * + * Finishes mounting a volume. If any errors occured during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * If the mount operation succeeded, g_volume_get_mount() on @volume + * is guaranteed to return the mount right after calling this + * function; there's no need to listen for the 'mount-added' signal on + * #GVolumeMonitor. + * + * Returns: %TRUE, %FALSE if operation failed. + **/ +gboolean +g_volume_mount_finish (GVolume *volume, + GAsyncResult *result, + GError **error) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_VOLUME_GET_IFACE (volume); + return (* iface->mount_finish) (volume, result, error); +} + +/** + * g_volume_eject: + * @volume: a #GVolume. + * @flags: flags affecting the unmount if required for eject + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data that gets passed to @callback + * + * Ejects a volume. This is an asynchronous operation, and is + * finished by calling g_volume_eject_finish() with the @volume + * and #GAsyncResult returned in the @callback. + * + * Deprecated: 2.22: Use g_volume_eject_with_operation() instead. + **/ +void +g_volume_eject (GVolume *volume, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GVolumeIface *iface; + + g_return_if_fail (G_IS_VOLUME (volume)); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->eject == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (volume), callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("volume doesn't implement eject")); + + return; + } + + (* iface->eject) (volume, flags, cancellable, callback, user_data); +} + +/** + * g_volume_eject_finish: + * @volume: pointer to a #GVolume. + * @result: a #GAsyncResult. + * @error: a #GError location to store an error, or %NULL to ignore + * + * Finishes ejecting a volume. If any errors occured during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE, %FALSE if operation failed. + * + * Deprecated: 2.22: Use g_volume_eject_with_operation_finish() instead. + **/ +gboolean +g_volume_eject_finish (GVolume *volume, + GAsyncResult *result, + GError **error) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_VOLUME_GET_IFACE (volume); + return (* iface->eject_finish) (volume, result, error); +} + +/** + * g_volume_eject_with_operation: + * @volume: a #GVolume. + * @flags: flags affecting the unmount if required for eject + * @mount_operation: a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @callback: a #GAsyncReadyCallback, or %NULL. + * @user_data: user data passed to @callback. + * + * Ejects a volume. This is an asynchronous operation, and is + * finished by calling g_volume_eject_with_operation_finish() with the @volume + * and #GAsyncResult data returned in the @callback. + * + * Since: 2.22 + **/ +void +g_volume_eject_with_operation (GVolume *volume, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GVolumeIface *iface; + + g_return_if_fail (G_IS_VOLUME (volume)); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->eject == NULL && iface->eject_with_operation == NULL) + { + g_simple_async_report_error_in_idle (G_OBJECT (volume), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + /* Translators: This is an error + * message for volume objects that + * don't implement any of eject or eject_with_operation. */ + _("volume doesn't implement eject or eject_with_operation")); + return; + } + + if (iface->eject_with_operation != NULL) + (* iface->eject_with_operation) (volume, flags, mount_operation, cancellable, callback, user_data); + else + (* iface->eject) (volume, flags, cancellable, callback, user_data); +} + +/** + * g_volume_eject_with_operation_finish: + * @volume: a #GVolume. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occuring, or %NULL to + * ignore. + * + * Finishes ejecting a volume. If any errors occurred during the operation, + * @error will be set to contain the errors and %FALSE will be returned. + * + * Returns: %TRUE if the volume was successfully ejected. %FALSE otherwise. + * + * Since: 2.22 + **/ +gboolean +g_volume_eject_with_operation_finish (GVolume *volume, + GAsyncResult *result, + GError **error) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); + + if (G_IS_SIMPLE_ASYNC_RESULT (result)) + { + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + if (g_simple_async_result_propagate_error (simple, error)) + return FALSE; + } + + iface = G_VOLUME_GET_IFACE (volume); + if (iface->eject_with_operation_finish != NULL) + return (* iface->eject_with_operation_finish) (volume, result, error); + else + return (* iface->eject_finish) (volume, result, error); +} + +/** + * g_volume_get_identifier: + * @volume: a #GVolume + * @kind: the kind of identifier to return + * + * Gets the identifier of the given kind for @volume. + * See the introduction + * for more information about volume identifiers. + * + * Returns: a newly allocated string containing the + * requested identfier, or %NULL if the #GVolume + * doesn't have this kind of identifier + */ +char * +g_volume_get_identifier (GVolume *volume, + const char *kind) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + g_return_val_if_fail (kind != NULL, NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->get_identifier == NULL) + return NULL; + + return (* iface->get_identifier) (volume, kind); +} + +/** + * g_volume_enumerate_identifiers: + * @volume: a #GVolume + * + * Gets the kinds of identifiers + * that @volume has. Use g_volume_get_identifer() to obtain + * the identifiers themselves. + * + * Returns: a %NULL-terminated array of strings containing + * kinds of identifiers. Use g_strfreev() to free. + */ +char ** +g_volume_enumerate_identifiers (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->enumerate_identifiers == NULL) + return NULL; + + return (* iface->enumerate_identifiers) (volume); +} + +/** + * g_volume_get_activation_root: + * @volume: a #GVolume + * + * Gets the activation root for a #GVolume if it is known ahead of + * mount time. Returns %NULL otherwise. If not %NULL and if @volume + * is mounted, then the result of g_mount_get_root() on the + * #GMount object obtained from g_volume_get_mount() will always + * either be equal or a prefix of what this function returns. In + * other words, in code + * + * + * GMount *mount; + * GFile *mount_root + * GFile *volume_activation_root; + * + * mount = g_volume_get_mount (volume); /* mounted, so never NULL */ + * mount_root = g_mount_get_root (mount); + * volume_activation_root = g_volume_get_activation_root(volume); /* assume not NULL */ + * + * + * then the expression + * + * + * (g_file_has_prefix (volume_activation_root, mount_root) || + g_file_equal (volume_activation_root, mount_root)) + * + * + * will always be %TRUE. + * + * Activation roots are typically used in #GVolumeMonitor + * implementations to find the underlying mount to shadow, see + * g_mount_is_shadowed() for more details. + * + * Returns: the activation root of @volume or %NULL. Use + * g_object_unref() to free. + * + * Since: 2.18 + **/ +GFile * +g_volume_get_activation_root (GVolume *volume) +{ + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->get_activation_root == NULL) + return NULL; + + return (* iface->get_activation_root) (volume); +} + + + +#define __G_VOLUME_C__ +#include "gioaliasdef.c" diff --git a/gio/gvolume.h b/gio/gvolume.h new file mode 100644 index 0000000..5496d26 --- /dev/null +++ b/gio/gvolume.h @@ -0,0 +1,211 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_VOLUME_H__ +#define __G_VOLUME_H__ + +#include + +G_BEGIN_DECLS + +/** + * G_VOLUME_IDENTIFIER_KIND_HAL_UDI: + * + * The string used to obtain a Hal UDI with g_volume_get_identifier(). + */ +#define G_VOLUME_IDENTIFIER_KIND_HAL_UDI "hal-udi" + +/** + * G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE: + * + * The string used to obtain a Unix device path with g_volume_get_identifier(). + */ +#define G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE "unix-device" + +/** + * G_VOLUME_IDENTIFIER_KIND_LABEL: + * + * The string used to obtain a filesystem label with g_volume_get_identifier(). + */ +#define G_VOLUME_IDENTIFIER_KIND_LABEL "label" + +/** + * G_VOLUME_IDENTIFIER_KIND_UUID: + * + * The string used to obtain a UUID with g_volume_get_identifier(). + */ +#define G_VOLUME_IDENTIFIER_KIND_UUID "uuid" + +/** + * G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT: + * + * The string used to obtain a NFS mount with g_volume_get_identifier(). + */ +#define G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT "nfs-mount" + + +#define G_TYPE_VOLUME (g_volume_get_type ()) +#define G_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_VOLUME, GVolume)) +#define G_IS_VOLUME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_VOLUME)) +#define G_VOLUME_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_VOLUME, GVolumeIface)) + +/** + * GVolumeIface: + * @g_iface: The parent interface. + * @changed: Changed signal that is emitted when the volume's state has changed. + * @removed: The removed signal that is emitted when the #GVolume have been removed. If the recipient is holding references to the object they should release them so the object can be finalized. + * @get_name: Gets a string containing the name of the #GVolume. + * @get_icon: Gets a #GIcon for the #GVolume. + * @get_uuid: Gets the UUID for the #GVolume. The reference is typically based on the file system UUID for the mount in question and should be considered an opaque string. Returns %NULL if there is no UUID available. + * @get_drive: Gets a #GDrive the volume is located on. Returns %NULL if the #GVolume is not associated with a #GDrive. + * @get_mount: Gets a #GMount representing the mounted volume. Returns %NULL if the #GVolume is not mounted. + * @can_mount: Returns %TRUE if the #GVolume can be mounted. + * @can_eject: Checks if a #GVolume can be ejected. + * @mount_fn: Mounts a given #GVolume. + * #GVolume implementations must emit the #GMountOperation::aborted + * signal before completing a mount operation that is aborted while + * awaiting input from the user through a #GMountOperation instance. + * @mount_finish: Finishes a mount operation. + * @eject: Ejects a given #GVolume. + * @eject_finish: Finishes an eject operation. + * @get_identifier: Returns the identifier of the given kind, or %NULL if + * the #GVolume doesn't have one. + * @enumerate_identifiers: Returns an array strings listing the kinds + * of identifiers which the #GVolume has. + * @should_automount: Returns %TRUE if the #GVolume should be automatically mounted. + * @get_activation_root: Returns the activation root for the #GVolume if it is known in advance or %NULL if + * it is not known. + * @eject_with_operation: Starts ejecting a #GVolume using a #GMountOperation. Since 2.22. + * @eject_with_operation_finish: Finishes an eject operation using a #GMountOperation. Since 2.22. + * + * Interface for implementing operations for mountable volumes. + **/ +typedef struct _GVolumeIface GVolumeIface; + +struct _GVolumeIface +{ + GTypeInterface g_iface; + + /* signals */ + + void (* changed) (GVolume *volume); + void (* removed) (GVolume *volume); + + /* Virtual Table */ + + char * (* get_name) (GVolume *volume); + GIcon * (* get_icon) (GVolume *volume); + char * (* get_uuid) (GVolume *volume); + GDrive * (* get_drive) (GVolume *volume); + GMount * (* get_mount) (GVolume *volume); + gboolean (* can_mount) (GVolume *volume); + gboolean (* can_eject) (GVolume *volume); + void (* mount_fn) (GVolume *volume, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* mount_finish) (GVolume *volume, + GAsyncResult *result, + GError **error); + void (* eject) (GVolume *volume, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_finish) (GVolume *volume, + GAsyncResult *result, + GError **error); + + char * (* get_identifier) (GVolume *volume, + const char *kind); + char ** (* enumerate_identifiers) (GVolume *volume); + + gboolean (* should_automount) (GVolume *volume); + + GFile * (* get_activation_root) (GVolume *volume); + + void (* eject_with_operation) (GVolume *volume, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* eject_with_operation_finish) (GVolume *volume, + GAsyncResult *result, + GError **error); +}; + +GType g_volume_get_type (void) G_GNUC_CONST; + +char * g_volume_get_name (GVolume *volume); +GIcon * g_volume_get_icon (GVolume *volume); +char * g_volume_get_uuid (GVolume *volume); +GDrive * g_volume_get_drive (GVolume *volume); +GMount * g_volume_get_mount (GVolume *volume); +gboolean g_volume_can_mount (GVolume *volume); +gboolean g_volume_can_eject (GVolume *volume); +gboolean g_volume_should_automount (GVolume *volume); +void g_volume_mount (GVolume *volume, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_volume_mount_finish (GVolume *volume, + GAsyncResult *result, + GError **error); +#ifndef G_DISABLE_DEPRECATED +void g_volume_eject (GVolume *volume, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_volume_eject_finish (GVolume *volume, + GAsyncResult *result, + GError **error); +#endif +char * g_volume_get_identifier (GVolume *volume, + const char *kind); +char ** g_volume_enumerate_identifiers (GVolume *volume); + +GFile * g_volume_get_activation_root (GVolume *volume); + +void g_volume_eject_with_operation (GVolume *volume, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean g_volume_eject_with_operation_finish (GVolume *volume, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_VOLUME_H__ */ diff --git a/gio/gvolumemonitor.c b/gio/gvolumemonitor.c new file mode 100644 index 0000000..c01162b --- /dev/null +++ b/gio/gvolumemonitor.c @@ -0,0 +1,396 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#include "config.h" +#include "gvolumemonitor.h" +#include "gvolume.h" +#include "gmount.h" +#include "gdrive.h" +#include "glibintl.h" + +#include "gioalias.h" + +/** + * SECTION:gvolumemonitor + * @short_description: Volume Monitor + * @include: gio/gio.h + * @see_also: #GFileMonitor + * + * #GVolumeMonitor is for listing the user interesting devices and volumes + * on the computer. In other words, what a file selector or file manager + * would show in a sidebar. + * + * #GVolumeMonitor is not thread-default-context + * aware, and so should not be used other than from the main + * thread, with no thread-default-context active. + **/ + +G_DEFINE_TYPE (GVolumeMonitor, g_volume_monitor, G_TYPE_OBJECT); + +enum { + VOLUME_ADDED, + VOLUME_REMOVED, + VOLUME_CHANGED, + MOUNT_ADDED, + MOUNT_REMOVED, + MOUNT_PRE_UNMOUNT, + MOUNT_CHANGED, + DRIVE_CONNECTED, + DRIVE_DISCONNECTED, + DRIVE_CHANGED, + DRIVE_EJECT_BUTTON, + DRIVE_STOP_BUTTON, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + + +static void +g_volume_monitor_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_volume_monitor_parent_class)->finalize (object); +} + +static void +g_volume_monitor_class_init (GVolumeMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_volume_monitor_finalize; + + /** + * GVolumeMonitor::volume-added: + * @volume_monitor: The volume monitor emitting the signal. + * @volume: a #GVolume that was added. + * + * Emitted when a mountable volume is added to the system. + **/ + signals[VOLUME_ADDED] = g_signal_new (I_("volume-added"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, volume_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_VOLUME); + + /** + * GVolumeMonitor::volume-removed: + * @volume_monitor: The volume monitor emitting the signal. + * @volume: a #GVolume that was removed. + * + * Emitted when a mountable volume is removed from the system. + **/ + signals[VOLUME_REMOVED] = g_signal_new (I_("volume-removed"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, volume_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_VOLUME); + + /** + * GVolumeMonitor::volume-changed: + * @volume_monitor: The volume monitor emitting the signal. + * @volume: a #GVolume that changed. + * + * Emitted when mountable volume is changed. + **/ + signals[VOLUME_CHANGED] = g_signal_new (I_("volume-changed"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, volume_changed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_VOLUME); + + /** + * GVolumeMonitor::mount-added: + * @volume_monitor: The volume monitor emitting the signal. + * @mount: a #GMount that was added. + * + * Emitted when a mount is added. + **/ + signals[MOUNT_ADDED] = g_signal_new (I_("mount-added"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, mount_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_MOUNT); + + /** + * GVolumeMonitor::mount-removed: + * @volume_monitor: The volume monitor emitting the signal. + * @mount: a #GMount that was removed. + * + * Emitted when a mount is removed. + **/ + signals[MOUNT_REMOVED] = g_signal_new (I_("mount-removed"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, mount_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_MOUNT); + + /** + * GVolumeMonitor::mount-pre-unmount: + * @volume_monitor: The volume monitor emitting the signal. + * @mount: a #GMount that is being unmounted. + * + * Emitted when a mount is about to be removed. + **/ + signals[MOUNT_PRE_UNMOUNT] = g_signal_new (I_("mount-pre-unmount"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, mount_pre_unmount), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_MOUNT); + + /** + * GVolumeMonitor::mount-changed: + * @volume_monitor: The volume monitor emitting the signal. + * @mount: a #GMount that changed. + * + * Emitted when a mount changes. + **/ + signals[MOUNT_CHANGED] = g_signal_new (I_("mount-changed"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, mount_changed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_MOUNT); + + /** + * GVolumeMonitor::drive-connected: + * @volume_monitor: The volume monitor emitting the signal. + * @drive: a #GDrive that was connected. + * + * Emitted when a drive is connected to the system. + **/ + signals[DRIVE_CONNECTED] = g_signal_new (I_("drive-connected"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, drive_connected), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_DRIVE); + + /** + * GVolumeMonitor::drive-disconnected: + * @volume_monitor: The volume monitor emitting the signal. + * @drive: a #GDrive that was disconnected. + * + * Emitted when a drive is disconnected from the system. + **/ + signals[DRIVE_DISCONNECTED] = g_signal_new (I_("drive-disconnected"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, drive_disconnected), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_DRIVE); + + /** + * GVolumeMonitor::drive-changed: + * @volume_monitor: The volume monitor emitting the signal. + * @drive: the drive that changed + * + * Emitted when a drive changes. + **/ + signals[DRIVE_CHANGED] = g_signal_new (I_("drive-changed"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, drive_changed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_DRIVE); + + /** + * GVolumeMonitor::drive-eject-button: + * @volume_monitor: The volume monitor emitting the signal. + * @drive: the drive where the eject button was pressed + * + * Emitted when the eject button is pressed on @drive. + * + * Since: 2.18 + **/ + signals[DRIVE_EJECT_BUTTON] = g_signal_new (I_("drive-eject-button"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, drive_eject_button), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_DRIVE); + + /** + * GVolumeMonitor::drive-stop-button: + * @volume_monitor: The volume monitor emitting the signal. + * @drive: the drive where the stop button was pressed + * + * Emitted when the stop button is pressed on @drive. + * + * Since: 2.22 + **/ + signals[DRIVE_STOP_BUTTON] = g_signal_new (I_("drive-stop-button"), + G_TYPE_VOLUME_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVolumeMonitorClass, drive_stop_button), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_DRIVE); + +} + +static void +g_volume_monitor_init (GVolumeMonitor *monitor) +{ +} + + +/** + * g_volume_monitor_get_connected_drives: + * @volume_monitor: a #GVolumeMonitor. + * + * Gets a list of drives connected to the system. + * + * The returned list should be freed with g_list_free(), after + * its elements have been unreffed with g_object_unref(). + * + * Returns: a #GList of connected #GDrive objects. + **/ +GList * +g_volume_monitor_get_connected_drives (GVolumeMonitor *volume_monitor) +{ + GVolumeMonitorClass *class; + + g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL); + + class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor); + + return class->get_connected_drives (volume_monitor); +} + +/** + * g_volume_monitor_get_volumes: + * @volume_monitor: a #GVolumeMonitor. + * + * Gets a list of the volumes on the system. + * + * The returned list should be freed with g_list_free(), after + * its elements have been unreffed with g_object_unref(). + * + * Returns: a #GList of #GVolume objects. + **/ +GList * +g_volume_monitor_get_volumes (GVolumeMonitor *volume_monitor) +{ + GVolumeMonitorClass *class; + + g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL); + + class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor); + + return class->get_volumes (volume_monitor); +} + +/** + * g_volume_monitor_get_mounts: + * @volume_monitor: a #GVolumeMonitor. + * + * Gets a list of the mounts on the system. + * + * The returned list should be freed with g_list_free(), after + * its elements have been unreffed with g_object_unref(). + * + * Returns: a #GList of #GMount objects. + **/ +GList * +g_volume_monitor_get_mounts (GVolumeMonitor *volume_monitor) +{ + GVolumeMonitorClass *class; + + g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL); + + class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor); + + return class->get_mounts (volume_monitor); +} + +/** + * g_volume_monitor_get_volume_for_uuid: + * @volume_monitor: a #GVolumeMonitor. + * @uuid: the UUID to look for + * + * Finds a #GVolume object by its UUID (see g_volume_get_uuid()) + * + * Returns: a #GVolume or %NULL if no such volume is available. + * Free the returned object with g_object_unref(). + **/ +GVolume * +g_volume_monitor_get_volume_for_uuid (GVolumeMonitor *volume_monitor, + const char *uuid) +{ + GVolumeMonitorClass *class; + + g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL); + g_return_val_if_fail (uuid != NULL, NULL); + + class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor); + + return class->get_volume_for_uuid (volume_monitor, uuid); +} + +/** + * g_volume_monitor_get_mount_for_uuid: + * @volume_monitor: a #GVolumeMonitor. + * @uuid: the UUID to look for + * + * Finds a #GMount object by its UUID (see g_mount_get_uuid()) + * + * Returns: a #GMount or %NULL if no such mount is available. + * Free the returned object with g_object_unref(). + **/ +GMount * +g_volume_monitor_get_mount_for_uuid (GVolumeMonitor *volume_monitor, + const char *uuid) +{ + GVolumeMonitorClass *class; + + g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL); + g_return_val_if_fail (uuid != NULL, NULL); + + class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor); + + return class->get_mount_for_uuid (volume_monitor, uuid); +} + + +#define __G_VOLUME_MONITOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gvolumemonitor.h b/gio/gvolumemonitor.h new file mode 100644 index 0000000..9e3bd80 --- /dev/null +++ b/gio/gvolumemonitor.h @@ -0,0 +1,151 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_VOLUME_MONITOR_H__ +#define __G_VOLUME_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_VOLUME_MONITOR (g_volume_monitor_get_type ()) +#define G_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_VOLUME_MONITOR, GVolumeMonitor)) +#define G_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_VOLUME_MONITOR, GVolumeMonitorClass)) +#define G_VOLUME_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_VOLUME_MONITOR, GVolumeMonitorClass)) +#define G_IS_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_VOLUME_MONITOR)) +#define G_IS_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_VOLUME_MONITOR)) + +/** + * G_VOLUME_MONITOR_EXTENSION_POINT_NAME: + * + * Extension point for volume monitor functionality. + * See Extending GIO. + */ +#define G_VOLUME_MONITOR_EXTENSION_POINT_NAME "gio-volume-monitor" + +/** + * GVolumeMonitor: + * @parent_instance: The parent instance. + * + * A Volume Monitor that watches for volume events. + **/ +typedef struct _GVolumeMonitorClass GVolumeMonitorClass; + +struct _GVolumeMonitor +{ + GObject parent_instance; + + /*< private >*/ + gpointer priv; +}; + +struct _GVolumeMonitorClass +{ + GObjectClass parent_class; + + /*< public >*/ + /* signals */ + void (* volume_added) (GVolumeMonitor *volume_monitor, + GVolume *volume); + void (* volume_removed) (GVolumeMonitor *volume_monitor, + GVolume *volume); + void (* volume_changed) (GVolumeMonitor *volume_monitor, + GVolume *volume); + + void (* mount_added) (GVolumeMonitor *volume_monitor, + GMount *mount); + void (* mount_removed) (GVolumeMonitor *volume_monitor, + GMount *mount); + void (* mount_pre_unmount) (GVolumeMonitor *volume_monitor, + GMount *mount); + void (* mount_changed) (GVolumeMonitor *volume_monitor, + GMount *mount); + + void (* drive_connected) (GVolumeMonitor *volume_monitor, + GDrive *drive); + void (* drive_disconnected) (GVolumeMonitor *volume_monitor, + GDrive *drive); + void (* drive_changed) (GVolumeMonitor *volume_monitor, + GDrive *drive); + + /* Vtable */ + + gboolean (* is_supported) (void); + + GList * (* get_connected_drives) (GVolumeMonitor *volume_monitor); + GList * (* get_volumes) (GVolumeMonitor *volume_monitor); + GList * (* get_mounts) (GVolumeMonitor *volume_monitor); + + GVolume * (* get_volume_for_uuid) (GVolumeMonitor *volume_monitor, + const char *uuid); + + GMount * (* get_mount_for_uuid) (GVolumeMonitor *volume_monitor, + const char *uuid); + + + /* These arguments are unfortunately backwards by mistake (bug #520169). Deprecated in 2.20. */ + GVolume * (* adopt_orphan_mount) (GMount *mount, + GVolumeMonitor *volume_monitor); + + /* signal added in 2.17 */ + void (* drive_eject_button) (GVolumeMonitor *volume_monitor, + GDrive *drive); + + /* signal added in 2.21 */ + void (* drive_stop_button) (GVolumeMonitor *volume_monitor, + GDrive *drive); + + /*< private >*/ + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); +}; + +GType g_volume_monitor_get_type (void) G_GNUC_CONST; + +GVolumeMonitor *g_volume_monitor_get (void); +GList * g_volume_monitor_get_connected_drives (GVolumeMonitor *volume_monitor); +GList * g_volume_monitor_get_volumes (GVolumeMonitor *volume_monitor); +GList * g_volume_monitor_get_mounts (GVolumeMonitor *volume_monitor); +GVolume * g_volume_monitor_get_volume_for_uuid (GVolumeMonitor *volume_monitor, + const char *uuid); +GMount * g_volume_monitor_get_mount_for_uuid (GVolumeMonitor *volume_monitor, + const char *uuid); + +#ifndef G_DISABLE_DEPRECATED +GVolume * g_volume_monitor_adopt_orphan_mount (GMount *mount); +#endif + +G_END_DECLS + +#endif /* __G_VOLUME_MONITOR_H__ */ diff --git a/gio/gwin32appinfo.c b/gio/gwin32appinfo.c new file mode 100644 index 0000000..3e669c6 --- /dev/null +++ b/gio/gwin32appinfo.c @@ -0,0 +1,669 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include + +#include "gcontenttypeprivate.h" +#include "gwin32appinfo.h" +#include "gappinfo.h" +#include "gioerror.h" +#include "gfile.h" +#include +#include "glibintl.h" + +#include +#include + +#include "gioalias.h" + +#ifndef ASSOCF_INIT_BYEXENAME +#define ASSOCF_INIT_BYEXENAME 0x00000002 +#endif + +/* These were wrong in MingW */ +#define REAL_ASSOCSTR_COMMAND 1 +#define REAL_ASSOCSTR_EXECUTABLE 2 +#define REAL_ASSOCSTR_FRIENDLYDOCNAME 3 +#define REAL_ASSOCSTR_FRIENDLYAPPNAME 4 + +#ifndef AssocQueryString +#pragma message("AssocQueryString not available with SDK used") +#endif + +static void g_win32_app_info_iface_init (GAppInfoIface *iface); + +struct _GWin32AppInfo +{ + GObject parent_instance; + wchar_t *id; + char *id_utf8; + gboolean id_is_exename; + char *executable; + char *name; + gboolean no_open_with; +}; + +G_DEFINE_TYPE_WITH_CODE (GWin32AppInfo, g_win32_app_info, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_APP_INFO, + g_win32_app_info_iface_init)) + + +static void +g_win32_app_info_finalize (GObject *object) +{ + GWin32AppInfo *info; + + info = G_WIN32_APP_INFO (object); + + g_free (info->id); + g_free (info->id_utf8); + g_free (info->name); + g_free (info->executable); + + G_OBJECT_CLASS (g_win32_app_info_parent_class)->finalize (object); +} + +static void +g_win32_app_info_class_init (GWin32AppInfoClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_win32_app_info_finalize; +} + +static void +g_win32_app_info_init (GWin32AppInfo *local) +{ +} + +static GAppInfo * +g_desktop_app_info_new_from_id (wchar_t *id /* takes ownership */, + gboolean id_is_exename) +{ +#ifdef AssocQueryString + ASSOCF flags; +#endif + wchar_t buffer[1024]; + DWORD buffer_size; + GWin32AppInfo *info; + HKEY app_key; + + info = g_object_new (G_TYPE_WIN32_APP_INFO, NULL); + info->id = id; /* Takes ownership */ + info->id_utf8 = g_utf16_to_utf8 (id, -1, NULL, NULL, NULL); + info->id_is_exename = id_is_exename; + +#ifdef AssocQueryString + flags = 0; + if (id_is_exename) + flags |= ASSOCF_INIT_BYEXENAME; + + buffer_size = 1024; + if (AssocQueryStringW(flags, + REAL_ASSOCSTR_EXECUTABLE, + id, + NULL, + buffer, + &buffer_size) == S_OK) + info->executable = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL); + + buffer_size = 1024; + if (AssocQueryStringW(flags, + REAL_ASSOCSTR_FRIENDLYAPPNAME, + id, + NULL, + buffer, + &buffer_size) == S_OK) + info->name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL); +#endif + + if (info->name == NULL) + { + /* TODO: Should look up name from executable resources */ + if (info->executable) + info->name = g_path_get_basename (info->executable); + else + info->name = g_strdup (info->id_utf8); + } + +#ifdef AssocQueryString + if (AssocQueryKeyW(flags, + ASSOCKEY_APP, + info->id, + NULL, + &app_key) == S_OK) + { + if (RegQueryValueExW (app_key, L"NoOpenWith", 0, + NULL, NULL, NULL) == ERROR_SUCCESS) + info->no_open_with = TRUE; + RegCloseKey (app_key); + } +#endif + + return G_APP_INFO (info); +} + +static wchar_t * +dup_wstring (wchar_t *str) +{ + gsize len; + for (len = 0; str[len] != 0; len++) + ; + return (wchar_t *)g_memdup (str, (len + 1) * 2); +} + +static GAppInfo * +g_win32_app_info_dup (GAppInfo *appinfo) +{ + GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); + GWin32AppInfo *new_info; + + new_info = g_object_new (G_TYPE_WIN32_APP_INFO, NULL); + + new_info->id = dup_wstring (info->id); + new_info->id_utf8 = g_strdup (info->id_utf8); + new_info->id_is_exename = info->id_is_exename; + new_info->name = g_strdup (info->name); + new_info->executable = g_strdup (info->executable); + new_info->no_open_with = info->no_open_with; + + return G_APP_INFO (new_info); +} + +static gboolean +g_win32_app_info_equal (GAppInfo *appinfo1, + GAppInfo *appinfo2) +{ + GWin32AppInfo *info1 = G_WIN32_APP_INFO (appinfo1); + GWin32AppInfo *info2 = G_WIN32_APP_INFO (appinfo2); + + if (info1->executable == NULL || + info2->executable == NULL) + return FALSE; + + return strcmp (info1->executable, info2->executable) == 0; +} + +static const char * +g_win32_app_info_get_id (GAppInfo *appinfo) +{ + GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); + + return info->id_utf8; +} + +static const char * +g_win32_app_info_get_name (GAppInfo *appinfo) +{ + GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); + + if (info->name == NULL) + return _("Unnamed"); + + return info->name; +} + +static const char * +g_win32_app_info_get_description (GAppInfo *appinfo) +{ + /* Win32 has no app descriptions */ + return NULL; +} + +static const char * +g_win32_app_info_get_executable (GAppInfo *appinfo) +{ + GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); + + return info->executable; +} + +static GIcon * +g_win32_app_info_get_icon (GAppInfo *appinfo) +{ + /* GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); */ + + /* TODO: How to handle icons */ + return NULL; +} + +static gboolean +g_win32_app_info_launch (GAppInfo *appinfo, + GList *files, + GAppLaunchContext *launch_context, + GError **error) +{ + GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); +#ifdef AssocQueryString + ASSOCF flags; +#endif + HKEY class_key; + SHELLEXECUTEINFOW exec_info = {0}; + GList *l; + + /* TODO: What might startup_id mean on win32? */ +#ifdef AssocQueryString + flags = 0; + if (info->id_is_exename) + flags |= ASSOCF_INIT_BYEXENAME; + + if (AssocQueryKeyW (flags, + ASSOCKEY_SHELLEXECCLASS, + info->id, + NULL, + &class_key) != S_OK) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Can't find application")); + return FALSE; + } +#endif + + for (l = files; l != NULL; l = l->next) + { + char *path = g_file_get_path (l->data); + wchar_t *wfilename = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); + + g_free (path); + + memset (&exec_info, 0, sizeof (exec_info)); + exec_info.cbSize = sizeof (exec_info); + exec_info.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_CLASSKEY; + exec_info.lpFile = wfilename; + exec_info.nShow = SW_SHOWNORMAL; + exec_info.hkeyClass = class_key; + + if (!ShellExecuteExW (&exec_info)) + { + char *message_utf8 = g_win32_error_message (GetLastError ()); + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Error launching application: %s"), message_utf8); + g_free (message_utf8); + + g_free (wfilename); + RegCloseKey (class_key); + return FALSE; + } + + g_free (wfilename); + } + + RegCloseKey (class_key); + + return TRUE; +} + +static gboolean +g_win32_app_info_supports_uris (GAppInfo *appinfo) +{ + return FALSE; +} + +static gboolean +g_win32_app_info_supports_files (GAppInfo *appinfo) +{ + return TRUE; +} + +static gboolean +g_win32_app_info_launch_uris (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error) +{ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("URIs not supported")); + return FALSE; +} + +static gboolean +g_win32_app_info_should_show (GAppInfo *appinfo) +{ + GWin32AppInfo *info = G_WIN32_APP_INFO (appinfo); + + if (info->no_open_with) + return FALSE; + + return TRUE; +} + +static gboolean +g_win32_app_info_set_as_default_for_type (GAppInfo *appinfo, + const char *content_type, + GError **error) +{ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("association changes not supported on win32")); + return FALSE; +} + +GAppInfo * +g_app_info_create_from_commandline (const char *commandline, + const char *application_name, + GAppInfoCreateFlags flags, + GError **error) +{ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Association creation not supported on win32")); + return NULL; +} + + +static void +g_win32_app_info_iface_init (GAppInfoIface *iface) +{ + iface->dup = g_win32_app_info_dup; + iface->equal = g_win32_app_info_equal; + iface->get_id = g_win32_app_info_get_id; + iface->get_name = g_win32_app_info_get_name; + iface->get_description = g_win32_app_info_get_description; + iface->get_executable = g_win32_app_info_get_executable; + iface->get_icon = g_win32_app_info_get_icon; + iface->launch = g_win32_app_info_launch; + iface->supports_uris = g_win32_app_info_supports_uris; + iface->supports_files = g_win32_app_info_supports_files; + iface->launch_uris = g_win32_app_info_launch_uris; + iface->should_show = g_win32_app_info_should_show; + iface->set_as_default_for_type = g_win32_app_info_set_as_default_for_type; +} + +static void +enumerate_open_with_list (HKEY dir_key, + GList **prognames) +{ + DWORD index; + wchar_t name[256]; + DWORD name_len, nbytes; + wchar_t data[256]; + wchar_t *data_alloc; + DWORD type; + + /* Must also look inside for a,b,c, + MRUList */ + index = 0; + name_len = 256; + nbytes = sizeof (data) - 2; + while (RegEnumValueW (dir_key, + index, + name, + &name_len, + 0, + &type, + (LPBYTE)data, + &nbytes) == ERROR_SUCCESS) + { + data[nbytes/2] = '\0'; + if (type == REG_SZ && + /* Ignore things like MRUList, just look at 'a', 'b', 'c', etc */ + name_len == 1) + { + data_alloc = (wchar_t *)g_memdup (data, nbytes + 2); + data_alloc[nbytes/2] = 0; + *prognames = g_list_prepend (*prognames, data_alloc); + } + index++; + name_len = 256; + nbytes = sizeof (data) - 2; + } + + index = 0; + name_len = 256; + while (RegEnumKeyExW (dir_key, + index, + name, + &name_len, + NULL, + NULL, + NULL, + NULL) == ERROR_SUCCESS) + { + *prognames = g_list_prepend (*prognames, g_memdup (name, (name_len + 1) * 2)); + index++; + name_len = 256; + } +} + +static void +enumerate_open_with_progids (HKEY dir_key, + GList **progids) +{ + DWORD index; + wchar_t name[256]; + DWORD name_len, type; + + index = 0; + name_len = 256; + while (RegEnumValueW (dir_key, + index, + name, + &name_len, + 0, + &type, + NULL, + 0) == ERROR_SUCCESS) + { + *progids = g_list_prepend (*progids, g_memdup (name, (name_len + 1) * 2)); + index++; + name_len = 256; + } +} + +static void +enumerate_open_with_root (HKEY dir_key, + GList **progids, + GList **prognames) +{ + HKEY reg_key = NULL; + + if (RegOpenKeyExW (dir_key, L"OpenWithList", 0, + KEY_READ, ®_key) == ERROR_SUCCESS) + { + enumerate_open_with_list (reg_key, prognames); + RegCloseKey (reg_key); + } + + if (RegOpenKeyExW (dir_key, L"OpenWithProgids", 0, + KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS) + { + enumerate_open_with_progids (reg_key, progids); + RegCloseKey (reg_key); + } +} + +static gboolean +app_info_in_list (GAppInfo *info, + GList *list) +{ + while (list != NULL) + { + if (g_app_info_equal (info, list->data)) + return TRUE; + list = list->next; + } + return FALSE; +} + +GList * +g_app_info_get_all_for_type (const char *content_type) +{ + GList *progids = NULL; + GList *prognames = NULL; + HKEY reg_key, sys_file_assoc_key, reg_key2; + wchar_t percieved_type[128]; + DWORD nchars, key_type; + wchar_t *wc_key; + GList *l; + GList *infos; + + wc_key = g_utf8_to_utf16 (content_type, -1, NULL, NULL, NULL); + if (RegOpenKeyExW (HKEY_CLASSES_ROOT, wc_key, 0, + KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS) + { + enumerate_open_with_root (reg_key, &progids, &prognames); + + nchars = sizeof (percieved_type) / sizeof(wchar_t); + if (RegQueryValueExW (reg_key, L"PerceivedType", 0, + &key_type, (LPBYTE) percieved_type, &nchars) == ERROR_SUCCESS) + { + if (key_type == REG_SZ && + RegOpenKeyExW (HKEY_CLASSES_ROOT, L"SystemFileAssociations", 0, + KEY_QUERY_VALUE, &sys_file_assoc_key) == ERROR_SUCCESS) + { + if (RegOpenKeyExW (sys_file_assoc_key, percieved_type, 0, + KEY_QUERY_VALUE, ®_key2) == ERROR_SUCCESS) + { + enumerate_open_with_root (reg_key2, &progids, &prognames); + RegCloseKey (reg_key2); + } + + RegCloseKey (sys_file_assoc_key); + } + } + RegCloseKey (reg_key); + } + + if (RegOpenKeyExW (HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts", 0, + KEY_QUERY_VALUE, ®_key) == ERROR_SUCCESS) + { + if (RegOpenKeyExW (reg_key, wc_key, 0, + KEY_QUERY_VALUE, ®_key2) == ERROR_SUCCESS) + { + enumerate_open_with_root (reg_key2, &progids, &prognames); + RegCloseKey (reg_key2); + } + + RegCloseKey (reg_key); + } + + infos = NULL; + for (l = prognames; l != NULL; l = l->next) + { + GAppInfo *info; + + /* l->data ownership is taken */ + info = g_desktop_app_info_new_from_id ((wchar_t *)l->data, TRUE); + if (app_info_in_list (info, infos)) + g_object_unref (info); + else + infos = g_list_prepend (infos, info); + } + g_list_free (prognames); + + for (l = progids; l != NULL; l = l->next) + { + GAppInfo *info; + + /* l->data ownership is taken */ + info = g_desktop_app_info_new_from_id ((wchar_t *)l->data, FALSE); + if (app_info_in_list (info, infos)) + g_object_unref (info); + else + infos = g_list_prepend (infos, info); + } + g_list_free (progids); + + g_free (wc_key); + return g_list_reverse (infos); +} + +GAppInfo * +g_app_info_get_default_for_type (const char *content_type, + gboolean must_support_uris) +{ + wchar_t *wtype; + wchar_t buffer[1024]; + DWORD buffer_size; + + wtype = g_utf8_to_utf16 (content_type, -1, NULL, NULL, NULL); + + /* Verify that we have some sort of app registered for this type */ +#ifdef AssocQueryString + buffer_size = 1024; + if (AssocQueryStringW (0, + REAL_ASSOCSTR_COMMAND, + wtype, + NULL, + buffer, + &buffer_size) == S_OK) + /* Takes ownership of wtype */ + return g_desktop_app_info_new_from_id (wtype, FALSE); +#endif + + g_free (wtype); + return NULL; +} + +GAppInfo * +g_app_info_get_default_for_uri_scheme (const char *uri_scheme) +{ + /* TODO: Implement */ + return NULL; +} + +GList * +g_app_info_get_all (void) +{ + DWORD index; + wchar_t name[256]; + DWORD name_len; + HKEY reg_key; + GList *infos; + GAppInfo *info; + + if (RegOpenKeyExW (HKEY_CLASSES_ROOT, L"Applications", 0, + KEY_READ, ®_key) != ERROR_SUCCESS) + return NULL; + + infos = NULL; + index = 0; + name_len = 256; + while (RegEnumKeyExW (reg_key, + index, + name, + &name_len, + NULL, + NULL, + NULL, + NULL) == ERROR_SUCCESS) + { + wchar_t *name_dup = g_memdup (name, (name_len+1)*2); + /* name_dup ownership is taken */ + info = g_desktop_app_info_new_from_id (name_dup, TRUE); + infos = g_list_prepend (infos, info); + + index++; + name_len = 256; + } + + RegCloseKey (reg_key); + + return g_list_reverse (infos); +} + +void +g_app_info_reset_type_associations (const char *content_type) +{ + /* nothing to do */ +} diff --git a/gio/gwin32appinfo.h b/gio/gwin32appinfo.h new file mode 100644 index 0000000..c07ee30 --- /dev/null +++ b/gio/gwin32appinfo.h @@ -0,0 +1,50 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#ifndef __G_WIN32_APP_INFO_H__ +#define __G_WIN32_APP_INFO_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_WIN32_APP_INFO (g_win32_app_info_get_type ()) +#define G_WIN32_APP_INFO(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WIN32_APP_INFO, GWin32AppInfo)) +#define G_WIN32_APP_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WIN32_APP_INFO, GWin32AppInfoClass)) +#define G_IS_WIN32_APP_INFO(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WIN32_APP_INFO)) +#define G_IS_WIN32_APP_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_APP_INFO)) +#define G_WIN32_APP_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WIN32_APP_INFO, GWin32AppInfoClass)) + +typedef struct _GWin32AppInfo GWin32AppInfo; +typedef struct _GWin32AppInfoClass GWin32AppInfoClass; + +struct _GWin32AppInfoClass +{ + GObjectClass parent_class; +}; + +GType g_win32_app_info_get_type (void) G_GNUC_CONST; + +G_END_DECLS + + +#endif /* __G_WIN32_APP_INFO_H__ */ diff --git a/gio/gwin32mount.c b/gio/gwin32mount.c new file mode 100644 index 0000000..d7659dc --- /dev/null +++ b/gio/gwin32mount.c @@ -0,0 +1,349 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Hans Breuer + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + * Hans Breuer + */ + +#include "config.h" + +#include +#define WIN32_MEAN_AND_LEAN +#include + +#include +#include "gwin32volumemonitor.h" +#include "gwin32mount.h" +#include "gmount.h" +#include "gfile.h" +#include "gmountprivate.h" +#include "gvolumemonitor.h" +#include "gthemedicon.h" +#include "gsimpleasyncresult.h" +#include "glibintl.h" + +#include "gioalias.h" + +struct _GWin32Mount { + GObject parent; + + GVolumeMonitor *volume_monitor; + + GWin32Volume *volume; /* owned by volume monitor */ + int drive_type; + + /* why does all this stuff need to be duplicated? It is in volume already! */ + char *name; + GIcon *icon; + char *mount_path; + + gboolean can_eject; +}; + +static void g_win32_mount_mount_iface_init (GMountIface *iface); + +#define g_win32_mount_get_type _g_win32_mount_get_type +G_DEFINE_TYPE_WITH_CODE (GWin32Mount, g_win32_mount, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_MOUNT, + g_win32_mount_mount_iface_init)) + + +static void +g_win32_mount_finalize (GObject *object) +{ + GWin32Mount *mount; + + mount = G_WIN32_MOUNT (object); + + if (mount->volume_monitor != NULL) + g_object_unref (mount->volume_monitor); +#if 0 + if (mount->volume) + _g_win32_volume_unset_mount (mount->volume, mount); +#endif + /* TODO: g_warn_if_fail (volume->volume == NULL); */ + + if (mount->icon != NULL) + g_object_unref (mount->icon); + + g_free (mount->name); + g_free (mount->mount_path); + + if (G_OBJECT_CLASS (g_win32_mount_parent_class)->finalize) + (*G_OBJECT_CLASS (g_win32_mount_parent_class)->finalize) (object); +} + +static void +g_win32_mount_class_init (GWin32MountClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_win32_mount_finalize; +} + +static void +g_win32_mount_init (GWin32Mount *win32_mount) +{ +} + +gchar * +_win32_get_displayname (const char *drive) +{ + gunichar2 *wdrive = g_utf8_to_utf16 (drive, -1, NULL, NULL, NULL); + gchar *name = NULL; + SHFILEINFOW sfi; + if (SHGetFileInfoW(wdrive, 0, &sfi, sizeof(sfi), SHGFI_DISPLAYNAME)) + name = g_utf16_to_utf8 (sfi.szDisplayName, -1, NULL, NULL, NULL); + + g_free (wdrive); + return name ? name : g_strdup (drive); +} + +/* + * _g_win32_mount_new: + * @volume_monitor: a #GVolumeMonitor. + * @path: a win32 path. + * @volume: ususally NULL + * + * Returns: a #GWin32Mount for the given win32 path. + **/ +GWin32Mount * +_g_win32_mount_new (GVolumeMonitor *volume_monitor, + const char *path, + GWin32Volume *volume) +{ + GWin32Mount *mount; + const gchar *drive = path; //fixme + +#if 0 + /* No volume for mount: Ignore internal things */ + if (volume == NULL && !g_win32_mount_guess_should_display (mount_entry)) + return NULL; +#endif + + mount = g_object_new (G_TYPE_WIN32_MOUNT, NULL); + mount->volume_monitor = volume_monitor != NULL ? g_object_ref (volume_monitor) : NULL; + mount->mount_path = g_strdup (path); + mount->drive_type = GetDriveType (drive); + mount->can_eject = FALSE; /* TODO */ + mount->name = _win32_get_displayname (drive); + + /* need to do this last */ + mount->volume = volume; +#if 0 + if (volume != NULL) + _g_win32_volume_set_mount (volume, mount); +#endif + return mount; +} + +void +_g_win32_mount_unmounted (GWin32Mount *mount) +{ + if (mount->volume != NULL) + { +#if 0 + _g_win32_volume_unset_mount (mount->volume, mount); +#endif + mount->volume = NULL; + g_signal_emit_by_name (mount, "changed"); + /* there's really no need to emit mount_changed on the volume monitor + * as we're going to be deleted.. */ + } +} + +void +_g_win32_mount_unset_volume (GWin32Mount *mount, + GWin32Volume *volume) +{ + if (mount->volume == volume) + { + mount->volume = NULL; + /* TODO: Emit changed in idle to avoid locking issues */ + g_signal_emit_by_name (mount, "changed"); + if (mount->volume_monitor != NULL) + g_signal_emit_by_name (mount->volume_monitor, "mount-changed", mount); + } +} + +static GFile * +g_win32_mount_get_root (GMount *mount) +{ + GWin32Mount *win32_mount = G_WIN32_MOUNT (mount); + + return g_file_new_for_path (win32_mount->mount_path); +} + +const char * +_win32_drive_type_to_icon (int type) +{ + switch (type) + { + case DRIVE_REMOVABLE : return "gtk-floppy"; + case DRIVE_FIXED : return "gtk-harddisk"; + case DRIVE_REMOTE : return "gtk-network"; + case DRIVE_CDROM : return "gtk-cdrom"; + default : return "gtk-directory"; + } +} + +static GIcon * +g_win32_mount_get_icon (GMount *mount) +{ + GWin32Mount *win32_mount = G_WIN32_MOUNT (mount); + + g_return_val_if_fail (win32_mount->mount_path != NULL, NULL); + + /* lazy creation */ + if (!win32_mount->icon) + { + SHFILEINFOW shfi; + wchar_t *wfn = g_utf8_to_utf16 (win32_mount->mount_path, -1, NULL, NULL, NULL); + + if (SHGetFileInfoW (wfn, 0, &shfi, sizeof (shfi), SHGFI_ICONLOCATION)) + { + gchar *name = g_utf16_to_utf8 (shfi.szDisplayName, -1, NULL, NULL, NULL); + gchar *id = g_strdup_printf ("%s,%i", name, shfi.iIcon); + win32_mount->icon = g_themed_icon_new (id); + g_free (name); + g_free (id); + } + else + { + win32_mount->icon = g_themed_icon_new_with_default_fallbacks ( + _win32_drive_type_to_icon (win32_mount->drive_type)); + } + } + + return g_object_ref (win32_mount->icon); +} + +static char * +g_win32_mount_get_uuid (GMount *mount) +{ + return NULL; +} + +static char * +g_win32_mount_get_name (GMount *mount) +{ + GWin32Mount *win32_mount = G_WIN32_MOUNT (mount); + + return g_strdup (win32_mount->name); +} + +static GDrive * +g_win32_mount_get_drive (GMount *mount) +{ + GWin32Mount *win32_mount = G_WIN32_MOUNT (mount); + + if (win32_mount->volume != NULL) + return g_volume_get_drive (G_VOLUME (win32_mount->volume)); + + return NULL; +} + +static GVolume * +g_win32_mount_get_volume (GMount *mount) +{ + GWin32Mount *win32_mount = G_WIN32_MOUNT (mount); + + if (win32_mount->volume) + return G_VOLUME (g_object_ref (win32_mount->volume)); + + return NULL; +} + +static gboolean +g_win32_mount_can_unmount (GMount *mount) +{ + return FALSE; +} + +static gboolean +g_win32_mount_can_eject (GMount *mount) +{ + GWin32Mount *win32_mount = G_WIN32_MOUNT (mount); + return win32_mount->can_eject; +} + + +typedef struct { + GWin32Mount *win32_mount; + GAsyncReadyCallback callback; + gpointer user_data; + GCancellable *cancellable; + int error_fd; + GIOChannel *error_channel; + guint error_channel_source_id; + GString *error_string; +} UnmountEjectOp; + +static void +g_win32_mount_unmount (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ +} + +static gboolean +g_win32_mount_unmount_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + return FALSE; +} + +static void +g_win32_mount_eject (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ +} + +static gboolean +g_win32_mount_eject_finish (GMount *mount, + GAsyncResult *result, + GError **error) +{ + return FALSE; +} + +static void +g_win32_mount_mount_iface_init (GMountIface *iface) +{ + iface->get_root = g_win32_mount_get_root; + iface->get_name = g_win32_mount_get_name; + iface->get_icon = g_win32_mount_get_icon; + iface->get_uuid = g_win32_mount_get_uuid; + iface->get_drive = g_win32_mount_get_drive; + iface->get_volume = g_win32_mount_get_volume; + iface->can_unmount = g_win32_mount_can_unmount; + iface->can_eject = g_win32_mount_can_eject; + iface->unmount = g_win32_mount_unmount; + iface->unmount_finish = g_win32_mount_unmount_finish; + iface->eject = g_win32_mount_eject; + iface->eject_finish = g_win32_mount_eject_finish; +} diff --git a/gio/gwin32mount.h b/gio/gwin32mount.h new file mode 100644 index 0000000..92e1f28 --- /dev/null +++ b/gio/gwin32mount.h @@ -0,0 +1,57 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Hans Breuer + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + * Hans Breuer + */ + +#ifndef __G_WIN32_MOUNT_H__ +#define __G_WIN32_MOUNT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_WIN32_MOUNT (_g_win32_mount_get_type ()) +#define G_WIN32_MOUNT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WIN32_MOUNT, GWin32Mount)) +#define G_WIN32_MOUNT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WIN32_MOUNT, GWin32MountClass)) +#define G_IS_WIN32_MOUNT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WIN32_MOUNT)) +#define G_IS_WIN32_MOUNT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_MOUNT)) + +typedef struct _GWin32MountClass GWin32MountClass; + +struct _GWin32MountClass +{ + GObjectClass parent_class; +}; + +GType _g_win32_mount_get_type (void) G_GNUC_CONST; + +GWin32Mount * _g_win32_mount_new (GVolumeMonitor *volume_monitor, + const char *path, + GWin32Volume *volume); +void _g_win32_mount_unset_volume (GWin32Mount *mount, + GWin32Volume *volume); +void _g_win32_mount_unmounted (GWin32Mount *mount); + +G_END_DECLS + +#endif /* __G_WIN32_MOUNT_H__ */ diff --git a/gio/gwin32resolver.c b/gio/gwin32resolver.c new file mode 100644 index 0000000..5198b95 --- /dev/null +++ b/gio/gwin32resolver.c @@ -0,0 +1,487 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include +#include + +#include "gwin32resolver.h" +#include "gnetworkingprivate.h" + +#include "gcancellable.h" +#include "gsimpleasyncresult.h" +#include "gsocketaddress.h" + +#include "gioalias.h" + +G_DEFINE_TYPE (GWin32Resolver, g_win32_resolver, G_TYPE_THREADED_RESOLVER) + +static void +g_win32_resolver_init (GWin32Resolver *gwr) +{ +} + +/* This is simpler than GThreadedResolver since we don't have to worry + * about multiple application-level threads, but more complicated than + * GUnixResolver, since we do have to deal with multiple threads of + * our own. + * + * The various request possibilities: + * + * 1. Synchronous: handed off to the base class (GThreadedResolver); + * since it's never possible to cancel a synchronous request in a + * single-threaded program, the request is done in the calling + * thread. + * + * 2. Asynchronous: A GWin32ResolverRequest is created with + * appropriate query-specific information, a Windows event handle, + * and a GSimpleAsyncResult. This is then handed to the + * Windows-internal thread pool, which does the raw DNS query part + * of the operation (being careful to not call any glib methods + * that might fail when called from another thread when + * g_thread_init() has not been called). The main thread sets up a + * GSource to asynchronously poll the event handle. There are two + * sub-possibilities: + * + * a. The resolution completes: the threadpool function calls + * SetEvent() on the event handle and then returns. + * + * b. The resolution is cancelled: request_cancelled() + * disconnects the "cancelled" signal handler, and queues an + * idle handler to complete the async_result. + * + * Since we can't free the request from the threadpool thread + * (because of glib locking issues), we *always* have to have it + * call SetEvent and trigger the callback to indicate that it is + * done. But this means that it's possible for the request to be + * cancelled (queuing an idle handler to return that result) and + * then have the resolution thread complete before the idle handler + * runs. So the event callback and the idle handler need to both + * watch out for this, making sure we don't complete the same + * result twice. + */ + +typedef struct GWin32ResolverRequest GWin32ResolverRequest; +typedef void (*GWin32ResolverRequestFreeFunc) (GWin32ResolverRequest *); + +struct GWin32ResolverRequest { + GWin32ResolverRequestFreeFunc free_func; + + GCancellable *cancellable; + GError *error; + + HANDLE *event; + GSimpleAsyncResult *async_result; + gboolean complete; + GSource *cancelled_idle; + + union { + struct { + gchar *name; + gint retval; + struct addrinfo *res; + } name; + + struct { + GInetAddress *iaddr; + struct sockaddr_storage addr; + gsize addrlen; + gint retval; + gchar *namebuf; + } address; + + struct { + gchar *rrname; + DNS_STATUS retval; + DNS_RECORD *results; + } service; + } u; + +}; + +static GSource *g_win32_handle_source_add (HANDLE handle, + GSourceFunc callback, + gpointer user_data); + +static gboolean request_completed (gpointer user_data); +static void request_cancelled (GCancellable *cancellable, + gpointer user_data); + +GWin32ResolverRequest * +g_win32_resolver_request_new (GResolver *resolver, + GWin32ResolverRequestFreeFunc free_func, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer tag) +{ + GWin32ResolverRequest *req; + + req = g_slice_new0 (GWin32ResolverRequest); + req->free_func = free_func; + + req->async_result = g_simple_async_result_new (G_OBJECT (resolver), callback, + user_data, tag); + g_simple_async_result_set_op_res_gpointer (req->async_result, req, NULL); + + req->event = CreateEvent (NULL, FALSE, FALSE, NULL); + g_win32_handle_source_add (req->event, request_completed, req); + + if (cancellable) + { + req->cancellable = g_object_ref (cancellable); + g_signal_connect (cancellable, "cancelled", + G_CALLBACK (request_cancelled), req); + } + + return req; +} + +static gboolean +request_completed (gpointer user_data) +{ + GWin32ResolverRequest *req = user_data; + + /* Clean up cancellation-related stuff first */ + if (req->cancelled_idle) + { + g_source_destroy (req->cancelled_idle); + g_source_unref (req->cancelled_idle); + req->cancelled_idle = NULL; + } + if (req->cancellable) + { + g_signal_handlers_disconnect_by_func (req->cancellable, request_cancelled, req); + g_object_unref (req->cancellable); + } + + /* Now complete the result (assuming it wasn't already completed) */ + if (req->async_result) + { + g_simple_async_result_complete (req->async_result); + g_object_unref (req->async_result); + } + + /* And free req */ + CloseHandle (req->event); + req->free_func (req); + g_slice_free (GWin32ResolverRequest, req); + + return FALSE; +} + +static gboolean +request_cancelled_idle (gpointer user_data) +{ + GWin32ResolverRequest *req = user_data; + GError *error = NULL; + + g_source_unref (req->cancelled_idle); + req->cancelled_idle = NULL; + + g_cancellable_set_error_if_cancelled (req->cancellable, &error); + g_simple_async_result_set_from_error (req->async_result, error); + g_simple_async_result_complete (req->async_result); + + g_object_unref (req->async_result); + req->async_result = NULL; + + /* request_completed will eventually be called to free req */ + + return FALSE; +} + +static void +request_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + GWin32ResolverRequest *req = user_data; + + if (req->cancellable) + { + g_signal_handlers_disconnect_by_func (req->cancellable, request_cancelled, req); + g_object_unref (req->cancellable); + req->cancellable = NULL; + } + + /* We need to wait until main-loop-time to actually complete the + * result; we don't use _complete_in_idle() here because we need to + * keep track of the source so we can potentially cancel it before + * it runs. + */ + req->cancelled_idle = g_idle_source_new (); + g_source_set_callback (req->cancelled_idle, + (GSourceFunc)request_cancelled_idle, req, NULL); + g_source_attach (req->cancelled_idle, g_main_context_get_thread_default ()); +} + +static DWORD WINAPI +lookup_by_name_in_thread (LPVOID data) +{ + GWin32ResolverRequest *req = data; + + req->u.name.retval = getaddrinfo (req->u.name.name, NULL, + &_g_resolver_addrinfo_hints, + &req->u.name.res); + SetEvent (req->event); + return 0; +} + +static void +free_lookup_by_name (GWin32ResolverRequest *req) +{ + g_free (req->u.name.name); + if (req->u.name.res) + freeaddrinfo (req->u.name.res); +} + +static void +lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GWin32ResolverRequest *req; + + req = g_win32_resolver_request_new (resolver, free_lookup_by_name, + cancellable, callback, user_data, + lookup_by_name_async); + req->u.name.name = g_strdup (hostname); + + QueueUserWorkItem (lookup_by_name_in_thread, req, 0); +} + +static GList * +lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GWin32ResolverRequest *req; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), lookup_by_name_async), NULL); + simple = G_SIMPLE_ASYNC_RESULT (result); + + req = g_simple_async_result_get_op_res_gpointer (simple); + return _g_resolver_addresses_from_addrinfo (req->u.name.name, req->u.name.res, + req->u.name.retval, error); +} + + +static DWORD WINAPI +lookup_by_addresses_in_thread (LPVOID data) +{ + GWin32ResolverRequest *req = data; + + req->u.address.retval = + getnameinfo ((struct sockaddr *)&req->u.address.addr, + req->u.address.addrlen, + req->u.address.namebuf, NI_MAXHOST, NULL, 0, NI_NAMEREQD); + SetEvent (req->event); + return 0; +} + +static void +free_lookup_by_address (GWin32ResolverRequest *req) +{ + g_object_unref (req->u.address.iaddr); + g_free (req->u.address.namebuf); +} + +static void +lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GWin32ResolverRequest *req; + + req = g_win32_resolver_request_new (resolver, free_lookup_by_address, + cancellable, callback, user_data, + lookup_by_address_async); + + req->u.address.iaddr = g_object_ref (address); + _g_resolver_address_to_sockaddr (address, &req->u.address.addr, + &req->u.address.addrlen); + req->u.address.namebuf = g_malloc (NI_MAXHOST); + + QueueUserWorkItem (lookup_by_addresses_in_thread, req, 0); +} + +static char * +lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GWin32ResolverRequest *req; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), lookup_by_address_async), NULL); + simple = G_SIMPLE_ASYNC_RESULT (result); + + req = g_simple_async_result_get_op_res_gpointer (simple); + return _g_resolver_name_from_nameinfo (req->u.address.iaddr, + req->u.address.namebuf, + req->u.address.retval, error); +} + + +static DWORD WINAPI +lookup_service_in_thread (LPVOID data) +{ + GWin32ResolverRequest *req = data; + + req->u.service.retval = + DnsQuery_A (req->u.service.rrname, DNS_TYPE_SRV, DNS_QUERY_STANDARD, + NULL, &req->u.service.results, NULL); + SetEvent (req->event); + return 0; +} + +static void +free_lookup_service (GWin32ResolverRequest *req) +{ + g_free (req->u.service.rrname); + if (req->u.service.results) + DnsRecordListFree (req->u.service.results, DnsFreeRecordList); +} + +static void +lookup_service_async (GResolver *resolver, + const char *rrname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GWin32ResolverRequest *req; + + req = g_win32_resolver_request_new (resolver, free_lookup_service, + cancellable, callback, user_data, + lookup_service_async); + req->u.service.rrname = g_strdup (rrname); + + QueueUserWorkItem (lookup_service_in_thread, req, 0); +} + +static GList * +lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple; + GWin32ResolverRequest *req; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (resolver), lookup_service_async), NULL); + simple = G_SIMPLE_ASYNC_RESULT (result); + + req = g_simple_async_result_get_op_res_gpointer (simple); + return _g_resolver_targets_from_DnsQuery (req->u.service.rrname, + req->u.service.retval, + req->u.service.results, error); +} + + +static void +g_win32_resolver_class_init (GWin32ResolverClass *win32_class) +{ + GResolverClass *resolver_class = G_RESOLVER_CLASS (win32_class); + + resolver_class->lookup_by_name_async = lookup_by_name_async; + resolver_class->lookup_by_name_finish = lookup_by_name_finish; + resolver_class->lookup_by_address_async = lookup_by_address_async; + resolver_class->lookup_by_address_finish = lookup_by_address_finish; + resolver_class->lookup_service_async = lookup_service_async; + resolver_class->lookup_service_finish = lookup_service_finish; +} + + +/* Windows HANDLE GSource */ + +typedef struct { + GSource source; + GPollFD pollfd; +} GWin32HandleSource; + +static gboolean +g_win32_handle_source_prepare (GSource *source, + gint *timeout) +{ + *timeout = -1; + return FALSE; +} + +static gboolean +g_win32_handle_source_check (GSource *source) +{ + GWin32HandleSource *hsource = (GWin32HandleSource *)source; + + return hsource->pollfd.revents; +} + +static gboolean +g_win32_handle_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + return (*callback) (user_data); +} + +static void +g_win32_handle_source_finalize (GSource *source) +{ + ; +} + +GSourceFuncs g_win32_handle_source_funcs = { + g_win32_handle_source_prepare, + g_win32_handle_source_check, + g_win32_handle_source_dispatch, + g_win32_handle_source_finalize +}; + +static GSource * +g_win32_handle_source_add (HANDLE handle, + GSourceFunc callback, + gpointer user_data) +{ + GWin32HandleSource *hsource; + GSource *source; + + source = g_source_new (&g_win32_handle_source_funcs, sizeof (GWin32HandleSource)); + hsource = (GWin32HandleSource *)source; + hsource->pollfd.fd = (gint)handle; + hsource->pollfd.events = G_IO_IN; + hsource->pollfd.revents = 0; + g_source_add_poll (source, &hsource->pollfd); + + g_source_set_callback (source, callback, user_data, NULL); + g_source_attach (source, g_main_context_get_thread_default ()); + return source; +} + +#define __G_WIN32_RESOLVER_C__ +#include "gioaliasdef.c" diff --git a/gio/gwin32resolver.h b/gio/gwin32resolver.h new file mode 100644 index 0000000..5cc6a2c --- /dev/null +++ b/gio/gwin32resolver.h @@ -0,0 +1,49 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_WIN32_RESOLVER_H__ +#define __G_WIN32_RESOLVER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_WIN32_RESOLVER (g_win32_resolver_get_type ()) +#define G_WIN32_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WIN32_RESOLVER, GWin32Resolver)) +#define G_WIN32_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WIN32_RESOLVER, GWin32ResolverClass)) +#define G_IS_WIN32_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WIN32_RESOLVER)) +#define G_IS_WIN32_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_RESOLVER)) +#define G_WIN32_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WIN32_RESOLVER, GWin32ResolverClass)) + +typedef struct { + GThreadedResolver parent_instance; + +} GWin32Resolver; + +typedef struct { + GThreadedResolverClass parent_class; + +} GWin32ResolverClass; + +GType g_win32_resolver_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_RESOLVER_H__ */ diff --git a/gio/gwin32volumemonitor.c b/gio/gwin32volumemonitor.c new file mode 100644 index 0000000..88cdece --- /dev/null +++ b/gio/gwin32volumemonitor.c @@ -0,0 +1,286 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Hans Breuer + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + * Hans Breuer + */ + +#include "config.h" + +#include + +#include +#include "glibintl.h" + +#include "gwin32volumemonitor.h" +#include "gwin32mount.h" +#include "gmount.h" +#include "giomodule.h" +#include "gioalias.h" + +#define _WIN32_WINNT 0x0500 +#include + +struct _GWin32VolumeMonitor { + GNativeVolumeMonitor parent; + + GList *volumes; + GList *mounts; +}; + +#define g_win32_volume_monitor_get_type _g_win32_volume_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GWin32VolumeMonitor, g_win32_volume_monitor, G_TYPE_NATIVE_VOLUME_MONITOR, + g_io_extension_point_implement (G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "win32", + 0)); + +static void +g_win32_volume_monitor_finalize (GObject *object) +{ + GWin32VolumeMonitor *monitor; + + monitor = G_WIN32_VOLUME_MONITOR (object); + + if (G_OBJECT_CLASS (g_win32_volume_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_win32_volume_monitor_parent_class)->finalize) (object); +} + +/* + * get_viewable_logical_drives: + * + * Returns the list of logical and viewable drives as defined by + * GetLogicalDrives() and the registry keys + * Software\Microsoft\Windows\CurrentVersion\Policies\Explorer under + * HKLM or HKCU. If neither key exists the result of + * GetLogicalDrives() is returned. + * + * Return value: bitmask with same meaning as returned by GetLogicalDrives() + */ +static guint32 +get_viewable_logical_drives (void) +{ + guint viewable_drives = GetLogicalDrives (); + HKEY key; + + DWORD var_type = REG_DWORD; //the value's a REG_DWORD type + DWORD no_drives_size = 4; + DWORD no_drives; + gboolean hklm_present = FALSE; + + if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, + "Software\\Microsoft\\Windows\\" + "CurrentVersion\\Policies\\Explorer", + 0, KEY_READ, &key) == ERROR_SUCCESS) + { + if (RegQueryValueEx (key, "NoDrives", NULL, &var_type, + (LPBYTE) &no_drives, &no_drives_size) == ERROR_SUCCESS) + { + /* We need the bits that are set in viewable_drives, and + * unset in no_drives. + */ + viewable_drives = viewable_drives & ~no_drives; + hklm_present = TRUE; + } + RegCloseKey (key); + } + + /* If the key is present in HKLM then the one in HKCU should be ignored */ + if (!hklm_present) + { + if (RegOpenKeyEx (HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\" + "CurrentVersion\\Policies\\Explorer", + 0, KEY_READ, &key) == ERROR_SUCCESS) + { + if (RegQueryValueEx (key, "NoDrives", NULL, &var_type, + (LPBYTE) &no_drives, &no_drives_size) == ERROR_SUCCESS) + { + viewable_drives = viewable_drives & ~no_drives; + } + RegCloseKey (key); + } + } + + return viewable_drives; +} + +/* deliver accesible (aka 'mounted') volumes */ +static GList * +get_mounts (GVolumeMonitor *volume_monitor) +{ + GWin32VolumeMonitor *monitor; + DWORD drives; + gchar drive[4] = "A:\\"; + GList *list = NULL; + + monitor = G_WIN32_VOLUME_MONITOR (volume_monitor); + + drives = get_viewable_logical_drives (); + + if (!drives) + g_warning ("get_viewable_logical_drives failed."); + + while (drives && drive[0] <= 'Z') + { + if (drives & 1) + { + list = g_list_prepend (list, _g_win32_mount_new (volume_monitor, drive, NULL)); + } + drives >>= 1; + drive[0]++; + } + return list; +} + +/* actually 'mounting' volumes is out of GIOs business on win32, so no volumes are delivered either */ +static GList * +get_volumes (GVolumeMonitor *volume_monitor) +{ + GWin32VolumeMonitor *monitor; + GList *l = NULL; + + monitor = G_WIN32_VOLUME_MONITOR (volume_monitor); + + return l; +} + +/* real hardware */ +static GList * +get_connected_drives (GVolumeMonitor *volume_monitor) +{ + GWin32VolumeMonitor *monitor; + HANDLE find_handle; + BOOL found; + wchar_t wc_name[MAX_PATH+1]; + GList *list = NULL; + + monitor = G_WIN32_VOLUME_MONITOR (volume_monitor); + +#if 0 + find_handle = FindFirstVolumeW (wc_name, MAX_PATH); + found = (find_handle != INVALID_HANDLE_VALUE); + while (found) + { + /* I don't know what this code is supposed to do; clearly it now + * does nothing, the returned GList is always NULL. But what was + * this code supposed to be a start of? The volume names that + * the FindFirstVolume/FindNextVolume loop iterates over returns + * device names like + * + * \Device\HarddiskVolume1 + * \Device\HarddiskVolume2 + * \Device\CdRom0 + * + * No DOS devices there, so I don't see the point with the + * QueryDosDevice call below. Probably this code is confusing volumes + * with something else that does contain the mapping from DOS devices + * to volumes. + */ + wchar_t wc_dev_name[MAX_PATH+1]; + guint trailing = wcslen (wc_name) - 1; + + /* remove trailing backslash and leading \\?\\ */ + wc_name[trailing] = L'\0'; + if (QueryDosDeviceW (&wc_name[4], wc_dev_name, MAX_PATH)) + { + gchar *name = g_utf16_to_utf8 (wc_dev_name, -1, NULL, NULL, NULL); + g_print ("%s\n", name); + g_free (name); + } + + found = FindNextVolumeW (find_handle, wc_name, MAX_PATH); + } + if (find_handle != INVALID_HANDLE_VALUE) + FindVolumeClose (find_handle); +#endif + + return list; +} + +static GVolume * +get_volume_for_uuid (GVolumeMonitor *volume_monitor, const char *uuid) +{ + return NULL; +} + +static GMount * +get_mount_for_uuid (GVolumeMonitor *volume_monitor, const char *uuid) +{ + return NULL; +} + +static gboolean +is_supported (void) +{ + return TRUE; +} + +static GMount * +get_mount_for_mount_path (const char *mount_path, + GCancellable *cancellable) +{ + GWin32Mount *mount; + + /* TODO: Set mountable volume? */ + mount = _g_win32_mount_new (NULL, mount_path, NULL); + + return G_MOUNT (mount); +} + +static void +g_win32_volume_monitor_class_init (GWin32VolumeMonitorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GVolumeMonitorClass *monitor_class = G_VOLUME_MONITOR_CLASS (klass); + GNativeVolumeMonitorClass *native_class = G_NATIVE_VOLUME_MONITOR_CLASS (klass); + + gobject_class->finalize = g_win32_volume_monitor_finalize; + + monitor_class->get_mounts = get_mounts; + monitor_class->get_volumes = get_volumes; + monitor_class->get_connected_drives = get_connected_drives; + monitor_class->get_volume_for_uuid = get_volume_for_uuid; + monitor_class->get_mount_for_uuid = get_mount_for_uuid; + monitor_class->is_supported = is_supported; + + native_class->get_mount_for_mount_path = get_mount_for_mount_path; +} + +static void +g_win32_volume_monitor_init (GWin32VolumeMonitor *win32_monitor) +{ + /* maybe we shoud setup a callback window to listern for WM_DEVICECHANGE ? */ +#if 0 + unix_monitor->mount_monitor = g_win32_mount_monitor_new (); + + g_signal_connect (win32_monitor->mount_monitor, + "mounts-changed", G_CALLBACK (mounts_changed), + win32_monitor); + + g_signal_connect (win32_monitor->mount_monitor, + "mountpoints-changed", G_CALLBACK (mountpoints_changed), + win32_monitor); + + update_volumes (win32_monitor); + update_mounts (win32_monitor); +#endif +} diff --git a/gio/gwin32volumemonitor.h b/gio/gwin32volumemonitor.h new file mode 100644 index 0000000..e3aab73 --- /dev/null +++ b/gio/gwin32volumemonitor.h @@ -0,0 +1,65 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Hans Breuer + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * David Zeuthen + * Hans Breuer + */ + +#ifndef __G_WIN32_VOLUME_MONITOR_H__ +#define __G_WIN32_VOLUME_MONITOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_WIN32_VOLUME_MONITOR (_g_win32_volume_monitor_get_type ()) +#define G_WIN32_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WIN32_VOLUME_MONITOR, GWin32VolumeMonitor)) +#define G_WIN32_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WIN32_VOLUME_MONITOR, GWin32VolumeMonitorClass)) +#define G_IS_WIN32_VOLUME_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WIN32_VOLUME_MONITOR)) +#define G_IS_WIN32_VOLUME_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_VOLUME_MONITOR)) + +typedef struct _GWin32VolumeMonitor GWin32VolumeMonitor; +typedef struct _GWin32VolumeMonitorClass GWin32VolumeMonitorClass; + +/* Forward definitions */ + +/** + * GWin32Mount: + * + * Implementation of the #GMount interface for Win32 systems. + */ +typedef struct _GWin32Mount GWin32Mount; +typedef struct _GWin32Volume GWin32Volume; + +struct _GWin32VolumeMonitorClass +{ + GNativeVolumeMonitorClass parent_class; +}; + +GType _g_win32_volume_monitor_get_type (void) G_GNUC_CONST; + +GVolumeMonitor * _g_win32_volume_monitor_new (void); +GWin32Volume * _g_win32_volume_monitor_lookup_volume_for_mount_path (GWin32VolumeMonitor *monitor, + const char *mount_path); + +G_END_DECLS + +#endif /* __G_WIN32_VOLUME_MONITOR_H__ */ diff --git a/gio/gzlibcompressor.c b/gio/gzlibcompressor.c new file mode 100644 index 0000000..fa657fa --- /dev/null +++ b/gio/gzlibcompressor.c @@ -0,0 +1,324 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include + +#include "gzlibcompressor.h" +#include "glib.h" +#include "gioerror.h" +#include "glibintl.h" +#include "gioenums.h" +#include "gioenumtypes.h" + +#include "gioalias.h" + +enum { + PROP_0, + PROP_FORMAT, + PROP_LEVEL +}; + +/** + * SECTION:gzcompressor + * @short_description: Zlib compressor + * @include: gio/gio.h + * + * #GZlibCompressor is an implementation of #GConverter that + * compresses data using zlib. + */ + +static void g_zlib_compressor_iface_init (GConverterIface *iface); + +/** + * GZlibCompressor: + * + * Zlib decompression + */ +struct _GZlibCompressor +{ + GObject parent_instance; + + GZlibCompressorFormat format; + int level; + z_stream zstream; +}; + +G_DEFINE_TYPE_WITH_CODE (GZlibCompressor, g_zlib_compressor, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, + g_zlib_compressor_iface_init)) + +static void +g_zlib_compressor_finalize (GObject *object) +{ + GZlibCompressor *compressor; + + compressor = G_ZLIB_COMPRESSOR (object); + + deflateEnd (&compressor->zstream); + + G_OBJECT_CLASS (g_zlib_compressor_parent_class)->finalize (object); +} + + +static void +g_zlib_compressor_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GZlibCompressor *compressor; + + compressor = G_ZLIB_COMPRESSOR (object); + + switch (prop_id) + { + case PROP_FORMAT: + compressor->format = g_value_get_enum (value); + break; + + case PROP_LEVEL: + compressor->level = g_value_get_int (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_zlib_compressor_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GZlibCompressor *compressor; + + compressor = G_ZLIB_COMPRESSOR (object); + + switch (prop_id) + { + case PROP_FORMAT: + g_value_set_enum (value, compressor->format); + break; + + case PROP_LEVEL: + g_value_set_int (value, compressor->level); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_zlib_compressor_init (GZlibCompressor *compressor) +{ +} + +static void +g_zlib_compressor_constructed (GObject *object) +{ + GZlibCompressor *compressor; + int res; + + compressor = G_ZLIB_COMPRESSOR (object); + + if (compressor->format == G_ZLIB_COMPRESSOR_FORMAT_GZIP) + { + /* + 16 for gzip */ + res = deflateInit2 (&compressor->zstream, + compressor->level, Z_DEFLATED, + MAX_WBITS + 16, 8, + Z_DEFAULT_STRATEGY); + } + else if (compressor->format == G_ZLIB_COMPRESSOR_FORMAT_RAW) + { + /* negative wbits for raw */ + res = deflateInit2 (&compressor->zstream, + compressor->level, Z_DEFLATED, + -MAX_WBITS, 8, + Z_DEFAULT_STRATEGY); + } + else /* ZLIB */ + res = deflateInit (&compressor->zstream, compressor->level); + + if (res == Z_MEM_ERROR ) + g_error ("GZlibCompressor: Not enough memory for zlib use"); + + if (res != Z_OK) + g_warning ("unexpected zlib error: %s\n", compressor->zstream.msg); +} + +static void +g_zlib_compressor_class_init (GZlibCompressorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_zlib_compressor_finalize; + gobject_class->constructed = g_zlib_compressor_constructed; + gobject_class->get_property = g_zlib_compressor_get_property; + gobject_class->set_property = g_zlib_compressor_set_property; + + g_object_class_install_property (gobject_class, + PROP_FORMAT, + g_param_spec_enum ("format", + P_("compression format"), + P_("The format of the compressed data"), + G_TYPE_ZLIB_COMPRESSOR_FORMAT, + G_ZLIB_COMPRESSOR_FORMAT_ZLIB, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, + PROP_LEVEL, + g_param_spec_int ("level", + P_("compression level"), + P_("The level of compression from 0 (no compression) to 9 (most compression), -1 for the default level"), + -1, 9, + -1, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_zlib_compressor_new: + * @format: The format to use for the compressed data + * @level: compression level (0-9), -1 for default + * + * Creates a new #GZlibCompressor. + * + * Returns: a new #GZlibCompressor + * + * Since: 2.24 + **/ +GZlibCompressor * +g_zlib_compressor_new (GZlibCompressorFormat format, + int level) +{ + GZlibCompressor *compressor; + + compressor = g_object_new (G_TYPE_ZLIB_COMPRESSOR, + "format", format, + "level", level, + NULL); + + return compressor; +} + +static void +g_zlib_compressor_reset (GConverter *converter) +{ + GZlibCompressor *compressor = G_ZLIB_COMPRESSOR (converter); + int res; + + res = deflateReset (&compressor->zstream); + if (res != Z_OK) + g_warning ("unexpected zlib error: %s\n", compressor->zstream.msg); +} + +static GConverterResult +g_zlib_compressor_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + GZlibCompressor *compressor; + int res; + int flush; + + compressor = G_ZLIB_COMPRESSOR (converter); + + compressor->zstream.next_in = (void *)inbuf; + compressor->zstream.avail_in = inbuf_size; + + compressor->zstream.next_out = outbuf; + compressor->zstream.avail_out = outbuf_size; + + flush = Z_NO_FLUSH; + if (flags & G_CONVERTER_INPUT_AT_END) + flush = Z_FINISH; + else if (flags & G_CONVERTER_FLUSH) + flush = Z_SYNC_FLUSH; + + res = deflate (&compressor->zstream, flush); + + if (res == Z_MEM_ERROR) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Not enough memory")); + return G_CONVERTER_ERROR; + } + + if (res == Z_STREAM_ERROR) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Internal error: %s"), compressor->zstream.msg); + return G_CONVERTER_ERROR; + } + + if (res == Z_BUF_ERROR) + { + if (flags & G_CONVERTER_FLUSH) + return G_CONVERTER_FLUSHED; + + /* We do have output space, so this should only happen if we + have no input but need some */ + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT, + _("Need more input")); + return G_CONVERTER_ERROR; + } + + if (res == Z_OK || res == Z_STREAM_END) + { + *bytes_read = inbuf_size - compressor->zstream.avail_in; + *bytes_written = outbuf_size - compressor->zstream.avail_out; + + if (res == Z_STREAM_END) + return G_CONVERTER_FINISHED; + return G_CONVERTER_CONVERTED; + } + + g_assert_not_reached (); +} + +static void +g_zlib_compressor_iface_init (GConverterIface *iface) +{ + iface->convert = g_zlib_compressor_convert; + iface->reset = g_zlib_compressor_reset; +} + +#define __G_ZLIB_COMPRESSOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gzlibcompressor.h b/gio/gzlibcompressor.h new file mode 100644 index 0000000..0e14a80 --- /dev/null +++ b/gio/gzlibcompressor.h @@ -0,0 +1,55 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ZLIB_COMPRESSOR_H__ +#define __G_ZLIB_COMPRESSOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_ZLIB_COMPRESSOR (g_zlib_compressor_get_type ()) +#define G_ZLIB_COMPRESSOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_ZLIB_COMPRESSOR, GZlibCompressor)) +#define G_ZLIB_COMPRESSOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_ZLIB_COMPRESSOR, GZlibCompressorClass)) +#define G_IS_ZLIB_COMPRESSOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_ZLIB_COMPRESSOR)) +#define G_IS_ZLIB_COMPRESSOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_ZLIB_COMPRESSOR)) +#define G_ZLIB_COMPRESSOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_ZLIB_COMPRESSOR, GZlibCompressorClass)) + +typedef struct _GZlibCompressorClass GZlibCompressorClass; + +struct _GZlibCompressorClass +{ + GObjectClass parent_class; +}; + +GType g_zlib_compressor_get_type (void) G_GNUC_CONST; + +GZlibCompressor *g_zlib_compressor_new (GZlibCompressorFormat format, + int level); + +G_END_DECLS + +#endif /* __G_ZLIB_COMPRESSOR_H__ */ diff --git a/gio/gzlibdecompressor.c b/gio/gzlibdecompressor.c new file mode 100644 index 0000000..439ac7c --- /dev/null +++ b/gio/gzlibdecompressor.c @@ -0,0 +1,296 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include + +#include "gzlibdecompressor.h" +#include "glib.h" +#include "gioerror.h" +#include "glibintl.h" +#include "gioenums.h" +#include "gioenumtypes.h" + +#include "gioalias.h" + +enum { + PROP_0, + PROP_FORMAT +}; + +/** + * SECTION:gzdecompressor + * @short_description: Zlib decompressor + * @include: gio/gio.h + * + * #GZlibDecompressor is an implementation of #GConverter that + * decompresses data compressed with zlib. + */ + +static void g_zlib_decompressor_iface_init (GConverterIface *iface); + +/** + * GZlibDecompressor: + * + * Zlib decompression + */ +struct _GZlibDecompressor +{ + GObject parent_instance; + + GZlibCompressorFormat format; + z_stream zstream; +}; + +G_DEFINE_TYPE_WITH_CODE (GZlibDecompressor, g_zlib_decompressor, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, + g_zlib_decompressor_iface_init)) + +static void +g_zlib_decompressor_finalize (GObject *object) +{ + GZlibDecompressor *decompressor; + + decompressor = G_ZLIB_DECOMPRESSOR (object); + + inflateEnd (&decompressor->zstream); + + G_OBJECT_CLASS (g_zlib_decompressor_parent_class)->finalize (object); +} + + +static void +g_zlib_decompressor_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GZlibDecompressor *decompressor; + + decompressor = G_ZLIB_DECOMPRESSOR (object); + + switch (prop_id) + { + case PROP_FORMAT: + decompressor->format = g_value_get_enum (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_zlib_decompressor_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GZlibDecompressor *decompressor; + + decompressor = G_ZLIB_DECOMPRESSOR (object); + + switch (prop_id) + { + case PROP_FORMAT: + g_value_set_enum (value, decompressor->format); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_zlib_decompressor_init (GZlibDecompressor *decompressor) +{ +} + +static void +g_zlib_decompressor_constructed (GObject *object) +{ + GZlibDecompressor *decompressor; + int res; + + decompressor = G_ZLIB_DECOMPRESSOR (object); + + if (decompressor->format == G_ZLIB_COMPRESSOR_FORMAT_GZIP) + { + /* + 16 for gzip */ + res = inflateInit2 (&decompressor->zstream, MAX_WBITS + 16); + } + else if (decompressor->format == G_ZLIB_COMPRESSOR_FORMAT_RAW) + { + /* Negative for gzip */ + res = inflateInit2 (&decompressor->zstream, -MAX_WBITS); + } + else /* ZLIB */ + res = inflateInit (&decompressor->zstream); + + if (res == Z_MEM_ERROR ) + g_error ("GZlibDecompressor: Not enough memory for zlib use"); + + if (res != Z_OK) + g_warning ("unexpected zlib error: %s\n", decompressor->zstream.msg); +} + +static void +g_zlib_decompressor_class_init (GZlibDecompressorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_zlib_decompressor_finalize; + gobject_class->constructed = g_zlib_decompressor_constructed; + gobject_class->get_property = g_zlib_decompressor_get_property; + gobject_class->set_property = g_zlib_decompressor_set_property; + + g_object_class_install_property (gobject_class, + PROP_FORMAT, + g_param_spec_enum ("format", + P_("compression format"), + P_("The format of the compressed data"), + G_TYPE_ZLIB_COMPRESSOR_FORMAT, + G_ZLIB_COMPRESSOR_FORMAT_ZLIB, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_zlib_decompressor_new: + * @format: The format to use for the compressed data + * + * Creates a new #GZlibDecompressor. + * + * Returns: a new #GZlibDecompressor + * + * Since: 2.24 + **/ +GZlibDecompressor * +g_zlib_decompressor_new (GZlibCompressorFormat format) +{ + GZlibDecompressor *decompressor; + + decompressor = g_object_new (G_TYPE_ZLIB_DECOMPRESSOR, + "format", format, + NULL); + + return decompressor; +} + +static void +g_zlib_decompressor_reset (GConverter *converter) +{ + GZlibDecompressor *decompressor = G_ZLIB_DECOMPRESSOR (converter); + int res; + + res = inflateReset (&decompressor->zstream); + if (res != Z_OK) + g_warning ("unexpected zlib error: %s\n", decompressor->zstream.msg); +} + +static GConverterResult +g_zlib_decompressor_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + GZlibDecompressor *decompressor; + int res; + + decompressor = G_ZLIB_DECOMPRESSOR (converter); + + decompressor->zstream.next_in = (void *)inbuf; + decompressor->zstream.avail_in = inbuf_size; + + decompressor->zstream.next_out = outbuf; + decompressor->zstream.avail_out = outbuf_size; + + res = inflate (&decompressor->zstream, Z_NO_FLUSH); + + if (res == Z_DATA_ERROR || res == Z_NEED_DICT) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, + _("Invalid compressed data")); + return G_CONVERTER_ERROR; + } + + if (res == Z_MEM_ERROR) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Not enough memory")); + return G_CONVERTER_ERROR; + } + + if (res == Z_STREAM_ERROR) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Internal error: %s"), decompressor->zstream.msg); + return G_CONVERTER_ERROR; + } + + if (res == Z_BUF_ERROR) + { + if (flags & G_CONVERTER_FLUSH) + return G_CONVERTER_FLUSHED; + + /* Z_FINISH not set, so this means no progress could be made */ + /* We do have output space, so this should only happen if we + have no input but need some */ + + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT, + _("Need more input")); + return G_CONVERTER_ERROR; + } + + if (res == Z_OK || res == Z_STREAM_END) + { + *bytes_read = inbuf_size - decompressor->zstream.avail_in; + *bytes_written = outbuf_size - decompressor->zstream.avail_out; + + if (res == Z_STREAM_END) + return G_CONVERTER_FINISHED; + return G_CONVERTER_CONVERTED; + } + + g_assert_not_reached (); +} + +static void +g_zlib_decompressor_iface_init (GConverterIface *iface) +{ + iface->convert = g_zlib_decompressor_convert; + iface->reset = g_zlib_decompressor_reset; +} + +#define __G_ZLIB_DECOMPRESSOR_C__ +#include "gioaliasdef.c" diff --git a/gio/gzlibdecompressor.h b/gio/gzlibdecompressor.h new file mode 100644 index 0000000..fa334c2 --- /dev/null +++ b/gio/gzlibdecompressor.h @@ -0,0 +1,54 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ZLIB_DECOMPRESSOR_H__ +#define __G_ZLIB_DECOMPRESSOR_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_ZLIB_DECOMPRESSOR (g_zlib_decompressor_get_type ()) +#define G_ZLIB_DECOMPRESSOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_ZLIB_DECOMPRESSOR, GZlibDecompressor)) +#define G_ZLIB_DECOMPRESSOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_ZLIB_DECOMPRESSOR, GZlibDecompressorClass)) +#define G_IS_ZLIB_DECOMPRESSOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_ZLIB_DECOMPRESSOR)) +#define G_IS_ZLIB_DECOMPRESSOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_ZLIB_DECOMPRESSOR)) +#define G_ZLIB_DECOMPRESSOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_ZLIB_DECOMPRESSOR, GZlibDecompressorClass)) + +typedef struct _GZlibDecompressorClass GZlibDecompressorClass; + +struct _GZlibDecompressorClass +{ + GObjectClass parent_class; +}; + +GType g_zlib_decompressor_get_type (void) G_GNUC_CONST; + +GZlibDecompressor *g_zlib_decompressor_new (GZlibCompressorFormat format); + +G_END_DECLS + +#endif /* __G_ZLIB_DECOMPRESSOR_H__ */ diff --git a/gio/inotify/Makefile.am b/gio/inotify/Makefile.am new file mode 100644 index 0000000..725936b --- /dev/null +++ b/gio/inotify/Makefile.am @@ -0,0 +1,37 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +noinst_LTLIBRARIES = libinotify.la + +libinotify_la_SOURCES = \ + inotify-kernel.c \ + inotify-sub.c \ + inotify-path.c \ + inotify-missing.c \ + inotify-helper.c \ + inotify-diag.c \ + inotify-diag.h \ + inotify-kernel.h \ + inotify-missing.h \ + inotify-path.h \ + inotify-sub.h \ + inotify-helper.h \ + ginotifyfilemonitor.c \ + ginotifyfilemonitor.h \ + ginotifydirectorymonitor.c \ + ginotifydirectorymonitor.h \ + $(NULL) + +libinotify_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + -I$(top_builddir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + diff --git a/gio/inotify/Makefile.in b/gio/inotify/Makefile.in new file mode 100644 index 0000000..b933a9b --- /dev/null +++ b/gio/inotify/Makefile.in @@ -0,0 +1,762 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = gio/inotify +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libinotify_la_LIBADD = +am__objects_1 = +am_libinotify_la_OBJECTS = libinotify_la-inotify-kernel.lo \ + libinotify_la-inotify-sub.lo libinotify_la-inotify-path.lo \ + libinotify_la-inotify-missing.lo \ + libinotify_la-inotify-helper.lo libinotify_la-inotify-diag.lo \ + libinotify_la-ginotifyfilemonitor.lo \ + libinotify_la-ginotifydirectorymonitor.lo $(am__objects_1) +libinotify_la_OBJECTS = $(am_libinotify_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libinotify_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libinotify_la_CFLAGS) \ + $(CFLAGS) $(AM_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libinotify_la_SOURCES) +DIST_SOURCES = $(libinotify_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +NULL = +noinst_LTLIBRARIES = libinotify.la +libinotify_la_SOURCES = \ + inotify-kernel.c \ + inotify-sub.c \ + inotify-path.c \ + inotify-missing.c \ + inotify-helper.c \ + inotify-diag.c \ + inotify-diag.h \ + inotify-kernel.h \ + inotify-missing.h \ + inotify-path.h \ + inotify-sub.h \ + inotify-helper.h \ + ginotifyfilemonitor.c \ + ginotifyfilemonitor.h \ + ginotifydirectorymonitor.c \ + ginotifydirectorymonitor.h \ + $(NULL) + +libinotify_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + -I$(top_builddir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/inotify/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/inotify/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 +libinotify.la: $(libinotify_la_OBJECTS) $(libinotify_la_DEPENDENCIES) + $(AM_V_CCLD)$(libinotify_la_LINK) $(libinotify_la_OBJECTS) $(libinotify_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-ginotifydirectorymonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-ginotifyfilemonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-inotify-diag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-inotify-helper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-inotify-kernel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-inotify-missing.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-inotify-path.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinotify_la-inotify-sub.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 $@ $< + +libinotify_la-inotify-kernel.lo: inotify-kernel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-inotify-kernel.lo -MD -MP -MF $(DEPDIR)/libinotify_la-inotify-kernel.Tpo -c -o libinotify_la-inotify-kernel.lo `test -f 'inotify-kernel.c' || echo '$(srcdir)/'`inotify-kernel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-inotify-kernel.Tpo $(DEPDIR)/libinotify_la-inotify-kernel.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inotify-kernel.c' object='libinotify_la-inotify-kernel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-inotify-kernel.lo `test -f 'inotify-kernel.c' || echo '$(srcdir)/'`inotify-kernel.c + +libinotify_la-inotify-sub.lo: inotify-sub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-inotify-sub.lo -MD -MP -MF $(DEPDIR)/libinotify_la-inotify-sub.Tpo -c -o libinotify_la-inotify-sub.lo `test -f 'inotify-sub.c' || echo '$(srcdir)/'`inotify-sub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-inotify-sub.Tpo $(DEPDIR)/libinotify_la-inotify-sub.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inotify-sub.c' object='libinotify_la-inotify-sub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-inotify-sub.lo `test -f 'inotify-sub.c' || echo '$(srcdir)/'`inotify-sub.c + +libinotify_la-inotify-path.lo: inotify-path.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-inotify-path.lo -MD -MP -MF $(DEPDIR)/libinotify_la-inotify-path.Tpo -c -o libinotify_la-inotify-path.lo `test -f 'inotify-path.c' || echo '$(srcdir)/'`inotify-path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-inotify-path.Tpo $(DEPDIR)/libinotify_la-inotify-path.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inotify-path.c' object='libinotify_la-inotify-path.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-inotify-path.lo `test -f 'inotify-path.c' || echo '$(srcdir)/'`inotify-path.c + +libinotify_la-inotify-missing.lo: inotify-missing.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-inotify-missing.lo -MD -MP -MF $(DEPDIR)/libinotify_la-inotify-missing.Tpo -c -o libinotify_la-inotify-missing.lo `test -f 'inotify-missing.c' || echo '$(srcdir)/'`inotify-missing.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-inotify-missing.Tpo $(DEPDIR)/libinotify_la-inotify-missing.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inotify-missing.c' object='libinotify_la-inotify-missing.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-inotify-missing.lo `test -f 'inotify-missing.c' || echo '$(srcdir)/'`inotify-missing.c + +libinotify_la-inotify-helper.lo: inotify-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-inotify-helper.lo -MD -MP -MF $(DEPDIR)/libinotify_la-inotify-helper.Tpo -c -o libinotify_la-inotify-helper.lo `test -f 'inotify-helper.c' || echo '$(srcdir)/'`inotify-helper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-inotify-helper.Tpo $(DEPDIR)/libinotify_la-inotify-helper.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inotify-helper.c' object='libinotify_la-inotify-helper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-inotify-helper.lo `test -f 'inotify-helper.c' || echo '$(srcdir)/'`inotify-helper.c + +libinotify_la-inotify-diag.lo: inotify-diag.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-inotify-diag.lo -MD -MP -MF $(DEPDIR)/libinotify_la-inotify-diag.Tpo -c -o libinotify_la-inotify-diag.lo `test -f 'inotify-diag.c' || echo '$(srcdir)/'`inotify-diag.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-inotify-diag.Tpo $(DEPDIR)/libinotify_la-inotify-diag.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='inotify-diag.c' object='libinotify_la-inotify-diag.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-inotify-diag.lo `test -f 'inotify-diag.c' || echo '$(srcdir)/'`inotify-diag.c + +libinotify_la-ginotifyfilemonitor.lo: ginotifyfilemonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-ginotifyfilemonitor.lo -MD -MP -MF $(DEPDIR)/libinotify_la-ginotifyfilemonitor.Tpo -c -o libinotify_la-ginotifyfilemonitor.lo `test -f 'ginotifyfilemonitor.c' || echo '$(srcdir)/'`ginotifyfilemonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-ginotifyfilemonitor.Tpo $(DEPDIR)/libinotify_la-ginotifyfilemonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ginotifyfilemonitor.c' object='libinotify_la-ginotifyfilemonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-ginotifyfilemonitor.lo `test -f 'ginotifyfilemonitor.c' || echo '$(srcdir)/'`ginotifyfilemonitor.c + +libinotify_la-ginotifydirectorymonitor.lo: ginotifydirectorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -MT libinotify_la-ginotifydirectorymonitor.lo -MD -MP -MF $(DEPDIR)/libinotify_la-ginotifydirectorymonitor.Tpo -c -o libinotify_la-ginotifydirectorymonitor.lo `test -f 'ginotifydirectorymonitor.c' || echo '$(srcdir)/'`ginotifydirectorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libinotify_la-ginotifydirectorymonitor.Tpo $(DEPDIR)/libinotify_la-ginotifydirectorymonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ginotifydirectorymonitor.c' object='libinotify_la-ginotifydirectorymonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libinotify_la_CFLAGS) $(CFLAGS) -c -o libinotify_la-ginotifydirectorymonitor.lo `test -f 'ginotifydirectorymonitor.c' || echo '$(srcdir)/'`ginotifydirectorymonitor.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gio/inotify/ginotifydirectorymonitor.c b/gio/inotify/ginotifydirectorymonitor.c new file mode 100644 index 0000000..dcc97a0 --- /dev/null +++ b/gio/inotify/ginotifydirectorymonitor.c @@ -0,0 +1,159 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#include "config.h" + +#include "ginotifydirectorymonitor.h" +#include "giomodule.h" + +#define USE_INOTIFY 1 +#include "inotify-helper.h" + +#include "gioalias.h" + +struct _GInotifyDirectoryMonitor +{ + GLocalDirectoryMonitor parent_instance; + inotify_sub *sub; +}; + +static gboolean g_inotify_directory_monitor_cancel (GFileMonitor* monitor); + +#define g_inotify_directory_monitor_get_type _g_inotify_directory_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GInotifyDirectoryMonitor, g_inotify_directory_monitor, G_TYPE_LOCAL_DIRECTORY_MONITOR, + g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "inotify", + 20)) + +static void +g_inotify_directory_monitor_finalize (GObject *object) +{ + GInotifyDirectoryMonitor *inotify_monitor = G_INOTIFY_DIRECTORY_MONITOR (object); + inotify_sub *sub = inotify_monitor->sub; + + if (sub) + { + _ih_sub_cancel (sub); + _ih_sub_free (sub); + inotify_monitor->sub = NULL; + } + + if (G_OBJECT_CLASS (g_inotify_directory_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_inotify_directory_monitor_parent_class)->finalize) (object); +} + +static GObject * +g_inotify_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GInotifyDirectoryMonitorClass *klass; + GObjectClass *parent_class; + GInotifyDirectoryMonitor *inotify_monitor; + const gchar *dirname = NULL; + inotify_sub *sub = NULL; + gboolean ret_ih_startup; /* return value of _ih_startup, for asserting */ + gboolean pair_moves; + + klass = G_INOTIFY_DIRECTORY_MONITOR_CLASS (g_type_class_peek (G_TYPE_INOTIFY_DIRECTORY_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + inotify_monitor = G_INOTIFY_DIRECTORY_MONITOR (obj); + + dirname = G_LOCAL_DIRECTORY_MONITOR (obj)->dirname; + g_assert (dirname != NULL); + + /* Will never fail as is_supported() should be called before instanciating + * anyway */ + /* assert on return value */ + ret_ih_startup = _ih_startup(); + g_assert (ret_ih_startup); + + pair_moves = G_LOCAL_DIRECTORY_MONITOR (obj)->flags & G_FILE_MONITOR_SEND_MOVED; + + sub = _ih_sub_new (dirname, NULL, pair_moves, inotify_monitor); + /* FIXME: what to do about errors here? we can't return NULL or another + * kind of error and an assertion is probably too hard */ + g_assert (sub != NULL); + + /* _ih_sub_add allways returns TRUE, see gio/inotify/inotify-helper.c line 109 + * g_assert (_ih_sub_add (sub)); */ + _ih_sub_add(sub); + + inotify_monitor->sub = sub; + + return obj; +} + +static gboolean +g_inotify_directory_monitor_is_supported (void) +{ + return _ih_startup (); +} + +static void +g_inotify_directory_monitor_class_init (GInotifyDirectoryMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *directory_monitor_class = G_FILE_MONITOR_CLASS (klass); + GLocalDirectoryMonitorClass *local_directory_monitor_class = G_LOCAL_DIRECTORY_MONITOR_CLASS (klass); + + gobject_class->finalize = g_inotify_directory_monitor_finalize; + gobject_class->constructor = g_inotify_directory_monitor_constructor; + directory_monitor_class->cancel = g_inotify_directory_monitor_cancel; + + local_directory_monitor_class->mount_notify = TRUE; + local_directory_monitor_class->is_supported = g_inotify_directory_monitor_is_supported; +} + +static void +g_inotify_directory_monitor_init (GInotifyDirectoryMonitor* monitor) +{ +} + +static gboolean +g_inotify_directory_monitor_cancel (GFileMonitor* monitor) +{ + GInotifyDirectoryMonitor *inotify_monitor = G_INOTIFY_DIRECTORY_MONITOR (monitor); + inotify_sub *sub = inotify_monitor->sub; + + if (sub) + { + _ih_sub_cancel (sub); + _ih_sub_free (sub); + inotify_monitor->sub = NULL; + } + + if (G_FILE_MONITOR_CLASS (g_inotify_directory_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_inotify_directory_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} + diff --git a/gio/inotify/ginotifydirectorymonitor.h b/gio/inotify/ginotifydirectorymonitor.h new file mode 100644 index 0000000..d5abb71 --- /dev/null +++ b/gio/inotify/ginotifydirectorymonitor.h @@ -0,0 +1,53 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __G_INOTIFY_DIRECTORY_MONITOR_H__ +#define __G_INOTIFY_DIRECTORY_MONITOR_H__ + +#include +#include +#include "glocaldirectorymonitor.h" +#include "giomodule.h" + +G_BEGIN_DECLS + +#define G_TYPE_INOTIFY_DIRECTORY_MONITOR (_g_inotify_directory_monitor_get_type ()) +#define G_INOTIFY_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_INOTIFY_DIRECTORY_MONITOR, GInotifyDirectoryMonitor)) +#define G_INOTIFY_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_INOTIFY_DIRECTORY_MONITOR, GInotifyDirectoryMonitorClass)) +#define G_IS_INOTIFY_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_INOTIFY_DIRECTORY_MONITOR)) +#define G_IS_INOTIFY_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INOTIFY_DIRECTORY_MONITOR)) + +typedef struct _GInotifyDirectoryMonitor GInotifyDirectoryMonitor; +typedef struct _GInotifyDirectoryMonitorClass GInotifyDirectoryMonitorClass; + +struct _GInotifyDirectoryMonitorClass { + GLocalDirectoryMonitorClass parent_class; +}; + +GType _g_inotify_directory_monitor_get_type (void); + +G_END_DECLS + +#endif /* __G_INOTIFY_DIRECTORY_MONITOR_H__ */ diff --git a/gio/inotify/ginotifyfilemonitor.c b/gio/inotify/ginotifyfilemonitor.c new file mode 100644 index 0000000..f87f079 --- /dev/null +++ b/gio/inotify/ginotifyfilemonitor.c @@ -0,0 +1,181 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#include "config.h" + +#include "ginotifyfilemonitor.h" +#include + +#define USE_INOTIFY 1 +#include "inotify-helper.h" + +#include "gioalias.h" + +struct _GInotifyFileMonitor +{ + GLocalFileMonitor parent_instance; + gchar *filename; + gchar *dirname; + inotify_sub *sub; + gboolean pair_moves; +}; + +static gboolean g_inotify_file_monitor_cancel (GFileMonitor* monitor); + +#define g_inotify_file_monitor_get_type _g_inotify_file_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GInotifyFileMonitor, g_inotify_file_monitor, G_TYPE_LOCAL_FILE_MONITOR, + g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "inotify", + 20)) + +static void +g_inotify_file_monitor_finalize (GObject *object) +{ + GInotifyFileMonitor *inotify_monitor = G_INOTIFY_FILE_MONITOR (object); + inotify_sub *sub = inotify_monitor->sub; + + if (sub) + { + _ih_sub_cancel (sub); + _ih_sub_free (sub); + inotify_monitor->sub = NULL; + } + + if (inotify_monitor->filename) + { + g_free (inotify_monitor->filename); + inotify_monitor->filename = NULL; + } + + if (inotify_monitor->dirname) + { + g_free (inotify_monitor->dirname); + inotify_monitor->dirname = NULL; + } + + if (G_OBJECT_CLASS (g_inotify_file_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_inotify_file_monitor_parent_class)->finalize) (object); +} + +static GObject * +g_inotify_file_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GInotifyFileMonitorClass *klass; + GObjectClass *parent_class; + GInotifyFileMonitor *inotify_monitor; + const gchar *filename = NULL; + inotify_sub *sub = NULL; + gboolean pair_moves; + gboolean ret_ih_startup; /* return value of _ih_startup, for asserting */ + + klass = G_INOTIFY_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_INOTIFY_FILE_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + inotify_monitor = G_INOTIFY_FILE_MONITOR (obj); + + filename = G_LOCAL_FILE_MONITOR (obj)->filename; + + g_assert (filename != NULL); + + inotify_monitor->filename = g_path_get_basename (filename); + inotify_monitor->dirname = g_path_get_dirname (filename); + + /* Will never fail as is_supported() should be called before instanciating + * anyway */ + /* assert on return value */ + ret_ih_startup = _ih_startup(); + g_assert (ret_ih_startup); + + pair_moves = G_LOCAL_FILE_MONITOR (obj)->flags & G_FILE_MONITOR_SEND_MOVED; + + sub = _ih_sub_new (inotify_monitor->dirname, + inotify_monitor->filename, + pair_moves, + inotify_monitor); + + /* FIXME: what to do about errors here? we can't return NULL or another + * kind of error and an assertion is probably too hard */ + g_assert (sub != NULL); + + /* _ih_sub_add allways returns TRUE, see gio/inotify/inotify-helper.c line 109 + * g_assert (_ih_sub_add (sub)); */ + _ih_sub_add (sub); + + inotify_monitor->sub = sub; + + return obj; +} + +static gboolean +g_inotify_file_monitor_is_supported (void) +{ + return _ih_startup (); +} + +static void +g_inotify_file_monitor_class_init (GInotifyFileMonitorClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS (klass); + GFileMonitorClass *file_monitor_class = G_FILE_MONITOR_CLASS (klass); + GLocalFileMonitorClass *local_file_monitor_class = G_LOCAL_FILE_MONITOR_CLASS (klass); + + gobject_class->finalize = g_inotify_file_monitor_finalize; + gobject_class->constructor = g_inotify_file_monitor_constructor; + file_monitor_class->cancel = g_inotify_file_monitor_cancel; + + local_file_monitor_class->is_supported = g_inotify_file_monitor_is_supported; +} + +static void +g_inotify_file_monitor_init (GInotifyFileMonitor* monitor) +{ +} + +static gboolean +g_inotify_file_monitor_cancel (GFileMonitor* monitor) +{ + GInotifyFileMonitor *inotify_monitor = G_INOTIFY_FILE_MONITOR (monitor); + inotify_sub *sub = inotify_monitor->sub; + + if (sub) + { + _ih_sub_cancel (sub); + _ih_sub_free (sub); + inotify_monitor->sub = NULL; + } + + if (G_FILE_MONITOR_CLASS (g_inotify_file_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_inotify_file_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} + diff --git a/gio/inotify/ginotifyfilemonitor.h b/gio/inotify/ginotifyfilemonitor.h new file mode 100644 index 0000000..e97a40c --- /dev/null +++ b/gio/inotify/ginotifyfilemonitor.h @@ -0,0 +1,54 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2007 Sebastian Dröge. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Alexander Larsson + * John McCutchan + * Sebastian Dröge + */ + +#ifndef __G_INOTIFY_FILE_MONITOR_H__ +#define __G_INOTIFY_FILE_MONITOR_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_INOTIFY_FILE_MONITOR (_g_inotify_file_monitor_get_type ()) +#define G_INOTIFY_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_INOTIFY_FILE_MONITOR, GInotifyFileMonitor)) +#define G_INOTIFY_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_INOTIFY_FILE_MONITOR, GInotifyFileMonitorClass)) +#define G_IS_INOTIFY_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_INOTIFY_FILE_MONITOR)) +#define G_IS_INOTIFY_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INOTIFY_FILE_MONITOR)) + +typedef struct _GInotifyFileMonitor GInotifyFileMonitor; +typedef struct _GInotifyFileMonitorClass GInotifyFileMonitorClass; + +struct _GInotifyFileMonitorClass { + GLocalFileMonitorClass parent_class; +}; + +GType _g_inotify_file_monitor_get_type (void); + +G_END_DECLS + +#endif /* __G_INOTIFY_FILE_MONITOR_H__ */ diff --git a/gio/inotify/inotify-diag.c b/gio/inotify/inotify-diag.c new file mode 100644 index 0000000..937ebd7 --- /dev/null +++ b/gio/inotify/inotify-diag.c @@ -0,0 +1,74 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ + +/* inotify-helper.c - Gnome VFS Monitor based on inotify. + + Copyright (C) 2005 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors: + John McCutchan +*/ + +#include "config.h" +#include +#include +#include +#include "inotify-missing.h" +#include "inotify-path.h" +#include "inotify-diag.h" + +#define DIAG_DUMP_TIME 20000 /* 20 seconds */ + +G_LOCK_EXTERN (inotify_lock); + +static gboolean +id_dump (gpointer userdata) +{ + GIOChannel *ioc; + pid_t pid; + char *fname; + G_LOCK (inotify_lock); + ioc = NULL; + pid = getpid (); + + fname = g_strdup_printf ("/tmp/gvfsid.%d", pid); + ioc = g_io_channel_new_file (fname, "w", NULL); + g_free (fname); + + if (!ioc) + { + G_UNLOCK (inotify_lock); + return TRUE; + } + + _im_diag_dump (ioc); + + g_io_channel_shutdown (ioc, TRUE, NULL); + g_io_channel_unref (ioc); + + G_UNLOCK (inotify_lock); + return TRUE; +} + +void +_id_startup (void) +{ + if (!g_getenv ("GVFS_INOTIFY_DIAG")) + return; + + g_timeout_add (DIAG_DUMP_TIME, id_dump, NULL); +} diff --git a/gio/inotify/inotify-diag.h b/gio/inotify/inotify-diag.h new file mode 100644 index 0000000..f818f16 --- /dev/null +++ b/gio/inotify/inotify-diag.h @@ -0,0 +1,29 @@ +/* inotify-helper.h - GNOME VFS Monitor using inotify + + Copyright (C) 2006 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: John McCutchan +*/ + + +#ifndef __INOTIFY_DIAG_H +#define __INOTIFY_DIAG_H + +void _id_startup (void); + +#endif /* __INOTIFY_DIAG_H */ diff --git a/gio/inotify/inotify-helper.c b/gio/inotify/inotify-helper.c new file mode 100644 index 0000000..5572f0d --- /dev/null +++ b/gio/inotify/inotify-helper.c @@ -0,0 +1,275 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ + +/* inotify-helper.c - GVFS Monitor based on inotify. + + Copyright (C) 2007 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors: + John McCutchan +*/ + +#include "config.h" +#include +#include +#include +#include +/* Just include the local header to stop all the pain */ +#include +#include +#include +#include +#include "inotify-helper.h" +#include "inotify-missing.h" +#include "inotify-path.h" +#include "inotify-diag.h" + +#include "gioalias.h" + + +static gboolean ih_debug_enabled = FALSE; +#define IH_W if (ih_debug_enabled) g_warning + +static void ih_event_callback (ik_event_t *event, inotify_sub *sub); +static void ih_not_missing_callback (inotify_sub *sub); + +/* We share this lock with inotify-kernel.c and inotify-missing.c + * + * inotify-kernel.c takes the lock when it reads events from + * the kernel and when it processes those events + * + * inotify-missing.c takes the lock when it is scanning the missing + * list. + * + * We take the lock in all public functions + */ +G_GNUC_INTERNAL G_LOCK_DEFINE (inotify_lock); + +static GFileMonitorEvent ih_mask_to_EventFlags (guint32 mask); + +/** + * _ih_startup: + * + * Initializes the inotify backend. This must be called before + * any other functions in this module. + * + * Return value: #TRUE if initialization succeeded, #FALSE otherwise + */ +gboolean +_ih_startup (void) +{ + static gboolean initialized = FALSE; + static gboolean result = FALSE; + + G_LOCK (inotify_lock); + + if (initialized == TRUE) + { + G_UNLOCK (inotify_lock); + return result; + } + + result = _ip_startup (ih_event_callback); + if (!result) + { + g_warning ("Could not initialize inotify\n"); + G_UNLOCK (inotify_lock); + return FALSE; + } + _im_startup (ih_not_missing_callback); + _id_startup (); + + IH_W ("started gvfs inotify backend\n"); + + initialized = TRUE; + + G_UNLOCK (inotify_lock); + + return TRUE; +} + +/* + * Adds a subscription to be monitored. + */ +gboolean +_ih_sub_add (inotify_sub *sub) +{ + G_LOCK (inotify_lock); + + if (!_ip_start_watching (sub)) + _im_add (sub); + + G_UNLOCK (inotify_lock); + return TRUE; +} + +/* + * Cancels a subscription which was being monitored. + */ +gboolean +_ih_sub_cancel (inotify_sub *sub) +{ + G_LOCK (inotify_lock); + + if (!sub->cancelled) + { + IH_W ("cancelling %s\n", sub->dirname); + sub->cancelled = TRUE; + _im_rm (sub); + _ip_stop_watching (sub); + } + + G_UNLOCK (inotify_lock); + + return TRUE; +} + +static char * +_ih_fullpath_from_event (ik_event_t *event, char *dirname) +{ + char *fullpath; + + if (event->name) + fullpath = g_strdup_printf ("%s/%s", dirname, event->name); + else + fullpath = g_strdup_printf ("%s/", dirname); + + return fullpath; +} + + +static gboolean +ih_event_is_paired_move (ik_event_t *event) +{ + if (event->pair) + { + ik_event_t *paired = event->pair; + /* intofiy(7): IN_MOVE == IN_MOVED_FROM | IN_MOVED_TO */ + return (event->mask | paired->mask) & IN_MOVE; + } + + return FALSE; +} + +static void +ih_event_callback (ik_event_t *event, + inotify_sub *sub) +{ + gchar *fullpath; + GFileMonitorEvent eflags; + GFile* parent; + GFile* child; + GFile* other; + + eflags = ih_mask_to_EventFlags (event->mask); + parent = g_file_new_for_path (sub->dirname); + fullpath = _ih_fullpath_from_event (event, sub->dirname); + child = g_file_new_for_path (fullpath); + g_free (fullpath); + + if (ih_event_is_paired_move (event) && sub->pair_moves) + { + char *parent_dir = _ip_get_path_for_wd (event->pair->wd); + fullpath = _ih_fullpath_from_event (event->pair, parent_dir); + other = g_file_new_for_path (fullpath); + g_free (fullpath); + eflags = G_FILE_MONITOR_EVENT_MOVED; + event->pair = NULL; /* prevents the paired event to be emitted as well */ + } + else + other = NULL; + + g_file_monitor_emit_event (G_FILE_MONITOR (sub->user_data), + child, other, eflags); + + g_object_unref (child); + g_object_unref (parent); + if (other) + g_object_unref (other); +} + +static void +ih_not_missing_callback (inotify_sub *sub) +{ + gchar *fullpath; + GFileMonitorEvent eflags; + guint32 mask; + GFile* parent; + GFile* child; + + parent = g_file_new_for_path (sub->dirname); + + if (sub->filename) + { + fullpath = g_strdup_printf ("%s/%s", sub->dirname, sub->filename); + g_warning ("Missing callback called fullpath = %s\n", fullpath); + if (!g_file_test (fullpath, G_FILE_TEST_EXISTS)) + { + g_free (fullpath); + return; + } + mask = IN_CREATE; + } + else + { + fullpath = g_strdup_printf ("%s", sub->dirname); + mask = IN_CREATE|IN_ISDIR; + } + + eflags = ih_mask_to_EventFlags (mask); + child = g_file_new_for_path (fullpath); + g_free (fullpath); + + g_file_monitor_emit_event (G_FILE_MONITOR (sub->user_data), + child, NULL, eflags); + + g_object_unref (child); + g_object_unref (parent); +} + +/* Transforms a inotify event to a GVFS event. */ +static GFileMonitorEvent +ih_mask_to_EventFlags (guint32 mask) +{ + mask &= ~IN_ISDIR; + switch (mask) + { + case IN_MODIFY: + return G_FILE_MONITOR_EVENT_CHANGED; + case IN_CLOSE_WRITE: + return G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT; + case IN_ATTRIB: + return G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED; + case IN_MOVE_SELF: + case IN_MOVED_FROM: + case IN_DELETE: + case IN_DELETE_SELF: + return G_FILE_MONITOR_EVENT_DELETED; + case IN_CREATE: + case IN_MOVED_TO: + return G_FILE_MONITOR_EVENT_CREATED; + case IN_UNMOUNT: + return G_FILE_MONITOR_EVENT_UNMOUNTED; + case IN_Q_OVERFLOW: + case IN_OPEN: + case IN_CLOSE_NOWRITE: + case IN_ACCESS: + case IN_IGNORED: + default: + return -1; + } +} diff --git a/gio/inotify/inotify-helper.h b/gio/inotify/inotify-helper.h new file mode 100644 index 0000000..1fd9701 --- /dev/null +++ b/gio/inotify/inotify-helper.h @@ -0,0 +1,33 @@ +/* inotify-helper.h - GVFS Directory Monitor using inotify + + Copyright (C) 2007 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: John McCutchan +*/ + + +#ifndef __INOTIFY_HELPER_H +#define __INOTIFY_HELPER_H + +#include "inotify-sub.h" + +gboolean _ih_startup (void); +gboolean _ih_sub_add (inotify_sub *sub); +gboolean _ih_sub_cancel (inotify_sub *sub); + +#endif /* __INOTIFY_HELPER_H */ diff --git a/gio/inotify/inotify-kernel.c b/gio/inotify/inotify-kernel.c new file mode 100644 index 0000000..d6385f9 --- /dev/null +++ b/gio/inotify/inotify-kernel.c @@ -0,0 +1,680 @@ +/* + Copyright (C) 2005 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors:. + John McCutchan +*/ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include "inotify-kernel.h" +#include + +/* Timings for pairing MOVED_TO / MOVED_FROM events */ +#define PROCESS_EVENTS_TIME 1000 /* 1 millisecond (1 hz) */ +#define DEFAULT_HOLD_UNTIL_TIME 0 /* 0 millisecond */ +#define MOVE_HOLD_UNTIL_TIME 500 /* 500 microseconds or 0.5 milliseconds */ + +static int inotify_instance_fd = -1; +static GQueue *events_to_process = NULL; +static GQueue *event_queue = NULL; +static GHashTable * cookie_hash = NULL; +static GIOChannel *inotify_read_ioc; +static GPollFD ik_poll_fd; +static gboolean ik_poll_fd_enabled = TRUE; +static void (*user_cb)(ik_event_t *event); + +static gboolean ik_read_callback (gpointer user_data); +static gboolean ik_process_eq_callback (gpointer user_data); + +static guint32 ik_move_matches = 0; +static guint32 ik_move_misses = 0; + +static gboolean process_eq_running = FALSE; + +/* We use the lock from inotify-helper.c + * + * There are two places that we take this lock + * + * 1) In ik_read_callback + * + * 2) ik_process_eq_callback. + * + * + * The rest of locking is taken care of in inotify-helper.c + */ +G_LOCK_EXTERN (inotify_lock); + +typedef struct ik_event_internal { + ik_event_t *event; + gboolean seen; + gboolean sent; + GTimeVal hold_until; + struct ik_event_internal *pair; +} ik_event_internal_t; + +/* In order to perform non-sleeping inotify event chunking we need + * a custom GSource + */ +static gboolean +ik_source_prepare (GSource *source, + gint *timeout) +{ + return FALSE; +} + +static gboolean +ik_source_timeout (gpointer data) +{ + GSource *source = (GSource *)data; + + /* Re-active the PollFD */ + g_source_add_poll (source, &ik_poll_fd); + g_source_unref (source); + ik_poll_fd_enabled = TRUE; + + return FALSE; +} + +#define MAX_PENDING_COUNT 2 +#define PENDING_THRESHOLD(qsize) ((qsize) >> 1) +#define PENDING_MARGINAL_COST(p) ((unsigned int)(1 << (p))) +#define MAX_QUEUED_EVENTS 2048 +#define AVERAGE_EVENT_SIZE sizeof (struct inotify_event) + 16 +#define TIMEOUT_MILLISECONDS 10 + +static gboolean +ik_source_check (GSource *source) +{ + static int prev_pending = 0, pending_count = 0; + + /* We already disabled the PollFD or + * nothing to be read from inotify */ + if (!ik_poll_fd_enabled || !(ik_poll_fd.revents & G_IO_IN)) + return FALSE; + + if (pending_count < MAX_PENDING_COUNT) + { + unsigned int pending; + + if (ioctl (inotify_instance_fd, FIONREAD, &pending) == -1) + goto do_read; + + pending /= AVERAGE_EVENT_SIZE; + + /* Don't wait if the number of pending events is too close + * to the maximum queue size. + */ + if (pending > PENDING_THRESHOLD (MAX_QUEUED_EVENTS)) + goto do_read; + + /* With each successive iteration, the minimum rate for + * further sleep doubles. + */ + if (pending-prev_pending < PENDING_MARGINAL_COST (pending_count)) + goto do_read; + + prev_pending = pending; + pending_count++; + + /* We are going to wait to read the events: */ + + /* Remove the PollFD from the source */ + g_source_remove_poll (source, &ik_poll_fd); + /* To avoid threading issues we need to flag that we've done that */ + ik_poll_fd_enabled = FALSE; + /* Set a timeout to re-add the PollFD to the source */ + g_source_ref (source); + g_timeout_add (TIMEOUT_MILLISECONDS, ik_source_timeout, source); + + return FALSE; + } + +do_read: + /* We are ready to read events from inotify */ + + prev_pending = 0; + pending_count = 0; + + return TRUE; +} + +static gboolean +ik_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + if (callback) + return callback (user_data); + return TRUE; +} + +static GSourceFuncs ik_source_funcs = +{ + ik_source_prepare, + ik_source_check, + ik_source_dispatch, + NULL +}; + +gboolean _ik_startup (void (*cb)(ik_event_t *event)) +{ + static gboolean initialized = FALSE; + GSource *source; + + user_cb = cb; + /* Ignore multi-calls */ + if (initialized) + return inotify_instance_fd >= 0; + + initialized = TRUE; + +#ifdef HAVE_INOTIFY_INIT1 + inotify_instance_fd = inotify_init1 (IN_CLOEXEC); +#else + inotify_instance_fd = -1; +#endif + if (inotify_instance_fd < 0) + inotify_instance_fd = inotify_init (); + + if (inotify_instance_fd < 0) + return FALSE; + + inotify_read_ioc = g_io_channel_unix_new (inotify_instance_fd); + ik_poll_fd.fd = inotify_instance_fd; + ik_poll_fd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; + g_io_channel_set_encoding (inotify_read_ioc, NULL, NULL); + g_io_channel_set_flags (inotify_read_ioc, G_IO_FLAG_NONBLOCK, NULL); + + source = g_source_new (&ik_source_funcs, sizeof (GSource)); + g_source_add_poll (source, &ik_poll_fd); + g_source_set_callback (source, ik_read_callback, NULL, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + + cookie_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + event_queue = g_queue_new (); + events_to_process = g_queue_new (); + + return TRUE; +} + +static ik_event_internal_t * +ik_event_internal_new (ik_event_t *event) +{ + ik_event_internal_t *internal_event = g_new0 (ik_event_internal_t, 1); + GTimeVal tv; + + g_assert (event); + + g_get_current_time (&tv); + g_time_val_add (&tv, DEFAULT_HOLD_UNTIL_TIME); + internal_event->event = event; + internal_event->hold_until = tv; + + return internal_event; +} + +static ik_event_t * +ik_event_new (char *buffer) +{ + struct inotify_event *kevent = (struct inotify_event *)buffer; + ik_event_t *event = g_new0 (ik_event_t, 1); + + g_assert (buffer); + + event->wd = kevent->wd; + event->mask = kevent->mask; + event->cookie = kevent->cookie; + event->len = kevent->len; + if (event->len) + event->name = g_strdup (kevent->name); + else + event->name = g_strdup (""); + + return event; +} + +ik_event_t * +_ik_event_new_dummy (const char *name, + gint32 wd, + guint32 mask) +{ + ik_event_t *event = g_new0 (ik_event_t, 1); + event->wd = wd; + event->mask = mask; + event->cookie = 0; + if (name) + event->name = g_strdup (name); + else + event->name = g_strdup(""); + + event->len = strlen (event->name); + + return event; +} + +void +_ik_event_free (ik_event_t *event) +{ + if (event->pair) + _ik_event_free (event->pair); + g_free (event->name); + g_free (event); +} + +gint32 +_ik_watch (const char *path, + guint32 mask, + int *err) +{ + gint32 wd = -1; + + g_assert (path != NULL); + g_assert (inotify_instance_fd >= 0); + + wd = inotify_add_watch (inotify_instance_fd, path, mask); + + if (wd < 0) + { + int e = errno; + /* FIXME: debug msg failed to add watch */ + if (err) + *err = e; + return wd; + } + + g_assert (wd >= 0); + return wd; +} + +int +_ik_ignore (const char *path, + gint32 wd) +{ + g_assert (wd >= 0); + g_assert (inotify_instance_fd >= 0); + + if (inotify_rm_watch (inotify_instance_fd, wd) < 0) + { + /* int e = errno; */ + /* failed to rm watch */ + return -1; + } + + return 0; +} + +void +_ik_move_stats (guint32 *matches, + guint32 *misses) +{ + if (matches) + *matches = ik_move_matches; + + if (misses) + *misses = ik_move_misses; +} + +const char * +_ik_mask_to_string (guint32 mask) +{ + gboolean is_dir = mask & IN_ISDIR; + mask &= ~IN_ISDIR; + + if (is_dir) + { + switch (mask) + { + case IN_ACCESS: + return "ACCESS (dir)"; + case IN_MODIFY: + return "MODIFY (dir)"; + case IN_ATTRIB: + return "ATTRIB (dir)"; + case IN_CLOSE_WRITE: + return "CLOSE_WRITE (dir)"; + case IN_CLOSE_NOWRITE: + return "CLOSE_NOWRITE (dir)"; + case IN_OPEN: + return "OPEN (dir)"; + case IN_MOVED_FROM: + return "MOVED_FROM (dir)"; + case IN_MOVED_TO: + return "MOVED_TO (dir)"; + case IN_DELETE: + return "DELETE (dir)"; + case IN_CREATE: + return "CREATE (dir)"; + case IN_DELETE_SELF: + return "DELETE_SELF (dir)"; + case IN_UNMOUNT: + return "UNMOUNT (dir)"; + case IN_Q_OVERFLOW: + return "Q_OVERFLOW (dir)"; + case IN_IGNORED: + return "IGNORED (dir)"; + default: + return "UNKNOWN_EVENT (dir)"; + } + } + else + { + switch (mask) + { + case IN_ACCESS: + return "ACCESS"; + case IN_MODIFY: + return "MODIFY"; + case IN_ATTRIB: + return "ATTRIB"; + case IN_CLOSE_WRITE: + return "CLOSE_WRITE"; + case IN_CLOSE_NOWRITE: + return "CLOSE_NOWRITE"; + case IN_OPEN: + return "OPEN"; + case IN_MOVED_FROM: + return "MOVED_FROM"; + case IN_MOVED_TO: + return "MOVED_TO"; + case IN_DELETE: + return "DELETE"; + case IN_CREATE: + return "CREATE"; + case IN_DELETE_SELF: + return "DELETE_SELF"; + case IN_UNMOUNT: + return "UNMOUNT"; + case IN_Q_OVERFLOW: + return "Q_OVERFLOW"; + case IN_IGNORED: + return "IGNORED"; + default: + return "UNKNOWN_EVENT"; + } + } +} + + +static void +ik_read_events (gsize *buffer_size_out, + gchar **buffer_out) +{ + static gchar *buffer = NULL; + static gsize buffer_size; + + /* Initialize the buffer on our first call */ + if (buffer == NULL) + { + buffer_size = AVERAGE_EVENT_SIZE; + buffer_size *= MAX_QUEUED_EVENTS; + buffer = g_malloc (buffer_size); + } + + *buffer_size_out = 0; + *buffer_out = NULL; + + memset (buffer, 0, buffer_size); + + if (g_io_channel_read_chars (inotify_read_ioc, (char *)buffer, buffer_size, buffer_size_out, NULL) != G_IO_STATUS_NORMAL) { + /* error reading */ + } + *buffer_out = buffer; +} + +static gboolean +ik_read_callback (gpointer user_data) +{ + gchar *buffer; + gsize buffer_size, buffer_i, events; + + G_LOCK (inotify_lock); + ik_read_events (&buffer_size, &buffer); + + buffer_i = 0; + events = 0; + while (buffer_i < buffer_size) + { + struct inotify_event *event; + gsize event_size; + event = (struct inotify_event *)&buffer[buffer_i]; + event_size = sizeof(struct inotify_event) + event->len; + g_queue_push_tail (events_to_process, ik_event_internal_new (ik_event_new (&buffer[buffer_i]))); + buffer_i += event_size; + events++; + } + + /* If the event process callback is off, turn it back on */ + if (!process_eq_running && events) + { + process_eq_running = TRUE; + g_timeout_add (PROCESS_EVENTS_TIME, ik_process_eq_callback, NULL); + } + + G_UNLOCK (inotify_lock); + + return TRUE; +} + +static gboolean +g_timeval_lt (GTimeVal *val1, + GTimeVal *val2) +{ + if (val1->tv_sec < val2->tv_sec) + return TRUE; + + if (val1->tv_sec > val2->tv_sec) + return FALSE; + + /* val1->tv_sec == val2->tv_sec */ + if (val1->tv_usec < val2->tv_usec) + return TRUE; + + return FALSE; +} + +static gboolean +g_timeval_eq (GTimeVal *val1, + GTimeVal *val2) +{ + return (val1->tv_sec == val2->tv_sec) && (val1->tv_usec == val2->tv_usec); +} + +static void +ik_pair_events (ik_event_internal_t *event1, + ik_event_internal_t *event2) +{ + g_assert (event1 && event2); + /* We should only be pairing events that have the same cookie */ + g_assert (event1->event->cookie == event2->event->cookie); + /* We shouldn't pair an event that already is paired */ + g_assert (event1->pair == NULL && event2->pair == NULL); + + /* Pair the internal structures and the ik_event_t structures */ + event1->pair = event2; + event1->event->pair = event2->event; + + if (g_timeval_lt (&event1->hold_until, &event2->hold_until)) + event1->hold_until = event2->hold_until; + + event2->hold_until = event1->hold_until; +} + +static void +ik_event_add_microseconds (ik_event_internal_t *event, + glong ms) +{ + g_assert (event); + g_time_val_add (&event->hold_until, ms); +} + +static gboolean +ik_event_ready (ik_event_internal_t *event) +{ + GTimeVal tv; + g_assert (event); + + g_get_current_time (&tv); + + /* An event is ready if, + * + * it has no cookie -- there is nothing to be gained by holding it + * or, it is already paired -- we don't need to hold it anymore + * or, we have held it long enough + */ + return + event->event->cookie == 0 || + event->pair != NULL || + g_timeval_lt (&event->hold_until, &tv) || + g_timeval_eq (&event->hold_until, &tv); +} + +static void +ik_pair_moves (gpointer data, + gpointer user_data) +{ + ik_event_internal_t *event = (ik_event_internal_t *)data; + + if (event->seen == TRUE || event->sent == TRUE) + return; + + if (event->event->cookie != 0) + { + /* When we get a MOVED_FROM event we delay sending the event by + * MOVE_HOLD_UNTIL_TIME microseconds. We need to do this because a + * MOVED_TO pair _might_ be coming in the near future */ + if (event->event->mask & IN_MOVED_FROM) + { + g_hash_table_insert (cookie_hash, GINT_TO_POINTER (event->event->cookie), event); + /* because we don't deliver move events there is no point in waiting for the match right now. */ + ik_event_add_microseconds (event, MOVE_HOLD_UNTIL_TIME); + } + else if (event->event->mask & IN_MOVED_TO) + { + /* We need to check if we are waiting for this MOVED_TO events cookie to pair it with + * a MOVED_FROM */ + ik_event_internal_t *match = NULL; + match = g_hash_table_lookup (cookie_hash, GINT_TO_POINTER (event->event->cookie)); + if (match) + { + g_hash_table_remove (cookie_hash, GINT_TO_POINTER (event->event->cookie)); + ik_pair_events (match, event); + } + } + } + event->seen = TRUE; +} + +static void +ik_process_events (void) +{ + g_queue_foreach (events_to_process, ik_pair_moves, NULL); + + while (!g_queue_is_empty (events_to_process)) + { + ik_event_internal_t *event = g_queue_peek_head (events_to_process); + + /* This must have been sent as part of a MOVED_TO/MOVED_FROM */ + if (event->sent) + { + /* Pop event */ + g_queue_pop_head (events_to_process); + /* Free the internal event structure */ + g_free (event); + continue; + } + + /* The event isn't ready yet */ + if (!ik_event_ready (event)) + break; + + /* Pop it */ + event = g_queue_pop_head (events_to_process); + + /* Check if this is a MOVED_FROM that is also sitting in the cookie_hash */ + if (event->event->cookie && event->pair == NULL && + g_hash_table_lookup (cookie_hash, GINT_TO_POINTER (event->event->cookie))) + g_hash_table_remove (cookie_hash, GINT_TO_POINTER (event->event->cookie)); + + if (event->pair) + { + /* We send out paired MOVED_FROM/MOVED_TO events in the same event buffer */ + /* g_assert (event->event->mask == IN_MOVED_FROM && event->pair->event->mask == IN_MOVED_TO); */ + /* Copy the paired data */ + event->pair->sent = TRUE; + event->sent = TRUE; + ik_move_matches++; + } + else if (event->event->cookie) + { + /* If we couldn't pair a MOVED_FROM and MOVED_TO together, we change + * the event masks */ + /* Changeing MOVED_FROM to DELETE and MOVED_TO to create lets us make + * the gaurantee that you will never see a non-matched MOVE event */ + + if (event->event->mask & IN_MOVED_FROM) + { + event->event->mask = IN_DELETE|(event->event->mask & IN_ISDIR); + ik_move_misses++; /* not super accurate, if we aren't watching the destination it still counts as a miss */ + } + if (event->event->mask & IN_MOVED_TO) + event->event->mask = IN_CREATE|(event->event->mask & IN_ISDIR); + } + + /* Push the ik_event_t onto the event queue */ + g_queue_push_tail (event_queue, event->event); + /* Free the internal event structure */ + g_free (event); + } +} + +static gboolean +ik_process_eq_callback (gpointer user_data) +{ + gboolean res; + + /* Try and move as many events to the event queue */ + G_LOCK (inotify_lock); + ik_process_events (); + + while (!g_queue_is_empty (event_queue)) + { + ik_event_t *event = g_queue_pop_head (event_queue); + + user_cb (event); + } + + res = TRUE; + + if (g_queue_get_length (events_to_process) == 0) + { + process_eq_running = FALSE; + res = FALSE; + } + + G_UNLOCK (inotify_lock); + + return res; +} diff --git a/gio/inotify/inotify-kernel.h b/gio/inotify/inotify-kernel.h new file mode 100644 index 0000000..b406d71 --- /dev/null +++ b/gio/inotify/inotify-kernel.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2005 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors:. + John McCutchan +*/ + +#ifndef __INOTIFY_KERNEL_H +#define __INOTIFY_KERNEL_H + +typedef struct ik_event_s { + gint32 wd; + guint32 mask; + guint32 cookie; + guint32 len; + char * name; + struct ik_event_s *pair; +} ik_event_t; + +gboolean _ik_startup (void (*cb) (ik_event_t *event)); + +ik_event_t *_ik_event_new_dummy (const char *name, + gint32 wd, + guint32 mask); +void _ik_event_free (ik_event_t *event); + +gint32 _ik_watch (const char *path, + guint32 mask, + int *err); +int _ik_ignore (const char *path, + gint32 wd); + + +/* The miss count will probably be enflated */ +void _ik_move_stats (guint32 *matches, + guint32 *misses); +const char *_ik_mask_to_string (guint32 mask); + + +#endif diff --git a/gio/inotify/inotify-missing.c b/gio/inotify/inotify-missing.c new file mode 100644 index 0000000..d19332a --- /dev/null +++ b/gio/inotify/inotify-missing.c @@ -0,0 +1,167 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ + +/* inotify-helper.c - Gnome VFS Monitor based on inotify. + + Copyright (C) 2005 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors: + John McCutchan +*/ + +#include "config.h" +#include +#include "inotify-missing.h" +#include "inotify-path.h" + +#define SCAN_MISSING_TIME 4 /* 1/4 Hz */ + +static gboolean im_debug_enabled = FALSE; +#define IM_W if (im_debug_enabled) g_warning + +/* We put inotify_sub's that are missing on this list */ +static GList *missing_sub_list = NULL; +static gboolean im_scan_missing (gpointer user_data); +static gboolean scan_missing_running = FALSE; +static void (*missing_cb)(inotify_sub *sub) = NULL; + +G_LOCK_EXTERN (inotify_lock); + +/* inotify_lock must be held before calling */ +void +_im_startup (void (*callback)(inotify_sub *sub)) +{ + static gboolean initialized = FALSE; + + if (!initialized) + { + missing_cb = callback; + initialized = TRUE; + } +} + +/* inotify_lock must be held before calling */ +void +_im_add (inotify_sub *sub) +{ + if (g_list_find (missing_sub_list, sub)) + { + IM_W ("asked to add %s to missing list but it's already on the list!\n", sub->dirname); + return; + } + + IM_W ("adding %s to missing list\n", sub->dirname); + missing_sub_list = g_list_prepend (missing_sub_list, sub); + + /* If the timeout is turned off, we turn it back on */ + if (!scan_missing_running) + { + scan_missing_running = TRUE; + g_timeout_add_seconds (SCAN_MISSING_TIME, im_scan_missing, NULL); + } +} + +/* inotify_lock must be held before calling */ +void +_im_rm (inotify_sub *sub) +{ + GList *link; + + link = g_list_find (missing_sub_list, sub); + + if (!link) + { + IM_W ("asked to remove %s from missing list but it isn't on the list!\n", sub->dirname); + return; + } + + IM_W ("removing %s from missing list\n", sub->dirname); + + missing_sub_list = g_list_remove_link (missing_sub_list, link); + g_list_free_1 (link); +} + +/* Scans the list of missing subscriptions checking if they + * are available yet. + */ +static gboolean +im_scan_missing (gpointer user_data) +{ + GList *nolonger_missing = NULL; + GList *l; + + G_LOCK (inotify_lock); + + IM_W ("scanning missing list with %d items\n", g_list_length (missing_sub_list)); + for (l = missing_sub_list; l; l = l->next) + { + inotify_sub *sub = l->data; + gboolean not_m = FALSE; + + IM_W ("checking %p\n", sub); + g_assert (sub); + g_assert (sub->dirname); + not_m = _ip_start_watching (sub); + + if (not_m) + { + missing_cb (sub); + IM_W ("removed %s from missing list\n", sub->dirname); + /* We have to build a list of list nodes to remove from the + * missing_sub_list. We do the removal outside of this loop. + */ + nolonger_missing = g_list_prepend (nolonger_missing, l); + } + } + + for (l = nolonger_missing; l ; l = l->next) + { + GList *llink = l->data; + missing_sub_list = g_list_remove_link (missing_sub_list, llink); + g_list_free_1 (llink); + } + + g_list_free (nolonger_missing); + + /* If the missing list is now empty, we disable the timeout */ + if (missing_sub_list == NULL) + { + scan_missing_running = FALSE; + G_UNLOCK (inotify_lock); + return FALSE; + } + else + { + G_UNLOCK (inotify_lock); + return TRUE; + } +} + + +/* inotify_lock must be held */ +void +_im_diag_dump (GIOChannel *ioc) +{ + GList *l; + g_io_channel_write_chars (ioc, "missing list:\n", -1, NULL, NULL); + for (l = missing_sub_list; l; l = l->next) + { + inotify_sub *sub = l->data; + g_io_channel_write_chars (ioc, sub->dirname, -1, NULL, NULL); + g_io_channel_write_chars (ioc, "\n", -1, NULL, NULL); + } +} diff --git a/gio/inotify/inotify-missing.h b/gio/inotify/inotify-missing.h new file mode 100644 index 0000000..b67b595 --- /dev/null +++ b/gio/inotify/inotify-missing.h @@ -0,0 +1,35 @@ +/* inotify-helper.h - GNOME VFS Monitor using inotify + + Copyright (C) 2006 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: John McCutchan +*/ + + +#ifndef __INOTIFY_MISSING_H +#define __INOTIFY_MISSING_H + +#include "inotify-sub.h" + +void _im_startup (void (*missing_cb)(inotify_sub *sub)); +void _im_add (inotify_sub *sub); +void _im_rm (inotify_sub *sub); +void _im_diag_dump (GIOChannel *ioc); + + +#endif /* __INOTIFY_MISSING_H */ diff --git a/gio/inotify/inotify-path.c b/gio/inotify/inotify-path.c new file mode 100644 index 0000000..9ff20c8 --- /dev/null +++ b/gio/inotify/inotify-path.c @@ -0,0 +1,440 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ + +/* inotify-path.c - GVFS Directory Monitor based on inotify. + + Copyright (C) 2006 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors: + John McCutchan +*/ + +#include "config.h" + +/* Don't put conflicting kernel types in the global namespace: */ +#define __KERNEL_STRICT_NAMES + +#include +#include +#include +#include "inotify-kernel.h" +#include "inotify-path.h" +#include "inotify-missing.h" + +#define IP_INOTIFY_MASK (IN_MODIFY|IN_ATTRIB|IN_MOVED_FROM|IN_MOVED_TO|IN_DELETE|IN_CREATE|IN_DELETE_SELF|IN_UNMOUNT|IN_MOVE_SELF|IN_CLOSE_WRITE) + +/* Older libcs don't have this */ +#ifndef IN_ONLYDIR +#define IN_ONLYDIR 0 +#endif + +typedef struct ip_watched_dir_s { + char *path; + /* TODO: We need to maintain a tree of watched directories + * so that we can deliver move/delete events to sub folders. + * Or the application could do it... + */ + struct ip_watched_dir_s* parent; + GList* children; + + /* Inotify state */ + gint32 wd; + + /* List of inotify subscriptions */ + GList *subs; +} ip_watched_dir_t; + +static gboolean ip_debug_enabled = FALSE; +#define IP_W if (ip_debug_enabled) g_warning + +/* path -> ip_watched_dir */ +static GHashTable * path_dir_hash = NULL; +/* inotify_sub * -> ip_watched_dir * + * + * Each subscription is attached to a watched directory or it is on + * the missing list + */ +static GHashTable * sub_dir_hash = NULL; +/* This hash holds GLists of ip_watched_dir_t *'s + * We need to hold a list because symbolic links can share + * the same wd + */ +static GHashTable * wd_dir_hash = NULL; + +static ip_watched_dir_t *ip_watched_dir_new (const char *path, + int wd); +static void ip_watched_dir_free (ip_watched_dir_t *dir); +static void ip_event_callback (ik_event_t *event); + + +static void (*event_callback)(ik_event_t *event, inotify_sub *sub); + +gboolean +_ip_startup (void (*cb)(ik_event_t *event, inotify_sub *sub)) +{ + static gboolean initialized = FALSE; + static gboolean result = FALSE; + + if (initialized == TRUE) + return result; + + event_callback = cb; + result = _ik_startup (ip_event_callback); + + if (!result) + return FALSE; + + path_dir_hash = g_hash_table_new (g_str_hash, g_str_equal); + sub_dir_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + wd_dir_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + + initialized = TRUE; + return TRUE; +} + +static void +ip_map_path_dir (const char *path, + ip_watched_dir_t *dir) +{ + g_assert (path && dir); + g_hash_table_insert (path_dir_hash, dir->path, dir); +} + +static void +ip_map_sub_dir (inotify_sub *sub, + ip_watched_dir_t *dir) +{ + /* Associate subscription and directory */ + g_assert (dir && sub); + g_hash_table_insert (sub_dir_hash, sub, dir); + dir->subs = g_list_prepend (dir->subs, sub); +} + +static void +ip_map_wd_dir (gint32 wd, + ip_watched_dir_t *dir) +{ + GList *dir_list; + + g_assert (wd >= 0 && dir); + dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (wd)); + dir_list = g_list_prepend (dir_list, dir); + g_hash_table_replace (wd_dir_hash, GINT_TO_POINTER (dir->wd), dir_list); +} + +gboolean +_ip_start_watching (inotify_sub *sub) +{ + gint32 wd; + int err; + ip_watched_dir_t *dir; + + g_assert (sub); + g_assert (!sub->cancelled); + g_assert (sub->dirname); + + IP_W ("Starting to watch %s\n", sub->dirname); + dir = g_hash_table_lookup (path_dir_hash, sub->dirname); + if (dir) + { + IP_W ("Already watching\n"); + goto out; + } + + IP_W ("Trying to add inotify watch "); + wd = _ik_watch (sub->dirname, IP_INOTIFY_MASK|IN_ONLYDIR, &err); + if (wd < 0) + { + IP_W ("Failed\n"); + return FALSE; + } + else + { + /* Create new watched directory and associate it with the + * wd hash and path hash + */ + IP_W ("Success\n"); + dir = ip_watched_dir_new (sub->dirname, wd); + ip_map_wd_dir (wd, dir); + ip_map_path_dir (sub->dirname, dir); + } + + out: + ip_map_sub_dir (sub, dir); + + return TRUE; +} + +static void +ip_unmap_path_dir (const char *path, + ip_watched_dir_t *dir) +{ + g_assert (path && dir); + g_hash_table_remove (path_dir_hash, dir->path); +} + +static void +ip_unmap_wd_dir (gint32 wd, + ip_watched_dir_t *dir) +{ + GList *dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (wd)); + + if (!dir_list) + return; + + g_assert (wd >= 0 && dir); + dir_list = g_list_remove (dir_list, dir); + if (dir_list == NULL) + g_hash_table_remove (wd_dir_hash, GINT_TO_POINTER (dir->wd)); + else + g_hash_table_replace (wd_dir_hash, GINT_TO_POINTER (dir->wd), dir_list); +} + +static void +ip_unmap_wd (gint32 wd) +{ + GList *dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (wd)); + if (!dir_list) + return; + g_assert (wd >= 0); + g_hash_table_remove (wd_dir_hash, GINT_TO_POINTER (wd)); + g_list_free (dir_list); +} + +static void +ip_unmap_sub_dir (inotify_sub *sub, + ip_watched_dir_t *dir) +{ + g_assert (sub && dir); + g_hash_table_remove (sub_dir_hash, sub); + dir->subs = g_list_remove (dir->subs, sub); +} + +static void +ip_unmap_all_subs (ip_watched_dir_t *dir) +{ + GList *l = NULL; + + for (l = dir->subs; l; l = l->next) + { + inotify_sub *sub = l->data; + g_hash_table_remove (sub_dir_hash, sub); + } + g_list_free (dir->subs); + dir->subs = NULL; +} + +gboolean +_ip_stop_watching (inotify_sub *sub) +{ + ip_watched_dir_t *dir = NULL; + + dir = g_hash_table_lookup (sub_dir_hash, sub); + if (!dir) + return TRUE; + + ip_unmap_sub_dir (sub, dir); + + /* No one is subscribing to this directory any more */ + if (dir->subs == NULL) + { + _ik_ignore (dir->path, dir->wd); + ip_unmap_wd_dir (dir->wd, dir); + ip_unmap_path_dir (dir->path, dir); + ip_watched_dir_free (dir); + } + + return TRUE; +} + + +static ip_watched_dir_t * +ip_watched_dir_new (const char *path, + gint32 wd) +{ + ip_watched_dir_t *dir = g_new0 (ip_watched_dir_t, 1); + + dir->path = g_strdup (path); + dir->wd = wd; + + return dir; +} + +static void +ip_watched_dir_free (ip_watched_dir_t *dir) +{ + g_assert (dir->subs == NULL); + g_free (dir->path); + g_free (dir); +} + +static void +ip_wd_delete (gpointer data, + gpointer user_data) +{ + ip_watched_dir_t *dir = data; + GList *l = NULL; + + for (l = dir->subs; l; l = l->next) + { + inotify_sub *sub = l->data; + /* Add subscription to missing list */ + _im_add (sub); + } + ip_unmap_all_subs (dir); + /* Unassociate the path and the directory */ + ip_unmap_path_dir (dir->path, dir); + ip_watched_dir_free (dir); +} + +static void +ip_event_dispatch (GList *dir_list, + GList *pair_dir_list, + ik_event_t *event) +{ + GList *dirl; + + if (!event) + return; + + for (dirl = dir_list; dirl; dirl = dirl->next) + { + GList *subl; + ip_watched_dir_t *dir = dirl->data; + + for (subl = dir->subs; subl; subl = subl->next) + { + inotify_sub *sub = subl->data; + + /* If the subscription and the event + * contain a filename and they don't + * match, we don't deliver this event. + */ + if (sub->filename && + event->name && + strcmp (sub->filename, event->name)) + continue; + + /* If the subscription has a filename + * but this event doesn't, we don't + * deliever this event. + */ + if (sub->filename && !event->name) + continue; + + /* FIXME: We might need to synthesize + * DELETE/UNMOUNT events when + * the filename doesn't match + */ + + event_callback (event, sub); + } + } + + if (!event->pair) + return; + + for (dirl = pair_dir_list; dirl; dirl = dirl->next) + { + GList *subl; + ip_watched_dir_t *dir = dirl->data; + + for (subl = dir->subs; subl; subl = subl->next) + { + inotify_sub *sub = subl->data; + + /* If the subscription and the event + * contain a filename and they don't + * match, we don't deliver this event. + */ + if (sub->filename && + event->pair->name && + strcmp (sub->filename, event->pair->name)) + continue; + + /* If the subscription has a filename + * but this event doesn't, we don't + * deliever this event. + */ + if (sub->filename && !event->pair->name) + continue; + + /* FIXME: We might need to synthesize + * DELETE/UNMOUNT events when + * the filename doesn't match + */ + + event_callback (event->pair, sub); + } + } +} + +static void +ip_event_callback (ik_event_t *event) +{ + GList* dir_list = NULL; + GList* pair_dir_list = NULL; + + dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (event->wd)); + + /* We can ignore the IGNORED events */ + if (event->mask & IN_IGNORED) + { + _ik_event_free (event); + return; + } + + if (event->pair) + pair_dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (event->pair->wd)); + + if (event->mask & IP_INOTIFY_MASK) + ip_event_dispatch (dir_list, pair_dir_list, event); + + /* We have to manage the missing list + * when we get an event that means the + * file has been deleted/moved/unmounted. + */ + if (event->mask & IN_DELETE_SELF || + event->mask & IN_MOVE_SELF || + event->mask & IN_UNMOUNT) + { + /* Add all subscriptions to missing list */ + g_list_foreach (dir_list, ip_wd_delete, NULL); + /* Unmap all directories attached to this wd */ + ip_unmap_wd (event->wd); + } + + _ik_event_free (event); +} + +const char * +_ip_get_path_for_wd (gint32 wd) +{ + GList *dir_list; + ip_watched_dir_t *dir; + + g_assert (wd >= 0); + dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (wd)); + if (dir_list) + { + dir = dir_list->data; + if (dir) + return dir->path; + } + + return NULL; +} diff --git a/gio/inotify/inotify-path.h b/gio/inotify/inotify-path.h new file mode 100644 index 0000000..327dc70 --- /dev/null +++ b/gio/inotify/inotify-path.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2005 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors:. + John McCutchan +*/ + +#ifndef __INOTIFY_PATH_H +#define __INOTIFY_PATH_H + +#include "inotify-kernel.h" +#include "inotify-sub.h" + +gboolean _ip_startup (void (*event_cb)(ik_event_t *event, inotify_sub *sub)); +gboolean _ip_start_watching (inotify_sub *sub); +gboolean _ip_stop_watching (inotify_sub *sub); +const char * _ip_get_path_for_wd (gint32 wd); +#endif diff --git a/gio/inotify/inotify-sub.c b/gio/inotify/inotify-sub.c new file mode 100644 index 0000000..fa2e934 --- /dev/null +++ b/gio/inotify/inotify-sub.c @@ -0,0 +1,72 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ + +/* inotify-sub.c - GMonitor based on inotify. + + Copyright (C) 2006 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Authors: + John McCutchan +*/ + +#include "config.h" +#include +#include + +#include "inotify-sub.h" + +static gboolean is_debug_enabled = FALSE; +#define IS_W if (is_debug_enabled) g_warning + +static gchar* +dup_dirname (const gchar *dirname) +{ + gchar *d_dirname = g_strdup (dirname); + size_t len = strlen (d_dirname); + + if (d_dirname[len - 1] == '/') + d_dirname[len - 1] = '\0'; + + return d_dirname; +} + +inotify_sub* +_ih_sub_new (const gchar *dirname, + const gchar *filename, + gboolean pair_moves, + gpointer user_data) +{ + inotify_sub *sub = NULL; + + sub = g_new0 (inotify_sub, 1); + sub->dirname = dup_dirname (dirname); + sub->filename = g_strdup (filename); + sub->pair_moves = pair_moves; + sub->user_data = user_data; + + IS_W ("new subscription for %s being setup\n", sub->dirname); + + return sub; +} + +void +_ih_sub_free (inotify_sub *sub) +{ + g_free (sub->dirname); + g_free (sub->filename); + g_free (sub); +} diff --git a/gio/inotify/inotify-sub.h b/gio/inotify/inotify-sub.h new file mode 100644 index 0000000..7c9b087 --- /dev/null +++ b/gio/inotify/inotify-sub.h @@ -0,0 +1,39 @@ +/* inotify-sub.h - GVFS Directory Monitor using inotify + + Copyright (C) 2006 John McCutchan + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: John McCutchan +*/ + + +#ifndef __INOTIFY_SUB_H +#define __INOTIFY_SUB_H + +typedef struct +{ + gchar* dirname; + gchar* filename; + gboolean cancelled; + gpointer user_data; + gboolean pair_moves; +} inotify_sub; + +inotify_sub* _ih_sub_new (const gchar* dirname, const gchar* filename, gboolean pair_moves, gpointer user_data); +void _ih_sub_free (inotify_sub* sub); + +#endif /* __INOTIFY_SUB_H */ diff --git a/gio/libasyncns/Makefile.am b/gio/libasyncns/Makefile.am new file mode 100644 index 0000000..80b20a2 --- /dev/null +++ b/gio/libasyncns/Makefile.am @@ -0,0 +1,15 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +INCLUDES = -I$(top_srcdir) + +noinst_LTLIBRARIES = libasyncns.la + +libasyncns_la_SOURCES = \ + asyncns.c \ + asyncns.h \ + g-asyncns.h + +libasyncns_la_LIBADD = $(LIBASYNCNS_LIBADD) + +EXTRA_DIST += README update.sh diff --git a/gio/libasyncns/Makefile.in b/gio/libasyncns/Makefile.in new file mode 100644 index 0000000..b0d31c4 --- /dev/null +++ b/gio/libasyncns/Makefile.in @@ -0,0 +1,658 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = gio/libasyncns +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +am__DEPENDENCIES_1 = +libasyncns_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libasyncns_la_OBJECTS = asyncns.lo +libasyncns_la_OBJECTS = $(am_libasyncns_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libasyncns_la_SOURCES) +DIST_SOURCES = $(libasyncns_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = README update.sh +TEST_PROGS = +INCLUDES = -I$(top_srcdir) +noinst_LTLIBRARIES = libasyncns.la +libasyncns_la_SOURCES = \ + asyncns.c \ + asyncns.h \ + g-asyncns.h + +libasyncns_la_LIBADD = $(LIBASYNCNS_LIBADD) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/libasyncns/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/libasyncns/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 +libasyncns.la: $(libasyncns_la_OBJECTS) $(libasyncns_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libasyncns_la_OBJECTS) $(libasyncns_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asyncns.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gio/libasyncns/README b/gio/libasyncns/README new file mode 100644 index 0000000..b926291 --- /dev/null +++ b/gio/libasyncns/README @@ -0,0 +1,7 @@ +The sources are derived from Lennart Poettering's libasyncns library: + + http://0pointer.de/lennart/projects/libasyncns/ + +The 'update.sh' script in this directory, when pointed at +the original sources updates the files in this directory +to the new version diff --git a/gio/libasyncns/asyncns.c b/gio/libasyncns/asyncns.c new file mode 100644 index 0000000..155f491 --- /dev/null +++ b/gio/libasyncns/asyncns.c @@ -0,0 +1,1533 @@ +/*** + This file is part of libasyncns. + + Copyright 2005-2008 Lennart Poettering + + libasyncns 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. + + libasyncns 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 libasyncns. If not, see + . +***/ + +#ifdef HAVE_CONFIG_H +#include "g-asyncns.h" +#endif + +/* #undef HAVE_PTHREAD */ + +#include +#include +#include +#include + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#include +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + +#if HAVE_PTHREAD +#include +#endif + +#include "asyncns.h" + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +#define MAX_WORKERS 16 +#define MAX_QUERIES 256 +#define BUFSIZE (10240) + +typedef enum { + REQUEST_ADDRINFO, + RESPONSE_ADDRINFO, + REQUEST_NAMEINFO, + RESPONSE_NAMEINFO, + REQUEST_RES_QUERY, + REQUEST_RES_SEARCH, + RESPONSE_RES, + REQUEST_TERMINATE, + RESPONSE_DIED +} query_type_t; + +enum { + REQUEST_RECV_FD = 0, + REQUEST_SEND_FD = 1, + RESPONSE_RECV_FD = 2, + RESPONSE_SEND_FD = 3, + MESSAGE_FD_MAX = 4 +}; + +struct asyncns { + int fds[4]; + +#ifndef HAVE_PTHREAD + pid_t workers[MAX_WORKERS]; +#else + pthread_t workers[MAX_WORKERS]; +#endif + unsigned valid_workers; + + unsigned current_id, current_index; + _g_asyncns_query_t* queries[MAX_QUERIES]; + + _g_asyncns_query_t *done_head, *done_tail; + + int n_queries; + int dead; +}; + +struct _g_asyncns_query { + _g_asyncns_t *asyncns; + int done; + unsigned id; + query_type_t type; + _g_asyncns_query_t *done_next, *done_prev; + int ret; + int _errno; + int _h_errno; + struct addrinfo *addrinfo; + char *serv, *host; + void *userdata; +}; + +typedef struct rheader { + query_type_t type; + unsigned id; + size_t length; +} rheader_t; + +typedef struct addrinfo_request { + struct rheader header; + int hints_is_null; + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t node_len, service_len; +} addrinfo_request_t; + +typedef struct addrinfo_response { + struct rheader header; + int ret; + int _errno; + int _h_errno; + /* followed by addrinfo_serialization[] */ +} addrinfo_response_t; + +typedef struct addrinfo_serialization { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + size_t canonname_len; + /* Followed by ai_addr amd ai_canonname with variable lengths */ +} addrinfo_serialization_t; + +typedef struct nameinfo_request { + struct rheader header; + int flags; + socklen_t sockaddr_len; + int gethost, getserv; +} nameinfo_request_t; + +typedef struct nameinfo_response { + struct rheader header; + size_t hostlen, servlen; + int ret; + int _errno; + int _h_errno; +} nameinfo_response_t; + +typedef struct res_request { + struct rheader header; + int class; + int type; + size_t dname_len; +} res_request_t; + +typedef struct res_response { + struct rheader header; + int ret; + int _errno; + int _h_errno; +} res_response_t; + +typedef union packet { + rheader_t rheader; + addrinfo_request_t addrinfo_request; + addrinfo_response_t addrinfo_response; + nameinfo_request_t nameinfo_request; + nameinfo_response_t nameinfo_response; + res_request_t res_request; + res_response_t res_response; +} packet_t; + +#ifndef HAVE_STRNDUP + +static char *strndup(const char *s, size_t l) { + size_t a; + char *n; + + a = strlen(s); + if (a > l) + a = l; + + if (!(n = malloc(a+1))) + return NULL; + + memcpy(n, s, a); + n[a] = 0; + + return n; +} + +#endif + +#ifndef HAVE_PTHREAD + +static int close_allv(const int except_fds[]) { + struct rlimit rl; + int fd, maxfd; + +#ifdef __linux__ + + DIR *d; + + assert(except_fds); + + if ((d = opendir("/proc/self/fd"))) { + + struct dirent *de; + + while ((de = readdir(d))) { + int found; + long l; + char *e = NULL; + int i; + + if (de->d_name[0] == '.') + continue; + + errno = 0; + l = strtol(de->d_name, &e, 10); + if (errno != 0 || !e || *e) { + closedir(d); + errno = EINVAL; + return -1; + } + + fd = (int) l; + + if ((long) fd != l) { + closedir(d); + errno = EINVAL; + return -1; + } + + if (fd < 3) + continue; + + if (fd == dirfd(d)) + continue; + + found = 0; + for (i = 0; except_fds[i] >= 0; i++) + if (except_fds[i] == fd) { + found = 1; + break; + } + + if (found) + continue; + + if (close(fd) < 0) { + int saved_errno; + + saved_errno = errno; + closedir(d); + errno = saved_errno; + + return -1; + } + } + + closedir(d); + return 0; + } + +#endif + + if (getrlimit(RLIMIT_NOFILE, &rl) > 0) + maxfd = (int) rl.rlim_max; + else + maxfd = sysconf(_SC_OPEN_MAX); + + for (fd = 3; fd < maxfd; fd++) { + int i, found; + + found = 0; + for (i = 0; except_fds[i] >= 0; i++) + if (except_fds[i] == fd) { + found = 1; + continue; + } + + if (found) + continue; + + if (close(fd) < 0 && errno != EBADF) + return -1; + } + + return 0; +} + +static int reset_sigsv(const int except[]) { + int sig; + assert(except); + + for (sig = 1; sig < NSIG; sig++) { + int reset = 1; + + switch (sig) { + case SIGKILL: + case SIGSTOP: + reset = 0; + break; + + default: { + int i; + + for (i = 0; except[i] > 0; i++) { + if (sig == except[i]) { + reset = 0; + break; + } + } + } + } + + if (reset) { + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_DFL; + + /* On Linux the first two RT signals are reserved by + * glibc, and sigaction() will return EINVAL for them. */ + if ((sigaction(sig, &sa, NULL) < 0)) + if (errno != EINVAL) + return -1; + } + } + + return 0; +} + +static int ignore_sigsv(const int ignore[]) { + int i; + assert(ignore); + + for (i = 0; ignore[i] > 0; i++) { + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_IGN; + + if ((sigaction(ignore[i], &sa, NULL) < 0)) + return -1; + } + + return 0; +} + +#endif + +static int fd_nonblock(int fd) { + int i; + assert(fd >= 0); + + if ((i = fcntl(fd, F_GETFL, 0)) < 0) + return -1; + + if (i & O_NONBLOCK) + return 0; + + return fcntl(fd, F_SETFL, i | O_NONBLOCK); +} + +static int fd_cloexec(int fd) { + int v; + assert(fd >= 0); + + if ((v = fcntl(fd, F_GETFD, 0)) < 0) + return -1; + + if (v & FD_CLOEXEC) + return 0; + + return fcntl(fd, F_SETFD, v | FD_CLOEXEC); +} + +static int send_died(int out_fd) { + rheader_t rh; + assert(out_fd > 0); + + memset(&rh, 0, sizeof(rh)); + rh.type = RESPONSE_DIED; + rh.id = 0; + rh.length = sizeof(rh); + + return send(out_fd, &rh, rh.length, MSG_NOSIGNAL); +} + +static void *serialize_addrinfo(void *p, const struct addrinfo *ai, size_t *length, size_t maxlength) { + addrinfo_serialization_t s; + size_t cnl, l; + assert(p); + assert(ai); + assert(length); + assert(*length <= maxlength); + + cnl = (ai->ai_canonname ? strlen(ai->ai_canonname)+1 : 0); + l = sizeof(addrinfo_serialization_t) + ai->ai_addrlen + cnl; + + if (*length + l > maxlength) + return NULL; + + s.ai_flags = ai->ai_flags; + s.ai_family = ai->ai_family; + s.ai_socktype = ai->ai_socktype; + s.ai_protocol = ai->ai_protocol; + s.ai_addrlen = ai->ai_addrlen; + s.canonname_len = cnl; + + memcpy((uint8_t*) p, &s, sizeof(addrinfo_serialization_t)); + memcpy((uint8_t*) p + sizeof(addrinfo_serialization_t), ai->ai_addr, ai->ai_addrlen); + + if (ai->ai_canonname) + strcpy((char*) p + sizeof(addrinfo_serialization_t) + ai->ai_addrlen, ai->ai_canonname); + + *length += l; + return (uint8_t*) p + l; +} + +static int send_addrinfo_reply(int out_fd, unsigned id, int ret, struct addrinfo *ai, int _errno, int _h_errno) { + addrinfo_response_t data[BUFSIZE/sizeof(addrinfo_response_t) + 1]; + addrinfo_response_t *resp = data; + assert(out_fd >= 0); + + memset(data, 0, sizeof(data)); + resp->header.type = RESPONSE_ADDRINFO; + resp->header.id = id; + resp->header.length = sizeof(addrinfo_response_t); + resp->ret = ret; + resp->_errno = _errno; + resp->_h_errno = _h_errno; + + if (ret == 0 && ai) { + void *p = data + 1; + struct addrinfo *k; + + for (k = ai; k; k = k->ai_next) { + + if (!(p = serialize_addrinfo(p, k, &resp->header.length, (char*) data + BUFSIZE - (char*) p))) { + resp->ret = EAI_MEMORY; + break; + } + } + } + + if (ai) + freeaddrinfo(ai); + + return send(out_fd, resp, resp->header.length, MSG_NOSIGNAL); +} + +static int send_nameinfo_reply(int out_fd, unsigned id, int ret, const char *host, const char *serv, int _errno, int _h_errno) { + nameinfo_response_t data[BUFSIZE/sizeof(nameinfo_response_t) + 1]; + size_t hl, sl; + nameinfo_response_t *resp = data; + + assert(out_fd >= 0); + + sl = serv ? strlen(serv)+1 : 0; + hl = host ? strlen(host)+1 : 0; + + memset(data, 0, sizeof(data)); + resp->header.type = RESPONSE_NAMEINFO; + resp->header.id = id; + resp->header.length = sizeof(nameinfo_response_t) + hl + sl; + resp->ret = ret; + resp->_errno = _errno; + resp->_h_errno = _h_errno; + resp->hostlen = hl; + resp->servlen = sl; + + assert(sizeof(data) >= resp->header.length); + + if (host) + memcpy((uint8_t *)data + sizeof(nameinfo_response_t), host, hl); + + if (serv) + memcpy((uint8_t *)data + sizeof(nameinfo_response_t) + hl, serv, sl); + + return send(out_fd, resp, resp->header.length, MSG_NOSIGNAL); +} + +static int send_res_reply(int out_fd, unsigned id, const unsigned char *answer, int ret, int _errno, int _h_errno) { + res_response_t data[BUFSIZE/sizeof(res_response_t) + 1]; + res_response_t *resp = data; + + assert(out_fd >= 0); + + memset(data, 0, sizeof(data)); + resp->header.type = RESPONSE_RES; + resp->header.id = id; + resp->header.length = sizeof(res_response_t) + (ret < 0 ? 0 : ret); + resp->ret = ret; + resp->_errno = _errno; + resp->_h_errno = _h_errno; + + assert(sizeof(data) >= resp->header.length); + + if (ret > 0) + memcpy((uint8_t *)data + sizeof(res_response_t), answer, ret); + + return send(out_fd, resp, resp->header.length, MSG_NOSIGNAL); +} + +static int handle_request(int out_fd, const packet_t *packet, size_t length) { + const rheader_t *req; + assert(out_fd >= 0); + + req = &packet->rheader; + assert(req); + assert(length >= sizeof(rheader_t)); + assert(length == req->length); + + switch (req->type) { + + case REQUEST_ADDRINFO: { + struct addrinfo ai, *result = NULL; + const addrinfo_request_t *ai_req = &packet->addrinfo_request; + const char *node, *service; + int ret; + + assert(length >= sizeof(addrinfo_request_t)); + assert(length == sizeof(addrinfo_request_t) + ai_req->node_len + ai_req->service_len); + + memset(&ai, 0, sizeof(ai)); + ai.ai_flags = ai_req->ai_flags; + ai.ai_family = ai_req->ai_family; + ai.ai_socktype = ai_req->ai_socktype; + ai.ai_protocol = ai_req->ai_protocol; + + node = ai_req->node_len ? (const char*) ai_req + sizeof(addrinfo_request_t) : NULL; + service = ai_req->service_len ? (const char*) ai_req + sizeof(addrinfo_request_t) + ai_req->node_len : NULL; + + ret = getaddrinfo(node, service, + ai_req->hints_is_null ? NULL : &ai, + &result); + + /* send_addrinfo_reply() frees result */ + return send_addrinfo_reply(out_fd, req->id, ret, result, errno, h_errno); + } + + case REQUEST_NAMEINFO: { + int ret; + const nameinfo_request_t *ni_req = &packet->nameinfo_request; + char hostbuf[NI_MAXHOST], servbuf[NI_MAXSERV]; + struct sockaddr_storage sa; + + assert(length >= sizeof(nameinfo_request_t)); + assert(length == sizeof(nameinfo_request_t) + ni_req->sockaddr_len); + + memcpy(&sa, (const uint8_t *) ni_req + sizeof(nameinfo_request_t), ni_req->sockaddr_len); + + ret = getnameinfo((struct sockaddr *)&sa, ni_req->sockaddr_len, + ni_req->gethost ? hostbuf : NULL, ni_req->gethost ? sizeof(hostbuf) : 0, + ni_req->getserv ? servbuf : NULL, ni_req->getserv ? sizeof(servbuf) : 0, + ni_req->flags); + + return send_nameinfo_reply(out_fd, req->id, ret, + ret == 0 && ni_req->gethost ? hostbuf : NULL, + ret == 0 && ni_req->getserv ? servbuf : NULL, + errno, h_errno); + } + + case REQUEST_RES_QUERY: + case REQUEST_RES_SEARCH: { + int ret; + HEADER answer[BUFSIZE/sizeof(HEADER) + 1]; + const res_request_t *res_req = &packet->res_request; + const char *dname; + + assert(length >= sizeof(res_request_t)); + assert(length == sizeof(res_request_t) + res_req->dname_len); + + dname = (const char *) req + sizeof(res_request_t); + + if (req->type == REQUEST_RES_QUERY) + ret = res_query(dname, res_req->class, res_req->type, (unsigned char *) answer, BUFSIZE); + else + ret = res_search(dname, res_req->class, res_req->type, (unsigned char *) answer, BUFSIZE); + + return send_res_reply(out_fd, req->id, (unsigned char *) answer, ret, errno, h_errno); + } + + case REQUEST_TERMINATE: + /* Quit */ + return -1; + + default: + ; + } + + return 0; +} + +#ifndef HAVE_PTHREAD + +static int process_worker(int in_fd, int out_fd) { + int have_death_sig = 0; + int good_fds[3]; + int ret = 1; + + const int ignore_sigs[] = { + SIGINT, + SIGHUP, + SIGPIPE, + SIGUSR1, + SIGUSR2, + -1 + }; + + assert(in_fd > 2); + assert(out_fd > 2); + + close(0); + close(1); + close(2); + + if (open("/dev/null", O_RDONLY) != 0) + goto fail; + + if (open("/dev/null", O_WRONLY) != 1) + goto fail; + + if (open("/dev/null", O_WRONLY) != 2) + goto fail; + + if (chdir("/") < 0) + goto fail; + + if (geteuid() == 0) { + struct passwd *pw; + int r; + + if ((pw = getpwnam("nobody"))) { +#ifdef HAVE_SETRESUID + r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid); +#elif HAVE_SETREUID + r = setreuid(pw->pw_uid, pw->pw_uid); +#else + if ((r = setuid(pw->pw_uid)) >= 0) + r = seteuid(pw->pw_uid); +#endif + if (r < 0) + goto fail; + } + } + + if (reset_sigsv(ignore_sigs) < 0) + goto fail; + + if (ignore_sigsv(ignore_sigs) < 0) + goto fail; + + good_fds[0] = in_fd; good_fds[1] = out_fd; good_fds[2] = -1; + if (close_allv(good_fds) < 0) + goto fail; + +#ifdef PR_SET_PDEATHSIG + if (prctl(PR_SET_PDEATHSIG, SIGTERM) >= 0) + have_death_sig = 1; +#endif + + if (!have_death_sig) + fd_nonblock(in_fd); + + while (getppid() > 1) { /* if the parent PID is 1 our parent process died. */ + packet_t buf[BUFSIZE/sizeof(packet_t) + 1]; + ssize_t length; + + if (!have_death_sig) { + fd_set fds; + struct timeval tv = { 0, 500000 }; + + FD_ZERO(&fds); + FD_SET(in_fd, &fds); + + if (select(in_fd+1, &fds, NULL, NULL, &tv) < 0) + break; + + if (getppid() == 1) + break; + } + + if ((length = recv(in_fd, buf, sizeof(buf), 0)) <= 0) { + + if (length < 0 && + (errno == EAGAIN || errno == EINTR)) + continue; + + break; + } + + if (handle_request(out_fd, buf, (size_t) length) < 0) + break; + } + + ret = 0; + +fail: + send_died(out_fd); + + return ret; +} + +#else + +static void* thread_worker(void *p) { + _g_asyncns_t *asyncns = p; + sigset_t fullset; + + /* No signals in this thread please */ + sigfillset(&fullset); + pthread_sigmask(SIG_BLOCK, &fullset, NULL); + + while (!asyncns->dead) { + packet_t buf[BUFSIZE/sizeof(packet_t) + 1]; + ssize_t length; + + if ((length = recv(asyncns->fds[REQUEST_RECV_FD], buf, sizeof(buf), 0)) <= 0) { + + if (length < 0 && + (errno == EAGAIN || errno == EINTR)) + continue; + + break; + } + + if (asyncns->dead) + break; + + if (handle_request(asyncns->fds[RESPONSE_SEND_FD], buf, (size_t) length) < 0) + break; + } + + send_died(asyncns->fds[RESPONSE_SEND_FD]); + + return NULL; +} + +#endif + +_g_asyncns_t* _g_asyncns_new(unsigned n_proc) { + _g_asyncns_t *asyncns = NULL; + int i; + assert(n_proc >= 1); + + if (n_proc > MAX_WORKERS) + n_proc = MAX_WORKERS; + + if (!(asyncns = malloc(sizeof(_g_asyncns_t)))) { + errno = ENOMEM; + goto fail; + } + + asyncns->dead = 0; + asyncns->valid_workers = 0; + + for (i = 0; i < MESSAGE_FD_MAX; i++) + asyncns->fds[i] = -1; + + memset(asyncns->queries, 0, sizeof(asyncns->queries)); + + if (socketpair(PF_UNIX, SOCK_DGRAM, 0, asyncns->fds) < 0 || + socketpair(PF_UNIX, SOCK_DGRAM, 0, asyncns->fds+2) < 0) + goto fail; + + for (i = 0; i < MESSAGE_FD_MAX; i++) + fd_cloexec(asyncns->fds[i]); + + for (asyncns->valid_workers = 0; asyncns->valid_workers < n_proc; asyncns->valid_workers++) { + +#ifndef HAVE_PTHREAD + if ((asyncns->workers[asyncns->valid_workers] = fork()) < 0) + goto fail; + else if (asyncns->workers[asyncns->valid_workers] == 0) { + int ret; + + close(asyncns->fds[REQUEST_SEND_FD]); + close(asyncns->fds[RESPONSE_RECV_FD]); + ret = process_worker(asyncns->fds[REQUEST_RECV_FD], asyncns->fds[RESPONSE_SEND_FD]); + close(asyncns->fds[REQUEST_RECV_FD]); + close(asyncns->fds[RESPONSE_SEND_FD]); + _exit(ret); + } +#else + int r; + + if ((r = pthread_create(&asyncns->workers[asyncns->valid_workers], NULL, thread_worker, asyncns)) != 0) { + errno = r; + goto fail; + } +#endif + } + +#ifndef HAVE_PTHREAD + close(asyncns->fds[REQUEST_RECV_FD]); + close(asyncns->fds[RESPONSE_SEND_FD]); + asyncns->fds[REQUEST_RECV_FD] = asyncns->fds[RESPONSE_SEND_FD] = -1; +#endif + + asyncns->current_index = asyncns->current_id = 0; + asyncns->done_head = asyncns->done_tail = NULL; + asyncns->n_queries = 0; + + fd_nonblock(asyncns->fds[RESPONSE_RECV_FD]); + + return asyncns; + +fail: + if (asyncns) + _g_asyncns_free(asyncns); + + return NULL; +} + +void _g_asyncns_free(_g_asyncns_t *asyncns) { + int i; + int saved_errno = errno; + unsigned p; + + assert(asyncns); + + asyncns->dead = 1; + + if (asyncns->fds[REQUEST_SEND_FD] >= 0) { + rheader_t req; + + memset(&req, 0, sizeof(req)); + req.type = REQUEST_TERMINATE; + req.length = sizeof(req); + req.id = 0; + + /* Send one termination packet for each worker */ + for (p = 0; p < asyncns->valid_workers; p++) + send(asyncns->fds[REQUEST_SEND_FD], &req, req.length, MSG_NOSIGNAL); + } + + /* Now terminate them and wait until they are gone. */ + for (p = 0; p < asyncns->valid_workers; p++) { +#ifndef HAVE_PTHREAD + kill(asyncns->workers[p], SIGTERM); + for (;;) { + if (waitpid(asyncns->workers[p], NULL, 0) >= 0 || errno != EINTR) + break; + } +#else + for (;;) { + if (pthread_join(asyncns->workers[p], NULL) != EINTR) + break; + } +#endif + } + + /* Close all communication channels */ + for (i = 0; i < MESSAGE_FD_MAX; i++) + if (asyncns->fds[i] >= 0) + close(asyncns->fds[i]); + + for (p = 0; p < MAX_QUERIES; p++) + if (asyncns->queries[p]) + _g_asyncns_cancel(asyncns, asyncns->queries[p]); + + free(asyncns); + + errno = saved_errno; +} + +int _g_asyncns_fd(_g_asyncns_t *asyncns) { + assert(asyncns); + + return asyncns->fds[RESPONSE_RECV_FD]; +} + +static _g_asyncns_query_t *lookup_query(_g_asyncns_t *asyncns, unsigned id) { + _g_asyncns_query_t *q; + assert(asyncns); + + if ((q = asyncns->queries[id % MAX_QUERIES])) + if (q->id == id) + return q; + + return NULL; +} + +static void complete_query(_g_asyncns_t *asyncns, _g_asyncns_query_t *q) { + assert(asyncns); + assert(q); + assert(!q->done); + + q->done = 1; + + if ((q->done_prev = asyncns->done_tail)) + asyncns->done_tail->done_next = q; + else + asyncns->done_head = q; + + asyncns->done_tail = q; + q->done_next = NULL; +} + +static const void *unserialize_addrinfo(const void *p, struct addrinfo **ret_ai, size_t *length) { + addrinfo_serialization_t s; + size_t l; + struct addrinfo *ai; + assert(p); + assert(ret_ai); + assert(length); + + if (*length < sizeof(addrinfo_serialization_t)) + return NULL; + + memcpy(&s, p, sizeof(s)); + + l = sizeof(addrinfo_serialization_t) + s.ai_addrlen + s.canonname_len; + if (*length < l) + return NULL; + + if (!(ai = malloc(sizeof(struct addrinfo)))) + goto fail; + + ai->ai_addr = NULL; + ai->ai_canonname = NULL; + ai->ai_next = NULL; + + if (s.ai_addrlen && !(ai->ai_addr = malloc(s.ai_addrlen))) + goto fail; + + if (s.canonname_len && !(ai->ai_canonname = malloc(s.canonname_len))) + goto fail; + + ai->ai_flags = s.ai_flags; + ai->ai_family = s.ai_family; + ai->ai_socktype = s.ai_socktype; + ai->ai_protocol = s.ai_protocol; + ai->ai_addrlen = s.ai_addrlen; + + if (ai->ai_addr) + memcpy(ai->ai_addr, (const uint8_t*) p + sizeof(addrinfo_serialization_t), s.ai_addrlen); + + if (ai->ai_canonname) + memcpy(ai->ai_canonname, (const uint8_t*) p + sizeof(addrinfo_serialization_t) + s.ai_addrlen, s.canonname_len); + + *length -= l; + *ret_ai = ai; + + return (const uint8_t*) p + l; + + +fail: + if (ai) + _g_asyncns_freeaddrinfo(ai); + + return NULL; +} + +static int handle_response(_g_asyncns_t *asyncns, const packet_t *packet, size_t length) { + const rheader_t *resp; + _g_asyncns_query_t *q; + + assert(asyncns); + + resp = &packet->rheader; + assert(resp); + assert(length >= sizeof(rheader_t)); + assert(length == resp->length); + + if (resp->type == RESPONSE_DIED) { + asyncns->dead = 1; + return 0; + } + + if (!(q = lookup_query(asyncns, resp->id))) + return 0; + + switch (resp->type) { + case RESPONSE_ADDRINFO: { + const addrinfo_response_t *ai_resp = &packet->addrinfo_response; + const void *p; + size_t l; + struct addrinfo *prev = NULL; + + assert(length >= sizeof(addrinfo_response_t)); + assert(q->type == REQUEST_ADDRINFO); + + q->ret = ai_resp->ret; + q->_errno = ai_resp->_errno; + q->_h_errno = ai_resp->_h_errno; + l = length - sizeof(addrinfo_response_t); + p = (const uint8_t*) resp + sizeof(addrinfo_response_t); + + while (l > 0 && p) { + struct addrinfo *ai = NULL; + p = unserialize_addrinfo(p, &ai, &l); + + if (!p || !ai) { + q->ret = EAI_MEMORY; + break; + } + + if (prev) + prev->ai_next = ai; + else + q->addrinfo = ai; + + prev = ai; + } + + complete_query(asyncns, q); + break; + } + + case RESPONSE_NAMEINFO: { + const nameinfo_response_t *ni_resp = &packet->nameinfo_response; + + assert(length >= sizeof(nameinfo_response_t)); + assert(q->type == REQUEST_NAMEINFO); + + q->ret = ni_resp->ret; + q->_errno = ni_resp->_errno; + q->_h_errno = ni_resp->_h_errno; + + if (ni_resp->hostlen) + if (!(q->host = strndup((const char*) ni_resp + sizeof(nameinfo_response_t), ni_resp->hostlen-1))) + q->ret = EAI_MEMORY; + + if (ni_resp->servlen) + if (!(q->serv = strndup((const char*) ni_resp + sizeof(nameinfo_response_t) + ni_resp->hostlen, ni_resp->servlen-1))) + q->ret = EAI_MEMORY; + + complete_query(asyncns, q); + break; + } + + case RESPONSE_RES: { + const res_response_t *res_resp = &packet->res_response; + + assert(length >= sizeof(res_response_t)); + assert(q->type == REQUEST_RES_QUERY || q->type == REQUEST_RES_SEARCH); + + q->ret = res_resp->ret; + q->_errno = res_resp->_errno; + q->_h_errno = res_resp->_h_errno; + + if (res_resp->ret >= 0) { + if (!(q->serv = malloc(res_resp->ret))) { + q->ret = -1; + q->_errno = ENOMEM; + } else + memcpy(q->serv, (const char *)resp + sizeof(res_response_t), res_resp->ret); + } + + complete_query(asyncns, q); + break; + } + + default: + ; + } + + return 0; +} + +int _g_asyncns_wait(_g_asyncns_t *asyncns, int block) { + int handled = 0; + assert(asyncns); + + for (;;) { + packet_t buf[BUFSIZE/sizeof(packet_t) + 1]; + ssize_t l; + + if (asyncns->dead) { + errno = ECHILD; + return -1; + } + + if (((l = recv(asyncns->fds[RESPONSE_RECV_FD], buf, sizeof(buf), 0)) < 0)) { + fd_set fds; + + if (errno != EAGAIN) + return -1; + + if (!block || handled) + return 0; + + FD_ZERO(&fds); + FD_SET(asyncns->fds[RESPONSE_RECV_FD], &fds); + + if (select(asyncns->fds[RESPONSE_RECV_FD]+1, &fds, NULL, NULL, NULL) < 0) + return -1; + + continue; + } + + if (handle_response(asyncns, buf, (size_t) l) < 0) + return -1; + + handled = 1; + } +} + +static _g_asyncns_query_t *alloc_query(_g_asyncns_t *asyncns) { + _g_asyncns_query_t *q; + assert(asyncns); + + if (asyncns->n_queries >= MAX_QUERIES) { + errno = ENOMEM; + return NULL; + } + + while (asyncns->queries[asyncns->current_index]) { + + asyncns->current_index++; + asyncns->current_id++; + + while (asyncns->current_index >= MAX_QUERIES) + asyncns->current_index -= MAX_QUERIES; + } + + if (!(q = asyncns->queries[asyncns->current_index] = malloc(sizeof(_g_asyncns_query_t)))) { + errno = ENOMEM; + return NULL; + } + + asyncns->n_queries++; + + q->asyncns = asyncns; + q->done = 0; + q->id = asyncns->current_id; + q->done_next = q->done_prev = NULL; + q->ret = 0; + q->_errno = 0; + q->_h_errno = 0; + q->addrinfo = NULL; + q->userdata = NULL; + q->host = q->serv = NULL; + + return q; +} + +_g_asyncns_query_t* _g_asyncns_getaddrinfo(_g_asyncns_t *asyncns, const char *node, const char *service, const struct addrinfo *hints) { + addrinfo_request_t data[BUFSIZE/sizeof(addrinfo_request_t) + 1]; + addrinfo_request_t *req = data; + _g_asyncns_query_t *q; + assert(asyncns); + assert(node || service); + + if (asyncns->dead) { + errno = ECHILD; + return NULL; + } + + if (!(q = alloc_query(asyncns))) + return NULL; + + memset(req, 0, sizeof(addrinfo_request_t)); + + req->node_len = node ? strlen(node)+1 : 0; + req->service_len = service ? strlen(service)+1 : 0; + + req->header.id = q->id; + req->header.type = q->type = REQUEST_ADDRINFO; + req->header.length = sizeof(addrinfo_request_t) + req->node_len + req->service_len; + + if (req->header.length > BUFSIZE) { + errno = ENOMEM; + goto fail; + } + + if (!(req->hints_is_null = !hints)) { + req->ai_flags = hints->ai_flags; + req->ai_family = hints->ai_family; + req->ai_socktype = hints->ai_socktype; + req->ai_protocol = hints->ai_protocol; + } + + if (node) + strcpy((char*) req + sizeof(addrinfo_request_t), node); + + if (service) + strcpy((char*) req + sizeof(addrinfo_request_t) + req->node_len, service); + + if (send(asyncns->fds[REQUEST_SEND_FD], req, req->header.length, MSG_NOSIGNAL) < 0) + goto fail; + + return q; + +fail: + if (q) + _g_asyncns_cancel(asyncns, q); + + return NULL; +} + +int _g_asyncns_getaddrinfo_done(_g_asyncns_t *asyncns, _g_asyncns_query_t* q, struct addrinfo **ret_res) { + int ret; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(q->type == REQUEST_ADDRINFO); + + if (asyncns->dead) { + errno = ECHILD; + return EAI_SYSTEM; + } + + if (!q->done) + return EAI_AGAIN; + + *ret_res = q->addrinfo; + q->addrinfo = NULL; + + ret = q->ret; + + if (ret == EAI_SYSTEM) + errno = q->_errno; + + if (ret != 0) + h_errno = q->_h_errno; + + _g_asyncns_cancel(asyncns, q); + + return ret; +} + +_g_asyncns_query_t* _g_asyncns_getnameinfo(_g_asyncns_t *asyncns, const struct sockaddr *sa, socklen_t salen, int flags, int gethost, int getserv) { + nameinfo_request_t data[BUFSIZE/sizeof(nameinfo_request_t) + 1]; + nameinfo_request_t *req = data; + _g_asyncns_query_t *q; + + assert(asyncns); + assert(sa); + assert(salen > 0); + + if (asyncns->dead) { + errno = ECHILD; + return NULL; + } + + if (!(q = alloc_query(asyncns))) + return NULL; + + memset(req, 0, sizeof(nameinfo_request_t)); + + req->header.id = q->id; + req->header.type = q->type = REQUEST_NAMEINFO; + req->header.length = sizeof(nameinfo_request_t) + salen; + + if (req->header.length > BUFSIZE) { + errno = ENOMEM; + goto fail; + } + + req->flags = flags; + req->sockaddr_len = salen; + req->gethost = gethost; + req->getserv = getserv; + + memcpy((uint8_t*) req + sizeof(nameinfo_request_t), sa, salen); + + if (send(asyncns->fds[REQUEST_SEND_FD], req, req->header.length, MSG_NOSIGNAL) < 0) + goto fail; + + return q; + +fail: + if (q) + _g_asyncns_cancel(asyncns, q); + + return NULL; +} + +int _g_asyncns_getnameinfo_done(_g_asyncns_t *asyncns, _g_asyncns_query_t* q, char *ret_host, size_t hostlen, char *ret_serv, size_t servlen) { + int ret; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(q->type == REQUEST_NAMEINFO); + assert(!ret_host || hostlen); + assert(!ret_serv || servlen); + + if (asyncns->dead) { + errno = ECHILD; + return EAI_SYSTEM; + } + + if (!q->done) + return EAI_AGAIN; + + if (ret_host && q->host) { + strncpy(ret_host, q->host, hostlen); + ret_host[hostlen-1] = 0; + } + + if (ret_serv && q->serv) { + strncpy(ret_serv, q->serv, servlen); + ret_serv[servlen-1] = 0; + } + + ret = q->ret; + + if (ret == EAI_SYSTEM) + errno = q->_errno; + + if (ret != 0) + h_errno = q->_h_errno; + + _g_asyncns_cancel(asyncns, q); + + return ret; +} + +static _g_asyncns_query_t * _g_asyncns_res(_g_asyncns_t *asyncns, query_type_t qtype, const char *dname, int class, int type) { + res_request_t data[BUFSIZE/sizeof(res_request_t) + 1]; + res_request_t *req = data; + _g_asyncns_query_t *q; + + assert(asyncns); + assert(dname); + + if (asyncns->dead) { + errno = ECHILD; + return NULL; + } + + if (!(q = alloc_query(asyncns))) + return NULL; + + memset(req, 0, sizeof(res_request_t)); + + req->dname_len = strlen(dname) + 1; + + req->header.id = q->id; + req->header.type = q->type = qtype; + req->header.length = sizeof(res_request_t) + req->dname_len; + + if (req->header.length > BUFSIZE) { + errno = ENOMEM; + goto fail; + } + + req->class = class; + req->type = type; + + strcpy((char*) req + sizeof(res_request_t), dname); + + if (send(asyncns->fds[REQUEST_SEND_FD], req, req->header.length, MSG_NOSIGNAL) < 0) + goto fail; + + return q; + +fail: + if (q) + _g_asyncns_cancel(asyncns, q); + + return NULL; +} + +_g_asyncns_query_t* _g_asyncns_res_query(_g_asyncns_t *asyncns, const char *dname, int class, int type) { + return _g_asyncns_res(asyncns, REQUEST_RES_QUERY, dname, class, type); +} + +_g_asyncns_query_t* _g_asyncns_res_search(_g_asyncns_t *asyncns, const char *dname, int class, int type) { + return _g_asyncns_res(asyncns, REQUEST_RES_SEARCH, dname, class, type); +} + +int _g_asyncns_res_done(_g_asyncns_t *asyncns, _g_asyncns_query_t* q, unsigned char **answer) { + int ret; + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(q->type == REQUEST_RES_QUERY || q->type == REQUEST_RES_SEARCH); + assert(answer); + + if (asyncns->dead) { + errno = ECHILD; + return -ECHILD; + } + + if (!q->done) { + errno = EAGAIN; + return -EAGAIN; + } + + *answer = (unsigned char *)q->serv; + q->serv = NULL; + + ret = q->ret; + + if (ret < 0) { + errno = q->_errno; + h_errno = q->_h_errno; + } + + _g_asyncns_cancel(asyncns, q); + + return ret < 0 ? -errno : ret; +} + +_g_asyncns_query_t* _g_asyncns_getnext(_g_asyncns_t *asyncns) { + assert(asyncns); + return asyncns->done_head; +} + +int _g_asyncns_getnqueries(_g_asyncns_t *asyncns) { + assert(asyncns); + return asyncns->n_queries; +} + +void _g_asyncns_cancel(_g_asyncns_t *asyncns, _g_asyncns_query_t* q) { + int i; + int saved_errno = errno; + + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + assert(asyncns->n_queries > 0); + + if (q->done) { + + if (q->done_prev) + q->done_prev->done_next = q->done_next; + else + asyncns->done_head = q->done_next; + + if (q->done_next) + q->done_next->done_prev = q->done_prev; + else + asyncns->done_tail = q->done_prev; + } + + i = q->id % MAX_QUERIES; + assert(asyncns->queries[i] == q); + asyncns->queries[i] = NULL; + + _g_asyncns_freeaddrinfo(q->addrinfo); + free(q->host); + free(q->serv); + + asyncns->n_queries--; + free(q); + + errno = saved_errno; +} + +void _g_asyncns_freeaddrinfo(struct addrinfo *ai) { + int saved_errno = errno; + + while (ai) { + struct addrinfo *next = ai->ai_next; + + free(ai->ai_addr); + free(ai->ai_canonname); + free(ai); + + ai = next; + } + + errno = saved_errno; +} + +void _g_asyncns_freeanswer(unsigned char *answer) { + int saved_errno = errno; + + if (!answer) + return; + + /* Please note that this function is new in libasyncns 0.4. In + * older versions you were supposed to free the answer directly + * with free(). Hence, if this function is changed to do more than + * just a simple free() this must be considered ABI/API breakage! */ + + free(answer); + + errno = saved_errno; +} + +int _g_asyncns_isdone(_g_asyncns_t *asyncns, _g_asyncns_query_t*q) { + assert(asyncns); + assert(q); + assert(q->asyncns == asyncns); + + return q->done; +} + +void _g_asyncns_setuserdata(_g_asyncns_t *asyncns, _g_asyncns_query_t *q, void *userdata) { + assert(q); + assert(asyncns); + assert(q->asyncns = asyncns); + + q->userdata = userdata; +} + +void* _g_asyncns_getuserdata(_g_asyncns_t *asyncns, _g_asyncns_query_t *q) { + assert(q); + assert(asyncns); + assert(q->asyncns = asyncns); + + return q->userdata; +} diff --git a/gio/libasyncns/asyncns.h b/gio/libasyncns/asyncns.h new file mode 100644 index 0000000..b3d49ff --- /dev/null +++ b/gio/libasyncns/asyncns.h @@ -0,0 +1,163 @@ +#ifndef fooasyncnshfoo +#define fooasyncnshfoo + +/*** + This file is part of libasyncns. + + Copyright 2005-2008 Lennart Poettering + + libasyncns 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. + + libasyncns 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 libasyncns. If not, see + . +***/ + +#include +#include +#include + +/** \mainpage + * + * \section moo Method of operation + * + * To use libasyncns allocate an _g_asyncns_t object with + * _g_asyncns_new(). This will spawn a number of worker threads (or processes, depending on what is available) which + * are subsequently used to process the queries the controlling + * program issues via _g_asyncns_getaddrinfo() and + * _g_asyncns_getnameinfo(). Use _g_asyncns_free() to shut down the worker + * threads/processes. + * + * Since libasyncns may fork off new processes you have to make sure that + * your program is not irritated by spurious SIGCHLD signals. + */ + +/** \example asyncns-test.c + * An example program */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** An opaque libasyncns session structure */ +typedef struct asyncns _g_asyncns_t; + +/** An opaque libasyncns query structure */ +typedef struct _g_asyncns_query _g_asyncns_query_t; + +/** Allocate a new libasyncns session with n_proc worker processes/threads */ +_g_asyncns_t* _g_asyncns_new(unsigned n_proc); + +/** Free a libasyncns session. This destroys all attached + * _g_asyncns_query_t objects automatically */ +void _g_asyncns_free(_g_asyncns_t *asyncns); + +/** Return the UNIX file descriptor to select() for readability + * on. Use this function to integrate libasyncns with your custom main + * loop. */ +int _g_asyncns_fd(_g_asyncns_t *asyncns); + +/** Process pending responses. After this function is called you can + * get the next completed query object(s) using _g_asyncns_getnext(). If + * block is non-zero wait until at least one response has been + * processed. If block is zero, process all pending responses and + * return. */ +int _g_asyncns_wait(_g_asyncns_t *asyncns, int block); + +/** Issue a name to address query on the specified session. The + * arguments are compatible with the ones of libc's + * getaddrinfo(3). The function returns a new query object. When the + * query is completed you may retrieve the results using + * _g_asyncns_getaddrinfo_done().*/ +_g_asyncns_query_t* _g_asyncns_getaddrinfo(_g_asyncns_t *asyncns, const char *node, const char *service, const struct addrinfo *hints); + +/** Retrieve the results of a preceding _g_asyncns_getaddrinfo() + * call. Returns a addrinfo structure and a return value compatible + * with libc's getaddrinfo(3). The query object q is destroyed by this + * call and may not be used any further. Make sure to free the + * returned addrinfo structure with _g_asyncns_freeaddrinfo() and not + * libc's freeaddrinfo(3)! If the query is not completed yet EAI_AGAIN + * is returned.*/ +int _g_asyncns_getaddrinfo_done(_g_asyncns_t *asyncns, _g_asyncns_query_t* q, struct addrinfo **ret_res); + +/** Issue an address to name query on the specified session. The + * arguments are compatible with the ones of libc's + * getnameinfo(3). The function returns a new query object. When the + * query is completed you may retrieve the results using + * _g_asyncns_getnameinfo_done(). Set gethost (resp. getserv) to non-zero + * if you want to query the hostname (resp. the service name). */ +_g_asyncns_query_t* _g_asyncns_getnameinfo(_g_asyncns_t *asyncns, const struct sockaddr *sa, socklen_t salen, int flags, int gethost, int getserv); + +/** Retrieve the results of a preceding _g_asyncns_getnameinfo() + * call. Returns the hostname and the service name in ret_host and + * ret_serv. The query object q is destroyed by this call and may not + * be used any further. If the query is not completed yet EAI_AGAIN is + * returned. */ +int _g_asyncns_getnameinfo_done(_g_asyncns_t *asyncns, _g_asyncns_query_t* q, char *ret_host, size_t hostlen, char *ret_serv, size_t servlen); + +/** Issue a resolver query on the specified session. The arguments are + * compatible with the ones of libc's res_query(3). The function returns a new + * query object. When the query is completed you may retrieve the results using + * _g_asyncns_res_done(). */ +_g_asyncns_query_t* _g_asyncns_res_query(_g_asyncns_t *asyncns, const char *dname, int class, int type); + +/** Issue an resolver query on the specified session. The arguments are + * compatible with the ones of libc's res_search(3). The function returns a new + * query object. When the query is completed you may retrieve the results using + * _g_asyncns_res_done(). */ +_g_asyncns_query_t* _g_asyncns_res_search(_g_asyncns_t *asyncns, const char *dname, int class, int type); + +/** Retrieve the results of a preceding _g_asyncns_res_query() or + * _g_asyncns_res_search call. The query object q is destroyed by this + * call and may not be used any further. Returns a pointer to the + * answer of the res_query call. If the query is not completed yet + * -EAGAIN is returned, on failure -errno is returned, otherwise the + * length of answer is returned. Make sure to free the answer is a + * call to _g_asyncns_freeanswer(). */ +int _g_asyncns_res_done(_g_asyncns_t *asyncns, _g_asyncns_query_t* q, unsigned char **answer); + +/** Return the next completed query object. If no query has been + * completed yet, return NULL. Please note that you need to run + * _g_asyncns_wait() before this function will return sensible data. */ +_g_asyncns_query_t* _g_asyncns_getnext(_g_asyncns_t *asyncns); + +/** Return the number of query objects (completed or not) attached to + * this session */ +int _g_asyncns_getnqueries(_g_asyncns_t *asyncns); + +/** Cancel a currently running query. q is is destroyed by this call + * and may not be used any futher. */ +void _g_asyncns_cancel(_g_asyncns_t *asyncns, _g_asyncns_query_t* q); + +/** Free the addrinfo structure as returned by + * _g_asyncns_getaddrinfo_done(). Make sure to use this functions instead + * of the libc's freeaddrinfo()! */ +void _g_asyncns_freeaddrinfo(struct addrinfo *ai); + +/** Free the answer data as returned by _g_asyncns_res_done().*/ +void _g_asyncns_freeanswer(unsigned char *answer); + +/** Returns non-zero when the query operation specified by q has been completed */ +int _g_asyncns_isdone(_g_asyncns_t *asyncns, _g_asyncns_query_t*q); + +/** Assign some opaque userdata with a query object */ +void _g_asyncns_setuserdata(_g_asyncns_t *asyncns, _g_asyncns_query_t *q, void *userdata); + +/** Return userdata assigned to a query object. Use + * _g_asyncns_setuserdata() to set this data. If no data has been set + * prior to this call it returns NULL. */ +void* _g_asyncns_getuserdata(_g_asyncns_t *asyncns, _g_asyncns_query_t *q); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/gio/libasyncns/g-asyncns.h b/gio/libasyncns/g-asyncns.h new file mode 100644 index 0000000..a8fbf46 --- /dev/null +++ b/gio/libasyncns/g-asyncns.h @@ -0,0 +1,35 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __G_ASYNCNS_H__ + +#include "config.h" + +#define _GNU_SOURCE + +/* We want to build the fork-based version, not the threaded version. */ +#undef HAVE_PTHREAD + +/* asyncns.c removed this for #580301, but that appears to have been wrong */ +#if HAVE_ARPA_NAMESER_COMPAT_H +#include +#endif + +#include "asyncns.h" + +#endif diff --git a/gio/libasyncns/update.sh b/gio/libasyncns/update.sh new file mode 100644 index 0000000..4c43ca5 --- /dev/null +++ b/gio/libasyncns/update.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +if test $# = 1 ; then + ORIGINAL=$1 +else + echo "Usage: update.sh /path/to/libasyncns" 1>&2 + exit 1 +fi + +if test -f $ORIGINAL/libasyncns/asyncns.c ; then : ; else + echo "Usage: update.sh /path/to/libasyncns" 1>&2 + exit 1 +fi + +for i in asyncns.c asyncns.h ; do + sed -e 's/\([^a-z]\)asyncns_/\1_g_asyncns_/g' \ + -e 's/^asyncns_/_g_asyncns_/' \ + -e 's//"g-asyncns\.h"/' \ + $ORIGINAL/libasyncns/$i > $i +done diff --git a/gio/makefile.msc b/gio/makefile.msc new file mode 100644 index 0000000..57656c5 --- /dev/null +++ b/gio/makefile.msc @@ -0,0 +1,267 @@ +# autogenerated from automake.am with automake.py +TOP = ..\.. +PRJ_TOP = .. +PACKAGE = gio +PKG_VER = 2.0 +!INCLUDE $(TOP)\glib\build\win32\make.msc + +SUBDIRS = win32 + +sub-all: + for %d in ($(SUBDIRS)) do nmake -nologo -f makefile.msc sub-one THIS=%d + +sub-one: + cd $(THIS) + nmake -nologo -f makefile.msc + cd .. + +INCLUDES = \ + -FImsvc_recommended_pragmas.h \ + -I .. -I ..\glib -I ..\gmodule -I . \ + $(INTL_CFLAGS) + +DEFINES = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -DGIO_MODULE_DIR=\"$(libdir)/gio/modules\" \ + -DGIO_COMPILATION + +appinfo_sources = \ + gwin32appinfo.c gwin32appinfo.h + +gio_headers = \ + gappinfo.h \ + gasyncresult.h \ + gbufferedinputstream.h \ + gbufferedoutputstream.h \ + gcancellable.h \ + gcontenttype.h \ + gdatainputstream.h \ + gdataoutputstream.h \ + gdrive.h \ + gemblem.h \ + gemblemedicon.h \ + gfile.h \ + gfileattribute.h \ + gfileenumerator.h \ + gfileicon.h \ + gfileinfo.h \ + gfileinputstream.h \ + gfilemonitor.h \ + gfilenamecompleter.h \ + gfileoutputstream.h \ + gfilterinputstream.h \ + gfilteroutputstream.h \ + gicon.h \ + ginputstream.h \ + gio.h \ + giotypes.h \ + gioenums.h \ + gioerror.h \ + giomodule.h \ + gioscheduler.h \ + gloadableicon.h \ + gmount.h \ + gmemoryinputstream.h \ + gmemoryoutputstream.h \ + gmountoperation.h \ + gnativevolumemonitor.h \ + goutputstream.h \ + gseekable.h \ + gsimpleasyncresult.h \ + gthemedicon.h \ + gvfs.h \ + gvolume.h \ + gvolumemonitor.h \ + $(NULL) + +OBJECTS = \ + gappinfo.obj \ + gasynchelper.obj \ + gasyncinitable.obj \ + gasyncresult.obj \ + gbufferedinputstream.obj \ + gbufferedoutputstream.obj \ + gcancellable.obj \ + gcontenttype.obj \ + gdatainputstream.obj \ + gdataoutputstream.obj \ +# gdesktopappinfo.obj \ + gdrive.obj \ + gdummyfile.obj \ + gemblem.obj \ + gemblemedicon.obj \ + gfile.obj \ + gfileattribute.obj \ + gfileenumerator.obj \ + gfileicon.obj \ + gfileinfo.obj \ + gfileinputstream.obj \ + gfileiostream.obj \ + gfilemonitor.obj \ + gfilenamecompleter.obj \ + gfileoutputstream.obj \ + gfilterinputstream.obj \ + gfilteroutputstream.obj \ + gicon.obj \ + ginetaddress.obj \ + ginetsocketaddress.obj \ + ginitable.obj \ + ginputstream.obj \ + gioenumtypes.obj \ + gioerror.obj \ + giomodule.obj \ + gioscheduler.obj \ + giostream.obj \ + gloadableicon.obj \ + glocalfileiostream.obj \ + gmemoryinputstream.obj \ + gmemoryoutputstream.obj \ + gmount.obj \ + gmountoperation.obj \ + gnativevolumemonitor.obj \ + gnetworkaddress.obj \ + gnetworkservice.obj \ + goutputstream.obj \ + gpollfilemonitor.obj \ + gresolver.obj \ + gseekable.obj \ + gsimpleasyncresult.obj \ + gsocket.obj \ + gsocketaddress.obj \ + gsocketaddressenumerator.obj \ + gsocketclient.obj \ + gsocketconnectable.obj \ + gsocketconnection.obj \ + gsocketcontrolmessage.obj \ + gsocketlistener.obj \ + gsocketservice.obj \ + gsocketinputstream.obj \ + gsocketoutputstream.obj \ + gsrvtarget.obj \ + gtcpconnection.obj \ + gthreadedresolver.obj \ + gthreadedsocketservice.obj \ + gthemedicon.obj \ + gunionvolumemonitor.obj \ + gvfs.obj \ + gvolume.obj \ + gvolumemonitor.obj \ + \ + glocalvfs.obj \ + glocalfile.obj \ + glocalfileenumerator.obj \ + glocalfileinfo.obj \ + glocalfileinputstream.obj \ + glocalfileoutputstream.obj \ + glocalfilemonitor.obj \ + glocaldirectorymonitor.obj \ + gwin32appinfo.obj \ + \ + gio-marshal.obj \ + gwin32mount.obj \ + gwin32volumemonitor.obj \ + gwin32resolver.obj + +libgio_2_0_la_LIBADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + $(platform_libadd) \ + $(SELINUX_LIBS) \ + $(GLIB_LIBS) \ + $(XATTR_LIBS) \ + $(NULL) + +unix_sources = \ + gunixdrive.c \ + gunixdrive.h \ + gunixmounts.c \ + gunixmounts.h \ + gunixvolume.c \ + gunixvolume.h \ + gunixvolumemonitor.c \ + gunixvolumemonitor.h \ + $(NULL) + +marshal_sources = \ + gio-marshal.h gio-marshal.c $(NULL) + +GLIB_GEN_MARSHAL = ..\gobject\glib-genmarshal.exe + +gio-marshal.h: gio-marshal.list + $(GLIB_GEN_MARSHAL) --prefix=_gio_marshal gio-marshal.list --header >> xgen-gwmh \ + && copy /y xgen-gwmh gio-marshal.h \ + && del xgen-gwmh xgen-gwmh~ + +gio-marshal.c: gio-marshal.h + echo #include "gio-marshal.h" >> xgen-gwmc \ + && $(GLIB_GEN_MARSHAL) --prefix=_gio_marshal gio-marshal.list --body >> xgen-gwmc \ + && copy xgen-gwmc gio-marshal.c \ + && del xgen-gwmc xgen-gwmc~ + +local_sources = \ + glocaldirectorymonitor.c \ + glocaldirectorymonitor.h \ + glocalfile.c \ + glocalfile.h \ + glocalfileenumerator.c \ + glocalfileenumerator.h \ + glocalfileinfo.c \ + glocalfileinfo.h \ + glocalfileinputstream.c \ + glocalfileinputstream.h \ + glocalfilemonitor.c \ + glocalfilemonitor.h \ + glocalfileoutputstream.c \ + glocalfileoutputstream.h \ + glocalvfs.c \ + glocalvfs.h \ + $(NULL) + +all : \ + $(PRJ_TOP)\config.h \ + sub-all \ + gioalias.h \ + gioaliasdef.c \ + gio-marshal.c \ + gioenumtypes.h \ + gioenumtypes.c \ + libgio-$(PKG_VER)-0.dll + + +$(PRJ_TOP)\config.h: $(PRJ_TOP)\config.h.win32 + copy $(PRJ_TOP)\config.h.win32 $(PRJ_TOP)\config.h + +gioalias.h: gio.symbols + perl ..\glib\makegalias.pl < gio.symbols > gioalias.h + +gioaliasdef.c: gio.symbols + perl ..\glib\makegalias.pl -def < gio.symbols > gioaliasdef.c + +gioenumtypes.h: $(gio_headers) gioenumtypes.h.template + $(PERL) ..\gobject\glib-mkenums --template gioenumtypes.h.template $(gio_headers) > gioenumtypes.h + +gioenumtypes.c: $(gio_headers) gioenumtypes.c.template + $(PERL) ..\gobject\glib-mkenums --template gioenumtypes.c.template $(gio_headers) > gioenumtypes.c + +gio.def: gio.symbols + echo EXPORTS > gio.def + cl /EP -DINCLUDE_VARIABLES -DG_OS_WIN32 -DINCLUDE_INTERNAL_SYMBOLS -DALL_FILES \ + -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_NORETURN= \ + -DG_GNUC_PRINTF=;G_GNUC_PRINTF gio.symbols >> gio.def + +RESOURCE = $(PACKAGE).res + +$(PACKAGE).res : $(PACKAGE).rc + rc -DBUILDNUMBER=0 -r -fo $(PACKAGE).res $(PACKAGE).rc + +libgio-$(PKG_VER)-0.dll : $(OBJECTS) win32\giowin32.lib $(PACKAGE).def $(RESOURCE) + $(CC) $(CFLAGS) -LD -Felibgio-$(PKG_VER)-0.dll $(OBJECTS) $(RESOURCE) \ + ..\glib\glib-2.0.lib ..\gobject\gobject-2.0.lib ..\gmodule\gmodule-2.0.lib \ + win32\giowin32.lib \ + $(INTL_LIBS) \ + kernel32.lib user32.lib advapi32.lib shell32.lib wsock32.lib ws2_32.lib dnsapi.lib mpr.lib $(LDFLAGS) \ + /implib:gio-2.0.lib /def:$(PACKAGE).def + +.c.obj : + $(CC) $(CFLAGS) -c $(PKG_CFLAGS) $< diff --git a/gio/makegioalias.pl b/gio/makegioalias.pl new file mode 100755 index 0000000..b4ae319 --- /dev/null +++ b/gio/makegioalias.pl @@ -0,0 +1,137 @@ +#!/usr/bin/perl -w + +my $do_def = 0; + +if (($#ARGV >= 0) && ($ARGV[0] eq "-def")) { + shift; + $do_def = 1; +} + +print <) { + + # ignore empty lines + next if /^\s*$/; + + # skip comments + if ($_ =~ /^\s*\/\*/) + { + $in_comment = 1; + } + + if ($in_comment) + { + if ($_ =~ /\*\/\s$/) + { + $in_comment = 0; + } + + next; + } + + # handle ifdefs + if ($_ =~ /^\#endif/) + { + if (!$in_skipped_section) + { + print $_; + } + + $in_skipped_section = 0; + + next; + } + + if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS|ALL_FILES)/) + { + $in_skipped_section = 1; + } + + if ($in_skipped_section) + { + next; + } + + if ($_ =~ /^\#ifn?def\s+G/) + { + print $_; + + next; + } + + if ($_ =~ /^\#if.*(IN_FILE|IN_HEADER)/) + { + print $_; + + next; + } + + chop; + my $str = $_; + my @words; + my $attributes = ""; + + @words = split(/ /, $str); + $str = shift(@words); + chomp($str); + my $alias = "IA__".$str; + + # Drop any Win32 specific .def file syntax, but keep attributes + foreach $word (@words) { + $attributes = "$attributes $word" unless $word eq "PRIVATE"; + } + + if (!$do_def) { + print </dev/null >/dev/null; then + echo "'readelf' not found; skipping test" + exit 0 +fi + +SKIP='\' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gio/tests/buffered-input-stream.c b/gio/tests/buffered-input-stream.c new file mode 100644 index 0000000..8d111e6 --- /dev/null +++ b/gio/tests/buffered-input-stream.c @@ -0,0 +1,141 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Authors: Matthias Clasen + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +static void +test_peek (void) +{ + GInputStream *base; + GInputStream *in; + gssize npeek; + char *buffer; + + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + in = g_buffered_input_stream_new_sized (base, 64); + + g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL); + + buffer = g_new0 (char, 64); + npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 2, 3); + g_assert_cmpint (npeek, ==, 3); + g_assert_cmpstr ("cde", ==, buffer); + g_free (buffer); + + buffer = g_new0 (char, 64); + npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 9, 5); + g_assert_cmpint (npeek, ==, 2); + g_assert_cmpstr ("jk", ==, buffer); + g_free (buffer); + + buffer = g_new0 (char, 64); + npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 75, 3); + g_assert_cmpint (npeek, ==, 0); + g_free (buffer); + + g_object_unref (in); +} + +static void +test_peek_buffer (void) +{ + GInputStream *base; + GInputStream *in; + gssize nfill; + gsize bufsize; + char *buffer; + + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + in = g_buffered_input_stream_new (base); + + nfill = g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL); + buffer = (char *) g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize); + g_assert_cmpint (nfill, ==, bufsize); + g_assert (0 == strncmp ("abcdefghijk", buffer, bufsize)); + + g_object_unref (in); +} + +static void +test_set_buffer_size (void) +{ + GInputStream *base; + GInputStream *in; + gsize size, bufsize; + + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + in = g_buffered_input_stream_new (base); + + g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 64); + size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in)); + g_assert_cmpint (size, ==, 64); + + /* size cannot shrink below current content len */ + g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL); + g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize); + g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 2); + size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in)); + g_assert_cmpint (size, ==, bufsize); + + g_object_unref (in); +} + +static void +test_read_byte (void) +{ + GInputStream *base; + GInputStream *in; + + g_test_bug ("562393"); + + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + in = g_buffered_input_stream_new (base); + + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, NULL), ==, 'a'); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, NULL), ==, 'b'); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, NULL), ==, 'c'); + + g_assert_cmpint (g_input_stream_skip (in, 3, NULL, NULL), ==, 3); + + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, NULL), ==, 'g'); + + g_object_unref (in); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/buffered-input-stream/peek", test_peek); + g_test_add_func ("/buffered-input-stream/peek-buffer", test_peek_buffer); + g_test_add_func ("/buffered-input-stream/set-buffer-size", test_set_buffer_size); + g_test_add_func ("/buffered-input-stream/read-byte", test_read_byte); + + return g_test_run(); +} diff --git a/gio/tests/contexts.c b/gio/tests/contexts.c new file mode 100644 index 0000000..3fe16cb --- /dev/null +++ b/gio/tests/contexts.c @@ -0,0 +1,190 @@ +#include +#include +#include + +#define TEST_FILE (SRCDIR "/Makefile.am") +char *test_file_buffer; +gsize test_file_size; +static char async_read_buffer[8192]; + +static void +read_data (GObject *source, GAsyncResult *result, gpointer loop) +{ + GInputStream *in = G_INPUT_STREAM (source); + GError *error = NULL; + gssize nread; + + nread = g_input_stream_read_finish (in, result, &error); + g_assert_no_error (error); + + g_assert_cmpint (nread, >, 0); + g_assert_cmpint (nread, <=, MIN(sizeof (async_read_buffer), test_file_size)); + g_assert (memcmp (async_read_buffer, test_file_buffer, nread) == 0); + + g_main_loop_quit (loop); +} + +static void +opened_for_read (GObject *source, GAsyncResult *result, gpointer loop) +{ + GFile *file = G_FILE (source); + GFileInputStream *in; + GError *error = NULL; + + in = g_file_read_finish (file, result, &error); + g_assert_no_error (error); + + memset (async_read_buffer, 0, sizeof (async_read_buffer)); + g_input_stream_read_async (G_INPUT_STREAM (in), + async_read_buffer, sizeof (async_read_buffer), + G_PRIORITY_DEFAULT, NULL, + read_data, loop); +} + +/* Test 1: Async I/O started in a thread with a thread-default context + * will stick to that thread, and will complete even if the default + * main loop is blocked. (NB: the last part would not be true if we + * were testing GFileMonitor!) + */ + +static gboolean idle_start_test1_thread (gpointer loop); +static gpointer test1_thread (gpointer user_data); + +static GCond *test1_cond; +static GMutex *test1_mutex; + +static void +test_thread_independence (void) +{ + GMainLoop *loop; + + test1_cond = g_cond_new (); + test1_mutex = g_mutex_new (); + + loop = g_main_loop_new (NULL, FALSE); + g_idle_add (idle_start_test1_thread, loop); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_mutex_free (test1_mutex); + g_cond_free (test1_cond); +} + +static gboolean +idle_start_test1_thread (gpointer loop) +{ + GTimeVal time; + GThread *thread; + gboolean io_completed; + + g_mutex_lock (test1_mutex); + thread = g_thread_create (test1_thread, NULL, TRUE, NULL); + + g_get_current_time (&time); + time.tv_sec += 2; + io_completed = g_cond_timed_wait (test1_cond, test1_mutex, &time); + g_assert (io_completed); + g_thread_join (thread); + + g_mutex_unlock (test1_mutex); + g_main_loop_quit (loop); + return FALSE; +} + +static gpointer +test1_thread (gpointer user_data) +{ + GMainContext *context; + GMainLoop *loop; + GFile *file; + + /* Wait for main thread to be waiting on test1_cond */ + g_mutex_lock (test1_mutex); + g_mutex_unlock (test1_mutex); + + context = g_main_context_new (); + g_assert (g_main_context_get_thread_default () == NULL); + g_main_context_push_thread_default (context); + g_assert (g_main_context_get_thread_default () == context); + + file = g_file_new_for_path (TEST_FILE); + g_assert (g_file_supports_thread_contexts (file)); + + loop = g_main_loop_new (context, FALSE); + g_file_read_async (file, G_PRIORITY_DEFAULT, NULL, + opened_for_read, loop); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_cond_signal (test1_cond); + return NULL; +} + +/* Test 2: If we push a thread-default context in the main thread, we + * can run async ops in that context without running the default + * context. + */ + +static gboolean test2_fail (gpointer user_data); + +static void +test_context_independence (void) +{ + GMainContext *context; + GMainLoop *loop; + GFile *file; + guint default_timeout; + GSource *thread_default_timeout; + + context = g_main_context_new (); + g_assert (g_main_context_get_thread_default () == NULL); + g_main_context_push_thread_default (context); + g_assert (g_main_context_get_thread_default () == context); + + file = g_file_new_for_path (TEST_FILE); + g_assert (g_file_supports_thread_contexts (file)); + + /* Add a timeout to the main loop, to fail immediately if it gets run */ + default_timeout = g_timeout_add_full (G_PRIORITY_HIGH, 0, + test2_fail, NULL, NULL); + /* Add a timeout to the alternate loop, to fail if the I/O *doesn't* run */ + thread_default_timeout = g_timeout_source_new_seconds (2); + g_source_set_callback (thread_default_timeout, test2_fail, NULL, NULL); + g_source_attach (thread_default_timeout, context); + + loop = g_main_loop_new (context, FALSE); + g_file_read_async (file, G_PRIORITY_DEFAULT, NULL, + opened_for_read, loop); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_source_remove (default_timeout); + g_source_destroy (thread_default_timeout); + g_source_unref (thread_default_timeout); +} + +static gboolean +test2_fail (gpointer user_data) +{ + g_assert_not_reached (); + return FALSE; +} + +int +main (int argc, char **argv) +{ + GError *error = NULL; + + g_thread_init (NULL); + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_file_get_contents (TEST_FILE, &test_file_buffer, + &test_file_size, &error); + g_assert_no_error (error); + + g_test_add_func ("/gio/contexts/thread-independence", test_thread_independence); + g_test_add_func ("/gio/contexts/context-independence", test_context_independence); + + return g_test_run(); +} diff --git a/gio/tests/converter-stream.c b/gio/tests/converter-stream.c new file mode 100644 index 0000000..0efd5fc --- /dev/null +++ b/gio/tests/converter-stream.c @@ -0,0 +1,572 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2009 Red Hat, Inc. + * Authors: Alexander Larsson + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +#define G_TYPE_EXPANDER_CONVERTER (g_expander_converter_get_type ()) +#define G_EXPANDER_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_EXPANDER_CONVERTER, GExpanderConverter)) +#define G_EXPANDER_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_EXPANDER_CONVERTER, GExpanderConverterClass)) +#define G_IS_EXPANDER_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_EXPANDER_CONVERTER)) +#define G_IS_EXPANDER_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_EXPANDER_CONVERTER)) +#define G_EXPANDER_CONVERTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_EXPANDER_CONVERTER, GExpanderConverterClass)) + +typedef struct _GExpanderConverter GExpanderConverter; +typedef struct _GExpanderConverterClass GExpanderConverterClass; + +struct _GExpanderConverterClass +{ + GObjectClass parent_class; +}; + +GType g_expander_converter_get_type (void) G_GNUC_CONST; +GConverter *g_expander_converter_new (void); + + + +static void g_expander_converter_iface_init (GConverterIface *iface); + +struct _GExpanderConverter +{ + GObject parent_instance; +}; + +G_DEFINE_TYPE_WITH_CODE (GExpanderConverter, g_expander_converter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, + g_expander_converter_iface_init)) + +static void +g_expander_converter_class_init (GExpanderConverterClass *klass) +{ +} + +static void +g_expander_converter_init (GExpanderConverter *local) +{ +} + +GConverter * +g_expander_converter_new (void) +{ + GConverter *conv; + + conv = g_object_new (G_TYPE_EXPANDER_CONVERTER, NULL); + + return conv; +} + +static void +g_expander_converter_reset (GConverter *converter) +{ +} + +static GConverterResult +g_expander_converter_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + GExpanderConverter *conv; + const guint8 *in, *in_end; + guint8 v, *out; + int i; + gsize block_size; + + conv = G_EXPANDER_CONVERTER (converter); + + in = inbuf; + out = outbuf; + in_end = in + inbuf_size; + + while (in < in_end) + { + v = *in; + + if (v == 0) + block_size = 10; + else + block_size = v * 1000; + + if (outbuf_size < block_size) + { + if (*bytes_read > 0) + return G_CONVERTER_CONVERTED; + + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NO_SPACE, + "No space in dest"); + return G_CONVERTER_ERROR; + } + + in++; + *bytes_read += 1; + *bytes_written += block_size; + outbuf_size -= block_size; + for (i = 0; i < block_size; i++) + *out++ = v; + } + + if (in == in_end && (flags & G_CONVERTER_INPUT_AT_END)) + return G_CONVERTER_FINISHED; + return G_CONVERTER_CONVERTED; +} + +static void +g_expander_converter_iface_init (GConverterIface *iface) +{ + iface->convert = g_expander_converter_convert; + iface->reset = g_expander_converter_reset; +} + +#define G_TYPE_COMPRESSOR_CONVERTER (g_compressor_converter_get_type ()) +#define G_COMPRESSOR_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_COMPRESSOR_CONVERTER, GCompressorConverter)) +#define G_COMPRESSOR_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_COMPRESSOR_CONVERTER, GCompressorConverterClass)) +#define G_IS_COMPRESSOR_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_COMPRESSOR_CONVERTER)) +#define G_IS_COMPRESSOR_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_COMPRESSOR_CONVERTER)) +#define G_COMPRESSOR_CONVERTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_COMPRESSOR_CONVERTER, GCompressorConverterClass)) + +typedef struct _GCompressorConverter GCompressorConverter; +typedef struct _GCompressorConverterClass GCompressorConverterClass; + +struct _GCompressorConverterClass +{ + GObjectClass parent_class; +}; + +GType g_compressor_converter_get_type (void) G_GNUC_CONST; +GConverter *g_compressor_converter_new (void); + + + +static void g_compressor_converter_iface_init (GConverterIface *iface); + +struct _GCompressorConverter +{ + GObject parent_instance; +}; + +G_DEFINE_TYPE_WITH_CODE (GCompressorConverter, g_compressor_converter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, + g_compressor_converter_iface_init)) + +static void +g_compressor_converter_class_init (GCompressorConverterClass *klass) +{ +} + +static void +g_compressor_converter_init (GCompressorConverter *local) +{ +} + +GConverter * +g_compressor_converter_new (void) +{ + GConverter *conv; + + conv = g_object_new (G_TYPE_COMPRESSOR_CONVERTER, NULL); + + return conv; +} + +static void +g_compressor_converter_reset (GConverter *converter) +{ +} + +static GConverterResult +g_compressor_converter_convert (GConverter *converter, + const void *inbuf, + gsize inbuf_size, + void *outbuf, + gsize outbuf_size, + GConverterFlags flags, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + GCompressorConverter *conv; + const guint8 *in, *in_end; + guint8 v, *out; + int i; + gsize block_size; + + conv = G_COMPRESSOR_CONVERTER (converter); + + in = inbuf; + out = outbuf; + in_end = in + inbuf_size; + + while (in < in_end) + { + v = *in; + + if (v == 0) + { + block_size = 0; + while (in+block_size < in_end && *(in+block_size) == 0) + block_size ++; + } + else + block_size = v * 1000; + + /* Not enough data */ + if (in_end - in < block_size) + { + if (*bytes_read > 0) + break; + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_PARTIAL_INPUT, + "Need more data"); + return G_CONVERTER_ERROR; + } + + for (i = 0; i < block_size; i++) + { + if (*(in + i) != v) + { + if (*bytes_read > 0) + break; + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "invalid data"); + return G_CONVERTER_ERROR; + } + } + + if (v == 0 && in_end - in == block_size && (flags & G_CONVERTER_INPUT_AT_END) == 0) + { + if (*bytes_read > 0) + break; + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_PARTIAL_INPUT, + "Need more data"); + return G_CONVERTER_ERROR; + } + + in += block_size; + *out++ = v; + *bytes_read += block_size; + *bytes_written += 1; + } + + if (in == in_end && (flags & G_CONVERTER_INPUT_AT_END)) + return G_CONVERTER_FINISHED; + return G_CONVERTER_CONVERTED; +} + +static void +g_compressor_converter_iface_init (GConverterIface *iface) +{ + iface->convert = g_compressor_converter_convert; + iface->reset = g_compressor_converter_reset; +} + +guint8 unexpanded_data[] = { 0,1,3,4,5,6,7,3,12,0,0}; + +static void +test_expander (void) +{ + guint8 *converted1, *converted2, *ptr; + gsize n_read, n_written; + gsize total_read; + gssize res; + GConverterResult cres; + GInputStream *mem, *cstream; + GOutputStream *mem_out, *cstream_out; + GConverter *expander; + GError *error; + int i; + + expander = g_expander_converter_new (); + + converted1 = g_malloc (100*1000); /* Large enough */ + converted2 = g_malloc (100*1000); /* Large enough */ + + cres = g_converter_convert (expander, + unexpanded_data, sizeof(unexpanded_data), + converted1, 100*1000, + G_CONVERTER_INPUT_AT_END, + &n_read, &n_written, NULL); + + g_assert (cres == G_CONVERTER_FINISHED); + g_assert (n_read == 11); + g_assert (n_written == 41030); + + g_converter_reset (expander); + + mem = g_memory_input_stream_new_from_data (unexpanded_data, + sizeof (unexpanded_data), + NULL); + cstream = g_converter_input_stream_new (mem, expander); + g_object_unref (mem); + + total_read = 0; + ptr = converted2; + while (TRUE) + { + error = NULL; + res = g_input_stream_read (cstream, + ptr, 1, + NULL, &error); + g_assert (res != -1); + if (res == 0) + break; + ptr += res; + total_read += res; + } + + g_assert (total_read == n_written); + g_assert (memcmp (converted1, converted2, n_written) == 0); + + g_converter_reset (expander); + + mem_out = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + cstream_out = g_converter_output_stream_new (mem_out, expander); + g_object_unref (mem_out); + + for (i = 0; i < sizeof(unexpanded_data); i++) + { + error = NULL; + res = g_output_stream_write (cstream_out, + unexpanded_data + i, 1, + NULL, &error); + g_assert (res != -1); + if (res == 0) + { + g_assert (i == sizeof(unexpanded_data) -1); + break; + } + g_assert (res == 1); + } + + g_output_stream_close (cstream_out, NULL, NULL); + + g_assert (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mem_out)) == n_written); + g_assert (memcmp (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (mem_out)), + converted1, + n_written) == 0); + + g_free (converted1); + g_free (converted2); + g_object_unref (cstream); + g_object_unref (cstream_out); + g_object_unref (expander); +} + +static void +test_compressor (void) +{ + guint8 *converted, *expanded, *ptr; + gsize n_read, expanded_size; + gsize total_read; + gssize res; + GConverterResult cres; + GInputStream *mem, *cstream; + GOutputStream *mem_out, *cstream_out; + GConverter *expander, *compressor; + GError *error; + int i; + + expander = g_expander_converter_new (); + expanded = g_malloc (100*1000); /* Large enough */ + cres = g_converter_convert (expander, + unexpanded_data, sizeof(unexpanded_data), + expanded, 100*1000, + G_CONVERTER_INPUT_AT_END, + &n_read, &expanded_size, NULL); + g_assert (cres == G_CONVERTER_FINISHED); + g_assert (n_read == 11); + g_assert (expanded_size == 41030); + + compressor = g_compressor_converter_new (); + + converted = g_malloc (100*1000); /* Large enough */ + + mem = g_memory_input_stream_new_from_data (expanded, + expanded_size, + NULL); + cstream = g_converter_input_stream_new (mem, compressor); + g_object_unref (mem); + + total_read = 0; + ptr = converted; + while (TRUE) + { + error = NULL; + res = g_input_stream_read (cstream, + ptr, 1, + NULL, &error); + g_assert (res != -1); + if (res == 0) + break; + ptr += res; + total_read += res; + } + + g_assert (total_read == n_read - 1); /* Last 2 zeros are combined */ + g_assert (memcmp (converted, unexpanded_data, total_read) == 0); + + g_object_unref (cstream); + + g_converter_reset (compressor); + + mem_out = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + cstream_out = g_converter_output_stream_new (mem_out, compressor); + g_object_unref (mem_out); + + for (i = 0; i < expanded_size; i++) + { + error = NULL; + res = g_output_stream_write (cstream_out, + expanded + i, 1, + NULL, &error); + g_assert (res != -1); + if (res == 0) + { + g_assert (i == expanded_size -1); + break; + } + g_assert (res == 1); + } + + g_output_stream_close (cstream_out, NULL, NULL); + + g_assert (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mem_out)) == n_read - 1); /* Last 2 zeros are combined */ + g_assert (memcmp (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (mem_out)), + unexpanded_data, + g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mem_out))) == 0); + + g_object_unref (cstream_out); + + g_converter_reset (compressor); + + memset (expanded, 5, 5*1000*2); + + mem = g_memory_input_stream_new_from_data (expanded, + 5*1000, + NULL); + cstream = g_converter_input_stream_new (mem, compressor); + g_object_unref (mem); + + total_read = 0; + ptr = converted; + while (TRUE) + { + error = NULL; + res = g_input_stream_read (cstream, + ptr, 1, + NULL, &error); + g_assert (res != -1); + if (res == 0) + break; + ptr += res; + total_read += res; + } + + g_assert (total_read == 1); + g_assert (*converted == 5); + + mem = g_memory_input_stream_new_from_data (expanded, + 5*1000 * 2, + NULL); + cstream = g_converter_input_stream_new (mem, compressor); + g_object_unref (mem); + + total_read = 0; + ptr = converted; + while (TRUE) + { + error = NULL; + res = g_input_stream_read (cstream, + ptr, 1, + NULL, &error); + g_assert (res != -1); + if (res == 0) + break; + ptr += res; + total_read += res; + } + + g_assert (total_read == 2); + g_assert (converted[0] == 5); + g_assert (converted[1] == 5); + + g_object_unref (cstream); + + g_converter_reset (compressor); + + mem = g_memory_input_stream_new_from_data (expanded, + 5*1000 * 2 - 1, + NULL); + cstream = g_converter_input_stream_new (mem, compressor); + g_object_unref (mem); + + total_read = 0; + ptr = converted; + while (TRUE) + { + error = NULL; + res = g_input_stream_read (cstream, + ptr, 1, + NULL, &error); + if (res == -1) + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT); + break; + } + + g_assert (res != 0); + ptr += res; + total_read += res; + } + + g_assert (total_read == 1); + g_assert (converted[0] == 5); + + g_object_unref (cstream); + + g_free (expanded); + g_free (converted); + g_object_unref (expander); + g_object_unref (compressor); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/converter-input-stream/expander", test_expander); + g_test_add_func ("/converter-input-stream/compressor", test_compressor); + + return g_test_run(); +} diff --git a/gio/tests/data-input-stream.c b/gio/tests/data-input-stream.c new file mode 100644 index 0000000..368866e --- /dev/null +++ b/gio/tests/data-input-stream.c @@ -0,0 +1,336 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Authors: Tomas Bzatek + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +#define MAX_LINES 0xFFF +#define MAX_BYTES 0x10000 + +static void +test_seek_to_start (GInputStream *stream) +{ + GError *error = NULL; + gboolean res = g_seekable_seek (G_SEEKABLE (stream), 0, G_SEEK_SET, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); +} + +static void +test_read_lines (GDataStreamNewlineType newline_type) +{ + GInputStream *stream; + GInputStream *base_stream; + GError *error = NULL; + char *data; + int line; + const char* lines[MAX_LINES]; + const char* endl[4] = {"\n", "\r", "\r\n", "\n"}; + + /* prepare data */ + int i; + for (i = 0; i < MAX_LINES; i++) + lines[i] = "some_text"; + + base_stream = g_memory_input_stream_new (); + g_assert (base_stream != NULL); + stream = G_INPUT_STREAM (g_data_input_stream_new (base_stream)); + g_assert(stream != NULL); + + /* Byte order testing */ + g_data_input_stream_set_byte_order (G_DATA_INPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + g_assert_cmpint (g_data_input_stream_get_byte_order (G_DATA_INPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + g_data_input_stream_set_byte_order (G_DATA_INPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN); + g_assert_cmpint (g_data_input_stream_get_byte_order (G_DATA_INPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN); + + /* Line ends testing */ + g_data_input_stream_set_newline_type (G_DATA_INPUT_STREAM (stream), newline_type); + g_assert_cmpint (g_data_input_stream_get_newline_type (G_DATA_INPUT_STREAM (stream)), ==, newline_type); + + + /* Add sample data */ + for (i = 0; i < MAX_LINES; i++) + g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (base_stream), + g_strconcat (lines[i], endl[newline_type], NULL), -1, NULL); + + /* Seek to the start */ + test_seek_to_start (base_stream); + + /* Test read line */ + error = NULL; + data = (char*)1; + line = 0; + while (data) + { + gsize length = -1; + data = g_data_input_stream_read_line (G_DATA_INPUT_STREAM (stream), &length, NULL, &error); + if (data) + { + g_assert_cmpstr (data, ==, lines[line]); + g_assert_no_error (error); + line++; + } + } + g_assert_cmpint (line, ==, MAX_LINES); + + + g_object_unref (base_stream); + g_object_unref (stream); +} + +static void +test_read_lines_LF (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_LF); +} + +static void +test_read_lines_CR (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR); +} + +static void +test_read_lines_CR_LF (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR_LF); +} + + +static void +test_read_until (void) +{ + GInputStream *stream; + GInputStream *base_stream; + GError *error = NULL; + char *data; + int line; + int i; + +#define REPEATS 10 /* number of rounds */ +#define DATA_STRING " part1 # part2 $ part3 % part4 ^" +#define DATA_PART_LEN 7 /* number of characters between separators */ +#define DATA_SEP "#$%^" + const int DATA_PARTS_NUM = strlen (DATA_SEP) * REPEATS; + + base_stream = g_memory_input_stream_new (); + stream = G_INPUT_STREAM (g_data_input_stream_new (base_stream)); + + for (i = 0; i < REPEATS; i++) + g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (base_stream), DATA_STRING, -1, NULL); + + /* Test stop characters */ + error = NULL; + data = (char*)1; + line = 0; + while (data) + { + gsize length = -1; + data = g_data_input_stream_read_until (G_DATA_INPUT_STREAM (stream), DATA_SEP, &length, NULL, &error); + if (data) + { + g_assert_cmpint (strlen (data), ==, DATA_PART_LEN); + g_assert_no_error (error); + line++; + } + } + g_assert_no_error (error); + g_assert_cmpint (line, ==, DATA_PARTS_NUM); + + + g_object_unref (base_stream); + g_object_unref (stream); +} + +enum TestDataType { + TEST_DATA_BYTE = 0, + TEST_DATA_INT16, + TEST_DATA_UINT16, + TEST_DATA_INT32, + TEST_DATA_UINT32, + TEST_DATA_INT64, + TEST_DATA_UINT64 +}; + +#define TEST_DATA_RETYPE_BUFF(a, t, v) \ + (a == TEST_DATA_BYTE ? (t) *(guchar*)v : \ + (a == TEST_DATA_INT16 ? (t) *(gint16*)v : \ + (a == TEST_DATA_UINT16 ? (t) *(guint16*)v : \ + (a == TEST_DATA_INT32 ? (t) *(gint32*)v : \ + (a == TEST_DATA_UINT32 ? (t) *(guint32*)v : \ + (a == TEST_DATA_INT64 ? (t) *(gint64*)v : \ + (t) *(guint64*)v )))))) + + +static void +test_data_array (GInputStream *stream, GInputStream *base_stream, + gpointer buffer, int len, + enum TestDataType data_type, GDataStreamByteOrder byte_order) +{ + GError *error = NULL; + int pos = 0; + int data_size = 1; + gint64 data; + GDataStreamByteOrder native; + gboolean swap; + + /* Seek to start */ + test_seek_to_start (base_stream); + + /* Set correct data size */ + switch (data_type) + { + case TEST_DATA_BYTE: + data_size = 1; + break; + case TEST_DATA_INT16: + case TEST_DATA_UINT16: + data_size = 2; + break; + case TEST_DATA_INT32: + case TEST_DATA_UINT32: + data_size = 4; + break; + case TEST_DATA_INT64: + case TEST_DATA_UINT64: + data_size = 8; + break; + default: + g_assert_not_reached (); + break; + } + + /* Set flag to swap bytes if needed */ + native = (G_BYTE_ORDER == G_BIG_ENDIAN) ? G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN : G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN; + swap = (byte_order != G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN) && (byte_order != native); + + data = 1; + while (data != 0) + { + switch (data_type) + { + case TEST_DATA_BYTE: + data = g_data_input_stream_read_byte (G_DATA_INPUT_STREAM (stream), NULL, &error); + break; + case TEST_DATA_INT16: + data = g_data_input_stream_read_int16 (G_DATA_INPUT_STREAM (stream), NULL, &error); + if (swap) + data = (gint16)GUINT16_SWAP_LE_BE((gint16)data); + break; + case TEST_DATA_UINT16: + data = g_data_input_stream_read_uint16 (G_DATA_INPUT_STREAM (stream), NULL, &error); + if (swap) + data = (guint16)GUINT16_SWAP_LE_BE((guint16)data); + break; + case TEST_DATA_INT32: + data = g_data_input_stream_read_int32 (G_DATA_INPUT_STREAM (stream), NULL, &error); + if (swap) + data = (gint32)GUINT32_SWAP_LE_BE((gint32)data); + break; + case TEST_DATA_UINT32: + data = g_data_input_stream_read_uint32 (G_DATA_INPUT_STREAM (stream), NULL, &error); + if (swap) + data = (guint32)GUINT32_SWAP_LE_BE((guint32)data); + break; + case TEST_DATA_INT64: + data = g_data_input_stream_read_int64 (G_DATA_INPUT_STREAM (stream), NULL, &error); + if (swap) + data = (gint64)GUINT64_SWAP_LE_BE((gint64)data); + break; + case TEST_DATA_UINT64: + data = g_data_input_stream_read_uint64 (G_DATA_INPUT_STREAM (stream), NULL, &error); + if (swap) + data = (guint64)GUINT64_SWAP_LE_BE((guint64)data); + break; + default: + g_assert_not_reached (); + break; + } + if ((data) && (! error)) + g_assert_cmpint (data, ==, TEST_DATA_RETYPE_BUFF(data_type, gint64, ((guchar*)buffer + pos))); + + pos += data_size; + } + if (pos < len + 1) + g_assert_no_error (error); + g_assert_cmpint (pos - data_size, ==, len); +} + +static void +test_read_int (void) +{ + GInputStream *stream; + GInputStream *base_stream; + GRand *randomizer; + int i; + gpointer buffer; + + randomizer = g_rand_new (); + buffer = g_malloc0 (MAX_BYTES); + + /* Fill in some random data */ + for (i = 0; i < MAX_BYTES; i++) + { + guchar x = 0; + while (! x) + x = (guchar)g_rand_int (randomizer); + *(guchar*)((guchar*)buffer + sizeof(guchar) * i) = x; + } + + base_stream = g_memory_input_stream_new (); + stream = G_INPUT_STREAM (g_data_input_stream_new (base_stream)); + g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (base_stream), buffer, MAX_BYTES, NULL); + + + for (i = 0; i < 3; i++) + { + int j; + g_data_input_stream_set_byte_order (G_DATA_INPUT_STREAM (stream), i); + + for (j = 0; j <= TEST_DATA_UINT64; j++) + test_data_array (stream, base_stream, buffer, MAX_BYTES, j, i); + } + + g_object_unref (base_stream); + g_object_unref (stream); + g_rand_free (randomizer); + g_free (buffer); +} + + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/data-input-stream/read-lines-LF", test_read_lines_LF); + g_test_add_func ("/data-input-stream/read-lines-CR", test_read_lines_CR); + g_test_add_func ("/data-input-stream/read-lines-CR-LF", test_read_lines_CR_LF); + g_test_add_func ("/data-input-stream/read-until", test_read_until); + g_test_add_func ("/data-input-stream/read-int", test_read_int); + + return g_test_run(); +} diff --git a/gio/tests/data-output-stream.c b/gio/tests/data-output-stream.c new file mode 100644 index 0000000..0172389 --- /dev/null +++ b/gio/tests/data-output-stream.c @@ -0,0 +1,289 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Authors: Tomas Bzatek + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +#define MAX_LINES 0xFFF +#define MAX_LINES_BUFF 0xFFFFFF +#define MAX_BYTES_BINARY 0x100 + +static void +test_read_lines (GDataStreamNewlineType newline_type) +{ + GOutputStream *stream; + GOutputStream *base_stream; + GError *error = NULL; + gpointer data; + char *lines; + int size; + int i; + +#define TEST_STRING "some_text" + + const char* endl[4] = {"\n", "\r", "\r\n", "\n"}; + + + data = g_malloc0 (MAX_LINES_BUFF); + lines = g_malloc0 ((strlen (TEST_STRING) + strlen (endl[newline_type])) * MAX_LINES + 1); + + /* initialize objects */ + base_stream = g_memory_output_stream_new (data, MAX_LINES_BUFF, NULL, NULL); + stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream)); + + + /* fill data */ + for (i = 0; i < MAX_LINES; i++) + { + gboolean res; + char *s = g_strconcat (TEST_STRING, endl[newline_type], NULL); + res = g_data_output_stream_put_string (G_DATA_OUTPUT_STREAM (stream), s, NULL, &error); + g_stpcpy ((char*)(lines + i*strlen(s)), s); + g_assert_no_error (error); + g_assert (res == TRUE); + } + + /* Byte order testing */ + g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN); + g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN); + + /* compare data */ + size = strlen (data); + g_assert_cmpint (size, <, MAX_LINES_BUFF); + g_assert_cmpstr ((char*)data, ==, lines); + + g_object_unref (base_stream); + g_object_unref (stream); + g_free (data); + g_free (lines); +} + +static void +test_read_lines_LF (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_LF); +} + +static void +test_read_lines_CR (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR); +} + +static void +test_read_lines_CR_LF (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR_LF); +} + +enum TestDataType { + TEST_DATA_BYTE = 0, + TEST_DATA_INT16, + TEST_DATA_UINT16, + TEST_DATA_INT32, + TEST_DATA_UINT32, + TEST_DATA_INT64, + TEST_DATA_UINT64 +}; + +static void +test_data_array (guchar *buffer, gsize len, + enum TestDataType data_type, GDataStreamByteOrder byte_order) +{ + GOutputStream *stream; + GOutputStream *base_stream; + guchar *stream_data; + + GError *error = NULL; + guint pos; + GDataStreamByteOrder native; + gboolean swap; + gboolean res; + + /* create objects */ + stream_data = g_malloc0 (len); + base_stream = g_memory_output_stream_new (stream_data, len, NULL, NULL); + stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream)); + g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), byte_order); + + /* Set flag to swap bytes if needed */ + native = (G_BYTE_ORDER == G_BIG_ENDIAN) ? G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN : G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN; + swap = (byte_order != G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN) && (byte_order != native); + + /* set len to length of buffer cast to actual type */ + switch (data_type) + { + case TEST_DATA_BYTE: + break; + case TEST_DATA_INT16: + case TEST_DATA_UINT16: + g_assert_cmpint (len % 2, ==, 0); + case TEST_DATA_INT32: + case TEST_DATA_UINT32: + g_assert_cmpint (len % 4, ==, 0); + case TEST_DATA_INT64: + case TEST_DATA_UINT64: + g_assert_cmpint (len % 8, ==, 0); + len /= 8; + break; + default: + g_assert_not_reached (); + break; + } + + /* Write data to the file */ + for (pos = 0; pos < len; pos++) + { + switch (data_type) + { + case TEST_DATA_BYTE: + res = g_data_output_stream_put_byte (G_DATA_OUTPUT_STREAM (stream), buffer[pos], NULL, &error); + break; + case TEST_DATA_INT16: + res = g_data_output_stream_put_int16 (G_DATA_OUTPUT_STREAM (stream), ((gint16 *) buffer)[pos], NULL, &error); + break; + case TEST_DATA_UINT16: + res = g_data_output_stream_put_uint16 (G_DATA_OUTPUT_STREAM (stream), ((guint16 *) buffer)[pos], NULL, &error); + break; + case TEST_DATA_INT32: + res = g_data_output_stream_put_int32 (G_DATA_OUTPUT_STREAM (stream), ((gint32 *) buffer)[pos], NULL, &error); + break; + case TEST_DATA_UINT32: + res = g_data_output_stream_put_uint32 (G_DATA_OUTPUT_STREAM (stream), ((guint32 *) buffer)[pos], NULL, &error); + break; + case TEST_DATA_INT64: + res = g_data_output_stream_put_int64 (G_DATA_OUTPUT_STREAM (stream), ((gint64 *) buffer)[pos], NULL, &error); + break; + case TEST_DATA_UINT64: + res = g_data_output_stream_put_uint64 (G_DATA_OUTPUT_STREAM (stream), ((guint64 *) buffer)[pos], NULL, &error); + break; + default: + g_assert_not_reached (); + break; + } + g_assert_no_error (error); + g_assert_cmpint (res, ==, TRUE); + } + + /* Compare data back */ + for (pos = 0; pos < len; pos++) + { + switch (data_type) + { + case TEST_DATA_BYTE: + /* swapping unnecessary */ + g_assert_cmpint (buffer[pos], ==, stream_data[pos]); + break; + case TEST_DATA_UINT16: + if (swap) + g_assert_cmpint (GUINT16_SWAP_LE_BE (((guint16 *) buffer)[pos]), ==, ((guint16 *) stream_data)[pos]); + else + g_assert_cmpint (((guint16 *) buffer)[pos], ==, ((guint16 *) stream_data)[pos]); + break; + case TEST_DATA_INT16: + if (swap) + g_assert_cmpint ((gint16) GUINT16_SWAP_LE_BE (((gint16 *) buffer)[pos]), ==, ((gint16 *) stream_data)[pos]); + else + g_assert_cmpint (((gint16 *) buffer)[pos], ==, ((gint16 *) stream_data)[pos]); + break; + case TEST_DATA_UINT32: + if (swap) + g_assert_cmpint (GUINT32_SWAP_LE_BE (((guint32 *) buffer)[pos]), ==, ((guint32 *) stream_data)[pos]); + else + g_assert_cmpint (((guint32 *) buffer)[pos], ==, ((guint32 *) stream_data)[pos]); + break; + case TEST_DATA_INT32: + if (swap) + g_assert_cmpint ((gint32) GUINT32_SWAP_LE_BE (((gint32 *) buffer)[pos]), ==, ((gint32 *) stream_data)[pos]); + else + g_assert_cmpint (((gint32 *) buffer)[pos], ==, ((gint32 *) stream_data)[pos]); + break; + case TEST_DATA_UINT64: + if (swap) + g_assert_cmpint (GUINT64_SWAP_LE_BE (((guint64 *) buffer)[pos]), ==, ((guint64 *) stream_data)[pos]); + else + g_assert_cmpint (((guint64 *) buffer)[pos], ==, ((guint64 *) stream_data)[pos]); + break; + case TEST_DATA_INT64: + if (swap) + g_assert_cmpint ((gint64) GUINT64_SWAP_LE_BE (((gint64 *) buffer)[pos]), ==, ((gint64 *) stream_data)[pos]); + else + g_assert_cmpint (((gint64 *) buffer)[pos], ==, ((gint64 *) stream_data)[pos]); + break; + default: + g_assert_not_reached (); + break; + } + } + + g_object_unref (base_stream); + g_object_unref (stream); + g_free (stream_data); +} + +static void +test_read_int (void) +{ + GRand *randomizer; + gpointer buffer; + int i; + + randomizer = g_rand_new (); + buffer = g_malloc0(MAX_BYTES_BINARY); + + /* Fill in some random data */ + for (i = 0; i < MAX_BYTES_BINARY; i++) + { + guchar x = 0; + while (! x) x = (guchar)g_rand_int (randomizer); + *(guchar*)((guchar*)buffer + sizeof (guchar) * i) = x; + } + + for (i = 0; i < 3; i++) + { + int j; + for (j = 0; j <= TEST_DATA_UINT64; j++) + test_data_array (buffer, MAX_BYTES_BINARY, j, i); + } + + g_rand_free (randomizer); + g_free (buffer); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/data-input-stream/read-lines-LF", test_read_lines_LF); + g_test_add_func ("/data-input-stream/read-lines-CR", test_read_lines_CR); + g_test_add_func ("/data-input-stream/read-lines-CR-LF", test_read_lines_CR_LF); + g_test_add_func ("/data-input-stream/read-int", test_read_int); + + return g_test_run(); +} diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c new file mode 100644 index 0000000..62ccd03 --- /dev/null +++ b/gio/tests/desktop-app-info.c @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2008 Red Hat, Inc + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Matthias Clasen + */ + +#include +#include +#include +#include +#include + +static char *basedir; + +static GAppInfo * +create_app_info (const char *name) +{ + GError *error; + GAppInfo *info; + + error = NULL; + info = g_app_info_create_from_commandline ("/usr/bin/true blah", + name, + G_APP_INFO_CREATE_NONE, + &error); + g_assert (error == NULL); + + /* this is necessary to ensure that the info is saved */ + g_app_info_set_as_default_for_type (info, "application/x-blah", &error); + g_assert (error == NULL); + g_app_info_remove_supports_type (info, "application/x-blah", &error); + g_assert (error == NULL); + g_app_info_reset_type_associations ("application/x-blah"); + + return info; +} + +static void +test_delete (void) +{ + GAppInfo *info; + + const char *id; + char *filename; + gboolean res; + + info = create_app_info ("Blah"); + + id = g_app_info_get_id (info); + g_assert (id != NULL); + + filename = g_build_filename (basedir, "applications", id, NULL); + + res = g_file_test (filename, G_FILE_TEST_EXISTS); + g_assert (res); + + res = g_app_info_can_delete (info); + g_assert (res); + + res = g_app_info_delete (info); + g_assert (res); + + res = g_file_test (filename, G_FILE_TEST_EXISTS); + g_assert (!res); + + g_object_unref (info); + + if (g_file_test ("/usr/share/applications/gedit.desktop", G_FILE_TEST_EXISTS)) + { + info = (GAppInfo*)g_desktop_app_info_new ("gedit.desktop"); + g_assert (info); + + res = g_app_info_can_delete (info); + g_assert (!res); + + res = g_app_info_delete (info); + g_assert (!res); + } +} + +static void +test_default (void) +{ + GAppInfo *info, *info1, *info2, *info3; + GList *list; + GError *error = NULL; + + info1 = create_app_info ("Blah1"); + info2 = create_app_info ("Blah2"); + info3 = create_app_info ("Blah3"); + + g_app_info_set_as_default_for_type (info1, "application/x-test", &error); + g_assert (error == NULL); + + g_app_info_set_as_default_for_type (info2, "application/x-test", &error); + g_assert (error == NULL); + + list = g_app_info_get_all_for_type ("application/x-test"); + g_assert (g_list_length (list) == 2); + + /* check that both are in the list, info2 before info1 */ + info = (GAppInfo *)list->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info2)) == 0); + + info = (GAppInfo *)list->next->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info1)) == 0); + + g_list_foreach (list, (GFunc)g_object_unref, NULL); + g_list_free (list); + + /* now try adding something at the end */ + g_app_info_add_supports_type (info3, "application/x-test", &error); + g_assert (error == NULL); + + list = g_app_info_get_all_for_type ("application/x-test"); + g_assert (g_list_length (list) == 3); + + /* check that all are in the list, info2, info1, info3 */ + info = (GAppInfo *)list->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info2)) == 0); + + info = (GAppInfo *)list->next->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info1)) == 0); + + info = (GAppInfo *)list->next->next->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info3)) == 0); + + g_list_foreach (list, (GFunc)g_object_unref, NULL); + g_list_free (list); + + /* now remove info1 again */ + g_app_info_remove_supports_type (info1, "application/x-test", &error); + g_assert (error == NULL); + + list = g_app_info_get_all_for_type ("application/x-test"); + g_assert (g_list_length (list) == 2); + + /* check that both are in the list, info2 before info3 */ + info = (GAppInfo *)list->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info2)) == 0); + + info = (GAppInfo *)list->next->data; + g_assert (g_strcmp0 (g_app_info_get_id (info), g_app_info_get_id (info3)) == 0); + + g_list_foreach (list, (GFunc)g_object_unref, NULL); + g_list_free (list); + + /* now clean it all up */ + g_app_info_reset_type_associations ("application/x-test"); + + list = g_app_info_get_all_for_type ("application/x-test"); + g_assert (list == NULL); + + g_app_info_delete (info1); + g_app_info_delete (info2); + g_app_info_delete (info3); + + g_object_unref (info1); + g_object_unref (info2); +} + +static void +cleanup_dir_recurse (GFile *parent, GFile *root) +{ + gboolean res; + GError *error; + GFileEnumerator *enumerator; + GFileInfo *info; + GFile *descend; + char *relative_path; + + g_assert (root != NULL); + + error = NULL; + enumerator = + g_file_enumerate_children (parent, "*", + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, + &error); + if (! enumerator) + return; + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + while ((info) && (!error)) + { + descend = g_file_get_child (parent, g_file_info_get_name (info)); + g_assert (descend != NULL); + relative_path = g_file_get_relative_path (root, descend); + g_assert (relative_path != NULL); + + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) + cleanup_dir_recurse (descend, root); + + error = NULL; + res = g_file_delete (descend, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + + g_object_unref (descend); + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + } + g_assert (error == NULL); + + error = NULL; + res = g_file_enumerator_close (enumerator, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert (error == NULL); +} + +static void +cleanup_subdirs (const char *base_dir) +{ + GFile *base, *file; + + base = g_file_new_for_path (base_dir); + file = g_file_get_child (base, "applications"); + cleanup_dir_recurse (file, file); + g_object_unref (file); + file = g_file_get_child (base, "mime"); + cleanup_dir_recurse (file, file); + g_object_unref (file); +} + +int +main (int argc, + char *argv[]) +{ + gint result; + + g_type_init (); + g_test_init (&argc, &argv, NULL); + + basedir = g_get_current_dir (); + g_setenv ("XDG_DATA_HOME", basedir, TRUE); + cleanup_subdirs (basedir); + + g_test_add_func ("/desktop-app-info/delete", test_delete); + g_test_add_func ("/desktop-app-info/default", test_default); + + result = g_test_run (); + + cleanup_subdirs (basedir); + + return result; +} diff --git a/gio/tests/echo-server.c b/gio/tests/echo-server.c new file mode 100644 index 0000000..7e05510 --- /dev/null +++ b/gio/tests/echo-server.c @@ -0,0 +1,73 @@ +#include +#include + +#define MESSAGE "Welcome to the echo service!\n" + +int port = 7777; +static GOptionEntry cmd_entries[] = { + {"port", 'p', 0, G_OPTION_ARG_INT, &port, + "Local port to bind to", NULL}, + {NULL} +}; + + +static gboolean +handler (GThreadedSocketService *service, + GSocketConnection *connection, + GSocketListener *listener, + gpointer user_data) +{ + GOutputStream *out; + GInputStream *in; + char buffer[1024]; + gssize size; + + out = g_io_stream_get_output_stream (G_IO_STREAM (connection)); + in = g_io_stream_get_input_stream (G_IO_STREAM (connection)); + + g_output_stream_write_all (out, MESSAGE, strlen (MESSAGE), + NULL, NULL, NULL); + + while (0 < (size = g_input_stream_read (in, buffer, + sizeof buffer, NULL, NULL))) + g_output_stream_write (out, buffer, size, NULL, NULL); + + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GSocketService *service; + GOptionContext *context; + GError *error = NULL; + + g_type_init (); + g_thread_init (NULL); + + context = g_option_context_new (" - Test GSocket server stuff"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + service = g_threaded_socket_service_new (10); + + if (!g_socket_listener_add_inet_port (G_SOCKET_LISTENER (service), + port, + NULL, + &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + g_print ("Echo service listening on port %d\n", port); + + g_signal_connect (service, "run", G_CALLBACK (handler), NULL); + + g_main_loop_run (g_main_loop_new (NULL, FALSE)); + g_assert_not_reached (); +} diff --git a/gio/tests/filter-cat.c b/gio/tests/filter-cat.c new file mode 100644 index 0000000..770ab1a --- /dev/null +++ b/gio/tests/filter-cat.c @@ -0,0 +1,227 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include + +#include +#include +#include +#include + +#include +#include + +static gchar **locations = NULL; +static char *from_charset = NULL; +static char *to_charset = NULL; +static gboolean decompress = FALSE; +static gboolean compress = FALSE; +static gboolean gzip = FALSE; +static gboolean fallback = FALSE; + +static GOptionEntry entries[] = { + {"decompress", 0, 0, G_OPTION_ARG_NONE, &decompress, "decompress", NULL}, + {"compress", 0, 0, G_OPTION_ARG_NONE, &compress, "compress", NULL}, + {"gzip", 0, 0, G_OPTION_ARG_NONE, &gzip, "use gzip format", NULL}, + {"from-charset", 0, 0, G_OPTION_ARG_STRING, &from_charset, "from charset", NULL}, + {"to-charset", 0, 0, G_OPTION_ARG_STRING, &to_charset, "to charset", NULL}, + {"fallback", 0, 0, G_OPTION_ARG_NONE, &fallback, "use fallback", NULL}, + {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &locations, "locations", NULL}, + {NULL} +}; + +static void +cat (GFile * file) +{ + GInputStream *in; + char buffer[1024 * 8 + 1]; + char *p; + gssize res; + gboolean close_res; + GError *error; + GConverter *conv; + GCharsetConverter *cconv = NULL; + + error = NULL; + in = (GInputStream *) g_file_read (file, NULL, &error); + if (in == NULL) + { + /* Translators: the first %s is the program name, the second one */ + /* is the URI of the file, the third is the error message. */ + g_printerr ("%s: %s: error opening file: %s\n", + g_get_prgname (), g_file_get_uri (file), error->message); + g_error_free (error); + return; + } + + if (decompress) + { + GInputStream *old; + conv = (GConverter *)g_zlib_decompressor_new (gzip?G_ZLIB_COMPRESSOR_FORMAT_GZIP:G_ZLIB_COMPRESSOR_FORMAT_ZLIB); + old = in; + in = (GInputStream *) g_converter_input_stream_new (in, conv); + g_object_unref (conv); + g_object_unref (old); + } + + if (from_charset && to_charset) + { + cconv = g_charset_converter_new (to_charset, from_charset, &error); + conv = (GConverter *)cconv; + if (conv) + { + GInputStream *old; + + g_charset_converter_set_use_fallback (cconv, fallback); + + old = in; + in = (GInputStream *) g_converter_input_stream_new (in, conv); + g_object_unref (conv); + g_object_unref (old); + } + else + { + g_printerr ("%s: Can't convert between charsets: %s\n", + g_get_prgname (), error->message); + } + } + + if (compress) + { + GInputStream *old; + conv = (GConverter *)g_zlib_compressor_new (gzip?G_ZLIB_COMPRESSOR_FORMAT_GZIP:G_ZLIB_COMPRESSOR_FORMAT_ZLIB, -1); + old = in; + in = (GInputStream *) g_converter_input_stream_new (in, conv); + g_object_unref (conv); + g_object_unref (old); + } + + while (1) + { + res = + g_input_stream_read (in, buffer, sizeof (buffer) - 1, NULL, &error); + if (res > 0) + { + ssize_t written; + + p = buffer; + while (res > 0) + { + written = write (STDOUT_FILENO, p, res); + + if (written == -1 && errno != EINTR) + { + /* Translators: the first %s is the program name, the */ + /* second one is the URI of the file. */ + g_printerr ("%s: %s, error writing to stdout", + g_get_prgname (), g_file_get_uri (file)); + goto out; + } + res -= written; + p += written; + } + } + else if (res < 0) + { + g_printerr ("%s: %s: error reading: %s\n", + g_get_prgname (), g_file_get_uri (file), + error->message); + g_error_free (error); + error = NULL; + break; + } + else if (res == 0) + break; + } + + out: + + close_res = g_input_stream_close (in, NULL, &error); + if (!close_res) + { + g_printerr ("%s: %s:error closing: %s\n", + g_get_prgname (), g_file_get_uri (file), error->message); + g_error_free (error); + } + + if (cconv != NULL && fallback) + { + guint num = g_charset_converter_get_num_fallbacks (cconv); + if (num > 0) + g_printerr ("Number of fallback errors: %u\n", num); + } +} + +int +main (int argc, char *argv[]) +{ + GError *error = NULL; + GOptionContext *context = NULL; + GFile *file; + int i; + + g_type_init (); + + context = + g_option_context_new ("LOCATION... - concatenate LOCATIONS " + "to standard output."); + + g_option_context_set_summary (context, "filter files"); + + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + g_option_context_parse (context, &argc, &argv, &error); + + g_option_context_free (context); + + if (error != NULL) + { + g_printerr ("Error parsing commandline options: %s\n", error->message); + g_printerr ("\n"); + g_printerr ("Try \"%s --help\" for more information.", + g_get_prgname ()); + g_printerr ("\n"); + g_error_free(error); + return 1; + } + + if (!locations) + { + g_printerr ("%s: missing locations", g_get_prgname ()); + g_printerr ("\n"); + g_printerr ("Try \"%s --help\" for more information.", + g_get_prgname ()); + g_printerr ("\n"); + return 1; + } + + i = 0; + + do + { + file = g_file_new_for_commandline_arg (locations[i]); + cat (file); + g_object_unref (file); + } + while (locations[++i] != NULL); + + return 0; +} diff --git a/gio/tests/filter-streams.c b/gio/tests/filter-streams.c new file mode 100644 index 0000000..c9b3e18 --- /dev/null +++ b/gio/tests/filter-streams.c @@ -0,0 +1,241 @@ +/* + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Author: Ryan Lortie + */ + +#include +#include + +static void +test_input_filter (void) +{ + GInputStream *base, *f1, *f2; + + g_test_bug ("568394"); + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + f1 = g_buffered_input_stream_new (base); + f2 = g_buffered_input_stream_new (base); + + g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (f1), FALSE); + + g_assert (g_filter_input_stream_get_base_stream (G_FILTER_INPUT_STREAM (f1)) == base); + g_assert (g_filter_input_stream_get_base_stream (G_FILTER_INPUT_STREAM (f2)) == base); + + g_assert (!g_input_stream_is_closed (base)); + g_assert (!g_input_stream_is_closed (f1)); + g_assert (!g_input_stream_is_closed (f2)); + + g_object_unref (f1); + + g_assert (!g_input_stream_is_closed (base)); + g_assert (!g_input_stream_is_closed (f2)); + + g_object_unref (f2); + + g_assert (g_input_stream_is_closed (base)); + + g_object_unref (base); +} + +static void +test_output_filter (void) +{ + GOutputStream *base, *f1, *f2; + + base = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + f1 = g_buffered_output_stream_new (base); + f2 = g_buffered_output_stream_new (base); + + g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (f1), FALSE); + + g_assert (g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (f1)) == base); + g_assert (g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (f2)) == base); + + g_assert (!g_output_stream_is_closed (base)); + g_assert (!g_output_stream_is_closed (f1)); + g_assert (!g_output_stream_is_closed (f2)); + + g_object_unref (f1); + + g_assert (!g_output_stream_is_closed (base)); + g_assert (!g_output_stream_is_closed (f2)); + + g_object_unref (f2); + + g_assert (g_output_stream_is_closed (base)); + + g_object_unref (base); +} + +gpointer expected_obj; +gpointer expected_data; +gboolean callback_happened; + +static void +in_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + + g_assert (object == expected_obj); + g_assert (user_data == expected_data); + g_assert (callback_happened == FALSE); + + g_input_stream_close_finish (expected_obj, result, &error); + g_assert (error == NULL); + + callback_happened = TRUE; +} + +static void +test_input_async (void) +{ + GInputStream *base, *f1, *f2; + + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + f1 = g_buffered_input_stream_new (base); + f2 = g_buffered_input_stream_new (base); + + g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (f1), FALSE); + + g_assert (g_filter_input_stream_get_base_stream (G_FILTER_INPUT_STREAM (f1)) == base); + g_assert (g_filter_input_stream_get_base_stream (G_FILTER_INPUT_STREAM (f2)) == base); + + g_assert (!g_input_stream_is_closed (base)); + g_assert (!g_input_stream_is_closed (f1)); + g_assert (!g_input_stream_is_closed (f2)); + + expected_obj = f1; + expected_data = g_malloc (20); + callback_happened = FALSE; + g_input_stream_close_async (f1, 0, NULL, in_cb, expected_data); + + g_assert (callback_happened == FALSE); + while (g_main_context_pending (NULL)) + g_main_context_iteration (NULL, FALSE); + g_assert (callback_happened == TRUE); + + g_assert (!g_input_stream_is_closed (base)); + g_assert (!g_input_stream_is_closed (f2)); + g_free (expected_data); + g_object_unref (f1); + g_assert (!g_input_stream_is_closed (base)); + g_assert (!g_input_stream_is_closed (f2)); + + expected_obj = f2; + expected_data = g_malloc (20); + callback_happened = FALSE; + g_input_stream_close_async (f2, 0, NULL, in_cb, expected_data); + + g_assert (callback_happened == FALSE); + while (g_main_context_pending (NULL)) + g_main_context_iteration (NULL, FALSE); + g_assert (callback_happened == TRUE); + + g_assert (g_input_stream_is_closed (base)); + g_assert (g_input_stream_is_closed (f2)); + g_free (expected_data); + g_object_unref (f2); + + g_assert (g_input_stream_is_closed (base)); + g_object_unref (base); +} + +static void +out_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + + g_assert (object == expected_obj); + g_assert (user_data == expected_data); + g_assert (callback_happened == FALSE); + + g_output_stream_close_finish (expected_obj, result, &error); + g_assert (error == NULL); + + callback_happened = TRUE; +} + + +static void +test_output_async (void) +{ + GOutputStream *base, *f1, *f2; + + base = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + f1 = g_buffered_output_stream_new (base); + f2 = g_buffered_output_stream_new (base); + + g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (f1), FALSE); + + g_assert (g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (f1)) == base); + g_assert (g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (f2)) == base); + + g_assert (!g_output_stream_is_closed (base)); + g_assert (!g_output_stream_is_closed (f1)); + g_assert (!g_output_stream_is_closed (f2)); + + expected_obj = f1; + expected_data = g_malloc (20); + callback_happened = FALSE; + g_output_stream_close_async (f1, 0, NULL, out_cb, expected_data); + + g_assert (callback_happened == FALSE); + while (g_main_context_pending (NULL)) + g_main_context_iteration (NULL, FALSE); + g_assert (callback_happened == TRUE); + + g_assert (!g_output_stream_is_closed (base)); + g_assert (!g_output_stream_is_closed (f2)); + g_free (expected_data); + g_object_unref (f1); + g_assert (!g_output_stream_is_closed (base)); + g_assert (!g_output_stream_is_closed (f2)); + + expected_obj = f2; + expected_data = g_malloc (20); + callback_happened = FALSE; + g_output_stream_close_async (f2, 0, NULL, out_cb, expected_data); + + g_assert (callback_happened == FALSE); + while (g_main_context_pending (NULL)) + g_main_context_iteration (NULL, FALSE); + g_assert (callback_happened == TRUE); + + g_assert (g_output_stream_is_closed (base)); + g_assert (g_output_stream_is_closed (f2)); + g_free (expected_data); + g_object_unref (f2); + + g_assert (g_output_stream_is_closed (base)); + g_object_unref (base); +} + + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_type_init (); + g_test_add_func ("/filter-stream/input", test_input_filter); + g_test_add_func ("/filter-stream/output", test_output_filter); +#if 0 + g_test_add_func ("/filter-stream/async-input", test_input_async); + g_test_add_func ("/filter-stream/async-output", test_output_async); +#endif + + return g_test_run(); +} diff --git a/gio/tests/g-file-info.c b/gio/tests/g-file-info.c new file mode 100644 index 0000000..80bdd6e --- /dev/null +++ b/gio/tests/g-file-info.c @@ -0,0 +1,125 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Authors: Tomas Bzatek + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +#define TEST_NAME "Prilis zlutoucky kun" +#define TEST_DISPLAY_NAME "UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88" +#define TEST_SIZE 0xFFFFFFF0 + +static void +test_assigned_values (GFileInfo *info) +{ + const char *name, *display_name, *mistake; + guint64 size; + GFileType type; + + /* Test for attributes presence */ + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_NAME) == TRUE); + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME) == TRUE); + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE) == TRUE); + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_COPY_NAME) == FALSE); + + /* Retrieve data back and compare */ + + name = g_file_info_get_attribute_byte_string (info, G_FILE_ATTRIBUTE_STANDARD_NAME); + display_name = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME); + mistake = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_COPY_NAME); + size = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_STANDARD_SIZE); + type = g_file_info_get_file_type (info); + + g_assert_cmpstr (name, ==, TEST_NAME); + g_assert_cmpstr (display_name, ==, TEST_DISPLAY_NAME); + g_assert (mistake == NULL); + g_assert_cmpint (size, ==, TEST_SIZE); + g_assert_cmpstr (name, ==, g_file_info_get_name (info)); + g_assert_cmpstr (display_name, ==, g_file_info_get_display_name (info)); + g_assert_cmpint (size, ==, g_file_info_get_size (info) ); + g_assert_cmpint (type, ==, G_FILE_TYPE_DIRECTORY); +} + + + +static void +test_g_file_info (void) +{ + GFileInfo *info; + GFileInfo *info_dup; + GFileInfo *info_copy; + char **attr_list; + + info = g_file_info_new (); + + /* Test for empty instance */ + attr_list = g_file_info_list_attributes (info, NULL); + g_assert (attr_list != NULL); + g_assert (*attr_list == NULL); + + g_file_info_set_attribute_byte_string (info, G_FILE_ATTRIBUTE_STANDARD_NAME, TEST_NAME); + g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, TEST_DISPLAY_NAME); + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_STANDARD_SIZE, TEST_SIZE); + g_file_info_set_file_type (info, G_FILE_TYPE_DIRECTORY); + + /* The attr list should not be empty now */ + attr_list = g_file_info_list_attributes (info, NULL); + g_assert (attr_list != NULL); + g_assert (*attr_list != NULL); + + test_assigned_values (info); + + /* Test dups */ + info_dup = g_file_info_dup (info); + g_assert (info_dup != NULL); + test_assigned_values (info_dup); + + info_copy = g_file_info_new (); + g_file_info_copy_into (info_dup, info_copy); + g_assert (info_copy != NULL); + test_assigned_values (info_copy); + + /* Test remove attribute */ + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER) == FALSE); + g_file_info_set_attribute_int32 (info, G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER, 10); + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER) == TRUE); + + g_file_info_remove_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER); + g_assert (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER) == FALSE); + + g_object_unref (info); + g_object_unref (info_dup); + g_object_unref (info_copy); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/g-file-info/test_g_file_info", test_g_file_info); + + return g_test_run(); +} diff --git a/gio/tests/g-file.c b/gio/tests/g-file.c new file mode 100644 index 0000000..8bba592 --- /dev/null +++ b/gio/tests/g-file.c @@ -0,0 +1,538 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Authors: Tomas Bzatek + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +struct TestPathsWithOper { + const char *path1; + gboolean equal; + gboolean use_uri; + const char *path2; + const char *path3; +}; + + + +/* TODO: + * - test on Windows + * + **/ + +static void +test_g_file_new_null (void) +{ + const char *paths[] = {"/", + "/tmp///", + "/non-existent-file", + "/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88", + NULL + }; + const char *uris[] = {"file:///", + "file:///tmp///", + "non-existent-uri:///some-dir/", + "file:///UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88", + NULL + }; + + GFile *file = NULL; + + int i = 0; + while (paths[i]) + { + file = g_file_new_for_path (paths[i++]); + g_assert (file != NULL); + g_object_unref (file); + } + + i = 0; + while (uris[i]) + { + file = g_file_new_for_uri (uris[i++]); + g_assert (file != NULL); + g_object_unref(file); + } +} + + + +static gboolean +compare_two_files (const gboolean use_uri, const char *path1, const char *path2) +{ + GFile *file1 = NULL; + GFile *file2 = NULL; + gboolean equal; + + if (use_uri) + { + file1 = g_file_new_for_uri (path1); + file2 = g_file_new_for_uri (path2); + } + else + { + file1 = g_file_new_for_path (path1); + file2 = g_file_new_for_path (path2); + } + + g_assert (file1 != NULL); + g_assert (file2 != NULL); + + equal = g_file_equal (file1, file2); + + g_object_unref (file1); + g_object_unref (file2); + + return equal; +} + +static void +test_g_file_new_for_path (void) +{ + const struct TestPathsWithOper cmp_paths[] = + { + {"/", TRUE, 0, "/./"}, + {"//", TRUE, 0, "//"}, + {"//", TRUE, 0, "//./"}, + {"/", TRUE, 0, "/.//"}, + {"/", TRUE, 0, "/././"}, + {"/tmp", TRUE, 0, "/tmp/d/../"}, + {"/", TRUE, 0, "/somedir/../"}, + {"/", FALSE, 0, "/somedir/.../"}, + {"//tmp/dir1", TRUE, 0, "//tmp/dir1"}, + {"/tmp/dir1", TRUE, 0, "///tmp/dir1"}, + {"/tmp/dir1", TRUE, 0, "////tmp/dir1"}, + {"/tmp/dir1", TRUE, 0, "/tmp/./dir1"}, + {"/tmp/dir1", TRUE, 0, "/tmp//dir1"}, + {"/tmp/dir1", TRUE, 0, "/tmp///dir1///"}, + {"/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88", TRUE, 0, "/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88/"} + }; + + guint i; + for (i = 0; i < G_N_ELEMENTS (cmp_paths); i++) + { + gboolean equal = compare_two_files (FALSE, cmp_paths[i].path1, cmp_paths[i].path2); + g_assert_cmpint (equal, ==, cmp_paths[i].equal); + } +} + + + +static void +test_g_file_new_for_uri (void) +{ + const struct TestPathsWithOper cmp_uris[] = { + {"file:///", TRUE, 0, "file:///./"}, + {"file:////", TRUE, 0, "file:////"}, + {"file:////", TRUE, 0, "file:////./"}, + {"file:///", TRUE, 0, "file:///.//"}, + {"file:///", TRUE, 0, "file:///././"}, + {"file:///tmp", TRUE, 0, "file:///tmp/d/../"}, + {"file:///", TRUE, 0, "file:///somedir/../"}, + {"file:///", FALSE, 0, "file:///somedir/.../"}, + {"file:////tmp/dir1", TRUE, 0, "file:////tmp/dir1"}, + {"file:///tmp/dir1", TRUE, 0, "file:///tmp/./dir1"}, + {"file:///tmp/dir1", TRUE, 0, "file:///tmp//dir1"}, + {"file:///tmp/dir1", TRUE, 0, "file:///tmp///dir1///"}, + {"file:///UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88", TRUE, 0, "file:///UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88/"} + }; + + guint i; + for (i = 0; i < G_N_ELEMENTS (cmp_uris); i++) + { + gboolean equal = compare_two_files (TRUE, cmp_uris[i].path1, cmp_uris[i].path2); + g_assert_cmpint (equal, ==, cmp_uris[i].equal); + } +} + + + +static gboolean +dup_equals (const gboolean use_uri, const char *path) +{ + GFile *file1 = NULL; + GFile *file2 = NULL; + gboolean equal; + + if (use_uri) + file1 = g_file_new_for_uri (path); + else + file1 = g_file_new_for_path (path); + + g_assert (file1 != NULL); + + file2 = g_file_dup (file1); + + g_assert (file2 != NULL); + + equal = g_file_equal (file1, file2); + + g_object_unref (file1); + g_object_unref (file2); + + return equal; +} + +static void +test_g_file_dup (void) +{ + const struct TestPathsWithOper dup_paths[] = + { + {"/", 0, FALSE, ""}, + {"file:///", 0, TRUE, ""}, + {"totalnonsense", 0, FALSE, ""}, + {"/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88", 0, FALSE, ""}, + {"file:///UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88", 0, TRUE, ""}, + }; + + guint i; + for (i = 0; i < G_N_ELEMENTS (dup_paths); i++) + { + gboolean equal = dup_equals (dup_paths[i].use_uri, dup_paths[i].path1); + g_assert (equal == TRUE); + } +} + + + +static gboolean +parse_check_utf8 (const gboolean use_uri, const char *path, const char *result_parse_name) +{ + GFile *file1 = NULL; + GFile *file2 = NULL; + char *parsed_name; + gboolean is_utf8_valid; + gboolean equal; + + if (use_uri) + file1 = g_file_new_for_uri (path); + else + file1 = g_file_new_for_path (path); + + g_assert (file1 != NULL); + + parsed_name = g_file_get_parse_name (file1); + + g_assert (parsed_name != NULL); + + /* UTF-8 validation */ + is_utf8_valid = g_utf8_validate (parsed_name, -1, NULL); + g_assert (is_utf8_valid == TRUE); + + if (result_parse_name) + g_assert_cmpstr (parsed_name, ==, result_parse_name); + + file2 = g_file_parse_name (parsed_name); + + g_assert (file2 != NULL); + + equal = g_file_equal (file1, file2); + + g_object_unref (file1); + g_object_unref (file2); + + g_free (parsed_name); + + return equal; +} + +static void +test_g_file_get_parse_name_utf8 (void) +{ + const struct TestPathsWithOper strings[] = + { + {"/", 0, FALSE, "/"}, + {"file:///", 0, TRUE, "/"}, + {"totalnonsense", 0, FALSE, NULL}, + {"/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88", 0, FALSE, NULL /* Depends on local file encoding */}, + {"file:///invalid%08/UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88/", 0, TRUE, "file:///invalid%08/UTF-8%20p\xc5\x99\xc3\xadli\xc5\xa1%20\xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd%20k\xc5\xaf\xc5\x88"}, + }; + + guint i; + for (i = 0; i < G_N_ELEMENTS (strings); i++) + { + gboolean equal = parse_check_utf8 (strings[i].use_uri, strings[i].path1, strings[i].path2); + g_assert (equal == TRUE); + } +} + +static char * +resolve_arg (const gboolean is_uri_only, const char *arg) +{ + GFile *file1 = NULL; + char *uri = NULL; + char *path = NULL; + char *s = NULL; + + file1 = g_file_new_for_commandline_arg (arg); + g_assert (file1 != NULL); + + /* Test if we get URI string */ + uri = g_file_get_uri (file1); + g_assert_cmpstr (uri, !=, NULL); + g_print ("%s\n",uri); + + /* Test if we get correct value of the local path */ + path = g_file_get_path (file1); + if (is_uri_only) + g_assert_cmpstr (path, ==, NULL); + else + g_assert (g_path_is_absolute (path) == TRUE); + + /* Get the URI scheme and compare it with expected one */ + s = g_file_get_uri_scheme (file1); + + g_object_unref (file1); + g_free (uri); + g_free (path); + + return s; +} + +static void +test_g_file_new_for_commandline_arg (void) +{ + /* TestPathsWithOper.use_uri represents IsURIOnly here */ + const struct TestPathsWithOper arg_data[] = + { + {"./", 0, FALSE, "file"}, + {"../", 0, FALSE, "file"}, + {"/tmp", 0, FALSE, "file"}, + {"//UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88", 0, FALSE, "file"}, + {"file:///UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88/", 0, FALSE, "file"}, +#if 0 + {"http://www.gtk.org/", 0, TRUE, "http"}, + {"ftp://user:pass@ftp.gimp.org/", 0, TRUE, "ftp"}, +#endif + }; + GFile *file; + char *resolved; + char *cwd; + guint i; + + for (i = 0; i < G_N_ELEMENTS (arg_data); i++) + { + char *s = resolve_arg (arg_data[i].use_uri, arg_data[i].path1); + g_assert_cmpstr (s, ==, arg_data[i].path2); + g_free (s); + } + + /* Manual test for getting correct cwd */ + file = g_file_new_for_commandline_arg ("./"); + resolved = g_file_get_path (file); + cwd = g_get_current_dir (); + g_assert_cmpstr (resolved, ==, cwd); + g_object_unref (file); + g_free (resolved); + g_free (cwd); +} + +static char* +get_relative_path (const gboolean use_uri, const gboolean should_have_prefix, const char *dir1, const char *dir2) +{ + GFile *file1 = NULL; + GFile *file2 = NULL; + GFile *file3 = NULL; + gboolean has_prefix = FALSE; + char *relative_path = NULL; + + if (use_uri) + { + file1 = g_file_new_for_uri (dir1); + file2 = g_file_new_for_uri (dir2); + } + else + { + file1 = g_file_new_for_path (dir1); + file2 = g_file_new_for_path (dir2); + } + + g_assert (file1 != NULL); + g_assert (file2 != NULL); + + has_prefix = g_file_has_prefix (file2, file1); + g_print ("%s %s\n", dir1, dir2); + g_assert (has_prefix == should_have_prefix); + + relative_path = g_file_get_relative_path (file1, file2); + if (should_have_prefix) + { + g_assert (relative_path != NULL); + + file3 = g_file_resolve_relative_path (file1, relative_path); + g_assert (g_file_equal (file2, file3) == TRUE); + } + + if (file1) + g_object_unref (file1); + if (file2) + g_object_unref (file2); + if (file3) + g_object_unref (file3); + + return relative_path; +} + +static void +test_g_file_has_prefix (void) +{ + /* TestPathsWithOper.equal represents here if the dir belongs to the directory structure */ + const struct TestPathsWithOper dirs[] = + { + /* path1 equal uri path2 path3 */ + {"/dir1", TRUE, FALSE, "/dir1/dir2/dir3/", "dir2/dir3"}, + {"/dir1/", TRUE, FALSE, "/dir1/dir2/dir3/", "dir2/dir3"}, + {"/dir1", TRUE, FALSE, "/dir1/dir2/dir3", "dir2/dir3"}, + {"/dir1/", TRUE, FALSE, "/dir1/dir2/dir3", "dir2/dir3"}, + {"/tmp/", FALSE, FALSE, "/something/", NULL}, + {"/dir1/dir2", FALSE, FALSE, "/dir1/", NULL}, + {"//dir1/new", TRUE, FALSE, "//dir1/new/dir2/dir3", "dir2/dir3"}, + {"/dir/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88", TRUE, FALSE, "/dir/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88/dir2", "dir2"}, + {"file:///dir1", TRUE, TRUE, "file:///dir1/dir2/dir3/", "dir2/dir3"}, + {"file:///dir1/", TRUE, TRUE, "file:///dir1/dir2/dir3/", "dir2/dir3"}, + {"file:///dir1", TRUE, TRUE, "file:///dir1/dir2/dir3", "dir2/dir3"}, + {"file:///dir1/", TRUE, TRUE, "file:///dir1/dir2/dir3", "dir2/dir3"}, + {"file:///tmp/", FALSE, TRUE, "file:///something/", NULL}, + {"file:///dir1/dir2", FALSE, TRUE, "file:///dir1/", NULL}, + {"file:////dir1/new", TRUE, TRUE, "file:////dir1/new/dir2/dir3", "dir2/dir3"}, + {"file:///dir/UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88", TRUE, TRUE, "file:///dir/UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88/dir2", "dir2"}, +#if 0 + {"dav://www.gtk.org/plan/", TRUE, TRUE, "dav://www.gtk.org/plan/meetings/20071218.txt", "meetings/20071218.txt"}, + {"dav://www.gtk.org/plan/meetings", TRUE, TRUE, "dav://www.gtk.org/plan/meetings/20071218.txt", "20071218.txt"}, +#endif + }; + + guint i; + for (i = 0; i < G_N_ELEMENTS (dirs); i++) + { + char *s = get_relative_path (dirs[i].use_uri, dirs[i].equal, dirs[i].path1, dirs[i].path2); + if (dirs[i].equal) + g_assert_cmpstr (s, ==, dirs[i].path3); + g_free (s); + } +} + +static void +roundtrip_parent_child (const gboolean use_uri, const gboolean under_root_descending, + const char *path, const char *dir_holder) +{ + GFile *files[6] = {NULL}; + guint i; + + if (use_uri) + { + files[0] = g_file_new_for_uri (path); + files[1] = g_file_new_for_uri (path); + } + else + { + files[0] = g_file_new_for_path (path); + files[1] = g_file_new_for_path (path); + } + + g_assert (files[0] != NULL); + g_assert (files[1] != NULL); + + files[2] = g_file_get_child (files[1], dir_holder); + g_assert (files[2] != NULL); + + files[3] = g_file_get_parent (files[2]); + g_assert (files[3] != NULL); + g_assert (g_file_equal (files[3], files[0]) == TRUE); + + files[4] = g_file_get_parent (files[3]); + /* Don't go lower beyond the root */ + if (under_root_descending) + g_assert (files[4] == NULL); + else + { + g_assert (files[4] != NULL); + + files[5] = g_file_get_child (files[4], dir_holder); + g_assert (files[5] != NULL); + g_assert (g_file_equal (files[5], files[0]) == TRUE); + } + + for (i = 0; i < G_N_ELEMENTS (files); i++) + { + if (files[i]) + g_object_unref (files[i]); + } +} + +static void +test_g_file_get_parent_child (void) +{ + const struct TestPathsWithOper paths[] = + { + /* path root_desc uri dir_holder */ + {"/dir1/dir", FALSE, FALSE, "dir"}, + {"/dir", FALSE, FALSE, "dir"}, + {"/", TRUE, FALSE, "dir"}, + {"/UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88/", FALSE, FALSE, "UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88"}, + {"file:///dir1/dir", FALSE, TRUE, "dir"}, + {"file:///dir", FALSE, TRUE, "dir"}, + {"file:///", TRUE, TRUE, "dir"}, + {"file:///UTF-8%20p%C5%99%C3%ADli%C5%A1%20%C5%BElu%C5%A5ou%C4%8Dk%C3%BD%20k%C5%AF%C5%88/", FALSE, TRUE, "UTF-8 p\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88"}, + {"dav://www.gtk.org/plan/meetings", FALSE, TRUE, "meetings"}, + }; + + guint i; + for (i = 0; i < G_N_ELEMENTS (paths); i++) + roundtrip_parent_child (paths[i].use_uri, paths[i].equal, paths[i].path1, paths[i].path2); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + + /* Testing whether g_file_new_for_path() or g_file_new_for_uri() always returns non-NULL result */ + g_test_add_func ("/g-file/test_g_file_new_null", test_g_file_new_null); + + /* Testing whether the g_file_new_for_path() correctly canonicalizes strings and two files equals (g_file_equal()) */ + g_test_add_func ("/g-file/test_g_file_new_for_path", test_g_file_new_for_path); + + /* Testing whether the g_file_new_for_uri() correctly canonicalizes strings and two files equals (g_file_equal()) */ + g_test_add_func ("/g-file/test_g_file_new_for_uri", test_g_file_new_for_uri); + + /* Testing g_file_dup() equals original file via g_file_equal() */ + g_test_add_func ("/g-file/test_g_file_dup", test_g_file_dup); + + /* Testing g_file_get_parse_name() to return correct UTF-8 string */ + g_test_add_func ("/g-file/test_g_file_get_parse_name_utf8", test_g_file_get_parse_name_utf8); + + /* Testing g_file_new_for_commandline_arg() for correct relavive path resolution and correct path/URI guess */ + g_test_add_func ("/g-file/test_g_file_new_for_commandline_arg", test_g_file_new_for_commandline_arg); + + /* Testing g_file_has_prefix(), g_file_get_relative_path() and g_file_resolve_relative_path() to return and process correct relative paths */ + g_test_add_func ("/g-file/test_g_file_has_prefix", test_g_file_has_prefix); + + /* Testing g_file_get_parent() and g_file_get_child() */ + g_test_add_func ("/g-file/test_g_file_get_parent_child", test_g_file_get_parent_child); + + return g_test_run(); +} diff --git a/gio/tests/g-icon.c b/gio/tests/g-icon.c new file mode 100644 index 0000000..5fe4571 --- /dev/null +++ b/gio/tests/g-icon.c @@ -0,0 +1,245 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008 Red Hat, Inc. + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + * + * Authors: David Zeuthen + */ + +#include +#include +#include +#include + +static void +test_g_icon_serialize (void) +{ + GIcon *icon; + GIcon *icon2; + GIcon *icon3; + GIcon *icon4; + GIcon *icon5; + GEmblem *emblem1; + GEmblem *emblem2; + const char *uri; + GFile *location; + char *data; + GError *error; + + error = NULL; + + /* check that GFileIcon and GThemedIcon serialize to the encoding specified */ + + uri = "file:///some/native/path/to/an/icon.png"; + location = g_file_new_for_uri (uri); + icon = g_file_icon_new (location); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "/some/native/path/to/an/icon.png"); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (location); + + uri = "file:///some/native/path/to/an/icon with spaces.png"; + location = g_file_new_for_uri (uri); + icon = g_file_icon_new (location); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "/some/native/path/to/an/icon with spaces.png"); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (location); + + uri = "sftp:///some/non-native/path/to/an/icon.png"; + location = g_file_new_for_uri (uri); + icon = g_file_icon_new (location); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "sftp:///some/non-native/path/to/an/icon.png"); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (location); + +#if 0 + uri = "sftp:///some/non-native/path/to/an/icon with spaces.png"; + location = g_file_new_for_uri (uri); + icon = g_file_icon_new (location); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "sftp:///some/non-native/path/to/an/icon%20with%20spaces.png"); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (location); +#endif + + icon = g_themed_icon_new ("network-server"); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "network-server"); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + + /* Check that we can serialize from well-known specified formats */ + icon = g_icon_new_for_string ("network-server%", &error); + g_assert_no_error (error); + icon2 = g_themed_icon_new ("network-server%"); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (icon); + g_object_unref (icon2); + + icon = g_icon_new_for_string ("/path/to/somewhere.png", &error); + g_assert_no_error (error); + location = g_file_new_for_commandline_arg ("/path/to/somewhere.png"); + icon2 = g_file_icon_new (location); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (location); + + icon = g_icon_new_for_string ("/path/to/somewhere with whitespace.png", &error); + g_assert_no_error (error); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "/path/to/somewhere with whitespace.png"); + g_free (data); + location = g_file_new_for_commandline_arg ("/path/to/somewhere with whitespace.png"); + icon2 = g_file_icon_new (location); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (location); + g_object_unref (icon2); + location = g_file_new_for_commandline_arg ("/path/to/somewhere%20with%20whitespace.png"); + icon2 = g_file_icon_new (location); + g_assert (!g_icon_equal (icon, icon2)); + g_object_unref (location); + g_object_unref (icon2); + g_object_unref (icon); + + icon = g_icon_new_for_string ("sftp:///path/to/somewhere.png", &error); + g_assert_no_error (error); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "sftp:///path/to/somewhere.png"); + g_free (data); + location = g_file_new_for_commandline_arg ("sftp:///path/to/somewhere.png"); + icon2 = g_file_icon_new (location); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (location); + +#if 0 + icon = g_icon_new_for_string ("sftp:///path/to/somewhere with whitespace.png", &error); + g_assert_no_error (error); + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, "sftp:///path/to/somewhere%20with%20whitespace.png"); + g_free (data); + location = g_file_new_for_commandline_arg ("sftp:///path/to/somewhere with whitespace.png"); + icon2 = g_file_icon_new (location); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (location); + g_object_unref (icon2); + location = g_file_new_for_commandline_arg ("sftp:///path/to/somewhere%20with%20whitespace.png"); + icon2 = g_file_icon_new (location); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (location); + g_object_unref (icon2); + g_object_unref (icon); +#endif + + /* Check that GThemedIcon serialization works */ + + icon = g_themed_icon_new ("network-server"); + g_themed_icon_append_name (G_THEMED_ICON (icon), "computer"); + data = g_icon_to_string (icon); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + + icon = g_themed_icon_new ("icon name with whitespace"); + g_themed_icon_append_name (G_THEMED_ICON (icon), "computer"); + data = g_icon_to_string (icon); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + + icon = g_themed_icon_new_with_default_fallbacks ("network-server-xyz"); + g_themed_icon_append_name (G_THEMED_ICON (icon), "computer"); + data = g_icon_to_string (icon); + icon2 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon, icon2)); + g_free (data); + g_object_unref (icon); + g_object_unref (icon2); + + /* Check that GEmblemedIcon serialization works */ + + icon = g_themed_icon_new ("face-smirk"); + icon2 = g_themed_icon_new ("emblem-important"); + g_themed_icon_append_name (G_THEMED_ICON (icon2), "emblem-shared"); + location = g_file_new_for_uri ("file:///some/path/somewhere.png"); + icon3 = g_file_icon_new (location); + g_object_unref (location); + emblem1 = g_emblem_new_with_origin (icon2, G_EMBLEM_ORIGIN_DEVICE); + emblem2 = g_emblem_new_with_origin (icon3, G_EMBLEM_ORIGIN_LIVEMETADATA); + icon4 = g_emblemed_icon_new (icon, emblem1); + g_emblemed_icon_add_emblem (G_EMBLEMED_ICON (icon4), emblem2); + data = g_icon_to_string (icon4); + icon5 = g_icon_new_for_string (data, &error); + g_assert_no_error (error); + g_assert (g_icon_equal (icon4, icon5)); + g_object_unref (emblem1); + g_object_unref (emblem2); + g_object_unref (icon); + g_object_unref (icon2); + g_object_unref (icon3); + g_object_unref (icon4); + g_object_unref (icon5); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/g-icon/serialize", test_g_icon_serialize); + + return g_test_run(); +} diff --git a/gio/tests/httpd.c b/gio/tests/httpd.c new file mode 100644 index 0000000..c3aaf33 --- /dev/null +++ b/gio/tests/httpd.c @@ -0,0 +1,183 @@ +#include +#include + +static int port = 8080; +static char *root = NULL; +static GOptionEntry cmd_entries[] = { + {"port", 'p', 0, G_OPTION_ARG_INT, &port, + "Local port to bind to", NULL}, + {NULL} +}; + +static void +send_error (GOutputStream *out, + int error_code, + const char *reason) +{ + char *res; + + res = g_strdup_printf ("HTTP/1.0 %d %s\r\n\r\n" + "%d %s" + "%s", + error_code, reason, + error_code, reason, + reason); + g_output_stream_write_all (out, res, strlen (res), NULL, NULL, NULL); + g_free (res); +} + +static gboolean +handler (GThreadedSocketService *service, + GSocketConnection *connection, + GSocketListener *listener, + gpointer user_data) +{ + GOutputStream *out; + GInputStream *in; + GFileInputStream *file_in; + GDataInputStream *data; + char *line, *escaped, *tmp, *query, *unescaped, *path, *version; + GFile *f; + GError *error; + GFileInfo *info; + GString *s; + + in = g_io_stream_get_input_stream (G_IO_STREAM (connection)); + out = g_io_stream_get_output_stream (G_IO_STREAM (connection)); + + data = g_data_input_stream_new (in); + /* Be tolerant of input */ + g_data_input_stream_set_newline_type (data, G_DATA_STREAM_NEWLINE_TYPE_ANY); + + line = g_data_input_stream_read_line (data, NULL, NULL, NULL); + + if (line == NULL) + { + send_error (out, 400, "Invalid request"); + goto out; + } + + if (!g_str_has_prefix (line, "GET ")) + { + send_error (out, 501, "Only GET implemented"); + goto out; + } + + escaped = line + 4; /* Skip "GET " */ + + version = NULL; + tmp = strchr (escaped, ' '); + if (tmp != NULL) + { + *tmp = 0; + version = tmp + 1; + } + + query = strchr (escaped, '?'); + if (query != NULL) + *query++ = 0; + + unescaped = g_uri_unescape_string (escaped, NULL); + path = g_build_filename (root, unescaped, NULL); + g_free (unescaped); + f = g_file_new_for_path (path); + g_free (path); + + error = NULL; + file_in = g_file_read (f, NULL, &error); + if (file_in == NULL) + { + send_error (out, 404, error->message); + g_error_free (error); + goto out; + } + + s = g_string_new ("HTTP/1.0 200 OK\r\n"); + info = g_file_input_stream_query_info (file_in, + G_FILE_ATTRIBUTE_STANDARD_SIZE "," + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + NULL, NULL); + if (info) + { + const char *content_type; + char *mime_type; + + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE)) + g_string_append_printf (s, "Content-Length: %"G_GINT64_FORMAT"\r\n", + g_file_info_get_size (info)); + content_type = g_file_info_get_content_type (info); + if (content_type) + { + mime_type = g_content_type_get_mime_type (content_type); + if (mime_type) + { + g_string_append_printf (s, "Content-Type: %s\r\n", + mime_type); + g_free (mime_type); + } + } + } + g_string_append (s, "\r\n"); + + if (g_output_stream_write_all (out, + s->str, s->len, + NULL, NULL, NULL)) + { + g_output_stream_splice (out, + G_INPUT_STREAM (file_in), + 0, NULL, NULL); + } + g_string_free (s, TRUE); + + g_input_stream_close (G_INPUT_STREAM (file_in), NULL, NULL); + g_object_unref (file_in); + + out: + g_object_unref (data); + + return TRUE; +} + +int +main (int argc, char *argv[]) +{ + GSocketService *service; + GOptionContext *context; + GError *error = NULL; + + g_type_init (); + g_thread_init (NULL); + + context = g_option_context_new (" - Simple HTTP server"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (argc != 2) + { + g_printerr ("Root directory not specified\n"); + return 1; + } + + root = g_strdup (argv[1]); + + service = g_threaded_socket_service_new (10); + if (!g_socket_listener_add_inet_port (G_SOCKET_LISTENER (service), + port, + NULL, + &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + g_print ("Http server listening on port %d\n", port); + + g_signal_connect (service, "run", G_CALLBACK (handler), NULL); + + g_main_loop_run (g_main_loop_new (NULL, FALSE)); + g_assert_not_reached (); +} diff --git a/gio/tests/live-g-file.c b/gio/tests/live-g-file.c new file mode 100644 index 0000000..1ca70ce --- /dev/null +++ b/gio/tests/live-g-file.c @@ -0,0 +1,1225 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Authors: Tomas Bzatek + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DEFAULT_TEST_DIR "testdir_live-g-file" + +#define PATTERN_FILE_SIZE 0x10000 +#define TEST_HANDLE_SPECIAL TRUE + +enum StructureExtraFlags +{ + TEST_DELETE_NORMAL = 1 << 0, + TEST_DELETE_TRASH = 1 << 1, + TEST_DELETE_NON_EMPTY = 1 << 2, + TEST_DELETE_FAILURE = 1 << 3, + TEST_NOT_EXISTS = 1 << 4, + TEST_ENUMERATE_FILE = 1 << 5, + TEST_NO_ACCESS = 1 << 6, + TEST_COPY = 1 << 7, + TEST_MOVE = 1 << 8, + TEST_COPY_ERROR_RECURSE = 1 << 9, + TEST_ALREADY_EXISTS = 1 << 10, + TEST_TARGET_IS_FILE = 1 << 11, + TEST_CREATE = 1 << 12, + TEST_REPLACE = 1 << 13, + TEST_APPEND = 1 << 14, + TEST_OPEN = 1 << 15, + TEST_OVERWRITE = 1 << 16, + TEST_INVALID_SYMLINK = 1 << 17, +}; + +struct StructureItem +{ + const char *filename; + const char *link_to; + GFileType file_type; + GFileCreateFlags create_flags; + guint32 mode; + gboolean handle_special; + enum StructureExtraFlags extra_flags; +}; + +#define TEST_DIR_NO_ACCESS "dir_no-access" +#define TEST_DIR_NO_WRITE "dir_no-write" +#define TEST_DIR_TARGET "dir-target" +#define TEST_NAME_NOT_EXISTS "not_exists" +#define TEST_TARGET_FILE "target-file" + + +static const struct StructureItem sample_struct[] = { +/* filename link file_type create_flags mode | handle_special | extra_flags */ + {"dir1", NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_NONE, 0, 0, TEST_DELETE_NORMAL | TEST_DELETE_NON_EMPTY | TEST_REPLACE | TEST_OPEN}, + {"dir1/subdir", NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_NONE, 0, 0, TEST_COPY | TEST_COPY_ERROR_RECURSE | TEST_APPEND}, + {"dir2", NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_NONE, 0, 0, TEST_DELETE_NORMAL | TEST_MOVE | TEST_CREATE}, + {TEST_DIR_TARGET, NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_NONE, 0, 0, TEST_COPY | TEST_COPY_ERROR_RECURSE}, + {TEST_DIR_NO_ACCESS, NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_PRIVATE, S_IRUSR + S_IWUSR + S_IRGRP + S_IWGRP + S_IROTH + S_IWOTH, 0, TEST_NO_ACCESS | TEST_OPEN}, + {TEST_DIR_NO_WRITE, NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_PRIVATE, S_IRUSR + S_IXUSR + S_IRGRP + S_IXGRP + S_IROTH + S_IXOTH, 0, 0}, + {TEST_TARGET_FILE, NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, 0, TEST_COPY | TEST_OPEN}, + {"normal_file", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, 0, TEST_ENUMERATE_FILE | TEST_CREATE | TEST_OVERWRITE}, + {"normal_file-symlink", "normal_file", G_FILE_TYPE_SYMBOLIC_LINK, G_FILE_CREATE_NONE, 0, 0, TEST_ENUMERATE_FILE | TEST_COPY | TEST_OPEN}, + {"executable_file", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, S_IRWXU + S_IRWXG + S_IRWXO, 0, TEST_DELETE_TRASH | TEST_COPY | TEST_OPEN | TEST_OVERWRITE | TEST_REPLACE}, + {"private_file", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_PRIVATE, 0, 0, TEST_COPY | TEST_OPEN | TEST_OVERWRITE | TEST_APPEND}, + {"normal_file2", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, 0, TEST_COPY | TEST_OVERWRITE | TEST_REPLACE}, + {"readonly_file", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, S_IRUSR + S_IRGRP + S_IROTH, 0, TEST_DELETE_NORMAL | TEST_OPEN}, + {"UTF_pr\xcc\x8ci\xcc\x81lis\xcc\x8c z", + NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, 0, TEST_COPY | TEST_CREATE | TEST_OPEN | TEST_OVERWRITE}, + {"dir_pr\xcc\x8ci\xcc\x81lis\xcc\x8c z", + NULL, G_FILE_TYPE_DIRECTORY, G_FILE_CREATE_NONE, 0, 0, TEST_DELETE_NORMAL | TEST_CREATE}, + {"pattern_file", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_COPY | TEST_OPEN | TEST_APPEND}, + {TEST_NAME_NOT_EXISTS, NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_DELETE_NORMAL | TEST_NOT_EXISTS | TEST_COPY | TEST_OPEN}, + {TEST_NAME_NOT_EXISTS, NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_DELETE_TRASH | TEST_NOT_EXISTS | TEST_MOVE}, + {"not_exists2", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_NOT_EXISTS | TEST_CREATE}, + {"not_exists3", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_NOT_EXISTS | TEST_REPLACE}, + {"not_exists4", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_NOT_EXISTS | TEST_APPEND}, + {"dir_no-execute/file", NULL, G_FILE_TYPE_REGULAR, G_FILE_CREATE_NONE, 0, TEST_HANDLE_SPECIAL, TEST_DELETE_NORMAL | TEST_DELETE_FAILURE | TEST_NOT_EXISTS | TEST_OPEN}, + {"lost_symlink", "nowhere", G_FILE_TYPE_SYMBOLIC_LINK, G_FILE_CREATE_NONE, 0, 0, TEST_COPY | TEST_DELETE_NORMAL | TEST_OPEN | TEST_INVALID_SYMLINK}, + }; + +static gboolean test_suite; +static gboolean write_test; +static gboolean verbose; +static gboolean posix_compat; + +#ifdef G_HAVE_ISO_VARARGS +#define log(...) if (verbose) g_print (__VA_ARGS__) +#elif defined(G_HAVE_GNUC_VARARGS) +#define log(msg...) if (verbose) g_print (msg) +#else /* no varargs macros */ +static void log (const g_char *format, ...) +{ + va_list args; + va_start (args, format); + if (verbose) g_print (format, args); + va_end (args); +} +#endif + +static GFile * +create_empty_file (GFile * parent, const char *filename, + GFileCreateFlags create_flags) +{ + GFile *child; + gboolean res; + GError *error; + GFileOutputStream *outs; + + child = g_file_get_child (parent, filename); + g_assert (child != NULL); + + error = NULL; + outs = g_file_replace (child, NULL, FALSE, create_flags, NULL, &error); + g_assert_no_error (error); + g_assert (outs != NULL); + error = NULL; + res = g_output_stream_close (G_OUTPUT_STREAM (outs), NULL, &error); + g_object_unref (outs); + return child; +} + +static GFile * +create_empty_dir (GFile * parent, const char *filename) +{ + GFile *child; + gboolean res; + GError *error; + + child = g_file_get_child (parent, filename); + g_assert (child != NULL); + error = NULL; + res = g_file_make_directory (child, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + return child; +} + +static GFile * +create_symlink (GFile * parent, const char *filename, const char *points_to) +{ + GFile *child; + gboolean res; + GError *error; + + child = g_file_get_child (parent, filename); + g_assert (child != NULL); + error = NULL; + res = g_file_make_symbolic_link (child, points_to, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + return child; +} + +static void +test_create_structure (gconstpointer test_data) +{ + GFile *root; + GFile *child; + gboolean res; + GError *error; + GFileOutputStream *outs; + GDataOutputStream *outds; + guint i; + struct StructureItem item; + + g_assert (test_data != NULL); + log ("\n Going to create testing structure in '%s'...\n", + (char *) test_data); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + + /* create root directory */ + res = g_file_make_directory (root, NULL, NULL); + /* don't care about errors here */ + + /* create any other items */ + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + if ((item.handle_special) + || ((!posix_compat) + && (item.file_type == G_FILE_TYPE_SYMBOLIC_LINK))) + continue; + + child = NULL; + switch (item.file_type) + { + case G_FILE_TYPE_REGULAR: + log (" Creating file '%s'...\n", item.filename); + child = create_empty_file (root, item.filename, item.create_flags); + break; + case G_FILE_TYPE_DIRECTORY: + log (" Creating directory '%s'...\n", item.filename); + child = create_empty_dir (root, item.filename); + break; + case G_FILE_TYPE_SYMBOLIC_LINK: + log (" Creating symlink '%s' --> '%s'...\n", item.filename, + item.link_to); + child = create_symlink (root, item.filename, item.link_to); + break; + case G_FILE_TYPE_UNKNOWN: + case G_FILE_TYPE_SPECIAL: + case G_FILE_TYPE_SHORTCUT: + case G_FILE_TYPE_MOUNTABLE: + default: + break; + } + g_assert (child != NULL); + + if ((item.mode > 0) && (posix_compat)) + { + error = NULL; + res = + g_file_set_attribute_uint32 (child, G_FILE_ATTRIBUTE_UNIX_MODE, + item.mode, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + + g_object_unref (child); + } + + /* create a pattern file */ + log (" Creating pattern file..."); + child = g_file_get_child (root, "pattern_file"); + g_assert (child != NULL); + + error = NULL; + outs = + g_file_replace (child, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error); + g_assert_no_error (error); + + g_assert (outs != NULL); + outds = g_data_output_stream_new (G_OUTPUT_STREAM (outs)); + g_assert (outds != NULL); + for (i = 0; i < PATTERN_FILE_SIZE; i++) + { + error = NULL; + res = g_data_output_stream_put_byte (outds, i % 256, NULL, &error); + g_assert_no_error (error); + } + error = NULL; + res = g_output_stream_close (G_OUTPUT_STREAM (outs), NULL, &error); + g_assert_no_error (error); + g_object_unref (outds); + g_object_unref (outs); + g_object_unref (child); + log (" done.\n"); + + g_object_unref (root); +} + +static GFile * +file_exists (GFile * parent, const char *filename, gboolean * result) +{ + GFile *child; + gboolean res; + + if (result) + *result = FALSE; + + child = g_file_get_child (parent, filename); + g_assert (child != NULL); + res = g_file_query_exists (child, NULL); + if (result) + *result = res; + + return child; +} + +static void +test_attributes (struct StructureItem item, GFileInfo * info) +{ + GFileType ftype; + guint32 mode; + const char *name, *display_name, *edit_name, *copy_name, *symlink_target; + gboolean utf8_valid; + gboolean has_attr; + gboolean is_symlink; + gboolean can_read, can_write; + + /* standard::type */ + has_attr = g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_TYPE); + g_assert_cmpint (has_attr, ==, TRUE); + ftype = g_file_info_get_file_type (info); + g_assert_cmpint (ftype, !=, G_FILE_TYPE_UNKNOWN); + g_assert_cmpint (ftype, ==, item.file_type); + + /* unix::mode */ + if ((item.mode > 0) && (posix_compat)) + { + mode = + g_file_info_get_attribute_uint32 (info, + G_FILE_ATTRIBUTE_UNIX_MODE) & 0xFFF; + g_assert_cmpint (mode, ==, item.mode); + } + + /* access::can-read */ + if (item.file_type != G_FILE_TYPE_SYMBOLIC_LINK) + { + can_read = + g_file_info_get_attribute_boolean (info, + G_FILE_ATTRIBUTE_ACCESS_CAN_READ); + g_assert_cmpint (can_read, ==, TRUE); + } + + /* access::can-write */ + if ((write_test) && ((item.extra_flags & TEST_OVERWRITE) == TEST_OVERWRITE)) + { + can_write = + g_file_info_get_attribute_boolean (info, + G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE); + g_assert_cmpint (can_write, ==, TRUE); + } + + /* standard::name */ + name = g_file_info_get_name (info); + g_assert (name != NULL); + + /* standard::display-name */ + display_name = g_file_info_get_display_name (info); + g_assert (display_name != NULL); + utf8_valid = g_utf8_validate (display_name, -1, NULL); + g_assert_cmpint (utf8_valid, ==, TRUE); + + /* standard::edit-name */ + edit_name = g_file_info_get_edit_name (info); + if (edit_name) + { + utf8_valid = g_utf8_validate (edit_name, -1, NULL); + g_assert_cmpint (utf8_valid, ==, TRUE); + } + + /* standard::copy-name */ + copy_name = + g_file_info_get_attribute_string (info, + G_FILE_ATTRIBUTE_STANDARD_COPY_NAME); + if (copy_name) + { + utf8_valid = g_utf8_validate (copy_name, -1, NULL); + g_assert_cmpint (utf8_valid, ==, TRUE); + } + + /* standard::is-symlink */ + if (posix_compat) + { + is_symlink = g_file_info_get_is_symlink (info); + g_assert_cmpint (is_symlink, ==, + item.file_type == G_FILE_TYPE_SYMBOLIC_LINK); + } + + /* standard::symlink-target */ + if ((item.file_type == G_FILE_TYPE_SYMBOLIC_LINK) && (posix_compat)) + { + symlink_target = g_file_info_get_symlink_target (info); + g_assert_cmpstr (symlink_target, ==, item.link_to); + } +} + +static void +test_initial_structure (gconstpointer test_data) +{ + GFile *root; + GFile *child; + gboolean res; + GError *error; + GFileInputStream *ins; + guint i; + GFileInfo *info; + guint32 size; + guchar *buffer; + gssize read, total_read; + struct StructureItem item; + + + g_assert (test_data != NULL); + log ("\n Testing sample structure in '%s'...\n", (char *) test_data); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + /* test the structure */ + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + if (((!posix_compat) && (item.file_type == G_FILE_TYPE_SYMBOLIC_LINK)) + || (item.handle_special)) + continue; + + log (" Testing file '%s'...\n", item.filename); + + child = file_exists (root, item.filename, &res); + g_assert (child != NULL); + g_assert_cmpint (res, ==, TRUE); + + error = NULL; + info = + g_file_query_info (child, "*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + + test_attributes (item, info); + + g_object_unref (child); + } + + /* read and test the pattern file */ + log (" Testing pattern file...\n"); + child = file_exists (root, "pattern_file", &res); + g_assert (child != NULL); + g_assert_cmpint (res, ==, TRUE); + + error = NULL; + info = + g_file_query_info (child, "*", G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, + &error); + g_assert_no_error (error); + g_assert (info != NULL); + size = g_file_info_get_size (info); + g_assert_cmpint (size, ==, PATTERN_FILE_SIZE); + + error = NULL; + ins = g_file_read (child, NULL, &error); + g_assert (ins != NULL); + g_assert_no_error (error); + + buffer = g_malloc (PATTERN_FILE_SIZE); + total_read = 0; + + while (total_read < PATTERN_FILE_SIZE) + { + error = NULL; + read = + g_input_stream_read (G_INPUT_STREAM (ins), buffer + total_read, + PATTERN_FILE_SIZE, NULL, &error); + g_assert_no_error (error); + total_read += read; + log (" read %"G_GSSIZE_FORMAT" bytes, total = %"G_GSSIZE_FORMAT" of %d.\n", + read, total_read, PATTERN_FILE_SIZE); + } + g_assert_cmpint (total_read, ==, PATTERN_FILE_SIZE); + + error = NULL; + res = g_input_stream_close (G_INPUT_STREAM (ins), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (res, ==, TRUE); + + for (i = 0; i < PATTERN_FILE_SIZE; i++) + g_assert_cmpint (*(buffer + i), ==, i % 256); + + g_object_unref (ins); + g_object_unref (child); + g_free (buffer); + g_object_unref (root); +} + +static void +traverse_recurse_dirs (GFile * parent, GFile * root) +{ + gboolean res; + GError *error; + GFileEnumerator *enumerator; + GFileInfo *info; + GFile *descend; + char *relative_path; + guint i; + gboolean found; + + g_assert (root != NULL); + + error = NULL; + enumerator = + g_file_enumerate_children (parent, "*", + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, + &error); + g_assert (enumerator != NULL); + g_assert_no_error (error); + + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + while ((info) && (!error)) + { + descend = g_file_get_child (parent, g_file_info_get_name (info)); + g_assert (descend != NULL); + relative_path = g_file_get_relative_path (root, descend); + g_assert (relative_path != NULL); + + found = FALSE; + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + if (strcmp (sample_struct[i].filename, relative_path) == 0) + { + /* test the attributes again */ + test_attributes (sample_struct[i], info); + + found = TRUE; + break; + } + } + g_assert_cmpint (found, ==, TRUE); + + log (" Found file %s, relative to root: %s\n", + g_file_info_get_display_name (info), relative_path); + + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) + traverse_recurse_dirs (descend, root); + + g_object_unref (descend); + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + } + g_assert_no_error (error); + + error = NULL; + res = g_file_enumerator_close (enumerator, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); +} + +static void +test_traverse_structure (gconstpointer test_data) +{ + GFile *root; + gboolean res; + + g_assert (test_data != NULL); + log ("\n Traversing through the sample structure in '%s'...\n", + (char *) test_data); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + traverse_recurse_dirs (root, root); + + g_object_unref (root); +} + + + + +static void +test_enumerate (gconstpointer test_data) +{ + GFile *root, *child; + gboolean res; + GError *error; + GFileEnumerator *enumerator; + GFileInfo *info; + guint i; + struct StructureItem item; + + + g_assert (test_data != NULL); + log ("\n Test enumerate '%s'...\n", (char *) test_data); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + if ((!posix_compat) && (item.file_type == G_FILE_TYPE_SYMBOLIC_LINK)) + continue; + + if (((item.extra_flags & TEST_NOT_EXISTS) == TEST_NOT_EXISTS) || + (((item.extra_flags & TEST_NO_ACCESS) == TEST_NO_ACCESS) + && posix_compat) + || ((item.extra_flags & TEST_ENUMERATE_FILE) == + TEST_ENUMERATE_FILE)) + { + log (" Testing file '%s'\n", item.filename); + child = g_file_get_child (root, item.filename); + g_assert (child != NULL); + error = NULL; + enumerator = + g_file_enumerate_children (child, "*", + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, &error); + + if ((item.extra_flags & TEST_NOT_EXISTS) == TEST_NOT_EXISTS) + { + g_assert (enumerator == NULL); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND); + } + if ((item.extra_flags & TEST_ENUMERATE_FILE) == TEST_ENUMERATE_FILE) + { + g_assert (enumerator == NULL); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY); + } + if ((item.extra_flags & TEST_NO_ACCESS) == TEST_NO_ACCESS) + { + g_assert (enumerator != NULL); + + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + g_assert (info == NULL); + g_assert_no_error (error); + /* no items should be found, no error should be logged */ + } + + if (error) + g_error_free (error); + + if (enumerator) + { + error = NULL; + res = g_file_enumerator_close (enumerator, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + g_object_unref (child); + } + } + g_object_unref (root); +} + +static void +do_copy_move (GFile * root, struct StructureItem item, const char *target_dir, + enum StructureExtraFlags extra_flags) +{ + GFile *dst_dir, *src_file, *dst_file; + gboolean res; + GError *error; + + log (" do_copy_move: '%s' --> '%s'\n", item.filename, target_dir); + + dst_dir = g_file_get_child (root, target_dir); + g_assert (dst_dir != NULL); + src_file = g_file_get_child (root, item.filename); + g_assert (src_file != NULL); + dst_file = g_file_get_child (dst_dir, item.filename); + g_assert (dst_file != NULL); + + error = NULL; + if ((item.extra_flags & TEST_COPY) == TEST_COPY) + res = + g_file_copy (src_file, dst_file, + G_FILE_COPY_NOFOLLOW_SYMLINKS | + ((extra_flags == + TEST_OVERWRITE) ? G_FILE_COPY_OVERWRITE : + G_FILE_COPY_NONE), NULL, NULL, NULL, &error); + else + res = + g_file_move (src_file, dst_file, G_FILE_COPY_NOFOLLOW_SYMLINKS, NULL, + NULL, NULL, &error); + + if (error) + log (" res = %d, error code %d = %s\n", res, error->code, + error->message); + + /* copying file/directory to itself (".") */ + if (((item.extra_flags & TEST_NOT_EXISTS) != TEST_NOT_EXISTS) && + (extra_flags == TEST_ALREADY_EXISTS)) + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS); + } + /* target file is a file, overwrite is not set */ + else if (((item.extra_flags & TEST_NOT_EXISTS) != TEST_NOT_EXISTS) && + (extra_flags == TEST_TARGET_IS_FILE)) + { + g_assert_cmpint (res, ==, FALSE); + if (item.file_type == G_FILE_TYPE_DIRECTORY) + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE); + else + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY); + } + /* source file is directory */ + else if ((item.extra_flags & TEST_COPY_ERROR_RECURSE) == + TEST_COPY_ERROR_RECURSE) + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE); + } + /* source or target path doesn't exist */ + else if (((item.extra_flags & TEST_NOT_EXISTS) == TEST_NOT_EXISTS) || + (extra_flags == TEST_NOT_EXISTS)) + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND); + } + /* source or target path permission denied */ + else if (((item.extra_flags & TEST_NO_ACCESS) == TEST_NO_ACCESS) || + (extra_flags == TEST_NO_ACCESS)) + { + /* This works for root, see bug #552912 */ + if (test_suite && getuid () == 0) + { + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + else + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED); + } + } + /* no error should be found, all exceptions defined above */ + else + { + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + + if (error) + g_error_free (error); + + + g_object_unref (dst_dir); + g_object_unref (src_file); + g_object_unref (dst_file); +} + +static void +test_copy_move (gconstpointer test_data) +{ + GFile *root; + gboolean res; + guint i; + struct StructureItem item; + + log ("\n"); + + g_assert (test_data != NULL); + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + + if ((!posix_compat) && (item.file_type == G_FILE_TYPE_SYMBOLIC_LINK)) + continue; + + if (((item.extra_flags & TEST_COPY) == TEST_COPY) || + ((item.extra_flags & TEST_MOVE) == TEST_MOVE)) + { + /* test copy/move to a directory, expecting no errors if source files exist */ + do_copy_move (root, item, TEST_DIR_TARGET, 0); + + /* some files have been already moved so we can't count with them in the tests */ + if ((item.extra_flags & TEST_COPY) == TEST_COPY) + { + /* test overwrite for flagged files */ + if ((item.extra_flags & TEST_OVERWRITE) == TEST_OVERWRITE) + { + do_copy_move (root, item, TEST_DIR_TARGET, TEST_OVERWRITE); + } + /* source = target, should return G_IO_ERROR_EXISTS */ + do_copy_move (root, item, ".", TEST_ALREADY_EXISTS); + /* target is file */ + do_copy_move (root, item, TEST_TARGET_FILE, + TEST_TARGET_IS_FILE); + /* target path is invalid */ + do_copy_move (root, item, TEST_NAME_NOT_EXISTS, + TEST_NOT_EXISTS); + + /* tests on POSIX-compatible filesystems */ + if (posix_compat) + { + /* target directory is not accessible (no execute flag) */ + do_copy_move (root, item, TEST_DIR_NO_ACCESS, + TEST_NO_ACCESS); + /* target directory is readonly */ + do_copy_move (root, item, TEST_DIR_NO_WRITE, + TEST_NO_ACCESS); + } + } + } + } + g_object_unref (root); +} + +static void +test_create (gconstpointer test_data) +{ + GFile *root, *child; + gboolean res; + GError *error; + guint i; + struct StructureItem item; + GFileOutputStream *os; + + g_assert (test_data != NULL); + log ("\n"); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + + if (((item.extra_flags & TEST_CREATE) == TEST_CREATE) || + ((item.extra_flags & TEST_REPLACE) == TEST_REPLACE) || + ((item.extra_flags & TEST_APPEND) == TEST_APPEND)) + { + log (" test_create: '%s'\n", item.filename); + + child = g_file_get_child (root, item.filename); + g_assert (child != NULL); + error = NULL; + os = NULL; + + if ((item.extra_flags & TEST_CREATE) == TEST_CREATE) + os = g_file_create (child, item.create_flags, NULL, &error); + else if ((item.extra_flags & TEST_REPLACE) == TEST_REPLACE) + os = + g_file_replace (child, NULL, TRUE, item.create_flags, NULL, + &error); + else if ((item.extra_flags & TEST_APPEND) == TEST_APPEND) + os = g_file_append_to (child, item.create_flags, NULL, &error); + + + if (error) + log (" error code %d = %s\n", error->code, error->message); + + if (((item.extra_flags & TEST_NOT_EXISTS) == 0) && + ((item.extra_flags & TEST_CREATE) == TEST_CREATE)) + { + g_assert (os == NULL); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS); + } + else if (item.file_type == G_FILE_TYPE_DIRECTORY) + { + g_assert (os == NULL); + if ((item.extra_flags & TEST_CREATE) == TEST_CREATE) + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS); + else + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY); + } + else + { + g_assert (os != NULL); + g_assert_no_error (error); + } + + if (error) + g_error_free (error); + + if (os) + { + error = NULL; + res = + g_output_stream_close (G_OUTPUT_STREAM (os), NULL, &error); + if (error) + log (" g_output_stream_close: error %d = %s\n", + error->code, error->message); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + g_object_unref (child); + } + } + g_object_unref (root); +} + +static void +test_open (gconstpointer test_data) +{ + GFile *root, *child; + gboolean res; + GError *error; + guint i; + struct StructureItem item; + GFileInputStream *input_stream; + + g_assert (test_data != NULL); + log ("\n"); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + + if ((!posix_compat) && (item.file_type == G_FILE_TYPE_SYMBOLIC_LINK)) + continue; + + if ((item.extra_flags & TEST_OPEN) == TEST_OPEN) + { + log (" test_open: '%s'\n", item.filename); + + child = g_file_get_child (root, item.filename); + g_assert (child != NULL); + error = NULL; + input_stream = g_file_read (child, NULL, &error); + + if (((item.extra_flags & TEST_NOT_EXISTS) == TEST_NOT_EXISTS) || + ((item.extra_flags & TEST_INVALID_SYMLINK) == + TEST_INVALID_SYMLINK)) + { + g_assert (input_stream == NULL); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND); + } + else if (item.file_type == G_FILE_TYPE_DIRECTORY) + { + g_assert (input_stream == NULL); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY); + } + else + { + g_assert (input_stream != NULL); + g_assert_no_error (error); + } + + if (error) + g_error_free (error); + + if (input_stream) + { + error = NULL; + res = + g_input_stream_close (G_INPUT_STREAM (input_stream), NULL, + &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + g_object_unref (child); + } + } + g_object_unref (root); +} + +static void +test_delete (gconstpointer test_data) +{ + GFile *root; + GFile *child; + gboolean res; + GError *error; + guint i; + struct StructureItem item; + + g_assert (test_data != NULL); + log ("\n"); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + res = g_file_query_exists (root, NULL); + g_assert_cmpint (res, ==, TRUE); + + for (i = 0; i < G_N_ELEMENTS (sample_struct); i++) + { + item = sample_struct[i]; + + if ((!posix_compat) && (item.file_type == G_FILE_TYPE_SYMBOLIC_LINK)) + continue; + + if (((item.extra_flags & TEST_DELETE_NORMAL) == TEST_DELETE_NORMAL) || + ((item.extra_flags & TEST_DELETE_TRASH) == TEST_DELETE_TRASH)) + { + child = file_exists (root, item.filename, &res); + g_assert (child != NULL); + /* we don't care about result here */ + + log (" Deleting %s, path = %s\n", item.filename, + g_file_get_path (child)); + error = NULL; + if ((item.extra_flags & TEST_DELETE_NORMAL) == TEST_DELETE_NORMAL) + res = g_file_delete (child, NULL, &error); + else + res = g_file_trash (child, NULL, &error); + + if ((item.extra_flags & TEST_DELETE_NON_EMPTY) == + TEST_DELETE_NON_EMPTY) + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_EMPTY); + } + if ((item.extra_flags & TEST_DELETE_FAILURE) == TEST_DELETE_FAILURE) + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND); + } + if ((item.extra_flags & TEST_NOT_EXISTS) == TEST_NOT_EXISTS) + { + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND); + } + + if (error) + { + log (" result = %d, error = %s\n", res, error->message); + g_error_free (error); + } + + g_object_unref (child); + } + } + g_object_unref (root); +} + + +static void +cleanup_dir_recurse (GFile *parent, GFile *root) +{ + gboolean res; + GError *error; + GFileEnumerator *enumerator; + GFileInfo *info; + GFile *descend; + char *relative_path; + + g_assert (root != NULL); + + error = NULL; + enumerator = + g_file_enumerate_children (parent, "*", + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, + &error); + if (! enumerator) + return; + + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + while ((info) && (!error)) + { + descend = g_file_get_child (parent, g_file_info_get_name (info)); + g_assert (descend != NULL); + relative_path = g_file_get_relative_path (root, descend); + g_assert (relative_path != NULL); + + log (" deleting '%s'\n", g_file_info_get_display_name (info)); + + if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) + cleanup_dir_recurse (descend, root); + + error = NULL; + res = g_file_delete (descend, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + + g_object_unref (descend); + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + } + g_assert_no_error (error); + + error = NULL; + res = g_file_enumerator_close (enumerator, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); +} + +static void +prep_clean_structure (gconstpointer test_data) +{ + GFile *root; + + g_assert (test_data != NULL); + log ("\n Cleaning target testing structure in '%s'...\n", + (char *) test_data); + + root = g_file_new_for_commandline_arg ((char *) test_data); + g_assert (root != NULL); + + cleanup_dir_recurse (root, root); + + g_file_delete (root, NULL, NULL); + + g_object_unref (root); +} + +int +main (int argc, char *argv[]) +{ + static gboolean only_create_struct; + const char *target_path; + GError *error; + GOptionContext *context; + + static GOptionEntry cmd_entries[] = { + {"read-write", 'w', 0, G_OPTION_ARG_NONE, &write_test, + "Perform write tests (incl. structure creation)", NULL}, + {"create-struct", 'c', 0, G_OPTION_ARG_NONE, &only_create_struct, + "Only create testing structure (no tests)", NULL}, + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL}, + {"posix", 'x', 0, G_OPTION_ARG_NONE, &posix_compat, + "Test POSIX-specific features (unix permissions, symlinks)", NULL}, + {NULL} + }; + + test_suite = FALSE; + verbose = FALSE; + write_test = FALSE; + only_create_struct = FALSE; + target_path = NULL; + posix_compat = FALSE; + + /* strip all gtester-specific args */ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + /* no extra parameters specified, assume we're executed from glib test suite */ + if (argc < 2) + { + test_suite = TRUE; + verbose = TRUE; + write_test = TRUE; + only_create_struct = FALSE; + target_path = DEFAULT_TEST_DIR; +#ifdef G_PLATFORM_WIN32 + posix_compat = FALSE; +#else + posix_compat = TRUE; +#endif + } + + /* add trailing args */ + error = NULL; + context = g_option_context_new ("target_path"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_print ("option parsing failed: %s\n", error->message); + return g_test_run (); + } + + /* remaining arg should is the target path; we don't care of the extra args here */ + if (argc >= 2) + target_path = strdup (argv[1]); + + if (! target_path) + { + g_print ("error: target path was not specified\n"); + g_print ("%s", g_option_context_get_help (context, TRUE, NULL)); + return g_test_run (); + } + + + /* Write test - clean target directory first */ + /* this can be also considered as a test - enumerate + delete */ + if (write_test || only_create_struct) + g_test_add_data_func ("/live-g-file/prep_clean_structure", target_path, + prep_clean_structure); + + /* Write test - create new testing structure */ + if (write_test || only_create_struct) + g_test_add_data_func ("/live-g-file/create_structure", target_path, + test_create_structure); + + /* Read test - test the sample structure - expect defined attributes to be there */ + if (!only_create_struct) + g_test_add_data_func ("/live-g-file/test_initial_structure", target_path, + test_initial_structure); + + /* Read test - test traverse the structure - no special file should appear */ + if (!only_create_struct) + g_test_add_data_func ("/live-g-file/test_traverse_structure", target_path, + test_traverse_structure); + + /* Read test - enumerate */ + if (!only_create_struct) + g_test_add_data_func ("/live-g-file/test_enumerate", target_path, + test_enumerate); + + /* Read test - open (g_file_read()) */ + if (!only_create_struct) + g_test_add_data_func ("/live-g-file/test_open", target_path, test_open); + + /* Write test - create */ + if (write_test && (!only_create_struct)) + g_test_add_data_func ("/live-g-file/test_create", target_path, + test_create); + + /* Write test - copy, move */ + if (write_test && (!only_create_struct)) + g_test_add_data_func ("/live-g-file/test_copy_move", target_path, + test_copy_move); + + /* Write test - delete, trash */ + if (write_test && (!only_create_struct)) + g_test_add_data_func ("/live-g-file/test_delete", target_path, + test_delete); + + if (write_test || only_create_struct) + g_test_add_data_func ("/live-g-file/final_clean", target_path, + prep_clean_structure); + + return g_test_run (); + +} diff --git a/gio/tests/memory-input-stream.c b/gio/tests/memory-input-stream.c new file mode 100644 index 0000000..6ffee86 --- /dev/null +++ b/gio/tests/memory-input-stream.c @@ -0,0 +1,78 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2007 Imendio AB + * Authors: Tim Janik + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +static void +test_read_chunks (void) +{ + const char *data1 = "abcdefghijklmnopqrstuvwxyz"; + const char *data2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const char *result = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char buffer[128]; + gsize bytes_read, pos, len, chunk_size; + GError *error = NULL; + GInputStream *stream; + gboolean res; + + stream = g_memory_input_stream_new (); + + g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (stream), + data1, -1, NULL); + g_memory_input_stream_add_data (G_MEMORY_INPUT_STREAM (stream), + data2, -1, NULL); + len = strlen (data1) + strlen (data2); + + for (chunk_size = 1; chunk_size < len - 1; chunk_size++) + { + pos = 0; + while (pos < len) + { + bytes_read = g_input_stream_read (stream, buffer, chunk_size, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (bytes_read, ==, MIN (chunk_size, len - pos)); + g_assert (strncmp (buffer, result + pos, bytes_read) == 0); + + pos += bytes_read; + } + + g_assert_cmpint (pos, ==, len); + res = g_seekable_seek (G_SEEKABLE (stream), 0, G_SEEK_SET, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/memory-input-stream/read-chunks", test_read_chunks); + + return g_test_run(); +} diff --git a/gio/tests/memory-output-stream.c b/gio/tests/memory-output-stream.c new file mode 100644 index 0000000..c30e96f --- /dev/null +++ b/gio/tests/memory-output-stream.c @@ -0,0 +1,137 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc. + * Author: Matthias Clasen + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#include +#include +#include +#include + +static void +test_truncate (void) +{ + GOutputStream *mo; + GDataOutputStream *o; + int i; + GError *error = NULL; + + g_test_bug ("540423"); + + mo = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + o = g_data_output_stream_new (mo); + for (i = 0; i < 1000; i++) + { + g_data_output_stream_put_byte (o, 1, NULL, &error); + g_assert_no_error (error); + } + g_seekable_truncate (G_SEEKABLE (mo), 0, NULL, &error); + g_assert_no_error (error); + for (i = 0; i < 2000; i++) + { + g_data_output_stream_put_byte (o, 1, NULL, &error); + g_assert_no_error (error); + } + + g_object_unref (o); + g_object_unref (mo); +} + +static void +test_data_size (void) +{ + GOutputStream *mo; + GDataOutputStream *o; + int pos; + + g_test_bug ("540459"); + + mo = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + o = g_data_output_stream_new (mo); + g_data_output_stream_put_byte (o, 1, NULL, NULL); + pos = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mo)); + g_assert_cmpint (pos, ==, 1); + + g_seekable_seek (G_SEEKABLE (mo), 0, G_SEEK_CUR, NULL, NULL); + pos = g_seekable_tell (G_SEEKABLE (mo)); + g_assert_cmpint (pos, ==, 1); + + g_test_bug ("540461"); + + g_seekable_seek (G_SEEKABLE (mo), 0, G_SEEK_SET, NULL, NULL); + pos = g_seekable_tell (G_SEEKABLE (mo)); + g_assert_cmpint (pos, ==, 0); + + pos = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mo)); + g_assert_cmpint (pos, ==, 1); + + g_object_unref (o); + g_object_unref (mo); +} + +static void +test_properties (void) +{ + GOutputStream *mo; + GDataOutputStream *o; + int i; + GError *error = NULL; + + g_test_bug ("605733"); + + mo = (GOutputStream*) g_object_new (G_TYPE_MEMORY_OUTPUT_STREAM, + "realloc-function", g_realloc, + "destroy-function", g_free, + NULL); + o = g_data_output_stream_new (mo); + + for (i = 0; i < 1000; i++) + { + g_data_output_stream_put_byte (o, 1, NULL, &error); + g_assert_no_error (error); + } + + gsize data_size_fun = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mo)); + gsize data_size_prop; + g_object_get (mo, "data-size", &data_size_prop, NULL); + g_assert_cmpint (data_size_fun, ==, data_size_prop); + + gpointer data_fun = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (mo)); + gpointer data_prop; + g_object_get (mo, "data", &data_prop, NULL); + g_assert_cmphex (data_fun, ==, data_prop); + + g_object_unref (o); + g_object_unref (mo); +} + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/memory-output-stream/truncate", test_truncate); + g_test_add_func ("/memory-output-stream/get-data-size", test_data_size); + g_test_add_func ("/memory-output-stream/properties", test_properties); + + return g_test_run(); +} diff --git a/gio/tests/readwrite.c b/gio/tests/readwrite.c new file mode 100644 index 0000000..2b1bd5e --- /dev/null +++ b/gio/tests/readwrite.c @@ -0,0 +1,293 @@ +#include +#include +#include +#include +#include + +static const char *original_data = "This is some test data that we can put in a file..."; +static const char *new_data = "new data.."; + +static void +verify_pos (GIOStream *iostream, goffset expected_pos) +{ + goffset pos; + + pos = g_seekable_tell (G_SEEKABLE (iostream)); + g_assert_cmpint (pos, ==, expected_pos); + + pos = g_seekable_tell (G_SEEKABLE (g_io_stream_get_input_stream (iostream))); + g_assert_cmpint (pos, ==, expected_pos); + + pos = g_seekable_tell (G_SEEKABLE (g_io_stream_get_output_stream (iostream))); + g_assert_cmpint (pos, ==, expected_pos); +} + +static void +verify_iostream (GFileIOStream *file_iostream) +{ + gboolean res; + GIOStream *iostream; + GError *error; + GInputStream *in; + GOutputStream *out; + char buffer[1024]; + gsize n_bytes; + char *modified_data; + + iostream = G_IO_STREAM (file_iostream); + + verify_pos (iostream, 0); + + in = g_io_stream_get_input_stream (iostream); + out = g_io_stream_get_output_stream (iostream); + + res = g_input_stream_read_all (in, buffer, 20, &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint ((int)n_bytes, ==, 20); + + g_assert (memcmp (buffer, original_data, 20) == 0); + + verify_pos (iostream, 20); + + res = g_seekable_seek (G_SEEKABLE (iostream), + -10, G_SEEK_END, + NULL, NULL); + g_assert (res); + verify_pos (iostream, strlen (original_data) - 10); + + res = g_input_stream_read_all (in, buffer, 20, &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint ((int)n_bytes, ==, 10); + g_assert (memcmp (buffer, original_data + strlen (original_data) - 10, 10) == 0); + + verify_pos (iostream, strlen (original_data)); + + res = g_seekable_seek (G_SEEKABLE (iostream), + 10, G_SEEK_SET, + NULL, NULL); + + verify_pos (iostream, 10); + + res = g_output_stream_write_all (out, new_data, strlen (new_data), + &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint (n_bytes, ==, strlen (new_data)); + + verify_pos (iostream, 10 + strlen (new_data)); + + res = g_seekable_seek (G_SEEKABLE (iostream), + 0, G_SEEK_SET, + NULL, NULL); + g_assert (res); + verify_pos (iostream, 0); + + res = g_input_stream_read_all (in, buffer, strlen (original_data), &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint ((int)n_bytes, ==, strlen (original_data)); + buffer[n_bytes] = 0; + + modified_data = g_strdup (original_data); + memcpy (modified_data + 10, new_data, strlen (new_data)); + g_assert_cmpstr (buffer, ==, modified_data); + + verify_pos (iostream, strlen (original_data)); + + res = g_seekable_seek (G_SEEKABLE (iostream), + 0, G_SEEK_SET, + NULL, NULL); + g_assert (res); + verify_pos (iostream, 0); + + res = g_output_stream_close (out, NULL, NULL); + g_assert (res); + + res = g_input_stream_read_all (in, buffer, 15, &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint ((int)n_bytes, ==, 15); + g_assert (memcmp (buffer, modified_data, 15) == 0); + + error = NULL; + res = g_output_stream_write_all (out, new_data, strlen (new_data), + &n_bytes, NULL, &error); + g_assert (!res); + g_assert (error != NULL); + g_assert (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED)); + + error = NULL; + res = g_io_stream_close (iostream, NULL, &error); + g_assert (res && error == NULL); + + g_free (modified_data); +} + +static void +test_g_file_open_readwrite (void) +{ + char *tmp_file; + int fd; + gboolean res; + GFileIOStream *file_iostream; + char *path; + GFile *file; + GError *error; + + fd = g_file_open_tmp ("readwrite_XXXXXX", + &tmp_file, NULL); + g_assert (fd != -1); + close (fd); + + res = g_file_set_contents (tmp_file, + original_data, -1, NULL); + g_assert (res); + + path = g_build_filename (g_get_tmp_dir (), "g-a-nonexisting-file", NULL); + file = g_file_new_for_path (path); + g_free (path); + error = NULL; + file_iostream = g_file_open_readwrite (file, NULL, &error); + g_assert (file_iostream == NULL); + g_assert (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)); + g_error_free (error); + g_object_unref (file); + + file = g_file_new_for_path (tmp_file); + error = NULL; + file_iostream = g_file_open_readwrite (file, NULL, &error); + g_assert (file_iostream != NULL); + + verify_iostream (file_iostream); + + g_object_unref (file_iostream); + + g_unlink (tmp_file); + g_free (tmp_file); +} + +static void +test_g_file_create_readwrite (void) +{ + char *tmp_file; + int fd; + gboolean res; + GFileIOStream *file_iostream; + GOutputStream *out; + GFile *file; + GError *error; + gsize n_bytes; + + fd = g_file_open_tmp ("readwrite_XXXXXX", + &tmp_file, NULL); + g_assert (fd != -1); + close (fd); + + file = g_file_new_for_path (tmp_file); + error = NULL; + file_iostream = g_file_create_readwrite (file, 0, NULL, &error); + g_assert (file_iostream == NULL); + g_assert (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)); + + g_unlink (tmp_file); + file_iostream = g_file_create_readwrite (file, 0, NULL, &error); + g_assert (file_iostream != NULL); + + out = g_io_stream_get_output_stream (G_IO_STREAM (file_iostream)); + res = g_output_stream_write_all (out, original_data, strlen (original_data), + &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint (n_bytes, ==, strlen (original_data)); + + res = g_seekable_seek (G_SEEKABLE (file_iostream), + 0, G_SEEK_SET, + NULL, NULL); + g_assert (res); + + verify_iostream (file_iostream); + + g_object_unref (file_iostream); + + g_unlink (tmp_file); + g_free (tmp_file); +} + +static void +test_g_file_replace_readwrite (void) +{ + char *tmp_file, *backup, *data; + int fd; + gboolean res; + GFileIOStream *file_iostream; + GInputStream *in; + GOutputStream *out; + GFile *file; + GError *error; + char buffer[1024]; + gsize n_bytes; + + fd = g_file_open_tmp ("readwrite_XXXXXX", + &tmp_file, NULL); + g_assert (fd != -1); + close (fd); + + res = g_file_set_contents (tmp_file, + new_data, -1, NULL); + g_assert (res); + + file = g_file_new_for_path (tmp_file); + error = NULL; + file_iostream = g_file_replace_readwrite (file, NULL, + TRUE, 0, NULL, &error); + g_assert (file_iostream != NULL); + + in = g_io_stream_get_input_stream (G_IO_STREAM (file_iostream)); + + /* Ensure its empty */ + res = g_input_stream_read_all (in, buffer, sizeof buffer, &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint ((int)n_bytes, ==, 0); + + out = g_io_stream_get_output_stream (G_IO_STREAM (file_iostream)); + res = g_output_stream_write_all (out, original_data, strlen (original_data), + &n_bytes, NULL, NULL); + g_assert (res); + g_assert_cmpint (n_bytes, ==, strlen (original_data)); + + res = g_seekable_seek (G_SEEKABLE (file_iostream), + 0, G_SEEK_SET, + NULL, NULL); + g_assert (res); + + verify_iostream (file_iostream); + + g_object_unref (file_iostream); + + backup = g_strconcat (tmp_file, "~", NULL); + res = g_file_get_contents (backup, + &data, + NULL, NULL); + g_assert (res); + g_assert_cmpstr (data, ==, new_data); + g_free (data); + g_unlink (backup); + g_free (backup); + + g_unlink (tmp_file); + g_free (tmp_file); +} + + +int +main (int argc, + char *argv[]) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/readwrite/test_g_file_open_readwrite", + test_g_file_open_readwrite); + g_test_add_func ("/readwrite/test_g_file_create_readwrite", + test_g_file_create_readwrite); + g_test_add_func ("/readwrite/test_g_file_replace_readwrite", + test_g_file_replace_readwrite); + + return g_test_run(); +} diff --git a/gio/tests/resolver.c b/gio/tests/resolver.c new file mode 100644 index 0000000..64bc67e --- /dev/null +++ b/gio/tests/resolver.c @@ -0,0 +1,512 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" +#include +#include "glibintl.h" + +#include +#include +#include +#include +#include + +#include + +static GResolver *resolver; +static GCancellable *cancellable; +static GMainLoop *loop; +static int nlookups = 0; + +static void G_GNUC_NORETURN +usage (void) +{ + fprintf (stderr, "Usage: resolver [-t] [-s] [hostname | IP | service/protocol/domain ] ...\n"); + fprintf (stderr, " resolver [-t] [-s] -c [hostname | IP | service/protocol/domain ]\n"); + fprintf (stderr, " Use -t to enable threading.\n"); + fprintf (stderr, " Use -s to do synchronous lookups.\n"); + fprintf (stderr, " Both together will result in simultaneous lookups in multiple threads\n"); + fprintf (stderr, " Use -c (and only a single resolvable argument) to test GSocketConnectable.\n"); + exit (1); +} + +G_LOCK_DEFINE_STATIC (response); + +static void +done_lookup (void) +{ + nlookups--; + if (nlookups == 0) + { + /* In the sync case we need to make sure we don't call + * g_main_loop_quit before the loop is actually running... + */ + g_idle_add ((GSourceFunc)g_main_loop_quit, loop); + } +} + +static void +print_resolved_name (const char *phys, + char *name, + GError *error) +{ + G_LOCK (response); + printf ("Address: %s\n", phys); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else + { + printf ("Name: %s\n", name); + g_free (name); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +print_resolved_addresses (const char *name, + GList *addresses, + GError *error) +{ + char *phys; + GList *a; + + G_LOCK (response); + printf ("Name: %s\n", name); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else + { + for (a = addresses; a; a = a->next) + { + phys = g_inet_address_to_string (a->data); + printf ("Address: %s\n", phys); + g_free (phys); + g_object_unref (a->data); + } + g_list_free (addresses); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +print_resolved_service (const char *service, + GList *targets, + GError *error) +{ + GList *t; + + G_LOCK (response); + printf ("Service: %s\n", service); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else + { + for (t = targets; t; t = t->next) + { + printf ("%s:%u (pri %u, weight %u)\n", + g_srv_target_get_hostname (t->data), + g_srv_target_get_port (t->data), + g_srv_target_get_priority (t->data), + g_srv_target_get_weight (t->data)); + g_srv_target_free (t->data); + } + g_list_free (targets); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +lookup_one_sync (const char *arg) +{ + GError *error = NULL; + + if (strchr (arg, '/')) + { + GList *targets; + /* service/protocol/domain */ + char **parts = g_strsplit (arg, "/", 3); + + if (!parts || !parts[2]) + usage (); + + targets = g_resolver_lookup_service (resolver, + parts[0], parts[1], parts[2], + cancellable, &error); + print_resolved_service (arg, targets, error); + } + else if (g_hostname_is_ip_address (arg)) + { + GInetAddress *addr = g_inet_address_new_from_string (arg); + char *name; + + name = g_resolver_lookup_by_address (resolver, addr, cancellable, &error); + print_resolved_name (arg, name, error); + g_object_unref (addr); + } + else + { + GList *addresses; + + addresses = g_resolver_lookup_by_name (resolver, arg, cancellable, &error); + print_resolved_addresses (arg, addresses, error); + } +} + +static gpointer +lookup_thread (gpointer arg) +{ + lookup_one_sync (arg); + return NULL; +} + +static void +start_threaded_lookups (char **argv, int argc) +{ + int i; + + for (i = 0; i < argc; i++) + g_thread_create (lookup_thread, argv[i], FALSE, NULL); +} + +static void +start_sync_lookups (char **argv, int argc) +{ + int i; + + for (i = 0; i < argc; i++) + lookup_one_sync (argv[i]); +} + +static void +lookup_by_addr_callback (GObject *source, GAsyncResult *result, + gpointer user_data) +{ + const char *phys = user_data; + GError *error = NULL; + char *name; + + name = g_resolver_lookup_by_address_finish (resolver, result, &error); + print_resolved_name (phys, name, error); +} + +static void +lookup_by_name_callback (GObject *source, GAsyncResult *result, + gpointer user_data) +{ + const char *name = user_data; + GError *error = NULL; + GList *addresses; + + addresses = g_resolver_lookup_by_name_finish (resolver, result, &error); + print_resolved_addresses (name, addresses, error); +} + +static void +lookup_service_callback (GObject *source, GAsyncResult *result, + gpointer user_data) +{ + const char *service = user_data; + GError *error = NULL; + GList *targets; + + targets = g_resolver_lookup_service_finish (resolver, result, &error); + print_resolved_service (service, targets, error); +} + +static void +start_async_lookups (char **argv, int argc) +{ + int i; + + for (i = 0; i < argc; i++) + { + if (strchr (argv[i], '/')) + { + /* service/protocol/domain */ + char **parts = g_strsplit (argv[i], "/", 3); + + if (!parts || !parts[2]) + usage (); + + g_resolver_lookup_service_async (resolver, + parts[0], parts[1], parts[2], + cancellable, + lookup_service_callback, argv[i]); + } + else if (g_hostname_is_ip_address (argv[i])) + { + GInetAddress *addr = g_inet_address_new_from_string (argv[i]); + + g_resolver_lookup_by_address_async (resolver, addr, cancellable, + lookup_by_addr_callback, argv[i]); + g_object_unref (addr); + } + else + { + g_resolver_lookup_by_name_async (resolver, argv[i], cancellable, + lookup_by_name_callback, + argv[i]); + } + + /* Stress-test the reloading code */ + g_signal_emit_by_name (resolver, "reload"); + } +} + +static void +print_connectable_sockaddr (GSocketAddress *sockaddr, + GError *error) +{ + char *phys; + + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else if (!G_IS_INET_SOCKET_ADDRESS (sockaddr)) + { + printf ("Error: Unexpected sockaddr type '%s'\n", g_type_name_from_instance ((GTypeInstance *)sockaddr)); + g_object_unref (sockaddr); + } + else + { + GInetSocketAddress *isa = G_INET_SOCKET_ADDRESS (sockaddr); + phys = g_inet_address_to_string (g_inet_socket_address_get_address (isa)); + printf ("Address: %s%s%s:%d\n", + strchr (phys, ':') ? "[" : "", phys, strchr (phys, ':') ? "]" : "", + g_inet_socket_address_get_port (isa)); + g_free (phys); + g_object_unref (sockaddr); + } +} + +static void +do_sync_connectable (GSocketAddressEnumerator *enumerator) +{ + GSocketAddress *sockaddr; + GError *error = NULL; + + while ((sockaddr = g_socket_address_enumerator_next (enumerator, cancellable, &error))) + print_connectable_sockaddr (sockaddr, error); + + g_object_unref (enumerator); + done_lookup (); +} + +static void do_async_connectable (GSocketAddressEnumerator *enumerator); + +static void +got_next_async (GObject *source, GAsyncResult *result, gpointer user_data) +{ + GSocketAddressEnumerator *enumerator = G_SOCKET_ADDRESS_ENUMERATOR (source); + GSocketAddress *sockaddr; + GError *error = NULL; + + sockaddr = g_socket_address_enumerator_next_finish (enumerator, result, &error); + if (sockaddr || error) + print_connectable_sockaddr (sockaddr, error); + if (sockaddr) + do_async_connectable (enumerator); + else + { + g_object_unref (enumerator); + done_lookup (); + } +} + +static void +do_async_connectable (GSocketAddressEnumerator *enumerator) +{ + g_socket_address_enumerator_next_async (enumerator, cancellable, + got_next_async, NULL); +} + +static void +do_connectable (const char *arg, gboolean synchronous) +{ + char **parts; + GSocketConnectable *connectable; + GSocketAddressEnumerator *enumerator; + + if (strchr (arg, '/')) + { + /* service/protocol/domain */ + parts = g_strsplit (arg, "/", 3); + if (!parts || !parts[2]) + usage (); + + connectable = g_network_service_new (parts[0], parts[1], parts[2]); + } + else + { + guint16 port; + + parts = g_strsplit (arg, ":", 2); + if (parts && parts[1]) + { + arg = parts[0]; + port = strtoul (parts[1], NULL, 10); + } + else + port = 0; + + if (g_hostname_is_ip_address (arg)) + { + GInetAddress *addr = g_inet_address_new_from_string (arg); + GSocketAddress *sockaddr = g_inet_socket_address_new (addr, port); + + g_object_unref (addr); + connectable = G_SOCKET_CONNECTABLE (sockaddr); + } + else + connectable = g_network_address_new (arg, port); + } + + enumerator = g_socket_connectable_enumerate (connectable); + g_object_unref (connectable); + + if (synchronous) + do_sync_connectable (enumerator); + else + do_async_connectable (enumerator); +} + +#ifdef G_OS_UNIX +static int cancel_fds[2]; + +static void +interrupted (int sig) +{ + gssize c; + + signal (SIGINT, SIG_DFL); + c = write (cancel_fds[1], "x", 1); + g_assert_cmpint(c, ==, 1); +} + +static gboolean +async_cancel (GIOChannel *source, GIOCondition cond, gpointer cancel) +{ + g_cancellable_cancel (cancel); + return FALSE; +} +#endif + +int +main (int argc, char **argv) +{ + gboolean threaded = FALSE, synchronous = FALSE; + gboolean use_connectable = FALSE; +#ifdef G_OS_UNIX + GIOChannel *chan; + guint watch; +#endif + + /* We can't use GOptionContext because we use the arguments to + * decide whether or not to call g_thread_init(). + */ + while (argc >= 2 && argv[1][0] == '-') + { + if (!strcmp (argv[1], "-t")) + { + g_thread_init (NULL); + threaded = TRUE; + } + else if (!strcmp (argv[1], "-s")) + synchronous = TRUE; + else if (!strcmp (argv[1], "-c")) + use_connectable = TRUE; + else + usage (); + + argv++; + argc--; + } + g_type_init (); + + if (argc < 2 || (argc > 2 && use_connectable)) + usage (); + + resolver = g_resolver_get_default (); + + cancellable = g_cancellable_new (); + +#ifdef G_OS_UNIX + /* Set up cancellation; we want to cancel if the user ^C's the + * program, but we can't cancel directly from an interrupt. + */ + signal (SIGINT, interrupted); + + if (pipe (cancel_fds) == -1) + { + perror ("pipe"); + exit (1); + } + chan = g_io_channel_unix_new (cancel_fds[0]); + watch = g_io_add_watch (chan, G_IO_IN, async_cancel, cancellable); + g_io_channel_unref (chan); +#endif + + nlookups = argc - 1; + loop = g_main_loop_new (NULL, TRUE); + + if (use_connectable) + do_connectable (argv[1], synchronous); + else + { + if (threaded && synchronous) + start_threaded_lookups (argv + 1, argc - 1); + else if (synchronous) + start_sync_lookups (argv + 1, argc - 1); + else + start_async_lookups (argv + 1, argc - 1); + } + + g_main_loop_run (loop); + g_main_loop_unref (loop); + +#ifdef G_OS_UNIX + g_source_remove (watch); +#endif + g_object_unref (cancellable); + + return 0; +} diff --git a/gio/tests/send-data.c b/gio/tests/send-data.c new file mode 100644 index 0000000..a2592ce --- /dev/null +++ b/gio/tests/send-data.c @@ -0,0 +1,180 @@ +#include +#include +#include + +GMainLoop *loop; + +int cancel_timeout = 0; +gboolean async = FALSE; +gboolean graceful = FALSE; +static GOptionEntry cmd_entries[] = { + {"cancel", 'c', 0, G_OPTION_ARG_INT, &cancel_timeout, + "Cancel any op after the specified amount of seconds", NULL}, + {"async", 'a', 0, G_OPTION_ARG_NONE, &async, + "Use async ops", NULL}, + {"graceful-disconnect", 'g', 0, G_OPTION_ARG_NONE, &graceful, + "Use graceful disconnect", NULL}, + {NULL} +}; + +static gpointer +cancel_thread (gpointer data) +{ + GCancellable *cancellable = data; + + g_usleep (1000*1000*cancel_timeout); + g_print ("Cancelling\n"); + g_cancellable_cancel (cancellable); + return NULL; +} + +static char * +socket_address_to_string (GSocketAddress *address) +{ + GInetAddress *inet_address; + char *str, *res; + int port; + + inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)); + str = g_inet_address_to_string (inet_address); + port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); + res = g_strdup_printf ("%s:%d", str, port); + g_free (str); + return res; +} + +static void +async_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GAsyncResult **resp = user_data; + *resp = g_object_ref (res); + g_main_loop_quit (loop); +} + + +int +main (int argc, char *argv[]) +{ + GOptionContext *context; + GSocketClient *client; + GSocketConnection *connection; + GSocketAddress *address; + GCancellable *cancellable; + GOutputStream *out; + GError *error = NULL; + char buffer[1000]; + + g_type_init (); + g_thread_init (NULL); + + context = g_option_context_new (" [:port] - send data to tcp host"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (argc != 2) + { + g_printerr ("%s: %s\n", argv[0], "Need to specify hostname"); + return 1; + } + + if (async) + loop = g_main_loop_new (NULL, FALSE); + + if (cancel_timeout) + { + cancellable = g_cancellable_new (); + g_thread_create (cancel_thread, cancellable, FALSE, NULL); + } + else + { + cancellable = NULL; + } + + client = g_socket_client_new (); + + if (async) + { + GAsyncResult *res; + g_socket_client_connect_to_host_async (client, argv[1], 7777, + cancellable, async_cb, &res); + g_main_loop_run (loop); + connection = g_socket_client_connect_to_host_finish (client, res, &error); + g_object_unref (res); + } + else + { + connection = g_socket_client_connect_to_host (client, + argv[1], + 7777, + cancellable, &error); + } + if (connection == NULL) + { + g_printerr ("%s can't connect: %s\n", argv[0], error->message); + return 1; + } + g_object_unref (client); + + address = g_socket_connection_get_remote_address (connection, &error); + if (!address) + { + g_printerr ("Error getting remote address: %s\n", + error->message); + return 1; + } + g_print ("Connected to address: %s\n", + socket_address_to_string (address)); + g_object_unref (address); + + if (graceful) + g_tcp_connection_set_graceful_disconnect (G_TCP_CONNECTION (connection), TRUE); + + out = g_io_stream_get_output_stream (G_IO_STREAM (connection)); + + while (fgets(buffer, sizeof (buffer), stdin) != NULL) + { + /* FIXME if (async) */ + if (!g_output_stream_write_all (out, buffer, strlen (buffer), + NULL, cancellable, &error)) + { + g_warning ("send error: %s\n", error->message); + g_error_free (error); + error = NULL; + } + } + + g_print ("closing stream\n"); + if (async) + { + GAsyncResult *res; + g_io_stream_close_async (G_IO_STREAM (connection), + 0, cancellable, async_cb, &res); + g_main_loop_run (loop); + if (!g_io_stream_close_finish (G_IO_STREAM (connection), + res, &error)) + { + g_object_unref (res); + g_warning ("close error: %s\n", error->message); + return 1; + } + g_object_unref (res); + } + else + { + if (!g_io_stream_close (G_IO_STREAM (connection), cancellable, &error)) + { + g_warning ("close error: %s\n", error->message); + return 1; + } + } + + g_object_unref (connection); + + return 0; +} diff --git a/gio/tests/simple-async-result.c b/gio/tests/simple-async-result.c new file mode 100644 index 0000000..2b3f0a7 --- /dev/null +++ b/gio/tests/simple-async-result.c @@ -0,0 +1,130 @@ +/* + * Copyright © 2009 Ryan Lortie + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + */ + +#include +#include +#include +#include + +static GObject *got_source; +static GAsyncResult *got_result; +static gpointer got_user_data; + +static void +ensure_destroyed (gpointer obj) +{ + g_object_add_weak_pointer (obj, &obj); + g_object_unref (obj); + g_assert (obj == NULL); +} + +static void +reset (void) +{ + got_source = NULL; + + if (got_result) + ensure_destroyed (got_result); + + got_result = NULL; + got_user_data = NULL; +} + +static void +check (gpointer a, gpointer b, gpointer c) +{ + g_assert (a == got_source); + g_assert (b == got_result); + g_assert (c == got_user_data); +} + +static void +callback_func (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + got_source = source; + got_result = g_object_ref (result); + got_user_data = user_data; +} + +static gboolean +test_simple_async_idle (gpointer user_data) +{ + GSimpleAsyncResult *result; + GObject *a, *b, *c; + gboolean *ran = user_data; + + a = g_object_new (G_TYPE_OBJECT, NULL); + b = g_object_new (G_TYPE_OBJECT, NULL); + c = g_object_new (G_TYPE_OBJECT, NULL); + + result = g_simple_async_result_new (a, callback_func, b, test_simple_async_idle); + check (NULL, NULL, NULL); + g_simple_async_result_complete (result); + check (a, result, b); + g_object_unref (result); + + g_assert (g_simple_async_result_is_valid (got_result, a, test_simple_async_idle)); + g_assert (!g_simple_async_result_is_valid (got_result, b, test_simple_async_idle)); + g_assert (!g_simple_async_result_is_valid (got_result, c, test_simple_async_idle)); + g_assert (!g_simple_async_result_is_valid (got_result, b, callback_func)); + g_assert (!g_simple_async_result_is_valid ((gpointer) a, NULL, NULL)); + reset (); + reset (); + reset (); + + ensure_destroyed (a); + ensure_destroyed (b); + ensure_destroyed (c); + + *ran = TRUE; + return FALSE; +} + +static void +test_simple_async (void) +{ + GSimpleAsyncResult *result; + GObject *a, *b; + gboolean ran_test_in_idle = FALSE; + + g_idle_add (test_simple_async_idle, &ran_test_in_idle); + g_main_context_iteration (NULL, FALSE); + + g_assert (ran_test_in_idle); + + a = g_object_new (G_TYPE_OBJECT, NULL); + b = g_object_new (G_TYPE_OBJECT, NULL); + + result = g_simple_async_result_new (a, callback_func, b, test_simple_async); + check (NULL, NULL, NULL); + g_simple_async_result_complete_in_idle (result); + g_object_unref (result); + check (NULL, NULL, NULL); + g_main_context_iteration (NULL, FALSE); + check (a, result, b); + reset (); + + ensure_destroyed (a); + ensure_destroyed (b); +} + +int +main (int argc, char **argv) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gio/simple-async-result/test", test_simple_async); + + return g_test_run(); +} diff --git a/gio/tests/sleepy-stream.c b/gio/tests/sleepy-stream.c new file mode 100644 index 0000000..1c6613e --- /dev/null +++ b/gio/tests/sleepy-stream.c @@ -0,0 +1,296 @@ +/* + * Copyright © 2009 Codethink Limited + * + * This program 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 of the licence or (at + * your option) any later version. + * + * See the included COPYING file for more information. + * + * Author: Ryan Lortie + */ + +#include +#include + +#define MAX_PIECE_SIZE 100 +#define MAX_PIECES 60 + +static gchar * +cook_piece (void) +{ + char buffer[MAX_PIECE_SIZE * 2]; + gint symbols, i = 0; + + symbols = g_test_rand_int_range (1, MAX_PIECE_SIZE + 1); + + while (symbols--) + { + gint c = g_test_rand_int_range (0, 30); + + switch (c) + { + case 26: + buffer[i++] = '\n'; + case 27: + buffer[i++] = '\r'; + break; + + case 28: + buffer[i++] = '\r'; + case 29: + buffer[i++] = '\n'; + break; + + default: + buffer[i++] = c + 'a'; + break; + } + + g_assert_cmpint (i, <=, sizeof buffer); + } + + return g_strndup (buffer, i); +} + +static gchar ** +cook_pieces (void) +{ + gchar **array; + gint pieces; + + pieces = g_test_rand_int_range (0, MAX_PIECES + 1); + array = g_new (char *, pieces + 1); + array[pieces] = NULL; + + while (pieces--) + array[pieces] = cook_piece (); + + return array; +} + +typedef struct +{ + GInputStream parent_instance; + + gboolean built_to_fail; + gchar **pieces; + gint index; + + const gchar *current; +} SleepyStream; + +typedef GInputStreamClass SleepyStreamClass; + +GType sleepy_stream_get_type (void); + +G_DEFINE_TYPE (SleepyStream, sleepy_stream, G_TYPE_INPUT_STREAM) + +static gssize +sleepy_stream_read (GInputStream *stream, + void *buffer, + gsize length, + GCancellable *cancellable, + GError **error) +{ + SleepyStream *sleepy = (SleepyStream *) stream; + + if (sleepy->pieces[sleepy->index] == NULL) + { + if (sleepy->built_to_fail) + { + g_set_error (error, 0, 0, "fail"); + return -1; + } + else + return 0; + } + else + { + if (!sleepy->current) + sleepy->current = sleepy->pieces[sleepy->index++]; + + length = MIN (strlen (sleepy->current), length); + memcpy (buffer, sleepy->current, length); + + sleepy->current += length; + if (*sleepy->current == '\0') + sleepy->current = NULL; + + return length; + } +} + +static void +sleepy_stream_init (SleepyStream *sleepy) +{ + sleepy->pieces = cook_pieces (); + sleepy->built_to_fail = FALSE; + sleepy->index = 0; +} + +static void +sleepy_stream_finalize (GObject *object) +{ + SleepyStream *sleepy = (SleepyStream *) object; + + g_strfreev (sleepy->pieces); + G_OBJECT_CLASS (sleepy_stream_parent_class) + ->finalize (object); +} + +static void +sleepy_stream_class_init (SleepyStreamClass *class) +{ + G_OBJECT_CLASS (class)->finalize = sleepy_stream_finalize; + class->read_fn = sleepy_stream_read; + + /* no read_async implementation. + * main thread will sleep while read runs in a worker. + */ +} + +static SleepyStream * +sleepy_stream_new (void) +{ + return g_object_new (sleepy_stream_get_type (), NULL); +} + +static gboolean +read_line (GDataInputStream *stream, + GString *string, + const gchar *eol, + GError **error) +{ + gsize length; + int eol_len; + char *str; + + eol_len = 1 + (eol[1] != '\0'); + + str = g_data_input_stream_read_line (stream, &length, NULL, error); + + if (str == NULL) + return FALSE; + + g_assert (strstr (str, eol) == NULL); + g_assert (strlen (str) == length); + + g_string_append (string, str); + g_string_append (string, eol); + g_free (str); + + return TRUE; +} + +static void +build_comparison (GString *str, + SleepyStream *stream) +{ + /* build this for comparison */ + gint i; + + for (i = 0; stream->pieces[i]; i++) + g_string_append (str, stream->pieces[i]); + + if (str->len && str->str[str->len - 1] != '\n') + g_string_append_c (str, '\n'); +} + + +static void +test (void) +{ + SleepyStream *stream = sleepy_stream_new (); + GDataInputStream *data; + GError *error = NULL; + GString *one; + GString *two; + + one = g_string_new (NULL); + two = g_string_new (NULL); + + data = g_data_input_stream_new (G_INPUT_STREAM (stream)); + g_data_input_stream_set_newline_type (data, G_DATA_STREAM_NEWLINE_TYPE_LF); + build_comparison (one, stream); + + while (read_line (data, two, "\n", &error)); + + g_assert_cmpstr (one->str, ==, two->str); + g_string_free (one, TRUE); + g_string_free (two, TRUE); + g_object_unref (stream); + g_object_unref (data); +} + +static GDataInputStream *data; +static GString *one, *two; +static GMainLoop *loop; +static const gchar *eol; + +static void +asynch_ready (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + gsize length; + gchar *str; + + g_assert (data == G_DATA_INPUT_STREAM (object)); + + str = g_data_input_stream_read_line_finish (data, result, &length, &error); + + if (str == NULL) + { + g_main_loop_quit (loop); + if (error) + g_error_free (error); + } + else + { + g_assert (length == strlen (str)); + g_string_append (two, str); + g_string_append (two, eol); + g_free (str); + + /* MOAR!! */ + g_data_input_stream_read_line_async (data, 0, NULL, asynch_ready, NULL); + } +} + + +static void +asynch (void) +{ + SleepyStream *sleepy = sleepy_stream_new (); + + data = g_data_input_stream_new (G_INPUT_STREAM (sleepy)); + one = g_string_new (NULL); + two = g_string_new (NULL); + eol = "\n"; + + build_comparison (one, sleepy); + g_data_input_stream_read_line_async (data, 0, NULL, asynch_ready, NULL); + g_main_loop_run (loop = g_main_loop_new (NULL, FALSE)); + + g_assert_cmpstr (one->str, ==, two->str); + g_string_free (one, TRUE); + g_string_free (two, TRUE); + g_object_unref (sleepy); + g_object_unref (data); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_type_init (); + g_test_add_func ("/filter-stream/input", test); + g_test_add_func ("/filter-stream/async", asynch); + + return g_test_run(); +} diff --git a/gio/tests/socket-client.c b/gio/tests/socket-client.c new file mode 100644 index 0000000..f0f7c4e --- /dev/null +++ b/gio/tests/socket-client.c @@ -0,0 +1,300 @@ +#include +#include +#include +#include +#include + +GMainLoop *loop; + +gboolean verbose = FALSE; +gboolean non_blocking = FALSE; +gboolean use_udp = FALSE; +gboolean use_source = FALSE; +int cancel_timeout = 0; + +static GOptionEntry cmd_entries[] = { + {"cancel", 'c', 0, G_OPTION_ARG_INT, &cancel_timeout, + "Cancel any op after the specified amount of seconds", NULL}, + {"udp", 'u', 0, G_OPTION_ARG_NONE, &use_udp, + "Use udp instead of tcp", NULL}, + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, + "Be verbose", NULL}, + {"non-blocking", 'n', 0, G_OPTION_ARG_NONE, &non_blocking, + "Enable non-blocking i/o", NULL}, + {"use-source", 's', 0, G_OPTION_ARG_NONE, &use_source, + "Use GSource to wait for non-blocking i/o", NULL}, + {NULL} +}; + +static char * +socket_address_to_string (GSocketAddress *address) +{ + GInetAddress *inet_address; + char *str, *res; + int port; + + inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)); + str = g_inet_address_to_string (inet_address); + port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); + res = g_strdup_printf ("%s:%d", str, port); + g_free (str); + return res; +} + +static gboolean +source_ready (gpointer data, + GIOCondition condition) +{ + g_main_loop_quit (loop); + return FALSE; +} + +static void +ensure_condition (GSocket *socket, + const char *where, + GCancellable *cancellable, + GIOCondition condition) +{ + GError *error = NULL; + GSource *source; + + if (!non_blocking) + return; + + if (use_source) + { + source = g_socket_create_source (socket, + condition, + cancellable); + g_source_set_callback (source, + (GSourceFunc) source_ready, + NULL, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + g_main_loop_run (loop); + } + else + { + if (!g_socket_condition_wait (socket, condition, cancellable, &error)) + { + g_printerr ("condition wait error for %s: %s\n", + where, + error->message); + exit (1); + } + } +} + +static gpointer +cancel_thread (gpointer data) +{ + GCancellable *cancellable = data; + + g_usleep (1000*1000*cancel_timeout); + g_print ("Cancelling\n"); + g_cancellable_cancel (cancellable); + return NULL; +} + +int +main (int argc, + char *argv[]) +{ + GSocket *socket; + GSocketAddress *src_address; + GSocketAddress *address; + GSocketType socket_type; + GError *error = NULL; + GOptionContext *context; + GCancellable *cancellable; + GSocketAddressEnumerator *enumerator; + GSocketConnectable *connectable; + + g_thread_init (NULL); + + g_type_init (); + + context = g_option_context_new (" [:port] - Test GSocket client stuff"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (argc != 2) + { + g_printerr ("%s: %s\n", argv[0], "Need to specify hostname"); + return 1; + } + + if (cancel_timeout) + { + cancellable = g_cancellable_new (); + g_thread_create (cancel_thread, cancellable, FALSE, NULL); + } + else + { + cancellable = NULL; + } + + loop = g_main_loop_new (NULL, FALSE); + + if (use_udp) + socket_type = G_SOCKET_TYPE_DATAGRAM; + else + socket_type = G_SOCKET_TYPE_STREAM; + + socket = g_socket_new (G_SOCKET_FAMILY_IPV4, socket_type, 0, &error); + if (socket == NULL) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + connectable = g_network_address_parse (argv[1], 7777, &error); + if (connectable == NULL) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + enumerator = g_socket_connectable_enumerate (connectable); + while (TRUE) + { + address = g_socket_address_enumerator_next (enumerator, cancellable, &error); + if (address == NULL) + { + if (error == NULL) + g_printerr ("%s: No more addresses to try\n", argv[0]); + else + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (g_socket_connect (socket, address, cancellable, &error)) + break; + g_printerr ("%s: Connection to %s failed: %s, trying next\n", argv[0], socket_address_to_string (address), error->message); + g_error_free (error); + error = NULL; + + g_object_unref (address); + } + g_object_unref (enumerator); + g_object_unref (connectable); + + g_print ("Connected to %s\n", + socket_address_to_string (address)); + + /* TODO: Test non-blocking connect */ + if (non_blocking) + g_socket_set_blocking (socket, FALSE); + + src_address = g_socket_get_local_address (socket, &error); + if (!src_address) + { + g_printerr ("Error getting local address: %s\n", + error->message); + return 1; + } + g_print ("local address: %s\n", + socket_address_to_string (src_address)); + g_object_unref (src_address); + + while (TRUE) + { + gchar buffer[4096] = { }; + gssize size; + gsize to_send; + + if (fgets (buffer, sizeof buffer, stdin) == NULL) + break; + + to_send = strlen (buffer); + while (to_send > 0) + { + ensure_condition (socket, "send", cancellable, G_IO_OUT); + if (use_udp) + size = g_socket_send_to (socket, address, + buffer, to_send, + cancellable, &error); + else + size = g_socket_send (socket, buffer, to_send, + cancellable, &error); + + if (size < 0) + { + if (g_error_matches (error, + G_IO_ERROR, + G_IO_ERROR_WOULD_BLOCK)) + { + g_print ("socket send would block, handling\n"); + g_error_free (error); + error = NULL; + continue; + } + else + { + g_printerr ("Error sending to socket: %s\n", + error->message); + return 1; + } + } + + g_print ("sent %" G_GSSIZE_FORMAT " bytes of data\n", size); + + if (size == 0) + { + g_printerr ("Unexpected short write\n"); + return 1; + } + + to_send -= size; + } + + ensure_condition (socket, "receive", cancellable, G_IO_IN); + if (use_udp) + size = g_socket_receive_from (socket, &src_address, + buffer, sizeof buffer, + cancellable, &error); + else + size = g_socket_receive (socket, buffer, sizeof buffer, + cancellable, &error); + + if (size < 0) + { + g_printerr ("Error receiving from socket: %s\n", + error->message); + return 1; + } + + if (size == 0) + break; + + g_print ("received %" G_GSSIZE_FORMAT " bytes of data", size); + if (use_udp) + g_print (" from %s", socket_address_to_string (src_address)); + g_print ("\n"); + + if (verbose) + g_print ("-------------------------\n" + "%.*s" + "-------------------------\n", + (int)size, buffer); + + } + + g_print ("closing socket\n"); + + if (!g_socket_close (socket, &error)) + { + g_printerr ("Error closing master socket: %s\n", + error->message); + return 1; + } + + g_object_unref (G_OBJECT (socket)); + g_object_unref (G_OBJECT (address)); + + return 0; +} diff --git a/gio/tests/socket-server.c b/gio/tests/socket-server.c new file mode 100644 index 0000000..205cdaf --- /dev/null +++ b/gio/tests/socket-server.c @@ -0,0 +1,309 @@ +#include +#include +#include + +GMainLoop *loop; + +int port = 7777; +gboolean verbose = FALSE; +gboolean dont_reuse_address = FALSE; +gboolean non_blocking = FALSE; +gboolean use_udp = FALSE; +gboolean use_source = FALSE; +int cancel_timeout = 0; + +static GOptionEntry cmd_entries[] = { + {"port", 'p', 0, G_OPTION_ARG_INT, &port, + "Local port to bind to", NULL}, + {"cancel", 'c', 0, G_OPTION_ARG_INT, &cancel_timeout, + "Cancel any op after the specified amount of seconds", NULL}, + {"udp", 'u', 0, G_OPTION_ARG_NONE, &use_udp, + "Use udp instead of tcp", NULL}, + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, + "Be verbose", NULL}, + {"no-reuse", 0, 0, G_OPTION_ARG_NONE, &dont_reuse_address, + "Don't SOADDRREUSE", NULL}, + {"non-blocking", 'n', 0, G_OPTION_ARG_NONE, &non_blocking, + "Enable non-blocking i/o", NULL}, + {"use-source", 's', 0, G_OPTION_ARG_NONE, &use_source, + "Use GSource to wait for non-blocking i/o", NULL}, + {NULL} +}; + +static char * +socket_address_to_string (GSocketAddress *address) +{ + GInetAddress *inet_address; + char *str, *res; + int the_port; + + inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)); + str = g_inet_address_to_string (inet_address); + the_port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)); + res = g_strdup_printf ("%s:%d", str, the_port); + g_free (str); + return res; +} + +static gboolean +source_ready (gpointer data, + GIOCondition condition) +{ + g_main_loop_quit (loop); + return FALSE; +} + +static void +ensure_condition (GSocket *socket, + const char *where, + GCancellable *cancellable, + GIOCondition condition) +{ + GError *error = NULL; + GSource *source; + + if (!non_blocking) + return; + + if (use_source) + { + source = g_socket_create_source (socket, + condition, + cancellable); + g_source_set_callback (source, + (GSourceFunc) source_ready, + NULL, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + g_main_loop_run (loop); + } + else + { + if (!g_socket_condition_wait (socket, condition, cancellable, &error)) + { + g_printerr ("condition wait error for %s: %s\n", + where, + error->message); + exit (1); + } + } +} + +static gpointer +cancel_thread (gpointer data) +{ + GCancellable *cancellable = data; + + g_usleep (1000*1000*cancel_timeout); + g_print ("Cancelling\n"); + g_cancellable_cancel (cancellable); + return NULL; +} + +int +main (int argc, + char *argv[]) +{ + GSocket *socket, *new_socket, *recv_socket; + GSocketAddress *src_address; + GSocketAddress *address; + GSocketType socket_type; + GError *error = NULL; + GOptionContext *context; + GCancellable *cancellable; + + g_thread_init (NULL); + + g_type_init (); + + context = g_option_context_new (" - Test GSocket server stuff"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (cancel_timeout) + { + cancellable = g_cancellable_new (); + g_thread_create (cancel_thread, cancellable, FALSE, NULL); + } + else + { + cancellable = NULL; + } + + loop = g_main_loop_new (NULL, FALSE); + + if (use_udp) + socket_type = G_SOCKET_TYPE_DATAGRAM; + else + socket_type = G_SOCKET_TYPE_STREAM; + + socket = g_socket_new (G_SOCKET_FAMILY_IPV4, socket_type, 0, &error); + + if (socket == NULL) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (non_blocking) + g_socket_set_blocking (socket, FALSE); + + src_address = g_inet_socket_address_new (g_inet_address_new_any (G_SOCKET_FAMILY_IPV4), port); + if (!g_socket_bind (socket, src_address, !dont_reuse_address, &error)) + { + g_printerr ("Can't bind socket: %s\n", error->message); + return 1; + } + g_object_unref (src_address); + + if (!use_udp) + { + if (!g_socket_listen (socket, &error)) + { + g_printerr ("Can't listen on socket: %s\n", error->message); + return 1; + } + + g_print ("listening on port %d...\n", port); + + ensure_condition (socket, "accept", cancellable, G_IO_IN); + new_socket = g_socket_accept (socket, cancellable, &error); + if (!new_socket) + { + g_printerr ("Error accepting socket: %s\n", + error->message); + return 1; + } + + if (non_blocking) + g_socket_set_blocking (new_socket, FALSE); + + address = g_socket_get_remote_address (new_socket, &error); + if (!address) + { + g_printerr ("Error getting remote address: %s\n", + error->message); + return 1; + } + + g_print ("got a new connection from %s\n", + socket_address_to_string (address)); + g_object_unref (address); + + recv_socket = new_socket; + } + else + { + recv_socket = socket; + new_socket = NULL; + } + + + while (TRUE) + { + gchar buffer[4096] = { }; + gssize size; + gsize to_send; + + ensure_condition (recv_socket, "receive", cancellable, G_IO_IN); + if (use_udp) + size = g_socket_receive_from (recv_socket, &address, + buffer, sizeof buffer, + cancellable, &error); + else + size = g_socket_receive (recv_socket, buffer, sizeof buffer, + cancellable, &error); + + if (size < 0) + { + g_printerr ("Error receiving from socket: %s\n", + error->message); + return 1; + } + + if (size == 0) + break; + + g_print ("received %" G_GSSIZE_FORMAT " bytes of data", size); + if (use_udp) + g_print (" from %s", socket_address_to_string (address)); + g_print ("\n"); + + if (verbose) + g_print ("-------------------------\n" + "%.*s\n" + "-------------------------\n", + (int)size, buffer); + + to_send = size; + + while (to_send > 0) + { + ensure_condition (recv_socket, "send", cancellable, G_IO_OUT); + if (use_udp) + size = g_socket_send_to (recv_socket, address, + buffer, to_send, cancellable, &error); + else + size = g_socket_send (recv_socket, buffer, to_send, + cancellable, &error); + + if (size < 0) + { + if (g_error_matches (error, + G_IO_ERROR, + G_IO_ERROR_WOULD_BLOCK)) + { + g_print ("socket send would block, handling\n"); + g_error_free (error); + error = NULL; + continue; + } + else + { + g_printerr ("Error sending to socket: %s\n", + error->message); + return 1; + } + } + + g_print ("sent %" G_GSSIZE_FORMAT " bytes of data\n", size); + + if (size == 0) + { + g_printerr ("Unexpected short write\n"); + return 1; + } + + to_send -= size; + } + } + + g_print ("connection closed\n"); + + if (new_socket) + { + if (!g_socket_close (new_socket, &error)) + { + g_printerr ("Error closing connection socket: %s\n", + error->message); + return 1; + } + + g_object_unref (G_OBJECT (new_socket)); + } + + if (!g_socket_close (socket, &error)) + { + g_printerr ("Error closing master socket: %s\n", + error->message); + return 1; + } + + g_object_unref (G_OBJECT (socket)); + + return 0; +} diff --git a/gio/tests/srvtarget.c b/gio/tests/srvtarget.c new file mode 100644 index 0000000..c7330f9 --- /dev/null +++ b/gio/tests/srvtarget.c @@ -0,0 +1,158 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2009 Red Hat, Inc. + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +#define NUM_TRIALS 250000 + +struct { + const char *order; + int expected, seen; +} ordering[] = { + /* There are 32 legitimate orderings; the result always has to start + * with either "fe" (usually) or "ef" (rarely). For the remaining + * letters, "cbda" is the most likely, with various other orders + * possible, down to "adbc" being the most improbable. However, + * almost all "fe" orderings are more likely than almost any "ef" + * orderings. The complete probability ordering, from most-likely + * to least-likely is something roughly like: + */ + { "fecbda", 0.2468 * NUM_TRIALS, 0}, + { "febcda", 0.1885 * NUM_TRIALS, 0}, + { "fecdba", 0.1346 * NUM_TRIALS, 0}, + { "fedcba", 0.0830 * NUM_TRIALS, 0}, + { "febdca", 0.0706 * NUM_TRIALS, 0}, + { "fedbca", 0.0571 * NUM_TRIALS, 0}, + { "fecbad", 0.0496 * NUM_TRIALS, 0}, + { "febcad", 0.0374 * NUM_TRIALS, 0}, + { "fecabd", 0.0185 * NUM_TRIALS, 0}, + { "fecdab", 0.0136 * NUM_TRIALS, 0}, + { "fecadb", 0.0110 * NUM_TRIALS, 0}, + { "febacd", 0.0108 * NUM_TRIALS, 0}, + { "feacbd", 0.0096 * NUM_TRIALS, 0}, + { "fedcab", 0.0083 * NUM_TRIALS, 0}, + { "feabcd", 0.0073 * NUM_TRIALS, 0}, + { "feacdb", 0.0058 * NUM_TRIALS, 0}, + { "efcbda", 0.0049 * NUM_TRIALS, 0}, + { "febdac", 0.0048 * NUM_TRIALS, 0}, + { "febadc", 0.0043 * NUM_TRIALS, 0}, + { "fedbac", 0.0038 * NUM_TRIALS, 0}, + { "efbcda", 0.0038 * NUM_TRIALS, 0}, + { "feadcb", 0.0036 * NUM_TRIALS, 0}, + { "fedacb", 0.0035 * NUM_TRIALS, 0}, + { "feabdc", 0.0029 * NUM_TRIALS, 0}, + { "feadbc", 0.0026 * NUM_TRIALS, 0}, + { "fedabc", 0.0026 * NUM_TRIALS, 0}, + { "efcdba", 0.0026 * NUM_TRIALS, 0}, + { "efdcba", 0.0017 * NUM_TRIALS, 0}, + { "efbdca", 0.0014 * NUM_TRIALS, 0}, + { "efdbca", 0.0011 * NUM_TRIALS, 0}, + { "efcbad", 0.0010 * NUM_TRIALS, 0}, + { "efbcad", 0.0008 * NUM_TRIALS, 0}, + { "efcabd", 0.0004 * NUM_TRIALS, 0}, + { "efcdab", 0.0003 * NUM_TRIALS, 0}, + { "efcadb", 0.0002 * NUM_TRIALS, 0}, + { "efbacd", 0.0002 * NUM_TRIALS, 0}, + { "efacbd", 0.0002 * NUM_TRIALS, 0}, + { "efdcab", 0.0002 * NUM_TRIALS, 0}, + { "efabcd", 0.0002 * NUM_TRIALS, 0}, + { "efacdb", 0.0001 * NUM_TRIALS, 0}, + { "efbdac", 0.0001 * NUM_TRIALS, 0}, + { "efadcb", 0.0001 * NUM_TRIALS, 0}, + { "efdbac", 0.0001 * NUM_TRIALS, 0}, + { "efbadc", 0.0001 * NUM_TRIALS, 0}, + { "efdacb", 0.0001 * NUM_TRIALS, 0}, + { "efabdc", 0.0001 * NUM_TRIALS, 0}, + { "efadbc", 0.00005 * NUM_TRIALS, 0}, + { "efdabc", 0.00005 * NUM_TRIALS, 0} +}; +#define NUM_ORDERINGS G_N_ELEMENTS (ordering) + +static void +test_srv_target_ordering (void) +{ + GList *targets, *sorted, *t; + char result[7], *p; + int i; + guint o; + + targets = NULL; + /* name, port, priority, weight */ + targets = g_list_append (targets, g_srv_target_new ("a", 0, 2, 0)); + targets = g_list_append (targets, g_srv_target_new ("b", 0, 2, 10)); + targets = g_list_append (targets, g_srv_target_new ("c", 0, 2, 15)); + targets = g_list_append (targets, g_srv_target_new ("d", 0, 2, 5)); + targets = g_list_append (targets, g_srv_target_new ("e", 0, 1, 0)); + targets = g_list_append (targets, g_srv_target_new ("f", 0, 1, 50)); + + for (i = 0; i < NUM_TRIALS; i++) + { + g_random_set_seed (i); + + sorted = g_srv_target_list_sort (g_list_copy (targets)); + + for (t = sorted, p = result; t; t = t->next) + *(p++) = *g_srv_target_get_hostname (t->data); + *p = '\0'; + g_list_free (sorted); + + for (o = 0; o < NUM_ORDERINGS; o++) + { + if (!strcmp (result, ordering[o].order)) + { + ordering[o].seen++; + break; + } + } + + /* Assert that @result matched one of the valid orderings */ + if (o == NUM_ORDERINGS) + { + char *msg = g_strdup_printf ("result '%s' is invalid", result); + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + } + } + + /* Assert that each ordering appeared roughly the expected + * number of times. + */ + for (o = 0; o < NUM_ORDERINGS; o++) + { + g_assert_cmpint (ordering[o].seen, >, ordering[o].expected / 2); + g_assert_cmpint (ordering[o].seen, <, ordering[o].expected * 2); + } + + g_resolver_free_targets (targets); +} + +int +main (int argc, char **argv) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/srvtarget/srv-target-ordering", test_srv_target_ordering); + + return g_test_run(); +} diff --git a/gio/tests/unix-fd.c b/gio/tests/unix-fd.c new file mode 100644 index 0000000..a84e03f --- /dev/null +++ b/gio/tests/unix-fd.c @@ -0,0 +1,197 @@ +#include +#include +#include +#include +#include + +/* ensures that no FDs are left open at the end */ +static void +check_fd_list (const gint *fd_list) +{ + gint i; + + for (i = 0; i < 40; i++) + { + int my_fd; + + my_fd = dup (0); + g_assert_cmpint (fd_list[i], ==, my_fd); + } + + for (i = 0; i < 40; i++) + close (fd_list[i]); +} + +static void +create_fd_list (gint *fd_list) +{ + gint i; + + for (i = 0; i < 40; i++) + { + fd_list[i] = dup (0); + g_assert_cmpint (fd_list[i], >, 0); + } + + for (i = 0; i < 40; i++) + close (fd_list[i]); +} + +static void +test_fds (void) +{ + GUnixFDMessage *message; + GUnixFDMessage **mv; + GUnixFDList *list, *l2; + GSocket *sockets[2]; + const gint *peek; + char buffer[1024]; + gint fd_list[40]; + GOutputVector ov; + GInputVector iv; + gint *stolen; + gint sv[3]; + gint flags; + gint nm; + gint s; + + create_fd_list (fd_list); + + s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv); + g_assert_cmpint (s, ==, 0); + sv[2] = -1; + + list = g_unix_fd_list_new_from_array (sv, -1); + message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new_with_fd_list (list)); + g_object_unref (list); + + g_assert (g_unix_fd_message_get_fd_list (message) == list); + g_object_get (message, "fd-list", &l2, NULL); + g_assert (l2 == list); + g_assert_cmpint (g_unix_fd_list_get_length (list), ==, 2); + + peek = g_unix_fd_list_peek_fds (list, &s); + g_assert_cmpint (s, ==, 2); + stolen = g_unix_fd_message_steal_fds (message, &s); + g_assert_cmpint (s, ==, 2); + g_assert (stolen == peek); + + g_assert_cmpint (stolen[0], ==, sv[0]); + g_assert_cmpint (stolen[1], ==, sv[1]); + g_assert_cmpint (stolen[2], ==, sv[2]); + g_free (stolen); + + g_unix_fd_message_append_fd (message, sv[0], NULL); + s = close (sv[0]); + g_assert_cmpint (s, ==, 0); + g_unix_fd_message_append_fd (message, sv[1], NULL); + s = close (sv[1]); + g_assert_cmpint (s, ==, 0); + + s = close (g_unix_fd_list_get (list, 0, NULL)); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, NULL)); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 0, NULL)); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, NULL)); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 0, NULL)); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, NULL)); + g_assert_cmpint (s, ==, 0); + + g_object_unref (message); + g_object_unref (list); + + + + message = G_UNIX_FD_MESSAGE (g_unix_fd_message_new ()); + list = g_unix_fd_message_get_fd_list (message); + s = pipe (sv); + g_assert_cmpint (s, ==, 0); + + s = g_unix_fd_list_append (list, sv[0], NULL); + g_assert_cmpint (s, >=, 0); + s = g_unix_fd_list_append (list, sv[1], NULL); + g_assert_cmpint (s, >=, 0); + + s = close (sv[0]); + g_assert_cmpint (s, ==, 0); + s = close (sv[1]); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 0, NULL)); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, NULL)); + g_assert_cmpint (s, ==, 0); + + s = socketpair (PF_UNIX, SOCK_STREAM, 0, sv); + g_assert_cmpint (s, ==, 0); + + sockets[0] = g_socket_new_from_fd (sv[0], NULL); + g_assert (G_IS_SOCKET (sockets[0])); + sockets[1] = g_socket_new_from_fd (sv[1], NULL); + g_assert (G_IS_SOCKET (sockets[1])); + + buffer[0] = 0xff; + ov.buffer = buffer; + ov.size = 1; + s = g_socket_send_message (sockets[0], NULL, &ov, 1, + (GSocketControlMessage **) &message, + 1, 0, NULL, NULL); + g_assert_cmpint (s, ==, 1); + g_object_unref (message); + + message = NULL; + + flags = 0; + iv.buffer = buffer; + iv.size = 1; + s = g_socket_receive_message (sockets[1], NULL, &iv, 1, + (GSocketControlMessage ***) &mv, + &nm, &flags, NULL, NULL); + g_assert_cmpint (s, ==, 1); + g_object_unref (sockets[0]); + g_object_unref (sockets[1]); + + g_assert_cmpint (nm, ==, 1); + message = mv[0]; + g_free (mv); + + g_assert (G_IS_UNIX_FD_MESSAGE (message)); + list = g_object_ref (g_unix_fd_message_get_fd_list (message)); + g_object_unref (message); + + peek = g_unix_fd_list_peek_fds (list, &s); + g_assert_cmpint (s, ==, 2); + sv[0] = g_unix_fd_list_get (list, 1, NULL); + + strcpy (buffer, "failure to say failure to say 'i love gnome-panel!'."); + s = write (sv[0], buffer, strlen (buffer) + 1); + g_assert_cmpint (s, ==, strlen (buffer) + 1); + + close (sv[0]); + memset (buffer, 0xff, sizeof buffer); + + s = read (peek[0], buffer, sizeof buffer); + g_assert_cmpint (s, ==, 53); + g_assert_cmpstr (buffer, ==, + "failure to say failure to say 'i love gnome-panel!'."); + + g_object_unref (list); + + check_fd_list (fd_list); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_type_init (); + + g_test_add_func ("/unix-streams/file-descriptors", test_fds); + + return g_test_run(); + +} diff --git a/gio/tests/unix-streams.c b/gio/tests/unix-streams.c new file mode 100644 index 0000000..50b2d8c --- /dev/null +++ b/gio/tests/unix-streams.c @@ -0,0 +1,256 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Red Hat, Inc + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DATA "abcdefghijklmnopqrstuvwxyz" + +int writer_pipe[2], reader_pipe[2]; +GCancellable *writer_cancel, *reader_cancel, *main_cancel; +GMainLoop *loop; + +static gpointer +writer_thread (gpointer user_data) +{ + GOutputStream *out; + gssize nwrote, offset; + GError *err = NULL; + + out = g_unix_output_stream_new (writer_pipe[1], TRUE); + + do + { + g_usleep (10); + + offset = 0; + while (offset < (gssize) sizeof (DATA)) + { + nwrote = g_output_stream_write (out, DATA + offset, + sizeof (DATA) - offset, + writer_cancel, &err); + if (nwrote <= 0 || err != NULL) + break; + offset += nwrote; + } + + g_assert (nwrote > 0 || err != NULL); + } + while (err == NULL); + + if (g_cancellable_is_cancelled (writer_cancel)) + { + g_cancellable_cancel (main_cancel); + g_object_unref (out); + return NULL; + } + + g_warning ("writer: %s", err->message); + g_assert_not_reached (); +} + +static gpointer +reader_thread (gpointer user_data) +{ + GInputStream *in; + gssize nread = 0, total; + GError *err = NULL; + char buf[sizeof (DATA)]; + + in = g_unix_input_stream_new (reader_pipe[0], TRUE); + + do + { + total = 0; + while (total < (gssize) sizeof (DATA)) + { + nread = g_input_stream_read (in, buf + total, sizeof (buf) - total, + reader_cancel, &err); + if (nread <= 0 || err != NULL) + break; + total += nread; + } + + if (err) + break; + + if (nread == 0) + { + g_assert (err == NULL); + /* pipe closed */ + g_object_unref (in); + return NULL; + } + + g_assert_cmpstr (buf, ==, DATA); + g_assert (!g_cancellable_is_cancelled (reader_cancel)); + } + while (err == NULL); + + g_warning ("reader: %s", err->message); + g_assert_not_reached (); +} + +char main_buf[sizeof (DATA)]; +gssize main_len, main_offset; + +static void readable (GObject *source, GAsyncResult *res, gpointer user_data); +static void writable (GObject *source, GAsyncResult *res, gpointer user_data); + +static void +do_main_cancel (GOutputStream *out) +{ + g_output_stream_close (out, NULL, NULL); + g_main_loop_quit (loop); +} + +static void +readable (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GInputStream *in = G_INPUT_STREAM (source); + GOutputStream *out = user_data; + GError *err = NULL; + + main_len = g_input_stream_read_finish (in, res, &err); + + if (g_cancellable_is_cancelled (main_cancel)) + { + do_main_cancel (out); + return; + } + + g_assert (err == NULL); + + main_offset = 0; + g_output_stream_write_async (out, main_buf, main_len, + G_PRIORITY_DEFAULT, main_cancel, + writable, in); +} + +static void +writable (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GOutputStream *out = G_OUTPUT_STREAM (source); + GInputStream *in = user_data; + GError *err = NULL; + gssize nwrote; + + nwrote = g_output_stream_write_finish (out, res, &err); + + if (g_cancellable_is_cancelled (main_cancel)) + { + do_main_cancel (out); + return; + } + + g_assert (err == NULL); + g_assert_cmpint (nwrote, <=, main_len - main_offset); + + main_offset += nwrote; + if (main_offset == main_len) + { + g_input_stream_read_async (in, main_buf, sizeof (main_buf), + G_PRIORITY_DEFAULT, main_cancel, + readable, out); + } + else + { + g_output_stream_write_async (out, main_buf + main_offset, + main_len - main_offset, + G_PRIORITY_DEFAULT, main_cancel, + writable, in); + } +} + +static gboolean +timeout (gpointer cancellable) +{ + g_cancellable_cancel (cancellable); + return FALSE; +} + +static void +test_pipe_io (void) +{ + GThread *writer, *reader; + GInputStream *in; + GOutputStream *out; + + /* Split off two (additional) threads, a reader and a writer. From + * the writer thread, write data synchronously in small chunks, + * which gets read asynchronously by the main thread and then + * written asynchronously to the reader thread, which reads it + * synchronously. Eventually a timeout in the main thread will cause + * it to cancel the writer thread, which will in turn cancel the + * read op in the main thread, which will then close the pipe to + * the reader thread, causing the read op to fail. + */ + + g_assert (pipe (writer_pipe) == 0 && pipe (reader_pipe) == 0); + + writer_cancel = g_cancellable_new (); + reader_cancel = g_cancellable_new (); + main_cancel = g_cancellable_new (); + + writer = g_thread_create (writer_thread, NULL, TRUE, NULL); + reader = g_thread_create (reader_thread, NULL, TRUE, NULL); + + in = g_unix_input_stream_new (writer_pipe[0], TRUE); + out = g_unix_output_stream_new (reader_pipe[1], TRUE); + + g_input_stream_read_async (in, main_buf, sizeof (main_buf), + G_PRIORITY_DEFAULT, main_cancel, + readable, out); + + g_timeout_add (500, timeout, writer_cancel); + + loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_thread_join (reader); + g_thread_join (writer); + + g_object_unref (main_cancel); + g_object_unref (reader_cancel); + g_object_unref (writer_cancel); + g_object_unref (in); + g_object_unref (out); +} + +int +main (int argc, + char *argv[]) +{ + g_thread_init (NULL); + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/unix-streams/pipe-io-test", test_pipe_io); + + return g_test_run(); +} diff --git a/gio/win32/Makefile.am b/gio/win32/Makefile.am new file mode 100644 index 0000000..bb609e3 --- /dev/null +++ b/gio/win32/Makefile.am @@ -0,0 +1,31 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +noinst_LTLIBRARIES = libgiowin32.la + +libgiowin32_la_SOURCES = \ + gwin32directorymonitor.c \ + gwin32directorymonitor.h \ + gwinhttpvfs.c \ + gwinhttpvfs.h \ + gwinhttpfile.c \ + gwinhttpfile.h \ + gwinhttpfileinputstream.c \ + gwinhttpfileinputstream.h \ + gwinhttpfileoutputstream.c \ + gwinhttpfileoutputstream.h \ + winhttp.h \ + $(NULL) + +libgiowin32_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_builddir)/gio \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED diff --git a/gio/win32/Makefile.in b/gio/win32/Makefile.in new file mode 100644 index 0000000..f897f0c --- /dev/null +++ b/gio/win32/Makefile.in @@ -0,0 +1,729 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = gio/win32 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libgiowin32_la_LIBADD = +am__objects_1 = +am_libgiowin32_la_OBJECTS = libgiowin32_la-gwin32directorymonitor.lo \ + libgiowin32_la-gwinhttpvfs.lo libgiowin32_la-gwinhttpfile.lo \ + libgiowin32_la-gwinhttpfileinputstream.lo \ + libgiowin32_la-gwinhttpfileoutputstream.lo $(am__objects_1) +libgiowin32_la_OBJECTS = $(am_libgiowin32_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgiowin32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libgiowin32_la_CFLAGS) $(CFLAGS) $(AM_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgiowin32_la_SOURCES) +DIST_SOURCES = $(libgiowin32_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +NULL = +noinst_LTLIBRARIES = libgiowin32.la +libgiowin32_la_SOURCES = \ + gwin32directorymonitor.c \ + gwin32directorymonitor.h \ + gwinhttpvfs.c \ + gwinhttpvfs.h \ + gwinhttpfile.c \ + gwinhttpfile.h \ + gwinhttpfileinputstream.c \ + gwinhttpfileinputstream.h \ + gwinhttpfileoutputstream.c \ + gwinhttpfileoutputstream.h \ + winhttp.h \ + $(NULL) + +libgiowin32_la_CFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -I$(top_builddir)/gio \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -I$(top_srcdir)/gio \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/win32/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/win32/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 +libgiowin32.la: $(libgiowin32_la_OBJECTS) $(libgiowin32_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgiowin32_la_LINK) $(libgiowin32_la_OBJECTS) $(libgiowin32_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiowin32_la-gwin32directorymonitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiowin32_la-gwinhttpfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiowin32_la-gwinhttpfileinputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiowin32_la-gwinhttpfileoutputstream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgiowin32_la-gwinhttpvfs.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 $@ $< + +libgiowin32_la-gwin32directorymonitor.lo: gwin32directorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -MT libgiowin32_la-gwin32directorymonitor.lo -MD -MP -MF $(DEPDIR)/libgiowin32_la-gwin32directorymonitor.Tpo -c -o libgiowin32_la-gwin32directorymonitor.lo `test -f 'gwin32directorymonitor.c' || echo '$(srcdir)/'`gwin32directorymonitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiowin32_la-gwin32directorymonitor.Tpo $(DEPDIR)/libgiowin32_la-gwin32directorymonitor.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gwin32directorymonitor.c' object='libgiowin32_la-gwin32directorymonitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -c -o libgiowin32_la-gwin32directorymonitor.lo `test -f 'gwin32directorymonitor.c' || echo '$(srcdir)/'`gwin32directorymonitor.c + +libgiowin32_la-gwinhttpvfs.lo: gwinhttpvfs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -MT libgiowin32_la-gwinhttpvfs.lo -MD -MP -MF $(DEPDIR)/libgiowin32_la-gwinhttpvfs.Tpo -c -o libgiowin32_la-gwinhttpvfs.lo `test -f 'gwinhttpvfs.c' || echo '$(srcdir)/'`gwinhttpvfs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiowin32_la-gwinhttpvfs.Tpo $(DEPDIR)/libgiowin32_la-gwinhttpvfs.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gwinhttpvfs.c' object='libgiowin32_la-gwinhttpvfs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -c -o libgiowin32_la-gwinhttpvfs.lo `test -f 'gwinhttpvfs.c' || echo '$(srcdir)/'`gwinhttpvfs.c + +libgiowin32_la-gwinhttpfile.lo: gwinhttpfile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -MT libgiowin32_la-gwinhttpfile.lo -MD -MP -MF $(DEPDIR)/libgiowin32_la-gwinhttpfile.Tpo -c -o libgiowin32_la-gwinhttpfile.lo `test -f 'gwinhttpfile.c' || echo '$(srcdir)/'`gwinhttpfile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiowin32_la-gwinhttpfile.Tpo $(DEPDIR)/libgiowin32_la-gwinhttpfile.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gwinhttpfile.c' object='libgiowin32_la-gwinhttpfile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -c -o libgiowin32_la-gwinhttpfile.lo `test -f 'gwinhttpfile.c' || echo '$(srcdir)/'`gwinhttpfile.c + +libgiowin32_la-gwinhttpfileinputstream.lo: gwinhttpfileinputstream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -MT libgiowin32_la-gwinhttpfileinputstream.lo -MD -MP -MF $(DEPDIR)/libgiowin32_la-gwinhttpfileinputstream.Tpo -c -o libgiowin32_la-gwinhttpfileinputstream.lo `test -f 'gwinhttpfileinputstream.c' || echo '$(srcdir)/'`gwinhttpfileinputstream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiowin32_la-gwinhttpfileinputstream.Tpo $(DEPDIR)/libgiowin32_la-gwinhttpfileinputstream.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gwinhttpfileinputstream.c' object='libgiowin32_la-gwinhttpfileinputstream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -c -o libgiowin32_la-gwinhttpfileinputstream.lo `test -f 'gwinhttpfileinputstream.c' || echo '$(srcdir)/'`gwinhttpfileinputstream.c + +libgiowin32_la-gwinhttpfileoutputstream.lo: gwinhttpfileoutputstream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -MT libgiowin32_la-gwinhttpfileoutputstream.lo -MD -MP -MF $(DEPDIR)/libgiowin32_la-gwinhttpfileoutputstream.Tpo -c -o libgiowin32_la-gwinhttpfileoutputstream.lo `test -f 'gwinhttpfileoutputstream.c' || echo '$(srcdir)/'`gwinhttpfileoutputstream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgiowin32_la-gwinhttpfileoutputstream.Tpo $(DEPDIR)/libgiowin32_la-gwinhttpfileoutputstream.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gwinhttpfileoutputstream.c' object='libgiowin32_la-gwinhttpfileoutputstream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgiowin32_la_CFLAGS) $(CFLAGS) -c -o libgiowin32_la-gwinhttpfileoutputstream.lo `test -f 'gwinhttpfileoutputstream.c' || echo '$(srcdir)/'`gwinhttpfileoutputstream.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gio/win32/gwin32directorymonitor.c b/gio/win32/gwin32directorymonitor.c new file mode 100644 index 0000000..6e9fa68 --- /dev/null +++ b/gio/win32/gwin32directorymonitor.c @@ -0,0 +1,250 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Vlad Grecescu + * + */ + +#define _WIN32_WINNT 0x0400 + +#include "config.h" +#include "gwin32directorymonitor.h" +#include "giomodule.h" +#include + +G_DEFINE_TYPE_WITH_CODE (GWin32DirectoryMonitor, + g_win32_directory_monitor, + G_TYPE_LOCAL_DIRECTORY_MONITOR, + g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "readdirectorychanges", + 20)) + +struct _GWin32DirectoryMonitorPrivate { + OVERLAPPED overlapped; + DWORD buffer_allocated_bytes; + gchar *file_notify_buffer; + DWORD buffer_filled_bytes; + HANDLE hDirectory; + /* Needed in the APC where we only have this private struct */ + GFileMonitor *self; +}; + +static void g_win32_directory_monitor_finalize (GObject *base); +static gboolean g_win32_directory_monitor_cancel (GFileMonitor *base); + +static GObject *g_win32_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties); + +static gboolean +g_win32_directory_monitor_is_supported (void) +{ + return TRUE; +} + +static void +g_win32_directory_monitor_finalize (GObject *base) +{ + GWin32DirectoryMonitor *self; + self = G_WIN32_DIRECTORY_MONITOR (base); + + if (self->priv->hDirectory == INVALID_HANDLE_VALUE) + { + /* If we don't have a directory handle we can free + * self->priv->file_notify_buffer and self->priv here. The + * callback won't be called obviously any more (and presumably + * never has been called). + */ + g_free (self->priv->file_notify_buffer); + self->priv->file_notify_buffer = NULL; + g_free (self->priv); + } + else + { + /* If we have a directory handle, the OVERLAPPED struct is + * passed once more to the callback as a result of the + * CloseHandle() done in the cancel method, so self->priv has to + * be kept around. The GWin32DirectoryMonitor object is + * disappearing, so can't leave a pointer to it in + * self->priv->self. + */ + self->priv->self = NULL; + } + + if (G_OBJECT_CLASS (g_win32_directory_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_win32_directory_monitor_parent_class)->finalize) (base); +} + +static gboolean +g_win32_directory_monitor_cancel (GFileMonitor *base) +{ + GWin32DirectoryMonitor *self; + self = G_WIN32_DIRECTORY_MONITOR (base); + + /* This triggers a last callback() with nBytes==0. */ + + /* Actually I am not so sure about that, it seems to trigger a last + * callback allright, but the way to recognize that it is the final + * one is not to check for nBytes==0, I think that was a + * misunderstanding. + */ + if (self->priv->hDirectory != INVALID_HANDLE_VALUE) + CloseHandle (self->priv->hDirectory); + + if (G_FILE_MONITOR_CLASS (g_win32_directory_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_win32_directory_monitor_parent_class)->cancel) (base); + return TRUE; +} + +static void CALLBACK +g_win32_directory_monitor_callback (DWORD error, + DWORD nBytes, + LPOVERLAPPED lpOverlapped) +{ + gulong offset; + PFILE_NOTIFY_INFORMATION pfile_notify_walker; + glong file_name_len; + gchar *file_name; + gchar *path; + GFile *file; + GWin32DirectoryMonitorPrivate *priv = (GWin32DirectoryMonitorPrivate *) lpOverlapped; + + static GFileMonitorEvent events[] = + { + 0, + G_FILE_MONITOR_EVENT_CREATED, /* FILE_ACTION_ADDED */ + G_FILE_MONITOR_EVENT_DELETED, /* FILE_ACTION_REMOVED */ + G_FILE_MONITOR_EVENT_CHANGED, /* FILE_ACTION_MODIFIED */ + G_FILE_MONITOR_EVENT_DELETED, /* FILE_ACTION_RENAMED_OLD_NAME */ + G_FILE_MONITOR_EVENT_CREATED, /* FILE_ACTION_RENAMED_NEW_NAME */ + }; + + /* If priv->self is NULL the GWin32DirectoryMonitor object has been destroyed. */ + if (priv->self == NULL || + g_file_monitor_is_cancelled (priv->self) || + priv->file_notify_buffer == NULL) + { + g_free (priv->file_notify_buffer); + g_free (priv); + return; + } + + offset = 0; + do { + pfile_notify_walker = (PFILE_NOTIFY_INFORMATION)(priv->file_notify_buffer + offset); + if (pfile_notify_walker->Action > 0) + { + file_name = g_utf16_to_utf8 (pfile_notify_walker->FileName, pfile_notify_walker->FileNameLength / sizeof(WCHAR), NULL, &file_name_len, NULL); + path = g_build_filename(G_LOCAL_DIRECTORY_MONITOR (priv->self)->dirname, file_name, NULL); + file = g_file_new_for_path (path); + g_file_monitor_emit_event (priv->self, file, NULL, events [pfile_notify_walker->Action]); + g_object_unref (file); + g_free (path); + g_free (file_name); + } + offset += pfile_notify_walker->NextEntryOffset; + } while (pfile_notify_walker->NextEntryOffset); + + ReadDirectoryChangesW (priv->hDirectory, + (gpointer)priv->file_notify_buffer, + priv->buffer_allocated_bytes, + FALSE, + FILE_NOTIFY_CHANGE_FILE_NAME | + FILE_NOTIFY_CHANGE_DIR_NAME | + FILE_NOTIFY_CHANGE_ATTRIBUTES | + FILE_NOTIFY_CHANGE_SIZE, + &priv->buffer_filled_bytes, + &priv->overlapped, + g_win32_directory_monitor_callback); +} + +static GObject * +g_win32_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) { + GObject *obj; + GWin32DirectoryMonitorClass *klass; + GObjectClass *parent_class; + GWin32DirectoryMonitor *self; + wchar_t *wdirname; + gboolean result; + + klass = G_WIN32_DIRECTORY_MONITOR_CLASS (g_type_class_peek (G_TYPE_WIN32_DIRECTORY_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, n_construct_properties, construct_properties); + self = G_WIN32_DIRECTORY_MONITOR (obj); + wdirname = g_utf8_to_utf16 (G_LOCAL_DIRECTORY_MONITOR (obj)->dirname, -1, NULL, NULL, NULL); + + self->priv->hDirectory = CreateFileW (wdirname, + FILE_LIST_DIRECTORY, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, + NULL); + g_free (wdirname); + if (self->priv->hDirectory == INVALID_HANDLE_VALUE) + { + /* Ignore errors */ + return obj; + } + + result = ReadDirectoryChangesW (self->priv->hDirectory, + (gpointer)self->priv->file_notify_buffer, + self->priv->buffer_allocated_bytes, + FALSE, + FILE_NOTIFY_CHANGE_FILE_NAME | + FILE_NOTIFY_CHANGE_DIR_NAME | + FILE_NOTIFY_CHANGE_ATTRIBUTES | + FILE_NOTIFY_CHANGE_SIZE, + &self->priv->buffer_filled_bytes, + &self->priv->overlapped, + g_win32_directory_monitor_callback); + /* Ignore errors */ + + return obj; +} + +static void +g_win32_directory_monitor_class_init (GWin32DirectoryMonitorClass *klass) +{ + g_win32_directory_monitor_parent_class = g_type_class_peek_parent (klass); + + G_OBJECT_CLASS (klass)->constructor = g_win32_directory_monitor_constructor; + G_OBJECT_CLASS (klass)->finalize = g_win32_directory_monitor_finalize; + G_FILE_MONITOR_CLASS (klass)->cancel = g_win32_directory_monitor_cancel; + + G_LOCAL_DIRECTORY_MONITOR_CLASS (klass)->mount_notify = FALSE; + G_LOCAL_DIRECTORY_MONITOR_CLASS (klass)->is_supported = g_win32_directory_monitor_is_supported; +} + +static void +g_win32_directory_monitor_init (GWin32DirectoryMonitor *self) +{ + self->priv = (GWin32DirectoryMonitorPrivate*)g_new0 (GWin32DirectoryMonitorPrivate, 1); + g_assert (self->priv != 0); + + self->priv->buffer_allocated_bytes = 32768; + self->priv->file_notify_buffer = g_new0 (gchar, self->priv->buffer_allocated_bytes); + g_assert (self->priv->file_notify_buffer); + + self->priv->self = G_FILE_MONITOR (self); +} diff --git a/gio/win32/gwin32directorymonitor.h b/gio/win32/gwin32directorymonitor.h new file mode 100644 index 0000000..1504bd4 --- /dev/null +++ b/gio/win32/gwin32directorymonitor.h @@ -0,0 +1,62 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Vlad Grecescu + * + */ +#ifndef __G_WIN32_DIRECTORY_MONITOR_H__ +#define __G_WIN32_DIRECTORY_MONITOR_H__ + +#include +#include +#include +#include +#include + +#include "glocaldirectorymonitor.h" +#include "giomodule.h" + +G_BEGIN_DECLS + + +#define G_TYPE_WIN32_DIRECTORY_MONITOR (g_win32_directory_monitor_get_type ()) +#define G_WIN32_DIRECTORY_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_WIN32_DIRECTORY_MONITOR, GWin32DirectoryMonitor)) +#define G_WIN32_DIRECTORY_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_WIN32_DIRECTORY_MONITOR, GWin32DirectoryMonitorClass)) +#define G_IS_WIN32_DIRECTORY_MONITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_WIN32_DIRECTORY_MONITOR)) +#define G_IS_WIN32_DIRECTORY_MONITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), G_TYPE_WIN32_DIRECTORY_MONITOR)) +#define G_WIN32_DIRECTORY_MONITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_WIN32_DIRECTORY_MONITOR, GWin32DirectoryMonitorClass)) + +typedef struct _GWin32DirectoryMonitor GWin32DirectoryMonitor; +typedef struct _GWin32DirectoryMonitorClass GWin32DirectoryMonitorClass; +typedef struct _GWin32DirectoryMonitorPrivate GWin32DirectoryMonitorPrivate; + +struct _GWin32DirectoryMonitor { + GLocalDirectoryMonitor parent_instance; + GWin32DirectoryMonitorPrivate * priv; +}; +struct _GWin32DirectoryMonitorClass { + GLocalDirectoryMonitorClass parent_class; +}; + +GType g_win32_directory_monitor_get_type (void); +void g_win32_directory_monitor_register (GIOModule *module); + +G_END_DECLS + +#endif /* __G_WIN32_DIRECTORY_MONITOR_H__ */ diff --git a/gio/win32/gwinhttpfile.c b/gio/win32/gwinhttpfile.c new file mode 100644 index 0000000..5f2d6be --- /dev/null +++ b/gio/win32/gwinhttpfile.c @@ -0,0 +1,787 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#include "config.h" + +#include +#include +#include + +#include "gfile.h" +#include "gfileattribute.h" +#include "gfileinfo.h" +#include "gwinhttpfile.h" +#include "gwinhttpfileinputstream.h" +#include "gwinhttpfileoutputstream.h" +#include "gioerror.h" + +#include "glibintl.h" + +#include "gioalias.h" + +static void g_winhttp_file_file_iface_init (GFileIface *iface); + +#define g_winhttp_file_get_type _g_winhttp_file_get_type +G_DEFINE_TYPE_WITH_CODE (GWinHttpFile, g_winhttp_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_FILE, + g_winhttp_file_file_iface_init)) + +static void +g_winhttp_file_finalize (GObject *object) +{ + GWinHttpFile *file; + + file = G_WINHTTP_FILE (object); + + g_free (file->url.lpszScheme); + g_free (file->url.lpszHostName); + g_free (file->url.lpszUserName); + g_free (file->url.lpszPassword); + g_free (file->url.lpszUrlPath); + g_free (file->url.lpszExtraInfo); + + g_object_unref (file->vfs); + + G_OBJECT_CLASS (g_winhttp_file_parent_class)->finalize (object); +} + +static void +g_winhttp_file_class_init (GWinHttpFileClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_winhttp_file_finalize; +} + +static void +g_winhttp_file_init (GWinHttpFile *winhttp) +{ +} + +/* + * _g_winhttp_file_new: + * @vfs: GWinHttpVfs to use + * @uri: URI of the GWinHttpFile to create. + * + * Returns: new winhttp #GFile. + */ +GFile * +_g_winhttp_file_new (GWinHttpVfs *vfs, + const char *uri) +{ + wchar_t *wuri; + GWinHttpFile *file; + + wuri = g_utf8_to_utf16 (uri, -1, NULL, NULL, NULL); + + if (wuri == NULL) + return NULL; + + file = g_object_new (G_TYPE_WINHTTP_FILE, NULL); + file->vfs = g_object_ref (vfs); + + memset (&file->url, 0, sizeof (file->url)); + file->url.dwStructSize = sizeof (file->url); + file->url.dwSchemeLength = 1; + file->url.dwHostNameLength = 1; + file->url.dwUserNameLength = 1; + file->url.dwPasswordLength = 1; + file->url.dwUrlPathLength = 1; + file->url.dwExtraInfoLength = 1; + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url)) + { + g_free (wuri); + return NULL; + } + + file->url.lpszScheme = g_new (wchar_t, ++file->url.dwSchemeLength); + file->url.lpszHostName = g_new (wchar_t, ++file->url.dwHostNameLength); + file->url.lpszUserName = g_new (wchar_t, ++file->url.dwUserNameLength); + file->url.lpszPassword = g_new (wchar_t, ++file->url.dwPasswordLength); + file->url.lpszUrlPath = g_new (wchar_t, ++file->url.dwUrlPathLength); + file->url.lpszExtraInfo = g_new (wchar_t, ++file->url.dwExtraInfoLength); + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url)) + { + g_free (file->url.lpszScheme); + g_free (file->url.lpszHostName); + g_free (file->url.lpszUserName); + g_free (file->url.lpszPassword); + g_free (file->url.lpszUrlPath); + g_free (file->url.lpszExtraInfo); + g_free (wuri); + return NULL; + } + + g_free (wuri); + return G_FILE (file); +} + +static gboolean +g_winhttp_file_is_native (GFile *file) +{ + return FALSE; +} + +static gboolean +g_winhttp_file_has_uri_scheme (GFile *file, + const char *uri_scheme) +{ + return (g_ascii_strcasecmp (uri_scheme, "http") == 0 || + g_ascii_strcasecmp (uri_scheme, "https") == 0); +} + +static char * +g_winhttp_file_get_uri_scheme (GFile *file) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + + return g_utf16_to_utf8 (winhttp_file->url.lpszScheme, -1, NULL, NULL, NULL); +} + +static char * +g_winhttp_file_get_basename (GFile *file) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + char *basename; + char *last_slash; + char *retval; + + basename = g_utf16_to_utf8 (winhttp_file->url.lpszUrlPath, -1, NULL, NULL, NULL); + last_slash = strrchr (basename, '/'); + /* If no slash, or only "/" fallback to full path part of URI */ + if (last_slash == NULL || last_slash[1] == '\0') + return basename; + + retval = g_strdup (last_slash + 1); + g_free (basename); + + return retval; +} + +static char * +g_winhttp_file_get_path (GFile *file) +{ + return NULL; +} + +static char * +g_winhttp_file_get_uri (GFile *file) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + DWORD len; + wchar_t *wuri; + char *retval; + + len = 0; + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, NULL, &len) && + GetLastError () != ERROR_INSUFFICIENT_BUFFER) + return NULL; + + wuri = g_new (wchar_t, ++len); + + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, wuri, &len)) + { + g_free (wuri); + return NULL; + } + + retval = g_utf16_to_utf8 (wuri, -1, NULL, NULL, NULL); + g_free (wuri); + + if (g_str_has_prefix (retval, "http://:@")) + { + memmove (retval + 7, retval + 9, strlen (retval) - 9); + retval[strlen (retval) - 2] = '\0'; + } + else if (g_str_has_prefix (retval, "https://:@")) + { + memmove (retval + 8, retval + 10, strlen (retval) - 10); + retval[strlen (retval) - 2] = '\0'; + } + + return retval; +} + +static char * +g_winhttp_file_get_parse_name (GFile *file) +{ + /* FIXME: More hair surely needed */ + + return g_winhttp_file_get_uri (file); +} + +static GFile * +g_winhttp_file_get_parent (GFile *file) +{ + GWinHttpFile *winhttp_file; + char *uri; + char *last_slash; + GFile *parent; + + winhttp_file = G_WINHTTP_FILE (file); + + uri = g_winhttp_file_get_uri (file); + if (uri == NULL) + return NULL; + + last_slash = strrchr (uri, '/'); + if (last_slash == NULL || *(last_slash+1) == 0) + { + g_free (uri); + return NULL; + } + + while (last_slash > uri && *last_slash == '/') + last_slash--; + + last_slash[1] = '\0'; + + parent = _g_winhttp_file_new (winhttp_file->vfs, uri); + g_free (uri); + + return parent; +} + +static GFile * +g_winhttp_file_dup (GFile *file) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + char *uri = g_winhttp_file_get_uri (file); + GFile *retval = _g_winhttp_file_new (winhttp_file->vfs, uri); + + g_free (uri); + + return retval; +} + +static guint +g_winhttp_file_hash (GFile *file) +{ + char *uri = g_winhttp_file_get_uri (file); + guint retval = g_str_hash (uri); + + g_free (uri); + + return retval; +} + +static gboolean +g_winhttp_file_equal (GFile *file1, + GFile *file2) +{ + char *uri1 = g_winhttp_file_get_uri (file1); + char *uri2 = g_winhttp_file_get_uri (file2); + gboolean retval = g_str_equal (uri1, uri2); + + g_free (uri1); + g_free (uri2); + + return retval; +} + +static const char * +match_prefix (const char *path, + const char *prefix) +{ + int prefix_len; + + prefix_len = strlen (prefix); + if (strncmp (path, prefix, prefix_len) != 0) + return NULL; + + if (prefix_len > 0 && prefix[prefix_len-1] == '/') + prefix_len--; + + return path + prefix_len; +} + +static gboolean +g_winhttp_file_prefix_matches (GFile *parent, + GFile *descendant) +{ + char *parent_uri = g_winhttp_file_get_uri (parent); + char *descendant_uri = g_winhttp_file_get_uri (descendant); + const char *remainder; + gboolean retval; + + remainder = match_prefix (descendant_uri, parent_uri); + + if (remainder != NULL && *remainder == '/') + retval = TRUE; + else + retval = FALSE; + + g_free (parent_uri); + g_free (descendant_uri); + + return retval; +} + +static char * +g_winhttp_file_get_relative_path (GFile *parent, + GFile *descendant) +{ + char *parent_uri = g_winhttp_file_get_uri (parent); + char *descendant_uri = g_winhttp_file_get_uri (descendant); + const char *remainder; + char *retval; + + remainder = match_prefix (descendant_uri, parent_uri); + + if (remainder != NULL && *remainder == '/') + retval = g_strdup (remainder + 1); + else + retval = NULL; + + g_free (parent_uri); + g_free (descendant_uri); + + return retval; +} + +static GFile * +g_winhttp_file_resolve_relative_path (GFile *file, + const char *relative_path) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + GWinHttpFile *child; + wchar_t *wnew_path = g_utf8_to_utf16 (relative_path, -1, NULL, NULL, NULL); + + if (wnew_path == NULL) + return NULL; + + if (*wnew_path != '/') + { + wchar_t *tmp = NULL; + int trailing_slash = winhttp_file->url.lpszUrlPath[winhttp_file->url.dwUrlPathLength-1] == L'/'? 1 : 0; + if (trailing_slash) + { + tmp = g_new (wchar_t, wcslen (winhttp_file->url.lpszUrlPath) + wcslen (wnew_path) + 1); + wcscpy (tmp, winhttp_file->url.lpszUrlPath); + } + else + { + tmp = g_new (wchar_t, wcslen (winhttp_file->url.lpszUrlPath) + 1 + wcslen (wnew_path) + 1); + wcscpy (tmp, winhttp_file->url.lpszUrlPath); + wcscat (tmp, L"/"); + } + wcscat (tmp, wnew_path); + + g_free (wnew_path); + wnew_path = tmp; + } + + child = g_object_new (G_TYPE_WINHTTP_FILE, NULL); + child->vfs = winhttp_file->vfs; + child->url = winhttp_file->url; + child->url.lpszScheme = g_memdup (winhttp_file->url.lpszScheme, (winhttp_file->url.dwSchemeLength+1)*2); + child->url.lpszHostName = g_memdup (winhttp_file->url.lpszHostName, (winhttp_file->url.dwHostNameLength+1)*2); + child->url.lpszUserName = g_memdup (winhttp_file->url.lpszUserName, (winhttp_file->url.dwUserNameLength+1)*2); + child->url.lpszPassword = g_memdup (winhttp_file->url.lpszPassword, (winhttp_file->url.dwPasswordLength+1)*2); + child->url.lpszUrlPath = wnew_path; + child->url.dwUrlPathLength = wcslen (wnew_path); + child->url.lpszExtraInfo = NULL; + child->url.dwExtraInfoLength = 0; + + return (GFile *) child; +} + +static GFile * +g_winhttp_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error) +{ + GFile *new_file; + char *basename; + + basename = g_locale_from_utf8 (display_name, -1, NULL, NULL, NULL); + if (basename == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME, + _("Invalid filename %s"), display_name); + return NULL; + } + + new_file = g_file_get_child (file, basename); + g_free (basename); + + return new_file; +} + +static GFile * +g_winhttp_file_set_display_name (GFile *file, + const char *display_name, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + + return NULL; +} + +static time_t +mktime_utc (SYSTEMTIME *t) +{ + time_t retval; + + static const gint days_before[] = + { + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 + }; + + if (t->wMonth < 1 || t->wMonth > 12) + return (time_t) -1; + + retval = (t->wYear - 1970) * 365; + retval += (t->wYear - 1968) / 4; + retval += days_before[t->wMonth-1] + t->wDay - 1; + + if (t->wYear % 4 == 0 && t->wMonth < 3) + retval -= 1; + + retval = ((((retval * 24) + t->wHour) * 60) + t->wMinute) * 60 + t->wSecond; + + return retval; +} + +static GFileInfo * +g_winhttp_file_query_info (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + HINTERNET connection, request; + const wchar_t *accept_types[] = + { + L"*/*", + NULL, + }; + GFileInfo *info; + GFileAttributeMatcher *matcher; + char *basename; + wchar_t *content_length; + wchar_t *content_type; + SYSTEMTIME last_modified; + DWORD last_modified_len; + + connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect + (G_WINHTTP_VFS (winhttp_file->vfs)->session, + winhttp_file->url.lpszHostName, + winhttp_file->url.nPort, + 0); + + if (connection == NULL) + { + _g_winhttp_set_error (error, GetLastError (), "HTTP connection"); + + return NULL; + } + + request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest + (connection, + L"HEAD", + winhttp_file->url.lpszUrlPath, + NULL, + WINHTTP_NO_REFERER, + accept_types, + winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); + + if (request == NULL) + { + _g_winhttp_set_error (error, GetLastError (), "HEAD request"); + + return NULL; + } + + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpSendRequest + (request, + NULL, 0, + NULL, 0, + 0, + 0)) + { + _g_winhttp_set_error (error, GetLastError (), "HEAD request"); + + return NULL; + } + + if (!_g_winhttp_response (winhttp_file->vfs, request, error, "HEAD request")) + return NULL; + + matcher = g_file_attribute_matcher_new (attributes); + info = g_file_info_new (); + g_file_info_set_attribute_mask (info, matcher); + + basename = g_winhttp_file_get_basename (file); + g_file_info_set_name (info, basename); + g_free (basename); + + content_length = NULL; + if (_g_winhttp_query_header (winhttp_file->vfs, + request, + "HEAD request", + WINHTTP_QUERY_CONTENT_LENGTH, + &content_length, + NULL)) + { + gint64 cl; + int n; + + if (swscanf (content_length, L"%I64d%n", &cl, &n) == 1 && + n == wcslen (content_length)) + g_file_info_set_size (info, cl); + + g_free (content_length); + } + + if (matcher == NULL) + return info; + + content_type = NULL; + if (_g_winhttp_query_header (winhttp_file->vfs, + request, + "HEAD request", + WINHTTP_QUERY_CONTENT_TYPE, + &content_type, + NULL)) + { + char *ct = g_utf16_to_utf8 (content_type, -1, NULL, NULL, NULL); + + if (ct != NULL) + { + char *p = strchr (ct, ';'); + + if (p != NULL) + { + char *tmp = g_strndup (ct, p - ct); + + g_file_info_set_content_type (info, tmp); + g_free (tmp); + } + else + g_file_info_set_content_type (info, ct); + } + + g_free (ct); + } + + last_modified_len = sizeof (last_modified); + if (G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpQueryHeaders + (request, + WINHTTP_QUERY_LAST_MODIFIED | WINHTTP_QUERY_FLAG_SYSTEMTIME, + NULL, + &last_modified, + &last_modified_len, + NULL) && + last_modified_len == sizeof (last_modified) && + /* Don't bother comparing to the exact Y2038 moment */ + last_modified.wYear >= 1970 && + last_modified.wYear < 2038) + { + GTimeVal tv; + + tv.tv_sec = mktime_utc (&last_modified); + tv.tv_usec = last_modified.wMilliseconds * 1000; + + g_file_info_set_modification_time (info, &tv); + } + + g_file_attribute_matcher_unref (matcher); + + return info; +} + +static GFileInputStream * +g_winhttp_file_read (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + HINTERNET connection, request; + const wchar_t *accept_types[] = + { + L"*/*", + NULL, + }; + + connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect + (G_WINHTTP_VFS (winhttp_file->vfs)->session, + winhttp_file->url.lpszHostName, + winhttp_file->url.nPort, + 0); + + if (connection == NULL) + { + _g_winhttp_set_error (error, GetLastError (), "HTTP connection"); + + return NULL; + } + + request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest + (connection, + L"GET", + winhttp_file->url.lpszUrlPath, + NULL, + WINHTTP_NO_REFERER, + accept_types, + winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); + + if (request == NULL) + { + _g_winhttp_set_error (error, GetLastError (), "GET request"); + + return NULL; + } + + return _g_winhttp_file_input_stream_new (winhttp_file, connection, request); +} + +static GFileOutputStream * +g_winhttp_file_create (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); + HINTERNET connection; + + connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect + (G_WINHTTP_VFS (winhttp_file->vfs)->session, + winhttp_file->url.lpszHostName, + winhttp_file->url.nPort, + 0); + + if (connection == NULL) + { + _g_winhttp_set_error (error, GetLastError (), "HTTP connection"); + + return NULL; + } + + return _g_winhttp_file_output_stream_new (winhttp_file, connection); +} + +#if 0 + +static GFileOutputStream * +g_winhttp_file_replace (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error) +{ + /* FIXME: Implement */ + + return NULL; +} + + +static gboolean +g_winhttp_file_delete (GFile *file, + GCancellable *cancellable, + GError **error) +{ + /* FIXME: Implement */ + + return FALSE; +} + +static gboolean +g_winhttp_file_make_directory (GFile *file, + GCancellable *cancellable, + GError **error) +{ + /* FIXME: Implement */ + + return FALSE; +} + +static gboolean +g_winhttp_file_copy (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + /* Fall back to default copy?? */ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Copy not supported"); + + return FALSE; +} + +static gboolean +g_winhttp_file_move (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + /* FIXME: Implement */ + + return FALSE; +} + +#endif + +static void +g_winhttp_file_file_iface_init (GFileIface *iface) +{ + iface->dup = g_winhttp_file_dup; + iface->hash = g_winhttp_file_hash; + iface->equal = g_winhttp_file_equal; + iface->is_native = g_winhttp_file_is_native; + iface->has_uri_scheme = g_winhttp_file_has_uri_scheme; + iface->get_uri_scheme = g_winhttp_file_get_uri_scheme; + iface->get_basename = g_winhttp_file_get_basename; + iface->get_path = g_winhttp_file_get_path; + iface->get_uri = g_winhttp_file_get_uri; + iface->get_parse_name = g_winhttp_file_get_parse_name; + iface->get_parent = g_winhttp_file_get_parent; + iface->prefix_matches = g_winhttp_file_prefix_matches; + iface->get_relative_path = g_winhttp_file_get_relative_path; + iface->resolve_relative_path = g_winhttp_file_resolve_relative_path; + iface->get_child_for_display_name = g_winhttp_file_get_child_for_display_name; + iface->set_display_name = g_winhttp_file_set_display_name; + iface->query_info = g_winhttp_file_query_info; + iface->read_fn = g_winhttp_file_read; + iface->create = g_winhttp_file_create; +#if 0 + iface->replace = g_winhttp_file_replace; + iface->delete_file = g_winhttp_file_delete; + iface->make_directory = g_winhttp_file_make_directory; + iface->copy = g_winhttp_file_copy; + iface->move = g_winhttp_file_move; +#endif +} diff --git a/gio/win32/gwinhttpfile.h b/gio/win32/gwinhttpfile.h new file mode 100644 index 0000000..9a0c392 --- /dev/null +++ b/gio/win32/gwinhttpfile.h @@ -0,0 +1,64 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#ifndef __G_WINHTTP_FILE_H__ +#define __G_WINHTTP_FILE_H__ + +#include + +#include "gwinhttpvfs.h" + +G_BEGIN_DECLS + +#define G_TYPE_WINHTTP_FILE (_g_winhttp_file_get_type ()) +#define G_WINHTTP_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WINHTTP_FILE, GWinHttpFile)) +#define G_WINHTTP_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WINHTTP_FILE, GWinHttpFileClass)) +#define G_IS_WINHTTP_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WINHTTP_FILE)) +#define G_IS_WINHTTP_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WINHTTP_FILE)) +#define G_WINHTTP_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WINHTTP_FILE, GWinHttpFileClass)) + +typedef struct _GWinHttpFile GWinHttpFile; +typedef struct _GWinHttpFileClass GWinHttpFileClass; + +struct _GWinHttpFile +{ + GObject parent_instance; + + GWinHttpVfs *vfs; + + URL_COMPONENTS url; +}; + +struct _GWinHttpFileClass +{ + GObjectClass parent_class; +}; + +GType _g_winhttp_file_get_type (void) G_GNUC_CONST; + +GFile * _g_winhttp_file_new (GWinHttpVfs *vfs, const char *uri); + +G_END_DECLS + +#endif /* __G_WINHTTP_FILE_H__ */ diff --git a/gio/win32/gwinhttpfileinputstream.c b/gio/win32/gwinhttpfileinputstream.c new file mode 100644 index 0000000..3bd361e --- /dev/null +++ b/gio/win32/gwinhttpfileinputstream.c @@ -0,0 +1,179 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#include "config.h" + +#include + +#include "gcancellable.h" +#include "gioerror.h" +#include "gwinhttpfileinputstream.h" +#include "glibintl.h" + +#include "gioalias.h" + +struct _GWinHttpFileInputStream +{ + GFileInputStream parent_instance; + + GWinHttpFile *file; + gboolean request_sent; + HINTERNET connection; + HINTERNET request; +}; + +struct _GWinHttpFileInputStreamClass +{ + GFileInputStreamClass parent_class; +}; + +#define g_winhttp_file_input_stream_get_type _g_winhttp_file_input_stream_get_type +G_DEFINE_TYPE (GWinHttpFileInputStream, g_winhttp_file_input_stream, G_TYPE_FILE_INPUT_STREAM); + +static gssize g_winhttp_file_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + +static gboolean g_winhttp_file_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); + +static void +g_winhttp_file_input_stream_finalize (GObject *object) +{ + GWinHttpFileInputStream *winhttp_stream; + + winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (object); + + if (winhttp_stream->request != NULL) + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->request); + if (winhttp_stream->connection != NULL) + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection); + + g_object_unref (winhttp_stream->file); + winhttp_stream->file = NULL; + + G_OBJECT_CLASS (g_winhttp_file_input_stream_parent_class)->finalize (object); +} + +static void +g_winhttp_file_input_stream_class_init (GWinHttpFileInputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); + + gobject_class->finalize = g_winhttp_file_input_stream_finalize; + + stream_class->read_fn = g_winhttp_file_input_stream_read; + stream_class->close_fn = g_winhttp_file_input_stream_close; +} + +static void +g_winhttp_file_input_stream_init (GWinHttpFileInputStream *info) +{ +} + +/* + * g_winhttp_file_input_stream_new: + * @file: the GWinHttpFile being read + * @connection: handle to the HTTP connection, as from WinHttpConnect() + * @request: handle to the HTTP request, as from WinHttpOpenRequest + * + * Returns: #GFileInputStream for the given request + */ +GFileInputStream * +_g_winhttp_file_input_stream_new (GWinHttpFile *file, + HINTERNET connection, + HINTERNET request) +{ + GWinHttpFileInputStream *stream; + + stream = g_object_new (G_TYPE_WINHTTP_FILE_INPUT_STREAM, NULL); + + stream->file = g_object_ref (file); + stream->request_sent = FALSE; + stream->connection = connection; + stream->request = request; + + return G_FILE_INPUT_STREAM (stream); +} + +static gssize +g_winhttp_file_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GWinHttpFileInputStream *winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (stream); + DWORD bytes_read; + + if (!winhttp_stream->request_sent) + { + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest + (winhttp_stream->request, + NULL, 0, + NULL, 0, + 0, + 0)) + { + _g_winhttp_set_error (error, GetLastError (), "GET request"); + + return -1; + } + + if (!_g_winhttp_response (winhttp_stream->file->vfs, + winhttp_stream->request, + error, + "GET request")) + return -1; + + winhttp_stream->request_sent = TRUE; + } + + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpReadData + (winhttp_stream->request, buffer, count, &bytes_read)) + { + _g_winhttp_set_error (error, GetLastError (), "GET request"); + + return -1; + } + + return bytes_read; +} + +static gboolean +g_winhttp_file_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GWinHttpFileInputStream *winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (stream); + + if (winhttp_stream->connection != NULL) + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection); + winhttp_stream->connection = NULL; + return TRUE; +} diff --git a/gio/win32/gwinhttpfileinputstream.h b/gio/win32/gwinhttpfileinputstream.h new file mode 100644 index 0000000..80e02b4 --- /dev/null +++ b/gio/win32/gwinhttpfileinputstream.h @@ -0,0 +1,52 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#ifndef __G_WINHTTP_FILE_INPUT_STREAM_H__ +#define __G_WINHTTP_FILE_INPUT_STREAM_H__ + +#include + +#include "gwinhttpfile.h" + +G_BEGIN_DECLS + +#define G_TYPE_WINHTTP_FILE_INPUT_STREAM (_g_winhttp_file_input_stream_get_type ()) +#define G_WINHTTP_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WINHTTP_FILE_INPUT_STREAM, GWinHttpFileInputStream)) +#define G_WINHTTP_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WINHTTP_FILE_INPUT_STREAM, GWinHttpFileInputStreamClass)) +#define G_IS_WINHTTP_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WINHTTP_FILE_INPUT_STREAM)) +#define G_IS_WINHTTP_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WINHTTP_FILE_INPUT_STREAM)) +#define G_WINHTTP_FILE_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WINHTTP_FILE_INPUT_STREAM, GWinHttpFileInputStreamClass)) + +typedef struct _GWinHttpFileInputStream GWinHttpFileInputStream; +typedef struct _GWinHttpFileInputStreamClass GWinHttpFileInputStreamClass; + +GType _g_winhttp_file_input_stream_get_type (void) G_GNUC_CONST; + +GFileInputStream *_g_winhttp_file_input_stream_new (GWinHttpFile *file, + HINTERNET connection, + HINTERNET request); + +G_END_DECLS + +#endif /* __G_WINHTTP_FILE_INPUT_STREAM_H__ */ diff --git a/gio/win32/gwinhttpfileoutputstream.c b/gio/win32/gwinhttpfileoutputstream.c new file mode 100644 index 0000000..586a2a6 --- /dev/null +++ b/gio/win32/gwinhttpfileoutputstream.c @@ -0,0 +1,187 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#include "config.h" + +#include + +#include "gcancellable.h" +#include "gioerror.h" +#include "gwinhttpfileoutputstream.h" +#include "glibintl.h" + +#include "gioalias.h" + +struct _GWinHttpFileOutputStream +{ + GFileOutputStream parent_instance; + + GWinHttpFile *file; + HINTERNET connection; + goffset offset; +}; + +struct _GWinHttpFileOutputStreamClass +{ + GFileOutputStreamClass parent_class; +}; + +#define g_winhttp_file_output_stream_get_type _g_winhttp_file_output_stream_get_type +G_DEFINE_TYPE (GWinHttpFileOutputStream, g_winhttp_file_output_stream, G_TYPE_FILE_OUTPUT_STREAM); + +static gssize g_winhttp_file_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + +static void +g_winhttp_file_output_stream_finalize (GObject *object) +{ + GWinHttpFileOutputStream *winhttp_stream; + + winhttp_stream = G_WINHTTP_FILE_OUTPUT_STREAM (object); + + if (winhttp_stream->connection != NULL) + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection); + + G_OBJECT_CLASS (g_winhttp_file_output_stream_parent_class)->finalize (object); +} + +static void +g_winhttp_file_output_stream_class_init (GWinHttpFileOutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); + + gobject_class->finalize = g_winhttp_file_output_stream_finalize; + + stream_class->write_fn = g_winhttp_file_output_stream_write; +} + +static void +g_winhttp_file_output_stream_init (GWinHttpFileOutputStream *info) +{ +} + +/* + * g_winhttp_file_output_stream_new: + * @file: the GWinHttpFile being read + * @connection: handle to the HTTP connection, as from WinHttpConnect() + * @request: handle to the HTTP request, as from WinHttpOpenRequest + * + * Returns: #GFileOutputStream for the given request + */ +GFileOutputStream * +_g_winhttp_file_output_stream_new (GWinHttpFile *file, + HINTERNET connection) +{ + GWinHttpFileOutputStream *stream; + + stream = g_object_new (G_TYPE_WINHTTP_FILE_OUTPUT_STREAM, NULL); + + stream->file = file; + stream->connection = connection; + stream->offset = 0; + + return G_FILE_OUTPUT_STREAM (stream); +} + +static gssize +g_winhttp_file_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GWinHttpFileOutputStream *winhttp_stream = G_WINHTTP_FILE_OUTPUT_STREAM (stream); + HINTERNET request; + char *headers; + wchar_t *wheaders; + DWORD bytes_written; + + request = G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpOpenRequest + (winhttp_stream->connection, + L"PUT", + winhttp_stream->file->url.lpszUrlPath, + NULL, + WINHTTP_NO_REFERER, + NULL, + winhttp_stream->file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); + + if (request == NULL) + { + _g_winhttp_set_error (error, GetLastError (), "PUT request"); + + return -1; + } + + headers = g_strdup_printf ("Content-Range: bytes %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT "/*\r\n", + winhttp_stream->offset, winhttp_stream->offset + count); + wheaders = g_utf8_to_utf16 (headers, -1, NULL, NULL, NULL); + g_free (headers); + + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest + (request, + wheaders, -1, + NULL, 0, + count, + 0)) + { + _g_winhttp_set_error (error, GetLastError (), "PUT request"); + + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); + g_free (wheaders); + + return -1; + } + + g_free (wheaders); + + if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpWriteData + (request, buffer, count, &bytes_written)) + { + _g_winhttp_set_error (error, GetLastError (), "PUT request"); + + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); + + return -1; + } + + winhttp_stream->offset += bytes_written; + + if (!_g_winhttp_response (winhttp_stream->file->vfs, + request, + error, + "PUT request")) + { + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); + + return -1; + } + + G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); + + return bytes_written; +} diff --git a/gio/win32/gwinhttpfileoutputstream.h b/gio/win32/gwinhttpfileoutputstream.h new file mode 100644 index 0000000..4cc7e61 --- /dev/null +++ b/gio/win32/gwinhttpfileoutputstream.h @@ -0,0 +1,51 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#ifndef __G_WINHTTP_FILE_OUTPUT_STREAM_H__ +#define __G_WINHTTP_FILE_OUTPUT_STREAM_H__ + +#include + +#include "gwinhttpfile.h" + +G_BEGIN_DECLS + +#define G_TYPE_WINHTTP_FILE_OUTPUT_STREAM (_g_winhttp_file_output_stream_get_type ()) +#define G_WINHTTP_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WINHTTP_FILE_OUTPUT_STREAM, GWinHttpFileOutputStream)) +#define G_WINHTTP_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WINHTTP_FILE_OUTPUT_STREAM, GWinHttpFileOutputStreamClass)) +#define G_IS_WINHTTP_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WINHTTP_FILE_OUTPUT_STREAM)) +#define G_IS_WINHTTP_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WINHTTP_FILE_OUTPUT_STREAM)) +#define G_WINHTTP_FILE_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WINHTTP_FILE_OUTPUT_STREAM, GWinHttpFileOutputStreamClass)) + +typedef struct _GWinHttpFileOutputStream GWinHttpFileOutputStream; +typedef struct _GWinHttpFileOutputStreamClass GWinHttpFileOutputStreamClass; + +GType _g_winhttp_file_output_stream_get_type (void) G_GNUC_CONST; + +GFileOutputStream *_g_winhttp_file_output_stream_new (GWinHttpFile *file, + HINTERNET connection); + +G_END_DECLS + +#endif /* __G_WINHTTP_FILE_OUTPUT_STREAM_H__ */ diff --git a/gio/win32/gwinhttpvfs.c b/gio/win32/gwinhttpvfs.c new file mode 100644 index 0000000..494f53f --- /dev/null +++ b/gio/win32/gwinhttpvfs.c @@ -0,0 +1,459 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#include "config.h" + +#include + +#include "gioerror.h" +#include "giomodule.h" +#include "gvfs.h" + +#include "gwinhttpfile.h" +#include "gwinhttpvfs.h" + +#include "gioalias.h" + +static gboolean lookup_done = FALSE; +static gboolean funcs_found = FALSE; +static GWinHttpDllFuncs funcs; + +static void +lookup_funcs (void) +{ + HMODULE winhttp; + + if (lookup_done) + return; + + winhttp = LoadLibrary ("winhttp.dll"); + if (winhttp != NULL) + { + funcs.pWinHttpCloseHandle = (BOOL (WINAPI *) (HINTERNET)) GetProcAddress (winhttp, "WinHttpCloseHandle"); + funcs.pWinHttpCrackUrl = (BOOL (WINAPI *) (LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS)) GetProcAddress (winhttp, "WinHttpCrackUrl"); + funcs.pWinHttpConnect = (HINTERNET (WINAPI *) (HINTERNET,LPCWSTR,INTERNET_PORT,DWORD)) GetProcAddress (winhttp, "WinHttpConnect"); + funcs.pWinHttpCreateUrl = (BOOL (WINAPI *) (LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD)) GetProcAddress (winhttp, "WinHttpCreateUrl"); + funcs.pWinHttpOpen = (HINTERNET (WINAPI *) (LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD)) GetProcAddress (winhttp, "WinHttpOpen"); + funcs.pWinHttpOpenRequest = (HINTERNET (WINAPI *) (HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD)) GetProcAddress (winhttp, "WinHttpOpenRequest"); + funcs.pWinHttpQueryDataAvailable = (BOOL (WINAPI *) (HINTERNET,LPDWORD)) GetProcAddress (winhttp, "WinHttpQueryDataAvailable"); + funcs.pWinHttpQueryHeaders = (BOOL (WINAPI *) (HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpQueryHeaders"); + funcs.pWinHttpReadData = (BOOL (WINAPI *) (HINTERNET,LPVOID,DWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpReadData"); + funcs.pWinHttpReceiveResponse = (BOOL (WINAPI *) (HINTERNET,LPVOID)) GetProcAddress (winhttp, "WinHttpReceiveResponse"); + funcs.pWinHttpSendRequest = (BOOL (WINAPI *) (HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR)) GetProcAddress (winhttp, "WinHttpSendRequest"); + funcs.pWinHttpWriteData = (BOOL (WINAPI *) (HINTERNET,LPCVOID,DWORD,LPDWORD)) GetProcAddress (winhttp, "WinHttpWriteData"); + + if (funcs.pWinHttpCloseHandle && + funcs.pWinHttpCrackUrl && + funcs.pWinHttpConnect && + funcs.pWinHttpCreateUrl && + funcs.pWinHttpOpen && + funcs.pWinHttpOpenRequest && + funcs.pWinHttpQueryDataAvailable && + funcs.pWinHttpQueryHeaders && + funcs.pWinHttpReadData && + funcs.pWinHttpReceiveResponse && + funcs.pWinHttpSendRequest && + funcs.pWinHttpWriteData) + funcs_found = TRUE; + } + lookup_done = TRUE; +} + +#define g_winhttp_vfs_get_type _g_winhttp_vfs_get_type +G_DEFINE_TYPE_WITH_CODE (GWinHttpVfs, g_winhttp_vfs, G_TYPE_VFS, + { + lookup_funcs (); + if (funcs_found) + g_io_extension_point_implement (G_VFS_EXTENSION_POINT_NAME, + g_define_type_id, + "winhttp", + 10); + }) + +static const gchar *winhttp_uri_schemes[] = { "http", "https" }; + +static void +g_winhttp_vfs_finalize (GObject *object) +{ + GWinHttpVfs *vfs; + + vfs = G_WINHTTP_VFS (object); + + (G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCloseHandle) (vfs->session); + vfs->session = NULL; + + if (vfs->wrapped_vfs) + g_object_unref (vfs->wrapped_vfs); + vfs->wrapped_vfs = NULL; + + G_OBJECT_CLASS (g_winhttp_vfs_parent_class)->finalize (object); +} + +static void +g_winhttp_vfs_init (GWinHttpVfs *vfs) +{ + wchar_t *wagent; + + vfs->wrapped_vfs = g_vfs_get_local (); + + wagent = g_utf8_to_utf16 (g_get_prgname (), -1, NULL, NULL, NULL); + + if (!wagent) + wagent = g_utf8_to_utf16 ("GWinHttpVfs", -1, NULL, NULL, NULL); + + vfs->session = (G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpOpen) + (wagent, + WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, + WINHTTP_NO_PROXY_NAME, + WINHTTP_NO_PROXY_BYPASS, + 0); +} + +/* + * g_winhttp_vfs_new: + * + * Returns a new #GVfs handle for a WinHttp vfs. + * + * Returns: a new #GVfs handle. + **/ +GVfs * +_g_winhttp_vfs_new (void) +{ + return g_object_new (G_TYPE_WINHTTP_VFS, NULL); +} + +static GFile * +g_winhttp_vfs_get_file_for_path (GVfs *vfs, + const char *path) +{ + return g_vfs_get_file_for_path (G_WINHTTP_VFS (vfs)->wrapped_vfs, path); +} + +static GFile * +g_winhttp_vfs_get_file_for_uri (GVfs *vfs, + const char *uri) +{ + GWinHttpVfs *winhttp_vfs = G_WINHTTP_VFS (vfs); + int i; + + /* If it matches one of "our" schemes, handle it */ + for (i = 0; i < G_N_ELEMENTS (winhttp_uri_schemes); i++) + if (g_ascii_strncasecmp (uri, winhttp_uri_schemes[i], strlen (winhttp_uri_schemes[i])) == 0 && + uri[strlen (winhttp_uri_schemes[i])] == ':') + return _g_winhttp_file_new (winhttp_vfs, uri); + + /* For other URIs fallback to the wrapped GVfs */ + return g_vfs_parse_name (winhttp_vfs->wrapped_vfs, uri); +} + +static const gchar * const * +g_winhttp_vfs_get_supported_uri_schemes (GVfs *vfs) +{ + GWinHttpVfs *winhttp_vfs = G_WINHTTP_VFS (vfs); + const gchar * const *wrapped_vfs_uri_schemes = g_vfs_get_supported_uri_schemes (winhttp_vfs->wrapped_vfs); + int i, n; + const gchar **retval; + + n = 0; + while (wrapped_vfs_uri_schemes[n] != NULL) + n++; + + retval = g_new (const gchar *, n + G_N_ELEMENTS (winhttp_uri_schemes) + 1); + n = 0; + while (wrapped_vfs_uri_schemes[n] != NULL) + { + retval[n] = wrapped_vfs_uri_schemes[n]; + n++; + } + + for (i = 0; i < G_N_ELEMENTS (winhttp_uri_schemes); i++) + { + retval[n] = winhttp_uri_schemes[i]; + n++; + } + + retval[n] = NULL; + + return retval; +} + +static GFile * +g_winhttp_vfs_parse_name (GVfs *vfs, + const char *parse_name) +{ + GWinHttpVfs *winhttp_vfs = G_WINHTTP_VFS (vfs); + + g_return_val_if_fail (G_IS_VFS (vfs), NULL); + g_return_val_if_fail (parse_name != NULL, NULL); + + /* For plain file paths fallback to the wrapped GVfs */ + if (g_path_is_absolute (parse_name)) + return g_vfs_parse_name (winhttp_vfs->wrapped_vfs, parse_name); + + /* Otherwise assume it is an URI, so pass on to + * g_winhttp_vfs_get_file_for_uri(). + */ + return g_winhttp_vfs_get_file_for_uri (vfs, parse_name); +} + +static gboolean +g_winhttp_vfs_is_active (GVfs *vfs) +{ + return TRUE; +} + +static void +g_winhttp_vfs_class_init (GWinHttpVfsClass *class) +{ + GObjectClass *object_class; + GVfsClass *vfs_class; + + object_class = (GObjectClass *) class; + + object_class->finalize = g_winhttp_vfs_finalize; + + vfs_class = G_VFS_CLASS (class); + + vfs_class->is_active = g_winhttp_vfs_is_active; + vfs_class->get_file_for_path = g_winhttp_vfs_get_file_for_path; + vfs_class->get_file_for_uri = g_winhttp_vfs_get_file_for_uri; + vfs_class->get_supported_uri_schemes = g_winhttp_vfs_get_supported_uri_schemes; + vfs_class->parse_name = g_winhttp_vfs_parse_name; + + lookup_funcs (); + if (funcs_found) + class->funcs = &funcs; + else + class->funcs = NULL; +} + +char * +_g_winhttp_error_message (DWORD error_code) +{ + /* The FormatMessage() API that g_win32_error_message() uses doesn't + * seem to know about WinHttp errors, unfortunately. + */ + if (error_code >= WINHTTP_ERROR_BASE && error_code < WINHTTP_ERROR_BASE + 200) + { + switch (error_code) + { + /* FIXME: Use meaningful error messages */ +#define CASE(x) case ERROR_WINHTTP_##x: return g_strdup ("WinHttp error: " #x); + CASE (AUTO_PROXY_SERVICE_ERROR); + CASE (AUTODETECTION_FAILED); + CASE (BAD_AUTO_PROXY_SCRIPT); + CASE (CANNOT_CALL_AFTER_OPEN); + CASE (CANNOT_CALL_AFTER_SEND); + CASE (CANNOT_CALL_BEFORE_OPEN); + CASE (CANNOT_CALL_BEFORE_SEND); + CASE (CANNOT_CONNECT); + CASE (CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW); + CASE (CLIENT_AUTH_CERT_NEEDED); + CASE (CONNECTION_ERROR); + CASE (HEADER_ALREADY_EXISTS); + CASE (HEADER_COUNT_EXCEEDED); + CASE (HEADER_NOT_FOUND); + CASE (HEADER_SIZE_OVERFLOW); + CASE (INCORRECT_HANDLE_STATE); + CASE (INCORRECT_HANDLE_TYPE); + CASE (INTERNAL_ERROR); + CASE (INVALID_OPTION); + CASE (INVALID_QUERY_REQUEST); + CASE (INVALID_SERVER_RESPONSE); + CASE (INVALID_URL); + CASE (LOGIN_FAILURE); + CASE (NAME_NOT_RESOLVED); + CASE (NOT_INITIALIZED); + CASE (OPERATION_CANCELLED); + CASE (OPTION_NOT_SETTABLE); + CASE (OUT_OF_HANDLES); + CASE (REDIRECT_FAILED); + CASE (RESEND_REQUEST); + CASE (RESPONSE_DRAIN_OVERFLOW); + CASE (SECURE_CERT_CN_INVALID); + CASE (SECURE_CERT_DATE_INVALID); + CASE (SECURE_CERT_REV_FAILED); + CASE (SECURE_CERT_REVOKED); + CASE (SECURE_CERT_WRONG_USAGE); + CASE (SECURE_CHANNEL_ERROR); + CASE (SECURE_FAILURE); + CASE (SECURE_INVALID_CA); + CASE (SECURE_INVALID_CERT); + CASE (SHUTDOWN); + CASE (TIMEOUT); + CASE (UNABLE_TO_DOWNLOAD_SCRIPT); + CASE (UNRECOGNIZED_SCHEME); + #undef CASE + default: + return g_strdup_printf ("WinHttp error %ld", error_code); + } + } + else + return g_win32_error_message (error_code); +} + +void +_g_winhttp_set_error (GError **error, + DWORD error_code, + const char *what) +{ + char *emsg = _g_winhttp_error_message (error_code); + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "%s failed: %s", what, emsg); + g_free (emsg); +} + +gboolean +_g_winhttp_response (GWinHttpVfs *vfs, + HINTERNET request, + GError **error, + const char *what) +{ + wchar_t *status_code; + DWORD status_code_len; + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpReceiveResponse (request, NULL)) + { + _g_winhttp_set_error (error, GetLastError (), what); + + return FALSE; + } + + status_code_len = 0; + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders + (request, + WINHTTP_QUERY_STATUS_CODE, + NULL, + NULL, + &status_code_len, + NULL) && + GetLastError () != ERROR_INSUFFICIENT_BUFFER) + { + _g_winhttp_set_error (error, GetLastError (), what); + + return FALSE; + } + + status_code = g_malloc (status_code_len); + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders + (request, + WINHTTP_QUERY_STATUS_CODE, + NULL, + status_code, + &status_code_len, + NULL)) + { + _g_winhttp_set_error (error, GetLastError (), what); + g_free (status_code); + + return FALSE; + } + + if (status_code[0] != L'2') + { + wchar_t *status_text = NULL; + DWORD status_text_len; + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders + (request, + WINHTTP_QUERY_STATUS_TEXT, + NULL, + NULL, + &status_text_len, + NULL) && + GetLastError () == ERROR_INSUFFICIENT_BUFFER) + { + status_text = g_malloc (status_text_len); + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders + (request, + WINHTTP_QUERY_STATUS_TEXT, + NULL, + status_text, + &status_text_len, + NULL)) + { + g_free (status_text); + status_text = NULL; + } + } + + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "%s failed: %S %S", + what, status_code, status_text ? status_text : L""); + g_free (status_code); + g_free (status_text); + + return FALSE; + } + + g_free (status_code); + + return TRUE; +} + +gboolean +_g_winhttp_query_header (GWinHttpVfs *vfs, + HINTERNET request, + const char *request_description, + DWORD which_header, + wchar_t **header, + GError **error) +{ + DWORD header_len = 0; + + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders + (request, + which_header, + NULL, + NULL, + &header_len, + NULL) && + GetLastError () != ERROR_INSUFFICIENT_BUFFER) + { + _g_winhttp_set_error (error, GetLastError (), request_description); + + return FALSE; + } + + *header = g_malloc (header_len); + if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpQueryHeaders + (request, + which_header, + NULL, + *header, + &header_len, + NULL)) + { + _g_winhttp_set_error (error, GetLastError (), request_description); + g_free (*header); + *header = NULL; + + return FALSE; + } + + return TRUE; +} diff --git a/gio/win32/gwinhttpvfs.h b/gio/win32/gwinhttpvfs.h new file mode 100644 index 0000000..11593ab --- /dev/null +++ b/gio/win32/gwinhttpvfs.h @@ -0,0 +1,110 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * Copyright (C) 2008 Novell, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + * Author: Tor Lillqvist + */ + +#ifndef __G_WINHTTP_VFS_H__ +#define __G_WINHTTP_VFS_H__ + +#include + +#include "gvfs.h" + +#define _WIN32_WINNT 0x0500 +#include + +#include "winhttp.h" + +G_BEGIN_DECLS + +#define G_TYPE_WINHTTP_VFS (_g_winhttp_vfs_get_type ()) +#define G_WINHTTP_VFS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_WINHTTP_VFS, GWinHttpVfs)) +#define G_WINHTTP_VFS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_WINHTTP_VFS, GWinHttpVfsClass)) +#define G_IS_WINHTTP_VFS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_WINHTTP_VFS)) +#define G_IS_WINHTTP_VFS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), G_TYPE_WINHTTP_VFS)) +#define G_WINHTTP_VFS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_WINHTTP_VFS, GWinHttpVfsClass)) + +typedef struct _GWinHttpVfs GWinHttpVfs; +typedef struct _GWinHttpDllFuncs GWinHttpDllFuncs; +typedef struct _GWinHttpVfsClass GWinHttpVfsClass; + +struct _GWinHttpVfs +{ + GVfs parent; + + GVfs *wrapped_vfs; + HINTERNET session; +}; + +struct _GWinHttpDllFuncs +{ + BOOL (WINAPI *pWinHttpCloseHandle) (HINTERNET); + BOOL (WINAPI *pWinHttpCrackUrl) (LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS); + HINTERNET (WINAPI *pWinHttpConnect) (HINTERNET,LPCWSTR,INTERNET_PORT,DWORD); + BOOL (WINAPI *pWinHttpCreateUrl) (LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD); + HINTERNET (WINAPI *pWinHttpOpen) (LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD); + HINTERNET (WINAPI *pWinHttpOpenRequest) (HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD); + BOOL (WINAPI *pWinHttpQueryDataAvailable) (HINTERNET,LPDWORD); + BOOL (WINAPI *pWinHttpQueryHeaders) (HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD); + BOOL (WINAPI *pWinHttpReadData) (HINTERNET,LPVOID,DWORD,LPDWORD); + BOOL (WINAPI *pWinHttpReceiveResponse) (HINTERNET,LPVOID); + BOOL (WINAPI *pWinHttpSendRequest) (HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR); + BOOL (WINAPI *pWinHttpWriteData) (HINTERNET,LPCVOID,DWORD,LPDWORD); +}; + +struct _GWinHttpVfsClass +{ + GVfsClass parent_class; + + /* As there is no import library for winhttp.dll in mingw, and + * winhttp.dll isn't present on Windows 2000 anyway, we must look up + * the functions we need dynamically. Store the pointers here. + */ + GWinHttpDllFuncs *funcs; +}; + + +GType _g_winhttp_vfs_get_type (void) G_GNUC_CONST; + +GVfs *_g_winhttp_vfs_new (void); + +char *_g_winhttp_error_message (DWORD error_code); + +void _g_winhttp_set_error (GError **error, + DWORD error_code, + const char *what); + +gboolean _g_winhttp_response (GWinHttpVfs *vfs, + HINTERNET request, + GError **error, + const char *what); + +gboolean _g_winhttp_query_header (GWinHttpVfs *vfs, + HINTERNET request, + const char *request_description, + DWORD which_header, + wchar_t **header, + GError **error); + +G_END_DECLS + +#endif /* __G_WINHTTP_VFS_H__ */ diff --git a/gio/win32/winhttp.h b/gio/win32/winhttp.h new file mode 100644 index 0000000..a8dd0c1 --- /dev/null +++ b/gio/win32/winhttp.h @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2007 Francois Gouget + * + * 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 St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINHTTP_H +#define __WINE_WINHTTP_H + +#define WINHTTPAPI +#define BOOLAPI WINHTTPAPI BOOL WINAPI + + +typedef LPVOID HINTERNET; +typedef HINTERNET *LPHINTERNET; + +#define INTERNET_DEFAULT_PORT 0 +#define INTERNET_DEFAULT_HTTP_PORT 80 +#define INTERNET_DEFAULT_HTTPS_PORT 443 +typedef WORD INTERNET_PORT; +typedef INTERNET_PORT *LPINTERNET_PORT; + +#define INTERNET_SCHEME_HTTP 1 +#define INTERNET_SCHEME_HTTPS 2 +typedef int INTERNET_SCHEME, *LPINTERNET_SCHEME; + +/* flags for WinHttpOpen */ +#define WINHTTP_FLAG_ASYNC 0x10000000 + +/* flags for WinHttpOpenRequest */ +#define WINHTTP_FLAG_ESCAPE_PERCENT 0x00000004 +#define WINHTTP_FLAG_NULL_CODEPAGE 0x00000008 +#define WINHTTP_FLAG_ESCAPE_DISABLE 0x00000040 +#define WINHTTP_FLAG_ESCAPE_DISABLE_QUERY 0x00000080 +#define WINHTTP_FLAG_BYPASS_PROXY_CACHE 0x00000100 +#define WINHTTP_FLAG_REFRESH WINHTTP_FLAG_BYPASS_PROXY_CACHE +#define WINHTTP_FLAG_SECURE 0x00800000 + +#define WINHTTP_ACCESS_TYPE_DEFAULT_PROXY 0 +#define WINHTTP_ACCESS_TYPE_NO_PROXY 1 +#define WINHTTP_ACCESS_TYPE_NAMED_PROXY 3 + +#define WINHTTP_NO_PROXY_NAME NULL +#define WINHTTP_NO_PROXY_BYPASS NULL + +#define WINHTTP_NO_REFERER NULL +#define WINHTTP_DEFAULT_ACCEPT_TYPES NULL + +#define WINHTTP_ERROR_BASE 12000 + +/* The original WINE winhttp.h didn't contain symbolic names for the + * error codes. However, the values of most of them are publicly + * documented at + * http://msdn.microsoft.com/en-us/library/aa383770(VS.85).aspx so + * we can add them here. + */ +#define ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR 12178 +#define ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT 12166 +#define ERROR_WINHTTP_CANNOT_CALL_AFTER_OPEN 12103 +#define ERROR_WINHTTP_CANNOT_CALL_AFTER_SEND 12102 +#define ERROR_WINHTTP_CANNOT_CALL_BEFORE_OPEN 12100 +#define ERROR_WINHTTP_CANNOT_CALL_BEFORE_SEND 12101 +#define ERROR_WINHTTP_CANNOT_CONNECT 12029 +#define ERROR_WINHTTP_CHUNKED_ENCODING_HEADER_SIZE_OVERFLOW 12183 +#define ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED 12044 +#define ERROR_WINHTTP_CONNECTION_ERROR 12030 +#define ERROR_WINHTTP_HEADER_ALREADY_EXISTS 12155 +#define ERROR_WINHTTP_HEADER_COUNT_EXCEEDED 12181 +#define ERROR_WINHTTP_HEADER_NOT_FOUND 12150 +#define ERROR_WINHTTP_HEADER_SIZE_OVERFLOW 12182 +#define ERROR_WINHTTP_INCORRECT_HANDLE_STATE 12019 +#define ERROR_WINHTTP_INCORRECT_HANDLE_TYPE 12018 +#define ERROR_WINHTTP_INTERNAL_ERROR 12004 +#define ERROR_WINHTTP_INVALID_OPTION 12009 +#define ERROR_WINHTTP_INVALID_QUERY_REQUEST 12154 +#define ERROR_WINHTTP_INVALID_SERVER_RESPONSE 12152 +#define ERROR_WINHTTP_INVALID_URL 12005 +#define ERROR_WINHTTP_LOGIN_FAILURE 12015 +#define ERROR_WINHTTP_NAME_NOT_RESOLVED 12007 +#define ERROR_WINHTTP_NOT_INITIALIZED 12172 +#define ERROR_WINHTTP_OPERATION_CANCELLED 12017 +#define ERROR_WINHTTP_OPTION_NOT_SETTABLE 12011 +#define ERROR_WINHTTP_OUT_OF_HANDLES 12001 +#define ERROR_WINHTTP_REDIRECT_FAILED 12156 +#define ERROR_WINHTTP_RESEND_REQUEST 12032 +#define ERROR_WINHTTP_RESPONSE_DRAIN_OVERFLOW 12184 +#define ERROR_WINHTTP_SECURE_CERT_CN_INVALID 12038 +#define ERROR_WINHTTP_SECURE_CERT_DATE_INVALID 12037 +#define ERROR_WINHTTP_SECURE_CERT_REV_FAILED 12057 +#define ERROR_WINHTTP_SECURE_CERT_REVOKED 12170 +#define ERROR_WINHTTP_SECURE_CERT_WRONG_USAGE 12179 +#define ERROR_WINHTTP_SECURE_CHANNEL_ERROR 12157 +#define ERROR_WINHTTP_SECURE_FAILURE 12175 +#define ERROR_WINHTTP_SECURE_INVALID_CA 12045 +#define ERROR_WINHTTP_SECURE_INVALID_CERT 12169 +#define ERROR_WINHTTP_SHUTDOWN 12012 +#define ERROR_WINHTTP_TIMEOUT 12002 +#define ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT 12167 +#define ERROR_WINHTTP_UNRECOGNIZED_SCHEME 12006 +/* End of added error codes */ + +#define ERROR_WINHTTP_AUTODETECTION_FAILED (WINHTTP_ERROR_BASE + 180) + +typedef struct +{ + DWORD dwStructSize; + LPWSTR lpszScheme; + DWORD dwSchemeLength; + INTERNET_SCHEME nScheme; + LPWSTR lpszHostName; + DWORD dwHostNameLength; + INTERNET_PORT nPort; + LPWSTR lpszUserName; + DWORD dwUserNameLength; + LPWSTR lpszPassword; + DWORD dwPasswordLength; + LPWSTR lpszUrlPath; + DWORD dwUrlPathLength; + LPWSTR lpszExtraInfo; + DWORD dwExtraInfoLength; +} URL_COMPONENTS, *LPURL_COMPONENTS; +typedef URL_COMPONENTS URL_COMPONENTSW; +typedef LPURL_COMPONENTS LPURL_COMPONENTSW; + +typedef struct +{ + DWORD_PTR dwResult; + DWORD dwError; +} WINHTTP_ASYNC_RESULT, *LPWINHTTP_ASYNC_RESULT; + +typedef struct +{ + FILETIME ftExpiry; + FILETIME ftStart; + LPWSTR lpszSubjectInfo; + LPWSTR lpszIssuerInfo; + LPWSTR lpszProtocolName; + LPWSTR lpszSignatureAlgName; + LPWSTR lpszEncryptionAlgName; + DWORD dwKeySize; +} WINHTTP_CERTIFICATE_INFO; + +typedef struct +{ + DWORD dwAccessType; + LPCWSTR lpszProxy; + LPCWSTR lpszProxyBypass; +} WINHTTP_PROXY_INFO, *LPWINHTTP_PROXY_INFO; +typedef WINHTTP_PROXY_INFO WINHTTP_PROXY_INFOW; +typedef LPWINHTTP_PROXY_INFO LPWINHTTP_PROXY_INFOW; + +typedef struct +{ + BOOL fAutoDetect; + LPWSTR lpszAutoConfigUrl; + LPWSTR lpszProxy; + LPWSTR lpszProxyBypass; +} WINHTTP_CURRENT_USER_IE_PROXY_CONFIG; + +typedef VOID (CALLBACK *WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD_PTR,DWORD,LPVOID,DWORD); + +typedef struct +{ + DWORD dwFlags; + DWORD dwAutoDetectFlags; + LPCWSTR lpszAutoConfigUrl; + LPVOID lpvReserved; + DWORD dwReserved; + BOOL fAutoLogonIfChallenged; +} WINHTTP_AUTOPROXY_OPTIONS; + +typedef struct +{ + DWORD dwMajorVersion; + DWORD dwMinorVersion; +} HTTP_VERSION_INFO, *LPHTTP_VERSION_INFO; + + +#ifdef __cplusplus +extern "C" { +#endif + +BOOL WINAPI WinHttpAddRequestHeaders(HINTERNET,LPCWSTR,DWORD,DWORD); +BOOL WINAPI WinHttpDetectAutoProxyConfigUrl(DWORD,LPWSTR*); +BOOL WINAPI WinHttpCheckPlatform(void); +BOOL WINAPI WinHttpCloseHandle(HINTERNET); +HINTERNET WINAPI WinHttpConnect(HINTERNET,LPCWSTR,INTERNET_PORT,DWORD); +BOOL WINAPI WinHttpCrackUrl(LPCWSTR,DWORD,DWORD,LPURL_COMPONENTS); +BOOL WINAPI WinHttpCreateUrl(LPURL_COMPONENTS,DWORD,LPWSTR,LPDWORD); +BOOL WINAPI WinHttpGetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); +BOOL WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_CONFIG* config); +BOOL WINAPI WinHttpGetProxyForUrl(HINTERNET,LPCWSTR,WINHTTP_AUTOPROXY_OPTIONS*,WINHTTP_PROXY_INFO*); +HINTERNET WINAPI WinHttpOpen(LPCWSTR,DWORD,LPCWSTR,LPCWSTR,DWORD); + +/* The sixth parameter to WinHttpOpenRequest was wrong in the original + * WINE header. It should be LPCWSTR*, not LPCWSTR, as it points to an + * array of wide strings. + */ +HINTERNET WINAPI WinHttpOpenRequest(HINTERNET,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR*,DWORD); +BOOL WINAPI WinHttpQueryAuthParams(HINTERNET,DWORD,LPVOID*); +BOOL WINAPI WinHttpQueryAuthSchemes(HINTERNET,LPDWORD,LPDWORD,LPDWORD); +BOOL WINAPI WinHttpQueryDataAvailable(HINTERNET,LPDWORD); +BOOL WINAPI WinHttpQueryHeaders(HINTERNET,DWORD,LPCWSTR,LPVOID,LPDWORD,LPDWORD); +BOOL WINAPI WinHttpReadData(HINTERNET,LPVOID,DWORD,LPDWORD); +BOOL WINAPI WinHttpReceiveResponse(HINTERNET,LPVOID); +BOOL WINAPI WinHttpSendRequest(HINTERNET,LPCWSTR,DWORD,LPVOID,DWORD,DWORD,DWORD_PTR); +BOOL WINAPI WinHttpSetDefaultProxyConfiguration(WINHTTP_PROXY_INFO*); +BOOL WINAPI WinHttpSetCredentials(HINTERNET,DWORD,DWORD,LPCWSTR,LPCWSTR,LPVOID); +BOOL WINAPI WinHttpSetOption(HINTERNET,DWORD,LPVOID,DWORD); +WINHTTP_STATUS_CALLBACK WINAPI WinHttpSetStatusCallback(HINTERNET,WINHTTP_STATUS_CALLBACK,DWORD,DWORD_PTR); +BOOL WINAPI WinHttpSetTimeouts(HINTERNET,int,int,int,int); +BOOL WINAPI WinHttpTimeFromSystemTime(CONST SYSTEMTIME *,LPWSTR); +BOOL WINAPI WinHttpTimeToSystemTime(LPCWSTR,SYSTEMTIME*); +BOOL WINAPI WinHttpWriteData(HINTERNET,LPCVOID,DWORD,LPDWORD); + +/* Additional definitions, from the public domain in mingw */ +#define ICU_ESCAPE 0x80000000 +#define ICU_DECODE 0x10000000 + +/* A few constants I couldn't find publicly documented, so I looked up + * their value from the Windows SDK . Presumably this falls + * under fair use. + */ +#define WINHTTP_QUERY_CONTENT_LENGTH 5 +#define WINHTTP_QUERY_CONTENT_TYPE 1 +#define WINHTTP_QUERY_LAST_MODIFIED 11 +#define WINHTTP_QUERY_STATUS_CODE 19 +#define WINHTTP_QUERY_STATUS_TEXT 20 + +#define WINHTTP_QUERY_FLAG_SYSTEMTIME 0x40000000 + +#ifdef __cplusplus +} +#endif + +#endif /* __WINE_WINHTTP_H */ diff --git a/gio/xdgmime/Makefile.am b/gio/xdgmime/Makefile.am new file mode 100644 index 0000000..8078344 --- /dev/null +++ b/gio/xdgmime/Makefile.am @@ -0,0 +1,23 @@ +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = -DXDG_PREFIX=_gio_xdg + +noinst_LTLIBRARIES = libxdgmime.la + +libxdgmime_la_SOURCES = \ + xdgmime.c \ + xdgmime.h \ + xdgmimealias.c \ + xdgmimealias.h \ + xdgmimecache.c \ + xdgmimecache.h \ + xdgmimeglob.c \ + xdgmimeglob.h \ + xdgmimeicon.c \ + xdgmimeicon.h \ + xdgmimeint.c \ + xdgmimeint.h \ + xdgmimemagic.c \ + xdgmimemagic.h \ + xdgmimeparent.c \ + xdgmimeparent.h diff --git a/gio/xdgmime/Makefile.in b/gio/xdgmime/Makefile.in new file mode 100644 index 0000000..94e00cb --- /dev/null +++ b/gio/xdgmime/Makefile.in @@ -0,0 +1,678 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = gio/xdgmime +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libxdgmime_la_LIBADD = +am_libxdgmime_la_OBJECTS = xdgmime.lo xdgmimealias.lo xdgmimecache.lo \ + xdgmimeglob.lo xdgmimeicon.lo xdgmimeint.lo xdgmimemagic.lo \ + xdgmimeparent.lo +libxdgmime_la_OBJECTS = $(am_libxdgmime_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libxdgmime_la_SOURCES) +DIST_SOURCES = $(libxdgmime_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +AM_CPPFLAGS = -DXDG_PREFIX=_gio_xdg +noinst_LTLIBRARIES = libxdgmime.la +libxdgmime_la_SOURCES = \ + xdgmime.c \ + xdgmime.h \ + xdgmimealias.c \ + xdgmimealias.h \ + xdgmimecache.c \ + xdgmimecache.h \ + xdgmimeglob.c \ + xdgmimeglob.h \ + xdgmimeicon.c \ + xdgmimeicon.h \ + xdgmimeint.c \ + xdgmimeint.h \ + xdgmimemagic.c \ + xdgmimemagic.h \ + xdgmimeparent.c \ + xdgmimeparent.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gio/xdgmime/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gio/xdgmime/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 +libxdgmime.la: $(libxdgmime_la_OBJECTS) $(libxdgmime_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libxdgmime_la_OBJECTS) $(libxdgmime_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimealias.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimecache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimeglob.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimeicon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimeint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimemagic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xdgmimeparent.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gio/xdgmime/xdgmime.c b/gio/xdgmime/xdgmime.c new file mode 100644 index 0000000..0888583 --- /dev/null +++ b/gio/xdgmime/xdgmime.c @@ -0,0 +1,926 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmime.c: XDG Mime Spec mime resolver. Based on version 0.11 of the spec. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003,2004 Red Hat, Inc. + * Copyright (C) 2003,2004 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xdgmime.h" +#include "xdgmimeint.h" +#include "xdgmimeglob.h" +#include "xdgmimemagic.h" +#include "xdgmimealias.h" +#include "xdgmimeicon.h" +#include "xdgmimeparent.h" +#include "xdgmimecache.h" +#include +#include +#include +#include +#include +#include +#include + +typedef struct XdgDirTimeList XdgDirTimeList; +typedef struct XdgCallbackList XdgCallbackList; + +static int need_reread = TRUE; +static time_t last_stat_time = 0; + +static XdgGlobHash *global_hash = NULL; +static XdgMimeMagic *global_magic = NULL; +static XdgAliasList *alias_list = NULL; +static XdgParentList *parent_list = NULL; +static XdgDirTimeList *dir_time_list = NULL; +static XdgCallbackList *callback_list = NULL; +static XdgIconList *icon_list = NULL; +static XdgIconList *generic_icon_list = NULL; + +XdgMimeCache **_caches = NULL; +static int n_caches = 0; + +const char xdg_mime_type_unknown[] = "application/octet-stream"; + + +enum +{ + XDG_CHECKED_UNCHECKED, + XDG_CHECKED_VALID, + XDG_CHECKED_INVALID +}; + +struct XdgDirTimeList +{ + time_t mtime; + char *directory_name; + int checked; + XdgDirTimeList *next; +}; + +struct XdgCallbackList +{ + XdgCallbackList *next; + XdgCallbackList *prev; + int callback_id; + XdgMimeCallback callback; + void *data; + XdgMimeDestroy destroy; +}; + +/* Function called by xdg_run_command_on_dirs. If it returns TRUE, further + * directories aren't looked at */ +typedef int (*XdgDirectoryFunc) (const char *directory, + void *user_data); + +static void +xdg_dir_time_list_add (char *file_name, + time_t mtime) +{ + XdgDirTimeList *list; + + for (list = dir_time_list; list; list = list->next) + { + if (strcmp (list->directory_name, file_name) == 0) + { + free (file_name); + return; + } + } + + list = calloc (1, sizeof (XdgDirTimeList)); + list->checked = XDG_CHECKED_UNCHECKED; + list->directory_name = file_name; + list->mtime = mtime; + list->next = dir_time_list; + dir_time_list = list; +} + +static void +xdg_dir_time_list_free (XdgDirTimeList *list) +{ + XdgDirTimeList *next; + + while (list) + { + next = list->next; + free (list->directory_name); + free (list); + list = next; + } +} + +static int +xdg_mime_init_from_directory (const char *directory) +{ + char *file_name; + struct stat st; + + assert (directory != NULL); + + file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache"); + if (stat (file_name, &st) == 0) + { + XdgMimeCache *cache = _xdg_mime_cache_new_from_file (file_name); + + if (cache != NULL) + { + xdg_dir_time_list_add (file_name, st.st_mtime); + + _caches = realloc (_caches, sizeof (XdgMimeCache *) * (n_caches + 2)); + _caches[n_caches] = cache; + _caches[n_caches + 1] = NULL; + n_caches++; + + return FALSE; + } + } + free (file_name); + + file_name = malloc (strlen (directory) + strlen ("/mime/globs2") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/globs2"); + if (stat (file_name, &st) == 0) + { + _xdg_mime_glob_read_from_file (global_hash, file_name, TRUE); + xdg_dir_time_list_add (file_name, st.st_mtime); + } + else + { + free (file_name); + file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/globs"); + if (stat (file_name, &st) == 0) + { + _xdg_mime_glob_read_from_file (global_hash, file_name, FALSE); + xdg_dir_time_list_add (file_name, st.st_mtime); + } + else + { + free (file_name); + } + } + + file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/magic"); + if (stat (file_name, &st) == 0) + { + _xdg_mime_magic_read_from_file (global_magic, file_name); + xdg_dir_time_list_add (file_name, st.st_mtime); + } + else + { + free (file_name); + } + + file_name = malloc (strlen (directory) + strlen ("/mime/aliases") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/aliases"); + _xdg_mime_alias_read_from_file (alias_list, file_name); + free (file_name); + + file_name = malloc (strlen (directory) + strlen ("/mime/subclasses") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/subclasses"); + _xdg_mime_parent_read_from_file (parent_list, file_name); + free (file_name); + + file_name = malloc (strlen (directory) + strlen ("/mime/icons") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/icons"); + _xdg_mime_icon_read_from_file (icon_list, file_name); + free (file_name); + + file_name = malloc (strlen (directory) + strlen ("/mime/generic-icons") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/generic-icons"); + _xdg_mime_icon_read_from_file (generic_icon_list, file_name); + free (file_name); + + return FALSE; /* Keep processing */ +} + +/* Runs a command on all the directories in the search path */ +static void +xdg_run_command_on_dirs (XdgDirectoryFunc func, + void *user_data) +{ + const char *xdg_data_home; + const char *xdg_data_dirs; + const char *ptr; + + xdg_data_home = getenv ("XDG_DATA_HOME"); + if (xdg_data_home) + { + if ((func) (xdg_data_home, user_data)) + return; + } + else + { + const char *home; + + home = getenv ("HOME"); + if (home != NULL) + { + char *guessed_xdg_home; + int stop_processing; + + guessed_xdg_home = malloc (strlen (home) + strlen ("/.local/share/") + 1); + strcpy (guessed_xdg_home, home); + strcat (guessed_xdg_home, "/.local/share/"); + stop_processing = (func) (guessed_xdg_home, user_data); + free (guessed_xdg_home); + + if (stop_processing) + return; + } + } + + xdg_data_dirs = getenv ("XDG_DATA_DIRS"); + if (xdg_data_dirs == NULL) + xdg_data_dirs = "/usr/local/share/:/usr/share/"; + + ptr = xdg_data_dirs; + + while (*ptr != '\000') + { + const char *end_ptr; + char *dir; + int len; + int stop_processing; + + end_ptr = ptr; + while (*end_ptr != ':' && *end_ptr != '\000') + end_ptr ++; + + if (end_ptr == ptr) + { + ptr++; + continue; + } + + if (*end_ptr == ':') + len = end_ptr - ptr; + else + len = end_ptr - ptr + 1; + dir = malloc (len + 1); + strncpy (dir, ptr, len); + dir[len] = '\0'; + stop_processing = (func) (dir, user_data); + free (dir); + + if (stop_processing) + return; + + ptr = end_ptr; + } +} + +/* Checks file_path to make sure it has the same mtime as last time it was + * checked. If it has a different mtime, or if the file doesn't exist, it + * returns FALSE. + * + * FIXME: This doesn't protect against permission changes. + */ +static int +xdg_check_file (const char *file_path, + int *exists) +{ + struct stat st; + + /* If the file exists */ + if (stat (file_path, &st) == 0) + { + XdgDirTimeList *list; + + if (exists) + *exists = TRUE; + + for (list = dir_time_list; list; list = list->next) + { + if (! strcmp (list->directory_name, file_path)) + { + if (st.st_mtime == list->mtime) + list->checked = XDG_CHECKED_VALID; + else + list->checked = XDG_CHECKED_INVALID; + + return (list->checked != XDG_CHECKED_VALID); + } + } + return TRUE; + } + + if (exists) + *exists = FALSE; + + return FALSE; +} + +static int +xdg_check_dir (const char *directory, + int *invalid_dir_list) +{ + int invalid, exists; + char *file_name; + + assert (directory != NULL); + + /* Check the mime.cache file */ + file_name = malloc (strlen (directory) + strlen ("/mime/mime.cache") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/mime.cache"); + invalid = xdg_check_file (file_name, &exists); + free (file_name); + if (invalid) + { + *invalid_dir_list = TRUE; + return TRUE; + } + else if (exists) + { + return FALSE; + } + + /* Check the globs file */ + file_name = malloc (strlen (directory) + strlen ("/mime/globs") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/globs"); + invalid = xdg_check_file (file_name, NULL); + free (file_name); + if (invalid) + { + *invalid_dir_list = TRUE; + return TRUE; + } + + /* Check the magic file */ + file_name = malloc (strlen (directory) + strlen ("/mime/magic") + 1); + strcpy (file_name, directory); strcat (file_name, "/mime/magic"); + invalid = xdg_check_file (file_name, NULL); + free (file_name); + if (invalid) + { + *invalid_dir_list = TRUE; + return TRUE; + } + + return FALSE; /* Keep processing */ +} + +/* Walks through all the mime files stat()ing them to see if they've changed. + * Returns TRUE if they have. */ +static int +xdg_check_dirs (void) +{ + XdgDirTimeList *list; + int invalid_dir_list = FALSE; + + for (list = dir_time_list; list; list = list->next) + list->checked = XDG_CHECKED_UNCHECKED; + + xdg_run_command_on_dirs ((XdgDirectoryFunc) xdg_check_dir, + &invalid_dir_list); + + if (invalid_dir_list) + return TRUE; + + for (list = dir_time_list; list; list = list->next) + { + if (list->checked != XDG_CHECKED_VALID) + return TRUE; + } + + return FALSE; +} + +/* We want to avoid stat()ing on every single mime call, so we only look for + * newer files every 5 seconds. This will return TRUE if we need to reread the + * mime data from disk. + */ +static int +xdg_check_time_and_dirs (void) +{ + struct timeval tv; + time_t current_time; + int retval = FALSE; + + gettimeofday (&tv, NULL); + current_time = tv.tv_sec; + + if (current_time >= last_stat_time + 5) + { + retval = xdg_check_dirs (); + last_stat_time = current_time; + } + + return retval; +} + +/* Called in every public function. It reloads the hash function if need be. + */ +static void +xdg_mime_init (void) +{ + if (xdg_check_time_and_dirs ()) + { + xdg_mime_shutdown (); + } + + if (need_reread) + { + global_hash = _xdg_glob_hash_new (); + global_magic = _xdg_mime_magic_new (); + alias_list = _xdg_mime_alias_list_new (); + parent_list = _xdg_mime_parent_list_new (); + icon_list = _xdg_mime_icon_list_new (); + generic_icon_list = _xdg_mime_icon_list_new (); + + xdg_run_command_on_dirs ((XdgDirectoryFunc) xdg_mime_init_from_directory, + NULL); + + need_reread = FALSE; + } +} + +const char * +xdg_mime_get_mime_type_for_data (const void *data, + size_t len, + int *result_prio) +{ + const char *mime_type; + + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_mime_type_for_data (data, len, result_prio); + + mime_type = _xdg_mime_magic_lookup_data (global_magic, data, len, result_prio, NULL, 0); + + if (mime_type) + return mime_type; + + return XDG_MIME_TYPE_UNKNOWN; +} + +const char * +xdg_mime_get_mime_type_for_file (const char *file_name, + struct stat *statbuf) +{ + const char *mime_type; + /* currently, only a few globs occur twice, and none + * more often, so 5 seems plenty. + */ + const char *mime_types[5]; + FILE *file; + unsigned char *data; + int max_extent; + int bytes_read; + struct stat buf; + const char *base_name; + int n; + + if (file_name == NULL) + return NULL; + if (! _xdg_utf8_validate (file_name)) + return NULL; + + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_mime_type_for_file (file_name, statbuf); + + base_name = _xdg_get_base_name (file_name); + n = _xdg_glob_hash_lookup_file_name (global_hash, base_name, mime_types, 5); + + if (n == 1) + return mime_types[0]; + + if (!statbuf) + { + if (stat (file_name, &buf) != 0) + return XDG_MIME_TYPE_UNKNOWN; + + statbuf = &buf; + } + + if (!S_ISREG (statbuf->st_mode)) + return XDG_MIME_TYPE_UNKNOWN; + + /* FIXME: Need to make sure that max_extent isn't totally broken. This could + * be large and need getting from a stream instead of just reading it all + * in. */ + max_extent = _xdg_mime_magic_get_buffer_extents (global_magic); + data = malloc (max_extent); + if (data == NULL) + return XDG_MIME_TYPE_UNKNOWN; + + file = fopen (file_name, "r"); + if (file == NULL) + { + free (data); + return XDG_MIME_TYPE_UNKNOWN; + } + + bytes_read = fread (data, 1, max_extent, file); + if (ferror (file)) + { + free (data); + fclose (file); + return XDG_MIME_TYPE_UNKNOWN; + } + + mime_type = _xdg_mime_magic_lookup_data (global_magic, data, bytes_read, NULL, + mime_types, n); + + free (data); + fclose (file); + + if (mime_type) + return mime_type; + + return XDG_MIME_TYPE_UNKNOWN; +} + +const char * +xdg_mime_get_mime_type_from_file_name (const char *file_name) +{ + const char *mime_type; + + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_mime_type_from_file_name (file_name); + + if (_xdg_glob_hash_lookup_file_name (global_hash, file_name, &mime_type, 1)) + return mime_type; + else + return XDG_MIME_TYPE_UNKNOWN; +} + +int +xdg_mime_get_mime_types_from_file_name (const char *file_name, + const char *mime_types[], + int n_mime_types) +{ + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_mime_types_from_file_name (file_name, mime_types, n_mime_types); + + return _xdg_glob_hash_lookup_file_name (global_hash, file_name, mime_types, n_mime_types); +} + +int +xdg_mime_is_valid_mime_type (const char *mime_type) +{ + /* FIXME: We should make this a better test + */ + return _xdg_utf8_validate (mime_type); +} + +void +xdg_mime_shutdown (void) +{ + XdgCallbackList *list; + + /* FIXME: Need to make this (and the whole library) thread safe */ + if (dir_time_list) + { + xdg_dir_time_list_free (dir_time_list); + dir_time_list = NULL; + } + + if (global_hash) + { + _xdg_glob_hash_free (global_hash); + global_hash = NULL; + } + if (global_magic) + { + _xdg_mime_magic_free (global_magic); + global_magic = NULL; + } + + if (alias_list) + { + _xdg_mime_alias_list_free (alias_list); + alias_list = NULL; + } + + if (parent_list) + { + _xdg_mime_parent_list_free (parent_list); + parent_list = NULL; + } + + if (icon_list) + { + _xdg_mime_icon_list_free (icon_list); + icon_list = NULL; + } + + if (generic_icon_list) + { + _xdg_mime_icon_list_free (generic_icon_list); + generic_icon_list = NULL; + } + + if (_caches) + { + int i; + + for (i = 0; i < n_caches; i++) + _xdg_mime_cache_unref (_caches[i]); + free (_caches); + _caches = NULL; + n_caches = 0; + } + + for (list = callback_list; list; list = list->next) + (list->callback) (list->data); + + need_reread = TRUE; +} + +int +xdg_mime_get_max_buffer_extents (void) +{ + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_max_buffer_extents (); + + return _xdg_mime_magic_get_buffer_extents (global_magic); +} + +const char * +_xdg_mime_unalias_mime_type (const char *mime_type) +{ + const char *lookup; + + if (_caches) + return _xdg_mime_cache_unalias_mime_type (mime_type); + + if ((lookup = _xdg_mime_alias_list_lookup (alias_list, mime_type)) != NULL) + return lookup; + + return mime_type; +} + +const char * +xdg_mime_unalias_mime_type (const char *mime_type) +{ + xdg_mime_init (); + + return _xdg_mime_unalias_mime_type (mime_type); +} + +int +_xdg_mime_mime_type_equal (const char *mime_a, + const char *mime_b) +{ + const char *unalias_a, *unalias_b; + + unalias_a = _xdg_mime_unalias_mime_type (mime_a); + unalias_b = _xdg_mime_unalias_mime_type (mime_b); + + if (strcmp (unalias_a, unalias_b) == 0) + return 1; + + return 0; +} + +int +xdg_mime_mime_type_equal (const char *mime_a, + const char *mime_b) +{ + xdg_mime_init (); + + return _xdg_mime_mime_type_equal (mime_a, mime_b); +} + +int +xdg_mime_media_type_equal (const char *mime_a, + const char *mime_b) +{ + char *sep; + + sep = strchr (mime_a, '/'); + + if (sep && strncmp (mime_a, mime_b, sep - mime_a + 1) == 0) + return 1; + + return 0; +} + +#if 1 +static int +xdg_mime_is_super_type (const char *mime) +{ + int length; + const char *type; + + length = strlen (mime); + type = &(mime[length - 2]); + + if (strcmp (type, "/*") == 0) + return 1; + + return 0; +} +#endif + +int +_xdg_mime_mime_type_subclass (const char *mime, + const char *base) +{ + const char *umime, *ubase; + const char **parents; + + if (_caches) + return _xdg_mime_cache_mime_type_subclass (mime, base); + + umime = _xdg_mime_unalias_mime_type (mime); + ubase = _xdg_mime_unalias_mime_type (base); + + if (strcmp (umime, ubase) == 0) + return 1; + +#if 1 + /* Handle supertypes */ + if (xdg_mime_is_super_type (ubase) && + xdg_mime_media_type_equal (umime, ubase)) + return 1; +#endif + + /* Handle special cases text/plain and application/octet-stream */ + if (strcmp (ubase, "text/plain") == 0 && + strncmp (umime, "text/", 5) == 0) + return 1; + + if (strcmp (ubase, "application/octet-stream") == 0) + return 1; + + parents = _xdg_mime_parent_list_lookup (parent_list, umime); + for (; parents && *parents; parents++) + { + if (_xdg_mime_mime_type_subclass (*parents, ubase)) + return 1; + } + + return 0; +} + +int +xdg_mime_mime_type_subclass (const char *mime, + const char *base) +{ + xdg_mime_init (); + + return _xdg_mime_mime_type_subclass (mime, base); +} + +char ** +xdg_mime_list_mime_parents (const char *mime) +{ + const char **parents; + char **result; + int i, n; + + if (_caches) + return _xdg_mime_cache_list_mime_parents (mime); + + parents = xdg_mime_get_mime_parents (mime); + + if (!parents) + return NULL; + + for (i = 0; parents[i]; i++) ; + + n = (i + 1) * sizeof (char *); + result = (char **) malloc (n); + memcpy (result, parents, n); + + return result; +} + +const char ** +xdg_mime_get_mime_parents (const char *mime) +{ + const char *umime; + + xdg_mime_init (); + + umime = _xdg_mime_unalias_mime_type (mime); + + return _xdg_mime_parent_list_lookup (parent_list, umime); +} + +void +xdg_mime_dump (void) +{ + xdg_mime_init(); + + printf ("*** ALIASES ***\n\n"); + _xdg_mime_alias_list_dump (alias_list); + printf ("\n*** PARENTS ***\n\n"); + _xdg_mime_parent_list_dump (parent_list); + printf ("\n*** CACHE ***\n\n"); + _xdg_glob_hash_dump (global_hash); + printf ("\n*** GLOBS ***\n\n"); + _xdg_glob_hash_dump (global_hash); + printf ("\n*** GLOBS REVERSE TREE ***\n\n"); + _xdg_mime_cache_glob_dump (); +} + + +/* Registers a function to be called every time the mime database reloads its files + */ +int +xdg_mime_register_reload_callback (XdgMimeCallback callback, + void *data, + XdgMimeDestroy destroy) +{ + XdgCallbackList *list_el; + static int callback_id = 1; + + /* Make a new list element */ + list_el = calloc (1, sizeof (XdgCallbackList)); + list_el->callback_id = callback_id; + list_el->callback = callback; + list_el->data = data; + list_el->destroy = destroy; + list_el->next = callback_list; + if (list_el->next) + list_el->next->prev = list_el; + + callback_list = list_el; + callback_id ++; + + return callback_id - 1; +} + +void +xdg_mime_remove_callback (int callback_id) +{ + XdgCallbackList *list; + + for (list = callback_list; list; list = list->next) + { + if (list->callback_id == callback_id) + { + if (list->next) + list->next = list->prev; + + if (list->prev) + list->prev->next = list->next; + else + callback_list = list->next; + + /* invoke the destroy handler */ + (list->destroy) (list->data); + free (list); + return; + } + } +} + +const char * +xdg_mime_get_icon (const char *mime) +{ + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_icon (mime); + + return _xdg_mime_icon_list_lookup (icon_list, mime); +} + +const char * +xdg_mime_get_generic_icon (const char *mime) +{ + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_get_generic_icon (mime); + + return _xdg_mime_icon_list_lookup (generic_icon_list, mime); +} diff --git a/gio/xdgmime/xdgmime.h b/gio/xdgmime/xdgmime.h new file mode 100644 index 0000000..d3031a3 --- /dev/null +++ b/gio/xdgmime/xdgmime.h @@ -0,0 +1,127 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmime.h: XDG Mime Spec mime resolver. Based on version 0.11 of the spec. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __XDG_MIME_H__ +#define __XDG_MIME_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef XDG_PREFIX +#define XDG_ENTRY(func) _XDG_ENTRY2(XDG_PREFIX,func) +#define _XDG_ENTRY2(prefix,func) _XDG_ENTRY3(prefix,func) +#define _XDG_ENTRY3(prefix,func) prefix##_##func + +#define XDG_RESERVED_ENTRY(func) _XDG_RESERVED_ENTRY2(XDG_PREFIX,func) +#define _XDG_RESERVED_ENTRY2(prefix,func) _XDG_RESERVED_ENTRY3(prefix,func) +#define _XDG_RESERVED_ENTRY3(prefix,func) _##prefix##_##func +#endif + +typedef void (*XdgMimeCallback) (void *user_data); +typedef void (*XdgMimeDestroy) (void *user_data); + + +#ifdef XDG_PREFIX +#define xdg_mime_get_mime_type_for_data XDG_ENTRY(get_mime_type_for_data) +#define xdg_mime_get_mime_type_for_file XDG_ENTRY(get_mime_type_for_file) +#define xdg_mime_get_mime_type_from_file_name XDG_ENTRY(get_mime_type_from_file_name) +#define xdg_mime_get_mime_types_from_file_name XDG_ENTRY(get_mime_types_from_file_name) +#define xdg_mime_is_valid_mime_type XDG_ENTRY(is_valid_mime_type) +#define xdg_mime_mime_type_equal XDG_ENTRY(mime_type_equal) +#define xdg_mime_media_type_equal XDG_ENTRY(media_type_equal) +#define xdg_mime_mime_type_subclass XDG_ENTRY(mime_type_subclass) +#define xdg_mime_get_mime_parents XDG_ENTRY(get_mime_parents) +#define xdg_mime_list_mime_parents XDG_ENTRY(list_mime_parents) +#define xdg_mime_unalias_mime_type XDG_ENTRY(unalias_mime_type) +#define xdg_mime_get_max_buffer_extents XDG_ENTRY(get_max_buffer_extents) +#define xdg_mime_shutdown XDG_ENTRY(shutdown) +#define xdg_mime_dump XDG_ENTRY(dump) +#define xdg_mime_register_reload_callback XDG_ENTRY(register_reload_callback) +#define xdg_mime_remove_callback XDG_ENTRY(remove_callback) +#define xdg_mime_type_unknown XDG_ENTRY(type_unknown) +#define xdg_mime_get_icon XDG_ENTRY(get_icon) +#define xdg_mime_get_generic_icon XDG_ENTRY(get_generic_icon) + +#define _xdg_mime_mime_type_equal XDG_RESERVED_ENTRY(mime_type_equal) +#define _xdg_mime_mime_type_subclass XDG_RESERVED_ENTRY(mime_type_subclass) +#define _xdg_mime_unalias_mime_type XDG_RESERVED_ENTRY(unalias_mime_type) +#endif + +extern const char xdg_mime_type_unknown[]; +#define XDG_MIME_TYPE_UNKNOWN xdg_mime_type_unknown + +const char *xdg_mime_get_mime_type_for_data (const void *data, + size_t len, + int *result_prio); +const char *xdg_mime_get_mime_type_for_file (const char *file_name, + struct stat *statbuf); +const char *xdg_mime_get_mime_type_from_file_name (const char *file_name); +int xdg_mime_get_mime_types_from_file_name(const char *file_name, + const char *mime_types[], + int n_mime_types); +int xdg_mime_is_valid_mime_type (const char *mime_type); +int xdg_mime_mime_type_equal (const char *mime_a, + const char *mime_b); +int xdg_mime_media_type_equal (const char *mime_a, + const char *mime_b); +int xdg_mime_mime_type_subclass (const char *mime_a, + const char *mime_b); + /* xdg_mime_get_mime_parents() is deprecated since it does + * not work correctly with caches. Use xdg_mime_list_parents() + * instead, but notice that that function expects you to free + * the array it returns. + */ +const char **xdg_mime_get_mime_parents (const char *mime); +char ** xdg_mime_list_mime_parents (const char *mime); +const char *xdg_mime_unalias_mime_type (const char *mime); +const char *xdg_mime_get_icon (const char *mime); +const char *xdg_mime_get_generic_icon (const char *mime); +int xdg_mime_get_max_buffer_extents (void); +void xdg_mime_shutdown (void); +void xdg_mime_dump (void); +int xdg_mime_register_reload_callback (XdgMimeCallback callback, + void *data, + XdgMimeDestroy destroy); +void xdg_mime_remove_callback (int callback_id); + + /* Private versions of functions that don't call xdg_mime_init () */ +int _xdg_mime_mime_type_equal (const char *mime_a, + const char *mime_b); +int _xdg_mime_mime_type_subclass (const char *mime, + const char *base); +const char *_xdg_mime_unalias_mime_type (const char *mime); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* __XDG_MIME_H__ */ diff --git a/gio/xdgmime/xdgmimealias.c b/gio/xdgmime/xdgmimealias.c new file mode 100644 index 0000000..c33adfa --- /dev/null +++ b/gio/xdgmime/xdgmimealias.c @@ -0,0 +1,184 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimealias.c: Private file. Datastructure for storing the aliases. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2004 Red Hat, Inc. + * Copyright (C) 2004 Matthias Clasen + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xdgmimealias.h" +#include "xdgmimeint.h" +#include +#include +#include +#include +#include + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +typedef struct XdgAlias XdgAlias; + +struct XdgAlias +{ + char *alias; + char *mime_type; +}; + +struct XdgAliasList +{ + struct XdgAlias *aliases; + int n_aliases; +}; + +XdgAliasList * +_xdg_mime_alias_list_new (void) +{ + XdgAliasList *list; + + list = malloc (sizeof (XdgAliasList)); + + list->aliases = NULL; + list->n_aliases = 0; + + return list; +} + +void +_xdg_mime_alias_list_free (XdgAliasList *list) +{ + int i; + + if (list->aliases) + { + for (i = 0; i < list->n_aliases; i++) + { + free (list->aliases[i].alias); + free (list->aliases[i].mime_type); + } + free (list->aliases); + } + free (list); +} + +static int +alias_entry_cmp (const void *v1, const void *v2) +{ + return strcmp (((XdgAlias *)v1)->alias, ((XdgAlias *)v2)->alias); +} + +const char * +_xdg_mime_alias_list_lookup (XdgAliasList *list, + const char *alias) +{ + XdgAlias *entry; + XdgAlias key; + + if (list->n_aliases > 0) + { + key.alias = (char *)alias; + key.mime_type = NULL; + + entry = bsearch (&key, list->aliases, list->n_aliases, + sizeof (XdgAlias), alias_entry_cmp); + if (entry) + return entry->mime_type; + } + + return NULL; +} + +void +_xdg_mime_alias_read_from_file (XdgAliasList *list, + const char *file_name) +{ + FILE *file; + char line[255]; + int alloc; + + file = fopen (file_name, "r"); + + if (file == NULL) + return; + + /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. + * Blah */ + alloc = list->n_aliases + 16; + list->aliases = realloc (list->aliases, alloc * sizeof (XdgAlias)); + while (fgets (line, 255, file) != NULL) + { + char *sep; + if (line[0] == '#') + continue; + + sep = strchr (line, ' '); + if (sep == NULL) + continue; + *(sep++) = '\000'; + sep[strlen (sep) -1] = '\000'; + if (list->n_aliases == alloc) + { + alloc <<= 1; + list->aliases = realloc (list->aliases, + alloc * sizeof (XdgAlias)); + } + list->aliases[list->n_aliases].alias = strdup (line); + list->aliases[list->n_aliases].mime_type = strdup (sep); + list->n_aliases++; + } + list->aliases = realloc (list->aliases, + list->n_aliases * sizeof (XdgAlias)); + + fclose (file); + + if (list->n_aliases > 1) + qsort (list->aliases, list->n_aliases, + sizeof (XdgAlias), alias_entry_cmp); +} + + +void +_xdg_mime_alias_list_dump (XdgAliasList *list) +{ + int i; + + if (list->aliases) + { + for (i = 0; i < list->n_aliases; i++) + { + printf ("%s %s\n", + list->aliases[i].alias, + list->aliases[i].mime_type); + } + } +} + + diff --git a/gio/xdgmime/xdgmimealias.h b/gio/xdgmime/xdgmimealias.h new file mode 100644 index 0000000..3c28012 --- /dev/null +++ b/gio/xdgmime/xdgmimealias.h @@ -0,0 +1,51 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimealias.h: Private file. Datastructure for storing the aliases. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2004 Red Hat, Inc. + * Copyright (C) 200 Matthias Clasen + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_ALIAS_H__ +#define __XDG_MIME_ALIAS_H__ + +#include "xdgmime.h" + +typedef struct XdgAliasList XdgAliasList; + +#ifdef XDG_PREFIX +#define _xdg_mime_alias_read_from_file XDG_RESERVED_ENTRY(alias_read_from_file) +#define _xdg_mime_alias_list_new XDG_RESERVED_ENTRY(alias_list_new) +#define _xdg_mime_alias_list_free XDG_RESERVED_ENTRY(alias_list_free) +#define _xdg_mime_alias_list_lookup XDG_RESERVED_ENTRY(alias_list_lookup) +#define _xdg_mime_alias_list_dump XDG_RESERVED_ENTRY(alias_list_dump) +#endif + +void _xdg_mime_alias_read_from_file (XdgAliasList *list, + const char *file_name); +XdgAliasList *_xdg_mime_alias_list_new (void); +void _xdg_mime_alias_list_free (XdgAliasList *list); +const char *_xdg_mime_alias_list_lookup (XdgAliasList *list, + const char *alias); +void _xdg_mime_alias_list_dump (XdgAliasList *list); + +#endif /* __XDG_MIME_ALIAS_H__ */ diff --git a/gio/xdgmime/xdgmimecache.c b/gio/xdgmime/xdgmimecache.c new file mode 100644 index 0000000..91c8a07 --- /dev/null +++ b/gio/xdgmime/xdgmimecache.c @@ -0,0 +1,1085 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimealias.c: Private file. mmappable caches for mime data + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2005 Matthias Clasen + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#include /* for ntohl/ntohs */ + +#ifdef HAVE_MMAP +#include +#else +#warning Building xdgmime without MMAP support. Binary "mime.info" cache files will not be used. +#endif + +#include +#include + +#include "xdgmimecache.h" +#include "xdgmimeint.h" + +#ifndef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#ifndef _O_BINARY +#define _O_BINARY 0 +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif + +#define MAJOR_VERSION 1 +#define MINOR_VERSION_MIN 1 +#define MINOR_VERSION_MAX 2 + +struct _XdgMimeCache +{ + int ref_count; + int minor; + + size_t size; + char *buffer; +}; + +#define GET_UINT16(cache,offset) (ntohs(*(xdg_uint16_t*)((cache) + (offset)))) +#define GET_UINT32(cache,offset) (ntohl(*(xdg_uint32_t*)((cache) + (offset)))) + +XdgMimeCache * +_xdg_mime_cache_ref (XdgMimeCache *cache) +{ + cache->ref_count++; + return cache; +} + +void +_xdg_mime_cache_unref (XdgMimeCache *cache) +{ + cache->ref_count--; + + if (cache->ref_count == 0) + { +#ifdef HAVE_MMAP + munmap (cache->buffer, cache->size); +#endif + free (cache); + } +} + +XdgMimeCache * +_xdg_mime_cache_new_from_file (const char *file_name) +{ + XdgMimeCache *cache = NULL; + +#ifdef HAVE_MMAP + int fd = -1; + struct stat st; + char *buffer = NULL; + int minor; + + /* Open the file and map it into memory */ + fd = open (file_name, O_RDONLY|_O_BINARY, 0); + + if (fd < 0) + return NULL; + + if (fstat (fd, &st) < 0 || st.st_size < 4) + goto done; + + buffer = (char *) mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + + if (buffer == MAP_FAILED) + goto done; + + minor = GET_UINT16 (buffer, 2); + /* Verify version */ + if (GET_UINT16 (buffer, 0) != MAJOR_VERSION || + (minor < MINOR_VERSION_MIN || + minor > MINOR_VERSION_MAX)) + { + munmap (buffer, st.st_size); + + goto done; + } + + cache = (XdgMimeCache *) malloc (sizeof (XdgMimeCache)); + cache->minor = minor; + cache->ref_count = 1; + cache->buffer = buffer; + cache->size = st.st_size; + + done: + if (fd != -1) + close (fd); + +#endif /* HAVE_MMAP */ + + return cache; +} + +static int +cache_magic_matchlet_compare_to_data (XdgMimeCache *cache, + xdg_uint32_t offset, + const void *data, + size_t len) +{ + xdg_uint32_t range_start = GET_UINT32 (cache->buffer, offset); + xdg_uint32_t range_length = GET_UINT32 (cache->buffer, offset + 4); + xdg_uint32_t data_length = GET_UINT32 (cache->buffer, offset + 12); + xdg_uint32_t data_offset = GET_UINT32 (cache->buffer, offset + 16); + xdg_uint32_t mask_offset = GET_UINT32 (cache->buffer, offset + 20); + + int i, j; + + for (i = range_start; i < range_start + range_length; i++) + { + int valid_matchlet = TRUE; + + if (i + data_length > len) + return FALSE; + + if (mask_offset) + { + for (j = 0; j < data_length; j++) + { + if ((((unsigned char *)cache->buffer)[data_offset + j] & ((unsigned char *)cache->buffer)[mask_offset + j]) != + ((((unsigned char *) data)[j + i]) & ((unsigned char *)cache->buffer)[mask_offset + j])) + { + valid_matchlet = FALSE; + break; + } + } + } + else + { + for (j = 0; j < data_length; j++) + { + if (((unsigned char *)cache->buffer)[data_offset + j] != ((unsigned char *) data)[j + i]) + { + valid_matchlet = FALSE; + break; + } + } + } + + if (valid_matchlet) + return TRUE; + } + + return FALSE; +} + +static int +cache_magic_matchlet_compare (XdgMimeCache *cache, + xdg_uint32_t offset, + const void *data, + size_t len) +{ + xdg_uint32_t n_children = GET_UINT32 (cache->buffer, offset + 24); + xdg_uint32_t child_offset = GET_UINT32 (cache->buffer, offset + 28); + + int i; + + if (cache_magic_matchlet_compare_to_data (cache, offset, data, len)) + { + if (n_children == 0) + return TRUE; + + for (i = 0; i < n_children; i++) + { + if (cache_magic_matchlet_compare (cache, child_offset + 32 * i, + data, len)) + return TRUE; + } + } + + return FALSE; +} + +static const char * +cache_magic_compare_to_data (XdgMimeCache *cache, + xdg_uint32_t offset, + const void *data, + size_t len, + int *prio) +{ + xdg_uint32_t priority = GET_UINT32 (cache->buffer, offset); + xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, offset + 4); + xdg_uint32_t n_matchlets = GET_UINT32 (cache->buffer, offset + 8); + xdg_uint32_t matchlet_offset = GET_UINT32 (cache->buffer, offset + 12); + + int i; + + for (i = 0; i < n_matchlets; i++) + { + if (cache_magic_matchlet_compare (cache, matchlet_offset + i * 32, + data, len)) + { + *prio = priority; + + return cache->buffer + mimetype_offset; + } + } + + return NULL; +} + +static const char * +cache_magic_lookup_data (XdgMimeCache *cache, + const void *data, + size_t len, + int *prio, + const char *mime_types[], + int n_mime_types) +{ + xdg_uint32_t list_offset; + xdg_uint32_t n_entries; + xdg_uint32_t offset; + + int j, n; + + *prio = 0; + + list_offset = GET_UINT32 (cache->buffer, 24); + n_entries = GET_UINT32 (cache->buffer, list_offset); + offset = GET_UINT32 (cache->buffer, list_offset + 8); + + for (j = 0; j < n_entries; j++) + { + const char *match; + + match = cache_magic_compare_to_data (cache, offset + 16 * j, + data, len, prio); + if (match) + return match; + else + { + xdg_uint32_t mimetype_offset; + const char *non_match; + + mimetype_offset = GET_UINT32 (cache->buffer, offset + 16 * j + 4); + non_match = cache->buffer + mimetype_offset; + + for (n = 0; n < n_mime_types; n++) + { + if (mime_types[n] && + _xdg_mime_mime_type_equal (mime_types[n], non_match)) + mime_types[n] = NULL; + } + } + } + + return NULL; +} + +static const char * +cache_alias_lookup (const char *alias) +{ + const char *ptr; + int i, min, max, mid, cmp; + + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 4); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + xdg_uint32_t offset; + + min = 0; + max = n_entries - 1; + while (max >= min) + { + mid = (min + max) / 2; + + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid); + ptr = cache->buffer + offset; + cmp = strcmp (ptr, alias); + + if (cmp < 0) + min = mid + 1; + else if (cmp > 0) + max = mid - 1; + else + { + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid + 4); + return cache->buffer + offset; + } + } + } + + return NULL; +} + +typedef struct { + const char *mime; + int weight; +} MimeWeight; + +static int +cache_glob_lookup_literal (const char *file_name, + const char *mime_types[], + int n_mime_types, + int case_sensitive_check) +{ + const char *ptr; + int i, min, max, mid, cmp; + + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 12); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + xdg_uint32_t offset; + + min = 0; + max = n_entries - 1; + while (max >= min) + { + mid = (min + max) / 2; + + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * mid); + ptr = cache->buffer + offset; + cmp = strcmp (ptr, file_name); + + if (cmp < 0) + min = mid + 1; + else if (cmp > 0) + max = mid - 1; + else + { + int weight = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * mid + 8); + int case_sensitive = weight & 0x100; + weight = weight & 0xff; + + if (case_sensitive_check || !case_sensitive) + { + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * mid + 4); + mime_types[0] = (const char *)(cache->buffer + offset); + + return 1; + } + return 0; + } + } + } + + return 0; +} + +static int +cache_glob_lookup_fnmatch (const char *file_name, + MimeWeight mime_types[], + int n_mime_types) +{ + const char *mime_type; + const char *ptr; + + int i, j, n; + + n = 0; + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 20); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + + for (j = 0; j < n_entries && n < n_mime_types; j++) + { + xdg_uint32_t offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * j); + xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * j + 4); + int weight = GET_UINT32 (cache->buffer, list_offset + 4 + 12 * j + 8); + weight = weight & 0xff; + ptr = cache->buffer + offset; + mime_type = cache->buffer + mimetype_offset; + + /* FIXME: Not UTF-8 safe */ + if (fnmatch (ptr, file_name, 0) == 0) + { + mime_types[n].mime = mime_type; + mime_types[n].weight = weight; + n++; + } + } + + if (n == n_mime_types) + break; + } + + return n; +} + +static int +cache_glob_node_lookup_suffix (XdgMimeCache *cache, + xdg_uint32_t n_entries, + xdg_uint32_t offset, + const char *file_name, + int len, + int case_sensitive_check, + MimeWeight mime_types[], + int n_mime_types) +{ + xdg_unichar_t character; + xdg_unichar_t match_char; + xdg_uint32_t mimetype_offset; + xdg_uint32_t n_children; + xdg_uint32_t child_offset; + int weight; + int case_sensitive; + + int min, max, mid, n, i; + + character = file_name[len - 1]; + + assert (character != 0); + + min = 0; + max = n_entries - 1; + while (max >= min) + { + mid = (min + max) / 2; + match_char = GET_UINT32 (cache->buffer, offset + 12 * mid); + if (match_char < character) + min = mid + 1; + else if (match_char > character) + max = mid - 1; + else + { + len--; + n = 0; + n_children = GET_UINT32 (cache->buffer, offset + 12 * mid + 4); + child_offset = GET_UINT32 (cache->buffer, offset + 12 * mid + 8); + + if (len > 0) + { + n = cache_glob_node_lookup_suffix (cache, + n_children, child_offset, + file_name, len, + case_sensitive_check, + mime_types, + n_mime_types); + } + if (n == 0) + { + i = 0; + while (n < n_mime_types && i < n_children) + { + match_char = GET_UINT32 (cache->buffer, child_offset + 12 * i); + if (match_char != 0) + break; + + mimetype_offset = GET_UINT32 (cache->buffer, child_offset + 12 * i + 4); + weight = GET_UINT32 (cache->buffer, child_offset + 12 * i + 8); + case_sensitive = weight & 0x100; + weight = weight & 0xff; + + if (case_sensitive_check || !case_sensitive) + { + mime_types[n].mime = cache->buffer + mimetype_offset; + mime_types[n].weight = weight; + n++; + } + i++; + } + } + return n; + } + } + return 0; +} + +static int +cache_glob_lookup_suffix (const char *file_name, + int len, + int ignore_case, + MimeWeight mime_types[], + int n_mime_types) +{ + int i, n; + + n = 0; + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 16); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + xdg_uint32_t offset = GET_UINT32 (cache->buffer, list_offset + 4); + + n += cache_glob_node_lookup_suffix (cache, + n_entries, offset, + file_name, len, + ignore_case, + mime_types + n, + n_mime_types - n); + if (n == n_mime_types) + break; + } + + return n; +} + +static int compare_mime_weight (const void *a, const void *b) +{ + const MimeWeight *aa = (const MimeWeight *)a; + const MimeWeight *bb = (const MimeWeight *)b; + + return bb->weight - aa->weight; +} + +#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') +static char * +ascii_tolower (const char *str) +{ + char *p, *lower; + + lower = strdup (str); + p = lower; + while (*p != 0) + { + char c = *p; + *p++ = ISUPPER (c) ? c - 'A' + 'a' : c; + } + return lower; +} + +static int +filter_out_dupes (MimeWeight mimes[], int n_mimes) +{ + int last; + int i, j; + + last = n_mimes; + + for (i = 0; i < last; i++) + { + j = i + 1; + while (j < last) + { + if (strcmp (mimes[i].mime, mimes[j].mime) == 0) + { + mimes[i].weight = MAX (mimes[i].weight, mimes[j].weight); + last--; + mimes[j].mime = mimes[last].mime; + mimes[j].weight = mimes[last].weight; + } + else + j++; + } + } + + return last; +} + +static int +cache_glob_lookup_file_name (const char *file_name, + const char *mime_types[], + int n_mime_types) +{ + int n; + MimeWeight mimes[10]; + int n_mimes = 10; + int i; + int len; + char *lower_case; + + assert (file_name != NULL && n_mime_types > 0); + + /* First, check the literals */ + + lower_case = ascii_tolower (file_name); + + n = cache_glob_lookup_literal (lower_case, mime_types, n_mime_types, FALSE); + if (n > 0) + { + free (lower_case); + return n; + } + + n = cache_glob_lookup_literal (file_name, mime_types, n_mime_types, TRUE); + if (n > 0) + { + free (lower_case); + return n; + } + + len = strlen (file_name); + n = cache_glob_lookup_suffix (lower_case, len, FALSE, mimes, n_mimes); + if (n < 2) + n += cache_glob_lookup_suffix (file_name, len, TRUE, mimes + n, n_mimes - n); + + free (lower_case); + + /* Last, try fnmatch */ + if (n < 2) + n += cache_glob_lookup_fnmatch (file_name, mimes + n, n_mimes - n); + + n = filter_out_dupes (mimes, n); + + qsort (mimes, n, sizeof (MimeWeight), compare_mime_weight); + + if (n_mime_types < n) + n = n_mime_types; + + for (i = 0; i < n; i++) + mime_types[i] = mimes[i].mime; + + return n; +} + +int +_xdg_mime_cache_get_max_buffer_extents (void) +{ + xdg_uint32_t offset; + xdg_uint32_t max_extent; + int i; + + max_extent = 0; + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + + offset = GET_UINT32 (cache->buffer, 24); + max_extent = MAX (max_extent, GET_UINT32 (cache->buffer, offset + 4)); + } + + return max_extent; +} + +static const char * +cache_get_mime_type_for_data (const void *data, + size_t len, + int *result_prio, + const char *mime_types[], + int n_mime_types) +{ + const char *mime_type; + int i, n, priority; + + priority = 0; + mime_type = NULL; + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + + int prio; + const char *match; + + match = cache_magic_lookup_data (cache, data, len, &prio, + mime_types, n_mime_types); + if (prio > priority) + { + priority = prio; + mime_type = match; + } + } + + if (result_prio) + *result_prio = priority; + + if (priority > 0) + return mime_type; + + for (n = 0; n < n_mime_types; n++) + { + + if (mime_types[n]) + return mime_types[n]; + } + + return XDG_MIME_TYPE_UNKNOWN; +} + +const char * +_xdg_mime_cache_get_mime_type_for_data (const void *data, + size_t len, + int *result_prio) +{ + return cache_get_mime_type_for_data (data, len, result_prio, NULL, 0); +} + +const char * +_xdg_mime_cache_get_mime_type_for_file (const char *file_name, + struct stat *statbuf) +{ + const char *mime_type; + const char *mime_types[10]; + FILE *file; + unsigned char *data; + int max_extent; + int bytes_read; + struct stat buf; + const char *base_name; + int n; + + if (file_name == NULL) + return NULL; + + if (! _xdg_utf8_validate (file_name)) + return NULL; + + base_name = _xdg_get_base_name (file_name); + n = cache_glob_lookup_file_name (base_name, mime_types, 10); + + if (n == 1) + return mime_types[0]; + + if (!statbuf) + { + if (stat (file_name, &buf) != 0) + return XDG_MIME_TYPE_UNKNOWN; + + statbuf = &buf; + } + + if (!S_ISREG (statbuf->st_mode)) + return XDG_MIME_TYPE_UNKNOWN; + + /* FIXME: Need to make sure that max_extent isn't totally broken. This could + * be large and need getting from a stream instead of just reading it all + * in. */ + max_extent = _xdg_mime_cache_get_max_buffer_extents (); + data = malloc (max_extent); + if (data == NULL) + return XDG_MIME_TYPE_UNKNOWN; + + file = fopen (file_name, "r"); + if (file == NULL) + { + free (data); + return XDG_MIME_TYPE_UNKNOWN; + } + + bytes_read = fread (data, 1, max_extent, file); + if (ferror (file)) + { + free (data); + fclose (file); + return XDG_MIME_TYPE_UNKNOWN; + } + + mime_type = cache_get_mime_type_for_data (data, bytes_read, NULL, + mime_types, n); + + free (data); + fclose (file); + + return mime_type; +} + +const char * +_xdg_mime_cache_get_mime_type_from_file_name (const char *file_name) +{ + const char *mime_type; + + if (cache_glob_lookup_file_name (file_name, &mime_type, 1)) + return mime_type; + else + return XDG_MIME_TYPE_UNKNOWN; +} + +int +_xdg_mime_cache_get_mime_types_from_file_name (const char *file_name, + const char *mime_types[], + int n_mime_types) +{ + return cache_glob_lookup_file_name (file_name, mime_types, n_mime_types); +} + +#if 1 +static int +is_super_type (const char *mime) +{ + int length; + const char *type; + + length = strlen (mime); + type = &(mime[length - 2]); + + if (strcmp (type, "/*") == 0) + return 1; + + return 0; +} +#endif + +int +_xdg_mime_cache_mime_type_subclass (const char *mime, + const char *base) +{ + const char *umime, *ubase; + + int i, j, min, max, med, cmp; + + umime = _xdg_mime_cache_unalias_mime_type (mime); + ubase = _xdg_mime_cache_unalias_mime_type (base); + + if (strcmp (umime, ubase) == 0) + return 1; + + /* We really want to handle text/ * in GtkFileFilter, so we just + * turn on the supertype matching + */ +#if 1 + /* Handle supertypes */ + if (is_super_type (ubase) && + xdg_mime_media_type_equal (umime, ubase)) + return 1; +#endif + + /* Handle special cases text/plain and application/octet-stream */ + if (strcmp (ubase, "text/plain") == 0 && + strncmp (umime, "text/", 5) == 0) + return 1; + + if (strcmp (ubase, "application/octet-stream") == 0) + return 1; + + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 8); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + xdg_uint32_t offset, n_parents, parent_offset; + + min = 0; + max = n_entries - 1; + while (max >= min) + { + med = (min + max)/2; + + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * med); + cmp = strcmp (cache->buffer + offset, umime); + if (cmp < 0) + min = med + 1; + else if (cmp > 0) + max = med - 1; + else + { + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * med + 4); + n_parents = GET_UINT32 (cache->buffer, offset); + + for (j = 0; j < n_parents; j++) + { + parent_offset = GET_UINT32 (cache->buffer, offset + 4 + 4 * j); + if (_xdg_mime_cache_mime_type_subclass (cache->buffer + parent_offset, ubase)) + return 1; + } + + break; + } + } + } + + return 0; +} + +const char * +_xdg_mime_cache_unalias_mime_type (const char *mime) +{ + const char *lookup; + + lookup = cache_alias_lookup (mime); + + if (lookup) + return lookup; + + return mime; +} + +char ** +_xdg_mime_cache_list_mime_parents (const char *mime) +{ + int i, j, k, l, p; + char *all_parents[128]; /* we'll stop at 128 */ + char **result; + + mime = xdg_mime_unalias_mime_type (mime); + + p = 0; + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, 8); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + + for (j = 0; j < n_entries; j++) + { + xdg_uint32_t mimetype_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * j); + xdg_uint32_t parents_offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * j + 4); + + if (strcmp (cache->buffer + mimetype_offset, mime) == 0) + { + xdg_uint32_t parent_mime_offset; + xdg_uint32_t n_parents = GET_UINT32 (cache->buffer, parents_offset); + + for (k = 0; k < n_parents && p < 127; k++) + { + parent_mime_offset = GET_UINT32 (cache->buffer, parents_offset + 4 + 4 * k); + + /* Don't add same parent multiple times. + * This can happen for instance if the same type is listed in multiple directories + */ + for (l = 0; l < p; l++) + { + if (strcmp (all_parents[l], cache->buffer + parent_mime_offset) == 0) + break; + } + + if (l == p) + all_parents[p++] = cache->buffer + parent_mime_offset; + } + + break; + } + } + } + all_parents[p++] = NULL; + + result = (char **) malloc (p * sizeof (char *)); + memcpy (result, all_parents, p * sizeof (char *)); + + return result; +} + +static const char * +cache_lookup_icon (const char *mime, int header) +{ + const char *ptr; + int i, min, max, mid, cmp; + + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + xdg_uint32_t list_offset = GET_UINT32 (cache->buffer, header); + xdg_uint32_t n_entries = GET_UINT32 (cache->buffer, list_offset); + xdg_uint32_t offset; + + min = 0; + max = n_entries - 1; + while (max >= min) + { + mid = (min + max) / 2; + + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid); + ptr = cache->buffer + offset; + cmp = strcmp (ptr, mime); + + if (cmp < 0) + min = mid + 1; + else if (cmp > 0) + max = mid - 1; + else + { + offset = GET_UINT32 (cache->buffer, list_offset + 4 + 8 * mid + 4); + return cache->buffer + offset; + } + } + } + + return NULL; +} + +const char * +_xdg_mime_cache_get_generic_icon (const char *mime) +{ + return cache_lookup_icon (mime, 36); +} + +const char * +_xdg_mime_cache_get_icon (const char *mime) +{ + return cache_lookup_icon (mime, 32); +} + +static void +dump_glob_node (XdgMimeCache *cache, + xdg_uint32_t offset, + int depth) +{ + xdg_unichar_t character; + xdg_uint32_t mime_offset; + xdg_uint32_t n_children; + xdg_uint32_t child_offset; + int i; + + character = GET_UINT32 (cache->buffer, offset); + mime_offset = GET_UINT32 (cache->buffer, offset + 4); + n_children = GET_UINT32 (cache->buffer, offset + 8); + child_offset = GET_UINT32 (cache->buffer, offset + 12); + for (i = 0; i < depth; i++) + printf (" "); + printf ("%c", character); + if (mime_offset) + printf (" - %s", cache->buffer + mime_offset); + printf ("\n"); + if (child_offset) + { + for (i = 0; i < n_children; i++) + dump_glob_node (cache, child_offset + 20 * i, depth + 1); + } +} + +void +_xdg_mime_cache_glob_dump (void) +{ + int i, j; + for (i = 0; _caches[i]; i++) + { + XdgMimeCache *cache = _caches[i]; + xdg_uint32_t list_offset; + xdg_uint32_t n_entries; + xdg_uint32_t offset; + list_offset = GET_UINT32 (cache->buffer, 16); + n_entries = GET_UINT32 (cache->buffer, list_offset); + offset = GET_UINT32 (cache->buffer, list_offset + 4); + for (j = 0; j < n_entries; j++) + dump_glob_node (cache, offset + 20 * j, 0); + } +} + + diff --git a/gio/xdgmime/xdgmimecache.h b/gio/xdgmime/xdgmimecache.h new file mode 100644 index 0000000..27f42d0 --- /dev/null +++ b/gio/xdgmime/xdgmimecache.h @@ -0,0 +1,81 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimecache.h: Private file. Datastructure for mmapped caches. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2005 Matthias Clasen + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_CACHE_H__ +#define __XDG_MIME_CACHE_H__ + +#include "xdgmime.h" + +typedef struct _XdgMimeCache XdgMimeCache; + +#ifdef XDG_PREFIX +#define _xdg_mime_cache_new_from_file XDG_RESERVED_ENTRY(cache_new_from_file) +#define _xdg_mime_cache_ref XDG_RESERVED_ENTRY(cache_ref) +#define _xdg_mime_cache_unref XDG_RESERVED_ENTRY(cache_unref) +#define _xdg_mime_cache_get_max_buffer_extents XDG_RESERVED_ENTRY(cache_get_max_buffer_extents) +#define _xdg_mime_cache_get_mime_type_for_data XDG_RESERVED_ENTRY(cache_get_mime_type_for_data) +#define _xdg_mime_cache_get_mime_type_for_file XDG_RESERVED_ENTRY(cache_get_mime_type_for_file) +#define _xdg_mime_cache_get_mime_type_from_file_name XDG_RESERVED_ENTRY(cache_get_mime_type_from_file_name) +#define _xdg_mime_cache_get_mime_types_from_file_name XDG_RESERVED_ENTRY(cache_get_mime_types_from_file_name) +#define _xdg_mime_cache_list_mime_parents XDG_RESERVED_ENTRY(cache_list_mime_parents) +#define _xdg_mime_cache_mime_type_subclass XDG_RESERVED_ENTRY(cache_mime_type_subclass) +#define _xdg_mime_cache_unalias_mime_type XDG_RESERVED_ENTRY(cache_unalias_mime_type) +#define _xdg_mime_cache_get_icon XDG_RESERVED_ENTRY(cache_get_icon) +#define _xdg_mime_cache_get_generic_icon XDG_RESERVED_ENTRY(cache_get_generic_icon) +#define _xdg_mime_cache_glob_dump XDG_RESERVED_ENTRY(cache_glob_dump) +#endif + +extern XdgMimeCache **_caches; + +XdgMimeCache *_xdg_mime_cache_new_from_file (const char *file_name); +XdgMimeCache *_xdg_mime_cache_ref (XdgMimeCache *cache); +void _xdg_mime_cache_unref (XdgMimeCache *cache); + + +const char *_xdg_mime_cache_get_mime_type_for_data (const void *data, + size_t len, + int *result_prio); +const char *_xdg_mime_cache_get_mime_type_for_file (const char *file_name, + struct stat *statbuf); +int _xdg_mime_cache_get_mime_types_from_file_name (const char *file_name, + const char *mime_types[], + int n_mime_types); +const char *_xdg_mime_cache_get_mime_type_from_file_name (const char *file_name); +int _xdg_mime_cache_is_valid_mime_type (const char *mime_type); +int _xdg_mime_cache_mime_type_equal (const char *mime_a, + const char *mime_b); +int _xdg_mime_cache_media_type_equal (const char *mime_a, + const char *mime_b); +int _xdg_mime_cache_mime_type_subclass (const char *mime_a, + const char *mime_b); +char **_xdg_mime_cache_list_mime_parents (const char *mime); +const char *_xdg_mime_cache_unalias_mime_type (const char *mime); +int _xdg_mime_cache_get_max_buffer_extents (void); +const char *_xdg_mime_cache_get_icon (const char *mime); +const char *_xdg_mime_cache_get_generic_icon (const char *mime); +void _xdg_mime_cache_glob_dump (void); + +#endif /* __XDG_MIME_CACHE_H__ */ diff --git a/gio/xdgmime/xdgmimeglob.c b/gio/xdgmime/xdgmimeglob.c new file mode 100644 index 0000000..daea606 --- /dev/null +++ b/gio/xdgmime/xdgmimeglob.c @@ -0,0 +1,725 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeglob.c: Private file. Datastructure for storing the globs. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xdgmimeglob.h" +#include "xdgmimeint.h" +#include +#include +#include +#include +#include + +#ifndef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +typedef struct XdgGlobHashNode XdgGlobHashNode; +typedef struct XdgGlobList XdgGlobList; + +struct XdgGlobHashNode +{ + xdg_unichar_t character; + const char *mime_type; + int weight; + int case_sensitive; + XdgGlobHashNode *next; + XdgGlobHashNode *child; +}; +struct XdgGlobList +{ + const char *data; + const char *mime_type; + int weight; + int case_sensitive; + XdgGlobList *next; +}; + +struct XdgGlobHash +{ + XdgGlobList *literal_list; + XdgGlobHashNode *simple_node; + XdgGlobList *full_list; +}; + + +/* XdgGlobList + */ +static XdgGlobList * +_xdg_glob_list_new (void) +{ + XdgGlobList *new_element; + + new_element = calloc (1, sizeof (XdgGlobList)); + + return new_element; +} + +/* Frees glob_list and all of it's children */ +static void +_xdg_glob_list_free (XdgGlobList *glob_list) +{ + XdgGlobList *ptr, *next; + + ptr = glob_list; + + while (ptr != NULL) + { + next = ptr->next; + + if (ptr->data) + free ((void *) ptr->data); + if (ptr->mime_type) + free ((void *) ptr->mime_type); + free (ptr); + + ptr = next; + } +} + +static XdgGlobList * +_xdg_glob_list_append (XdgGlobList *glob_list, + void *data, + const char *mime_type, + int weight, + int case_sensitive) +{ + XdgGlobList *new_element; + XdgGlobList *tmp_element; + + tmp_element = glob_list; + while (tmp_element != NULL) + { + if (strcmp (tmp_element->data, data) == 0 && + strcmp (tmp_element->mime_type, mime_type) == 0) + return glob_list; + + tmp_element = tmp_element->next; + } + + new_element = _xdg_glob_list_new (); + new_element->data = data; + new_element->mime_type = mime_type; + new_element->weight = weight; + new_element->case_sensitive = case_sensitive; + if (glob_list == NULL) + return new_element; + + tmp_element = glob_list; + while (tmp_element->next != NULL) + tmp_element = tmp_element->next; + + tmp_element->next = new_element; + + return glob_list; +} + +/* XdgGlobHashNode + */ + +static XdgGlobHashNode * +_xdg_glob_hash_node_new (void) +{ + XdgGlobHashNode *glob_hash_node; + + glob_hash_node = calloc (1, sizeof (XdgGlobHashNode)); + + return glob_hash_node; +} + +static void +_xdg_glob_hash_node_dump (XdgGlobHashNode *glob_hash_node, + int depth) +{ + int i; + for (i = 0; i < depth; i++) + printf (" "); + + printf ("%c", (char)glob_hash_node->character); + if (glob_hash_node->mime_type) + printf (" - %s %d\n", glob_hash_node->mime_type, glob_hash_node->weight); + else + printf ("\n"); + if (glob_hash_node->child) + _xdg_glob_hash_node_dump (glob_hash_node->child, depth + 1); + if (glob_hash_node->next) + _xdg_glob_hash_node_dump (glob_hash_node->next, depth); +} + +static XdgGlobHashNode * +_xdg_glob_hash_insert_ucs4 (XdgGlobHashNode *glob_hash_node, + xdg_unichar_t *text, + const char *mime_type, + int weight, + int case_sensitive) +{ + XdgGlobHashNode *node; + xdg_unichar_t character; + + character = text[0]; + + if ((glob_hash_node == NULL) || + (character < glob_hash_node->character)) + { + node = _xdg_glob_hash_node_new (); + node->character = character; + node->next = glob_hash_node; + glob_hash_node = node; + } + else if (character == glob_hash_node->character) + { + node = glob_hash_node; + } + else + { + XdgGlobHashNode *prev_node; + int found_node = FALSE; + + /* Look for the first character of text in glob_hash_node, and insert it if we + * have to.*/ + prev_node = glob_hash_node; + node = prev_node->next; + + while (node != NULL) + { + if (character < node->character) + { + node = _xdg_glob_hash_node_new (); + node->character = character; + node->next = prev_node->next; + prev_node->next = node; + + found_node = TRUE; + break; + } + else if (character == node->character) + { + found_node = TRUE; + break; + } + prev_node = node; + node = node->next; + } + + if (! found_node) + { + node = _xdg_glob_hash_node_new (); + node->character = character; + node->next = prev_node->next; + prev_node->next = node; + } + } + + text++; + if (*text == 0) + { + if (node->mime_type) + { + if (strcmp (node->mime_type, mime_type) != 0) + { + XdgGlobHashNode *child; + int found_node = FALSE; + + child = node->child; + while (child && child->character == 0) + { + if (strcmp (child->mime_type, mime_type) == 0) + { + found_node = TRUE; + break; + } + child = child->next; + } + + if (!found_node) + { + child = _xdg_glob_hash_node_new (); + child->character = 0; + child->mime_type = strdup (mime_type); + child->weight = weight; + child->case_sensitive = case_sensitive; + child->child = NULL; + child->next = node->child; + node->child = child; + } + } + } + else + { + node->mime_type = strdup (mime_type); + node->weight = weight; + node->case_sensitive = case_sensitive; + } + } + else + { + node->child = _xdg_glob_hash_insert_ucs4 (node->child, text, mime_type, weight, case_sensitive); + } + return glob_hash_node; +} + +/* glob must be valid UTF-8 */ +static XdgGlobHashNode * +_xdg_glob_hash_insert_text (XdgGlobHashNode *glob_hash_node, + const char *text, + const char *mime_type, + int weight, + int case_sensitive) +{ + XdgGlobHashNode *node; + xdg_unichar_t *unitext; + int len; + + unitext = _xdg_convert_to_ucs4 (text, &len); + _xdg_reverse_ucs4 (unitext, len); + node = _xdg_glob_hash_insert_ucs4 (glob_hash_node, unitext, mime_type, weight, case_sensitive); + free (unitext); + return node; +} + +typedef struct { + const char *mime; + int weight; +} MimeWeight; + +static int +_xdg_glob_hash_node_lookup_file_name (XdgGlobHashNode *glob_hash_node, + const char *file_name, + int len, + int case_sensitive_check, + MimeWeight mime_types[], + int n_mime_types) +{ + int n; + XdgGlobHashNode *node; + xdg_unichar_t character; + + if (glob_hash_node == NULL) + return 0; + + character = file_name[len - 1]; + + for (node = glob_hash_node; node && character >= node->character; node = node->next) + { + if (character == node->character) + { + len--; + n = 0; + if (len > 0) + { + n = _xdg_glob_hash_node_lookup_file_name (node->child, + file_name, + len, + case_sensitive_check, + mime_types, + n_mime_types); + } + if (n == 0) + { + if (node->mime_type && + (case_sensitive_check || + !node->case_sensitive)) + { + mime_types[n].mime = node->mime_type; + mime_types[n].weight = node->weight; + n++; + } + node = node->child; + while (n < n_mime_types && node && node->character == 0) + { + if (node->mime_type && + (case_sensitive_check || + !node->case_sensitive)) + { + mime_types[n].mime = node->mime_type; + mime_types[n].weight = node->weight; + n++; + } + node = node->next; + } + } + return n; + } + } + + return 0; +} + +static int compare_mime_weight (const void *a, const void *b) +{ + const MimeWeight *aa = (const MimeWeight *)a; + const MimeWeight *bb = (const MimeWeight *)b; + + return bb->weight - aa->weight; +} + +#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') +static char * +ascii_tolower (const char *str) +{ + char *p, *lower; + + lower = strdup (str); + p = lower; + while (*p != 0) + { + char c = *p; + *p++ = ISUPPER (c) ? c - 'A' + 'a' : c; + } + return lower; +} + +static int +filter_out_dupes (MimeWeight mimes[], int n_mimes) +{ + int last; + int i, j; + + last = n_mimes; + + for (i = 0; i < last; i++) + { + j = i + 1; + while (j < last) + { + if (strcmp (mimes[i].mime, mimes[j].mime) == 0) + { + mimes[i].weight = MAX (mimes[i].weight, mimes[j].weight); + last--; + mimes[j].mime = mimes[last].mime; + mimes[j].weight = mimes[last].weight; + } + else + j++; + } + } + + return last; +} + +int +_xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash, + const char *file_name, + const char *mime_types[], + int n_mime_types) +{ + XdgGlobList *list; + int i, n; + MimeWeight mimes[10]; + int n_mimes = 10; + int len; + char *lower_case; + + /* First, check the literals */ + + assert (file_name != NULL && n_mime_types > 0); + + n = 0; + + lower_case = ascii_tolower (file_name); + + for (list = glob_hash->literal_list; list; list = list->next) + { + if (strcmp ((const char *)list->data, file_name) == 0) + { + mime_types[0] = list->mime_type; + free (lower_case); + return 1; + } + } + + for (list = glob_hash->literal_list; list; list = list->next) + { + if (!list->case_sensitive && + strcmp ((const char *)list->data, lower_case) == 0) + { + mime_types[0] = list->mime_type; + free (lower_case); + return 1; + } + } + + + len = strlen (file_name); + n = _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, lower_case, len, FALSE, + mimes, n_mimes); + if (n < 2) + n += _xdg_glob_hash_node_lookup_file_name (glob_hash->simple_node, file_name, len, TRUE, + mimes + n, n_mimes - n); + + if (n < 2) + { + for (list = glob_hash->full_list; list && n < n_mime_types; list = list->next) + { + if (fnmatch ((const char *)list->data, file_name, 0) == 0) + { + mimes[n].mime = list->mime_type; + mimes[n].weight = list->weight; + n++; + } + } + } + free (lower_case); + + n = filter_out_dupes (mimes, n); + + qsort (mimes, n, sizeof (MimeWeight), compare_mime_weight); + + if (n_mime_types < n) + n = n_mime_types; + + for (i = 0; i < n; i++) + mime_types[i] = mimes[i].mime; + + return n; +} + + + +/* XdgGlobHash + */ + +XdgGlobHash * +_xdg_glob_hash_new (void) +{ + XdgGlobHash *glob_hash; + + glob_hash = calloc (1, sizeof (XdgGlobHash)); + + return glob_hash; +} + + +static void +_xdg_glob_hash_free_nodes (XdgGlobHashNode *node) +{ + if (node) + { + if (node->child) + _xdg_glob_hash_free_nodes (node->child); + if (node->next) + _xdg_glob_hash_free_nodes (node->next); + if (node->mime_type) + free ((void *) node->mime_type); + free (node); + } +} + +void +_xdg_glob_hash_free (XdgGlobHash *glob_hash) +{ + _xdg_glob_list_free (glob_hash->literal_list); + _xdg_glob_list_free (glob_hash->full_list); + _xdg_glob_hash_free_nodes (glob_hash->simple_node); + free (glob_hash); +} + +XdgGlobType +_xdg_glob_determine_type (const char *glob) +{ + const char *ptr; + int maybe_in_simple_glob = FALSE; + int first_char = TRUE; + + ptr = glob; + + while (*ptr != '\0') + { + if (*ptr == '*' && first_char) + maybe_in_simple_glob = TRUE; + else if (*ptr == '\\' || *ptr == '[' || *ptr == '?' || *ptr == '*') + return XDG_GLOB_FULL; + + first_char = FALSE; + ptr = _xdg_utf8_next_char (ptr); + } + if (maybe_in_simple_glob) + return XDG_GLOB_SIMPLE; + else + return XDG_GLOB_LITERAL; +} + +/* glob must be valid UTF-8 */ +void +_xdg_glob_hash_append_glob (XdgGlobHash *glob_hash, + const char *glob, + const char *mime_type, + int weight, + int case_sensitive) +{ + XdgGlobType type; + + assert (glob_hash != NULL); + assert (glob != NULL); + + type = _xdg_glob_determine_type (glob); + + switch (type) + { + case XDG_GLOB_LITERAL: + glob_hash->literal_list = _xdg_glob_list_append (glob_hash->literal_list, strdup (glob), strdup (mime_type), weight, case_sensitive); + break; + case XDG_GLOB_SIMPLE: + glob_hash->simple_node = _xdg_glob_hash_insert_text (glob_hash->simple_node, glob + 1, mime_type, weight, case_sensitive); + break; + case XDG_GLOB_FULL: + glob_hash->full_list = _xdg_glob_list_append (glob_hash->full_list, strdup (glob), strdup (mime_type), weight, case_sensitive); + break; + } +} + +void +_xdg_glob_hash_dump (XdgGlobHash *glob_hash) +{ + XdgGlobList *list; + printf ("LITERAL STRINGS\n"); + if (!glob_hash || glob_hash->literal_list == NULL) + { + printf (" None\n"); + } + else + { + for (list = glob_hash->literal_list; list; list = list->next) + printf (" %s - %s %d\n", (char *)list->data, list->mime_type, list->weight); + } + printf ("\nSIMPLE GLOBS\n"); + if (!glob_hash || glob_hash->simple_node == NULL) + { + printf (" None\n"); + } + else + { + _xdg_glob_hash_node_dump (glob_hash->simple_node, 4); + } + + printf ("\nFULL GLOBS\n"); + if (!glob_hash || glob_hash->full_list == NULL) + { + printf (" None\n"); + } + else + { + for (list = glob_hash->full_list; list; list = list->next) + printf (" %s - %s %d\n", (char *)list->data, list->mime_type, list->weight); + } +} + + +void +_xdg_mime_glob_read_from_file (XdgGlobHash *glob_hash, + const char *file_name, + int version_two) +{ + FILE *glob_file; + char line[255]; + char *p; + + glob_file = fopen (file_name, "r"); + + if (glob_file == NULL) + return; + + /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. + * Blah */ + while (fgets (line, 255, glob_file) != NULL) + { + char *colon; + char *mimetype, *glob, *end; + int weight; + int case_sensitive; + + if (line[0] == '#' || line[0] == 0) + continue; + + end = line + strlen(line) - 1; + if (*end == '\n') + *end = 0; + + p = line; + if (version_two) + { + colon = strchr (p, ':'); + if (colon == NULL) + continue; + *colon = 0; + weight = atoi (p); + p = colon + 1; + } + else + weight = 50; + + colon = strchr (p, ':'); + if (colon == NULL) + continue; + *colon = 0; + + mimetype = p; + p = colon + 1; + glob = p; + case_sensitive = FALSE; + + colon = strchr (p, ':'); + if (version_two && colon != NULL) + { + char *flag; + + /* We got flags */ + *colon = 0; + p = colon + 1; + + /* Flags end at next colon */ + colon = strchr (p, ':'); + if (colon != NULL) + *colon = 0; + + flag = strstr (p, "cs"); + if (flag != NULL && + /* Start or after comma */ + (flag == p || + flag[-1] == ',') && + /* ends with comma or end of string */ + (flag[2] == 0 || + flag[2] == ',')) + case_sensitive = TRUE; + } + + _xdg_glob_hash_append_glob (glob_hash, glob, mimetype, weight, case_sensitive); + } + + fclose (glob_file); +} diff --git a/gio/xdgmime/xdgmimeglob.h b/gio/xdgmime/xdgmimeglob.h new file mode 100644 index 0000000..0018292 --- /dev/null +++ b/gio/xdgmime/xdgmimeglob.h @@ -0,0 +1,70 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeglob.h: Private file. Datastructure for storing the globs. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_GLOB_H__ +#define __XDG_MIME_GLOB_H__ + +#include "xdgmime.h" + +typedef struct XdgGlobHash XdgGlobHash; + +typedef enum +{ + XDG_GLOB_LITERAL, /* Makefile */ + XDG_GLOB_SIMPLE, /* *.gif */ + XDG_GLOB_FULL /* x*.[ch] */ +} XdgGlobType; + + +#ifdef XDG_PREFIX +#define _xdg_mime_glob_read_from_file XDG_RESERVED_ENTRY(glob_read_from_file) +#define _xdg_glob_hash_new XDG_RESERVED_ENTRY(hash_new) +#define _xdg_glob_hash_free XDG_RESERVED_ENTRY(hash_free) +#define _xdg_glob_hash_lookup_file_name XDG_RESERVED_ENTRY(hash_lookup_file_name) +#define _xdg_glob_hash_append_glob XDG_RESERVED_ENTRY(hash_append_glob) +#define _xdg_glob_determine_type XDG_RESERVED_ENTRY(determine_type) +#define _xdg_glob_hash_dump XDG_RESERVED_ENTRY(hash_dump) +#endif + +void _xdg_mime_glob_read_from_file (XdgGlobHash *glob_hash, + const char *file_name, + int version_two); +XdgGlobHash *_xdg_glob_hash_new (void); +void _xdg_glob_hash_free (XdgGlobHash *glob_hash); +int _xdg_glob_hash_lookup_file_name (XdgGlobHash *glob_hash, + const char *text, + const char *mime_types[], + int n_mime_types); +void _xdg_glob_hash_append_glob (XdgGlobHash *glob_hash, + const char *glob, + const char *mime_type, + int weight, + int case_sensitive); +XdgGlobType _xdg_glob_determine_type (const char *glob); +void _xdg_glob_hash_dump (XdgGlobHash *glob_hash); + +#endif /* __XDG_MIME_GLOB_H__ */ diff --git a/gio/xdgmime/xdgmimeicon.c b/gio/xdgmime/xdgmimeicon.c new file mode 100644 index 0000000..16db843 --- /dev/null +++ b/gio/xdgmime/xdgmimeicon.c @@ -0,0 +1,183 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeicon.c: Private file. Datastructure for storing the aliases. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2008 Red Hat, Inc. + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xdgmimeicon.h" +#include "xdgmimeint.h" +#include +#include +#include +#include +#include + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +typedef struct XdgIcon XdgIcon; + +struct XdgIcon +{ + char *mime_type; + char *icon_name; +}; + +struct XdgIconList +{ + struct XdgIcon *icons; + int n_icons; +}; + +XdgIconList * +_xdg_mime_icon_list_new (void) +{ + XdgIconList *list; + + list = malloc (sizeof (XdgIconList)); + + list->icons = NULL; + list->n_icons = 0; + + return list; +} + +void +_xdg_mime_icon_list_free (XdgIconList *list) +{ + int i; + + if (list->icons) + { + for (i = 0; i < list->n_icons; i++) + { + free (list->icons[i].mime_type); + free (list->icons[i].icon_name); + } + free (list->icons); + } + free (list); +} + +static int +icon_entry_cmp (const void *v1, const void *v2) +{ + return strcmp (((XdgIcon *)v1)->mime_type, ((XdgIcon *)v2)->mime_type); +} + +const char * +_xdg_mime_icon_list_lookup (XdgIconList *list, + const char *mime_type) +{ + XdgIcon *entry; + XdgIcon key; + + if (list->n_icons > 0) + { + key.mime_type = (char *)mime_type; + key.icon_name = NULL; + + entry = bsearch (&key, list->icons, list->n_icons, + sizeof (XdgIcon), icon_entry_cmp); + if (entry) + return entry->icon_name; + } + + return NULL; +} + +void +_xdg_mime_icon_read_from_file (XdgIconList *list, + const char *file_name) +{ + FILE *file; + char line[255]; + int alloc; + + file = fopen (file_name, "r"); + + if (file == NULL) + return; + + /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. + * Blah */ + alloc = list->n_icons + 16; + list->icons = realloc (list->icons, alloc * sizeof (XdgIcon)); + while (fgets (line, 255, file) != NULL) + { + char *sep; + if (line[0] == '#') + continue; + + sep = strchr (line, ':'); + if (sep == NULL) + continue; + *(sep++) = '\000'; + sep[strlen (sep) -1] = '\000'; + if (list->n_icons == alloc) + { + alloc <<= 1; + list->icons = realloc (list->icons, + alloc * sizeof (XdgIcon)); + } + list->icons[list->n_icons].mime_type = strdup (line); + list->icons[list->n_icons].icon_name = strdup (sep); + list->n_icons++; + } + list->icons = realloc (list->icons, + list->n_icons * sizeof (XdgIcon)); + + fclose (file); + + if (list->n_icons > 1) + qsort (list->icons, list->n_icons, + sizeof (XdgIcon), icon_entry_cmp); +} + + +void +_xdg_mime_icon_list_dump (XdgIconList *list) +{ + int i; + + if (list->icons) + { + for (i = 0; i < list->n_icons; i++) + { + printf ("%s %s\n", + list->icons[i].mime_type, + list->icons[i].icon_name); + } + } +} + + diff --git a/gio/xdgmime/xdgmimeicon.h b/gio/xdgmime/xdgmimeicon.h new file mode 100644 index 0000000..b5f2583 --- /dev/null +++ b/gio/xdgmime/xdgmimeicon.h @@ -0,0 +1,50 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeicon.h: Private file. Datastructure for storing the aliases. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2008 Red Hat, Inc. + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_ICON_H__ +#define __XDG_MIME_ICON_H__ + +#include "xdgmime.h" + +typedef struct XdgIconList XdgIconList; + +#ifdef XDG_PREFIX +#define _xdg_mime_icon_read_from_file XDG_ENTRY(icon_read_from_file) +#define _xdg_mime_icon_list_new XDG_ENTRY(icon_list_new) +#define _xdg_mime_icon_list_free XDG_ENTRY(icon_list_free) +#define _xdg_mime_icon_list_lookup XDG_ENTRY(icon_list_lookup) +#define _xdg_mime_icon_list_dump XDG_ENTRY(icon_list_dump) +#endif + +void _xdg_mime_icon_read_from_file (XdgIconList *list, + const char *file_name); +XdgIconList *_xdg_mime_icon_list_new (void); +void _xdg_mime_icon_list_free (XdgIconList *list); +const char *_xdg_mime_icon_list_lookup (XdgIconList *list, + const char *mime); +void _xdg_mime_icon_list_dump (XdgIconList *list); + +#endif /* __XDG_MIME_ICON_H__ */ diff --git a/gio/xdgmime/xdgmimeint.c b/gio/xdgmime/xdgmimeint.c new file mode 100644 index 0000000..b2aa956 --- /dev/null +++ b/gio/xdgmime/xdgmimeint.c @@ -0,0 +1,191 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeint.c: Internal defines and functions. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xdgmimeint.h" +#include +#include + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +static const char _xdg_utf8_skip_data[256] = { + 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,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, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 +}; + +const char * const _xdg_utf8_skip = _xdg_utf8_skip_data; + + + +/* Returns the number of unprocessed characters. */ +xdg_unichar_t +_xdg_utf8_to_ucs4(const char *source) +{ + xdg_unichar_t ucs32; + if( ! ( *source & 0x80 ) ) + { + ucs32 = *source; + } + else + { + int bytelength = 0; + xdg_unichar_t result; + if ( ! (*source & 0x40) ) + { + ucs32 = *source; + } + else + { + if ( ! (*source & 0x20) ) + { + result = *source++ & 0x1F; + bytelength = 2; + } + else if ( ! (*source & 0x10) ) + { + result = *source++ & 0x0F; + bytelength = 3; + } + else if ( ! (*source & 0x08) ) + { + result = *source++ & 0x07; + bytelength = 4; + } + else if ( ! (*source & 0x04) ) + { + result = *source++ & 0x03; + bytelength = 5; + } + else if ( ! (*source & 0x02) ) + { + result = *source++ & 0x01; + bytelength = 6; + } + else + { + result = *source++; + bytelength = 1; + } + + for ( bytelength --; bytelength > 0; bytelength -- ) + { + result <<= 6; + result |= *source++ & 0x3F; + } + ucs32 = result; + } + } + return ucs32; +} + + +/* hullo. this is great code. don't rewrite it */ + +xdg_unichar_t +_xdg_ucs4_to_lower (xdg_unichar_t source) +{ + /* FIXME: Do a real to_upper sometime */ + /* CaseFolding-3.2.0.txt has a table of rules. */ + if ((source & 0xFF) == source) + return (xdg_unichar_t) tolower ((unsigned char) source); + return source; +} + +int +_xdg_utf8_validate (const char *source) +{ + /* FIXME: actually write */ + return TRUE; +} + +const char * +_xdg_get_base_name (const char *file_name) +{ + const char *base_name; + + if (file_name == NULL) + return NULL; + + base_name = strrchr (file_name, '/'); + + if (base_name == NULL) + return file_name; + else + return base_name + 1; +} + +xdg_unichar_t * +_xdg_convert_to_ucs4 (const char *source, int *len) +{ + xdg_unichar_t *out; + int i; + const char *p; + + out = malloc (sizeof (xdg_unichar_t) * (strlen (source) + 1)); + + p = source; + i = 0; + while (*p) + { + out[i++] = _xdg_utf8_to_ucs4 (p); + p = _xdg_utf8_next_char (p); + } + out[i] = 0; + *len = i; + + return out; +} + +void +_xdg_reverse_ucs4 (xdg_unichar_t *source, int len) +{ + xdg_unichar_t c; + int i; + + for (i = 0; i < len - i - 1; i++) + { + c = source[i]; + source[i] = source[len - i - 1]; + source[len - i - 1] = c; + } +} + diff --git a/gio/xdgmime/xdgmimeint.h b/gio/xdgmime/xdgmimeint.h new file mode 100644 index 0000000..232c808 --- /dev/null +++ b/gio/xdgmime/xdgmimeint.h @@ -0,0 +1,77 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeint.h: Internal defines and functions. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_INT_H__ +#define __XDG_MIME_INT_H__ + +#include "xdgmime.h" + + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +/* FIXME: Needs to be configure check */ +typedef unsigned int xdg_unichar_t; +typedef unsigned char xdg_uchar8_t; +typedef unsigned short xdg_uint16_t; +typedef unsigned int xdg_uint32_t; + +#ifdef XDG_PREFIX +#define _xdg_utf8_skip XDG_RESERVED_ENTRY(utf8_skip) +#define _xdg_utf8_to_ucs4 XDG_RESERVED_ENTRY(utf8_to_ucs4) +#define _xdg_ucs4_to_lower XDG_RESERVED_ENTRY(ucs4_to_lower) +#define _xdg_utf8_validate XDG_RESERVED_ENTRY(utf8_validate) +#define _xdg_get_base_name XDG_RESERVED_ENTRY(get_base_name) +#define _xdg_convert_to_ucs4 XDG_RESERVED_ENTRY(convert_to_ucs4) +#define _xdg_reverse_ucs4 XDG_RESERVED_ENTRY(reverse_ucs4) +#endif + +#define SWAP_BE16_TO_LE16(val) (xdg_uint16_t)(((xdg_uint16_t)(val) << 8)|((xdg_uint16_t)(val) >> 8)) + +#define SWAP_BE32_TO_LE32(val) (xdg_uint32_t)((((xdg_uint32_t)(val) & 0xFF000000U) >> 24) | \ + (((xdg_uint32_t)(val) & 0x00FF0000U) >> 8) | \ + (((xdg_uint32_t)(val) & 0x0000FF00U) << 8) | \ + (((xdg_uint32_t)(val) & 0x000000FFU) << 24)) +/* UTF-8 utils + */ +extern const char *const _xdg_utf8_skip; +#define _xdg_utf8_next_char(p) (char *)((p) + _xdg_utf8_skip[*(unsigned char *)(p)]) +#define _xdg_utf8_char_size(p) (int) (_xdg_utf8_skip[*(unsigned char *)(p)]) + +xdg_unichar_t _xdg_utf8_to_ucs4 (const char *source); +xdg_unichar_t _xdg_ucs4_to_lower (xdg_unichar_t source); +int _xdg_utf8_validate (const char *source); +xdg_unichar_t *_xdg_convert_to_ucs4 (const char *source, int *len); +void _xdg_reverse_ucs4 (xdg_unichar_t *source, int len); +const char *_xdg_get_base_name (const char *file_name); + +#endif /* __XDG_MIME_INT_H__ */ diff --git a/gio/xdgmime/xdgmimemagic.c b/gio/xdgmime/xdgmimemagic.c new file mode 100644 index 0000000..ae1093a --- /dev/null +++ b/gio/xdgmime/xdgmimemagic.c @@ -0,0 +1,813 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimemagic.: Private file. Datastructure for storing magic files. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "xdgmimemagic.h" +#include "xdgmimeint.h" +#include +#include +#include +#include +#include +#include + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#if !defined getc_unlocked && !defined HAVE_GETC_UNLOCKED +# define getc_unlocked(fp) getc (fp) +#endif + +typedef struct XdgMimeMagicMatch XdgMimeMagicMatch; +typedef struct XdgMimeMagicMatchlet XdgMimeMagicMatchlet; + +typedef enum +{ + XDG_MIME_MAGIC_SECTION, + XDG_MIME_MAGIC_MAGIC, + XDG_MIME_MAGIC_ERROR, + XDG_MIME_MAGIC_EOF +} XdgMimeMagicState; + +struct XdgMimeMagicMatch +{ + const char *mime_type; + int priority; + XdgMimeMagicMatchlet *matchlet; + XdgMimeMagicMatch *next; +}; + + +struct XdgMimeMagicMatchlet +{ + int indent; + int offset; + unsigned int value_length; + unsigned char *value; + unsigned char *mask; + unsigned int range_length; + unsigned int word_size; + XdgMimeMagicMatchlet *next; +}; + + +struct XdgMimeMagic +{ + XdgMimeMagicMatch *match_list; + int max_extent; +}; + +static XdgMimeMagicMatch * +_xdg_mime_magic_match_new (void) +{ + return calloc (1, sizeof (XdgMimeMagicMatch)); +} + + +static XdgMimeMagicMatchlet * +_xdg_mime_magic_matchlet_new (void) +{ + XdgMimeMagicMatchlet *matchlet; + + matchlet = malloc (sizeof (XdgMimeMagicMatchlet)); + + matchlet->indent = 0; + matchlet->offset = 0; + matchlet->value_length = 0; + matchlet->value = NULL; + matchlet->mask = NULL; + matchlet->range_length = 1; + matchlet->word_size = 1; + matchlet->next = NULL; + + return matchlet; +} + + +static void +_xdg_mime_magic_matchlet_free (XdgMimeMagicMatchlet *mime_magic_matchlet) +{ + if (mime_magic_matchlet) + { + if (mime_magic_matchlet->next) + _xdg_mime_magic_matchlet_free (mime_magic_matchlet->next); + if (mime_magic_matchlet->value) + free (mime_magic_matchlet->value); + if (mime_magic_matchlet->mask) + free (mime_magic_matchlet->mask); + free (mime_magic_matchlet); + } +} + + +/* Frees mime_magic_match and the remainder of its list + */ +static void +_xdg_mime_magic_match_free (XdgMimeMagicMatch *mime_magic_match) +{ + XdgMimeMagicMatch *ptr, *next; + + ptr = mime_magic_match; + while (ptr) + { + next = ptr->next; + + if (ptr->mime_type) + free ((void *) ptr->mime_type); + if (ptr->matchlet) + _xdg_mime_magic_matchlet_free (ptr->matchlet); + free (ptr); + + ptr = next; + } +} + +/* Reads in a hunk of data until a newline character or a '\000' is hit. The + * returned string is null terminated, and doesn't include the newline. + */ +static unsigned char * +_xdg_mime_magic_read_to_newline (FILE *magic_file, + int *end_of_file) +{ + unsigned char *retval; + int c; + int len, pos; + + len = 128; + pos = 0; + retval = malloc (len); + *end_of_file = FALSE; + + while (TRUE) + { + c = getc_unlocked (magic_file); + if (c == EOF) + { + *end_of_file = TRUE; + break; + } + if (c == '\n' || c == '\000') + break; + retval[pos++] = (unsigned char) c; + if (pos % 128 == 127) + { + len = len + 128; + retval = realloc (retval, len); + } + } + + retval[pos] = '\000'; + return retval; +} + +/* Returns the number read from the file, or -1 if no number could be read. + */ +static int +_xdg_mime_magic_read_a_number (FILE *magic_file, + int *end_of_file) +{ + /* LONG_MAX is about 20 characters on my system */ +#define MAX_NUMBER_SIZE 30 + char number_string[MAX_NUMBER_SIZE + 1]; + int pos = 0; + int c; + long retval = -1; + + while (TRUE) + { + c = getc_unlocked (magic_file); + + if (c == EOF) + { + *end_of_file = TRUE; + break; + } + if (! isdigit (c)) + { + ungetc (c, magic_file); + break; + } + number_string[pos] = (char) c; + pos++; + if (pos == MAX_NUMBER_SIZE) + break; + } + if (pos > 0) + { + number_string[pos] = '\000'; + errno = 0; + retval = strtol (number_string, NULL, 10); + + if ((retval < INT_MIN) || (retval > INT_MAX) || (errno != 0)) + return -1; + } + + return retval; +} + +/* Headers are of the format: + * [:] + */ +static XdgMimeMagicState +_xdg_mime_magic_parse_header (FILE *magic_file, XdgMimeMagicMatch *match) +{ + int c; + char *buffer; + char *end_ptr; + int end_of_file = 0; + + assert (magic_file != NULL); + assert (match != NULL); + + c = getc_unlocked (magic_file); + if (c == EOF) + return XDG_MIME_MAGIC_EOF; + if (c != '[') + return XDG_MIME_MAGIC_ERROR; + + match->priority = _xdg_mime_magic_read_a_number (magic_file, &end_of_file); + if (end_of_file) + return XDG_MIME_MAGIC_EOF; + if (match->priority == -1) + return XDG_MIME_MAGIC_ERROR; + + c = getc_unlocked (magic_file); + if (c == EOF) + return XDG_MIME_MAGIC_EOF; + if (c != ':') + return XDG_MIME_MAGIC_ERROR; + + buffer = (char *)_xdg_mime_magic_read_to_newline (magic_file, &end_of_file); + if (end_of_file) + return XDG_MIME_MAGIC_EOF; + + end_ptr = buffer; + while (*end_ptr != ']' && *end_ptr != '\000' && *end_ptr != '\n') + end_ptr++; + if (*end_ptr != ']') + { + free (buffer); + return XDG_MIME_MAGIC_ERROR; + } + *end_ptr = '\000'; + + match->mime_type = strdup (buffer); + free (buffer); + + return XDG_MIME_MAGIC_MAGIC; +} + +static XdgMimeMagicState +_xdg_mime_magic_parse_error (FILE *magic_file) +{ + int c; + + while (1) + { + c = getc_unlocked (magic_file); + if (c == EOF) + return XDG_MIME_MAGIC_EOF; + if (c == '\n') + return XDG_MIME_MAGIC_SECTION; + } +} + +/* Headers are of the format: + * [ indent ] ">" start-offset "=" value + * [ "&" mask ] [ "~" word-size ] [ "+" range-length ] "\n" + */ +static XdgMimeMagicState +_xdg_mime_magic_parse_magic_line (FILE *magic_file, + XdgMimeMagicMatch *match) +{ + XdgMimeMagicMatchlet *matchlet; + int c; + int end_of_file; + int indent = 0; + int bytes_read; + + assert (magic_file != NULL); + + /* Sniff the buffer to make sure it's a valid line */ + c = getc_unlocked (magic_file); + if (c == EOF) + return XDG_MIME_MAGIC_EOF; + else if (c == '[') + { + ungetc (c, magic_file); + return XDG_MIME_MAGIC_SECTION; + } + else if (c == '\n') + return XDG_MIME_MAGIC_MAGIC; + + /* At this point, it must be a digit or a '>' */ + end_of_file = FALSE; + if (isdigit (c)) + { + ungetc (c, magic_file); + indent = _xdg_mime_magic_read_a_number (magic_file, &end_of_file); + if (end_of_file) + return XDG_MIME_MAGIC_EOF; + if (indent == -1) + return XDG_MIME_MAGIC_ERROR; + c = getc_unlocked (magic_file); + if (c == EOF) + return XDG_MIME_MAGIC_EOF; + } + + if (c != '>') + return XDG_MIME_MAGIC_ERROR; + + matchlet = _xdg_mime_magic_matchlet_new (); + matchlet->indent = indent; + matchlet->offset = _xdg_mime_magic_read_a_number (magic_file, &end_of_file); + if (end_of_file) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_EOF; + } + if (matchlet->offset == -1) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + c = getc_unlocked (magic_file); + if (c == EOF) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_EOF; + } + else if (c != '=') + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + + /* Next two bytes determine how long the value is */ + matchlet->value_length = 0; + c = getc_unlocked (magic_file); + if (c == EOF) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_EOF; + } + matchlet->value_length = c & 0xFF; + matchlet->value_length = matchlet->value_length << 8; + + c = getc_unlocked (magic_file); + if (c == EOF) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_EOF; + } + matchlet->value_length = matchlet->value_length + (c & 0xFF); + + matchlet->value = malloc (matchlet->value_length); + + /* OOM */ + if (matchlet->value == NULL) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + bytes_read = fread (matchlet->value, 1, matchlet->value_length, magic_file); + if (bytes_read != matchlet->value_length) + { + _xdg_mime_magic_matchlet_free (matchlet); + if (feof (magic_file)) + return XDG_MIME_MAGIC_EOF; + else + return XDG_MIME_MAGIC_ERROR; + } + + c = getc_unlocked (magic_file); + if (c == '&') + { + matchlet->mask = malloc (matchlet->value_length); + /* OOM */ + if (matchlet->mask == NULL) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + bytes_read = fread (matchlet->mask, 1, matchlet->value_length, magic_file); + if (bytes_read != matchlet->value_length) + { + _xdg_mime_magic_matchlet_free (matchlet); + if (feof (magic_file)) + return XDG_MIME_MAGIC_EOF; + else + return XDG_MIME_MAGIC_ERROR; + } + c = getc_unlocked (magic_file); + } + + if (c == '~') + { + matchlet->word_size = _xdg_mime_magic_read_a_number (magic_file, &end_of_file); + if (end_of_file) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_EOF; + } + if (matchlet->word_size != 0 && + matchlet->word_size != 1 && + matchlet->word_size != 2 && + matchlet->word_size != 4) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + c = getc_unlocked (magic_file); + } + + if (c == '+') + { + matchlet->range_length = _xdg_mime_magic_read_a_number (magic_file, &end_of_file); + if (end_of_file) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_EOF; + } + if (matchlet->range_length == -1) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + c = getc_unlocked (magic_file); + } + + + if (c == '\n') + { + /* We clean up the matchlet, byte swapping if needed */ + if (matchlet->word_size > 1) + { + int i; + if (matchlet->value_length % matchlet->word_size != 0) + { + _xdg_mime_magic_matchlet_free (matchlet); + return XDG_MIME_MAGIC_ERROR; + } + /* FIXME: need to get this defined in a style file */ +#if LITTLE_ENDIAN + for (i = 0; i < matchlet->value_length; i = i + matchlet->word_size) + { + if (matchlet->word_size == 2) + *((xdg_uint16_t *) matchlet->value + i) = SWAP_BE16_TO_LE16 (*((xdg_uint16_t *) (matchlet->value + i))); + else if (matchlet->word_size == 4) + *((xdg_uint32_t *) matchlet->value + i) = SWAP_BE32_TO_LE32 (*((xdg_uint32_t *) (matchlet->value + i))); + if (matchlet->mask) + { + if (matchlet->word_size == 2) + *((xdg_uint16_t *) matchlet->mask + i) = SWAP_BE16_TO_LE16 (*((xdg_uint16_t *) (matchlet->mask + i))); + else if (matchlet->word_size == 4) + *((xdg_uint32_t *) matchlet->mask + i) = SWAP_BE32_TO_LE32 (*((xdg_uint32_t *) (matchlet->mask + i))); + + } + } +#endif + } + + matchlet->next = match->matchlet; + match->matchlet = matchlet; + + + return XDG_MIME_MAGIC_MAGIC; + } + + _xdg_mime_magic_matchlet_free (matchlet); + if (c == EOF) + return XDG_MIME_MAGIC_EOF; + + return XDG_MIME_MAGIC_ERROR; +} + +static int +_xdg_mime_magic_matchlet_compare_to_data (XdgMimeMagicMatchlet *matchlet, + const void *data, + size_t len) +{ + int i, j; + for (i = matchlet->offset; i < matchlet->offset + matchlet->range_length; i++) + { + int valid_matchlet = TRUE; + + if (i + matchlet->value_length > len) + return FALSE; + + if (matchlet->mask) + { + for (j = 0; j < matchlet->value_length; j++) + { + if ((matchlet->value[j] & matchlet->mask[j]) != + ((((unsigned char *) data)[j + i]) & matchlet->mask[j])) + { + valid_matchlet = FALSE; + break; + } + } + } + else + { + for (j = 0; j < matchlet->value_length; j++) + { + if (matchlet->value[j] != ((unsigned char *) data)[j + i]) + { + valid_matchlet = FALSE; + break; + } + } + } + if (valid_matchlet) + return TRUE; + } + return FALSE; +} + +static int +_xdg_mime_magic_matchlet_compare_level (XdgMimeMagicMatchlet *matchlet, + const void *data, + size_t len, + int indent) +{ + while ((matchlet != NULL) && (matchlet->indent == indent)) + { + if (_xdg_mime_magic_matchlet_compare_to_data (matchlet, data, len)) + { + if ((matchlet->next == NULL) || + (matchlet->next->indent <= indent)) + return TRUE; + + if (_xdg_mime_magic_matchlet_compare_level (matchlet->next, + data, + len, + indent + 1)) + return TRUE; + } + + do + { + matchlet = matchlet->next; + } + while (matchlet && matchlet->indent > indent); + } + + return FALSE; +} + +static int +_xdg_mime_magic_match_compare_to_data (XdgMimeMagicMatch *match, + const void *data, + size_t len) +{ + return _xdg_mime_magic_matchlet_compare_level (match->matchlet, data, len, 0); +} + +static void +_xdg_mime_magic_insert_match (XdgMimeMagic *mime_magic, + XdgMimeMagicMatch *match) +{ + XdgMimeMagicMatch *list; + + if (mime_magic->match_list == NULL) + { + mime_magic->match_list = match; + return; + } + + if (match->priority > mime_magic->match_list->priority) + { + match->next = mime_magic->match_list; + mime_magic->match_list = match; + return; + } + + list = mime_magic->match_list; + while (list->next != NULL) + { + if (list->next->priority < match->priority) + { + match->next = list->next; + list->next = match; + return; + } + list = list->next; + } + list->next = match; + match->next = NULL; +} + +XdgMimeMagic * +_xdg_mime_magic_new (void) +{ + return calloc (1, sizeof (XdgMimeMagic)); +} + +void +_xdg_mime_magic_free (XdgMimeMagic *mime_magic) +{ + if (mime_magic) { + _xdg_mime_magic_match_free (mime_magic->match_list); + free (mime_magic); + } +} + +int +_xdg_mime_magic_get_buffer_extents (XdgMimeMagic *mime_magic) +{ + return mime_magic->max_extent; +} + +const char * +_xdg_mime_magic_lookup_data (XdgMimeMagic *mime_magic, + const void *data, + size_t len, + int *result_prio, + const char *mime_types[], + int n_mime_types) +{ + XdgMimeMagicMatch *match; + const char *mime_type; + int n; + int prio; + + prio = 0; + mime_type = NULL; + for (match = mime_magic->match_list; match; match = match->next) + { + if (_xdg_mime_magic_match_compare_to_data (match, data, len)) + { + prio = match->priority; + mime_type = match->mime_type; + break; + } + else + { + for (n = 0; n < n_mime_types; n++) + { + if (mime_types[n] && + _xdg_mime_mime_type_equal (mime_types[n], match->mime_type)) + mime_types[n] = NULL; + } + } + } + + if (mime_type == NULL) + { + for (n = 0; n < n_mime_types; n++) + { + if (mime_types[n]) + mime_type = mime_types[n]; + } + } + + if (result_prio) + *result_prio = prio; + + return mime_type; +} + +static void +_xdg_mime_update_mime_magic_extents (XdgMimeMagic *mime_magic) +{ + XdgMimeMagicMatch *match; + int max_extent = 0; + + for (match = mime_magic->match_list; match; match = match->next) + { + XdgMimeMagicMatchlet *matchlet; + + for (matchlet = match->matchlet; matchlet; matchlet = matchlet->next) + { + int extent; + + extent = matchlet->value_length + matchlet->offset + matchlet->range_length; + if (max_extent < extent) + max_extent = extent; + } + } + + mime_magic->max_extent = max_extent; +} + +static XdgMimeMagicMatchlet * +_xdg_mime_magic_matchlet_mirror (XdgMimeMagicMatchlet *matchlets) +{ + XdgMimeMagicMatchlet *new_list; + XdgMimeMagicMatchlet *tmp; + + if ((matchlets == NULL) || (matchlets->next == NULL)) + return matchlets; + + new_list = NULL; + tmp = matchlets; + while (tmp != NULL) + { + XdgMimeMagicMatchlet *matchlet; + + matchlet = tmp; + tmp = tmp->next; + matchlet->next = new_list; + new_list = matchlet; + } + + return new_list; + +} + +static void +_xdg_mime_magic_read_magic_file (XdgMimeMagic *mime_magic, + FILE *magic_file) +{ + XdgMimeMagicState state; + XdgMimeMagicMatch *match = NULL; /* Quiet compiler */ + + state = XDG_MIME_MAGIC_SECTION; + + while (state != XDG_MIME_MAGIC_EOF) + { + switch (state) + { + case XDG_MIME_MAGIC_SECTION: + match = _xdg_mime_magic_match_new (); + state = _xdg_mime_magic_parse_header (magic_file, match); + if (state == XDG_MIME_MAGIC_EOF || state == XDG_MIME_MAGIC_ERROR) + _xdg_mime_magic_match_free (match); + break; + case XDG_MIME_MAGIC_MAGIC: + state = _xdg_mime_magic_parse_magic_line (magic_file, match); + if (state == XDG_MIME_MAGIC_SECTION || + (state == XDG_MIME_MAGIC_EOF && match->mime_type)) + { + match->matchlet = _xdg_mime_magic_matchlet_mirror (match->matchlet); + _xdg_mime_magic_insert_match (mime_magic, match); + } + else if (state == XDG_MIME_MAGIC_EOF || state == XDG_MIME_MAGIC_ERROR) + _xdg_mime_magic_match_free (match); + break; + case XDG_MIME_MAGIC_ERROR: + state = _xdg_mime_magic_parse_error (magic_file); + break; + case XDG_MIME_MAGIC_EOF: + default: + /* Make the compiler happy */ + assert (0); + } + } + _xdg_mime_update_mime_magic_extents (mime_magic); +} + +void +_xdg_mime_magic_read_from_file (XdgMimeMagic *mime_magic, + const char *file_name) +{ + FILE *magic_file; + char header[12]; + + magic_file = fopen (file_name, "r"); + + if (magic_file == NULL) + return; + + if (fread (header, 1, 12, magic_file) == 12) + { + if (memcmp ("MIME-Magic\0\n", header, 12) == 0) + _xdg_mime_magic_read_magic_file (mime_magic, magic_file); + } + + fclose (magic_file); +} diff --git a/gio/xdgmime/xdgmimemagic.h b/gio/xdgmime/xdgmimemagic.h new file mode 100644 index 0000000..35c8039 --- /dev/null +++ b/gio/xdgmime/xdgmimemagic.h @@ -0,0 +1,57 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimemagic.h: Private file. Datastructure for storing the magic files. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003 Jonathan Blandford + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_MAGIC_H__ +#define __XDG_MIME_MAGIC_H__ + +#include +#include "xdgmime.h" +typedef struct XdgMimeMagic XdgMimeMagic; + +#ifdef XDG_PREFIX +#define _xdg_mime_glob_read_from_file XDG_RESERVED_ENTRY(glob_read_from_file) +#define _xdg_mime_magic_new XDG_RESERVED_ENTRY(magic_new) +#define _xdg_mime_magic_read_from_file XDG_RESERVED_ENTRY(magic_read_from_file) +#define _xdg_mime_magic_free XDG_RESERVED_ENTRY(magic_free) +#define _xdg_mime_magic_get_buffer_extents XDG_RESERVED_ENTRY(magic_get_buffer_extents) +#define _xdg_mime_magic_lookup_data XDG_RESERVED_ENTRY(magic_lookup_data) +#endif + + +XdgMimeMagic *_xdg_mime_magic_new (void); +void _xdg_mime_magic_read_from_file (XdgMimeMagic *mime_magic, + const char *file_name); +void _xdg_mime_magic_free (XdgMimeMagic *mime_magic); +int _xdg_mime_magic_get_buffer_extents (XdgMimeMagic *mime_magic); +const char *_xdg_mime_magic_lookup_data (XdgMimeMagic *mime_magic, + const void *data, + size_t len, + int *result_prio, + const char *mime_types[], + int n_mime_types); + +#endif /* __XDG_MIME_MAGIC_H__ */ diff --git a/gio/xdgmime/xdgmimeparent.c b/gio/xdgmime/xdgmimeparent.c new file mode 100644 index 0000000..52d3c0c --- /dev/null +++ b/gio/xdgmime/xdgmimeparent.c @@ -0,0 +1,219 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimealias.c: Private file. Datastructure for storing the hierarchy. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2004 Red Hat, Inc. + * Copyright (C) 2004 Matthias Clasen + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xdgmimeparent.h" +#include "xdgmimeint.h" +#include +#include +#include +#include +#include + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +typedef struct XdgMimeParents XdgMimeParents; + +struct XdgMimeParents +{ + char *mime; + char **parents; + int n_parents; +}; + +struct XdgParentList +{ + struct XdgMimeParents *parents; + int n_mimes; +}; + +XdgParentList * +_xdg_mime_parent_list_new (void) +{ + XdgParentList *list; + + list = malloc (sizeof (XdgParentList)); + + list->parents = NULL; + list->n_mimes = 0; + + return list; +} + +void +_xdg_mime_parent_list_free (XdgParentList *list) +{ + int i; + char **p; + + if (list->parents) + { + for (i = 0; i < list->n_mimes; i++) + { + for (p = list->parents[i].parents; *p; p++) + free (*p); + + free (list->parents[i].parents); + free (list->parents[i].mime); + } + free (list->parents); + } + free (list); +} + +static int +parent_entry_cmp (const void *v1, const void *v2) +{ + return strcmp (((XdgMimeParents *)v1)->mime, ((XdgMimeParents *)v2)->mime); +} + +const char ** +_xdg_mime_parent_list_lookup (XdgParentList *list, + const char *mime) +{ + XdgMimeParents *entry; + XdgMimeParents key; + + if (list->n_mimes > 0) + { + key.mime = (char *)mime; + key.parents = NULL; + + entry = bsearch (&key, list->parents, list->n_mimes, + sizeof (XdgMimeParents), &parent_entry_cmp); + if (entry) + return (const char **)entry->parents; + } + + return NULL; +} + +void +_xdg_mime_parent_read_from_file (XdgParentList *list, + const char *file_name) +{ + FILE *file; + char line[255]; + int i, alloc; + XdgMimeParents *entry; + + file = fopen (file_name, "r"); + + if (file == NULL) + return; + + /* FIXME: Not UTF-8 safe. Doesn't work if lines are greater than 255 chars. + * Blah */ + alloc = list->n_mimes + 16; + list->parents = realloc (list->parents, alloc * sizeof (XdgMimeParents)); + while (fgets (line, 255, file) != NULL) + { + char *sep; + if (line[0] == '#') + continue; + + sep = strchr (line, ' '); + if (sep == NULL) + continue; + *(sep++) = '\000'; + sep[strlen (sep) -1] = '\000'; + entry = NULL; + for (i = 0; i < list->n_mimes; i++) + { + if (strcmp (list->parents[i].mime, line) == 0) + { + entry = &(list->parents[i]); + break; + } + } + + if (!entry) + { + if (list->n_mimes == alloc) + { + alloc <<= 1; + list->parents = realloc (list->parents, + alloc * sizeof (XdgMimeParents)); + } + list->parents[list->n_mimes].mime = strdup (line); + list->parents[list->n_mimes].parents = NULL; + entry = &(list->parents[list->n_mimes]); + list->n_mimes++; + } + + if (!entry->parents) + { + entry->n_parents = 1; + entry->parents = malloc ((entry->n_parents + 1) * sizeof (char *)); + } + else + { + entry->n_parents += 1; + entry->parents = realloc (entry->parents, + (entry->n_parents + 2) * sizeof (char *)); + } + entry->parents[entry->n_parents - 1] = strdup (sep); + entry->parents[entry->n_parents] = NULL; + } + + list->parents = realloc (list->parents, + list->n_mimes * sizeof (XdgMimeParents)); + + fclose (file); + + if (list->n_mimes > 1) + qsort (list->parents, list->n_mimes, + sizeof (XdgMimeParents), &parent_entry_cmp); +} + + +void +_xdg_mime_parent_list_dump (XdgParentList *list) +{ + int i; + char **p; + + if (list->parents) + { + for (i = 0; i < list->n_mimes; i++) + { + for (p = list->parents[i].parents; *p; p++) + printf ("%s %s\n", list->parents[i].mime, *p); + } + } +} + + diff --git a/gio/xdgmime/xdgmimeparent.h b/gio/xdgmime/xdgmimeparent.h new file mode 100644 index 0000000..b564f41 --- /dev/null +++ b/gio/xdgmime/xdgmimeparent.h @@ -0,0 +1,51 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* xdgmimeparent.h: Private file. Datastructure for storing the hierarchy. + * + * More info can be found at http://www.freedesktop.org/standards/ + * + * Copyright (C) 2004 Red Hat, Inc. + * Copyright (C) 200 Matthias Clasen + * + * Licensed under the Academic Free License version 2.0 + * Or under the following terms: + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __XDG_MIME_PARENT_H__ +#define __XDG_MIME_PARENT_H__ + +#include "xdgmime.h" + +typedef struct XdgParentList XdgParentList; + +#ifdef XDG_PREFIX +#define _xdg_mime_parent_read_from_file XDG_RESERVED_ENTRY(parent_read_from_file) +#define _xdg_mime_parent_list_new XDG_RESERVED_ENTRY(parent_list_new) +#define _xdg_mime_parent_list_free XDG_RESERVED_ENTRY(parent_list_free) +#define _xdg_mime_parent_list_lookup XDG_RESERVED_ENTRY(parent_list_lookup) +#define _xdg_mime_parent_list_dump XDG_RESERVED_ENTRY(parent_list_dump) +#endif + +void _xdg_mime_parent_read_from_file (XdgParentList *list, + const char *file_name); +XdgParentList *_xdg_mime_parent_list_new (void); +void _xdg_mime_parent_list_free (XdgParentList *list); +const char **_xdg_mime_parent_list_lookup (XdgParentList *list, + const char *mime); +void _xdg_mime_parent_list_dump (XdgParentList *list); + +#endif /* __XDG_MIME_PARENT_H__ */ diff --git a/glib-2.0-uninstalled.pc.in b/glib-2.0-uninstalled.pc.in new file mode 100644 index 0000000..0c0e95f --- /dev/null +++ b/glib-2.0-uninstalled.pc.in @@ -0,0 +1,9 @@ +glib_genmarshal=${pc_top_builddir}/${pcfiledir}/gobject/glib-genmarshal +gobject_query=${pc_top_builddir}/${pcfiledir}/gobject/gobject-query +glib_mkenums=${pc_top_builddir}/${pcfiledir}/@srcdir@/gobject/glib-mkenums + +Name: GLib Uninstalled +Description: C Utility Library, Not Installed +Version: @VERSION@ +Libs: ${pc_top_builddir}/${pcfiledir}/glib/libglib-2.0.la +Cflags: -I${pc_top_builddir}/${pcfiledir} -I${pc_top_builddir}/${pcfiledir}/@srcdir@ -I${pc_top_builddir}/${pcfiledir}/@srcdir@/glib diff --git a/glib-2.0.pc.in b/glib-2.0.pc.in new file mode 100644 index 0000000..3d1ac12 --- /dev/null +++ b/glib-2.0.pc.in @@ -0,0 +1,15 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +glib_genmarshal=glib-genmarshal +gobject_query=gobject-query +glib_mkenums=glib-mkenums + +Name: GLib +Description: C Utility Library +Version: @VERSION@ +Libs: -L${libdir} -lglib-2.0 @INTLLIBS@ +Libs.private: @ICONV_LIBS@ +Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include @GLIB_EXTRA_CFLAGS@ diff --git a/glib-gettextize.in b/glib-gettextize.in new file mode 100644 index 0000000..35d01c1 --- /dev/null +++ b/glib-gettextize.in @@ -0,0 +1,188 @@ +#! /bin/sh +# +# Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +# - Modified in October 2001 by jacob berkman to +# work with glib's Makefile.in.in and po2tbl.sed.in, to not copy in +# intl/, and to not add ChangeLog entries to po/ChangeLog + +# This file is meant for authors or maintainers which want to +# internationalize their package with the help of GNU gettext. For +# further information how to use it consult the GNU gettext manual. + +echo=echo +progname=$0 +force=0 +configstatus=0 +origdir=`pwd` +usage="\ +Usage: glib-gettextize [OPTION]... [package-dir] + --help print this help and exit + --version print version information and exit + -c, --copy copy files instead of making symlinks + -f, --force force writing of new files even if old exist +Report bugs to http://bugzilla.gnome.org/." +package=@PACKAGE@ +version=@VERSION@ +try_ln_s=: + +# Directory where the sources are stored. +prefix=@prefix@ +case `uname` in +MINGW32*) + prefix="`dirname $0`/.." + ;; +esac + +datadir=@datadir@ +datarootdir=@datarootdir@ + +gettext_dir=$prefix/share/glib-2.0/gettext + +while test $# -gt 0; do + case "$1" in + -c | --copy | --c* ) + shift + try_ln_s=false ;; + -f | --force | --f* ) + shift + force=1 ;; + -r | --run | --r* ) + shift + configstatus=1 ;; + --help | --h* ) + $echo "$usage"; exit 0 ;; + --version | --v* ) + echo "$progname (GNU $package) $version" + $echo "Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + $echo "Written by" "Ulrich Drepper" + exit 0 ;; + -- ) # Stop option prcessing + shift; break ;; + -* ) + $echo "glib-gettextize: unknown option $1" + $echo "Try \`glib-gettextize --help' for more information."; exit 1 ;; + * ) + break ;; + esac +done + +if test $# -gt 1; then + $echo "$usage" + exit 1 +fi + +# Fill in the command line options value. +if test $# -eq 1; then + srcdir=$1 + if cd "$srcdir"; then + srcdir=`pwd` + else + $echo "Cannot change directory to \`$srcdir'" + exit 1 + fi +else + srcdir=$origdir +fi + +test -f configure.in || test -f configure.ac || { + $echo "Missing configure.in or configure.ac, please cd to your package first." + exit 1 +} + +configure_in=NONE +if test -f configure.in; then + configure_in=configure.in +else + if test -f configure.ac; then + configure_in=configure.ac + fi +fi +# Check in which directory config.rpath, mkinstalldirs etc. belong. +auxdir=`cat "$configure_in" | grep '^AC_CONFIG_AUX_DIR' | sed -n -e 's/AC_CONFIG_AUX_DIR(\([^()]*\))/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q` +if test -n "$auxdir"; then + auxdir="$auxdir/" +fi + +if test -f po/Makefile.in.in && test $force -eq 0; then + $echo "\ +po/Makefile.in.in exists: use option -f if you really want to delete it." + exit 1 +fi + +test -d po || { + $echo "Creating po/ subdirectory" + mkdir po || { + $echo "failed to create po/ subdirectory" + exit 1 + } +} + +# For simplicity we changed to the gettext source directory. +cd $gettext_dir || { + $echo "gettext source directory '${gettext_dir}' doesn't exist" + exit 1 +} + +# Now copy all files. Take care for the destination directories. +for file in *; do + case $file in + intl | po) + ;; + mkinstalldirs) + rm -f "$srcdir/$auxdir$file" + ($try_ln_s && ln -s $gettext_dir/$file "$srcdir/$auxdir$file" && $echo "Symlinking file $file") 2>/dev/null || + { $echo "Copying file $file"; cp $file "$srcdir/$auxdir$file"; } + ;; + *) + rm -f "$srcdir/$file" + ($try_ln_s && ln -s $gettext_dir/$file "$srcdir/$file" && $echo "Symlinking file $file") 2>/dev/null || + { $echo "Copying file $file"; cp $file "$srcdir/$file"; } + ;; + esac +done + +# Copy files to po/ subdirectory. +cd po +for file in *; do + rm -f "$srcdir/po/$file" + ($try_ln_s && ln -s $gettext_dir/po/$file "$srcdir/po/$file" && $echo "Symlinking file po/$file") 2>/dev/null || + { $echo "Copying file po/$file"; cp $file "$srcdir/po/$file"; } +done +if test -f "$srcdir/po/cat-id-tbl.c"; then + $echo "Removing po/cat-id-tbl.c" + rm -f "$srcdir/po/cat-id-tbl.c" +fi +if test -f "$srcdir/po/stamp-cat-id"; then + $echo "Removing po/stamp-cat-id" + rm -f "$srcdir/po/stamp-cat-id" +fi + +echo +echo "Please add the files" +echo " codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 lcmessage.m4" +echo " progtest.m4" +echo "from the $datadir/aclocal directory to your autoconf macro directory" +echo "or directly to your aclocal.m4 file." +echo "You will also need config.guess and config.sub, which you can get from" +echo "ftp://ftp.gnu.org/pub/gnu/config/." +echo + +exit 0 diff --git a/glib-zip.in b/glib-zip.in new file mode 100755 index 0000000..859a06a --- /dev/null +++ b/glib-zip.in @@ -0,0 +1,76 @@ +#!/bin/sh + +# Build zipfiles for GLib on Win32: Separate runtime and developer ones. +# After running make install, run this. + +ZIP=/tmp/glib-@GLIB_VERSION@.zip +DEVZIP=/tmp/glib-dev-@GLIB_VERSION@.zip + +cd @prefix@ + +mkdir -p share/doc/glib-@GLIB_VERSION@ +cp -p @abs_srcdir@/COPYING share/doc/glib-@GLIB_VERSION@ + +mkdir -p share/doc/glib-dev-@GLIB_VERSION@ +cp -p @abs_srcdir@/COPYING share/doc/glib-dev-@GLIB_VERSION@ + +if test @LIB_EXE_MACHINE_FLAG@ = X64; then + helperbits=64 +else + helperbits=32 +fi + +rm $ZIP +zip $ZIP -@ < glib.def + +galias.h: $(srcdir)/makegalias.pl glib.symbols + $(PERL) $(srcdir)/makegalias.pl < $(srcdir)/glib.symbols > galias.h + +galiasdef.c: $(srcdir)/makegalias.pl glib.symbols + $(PERL) $(srcdir)/makegalias.pl -def < $(srcdir)/glib.symbols > galiasdef.c + +if OS_LINUX +if HAVE_GNUC_VISIBILITY +TESTS_ENVIRONMENT = GLIB_DEBUG_FLAGS="$(GLIB_DEBUG_FLAGS)" +TESTS = abicheck.sh pltcheck.sh +endif +endif + +BUILT_SOURCES = galias.h galiasdef.c + +MIRRORING_TAB_SOURCE = \ + glib-mirroring-tab/Makefile \ + glib-mirroring-tab/gen-mirroring-tab.c \ + glib-mirroring-tab/packtab.h \ + glib-mirroring-tab/packtab.c + +# The compilation of GRegex can be disabled, but the source files must +# be distributed. +EXTRA_DIST += \ + makefile.msc.in \ + glib.rc.in \ + gen-unicode-tables.pl \ + gen-script-table.pl \ + makegalias.pl \ + abicheck.sh \ + pltcheck.sh \ + glib.symbols \ + gregex.c \ + gregex.h \ + win_iconv.c \ + libglib-gdb.py.in \ + $(MIRRORING_TAB_SOURCE) + +# These may be in the builddir too +BUILT_EXTRA_DIST = \ + makefile.msc \ + glib.rc \ + galias.h \ + galiasdef.c + +lib_LTLIBRARIES = libglib-2.0.la + +if OS_WIN32_AND_DLL_COMPILATION +if MS_LIB_AVAILABLE +noinst_DATA = glib-2.0.lib + +install_ms_lib_cmd = $(INSTALL) glib-2.0.lib $(DESTDIR)$(libdir) +uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/glib-2.0.lib +endif +endif + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +libglib_2_0_la_SOURCES = \ + garray.c \ + gasyncqueue.c \ + $(gatomic_c) \ + gbacktrace.c \ + gbase64.c \ + gbitlock.c \ + gbookmarkfile.c \ + gbsearcharray.h \ + gbuffer.c \ + gbuffer.h \ + gcache.c \ + gchecksum.c \ + gcompletion.c \ + gconvert.c \ + gdataset.c \ + gdatasetprivate.h \ + gdate.c \ + gdir.c \ + gerror.c \ + gfileutils.c \ + ghash.c \ + ghook.c \ + ghostutils.c \ + giochannel.c \ + gkeyfile.c \ + glibintl.h \ + glist.c \ + gmain.c \ + gmappedfile.c \ + gmarkup.c \ + gmem.c \ + gmessages.c \ + gmirroringtable.h \ + gnode.c \ + goption.c \ + gpattern.c \ + gpoll.c \ + gprimes.c \ + gqsort.c \ + gqueue.c \ + grel.c \ + grand.c \ + $(gregex_c) \ + gscanner.c \ + gscripttable.h \ + gsequence.c \ + gshell.c \ + gslice.c \ + gslist.c \ + gstdio.c \ + gstrfuncs.c \ + gstring.c \ + gtestutils.c \ + gthread.c \ + gthreadprivate.h \ + gthreadpool.c \ + gtimer.c \ + gtree.c \ + guniprop.c \ + gutf8.c \ + gunibreak.h \ + gunibreak.c \ + gunichartables.h \ + gunicollate.c \ + gunicomp.h \ + gunidecomp.h \ + gunidecomp.c \ + gunicodeprivate.h \ + gurifuncs.c \ + gutils.c \ + gvariant.h \ + gvariant.c \ + gvariant-core.h \ + gvariant-core.c \ + gvariant-internal.h \ + gvariant-parser.c \ + gvariant-serialiser.h \ + gvariant-serialiser.c \ + gvarianttypeinfo.h \ + gvarianttypeinfo.c \ + gvarianttype.c \ + gdebug.h \ + gprintf.c \ + gprintfint.h + + +EXTRA_libglib_2_0_la_SOURCES = \ + giounix.c \ + giowin32.c \ + gspawn.c \ + gspawn-win32.c \ + gwin32.c + +glibincludedir=$(includedir)/glib-2.0 +glibinclude_HEADERS = \ + glib-object.h \ + glib.h + +glibsubincludedir=$(includedir)/glib-2.0/glib +glibsubinclude_HEADERS = \ + galloca.h \ + garray.h \ + gasyncqueue.h \ + gatomic.h \ + gbacktrace.h \ + gbase64.h \ + gbitlock.h \ + gbookmarkfile.h \ + gcache.h \ + gchecksum.h \ + gcompletion.h \ + gconvert.h \ + gdataset.h \ + gdate.h \ + gdir.h \ + gerror.h \ + gfileutils.h \ + ghash.h \ + ghook.h \ + ghostutils.h \ + gi18n.h \ + gi18n-lib.h \ + giochannel.h \ + gkeyfile.h \ + glist.h \ + gmacros.h \ + gmain.h \ + gmappedfile.h \ + gmarkup.h \ + gmem.h \ + gmessages.h \ + gnode.h \ + goption.h \ + gpattern.h \ + gpoll.h \ + gprimes.h \ + gqsort.h \ + gquark.h \ + gqueue.h \ + grand.h \ + $(gregex_h) \ + grel.h \ + gscanner.h \ + gsequence.h \ + gshell.h \ + gslice.h \ + gslist.h \ + gspawn.h \ + gstdio.h \ + gstrfuncs.h \ + gtestutils.h \ + gstring.h \ + gthread.h \ + gthreadpool.h \ + gtimer.h \ + gtree.h \ + gtypes.h \ + gunicode.h \ + gurifuncs.h \ + gutils.h \ + gvarianttype.h \ + gvariant.h \ + gwin32.h \ + gprintf.h + +install-data-local: install-ms-lib install-def-file + @if test -f $(glibincludedir)/glist.h ; then \ + echo "*** Old headers found in $(glibincludedir). You should remove the" ; \ + echo "*** contents of this directory and type 'make install' again." ; \ + false ; \ + fi + +uninstall-local: uninstall-ms-lib uninstall-def-file + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +export_symbols = -export-symbols glib.def + +glib_win32_res = glib-win32-res.o +glib_win32_res_ldflag = -Wl,$(glib_win32_res) + +glib_def = glib.def + +install-def-file: + $(INSTALL) glib.def $(DESTDIR)$(libdir)/glib-2.0.def + +uninstall-def-file: + -rm $(DESTDIR)$(libdir)/glib-2.0.def +else +install-def-file: +uninstall-def-file: + +export_symbols = $(LIBTOOL_EXPORT_OPTIONS) +endif + +if ENABLE_REGEX +if USE_SYSTEM_PCRE +pcre_lib = $(PCRE_LIBS) +pcre_inc = $(PCRE_CFLAGS) +else +pcre_lib = pcre/libpcre.la +pcre_inc = +endif +else +pcre_lib = +pcre_inc = +endif + +libglib_2_0_la_LIBADD = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ $(pcre_lib) +libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ $(glib_win32_res) $(glib_def) + +libglib_2_0_la_LDFLAGS = \ + $(glib_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +INSTALL_PROGS= + +gspawn-win32-helper-console.c: + echo '#define HELPER_CONSOLE' >$@ + echo '#include "gspawn-win32-helper.c"' >>$@ + +gspawn-win64-helper.c: + echo '#include "gspawn-win32-helper.c"' >$@ + +gspawn-win64-helper-console.c: + echo '#define HELPER_CONSOLE' >$@ + echo '#include "gspawn-win32-helper.c"' >>$@ + +if OS_WIN32 +if OS_WIN32_X64 +INSTALL_PROGS += gspawn-win64-helper gspawn-win64-helper-console +gspawn_win64_helper_LDADD = libglib-2.0.la +gspawn_win64_helper_LDFLAGS = -mwindows +gspawn_win64_helper_console_LDADD = libglib-2.0.la +else +INSTALL_PROGS += gspawn-win32-helper gspawn-win32-helper-console +gspawn_win32_helper_LDADD = libglib-2.0.la +gspawn_win32_helper_LDFLAGS = -mwindows +gspawn_win32_helper_console_LDADD = libglib-2.0.la +endif +endif + +glib-win32-res.o: glib.rc + $(WINDRES) glib.rc $@ + +bin_PROGRAMS = ${INSTALL_PROGS} + +if OS_UNIX + +INSTALL_PROGS += gtester +gtester_SOURCES = gtester.c +gtester_LDADD = libglib-2.0.la + +auto_config_binscripts = gtester-report +bin_SCRIPTS = ${auto_config_binscripts} +EXTRA_DIST += ${auto_config_binscripts} + +CONFIGVARS = \ + "bindir" : "${bindir}", \ + "glib-version" : "${GLIB_VERSION}" + +install-exec-hook: + for sf in ${auto_config_binscripts} ; do \ + mv -f "$(DESTDIR)$(bindir)/$$sf" "$(DESTDIR)$(bindir)/$$sf".tmp \ + && sed < "$(DESTDIR)$(bindir)/$$sf".tmp > "$(DESTDIR)$(bindir)/$$sf" \ + -e '1,24s|^ *#@PKGINSTALL_CONFIGVARS_IN24LINES@| ${CONFIGVARS}|' \ + -e '1,1s|#! /usr/bin/env python\([0-9]\+\(\.[0-9]\+\)\?\)\?|#!${PYTHON}|' \ + || exit $$? ; \ + rm -f "$(DESTDIR)$(bindir)/$$sf".tmp ; \ + done + +endif + +glib-2.0.lib: libglib-2.0.la glib.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libglib-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:glib.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/glib.vcproj + 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 + +../build/win32/vs9/glib.vcproj: $(top_srcdir)/build/win32/vs9/glib.vcprojin + for F in $(libglib_2_0_la_SOURCES); do \ + case $$F in \ + *-gcc.c) \ + ;; \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libglib.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/glib.vcprojin >$@ + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f libglib-gdb.py; \ + fi + +# install gdb scripts +gdbdir = $(datadir)/glib-2.0/gdb +dist_gdb_SCRIPTS = glib.py + +libglib-gdb.py: libglib-gdb.py.in + sed -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libglib-gdb.py.in > libglib-gdb.py + + +install-data-hook: libglib-gdb.py + mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR) + $(INSTALL) libglib-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR)/libglib-2.0.so.0.$(LT_CURRENT).$(LT_REVISION)-gdb.py +if HAVE_GLIB_RUNTIME_LIBDIR + mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libglib-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libglib-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + rm -f $(DESTDIR)$(libdir)/libglib-2.0.so + ln -s $(GLIB_RUNTIME_LIBDIR)/libglib-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libglib-2.0.so +endif diff --git a/glib/Makefile.in b/glib/Makefile.in new file mode 100644 index 0000000..2e55684 --- /dev/null +++ b/glib/Makefile.in @@ -0,0 +1,1672 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + + + + +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@ +DIST_COMMON = $(am__glibsubinclude_HEADERS_DIST) $(dist_gdb_SCRIPTS) \ + $(glibinclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/glib.rc.in \ + $(srcdir)/makefile.msc.in $(top_srcdir)/Makefile.decl +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@am__append_1 = gspawn-win64-helper gspawn-win64-helper-console +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@am__append_2 = gspawn-win32-helper gspawn-win32-helper-console +bin_PROGRAMS = $(am__EXEEXT_4) +@OS_UNIX_TRUE@am__append_3 = gtester +@OS_UNIX_TRUE@am__append_4 = ${auto_config_binscripts} +subdir = glib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = makefile.msc glib.rc +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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gdbdir)" \ + "$(DESTDIR)$(glibincludedir)" "$(DESTDIR)$(glibsubincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_FALSE@am__DEPENDENCIES_2 = \ +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_FALSE@ pcre/libpcre.la +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +am__libglib_2_0_la_SOURCES_DIST = garray.c gasyncqueue.c gatomic.c \ + gatomic-gcc.c gbacktrace.c gbase64.c gbitlock.c \ + gbookmarkfile.c gbsearcharray.h gbuffer.c gbuffer.h gcache.c \ + gchecksum.c gcompletion.c gconvert.c gdataset.c \ + gdatasetprivate.h gdate.c gdir.c gerror.c gfileutils.c ghash.c \ + ghook.c ghostutils.c giochannel.c gkeyfile.c glibintl.h \ + glist.c gmain.c gmappedfile.c gmarkup.c gmem.c gmessages.c \ + gmirroringtable.h gnode.c goption.c gpattern.c gpoll.c \ + gprimes.c gqsort.c gqueue.c grel.c grand.c gregex.c gscanner.c \ + gscripttable.h gsequence.c gshell.c gslice.c gslist.c gstdio.c \ + gstrfuncs.c gstring.c gtestutils.c gthread.c gthreadprivate.h \ + gthreadpool.c gtimer.c gtree.c guniprop.c gutf8.c gunibreak.h \ + gunibreak.c gunichartables.h gunicollate.c gunicomp.h \ + gunidecomp.h gunidecomp.c gunicodeprivate.h gurifuncs.c \ + gutils.c gvariant.h gvariant.c gvariant-core.h gvariant-core.c \ + gvariant-internal.h gvariant-parser.c gvariant-serialiser.h \ + gvariant-serialiser.c gvarianttypeinfo.h gvarianttypeinfo.c \ + gvarianttype.c gdebug.h gprintf.c gprintfint.h +@HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE@am__objects_1 = \ +@HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE@ gatomic.lo +@HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE@am__objects_1 = \ +@HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE@ gatomic-gcc.lo +@ENABLE_REGEX_TRUE@am__objects_2 = gregex.lo +am_libglib_2_0_la_OBJECTS = garray.lo gasyncqueue.lo $(am__objects_1) \ + gbacktrace.lo gbase64.lo gbitlock.lo gbookmarkfile.lo \ + gbuffer.lo gcache.lo gchecksum.lo gcompletion.lo gconvert.lo \ + gdataset.lo gdate.lo gdir.lo gerror.lo gfileutils.lo ghash.lo \ + ghook.lo ghostutils.lo giochannel.lo gkeyfile.lo glist.lo \ + gmain.lo gmappedfile.lo gmarkup.lo gmem.lo gmessages.lo \ + gnode.lo goption.lo gpattern.lo gpoll.lo gprimes.lo gqsort.lo \ + gqueue.lo grel.lo grand.lo $(am__objects_2) gscanner.lo \ + gsequence.lo gshell.lo gslice.lo gslist.lo gstdio.lo \ + gstrfuncs.lo gstring.lo gtestutils.lo gthread.lo \ + gthreadpool.lo gtimer.lo gtree.lo guniprop.lo gutf8.lo \ + gunibreak.lo gunicollate.lo gunidecomp.lo gurifuncs.lo \ + gutils.lo gvariant.lo gvariant-core.lo gvariant-parser.lo \ + gvariant-serialiser.lo gvarianttypeinfo.lo gvarianttype.lo \ + gprintf.lo +libglib_2_0_la_OBJECTS = $(am_libglib_2_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libglib_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libglib_2_0_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@am__EXEEXT_1 = gspawn-win64-helper$(EXEEXT) \ +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@ gspawn-win64-helper-console$(EXEEXT) +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@am__EXEEXT_2 = gspawn-win32-helper$(EXEEXT) \ +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@ gspawn-win32-helper-console$(EXEEXT) +@OS_UNIX_TRUE@am__EXEEXT_3 = gtester$(EXEEXT) +am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) +PROGRAMS = $(bin_PROGRAMS) +gspawn_win32_helper_SOURCES = gspawn-win32-helper.c +gspawn_win32_helper_OBJECTS = gspawn-win32-helper.$(OBJEXT) +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@gspawn_win32_helper_DEPENDENCIES = \ +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@ libglib-2.0.la +gspawn_win32_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(gspawn_win32_helper_LDFLAGS) \ + $(LDFLAGS) -o $@ +gspawn_win32_helper_console_SOURCES = gspawn-win32-helper-console.c +gspawn_win32_helper_console_OBJECTS = \ + gspawn-win32-helper-console.$(OBJEXT) +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@gspawn_win32_helper_console_DEPENDENCIES = \ +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@ libglib-2.0.la +gspawn_win64_helper_SOURCES = gspawn-win64-helper.c +gspawn_win64_helper_OBJECTS = gspawn-win64-helper.$(OBJEXT) +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@gspawn_win64_helper_DEPENDENCIES = \ +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@ libglib-2.0.la +gspawn_win64_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(gspawn_win64_helper_LDFLAGS) \ + $(LDFLAGS) -o $@ +gspawn_win64_helper_console_SOURCES = gspawn-win64-helper-console.c +gspawn_win64_helper_console_OBJECTS = \ + gspawn-win64-helper-console.$(OBJEXT) +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@gspawn_win64_helper_console_DEPENDENCIES = \ +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@ libglib-2.0.la +am__gtester_SOURCES_DIST = gtester.c +@OS_UNIX_TRUE@am_gtester_OBJECTS = gtester.$(OBJEXT) +gtester_OBJECTS = $(am_gtester_OBJECTS) +@OS_UNIX_TRUE@gtester_DEPENDENCIES = libglib-2.0.la +SCRIPTS = $(bin_SCRIPTS) $(dist_gdb_SCRIPTS) +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libglib_2_0_la_SOURCES) $(EXTRA_libglib_2_0_la_SOURCES) \ + gspawn-win32-helper.c gspawn-win32-helper-console.c \ + gspawn-win64-helper.c gspawn-win64-helper-console.c \ + $(gtester_SOURCES) +DIST_SOURCES = $(am__libglib_2_0_la_SOURCES_DIST) \ + $(EXTRA_libglib_2_0_la_SOURCES) gspawn-win32-helper.c \ + gspawn-win32-helper-console.c gspawn-win64-helper.c \ + gspawn-win64-helper-console.c $(am__gtester_SOURCES_DIST) +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 +DATA = $(noinst_DATA) +am__glibsubinclude_HEADERS_DIST = galloca.h garray.h gasyncqueue.h \ + gatomic.h gbacktrace.h gbase64.h gbitlock.h gbookmarkfile.h \ + gcache.h gchecksum.h gcompletion.h gconvert.h gdataset.h \ + gdate.h gdir.h gerror.h gfileutils.h ghash.h ghook.h \ + ghostutils.h gi18n.h gi18n-lib.h giochannel.h gkeyfile.h \ + glist.h gmacros.h gmain.h gmappedfile.h gmarkup.h gmem.h \ + gmessages.h gnode.h goption.h gpattern.h gpoll.h gprimes.h \ + gqsort.h gquark.h gqueue.h grand.h gregex.h grel.h gscanner.h \ + gsequence.h gshell.h gslice.h gslist.h gspawn.h gstdio.h \ + gstrfuncs.h gtestutils.h gstring.h gthread.h gthreadpool.h \ + gtimer.h gtree.h gtypes.h gunicode.h gurifuncs.h gutils.h \ + gvarianttype.h gvariant.h gwin32.h gprintf.h +HEADERS = $(glibinclude_HEADERS) $(glibsubinclude_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 +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending + +# The compilation of GRegex can be disabled, but the source files must +# be distributed. +EXTRA_DIST = makefile.msc.in glib.rc.in gen-unicode-tables.pl \ + gen-script-table.pl makegalias.pl abicheck.sh pltcheck.sh \ + glib.symbols gregex.c gregex.h win_iconv.c libglib-gdb.py.in \ + $(MIRRORING_TAB_SOURCE) $(am__append_4) +TEST_PROGS = +@HAVE_GOOD_PRINTF_FALSE@PRINTF_SUBDIR = gnulib +@HAVE_GOOD_PRINTF_FALSE@printf_la = gnulib/libgnulib.la +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_FALSE@MAYBE_PCRE = pcre +@ENABLE_REGEX_FALSE@gregex_c = +@ENABLE_REGEX_TRUE@gregex_c = gregex.c +@ENABLE_REGEX_FALSE@gregex_h = +@ENABLE_REGEX_TRUE@gregex_h = gregex.h +@HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_FALSE@gatomic_c = gatomic.c +@HAVE_GCC_BUILTINS_FOR_ATOMIC_OPERATIONS_TRUE@gatomic_c = gatomic-gcc.c +SUBDIRS = libcharset $(PRINTF_SUBDIR) $(MAYBE_PCRE) update-pcre . tests +DIST_SUBDIRS = libcharset gnulib pcre update-pcre tests +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + $(pcre_inc) \ + -DG_LOG_DOMAIN=\"GLib\" \ + $(GLIB_DEBUG_FLAGS) \ + -DG_DISABLE_DEPRECATED \ + -DGLIB_COMPILATION \ + -DPCRE_STATIC + +@HAVE_GNUC_VISIBILITY_TRUE@@OS_LINUX_TRUE@TESTS_ENVIRONMENT = GLIB_DEBUG_FLAGS="$(GLIB_DEBUG_FLAGS)" +@HAVE_GNUC_VISIBILITY_TRUE@@OS_LINUX_TRUE@TESTS = abicheck.sh pltcheck.sh +BUILT_SOURCES = galias.h galiasdef.c +MIRRORING_TAB_SOURCE = \ + glib-mirroring-tab/Makefile \ + glib-mirroring-tab/gen-mirroring-tab.c \ + glib-mirroring-tab/packtab.h \ + glib-mirroring-tab/packtab.c + + +# These may be in the builddir too +BUILT_EXTRA_DIST = \ + makefile.msc \ + glib.rc \ + galias.h \ + galiasdef.c + +lib_LTLIBRARIES = libglib-2.0.la +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@noinst_DATA = glib-2.0.lib +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@install_ms_lib_cmd = $(INSTALL) glib-2.0.lib $(DESTDIR)$(libdir) +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/glib-2.0.lib +libglib_2_0_la_SOURCES = \ + garray.c \ + gasyncqueue.c \ + $(gatomic_c) \ + gbacktrace.c \ + gbase64.c \ + gbitlock.c \ + gbookmarkfile.c \ + gbsearcharray.h \ + gbuffer.c \ + gbuffer.h \ + gcache.c \ + gchecksum.c \ + gcompletion.c \ + gconvert.c \ + gdataset.c \ + gdatasetprivate.h \ + gdate.c \ + gdir.c \ + gerror.c \ + gfileutils.c \ + ghash.c \ + ghook.c \ + ghostutils.c \ + giochannel.c \ + gkeyfile.c \ + glibintl.h \ + glist.c \ + gmain.c \ + gmappedfile.c \ + gmarkup.c \ + gmem.c \ + gmessages.c \ + gmirroringtable.h \ + gnode.c \ + goption.c \ + gpattern.c \ + gpoll.c \ + gprimes.c \ + gqsort.c \ + gqueue.c \ + grel.c \ + grand.c \ + $(gregex_c) \ + gscanner.c \ + gscripttable.h \ + gsequence.c \ + gshell.c \ + gslice.c \ + gslist.c \ + gstdio.c \ + gstrfuncs.c \ + gstring.c \ + gtestutils.c \ + gthread.c \ + gthreadprivate.h \ + gthreadpool.c \ + gtimer.c \ + gtree.c \ + guniprop.c \ + gutf8.c \ + gunibreak.h \ + gunibreak.c \ + gunichartables.h \ + gunicollate.c \ + gunicomp.h \ + gunidecomp.h \ + gunidecomp.c \ + gunicodeprivate.h \ + gurifuncs.c \ + gutils.c \ + gvariant.h \ + gvariant.c \ + gvariant-core.h \ + gvariant-core.c \ + gvariant-internal.h \ + gvariant-parser.c \ + gvariant-serialiser.h \ + gvariant-serialiser.c \ + gvarianttypeinfo.h \ + gvarianttypeinfo.c \ + gvarianttype.c \ + gdebug.h \ + gprintf.c \ + gprintfint.h + +EXTRA_libglib_2_0_la_SOURCES = \ + giounix.c \ + giowin32.c \ + gspawn.c \ + gspawn-win32.c \ + gwin32.c + +glibincludedir = $(includedir)/glib-2.0 +glibinclude_HEADERS = \ + glib-object.h \ + glib.h + +glibsubincludedir = $(includedir)/glib-2.0/glib +glibsubinclude_HEADERS = \ + galloca.h \ + garray.h \ + gasyncqueue.h \ + gatomic.h \ + gbacktrace.h \ + gbase64.h \ + gbitlock.h \ + gbookmarkfile.h \ + gcache.h \ + gchecksum.h \ + gcompletion.h \ + gconvert.h \ + gdataset.h \ + gdate.h \ + gdir.h \ + gerror.h \ + gfileutils.h \ + ghash.h \ + ghook.h \ + ghostutils.h \ + gi18n.h \ + gi18n-lib.h \ + giochannel.h \ + gkeyfile.h \ + glist.h \ + gmacros.h \ + gmain.h \ + gmappedfile.h \ + gmarkup.h \ + gmem.h \ + gmessages.h \ + gnode.h \ + goption.h \ + gpattern.h \ + gpoll.h \ + gprimes.h \ + gqsort.h \ + gquark.h \ + gqueue.h \ + grand.h \ + $(gregex_h) \ + grel.h \ + gscanner.h \ + gsequence.h \ + gshell.h \ + gslice.h \ + gslist.h \ + gspawn.h \ + gstdio.h \ + gstrfuncs.h \ + gtestutils.h \ + gstring.h \ + gthread.h \ + gthreadpool.h \ + gtimer.h \ + gtree.h \ + gtypes.h \ + gunicode.h \ + gurifuncs.h \ + gutils.h \ + gvarianttype.h \ + gvariant.h \ + gwin32.h \ + gprintf.h + +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +@OS_WIN32_AND_DLL_COMPILATION_FALSE@export_symbols = $(LIBTOOL_EXPORT_OPTIONS) +@OS_WIN32_AND_DLL_COMPILATION_TRUE@export_symbols = -export-symbols glib.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@glib_win32_res = glib-win32-res.o +@OS_WIN32_AND_DLL_COMPILATION_TRUE@glib_win32_res_ldflag = -Wl,$(glib_win32_res) +@OS_WIN32_AND_DLL_COMPILATION_TRUE@glib_def = glib.def +@ENABLE_REGEX_FALSE@pcre_lib = +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_FALSE@pcre_lib = pcre/libpcre.la +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_TRUE@pcre_lib = $(PCRE_LIBS) +@ENABLE_REGEX_FALSE@pcre_inc = +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_FALSE@pcre_inc = +@ENABLE_REGEX_TRUE@@USE_SYSTEM_PCRE_TRUE@pcre_inc = $(PCRE_CFLAGS) +libglib_2_0_la_LIBADD = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ $(pcre_lib) +libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ $(glib_win32_res) $(glib_def) +libglib_2_0_la_LDFLAGS = \ + $(glib_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +INSTALL_PROGS = $(am__append_1) $(am__append_2) $(am__append_3) +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@gspawn_win64_helper_LDADD = libglib-2.0.la +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@gspawn_win64_helper_LDFLAGS = -mwindows +@OS_WIN32_TRUE@@OS_WIN32_X64_TRUE@gspawn_win64_helper_console_LDADD = libglib-2.0.la +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@gspawn_win32_helper_LDADD = libglib-2.0.la +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@gspawn_win32_helper_LDFLAGS = -mwindows +@OS_WIN32_TRUE@@OS_WIN32_X64_FALSE@gspawn_win32_helper_console_LDADD = libglib-2.0.la +@OS_UNIX_TRUE@gtester_SOURCES = gtester.c +@OS_UNIX_TRUE@gtester_LDADD = libglib-2.0.la +@OS_UNIX_TRUE@auto_config_binscripts = gtester-report +@OS_UNIX_TRUE@bin_SCRIPTS = ${auto_config_binscripts} +@OS_UNIX_TRUE@CONFIGVARS = \ +@OS_UNIX_TRUE@ "bindir" : "${bindir}", \ +@OS_UNIX_TRUE@ "glib-version" : "${GLIB_VERSION}" + + +# install gdb scripts +gdbdir = $(datadir)/glib-2.0/gdb +dist_gdb_SCRIPTS = glib.py +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu glib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu glib/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): +makefile.msc: $(top_builddir)/config.status $(srcdir)/makefile.msc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +glib.rc: $(top_builddir)/config.status $(srcdir)/glib.rc.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 +libglib-2.0.la: $(libglib_2_0_la_OBJECTS) $(libglib_2_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libglib_2_0_la_LINK) -rpath $(libdir) $(libglib_2_0_la_OBJECTS) $(libglib_2_0_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_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 +gspawn-win32-helper$(EXEEXT): $(gspawn_win32_helper_OBJECTS) $(gspawn_win32_helper_DEPENDENCIES) + @rm -f gspawn-win32-helper$(EXEEXT) + $(AM_V_CCLD)$(gspawn_win32_helper_LINK) $(gspawn_win32_helper_OBJECTS) $(gspawn_win32_helper_LDADD) $(LIBS) +gspawn-win32-helper-console$(EXEEXT): $(gspawn_win32_helper_console_OBJECTS) $(gspawn_win32_helper_console_DEPENDENCIES) + @rm -f gspawn-win32-helper-console$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gspawn_win32_helper_console_OBJECTS) $(gspawn_win32_helper_console_LDADD) $(LIBS) +gspawn-win64-helper$(EXEEXT): $(gspawn_win64_helper_OBJECTS) $(gspawn_win64_helper_DEPENDENCIES) + @rm -f gspawn-win64-helper$(EXEEXT) + $(AM_V_CCLD)$(gspawn_win64_helper_LINK) $(gspawn_win64_helper_OBJECTS) $(gspawn_win64_helper_LDADD) $(LIBS) +gspawn-win64-helper-console$(EXEEXT): $(gspawn_win64_helper_console_OBJECTS) $(gspawn_win64_helper_console_DEPENDENCIES) + @rm -f gspawn-win64-helper-console$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gspawn_win64_helper_console_OBJECTS) $(gspawn_win64_helper_console_LDADD) $(LIBS) +gtester$(EXEEXT): $(gtester_OBJECTS) $(gtester_DEPENDENCIES) + @rm -f gtester$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gtester_OBJECTS) $(gtester_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files +install-dist_gdbSCRIPTS: $(dist_gdb_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(gdbdir)" || $(MKDIR_P) "$(DESTDIR)$(gdbdir)" + @list='$(dist_gdb_SCRIPTS)'; test -n "$(gdbdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(gdbdir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(gdbdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-dist_gdbSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_gdb_SCRIPTS)'; test -n "$(gdbdir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(gdbdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gdbdir)" && rm -f $$files + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/garray.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gasyncqueue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gatomic-gcc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gatomic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbacktrace.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbase64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbitlock.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbookmarkfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbuffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gchecksum.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gcompletion.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gconvert.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdataset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdir.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gerror.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfileutils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghook.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghostutils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/giochannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/giounix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/giowin32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gkeyfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmain.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmappedfile.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmarkup.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmessages.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/goption.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpattern.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpoll.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gprimes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gprintf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gqsort.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gqueue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grand.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gregex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gscanner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsequence.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gshell.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gslice.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gslist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gspawn-win32-helper-console.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gspawn-win32-helper.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gspawn-win32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gspawn-win64-helper-console.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gspawn-win64-helper.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gspawn.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstdio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstrfuncs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstring.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtester.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtestutils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gthread.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gthreadpool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtimer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunibreak.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunicollate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gunidecomp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guniprop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gurifuncs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gutf8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gutils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvariant-core.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvariant-parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvariant-serialiser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvariant.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvarianttype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvarianttypeinfo.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gwin32.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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-glibincludeHEADERS: $(glibinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(glibincludedir)" || $(MKDIR_P) "$(DESTDIR)$(glibincludedir)" + @list='$(glibinclude_HEADERS)'; test -n "$(glibincludedir)" || 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)$(glibincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(glibincludedir)" || exit $$?; \ + done + +uninstall-glibincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(glibinclude_HEADERS)'; test -n "$(glibincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(glibincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(glibincludedir)" && rm -f $$files +install-glibsubincludeHEADERS: $(glibsubinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(glibsubincludedir)" || $(MKDIR_P) "$(DESTDIR)$(glibsubincludedir)" + @list='$(glibsubinclude_HEADERS)'; test -n "$(glibsubincludedir)" || 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)$(glibsubincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(glibsubincludedir)" || exit $$?; \ + done + +uninstall-glibsubincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(glibsubinclude_HEADERS)'; test -n "$(glibsubincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(glibsubincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(glibsubincludedir)" && rm -f $$files + +# 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 + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ + $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gdbdir)" "$(DESTDIR)$(glibincludedir)" "$(DESTDIR)$(glibsubincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@OS_UNIX_FALSE@install-exec-hook: +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-data-local install-dist_gdbSCRIPTS \ + install-glibincludeHEADERS install-glibsubincludeHEADERS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS \ + install-libLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +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-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-dist_gdbSCRIPTS uninstall-glibincludeHEADERS \ + uninstall-glibsubincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + check-am ctags-recursive install install-am install-data-am \ + install-exec-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-TESTS check-am check-local clean \ + clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool ctags ctags-recursive dist-hook distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local distclean-tags distdir dvi dvi-am html html-am \ + info info-am install install-am install-binPROGRAMS \ + install-binSCRIPTS install-data install-data-am \ + install-data-hook install-data-local install-dist_gdbSCRIPTS \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-exec-hook install-glibincludeHEADERS \ + install-glibsubincludeHEADERS 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-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-dist_gdbSCRIPTS uninstall-glibincludeHEADERS \ + uninstall-glibsubincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +glib.def: glib.symbols + (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/glib.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g') > glib.def + +galias.h: $(srcdir)/makegalias.pl glib.symbols + $(PERL) $(srcdir)/makegalias.pl < $(srcdir)/glib.symbols > galias.h + +galiasdef.c: $(srcdir)/makegalias.pl glib.symbols + $(PERL) $(srcdir)/makegalias.pl -def < $(srcdir)/glib.symbols > galiasdef.c + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +install-data-local: install-ms-lib install-def-file + @if test -f $(glibincludedir)/glist.h ; then \ + echo "*** Old headers found in $(glibincludedir). You should remove the" ; \ + echo "*** contents of this directory and type 'make install' again." ; \ + false ; \ + fi + +uninstall-local: uninstall-ms-lib uninstall-def-file + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ $(INSTALL) glib.def $(DESTDIR)$(libdir)/glib-2.0.def + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ -rm $(DESTDIR)$(libdir)/glib-2.0.def +@OS_WIN32_AND_DLL_COMPILATION_FALSE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_FALSE@uninstall-def-file: + +gspawn-win32-helper-console.c: + echo '#define HELPER_CONSOLE' >$@ + echo '#include "gspawn-win32-helper.c"' >>$@ + +gspawn-win64-helper.c: + echo '#include "gspawn-win32-helper.c"' >$@ + +gspawn-win64-helper-console.c: + echo '#define HELPER_CONSOLE' >$@ + echo '#include "gspawn-win32-helper.c"' >>$@ + +glib-win32-res.o: glib.rc + $(WINDRES) glib.rc $@ + +@OS_UNIX_TRUE@install-exec-hook: +@OS_UNIX_TRUE@ for sf in ${auto_config_binscripts} ; do \ +@OS_UNIX_TRUE@ mv -f "$(DESTDIR)$(bindir)/$$sf" "$(DESTDIR)$(bindir)/$$sf".tmp \ +@OS_UNIX_TRUE@ && sed < "$(DESTDIR)$(bindir)/$$sf".tmp > "$(DESTDIR)$(bindir)/$$sf" \ +@OS_UNIX_TRUE@ -e '1,24s|^ *#@PKGINSTALL_CONFIGVARS_IN24LINES@| ${CONFIGVARS}|' \ +@OS_UNIX_TRUE@ -e '1,1s|#! /usr/bin/env python\([0-9]\+\(\.[0-9]\+\)\?\)\?|#!${PYTHON}|' \ +@OS_UNIX_TRUE@ || exit $$? ; \ +@OS_UNIX_TRUE@ rm -f "$(DESTDIR)$(bindir)/$$sf".tmp ; \ +@OS_UNIX_TRUE@ done + +glib-2.0.lib: libglib-2.0.la glib.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libglib-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:glib.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/glib.vcproj + 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 + +../build/win32/vs9/glib.vcproj: $(top_srcdir)/build/win32/vs9/glib.vcprojin + for F in $(libglib_2_0_la_SOURCES); do \ + case $$F in \ + *-gcc.c) \ + ;; \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libglib.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/glib.vcprojin >$@ + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f libglib-gdb.py; \ + fi + +libglib-gdb.py: libglib-gdb.py.in + sed -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libglib-gdb.py.in > libglib-gdb.py + +install-data-hook: libglib-gdb.py + mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR) + $(INSTALL) libglib-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR)/libglib-2.0.so.0.$(LT_CURRENT).$(LT_REVISION)-gdb.py +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libglib-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libglib-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ rm -f $(DESTDIR)$(libdir)/libglib-2.0.so +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ ln -s $(GLIB_RUNTIME_LIBDIR)/libglib-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libglib-2.0.so + +# 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/glib/abicheck.sh b/glib/abicheck.sh new file mode 100755 index 0000000..ce9a966 --- /dev/null +++ b/glib/abicheck.sh @@ -0,0 +1,13 @@ +#! /bin/sh + +egrep '^#([^i]|if).*[^\]$' "${top_builddir:-..}/glibconfig.h" > glibconfig.cpp + +INCLUDES="-include ${top_builddir:-..}/config.h" +INCLUDES="$INCLUDES -include glibconfig.cpp $GLIB_DEBUG_FLAGS" + +cpp -P -DINCLUDE_INTERNAL_SYMBOLS -DINCLUDE_VARIABLES -DG_STDIO_NO_WRAP_ON_UNIX -DALL_FILES $INCLUDES "${srcdir:-.}/glib.symbols" | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi +rm -f glibconfig.cpp + +nm -D -g --defined-only .libs/libglib-2.0.so | cut -d ' ' -f 3 | sort > actual-abi + +diff -u expected-abi actual-abi && rm -f expected-abi actual-abi diff --git a/glib/galias.h b/glib/galias.h new file mode 100644 index 0000000..8d57f61 --- /dev/null +++ b/glib/galias.h @@ -0,0 +1,4449 @@ +/* Generated by makegalias.pl */ + +#ifndef DISABLE_VISIBILITY + +#include "glibconfig.h" + +#ifdef G_HAVE_GNUC_VISIBILITY + +#define IN_FILE(x) 1 +#define IN_HEADER defined + +#if IN_HEADER(__G_ARRAY_H__) +#if IN_FILE(__G_ARRAY_C__) +extern __typeof (g_array_append_vals) IA__g_array_append_vals __attribute((visibility("hidden"))); +#define g_array_append_vals IA__g_array_append_vals + +extern __typeof (g_array_free) IA__g_array_free __attribute((visibility("hidden"))); +#define g_array_free IA__g_array_free + +extern __typeof (g_array_insert_vals) IA__g_array_insert_vals __attribute((visibility("hidden"))); +#define g_array_insert_vals IA__g_array_insert_vals + +extern __typeof (g_array_new) IA__g_array_new __attribute((visibility("hidden"))); +#define g_array_new IA__g_array_new + +extern __typeof (g_array_ref) IA__g_array_ref __attribute((visibility("hidden"))); +#define g_array_ref IA__g_array_ref + +extern __typeof (g_array_unref) IA__g_array_unref __attribute((visibility("hidden"))); +#define g_array_unref IA__g_array_unref + +extern __typeof (g_array_get_element_size) IA__g_array_get_element_size __attribute((visibility("hidden"))); +#define g_array_get_element_size IA__g_array_get_element_size + +extern __typeof (g_array_prepend_vals) IA__g_array_prepend_vals __attribute((visibility("hidden"))); +#define g_array_prepend_vals IA__g_array_prepend_vals + +extern __typeof (g_array_remove_index) IA__g_array_remove_index __attribute((visibility("hidden"))); +#define g_array_remove_index IA__g_array_remove_index + +extern __typeof (g_array_remove_index_fast) IA__g_array_remove_index_fast __attribute((visibility("hidden"))); +#define g_array_remove_index_fast IA__g_array_remove_index_fast + +extern __typeof (g_array_remove_range) IA__g_array_remove_range __attribute((visibility("hidden"))); +#define g_array_remove_range IA__g_array_remove_range + +extern __typeof (g_array_set_size) IA__g_array_set_size __attribute((visibility("hidden"))); +#define g_array_set_size IA__g_array_set_size + +extern __typeof (g_array_sized_new) IA__g_array_sized_new __attribute((visibility("hidden"))); +#define g_array_sized_new IA__g_array_sized_new + +extern __typeof (g_array_sort) IA__g_array_sort __attribute((visibility("hidden"))); +#define g_array_sort IA__g_array_sort + +extern __typeof (g_array_sort_with_data) IA__g_array_sort_with_data __attribute((visibility("hidden"))); +#define g_array_sort_with_data IA__g_array_sort_with_data + +extern __typeof (g_byte_array_append) IA__g_byte_array_append __attribute((visibility("hidden"))); +#define g_byte_array_append IA__g_byte_array_append + +extern __typeof (g_byte_array_free) IA__g_byte_array_free __attribute((visibility("hidden"))); +#define g_byte_array_free IA__g_byte_array_free + +extern __typeof (g_byte_array_unref) IA__g_byte_array_unref __attribute((visibility("hidden"))); +#define g_byte_array_unref IA__g_byte_array_unref + +extern __typeof (g_byte_array_ref) IA__g_byte_array_ref __attribute((visibility("hidden"))); +#define g_byte_array_ref IA__g_byte_array_ref + +extern __typeof (g_byte_array_new) IA__g_byte_array_new __attribute((visibility("hidden"))); +#define g_byte_array_new IA__g_byte_array_new + +extern __typeof (g_byte_array_prepend) IA__g_byte_array_prepend __attribute((visibility("hidden"))); +#define g_byte_array_prepend IA__g_byte_array_prepend + +extern __typeof (g_byte_array_remove_index) IA__g_byte_array_remove_index __attribute((visibility("hidden"))); +#define g_byte_array_remove_index IA__g_byte_array_remove_index + +extern __typeof (g_byte_array_remove_index_fast) IA__g_byte_array_remove_index_fast __attribute((visibility("hidden"))); +#define g_byte_array_remove_index_fast IA__g_byte_array_remove_index_fast + +extern __typeof (g_byte_array_remove_range) IA__g_byte_array_remove_range __attribute((visibility("hidden"))); +#define g_byte_array_remove_range IA__g_byte_array_remove_range + +extern __typeof (g_byte_array_set_size) IA__g_byte_array_set_size __attribute((visibility("hidden"))); +#define g_byte_array_set_size IA__g_byte_array_set_size + +extern __typeof (g_byte_array_sized_new) IA__g_byte_array_sized_new __attribute((visibility("hidden"))); +#define g_byte_array_sized_new IA__g_byte_array_sized_new + +extern __typeof (g_byte_array_sort) IA__g_byte_array_sort __attribute((visibility("hidden"))); +#define g_byte_array_sort IA__g_byte_array_sort + +extern __typeof (g_byte_array_sort_with_data) IA__g_byte_array_sort_with_data __attribute((visibility("hidden"))); +#define g_byte_array_sort_with_data IA__g_byte_array_sort_with_data + +extern __typeof (g_ptr_array_add) IA__g_ptr_array_add __attribute((visibility("hidden"))); +#define g_ptr_array_add IA__g_ptr_array_add + +extern __typeof (g_ptr_array_foreach) IA__g_ptr_array_foreach __attribute((visibility("hidden"))); +#define g_ptr_array_foreach IA__g_ptr_array_foreach + +extern __typeof (g_ptr_array_free) IA__g_ptr_array_free __attribute((visibility("hidden"))); +#define g_ptr_array_free IA__g_ptr_array_free + +extern __typeof (g_ptr_array_unref) IA__g_ptr_array_unref __attribute((visibility("hidden"))); +#define g_ptr_array_unref IA__g_ptr_array_unref + +extern __typeof (g_ptr_array_ref) IA__g_ptr_array_ref __attribute((visibility("hidden"))); +#define g_ptr_array_ref IA__g_ptr_array_ref + +extern __typeof (g_ptr_array_new) IA__g_ptr_array_new __attribute((visibility("hidden"))); +#define g_ptr_array_new IA__g_ptr_array_new + +extern __typeof (g_ptr_array_new_with_free_func) IA__g_ptr_array_new_with_free_func __attribute((visibility("hidden"))); +#define g_ptr_array_new_with_free_func IA__g_ptr_array_new_with_free_func + +extern __typeof (g_ptr_array_set_free_func) IA__g_ptr_array_set_free_func __attribute((visibility("hidden"))); +#define g_ptr_array_set_free_func IA__g_ptr_array_set_free_func + +extern __typeof (g_ptr_array_remove) IA__g_ptr_array_remove __attribute((visibility("hidden"))); +#define g_ptr_array_remove IA__g_ptr_array_remove + +extern __typeof (g_ptr_array_remove_fast) IA__g_ptr_array_remove_fast __attribute((visibility("hidden"))); +#define g_ptr_array_remove_fast IA__g_ptr_array_remove_fast + +extern __typeof (g_ptr_array_remove_index) IA__g_ptr_array_remove_index __attribute((visibility("hidden"))); +#define g_ptr_array_remove_index IA__g_ptr_array_remove_index + +extern __typeof (g_ptr_array_remove_index_fast) IA__g_ptr_array_remove_index_fast __attribute((visibility("hidden"))); +#define g_ptr_array_remove_index_fast IA__g_ptr_array_remove_index_fast + +extern __typeof (g_ptr_array_remove_range) IA__g_ptr_array_remove_range __attribute((visibility("hidden"))); +#define g_ptr_array_remove_range IA__g_ptr_array_remove_range + +extern __typeof (g_ptr_array_set_size) IA__g_ptr_array_set_size __attribute((visibility("hidden"))); +#define g_ptr_array_set_size IA__g_ptr_array_set_size + +extern __typeof (g_ptr_array_sized_new) IA__g_ptr_array_sized_new __attribute((visibility("hidden"))); +#define g_ptr_array_sized_new IA__g_ptr_array_sized_new + +extern __typeof (g_ptr_array_sort) IA__g_ptr_array_sort __attribute((visibility("hidden"))); +#define g_ptr_array_sort IA__g_ptr_array_sort + +extern __typeof (g_ptr_array_sort_with_data) IA__g_ptr_array_sort_with_data __attribute((visibility("hidden"))); +#define g_ptr_array_sort_with_data IA__g_ptr_array_sort_with_data + +#endif +#endif +#if IN_HEADER(__G_ASYNCQUEUE_H__) +#if IN_FILE(__G_ASYNCQUEUE_C__) +extern __typeof (g_async_queue_length) IA__g_async_queue_length __attribute((visibility("hidden"))); +#define g_async_queue_length IA__g_async_queue_length + +extern __typeof (g_async_queue_length_unlocked) IA__g_async_queue_length_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_length_unlocked IA__g_async_queue_length_unlocked + +extern __typeof (g_async_queue_lock) IA__g_async_queue_lock __attribute((visibility("hidden"))); +#define g_async_queue_lock IA__g_async_queue_lock + +extern __typeof (g_async_queue_new) IA__g_async_queue_new __attribute((visibility("hidden"))); +#define g_async_queue_new IA__g_async_queue_new + +extern __typeof (g_async_queue_new_full) IA__g_async_queue_new_full __attribute((visibility("hidden"))); +#define g_async_queue_new_full IA__g_async_queue_new_full + +extern __typeof (g_async_queue_pop) IA__g_async_queue_pop __attribute((visibility("hidden"))); +#define g_async_queue_pop IA__g_async_queue_pop + +extern __typeof (g_async_queue_pop_unlocked) IA__g_async_queue_pop_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_pop_unlocked IA__g_async_queue_pop_unlocked + +extern __typeof (g_async_queue_push) IA__g_async_queue_push __attribute((visibility("hidden"))); +#define g_async_queue_push IA__g_async_queue_push + +extern __typeof (g_async_queue_push_unlocked) IA__g_async_queue_push_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_push_unlocked IA__g_async_queue_push_unlocked + +extern __typeof (g_async_queue_push_sorted) IA__g_async_queue_push_sorted __attribute((visibility("hidden"))); +#define g_async_queue_push_sorted IA__g_async_queue_push_sorted + +extern __typeof (g_async_queue_push_sorted_unlocked) IA__g_async_queue_push_sorted_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_push_sorted_unlocked IA__g_async_queue_push_sorted_unlocked + +extern __typeof (g_async_queue_ref) IA__g_async_queue_ref __attribute((visibility("hidden"))); +#define g_async_queue_ref IA__g_async_queue_ref + +extern __typeof (g_async_queue_sort) IA__g_async_queue_sort __attribute((visibility("hidden"))); +#define g_async_queue_sort IA__g_async_queue_sort + +extern __typeof (g_async_queue_sort_unlocked) IA__g_async_queue_sort_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_sort_unlocked IA__g_async_queue_sort_unlocked + +extern __typeof (g_async_queue_timed_pop) IA__g_async_queue_timed_pop __attribute((visibility("hidden"))); +#define g_async_queue_timed_pop IA__g_async_queue_timed_pop + +extern __typeof (g_async_queue_timed_pop_unlocked) IA__g_async_queue_timed_pop_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_timed_pop_unlocked IA__g_async_queue_timed_pop_unlocked + +extern __typeof (g_async_queue_try_pop) IA__g_async_queue_try_pop __attribute((visibility("hidden"))); +#define g_async_queue_try_pop IA__g_async_queue_try_pop + +extern __typeof (g_async_queue_try_pop_unlocked) IA__g_async_queue_try_pop_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_try_pop_unlocked IA__g_async_queue_try_pop_unlocked + +extern __typeof (g_async_queue_unlock) IA__g_async_queue_unlock __attribute((visibility("hidden"))); +#define g_async_queue_unlock IA__g_async_queue_unlock + +extern __typeof (g_async_queue_unref) IA__g_async_queue_unref __attribute((visibility("hidden"))); +#define g_async_queue_unref IA__g_async_queue_unref + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_async_queue_ref_unlocked) IA__g_async_queue_ref_unlocked __attribute((visibility("hidden"))); +#define g_async_queue_ref_unlocked IA__g_async_queue_ref_unlocked + +extern __typeof (g_async_queue_unref_and_unlock) IA__g_async_queue_unref_and_unlock __attribute((visibility("hidden"))); +#define g_async_queue_unref_and_unlock IA__g_async_queue_unref_and_unlock + +#endif +#endif +#endif +#if IN_HEADER(__G_ATOMIC_H__) +#if IN_FILE(__G_ATOMIC_C__) +extern __typeof (g_atomic_int_add) IA__g_atomic_int_add __attribute((visibility("hidden"))); +#define g_atomic_int_add IA__g_atomic_int_add + +extern __typeof (g_atomic_int_compare_and_exchange) IA__g_atomic_int_compare_and_exchange __attribute((visibility("hidden"))); +#define g_atomic_int_compare_and_exchange IA__g_atomic_int_compare_and_exchange + +extern __typeof (g_atomic_int_exchange_and_add) IA__g_atomic_int_exchange_and_add __attribute((visibility("hidden"))); +#define g_atomic_int_exchange_and_add IA__g_atomic_int_exchange_and_add + +extern __typeof (g_atomic_pointer_compare_and_exchange) IA__g_atomic_pointer_compare_and_exchange __attribute((visibility("hidden"))); +#define g_atomic_pointer_compare_and_exchange IA__g_atomic_pointer_compare_and_exchange + +#endif +#endif +#if IN_HEADER(__G_BACKTRACE_H__) +#if IN_FILE(__G_BACKTRACE_C__) +extern __typeof (g_on_error_query) IA__g_on_error_query __attribute((visibility("hidden"))); +#define g_on_error_query IA__g_on_error_query + +extern __typeof (g_on_error_stack_trace) IA__g_on_error_stack_trace __attribute((visibility("hidden"))); +#define g_on_error_stack_trace IA__g_on_error_stack_trace + +#endif +#endif +#if IN_HEADER(__G_BASE64_H__) +#if IN_FILE(__G_BASE64_C__) +extern __typeof (g_base64_encode_step) IA__g_base64_encode_step __attribute((visibility("hidden"))); +#define g_base64_encode_step IA__g_base64_encode_step + +extern __typeof (g_base64_encode_close) IA__g_base64_encode_close __attribute((visibility("hidden"))); +#define g_base64_encode_close IA__g_base64_encode_close + +extern __typeof (g_base64_encode) IA__g_base64_encode __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_base64_encode IA__g_base64_encode + +extern __typeof (g_base64_decode_step) IA__g_base64_decode_step __attribute((visibility("hidden"))); +#define g_base64_decode_step IA__g_base64_decode_step + +extern __typeof (g_base64_decode) IA__g_base64_decode __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_base64_decode IA__g_base64_decode + +extern __typeof (g_base64_decode_inplace) IA__g_base64_decode_inplace __attribute((visibility("hidden"))); +#define g_base64_decode_inplace IA__g_base64_decode_inplace + +#endif +#endif +#if IN_HEADER(__G_BOOKMARK_FILE_H__) +#if IN_FILE(__G_BOOKMARK_FILE_C__) +extern __typeof (g_bookmark_file_error_quark) IA__g_bookmark_file_error_quark __attribute((visibility("hidden"))); +#define g_bookmark_file_error_quark IA__g_bookmark_file_error_quark + +extern __typeof (g_bookmark_file_new) IA__g_bookmark_file_new __attribute((visibility("hidden"))); +#define g_bookmark_file_new IA__g_bookmark_file_new + +extern __typeof (g_bookmark_file_free) IA__g_bookmark_file_free __attribute((visibility("hidden"))); +#define g_bookmark_file_free IA__g_bookmark_file_free + +extern __typeof (g_bookmark_file_load_from_file) IA__g_bookmark_file_load_from_file __attribute((visibility("hidden"))); +#define g_bookmark_file_load_from_file IA__g_bookmark_file_load_from_file + +extern __typeof (g_bookmark_file_load_from_data) IA__g_bookmark_file_load_from_data __attribute((visibility("hidden"))); +#define g_bookmark_file_load_from_data IA__g_bookmark_file_load_from_data + +extern __typeof (g_bookmark_file_load_from_data_dirs) IA__g_bookmark_file_load_from_data_dirs __attribute((visibility("hidden"))); +#define g_bookmark_file_load_from_data_dirs IA__g_bookmark_file_load_from_data_dirs + +extern __typeof (g_bookmark_file_to_data) IA__g_bookmark_file_to_data __attribute((visibility("hidden"))); +#define g_bookmark_file_to_data IA__g_bookmark_file_to_data + +extern __typeof (g_bookmark_file_to_file) IA__g_bookmark_file_to_file __attribute((visibility("hidden"))); +#define g_bookmark_file_to_file IA__g_bookmark_file_to_file + +extern __typeof (g_bookmark_file_set_title) IA__g_bookmark_file_set_title __attribute((visibility("hidden"))); +#define g_bookmark_file_set_title IA__g_bookmark_file_set_title + +extern __typeof (g_bookmark_file_get_title) IA__g_bookmark_file_get_title __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_bookmark_file_get_title IA__g_bookmark_file_get_title + +extern __typeof (g_bookmark_file_set_description) IA__g_bookmark_file_set_description __attribute((visibility("hidden"))); +#define g_bookmark_file_set_description IA__g_bookmark_file_set_description + +extern __typeof (g_bookmark_file_get_description) IA__g_bookmark_file_get_description __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_bookmark_file_get_description IA__g_bookmark_file_get_description + +extern __typeof (g_bookmark_file_set_mime_type) IA__g_bookmark_file_set_mime_type __attribute((visibility("hidden"))); +#define g_bookmark_file_set_mime_type IA__g_bookmark_file_set_mime_type + +extern __typeof (g_bookmark_file_get_mime_type) IA__g_bookmark_file_get_mime_type __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_bookmark_file_get_mime_type IA__g_bookmark_file_get_mime_type + +extern __typeof (g_bookmark_file_set_groups) IA__g_bookmark_file_set_groups __attribute((visibility("hidden"))); +#define g_bookmark_file_set_groups IA__g_bookmark_file_set_groups + +extern __typeof (g_bookmark_file_add_group) IA__g_bookmark_file_add_group __attribute((visibility("hidden"))); +#define g_bookmark_file_add_group IA__g_bookmark_file_add_group + +extern __typeof (g_bookmark_file_has_group) IA__g_bookmark_file_has_group __attribute((visibility("hidden"))); +#define g_bookmark_file_has_group IA__g_bookmark_file_has_group + +extern __typeof (g_bookmark_file_get_groups) IA__g_bookmark_file_get_groups __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_bookmark_file_get_groups IA__g_bookmark_file_get_groups + +extern __typeof (g_bookmark_file_add_application) IA__g_bookmark_file_add_application __attribute((visibility("hidden"))); +#define g_bookmark_file_add_application IA__g_bookmark_file_add_application + +extern __typeof (g_bookmark_file_has_application) IA__g_bookmark_file_has_application __attribute((visibility("hidden"))); +#define g_bookmark_file_has_application IA__g_bookmark_file_has_application + +extern __typeof (g_bookmark_file_get_applications) IA__g_bookmark_file_get_applications __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_bookmark_file_get_applications IA__g_bookmark_file_get_applications + +extern __typeof (g_bookmark_file_set_app_info) IA__g_bookmark_file_set_app_info __attribute((visibility("hidden"))); +#define g_bookmark_file_set_app_info IA__g_bookmark_file_set_app_info + +extern __typeof (g_bookmark_file_get_app_info) IA__g_bookmark_file_get_app_info __attribute((visibility("hidden"))); +#define g_bookmark_file_get_app_info IA__g_bookmark_file_get_app_info + +extern __typeof (g_bookmark_file_set_is_private) IA__g_bookmark_file_set_is_private __attribute((visibility("hidden"))); +#define g_bookmark_file_set_is_private IA__g_bookmark_file_set_is_private + +extern __typeof (g_bookmark_file_get_is_private) IA__g_bookmark_file_get_is_private __attribute((visibility("hidden"))); +#define g_bookmark_file_get_is_private IA__g_bookmark_file_get_is_private + +extern __typeof (g_bookmark_file_set_icon) IA__g_bookmark_file_set_icon __attribute((visibility("hidden"))); +#define g_bookmark_file_set_icon IA__g_bookmark_file_set_icon + +extern __typeof (g_bookmark_file_get_icon) IA__g_bookmark_file_get_icon __attribute((visibility("hidden"))); +#define g_bookmark_file_get_icon IA__g_bookmark_file_get_icon + +extern __typeof (g_bookmark_file_set_added) IA__g_bookmark_file_set_added __attribute((visibility("hidden"))); +#define g_bookmark_file_set_added IA__g_bookmark_file_set_added + +extern __typeof (g_bookmark_file_get_added) IA__g_bookmark_file_get_added __attribute((visibility("hidden"))); +#define g_bookmark_file_get_added IA__g_bookmark_file_get_added + +extern __typeof (g_bookmark_file_set_modified) IA__g_bookmark_file_set_modified __attribute((visibility("hidden"))); +#define g_bookmark_file_set_modified IA__g_bookmark_file_set_modified + +extern __typeof (g_bookmark_file_get_modified) IA__g_bookmark_file_get_modified __attribute((visibility("hidden"))); +#define g_bookmark_file_get_modified IA__g_bookmark_file_get_modified + +extern __typeof (g_bookmark_file_set_visited) IA__g_bookmark_file_set_visited __attribute((visibility("hidden"))); +#define g_bookmark_file_set_visited IA__g_bookmark_file_set_visited + +extern __typeof (g_bookmark_file_get_visited) IA__g_bookmark_file_get_visited __attribute((visibility("hidden"))); +#define g_bookmark_file_get_visited IA__g_bookmark_file_get_visited + +extern __typeof (g_bookmark_file_has_item) IA__g_bookmark_file_has_item __attribute((visibility("hidden"))); +#define g_bookmark_file_has_item IA__g_bookmark_file_has_item + +extern __typeof (g_bookmark_file_get_size) IA__g_bookmark_file_get_size __attribute((visibility("hidden"))); +#define g_bookmark_file_get_size IA__g_bookmark_file_get_size + +extern __typeof (g_bookmark_file_get_uris) IA__g_bookmark_file_get_uris __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_bookmark_file_get_uris IA__g_bookmark_file_get_uris + +extern __typeof (g_bookmark_file_remove_group) IA__g_bookmark_file_remove_group __attribute((visibility("hidden"))); +#define g_bookmark_file_remove_group IA__g_bookmark_file_remove_group + +extern __typeof (g_bookmark_file_remove_application) IA__g_bookmark_file_remove_application __attribute((visibility("hidden"))); +#define g_bookmark_file_remove_application IA__g_bookmark_file_remove_application + +extern __typeof (g_bookmark_file_remove_item) IA__g_bookmark_file_remove_item __attribute((visibility("hidden"))); +#define g_bookmark_file_remove_item IA__g_bookmark_file_remove_item + +extern __typeof (g_bookmark_file_move_item) IA__g_bookmark_file_move_item __attribute((visibility("hidden"))); +#define g_bookmark_file_move_item IA__g_bookmark_file_move_item + +#endif +#endif +#if IN_HEADER(__G_CACHE_H__) +#if IN_FILE(__G_CACHE_C__) +extern __typeof (g_cache_destroy) IA__g_cache_destroy __attribute((visibility("hidden"))); +#define g_cache_destroy IA__g_cache_destroy + +extern __typeof (g_cache_insert) IA__g_cache_insert __attribute((visibility("hidden"))); +#define g_cache_insert IA__g_cache_insert + +extern __typeof (g_cache_key_foreach) IA__g_cache_key_foreach __attribute((visibility("hidden"))); +#define g_cache_key_foreach IA__g_cache_key_foreach + +extern __typeof (g_cache_new) IA__g_cache_new __attribute((visibility("hidden"))); +#define g_cache_new IA__g_cache_new + +extern __typeof (g_cache_remove) IA__g_cache_remove __attribute((visibility("hidden"))); +#define g_cache_remove IA__g_cache_remove + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_cache_value_foreach) IA__g_cache_value_foreach __attribute((visibility("hidden"))); +#define g_cache_value_foreach IA__g_cache_value_foreach + +#endif +#endif +#endif +#if IN_HEADER(__G_CHECKSUM_H__) +#if IN_FILE(__G_CHECKSUM_C__) +extern __typeof (g_checksum_type_get_length) IA__g_checksum_type_get_length __attribute((visibility("hidden"))); +#define g_checksum_type_get_length IA__g_checksum_type_get_length + +extern __typeof (g_checksum_new) IA__g_checksum_new __attribute((visibility("hidden"))); +#define g_checksum_new IA__g_checksum_new + +extern __typeof (g_checksum_copy) IA__g_checksum_copy __attribute((visibility("hidden"))); +#define g_checksum_copy IA__g_checksum_copy + +extern __typeof (g_checksum_free) IA__g_checksum_free __attribute((visibility("hidden"))); +#define g_checksum_free IA__g_checksum_free + +extern __typeof (g_checksum_update) IA__g_checksum_update __attribute((visibility("hidden"))); +#define g_checksum_update IA__g_checksum_update + +extern __typeof (g_checksum_reset) IA__g_checksum_reset __attribute((visibility("hidden"))); +#define g_checksum_reset IA__g_checksum_reset + +extern __typeof (g_checksum_get_string) IA__g_checksum_get_string __attribute((visibility("hidden"))); +#define g_checksum_get_string IA__g_checksum_get_string + +extern __typeof (g_checksum_get_digest) IA__g_checksum_get_digest __attribute((visibility("hidden"))); +#define g_checksum_get_digest IA__g_checksum_get_digest + +extern __typeof (g_compute_checksum_for_data) IA__g_compute_checksum_for_data __attribute((visibility("hidden"))); +#define g_compute_checksum_for_data IA__g_compute_checksum_for_data + +extern __typeof (g_compute_checksum_for_string) IA__g_compute_checksum_for_string __attribute((visibility("hidden"))); +#define g_compute_checksum_for_string IA__g_compute_checksum_for_string + +#endif +#endif +#if IN_HEADER(__G_COMPLETION_H__) +#if IN_FILE(__G_COMPLETION_C__) +extern __typeof (g_completion_add_items) IA__g_completion_add_items __attribute((visibility("hidden"))); +#define g_completion_add_items IA__g_completion_add_items + +extern __typeof (g_completion_clear_items) IA__g_completion_clear_items __attribute((visibility("hidden"))); +#define g_completion_clear_items IA__g_completion_clear_items + +extern __typeof (g_completion_complete) IA__g_completion_complete __attribute((visibility("hidden"))); +#define g_completion_complete IA__g_completion_complete + +extern __typeof (g_completion_complete_utf8) IA__g_completion_complete_utf8 __attribute((visibility("hidden"))); +#define g_completion_complete_utf8 IA__g_completion_complete_utf8 + +extern __typeof (g_completion_free) IA__g_completion_free __attribute((visibility("hidden"))); +#define g_completion_free IA__g_completion_free + +extern __typeof (g_completion_new) IA__g_completion_new __attribute((visibility("hidden"))); +#define g_completion_new IA__g_completion_new + +extern __typeof (g_completion_remove_items) IA__g_completion_remove_items __attribute((visibility("hidden"))); +#define g_completion_remove_items IA__g_completion_remove_items + +extern __typeof (g_completion_set_compare) IA__g_completion_set_compare __attribute((visibility("hidden"))); +#define g_completion_set_compare IA__g_completion_set_compare + +#endif +#endif +#if IN_HEADER(__G_CONVERT_H__) +#if IN_FILE(__G_CONVERT_C__) +extern __typeof (g_get_filename_charsets) IA__g_get_filename_charsets __attribute((visibility("hidden"))); +#define g_get_filename_charsets IA__g_get_filename_charsets + +extern __typeof (g_convert) IA__g_convert __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_convert IA__g_convert + +extern __typeof (g_convert_error_quark) IA__g_convert_error_quark __attribute((visibility("hidden"))); +#define g_convert_error_quark IA__g_convert_error_quark + +extern __typeof (g_convert_with_fallback) IA__g_convert_with_fallback __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_convert_with_fallback IA__g_convert_with_fallback + +extern __typeof (g_convert_with_iconv) IA__g_convert_with_iconv __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_convert_with_iconv IA__g_convert_with_iconv + +extern __typeof (g_iconv) IA__g_iconv __attribute((visibility("hidden"))); +#define g_iconv IA__g_iconv + +extern __typeof (g_iconv_close) IA__g_iconv_close __attribute((visibility("hidden"))); +#define g_iconv_close IA__g_iconv_close + +extern __typeof (g_iconv_open) IA__g_iconv_open __attribute((visibility("hidden"))); +#define g_iconv_open IA__g_iconv_open + +extern __typeof (g_locale_from_utf8) IA__g_locale_from_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_locale_from_utf8 IA__g_locale_from_utf8 + +extern __typeof (g_locale_to_utf8) IA__g_locale_to_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_locale_to_utf8 IA__g_locale_to_utf8 + +extern __typeof (g_filename_display_name) IA__g_filename_display_name __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_display_name IA__g_filename_display_name + +extern __typeof (g_filename_display_basename) IA__g_filename_display_basename __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_display_basename IA__g_filename_display_basename + +#ifndef _WIN64 +extern __typeof (g_filename_from_uri) IA__g_filename_from_uri __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_from_uri IA__g_filename_from_uri + +extern __typeof (g_filename_from_utf8) IA__g_filename_from_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_from_utf8 IA__g_filename_from_utf8 + +extern __typeof (g_filename_to_uri) IA__g_filename_to_uri __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_to_uri IA__g_filename_to_uri + +extern __typeof (g_filename_to_utf8) IA__g_filename_to_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_to_utf8 IA__g_filename_to_utf8 + +#endif +#ifdef G_OS_WIN32 +extern __typeof (g_filename_from_uri_utf8) IA__g_filename_from_uri_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_from_uri_utf8 IA__g_filename_from_uri_utf8 + +extern __typeof (g_filename_from_utf8_utf8) IA__g_filename_from_utf8_utf8 __attribute((visibility("hidden"))); +#define g_filename_from_utf8_utf8 IA__g_filename_from_utf8_utf8 + +extern __typeof (g_filename_to_uri_utf8) IA__g_filename_to_uri_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_filename_to_uri_utf8 IA__g_filename_to_uri_utf8 + +extern __typeof (g_filename_to_utf8_utf8) IA__g_filename_to_utf8_utf8 __attribute((visibility("hidden"))); +#define g_filename_to_utf8_utf8 IA__g_filename_to_utf8_utf8 + +#endif +extern __typeof (g_uri_list_extract_uris) IA__g_uri_list_extract_uris __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_uri_list_extract_uris IA__g_uri_list_extract_uris + +#endif +#endif +#if IN_HEADER(__G_DATASET_H__) +#if IN_FILE(__G_DATASET_C__) +extern __typeof (g_datalist_clear) IA__g_datalist_clear __attribute((visibility("hidden"))); +#define g_datalist_clear IA__g_datalist_clear + +extern __typeof (g_datalist_foreach) IA__g_datalist_foreach __attribute((visibility("hidden"))); +#define g_datalist_foreach IA__g_datalist_foreach + +extern __typeof (g_datalist_get_flags) IA__g_datalist_get_flags __attribute((visibility("hidden"))); +#define g_datalist_get_flags IA__g_datalist_get_flags + +extern __typeof (g_datalist_id_get_data) IA__g_datalist_id_get_data __attribute((visibility("hidden"))); +#define g_datalist_id_get_data IA__g_datalist_id_get_data + +extern __typeof (g_datalist_id_remove_no_notify) IA__g_datalist_id_remove_no_notify __attribute((visibility("hidden"))); +#define g_datalist_id_remove_no_notify IA__g_datalist_id_remove_no_notify + +extern __typeof (g_datalist_id_set_data_full) IA__g_datalist_id_set_data_full __attribute((visibility("hidden"))); +#define g_datalist_id_set_data_full IA__g_datalist_id_set_data_full + +extern __typeof (g_datalist_set_flags) IA__g_datalist_set_flags __attribute((visibility("hidden"))); +#define g_datalist_set_flags IA__g_datalist_set_flags + +extern __typeof (g_datalist_unset_flags) IA__g_datalist_unset_flags __attribute((visibility("hidden"))); +#define g_datalist_unset_flags IA__g_datalist_unset_flags + +extern __typeof (g_datalist_init) IA__g_datalist_init __attribute((visibility("hidden"))); +#define g_datalist_init IA__g_datalist_init + +extern __typeof (g_dataset_destroy) IA__g_dataset_destroy __attribute((visibility("hidden"))); +#define g_dataset_destroy IA__g_dataset_destroy + +extern __typeof (g_dataset_foreach) IA__g_dataset_foreach __attribute((visibility("hidden"))); +#define g_dataset_foreach IA__g_dataset_foreach + +extern __typeof (g_dataset_id_get_data) IA__g_dataset_id_get_data __attribute((visibility("hidden"))); +#define g_dataset_id_get_data IA__g_dataset_id_get_data + +extern __typeof (g_dataset_id_remove_no_notify) IA__g_dataset_id_remove_no_notify __attribute((visibility("hidden"))); +#define g_dataset_id_remove_no_notify IA__g_dataset_id_remove_no_notify + +extern __typeof (g_dataset_id_set_data_full) IA__g_dataset_id_set_data_full __attribute((visibility("hidden"))); +#define g_dataset_id_set_data_full IA__g_dataset_id_set_data_full + +#endif +#endif +#if IN_HEADER(__G_QUARK_H__) +#if IN_FILE(__G_DATASET_C__) +extern __typeof (g_quark_from_static_string) IA__g_quark_from_static_string __attribute((visibility("hidden"))); +#define g_quark_from_static_string IA__g_quark_from_static_string + +extern __typeof (g_quark_from_string) IA__g_quark_from_string __attribute((visibility("hidden"))); +#define g_quark_from_string IA__g_quark_from_string + +extern __typeof (g_quark_to_string) IA__g_quark_to_string __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_quark_to_string IA__g_quark_to_string + +extern __typeof (g_quark_try_string) IA__g_quark_try_string __attribute((visibility("hidden"))); +#define g_quark_try_string IA__g_quark_try_string + +extern __typeof (g_intern_string) IA__g_intern_string __attribute((visibility("hidden"))); +#define g_intern_string IA__g_intern_string + +extern __typeof (g_intern_static_string) IA__g_intern_static_string __attribute((visibility("hidden"))); +#define g_intern_static_string IA__g_intern_static_string + +#endif +#endif +#if IN_HEADER(__G_DATE_H__) +#if IN_FILE(__G_DATE_C__) +extern __typeof (g_date_add_days) IA__g_date_add_days __attribute((visibility("hidden"))); +#define g_date_add_days IA__g_date_add_days + +extern __typeof (g_date_add_months) IA__g_date_add_months __attribute((visibility("hidden"))); +#define g_date_add_months IA__g_date_add_months + +extern __typeof (g_date_add_years) IA__g_date_add_years __attribute((visibility("hidden"))); +#define g_date_add_years IA__g_date_add_years + +extern __typeof (g_date_clamp) IA__g_date_clamp __attribute((visibility("hidden"))); +#define g_date_clamp IA__g_date_clamp + +extern __typeof (g_date_clear) IA__g_date_clear __attribute((visibility("hidden"))); +#define g_date_clear IA__g_date_clear + +extern __typeof (g_date_compare) IA__g_date_compare __attribute((visibility("hidden"))); +#define g_date_compare IA__g_date_compare + +extern __typeof (g_date_days_between) IA__g_date_days_between __attribute((visibility("hidden"))); +#define g_date_days_between IA__g_date_days_between + +extern __typeof (g_date_free) IA__g_date_free __attribute((visibility("hidden"))); +#define g_date_free IA__g_date_free + +extern __typeof (g_date_get_day) IA__g_date_get_day __attribute((visibility("hidden"))); +#define g_date_get_day IA__g_date_get_day + +extern __typeof (g_date_get_day_of_year) IA__g_date_get_day_of_year __attribute((visibility("hidden"))); +#define g_date_get_day_of_year IA__g_date_get_day_of_year + +extern __typeof (g_date_get_days_in_month) IA__g_date_get_days_in_month __attribute((visibility("hidden"))); +#define g_date_get_days_in_month IA__g_date_get_days_in_month + +extern __typeof (g_date_get_iso8601_week_of_year) IA__g_date_get_iso8601_week_of_year __attribute((visibility("hidden"))); +#define g_date_get_iso8601_week_of_year IA__g_date_get_iso8601_week_of_year + +extern __typeof (g_date_get_julian) IA__g_date_get_julian __attribute((visibility("hidden"))); +#define g_date_get_julian IA__g_date_get_julian + +extern __typeof (g_date_get_monday_week_of_year) IA__g_date_get_monday_week_of_year __attribute((visibility("hidden"))); +#define g_date_get_monday_week_of_year IA__g_date_get_monday_week_of_year + +extern __typeof (g_date_get_monday_weeks_in_year) IA__g_date_get_monday_weeks_in_year __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_get_monday_weeks_in_year IA__g_date_get_monday_weeks_in_year + +extern __typeof (g_date_get_month) IA__g_date_get_month __attribute((visibility("hidden"))); +#define g_date_get_month IA__g_date_get_month + +extern __typeof (g_date_get_sunday_week_of_year) IA__g_date_get_sunday_week_of_year __attribute((visibility("hidden"))); +#define g_date_get_sunday_week_of_year IA__g_date_get_sunday_week_of_year + +extern __typeof (g_date_get_sunday_weeks_in_year) IA__g_date_get_sunday_weeks_in_year __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_get_sunday_weeks_in_year IA__g_date_get_sunday_weeks_in_year + +extern __typeof (g_date_get_weekday) IA__g_date_get_weekday __attribute((visibility("hidden"))); +#define g_date_get_weekday IA__g_date_get_weekday + +extern __typeof (g_date_get_year) IA__g_date_get_year __attribute((visibility("hidden"))); +#define g_date_get_year IA__g_date_get_year + +extern __typeof (g_date_is_first_of_month) IA__g_date_is_first_of_month __attribute((visibility("hidden"))); +#define g_date_is_first_of_month IA__g_date_is_first_of_month + +extern __typeof (g_date_is_last_of_month) IA__g_date_is_last_of_month __attribute((visibility("hidden"))); +#define g_date_is_last_of_month IA__g_date_is_last_of_month + +extern __typeof (g_date_is_leap_year) IA__g_date_is_leap_year __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_is_leap_year IA__g_date_is_leap_year + +extern __typeof (g_date_new) IA__g_date_new __attribute((visibility("hidden"))); +#define g_date_new IA__g_date_new + +extern __typeof (g_date_new_dmy) IA__g_date_new_dmy __attribute((visibility("hidden"))); +#define g_date_new_dmy IA__g_date_new_dmy + +extern __typeof (g_date_new_julian) IA__g_date_new_julian __attribute((visibility("hidden"))); +#define g_date_new_julian IA__g_date_new_julian + +extern __typeof (g_date_order) IA__g_date_order __attribute((visibility("hidden"))); +#define g_date_order IA__g_date_order + +extern __typeof (g_date_set_day) IA__g_date_set_day __attribute((visibility("hidden"))); +#define g_date_set_day IA__g_date_set_day + +extern __typeof (g_date_set_dmy) IA__g_date_set_dmy __attribute((visibility("hidden"))); +#define g_date_set_dmy IA__g_date_set_dmy + +extern __typeof (g_date_set_julian) IA__g_date_set_julian __attribute((visibility("hidden"))); +#define g_date_set_julian IA__g_date_set_julian + +extern __typeof (g_date_set_month) IA__g_date_set_month __attribute((visibility("hidden"))); +#define g_date_set_month IA__g_date_set_month + +extern __typeof (g_date_set_parse) IA__g_date_set_parse __attribute((visibility("hidden"))); +#define g_date_set_parse IA__g_date_set_parse + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_date_set_time) IA__g_date_set_time __attribute((visibility("hidden"))); +#define g_date_set_time IA__g_date_set_time + +#endif +extern __typeof (g_date_set_time_t) IA__g_date_set_time_t __attribute((visibility("hidden"))); +#define g_date_set_time_t IA__g_date_set_time_t + +extern __typeof (g_date_set_time_val) IA__g_date_set_time_val __attribute((visibility("hidden"))); +#define g_date_set_time_val IA__g_date_set_time_val + +extern __typeof (g_date_set_year) IA__g_date_set_year __attribute((visibility("hidden"))); +#define g_date_set_year IA__g_date_set_year + +extern __typeof (g_date_strftime) IA__g_date_strftime __attribute((visibility("hidden"))); +#define g_date_strftime IA__g_date_strftime + +extern __typeof (g_date_subtract_days) IA__g_date_subtract_days __attribute((visibility("hidden"))); +#define g_date_subtract_days IA__g_date_subtract_days + +extern __typeof (g_date_subtract_months) IA__g_date_subtract_months __attribute((visibility("hidden"))); +#define g_date_subtract_months IA__g_date_subtract_months + +extern __typeof (g_date_subtract_years) IA__g_date_subtract_years __attribute((visibility("hidden"))); +#define g_date_subtract_years IA__g_date_subtract_years + +extern __typeof (g_date_to_struct_tm) IA__g_date_to_struct_tm __attribute((visibility("hidden"))); +#define g_date_to_struct_tm IA__g_date_to_struct_tm + +extern __typeof (g_date_valid) IA__g_date_valid __attribute((visibility("hidden"))); +#define g_date_valid IA__g_date_valid + +extern __typeof (g_date_valid_day) IA__g_date_valid_day __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_valid_day IA__g_date_valid_day + +extern __typeof (g_date_valid_dmy) IA__g_date_valid_dmy __attribute((visibility("hidden"))); +#define g_date_valid_dmy IA__g_date_valid_dmy + +extern __typeof (g_date_valid_julian) IA__g_date_valid_julian __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_valid_julian IA__g_date_valid_julian + +extern __typeof (g_date_valid_month) IA__g_date_valid_month __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_valid_month IA__g_date_valid_month + +extern __typeof (g_date_valid_weekday) IA__g_date_valid_weekday __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_valid_weekday IA__g_date_valid_weekday + +extern __typeof (g_date_valid_year) IA__g_date_valid_year __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_valid_year IA__g_date_valid_year + +#endif +#endif +#if IN_HEADER(__G_DIR_H__) +#if IN_FILE(__G_DIR_C__) +extern __typeof (g_dir_close) IA__g_dir_close __attribute((visibility("hidden"))); +#define g_dir_close IA__g_dir_close + +#ifndef _WIN64 +extern __typeof (g_dir_open) IA__g_dir_open __attribute((visibility("hidden"))); +#define g_dir_open IA__g_dir_open + +extern __typeof (g_dir_read_name) IA__g_dir_read_name __attribute((visibility("hidden"))); +#define g_dir_read_name IA__g_dir_read_name + +#endif +#ifdef G_OS_WIN32 +extern __typeof (g_dir_open_utf8) IA__g_dir_open_utf8 __attribute((visibility("hidden"))); +#define g_dir_open_utf8 IA__g_dir_open_utf8 + +extern __typeof (g_dir_read_name_utf8) IA__g_dir_read_name_utf8 __attribute((visibility("hidden"))); +#define g_dir_read_name_utf8 IA__g_dir_read_name_utf8 + +#endif +extern __typeof (g_dir_rewind) IA__g_dir_rewind __attribute((visibility("hidden"))); +#define g_dir_rewind IA__g_dir_rewind + +#endif +#endif +#if IN_HEADER(__G_ERROR_H__) +#if IN_FILE(__G_ERROR_C__) +extern __typeof (g_clear_error) IA__g_clear_error __attribute((visibility("hidden"))); +#define g_clear_error IA__g_clear_error + +extern __typeof (g_error_copy) IA__g_error_copy __attribute((visibility("hidden"))); +#define g_error_copy IA__g_error_copy + +extern __typeof (g_error_free) IA__g_error_free __attribute((visibility("hidden"))); +#define g_error_free IA__g_error_free + +extern __typeof (g_error_matches) IA__g_error_matches __attribute((visibility("hidden"))); +#define g_error_matches IA__g_error_matches + +extern __typeof (g_error_new) IA__g_error_new __attribute((visibility("hidden"))) G_GNUC_PRINTF(3,4); +#define g_error_new IA__g_error_new + +extern __typeof (g_error_new_literal) IA__g_error_new_literal __attribute((visibility("hidden"))); +#define g_error_new_literal IA__g_error_new_literal + +extern __typeof (g_error_new_valist) IA__g_error_new_valist __attribute((visibility("hidden"))); +#define g_error_new_valist IA__g_error_new_valist + +extern __typeof (g_propagate_error) IA__g_propagate_error __attribute((visibility("hidden"))); +#define g_propagate_error IA__g_propagate_error + +extern __typeof (g_set_error) IA__g_set_error __attribute((visibility("hidden"))) G_GNUC_PRINTF(4,5); +#define g_set_error IA__g_set_error + +extern __typeof (g_set_error_literal) IA__g_set_error_literal __attribute((visibility("hidden"))); +#define g_set_error_literal IA__g_set_error_literal + +extern __typeof (g_prefix_error) IA__g_prefix_error __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_prefix_error IA__g_prefix_error + +extern __typeof (g_propagate_prefixed_error) IA__g_propagate_prefixed_error __attribute((visibility("hidden"))) G_GNUC_PRINTF(3,4); +#define g_propagate_prefixed_error IA__g_propagate_prefixed_error + +#endif +#endif +#if IN_HEADER(__G_FILEUTILS_H__) +#if IN_FILE(__G_FILEUTILS_C__) +extern __typeof (g_build_filename) IA__g_build_filename __attribute((visibility("hidden"))) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +#define g_build_filename IA__g_build_filename + +extern __typeof (g_build_filenamev) IA__g_build_filenamev __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_build_filenamev IA__g_build_filenamev + +extern __typeof (g_build_path) IA__g_build_path __attribute((visibility("hidden"))) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +#define g_build_path IA__g_build_path + +extern __typeof (g_build_pathv) IA__g_build_pathv __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_build_pathv IA__g_build_pathv + +extern __typeof (g_file_error_from_errno) IA__g_file_error_from_errno __attribute((visibility("hidden"))); +#define g_file_error_from_errno IA__g_file_error_from_errno + +extern __typeof (g_file_error_quark) IA__g_file_error_quark __attribute((visibility("hidden"))); +#define g_file_error_quark IA__g_file_error_quark + +#ifndef _WIN64 +extern __typeof (g_file_get_contents) IA__g_file_get_contents __attribute((visibility("hidden"))); +#define g_file_get_contents IA__g_file_get_contents + +#endif +extern __typeof (g_file_set_contents) IA__g_file_set_contents __attribute((visibility("hidden"))); +#define g_file_set_contents IA__g_file_set_contents + +#ifndef _WIN64 +extern __typeof (g_file_open_tmp) IA__g_file_open_tmp __attribute((visibility("hidden"))); +#define g_file_open_tmp IA__g_file_open_tmp + +extern __typeof (g_file_test) IA__g_file_test __attribute((visibility("hidden"))); +#define g_file_test IA__g_file_test + +#endif +extern __typeof (g_file_read_link) IA__g_file_read_link __attribute((visibility("hidden"))); +#define g_file_read_link IA__g_file_read_link + +extern __typeof (g_format_size_for_display) IA__g_format_size_for_display __attribute((visibility("hidden"))); +#define g_format_size_for_display IA__g_format_size_for_display + +#ifndef _WIN64 +extern __typeof (g_mkstemp) IA__g_mkstemp __attribute((visibility("hidden"))); +#define g_mkstemp IA__g_mkstemp + +#endif +extern __typeof (g_mkstemp_full) IA__g_mkstemp_full __attribute((visibility("hidden"))); +#define g_mkstemp_full IA__g_mkstemp_full + +extern __typeof (g_mkdir_with_parents) IA__g_mkdir_with_parents __attribute((visibility("hidden"))); +#define g_mkdir_with_parents IA__g_mkdir_with_parents + +#ifdef G_OS_WIN32 +extern __typeof (g_file_get_contents_utf8) IA__g_file_get_contents_utf8 __attribute((visibility("hidden"))); +#define g_file_get_contents_utf8 IA__g_file_get_contents_utf8 + +extern __typeof (g_file_open_tmp_utf8) IA__g_file_open_tmp_utf8 __attribute((visibility("hidden"))); +#define g_file_open_tmp_utf8 IA__g_file_open_tmp_utf8 + +extern __typeof (g_file_test_utf8) IA__g_file_test_utf8 __attribute((visibility("hidden"))); +#define g_file_test_utf8 IA__g_file_test_utf8 + +extern __typeof (g_mkstemp_utf8) IA__g_mkstemp_utf8 __attribute((visibility("hidden"))); +#define g_mkstemp_utf8 IA__g_mkstemp_utf8 + +#endif +#endif +#endif +#if IN_HEADER(__G_HASH_H__) +#if IN_FILE(__G_HASH_C__) +extern __typeof (g_hash_table_destroy) IA__g_hash_table_destroy __attribute((visibility("hidden"))); +#define g_hash_table_destroy IA__g_hash_table_destroy + +extern __typeof (g_hash_table_unref) IA__g_hash_table_unref __attribute((visibility("hidden"))); +#define g_hash_table_unref IA__g_hash_table_unref + +extern __typeof (g_hash_table_ref) IA__g_hash_table_ref __attribute((visibility("hidden"))); +#define g_hash_table_ref IA__g_hash_table_ref + +extern __typeof (g_hash_table_find) IA__g_hash_table_find __attribute((visibility("hidden"))); +#define g_hash_table_find IA__g_hash_table_find + +extern __typeof (g_hash_table_foreach) IA__g_hash_table_foreach __attribute((visibility("hidden"))); +#define g_hash_table_foreach IA__g_hash_table_foreach + +extern __typeof (g_hash_table_foreach_remove) IA__g_hash_table_foreach_remove __attribute((visibility("hidden"))); +#define g_hash_table_foreach_remove IA__g_hash_table_foreach_remove + +extern __typeof (g_hash_table_foreach_steal) IA__g_hash_table_foreach_steal __attribute((visibility("hidden"))); +#define g_hash_table_foreach_steal IA__g_hash_table_foreach_steal + +extern __typeof (g_hash_table_get_keys) IA__g_hash_table_get_keys __attribute((visibility("hidden"))); +#define g_hash_table_get_keys IA__g_hash_table_get_keys + +extern __typeof (g_hash_table_get_values) IA__g_hash_table_get_values __attribute((visibility("hidden"))); +#define g_hash_table_get_values IA__g_hash_table_get_values + +extern __typeof (g_hash_table_insert) IA__g_hash_table_insert __attribute((visibility("hidden"))); +#define g_hash_table_insert IA__g_hash_table_insert + +extern __typeof (g_hash_table_lookup) IA__g_hash_table_lookup __attribute((visibility("hidden"))); +#define g_hash_table_lookup IA__g_hash_table_lookup + +extern __typeof (g_hash_table_lookup_extended) IA__g_hash_table_lookup_extended __attribute((visibility("hidden"))); +#define g_hash_table_lookup_extended IA__g_hash_table_lookup_extended + +extern __typeof (g_hash_table_new) IA__g_hash_table_new __attribute((visibility("hidden"))); +#define g_hash_table_new IA__g_hash_table_new + +extern __typeof (g_hash_table_new_full) IA__g_hash_table_new_full __attribute((visibility("hidden"))); +#define g_hash_table_new_full IA__g_hash_table_new_full + +extern __typeof (g_hash_table_remove) IA__g_hash_table_remove __attribute((visibility("hidden"))); +#define g_hash_table_remove IA__g_hash_table_remove + +extern __typeof (g_hash_table_remove_all) IA__g_hash_table_remove_all __attribute((visibility("hidden"))); +#define g_hash_table_remove_all IA__g_hash_table_remove_all + +extern __typeof (g_hash_table_replace) IA__g_hash_table_replace __attribute((visibility("hidden"))); +#define g_hash_table_replace IA__g_hash_table_replace + +extern __typeof (g_hash_table_size) IA__g_hash_table_size __attribute((visibility("hidden"))); +#define g_hash_table_size IA__g_hash_table_size + +extern __typeof (g_hash_table_steal) IA__g_hash_table_steal __attribute((visibility("hidden"))); +#define g_hash_table_steal IA__g_hash_table_steal + +extern __typeof (g_hash_table_steal_all) IA__g_hash_table_steal_all __attribute((visibility("hidden"))); +#define g_hash_table_steal_all IA__g_hash_table_steal_all + +extern __typeof (g_hash_table_iter_init) IA__g_hash_table_iter_init __attribute((visibility("hidden"))); +#define g_hash_table_iter_init IA__g_hash_table_iter_init + +extern __typeof (g_hash_table_iter_next) IA__g_hash_table_iter_next __attribute((visibility("hidden"))); +#define g_hash_table_iter_next IA__g_hash_table_iter_next + +extern __typeof (g_hash_table_iter_get_hash_table) IA__g_hash_table_iter_get_hash_table __attribute((visibility("hidden"))); +#define g_hash_table_iter_get_hash_table IA__g_hash_table_iter_get_hash_table + +extern __typeof (g_hash_table_iter_remove) IA__g_hash_table_iter_remove __attribute((visibility("hidden"))); +#define g_hash_table_iter_remove IA__g_hash_table_iter_remove + +extern __typeof (g_hash_table_iter_steal) IA__g_hash_table_iter_steal __attribute((visibility("hidden"))); +#define g_hash_table_iter_steal IA__g_hash_table_iter_steal + +#endif +#endif +#if IN_HEADER(__G_HOOK_H__) +#if IN_FILE(__G_HOOK_C__) +extern __typeof (g_hook_alloc) IA__g_hook_alloc __attribute((visibility("hidden"))); +#define g_hook_alloc IA__g_hook_alloc + +extern __typeof (g_hook_compare_ids) IA__g_hook_compare_ids __attribute((visibility("hidden"))); +#define g_hook_compare_ids IA__g_hook_compare_ids + +extern __typeof (g_hook_destroy) IA__g_hook_destroy __attribute((visibility("hidden"))); +#define g_hook_destroy IA__g_hook_destroy + +extern __typeof (g_hook_destroy_link) IA__g_hook_destroy_link __attribute((visibility("hidden"))); +#define g_hook_destroy_link IA__g_hook_destroy_link + +extern __typeof (g_hook_find) IA__g_hook_find __attribute((visibility("hidden"))); +#define g_hook_find IA__g_hook_find + +extern __typeof (g_hook_find_data) IA__g_hook_find_data __attribute((visibility("hidden"))); +#define g_hook_find_data IA__g_hook_find_data + +extern __typeof (g_hook_find_func) IA__g_hook_find_func __attribute((visibility("hidden"))); +#define g_hook_find_func IA__g_hook_find_func + +extern __typeof (g_hook_find_func_data) IA__g_hook_find_func_data __attribute((visibility("hidden"))); +#define g_hook_find_func_data IA__g_hook_find_func_data + +extern __typeof (g_hook_first_valid) IA__g_hook_first_valid __attribute((visibility("hidden"))); +#define g_hook_first_valid IA__g_hook_first_valid + +extern __typeof (g_hook_free) IA__g_hook_free __attribute((visibility("hidden"))); +#define g_hook_free IA__g_hook_free + +extern __typeof (g_hook_get) IA__g_hook_get __attribute((visibility("hidden"))); +#define g_hook_get IA__g_hook_get + +extern __typeof (g_hook_insert_before) IA__g_hook_insert_before __attribute((visibility("hidden"))); +#define g_hook_insert_before IA__g_hook_insert_before + +extern __typeof (g_hook_insert_sorted) IA__g_hook_insert_sorted __attribute((visibility("hidden"))); +#define g_hook_insert_sorted IA__g_hook_insert_sorted + +extern __typeof (g_hook_list_clear) IA__g_hook_list_clear __attribute((visibility("hidden"))); +#define g_hook_list_clear IA__g_hook_list_clear + +extern __typeof (g_hook_list_init) IA__g_hook_list_init __attribute((visibility("hidden"))); +#define g_hook_list_init IA__g_hook_list_init + +extern __typeof (g_hook_list_invoke) IA__g_hook_list_invoke __attribute((visibility("hidden"))); +#define g_hook_list_invoke IA__g_hook_list_invoke + +extern __typeof (g_hook_list_invoke_check) IA__g_hook_list_invoke_check __attribute((visibility("hidden"))); +#define g_hook_list_invoke_check IA__g_hook_list_invoke_check + +extern __typeof (g_hook_list_marshal) IA__g_hook_list_marshal __attribute((visibility("hidden"))); +#define g_hook_list_marshal IA__g_hook_list_marshal + +extern __typeof (g_hook_list_marshal_check) IA__g_hook_list_marshal_check __attribute((visibility("hidden"))); +#define g_hook_list_marshal_check IA__g_hook_list_marshal_check + +extern __typeof (g_hook_next_valid) IA__g_hook_next_valid __attribute((visibility("hidden"))); +#define g_hook_next_valid IA__g_hook_next_valid + +extern __typeof (g_hook_prepend) IA__g_hook_prepend __attribute((visibility("hidden"))); +#define g_hook_prepend IA__g_hook_prepend + +extern __typeof (g_hook_ref) IA__g_hook_ref __attribute((visibility("hidden"))); +#define g_hook_ref IA__g_hook_ref + +extern __typeof (g_hook_unref) IA__g_hook_unref __attribute((visibility("hidden"))); +#define g_hook_unref IA__g_hook_unref + +#endif +#endif +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IOCHANNEL_C__) +extern __typeof (g_io_add_watch) IA__g_io_add_watch __attribute((visibility("hidden"))); +#define g_io_add_watch IA__g_io_add_watch + +extern __typeof (g_io_add_watch_full) IA__g_io_add_watch_full __attribute((visibility("hidden"))); +#define g_io_add_watch_full IA__g_io_add_watch_full + +extern __typeof (g_io_create_watch) IA__g_io_create_watch __attribute((visibility("hidden"))); +#define g_io_create_watch IA__g_io_create_watch + +extern __typeof (g_io_channel_error_from_errno) IA__g_io_channel_error_from_errno __attribute((visibility("hidden"))); +#define g_io_channel_error_from_errno IA__g_io_channel_error_from_errno + +extern __typeof (g_io_channel_error_quark) IA__g_io_channel_error_quark __attribute((visibility("hidden"))); +#define g_io_channel_error_quark IA__g_io_channel_error_quark + +extern __typeof (g_io_channel_flush) IA__g_io_channel_flush __attribute((visibility("hidden"))); +#define g_io_channel_flush IA__g_io_channel_flush + +extern __typeof (g_io_channel_get_buffer_condition) IA__g_io_channel_get_buffer_condition __attribute((visibility("hidden"))); +#define g_io_channel_get_buffer_condition IA__g_io_channel_get_buffer_condition + +extern __typeof (g_io_channel_get_buffered) IA__g_io_channel_get_buffered __attribute((visibility("hidden"))); +#define g_io_channel_get_buffered IA__g_io_channel_get_buffered + +extern __typeof (g_io_channel_get_buffer_size) IA__g_io_channel_get_buffer_size __attribute((visibility("hidden"))); +#define g_io_channel_get_buffer_size IA__g_io_channel_get_buffer_size + +extern __typeof (g_io_channel_get_close_on_unref) IA__g_io_channel_get_close_on_unref __attribute((visibility("hidden"))); +#define g_io_channel_get_close_on_unref IA__g_io_channel_get_close_on_unref + +extern __typeof (g_io_channel_get_encoding) IA__g_io_channel_get_encoding __attribute((visibility("hidden"))); +#define g_io_channel_get_encoding IA__g_io_channel_get_encoding + +extern __typeof (g_io_channel_get_flags) IA__g_io_channel_get_flags __attribute((visibility("hidden"))); +#define g_io_channel_get_flags IA__g_io_channel_get_flags + +extern __typeof (g_io_channel_get_line_term) IA__g_io_channel_get_line_term __attribute((visibility("hidden"))); +#define g_io_channel_get_line_term IA__g_io_channel_get_line_term + +extern __typeof (g_io_channel_init) IA__g_io_channel_init __attribute((visibility("hidden"))); +#define g_io_channel_init IA__g_io_channel_init + +extern __typeof (g_io_channel_read_chars) IA__g_io_channel_read_chars __attribute((visibility("hidden"))); +#define g_io_channel_read_chars IA__g_io_channel_read_chars + +extern __typeof (g_io_channel_read_line) IA__g_io_channel_read_line __attribute((visibility("hidden"))); +#define g_io_channel_read_line IA__g_io_channel_read_line + +extern __typeof (g_io_channel_read_line_string) IA__g_io_channel_read_line_string __attribute((visibility("hidden"))); +#define g_io_channel_read_line_string IA__g_io_channel_read_line_string + +extern __typeof (g_io_channel_read_to_end) IA__g_io_channel_read_to_end __attribute((visibility("hidden"))); +#define g_io_channel_read_to_end IA__g_io_channel_read_to_end + +extern __typeof (g_io_channel_read_unichar) IA__g_io_channel_read_unichar __attribute((visibility("hidden"))); +#define g_io_channel_read_unichar IA__g_io_channel_read_unichar + +extern __typeof (g_io_channel_ref) IA__g_io_channel_ref __attribute((visibility("hidden"))); +#define g_io_channel_ref IA__g_io_channel_ref + +extern __typeof (g_io_channel_seek_position) IA__g_io_channel_seek_position __attribute((visibility("hidden"))); +#define g_io_channel_seek_position IA__g_io_channel_seek_position + +extern __typeof (g_io_channel_set_buffered) IA__g_io_channel_set_buffered __attribute((visibility("hidden"))); +#define g_io_channel_set_buffered IA__g_io_channel_set_buffered + +extern __typeof (g_io_channel_set_buffer_size) IA__g_io_channel_set_buffer_size __attribute((visibility("hidden"))); +#define g_io_channel_set_buffer_size IA__g_io_channel_set_buffer_size + +extern __typeof (g_io_channel_set_close_on_unref) IA__g_io_channel_set_close_on_unref __attribute((visibility("hidden"))); +#define g_io_channel_set_close_on_unref IA__g_io_channel_set_close_on_unref + +extern __typeof (g_io_channel_set_encoding) IA__g_io_channel_set_encoding __attribute((visibility("hidden"))); +#define g_io_channel_set_encoding IA__g_io_channel_set_encoding + +extern __typeof (g_io_channel_set_flags) IA__g_io_channel_set_flags __attribute((visibility("hidden"))); +#define g_io_channel_set_flags IA__g_io_channel_set_flags + +extern __typeof (g_io_channel_set_line_term) IA__g_io_channel_set_line_term __attribute((visibility("hidden"))); +#define g_io_channel_set_line_term IA__g_io_channel_set_line_term + +extern __typeof (g_io_channel_shutdown) IA__g_io_channel_shutdown __attribute((visibility("hidden"))); +#define g_io_channel_shutdown IA__g_io_channel_shutdown + +extern __typeof (g_io_channel_unref) IA__g_io_channel_unref __attribute((visibility("hidden"))); +#define g_io_channel_unref IA__g_io_channel_unref + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_io_channel_close) IA__g_io_channel_close __attribute((visibility("hidden"))); +#define g_io_channel_close IA__g_io_channel_close + +extern __typeof (g_io_channel_read) IA__g_io_channel_read __attribute((visibility("hidden"))); +#define g_io_channel_read IA__g_io_channel_read + +extern __typeof (g_io_channel_seek) IA__g_io_channel_seek __attribute((visibility("hidden"))); +#define g_io_channel_seek IA__g_io_channel_seek + +extern __typeof (g_io_channel_write) IA__g_io_channel_write __attribute((visibility("hidden"))); +#define g_io_channel_write IA__g_io_channel_write + +#endif +extern __typeof (g_io_channel_write_chars) IA__g_io_channel_write_chars __attribute((visibility("hidden"))); +#define g_io_channel_write_chars IA__g_io_channel_write_chars + +extern __typeof (g_io_channel_write_unichar) IA__g_io_channel_write_unichar __attribute((visibility("hidden"))); +#define g_io_channel_write_unichar IA__g_io_channel_write_unichar + +#endif +#endif +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IO_UNIX_C__) +#ifdef G_OS_UNIX +extern __typeof (g_io_channel_unix_get_fd) IA__g_io_channel_unix_get_fd __attribute((visibility("hidden"))); +#define g_io_channel_unix_get_fd IA__g_io_channel_unix_get_fd + +extern __typeof (g_io_channel_unix_new) IA__g_io_channel_unix_new __attribute((visibility("hidden"))); +#define g_io_channel_unix_new IA__g_io_channel_unix_new + +extern __typeof (g_io_channel_new_file) IA__g_io_channel_new_file __attribute((visibility("hidden"))); +#define g_io_channel_new_file IA__g_io_channel_new_file + +#endif +#endif +#endif +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IO_WIN32_C__) +#ifdef G_OS_WIN32 +extern __typeof (g_io_channel_unix_get_fd) IA__g_io_channel_unix_get_fd __attribute((visibility("hidden"))); +#define g_io_channel_unix_get_fd IA__g_io_channel_unix_get_fd + +extern __typeof (g_io_channel_unix_new) IA__g_io_channel_unix_new __attribute((visibility("hidden"))); +#define g_io_channel_unix_new IA__g_io_channel_unix_new + +#ifndef _WIN64 +extern __typeof (g_io_channel_new_file) IA__g_io_channel_new_file __attribute((visibility("hidden"))); +#define g_io_channel_new_file IA__g_io_channel_new_file + +#endif +extern __typeof (g_io_channel_new_file_utf8) IA__g_io_channel_new_file_utf8 __attribute((visibility("hidden"))); +#define g_io_channel_new_file_utf8 IA__g_io_channel_new_file_utf8 + +extern __typeof (g_io_channel_win32_get_fd) IA__g_io_channel_win32_get_fd __attribute((visibility("hidden"))); +#define g_io_channel_win32_get_fd IA__g_io_channel_win32_get_fd + +extern __typeof (g_io_channel_win32_make_pollfd) IA__g_io_channel_win32_make_pollfd __attribute((visibility("hidden"))); +#define g_io_channel_win32_make_pollfd IA__g_io_channel_win32_make_pollfd + +extern __typeof (g_io_channel_win32_new_fd) IA__g_io_channel_win32_new_fd __attribute((visibility("hidden"))); +#define g_io_channel_win32_new_fd IA__g_io_channel_win32_new_fd + +extern __typeof (g_io_channel_win32_new_messages) IA__g_io_channel_win32_new_messages __attribute((visibility("hidden"))); +#define g_io_channel_win32_new_messages IA__g_io_channel_win32_new_messages + +extern __typeof (g_io_channel_win32_new_socket) IA__g_io_channel_win32_new_socket __attribute((visibility("hidden"))); +#define g_io_channel_win32_new_socket IA__g_io_channel_win32_new_socket + +#ifndef _WIN64 +extern __typeof (g_io_channel_win32_new_stream_socket) IA__g_io_channel_win32_new_stream_socket __attribute((visibility("hidden"))); +#define g_io_channel_win32_new_stream_socket IA__g_io_channel_win32_new_stream_socket + +#endif +extern __typeof (g_io_channel_win32_poll) IA__g_io_channel_win32_poll __attribute((visibility("hidden"))); +#define g_io_channel_win32_poll IA__g_io_channel_win32_poll + +extern __typeof (g_io_channel_win32_set_debug) IA__g_io_channel_win32_set_debug __attribute((visibility("hidden"))); +#define g_io_channel_win32_set_debug IA__g_io_channel_win32_set_debug + +#endif +#endif +#endif +#if IN_HEADER(__G_KEY_FILE_H__) +#if IN_FILE(__G_KEY_FILE_C__) +extern __typeof (g_key_file_error_quark) IA__g_key_file_error_quark __attribute((visibility("hidden"))); +#define g_key_file_error_quark IA__g_key_file_error_quark + +extern __typeof (g_key_file_free) IA__g_key_file_free __attribute((visibility("hidden"))); +#define g_key_file_free IA__g_key_file_free + +extern __typeof (g_key_file_get_boolean) IA__g_key_file_get_boolean __attribute((visibility("hidden"))); +#define g_key_file_get_boolean IA__g_key_file_get_boolean + +extern __typeof (g_key_file_get_boolean_list) IA__g_key_file_get_boolean_list __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_boolean_list IA__g_key_file_get_boolean_list + +extern __typeof (g_key_file_get_comment) IA__g_key_file_get_comment __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_comment IA__g_key_file_get_comment + +extern __typeof (g_key_file_get_groups) IA__g_key_file_get_groups __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_groups IA__g_key_file_get_groups + +extern __typeof (g_key_file_get_double) IA__g_key_file_get_double __attribute((visibility("hidden"))); +#define g_key_file_get_double IA__g_key_file_get_double + +extern __typeof (g_key_file_get_double_list) IA__g_key_file_get_double_list __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_double_list IA__g_key_file_get_double_list + +extern __typeof (g_key_file_get_integer) IA__g_key_file_get_integer __attribute((visibility("hidden"))); +#define g_key_file_get_integer IA__g_key_file_get_integer + +extern __typeof (g_key_file_get_integer_list) IA__g_key_file_get_integer_list __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_integer_list IA__g_key_file_get_integer_list + +extern __typeof (g_key_file_get_keys) IA__g_key_file_get_keys __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_keys IA__g_key_file_get_keys + +extern __typeof (g_key_file_get_locale_string) IA__g_key_file_get_locale_string __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_locale_string IA__g_key_file_get_locale_string + +extern __typeof (g_key_file_get_locale_string_list) IA__g_key_file_get_locale_string_list __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_locale_string_list IA__g_key_file_get_locale_string_list + +extern __typeof (g_key_file_get_start_group) IA__g_key_file_get_start_group __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_start_group IA__g_key_file_get_start_group + +extern __typeof (g_key_file_get_string) IA__g_key_file_get_string __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_string IA__g_key_file_get_string + +extern __typeof (g_key_file_get_string_list) IA__g_key_file_get_string_list __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_string_list IA__g_key_file_get_string_list + +extern __typeof (g_key_file_get_value) IA__g_key_file_get_value __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_get_value IA__g_key_file_get_value + +extern __typeof (g_key_file_has_group) IA__g_key_file_has_group __attribute((visibility("hidden"))); +#define g_key_file_has_group IA__g_key_file_has_group + +extern __typeof (g_key_file_has_key) IA__g_key_file_has_key __attribute((visibility("hidden"))); +#define g_key_file_has_key IA__g_key_file_has_key + +extern __typeof (g_key_file_load_from_dirs) IA__g_key_file_load_from_dirs __attribute((visibility("hidden"))); +#define g_key_file_load_from_dirs IA__g_key_file_load_from_dirs + +extern __typeof (g_key_file_load_from_data) IA__g_key_file_load_from_data __attribute((visibility("hidden"))); +#define g_key_file_load_from_data IA__g_key_file_load_from_data + +extern __typeof (g_key_file_load_from_data_dirs) IA__g_key_file_load_from_data_dirs __attribute((visibility("hidden"))); +#define g_key_file_load_from_data_dirs IA__g_key_file_load_from_data_dirs + +extern __typeof (g_key_file_load_from_file) IA__g_key_file_load_from_file __attribute((visibility("hidden"))); +#define g_key_file_load_from_file IA__g_key_file_load_from_file + +extern __typeof (g_key_file_new) IA__g_key_file_new __attribute((visibility("hidden"))); +#define g_key_file_new IA__g_key_file_new + +extern __typeof (g_key_file_remove_comment) IA__g_key_file_remove_comment __attribute((visibility("hidden"))); +#define g_key_file_remove_comment IA__g_key_file_remove_comment + +extern __typeof (g_key_file_remove_group) IA__g_key_file_remove_group __attribute((visibility("hidden"))); +#define g_key_file_remove_group IA__g_key_file_remove_group + +extern __typeof (g_key_file_remove_key) IA__g_key_file_remove_key __attribute((visibility("hidden"))); +#define g_key_file_remove_key IA__g_key_file_remove_key + +extern __typeof (g_key_file_set_boolean) IA__g_key_file_set_boolean __attribute((visibility("hidden"))); +#define g_key_file_set_boolean IA__g_key_file_set_boolean + +extern __typeof (g_key_file_set_boolean_list) IA__g_key_file_set_boolean_list __attribute((visibility("hidden"))); +#define g_key_file_set_boolean_list IA__g_key_file_set_boolean_list + +extern __typeof (g_key_file_set_comment) IA__g_key_file_set_comment __attribute((visibility("hidden"))); +#define g_key_file_set_comment IA__g_key_file_set_comment + +extern __typeof (g_key_file_set_double) IA__g_key_file_set_double __attribute((visibility("hidden"))); +#define g_key_file_set_double IA__g_key_file_set_double + +extern __typeof (g_key_file_set_double_list) IA__g_key_file_set_double_list __attribute((visibility("hidden"))); +#define g_key_file_set_double_list IA__g_key_file_set_double_list + +extern __typeof (g_key_file_set_integer) IA__g_key_file_set_integer __attribute((visibility("hidden"))); +#define g_key_file_set_integer IA__g_key_file_set_integer + +extern __typeof (g_key_file_set_integer_list) IA__g_key_file_set_integer_list __attribute((visibility("hidden"))); +#define g_key_file_set_integer_list IA__g_key_file_set_integer_list + +extern __typeof (g_key_file_set_list_separator) IA__g_key_file_set_list_separator __attribute((visibility("hidden"))); +#define g_key_file_set_list_separator IA__g_key_file_set_list_separator + +extern __typeof (g_key_file_set_locale_string) IA__g_key_file_set_locale_string __attribute((visibility("hidden"))); +#define g_key_file_set_locale_string IA__g_key_file_set_locale_string + +extern __typeof (g_key_file_set_locale_string_list) IA__g_key_file_set_locale_string_list __attribute((visibility("hidden"))); +#define g_key_file_set_locale_string_list IA__g_key_file_set_locale_string_list + +extern __typeof (g_key_file_set_string) IA__g_key_file_set_string __attribute((visibility("hidden"))); +#define g_key_file_set_string IA__g_key_file_set_string + +extern __typeof (g_key_file_set_string_list) IA__g_key_file_set_string_list __attribute((visibility("hidden"))); +#define g_key_file_set_string_list IA__g_key_file_set_string_list + +extern __typeof (g_key_file_set_value) IA__g_key_file_set_value __attribute((visibility("hidden"))); +#define g_key_file_set_value IA__g_key_file_set_value + +extern __typeof (g_key_file_to_data) IA__g_key_file_to_data __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_key_file_to_data IA__g_key_file_to_data + +#endif +#endif +#if IN_HEADER(__G_LIST_H__) +#if IN_FILE(__G_LIST_C__) +extern __typeof (g_list_alloc) IA__g_list_alloc __attribute((visibility("hidden"))); +#define g_list_alloc IA__g_list_alloc + +extern __typeof (g_list_append) IA__g_list_append __attribute((visibility("hidden"))); +#define g_list_append IA__g_list_append + +extern __typeof (g_list_concat) IA__g_list_concat __attribute((visibility("hidden"))); +#define g_list_concat IA__g_list_concat + +extern __typeof (g_list_copy) IA__g_list_copy __attribute((visibility("hidden"))); +#define g_list_copy IA__g_list_copy + +extern __typeof (g_list_delete_link) IA__g_list_delete_link __attribute((visibility("hidden"))); +#define g_list_delete_link IA__g_list_delete_link + +extern __typeof (g_list_find) IA__g_list_find __attribute((visibility("hidden"))); +#define g_list_find IA__g_list_find + +extern __typeof (g_list_find_custom) IA__g_list_find_custom __attribute((visibility("hidden"))); +#define g_list_find_custom IA__g_list_find_custom + +extern __typeof (g_list_first) IA__g_list_first __attribute((visibility("hidden"))); +#define g_list_first IA__g_list_first + +extern __typeof (g_list_foreach) IA__g_list_foreach __attribute((visibility("hidden"))); +#define g_list_foreach IA__g_list_foreach + +extern __typeof (g_list_free) IA__g_list_free __attribute((visibility("hidden"))); +#define g_list_free IA__g_list_free + +extern __typeof (g_list_free_1) IA__g_list_free_1 __attribute((visibility("hidden"))); +#define g_list_free_1 IA__g_list_free_1 + +extern __typeof (g_list_index) IA__g_list_index __attribute((visibility("hidden"))); +#define g_list_index IA__g_list_index + +extern __typeof (g_list_insert) IA__g_list_insert __attribute((visibility("hidden"))); +#define g_list_insert IA__g_list_insert + +extern __typeof (g_list_insert_before) IA__g_list_insert_before __attribute((visibility("hidden"))); +#define g_list_insert_before IA__g_list_insert_before + +extern __typeof (g_list_insert_sorted) IA__g_list_insert_sorted __attribute((visibility("hidden"))); +#define g_list_insert_sorted IA__g_list_insert_sorted + +extern __typeof (g_list_insert_sorted_with_data) IA__g_list_insert_sorted_with_data __attribute((visibility("hidden"))); +#define g_list_insert_sorted_with_data IA__g_list_insert_sorted_with_data + +extern __typeof (g_list_last) IA__g_list_last __attribute((visibility("hidden"))); +#define g_list_last IA__g_list_last + +extern __typeof (g_list_length) IA__g_list_length __attribute((visibility("hidden"))); +#define g_list_length IA__g_list_length + +extern __typeof (g_list_nth) IA__g_list_nth __attribute((visibility("hidden"))); +#define g_list_nth IA__g_list_nth + +extern __typeof (g_list_nth_data) IA__g_list_nth_data __attribute((visibility("hidden"))); +#define g_list_nth_data IA__g_list_nth_data + +extern __typeof (g_list_nth_prev) IA__g_list_nth_prev __attribute((visibility("hidden"))); +#define g_list_nth_prev IA__g_list_nth_prev + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_list_pop_allocator) IA__g_list_pop_allocator __attribute((visibility("hidden"))); +#define g_list_pop_allocator IA__g_list_pop_allocator + +#endif +extern __typeof (g_list_position) IA__g_list_position __attribute((visibility("hidden"))); +#define g_list_position IA__g_list_position + +extern __typeof (g_list_prepend) IA__g_list_prepend __attribute((visibility("hidden"))); +#define g_list_prepend IA__g_list_prepend + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_list_push_allocator) IA__g_list_push_allocator __attribute((visibility("hidden"))); +#define g_list_push_allocator IA__g_list_push_allocator + +#endif +extern __typeof (g_list_remove) IA__g_list_remove __attribute((visibility("hidden"))); +#define g_list_remove IA__g_list_remove + +extern __typeof (g_list_remove_all) IA__g_list_remove_all __attribute((visibility("hidden"))); +#define g_list_remove_all IA__g_list_remove_all + +extern __typeof (g_list_remove_link) IA__g_list_remove_link __attribute((visibility("hidden"))); +#define g_list_remove_link IA__g_list_remove_link + +extern __typeof (g_list_reverse) IA__g_list_reverse __attribute((visibility("hidden"))); +#define g_list_reverse IA__g_list_reverse + +extern __typeof (g_list_sort) IA__g_list_sort __attribute((visibility("hidden"))); +#define g_list_sort IA__g_list_sort + +extern __typeof (g_list_sort_with_data) IA__g_list_sort_with_data __attribute((visibility("hidden"))); +#define g_list_sort_with_data IA__g_list_sort_with_data + +#endif +#endif +#if IN_HEADER(__G_MAIN_H__) +#if IN_FILE(__G_MAIN_C__) +extern __typeof (g_child_watch_add) IA__g_child_watch_add __attribute((visibility("hidden"))); +#define g_child_watch_add IA__g_child_watch_add + +extern __typeof (g_child_watch_add_full) IA__g_child_watch_add_full __attribute((visibility("hidden"))); +#define g_child_watch_add_full IA__g_child_watch_add_full + +extern __typeof (g_child_watch_source_new) IA__g_child_watch_source_new __attribute((visibility("hidden"))); +#define g_child_watch_source_new IA__g_child_watch_source_new + +extern __typeof (g_get_current_time) IA__g_get_current_time __attribute((visibility("hidden"))); +#define g_get_current_time IA__g_get_current_time + +extern __typeof (g_main_context_acquire) IA__g_main_context_acquire __attribute((visibility("hidden"))); +#define g_main_context_acquire IA__g_main_context_acquire + +extern __typeof (g_main_context_add_poll) IA__g_main_context_add_poll __attribute((visibility("hidden"))); +#define g_main_context_add_poll IA__g_main_context_add_poll + +extern __typeof (g_main_context_check) IA__g_main_context_check __attribute((visibility("hidden"))); +#define g_main_context_check IA__g_main_context_check + +extern __typeof (g_main_context_default) IA__g_main_context_default __attribute((visibility("hidden"))); +#define g_main_context_default IA__g_main_context_default + +extern __typeof (g_main_context_dispatch) IA__g_main_context_dispatch __attribute((visibility("hidden"))); +#define g_main_context_dispatch IA__g_main_context_dispatch + +extern __typeof (g_main_context_find_source_by_funcs_user_data) IA__g_main_context_find_source_by_funcs_user_data __attribute((visibility("hidden"))); +#define g_main_context_find_source_by_funcs_user_data IA__g_main_context_find_source_by_funcs_user_data + +extern __typeof (g_main_context_find_source_by_id) IA__g_main_context_find_source_by_id __attribute((visibility("hidden"))); +#define g_main_context_find_source_by_id IA__g_main_context_find_source_by_id + +extern __typeof (g_main_context_find_source_by_user_data) IA__g_main_context_find_source_by_user_data __attribute((visibility("hidden"))); +#define g_main_context_find_source_by_user_data IA__g_main_context_find_source_by_user_data + +extern __typeof (g_main_context_get_poll_func) IA__g_main_context_get_poll_func __attribute((visibility("hidden"))); +#define g_main_context_get_poll_func IA__g_main_context_get_poll_func + +extern __typeof (g_main_context_get_thread_default) IA__g_main_context_get_thread_default __attribute((visibility("hidden"))); +#define g_main_context_get_thread_default IA__g_main_context_get_thread_default + +extern __typeof (g_main_context_is_owner) IA__g_main_context_is_owner __attribute((visibility("hidden"))); +#define g_main_context_is_owner IA__g_main_context_is_owner + +extern __typeof (g_main_context_iteration) IA__g_main_context_iteration __attribute((visibility("hidden"))); +#define g_main_context_iteration IA__g_main_context_iteration + +extern __typeof (g_main_context_new) IA__g_main_context_new __attribute((visibility("hidden"))); +#define g_main_context_new IA__g_main_context_new + +extern __typeof (g_main_context_pending) IA__g_main_context_pending __attribute((visibility("hidden"))); +#define g_main_context_pending IA__g_main_context_pending + +extern __typeof (g_main_context_pop_thread_default) IA__g_main_context_pop_thread_default __attribute((visibility("hidden"))); +#define g_main_context_pop_thread_default IA__g_main_context_pop_thread_default + +extern __typeof (g_main_context_prepare) IA__g_main_context_prepare __attribute((visibility("hidden"))); +#define g_main_context_prepare IA__g_main_context_prepare + +extern __typeof (g_main_context_push_thread_default) IA__g_main_context_push_thread_default __attribute((visibility("hidden"))); +#define g_main_context_push_thread_default IA__g_main_context_push_thread_default + +extern __typeof (g_main_context_query) IA__g_main_context_query __attribute((visibility("hidden"))); +#define g_main_context_query IA__g_main_context_query + +extern __typeof (g_main_context_ref) IA__g_main_context_ref __attribute((visibility("hidden"))); +#define g_main_context_ref IA__g_main_context_ref + +extern __typeof (g_main_context_release) IA__g_main_context_release __attribute((visibility("hidden"))); +#define g_main_context_release IA__g_main_context_release + +extern __typeof (g_main_context_remove_poll) IA__g_main_context_remove_poll __attribute((visibility("hidden"))); +#define g_main_context_remove_poll IA__g_main_context_remove_poll + +extern __typeof (g_main_context_set_poll_func) IA__g_main_context_set_poll_func __attribute((visibility("hidden"))); +#define g_main_context_set_poll_func IA__g_main_context_set_poll_func + +extern __typeof (g_main_context_unref) IA__g_main_context_unref __attribute((visibility("hidden"))); +#define g_main_context_unref IA__g_main_context_unref + +extern __typeof (g_main_context_wait) IA__g_main_context_wait __attribute((visibility("hidden"))); +#define g_main_context_wait IA__g_main_context_wait + +extern __typeof (g_main_context_wakeup) IA__g_main_context_wakeup __attribute((visibility("hidden"))); +#define g_main_context_wakeup IA__g_main_context_wakeup + +extern __typeof (g_main_depth) IA__g_main_depth __attribute((visibility("hidden"))); +#define g_main_depth IA__g_main_depth + +extern __typeof (g_main_current_source) IA__g_main_current_source __attribute((visibility("hidden"))); +#define g_main_current_source IA__g_main_current_source + +extern __typeof (g_main_loop_get_context) IA__g_main_loop_get_context __attribute((visibility("hidden"))); +#define g_main_loop_get_context IA__g_main_loop_get_context + +extern __typeof (g_main_loop_is_running) IA__g_main_loop_is_running __attribute((visibility("hidden"))); +#define g_main_loop_is_running IA__g_main_loop_is_running + +extern __typeof (g_main_loop_new) IA__g_main_loop_new __attribute((visibility("hidden"))); +#define g_main_loop_new IA__g_main_loop_new + +extern __typeof (g_main_loop_quit) IA__g_main_loop_quit __attribute((visibility("hidden"))); +#define g_main_loop_quit IA__g_main_loop_quit + +extern __typeof (g_main_loop_ref) IA__g_main_loop_ref __attribute((visibility("hidden"))); +#define g_main_loop_ref IA__g_main_loop_ref + +extern __typeof (g_main_loop_run) IA__g_main_loop_run __attribute((visibility("hidden"))); +#define g_main_loop_run IA__g_main_loop_run + +extern __typeof (g_main_loop_unref) IA__g_main_loop_unref __attribute((visibility("hidden"))); +#define g_main_loop_unref IA__g_main_loop_unref + +extern __typeof (g_source_add_poll) IA__g_source_add_poll __attribute((visibility("hidden"))); +#define g_source_add_poll IA__g_source_add_poll + +extern __typeof (g_source_attach) IA__g_source_attach __attribute((visibility("hidden"))); +#define g_source_attach IA__g_source_attach + +extern __typeof (g_source_destroy) IA__g_source_destroy __attribute((visibility("hidden"))); +#define g_source_destroy IA__g_source_destroy + +extern __typeof (g_source_get_can_recurse) IA__g_source_get_can_recurse __attribute((visibility("hidden"))); +#define g_source_get_can_recurse IA__g_source_get_can_recurse + +extern __typeof (g_source_get_context) IA__g_source_get_context __attribute((visibility("hidden"))); +#define g_source_get_context IA__g_source_get_context + +extern __typeof (g_source_get_current_time) IA__g_source_get_current_time __attribute((visibility("hidden"))); +#define g_source_get_current_time IA__g_source_get_current_time + +extern __typeof (g_source_get_id) IA__g_source_get_id __attribute((visibility("hidden"))); +#define g_source_get_id IA__g_source_get_id + +extern __typeof (g_source_get_priority) IA__g_source_get_priority __attribute((visibility("hidden"))); +#define g_source_get_priority IA__g_source_get_priority + +extern __typeof (g_source_new) IA__g_source_new __attribute((visibility("hidden"))); +#define g_source_new IA__g_source_new + +extern __typeof (g_source_ref) IA__g_source_ref __attribute((visibility("hidden"))); +#define g_source_ref IA__g_source_ref + +extern __typeof (g_source_remove) IA__g_source_remove __attribute((visibility("hidden"))); +#define g_source_remove IA__g_source_remove + +extern __typeof (g_source_remove_by_funcs_user_data) IA__g_source_remove_by_funcs_user_data __attribute((visibility("hidden"))); +#define g_source_remove_by_funcs_user_data IA__g_source_remove_by_funcs_user_data + +extern __typeof (g_source_remove_by_user_data) IA__g_source_remove_by_user_data __attribute((visibility("hidden"))); +#define g_source_remove_by_user_data IA__g_source_remove_by_user_data + +extern __typeof (g_source_remove_poll) IA__g_source_remove_poll __attribute((visibility("hidden"))); +#define g_source_remove_poll IA__g_source_remove_poll + +extern __typeof (g_source_set_callback) IA__g_source_set_callback __attribute((visibility("hidden"))); +#define g_source_set_callback IA__g_source_set_callback + +extern __typeof (g_source_set_callback_indirect) IA__g_source_set_callback_indirect __attribute((visibility("hidden"))); +#define g_source_set_callback_indirect IA__g_source_set_callback_indirect + +extern __typeof (g_source_set_can_recurse) IA__g_source_set_can_recurse __attribute((visibility("hidden"))); +#define g_source_set_can_recurse IA__g_source_set_can_recurse + +extern __typeof (g_source_set_funcs) IA__g_source_set_funcs __attribute((visibility("hidden"))); +#define g_source_set_funcs IA__g_source_set_funcs + +extern __typeof (g_source_is_destroyed) IA__g_source_is_destroyed __attribute((visibility("hidden"))); +#define g_source_is_destroyed IA__g_source_is_destroyed + +extern __typeof (g_source_set_priority) IA__g_source_set_priority __attribute((visibility("hidden"))); +#define g_source_set_priority IA__g_source_set_priority + +extern __typeof (g_source_unref) IA__g_source_unref __attribute((visibility("hidden"))); +#define g_source_unref IA__g_source_unref + +extern __typeof (g_idle_add) IA__g_idle_add __attribute((visibility("hidden"))); +#define g_idle_add IA__g_idle_add + +extern __typeof (g_idle_add_full) IA__g_idle_add_full __attribute((visibility("hidden"))); +#define g_idle_add_full IA__g_idle_add_full + +extern __typeof (g_idle_remove_by_data) IA__g_idle_remove_by_data __attribute((visibility("hidden"))); +#define g_idle_remove_by_data IA__g_idle_remove_by_data + +extern __typeof (g_idle_source_new) IA__g_idle_source_new __attribute((visibility("hidden"))); +#define g_idle_source_new IA__g_idle_source_new + +extern __typeof (g_timeout_add) IA__g_timeout_add __attribute((visibility("hidden"))); +#define g_timeout_add IA__g_timeout_add + +extern __typeof (g_timeout_add_seconds) IA__g_timeout_add_seconds __attribute((visibility("hidden"))); +#define g_timeout_add_seconds IA__g_timeout_add_seconds + +extern __typeof (g_timeout_add_full) IA__g_timeout_add_full __attribute((visibility("hidden"))); +#define g_timeout_add_full IA__g_timeout_add_full + +extern __typeof (g_timeout_add_seconds_full) IA__g_timeout_add_seconds_full __attribute((visibility("hidden"))); +#define g_timeout_add_seconds_full IA__g_timeout_add_seconds_full + +extern __typeof (g_timeout_source_new) IA__g_timeout_source_new __attribute((visibility("hidden"))); +#define g_timeout_source_new IA__g_timeout_source_new + +extern __typeof (g_timeout_source_new_seconds) IA__g_timeout_source_new_seconds __attribute((visibility("hidden"))); +#define g_timeout_source_new_seconds IA__g_timeout_source_new_seconds + +#endif +#endif +#if IN_HEADER(__G_MAPPED_FILE_H__) +#if IN_FILE(__G_MAPPED_FILE_C__) +extern __typeof (g_mapped_file_new) IA__g_mapped_file_new __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_mapped_file_new IA__g_mapped_file_new + +extern __typeof (g_mapped_file_get_length) IA__g_mapped_file_get_length __attribute((visibility("hidden"))); +#define g_mapped_file_get_length IA__g_mapped_file_get_length + +extern __typeof (g_mapped_file_get_contents) IA__g_mapped_file_get_contents __attribute((visibility("hidden"))); +#define g_mapped_file_get_contents IA__g_mapped_file_get_contents + +extern __typeof (g_mapped_file_ref) IA__g_mapped_file_ref __attribute((visibility("hidden"))); +#define g_mapped_file_ref IA__g_mapped_file_ref + +extern __typeof (g_mapped_file_unref) IA__g_mapped_file_unref __attribute((visibility("hidden"))); +#define g_mapped_file_unref IA__g_mapped_file_unref + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_mapped_file_free) IA__g_mapped_file_free __attribute((visibility("hidden"))); +#define g_mapped_file_free IA__g_mapped_file_free + +#endif +#endif +#endif +#if IN_HEADER(__G_MARKUP_H__) +#if IN_FILE(__G_MARKUP_C__) +extern __typeof (g_markup_error_quark) IA__g_markup_error_quark __attribute((visibility("hidden"))); +#define g_markup_error_quark IA__g_markup_error_quark + +extern __typeof (g_markup_escape_text) IA__g_markup_escape_text __attribute((visibility("hidden"))); +#define g_markup_escape_text IA__g_markup_escape_text + +extern __typeof (g_markup_parse_context_end_parse) IA__g_markup_parse_context_end_parse __attribute((visibility("hidden"))); +#define g_markup_parse_context_end_parse IA__g_markup_parse_context_end_parse + +extern __typeof (g_markup_parse_context_free) IA__g_markup_parse_context_free __attribute((visibility("hidden"))); +#define g_markup_parse_context_free IA__g_markup_parse_context_free + +extern __typeof (g_markup_parse_context_get_element) IA__g_markup_parse_context_get_element __attribute((visibility("hidden"))); +#define g_markup_parse_context_get_element IA__g_markup_parse_context_get_element + +extern __typeof (g_markup_parse_context_get_element_stack) IA__g_markup_parse_context_get_element_stack __attribute((visibility("hidden"))); +#define g_markup_parse_context_get_element_stack IA__g_markup_parse_context_get_element_stack + +extern __typeof (g_markup_parse_context_get_position) IA__g_markup_parse_context_get_position __attribute((visibility("hidden"))); +#define g_markup_parse_context_get_position IA__g_markup_parse_context_get_position + +extern __typeof (g_markup_parse_context_get_user_data) IA__g_markup_parse_context_get_user_data __attribute((visibility("hidden"))); +#define g_markup_parse_context_get_user_data IA__g_markup_parse_context_get_user_data + +extern __typeof (g_markup_parse_context_new) IA__g_markup_parse_context_new __attribute((visibility("hidden"))); +#define g_markup_parse_context_new IA__g_markup_parse_context_new + +extern __typeof (g_markup_parse_context_parse) IA__g_markup_parse_context_parse __attribute((visibility("hidden"))); +#define g_markup_parse_context_parse IA__g_markup_parse_context_parse + +extern __typeof (g_markup_parse_context_push) IA__g_markup_parse_context_push __attribute((visibility("hidden"))); +#define g_markup_parse_context_push IA__g_markup_parse_context_push + +extern __typeof (g_markup_parse_context_pop) IA__g_markup_parse_context_pop __attribute((visibility("hidden"))); +#define g_markup_parse_context_pop IA__g_markup_parse_context_pop + +extern __typeof (g_markup_printf_escaped) IA__g_markup_printf_escaped __attribute((visibility("hidden"))) G_GNUC_PRINTF(1,2); +#define g_markup_printf_escaped IA__g_markup_printf_escaped + +extern __typeof (g_markup_vprintf_escaped) IA__g_markup_vprintf_escaped __attribute((visibility("hidden"))); +#define g_markup_vprintf_escaped IA__g_markup_vprintf_escaped + +extern __typeof (g_markup_collect_attributes) IA__g_markup_collect_attributes __attribute((visibility("hidden"))); +#define g_markup_collect_attributes IA__g_markup_collect_attributes + +#endif +#endif +#if IN_HEADER(__G_MEM_H__) +#if IN_FILE(__G_MEM_C__) +extern __typeof (g_free) IA__g_free __attribute((visibility("hidden"))); +#define g_free IA__g_free + +extern __typeof (g_malloc) IA__g_malloc __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_malloc IA__g_malloc + +extern __typeof (g_malloc0) IA__g_malloc0 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_malloc0 IA__g_malloc0 + +extern __typeof (g_malloc_n) IA__g_malloc_n __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_malloc_n IA__g_malloc_n + +extern __typeof (g_malloc0_n) IA__g_malloc0_n __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_malloc0_n IA__g_malloc0_n + +extern __typeof (g_mem_is_system_malloc) IA__g_mem_is_system_malloc __attribute((visibility("hidden"))); +#define g_mem_is_system_malloc IA__g_mem_is_system_malloc + +extern __typeof (g_mem_profile) IA__g_mem_profile __attribute((visibility("hidden"))); +#define g_mem_profile IA__g_mem_profile + +extern __typeof (g_mem_set_vtable) IA__g_mem_set_vtable __attribute((visibility("hidden"))); +#define g_mem_set_vtable IA__g_mem_set_vtable + +extern __typeof (g_realloc) IA__g_realloc __attribute((visibility("hidden"))); +#define g_realloc IA__g_realloc + +extern __typeof (g_realloc_n) IA__g_realloc_n __attribute((visibility("hidden"))); +#define g_realloc_n IA__g_realloc_n + +extern __typeof (g_try_malloc) IA__g_try_malloc __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_try_malloc IA__g_try_malloc + +extern __typeof (g_try_malloc0) IA__g_try_malloc0 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_try_malloc0 IA__g_try_malloc0 + +extern __typeof (g_try_malloc_n) IA__g_try_malloc_n __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_try_malloc_n IA__g_try_malloc_n + +extern __typeof (g_try_malloc0_n) IA__g_try_malloc0_n __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_try_malloc0_n IA__g_try_malloc0_n + +extern __typeof (g_try_realloc) IA__g_try_realloc __attribute((visibility("hidden"))); +#define g_try_realloc IA__g_try_realloc + +extern __typeof (g_try_realloc_n) IA__g_try_realloc_n __attribute((visibility("hidden"))); +#define g_try_realloc_n IA__g_try_realloc_n + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_allocator_free) IA__g_allocator_free __attribute((visibility("hidden"))); +#define g_allocator_free IA__g_allocator_free + +extern __typeof (g_allocator_new) IA__g_allocator_new __attribute((visibility("hidden"))); +#define g_allocator_new IA__g_allocator_new + +extern __typeof (g_mem_chunk_alloc) IA__g_mem_chunk_alloc __attribute((visibility("hidden"))); +#define g_mem_chunk_alloc IA__g_mem_chunk_alloc + +extern __typeof (g_mem_chunk_alloc0) IA__g_mem_chunk_alloc0 __attribute((visibility("hidden"))); +#define g_mem_chunk_alloc0 IA__g_mem_chunk_alloc0 + +extern __typeof (g_mem_chunk_clean) IA__g_mem_chunk_clean __attribute((visibility("hidden"))); +#define g_mem_chunk_clean IA__g_mem_chunk_clean + +extern __typeof (g_mem_chunk_destroy) IA__g_mem_chunk_destroy __attribute((visibility("hidden"))); +#define g_mem_chunk_destroy IA__g_mem_chunk_destroy + +extern __typeof (g_mem_chunk_free) IA__g_mem_chunk_free __attribute((visibility("hidden"))); +#define g_mem_chunk_free IA__g_mem_chunk_free + +extern __typeof (g_mem_chunk_info) IA__g_mem_chunk_info __attribute((visibility("hidden"))); +#define g_mem_chunk_info IA__g_mem_chunk_info + +extern __typeof (g_mem_chunk_new) IA__g_mem_chunk_new __attribute((visibility("hidden"))); +#define g_mem_chunk_new IA__g_mem_chunk_new + +extern __typeof (g_mem_chunk_print) IA__g_mem_chunk_print __attribute((visibility("hidden"))); +#define g_mem_chunk_print IA__g_mem_chunk_print + +extern __typeof (g_mem_chunk_reset) IA__g_mem_chunk_reset __attribute((visibility("hidden"))); +#define g_mem_chunk_reset IA__g_mem_chunk_reset + +extern __typeof (g_blow_chunks) IA__g_blow_chunks __attribute((visibility("hidden"))); +#define g_blow_chunks IA__g_blow_chunks + +#endif +#endif +#endif +#if IN_HEADER(__G_SLICE_H__) +#if IN_FILE(__G_SLICE_C__) +extern __typeof (g_slice_alloc) IA__g_slice_alloc __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_slice_alloc IA__g_slice_alloc + +extern __typeof (g_slice_alloc0) IA__g_slice_alloc0 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_slice_alloc0 IA__g_slice_alloc0 + +extern __typeof (g_slice_copy) IA__g_slice_copy __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_slice_copy IA__g_slice_copy + +extern __typeof (g_slice_free1) IA__g_slice_free1 __attribute((visibility("hidden"))); +#define g_slice_free1 IA__g_slice_free1 + +extern __typeof (g_slice_free_chain_with_offset) IA__g_slice_free_chain_with_offset __attribute((visibility("hidden"))); +#define g_slice_free_chain_with_offset IA__g_slice_free_chain_with_offset + +extern __typeof (g_slice_set_config) IA__g_slice_set_config __attribute((visibility("hidden"))); +#define g_slice_set_config IA__g_slice_set_config + +extern __typeof (g_slice_get_config) IA__g_slice_get_config __attribute((visibility("hidden"))); +#define g_slice_get_config IA__g_slice_get_config + +extern __typeof (g_slice_get_config_state) IA__g_slice_get_config_state __attribute((visibility("hidden"))); +#define g_slice_get_config_state IA__g_slice_get_config_state + +#ifdef G_ENABLE_DEBUG +#endif +#endif +#endif +#if IN_HEADER(__G_MESSAGES_H__) +#if IN_FILE(__G_MESSAGES_C__) +extern __typeof (g_printf_string_upper_bound) IA__g_printf_string_upper_bound __attribute((visibility("hidden"))); +#define g_printf_string_upper_bound IA__g_printf_string_upper_bound + +extern __typeof (g_log) IA__g_log __attribute((visibility("hidden"))) G_GNUC_PRINTF(3,4); +#define g_log IA__g_log + +extern __typeof (g_log_default_handler) IA__g_log_default_handler __attribute((visibility("hidden"))); +#define g_log_default_handler IA__g_log_default_handler + +extern __typeof (g_log_remove_handler) IA__g_log_remove_handler __attribute((visibility("hidden"))); +#define g_log_remove_handler IA__g_log_remove_handler + +extern __typeof (g_log_set_always_fatal) IA__g_log_set_always_fatal __attribute((visibility("hidden"))); +#define g_log_set_always_fatal IA__g_log_set_always_fatal + +extern __typeof (g_log_set_default_handler) IA__g_log_set_default_handler __attribute((visibility("hidden"))); +#define g_log_set_default_handler IA__g_log_set_default_handler + +extern __typeof (g_log_set_fatal_mask) IA__g_log_set_fatal_mask __attribute((visibility("hidden"))); +#define g_log_set_fatal_mask IA__g_log_set_fatal_mask + +extern __typeof (g_log_set_handler) IA__g_log_set_handler __attribute((visibility("hidden"))); +#define g_log_set_handler IA__g_log_set_handler + +extern __typeof (g_logv) IA__g_logv __attribute((visibility("hidden"))); +#define g_logv IA__g_logv + +extern __typeof (g_return_if_fail_warning) IA__g_return_if_fail_warning __attribute((visibility("hidden"))); +#define g_return_if_fail_warning IA__g_return_if_fail_warning + +extern __typeof (g_warn_message) IA__g_warn_message __attribute((visibility("hidden"))); +#define g_warn_message IA__g_warn_message + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_assert_warning) IA__g_assert_warning __attribute((visibility("hidden"))) G_GNUC_NORETURN; +#define g_assert_warning IA__g_assert_warning + +#endif +extern __typeof (g_print) IA__g_print __attribute((visibility("hidden"))) G_GNUC_PRINTF(1,2); +#define g_print IA__g_print + +extern __typeof (g_printerr) IA__g_printerr __attribute((visibility("hidden"))) G_GNUC_PRINTF(1,2); +#define g_printerr IA__g_printerr + +extern __typeof (g_set_printerr_handler) IA__g_set_printerr_handler __attribute((visibility("hidden"))); +#define g_set_printerr_handler IA__g_set_printerr_handler + +extern __typeof (g_set_print_handler) IA__g_set_print_handler __attribute((visibility("hidden"))); +#define g_set_print_handler IA__g_set_print_handler + +#endif +#endif +#if IN_HEADER(__G_NODE_H__) +#if IN_FILE(__G_NODE_C__) +extern __typeof (g_node_child_index) IA__g_node_child_index __attribute((visibility("hidden"))); +#define g_node_child_index IA__g_node_child_index + +extern __typeof (g_node_child_position) IA__g_node_child_position __attribute((visibility("hidden"))); +#define g_node_child_position IA__g_node_child_position + +extern __typeof (g_node_children_foreach) IA__g_node_children_foreach __attribute((visibility("hidden"))); +#define g_node_children_foreach IA__g_node_children_foreach + +extern __typeof (g_node_copy) IA__g_node_copy __attribute((visibility("hidden"))); +#define g_node_copy IA__g_node_copy + +extern __typeof (g_node_copy_deep) IA__g_node_copy_deep __attribute((visibility("hidden"))); +#define g_node_copy_deep IA__g_node_copy_deep + +extern __typeof (g_node_depth) IA__g_node_depth __attribute((visibility("hidden"))); +#define g_node_depth IA__g_node_depth + +extern __typeof (g_node_destroy) IA__g_node_destroy __attribute((visibility("hidden"))); +#define g_node_destroy IA__g_node_destroy + +extern __typeof (g_node_find) IA__g_node_find __attribute((visibility("hidden"))); +#define g_node_find IA__g_node_find + +extern __typeof (g_node_find_child) IA__g_node_find_child __attribute((visibility("hidden"))); +#define g_node_find_child IA__g_node_find_child + +extern __typeof (g_node_first_sibling) IA__g_node_first_sibling __attribute((visibility("hidden"))); +#define g_node_first_sibling IA__g_node_first_sibling + +extern __typeof (g_node_get_root) IA__g_node_get_root __attribute((visibility("hidden"))); +#define g_node_get_root IA__g_node_get_root + +extern __typeof (g_node_insert) IA__g_node_insert __attribute((visibility("hidden"))); +#define g_node_insert IA__g_node_insert + +extern __typeof (g_node_insert_after) IA__g_node_insert_after __attribute((visibility("hidden"))); +#define g_node_insert_after IA__g_node_insert_after + +extern __typeof (g_node_insert_before) IA__g_node_insert_before __attribute((visibility("hidden"))); +#define g_node_insert_before IA__g_node_insert_before + +extern __typeof (g_node_is_ancestor) IA__g_node_is_ancestor __attribute((visibility("hidden"))); +#define g_node_is_ancestor IA__g_node_is_ancestor + +extern __typeof (g_node_last_child) IA__g_node_last_child __attribute((visibility("hidden"))); +#define g_node_last_child IA__g_node_last_child + +extern __typeof (g_node_last_sibling) IA__g_node_last_sibling __attribute((visibility("hidden"))); +#define g_node_last_sibling IA__g_node_last_sibling + +extern __typeof (g_node_max_height) IA__g_node_max_height __attribute((visibility("hidden"))); +#define g_node_max_height IA__g_node_max_height + +extern __typeof (g_node_n_children) IA__g_node_n_children __attribute((visibility("hidden"))); +#define g_node_n_children IA__g_node_n_children + +extern __typeof (g_node_new) IA__g_node_new __attribute((visibility("hidden"))); +#define g_node_new IA__g_node_new + +extern __typeof (g_node_n_nodes) IA__g_node_n_nodes __attribute((visibility("hidden"))); +#define g_node_n_nodes IA__g_node_n_nodes + +extern __typeof (g_node_nth_child) IA__g_node_nth_child __attribute((visibility("hidden"))); +#define g_node_nth_child IA__g_node_nth_child + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_node_pop_allocator) IA__g_node_pop_allocator __attribute((visibility("hidden"))); +#define g_node_pop_allocator IA__g_node_pop_allocator + +#endif +extern __typeof (g_node_prepend) IA__g_node_prepend __attribute((visibility("hidden"))); +#define g_node_prepend IA__g_node_prepend + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_node_push_allocator) IA__g_node_push_allocator __attribute((visibility("hidden"))); +#define g_node_push_allocator IA__g_node_push_allocator + +#endif +extern __typeof (g_node_reverse_children) IA__g_node_reverse_children __attribute((visibility("hidden"))); +#define g_node_reverse_children IA__g_node_reverse_children + +extern __typeof (g_node_traverse) IA__g_node_traverse __attribute((visibility("hidden"))); +#define g_node_traverse IA__g_node_traverse + +extern __typeof (g_node_unlink) IA__g_node_unlink __attribute((visibility("hidden"))); +#define g_node_unlink IA__g_node_unlink + +#endif +#endif +#if IN_HEADER(__G_OPTION_H__) +#if IN_FILE(__G_OPTION_C__) +extern __typeof (g_option_context_add_group) IA__g_option_context_add_group __attribute((visibility("hidden"))); +#define g_option_context_add_group IA__g_option_context_add_group + +extern __typeof (g_option_context_add_main_entries) IA__g_option_context_add_main_entries __attribute((visibility("hidden"))); +#define g_option_context_add_main_entries IA__g_option_context_add_main_entries + +extern __typeof (g_option_error_quark) IA__g_option_error_quark __attribute((visibility("hidden"))); +#define g_option_error_quark IA__g_option_error_quark + +extern __typeof (g_option_context_free) IA__g_option_context_free __attribute((visibility("hidden"))); +#define g_option_context_free IA__g_option_context_free + +extern __typeof (g_option_context_get_description) IA__g_option_context_get_description __attribute((visibility("hidden"))); +#define g_option_context_get_description IA__g_option_context_get_description + +extern __typeof (g_option_context_get_help_enabled) IA__g_option_context_get_help_enabled __attribute((visibility("hidden"))); +#define g_option_context_get_help_enabled IA__g_option_context_get_help_enabled + +extern __typeof (g_option_context_get_ignore_unknown_options) IA__g_option_context_get_ignore_unknown_options __attribute((visibility("hidden"))); +#define g_option_context_get_ignore_unknown_options IA__g_option_context_get_ignore_unknown_options + +extern __typeof (g_option_context_get_main_group) IA__g_option_context_get_main_group __attribute((visibility("hidden"))); +#define g_option_context_get_main_group IA__g_option_context_get_main_group + +extern __typeof (g_option_context_get_summary) IA__g_option_context_get_summary __attribute((visibility("hidden"))); +#define g_option_context_get_summary IA__g_option_context_get_summary + +extern __typeof (g_option_context_new) IA__g_option_context_new __attribute((visibility("hidden"))); +#define g_option_context_new IA__g_option_context_new + +extern __typeof (g_option_context_parse) IA__g_option_context_parse __attribute((visibility("hidden"))); +#define g_option_context_parse IA__g_option_context_parse + +extern __typeof (g_option_context_set_description) IA__g_option_context_set_description __attribute((visibility("hidden"))); +#define g_option_context_set_description IA__g_option_context_set_description + +extern __typeof (g_option_context_set_help_enabled) IA__g_option_context_set_help_enabled __attribute((visibility("hidden"))); +#define g_option_context_set_help_enabled IA__g_option_context_set_help_enabled + +extern __typeof (g_option_context_set_ignore_unknown_options) IA__g_option_context_set_ignore_unknown_options __attribute((visibility("hidden"))); +#define g_option_context_set_ignore_unknown_options IA__g_option_context_set_ignore_unknown_options + +extern __typeof (g_option_context_set_main_group) IA__g_option_context_set_main_group __attribute((visibility("hidden"))); +#define g_option_context_set_main_group IA__g_option_context_set_main_group + +extern __typeof (g_option_context_set_summary) IA__g_option_context_set_summary __attribute((visibility("hidden"))); +#define g_option_context_set_summary IA__g_option_context_set_summary + +extern __typeof (g_option_context_set_translate_func) IA__g_option_context_set_translate_func __attribute((visibility("hidden"))); +#define g_option_context_set_translate_func IA__g_option_context_set_translate_func + +extern __typeof (g_option_context_set_translation_domain) IA__g_option_context_set_translation_domain __attribute((visibility("hidden"))); +#define g_option_context_set_translation_domain IA__g_option_context_set_translation_domain + +extern __typeof (g_option_context_get_help) IA__g_option_context_get_help __attribute((visibility("hidden"))); +#define g_option_context_get_help IA__g_option_context_get_help + +extern __typeof (g_option_group_add_entries) IA__g_option_group_add_entries __attribute((visibility("hidden"))); +#define g_option_group_add_entries IA__g_option_group_add_entries + +extern __typeof (g_option_group_free) IA__g_option_group_free __attribute((visibility("hidden"))); +#define g_option_group_free IA__g_option_group_free + +extern __typeof (g_option_group_new) IA__g_option_group_new __attribute((visibility("hidden"))); +#define g_option_group_new IA__g_option_group_new + +extern __typeof (g_option_group_set_error_hook) IA__g_option_group_set_error_hook __attribute((visibility("hidden"))); +#define g_option_group_set_error_hook IA__g_option_group_set_error_hook + +extern __typeof (g_option_group_set_parse_hooks) IA__g_option_group_set_parse_hooks __attribute((visibility("hidden"))); +#define g_option_group_set_parse_hooks IA__g_option_group_set_parse_hooks + +extern __typeof (g_option_group_set_translate_func) IA__g_option_group_set_translate_func __attribute((visibility("hidden"))); +#define g_option_group_set_translate_func IA__g_option_group_set_translate_func + +extern __typeof (g_option_group_set_translation_domain) IA__g_option_group_set_translation_domain __attribute((visibility("hidden"))); +#define g_option_group_set_translation_domain IA__g_option_group_set_translation_domain + +#endif +#endif +#if IN_HEADER(__G_PATTERN_H__) +#if IN_FILE(__G_PATTERN_C__) +extern __typeof (g_pattern_match) IA__g_pattern_match __attribute((visibility("hidden"))); +#define g_pattern_match IA__g_pattern_match + +extern __typeof (g_pattern_match_simple) IA__g_pattern_match_simple __attribute((visibility("hidden"))); +#define g_pattern_match_simple IA__g_pattern_match_simple + +extern __typeof (g_pattern_match_string) IA__g_pattern_match_string __attribute((visibility("hidden"))); +#define g_pattern_match_string IA__g_pattern_match_string + +extern __typeof (g_pattern_spec_equal) IA__g_pattern_spec_equal __attribute((visibility("hidden"))); +#define g_pattern_spec_equal IA__g_pattern_spec_equal + +extern __typeof (g_pattern_spec_free) IA__g_pattern_spec_free __attribute((visibility("hidden"))); +#define g_pattern_spec_free IA__g_pattern_spec_free + +extern __typeof (g_pattern_spec_new) IA__g_pattern_spec_new __attribute((visibility("hidden"))); +#define g_pattern_spec_new IA__g_pattern_spec_new + +#endif +#endif +#if IN_HEADER(__G_POLL_H__) +#if IN_FILE(__G_POLL_C__) +extern __typeof (g_poll) IA__g_poll __attribute((visibility("hidden"))); +#define g_poll IA__g_poll + +#endif +#endif +#if IN_HEADER(__G_PRIMES_H__) +#if IN_FILE(__G_PRIMES_C__) +extern __typeof (g_spaced_primes_closest) IA__g_spaced_primes_closest __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_spaced_primes_closest IA__g_spaced_primes_closest + +#endif +#endif +#if IN_HEADER(__G_PRINTF_H__) +#if IN_FILE(__G_PRINTF_C__) +extern __typeof (g_fprintf) IA__g_fprintf __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_fprintf IA__g_fprintf + +extern __typeof (g_printf) IA__g_printf __attribute((visibility("hidden"))) G_GNUC_PRINTF(1,2); +#define g_printf IA__g_printf + +extern __typeof (g_sprintf) IA__g_sprintf __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_sprintf IA__g_sprintf + +extern __typeof (g_vasprintf) IA__g_vasprintf __attribute((visibility("hidden"))); +#define g_vasprintf IA__g_vasprintf + +extern __typeof (g_vfprintf) IA__g_vfprintf __attribute((visibility("hidden"))); +#define g_vfprintf IA__g_vfprintf + +extern __typeof (g_vprintf) IA__g_vprintf __attribute((visibility("hidden"))); +#define g_vprintf IA__g_vprintf + +extern __typeof (g_vsprintf) IA__g_vsprintf __attribute((visibility("hidden"))); +#define g_vsprintf IA__g_vsprintf + +#endif +#endif +#if IN_HEADER(__G_UTILS_H__) +#if IN_FILE(__G_PRINTF_C__) +extern __typeof (g_snprintf) IA__g_snprintf __attribute((visibility("hidden"))) G_GNUC_PRINTF(3,4); +#define g_snprintf IA__g_snprintf + +extern __typeof (g_vsnprintf) IA__g_vsnprintf __attribute((visibility("hidden"))); +#define g_vsnprintf IA__g_vsnprintf + +#endif +#endif +#if IN_HEADER(__G_QSORT_H__) +#if IN_FILE(__G_QSORT_C__) +extern __typeof (g_qsort_with_data) IA__g_qsort_with_data __attribute((visibility("hidden"))); +#define g_qsort_with_data IA__g_qsort_with_data + +#endif +#endif +#if IN_HEADER(__G_QUEUE_H__) +#if IN_FILE(__G_QUEUE_C__) +extern __typeof (g_queue_clear) IA__g_queue_clear __attribute((visibility("hidden"))); +#define g_queue_clear IA__g_queue_clear + +extern __typeof (g_queue_copy) IA__g_queue_copy __attribute((visibility("hidden"))); +#define g_queue_copy IA__g_queue_copy + +extern __typeof (g_queue_delete_link) IA__g_queue_delete_link __attribute((visibility("hidden"))); +#define g_queue_delete_link IA__g_queue_delete_link + +extern __typeof (g_queue_find) IA__g_queue_find __attribute((visibility("hidden"))); +#define g_queue_find IA__g_queue_find + +extern __typeof (g_queue_find_custom) IA__g_queue_find_custom __attribute((visibility("hidden"))); +#define g_queue_find_custom IA__g_queue_find_custom + +extern __typeof (g_queue_foreach) IA__g_queue_foreach __attribute((visibility("hidden"))); +#define g_queue_foreach IA__g_queue_foreach + +extern __typeof (g_queue_free) IA__g_queue_free __attribute((visibility("hidden"))); +#define g_queue_free IA__g_queue_free + +extern __typeof (g_queue_get_length) IA__g_queue_get_length __attribute((visibility("hidden"))); +#define g_queue_get_length IA__g_queue_get_length + +extern __typeof (g_queue_index) IA__g_queue_index __attribute((visibility("hidden"))); +#define g_queue_index IA__g_queue_index + +extern __typeof (g_queue_init) IA__g_queue_init __attribute((visibility("hidden"))); +#define g_queue_init IA__g_queue_init + +extern __typeof (g_queue_insert_after) IA__g_queue_insert_after __attribute((visibility("hidden"))); +#define g_queue_insert_after IA__g_queue_insert_after + +extern __typeof (g_queue_insert_before) IA__g_queue_insert_before __attribute((visibility("hidden"))); +#define g_queue_insert_before IA__g_queue_insert_before + +extern __typeof (g_queue_insert_sorted) IA__g_queue_insert_sorted __attribute((visibility("hidden"))); +#define g_queue_insert_sorted IA__g_queue_insert_sorted + +extern __typeof (g_queue_is_empty) IA__g_queue_is_empty __attribute((visibility("hidden"))); +#define g_queue_is_empty IA__g_queue_is_empty + +extern __typeof (g_queue_link_index) IA__g_queue_link_index __attribute((visibility("hidden"))); +#define g_queue_link_index IA__g_queue_link_index + +extern __typeof (g_queue_new) IA__g_queue_new __attribute((visibility("hidden"))); +#define g_queue_new IA__g_queue_new + +extern __typeof (g_queue_peek_head) IA__g_queue_peek_head __attribute((visibility("hidden"))); +#define g_queue_peek_head IA__g_queue_peek_head + +extern __typeof (g_queue_peek_head_link) IA__g_queue_peek_head_link __attribute((visibility("hidden"))); +#define g_queue_peek_head_link IA__g_queue_peek_head_link + +extern __typeof (g_queue_peek_nth) IA__g_queue_peek_nth __attribute((visibility("hidden"))); +#define g_queue_peek_nth IA__g_queue_peek_nth + +extern __typeof (g_queue_peek_nth_link) IA__g_queue_peek_nth_link __attribute((visibility("hidden"))); +#define g_queue_peek_nth_link IA__g_queue_peek_nth_link + +extern __typeof (g_queue_peek_tail) IA__g_queue_peek_tail __attribute((visibility("hidden"))); +#define g_queue_peek_tail IA__g_queue_peek_tail + +extern __typeof (g_queue_peek_tail_link) IA__g_queue_peek_tail_link __attribute((visibility("hidden"))); +#define g_queue_peek_tail_link IA__g_queue_peek_tail_link + +extern __typeof (g_queue_pop_head) IA__g_queue_pop_head __attribute((visibility("hidden"))); +#define g_queue_pop_head IA__g_queue_pop_head + +extern __typeof (g_queue_pop_head_link) IA__g_queue_pop_head_link __attribute((visibility("hidden"))); +#define g_queue_pop_head_link IA__g_queue_pop_head_link + +extern __typeof (g_queue_pop_nth) IA__g_queue_pop_nth __attribute((visibility("hidden"))); +#define g_queue_pop_nth IA__g_queue_pop_nth + +extern __typeof (g_queue_pop_nth_link) IA__g_queue_pop_nth_link __attribute((visibility("hidden"))); +#define g_queue_pop_nth_link IA__g_queue_pop_nth_link + +extern __typeof (g_queue_pop_tail) IA__g_queue_pop_tail __attribute((visibility("hidden"))); +#define g_queue_pop_tail IA__g_queue_pop_tail + +extern __typeof (g_queue_pop_tail_link) IA__g_queue_pop_tail_link __attribute((visibility("hidden"))); +#define g_queue_pop_tail_link IA__g_queue_pop_tail_link + +extern __typeof (g_queue_push_head) IA__g_queue_push_head __attribute((visibility("hidden"))); +#define g_queue_push_head IA__g_queue_push_head + +extern __typeof (g_queue_push_head_link) IA__g_queue_push_head_link __attribute((visibility("hidden"))); +#define g_queue_push_head_link IA__g_queue_push_head_link + +extern __typeof (g_queue_push_nth) IA__g_queue_push_nth __attribute((visibility("hidden"))); +#define g_queue_push_nth IA__g_queue_push_nth + +extern __typeof (g_queue_push_nth_link) IA__g_queue_push_nth_link __attribute((visibility("hidden"))); +#define g_queue_push_nth_link IA__g_queue_push_nth_link + +extern __typeof (g_queue_push_tail) IA__g_queue_push_tail __attribute((visibility("hidden"))); +#define g_queue_push_tail IA__g_queue_push_tail + +extern __typeof (g_queue_push_tail_link) IA__g_queue_push_tail_link __attribute((visibility("hidden"))); +#define g_queue_push_tail_link IA__g_queue_push_tail_link + +extern __typeof (g_queue_remove) IA__g_queue_remove __attribute((visibility("hidden"))); +#define g_queue_remove IA__g_queue_remove + +extern __typeof (g_queue_remove_all) IA__g_queue_remove_all __attribute((visibility("hidden"))); +#define g_queue_remove_all IA__g_queue_remove_all + +extern __typeof (g_queue_reverse) IA__g_queue_reverse __attribute((visibility("hidden"))); +#define g_queue_reverse IA__g_queue_reverse + +extern __typeof (g_queue_sort) IA__g_queue_sort __attribute((visibility("hidden"))); +#define g_queue_sort IA__g_queue_sort + +extern __typeof (g_queue_unlink) IA__g_queue_unlink __attribute((visibility("hidden"))); +#define g_queue_unlink IA__g_queue_unlink + +#endif +#endif +#if IN_HEADER(__G_RAND_H__) +#if IN_FILE(__G_RAND_C__) +extern __typeof (g_rand_copy) IA__g_rand_copy __attribute((visibility("hidden"))); +#define g_rand_copy IA__g_rand_copy + +extern __typeof (g_rand_double) IA__g_rand_double __attribute((visibility("hidden"))); +#define g_rand_double IA__g_rand_double + +extern __typeof (g_rand_double_range) IA__g_rand_double_range __attribute((visibility("hidden"))); +#define g_rand_double_range IA__g_rand_double_range + +extern __typeof (g_rand_free) IA__g_rand_free __attribute((visibility("hidden"))); +#define g_rand_free IA__g_rand_free + +extern __typeof (g_rand_int) IA__g_rand_int __attribute((visibility("hidden"))); +#define g_rand_int IA__g_rand_int + +extern __typeof (g_rand_int_range) IA__g_rand_int_range __attribute((visibility("hidden"))); +#define g_rand_int_range IA__g_rand_int_range + +extern __typeof (g_rand_new) IA__g_rand_new __attribute((visibility("hidden"))); +#define g_rand_new IA__g_rand_new + +extern __typeof (g_rand_new_with_seed) IA__g_rand_new_with_seed __attribute((visibility("hidden"))); +#define g_rand_new_with_seed IA__g_rand_new_with_seed + +extern __typeof (g_rand_new_with_seed_array) IA__g_rand_new_with_seed_array __attribute((visibility("hidden"))); +#define g_rand_new_with_seed_array IA__g_rand_new_with_seed_array + +extern __typeof (g_random_double) IA__g_random_double __attribute((visibility("hidden"))); +#define g_random_double IA__g_random_double + +extern __typeof (g_random_double_range) IA__g_random_double_range __attribute((visibility("hidden"))); +#define g_random_double_range IA__g_random_double_range + +extern __typeof (g_random_int) IA__g_random_int __attribute((visibility("hidden"))); +#define g_random_int IA__g_random_int + +extern __typeof (g_random_int_range) IA__g_random_int_range __attribute((visibility("hidden"))); +#define g_random_int_range IA__g_random_int_range + +extern __typeof (g_random_set_seed) IA__g_random_set_seed __attribute((visibility("hidden"))); +#define g_random_set_seed IA__g_random_set_seed + +extern __typeof (g_rand_set_seed) IA__g_rand_set_seed __attribute((visibility("hidden"))); +#define g_rand_set_seed IA__g_rand_set_seed + +extern __typeof (g_rand_set_seed_array) IA__g_rand_set_seed_array __attribute((visibility("hidden"))); +#define g_rand_set_seed_array IA__g_rand_set_seed_array + +#endif +#endif +#if IN_HEADER(__G_REL_H__) +#if IN_FILE(__G_REL_C__) +extern __typeof (g_relation_count) IA__g_relation_count __attribute((visibility("hidden"))); +#define g_relation_count IA__g_relation_count + +extern __typeof (g_relation_delete) IA__g_relation_delete __attribute((visibility("hidden"))); +#define g_relation_delete IA__g_relation_delete + +extern __typeof (g_relation_destroy) IA__g_relation_destroy __attribute((visibility("hidden"))); +#define g_relation_destroy IA__g_relation_destroy + +extern __typeof (g_relation_exists) IA__g_relation_exists __attribute((visibility("hidden"))); +#define g_relation_exists IA__g_relation_exists + +extern __typeof (g_relation_index) IA__g_relation_index __attribute((visibility("hidden"))); +#define g_relation_index IA__g_relation_index + +extern __typeof (g_relation_insert) IA__g_relation_insert __attribute((visibility("hidden"))); +#define g_relation_insert IA__g_relation_insert + +extern __typeof (g_relation_new) IA__g_relation_new __attribute((visibility("hidden"))); +#define g_relation_new IA__g_relation_new + +extern __typeof (g_relation_print) IA__g_relation_print __attribute((visibility("hidden"))); +#define g_relation_print IA__g_relation_print + +extern __typeof (g_relation_select) IA__g_relation_select __attribute((visibility("hidden"))); +#define g_relation_select IA__g_relation_select + +extern __typeof (g_tuples_destroy) IA__g_tuples_destroy __attribute((visibility("hidden"))); +#define g_tuples_destroy IA__g_tuples_destroy + +extern __typeof (g_tuples_index) IA__g_tuples_index __attribute((visibility("hidden"))); +#define g_tuples_index IA__g_tuples_index + +#endif +#endif +#if IN_HEADER(__G_SCANNER_H__) +#if IN_FILE(__G_SCANNER_C__) +extern __typeof (g_scanner_cur_line) IA__g_scanner_cur_line __attribute((visibility("hidden"))); +#define g_scanner_cur_line IA__g_scanner_cur_line + +extern __typeof (g_scanner_cur_position) IA__g_scanner_cur_position __attribute((visibility("hidden"))); +#define g_scanner_cur_position IA__g_scanner_cur_position + +extern __typeof (g_scanner_cur_token) IA__g_scanner_cur_token __attribute((visibility("hidden"))); +#define g_scanner_cur_token IA__g_scanner_cur_token + +extern __typeof (g_scanner_cur_value) IA__g_scanner_cur_value __attribute((visibility("hidden"))); +#define g_scanner_cur_value IA__g_scanner_cur_value + +extern __typeof (g_scanner_destroy) IA__g_scanner_destroy __attribute((visibility("hidden"))); +#define g_scanner_destroy IA__g_scanner_destroy + +extern __typeof (g_scanner_eof) IA__g_scanner_eof __attribute((visibility("hidden"))); +#define g_scanner_eof IA__g_scanner_eof + +extern __typeof (g_scanner_error) IA__g_scanner_error __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_scanner_error IA__g_scanner_error + +extern __typeof (g_scanner_get_next_token) IA__g_scanner_get_next_token __attribute((visibility("hidden"))); +#define g_scanner_get_next_token IA__g_scanner_get_next_token + +extern __typeof (g_scanner_input_file) IA__g_scanner_input_file __attribute((visibility("hidden"))); +#define g_scanner_input_file IA__g_scanner_input_file + +extern __typeof (g_scanner_input_text) IA__g_scanner_input_text __attribute((visibility("hidden"))); +#define g_scanner_input_text IA__g_scanner_input_text + +extern __typeof (g_scanner_lookup_symbol) IA__g_scanner_lookup_symbol __attribute((visibility("hidden"))); +#define g_scanner_lookup_symbol IA__g_scanner_lookup_symbol + +extern __typeof (g_scanner_new) IA__g_scanner_new __attribute((visibility("hidden"))); +#define g_scanner_new IA__g_scanner_new + +extern __typeof (g_scanner_peek_next_token) IA__g_scanner_peek_next_token __attribute((visibility("hidden"))); +#define g_scanner_peek_next_token IA__g_scanner_peek_next_token + +extern __typeof (g_scanner_scope_add_symbol) IA__g_scanner_scope_add_symbol __attribute((visibility("hidden"))); +#define g_scanner_scope_add_symbol IA__g_scanner_scope_add_symbol + +extern __typeof (g_scanner_scope_foreach_symbol) IA__g_scanner_scope_foreach_symbol __attribute((visibility("hidden"))); +#define g_scanner_scope_foreach_symbol IA__g_scanner_scope_foreach_symbol + +extern __typeof (g_scanner_scope_lookup_symbol) IA__g_scanner_scope_lookup_symbol __attribute((visibility("hidden"))); +#define g_scanner_scope_lookup_symbol IA__g_scanner_scope_lookup_symbol + +extern __typeof (g_scanner_scope_remove_symbol) IA__g_scanner_scope_remove_symbol __attribute((visibility("hidden"))); +#define g_scanner_scope_remove_symbol IA__g_scanner_scope_remove_symbol + +extern __typeof (g_scanner_set_scope) IA__g_scanner_set_scope __attribute((visibility("hidden"))); +#define g_scanner_set_scope IA__g_scanner_set_scope + +extern __typeof (g_scanner_sync_file_offset) IA__g_scanner_sync_file_offset __attribute((visibility("hidden"))); +#define g_scanner_sync_file_offset IA__g_scanner_sync_file_offset + +extern __typeof (g_scanner_unexp_token) IA__g_scanner_unexp_token __attribute((visibility("hidden"))); +#define g_scanner_unexp_token IA__g_scanner_unexp_token + +extern __typeof (g_scanner_warn) IA__g_scanner_warn __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_scanner_warn IA__g_scanner_warn + +#endif +#endif +#if IN_HEADER(__G_SEQUENCE_H__) +#if IN_FILE(__G_SEQUENCE_C__) +extern __typeof (g_sequence_new) IA__g_sequence_new __attribute((visibility("hidden"))); +#define g_sequence_new IA__g_sequence_new + +extern __typeof (g_sequence_free) IA__g_sequence_free __attribute((visibility("hidden"))); +#define g_sequence_free IA__g_sequence_free + +extern __typeof (g_sequence_get_length) IA__g_sequence_get_length __attribute((visibility("hidden"))); +#define g_sequence_get_length IA__g_sequence_get_length + +extern __typeof (g_sequence_foreach) IA__g_sequence_foreach __attribute((visibility("hidden"))); +#define g_sequence_foreach IA__g_sequence_foreach + +extern __typeof (g_sequence_foreach_range) IA__g_sequence_foreach_range __attribute((visibility("hidden"))); +#define g_sequence_foreach_range IA__g_sequence_foreach_range + +extern __typeof (g_sequence_sort) IA__g_sequence_sort __attribute((visibility("hidden"))); +#define g_sequence_sort IA__g_sequence_sort + +extern __typeof (g_sequence_sort_iter) IA__g_sequence_sort_iter __attribute((visibility("hidden"))); +#define g_sequence_sort_iter IA__g_sequence_sort_iter + +extern __typeof (g_sequence_get_begin_iter) IA__g_sequence_get_begin_iter __attribute((visibility("hidden"))); +#define g_sequence_get_begin_iter IA__g_sequence_get_begin_iter + +extern __typeof (g_sequence_get_end_iter) IA__g_sequence_get_end_iter __attribute((visibility("hidden"))); +#define g_sequence_get_end_iter IA__g_sequence_get_end_iter + +extern __typeof (g_sequence_get_iter_at_pos) IA__g_sequence_get_iter_at_pos __attribute((visibility("hidden"))); +#define g_sequence_get_iter_at_pos IA__g_sequence_get_iter_at_pos + +extern __typeof (g_sequence_append) IA__g_sequence_append __attribute((visibility("hidden"))); +#define g_sequence_append IA__g_sequence_append + +extern __typeof (g_sequence_prepend) IA__g_sequence_prepend __attribute((visibility("hidden"))); +#define g_sequence_prepend IA__g_sequence_prepend + +extern __typeof (g_sequence_insert_before) IA__g_sequence_insert_before __attribute((visibility("hidden"))); +#define g_sequence_insert_before IA__g_sequence_insert_before + +extern __typeof (g_sequence_move) IA__g_sequence_move __attribute((visibility("hidden"))); +#define g_sequence_move IA__g_sequence_move + +extern __typeof (g_sequence_swap) IA__g_sequence_swap __attribute((visibility("hidden"))); +#define g_sequence_swap IA__g_sequence_swap + +extern __typeof (g_sequence_insert_sorted) IA__g_sequence_insert_sorted __attribute((visibility("hidden"))); +#define g_sequence_insert_sorted IA__g_sequence_insert_sorted + +extern __typeof (g_sequence_insert_sorted_iter) IA__g_sequence_insert_sorted_iter __attribute((visibility("hidden"))); +#define g_sequence_insert_sorted_iter IA__g_sequence_insert_sorted_iter + +extern __typeof (g_sequence_sort_changed) IA__g_sequence_sort_changed __attribute((visibility("hidden"))); +#define g_sequence_sort_changed IA__g_sequence_sort_changed + +extern __typeof (g_sequence_sort_changed_iter) IA__g_sequence_sort_changed_iter __attribute((visibility("hidden"))); +#define g_sequence_sort_changed_iter IA__g_sequence_sort_changed_iter + +extern __typeof (g_sequence_remove) IA__g_sequence_remove __attribute((visibility("hidden"))); +#define g_sequence_remove IA__g_sequence_remove + +extern __typeof (g_sequence_remove_range) IA__g_sequence_remove_range __attribute((visibility("hidden"))); +#define g_sequence_remove_range IA__g_sequence_remove_range + +extern __typeof (g_sequence_move_range) IA__g_sequence_move_range __attribute((visibility("hidden"))); +#define g_sequence_move_range IA__g_sequence_move_range + +extern __typeof (g_sequence_search) IA__g_sequence_search __attribute((visibility("hidden"))); +#define g_sequence_search IA__g_sequence_search + +extern __typeof (g_sequence_search_iter) IA__g_sequence_search_iter __attribute((visibility("hidden"))); +#define g_sequence_search_iter IA__g_sequence_search_iter + +extern __typeof (g_sequence_get) IA__g_sequence_get __attribute((visibility("hidden"))); +#define g_sequence_get IA__g_sequence_get + +extern __typeof (g_sequence_set) IA__g_sequence_set __attribute((visibility("hidden"))); +#define g_sequence_set IA__g_sequence_set + +extern __typeof (g_sequence_iter_is_begin) IA__g_sequence_iter_is_begin __attribute((visibility("hidden"))); +#define g_sequence_iter_is_begin IA__g_sequence_iter_is_begin + +extern __typeof (g_sequence_iter_is_end) IA__g_sequence_iter_is_end __attribute((visibility("hidden"))); +#define g_sequence_iter_is_end IA__g_sequence_iter_is_end + +extern __typeof (g_sequence_iter_next) IA__g_sequence_iter_next __attribute((visibility("hidden"))); +#define g_sequence_iter_next IA__g_sequence_iter_next + +extern __typeof (g_sequence_iter_prev) IA__g_sequence_iter_prev __attribute((visibility("hidden"))); +#define g_sequence_iter_prev IA__g_sequence_iter_prev + +extern __typeof (g_sequence_iter_get_position) IA__g_sequence_iter_get_position __attribute((visibility("hidden"))); +#define g_sequence_iter_get_position IA__g_sequence_iter_get_position + +extern __typeof (g_sequence_iter_move) IA__g_sequence_iter_move __attribute((visibility("hidden"))); +#define g_sequence_iter_move IA__g_sequence_iter_move + +extern __typeof (g_sequence_iter_get_sequence) IA__g_sequence_iter_get_sequence __attribute((visibility("hidden"))); +#define g_sequence_iter_get_sequence IA__g_sequence_iter_get_sequence + +extern __typeof (g_sequence_iter_compare) IA__g_sequence_iter_compare __attribute((visibility("hidden"))); +#define g_sequence_iter_compare IA__g_sequence_iter_compare + +extern __typeof (g_sequence_range_get_midpoint) IA__g_sequence_range_get_midpoint __attribute((visibility("hidden"))); +#define g_sequence_range_get_midpoint IA__g_sequence_range_get_midpoint + +#endif +#endif +#if IN_HEADER(__G_SHELL_H__) +#if IN_FILE(__G_SHELL_C__) +extern __typeof (g_shell_error_quark) IA__g_shell_error_quark __attribute((visibility("hidden"))); +#define g_shell_error_quark IA__g_shell_error_quark + +extern __typeof (g_shell_parse_argv) IA__g_shell_parse_argv __attribute((visibility("hidden"))); +#define g_shell_parse_argv IA__g_shell_parse_argv + +extern __typeof (g_shell_quote) IA__g_shell_quote __attribute((visibility("hidden"))); +#define g_shell_quote IA__g_shell_quote + +extern __typeof (g_shell_unquote) IA__g_shell_unquote __attribute((visibility("hidden"))); +#define g_shell_unquote IA__g_shell_unquote + +#endif +#endif +#if IN_HEADER(__G_SLIST_H__) +#if IN_FILE(__G_SLIST_C__) +extern __typeof (g_slist_alloc) IA__g_slist_alloc __attribute((visibility("hidden"))); +#define g_slist_alloc IA__g_slist_alloc + +extern __typeof (g_slist_append) IA__g_slist_append __attribute((visibility("hidden"))); +#define g_slist_append IA__g_slist_append + +extern __typeof (g_slist_concat) IA__g_slist_concat __attribute((visibility("hidden"))); +#define g_slist_concat IA__g_slist_concat + +extern __typeof (g_slist_copy) IA__g_slist_copy __attribute((visibility("hidden"))); +#define g_slist_copy IA__g_slist_copy + +extern __typeof (g_slist_delete_link) IA__g_slist_delete_link __attribute((visibility("hidden"))); +#define g_slist_delete_link IA__g_slist_delete_link + +extern __typeof (g_slist_find) IA__g_slist_find __attribute((visibility("hidden"))); +#define g_slist_find IA__g_slist_find + +extern __typeof (g_slist_find_custom) IA__g_slist_find_custom __attribute((visibility("hidden"))); +#define g_slist_find_custom IA__g_slist_find_custom + +extern __typeof (g_slist_foreach) IA__g_slist_foreach __attribute((visibility("hidden"))); +#define g_slist_foreach IA__g_slist_foreach + +extern __typeof (g_slist_free) IA__g_slist_free __attribute((visibility("hidden"))); +#define g_slist_free IA__g_slist_free + +extern __typeof (g_slist_free_1) IA__g_slist_free_1 __attribute((visibility("hidden"))); +#define g_slist_free_1 IA__g_slist_free_1 + +extern __typeof (g_slist_index) IA__g_slist_index __attribute((visibility("hidden"))); +#define g_slist_index IA__g_slist_index + +extern __typeof (g_slist_insert) IA__g_slist_insert __attribute((visibility("hidden"))); +#define g_slist_insert IA__g_slist_insert + +extern __typeof (g_slist_insert_before) IA__g_slist_insert_before __attribute((visibility("hidden"))); +#define g_slist_insert_before IA__g_slist_insert_before + +extern __typeof (g_slist_insert_sorted) IA__g_slist_insert_sorted __attribute((visibility("hidden"))); +#define g_slist_insert_sorted IA__g_slist_insert_sorted + +extern __typeof (g_slist_insert_sorted_with_data) IA__g_slist_insert_sorted_with_data __attribute((visibility("hidden"))); +#define g_slist_insert_sorted_with_data IA__g_slist_insert_sorted_with_data + +extern __typeof (g_slist_last) IA__g_slist_last __attribute((visibility("hidden"))); +#define g_slist_last IA__g_slist_last + +extern __typeof (g_slist_length) IA__g_slist_length __attribute((visibility("hidden"))); +#define g_slist_length IA__g_slist_length + +extern __typeof (g_slist_nth) IA__g_slist_nth __attribute((visibility("hidden"))); +#define g_slist_nth IA__g_slist_nth + +extern __typeof (g_slist_nth_data) IA__g_slist_nth_data __attribute((visibility("hidden"))); +#define g_slist_nth_data IA__g_slist_nth_data + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_slist_pop_allocator) IA__g_slist_pop_allocator __attribute((visibility("hidden"))); +#define g_slist_pop_allocator IA__g_slist_pop_allocator + +#endif +extern __typeof (g_slist_position) IA__g_slist_position __attribute((visibility("hidden"))); +#define g_slist_position IA__g_slist_position + +extern __typeof (g_slist_prepend) IA__g_slist_prepend __attribute((visibility("hidden"))); +#define g_slist_prepend IA__g_slist_prepend + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_slist_push_allocator) IA__g_slist_push_allocator __attribute((visibility("hidden"))); +#define g_slist_push_allocator IA__g_slist_push_allocator + +#endif +extern __typeof (g_slist_remove) IA__g_slist_remove __attribute((visibility("hidden"))); +#define g_slist_remove IA__g_slist_remove + +extern __typeof (g_slist_remove_all) IA__g_slist_remove_all __attribute((visibility("hidden"))); +#define g_slist_remove_all IA__g_slist_remove_all + +extern __typeof (g_slist_remove_link) IA__g_slist_remove_link __attribute((visibility("hidden"))); +#define g_slist_remove_link IA__g_slist_remove_link + +extern __typeof (g_slist_reverse) IA__g_slist_reverse __attribute((visibility("hidden"))); +#define g_slist_reverse IA__g_slist_reverse + +extern __typeof (g_slist_sort) IA__g_slist_sort __attribute((visibility("hidden"))); +#define g_slist_sort IA__g_slist_sort + +extern __typeof (g_slist_sort_with_data) IA__g_slist_sort_with_data __attribute((visibility("hidden"))); +#define g_slist_sort_with_data IA__g_slist_sort_with_data + +#endif +#endif +#if IN_HEADER(__G_SPAWN_H__) +#if IN_FILE(__G_SPAWN_C__) +#ifndef _WIN64 +extern __typeof (g_spawn_async) IA__g_spawn_async __attribute((visibility("hidden"))); +#define g_spawn_async IA__g_spawn_async + +extern __typeof (g_spawn_async_with_pipes) IA__g_spawn_async_with_pipes __attribute((visibility("hidden"))); +#define g_spawn_async_with_pipes IA__g_spawn_async_with_pipes + +#endif +extern __typeof (g_spawn_close_pid) IA__g_spawn_close_pid __attribute((visibility("hidden"))); +#define g_spawn_close_pid IA__g_spawn_close_pid + +#ifndef _WIN64 +extern __typeof (g_spawn_command_line_async) IA__g_spawn_command_line_async __attribute((visibility("hidden"))); +#define g_spawn_command_line_async IA__g_spawn_command_line_async + +extern __typeof (g_spawn_command_line_sync) IA__g_spawn_command_line_sync __attribute((visibility("hidden"))); +#define g_spawn_command_line_sync IA__g_spawn_command_line_sync + +#endif +extern __typeof (g_spawn_error_quark) IA__g_spawn_error_quark __attribute((visibility("hidden"))); +#define g_spawn_error_quark IA__g_spawn_error_quark + +#ifndef _WIN64 +extern __typeof (g_spawn_sync) IA__g_spawn_sync __attribute((visibility("hidden"))); +#define g_spawn_sync IA__g_spawn_sync + +#endif +#ifdef G_OS_WIN32 +extern __typeof (g_spawn_async_utf8) IA__g_spawn_async_utf8 __attribute((visibility("hidden"))); +#define g_spawn_async_utf8 IA__g_spawn_async_utf8 + +extern __typeof (g_spawn_async_with_pipes_utf8) IA__g_spawn_async_with_pipes_utf8 __attribute((visibility("hidden"))); +#define g_spawn_async_with_pipes_utf8 IA__g_spawn_async_with_pipes_utf8 + +extern __typeof (g_spawn_command_line_async_utf8) IA__g_spawn_command_line_async_utf8 __attribute((visibility("hidden"))); +#define g_spawn_command_line_async_utf8 IA__g_spawn_command_line_async_utf8 + +extern __typeof (g_spawn_command_line_sync_utf8) IA__g_spawn_command_line_sync_utf8 __attribute((visibility("hidden"))); +#define g_spawn_command_line_sync_utf8 IA__g_spawn_command_line_sync_utf8 + +extern __typeof (g_spawn_sync_utf8) IA__g_spawn_sync_utf8 __attribute((visibility("hidden"))); +#define g_spawn_sync_utf8 IA__g_spawn_sync_utf8 + +#endif +#endif +#endif +#if IN_HEADER(__G_STDIO_H__) +#if IN_FILE(__G_STDIO_C__) +#if !defined(G_OS_UNIX) || defined(G_STDIO_NO_WRAP_ON_UNIX) +extern __typeof (g_chmod) IA__g_chmod __attribute((visibility("hidden"))); +#define g_chmod IA__g_chmod + +extern __typeof (g_open) IA__g_open __attribute((visibility("hidden"))); +#define g_open IA__g_open + +extern __typeof (g_creat) IA__g_creat __attribute((visibility("hidden"))); +#define g_creat IA__g_creat + +extern __typeof (g_rename) IA__g_rename __attribute((visibility("hidden"))); +#define g_rename IA__g_rename + +extern __typeof (g_mkdir) IA__g_mkdir __attribute((visibility("hidden"))); +#define g_mkdir IA__g_mkdir + +extern __typeof (g_stat) IA__g_stat __attribute((visibility("hidden"))); +#define g_stat IA__g_stat + +extern __typeof (g_lstat) IA__g_lstat __attribute((visibility("hidden"))); +#define g_lstat IA__g_lstat + +extern __typeof (g_remove) IA__g_remove __attribute((visibility("hidden"))); +#define g_remove IA__g_remove + +extern __typeof (g_fopen) IA__g_fopen __attribute((visibility("hidden"))); +#define g_fopen IA__g_fopen + +extern __typeof (g_freopen) IA__g_freopen __attribute((visibility("hidden"))); +#define g_freopen IA__g_freopen + +extern __typeof (g_utime) IA__g_utime __attribute((visibility("hidden"))); +#define g_utime IA__g_utime + +#endif +extern __typeof (g_access) IA__g_access __attribute((visibility("hidden"))); +#define g_access IA__g_access + +extern __typeof (g_chdir) IA__g_chdir __attribute((visibility("hidden"))); +#define g_chdir IA__g_chdir + +extern __typeof (g_unlink) IA__g_unlink __attribute((visibility("hidden"))); +#define g_unlink IA__g_unlink + +extern __typeof (g_rmdir) IA__g_rmdir __attribute((visibility("hidden"))); +#define g_rmdir IA__g_rmdir + +#endif +#endif +#if IN_HEADER(__G_STRFUNCS_H__) +#if IN_FILE(__G_STRFUNCS_C__) +extern __typeof (g_ascii_digit_value) IA__g_ascii_digit_value __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_ascii_digit_value IA__g_ascii_digit_value + +extern __typeof (g_ascii_dtostr) IA__g_ascii_dtostr __attribute((visibility("hidden"))); +#define g_ascii_dtostr IA__g_ascii_dtostr + +extern __typeof (g_ascii_formatd) IA__g_ascii_formatd __attribute((visibility("hidden"))); +#define g_ascii_formatd IA__g_ascii_formatd + +extern __typeof (g_ascii_strdown) IA__g_ascii_strdown __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_ascii_strdown IA__g_ascii_strdown + +extern __typeof (g_ascii_strtod) IA__g_ascii_strtod __attribute((visibility("hidden"))); +#define g_ascii_strtod IA__g_ascii_strtod + +extern __typeof (g_ascii_strtoull) IA__g_ascii_strtoull __attribute((visibility("hidden"))); +#define g_ascii_strtoull IA__g_ascii_strtoull + +extern __typeof (g_ascii_strtoll) IA__g_ascii_strtoll __attribute((visibility("hidden"))); +#define g_ascii_strtoll IA__g_ascii_strtoll + +extern __typeof (g_ascii_strup) IA__g_ascii_strup __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_ascii_strup IA__g_ascii_strup + +extern __typeof (g_ascii_tolower) IA__g_ascii_tolower __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_ascii_tolower IA__g_ascii_tolower + +extern __typeof (g_ascii_toupper) IA__g_ascii_toupper __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_ascii_toupper IA__g_ascii_toupper + +extern __typeof (g_ascii_xdigit_value) IA__g_ascii_xdigit_value __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_ascii_xdigit_value IA__g_ascii_xdigit_value + +extern __typeof (g_ascii_strcasecmp) IA__g_ascii_strcasecmp __attribute((visibility("hidden"))); +#define g_ascii_strcasecmp IA__g_ascii_strcasecmp + +extern __typeof (g_ascii_strncasecmp) IA__g_ascii_strncasecmp __attribute((visibility("hidden"))); +#define g_ascii_strncasecmp IA__g_ascii_strncasecmp + +extern __typeof (g_memdup) IA__g_memdup __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_memdup IA__g_memdup + +extern __typeof (g_stpcpy) IA__g_stpcpy __attribute((visibility("hidden"))); +#define g_stpcpy IA__g_stpcpy + +extern __typeof (g_strcanon) IA__g_strcanon __attribute((visibility("hidden"))); +#define g_strcanon IA__g_strcanon + +extern __typeof (g_strchomp) IA__g_strchomp __attribute((visibility("hidden"))); +#define g_strchomp IA__g_strchomp + +extern __typeof (g_strchug) IA__g_strchug __attribute((visibility("hidden"))); +#define g_strchug IA__g_strchug + +extern __typeof (g_strcompress) IA__g_strcompress __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strcompress IA__g_strcompress + +extern __typeof (g_strconcat) IA__g_strconcat __attribute((visibility("hidden"))) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +#define g_strconcat IA__g_strconcat + +extern __typeof (g_strdelimit) IA__g_strdelimit __attribute((visibility("hidden"))); +#define g_strdelimit IA__g_strdelimit + +extern __typeof (g_strdup) IA__g_strdup __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strdup IA__g_strdup + +extern __typeof (g_strdup_printf) IA__g_strdup_printf __attribute((visibility("hidden"))) G_GNUC_PRINTF(1,2) G_GNUC_MALLOC; +#define g_strdup_printf IA__g_strdup_printf + +extern __typeof (g_strdupv) IA__g_strdupv __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strdupv IA__g_strdupv + +extern __typeof (g_strdup_vprintf) IA__g_strdup_vprintf __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strdup_vprintf IA__g_strdup_vprintf + +extern __typeof (g_strerror) IA__g_strerror __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_strerror IA__g_strerror + +extern __typeof (g_strescape) IA__g_strescape __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strescape IA__g_strescape + +extern __typeof (g_strfreev) IA__g_strfreev __attribute((visibility("hidden"))); +#define g_strfreev IA__g_strfreev + +extern __typeof (g_str_has_prefix) IA__g_str_has_prefix __attribute((visibility("hidden"))); +#define g_str_has_prefix IA__g_str_has_prefix + +extern __typeof (g_str_has_suffix) IA__g_str_has_suffix __attribute((visibility("hidden"))); +#define g_str_has_suffix IA__g_str_has_suffix + +extern __typeof (g_strjoin) IA__g_strjoin __attribute((visibility("hidden"))) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +#define g_strjoin IA__g_strjoin + +extern __typeof (g_strjoinv) IA__g_strjoinv __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strjoinv IA__g_strjoinv + +extern __typeof (g_strlcat) IA__g_strlcat __attribute((visibility("hidden"))); +#define g_strlcat IA__g_strlcat + +extern __typeof (g_strlcpy) IA__g_strlcpy __attribute((visibility("hidden"))); +#define g_strlcpy IA__g_strlcpy + +extern __typeof (g_strndup) IA__g_strndup __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strndup IA__g_strndup + +extern __typeof (g_strnfill) IA__g_strnfill __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strnfill IA__g_strnfill + +extern __typeof (g_strreverse) IA__g_strreverse __attribute((visibility("hidden"))); +#define g_strreverse IA__g_strreverse + +extern __typeof (g_strrstr) IA__g_strrstr __attribute((visibility("hidden"))); +#define g_strrstr IA__g_strrstr + +extern __typeof (g_strrstr_len) IA__g_strrstr_len __attribute((visibility("hidden"))); +#define g_strrstr_len IA__g_strrstr_len + +extern __typeof (g_strsignal) IA__g_strsignal __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_strsignal IA__g_strsignal + +extern __typeof (g_strsplit) IA__g_strsplit __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strsplit IA__g_strsplit + +extern __typeof (g_strsplit_set) IA__g_strsplit_set __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_strsplit_set IA__g_strsplit_set + +extern __typeof (g_strstr_len) IA__g_strstr_len __attribute((visibility("hidden"))); +#define g_strstr_len IA__g_strstr_len + +extern __typeof (g_strtod) IA__g_strtod __attribute((visibility("hidden"))); +#define g_strtod IA__g_strtod + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_strcasecmp) IA__g_strcasecmp __attribute((visibility("hidden"))); +#define g_strcasecmp IA__g_strcasecmp + +extern __typeof (g_strncasecmp) IA__g_strncasecmp __attribute((visibility("hidden"))); +#define g_strncasecmp IA__g_strncasecmp + +extern __typeof (g_strup) IA__g_strup __attribute((visibility("hidden"))); +#define g_strup IA__g_strup + +extern __typeof (g_strdown) IA__g_strdown __attribute((visibility("hidden"))); +#define g_strdown IA__g_strdown + +#endif +extern __typeof (g_strv_length) IA__g_strv_length __attribute((visibility("hidden"))); +#define g_strv_length IA__g_strv_length + +extern __typeof (g_strip_context) IA__g_strip_context __attribute((visibility("hidden"))) G_GNUC_FORMAT(1); +#define g_strip_context IA__g_strip_context + +extern __typeof (g_dgettext) IA__g_dgettext __attribute((visibility("hidden"))) G_GNUC_FORMAT(2); +#define g_dgettext IA__g_dgettext + +extern __typeof (g_dngettext) IA__g_dngettext __attribute((visibility("hidden"))) G_GNUC_FORMAT(3); +#define g_dngettext IA__g_dngettext + +extern __typeof (g_dpgettext) IA__g_dpgettext __attribute((visibility("hidden"))) G_GNUC_FORMAT(2); +#define g_dpgettext IA__g_dpgettext + +extern __typeof (g_dpgettext2) IA__g_dpgettext2 __attribute((visibility("hidden"))) G_GNUC_FORMAT(3); +#define g_dpgettext2 IA__g_dpgettext2 + +#endif +#endif +#if IN_HEADER(__G_URI_FUNCS_H__) +#if IN_FILE(__G_URI_FUNCS_C__) +extern __typeof (g_uri_unescape_string) IA__g_uri_unescape_string __attribute((visibility("hidden"))); +#define g_uri_unescape_string IA__g_uri_unescape_string + +extern __typeof (g_uri_unescape_segment) IA__g_uri_unescape_segment __attribute((visibility("hidden"))); +#define g_uri_unescape_segment IA__g_uri_unescape_segment + +extern __typeof (g_uri_parse_scheme) IA__g_uri_parse_scheme __attribute((visibility("hidden"))); +#define g_uri_parse_scheme IA__g_uri_parse_scheme + +extern __typeof (g_uri_escape_string) IA__g_uri_escape_string __attribute((visibility("hidden"))); +#define g_uri_escape_string IA__g_uri_escape_string + +#endif +#endif +#if IN_HEADER(__G_STRING_H__) +#if IN_FILE(__G_STRING_C__) +extern __typeof (g_string_append) IA__g_string_append __attribute((visibility("hidden"))); +#define g_string_append IA__g_string_append + +extern __typeof (g_string_append_len) IA__g_string_append_len __attribute((visibility("hidden"))); +#define g_string_append_len IA__g_string_append_len + +extern __typeof (g_string_append_printf) IA__g_string_append_printf __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_string_append_printf IA__g_string_append_printf + +extern __typeof (g_string_append_unichar) IA__g_string_append_unichar __attribute((visibility("hidden"))); +#define g_string_append_unichar IA__g_string_append_unichar + +extern __typeof (g_string_append_vprintf) IA__g_string_append_vprintf __attribute((visibility("hidden"))); +#define g_string_append_vprintf IA__g_string_append_vprintf + +extern __typeof (g_string_ascii_down) IA__g_string_ascii_down __attribute((visibility("hidden"))); +#define g_string_ascii_down IA__g_string_ascii_down + +extern __typeof (g_string_ascii_up) IA__g_string_ascii_up __attribute((visibility("hidden"))); +#define g_string_ascii_up IA__g_string_ascii_up + +extern __typeof (g_string_assign) IA__g_string_assign __attribute((visibility("hidden"))); +#define g_string_assign IA__g_string_assign + +extern __typeof (g_string_chunk_free) IA__g_string_chunk_free __attribute((visibility("hidden"))); +#define g_string_chunk_free IA__g_string_chunk_free + +extern __typeof (g_string_chunk_clear) IA__g_string_chunk_clear __attribute((visibility("hidden"))); +#define g_string_chunk_clear IA__g_string_chunk_clear + +extern __typeof (g_string_chunk_insert) IA__g_string_chunk_insert __attribute((visibility("hidden"))); +#define g_string_chunk_insert IA__g_string_chunk_insert + +extern __typeof (g_string_chunk_insert_const) IA__g_string_chunk_insert_const __attribute((visibility("hidden"))); +#define g_string_chunk_insert_const IA__g_string_chunk_insert_const + +extern __typeof (g_string_chunk_insert_len) IA__g_string_chunk_insert_len __attribute((visibility("hidden"))); +#define g_string_chunk_insert_len IA__g_string_chunk_insert_len + +extern __typeof (g_string_chunk_new) IA__g_string_chunk_new __attribute((visibility("hidden"))); +#define g_string_chunk_new IA__g_string_chunk_new + +extern __typeof (g_string_equal) IA__g_string_equal __attribute((visibility("hidden"))); +#define g_string_equal IA__g_string_equal + +extern __typeof (g_string_erase) IA__g_string_erase __attribute((visibility("hidden"))); +#define g_string_erase IA__g_string_erase + +extern __typeof (g_string_free) IA__g_string_free __attribute((visibility("hidden"))); +#define g_string_free IA__g_string_free + +extern __typeof (g_string_hash) IA__g_string_hash __attribute((visibility("hidden"))); +#define g_string_hash IA__g_string_hash + +extern __typeof (g_string_insert) IA__g_string_insert __attribute((visibility("hidden"))); +#define g_string_insert IA__g_string_insert + +extern __typeof (g_string_insert_c) IA__g_string_insert_c __attribute((visibility("hidden"))); +#define g_string_insert_c IA__g_string_insert_c + +extern __typeof (g_string_insert_len) IA__g_string_insert_len __attribute((visibility("hidden"))); +#define g_string_insert_len IA__g_string_insert_len + +extern __typeof (g_string_insert_unichar) IA__g_string_insert_unichar __attribute((visibility("hidden"))); +#define g_string_insert_unichar IA__g_string_insert_unichar + +extern __typeof (g_string_new) IA__g_string_new __attribute((visibility("hidden"))); +#define g_string_new IA__g_string_new + +extern __typeof (g_string_new_len) IA__g_string_new_len __attribute((visibility("hidden"))); +#define g_string_new_len IA__g_string_new_len + +extern __typeof (g_string_overwrite) IA__g_string_overwrite __attribute((visibility("hidden"))); +#define g_string_overwrite IA__g_string_overwrite + +extern __typeof (g_string_overwrite_len) IA__g_string_overwrite_len __attribute((visibility("hidden"))); +#define g_string_overwrite_len IA__g_string_overwrite_len + +extern __typeof (g_string_prepend) IA__g_string_prepend __attribute((visibility("hidden"))); +#define g_string_prepend IA__g_string_prepend + +extern __typeof (g_string_prepend_c) IA__g_string_prepend_c __attribute((visibility("hidden"))); +#define g_string_prepend_c IA__g_string_prepend_c + +extern __typeof (g_string_prepend_len) IA__g_string_prepend_len __attribute((visibility("hidden"))); +#define g_string_prepend_len IA__g_string_prepend_len + +extern __typeof (g_string_prepend_unichar) IA__g_string_prepend_unichar __attribute((visibility("hidden"))); +#define g_string_prepend_unichar IA__g_string_prepend_unichar + +extern __typeof (g_string_printf) IA__g_string_printf __attribute((visibility("hidden"))) G_GNUC_PRINTF(2,3); +#define g_string_printf IA__g_string_printf + +extern __typeof (g_string_set_size) IA__g_string_set_size __attribute((visibility("hidden"))); +#define g_string_set_size IA__g_string_set_size + +extern __typeof (g_string_sized_new) IA__g_string_sized_new __attribute((visibility("hidden"))); +#define g_string_sized_new IA__g_string_sized_new + +extern __typeof (g_string_truncate) IA__g_string_truncate __attribute((visibility("hidden"))); +#define g_string_truncate IA__g_string_truncate + +extern __typeof (g_string_append_uri_escaped) IA__g_string_append_uri_escaped __attribute((visibility("hidden"))); +#define g_string_append_uri_escaped IA__g_string_append_uri_escaped + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_string_down) IA__g_string_down __attribute((visibility("hidden"))); +#define g_string_down IA__g_string_down + +extern __typeof (g_string_up) IA__g_string_up __attribute((visibility("hidden"))); +#define g_string_up IA__g_string_up + +#endif +extern __typeof (g_string_vprintf) IA__g_string_vprintf __attribute((visibility("hidden"))); +#define g_string_vprintf IA__g_string_vprintf + +#endif +#endif +#if IN_HEADER(__G_BITLOCK_H__) +#if IN_FILE(__G_BITLOCK_C__) +extern __typeof (g_bit_lock) IA__g_bit_lock __attribute((visibility("hidden"))); +#define g_bit_lock IA__g_bit_lock + +extern __typeof (g_bit_trylock) IA__g_bit_trylock __attribute((visibility("hidden"))); +#define g_bit_trylock IA__g_bit_trylock + +extern __typeof (g_bit_unlock) IA__g_bit_unlock __attribute((visibility("hidden"))); +#define g_bit_unlock IA__g_bit_unlock + +#endif +#endif +#if IN_HEADER(__G_THREAD_H__) +#if IN_FILE(__G_THREAD_C__) +extern __typeof (g_once_impl) IA__g_once_impl __attribute((visibility("hidden"))); +#define g_once_impl IA__g_once_impl + +extern __typeof (g_once_init_enter_impl) IA__g_once_init_enter_impl __attribute((visibility("hidden"))); +#define g_once_init_enter_impl IA__g_once_init_enter_impl + +extern __typeof (g_once_init_leave) IA__g_once_init_leave __attribute((visibility("hidden"))); +#define g_once_init_leave IA__g_once_init_leave + +extern __typeof (g_thread_create_full) IA__g_thread_create_full __attribute((visibility("hidden"))); +#define g_thread_create_full IA__g_thread_create_full + +extern __typeof (g_thread_error_quark) IA__g_thread_error_quark __attribute((visibility("hidden"))); +#define g_thread_error_quark IA__g_thread_error_quark + +extern __typeof (g_thread_exit) IA__g_thread_exit __attribute((visibility("hidden"))); +#define g_thread_exit IA__g_thread_exit + +extern __typeof (g_thread_join) IA__g_thread_join __attribute((visibility("hidden"))); +#define g_thread_join IA__g_thread_join + +extern __typeof (g_thread_self) IA__g_thread_self __attribute((visibility("hidden"))); +#define g_thread_self IA__g_thread_self + +extern __typeof (g_thread_set_priority) IA__g_thread_set_priority __attribute((visibility("hidden"))); +#define g_thread_set_priority IA__g_thread_set_priority + +extern __typeof (g_static_mutex_free) IA__g_static_mutex_free __attribute((visibility("hidden"))); +#define g_static_mutex_free IA__g_static_mutex_free + +extern __typeof (g_static_mutex_get_mutex_impl) IA__g_static_mutex_get_mutex_impl __attribute((visibility("hidden"))); +#define g_static_mutex_get_mutex_impl IA__g_static_mutex_get_mutex_impl + +extern __typeof (g_static_mutex_init) IA__g_static_mutex_init __attribute((visibility("hidden"))); +#define g_static_mutex_init IA__g_static_mutex_init + +extern __typeof (g_static_private_free) IA__g_static_private_free __attribute((visibility("hidden"))); +#define g_static_private_free IA__g_static_private_free + +extern __typeof (g_static_private_get) IA__g_static_private_get __attribute((visibility("hidden"))); +#define g_static_private_get IA__g_static_private_get + +extern __typeof (g_static_private_init) IA__g_static_private_init __attribute((visibility("hidden"))); +#define g_static_private_init IA__g_static_private_init + +extern __typeof (g_static_private_set) IA__g_static_private_set __attribute((visibility("hidden"))); +#define g_static_private_set IA__g_static_private_set + +extern __typeof (g_static_rec_mutex_free) IA__g_static_rec_mutex_free __attribute((visibility("hidden"))); +#define g_static_rec_mutex_free IA__g_static_rec_mutex_free + +extern __typeof (g_static_rec_mutex_init) IA__g_static_rec_mutex_init __attribute((visibility("hidden"))); +#define g_static_rec_mutex_init IA__g_static_rec_mutex_init + +extern __typeof (g_static_rec_mutex_lock) IA__g_static_rec_mutex_lock __attribute((visibility("hidden"))); +#define g_static_rec_mutex_lock IA__g_static_rec_mutex_lock + +extern __typeof (g_static_rec_mutex_lock_full) IA__g_static_rec_mutex_lock_full __attribute((visibility("hidden"))); +#define g_static_rec_mutex_lock_full IA__g_static_rec_mutex_lock_full + +extern __typeof (g_static_rec_mutex_trylock) IA__g_static_rec_mutex_trylock __attribute((visibility("hidden"))); +#define g_static_rec_mutex_trylock IA__g_static_rec_mutex_trylock + +extern __typeof (g_static_rec_mutex_unlock) IA__g_static_rec_mutex_unlock __attribute((visibility("hidden"))); +#define g_static_rec_mutex_unlock IA__g_static_rec_mutex_unlock + +extern __typeof (g_static_rec_mutex_unlock_full) IA__g_static_rec_mutex_unlock_full __attribute((visibility("hidden"))); +#define g_static_rec_mutex_unlock_full IA__g_static_rec_mutex_unlock_full + +extern __typeof (g_static_rw_lock_free) IA__g_static_rw_lock_free __attribute((visibility("hidden"))); +#define g_static_rw_lock_free IA__g_static_rw_lock_free + +extern __typeof (g_static_rw_lock_init) IA__g_static_rw_lock_init __attribute((visibility("hidden"))); +#define g_static_rw_lock_init IA__g_static_rw_lock_init + +extern __typeof (g_static_rw_lock_reader_lock) IA__g_static_rw_lock_reader_lock __attribute((visibility("hidden"))); +#define g_static_rw_lock_reader_lock IA__g_static_rw_lock_reader_lock + +extern __typeof (g_static_rw_lock_reader_trylock) IA__g_static_rw_lock_reader_trylock __attribute((visibility("hidden"))); +#define g_static_rw_lock_reader_trylock IA__g_static_rw_lock_reader_trylock + +extern __typeof (g_static_rw_lock_reader_unlock) IA__g_static_rw_lock_reader_unlock __attribute((visibility("hidden"))); +#define g_static_rw_lock_reader_unlock IA__g_static_rw_lock_reader_unlock + +extern __typeof (g_static_rw_lock_writer_lock) IA__g_static_rw_lock_writer_lock __attribute((visibility("hidden"))); +#define g_static_rw_lock_writer_lock IA__g_static_rw_lock_writer_lock + +extern __typeof (g_static_rw_lock_writer_trylock) IA__g_static_rw_lock_writer_trylock __attribute((visibility("hidden"))); +#define g_static_rw_lock_writer_trylock IA__g_static_rw_lock_writer_trylock + +extern __typeof (g_static_rw_lock_writer_unlock) IA__g_static_rw_lock_writer_unlock __attribute((visibility("hidden"))); +#define g_static_rw_lock_writer_unlock IA__g_static_rw_lock_writer_unlock + +extern __typeof (g_thread_foreach) IA__g_thread_foreach __attribute((visibility("hidden"))); +#define g_thread_foreach IA__g_thread_foreach + +extern __typeof (g_thread_get_initialized) IA__g_thread_get_initialized __attribute((visibility("hidden"))); +#define g_thread_get_initialized IA__g_thread_get_initialized + +#endif +#endif +#if IN_HEADER(__G_THREADPOOL_H__) +#if IN_FILE(__G_THREADPOOL_C__) +extern __typeof (g_thread_pool_free) IA__g_thread_pool_free __attribute((visibility("hidden"))); +#define g_thread_pool_free IA__g_thread_pool_free + +extern __typeof (g_thread_pool_get_max_threads) IA__g_thread_pool_get_max_threads __attribute((visibility("hidden"))); +#define g_thread_pool_get_max_threads IA__g_thread_pool_get_max_threads + +extern __typeof (g_thread_pool_get_max_unused_threads) IA__g_thread_pool_get_max_unused_threads __attribute((visibility("hidden"))); +#define g_thread_pool_get_max_unused_threads IA__g_thread_pool_get_max_unused_threads + +extern __typeof (g_thread_pool_get_max_idle_time) IA__g_thread_pool_get_max_idle_time __attribute((visibility("hidden"))); +#define g_thread_pool_get_max_idle_time IA__g_thread_pool_get_max_idle_time + +extern __typeof (g_thread_pool_get_num_threads) IA__g_thread_pool_get_num_threads __attribute((visibility("hidden"))); +#define g_thread_pool_get_num_threads IA__g_thread_pool_get_num_threads + +extern __typeof (g_thread_pool_get_num_unused_threads) IA__g_thread_pool_get_num_unused_threads __attribute((visibility("hidden"))); +#define g_thread_pool_get_num_unused_threads IA__g_thread_pool_get_num_unused_threads + +extern __typeof (g_thread_pool_new) IA__g_thread_pool_new __attribute((visibility("hidden"))); +#define g_thread_pool_new IA__g_thread_pool_new + +extern __typeof (g_thread_pool_push) IA__g_thread_pool_push __attribute((visibility("hidden"))); +#define g_thread_pool_push IA__g_thread_pool_push + +extern __typeof (g_thread_pool_set_max_threads) IA__g_thread_pool_set_max_threads __attribute((visibility("hidden"))); +#define g_thread_pool_set_max_threads IA__g_thread_pool_set_max_threads + +extern __typeof (g_thread_pool_set_max_unused_threads) IA__g_thread_pool_set_max_unused_threads __attribute((visibility("hidden"))); +#define g_thread_pool_set_max_unused_threads IA__g_thread_pool_set_max_unused_threads + +extern __typeof (g_thread_pool_set_max_idle_time) IA__g_thread_pool_set_max_idle_time __attribute((visibility("hidden"))); +#define g_thread_pool_set_max_idle_time IA__g_thread_pool_set_max_idle_time + +extern __typeof (g_thread_pool_stop_unused_threads) IA__g_thread_pool_stop_unused_threads __attribute((visibility("hidden"))); +#define g_thread_pool_stop_unused_threads IA__g_thread_pool_stop_unused_threads + +extern __typeof (g_thread_pool_unprocessed) IA__g_thread_pool_unprocessed __attribute((visibility("hidden"))); +#define g_thread_pool_unprocessed IA__g_thread_pool_unprocessed + +extern __typeof (g_thread_pool_set_sort_function) IA__g_thread_pool_set_sort_function __attribute((visibility("hidden"))); +#define g_thread_pool_set_sort_function IA__g_thread_pool_set_sort_function + +#endif +#endif +#if IN_HEADER(__G_TEST_UTILS_H__) +#if IN_FILE(__G_MESSAGES_C__) +extern __typeof (g_test_log_set_fatal_handler) IA__g_test_log_set_fatal_handler __attribute((visibility("hidden"))); +#define g_test_log_set_fatal_handler IA__g_test_log_set_fatal_handler + +#endif +#if IN_FILE(__G_TEST_UTILS_C__) +extern __typeof (g_assertion_message) IA__g_assertion_message __attribute((visibility("hidden"))) G_GNUC_NORETURN; +#define g_assertion_message IA__g_assertion_message + +extern __typeof (g_assertion_message_cmpnum) IA__g_assertion_message_cmpnum __attribute((visibility("hidden"))) G_GNUC_NORETURN; +#define g_assertion_message_cmpnum IA__g_assertion_message_cmpnum + +extern __typeof (g_assertion_message_cmpstr) IA__g_assertion_message_cmpstr __attribute((visibility("hidden"))) G_GNUC_NORETURN; +#define g_assertion_message_cmpstr IA__g_assertion_message_cmpstr + +extern __typeof (g_assertion_message_expr) IA__g_assertion_message_expr __attribute((visibility("hidden"))) G_GNUC_NORETURN; +#define g_assertion_message_expr IA__g_assertion_message_expr + +extern __typeof (g_assertion_message_error) IA__g_assertion_message_error __attribute((visibility("hidden"))) G_GNUC_NORETURN; +#define g_assertion_message_error IA__g_assertion_message_error + +extern __typeof (g_strcmp0) IA__g_strcmp0 __attribute((visibility("hidden"))); +#define g_strcmp0 IA__g_strcmp0 + +extern __typeof (g_test_add_data_func) IA__g_test_add_data_func __attribute((visibility("hidden"))); +#define g_test_add_data_func IA__g_test_add_data_func + +extern __typeof (g_test_add_func) IA__g_test_add_func __attribute((visibility("hidden"))); +#define g_test_add_func IA__g_test_add_func + +extern __typeof (g_test_add_vtable) IA__g_test_add_vtable __attribute((visibility("hidden"))); +#define g_test_add_vtable IA__g_test_add_vtable + +extern __typeof (g_test_bug) IA__g_test_bug __attribute((visibility("hidden"))); +#define g_test_bug IA__g_test_bug + +extern __typeof (g_test_bug_base) IA__g_test_bug_base __attribute((visibility("hidden"))); +#define g_test_bug_base IA__g_test_bug_base + +extern __typeof (g_test_create_case) IA__g_test_create_case __attribute((visibility("hidden"))); +#define g_test_create_case IA__g_test_create_case + +extern __typeof (g_test_create_suite) IA__g_test_create_suite __attribute((visibility("hidden"))); +#define g_test_create_suite IA__g_test_create_suite + +extern __typeof (g_test_get_root) IA__g_test_get_root __attribute((visibility("hidden"))); +#define g_test_get_root IA__g_test_get_root + +extern __typeof (g_test_init) IA__g_test_init __attribute((visibility("hidden"))); +#define g_test_init IA__g_test_init + +extern __typeof (g_test_log_buffer_free) IA__g_test_log_buffer_free __attribute((visibility("hidden"))); +#define g_test_log_buffer_free IA__g_test_log_buffer_free + +extern __typeof (g_test_log_buffer_new) IA__g_test_log_buffer_new __attribute((visibility("hidden"))); +#define g_test_log_buffer_new IA__g_test_log_buffer_new + +extern __typeof (g_test_log_buffer_pop) IA__g_test_log_buffer_pop __attribute((visibility("hidden"))); +#define g_test_log_buffer_pop IA__g_test_log_buffer_pop + +extern __typeof (g_test_log_buffer_push) IA__g_test_log_buffer_push __attribute((visibility("hidden"))); +#define g_test_log_buffer_push IA__g_test_log_buffer_push + +extern __typeof (g_test_log_msg_free) IA__g_test_log_msg_free __attribute((visibility("hidden"))); +#define g_test_log_msg_free IA__g_test_log_msg_free + +extern __typeof (g_test_log_type_name) IA__g_test_log_type_name __attribute((visibility("hidden"))); +#define g_test_log_type_name IA__g_test_log_type_name + +extern __typeof (g_test_maximized_result) IA__g_test_maximized_result __attribute((visibility("hidden"))); +#define g_test_maximized_result IA__g_test_maximized_result + +extern __typeof (g_test_message) IA__g_test_message __attribute((visibility("hidden"))); +#define g_test_message IA__g_test_message + +extern __typeof (g_test_minimized_result) IA__g_test_minimized_result __attribute((visibility("hidden"))); +#define g_test_minimized_result IA__g_test_minimized_result + +extern __typeof (g_test_queue_destroy) IA__g_test_queue_destroy __attribute((visibility("hidden"))); +#define g_test_queue_destroy IA__g_test_queue_destroy + +extern __typeof (g_test_queue_free) IA__g_test_queue_free __attribute((visibility("hidden"))); +#define g_test_queue_free IA__g_test_queue_free + +extern __typeof (g_test_rand_double) IA__g_test_rand_double __attribute((visibility("hidden"))); +#define g_test_rand_double IA__g_test_rand_double + +extern __typeof (g_test_rand_double_range) IA__g_test_rand_double_range __attribute((visibility("hidden"))); +#define g_test_rand_double_range IA__g_test_rand_double_range + +extern __typeof (g_test_rand_int) IA__g_test_rand_int __attribute((visibility("hidden"))); +#define g_test_rand_int IA__g_test_rand_int + +extern __typeof (g_test_rand_int_range) IA__g_test_rand_int_range __attribute((visibility("hidden"))); +#define g_test_rand_int_range IA__g_test_rand_int_range + +extern __typeof (g_test_run) IA__g_test_run __attribute((visibility("hidden"))); +#define g_test_run IA__g_test_run + +extern __typeof (g_test_run_suite) IA__g_test_run_suite __attribute((visibility("hidden"))); +#define g_test_run_suite IA__g_test_run_suite + +extern __typeof (g_test_suite_add) IA__g_test_suite_add __attribute((visibility("hidden"))); +#define g_test_suite_add IA__g_test_suite_add + +extern __typeof (g_test_suite_add_suite) IA__g_test_suite_add_suite __attribute((visibility("hidden"))); +#define g_test_suite_add_suite IA__g_test_suite_add_suite + +extern __typeof (g_test_timer_elapsed) IA__g_test_timer_elapsed __attribute((visibility("hidden"))); +#define g_test_timer_elapsed IA__g_test_timer_elapsed + +extern __typeof (g_test_timer_last) IA__g_test_timer_last __attribute((visibility("hidden"))); +#define g_test_timer_last IA__g_test_timer_last + +extern __typeof (g_test_timer_start) IA__g_test_timer_start __attribute((visibility("hidden"))); +#define g_test_timer_start IA__g_test_timer_start + +extern __typeof (g_test_trap_assertions) IA__g_test_trap_assertions __attribute((visibility("hidden"))); +#define g_test_trap_assertions IA__g_test_trap_assertions + +extern __typeof (g_test_trap_fork) IA__g_test_trap_fork __attribute((visibility("hidden"))); +#define g_test_trap_fork IA__g_test_trap_fork + +extern __typeof (g_test_trap_has_passed) IA__g_test_trap_has_passed __attribute((visibility("hidden"))); +#define g_test_trap_has_passed IA__g_test_trap_has_passed + +extern __typeof (g_test_trap_reached_timeout) IA__g_test_trap_reached_timeout __attribute((visibility("hidden"))); +#define g_test_trap_reached_timeout IA__g_test_trap_reached_timeout + +#endif +#endif +#if IN_HEADER(__G_TIMER_H__) +#if IN_FILE(__G_TIMER_C__) +extern __typeof (g_timer_continue) IA__g_timer_continue __attribute((visibility("hidden"))); +#define g_timer_continue IA__g_timer_continue + +extern __typeof (g_timer_destroy) IA__g_timer_destroy __attribute((visibility("hidden"))); +#define g_timer_destroy IA__g_timer_destroy + +extern __typeof (g_timer_elapsed) IA__g_timer_elapsed __attribute((visibility("hidden"))); +#define g_timer_elapsed IA__g_timer_elapsed + +extern __typeof (g_timer_new) IA__g_timer_new __attribute((visibility("hidden"))); +#define g_timer_new IA__g_timer_new + +extern __typeof (g_timer_reset) IA__g_timer_reset __attribute((visibility("hidden"))); +#define g_timer_reset IA__g_timer_reset + +extern __typeof (g_timer_start) IA__g_timer_start __attribute((visibility("hidden"))); +#define g_timer_start IA__g_timer_start + +extern __typeof (g_timer_stop) IA__g_timer_stop __attribute((visibility("hidden"))); +#define g_timer_stop IA__g_timer_stop + +extern __typeof (g_time_val_add) IA__g_time_val_add __attribute((visibility("hidden"))); +#define g_time_val_add IA__g_time_val_add + +extern __typeof (g_time_val_from_iso8601) IA__g_time_val_from_iso8601 __attribute((visibility("hidden"))); +#define g_time_val_from_iso8601 IA__g_time_val_from_iso8601 + +extern __typeof (g_time_val_to_iso8601) IA__g_time_val_to_iso8601 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_time_val_to_iso8601 IA__g_time_val_to_iso8601 + +extern __typeof (g_usleep) IA__g_usleep __attribute((visibility("hidden"))); +#define g_usleep IA__g_usleep + +#endif +#endif +#if IN_HEADER(__G_TREE_H__) +#if IN_FILE(__G_TREE_C__) +extern __typeof (g_tree_destroy) IA__g_tree_destroy __attribute((visibility("hidden"))); +#define g_tree_destroy IA__g_tree_destroy + +extern __typeof (g_tree_foreach) IA__g_tree_foreach __attribute((visibility("hidden"))); +#define g_tree_foreach IA__g_tree_foreach + +extern __typeof (g_tree_height) IA__g_tree_height __attribute((visibility("hidden"))); +#define g_tree_height IA__g_tree_height + +extern __typeof (g_tree_insert) IA__g_tree_insert __attribute((visibility("hidden"))); +#define g_tree_insert IA__g_tree_insert + +extern __typeof (g_tree_lookup) IA__g_tree_lookup __attribute((visibility("hidden"))); +#define g_tree_lookup IA__g_tree_lookup + +extern __typeof (g_tree_lookup_extended) IA__g_tree_lookup_extended __attribute((visibility("hidden"))); +#define g_tree_lookup_extended IA__g_tree_lookup_extended + +extern __typeof (g_tree_new) IA__g_tree_new __attribute((visibility("hidden"))); +#define g_tree_new IA__g_tree_new + +extern __typeof (g_tree_ref) IA__g_tree_ref __attribute((visibility("hidden"))); +#define g_tree_ref IA__g_tree_ref + +extern __typeof (g_tree_unref) IA__g_tree_unref __attribute((visibility("hidden"))); +#define g_tree_unref IA__g_tree_unref + +extern __typeof (g_tree_new_full) IA__g_tree_new_full __attribute((visibility("hidden"))); +#define g_tree_new_full IA__g_tree_new_full + +extern __typeof (g_tree_new_with_data) IA__g_tree_new_with_data __attribute((visibility("hidden"))); +#define g_tree_new_with_data IA__g_tree_new_with_data + +extern __typeof (g_tree_nnodes) IA__g_tree_nnodes __attribute((visibility("hidden"))); +#define g_tree_nnodes IA__g_tree_nnodes + +extern __typeof (g_tree_remove) IA__g_tree_remove __attribute((visibility("hidden"))); +#define g_tree_remove IA__g_tree_remove + +extern __typeof (g_tree_replace) IA__g_tree_replace __attribute((visibility("hidden"))); +#define g_tree_replace IA__g_tree_replace + +extern __typeof (g_tree_search) IA__g_tree_search __attribute((visibility("hidden"))); +#define g_tree_search IA__g_tree_search + +extern __typeof (g_tree_steal) IA__g_tree_steal __attribute((visibility("hidden"))); +#define g_tree_steal IA__g_tree_steal + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_tree_traverse) IA__g_tree_traverse __attribute((visibility("hidden"))); +#define g_tree_traverse IA__g_tree_traverse + +#endif +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIBREAK_C__) +extern __typeof (g_unichar_break_type) IA__g_unichar_break_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_break_type IA__g_unichar_break_type + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNICOLLATE_C__) +extern __typeof (g_utf8_collate) IA__g_utf8_collate __attribute((visibility("hidden"))); +#define g_utf8_collate IA__g_utf8_collate + +extern __typeof (g_utf8_collate_key) IA__g_utf8_collate_key __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_collate_key IA__g_utf8_collate_key + +extern __typeof (g_utf8_collate_key_for_filename) IA__g_utf8_collate_key_for_filename __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_collate_key_for_filename IA__g_utf8_collate_key_for_filename + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIDECOMP_C__) +extern __typeof (g_unicode_canonical_decomposition) IA__g_unicode_canonical_decomposition __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_unicode_canonical_decomposition IA__g_unicode_canonical_decomposition + +extern __typeof (g_unicode_canonical_ordering) IA__g_unicode_canonical_ordering __attribute((visibility("hidden"))); +#define g_unicode_canonical_ordering IA__g_unicode_canonical_ordering + +extern __typeof (g_unichar_combining_class) IA__g_unichar_combining_class __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_combining_class IA__g_unichar_combining_class + +extern __typeof (g_utf8_normalize) IA__g_utf8_normalize __attribute((visibility("hidden"))); +#define g_utf8_normalize IA__g_utf8_normalize + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIPROP_C__) +extern __typeof (g_unichar_isalnum) IA__g_unichar_isalnum __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isalnum IA__g_unichar_isalnum + +extern __typeof (g_unichar_isalpha) IA__g_unichar_isalpha __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isalpha IA__g_unichar_isalpha + +extern __typeof (g_unichar_iscntrl) IA__g_unichar_iscntrl __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_iscntrl IA__g_unichar_iscntrl + +extern __typeof (g_unichar_isdefined) IA__g_unichar_isdefined __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isdefined IA__g_unichar_isdefined + +extern __typeof (g_unichar_isdigit) IA__g_unichar_isdigit __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isdigit IA__g_unichar_isdigit + +extern __typeof (g_unichar_isgraph) IA__g_unichar_isgraph __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isgraph IA__g_unichar_isgraph + +extern __typeof (g_unichar_islower) IA__g_unichar_islower __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_islower IA__g_unichar_islower + +extern __typeof (g_unichar_isprint) IA__g_unichar_isprint __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isprint IA__g_unichar_isprint + +extern __typeof (g_unichar_ispunct) IA__g_unichar_ispunct __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_ispunct IA__g_unichar_ispunct + +extern __typeof (g_unichar_isspace) IA__g_unichar_isspace __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isspace IA__g_unichar_isspace + +extern __typeof (g_unichar_istitle) IA__g_unichar_istitle __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_istitle IA__g_unichar_istitle + +extern __typeof (g_unichar_isupper) IA__g_unichar_isupper __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isupper IA__g_unichar_isupper + +extern __typeof (g_unichar_iswide) IA__g_unichar_iswide __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_iswide IA__g_unichar_iswide + +extern __typeof (g_unichar_iswide_cjk) IA__g_unichar_iswide_cjk __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_iswide_cjk IA__g_unichar_iswide_cjk + +extern __typeof (g_unichar_isxdigit) IA__g_unichar_isxdigit __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_isxdigit IA__g_unichar_isxdigit + +extern __typeof (g_unichar_iszerowidth) IA__g_unichar_iszerowidth __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_iszerowidth IA__g_unichar_iszerowidth + +extern __typeof (g_unichar_tolower) IA__g_unichar_tolower __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_tolower IA__g_unichar_tolower + +extern __typeof (g_unichar_totitle) IA__g_unichar_totitle __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_totitle IA__g_unichar_totitle + +extern __typeof (g_unichar_toupper) IA__g_unichar_toupper __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_toupper IA__g_unichar_toupper + +extern __typeof (g_unichar_ismark) IA__g_unichar_ismark __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_ismark IA__g_unichar_ismark + +extern __typeof (g_unichar_get_mirror_char) IA__g_unichar_get_mirror_char __attribute((visibility("hidden"))); +#define g_unichar_get_mirror_char IA__g_unichar_get_mirror_char + +extern __typeof (g_unichar_get_script) IA__g_unichar_get_script __attribute((visibility("hidden"))); +#define g_unichar_get_script IA__g_unichar_get_script + +extern __typeof (g_unichar_digit_value) IA__g_unichar_digit_value __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_digit_value IA__g_unichar_digit_value + +extern __typeof (g_unichar_xdigit_value) IA__g_unichar_xdigit_value __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_xdigit_value IA__g_unichar_xdigit_value + +extern __typeof (g_unichar_type) IA__g_unichar_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_unichar_type IA__g_unichar_type + +extern __typeof (g_utf8_casefold) IA__g_utf8_casefold __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_casefold IA__g_utf8_casefold + +extern __typeof (g_utf8_strup) IA__g_utf8_strup __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_strup IA__g_utf8_strup + +extern __typeof (g_utf8_strdown) IA__g_utf8_strdown __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_strdown IA__g_utf8_strdown + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UTF8_C__) +extern __typeof (g_get_charset) IA__g_get_charset __attribute((visibility("hidden"))); +#define g_get_charset IA__g_get_charset + +extern __typeof (g_ucs4_to_utf16) IA__g_ucs4_to_utf16 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_ucs4_to_utf16 IA__g_ucs4_to_utf16 + +extern __typeof (g_ucs4_to_utf8) IA__g_ucs4_to_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_ucs4_to_utf8 IA__g_ucs4_to_utf8 + +extern __typeof (g_utf16_to_ucs4) IA__g_utf16_to_ucs4 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf16_to_ucs4 IA__g_utf16_to_ucs4 + +extern __typeof (g_utf16_to_utf8) IA__g_utf16_to_utf8 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf16_to_utf8 IA__g_utf16_to_utf8 + +extern __typeof (g_utf8_find_next_char) IA__g_utf8_find_next_char __attribute((visibility("hidden"))); +#define g_utf8_find_next_char IA__g_utf8_find_next_char + +extern __typeof (g_utf8_find_prev_char) IA__g_utf8_find_prev_char __attribute((visibility("hidden"))); +#define g_utf8_find_prev_char IA__g_utf8_find_prev_char + +extern __typeof (g_utf8_get_char) IA__g_utf8_get_char __attribute((visibility("hidden"))); +#define g_utf8_get_char IA__g_utf8_get_char + +extern __typeof (g_utf8_get_char_validated) IA__g_utf8_get_char_validated __attribute((visibility("hidden"))); +#define g_utf8_get_char_validated IA__g_utf8_get_char_validated + +extern __typeof (g_utf8_offset_to_pointer) IA__g_utf8_offset_to_pointer __attribute((visibility("hidden"))); +#define g_utf8_offset_to_pointer IA__g_utf8_offset_to_pointer + +extern __typeof (g_utf8_pointer_to_offset) IA__g_utf8_pointer_to_offset __attribute((visibility("hidden"))); +#define g_utf8_pointer_to_offset IA__g_utf8_pointer_to_offset + +extern __typeof (g_utf8_prev_char) IA__g_utf8_prev_char __attribute((visibility("hidden"))); +#define g_utf8_prev_char IA__g_utf8_prev_char + +extern __typeof (g_utf8_strchr) IA__g_utf8_strchr __attribute((visibility("hidden"))); +#define g_utf8_strchr IA__g_utf8_strchr + +extern __typeof (g_utf8_strlen) IA__g_utf8_strlen __attribute((visibility("hidden"))); +#define g_utf8_strlen IA__g_utf8_strlen + +extern __typeof (g_utf8_strncpy) IA__g_utf8_strncpy __attribute((visibility("hidden"))); +#define g_utf8_strncpy IA__g_utf8_strncpy + +extern __typeof (g_utf8_strrchr) IA__g_utf8_strrchr __attribute((visibility("hidden"))); +#define g_utf8_strrchr IA__g_utf8_strrchr + +extern __typeof (g_utf8_strreverse) IA__g_utf8_strreverse __attribute((visibility("hidden"))); +#define g_utf8_strreverse IA__g_utf8_strreverse + +extern __typeof (g_utf8_to_ucs4) IA__g_utf8_to_ucs4 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_to_ucs4 IA__g_utf8_to_ucs4 + +extern __typeof (g_utf8_to_ucs4_fast) IA__g_utf8_to_ucs4_fast __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_to_ucs4_fast IA__g_utf8_to_ucs4_fast + +extern __typeof (g_utf8_to_utf16) IA__g_utf8_to_utf16 __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_utf8_to_utf16 IA__g_utf8_to_utf16 + +extern __typeof (g_utf8_validate) IA__g_utf8_validate __attribute((visibility("hidden"))); +#define g_utf8_validate IA__g_utf8_validate + +extern __typeof (g_unichar_to_utf8) IA__g_unichar_to_utf8 __attribute((visibility("hidden"))); +#define g_unichar_to_utf8 IA__g_unichar_to_utf8 + +extern __typeof (g_unichar_validate) IA__g_unichar_validate __attribute((visibility("hidden"))); +#define g_unichar_validate IA__g_unichar_validate + +#endif +#endif +#if IN_HEADER(__GLIBINTL_H__) +#if IN_FILE(__G_UTILS_C__) +extern __typeof (glib_gettext) IA__glib_gettext __attribute((visibility("hidden"))) G_GNUC_FORMAT(1); +#define glib_gettext IA__glib_gettext + +#endif +#endif +#if IN_HEADER(__G_HASH_H__) +#if IN_FILE(__G_UTILS_C__) +extern __typeof (g_int_equal) IA__g_int_equal __attribute((visibility("hidden"))); +#define g_int_equal IA__g_int_equal + +extern __typeof (g_int_hash) IA__g_int_hash __attribute((visibility("hidden"))); +#define g_int_hash IA__g_int_hash + +extern __typeof (g_int64_equal) IA__g_int64_equal __attribute((visibility("hidden"))); +#define g_int64_equal IA__g_int64_equal + +extern __typeof (g_int64_hash) IA__g_int64_hash __attribute((visibility("hidden"))); +#define g_int64_hash IA__g_int64_hash + +extern __typeof (g_double_equal) IA__g_double_equal __attribute((visibility("hidden"))); +#define g_double_equal IA__g_double_equal + +extern __typeof (g_double_hash) IA__g_double_hash __attribute((visibility("hidden"))); +#define g_double_hash IA__g_double_hash + +extern __typeof (g_direct_equal) IA__g_direct_equal __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_direct_equal IA__g_direct_equal + +extern __typeof (g_direct_hash) IA__g_direct_hash __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_direct_hash IA__g_direct_hash + +#endif +#if IN_FILE(__G_STRING_C__) +extern __typeof (g_str_equal) IA__g_str_equal __attribute((visibility("hidden"))); +#define g_str_equal IA__g_str_equal + +extern __typeof (g_str_hash) IA__g_str_hash __attribute((visibility("hidden"))); +#define g_str_hash IA__g_str_hash + +#endif +#endif +#if IN_HEADER(__G_UTILS_H__) +#if IN_FILE(__G_UTILS_C__) +extern __typeof (g_atexit) IA__g_atexit __attribute((visibility("hidden"))); +#define g_atexit IA__g_atexit + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_basename) IA__g_basename __attribute((visibility("hidden"))); +#define g_basename IA__g_basename + +#endif +extern __typeof (g_get_application_name) IA__g_get_application_name __attribute((visibility("hidden"))); +#define g_get_application_name IA__g_get_application_name + +#ifndef _WIN64 +extern __typeof (g_find_program_in_path) IA__g_find_program_in_path __attribute((visibility("hidden"))); +#define g_find_program_in_path IA__g_find_program_in_path + +extern __typeof (g_get_current_dir) IA__g_get_current_dir __attribute((visibility("hidden"))); +#define g_get_current_dir IA__g_get_current_dir + +extern __typeof (g_getenv) IA__g_getenv __attribute((visibility("hidden"))); +#define g_getenv IA__g_getenv + +extern __typeof (g_unsetenv) IA__g_unsetenv __attribute((visibility("hidden"))); +#define g_unsetenv IA__g_unsetenv + +extern __typeof (g_get_home_dir) IA__g_get_home_dir __attribute((visibility("hidden"))); +#define g_get_home_dir IA__g_get_home_dir + +#endif +extern __typeof (g_get_host_name) IA__g_get_host_name __attribute((visibility("hidden"))); +#define g_get_host_name IA__g_get_host_name + +#ifndef _WIN64 +extern __typeof (g_setenv) IA__g_setenv __attribute((visibility("hidden"))); +#define g_setenv IA__g_setenv + +#endif +extern __typeof (g_listenv) IA__g_listenv __attribute((visibility("hidden"))); +#define g_listenv IA__g_listenv + +#ifdef G_OS_WIN32 +extern __typeof (g_find_program_in_path_utf8) IA__g_find_program_in_path_utf8 __attribute((visibility("hidden"))); +#define g_find_program_in_path_utf8 IA__g_find_program_in_path_utf8 + +extern __typeof (g_get_current_dir_utf8) IA__g_get_current_dir_utf8 __attribute((visibility("hidden"))); +#define g_get_current_dir_utf8 IA__g_get_current_dir_utf8 + +extern __typeof (g_getenv_utf8) IA__g_getenv_utf8 __attribute((visibility("hidden"))); +#define g_getenv_utf8 IA__g_getenv_utf8 + +extern __typeof (g_unsetenv_utf8) IA__g_unsetenv_utf8 __attribute((visibility("hidden"))); +#define g_unsetenv_utf8 IA__g_unsetenv_utf8 + +extern __typeof (g_setenv_utf8) IA__g_setenv_utf8 __attribute((visibility("hidden"))); +#define g_setenv_utf8 IA__g_setenv_utf8 + +extern __typeof (g_get_home_dir_utf8) IA__g_get_home_dir_utf8 __attribute((visibility("hidden"))); +#define g_get_home_dir_utf8 IA__g_get_home_dir_utf8 + +#endif +extern __typeof (g_get_language_names) IA__g_get_language_names __attribute((visibility("hidden"))); +#define g_get_language_names IA__g_get_language_names + +extern __typeof (g_get_prgname) IA__g_get_prgname __attribute((visibility("hidden"))); +#define g_get_prgname IA__g_get_prgname + +#ifndef _WIN64 +extern __typeof (g_get_real_name) IA__g_get_real_name __attribute((visibility("hidden"))); +#define g_get_real_name IA__g_get_real_name + +#endif +#ifdef G_OS_WIN32 +extern __typeof (g_get_real_name_utf8) IA__g_get_real_name_utf8 __attribute((visibility("hidden"))); +#define g_get_real_name_utf8 IA__g_get_real_name_utf8 + +#endif +extern __typeof (g_get_system_config_dirs) IA__g_get_system_config_dirs __attribute((visibility("hidden"))); +#define g_get_system_config_dirs IA__g_get_system_config_dirs + +extern __typeof (g_get_system_data_dirs) IA__g_get_system_data_dirs __attribute((visibility("hidden"))); +#define g_get_system_data_dirs IA__g_get_system_data_dirs + +#ifdef G_OS_WIN32 +extern __typeof (g_win32_get_system_data_dirs_for_module) IA__g_win32_get_system_data_dirs_for_module __attribute((visibility("hidden"))); +#define g_win32_get_system_data_dirs_for_module IA__g_win32_get_system_data_dirs_for_module + +#endif +#ifndef _WIN64 +extern __typeof (g_get_tmp_dir) IA__g_get_tmp_dir __attribute((visibility("hidden"))); +#define g_get_tmp_dir IA__g_get_tmp_dir + +#endif +#ifdef G_OS_WIN32 +extern __typeof (g_get_tmp_dir_utf8) IA__g_get_tmp_dir_utf8 __attribute((visibility("hidden"))); +#define g_get_tmp_dir_utf8 IA__g_get_tmp_dir_utf8 + +#endif +extern __typeof (g_get_user_cache_dir) IA__g_get_user_cache_dir __attribute((visibility("hidden"))); +#define g_get_user_cache_dir IA__g_get_user_cache_dir + +extern __typeof (g_get_user_config_dir) IA__g_get_user_config_dir __attribute((visibility("hidden"))); +#define g_get_user_config_dir IA__g_get_user_config_dir + +extern __typeof (g_get_user_data_dir) IA__g_get_user_data_dir __attribute((visibility("hidden"))); +#define g_get_user_data_dir IA__g_get_user_data_dir + +extern __typeof (g_reload_user_special_dirs_cache) IA__g_reload_user_special_dirs_cache __attribute((visibility("hidden"))); +#define g_reload_user_special_dirs_cache IA__g_reload_user_special_dirs_cache + +extern __typeof (g_get_user_special_dir) IA__g_get_user_special_dir __attribute((visibility("hidden"))); +#define g_get_user_special_dir IA__g_get_user_special_dir + +#ifndef _WIN64 +extern __typeof (g_get_user_name) IA__g_get_user_name __attribute((visibility("hidden"))); +#define g_get_user_name IA__g_get_user_name + +#endif +#ifdef G_OS_WIN32 +extern __typeof (g_get_user_name_utf8) IA__g_get_user_name_utf8 __attribute((visibility("hidden"))); +#define g_get_user_name_utf8 IA__g_get_user_name_utf8 + +#endif +extern __typeof (glib_check_version) IA__glib_check_version __attribute((visibility("hidden"))); +#define glib_check_version IA__glib_check_version + +extern __typeof (g_nullify_pointer) IA__g_nullify_pointer __attribute((visibility("hidden"))); +#define g_nullify_pointer IA__g_nullify_pointer + +extern __typeof (g_parse_debug_string) IA__g_parse_debug_string __attribute((visibility("hidden"))); +#define g_parse_debug_string IA__g_parse_debug_string + +extern __typeof (g_path_get_basename) IA__g_path_get_basename __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_path_get_basename IA__g_path_get_basename + +extern __typeof (g_path_get_dirname) IA__g_path_get_dirname __attribute((visibility("hidden"))) G_GNUC_MALLOC; +#define g_path_get_dirname IA__g_path_get_dirname + +extern __typeof (g_path_is_absolute) IA__g_path_is_absolute __attribute((visibility("hidden"))); +#define g_path_is_absolute IA__g_path_is_absolute + +extern __typeof (g_path_skip_root) IA__g_path_skip_root __attribute((visibility("hidden"))); +#define g_path_skip_root IA__g_path_skip_root + +extern __typeof (g_set_application_name) IA__g_set_application_name __attribute((visibility("hidden"))); +#define g_set_application_name IA__g_set_application_name + +extern __typeof (g_set_prgname) IA__g_set_prgname __attribute((visibility("hidden"))); +#define g_set_prgname IA__g_set_prgname + +#endif +#endif +#if IN_HEADER(__G_REGEX_H__) +#if IN_FILE(__G_REGEX_C__) +extern __typeof (g_regex_error_quark) IA__g_regex_error_quark __attribute((visibility("hidden"))); +#define g_regex_error_quark IA__g_regex_error_quark + +extern __typeof (g_regex_new) IA__g_regex_new __attribute((visibility("hidden"))); +#define g_regex_new IA__g_regex_new + +extern __typeof (g_regex_ref) IA__g_regex_ref __attribute((visibility("hidden"))); +#define g_regex_ref IA__g_regex_ref + +extern __typeof (g_regex_unref) IA__g_regex_unref __attribute((visibility("hidden"))); +#define g_regex_unref IA__g_regex_unref + +extern __typeof (g_regex_get_pattern) IA__g_regex_get_pattern __attribute((visibility("hidden"))); +#define g_regex_get_pattern IA__g_regex_get_pattern + +extern __typeof (g_regex_get_max_backref) IA__g_regex_get_max_backref __attribute((visibility("hidden"))); +#define g_regex_get_max_backref IA__g_regex_get_max_backref + +extern __typeof (g_regex_get_capture_count) IA__g_regex_get_capture_count __attribute((visibility("hidden"))); +#define g_regex_get_capture_count IA__g_regex_get_capture_count + +extern __typeof (g_regex_get_string_number) IA__g_regex_get_string_number __attribute((visibility("hidden"))); +#define g_regex_get_string_number IA__g_regex_get_string_number + +extern __typeof (g_regex_escape_string) IA__g_regex_escape_string __attribute((visibility("hidden"))); +#define g_regex_escape_string IA__g_regex_escape_string + +extern __typeof (g_regex_match_simple) IA__g_regex_match_simple __attribute((visibility("hidden"))); +#define g_regex_match_simple IA__g_regex_match_simple + +extern __typeof (g_regex_match) IA__g_regex_match __attribute((visibility("hidden"))); +#define g_regex_match IA__g_regex_match + +extern __typeof (g_regex_match_full) IA__g_regex_match_full __attribute((visibility("hidden"))); +#define g_regex_match_full IA__g_regex_match_full + +extern __typeof (g_regex_match_all) IA__g_regex_match_all __attribute((visibility("hidden"))); +#define g_regex_match_all IA__g_regex_match_all + +extern __typeof (g_regex_match_all_full) IA__g_regex_match_all_full __attribute((visibility("hidden"))); +#define g_regex_match_all_full IA__g_regex_match_all_full + +extern __typeof (g_regex_split_simple) IA__g_regex_split_simple __attribute((visibility("hidden"))); +#define g_regex_split_simple IA__g_regex_split_simple + +extern __typeof (g_regex_split) IA__g_regex_split __attribute((visibility("hidden"))); +#define g_regex_split IA__g_regex_split + +extern __typeof (g_regex_split_full) IA__g_regex_split_full __attribute((visibility("hidden"))); +#define g_regex_split_full IA__g_regex_split_full + +extern __typeof (g_regex_replace) IA__g_regex_replace __attribute((visibility("hidden"))); +#define g_regex_replace IA__g_regex_replace + +extern __typeof (g_regex_replace_literal) IA__g_regex_replace_literal __attribute((visibility("hidden"))); +#define g_regex_replace_literal IA__g_regex_replace_literal + +extern __typeof (g_regex_replace_eval) IA__g_regex_replace_eval __attribute((visibility("hidden"))); +#define g_regex_replace_eval IA__g_regex_replace_eval + +extern __typeof (g_regex_check_replacement) IA__g_regex_check_replacement __attribute((visibility("hidden"))); +#define g_regex_check_replacement IA__g_regex_check_replacement + +extern __typeof (g_match_info_get_regex) IA__g_match_info_get_regex __attribute((visibility("hidden"))); +#define g_match_info_get_regex IA__g_match_info_get_regex + +extern __typeof (g_match_info_get_string) IA__g_match_info_get_string __attribute((visibility("hidden"))); +#define g_match_info_get_string IA__g_match_info_get_string + +extern __typeof (g_match_info_free) IA__g_match_info_free __attribute((visibility("hidden"))); +#define g_match_info_free IA__g_match_info_free + +extern __typeof (g_match_info_next) IA__g_match_info_next __attribute((visibility("hidden"))); +#define g_match_info_next IA__g_match_info_next + +extern __typeof (g_match_info_matches) IA__g_match_info_matches __attribute((visibility("hidden"))); +#define g_match_info_matches IA__g_match_info_matches + +extern __typeof (g_match_info_get_match_count) IA__g_match_info_get_match_count __attribute((visibility("hidden"))); +#define g_match_info_get_match_count IA__g_match_info_get_match_count + +extern __typeof (g_match_info_is_partial_match) IA__g_match_info_is_partial_match __attribute((visibility("hidden"))); +#define g_match_info_is_partial_match IA__g_match_info_is_partial_match + +extern __typeof (g_match_info_expand_references) IA__g_match_info_expand_references __attribute((visibility("hidden"))); +#define g_match_info_expand_references IA__g_match_info_expand_references + +extern __typeof (g_match_info_fetch) IA__g_match_info_fetch __attribute((visibility("hidden"))); +#define g_match_info_fetch IA__g_match_info_fetch + +extern __typeof (g_match_info_fetch_pos) IA__g_match_info_fetch_pos __attribute((visibility("hidden"))); +#define g_match_info_fetch_pos IA__g_match_info_fetch_pos + +extern __typeof (g_match_info_fetch_named) IA__g_match_info_fetch_named __attribute((visibility("hidden"))); +#define g_match_info_fetch_named IA__g_match_info_fetch_named + +extern __typeof (g_match_info_fetch_named_pos) IA__g_match_info_fetch_named_pos __attribute((visibility("hidden"))); +#define g_match_info_fetch_named_pos IA__g_match_info_fetch_named_pos + +extern __typeof (g_match_info_fetch_all) IA__g_match_info_fetch_all __attribute((visibility("hidden"))); +#define g_match_info_fetch_all IA__g_match_info_fetch_all + +#endif +#endif +#if IN_HEADER(__G_VARIANT_TYPE_H__) +#if IN_FILE(__G_VARIANT_TYPE_C__) +extern __typeof (g_variant_type_string_is_valid) IA__g_variant_type_string_is_valid __attribute((visibility("hidden"))); +#define g_variant_type_string_is_valid IA__g_variant_type_string_is_valid + +extern __typeof (g_variant_type_string_scan) IA__g_variant_type_string_scan __attribute((visibility("hidden"))); +#define g_variant_type_string_scan IA__g_variant_type_string_scan + +extern __typeof (g_variant_type_free) IA__g_variant_type_free __attribute((visibility("hidden"))); +#define g_variant_type_free IA__g_variant_type_free + +extern __typeof (g_variant_type_copy) IA__g_variant_type_copy __attribute((visibility("hidden"))); +#define g_variant_type_copy IA__g_variant_type_copy + +extern __typeof (g_variant_type_new) IA__g_variant_type_new __attribute((visibility("hidden"))); +#define g_variant_type_new IA__g_variant_type_new + +extern __typeof (g_variant_type_get_string_length) IA__g_variant_type_get_string_length __attribute((visibility("hidden"))); +#define g_variant_type_get_string_length IA__g_variant_type_get_string_length + +extern __typeof (g_variant_type_peek_string) IA__g_variant_type_peek_string __attribute((visibility("hidden"))); +#define g_variant_type_peek_string IA__g_variant_type_peek_string + +extern __typeof (g_variant_type_dup_string) IA__g_variant_type_dup_string __attribute((visibility("hidden"))); +#define g_variant_type_dup_string IA__g_variant_type_dup_string + +extern __typeof (g_variant_type_is_definite) IA__g_variant_type_is_definite __attribute((visibility("hidden"))); +#define g_variant_type_is_definite IA__g_variant_type_is_definite + +extern __typeof (g_variant_type_is_container) IA__g_variant_type_is_container __attribute((visibility("hidden"))); +#define g_variant_type_is_container IA__g_variant_type_is_container + +extern __typeof (g_variant_type_is_basic) IA__g_variant_type_is_basic __attribute((visibility("hidden"))); +#define g_variant_type_is_basic IA__g_variant_type_is_basic + +extern __typeof (g_variant_type_is_maybe) IA__g_variant_type_is_maybe __attribute((visibility("hidden"))); +#define g_variant_type_is_maybe IA__g_variant_type_is_maybe + +extern __typeof (g_variant_type_is_array) IA__g_variant_type_is_array __attribute((visibility("hidden"))); +#define g_variant_type_is_array IA__g_variant_type_is_array + +extern __typeof (g_variant_type_is_tuple) IA__g_variant_type_is_tuple __attribute((visibility("hidden"))); +#define g_variant_type_is_tuple IA__g_variant_type_is_tuple + +extern __typeof (g_variant_type_is_dict_entry) IA__g_variant_type_is_dict_entry __attribute((visibility("hidden"))); +#define g_variant_type_is_dict_entry IA__g_variant_type_is_dict_entry + +extern __typeof (g_variant_type_is_variant) IA__g_variant_type_is_variant __attribute((visibility("hidden"))); +#define g_variant_type_is_variant IA__g_variant_type_is_variant + +extern __typeof (g_variant_type_hash) IA__g_variant_type_hash __attribute((visibility("hidden"))); +#define g_variant_type_hash IA__g_variant_type_hash + +extern __typeof (g_variant_type_equal) IA__g_variant_type_equal __attribute((visibility("hidden"))); +#define g_variant_type_equal IA__g_variant_type_equal + +extern __typeof (g_variant_type_is_subtype_of) IA__g_variant_type_is_subtype_of __attribute((visibility("hidden"))); +#define g_variant_type_is_subtype_of IA__g_variant_type_is_subtype_of + +extern __typeof (g_variant_type_element) IA__g_variant_type_element __attribute((visibility("hidden"))); +#define g_variant_type_element IA__g_variant_type_element + +extern __typeof (g_variant_type_first) IA__g_variant_type_first __attribute((visibility("hidden"))); +#define g_variant_type_first IA__g_variant_type_first + +extern __typeof (g_variant_type_next) IA__g_variant_type_next __attribute((visibility("hidden"))); +#define g_variant_type_next IA__g_variant_type_next + +extern __typeof (g_variant_type_n_items) IA__g_variant_type_n_items __attribute((visibility("hidden"))); +#define g_variant_type_n_items IA__g_variant_type_n_items + +extern __typeof (g_variant_type_key) IA__g_variant_type_key __attribute((visibility("hidden"))); +#define g_variant_type_key IA__g_variant_type_key + +extern __typeof (g_variant_type_value) IA__g_variant_type_value __attribute((visibility("hidden"))); +#define g_variant_type_value IA__g_variant_type_value + +extern __typeof (g_variant_type_new_array) IA__g_variant_type_new_array __attribute((visibility("hidden"))); +#define g_variant_type_new_array IA__g_variant_type_new_array + +extern __typeof (g_variant_type_new_maybe) IA__g_variant_type_new_maybe __attribute((visibility("hidden"))); +#define g_variant_type_new_maybe IA__g_variant_type_new_maybe + +extern __typeof (g_variant_type_new_tuple) IA__g_variant_type_new_tuple __attribute((visibility("hidden"))); +#define g_variant_type_new_tuple IA__g_variant_type_new_tuple + +extern __typeof (g_variant_type_new_dict_entry) IA__g_variant_type_new_dict_entry __attribute((visibility("hidden"))); +#define g_variant_type_new_dict_entry IA__g_variant_type_new_dict_entry + +extern __typeof (g_variant_type_checked_) IA__g_variant_type_checked_ __attribute((visibility("hidden"))); +#define g_variant_type_checked_ IA__g_variant_type_checked_ + +#endif +#endif +#if IN_HEADER(__G_VARIANT_H__) +#if IN_FILE(__G_VARIANT_CORE_C__) +extern __typeof (g_variant_unref) IA__g_variant_unref __attribute((visibility("hidden"))); +#define g_variant_unref IA__g_variant_unref + +extern __typeof (g_variant_ref) IA__g_variant_ref __attribute((visibility("hidden"))); +#define g_variant_ref IA__g_variant_ref + +extern __typeof (g_variant_ref_sink) IA__g_variant_ref_sink __attribute((visibility("hidden"))); +#define g_variant_ref_sink IA__g_variant_ref_sink + +extern __typeof (g_variant_n_children) IA__g_variant_n_children __attribute((visibility("hidden"))); +#define g_variant_n_children IA__g_variant_n_children + +extern __typeof (g_variant_get_child_value) IA__g_variant_get_child_value __attribute((visibility("hidden"))); +#define g_variant_get_child_value IA__g_variant_get_child_value + +extern __typeof (g_variant_get_size) IA__g_variant_get_size __attribute((visibility("hidden"))); +#define g_variant_get_size IA__g_variant_get_size + +extern __typeof (g_variant_get_data) IA__g_variant_get_data __attribute((visibility("hidden"))); +#define g_variant_get_data IA__g_variant_get_data + +extern __typeof (g_variant_store) IA__g_variant_store __attribute((visibility("hidden"))); +#define g_variant_store IA__g_variant_store + +extern __typeof (g_variant_is_normal_form) IA__g_variant_is_normal_form __attribute((visibility("hidden"))); +#define g_variant_is_normal_form IA__g_variant_is_normal_form + +#endif +#if IN_FILE(__G_VARIANT_C__) +extern __typeof (g_variant_get_type) IA__g_variant_get_type __attribute((visibility("hidden"))); +#define g_variant_get_type IA__g_variant_get_type + +extern __typeof (g_variant_get_type_string) IA__g_variant_get_type_string __attribute((visibility("hidden"))); +#define g_variant_get_type_string IA__g_variant_get_type_string + +extern __typeof (g_variant_is_of_type) IA__g_variant_is_of_type __attribute((visibility("hidden"))); +#define g_variant_is_of_type IA__g_variant_is_of_type + +extern __typeof (g_variant_is_container) IA__g_variant_is_container __attribute((visibility("hidden"))); +#define g_variant_is_container IA__g_variant_is_container + +extern __typeof (g_variant_classify) IA__g_variant_classify __attribute((visibility("hidden"))); +#define g_variant_classify IA__g_variant_classify + +extern __typeof (g_variant_new_boolean) IA__g_variant_new_boolean __attribute((visibility("hidden"))); +#define g_variant_new_boolean IA__g_variant_new_boolean + +extern __typeof (g_variant_new_byte) IA__g_variant_new_byte __attribute((visibility("hidden"))); +#define g_variant_new_byte IA__g_variant_new_byte + +extern __typeof (g_variant_new_int16) IA__g_variant_new_int16 __attribute((visibility("hidden"))); +#define g_variant_new_int16 IA__g_variant_new_int16 + +extern __typeof (g_variant_new_uint16) IA__g_variant_new_uint16 __attribute((visibility("hidden"))); +#define g_variant_new_uint16 IA__g_variant_new_uint16 + +extern __typeof (g_variant_new_int32) IA__g_variant_new_int32 __attribute((visibility("hidden"))); +#define g_variant_new_int32 IA__g_variant_new_int32 + +extern __typeof (g_variant_new_uint32) IA__g_variant_new_uint32 __attribute((visibility("hidden"))); +#define g_variant_new_uint32 IA__g_variant_new_uint32 + +extern __typeof (g_variant_new_int64) IA__g_variant_new_int64 __attribute((visibility("hidden"))); +#define g_variant_new_int64 IA__g_variant_new_int64 + +extern __typeof (g_variant_new_uint64) IA__g_variant_new_uint64 __attribute((visibility("hidden"))); +#define g_variant_new_uint64 IA__g_variant_new_uint64 + +extern __typeof (g_variant_new_handle) IA__g_variant_new_handle __attribute((visibility("hidden"))); +#define g_variant_new_handle IA__g_variant_new_handle + +extern __typeof (g_variant_new_double) IA__g_variant_new_double __attribute((visibility("hidden"))); +#define g_variant_new_double IA__g_variant_new_double + +extern __typeof (g_variant_new_string) IA__g_variant_new_string __attribute((visibility("hidden"))); +#define g_variant_new_string IA__g_variant_new_string + +extern __typeof (g_variant_new_object_path) IA__g_variant_new_object_path __attribute((visibility("hidden"))); +#define g_variant_new_object_path IA__g_variant_new_object_path + +extern __typeof (g_variant_is_object_path) IA__g_variant_is_object_path __attribute((visibility("hidden"))); +#define g_variant_is_object_path IA__g_variant_is_object_path + +extern __typeof (g_variant_new_signature) IA__g_variant_new_signature __attribute((visibility("hidden"))); +#define g_variant_new_signature IA__g_variant_new_signature + +extern __typeof (g_variant_is_signature) IA__g_variant_is_signature __attribute((visibility("hidden"))); +#define g_variant_is_signature IA__g_variant_is_signature + +extern __typeof (g_variant_new_variant) IA__g_variant_new_variant __attribute((visibility("hidden"))); +#define g_variant_new_variant IA__g_variant_new_variant + +extern __typeof (g_variant_new_strv) IA__g_variant_new_strv __attribute((visibility("hidden"))); +#define g_variant_new_strv IA__g_variant_new_strv + +extern __typeof (g_variant_get_boolean) IA__g_variant_get_boolean __attribute((visibility("hidden"))); +#define g_variant_get_boolean IA__g_variant_get_boolean + +extern __typeof (g_variant_get_byte) IA__g_variant_get_byte __attribute((visibility("hidden"))); +#define g_variant_get_byte IA__g_variant_get_byte + +extern __typeof (g_variant_get_int16) IA__g_variant_get_int16 __attribute((visibility("hidden"))); +#define g_variant_get_int16 IA__g_variant_get_int16 + +extern __typeof (g_variant_get_uint16) IA__g_variant_get_uint16 __attribute((visibility("hidden"))); +#define g_variant_get_uint16 IA__g_variant_get_uint16 + +extern __typeof (g_variant_get_int32) IA__g_variant_get_int32 __attribute((visibility("hidden"))); +#define g_variant_get_int32 IA__g_variant_get_int32 + +extern __typeof (g_variant_get_uint32) IA__g_variant_get_uint32 __attribute((visibility("hidden"))); +#define g_variant_get_uint32 IA__g_variant_get_uint32 + +extern __typeof (g_variant_get_int64) IA__g_variant_get_int64 __attribute((visibility("hidden"))); +#define g_variant_get_int64 IA__g_variant_get_int64 + +extern __typeof (g_variant_get_uint64) IA__g_variant_get_uint64 __attribute((visibility("hidden"))); +#define g_variant_get_uint64 IA__g_variant_get_uint64 + +extern __typeof (g_variant_get_handle) IA__g_variant_get_handle __attribute((visibility("hidden"))); +#define g_variant_get_handle IA__g_variant_get_handle + +extern __typeof (g_variant_get_double) IA__g_variant_get_double __attribute((visibility("hidden"))); +#define g_variant_get_double IA__g_variant_get_double + +extern __typeof (g_variant_get_string) IA__g_variant_get_string __attribute((visibility("hidden"))); +#define g_variant_get_string IA__g_variant_get_string + +extern __typeof (g_variant_dup_string) IA__g_variant_dup_string __attribute((visibility("hidden"))); +#define g_variant_dup_string IA__g_variant_dup_string + +extern __typeof (g_variant_get_variant) IA__g_variant_get_variant __attribute((visibility("hidden"))); +#define g_variant_get_variant IA__g_variant_get_variant + +extern __typeof (g_variant_get_strv) IA__g_variant_get_strv __attribute((visibility("hidden"))); +#define g_variant_get_strv IA__g_variant_get_strv + +extern __typeof (g_variant_dup_strv) IA__g_variant_dup_strv __attribute((visibility("hidden"))); +#define g_variant_dup_strv IA__g_variant_dup_strv + +extern __typeof (g_variant_new_maybe) IA__g_variant_new_maybe __attribute((visibility("hidden"))); +#define g_variant_new_maybe IA__g_variant_new_maybe + +extern __typeof (g_variant_new_array) IA__g_variant_new_array __attribute((visibility("hidden"))); +#define g_variant_new_array IA__g_variant_new_array + +extern __typeof (g_variant_new_tuple) IA__g_variant_new_tuple __attribute((visibility("hidden"))); +#define g_variant_new_tuple IA__g_variant_new_tuple + +extern __typeof (g_variant_new_dict_entry) IA__g_variant_new_dict_entry __attribute((visibility("hidden"))); +#define g_variant_new_dict_entry IA__g_variant_new_dict_entry + +extern __typeof (g_variant_get_maybe) IA__g_variant_get_maybe __attribute((visibility("hidden"))); +#define g_variant_get_maybe IA__g_variant_get_maybe + +extern __typeof (g_variant_get_fixed_array) IA__g_variant_get_fixed_array __attribute((visibility("hidden"))); +#define g_variant_get_fixed_array IA__g_variant_get_fixed_array + +extern __typeof (g_variant_print) IA__g_variant_print __attribute((visibility("hidden"))); +#define g_variant_print IA__g_variant_print + +extern __typeof (g_variant_print_string) IA__g_variant_print_string __attribute((visibility("hidden"))); +#define g_variant_print_string IA__g_variant_print_string + +extern __typeof (g_variant_hash) IA__g_variant_hash __attribute((visibility("hidden"))); +#define g_variant_hash IA__g_variant_hash + +extern __typeof (g_variant_equal) IA__g_variant_equal __attribute((visibility("hidden"))); +#define g_variant_equal IA__g_variant_equal + +extern __typeof (g_variant_iter_copy) IA__g_variant_iter_copy __attribute((visibility("hidden"))); +#define g_variant_iter_copy IA__g_variant_iter_copy + +extern __typeof (g_variant_iter_free) IA__g_variant_iter_free __attribute((visibility("hidden"))); +#define g_variant_iter_free IA__g_variant_iter_free + +extern __typeof (g_variant_iter_init) IA__g_variant_iter_init __attribute((visibility("hidden"))); +#define g_variant_iter_init IA__g_variant_iter_init + +extern __typeof (g_variant_iter_n_children) IA__g_variant_iter_n_children __attribute((visibility("hidden"))); +#define g_variant_iter_n_children IA__g_variant_iter_n_children + +extern __typeof (g_variant_iter_new) IA__g_variant_iter_new __attribute((visibility("hidden"))); +#define g_variant_iter_new IA__g_variant_iter_new + +extern __typeof (g_variant_iter_next_value) IA__g_variant_iter_next_value __attribute((visibility("hidden"))); +#define g_variant_iter_next_value IA__g_variant_iter_next_value + +extern __typeof (g_variant_builder_add_value) IA__g_variant_builder_add_value __attribute((visibility("hidden"))); +#define g_variant_builder_add_value IA__g_variant_builder_add_value + +extern __typeof (g_variant_builder_init) IA__g_variant_builder_init __attribute((visibility("hidden"))); +#define g_variant_builder_init IA__g_variant_builder_init + +extern __typeof (g_variant_builder_clear) IA__g_variant_builder_clear __attribute((visibility("hidden"))); +#define g_variant_builder_clear IA__g_variant_builder_clear + +extern __typeof (g_variant_builder_open) IA__g_variant_builder_open __attribute((visibility("hidden"))); +#define g_variant_builder_open IA__g_variant_builder_open + +extern __typeof (g_variant_builder_close) IA__g_variant_builder_close __attribute((visibility("hidden"))); +#define g_variant_builder_close IA__g_variant_builder_close + +extern __typeof (g_variant_builder_end) IA__g_variant_builder_end __attribute((visibility("hidden"))); +#define g_variant_builder_end IA__g_variant_builder_end + +extern __typeof (g_variant_builder_new) IA__g_variant_builder_new __attribute((visibility("hidden"))); +#define g_variant_builder_new IA__g_variant_builder_new + +extern __typeof (g_variant_builder_unref) IA__g_variant_builder_unref __attribute((visibility("hidden"))); +#define g_variant_builder_unref IA__g_variant_builder_unref + +extern __typeof (g_variant_builder_ref) IA__g_variant_builder_ref __attribute((visibility("hidden"))); +#define g_variant_builder_ref IA__g_variant_builder_ref + +extern __typeof (g_variant_new_va) IA__g_variant_new_va __attribute((visibility("hidden"))); +#define g_variant_new_va IA__g_variant_new_va + +extern __typeof (g_variant_get_va) IA__g_variant_get_va __attribute((visibility("hidden"))); +#define g_variant_get_va IA__g_variant_get_va + +extern __typeof (g_variant_new) IA__g_variant_new __attribute((visibility("hidden"))); +#define g_variant_new IA__g_variant_new + +extern __typeof (g_variant_get) IA__g_variant_get __attribute((visibility("hidden"))); +#define g_variant_get IA__g_variant_get + +extern __typeof (g_variant_builder_add) IA__g_variant_builder_add __attribute((visibility("hidden"))); +#define g_variant_builder_add IA__g_variant_builder_add + +extern __typeof (g_variant_get_child) IA__g_variant_get_child __attribute((visibility("hidden"))); +#define g_variant_get_child IA__g_variant_get_child + +extern __typeof (g_variant_iter_next) IA__g_variant_iter_next __attribute((visibility("hidden"))); +#define g_variant_iter_next IA__g_variant_iter_next + +extern __typeof (g_variant_iter_loop) IA__g_variant_iter_loop __attribute((visibility("hidden"))); +#define g_variant_iter_loop IA__g_variant_iter_loop + +extern __typeof (g_variant_new_from_data) IA__g_variant_new_from_data __attribute((visibility("hidden"))); +#define g_variant_new_from_data IA__g_variant_new_from_data + +extern __typeof (g_variant_get_normal_form) IA__g_variant_get_normal_form __attribute((visibility("hidden"))); +#define g_variant_get_normal_form IA__g_variant_get_normal_form + +extern __typeof (g_variant_byteswap) IA__g_variant_byteswap __attribute((visibility("hidden"))); +#define g_variant_byteswap IA__g_variant_byteswap + +#endif +#if IN_FILE(__G_VARIANT_PARSER_C__) +extern __typeof (g_variant_new_parsed) IA__g_variant_new_parsed __attribute((visibility("hidden"))); +#define g_variant_new_parsed IA__g_variant_new_parsed + +extern __typeof (g_variant_new_parsed_va) IA__g_variant_new_parsed_va __attribute((visibility("hidden"))); +#define g_variant_new_parsed_va IA__g_variant_new_parsed_va + +extern __typeof (g_variant_parse) IA__g_variant_parse __attribute((visibility("hidden"))); +#define g_variant_parse IA__g_variant_parse + +extern __typeof (g_variant_parser_get_error_quark) IA__g_variant_parser_get_error_quark __attribute((visibility("hidden"))); +#define g_variant_parser_get_error_quark IA__g_variant_parser_get_error_quark + +#endif +#endif +#if IN_HEADER(__G_VARIANT_TYPE_INFO_H__) +#if IN_FILE(__G_VARIANT_TYPE_INFO_C__) +extern __typeof (g_variant_type_info_get_type_string) IA__g_variant_type_info_get_type_string __attribute((visibility("hidden"))); +#define g_variant_type_info_get_type_string IA__g_variant_type_info_get_type_string + +extern __typeof (g_variant_type_info_query) IA__g_variant_type_info_query __attribute((visibility("hidden"))); +#define g_variant_type_info_query IA__g_variant_type_info_query + +extern __typeof (g_variant_type_info_element) IA__g_variant_type_info_element __attribute((visibility("hidden"))); +#define g_variant_type_info_element IA__g_variant_type_info_element + +extern __typeof (g_variant_type_info_query_element) IA__g_variant_type_info_query_element __attribute((visibility("hidden"))); +#define g_variant_type_info_query_element IA__g_variant_type_info_query_element + +extern __typeof (g_variant_type_info_n_members) IA__g_variant_type_info_n_members __attribute((visibility("hidden"))); +#define g_variant_type_info_n_members IA__g_variant_type_info_n_members + +extern __typeof (g_variant_type_info_member_info) IA__g_variant_type_info_member_info __attribute((visibility("hidden"))); +#define g_variant_type_info_member_info IA__g_variant_type_info_member_info + +extern __typeof (g_variant_type_info_get) IA__g_variant_type_info_get __attribute((visibility("hidden"))); +#define g_variant_type_info_get IA__g_variant_type_info_get + +extern __typeof (g_variant_type_info_ref) IA__g_variant_type_info_ref __attribute((visibility("hidden"))); +#define g_variant_type_info_ref IA__g_variant_type_info_ref + +extern __typeof (g_variant_type_info_unref) IA__g_variant_type_info_unref __attribute((visibility("hidden"))); +#define g_variant_type_info_unref IA__g_variant_type_info_unref + +extern __typeof (g_variant_type_info_assert_no_infos) IA__g_variant_type_info_assert_no_infos __attribute((visibility("hidden"))); +#define g_variant_type_info_assert_no_infos IA__g_variant_type_info_assert_no_infos + +#endif +#endif +#if IN_HEADER(__G_VARIANT_SERIALISER_H__) +#if IN_FILE(__G_VARIANT_SERIALISER_C__) +extern __typeof (g_variant_serialised_byteswap) IA__g_variant_serialised_byteswap __attribute((visibility("hidden"))); +#define g_variant_serialised_byteswap IA__g_variant_serialised_byteswap + +extern __typeof (g_variant_serialised_get_child) IA__g_variant_serialised_get_child __attribute((visibility("hidden"))); +#define g_variant_serialised_get_child IA__g_variant_serialised_get_child + +extern __typeof (g_variant_serialised_is_normal) IA__g_variant_serialised_is_normal __attribute((visibility("hidden"))); +#define g_variant_serialised_is_normal IA__g_variant_serialised_is_normal + +extern __typeof (g_variant_serialised_n_children) IA__g_variant_serialised_n_children __attribute((visibility("hidden"))); +#define g_variant_serialised_n_children IA__g_variant_serialised_n_children + +extern __typeof (g_variant_serialiser_is_object_path) IA__g_variant_serialiser_is_object_path __attribute((visibility("hidden"))); +#define g_variant_serialiser_is_object_path IA__g_variant_serialiser_is_object_path + +extern __typeof (g_variant_serialiser_is_signature) IA__g_variant_serialiser_is_signature __attribute((visibility("hidden"))); +#define g_variant_serialiser_is_signature IA__g_variant_serialiser_is_signature + +extern __typeof (g_variant_serialiser_is_string) IA__g_variant_serialiser_is_string __attribute((visibility("hidden"))); +#define g_variant_serialiser_is_string IA__g_variant_serialiser_is_string + +extern __typeof (g_variant_serialiser_needed_size) IA__g_variant_serialiser_needed_size __attribute((visibility("hidden"))); +#define g_variant_serialiser_needed_size IA__g_variant_serialiser_needed_size + +extern __typeof (g_variant_serialiser_serialise) IA__g_variant_serialiser_serialise __attribute((visibility("hidden"))); +#define g_variant_serialiser_serialise IA__g_variant_serialiser_serialise + +#endif +#endif +#if IN_HEADER(__G_VARIANT_INTERNAL_H__) +#if IN_FILE(__G_VARIANT_C__) +extern __typeof (g_variant_format_string_scan_type) IA__g_variant_format_string_scan_type __attribute((visibility("hidden"))); +#define g_variant_format_string_scan_type IA__g_variant_format_string_scan_type + +extern __typeof (g_variant_format_string_scan) IA__g_variant_format_string_scan __attribute((visibility("hidden"))); +#define g_variant_format_string_scan IA__g_variant_format_string_scan + +#endif +#endif +#if IN_HEADER(__G_WIN32_H__) +#if IN_FILE(__G_WIN32_H__) +#ifdef G_OS_WIN32 +extern __typeof (g_win32_error_message) IA__g_win32_error_message __attribute((visibility("hidden"))); +#define g_win32_error_message IA__g_win32_error_message + +extern __typeof (g_win32_ftruncate) IA__g_win32_ftruncate __attribute((visibility("hidden"))); +#define g_win32_ftruncate IA__g_win32_ftruncate + +extern __typeof (g_win32_get_package_installation_directory_of_module) IA__g_win32_get_package_installation_directory_of_module __attribute((visibility("hidden"))); +#define g_win32_get_package_installation_directory_of_module IA__g_win32_get_package_installation_directory_of_module + +#ifndef _WIN64 +extern __typeof (g_win32_get_package_installation_directory) IA__g_win32_get_package_installation_directory __attribute((visibility("hidden"))); +#define g_win32_get_package_installation_directory IA__g_win32_get_package_installation_directory + +#endif +extern __typeof (g_win32_get_package_installation_directory_utf8) IA__g_win32_get_package_installation_directory_utf8 __attribute((visibility("hidden"))); +#define g_win32_get_package_installation_directory_utf8 IA__g_win32_get_package_installation_directory_utf8 + +#ifndef _WIN64 +extern __typeof (g_win32_get_package_installation_subdirectory) IA__g_win32_get_package_installation_subdirectory __attribute((visibility("hidden"))); +#define g_win32_get_package_installation_subdirectory IA__g_win32_get_package_installation_subdirectory + +#endif +extern __typeof (g_win32_get_package_installation_subdirectory_utf8) IA__g_win32_get_package_installation_subdirectory_utf8 __attribute((visibility("hidden"))); +#define g_win32_get_package_installation_subdirectory_utf8 IA__g_win32_get_package_installation_subdirectory_utf8 + +extern __typeof (g_win32_get_windows_version) IA__g_win32_get_windows_version __attribute((visibility("hidden"))); +#define g_win32_get_windows_version IA__g_win32_get_windows_version + +extern __typeof (g_win32_getlocale) IA__g_win32_getlocale __attribute((visibility("hidden"))); +#define g_win32_getlocale IA__g_win32_getlocale + +extern __typeof (g_win32_locale_filename_from_utf8) IA__g_win32_locale_filename_from_utf8 __attribute((visibility("hidden"))); +#define g_win32_locale_filename_from_utf8 IA__g_win32_locale_filename_from_utf8 + +#endif +#endif +#endif +#if IN_HEADER(__G_HOST_UTILS_H__) +#if IN_FILE(__G_HOST_UTILS_C__) +extern __typeof (g_hostname_is_non_ascii) IA__g_hostname_is_non_ascii __attribute((visibility("hidden"))); +#define g_hostname_is_non_ascii IA__g_hostname_is_non_ascii + +extern __typeof (g_hostname_is_ascii_encoded) IA__g_hostname_is_ascii_encoded __attribute((visibility("hidden"))); +#define g_hostname_is_ascii_encoded IA__g_hostname_is_ascii_encoded + +extern __typeof (g_hostname_is_ip_address) IA__g_hostname_is_ip_address __attribute((visibility("hidden"))); +#define g_hostname_is_ip_address IA__g_hostname_is_ip_address + +extern __typeof (g_hostname_to_ascii) IA__g_hostname_to_ascii __attribute((visibility("hidden"))); +#define g_hostname_to_ascii IA__g_hostname_to_ascii + +extern __typeof (g_hostname_to_unicode) IA__g_hostname_to_unicode __attribute((visibility("hidden"))); +#define g_hostname_to_unicode IA__g_hostname_to_unicode + +#endif +#endif + +#endif /* G_HAVE_GNUC_VISIBILITY */ +#endif /* DISABLE_VISIBILITY */ diff --git a/glib/galiasdef.c b/glib/galiasdef.c new file mode 100644 index 0000000..f144f7f --- /dev/null +++ b/glib/galiasdef.c @@ -0,0 +1,4452 @@ +/* Generated by makegalias.pl */ + +#ifndef DISABLE_VISIBILITY + +#include "glibconfig.h" + +#ifdef G_HAVE_GNUC_VISIBILITY + +#undef IN_FILE +#define IN_FILE defined + +#undef IN_HEADER +#define IN_HEADER(x) 1 + +#if IN_HEADER(__G_ARRAY_H__) +#if IN_FILE(__G_ARRAY_C__) +#undef g_array_append_vals +extern __typeof (g_array_append_vals) g_array_append_vals __attribute((alias("IA__g_array_append_vals"), visibility("default"))); + +#undef g_array_free +extern __typeof (g_array_free) g_array_free __attribute((alias("IA__g_array_free"), visibility("default"))); + +#undef g_array_insert_vals +extern __typeof (g_array_insert_vals) g_array_insert_vals __attribute((alias("IA__g_array_insert_vals"), visibility("default"))); + +#undef g_array_new +extern __typeof (g_array_new) g_array_new __attribute((alias("IA__g_array_new"), visibility("default"))); + +#undef g_array_ref +extern __typeof (g_array_ref) g_array_ref __attribute((alias("IA__g_array_ref"), visibility("default"))); + +#undef g_array_unref +extern __typeof (g_array_unref) g_array_unref __attribute((alias("IA__g_array_unref"), visibility("default"))); + +#undef g_array_get_element_size +extern __typeof (g_array_get_element_size) g_array_get_element_size __attribute((alias("IA__g_array_get_element_size"), visibility("default"))); + +#undef g_array_prepend_vals +extern __typeof (g_array_prepend_vals) g_array_prepend_vals __attribute((alias("IA__g_array_prepend_vals"), visibility("default"))); + +#undef g_array_remove_index +extern __typeof (g_array_remove_index) g_array_remove_index __attribute((alias("IA__g_array_remove_index"), visibility("default"))); + +#undef g_array_remove_index_fast +extern __typeof (g_array_remove_index_fast) g_array_remove_index_fast __attribute((alias("IA__g_array_remove_index_fast"), visibility("default"))); + +#undef g_array_remove_range +extern __typeof (g_array_remove_range) g_array_remove_range __attribute((alias("IA__g_array_remove_range"), visibility("default"))); + +#undef g_array_set_size +extern __typeof (g_array_set_size) g_array_set_size __attribute((alias("IA__g_array_set_size"), visibility("default"))); + +#undef g_array_sized_new +extern __typeof (g_array_sized_new) g_array_sized_new __attribute((alias("IA__g_array_sized_new"), visibility("default"))); + +#undef g_array_sort +extern __typeof (g_array_sort) g_array_sort __attribute((alias("IA__g_array_sort"), visibility("default"))); + +#undef g_array_sort_with_data +extern __typeof (g_array_sort_with_data) g_array_sort_with_data __attribute((alias("IA__g_array_sort_with_data"), visibility("default"))); + +#undef g_byte_array_append +extern __typeof (g_byte_array_append) g_byte_array_append __attribute((alias("IA__g_byte_array_append"), visibility("default"))); + +#undef g_byte_array_free +extern __typeof (g_byte_array_free) g_byte_array_free __attribute((alias("IA__g_byte_array_free"), visibility("default"))); + +#undef g_byte_array_unref +extern __typeof (g_byte_array_unref) g_byte_array_unref __attribute((alias("IA__g_byte_array_unref"), visibility("default"))); + +#undef g_byte_array_ref +extern __typeof (g_byte_array_ref) g_byte_array_ref __attribute((alias("IA__g_byte_array_ref"), visibility("default"))); + +#undef g_byte_array_new +extern __typeof (g_byte_array_new) g_byte_array_new __attribute((alias("IA__g_byte_array_new"), visibility("default"))); + +#undef g_byte_array_prepend +extern __typeof (g_byte_array_prepend) g_byte_array_prepend __attribute((alias("IA__g_byte_array_prepend"), visibility("default"))); + +#undef g_byte_array_remove_index +extern __typeof (g_byte_array_remove_index) g_byte_array_remove_index __attribute((alias("IA__g_byte_array_remove_index"), visibility("default"))); + +#undef g_byte_array_remove_index_fast +extern __typeof (g_byte_array_remove_index_fast) g_byte_array_remove_index_fast __attribute((alias("IA__g_byte_array_remove_index_fast"), visibility("default"))); + +#undef g_byte_array_remove_range +extern __typeof (g_byte_array_remove_range) g_byte_array_remove_range __attribute((alias("IA__g_byte_array_remove_range"), visibility("default"))); + +#undef g_byte_array_set_size +extern __typeof (g_byte_array_set_size) g_byte_array_set_size __attribute((alias("IA__g_byte_array_set_size"), visibility("default"))); + +#undef g_byte_array_sized_new +extern __typeof (g_byte_array_sized_new) g_byte_array_sized_new __attribute((alias("IA__g_byte_array_sized_new"), visibility("default"))); + +#undef g_byte_array_sort +extern __typeof (g_byte_array_sort) g_byte_array_sort __attribute((alias("IA__g_byte_array_sort"), visibility("default"))); + +#undef g_byte_array_sort_with_data +extern __typeof (g_byte_array_sort_with_data) g_byte_array_sort_with_data __attribute((alias("IA__g_byte_array_sort_with_data"), visibility("default"))); + +#undef g_ptr_array_add +extern __typeof (g_ptr_array_add) g_ptr_array_add __attribute((alias("IA__g_ptr_array_add"), visibility("default"))); + +#undef g_ptr_array_foreach +extern __typeof (g_ptr_array_foreach) g_ptr_array_foreach __attribute((alias("IA__g_ptr_array_foreach"), visibility("default"))); + +#undef g_ptr_array_free +extern __typeof (g_ptr_array_free) g_ptr_array_free __attribute((alias("IA__g_ptr_array_free"), visibility("default"))); + +#undef g_ptr_array_unref +extern __typeof (g_ptr_array_unref) g_ptr_array_unref __attribute((alias("IA__g_ptr_array_unref"), visibility("default"))); + +#undef g_ptr_array_ref +extern __typeof (g_ptr_array_ref) g_ptr_array_ref __attribute((alias("IA__g_ptr_array_ref"), visibility("default"))); + +#undef g_ptr_array_new +extern __typeof (g_ptr_array_new) g_ptr_array_new __attribute((alias("IA__g_ptr_array_new"), visibility("default"))); + +#undef g_ptr_array_new_with_free_func +extern __typeof (g_ptr_array_new_with_free_func) g_ptr_array_new_with_free_func __attribute((alias("IA__g_ptr_array_new_with_free_func"), visibility("default"))); + +#undef g_ptr_array_set_free_func +extern __typeof (g_ptr_array_set_free_func) g_ptr_array_set_free_func __attribute((alias("IA__g_ptr_array_set_free_func"), visibility("default"))); + +#undef g_ptr_array_remove +extern __typeof (g_ptr_array_remove) g_ptr_array_remove __attribute((alias("IA__g_ptr_array_remove"), visibility("default"))); + +#undef g_ptr_array_remove_fast +extern __typeof (g_ptr_array_remove_fast) g_ptr_array_remove_fast __attribute((alias("IA__g_ptr_array_remove_fast"), visibility("default"))); + +#undef g_ptr_array_remove_index +extern __typeof (g_ptr_array_remove_index) g_ptr_array_remove_index __attribute((alias("IA__g_ptr_array_remove_index"), visibility("default"))); + +#undef g_ptr_array_remove_index_fast +extern __typeof (g_ptr_array_remove_index_fast) g_ptr_array_remove_index_fast __attribute((alias("IA__g_ptr_array_remove_index_fast"), visibility("default"))); + +#undef g_ptr_array_remove_range +extern __typeof (g_ptr_array_remove_range) g_ptr_array_remove_range __attribute((alias("IA__g_ptr_array_remove_range"), visibility("default"))); + +#undef g_ptr_array_set_size +extern __typeof (g_ptr_array_set_size) g_ptr_array_set_size __attribute((alias("IA__g_ptr_array_set_size"), visibility("default"))); + +#undef g_ptr_array_sized_new +extern __typeof (g_ptr_array_sized_new) g_ptr_array_sized_new __attribute((alias("IA__g_ptr_array_sized_new"), visibility("default"))); + +#undef g_ptr_array_sort +extern __typeof (g_ptr_array_sort) g_ptr_array_sort __attribute((alias("IA__g_ptr_array_sort"), visibility("default"))); + +#undef g_ptr_array_sort_with_data +extern __typeof (g_ptr_array_sort_with_data) g_ptr_array_sort_with_data __attribute((alias("IA__g_ptr_array_sort_with_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_ASYNCQUEUE_H__) +#if IN_FILE(__G_ASYNCQUEUE_C__) +#undef g_async_queue_length +extern __typeof (g_async_queue_length) g_async_queue_length __attribute((alias("IA__g_async_queue_length"), visibility("default"))); + +#undef g_async_queue_length_unlocked +extern __typeof (g_async_queue_length_unlocked) g_async_queue_length_unlocked __attribute((alias("IA__g_async_queue_length_unlocked"), visibility("default"))); + +#undef g_async_queue_lock +extern __typeof (g_async_queue_lock) g_async_queue_lock __attribute((alias("IA__g_async_queue_lock"), visibility("default"))); + +#undef g_async_queue_new +extern __typeof (g_async_queue_new) g_async_queue_new __attribute((alias("IA__g_async_queue_new"), visibility("default"))); + +#undef g_async_queue_new_full +extern __typeof (g_async_queue_new_full) g_async_queue_new_full __attribute((alias("IA__g_async_queue_new_full"), visibility("default"))); + +#undef g_async_queue_pop +extern __typeof (g_async_queue_pop) g_async_queue_pop __attribute((alias("IA__g_async_queue_pop"), visibility("default"))); + +#undef g_async_queue_pop_unlocked +extern __typeof (g_async_queue_pop_unlocked) g_async_queue_pop_unlocked __attribute((alias("IA__g_async_queue_pop_unlocked"), visibility("default"))); + +#undef g_async_queue_push +extern __typeof (g_async_queue_push) g_async_queue_push __attribute((alias("IA__g_async_queue_push"), visibility("default"))); + +#undef g_async_queue_push_unlocked +extern __typeof (g_async_queue_push_unlocked) g_async_queue_push_unlocked __attribute((alias("IA__g_async_queue_push_unlocked"), visibility("default"))); + +#undef g_async_queue_push_sorted +extern __typeof (g_async_queue_push_sorted) g_async_queue_push_sorted __attribute((alias("IA__g_async_queue_push_sorted"), visibility("default"))); + +#undef g_async_queue_push_sorted_unlocked +extern __typeof (g_async_queue_push_sorted_unlocked) g_async_queue_push_sorted_unlocked __attribute((alias("IA__g_async_queue_push_sorted_unlocked"), visibility("default"))); + +#undef g_async_queue_ref +extern __typeof (g_async_queue_ref) g_async_queue_ref __attribute((alias("IA__g_async_queue_ref"), visibility("default"))); + +#undef g_async_queue_sort +extern __typeof (g_async_queue_sort) g_async_queue_sort __attribute((alias("IA__g_async_queue_sort"), visibility("default"))); + +#undef g_async_queue_sort_unlocked +extern __typeof (g_async_queue_sort_unlocked) g_async_queue_sort_unlocked __attribute((alias("IA__g_async_queue_sort_unlocked"), visibility("default"))); + +#undef g_async_queue_timed_pop +extern __typeof (g_async_queue_timed_pop) g_async_queue_timed_pop __attribute((alias("IA__g_async_queue_timed_pop"), visibility("default"))); + +#undef g_async_queue_timed_pop_unlocked +extern __typeof (g_async_queue_timed_pop_unlocked) g_async_queue_timed_pop_unlocked __attribute((alias("IA__g_async_queue_timed_pop_unlocked"), visibility("default"))); + +#undef g_async_queue_try_pop +extern __typeof (g_async_queue_try_pop) g_async_queue_try_pop __attribute((alias("IA__g_async_queue_try_pop"), visibility("default"))); + +#undef g_async_queue_try_pop_unlocked +extern __typeof (g_async_queue_try_pop_unlocked) g_async_queue_try_pop_unlocked __attribute((alias("IA__g_async_queue_try_pop_unlocked"), visibility("default"))); + +#undef g_async_queue_unlock +extern __typeof (g_async_queue_unlock) g_async_queue_unlock __attribute((alias("IA__g_async_queue_unlock"), visibility("default"))); + +#undef g_async_queue_unref +extern __typeof (g_async_queue_unref) g_async_queue_unref __attribute((alias("IA__g_async_queue_unref"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_async_queue_ref_unlocked +extern __typeof (g_async_queue_ref_unlocked) g_async_queue_ref_unlocked __attribute((alias("IA__g_async_queue_ref_unlocked"), visibility("default"))); + +#undef g_async_queue_unref_and_unlock +extern __typeof (g_async_queue_unref_and_unlock) g_async_queue_unref_and_unlock __attribute((alias("IA__g_async_queue_unref_and_unlock"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_ATOMIC_H__) +#if IN_FILE(__G_ATOMIC_C__) +#undef g_atomic_int_add +extern __typeof (g_atomic_int_add) g_atomic_int_add __attribute((alias("IA__g_atomic_int_add"), visibility("default"))); + +#undef g_atomic_int_compare_and_exchange +extern __typeof (g_atomic_int_compare_and_exchange) g_atomic_int_compare_and_exchange __attribute((alias("IA__g_atomic_int_compare_and_exchange"), visibility("default"))); + +#undef g_atomic_int_exchange_and_add +extern __typeof (g_atomic_int_exchange_and_add) g_atomic_int_exchange_and_add __attribute((alias("IA__g_atomic_int_exchange_and_add"), visibility("default"))); + +#undef g_atomic_pointer_compare_and_exchange +extern __typeof (g_atomic_pointer_compare_and_exchange) g_atomic_pointer_compare_and_exchange __attribute((alias("IA__g_atomic_pointer_compare_and_exchange"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_BACKTRACE_H__) +#if IN_FILE(__G_BACKTRACE_C__) +#undef g_on_error_query +extern __typeof (g_on_error_query) g_on_error_query __attribute((alias("IA__g_on_error_query"), visibility("default"))); + +#undef g_on_error_stack_trace +extern __typeof (g_on_error_stack_trace) g_on_error_stack_trace __attribute((alias("IA__g_on_error_stack_trace"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_BASE64_H__) +#if IN_FILE(__G_BASE64_C__) +#undef g_base64_encode_step +extern __typeof (g_base64_encode_step) g_base64_encode_step __attribute((alias("IA__g_base64_encode_step"), visibility("default"))); + +#undef g_base64_encode_close +extern __typeof (g_base64_encode_close) g_base64_encode_close __attribute((alias("IA__g_base64_encode_close"), visibility("default"))); + +#undef g_base64_encode +extern __typeof (g_base64_encode) g_base64_encode __attribute((alias("IA__g_base64_encode"), visibility("default"))); + +#undef g_base64_decode_step +extern __typeof (g_base64_decode_step) g_base64_decode_step __attribute((alias("IA__g_base64_decode_step"), visibility("default"))); + +#undef g_base64_decode +extern __typeof (g_base64_decode) g_base64_decode __attribute((alias("IA__g_base64_decode"), visibility("default"))); + +#undef g_base64_decode_inplace +extern __typeof (g_base64_decode_inplace) g_base64_decode_inplace __attribute((alias("IA__g_base64_decode_inplace"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_BOOKMARK_FILE_H__) +#if IN_FILE(__G_BOOKMARK_FILE_C__) +#undef g_bookmark_file_error_quark +extern __typeof (g_bookmark_file_error_quark) g_bookmark_file_error_quark __attribute((alias("IA__g_bookmark_file_error_quark"), visibility("default"))); + +#undef g_bookmark_file_new +extern __typeof (g_bookmark_file_new) g_bookmark_file_new __attribute((alias("IA__g_bookmark_file_new"), visibility("default"))); + +#undef g_bookmark_file_free +extern __typeof (g_bookmark_file_free) g_bookmark_file_free __attribute((alias("IA__g_bookmark_file_free"), visibility("default"))); + +#undef g_bookmark_file_load_from_file +extern __typeof (g_bookmark_file_load_from_file) g_bookmark_file_load_from_file __attribute((alias("IA__g_bookmark_file_load_from_file"), visibility("default"))); + +#undef g_bookmark_file_load_from_data +extern __typeof (g_bookmark_file_load_from_data) g_bookmark_file_load_from_data __attribute((alias("IA__g_bookmark_file_load_from_data"), visibility("default"))); + +#undef g_bookmark_file_load_from_data_dirs +extern __typeof (g_bookmark_file_load_from_data_dirs) g_bookmark_file_load_from_data_dirs __attribute((alias("IA__g_bookmark_file_load_from_data_dirs"), visibility("default"))); + +#undef g_bookmark_file_to_data +extern __typeof (g_bookmark_file_to_data) g_bookmark_file_to_data __attribute((alias("IA__g_bookmark_file_to_data"), visibility("default"))); + +#undef g_bookmark_file_to_file +extern __typeof (g_bookmark_file_to_file) g_bookmark_file_to_file __attribute((alias("IA__g_bookmark_file_to_file"), visibility("default"))); + +#undef g_bookmark_file_set_title +extern __typeof (g_bookmark_file_set_title) g_bookmark_file_set_title __attribute((alias("IA__g_bookmark_file_set_title"), visibility("default"))); + +#undef g_bookmark_file_get_title +extern __typeof (g_bookmark_file_get_title) g_bookmark_file_get_title __attribute((alias("IA__g_bookmark_file_get_title"), visibility("default"))); + +#undef g_bookmark_file_set_description +extern __typeof (g_bookmark_file_set_description) g_bookmark_file_set_description __attribute((alias("IA__g_bookmark_file_set_description"), visibility("default"))); + +#undef g_bookmark_file_get_description +extern __typeof (g_bookmark_file_get_description) g_bookmark_file_get_description __attribute((alias("IA__g_bookmark_file_get_description"), visibility("default"))); + +#undef g_bookmark_file_set_mime_type +extern __typeof (g_bookmark_file_set_mime_type) g_bookmark_file_set_mime_type __attribute((alias("IA__g_bookmark_file_set_mime_type"), visibility("default"))); + +#undef g_bookmark_file_get_mime_type +extern __typeof (g_bookmark_file_get_mime_type) g_bookmark_file_get_mime_type __attribute((alias("IA__g_bookmark_file_get_mime_type"), visibility("default"))); + +#undef g_bookmark_file_set_groups +extern __typeof (g_bookmark_file_set_groups) g_bookmark_file_set_groups __attribute((alias("IA__g_bookmark_file_set_groups"), visibility("default"))); + +#undef g_bookmark_file_add_group +extern __typeof (g_bookmark_file_add_group) g_bookmark_file_add_group __attribute((alias("IA__g_bookmark_file_add_group"), visibility("default"))); + +#undef g_bookmark_file_has_group +extern __typeof (g_bookmark_file_has_group) g_bookmark_file_has_group __attribute((alias("IA__g_bookmark_file_has_group"), visibility("default"))); + +#undef g_bookmark_file_get_groups +extern __typeof (g_bookmark_file_get_groups) g_bookmark_file_get_groups __attribute((alias("IA__g_bookmark_file_get_groups"), visibility("default"))); + +#undef g_bookmark_file_add_application +extern __typeof (g_bookmark_file_add_application) g_bookmark_file_add_application __attribute((alias("IA__g_bookmark_file_add_application"), visibility("default"))); + +#undef g_bookmark_file_has_application +extern __typeof (g_bookmark_file_has_application) g_bookmark_file_has_application __attribute((alias("IA__g_bookmark_file_has_application"), visibility("default"))); + +#undef g_bookmark_file_get_applications +extern __typeof (g_bookmark_file_get_applications) g_bookmark_file_get_applications __attribute((alias("IA__g_bookmark_file_get_applications"), visibility("default"))); + +#undef g_bookmark_file_set_app_info +extern __typeof (g_bookmark_file_set_app_info) g_bookmark_file_set_app_info __attribute((alias("IA__g_bookmark_file_set_app_info"), visibility("default"))); + +#undef g_bookmark_file_get_app_info +extern __typeof (g_bookmark_file_get_app_info) g_bookmark_file_get_app_info __attribute((alias("IA__g_bookmark_file_get_app_info"), visibility("default"))); + +#undef g_bookmark_file_set_is_private +extern __typeof (g_bookmark_file_set_is_private) g_bookmark_file_set_is_private __attribute((alias("IA__g_bookmark_file_set_is_private"), visibility("default"))); + +#undef g_bookmark_file_get_is_private +extern __typeof (g_bookmark_file_get_is_private) g_bookmark_file_get_is_private __attribute((alias("IA__g_bookmark_file_get_is_private"), visibility("default"))); + +#undef g_bookmark_file_set_icon +extern __typeof (g_bookmark_file_set_icon) g_bookmark_file_set_icon __attribute((alias("IA__g_bookmark_file_set_icon"), visibility("default"))); + +#undef g_bookmark_file_get_icon +extern __typeof (g_bookmark_file_get_icon) g_bookmark_file_get_icon __attribute((alias("IA__g_bookmark_file_get_icon"), visibility("default"))); + +#undef g_bookmark_file_set_added +extern __typeof (g_bookmark_file_set_added) g_bookmark_file_set_added __attribute((alias("IA__g_bookmark_file_set_added"), visibility("default"))); + +#undef g_bookmark_file_get_added +extern __typeof (g_bookmark_file_get_added) g_bookmark_file_get_added __attribute((alias("IA__g_bookmark_file_get_added"), visibility("default"))); + +#undef g_bookmark_file_set_modified +extern __typeof (g_bookmark_file_set_modified) g_bookmark_file_set_modified __attribute((alias("IA__g_bookmark_file_set_modified"), visibility("default"))); + +#undef g_bookmark_file_get_modified +extern __typeof (g_bookmark_file_get_modified) g_bookmark_file_get_modified __attribute((alias("IA__g_bookmark_file_get_modified"), visibility("default"))); + +#undef g_bookmark_file_set_visited +extern __typeof (g_bookmark_file_set_visited) g_bookmark_file_set_visited __attribute((alias("IA__g_bookmark_file_set_visited"), visibility("default"))); + +#undef g_bookmark_file_get_visited +extern __typeof (g_bookmark_file_get_visited) g_bookmark_file_get_visited __attribute((alias("IA__g_bookmark_file_get_visited"), visibility("default"))); + +#undef g_bookmark_file_has_item +extern __typeof (g_bookmark_file_has_item) g_bookmark_file_has_item __attribute((alias("IA__g_bookmark_file_has_item"), visibility("default"))); + +#undef g_bookmark_file_get_size +extern __typeof (g_bookmark_file_get_size) g_bookmark_file_get_size __attribute((alias("IA__g_bookmark_file_get_size"), visibility("default"))); + +#undef g_bookmark_file_get_uris +extern __typeof (g_bookmark_file_get_uris) g_bookmark_file_get_uris __attribute((alias("IA__g_bookmark_file_get_uris"), visibility("default"))); + +#undef g_bookmark_file_remove_group +extern __typeof (g_bookmark_file_remove_group) g_bookmark_file_remove_group __attribute((alias("IA__g_bookmark_file_remove_group"), visibility("default"))); + +#undef g_bookmark_file_remove_application +extern __typeof (g_bookmark_file_remove_application) g_bookmark_file_remove_application __attribute((alias("IA__g_bookmark_file_remove_application"), visibility("default"))); + +#undef g_bookmark_file_remove_item +extern __typeof (g_bookmark_file_remove_item) g_bookmark_file_remove_item __attribute((alias("IA__g_bookmark_file_remove_item"), visibility("default"))); + +#undef g_bookmark_file_move_item +extern __typeof (g_bookmark_file_move_item) g_bookmark_file_move_item __attribute((alias("IA__g_bookmark_file_move_item"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CACHE_H__) +#if IN_FILE(__G_CACHE_C__) +#undef g_cache_destroy +extern __typeof (g_cache_destroy) g_cache_destroy __attribute((alias("IA__g_cache_destroy"), visibility("default"))); + +#undef g_cache_insert +extern __typeof (g_cache_insert) g_cache_insert __attribute((alias("IA__g_cache_insert"), visibility("default"))); + +#undef g_cache_key_foreach +extern __typeof (g_cache_key_foreach) g_cache_key_foreach __attribute((alias("IA__g_cache_key_foreach"), visibility("default"))); + +#undef g_cache_new +extern __typeof (g_cache_new) g_cache_new __attribute((alias("IA__g_cache_new"), visibility("default"))); + +#undef g_cache_remove +extern __typeof (g_cache_remove) g_cache_remove __attribute((alias("IA__g_cache_remove"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_cache_value_foreach +extern __typeof (g_cache_value_foreach) g_cache_value_foreach __attribute((alias("IA__g_cache_value_foreach"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_CHECKSUM_H__) +#if IN_FILE(__G_CHECKSUM_C__) +#undef g_checksum_type_get_length +extern __typeof (g_checksum_type_get_length) g_checksum_type_get_length __attribute((alias("IA__g_checksum_type_get_length"), visibility("default"))); + +#undef g_checksum_new +extern __typeof (g_checksum_new) g_checksum_new __attribute((alias("IA__g_checksum_new"), visibility("default"))); + +#undef g_checksum_copy +extern __typeof (g_checksum_copy) g_checksum_copy __attribute((alias("IA__g_checksum_copy"), visibility("default"))); + +#undef g_checksum_free +extern __typeof (g_checksum_free) g_checksum_free __attribute((alias("IA__g_checksum_free"), visibility("default"))); + +#undef g_checksum_update +extern __typeof (g_checksum_update) g_checksum_update __attribute((alias("IA__g_checksum_update"), visibility("default"))); + +#undef g_checksum_reset +extern __typeof (g_checksum_reset) g_checksum_reset __attribute((alias("IA__g_checksum_reset"), visibility("default"))); + +#undef g_checksum_get_string +extern __typeof (g_checksum_get_string) g_checksum_get_string __attribute((alias("IA__g_checksum_get_string"), visibility("default"))); + +#undef g_checksum_get_digest +extern __typeof (g_checksum_get_digest) g_checksum_get_digest __attribute((alias("IA__g_checksum_get_digest"), visibility("default"))); + +#undef g_compute_checksum_for_data +extern __typeof (g_compute_checksum_for_data) g_compute_checksum_for_data __attribute((alias("IA__g_compute_checksum_for_data"), visibility("default"))); + +#undef g_compute_checksum_for_string +extern __typeof (g_compute_checksum_for_string) g_compute_checksum_for_string __attribute((alias("IA__g_compute_checksum_for_string"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_COMPLETION_H__) +#if IN_FILE(__G_COMPLETION_C__) +#undef g_completion_add_items +extern __typeof (g_completion_add_items) g_completion_add_items __attribute((alias("IA__g_completion_add_items"), visibility("default"))); + +#undef g_completion_clear_items +extern __typeof (g_completion_clear_items) g_completion_clear_items __attribute((alias("IA__g_completion_clear_items"), visibility("default"))); + +#undef g_completion_complete +extern __typeof (g_completion_complete) g_completion_complete __attribute((alias("IA__g_completion_complete"), visibility("default"))); + +#undef g_completion_complete_utf8 +extern __typeof (g_completion_complete_utf8) g_completion_complete_utf8 __attribute((alias("IA__g_completion_complete_utf8"), visibility("default"))); + +#undef g_completion_free +extern __typeof (g_completion_free) g_completion_free __attribute((alias("IA__g_completion_free"), visibility("default"))); + +#undef g_completion_new +extern __typeof (g_completion_new) g_completion_new __attribute((alias("IA__g_completion_new"), visibility("default"))); + +#undef g_completion_remove_items +extern __typeof (g_completion_remove_items) g_completion_remove_items __attribute((alias("IA__g_completion_remove_items"), visibility("default"))); + +#undef g_completion_set_compare +extern __typeof (g_completion_set_compare) g_completion_set_compare __attribute((alias("IA__g_completion_set_compare"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CONVERT_H__) +#if IN_FILE(__G_CONVERT_C__) +#undef g_get_filename_charsets +extern __typeof (g_get_filename_charsets) g_get_filename_charsets __attribute((alias("IA__g_get_filename_charsets"), visibility("default"))); + +#undef g_convert +extern __typeof (g_convert) g_convert __attribute((alias("IA__g_convert"), visibility("default"))); + +#undef g_convert_error_quark +extern __typeof (g_convert_error_quark) g_convert_error_quark __attribute((alias("IA__g_convert_error_quark"), visibility("default"))); + +#undef g_convert_with_fallback +extern __typeof (g_convert_with_fallback) g_convert_with_fallback __attribute((alias("IA__g_convert_with_fallback"), visibility("default"))); + +#undef g_convert_with_iconv +extern __typeof (g_convert_with_iconv) g_convert_with_iconv __attribute((alias("IA__g_convert_with_iconv"), visibility("default"))); + +#undef g_iconv +extern __typeof (g_iconv) g_iconv __attribute((alias("IA__g_iconv"), visibility("default"))); + +#undef g_iconv_close +extern __typeof (g_iconv_close) g_iconv_close __attribute((alias("IA__g_iconv_close"), visibility("default"))); + +#undef g_iconv_open +extern __typeof (g_iconv_open) g_iconv_open __attribute((alias("IA__g_iconv_open"), visibility("default"))); + +#undef g_locale_from_utf8 +extern __typeof (g_locale_from_utf8) g_locale_from_utf8 __attribute((alias("IA__g_locale_from_utf8"), visibility("default"))); + +#undef g_locale_to_utf8 +extern __typeof (g_locale_to_utf8) g_locale_to_utf8 __attribute((alias("IA__g_locale_to_utf8"), visibility("default"))); + +#undef g_filename_display_name +extern __typeof (g_filename_display_name) g_filename_display_name __attribute((alias("IA__g_filename_display_name"), visibility("default"))); + +#undef g_filename_display_basename +extern __typeof (g_filename_display_basename) g_filename_display_basename __attribute((alias("IA__g_filename_display_basename"), visibility("default"))); + +#ifndef _WIN64 +#undef g_filename_from_uri +extern __typeof (g_filename_from_uri) g_filename_from_uri __attribute((alias("IA__g_filename_from_uri"), visibility("default"))); + +#undef g_filename_from_utf8 +extern __typeof (g_filename_from_utf8) g_filename_from_utf8 __attribute((alias("IA__g_filename_from_utf8"), visibility("default"))); + +#undef g_filename_to_uri +extern __typeof (g_filename_to_uri) g_filename_to_uri __attribute((alias("IA__g_filename_to_uri"), visibility("default"))); + +#undef g_filename_to_utf8 +extern __typeof (g_filename_to_utf8) g_filename_to_utf8 __attribute((alias("IA__g_filename_to_utf8"), visibility("default"))); + +#endif +#ifdef G_OS_WIN32 +#undef g_filename_from_uri_utf8 +extern __typeof (g_filename_from_uri_utf8) g_filename_from_uri_utf8 __attribute((alias("IA__g_filename_from_uri_utf8"), visibility("default"))); + +#undef g_filename_from_utf8_utf8 +extern __typeof (g_filename_from_utf8_utf8) g_filename_from_utf8_utf8 __attribute((alias("IA__g_filename_from_utf8_utf8"), visibility("default"))); + +#undef g_filename_to_uri_utf8 +extern __typeof (g_filename_to_uri_utf8) g_filename_to_uri_utf8 __attribute((alias("IA__g_filename_to_uri_utf8"), visibility("default"))); + +#undef g_filename_to_utf8_utf8 +extern __typeof (g_filename_to_utf8_utf8) g_filename_to_utf8_utf8 __attribute((alias("IA__g_filename_to_utf8_utf8"), visibility("default"))); + +#endif +#undef g_uri_list_extract_uris +extern __typeof (g_uri_list_extract_uris) g_uri_list_extract_uris __attribute((alias("IA__g_uri_list_extract_uris"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DATASET_H__) +#if IN_FILE(__G_DATASET_C__) +#undef g_datalist_clear +extern __typeof (g_datalist_clear) g_datalist_clear __attribute((alias("IA__g_datalist_clear"), visibility("default"))); + +#undef g_datalist_foreach +extern __typeof (g_datalist_foreach) g_datalist_foreach __attribute((alias("IA__g_datalist_foreach"), visibility("default"))); + +#undef g_datalist_get_flags +extern __typeof (g_datalist_get_flags) g_datalist_get_flags __attribute((alias("IA__g_datalist_get_flags"), visibility("default"))); + +#undef g_datalist_id_get_data +extern __typeof (g_datalist_id_get_data) g_datalist_id_get_data __attribute((alias("IA__g_datalist_id_get_data"), visibility("default"))); + +#undef g_datalist_id_remove_no_notify +extern __typeof (g_datalist_id_remove_no_notify) g_datalist_id_remove_no_notify __attribute((alias("IA__g_datalist_id_remove_no_notify"), visibility("default"))); + +#undef g_datalist_id_set_data_full +extern __typeof (g_datalist_id_set_data_full) g_datalist_id_set_data_full __attribute((alias("IA__g_datalist_id_set_data_full"), visibility("default"))); + +#undef g_datalist_set_flags +extern __typeof (g_datalist_set_flags) g_datalist_set_flags __attribute((alias("IA__g_datalist_set_flags"), visibility("default"))); + +#undef g_datalist_unset_flags +extern __typeof (g_datalist_unset_flags) g_datalist_unset_flags __attribute((alias("IA__g_datalist_unset_flags"), visibility("default"))); + +#undef g_datalist_init +extern __typeof (g_datalist_init) g_datalist_init __attribute((alias("IA__g_datalist_init"), visibility("default"))); + +#undef g_dataset_destroy +extern __typeof (g_dataset_destroy) g_dataset_destroy __attribute((alias("IA__g_dataset_destroy"), visibility("default"))); + +#undef g_dataset_foreach +extern __typeof (g_dataset_foreach) g_dataset_foreach __attribute((alias("IA__g_dataset_foreach"), visibility("default"))); + +#undef g_dataset_id_get_data +extern __typeof (g_dataset_id_get_data) g_dataset_id_get_data __attribute((alias("IA__g_dataset_id_get_data"), visibility("default"))); + +#undef g_dataset_id_remove_no_notify +extern __typeof (g_dataset_id_remove_no_notify) g_dataset_id_remove_no_notify __attribute((alias("IA__g_dataset_id_remove_no_notify"), visibility("default"))); + +#undef g_dataset_id_set_data_full +extern __typeof (g_dataset_id_set_data_full) g_dataset_id_set_data_full __attribute((alias("IA__g_dataset_id_set_data_full"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_QUARK_H__) +#if IN_FILE(__G_DATASET_C__) +#undef g_quark_from_static_string +extern __typeof (g_quark_from_static_string) g_quark_from_static_string __attribute((alias("IA__g_quark_from_static_string"), visibility("default"))); + +#undef g_quark_from_string +extern __typeof (g_quark_from_string) g_quark_from_string __attribute((alias("IA__g_quark_from_string"), visibility("default"))); + +#undef g_quark_to_string +extern __typeof (g_quark_to_string) g_quark_to_string __attribute((alias("IA__g_quark_to_string"), visibility("default"))); + +#undef g_quark_try_string +extern __typeof (g_quark_try_string) g_quark_try_string __attribute((alias("IA__g_quark_try_string"), visibility("default"))); + +#undef g_intern_string +extern __typeof (g_intern_string) g_intern_string __attribute((alias("IA__g_intern_string"), visibility("default"))); + +#undef g_intern_static_string +extern __typeof (g_intern_static_string) g_intern_static_string __attribute((alias("IA__g_intern_static_string"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DATE_H__) +#if IN_FILE(__G_DATE_C__) +#undef g_date_add_days +extern __typeof (g_date_add_days) g_date_add_days __attribute((alias("IA__g_date_add_days"), visibility("default"))); + +#undef g_date_add_months +extern __typeof (g_date_add_months) g_date_add_months __attribute((alias("IA__g_date_add_months"), visibility("default"))); + +#undef g_date_add_years +extern __typeof (g_date_add_years) g_date_add_years __attribute((alias("IA__g_date_add_years"), visibility("default"))); + +#undef g_date_clamp +extern __typeof (g_date_clamp) g_date_clamp __attribute((alias("IA__g_date_clamp"), visibility("default"))); + +#undef g_date_clear +extern __typeof (g_date_clear) g_date_clear __attribute((alias("IA__g_date_clear"), visibility("default"))); + +#undef g_date_compare +extern __typeof (g_date_compare) g_date_compare __attribute((alias("IA__g_date_compare"), visibility("default"))); + +#undef g_date_days_between +extern __typeof (g_date_days_between) g_date_days_between __attribute((alias("IA__g_date_days_between"), visibility("default"))); + +#undef g_date_free +extern __typeof (g_date_free) g_date_free __attribute((alias("IA__g_date_free"), visibility("default"))); + +#undef g_date_get_day +extern __typeof (g_date_get_day) g_date_get_day __attribute((alias("IA__g_date_get_day"), visibility("default"))); + +#undef g_date_get_day_of_year +extern __typeof (g_date_get_day_of_year) g_date_get_day_of_year __attribute((alias("IA__g_date_get_day_of_year"), visibility("default"))); + +#undef g_date_get_days_in_month +extern __typeof (g_date_get_days_in_month) g_date_get_days_in_month __attribute((alias("IA__g_date_get_days_in_month"), visibility("default"))); + +#undef g_date_get_iso8601_week_of_year +extern __typeof (g_date_get_iso8601_week_of_year) g_date_get_iso8601_week_of_year __attribute((alias("IA__g_date_get_iso8601_week_of_year"), visibility("default"))); + +#undef g_date_get_julian +extern __typeof (g_date_get_julian) g_date_get_julian __attribute((alias("IA__g_date_get_julian"), visibility("default"))); + +#undef g_date_get_monday_week_of_year +extern __typeof (g_date_get_monday_week_of_year) g_date_get_monday_week_of_year __attribute((alias("IA__g_date_get_monday_week_of_year"), visibility("default"))); + +#undef g_date_get_monday_weeks_in_year +extern __typeof (g_date_get_monday_weeks_in_year) g_date_get_monday_weeks_in_year __attribute((alias("IA__g_date_get_monday_weeks_in_year"), visibility("default"))); + +#undef g_date_get_month +extern __typeof (g_date_get_month) g_date_get_month __attribute((alias("IA__g_date_get_month"), visibility("default"))); + +#undef g_date_get_sunday_week_of_year +extern __typeof (g_date_get_sunday_week_of_year) g_date_get_sunday_week_of_year __attribute((alias("IA__g_date_get_sunday_week_of_year"), visibility("default"))); + +#undef g_date_get_sunday_weeks_in_year +extern __typeof (g_date_get_sunday_weeks_in_year) g_date_get_sunday_weeks_in_year __attribute((alias("IA__g_date_get_sunday_weeks_in_year"), visibility("default"))); + +#undef g_date_get_weekday +extern __typeof (g_date_get_weekday) g_date_get_weekday __attribute((alias("IA__g_date_get_weekday"), visibility("default"))); + +#undef g_date_get_year +extern __typeof (g_date_get_year) g_date_get_year __attribute((alias("IA__g_date_get_year"), visibility("default"))); + +#undef g_date_is_first_of_month +extern __typeof (g_date_is_first_of_month) g_date_is_first_of_month __attribute((alias("IA__g_date_is_first_of_month"), visibility("default"))); + +#undef g_date_is_last_of_month +extern __typeof (g_date_is_last_of_month) g_date_is_last_of_month __attribute((alias("IA__g_date_is_last_of_month"), visibility("default"))); + +#undef g_date_is_leap_year +extern __typeof (g_date_is_leap_year) g_date_is_leap_year __attribute((alias("IA__g_date_is_leap_year"), visibility("default"))); + +#undef g_date_new +extern __typeof (g_date_new) g_date_new __attribute((alias("IA__g_date_new"), visibility("default"))); + +#undef g_date_new_dmy +extern __typeof (g_date_new_dmy) g_date_new_dmy __attribute((alias("IA__g_date_new_dmy"), visibility("default"))); + +#undef g_date_new_julian +extern __typeof (g_date_new_julian) g_date_new_julian __attribute((alias("IA__g_date_new_julian"), visibility("default"))); + +#undef g_date_order +extern __typeof (g_date_order) g_date_order __attribute((alias("IA__g_date_order"), visibility("default"))); + +#undef g_date_set_day +extern __typeof (g_date_set_day) g_date_set_day __attribute((alias("IA__g_date_set_day"), visibility("default"))); + +#undef g_date_set_dmy +extern __typeof (g_date_set_dmy) g_date_set_dmy __attribute((alias("IA__g_date_set_dmy"), visibility("default"))); + +#undef g_date_set_julian +extern __typeof (g_date_set_julian) g_date_set_julian __attribute((alias("IA__g_date_set_julian"), visibility("default"))); + +#undef g_date_set_month +extern __typeof (g_date_set_month) g_date_set_month __attribute((alias("IA__g_date_set_month"), visibility("default"))); + +#undef g_date_set_parse +extern __typeof (g_date_set_parse) g_date_set_parse __attribute((alias("IA__g_date_set_parse"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_date_set_time +extern __typeof (g_date_set_time) g_date_set_time __attribute((alias("IA__g_date_set_time"), visibility("default"))); + +#endif +#undef g_date_set_time_t +extern __typeof (g_date_set_time_t) g_date_set_time_t __attribute((alias("IA__g_date_set_time_t"), visibility("default"))); + +#undef g_date_set_time_val +extern __typeof (g_date_set_time_val) g_date_set_time_val __attribute((alias("IA__g_date_set_time_val"), visibility("default"))); + +#undef g_date_set_year +extern __typeof (g_date_set_year) g_date_set_year __attribute((alias("IA__g_date_set_year"), visibility("default"))); + +#undef g_date_strftime +extern __typeof (g_date_strftime) g_date_strftime __attribute((alias("IA__g_date_strftime"), visibility("default"))); + +#undef g_date_subtract_days +extern __typeof (g_date_subtract_days) g_date_subtract_days __attribute((alias("IA__g_date_subtract_days"), visibility("default"))); + +#undef g_date_subtract_months +extern __typeof (g_date_subtract_months) g_date_subtract_months __attribute((alias("IA__g_date_subtract_months"), visibility("default"))); + +#undef g_date_subtract_years +extern __typeof (g_date_subtract_years) g_date_subtract_years __attribute((alias("IA__g_date_subtract_years"), visibility("default"))); + +#undef g_date_to_struct_tm +extern __typeof (g_date_to_struct_tm) g_date_to_struct_tm __attribute((alias("IA__g_date_to_struct_tm"), visibility("default"))); + +#undef g_date_valid +extern __typeof (g_date_valid) g_date_valid __attribute((alias("IA__g_date_valid"), visibility("default"))); + +#undef g_date_valid_day +extern __typeof (g_date_valid_day) g_date_valid_day __attribute((alias("IA__g_date_valid_day"), visibility("default"))); + +#undef g_date_valid_dmy +extern __typeof (g_date_valid_dmy) g_date_valid_dmy __attribute((alias("IA__g_date_valid_dmy"), visibility("default"))); + +#undef g_date_valid_julian +extern __typeof (g_date_valid_julian) g_date_valid_julian __attribute((alias("IA__g_date_valid_julian"), visibility("default"))); + +#undef g_date_valid_month +extern __typeof (g_date_valid_month) g_date_valid_month __attribute((alias("IA__g_date_valid_month"), visibility("default"))); + +#undef g_date_valid_weekday +extern __typeof (g_date_valid_weekday) g_date_valid_weekday __attribute((alias("IA__g_date_valid_weekday"), visibility("default"))); + +#undef g_date_valid_year +extern __typeof (g_date_valid_year) g_date_valid_year __attribute((alias("IA__g_date_valid_year"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_DIR_H__) +#if IN_FILE(__G_DIR_C__) +#undef g_dir_close +extern __typeof (g_dir_close) g_dir_close __attribute((alias("IA__g_dir_close"), visibility("default"))); + +#ifndef _WIN64 +#undef g_dir_open +extern __typeof (g_dir_open) g_dir_open __attribute((alias("IA__g_dir_open"), visibility("default"))); + +#undef g_dir_read_name +extern __typeof (g_dir_read_name) g_dir_read_name __attribute((alias("IA__g_dir_read_name"), visibility("default"))); + +#endif +#ifdef G_OS_WIN32 +#undef g_dir_open_utf8 +extern __typeof (g_dir_open_utf8) g_dir_open_utf8 __attribute((alias("IA__g_dir_open_utf8"), visibility("default"))); + +#undef g_dir_read_name_utf8 +extern __typeof (g_dir_read_name_utf8) g_dir_read_name_utf8 __attribute((alias("IA__g_dir_read_name_utf8"), visibility("default"))); + +#endif +#undef g_dir_rewind +extern __typeof (g_dir_rewind) g_dir_rewind __attribute((alias("IA__g_dir_rewind"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_ERROR_H__) +#if IN_FILE(__G_ERROR_C__) +#undef g_clear_error +extern __typeof (g_clear_error) g_clear_error __attribute((alias("IA__g_clear_error"), visibility("default"))); + +#undef g_error_copy +extern __typeof (g_error_copy) g_error_copy __attribute((alias("IA__g_error_copy"), visibility("default"))); + +#undef g_error_free +extern __typeof (g_error_free) g_error_free __attribute((alias("IA__g_error_free"), visibility("default"))); + +#undef g_error_matches +extern __typeof (g_error_matches) g_error_matches __attribute((alias("IA__g_error_matches"), visibility("default"))); + +#undef g_error_new +extern __typeof (g_error_new) g_error_new __attribute((alias("IA__g_error_new"), visibility("default"))); + +#undef g_error_new_literal +extern __typeof (g_error_new_literal) g_error_new_literal __attribute((alias("IA__g_error_new_literal"), visibility("default"))); + +#undef g_error_new_valist +extern __typeof (g_error_new_valist) g_error_new_valist __attribute((alias("IA__g_error_new_valist"), visibility("default"))); + +#undef g_propagate_error +extern __typeof (g_propagate_error) g_propagate_error __attribute((alias("IA__g_propagate_error"), visibility("default"))); + +#undef g_set_error +extern __typeof (g_set_error) g_set_error __attribute((alias("IA__g_set_error"), visibility("default"))); + +#undef g_set_error_literal +extern __typeof (g_set_error_literal) g_set_error_literal __attribute((alias("IA__g_set_error_literal"), visibility("default"))); + +#undef g_prefix_error +extern __typeof (g_prefix_error) g_prefix_error __attribute((alias("IA__g_prefix_error"), visibility("default"))); + +#undef g_propagate_prefixed_error +extern __typeof (g_propagate_prefixed_error) g_propagate_prefixed_error __attribute((alias("IA__g_propagate_prefixed_error"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_FILEUTILS_H__) +#if IN_FILE(__G_FILEUTILS_C__) +#undef g_build_filename +extern __typeof (g_build_filename) g_build_filename __attribute((alias("IA__g_build_filename"), visibility("default"))); + +#undef g_build_filenamev +extern __typeof (g_build_filenamev) g_build_filenamev __attribute((alias("IA__g_build_filenamev"), visibility("default"))); + +#undef g_build_path +extern __typeof (g_build_path) g_build_path __attribute((alias("IA__g_build_path"), visibility("default"))); + +#undef g_build_pathv +extern __typeof (g_build_pathv) g_build_pathv __attribute((alias("IA__g_build_pathv"), visibility("default"))); + +#undef g_file_error_from_errno +extern __typeof (g_file_error_from_errno) g_file_error_from_errno __attribute((alias("IA__g_file_error_from_errno"), visibility("default"))); + +#undef g_file_error_quark +extern __typeof (g_file_error_quark) g_file_error_quark __attribute((alias("IA__g_file_error_quark"), visibility("default"))); + +#ifndef _WIN64 +#undef g_file_get_contents +extern __typeof (g_file_get_contents) g_file_get_contents __attribute((alias("IA__g_file_get_contents"), visibility("default"))); + +#endif +#undef g_file_set_contents +extern __typeof (g_file_set_contents) g_file_set_contents __attribute((alias("IA__g_file_set_contents"), visibility("default"))); + +#ifndef _WIN64 +#undef g_file_open_tmp +extern __typeof (g_file_open_tmp) g_file_open_tmp __attribute((alias("IA__g_file_open_tmp"), visibility("default"))); + +#undef g_file_test +extern __typeof (g_file_test) g_file_test __attribute((alias("IA__g_file_test"), visibility("default"))); + +#endif +#undef g_file_read_link +extern __typeof (g_file_read_link) g_file_read_link __attribute((alias("IA__g_file_read_link"), visibility("default"))); + +#undef g_format_size_for_display +extern __typeof (g_format_size_for_display) g_format_size_for_display __attribute((alias("IA__g_format_size_for_display"), visibility("default"))); + +#ifndef _WIN64 +#undef g_mkstemp +extern __typeof (g_mkstemp) g_mkstemp __attribute((alias("IA__g_mkstemp"), visibility("default"))); + +#endif +#undef g_mkstemp_full +extern __typeof (g_mkstemp_full) g_mkstemp_full __attribute((alias("IA__g_mkstemp_full"), visibility("default"))); + +#undef g_mkdir_with_parents +extern __typeof (g_mkdir_with_parents) g_mkdir_with_parents __attribute((alias("IA__g_mkdir_with_parents"), visibility("default"))); + +#ifdef G_OS_WIN32 +#undef g_file_get_contents_utf8 +extern __typeof (g_file_get_contents_utf8) g_file_get_contents_utf8 __attribute((alias("IA__g_file_get_contents_utf8"), visibility("default"))); + +#undef g_file_open_tmp_utf8 +extern __typeof (g_file_open_tmp_utf8) g_file_open_tmp_utf8 __attribute((alias("IA__g_file_open_tmp_utf8"), visibility("default"))); + +#undef g_file_test_utf8 +extern __typeof (g_file_test_utf8) g_file_test_utf8 __attribute((alias("IA__g_file_test_utf8"), visibility("default"))); + +#undef g_mkstemp_utf8 +extern __typeof (g_mkstemp_utf8) g_mkstemp_utf8 __attribute((alias("IA__g_mkstemp_utf8"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_HASH_H__) +#if IN_FILE(__G_HASH_C__) +#undef g_hash_table_destroy +extern __typeof (g_hash_table_destroy) g_hash_table_destroy __attribute((alias("IA__g_hash_table_destroy"), visibility("default"))); + +#undef g_hash_table_unref +extern __typeof (g_hash_table_unref) g_hash_table_unref __attribute((alias("IA__g_hash_table_unref"), visibility("default"))); + +#undef g_hash_table_ref +extern __typeof (g_hash_table_ref) g_hash_table_ref __attribute((alias("IA__g_hash_table_ref"), visibility("default"))); + +#undef g_hash_table_find +extern __typeof (g_hash_table_find) g_hash_table_find __attribute((alias("IA__g_hash_table_find"), visibility("default"))); + +#undef g_hash_table_foreach +extern __typeof (g_hash_table_foreach) g_hash_table_foreach __attribute((alias("IA__g_hash_table_foreach"), visibility("default"))); + +#undef g_hash_table_foreach_remove +extern __typeof (g_hash_table_foreach_remove) g_hash_table_foreach_remove __attribute((alias("IA__g_hash_table_foreach_remove"), visibility("default"))); + +#undef g_hash_table_foreach_steal +extern __typeof (g_hash_table_foreach_steal) g_hash_table_foreach_steal __attribute((alias("IA__g_hash_table_foreach_steal"), visibility("default"))); + +#undef g_hash_table_get_keys +extern __typeof (g_hash_table_get_keys) g_hash_table_get_keys __attribute((alias("IA__g_hash_table_get_keys"), visibility("default"))); + +#undef g_hash_table_get_values +extern __typeof (g_hash_table_get_values) g_hash_table_get_values __attribute((alias("IA__g_hash_table_get_values"), visibility("default"))); + +#undef g_hash_table_insert +extern __typeof (g_hash_table_insert) g_hash_table_insert __attribute((alias("IA__g_hash_table_insert"), visibility("default"))); + +#undef g_hash_table_lookup +extern __typeof (g_hash_table_lookup) g_hash_table_lookup __attribute((alias("IA__g_hash_table_lookup"), visibility("default"))); + +#undef g_hash_table_lookup_extended +extern __typeof (g_hash_table_lookup_extended) g_hash_table_lookup_extended __attribute((alias("IA__g_hash_table_lookup_extended"), visibility("default"))); + +#undef g_hash_table_new +extern __typeof (g_hash_table_new) g_hash_table_new __attribute((alias("IA__g_hash_table_new"), visibility("default"))); + +#undef g_hash_table_new_full +extern __typeof (g_hash_table_new_full) g_hash_table_new_full __attribute((alias("IA__g_hash_table_new_full"), visibility("default"))); + +#undef g_hash_table_remove +extern __typeof (g_hash_table_remove) g_hash_table_remove __attribute((alias("IA__g_hash_table_remove"), visibility("default"))); + +#undef g_hash_table_remove_all +extern __typeof (g_hash_table_remove_all) g_hash_table_remove_all __attribute((alias("IA__g_hash_table_remove_all"), visibility("default"))); + +#undef g_hash_table_replace +extern __typeof (g_hash_table_replace) g_hash_table_replace __attribute((alias("IA__g_hash_table_replace"), visibility("default"))); + +#undef g_hash_table_size +extern __typeof (g_hash_table_size) g_hash_table_size __attribute((alias("IA__g_hash_table_size"), visibility("default"))); + +#undef g_hash_table_steal +extern __typeof (g_hash_table_steal) g_hash_table_steal __attribute((alias("IA__g_hash_table_steal"), visibility("default"))); + +#undef g_hash_table_steal_all +extern __typeof (g_hash_table_steal_all) g_hash_table_steal_all __attribute((alias("IA__g_hash_table_steal_all"), visibility("default"))); + +#undef g_hash_table_iter_init +extern __typeof (g_hash_table_iter_init) g_hash_table_iter_init __attribute((alias("IA__g_hash_table_iter_init"), visibility("default"))); + +#undef g_hash_table_iter_next +extern __typeof (g_hash_table_iter_next) g_hash_table_iter_next __attribute((alias("IA__g_hash_table_iter_next"), visibility("default"))); + +#undef g_hash_table_iter_get_hash_table +extern __typeof (g_hash_table_iter_get_hash_table) g_hash_table_iter_get_hash_table __attribute((alias("IA__g_hash_table_iter_get_hash_table"), visibility("default"))); + +#undef g_hash_table_iter_remove +extern __typeof (g_hash_table_iter_remove) g_hash_table_iter_remove __attribute((alias("IA__g_hash_table_iter_remove"), visibility("default"))); + +#undef g_hash_table_iter_steal +extern __typeof (g_hash_table_iter_steal) g_hash_table_iter_steal __attribute((alias("IA__g_hash_table_iter_steal"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_HOOK_H__) +#if IN_FILE(__G_HOOK_C__) +#undef g_hook_alloc +extern __typeof (g_hook_alloc) g_hook_alloc __attribute((alias("IA__g_hook_alloc"), visibility("default"))); + +#undef g_hook_compare_ids +extern __typeof (g_hook_compare_ids) g_hook_compare_ids __attribute((alias("IA__g_hook_compare_ids"), visibility("default"))); + +#undef g_hook_destroy +extern __typeof (g_hook_destroy) g_hook_destroy __attribute((alias("IA__g_hook_destroy"), visibility("default"))); + +#undef g_hook_destroy_link +extern __typeof (g_hook_destroy_link) g_hook_destroy_link __attribute((alias("IA__g_hook_destroy_link"), visibility("default"))); + +#undef g_hook_find +extern __typeof (g_hook_find) g_hook_find __attribute((alias("IA__g_hook_find"), visibility("default"))); + +#undef g_hook_find_data +extern __typeof (g_hook_find_data) g_hook_find_data __attribute((alias("IA__g_hook_find_data"), visibility("default"))); + +#undef g_hook_find_func +extern __typeof (g_hook_find_func) g_hook_find_func __attribute((alias("IA__g_hook_find_func"), visibility("default"))); + +#undef g_hook_find_func_data +extern __typeof (g_hook_find_func_data) g_hook_find_func_data __attribute((alias("IA__g_hook_find_func_data"), visibility("default"))); + +#undef g_hook_first_valid +extern __typeof (g_hook_first_valid) g_hook_first_valid __attribute((alias("IA__g_hook_first_valid"), visibility("default"))); + +#undef g_hook_free +extern __typeof (g_hook_free) g_hook_free __attribute((alias("IA__g_hook_free"), visibility("default"))); + +#undef g_hook_get +extern __typeof (g_hook_get) g_hook_get __attribute((alias("IA__g_hook_get"), visibility("default"))); + +#undef g_hook_insert_before +extern __typeof (g_hook_insert_before) g_hook_insert_before __attribute((alias("IA__g_hook_insert_before"), visibility("default"))); + +#undef g_hook_insert_sorted +extern __typeof (g_hook_insert_sorted) g_hook_insert_sorted __attribute((alias("IA__g_hook_insert_sorted"), visibility("default"))); + +#undef g_hook_list_clear +extern __typeof (g_hook_list_clear) g_hook_list_clear __attribute((alias("IA__g_hook_list_clear"), visibility("default"))); + +#undef g_hook_list_init +extern __typeof (g_hook_list_init) g_hook_list_init __attribute((alias("IA__g_hook_list_init"), visibility("default"))); + +#undef g_hook_list_invoke +extern __typeof (g_hook_list_invoke) g_hook_list_invoke __attribute((alias("IA__g_hook_list_invoke"), visibility("default"))); + +#undef g_hook_list_invoke_check +extern __typeof (g_hook_list_invoke_check) g_hook_list_invoke_check __attribute((alias("IA__g_hook_list_invoke_check"), visibility("default"))); + +#undef g_hook_list_marshal +extern __typeof (g_hook_list_marshal) g_hook_list_marshal __attribute((alias("IA__g_hook_list_marshal"), visibility("default"))); + +#undef g_hook_list_marshal_check +extern __typeof (g_hook_list_marshal_check) g_hook_list_marshal_check __attribute((alias("IA__g_hook_list_marshal_check"), visibility("default"))); + +#undef g_hook_next_valid +extern __typeof (g_hook_next_valid) g_hook_next_valid __attribute((alias("IA__g_hook_next_valid"), visibility("default"))); + +#undef g_hook_prepend +extern __typeof (g_hook_prepend) g_hook_prepend __attribute((alias("IA__g_hook_prepend"), visibility("default"))); + +#undef g_hook_ref +extern __typeof (g_hook_ref) g_hook_ref __attribute((alias("IA__g_hook_ref"), visibility("default"))); + +#undef g_hook_unref +extern __typeof (g_hook_unref) g_hook_unref __attribute((alias("IA__g_hook_unref"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IOCHANNEL_C__) +#undef g_io_add_watch +extern __typeof (g_io_add_watch) g_io_add_watch __attribute((alias("IA__g_io_add_watch"), visibility("default"))); + +#undef g_io_add_watch_full +extern __typeof (g_io_add_watch_full) g_io_add_watch_full __attribute((alias("IA__g_io_add_watch_full"), visibility("default"))); + +#undef g_io_create_watch +extern __typeof (g_io_create_watch) g_io_create_watch __attribute((alias("IA__g_io_create_watch"), visibility("default"))); + +#undef g_io_channel_error_from_errno +extern __typeof (g_io_channel_error_from_errno) g_io_channel_error_from_errno __attribute((alias("IA__g_io_channel_error_from_errno"), visibility("default"))); + +#undef g_io_channel_error_quark +extern __typeof (g_io_channel_error_quark) g_io_channel_error_quark __attribute((alias("IA__g_io_channel_error_quark"), visibility("default"))); + +#undef g_io_channel_flush +extern __typeof (g_io_channel_flush) g_io_channel_flush __attribute((alias("IA__g_io_channel_flush"), visibility("default"))); + +#undef g_io_channel_get_buffer_condition +extern __typeof (g_io_channel_get_buffer_condition) g_io_channel_get_buffer_condition __attribute((alias("IA__g_io_channel_get_buffer_condition"), visibility("default"))); + +#undef g_io_channel_get_buffered +extern __typeof (g_io_channel_get_buffered) g_io_channel_get_buffered __attribute((alias("IA__g_io_channel_get_buffered"), visibility("default"))); + +#undef g_io_channel_get_buffer_size +extern __typeof (g_io_channel_get_buffer_size) g_io_channel_get_buffer_size __attribute((alias("IA__g_io_channel_get_buffer_size"), visibility("default"))); + +#undef g_io_channel_get_close_on_unref +extern __typeof (g_io_channel_get_close_on_unref) g_io_channel_get_close_on_unref __attribute((alias("IA__g_io_channel_get_close_on_unref"), visibility("default"))); + +#undef g_io_channel_get_encoding +extern __typeof (g_io_channel_get_encoding) g_io_channel_get_encoding __attribute((alias("IA__g_io_channel_get_encoding"), visibility("default"))); + +#undef g_io_channel_get_flags +extern __typeof (g_io_channel_get_flags) g_io_channel_get_flags __attribute((alias("IA__g_io_channel_get_flags"), visibility("default"))); + +#undef g_io_channel_get_line_term +extern __typeof (g_io_channel_get_line_term) g_io_channel_get_line_term __attribute((alias("IA__g_io_channel_get_line_term"), visibility("default"))); + +#undef g_io_channel_init +extern __typeof (g_io_channel_init) g_io_channel_init __attribute((alias("IA__g_io_channel_init"), visibility("default"))); + +#undef g_io_channel_read_chars +extern __typeof (g_io_channel_read_chars) g_io_channel_read_chars __attribute((alias("IA__g_io_channel_read_chars"), visibility("default"))); + +#undef g_io_channel_read_line +extern __typeof (g_io_channel_read_line) g_io_channel_read_line __attribute((alias("IA__g_io_channel_read_line"), visibility("default"))); + +#undef g_io_channel_read_line_string +extern __typeof (g_io_channel_read_line_string) g_io_channel_read_line_string __attribute((alias("IA__g_io_channel_read_line_string"), visibility("default"))); + +#undef g_io_channel_read_to_end +extern __typeof (g_io_channel_read_to_end) g_io_channel_read_to_end __attribute((alias("IA__g_io_channel_read_to_end"), visibility("default"))); + +#undef g_io_channel_read_unichar +extern __typeof (g_io_channel_read_unichar) g_io_channel_read_unichar __attribute((alias("IA__g_io_channel_read_unichar"), visibility("default"))); + +#undef g_io_channel_ref +extern __typeof (g_io_channel_ref) g_io_channel_ref __attribute((alias("IA__g_io_channel_ref"), visibility("default"))); + +#undef g_io_channel_seek_position +extern __typeof (g_io_channel_seek_position) g_io_channel_seek_position __attribute((alias("IA__g_io_channel_seek_position"), visibility("default"))); + +#undef g_io_channel_set_buffered +extern __typeof (g_io_channel_set_buffered) g_io_channel_set_buffered __attribute((alias("IA__g_io_channel_set_buffered"), visibility("default"))); + +#undef g_io_channel_set_buffer_size +extern __typeof (g_io_channel_set_buffer_size) g_io_channel_set_buffer_size __attribute((alias("IA__g_io_channel_set_buffer_size"), visibility("default"))); + +#undef g_io_channel_set_close_on_unref +extern __typeof (g_io_channel_set_close_on_unref) g_io_channel_set_close_on_unref __attribute((alias("IA__g_io_channel_set_close_on_unref"), visibility("default"))); + +#undef g_io_channel_set_encoding +extern __typeof (g_io_channel_set_encoding) g_io_channel_set_encoding __attribute((alias("IA__g_io_channel_set_encoding"), visibility("default"))); + +#undef g_io_channel_set_flags +extern __typeof (g_io_channel_set_flags) g_io_channel_set_flags __attribute((alias("IA__g_io_channel_set_flags"), visibility("default"))); + +#undef g_io_channel_set_line_term +extern __typeof (g_io_channel_set_line_term) g_io_channel_set_line_term __attribute((alias("IA__g_io_channel_set_line_term"), visibility("default"))); + +#undef g_io_channel_shutdown +extern __typeof (g_io_channel_shutdown) g_io_channel_shutdown __attribute((alias("IA__g_io_channel_shutdown"), visibility("default"))); + +#undef g_io_channel_unref +extern __typeof (g_io_channel_unref) g_io_channel_unref __attribute((alias("IA__g_io_channel_unref"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_io_channel_close +extern __typeof (g_io_channel_close) g_io_channel_close __attribute((alias("IA__g_io_channel_close"), visibility("default"))); + +#undef g_io_channel_read +extern __typeof (g_io_channel_read) g_io_channel_read __attribute((alias("IA__g_io_channel_read"), visibility("default"))); + +#undef g_io_channel_seek +extern __typeof (g_io_channel_seek) g_io_channel_seek __attribute((alias("IA__g_io_channel_seek"), visibility("default"))); + +#undef g_io_channel_write +extern __typeof (g_io_channel_write) g_io_channel_write __attribute((alias("IA__g_io_channel_write"), visibility("default"))); + +#endif +#undef g_io_channel_write_chars +extern __typeof (g_io_channel_write_chars) g_io_channel_write_chars __attribute((alias("IA__g_io_channel_write_chars"), visibility("default"))); + +#undef g_io_channel_write_unichar +extern __typeof (g_io_channel_write_unichar) g_io_channel_write_unichar __attribute((alias("IA__g_io_channel_write_unichar"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IO_UNIX_C__) +#ifdef G_OS_UNIX +#undef g_io_channel_unix_get_fd +extern __typeof (g_io_channel_unix_get_fd) g_io_channel_unix_get_fd __attribute((alias("IA__g_io_channel_unix_get_fd"), visibility("default"))); + +#undef g_io_channel_unix_new +extern __typeof (g_io_channel_unix_new) g_io_channel_unix_new __attribute((alias("IA__g_io_channel_unix_new"), visibility("default"))); + +#undef g_io_channel_new_file +extern __typeof (g_io_channel_new_file) g_io_channel_new_file __attribute((alias("IA__g_io_channel_new_file"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IO_WIN32_C__) +#ifdef G_OS_WIN32 +#undef g_io_channel_unix_get_fd +extern __typeof (g_io_channel_unix_get_fd) g_io_channel_unix_get_fd __attribute((alias("IA__g_io_channel_unix_get_fd"), visibility("default"))); + +#undef g_io_channel_unix_new +extern __typeof (g_io_channel_unix_new) g_io_channel_unix_new __attribute((alias("IA__g_io_channel_unix_new"), visibility("default"))); + +#ifndef _WIN64 +#undef g_io_channel_new_file +extern __typeof (g_io_channel_new_file) g_io_channel_new_file __attribute((alias("IA__g_io_channel_new_file"), visibility("default"))); + +#endif +#undef g_io_channel_new_file_utf8 +extern __typeof (g_io_channel_new_file_utf8) g_io_channel_new_file_utf8 __attribute((alias("IA__g_io_channel_new_file_utf8"), visibility("default"))); + +#undef g_io_channel_win32_get_fd +extern __typeof (g_io_channel_win32_get_fd) g_io_channel_win32_get_fd __attribute((alias("IA__g_io_channel_win32_get_fd"), visibility("default"))); + +#undef g_io_channel_win32_make_pollfd +extern __typeof (g_io_channel_win32_make_pollfd) g_io_channel_win32_make_pollfd __attribute((alias("IA__g_io_channel_win32_make_pollfd"), visibility("default"))); + +#undef g_io_channel_win32_new_fd +extern __typeof (g_io_channel_win32_new_fd) g_io_channel_win32_new_fd __attribute((alias("IA__g_io_channel_win32_new_fd"), visibility("default"))); + +#undef g_io_channel_win32_new_messages +extern __typeof (g_io_channel_win32_new_messages) g_io_channel_win32_new_messages __attribute((alias("IA__g_io_channel_win32_new_messages"), visibility("default"))); + +#undef g_io_channel_win32_new_socket +extern __typeof (g_io_channel_win32_new_socket) g_io_channel_win32_new_socket __attribute((alias("IA__g_io_channel_win32_new_socket"), visibility("default"))); + +#ifndef _WIN64 +#undef g_io_channel_win32_new_stream_socket +extern __typeof (g_io_channel_win32_new_stream_socket) g_io_channel_win32_new_stream_socket __attribute((alias("IA__g_io_channel_win32_new_stream_socket"), visibility("default"))); + +#endif +#undef g_io_channel_win32_poll +extern __typeof (g_io_channel_win32_poll) g_io_channel_win32_poll __attribute((alias("IA__g_io_channel_win32_poll"), visibility("default"))); + +#undef g_io_channel_win32_set_debug +extern __typeof (g_io_channel_win32_set_debug) g_io_channel_win32_set_debug __attribute((alias("IA__g_io_channel_win32_set_debug"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_KEY_FILE_H__) +#if IN_FILE(__G_KEY_FILE_C__) +#undef g_key_file_error_quark +extern __typeof (g_key_file_error_quark) g_key_file_error_quark __attribute((alias("IA__g_key_file_error_quark"), visibility("default"))); + +#undef g_key_file_free +extern __typeof (g_key_file_free) g_key_file_free __attribute((alias("IA__g_key_file_free"), visibility("default"))); + +#undef g_key_file_get_boolean +extern __typeof (g_key_file_get_boolean) g_key_file_get_boolean __attribute((alias("IA__g_key_file_get_boolean"), visibility("default"))); + +#undef g_key_file_get_boolean_list +extern __typeof (g_key_file_get_boolean_list) g_key_file_get_boolean_list __attribute((alias("IA__g_key_file_get_boolean_list"), visibility("default"))); + +#undef g_key_file_get_comment +extern __typeof (g_key_file_get_comment) g_key_file_get_comment __attribute((alias("IA__g_key_file_get_comment"), visibility("default"))); + +#undef g_key_file_get_groups +extern __typeof (g_key_file_get_groups) g_key_file_get_groups __attribute((alias("IA__g_key_file_get_groups"), visibility("default"))); + +#undef g_key_file_get_double +extern __typeof (g_key_file_get_double) g_key_file_get_double __attribute((alias("IA__g_key_file_get_double"), visibility("default"))); + +#undef g_key_file_get_double_list +extern __typeof (g_key_file_get_double_list) g_key_file_get_double_list __attribute((alias("IA__g_key_file_get_double_list"), visibility("default"))); + +#undef g_key_file_get_integer +extern __typeof (g_key_file_get_integer) g_key_file_get_integer __attribute((alias("IA__g_key_file_get_integer"), visibility("default"))); + +#undef g_key_file_get_integer_list +extern __typeof (g_key_file_get_integer_list) g_key_file_get_integer_list __attribute((alias("IA__g_key_file_get_integer_list"), visibility("default"))); + +#undef g_key_file_get_keys +extern __typeof (g_key_file_get_keys) g_key_file_get_keys __attribute((alias("IA__g_key_file_get_keys"), visibility("default"))); + +#undef g_key_file_get_locale_string +extern __typeof (g_key_file_get_locale_string) g_key_file_get_locale_string __attribute((alias("IA__g_key_file_get_locale_string"), visibility("default"))); + +#undef g_key_file_get_locale_string_list +extern __typeof (g_key_file_get_locale_string_list) g_key_file_get_locale_string_list __attribute((alias("IA__g_key_file_get_locale_string_list"), visibility("default"))); + +#undef g_key_file_get_start_group +extern __typeof (g_key_file_get_start_group) g_key_file_get_start_group __attribute((alias("IA__g_key_file_get_start_group"), visibility("default"))); + +#undef g_key_file_get_string +extern __typeof (g_key_file_get_string) g_key_file_get_string __attribute((alias("IA__g_key_file_get_string"), visibility("default"))); + +#undef g_key_file_get_string_list +extern __typeof (g_key_file_get_string_list) g_key_file_get_string_list __attribute((alias("IA__g_key_file_get_string_list"), visibility("default"))); + +#undef g_key_file_get_value +extern __typeof (g_key_file_get_value) g_key_file_get_value __attribute((alias("IA__g_key_file_get_value"), visibility("default"))); + +#undef g_key_file_has_group +extern __typeof (g_key_file_has_group) g_key_file_has_group __attribute((alias("IA__g_key_file_has_group"), visibility("default"))); + +#undef g_key_file_has_key +extern __typeof (g_key_file_has_key) g_key_file_has_key __attribute((alias("IA__g_key_file_has_key"), visibility("default"))); + +#undef g_key_file_load_from_dirs +extern __typeof (g_key_file_load_from_dirs) g_key_file_load_from_dirs __attribute((alias("IA__g_key_file_load_from_dirs"), visibility("default"))); + +#undef g_key_file_load_from_data +extern __typeof (g_key_file_load_from_data) g_key_file_load_from_data __attribute((alias("IA__g_key_file_load_from_data"), visibility("default"))); + +#undef g_key_file_load_from_data_dirs +extern __typeof (g_key_file_load_from_data_dirs) g_key_file_load_from_data_dirs __attribute((alias("IA__g_key_file_load_from_data_dirs"), visibility("default"))); + +#undef g_key_file_load_from_file +extern __typeof (g_key_file_load_from_file) g_key_file_load_from_file __attribute((alias("IA__g_key_file_load_from_file"), visibility("default"))); + +#undef g_key_file_new +extern __typeof (g_key_file_new) g_key_file_new __attribute((alias("IA__g_key_file_new"), visibility("default"))); + +#undef g_key_file_remove_comment +extern __typeof (g_key_file_remove_comment) g_key_file_remove_comment __attribute((alias("IA__g_key_file_remove_comment"), visibility("default"))); + +#undef g_key_file_remove_group +extern __typeof (g_key_file_remove_group) g_key_file_remove_group __attribute((alias("IA__g_key_file_remove_group"), visibility("default"))); + +#undef g_key_file_remove_key +extern __typeof (g_key_file_remove_key) g_key_file_remove_key __attribute((alias("IA__g_key_file_remove_key"), visibility("default"))); + +#undef g_key_file_set_boolean +extern __typeof (g_key_file_set_boolean) g_key_file_set_boolean __attribute((alias("IA__g_key_file_set_boolean"), visibility("default"))); + +#undef g_key_file_set_boolean_list +extern __typeof (g_key_file_set_boolean_list) g_key_file_set_boolean_list __attribute((alias("IA__g_key_file_set_boolean_list"), visibility("default"))); + +#undef g_key_file_set_comment +extern __typeof (g_key_file_set_comment) g_key_file_set_comment __attribute((alias("IA__g_key_file_set_comment"), visibility("default"))); + +#undef g_key_file_set_double +extern __typeof (g_key_file_set_double) g_key_file_set_double __attribute((alias("IA__g_key_file_set_double"), visibility("default"))); + +#undef g_key_file_set_double_list +extern __typeof (g_key_file_set_double_list) g_key_file_set_double_list __attribute((alias("IA__g_key_file_set_double_list"), visibility("default"))); + +#undef g_key_file_set_integer +extern __typeof (g_key_file_set_integer) g_key_file_set_integer __attribute((alias("IA__g_key_file_set_integer"), visibility("default"))); + +#undef g_key_file_set_integer_list +extern __typeof (g_key_file_set_integer_list) g_key_file_set_integer_list __attribute((alias("IA__g_key_file_set_integer_list"), visibility("default"))); + +#undef g_key_file_set_list_separator +extern __typeof (g_key_file_set_list_separator) g_key_file_set_list_separator __attribute((alias("IA__g_key_file_set_list_separator"), visibility("default"))); + +#undef g_key_file_set_locale_string +extern __typeof (g_key_file_set_locale_string) g_key_file_set_locale_string __attribute((alias("IA__g_key_file_set_locale_string"), visibility("default"))); + +#undef g_key_file_set_locale_string_list +extern __typeof (g_key_file_set_locale_string_list) g_key_file_set_locale_string_list __attribute((alias("IA__g_key_file_set_locale_string_list"), visibility("default"))); + +#undef g_key_file_set_string +extern __typeof (g_key_file_set_string) g_key_file_set_string __attribute((alias("IA__g_key_file_set_string"), visibility("default"))); + +#undef g_key_file_set_string_list +extern __typeof (g_key_file_set_string_list) g_key_file_set_string_list __attribute((alias("IA__g_key_file_set_string_list"), visibility("default"))); + +#undef g_key_file_set_value +extern __typeof (g_key_file_set_value) g_key_file_set_value __attribute((alias("IA__g_key_file_set_value"), visibility("default"))); + +#undef g_key_file_to_data +extern __typeof (g_key_file_to_data) g_key_file_to_data __attribute((alias("IA__g_key_file_to_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_LIST_H__) +#if IN_FILE(__G_LIST_C__) +#undef g_list_alloc +extern __typeof (g_list_alloc) g_list_alloc __attribute((alias("IA__g_list_alloc"), visibility("default"))); + +#undef g_list_append +extern __typeof (g_list_append) g_list_append __attribute((alias("IA__g_list_append"), visibility("default"))); + +#undef g_list_concat +extern __typeof (g_list_concat) g_list_concat __attribute((alias("IA__g_list_concat"), visibility("default"))); + +#undef g_list_copy +extern __typeof (g_list_copy) g_list_copy __attribute((alias("IA__g_list_copy"), visibility("default"))); + +#undef g_list_delete_link +extern __typeof (g_list_delete_link) g_list_delete_link __attribute((alias("IA__g_list_delete_link"), visibility("default"))); + +#undef g_list_find +extern __typeof (g_list_find) g_list_find __attribute((alias("IA__g_list_find"), visibility("default"))); + +#undef g_list_find_custom +extern __typeof (g_list_find_custom) g_list_find_custom __attribute((alias("IA__g_list_find_custom"), visibility("default"))); + +#undef g_list_first +extern __typeof (g_list_first) g_list_first __attribute((alias("IA__g_list_first"), visibility("default"))); + +#undef g_list_foreach +extern __typeof (g_list_foreach) g_list_foreach __attribute((alias("IA__g_list_foreach"), visibility("default"))); + +#undef g_list_free +extern __typeof (g_list_free) g_list_free __attribute((alias("IA__g_list_free"), visibility("default"))); + +#undef g_list_free_1 +extern __typeof (g_list_free_1) g_list_free_1 __attribute((alias("IA__g_list_free_1"), visibility("default"))); + +#undef g_list_index +extern __typeof (g_list_index) g_list_index __attribute((alias("IA__g_list_index"), visibility("default"))); + +#undef g_list_insert +extern __typeof (g_list_insert) g_list_insert __attribute((alias("IA__g_list_insert"), visibility("default"))); + +#undef g_list_insert_before +extern __typeof (g_list_insert_before) g_list_insert_before __attribute((alias("IA__g_list_insert_before"), visibility("default"))); + +#undef g_list_insert_sorted +extern __typeof (g_list_insert_sorted) g_list_insert_sorted __attribute((alias("IA__g_list_insert_sorted"), visibility("default"))); + +#undef g_list_insert_sorted_with_data +extern __typeof (g_list_insert_sorted_with_data) g_list_insert_sorted_with_data __attribute((alias("IA__g_list_insert_sorted_with_data"), visibility("default"))); + +#undef g_list_last +extern __typeof (g_list_last) g_list_last __attribute((alias("IA__g_list_last"), visibility("default"))); + +#undef g_list_length +extern __typeof (g_list_length) g_list_length __attribute((alias("IA__g_list_length"), visibility("default"))); + +#undef g_list_nth +extern __typeof (g_list_nth) g_list_nth __attribute((alias("IA__g_list_nth"), visibility("default"))); + +#undef g_list_nth_data +extern __typeof (g_list_nth_data) g_list_nth_data __attribute((alias("IA__g_list_nth_data"), visibility("default"))); + +#undef g_list_nth_prev +extern __typeof (g_list_nth_prev) g_list_nth_prev __attribute((alias("IA__g_list_nth_prev"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_list_pop_allocator +extern __typeof (g_list_pop_allocator) g_list_pop_allocator __attribute((alias("IA__g_list_pop_allocator"), visibility("default"))); + +#endif +#undef g_list_position +extern __typeof (g_list_position) g_list_position __attribute((alias("IA__g_list_position"), visibility("default"))); + +#undef g_list_prepend +extern __typeof (g_list_prepend) g_list_prepend __attribute((alias("IA__g_list_prepend"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_list_push_allocator +extern __typeof (g_list_push_allocator) g_list_push_allocator __attribute((alias("IA__g_list_push_allocator"), visibility("default"))); + +#endif +#undef g_list_remove +extern __typeof (g_list_remove) g_list_remove __attribute((alias("IA__g_list_remove"), visibility("default"))); + +#undef g_list_remove_all +extern __typeof (g_list_remove_all) g_list_remove_all __attribute((alias("IA__g_list_remove_all"), visibility("default"))); + +#undef g_list_remove_link +extern __typeof (g_list_remove_link) g_list_remove_link __attribute((alias("IA__g_list_remove_link"), visibility("default"))); + +#undef g_list_reverse +extern __typeof (g_list_reverse) g_list_reverse __attribute((alias("IA__g_list_reverse"), visibility("default"))); + +#undef g_list_sort +extern __typeof (g_list_sort) g_list_sort __attribute((alias("IA__g_list_sort"), visibility("default"))); + +#undef g_list_sort_with_data +extern __typeof (g_list_sort_with_data) g_list_sort_with_data __attribute((alias("IA__g_list_sort_with_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_MAIN_H__) +#if IN_FILE(__G_MAIN_C__) +#undef g_child_watch_add +extern __typeof (g_child_watch_add) g_child_watch_add __attribute((alias("IA__g_child_watch_add"), visibility("default"))); + +#undef g_child_watch_add_full +extern __typeof (g_child_watch_add_full) g_child_watch_add_full __attribute((alias("IA__g_child_watch_add_full"), visibility("default"))); + +#undef g_child_watch_source_new +extern __typeof (g_child_watch_source_new) g_child_watch_source_new __attribute((alias("IA__g_child_watch_source_new"), visibility("default"))); + +#undef g_get_current_time +extern __typeof (g_get_current_time) g_get_current_time __attribute((alias("IA__g_get_current_time"), visibility("default"))); + +#undef g_main_context_acquire +extern __typeof (g_main_context_acquire) g_main_context_acquire __attribute((alias("IA__g_main_context_acquire"), visibility("default"))); + +#undef g_main_context_add_poll +extern __typeof (g_main_context_add_poll) g_main_context_add_poll __attribute((alias("IA__g_main_context_add_poll"), visibility("default"))); + +#undef g_main_context_check +extern __typeof (g_main_context_check) g_main_context_check __attribute((alias("IA__g_main_context_check"), visibility("default"))); + +#undef g_main_context_default +extern __typeof (g_main_context_default) g_main_context_default __attribute((alias("IA__g_main_context_default"), visibility("default"))); + +#undef g_main_context_dispatch +extern __typeof (g_main_context_dispatch) g_main_context_dispatch __attribute((alias("IA__g_main_context_dispatch"), visibility("default"))); + +#undef g_main_context_find_source_by_funcs_user_data +extern __typeof (g_main_context_find_source_by_funcs_user_data) g_main_context_find_source_by_funcs_user_data __attribute((alias("IA__g_main_context_find_source_by_funcs_user_data"), visibility("default"))); + +#undef g_main_context_find_source_by_id +extern __typeof (g_main_context_find_source_by_id) g_main_context_find_source_by_id __attribute((alias("IA__g_main_context_find_source_by_id"), visibility("default"))); + +#undef g_main_context_find_source_by_user_data +extern __typeof (g_main_context_find_source_by_user_data) g_main_context_find_source_by_user_data __attribute((alias("IA__g_main_context_find_source_by_user_data"), visibility("default"))); + +#undef g_main_context_get_poll_func +extern __typeof (g_main_context_get_poll_func) g_main_context_get_poll_func __attribute((alias("IA__g_main_context_get_poll_func"), visibility("default"))); + +#undef g_main_context_get_thread_default +extern __typeof (g_main_context_get_thread_default) g_main_context_get_thread_default __attribute((alias("IA__g_main_context_get_thread_default"), visibility("default"))); + +#undef g_main_context_is_owner +extern __typeof (g_main_context_is_owner) g_main_context_is_owner __attribute((alias("IA__g_main_context_is_owner"), visibility("default"))); + +#undef g_main_context_iteration +extern __typeof (g_main_context_iteration) g_main_context_iteration __attribute((alias("IA__g_main_context_iteration"), visibility("default"))); + +#undef g_main_context_new +extern __typeof (g_main_context_new) g_main_context_new __attribute((alias("IA__g_main_context_new"), visibility("default"))); + +#undef g_main_context_pending +extern __typeof (g_main_context_pending) g_main_context_pending __attribute((alias("IA__g_main_context_pending"), visibility("default"))); + +#undef g_main_context_pop_thread_default +extern __typeof (g_main_context_pop_thread_default) g_main_context_pop_thread_default __attribute((alias("IA__g_main_context_pop_thread_default"), visibility("default"))); + +#undef g_main_context_prepare +extern __typeof (g_main_context_prepare) g_main_context_prepare __attribute((alias("IA__g_main_context_prepare"), visibility("default"))); + +#undef g_main_context_push_thread_default +extern __typeof (g_main_context_push_thread_default) g_main_context_push_thread_default __attribute((alias("IA__g_main_context_push_thread_default"), visibility("default"))); + +#undef g_main_context_query +extern __typeof (g_main_context_query) g_main_context_query __attribute((alias("IA__g_main_context_query"), visibility("default"))); + +#undef g_main_context_ref +extern __typeof (g_main_context_ref) g_main_context_ref __attribute((alias("IA__g_main_context_ref"), visibility("default"))); + +#undef g_main_context_release +extern __typeof (g_main_context_release) g_main_context_release __attribute((alias("IA__g_main_context_release"), visibility("default"))); + +#undef g_main_context_remove_poll +extern __typeof (g_main_context_remove_poll) g_main_context_remove_poll __attribute((alias("IA__g_main_context_remove_poll"), visibility("default"))); + +#undef g_main_context_set_poll_func +extern __typeof (g_main_context_set_poll_func) g_main_context_set_poll_func __attribute((alias("IA__g_main_context_set_poll_func"), visibility("default"))); + +#undef g_main_context_unref +extern __typeof (g_main_context_unref) g_main_context_unref __attribute((alias("IA__g_main_context_unref"), visibility("default"))); + +#undef g_main_context_wait +extern __typeof (g_main_context_wait) g_main_context_wait __attribute((alias("IA__g_main_context_wait"), visibility("default"))); + +#undef g_main_context_wakeup +extern __typeof (g_main_context_wakeup) g_main_context_wakeup __attribute((alias("IA__g_main_context_wakeup"), visibility("default"))); + +#undef g_main_depth +extern __typeof (g_main_depth) g_main_depth __attribute((alias("IA__g_main_depth"), visibility("default"))); + +#undef g_main_current_source +extern __typeof (g_main_current_source) g_main_current_source __attribute((alias("IA__g_main_current_source"), visibility("default"))); + +#undef g_main_loop_get_context +extern __typeof (g_main_loop_get_context) g_main_loop_get_context __attribute((alias("IA__g_main_loop_get_context"), visibility("default"))); + +#undef g_main_loop_is_running +extern __typeof (g_main_loop_is_running) g_main_loop_is_running __attribute((alias("IA__g_main_loop_is_running"), visibility("default"))); + +#undef g_main_loop_new +extern __typeof (g_main_loop_new) g_main_loop_new __attribute((alias("IA__g_main_loop_new"), visibility("default"))); + +#undef g_main_loop_quit +extern __typeof (g_main_loop_quit) g_main_loop_quit __attribute((alias("IA__g_main_loop_quit"), visibility("default"))); + +#undef g_main_loop_ref +extern __typeof (g_main_loop_ref) g_main_loop_ref __attribute((alias("IA__g_main_loop_ref"), visibility("default"))); + +#undef g_main_loop_run +extern __typeof (g_main_loop_run) g_main_loop_run __attribute((alias("IA__g_main_loop_run"), visibility("default"))); + +#undef g_main_loop_unref +extern __typeof (g_main_loop_unref) g_main_loop_unref __attribute((alias("IA__g_main_loop_unref"), visibility("default"))); + +#undef g_source_add_poll +extern __typeof (g_source_add_poll) g_source_add_poll __attribute((alias("IA__g_source_add_poll"), visibility("default"))); + +#undef g_source_attach +extern __typeof (g_source_attach) g_source_attach __attribute((alias("IA__g_source_attach"), visibility("default"))); + +#undef g_source_destroy +extern __typeof (g_source_destroy) g_source_destroy __attribute((alias("IA__g_source_destroy"), visibility("default"))); + +#undef g_source_get_can_recurse +extern __typeof (g_source_get_can_recurse) g_source_get_can_recurse __attribute((alias("IA__g_source_get_can_recurse"), visibility("default"))); + +#undef g_source_get_context +extern __typeof (g_source_get_context) g_source_get_context __attribute((alias("IA__g_source_get_context"), visibility("default"))); + +#undef g_source_get_current_time +extern __typeof (g_source_get_current_time) g_source_get_current_time __attribute((alias("IA__g_source_get_current_time"), visibility("default"))); + +#undef g_source_get_id +extern __typeof (g_source_get_id) g_source_get_id __attribute((alias("IA__g_source_get_id"), visibility("default"))); + +#undef g_source_get_priority +extern __typeof (g_source_get_priority) g_source_get_priority __attribute((alias("IA__g_source_get_priority"), visibility("default"))); + +#undef g_source_new +extern __typeof (g_source_new) g_source_new __attribute((alias("IA__g_source_new"), visibility("default"))); + +#undef g_source_ref +extern __typeof (g_source_ref) g_source_ref __attribute((alias("IA__g_source_ref"), visibility("default"))); + +#undef g_source_remove +extern __typeof (g_source_remove) g_source_remove __attribute((alias("IA__g_source_remove"), visibility("default"))); + +#undef g_source_remove_by_funcs_user_data +extern __typeof (g_source_remove_by_funcs_user_data) g_source_remove_by_funcs_user_data __attribute((alias("IA__g_source_remove_by_funcs_user_data"), visibility("default"))); + +#undef g_source_remove_by_user_data +extern __typeof (g_source_remove_by_user_data) g_source_remove_by_user_data __attribute((alias("IA__g_source_remove_by_user_data"), visibility("default"))); + +#undef g_source_remove_poll +extern __typeof (g_source_remove_poll) g_source_remove_poll __attribute((alias("IA__g_source_remove_poll"), visibility("default"))); + +#undef g_source_set_callback +extern __typeof (g_source_set_callback) g_source_set_callback __attribute((alias("IA__g_source_set_callback"), visibility("default"))); + +#undef g_source_set_callback_indirect +extern __typeof (g_source_set_callback_indirect) g_source_set_callback_indirect __attribute((alias("IA__g_source_set_callback_indirect"), visibility("default"))); + +#undef g_source_set_can_recurse +extern __typeof (g_source_set_can_recurse) g_source_set_can_recurse __attribute((alias("IA__g_source_set_can_recurse"), visibility("default"))); + +#undef g_source_set_funcs +extern __typeof (g_source_set_funcs) g_source_set_funcs __attribute((alias("IA__g_source_set_funcs"), visibility("default"))); + +#undef g_source_is_destroyed +extern __typeof (g_source_is_destroyed) g_source_is_destroyed __attribute((alias("IA__g_source_is_destroyed"), visibility("default"))); + +#undef g_source_set_priority +extern __typeof (g_source_set_priority) g_source_set_priority __attribute((alias("IA__g_source_set_priority"), visibility("default"))); + +#undef g_source_unref +extern __typeof (g_source_unref) g_source_unref __attribute((alias("IA__g_source_unref"), visibility("default"))); + +#undef g_idle_add +extern __typeof (g_idle_add) g_idle_add __attribute((alias("IA__g_idle_add"), visibility("default"))); + +#undef g_idle_add_full +extern __typeof (g_idle_add_full) g_idle_add_full __attribute((alias("IA__g_idle_add_full"), visibility("default"))); + +#undef g_idle_remove_by_data +extern __typeof (g_idle_remove_by_data) g_idle_remove_by_data __attribute((alias("IA__g_idle_remove_by_data"), visibility("default"))); + +#undef g_idle_source_new +extern __typeof (g_idle_source_new) g_idle_source_new __attribute((alias("IA__g_idle_source_new"), visibility("default"))); + +#undef g_timeout_add +extern __typeof (g_timeout_add) g_timeout_add __attribute((alias("IA__g_timeout_add"), visibility("default"))); + +#undef g_timeout_add_seconds +extern __typeof (g_timeout_add_seconds) g_timeout_add_seconds __attribute((alias("IA__g_timeout_add_seconds"), visibility("default"))); + +#undef g_timeout_add_full +extern __typeof (g_timeout_add_full) g_timeout_add_full __attribute((alias("IA__g_timeout_add_full"), visibility("default"))); + +#undef g_timeout_add_seconds_full +extern __typeof (g_timeout_add_seconds_full) g_timeout_add_seconds_full __attribute((alias("IA__g_timeout_add_seconds_full"), visibility("default"))); + +#undef g_timeout_source_new +extern __typeof (g_timeout_source_new) g_timeout_source_new __attribute((alias("IA__g_timeout_source_new"), visibility("default"))); + +#undef g_timeout_source_new_seconds +extern __typeof (g_timeout_source_new_seconds) g_timeout_source_new_seconds __attribute((alias("IA__g_timeout_source_new_seconds"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_MAPPED_FILE_H__) +#if IN_FILE(__G_MAPPED_FILE_C__) +#undef g_mapped_file_new +extern __typeof (g_mapped_file_new) g_mapped_file_new __attribute((alias("IA__g_mapped_file_new"), visibility("default"))); + +#undef g_mapped_file_get_length +extern __typeof (g_mapped_file_get_length) g_mapped_file_get_length __attribute((alias("IA__g_mapped_file_get_length"), visibility("default"))); + +#undef g_mapped_file_get_contents +extern __typeof (g_mapped_file_get_contents) g_mapped_file_get_contents __attribute((alias("IA__g_mapped_file_get_contents"), visibility("default"))); + +#undef g_mapped_file_ref +extern __typeof (g_mapped_file_ref) g_mapped_file_ref __attribute((alias("IA__g_mapped_file_ref"), visibility("default"))); + +#undef g_mapped_file_unref +extern __typeof (g_mapped_file_unref) g_mapped_file_unref __attribute((alias("IA__g_mapped_file_unref"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_mapped_file_free +extern __typeof (g_mapped_file_free) g_mapped_file_free __attribute((alias("IA__g_mapped_file_free"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_MARKUP_H__) +#if IN_FILE(__G_MARKUP_C__) +#undef g_markup_error_quark +extern __typeof (g_markup_error_quark) g_markup_error_quark __attribute((alias("IA__g_markup_error_quark"), visibility("default"))); + +#undef g_markup_escape_text +extern __typeof (g_markup_escape_text) g_markup_escape_text __attribute((alias("IA__g_markup_escape_text"), visibility("default"))); + +#undef g_markup_parse_context_end_parse +extern __typeof (g_markup_parse_context_end_parse) g_markup_parse_context_end_parse __attribute((alias("IA__g_markup_parse_context_end_parse"), visibility("default"))); + +#undef g_markup_parse_context_free +extern __typeof (g_markup_parse_context_free) g_markup_parse_context_free __attribute((alias("IA__g_markup_parse_context_free"), visibility("default"))); + +#undef g_markup_parse_context_get_element +extern __typeof (g_markup_parse_context_get_element) g_markup_parse_context_get_element __attribute((alias("IA__g_markup_parse_context_get_element"), visibility("default"))); + +#undef g_markup_parse_context_get_element_stack +extern __typeof (g_markup_parse_context_get_element_stack) g_markup_parse_context_get_element_stack __attribute((alias("IA__g_markup_parse_context_get_element_stack"), visibility("default"))); + +#undef g_markup_parse_context_get_position +extern __typeof (g_markup_parse_context_get_position) g_markup_parse_context_get_position __attribute((alias("IA__g_markup_parse_context_get_position"), visibility("default"))); + +#undef g_markup_parse_context_get_user_data +extern __typeof (g_markup_parse_context_get_user_data) g_markup_parse_context_get_user_data __attribute((alias("IA__g_markup_parse_context_get_user_data"), visibility("default"))); + +#undef g_markup_parse_context_new +extern __typeof (g_markup_parse_context_new) g_markup_parse_context_new __attribute((alias("IA__g_markup_parse_context_new"), visibility("default"))); + +#undef g_markup_parse_context_parse +extern __typeof (g_markup_parse_context_parse) g_markup_parse_context_parse __attribute((alias("IA__g_markup_parse_context_parse"), visibility("default"))); + +#undef g_markup_parse_context_push +extern __typeof (g_markup_parse_context_push) g_markup_parse_context_push __attribute((alias("IA__g_markup_parse_context_push"), visibility("default"))); + +#undef g_markup_parse_context_pop +extern __typeof (g_markup_parse_context_pop) g_markup_parse_context_pop __attribute((alias("IA__g_markup_parse_context_pop"), visibility("default"))); + +#undef g_markup_printf_escaped +extern __typeof (g_markup_printf_escaped) g_markup_printf_escaped __attribute((alias("IA__g_markup_printf_escaped"), visibility("default"))); + +#undef g_markup_vprintf_escaped +extern __typeof (g_markup_vprintf_escaped) g_markup_vprintf_escaped __attribute((alias("IA__g_markup_vprintf_escaped"), visibility("default"))); + +#undef g_markup_collect_attributes +extern __typeof (g_markup_collect_attributes) g_markup_collect_attributes __attribute((alias("IA__g_markup_collect_attributes"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_MEM_H__) +#if IN_FILE(__G_MEM_C__) +#undef g_free +extern __typeof (g_free) g_free __attribute((alias("IA__g_free"), visibility("default"))); + +#undef g_malloc +extern __typeof (g_malloc) g_malloc __attribute((alias("IA__g_malloc"), visibility("default"))); + +#undef g_malloc0 +extern __typeof (g_malloc0) g_malloc0 __attribute((alias("IA__g_malloc0"), visibility("default"))); + +#undef g_malloc_n +extern __typeof (g_malloc_n) g_malloc_n __attribute((alias("IA__g_malloc_n"), visibility("default"))); + +#undef g_malloc0_n +extern __typeof (g_malloc0_n) g_malloc0_n __attribute((alias("IA__g_malloc0_n"), visibility("default"))); + +#undef g_mem_is_system_malloc +extern __typeof (g_mem_is_system_malloc) g_mem_is_system_malloc __attribute((alias("IA__g_mem_is_system_malloc"), visibility("default"))); + +#undef g_mem_profile +extern __typeof (g_mem_profile) g_mem_profile __attribute((alias("IA__g_mem_profile"), visibility("default"))); + +#undef g_mem_set_vtable +extern __typeof (g_mem_set_vtable) g_mem_set_vtable __attribute((alias("IA__g_mem_set_vtable"), visibility("default"))); + +#undef g_realloc +extern __typeof (g_realloc) g_realloc __attribute((alias("IA__g_realloc"), visibility("default"))); + +#undef g_realloc_n +extern __typeof (g_realloc_n) g_realloc_n __attribute((alias("IA__g_realloc_n"), visibility("default"))); + +#undef g_try_malloc +extern __typeof (g_try_malloc) g_try_malloc __attribute((alias("IA__g_try_malloc"), visibility("default"))); + +#undef g_try_malloc0 +extern __typeof (g_try_malloc0) g_try_malloc0 __attribute((alias("IA__g_try_malloc0"), visibility("default"))); + +#undef g_try_malloc_n +extern __typeof (g_try_malloc_n) g_try_malloc_n __attribute((alias("IA__g_try_malloc_n"), visibility("default"))); + +#undef g_try_malloc0_n +extern __typeof (g_try_malloc0_n) g_try_malloc0_n __attribute((alias("IA__g_try_malloc0_n"), visibility("default"))); + +#undef g_try_realloc +extern __typeof (g_try_realloc) g_try_realloc __attribute((alias("IA__g_try_realloc"), visibility("default"))); + +#undef g_try_realloc_n +extern __typeof (g_try_realloc_n) g_try_realloc_n __attribute((alias("IA__g_try_realloc_n"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_allocator_free +extern __typeof (g_allocator_free) g_allocator_free __attribute((alias("IA__g_allocator_free"), visibility("default"))); + +#undef g_allocator_new +extern __typeof (g_allocator_new) g_allocator_new __attribute((alias("IA__g_allocator_new"), visibility("default"))); + +#undef g_mem_chunk_alloc +extern __typeof (g_mem_chunk_alloc) g_mem_chunk_alloc __attribute((alias("IA__g_mem_chunk_alloc"), visibility("default"))); + +#undef g_mem_chunk_alloc0 +extern __typeof (g_mem_chunk_alloc0) g_mem_chunk_alloc0 __attribute((alias("IA__g_mem_chunk_alloc0"), visibility("default"))); + +#undef g_mem_chunk_clean +extern __typeof (g_mem_chunk_clean) g_mem_chunk_clean __attribute((alias("IA__g_mem_chunk_clean"), visibility("default"))); + +#undef g_mem_chunk_destroy +extern __typeof (g_mem_chunk_destroy) g_mem_chunk_destroy __attribute((alias("IA__g_mem_chunk_destroy"), visibility("default"))); + +#undef g_mem_chunk_free +extern __typeof (g_mem_chunk_free) g_mem_chunk_free __attribute((alias("IA__g_mem_chunk_free"), visibility("default"))); + +#undef g_mem_chunk_info +extern __typeof (g_mem_chunk_info) g_mem_chunk_info __attribute((alias("IA__g_mem_chunk_info"), visibility("default"))); + +#undef g_mem_chunk_new +extern __typeof (g_mem_chunk_new) g_mem_chunk_new __attribute((alias("IA__g_mem_chunk_new"), visibility("default"))); + +#undef g_mem_chunk_print +extern __typeof (g_mem_chunk_print) g_mem_chunk_print __attribute((alias("IA__g_mem_chunk_print"), visibility("default"))); + +#undef g_mem_chunk_reset +extern __typeof (g_mem_chunk_reset) g_mem_chunk_reset __attribute((alias("IA__g_mem_chunk_reset"), visibility("default"))); + +#undef g_blow_chunks +extern __typeof (g_blow_chunks) g_blow_chunks __attribute((alias("IA__g_blow_chunks"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_SLICE_H__) +#if IN_FILE(__G_SLICE_C__) +#undef g_slice_alloc +extern __typeof (g_slice_alloc) g_slice_alloc __attribute((alias("IA__g_slice_alloc"), visibility("default"))); + +#undef g_slice_alloc0 +extern __typeof (g_slice_alloc0) g_slice_alloc0 __attribute((alias("IA__g_slice_alloc0"), visibility("default"))); + +#undef g_slice_copy +extern __typeof (g_slice_copy) g_slice_copy __attribute((alias("IA__g_slice_copy"), visibility("default"))); + +#undef g_slice_free1 +extern __typeof (g_slice_free1) g_slice_free1 __attribute((alias("IA__g_slice_free1"), visibility("default"))); + +#undef g_slice_free_chain_with_offset +extern __typeof (g_slice_free_chain_with_offset) g_slice_free_chain_with_offset __attribute((alias("IA__g_slice_free_chain_with_offset"), visibility("default"))); + +#undef g_slice_set_config +extern __typeof (g_slice_set_config) g_slice_set_config __attribute((alias("IA__g_slice_set_config"), visibility("default"))); + +#undef g_slice_get_config +extern __typeof (g_slice_get_config) g_slice_get_config __attribute((alias("IA__g_slice_get_config"), visibility("default"))); + +#undef g_slice_get_config_state +extern __typeof (g_slice_get_config_state) g_slice_get_config_state __attribute((alias("IA__g_slice_get_config_state"), visibility("default"))); + +#ifdef G_ENABLE_DEBUG +#endif +#endif +#endif +#if IN_HEADER(__G_MESSAGES_H__) +#if IN_FILE(__G_MESSAGES_C__) +#undef g_printf_string_upper_bound +extern __typeof (g_printf_string_upper_bound) g_printf_string_upper_bound __attribute((alias("IA__g_printf_string_upper_bound"), visibility("default"))); + +#undef g_log +extern __typeof (g_log) g_log __attribute((alias("IA__g_log"), visibility("default"))); + +#undef g_log_default_handler +extern __typeof (g_log_default_handler) g_log_default_handler __attribute((alias("IA__g_log_default_handler"), visibility("default"))); + +#undef g_log_remove_handler +extern __typeof (g_log_remove_handler) g_log_remove_handler __attribute((alias("IA__g_log_remove_handler"), visibility("default"))); + +#undef g_log_set_always_fatal +extern __typeof (g_log_set_always_fatal) g_log_set_always_fatal __attribute((alias("IA__g_log_set_always_fatal"), visibility("default"))); + +#undef g_log_set_default_handler +extern __typeof (g_log_set_default_handler) g_log_set_default_handler __attribute((alias("IA__g_log_set_default_handler"), visibility("default"))); + +#undef g_log_set_fatal_mask +extern __typeof (g_log_set_fatal_mask) g_log_set_fatal_mask __attribute((alias("IA__g_log_set_fatal_mask"), visibility("default"))); + +#undef g_log_set_handler +extern __typeof (g_log_set_handler) g_log_set_handler __attribute((alias("IA__g_log_set_handler"), visibility("default"))); + +#undef g_logv +extern __typeof (g_logv) g_logv __attribute((alias("IA__g_logv"), visibility("default"))); + +#undef g_return_if_fail_warning +extern __typeof (g_return_if_fail_warning) g_return_if_fail_warning __attribute((alias("IA__g_return_if_fail_warning"), visibility("default"))); + +#undef g_warn_message +extern __typeof (g_warn_message) g_warn_message __attribute((alias("IA__g_warn_message"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_assert_warning +extern __typeof (g_assert_warning) g_assert_warning __attribute((alias("IA__g_assert_warning"), visibility("default"))); + +#endif +#undef g_print +extern __typeof (g_print) g_print __attribute((alias("IA__g_print"), visibility("default"))); + +#undef g_printerr +extern __typeof (g_printerr) g_printerr __attribute((alias("IA__g_printerr"), visibility("default"))); + +#undef g_set_printerr_handler +extern __typeof (g_set_printerr_handler) g_set_printerr_handler __attribute((alias("IA__g_set_printerr_handler"), visibility("default"))); + +#undef g_set_print_handler +extern __typeof (g_set_print_handler) g_set_print_handler __attribute((alias("IA__g_set_print_handler"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_NODE_H__) +#if IN_FILE(__G_NODE_C__) +#undef g_node_child_index +extern __typeof (g_node_child_index) g_node_child_index __attribute((alias("IA__g_node_child_index"), visibility("default"))); + +#undef g_node_child_position +extern __typeof (g_node_child_position) g_node_child_position __attribute((alias("IA__g_node_child_position"), visibility("default"))); + +#undef g_node_children_foreach +extern __typeof (g_node_children_foreach) g_node_children_foreach __attribute((alias("IA__g_node_children_foreach"), visibility("default"))); + +#undef g_node_copy +extern __typeof (g_node_copy) g_node_copy __attribute((alias("IA__g_node_copy"), visibility("default"))); + +#undef g_node_copy_deep +extern __typeof (g_node_copy_deep) g_node_copy_deep __attribute((alias("IA__g_node_copy_deep"), visibility("default"))); + +#undef g_node_depth +extern __typeof (g_node_depth) g_node_depth __attribute((alias("IA__g_node_depth"), visibility("default"))); + +#undef g_node_destroy +extern __typeof (g_node_destroy) g_node_destroy __attribute((alias("IA__g_node_destroy"), visibility("default"))); + +#undef g_node_find +extern __typeof (g_node_find) g_node_find __attribute((alias("IA__g_node_find"), visibility("default"))); + +#undef g_node_find_child +extern __typeof (g_node_find_child) g_node_find_child __attribute((alias("IA__g_node_find_child"), visibility("default"))); + +#undef g_node_first_sibling +extern __typeof (g_node_first_sibling) g_node_first_sibling __attribute((alias("IA__g_node_first_sibling"), visibility("default"))); + +#undef g_node_get_root +extern __typeof (g_node_get_root) g_node_get_root __attribute((alias("IA__g_node_get_root"), visibility("default"))); + +#undef g_node_insert +extern __typeof (g_node_insert) g_node_insert __attribute((alias("IA__g_node_insert"), visibility("default"))); + +#undef g_node_insert_after +extern __typeof (g_node_insert_after) g_node_insert_after __attribute((alias("IA__g_node_insert_after"), visibility("default"))); + +#undef g_node_insert_before +extern __typeof (g_node_insert_before) g_node_insert_before __attribute((alias("IA__g_node_insert_before"), visibility("default"))); + +#undef g_node_is_ancestor +extern __typeof (g_node_is_ancestor) g_node_is_ancestor __attribute((alias("IA__g_node_is_ancestor"), visibility("default"))); + +#undef g_node_last_child +extern __typeof (g_node_last_child) g_node_last_child __attribute((alias("IA__g_node_last_child"), visibility("default"))); + +#undef g_node_last_sibling +extern __typeof (g_node_last_sibling) g_node_last_sibling __attribute((alias("IA__g_node_last_sibling"), visibility("default"))); + +#undef g_node_max_height +extern __typeof (g_node_max_height) g_node_max_height __attribute((alias("IA__g_node_max_height"), visibility("default"))); + +#undef g_node_n_children +extern __typeof (g_node_n_children) g_node_n_children __attribute((alias("IA__g_node_n_children"), visibility("default"))); + +#undef g_node_new +extern __typeof (g_node_new) g_node_new __attribute((alias("IA__g_node_new"), visibility("default"))); + +#undef g_node_n_nodes +extern __typeof (g_node_n_nodes) g_node_n_nodes __attribute((alias("IA__g_node_n_nodes"), visibility("default"))); + +#undef g_node_nth_child +extern __typeof (g_node_nth_child) g_node_nth_child __attribute((alias("IA__g_node_nth_child"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_node_pop_allocator +extern __typeof (g_node_pop_allocator) g_node_pop_allocator __attribute((alias("IA__g_node_pop_allocator"), visibility("default"))); + +#endif +#undef g_node_prepend +extern __typeof (g_node_prepend) g_node_prepend __attribute((alias("IA__g_node_prepend"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_node_push_allocator +extern __typeof (g_node_push_allocator) g_node_push_allocator __attribute((alias("IA__g_node_push_allocator"), visibility("default"))); + +#endif +#undef g_node_reverse_children +extern __typeof (g_node_reverse_children) g_node_reverse_children __attribute((alias("IA__g_node_reverse_children"), visibility("default"))); + +#undef g_node_traverse +extern __typeof (g_node_traverse) g_node_traverse __attribute((alias("IA__g_node_traverse"), visibility("default"))); + +#undef g_node_unlink +extern __typeof (g_node_unlink) g_node_unlink __attribute((alias("IA__g_node_unlink"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_OPTION_H__) +#if IN_FILE(__G_OPTION_C__) +#undef g_option_context_add_group +extern __typeof (g_option_context_add_group) g_option_context_add_group __attribute((alias("IA__g_option_context_add_group"), visibility("default"))); + +#undef g_option_context_add_main_entries +extern __typeof (g_option_context_add_main_entries) g_option_context_add_main_entries __attribute((alias("IA__g_option_context_add_main_entries"), visibility("default"))); + +#undef g_option_error_quark +extern __typeof (g_option_error_quark) g_option_error_quark __attribute((alias("IA__g_option_error_quark"), visibility("default"))); + +#undef g_option_context_free +extern __typeof (g_option_context_free) g_option_context_free __attribute((alias("IA__g_option_context_free"), visibility("default"))); + +#undef g_option_context_get_description +extern __typeof (g_option_context_get_description) g_option_context_get_description __attribute((alias("IA__g_option_context_get_description"), visibility("default"))); + +#undef g_option_context_get_help_enabled +extern __typeof (g_option_context_get_help_enabled) g_option_context_get_help_enabled __attribute((alias("IA__g_option_context_get_help_enabled"), visibility("default"))); + +#undef g_option_context_get_ignore_unknown_options +extern __typeof (g_option_context_get_ignore_unknown_options) g_option_context_get_ignore_unknown_options __attribute((alias("IA__g_option_context_get_ignore_unknown_options"), visibility("default"))); + +#undef g_option_context_get_main_group +extern __typeof (g_option_context_get_main_group) g_option_context_get_main_group __attribute((alias("IA__g_option_context_get_main_group"), visibility("default"))); + +#undef g_option_context_get_summary +extern __typeof (g_option_context_get_summary) g_option_context_get_summary __attribute((alias("IA__g_option_context_get_summary"), visibility("default"))); + +#undef g_option_context_new +extern __typeof (g_option_context_new) g_option_context_new __attribute((alias("IA__g_option_context_new"), visibility("default"))); + +#undef g_option_context_parse +extern __typeof (g_option_context_parse) g_option_context_parse __attribute((alias("IA__g_option_context_parse"), visibility("default"))); + +#undef g_option_context_set_description +extern __typeof (g_option_context_set_description) g_option_context_set_description __attribute((alias("IA__g_option_context_set_description"), visibility("default"))); + +#undef g_option_context_set_help_enabled +extern __typeof (g_option_context_set_help_enabled) g_option_context_set_help_enabled __attribute((alias("IA__g_option_context_set_help_enabled"), visibility("default"))); + +#undef g_option_context_set_ignore_unknown_options +extern __typeof (g_option_context_set_ignore_unknown_options) g_option_context_set_ignore_unknown_options __attribute((alias("IA__g_option_context_set_ignore_unknown_options"), visibility("default"))); + +#undef g_option_context_set_main_group +extern __typeof (g_option_context_set_main_group) g_option_context_set_main_group __attribute((alias("IA__g_option_context_set_main_group"), visibility("default"))); + +#undef g_option_context_set_summary +extern __typeof (g_option_context_set_summary) g_option_context_set_summary __attribute((alias("IA__g_option_context_set_summary"), visibility("default"))); + +#undef g_option_context_set_translate_func +extern __typeof (g_option_context_set_translate_func) g_option_context_set_translate_func __attribute((alias("IA__g_option_context_set_translate_func"), visibility("default"))); + +#undef g_option_context_set_translation_domain +extern __typeof (g_option_context_set_translation_domain) g_option_context_set_translation_domain __attribute((alias("IA__g_option_context_set_translation_domain"), visibility("default"))); + +#undef g_option_context_get_help +extern __typeof (g_option_context_get_help) g_option_context_get_help __attribute((alias("IA__g_option_context_get_help"), visibility("default"))); + +#undef g_option_group_add_entries +extern __typeof (g_option_group_add_entries) g_option_group_add_entries __attribute((alias("IA__g_option_group_add_entries"), visibility("default"))); + +#undef g_option_group_free +extern __typeof (g_option_group_free) g_option_group_free __attribute((alias("IA__g_option_group_free"), visibility("default"))); + +#undef g_option_group_new +extern __typeof (g_option_group_new) g_option_group_new __attribute((alias("IA__g_option_group_new"), visibility("default"))); + +#undef g_option_group_set_error_hook +extern __typeof (g_option_group_set_error_hook) g_option_group_set_error_hook __attribute((alias("IA__g_option_group_set_error_hook"), visibility("default"))); + +#undef g_option_group_set_parse_hooks +extern __typeof (g_option_group_set_parse_hooks) g_option_group_set_parse_hooks __attribute((alias("IA__g_option_group_set_parse_hooks"), visibility("default"))); + +#undef g_option_group_set_translate_func +extern __typeof (g_option_group_set_translate_func) g_option_group_set_translate_func __attribute((alias("IA__g_option_group_set_translate_func"), visibility("default"))); + +#undef g_option_group_set_translation_domain +extern __typeof (g_option_group_set_translation_domain) g_option_group_set_translation_domain __attribute((alias("IA__g_option_group_set_translation_domain"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_PATTERN_H__) +#if IN_FILE(__G_PATTERN_C__) +#undef g_pattern_match +extern __typeof (g_pattern_match) g_pattern_match __attribute((alias("IA__g_pattern_match"), visibility("default"))); + +#undef g_pattern_match_simple +extern __typeof (g_pattern_match_simple) g_pattern_match_simple __attribute((alias("IA__g_pattern_match_simple"), visibility("default"))); + +#undef g_pattern_match_string +extern __typeof (g_pattern_match_string) g_pattern_match_string __attribute((alias("IA__g_pattern_match_string"), visibility("default"))); + +#undef g_pattern_spec_equal +extern __typeof (g_pattern_spec_equal) g_pattern_spec_equal __attribute((alias("IA__g_pattern_spec_equal"), visibility("default"))); + +#undef g_pattern_spec_free +extern __typeof (g_pattern_spec_free) g_pattern_spec_free __attribute((alias("IA__g_pattern_spec_free"), visibility("default"))); + +#undef g_pattern_spec_new +extern __typeof (g_pattern_spec_new) g_pattern_spec_new __attribute((alias("IA__g_pattern_spec_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_POLL_H__) +#if IN_FILE(__G_POLL_C__) +#undef g_poll +extern __typeof (g_poll) g_poll __attribute((alias("IA__g_poll"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_PRIMES_H__) +#if IN_FILE(__G_PRIMES_C__) +#undef g_spaced_primes_closest +extern __typeof (g_spaced_primes_closest) g_spaced_primes_closest __attribute((alias("IA__g_spaced_primes_closest"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_PRINTF_H__) +#if IN_FILE(__G_PRINTF_C__) +#undef g_fprintf +extern __typeof (g_fprintf) g_fprintf __attribute((alias("IA__g_fprintf"), visibility("default"))); + +#undef g_printf +extern __typeof (g_printf) g_printf __attribute((alias("IA__g_printf"), visibility("default"))); + +#undef g_sprintf +extern __typeof (g_sprintf) g_sprintf __attribute((alias("IA__g_sprintf"), visibility("default"))); + +#undef g_vasprintf +extern __typeof (g_vasprintf) g_vasprintf __attribute((alias("IA__g_vasprintf"), visibility("default"))); + +#undef g_vfprintf +extern __typeof (g_vfprintf) g_vfprintf __attribute((alias("IA__g_vfprintf"), visibility("default"))); + +#undef g_vprintf +extern __typeof (g_vprintf) g_vprintf __attribute((alias("IA__g_vprintf"), visibility("default"))); + +#undef g_vsprintf +extern __typeof (g_vsprintf) g_vsprintf __attribute((alias("IA__g_vsprintf"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UTILS_H__) +#if IN_FILE(__G_PRINTF_C__) +#undef g_snprintf +extern __typeof (g_snprintf) g_snprintf __attribute((alias("IA__g_snprintf"), visibility("default"))); + +#undef g_vsnprintf +extern __typeof (g_vsnprintf) g_vsnprintf __attribute((alias("IA__g_vsnprintf"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_QSORT_H__) +#if IN_FILE(__G_QSORT_C__) +#undef g_qsort_with_data +extern __typeof (g_qsort_with_data) g_qsort_with_data __attribute((alias("IA__g_qsort_with_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_QUEUE_H__) +#if IN_FILE(__G_QUEUE_C__) +#undef g_queue_clear +extern __typeof (g_queue_clear) g_queue_clear __attribute((alias("IA__g_queue_clear"), visibility("default"))); + +#undef g_queue_copy +extern __typeof (g_queue_copy) g_queue_copy __attribute((alias("IA__g_queue_copy"), visibility("default"))); + +#undef g_queue_delete_link +extern __typeof (g_queue_delete_link) g_queue_delete_link __attribute((alias("IA__g_queue_delete_link"), visibility("default"))); + +#undef g_queue_find +extern __typeof (g_queue_find) g_queue_find __attribute((alias("IA__g_queue_find"), visibility("default"))); + +#undef g_queue_find_custom +extern __typeof (g_queue_find_custom) g_queue_find_custom __attribute((alias("IA__g_queue_find_custom"), visibility("default"))); + +#undef g_queue_foreach +extern __typeof (g_queue_foreach) g_queue_foreach __attribute((alias("IA__g_queue_foreach"), visibility("default"))); + +#undef g_queue_free +extern __typeof (g_queue_free) g_queue_free __attribute((alias("IA__g_queue_free"), visibility("default"))); + +#undef g_queue_get_length +extern __typeof (g_queue_get_length) g_queue_get_length __attribute((alias("IA__g_queue_get_length"), visibility("default"))); + +#undef g_queue_index +extern __typeof (g_queue_index) g_queue_index __attribute((alias("IA__g_queue_index"), visibility("default"))); + +#undef g_queue_init +extern __typeof (g_queue_init) g_queue_init __attribute((alias("IA__g_queue_init"), visibility("default"))); + +#undef g_queue_insert_after +extern __typeof (g_queue_insert_after) g_queue_insert_after __attribute((alias("IA__g_queue_insert_after"), visibility("default"))); + +#undef g_queue_insert_before +extern __typeof (g_queue_insert_before) g_queue_insert_before __attribute((alias("IA__g_queue_insert_before"), visibility("default"))); + +#undef g_queue_insert_sorted +extern __typeof (g_queue_insert_sorted) g_queue_insert_sorted __attribute((alias("IA__g_queue_insert_sorted"), visibility("default"))); + +#undef g_queue_is_empty +extern __typeof (g_queue_is_empty) g_queue_is_empty __attribute((alias("IA__g_queue_is_empty"), visibility("default"))); + +#undef g_queue_link_index +extern __typeof (g_queue_link_index) g_queue_link_index __attribute((alias("IA__g_queue_link_index"), visibility("default"))); + +#undef g_queue_new +extern __typeof (g_queue_new) g_queue_new __attribute((alias("IA__g_queue_new"), visibility("default"))); + +#undef g_queue_peek_head +extern __typeof (g_queue_peek_head) g_queue_peek_head __attribute((alias("IA__g_queue_peek_head"), visibility("default"))); + +#undef g_queue_peek_head_link +extern __typeof (g_queue_peek_head_link) g_queue_peek_head_link __attribute((alias("IA__g_queue_peek_head_link"), visibility("default"))); + +#undef g_queue_peek_nth +extern __typeof (g_queue_peek_nth) g_queue_peek_nth __attribute((alias("IA__g_queue_peek_nth"), visibility("default"))); + +#undef g_queue_peek_nth_link +extern __typeof (g_queue_peek_nth_link) g_queue_peek_nth_link __attribute((alias("IA__g_queue_peek_nth_link"), visibility("default"))); + +#undef g_queue_peek_tail +extern __typeof (g_queue_peek_tail) g_queue_peek_tail __attribute((alias("IA__g_queue_peek_tail"), visibility("default"))); + +#undef g_queue_peek_tail_link +extern __typeof (g_queue_peek_tail_link) g_queue_peek_tail_link __attribute((alias("IA__g_queue_peek_tail_link"), visibility("default"))); + +#undef g_queue_pop_head +extern __typeof (g_queue_pop_head) g_queue_pop_head __attribute((alias("IA__g_queue_pop_head"), visibility("default"))); + +#undef g_queue_pop_head_link +extern __typeof (g_queue_pop_head_link) g_queue_pop_head_link __attribute((alias("IA__g_queue_pop_head_link"), visibility("default"))); + +#undef g_queue_pop_nth +extern __typeof (g_queue_pop_nth) g_queue_pop_nth __attribute((alias("IA__g_queue_pop_nth"), visibility("default"))); + +#undef g_queue_pop_nth_link +extern __typeof (g_queue_pop_nth_link) g_queue_pop_nth_link __attribute((alias("IA__g_queue_pop_nth_link"), visibility("default"))); + +#undef g_queue_pop_tail +extern __typeof (g_queue_pop_tail) g_queue_pop_tail __attribute((alias("IA__g_queue_pop_tail"), visibility("default"))); + +#undef g_queue_pop_tail_link +extern __typeof (g_queue_pop_tail_link) g_queue_pop_tail_link __attribute((alias("IA__g_queue_pop_tail_link"), visibility("default"))); + +#undef g_queue_push_head +extern __typeof (g_queue_push_head) g_queue_push_head __attribute((alias("IA__g_queue_push_head"), visibility("default"))); + +#undef g_queue_push_head_link +extern __typeof (g_queue_push_head_link) g_queue_push_head_link __attribute((alias("IA__g_queue_push_head_link"), visibility("default"))); + +#undef g_queue_push_nth +extern __typeof (g_queue_push_nth) g_queue_push_nth __attribute((alias("IA__g_queue_push_nth"), visibility("default"))); + +#undef g_queue_push_nth_link +extern __typeof (g_queue_push_nth_link) g_queue_push_nth_link __attribute((alias("IA__g_queue_push_nth_link"), visibility("default"))); + +#undef g_queue_push_tail +extern __typeof (g_queue_push_tail) g_queue_push_tail __attribute((alias("IA__g_queue_push_tail"), visibility("default"))); + +#undef g_queue_push_tail_link +extern __typeof (g_queue_push_tail_link) g_queue_push_tail_link __attribute((alias("IA__g_queue_push_tail_link"), visibility("default"))); + +#undef g_queue_remove +extern __typeof (g_queue_remove) g_queue_remove __attribute((alias("IA__g_queue_remove"), visibility("default"))); + +#undef g_queue_remove_all +extern __typeof (g_queue_remove_all) g_queue_remove_all __attribute((alias("IA__g_queue_remove_all"), visibility("default"))); + +#undef g_queue_reverse +extern __typeof (g_queue_reverse) g_queue_reverse __attribute((alias("IA__g_queue_reverse"), visibility("default"))); + +#undef g_queue_sort +extern __typeof (g_queue_sort) g_queue_sort __attribute((alias("IA__g_queue_sort"), visibility("default"))); + +#undef g_queue_unlink +extern __typeof (g_queue_unlink) g_queue_unlink __attribute((alias("IA__g_queue_unlink"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_RAND_H__) +#if IN_FILE(__G_RAND_C__) +#undef g_rand_copy +extern __typeof (g_rand_copy) g_rand_copy __attribute((alias("IA__g_rand_copy"), visibility("default"))); + +#undef g_rand_double +extern __typeof (g_rand_double) g_rand_double __attribute((alias("IA__g_rand_double"), visibility("default"))); + +#undef g_rand_double_range +extern __typeof (g_rand_double_range) g_rand_double_range __attribute((alias("IA__g_rand_double_range"), visibility("default"))); + +#undef g_rand_free +extern __typeof (g_rand_free) g_rand_free __attribute((alias("IA__g_rand_free"), visibility("default"))); + +#undef g_rand_int +extern __typeof (g_rand_int) g_rand_int __attribute((alias("IA__g_rand_int"), visibility("default"))); + +#undef g_rand_int_range +extern __typeof (g_rand_int_range) g_rand_int_range __attribute((alias("IA__g_rand_int_range"), visibility("default"))); + +#undef g_rand_new +extern __typeof (g_rand_new) g_rand_new __attribute((alias("IA__g_rand_new"), visibility("default"))); + +#undef g_rand_new_with_seed +extern __typeof (g_rand_new_with_seed) g_rand_new_with_seed __attribute((alias("IA__g_rand_new_with_seed"), visibility("default"))); + +#undef g_rand_new_with_seed_array +extern __typeof (g_rand_new_with_seed_array) g_rand_new_with_seed_array __attribute((alias("IA__g_rand_new_with_seed_array"), visibility("default"))); + +#undef g_random_double +extern __typeof (g_random_double) g_random_double __attribute((alias("IA__g_random_double"), visibility("default"))); + +#undef g_random_double_range +extern __typeof (g_random_double_range) g_random_double_range __attribute((alias("IA__g_random_double_range"), visibility("default"))); + +#undef g_random_int +extern __typeof (g_random_int) g_random_int __attribute((alias("IA__g_random_int"), visibility("default"))); + +#undef g_random_int_range +extern __typeof (g_random_int_range) g_random_int_range __attribute((alias("IA__g_random_int_range"), visibility("default"))); + +#undef g_random_set_seed +extern __typeof (g_random_set_seed) g_random_set_seed __attribute((alias("IA__g_random_set_seed"), visibility("default"))); + +#undef g_rand_set_seed +extern __typeof (g_rand_set_seed) g_rand_set_seed __attribute((alias("IA__g_rand_set_seed"), visibility("default"))); + +#undef g_rand_set_seed_array +extern __typeof (g_rand_set_seed_array) g_rand_set_seed_array __attribute((alias("IA__g_rand_set_seed_array"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_REL_H__) +#if IN_FILE(__G_REL_C__) +#undef g_relation_count +extern __typeof (g_relation_count) g_relation_count __attribute((alias("IA__g_relation_count"), visibility("default"))); + +#undef g_relation_delete +extern __typeof (g_relation_delete) g_relation_delete __attribute((alias("IA__g_relation_delete"), visibility("default"))); + +#undef g_relation_destroy +extern __typeof (g_relation_destroy) g_relation_destroy __attribute((alias("IA__g_relation_destroy"), visibility("default"))); + +#undef g_relation_exists +extern __typeof (g_relation_exists) g_relation_exists __attribute((alias("IA__g_relation_exists"), visibility("default"))); + +#undef g_relation_index +extern __typeof (g_relation_index) g_relation_index __attribute((alias("IA__g_relation_index"), visibility("default"))); + +#undef g_relation_insert +extern __typeof (g_relation_insert) g_relation_insert __attribute((alias("IA__g_relation_insert"), visibility("default"))); + +#undef g_relation_new +extern __typeof (g_relation_new) g_relation_new __attribute((alias("IA__g_relation_new"), visibility("default"))); + +#undef g_relation_print +extern __typeof (g_relation_print) g_relation_print __attribute((alias("IA__g_relation_print"), visibility("default"))); + +#undef g_relation_select +extern __typeof (g_relation_select) g_relation_select __attribute((alias("IA__g_relation_select"), visibility("default"))); + +#undef g_tuples_destroy +extern __typeof (g_tuples_destroy) g_tuples_destroy __attribute((alias("IA__g_tuples_destroy"), visibility("default"))); + +#undef g_tuples_index +extern __typeof (g_tuples_index) g_tuples_index __attribute((alias("IA__g_tuples_index"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SCANNER_H__) +#if IN_FILE(__G_SCANNER_C__) +#undef g_scanner_cur_line +extern __typeof (g_scanner_cur_line) g_scanner_cur_line __attribute((alias("IA__g_scanner_cur_line"), visibility("default"))); + +#undef g_scanner_cur_position +extern __typeof (g_scanner_cur_position) g_scanner_cur_position __attribute((alias("IA__g_scanner_cur_position"), visibility("default"))); + +#undef g_scanner_cur_token +extern __typeof (g_scanner_cur_token) g_scanner_cur_token __attribute((alias("IA__g_scanner_cur_token"), visibility("default"))); + +#undef g_scanner_cur_value +extern __typeof (g_scanner_cur_value) g_scanner_cur_value __attribute((alias("IA__g_scanner_cur_value"), visibility("default"))); + +#undef g_scanner_destroy +extern __typeof (g_scanner_destroy) g_scanner_destroy __attribute((alias("IA__g_scanner_destroy"), visibility("default"))); + +#undef g_scanner_eof +extern __typeof (g_scanner_eof) g_scanner_eof __attribute((alias("IA__g_scanner_eof"), visibility("default"))); + +#undef g_scanner_error +extern __typeof (g_scanner_error) g_scanner_error __attribute((alias("IA__g_scanner_error"), visibility("default"))); + +#undef g_scanner_get_next_token +extern __typeof (g_scanner_get_next_token) g_scanner_get_next_token __attribute((alias("IA__g_scanner_get_next_token"), visibility("default"))); + +#undef g_scanner_input_file +extern __typeof (g_scanner_input_file) g_scanner_input_file __attribute((alias("IA__g_scanner_input_file"), visibility("default"))); + +#undef g_scanner_input_text +extern __typeof (g_scanner_input_text) g_scanner_input_text __attribute((alias("IA__g_scanner_input_text"), visibility("default"))); + +#undef g_scanner_lookup_symbol +extern __typeof (g_scanner_lookup_symbol) g_scanner_lookup_symbol __attribute((alias("IA__g_scanner_lookup_symbol"), visibility("default"))); + +#undef g_scanner_new +extern __typeof (g_scanner_new) g_scanner_new __attribute((alias("IA__g_scanner_new"), visibility("default"))); + +#undef g_scanner_peek_next_token +extern __typeof (g_scanner_peek_next_token) g_scanner_peek_next_token __attribute((alias("IA__g_scanner_peek_next_token"), visibility("default"))); + +#undef g_scanner_scope_add_symbol +extern __typeof (g_scanner_scope_add_symbol) g_scanner_scope_add_symbol __attribute((alias("IA__g_scanner_scope_add_symbol"), visibility("default"))); + +#undef g_scanner_scope_foreach_symbol +extern __typeof (g_scanner_scope_foreach_symbol) g_scanner_scope_foreach_symbol __attribute((alias("IA__g_scanner_scope_foreach_symbol"), visibility("default"))); + +#undef g_scanner_scope_lookup_symbol +extern __typeof (g_scanner_scope_lookup_symbol) g_scanner_scope_lookup_symbol __attribute((alias("IA__g_scanner_scope_lookup_symbol"), visibility("default"))); + +#undef g_scanner_scope_remove_symbol +extern __typeof (g_scanner_scope_remove_symbol) g_scanner_scope_remove_symbol __attribute((alias("IA__g_scanner_scope_remove_symbol"), visibility("default"))); + +#undef g_scanner_set_scope +extern __typeof (g_scanner_set_scope) g_scanner_set_scope __attribute((alias("IA__g_scanner_set_scope"), visibility("default"))); + +#undef g_scanner_sync_file_offset +extern __typeof (g_scanner_sync_file_offset) g_scanner_sync_file_offset __attribute((alias("IA__g_scanner_sync_file_offset"), visibility("default"))); + +#undef g_scanner_unexp_token +extern __typeof (g_scanner_unexp_token) g_scanner_unexp_token __attribute((alias("IA__g_scanner_unexp_token"), visibility("default"))); + +#undef g_scanner_warn +extern __typeof (g_scanner_warn) g_scanner_warn __attribute((alias("IA__g_scanner_warn"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SEQUENCE_H__) +#if IN_FILE(__G_SEQUENCE_C__) +#undef g_sequence_new +extern __typeof (g_sequence_new) g_sequence_new __attribute((alias("IA__g_sequence_new"), visibility("default"))); + +#undef g_sequence_free +extern __typeof (g_sequence_free) g_sequence_free __attribute((alias("IA__g_sequence_free"), visibility("default"))); + +#undef g_sequence_get_length +extern __typeof (g_sequence_get_length) g_sequence_get_length __attribute((alias("IA__g_sequence_get_length"), visibility("default"))); + +#undef g_sequence_foreach +extern __typeof (g_sequence_foreach) g_sequence_foreach __attribute((alias("IA__g_sequence_foreach"), visibility("default"))); + +#undef g_sequence_foreach_range +extern __typeof (g_sequence_foreach_range) g_sequence_foreach_range __attribute((alias("IA__g_sequence_foreach_range"), visibility("default"))); + +#undef g_sequence_sort +extern __typeof (g_sequence_sort) g_sequence_sort __attribute((alias("IA__g_sequence_sort"), visibility("default"))); + +#undef g_sequence_sort_iter +extern __typeof (g_sequence_sort_iter) g_sequence_sort_iter __attribute((alias("IA__g_sequence_sort_iter"), visibility("default"))); + +#undef g_sequence_get_begin_iter +extern __typeof (g_sequence_get_begin_iter) g_sequence_get_begin_iter __attribute((alias("IA__g_sequence_get_begin_iter"), visibility("default"))); + +#undef g_sequence_get_end_iter +extern __typeof (g_sequence_get_end_iter) g_sequence_get_end_iter __attribute((alias("IA__g_sequence_get_end_iter"), visibility("default"))); + +#undef g_sequence_get_iter_at_pos +extern __typeof (g_sequence_get_iter_at_pos) g_sequence_get_iter_at_pos __attribute((alias("IA__g_sequence_get_iter_at_pos"), visibility("default"))); + +#undef g_sequence_append +extern __typeof (g_sequence_append) g_sequence_append __attribute((alias("IA__g_sequence_append"), visibility("default"))); + +#undef g_sequence_prepend +extern __typeof (g_sequence_prepend) g_sequence_prepend __attribute((alias("IA__g_sequence_prepend"), visibility("default"))); + +#undef g_sequence_insert_before +extern __typeof (g_sequence_insert_before) g_sequence_insert_before __attribute((alias("IA__g_sequence_insert_before"), visibility("default"))); + +#undef g_sequence_move +extern __typeof (g_sequence_move) g_sequence_move __attribute((alias("IA__g_sequence_move"), visibility("default"))); + +#undef g_sequence_swap +extern __typeof (g_sequence_swap) g_sequence_swap __attribute((alias("IA__g_sequence_swap"), visibility("default"))); + +#undef g_sequence_insert_sorted +extern __typeof (g_sequence_insert_sorted) g_sequence_insert_sorted __attribute((alias("IA__g_sequence_insert_sorted"), visibility("default"))); + +#undef g_sequence_insert_sorted_iter +extern __typeof (g_sequence_insert_sorted_iter) g_sequence_insert_sorted_iter __attribute((alias("IA__g_sequence_insert_sorted_iter"), visibility("default"))); + +#undef g_sequence_sort_changed +extern __typeof (g_sequence_sort_changed) g_sequence_sort_changed __attribute((alias("IA__g_sequence_sort_changed"), visibility("default"))); + +#undef g_sequence_sort_changed_iter +extern __typeof (g_sequence_sort_changed_iter) g_sequence_sort_changed_iter __attribute((alias("IA__g_sequence_sort_changed_iter"), visibility("default"))); + +#undef g_sequence_remove +extern __typeof (g_sequence_remove) g_sequence_remove __attribute((alias("IA__g_sequence_remove"), visibility("default"))); + +#undef g_sequence_remove_range +extern __typeof (g_sequence_remove_range) g_sequence_remove_range __attribute((alias("IA__g_sequence_remove_range"), visibility("default"))); + +#undef g_sequence_move_range +extern __typeof (g_sequence_move_range) g_sequence_move_range __attribute((alias("IA__g_sequence_move_range"), visibility("default"))); + +#undef g_sequence_search +extern __typeof (g_sequence_search) g_sequence_search __attribute((alias("IA__g_sequence_search"), visibility("default"))); + +#undef g_sequence_search_iter +extern __typeof (g_sequence_search_iter) g_sequence_search_iter __attribute((alias("IA__g_sequence_search_iter"), visibility("default"))); + +#undef g_sequence_get +extern __typeof (g_sequence_get) g_sequence_get __attribute((alias("IA__g_sequence_get"), visibility("default"))); + +#undef g_sequence_set +extern __typeof (g_sequence_set) g_sequence_set __attribute((alias("IA__g_sequence_set"), visibility("default"))); + +#undef g_sequence_iter_is_begin +extern __typeof (g_sequence_iter_is_begin) g_sequence_iter_is_begin __attribute((alias("IA__g_sequence_iter_is_begin"), visibility("default"))); + +#undef g_sequence_iter_is_end +extern __typeof (g_sequence_iter_is_end) g_sequence_iter_is_end __attribute((alias("IA__g_sequence_iter_is_end"), visibility("default"))); + +#undef g_sequence_iter_next +extern __typeof (g_sequence_iter_next) g_sequence_iter_next __attribute((alias("IA__g_sequence_iter_next"), visibility("default"))); + +#undef g_sequence_iter_prev +extern __typeof (g_sequence_iter_prev) g_sequence_iter_prev __attribute((alias("IA__g_sequence_iter_prev"), visibility("default"))); + +#undef g_sequence_iter_get_position +extern __typeof (g_sequence_iter_get_position) g_sequence_iter_get_position __attribute((alias("IA__g_sequence_iter_get_position"), visibility("default"))); + +#undef g_sequence_iter_move +extern __typeof (g_sequence_iter_move) g_sequence_iter_move __attribute((alias("IA__g_sequence_iter_move"), visibility("default"))); + +#undef g_sequence_iter_get_sequence +extern __typeof (g_sequence_iter_get_sequence) g_sequence_iter_get_sequence __attribute((alias("IA__g_sequence_iter_get_sequence"), visibility("default"))); + +#undef g_sequence_iter_compare +extern __typeof (g_sequence_iter_compare) g_sequence_iter_compare __attribute((alias("IA__g_sequence_iter_compare"), visibility("default"))); + +#undef g_sequence_range_get_midpoint +extern __typeof (g_sequence_range_get_midpoint) g_sequence_range_get_midpoint __attribute((alias("IA__g_sequence_range_get_midpoint"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SHELL_H__) +#if IN_FILE(__G_SHELL_C__) +#undef g_shell_error_quark +extern __typeof (g_shell_error_quark) g_shell_error_quark __attribute((alias("IA__g_shell_error_quark"), visibility("default"))); + +#undef g_shell_parse_argv +extern __typeof (g_shell_parse_argv) g_shell_parse_argv __attribute((alias("IA__g_shell_parse_argv"), visibility("default"))); + +#undef g_shell_quote +extern __typeof (g_shell_quote) g_shell_quote __attribute((alias("IA__g_shell_quote"), visibility("default"))); + +#undef g_shell_unquote +extern __typeof (g_shell_unquote) g_shell_unquote __attribute((alias("IA__g_shell_unquote"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SLIST_H__) +#if IN_FILE(__G_SLIST_C__) +#undef g_slist_alloc +extern __typeof (g_slist_alloc) g_slist_alloc __attribute((alias("IA__g_slist_alloc"), visibility("default"))); + +#undef g_slist_append +extern __typeof (g_slist_append) g_slist_append __attribute((alias("IA__g_slist_append"), visibility("default"))); + +#undef g_slist_concat +extern __typeof (g_slist_concat) g_slist_concat __attribute((alias("IA__g_slist_concat"), visibility("default"))); + +#undef g_slist_copy +extern __typeof (g_slist_copy) g_slist_copy __attribute((alias("IA__g_slist_copy"), visibility("default"))); + +#undef g_slist_delete_link +extern __typeof (g_slist_delete_link) g_slist_delete_link __attribute((alias("IA__g_slist_delete_link"), visibility("default"))); + +#undef g_slist_find +extern __typeof (g_slist_find) g_slist_find __attribute((alias("IA__g_slist_find"), visibility("default"))); + +#undef g_slist_find_custom +extern __typeof (g_slist_find_custom) g_slist_find_custom __attribute((alias("IA__g_slist_find_custom"), visibility("default"))); + +#undef g_slist_foreach +extern __typeof (g_slist_foreach) g_slist_foreach __attribute((alias("IA__g_slist_foreach"), visibility("default"))); + +#undef g_slist_free +extern __typeof (g_slist_free) g_slist_free __attribute((alias("IA__g_slist_free"), visibility("default"))); + +#undef g_slist_free_1 +extern __typeof (g_slist_free_1) g_slist_free_1 __attribute((alias("IA__g_slist_free_1"), visibility("default"))); + +#undef g_slist_index +extern __typeof (g_slist_index) g_slist_index __attribute((alias("IA__g_slist_index"), visibility("default"))); + +#undef g_slist_insert +extern __typeof (g_slist_insert) g_slist_insert __attribute((alias("IA__g_slist_insert"), visibility("default"))); + +#undef g_slist_insert_before +extern __typeof (g_slist_insert_before) g_slist_insert_before __attribute((alias("IA__g_slist_insert_before"), visibility("default"))); + +#undef g_slist_insert_sorted +extern __typeof (g_slist_insert_sorted) g_slist_insert_sorted __attribute((alias("IA__g_slist_insert_sorted"), visibility("default"))); + +#undef g_slist_insert_sorted_with_data +extern __typeof (g_slist_insert_sorted_with_data) g_slist_insert_sorted_with_data __attribute((alias("IA__g_slist_insert_sorted_with_data"), visibility("default"))); + +#undef g_slist_last +extern __typeof (g_slist_last) g_slist_last __attribute((alias("IA__g_slist_last"), visibility("default"))); + +#undef g_slist_length +extern __typeof (g_slist_length) g_slist_length __attribute((alias("IA__g_slist_length"), visibility("default"))); + +#undef g_slist_nth +extern __typeof (g_slist_nth) g_slist_nth __attribute((alias("IA__g_slist_nth"), visibility("default"))); + +#undef g_slist_nth_data +extern __typeof (g_slist_nth_data) g_slist_nth_data __attribute((alias("IA__g_slist_nth_data"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_slist_pop_allocator +extern __typeof (g_slist_pop_allocator) g_slist_pop_allocator __attribute((alias("IA__g_slist_pop_allocator"), visibility("default"))); + +#endif +#undef g_slist_position +extern __typeof (g_slist_position) g_slist_position __attribute((alias("IA__g_slist_position"), visibility("default"))); + +#undef g_slist_prepend +extern __typeof (g_slist_prepend) g_slist_prepend __attribute((alias("IA__g_slist_prepend"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_slist_push_allocator +extern __typeof (g_slist_push_allocator) g_slist_push_allocator __attribute((alias("IA__g_slist_push_allocator"), visibility("default"))); + +#endif +#undef g_slist_remove +extern __typeof (g_slist_remove) g_slist_remove __attribute((alias("IA__g_slist_remove"), visibility("default"))); + +#undef g_slist_remove_all +extern __typeof (g_slist_remove_all) g_slist_remove_all __attribute((alias("IA__g_slist_remove_all"), visibility("default"))); + +#undef g_slist_remove_link +extern __typeof (g_slist_remove_link) g_slist_remove_link __attribute((alias("IA__g_slist_remove_link"), visibility("default"))); + +#undef g_slist_reverse +extern __typeof (g_slist_reverse) g_slist_reverse __attribute((alias("IA__g_slist_reverse"), visibility("default"))); + +#undef g_slist_sort +extern __typeof (g_slist_sort) g_slist_sort __attribute((alias("IA__g_slist_sort"), visibility("default"))); + +#undef g_slist_sort_with_data +extern __typeof (g_slist_sort_with_data) g_slist_sort_with_data __attribute((alias("IA__g_slist_sort_with_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SPAWN_H__) +#if IN_FILE(__G_SPAWN_C__) +#ifndef _WIN64 +#undef g_spawn_async +extern __typeof (g_spawn_async) g_spawn_async __attribute((alias("IA__g_spawn_async"), visibility("default"))); + +#undef g_spawn_async_with_pipes +extern __typeof (g_spawn_async_with_pipes) g_spawn_async_with_pipes __attribute((alias("IA__g_spawn_async_with_pipes"), visibility("default"))); + +#endif +#undef g_spawn_close_pid +extern __typeof (g_spawn_close_pid) g_spawn_close_pid __attribute((alias("IA__g_spawn_close_pid"), visibility("default"))); + +#ifndef _WIN64 +#undef g_spawn_command_line_async +extern __typeof (g_spawn_command_line_async) g_spawn_command_line_async __attribute((alias("IA__g_spawn_command_line_async"), visibility("default"))); + +#undef g_spawn_command_line_sync +extern __typeof (g_spawn_command_line_sync) g_spawn_command_line_sync __attribute((alias("IA__g_spawn_command_line_sync"), visibility("default"))); + +#endif +#undef g_spawn_error_quark +extern __typeof (g_spawn_error_quark) g_spawn_error_quark __attribute((alias("IA__g_spawn_error_quark"), visibility("default"))); + +#ifndef _WIN64 +#undef g_spawn_sync +extern __typeof (g_spawn_sync) g_spawn_sync __attribute((alias("IA__g_spawn_sync"), visibility("default"))); + +#endif +#ifdef G_OS_WIN32 +#undef g_spawn_async_utf8 +extern __typeof (g_spawn_async_utf8) g_spawn_async_utf8 __attribute((alias("IA__g_spawn_async_utf8"), visibility("default"))); + +#undef g_spawn_async_with_pipes_utf8 +extern __typeof (g_spawn_async_with_pipes_utf8) g_spawn_async_with_pipes_utf8 __attribute((alias("IA__g_spawn_async_with_pipes_utf8"), visibility("default"))); + +#undef g_spawn_command_line_async_utf8 +extern __typeof (g_spawn_command_line_async_utf8) g_spawn_command_line_async_utf8 __attribute((alias("IA__g_spawn_command_line_async_utf8"), visibility("default"))); + +#undef g_spawn_command_line_sync_utf8 +extern __typeof (g_spawn_command_line_sync_utf8) g_spawn_command_line_sync_utf8 __attribute((alias("IA__g_spawn_command_line_sync_utf8"), visibility("default"))); + +#undef g_spawn_sync_utf8 +extern __typeof (g_spawn_sync_utf8) g_spawn_sync_utf8 __attribute((alias("IA__g_spawn_sync_utf8"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_STDIO_H__) +#if IN_FILE(__G_STDIO_C__) +#if !defined(G_OS_UNIX) || defined(G_STDIO_NO_WRAP_ON_UNIX) +#undef g_chmod +extern __typeof (g_chmod) g_chmod __attribute((alias("IA__g_chmod"), visibility("default"))); + +#undef g_open +extern __typeof (g_open) g_open __attribute((alias("IA__g_open"), visibility("default"))); + +#undef g_creat +extern __typeof (g_creat) g_creat __attribute((alias("IA__g_creat"), visibility("default"))); + +#undef g_rename +extern __typeof (g_rename) g_rename __attribute((alias("IA__g_rename"), visibility("default"))); + +#undef g_mkdir +extern __typeof (g_mkdir) g_mkdir __attribute((alias("IA__g_mkdir"), visibility("default"))); + +#undef g_stat +extern __typeof (g_stat) g_stat __attribute((alias("IA__g_stat"), visibility("default"))); + +#undef g_lstat +extern __typeof (g_lstat) g_lstat __attribute((alias("IA__g_lstat"), visibility("default"))); + +#undef g_remove +extern __typeof (g_remove) g_remove __attribute((alias("IA__g_remove"), visibility("default"))); + +#undef g_fopen +extern __typeof (g_fopen) g_fopen __attribute((alias("IA__g_fopen"), visibility("default"))); + +#undef g_freopen +extern __typeof (g_freopen) g_freopen __attribute((alias("IA__g_freopen"), visibility("default"))); + +#undef g_utime +extern __typeof (g_utime) g_utime __attribute((alias("IA__g_utime"), visibility("default"))); + +#endif +#undef g_access +extern __typeof (g_access) g_access __attribute((alias("IA__g_access"), visibility("default"))); + +#undef g_chdir +extern __typeof (g_chdir) g_chdir __attribute((alias("IA__g_chdir"), visibility("default"))); + +#undef g_unlink +extern __typeof (g_unlink) g_unlink __attribute((alias("IA__g_unlink"), visibility("default"))); + +#undef g_rmdir +extern __typeof (g_rmdir) g_rmdir __attribute((alias("IA__g_rmdir"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_STRFUNCS_H__) +#if IN_FILE(__G_STRFUNCS_C__) +#undef g_ascii_digit_value +extern __typeof (g_ascii_digit_value) g_ascii_digit_value __attribute((alias("IA__g_ascii_digit_value"), visibility("default"))); + +#undef g_ascii_dtostr +extern __typeof (g_ascii_dtostr) g_ascii_dtostr __attribute((alias("IA__g_ascii_dtostr"), visibility("default"))); + +#undef g_ascii_formatd +extern __typeof (g_ascii_formatd) g_ascii_formatd __attribute((alias("IA__g_ascii_formatd"), visibility("default"))); + +#undef g_ascii_strdown +extern __typeof (g_ascii_strdown) g_ascii_strdown __attribute((alias("IA__g_ascii_strdown"), visibility("default"))); + +#undef g_ascii_strtod +extern __typeof (g_ascii_strtod) g_ascii_strtod __attribute((alias("IA__g_ascii_strtod"), visibility("default"))); + +#undef g_ascii_strtoull +extern __typeof (g_ascii_strtoull) g_ascii_strtoull __attribute((alias("IA__g_ascii_strtoull"), visibility("default"))); + +#undef g_ascii_strtoll +extern __typeof (g_ascii_strtoll) g_ascii_strtoll __attribute((alias("IA__g_ascii_strtoll"), visibility("default"))); + +#undef g_ascii_strup +extern __typeof (g_ascii_strup) g_ascii_strup __attribute((alias("IA__g_ascii_strup"), visibility("default"))); + +#undef g_ascii_tolower +extern __typeof (g_ascii_tolower) g_ascii_tolower __attribute((alias("IA__g_ascii_tolower"), visibility("default"))); + +#undef g_ascii_toupper +extern __typeof (g_ascii_toupper) g_ascii_toupper __attribute((alias("IA__g_ascii_toupper"), visibility("default"))); + +#undef g_ascii_xdigit_value +extern __typeof (g_ascii_xdigit_value) g_ascii_xdigit_value __attribute((alias("IA__g_ascii_xdigit_value"), visibility("default"))); + +#undef g_ascii_strcasecmp +extern __typeof (g_ascii_strcasecmp) g_ascii_strcasecmp __attribute((alias("IA__g_ascii_strcasecmp"), visibility("default"))); + +#undef g_ascii_strncasecmp +extern __typeof (g_ascii_strncasecmp) g_ascii_strncasecmp __attribute((alias("IA__g_ascii_strncasecmp"), visibility("default"))); + +#undef g_memdup +extern __typeof (g_memdup) g_memdup __attribute((alias("IA__g_memdup"), visibility("default"))); + +#undef g_stpcpy +extern __typeof (g_stpcpy) g_stpcpy __attribute((alias("IA__g_stpcpy"), visibility("default"))); + +#undef g_strcanon +extern __typeof (g_strcanon) g_strcanon __attribute((alias("IA__g_strcanon"), visibility("default"))); + +#undef g_strchomp +extern __typeof (g_strchomp) g_strchomp __attribute((alias("IA__g_strchomp"), visibility("default"))); + +#undef g_strchug +extern __typeof (g_strchug) g_strchug __attribute((alias("IA__g_strchug"), visibility("default"))); + +#undef g_strcompress +extern __typeof (g_strcompress) g_strcompress __attribute((alias("IA__g_strcompress"), visibility("default"))); + +#undef g_strconcat +extern __typeof (g_strconcat) g_strconcat __attribute((alias("IA__g_strconcat"), visibility("default"))); + +#undef g_strdelimit +extern __typeof (g_strdelimit) g_strdelimit __attribute((alias("IA__g_strdelimit"), visibility("default"))); + +#undef g_strdup +extern __typeof (g_strdup) g_strdup __attribute((alias("IA__g_strdup"), visibility("default"))); + +#undef g_strdup_printf +extern __typeof (g_strdup_printf) g_strdup_printf __attribute((alias("IA__g_strdup_printf"), visibility("default"))); + +#undef g_strdupv +extern __typeof (g_strdupv) g_strdupv __attribute((alias("IA__g_strdupv"), visibility("default"))); + +#undef g_strdup_vprintf +extern __typeof (g_strdup_vprintf) g_strdup_vprintf __attribute((alias("IA__g_strdup_vprintf"), visibility("default"))); + +#undef g_strerror +extern __typeof (g_strerror) g_strerror __attribute((alias("IA__g_strerror"), visibility("default"))); + +#undef g_strescape +extern __typeof (g_strescape) g_strescape __attribute((alias("IA__g_strescape"), visibility("default"))); + +#undef g_strfreev +extern __typeof (g_strfreev) g_strfreev __attribute((alias("IA__g_strfreev"), visibility("default"))); + +#undef g_str_has_prefix +extern __typeof (g_str_has_prefix) g_str_has_prefix __attribute((alias("IA__g_str_has_prefix"), visibility("default"))); + +#undef g_str_has_suffix +extern __typeof (g_str_has_suffix) g_str_has_suffix __attribute((alias("IA__g_str_has_suffix"), visibility("default"))); + +#undef g_strjoin +extern __typeof (g_strjoin) g_strjoin __attribute((alias("IA__g_strjoin"), visibility("default"))); + +#undef g_strjoinv +extern __typeof (g_strjoinv) g_strjoinv __attribute((alias("IA__g_strjoinv"), visibility("default"))); + +#undef g_strlcat +extern __typeof (g_strlcat) g_strlcat __attribute((alias("IA__g_strlcat"), visibility("default"))); + +#undef g_strlcpy +extern __typeof (g_strlcpy) g_strlcpy __attribute((alias("IA__g_strlcpy"), visibility("default"))); + +#undef g_strndup +extern __typeof (g_strndup) g_strndup __attribute((alias("IA__g_strndup"), visibility("default"))); + +#undef g_strnfill +extern __typeof (g_strnfill) g_strnfill __attribute((alias("IA__g_strnfill"), visibility("default"))); + +#undef g_strreverse +extern __typeof (g_strreverse) g_strreverse __attribute((alias("IA__g_strreverse"), visibility("default"))); + +#undef g_strrstr +extern __typeof (g_strrstr) g_strrstr __attribute((alias("IA__g_strrstr"), visibility("default"))); + +#undef g_strrstr_len +extern __typeof (g_strrstr_len) g_strrstr_len __attribute((alias("IA__g_strrstr_len"), visibility("default"))); + +#undef g_strsignal +extern __typeof (g_strsignal) g_strsignal __attribute((alias("IA__g_strsignal"), visibility("default"))); + +#undef g_strsplit +extern __typeof (g_strsplit) g_strsplit __attribute((alias("IA__g_strsplit"), visibility("default"))); + +#undef g_strsplit_set +extern __typeof (g_strsplit_set) g_strsplit_set __attribute((alias("IA__g_strsplit_set"), visibility("default"))); + +#undef g_strstr_len +extern __typeof (g_strstr_len) g_strstr_len __attribute((alias("IA__g_strstr_len"), visibility("default"))); + +#undef g_strtod +extern __typeof (g_strtod) g_strtod __attribute((alias("IA__g_strtod"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_strcasecmp +extern __typeof (g_strcasecmp) g_strcasecmp __attribute((alias("IA__g_strcasecmp"), visibility("default"))); + +#undef g_strncasecmp +extern __typeof (g_strncasecmp) g_strncasecmp __attribute((alias("IA__g_strncasecmp"), visibility("default"))); + +#undef g_strup +extern __typeof (g_strup) g_strup __attribute((alias("IA__g_strup"), visibility("default"))); + +#undef g_strdown +extern __typeof (g_strdown) g_strdown __attribute((alias("IA__g_strdown"), visibility("default"))); + +#endif +#undef g_strv_length +extern __typeof (g_strv_length) g_strv_length __attribute((alias("IA__g_strv_length"), visibility("default"))); + +#undef g_strip_context +extern __typeof (g_strip_context) g_strip_context __attribute((alias("IA__g_strip_context"), visibility("default"))); + +#undef g_dgettext +extern __typeof (g_dgettext) g_dgettext __attribute((alias("IA__g_dgettext"), visibility("default"))); + +#undef g_dngettext +extern __typeof (g_dngettext) g_dngettext __attribute((alias("IA__g_dngettext"), visibility("default"))); + +#undef g_dpgettext +extern __typeof (g_dpgettext) g_dpgettext __attribute((alias("IA__g_dpgettext"), visibility("default"))); + +#undef g_dpgettext2 +extern __typeof (g_dpgettext2) g_dpgettext2 __attribute((alias("IA__g_dpgettext2"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_URI_FUNCS_H__) +#if IN_FILE(__G_URI_FUNCS_C__) +#undef g_uri_unescape_string +extern __typeof (g_uri_unescape_string) g_uri_unescape_string __attribute((alias("IA__g_uri_unescape_string"), visibility("default"))); + +#undef g_uri_unescape_segment +extern __typeof (g_uri_unescape_segment) g_uri_unescape_segment __attribute((alias("IA__g_uri_unescape_segment"), visibility("default"))); + +#undef g_uri_parse_scheme +extern __typeof (g_uri_parse_scheme) g_uri_parse_scheme __attribute((alias("IA__g_uri_parse_scheme"), visibility("default"))); + +#undef g_uri_escape_string +extern __typeof (g_uri_escape_string) g_uri_escape_string __attribute((alias("IA__g_uri_escape_string"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_STRING_H__) +#if IN_FILE(__G_STRING_C__) +#undef g_string_append +extern __typeof (g_string_append) g_string_append __attribute((alias("IA__g_string_append"), visibility("default"))); + +#undef g_string_append_len +extern __typeof (g_string_append_len) g_string_append_len __attribute((alias("IA__g_string_append_len"), visibility("default"))); + +#undef g_string_append_printf +extern __typeof (g_string_append_printf) g_string_append_printf __attribute((alias("IA__g_string_append_printf"), visibility("default"))); + +#undef g_string_append_unichar +extern __typeof (g_string_append_unichar) g_string_append_unichar __attribute((alias("IA__g_string_append_unichar"), visibility("default"))); + +#undef g_string_append_vprintf +extern __typeof (g_string_append_vprintf) g_string_append_vprintf __attribute((alias("IA__g_string_append_vprintf"), visibility("default"))); + +#undef g_string_ascii_down +extern __typeof (g_string_ascii_down) g_string_ascii_down __attribute((alias("IA__g_string_ascii_down"), visibility("default"))); + +#undef g_string_ascii_up +extern __typeof (g_string_ascii_up) g_string_ascii_up __attribute((alias("IA__g_string_ascii_up"), visibility("default"))); + +#undef g_string_assign +extern __typeof (g_string_assign) g_string_assign __attribute((alias("IA__g_string_assign"), visibility("default"))); + +#undef g_string_chunk_free +extern __typeof (g_string_chunk_free) g_string_chunk_free __attribute((alias("IA__g_string_chunk_free"), visibility("default"))); + +#undef g_string_chunk_clear +extern __typeof (g_string_chunk_clear) g_string_chunk_clear __attribute((alias("IA__g_string_chunk_clear"), visibility("default"))); + +#undef g_string_chunk_insert +extern __typeof (g_string_chunk_insert) g_string_chunk_insert __attribute((alias("IA__g_string_chunk_insert"), visibility("default"))); + +#undef g_string_chunk_insert_const +extern __typeof (g_string_chunk_insert_const) g_string_chunk_insert_const __attribute((alias("IA__g_string_chunk_insert_const"), visibility("default"))); + +#undef g_string_chunk_insert_len +extern __typeof (g_string_chunk_insert_len) g_string_chunk_insert_len __attribute((alias("IA__g_string_chunk_insert_len"), visibility("default"))); + +#undef g_string_chunk_new +extern __typeof (g_string_chunk_new) g_string_chunk_new __attribute((alias("IA__g_string_chunk_new"), visibility("default"))); + +#undef g_string_equal +extern __typeof (g_string_equal) g_string_equal __attribute((alias("IA__g_string_equal"), visibility("default"))); + +#undef g_string_erase +extern __typeof (g_string_erase) g_string_erase __attribute((alias("IA__g_string_erase"), visibility("default"))); + +#undef g_string_free +extern __typeof (g_string_free) g_string_free __attribute((alias("IA__g_string_free"), visibility("default"))); + +#undef g_string_hash +extern __typeof (g_string_hash) g_string_hash __attribute((alias("IA__g_string_hash"), visibility("default"))); + +#undef g_string_insert +extern __typeof (g_string_insert) g_string_insert __attribute((alias("IA__g_string_insert"), visibility("default"))); + +#undef g_string_insert_c +extern __typeof (g_string_insert_c) g_string_insert_c __attribute((alias("IA__g_string_insert_c"), visibility("default"))); + +#undef g_string_insert_len +extern __typeof (g_string_insert_len) g_string_insert_len __attribute((alias("IA__g_string_insert_len"), visibility("default"))); + +#undef g_string_insert_unichar +extern __typeof (g_string_insert_unichar) g_string_insert_unichar __attribute((alias("IA__g_string_insert_unichar"), visibility("default"))); + +#undef g_string_new +extern __typeof (g_string_new) g_string_new __attribute((alias("IA__g_string_new"), visibility("default"))); + +#undef g_string_new_len +extern __typeof (g_string_new_len) g_string_new_len __attribute((alias("IA__g_string_new_len"), visibility("default"))); + +#undef g_string_overwrite +extern __typeof (g_string_overwrite) g_string_overwrite __attribute((alias("IA__g_string_overwrite"), visibility("default"))); + +#undef g_string_overwrite_len +extern __typeof (g_string_overwrite_len) g_string_overwrite_len __attribute((alias("IA__g_string_overwrite_len"), visibility("default"))); + +#undef g_string_prepend +extern __typeof (g_string_prepend) g_string_prepend __attribute((alias("IA__g_string_prepend"), visibility("default"))); + +#undef g_string_prepend_c +extern __typeof (g_string_prepend_c) g_string_prepend_c __attribute((alias("IA__g_string_prepend_c"), visibility("default"))); + +#undef g_string_prepend_len +extern __typeof (g_string_prepend_len) g_string_prepend_len __attribute((alias("IA__g_string_prepend_len"), visibility("default"))); + +#undef g_string_prepend_unichar +extern __typeof (g_string_prepend_unichar) g_string_prepend_unichar __attribute((alias("IA__g_string_prepend_unichar"), visibility("default"))); + +#undef g_string_printf +extern __typeof (g_string_printf) g_string_printf __attribute((alias("IA__g_string_printf"), visibility("default"))); + +#undef g_string_set_size +extern __typeof (g_string_set_size) g_string_set_size __attribute((alias("IA__g_string_set_size"), visibility("default"))); + +#undef g_string_sized_new +extern __typeof (g_string_sized_new) g_string_sized_new __attribute((alias("IA__g_string_sized_new"), visibility("default"))); + +#undef g_string_truncate +extern __typeof (g_string_truncate) g_string_truncate __attribute((alias("IA__g_string_truncate"), visibility("default"))); + +#undef g_string_append_uri_escaped +extern __typeof (g_string_append_uri_escaped) g_string_append_uri_escaped __attribute((alias("IA__g_string_append_uri_escaped"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_string_down +extern __typeof (g_string_down) g_string_down __attribute((alias("IA__g_string_down"), visibility("default"))); + +#undef g_string_up +extern __typeof (g_string_up) g_string_up __attribute((alias("IA__g_string_up"), visibility("default"))); + +#endif +#undef g_string_vprintf +extern __typeof (g_string_vprintf) g_string_vprintf __attribute((alias("IA__g_string_vprintf"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_BITLOCK_H__) +#if IN_FILE(__G_BITLOCK_C__) +#undef g_bit_lock +extern __typeof (g_bit_lock) g_bit_lock __attribute((alias("IA__g_bit_lock"), visibility("default"))); + +#undef g_bit_trylock +extern __typeof (g_bit_trylock) g_bit_trylock __attribute((alias("IA__g_bit_trylock"), visibility("default"))); + +#undef g_bit_unlock +extern __typeof (g_bit_unlock) g_bit_unlock __attribute((alias("IA__g_bit_unlock"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_THREAD_H__) +#if IN_FILE(__G_THREAD_C__) +#undef g_once_impl +extern __typeof (g_once_impl) g_once_impl __attribute((alias("IA__g_once_impl"), visibility("default"))); + +#undef g_once_init_enter_impl +extern __typeof (g_once_init_enter_impl) g_once_init_enter_impl __attribute((alias("IA__g_once_init_enter_impl"), visibility("default"))); + +#undef g_once_init_leave +extern __typeof (g_once_init_leave) g_once_init_leave __attribute((alias("IA__g_once_init_leave"), visibility("default"))); + +#undef g_thread_create_full +extern __typeof (g_thread_create_full) g_thread_create_full __attribute((alias("IA__g_thread_create_full"), visibility("default"))); + +#undef g_thread_error_quark +extern __typeof (g_thread_error_quark) g_thread_error_quark __attribute((alias("IA__g_thread_error_quark"), visibility("default"))); + +#undef g_thread_exit +extern __typeof (g_thread_exit) g_thread_exit __attribute((alias("IA__g_thread_exit"), visibility("default"))); + +#undef g_thread_join +extern __typeof (g_thread_join) g_thread_join __attribute((alias("IA__g_thread_join"), visibility("default"))); + +#undef g_thread_self +extern __typeof (g_thread_self) g_thread_self __attribute((alias("IA__g_thread_self"), visibility("default"))); + +#undef g_thread_set_priority +extern __typeof (g_thread_set_priority) g_thread_set_priority __attribute((alias("IA__g_thread_set_priority"), visibility("default"))); + +#undef g_static_mutex_free +extern __typeof (g_static_mutex_free) g_static_mutex_free __attribute((alias("IA__g_static_mutex_free"), visibility("default"))); + +#undef g_static_mutex_get_mutex_impl +extern __typeof (g_static_mutex_get_mutex_impl) g_static_mutex_get_mutex_impl __attribute((alias("IA__g_static_mutex_get_mutex_impl"), visibility("default"))); + +#undef g_static_mutex_init +extern __typeof (g_static_mutex_init) g_static_mutex_init __attribute((alias("IA__g_static_mutex_init"), visibility("default"))); + +#undef g_static_private_free +extern __typeof (g_static_private_free) g_static_private_free __attribute((alias("IA__g_static_private_free"), visibility("default"))); + +#undef g_static_private_get +extern __typeof (g_static_private_get) g_static_private_get __attribute((alias("IA__g_static_private_get"), visibility("default"))); + +#undef g_static_private_init +extern __typeof (g_static_private_init) g_static_private_init __attribute((alias("IA__g_static_private_init"), visibility("default"))); + +#undef g_static_private_set +extern __typeof (g_static_private_set) g_static_private_set __attribute((alias("IA__g_static_private_set"), visibility("default"))); + +#undef g_static_rec_mutex_free +extern __typeof (g_static_rec_mutex_free) g_static_rec_mutex_free __attribute((alias("IA__g_static_rec_mutex_free"), visibility("default"))); + +#undef g_static_rec_mutex_init +extern __typeof (g_static_rec_mutex_init) g_static_rec_mutex_init __attribute((alias("IA__g_static_rec_mutex_init"), visibility("default"))); + +#undef g_static_rec_mutex_lock +extern __typeof (g_static_rec_mutex_lock) g_static_rec_mutex_lock __attribute((alias("IA__g_static_rec_mutex_lock"), visibility("default"))); + +#undef g_static_rec_mutex_lock_full +extern __typeof (g_static_rec_mutex_lock_full) g_static_rec_mutex_lock_full __attribute((alias("IA__g_static_rec_mutex_lock_full"), visibility("default"))); + +#undef g_static_rec_mutex_trylock +extern __typeof (g_static_rec_mutex_trylock) g_static_rec_mutex_trylock __attribute((alias("IA__g_static_rec_mutex_trylock"), visibility("default"))); + +#undef g_static_rec_mutex_unlock +extern __typeof (g_static_rec_mutex_unlock) g_static_rec_mutex_unlock __attribute((alias("IA__g_static_rec_mutex_unlock"), visibility("default"))); + +#undef g_static_rec_mutex_unlock_full +extern __typeof (g_static_rec_mutex_unlock_full) g_static_rec_mutex_unlock_full __attribute((alias("IA__g_static_rec_mutex_unlock_full"), visibility("default"))); + +#undef g_static_rw_lock_free +extern __typeof (g_static_rw_lock_free) g_static_rw_lock_free __attribute((alias("IA__g_static_rw_lock_free"), visibility("default"))); + +#undef g_static_rw_lock_init +extern __typeof (g_static_rw_lock_init) g_static_rw_lock_init __attribute((alias("IA__g_static_rw_lock_init"), visibility("default"))); + +#undef g_static_rw_lock_reader_lock +extern __typeof (g_static_rw_lock_reader_lock) g_static_rw_lock_reader_lock __attribute((alias("IA__g_static_rw_lock_reader_lock"), visibility("default"))); + +#undef g_static_rw_lock_reader_trylock +extern __typeof (g_static_rw_lock_reader_trylock) g_static_rw_lock_reader_trylock __attribute((alias("IA__g_static_rw_lock_reader_trylock"), visibility("default"))); + +#undef g_static_rw_lock_reader_unlock +extern __typeof (g_static_rw_lock_reader_unlock) g_static_rw_lock_reader_unlock __attribute((alias("IA__g_static_rw_lock_reader_unlock"), visibility("default"))); + +#undef g_static_rw_lock_writer_lock +extern __typeof (g_static_rw_lock_writer_lock) g_static_rw_lock_writer_lock __attribute((alias("IA__g_static_rw_lock_writer_lock"), visibility("default"))); + +#undef g_static_rw_lock_writer_trylock +extern __typeof (g_static_rw_lock_writer_trylock) g_static_rw_lock_writer_trylock __attribute((alias("IA__g_static_rw_lock_writer_trylock"), visibility("default"))); + +#undef g_static_rw_lock_writer_unlock +extern __typeof (g_static_rw_lock_writer_unlock) g_static_rw_lock_writer_unlock __attribute((alias("IA__g_static_rw_lock_writer_unlock"), visibility("default"))); + +#undef g_thread_foreach +extern __typeof (g_thread_foreach) g_thread_foreach __attribute((alias("IA__g_thread_foreach"), visibility("default"))); + +#undef g_thread_get_initialized +extern __typeof (g_thread_get_initialized) g_thread_get_initialized __attribute((alias("IA__g_thread_get_initialized"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_THREADPOOL_H__) +#if IN_FILE(__G_THREADPOOL_C__) +#undef g_thread_pool_free +extern __typeof (g_thread_pool_free) g_thread_pool_free __attribute((alias("IA__g_thread_pool_free"), visibility("default"))); + +#undef g_thread_pool_get_max_threads +extern __typeof (g_thread_pool_get_max_threads) g_thread_pool_get_max_threads __attribute((alias("IA__g_thread_pool_get_max_threads"), visibility("default"))); + +#undef g_thread_pool_get_max_unused_threads +extern __typeof (g_thread_pool_get_max_unused_threads) g_thread_pool_get_max_unused_threads __attribute((alias("IA__g_thread_pool_get_max_unused_threads"), visibility("default"))); + +#undef g_thread_pool_get_max_idle_time +extern __typeof (g_thread_pool_get_max_idle_time) g_thread_pool_get_max_idle_time __attribute((alias("IA__g_thread_pool_get_max_idle_time"), visibility("default"))); + +#undef g_thread_pool_get_num_threads +extern __typeof (g_thread_pool_get_num_threads) g_thread_pool_get_num_threads __attribute((alias("IA__g_thread_pool_get_num_threads"), visibility("default"))); + +#undef g_thread_pool_get_num_unused_threads +extern __typeof (g_thread_pool_get_num_unused_threads) g_thread_pool_get_num_unused_threads __attribute((alias("IA__g_thread_pool_get_num_unused_threads"), visibility("default"))); + +#undef g_thread_pool_new +extern __typeof (g_thread_pool_new) g_thread_pool_new __attribute((alias("IA__g_thread_pool_new"), visibility("default"))); + +#undef g_thread_pool_push +extern __typeof (g_thread_pool_push) g_thread_pool_push __attribute((alias("IA__g_thread_pool_push"), visibility("default"))); + +#undef g_thread_pool_set_max_threads +extern __typeof (g_thread_pool_set_max_threads) g_thread_pool_set_max_threads __attribute((alias("IA__g_thread_pool_set_max_threads"), visibility("default"))); + +#undef g_thread_pool_set_max_unused_threads +extern __typeof (g_thread_pool_set_max_unused_threads) g_thread_pool_set_max_unused_threads __attribute((alias("IA__g_thread_pool_set_max_unused_threads"), visibility("default"))); + +#undef g_thread_pool_set_max_idle_time +extern __typeof (g_thread_pool_set_max_idle_time) g_thread_pool_set_max_idle_time __attribute((alias("IA__g_thread_pool_set_max_idle_time"), visibility("default"))); + +#undef g_thread_pool_stop_unused_threads +extern __typeof (g_thread_pool_stop_unused_threads) g_thread_pool_stop_unused_threads __attribute((alias("IA__g_thread_pool_stop_unused_threads"), visibility("default"))); + +#undef g_thread_pool_unprocessed +extern __typeof (g_thread_pool_unprocessed) g_thread_pool_unprocessed __attribute((alias("IA__g_thread_pool_unprocessed"), visibility("default"))); + +#undef g_thread_pool_set_sort_function +extern __typeof (g_thread_pool_set_sort_function) g_thread_pool_set_sort_function __attribute((alias("IA__g_thread_pool_set_sort_function"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TEST_UTILS_H__) +#if IN_FILE(__G_MESSAGES_C__) +#undef g_test_log_set_fatal_handler +extern __typeof (g_test_log_set_fatal_handler) g_test_log_set_fatal_handler __attribute((alias("IA__g_test_log_set_fatal_handler"), visibility("default"))); + +#endif +#if IN_FILE(__G_TEST_UTILS_C__) +#undef g_assertion_message +extern __typeof (g_assertion_message) g_assertion_message __attribute((alias("IA__g_assertion_message"), visibility("default"))); + +#undef g_assertion_message_cmpnum +extern __typeof (g_assertion_message_cmpnum) g_assertion_message_cmpnum __attribute((alias("IA__g_assertion_message_cmpnum"), visibility("default"))); + +#undef g_assertion_message_cmpstr +extern __typeof (g_assertion_message_cmpstr) g_assertion_message_cmpstr __attribute((alias("IA__g_assertion_message_cmpstr"), visibility("default"))); + +#undef g_assertion_message_expr +extern __typeof (g_assertion_message_expr) g_assertion_message_expr __attribute((alias("IA__g_assertion_message_expr"), visibility("default"))); + +#undef g_assertion_message_error +extern __typeof (g_assertion_message_error) g_assertion_message_error __attribute((alias("IA__g_assertion_message_error"), visibility("default"))); + +#undef g_strcmp0 +extern __typeof (g_strcmp0) g_strcmp0 __attribute((alias("IA__g_strcmp0"), visibility("default"))); + +#undef g_test_add_data_func +extern __typeof (g_test_add_data_func) g_test_add_data_func __attribute((alias("IA__g_test_add_data_func"), visibility("default"))); + +#undef g_test_add_func +extern __typeof (g_test_add_func) g_test_add_func __attribute((alias("IA__g_test_add_func"), visibility("default"))); + +#undef g_test_add_vtable +extern __typeof (g_test_add_vtable) g_test_add_vtable __attribute((alias("IA__g_test_add_vtable"), visibility("default"))); + +#undef g_test_bug +extern __typeof (g_test_bug) g_test_bug __attribute((alias("IA__g_test_bug"), visibility("default"))); + +#undef g_test_bug_base +extern __typeof (g_test_bug_base) g_test_bug_base __attribute((alias("IA__g_test_bug_base"), visibility("default"))); + +#undef g_test_create_case +extern __typeof (g_test_create_case) g_test_create_case __attribute((alias("IA__g_test_create_case"), visibility("default"))); + +#undef g_test_create_suite +extern __typeof (g_test_create_suite) g_test_create_suite __attribute((alias("IA__g_test_create_suite"), visibility("default"))); + +#undef g_test_get_root +extern __typeof (g_test_get_root) g_test_get_root __attribute((alias("IA__g_test_get_root"), visibility("default"))); + +#undef g_test_init +extern __typeof (g_test_init) g_test_init __attribute((alias("IA__g_test_init"), visibility("default"))); + +#undef g_test_log_buffer_free +extern __typeof (g_test_log_buffer_free) g_test_log_buffer_free __attribute((alias("IA__g_test_log_buffer_free"), visibility("default"))); + +#undef g_test_log_buffer_new +extern __typeof (g_test_log_buffer_new) g_test_log_buffer_new __attribute((alias("IA__g_test_log_buffer_new"), visibility("default"))); + +#undef g_test_log_buffer_pop +extern __typeof (g_test_log_buffer_pop) g_test_log_buffer_pop __attribute((alias("IA__g_test_log_buffer_pop"), visibility("default"))); + +#undef g_test_log_buffer_push +extern __typeof (g_test_log_buffer_push) g_test_log_buffer_push __attribute((alias("IA__g_test_log_buffer_push"), visibility("default"))); + +#undef g_test_log_msg_free +extern __typeof (g_test_log_msg_free) g_test_log_msg_free __attribute((alias("IA__g_test_log_msg_free"), visibility("default"))); + +#undef g_test_log_type_name +extern __typeof (g_test_log_type_name) g_test_log_type_name __attribute((alias("IA__g_test_log_type_name"), visibility("default"))); + +#undef g_test_maximized_result +extern __typeof (g_test_maximized_result) g_test_maximized_result __attribute((alias("IA__g_test_maximized_result"), visibility("default"))); + +#undef g_test_message +extern __typeof (g_test_message) g_test_message __attribute((alias("IA__g_test_message"), visibility("default"))); + +#undef g_test_minimized_result +extern __typeof (g_test_minimized_result) g_test_minimized_result __attribute((alias("IA__g_test_minimized_result"), visibility("default"))); + +#undef g_test_queue_destroy +extern __typeof (g_test_queue_destroy) g_test_queue_destroy __attribute((alias("IA__g_test_queue_destroy"), visibility("default"))); + +#undef g_test_queue_free +extern __typeof (g_test_queue_free) g_test_queue_free __attribute((alias("IA__g_test_queue_free"), visibility("default"))); + +#undef g_test_rand_double +extern __typeof (g_test_rand_double) g_test_rand_double __attribute((alias("IA__g_test_rand_double"), visibility("default"))); + +#undef g_test_rand_double_range +extern __typeof (g_test_rand_double_range) g_test_rand_double_range __attribute((alias("IA__g_test_rand_double_range"), visibility("default"))); + +#undef g_test_rand_int +extern __typeof (g_test_rand_int) g_test_rand_int __attribute((alias("IA__g_test_rand_int"), visibility("default"))); + +#undef g_test_rand_int_range +extern __typeof (g_test_rand_int_range) g_test_rand_int_range __attribute((alias("IA__g_test_rand_int_range"), visibility("default"))); + +#undef g_test_run +extern __typeof (g_test_run) g_test_run __attribute((alias("IA__g_test_run"), visibility("default"))); + +#undef g_test_run_suite +extern __typeof (g_test_run_suite) g_test_run_suite __attribute((alias("IA__g_test_run_suite"), visibility("default"))); + +#undef g_test_suite_add +extern __typeof (g_test_suite_add) g_test_suite_add __attribute((alias("IA__g_test_suite_add"), visibility("default"))); + +#undef g_test_suite_add_suite +extern __typeof (g_test_suite_add_suite) g_test_suite_add_suite __attribute((alias("IA__g_test_suite_add_suite"), visibility("default"))); + +#undef g_test_timer_elapsed +extern __typeof (g_test_timer_elapsed) g_test_timer_elapsed __attribute((alias("IA__g_test_timer_elapsed"), visibility("default"))); + +#undef g_test_timer_last +extern __typeof (g_test_timer_last) g_test_timer_last __attribute((alias("IA__g_test_timer_last"), visibility("default"))); + +#undef g_test_timer_start +extern __typeof (g_test_timer_start) g_test_timer_start __attribute((alias("IA__g_test_timer_start"), visibility("default"))); + +#undef g_test_trap_assertions +extern __typeof (g_test_trap_assertions) g_test_trap_assertions __attribute((alias("IA__g_test_trap_assertions"), visibility("default"))); + +#undef g_test_trap_fork +extern __typeof (g_test_trap_fork) g_test_trap_fork __attribute((alias("IA__g_test_trap_fork"), visibility("default"))); + +#undef g_test_trap_has_passed +extern __typeof (g_test_trap_has_passed) g_test_trap_has_passed __attribute((alias("IA__g_test_trap_has_passed"), visibility("default"))); + +#undef g_test_trap_reached_timeout +extern __typeof (g_test_trap_reached_timeout) g_test_trap_reached_timeout __attribute((alias("IA__g_test_trap_reached_timeout"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TIMER_H__) +#if IN_FILE(__G_TIMER_C__) +#undef g_timer_continue +extern __typeof (g_timer_continue) g_timer_continue __attribute((alias("IA__g_timer_continue"), visibility("default"))); + +#undef g_timer_destroy +extern __typeof (g_timer_destroy) g_timer_destroy __attribute((alias("IA__g_timer_destroy"), visibility("default"))); + +#undef g_timer_elapsed +extern __typeof (g_timer_elapsed) g_timer_elapsed __attribute((alias("IA__g_timer_elapsed"), visibility("default"))); + +#undef g_timer_new +extern __typeof (g_timer_new) g_timer_new __attribute((alias("IA__g_timer_new"), visibility("default"))); + +#undef g_timer_reset +extern __typeof (g_timer_reset) g_timer_reset __attribute((alias("IA__g_timer_reset"), visibility("default"))); + +#undef g_timer_start +extern __typeof (g_timer_start) g_timer_start __attribute((alias("IA__g_timer_start"), visibility("default"))); + +#undef g_timer_stop +extern __typeof (g_timer_stop) g_timer_stop __attribute((alias("IA__g_timer_stop"), visibility("default"))); + +#undef g_time_val_add +extern __typeof (g_time_val_add) g_time_val_add __attribute((alias("IA__g_time_val_add"), visibility("default"))); + +#undef g_time_val_from_iso8601 +extern __typeof (g_time_val_from_iso8601) g_time_val_from_iso8601 __attribute((alias("IA__g_time_val_from_iso8601"), visibility("default"))); + +#undef g_time_val_to_iso8601 +extern __typeof (g_time_val_to_iso8601) g_time_val_to_iso8601 __attribute((alias("IA__g_time_val_to_iso8601"), visibility("default"))); + +#undef g_usleep +extern __typeof (g_usleep) g_usleep __attribute((alias("IA__g_usleep"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TREE_H__) +#if IN_FILE(__G_TREE_C__) +#undef g_tree_destroy +extern __typeof (g_tree_destroy) g_tree_destroy __attribute((alias("IA__g_tree_destroy"), visibility("default"))); + +#undef g_tree_foreach +extern __typeof (g_tree_foreach) g_tree_foreach __attribute((alias("IA__g_tree_foreach"), visibility("default"))); + +#undef g_tree_height +extern __typeof (g_tree_height) g_tree_height __attribute((alias("IA__g_tree_height"), visibility("default"))); + +#undef g_tree_insert +extern __typeof (g_tree_insert) g_tree_insert __attribute((alias("IA__g_tree_insert"), visibility("default"))); + +#undef g_tree_lookup +extern __typeof (g_tree_lookup) g_tree_lookup __attribute((alias("IA__g_tree_lookup"), visibility("default"))); + +#undef g_tree_lookup_extended +extern __typeof (g_tree_lookup_extended) g_tree_lookup_extended __attribute((alias("IA__g_tree_lookup_extended"), visibility("default"))); + +#undef g_tree_new +extern __typeof (g_tree_new) g_tree_new __attribute((alias("IA__g_tree_new"), visibility("default"))); + +#undef g_tree_ref +extern __typeof (g_tree_ref) g_tree_ref __attribute((alias("IA__g_tree_ref"), visibility("default"))); + +#undef g_tree_unref +extern __typeof (g_tree_unref) g_tree_unref __attribute((alias("IA__g_tree_unref"), visibility("default"))); + +#undef g_tree_new_full +extern __typeof (g_tree_new_full) g_tree_new_full __attribute((alias("IA__g_tree_new_full"), visibility("default"))); + +#undef g_tree_new_with_data +extern __typeof (g_tree_new_with_data) g_tree_new_with_data __attribute((alias("IA__g_tree_new_with_data"), visibility("default"))); + +#undef g_tree_nnodes +extern __typeof (g_tree_nnodes) g_tree_nnodes __attribute((alias("IA__g_tree_nnodes"), visibility("default"))); + +#undef g_tree_remove +extern __typeof (g_tree_remove) g_tree_remove __attribute((alias("IA__g_tree_remove"), visibility("default"))); + +#undef g_tree_replace +extern __typeof (g_tree_replace) g_tree_replace __attribute((alias("IA__g_tree_replace"), visibility("default"))); + +#undef g_tree_search +extern __typeof (g_tree_search) g_tree_search __attribute((alias("IA__g_tree_search"), visibility("default"))); + +#undef g_tree_steal +extern __typeof (g_tree_steal) g_tree_steal __attribute((alias("IA__g_tree_steal"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_tree_traverse +extern __typeof (g_tree_traverse) g_tree_traverse __attribute((alias("IA__g_tree_traverse"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIBREAK_C__) +#undef g_unichar_break_type +extern __typeof (g_unichar_break_type) g_unichar_break_type __attribute((alias("IA__g_unichar_break_type"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNICOLLATE_C__) +#undef g_utf8_collate +extern __typeof (g_utf8_collate) g_utf8_collate __attribute((alias("IA__g_utf8_collate"), visibility("default"))); + +#undef g_utf8_collate_key +extern __typeof (g_utf8_collate_key) g_utf8_collate_key __attribute((alias("IA__g_utf8_collate_key"), visibility("default"))); + +#undef g_utf8_collate_key_for_filename +extern __typeof (g_utf8_collate_key_for_filename) g_utf8_collate_key_for_filename __attribute((alias("IA__g_utf8_collate_key_for_filename"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIDECOMP_C__) +#undef g_unicode_canonical_decomposition +extern __typeof (g_unicode_canonical_decomposition) g_unicode_canonical_decomposition __attribute((alias("IA__g_unicode_canonical_decomposition"), visibility("default"))); + +#undef g_unicode_canonical_ordering +extern __typeof (g_unicode_canonical_ordering) g_unicode_canonical_ordering __attribute((alias("IA__g_unicode_canonical_ordering"), visibility("default"))); + +#undef g_unichar_combining_class +extern __typeof (g_unichar_combining_class) g_unichar_combining_class __attribute((alias("IA__g_unichar_combining_class"), visibility("default"))); + +#undef g_utf8_normalize +extern __typeof (g_utf8_normalize) g_utf8_normalize __attribute((alias("IA__g_utf8_normalize"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIPROP_C__) +#undef g_unichar_isalnum +extern __typeof (g_unichar_isalnum) g_unichar_isalnum __attribute((alias("IA__g_unichar_isalnum"), visibility("default"))); + +#undef g_unichar_isalpha +extern __typeof (g_unichar_isalpha) g_unichar_isalpha __attribute((alias("IA__g_unichar_isalpha"), visibility("default"))); + +#undef g_unichar_iscntrl +extern __typeof (g_unichar_iscntrl) g_unichar_iscntrl __attribute((alias("IA__g_unichar_iscntrl"), visibility("default"))); + +#undef g_unichar_isdefined +extern __typeof (g_unichar_isdefined) g_unichar_isdefined __attribute((alias("IA__g_unichar_isdefined"), visibility("default"))); + +#undef g_unichar_isdigit +extern __typeof (g_unichar_isdigit) g_unichar_isdigit __attribute((alias("IA__g_unichar_isdigit"), visibility("default"))); + +#undef g_unichar_isgraph +extern __typeof (g_unichar_isgraph) g_unichar_isgraph __attribute((alias("IA__g_unichar_isgraph"), visibility("default"))); + +#undef g_unichar_islower +extern __typeof (g_unichar_islower) g_unichar_islower __attribute((alias("IA__g_unichar_islower"), visibility("default"))); + +#undef g_unichar_isprint +extern __typeof (g_unichar_isprint) g_unichar_isprint __attribute((alias("IA__g_unichar_isprint"), visibility("default"))); + +#undef g_unichar_ispunct +extern __typeof (g_unichar_ispunct) g_unichar_ispunct __attribute((alias("IA__g_unichar_ispunct"), visibility("default"))); + +#undef g_unichar_isspace +extern __typeof (g_unichar_isspace) g_unichar_isspace __attribute((alias("IA__g_unichar_isspace"), visibility("default"))); + +#undef g_unichar_istitle +extern __typeof (g_unichar_istitle) g_unichar_istitle __attribute((alias("IA__g_unichar_istitle"), visibility("default"))); + +#undef g_unichar_isupper +extern __typeof (g_unichar_isupper) g_unichar_isupper __attribute((alias("IA__g_unichar_isupper"), visibility("default"))); + +#undef g_unichar_iswide +extern __typeof (g_unichar_iswide) g_unichar_iswide __attribute((alias("IA__g_unichar_iswide"), visibility("default"))); + +#undef g_unichar_iswide_cjk +extern __typeof (g_unichar_iswide_cjk) g_unichar_iswide_cjk __attribute((alias("IA__g_unichar_iswide_cjk"), visibility("default"))); + +#undef g_unichar_isxdigit +extern __typeof (g_unichar_isxdigit) g_unichar_isxdigit __attribute((alias("IA__g_unichar_isxdigit"), visibility("default"))); + +#undef g_unichar_iszerowidth +extern __typeof (g_unichar_iszerowidth) g_unichar_iszerowidth __attribute((alias("IA__g_unichar_iszerowidth"), visibility("default"))); + +#undef g_unichar_tolower +extern __typeof (g_unichar_tolower) g_unichar_tolower __attribute((alias("IA__g_unichar_tolower"), visibility("default"))); + +#undef g_unichar_totitle +extern __typeof (g_unichar_totitle) g_unichar_totitle __attribute((alias("IA__g_unichar_totitle"), visibility("default"))); + +#undef g_unichar_toupper +extern __typeof (g_unichar_toupper) g_unichar_toupper __attribute((alias("IA__g_unichar_toupper"), visibility("default"))); + +#undef g_unichar_ismark +extern __typeof (g_unichar_ismark) g_unichar_ismark __attribute((alias("IA__g_unichar_ismark"), visibility("default"))); + +#undef g_unichar_get_mirror_char +extern __typeof (g_unichar_get_mirror_char) g_unichar_get_mirror_char __attribute((alias("IA__g_unichar_get_mirror_char"), visibility("default"))); + +#undef g_unichar_get_script +extern __typeof (g_unichar_get_script) g_unichar_get_script __attribute((alias("IA__g_unichar_get_script"), visibility("default"))); + +#undef g_unichar_digit_value +extern __typeof (g_unichar_digit_value) g_unichar_digit_value __attribute((alias("IA__g_unichar_digit_value"), visibility("default"))); + +#undef g_unichar_xdigit_value +extern __typeof (g_unichar_xdigit_value) g_unichar_xdigit_value __attribute((alias("IA__g_unichar_xdigit_value"), visibility("default"))); + +#undef g_unichar_type +extern __typeof (g_unichar_type) g_unichar_type __attribute((alias("IA__g_unichar_type"), visibility("default"))); + +#undef g_utf8_casefold +extern __typeof (g_utf8_casefold) g_utf8_casefold __attribute((alias("IA__g_utf8_casefold"), visibility("default"))); + +#undef g_utf8_strup +extern __typeof (g_utf8_strup) g_utf8_strup __attribute((alias("IA__g_utf8_strup"), visibility("default"))); + +#undef g_utf8_strdown +extern __typeof (g_utf8_strdown) g_utf8_strdown __attribute((alias("IA__g_utf8_strdown"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UTF8_C__) +#undef g_get_charset +extern __typeof (g_get_charset) g_get_charset __attribute((alias("IA__g_get_charset"), visibility("default"))); + +#undef g_ucs4_to_utf16 +extern __typeof (g_ucs4_to_utf16) g_ucs4_to_utf16 __attribute((alias("IA__g_ucs4_to_utf16"), visibility("default"))); + +#undef g_ucs4_to_utf8 +extern __typeof (g_ucs4_to_utf8) g_ucs4_to_utf8 __attribute((alias("IA__g_ucs4_to_utf8"), visibility("default"))); + +#undef g_utf16_to_ucs4 +extern __typeof (g_utf16_to_ucs4) g_utf16_to_ucs4 __attribute((alias("IA__g_utf16_to_ucs4"), visibility("default"))); + +#undef g_utf16_to_utf8 +extern __typeof (g_utf16_to_utf8) g_utf16_to_utf8 __attribute((alias("IA__g_utf16_to_utf8"), visibility("default"))); + +#undef g_utf8_find_next_char +extern __typeof (g_utf8_find_next_char) g_utf8_find_next_char __attribute((alias("IA__g_utf8_find_next_char"), visibility("default"))); + +#undef g_utf8_find_prev_char +extern __typeof (g_utf8_find_prev_char) g_utf8_find_prev_char __attribute((alias("IA__g_utf8_find_prev_char"), visibility("default"))); + +#undef g_utf8_get_char +extern __typeof (g_utf8_get_char) g_utf8_get_char __attribute((alias("IA__g_utf8_get_char"), visibility("default"))); + +#undef g_utf8_get_char_validated +extern __typeof (g_utf8_get_char_validated) g_utf8_get_char_validated __attribute((alias("IA__g_utf8_get_char_validated"), visibility("default"))); + +#undef g_utf8_offset_to_pointer +extern __typeof (g_utf8_offset_to_pointer) g_utf8_offset_to_pointer __attribute((alias("IA__g_utf8_offset_to_pointer"), visibility("default"))); + +#undef g_utf8_pointer_to_offset +extern __typeof (g_utf8_pointer_to_offset) g_utf8_pointer_to_offset __attribute((alias("IA__g_utf8_pointer_to_offset"), visibility("default"))); + +#undef g_utf8_prev_char +extern __typeof (g_utf8_prev_char) g_utf8_prev_char __attribute((alias("IA__g_utf8_prev_char"), visibility("default"))); + +#undef g_utf8_strchr +extern __typeof (g_utf8_strchr) g_utf8_strchr __attribute((alias("IA__g_utf8_strchr"), visibility("default"))); + +#undef g_utf8_strlen +extern __typeof (g_utf8_strlen) g_utf8_strlen __attribute((alias("IA__g_utf8_strlen"), visibility("default"))); + +#undef g_utf8_strncpy +extern __typeof (g_utf8_strncpy) g_utf8_strncpy __attribute((alias("IA__g_utf8_strncpy"), visibility("default"))); + +#undef g_utf8_strrchr +extern __typeof (g_utf8_strrchr) g_utf8_strrchr __attribute((alias("IA__g_utf8_strrchr"), visibility("default"))); + +#undef g_utf8_strreverse +extern __typeof (g_utf8_strreverse) g_utf8_strreverse __attribute((alias("IA__g_utf8_strreverse"), visibility("default"))); + +#undef g_utf8_to_ucs4 +extern __typeof (g_utf8_to_ucs4) g_utf8_to_ucs4 __attribute((alias("IA__g_utf8_to_ucs4"), visibility("default"))); + +#undef g_utf8_to_ucs4_fast +extern __typeof (g_utf8_to_ucs4_fast) g_utf8_to_ucs4_fast __attribute((alias("IA__g_utf8_to_ucs4_fast"), visibility("default"))); + +#undef g_utf8_to_utf16 +extern __typeof (g_utf8_to_utf16) g_utf8_to_utf16 __attribute((alias("IA__g_utf8_to_utf16"), visibility("default"))); + +#undef g_utf8_validate +extern __typeof (g_utf8_validate) g_utf8_validate __attribute((alias("IA__g_utf8_validate"), visibility("default"))); + +#undef g_unichar_to_utf8 +extern __typeof (g_unichar_to_utf8) g_unichar_to_utf8 __attribute((alias("IA__g_unichar_to_utf8"), visibility("default"))); + +#undef g_unichar_validate +extern __typeof (g_unichar_validate) g_unichar_validate __attribute((alias("IA__g_unichar_validate"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__GLIBINTL_H__) +#if IN_FILE(__G_UTILS_C__) +#undef glib_gettext +extern __typeof (glib_gettext) glib_gettext __attribute((alias("IA__glib_gettext"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_HASH_H__) +#if IN_FILE(__G_UTILS_C__) +#undef g_int_equal +extern __typeof (g_int_equal) g_int_equal __attribute((alias("IA__g_int_equal"), visibility("default"))); + +#undef g_int_hash +extern __typeof (g_int_hash) g_int_hash __attribute((alias("IA__g_int_hash"), visibility("default"))); + +#undef g_int64_equal +extern __typeof (g_int64_equal) g_int64_equal __attribute((alias("IA__g_int64_equal"), visibility("default"))); + +#undef g_int64_hash +extern __typeof (g_int64_hash) g_int64_hash __attribute((alias("IA__g_int64_hash"), visibility("default"))); + +#undef g_double_equal +extern __typeof (g_double_equal) g_double_equal __attribute((alias("IA__g_double_equal"), visibility("default"))); + +#undef g_double_hash +extern __typeof (g_double_hash) g_double_hash __attribute((alias("IA__g_double_hash"), visibility("default"))); + +#undef g_direct_equal +extern __typeof (g_direct_equal) g_direct_equal __attribute((alias("IA__g_direct_equal"), visibility("default"))); + +#undef g_direct_hash +extern __typeof (g_direct_hash) g_direct_hash __attribute((alias("IA__g_direct_hash"), visibility("default"))); + +#endif +#if IN_FILE(__G_STRING_C__) +#undef g_str_equal +extern __typeof (g_str_equal) g_str_equal __attribute((alias("IA__g_str_equal"), visibility("default"))); + +#undef g_str_hash +extern __typeof (g_str_hash) g_str_hash __attribute((alias("IA__g_str_hash"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_UTILS_H__) +#if IN_FILE(__G_UTILS_C__) +#undef g_atexit +extern __typeof (g_atexit) g_atexit __attribute((alias("IA__g_atexit"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_basename +extern __typeof (g_basename) g_basename __attribute((alias("IA__g_basename"), visibility("default"))); + +#endif +#undef g_get_application_name +extern __typeof (g_get_application_name) g_get_application_name __attribute((alias("IA__g_get_application_name"), visibility("default"))); + +#ifndef _WIN64 +#undef g_find_program_in_path +extern __typeof (g_find_program_in_path) g_find_program_in_path __attribute((alias("IA__g_find_program_in_path"), visibility("default"))); + +#undef g_get_current_dir +extern __typeof (g_get_current_dir) g_get_current_dir __attribute((alias("IA__g_get_current_dir"), visibility("default"))); + +#undef g_getenv +extern __typeof (g_getenv) g_getenv __attribute((alias("IA__g_getenv"), visibility("default"))); + +#undef g_unsetenv +extern __typeof (g_unsetenv) g_unsetenv __attribute((alias("IA__g_unsetenv"), visibility("default"))); + +#undef g_get_home_dir +extern __typeof (g_get_home_dir) g_get_home_dir __attribute((alias("IA__g_get_home_dir"), visibility("default"))); + +#endif +#undef g_get_host_name +extern __typeof (g_get_host_name) g_get_host_name __attribute((alias("IA__g_get_host_name"), visibility("default"))); + +#ifndef _WIN64 +#undef g_setenv +extern __typeof (g_setenv) g_setenv __attribute((alias("IA__g_setenv"), visibility("default"))); + +#endif +#undef g_listenv +extern __typeof (g_listenv) g_listenv __attribute((alias("IA__g_listenv"), visibility("default"))); + +#ifdef G_OS_WIN32 +#undef g_find_program_in_path_utf8 +extern __typeof (g_find_program_in_path_utf8) g_find_program_in_path_utf8 __attribute((alias("IA__g_find_program_in_path_utf8"), visibility("default"))); + +#undef g_get_current_dir_utf8 +extern __typeof (g_get_current_dir_utf8) g_get_current_dir_utf8 __attribute((alias("IA__g_get_current_dir_utf8"), visibility("default"))); + +#undef g_getenv_utf8 +extern __typeof (g_getenv_utf8) g_getenv_utf8 __attribute((alias("IA__g_getenv_utf8"), visibility("default"))); + +#undef g_unsetenv_utf8 +extern __typeof (g_unsetenv_utf8) g_unsetenv_utf8 __attribute((alias("IA__g_unsetenv_utf8"), visibility("default"))); + +#undef g_setenv_utf8 +extern __typeof (g_setenv_utf8) g_setenv_utf8 __attribute((alias("IA__g_setenv_utf8"), visibility("default"))); + +#undef g_get_home_dir_utf8 +extern __typeof (g_get_home_dir_utf8) g_get_home_dir_utf8 __attribute((alias("IA__g_get_home_dir_utf8"), visibility("default"))); + +#endif +#undef g_get_language_names +extern __typeof (g_get_language_names) g_get_language_names __attribute((alias("IA__g_get_language_names"), visibility("default"))); + +#undef g_get_prgname +extern __typeof (g_get_prgname) g_get_prgname __attribute((alias("IA__g_get_prgname"), visibility("default"))); + +#ifndef _WIN64 +#undef g_get_real_name +extern __typeof (g_get_real_name) g_get_real_name __attribute((alias("IA__g_get_real_name"), visibility("default"))); + +#endif +#ifdef G_OS_WIN32 +#undef g_get_real_name_utf8 +extern __typeof (g_get_real_name_utf8) g_get_real_name_utf8 __attribute((alias("IA__g_get_real_name_utf8"), visibility("default"))); + +#endif +#undef g_get_system_config_dirs +extern __typeof (g_get_system_config_dirs) g_get_system_config_dirs __attribute((alias("IA__g_get_system_config_dirs"), visibility("default"))); + +#undef g_get_system_data_dirs +extern __typeof (g_get_system_data_dirs) g_get_system_data_dirs __attribute((alias("IA__g_get_system_data_dirs"), visibility("default"))); + +#ifdef G_OS_WIN32 +#undef g_win32_get_system_data_dirs_for_module +extern __typeof (g_win32_get_system_data_dirs_for_module) g_win32_get_system_data_dirs_for_module __attribute((alias("IA__g_win32_get_system_data_dirs_for_module"), visibility("default"))); + +#endif +#ifndef _WIN64 +#undef g_get_tmp_dir +extern __typeof (g_get_tmp_dir) g_get_tmp_dir __attribute((alias("IA__g_get_tmp_dir"), visibility("default"))); + +#endif +#ifdef G_OS_WIN32 +#undef g_get_tmp_dir_utf8 +extern __typeof (g_get_tmp_dir_utf8) g_get_tmp_dir_utf8 __attribute((alias("IA__g_get_tmp_dir_utf8"), visibility("default"))); + +#endif +#undef g_get_user_cache_dir +extern __typeof (g_get_user_cache_dir) g_get_user_cache_dir __attribute((alias("IA__g_get_user_cache_dir"), visibility("default"))); + +#undef g_get_user_config_dir +extern __typeof (g_get_user_config_dir) g_get_user_config_dir __attribute((alias("IA__g_get_user_config_dir"), visibility("default"))); + +#undef g_get_user_data_dir +extern __typeof (g_get_user_data_dir) g_get_user_data_dir __attribute((alias("IA__g_get_user_data_dir"), visibility("default"))); + +#undef g_reload_user_special_dirs_cache +extern __typeof (g_reload_user_special_dirs_cache) g_reload_user_special_dirs_cache __attribute((alias("IA__g_reload_user_special_dirs_cache"), visibility("default"))); + +#undef g_get_user_special_dir +extern __typeof (g_get_user_special_dir) g_get_user_special_dir __attribute((alias("IA__g_get_user_special_dir"), visibility("default"))); + +#ifndef _WIN64 +#undef g_get_user_name +extern __typeof (g_get_user_name) g_get_user_name __attribute((alias("IA__g_get_user_name"), visibility("default"))); + +#endif +#ifdef G_OS_WIN32 +#undef g_get_user_name_utf8 +extern __typeof (g_get_user_name_utf8) g_get_user_name_utf8 __attribute((alias("IA__g_get_user_name_utf8"), visibility("default"))); + +#endif +#undef glib_check_version +extern __typeof (glib_check_version) glib_check_version __attribute((alias("IA__glib_check_version"), visibility("default"))); + +#undef g_nullify_pointer +extern __typeof (g_nullify_pointer) g_nullify_pointer __attribute((alias("IA__g_nullify_pointer"), visibility("default"))); + +#undef g_parse_debug_string +extern __typeof (g_parse_debug_string) g_parse_debug_string __attribute((alias("IA__g_parse_debug_string"), visibility("default"))); + +#undef g_path_get_basename +extern __typeof (g_path_get_basename) g_path_get_basename __attribute((alias("IA__g_path_get_basename"), visibility("default"))); + +#undef g_path_get_dirname +extern __typeof (g_path_get_dirname) g_path_get_dirname __attribute((alias("IA__g_path_get_dirname"), visibility("default"))); + +#undef g_path_is_absolute +extern __typeof (g_path_is_absolute) g_path_is_absolute __attribute((alias("IA__g_path_is_absolute"), visibility("default"))); + +#undef g_path_skip_root +extern __typeof (g_path_skip_root) g_path_skip_root __attribute((alias("IA__g_path_skip_root"), visibility("default"))); + +#undef g_set_application_name +extern __typeof (g_set_application_name) g_set_application_name __attribute((alias("IA__g_set_application_name"), visibility("default"))); + +#undef g_set_prgname +extern __typeof (g_set_prgname) g_set_prgname __attribute((alias("IA__g_set_prgname"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_REGEX_H__) +#if IN_FILE(__G_REGEX_C__) +#undef g_regex_error_quark +extern __typeof (g_regex_error_quark) g_regex_error_quark __attribute((alias("IA__g_regex_error_quark"), visibility("default"))); + +#undef g_regex_new +extern __typeof (g_regex_new) g_regex_new __attribute((alias("IA__g_regex_new"), visibility("default"))); + +#undef g_regex_ref +extern __typeof (g_regex_ref) g_regex_ref __attribute((alias("IA__g_regex_ref"), visibility("default"))); + +#undef g_regex_unref +extern __typeof (g_regex_unref) g_regex_unref __attribute((alias("IA__g_regex_unref"), visibility("default"))); + +#undef g_regex_get_pattern +extern __typeof (g_regex_get_pattern) g_regex_get_pattern __attribute((alias("IA__g_regex_get_pattern"), visibility("default"))); + +#undef g_regex_get_max_backref +extern __typeof (g_regex_get_max_backref) g_regex_get_max_backref __attribute((alias("IA__g_regex_get_max_backref"), visibility("default"))); + +#undef g_regex_get_capture_count +extern __typeof (g_regex_get_capture_count) g_regex_get_capture_count __attribute((alias("IA__g_regex_get_capture_count"), visibility("default"))); + +#undef g_regex_get_string_number +extern __typeof (g_regex_get_string_number) g_regex_get_string_number __attribute((alias("IA__g_regex_get_string_number"), visibility("default"))); + +#undef g_regex_escape_string +extern __typeof (g_regex_escape_string) g_regex_escape_string __attribute((alias("IA__g_regex_escape_string"), visibility("default"))); + +#undef g_regex_match_simple +extern __typeof (g_regex_match_simple) g_regex_match_simple __attribute((alias("IA__g_regex_match_simple"), visibility("default"))); + +#undef g_regex_match +extern __typeof (g_regex_match) g_regex_match __attribute((alias("IA__g_regex_match"), visibility("default"))); + +#undef g_regex_match_full +extern __typeof (g_regex_match_full) g_regex_match_full __attribute((alias("IA__g_regex_match_full"), visibility("default"))); + +#undef g_regex_match_all +extern __typeof (g_regex_match_all) g_regex_match_all __attribute((alias("IA__g_regex_match_all"), visibility("default"))); + +#undef g_regex_match_all_full +extern __typeof (g_regex_match_all_full) g_regex_match_all_full __attribute((alias("IA__g_regex_match_all_full"), visibility("default"))); + +#undef g_regex_split_simple +extern __typeof (g_regex_split_simple) g_regex_split_simple __attribute((alias("IA__g_regex_split_simple"), visibility("default"))); + +#undef g_regex_split +extern __typeof (g_regex_split) g_regex_split __attribute((alias("IA__g_regex_split"), visibility("default"))); + +#undef g_regex_split_full +extern __typeof (g_regex_split_full) g_regex_split_full __attribute((alias("IA__g_regex_split_full"), visibility("default"))); + +#undef g_regex_replace +extern __typeof (g_regex_replace) g_regex_replace __attribute((alias("IA__g_regex_replace"), visibility("default"))); + +#undef g_regex_replace_literal +extern __typeof (g_regex_replace_literal) g_regex_replace_literal __attribute((alias("IA__g_regex_replace_literal"), visibility("default"))); + +#undef g_regex_replace_eval +extern __typeof (g_regex_replace_eval) g_regex_replace_eval __attribute((alias("IA__g_regex_replace_eval"), visibility("default"))); + +#undef g_regex_check_replacement +extern __typeof (g_regex_check_replacement) g_regex_check_replacement __attribute((alias("IA__g_regex_check_replacement"), visibility("default"))); + +#undef g_match_info_get_regex +extern __typeof (g_match_info_get_regex) g_match_info_get_regex __attribute((alias("IA__g_match_info_get_regex"), visibility("default"))); + +#undef g_match_info_get_string +extern __typeof (g_match_info_get_string) g_match_info_get_string __attribute((alias("IA__g_match_info_get_string"), visibility("default"))); + +#undef g_match_info_free +extern __typeof (g_match_info_free) g_match_info_free __attribute((alias("IA__g_match_info_free"), visibility("default"))); + +#undef g_match_info_next +extern __typeof (g_match_info_next) g_match_info_next __attribute((alias("IA__g_match_info_next"), visibility("default"))); + +#undef g_match_info_matches +extern __typeof (g_match_info_matches) g_match_info_matches __attribute((alias("IA__g_match_info_matches"), visibility("default"))); + +#undef g_match_info_get_match_count +extern __typeof (g_match_info_get_match_count) g_match_info_get_match_count __attribute((alias("IA__g_match_info_get_match_count"), visibility("default"))); + +#undef g_match_info_is_partial_match +extern __typeof (g_match_info_is_partial_match) g_match_info_is_partial_match __attribute((alias("IA__g_match_info_is_partial_match"), visibility("default"))); + +#undef g_match_info_expand_references +extern __typeof (g_match_info_expand_references) g_match_info_expand_references __attribute((alias("IA__g_match_info_expand_references"), visibility("default"))); + +#undef g_match_info_fetch +extern __typeof (g_match_info_fetch) g_match_info_fetch __attribute((alias("IA__g_match_info_fetch"), visibility("default"))); + +#undef g_match_info_fetch_pos +extern __typeof (g_match_info_fetch_pos) g_match_info_fetch_pos __attribute((alias("IA__g_match_info_fetch_pos"), visibility("default"))); + +#undef g_match_info_fetch_named +extern __typeof (g_match_info_fetch_named) g_match_info_fetch_named __attribute((alias("IA__g_match_info_fetch_named"), visibility("default"))); + +#undef g_match_info_fetch_named_pos +extern __typeof (g_match_info_fetch_named_pos) g_match_info_fetch_named_pos __attribute((alias("IA__g_match_info_fetch_named_pos"), visibility("default"))); + +#undef g_match_info_fetch_all +extern __typeof (g_match_info_fetch_all) g_match_info_fetch_all __attribute((alias("IA__g_match_info_fetch_all"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VARIANT_TYPE_H__) +#if IN_FILE(__G_VARIANT_TYPE_C__) +#undef g_variant_type_string_is_valid +extern __typeof (g_variant_type_string_is_valid) g_variant_type_string_is_valid __attribute((alias("IA__g_variant_type_string_is_valid"), visibility("default"))); + +#undef g_variant_type_string_scan +extern __typeof (g_variant_type_string_scan) g_variant_type_string_scan __attribute((alias("IA__g_variant_type_string_scan"), visibility("default"))); + +#undef g_variant_type_free +extern __typeof (g_variant_type_free) g_variant_type_free __attribute((alias("IA__g_variant_type_free"), visibility("default"))); + +#undef g_variant_type_copy +extern __typeof (g_variant_type_copy) g_variant_type_copy __attribute((alias("IA__g_variant_type_copy"), visibility("default"))); + +#undef g_variant_type_new +extern __typeof (g_variant_type_new) g_variant_type_new __attribute((alias("IA__g_variant_type_new"), visibility("default"))); + +#undef g_variant_type_get_string_length +extern __typeof (g_variant_type_get_string_length) g_variant_type_get_string_length __attribute((alias("IA__g_variant_type_get_string_length"), visibility("default"))); + +#undef g_variant_type_peek_string +extern __typeof (g_variant_type_peek_string) g_variant_type_peek_string __attribute((alias("IA__g_variant_type_peek_string"), visibility("default"))); + +#undef g_variant_type_dup_string +extern __typeof (g_variant_type_dup_string) g_variant_type_dup_string __attribute((alias("IA__g_variant_type_dup_string"), visibility("default"))); + +#undef g_variant_type_is_definite +extern __typeof (g_variant_type_is_definite) g_variant_type_is_definite __attribute((alias("IA__g_variant_type_is_definite"), visibility("default"))); + +#undef g_variant_type_is_container +extern __typeof (g_variant_type_is_container) g_variant_type_is_container __attribute((alias("IA__g_variant_type_is_container"), visibility("default"))); + +#undef g_variant_type_is_basic +extern __typeof (g_variant_type_is_basic) g_variant_type_is_basic __attribute((alias("IA__g_variant_type_is_basic"), visibility("default"))); + +#undef g_variant_type_is_maybe +extern __typeof (g_variant_type_is_maybe) g_variant_type_is_maybe __attribute((alias("IA__g_variant_type_is_maybe"), visibility("default"))); + +#undef g_variant_type_is_array +extern __typeof (g_variant_type_is_array) g_variant_type_is_array __attribute((alias("IA__g_variant_type_is_array"), visibility("default"))); + +#undef g_variant_type_is_tuple +extern __typeof (g_variant_type_is_tuple) g_variant_type_is_tuple __attribute((alias("IA__g_variant_type_is_tuple"), visibility("default"))); + +#undef g_variant_type_is_dict_entry +extern __typeof (g_variant_type_is_dict_entry) g_variant_type_is_dict_entry __attribute((alias("IA__g_variant_type_is_dict_entry"), visibility("default"))); + +#undef g_variant_type_is_variant +extern __typeof (g_variant_type_is_variant) g_variant_type_is_variant __attribute((alias("IA__g_variant_type_is_variant"), visibility("default"))); + +#undef g_variant_type_hash +extern __typeof (g_variant_type_hash) g_variant_type_hash __attribute((alias("IA__g_variant_type_hash"), visibility("default"))); + +#undef g_variant_type_equal +extern __typeof (g_variant_type_equal) g_variant_type_equal __attribute((alias("IA__g_variant_type_equal"), visibility("default"))); + +#undef g_variant_type_is_subtype_of +extern __typeof (g_variant_type_is_subtype_of) g_variant_type_is_subtype_of __attribute((alias("IA__g_variant_type_is_subtype_of"), visibility("default"))); + +#undef g_variant_type_element +extern __typeof (g_variant_type_element) g_variant_type_element __attribute((alias("IA__g_variant_type_element"), visibility("default"))); + +#undef g_variant_type_first +extern __typeof (g_variant_type_first) g_variant_type_first __attribute((alias("IA__g_variant_type_first"), visibility("default"))); + +#undef g_variant_type_next +extern __typeof (g_variant_type_next) g_variant_type_next __attribute((alias("IA__g_variant_type_next"), visibility("default"))); + +#undef g_variant_type_n_items +extern __typeof (g_variant_type_n_items) g_variant_type_n_items __attribute((alias("IA__g_variant_type_n_items"), visibility("default"))); + +#undef g_variant_type_key +extern __typeof (g_variant_type_key) g_variant_type_key __attribute((alias("IA__g_variant_type_key"), visibility("default"))); + +#undef g_variant_type_value +extern __typeof (g_variant_type_value) g_variant_type_value __attribute((alias("IA__g_variant_type_value"), visibility("default"))); + +#undef g_variant_type_new_array +extern __typeof (g_variant_type_new_array) g_variant_type_new_array __attribute((alias("IA__g_variant_type_new_array"), visibility("default"))); + +#undef g_variant_type_new_maybe +extern __typeof (g_variant_type_new_maybe) g_variant_type_new_maybe __attribute((alias("IA__g_variant_type_new_maybe"), visibility("default"))); + +#undef g_variant_type_new_tuple +extern __typeof (g_variant_type_new_tuple) g_variant_type_new_tuple __attribute((alias("IA__g_variant_type_new_tuple"), visibility("default"))); + +#undef g_variant_type_new_dict_entry +extern __typeof (g_variant_type_new_dict_entry) g_variant_type_new_dict_entry __attribute((alias("IA__g_variant_type_new_dict_entry"), visibility("default"))); + +#undef g_variant_type_checked_ +extern __typeof (g_variant_type_checked_) g_variant_type_checked_ __attribute((alias("IA__g_variant_type_checked_"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VARIANT_H__) +#if IN_FILE(__G_VARIANT_CORE_C__) +#undef g_variant_unref +extern __typeof (g_variant_unref) g_variant_unref __attribute((alias("IA__g_variant_unref"), visibility("default"))); + +#undef g_variant_ref +extern __typeof (g_variant_ref) g_variant_ref __attribute((alias("IA__g_variant_ref"), visibility("default"))); + +#undef g_variant_ref_sink +extern __typeof (g_variant_ref_sink) g_variant_ref_sink __attribute((alias("IA__g_variant_ref_sink"), visibility("default"))); + +#undef g_variant_n_children +extern __typeof (g_variant_n_children) g_variant_n_children __attribute((alias("IA__g_variant_n_children"), visibility("default"))); + +#undef g_variant_get_child_value +extern __typeof (g_variant_get_child_value) g_variant_get_child_value __attribute((alias("IA__g_variant_get_child_value"), visibility("default"))); + +#undef g_variant_get_size +extern __typeof (g_variant_get_size) g_variant_get_size __attribute((alias("IA__g_variant_get_size"), visibility("default"))); + +#undef g_variant_get_data +extern __typeof (g_variant_get_data) g_variant_get_data __attribute((alias("IA__g_variant_get_data"), visibility("default"))); + +#undef g_variant_store +extern __typeof (g_variant_store) g_variant_store __attribute((alias("IA__g_variant_store"), visibility("default"))); + +#undef g_variant_is_normal_form +extern __typeof (g_variant_is_normal_form) g_variant_is_normal_form __attribute((alias("IA__g_variant_is_normal_form"), visibility("default"))); + +#endif +#if IN_FILE(__G_VARIANT_C__) +#undef g_variant_get_type +extern __typeof (g_variant_get_type) g_variant_get_type __attribute((alias("IA__g_variant_get_type"), visibility("default"))); + +#undef g_variant_get_type_string +extern __typeof (g_variant_get_type_string) g_variant_get_type_string __attribute((alias("IA__g_variant_get_type_string"), visibility("default"))); + +#undef g_variant_is_of_type +extern __typeof (g_variant_is_of_type) g_variant_is_of_type __attribute((alias("IA__g_variant_is_of_type"), visibility("default"))); + +#undef g_variant_is_container +extern __typeof (g_variant_is_container) g_variant_is_container __attribute((alias("IA__g_variant_is_container"), visibility("default"))); + +#undef g_variant_classify +extern __typeof (g_variant_classify) g_variant_classify __attribute((alias("IA__g_variant_classify"), visibility("default"))); + +#undef g_variant_new_boolean +extern __typeof (g_variant_new_boolean) g_variant_new_boolean __attribute((alias("IA__g_variant_new_boolean"), visibility("default"))); + +#undef g_variant_new_byte +extern __typeof (g_variant_new_byte) g_variant_new_byte __attribute((alias("IA__g_variant_new_byte"), visibility("default"))); + +#undef g_variant_new_int16 +extern __typeof (g_variant_new_int16) g_variant_new_int16 __attribute((alias("IA__g_variant_new_int16"), visibility("default"))); + +#undef g_variant_new_uint16 +extern __typeof (g_variant_new_uint16) g_variant_new_uint16 __attribute((alias("IA__g_variant_new_uint16"), visibility("default"))); + +#undef g_variant_new_int32 +extern __typeof (g_variant_new_int32) g_variant_new_int32 __attribute((alias("IA__g_variant_new_int32"), visibility("default"))); + +#undef g_variant_new_uint32 +extern __typeof (g_variant_new_uint32) g_variant_new_uint32 __attribute((alias("IA__g_variant_new_uint32"), visibility("default"))); + +#undef g_variant_new_int64 +extern __typeof (g_variant_new_int64) g_variant_new_int64 __attribute((alias("IA__g_variant_new_int64"), visibility("default"))); + +#undef g_variant_new_uint64 +extern __typeof (g_variant_new_uint64) g_variant_new_uint64 __attribute((alias("IA__g_variant_new_uint64"), visibility("default"))); + +#undef g_variant_new_handle +extern __typeof (g_variant_new_handle) g_variant_new_handle __attribute((alias("IA__g_variant_new_handle"), visibility("default"))); + +#undef g_variant_new_double +extern __typeof (g_variant_new_double) g_variant_new_double __attribute((alias("IA__g_variant_new_double"), visibility("default"))); + +#undef g_variant_new_string +extern __typeof (g_variant_new_string) g_variant_new_string __attribute((alias("IA__g_variant_new_string"), visibility("default"))); + +#undef g_variant_new_object_path +extern __typeof (g_variant_new_object_path) g_variant_new_object_path __attribute((alias("IA__g_variant_new_object_path"), visibility("default"))); + +#undef g_variant_is_object_path +extern __typeof (g_variant_is_object_path) g_variant_is_object_path __attribute((alias("IA__g_variant_is_object_path"), visibility("default"))); + +#undef g_variant_new_signature +extern __typeof (g_variant_new_signature) g_variant_new_signature __attribute((alias("IA__g_variant_new_signature"), visibility("default"))); + +#undef g_variant_is_signature +extern __typeof (g_variant_is_signature) g_variant_is_signature __attribute((alias("IA__g_variant_is_signature"), visibility("default"))); + +#undef g_variant_new_variant +extern __typeof (g_variant_new_variant) g_variant_new_variant __attribute((alias("IA__g_variant_new_variant"), visibility("default"))); + +#undef g_variant_new_strv +extern __typeof (g_variant_new_strv) g_variant_new_strv __attribute((alias("IA__g_variant_new_strv"), visibility("default"))); + +#undef g_variant_get_boolean +extern __typeof (g_variant_get_boolean) g_variant_get_boolean __attribute((alias("IA__g_variant_get_boolean"), visibility("default"))); + +#undef g_variant_get_byte +extern __typeof (g_variant_get_byte) g_variant_get_byte __attribute((alias("IA__g_variant_get_byte"), visibility("default"))); + +#undef g_variant_get_int16 +extern __typeof (g_variant_get_int16) g_variant_get_int16 __attribute((alias("IA__g_variant_get_int16"), visibility("default"))); + +#undef g_variant_get_uint16 +extern __typeof (g_variant_get_uint16) g_variant_get_uint16 __attribute((alias("IA__g_variant_get_uint16"), visibility("default"))); + +#undef g_variant_get_int32 +extern __typeof (g_variant_get_int32) g_variant_get_int32 __attribute((alias("IA__g_variant_get_int32"), visibility("default"))); + +#undef g_variant_get_uint32 +extern __typeof (g_variant_get_uint32) g_variant_get_uint32 __attribute((alias("IA__g_variant_get_uint32"), visibility("default"))); + +#undef g_variant_get_int64 +extern __typeof (g_variant_get_int64) g_variant_get_int64 __attribute((alias("IA__g_variant_get_int64"), visibility("default"))); + +#undef g_variant_get_uint64 +extern __typeof (g_variant_get_uint64) g_variant_get_uint64 __attribute((alias("IA__g_variant_get_uint64"), visibility("default"))); + +#undef g_variant_get_handle +extern __typeof (g_variant_get_handle) g_variant_get_handle __attribute((alias("IA__g_variant_get_handle"), visibility("default"))); + +#undef g_variant_get_double +extern __typeof (g_variant_get_double) g_variant_get_double __attribute((alias("IA__g_variant_get_double"), visibility("default"))); + +#undef g_variant_get_string +extern __typeof (g_variant_get_string) g_variant_get_string __attribute((alias("IA__g_variant_get_string"), visibility("default"))); + +#undef g_variant_dup_string +extern __typeof (g_variant_dup_string) g_variant_dup_string __attribute((alias("IA__g_variant_dup_string"), visibility("default"))); + +#undef g_variant_get_variant +extern __typeof (g_variant_get_variant) g_variant_get_variant __attribute((alias("IA__g_variant_get_variant"), visibility("default"))); + +#undef g_variant_get_strv +extern __typeof (g_variant_get_strv) g_variant_get_strv __attribute((alias("IA__g_variant_get_strv"), visibility("default"))); + +#undef g_variant_dup_strv +extern __typeof (g_variant_dup_strv) g_variant_dup_strv __attribute((alias("IA__g_variant_dup_strv"), visibility("default"))); + +#undef g_variant_new_maybe +extern __typeof (g_variant_new_maybe) g_variant_new_maybe __attribute((alias("IA__g_variant_new_maybe"), visibility("default"))); + +#undef g_variant_new_array +extern __typeof (g_variant_new_array) g_variant_new_array __attribute((alias("IA__g_variant_new_array"), visibility("default"))); + +#undef g_variant_new_tuple +extern __typeof (g_variant_new_tuple) g_variant_new_tuple __attribute((alias("IA__g_variant_new_tuple"), visibility("default"))); + +#undef g_variant_new_dict_entry +extern __typeof (g_variant_new_dict_entry) g_variant_new_dict_entry __attribute((alias("IA__g_variant_new_dict_entry"), visibility("default"))); + +#undef g_variant_get_maybe +extern __typeof (g_variant_get_maybe) g_variant_get_maybe __attribute((alias("IA__g_variant_get_maybe"), visibility("default"))); + +#undef g_variant_get_fixed_array +extern __typeof (g_variant_get_fixed_array) g_variant_get_fixed_array __attribute((alias("IA__g_variant_get_fixed_array"), visibility("default"))); + +#undef g_variant_print +extern __typeof (g_variant_print) g_variant_print __attribute((alias("IA__g_variant_print"), visibility("default"))); + +#undef g_variant_print_string +extern __typeof (g_variant_print_string) g_variant_print_string __attribute((alias("IA__g_variant_print_string"), visibility("default"))); + +#undef g_variant_hash +extern __typeof (g_variant_hash) g_variant_hash __attribute((alias("IA__g_variant_hash"), visibility("default"))); + +#undef g_variant_equal +extern __typeof (g_variant_equal) g_variant_equal __attribute((alias("IA__g_variant_equal"), visibility("default"))); + +#undef g_variant_iter_copy +extern __typeof (g_variant_iter_copy) g_variant_iter_copy __attribute((alias("IA__g_variant_iter_copy"), visibility("default"))); + +#undef g_variant_iter_free +extern __typeof (g_variant_iter_free) g_variant_iter_free __attribute((alias("IA__g_variant_iter_free"), visibility("default"))); + +#undef g_variant_iter_init +extern __typeof (g_variant_iter_init) g_variant_iter_init __attribute((alias("IA__g_variant_iter_init"), visibility("default"))); + +#undef g_variant_iter_n_children +extern __typeof (g_variant_iter_n_children) g_variant_iter_n_children __attribute((alias("IA__g_variant_iter_n_children"), visibility("default"))); + +#undef g_variant_iter_new +extern __typeof (g_variant_iter_new) g_variant_iter_new __attribute((alias("IA__g_variant_iter_new"), visibility("default"))); + +#undef g_variant_iter_next_value +extern __typeof (g_variant_iter_next_value) g_variant_iter_next_value __attribute((alias("IA__g_variant_iter_next_value"), visibility("default"))); + +#undef g_variant_builder_add_value +extern __typeof (g_variant_builder_add_value) g_variant_builder_add_value __attribute((alias("IA__g_variant_builder_add_value"), visibility("default"))); + +#undef g_variant_builder_init +extern __typeof (g_variant_builder_init) g_variant_builder_init __attribute((alias("IA__g_variant_builder_init"), visibility("default"))); + +#undef g_variant_builder_clear +extern __typeof (g_variant_builder_clear) g_variant_builder_clear __attribute((alias("IA__g_variant_builder_clear"), visibility("default"))); + +#undef g_variant_builder_open +extern __typeof (g_variant_builder_open) g_variant_builder_open __attribute((alias("IA__g_variant_builder_open"), visibility("default"))); + +#undef g_variant_builder_close +extern __typeof (g_variant_builder_close) g_variant_builder_close __attribute((alias("IA__g_variant_builder_close"), visibility("default"))); + +#undef g_variant_builder_end +extern __typeof (g_variant_builder_end) g_variant_builder_end __attribute((alias("IA__g_variant_builder_end"), visibility("default"))); + +#undef g_variant_builder_new +extern __typeof (g_variant_builder_new) g_variant_builder_new __attribute((alias("IA__g_variant_builder_new"), visibility("default"))); + +#undef g_variant_builder_unref +extern __typeof (g_variant_builder_unref) g_variant_builder_unref __attribute((alias("IA__g_variant_builder_unref"), visibility("default"))); + +#undef g_variant_builder_ref +extern __typeof (g_variant_builder_ref) g_variant_builder_ref __attribute((alias("IA__g_variant_builder_ref"), visibility("default"))); + +#undef g_variant_new_va +extern __typeof (g_variant_new_va) g_variant_new_va __attribute((alias("IA__g_variant_new_va"), visibility("default"))); + +#undef g_variant_get_va +extern __typeof (g_variant_get_va) g_variant_get_va __attribute((alias("IA__g_variant_get_va"), visibility("default"))); + +#undef g_variant_new +extern __typeof (g_variant_new) g_variant_new __attribute((alias("IA__g_variant_new"), visibility("default"))); + +#undef g_variant_get +extern __typeof (g_variant_get) g_variant_get __attribute((alias("IA__g_variant_get"), visibility("default"))); + +#undef g_variant_builder_add +extern __typeof (g_variant_builder_add) g_variant_builder_add __attribute((alias("IA__g_variant_builder_add"), visibility("default"))); + +#undef g_variant_get_child +extern __typeof (g_variant_get_child) g_variant_get_child __attribute((alias("IA__g_variant_get_child"), visibility("default"))); + +#undef g_variant_iter_next +extern __typeof (g_variant_iter_next) g_variant_iter_next __attribute((alias("IA__g_variant_iter_next"), visibility("default"))); + +#undef g_variant_iter_loop +extern __typeof (g_variant_iter_loop) g_variant_iter_loop __attribute((alias("IA__g_variant_iter_loop"), visibility("default"))); + +#undef g_variant_new_from_data +extern __typeof (g_variant_new_from_data) g_variant_new_from_data __attribute((alias("IA__g_variant_new_from_data"), visibility("default"))); + +#undef g_variant_get_normal_form +extern __typeof (g_variant_get_normal_form) g_variant_get_normal_form __attribute((alias("IA__g_variant_get_normal_form"), visibility("default"))); + +#undef g_variant_byteswap +extern __typeof (g_variant_byteswap) g_variant_byteswap __attribute((alias("IA__g_variant_byteswap"), visibility("default"))); + +#endif +#if IN_FILE(__G_VARIANT_PARSER_C__) +#undef g_variant_new_parsed +extern __typeof (g_variant_new_parsed) g_variant_new_parsed __attribute((alias("IA__g_variant_new_parsed"), visibility("default"))); + +#undef g_variant_new_parsed_va +extern __typeof (g_variant_new_parsed_va) g_variant_new_parsed_va __attribute((alias("IA__g_variant_new_parsed_va"), visibility("default"))); + +#undef g_variant_parse +extern __typeof (g_variant_parse) g_variant_parse __attribute((alias("IA__g_variant_parse"), visibility("default"))); + +#undef g_variant_parser_get_error_quark +extern __typeof (g_variant_parser_get_error_quark) g_variant_parser_get_error_quark __attribute((alias("IA__g_variant_parser_get_error_quark"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VARIANT_TYPE_INFO_H__) +#if IN_FILE(__G_VARIANT_TYPE_INFO_C__) +#undef g_variant_type_info_get_type_string +extern __typeof (g_variant_type_info_get_type_string) g_variant_type_info_get_type_string __attribute((alias("IA__g_variant_type_info_get_type_string"), visibility("default"))); + +#undef g_variant_type_info_query +extern __typeof (g_variant_type_info_query) g_variant_type_info_query __attribute((alias("IA__g_variant_type_info_query"), visibility("default"))); + +#undef g_variant_type_info_element +extern __typeof (g_variant_type_info_element) g_variant_type_info_element __attribute((alias("IA__g_variant_type_info_element"), visibility("default"))); + +#undef g_variant_type_info_query_element +extern __typeof (g_variant_type_info_query_element) g_variant_type_info_query_element __attribute((alias("IA__g_variant_type_info_query_element"), visibility("default"))); + +#undef g_variant_type_info_n_members +extern __typeof (g_variant_type_info_n_members) g_variant_type_info_n_members __attribute((alias("IA__g_variant_type_info_n_members"), visibility("default"))); + +#undef g_variant_type_info_member_info +extern __typeof (g_variant_type_info_member_info) g_variant_type_info_member_info __attribute((alias("IA__g_variant_type_info_member_info"), visibility("default"))); + +#undef g_variant_type_info_get +extern __typeof (g_variant_type_info_get) g_variant_type_info_get __attribute((alias("IA__g_variant_type_info_get"), visibility("default"))); + +#undef g_variant_type_info_ref +extern __typeof (g_variant_type_info_ref) g_variant_type_info_ref __attribute((alias("IA__g_variant_type_info_ref"), visibility("default"))); + +#undef g_variant_type_info_unref +extern __typeof (g_variant_type_info_unref) g_variant_type_info_unref __attribute((alias("IA__g_variant_type_info_unref"), visibility("default"))); + +#undef g_variant_type_info_assert_no_infos +extern __typeof (g_variant_type_info_assert_no_infos) g_variant_type_info_assert_no_infos __attribute((alias("IA__g_variant_type_info_assert_no_infos"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VARIANT_SERIALISER_H__) +#if IN_FILE(__G_VARIANT_SERIALISER_C__) +#undef g_variant_serialised_byteswap +extern __typeof (g_variant_serialised_byteswap) g_variant_serialised_byteswap __attribute((alias("IA__g_variant_serialised_byteswap"), visibility("default"))); + +#undef g_variant_serialised_get_child +extern __typeof (g_variant_serialised_get_child) g_variant_serialised_get_child __attribute((alias("IA__g_variant_serialised_get_child"), visibility("default"))); + +#undef g_variant_serialised_is_normal +extern __typeof (g_variant_serialised_is_normal) g_variant_serialised_is_normal __attribute((alias("IA__g_variant_serialised_is_normal"), visibility("default"))); + +#undef g_variant_serialised_n_children +extern __typeof (g_variant_serialised_n_children) g_variant_serialised_n_children __attribute((alias("IA__g_variant_serialised_n_children"), visibility("default"))); + +#undef g_variant_serialiser_is_object_path +extern __typeof (g_variant_serialiser_is_object_path) g_variant_serialiser_is_object_path __attribute((alias("IA__g_variant_serialiser_is_object_path"), visibility("default"))); + +#undef g_variant_serialiser_is_signature +extern __typeof (g_variant_serialiser_is_signature) g_variant_serialiser_is_signature __attribute((alias("IA__g_variant_serialiser_is_signature"), visibility("default"))); + +#undef g_variant_serialiser_is_string +extern __typeof (g_variant_serialiser_is_string) g_variant_serialiser_is_string __attribute((alias("IA__g_variant_serialiser_is_string"), visibility("default"))); + +#undef g_variant_serialiser_needed_size +extern __typeof (g_variant_serialiser_needed_size) g_variant_serialiser_needed_size __attribute((alias("IA__g_variant_serialiser_needed_size"), visibility("default"))); + +#undef g_variant_serialiser_serialise +extern __typeof (g_variant_serialiser_serialise) g_variant_serialiser_serialise __attribute((alias("IA__g_variant_serialiser_serialise"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VARIANT_INTERNAL_H__) +#if IN_FILE(__G_VARIANT_C__) +#undef g_variant_format_string_scan_type +extern __typeof (g_variant_format_string_scan_type) g_variant_format_string_scan_type __attribute((alias("IA__g_variant_format_string_scan_type"), visibility("default"))); + +#undef g_variant_format_string_scan +extern __typeof (g_variant_format_string_scan) g_variant_format_string_scan __attribute((alias("IA__g_variant_format_string_scan"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_WIN32_H__) +#if IN_FILE(__G_WIN32_H__) +#ifdef G_OS_WIN32 +#undef g_win32_error_message +extern __typeof (g_win32_error_message) g_win32_error_message __attribute((alias("IA__g_win32_error_message"), visibility("default"))); + +#undef g_win32_ftruncate +extern __typeof (g_win32_ftruncate) g_win32_ftruncate __attribute((alias("IA__g_win32_ftruncate"), visibility("default"))); + +#undef g_win32_get_package_installation_directory_of_module +extern __typeof (g_win32_get_package_installation_directory_of_module) g_win32_get_package_installation_directory_of_module __attribute((alias("IA__g_win32_get_package_installation_directory_of_module"), visibility("default"))); + +#ifndef _WIN64 +#undef g_win32_get_package_installation_directory +extern __typeof (g_win32_get_package_installation_directory) g_win32_get_package_installation_directory __attribute((alias("IA__g_win32_get_package_installation_directory"), visibility("default"))); + +#endif +#undef g_win32_get_package_installation_directory_utf8 +extern __typeof (g_win32_get_package_installation_directory_utf8) g_win32_get_package_installation_directory_utf8 __attribute((alias("IA__g_win32_get_package_installation_directory_utf8"), visibility("default"))); + +#ifndef _WIN64 +#undef g_win32_get_package_installation_subdirectory +extern __typeof (g_win32_get_package_installation_subdirectory) g_win32_get_package_installation_subdirectory __attribute((alias("IA__g_win32_get_package_installation_subdirectory"), visibility("default"))); + +#endif +#undef g_win32_get_package_installation_subdirectory_utf8 +extern __typeof (g_win32_get_package_installation_subdirectory_utf8) g_win32_get_package_installation_subdirectory_utf8 __attribute((alias("IA__g_win32_get_package_installation_subdirectory_utf8"), visibility("default"))); + +#undef g_win32_get_windows_version +extern __typeof (g_win32_get_windows_version) g_win32_get_windows_version __attribute((alias("IA__g_win32_get_windows_version"), visibility("default"))); + +#undef g_win32_getlocale +extern __typeof (g_win32_getlocale) g_win32_getlocale __attribute((alias("IA__g_win32_getlocale"), visibility("default"))); + +#undef g_win32_locale_filename_from_utf8 +extern __typeof (g_win32_locale_filename_from_utf8) g_win32_locale_filename_from_utf8 __attribute((alias("IA__g_win32_locale_filename_from_utf8"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_HOST_UTILS_H__) +#if IN_FILE(__G_HOST_UTILS_C__) +#undef g_hostname_is_non_ascii +extern __typeof (g_hostname_is_non_ascii) g_hostname_is_non_ascii __attribute((alias("IA__g_hostname_is_non_ascii"), visibility("default"))); + +#undef g_hostname_is_ascii_encoded +extern __typeof (g_hostname_is_ascii_encoded) g_hostname_is_ascii_encoded __attribute((alias("IA__g_hostname_is_ascii_encoded"), visibility("default"))); + +#undef g_hostname_is_ip_address +extern __typeof (g_hostname_is_ip_address) g_hostname_is_ip_address __attribute((alias("IA__g_hostname_is_ip_address"), visibility("default"))); + +#undef g_hostname_to_ascii +extern __typeof (g_hostname_to_ascii) g_hostname_to_ascii __attribute((alias("IA__g_hostname_to_ascii"), visibility("default"))); + +#undef g_hostname_to_unicode +extern __typeof (g_hostname_to_unicode) g_hostname_to_unicode __attribute((alias("IA__g_hostname_to_unicode"), visibility("default"))); + +#endif +#endif + +#endif /* G_HAVE_GNUC_VISIBILITY */ +#endif /* DISABLE_VISIBILITY */ diff --git a/glib/galloca.h b/glib/galloca.h new file mode 100644 index 0000000..356587f --- /dev/null +++ b/glib/galloca.h @@ -0,0 +1,63 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ALLOCA_H__ +#define __G_ALLOCA_H__ + +#include + +#ifdef __GNUC__ +/* GCC does the right thing */ +# undef alloca +# define alloca(size) __builtin_alloca (size) +#elif defined (GLIB_HAVE_ALLOCA_H) +/* a native and working alloca.h is there */ +# include +#else /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */ +# if defined(_MSC_VER) || defined(__DMC__) +# include +# define alloca _alloca +# else /* !_MSC_VER && !__DMC__ */ +# ifdef _AIX +# pragma alloca +# else /* !_AIX */ +# ifndef alloca /* predefined by HP cc +Olibcalls */ +G_BEGIN_DECLS +char *alloca (); +G_END_DECLS +# endif /* !alloca */ +# endif /* !_AIX */ +# endif /* !_MSC_VER && !__DMC__ */ +#endif /* !__GNUC__ && !GLIB_HAVE_ALLOCA_H */ + +#define g_alloca(size) alloca (size) +#define g_newa(struct_type, n_structs) ((struct_type*) g_alloca (sizeof (struct_type) * (gsize) (n_structs))) + +#endif /* __G_ALLOCA_H__ */ diff --git a/glib/garray.c b/glib/garray.c new file mode 100644 index 0000000..a2bca94 --- /dev/null +++ b/glib/garray.c @@ -0,0 +1,1596 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include + +#include "garray.h" + +#include "gmem.h" +#include "gthread.h" +#include "gmessages.h" +#include "gqsort.h" + +#include "galias.h" + +/** + * SECTION: arrays + * @title: Arrays + * @short_description: arrays of arbitrary elements which grow + * automatically as elements are added + * + * Arrays are similar to standard C arrays, except that they grow + * automatically as elements are added. + * + * Array elements can be of any size (though all elements of one array + * are the same size), and the array can be automatically cleared to + * '0's and zero-terminated. + * + * To create a new array use g_array_new(). + * + * To add elements to an array, use g_array_append_val(), + * g_array_append_vals(), g_array_prepend_val(), and + * g_array_prepend_vals(). + * + * To access an element of an array, use g_array_index(). + * + * To set the size of an array, use g_array_set_size(). + * + * To free an array, use g_array_free(). + * + * + * Using a #GArray to store #gint values + * + * GArray *garray; + * gint i; + * /* We create a new array to store gint values. + * We don't want it zero-terminated or cleared to 0's. */ + * garray = g_array_new (FALSE, FALSE, sizeof (gint)); + * for (i = 0; i < 10000; i++) + * g_array_append_val (garray, i); + * for (i = 0; i < 10000; i++) + * if (g_array_index (garray, gint, i) != i) + * g_print ("ERROR: got %d instead of %d\n", + * g_array_index (garray, gint, i), i); + * g_array_free (garray, TRUE); + * + * + **/ + +#define MIN_ARRAY_SIZE 16 + +typedef struct _GRealArray GRealArray; + +/** + * GArray: + * @data: a pointer to the element data. The data may be moved as + * elements are added to the #GArray. + * @len: the number of elements in the #GArray not including the + * possible terminating zero element. + * + * Contains the public fields of an Array. + **/ +struct _GRealArray +{ + guint8 *data; + guint len; + guint alloc; + guint elt_size; + guint zero_terminated : 1; + guint clear : 1; + volatile gint ref_count; +}; + +/** + * g_array_index: + * @a: a #GArray. + * @t: the type of the elements. + * @i: the index of the element to return. + * @Returns: the element of the #GArray at the index given by @i. + * + * Returns the element of a #GArray at the given index. The return + * value is cast to the given type. + * + * + * Getting a pointer to an element in a #GArray + * + * EDayViewEvent *event; + * /* This gets a pointer to the 4th element + * in the array of EDayViewEvent structs. */ + * event = &g_array_index (events, EDayViewEvent, 3); + * + * + **/ + +#define g_array_elt_len(array,i) ((array)->elt_size * (i)) +#define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i))) +#define g_array_elt_zero(array, pos, len) \ + (memset (g_array_elt_pos ((array), pos), 0, g_array_elt_len ((array), len))) +#define g_array_zero_terminate(array) G_STMT_START{ \ + if ((array)->zero_terminated) \ + g_array_elt_zero ((array), (array)->len, 1); \ +}G_STMT_END + +static guint g_nearest_pow (gint num) G_GNUC_CONST; +static void g_array_maybe_expand (GRealArray *array, + gint len); + +/** + * g_array_new: + * @zero_terminated: %TRUE if the array should have an extra element at + * the end which is set to 0. + * @clear_: %TRUE if #GArray elements should be automatically cleared + * to 0 when they are allocated. + * @element_size: the size of each element in bytes. + * @Returns: the new #GArray. + * + * Creates a new #GArray with a reference count of 1. + **/ +GArray* +g_array_new (gboolean zero_terminated, + gboolean clear, + guint elt_size) +{ + return (GArray*) g_array_sized_new (zero_terminated, clear, elt_size, 0); +} + +/** + * g_array_sized_new: + * @zero_terminated: %TRUE if the array should have an extra element at + * the end with all bits cleared. + * @clear_: %TRUE if all bits in the array should be cleared to 0 on + * allocation. + * @element_size: size of each element in the array. + * @reserved_size: number of elements preallocated. + * @Returns: the new #GArray. + * + * Creates a new #GArray with @reserved_size elements preallocated and + * a reference count of 1. This avoids frequent reallocation, if you + * are going to add many elements to the array. Note however that the + * size of the array is still 0. + **/ +GArray* g_array_sized_new (gboolean zero_terminated, + gboolean clear, + guint elt_size, + guint reserved_size) +{ + GRealArray *array = g_slice_new (GRealArray); + + array->data = NULL; + array->len = 0; + array->alloc = 0; + array->zero_terminated = (zero_terminated ? 1 : 0); + array->clear = (clear ? 1 : 0); + array->elt_size = elt_size; + array->ref_count = 1; + + if (array->zero_terminated || reserved_size != 0) + { + g_array_maybe_expand (array, reserved_size); + g_array_zero_terminate(array); + } + + return (GArray*) array; +} + +/** + * g_array_ref: + * @array: A #GArray. + * + * Atomically increments the reference count of @array by one. This + * function is MT-safe and may be called from any thread. + * + * Returns: The passed in #GArray. + * + * Since: 2.22 + **/ +GArray * +g_array_ref (GArray *array) +{ + GRealArray *rarray = (GRealArray*) array; + g_return_val_if_fail (array, NULL); + g_return_val_if_fail (g_atomic_int_get (&rarray->ref_count) > 0, array); + g_atomic_int_inc (&rarray->ref_count); + return array; +} + +/** + * g_array_unref: + * @array: A #GArray. + * + * Atomically decrements the reference count of @array by one. If the + * reference count drops to 0, all memory allocated by the array is + * released. This function is MT-safe and may be called from any + * thread. + * + * Since: 2.22 + **/ +void +g_array_unref (GArray *array) +{ + GRealArray *rarray = (GRealArray*) array; + g_return_if_fail (array); + g_return_if_fail (g_atomic_int_get (&rarray->ref_count) > 0); + if (g_atomic_int_dec_and_test (&rarray->ref_count)) + g_array_free (array, TRUE); +} + +/** + * g_array_get_element_size: + * @array: A #GArray. + * + * Gets the size of the elements in @array. + * + * Returns: Size of each element, in bytes. + * + * Since: 2.22 + **/ +guint +g_array_get_element_size (GArray *array) +{ + GRealArray *rarray = (GRealArray*) array; + + g_return_val_if_fail (array, 0); + + return rarray->elt_size; +} + +/** + * g_array_free: + * @array: a #GArray. + * @free_segment: if %TRUE the actual element data is freed as well. + * @Returns: the element data if @free_segment is %FALSE, otherwise + * %NULL. The element data should be freed using g_free(). + * + * Frees the memory allocated for the #GArray. If @free_segment is + * %TRUE it frees the memory block holding the elements as well and + * also each element if @array has a @element_free_func set. Pass + * %FALSE if you want to free the #GArray wrapper but preserve the + * underlying array for use elsewhere. If the reference count of @array + * is greater than one, the #GArray wrapper is preserved but the size + * of @array will be set to zero. + * + * If array elements contain dynamically-allocated memory, + * they should be freed separately. + **/ +gchar* +g_array_free (GArray *farray, + gboolean free_segment) +{ + GRealArray *array = (GRealArray*) farray; + gchar* segment; + gboolean preserve_wrapper; + + g_return_val_if_fail (array, NULL); + + /* if others are holding a reference, preserve the wrapper but do free/return the data */ + preserve_wrapper = FALSE; + if (g_atomic_int_get (&array->ref_count) > 1) + preserve_wrapper = TRUE; + + if (free_segment) + { + g_free (array->data); + segment = NULL; + } + else + segment = (gchar*) array->data; + + if (preserve_wrapper) + { + array->data = NULL; + array->len = 0; + array->alloc = 0; + } + else + { + g_slice_free1 (sizeof (GRealArray), array); + } + + return segment; +} + +/** + * g_array_append_vals: + * @array: a #GArray. + * @data: a pointer to the elements to append to the end of the array. + * @len: the number of elements to append. + * @Returns: the #GArray. + * + * Adds @len elements onto the end of the array. + **/ +/** + * g_array_append_val: + * @a: a #GArray. + * @v: the value to append to the #GArray. + * @Returns: the #GArray. + * + * Adds the value on to the end of the array. The array will grow in + * size automatically if necessary. + * + * g_array_append_val() is a macro which uses a reference + * to the value parameter @v. This means that you cannot use it with + * literal values such as "27". You must use variables. + **/ +GArray* +g_array_append_vals (GArray *farray, + gconstpointer data, + guint len) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + + g_array_maybe_expand (array, len); + + memcpy (g_array_elt_pos (array, array->len), data, + g_array_elt_len (array, len)); + + array->len += len; + + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_prepend_vals: + * @array: a #GArray. + * @data: a pointer to the elements to prepend to the start of the + * array. + * @len: the number of elements to prepend. + * @Returns: the #GArray. + * + * Adds @len elements onto the start of the array. + * + * This operation is slower than g_array_append_vals() since the + * existing elements in the array have to be moved to make space for + * the new elements. + **/ +/** + * g_array_prepend_val: + * @a: a #GArray. + * @v: the value to prepend to the #GArray. + * @Returns: the #GArray. + * + * Adds the value on to the start of the array. The array will grow in + * size automatically if necessary. + * + * This operation is slower than g_array_append_val() since the + * existing elements in the array have to be moved to make space for + * the new element. + * + * g_array_prepend_val() is a macro which uses a reference + * to the value parameter @v. This means that you cannot use it with + * literal values such as "27". You must use variables. + **/ +GArray* +g_array_prepend_vals (GArray *farray, + gconstpointer data, + guint len) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + + g_array_maybe_expand (array, len); + + g_memmove (g_array_elt_pos (array, len), g_array_elt_pos (array, 0), + g_array_elt_len (array, array->len)); + + memcpy (g_array_elt_pos (array, 0), data, g_array_elt_len (array, len)); + + array->len += len; + + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_insert_vals: + * @array: a #GArray. + * @index_: the index to place the elements at. + * @data: a pointer to the elements to insert. + * @len: the number of elements to insert. + * @Returns: the #GArray. + * + * Inserts @len elements into a #GArray at the given index. + **/ +/** + * g_array_insert_val: + * @a: a #GArray. + * @i: the index to place the element at. + * @v: the value to insert into the array. + * @Returns: the #GArray. + * + * Inserts an element into an array at the given index. + * + * g_array_insert_val() is a macro which uses a reference + * to the value parameter @v. This means that you cannot use it with + * literal values such as "27". You must use variables. + **/ +GArray* +g_array_insert_vals (GArray *farray, + guint index_, + gconstpointer data, + guint len) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + + g_array_maybe_expand (array, len); + + g_memmove (g_array_elt_pos (array, len + index_), + g_array_elt_pos (array, index_), + g_array_elt_len (array, array->len - index_)); + + memcpy (g_array_elt_pos (array, index_), data, g_array_elt_len (array, len)); + + array->len += len; + + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_set_size: + * @array: a #GArray. + * @length: the new size of the #GArray. + * @Returns: the #GArray. + * + * Sets the size of the array, expanding it if necessary. If the array + * was created with @clear_ set to %TRUE, the new elements are set to 0. + **/ +GArray* +g_array_set_size (GArray *farray, + guint length) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + + if (length > array->len) + { + g_array_maybe_expand (array, length - array->len); + + if (array->clear) + g_array_elt_zero (array, array->len, length - array->len); + } + else if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len) + g_array_elt_zero (array, length, array->len - length); + + array->len = length; + + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_remove_index: + * @array: a #GArray. + * @index_: the index of the element to remove. + * @Returns: the #GArray. + * + * Removes the element at the given index from a #GArray. The following + * elements are moved down one place. + **/ +GArray* +g_array_remove_index (GArray *farray, + guint index_) +{ + GRealArray* array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + + g_return_val_if_fail (index_ < array->len, NULL); + + if (index_ != array->len - 1) + g_memmove (g_array_elt_pos (array, index_), + g_array_elt_pos (array, index_ + 1), + g_array_elt_len (array, array->len - index_ - 1)); + + array->len -= 1; + + if (G_UNLIKELY (g_mem_gc_friendly)) + g_array_elt_zero (array, array->len, 1); + else + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_remove_index_fast: + * @array: a @GArray. + * @index_: the index of the element to remove. + * @Returns: the #GArray. + * + * Removes the element at the given index from a #GArray. The last + * element in the array is used to fill in the space, so this function + * does not preserve the order of the #GArray. But it is faster than + * g_array_remove_index(). + **/ +GArray* +g_array_remove_index_fast (GArray *farray, + guint index_) +{ + GRealArray* array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + + g_return_val_if_fail (index_ < array->len, NULL); + + if (index_ != array->len - 1) + memcpy (g_array_elt_pos (array, index_), + g_array_elt_pos (array, array->len - 1), + g_array_elt_len (array, 1)); + + array->len -= 1; + + if (G_UNLIKELY (g_mem_gc_friendly)) + g_array_elt_zero (array, array->len, 1); + else + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_remove_range: + * @array: a @GArray. + * @index_: the index of the first element to remove. + * @length: the number of elements to remove. + * @Returns: the #GArray. + * + * Removes the given number of elements starting at the given index + * from a #GArray. The following elements are moved to close the gap. + * + * Since: 2.4 + **/ +GArray* +g_array_remove_range (GArray *farray, + guint index_, + guint length) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_val_if_fail (array, NULL); + g_return_val_if_fail (index_ < array->len, NULL); + g_return_val_if_fail (index_ + length <= array->len, NULL); + + if (index_ + length != array->len) + g_memmove (g_array_elt_pos (array, index_), + g_array_elt_pos (array, index_ + length), + (array->len - (index_ + length)) * array->elt_size); + + array->len -= length; + if (G_UNLIKELY (g_mem_gc_friendly)) + g_array_elt_zero (array, array->len, length); + else + g_array_zero_terminate (array); + + return farray; +} + +/** + * g_array_sort: + * @array: a #GArray. + * @compare_func: comparison function. + * + * Sorts a #GArray using @compare_func which should be a qsort()-style + * comparison function (returns less than zero for first arg is less + * than second arg, zero for equal, greater zero if first arg is + * greater than second arg). + * + * If two array elements compare equal, their order in the sorted array + * is undefined. + **/ +void +g_array_sort (GArray *farray, + GCompareFunc compare_func) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_if_fail (array != NULL); + + qsort (array->data, + array->len, + array->elt_size, + compare_func); +} + +/** + * g_array_sort_with_data: + * @array: a #GArray. + * @compare_func: comparison function. + * @user_data: data to pass to @compare_func. + * + * Like g_array_sort(), but the comparison function receives an extra + * user data argument. + **/ +void +g_array_sort_with_data (GArray *farray, + GCompareDataFunc compare_func, + gpointer user_data) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_if_fail (array != NULL); + + g_qsort_with_data (array->data, + array->len, + array->elt_size, + compare_func, + user_data); +} + +/* Returns the smallest power of 2 greater than n, or n if + * such power does not fit in a guint + */ +static guint +g_nearest_pow (gint num) +{ + guint n = 1; + + while (n < num && n > 0) + n <<= 1; + + return n ? n : num; +} + +static void +g_array_maybe_expand (GRealArray *array, + gint len) +{ + guint want_alloc = g_array_elt_len (array, array->len + len + + array->zero_terminated); + + if (want_alloc > array->alloc) + { + want_alloc = g_nearest_pow (want_alloc); + want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE); + + array->data = g_realloc (array->data, want_alloc); + + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (array->data + array->alloc, 0, want_alloc - array->alloc); + + array->alloc = want_alloc; + } +} + +/* Pointer Array + */ +/** + * SECTION: arrays_pointer + * @title: Pointer Arrays + * @short_description: arrays of pointers to any type of data, which + * grow automatically as new elements are added + * + * Pointer Arrays are similar to Arrays but are used only for storing + * pointers. + * + * If you remove elements from the array, elements at the + * end of the array are moved into the space previously occupied by the + * removed element. This means that you should not rely on the index of + * particular elements remaining the same. You should also be careful + * when deleting elements while iterating over the array. + * + * To create a pointer array, use g_ptr_array_new(). + * + * To add elements to a pointer array, use g_ptr_array_add(). + * + * To remove elements from a pointer array, use g_ptr_array_remove(), + * g_ptr_array_remove_index() or g_ptr_array_remove_index_fast(). + * + * To access an element of a pointer array, use g_ptr_array_index(). + * + * To set the size of a pointer array, use g_ptr_array_set_size(). + * + * To free a pointer array, use g_ptr_array_free(). + * + * + * Using a #GPtrArray + * + * GPtrArray *gparray; + * gchar *string1 = "one", *string2 = "two", *string3 = "three"; + * + * gparray = g_ptr_array_new (); + * g_ptr_array_add (gparray, (gpointer) string1); + * g_ptr_array_add (gparray, (gpointer) string2); + * g_ptr_array_add (gparray, (gpointer) string3); + * + * if (g_ptr_array_index (gparray, 0) != (gpointer) string1) + * g_print ("ERROR: got %p instead of %p\n", + * g_ptr_array_index (gparray, 0), string1); + * + * g_ptr_array_free (gparray, TRUE); + * + * + **/ + +typedef struct _GRealPtrArray GRealPtrArray; + +/** + * GPtrArray: + * @pdata: points to the array of pointers, which may be moved when the + * array grows. + * @len: number of pointers in the array. + * + * Contains the public fields of a pointer array. + **/ +struct _GRealPtrArray +{ + gpointer *pdata; + guint len; + guint alloc; + volatile gint ref_count; + GDestroyNotify element_free_func; +}; + +/** + * g_ptr_array_index: + * @array: a #GPtrArray. + * @index_: the index of the pointer to return. + * @Returns: the pointer at the given index. + * + * Returns the pointer at the given index of the pointer array. + **/ + +static void g_ptr_array_maybe_expand (GRealPtrArray *array, + gint len); + +/** + * g_ptr_array_new: + * @Returns: the new #GPtrArray. + * + * Creates a new #GPtrArray with a reference count of 1. + **/ +GPtrArray* +g_ptr_array_new (void) +{ + return g_ptr_array_sized_new (0); +} + +/** + * g_ptr_array_sized_new: + * @reserved_size: number of pointers preallocated. + * @Returns: the new #GPtrArray. + * + * Creates a new #GPtrArray with @reserved_size pointers preallocated + * and a reference count of 1. This avoids frequent reallocation, if + * you are going to add many pointers to the array. Note however that + * the size of the array is still 0. + **/ +GPtrArray* +g_ptr_array_sized_new (guint reserved_size) +{ + GRealPtrArray *array = g_slice_new (GRealPtrArray); + + array->pdata = NULL; + array->len = 0; + array->alloc = 0; + array->ref_count = 1; + array->element_free_func = NULL; + + if (reserved_size != 0) + g_ptr_array_maybe_expand (array, reserved_size); + + return (GPtrArray*) array; +} + +/** + * g_ptr_array_new_with_free_func: + * @element_free_func: A function to free elements with destroy @array or %NULL. + * + * Creates a new #GPtrArray with a reference count of 1 and use @element_free_func + * for freeing each element when the array is destroyed either via + * g_ptr_array_unref(), when g_ptr_array_free() is called with @free_segment + * set to %TRUE or when removing elements. + * + * Returns: A new #GPtrArray. + * + * Since: 2.22 + **/ +GPtrArray * +g_ptr_array_new_with_free_func (GDestroyNotify element_free_func) +{ + GPtrArray *array; + + array = g_ptr_array_new (); + g_ptr_array_set_free_func (array, element_free_func); + return array; +} + +/** + * g_ptr_array_set_free_func: + * @array: A #GPtrArray. + * @element_free_func: A function to free elements with destroy @array or %NULL. + * + * Sets a function for freeing each element when @array is destroyed + * either via g_ptr_array_unref(), when g_ptr_array_free() is called + * with @free_segment set to %TRUE or when removing elements. + * + * Since: 2.22 + **/ +void +g_ptr_array_set_free_func (GPtrArray *array, + GDestroyNotify element_free_func) +{ + GRealPtrArray* rarray = (GRealPtrArray*) array; + + g_return_if_fail (array); + + rarray->element_free_func = element_free_func; +} + +/** + * g_ptr_array_ref: + * @array: A #GArray. + * + * Atomically increments the reference count of @array by one. This + * function is MT-safe and may be called from any thread. + * + * Returns: The passed in #GPtrArray. + * + * Since: 2.22 + **/ +GPtrArray * +g_ptr_array_ref (GPtrArray *array) +{ + GRealPtrArray *rarray = (GRealPtrArray*) array; + + g_return_val_if_fail (array, NULL); + g_return_val_if_fail (g_atomic_int_get (&rarray->ref_count) > 0, array); + g_atomic_int_inc (&rarray->ref_count); + return array; +} + +/** + * g_ptr_array_unref: + * @array: A #GPtrArray. + * + * Atomically decrements the reference count of @array by one. If the + * reference count drops to 0, the effect is the same as calling + * g_ptr_array_free() with @free_segment set to %TRUE. This function + * is MT-safe and may be called from any thread. + * + * Since: 2.22 + **/ +void +g_ptr_array_unref (GPtrArray *array) +{ + GRealPtrArray *rarray = (GRealPtrArray*) array; + + g_return_if_fail (array); + g_return_if_fail (g_atomic_int_get (&rarray->ref_count) > 0); + if (g_atomic_int_dec_and_test (&rarray->ref_count)) + g_ptr_array_free (array, TRUE); +} + +/** + * g_ptr_array_free: + * @array: a #GPtrArray. + * @free_seg: if %TRUE the actual pointer array is freed as well. + * @Returns: the pointer array if @free_seg is %FALSE, otherwise %NULL. + * The pointer array should be freed using g_free(). + * + * Frees the memory allocated for the #GPtrArray. If @free_seg is %TRUE + * it frees the memory block holding the elements as well. Pass %FALSE + * if you want to free the #GPtrArray wrapper but preserve the + * underlying array for use elsewhere. If the reference count of @array + * is greater than one, the #GPtrArray wrapper is preserved but the + * size of @array will be set to zero. + * + * If array contents point to dynamically-allocated + * memory, they should be freed separately if @free_seg is %TRUE and no + * #GDestroyNotify function has been set for @array. + **/ +gpointer* +g_ptr_array_free (GPtrArray *farray, + gboolean free_segment) +{ + GRealPtrArray *array = (GRealPtrArray*) farray; + gpointer* segment; + gboolean preserve_wrapper; + + g_return_val_if_fail (array, NULL); + + /* if others are holding a reference, preserve the wrapper but do free/return the data */ + preserve_wrapper = FALSE; + if (g_atomic_int_get (&array->ref_count) > 1) + preserve_wrapper = TRUE; + + if (free_segment) + { + if (array->element_free_func != NULL) + g_ptr_array_foreach (farray, (GFunc) array->element_free_func, NULL); + g_free (array->pdata); + segment = NULL; + } + else + segment = array->pdata; + + if (preserve_wrapper) + { + array->pdata = NULL; + array->len = 0; + array->alloc = 0; + } + else + { + g_slice_free1 (sizeof (GRealPtrArray), array); + } + + return segment; +} + +static void +g_ptr_array_maybe_expand (GRealPtrArray *array, + gint len) +{ + if ((array->len + len) > array->alloc) + { + guint old_alloc = array->alloc; + array->alloc = g_nearest_pow (array->len + len); + array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE); + array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc); + if (G_UNLIKELY (g_mem_gc_friendly)) + for ( ; old_alloc < array->alloc; old_alloc++) + array->pdata [old_alloc] = NULL; + } +} + +/** + * g_ptr_array_set_size: + * @array: a #GPtrArray. + * @length: the new length of the pointer array. + * + * Sets the size of the array. When making the array larger, + * newly-added elements will be set to %NULL. When making it smaller, + * if @array has a non-%NULL #GDestroyNotify function then it will be + * called for the removed elements. + **/ +void +g_ptr_array_set_size (GPtrArray *farray, + gint length) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + + g_return_if_fail (array); + + if (length > array->len) + { + int i; + g_ptr_array_maybe_expand (array, (length - array->len)); + /* This is not + * memset (array->pdata + array->len, 0, + * sizeof (gpointer) * (length - array->len)); + * to make it really portable. Remember (void*)NULL needn't be + * bitwise zero. It of course is silly not to use memset (..,0,..). + */ + for (i = array->len; i < length; i++) + array->pdata[i] = NULL; + } + else if (length < array->len) + g_ptr_array_remove_range (farray, length, array->len - length); + + array->len = length; +} + +/** + * g_ptr_array_remove_index: + * @array: a #GPtrArray. + * @index_: the index of the pointer to remove. + * @Returns: the pointer which was removed. + * + * Removes the pointer at the given index from the pointer array. The + * following elements are moved down one place. If @array has a + * non-%NULL #GDestroyNotify function it is called for the removed + * element. + **/ +gpointer +g_ptr_array_remove_index (GPtrArray *farray, + guint index_) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + gpointer result; + + g_return_val_if_fail (array, NULL); + + g_return_val_if_fail (index_ < array->len, NULL); + + result = array->pdata[index_]; + + if (array->element_free_func != NULL) + array->element_free_func (array->pdata[index_]); + + if (index_ != array->len - 1) + g_memmove (array->pdata + index_, array->pdata + index_ + 1, + sizeof (gpointer) * (array->len - index_ - 1)); + + array->len -= 1; + + if (G_UNLIKELY (g_mem_gc_friendly)) + array->pdata[array->len] = NULL; + + return result; +} + +/** + * g_ptr_array_remove_index_fast: + * @array: a #GPtrArray. + * @index_: the index of the pointer to remove. + * @Returns: the pointer which was removed. + * + * Removes the pointer at the given index from the pointer array. The + * last element in the array is used to fill in the space, so this + * function does not preserve the order of the array. But it is faster + * than g_ptr_array_remove_index(). If @array has a non-%NULL + * #GDestroyNotify function it is called for the removed element. + **/ +gpointer +g_ptr_array_remove_index_fast (GPtrArray *farray, + guint index_) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + gpointer result; + + g_return_val_if_fail (array, NULL); + + g_return_val_if_fail (index_ < array->len, NULL); + + result = array->pdata[index_]; + + if (index_ != array->len - 1) + { + if (array->element_free_func != NULL) + array->element_free_func (array->pdata[index_]); + array->pdata[index_] = array->pdata[array->len - 1]; + } + + array->len -= 1; + + if (G_UNLIKELY (g_mem_gc_friendly)) + array->pdata[array->len] = NULL; + + return result; +} + +/** + * g_ptr_array_remove_range: + * @array: a @GPtrArray. + * @index_: the index of the first pointer to remove. + * @length: the number of pointers to remove. + * + * Removes the given number of pointers starting at the given index + * from a #GPtrArray. The following elements are moved to close the + * gap. If @array has a non-%NULL #GDestroyNotify function it is called + * for the removed elements. + * + * Since: 2.4 + **/ +void +g_ptr_array_remove_range (GPtrArray *farray, + guint index_, + guint length) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + guint n; + + g_return_if_fail (array); + g_return_if_fail (index_ < array->len); + g_return_if_fail (index_ + length <= array->len); + + if (array->element_free_func != NULL) + { + for (n = index_; n < index_ + length; n++) + array->element_free_func (array->pdata[n]); + } + + if (index_ + length != array->len) + { + g_memmove (&array->pdata[index_], + &array->pdata[index_ + length], + (array->len - (index_ + length)) * sizeof (gpointer)); + } + + array->len -= length; + if (G_UNLIKELY (g_mem_gc_friendly)) + { + guint i; + for (i = 0; i < length; i++) + array->pdata[array->len + i] = NULL; + } +} + +/** + * g_ptr_array_remove: + * @array: a #GPtrArray. + * @data: the pointer to remove. + * @Returns: %TRUE if the pointer is removed. %FALSE if the pointer is + * not found in the array. + * + * Removes the first occurrence of the given pointer from the pointer + * array. The following elements are moved down one place. If @array + * has a non-%NULL #GDestroyNotify function it is called for the + * removed element. + * + * It returns %TRUE if the pointer was removed, or %FALSE if the + * pointer was not found. + **/ +gboolean +g_ptr_array_remove (GPtrArray *farray, + gpointer data) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + guint i; + + g_return_val_if_fail (array, FALSE); + + for (i = 0; i < array->len; i += 1) + { + if (array->pdata[i] == data) + { + g_ptr_array_remove_index (farray, i); + return TRUE; + } + } + + return FALSE; +} + +/** + * g_ptr_array_remove_fast: + * @array: a #GPtrArray. + * @data: the pointer to remove. + * @Returns: %TRUE if the pointer was found in the array. + * + * Removes the first occurrence of the given pointer from the pointer + * array. The last element in the array is used to fill in the space, + * so this function does not preserve the order of the array. But it is + * faster than g_ptr_array_remove(). If @array has a non-%NULL + * #GDestroyNotify function it is called for the removed element. + * + * It returns %TRUE if the pointer was removed, or %FALSE if the + * pointer was not found. + **/ +gboolean +g_ptr_array_remove_fast (GPtrArray *farray, + gpointer data) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + guint i; + + g_return_val_if_fail (array, FALSE); + + for (i = 0; i < array->len; i += 1) + { + if (array->pdata[i] == data) + { + g_ptr_array_remove_index_fast (farray, i); + return TRUE; + } + } + + return FALSE; +} + +/** + * g_ptr_array_add: + * @array: a #GPtrArray. + * @data: the pointer to add. + * + * Adds a pointer to the end of the pointer array. The array will grow + * in size automatically if necessary. + **/ +void +g_ptr_array_add (GPtrArray *farray, + gpointer data) +{ + GRealPtrArray* array = (GRealPtrArray*) farray; + + g_return_if_fail (array); + + g_ptr_array_maybe_expand (array, 1); + + array->pdata[array->len++] = data; +} + +/** + * g_ptr_array_sort: + * @array: a #GPtrArray. + * @compare_func: comparison function. + * + * Sorts the array, using @compare_func which should be a qsort()-style + * comparison function (returns less than zero for first arg is less + * than second arg, zero for equal, greater than zero if irst arg is + * greater than second arg). + * + * If two array elements compare equal, their order in the sorted array + * is undefined. + * + * The comparison function for g_ptr_array_sort() doesn't + * take the pointers from the array as arguments, it takes pointers to + * the pointers in the array. + **/ +void +g_ptr_array_sort (GPtrArray *array, + GCompareFunc compare_func) +{ + g_return_if_fail (array != NULL); + + qsort (array->pdata, + array->len, + sizeof (gpointer), + compare_func); +} + +/** + * g_ptr_array_sort_with_data: + * @array: a #GPtrArray. + * @compare_func: comparison function. + * @user_data: data to pass to @compare_func. + * + * Like g_ptr_array_sort(), but the comparison function has an extra + * user data argument. + * + * The comparison function for g_ptr_array_sort_with_data() + * doesn't take the pointers from the array as arguments, it takes + * pointers to the pointers in the array. + **/ +void +g_ptr_array_sort_with_data (GPtrArray *array, + GCompareDataFunc compare_func, + gpointer user_data) +{ + g_return_if_fail (array != NULL); + + g_qsort_with_data (array->pdata, + array->len, + sizeof (gpointer), + compare_func, + user_data); +} + +/** + * g_ptr_array_foreach: + * @array: a #GPtrArray + * @func: the function to call for each array element + * @user_data: user data to pass to the function + * + * Calls a function for each element of a #GPtrArray. + * + * Since: 2.4 + **/ +void +g_ptr_array_foreach (GPtrArray *array, + GFunc func, + gpointer user_data) +{ + guint i; + + g_return_if_fail (array); + + for (i = 0; i < array->len; i++) + (*func) (array->pdata[i], user_data); +} + +/* Byte arrays + */ +/** + * SECTION: arrays_byte + * @title: Byte Arrays + * @short_description: arrays of bytes, which grow automatically as + * elements are added + * + * #GByteArray is based on #GArray, to provide arrays of bytes which + * grow automatically as elements are added. + * + * To create a new #GByteArray use g_byte_array_new(). + * + * To add elements to a #GByteArray, use g_byte_array_append(), and + * g_byte_array_prepend(). + * + * To set the size of a #GByteArray, use g_byte_array_set_size(). + * + * To free a #GByteArray, use g_byte_array_free(). + * + * + * Using a #GByteArray + * + * GByteArray *gbarray; + * gint i; + * + * gbarray = g_byte_array_new (); + * for (i = 0; i < 10000; i++) + * g_byte_array_append (gbarray, (guint8*) "abcd", 4); + * + * for (i = 0; i < 10000; i++) + * { + * g_assert (gbarray->data[4*i] == 'a'); + * g_assert (gbarray->data[4*i+1] == 'b'); + * g_assert (gbarray->data[4*i+2] == 'c'); + * g_assert (gbarray->data[4*i+3] == 'd'); + * } + * + * g_byte_array_free (gbarray, TRUE); + * + * + **/ + +/** + * GByteArray: + * @data: a pointer to the element data. The data may be moved as + * elements are added to the #GByteArray. + * @len: the number of elements in the #GByteArray. + * + * The GByteArray struct allows access to the + * public fields of a GByteArray. + **/ + +/** + * g_byte_array_new: + * @Returns: the new #GByteArray. + * + * Creates a new #GByteArray with a reference count of 1. + **/ +GByteArray* g_byte_array_new (void) +{ + return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, 0); +} + +/** + * g_byte_array_sized_new: + * @reserved_size: number of bytes preallocated. + * @Returns: the new #GByteArray. + * + * Creates a new #GByteArray with @reserved_size bytes preallocated. + * This avoids frequent reallocation, if you are going to add many + * bytes to the array. Note however that the size of the array is still + * 0. + **/ +GByteArray* g_byte_array_sized_new (guint reserved_size) +{ + return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, reserved_size); +} + +/** + * g_byte_array_free: + * @array: a #GByteArray. + * @free_segment: if %TRUE the actual byte data is freed as well. + * @Returns: the element data if @free_segment is %FALSE, otherwise + * %NULL. The element data should be freed using g_free(). + * + * Frees the memory allocated by the #GByteArray. If @free_segment is + * %TRUE it frees the actual byte data. If the reference count of + * @array is greater than one, the #GByteArray wrapper is preserved but + * the size of @array will be set to zero. + **/ +guint8* g_byte_array_free (GByteArray *array, + gboolean free_segment) +{ + return (guint8*) g_array_free ((GArray*) array, free_segment); +} + +/** + * g_byte_array_ref: + * @array: A #GByteArray. + * + * Atomically increments the reference count of @array by one. This + * function is MT-safe and may be called from any thread. + * + * Returns: The passed in #GByteArray. + * + * Since: 2.22 + **/ +GByteArray * +g_byte_array_ref (GByteArray *array) +{ + return (GByteArray *) g_array_ref ((GArray *) array); +} + +/** + * g_byte_array_unref: + * @array: A #GByteArray. + * + * Atomically decrements the reference count of @array by one. If the + * reference count drops to 0, all memory allocated by the array is + * released. This function is MT-safe and may be called from any + * thread. + * + * Since: 2.22 + **/ +void +g_byte_array_unref (GByteArray *array) +{ + g_array_unref ((GArray *) array); +} + +/** + * g_byte_array_append: + * @array: a #GByteArray. + * @data: the byte data to be added. + * @len: the number of bytes to add. + * @Returns: the #GByteArray. + * + * Adds the given bytes to the end of the #GByteArray. The array will + * grow in size automatically if necessary. + **/ +GByteArray* g_byte_array_append (GByteArray *array, + const guint8 *data, + guint len) +{ + g_array_append_vals ((GArray*) array, (guint8*)data, len); + + return array; +} + +/** + * g_byte_array_prepend: + * @array: a #GByteArray. + * @data: the byte data to be added. + * @len: the number of bytes to add. + * @Returns: the #GByteArray. + * + * Adds the given data to the start of the #GByteArray. The array will + * grow in size automatically if necessary. + **/ +GByteArray* g_byte_array_prepend (GByteArray *array, + const guint8 *data, + guint len) +{ + g_array_prepend_vals ((GArray*) array, (guint8*)data, len); + + return array; +} + +/** + * g_byte_array_set_size: + * @array: a #GByteArray. + * @length: the new size of the #GByteArray. + * @Returns: the #GByteArray. + * + * Sets the size of the #GByteArray, expanding it if necessary. + **/ +GByteArray* g_byte_array_set_size (GByteArray *array, + guint length) +{ + g_array_set_size ((GArray*) array, length); + + return array; +} + +/** + * g_byte_array_remove_index: + * @array: a #GByteArray. + * @index_: the index of the byte to remove. + * @Returns: the #GByteArray. + * + * Removes the byte at the given index from a #GByteArray. The + * following bytes are moved down one place. + **/ +GByteArray* g_byte_array_remove_index (GByteArray *array, + guint index_) +{ + g_array_remove_index ((GArray*) array, index_); + + return array; +} + +/** + * g_byte_array_remove_index_fast: + * @array: a #GByteArray. + * @index_: the index of the byte to remove. + * @Returns: the #GByteArray. + * + * Removes the byte at the given index from a #GByteArray. The last + * element in the array is used to fill in the space, so this function + * does not preserve the order of the #GByteArray. But it is faster + * than g_byte_array_remove_index(). + **/ +GByteArray* g_byte_array_remove_index_fast (GByteArray *array, + guint index_) +{ + g_array_remove_index_fast ((GArray*) array, index_); + + return array; +} + +/** + * g_byte_array_remove_range: + * @array: a @GByteArray. + * @index_: the index of the first byte to remove. + * @length: the number of bytes to remove. + * @Returns: the #GByteArray. + * + * Removes the given number of bytes starting at the given index from a + * #GByteArray. The following elements are moved to close the gap. + * + * Since: 2.4 + **/ +GByteArray* +g_byte_array_remove_range (GByteArray *array, + guint index_, + guint length) +{ + g_return_val_if_fail (array, NULL); + g_return_val_if_fail (index_ < array->len, NULL); + g_return_val_if_fail (index_ + length <= array->len, NULL); + + return (GByteArray *)g_array_remove_range ((GArray*) array, index_, length); +} + +/** + * g_byte_array_sort: + * @array: a #GByteArray. + * @compare_func: comparison function. + * + * Sorts a byte array, using @compare_func which should be a + * qsort()-style comparison function (returns less than zero for first + * arg is less than second arg, zero for equal, greater than zero if + * first arg is greater than second arg). + * + * If two array elements compare equal, their order in the sorted array + * is undefined. + **/ +void +g_byte_array_sort (GByteArray *array, + GCompareFunc compare_func) +{ + g_array_sort ((GArray *) array, compare_func); +} + +/** + * g_byte_array_sort_with_data: + * @array: a #GByteArray. + * @compare_func: comparison function. + * @user_data: data to pass to @compare_func. + * + * Like g_byte_array_sort(), but the comparison function takes an extra + * user data argument. + **/ +void +g_byte_array_sort_with_data (GByteArray *array, + GCompareDataFunc compare_func, + gpointer user_data) +{ + g_array_sort_with_data ((GArray *) array, compare_func, user_data); +} + +#define __G_ARRAY_C__ +#include "galiasdef.c" diff --git a/glib/garray.h b/glib/garray.h new file mode 100644 index 0000000..6bc51f7 --- /dev/null +++ b/glib/garray.h @@ -0,0 +1,179 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ARRAY_H__ +#define __G_ARRAY_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GArray GArray; +typedef struct _GByteArray GByteArray; +typedef struct _GPtrArray GPtrArray; + +struct _GArray +{ + gchar *data; + guint len; +}; + +struct _GByteArray +{ + guint8 *data; + guint len; +}; + +struct _GPtrArray +{ + gpointer *pdata; + guint len; +}; + +/* Resizable arrays. remove fills any cleared spot and shortens the + * array, while preserving the order. remove_fast will distort the + * order by moving the last element to the position of the removed. + */ + +#define g_array_append_val(a,v) g_array_append_vals (a, &(v), 1) +#define g_array_prepend_val(a,v) g_array_prepend_vals (a, &(v), 1) +#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1) +#define g_array_index(a,t,i) (((t*) (void *) (a)->data) [(i)]) + +GArray* g_array_new (gboolean zero_terminated, + gboolean clear_, + guint element_size); +GArray* g_array_sized_new (gboolean zero_terminated, + gboolean clear_, + guint element_size, + guint reserved_size); +gchar* g_array_free (GArray *array, + gboolean free_segment); +GArray *g_array_ref (GArray *array); +void g_array_unref (GArray *array); +guint g_array_get_element_size (GArray *array); +GArray* g_array_append_vals (GArray *array, + gconstpointer data, + guint len); +GArray* g_array_prepend_vals (GArray *array, + gconstpointer data, + guint len); +GArray* g_array_insert_vals (GArray *array, + guint index_, + gconstpointer data, + guint len); +GArray* g_array_set_size (GArray *array, + guint length); +GArray* g_array_remove_index (GArray *array, + guint index_); +GArray* g_array_remove_index_fast (GArray *array, + guint index_); +GArray* g_array_remove_range (GArray *array, + guint index_, + guint length); +void g_array_sort (GArray *array, + GCompareFunc compare_func); +void g_array_sort_with_data (GArray *array, + GCompareDataFunc compare_func, + gpointer user_data); + +/* Resizable pointer array. This interface is much less complicated + * than the above. Add appends a pointer. Remove fills any cleared + * spot and shortens the array. remove_fast will again distort order. + */ +#define g_ptr_array_index(array,index_) ((array)->pdata)[index_] +GPtrArray* g_ptr_array_new (void); +GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func); +GPtrArray* g_ptr_array_sized_new (guint reserved_size); +gpointer* g_ptr_array_free (GPtrArray *array, + gboolean free_seg); +GPtrArray* g_ptr_array_ref (GPtrArray *array); +void g_ptr_array_unref (GPtrArray *array); +void g_ptr_array_set_free_func (GPtrArray *array, + GDestroyNotify element_free_func); +void g_ptr_array_set_size (GPtrArray *array, + gint length); +gpointer g_ptr_array_remove_index (GPtrArray *array, + guint index_); +gpointer g_ptr_array_remove_index_fast (GPtrArray *array, + guint index_); +gboolean g_ptr_array_remove (GPtrArray *array, + gpointer data); +gboolean g_ptr_array_remove_fast (GPtrArray *array, + gpointer data); +void g_ptr_array_remove_range (GPtrArray *array, + guint index_, + guint length); +void g_ptr_array_add (GPtrArray *array, + gpointer data); +void g_ptr_array_sort (GPtrArray *array, + GCompareFunc compare_func); +void g_ptr_array_sort_with_data (GPtrArray *array, + GCompareDataFunc compare_func, + gpointer user_data); +void g_ptr_array_foreach (GPtrArray *array, + GFunc func, + gpointer user_data); + + +/* Byte arrays, an array of guint8. Implemented as a GArray, + * but type-safe. + */ + +GByteArray* g_byte_array_new (void); +GByteArray* g_byte_array_sized_new (guint reserved_size); +guint8* g_byte_array_free (GByteArray *array, + gboolean free_segment); +GByteArray *g_byte_array_ref (GByteArray *array); +void g_byte_array_unref (GByteArray *array); +GByteArray* g_byte_array_append (GByteArray *array, + const guint8 *data, + guint len); +GByteArray* g_byte_array_prepend (GByteArray *array, + const guint8 *data, + guint len); +GByteArray* g_byte_array_set_size (GByteArray *array, + guint length); +GByteArray* g_byte_array_remove_index (GByteArray *array, + guint index_); +GByteArray* g_byte_array_remove_index_fast (GByteArray *array, + guint index_); +GByteArray* g_byte_array_remove_range (GByteArray *array, + guint index_, + guint length); +void g_byte_array_sort (GByteArray *array, + GCompareFunc compare_func); +void g_byte_array_sort_with_data (GByteArray *array, + GCompareDataFunc compare_func, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_ARRAY_H__ */ diff --git a/glib/gasyncqueue.c b/glib/gasyncqueue.c new file mode 100644 index 0000000..65e95a8 --- /dev/null +++ b/glib/gasyncqueue.c @@ -0,0 +1,666 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GAsyncQueue: asynchronous queue implementation, based on Gqueue. + * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + + +struct _GAsyncQueue +{ + GMutex *mutex; + GCond *cond; + GQueue *queue; + GDestroyNotify item_free_func; + guint waiting_threads; + gint32 ref_count; +}; + +typedef struct { + GCompareDataFunc func; + gpointer user_data; +} SortData; + +/** + * g_async_queue_new: + * + * Creates a new asynchronous queue with the initial reference count of 1. + * + * Return value: the new #GAsyncQueue. + **/ +GAsyncQueue* +g_async_queue_new (void) +{ + GAsyncQueue* retval = g_new (GAsyncQueue, 1); + retval->mutex = g_mutex_new (); + retval->cond = NULL; + retval->queue = g_queue_new (); + retval->waiting_threads = 0; + retval->ref_count = 1; + retval->item_free_func = NULL; + return retval; +} + +/** + * g_async_queue_new_full: + * @item_free_func: function to free queue elements + * + * Creates a new asynchronous queue with an initial reference count of 1 and + * sets up a destroy notify function that is used to free any remaining + * queue items when the queue is destroyed after the final unref. + * + * Return value: the new #GAsyncQueue. + * + * Since: 2.16 + **/ +GAsyncQueue* +g_async_queue_new_full (GDestroyNotify item_free_func) +{ + GAsyncQueue *async_queue = g_async_queue_new (); + async_queue->item_free_func = item_free_func; + return async_queue; +} + +/** + * g_async_queue_ref: + * @queue: a #GAsyncQueue. + * + * Increases the reference count of the asynchronous @queue by 1. You + * do not need to hold the lock to call this function. + * + * Returns: the @queue that was passed in (since 2.6) + **/ +GAsyncQueue * +g_async_queue_ref (GAsyncQueue *queue) +{ + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + g_atomic_int_inc (&queue->ref_count); + + return queue; +} + +/** + * g_async_queue_ref_unlocked: + * @queue: a #GAsyncQueue. + * + * Increases the reference count of the asynchronous @queue by 1. + * + * @Deprecated: Since 2.8, reference counting is done atomically + * so g_async_queue_ref() can be used regardless of the @queue's + * lock. + **/ +void +g_async_queue_ref_unlocked (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + + g_atomic_int_inc (&queue->ref_count); +} + +/** + * g_async_queue_unref_and_unlock: + * @queue: a #GAsyncQueue. + * + * Decreases the reference count of the asynchronous @queue by 1 and + * releases the lock. This function must be called while holding the + * @queue's lock. If the reference count went to 0, the @queue will be + * destroyed and the memory allocated will be freed. + * + * @Deprecated: Since 2.8, reference counting is done atomically + * so g_async_queue_unref() can be used regardless of the @queue's + * lock. + **/ +void +g_async_queue_unref_and_unlock (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + + g_mutex_unlock (queue->mutex); + g_async_queue_unref (queue); +} + +/** + * g_async_queue_unref: + * @queue: a #GAsyncQueue. + * + * Decreases the reference count of the asynchronous @queue by 1. If + * the reference count went to 0, the @queue will be destroyed and the + * memory allocated will be freed. So you are not allowed to use the + * @queue afterwards, as it might have disappeared. You do not need to + * hold the lock to call this function. + **/ +void +g_async_queue_unref (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + + if (g_atomic_int_dec_and_test (&queue->ref_count)) + { + g_return_if_fail (queue->waiting_threads == 0); + g_mutex_free (queue->mutex); + if (queue->cond) + g_cond_free (queue->cond); + if (queue->item_free_func) + g_queue_foreach (queue->queue, (GFunc) queue->item_free_func, NULL); + g_queue_free (queue->queue); + g_free (queue); + } +} + +/** + * g_async_queue_lock: + * @queue: a #GAsyncQueue. + * + * Acquires the @queue's lock. After that you can only call the + * g_async_queue_*_unlocked() function variants on that + * @queue. Otherwise it will deadlock. + **/ +void +g_async_queue_lock (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + + g_mutex_lock (queue->mutex); +} + +/** + * g_async_queue_unlock: + * @queue: a #GAsyncQueue. + * + * Releases the queue's lock. + **/ +void +g_async_queue_unlock (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + + g_mutex_unlock (queue->mutex); +} + +/** + * g_async_queue_push: + * @queue: a #GAsyncQueue. + * @data: @data to push into the @queue. + * + * Pushes the @data into the @queue. @data must not be %NULL. + **/ +void +g_async_queue_push (GAsyncQueue* queue, gpointer data) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + g_return_if_fail (data); + + g_mutex_lock (queue->mutex); + g_async_queue_push_unlocked (queue, data); + g_mutex_unlock (queue->mutex); +} + +/** + * g_async_queue_push_unlocked: + * @queue: a #GAsyncQueue. + * @data: @data to push into the @queue. + * + * Pushes the @data into the @queue. @data must not be %NULL. This + * function must be called while holding the @queue's lock. + **/ +void +g_async_queue_push_unlocked (GAsyncQueue* queue, gpointer data) +{ + g_return_if_fail (queue); + g_return_if_fail (g_atomic_int_get (&queue->ref_count) > 0); + g_return_if_fail (data); + + g_queue_push_head (queue->queue, data); + if (queue->waiting_threads > 0) + g_cond_signal (queue->cond); +} + +/** + * g_async_queue_push_sorted: + * @queue: a #GAsyncQueue + * @data: the @data to push into the @queue + * @func: the #GCompareDataFunc is used to sort @queue. This function + * is passed two elements of the @queue. The function should return + * 0 if they are equal, a negative value if the first element + * should be higher in the @queue or a positive value if the first + * element should be lower in the @queue than the second element. + * @user_data: user data passed to @func. + * + * Inserts @data into @queue using @func to determine the new + * position. + * + * This function requires that the @queue is sorted before pushing on + * new elements. + * + * This function will lock @queue before it sorts the queue and unlock + * it when it is finished. + * + * For an example of @func see g_async_queue_sort(). + * + * Since: 2.10 + **/ +void +g_async_queue_push_sorted (GAsyncQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data) +{ + g_return_if_fail (queue != NULL); + + g_mutex_lock (queue->mutex); + g_async_queue_push_sorted_unlocked (queue, data, func, user_data); + g_mutex_unlock (queue->mutex); +} + +static gint +g_async_queue_invert_compare (gpointer v1, + gpointer v2, + SortData *sd) +{ + return -sd->func (v1, v2, sd->user_data); +} + +/** + * g_async_queue_push_sorted_unlocked: + * @queue: a #GAsyncQueue + * @data: the @data to push into the @queue + * @func: the #GCompareDataFunc is used to sort @queue. This function + * is passed two elements of the @queue. The function should return + * 0 if they are equal, a negative value if the first element + * should be higher in the @queue or a positive value if the first + * element should be lower in the @queue than the second element. + * @user_data: user data passed to @func. + * + * Inserts @data into @queue using @func to determine the new + * position. + * + * This function requires that the @queue is sorted before pushing on + * new elements. + * + * This function is called while holding the @queue's lock. + * + * For an example of @func see g_async_queue_sort(). + * + * Since: 2.10 + **/ +void +g_async_queue_push_sorted_unlocked (GAsyncQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data) +{ + SortData sd; + + g_return_if_fail (queue != NULL); + + sd.func = func; + sd.user_data = user_data; + + g_queue_insert_sorted (queue->queue, + data, + (GCompareDataFunc)g_async_queue_invert_compare, + &sd); + if (queue->waiting_threads > 0) + g_cond_signal (queue->cond); +} + +static gpointer +g_async_queue_pop_intern_unlocked (GAsyncQueue *queue, + gboolean try, + GTimeVal *end_time) +{ + gpointer retval; + + if (!g_queue_peek_tail_link (queue->queue)) + { + if (try) + return NULL; + + if (!queue->cond) + queue->cond = g_cond_new (); + + if (!end_time) + { + queue->waiting_threads++; + while (!g_queue_peek_tail_link (queue->queue)) + g_cond_wait (queue->cond, queue->mutex); + queue->waiting_threads--; + } + else + { + queue->waiting_threads++; + while (!g_queue_peek_tail_link (queue->queue)) + if (!g_cond_timed_wait (queue->cond, queue->mutex, end_time)) + break; + queue->waiting_threads--; + if (!g_queue_peek_tail_link (queue->queue)) + return NULL; + } + } + + retval = g_queue_pop_tail (queue->queue); + + g_assert (retval); + + return retval; +} + +/** + * g_async_queue_pop: + * @queue: a #GAsyncQueue. + * + * Pops data from the @queue. This function blocks until data become + * available. + * + * Return value: data from the queue. + **/ +gpointer +g_async_queue_pop (GAsyncQueue* queue) +{ + gpointer retval; + + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + g_mutex_lock (queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, FALSE, NULL); + g_mutex_unlock (queue->mutex); + + return retval; +} + +/** + * g_async_queue_pop_unlocked: + * @queue: a #GAsyncQueue. + * + * Pops data from the @queue. This function blocks until data become + * available. This function must be called while holding the @queue's + * lock. + * + * Return value: data from the queue. + **/ +gpointer +g_async_queue_pop_unlocked (GAsyncQueue* queue) +{ + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + return g_async_queue_pop_intern_unlocked (queue, FALSE, NULL); +} + +/** + * g_async_queue_try_pop: + * @queue: a #GAsyncQueue. + * + * Tries to pop data from the @queue. If no data is available, %NULL is + * returned. + * + * Return value: data from the queue or %NULL, when no data is + * available immediately. + **/ +gpointer +g_async_queue_try_pop (GAsyncQueue* queue) +{ + gpointer retval; + + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + g_mutex_lock (queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, TRUE, NULL); + g_mutex_unlock (queue->mutex); + + return retval; +} + +/** + * g_async_queue_try_pop_unlocked: + * @queue: a #GAsyncQueue. + * + * Tries to pop data from the @queue. If no data is available, %NULL is + * returned. This function must be called while holding the @queue's + * lock. + * + * Return value: data from the queue or %NULL, when no data is + * available immediately. + **/ +gpointer +g_async_queue_try_pop_unlocked (GAsyncQueue* queue) +{ + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + return g_async_queue_pop_intern_unlocked (queue, TRUE, NULL); +} + +/** + * g_async_queue_timed_pop: + * @queue: a #GAsyncQueue. + * @end_time: a #GTimeVal, determining the final time. + * + * Pops data from the @queue. If no data is received before @end_time, + * %NULL is returned. + * + * To easily calculate @end_time a combination of g_get_current_time() + * and g_time_val_add() can be used. + * + * Return value: data from the queue or %NULL, when no data is + * received before @end_time. + **/ +gpointer +g_async_queue_timed_pop (GAsyncQueue* queue, GTimeVal *end_time) +{ + gpointer retval; + + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + g_mutex_lock (queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, FALSE, end_time); + g_mutex_unlock (queue->mutex); + + return retval; +} + +/** + * g_async_queue_timed_pop_unlocked: + * @queue: a #GAsyncQueue. + * @end_time: a #GTimeVal, determining the final time. + * + * Pops data from the @queue. If no data is received before @end_time, + * %NULL is returned. This function must be called while holding the + * @queue's lock. + * + * To easily calculate @end_time a combination of g_get_current_time() + * and g_time_val_add() can be used. + * + * Return value: data from the queue or %NULL, when no data is + * received before @end_time. + **/ +gpointer +g_async_queue_timed_pop_unlocked (GAsyncQueue* queue, GTimeVal *end_time) +{ + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + return g_async_queue_pop_intern_unlocked (queue, FALSE, end_time); +} + +/** + * g_async_queue_length: + * @queue: a #GAsyncQueue. + * + * Returns the length of the queue, negative values mean waiting + * threads, positive values mean available entries in the + * @queue. Actually this function returns the number of data items in + * the queue minus the number of waiting threads. Thus a return value + * of 0 could mean 'n' entries in the queue and 'n' thread waiting. + * That can happen due to locking of the queue or due to + * scheduling. + * + * Return value: the length of the @queue. + **/ +gint +g_async_queue_length (GAsyncQueue* queue) +{ + gint retval; + + g_return_val_if_fail (queue, 0); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, 0); + + g_mutex_lock (queue->mutex); + retval = queue->queue->length - queue->waiting_threads; + g_mutex_unlock (queue->mutex); + + return retval; +} + +/** + * g_async_queue_length_unlocked: + * @queue: a #GAsyncQueue. + * + * Returns the length of the queue, negative values mean waiting + * threads, positive values mean available entries in the + * @queue. Actually this function returns the number of data items in + * the queue minus the number of waiting threads. Thus a return value + * of 0 could mean 'n' entries in the queue and 'n' thread waiting. + * That can happen due to locking of the queue or due to + * scheduling. This function must be called while holding the @queue's + * lock. + * + * Return value: the length of the @queue. + **/ +gint +g_async_queue_length_unlocked (GAsyncQueue* queue) +{ + g_return_val_if_fail (queue, 0); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, 0); + + return queue->queue->length - queue->waiting_threads; +} + +/** + * g_async_queue_sort: + * @queue: a #GAsyncQueue + * @func: the #GCompareDataFunc is used to sort @queue. This + * function is passed two elements of the @queue. The function + * should return 0 if they are equal, a negative value if the + * first element should be higher in the @queue or a positive + * value if the first element should be lower in the @queue than + * the second element. + * @user_data: user data passed to @func + * + * Sorts @queue using @func. + * + * This function will lock @queue before it sorts the queue and unlock + * it when it is finished. + * + * If you were sorting a list of priority numbers to make sure the + * lowest priority would be at the top of the queue, you could use: + * |[ + * gint32 id1; + * gint32 id2; + * + * id1 = GPOINTER_TO_INT (element1); + * id2 = GPOINTER_TO_INT (element2); + * + * return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1); + * ]| + * + * Since: 2.10 + **/ +void +g_async_queue_sort (GAsyncQueue *queue, + GCompareDataFunc func, + gpointer user_data) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (func != NULL); + + g_mutex_lock (queue->mutex); + g_async_queue_sort_unlocked (queue, func, user_data); + g_mutex_unlock (queue->mutex); +} + +/** + * g_async_queue_sort_unlocked: + * @queue: a #GAsyncQueue + * @func: the #GCompareDataFunc is used to sort @queue. This + * function is passed two elements of the @queue. The function + * should return 0 if they are equal, a negative value if the + * first element should be higher in the @queue or a positive + * value if the first element should be lower in the @queue than + * the second element. + * @user_data: user data passed to @func + * + * Sorts @queue using @func. + * + * This function is called while holding the @queue's lock. + * + * Since: 2.10 + **/ +void +g_async_queue_sort_unlocked (GAsyncQueue *queue, + GCompareDataFunc func, + gpointer user_data) +{ + SortData sd; + + g_return_if_fail (queue != NULL); + g_return_if_fail (func != NULL); + + sd.func = func; + sd.user_data = user_data; + + g_queue_sort (queue->queue, + (GCompareDataFunc)g_async_queue_invert_compare, + &sd); +} + +/* + * Private API + */ + +GMutex* +_g_async_queue_get_mutex (GAsyncQueue* queue) +{ + g_return_val_if_fail (queue, NULL); + g_return_val_if_fail (g_atomic_int_get (&queue->ref_count) > 0, NULL); + + return queue->mutex; +} + +#define __G_ASYNCQUEUE_C__ +#include "galiasdef.c" diff --git a/glib/gasyncqueue.h b/glib/gasyncqueue.h new file mode 100644 index 0000000..9da43e3 --- /dev/null +++ b/glib/gasyncqueue.h @@ -0,0 +1,120 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ASYNCQUEUE_H__ +#define __G_ASYNCQUEUE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GAsyncQueue GAsyncQueue; + +/* Asyncronous Queues, can be used to communicate between threads */ + +/* Get a new GAsyncQueue with the ref_count 1 */ +GAsyncQueue* g_async_queue_new (void); + +GAsyncQueue* g_async_queue_new_full (GDestroyNotify item_free_func); + +/* Lock and unlock a GAsyncQueue. All functions lock the queue for + * themselves, but in certain cirumstances you want to hold the lock longer, + * thus you lock the queue, call the *_unlocked functions and unlock it again. + */ +void g_async_queue_lock (GAsyncQueue *queue); +void g_async_queue_unlock (GAsyncQueue *queue); + +/* Ref and unref the GAsyncQueue. */ +GAsyncQueue* g_async_queue_ref (GAsyncQueue *queue); +void g_async_queue_unref (GAsyncQueue *queue); + +#ifndef G_DISABLE_DEPRECATED +/* You don't have to hold the lock for calling *_ref and *_unref anymore. */ +void g_async_queue_ref_unlocked (GAsyncQueue *queue); +void g_async_queue_unref_and_unlock (GAsyncQueue *queue); +#endif /* !G_DISABLE_DEPRECATED */ + +/* Push data into the async queue. Must not be NULL. */ +void g_async_queue_push (GAsyncQueue *queue, + gpointer data); +void g_async_queue_push_unlocked (GAsyncQueue *queue, + gpointer data); + +void g_async_queue_push_sorted (GAsyncQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data); +void g_async_queue_push_sorted_unlocked (GAsyncQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data); + +/* Pop data from the async queue. When no data is there, the thread is blocked + * until data arrives. + */ +gpointer g_async_queue_pop (GAsyncQueue *queue); +gpointer g_async_queue_pop_unlocked (GAsyncQueue *queue); + +/* Try to pop data. NULL is returned in case of empty queue. */ +gpointer g_async_queue_try_pop (GAsyncQueue *queue); +gpointer g_async_queue_try_pop_unlocked (GAsyncQueue *queue); + + + +/* Wait for data until at maximum until end_time is reached. NULL is returned + * in case of empty queue. + */ +gpointer g_async_queue_timed_pop (GAsyncQueue *queue, + GTimeVal *end_time); +gpointer g_async_queue_timed_pop_unlocked (GAsyncQueue *queue, + GTimeVal *end_time); + +/* Return the length of the queue. Negative values mean that threads + * are waiting, positve values mean that there are entries in the + * queue. Actually this function returns the length of the queue minus + * the number of waiting threads, g_async_queue_length == 0 could also + * mean 'n' entries in the queue and 'n' thread waiting. Such can + * happen due to locking of the queue or due to scheduling. + */ +gint g_async_queue_length (GAsyncQueue *queue); +gint g_async_queue_length_unlocked (GAsyncQueue *queue); +void g_async_queue_sort (GAsyncQueue *queue, + GCompareDataFunc func, + gpointer user_data); +void g_async_queue_sort_unlocked (GAsyncQueue *queue, + GCompareDataFunc func, + gpointer user_data); + +/* Private API */ +GMutex* _g_async_queue_get_mutex (GAsyncQueue *queue); + +G_END_DECLS + +#endif /* __G_ASYNCQUEUE_H__ */ diff --git a/glib/gatomic-gcc.c b/glib/gatomic-gcc.c new file mode 100644 index 0000000..7b33b19 --- /dev/null +++ b/glib/gatomic-gcc.c @@ -0,0 +1,92 @@ +/* GLIB - Library of useful routines for C programming + * gatomic-gcc.c: atomic operations using GCC builtins. + * Copyright (C) 2009 Hiroyuki Ikezoe + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + return __sync_fetch_and_add (atomic, val); +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + __sync_fetch_and_add (atomic, val); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + return __sync_bool_compare_and_swap (atomic, oldval, newval); +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + return __sync_bool_compare_and_swap (atomic, oldval, newval); +} + +void +_g_atomic_thread_init (void) +{ +} + +gint +(g_atomic_int_get) (volatile gint G_GNUC_MAY_ALIAS *atomic) +{ + __sync_synchronize (); + return *atomic; +} + +void +(g_atomic_int_set) (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint newval) +{ + *atomic = newval; + __sync_synchronize (); +} + +gpointer +(g_atomic_pointer_get) (volatile gpointer G_GNUC_MAY_ALIAS *atomic) +{ + __sync_synchronize (); + return *atomic; +} + +void +(g_atomic_pointer_set) (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer newval) +{ + *atomic = newval; + __sync_synchronize (); +} + +#define __G_ATOMIC_C__ +#include "galiasdef.c" diff --git a/glib/gatomic.c b/glib/gatomic.c new file mode 100644 index 0000000..baa73e7 --- /dev/null +++ b/glib/gatomic.c @@ -0,0 +1,1058 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * g_atomic_*: atomic operations. + * Copyright (C) 2003 Sebastian Wilhelmi + * Copyright (C) 2007 Nokia Corporation + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#if defined (G_ATOMIC_ARM) +#include +#endif + +#include "glib.h" +#include "gthreadprivate.h" +#include "galias.h" + +#if defined (__GNUC__) +# if defined (G_ATOMIC_I486) +/* Adapted from CVS version 1.10 of glibc's sysdeps/i386/i486/bits/atomic.h + */ +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + + __asm__ __volatile__ ("lock; xaddl %0,%1" + : "=r" (result), "=m" (*atomic) + : "0" (val), "m" (*atomic)); + return result; +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + __asm__ __volatile__ ("lock; addl %1,%0" + : "=m" (*atomic) + : "ir" (val), "m" (*atomic)); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + gint result; + + __asm__ __volatile__ ("lock; cmpxchgl %2, %1" + : "=a" (result), "=m" (*atomic) + : "r" (newval), "m" (*atomic), "0" (oldval)); + + return result == oldval; +} + +/* The same code as above, as on i386 gpointer is 32 bit as well. + * Duplicating the code here seems more natural than casting the + * arguments and calling the former function */ + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result; + + __asm__ __volatile__ ("lock; cmpxchgl %2, %1" + : "=a" (result), "=m" (*atomic) + : "r" (newval), "m" (*atomic), "0" (oldval)); + + return result == oldval; +} + +# elif defined (G_ATOMIC_SPARCV9) +/* Adapted from CVS version 1.3 of glibc's sysdeps/sparc/sparc64/bits/atomic.h + */ +# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \ + ({ \ + gint __result; \ + __asm__ __volatile__ ("cas [%4], %2, %0" \ + : "=r" (__result), "=m" (*(atomic)) \ + : "r" (oldval), "m" (*(atomic)), "r" (atomic),\ + "0" (newval)); \ + __result == oldval; \ + }) + +# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result; + __asm__ __volatile__ ("cas [%4], %2, %0" + : "=r" (result), "=m" (*atomic) + : "r" (oldval), "m" (*atomic), "r" (atomic), + "0" (newval)); + return result == oldval; +} +# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result; + gpointer *a = atomic; + __asm__ __volatile__ ("casx [%4], %2, %0" + : "=r" (result), "=m" (*a) + : "r" (oldval), "m" (*a), "r" (a), + "0" (newval)); + return result == oldval; +} +# else /* What's that */ +# error "Your system has an unsupported pointer size" +# endif /* GLIB_SIZEOF_VOID_P */ +# define G_ATOMIC_MEMORY_BARRIER \ + __asm__ __volatile__ ("membar #LoadLoad | #LoadStore" \ + " | #StoreLoad | #StoreStore" : : : "memory") + +# elif defined (G_ATOMIC_ALPHA) +/* Adapted from CVS version 1.3 of glibc's sysdeps/alpha/bits/atomic.h + */ +# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \ + ({ \ + gint __result; \ + gint __prev; \ + __asm__ __volatile__ ( \ + " mb\n" \ + "1: ldl_l %0,%2\n" \ + " cmpeq %0,%3,%1\n" \ + " beq %1,2f\n" \ + " mov %4,%1\n" \ + " stl_c %1,%2\n" \ + " beq %1,1b\n" \ + " mb\n" \ + "2:" \ + : "=&r" (__prev), \ + "=&r" (__result) \ + : "m" (*(atomic)), \ + "Ir" (oldval), \ + "Ir" (newval) \ + : "memory"); \ + __result != 0; \ + }) +# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gint result; + gpointer prev; + __asm__ __volatile__ ( + " mb\n" + "1: ldl_l %0,%2\n" + " cmpeq %0,%3,%1\n" + " beq %1,2f\n" + " mov %4,%1\n" + " stl_c %1,%2\n" + " beq %1,1b\n" + " mb\n" + "2:" + : "=&r" (prev), + "=&r" (result) + : "m" (*atomic), + "Ir" (oldval), + "Ir" (newval) + : "memory"); + return result != 0; +} +# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gint result; + gpointer prev; + __asm__ __volatile__ ( + " mb\n" + "1: ldq_l %0,%2\n" + " cmpeq %0,%3,%1\n" + " beq %1,2f\n" + " mov %4,%1\n" + " stq_c %1,%2\n" + " beq %1,1b\n" + " mb\n" + "2:" + : "=&r" (prev), + "=&r" (result) + : "m" (*atomic), + "Ir" (oldval), + "Ir" (newval) + : "memory"); + return result != 0; +} +# else /* What's that */ +# error "Your system has an unsupported pointer size" +# endif /* GLIB_SIZEOF_VOID_P */ +# define G_ATOMIC_MEMORY_BARRIER __asm__ ("mb" : : : "memory") +# elif defined (G_ATOMIC_X86_64) +/* Adapted from CVS version 1.9 of glibc's sysdeps/x86_64/bits/atomic.h + */ +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + + __asm__ __volatile__ ("lock; xaddl %0,%1" + : "=r" (result), "=m" (*atomic) + : "0" (val), "m" (*atomic)); + return result; +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + __asm__ __volatile__ ("lock; addl %1,%0" + : "=m" (*atomic) + : "ir" (val), "m" (*atomic)); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + gint result; + + __asm__ __volatile__ ("lock; cmpxchgl %2, %1" + : "=a" (result), "=m" (*atomic) + : "r" (newval), "m" (*atomic), "0" (oldval)); + + return result == oldval; +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result; + + __asm__ __volatile__ ("lock; cmpxchgq %q2, %1" + : "=a" (result), "=m" (*atomic) + : "r" (newval), "m" (*atomic), "0" (oldval)); + + return result == oldval; +} + +# elif defined (G_ATOMIC_POWERPC) +/* Adapted from CVS version 1.16 of glibc's sysdeps/powerpc/bits/atomic.h + * and CVS version 1.4 of glibc's sysdeps/powerpc/powerpc32/bits/atomic.h + * and CVS version 1.7 of glibc's sysdeps/powerpc/powerpc64/bits/atomic.h + */ +# ifdef __OPTIMIZE__ +/* Non-optimizing compile bails on the following two asm statements + * for reasons unknown to the author */ +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result, temp; +#if ASM_NUMERIC_LABELS + __asm__ __volatile__ ("1: lwarx %0,0,%3\n" + " add %1,%0,%4\n" + " stwcx. %1,0,%3\n" + " bne- 1b" + : "=&b" (result), "=&r" (temp), "=m" (*atomic) + : "b" (atomic), "r" (val), "m" (*atomic) + : "cr0", "memory"); +#else + __asm__ __volatile__ (".Lieaa%=: lwarx %0,0,%3\n" + " add %1,%0,%4\n" + " stwcx. %1,0,%3\n" + " bne- .Lieaa%=" + : "=&b" (result), "=&r" (temp), "=m" (*atomic) + : "b" (atomic), "r" (val), "m" (*atomic) + : "cr0", "memory"); +#endif + return result; +} + +/* The same as above, to save a function call repeated here */ +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result, temp; +#if ASM_NUMERIC_LABELS + __asm__ __volatile__ ("1: lwarx %0,0,%3\n" + " add %1,%0,%4\n" + " stwcx. %1,0,%3\n" + " bne- 1b" + : "=&b" (result), "=&r" (temp), "=m" (*atomic) + : "b" (atomic), "r" (val), "m" (*atomic) + : "cr0", "memory"); +#else + __asm__ __volatile__ (".Lia%=: lwarx %0,0,%3\n" + " add %1,%0,%4\n" + " stwcx. %1,0,%3\n" + " bne- .Lia%=" + : "=&b" (result), "=&r" (temp), "=m" (*atomic) + : "b" (atomic), "r" (val), "m" (*atomic) + : "cr0", "memory"); +#endif +} +# else /* !__OPTIMIZE__ */ +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + do + result = *atomic; + while (!g_atomic_int_compare_and_exchange (atomic, result, result + val)); + + return result; +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + do + result = *atomic; + while (!g_atomic_int_compare_and_exchange (atomic, result, result + val)); +} +# endif /* !__OPTIMIZE__ */ + +# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */ +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + gint result; +#if ASM_NUMERIC_LABELS + __asm__ __volatile__ ("sync\n" + "1: lwarx %0,0,%1\n" + " subf. %0,%2,%0\n" + " bne 2f\n" + " stwcx. %3,0,%1\n" + " bne- 1b\n" + "2: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#else + __asm__ __volatile__ ("sync\n" + ".L1icae%=: lwarx %0,0,%1\n" + " subf. %0,%2,%0\n" + " bne .L2icae%=\n" + " stwcx. %3,0,%1\n" + " bne- .L1icae%=\n" + ".L2icae%=: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#endif + return result == 0; +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result; +#if ASM_NUMERIC_LABELS + __asm__ __volatile__ ("sync\n" + "1: lwarx %0,0,%1\n" + " subf. %0,%2,%0\n" + " bne 2f\n" + " stwcx. %3,0,%1\n" + " bne- 1b\n" + "2: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#else + __asm__ __volatile__ ("sync\n" + ".L1pcae%=: lwarx %0,0,%1\n" + " subf. %0,%2,%0\n" + " bne .L2pcae%=\n" + " stwcx. %3,0,%1\n" + " bne- .L1pcae%=\n" + ".L2pcae%=: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#endif + return result == 0; +} +# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */ +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + gpointer result; +#if ASM_NUMERIC_LABELS + __asm__ __volatile__ ("sync\n" + "1: lwarx %0,0,%1\n" + " extsw %0,%0\n" + " subf. %0,%2,%0\n" + " bne 2f\n" + " stwcx. %3,0,%1\n" + " bne- 1b\n" + "2: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#else + __asm__ __volatile__ ("sync\n" + ".L1icae%=: lwarx %0,0,%1\n" + " extsw %0,%0\n" + " subf. %0,%2,%0\n" + " bne .L2icae%=\n" + " stwcx. %3,0,%1\n" + " bne- .L1icae%=\n" + ".L2icae%=: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#endif + return result == 0; +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result; +#if ASM_NUMERIC_LABELS + __asm__ __volatile__ ("sync\n" + "1: ldarx %0,0,%1\n" + " subf. %0,%2,%0\n" + " bne 2f\n" + " stdcx. %3,0,%1\n" + " bne- 1b\n" + "2: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#else + __asm__ __volatile__ ("sync\n" + ".L1pcae%=: ldarx %0,0,%1\n" + " subf. %0,%2,%0\n" + " bne .L2pcae%=\n" + " stdcx. %3,0,%1\n" + " bne- .L1pcae%=\n" + ".L2pcae%=: isync" + : "=&r" (result) + : "b" (atomic), "r" (oldval), "r" (newval) + : "cr0", "memory"); +#endif + return result == 0; +} +# else /* What's that */ +# error "Your system has an unsupported pointer size" +# endif /* GLIB_SIZEOF_VOID_P */ + +# define G_ATOMIC_MEMORY_BARRIER __asm__ ("sync" : : : "memory") + +# elif defined (G_ATOMIC_IA64) +/* Adapted from CVS version 1.8 of glibc's sysdeps/ia64/bits/atomic.h + */ +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + return __sync_fetch_and_add (atomic, val); +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + __sync_fetch_and_add (atomic, val); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + return __sync_bool_compare_and_swap (atomic, oldval, newval); +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + return __sync_bool_compare_and_swap ((long *)atomic, + (long)oldval, (long)newval); +} + +# define G_ATOMIC_MEMORY_BARRIER __sync_synchronize () +# elif defined (G_ATOMIC_S390) +/* Adapted from glibc's sysdeps/s390/bits/atomic.h + */ +# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \ + ({ \ + gint __result = oldval; \ + __asm__ __volatile__ ("cs %0, %2, %1" \ + : "+d" (__result), "=Q" (*(atomic)) \ + : "d" (newval), "m" (*(atomic)) : "cc" ); \ + __result == oldval; \ + }) + +# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result = oldval; + __asm__ __volatile__ ("cs %0, %2, %1" + : "+d" (result), "=Q" (*(atomic)) + : "d" (newval), "m" (*(atomic)) : "cc" ); + return result == oldval; +} +# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */ +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gpointer result = oldval; + gpointer *a = atomic; + __asm__ __volatile__ ("csg %0, %2, %1" + : "+d" (result), "=Q" (*a) + : "d" ((long)(newval)), "m" (*a) : "cc" ); + return result == oldval; +} +# else /* What's that */ +# error "Your system has an unsupported pointer size" +# endif /* GLIB_SIZEOF_VOID_P */ +# elif defined (G_ATOMIC_ARM) +static volatile int atomic_spin = 0; + +static int atomic_spin_trylock (void) +{ + int result; + + asm volatile ( + "swp %0, %1, [%2]\n" + : "=&r,&r" (result) + : "r,0" (1), "r,r" (&atomic_spin) + : "memory"); + if (result == 0) + return 0; + else + return -1; +} + +static void atomic_spin_lock (void) +{ + while (atomic_spin_trylock()) + sched_yield(); +} + +static void atomic_spin_unlock (void) +{ + atomic_spin = 0; +} + +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + + atomic_spin_lock(); + result = *atomic; + *atomic += val; + atomic_spin_unlock(); + + return result; +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + atomic_spin_lock(); + *atomic += val; + atomic_spin_unlock(); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + gboolean result; + + atomic_spin_lock(); + if (*atomic == oldval) + { + result = TRUE; + *atomic = newval; + } + else + result = FALSE; + atomic_spin_unlock(); + + return result; +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gboolean result; + + atomic_spin_lock(); + if (*atomic == oldval) + { + result = TRUE; + *atomic = newval; + } + else + result = FALSE; + atomic_spin_unlock(); + + return result; +} +# elif defined (G_ATOMIC_CRIS) || defined (G_ATOMIC_CRISV32) +# ifdef G_ATOMIC_CRIS +# define CRIS_ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \ + ({ \ + gboolean __result; \ + __asm__ __volatile__ ("\n" \ + "0:\tclearf\n\t" \ + "cmp.d [%[Atomic]], %[OldVal]\n\t" \ + "bne 1f\n\t" \ + "ax\n\t" \ + "move.d %[NewVal], [%[Atomic]]\n\t" \ + "bwf 0b\n" \ + "1:\tseq %[Result]" \ + : [Result] "=&r" (__result), \ + "=m" (*(atomic)) \ + : [Atomic] "r" (atomic), \ + [OldVal] "r" (oldval), \ + [NewVal] "r" (newval), \ + "g" (*(gpointer*) (atomic)) \ + : "memory"); \ + __result; \ + }) +# else +# define CRIS_ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \ + ({ \ + gboolean __result; \ + __asm__ __volatile__ ("\n" \ + "0:\tclearf p\n\t" \ + "cmp.d [%[Atomic]], %[OldVal]\n\t" \ + "bne 1f\n\t" \ + "ax\n\t" \ + "move.d %[NewVal], [%[Atomic]]\n\t" \ + "bcs 0b\n" \ + "1:\tseq %[Result]" \ + : [Result] "=&r" (__result), \ + "=m" (*(atomic)) \ + : [Atomic] "r" (atomic), \ + [OldVal] "r" (oldval), \ + [NewVal] "r" (newval), \ + "g" (*(gpointer*) (atomic)) \ + : "memory"); \ + __result; \ + }) +# endif + +#define CRIS_CACHELINE_SIZE 32 +#define CRIS_ATOMIC_BREAKS_CACHELINE(atomic) \ + (((gulong)(atomic) & (CRIS_CACHELINE_SIZE - 1)) > (CRIS_CACHELINE_SIZE - sizeof (atomic))) + +gint __g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val); +void __g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val); +gboolean __g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval); +gboolean __g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval); + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + if (G_UNLIKELY (CRIS_ATOMIC_BREAKS_CACHELINE (atomic))) + return __g_atomic_pointer_compare_and_exchange (atomic, oldval, newval); + + return CRIS_ATOMIC_INT_CMP_XCHG (atomic, oldval, newval); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + if (G_UNLIKELY (CRIS_ATOMIC_BREAKS_CACHELINE (atomic))) + return __g_atomic_int_compare_and_exchange (atomic, oldval, newval); + + return CRIS_ATOMIC_INT_CMP_XCHG (atomic, oldval, newval); +} + +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + + if (G_UNLIKELY (CRIS_ATOMIC_BREAKS_CACHELINE (atomic))) + return __g_atomic_int_exchange_and_add (atomic, val); + + do + result = *atomic; + while (!CRIS_ATOMIC_INT_CMP_XCHG (atomic, result, result + val)); + + return result; +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + + if (G_UNLIKELY (CRIS_ATOMIC_BREAKS_CACHELINE (atomic))) + return __g_atomic_int_add (atomic, val); + + do + result = *atomic; + while (!CRIS_ATOMIC_INT_CMP_XCHG (atomic, result, result + val)); +} + +/* We need the atomic mutex for atomic operations where the atomic variable + * breaks the 32 byte cache line since the CRIS architecture does not support + * atomic operations on such variables. Fortunately this should be rare. + */ +# define DEFINE_WITH_MUTEXES +# define g_atomic_int_exchange_and_add __g_atomic_int_exchange_and_add +# define g_atomic_int_add __g_atomic_int_add +# define g_atomic_int_compare_and_exchange __g_atomic_int_compare_and_exchange +# define g_atomic_pointer_compare_and_exchange __g_atomic_pointer_compare_and_exchange + +# else /* !G_ATOMIC_* */ +# define DEFINE_WITH_MUTEXES +# endif /* G_ATOMIC_* */ +#else /* !__GNUC__ */ +# ifdef G_PLATFORM_WIN32 +# define DEFINE_WITH_WIN32_INTERLOCKED +# else +# define DEFINE_WITH_MUTEXES +# endif +#endif /* __GNUC__ */ + +#ifdef DEFINE_WITH_WIN32_INTERLOCKED +# include +/* Following indicates that InterlockedCompareExchangePointer is + * declared in winbase.h (included by windows.h) and needs to be + * commented out if not true. It is defined iff WINVER > 0x0400, + * which is usually correct but can be wrong if WINVER is set before + * windows.h is included. + */ +# if WINVER > 0x0400 +# define HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER +# endif + +gint32 +g_atomic_int_exchange_and_add (volatile gint32 G_GNUC_MAY_ALIAS *atomic, + gint32 val) +{ + return InterlockedExchangeAdd (atomic, val); +} + +void +g_atomic_int_add (volatile gint32 G_GNUC_MAY_ALIAS *atomic, + gint32 val) +{ + InterlockedExchangeAdd (atomic, val); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint32 G_GNUC_MAY_ALIAS *atomic, + gint32 oldval, + gint32 newval) +{ +#ifndef HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER + return (guint32) InterlockedCompareExchange ((PVOID*)atomic, + (PVOID)newval, + (PVOID)oldval) == oldval; +#else + return InterlockedCompareExchange (atomic, + newval, + oldval) == oldval; +#endif +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ +# ifdef HAVE_INTERLOCKED_COMPARE_EXCHANGE_POINTER + return InterlockedCompareExchangePointer (atomic, newval, oldval) == oldval; +# else +# if GLIB_SIZEOF_VOID_P != 4 /* no 32-bit system */ +# error "InterlockedCompareExchangePointer needed" +# else + return InterlockedCompareExchange (atomic, newval, oldval) == oldval; +# endif +# endif +} +#endif /* DEFINE_WITH_WIN32_INTERLOCKED */ + +#ifdef DEFINE_WITH_MUTEXES +/* We have to use the slow, but safe locking method */ +static GMutex *g_atomic_mutex; + +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + + g_mutex_lock (g_atomic_mutex); + result = *atomic; + *atomic += val; + g_mutex_unlock (g_atomic_mutex); + + return result; +} + + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + g_mutex_lock (g_atomic_mutex); + *atomic += val; + g_mutex_unlock (g_atomic_mutex); +} + +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + gboolean result; + + g_mutex_lock (g_atomic_mutex); + if (*atomic == oldval) + { + result = TRUE; + *atomic = newval; + } + else + result = FALSE; + g_mutex_unlock (g_atomic_mutex); + + return result; +} + +gboolean +g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval) +{ + gboolean result; + + g_mutex_lock (g_atomic_mutex); + if (*atomic == oldval) + { + result = TRUE; + *atomic = newval; + } + else + result = FALSE; + g_mutex_unlock (g_atomic_mutex); + + return result; +} + +#ifdef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED +gint +(g_atomic_int_get) (volatile gint G_GNUC_MAY_ALIAS *atomic) +{ + gint result; + + g_mutex_lock (g_atomic_mutex); + result = *atomic; + g_mutex_unlock (g_atomic_mutex); + + return result; +} + +void +(g_atomic_int_set) (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint newval) +{ + g_mutex_lock (g_atomic_mutex); + *atomic = newval; + g_mutex_unlock (g_atomic_mutex); +} + +gpointer +(g_atomic_pointer_get) (volatile gpointer G_GNUC_MAY_ALIAS *atomic) +{ + gpointer result; + + g_mutex_lock (g_atomic_mutex); + result = *atomic; + g_mutex_unlock (g_atomic_mutex); + + return result; +} + +void +(g_atomic_pointer_set) (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer newval) +{ + g_mutex_lock (g_atomic_mutex); + *atomic = newval; + g_mutex_unlock (g_atomic_mutex); +} +#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ +#elif defined (G_ATOMIC_OP_MEMORY_BARRIER_NEEDED) +gint +(g_atomic_int_get) (volatile gint G_GNUC_MAY_ALIAS *atomic) +{ + G_ATOMIC_MEMORY_BARRIER; + return *atomic; +} + +void +(g_atomic_int_set) (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint newval) +{ + *atomic = newval; + G_ATOMIC_MEMORY_BARRIER; +} + +gpointer +(g_atomic_pointer_get) (volatile gpointer G_GNUC_MAY_ALIAS *atomic) +{ + G_ATOMIC_MEMORY_BARRIER; + return *atomic; +} + +void +(g_atomic_pointer_set) (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer newval) +{ + *atomic = newval; + G_ATOMIC_MEMORY_BARRIER; +} +#endif /* DEFINE_WITH_MUTEXES || G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ + +#ifdef ATOMIC_INT_CMP_XCHG +gboolean +g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval) +{ + return ATOMIC_INT_CMP_XCHG (atomic, oldval, newval); +} + +gint +g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + do + result = *atomic; + while (!ATOMIC_INT_CMP_XCHG (atomic, result, result + val)); + + return result; +} + +void +g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val) +{ + gint result; + do + result = *atomic; + while (!ATOMIC_INT_CMP_XCHG (atomic, result, result + val)); +} +#endif /* ATOMIC_INT_CMP_XCHG */ + +void +_g_atomic_thread_init (void) +{ +#ifdef DEFINE_WITH_MUTEXES + g_atomic_mutex = g_mutex_new (); +#endif /* DEFINE_WITH_MUTEXES */ +} + +#ifndef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED +gint +(g_atomic_int_get) (volatile gint G_GNUC_MAY_ALIAS *atomic) +{ + return g_atomic_int_get (atomic); +} + +void +(g_atomic_int_set) (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint newval) +{ + g_atomic_int_set (atomic, newval); +} + +gpointer +(g_atomic_pointer_get) (volatile gpointer G_GNUC_MAY_ALIAS *atomic) +{ + return g_atomic_pointer_get (atomic); +} + +void +(g_atomic_pointer_set) (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer newval) +{ + g_atomic_pointer_set (atomic, newval); +} +#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ + +#define __G_ATOMIC_C__ +#include "galiasdef.c" diff --git a/glib/gatomic.h b/glib/gatomic.h new file mode 100644 index 0000000..7d9c318 --- /dev/null +++ b/glib/gatomic.h @@ -0,0 +1,85 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * g_atomic_*: atomic operations. + * Copyright (C) 2003 Sebastian Wilhelmi + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ATOMIC_H__ +#define __G_ATOMIC_H__ + +#include + +G_BEGIN_DECLS + +gint g_atomic_int_exchange_and_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val); +void g_atomic_int_add (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint val); +gboolean g_atomic_int_compare_and_exchange (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint oldval, + gint newval); +gboolean g_atomic_pointer_compare_and_exchange (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer oldval, + gpointer newval); + +gint g_atomic_int_get (volatile gint G_GNUC_MAY_ALIAS *atomic); +void g_atomic_int_set (volatile gint G_GNUC_MAY_ALIAS *atomic, + gint newval); +gpointer g_atomic_pointer_get (volatile gpointer G_GNUC_MAY_ALIAS *atomic); +void g_atomic_pointer_set (volatile gpointer G_GNUC_MAY_ALIAS *atomic, + gpointer newval); + +#ifndef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED +# define g_atomic_int_get(atomic) ((gint)*(atomic)) +# define g_atomic_int_set(atomic, newval) ((void) (*(atomic) = (newval))) +# define g_atomic_pointer_get(atomic) ((gpointer)*(atomic)) +# define g_atomic_pointer_set(atomic, newval) ((void) (*(atomic) = (newval))) +#else +# define g_atomic_int_get(atomic) \ + ((void) sizeof (gchar [sizeof (*(atomic)) == sizeof (gint) ? 1 : -1]), \ + (g_atomic_int_get) ((volatile gint G_GNUC_MAY_ALIAS *) (void *) (atomic))) +# define g_atomic_int_set(atomic, newval) \ + ((void) sizeof (gchar [sizeof (*(atomic)) == sizeof (gint) ? 1 : -1]), \ + (g_atomic_int_set) ((volatile gint G_GNUC_MAY_ALIAS *) (void *) (atomic), (newval))) +# define g_atomic_pointer_get(atomic) \ + ((void) sizeof (gchar [sizeof (*(atomic)) == sizeof (gpointer) ? 1 : -1]), \ + (g_atomic_pointer_get) ((volatile gpointer G_GNUC_MAY_ALIAS *) (void *) (atomic))) +# define g_atomic_pointer_set(atomic, newval) \ + ((void) sizeof (gchar [sizeof (*(atomic)) == sizeof (gpointer) ? 1 : -1]), \ + (g_atomic_pointer_set) ((volatile gpointer G_GNUC_MAY_ALIAS *) (void *) (atomic), (newval))) +#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ + +#define g_atomic_int_inc(atomic) (g_atomic_int_add ((atomic), 1)) +#define g_atomic_int_dec_and_test(atomic) \ + (g_atomic_int_exchange_and_add ((atomic), -1) == 1) + +G_END_DECLS + +#endif /* __G_ATOMIC_H__ */ diff --git a/glib/gbacktrace.c b/glib/gbacktrace.c new file mode 100644 index 0000000..238d9cf --- /dev/null +++ b/glib/gbacktrace.c @@ -0,0 +1,308 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe ; except for g_on_error_stack_trace, but who wants thread safety + * then + */ + +#include "config.h" + +#include +#include +#include +#include +#include "glib.h" +#include "gprintfint.h" + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_TIMES_H +#include +#endif +#include +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* HAVE_SYS_SELECT_H */ + +#include /* for bzero on BSD systems */ + +#ifdef G_OS_WIN32 +# define STRICT /* Strict typing, please */ +# define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */ +# include +# undef STRICT +#endif + +#ifndef NO_FD_SET +# define SELECT_MASK fd_set +#else +# if defined(_IBMR2) +# define SELECT_MASK void +# else +# define SELECT_MASK int +# endif +#endif + +#include "galias.h" + +#ifndef G_OS_WIN32 +static void stack_trace (char **args); +#endif + +extern volatile gboolean glib_on_error_halt; +volatile gboolean glib_on_error_halt = TRUE; + +void +g_on_error_query (const gchar *prg_name) +{ +#ifndef G_OS_WIN32 + static const gchar * const query1 = "[E]xit, [H]alt"; + static const gchar * const query2 = ", show [S]tack trace"; + static const gchar * const query3 = " or [P]roceed"; + gchar buf[16]; + + if (!prg_name) + prg_name = g_get_prgname (); + + retry: + + if (prg_name) + _g_fprintf (stdout, + "%s (pid:%u): %s%s%s: ", + prg_name, + (guint) getpid (), + query1, + query2, + query3); + else + _g_fprintf (stdout, + "(process:%u): %s%s: ", + (guint) getpid (), + query1, + query3); + fflush (stdout); + + if (isatty(0) && isatty(1)) + fgets (buf, 8, stdin); + else + strcpy (buf, "E\n"); + + if ((buf[0] == 'E' || buf[0] == 'e') + && buf[1] == '\n') + _exit (0); + else if ((buf[0] == 'P' || buf[0] == 'p') + && buf[1] == '\n') + return; + else if (prg_name + && (buf[0] == 'S' || buf[0] == 's') + && buf[1] == '\n') + { + g_on_error_stack_trace (prg_name); + goto retry; + } + else if ((buf[0] == 'H' || buf[0] == 'h') + && buf[1] == '\n') + { + while (glib_on_error_halt) + ; + glib_on_error_halt = TRUE; + return; + } + else + goto retry; +#else + if (!prg_name) + prg_name = g_get_prgname (); + + MessageBox (NULL, "g_on_error_query called, program terminating", + (prg_name && *prg_name) ? prg_name : NULL, + MB_OK|MB_ICONERROR); + _exit(0); +#endif +} + +void +g_on_error_stack_trace (const gchar *prg_name) +{ +#if defined(G_OS_UNIX) || defined(G_OS_BEOS) + pid_t pid; + gchar buf[16]; + gchar *args[4] = { "gdb", NULL, NULL, NULL }; + int status; + + if (!prg_name) + return; + + _g_sprintf (buf, "%u", (guint) getpid ()); + + args[1] = (gchar*) prg_name; + args[2] = buf; + + pid = fork (); + if (pid == 0) + { + stack_trace (args); + _exit (0); + } + else if (pid == (pid_t) -1) + { + perror ("unable to fork gdb"); + return; + } + + waitpid (pid, &status, 0); +#else + if (IsDebuggerPresent ()) + G_BREAKPOINT (); + else + abort (); +#endif +} + +#ifndef G_OS_WIN32 + +static gboolean stack_trace_done = FALSE; + +static void +stack_trace_sigchld (int signum) +{ + stack_trace_done = TRUE; +} + +static void +stack_trace (char **args) +{ + pid_t pid; + int in_fd[2]; + int out_fd[2]; + SELECT_MASK fdset; + SELECT_MASK readset; + struct timeval tv; + int sel, idx, state; + char buffer[256]; + char c; + + stack_trace_done = FALSE; + signal (SIGCHLD, stack_trace_sigchld); + + if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1)) + { + perror ("unable to open pipe"); + _exit (0); + } + + pid = fork (); + if (pid == 0) + { + close (0); dup (in_fd[0]); /* set the stdin to the in pipe */ + close (1); dup (out_fd[1]); /* set the stdout to the out pipe */ + close (2); dup (out_fd[1]); /* set the stderr to the out pipe */ + + execvp (args[0], args); /* exec gdb */ + perror ("exec failed"); + _exit (0); + } + else if (pid == (pid_t) -1) + { + perror ("unable to fork"); + _exit (0); + } + + FD_ZERO (&fdset); + FD_SET (out_fd[0], &fdset); + + write (in_fd[1], "backtrace\n", 10); + write (in_fd[1], "p x = 0\n", 8); + write (in_fd[1], "quit\n", 5); + + idx = 0; + state = 0; + + while (1) + { + readset = fdset; + tv.tv_sec = 1; + tv.tv_usec = 0; + + sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv); + if (sel == -1) + break; + + if ((sel > 0) && (FD_ISSET (out_fd[0], &readset))) + { + if (read (out_fd[0], &c, 1)) + { + switch (state) + { + case 0: + if (c == '#') + { + state = 1; + idx = 0; + buffer[idx++] = c; + } + break; + case 1: + buffer[idx++] = c; + if ((c == '\n') || (c == '\r')) + { + buffer[idx] = 0; + _g_fprintf (stdout, "%s", buffer); + state = 0; + idx = 0; + } + break; + default: + break; + } + } + } + else if (stack_trace_done) + break; + } + + close (in_fd[0]); + close (in_fd[1]); + close (out_fd[0]); + close (out_fd[1]); + _exit (0); +} + +#endif /* !G_OS_WIN32 */ + +#define __G_BACKTRACE_C__ +#include "galiasdef.c" diff --git a/glib/gbacktrace.h b/glib/gbacktrace.h new file mode 100644 index 0000000..2e74b49 --- /dev/null +++ b/glib/gbacktrace.h @@ -0,0 +1,68 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_BACKTRACE_H__ +#define __G_BACKTRACE_H__ + +#include +#include + +G_BEGIN_DECLS + +/* Fatal error handlers. + * g_on_error_query() will prompt the user to either + * [E]xit, [H]alt, [P]roceed or show [S]tack trace. + * g_on_error_stack_trace() invokes gdb, which attaches to the current + * process and shows a stack trace. + * These function may cause different actions on non-unix platforms. + * The prg_name arg is required by gdb to find the executable, if it is + * passed as NULL, g_on_error_query() will try g_get_prgname(). + */ +void g_on_error_query (const gchar *prg_name); +void g_on_error_stack_trace (const gchar *prg_name); + +/* Hacker macro to place breakpoints for selected machines. + * Actual use is strongly discouraged of course ;) + */ +#if (defined (__i386__) || defined (__x86_64__)) && defined (__GNUC__) && __GNUC__ >= 2 +# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("int $03"); }G_STMT_END +#elif (defined (_MSC_VER) || defined (__DMC__)) && defined (_M_IX86) +# define G_BREAKPOINT() G_STMT_START{ __asm int 3h }G_STMT_END +#elif defined (_MSC_VER) +# define G_BREAKPOINT() G_STMT_START{ __debugbreak(); }G_STMT_END +#elif defined (__alpha__) && !defined(__osf__) && defined (__GNUC__) && __GNUC__ >= 2 +# define G_BREAKPOINT() G_STMT_START{ __asm__ __volatile__ ("bpt"); }G_STMT_END +#else /* !__i386__ && !__alpha__ */ +# define G_BREAKPOINT() G_STMT_START{ raise (SIGTRAP); }G_STMT_END +#endif /* __i386__ */ + +G_END_DECLS + +#endif /* __G_BACKTRACE_H__ */ diff --git a/glib/gbase64.c b/glib/gbase64.c new file mode 100644 index 0000000..59a911a --- /dev/null +++ b/glib/gbase64.c @@ -0,0 +1,447 @@ +/* gbase64.c - Base64 encoding/decoding + * + * Copyright (C) 2006 Alexander Larsson + * Copyright (C) 2000-2003 Ximian Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * This is based on code in camel, written by: + * Michael Zucchi + * Jeffrey Stedfast + */ + +#include "config.h" + +#include + +#include "gbase64.h" +#include "glib.h" +#include "glibintl.h" + +#include "galias.h" + +/** + * SECTION:base64 Base64 Encoding + * @short_description: encodes and decodes data in Base64 format + * + * Base64 is an encoding that allows a sequence of arbitrary bytes to be + * encoded as a sequence of printable ASCII characters. For the definition + * of Base64, see RFC + * 1421 or RFC + * 2045. Base64 is most commonly used as a MIME transfer encoding + * for email. + * + * GLib supports incremental encoding using g_base64_encode_step() and + * g_base64_encode_close(). Incremental decoding can be done with + * g_base64_decode_step(). To encode or decode data in one go, use + * g_base64_encode() or g_base64_decode(). To avoid memory allocation when + * decoding, you can use g_base64_decode_inplace(). + * + * Support for Base64 encoding has been added in GLib 2.12. + */ + +static const char base64_alphabet[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/** + * g_base64_encode_step: + * @in: the binary data to encode + * @len: the length of @in + * @break_lines: whether to break long lines + * @out: pointer to destination buffer + * @state: Saved state between steps, initialize to 0 + * @save: Saved state between steps, initialize to 0 + * + * Incrementally encode a sequence of binary data into its Base-64 stringified + * representation. By calling this function multiple times you can convert + * data in chunks to avoid having to have the full encoded data in memory. + * + * When all of the data has been converted you must call + * g_base64_encode_close() to flush the saved state. + * + * The output buffer must be large enough to fit all the data that will + * be written to it. Due to the way base64 encodes you will need + * at least: (@len / 3 + 1) * 4 + 4 bytes (+ 4 may be needed in case of + * non-zero state). If you enable line-breaking you will need at least: + * ((@len / 3 + 1) * 4 + 4) / 72 + 1 bytes of extra space. + * + * @break_lines is typically used when putting base64-encoded data in emails. + * It breaks the lines at 72 columns instead of putting all of the text on + * the same line. This avoids problems with long lines in the email system. + * + * Return value: The number of bytes of output that was written + * + * Since: 2.12 + */ +gsize +g_base64_encode_step (const guchar *in, + gsize len, + gboolean break_lines, + gchar *out, + gint *state, + gint *save) +{ + char *outptr; + const guchar *inptr; + + g_return_val_if_fail (in != NULL, 0); + g_return_val_if_fail (out != NULL, 0); + g_return_val_if_fail (state != NULL, 0); + g_return_val_if_fail (save != NULL, 0); + + if (len <= 0) + return 0; + + inptr = in; + outptr = out; + + if (len + ((char *) save) [0] > 2) + { + const guchar *inend = in+len-2; + int c1, c2, c3; + 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, + * it's 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 (break_lines && (++already) >= 19) + { + *outptr++ = '\n'; + already = 0; + } + } + + ((char *)save)[0] = 0; + len = 2 - (inptr - inend); + *state = already; + } + + if (len>0) + { + char *saveout; + + /* points to the slot for the next char to save */ + saveout = & (((char *)save)[1]) + ((char *)save)[0]; + + /* len can only be 0 1 or 2 */ + switch(len) + { + case 2: *saveout++ = *inptr++; + case 1: *saveout++ = *inptr++; + } + ((char *)save)[0] += len; + } + + return outptr - out; +} + +/** + * g_base64_encode_close: + * @break_lines: whether to break long lines + * @out: pointer to destination buffer + * @state: Saved state from g_base64_encode_step() + * @save: Saved state from g_base64_encode_step() + * + * Flush the status from a sequence of calls to g_base64_encode_step(). + * + * The output buffer must be large enough to fit all the data that will + * be written to it. It will need up to 4 bytes, or up to 5 bytes if + * line-breaking is enabled. + * + * Return value: The number of bytes of output that was written + * + * Since: 2.12 + */ +gsize +g_base64_encode_close (gboolean break_lines, + gchar *out, + gint *state, + gint *save) +{ + int c1, c2; + char *outptr = out; + + g_return_val_if_fail (out != NULL, 0); + g_return_val_if_fail (state != NULL, 0); + g_return_val_if_fail (save != NULL, 0); + + c1 = ((unsigned char *) save) [1]; + c2 = ((unsigned char *) save) [2]; + + switch (((char *) save) [0]) + { + case 2: + outptr [2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ]; + g_assert (outptr [2] != 0); + 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; + } + if (break_lines) + *outptr++ = '\n'; + + *save = 0; + *state = 0; + + return outptr - out; +} + +/** + * g_base64_encode: + * @data: the binary data to encode + * @len: the length of @data + * + * Encode a sequence of binary data into its Base-64 stringified + * representation. + * + * Return value: a newly allocated, zero-terminated Base-64 encoded + * string representing @data. The returned string must + * be freed with g_free(). + * + * Since: 2.12 + */ +gchar * +g_base64_encode (const guchar *data, + gsize len) +{ + gchar *out; + gint state = 0, outlen; + gint save = 0; + + g_return_val_if_fail (data != NULL, NULL); + g_return_val_if_fail (len > 0, NULL); + + /* We can use a smaller limit here, since we know the saved state is 0, + +1 is needed for trailing \0, also check for unlikely integer overflow */ + if (len >= ((G_MAXSIZE - 1) / 4 - 1) * 3) + g_error("%s: input too large for Base64 encoding (%"G_GSIZE_FORMAT" chars)", + G_STRLOC, len); + + out = g_malloc ((len / 3 + 1) * 4 + 1); + + outlen = g_base64_encode_step (data, len, FALSE, out, &state, &save); + outlen += g_base64_encode_close (FALSE, out + outlen, &state, &save); + out[outlen] = '\0'; + + return (gchar *) out; +} + +static const unsigned char mime_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, +}; + +/** + * g_base64_decode_step: + * @in: binary input data + * @len: max length of @in data to decode + * @out: output buffer + * @state: Saved state between steps, initialize to 0 + * @save: Saved state between steps, initialize to 0 + * + * Incrementally decode a sequence of binary data from its Base-64 stringified + * representation. By calling this function multiple times you can convert + * data in chunks to avoid having to have the full encoded data in memory. + * + * The output buffer must be large enough to fit all the data that will + * be written to it. Since base64 encodes 3 bytes in 4 chars you need + * at least: (@len / 4) * 3 + 3 bytes (+ 3 may be needed in case of non-zero + * state). + * + * Return value: The number of bytes of output that was written + * + * Since: 2.12 + **/ +gsize +g_base64_decode_step (const gchar *in, + gsize len, + guchar *out, + gint *state, + guint *save) +{ + const guchar *inptr; + guchar *outptr; + const guchar *inend; + guchar c, rank; + guchar last[2]; + unsigned int v; + int i; + + g_return_val_if_fail (in != NULL, 0); + g_return_val_if_fail (out != NULL, 0); + g_return_val_if_fail (state != NULL, 0); + g_return_val_if_fail (save != NULL, 0); + + if (len <= 0) + return 0; + + inend = (const guchar *)in+len; + outptr = out; + + /* convert 4 base64 bytes to 3 normal bytes */ + v=*save; + i=*state; + inptr = (const guchar *)in; + last[0] = last[1] = 0; + while (inptr < inend) + { + c = *inptr++; + rank = mime_base64_rank [c]; + if (rank != 0xff) + { + last[1] = last[0]; + last[0] = c; + v = (v<<6) | rank; + i++; + if (i==4) + { + *outptr++ = v>>16; + if (last[1] != '=') + *outptr++ = v>>8; + if (last[0] != '=') + *outptr++ = v; + i=0; + } + } + } + + *save = v; + *state = i; + + return outptr - out; +} + +/** + * g_base64_decode: + * @text: zero-terminated string with base64 text to decode + * @out_len: The length of the decoded data is written here + * + * Decode a sequence of Base-64 encoded text into binary data + * + * Return value: a newly allocated buffer containing the binary data + * that @text represents. The returned buffer must + * be freed with g_free(). + * + * Since: 2.12 + */ +guchar * +g_base64_decode (const gchar *text, + gsize *out_len) +{ + guchar *ret; + gsize input_length; + gint state = 0; + guint save = 0; + + g_return_val_if_fail (text != NULL, NULL); + g_return_val_if_fail (out_len != NULL, NULL); + + input_length = strlen (text); + + g_return_val_if_fail (input_length > 1, NULL); + + /* We can use a smaller limit here, since we know the saved state is 0, + +1 used to avoid calling g_malloc0(0), and hence retruning NULL */ + ret = g_malloc0 ((input_length / 4) * 3 + 1); + + *out_len = g_base64_decode_step (text, input_length, ret, &state, &save); + + return ret; +} + +/** + * g_base64_decode_inplace: + * @text: zero-terminated string with base64 text to decode + * @out_len: The length of the decoded data is written here + * + * Decode a sequence of Base-64 encoded text into binary data + * by overwriting the input data. + * + * Return value: The binary data that @text responds. This pointer + * is the same as the input @text. + * + * Since: 2.20 + */ +guchar * +g_base64_decode_inplace (gchar *text, + gsize *out_len) +{ + gint input_length, state = 0; + guint save = 0; + + g_return_val_if_fail (text != NULL, NULL); + g_return_val_if_fail (out_len != NULL, NULL); + + input_length = strlen (text); + + g_return_val_if_fail (input_length > 1, NULL); + + *out_len = g_base64_decode_step (text, input_length, (guchar *) text, &state, &save); + + return (guchar *) text; +} + + +#define __G_BASE64_C__ +#include "galiasdef.c" diff --git a/glib/gbase64.h b/glib/gbase64.h new file mode 100644 index 0000000..2f7c49f --- /dev/null +++ b/glib/gbase64.h @@ -0,0 +1,57 @@ +/* gbase64.h - Base64 coding functions + * + * Copyright (C) 2005 Alexander Larsson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_BASE64_H__ +#define __G_BASE64_H__ + +#include + +G_BEGIN_DECLS + +gsize g_base64_encode_step (const guchar *in, + gsize len, + gboolean break_lines, + gchar *out, + gint *state, + gint *save); +gsize g_base64_encode_close (gboolean break_lines, + gchar *out, + gint *state, + gint *save); +gchar* g_base64_encode (const guchar *data, + gsize len) G_GNUC_MALLOC; +gsize g_base64_decode_step (const gchar *in, + gsize len, + guchar *out, + gint *state, + guint *save); +guchar *g_base64_decode (const gchar *text, + gsize *out_len) G_GNUC_MALLOC; +guchar *g_base64_decode_inplace (gchar *text, + gsize *out_len); + + +G_END_DECLS + +#endif /* __G_BASE64_H__ */ diff --git a/glib/gbitlock.c b/glib/gbitlock.c new file mode 100644 index 0000000..915aa7c --- /dev/null +++ b/glib/gbitlock.c @@ -0,0 +1,300 @@ +/* + * Copyright © 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#include "gbitlock.h" + +#include +#include +#include + +#include "gthreadprivate.h" +#include "config.h" + +#include "galias.h" + +#ifdef G_BIT_LOCK_FORCE_FUTEX_EMULATION +#undef HAVE_FUTEX +#endif + +#ifndef HAVE_FUTEX +static GSList *g_futex_address_list = NULL; +static GMutex *g_futex_mutex = NULL; +#endif + +void +_g_futex_thread_init (void) { +#ifndef HAVE_FUTEX + g_futex_mutex = g_mutex_new (); +#endif +} + +#ifdef HAVE_FUTEX +/* + * We have headers for futex(2) on the build machine. This does not + * imply that every system that ever runs the resulting glib will have + * kernel support for futex, but you'd have to have a pretty old + * kernel in order for that not to be the case. + * + * If anyone actually gets bit by this, please file a bug. :) + */ +#include +#include +#include + +/* < private > + * g_futex_wait: + * @address: a pointer to an integer + * @value: the value that should be at @address + * + * Atomically checks that the value stored at @address is equal to + * @value and then blocks. If the value stored at @address is not + * equal to @value then this function returns immediately. + * + * To unblock, call g_futex_wake() on @address. + * + * This call may spuriously unblock (for example, in response to the + * process receiving a signal) but this is not guaranteed. Unlike the + * Linux system call of a similar name, there is no guarantee that a + * waiting process will unblock due to a g_futex_wake() call in a + * separate process. + */ +static void +g_futex_wait (const volatile gint *address, + gint value) +{ + syscall (SYS_futex, address, (gsize) FUTEX_WAIT, (gsize) value, NULL); +} + +/* < private > + * g_futex_wake: + * @address: a pointer to an integer + * + * Nominally, wakes one thread that is blocked in g_futex_wait() on + * @address (if any thread is currently waiting). + * + * As mentioned in the documention for g_futex_wait(), spurious + * wakeups may occur. As such, this call may result in more than one + * thread being woken up. + */ +static void +g_futex_wake (const volatile gint *address) +{ + syscall (SYS_futex, address, (gsize) FUTEX_WAKE, (gsize) 1, NULL); +} + +#else + +/* emulate futex(2) */ +typedef struct +{ + const volatile gint *address; + gint ref_count; + GCond *wait_queue; +} WaitAddress; + +static WaitAddress * +g_futex_find_address (const volatile gint *address) +{ + GSList *node; + + for (node = g_futex_address_list; node; node = node->next) + { + WaitAddress *waiter = node->data; + + if (waiter->address == address) + return waiter; + } + + return NULL; +} + +static void +g_futex_wait (const volatile gint *address, + gint value) +{ + g_mutex_lock (g_futex_mutex); + if G_LIKELY (g_atomic_int_get (address) == value) + { + WaitAddress *waiter; + + if ((waiter = g_futex_find_address (address)) == NULL) + { + waiter = g_slice_new (WaitAddress); + waiter->address = address; + waiter->wait_queue = g_cond_new (); + waiter->ref_count = 0; + g_futex_address_list = + g_slist_prepend (g_futex_address_list, waiter); + } + + waiter->ref_count++; + g_cond_wait (waiter->wait_queue, g_futex_mutex); + + if (!--waiter->ref_count) + { + g_futex_address_list = + g_slist_remove (g_futex_address_list, waiter); + g_cond_free (waiter->wait_queue); + g_slice_free (WaitAddress, waiter); + } + } + g_mutex_unlock (g_futex_mutex); +} + +static void +g_futex_wake (const volatile gint *address) +{ + WaitAddress *waiter; + + /* need to lock here for two reasons: + * 1) need to acquire/release lock to ensure waiter is not in + * the process of registering a wait + * 2) need to -stay- locked until the end to ensure a wake() + * in another thread doesn't cause 'waiter' to stop existing + */ + g_mutex_lock (g_futex_mutex); + if ((waiter = g_futex_find_address (address))) + g_cond_signal (waiter->wait_queue); + g_mutex_unlock (g_futex_mutex); +} +#endif + +#define CONTENTION_CLASSES 11 +static volatile gint g_bit_lock_contended[CONTENTION_CLASSES]; + +/** + * g_bit_lock: + * @address: a pointer to an integer + * @lock_bit: a bit value between 0 and 31 + * + * Sets the indicated @lock_bit in @address. If the bit is already + * set, this call will block until g_bit_unlock() unsets the + * corresponding bit. + * + * Attempting to lock on two different bits within the same integer is + * not supported and will very probably cause deadlocks. + * + * The value of the bit that is set is (1u << @bit). If @bit is not + * between 0 and 31 then the result is undefined. + * + * This function accesses @address atomically. All other accesses to + * @address must be atomic in order for this function to work + * reliably. + * + * Since: 2.24 + **/ +void +g_bit_lock (volatile gint *address, + gint lock_bit) +{ + guint v; + + retry: + v = g_atomic_int_get (address); + if (v & (1u << lock_bit)) + /* already locked */ + { + guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); + + g_atomic_int_add (&g_bit_lock_contended[class], +1); + g_futex_wait (address, v); + g_atomic_int_add (&g_bit_lock_contended[class], -1); + + goto retry; + } + + if (!g_atomic_int_compare_and_exchange (address, v, v | (1u << lock_bit))) + goto retry; +} + +/** + * g_bit_trylock: + * @address: a pointer to an integer + * @lock_bit: a bit value between 0 and 31 + * @returns: %TRUE if the lock was acquired + * + * Sets the indicated @lock_bit in @address, returning %TRUE if + * successful. If the bit is already set, returns %FALSE immediately. + * + * Attempting to lock on two different bits within the same integer is + * not supported. + * + * The value of the bit that is set is (1u << @bit). If @bit is not + * between 0 and 31 then the result is undefined. + * + * This function accesses @address atomically. All other accesses to + * @address must be atomic in order for this function to work + * reliably. + * + * Since: 2.24 + **/ +gboolean +g_bit_trylock (volatile gint *address, + gint lock_bit) +{ + guint v; + + retry: + v = g_atomic_int_get (address); + if (v & (1u << lock_bit)) + /* already locked */ + return FALSE; + + if (!g_atomic_int_compare_and_exchange (address, v, v | (1u << lock_bit))) + goto retry; + + return TRUE; +} + +/** + * g_bit_unlock: + * @address: a pointer to an integer + * @lock_bit: a bit value between 0 and 31 + * + * Clears the indicated @lock_bit in @address. If another thread is + * currently blocked in g_bit_lock() on this same bit then it will be + * woken up. + * + * This function accesses @address atomically. All other accesses to + * @address must be atomic in order for this function to work + * reliably. + * + * Since: 2.24 + **/ +void +g_bit_unlock (volatile gint *address, + gint lock_bit) +{ + guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); + guint v; + + retry: + v = g_atomic_int_get (address); + if (!g_atomic_int_compare_and_exchange (address, v, v & ~(1u << lock_bit))) + goto retry; + + if (g_atomic_int_get (&g_bit_lock_contended[class])) + g_futex_wake (address); +} + +#define __G_BITLOCK_C__ +#include "galiasdef.c" diff --git a/glib/gbitlock.h b/glib/gbitlock.h new file mode 100644 index 0000000..5f6a67f --- /dev/null +++ b/glib/gbitlock.h @@ -0,0 +1,43 @@ +/* + * Copyright © 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#ifndef __G_BITLOCK_H__ +#define __G_BITLOCK_H__ + +#include + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +G_BEGIN_DECLS + +void g_bit_lock (volatile gint *address, + gint lock_bit); +gboolean g_bit_trylock (volatile gint *address, + gint lock_bit); +void g_bit_unlock (volatile gint *address, + gint lock_bit); + +G_END_DECLS + +#endif /* __G_BITLOCK_H_ */ diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c new file mode 100644 index 0000000..01c7e63 --- /dev/null +++ b/glib/gbookmarkfile.c @@ -0,0 +1,3709 @@ +/* gbookmarkfile.c: parsing and building desktop bookmarks + * + * Copyright (C) 2005-2006 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + */ + +#include "config.h" + +#include "gbookmarkfile.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gconvert.h" +#include "gdataset.h" +#include "gerror.h" +#include "gfileutils.h" +#include "ghash.h" +#include "glibintl.h" +#include "glist.h" +#include "gslist.h" +#include "gmain.h" +#include "gmarkup.h" +#include "gmem.h" +#include "gmessages.h" +#include "gshell.h" +#include "gslice.h" +#include "gstdio.h" +#include "gstring.h" +#include "gstrfuncs.h" +#include "gtimer.h" +#include "gutils.h" + +#include "galias.h" + +/* XBEL 1.0 standard entities */ +#define XBEL_VERSION "1.0" +#define XBEL_DTD_NICK "xbel" +#define XBEL_DTD_SYSTEM "+//IDN python.org//DTD XML Bookmark " \ + "Exchange Language 1.0//EN//XML" + +#define XBEL_DTD_URI "http://www.python.org/topics/xml/dtds/xbel-1.0.dtd" + +#define XBEL_ROOT_ELEMENT "xbel" +#define XBEL_FOLDER_ELEMENT "folder" /* unused */ +#define XBEL_BOOKMARK_ELEMENT "bookmark" +#define XBEL_ALIAS_ELEMENT "alias" /* unused */ +#define XBEL_SEPARATOR_ELEMENT "separator" /* unused */ +#define XBEL_TITLE_ELEMENT "title" +#define XBEL_DESC_ELEMENT "desc" +#define XBEL_INFO_ELEMENT "info" +#define XBEL_METADATA_ELEMENT "metadata" + +#define XBEL_VERSION_ATTRIBUTE "version" +#define XBEL_FOLDED_ATTRIBUTE "folded" /* unused */ +#define XBEL_OWNER_ATTRIBUTE "owner" +#define XBEL_ADDED_ATTRIBUTE "added" +#define XBEL_VISITED_ATTRIBUTE "visited" +#define XBEL_MODIFIED_ATTRIBUTE "modified" +#define XBEL_ID_ATTRIBUTE "id" +#define XBEL_HREF_ATTRIBUTE "href" +#define XBEL_REF_ATTRIBUTE "ref" /* unused */ + +#define XBEL_YES_VALUE "yes" +#define XBEL_NO_VALUE "no" + +/* Desktop bookmark spec entities */ +#define BOOKMARK_METADATA_OWNER "http://freedesktop.org" + +#define BOOKMARK_NAMESPACE_NAME "bookmark" +#define BOOKMARK_NAMESPACE_URI "http://www.freedesktop.org/standards/desktop-bookmarks" + +#define BOOKMARK_GROUPS_ELEMENT "groups" +#define BOOKMARK_GROUP_ELEMENT "group" +#define BOOKMARK_APPLICATIONS_ELEMENT "applications" +#define BOOKMARK_APPLICATION_ELEMENT "application" +#define BOOKMARK_ICON_ELEMENT "icon" +#define BOOKMARK_PRIVATE_ELEMENT "private" + +#define BOOKMARK_NAME_ATTRIBUTE "name" +#define BOOKMARK_EXEC_ATTRIBUTE "exec" +#define BOOKMARK_COUNT_ATTRIBUTE "count" +#define BOOKMARK_TIMESTAMP_ATTRIBUTE "timestamp" /* deprecated by "modified" */ +#define BOOKMARK_MODIFIED_ATTRIBUTE "modified" +#define BOOKMARK_HREF_ATTRIBUTE "href" +#define BOOKMARK_TYPE_ATTRIBUTE "type" + +/* Shared MIME Info entities */ +#define MIME_NAMESPACE_NAME "mime" +#define MIME_NAMESPACE_URI "http://www.freedesktop.org/standards/shared-mime-info" +#define MIME_TYPE_ELEMENT "mime-type" +#define MIME_TYPE_ATTRIBUTE "type" + + +typedef struct _BookmarkAppInfo BookmarkAppInfo; +typedef struct _BookmarkMetadata BookmarkMetadata; +typedef struct _BookmarkItem BookmarkItem; +typedef struct _ParseData ParseData; + +struct _BookmarkAppInfo +{ + gchar *name; + gchar *exec; + + guint count; + + time_t stamp; +}; + +struct _BookmarkMetadata +{ + gchar *mime_type; + + GList *groups; + + GList *applications; + GHashTable *apps_by_name; + + gchar *icon_href; + gchar *icon_mime; + + guint is_private : 1; +}; + +struct _BookmarkItem +{ + gchar *uri; + + gchar *title; + gchar *description; + + time_t added; + time_t modified; + time_t visited; + + BookmarkMetadata *metadata; +}; + +struct _GBookmarkFile +{ + gchar *title; + gchar *description; + + /* we store our items in a list and keep a copy inside + * an hash table for faster lookup performances + */ + GList *items; + GHashTable *items_by_uri; +}; + +/* parser state machine */ +enum +{ + STATE_STARTED = 0, + + STATE_ROOT, + STATE_BOOKMARK, + STATE_TITLE, + STATE_DESC, + STATE_INFO, + STATE_METADATA, + STATE_APPLICATIONS, + STATE_APPLICATION, + STATE_GROUPS, + STATE_GROUP, + STATE_MIME, + STATE_ICON, + + STATE_FINISHED +}; + +static void g_bookmark_file_init (GBookmarkFile *bookmark); +static void g_bookmark_file_clear (GBookmarkFile *bookmark); +static gboolean g_bookmark_file_parse (GBookmarkFile *bookmark, + const gchar *buffer, + gsize length, + GError **error); +static gchar * g_bookmark_file_dump (GBookmarkFile *bookmark, + gsize *length, + GError **error); +static BookmarkItem *g_bookmark_file_lookup_item (GBookmarkFile *bookmark, + const gchar *uri); +static void g_bookmark_file_add_item (GBookmarkFile *bookmark, + BookmarkItem *item, + GError **error); + +static time_t timestamp_from_iso8601 (const gchar *iso_date); +static gchar * timestamp_to_iso8601 (time_t timestamp); + +/******************************** + * BookmarkAppInfo * + * * + * Application metadata storage * + ********************************/ +static BookmarkAppInfo * +bookmark_app_info_new (const gchar *name) +{ + BookmarkAppInfo *retval; + + g_warn_if_fail (name != NULL); + + retval = g_slice_new (BookmarkAppInfo); + + retval->name = g_strdup (name); + retval->exec = NULL; + retval->count = 0; + retval->stamp = 0; + + return retval; +} + +static void +bookmark_app_info_free (BookmarkAppInfo *app_info) +{ + if (!app_info) + return; + + g_free (app_info->name); + g_free (app_info->exec); + + g_slice_free (BookmarkAppInfo, app_info); +} + +static gchar * +bookmark_app_info_dump (BookmarkAppInfo *app_info) +{ + gchar *retval; + gchar *name, *exec, *modified, *count; + + g_warn_if_fail (app_info != NULL); + + if (app_info->count == 0) + return NULL; + + name = g_markup_escape_text (app_info->name, -1); + exec = g_markup_escape_text (app_info->exec, -1); + modified = timestamp_to_iso8601 (app_info->stamp); + count = g_strdup_printf ("%u", app_info->count); + + retval = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME ":" BOOKMARK_APPLICATION_ELEMENT + " " BOOKMARK_NAME_ATTRIBUTE "=\"", name, "\"" + " " BOOKMARK_EXEC_ATTRIBUTE "=\"", exec, "\"" + " " BOOKMARK_MODIFIED_ATTRIBUTE "=\"", modified, "\"" + " " BOOKMARK_COUNT_ATTRIBUTE "=\"", count, "\"/>\n", + NULL); + + g_free (name); + g_free (exec); + g_free (modified); + g_free (count); + + return retval; +} + + +/*********************** + * BookmarkMetadata * + * * + * Metadata storage * + ***********************/ +static BookmarkMetadata * +bookmark_metadata_new (void) +{ + BookmarkMetadata *retval; + + retval = g_slice_new (BookmarkMetadata); + + retval->mime_type = NULL; + + retval->groups = NULL; + + retval->applications = NULL; + retval->apps_by_name = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + NULL); + + retval->is_private = FALSE; + + retval->icon_href = NULL; + retval->icon_mime = NULL; + + return retval; +} + +static void +bookmark_metadata_free (BookmarkMetadata *metadata) +{ + if (!metadata) + return; + + g_free (metadata->mime_type); + + if (metadata->groups) + { + g_list_foreach (metadata->groups, + (GFunc) g_free, + NULL); + g_list_free (metadata->groups); + } + + if (metadata->applications) + { + g_list_foreach (metadata->applications, + (GFunc) bookmark_app_info_free, + NULL); + g_list_free (metadata->applications); + } + + g_hash_table_destroy (metadata->apps_by_name); + + g_free (metadata->icon_href); + g_free (metadata->icon_mime); + + g_slice_free (BookmarkMetadata, metadata); +} + +static gchar * +bookmark_metadata_dump (BookmarkMetadata *metadata) +{ + GString *retval; + gchar *buffer; + + if (!metadata->applications) + return NULL; + + retval = g_string_sized_new (1024); + + /* metadata container */ + g_string_append (retval, + " " + "<" XBEL_METADATA_ELEMENT + " " XBEL_OWNER_ATTRIBUTE "=\"" BOOKMARK_METADATA_OWNER + "\">\n"); + + /* mime type */ + if (metadata->mime_type) { + buffer = g_strconcat (" " + "<" MIME_NAMESPACE_NAME ":" MIME_TYPE_ELEMENT " " + MIME_TYPE_ATTRIBUTE "=\"", metadata->mime_type, "\"/>\n", + NULL); + g_string_append (retval, buffer); + g_free (buffer); + } + + if (metadata->groups) + { + GList *l; + + /* open groups container */ + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUPS_ELEMENT ">\n"); + + for (l = g_list_last (metadata->groups); l != NULL; l = l->prev) + { + gchar *group_name; + + group_name = g_markup_escape_text ((gchar *) l->data, -1); + buffer = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_GROUP_ELEMENT ">", + group_name, + "\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); + g_free (group_name); + } + + /* close groups container */ + g_string_append (retval, + " " + "\n"); + } + + if (metadata->applications) + { + GList *l; + + /* open applications container */ + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_APPLICATIONS_ELEMENT ">\n"); + + for (l = g_list_last (metadata->applications); l != NULL; l = l->prev) + { + BookmarkAppInfo *app_info = (BookmarkAppInfo *) l->data; + gchar *app_data; + + g_warn_if_fail (app_info != NULL); + + app_data = bookmark_app_info_dump (app_info); + + if (app_data) + { + retval = g_string_append (retval, app_data); + + g_free (app_data); + } + } + + /* close applications container */ + g_string_append (retval, + " " + "\n"); + } + + /* icon */ + if (metadata->icon_href) + { + if (!metadata->icon_mime) + metadata->icon_mime = g_strdup ("application/octet-stream"); + + buffer = g_strconcat (" " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_ICON_ELEMENT + " " BOOKMARK_HREF_ATTRIBUTE "=\"", metadata->icon_href, + "\" " BOOKMARK_TYPE_ATTRIBUTE "=\"", metadata->icon_mime, "\"/>\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); + } + + /* private hint */ + if (metadata->is_private) + g_string_append (retval, + " " + "<" BOOKMARK_NAMESPACE_NAME + ":" BOOKMARK_PRIVATE_ELEMENT "/>\n"); + + /* close metadata container */ + g_string_append (retval, + " " + "\n"); + + return g_string_free (retval, FALSE); +} + +/****************************************************** + * BookmarkItem * + * * + * Storage for a single bookmark item inside the list * + ******************************************************/ +static BookmarkItem * +bookmark_item_new (const gchar *uri) +{ + BookmarkItem *item; + + g_warn_if_fail (uri != NULL); + + item = g_slice_new (BookmarkItem); + item->uri = g_strdup (uri); + + item->title = NULL; + item->description = NULL; + + item->added = (time_t) -1; + item->modified = (time_t) -1; + item->visited = (time_t) -1; + + item->metadata = NULL; + + return item; +} + +static void +bookmark_item_free (BookmarkItem *item) +{ + if (!item) + return; + + g_free (item->uri); + g_free (item->title); + g_free (item->description); + + if (item->metadata) + bookmark_metadata_free (item->metadata); + + g_slice_free (BookmarkItem, item); +} + +static gchar * +bookmark_item_dump (BookmarkItem *item) +{ + GString *retval; + gchar *added, *visited, *modified; + gchar *escaped_uri; + gchar *buffer; + + /* at this point, we must have at least a registered application; if we don't + * we don't screw up the bookmark file, and just skip this item + */ + if (!item->metadata || !item->metadata->applications) + { + g_warning ("Item for URI '%s' has no registered applications: skipping.\n", item->uri); + return NULL; + } + + retval = g_string_sized_new (4096); + + added = timestamp_to_iso8601 (item->added); + modified = timestamp_to_iso8601 (item->modified); + visited = timestamp_to_iso8601 (item->visited); + + escaped_uri = g_markup_escape_text (item->uri, -1); + + buffer = g_strconcat (" <" + XBEL_BOOKMARK_ELEMENT + " " + XBEL_HREF_ATTRIBUTE "=\"", escaped_uri, "\" " + XBEL_ADDED_ATTRIBUTE "=\"", added, "\" " + XBEL_MODIFIED_ATTRIBUTE "=\"", modified, "\" " + XBEL_VISITED_ATTRIBUTE "=\"", visited, "\">\n", + NULL); + + g_string_append (retval, buffer); + + g_free (escaped_uri); + g_free (visited); + g_free (modified); + g_free (added); + g_free (buffer); + + if (item->title) + { + gchar *escaped_title; + + escaped_title = g_markup_escape_text (item->title, -1); + buffer = g_strconcat (" " + "<" XBEL_TITLE_ELEMENT ">", + escaped_title, + "\n", + NULL); + g_string_append (retval, buffer); + + g_free (escaped_title); + g_free (buffer); + } + + if (item->description) + { + gchar *escaped_desc; + + escaped_desc = g_markup_escape_text (item->description, -1); + buffer = g_strconcat (" " + "<" XBEL_DESC_ELEMENT ">", + escaped_desc, + "\n", + NULL); + g_string_append (retval, buffer); + + g_free (escaped_desc); + g_free (buffer); + } + + if (item->metadata) + { + gchar *metadata; + + metadata = bookmark_metadata_dump (item->metadata); + if (metadata) + { + buffer = g_strconcat (" " + "<" XBEL_INFO_ELEMENT ">\n", + metadata, + " " + "\n", + NULL); + retval = g_string_append (retval, buffer); + + g_free (buffer); + g_free (metadata); + } + } + + g_string_append (retval, " \n"); + + return g_string_free (retval, FALSE); +} + +static BookmarkAppInfo * +bookmark_item_lookup_app_info (BookmarkItem *item, + const gchar *app_name) +{ + g_warn_if_fail (item != NULL && app_name != NULL); + + if (!item->metadata) + return NULL; + + return g_hash_table_lookup (item->metadata->apps_by_name, app_name); +} + +/************************* + * GBookmarkFile * + *************************/ + +static void +g_bookmark_file_init (GBookmarkFile *bookmark) +{ + bookmark->title = NULL; + bookmark->description = NULL; + + bookmark->items = NULL; + bookmark->items_by_uri = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + NULL); +} + +static void +g_bookmark_file_clear (GBookmarkFile *bookmark) +{ + g_free (bookmark->title); + g_free (bookmark->description); + + if (bookmark->items) + { + g_list_foreach (bookmark->items, + (GFunc) bookmark_item_free, + NULL); + g_list_free (bookmark->items); + + bookmark->items = NULL; + } + + if (bookmark->items_by_uri) + { + g_hash_table_destroy (bookmark->items_by_uri); + + bookmark->items_by_uri = NULL; + } +} + +struct _ParseData +{ + gint state; + + GHashTable *namespaces; + + GBookmarkFile *bookmark_file; + BookmarkItem *current_item; +}; + +static ParseData * +parse_data_new (void) +{ + ParseData *retval; + + retval = g_new (ParseData, 1); + + retval->state = STATE_STARTED; + retval->namespaces = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) g_free); + retval->bookmark_file = NULL; + retval->current_item = NULL; + + return retval; +} + +static void +parse_data_free (ParseData *parse_data) +{ + g_hash_table_destroy (parse_data->namespaces); + + g_free (parse_data); +} + +#define IS_ATTRIBUTE(s,a) ((0 == strcmp ((s), (a)))) + +static void +parse_bookmark_element (GMarkupParseContext *context, + ParseData *parse_data, + const gchar **attribute_names, + const gchar **attribute_values, + GError **error) +{ + const gchar *uri, *added, *modified, *visited; + const gchar *attr; + gint i; + BookmarkItem *item; + GError *add_error; + + g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_BOOKMARK)); + + i = 0; + uri = added = modified = visited = NULL; + for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) + { + if (IS_ATTRIBUTE (attr, XBEL_HREF_ATTRIBUTE)) + uri = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, XBEL_ADDED_ATTRIBUTE)) + added = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, XBEL_MODIFIED_ATTRIBUTE)) + modified = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, XBEL_VISITED_ATTRIBUTE)) + visited = attribute_values[i]; + else + { + /* bookmark is defined by the XBEL spec, so we need + * to error out if the element has different or + * missing attributes + */ + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, + _("Unexpected attribute '%s' for element '%s'"), + attr, + XBEL_BOOKMARK_ELEMENT); + return; + } + } + + if (!uri) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Attribute '%s' of element '%s' not found"), + XBEL_HREF_ATTRIBUTE, + XBEL_BOOKMARK_ELEMENT); + return; + } + + g_warn_if_fail (parse_data->current_item == NULL); + + item = bookmark_item_new (uri); + + if (added) + item->added = timestamp_from_iso8601 (added); + + if (modified) + item->modified = timestamp_from_iso8601 (modified); + + if (visited) + item->visited = timestamp_from_iso8601 (visited); + + add_error = NULL; + g_bookmark_file_add_item (parse_data->bookmark_file, + item, + &add_error); + if (add_error) + { + bookmark_item_free (item); + + g_propagate_error (error, add_error); + + return; + } + + parse_data->current_item = item; +} + +static void +parse_application_element (GMarkupParseContext *context, + ParseData *parse_data, + const gchar **attribute_names, + const gchar **attribute_values, + GError **error) +{ + const gchar *name, *exec, *count, *stamp, *modified; + const gchar *attr; + gint i; + BookmarkItem *item; + BookmarkAppInfo *ai; + + g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_APPLICATION)); + + i = 0; + name = exec = count = stamp = modified = NULL; + for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) + { + if (IS_ATTRIBUTE (attr, BOOKMARK_NAME_ATTRIBUTE)) + name = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, BOOKMARK_EXEC_ATTRIBUTE)) + exec = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, BOOKMARK_COUNT_ATTRIBUTE)) + count = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, BOOKMARK_TIMESTAMP_ATTRIBUTE)) + stamp = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, BOOKMARK_MODIFIED_ATTRIBUTE)) + modified = attribute_values[i]; + } + + /* the "name" and "exec" attributes are mandatory */ + if (!name) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Attribute '%s' of element '%s' not found"), + BOOKMARK_NAME_ATTRIBUTE, + BOOKMARK_APPLICATION_ELEMENT); + return; + } + + if (!exec) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Attribute '%s' of element '%s' not found"), + BOOKMARK_EXEC_ATTRIBUTE, + BOOKMARK_APPLICATION_ELEMENT); + return; + } + + g_warn_if_fail (parse_data->current_item != NULL); + item = parse_data->current_item; + + ai = bookmark_item_lookup_app_info (item, name); + if (!ai) + { + ai = bookmark_app_info_new (name); + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + item->metadata->applications = g_list_prepend (item->metadata->applications, ai); + g_hash_table_replace (item->metadata->apps_by_name, ai->name, ai); + } + + ai->exec = g_strdup (exec); + + if (count) + ai->count = atoi (count); + else + ai->count = 1; + + if (modified) + ai->stamp = timestamp_from_iso8601 (modified); + else + { + /* the timestamp attribute has been deprecated but we still parse + * it for backward compatibility + */ + if (stamp) + ai->stamp = (time_t) atol (stamp); + else + ai->stamp = time (NULL); + } +} + +static void +parse_mime_type_element (GMarkupParseContext *context, + ParseData *parse_data, + const gchar **attribute_names, + const gchar **attribute_values, + GError **error) +{ + const gchar *type; + const gchar *attr; + gint i; + BookmarkItem *item; + + g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_MIME)); + + i = 0; + type = NULL; + for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) + { + if (IS_ATTRIBUTE (attr, MIME_TYPE_ATTRIBUTE)) + type = attribute_values[i]; + } + + if (!type) + type = "application/octet-stream"; + + g_warn_if_fail (parse_data->current_item != NULL); + item = parse_data->current_item; + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + item->metadata->mime_type = g_strdup (type); +} + +static void +parse_icon_element (GMarkupParseContext *context, + ParseData *parse_data, + const gchar **attribute_names, + const gchar **attribute_values, + GError **error) +{ + const gchar *href; + const gchar *type; + const gchar *attr; + gint i; + BookmarkItem *item; + + g_warn_if_fail ((parse_data != NULL) && (parse_data->state == STATE_ICON)); + + i = 0; + href = NULL; + type = NULL; + for (attr = attribute_names[i]; attr != NULL; attr = attribute_names[++i]) + { + if (IS_ATTRIBUTE (attr, BOOKMARK_HREF_ATTRIBUTE)) + href = attribute_values[i]; + else if (IS_ATTRIBUTE (attr, BOOKMARK_TYPE_ATTRIBUTE)) + type = attribute_values[i]; + } + + /* the "href" attribute is mandatory */ + if (!href) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Attribute '%s' of element '%s' not found"), + BOOKMARK_HREF_ATTRIBUTE, + BOOKMARK_ICON_ELEMENT); + return; + } + + if (!type) + type = "application/octet-stream"; + + g_warn_if_fail (parse_data->current_item != NULL); + item = parse_data->current_item; + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + item->metadata->icon_href = g_strdup (href); + item->metadata->icon_mime = g_strdup (type); +} + +/* scans through the attributes of an element for the "xmlns" pragma, and + * adds any resulting namespace declaration to a per-parser hashtable, using + * the namespace name as a key for the namespace URI; if no key was found, + * the namespace is considered as default, and stored under the "default" key. + * + * FIXME: this works on the assumption that the generator of the XBEL file + * is either this code or is smart enough to place the namespace declarations + * inside the main root node or inside the metadata node and does not redefine + * a namespace inside an inner node; this does *not* conform to the + * XML-NS standard, although is a close approximation. In order to make this + * conformant to the XML-NS specification we should use a per-element + * namespace table inside GMarkup and ask it to resolve the namespaces for us. + */ +static void +map_namespace_to_name (ParseData *parse_data, + const gchar **attribute_names, + const gchar **attribute_values) +{ + const gchar *attr; + gint i; + + g_warn_if_fail (parse_data != NULL); + + if (!attribute_names || !attribute_names[0]) + return; + + i = 0; + for (attr = attribute_names[i]; attr; attr = attribute_names[++i]) + { + if (g_str_has_prefix (attr, "xmlns")) + { + gchar *namespace_name, *namespace_uri; + gchar *p; + + p = g_utf8_strchr (attr, -1, ':'); + if (p) + p = g_utf8_next_char (p); + else + p = "default"; + + namespace_name = g_strdup (p); + namespace_uri = g_strdup (attribute_values[i]); + + g_hash_table_replace (parse_data->namespaces, + namespace_name, + namespace_uri); + } + } +} + +/* checks whether @element_full is equal to @element. + * + * if @namespace is set, it tries to resolve the namespace to a known URI, + * and if found is prepended to the element name, from which is separated + * using the character specified in the @sep parameter. + */ +static gboolean +is_element_full (ParseData *parse_data, + const gchar *element_full, + const gchar *namespace, + const gchar *element, + const gchar sep) +{ + gchar *ns_uri, *ns_name; + const gchar *p, *element_name; + gboolean retval; + + g_warn_if_fail (parse_data != NULL); + g_warn_if_fail (element_full != NULL); + + if (!element) + return FALSE; + + /* no namespace requested: dumb element compare */ + if (!namespace) + return (0 == strcmp (element_full, element)); + + /* search for namespace separator; if none found, assume we are under the + * default namespace, and set ns_name to our "default" marker; if no default + * namespace has been set, just do a plain comparison between @full_element + * and @element. + */ + p = g_utf8_strchr (element_full, -1, ':'); + if (p) + { + ns_name = g_strndup (element_full, p - element_full); + element_name = g_utf8_next_char (p); + } + else + { + ns_name = g_strdup ("default"); + element_name = element_full; + } + + ns_uri = g_hash_table_lookup (parse_data->namespaces, ns_name); + if (!ns_uri) + { + /* no default namespace found */ + g_free (ns_name); + + return (0 == strcmp (element_full, element)); + } + + retval = (0 == strcmp (ns_uri, namespace) && + 0 == strcmp (element_name, element)); + + g_free (ns_name); + + return retval; +} + +#define IS_ELEMENT(p,s,e) (is_element_full ((p), (s), NULL, (e), '\0')) +#define IS_ELEMENT_NS(p,s,n,e) (is_element_full ((p), (s), (n), (e), '|')) + +static void +start_element_raw_cb (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + ParseData *parse_data = (ParseData *) user_data; + + /* we must check for namespace declarations first + * + * XXX - we could speed up things by checking for namespace declarations + * only on the root node, where they usually are; this would probably break + * on streams not produced by us or by "smart" generators + */ + map_namespace_to_name (parse_data, attribute_names, attribute_values); + + switch (parse_data->state) + { + case STATE_STARTED: + if (IS_ELEMENT (parse_data, element_name, XBEL_ROOT_ELEMENT)) + { + const gchar *attr; + gint i; + + i = 0; + for (attr = attribute_names[i]; attr; attr = attribute_names[++i]) + { + if ((IS_ATTRIBUTE (attr, XBEL_VERSION_ATTRIBUTE)) && + (0 == strcmp (attribute_values[i], XBEL_VERSION))) + parse_data->state = STATE_ROOT; + } + } + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Unexpected tag '%s', tag '%s' expected"), + element_name, XBEL_ROOT_ELEMENT); + break; + case STATE_ROOT: + if (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) + parse_data->state = STATE_TITLE; + else if (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT)) + parse_data->state = STATE_DESC; + else if (IS_ELEMENT (parse_data, element_name, XBEL_BOOKMARK_ELEMENT)) + { + GError *inner_error = NULL; + + parse_data->state = STATE_BOOKMARK; + + parse_bookmark_element (context, + parse_data, + attribute_names, + attribute_values, + &inner_error); + if (inner_error) + g_propagate_error (error, inner_error); + } + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Unexpected tag '%s' inside '%s'"), + element_name, + XBEL_ROOT_ELEMENT); + break; + case STATE_BOOKMARK: + if (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) + parse_data->state = STATE_TITLE; + else if (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT)) + parse_data->state = STATE_DESC; + else if (IS_ELEMENT (parse_data, element_name, XBEL_INFO_ELEMENT)) + parse_data->state = STATE_INFO; + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Unexpected tag '%s' inside '%s'"), + element_name, + XBEL_BOOKMARK_ELEMENT); + break; + case STATE_INFO: + if (IS_ELEMENT (parse_data, element_name, XBEL_METADATA_ELEMENT)) + { + const gchar *attr; + gint i; + + i = 0; + for (attr = attribute_names[i]; attr; attr = attribute_names[++i]) + { + if ((IS_ATTRIBUTE (attr, XBEL_OWNER_ATTRIBUTE)) && + (0 == strcmp (attribute_values[i], BOOKMARK_METADATA_OWNER))) + { + parse_data->state = STATE_METADATA; + + if (!parse_data->current_item->metadata) + parse_data->current_item->metadata = bookmark_metadata_new (); + } + } + } + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Unexpected tag '%s', tag '%s' expected"), + element_name, + XBEL_METADATA_ELEMENT); + break; + case STATE_METADATA: + if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATIONS_ELEMENT)) + parse_data->state = STATE_APPLICATIONS; + else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUPS_ELEMENT)) + parse_data->state = STATE_GROUPS; + else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_PRIVATE_ELEMENT)) + parse_data->current_item->metadata->is_private = TRUE; + else if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) + { + GError *inner_error = NULL; + + parse_data->state = STATE_ICON; + + parse_icon_element (context, + parse_data, + attribute_names, + attribute_values, + &inner_error); + if (inner_error) + g_propagate_error (error, inner_error); + } + else if (IS_ELEMENT_NS (parse_data, element_name, MIME_NAMESPACE_URI, MIME_TYPE_ELEMENT)) + { + GError *inner_error = NULL; + + parse_data->state = STATE_MIME; + + parse_mime_type_element (context, + parse_data, + attribute_names, + attribute_values, + &inner_error); + if (inner_error) + g_propagate_error (error, inner_error); + } + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_UNKNOWN_ELEMENT, + _("Unexpected tag '%s' inside '%s'"), + element_name, + XBEL_METADATA_ELEMENT); + break; + case STATE_APPLICATIONS: + if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATION_ELEMENT)) + { + GError *inner_error = NULL; + + parse_data->state = STATE_APPLICATION; + + parse_application_element (context, + parse_data, + attribute_names, + attribute_values, + &inner_error); + if (inner_error) + g_propagate_error (error, inner_error); + } + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Unexpected tag '%s', tag '%s' expected"), + element_name, + BOOKMARK_APPLICATION_ELEMENT); + break; + case STATE_GROUPS: + if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUP_ELEMENT)) + parse_data->state = STATE_GROUP; + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("Unexpected tag '%s', tag '%s' expected"), + element_name, + BOOKMARK_GROUP_ELEMENT); + break; + case STATE_ICON: + if (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) + { + GError *inner_error = NULL; + + parse_icon_element (context, + parse_data, + attribute_names, + attribute_values, + &inner_error); + if (inner_error) + g_propagate_error (error, inner_error); + } + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_UNKNOWN_ELEMENT, + _("Unexpected tag '%s' inside '%s'"), + element_name, + XBEL_METADATA_ELEMENT); + break; + default: + g_warn_if_reached (); + break; + } +} + +static void +end_element_raw_cb (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + ParseData *parse_data = (ParseData *) user_data; + + if (IS_ELEMENT (parse_data, element_name, XBEL_ROOT_ELEMENT)) + parse_data->state = STATE_FINISHED; + else if (IS_ELEMENT (parse_data, element_name, XBEL_BOOKMARK_ELEMENT)) + { + parse_data->current_item = NULL; + + parse_data->state = STATE_ROOT; + } + else if ((IS_ELEMENT (parse_data, element_name, XBEL_INFO_ELEMENT)) || + (IS_ELEMENT (parse_data, element_name, XBEL_TITLE_ELEMENT)) || + (IS_ELEMENT (parse_data, element_name, XBEL_DESC_ELEMENT))) + { + if (parse_data->current_item) + parse_data->state = STATE_BOOKMARK; + else + parse_data->state = STATE_ROOT; + } + else if (IS_ELEMENT (parse_data, element_name, XBEL_METADATA_ELEMENT)) + parse_data->state = STATE_INFO; + else if (IS_ELEMENT_NS (parse_data, element_name, + BOOKMARK_NAMESPACE_URI, + BOOKMARK_APPLICATION_ELEMENT)) + parse_data->state = STATE_APPLICATIONS; + else if (IS_ELEMENT_NS (parse_data, element_name, + BOOKMARK_NAMESPACE_URI, + BOOKMARK_GROUP_ELEMENT)) + parse_data->state = STATE_GROUPS; + else if ((IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_APPLICATIONS_ELEMENT)) || + (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_GROUPS_ELEMENT)) || + (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_PRIVATE_ELEMENT)) || + (IS_ELEMENT_NS (parse_data, element_name, BOOKMARK_NAMESPACE_URI, BOOKMARK_ICON_ELEMENT)) || + (IS_ELEMENT_NS (parse_data, element_name, MIME_NAMESPACE_URI, MIME_TYPE_ELEMENT))) + parse_data->state = STATE_METADATA; +} + +static void +text_raw_cb (GMarkupParseContext *context, + const gchar *text, + gsize length, + gpointer user_data, + GError **error) +{ + ParseData *parse_data = (ParseData *) user_data; + gchar *payload; + + payload = g_strndup (text, length); + + switch (parse_data->state) + { + case STATE_TITLE: + if (parse_data->current_item) + { + g_free (parse_data->current_item->title); + parse_data->current_item->title = g_strdup (payload); + } + else + { + g_free (parse_data->bookmark_file->title); + parse_data->bookmark_file->title = g_strdup (payload); + } + break; + case STATE_DESC: + if (parse_data->current_item) + { + g_free (parse_data->current_item->description); + parse_data->current_item->description = g_strdup (payload); + } + else + { + g_free (parse_data->bookmark_file->description); + parse_data->bookmark_file->description = g_strdup (payload); + } + break; + case STATE_GROUP: + { + GList *groups; + + g_warn_if_fail (parse_data->current_item != NULL); + + if (!parse_data->current_item->metadata) + parse_data->current_item->metadata = bookmark_metadata_new (); + + groups = parse_data->current_item->metadata->groups; + parse_data->current_item->metadata->groups = g_list_prepend (groups, g_strdup (payload)); + } + break; + case STATE_ROOT: + case STATE_BOOKMARK: + case STATE_INFO: + case STATE_METADATA: + case STATE_APPLICATIONS: + case STATE_APPLICATION: + case STATE_GROUPS: + case STATE_MIME: + case STATE_ICON: + break; + default: + g_warn_if_reached (); + break; + } + + g_free (payload); +} + +static const GMarkupParser markup_parser = +{ + start_element_raw_cb, /* start_element */ + end_element_raw_cb, /* end_element */ + text_raw_cb, /* text */ + NULL, /* passthrough */ + NULL +}; + +static gboolean +g_bookmark_file_parse (GBookmarkFile *bookmark, + const gchar *buffer, + gsize length, + GError **error) +{ + GMarkupParseContext *context; + ParseData *parse_data; + GError *parse_error, *end_error; + gboolean retval; + + g_warn_if_fail (bookmark != NULL); + + if (!buffer) + return FALSE; + + if (length == (gsize) -1) + length = strlen (buffer); + + parse_data = parse_data_new (); + parse_data->bookmark_file = bookmark; + + context = g_markup_parse_context_new (&markup_parser, + 0, + parse_data, + (GDestroyNotify) parse_data_free); + + parse_error = NULL; + retval = g_markup_parse_context_parse (context, + buffer, + length, + &parse_error); + if (!retval) + { + g_propagate_error (error, parse_error); + + return FALSE; + } + + end_error = NULL; + retval = g_markup_parse_context_end_parse (context, &end_error); + if (!retval) + { + g_propagate_error (error, end_error); + + return FALSE; + } + + g_markup_parse_context_free (context); + + return TRUE; +} + +static gchar * +g_bookmark_file_dump (GBookmarkFile *bookmark, + gsize *length, + GError **error) +{ + GString *retval; + gchar *buffer; + GList *l; + + retval = g_string_sized_new (4096); + + g_string_append (retval, + "\n" +#if 0 + /* XXX - do we really need the doctype? */ + "\n" +#endif + "<" XBEL_ROOT_ELEMENT " " XBEL_VERSION_ATTRIBUTE "=\"" XBEL_VERSION "\"\n" + " xmlns:" BOOKMARK_NAMESPACE_NAME "=\"" BOOKMARK_NAMESPACE_URI "\"\n" + " xmlns:" MIME_NAMESPACE_NAME "=\"" MIME_NAMESPACE_URI "\"\n>"); + + if (bookmark->title) + { + gchar *escaped_title; + + escaped_title = g_markup_escape_text (bookmark->title, -1); + + buffer = g_strconcat (" " + "<" XBEL_TITLE_ELEMENT ">", + escaped_title, + "\n", NULL); + + g_string_append (retval, buffer); + + g_free (buffer); + g_free (escaped_title); + } + + if (bookmark->description) + { + gchar *escaped_desc; + + escaped_desc = g_markup_escape_text (bookmark->description, -1); + + buffer = g_strconcat (" " + "<" XBEL_DESC_ELEMENT ">", + escaped_desc, + "\n", NULL); + g_string_append (retval, buffer); + + g_free (buffer); + g_free (escaped_desc); + } + + if (!bookmark->items) + goto out; + else + retval = g_string_append (retval, "\n"); + + /* the items are stored in reverse order */ + for (l = g_list_last (bookmark->items); + l != NULL; + l = l->prev) + { + BookmarkItem *item = (BookmarkItem *) l->data; + gchar *item_dump; + + item_dump = bookmark_item_dump (item); + if (!item_dump) + continue; + + retval = g_string_append (retval, item_dump); + + g_free (item_dump); + } + +out: + g_string_append (retval, ""); + + if (length) + *length = retval->len; + + return g_string_free (retval, FALSE); +} + +/************** + * Misc * + **************/ + +/* converts a Unix timestamp in a ISO 8601 compliant string; you + * should free the returned string. + */ +static gchar * +timestamp_to_iso8601 (time_t timestamp) +{ + GTimeVal stamp; + + if (timestamp == (time_t) -1) + g_get_current_time (&stamp); + else + { + stamp.tv_sec = timestamp; + stamp.tv_usec = 0; + } + + return g_time_val_to_iso8601 (&stamp); +} + +static time_t +timestamp_from_iso8601 (const gchar *iso_date) +{ + GTimeVal stamp; + + if (!g_time_val_from_iso8601 (iso_date, &stamp)) + return (time_t) -1; + + return (time_t) stamp.tv_sec; +} + + + +GQuark +g_bookmark_file_error_quark (void) +{ + return g_quark_from_static_string ("g-bookmark-file-error-quark"); +} + + + +/******************** + * Public API * + ********************/ + +/** + * g_bookmark_file_new: + * + * Creates a new empty #GBookmarkFile object. + * + * Use g_bookmark_file_load_from_file(), g_bookmark_file_load_from_data() + * or g_bookmark_file_load_from_data_dirs() to read an existing bookmark + * file. + * + * Return value: an empty #GBookmarkFile + * + * Since: 2.12 + */ +GBookmarkFile * +g_bookmark_file_new (void) +{ + GBookmarkFile *bookmark; + + bookmark = g_new (GBookmarkFile, 1); + + g_bookmark_file_init (bookmark); + + return bookmark; +} + +/** + * g_bookmark_file_free: + * @bookmark: a #GBookmarkFile + * + * Frees a #GBookmarkFile. + * + * Since: 2.12 + */ +void +g_bookmark_file_free (GBookmarkFile *bookmark) +{ + if (!bookmark) + return; + + g_bookmark_file_clear (bookmark); + + g_free (bookmark); +} + +/** + * g_bookmark_file_load_from_data: + * @bookmark: an empty #GBookmarkFile struct + * @data: desktop bookmarks loaded in memory + * @length: the length of @data in bytes + * @error: return location for a #GError, or %NULL + * + * Loads a bookmark file from memory into an empty #GBookmarkFile + * structure. If the object cannot be created then @error is set to a + * #GBookmarkFileError. + * + * Return value: %TRUE if a desktop bookmark could be loaded. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_load_from_data (GBookmarkFile *bookmark, + const gchar *data, + gsize length, + GError **error) +{ + GError *parse_error; + gboolean retval; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (length != 0, FALSE); + + if (length == (gsize) -1) + length = strlen (data); + + if (bookmark->items) + { + g_bookmark_file_clear (bookmark); + g_bookmark_file_init (bookmark); + } + + parse_error = NULL; + retval = g_bookmark_file_parse (bookmark, data, length, &parse_error); + if (!retval) + { + g_propagate_error (error, parse_error); + + return FALSE; + } + + return TRUE; +} + +/** + * g_bookmark_file_load_from_file: + * @bookmark: an empty #GBookmarkFile struct + * @filename: the path of a filename to load, in the GLib file name encoding + * @error: return location for a #GError, or %NULL + * + * Loads a desktop bookmark file into an empty #GBookmarkFile structure. + * If the file could not be loaded then @error is set to either a #GFileError + * or #GBookmarkFileError. + * + * Return value: %TRUE if a desktop bookmark file could be loaded + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_load_from_file (GBookmarkFile *bookmark, + const gchar *filename, + GError **error) +{ + gchar *buffer; + gsize len; + GError *read_error; + gboolean retval; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (filename != NULL, FALSE); + + read_error = NULL; + g_file_get_contents (filename, &buffer, &len, &read_error); + if (read_error) + { + g_propagate_error (error, read_error); + + return FALSE; + } + + read_error = NULL; + retval = g_bookmark_file_load_from_data (bookmark, + buffer, + len, + &read_error); + if (read_error) + { + g_propagate_error (error, read_error); + + g_free (buffer); + + return FALSE; + } + + g_free (buffer); + + return retval; +} + + +/* Iterates through all the directories in *dirs trying to + * find file. When it successfully locates file, returns a + * string its absolute path. It also leaves the unchecked + * directories in *dirs. You should free the returned string + * + * Adapted from gkeyfile.c + */ +static gchar * +find_file_in_data_dirs (const gchar *file, + gchar ***dirs, + GError **error) +{ + gchar **data_dirs, *data_dir, *path; + + path = NULL; + + if (dirs == NULL) + return NULL; + + data_dirs = *dirs; + path = NULL; + while (data_dirs && (data_dir = *data_dirs) && !path) + { + gchar *candidate_file, *sub_dir; + + candidate_file = (gchar *) file; + sub_dir = g_strdup (""); + while (candidate_file != NULL && !path) + { + gchar *p; + + path = g_build_filename (data_dir, sub_dir, + candidate_file, NULL); + + candidate_file = strchr (candidate_file, '-'); + + if (candidate_file == NULL) + break; + + candidate_file++; + + g_free (sub_dir); + sub_dir = g_strndup (file, candidate_file - file - 1); + + for (p = sub_dir; *p != '\0'; p++) + { + if (*p == '-') + *p = G_DIR_SEPARATOR; + } + } + g_free (sub_dir); + data_dirs++; + } + + *dirs = data_dirs; + + if (!path) + { + g_set_error_literal (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND, + _("No valid bookmark file found in data dirs")); + + return NULL; + } + + return path; +} + + +/** + * g_bookmark_file_load_from_data_dirs: + * @bookmark: a #GBookmarkFile + * @file: a relative path to a filename to open and parse + * @full_path: return location for a string containing the full path + * of the file, or %NULL + * @error: return location for a #GError, or %NULL + * + * This function looks for a desktop bookmark file named @file in the + * paths returned from g_get_user_data_dir() and g_get_system_data_dirs(), + * loads the file into @bookmark and returns the file's full path in + * @full_path. If the file could not be loaded then an %error is + * set to either a #GFileError or #GBookmarkFileError. + * + * Return value: %TRUE if a key file could be loaded, %FALSE othewise + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark, + const gchar *file, + gchar **full_path, + GError **error) +{ + GError *file_error = NULL; + gchar **all_data_dirs, **data_dirs; + const gchar *user_data_dir; + const gchar * const * system_data_dirs; + gsize i, j; + gchar *output_path; + gboolean found_file; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (!g_path_is_absolute (file), FALSE); + + user_data_dir = g_get_user_data_dir (); + system_data_dirs = g_get_system_data_dirs (); + all_data_dirs = g_new0 (gchar *, g_strv_length ((gchar **)system_data_dirs) + 2); + + i = 0; + all_data_dirs[i++] = g_strdup (user_data_dir); + + j = 0; + while (system_data_dirs[j] != NULL) + all_data_dirs[i++] = g_strdup (system_data_dirs[j++]); + + found_file = FALSE; + data_dirs = all_data_dirs; + output_path = NULL; + while (*data_dirs != NULL && !found_file) + { + g_free (output_path); + + output_path = find_file_in_data_dirs (file, &data_dirs, &file_error); + + if (file_error) + { + g_propagate_error (error, file_error); + break; + } + + found_file = g_bookmark_file_load_from_file (bookmark, + output_path, + &file_error); + if (file_error) + { + g_propagate_error (error, file_error); + break; + } + } + + if (found_file && full_path) + *full_path = output_path; + else + g_free (output_path); + + g_strfreev (all_data_dirs); + + return found_file; +} + + +/** + * g_bookmark_file_to_data: + * @bookmark: a #GBookmarkFile + * @length: return location for the length of the returned string, or %NULL + * @error: return location for a #GError, or %NULL + * + * This function outputs @bookmark as a string. + * + * Return value: a newly allocated string holding + * the contents of the #GBookmarkFile + * + * Since: 2.12 + */ +gchar * +g_bookmark_file_to_data (GBookmarkFile *bookmark, + gsize *length, + GError **error) +{ + GError *write_error = NULL; + gchar *retval; + + g_return_val_if_fail (bookmark != NULL, NULL); + + retval = g_bookmark_file_dump (bookmark, length, &write_error); + if (write_error) + { + g_propagate_error (error, write_error); + + return NULL; + } + + return retval; +} + +/** + * g_bookmark_file_to_file: + * @bookmark: a #GBookmarkFile + * @filename: path of the output file + * @error: return location for a #GError, or %NULL + * + * This function outputs @bookmark into a file. The write process is + * guaranteed to be atomic by using g_file_set_contents() internally. + * + * Return value: %TRUE if the file was successfully written. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_to_file (GBookmarkFile *bookmark, + const gchar *filename, + GError **error) +{ + gchar *data; + GError *data_error, *write_error; + gsize len; + gboolean retval; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (filename != NULL, FALSE); + + data_error = NULL; + data = g_bookmark_file_to_data (bookmark, &len, &data_error); + if (data_error) + { + g_propagate_error (error, data_error); + + return FALSE; + } + + write_error = NULL; + g_file_set_contents (filename, data, len, &write_error); + if (write_error) + { + g_propagate_error (error, write_error); + + retval = FALSE; + } + else + retval = TRUE; + + g_free (data); + + return retval; +} + +static BookmarkItem * +g_bookmark_file_lookup_item (GBookmarkFile *bookmark, + const gchar *uri) +{ + g_warn_if_fail (bookmark != NULL && uri != NULL); + + return g_hash_table_lookup (bookmark->items_by_uri, uri); +} + +/* this function adds a new item to the list */ +static void +g_bookmark_file_add_item (GBookmarkFile *bookmark, + BookmarkItem *item, + GError **error) +{ + g_warn_if_fail (bookmark != NULL); + g_warn_if_fail (item != NULL); + + /* this should never happen; and if it does, then we are + * screwing up something big time. + */ + if (G_UNLIKELY (g_bookmark_file_has_item (bookmark, item->uri))) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_INVALID_URI, + _("A bookmark for URI '%s' already exists"), + item->uri); + return; + } + + bookmark->items = g_list_prepend (bookmark->items, item); + + g_hash_table_replace (bookmark->items_by_uri, + item->uri, + item); + + if (item->added == (time_t) -1) + item->added = time (NULL); + + if (item->modified == (time_t) -1) + item->modified = time (NULL); +} + +/** + * g_bookmark_file_remove_item: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Removes the bookmark for @uri from the bookmark file @bookmark. + * + * Return value: %TRUE if the bookmark was removed successfully. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_remove_item (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + bookmark->items = g_list_remove (bookmark->items, item); + g_hash_table_remove (bookmark->items_by_uri, item->uri); + + bookmark_item_free (item); + + return TRUE; +} + +/** + * g_bookmark_file_has_item: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * + * Looks whether the desktop bookmark has an item with its URI set to @uri. + * + * Return value: %TRUE if @uri is inside @bookmark, %FALSE otherwise + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_has_item (GBookmarkFile *bookmark, + const gchar *uri) +{ + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + return (NULL != g_hash_table_lookup (bookmark->items_by_uri, uri)); +} + +/** + * g_bookmark_file_get_uris: + * @bookmark: a #GBookmarkFile + * @length: return location for the number of returned URIs, or %NULL + * + * Returns all URIs of the bookmarks in the bookmark file @bookmark. + * The array of returned URIs will be %NULL-terminated, so @length may + * optionally be %NULL. + * + * Return value: a newly allocated %NULL-terminated array of strings. + * Use g_strfreev() to free it. + * + * Since: 2.12 + */ +gchar ** +g_bookmark_file_get_uris (GBookmarkFile *bookmark, + gsize *length) +{ + GList *l; + gchar **uris; + gsize i, n_items; + + g_return_val_if_fail (bookmark != NULL, NULL); + + n_items = g_list_length (bookmark->items); + uris = g_new0 (gchar *, n_items + 1); + + /* the items are stored in reverse order, so we walk the list backward */ + for (l = g_list_last (bookmark->items), i = 0; l != NULL; l = l->prev) + { + BookmarkItem *item = (BookmarkItem *) l->data; + + g_warn_if_fail (item != NULL); + + uris[i++] = g_strdup (item->uri); + } + uris[i] = NULL; + + if (length) + *length = i; + + return uris; +} + +/** + * g_bookmark_file_set_title: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI or %NULL + * @title: a UTF-8 encoded string + * + * Sets @title as the title of the bookmark for @uri inside the + * bookmark file @bookmark. + * + * If @uri is %NULL, the title of @bookmark is set. + * + * If a bookmark for @uri cannot be found then it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_title (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *title) +{ + g_return_if_fail (bookmark != NULL); + + if (!uri) + { + g_free (bookmark->title); + bookmark->title = g_strdup (title); + } + else + { + BookmarkItem *item; + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + g_free (item->title); + item->title = g_strdup (title); + + item->modified = time (NULL); + } +} + +/** + * g_bookmark_file_get_title: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI or %NULL + * @error: return location for a #GError, or %NULL + * + * Returns the title of the bookmark for @uri. + * + * If @uri is %NULL, the title of @bookmark is returned. + * + * In the event the URI cannot be found, %NULL is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: a newly allocated string or %NULL if the specified + * URI cannot be found. + * + * Since: 2.12 + */ +gchar * +g_bookmark_file_get_title (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, NULL); + + if (!uri) + return g_strdup (bookmark->title); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return NULL; + } + + return g_strdup (item->title); +} + +/** + * g_bookmark_file_set_description: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI or %NULL + * @description: a string + * + * Sets @description as the description of the bookmark for @uri. + * + * If @uri is %NULL, the description of @bookmark is set. + * + * If a bookmark for @uri cannot be found then it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_description (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *description) +{ + g_return_if_fail (bookmark != NULL); + + if (!uri) + { + g_free (bookmark->description); + bookmark->description = g_strdup (description); + } + else + { + BookmarkItem *item; + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + g_free (item->description); + item->description = g_strdup (description); + + item->modified = time (NULL); + } +} + +/** + * g_bookmark_file_get_description: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Retrieves the description of the bookmark for @uri. + * + * In the event the URI cannot be found, %NULL is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: a newly allocated string or %NULL if the specified + * URI cannot be found. + * + * Since: 2.12 + */ +gchar * +g_bookmark_file_get_description (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, NULL); + + if (!uri) + return g_strdup (bookmark->description); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return NULL; + } + + return g_strdup (item->description); +} + +/** + * g_bookmark_file_set_mime_type: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @mime_type: a MIME type + * + * Sets @mime_type as the MIME type of the bookmark for @uri. + * + * If a bookmark for @uri cannot be found then it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_mime_type (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *mime_type) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + g_return_if_fail (mime_type != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + g_free (item->metadata->mime_type); + + item->metadata->mime_type = g_strdup (mime_type); + item->modified = time (NULL); +} + +/** + * g_bookmark_file_get_mime_type: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Retrieves the MIME type of the resource pointed by @uri. + * + * In the event the URI cannot be found, %NULL is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the + * event that the MIME type cannot be found, %NULL is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. + * + * Return value: a newly allocated string or %NULL if the specified + * URI cannot be found. + * + * Since: 2.12 + */ +gchar * +g_bookmark_file_get_mime_type (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, NULL); + g_return_val_if_fail (uri != NULL, NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return NULL; + } + + if (!item->metadata) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_INVALID_VALUE, + _("No MIME type defined in the bookmark for URI '%s'"), + uri); + return NULL; + } + + return g_strdup (item->metadata->mime_type); +} + +/** + * g_bookmark_file_set_is_private: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @is_private: %TRUE if the bookmark should be marked as private + * + * Sets the private flag of the bookmark for @uri. + * + * If a bookmark for @uri cannot be found then it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_is_private (GBookmarkFile *bookmark, + const gchar *uri, + gboolean is_private) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + item->metadata->is_private = (is_private == TRUE); + item->modified = time (NULL); +} + +/** + * g_bookmark_file_get_is_private: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Gets whether the private flag of the bookmark for @uri is set. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the + * event that the private flag cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. + * + * Return value: %TRUE if the private flag is set, %FALSE otherwise. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_get_is_private (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + if (!item->metadata) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_INVALID_VALUE, + _("No private flag has been defined in bookmark for URI '%s'"), + uri); + return FALSE; + } + + return item->metadata->is_private; +} + +/** + * g_bookmark_file_set_added: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @added: a timestamp or -1 to use the current time + * + * Sets the time the bookmark for @uri was added into @bookmark. + * + * If no bookmark for @uri is found then it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_added (GBookmarkFile *bookmark, + const gchar *uri, + time_t added) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (added == (time_t) -1) + time (&added); + + item->added = added; + item->modified = added; +} + +/** + * g_bookmark_file_get_added: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Gets the time the bookmark for @uri was added to @bookmark + * + * In the event the URI cannot be found, -1 is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: a timestamp + * + * Since: 2.12 + */ +time_t +g_bookmark_file_get_added (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, (time_t) -1); + g_return_val_if_fail (uri != NULL, (time_t) -1); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return (time_t) -1; + } + + return item->added; +} + +/** + * g_bookmark_file_set_modified: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @modified: a timestamp or -1 to use the current time + * + * Sets the last time the bookmark for @uri was last modified. + * + * If no bookmark for @uri is found then it is created. + * + * The "modified" time should only be set when the bookmark's meta-data + * was actually changed. Every function of #GBookmarkFile that + * modifies a bookmark also changes the modification time, except for + * g_bookmark_file_set_visited(). + * + * Since: 2.12 + */ +void +g_bookmark_file_set_modified (GBookmarkFile *bookmark, + const gchar *uri, + time_t modified) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (modified == (time_t) -1) + time (&modified); + + item->modified = modified; +} + +/** + * g_bookmark_file_get_modified: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Gets the time when the bookmark for @uri was last modified. + * + * In the event the URI cannot be found, -1 is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: a timestamp + * + * Since: 2.12 + */ +time_t +g_bookmark_file_get_modified (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, (time_t) -1); + g_return_val_if_fail (uri != NULL, (time_t) -1); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return (time_t) -1; + } + + return item->modified; +} + +/** + * g_bookmark_file_set_visited: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @visited: a timestamp or -1 to use the current time + * + * Sets the time the bookmark for @uri was last visited. + * + * If no bookmark for @uri is found then it is created. + * + * The "visited" time should only be set if the bookmark was launched, + * either using the command line retrieved by g_bookmark_file_get_app_info() + * or by the default application for the bookmark's MIME type, retrieved + * using g_bookmark_file_get_mime_type(). Changing the "visited" time + * does not affect the "modified" time. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_visited (GBookmarkFile *bookmark, + const gchar *uri, + time_t visited) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (visited == (time_t) -1) + time (&visited); + + item->visited = visited; +} + +/** + * g_bookmark_file_get_visited: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @error: return location for a #GError, or %NULL + * + * Gets the time the bookmark for @uri was last visited. + * + * In the event the URI cannot be found, -1 is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: a timestamp. + * + * Since: 2.12 + */ +time_t +g_bookmark_file_get_visited (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, (time_t) -1); + g_return_val_if_fail (uri != NULL, (time_t) -1); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return (time_t) -1; + } + + return item->visited; +} + +/** + * g_bookmark_file_has_group: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @group: the group name to be searched + * @error: return location for a #GError, or %NULL + * + * Checks whether @group appears in the list of groups to which + * the bookmark for @uri belongs to. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: %TRUE if @group was found. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_has_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group, + GError **error) +{ + BookmarkItem *item; + GList *l; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + if (!item->metadata) + return FALSE; + + for (l = item->metadata->groups; l != NULL; l = l->next) + { + if (strcmp (l->data, group) == 0) + return TRUE; + } + + return FALSE; + +} + +/** + * g_bookmark_file_add_group: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @group: the group name to be added + * + * Adds @group to the list of groups to which the bookmark for @uri + * belongs to. + * + * If no bookmark for @uri is found then it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_add_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + g_return_if_fail (group != NULL && group[0] != '\0'); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + if (!g_bookmark_file_has_group (bookmark, uri, group, NULL)) + { + item->metadata->groups = g_list_prepend (item->metadata->groups, + g_strdup (group)); + + item->modified = time (NULL); + } +} + +/** + * g_bookmark_file_remove_group: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @group: the group name to be removed + * @error: return location for a #GError, or %NULL + * + * Removes @group from the list of groups to which the bookmark + * for @uri belongs to. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * In the event no group was defined, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_INVALID_VALUE. + * + * Return value: %TRUE if @group was successfully removed. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_remove_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group, + GError **error) +{ + BookmarkItem *item; + GList *l; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + if (!item->metadata) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_INVALID_VALUE, + _("No groups set in bookmark for URI '%s'"), + uri); + return FALSE; + } + + for (l = item->metadata->groups; l != NULL; l = l->next) + { + if (strcmp (l->data, group) == 0) + { + item->metadata->groups = g_list_remove_link (item->metadata->groups, l); + g_free (l->data); + g_list_free_1 (l); + + item->modified = time (NULL); + + return TRUE; + } + } + + return FALSE; +} + +/** + * g_bookmark_file_set_groups: + * @bookmark: a #GBookmarkFile + * @uri: an item's URI + * @groups: an array of group names, or %NULL to remove all groups + * @length: number of group name values in @groups + * + * Sets a list of group names for the item with URI @uri. Each previously + * set group name list is removed. + * + * If @uri cannot be found then an item for it is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_groups (GBookmarkFile *bookmark, + const gchar *uri, + const gchar **groups, + gsize length) +{ + BookmarkItem *item; + gsize i; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + g_return_if_fail (groups != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + if (item->metadata->groups != NULL) + { + g_list_foreach (item->metadata->groups, + (GFunc) g_free, + NULL); + g_list_free (item->metadata->groups); + item->metadata->groups = NULL; + } + + if (groups) + { + for (i = 0; groups[i] != NULL && i < length; i++) + item->metadata->groups = g_list_append (item->metadata->groups, + g_strdup (groups[i])); + } + + item->modified = time (NULL); +} + +/** + * g_bookmark_file_get_groups: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @length: return location for the length of the returned string, or %NULL + * @error: return location for a #GError, or %NULL + * + * Retrieves the list of group names of the bookmark for @uri. + * + * In the event the URI cannot be found, %NULL is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * The returned array is %NULL terminated, so @length may optionally + * be %NULL. + * + * Return value: a newly allocated %NULL-terminated array of group names. + * Use g_strfreev() to free it. + * + * Since: 2.12 + */ +gchar ** +g_bookmark_file_get_groups (GBookmarkFile *bookmark, + const gchar *uri, + gsize *length, + GError **error) +{ + BookmarkItem *item; + GList *l; + gsize len, i; + gchar **retval; + + g_return_val_if_fail (bookmark != NULL, NULL); + g_return_val_if_fail (uri != NULL, NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return NULL; + } + + if (!item->metadata) + { + if (length) + *length = 0; + + return NULL; + } + + len = g_list_length (item->metadata->groups); + retval = g_new0 (gchar *, len + 1); + for (l = g_list_last (item->metadata->groups), i = 0; + l != NULL; + l = l->prev) + { + gchar *group_name = (gchar *) l->data; + + g_warn_if_fail (group_name != NULL); + + retval[i++] = g_strdup (group_name); + } + retval[i] = NULL; + + if (length) + *length = len; + + return retval; +} + +/** + * g_bookmark_file_add_application: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @name: the name of the application registering the bookmark + * or %NULL + * @exec: command line to be used to launch the bookmark or %NULL + * + * Adds the application with @name and @exec to the list of + * applications that have registered a bookmark for @uri into + * @bookmark. + * + * Every bookmark inside a #GBookmarkFile must have at least an + * application registered. Each application must provide a name, a + * command line useful for launching the bookmark, the number of times + * the bookmark has been registered by the application and the last + * time the application registered this bookmark. + * + * If @name is %NULL, the name of the application will be the + * same returned by g_get_application_name(); if @exec is %NULL, the + * command line will be a composition of the program name as + * returned by g_get_prgname() and the "%u" modifier, which will be + * expanded to the bookmark's URI. + * + * This function will automatically take care of updating the + * registrations count and timestamping in case an application + * with the same @name had already registered a bookmark for + * @uri inside @bookmark. + * + * If no bookmark for @uri is found, one is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_add_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + const gchar *exec) +{ + BookmarkItem *item; + gchar *app_name, *app_exec; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (name && name[0] != '\0') + app_name = g_strdup (name); + else + app_name = g_strdup (g_get_application_name ()); + + if (exec && exec[0] != '\0') + app_exec = g_strdup (exec); + else + app_exec = g_strjoin (" ", g_get_prgname(), "%u", NULL); + + g_bookmark_file_set_app_info (bookmark, uri, + app_name, + app_exec, + -1, + (time_t) -1, + NULL); + + g_free (app_exec); + g_free (app_name); +} + +/** + * g_bookmark_file_remove_application: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @name: the name of the application + * @error: return location for a #GError or %NULL + * + * Removes application registered with @name from the list of applications + * that have registered a bookmark for @uri inside @bookmark. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * In the event that no application with name @app_name has registered + * a bookmark for @uri, %FALSE is returned and error is set to + * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. + * + * Return value: %TRUE if the application was successfully removed. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_remove_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + GError **error) +{ + GError *set_error; + gboolean retval; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + set_error = NULL; + retval = g_bookmark_file_set_app_info (bookmark, uri, + name, + "", + 0, + (time_t) -1, + &set_error); + if (set_error) + { + g_propagate_error (error, set_error); + + return FALSE; + } + + return retval; +} + +/** + * g_bookmark_file_has_application: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @name: the name of the application + * @error: return location for a #GError or %NULL + * + * Checks whether the bookmark for @uri inside @bookmark has been + * registered by application @name. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: %TRUE if the application @name was found + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_has_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + return (NULL != bookmark_item_lookup_app_info (item, name)); +} + +/** + * g_bookmark_file_set_app_info: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @name: an application's name + * @exec: an application's command line + * @count: the number of registrations done for this application + * @stamp: the time of the last registration for this application + * @error: return location for a #GError or %NULL + * + * Sets the meta-data of application @name inside the list of + * applications that have registered a bookmark for @uri inside + * @bookmark. + * + * You should rarely use this function; use g_bookmark_file_add_application() + * and g_bookmark_file_remove_application() instead. + * + * @name can be any UTF-8 encoded string used to identify an + * application. + * @exec can have one of these two modifiers: "%f", which will + * be expanded as the local file name retrieved from the bookmark's + * URI; "%u", which will be expanded as the bookmark's URI. + * The expansion is done automatically when retrieving the stored + * command line using the g_bookmark_file_get_app_info() function. + * @count is the number of times the application has registered the + * bookmark; if is < 0, the current registration count will be increased + * by one, if is 0, the application with @name will be removed from + * the list of registered applications. + * @stamp is the Unix time of the last registration; if it is -1, the + * current time will be used. + * + * If you try to remove an application by setting its registration count to + * zero, and no bookmark for @uri is found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND; similarly, + * in the event that no application @name has registered a bookmark + * for @uri, %FALSE is returned and error is set to + * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. Otherwise, if no bookmark + * for @uri is found, one is created. + * + * Return value: %TRUE if the application's meta-data was successfully + * changed. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_set_app_info (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + const gchar *exec, + gint count, + time_t stamp, + GError **error) +{ + BookmarkItem *item; + BookmarkAppInfo *ai; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + g_return_val_if_fail (exec != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + if (count == 0) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + else + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + } + + ai = bookmark_item_lookup_app_info (item, name); + if (!ai) + { + if (count == 0) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED, + _("No application with name '%s' registered a bookmark for '%s'"), + name, + uri); + return FALSE; + } + else + { + ai = bookmark_app_info_new (name); + + item->metadata->applications = g_list_prepend (item->metadata->applications, ai); + g_hash_table_replace (item->metadata->apps_by_name, ai->name, ai); + } + } + + if (count == 0) + { + item->metadata->applications = g_list_remove (item->metadata->applications, ai); + g_hash_table_remove (item->metadata->apps_by_name, ai->name); + bookmark_app_info_free (ai); + + item->modified = time (NULL); + + return TRUE; + } + else if (count > 0) + ai->count = count; + else + ai->count += 1; + + if (stamp != (time_t) -1) + ai->stamp = stamp; + else + ai->stamp = time (NULL); + + if (exec && exec[0] != '\0') + { + g_free (ai->exec); + ai->exec = g_shell_quote (exec); + } + + item->modified = time (NULL); + + return TRUE; +} + +/* expands the application's command line */ +static gchar * +expand_exec_line (const gchar *exec_fmt, + const gchar *uri) +{ + GString *exec; + gchar ch; + + exec = g_string_sized_new (512); + while ((ch = *exec_fmt++) != '\0') + { + if (ch != '%') + { + exec = g_string_append_c (exec, ch); + continue; + } + + ch = *exec_fmt++; + switch (ch) + { + case '\0': + goto out; + case 'U': + case 'u': + g_string_append (exec, uri); + break; + case 'F': + case 'f': + { + gchar *file = g_filename_from_uri (uri, NULL, NULL); + if (file) + { + g_string_append (exec, file); + g_free (file); + } + else + { + g_string_free (exec, TRUE); + return NULL; + } + } + break; + case '%': + default: + exec = g_string_append_c (exec, ch); + break; + } + } + + out: + return g_string_free (exec, FALSE); +} + +/** + * g_bookmark_file_get_app_info: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @name: an application's name + * @exec: location for the command line of the application, or %NULL + * @count: return location for the registration count, or %NULL + * @stamp: return location for the last registration time, or %NULL + * @error: return location for a #GError, or %NULL + * + * Gets the registration informations of @app_name for the bookmark for + * @uri. See g_bookmark_file_set_app_info() for more informations about + * the returned data. + * + * The string returned in @app_exec must be freed. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. In the + * event that no application with name @app_name has registered a bookmark + * for @uri, %FALSE is returned and error is set to + * #G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED. In the event that unquoting + * the command line fails, an error of the #G_SHELL_ERROR domain is + * set and %FALSE is returned. + * + * Return value: %TRUE on success. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_get_app_info (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + gchar **exec, + guint *count, + time_t *stamp, + GError **error) +{ + BookmarkItem *item; + BookmarkAppInfo *ai; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + ai = bookmark_item_lookup_app_info (item, name); + if (!ai) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED, + _("No application with name '%s' registered a bookmark for '%s'"), + name, + uri); + return FALSE; + } + + if (exec) + { + GError *unquote_error = NULL; + gchar *command_line; + + command_line = g_shell_unquote (ai->exec, &unquote_error); + if (unquote_error) + { + g_propagate_error (error, unquote_error); + return FALSE; + } + + *exec = expand_exec_line (command_line, uri); + if (!*exec) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_INVALID_URI, + _("Failed to expand exec line '%s' with URI '%s'"), + ai->exec, uri); + g_free (command_line); + + return FALSE; + } + else + g_free (command_line); + } + + if (count) + *count = ai->count; + + if (stamp) + *stamp = ai->stamp; + + return TRUE; +} + +/** + * g_bookmark_file_get_applications: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @length: return location of the length of the returned list, or %NULL + * @error: return location for a #GError, or %NULL + * + * Retrieves the names of the applications that have registered the + * bookmark for @uri. + * + * In the event the URI cannot be found, %NULL is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: a newly allocated %NULL-terminated array of strings. + * Use g_strfreev() to free it. + * + * Since: 2.12 + */ +gchar ** +g_bookmark_file_get_applications (GBookmarkFile *bookmark, + const gchar *uri, + gsize *length, + GError **error) +{ + BookmarkItem *item; + GList *l; + gchar **apps; + gsize i, n_apps; + + g_return_val_if_fail (bookmark != NULL, NULL); + g_return_val_if_fail (uri != NULL, NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return NULL; + } + + if (!item->metadata) + { + if (length) + *length = 0; + + return NULL; + } + + n_apps = g_list_length (item->metadata->applications); + apps = g_new0 (gchar *, n_apps + 1); + + for (l = g_list_last (item->metadata->applications), i = 0; + l != NULL; + l = l->prev) + { + BookmarkAppInfo *ai; + + ai = (BookmarkAppInfo *) l->data; + + g_warn_if_fail (ai != NULL); + g_warn_if_fail (ai->name != NULL); + + apps[i++] = g_strdup (ai->name); + } + apps[i] = NULL; + + if (length) + *length = i; + + return apps; +} + +/** + * g_bookmark_file_get_size: + * @bookmark: a #GBookmarkFile + * + * Gets the number of bookmarks inside @bookmark. + * + * Return value: the number of bookmarks + * + * Since: 2.12 + */ +gint +g_bookmark_file_get_size (GBookmarkFile *bookmark) +{ + g_return_val_if_fail (bookmark != NULL, 0); + + return g_list_length (bookmark->items); +} + +/** + * g_bookmark_file_move_item: + * @bookmark: a #GBookmarkFile + * @old_uri: a valid URI + * @new_uri: a valid URI, or %NULL + * @error: return location for a #GError or %NULL + * + * Changes the URI of a bookmark item from @old_uri to @new_uri. Any + * existing bookmark for @new_uri will be overwritten. If @new_uri is + * %NULL, then the bookmark is removed. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: %TRUE if the URI was successfully changed + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_move_item (GBookmarkFile *bookmark, + const gchar *old_uri, + const gchar *new_uri, + GError **error) +{ + BookmarkItem *item; + GError *remove_error; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (old_uri != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, old_uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + old_uri); + return FALSE; + } + + if (new_uri && new_uri[0] != '\0') + { + if (g_bookmark_file_has_item (bookmark, new_uri)) + { + remove_error = NULL; + g_bookmark_file_remove_item (bookmark, new_uri, &remove_error); + if (remove_error) + { + g_propagate_error (error, remove_error); + + return FALSE; + } + } + + g_hash_table_steal (bookmark->items_by_uri, item->uri); + + g_free (item->uri); + item->uri = g_strdup (new_uri); + item->modified = time (NULL); + + g_hash_table_replace (bookmark->items_by_uri, item->uri, item); + + return TRUE; + } + else + { + remove_error = NULL; + g_bookmark_file_remove_item (bookmark, old_uri, &remove_error); + if (remove_error) + { + g_propagate_error (error, remove_error); + + return FALSE; + } + + return TRUE; + } +} + +/** + * g_bookmark_file_set_icon: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @href: the URI of the icon for the bookmark, or %NULL + * @mime_type: the MIME type of the icon for the bookmark + * + * Sets the icon for the bookmark for @uri. If @href is %NULL, unsets + * the currently set icon. @href can either be a full URL for the icon + * file or the icon name following the Icon Naming specification. + * + * If no bookmark for @uri is found one is created. + * + * Since: 2.12 + */ +void +g_bookmark_file_set_icon (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *href, + const gchar *mime_type) +{ + BookmarkItem *item; + + g_return_if_fail (bookmark != NULL); + g_return_if_fail (uri != NULL); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + item = bookmark_item_new (uri); + g_bookmark_file_add_item (bookmark, item, NULL); + } + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + g_free (item->metadata->icon_href); + g_free (item->metadata->icon_mime); + + item->metadata->icon_href = g_strdup (href); + + if (mime_type && mime_type[0] != '\0') + item->metadata->icon_mime = g_strdup (mime_type); + else + item->metadata->icon_mime = g_strdup ("application/octet-stream"); + + item->modified = time (NULL); +} + +/** + * g_bookmark_file_get_icon: + * @bookmark: a #GBookmarkFile + * @uri: a valid URI + * @href: return location for the icon's location or %NULL + * @mime_type: return location for the icon's MIME type or %NULL + * @error: return location for a #GError or %NULL + * + * Gets the icon of the bookmark for @uri. + * + * In the event the URI cannot be found, %FALSE is returned and + * @error is set to #G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND. + * + * Return value: %TRUE if the icon for the bookmark for the URI was found. + * You should free the returned strings. + * + * Since: 2.12 + */ +gboolean +g_bookmark_file_get_icon (GBookmarkFile *bookmark, + const gchar *uri, + gchar **href, + gchar **mime_type, + GError **error) +{ + BookmarkItem *item; + + g_return_val_if_fail (bookmark != NULL, FALSE); + g_return_val_if_fail (uri != NULL, FALSE); + + item = g_bookmark_file_lookup_item (bookmark, uri); + if (!item) + { + g_set_error (error, G_BOOKMARK_FILE_ERROR, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + _("No bookmark found for URI '%s'"), + uri); + return FALSE; + } + + if ((!item->metadata) || (!item->metadata->icon_href)) + return FALSE; + + if (href) + *href = g_strdup (item->metadata->icon_href); + + if (mime_type) + *mime_type = g_strdup (item->metadata->icon_mime); + + return TRUE; +} + +#define __G_BOOKMARK_FILE_C__ +#include "galiasdef.c" diff --git a/glib/gbookmarkfile.h b/glib/gbookmarkfile.h new file mode 100644 index 0000000..bdf97c0 --- /dev/null +++ b/glib/gbookmarkfile.h @@ -0,0 +1,191 @@ +/* gbookmarkfile.h: parsing and building desktop bookmarks + * + * Copyright (C) 2005-2006 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_BOOKMARK_FILE_H__ +#define __G_BOOKMARK_FILE_H__ + +#include +#include + +G_BEGIN_DECLS + +/* GError enumeration + */ +#define G_BOOKMARK_FILE_ERROR (g_bookmark_file_error_quark ()) + +typedef enum +{ + G_BOOKMARK_FILE_ERROR_INVALID_URI, + G_BOOKMARK_FILE_ERROR_INVALID_VALUE, + G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED, + G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND, + G_BOOKMARK_FILE_ERROR_READ, + G_BOOKMARK_FILE_ERROR_UNKNOWN_ENCODING, + G_BOOKMARK_FILE_ERROR_WRITE, + G_BOOKMARK_FILE_ERROR_FILE_NOT_FOUND +} GBookmarkFileError; + +GQuark g_bookmark_file_error_quark (void); + +/* + * GBookmarkFile + */ +typedef struct _GBookmarkFile GBookmarkFile; + +GBookmarkFile *g_bookmark_file_new (void); +void g_bookmark_file_free (GBookmarkFile *bookmark); + +gboolean g_bookmark_file_load_from_file (GBookmarkFile *bookmark, + const gchar *filename, + GError **error); +gboolean g_bookmark_file_load_from_data (GBookmarkFile *bookmark, + const gchar *data, + gsize length, + GError **error); +gboolean g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark, + const gchar *file, + gchar **full_path, + GError **error); +gchar * g_bookmark_file_to_data (GBookmarkFile *bookmark, + gsize *length, + GError **error) G_GNUC_MALLOC; +gboolean g_bookmark_file_to_file (GBookmarkFile *bookmark, + const gchar *filename, + GError **error); + +void g_bookmark_file_set_title (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *title); +gchar * g_bookmark_file_get_title (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) G_GNUC_MALLOC; +void g_bookmark_file_set_description (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *description); +gchar * g_bookmark_file_get_description (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) G_GNUC_MALLOC; +void g_bookmark_file_set_mime_type (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *mime_type); +gchar * g_bookmark_file_get_mime_type (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) G_GNUC_MALLOC; +void g_bookmark_file_set_groups (GBookmarkFile *bookmark, + const gchar *uri, + const gchar **groups, + gsize length); +void g_bookmark_file_add_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group); +gboolean g_bookmark_file_has_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group, + GError **error); +gchar ** g_bookmark_file_get_groups (GBookmarkFile *bookmark, + const gchar *uri, + gsize *length, + GError **error) G_GNUC_MALLOC; +void g_bookmark_file_add_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + const gchar *exec); +gboolean g_bookmark_file_has_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + GError **error); +gchar ** g_bookmark_file_get_applications (GBookmarkFile *bookmark, + const gchar *uri, + gsize *length, + GError **error) G_GNUC_MALLOC; +gboolean g_bookmark_file_set_app_info (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + const gchar *exec, + gint count, + time_t stamp, + GError **error); +gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + gchar **exec, + guint *count, + time_t *stamp, + GError **error); +void g_bookmark_file_set_is_private (GBookmarkFile *bookmark, + const gchar *uri, + gboolean is_private); +gboolean g_bookmark_file_get_is_private (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +void g_bookmark_file_set_icon (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *href, + const gchar *mime_type); +gboolean g_bookmark_file_get_icon (GBookmarkFile *bookmark, + const gchar *uri, + gchar **href, + gchar **mime_type, + GError **error); +void g_bookmark_file_set_added (GBookmarkFile *bookmark, + const gchar *uri, + time_t added); +time_t g_bookmark_file_get_added (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +void g_bookmark_file_set_modified (GBookmarkFile *bookmark, + const gchar *uri, + time_t modified); +time_t g_bookmark_file_get_modified (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +void g_bookmark_file_set_visited (GBookmarkFile *bookmark, + const gchar *uri, + time_t visited); +time_t g_bookmark_file_get_visited (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +gboolean g_bookmark_file_has_item (GBookmarkFile *bookmark, + const gchar *uri); +gint g_bookmark_file_get_size (GBookmarkFile *bookmark); +gchar ** g_bookmark_file_get_uris (GBookmarkFile *bookmark, + gsize *length) G_GNUC_MALLOC; +gboolean g_bookmark_file_remove_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group, + GError **error); +gboolean g_bookmark_file_remove_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + GError **error); +gboolean g_bookmark_file_remove_item (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +gboolean g_bookmark_file_move_item (GBookmarkFile *bookmark, + const gchar *old_uri, + const gchar *new_uri, + GError **error); + +G_END_DECLS + +#endif /* __G_BOOKMARK_FILE_H__ */ diff --git a/glib/gbsearcharray.h b/glib/gbsearcharray.h new file mode 100644 index 0000000..1ad893c --- /dev/null +++ b/glib/gbsearcharray.h @@ -0,0 +1,303 @@ +/* GBSearchArray - Binary Searchable Array implementation + * Copyright (C) 2000-2003 Tim Janik + * + * This software is provided "as is"; redistribution and modification + * is permitted, provided that the following disclaimer is retained. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#ifndef __G_BSEARCH_ARRAY_H__ +#define __G_BSEARCH_ARRAY_H__ + +#include +#include + + +G_BEGIN_DECLS /* c++ guards */ + +/* this implementation is intended to be usable in third-party code + * simply by pasting the contents of this file. as such, the + * implementation needs to be self-contained within this file. + */ + +/* convenience macro to avoid signed overflow for value comparisions */ +#define G_BSEARCH_ARRAY_CMP(v1,v2) ((v1) > (v2) ? +1 : (v1) == (v2) ? 0 : -1) + + +/* --- typedefs --- */ +typedef gint (*GBSearchCompareFunc) (gconstpointer bsearch_node1, /* key */ + gconstpointer bsearch_node2); +typedef enum +{ + G_BSEARCH_ARRAY_ALIGN_POWER2 = 1 << 0, /* align memory to power2 sizes */ + G_BSEARCH_ARRAY_AUTO_SHRINK = 1 << 1 /* shrink array upon removal */ +} GBSearchArrayFlags; + + +/* --- structures --- */ +typedef struct +{ + guint sizeof_node; + GBSearchCompareFunc cmp_nodes; + guint flags; +} GBSearchConfig; +typedef union +{ + guint n_nodes; + /*< private >*/ + gpointer alignment_dummy1; + glong alignment_dummy2; + gdouble alignment_dummy3; +} GBSearchArray; + + +/* --- public API --- */ +static inline GBSearchArray* g_bsearch_array_create (const GBSearchConfig *bconfig); +static inline gpointer g_bsearch_array_get_nth (GBSearchArray *barray, + const GBSearchConfig *bconfig, + guint nth); +static inline guint g_bsearch_array_get_index (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer node_in_array); +static inline GBSearchArray* g_bsearch_array_remove (GBSearchArray *barray, + const GBSearchConfig *bconfig, + guint index_); +/* provide uninitialized space at index for node insertion */ +static inline GBSearchArray* g_bsearch_array_grow (GBSearchArray *barray, + const GBSearchConfig *bconfig, + guint index); +/* insert key_node into array if it does not exist, otherwise do nothing */ +static inline GBSearchArray* g_bsearch_array_insert (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer key_node); +/* insert key_node into array if it does not exist, + * otherwise replace the existing node's contents with key_node + */ +static inline GBSearchArray* g_bsearch_array_replace (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer key_node); +static inline void g_bsearch_array_free (GBSearchArray *barray, + const GBSearchConfig *bconfig); +#define g_bsearch_array_get_n_nodes(barray) (((GBSearchArray*) (barray))->n_nodes) + +/* g_bsearch_array_lookup(): + * return NULL or exact match node + */ +#define g_bsearch_array_lookup(barray, bconfig, key_node) \ + g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 0) + +/* g_bsearch_array_lookup_sibling(): + * return NULL for barray->n_nodes==0, otherwise return the + * exact match node, or, if there's no such node, return the + * node last visited, which is pretty close to an exact match + * (will be one off into either direction). + */ +#define g_bsearch_array_lookup_sibling(barray, bconfig, key_node) \ + g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 1) + +/* g_bsearch_array_lookup_insertion(): + * return NULL for barray->n_nodes==0 or exact match, otherwise + * return the node where key_node should be inserted (may be one + * after end, i.e. g_bsearch_array_get_index(result) <= barray->n_nodes). + */ +#define g_bsearch_array_lookup_insertion(barray, bconfig, key_node) \ + g_bsearch_array_lookup_fuzzy ((barray), (bconfig), (key_node), 2) + + +/* --- implementation --- */ +/* helper macro to cut down realloc()s */ +#ifdef DISABLE_MEM_POOLS +#define G_BSEARCH_UPPER_POWER2(n) (n) +#else /* !DISABLE_MEM_POOLS */ +#define G_BSEARCH_UPPER_POWER2(n) ((n) ? 1 << g_bit_storage ((n) - 1) : 0) +#endif /* !DISABLE_MEM_POOLS */ +#define G_BSEARCH_ARRAY_NODES(barray) (((guint8*) (barray)) + sizeof (GBSearchArray)) +static inline GBSearchArray* +g_bsearch_array_create (const GBSearchConfig *bconfig) +{ + GBSearchArray *barray; + guint size; + + g_return_val_if_fail (bconfig != NULL, NULL); + + size = sizeof (GBSearchArray) + bconfig->sizeof_node; + if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2) + size = G_BSEARCH_UPPER_POWER2 (size); + barray = (GBSearchArray *) g_malloc (size); + memset (barray, 0, sizeof (GBSearchArray)); + + return barray; +} +static inline gpointer +g_bsearch_array_lookup_fuzzy (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer key_node, + const guint sibling_or_after); +static inline gpointer +g_bsearch_array_lookup_fuzzy (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer key_node, + const guint sibling_or_after) +{ + GBSearchCompareFunc cmp_nodes = bconfig->cmp_nodes; + guint8 *check = NULL, *nodes = G_BSEARCH_ARRAY_NODES (barray); + guint n_nodes = barray->n_nodes, offs = 0; + guint sizeof_node = bconfig->sizeof_node; + gint cmp = 0; + + while (offs < n_nodes) + { + guint i = (offs + n_nodes) >> 1; + + check = nodes + i * sizeof_node; + cmp = cmp_nodes (key_node, check); + if (cmp == 0) + return sibling_or_after > 1 ? NULL : check; + else if (cmp < 0) + n_nodes = i; + else /* (cmp > 0) */ + offs = i + 1; + } + + /* check is last mismatch, cmp > 0 indicates greater key */ + return G_LIKELY (!sibling_or_after) ? NULL : (sibling_or_after > 1 && cmp > 0) ? check + sizeof_node : check; +} +static inline gpointer +g_bsearch_array_get_nth (GBSearchArray *barray, + const GBSearchConfig *bconfig, + guint nth) +{ + return (G_LIKELY (nth < barray->n_nodes) ? + G_BSEARCH_ARRAY_NODES (barray) + nth * bconfig->sizeof_node : + NULL); +} +static inline guint +g_bsearch_array_get_index (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer node_in_array) +{ + guint distance = ((guint8*) node_in_array) - G_BSEARCH_ARRAY_NODES (barray); + + g_return_val_if_fail (node_in_array != NULL, barray->n_nodes); + + distance /= bconfig->sizeof_node; + + return MIN (distance, barray->n_nodes + 1); /* may return one after end */ +} +static inline GBSearchArray* +g_bsearch_array_grow (GBSearchArray *barray, + const GBSearchConfig *bconfig, + guint index_) +{ + guint old_size = barray->n_nodes * bconfig->sizeof_node; + guint new_size = old_size + bconfig->sizeof_node; + guint8 *node; + + g_return_val_if_fail (index_ <= barray->n_nodes, NULL); + + if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)) + { + new_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + new_size); + old_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + old_size); + if (old_size != new_size) + barray = (GBSearchArray *) g_realloc (barray, new_size); + } + else + barray = (GBSearchArray *) g_realloc (barray, sizeof (GBSearchArray) + new_size); + node = G_BSEARCH_ARRAY_NODES (barray) + index_ * bconfig->sizeof_node; + g_memmove (node + bconfig->sizeof_node, node, (barray->n_nodes - index_) * bconfig->sizeof_node); + barray->n_nodes += 1; + return barray; +} +static inline GBSearchArray* +g_bsearch_array_insert (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer key_node) +{ + guint8 *node; + + if (G_UNLIKELY (!barray->n_nodes)) + { + barray = g_bsearch_array_grow (barray, bconfig, 0); + node = G_BSEARCH_ARRAY_NODES (barray); + } + else + { + node = (guint8 *) g_bsearch_array_lookup_insertion (barray, bconfig, key_node); + if (G_LIKELY (node)) + { + guint index_ = g_bsearch_array_get_index (barray, bconfig, node); + + /* grow and insert */ + barray = g_bsearch_array_grow (barray, bconfig, index_); + node = G_BSEARCH_ARRAY_NODES (barray) + index_ * bconfig->sizeof_node; + } + else /* no insertion needed, node already there */ + return barray; + } + memcpy (node, key_node, bconfig->sizeof_node); + return barray; +} +static inline GBSearchArray* +g_bsearch_array_replace (GBSearchArray *barray, + const GBSearchConfig *bconfig, + gconstpointer key_node) +{ + guint8 *node = (guint8 *) g_bsearch_array_lookup (barray, bconfig, key_node); + if (G_LIKELY (node)) /* expected path */ + memcpy (node, key_node, bconfig->sizeof_node); + else /* revert to insertion */ + barray = g_bsearch_array_insert (barray, bconfig, key_node); + return barray; +} +static inline GBSearchArray* +g_bsearch_array_remove (GBSearchArray *barray, + const GBSearchConfig *bconfig, + guint index_) +{ + guint8 *node; + + g_return_val_if_fail (index_ < barray->n_nodes, NULL); + + barray->n_nodes -= 1; + node = G_BSEARCH_ARRAY_NODES (barray) + index_ * bconfig->sizeof_node; + g_memmove (node, node + bconfig->sizeof_node, (barray->n_nodes - index_) * bconfig->sizeof_node); + if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_AUTO_SHRINK)) + { + guint new_size = barray->n_nodes * bconfig->sizeof_node; + guint old_size = new_size + bconfig->sizeof_node; + + if (G_UNLIKELY (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)) + { + new_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + new_size); + old_size = G_BSEARCH_UPPER_POWER2 (sizeof (GBSearchArray) + old_size); + if (old_size != new_size) + barray = (GBSearchArray *) g_realloc (barray, new_size); + } + else + barray = (GBSearchArray *) g_realloc (barray, sizeof (GBSearchArray) + new_size); + } + return barray; +} +static inline void +g_bsearch_array_free (GBSearchArray *barray, + const GBSearchConfig *bconfig) +{ + g_return_if_fail (barray != NULL); + + g_free (barray); +} + +G_END_DECLS /* c++ guards */ + +#endif /* !__G_BSEARCH_ARRAY_H__ */ diff --git a/glib/gbuffer.c b/glib/gbuffer.c new file mode 100644 index 0000000..4eb83df --- /dev/null +++ b/glib/gbuffer.c @@ -0,0 +1,207 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#include "config.h" + +#include "gbuffer.h" + +#include +#include +#include + +#include "galias.h" + +typedef struct +{ + GBuffer buffer; + + GDestroyNotify user_destroy; + gpointer user_data; +} GUserNotifyBuffer; + +static void +g_buffer_free_gfree (GBuffer *buffer) +{ + g_free ((gpointer) buffer->data); + g_slice_free (GBuffer, buffer); +} + +/* < private > + * g_buffer_new_from_data: + * @data: the data to be used for the buffer + * @size: the size of @data + * @returns: a reference to a new #GBuffer + * + * Creates a new #GBuffer from @data. + * + * @data is copied. + */ + +GBuffer * +g_buffer_new_from_data (gconstpointer data, + gsize size) +{ + GBuffer *buffer; + + buffer = g_slice_new (GBuffer); + buffer->data = g_memdup (data, size); + buffer->size = size; + buffer->free_func = g_buffer_free_gfree; + buffer->ref_count = 1; + + return buffer; +} + +/* < private > + * g_buffer_new_take_data: + * @data: the data to be used for the buffer + * @size: the size of @data + * returns: a reference to a new #GBuffer + * + * Creates a new #GBuffer from @data. + * + * @data must have been created by a call to g_malloc(), g_malloc0() or + * g_realloc() or by one of the many functions that wrap these calls + * (such as g_new(), g_strdup(), etc). + * + * After this call, @data belongs to the buffer and may no longer be + * modified by the caller. g_free() will be called on @data when the + * buffer is no longer in use. + */ +GBuffer * +g_buffer_new_take_data (gpointer data, + gsize size) +{ + GBuffer *buffer; + + buffer = g_slice_new (GBuffer); + buffer->data = data; + buffer->size = size; + buffer->free_func = g_buffer_free_gfree; + buffer->ref_count = 1; + + return buffer; +} + +static void +g_buffer_free (GBuffer *buffer) +{ + g_slice_free (GBuffer, buffer); +} + +/* < private > + * g_buffer_new_from_static_data: + * @data: the data to be used for the buffer + * @size: the size of @data + * @returns: a reference to a new #GBuffer + * + * Creates a new #GBuffer from static data. + * + * @data must be static (ie: never modified or freed). + */ +GBuffer * +g_buffer_new_from_static_data (gconstpointer data, + gsize size) +{ + GBuffer *buffer; + + buffer = g_slice_new (GBuffer); + buffer->data = data; + buffer->size = size; + buffer->free_func = g_buffer_free; + buffer->ref_count = 1; + + return buffer; +} + +static void +g_buffer_free_usernotify (GBuffer *buffer) +{ + GUserNotifyBuffer *ubuffer = (GUserNotifyBuffer *) buffer; + + ubuffer->user_destroy (ubuffer->user_data); + g_slice_free (GBuffer, buffer); +} + +/* < private > + * g_buffer_new_from_pointer: + * @data: the data to be used for the buffer + * @size: the size of @data + * @notify: the function to call to release the data + * @user_data: the data to pass to @notify + * @returns: a reference to a new #GBuffer + * + * Creates a #GBuffer from @data. + * + * When the last reference is dropped, @notify will be called on + * @user_data. + * + * @data must not be modified after this call is made, until @notify has + * been called to indicate that the buffer is no longer in use. + */ +GBuffer * +g_buffer_new_from_pointer (gconstpointer data, + gsize size, + GDestroyNotify notify, + gpointer user_data) +{ + GUserNotifyBuffer *ubuffer; + + ubuffer = g_slice_new (GUserNotifyBuffer); + ubuffer->buffer.data = data; + ubuffer->buffer.size = size; + ubuffer->buffer.free_func = g_buffer_free_usernotify; + ubuffer->buffer.ref_count = 1; + ubuffer->user_destroy = notify; + ubuffer->user_data = user_data; + + return (GBuffer *) ubuffer; +} + +/* < private > + * g_buffer_ref: + * @buffer: a #GBuffer + * @returns: @buffer + * + * Increase the reference count on @buffer. + */ +GBuffer * +g_buffer_ref (GBuffer *buffer) +{ + g_atomic_int_inc (&buffer->ref_count); + + return buffer; +} + +/* < private > + * g_buffer_unref: + * @buffer: a #GBuffer + * + * Releases a reference on @buffer. This may result in the buffer being + * freed. + */ +void +g_buffer_unref (GBuffer *buffer) +{ + if (g_atomic_int_dec_and_test (&buffer->ref_count)) + if (buffer->free_func != NULL) + buffer->free_func (buffer); +} diff --git a/glib/gbuffer.h b/glib/gbuffer.h new file mode 100644 index 0000000..6bb29b7 --- /dev/null +++ b/glib/gbuffer.h @@ -0,0 +1,88 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#ifndef __G_BUFFER_H__ +#define __G_BUFFER_H__ + +#include + +/* < private > + * GBuffer: + * @data: a pointer to the data held in the buffer + * @size: the size of @data + * + * A simple refcounted data type representing a byte sequence from an + * unspecified origin. + * + * The purpose of a #GBuffer is to keep the memory region that it holds + * alive for as long as anyone holds a reference to the buffer. When + * the last reference count is dropped, the memory is released. + * + * A #GBuffer can come from many different origins that may have + * different procedures for freeing the memory region. Examples are + * memory from g_malloc(), from memory slices, from a #GMappedFile or + * memory from other allocators. + */ +typedef struct _GBuffer GBuffer; + +/* < private > + * GBufferFreeFunc: + * @buffer: the #GBuffer to be freed + * + * This function is provided by creators of a #GBuffer. It is the + * function to be called when the reference count of @buffer drops to + * zero. It should free any memory associated with the buffer and free + * @buffer itself. + */ +typedef void (* GBufferFreeFunc) (GBuffer *buffer); + +struct _GBuffer +{ + gconstpointer data; + gsize size; + + /*< protected >*/ + GBufferFreeFunc free_func; + + /*< private >*/ + gint ref_count; +}; + +G_GNUC_INTERNAL +GBuffer * g_buffer_new_from_data (gconstpointer data, + gsize size); +G_GNUC_INTERNAL +GBuffer * g_buffer_new_take_data (gpointer data, + gsize size); +G_GNUC_INTERNAL +GBuffer * g_buffer_new_from_static_data (gconstpointer data, + gsize size); +G_GNUC_INTERNAL +GBuffer * g_buffer_new_from_pointer (gconstpointer data, + gsize size, + GDestroyNotify notify, + gpointer user_data); +G_GNUC_INTERNAL +GBuffer * g_buffer_ref (GBuffer *buffer); +G_GNUC_INTERNAL +void g_buffer_unref (GBuffer *buffer); + +#endif /* __G_BUFFER_H__ */ diff --git a/glib/gcache.c b/glib/gcache.c new file mode 100644 index 0000000..9c69122 --- /dev/null +++ b/glib/gcache.c @@ -0,0 +1,331 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: caches + * @title: Caches + * @short_description: caches allow sharing of complex data structures + * to save resources + * + * A #GCache allows sharing of complex data structures, in order to + * save system resources. + * + * GTK+ uses caches for #GtkStyles and #GdkGCs. These consume a lot of + * resources, so a #GCache is used to see if a #GtkStyle or #GdkGC with + * the required properties already exists. If it does, then the + * existing object is used instead of creating a new one. + * + * #GCache uses keys and values. A #GCache key describes the properties + * of a particular resource. A #GCache value is the actual resource. + **/ + +typedef struct _GCacheNode GCacheNode; + +struct _GCacheNode +{ + /* A reference counted node */ + gpointer value; + gint ref_count; +}; + +/** + * GCache: + * + * The #GCache struct is an opaque data structure containing + * information about a #GCache. It should only be accessed via the + * following functions. + **/ +struct _GCache +{ + /* Called to create a value from a key */ + GCacheNewFunc value_new_func; + + /* Called to destroy a value */ + GCacheDestroyFunc value_destroy_func; + + /* Called to duplicate a key */ + GCacheDupFunc key_dup_func; + + /* Called to destroy a key */ + GCacheDestroyFunc key_destroy_func; + + /* Associates keys with nodes */ + GHashTable *key_table; + + /* Associates nodes with keys */ + GHashTable *value_table; +}; + +static inline GCacheNode* +g_cache_node_new (gpointer value) +{ + GCacheNode *node = g_slice_new (GCacheNode); + node->value = value; + node->ref_count = 1; + return node; +} + +static inline void +g_cache_node_destroy (GCacheNode *node) +{ + g_slice_free (GCacheNode, node); +} + +/** + * g_cache_new: + * @value_new_func: a function to create a new object given a key. + * This is called by g_cache_insert() if an object + * with the given key does not already exist. + * @value_destroy_func: a function to destroy an object. It is called + * by g_cache_remove() when the object is no + * longer needed (i.e. its reference count drops + * to 0). + * @key_dup_func: a function to copy a key. It is called by + * g_cache_insert() if the key does not already exist in + * the #GCache. + * @key_destroy_func: a function to destroy a key. It is called by + * g_cache_remove() when the object is no longer + * needed (i.e. its reference count drops to 0). + * @hash_key_func: a function to create a hash value from a key. + * @hash_value_func: a function to create a hash value from a value. + * @key_equal_func: a function to compare two keys. It should return + * %TRUE if the two keys are equivalent. + * @Returns: a new #GCache. + * + * Creates a new #GCache. + **/ +/** + * GCacheNewFunc: + * @key: a #GCache key. + * @Returns: a new #GCache value corresponding to the key. + * + * Specifies the type of the @value_new_func function passed to + * g_cache_new(). It is passed a #GCache key and should create the + * value corresponding to the key. + **/ +/** + * GCacheDestroyFunc: + * @value: the #GCache value to destroy. + * + * Specifies the type of the @value_destroy_func and @key_destroy_func + * functions passed to g_cache_new(). The functions are passed a + * pointer to the #GCache key or #GCache value and should free any + * memory and other resources associated with it. + **/ +/** + * GCacheDupFunc: + * @value: the #GCache key to destroy (not a + * #GCache value as it seems). + * @Returns: a copy of the #GCache key. + * + * Specifies the type of the @key_dup_func function passed to + * g_cache_new(). The function is passed a key + * (not a value as the prototype implies) and + * should return a duplicate of the key. + **/ +GCache* +g_cache_new (GCacheNewFunc value_new_func, + GCacheDestroyFunc value_destroy_func, + GCacheDupFunc key_dup_func, + GCacheDestroyFunc key_destroy_func, + GHashFunc hash_key_func, + GHashFunc hash_value_func, + GEqualFunc key_equal_func) +{ + GCache *cache; + + g_return_val_if_fail (value_new_func != NULL, NULL); + g_return_val_if_fail (value_destroy_func != NULL, NULL); + g_return_val_if_fail (key_dup_func != NULL, NULL); + g_return_val_if_fail (key_destroy_func != NULL, NULL); + g_return_val_if_fail (hash_key_func != NULL, NULL); + g_return_val_if_fail (hash_value_func != NULL, NULL); + g_return_val_if_fail (key_equal_func != NULL, NULL); + + cache = g_slice_new (GCache); + cache->value_new_func = value_new_func; + cache->value_destroy_func = value_destroy_func; + cache->key_dup_func = key_dup_func; + cache->key_destroy_func = key_destroy_func; + cache->key_table = g_hash_table_new (hash_key_func, key_equal_func); + cache->value_table = g_hash_table_new (hash_value_func, NULL); + + return cache; +} + +/** + * g_cache_destroy: + * @cache: a #GCache. + * + * Frees the memory allocated for the #GCache. + * + * Note that it does not destroy the keys and values which were + * contained in the #GCache. + **/ +void +g_cache_destroy (GCache *cache) +{ + g_return_if_fail (cache != NULL); + + g_hash_table_destroy (cache->key_table); + g_hash_table_destroy (cache->value_table); + g_slice_free (GCache, cache); +} + +/** + * g_cache_insert: + * @cache: a #GCache. + * @key: a key describing a #GCache object. + * @Returns: a pointer to a #GCache value. + * + * Gets the value corresponding to the given key, creating it if + * necessary. It first checks if the value already exists in the + * #GCache, by using the @key_equal_func function passed to + * g_cache_new(). If it does already exist it is returned, and its + * reference count is increased by one. If the value does not currently + * exist, if is created by calling the @value_new_func. The key is + * duplicated by calling @key_dup_func and the duplicated key and value + * are inserted into the #GCache. + **/ +gpointer +g_cache_insert (GCache *cache, + gpointer key) +{ + GCacheNode *node; + gpointer value; + + g_return_val_if_fail (cache != NULL, NULL); + + node = g_hash_table_lookup (cache->key_table, key); + if (node) + { + node->ref_count += 1; + return node->value; + } + + key = (* cache->key_dup_func) (key); + value = (* cache->value_new_func) (key); + node = g_cache_node_new (value); + + g_hash_table_insert (cache->key_table, key, node); + g_hash_table_insert (cache->value_table, value, key); + + return node->value; +} + +/** + * g_cache_remove: + * @cache: a #GCache. + * @value: the value to remove. + * + * Decreases the reference count of the given value. If it drops to 0 + * then the value and its corresponding key are destroyed, using the + * @value_destroy_func and @key_destroy_func passed to g_cache_new(). + **/ +void +g_cache_remove (GCache *cache, + gconstpointer value) +{ + GCacheNode *node; + gpointer key; + + g_return_if_fail (cache != NULL); + + key = g_hash_table_lookup (cache->value_table, value); + node = g_hash_table_lookup (cache->key_table, key); + + g_return_if_fail (node != NULL); + + node->ref_count -= 1; + if (node->ref_count == 0) + { + g_hash_table_remove (cache->value_table, value); + g_hash_table_remove (cache->key_table, key); + + (* cache->key_destroy_func) (key); + (* cache->value_destroy_func) (node->value); + g_cache_node_destroy (node); + } +} + +/** + * g_cache_key_foreach: + * @cache: a #GCache. + * @func: the function to call with each #GCache key. + * @user_data: user data to pass to the function. + * + * Calls the given function for each of the keys in the #GCache. + * + * NOTE @func is passed three parameters, the value and key of a cache + * entry and the @user_data. The order of value and key is different + * from the order in which g_hash_table_foreach() passes key-value + * pairs to its callback function ! + **/ +void +g_cache_key_foreach (GCache *cache, + GHFunc func, + gpointer user_data) +{ + g_return_if_fail (cache != NULL); + g_return_if_fail (func != NULL); + + g_hash_table_foreach (cache->value_table, func, user_data); +} + +/** + * g_cache_value_foreach: + * @cache: a #GCache. + * @func: the function to call with each #GCache value. + * @user_data: user data to pass to the function. + * + * Calls the given function for each of the values in the #GCache. + * + * Deprecated:2.10: The reason is that it passes pointers to internal + * data structures to @func; use g_cache_key_foreach() + * instead + **/ +void +g_cache_value_foreach (GCache *cache, + GHFunc func, + gpointer user_data) +{ + g_return_if_fail (cache != NULL); + g_return_if_fail (func != NULL); + + g_hash_table_foreach (cache->key_table, func, user_data); +} + +#define __G_CACHE_C__ +#include "galiasdef.c" diff --git a/glib/gcache.h b/glib/gcache.h new file mode 100644 index 0000000..283783d --- /dev/null +++ b/glib/gcache.h @@ -0,0 +1,69 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CACHE_H__ +#define __G_CACHE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GCache GCache; + +typedef gpointer (*GCacheNewFunc) (gpointer key); +typedef gpointer (*GCacheDupFunc) (gpointer value); +typedef void (*GCacheDestroyFunc) (gpointer value); + +/* Caches + */ +GCache* g_cache_new (GCacheNewFunc value_new_func, + GCacheDestroyFunc value_destroy_func, + GCacheDupFunc key_dup_func, + GCacheDestroyFunc key_destroy_func, + GHashFunc hash_key_func, + GHashFunc hash_value_func, + GEqualFunc key_equal_func); +void g_cache_destroy (GCache *cache); +gpointer g_cache_insert (GCache *cache, + gpointer key); +void g_cache_remove (GCache *cache, + gconstpointer value); +void g_cache_key_foreach (GCache *cache, + GHFunc func, + gpointer user_data); +#ifndef G_DISABLE_DEPRECATED +void g_cache_value_foreach (GCache *cache, + GHFunc func, + gpointer user_data); +#endif + +G_END_DECLS + +#endif /* __G_CACHE_H__ */ diff --git a/glib/gchecksum.c b/glib/gchecksum.c new file mode 100644 index 0000000..ad90727 --- /dev/null +++ b/glib/gchecksum.c @@ -0,0 +1,1461 @@ +/* gchecksum.h - data hashing functions + * + * Copyright (C) 2007 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "glibconfig.h" +#include "gchecksum.h" +#include "glib.h" +#include "glibintl.h" + +#include "galias.h" + +/** + * SECTION: checksum + * @title: Data Checksums + * @short_description: Computes the checksum for data + * + * GLib provides a generic API for computing checksums (or "digests") + * for a sequence of arbitrary bytes, using various hashing algorithms + * like MD5, SHA-1 and SHA-256. Checksums are commonly used in various + * environments and specifications. + * + * GLib supports incremental checksums using the GChecksum data + * structure, by calling g_checksum_update() as long as there's data + * available and then using g_checksum_get_string() or + * g_checksum_get_digest() to compute the checksum and return it either + * as a string in hexadecimal form, or as a raw sequence of bytes. To + * compute the checksum for binary blobs and NUL-terminated strings in + * one go, use the convenience functions g_compute_checksum_for_data() + * and g_compute_checksum_for_string(), respectively. + * + * Support for checksums has been added in GLib 2.16 + **/ + +#define IS_VALID_TYPE(type) ((type) >= G_CHECKSUM_MD5 && (type) <= G_CHECKSUM_SHA256) + +/* The fact that these are lower case characters is part of the ABI */ +static const gchar hex_digits[] = "0123456789abcdef"; + +#define MD5_DATASIZE 64 +#define MD5_DIGEST_LEN 16 + +typedef struct +{ + guint32 buf[4]; + guint32 bits[2]; + + guchar data[MD5_DATASIZE]; + + guchar digest[MD5_DIGEST_LEN]; +} Md5sum; + +#define SHA1_DATASIZE 64 +#define SHA1_DIGEST_LEN 20 + +typedef struct +{ + guint32 buf[5]; + guint32 bits[2]; + + /* we pack 64 unsigned chars into 16 32-bit unsigned integers */ + guint32 data[16]; + + guchar digest[SHA1_DIGEST_LEN]; +} Sha1sum; + +#define SHA256_DATASIZE 64 +#define SHA256_DIGEST_LEN 32 + +typedef struct +{ + guint32 buf[8]; + guint32 bits[2]; + + guint8 data[SHA256_DATASIZE]; + + guchar digest[SHA256_DIGEST_LEN]; +} Sha256sum; + +struct _GChecksum +{ + GChecksumType type; + + gchar *digest_str; + + union { + Md5sum md5; + Sha1sum sha1; + Sha256sum sha256; + } sum; +}; + +/* we need different byte swapping functions because MD5 expects buffers + * to be little-endian, while SHA1 and SHA256 expect them in big-endian + * form. + */ + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define md5_byte_reverse(buffer,length) +#else +/* assume that the passed buffer is integer aligned */ +static inline void +md5_byte_reverse (guchar *buffer, + gulong length) +{ + guint32 bit; + + do + { + bit = (guint32) ((unsigned) buffer[3] << 8 | buffer[2]) << 16 | + ((unsigned) buffer[1] << 8 | buffer[0]); + * (guint32 *) buffer = bit; + buffer += 4; + } + while (--length); +} +#endif /* G_BYTE_ORDER == G_LITTLE_ENDIAN */ + +#if G_BYTE_ORDER == G_BIG_ENDIAN +#define sha_byte_reverse(buffer,length) +#else +static inline void +sha_byte_reverse (guint32 *buffer, + gint length) +{ + length /= sizeof (guint32); + while (length--) + { + *buffer = GUINT32_SWAP_LE_BE (*buffer); + ++buffer; + } +} +#endif /* G_BYTE_ORDER == G_BIG_ENDIAN */ + +static gchar * +digest_to_string (guint8 *digest, + gsize digest_len) +{ + gint len = digest_len * 2; + gint i; + gchar *retval; + + retval = g_new (gchar, len + 1); + + for (i = 0; i < digest_len; i++) + { + guint8 byte = digest[i]; + + retval[2 * i] = hex_digits[byte >> 4]; + retval[2 * i + 1] = hex_digits[byte & 0xf]; + } + + retval[len] = 0; + + return retval; +} + +/* + * MD5 Checksum + */ + +/* This MD5 digest computation is based on the equivalent code + * written by Colin Plumb. It came with this notice: + * + * 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. + */ + +static void +md5_sum_init (Md5sum *md5) +{ + /* arbitrary constants */ + md5->buf[0] = 0x67452301; + md5->buf[1] = 0xefcdab89; + md5->buf[2] = 0x98badcfe; + md5->buf[3] = 0x10325476; + + md5->bits[0] = md5->bits[1] = 0; +} + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. md5_sum_update() + * blocks the data and converts bytes into longwords for this routine. + */ +static void +md5_transform (guint32 buf[4], + guint32 const in[16]) +{ + register guint32 a, b, c, d; + +/* The four core functions - F1 is optimized somewhat */ +#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 md5_step(f, w, x, y, z, data, s) \ + ( w += f (x, y, z) + data, w = w << s | w >> (32 - s), w += x ) + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + md5_step (F1, a, b, c, d, in[0] + 0xd76aa478, 7); + md5_step (F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + md5_step (F1, c, d, a, b, in[2] + 0x242070db, 17); + md5_step (F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + md5_step (F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + md5_step (F1, d, a, b, c, in[5] + 0x4787c62a, 12); + md5_step (F1, c, d, a, b, in[6] + 0xa8304613, 17); + md5_step (F1, b, c, d, a, in[7] + 0xfd469501, 22); + md5_step (F1, a, b, c, d, in[8] + 0x698098d8, 7); + md5_step (F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + md5_step (F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + md5_step (F1, b, c, d, a, in[11] + 0x895cd7be, 22); + md5_step (F1, a, b, c, d, in[12] + 0x6b901122, 7); + md5_step (F1, d, a, b, c, in[13] + 0xfd987193, 12); + md5_step (F1, c, d, a, b, in[14] + 0xa679438e, 17); + md5_step (F1, b, c, d, a, in[15] + 0x49b40821, 22); + + md5_step (F2, a, b, c, d, in[1] + 0xf61e2562, 5); + md5_step (F2, d, a, b, c, in[6] + 0xc040b340, 9); + md5_step (F2, c, d, a, b, in[11] + 0x265e5a51, 14); + md5_step (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + md5_step (F2, a, b, c, d, in[5] + 0xd62f105d, 5); + md5_step (F2, d, a, b, c, in[10] + 0x02441453, 9); + md5_step (F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + md5_step (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + md5_step (F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + md5_step (F2, d, a, b, c, in[14] + 0xc33707d6, 9); + md5_step (F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + md5_step (F2, b, c, d, a, in[8] + 0x455a14ed, 20); + md5_step (F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + md5_step (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + md5_step (F2, c, d, a, b, in[7] + 0x676f02d9, 14); + md5_step (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + md5_step (F3, a, b, c, d, in[5] + 0xfffa3942, 4); + md5_step (F3, d, a, b, c, in[8] + 0x8771f681, 11); + md5_step (F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + md5_step (F3, b, c, d, a, in[14] + 0xfde5380c, 23); + md5_step (F3, a, b, c, d, in[1] + 0xa4beea44, 4); + md5_step (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + md5_step (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + md5_step (F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + md5_step (F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + md5_step (F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + md5_step (F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + md5_step (F3, b, c, d, a, in[6] + 0x04881d05, 23); + md5_step (F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + md5_step (F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + md5_step (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + md5_step (F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + md5_step (F4, a, b, c, d, in[0] + 0xf4292244, 6); + md5_step (F4, d, a, b, c, in[7] + 0x432aff97, 10); + md5_step (F4, c, d, a, b, in[14] + 0xab9423a7, 15); + md5_step (F4, b, c, d, a, in[5] + 0xfc93a039, 21); + md5_step (F4, a, b, c, d, in[12] + 0x655b59c3, 6); + md5_step (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + md5_step (F4, c, d, a, b, in[10] + 0xffeff47d, 15); + md5_step (F4, b, c, d, a, in[1] + 0x85845dd1, 21); + md5_step (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + md5_step (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + md5_step (F4, c, d, a, b, in[6] + 0xa3014314, 15); + md5_step (F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + md5_step (F4, a, b, c, d, in[4] + 0xf7537e82, 6); + md5_step (F4, d, a, b, c, in[11] + 0xbd3af235, 10); + md5_step (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + md5_step (F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; + +#undef F1 +#undef F2 +#undef F3 +#undef F4 +#undef md5_step +} + +static void +md5_sum_update (Md5sum *md5, + const guchar *data, + gsize length) +{ + guint32 bit; + + bit = md5->bits[0]; + md5->bits[0] = bit + ((guint32) length << 3); + + /* carry from low to high */ + if (md5->bits[0] < bit) + md5->bits[1] += 1; + + md5->bits[1] += length >> 29; + + /* bytes already in Md5sum->data */ + bit = (bit >> 3) & 0x3f; + + /* handle any leading odd-sized chunks */ + if (bit) + { + guchar *p = (guchar *) md5->data + bit; + + bit = MD5_DATASIZE - bit; + if (length < bit) + { + memcpy (p, data, length); + return; + } + + memcpy (p, data, bit); + + md5_byte_reverse (md5->data, 16); + md5_transform (md5->buf, (guint32 *) md5->data); + + data += bit; + length -= bit; + } + + /* process data in 64-byte chunks */ + while (length >= MD5_DATASIZE) + { + memcpy (md5->data, data, MD5_DATASIZE); + + md5_byte_reverse (md5->data, 16); + md5_transform (md5->buf, (guint32 *) md5->data); + + data += MD5_DATASIZE; + length -= MD5_DATASIZE; + } + + /* handle any remaining bytes of data */ + memcpy (md5->data, data, length); +} + +/* closes a checksum */ +static void +md5_sum_close (Md5sum *md5) +{ + guint count; + guchar *p; + + /* Compute number of bytes mod 64 */ + count = (md5->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 = md5->data + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = MD5_DATASIZE - 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); + + md5_byte_reverse (md5->data, 16); + md5_transform (md5->buf, (guint32 *) md5->data); + + /* Now fill the next block with 56 bytes */ + memset (md5->data, 0, MD5_DATASIZE - 8); + } + else + { + /* Pad block to 56 bytes */ + memset (p, 0, count - 8); + } + + md5_byte_reverse (md5->data, 14); + + /* Append length in bits and transform */ + ((guint32 *) md5->data)[14] = md5->bits[0]; + ((guint32 *) md5->data)[15] = md5->bits[1]; + + md5_transform (md5->buf, (guint32 *) md5->data); + md5_byte_reverse ((guchar *) md5->buf, 4); + + memcpy (md5->digest, md5->buf, 16); + + /* Reset buffers in case they contain sensitive data */ + memset (md5->buf, 0, sizeof (md5->buf)); + memset (md5->data, 0, sizeof (md5->data)); +} + +static gchar * +md5_sum_to_string (Md5sum *md5) +{ + return digest_to_string (md5->digest, MD5_DIGEST_LEN); +} + +static void +md5_sum_digest (Md5sum *md5, + guint8 *digest) +{ + gint i; + + for (i = 0; i < MD5_DIGEST_LEN; i++) + digest[i] = md5->digest[i]; +} + +/* + * SHA-1 Checksum + */ + +/* The following implementation comes from D-Bus dbus-sha.c. I've changed + * it to use GLib types and to work more like the MD5 implementation above. + * I left the comments to have an history of this code. + * -- Emmanuele Bassi, ebassi@gnome.org + */ + +/* The following comments have the history of where this code + * comes from. I actually copied it from GNet in GNOME CVS. + * - hp@redhat.com + */ + +/* + * sha.h : Implementation of the Secure Hash Algorithm + * + * Part of the Python Cryptography Toolkit, version 1.0.0 + * + * Copyright (C) 1995, A.M. Kuchling + * + * Distribute and use freely; there are no restrictions on further + * dissemination and usage except those imposed by the laws of your + * country of residence. + * + */ + +/* SHA: NIST's Secure Hash Algorithm */ + +/* Based on SHA code originally posted to sci.crypt by Peter Gutmann + in message <30ajo5$oe8@ccu2.auckland.ac.nz>. + Modified to test for endianness on creation of SHA objects by AMK. + Also, the original specification of SHA was found to have a weakness + by NSA/NIST. This code implements the fixed version of SHA. +*/ + +/* Here's the first paragraph of Peter Gutmann's posting: + +The following is my SHA (FIPS 180) code updated to allow use of the "fixed" +SHA, thanks to Jim Gillogly and an anonymous contributor for the information on +what's changed in the new version. The fix is a simple change which involves +adding a single rotate in the initial expansion function. It is unknown +whether this is an optimal solution to the problem which was discovered in the +SHA or whether it's simply a bandaid which fixes the problem with a minimum of +effort (for example the reengineering of a great many Capstone chips). +*/ + +static void +sha1_sum_init (Sha1sum *sha1) +{ + /* initialize constants */ + sha1->buf[0] = 0x67452301L; + sha1->buf[1] = 0xEFCDAB89L; + sha1->buf[2] = 0x98BADCFEL; + sha1->buf[3] = 0x10325476L; + sha1->buf[4] = 0xC3D2E1F0L; + + /* initialize bits */ + sha1->bits[0] = sha1->bits[1] = 0; +} + +/* The SHA f()-functions. */ + +#define f1(x,y,z) (z ^ (x & (y ^ z))) /* Rounds 0-19 */ +#define f2(x,y,z) (x ^ y ^ z) /* Rounds 20-39 */ +#define f3(x,y,z) (( x & y) | (z & (x | y))) /* Rounds 40-59 */ +#define f4(x,y,z) (x ^ y ^ z) /* Rounds 60-79 */ + +/* The SHA Mysterious Constants */ +#define K1 0x5A827999L /* Rounds 0-19 */ +#define K2 0x6ED9EBA1L /* Rounds 20-39 */ +#define K3 0x8F1BBCDCL /* Rounds 40-59 */ +#define K4 0xCA62C1D6L /* Rounds 60-79 */ + +/* 32-bit rotate left - kludged with shifts */ +#define ROTL(n,X) (((X) << n ) | ((X) >> (32 - n))) + +/* The initial expanding function. The hash function is defined over an + 80-word expanded input array W, where the first 16 are copies of the input + data, and the remaining 64 are defined by + + W[ i ] = W[ i - 16 ] ^ W[ i - 14 ] ^ W[ i - 8 ] ^ W[ i - 3 ] + + This implementation generates these values on the fly in a circular + buffer - thanks to Colin Plumb, colin@nyx10.cs.du.edu for this + optimization. + + The updated SHA changes the expanding function by adding a rotate of 1 + bit. Thanks to Jim Gillogly, jim@rand.org, and an anonymous contributor + for this information */ + +#define expand(W,i) (W[ i & 15 ] = ROTL (1, (W[ i & 15] ^ \ + W[(i - 14) & 15] ^ \ + W[(i - 8) & 15] ^ \ + W[(i - 3) & 15]))) + + +/* The prototype SHA sub-round. The fundamental sub-round is: + + a' = e + ROTL( 5, a ) + f( b, c, d ) + k + data; + b' = a; + c' = ROTL( 30, b ); + d' = c; + e' = d; + + but this is implemented by unrolling the loop 5 times and renaming the + variables ( e, a, b, c, d ) = ( a', b', c', d', e' ) each iteration. + This code is then replicated 20 times for each of the 4 functions, using + the next 20 values from the W[] array each time */ + +#define subRound(a, b, c, d, e, f, k, data) \ + (e += ROTL (5, a) + f(b, c, d) + k + data, b = ROTL (30, b)) + +static void +sha1_transform (guint32 buf[5], + guint32 in[16]) +{ + guint32 A, B, C, D, E; + + A = buf[0]; + B = buf[1]; + C = buf[2]; + D = buf[3]; + E = buf[4]; + + /* Heavy mangling, in 4 sub-rounds of 20 interations each. */ + subRound (A, B, C, D, E, f1, K1, in[0]); + subRound (E, A, B, C, D, f1, K1, in[1]); + subRound (D, E, A, B, C, f1, K1, in[2]); + subRound (C, D, E, A, B, f1, K1, in[3]); + subRound (B, C, D, E, A, f1, K1, in[4]); + subRound (A, B, C, D, E, f1, K1, in[5]); + subRound (E, A, B, C, D, f1, K1, in[6]); + subRound (D, E, A, B, C, f1, K1, in[7]); + subRound (C, D, E, A, B, f1, K1, in[8]); + subRound (B, C, D, E, A, f1, K1, in[9]); + subRound (A, B, C, D, E, f1, K1, in[10]); + subRound (E, A, B, C, D, f1, K1, in[11]); + subRound (D, E, A, B, C, f1, K1, in[12]); + subRound (C, D, E, A, B, f1, K1, in[13]); + subRound (B, C, D, E, A, f1, K1, in[14]); + subRound (A, B, C, D, E, f1, K1, in[15]); + subRound (E, A, B, C, D, f1, K1, expand (in, 16)); + subRound (D, E, A, B, C, f1, K1, expand (in, 17)); + subRound (C, D, E, A, B, f1, K1, expand (in, 18)); + subRound (B, C, D, E, A, f1, K1, expand (in, 19)); + + subRound (A, B, C, D, E, f2, K2, expand (in, 20)); + subRound (E, A, B, C, D, f2, K2, expand (in, 21)); + subRound (D, E, A, B, C, f2, K2, expand (in, 22)); + subRound (C, D, E, A, B, f2, K2, expand (in, 23)); + subRound (B, C, D, E, A, f2, K2, expand (in, 24)); + subRound (A, B, C, D, E, f2, K2, expand (in, 25)); + subRound (E, A, B, C, D, f2, K2, expand (in, 26)); + subRound (D, E, A, B, C, f2, K2, expand (in, 27)); + subRound (C, D, E, A, B, f2, K2, expand (in, 28)); + subRound (B, C, D, E, A, f2, K2, expand (in, 29)); + subRound (A, B, C, D, E, f2, K2, expand (in, 30)); + subRound (E, A, B, C, D, f2, K2, expand (in, 31)); + subRound (D, E, A, B, C, f2, K2, expand (in, 32)); + subRound (C, D, E, A, B, f2, K2, expand (in, 33)); + subRound (B, C, D, E, A, f2, K2, expand (in, 34)); + subRound (A, B, C, D, E, f2, K2, expand (in, 35)); + subRound (E, A, B, C, D, f2, K2, expand (in, 36)); + subRound (D, E, A, B, C, f2, K2, expand (in, 37)); + subRound (C, D, E, A, B, f2, K2, expand (in, 38)); + subRound (B, C, D, E, A, f2, K2, expand (in, 39)); + + subRound (A, B, C, D, E, f3, K3, expand (in, 40)); + subRound (E, A, B, C, D, f3, K3, expand (in, 41)); + subRound (D, E, A, B, C, f3, K3, expand (in, 42)); + subRound (C, D, E, A, B, f3, K3, expand (in, 43)); + subRound (B, C, D, E, A, f3, K3, expand (in, 44)); + subRound (A, B, C, D, E, f3, K3, expand (in, 45)); + subRound (E, A, B, C, D, f3, K3, expand (in, 46)); + subRound (D, E, A, B, C, f3, K3, expand (in, 47)); + subRound (C, D, E, A, B, f3, K3, expand (in, 48)); + subRound (B, C, D, E, A, f3, K3, expand (in, 49)); + subRound (A, B, C, D, E, f3, K3, expand (in, 50)); + subRound (E, A, B, C, D, f3, K3, expand (in, 51)); + subRound (D, E, A, B, C, f3, K3, expand (in, 52)); + subRound (C, D, E, A, B, f3, K3, expand (in, 53)); + subRound (B, C, D, E, A, f3, K3, expand (in, 54)); + subRound (A, B, C, D, E, f3, K3, expand (in, 55)); + subRound (E, A, B, C, D, f3, K3, expand (in, 56)); + subRound (D, E, A, B, C, f3, K3, expand (in, 57)); + subRound (C, D, E, A, B, f3, K3, expand (in, 58)); + subRound (B, C, D, E, A, f3, K3, expand (in, 59)); + + subRound (A, B, C, D, E, f4, K4, expand (in, 60)); + subRound (E, A, B, C, D, f4, K4, expand (in, 61)); + subRound (D, E, A, B, C, f4, K4, expand (in, 62)); + subRound (C, D, E, A, B, f4, K4, expand (in, 63)); + subRound (B, C, D, E, A, f4, K4, expand (in, 64)); + subRound (A, B, C, D, E, f4, K4, expand (in, 65)); + subRound (E, A, B, C, D, f4, K4, expand (in, 66)); + subRound (D, E, A, B, C, f4, K4, expand (in, 67)); + subRound (C, D, E, A, B, f4, K4, expand (in, 68)); + subRound (B, C, D, E, A, f4, K4, expand (in, 69)); + subRound (A, B, C, D, E, f4, K4, expand (in, 70)); + subRound (E, A, B, C, D, f4, K4, expand (in, 71)); + subRound (D, E, A, B, C, f4, K4, expand (in, 72)); + subRound (C, D, E, A, B, f4, K4, expand (in, 73)); + subRound (B, C, D, E, A, f4, K4, expand (in, 74)); + subRound (A, B, C, D, E, f4, K4, expand (in, 75)); + subRound (E, A, B, C, D, f4, K4, expand (in, 76)); + subRound (D, E, A, B, C, f4, K4, expand (in, 77)); + subRound (C, D, E, A, B, f4, K4, expand (in, 78)); + subRound (B, C, D, E, A, f4, K4, expand (in, 79)); + + /* Build message digest */ + buf[0] += A; + buf[1] += B; + buf[2] += C; + buf[3] += D; + buf[4] += E; +} + +#undef K1 +#undef K2 +#undef K3 +#undef K4 +#undef f1 +#undef f2 +#undef f3 +#undef f4 +#undef ROTL +#undef expand +#undef subRound + +static void +sha1_sum_update (Sha1sum *sha1, + const guchar *buffer, + gsize count) +{ + guint32 tmp; + guint dataCount; + + /* Update bitcount */ + tmp = sha1->bits[0]; + if ((sha1->bits[0] = tmp + ((guint32) count << 3) ) < tmp) + sha1->bits[1] += 1; /* Carry from low to high */ + sha1->bits[1] += count >> 29; + + /* Get count of bytes already in data */ + dataCount = (guint) (tmp >> 3) & 0x3F; + + /* Handle any leading odd-sized chunks */ + if (dataCount) + { + guchar *p = (guchar *) sha1->data + dataCount; + + dataCount = SHA1_DATASIZE - dataCount; + if (count < dataCount) + { + memcpy (p, buffer, count); + return; + } + + memcpy (p, buffer, dataCount); + + sha_byte_reverse (sha1->data, SHA1_DATASIZE); + sha1_transform (sha1->buf, sha1->data); + + buffer += dataCount; + count -= dataCount; + } + + /* Process data in SHA1_DATASIZE chunks */ + while (count >= SHA1_DATASIZE) + { + memcpy (sha1->data, buffer, SHA1_DATASIZE); + + sha_byte_reverse (sha1->data, SHA1_DATASIZE); + sha1_transform (sha1->buf, sha1->data); + + buffer += SHA1_DATASIZE; + count -= SHA1_DATASIZE; + } + + /* Handle any remaining bytes of data. */ + memcpy (sha1->data, buffer, count); +} + +/* Final wrapup - pad to SHA_DATASIZE-byte boundary with the bit pattern + 1 0* (64-bit count of bits processed, MSB-first) */ +static void +sha1_sum_close (Sha1sum *sha1) +{ + gint count; + guchar *data_p; + + /* Compute number of bytes mod 64 */ + count = (gint) ((sha1->bits[0] >> 3) & 0x3f); + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + data_p = (guchar *) sha1->data + count; + *data_p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = SHA1_DATASIZE - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) + { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset (data_p, 0, count); + + sha_byte_reverse (sha1->data, SHA1_DATASIZE); + sha1_transform (sha1->buf, sha1->data); + + /* Now fill the next block with 56 bytes */ + memset (sha1->data, 0, SHA1_DATASIZE - 8); + } + else + { + /* Pad block to 56 bytes */ + memset (data_p, 0, count - 8); + } + + /* Append length in bits and transform */ + sha1->data[14] = sha1->bits[1]; + sha1->data[15] = sha1->bits[0]; + + sha_byte_reverse (sha1->data, SHA1_DATASIZE - 8); + sha1_transform (sha1->buf, sha1->data); + sha_byte_reverse (sha1->buf, SHA1_DIGEST_LEN); + + memcpy (sha1->digest, sha1->buf, SHA1_DIGEST_LEN); + + /* Reset buffers in case they contain sensitive data */ + memset (sha1->buf, 0, sizeof (sha1->buf)); + memset (sha1->data, 0, sizeof (sha1->data)); +} + +static gchar * +sha1_sum_to_string (Sha1sum *sha1) +{ + return digest_to_string (sha1->digest, SHA1_DIGEST_LEN); +} + +static void +sha1_sum_digest (Sha1sum *sha1, + guint8 *digest) +{ + gint i; + + for (i = 0; i < SHA1_DIGEST_LEN; i++) + digest[i] = sha1->digest[i]; +} + +/* + * SHA-256 Checksum + */ + +/* adapted from the SHA256 implementation in gsk/src/hash/gskhash.c. + * + * Copyright (C) 2006 Dave Benson + * Released under the terms of the GNU Lesser General Public License + */ + +static void +sha256_sum_init (Sha256sum *sha256) +{ + sha256->buf[0] = 0x6a09e667; + sha256->buf[1] = 0xbb67ae85; + sha256->buf[2] = 0x3c6ef372; + sha256->buf[3] = 0xa54ff53a; + sha256->buf[4] = 0x510e527f; + sha256->buf[5] = 0x9b05688c; + sha256->buf[6] = 0x1f83d9ab; + sha256->buf[7] = 0x5be0cd19; + + sha256->bits[0] = sha256->bits[1] = 0; +} + +#define GET_UINT32(n,b,i) G_STMT_START{ \ + (n) = ((guint32) (b)[(i) ] << 24) \ + | ((guint32) (b)[(i) + 1] << 16) \ + | ((guint32) (b)[(i) + 2] << 8) \ + | ((guint32) (b)[(i) + 3] ); } G_STMT_END + +#define PUT_UINT32(n,b,i) G_STMT_START{ \ + (b)[(i) ] = (guint8) ((n) >> 24); \ + (b)[(i) + 1] = (guint8) ((n) >> 16); \ + (b)[(i) + 2] = (guint8) ((n) >> 8); \ + (b)[(i) + 3] = (guint8) ((n) ); } G_STMT_END + +static void +sha256_transform (guint32 buf[8], + guint8 const data[64]) +{ + guint32 temp1, temp2, W[64]; + guint32 A, B, C, D, E, F, G, H; + + GET_UINT32 (W[0], data, 0); + GET_UINT32 (W[1], data, 4); + GET_UINT32 (W[2], data, 8); + GET_UINT32 (W[3], data, 12); + GET_UINT32 (W[4], data, 16); + GET_UINT32 (W[5], data, 20); + GET_UINT32 (W[6], data, 24); + GET_UINT32 (W[7], data, 28); + GET_UINT32 (W[8], data, 32); + GET_UINT32 (W[9], data, 36); + GET_UINT32 (W[10], data, 40); + GET_UINT32 (W[11], data, 44); + GET_UINT32 (W[12], data, 48); + GET_UINT32 (W[13], data, 52); + GET_UINT32 (W[14], data, 56); + GET_UINT32 (W[15], data, 60); + +#define SHR(x,n) ((x & 0xFFFFFFFF) >> n) +#define ROTR(x,n) (SHR (x,n) | (x << (32 - n))) + +#define S0(x) (ROTR (x, 7) ^ ROTR (x,18) ^ SHR (x, 3)) +#define S1(x) (ROTR (x,17) ^ ROTR (x,19) ^ SHR (x,10)) +#define S2(x) (ROTR (x, 2) ^ ROTR (x,13) ^ ROTR (x,22)) +#define S3(x) (ROTR (x, 6) ^ ROTR (x,11) ^ ROTR (x,25)) + +#define F0(x,y,z) ((x & y) | (z & (x | y))) +#define F1(x,y,z) (z ^ (x & (y ^ z))) + +#define R(t) (W[t] = S1(W[t - 2]) + W[t - 7] + \ + S0(W[t - 15]) + W[t - 16]) + +#define P(a,b,c,d,e,f,g,h,x,K) G_STMT_START { \ + temp1 = h + S3(e) + F1(e,f,g) + K + x; \ + temp2 = S2(a) + F0(a,b,c); \ + d += temp1; h = temp1 + temp2; } G_STMT_END + + A = buf[0]; + B = buf[1]; + C = buf[2]; + D = buf[3]; + E = buf[4]; + F = buf[5]; + G = buf[6]; + H = buf[7]; + + P (A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98); + P (H, A, B, C, D, E, F, G, W[ 1], 0x71374491); + P (G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF); + P (F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5); + P (E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B); + P (D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1); + P (C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4); + P (B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5); + P (A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98); + P (H, A, B, C, D, E, F, G, W[ 9], 0x12835B01); + P (G, H, A, B, C, D, E, F, W[10], 0x243185BE); + P (F, G, H, A, B, C, D, E, W[11], 0x550C7DC3); + P (E, F, G, H, A, B, C, D, W[12], 0x72BE5D74); + P (D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE); + P (C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7); + P (B, C, D, E, F, G, H, A, W[15], 0xC19BF174); + P (A, B, C, D, E, F, G, H, R(16), 0xE49B69C1); + P (H, A, B, C, D, E, F, G, R(17), 0xEFBE4786); + P (G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6); + P (F, G, H, A, B, C, D, E, R(19), 0x240CA1CC); + P (E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F); + P (D, E, F, G, H, A, B, C, R(21), 0x4A7484AA); + P (C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC); + P (B, C, D, E, F, G, H, A, R(23), 0x76F988DA); + P (A, B, C, D, E, F, G, H, R(24), 0x983E5152); + P (H, A, B, C, D, E, F, G, R(25), 0xA831C66D); + P (G, H, A, B, C, D, E, F, R(26), 0xB00327C8); + P (F, G, H, A, B, C, D, E, R(27), 0xBF597FC7); + P (E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3); + P (D, E, F, G, H, A, B, C, R(29), 0xD5A79147); + P (C, D, E, F, G, H, A, B, R(30), 0x06CA6351); + P (B, C, D, E, F, G, H, A, R(31), 0x14292967); + P (A, B, C, D, E, F, G, H, R(32), 0x27B70A85); + P (H, A, B, C, D, E, F, G, R(33), 0x2E1B2138); + P (G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC); + P (F, G, H, A, B, C, D, E, R(35), 0x53380D13); + P (E, F, G, H, A, B, C, D, R(36), 0x650A7354); + P (D, E, F, G, H, A, B, C, R(37), 0x766A0ABB); + P (C, D, E, F, G, H, A, B, R(38), 0x81C2C92E); + P (B, C, D, E, F, G, H, A, R(39), 0x92722C85); + P (A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1); + P (H, A, B, C, D, E, F, G, R(41), 0xA81A664B); + P (G, H, A, B, C, D, E, F, R(42), 0xC24B8B70); + P (F, G, H, A, B, C, D, E, R(43), 0xC76C51A3); + P (E, F, G, H, A, B, C, D, R(44), 0xD192E819); + P (D, E, F, G, H, A, B, C, R(45), 0xD6990624); + P (C, D, E, F, G, H, A, B, R(46), 0xF40E3585); + P (B, C, D, E, F, G, H, A, R(47), 0x106AA070); + P (A, B, C, D, E, F, G, H, R(48), 0x19A4C116); + P (H, A, B, C, D, E, F, G, R(49), 0x1E376C08); + P (G, H, A, B, C, D, E, F, R(50), 0x2748774C); + P (F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5); + P (E, F, G, H, A, B, C, D, R(52), 0x391C0CB3); + P (D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A); + P (C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F); + P (B, C, D, E, F, G, H, A, R(55), 0x682E6FF3); + P (A, B, C, D, E, F, G, H, R(56), 0x748F82EE); + P (H, A, B, C, D, E, F, G, R(57), 0x78A5636F); + P (G, H, A, B, C, D, E, F, R(58), 0x84C87814); + P (F, G, H, A, B, C, D, E, R(59), 0x8CC70208); + P (E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA); + P (D, E, F, G, H, A, B, C, R(61), 0xA4506CEB); + P (C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7); + P (B, C, D, E, F, G, H, A, R(63), 0xC67178F2); + +#undef SHR +#undef ROTR +#undef S0 +#undef S1 +#undef S2 +#undef S3 +#undef F0 +#undef F1 +#undef R +#undef P + + buf[0] += A; + buf[1] += B; + buf[2] += C; + buf[3] += D; + buf[4] += E; + buf[5] += F; + buf[6] += G; + buf[7] += H; +} + +static void +sha256_sum_update (Sha256sum *sha256, + const guchar *buffer, + gsize length) +{ + guint32 left, fill; + const guint8 *input = buffer; + + if (length == 0) + return; + + left = sha256->bits[0] & 0x3F; + fill = 64 - left; + + sha256->bits[0] += length; + sha256->bits[0] &= 0xFFFFFFFF; + + if (sha256->bits[0] < length) + sha256->bits[1]++; + + if (left > 0 && length >= fill) + { + memcpy ((sha256->data + left), input, fill); + + sha256_transform (sha256->buf, sha256->data); + length -= fill; + input += fill; + + left = 0; + } + + while (length >= SHA256_DATASIZE) + { + sha256_transform (sha256->buf, input); + + length -= 64; + input += 64; + } + + if (length) + memcpy (sha256->data + left, input, length); +} + +static guint8 sha256_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static void +sha256_sum_close (Sha256sum *sha256) +{ + guint32 last, padn; + guint32 high, low; + guint8 msglen[8]; + + high = (sha256->bits[0] >> 29) + | (sha256->bits[1] << 3); + low = (sha256->bits[0] << 3); + + PUT_UINT32 (high, msglen, 0); + PUT_UINT32 (low, msglen, 4); + + last = sha256->bits[0] & 0x3F; + padn = (last < 56) ? (56 - last) : (120 - last); + + sha256_sum_update (sha256, sha256_padding, padn); + sha256_sum_update (sha256, msglen, 8); + + PUT_UINT32 (sha256->buf[0], sha256->digest, 0); + PUT_UINT32 (sha256->buf[1], sha256->digest, 4); + PUT_UINT32 (sha256->buf[2], sha256->digest, 8); + PUT_UINT32 (sha256->buf[3], sha256->digest, 12); + PUT_UINT32 (sha256->buf[4], sha256->digest, 16); + PUT_UINT32 (sha256->buf[5], sha256->digest, 20); + PUT_UINT32 (sha256->buf[6], sha256->digest, 24); + PUT_UINT32 (sha256->buf[7], sha256->digest, 28); +} + +#undef PUT_UINT32 +#undef GET_UINT32 + +static gchar * +sha256_sum_to_string (Sha256sum *sha256) +{ + return digest_to_string (sha256->digest, SHA256_DIGEST_LEN); +} + +static void +sha256_sum_digest (Sha256sum *sha256, + guint8 *digest) +{ + gint i; + + for (i = 0; i < SHA256_DIGEST_LEN; i++) + digest[i] = sha256->digest[i]; +} + + +/* + * Public API + */ + +/** + * g_checksum_type_get_length: + * @checksum_type: a #GChecksumType + * + * Gets the length in bytes of digests of type @checksum_type + * + * Return value: the checksum length, or -1 if @checksum_type is + * not supported. + * + * Since: 2.16 + */ +gssize +g_checksum_type_get_length (GChecksumType checksum_type) +{ + gssize len = -1; + + switch (checksum_type) + { + case G_CHECKSUM_MD5: + len = MD5_DIGEST_LEN; + break; + case G_CHECKSUM_SHA1: + len = SHA1_DIGEST_LEN; + break; + case G_CHECKSUM_SHA256: + len = SHA256_DIGEST_LEN; + break; + default: + len = -1; + break; + } + + return len; +} + +/** + * g_checksum_new: + * @checksum_type: the desired type of checksum + * + * Creates a new #GChecksum, using the checksum algorithm @checksum_type. + * If the @checksum_type is not known, %NULL is returned. + * A #GChecksum can be used to compute the checksum, or digest, of an + * arbitrary binary blob, using different hashing algorithms. + * + * A #GChecksum works by feeding a binary blob through g_checksum_update() + * until there is data to be checked; the digest can then be extracted + * using g_checksum_get_string(), which will return the checksum as a + * hexadecimal string; or g_checksum_get_digest(), which will return a + * vector of raw bytes. Once either g_checksum_get_string() or + * g_checksum_get_digest() have been called on a #GChecksum, the checksum + * will be closed and it won't be possible to call g_checksum_update() + * on it anymore. + * + * Return value: the newly created #GChecksum, or %NULL. + * Use g_checksum_free() to free the memory allocated by it. + * + * Since: 2.16 + */ +GChecksum * +g_checksum_new (GChecksumType checksum_type) +{ + GChecksum *checksum; + + if (! IS_VALID_TYPE (checksum_type)) + return NULL; + + checksum = g_slice_new0 (GChecksum); + checksum->type = checksum_type; + + g_checksum_reset (checksum); + + return checksum; +} + +/** + * g_checksum_reset: + * @checksum: the #GChecksum to reset + * + * Resets the state of the @checksum back to its initial state. + * + * Since: 2.18 + **/ +void +g_checksum_reset (GChecksum *checksum) +{ + g_return_if_fail (checksum != NULL); + + g_free (checksum->digest_str); + checksum->digest_str = NULL; + + switch (checksum->type) + { + case G_CHECKSUM_MD5: + md5_sum_init (&(checksum->sum.md5)); + break; + case G_CHECKSUM_SHA1: + sha1_sum_init (&(checksum->sum.sha1)); + break; + case G_CHECKSUM_SHA256: + sha256_sum_init (&(checksum->sum.sha256)); + break; + default: + g_assert_not_reached (); + break; + } +} + +/** + * g_checksum_copy: + * @checksum: the #GChecksum to copy + * + * Copies a #GChecksum. If @checksum has been closed, by calling + * g_checksum_get_string() or g_checksum_get_digest(), the copied + * checksum will be closed as well. + * + * Return value: the copy of the passed #GChecksum. Use g_checksum_free() + * when finished using it. + * + * Since: 2.16 + */ +GChecksum * +g_checksum_copy (const GChecksum *checksum) +{ + GChecksum *copy; + + g_return_val_if_fail (checksum != NULL, NULL); + + copy = g_slice_new (GChecksum); + *copy = *checksum; + + copy->digest_str = g_strdup (checksum->digest_str); + + return copy; +} + +/** + * g_checksum_free: + * @checksum: a #GChecksum + * + * Frees the memory allocated for @checksum. + * + * Since: 2.16 + */ +void +g_checksum_free (GChecksum *checksum) +{ + if (G_LIKELY (checksum)) + { + g_free (checksum->digest_str); + + g_slice_free (GChecksum, checksum); + } +} + +/** + * g_checksum_update: + * @checksum: a #GChecksum + * @data: buffer used to compute the checksum + * @length: size of the buffer, or -1 if it is a null-terminated string. + * + * Feeds @data into an existing #GChecksum. The checksum must still be + * open, that is g_checksum_get_string() or g_checksum_get_digest() must + * not have been called on @checksum. + * + * Since: 2.16 + */ +void +g_checksum_update (GChecksum *checksum, + const guchar *data, + gssize length) +{ + g_return_if_fail (checksum != NULL); + g_return_if_fail (data != NULL); + + if (length < 0) + length = strlen ((const gchar *) data); + + if (checksum->digest_str) + { + g_warning ("The checksum `%s' has been closed and cannot be updated " + "anymore.", + checksum->digest_str); + return; + } + + switch (checksum->type) + { + case G_CHECKSUM_MD5: + md5_sum_update (&(checksum->sum.md5), data, length); + break; + case G_CHECKSUM_SHA1: + sha1_sum_update (&(checksum->sum.sha1), data, length); + break; + case G_CHECKSUM_SHA256: + sha256_sum_update (&(checksum->sum.sha256), data, length); + break; + default: + g_assert_not_reached (); + break; + } +} + +/** + * g_checksum_get_string: + * @checksum: a #GChecksum + * + * Gets the digest as an hexadecimal string. + * + * Once this function has been called the #GChecksum can no longer be + * updated with g_checksum_update(). + * + * The hexadecimal characters will be lower case. + * + * Return value: the hexadecimal representation of the checksum. The + * returned string is owned by the checksum and should not be modified + * or freed. + * + * Since: 2.16 + */ +G_CONST_RETURN gchar * +g_checksum_get_string (GChecksum *checksum) +{ + gchar *str = NULL; + + g_return_val_if_fail (checksum != NULL, NULL); + + if (checksum->digest_str) + return checksum->digest_str; + + switch (checksum->type) + { + case G_CHECKSUM_MD5: + md5_sum_close (&(checksum->sum.md5)); + str = md5_sum_to_string (&(checksum->sum.md5)); + break; + case G_CHECKSUM_SHA1: + sha1_sum_close (&(checksum->sum.sha1)); + str = sha1_sum_to_string (&(checksum->sum.sha1)); + break; + case G_CHECKSUM_SHA256: + sha256_sum_close (&(checksum->sum.sha256)); + str = sha256_sum_to_string (&(checksum->sum.sha256)); + break; + default: + g_assert_not_reached (); + break; + } + + checksum->digest_str = str; + + return checksum->digest_str; +} + +/** + * g_checksum_get_digest: + * @checksum: a #GChecksum + * @buffer: output buffer + * @digest_len: an inout parameter. The caller initializes it to the size of @buffer. + * After the call it contains the length of the digest. + * + * Gets the digest from @checksum as a raw binary vector and places it + * into @buffer. The size of the digest depends on the type of checksum. + * + * Once this function has been called, the #GChecksum is closed and can + * no longer be updated with g_checksum_update(). + * + * Since: 2.16 + */ +void +g_checksum_get_digest (GChecksum *checksum, + guint8 *buffer, + gsize *digest_len) +{ + gboolean checksum_open = FALSE; + gchar *str = NULL; + gsize len; + + g_return_if_fail (checksum != NULL); + + len = g_checksum_type_get_length (checksum->type); + g_return_if_fail (*digest_len >= len); + + checksum_open = !!(checksum->digest_str == NULL); + + switch (checksum->type) + { + case G_CHECKSUM_MD5: + if (checksum_open) + { + md5_sum_close (&(checksum->sum.md5)); + str = md5_sum_to_string (&(checksum->sum.md5)); + } + md5_sum_digest (&(checksum->sum.md5), buffer); + break; + case G_CHECKSUM_SHA1: + if (checksum_open) + { + sha1_sum_close (&(checksum->sum.sha1)); + str = sha1_sum_to_string (&(checksum->sum.sha1)); + } + sha1_sum_digest (&(checksum->sum.sha1), buffer); + break; + case G_CHECKSUM_SHA256: + if (checksum_open) + { + sha256_sum_close (&(checksum->sum.sha256)); + str = sha256_sum_to_string (&(checksum->sum.sha256)); + } + sha256_sum_digest (&(checksum->sum.sha256), buffer); + break; + default: + g_assert_not_reached (); + break; + } + + if (str) + checksum->digest_str = str; + + *digest_len = len; +} + +/** + * g_compute_checksum_for_data: + * @checksum_type: a #GChecksumType + * @data: binary blob to compute the digest of + * @length: length of @data + * + * Computes the checksum for a binary @data of @length. This is a + * convenience wrapper for g_checksum_new(), g_checksum_get_string() + * and g_checksum_free(). + * + * The hexadecimal string returned will be in lower case. + * + * Return value: the digest of the binary data as a string in hexadecimal. + * The returned string should be freed with g_free() when done using it. + * + * Since: 2.16 + */ +gchar * +g_compute_checksum_for_data (GChecksumType checksum_type, + const guchar *data, + gsize length) +{ + GChecksum *checksum; + gchar *retval; + + g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL); + g_return_val_if_fail (data != NULL, NULL); + + checksum = g_checksum_new (checksum_type); + if (!checksum) + return NULL; + + g_checksum_update (checksum, data, length); + retval = g_strdup (g_checksum_get_string (checksum)); + g_checksum_free (checksum); + + return retval; +} + +/** + * g_compute_checksum_for_string: + * @checksum_type: a #GChecksumType + * @str: the string to compute the checksum of + * @length: the length of the string, or -1 if the string is null-terminated. + * + * Computes the checksum of a string. + * + * The hexadecimal string returned will be in lower case. + * + * Return value: the checksum as a hexadecimal string. The returned string + * should be freed with g_free() when done using it. + * + * Since: 2.16 + */ +gchar * +g_compute_checksum_for_string (GChecksumType checksum_type, + const gchar *str, + gssize length) +{ + g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL); + g_return_val_if_fail (str != NULL, NULL); + + if (length < 0) + length = strlen (str); + + return g_compute_checksum_for_data (checksum_type, (const guchar *) str, length); +} + +#define __G_CHECKSUM_C__ +#include "galiasdef.c" diff --git a/glib/gchecksum.h b/glib/gchecksum.h new file mode 100644 index 0000000..03f1e86 --- /dev/null +++ b/glib/gchecksum.h @@ -0,0 +1,86 @@ +/* gchecksum.h - data hashing functions + * + * Copyright (C) 2007 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CHECKSUM_H__ +#define __G_CHECKSUM_H__ + +#include + +G_BEGIN_DECLS + +/** + * GChecksumType: + * @G_CHECKSUM_MD5: Use the MD5 hashing algorithm + * @G_CHECKSUM_SHA1: Use the SHA-1 hashing algorithm + * @G_CHECKSUM_SHA256: Use the SHA-256 hashing algorithm + * + * The hashing algorithm to be used by #GChecksum when performing the + * digest of some data. + * + * Note that the #GChecksumType enumeration may be extended at a later + * date to include new hashing algorithm types. + * + * Since: 2.16 + */ +typedef enum { + G_CHECKSUM_MD5, + G_CHECKSUM_SHA1, + G_CHECKSUM_SHA256 +} GChecksumType; + +/** + * GChecksum: + * + * An opaque structure representing a checksumming operation. + * To create a new GChecksum, use g_checksum_new(). To free + * a GChecksum, use g_checksum_free(). + * + * Since: 2.16 + */ +typedef struct _GChecksum GChecksum; + +gssize g_checksum_type_get_length (GChecksumType checksum_type); + +GChecksum * g_checksum_new (GChecksumType checksum_type); +void g_checksum_reset (GChecksum *checksum); +GChecksum * g_checksum_copy (const GChecksum *checksum); +void g_checksum_free (GChecksum *checksum); +void g_checksum_update (GChecksum *checksum, + const guchar *data, + gssize length); +G_CONST_RETURN gchar *g_checksum_get_string (GChecksum *checksum); +void g_checksum_get_digest (GChecksum *checksum, + guint8 *buffer, + gsize *digest_len); + +gchar *g_compute_checksum_for_data (GChecksumType checksum_type, + const guchar *data, + gsize length); +gchar *g_compute_checksum_for_string (GChecksumType checksum_type, + const gchar *str, + gssize length); + +G_END_DECLS + +#endif /* __G_CHECKSUM_H__ */ diff --git a/glib/gcompletion.c b/glib/gcompletion.c new file mode 100644 index 0000000..904f850 --- /dev/null +++ b/glib/gcompletion.c @@ -0,0 +1,472 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: completion + * @title: Automatic String Completion + * @short_description: support for automatic completion using a group + * of target strings + * + * #GCompletion provides support for automatic completion of a string + * using any group of target strings. It is typically used for file + * name completion as is common in many UNIX shells. + * + * A #GCompletion is created using g_completion_new(). Target items are + * added and removed with g_completion_add_items(), + * g_completion_remove_items() and g_completion_clear_items(). A + * completion attempt is requested with g_completion_complete() or + * g_completion_complete_utf8(). When no longer needed, the + * #GCompletion is freed with g_completion_free(). + * + * Items in the completion can be simple strings (e.g. filenames), or + * pointers to arbitrary data structures. If data structures are used + * you must provide a #GCompletionFunc in g_completion_new(), which + * retrieves the item's string from the data structure. You can change + * the way in which strings are compared by setting a different + * #GCompletionStrncmpFunc in g_completion_set_compare(). + **/ + +/** + * GCompletion: + * @items: list of target items (strings or data structures). + * @func: function which is called to get the string associated with a + * target item. It is %NULL if the target items are strings. + * @prefix: the last prefix passed to g_completion_complete() or + * g_completion_complete_utf8(). + * @cache: the list of items which begin with @prefix. + * @strncmp_func: The function to use when comparing strings. Use + * g_completion_set_compare() to modify this function. + * + * The data structure used for automatic completion. + **/ + +/** + * GCompletionFunc: + * @Param1: the completion item. + * @Returns: the string corresponding to the item. + * + * Specifies the type of the function passed to g_completion_new(). It + * should return the string corresponding to the given target item. + * This is used when you use data structures as #GCompletion items. + **/ + +/** + * GCompletionStrncmpFunc: + * @s1: string to compare with @s2. + * @s2: string to compare with @s1. + * @n: maximal number of bytes to compare. + * @Returns: an integer less than, equal to, or greater than zero if + * the first @n bytes of @s1 is found, respectively, to be + * less than, to match, or to be greater than the first @n + * bytes of @s2. + * + * Specifies the type of the function passed to + * g_completion_set_compare(). This is used when you use strings as + * #GCompletion items. + **/ + +static void completion_check_cache (GCompletion* cmp, + gchar** new_prefix); + +/** + * g_completion_new: + * @func: the function to be called to return the string representing + * an item in the #GCompletion, or %NULL if strings are going to + * be used as the #GCompletion items. + * @Returns: the new #GCompletion. + * + * Creates a new #GCompletion. + **/ +GCompletion* +g_completion_new (GCompletionFunc func) +{ + GCompletion* gcomp; + + gcomp = g_new (GCompletion, 1); + gcomp->items = NULL; + gcomp->cache = NULL; + gcomp->prefix = NULL; + gcomp->func = func; + gcomp->strncmp_func = strncmp; + + return gcomp; +} + +/** + * g_completion_add_items: + * @cmp: the #GCompletion. + * @items: the list of items to add. + * + * Adds items to the #GCompletion. + **/ +void +g_completion_add_items (GCompletion* cmp, + GList* items) +{ + GList* it; + + g_return_if_fail (cmp != NULL); + + /* optimize adding to cache? */ + if (cmp->cache) + { + g_list_free (cmp->cache); + cmp->cache = NULL; + } + + if (cmp->prefix) + { + g_free (cmp->prefix); + cmp->prefix = NULL; + } + + it = items; + while (it) + { + cmp->items = g_list_prepend (cmp->items, it->data); + it = it->next; + } +} + +/** + * g_completion_remove_items: + * @cmp: the #GCompletion. + * @items: the items to remove. + * + * Removes items from a #GCompletion. + **/ +void +g_completion_remove_items (GCompletion* cmp, + GList* items) +{ + GList* it; + + g_return_if_fail (cmp != NULL); + + it = items; + while (cmp->items && it) + { + cmp->items = g_list_remove (cmp->items, it->data); + it = it->next; + } + + it = items; + while (cmp->cache && it) + { + cmp->cache = g_list_remove(cmp->cache, it->data); + it = it->next; + } +} + +/** + * g_completion_clear_items: + * @cmp: the #GCompletion. + * + * Removes all items from the #GCompletion. + **/ +void +g_completion_clear_items (GCompletion* cmp) +{ + g_return_if_fail (cmp != NULL); + + g_list_free (cmp->items); + cmp->items = NULL; + g_list_free (cmp->cache); + cmp->cache = NULL; + g_free (cmp->prefix); + cmp->prefix = NULL; +} + +static void +completion_check_cache (GCompletion* cmp, + gchar** new_prefix) +{ + register GList* list; + register gsize len; + register gsize i; + register gsize plen; + gchar* postfix; + gchar* s; + + if (!new_prefix) + return; + if (!cmp->cache) + { + *new_prefix = NULL; + return; + } + + len = strlen(cmp->prefix); + list = cmp->cache; + s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; + postfix = s + len; + plen = strlen (postfix); + list = list->next; + + while (list && plen) + { + s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; + s += len; + for (i = 0; i < plen; ++i) + { + if (postfix[i] != s[i]) + break; + } + plen = i; + list = list->next; + } + + *new_prefix = g_new0 (gchar, len + plen + 1); + strncpy (*new_prefix, cmp->prefix, len); + strncpy (*new_prefix + len, postfix, plen); +} + +/** + * g_completion_complete_utf8: + * @cmp: the #GCompletion + * @prefix: the prefix string, typically used by the user, which is compared + * with each of the items + * @new_prefix: if non-%NULL, returns the longest prefix which is common to all + * items that matched @prefix, or %NULL if no items matched @prefix. + * This string should be freed when no longer needed. + * + * Attempts to complete the string @prefix using the #GCompletion target items. + * In contrast to g_completion_complete(), this function returns the largest common + * prefix that is a valid UTF-8 string, omitting a possible common partial + * character. + * + * You should use this function instead of g_completion_complete() if your + * items are UTF-8 strings. + * + * Return value: the list of items whose strings begin with @prefix. This should + * not be changed. + * + * Since: 2.4 + **/ +GList* +g_completion_complete_utf8 (GCompletion *cmp, + const gchar *prefix, + gchar **new_prefix) +{ + GList *list; + gchar *p, *q; + + list = g_completion_complete (cmp, prefix, new_prefix); + + if (new_prefix && *new_prefix) + { + p = *new_prefix + strlen (*new_prefix); + q = g_utf8_find_prev_char (*new_prefix, p); + + switch (g_utf8_get_char_validated (q, p - q)) + { + case (gunichar)-2: + case (gunichar)-1: + *q = 0; + break; + default: ; + } + + } + + return list; +} + +/** + * g_completion_complete: + * @cmp: the #GCompletion. + * @prefix: the prefix string, typically typed by the user, which is + * compared with each of the items. + * @new_prefix: if non-%NULL, returns the longest prefix which is + * common to all items that matched @prefix, or %NULL if + * no items matched @prefix. This string should be freed + * when no longer needed. + * @Returns: the list of items whose strings begin with @prefix. This + * should not be changed. + * + * Attempts to complete the string @prefix using the #GCompletion + * target items. + **/ +GList* +g_completion_complete (GCompletion* cmp, + const gchar* prefix, + gchar** new_prefix) +{ + gsize plen, len; + gboolean done = FALSE; + GList* list; + + g_return_val_if_fail (cmp != NULL, NULL); + g_return_val_if_fail (prefix != NULL, NULL); + + len = strlen (prefix); + if (cmp->prefix && cmp->cache) + { + plen = strlen (cmp->prefix); + if (plen <= len && ! cmp->strncmp_func (prefix, cmp->prefix, plen)) + { + /* use the cache */ + list = cmp->cache; + while (list) + { + GList *next = list->next; + + if (cmp->strncmp_func (prefix, + cmp->func ? cmp->func (list->data) : (gchar*) list->data, + len)) + cmp->cache = g_list_delete_link (cmp->cache, list); + + list = next; + } + done = TRUE; + } + } + + if (!done) + { + /* normal code */ + g_list_free (cmp->cache); + cmp->cache = NULL; + list = cmp->items; + while (*prefix && list) + { + if (!cmp->strncmp_func (prefix, + cmp->func ? cmp->func (list->data) : (gchar*) list->data, + len)) + cmp->cache = g_list_prepend (cmp->cache, list->data); + list = list->next; + } + } + if (cmp->prefix) + { + g_free (cmp->prefix); + cmp->prefix = NULL; + } + if (cmp->cache) + cmp->prefix = g_strdup (prefix); + completion_check_cache (cmp, new_prefix); + + return *prefix ? cmp->cache : cmp->items; +} + +/** + * g_completion_free: + * @cmp: the #GCompletion. + * + * Frees all memory used by the #GCompletion. + **/ +void +g_completion_free (GCompletion* cmp) +{ + g_return_if_fail (cmp != NULL); + + g_completion_clear_items (cmp); + g_free (cmp); +} + +/** + * g_completion_set_compare: + * @cmp: a #GCompletion. + * @strncmp_func: the string comparison function. + * + * Sets the function to use for string comparisons. The default string + * comparison function is strncmp(). + **/ +void +g_completion_set_compare(GCompletion *cmp, + GCompletionStrncmpFunc strncmp_func) +{ + cmp->strncmp_func = strncmp_func; +} + +#ifdef TEST_COMPLETION +#include +int +main (int argc, + char* argv[]) +{ + FILE *file; + gchar buf[1024]; + GList *list; + GList *result; + GList *tmp; + GCompletion *cmp; + gint i; + gchar *longp = NULL; + + if (argc < 3) + { + g_warning ("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]); + return 1; + } + + file = fopen (argv[1], "r"); + if (!file) + { + g_warning ("Cannot open %s\n", argv[1]); + return 1; + } + + cmp = g_completion_new (NULL); + list = g_list_alloc (); + while (fgets (buf, 1024, file)) + { + list->data = g_strdup (buf); + g_completion_add_items (cmp, list); + } + fclose (file); + + for (i = 2; i < argc; ++i) + { + printf ("COMPLETING: %s\n", argv[i]); + result = g_completion_complete (cmp, argv[i], &longp); + g_list_foreach (result, (GFunc) printf, NULL); + printf ("LONG MATCH: %s\n", longp); + g_free (longp); + longp = NULL; + } + + g_list_foreach (cmp->items, (GFunc) g_free, NULL); + g_completion_free (cmp); + g_list_free (list); + + return 0; +} +#endif + +#define __G_COMPLETION_C__ +#include "galiasdef.c" diff --git a/glib/gcompletion.h b/glib/gcompletion.h new file mode 100644 index 0000000..900883e --- /dev/null +++ b/glib/gcompletion.h @@ -0,0 +1,77 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_COMPLETION_H__ +#define __G_COMPLETION_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GCompletion GCompletion; + +typedef gchar* (*GCompletionFunc) (gpointer); + +/* GCompletion + */ + +typedef gint (*GCompletionStrncmpFunc) (const gchar *s1, + const gchar *s2, + gsize n); + +struct _GCompletion +{ + GList* items; + GCompletionFunc func; + + gchar* prefix; + GList* cache; + GCompletionStrncmpFunc strncmp_func; +}; + +GCompletion* g_completion_new (GCompletionFunc func); +void g_completion_add_items (GCompletion* cmp, + GList* items); +void g_completion_remove_items (GCompletion* cmp, + GList* items); +void g_completion_clear_items (GCompletion* cmp); +GList* g_completion_complete (GCompletion* cmp, + const gchar* prefix, + gchar** new_prefix); +GList* g_completion_complete_utf8 (GCompletion *cmp, + const gchar* prefix, + gchar** new_prefix); +void g_completion_set_compare (GCompletion *cmp, + GCompletionStrncmpFunc strncmp_func); +void g_completion_free (GCompletion* cmp); + +G_END_DECLS + +#endif /* __G_COMPLETION_H__ */ diff --git a/glib/gconvert.c b/glib/gconvert.c new file mode 100644 index 0000000..520c32a --- /dev/null +++ b/glib/gconvert.c @@ -0,0 +1,2130 @@ +/* GLIB - Library of useful routines for C programming + * + * gconvert.c: Convert between character sets using iconv + * Copyright Red Hat Inc., 2000 + * Authors: Havoc Pennington , Owen Taylor + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "glib.h" + +#ifndef G_OS_WIN32 +#include +#endif +#include +#include +#include +#include + +#include "gprintfint.h" +#include "gthreadprivate.h" +#include "gunicode.h" + +#ifdef G_OS_WIN32 +#include "win_iconv.c" +#endif + +#ifdef G_PLATFORM_WIN32 +#define STRICT +#include +#undef STRICT +#endif + +#include "glibintl.h" + +#if defined(USE_LIBICONV_GNU) && !defined (_LIBICONV_H) +#error GNU libiconv in use but included iconv.h not from libiconv +#endif +#if !defined(USE_LIBICONV_GNU) && defined (_LIBICONV_H) +#error GNU libiconv not in use but included iconv.h is from libiconv +#endif + +#include "galias.h" + +/* We try to terminate strings in unknown charsets with this many zero bytes + * to ensure that multibyte strings really are nul-terminated when we return + * them from g_convert() and friends. + */ +#define NUL_TERMINATOR_LENGTH 4 + +GQuark +g_convert_error_quark (void) +{ + return g_quark_from_static_string ("g_convert_error"); +} + +static gboolean +try_conversion (const char *to_codeset, + const char *from_codeset, + iconv_t *cd) +{ + *cd = iconv_open (to_codeset, from_codeset); + + if (*cd == (iconv_t)-1 && errno == EINVAL) + return FALSE; + else + return TRUE; +} + +static gboolean +try_to_aliases (const char **to_aliases, + const char *from_codeset, + iconv_t *cd) +{ + if (to_aliases) + { + const char **p = to_aliases; + while (*p) + { + if (try_conversion (*p, from_codeset, cd)) + return TRUE; + + p++; + } + } + + return FALSE; +} + +G_GNUC_INTERNAL extern const char ** +_g_charset_get_aliases (const char *canonical_name); + +/** + * g_iconv_open: + * @to_codeset: destination codeset + * @from_codeset: source codeset + * + * Same as the standard UNIX routine iconv_open(), but + * may be implemented via libiconv on UNIX flavors that lack + * a native implementation. + * + * GLib provides g_convert() and g_locale_to_utf8() which are likely + * more convenient than the raw iconv wrappers. + * + * Return value: a "conversion descriptor", or (GIConv)-1 if + * opening the converter failed. + **/ +GIConv +g_iconv_open (const gchar *to_codeset, + const gchar *from_codeset) +{ + iconv_t cd; + + if (!try_conversion (to_codeset, from_codeset, &cd)) + { + const char **to_aliases = _g_charset_get_aliases (to_codeset); + const char **from_aliases = _g_charset_get_aliases (from_codeset); + + if (from_aliases) + { + const char **p = from_aliases; + while (*p) + { + if (try_conversion (to_codeset, *p, &cd)) + goto out; + + if (try_to_aliases (to_aliases, *p, &cd)) + goto out; + + p++; + } + } + + if (try_to_aliases (to_aliases, from_codeset, &cd)) + goto out; + } + + out: + return (cd == (iconv_t)-1) ? (GIConv)-1 : (GIConv)cd; +} + +/** + * g_iconv: + * @converter: conversion descriptor from g_iconv_open() + * @inbuf: bytes to convert + * @inbytes_left: inout parameter, bytes remaining to convert in @inbuf + * @outbuf: converted output bytes + * @outbytes_left: inout parameter, bytes available to fill in @outbuf + * + * Same as the standard UNIX routine iconv(), but + * may be implemented via libiconv on UNIX flavors that lack + * a native implementation. + * + * GLib provides g_convert() and g_locale_to_utf8() which are likely + * more convenient than the raw iconv wrappers. + * + * Return value: count of non-reversible conversions, or -1 on error + **/ +gsize +g_iconv (GIConv converter, + gchar **inbuf, + gsize *inbytes_left, + gchar **outbuf, + gsize *outbytes_left) +{ + iconv_t cd = (iconv_t)converter; + + return iconv (cd, inbuf, inbytes_left, outbuf, outbytes_left); +} + +/** + * g_iconv_close: + * @converter: a conversion descriptor from g_iconv_open() + * + * Same as the standard UNIX routine iconv_close(), but + * may be implemented via libiconv on UNIX flavors that lack + * a native implementation. Should be called to clean up + * the conversion descriptor from g_iconv_open() when + * you are done converting things. + * + * GLib provides g_convert() and g_locale_to_utf8() which are likely + * more convenient than the raw iconv wrappers. + * + * Return value: -1 on error, 0 on success + **/ +gint +g_iconv_close (GIConv converter) +{ + iconv_t cd = (iconv_t)converter; + + return iconv_close (cd); +} + + +#ifdef NEED_ICONV_CACHE + +#define ICONV_CACHE_SIZE (16) + +struct _iconv_cache_bucket { + gchar *key; + guint32 refcount; + gboolean used; + GIConv cd; +}; + +static GList *iconv_cache_list; +static GHashTable *iconv_cache; +static GHashTable *iconv_open_hash; +static guint iconv_cache_size = 0; +G_LOCK_DEFINE_STATIC (iconv_cache_lock); + +/* caller *must* hold the iconv_cache_lock */ +static void +iconv_cache_init (void) +{ + static gboolean initialized = FALSE; + + if (initialized) + return; + + iconv_cache_list = NULL; + iconv_cache = g_hash_table_new (g_str_hash, g_str_equal); + iconv_open_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + + initialized = TRUE; +} + + +/* + * iconv_cache_bucket_new: + * @key: cache key + * @cd: iconv descriptor + * + * Creates a new cache bucket, inserts it into the cache and + * increments the cache size. + * + * This assumes ownership of @key. + * + * Returns a pointer to the newly allocated cache bucket. + **/ +static struct _iconv_cache_bucket * +iconv_cache_bucket_new (gchar *key, GIConv cd) +{ + struct _iconv_cache_bucket *bucket; + + bucket = g_new (struct _iconv_cache_bucket, 1); + bucket->key = key; + bucket->refcount = 1; + bucket->used = TRUE; + bucket->cd = cd; + + g_hash_table_insert (iconv_cache, bucket->key, bucket); + + /* FIXME: if we sorted the list so items with few refcounts were + first, then we could expire them faster in iconv_cache_expire_unused () */ + iconv_cache_list = g_list_prepend (iconv_cache_list, bucket); + + iconv_cache_size++; + + return bucket; +} + + +/* + * iconv_cache_bucket_expire: + * @node: cache bucket's node + * @bucket: cache bucket + * + * Expires a single cache bucket @bucket. This should only ever be + * called on a bucket that currently has no used iconv descriptors + * open. + * + * @node is not a required argument. If @node is not supplied, we + * search for it ourselves. + **/ +static void +iconv_cache_bucket_expire (GList *node, struct _iconv_cache_bucket *bucket) +{ + g_hash_table_remove (iconv_cache, bucket->key); + + if (node == NULL) + node = g_list_find (iconv_cache_list, bucket); + + g_assert (node != NULL); + + if (node->prev) + { + node->prev->next = node->next; + if (node->next) + node->next->prev = node->prev; + } + else + { + iconv_cache_list = node->next; + if (node->next) + node->next->prev = NULL; + } + + g_list_free_1 (node); + + g_free (bucket->key); + g_iconv_close (bucket->cd); + g_free (bucket); + + iconv_cache_size--; +} + + +/* + * iconv_cache_expire_unused: + * + * Expires as many unused cache buckets as it needs to in order to get + * the total number of buckets < ICONV_CACHE_SIZE. + **/ +static void +iconv_cache_expire_unused (void) +{ + struct _iconv_cache_bucket *bucket; + GList *node, *next; + + node = iconv_cache_list; + while (node && iconv_cache_size >= ICONV_CACHE_SIZE) + { + next = node->next; + + bucket = node->data; + if (bucket->refcount == 0) + iconv_cache_bucket_expire (node, bucket); + + node = next; + } +} + +static GIConv +open_converter (const gchar *to_codeset, + const gchar *from_codeset, + GError **error) +{ + struct _iconv_cache_bucket *bucket; + gchar *key, *dyn_key, auto_key[80]; + GIConv cd; + gsize len_from_codeset, len_to_codeset; + + /* create our key */ + len_from_codeset = strlen (from_codeset); + len_to_codeset = strlen (to_codeset); + if (len_from_codeset + len_to_codeset + 2 < sizeof (auto_key)) + { + key = auto_key; + dyn_key = NULL; + } + else + key = dyn_key = g_malloc (len_from_codeset + len_to_codeset + 2); + memcpy (key, from_codeset, len_from_codeset); + key[len_from_codeset] = ':'; + strcpy (key + len_from_codeset + 1, to_codeset); + + G_LOCK (iconv_cache_lock); + + /* make sure the cache has been initialized */ + iconv_cache_init (); + + bucket = g_hash_table_lookup (iconv_cache, key); + if (bucket) + { + g_free (dyn_key); + + if (bucket->used) + { + cd = g_iconv_open (to_codeset, from_codeset); + if (cd == (GIConv) -1) + goto error; + } + 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.) + */ + gsize inbytes_left = 0; + gchar *outbuf = NULL; + gsize outbytes_left = 0; + + cd = bucket->cd; + bucket->used = TRUE; + + /* reset the descriptor */ + g_iconv (cd, NULL, &inbytes_left, &outbuf, &outbytes_left); + } + + bucket->refcount++; + } + else + { + cd = g_iconv_open (to_codeset, from_codeset); + if (cd == (GIConv) -1) + { + g_free (dyn_key); + goto error; + } + + iconv_cache_expire_unused (); + + bucket = iconv_cache_bucket_new (dyn_key ? dyn_key : g_strdup (key), cd); + } + + g_hash_table_insert (iconv_open_hash, cd, bucket->key); + + G_UNLOCK (iconv_cache_lock); + + return cd; + + error: + + G_UNLOCK (iconv_cache_lock); + + /* Something went wrong. */ + if (error) + { + if (errno == EINVAL) + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, + _("Conversion from character set '%s' to '%s' is not supported"), + from_codeset, to_codeset); + else + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Could not open converter from '%s' to '%s'"), + from_codeset, to_codeset); + } + + return cd; +} + +static int +close_converter (GIConv converter) +{ + struct _iconv_cache_bucket *bucket; + const gchar *key; + GIConv cd; + + cd = converter; + + if (cd == (GIConv) -1) + return 0; + + G_LOCK (iconv_cache_lock); + + key = g_hash_table_lookup (iconv_open_hash, cd); + if (key) + { + g_hash_table_remove (iconv_open_hash, cd); + + bucket = g_hash_table_lookup (iconv_cache, key); + g_assert (bucket); + + bucket->refcount--; + + if (cd == bucket->cd) + bucket->used = FALSE; + else + g_iconv_close (cd); + + if (!bucket->refcount && iconv_cache_size > ICONV_CACHE_SIZE) + { + /* expire this cache bucket */ + iconv_cache_bucket_expire (NULL, bucket); + } + } + else + { + G_UNLOCK (iconv_cache_lock); + + g_warning ("This iconv context wasn't opened using open_converter"); + + return g_iconv_close (converter); + } + + G_UNLOCK (iconv_cache_lock); + + return 0; +} + +#else /* !NEED_ICONV_CACHE */ + +static GIConv +open_converter (const gchar *to_codeset, + const gchar *from_codeset, + GError **error) +{ + GIConv cd; + + cd = g_iconv_open (to_codeset, from_codeset); + + if (cd == (GIConv) -1) + { + /* Something went wrong. */ + if (error) + { + if (errno == EINVAL) + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, + _("Conversion from character set '%s' to '%s' is not supported"), + from_codeset, to_codeset); + else + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Could not open converter from '%s' to '%s'"), + from_codeset, to_codeset); + } + } + + return cd; +} + +static int +close_converter (GIConv cd) +{ + if (cd == (GIConv) -1) + return 0; + + return g_iconv_close (cd); +} + +#endif /* NEED_ICONV_CACHE */ + +/** + * g_convert_with_iconv: + * @str: the string to convert + * @len: the length of the string, or -1 if the string is + * nul-terminated. + * @converter: conversion descriptor from g_iconv_open() + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. If the error + * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + * stored will the byte offset after the last valid + * input sequence. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string from one character set to another. + * + * Note that you should use g_iconv() for streaming + * conversions + * + * Despite the fact that @byes_read can return information about partial + * characters, the g_convert_... functions + * are not generally suitable for streaming. If the underlying converter + * being used maintains internal state, then this won't be preserved + * across successive calls to g_convert(), g_convert_with_iconv() or + * g_convert_with_fallback(). (An example of this is the GNU C converter + * for CP1255 which does not emit a base character until it knows that + * the next character is not a mark that could combine with the base + * character.) + * + * . + * + * Return value: If the conversion was successful, a newly allocated + * nul-terminated string, which must be freed with + * g_free(). Otherwise %NULL and @error will be set. + **/ +gchar* +g_convert_with_iconv (const gchar *str, + gssize len, + GIConv converter, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + gchar *dest; + gchar *outp; + const gchar *p; + gsize inbytes_remaining; + gsize outbytes_remaining; + gsize err; + gsize outbuf_size; + gboolean have_error = FALSE; + gboolean done = FALSE; + gboolean reset = FALSE; + + g_return_val_if_fail (converter != (GIConv) -1, NULL); + + if (len < 0) + len = strlen (str); + + p = str; + inbytes_remaining = len; + outbuf_size = len + NUL_TERMINATOR_LENGTH; + + outbytes_remaining = outbuf_size - NUL_TERMINATOR_LENGTH; + outp = dest = g_malloc (outbuf_size); + + while (!done && !have_error) + { + if (reset) + err = g_iconv (converter, NULL, &inbytes_remaining, &outp, &outbytes_remaining); + else + err = g_iconv (converter, (char **)&p, &inbytes_remaining, &outp, &outbytes_remaining); + + if (err == (gsize) -1) + { + switch (errno) + { + case EINVAL: + /* Incomplete text, do not report an error */ + done = TRUE; + break; + case E2BIG: + { + gsize used = outp - dest; + + outbuf_size *= 2; + dest = g_realloc (dest, outbuf_size); + + outp = dest + used; + outbytes_remaining = outbuf_size - used - NUL_TERMINATOR_LENGTH; + } + break; + case EILSEQ: + if (error) + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + have_error = TRUE; + break; + default: + { + int errsv = errno; + + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Error during conversion: %s"), + g_strerror (errsv)); + } + have_error = TRUE; + break; + } + } + else + { + if (!reset) + { + /* call g_iconv with NULL inbuf to cleanup shift state */ + reset = TRUE; + inbytes_remaining = 0; + } + else + done = TRUE; + } + } + + memset (outp, 0, NUL_TERMINATOR_LENGTH); + + if (bytes_read) + *bytes_read = p - str; + else + { + if ((p - str) != len) + { + if (!have_error) + { + if (error) + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); + have_error = TRUE; + } + } + } + + if (bytes_written) + *bytes_written = outp - dest; /* Doesn't include '\0' */ + + if (have_error) + { + g_free (dest); + return NULL; + } + else + return dest; +} + +/** + * g_convert: + * @str: the string to convert + * @len: the length of the string, or -1 if the string is + * nul-terminated + + Note that some encodings may allow nul bytes to + occur inside strings. In that case, using -1 for + the @len parameter is unsafe. + + . + * @to_codeset: name of character set into which to convert @str + * @from_codeset: character set of @str. + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. If the error + * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + * stored will the byte offset after the last valid + * input sequence. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string from one character set to another. + * + * Note that you should use g_iconv() for streaming + * conversions. + * + * Return value: If the conversion was successful, a newly allocated + * nul-terminated string, which must be freed with + * g_free(). Otherwise %NULL and @error will be set. + **/ +gchar* +g_convert (const gchar *str, + gssize len, + const gchar *to_codeset, + const gchar *from_codeset, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + gchar *res; + GIConv cd; + + g_return_val_if_fail (str != NULL, NULL); + g_return_val_if_fail (to_codeset != NULL, NULL); + g_return_val_if_fail (from_codeset != NULL, NULL); + + cd = open_converter (to_codeset, from_codeset, error); + + if (cd == (GIConv) -1) + { + if (bytes_read) + *bytes_read = 0; + + if (bytes_written) + *bytes_written = 0; + + return NULL; + } + + res = g_convert_with_iconv (str, len, cd, + bytes_read, bytes_written, + error); + + close_converter (cd); + + return res; +} + +/** + * g_convert_with_fallback: + * @str: the string to convert + * @len: the length of the string, or -1 if the string is + * nul-terminated. + * @to_codeset: name of character set into which to convert @str + * @from_codeset: character set of @str. + * @fallback: UTF-8 string to use in place of character not + * present in the target encoding. (The string must be + * representable in the target encoding). + If %NULL, characters not in the target encoding will + be represented as Unicode escapes \uxxxx or \Uxxxxyyyy. + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string from one character set to another, possibly + * including fallback sequences for characters not representable + * in the output. Note that it is not guaranteed that the specification + * for the fallback sequences in @fallback will be honored. Some + * systems may do an approximate conversion from @from_codeset + * to @to_codeset in their iconv() functions, + * in which case GLib will simply return that approximate conversion. + * + * Note that you should use g_iconv() for streaming + * conversions. + * + * Return value: If the conversion was successful, a newly allocated + * nul-terminated string, which must be freed with + * g_free(). Otherwise %NULL and @error will be set. + **/ +gchar* +g_convert_with_fallback (const gchar *str, + gssize len, + const gchar *to_codeset, + const gchar *from_codeset, + const gchar *fallback, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + gchar *utf8; + gchar *dest; + gchar *outp; + const gchar *insert_str = NULL; + const gchar *p; + gsize inbytes_remaining; + const gchar *save_p = NULL; + gsize save_inbytes = 0; + gsize outbytes_remaining; + gsize err; + GIConv cd; + gsize outbuf_size; + gboolean have_error = FALSE; + gboolean done = FALSE; + + GError *local_error = NULL; + + g_return_val_if_fail (str != NULL, NULL); + g_return_val_if_fail (to_codeset != NULL, NULL); + g_return_val_if_fail (from_codeset != NULL, NULL); + + if (len < 0) + len = strlen (str); + + /* Try an exact conversion; we only proceed if this fails + * due to an illegal sequence in the input string. + */ + dest = g_convert (str, len, to_codeset, from_codeset, + bytes_read, bytes_written, &local_error); + if (!local_error) + return dest; + + if (!g_error_matches (local_error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE)) + { + g_propagate_error (error, local_error); + return NULL; + } + else + g_error_free (local_error); + + local_error = NULL; + + /* No go; to proceed, we need a converter from "UTF-8" to + * to_codeset, and the string as UTF-8. + */ + cd = open_converter (to_codeset, "UTF-8", error); + if (cd == (GIConv) -1) + { + if (bytes_read) + *bytes_read = 0; + + if (bytes_written) + *bytes_written = 0; + + return NULL; + } + + utf8 = g_convert (str, len, "UTF-8", from_codeset, + bytes_read, &inbytes_remaining, error); + if (!utf8) + { + close_converter (cd); + if (bytes_written) + *bytes_written = 0; + return NULL; + } + + /* Now the heart of the code. We loop through the UTF-8 string, and + * whenever we hit an offending character, we form fallback, convert + * the fallback to the target codeset, and then go back to + * converting the original string after finishing with the fallback. + * + * The variables save_p and save_inbytes store the input state + * for the original string while we are converting the fallback + */ + p = utf8; + + outbuf_size = len + NUL_TERMINATOR_LENGTH; + outbytes_remaining = outbuf_size - NUL_TERMINATOR_LENGTH; + outp = dest = g_malloc (outbuf_size); + + while (!done && !have_error) + { + gsize inbytes_tmp = inbytes_remaining; + err = g_iconv (cd, (char **)&p, &inbytes_tmp, &outp, &outbytes_remaining); + inbytes_remaining = inbytes_tmp; + + if (err == (gsize) -1) + { + switch (errno) + { + case EINVAL: + g_assert_not_reached(); + break; + case E2BIG: + { + gsize used = outp - dest; + + outbuf_size *= 2; + dest = g_realloc (dest, outbuf_size); + + outp = dest + used; + outbytes_remaining = outbuf_size - used - NUL_TERMINATOR_LENGTH; + + break; + } + case EILSEQ: + if (save_p) + { + /* Error converting fallback string - fatal + */ + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Cannot convert fallback '%s' to codeset '%s'"), + insert_str, to_codeset); + have_error = TRUE; + break; + } + else if (p) + { + if (!fallback) + { + gunichar ch = g_utf8_get_char (p); + insert_str = g_strdup_printf (ch < 0x10000 ? "\\u%04x" : "\\U%08x", + ch); + } + else + insert_str = fallback; + + save_p = g_utf8_next_char (p); + save_inbytes = inbytes_remaining - (save_p - p); + p = insert_str; + inbytes_remaining = strlen (p); + break; + } + /* fall thru if p is NULL */ + default: + { + int errsv = errno; + + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Error during conversion: %s"), + g_strerror (errsv)); + } + + have_error = TRUE; + break; + } + } + else + { + if (save_p) + { + if (!fallback) + g_free ((gchar *)insert_str); + p = save_p; + inbytes_remaining = save_inbytes; + save_p = NULL; + } + else if (p) + { + /* call g_iconv with NULL inbuf to cleanup shift state */ + p = NULL; + inbytes_remaining = 0; + } + else + done = TRUE; + } + } + + /* Cleanup + */ + memset (outp, 0, NUL_TERMINATOR_LENGTH); + + close_converter (cd); + + if (bytes_written) + *bytes_written = outp - dest; /* Doesn't include '\0' */ + + g_free (utf8); + + if (have_error) + { + if (save_p && !fallback) + g_free ((gchar *)insert_str); + g_free (dest); + return NULL; + } + else + return dest; +} + +/* + * g_locale_to_utf8 + * + * + */ + +static gchar * +strdup_len (const gchar *string, + gssize len, + gsize *bytes_written, + gsize *bytes_read, + GError **error) + +{ + gsize real_len; + + if (!g_utf8_validate (string, len, NULL)) + { + if (bytes_read) + *bytes_read = 0; + if (bytes_written) + *bytes_written = 0; + + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + return NULL; + } + + if (len < 0) + real_len = strlen (string); + else + { + real_len = 0; + + while (real_len < len && string[real_len]) + real_len++; + } + + if (bytes_read) + *bytes_read = real_len; + if (bytes_written) + *bytes_written = real_len; + + return g_strndup (string, real_len); +} + +/** + * g_locale_to_utf8: + * @opsysstring: a string in the encoding of the current locale. On Windows + * this means the system codepage. + * @len: the length of the string, or -1 if the string is + * nul-terminated. + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. If the error + * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + * stored will the byte offset after the last valid + * input sequence. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string which is in the encoding used for strings by + * the C runtime (usually the same as that used by the operating + * system) in the current locale into a + * UTF-8 string. + * + * Return value: The converted string, or %NULL on an error. + **/ +gchar * +g_locale_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + const char *charset; + + if (g_get_charset (&charset)) + return strdup_len (opsysstring, len, bytes_read, bytes_written, error); + else + return g_convert (opsysstring, len, + "UTF-8", charset, bytes_read, bytes_written, error); +} + +/** + * g_locale_from_utf8: + * @utf8string: a UTF-8 encoded string + * @len: the length of the string, or -1 if the string is + * nul-terminated. + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. If the error + * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + * stored will the byte offset after the last valid + * input sequence. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string from UTF-8 to the encoding used for strings by + * the C runtime (usually the same as that used by the operating + * system) in the current locale. On + * Windows this means the system codepage. + * + * Return value: The converted string, or %NULL on an error. + **/ +gchar * +g_locale_from_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + const gchar *charset; + + if (g_get_charset (&charset)) + return strdup_len (utf8string, len, bytes_read, bytes_written, error); + else + return g_convert (utf8string, len, + charset, "UTF-8", bytes_read, bytes_written, error); +} + +#ifndef G_PLATFORM_WIN32 + +typedef struct _GFilenameCharsetCache GFilenameCharsetCache; + +struct _GFilenameCharsetCache { + gboolean is_utf8; + gchar *charset; + gchar **filename_charsets; +}; + +static void +filename_charset_cache_free (gpointer data) +{ + GFilenameCharsetCache *cache = data; + g_free (cache->charset); + g_strfreev (cache->filename_charsets); + g_free (cache); +} + +/** + * g_get_filename_charsets: + * @charsets: return location for the %NULL-terminated list of encoding names + * + * Determines the preferred character sets used for filenames. + * The first character set from the @charsets is the filename encoding, the + * subsequent character sets are used when trying to generate a displayable + * representation of a filename, see g_filename_display_name(). + * + * On Unix, the character sets are determined by consulting the + * environment variables G_FILENAME_ENCODING and + * G_BROKEN_FILENAMES. On Windows, the character set + * used in the GLib API is always UTF-8 and said environment variables + * have no effect. + * + * G_FILENAME_ENCODING may be set to a comma-separated list + * of character set names. The special token "@locale" is taken to + * mean the character set for the current + * locale. If G_FILENAME_ENCODING is not set, but + * G_BROKEN_FILENAMES is, the character set of the current + * locale is taken as the filename encoding. If neither environment variable + * is set, UTF-8 is taken as the filename encoding, but the character + * set of the current locale is also put in the list of encodings. + * + * The returned @charsets belong to GLib and must not be freed. + * + * Note that on Unix, regardless of the locale character set or + * G_FILENAME_ENCODING value, the actual file names present + * on a system might be in any random encoding or just gibberish. + * + * Return value: %TRUE if the filename encoding is UTF-8. + * + * Since: 2.6 + */ +gboolean +g_get_filename_charsets (G_CONST_RETURN gchar ***filename_charsets) +{ + static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT; + GFilenameCharsetCache *cache = g_static_private_get (&cache_private); + const gchar *charset; + + if (!cache) + { + cache = g_new0 (GFilenameCharsetCache, 1); + g_static_private_set (&cache_private, cache, filename_charset_cache_free); + } + + g_get_charset (&charset); + + if (!(cache->charset && strcmp (cache->charset, charset) == 0)) + { + const gchar *new_charset; + gchar *p; + gint i; + + g_free (cache->charset); + g_strfreev (cache->filename_charsets); + cache->charset = g_strdup (charset); + + p = getenv ("G_FILENAME_ENCODING"); + if (p != NULL && p[0] != '\0') + { + cache->filename_charsets = g_strsplit (p, ",", 0); + cache->is_utf8 = (strcmp (cache->filename_charsets[0], "UTF-8") == 0); + + for (i = 0; cache->filename_charsets[i]; i++) + { + if (strcmp ("@locale", cache->filename_charsets[i]) == 0) + { + g_get_charset (&new_charset); + g_free (cache->filename_charsets[i]); + cache->filename_charsets[i] = g_strdup (new_charset); + } + } + } + else if (getenv ("G_BROKEN_FILENAMES") != NULL) + { + cache->filename_charsets = g_new0 (gchar *, 2); + cache->is_utf8 = g_get_charset (&new_charset); + cache->filename_charsets[0] = g_strdup (new_charset); + } + else + { + cache->filename_charsets = g_new0 (gchar *, 3); + cache->is_utf8 = TRUE; + cache->filename_charsets[0] = g_strdup ("UTF-8"); + if (!g_get_charset (&new_charset)) + cache->filename_charsets[1] = g_strdup (new_charset); + } + } + + if (filename_charsets) + *filename_charsets = (const gchar **)cache->filename_charsets; + + return cache->is_utf8; +} + +#else /* G_PLATFORM_WIN32 */ + +gboolean +g_get_filename_charsets (G_CONST_RETURN gchar ***filename_charsets) +{ + static const gchar *charsets[] = { + "UTF-8", + NULL + }; + +#ifdef G_OS_WIN32 + /* On Windows GLib pretends that the filename charset is UTF-8 */ + if (filename_charsets) + *filename_charsets = charsets; + + return TRUE; +#else + gboolean result; + + /* Cygwin works like before */ + result = g_get_charset (&(charsets[0])); + + if (filename_charsets) + *filename_charsets = charsets; + + return result; +#endif +} + +#endif /* G_PLATFORM_WIN32 */ + +static gboolean +get_filename_charset (const gchar **filename_charset) +{ + const gchar **charsets; + gboolean is_utf8; + + is_utf8 = g_get_filename_charsets (&charsets); + + if (filename_charset) + *filename_charset = charsets[0]; + + return is_utf8; +} + +/* This is called from g_thread_init(). It's used to + * initialize some static data in a threadsafe way. + */ +void +_g_convert_thread_init (void) +{ + const gchar **dummy; + (void) g_get_filename_charsets (&dummy); +} + +/** + * g_filename_to_utf8: + * @opsysstring: a string in the encoding for filenames + * @len: the length of the string, or -1 if the string is + * nul-terminated. + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. If the error + * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + * stored will the byte offset after the last valid + * input sequence. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string which is in the encoding used by GLib for + * filenames into a UTF-8 string. Note that on Windows GLib uses UTF-8 + * for filenames; on other platforms, this function indirectly depends on + * the current locale. + * + * Return value: The converted string, or %NULL on an error. + **/ +gchar* +g_filename_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + const gchar *charset; + + if (get_filename_charset (&charset)) + return strdup_len (opsysstring, len, bytes_read, bytes_written, error); + else + return g_convert (opsysstring, len, + "UTF-8", charset, bytes_read, bytes_written, error); +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +#undef g_filename_to_utf8 + +/* Binary compatibility version. Not for newly compiled code. Also not needed for + * 64-bit versions as there should be no old deployed binaries that would use + * the old versions. + */ + +gchar* +g_filename_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + const gchar *charset; + + if (g_get_charset (&charset)) + return strdup_len (opsysstring, len, bytes_read, bytes_written, error); + else + return g_convert (opsysstring, len, + "UTF-8", charset, bytes_read, bytes_written, error); +} + +#endif + +/** + * g_filename_from_utf8: + * @utf8string: a UTF-8 encoded string. + * @len: the length of the string, or -1 if the string is + * nul-terminated. + * @bytes_read: location to store the number of bytes in the + * input string that were successfully converted, or %NULL. + * Even if the conversion was successful, this may be + * less than @len if there were partial characters + * at the end of the input. If the error + * #G_CONVERT_ERROR_ILLEGAL_SEQUENCE occurs, the value + * stored will the byte offset after the last valid + * input sequence. + * @bytes_written: the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts a string from UTF-8 to the encoding GLib uses for + * filenames. Note that on Windows GLib uses UTF-8 for filenames; + * on other platforms, this function indirectly depends on the + * current locale. + * + * Return value: The converted string, or %NULL on an error. + **/ +gchar* +g_filename_from_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + const gchar *charset; + + if (get_filename_charset (&charset)) + return strdup_len (utf8string, len, bytes_read, bytes_written, error); + else + return g_convert (utf8string, len, + charset, "UTF-8", bytes_read, bytes_written, error); +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +#undef g_filename_from_utf8 + +/* Binary compatibility version. Not for newly compiled code. */ + +gchar* +g_filename_from_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) +{ + const gchar *charset; + + if (g_get_charset (&charset)) + return strdup_len (utf8string, len, bytes_read, bytes_written, error); + else + return g_convert (utf8string, len, + charset, "UTF-8", bytes_read, bytes_written, error); +} + +#endif + +/* Test of haystack has the needle prefix, comparing case + * insensitive. haystack may be UTF-8, but needle must + * contain only ascii. */ +static gboolean +has_case_prefix (const gchar *haystack, const gchar *needle) +{ + const gchar *h, *n; + + /* Eat one character at a time. */ + h = haystack; + n = needle; + + while (*n && *h && + g_ascii_tolower (*n) == g_ascii_tolower (*h)) + { + n++; + h++; + } + + return *n == '\0'; +} + +typedef enum { + UNSAFE_ALL = 0x1, /* Escape all unsafe characters */ + UNSAFE_ALLOW_PLUS = 0x2, /* Allows '+' */ + UNSAFE_PATH = 0x8, /* Allows '/', '&', '=', ':', '@', '+', '$' and ',' */ + UNSAFE_HOST = 0x10, /* Allows '/' and ':' and '@' */ + UNSAFE_SLASHES = 0x20 /* Allows all characters except for '/' and '%' */ +} UnsafeCharacterSet; + +static const guchar acceptable[96] = { + /* A table of the ASCII chars from space (32) to DEL (127) */ + /* ! " # $ % & ' ( ) * + , - . / */ + 0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C, + /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20, + /* @ A B C D E F G H I J K L M N O */ + 0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + /* P Q R S T U V W X Y Z [ \ ] ^ _ */ + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F, + /* ` a b c d e f g h i j k l m n o */ + 0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F, + /* p q r s t u v w x y z { | } ~ DEL */ + 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20 +}; + +static const gchar hex[16] = "0123456789ABCDEF"; + +/* Note: This escape function works on file: URIs, but if you want to + * escape something else, please read RFC-2396 */ +static gchar * +g_escape_uri_string (const gchar *string, + UnsafeCharacterSet mask) +{ +#define ACCEPTABLE(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask)) + + const gchar *p; + gchar *q; + gchar *result; + int c; + gint unacceptable; + UnsafeCharacterSet use_mask; + + g_return_val_if_fail (mask == UNSAFE_ALL + || mask == UNSAFE_ALLOW_PLUS + || mask == UNSAFE_PATH + || mask == UNSAFE_HOST + || mask == UNSAFE_SLASHES, NULL); + + unacceptable = 0; + use_mask = mask; + for (p = string; *p != '\0'; p++) + { + c = (guchar) *p; + if (!ACCEPTABLE (c)) + unacceptable++; + } + + result = g_malloc (p - string + unacceptable * 2 + 1); + + use_mask = mask; + for (q = result, p = string; *p != '\0'; p++) + { + c = (guchar) *p; + + if (!ACCEPTABLE (c)) + { + *q++ = '%'; /* means hex coming */ + *q++ = hex[c >> 4]; + *q++ = hex[c & 15]; + } + else + *q++ = *p; + } + + *q = '\0'; + + return result; +} + + +static gchar * +g_escape_file_uri (const gchar *hostname, + const gchar *pathname) +{ + char *escaped_hostname = NULL; + char *escaped_path; + char *res; + +#ifdef G_OS_WIN32 + char *p, *backslash; + + /* Turn backslashes into forward slashes. That's what Netscape + * does, and they are actually more or less equivalent in Windows. + */ + + pathname = g_strdup (pathname); + p = (char *) pathname; + + while ((backslash = strchr (p, '\\')) != NULL) + { + *backslash = '/'; + p = backslash + 1; + } +#endif + + if (hostname && *hostname != '\0') + { + escaped_hostname = g_escape_uri_string (hostname, UNSAFE_HOST); + } + + escaped_path = g_escape_uri_string (pathname, UNSAFE_PATH); + + res = g_strconcat ("file://", + (escaped_hostname) ? escaped_hostname : "", + (*escaped_path != '/') ? "/" : "", + escaped_path, + NULL); + +#ifdef G_OS_WIN32 + g_free ((char *) pathname); +#endif + + g_free (escaped_hostname); + g_free (escaped_path); + + return res; +} + +static int +unescape_character (const char *scanner) +{ + int first_digit; + int second_digit; + + first_digit = g_ascii_xdigit_value (scanner[0]); + if (first_digit < 0) + return -1; + + second_digit = g_ascii_xdigit_value (scanner[1]); + if (second_digit < 0) + return -1; + + return (first_digit << 4) | second_digit; +} + +static gchar * +g_unescape_uri_string (const char *escaped, + int len, + const char *illegal_escaped_characters, + gboolean ascii_must_not_be_escaped) +{ + const gchar *in, *in_end; + gchar *out, *result; + int c; + + if (escaped == NULL) + return NULL; + + if (len < 0) + len = strlen (escaped); + + result = g_malloc (len + 1); + + out = result; + for (in = escaped, in_end = escaped + len; in < in_end; in++) + { + c = *in; + + if (c == '%') + { + /* catch partial escape sequences past the end of the substring */ + if (in + 3 > in_end) + break; + + c = unescape_character (in + 1); + + /* catch bad escape sequences and NUL characters */ + if (c <= 0) + break; + + /* catch escaped ASCII */ + if (ascii_must_not_be_escaped && c <= 0x7F) + break; + + /* catch other illegal escaped characters */ + if (strchr (illegal_escaped_characters, c) != NULL) + break; + + in += 2; + } + + *out++ = c; + } + + g_assert (out - result <= len); + *out = '\0'; + + if (in != in_end) + { + g_free (result); + return NULL; + } + + return result; +} + +static gboolean +is_asciialphanum (gunichar c) +{ + return c <= 0x7F && g_ascii_isalnum (c); +} + +static gboolean +is_asciialpha (gunichar c) +{ + return c <= 0x7F && g_ascii_isalpha (c); +} + +/* allows an empty string */ +static gboolean +hostname_validate (const char *hostname) +{ + const char *p; + gunichar c, first_char, last_char; + + p = hostname; + if (*p == '\0') + return TRUE; + do + { + /* read in a label */ + c = g_utf8_get_char (p); + p = g_utf8_next_char (p); + if (!is_asciialphanum (c)) + return FALSE; + first_char = c; + do + { + last_char = c; + c = g_utf8_get_char (p); + p = g_utf8_next_char (p); + } + while (is_asciialphanum (c) || c == '-'); + if (last_char == '-') + return FALSE; + + /* if that was the last label, check that it was a toplabel */ + if (c == '\0' || (c == '.' && *p == '\0')) + return is_asciialpha (first_char); + } + while (c == '.'); + return FALSE; +} + +/** + * g_filename_from_uri: + * @uri: a uri describing a filename (escaped, encoded in ASCII). + * @hostname: Location to store hostname for the URI, or %NULL. + * If there is no hostname in the URI, %NULL will be + * stored in this location. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts an escaped ASCII-encoded URI to a local filename in the + * encoding used for filenames. + * + * Return value: a newly-allocated string holding the resulting + * filename, or %NULL on an error. + **/ +gchar * +g_filename_from_uri (const gchar *uri, + gchar **hostname, + GError **error) +{ + const char *path_part; + const char *host_part; + char *unescaped_hostname; + char *result; + char *filename; + int offs; +#ifdef G_OS_WIN32 + char *p, *slash; +#endif + + if (hostname) + *hostname = NULL; + + if (!has_case_prefix (uri, "file:/")) + { + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, + _("The URI '%s' is not an absolute URI using the \"file\" scheme"), + uri); + return NULL; + } + + path_part = uri + strlen ("file:"); + + if (strchr (path_part, '#') != NULL) + { + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, + _("The local file URI '%s' may not include a '#'"), + uri); + return NULL; + } + + if (has_case_prefix (path_part, "///")) + path_part += 2; + else if (has_case_prefix (path_part, "//")) + { + path_part += 2; + host_part = path_part; + + path_part = strchr (path_part, '/'); + + if (path_part == NULL) + { + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, + _("The URI '%s' is invalid"), + uri); + return NULL; + } + + unescaped_hostname = g_unescape_uri_string (host_part, path_part - host_part, "", TRUE); + + if (unescaped_hostname == NULL || + !hostname_validate (unescaped_hostname)) + { + g_free (unescaped_hostname); + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, + _("The hostname of the URI '%s' is invalid"), + uri); + return NULL; + } + + if (hostname) + *hostname = unescaped_hostname; + else + g_free (unescaped_hostname); + } + + filename = g_unescape_uri_string (path_part, -1, "/", FALSE); + + if (filename == NULL) + { + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_BAD_URI, + _("The URI '%s' contains invalidly escaped characters"), + uri); + return NULL; + } + + offs = 0; +#ifdef G_OS_WIN32 + /* Drop localhost */ + if (hostname && *hostname != NULL && + g_ascii_strcasecmp (*hostname, "localhost") == 0) + { + g_free (*hostname); + *hostname = NULL; + } + + /* Turn slashes into backslashes, because that's the canonical spelling */ + p = filename; + while ((slash = strchr (p, '/')) != NULL) + { + *slash = '\\'; + p = slash + 1; + } + + /* Windows URIs with a drive letter can be like "file://host/c:/foo" + * or "file://host/c|/foo" (some Netscape versions). In those cases, start + * the filename from the drive letter. + */ + if (g_ascii_isalpha (filename[1])) + { + if (filename[2] == ':') + offs = 1; + else if (filename[2] == '|') + { + filename[2] = ':'; + offs = 1; + } + } +#endif + + result = g_strdup (filename + offs); + g_free (filename); + + return result; +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +#undef g_filename_from_uri + +gchar * +g_filename_from_uri (const gchar *uri, + gchar **hostname, + GError **error) +{ + gchar *utf8_filename; + gchar *retval = NULL; + + utf8_filename = g_filename_from_uri_utf8 (uri, hostname, error); + if (utf8_filename) + { + retval = g_locale_from_utf8 (utf8_filename, -1, NULL, NULL, error); + g_free (utf8_filename); + } + return retval; +} + +#endif + +/** + * g_filename_to_uri: + * @filename: an absolute filename specified in the GLib file name encoding, + * which is the on-disk file name bytes on Unix, and UTF-8 on + * Windows + * @hostname: A UTF-8 encoded hostname, or %NULL for none. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError may occur. + * + * Converts an absolute filename to an escaped ASCII-encoded URI, with the path + * component following Section 3.3. of RFC 2396. + * + * Return value: a newly-allocated string holding the resulting + * URI, or %NULL on an error. + **/ +gchar * +g_filename_to_uri (const gchar *filename, + const gchar *hostname, + GError **error) +{ + char *escaped_uri; + + g_return_val_if_fail (filename != NULL, NULL); + + if (!g_path_is_absolute (filename)) + { + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH, + _("The pathname '%s' is not an absolute path"), + filename); + return NULL; + } + + if (hostname && + !(g_utf8_validate (hostname, -1, NULL) + && hostname_validate (hostname))) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid hostname")); + return NULL; + } + +#ifdef G_OS_WIN32 + /* Don't use localhost unnecessarily */ + if (hostname && g_ascii_strcasecmp (hostname, "localhost") == 0) + hostname = NULL; +#endif + + escaped_uri = g_escape_file_uri (hostname, filename); + + return escaped_uri; +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +#undef g_filename_to_uri + +gchar * +g_filename_to_uri (const gchar *filename, + const gchar *hostname, + GError **error) +{ + gchar *utf8_filename; + gchar *retval = NULL; + + utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error); + + if (utf8_filename) + { + retval = g_filename_to_uri_utf8 (utf8_filename, hostname, error); + g_free (utf8_filename); + } + + return retval; +} + +#endif + +/** + * g_uri_list_extract_uris: + * @uri_list: an URI list + * + * Splits an URI list conforming to the text/uri-list + * mime type defined in RFC 2483 into individual URIs, + * discarding any comments. The URIs are not validated. + * + * Returns: a newly allocated %NULL-terminated list of + * strings holding the individual URIs. The array should + * be freed with g_strfreev(). + * + * Since: 2.6 + */ +gchar ** +g_uri_list_extract_uris (const gchar *uri_list) +{ + GSList *uris, *u; + const gchar *p, *q; + gchar **result; + gint n_uris = 0; + + uris = NULL; + + p = uri_list; + + /* We don't actually try to validate the URI according to RFC + * 2396, or even check for allowed characters - we just ignore + * comments and trim whitespace off the ends. We also + * allow LF delimination as well as the specified CRLF. + * + * We do allow comments like specified in RFC 2483. + */ + while (p) + { + if (*p != '#') + { + while (g_ascii_isspace (*p)) + p++; + + q = p; + while (*q && (*q != '\n') && (*q != '\r')) + q++; + + if (q > p) + { + q--; + while (q > p && g_ascii_isspace (*q)) + q--; + + if (q > p) + { + uris = g_slist_prepend (uris, g_strndup (p, q - p + 1)); + n_uris++; + } + } + } + p = strchr (p, '\n'); + if (p) + p++; + } + + result = g_new (gchar *, n_uris + 1); + + result[n_uris--] = NULL; + for (u = uris; u; u = u->next) + result[n_uris--] = u->data; + + g_slist_free (uris); + + return result; +} + +/** + * g_filename_display_basename: + * @filename: an absolute pathname in the GLib file name encoding + * + * Returns the display basename for the particular filename, guaranteed + * to be valid UTF-8. The display name might not be identical to the filename, + * for instance there might be problems converting it to UTF-8, and some files + * can be translated in the display. + * + * If GLib can not make sense of the encoding of @filename, as a last resort it + * replaces unknown characters with U+FFFD, the Unicode replacement character. + * You can search the result for the UTF-8 encoding of this character (which is + * "\357\277\275" in octal notation) to find out if @filename was in an invalid + * encoding. + * + * You must pass the whole absolute pathname to this functions so that + * translation of well known locations can be done. + * + * This function is preferred over g_filename_display_name() if you know the + * whole path, as it allows translation. + * + * Return value: a newly allocated string containing + * a rendition of the basename of the filename in valid UTF-8 + * + * Since: 2.6 + **/ +gchar * +g_filename_display_basename (const gchar *filename) +{ + char *basename; + char *display_name; + + g_return_val_if_fail (filename != NULL, NULL); + + basename = g_path_get_basename (filename); + display_name = g_filename_display_name (basename); + g_free (basename); + return display_name; +} + +/** + * g_filename_display_name: + * @filename: a pathname hopefully in the GLib file name encoding + * + * Converts a filename into a valid UTF-8 string. The conversion is + * not necessarily reversible, so you should keep the original around + * and use the return value of this function only for display purposes. + * Unlike g_filename_to_utf8(), the result is guaranteed to be non-%NULL + * even if the filename actually isn't in the GLib file name encoding. + * + * If GLib can not make sense of the encoding of @filename, as a last resort it + * replaces unknown characters with U+FFFD, the Unicode replacement character. + * You can search the result for the UTF-8 encoding of this character (which is + * "\357\277\275" in octal notation) to find out if @filename was in an invalid + * encoding. + * + * If you know the whole pathname of the file you should use + * g_filename_display_basename(), since that allows location-based + * translation of filenames. + * + * Return value: a newly allocated string containing + * a rendition of the filename in valid UTF-8 + * + * Since: 2.6 + **/ +gchar * +g_filename_display_name (const gchar *filename) +{ + gint i; + const gchar **charsets; + gchar *display_name = NULL; + gboolean is_utf8; + + is_utf8 = g_get_filename_charsets (&charsets); + + if (is_utf8) + { + if (g_utf8_validate (filename, -1, NULL)) + display_name = g_strdup (filename); + } + + if (!display_name) + { + /* Try to convert from the filename charsets to UTF-8. + * Skip the first charset if it is UTF-8. + */ + for (i = is_utf8 ? 1 : 0; charsets[i]; i++) + { + display_name = g_convert (filename, -1, "UTF-8", charsets[i], + NULL, NULL, NULL); + + if (display_name) + break; + } + } + + /* if all conversions failed, we replace invalid UTF-8 + * by a question mark + */ + if (!display_name) + display_name = _g_utf8_make_valid (filename); + + return display_name; +} + +#define __G_CONVERT_C__ +#include "galiasdef.c" diff --git a/glib/gconvert.h b/glib/gconvert.h new file mode 100644 index 0000000..c4f274f --- /dev/null +++ b/glib/gconvert.h @@ -0,0 +1,138 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CONVERT_H__ +#define __G_CONVERT_H__ + +#include + +G_BEGIN_DECLS + +typedef enum +{ + G_CONVERT_ERROR_NO_CONVERSION, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + G_CONVERT_ERROR_FAILED, + G_CONVERT_ERROR_PARTIAL_INPUT, + G_CONVERT_ERROR_BAD_URI, + G_CONVERT_ERROR_NOT_ABSOLUTE_PATH +} GConvertError; + +#define G_CONVERT_ERROR g_convert_error_quark() +GQuark g_convert_error_quark (void); + +/* Thin wrappers around iconv + */ +typedef struct _GIConv *GIConv; + +GIConv g_iconv_open (const gchar *to_codeset, + const gchar *from_codeset); +gsize g_iconv (GIConv converter, + gchar **inbuf, + gsize *inbytes_left, + gchar **outbuf, + gsize *outbytes_left); +gint g_iconv_close (GIConv converter); + + +gchar* g_convert (const gchar *str, + gssize len, + const gchar *to_codeset, + const gchar *from_codeset, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +gchar* g_convert_with_iconv (const gchar *str, + gssize len, + GIConv converter, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +gchar* g_convert_with_fallback (const gchar *str, + gssize len, + const gchar *to_codeset, + const gchar *from_codeset, + const gchar *fallback, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; + + +/* Convert between libc's idea of strings and UTF-8. + */ +gchar* g_locale_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +gchar* g_locale_from_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; + +/* Convert between the operating system (or C runtime) + * representation of file names and UTF-8. + */ +#ifdef G_OS_WIN32 +#define g_filename_to_utf8 g_filename_to_utf8_utf8 +#define g_filename_from_utf8 g_filename_from_utf8_utf8 +#define g_filename_from_uri g_filename_from_uri_utf8 +#define g_filename_to_uri g_filename_to_uri_utf8 +#endif + +gchar* g_filename_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +gchar* g_filename_from_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; + +gchar *g_filename_from_uri (const gchar *uri, + gchar **hostname, + GError **error) G_GNUC_MALLOC; + +gchar *g_filename_to_uri (const gchar *filename, + const gchar *hostname, + GError **error) G_GNUC_MALLOC; +gchar *g_filename_display_name (const gchar *filename) G_GNUC_MALLOC; +gboolean g_get_filename_charsets (G_CONST_RETURN gchar ***charsets); + +gchar *g_filename_display_basename (const gchar *filename) G_GNUC_MALLOC; + +gchar **g_uri_list_extract_uris (const gchar *uri_list) G_GNUC_MALLOC; + +G_END_DECLS + +#endif /* __G_CONVERT_H__ */ diff --git a/glib/gdataset.c b/glib/gdataset.c new file mode 100644 index 0000000..ffc4b96 --- /dev/null +++ b/glib/gdataset.c @@ -0,0 +1,1183 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gdataset.c: Generic dataset mechanism, similar to GtkObject data. + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe ; except for g_data*_foreach() + */ + +#include "config.h" + +#include + +#include "glib.h" +#include "gdatasetprivate.h" +#include "galias.h" + +/** + * SECTION: datasets + * @title: Datasets + * @short_description: associate groups of data elements with + * particular memory locations + * + * Datasets associate groups of data elements with particular memory + * locations. These are useful if you need to associate data with a + * structure returned from an external library. Since you cannot modify + * the structure, you use its location in memory as the key into a + * dataset, where you can associate any number of data elements with it. + * + * There are two forms of most of the dataset functions. The first form + * uses strings to identify the data elements associated with a + * location. The second form uses #GQuark identifiers, which are + * created with a call to g_quark_from_string() or + * g_quark_from_static_string(). The second form is quicker, since it + * does not require looking up the string in the hash table of #GQuark + * identifiers. + * + * There is no function to create a dataset. It is automatically + * created as soon as you add elements to it. + * + * To add data elements to a dataset use g_dataset_id_set_data(), + * g_dataset_id_set_data_full(), g_dataset_set_data() and + * g_dataset_set_data_full(). + * + * To get data elements from a dataset use g_dataset_id_get_data() and + * g_dataset_get_data(). + * + * To iterate over all data elements in a dataset use + * g_dataset_foreach() (not thread-safe). + * + * To remove data elements from a dataset use + * g_dataset_id_remove_data() and g_dataset_remove_data(). + * + * To destroy a dataset, use g_dataset_destroy(). + **/ + +/** + * SECTION: datalist + * @title: Keyed Data Lists + * @short_description: lists of data elements which are accessible by a + * string or GQuark identifier + * + * Keyed data lists provide lists of arbitrary data elements which can + * be accessed either with a string or with a #GQuark corresponding to + * the string. + * + * The #GQuark methods are quicker, since the strings have to be + * converted to #GQuarks anyway. + * + * Data lists are used for associating arbitrary data with #GObjects, + * using g_object_set_data() and related functions. + * + * To create a datalist, use g_datalist_init(). + * + * To add data elements to a datalist use g_datalist_id_set_data(), + * g_datalist_id_set_data_full(), g_datalist_set_data() and + * g_datalist_set_data_full(). + * + * To get data elements from a datalist use g_datalist_id_get_data() + * and g_datalist_get_data(). + * + * To iterate over all data elements in a datalist use + * g_datalist_foreach() (not thread-safe). + * + * To remove data elements from a datalist use + * g_datalist_id_remove_data() and g_datalist_remove_data(). + * + * To remove all data elements from a datalist, use g_datalist_clear(). + **/ + +/** + * GData: + * + * The #GData struct is an opaque data structure to represent a Keyed Data List. It should + * only be accessed via the following functions. + **/ + +/** + * GDestroyNotify: + * @data: the data element. + * + * Specifies the type of function which is called when a data element + * is destroyed. It is passed the pointer to the data element and + * should free any memory and resources allocated for it. + **/ + +/* --- defines --- */ +#define G_QUARK_BLOCK_SIZE (512) + +/* datalist pointer accesses have to be carried out atomically */ +#define G_DATALIST_GET_POINTER(datalist) \ + ((GData*) ((gsize) g_atomic_pointer_get (datalist) & ~(gsize) G_DATALIST_FLAGS_MASK)) + +#define G_DATALIST_SET_POINTER(datalist, pointer) G_STMT_START { \ + gpointer _oldv, _newv; \ + do { \ + _oldv = g_atomic_pointer_get (datalist); \ + _newv = (gpointer) (((gsize) _oldv & G_DATALIST_FLAGS_MASK) | (gsize) pointer); \ + } while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, _oldv, _newv)); \ +} G_STMT_END + +/* --- structures --- */ +typedef struct _GDataset GDataset; +struct _GData +{ + GData *next; + GQuark id; + gpointer data; + GDestroyNotify destroy_func; +}; + +struct _GDataset +{ + gconstpointer location; + GData *datalist; +}; + + +/* --- prototypes --- */ +static inline GDataset* g_dataset_lookup (gconstpointer dataset_location); +static inline void g_datalist_clear_i (GData **datalist); +static void g_dataset_destroy_internal (GDataset *dataset); +static inline gpointer g_data_set_internal (GData **datalist, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func, + GDataset *dataset); +static void g_data_initialize (void); +static inline GQuark g_quark_new (gchar *string); + + +/* --- variables --- */ +G_LOCK_DEFINE_STATIC (g_dataset_global); +static GHashTable *g_dataset_location_ht = NULL; +static GDataset *g_dataset_cached = NULL; /* should this be + threadspecific? */ +G_LOCK_DEFINE_STATIC (g_quark_global); +static GHashTable *g_quark_ht = NULL; +static gchar **g_quarks = NULL; +static GQuark g_quark_seq_id = 0; + +/* --- functions --- */ + +/* HOLDS: g_dataset_global_lock */ +static inline void +g_datalist_clear_i (GData **datalist) +{ + register GData *list; + + /* unlink *all* items before walking their destructors + */ + list = G_DATALIST_GET_POINTER (datalist); + G_DATALIST_SET_POINTER (datalist, NULL); + + while (list) + { + register GData *prev; + + prev = list; + list = prev->next; + + if (prev->destroy_func) + { + G_UNLOCK (g_dataset_global); + prev->destroy_func (prev->data); + G_LOCK (g_dataset_global); + } + + g_slice_free (GData, prev); + } +} + +/** + * g_datalist_clear: + * @datalist: a datalist. + * + * Frees all the data elements of the datalist. The data elements' + * destroy functions are called if they have been set. + **/ +void +g_datalist_clear (GData **datalist) +{ + g_return_if_fail (datalist != NULL); + + G_LOCK (g_dataset_global); + if (!g_dataset_location_ht) + g_data_initialize (); + + while (G_DATALIST_GET_POINTER (datalist)) + g_datalist_clear_i (datalist); + G_UNLOCK (g_dataset_global); +} + +/* HOLDS: g_dataset_global_lock */ +static inline GDataset* +g_dataset_lookup (gconstpointer dataset_location) +{ + register GDataset *dataset; + + if (g_dataset_cached && g_dataset_cached->location == dataset_location) + return g_dataset_cached; + + dataset = g_hash_table_lookup (g_dataset_location_ht, dataset_location); + if (dataset) + g_dataset_cached = dataset; + + return dataset; +} + +/* HOLDS: g_dataset_global_lock */ +static void +g_dataset_destroy_internal (GDataset *dataset) +{ + register gconstpointer dataset_location; + + dataset_location = dataset->location; + while (dataset) + { + if (!dataset->datalist) + { + if (dataset == g_dataset_cached) + g_dataset_cached = NULL; + g_hash_table_remove (g_dataset_location_ht, dataset_location); + g_slice_free (GDataset, dataset); + break; + } + + g_datalist_clear_i (&dataset->datalist); + dataset = g_dataset_lookup (dataset_location); + } +} + +/** + * g_dataset_destroy: + * @dataset_location: the location identifying the dataset. + * + * Destroys the dataset, freeing all memory allocated, and calling any + * destroy functions set for data elements. + **/ +void +g_dataset_destroy (gconstpointer dataset_location) +{ + g_return_if_fail (dataset_location != NULL); + + G_LOCK (g_dataset_global); + if (g_dataset_location_ht) + { + register GDataset *dataset; + + dataset = g_dataset_lookup (dataset_location); + if (dataset) + g_dataset_destroy_internal (dataset); + } + G_UNLOCK (g_dataset_global); +} + +/* HOLDS: g_dataset_global_lock */ +static inline gpointer +g_data_set_internal (GData **datalist, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func, + GDataset *dataset) +{ + register GData *list; + + list = G_DATALIST_GET_POINTER (datalist); + if (!data) + { + register GData *prev; + + prev = NULL; + while (list) + { + if (list->id == key_id) + { + gpointer ret_data = NULL; + + if (prev) + prev->next = list->next; + else + { + G_DATALIST_SET_POINTER (datalist, list->next); + + /* the dataset destruction *must* be done + * prior to invocation of the data destroy function + */ + if (!list->next && dataset) + g_dataset_destroy_internal (dataset); + } + + /* the GData struct *must* already be unlinked + * when invoking the destroy function. + * we use (data==NULL && destroy_func!=NULL) as + * a special hint combination to "steal" + * data without destroy notification + */ + if (list->destroy_func && !destroy_func) + { + G_UNLOCK (g_dataset_global); + list->destroy_func (list->data); + G_LOCK (g_dataset_global); + } + else + ret_data = list->data; + + g_slice_free (GData, list); + + return ret_data; + } + + prev = list; + list = list->next; + } + } + else + { + while (list) + { + if (list->id == key_id) + { + if (!list->destroy_func) + { + list->data = data; + list->destroy_func = destroy_func; + } + else + { + register GDestroyNotify dfunc; + register gpointer ddata; + + dfunc = list->destroy_func; + ddata = list->data; + list->data = data; + list->destroy_func = destroy_func; + + /* we need to have updated all structures prior to + * invocation of the destroy function + */ + G_UNLOCK (g_dataset_global); + dfunc (ddata); + G_LOCK (g_dataset_global); + } + + return NULL; + } + + list = list->next; + } + + list = g_slice_new (GData); + list->next = G_DATALIST_GET_POINTER (datalist); + list->id = key_id; + list->data = data; + list->destroy_func = destroy_func; + G_DATALIST_SET_POINTER (datalist, list); + } + + return NULL; +} + +/** + * g_dataset_id_set_data_full: + * @dataset_location: the location identifying the dataset. + * @key_id: the #GQuark id to identify the data element. + * @data: the data element. + * @destroy_func: the function to call when the data element is + * removed. This function will be called with the data + * element and can be used to free any memory allocated + * for it. + * + * Sets the data element associated with the given #GQuark id, and also + * the function to call when the data element is destroyed. Any + * previous data with the same key is removed, and its destroy function + * is called. + **/ +/** + * g_dataset_set_data_full: + * @l: the location identifying the dataset. + * @k: the string to identify the data element. + * @d: the data element. + * @f: the function to call when the data element is removed. This + * function will be called with the data element and can be used to + * free any memory allocated for it. + * + * Sets the data corresponding to the given string identifier, and the + * function to call when the data element is destroyed. + **/ +/** + * g_dataset_id_set_data: + * @l: the location identifying the dataset. + * @k: the #GQuark id to identify the data element. + * @d: the data element. + * + * Sets the data element associated with the given #GQuark id. Any + * previous data with the same key is removed, and its destroy function + * is called. + **/ +/** + * g_dataset_set_data: + * @l: the location identifying the dataset. + * @k: the string to identify the data element. + * @d: the data element. + * + * Sets the data corresponding to the given string identifier. + **/ +/** + * g_dataset_id_remove_data: + * @l: the location identifying the dataset. + * @k: the #GQuark id identifying the data element. + * + * Removes a data element from a dataset. The data element's destroy + * function is called if it has been set. + **/ +/** + * g_dataset_remove_data: + * @l: the location identifying the dataset. + * @k: the string identifying the data element. + * + * Removes a data element corresponding to a string. Its destroy + * function is called if it has been set. + **/ +void +g_dataset_id_set_data_full (gconstpointer dataset_location, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func) +{ + register GDataset *dataset; + + g_return_if_fail (dataset_location != NULL); + if (!data) + g_return_if_fail (destroy_func == NULL); + if (!key_id) + { + if (data) + g_return_if_fail (key_id > 0); + else + return; + } + + G_LOCK (g_dataset_global); + if (!g_dataset_location_ht) + g_data_initialize (); + + dataset = g_dataset_lookup (dataset_location); + if (!dataset) + { + dataset = g_slice_new (GDataset); + dataset->location = dataset_location; + g_datalist_init (&dataset->datalist); + g_hash_table_insert (g_dataset_location_ht, + (gpointer) dataset->location, + dataset); + } + + g_data_set_internal (&dataset->datalist, key_id, data, destroy_func, dataset); + G_UNLOCK (g_dataset_global); +} + +/** + * g_datalist_id_set_data_full: + * @datalist: a datalist. + * @key_id: the #GQuark to identify the data element. + * @data: the data element or %NULL to remove any previous element + * corresponding to @key_id. + * @destroy_func: the function to call when the data element is + * removed. This function will be called with the data + * element and can be used to free any memory allocated + * for it. If @data is %NULL, then @destroy_func must + * also be %NULL. + * + * Sets the data corresponding to the given #GQuark id, and the + * function to be called when the element is removed from the datalist. + * Any previous data with the same key is removed, and its destroy + * function is called. + **/ +/** + * g_datalist_set_data_full: + * @dl: a datalist. + * @k: the string to identify the data element. + * @d: the data element, or %NULL to remove any previous element + * corresponding to @k. + * @f: the function to call when the data element is removed. This + * function will be called with the data element and can be used to + * free any memory allocated for it. If @d is %NULL, then @f must + * also be %NULL. + * + * Sets the data element corresponding to the given string identifier, + * and the function to be called when the data element is removed. + **/ +/** + * g_datalist_id_set_data: + * @dl: a datalist. + * @q: the #GQuark to identify the data element. + * @d: the data element, or %NULL to remove any previous element + * corresponding to @q. + * + * Sets the data corresponding to the given #GQuark id. Any previous + * data with the same key is removed, and its destroy function is + * called. + **/ +/** + * g_datalist_set_data: + * @dl: a datalist. + * @k: the string to identify the data element. + * @d: the data element, or %NULL to remove any previous element + * corresponding to @k. + * + * Sets the data element corresponding to the given string identifier. + **/ +/** + * g_datalist_id_remove_data: + * @dl: a datalist. + * @q: the #GQuark identifying the data element. + * + * Removes an element, using its #GQuark identifier. + **/ +/** + * g_datalist_remove_data: + * @dl: a datalist. + * @k: the string identifying the data element. + * + * Removes an element using its string identifier. The data element's + * destroy function is called if it has been set. + **/ +void +g_datalist_id_set_data_full (GData **datalist, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func) +{ + g_return_if_fail (datalist != NULL); + if (!data) + g_return_if_fail (destroy_func == NULL); + if (!key_id) + { + if (data) + g_return_if_fail (key_id > 0); + else + return; + } + + G_LOCK (g_dataset_global); + if (!g_dataset_location_ht) + g_data_initialize (); + + g_data_set_internal (datalist, key_id, data, destroy_func, NULL); + G_UNLOCK (g_dataset_global); +} + +/** + * g_dataset_id_remove_no_notify: + * @dataset_location: the location identifying the dataset. + * @key_id: the #GQuark ID identifying the data element. + * @Returns: the data previously stored at @key_id, or %NULL if none. + * + * Removes an element, without calling its destroy notification + * function. + **/ +/** + * g_dataset_remove_no_notify: + * @l: the location identifying the dataset. + * @k: the string identifying the data element. + * + * Removes an element, without calling its destroy notifier. + **/ +gpointer +g_dataset_id_remove_no_notify (gconstpointer dataset_location, + GQuark key_id) +{ + gpointer ret_data = NULL; + + g_return_val_if_fail (dataset_location != NULL, NULL); + + G_LOCK (g_dataset_global); + if (key_id && g_dataset_location_ht) + { + GDataset *dataset; + + dataset = g_dataset_lookup (dataset_location); + if (dataset) + ret_data = g_data_set_internal (&dataset->datalist, key_id, NULL, (GDestroyNotify) 42, dataset); + } + G_UNLOCK (g_dataset_global); + + return ret_data; +} + +/** + * g_datalist_id_remove_no_notify: + * @datalist: a datalist. + * @key_id: the #GQuark identifying a data element. + * @Returns: the data previously stored at @key_id, or %NULL if none. + * + * Removes an element, without calling its destroy notification + * function. + **/ +/** + * g_datalist_remove_no_notify: + * @dl: a datalist. + * @k: the string identifying the data element. + * + * Removes an element, without calling its destroy notifier. + **/ +gpointer +g_datalist_id_remove_no_notify (GData **datalist, + GQuark key_id) +{ + gpointer ret_data = NULL; + + g_return_val_if_fail (datalist != NULL, NULL); + + G_LOCK (g_dataset_global); + if (key_id && g_dataset_location_ht) + ret_data = g_data_set_internal (datalist, key_id, NULL, (GDestroyNotify) 42, NULL); + G_UNLOCK (g_dataset_global); + + return ret_data; +} + +/** + * g_dataset_id_get_data: + * @dataset_location: the location identifying the dataset. + * @key_id: the #GQuark id to identify the data element. + * @Returns: the data element corresponding to the #GQuark, or %NULL if + * it is not found. + * + * Gets the data element corresponding to a #GQuark. + **/ +/** + * g_dataset_get_data: + * @l: the location identifying the dataset. + * @k: the string identifying the data element. + * @Returns: the data element corresponding to the string, or %NULL if + * it is not found. + * + * Gets the data element corresponding to a string. + **/ +gpointer +g_dataset_id_get_data (gconstpointer dataset_location, + GQuark key_id) +{ + g_return_val_if_fail (dataset_location != NULL, NULL); + + G_LOCK (g_dataset_global); + if (key_id && g_dataset_location_ht) + { + register GDataset *dataset; + + dataset = g_dataset_lookup (dataset_location); + if (dataset) + { + register GData *list; + + for (list = dataset->datalist; list; list = list->next) + if (list->id == key_id) + { + G_UNLOCK (g_dataset_global); + return list->data; + } + } + } + G_UNLOCK (g_dataset_global); + + return NULL; +} + +/** + * g_datalist_id_get_data: + * @datalist: a datalist. + * @key_id: the #GQuark identifying a data element. + * @Returns: the data element, or %NULL if it is not found. + * + * Retrieves the data element corresponding to @key_id. + **/ +/** + * g_datalist_get_data: + * @dl: a datalist. + * @k: the string identifying a data element. + * @Returns: the data element, or %NULL if it is not found. + * + * Gets a data element, using its string identifer. This is slower than + * g_datalist_id_get_data() because the string is first converted to a + * #GQuark. + **/ +gpointer +g_datalist_id_get_data (GData **datalist, + GQuark key_id) +{ + gpointer data = NULL; + g_return_val_if_fail (datalist != NULL, NULL); + if (key_id) + { + register GData *list; + G_LOCK (g_dataset_global); + for (list = G_DATALIST_GET_POINTER (datalist); list; list = list->next) + if (list->id == key_id) + { + data = list->data; + break; + } + G_UNLOCK (g_dataset_global); + } + return data; +} + +/** + * GDataForeachFunc: + * @key_id: the #GQuark id to identifying the data element. + * @data: the data element. + * @user_data: user data passed to g_dataset_foreach(). + * + * Specifies the type of function passed to g_dataset_foreach(). It is + * called with each #GQuark id and associated data element, together + * with the @user_data parameter supplied to g_dataset_foreach(). + **/ + +/** + * g_dataset_foreach: + * @dataset_location: the location identifying the dataset. + * @func: the function to call for each data element. + * @user_data: user data to pass to the function. + * + * Calls the given function for each data element which is associated + * with the given location. Note that this function is NOT thread-safe. + * So unless @datalist can be protected from any modifications during + * invocation of this function, it should not be called. + **/ +void +g_dataset_foreach (gconstpointer dataset_location, + GDataForeachFunc func, + gpointer user_data) +{ + register GDataset *dataset; + + g_return_if_fail (dataset_location != NULL); + g_return_if_fail (func != NULL); + + G_LOCK (g_dataset_global); + if (g_dataset_location_ht) + { + dataset = g_dataset_lookup (dataset_location); + G_UNLOCK (g_dataset_global); + if (dataset) + { + register GData *list, *next; + + for (list = dataset->datalist; list; list = next) + { + next = list->next; + func (list->id, list->data, user_data); + } + } + } + else + { + G_UNLOCK (g_dataset_global); + } +} + +/** + * g_datalist_foreach: + * @datalist: a datalist. + * @func: the function to call for each data element. + * @user_data: user data to pass to the function. + * + * Calls the given function for each data element of the datalist. The + * function is called with each data element's #GQuark id and data, + * together with the given @user_data parameter. Note that this + * function is NOT thread-safe. So unless @datalist can be protected + * from any modifications during invocation of this function, it should + * not be called. + **/ +void +g_datalist_foreach (GData **datalist, + GDataForeachFunc func, + gpointer user_data) +{ + register GData *list, *next; + + g_return_if_fail (datalist != NULL); + g_return_if_fail (func != NULL); + + for (list = G_DATALIST_GET_POINTER (datalist); list; list = next) + { + next = list->next; + func (list->id, list->data, user_data); + } +} + +/** + * g_datalist_init: + * @datalist: a pointer to a pointer to a datalist. + * + * Resets the datalist to %NULL. It does not free any memory or call + * any destroy functions. + **/ +void +g_datalist_init (GData **datalist) +{ + g_return_if_fail (datalist != NULL); + + g_atomic_pointer_set (datalist, NULL); +} + +/** + * g_datalist_set_flags: + * @datalist: pointer to the location that holds a list + * @flags: the flags to turn on. The values of the flags are + * restricted by %G_DATALIST_FLAGS_MASK (currently + * 3; giving two possible boolean flags). + * A value for @flags that doesn't fit within the mask is + * an error. + * + * Turns on flag values for a data list. This function is used + * to keep a small number of boolean flags in an object with + * a data list without using any additional space. It is + * not generally useful except in circumstances where space + * is very tight. (It is used in the base #GObject type, for + * example.) + * + * Since: 2.8 + **/ +void +g_datalist_set_flags (GData **datalist, + guint flags) +{ + gpointer oldvalue; + g_return_if_fail (datalist != NULL); + g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0); + + do + { + oldvalue = g_atomic_pointer_get (datalist); + } + while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, oldvalue, + (gpointer) ((gsize) oldvalue | flags))); +} + +/** + * g_datalist_unset_flags: + * @datalist: pointer to the location that holds a list + * @flags: the flags to turn off. The values of the flags are + * restricted by %G_DATALIST_FLAGS_MASK (currently + * 3: giving two possible boolean flags). + * A value for @flags that doesn't fit within the mask is + * an error. + * + * Turns off flag values for a data list. See g_datalist_unset_flags() + * + * Since: 2.8 + **/ +void +g_datalist_unset_flags (GData **datalist, + guint flags) +{ + gpointer oldvalue; + g_return_if_fail (datalist != NULL); + g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0); + + do + { + oldvalue = g_atomic_pointer_get (datalist); + } + while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, oldvalue, + (gpointer) ((gsize) oldvalue & ~(gsize) flags))); +} + +/** + * g_datalist_get_flags: + * @datalist: pointer to the location that holds a list + * + * Gets flags values packed in together with the datalist. + * See g_datalist_set_flags(). + * + * Return value: the flags of the datalist + * + * Since: 2.8 + **/ +guint +g_datalist_get_flags (GData **datalist) +{ + g_return_val_if_fail (datalist != NULL, 0); + + return G_DATALIST_GET_FLAGS (datalist); /* atomic macro */ +} + +/* HOLDS: g_dataset_global_lock */ +static void +g_data_initialize (void) +{ + g_return_if_fail (g_dataset_location_ht == NULL); + + g_dataset_location_ht = g_hash_table_new (g_direct_hash, NULL); + g_dataset_cached = NULL; +} + +/** + * SECTION: quarks + * @title: Quarks + * @short_description: a 2-way association between a string and a + * unique integer identifier + * + * Quarks are associations between strings and integer identifiers. + * Given either the string or the #GQuark identifier it is possible to + * retrieve the other. + * + * Quarks are used for both Datasets and Keyed Data Lists. + * + * To create a new quark from a string, use g_quark_from_string() or + * g_quark_from_static_string(). + * + * To find the string corresponding to a given #GQuark, use + * g_quark_to_string(). + * + * To find the #GQuark corresponding to a given string, use + * g_quark_try_string(). + * + * Another use for the string pool maintained for the quark functions + * is string interning, using g_intern_string() or + * g_intern_static_string(). An interned string is a canonical + * representation for a string. One important advantage of interned + * strings is that they can be compared for equality by a simple + * pointer comparision, rather than using strcmp(). + **/ + +/** + * GQuark: + * + * A GQuark is a non-zero integer which uniquely identifies a + * particular string. A GQuark value of zero is associated to %NULL. + **/ + +/** + * g_quark_try_string: + * @string: a string. + * @Returns: the #GQuark associated with the string, or 0 if @string is + * %NULL or there is no #GQuark associated with it. + * + * Gets the #GQuark associated with the given string, or 0 if string is + * %NULL or it has no associated #GQuark. + * + * If you want the GQuark to be created if it doesn't already exist, + * use g_quark_from_string() or g_quark_from_static_string(). + **/ +GQuark +g_quark_try_string (const gchar *string) +{ + GQuark quark = 0; + g_return_val_if_fail (string != NULL, 0); + + G_LOCK (g_quark_global); + if (g_quark_ht) + quark = GPOINTER_TO_UINT (g_hash_table_lookup (g_quark_ht, string)); + G_UNLOCK (g_quark_global); + + return quark; +} + +/* HOLDS: g_quark_global_lock */ +static inline GQuark +g_quark_from_string_internal (const gchar *string, + gboolean duplicate) +{ + GQuark quark = 0; + + if (g_quark_ht) + quark = GPOINTER_TO_UINT (g_hash_table_lookup (g_quark_ht, string)); + + if (!quark) + quark = g_quark_new (duplicate ? g_strdup (string) : (gchar *)string); + + return quark; +} + +/** + * g_quark_from_string: + * @string: a string. + * @Returns: the #GQuark identifying the string, or 0 if @string is + * %NULL. + * + * Gets the #GQuark identifying the given string. If the string does + * not currently have an associated #GQuark, a new #GQuark is created, + * using a copy of the string. + **/ +GQuark +g_quark_from_string (const gchar *string) +{ + GQuark quark; + + if (!string) + return 0; + + G_LOCK (g_quark_global); + quark = g_quark_from_string_internal (string, TRUE); + G_UNLOCK (g_quark_global); + + return quark; +} + +/** + * g_quark_from_static_string: + * @string: a string. + * @Returns: the #GQuark identifying the string, or 0 if @string is + * %NULL. + * + * Gets the #GQuark identifying the given (static) string. If the + * string does not currently have an associated #GQuark, a new #GQuark + * is created, linked to the given string. + * + * Note that this function is identical to g_quark_from_string() except + * that if a new #GQuark is created the string itself is used rather + * than a copy. This saves memory, but can only be used if the string + * will always exist. It can be used with + * statically allocated strings in the main program, but not with + * statically allocated memory in dynamically loaded modules, if you + * expect to ever unload the module again (e.g. do not use this + * function in GTK+ theme engines). + **/ +GQuark +g_quark_from_static_string (const gchar *string) +{ + GQuark quark; + + if (!string) + return 0; + + G_LOCK (g_quark_global); + quark = g_quark_from_string_internal (string, FALSE); + G_UNLOCK (g_quark_global); + + return quark; +} + +/** + * g_quark_to_string: + * @quark: a #GQuark. + * @Returns: the string associated with the #GQuark. + * + * Gets the string associated with the given #GQuark. + **/ +G_CONST_RETURN gchar* +g_quark_to_string (GQuark quark) +{ + gchar* result = NULL; + + G_LOCK (g_quark_global); + if (quark < g_quark_seq_id) + result = g_quarks[quark]; + G_UNLOCK (g_quark_global); + + return result; +} + +/* HOLDS: g_quark_global_lock */ +static inline GQuark +g_quark_new (gchar *string) +{ + GQuark quark; + + if (g_quark_seq_id % G_QUARK_BLOCK_SIZE == 0) + g_quarks = g_renew (gchar*, g_quarks, g_quark_seq_id + G_QUARK_BLOCK_SIZE); + if (!g_quark_ht) + { + g_assert (g_quark_seq_id == 0); + g_quark_ht = g_hash_table_new (g_str_hash, g_str_equal); + g_quarks[g_quark_seq_id++] = NULL; + } + + quark = g_quark_seq_id++; + g_quarks[quark] = string; + g_hash_table_insert (g_quark_ht, string, GUINT_TO_POINTER (quark)); + + return quark; +} + +/** + * g_intern_string: + * @string: a string + * + * Returns a canonical representation for @string. Interned strings can + * be compared for equality by comparing the pointers, instead of using strcmp(). + * + * Returns: a canonical representation for the string + * + * Since: 2.10 + */ +G_CONST_RETURN gchar* +g_intern_string (const gchar *string) +{ + const gchar *result; + GQuark quark; + + if (!string) + return NULL; + + G_LOCK (g_quark_global); + quark = g_quark_from_string_internal (string, TRUE); + result = g_quarks[quark]; + G_UNLOCK (g_quark_global); + + return result; +} + +/** + * g_intern_static_string: + * @string: a static string + * + * Returns a canonical representation for @string. Interned strings can + * be compared for equality by comparing the pointers, instead of using strcmp(). + * g_intern_static_string() does not copy the string, therefore @string must + * not be freed or modified. + * + * Returns: a canonical representation for the string + * + * Since: 2.10 + */ +G_CONST_RETURN gchar* +g_intern_static_string (const gchar *string) +{ + GQuark quark; + const gchar *result; + + if (!string) + return NULL; + + G_LOCK (g_quark_global); + quark = g_quark_from_string_internal (string, FALSE); + result = g_quarks[quark]; + G_UNLOCK (g_quark_global); + + return result; +} + +#define __G_DATASET_C__ +#include "galiasdef.c" diff --git a/glib/gdataset.h b/glib/gdataset.h new file mode 100644 index 0000000..2733ffb --- /dev/null +++ b/glib/gdataset.h @@ -0,0 +1,122 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_DATASET_H__ +#define __G_DATASET_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GData GData; + +typedef void (*GDataForeachFunc) (GQuark key_id, + gpointer data, + gpointer user_data); + +/* Keyed Data List + */ +void g_datalist_init (GData **datalist); +void g_datalist_clear (GData **datalist); +gpointer g_datalist_id_get_data (GData **datalist, + GQuark key_id); +void g_datalist_id_set_data_full (GData **datalist, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func); +gpointer g_datalist_id_remove_no_notify (GData **datalist, + GQuark key_id); +void g_datalist_foreach (GData **datalist, + GDataForeachFunc func, + gpointer user_data); + +/** + * G_DATALIST_FLAGS_MASK: + * + * A bitmask that restricts the possible flags passed to + * g_datalist_set_flags(). Passing a flags value where + * flags & ~G_DATALIST_FLAGS_MASK != 0 is an error. + */ +#define G_DATALIST_FLAGS_MASK 0x3 + +void g_datalist_set_flags (GData **datalist, + guint flags); +void g_datalist_unset_flags (GData **datalist, + guint flags); +guint g_datalist_get_flags (GData **datalist); + +#define g_datalist_id_set_data(dl, q, d) \ + g_datalist_id_set_data_full ((dl), (q), (d), NULL) +#define g_datalist_id_remove_data(dl, q) \ + g_datalist_id_set_data ((dl), (q), NULL) +#define g_datalist_get_data(dl, k) \ + (g_datalist_id_get_data ((dl), g_quark_try_string (k))) +#define g_datalist_set_data_full(dl, k, d, f) \ + g_datalist_id_set_data_full ((dl), g_quark_from_string (k), (d), (f)) +#define g_datalist_remove_no_notify(dl, k) \ + g_datalist_id_remove_no_notify ((dl), g_quark_try_string (k)) +#define g_datalist_set_data(dl, k, d) \ + g_datalist_set_data_full ((dl), (k), (d), NULL) +#define g_datalist_remove_data(dl, k) \ + g_datalist_id_set_data ((dl), g_quark_try_string (k), NULL) + + +/* Location Associated Keyed Data + */ +void g_dataset_destroy (gconstpointer dataset_location); +gpointer g_dataset_id_get_data (gconstpointer dataset_location, + GQuark key_id); +void g_dataset_id_set_data_full (gconstpointer dataset_location, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func); +gpointer g_dataset_id_remove_no_notify (gconstpointer dataset_location, + GQuark key_id); +void g_dataset_foreach (gconstpointer dataset_location, + GDataForeachFunc func, + gpointer user_data); +#define g_dataset_id_set_data(l, k, d) \ + g_dataset_id_set_data_full ((l), (k), (d), NULL) +#define g_dataset_id_remove_data(l, k) \ + g_dataset_id_set_data ((l), (k), NULL) +#define g_dataset_get_data(l, k) \ + (g_dataset_id_get_data ((l), g_quark_try_string (k))) +#define g_dataset_set_data_full(l, k, d, f) \ + g_dataset_id_set_data_full ((l), g_quark_from_string (k), (d), (f)) +#define g_dataset_remove_no_notify(l, k) \ + g_dataset_id_remove_no_notify ((l), g_quark_try_string (k)) +#define g_dataset_set_data(l, k, d) \ + g_dataset_set_data_full ((l), (k), (d), NULL) +#define g_dataset_remove_data(l, k) \ + g_dataset_id_set_data ((l), g_quark_try_string (k), NULL) + +G_END_DECLS + +#endif /* __G_DATASET_H__ */ diff --git a/glib/gdatasetprivate.h b/glib/gdatasetprivate.h new file mode 100644 index 0000000..fdbb87a --- /dev/null +++ b/glib/gdatasetprivate.h @@ -0,0 +1,44 @@ +/* GLIB - Library of useful routines for C programming + * gdataset-private.h: Internal macros for accessing dataset values + * Copyright (C) 2005 Red Hat + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_DATASETPRIVATE_H__ +#define __G_DATASETPRIVATE_H__ + +#include + +G_BEGIN_DECLS + +/* GET_FLAGS is implemented via atomic pointer access, to allow memory + * barriers to take effect without acquiring the global dataset mutex. + */ +#define G_DATALIST_GET_FLAGS(datalist) \ + ((gsize) g_atomic_pointer_get (datalist) & G_DATALIST_FLAGS_MASK) + + +G_END_DECLS + +#endif /* __G_DATASETPRIVATE_H__ */ diff --git a/glib/gdate.c b/glib/gdate.c new file mode 100644 index 0000000..b31c033 --- /dev/null +++ b/glib/gdate.c @@ -0,0 +1,1905 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#define DEBUG_MSG(x) /* */ +#ifdef G_ENABLE_DEBUG +/* #define DEBUG_MSG(args) g_message args ; */ +#endif + +#include "glib.h" + +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include +#endif + +#include "galias.h" + +GDate* +g_date_new (void) +{ + GDate *d = g_new0 (GDate, 1); /* happily, 0 is the invalid flag for everything. */ + + return d; +} + +GDate* +g_date_new_dmy (GDateDay day, + GDateMonth m, + GDateYear y) +{ + GDate *d; + g_return_val_if_fail (g_date_valid_dmy (day, m, y), NULL); + + d = g_new (GDate, 1); + + d->julian = FALSE; + d->dmy = TRUE; + + d->month = m; + d->day = day; + d->year = y; + + g_assert (g_date_valid (d)); + + return d; +} + +GDate* +g_date_new_julian (guint32 j) +{ + GDate *d; + g_return_val_if_fail (g_date_valid_julian (j), NULL); + + d = g_new (GDate, 1); + + d->julian = TRUE; + d->dmy = FALSE; + + d->julian_days = j; + + g_assert (g_date_valid (d)); + + return d; +} + +void +g_date_free (GDate *d) +{ + g_return_if_fail (d != NULL); + + g_free (d); +} + +gboolean +g_date_valid (const GDate *d) +{ + g_return_val_if_fail (d != NULL, FALSE); + + return (d->julian || d->dmy); +} + +static const guint8 days_in_months[2][13] = +{ /* error, jan feb mar apr may jun jul aug sep oct nov dec */ + { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } /* leap year */ +}; + +static const guint16 days_in_year[2][14] = +{ /* 0, jan feb mar apr may jun jul aug sep oct nov dec */ + { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, + { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } +}; + +gboolean +g_date_valid_month (GDateMonth m) +{ + return ( (m > G_DATE_BAD_MONTH) && (m < 13) ); +} + +gboolean +g_date_valid_year (GDateYear y) +{ + return ( y > G_DATE_BAD_YEAR ); +} + +gboolean +g_date_valid_day (GDateDay d) +{ + return ( (d > G_DATE_BAD_DAY) && (d < 32) ); +} + +gboolean +g_date_valid_weekday (GDateWeekday w) +{ + return ( (w > G_DATE_BAD_WEEKDAY) && (w < 8) ); +} + +gboolean +g_date_valid_julian (guint32 j) +{ + return (j > G_DATE_BAD_JULIAN); +} + +gboolean +g_date_valid_dmy (GDateDay d, + GDateMonth m, + GDateYear y) +{ + return ( (m > G_DATE_BAD_MONTH) && + (m < 13) && + (d > G_DATE_BAD_DAY) && + (y > G_DATE_BAD_YEAR) && /* must check before using g_date_is_leap_year */ + (d <= (g_date_is_leap_year (y) ? + days_in_months[1][m] : days_in_months[0][m])) ); +} + + +/* "Julian days" just means an absolute number of days, where Day 1 == + * Jan 1, Year 1 + */ +static void +g_date_update_julian (const GDate *const_d) +{ + GDate *d = (GDate *) const_d; + GDateYear year; + gint idx; + + g_return_if_fail (d != NULL); + g_return_if_fail (d->dmy); + g_return_if_fail (!d->julian); + g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year)); + + /* What we actually do is: multiply years * 365 days in the year, + * add the number of years divided by 4, subtract the number of + * years divided by 100 and add the number of years divided by 400, + * which accounts for leap year stuff. Code from Steffen Beyer's + * DateCalc. + */ + + year = d->year - 1; /* we know d->year > 0 since it's valid */ + + d->julian_days = year * 365U; + d->julian_days += (year >>= 2); /* divide by 4 and add */ + d->julian_days -= (year /= 25); /* divides original # years by 100 */ + d->julian_days += year >> 2; /* divides by 4, which divides original by 400 */ + + idx = g_date_is_leap_year (d->year) ? 1 : 0; + + d->julian_days += days_in_year[idx][d->month] + d->day; + + g_return_if_fail (g_date_valid_julian (d->julian_days)); + + d->julian = TRUE; +} + +static void +g_date_update_dmy (const GDate *const_d) +{ + GDate *d = (GDate *) const_d; + GDateYear y; + GDateMonth m; + GDateDay day; + + guint32 A, B, C, D, E, M; + + g_return_if_fail (d != NULL); + g_return_if_fail (d->julian); + g_return_if_fail (!d->dmy); + g_return_if_fail (g_date_valid_julian (d->julian_days)); + + /* Formula taken from the Calendar FAQ; the formula was for the + * Julian Period which starts on 1 January 4713 BC, so we add + * 1,721,425 to the number of days before doing the formula. + * + * I'm sure this can be simplified for our 1 January 1 AD period + * start, but I can't figure out how to unpack the formula. + */ + + A = d->julian_days + 1721425 + 32045; + B = ( 4 *(A + 36524) )/ 146097 - 1; + C = A - (146097 * B)/4; + D = ( 4 * (C + 365) ) / 1461 - 1; + E = C - ((1461*D) / 4); + M = (5 * (E - 1) + 2)/153; + + m = M + 3 - (12*(M/10)); + day = E - (153*M + 2)/5; + y = 100 * B + D - 4800 + (M/10); + +#ifdef G_ENABLE_DEBUG + if (!g_date_valid_dmy (day, m, y)) + g_warning ("\nOOPS julian: %u computed dmy: %u %u %u\n", + d->julian_days, day, m, y); +#endif + + d->month = m; + d->day = day; + d->year = y; + + d->dmy = TRUE; +} + +GDateWeekday +g_date_get_weekday (const GDate *d) +{ + g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY); + + if (!d->julian) + g_date_update_julian (d); + + g_return_val_if_fail (d->julian, G_DATE_BAD_WEEKDAY); + + return ((d->julian_days - 1) % 7) + 1; +} + +GDateMonth +g_date_get_month (const GDate *d) +{ + g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_MONTH); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, G_DATE_BAD_MONTH); + + return d->month; +} + +GDateYear +g_date_get_year (const GDate *d) +{ + g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_YEAR); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, G_DATE_BAD_YEAR); + + return d->year; +} + +GDateDay +g_date_get_day (const GDate *d) +{ + g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_DAY); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, G_DATE_BAD_DAY); + + return d->day; +} + +guint32 +g_date_get_julian (const GDate *d) +{ + g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); + + if (!d->julian) + g_date_update_julian (d); + + g_return_val_if_fail (d->julian, G_DATE_BAD_JULIAN); + + return d->julian_days; +} + +guint +g_date_get_day_of_year (const GDate *d) +{ + gint idx; + + g_return_val_if_fail (g_date_valid (d), 0); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, 0); + + idx = g_date_is_leap_year (d->year) ? 1 : 0; + + return (days_in_year[idx][d->month] + d->day); +} + +guint +g_date_get_monday_week_of_year (const GDate *d) +{ + GDateWeekday wd; + guint day; + GDate first; + + g_return_val_if_fail (g_date_valid (d), 0); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, 0); + + g_date_clear (&first, 1); + + g_date_set_dmy (&first, 1, 1, d->year); + + wd = g_date_get_weekday (&first) - 1; /* make Monday day 0 */ + day = g_date_get_day_of_year (d) - 1; + + return ((day + wd)/7U + (wd == 0 ? 1 : 0)); +} + +guint +g_date_get_sunday_week_of_year (const GDate *d) +{ + GDateWeekday wd; + guint day; + GDate first; + + g_return_val_if_fail (g_date_valid (d), 0); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, 0); + + g_date_clear (&first, 1); + + g_date_set_dmy (&first, 1, 1, d->year); + + wd = g_date_get_weekday (&first); + if (wd == 7) wd = 0; /* make Sunday day 0 */ + day = g_date_get_day_of_year (d) - 1; + + return ((day + wd)/7U + (wd == 0 ? 1 : 0)); +} + +/** + * g_date_get_iso8601_week_of_year: + * @date: a valid #GDate + * + * Returns the week of the year, where weeks are interpreted according + * to ISO 8601. + * + * Returns: ISO 8601 week number of the year. + * + * Since: 2.6 + **/ +guint +g_date_get_iso8601_week_of_year (const GDate *d) +{ + guint j, d4, L, d1, w; + + g_return_val_if_fail (g_date_valid (d), 0); + + if (!d->julian) + g_date_update_julian (d); + + g_return_val_if_fail (d->julian, 0); + + /* Formula taken from the Calendar FAQ; the formula was for the + * Julian Period which starts on 1 January 4713 BC, so we add + * 1,721,425 to the number of days before doing the formula. + */ + j = d->julian_days + 1721425; + d4 = (j + 31741 - (j % 7)) % 146097 % 36524 % 1461; + L = d4 / 1460; + d1 = ((d4 - L) % 365) + L; + w = d1 / 7 + 1; + + return w; +} + +gint +g_date_days_between (const GDate *d1, + const GDate *d2) +{ + g_return_val_if_fail (g_date_valid (d1), 0); + g_return_val_if_fail (g_date_valid (d2), 0); + + return (gint)g_date_get_julian (d2) - (gint)g_date_get_julian (d1); +} + +void +g_date_clear (GDate *d, guint ndates) +{ + g_return_if_fail (d != NULL); + g_return_if_fail (ndates != 0); + + memset (d, 0x0, ndates*sizeof (GDate)); +} + +G_LOCK_DEFINE_STATIC (g_date_global); + +/* These are for the parser, output to the user should use * + * g_date_strftime () - this creates more never-freed memory to annoy + * all those memory debugger users. :-) + */ + +static gchar *long_month_names[13] = +{ + NULL, +}; + +static gchar *short_month_names[13] = +{ + NULL, +}; + +/* This tells us if we need to update the parse info */ +static gchar *current_locale = NULL; + +/* order of these in the current locale */ +static GDateDMY dmy_order[3] = +{ + G_DATE_DAY, G_DATE_MONTH, G_DATE_YEAR +}; + +/* Where to chop two-digit years: i.e., for the 1930 default, numbers + * 29 and below are counted as in the year 2000, numbers 30 and above + * are counted as in the year 1900. + */ + +static const GDateYear twodigit_start_year = 1930; + +/* It is impossible to enter a year between 1 AD and 99 AD with this + * in effect. + */ +static gboolean using_twodigit_years = FALSE; + +/* Adjustment of locale era to AD, non-zero means using locale era + */ +static gint locale_era_adjust = 0; + +struct _GDateParseTokens { + gint num_ints; + gint n[3]; + guint month; +}; + +typedef struct _GDateParseTokens GDateParseTokens; + +#define NUM_LEN 10 + +/* HOLDS: g_date_global_lock */ +static void +g_date_fill_parse_tokens (const gchar *str, GDateParseTokens *pt) +{ + gchar num[4][NUM_LEN+1]; + gint i; + const guchar *s; + + /* We count 4, but store 3; so we can give an error + * if there are 4. + */ + num[0][0] = num[1][0] = num[2][0] = num[3][0] = '\0'; + + s = (const guchar *) str; + pt->num_ints = 0; + while (*s && pt->num_ints < 4) + { + + i = 0; + while (*s && g_ascii_isdigit (*s) && i < NUM_LEN) + { + num[pt->num_ints][i] = *s; + ++s; + ++i; + } + + if (i > 0) + { + num[pt->num_ints][i] = '\0'; + ++(pt->num_ints); + } + + if (*s == '\0') break; + + ++s; + } + + pt->n[0] = pt->num_ints > 0 ? atoi (num[0]) : 0; + pt->n[1] = pt->num_ints > 1 ? atoi (num[1]) : 0; + pt->n[2] = pt->num_ints > 2 ? atoi (num[2]) : 0; + + pt->month = G_DATE_BAD_MONTH; + + if (pt->num_ints < 3) + { + gchar *casefold; + gchar *normalized; + + casefold = g_utf8_casefold (str, -1); + normalized = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); + g_free (casefold); + + i = 1; + while (i < 13) + { + if (long_month_names[i] != NULL) + { + const gchar *found = strstr (normalized, long_month_names[i]); + + if (found != NULL) + { + pt->month = i; + break; + } + } + + if (short_month_names[i] != NULL) + { + const gchar *found = strstr (normalized, short_month_names[i]); + + if (found != NULL) + { + pt->month = i; + break; + } + } + + ++i; + } + + g_free (normalized); + } +} + +/* HOLDS: g_date_global_lock */ +static void +g_date_prepare_to_parse (const gchar *str, + GDateParseTokens *pt) +{ + const gchar *locale = setlocale (LC_TIME, NULL); + gboolean recompute_localeinfo = FALSE; + GDate d; + + g_return_if_fail (locale != NULL); /* should not happen */ + + g_date_clear (&d, 1); /* clear for scratch use */ + + if ( (current_locale == NULL) || (strcmp (locale, current_locale) != 0) ) + recompute_localeinfo = TRUE; /* Uh, there used to be a reason for the temporary */ + + if (recompute_localeinfo) + { + int i = 1; + GDateParseTokens testpt; + gchar buf[128]; + + g_free (current_locale); /* still works if current_locale == NULL */ + + current_locale = g_strdup (locale); + + short_month_names[0] = "Error"; + long_month_names[0] = "Error"; + + while (i < 13) + { + gchar *casefold; + + g_date_set_dmy (&d, 1, i, 1); + + g_return_if_fail (g_date_valid (&d)); + + g_date_strftime (buf, 127, "%b", &d); + + casefold = g_utf8_casefold (buf, -1); + g_free (short_month_names[i]); + short_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); + g_free (casefold); + + g_date_strftime (buf, 127, "%B", &d); + casefold = g_utf8_casefold (buf, -1); + g_free (long_month_names[i]); + long_month_names[i] = g_utf8_normalize (casefold, -1, G_NORMALIZE_ALL); + g_free (casefold); + + ++i; + } + + /* Determine DMY order */ + + /* had to pick a random day - don't change this, some strftimes + * are broken on some days, and this one is good so far. */ + g_date_set_dmy (&d, 4, 7, 1976); + + g_date_strftime (buf, 127, "%x", &d); + + g_date_fill_parse_tokens (buf, &testpt); + + i = 0; + while (i < testpt.num_ints) + { + switch (testpt.n[i]) + { + case 7: + dmy_order[i] = G_DATE_MONTH; + break; + case 4: + dmy_order[i] = G_DATE_DAY; + break; + case 76: + using_twodigit_years = TRUE; /* FALL THRU */ + case 1976: + dmy_order[i] = G_DATE_YEAR; + break; + default: + /* assume locale era */ + locale_era_adjust = 1976 - testpt.n[i]; + dmy_order[i] = G_DATE_YEAR; + break; + } + ++i; + } + +#ifdef G_ENABLE_DEBUG + DEBUG_MSG (("**GDate prepared a new set of locale-specific parse rules.")); + i = 1; + while (i < 13) + { + DEBUG_MSG ((" %s %s", long_month_names[i], short_month_names[i])); + ++i; + } + if (using_twodigit_years) + { + DEBUG_MSG (("**Using twodigit years with cutoff year: %u", twodigit_start_year)); + } + { + gchar *strings[3]; + i = 0; + while (i < 3) + { + switch (dmy_order[i]) + { + case G_DATE_MONTH: + strings[i] = "Month"; + break; + case G_DATE_YEAR: + strings[i] = "Year"; + break; + case G_DATE_DAY: + strings[i] = "Day"; + break; + default: + strings[i] = NULL; + break; + } + ++i; + } + DEBUG_MSG (("**Order: %s, %s, %s", strings[0], strings[1], strings[2])); + DEBUG_MSG (("**Sample date in this locale: `%s'", buf)); + } +#endif + } + + g_date_fill_parse_tokens (str, pt); +} + +void +g_date_set_parse (GDate *d, + const gchar *str) +{ + GDateParseTokens pt; + guint m = G_DATE_BAD_MONTH, day = G_DATE_BAD_DAY, y = G_DATE_BAD_YEAR; + + g_return_if_fail (d != NULL); + + /* set invalid */ + g_date_clear (d, 1); + + G_LOCK (g_date_global); + + g_date_prepare_to_parse (str, &pt); + + DEBUG_MSG (("Found %d ints, `%d' `%d' `%d' and written out month %d", + pt.num_ints, pt.n[0], pt.n[1], pt.n[2], pt.month)); + + + if (pt.num_ints == 4) + { + G_UNLOCK (g_date_global); + return; /* presumably a typo; bail out. */ + } + + if (pt.num_ints > 1) + { + int i = 0; + int j = 0; + + g_assert (pt.num_ints < 4); /* i.e., it is 2 or 3 */ + + while (i < pt.num_ints && j < 3) + { + switch (dmy_order[j]) + { + case G_DATE_MONTH: + { + if (pt.num_ints == 2 && pt.month != G_DATE_BAD_MONTH) + { + m = pt.month; + ++j; /* skip months, but don't skip this number */ + continue; + } + else + m = pt.n[i]; + } + break; + case G_DATE_DAY: + { + if (pt.num_ints == 2 && pt.month == G_DATE_BAD_MONTH) + { + day = 1; + ++j; /* skip days, since we may have month/year */ + continue; + } + day = pt.n[i]; + } + break; + case G_DATE_YEAR: + { + y = pt.n[i]; + + if (locale_era_adjust != 0) + { + y += locale_era_adjust; + } + else if (using_twodigit_years && y < 100) + { + guint two = twodigit_start_year % 100; + guint century = (twodigit_start_year / 100) * 100; + + if (y < two) + century += 100; + + y += century; + } + } + break; + default: + break; + } + + ++i; + ++j; + } + + + if (pt.num_ints == 3 && !g_date_valid_dmy (day, m, y)) + { + /* Try YYYY MM DD */ + y = pt.n[0]; + m = pt.n[1]; + day = pt.n[2]; + + if (using_twodigit_years && y < 100) + y = G_DATE_BAD_YEAR; /* avoids ambiguity */ + } + else if (pt.num_ints == 2) + { + if (m == G_DATE_BAD_MONTH && pt.month != G_DATE_BAD_MONTH) + m = pt.month; + } + } + else if (pt.num_ints == 1) + { + if (pt.month != G_DATE_BAD_MONTH) + { + /* Month name and year? */ + m = pt.month; + day = 1; + y = pt.n[0]; + } + else + { + /* Try yyyymmdd and yymmdd */ + + m = (pt.n[0]/100) % 100; + day = pt.n[0] % 100; + y = pt.n[0]/10000; + + /* FIXME move this into a separate function */ + if (using_twodigit_years && y < 100) + { + guint two = twodigit_start_year % 100; + guint century = (twodigit_start_year / 100) * 100; + + if (y < two) + century += 100; + + y += century; + } + } + } + + /* See if we got anything valid out of all this. */ + /* y < 8000 is to catch 19998 style typos; the library is OK up to 65535 or so */ + if (y < 8000 && g_date_valid_dmy (day, m, y)) + { + d->month = m; + d->day = day; + d->year = y; + d->dmy = TRUE; + } +#ifdef G_ENABLE_DEBUG + else + { + DEBUG_MSG (("Rejected DMY %u %u %u", day, m, y)); + } +#endif + G_UNLOCK (g_date_global); +} + +/** + * g_date_set_time_t: + * @date: a #GDate + * @timet: time_t value to set + * + * Sets the value of a date to the date corresponding to a time + * specified as a time_t. The time to date conversion is done using + * the user's current timezone. + * + * To set the value of a date to the current day, you could write: + * |[ + * g_date_set_time_t (date, time (NULL)); + * ]| + * + * Since: 2.10 + */ +void +g_date_set_time_t (GDate *date, + time_t timet) +{ + struct tm tm; + + g_return_if_fail (date != NULL); + +#ifdef HAVE_LOCALTIME_R + localtime_r (&timet, &tm); +#else + { + struct tm *ptm = localtime (&timet); + + if (ptm == NULL) + { + /* Happens at least in Microsoft's C library if you pass a + * negative time_t. Use 2000-01-01 as default date. + */ +#ifndef G_DISABLE_CHECKS + g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "ptm != NULL"); +#endif + + tm.tm_mon = 0; + tm.tm_mday = 1; + tm.tm_year = 100; + } + else + memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm)); + } +#endif + + date->julian = FALSE; + + date->month = tm.tm_mon + 1; + date->day = tm.tm_mday; + date->year = tm.tm_year + 1900; + + g_return_if_fail (g_date_valid_dmy (date->day, date->month, date->year)); + + date->dmy = TRUE; +} + + +/** + * g_date_set_time: + * @date: a #GDate. + * @time_: #GTime value to set. + * + * Sets the value of a date from a #GTime value. + * The time to date conversion is done using the user's current timezone. + * + * Deprecated: 2.10: Use g_date_set_time_t() instead. + */ +void +g_date_set_time (GDate *date, + GTime time_) +{ + g_date_set_time_t (date, (time_t) time_); +} + +/** + * g_date_set_time_val: + * @date: a #GDate + * @timeval: #GTimeVal value to set + * + * Sets the value of a date from a #GTimeVal value. Note that the + * @tv_usec member is ignored, because #GDate can't make use of the + * additional precision. + * + * Since: 2.10 + */ +void +g_date_set_time_val (GDate *date, + GTimeVal *timeval) +{ + g_date_set_time_t (date, (time_t) timeval->tv_sec); +} + +void +g_date_set_month (GDate *d, + GDateMonth m) +{ + g_return_if_fail (d != NULL); + g_return_if_fail (g_date_valid_month (m)); + + if (d->julian && !d->dmy) g_date_update_dmy(d); + d->julian = FALSE; + + d->month = m; + + if (g_date_valid_dmy (d->day, d->month, d->year)) + d->dmy = TRUE; + else + d->dmy = FALSE; +} + +void +g_date_set_day (GDate *d, + GDateDay day) +{ + g_return_if_fail (d != NULL); + g_return_if_fail (g_date_valid_day (day)); + + if (d->julian && !d->dmy) g_date_update_dmy(d); + d->julian = FALSE; + + d->day = day; + + if (g_date_valid_dmy (d->day, d->month, d->year)) + d->dmy = TRUE; + else + d->dmy = FALSE; +} + +void +g_date_set_year (GDate *d, + GDateYear y) +{ + g_return_if_fail (d != NULL); + g_return_if_fail (g_date_valid_year (y)); + + if (d->julian && !d->dmy) g_date_update_dmy(d); + d->julian = FALSE; + + d->year = y; + + if (g_date_valid_dmy (d->day, d->month, d->year)) + d->dmy = TRUE; + else + d->dmy = FALSE; +} + +void +g_date_set_dmy (GDate *d, + GDateDay day, + GDateMonth m, + GDateYear y) +{ + g_return_if_fail (d != NULL); + g_return_if_fail (g_date_valid_dmy (day, m, y)); + + d->julian = FALSE; + + d->month = m; + d->day = day; + d->year = y; + + d->dmy = TRUE; +} + +void +g_date_set_julian (GDate *d, + guint32 j) +{ + g_return_if_fail (d != NULL); + g_return_if_fail (g_date_valid_julian (j)); + + d->julian_days = j; + d->julian = TRUE; + d->dmy = FALSE; +} + + +gboolean +g_date_is_first_of_month (const GDate *d) +{ + g_return_val_if_fail (g_date_valid (d), FALSE); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, FALSE); + + if (d->day == 1) return TRUE; + else return FALSE; +} + +gboolean +g_date_is_last_of_month (const GDate *d) +{ + gint idx; + + g_return_val_if_fail (g_date_valid (d), FALSE); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_val_if_fail (d->dmy, FALSE); + + idx = g_date_is_leap_year (d->year) ? 1 : 0; + + if (d->day == days_in_months[idx][d->month]) return TRUE; + else return FALSE; +} + +void +g_date_add_days (GDate *d, + guint ndays) +{ + g_return_if_fail (g_date_valid (d)); + + if (!d->julian) + g_date_update_julian (d); + + g_return_if_fail (d->julian); + + d->julian_days += ndays; + d->dmy = FALSE; +} + +void +g_date_subtract_days (GDate *d, + guint ndays) +{ + g_return_if_fail (g_date_valid (d)); + + if (!d->julian) + g_date_update_julian (d); + + g_return_if_fail (d->julian); + g_return_if_fail (d->julian_days > ndays); + + d->julian_days -= ndays; + d->dmy = FALSE; +} + +void +g_date_add_months (GDate *d, + guint nmonths) +{ + guint years, months; + gint idx; + + g_return_if_fail (g_date_valid (d)); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_if_fail (d->dmy); + + nmonths += d->month - 1; + + years = nmonths/12; + months = nmonths%12; + + d->month = months + 1; + d->year += years; + + idx = g_date_is_leap_year (d->year) ? 1 : 0; + + if (d->day > days_in_months[idx][d->month]) + d->day = days_in_months[idx][d->month]; + + d->julian = FALSE; + + g_return_if_fail (g_date_valid (d)); +} + +void +g_date_subtract_months (GDate *d, + guint nmonths) +{ + guint years, months; + gint idx; + + g_return_if_fail (g_date_valid (d)); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_if_fail (d->dmy); + + years = nmonths/12; + months = nmonths%12; + + g_return_if_fail (d->year > years); + + d->year -= years; + + if (d->month > months) d->month -= months; + else + { + months -= d->month; + d->month = 12 - months; + d->year -= 1; + } + + idx = g_date_is_leap_year (d->year) ? 1 : 0; + + if (d->day > days_in_months[idx][d->month]) + d->day = days_in_months[idx][d->month]; + + d->julian = FALSE; + + g_return_if_fail (g_date_valid (d)); +} + +void +g_date_add_years (GDate *d, + guint nyears) +{ + g_return_if_fail (g_date_valid (d)); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_if_fail (d->dmy); + + d->year += nyears; + + if (d->month == 2 && d->day == 29) + { + if (!g_date_is_leap_year (d->year)) + d->day = 28; + } + + d->julian = FALSE; +} + +void +g_date_subtract_years (GDate *d, + guint nyears) +{ + g_return_if_fail (g_date_valid (d)); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_if_fail (d->dmy); + g_return_if_fail (d->year > nyears); + + d->year -= nyears; + + if (d->month == 2 && d->day == 29) + { + if (!g_date_is_leap_year (d->year)) + d->day = 28; + } + + d->julian = FALSE; +} + +gboolean +g_date_is_leap_year (GDateYear year) +{ + g_return_val_if_fail (g_date_valid_year (year), FALSE); + + return ( (((year % 4) == 0) && ((year % 100) != 0)) || + (year % 400) == 0 ); +} + +guint8 +g_date_get_days_in_month (GDateMonth month, + GDateYear year) +{ + gint idx; + + g_return_val_if_fail (g_date_valid_year (year), 0); + g_return_val_if_fail (g_date_valid_month (month), 0); + + idx = g_date_is_leap_year (year) ? 1 : 0; + + return days_in_months[idx][month]; +} + +guint8 +g_date_get_monday_weeks_in_year (GDateYear year) +{ + GDate d; + + g_return_val_if_fail (g_date_valid_year (year), 0); + + g_date_clear (&d, 1); + g_date_set_dmy (&d, 1, 1, year); + if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; + g_date_set_dmy (&d, 31, 12, year); + if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; + if (g_date_is_leap_year (year)) + { + g_date_set_dmy (&d, 2, 1, year); + if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; + g_date_set_dmy (&d, 30, 12, year); + if (g_date_get_weekday (&d) == G_DATE_MONDAY) return 53; + } + return 52; +} + +guint8 +g_date_get_sunday_weeks_in_year (GDateYear year) +{ + GDate d; + + g_return_val_if_fail (g_date_valid_year (year), 0); + + g_date_clear (&d, 1); + g_date_set_dmy (&d, 1, 1, year); + if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; + g_date_set_dmy (&d, 31, 12, year); + if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; + if (g_date_is_leap_year (year)) + { + g_date_set_dmy (&d, 2, 1, year); + if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; + g_date_set_dmy (&d, 30, 12, year); + if (g_date_get_weekday (&d) == G_DATE_SUNDAY) return 53; + } + return 52; +} + +gint +g_date_compare (const GDate *lhs, + const GDate *rhs) +{ + g_return_val_if_fail (lhs != NULL, 0); + g_return_val_if_fail (rhs != NULL, 0); + g_return_val_if_fail (g_date_valid (lhs), 0); + g_return_val_if_fail (g_date_valid (rhs), 0); + + /* Remember the self-comparison case! I think it works right now. */ + + while (TRUE) + { + if (lhs->julian && rhs->julian) + { + if (lhs->julian_days < rhs->julian_days) return -1; + else if (lhs->julian_days > rhs->julian_days) return 1; + else return 0; + } + else if (lhs->dmy && rhs->dmy) + { + if (lhs->year < rhs->year) return -1; + else if (lhs->year > rhs->year) return 1; + else + { + if (lhs->month < rhs->month) return -1; + else if (lhs->month > rhs->month) return 1; + else + { + if (lhs->day < rhs->day) return -1; + else if (lhs->day > rhs->day) return 1; + else return 0; + } + + } + + } + else + { + if (!lhs->julian) g_date_update_julian (lhs); + if (!rhs->julian) g_date_update_julian (rhs); + g_return_val_if_fail (lhs->julian, 0); + g_return_val_if_fail (rhs->julian, 0); + } + + } + return 0; /* warnings */ +} + + +void +g_date_to_struct_tm (const GDate *d, + struct tm *tm) +{ + GDateWeekday day; + + g_return_if_fail (g_date_valid (d)); + g_return_if_fail (tm != NULL); + + if (!d->dmy) + g_date_update_dmy (d); + + g_return_if_fail (d->dmy); + + /* zero all the irrelevant fields to be sure they're valid */ + + /* On Linux and maybe other systems, there are weird non-POSIX + * fields on the end of struct tm that choke strftime if they + * contain garbage. So we need to 0 the entire struct, not just the + * fields we know to exist. + */ + + memset (tm, 0x0, sizeof (struct tm)); + + tm->tm_mday = d->day; + tm->tm_mon = d->month - 1; /* 0-11 goes in tm */ + tm->tm_year = ((int)d->year) - 1900; /* X/Open says tm_year can be negative */ + + day = g_date_get_weekday (d); + if (day == 7) day = 0; /* struct tm wants days since Sunday, so Sunday is 0 */ + + tm->tm_wday = (int)day; + + tm->tm_yday = g_date_get_day_of_year (d) - 1; /* 0 to 365 */ + tm->tm_isdst = -1; /* -1 means "information not available" */ +} + +void +g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date) +{ + g_return_if_fail (g_date_valid (date)); + + if (min_date != NULL) + g_return_if_fail (g_date_valid (min_date)); + + if (max_date != NULL) + g_return_if_fail (g_date_valid (max_date)); + + if (min_date != NULL && max_date != NULL) + g_return_if_fail (g_date_compare (min_date, max_date) <= 0); + + if (min_date && g_date_compare (date, min_date) < 0) + *date = *min_date; + + if (max_date && g_date_compare (max_date, date) < 0) + *date = *max_date; +} + +void +g_date_order (GDate *date1, + GDate *date2) +{ + g_return_if_fail (g_date_valid (date1)); + g_return_if_fail (g_date_valid (date2)); + + if (g_date_compare (date1, date2) > 0) + { + GDate tmp = *date1; + *date1 = *date2; + *date2 = tmp; + } +} + +#ifdef G_OS_WIN32 +static gsize +win32_strftime_helper (const GDate *d, + const gchar *format, + const struct tm *tm, + gchar *s, + gsize slen) +{ + SYSTEMTIME systemtime; + TIME_ZONE_INFORMATION tzinfo; + LCID lcid; + int n, k; + GArray *result; + const gchar *p; + gunichar c; + const wchar_t digits[] = L"0123456789"; + gchar *convbuf; + glong convlen = 0; + gsize retval; + + systemtime.wYear = tm->tm_year + 1900; + systemtime.wMonth = tm->tm_mon + 1; + systemtime.wDayOfWeek = tm->tm_wday; + systemtime.wDay = tm->tm_mday; + systemtime.wHour = tm->tm_hour; + systemtime.wMinute = tm->tm_min; + systemtime.wSecond = tm->tm_sec; + systemtime.wMilliseconds = 0; + + lcid = GetThreadLocale (); + result = g_array_sized_new (FALSE, FALSE, sizeof (wchar_t), MAX (128, strlen (format) * 2)); + + p = format; + while (*p) + { + c = g_utf8_get_char (p); + if (c == '%') + { + p = g_utf8_next_char (p); + if (!*p) + { + s[0] = '\0'; + g_array_free (result, TRUE); + + return 0; + } + + c = g_utf8_get_char (p); + if (c == 'E' || c == 'O') + { + /* Ignore modified conversion specifiers for now. */ + p = g_utf8_next_char (p); + if (!*p) + { + s[0] = '\0'; + g_array_free (result, TRUE); + + return 0; + } + + c = g_utf8_get_char (p); + } + + switch (c) + { + case 'a': + if (systemtime.wDayOfWeek == 0) + k = 6; + else + k = systemtime.wDayOfWeek - 1; + n = GetLocaleInfoW (lcid, LOCALE_SABBREVDAYNAME1+k, NULL, 0); + g_array_set_size (result, result->len + n); + GetLocaleInfoW (lcid, LOCALE_SABBREVDAYNAME1+k, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + break; + case 'A': + if (systemtime.wDayOfWeek == 0) + k = 6; + else + k = systemtime.wDayOfWeek - 1; + n = GetLocaleInfoW (lcid, LOCALE_SDAYNAME1+k, NULL, 0); + g_array_set_size (result, result->len + n); + GetLocaleInfoW (lcid, LOCALE_SDAYNAME1+k, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + break; + case 'b': + case 'h': + n = GetLocaleInfoW (lcid, LOCALE_SABBREVMONTHNAME1+systemtime.wMonth-1, NULL, 0); + g_array_set_size (result, result->len + n); + GetLocaleInfoW (lcid, LOCALE_SABBREVMONTHNAME1+systemtime.wMonth-1, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + break; + case 'B': + n = GetLocaleInfoW (lcid, LOCALE_SMONTHNAME1+systemtime.wMonth-1, NULL, 0); + g_array_set_size (result, result->len + n); + GetLocaleInfoW (lcid, LOCALE_SMONTHNAME1+systemtime.wMonth-1, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + break; + case 'c': + n = GetDateFormatW (lcid, 0, &systemtime, NULL, NULL, 0); + if (n > 0) + { + g_array_set_size (result, result->len + n); + GetDateFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + } + g_array_append_vals (result, L" ", 1); + n = GetTimeFormatW (lcid, 0, &systemtime, NULL, NULL, 0); + if (n > 0) + { + g_array_set_size (result, result->len + n); + GetTimeFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + } + break; + case 'C': + g_array_append_vals (result, digits + systemtime.wYear/1000, 1); + g_array_append_vals (result, digits + (systemtime.wYear/1000)%10, 1); + break; + case 'd': + g_array_append_vals (result, digits + systemtime.wDay/10, 1); + g_array_append_vals (result, digits + systemtime.wDay%10, 1); + break; + case 'D': + g_array_append_vals (result, digits + systemtime.wMonth/10, 1); + g_array_append_vals (result, digits + systemtime.wMonth%10, 1); + g_array_append_vals (result, L"/", 1); + g_array_append_vals (result, digits + systemtime.wDay/10, 1); + g_array_append_vals (result, digits + systemtime.wDay%10, 1); + g_array_append_vals (result, L"/", 1); + g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1); + g_array_append_vals (result, digits + systemtime.wYear%10, 1); + break; + case 'e': + if (systemtime.wDay >= 10) + g_array_append_vals (result, digits + systemtime.wDay/10, 1); + else + g_array_append_vals (result, L" ", 1); + g_array_append_vals (result, digits + systemtime.wDay%10, 1); + break; + + /* A GDate has no time fields, so for now we can + * hardcode all time conversions into zeros (or 12 for + * %I). The alternative code snippets in the #else + * branches are here ready to be taken into use when + * needed by a g_strftime() or g_date_and_time_format() + * or whatever. + */ + case 'H': +#if 1 + g_array_append_vals (result, L"00", 2); +#else + g_array_append_vals (result, digits + systemtime.wHour/10, 1); + g_array_append_vals (result, digits + systemtime.wHour%10, 1); +#endif + break; + case 'I': +#if 1 + g_array_append_vals (result, L"12", 2); +#else + if (systemtime.wHour == 0) + g_array_append_vals (result, L"12", 2); + else + { + g_array_append_vals (result, digits + (systemtime.wHour%12)/10, 1); + g_array_append_vals (result, digits + (systemtime.wHour%12)%10, 1); + } +#endif + break; + case 'j': + g_array_append_vals (result, digits + (tm->tm_yday+1)/100, 1); + g_array_append_vals (result, digits + ((tm->tm_yday+1)/10)%10, 1); + g_array_append_vals (result, digits + (tm->tm_yday+1)%10, 1); + break; + case 'm': + g_array_append_vals (result, digits + systemtime.wMonth/10, 1); + g_array_append_vals (result, digits + systemtime.wMonth%10, 1); + break; + case 'M': +#if 1 + g_array_append_vals (result, L"00", 2); +#else + g_array_append_vals (result, digits + systemtime.wMinute/10, 1); + g_array_append_vals (result, digits + systemtime.wMinute%10, 1); +#endif + break; + case 'n': + g_array_append_vals (result, L"\n", 1); + break; + case 'p': + n = GetTimeFormatW (lcid, 0, &systemtime, L"tt", NULL, 0); + if (n > 0) + { + g_array_set_size (result, result->len + n); + GetTimeFormatW (lcid, 0, &systemtime, L"tt", ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + } + break; + case 'r': + /* This is a rather odd format. Hard to say what to do. + * Let's always use the POSIX %I:%M:%S %p + */ +#if 1 + g_array_append_vals (result, L"12:00:00", 8); +#else + if (systemtime.wHour == 0) + g_array_append_vals (result, L"12", 2); + else + { + g_array_append_vals (result, digits + (systemtime.wHour%12)/10, 1); + g_array_append_vals (result, digits + (systemtime.wHour%12)%10, 1); + } + g_array_append_vals (result, L":", 1); + g_array_append_vals (result, digits + systemtime.wMinute/10, 1); + g_array_append_vals (result, digits + systemtime.wMinute%10, 1); + g_array_append_vals (result, L":", 1); + g_array_append_vals (result, digits + systemtime.wSecond/10, 1); + g_array_append_vals (result, digits + systemtime.wSecond%10, 1); + g_array_append_vals (result, L" ", 1); +#endif + n = GetTimeFormatW (lcid, 0, &systemtime, L"tt", NULL, 0); + if (n > 0) + { + g_array_set_size (result, result->len + n); + GetTimeFormatW (lcid, 0, &systemtime, L"tt", ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + } + break; + case 'R': +#if 1 + g_array_append_vals (result, L"00:00", 5); +#else + g_array_append_vals (result, digits + systemtime.wHour/10, 1); + g_array_append_vals (result, digits + systemtime.wHour%10, 1); + g_array_append_vals (result, L":", 1); + g_array_append_vals (result, digits + systemtime.wMinute/10, 1); + g_array_append_vals (result, digits + systemtime.wMinute%10, 1); +#endif + break; + case 'S': +#if 1 + g_array_append_vals (result, L"00", 2); +#else + g_array_append_vals (result, digits + systemtime.wSecond/10, 1); + g_array_append_vals (result, digits + systemtime.wSecond%10, 1); +#endif + break; + case 't': + g_array_append_vals (result, L"\t", 1); + break; + case 'T': +#if 1 + g_array_append_vals (result, L"00:00:00", 8); +#else + g_array_append_vals (result, digits + systemtime.wHour/10, 1); + g_array_append_vals (result, digits + systemtime.wHour%10, 1); + g_array_append_vals (result, L":", 1); + g_array_append_vals (result, digits + systemtime.wMinute/10, 1); + g_array_append_vals (result, digits + systemtime.wMinute%10, 1); + g_array_append_vals (result, L":", 1); + g_array_append_vals (result, digits + systemtime.wSecond/10, 1); + g_array_append_vals (result, digits + systemtime.wSecond%10, 1); +#endif + break; + case 'u': + if (systemtime.wDayOfWeek == 0) + g_array_append_vals (result, L"7", 1); + else + g_array_append_vals (result, digits + systemtime.wDayOfWeek, 1); + break; + case 'U': + n = g_date_get_sunday_week_of_year (d); + g_array_append_vals (result, digits + n/10, 1); + g_array_append_vals (result, digits + n%10, 1); + break; + case 'V': + n = g_date_get_iso8601_week_of_year (d); + g_array_append_vals (result, digits + n/10, 1); + g_array_append_vals (result, digits + n%10, 1); + break; + case 'w': + g_array_append_vals (result, digits + systemtime.wDayOfWeek, 1); + break; + case 'W': + n = g_date_get_monday_week_of_year (d); + g_array_append_vals (result, digits + n/10, 1); + g_array_append_vals (result, digits + n%10, 1); + break; + case 'x': + n = GetDateFormatW (lcid, 0, &systemtime, NULL, NULL, 0); + if (n > 0) + { + g_array_set_size (result, result->len + n); + GetDateFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + } + break; + case 'X': + n = GetTimeFormatW (lcid, 0, &systemtime, NULL, NULL, 0); + if (n > 0) + { + g_array_set_size (result, result->len + n); + GetTimeFormatW (lcid, 0, &systemtime, NULL, ((wchar_t *) result->data) + result->len - n, n); + g_array_set_size (result, result->len - 1); + } + break; + case 'y': + g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1); + g_array_append_vals (result, digits + systemtime.wYear%10, 1); + break; + case 'Y': + g_array_append_vals (result, digits + systemtime.wYear/1000, 1); + g_array_append_vals (result, digits + (systemtime.wYear/100)%10, 1); + g_array_append_vals (result, digits + (systemtime.wYear/10)%10, 1); + g_array_append_vals (result, digits + systemtime.wYear%10, 1); + break; + case 'Z': + n = GetTimeZoneInformation (&tzinfo); + if (n == TIME_ZONE_ID_UNKNOWN) + ; + else if (n == TIME_ZONE_ID_STANDARD) + g_array_append_vals (result, tzinfo.StandardName, wcslen (tzinfo.StandardName)); + else if (n == TIME_ZONE_ID_DAYLIGHT) + g_array_append_vals (result, tzinfo.DaylightName, wcslen (tzinfo.DaylightName)); + break; + case '%': + g_array_append_vals (result, L"%", 1); + break; + } + } + else if (c <= 0xFFFF) + { + wchar_t wc = c; + g_array_append_vals (result, &wc, 1); + } + else + { + glong nwc; + wchar_t *ws; + + ws = g_ucs4_to_utf16 (&c, 1, NULL, &nwc, NULL); + g_array_append_vals (result, ws, nwc); + g_free (ws); + } + p = g_utf8_next_char (p); + } + + convbuf = g_utf16_to_utf8 ((wchar_t *) result->data, result->len, NULL, &convlen, NULL); + g_array_free (result, TRUE); + + if (!convbuf) + { + s[0] = '\0'; + return 0; + } + + if (slen <= convlen) + { + /* Ensure only whole characters are copied into the buffer. */ + gchar *end = g_utf8_find_prev_char (convbuf, convbuf + slen); + g_assert (end != NULL); + convlen = end - convbuf; + + /* Return 0 because the buffer isn't large enough. */ + retval = 0; + } + else + retval = convlen; + + memcpy (s, convbuf, convlen); + s[convlen] = '\0'; + g_free (convbuf); + + return retval; +} + +#endif + +gsize +g_date_strftime (gchar *s, + gsize slen, + const gchar *format, + const GDate *d) +{ + struct tm tm; +#ifndef G_OS_WIN32 + gsize locale_format_len = 0; + gchar *locale_format; + gsize tmplen; + gchar *tmpbuf; + gsize tmpbufsize; + gsize convlen = 0; + gchar *convbuf; + GError *error = NULL; + gsize retval; +#endif + + g_return_val_if_fail (g_date_valid (d), 0); + g_return_val_if_fail (slen > 0, 0); + g_return_val_if_fail (format != NULL, 0); + g_return_val_if_fail (s != NULL, 0); + + g_date_to_struct_tm (d, &tm); + +#ifdef G_OS_WIN32 + if (!g_utf8_validate (format, -1, NULL)) + { + s[0] = '\0'; + return 0; + } + return win32_strftime_helper (d, format, &tm, s, slen); +#else + + locale_format = g_locale_from_utf8 (format, -1, NULL, &locale_format_len, &error); + + if (error) + { + g_warning (G_STRLOC "Error converting format to locale encoding: %s\n", error->message); + g_error_free (error); + + s[0] = '\0'; + return 0; + } + + tmpbufsize = MAX (128, locale_format_len * 2); + while (TRUE) + { + tmpbuf = g_malloc (tmpbufsize); + + /* Set the first byte to something other than '\0', to be able to + * recognize whether strftime actually failed or just returned "". + */ + tmpbuf[0] = '\1'; + tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm); + + if (tmplen == 0 && tmpbuf[0] != '\0') + { + g_free (tmpbuf); + tmpbufsize *= 2; + + if (tmpbufsize > 65536) + { + g_warning (G_STRLOC "Maximum buffer size for g_date_strftime exceeded: giving up\n"); + g_free (locale_format); + + s[0] = '\0'; + return 0; + } + } + else + break; + } + g_free (locale_format); + + convbuf = g_locale_to_utf8 (tmpbuf, tmplen, NULL, &convlen, &error); + g_free (tmpbuf); + + if (error) + { + g_warning (G_STRLOC "Error converting results of strftime to UTF-8: %s\n", error->message); + g_error_free (error); + + s[0] = '\0'; + return 0; + } + + if (slen <= convlen) + { + /* Ensure only whole characters are copied into the buffer. + */ + gchar *end = g_utf8_find_prev_char (convbuf, convbuf + slen); + g_assert (end != NULL); + convlen = end - convbuf; + + /* Return 0 because the buffer isn't large enough. + */ + retval = 0; + } + else + retval = convlen; + + memcpy (s, convbuf, convlen); + s[convlen] = '\0'; + g_free (convbuf); + + return retval; +#endif +} + +#define __G_DATE_C__ +#include "galiasdef.c" + diff --git a/glib/gdate.h b/glib/gdate.h new file mode 100644 index 0000000..cb1f566 --- /dev/null +++ b/glib/gdate.h @@ -0,0 +1,263 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_DATE_H__ +#define __G_DATE_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +/* GDate + * + * Date calculations (not time for now, to be resolved). These are a + * mutant combination of Steffen Beyer's DateCalc routines + * (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's + * date routines (written for in-house software). Written by Havoc + * Pennington + */ + +typedef gint32 GTime; +typedef guint16 GDateYear; +typedef guint8 GDateDay; /* day of the month */ +typedef struct _GDate GDate; + +/* enum used to specify order of appearance in parsed date strings */ +typedef enum +{ + G_DATE_DAY = 0, + G_DATE_MONTH = 1, + G_DATE_YEAR = 2 +} GDateDMY; + +/* actual week and month values */ +typedef enum +{ + G_DATE_BAD_WEEKDAY = 0, + G_DATE_MONDAY = 1, + G_DATE_TUESDAY = 2, + G_DATE_WEDNESDAY = 3, + G_DATE_THURSDAY = 4, + G_DATE_FRIDAY = 5, + G_DATE_SATURDAY = 6, + G_DATE_SUNDAY = 7 +} GDateWeekday; +typedef enum +{ + G_DATE_BAD_MONTH = 0, + G_DATE_JANUARY = 1, + G_DATE_FEBRUARY = 2, + G_DATE_MARCH = 3, + G_DATE_APRIL = 4, + G_DATE_MAY = 5, + G_DATE_JUNE = 6, + G_DATE_JULY = 7, + G_DATE_AUGUST = 8, + G_DATE_SEPTEMBER = 9, + G_DATE_OCTOBER = 10, + G_DATE_NOVEMBER = 11, + G_DATE_DECEMBER = 12 +} GDateMonth; + +#define G_DATE_BAD_JULIAN 0U +#define G_DATE_BAD_DAY 0U +#define G_DATE_BAD_YEAR 0U + +/* Note: directly manipulating structs is generally a bad idea, but + * in this case it's an *incredibly* bad idea, because all or part + * of this struct can be invalid at any given time. Use the functions, + * or you will get hosed, I promise. + */ +struct _GDate +{ + guint julian_days : 32; /* julian days representation - we use a + * bitfield hoping that 64 bit platforms + * will pack this whole struct in one big + * int + */ + + guint julian : 1; /* julian is valid */ + guint dmy : 1; /* dmy is valid */ + + /* DMY representation */ + guint day : 6; + guint month : 4; + guint year : 16; +}; + +/* g_date_new() returns an invalid date, you then have to _set() stuff + * to get a usable object. You can also allocate a GDate statically, + * then call g_date_clear() to initialize. + */ +GDate* g_date_new (void); +GDate* g_date_new_dmy (GDateDay day, + GDateMonth month, + GDateYear year); +GDate* g_date_new_julian (guint32 julian_day); +void g_date_free (GDate *date); + +/* check g_date_valid() after doing an operation that might fail, like + * _parse. Almost all g_date operations are undefined on invalid + * dates (the exceptions are the mutators, since you need those to + * return to validity). + */ +gboolean g_date_valid (const GDate *date); +gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST; +gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST; +gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST; +gboolean g_date_valid_weekday (GDateWeekday weekday) G_GNUC_CONST; +gboolean g_date_valid_julian (guint32 julian_date) G_GNUC_CONST; +gboolean g_date_valid_dmy (GDateDay day, + GDateMonth month, + GDateYear year) G_GNUC_CONST; + +GDateWeekday g_date_get_weekday (const GDate *date); +GDateMonth g_date_get_month (const GDate *date); +GDateYear g_date_get_year (const GDate *date); +GDateDay g_date_get_day (const GDate *date); +guint32 g_date_get_julian (const GDate *date); +guint g_date_get_day_of_year (const GDate *date); +/* First monday/sunday is the start of week 1; if we haven't reached + * that day, return 0. These are not ISO weeks of the year; that + * routine needs to be added. + * these functions return the number of weeks, starting on the + * corrsponding day + */ +guint g_date_get_monday_week_of_year (const GDate *date); +guint g_date_get_sunday_week_of_year (const GDate *date); +guint g_date_get_iso8601_week_of_year (const GDate *date); + +/* If you create a static date struct you need to clear it to get it + * in a sane state before use. You can clear a whole array at + * once with the ndates argument. + */ +void g_date_clear (GDate *date, + guint n_dates); + +/* The parse routine is meant for dates typed in by a user, so it + * permits many formats but tries to catch common typos. If your data + * needs to be strictly validated, it is not an appropriate function. + */ +void g_date_set_parse (GDate *date, + const gchar *str); +void g_date_set_time_t (GDate *date, + time_t timet); +void g_date_set_time_val (GDate *date, + GTimeVal *timeval); +#ifndef G_DISABLE_DEPRECATED +void g_date_set_time (GDate *date, + GTime time_); +#endif +void g_date_set_month (GDate *date, + GDateMonth month); +void g_date_set_day (GDate *date, + GDateDay day); +void g_date_set_year (GDate *date, + GDateYear year); +void g_date_set_dmy (GDate *date, + GDateDay day, + GDateMonth month, + GDateYear y); +void g_date_set_julian (GDate *date, + guint32 julian_date); +gboolean g_date_is_first_of_month (const GDate *date); +gboolean g_date_is_last_of_month (const GDate *date); + +/* To go forward by some number of weeks just go forward weeks*7 days */ +void g_date_add_days (GDate *date, + guint n_days); +void g_date_subtract_days (GDate *date, + guint n_days); + +/* If you add/sub months while day > 28, the day might change */ +void g_date_add_months (GDate *date, + guint n_months); +void g_date_subtract_months (GDate *date, + guint n_months); + +/* If it's feb 29, changing years can move you to the 28th */ +void g_date_add_years (GDate *date, + guint n_years); +void g_date_subtract_years (GDate *date, + guint n_years); +gboolean g_date_is_leap_year (GDateYear year) G_GNUC_CONST; +guint8 g_date_get_days_in_month (GDateMonth month, + GDateYear year) G_GNUC_CONST; +guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST; +guint8 g_date_get_sunday_weeks_in_year (GDateYear year) G_GNUC_CONST; + +/* Returns the number of days between the two dates. If date2 comes + before date1, a negative value is return. */ +gint g_date_days_between (const GDate *date1, + const GDate *date2); + +/* qsort-friendly (with a cast...) */ +gint g_date_compare (const GDate *lhs, + const GDate *rhs); +void g_date_to_struct_tm (const GDate *date, + struct tm *tm); + +void g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date); + +/* Swap date1 and date2's values if date1 > date2. */ +void g_date_order (GDate *date1, GDate *date2); + +/* Just like strftime() except you can only use date-related formats. + * Using a time format is undefined. + */ +gsize g_date_strftime (gchar *s, + gsize slen, + const gchar *format, + const GDate *date); + +#ifndef G_DISABLE_DEPRECATED + +#define g_date_weekday g_date_get_weekday +#define g_date_month g_date_get_month +#define g_date_year g_date_get_year +#define g_date_day g_date_get_day +#define g_date_julian g_date_get_julian +#define g_date_day_of_year g_date_get_day_of_year +#define g_date_monday_week_of_year g_date_get_monday_week_of_year +#define g_date_sunday_week_of_year g_date_get_sunday_week_of_year +#define g_date_days_in_month g_date_get_days_in_month +#define g_date_monday_weeks_in_year g_date_get_monday_weeks_in_year +#define g_date_sunday_weeks_in_year g_date_get_sunday_weeks_in_year + +#endif /* G_DISABLE_DEPRECATED */ + +G_END_DECLS + +#endif /* __G_DATE_H__ */ diff --git a/glib/gdebug.h b/glib/gdebug.h new file mode 100644 index 0000000..dea3dde --- /dev/null +++ b/glib/gdebug.h @@ -0,0 +1,59 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_DEBUG_H__ +#define __G_DEBUG_H__ + +G_BEGIN_DECLS + +typedef enum { + G_DEBUG_FATAL_WARNINGS = 1 << 0, + G_DEBUG_FATAL_CRITICALS = 1 << 1 +} GDebugFlag; + + +#ifdef G_ENABLE_DEBUG + +#define G_NOTE(type, action) G_STMT_START { \ + if (!_g_debug_initialized) \ + { _g_debug_init (); } \ + if (_g_debug_flags & G_DEBUG_##type) \ + { action; }; } G_STMT_END + +#else /* !G_ENABLE_DEBUG */ + +#define G_NOTE(type, action) + +#endif /* G_ENABLE_DEBUG */ + +GLIB_VAR gboolean _g_debug_initialized; +GLIB_VAR guint _g_debug_flags; + +G_GNUC_INTERNAL void _g_debug_init (void); + +G_END_DECLS + +#endif /* __G_DEBUG_H__ */ diff --git a/glib/gdir.c b/glib/gdir.c new file mode 100644 index 0000000..c6997ae --- /dev/null +++ b/glib/gdir.c @@ -0,0 +1,307 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gdir.c: Simplified wrapper around the DIRENT functions. + * + * Copyright 2001 Hans Breuer + * Copyright 2004 Tor Lillqvist + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include + +#ifdef HAVE_DIRENT_H +#include +#include +#endif + +#include "glib.h" +#include "gdir.h" + +#include "glibintl.h" + +#include "galias.h" + +#if defined (_MSC_VER) && !defined (HAVE_DIRENT_H) +#include "../build/win32/dirent/dirent.h" +#include "../build/win32/dirent/wdirent.c" +#endif + +struct _GDir +{ +#ifdef G_OS_WIN32 + _WDIR *wdirp; +#else + DIR *dirp; +#endif +#ifdef G_OS_WIN32 + gchar utf8_buf[FILENAME_MAX*4]; +#endif +}; + +/** + * g_dir_open: + * @path: the path to the directory you are interested in. On Unix + * in the on-disk encoding. On Windows in UTF-8 + * @flags: Currently must be set to 0. Reserved for future use. + * @error: return location for a #GError, or %NULL. + * If non-%NULL, an error will be set if and only if + * g_dir_open() fails. + * + * Opens a directory for reading. The names of the files in the + * directory can then be retrieved using g_dir_read_name(). + * + * Return value: a newly allocated #GDir on success, %NULL on failure. + * If non-%NULL, you must free the result with g_dir_close() + * when you are finished with it. + **/ +GDir * +g_dir_open (const gchar *path, + guint flags, + GError **error) +{ + GDir *dir; + int errsv; +#ifdef G_OS_WIN32 + wchar_t *wpath; +#else + gchar *utf8_path; +#endif + + g_return_val_if_fail (path != NULL, NULL); + +#ifdef G_OS_WIN32 + wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, error); + + if (wpath == NULL) + return NULL; + + dir = g_new (GDir, 1); + + dir->wdirp = _wopendir (wpath); + g_free (wpath); + + if (dir->wdirp) + return dir; + + /* error case */ + errsv = errno; + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errsv), + _("Error opening directory '%s': %s"), + path, g_strerror (errsv)); + + g_free (dir); + + return NULL; +#else + dir = g_new (GDir, 1); + + dir->dirp = opendir (path); + + if (dir->dirp) + return dir; + + /* error case */ + errsv = errno; + + utf8_path = g_filename_to_utf8 (path, -1, + NULL, NULL, NULL); + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (errsv), + _("Error opening directory '%s': %s"), + utf8_path, g_strerror (errsv)); + + g_free (utf8_path); + g_free (dir); + + return NULL; +#endif +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +/* The above function actually is called g_dir_open_utf8, and it's + * that what applications compiled with this GLib version will + * use. + */ + +#undef g_dir_open + +/* Binary compatibility version. Not for newly compiled code. */ + +GDir * +g_dir_open (const gchar *path, + guint flags, + GError **error) +{ + gchar *utf8_path = g_locale_to_utf8 (path, -1, NULL, NULL, error); + GDir *retval; + + if (utf8_path == NULL) + return NULL; + + retval = g_dir_open_utf8 (utf8_path, flags, error); + + g_free (utf8_path); + + return retval; +} +#endif + +/** + * g_dir_read_name: + * @dir: a #GDir* created by g_dir_open() + * + * Retrieves the name of the next entry in the directory. The '.' and + * '..' entries are omitted. On Windows, the returned name is in + * UTF-8. On Unix, it is in the on-disk encoding. + * + * Return value: The entry's name or %NULL if there are no + * more entries. The return value is owned by GLib and + * must not be modified or freed. + **/ +G_CONST_RETURN gchar* +g_dir_read_name (GDir *dir) +{ +#ifdef G_OS_WIN32 + gchar *utf8_name; + struct _wdirent *wentry; +#else + struct dirent *entry; +#endif + + g_return_val_if_fail (dir != NULL, NULL); + +#ifdef G_OS_WIN32 + while (1) + { + wentry = _wreaddir (dir->wdirp); + while (wentry + && (0 == wcscmp (wentry->d_name, L".") || + 0 == wcscmp (wentry->d_name, L".."))) + wentry = _wreaddir (dir->wdirp); + + if (wentry == NULL) + return NULL; + + utf8_name = g_utf16_to_utf8 (wentry->d_name, -1, NULL, NULL, NULL); + + if (utf8_name == NULL) + continue; /* Huh, impossible? Skip it anyway */ + + strcpy (dir->utf8_buf, utf8_name); + g_free (utf8_name); + + return dir->utf8_buf; + } +#else + entry = readdir (dir->dirp); + while (entry + && (0 == strcmp (entry->d_name, ".") || + 0 == strcmp (entry->d_name, ".."))) + entry = readdir (dir->dirp); + + if (entry) + return entry->d_name; + else + return NULL; +#endif +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +/* Ditto for g_dir_read_name */ + +#undef g_dir_read_name + +/* Binary compatibility version. Not for newly compiled code. */ + +G_CONST_RETURN gchar* +g_dir_read_name (GDir *dir) +{ + while (1) + { + const gchar *utf8_name = g_dir_read_name_utf8 (dir); + gchar *retval; + + if (utf8_name == NULL) + return NULL; + + retval = g_locale_from_utf8 (utf8_name, -1, NULL, NULL, NULL); + + if (retval != NULL) + { + strcpy (dir->utf8_buf, retval); + g_free (retval); + + return dir->utf8_buf; + } + } +} + +#endif + +/** + * g_dir_rewind: + * @dir: a #GDir* created by g_dir_open() + * + * Resets the given directory. The next call to g_dir_read_name() + * will return the first entry again. + **/ +void +g_dir_rewind (GDir *dir) +{ + g_return_if_fail (dir != NULL); + +#ifdef G_OS_WIN32 + _wrewinddir (dir->wdirp); +#else + rewinddir (dir->dirp); +#endif +} + +/** + * g_dir_close: + * @dir: a #GDir* created by g_dir_open() + * + * Closes the directory and deallocates all related resources. + **/ +void +g_dir_close (GDir *dir) +{ + g_return_if_fail (dir != NULL); + +#ifdef G_OS_WIN32 + _wclosedir (dir->wdirp); +#else + closedir (dir->dirp); +#endif + g_free (dir); +} + +#define __G_DIR_C__ +#include "galiasdef.c" diff --git a/glib/gdir.h b/glib/gdir.h new file mode 100644 index 0000000..85e9896 --- /dev/null +++ b/glib/gdir.h @@ -0,0 +1,52 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gdir.c: Simplified wrapper around the DIRENT functions. + * + * Copyright 2001 Hans Breuer + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_DIR_H__ +#define __G_DIR_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GDir GDir; + +#ifdef G_OS_WIN32 +/* For DLL ABI stability, keep old names for old (non-UTF-8) functionality. */ +#define g_dir_open g_dir_open_utf8 +#define g_dir_read_name g_dir_read_name_utf8 +#endif + +GDir * g_dir_open (const gchar *path, + guint flags, + GError **error); +G_CONST_RETURN gchar *g_dir_read_name (GDir *dir); +void g_dir_rewind (GDir *dir); +void g_dir_close (GDir *dir); + +G_END_DECLS + +#endif /* __G_DIR_H__ */ diff --git a/glib/gen-script-table.pl b/glib/gen-script-table.pl new file mode 100755 index 0000000..27268ab --- /dev/null +++ b/glib/gen-script-table.pl @@ -0,0 +1,119 @@ +#!/usr/bin/perl -w +# +# Script to convert http://www.unicode.org/Public/UNIDATA/Scripts.txt +# into a machine-readable table. +# +###################################################################### + +if (@ARGV != 1) { + die "Usage: gen-script-table.pl Scripts.txt > gscripttable.h\n"; +} + +open IN, $ARGV[0] || die "Cannot open $ARGV[0]: $!\n"; + +my @ranges; +my $file; +my $easy_range; +my $i; +my $start; +my $end; +my $script; + + +while () { + if (/^\#\s+(Scripts-.*.txt)/) { + $file = $1; + } + + s/#.*//; + next if /^\s*$/; + if (!/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*([A-Za-z_]+)\s*$/) { + die "Cannot parse line: '$_'\n"; + } + + if (defined $2) { + push @ranges, [ hex $1, hex $2, uc $3 ]; + } else { + push @ranges, [ hex $1, hex $1, uc $3 ]; + } +} + +@ranges = sort { $a->[0] <=> $b->[0] } @ranges; +$date = gmtime; + +print <<"EOT"; +/* gscripttable.h: Generated by gen-script-table.pl + * + * Date: $date + * Source: $file + * + * Do not edit. + */ + +EOT + +$easy_range = 0x2000; + +print <<"EOT"; +#define G_EASY_SCRIPTS_RANGE $easy_range + +static const guchar g_script_easy_table[$easy_range] = { +EOT + +$i = 0; +$end = -1; + +for (my $c = 0; $c < $easy_range; $c++) { + + if ($c % 3 == 0) { + printf "\n "; + } + + if ($c > $end) { + $start = $ranges[$i]->[0]; + $end = $ranges[$i]->[1]; + $script = $ranges[$i]->[2]; + $i++; + } + + if ($c < $start) { + printf " G_UNICODE_SCRIPT_UNKNOWN,"; + } else { + printf " G_UNICODE_SCRIPT_%s,", $script; + } +} + +if ($end >= $easy_range) { + $i--; + $ranges[$i]->[0] = $easy_range; +} + + +print <<"EOT"; + +}; + +static const struct { + gunichar start; + guint16 chars; + guint16 script; +} g_script_table[] = { +EOT + +for (; $i <= $#ranges; $i++) { + $start = $ranges[$i]->[0]; + $end = $ranges[$i]->[1]; + $script = $ranges[$i]->[2]; + + while ($i <= $#ranges - 1 && + $ranges[$i + 1]->[0] == $end + 1 && + $ranges[$i + 1]->[2] eq $script) { + $i++; + $end = $ranges[$i]->[1]; + } + + printf " { %#06x, %5d, G_UNICODE_SCRIPT_%s },\n", $start, $end - $start + 1, $script; +} + +printf "};\n"; + diff --git a/glib/gen-unicode-tables.pl b/glib/gen-unicode-tables.pl new file mode 100755 index 0000000..5368adf --- /dev/null +++ b/glib/gen-unicode-tables.pl @@ -0,0 +1,1303 @@ +#! /usr/bin/perl -w + +# Copyright (C) 1998, 1999 Tom Tromey +# Copyright (C) 2001 Red Hat Software + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Contributer(s): +# Andrew Taylor + +# gen-unicode-tables.pl - Generate tables for libunicode from Unicode data. +# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html +# I consider the output of this program to be unrestricted. Use it as +# you will. + +# FIXME: +# * For decomp table it might make sense to use a shift count other +# than 8. We could easily compute the perfect shift count. + +# we use some perl unicode features +require 5.006; + +use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION); + + +# Names of fields in Unicode data table. +$CODE = 0; +$NAME = 1; +$CATEGORY = 2; +$COMBINING_CLASSES = 3; +$BIDI_CATEGORY = 4; +$DECOMPOSITION = 5; +$DECIMAL_VALUE = 6; +$DIGIT_VALUE = 7; +$NUMERIC_VALUE = 8; +$MIRRORED = 9; +$OLD_NAME = 10; +$COMMENT = 11; +$UPPER = 12; +$LOWER = 13; +$TITLE = 14; + +# Names of fields in the line break table +$BREAK_CODE = 0; +$BREAK_PROPERTY = 1; + +# Names of fields in the SpecialCasing table +$CASE_CODE = 0; +$CASE_LOWER = 1; +$CASE_TITLE = 2; +$CASE_UPPER = 3; +$CASE_CONDITION = 4; + +# Names of fields in the CaseFolding table +$FOLDING_CODE = 0; +$FOLDING_STATUS = 1; +$FOLDING_MAPPING = 2; + +# Map general category code onto symbolic name. +%mappings = + ( + # Normative. + 'Lu' => "G_UNICODE_UPPERCASE_LETTER", + 'Ll' => "G_UNICODE_LOWERCASE_LETTER", + 'Lt' => "G_UNICODE_TITLECASE_LETTER", + 'Mn' => "G_UNICODE_NON_SPACING_MARK", + 'Mc' => "G_UNICODE_COMBINING_MARK", + 'Me' => "G_UNICODE_ENCLOSING_MARK", + 'Nd' => "G_UNICODE_DECIMAL_NUMBER", + 'Nl' => "G_UNICODE_LETTER_NUMBER", + 'No' => "G_UNICODE_OTHER_NUMBER", + 'Zs' => "G_UNICODE_SPACE_SEPARATOR", + 'Zl' => "G_UNICODE_LINE_SEPARATOR", + 'Zp' => "G_UNICODE_PARAGRAPH_SEPARATOR", + 'Cc' => "G_UNICODE_CONTROL", + 'Cf' => "G_UNICODE_FORMAT", + 'Cs' => "G_UNICODE_SURROGATE", + 'Co' => "G_UNICODE_PRIVATE_USE", + 'Cn' => "G_UNICODE_UNASSIGNED", + + # Informative. + 'Lm' => "G_UNICODE_MODIFIER_LETTER", + 'Lo' => "G_UNICODE_OTHER_LETTER", + 'Pc' => "G_UNICODE_CONNECT_PUNCTUATION", + 'Pd' => "G_UNICODE_DASH_PUNCTUATION", + 'Ps' => "G_UNICODE_OPEN_PUNCTUATION", + 'Pe' => "G_UNICODE_CLOSE_PUNCTUATION", + 'Pi' => "G_UNICODE_INITIAL_PUNCTUATION", + 'Pf' => "G_UNICODE_FINAL_PUNCTUATION", + 'Po' => "G_UNICODE_OTHER_PUNCTUATION", + 'Sm' => "G_UNICODE_MATH_SYMBOL", + 'Sc' => "G_UNICODE_CURRENCY_SYMBOL", + 'Sk' => "G_UNICODE_MODIFIER_SYMBOL", + 'So' => "G_UNICODE_OTHER_SYMBOL" + ); + +%break_mappings = + ( + 'BK' => "G_UNICODE_BREAK_MANDATORY", + 'CR' => "G_UNICODE_BREAK_CARRIAGE_RETURN", + 'LF' => "G_UNICODE_BREAK_LINE_FEED", + 'CM' => "G_UNICODE_BREAK_COMBINING_MARK", + 'SG' => "G_UNICODE_BREAK_SURROGATE", + 'ZW' => "G_UNICODE_BREAK_ZERO_WIDTH_SPACE", + 'IN' => "G_UNICODE_BREAK_INSEPARABLE", + 'GL' => "G_UNICODE_BREAK_NON_BREAKING_GLUE", + 'CB' => "G_UNICODE_BREAK_CONTINGENT", + 'SP' => "G_UNICODE_BREAK_SPACE", + 'BA' => "G_UNICODE_BREAK_AFTER", + 'BB' => "G_UNICODE_BREAK_BEFORE", + 'B2' => "G_UNICODE_BREAK_BEFORE_AND_AFTER", + 'HY' => "G_UNICODE_BREAK_HYPHEN", + 'NS' => "G_UNICODE_BREAK_NON_STARTER", + 'OP' => "G_UNICODE_BREAK_OPEN_PUNCTUATION", + 'CL' => "G_UNICODE_BREAK_CLOSE_PUNCTUATION", + 'QU' => "G_UNICODE_BREAK_QUOTATION", + 'EX' => "G_UNICODE_BREAK_EXCLAMATION", + 'ID' => "G_UNICODE_BREAK_IDEOGRAPHIC", + 'NU' => "G_UNICODE_BREAK_NUMERIC", + 'IS' => "G_UNICODE_BREAK_INFIX_SEPARATOR", + 'SY' => "G_UNICODE_BREAK_SYMBOL", + 'AL' => "G_UNICODE_BREAK_ALPHABETIC", + 'PR' => "G_UNICODE_BREAK_PREFIX", + 'PO' => "G_UNICODE_BREAK_POSTFIX", + 'SA' => "G_UNICODE_BREAK_COMPLEX_CONTEXT", + 'AI' => "G_UNICODE_BREAK_AMBIGUOUS", + 'NL' => "G_UNICODE_BREAK_NEXT_LINE", + 'WJ' => "G_UNICODE_BREAK_WORD_JOINER", + 'XX' => "G_UNICODE_BREAK_UNKNOWN", + 'JL' => "G_UNICODE_BREAK_HANGUL_L_JAMO", + 'JV' => "G_UNICODE_BREAK_HANGUL_V_JAMO", + 'JT' => "G_UNICODE_BREAK_HANGUL_T_JAMO", + 'H2' => "G_UNICODE_BREAK_HANGUL_LV_SYLLABLE", + 'H3' => "G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE" + ); + +# Title case mappings. +%title_to_lower = (); +%title_to_upper = (); + +# Maximum length of special-case strings + +my @special_cases; +my @special_case_offsets; +my $special_case_offset = 0; + +$do_decomp = 0; +$do_props = 1; +if (@ARGV && $ARGV[0] eq '-decomp') +{ + $do_decomp = 1; + $do_props = 0; + shift @ARGV; +} +elsif (@ARGV && $ARGV[0] eq '-both') +{ + $do_decomp = 1; + shift @ARGV; +} + +if (@ARGV != 2) { + $0 =~ s@.*/@@; + die "\nUsage: $0 [-decomp | -both] UNICODE-VERSION DIRECTORY\n\n DIRECTORY should contain the following Unicode data files:\n UnicodeData.txt, LineBreak.txt, SpecialCasing.txt, CaseFolding.txt,\n CompositionExclusions.txt, BidiMirroring.txt\n\n"; +} + +my ($unicodedatatxt, $linebreaktxt, $specialcasingtxt, $casefoldingtxt, $compositionexclusionstxt); + +my $d = $ARGV[1]; +opendir (my $dir, $d) or die "Cannot open Unicode data dir $d: $!\n"; +for my $f (readdir ($dir)) +{ + $unicodedatatxt = "$d/$f" if ($f =~ /UnicodeData.*\.txt/); + $linebreaktxt = "$d/$f" if ($f =~ /LineBreak.*\.txt/); + $specialcasingtxt = "$d/$f" if ($f =~ /SpecialCasing.*\.txt/); + $casefoldingtxt = "$d/$f" if ($f =~ /CaseFolding.*\.txt/); + $compositionexclusionstxt = "$d/$f" if ($f =~ /CompositionExclusions.*\.txt/); +} + +defined $unicodedatatxt or die "Did not find UnicodeData file"; +defined $linebreaktxt or die "Did not find LineBreak file"; +defined $specialcasingtxt or die "Did not find SpecialCasing file"; +defined $casefoldingtxt or die "Did not find CaseFolding file"; +defined $compositionexclusionstxt or die "Did not find CompositionExclusions file"; + +print "Creating decomp table\n" if ($do_decomp); +print "Creating property table\n" if ($do_props); + +print "Composition exlusions from $compositionexclusionstxt\n"; + +open (INPUT, "< $compositionexclusionstxt") || exit 1; + +while () { + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + s/^\s*//; + s/\s*$//; + + $composition_exclusions{hex($_)} = 1; +} + +close INPUT; + +print "Unicode data from $unicodedatatxt\n"; + +open (INPUT, "< $unicodedatatxt") || exit 1; + +# we save memory by skipping the huge empty area before U+E0000 +my $pages_before_e0000; + +$last_code = -1; +while () +{ + chop; + @fields = split (';', $_, 30); + if ($#fields != 14) + { + printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); + } + + $code = hex ($fields[$CODE]); + + if ($code >= 0xE0000 and $last_code < 0xE0000) + { + $pages_before_e0000 = ($last_code >> 8) + 1; + } + + if ($code > $last_code + 1) + { + # Found a gap. + if ($fields[$NAME] =~ /Last>/) + { + # Fill the gap with the last character read, + # since this was a range specified in the char database + @gfields = @fields; + } + else + { + # The gap represents undefined characters. Only the type + # matters. + @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', + '', '', '', ''); + } + for (++$last_code; $last_code < $code; ++$last_code) + { + $gfields{$CODE} = sprintf ("%04x", $last_code); + &process_one ($last_code, @gfields); + } + } + &process_one ($code, @fields); + $last_code = $code; +} + +close INPUT; + +@gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', + '', '', '', ''); +for (++$last_code; $last_code <= 0x10FFFF; ++$last_code) +{ + $gfields{$CODE} = sprintf ("%04x", $last_code); + &process_one ($last_code, @gfields); +} +--$last_code; # Want last to be 0x10FFFF. + +print "Creating line break table\n"; + +print "Line break data from $linebreaktxt\n"; + +open (INPUT, "< $linebreaktxt") || exit 1; + +$last_code = -1; +while () +{ + my ($start_code, $end_code); + + chop; + + next if /^#/; + + s/\s*#.*//; + + @fields = split (';', $_, 30); + if ($#fields != 1) + { + printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); + next; + } + + if ($fields[$CODE] =~ /([A-F0-9]{4,6})\.\.([A-F0-9]{4,6})/) + { + $start_code = hex ($1); + $end_code = hex ($2); + } else { + $start_code = $end_code = hex ($fields[$CODE]); + + } + + if ($start_code > $last_code + 1) + { + # The gap represents undefined characters. If assigned, + # they are AL, if not assigned, XX + for (++$last_code; $last_code < $start_code; ++$last_code) + { + if ($type[$last_code] eq 'Cn') + { + $break_props[$last_code] = 'XX'; + } + else + { + $break_props[$last_code] = 'AL'; + } + } + } + + for ($last_code = $start_code; $last_code <= $end_code; $last_code++) + { + $break_props[$last_code] = $fields[$BREAK_PROPERTY]; + } + + $last_code = $end_code; +} + +close INPUT; + +for (++$last_code; $last_code <= 0x10FFFF; ++$last_code) +{ + if ($type[$last_code] eq 'Cn') + { + $break_props[$last_code] = 'XX'; + } + else + { + $break_props[$last_code] = 'AL'; + } +} +--$last_code; # Want last to be 0x10FFFF. + +print STDERR "Last code is not 0x10FFFF" if ($last_code != 0x10FFFF); + +print "Reading special-casing table for case conversion\n"; + +open (INPUT, "< $specialcasingtxt") || exit 1; + +while () +{ + my $code; + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + @fields = split ('\s*;\s*', $_, 30); + + $raw_code = $fields[$CASE_CODE]; + $code = hex ($raw_code); + + if ($#fields != 4 && $#fields != 5) + { + printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); + next; + } + + if (!defined $type[$code]) + { + printf STDERR "Special case for code point: $code, which has no defined type\n"; + next; + } + + if (defined $fields[5]) { + # Ignore conditional special cases - we'll handle them in code + next; + } + + if ($type[$code] eq 'Lu') + { + (hex $fields[$CASE_UPPER] == $code) || die "$raw_code is Lu and UCD_Upper($raw_code) != $raw_code"; + + &add_special_case ($code, $value[$code], $fields[$CASE_LOWER], $fields[$CASE_TITLE]); + + } elsif ($type[$code] eq 'Lt') + { + (hex $fields[$CASE_TITLE] == $code) || die "$raw_code is Lt and UCD_Title($raw_code) != $raw_code"; + + &add_special_case ($code, undef, $fields[$CASE_LOWER], $fields[$CASE_UPPER]); + } elsif ($type[$code] eq 'Ll') + { + (hex $fields[$CASE_LOWER] == $code) || die "$raw_code is Ll and UCD_Lower($raw_code) != $raw_code"; + + &add_special_case ($code, $value[$code], $fields[$CASE_UPPER], $fields[$CASE_TITLE]); + } else { + printf STDERR "Special case for non-alphabetic code point: $raw_code\n"; + next; + } +} + +close INPUT; + +open (INPUT, "< $casefoldingtxt") || exit 1; + +my $casefoldlen = 0; +my @casefold; + +while () +{ + my $code; + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + @fields = split ('\s*;\s*', $_, 30); + + $raw_code = $fields[$FOLDING_CODE]; + $code = hex ($raw_code); + + if ($#fields != 3) + { + printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); + next; + } + + # we don't use Simple or Turkic rules here + next if ($fields[$FOLDING_STATUS] =~ /^[ST]$/); + + @values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING]; + + # Check simple case + + if (@values == 1 && + !(defined $value[$code] && $value[$code] >= 0x1000000) && + defined $type[$code]) { + + my $lower; + if ($type[$code] eq 'Ll') + { + $lower = $code; + } elsif ($type[$code] eq 'Lt') + { + $lower = $title_to_lower{$code}; + } elsif ($type[$code] eq 'Lu') + { + $lower = $value[$code]; + } else { + $lower = $code; + } + + if ($lower == $values[0]) { + next; + } + } + + my $string = pack ("U*", @values); + + if (1 + &length_in_bytes ($string) > $casefoldlen) { + $casefoldlen = 1 + &length_in_bytes ($string); + } + + push @casefold, [ $code, &escape ($string) ]; +} + +close INPUT; + +if ($do_props) { + &print_tables ($last_code) +} +if ($do_decomp) { + &print_decomp ($last_code); + &output_composition_table; +} + +&print_line_break ($last_code); + +exit 0; + + +# perl "length" returns the length in characters +sub length_in_bytes +{ + my ($string) = @_; + + use bytes; + return length $string; +} + +# Process a single character. +sub process_one +{ + my ($code, @fields) = @_; + + $type[$code] = $fields[$CATEGORY]; + if ($type[$code] eq 'Nd') + { + $value[$code] = int ($fields[$DECIMAL_VALUE]); + } + elsif ($type[$code] eq 'Ll') + { + $value[$code] = hex ($fields[$UPPER]); + } + elsif ($type[$code] eq 'Lu') + { + $value[$code] = hex ($fields[$LOWER]); + } + + if ($type[$code] eq 'Lt') + { + $title_to_lower{$code} = hex ($fields[$LOWER]); + $title_to_upper{$code} = hex ($fields[$UPPER]); + } + + $cclass[$code] = $fields[$COMBINING_CLASSES]; + + # Handle decompositions. + if ($fields[$DECOMPOSITION] ne '') + { + if ($fields[$DECOMPOSITION] =~ s/\<.*\>\s*//) { + $decompose_compat[$code] = 1; + } else { + $decompose_compat[$code] = 0; + + if (!exists $composition_exclusions{$code}) { + $compositions{$code} = $fields[$DECOMPOSITION]; + } + } + $decompositions[$code] = $fields[$DECOMPOSITION]; + } +} + +sub print_tables +{ + my ($last) = @_; + my ($outfile) = "gunichartables.h"; + + local ($bytes_out) = 0; + + print "Writing $outfile...\n"; + + open (OUT, "> $outfile"); + + print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; + print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; + + print OUT "#ifndef CHARTABLES_H\n"; + print OUT "#define CHARTABLES_H\n\n"; + + print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; + + printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; + + printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 10000\n\n"; + + my $last_part1 = ($pages_before_e0000 * 256) - 1; + printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1; + printf OUT "#define G_UNICODE_LAST_PAGE_PART1 %d\n\n", $pages_before_e0000 - 1; + + $table_index = 0; + printf OUT "static const char type_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 1, \&fetch_type); + } + printf OUT "\n};\n\n"; + + printf OUT "/* U+0000 through U+%04X */\n", $last_part1; + print OUT "static const gint16 type_table_part1[$pages_before_e0000] = {\n"; + for ($count = 0; $count <= $last_part1; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + printf OUT "/* U+E0000 through U+%04X */\n", $last; + print OUT "static const gint16 type_table_part2[768] = {\n"; + for ($count = 0xE0000; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0xE0000; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + + # + # Now print attribute table. + # + + $table_index = 0; + printf OUT "static const gunichar attr_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 4, \&fetch_attr); + } + printf OUT "\n};\n\n"; + + printf OUT "/* U+0000 through U+%04X */\n", $last_part1; + print OUT "static const gint16 attr_table_part1[$pages_before_e0000] = {\n"; + for ($count = 0; $count <= $last_part1; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + printf OUT "/* U+E0000 through U+%04X */\n", $last; + print OUT "static const gint16 attr_table_part2[768] = {\n"; + for ($count = 0xE0000; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0xE0000; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + # + # print title case table + # + + print OUT "static const gunichar title_table[][3] = {\n"; + my ($item); + my ($first) = 1; + foreach $item (sort keys %title_to_lower) + { + print OUT ",\n" + unless $first; + $first = 0; + printf OUT " { 0x%04x, 0x%04x, 0x%04x }", $item, $title_to_upper{$item}, $title_to_lower{$item}; + $bytes_out += 12; + } + print OUT "\n};\n\n"; + + # + # And special case conversion table -- conversions that change length + # + &output_special_case_table (\*OUT); + &output_casefold_table (\*OUT); + + print OUT "#endif /* CHARTABLES_H */\n"; + + close (OUT); + + printf STDERR "Generated %d bytes in tables\n", $bytes_out; +} + +# A fetch function for the type table. +sub fetch_type +{ + my ($index) = @_; + return $mappings{$type[$index]}; +} + +# A fetch function for the attribute table. +sub fetch_attr +{ + my ($index) = @_; + if (defined $value[$index]) + { + return sprintf ("0x%04x", $value[$index]); + } + else + { + return "0x0000"; + } +} + +sub print_row +{ + my ($start, $typsize, $fetcher) = @_; + + my ($i); + my (@values); + my ($flag) = 1; + my ($off); + + for ($off = 0; $off < 256; ++$off) + { + $values[$off] = $fetcher->($off + $start); + if ($values[$off] ne $values[0]) + { + $flag = 0; + } + } + if ($flag) + { + return $values[0] . " + G_UNICODE_MAX_TABLE_INDEX"; + } + + printf OUT ",\n" if ($table_index != 0); + printf OUT " { /* page %d, index %d */\n ", $start / 256, $table_index; + my ($column) = 4; + for ($i = $start; $i < $start + 256; ++$i) + { + print OUT ", " + if $i > $start; + my ($text) = $values[$i - $start]; + if (length ($text) + $column + 2 > 78) + { + print OUT "\n "; + $column = 4; + } + print OUT $text; + $column += length ($text) + 2; + } + print OUT "\n }"; + + $bytes_out += 256 * $typsize; + + return sprintf "%d /* page %d */", $table_index++, $start / 256; +} + +sub escape +{ + my ($string) = @_; + + my $escaped = unpack("H*", $string); + $escaped =~ s/(.{2})/\\x$1/g; + + return $escaped; +} + +# Returns the offset of $decomp in the offset string. Updates the +# referenced variables as appropriate. +sub handle_decomp ($$$$) +{ + my ($decomp, $decomp_offsets_ref, $decomp_string_ref, $decomp_string_offset_ref) = @_; + my $offset = "G_UNICODE_NOT_PRESENT_OFFSET"; + + if (defined $decomp) + { + if (defined $decomp_offsets_ref->{$decomp}) + { + $offset = $decomp_offsets_ref->{$decomp}; + } + else + { + $offset = ${$decomp_string_offset_ref}; + $decomp_offsets_ref->{$decomp} = $offset; + ${$decomp_string_ref} .= "\n \"" . &escape ($decomp) . "\\0\" /* offset ${$decomp_string_offset_ref} */"; + ${$decomp_string_offset_ref} += &length_in_bytes ($decomp) + 1; + } + } + + return $offset; +} + +# Generate the character decomposition header. +sub print_decomp +{ + my ($last) = @_; + my ($outfile) = "gunidecomp.h"; + + local ($bytes_out) = 0; + + print "Writing $outfile...\n"; + + open (OUT, "> $outfile") || exit 1; + + print OUT "/* This file is automatically generated. DO NOT EDIT! */\n\n"; + print OUT "#ifndef DECOMP_H\n"; + print OUT "#define DECOMP_H\n\n"; + + printf OUT "#define G_UNICODE_LAST_CHAR 0x%04x\n\n", $last; + + printf OUT "#define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256)\n\n"; + + my $last_part1 = ($pages_before_e0000 * 256) - 1; + printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1; + printf OUT "#define G_UNICODE_LAST_PAGE_PART1 %d\n\n", $pages_before_e0000 - 1; + + $NOT_PRESENT_OFFSET = 65535; + print OUT "#define G_UNICODE_NOT_PRESENT_OFFSET $NOT_PRESENT_OFFSET\n\n"; + + my ($count, @row); + $table_index = 0; + printf OUT "static const guchar cclass_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 1, \&fetch_cclass); + } + printf OUT "\n};\n\n"; + + print OUT "static const gint16 combining_class_table_part1[$pages_before_e0000] = {\n"; + for ($count = 0; $count <= $last_part1; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + print OUT "static const gint16 combining_class_table_part2[768] = {\n"; + for ($count = 0xE0000; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0xE0000; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + print OUT "typedef struct\n{\n"; + print OUT " gunichar ch;\n"; + print OUT " guint16 canon_offset;\n"; + print OUT " guint16 compat_offset;\n"; + print OUT "} decomposition;\n\n"; + + print OUT "static const decomposition decomp_table[] =\n{\n"; + my ($iter); + my ($first) = 1; + my ($decomp_string) = ""; + my ($decomp_string_offset) = 0; + for ($count = 0; $count <= $last; ++$count) + { + if (defined $decompositions[$count]) + { + print OUT ",\n" + if ! $first; + $first = 0; + + my $canon_decomp; + my $compat_decomp; + + if (!$decompose_compat[$count]) { + $canon_decomp = make_decomp ($count, 0); + } + $compat_decomp = make_decomp ($count, 1); + + if (defined $canon_decomp && $compat_decomp eq $canon_decomp) { + undef $compat_decomp; + } + + my $canon_offset = handle_decomp ($canon_decomp, \%decomp_offsets, \$decomp_string, \$decomp_string_offset); + my $compat_offset = handle_decomp ($compat_decomp, \%decomp_offsets, \$decomp_string, \$decomp_string_offset); + + die if $decomp_string_offset > $NOT_PRESENT_OFFSET; + + printf OUT qq( { 0x%04x, $canon_offset, $compat_offset }), $count; + $bytes_out += 8; + } + } + print OUT "\n};\n\n"; + $bytes_out += $decomp_string_offset + 1; + + printf OUT "static const gchar decomp_expansion_string[] = %s;\n\n", $decomp_string; + + print OUT "#endif /* DECOMP_H */\n"; + + printf STDERR "Generated %d bytes in decomp tables\n", $bytes_out; +} + +sub print_line_break +{ + my ($last) = @_; + my ($outfile) = "gunibreak.h"; + + local ($bytes_out) = 0; + + print "Writing $outfile...\n"; + + open (OUT, "> $outfile"); + + print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; + print OUT " Instead, edit gen-unicode-tables.pl and re-run. */\n\n"; + + print OUT "#ifndef BREAKTABLES_H\n"; + print OUT "#define BREAKTABLES_H\n\n"; + + print OUT "#define G_UNICODE_DATA_VERSION \"$ARGV[0]\"\n\n"; + + printf OUT "#define G_UNICODE_LAST_CHAR 0x%04X\n\n", $last; + + printf OUT "#define G_UNICODE_MAX_TABLE_INDEX 10000\n\n"; + + my $last_part1 = ($pages_before_e0000 * 256) - 1; + printf OUT "/* the last code point that should be looked up in break_property_table_part1 */\n"; + printf OUT "#define G_UNICODE_LAST_CHAR_PART1 0x%04X\n\n", $last_part1; + + $table_index = 0; + printf OUT "static const gint8 break_property_data[][256] = {\n"; + for ($count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 1, \&fetch_break_type); + } + printf OUT "\n};\n\n"; + + printf OUT "/* U+0000 through U+%04X */\n", $last_part1; + print OUT "static const gint16 break_property_table_part1[$pages_before_e0000] = {\n"; + for ($count = 0; $count <= $last_part1; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + printf OUT "/* U+E0000 through U+%04X */\n", $last; + print OUT "static const gint16 break_property_table_part2[768] = {\n"; + for ($count = 0xE0000; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0xE0000; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + + print OUT "#endif /* BREAKTABLES_H */\n"; + + close (OUT); + + printf STDERR "Generated %d bytes in break tables\n", $bytes_out; +} + + +# A fetch function for the break properties table. +sub fetch_break_type +{ + my ($index) = @_; + return $break_mappings{$break_props[$index]}; +} + +# Fetcher for combining class. +sub fetch_cclass +{ + my ($i) = @_; + return $cclass[$i]; +} + +# Expand a character decomposition recursively. +sub expand_decomp +{ + my ($code, $compat) = @_; + + my ($iter, $val); + my (@result) = (); + foreach $iter (split (' ', $decompositions[$code])) + { + $val = hex ($iter); + if (defined $decompositions[$val] && + ($compat || !$decompose_compat[$val])) + { + push (@result, &expand_decomp ($val, $compat)); + } + else + { + push (@result, $val); + } + } + + return @result; +} + +sub make_decomp +{ + my ($code, $compat) = @_; + + my $result = ""; + foreach $iter (&expand_decomp ($code, $compat)) + { + $result .= pack ("U", $iter); # to utf-8 + } + + $result; +} +# Generate special case data string from two fields +sub add_special_case +{ + my ($code, $single, $field1, $field2) = @_; + + @values = (defined $single ? $single : (), + (map { hex ($_) } split /\s+/, $field1), + 0, + (map { hex ($_) } split /\s+/, $field2)); + $result = ""; + + + for $value (@values) { + $result .= pack ("U", $value); # to utf-8 + } + + push @special_case_offsets, $special_case_offset; + + # We encode special cases up in the 0x1000000 space + $value[$code] = 0x1000000 + $special_case_offset; + + $special_case_offset += 1 + &length_in_bytes ($result); + + push @special_cases, &escape ($result); +} + +sub output_special_case_table +{ + my $out = shift; + + print $out < $b } keys %$array) { + if ($array->{$code} == 1) { + delete $array->{$code}; + next; + } + $array->{$code} = $n++; + } + + return $n; +} + +sub output_composition_table +{ + print STDERR "Generating composition table\n"; + + local ($bytes_out) = 0; + + my %first; + my %second; + + # First we need to go through and remove decompositions + # starting with a non-starter, and single-character + # decompositions. At the same time, record + # the first and second character of each decomposition + + for $code (keys %compositions) + { + @values = map { hex ($_) } split /\s+/, $compositions{$code}; + + # non-starters + if ($cclass[$values[0]]) { + delete $compositions{$code}; + next; + } + + # single-character decompositions + if (@values == 1) { + delete $compositions{$code}; + next; + } + + if (@values != 2) { + die "$code has more than two elements in its decomposition!\n"; + } + + if (exists $first{$values[0]}) { + $first{$values[0]}++; + } else { + $first{$values[0]} = 1; + } + } + + # Assign integer indices, removing singletons + my $n_first = enumerate_ordered (\%first); + + # Now record the second character of each (non-singleton) decomposition + for $code (keys %compositions) { + @values = map { hex ($_) } split /\s+/, $compositions{$code}; + + if (exists $first{$values[0]}) { + if (exists $second{$values[1]}) { + $second{$values[1]}++; + } else { + $second{$values[1]} = 1; + } + } + } + + # Assign integer indices, removing duplicate + my $n_second = enumerate_ordered (\%second); + + # Build reverse table + + my @first_singletons; + my @second_singletons; + my %reverse; + for $code (keys %compositions) { + @values = map { hex ($_) } split /\s+/, $compositions{$code}; + + my $first = $first{$values[0]}; + my $second = $second{$values[1]}; + + if (defined $first && defined $second) { + $reverse{"$first|$second"} = $code; + } elsif (!defined $first) { + push @first_singletons, [ $values[0], $values[1], $code ]; + } else { + push @second_singletons, [ $values[1], $values[0], $code ]; + } + } + + @first_singletons = sort { $a->[0] <=> $b->[0] } @first_singletons; + @second_singletons = sort { $a->[0] <=> $b->[0] } @second_singletons; + + my %vals; + + open OUT, ">gunicomp.h" or die "Cannot open gunicomp.h: $!\n"; + + # Assign values in lookup table for all code points involved + + my $total = 1; + my $last = 0; + printf OUT "#define COMPOSE_FIRST_START %d\n", $total; + for $code (keys %first) { + $vals{$code} = $first{$code} + $total; + $last = $code if $code > $last; + } + $total += $n_first; + $i = 0; + printf OUT "#define COMPOSE_FIRST_SINGLE_START %d\n", $total; + for $record (@first_singletons) { + my $code = $record->[0]; + $vals{$code} = $i++ + $total; + $last = $code if $code > $last; + } + $total += @first_singletons; + printf OUT "#define COMPOSE_SECOND_START %d\n", $total; + for $code (keys %second) { + $vals{$code} = $second{$code} + $total; + $last = $code if $code > $last; + } + $total += $n_second; + $i = 0; + printf OUT "#define COMPOSE_SECOND_SINGLE_START %d\n\n", $total; + for $record (@second_singletons) { + my $code = $record->[0]; + $vals{$code} = $i++ + $total; + $last = $code if $code > $last; + } + + printf OUT "#define COMPOSE_TABLE_LAST %d\n\n", $last / 256; + + # Output lookup table + + my @row; + $table_index = 0; + printf OUT "static const guint16 compose_data[][256] = {\n"; + for (my $count = 0; $count <= $last; $count += 256) + { + $row[$count / 256] = &print_row ($count, 2, sub { exists $vals{$_[0]} ? $vals{$_[0]} : 0; }); + } + printf OUT "\n};\n\n"; + + print OUT "static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = {\n"; + for (my $count = 0; $count <= $last; $count += 256) + { + print OUT ",\n" if $count > 0; + print OUT " ", $row[$count / 256]; + $bytes_out += 2; + } + print OUT "\n};\n\n"; + + # Output first singletons + + print OUT "static const guint16 compose_first_single[][2] = {\n"; + $i = 0; + for $record (@first_singletons) { + if ($record->[1] > 0xFFFF or $record->[2] > 0xFFFF) { + die "time to switch compose_first_single to gunichar" ; + } + print OUT ",\n" if $i++ > 0; + printf OUT " { %#06x, %#06x }", $record->[1], $record->[2]; + } + print OUT "\n};\n"; + + $bytes_out += @first_singletons * 4; + + # Output second singletons + + print OUT "static const guint16 compose_second_single[][2] = {\n"; + $i = 0; + for $record (@second_singletons) { + if ($record->[1] > 0xFFFF or $record->[2] > 0xFFFF) { + die "time to switch compose_second_single to gunichar"; + } + print OUT ",\n" if $i++ > 0; + printf OUT " { %#06x, %#06x }", $record->[1], $record->[2]; + } + print OUT "\n};\n"; + + $bytes_out += @second_singletons * 4; + + # Output array of composition pairs + + print OUT < 0xFFFF) { + die "time to switch compose_array to gunichar" ; + } + printf OUT "0x%04x", $reverse{"$i|$j"}; + } else { + print OUT " 0"; + } + } + print OUT " }"; + } + print OUT "\n"; + + print OUT <[0] <=> $b->[0] } @casefold; + + for $case (@casefold) + { + $code = $case->[0]; + $string = $case->[1]; + + if ($code > 0xFFFF) { + die "time to switch casefold_table to gunichar" ; + } + + print $out sprintf(qq( { 0x%04x, "$string" },\n), $code); + + } + + print $out <domain = domain; + error->code = code; + error->message = g_strdup_vprintf (format, args); + + return error; +} + +/** + * g_error_new: + * @domain: error domain + * @code: error code + * @format: printf()-style format for error message + * @Varargs: parameters for message format + * + * Creates a new #GError with the given @domain and @code, + * and a message formatted with @format. + * + * Return value: a new #GError + */ +GError* +g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) +{ + GError* error; + va_list args; + + g_return_val_if_fail (format != NULL, NULL); + g_return_val_if_fail (domain != 0, NULL); + + va_start (args, format); + error = g_error_new_valist (domain, code, format, args); + va_end (args); + + return error; +} + +/** + * g_error_new_literal: + * @domain: error domain + * @code: error code + * @message: error message + * + * Creates a new #GError; unlike g_error_new(), @message is + * not a printf()-style format string. Use this function if + * @message contains text you don't have control over, + * that could include printf() escape sequences. + * + * Return value: a new #GError + **/ +GError* +g_error_new_literal (GQuark domain, + gint code, + const gchar *message) +{ + GError* err; + + g_return_val_if_fail (message != NULL, NULL); + g_return_val_if_fail (domain != 0, NULL); + + err = g_slice_new (GError); + + err->domain = domain; + err->code = code; + err->message = g_strdup (message); + + return err; +} + +/** + * g_error_free: + * @error: a #GError + * + * Frees a #GError and associated resources. + */ +void +g_error_free (GError *error) +{ + g_return_if_fail (error != NULL); + + g_free (error->message); + + g_slice_free (GError, error); +} + +/** + * g_error_copy: + * @error: a #GError + * + * Makes a copy of @error. + * + * Return value: a new #GError + */ +GError* +g_error_copy (const GError *error) +{ + GError *copy; + + g_return_val_if_fail (error != NULL, NULL); + + copy = g_slice_new (GError); + + *copy = *error; + + copy->message = g_strdup (error->message); + + return copy; +} + +/** + * g_error_matches: + * @error: a #GError or %NULL + * @domain: an error domain + * @code: an error code + * + * Returns %TRUE if @error matches @domain and @code, %FALSE + * otherwise. In particular, when @error is %NULL, %FALSE will + * be returned. + * + * Return value: whether @error has @domain and @code + */ +gboolean +g_error_matches (const GError *error, + GQuark domain, + gint code) +{ + return error && + error->domain == domain && + error->code == code; +} + +#define ERROR_OVERWRITTEN_WARNING "GError set over the top of a previous GError or uninitialized memory.\n" \ + "This indicates a bug in someone's code. You must ensure an error is NULL before it's set.\n" \ + "The overwriting error message was: %s" + +/** + * g_set_error: + * @err: a return location for a #GError, or %NULL + * @domain: error domain + * @code: error code + * @format: printf()-style format + * @Varargs: args for @format + * + * Does nothing if @err is %NULL; if @err is non-%NULL, then *@err + * must be %NULL. A new #GError is created and assigned to *@err. + */ +void +g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) +{ + GError *new; + + va_list args; + + if (err == NULL) + return; + + va_start (args, format); + new = g_error_new_valist (domain, code, format, args); + va_end (args); + + if (*err == NULL) + *err = new; + else + g_warning (ERROR_OVERWRITTEN_WARNING, new->message); +} + +/** + * g_set_error_literal: + * @err: a return location for a #GError, or %NULL + * @domain: error domain + * @code: error code + * @message: error message + * + * Does nothing if @err is %NULL; if @err is non-%NULL, then *@err + * must be %NULL. A new #GError is created and assigned to *@err. + * Unlike g_set_error(), @message is not a printf()-style format string. + * Use this function if @message contains text you don't have control over, + * that could include printf() escape sequences. + * + * Since: 2.18 + */ +void +g_set_error_literal (GError **err, + GQuark domain, + gint code, + const gchar *message) +{ + GError *new; + + if (err == NULL) + return; + + new = g_error_new_literal (domain, code, message); + if (*err == NULL) + *err = new; + else + g_warning (ERROR_OVERWRITTEN_WARNING, new->message); +} + +/** + * g_propagate_error: + * @dest: error return location + * @src: error to move into the return location + * + * If @dest is %NULL, free @src; otherwise, moves @src into *@dest. + * The error variable @dest points to must be %NULL. + */ +void +g_propagate_error (GError **dest, + GError *src) +{ + g_return_if_fail (src != NULL); + + if (dest == NULL) + { + if (src) + g_error_free (src); + return; + } + else + { + if (*dest != NULL) + g_warning (ERROR_OVERWRITTEN_WARNING, src->message); + else + *dest = src; + } +} + +/** + * g_clear_error: + * @err: a #GError return location + * + * If @err is %NULL, does nothing. If @err is non-%NULL, + * calls g_error_free() on *@err and sets *@err to %NULL. + */ +void +g_clear_error (GError **err) +{ + if (err && *err) + { + g_error_free (*err); + *err = NULL; + } +} + +static void +g_error_add_prefix (gchar **string, + const gchar *format, + va_list ap) +{ + gchar *oldstring; + gchar *prefix; + + prefix = g_strdup_vprintf (format, ap); + oldstring = *string; + *string = g_strconcat (prefix, oldstring, NULL); + g_free (oldstring); + g_free (prefix); +} + +/** + * g_prefix_error: + * @err: a return location for a #GError, or %NULL + * @format: printf()-style format string + * @...: arguments to @format + * + * Formats a string according to @format and + * prefix it to an existing error message. If + * @err is %NULL (ie: no error variable) then do + * nothing. + * + * If *@err is %NULL (ie: an error variable is + * present but there is no error condition) then + * also do nothing. Whether or not it makes + * sense to take advantage of this feature is up + * to you. + * + * Since: 2.16 + */ +void +g_prefix_error (GError **err, + const gchar *format, + ...) +{ + if (err && *err) + { + va_list ap; + + va_start (ap, format); + g_error_add_prefix (&(*err)->message, format, ap); + va_end (ap); + } +} + +/** + * g_propagate_prefixed_error: + * @dest: error return location + * @src: error to move into the return location + * @format: printf()-style format string + * @...: arguments to @format + * + * If @dest is %NULL, free @src; otherwise, + * moves @src into *@dest. *@dest must be %NULL. + * After the move, add a prefix as with + * g_prefix_error(). + * + * Since: 2.16 + **/ +void +g_propagate_prefixed_error (GError **dest, + GError *src, + const gchar *format, + ...) +{ + g_propagate_error (dest, src); + + if (dest && *dest) + { + va_list ap; + + va_start (ap, format); + g_error_add_prefix (&(*dest)->message, format, ap); + va_end (ap); + } +} + +#define __G_ERROR_C__ +#include "galiasdef.c" diff --git a/glib/gerror.h b/glib/gerror.h new file mode 100644 index 0000000..b303487 --- /dev/null +++ b/glib/gerror.h @@ -0,0 +1,98 @@ +/* gerror.h - Error reporting system + * + * Copyright 2000 Red Hat, Inc. + * + * The Gnome 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 of the + * License, or (at your option) any later version. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ERROR_H__ +#define __G_ERROR_H__ + +#include + +#include + +G_BEGIN_DECLS + +typedef struct _GError GError; + +struct _GError +{ + GQuark domain; + gint code; + gchar *message; +}; + +GError* g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (3, 4); + +GError* g_error_new_literal (GQuark domain, + gint code, + const gchar *message); +GError* g_error_new_valist (GQuark domain, + gint code, + const gchar *format, + va_list args); + +void g_error_free (GError *error); +GError* g_error_copy (const GError *error); + +gboolean g_error_matches (const GError *error, + GQuark domain, + gint code); + +/* if (err) *err = g_error_new(domain, code, format, ...), also has + * some sanity checks. + */ +void g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (4, 5); + +void g_set_error_literal (GError **err, + GQuark domain, + gint code, + const gchar *message); + +/* if (dest) *dest = src; also has some sanity checks. + */ +void g_propagate_error (GError **dest, + GError *src); + +/* if (err && *err) { g_error_free(*err); *err = NULL; } */ +void g_clear_error (GError **err); + +/* if (err) prefix the formatted string to the ->message */ +void g_prefix_error (GError **err, + const gchar *format, + ...) G_GNUC_PRINTF (2, 3); + +/* g_propagate_error then g_error_prefix on dest */ +void g_propagate_prefixed_error (GError **dest, + GError *src, + const gchar *format, + ...) G_GNUC_PRINTF (3, 4); + +G_END_DECLS + +#endif /* __G_ERROR_H__ */ diff --git a/glib/gfileutils.c b/glib/gfileutils.c new file mode 100644 index 0000000..76335fa --- /dev/null +++ b/glib/gfileutils.c @@ -0,0 +1,2020 @@ +/* gfileutils.c - File utility functions + * + * Copyright 2000 Red Hat, Inc. + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "glib.h" + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include +#include +#endif /* G_OS_WIN32 */ + +#ifndef S_ISLNK +#define S_ISLNK(x) 0 +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#include "gstdio.h" +#include "glibintl.h" + +#include "galias.h" + +/** + * g_mkdir_with_parents: + * @pathname: a pathname in the GLib file name encoding + * @mode: permissions to use for newly created directories + * + * Create a directory if it doesn't already exist. Create intermediate + * parent directories as needed, too. + * + * Returns: 0 if the directory already exists, or was successfully + * created. Returns -1 if an error occurred, with errno set. + * + * Since: 2.8 + */ +int +g_mkdir_with_parents (const gchar *pathname, + int mode) +{ + gchar *fn, *p; + + if (pathname == NULL || *pathname == '\0') + { + errno = EINVAL; + return -1; + } + + fn = g_strdup (pathname); + + if (g_path_is_absolute (fn)) + p = (gchar *) g_path_skip_root (fn); + else + p = fn; + + do + { + while (*p && !G_IS_DIR_SEPARATOR (*p)) + p++; + + if (!*p) + p = NULL; + else + *p = '\0'; + + if (!g_file_test (fn, G_FILE_TEST_EXISTS)) + { + if (g_mkdir (fn, mode) == -1) + { + int errno_save = errno; + g_free (fn); + errno = errno_save; + return -1; + } + } + else if (!g_file_test (fn, G_FILE_TEST_IS_DIR)) + { + g_free (fn); + errno = ENOTDIR; + return -1; + } + if (p) + { + *p++ = G_DIR_SEPARATOR; + while (*p && G_IS_DIR_SEPARATOR (*p)) + p++; + } + } + while (p); + + g_free (fn); + + return 0; +} + +/** + * g_file_test: + * @filename: a filename to test in the GLib file name encoding + * @test: bitfield of #GFileTest flags + * + * Returns %TRUE if any of the tests in the bitfield @test are + * %TRUE. For example, (G_FILE_TEST_EXISTS | + * G_FILE_TEST_IS_DIR) will return %TRUE if the file exists; + * the check whether it's a directory doesn't matter since the existence + * test is %TRUE. With the current set of available tests, there's no point + * passing in more than one test at a time. + * + * Apart from %G_FILE_TEST_IS_SYMLINK all tests follow symbolic links, + * so for a symbolic link to a regular file g_file_test() will return + * %TRUE for both %G_FILE_TEST_IS_SYMLINK and %G_FILE_TEST_IS_REGULAR. + * + * Note, that for a dangling symbolic link g_file_test() will return + * %TRUE for %G_FILE_TEST_IS_SYMLINK and %FALSE for all other flags. + * + * You should never use g_file_test() to test whether it is safe + * to perform an operation, because there is always the possibility + * of the condition changing before you actually perform the operation. + * For example, you might think you could use %G_FILE_TEST_IS_SYMLINK + * to know whether it is safe to write to a file without being + * tricked into writing into a different location. It doesn't work! + * |[ + * /* DON'T DO THIS */ + * if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK)) + * { + * fd = g_open (filename, O_WRONLY); + * /* write to fd */ + * } + * ]| + * + * Another thing to note is that %G_FILE_TEST_EXISTS and + * %G_FILE_TEST_IS_EXECUTABLE are implemented using the access() + * system call. This usually doesn't matter, but if your program + * is setuid or setgid it means that these tests will give you + * the answer for the real user ID and group ID, rather than the + * effective user ID and group ID. + * + * On Windows, there are no symlinks, so testing for + * %G_FILE_TEST_IS_SYMLINK will always return %FALSE. Testing for + * %G_FILE_TEST_IS_EXECUTABLE will just check that the file exists and + * its name indicates that it is executable, checking for well-known + * extensions and those listed in the %PATHEXT environment variable. + * + * Return value: whether a test was %TRUE + **/ +gboolean +g_file_test (const gchar *filename, + GFileTest test) +{ +#ifdef G_OS_WIN32 +/* stuff missing in std vc6 api */ +# ifndef INVALID_FILE_ATTRIBUTES +# define INVALID_FILE_ATTRIBUTES -1 +# endif +# ifndef FILE_ATTRIBUTE_DEVICE +# define FILE_ATTRIBUTE_DEVICE 64 +# endif + int attributes; + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + + if (wfilename == NULL) + return FALSE; + + attributes = GetFileAttributesW (wfilename); + + g_free (wfilename); + + if (attributes == INVALID_FILE_ATTRIBUTES) + return FALSE; + + if (test & G_FILE_TEST_EXISTS) + return TRUE; + + if (test & G_FILE_TEST_IS_REGULAR) + { + if ((attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_DEVICE)) == 0) + return TRUE; + } + + if (test & G_FILE_TEST_IS_DIR) + { + if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) + return TRUE; + } + + /* "while" so that we can exit this "loop" with a simple "break" */ + while (test & G_FILE_TEST_IS_EXECUTABLE) + { + const gchar *lastdot = strrchr (filename, '.'); + const gchar *pathext = NULL, *p; + int extlen; + + if (lastdot == NULL) + break; + + if (_stricmp (lastdot, ".exe") == 0 || + _stricmp (lastdot, ".cmd") == 0 || + _stricmp (lastdot, ".bat") == 0 || + _stricmp (lastdot, ".com") == 0) + return TRUE; + + /* Check if it is one of the types listed in %PATHEXT% */ + + pathext = g_getenv ("PATHEXT"); + if (pathext == NULL) + break; + + pathext = g_utf8_casefold (pathext, -1); + + lastdot = g_utf8_casefold (lastdot, -1); + extlen = strlen (lastdot); + + p = pathext; + while (TRUE) + { + const gchar *q = strchr (p, ';'); + if (q == NULL) + q = p + strlen (p); + if (extlen == q - p && + memcmp (lastdot, p, extlen) == 0) + { + g_free ((gchar *) pathext); + g_free ((gchar *) lastdot); + return TRUE; + } + if (*q) + p = q + 1; + else + break; + } + + g_free ((gchar *) pathext); + g_free ((gchar *) lastdot); + break; + } + + return FALSE; +#else + if ((test & G_FILE_TEST_EXISTS) && (access (filename, F_OK) == 0)) + return TRUE; + + if ((test & G_FILE_TEST_IS_EXECUTABLE) && (access (filename, X_OK) == 0)) + { + if (getuid () != 0) + return TRUE; + + /* For root, on some POSIX systems, access (filename, X_OK) + * will succeed even if no executable bits are set on the + * file. We fall through to a stat test to avoid that. + */ + } + else + test &= ~G_FILE_TEST_IS_EXECUTABLE; + + if (test & G_FILE_TEST_IS_SYMLINK) + { + struct stat s; + + if ((lstat (filename, &s) == 0) && S_ISLNK (s.st_mode)) + return TRUE; + } + + if (test & (G_FILE_TEST_IS_REGULAR | + G_FILE_TEST_IS_DIR | + G_FILE_TEST_IS_EXECUTABLE)) + { + struct stat s; + + if (stat (filename, &s) == 0) + { + if ((test & G_FILE_TEST_IS_REGULAR) && S_ISREG (s.st_mode)) + return TRUE; + + if ((test & G_FILE_TEST_IS_DIR) && S_ISDIR (s.st_mode)) + return TRUE; + + /* The extra test for root when access (file, X_OK) succeeds. + */ + if ((test & G_FILE_TEST_IS_EXECUTABLE) && + ((s.st_mode & S_IXOTH) || + (s.st_mode & S_IXUSR) || + (s.st_mode & S_IXGRP))) + return TRUE; + } + } + + return FALSE; +#endif +} + +GQuark +g_file_error_quark (void) +{ + return g_quark_from_static_string ("g-file-error-quark"); +} + +/** + * g_file_error_from_errno: + * @err_no: an "errno" value + * + * Gets a #GFileError constant based on the passed-in @errno. + * For example, if you pass in %EEXIST this function returns + * #G_FILE_ERROR_EXIST. Unlike @errno values, you can portably + * assume that all #GFileError values will exist. + * + * Normally a #GFileError value goes into a #GError returned + * from a function that manipulates files. So you would use + * g_file_error_from_errno() when constructing a #GError. + * + * Return value: #GFileError corresponding to the given @errno + **/ +GFileError +g_file_error_from_errno (gint err_no) +{ + switch (err_no) + { +#ifdef EEXIST + case EEXIST: + return G_FILE_ERROR_EXIST; + break; +#endif + +#ifdef EISDIR + case EISDIR: + return G_FILE_ERROR_ISDIR; + break; +#endif + +#ifdef EACCES + case EACCES: + return G_FILE_ERROR_ACCES; + break; +#endif + +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + return G_FILE_ERROR_NAMETOOLONG; + break; +#endif + +#ifdef ENOENT + case ENOENT: + return G_FILE_ERROR_NOENT; + break; +#endif + +#ifdef ENOTDIR + case ENOTDIR: + return G_FILE_ERROR_NOTDIR; + break; +#endif + +#ifdef ENXIO + case ENXIO: + return G_FILE_ERROR_NXIO; + break; +#endif + +#ifdef ENODEV + case ENODEV: + return G_FILE_ERROR_NODEV; + break; +#endif + +#ifdef EROFS + case EROFS: + return G_FILE_ERROR_ROFS; + break; +#endif + +#ifdef ETXTBSY + case ETXTBSY: + return G_FILE_ERROR_TXTBSY; + break; +#endif + +#ifdef EFAULT + case EFAULT: + return G_FILE_ERROR_FAULT; + break; +#endif + +#ifdef ELOOP + case ELOOP: + return G_FILE_ERROR_LOOP; + break; +#endif + +#ifdef ENOSPC + case ENOSPC: + return G_FILE_ERROR_NOSPC; + break; +#endif + +#ifdef ENOMEM + case ENOMEM: + return G_FILE_ERROR_NOMEM; + break; +#endif + +#ifdef EMFILE + case EMFILE: + return G_FILE_ERROR_MFILE; + break; +#endif + +#ifdef ENFILE + case ENFILE: + return G_FILE_ERROR_NFILE; + break; +#endif + +#ifdef EBADF + case EBADF: + return G_FILE_ERROR_BADF; + break; +#endif + +#ifdef EINVAL + case EINVAL: + return G_FILE_ERROR_INVAL; + break; +#endif + +#ifdef EPIPE + case EPIPE: + return G_FILE_ERROR_PIPE; + break; +#endif + +#ifdef EAGAIN + case EAGAIN: + return G_FILE_ERROR_AGAIN; + break; +#endif + +#ifdef EINTR + case EINTR: + return G_FILE_ERROR_INTR; + break; +#endif + +#ifdef EIO + case EIO: + return G_FILE_ERROR_IO; + break; +#endif + +#ifdef EPERM + case EPERM: + return G_FILE_ERROR_PERM; + break; +#endif + +#ifdef ENOSYS + case ENOSYS: + return G_FILE_ERROR_NOSYS; + break; +#endif + + default: + return G_FILE_ERROR_FAILED; + break; + } +} + +static gboolean +get_contents_stdio (const gchar *display_filename, + FILE *f, + gchar **contents, + gsize *length, + GError **error) +{ + gchar buf[4096]; + gsize bytes; + gchar *str = NULL; + gsize total_bytes = 0; + gsize total_allocated = 0; + gchar *tmp; + + g_assert (f != NULL); + + while (!feof (f)) + { + gint save_errno; + + bytes = fread (buf, 1, sizeof (buf), f); + save_errno = errno; + + while ((total_bytes + bytes + 1) > total_allocated) + { + if (str) + total_allocated *= 2; + else + total_allocated = MIN (bytes + 1, sizeof (buf)); + + tmp = g_try_realloc (str, total_allocated); + + if (tmp == NULL) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_NOMEM, + _("Could not allocate %lu bytes to read file \"%s\""), + (gulong) total_allocated, + display_filename); + + goto error; + } + + str = tmp; + } + + if (ferror (f)) + { + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Error reading file '%s': %s"), + display_filename, + g_strerror (save_errno)); + + goto error; + } + + memcpy (str + total_bytes, buf, bytes); + + if (total_bytes + bytes < total_bytes) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + _("File \"%s\" is too large"), + display_filename); + + goto error; + } + + total_bytes += bytes; + } + + fclose (f); + + if (total_allocated == 0) + { + str = g_new (gchar, 1); + total_bytes = 0; + } + + str[total_bytes] = '\0'; + + if (length) + *length = total_bytes; + + *contents = str; + + return TRUE; + + error: + + g_free (str); + fclose (f); + + return FALSE; +} + +#ifndef G_OS_WIN32 + +static gboolean +get_contents_regfile (const gchar *display_filename, + struct stat *stat_buf, + gint fd, + gchar **contents, + gsize *length, + GError **error) +{ + gchar *buf; + gsize bytes_read; + gsize size; + gsize alloc_size; + + size = stat_buf->st_size; + + alloc_size = size + 1; + buf = g_try_malloc (alloc_size); + + if (buf == NULL) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_NOMEM, + _("Could not allocate %lu bytes to read file \"%s\""), + (gulong) alloc_size, + display_filename); + + goto error; + } + + bytes_read = 0; + while (bytes_read < size) + { + gssize rc; + + rc = read (fd, buf + bytes_read, size - bytes_read); + + if (rc < 0) + { + if (errno != EINTR) + { + int save_errno = errno; + + g_free (buf); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to read from file '%s': %s"), + display_filename, + g_strerror (save_errno)); + + goto error; + } + } + else if (rc == 0) + break; + else + bytes_read += rc; + } + + buf[bytes_read] = '\0'; + + if (length) + *length = bytes_read; + + *contents = buf; + + close (fd); + + return TRUE; + + error: + + close (fd); + + return FALSE; +} + +static gboolean +get_contents_posix (const gchar *filename, + gchar **contents, + gsize *length, + GError **error) +{ + struct stat stat_buf; + gint fd; + gchar *display_filename = g_filename_display_name (filename); + + /* O_BINARY useful on Cygwin */ + fd = open (filename, O_RDONLY|O_BINARY); + + if (fd < 0) + { + int save_errno = errno; + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to open file '%s': %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + + return FALSE; + } + + /* I don't think this will ever fail, aside from ENOMEM, but. */ + if (fstat (fd, &stat_buf) < 0) + { + int save_errno = errno; + + close (fd); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to get attributes of file '%s': fstat() failed: %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + + return FALSE; + } + + if (stat_buf.st_size > 0 && S_ISREG (stat_buf.st_mode)) + { + gboolean retval = get_contents_regfile (display_filename, + &stat_buf, + fd, + contents, + length, + error); + g_free (display_filename); + + return retval; + } + else + { + FILE *f; + gboolean retval; + + f = fdopen (fd, "r"); + + if (f == NULL) + { + int save_errno = errno; + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to open file '%s': fdopen() failed: %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + + return FALSE; + } + + retval = get_contents_stdio (display_filename, f, contents, length, error); + g_free (display_filename); + + return retval; + } +} + +#else /* G_OS_WIN32 */ + +static gboolean +get_contents_win32 (const gchar *filename, + gchar **contents, + gsize *length, + GError **error) +{ + FILE *f; + gboolean retval; + gchar *display_filename = g_filename_display_name (filename); + int save_errno; + + f = g_fopen (filename, "rb"); + save_errno = errno; + + if (f == NULL) + { + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to open file '%s': %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + + return FALSE; + } + + retval = get_contents_stdio (display_filename, f, contents, length, error); + g_free (display_filename); + + return retval; +} + +#endif + +/** + * g_file_get_contents: + * @filename: name of a file to read contents from, in the GLib file name encoding + * @contents: location to store an allocated string, use g_free() to free + * the returned string + * @length: location to store length in bytes of the contents, or %NULL + * @error: return location for a #GError, or %NULL + * + * Reads an entire file into allocated memory, with good error + * checking. + * + * If the call was successful, it returns %TRUE and sets @contents to the file + * contents and @length to the length of the file contents in bytes. The string + * stored in @contents will be nul-terminated, so for text files you can pass + * %NULL for the @length argument. If the call was not successful, it returns + * %FALSE and sets @error. The error domain is #G_FILE_ERROR. Possible error + * codes are those in the #GFileError enumeration. In the error case, + * @contents is set to %NULL and @length is set to zero. + * + * Return value: %TRUE on success, %FALSE if an error occurred + **/ +gboolean +g_file_get_contents (const gchar *filename, + gchar **contents, + gsize *length, + GError **error) +{ + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (contents != NULL, FALSE); + + *contents = NULL; + if (length) + *length = 0; + +#ifdef G_OS_WIN32 + return get_contents_win32 (filename, contents, length, error); +#else + return get_contents_posix (filename, contents, length, error); +#endif +} + +static gboolean +rename_file (const char *old_name, + const char *new_name, + GError **err) +{ + errno = 0; + if (g_rename (old_name, new_name) == -1) + { + int save_errno = errno; + gchar *display_old_name = g_filename_display_name (old_name); + gchar *display_new_name = g_filename_display_name (new_name); + + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to rename file '%s' to '%s': g_rename() failed: %s"), + display_old_name, + display_new_name, + g_strerror (save_errno)); + + g_free (display_old_name); + g_free (display_new_name); + + return FALSE; + } + + return TRUE; +} + +static gchar * +write_to_temp_file (const gchar *contents, + gssize length, + const gchar *dest_file, + GError **err) +{ + gchar *tmp_name; + gchar *display_name; + gchar *retval; + FILE *file; + gint fd; + int save_errno; + + retval = NULL; + + tmp_name = g_strdup_printf ("%s.XXXXXX", dest_file); + + errno = 0; + fd = g_mkstemp_full (tmp_name, O_RDWR | O_BINARY, 0666); + save_errno = errno; + + display_name = g_filename_display_name (tmp_name); + + if (fd == -1) + { + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to create file '%s': %s"), + display_name, g_strerror (save_errno)); + + goto out; + } + + errno = 0; + file = fdopen (fd, "wb"); + if (!file) + { + save_errno = errno; + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to open file '%s' for writing: fdopen() failed: %s"), + display_name, + g_strerror (save_errno)); + + close (fd); + g_unlink (tmp_name); + + goto out; + } + + if (length > 0) + { + gsize n_written; + + errno = 0; + + n_written = fwrite (contents, 1, length, file); + + if (n_written < length) + { + save_errno = errno; + + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to write file '%s': fwrite() failed: %s"), + display_name, + g_strerror (save_errno)); + + fclose (file); + g_unlink (tmp_name); + + goto out; + } + } + + errno = 0; + if (fflush (file) != 0) + { + save_errno = errno; + + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to write file '%s': fflush() failed: %s"), + display_name, + g_strerror (save_errno)); + + g_unlink (tmp_name); + + goto out; + } + +#ifdef HAVE_FSYNC + { + struct stat statbuf; + + errno = 0; + /* If the final destination exists and is > 0 bytes, we want to sync the + * newly written file to ensure the data is on disk when we rename over + * the destination. Otherwise if we get a system crash we can lose both + * the new and the old file on some filesystems. (I.E. those that don't + * guarantee the data is written to the disk before the metadata.) + */ + if (g_lstat (dest_file, &statbuf) == 0 && + statbuf.st_size > 0 && + fsync (fileno (file)) != 0) + { + save_errno = errno; + + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to write file '%s': fsync() failed: %s"), + display_name, + g_strerror (save_errno)); + + g_unlink (tmp_name); + + goto out; + } + } +#endif + + errno = 0; + if (fclose (file) == EOF) + { + save_errno = errno; + + g_set_error (err, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to close file '%s': fclose() failed: %s"), + display_name, + g_strerror (save_errno)); + + g_unlink (tmp_name); + + goto out; + } + + retval = g_strdup (tmp_name); + + out: + g_free (tmp_name); + g_free (display_name); + + return retval; +} + +/** + * g_file_set_contents: + * @filename: name of a file to write @contents to, in the GLib file name + * encoding + * @contents: string to write to the file + * @length: length of @contents, or -1 if @contents is a nul-terminated string + * @error: return location for a #GError, or %NULL + * + * Writes all of @contents to a file named @filename, with good error checking. + * If a file called @filename already exists it will be overwritten. + * + * This write is atomic in the sense that it is first written to a temporary + * file which is then renamed to the final name. Notes: + * + * + * On Unix, if @filename already exists hard links to @filename will break. + * Also since the file is recreated, existing permissions, access control + * lists, metadata etc. may be lost. If @filename is a symbolic link, + * the link itself will be replaced, not the linked file. + * + * + * On Windows renaming a file will not remove an existing file with the + * new name, so on Windows there is a race condition between the existing + * file being removed and the temporary file being renamed. + * + * + * On Windows there is no way to remove a file that is open to some + * process, or mapped into memory. Thus, this function will fail if + * @filename already exists and is open. + * + * + * + * If the call was sucessful, it returns %TRUE. If the call was not successful, + * it returns %FALSE and sets @error. The error domain is #G_FILE_ERROR. + * Possible error codes are those in the #GFileError enumeration. + * + * Return value: %TRUE on success, %FALSE if an error occurred + * + * Since: 2.8 + **/ +gboolean +g_file_set_contents (const gchar *filename, + const gchar *contents, + gssize length, + GError **error) +{ + gchar *tmp_filename; + gboolean retval; + GError *rename_error = NULL; + + g_return_val_if_fail (filename != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + g_return_val_if_fail (contents != NULL || length == 0, FALSE); + g_return_val_if_fail (length >= -1, FALSE); + + if (length == -1) + length = strlen (contents); + + tmp_filename = write_to_temp_file (contents, length, filename, error); + + if (!tmp_filename) + { + retval = FALSE; + goto out; + } + + if (!rename_file (tmp_filename, filename, &rename_error)) + { +#ifndef G_OS_WIN32 + + g_unlink (tmp_filename); + g_propagate_error (error, rename_error); + retval = FALSE; + goto out; + +#else /* G_OS_WIN32 */ + + /* Renaming failed, but on Windows this may just mean + * the file already exists. So if the target file + * exists, try deleting it and do the rename again. + */ + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) + { + g_unlink (tmp_filename); + g_propagate_error (error, rename_error); + retval = FALSE; + goto out; + } + + g_error_free (rename_error); + + if (g_unlink (filename) == -1) + { + gchar *display_filename = g_filename_display_name (filename); + + int save_errno = errno; + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Existing file '%s' could not be removed: g_unlink() failed: %s"), + display_filename, + g_strerror (save_errno)); + + g_free (display_filename); + g_unlink (tmp_filename); + retval = FALSE; + goto out; + } + + if (!rename_file (tmp_filename, filename, error)) + { + g_unlink (tmp_filename); + retval = FALSE; + goto out; + } + +#endif + } + + retval = TRUE; + + out: + g_free (tmp_filename); + return retval; +} + +/** + * g_mkstemp_full: + * @tmpl: template filename + * @flags: flags to pass to an open() call in addition to O_EXCL and + * O_CREAT, which are passed automatically + * @mode: permissios to create the temporary file with + * + * Opens a temporary file. See the mkstemp() documentation + * on most UNIX-like systems. + * + * The parameter is a string that should follow the rules for + * mkstemp() templates, i.e. contain the string "XXXXXX". + * g_mkstemp_full() is slightly more flexible than mkstemp() + * in that the sequence does not have to occur at the very end of the + * template and you can pass a @mode and additional @flags. The X + * string will be modified to form the name of a file that didn't exist. + * The string should be in the GLib file name encoding. Most importantly, + * on Windows it should be in UTF-8. + * + * Return value: A file handle (as from open()) to the file + * opened for reading and writing. The file handle should be + * closed with close(). In case of errors, -1 is returned. + * + * Since: 2.22 + */ +/* + * g_mkstemp_full based on the mkstemp implementation from the GNU C library. + * Copyright (C) 1991,92,93,94,95,96,97,98,99 Free Software Foundation, Inc. + */ +gint +g_mkstemp_full (gchar *tmpl, + int flags, + int mode) +{ + char *XXXXXX; + int count, fd; + static const char letters[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const int NLETTERS = sizeof (letters) - 1; + glong value; + GTimeVal tv; + static int counter = 0; + + g_return_val_if_fail (tmpl != NULL, -1); + + + /* find the last occurrence of "XXXXXX" */ + XXXXXX = g_strrstr (tmpl, "XXXXXX"); + + if (!XXXXXX || strncmp (XXXXXX, "XXXXXX", 6)) + { + errno = EINVAL; + return -1; + } + + /* Get some more or less random data. */ + g_get_current_time (&tv); + value = (tv.tv_usec ^ tv.tv_sec) + counter++; + + for (count = 0; count < 100; value += 7777, ++count) + { + glong v = value; + + /* Fill in the random bits. */ + XXXXXX[0] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[1] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[2] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[3] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[4] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[5] = letters[v % NLETTERS]; + + /* tmpl is in UTF-8 on Windows, thus use g_open() */ + fd = g_open (tmpl, flags | O_CREAT | O_EXCL, mode); + + if (fd >= 0) + return fd; + else if (errno != EEXIST) + /* Any other error will apply also to other names we might + * try, and there are 2^32 or so of them, so give up now. + */ + return -1; + } + + /* We got out of the loop because we ran out of combinations to try. */ + errno = EEXIST; + return -1; +} + +/** + * g_mkstemp: + * @tmpl: template filename + * + * Opens a temporary file. See the mkstemp() documentation + * on most UNIX-like systems. + * + * The parameter is a string that should follow the rules for + * mkstemp() templates, i.e. contain the string "XXXXXX". + * g_mkstemp() is slightly more flexible than mkstemp() + * in that the sequence does not have to occur at the very end of the + * template. The X string will + * be modified to form the name of a file that didn't exist. + * The string should be in the GLib file name encoding. Most importantly, + * on Windows it should be in UTF-8. + * + * Return value: A file handle (as from open()) to the file + * opened for reading and writing. The file is opened in binary mode + * on platforms where there is a difference. The file handle should be + * closed with close(). In case of errors, -1 is returned. + */ +gint +g_mkstemp (gchar *tmpl) +{ + return g_mkstemp_full (tmpl, O_RDWR | O_BINARY, 0600); +} + +/** + * g_file_open_tmp: + * @tmpl: Template for file name, as in g_mkstemp(), basename only, + * or %NULL, to a default template + * @name_used: location to store actual name used, or %NULL + * @error: return location for a #GError + * + * Opens a file for writing in the preferred directory for temporary + * files (as returned by g_get_tmp_dir()). + * + * @tmpl should be a string in the GLib file name encoding containing + * a sequence of six 'X' characters, as the parameter to g_mkstemp(). + * However, unlike these functions, the template should only be a + * basename, no directory components are allowed. If template is + * %NULL, a default template is used. + * + * Note that in contrast to g_mkstemp() (and mkstemp()) + * @tmpl is not modified, and might thus be a read-only literal string. + * + * The actual name used is returned in @name_used if non-%NULL. This + * string should be freed with g_free() when not needed any longer. + * The returned name is in the GLib file name encoding. + * + * Return value: A file handle (as from open()) to + * the file opened for reading and writing. The file is opened in binary + * mode on platforms where there is a difference. The file handle should be + * closed with close(). In case of errors, -1 is returned + * and @error will be set. + **/ +gint +g_file_open_tmp (const gchar *tmpl, + gchar **name_used, + GError **error) +{ + int retval; + const char *tmpdir; + const char *sep; + char *fulltemplate; + const char *slash; + + if (tmpl == NULL) + tmpl = ".XXXXXX"; + + if ((slash = strchr (tmpl, G_DIR_SEPARATOR)) != NULL +#ifdef G_OS_WIN32 + || (strchr (tmpl, '/') != NULL && (slash = "/")) +#endif + ) + { + gchar *display_tmpl = g_filename_display_name (tmpl); + char c[2]; + c[0] = *slash; + c[1] = '\0'; + + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + _("Template '%s' invalid, should not contain a '%s'"), + display_tmpl, c); + g_free (display_tmpl); + + return -1; + } + + if (strstr (tmpl, "XXXXXX") == NULL) + { + gchar *display_tmpl = g_filename_display_name (tmpl); + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + _("Template '%s' doesn't contain XXXXXX"), + display_tmpl); + g_free (display_tmpl); + return -1; + } + + tmpdir = g_get_tmp_dir (); + + if (G_IS_DIR_SEPARATOR (tmpdir [strlen (tmpdir) - 1])) + sep = ""; + else + sep = G_DIR_SEPARATOR_S; + + fulltemplate = g_strconcat (tmpdir, sep, tmpl, NULL); + + retval = g_mkstemp (fulltemplate); + + if (retval == -1) + { + int save_errno = errno; + gchar *display_fulltemplate = g_filename_display_name (fulltemplate); + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to create file '%s': %s"), + display_fulltemplate, g_strerror (save_errno)); + g_free (display_fulltemplate); + g_free (fulltemplate); + return -1; + } + + if (name_used) + *name_used = fulltemplate; + else + g_free (fulltemplate); + + return retval; +} + +static gchar * +g_build_path_va (const gchar *separator, + const gchar *first_element, + va_list *args, + gchar **str_array) +{ + GString *result; + gint separator_len = strlen (separator); + gboolean is_first = TRUE; + gboolean have_leading = FALSE; + const gchar *single_element = NULL; + const gchar *next_element; + const gchar *last_trailing = NULL; + gint i = 0; + + result = g_string_new (NULL); + + if (str_array) + next_element = str_array[i++]; + else + next_element = first_element; + + while (TRUE) + { + const gchar *element; + const gchar *start; + const gchar *end; + + if (next_element) + { + element = next_element; + if (str_array) + next_element = str_array[i++]; + else + next_element = va_arg (*args, gchar *); + } + else + break; + + /* Ignore empty elements */ + if (!*element) + continue; + + start = element; + + if (separator_len) + { + while (strncmp (start, separator, separator_len) == 0) + start += separator_len; + } + + end = start + strlen (start); + + if (separator_len) + { + while (end >= start + separator_len && + strncmp (end - separator_len, separator, separator_len) == 0) + end -= separator_len; + + last_trailing = end; + while (last_trailing >= element + separator_len && + strncmp (last_trailing - separator_len, separator, separator_len) == 0) + last_trailing -= separator_len; + + if (!have_leading) + { + /* If the leading and trailing separator strings are in the + * same element and overlap, the result is exactly that element + */ + if (last_trailing <= start) + single_element = element; + + g_string_append_len (result, element, start - element); + have_leading = TRUE; + } + else + single_element = NULL; + } + + if (end == start) + continue; + + if (!is_first) + g_string_append (result, separator); + + g_string_append_len (result, start, end - start); + is_first = FALSE; + } + + if (single_element) + { + g_string_free (result, TRUE); + return g_strdup (single_element); + } + else + { + if (last_trailing) + g_string_append (result, last_trailing); + + return g_string_free (result, FALSE); + } +} + +/** + * g_build_pathv: + * @separator: a string used to separator the elements of the path. + * @args: %NULL-terminated array of strings containing the path elements. + * + * Behaves exactly like g_build_path(), but takes the path elements + * as a string array, instead of varargs. This function is mainly + * meant for language bindings. + * + * Return value: a newly-allocated string that must be freed with g_free(). + * + * Since: 2.8 + */ +gchar * +g_build_pathv (const gchar *separator, + gchar **args) +{ + if (!args) + return NULL; + + return g_build_path_va (separator, NULL, NULL, args); +} + + +/** + * g_build_path: + * @separator: a string used to separator the elements of the path. + * @first_element: the first element in the path + * @Varargs: remaining elements in path, terminated by %NULL + * + * Creates a path from a series of elements using @separator as the + * separator between elements. At the boundary between two elements, + * any trailing occurrences of separator in the first element, or + * leading occurrences of separator in the second element are removed + * and exactly one copy of the separator is inserted. + * + * Empty elements are ignored. + * + * The number of leading copies of the separator on the result is + * the same as the number of leading copies of the separator on + * the first non-empty element. + * + * The number of trailing copies of the separator on the result is + * the same as the number of trailing copies of the separator on + * the last non-empty element. (Determination of the number of + * trailing copies is done without stripping leading copies, so + * if the separator is ABA, ABABA + * has 1 trailing copy.) + * + * However, if there is only a single non-empty element, and there + * are no characters in that element not part of the leading or + * trailing separators, then the result is exactly the original value + * of that element. + * + * Other than for determination of the number of leading and trailing + * copies of the separator, elements consisting only of copies + * of the separator are ignored. + * + * Return value: a newly-allocated string that must be freed with g_free(). + **/ +gchar * +g_build_path (const gchar *separator, + const gchar *first_element, + ...) +{ + gchar *str; + va_list args; + + g_return_val_if_fail (separator != NULL, NULL); + + va_start (args, first_element); + str = g_build_path_va (separator, first_element, &args, NULL); + va_end (args); + + return str; +} + +#ifdef G_OS_WIN32 + +static gchar * +g_build_pathname_va (const gchar *first_element, + va_list *args, + gchar **str_array) +{ + /* Code copied from g_build_pathv(), and modified to use two + * alternative single-character separators. + */ + GString *result; + gboolean is_first = TRUE; + gboolean have_leading = FALSE; + const gchar *single_element = NULL; + const gchar *next_element; + const gchar *last_trailing = NULL; + gchar current_separator = '\\'; + gint i = 0; + + result = g_string_new (NULL); + + if (str_array) + next_element = str_array[i++]; + else + next_element = first_element; + + while (TRUE) + { + const gchar *element; + const gchar *start; + const gchar *end; + + if (next_element) + { + element = next_element; + if (str_array) + next_element = str_array[i++]; + else + next_element = va_arg (*args, gchar *); + } + else + break; + + /* Ignore empty elements */ + if (!*element) + continue; + + start = element; + + if (TRUE) + { + while (start && + (*start == '\\' || *start == '/')) + { + current_separator = *start; + start++; + } + } + + end = start + strlen (start); + + if (TRUE) + { + while (end >= start + 1 && + (end[-1] == '\\' || end[-1] == '/')) + { + current_separator = end[-1]; + end--; + } + + last_trailing = end; + while (last_trailing >= element + 1 && + (last_trailing[-1] == '\\' || last_trailing[-1] == '/')) + last_trailing--; + + if (!have_leading) + { + /* If the leading and trailing separator strings are in the + * same element and overlap, the result is exactly that element + */ + if (last_trailing <= start) + single_element = element; + + g_string_append_len (result, element, start - element); + have_leading = TRUE; + } + else + single_element = NULL; + } + + if (end == start) + continue; + + if (!is_first) + g_string_append_len (result, ¤t_separator, 1); + + g_string_append_len (result, start, end - start); + is_first = FALSE; + } + + if (single_element) + { + g_string_free (result, TRUE); + return g_strdup (single_element); + } + else + { + if (last_trailing) + g_string_append (result, last_trailing); + + return g_string_free (result, FALSE); + } +} + +#endif + +/** + * g_build_filenamev: + * @args: %NULL-terminated array of strings containing the path elements. + * + * Behaves exactly like g_build_filename(), but takes the path elements + * as a string array, instead of varargs. This function is mainly + * meant for language bindings. + * + * Return value: a newly-allocated string that must be freed with g_free(). + * + * Since: 2.8 + */ +gchar * +g_build_filenamev (gchar **args) +{ + gchar *str; + +#ifndef G_OS_WIN32 + str = g_build_path_va (G_DIR_SEPARATOR_S, NULL, NULL, args); +#else + str = g_build_pathname_va (NULL, NULL, args); +#endif + + return str; +} + +/** + * g_build_filename: + * @first_element: the first element in the path + * @Varargs: remaining elements in path, terminated by %NULL + * + * Creates a filename from a series of elements using the correct + * separator for filenames. + * + * On Unix, this function behaves identically to g_build_path + * (G_DIR_SEPARATOR_S, first_element, ....). + * + * On Windows, it takes into account that either the backslash + * (\ or slash (/) can be used + * as separator in filenames, but otherwise behaves as on Unix. When + * file pathname separators need to be inserted, the one that last + * previously occurred in the parameters (reading from left to right) + * is used. + * + * No attempt is made to force the resulting filename to be an absolute + * path. If the first element is a relative path, the result will + * be a relative path. + * + * Return value: a newly-allocated string that must be freed with g_free(). + **/ +gchar * +g_build_filename (const gchar *first_element, + ...) +{ + gchar *str; + va_list args; + + va_start (args, first_element); +#ifndef G_OS_WIN32 + str = g_build_path_va (G_DIR_SEPARATOR_S, first_element, &args, NULL); +#else + str = g_build_pathname_va (first_element, &args, NULL); +#endif + va_end (args); + + return str; +} + +#define KILOBYTE_FACTOR (G_GOFFSET_CONSTANT (1024)) +#define MEGABYTE_FACTOR (KILOBYTE_FACTOR * KILOBYTE_FACTOR) +#define GIGABYTE_FACTOR (MEGABYTE_FACTOR * KILOBYTE_FACTOR) +#define TERABYTE_FACTOR (GIGABYTE_FACTOR * KILOBYTE_FACTOR) +#define PETABYTE_FACTOR (TERABYTE_FACTOR * KILOBYTE_FACTOR) +#define EXABYTE_FACTOR (PETABYTE_FACTOR * KILOBYTE_FACTOR) + +/** + * g_format_size_for_display: + * @size: a size in bytes. + * + * Formats a size (for example the size of a file) into a human readable string. + * Sizes are rounded to the nearest size prefix (KB, MB, GB) and are displayed + * rounded to the nearest tenth. E.g. the file size 3292528 bytes will be + * converted into the string "3.1 MB". + * + * The prefix units base is 1024 (i.e. 1 KB is 1024 bytes). + * + * This string should be freed with g_free() when not needed any longer. + * + * Returns: a newly-allocated formatted string containing a human readable + * file size. + * + * Since: 2.16 + **/ +char * +g_format_size_for_display (goffset size) +{ + if (size < (goffset) KILOBYTE_FACTOR) + return g_strdup_printf (g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes",(guint) size), (guint) size); + else + { + gdouble displayed_size; + + if (size < (goffset) MEGABYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) KILOBYTE_FACTOR; + return g_strdup_printf (_("%.1f KB"), displayed_size); + } + else if (size < (goffset) GIGABYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) MEGABYTE_FACTOR; + return g_strdup_printf (_("%.1f MB"), displayed_size); + } + else if (size < (goffset) TERABYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) GIGABYTE_FACTOR; + return g_strdup_printf (_("%.1f GB"), displayed_size); + } + else if (size < (goffset) PETABYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) TERABYTE_FACTOR; + return g_strdup_printf (_("%.1f TB"), displayed_size); + } + else if (size < (goffset) EXABYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) PETABYTE_FACTOR; + return g_strdup_printf (_("%.1f PB"), displayed_size); + } + else + { + displayed_size = (gdouble) size / (gdouble) EXABYTE_FACTOR; + return g_strdup_printf (_("%.1f EB"), displayed_size); + } + } +} + + +/** + * g_file_read_link: + * @filename: the symbolic link + * @error: return location for a #GError + * + * Reads the contents of the symbolic link @filename like the POSIX + * readlink() function. The returned string is in the encoding used + * for filenames. Use g_filename_to_utf8() to convert it to UTF-8. + * + * Returns: A newly-allocated string with the contents of the symbolic link, + * or %NULL if an error occurred. + * + * Since: 2.4 + */ +gchar * +g_file_read_link (const gchar *filename, + GError **error) +{ +#ifdef HAVE_READLINK + gchar *buffer; + guint size; + gint read_size; + + size = 256; + buffer = g_malloc (size); + + while (TRUE) + { + read_size = readlink (filename, buffer, size); + if (read_size < 0) { + int save_errno = errno; + gchar *display_filename = g_filename_display_name (filename); + + g_free (buffer); + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to read the symbolic link '%s': %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + + return NULL; + } + + if (read_size < size) + { + buffer[read_size] = 0; + return buffer; + } + + size *= 2; + buffer = g_realloc (buffer, size); + } +#else + g_set_error_literal (error, + G_FILE_ERROR, + G_FILE_ERROR_INVAL, + _("Symbolic links not supported")); + + return NULL; +#endif +} + +/* NOTE : Keep this part last to ensure nothing in this file uses the + * below binary compatibility versions. + */ +#if defined (G_OS_WIN32) && !defined (_WIN64) + +/* Binary compatibility versions. Will be called by code compiled + * against quite old (pre-2.8, I think) headers only, not from more + * recently compiled code. + */ + +#undef g_file_test + +gboolean +g_file_test (const gchar *filename, + GFileTest test) +{ + gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, NULL); + gboolean retval; + + if (utf8_filename == NULL) + return FALSE; + + retval = g_file_test_utf8 (utf8_filename, test); + + g_free (utf8_filename); + + return retval; +} + +#undef g_file_get_contents + +gboolean +g_file_get_contents (const gchar *filename, + gchar **contents, + gsize *length, + GError **error) +{ + gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error); + gboolean retval; + + if (utf8_filename == NULL) + return FALSE; + + retval = g_file_get_contents_utf8 (utf8_filename, contents, length, error); + + g_free (utf8_filename); + + return retval; +} + +#undef g_mkstemp + +gint +g_mkstemp (gchar *tmpl) +{ + char *XXXXXX; + int count, fd; + static const char letters[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const int NLETTERS = sizeof (letters) - 1; + glong value; + GTimeVal tv; + static int counter = 0; + + /* find the last occurrence of 'XXXXXX' */ + XXXXXX = g_strrstr (tmpl, "XXXXXX"); + + if (!XXXXXX) + { + errno = EINVAL; + return -1; + } + + /* Get some more or less random data. */ + g_get_current_time (&tv); + value = (tv.tv_usec ^ tv.tv_sec) + counter++; + + for (count = 0; count < 100; value += 7777, ++count) + { + glong v = value; + + /* Fill in the random bits. */ + XXXXXX[0] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[1] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[2] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[3] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[4] = letters[v % NLETTERS]; + v /= NLETTERS; + XXXXXX[5] = letters[v % NLETTERS]; + + /* This is the backward compatibility system codepage version, + * thus use normal open(). + */ + fd = open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600); + + if (fd >= 0) + return fd; + else if (errno != EEXIST) + /* Any other error will apply also to other names we might + * try, and there are 2^32 or so of them, so give up now. + */ + return -1; + } + + /* We got out of the loop because we ran out of combinations to try. */ + errno = EEXIST; + return -1; +} + +#undef g_file_open_tmp + +gint +g_file_open_tmp (const gchar *tmpl, + gchar **name_used, + GError **error) +{ + gchar *utf8_tmpl = g_locale_to_utf8 (tmpl, -1, NULL, NULL, error); + gchar *utf8_name_used; + gint retval; + + if (utf8_tmpl == NULL) + return -1; + + retval = g_file_open_tmp_utf8 (utf8_tmpl, &utf8_name_used, error); + + if (retval == -1) + return -1; + + if (name_used) + *name_used = g_locale_from_utf8 (utf8_name_used, -1, NULL, NULL, NULL); + + g_free (utf8_name_used); + + return retval; +} + +#endif + +#define __G_FILEUTILS_C__ +#include "galiasdef.c" diff --git a/glib/gfileutils.h b/glib/gfileutils.h new file mode 100644 index 0000000..d8f9d3b --- /dev/null +++ b/glib/gfileutils.h @@ -0,0 +1,128 @@ +/* gfileutils.h - File utility functions + * + * Copyright 2000 Red Hat, Inc. + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_FILEUTILS_H__ +#define __G_FILEUTILS_H__ + +#include + +G_BEGIN_DECLS + +#define G_FILE_ERROR g_file_error_quark () + +typedef enum +{ + G_FILE_ERROR_EXIST, + G_FILE_ERROR_ISDIR, + G_FILE_ERROR_ACCES, + G_FILE_ERROR_NAMETOOLONG, + G_FILE_ERROR_NOENT, + G_FILE_ERROR_NOTDIR, + G_FILE_ERROR_NXIO, + G_FILE_ERROR_NODEV, + G_FILE_ERROR_ROFS, + G_FILE_ERROR_TXTBSY, + G_FILE_ERROR_FAULT, + G_FILE_ERROR_LOOP, + G_FILE_ERROR_NOSPC, + G_FILE_ERROR_NOMEM, + G_FILE_ERROR_MFILE, + G_FILE_ERROR_NFILE, + G_FILE_ERROR_BADF, + G_FILE_ERROR_INVAL, + G_FILE_ERROR_PIPE, + G_FILE_ERROR_AGAIN, + G_FILE_ERROR_INTR, + G_FILE_ERROR_IO, + G_FILE_ERROR_PERM, + G_FILE_ERROR_NOSYS, + G_FILE_ERROR_FAILED +} GFileError; + +/* For backward-compat reasons, these are synced to an old + * anonymous enum in libgnome. But don't use that enum + * in new code. + */ +typedef enum +{ + G_FILE_TEST_IS_REGULAR = 1 << 0, + G_FILE_TEST_IS_SYMLINK = 1 << 1, + G_FILE_TEST_IS_DIR = 1 << 2, + G_FILE_TEST_IS_EXECUTABLE = 1 << 3, + G_FILE_TEST_EXISTS = 1 << 4 +} GFileTest; + +GQuark g_file_error_quark (void); +/* So other code can generate a GFileError */ +GFileError g_file_error_from_errno (gint err_no); + +#ifdef G_OS_WIN32 +#define g_file_test g_file_test_utf8 +#define g_file_get_contents g_file_get_contents_utf8 +#define g_mkstemp g_mkstemp_utf8 +#define g_file_open_tmp g_file_open_tmp_utf8 +#endif + +gboolean g_file_test (const gchar *filename, + GFileTest test); +gboolean g_file_get_contents (const gchar *filename, + gchar **contents, + gsize *length, + GError **error); +gboolean g_file_set_contents (const gchar *filename, + const gchar *contents, + gssize length, + GError **error); +gchar *g_file_read_link (const gchar *filename, + GError **error); + +/* Wrapper / workalike for mkstemp() */ +gint g_mkstemp (gchar *tmpl); +gint g_mkstemp_full (gchar *tmpl, + int flags, + int mode); + +/* Wrapper for g_mkstemp */ +gint g_file_open_tmp (const gchar *tmpl, + gchar **name_used, + GError **error); + +char *g_format_size_for_display (goffset size); + +gchar *g_build_path (const gchar *separator, + const gchar *first_element, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +gchar *g_build_pathv (const gchar *separator, + gchar **args) G_GNUC_MALLOC; + +gchar *g_build_filename (const gchar *first_element, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +gchar *g_build_filenamev (gchar **args) G_GNUC_MALLOC; + +int g_mkdir_with_parents (const gchar *pathname, + int mode); + +G_END_DECLS + +#endif /* __G_FILEUTILS_H__ */ diff --git a/glib/ghash.c b/glib/ghash.c new file mode 100644 index 0000000..417ed5d --- /dev/null +++ b/glib/ghash.c @@ -0,0 +1,1461 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include /* memset */ + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: hash_tables + * @title: Hash Tables + * @short_description: associations between keys and values so that + * given a key the value can be found quickly + * + * A #GHashTable provides associations between keys and values which is + * optimized so that given a key, the associated value can be found + * very quickly. + * + * Note that neither keys nor values are copied when inserted into the + * #GHashTable, so they must exist for the lifetime of the #GHashTable. + * This means that the use of static strings is OK, but temporary + * strings (i.e. those created in buffers and those returned by GTK+ + * widgets) should be copied with g_strdup() before being inserted. + * + * If keys or values are dynamically allocated, you must be careful to + * ensure that they are freed when they are removed from the + * #GHashTable, and also when they are overwritten by new insertions + * into the #GHashTable. It is also not advisable to mix static strings + * and dynamically-allocated strings in a #GHashTable, because it then + * becomes difficult to determine whether the string should be freed. + * + * To create a #GHashTable, use g_hash_table_new(). + * + * To insert a key and value into a #GHashTable, use + * g_hash_table_insert(). + * + * To lookup a value corresponding to a given key, use + * g_hash_table_lookup() and g_hash_table_lookup_extended(). + * + * To remove a key and value, use g_hash_table_remove(). + * + * To call a function for each key and value pair use + * g_hash_table_foreach() or use a iterator to iterate over the + * key/value pairs in the hash table, see #GHashTableIter. + * + * To destroy a #GHashTable use g_hash_table_destroy(). + **/ + +/** + * GHashTable: + * + * The #GHashTable struct is an opaque data structure to represent a + * Hash Table. It should only be + * accessed via the following functions. + **/ + +/** + * GHashFunc: + * @key: a key. + * @Returns: the hash value corresponding to the key. + * + * Specifies the type of the hash function which is passed to + * g_hash_table_new() when a #GHashTable is created. + * + * The function is passed a key and should return a #guint hash value. + * The functions g_direct_hash(), g_int_hash() and g_str_hash() provide + * hash functions which can be used when the key is a #gpointer, #gint, + * and #gchar* respectively. + * + * The hash values should be evenly + * distributed over a fairly large range? The modulus is taken with the + * hash table size (a prime number) to find the 'bucket' to place each + * key into. The function should also be very fast, since it is called + * for each key lookup. + **/ + +/** + * GHFunc: + * @key: a key. + * @value: the value corresponding to the key. + * @user_data: user data passed to g_hash_table_foreach(). + * + * Specifies the type of the function passed to g_hash_table_foreach(). + * It is called with each key/value pair, together with the @user_data + * parameter which is passed to g_hash_table_foreach(). + **/ + +/** + * GHRFunc: + * @key: a key. + * @value: the value associated with the key. + * @user_data: user data passed to g_hash_table_remove(). + * @Returns: %TRUE if the key/value pair should be removed from the + * #GHashTable. + * + * Specifies the type of the function passed to + * g_hash_table_foreach_remove(). It is called with each key/value + * pair, together with the @user_data parameter passed to + * g_hash_table_foreach_remove(). It should return %TRUE if the + * key/value pair should be removed from the #GHashTable. + **/ + +/** + * GEqualFunc: + * @a: a value. + * @b: a value to compare with. + * @Returns: %TRUE if @a = @b; %FALSE otherwise. + * + * Specifies the type of a function used to test two values for + * equality. The function should return %TRUE if both values are equal + * and %FALSE otherwise. + **/ + +/** + * GHashTableIter: + * + * A GHashTableIter structure represents an iterator that can be used + * to iterate over the elements of a #GHashTable. GHashTableIter + * structures are typically allocated on the stack and then initialized + * with g_hash_table_iter_init(). + **/ + +#define HASH_TABLE_MIN_SHIFT 3 /* 1 << 3 == 8 buckets */ + +typedef struct _GHashNode GHashNode; + +struct _GHashNode +{ + gpointer key; + gpointer value; + + /* If key_hash == 0, node is not in use + * If key_hash == 1, node is a tombstone + * If key_hash >= 2, node contains data */ + guint key_hash; +}; + +struct _GHashTable +{ + gint size; + gint mod; + guint mask; + gint nnodes; + gint noccupied; /* nnodes + tombstones */ + GHashNode *nodes; + GHashFunc hash_func; + GEqualFunc key_equal_func; + volatile gint ref_count; +#ifndef G_DISABLE_ASSERT + /* + * Tracks the structure of the hash table, not its contents: is only + * incremented when a node is added or removed (is not incremented + * when the key or data of a node is modified). + */ + int version; +#endif + GDestroyNotify key_destroy_func; + GDestroyNotify value_destroy_func; +}; + +typedef struct +{ + GHashTable *hash_table; + gpointer dummy1; + gpointer dummy2; + int position; + gboolean dummy3; + int version; +} RealIter; + +/* Each table size has an associated prime modulo (the first prime + * lower than the table size) used to find the initial bucket. Probing + * then works modulo 2^n. The prime modulo is necessary to get a + * good distribution with poor hash functions. */ +static const gint prime_mod [] = +{ + 1, /* For 1 << 0 */ + 2, + 3, + 7, + 13, + 31, + 61, + 127, + 251, + 509, + 1021, + 2039, + 4093, + 8191, + 16381, + 32749, + 65521, /* For 1 << 16 */ + 131071, + 262139, + 524287, + 1048573, + 2097143, + 4194301, + 8388593, + 16777213, + 33554393, + 67108859, + 134217689, + 268435399, + 536870909, + 1073741789, + 2147483647 /* For 1 << 31 */ +}; + +static void +g_hash_table_set_shift (GHashTable *hash_table, gint shift) +{ + gint i; + guint mask = 0; + + hash_table->size = 1 << shift; + hash_table->mod = prime_mod [shift]; + + for (i = 0; i < shift; i++) + { + mask <<= 1; + mask |= 1; + } + + hash_table->mask = mask; +} + +static gint +g_hash_table_find_closest_shift (gint n) +{ + gint i; + + for (i = 0; n; i++) + n >>= 1; + + return i; +} + +static void +g_hash_table_set_shift_from_size (GHashTable *hash_table, gint size) +{ + gint shift; + + shift = g_hash_table_find_closest_shift (size); + shift = MAX (shift, HASH_TABLE_MIN_SHIFT); + + g_hash_table_set_shift (hash_table, shift); +} + +/* + * g_hash_table_lookup_node: + * @hash_table: our #GHashTable + * @key: the key to lookup against + * @hash_return: optional key hash return location + * Return value: index of the described #GHashNode + * + * Performs a lookup in the hash table. Virtually all hash operations + * will use this function internally. + * + * This function first computes the hash value of the key using the + * user's hash function. + * + * If an entry in the table matching @key is found then this function + * returns the index of that entry in the table, and if not, the + * index of an empty node (never a tombstone). + */ +static inline guint +g_hash_table_lookup_node (GHashTable *hash_table, + gconstpointer key) +{ + GHashNode *node; + guint node_index; + guint hash_value; + guint step = 0; + + /* Empty buckets have hash_value set to 0, and for tombstones, it's 1. + * We need to make sure our hash value is not one of these. */ + + hash_value = (* hash_table->hash_func) (key); + if (G_UNLIKELY (hash_value <= 1)) + hash_value = 2; + + node_index = hash_value % hash_table->mod; + node = &hash_table->nodes [node_index]; + + while (node->key_hash) + { + /* We first check if our full hash values + * are equal so we can avoid calling the full-blown + * key equality function in most cases. + */ + + if (node->key_hash == hash_value) + { + if (hash_table->key_equal_func) + { + if (hash_table->key_equal_func (node->key, key)) + break; + } + else if (node->key == key) + { + break; + } + } + + step++; + node_index += step; + node_index &= hash_table->mask; + node = &hash_table->nodes [node_index]; + } + + return node_index; +} + +/* + * g_hash_table_lookup_node_for_insertion: + * @hash_table: our #GHashTable + * @key: the key to lookup against + * @hash_return: key hash return location + * Return value: index of the described #GHashNode + * + * Performs a lookup in the hash table, preserving extra information + * usually needed for insertion. + * + * This function first computes the hash value of the key using the + * user's hash function. + * + * If an entry in the table matching @key is found then this function + * returns the index of that entry in the table, and if not, the + * index of an unused node (empty or tombstone) where the key can be + * inserted. + * + * The computed hash value is returned in the variable pointed to + * by @hash_return. This is to save insertions from having to compute + * the hash record again for the new record. + */ +static inline guint +g_hash_table_lookup_node_for_insertion (GHashTable *hash_table, + gconstpointer key, + guint *hash_return) +{ + GHashNode *node; + guint node_index; + guint hash_value; + guint first_tombstone; + gboolean have_tombstone = FALSE; + guint step = 0; + + /* Empty buckets have hash_value set to 0, and for tombstones, it's 1. + * We need to make sure our hash value is not one of these. */ + + hash_value = (* hash_table->hash_func) (key); + if (G_UNLIKELY (hash_value <= 1)) + hash_value = 2; + + *hash_return = hash_value; + + node_index = hash_value % hash_table->mod; + node = &hash_table->nodes [node_index]; + + while (node->key_hash) + { + /* We first check if our full hash values + * are equal so we can avoid calling the full-blown + * key equality function in most cases. + */ + + if (node->key_hash == hash_value) + { + if (hash_table->key_equal_func) + { + if (hash_table->key_equal_func (node->key, key)) + return node_index; + } + else if (node->key == key) + { + return node_index; + } + } + else if (node->key_hash == 1 && !have_tombstone) + { + first_tombstone = node_index; + have_tombstone = TRUE; + } + + step++; + node_index += step; + node_index &= hash_table->mask; + node = &hash_table->nodes [node_index]; + } + + if (have_tombstone) + return first_tombstone; + + return node_index; +} + +/* + * g_hash_table_remove_node: + * @hash_table: our #GHashTable + * @node: pointer to node to remove + * @notify: %TRUE if the destroy notify handlers are to be called + * + * Removes a node from the hash table and updates the node count. + * The node is replaced by a tombstone. No table resize is performed. + * + * If @notify is %TRUE then the destroy notify functions are called + * for the key and value of the hash node. + */ +static void +g_hash_table_remove_node (GHashTable *hash_table, + GHashNode *node, + gboolean notify) +{ + if (notify && hash_table->key_destroy_func) + hash_table->key_destroy_func (node->key); + + if (notify && hash_table->value_destroy_func) + hash_table->value_destroy_func (node->value); + + /* Erect tombstone */ + node->key_hash = 1; + + /* Be GC friendly */ + node->key = NULL; + node->value = NULL; + + hash_table->nnodes--; +} + +/* + * g_hash_table_remove_all_nodes: + * @hash_table: our #GHashTable + * @notify: %TRUE if the destroy notify handlers are to be called + * + * Removes all nodes from the table. Since this may be a precursor to + * freeing the table entirely, no resize is performed. + * + * If @notify is %TRUE then the destroy notify functions are called + * for the key and value of the hash node. + */ +static void +g_hash_table_remove_all_nodes (GHashTable *hash_table, + gboolean notify) +{ + int i; + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1) + { + if (notify && hash_table->key_destroy_func) + hash_table->key_destroy_func (node->key); + + if (notify && hash_table->value_destroy_func) + hash_table->value_destroy_func (node->value); + } + } + + /* We need to set node->key_hash = 0 for all nodes - might as well be GC + * friendly and clear everything */ + memset (hash_table->nodes, 0, hash_table->size * sizeof (GHashNode)); + + hash_table->nnodes = 0; + hash_table->noccupied = 0; +} + +/* + * g_hash_table_resize: + * @hash_table: our #GHashTable + * + * Resizes the hash table to the optimal size based on the number of + * nodes currently held. If you call this function then a resize will + * occur, even if one does not need to occur. Use + * g_hash_table_maybe_resize() instead. + * + * This function may "resize" the hash table to its current size, with + * the side effect of cleaning up tombstones and otherwise optimizing + * the probe sequences. + */ +static void +g_hash_table_resize (GHashTable *hash_table) +{ + GHashNode *new_nodes; + gint old_size; + gint i; + + old_size = hash_table->size; + g_hash_table_set_shift_from_size (hash_table, hash_table->nnodes * 2); + + new_nodes = g_new0 (GHashNode, hash_table->size); + + for (i = 0; i < old_size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + GHashNode *new_node; + guint hash_val; + guint step = 0; + + if (node->key_hash <= 1) + continue; + + hash_val = node->key_hash % hash_table->mod; + new_node = &new_nodes [hash_val]; + + while (new_node->key_hash) + { + step++; + hash_val += step; + hash_val &= hash_table->mask; + new_node = &new_nodes [hash_val]; + } + + *new_node = *node; + } + + g_free (hash_table->nodes); + hash_table->nodes = new_nodes; + hash_table->noccupied = hash_table->nnodes; +} + +/* + * g_hash_table_maybe_resize: + * @hash_table: our #GHashTable + * + * Resizes the hash table, if needed. + * + * Essentially, calls g_hash_table_resize() if the table has strayed + * too far from its ideal size for its number of nodes. + */ +static inline void +g_hash_table_maybe_resize (GHashTable *hash_table) +{ + gint noccupied = hash_table->noccupied; + gint size = hash_table->size; + + if ((size > hash_table->nnodes * 4 && size > 1 << HASH_TABLE_MIN_SHIFT) || + (size <= noccupied + (noccupied / 16))) + g_hash_table_resize (hash_table); +} + +/** + * g_hash_table_new: + * @hash_func: a function to create a hash value from a key. + * Hash values are used to determine where keys are stored within the + * #GHashTable data structure. The g_direct_hash(), g_int_hash(), + * g_int64_hash(), g_double_hash() and g_str_hash() functions are provided + * for some common types of keys. + * If hash_func is %NULL, g_direct_hash() is used. + * @key_equal_func: a function to check two keys for equality. This is + * used when looking up keys in the #GHashTable. The g_direct_equal(), + * g_int_equal(), g_int64_equal(), g_double_equal() and g_str_equal() + * functions are provided for the most common types of keys. + * If @key_equal_func is %NULL, keys are compared directly in a similar + * fashion to g_direct_equal(), but without the overhead of a function call. + * + * Creates a new #GHashTable with a reference count of 1. + * + * Return value: a new #GHashTable. + **/ +GHashTable* +g_hash_table_new (GHashFunc hash_func, + GEqualFunc key_equal_func) +{ + return g_hash_table_new_full (hash_func, key_equal_func, NULL, NULL); +} + + +/** + * g_hash_table_new_full: + * @hash_func: a function to create a hash value from a key. + * @key_equal_func: a function to check two keys for equality. + * @key_destroy_func: a function to free the memory allocated for the key + * used when removing the entry from the #GHashTable or %NULL if you + * don't want to supply such a function. + * @value_destroy_func: a function to free the memory allocated for the + * value used when removing the entry from the #GHashTable or %NULL if + * you don't want to supply such a function. + * + * Creates a new #GHashTable like g_hash_table_new() with a reference count + * of 1 and allows to specify functions to free the memory allocated for the + * key and value that get called when removing the entry from the #GHashTable. + * + * Return value: a new #GHashTable. + **/ +GHashTable* +g_hash_table_new_full (GHashFunc hash_func, + GEqualFunc key_equal_func, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func) +{ + GHashTable *hash_table; + + hash_table = g_slice_new (GHashTable); + g_hash_table_set_shift (hash_table, HASH_TABLE_MIN_SHIFT); + hash_table->nnodes = 0; + hash_table->noccupied = 0; + hash_table->hash_func = hash_func ? hash_func : g_direct_hash; + hash_table->key_equal_func = key_equal_func; + hash_table->ref_count = 1; +#ifndef G_DISABLE_ASSERT + hash_table->version = 0; +#endif + hash_table->key_destroy_func = key_destroy_func; + hash_table->value_destroy_func = value_destroy_func; + hash_table->nodes = g_new0 (GHashNode, hash_table->size); + + return hash_table; +} + +/** + * g_hash_table_iter_init: + * @iter: an uninitialized #GHashTableIter. + * @hash_table: a #GHashTable. + * + * Initializes a key/value pair iterator and associates it with + * @hash_table. Modifying the hash table after calling this function + * invalidates the returned iterator. + * |[ + * GHashTableIter iter; + * gpointer key, value; + * + * g_hash_table_iter_init (&iter, hash_table); + * while (g_hash_table_iter_next (&iter, &key, &value)) + * { + * /* do something with key and value */ + * } + * ]| + * + * Since: 2.16 + **/ +void +g_hash_table_iter_init (GHashTableIter *iter, + GHashTable *hash_table) +{ + RealIter *ri = (RealIter *) iter; + + g_return_if_fail (iter != NULL); + g_return_if_fail (hash_table != NULL); + + ri->hash_table = hash_table; + ri->position = -1; +#ifndef G_DISABLE_ASSERT + ri->version = hash_table->version; +#endif +} + +/** + * g_hash_table_iter_next: + * @iter: an initialized #GHashTableIter. + * @key: a location to store the key, or %NULL. + * @value: a location to store the value, or %NULL. + * + * Advances @iter and retrieves the key and/or value that are now + * pointed to as a result of this advancement. If %FALSE is returned, + * @key and @value are not set, and the iterator becomes invalid. + * + * Return value: %FALSE if the end of the #GHashTable has been reached. + * + * Since: 2.16 + **/ +gboolean +g_hash_table_iter_next (GHashTableIter *iter, + gpointer *key, + gpointer *value) +{ + RealIter *ri = (RealIter *) iter; + GHashNode *node; + gint position; + + g_return_val_if_fail (iter != NULL, FALSE); +#ifndef G_DISABLE_ASSERT + g_return_val_if_fail (ri->version == ri->hash_table->version, FALSE); +#endif + g_return_val_if_fail (ri->position < ri->hash_table->size, FALSE); + + position = ri->position; + + do + { + position++; + if (position >= ri->hash_table->size) + { + ri->position = position; + return FALSE; + } + + node = &ri->hash_table->nodes [position]; + } + while (node->key_hash <= 1); + + if (key != NULL) + *key = node->key; + if (value != NULL) + *value = node->value; + + ri->position = position; + return TRUE; +} + +/** + * g_hash_table_iter_get_hash_table: + * @iter: an initialized #GHashTableIter. + * + * Returns the #GHashTable associated with @iter. + * + * Return value: the #GHashTable associated with @iter. + * + * Since: 2.16 + **/ +GHashTable * +g_hash_table_iter_get_hash_table (GHashTableIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + return ((RealIter *) iter)->hash_table; +} + +static void +iter_remove_or_steal (RealIter *ri, gboolean notify) +{ + g_return_if_fail (ri != NULL); +#ifndef G_DISABLE_ASSERT + g_return_if_fail (ri->version == ri->hash_table->version); +#endif + g_return_if_fail (ri->position >= 0); + g_return_if_fail (ri->position < ri->hash_table->size); + + g_hash_table_remove_node (ri->hash_table, &ri->hash_table->nodes [ri->position], notify); + +#ifndef G_DISABLE_ASSERT + ri->version++; + ri->hash_table->version++; +#endif +} + +/** + * g_hash_table_iter_remove: + * @iter: an initialized #GHashTableIter. + * + * Removes the key/value pair currently pointed to by the iterator + * from its associated #GHashTable. Can only be called after + * g_hash_table_iter_next() returned %TRUE, and cannot be called more + * than once for the same key/value pair. + * + * If the #GHashTable was created using g_hash_table_new_full(), the + * key and value are freed using the supplied destroy functions, otherwise + * you have to make sure that any dynamically allocated values are freed + * yourself. + * + * Since: 2.16 + **/ +void +g_hash_table_iter_remove (GHashTableIter *iter) +{ + iter_remove_or_steal ((RealIter *) iter, TRUE); +} + +/** + * g_hash_table_iter_steal: + * @iter: an initialized #GHashTableIter. + * + * Removes the key/value pair currently pointed to by the iterator + * from its associated #GHashTable, without calling the key and value + * destroy functions. Can only be called after + * g_hash_table_iter_next() returned %TRUE, and cannot be called more + * than once for the same key/value pair. + * + * Since: 2.16 + **/ +void +g_hash_table_iter_steal (GHashTableIter *iter) +{ + iter_remove_or_steal ((RealIter *) iter, FALSE); +} + + +/** + * g_hash_table_ref: + * @hash_table: a valid #GHashTable. + * + * Atomically increments the reference count of @hash_table by one. + * This function is MT-safe and may be called from any thread. + * + * Return value: the passed in #GHashTable. + * + * Since: 2.10 + **/ +GHashTable* +g_hash_table_ref (GHashTable *hash_table) +{ + g_return_val_if_fail (hash_table != NULL, NULL); + g_return_val_if_fail (hash_table->ref_count > 0, hash_table); + + g_atomic_int_add (&hash_table->ref_count, 1); + return hash_table; +} + +/** + * g_hash_table_unref: + * @hash_table: a valid #GHashTable. + * + * Atomically decrements the reference count of @hash_table by one. + * If the reference count drops to 0, all keys and values will be + * destroyed, and all memory allocated by the hash table is released. + * This function is MT-safe and may be called from any thread. + * + * Since: 2.10 + **/ +void +g_hash_table_unref (GHashTable *hash_table) +{ + g_return_if_fail (hash_table != NULL); + g_return_if_fail (hash_table->ref_count > 0); + + if (g_atomic_int_exchange_and_add (&hash_table->ref_count, -1) - 1 == 0) + { + g_hash_table_remove_all_nodes (hash_table, TRUE); + g_free (hash_table->nodes); + g_slice_free (GHashTable, hash_table); + } +} + +/** + * g_hash_table_destroy: + * @hash_table: a #GHashTable. + * + * Destroys all keys and values in the #GHashTable and decrements its + * reference count by 1. If keys and/or values are dynamically allocated, + * you should either free them first or create the #GHashTable with destroy + * notifiers using g_hash_table_new_full(). In the latter case the destroy + * functions you supplied will be called on all keys and values during the + * destruction phase. + **/ +void +g_hash_table_destroy (GHashTable *hash_table) +{ + g_return_if_fail (hash_table != NULL); + g_return_if_fail (hash_table->ref_count > 0); + + g_hash_table_remove_all (hash_table); + g_hash_table_unref (hash_table); +} + +/** + * g_hash_table_lookup: + * @hash_table: a #GHashTable. + * @key: the key to look up. + * + * Looks up a key in a #GHashTable. Note that this function cannot + * distinguish between a key that is not present and one which is present + * and has the value %NULL. If you need this distinction, use + * g_hash_table_lookup_extended(). + * + * Return value: the associated value, or %NULL if the key is not found. + **/ +gpointer +g_hash_table_lookup (GHashTable *hash_table, + gconstpointer key) +{ + GHashNode *node; + guint node_index; + + g_return_val_if_fail (hash_table != NULL, NULL); + + node_index = g_hash_table_lookup_node (hash_table, key); + node = &hash_table->nodes [node_index]; + + return node->key_hash ? node->value : NULL; +} + +/** + * g_hash_table_lookup_extended: + * @hash_table: a #GHashTable + * @lookup_key: the key to look up + * @orig_key: return location for the original key, or %NULL + * @value: return location for the value associated with the key, or %NULL + * + * Looks up a key in the #GHashTable, returning the original key and the + * associated value and a #gboolean which is %TRUE if the key was found. This + * is useful if you need to free the memory allocated for the original key, + * for example before calling g_hash_table_remove(). + * + * You can actually pass %NULL for @lookup_key to test + * whether the %NULL key exists. + * + * Return value: %TRUE if the key was found in the #GHashTable. + **/ +gboolean +g_hash_table_lookup_extended (GHashTable *hash_table, + gconstpointer lookup_key, + gpointer *orig_key, + gpointer *value) +{ + GHashNode *node; + guint node_index; + + g_return_val_if_fail (hash_table != NULL, FALSE); + + node_index = g_hash_table_lookup_node (hash_table, lookup_key); + node = &hash_table->nodes [node_index]; + + if (!node->key_hash) + return FALSE; + + if (orig_key) + *orig_key = node->key; + + if (value) + *value = node->value; + + return TRUE; +} + +/* + * g_hash_table_insert_internal: + * @hash_table: our #GHashTable + * @key: the key to insert + * @value: the value to insert + * @keep_new_key: if %TRUE and this key already exists in the table + * then call the destroy notify function on the old key. If %FALSE + * then call the destroy notify function on the new key. + * + * Implements the common logic for the g_hash_table_insert() and + * g_hash_table_replace() functions. + * + * Do a lookup of @key. If it is found, replace it with the new + * @value (and perhaps the new @key). If it is not found, create a + * new node. + */ +static void +g_hash_table_insert_internal (GHashTable *hash_table, + gpointer key, + gpointer value, + gboolean keep_new_key) +{ + GHashNode *node; + guint node_index; + guint key_hash; + guint old_hash; + + g_return_if_fail (hash_table != NULL); + g_return_if_fail (hash_table->ref_count > 0); + + node_index = g_hash_table_lookup_node_for_insertion (hash_table, key, &key_hash); + node = &hash_table->nodes [node_index]; + + old_hash = node->key_hash; + + if (old_hash > 1) + { + if (keep_new_key) + { + if (hash_table->key_destroy_func) + hash_table->key_destroy_func (node->key); + node->key = key; + } + else + { + if (hash_table->key_destroy_func) + hash_table->key_destroy_func (key); + } + + if (hash_table->value_destroy_func) + hash_table->value_destroy_func (node->value); + + node->value = value; + } + else + { + node->key = key; + node->value = value; + node->key_hash = key_hash; + + hash_table->nnodes++; + + if (old_hash == 0) + { + /* We replaced an empty node, and not a tombstone */ + hash_table->noccupied++; + g_hash_table_maybe_resize (hash_table); + } + +#ifndef G_DISABLE_ASSERT + hash_table->version++; +#endif + } +} + +/** + * g_hash_table_insert: + * @hash_table: a #GHashTable. + * @key: a key to insert. + * @value: the value to associate with the key. + * + * Inserts a new key and value into a #GHashTable. + * + * If the key already exists in the #GHashTable its current value is replaced + * with the new value. If you supplied a @value_destroy_func when creating the + * #GHashTable, the old value is freed using that function. If you supplied + * a @key_destroy_func when creating the #GHashTable, the passed key is freed + * using that function. + **/ +void +g_hash_table_insert (GHashTable *hash_table, + gpointer key, + gpointer value) +{ + g_hash_table_insert_internal (hash_table, key, value, FALSE); +} + +/** + * g_hash_table_replace: + * @hash_table: a #GHashTable. + * @key: a key to insert. + * @value: the value to associate with the key. + * + * Inserts a new key and value into a #GHashTable similar to + * g_hash_table_insert(). The difference is that if the key already exists + * in the #GHashTable, it gets replaced by the new key. If you supplied a + * @value_destroy_func when creating the #GHashTable, the old value is freed + * using that function. If you supplied a @key_destroy_func when creating the + * #GHashTable, the old key is freed using that function. + **/ +void +g_hash_table_replace (GHashTable *hash_table, + gpointer key, + gpointer value) +{ + g_hash_table_insert_internal (hash_table, key, value, TRUE); +} + +/* + * g_hash_table_remove_internal: + * @hash_table: our #GHashTable + * @key: the key to remove + * @notify: %TRUE if the destroy notify handlers are to be called + * Return value: %TRUE if a node was found and removed, else %FALSE + * + * Implements the common logic for the g_hash_table_remove() and + * g_hash_table_steal() functions. + * + * Do a lookup of @key and remove it if it is found, calling the + * destroy notify handlers only if @notify is %TRUE. + */ +static gboolean +g_hash_table_remove_internal (GHashTable *hash_table, + gconstpointer key, + gboolean notify) +{ + GHashNode *node; + guint node_index; + + g_return_val_if_fail (hash_table != NULL, FALSE); + + node_index = g_hash_table_lookup_node (hash_table, key); + node = &hash_table->nodes [node_index]; + + /* g_hash_table_lookup_node() never returns a tombstone, so this is safe */ + if (!node->key_hash) + return FALSE; + + g_hash_table_remove_node (hash_table, node, notify); + g_hash_table_maybe_resize (hash_table); + +#ifndef G_DISABLE_ASSERT + hash_table->version++; +#endif + + return TRUE; +} + +/** + * g_hash_table_remove: + * @hash_table: a #GHashTable. + * @key: the key to remove. + * + * Removes a key and its associated value from a #GHashTable. + * + * If the #GHashTable was created using g_hash_table_new_full(), the + * key and value are freed using the supplied destroy functions, otherwise + * you have to make sure that any dynamically allocated values are freed + * yourself. + * + * Return value: %TRUE if the key was found and removed from the #GHashTable. + **/ +gboolean +g_hash_table_remove (GHashTable *hash_table, + gconstpointer key) +{ + return g_hash_table_remove_internal (hash_table, key, TRUE); +} + +/** + * g_hash_table_steal: + * @hash_table: a #GHashTable. + * @key: the key to remove. + * + * Removes a key and its associated value from a #GHashTable without + * calling the key and value destroy functions. + * + * Return value: %TRUE if the key was found and removed from the #GHashTable. + **/ +gboolean +g_hash_table_steal (GHashTable *hash_table, + gconstpointer key) +{ + return g_hash_table_remove_internal (hash_table, key, FALSE); +} + +/** + * g_hash_table_remove_all: + * @hash_table: a #GHashTable + * + * Removes all keys and their associated values from a #GHashTable. + * + * If the #GHashTable was created using g_hash_table_new_full(), the keys + * and values are freed using the supplied destroy functions, otherwise you + * have to make sure that any dynamically allocated values are freed + * yourself. + * + * Since: 2.12 + **/ +void +g_hash_table_remove_all (GHashTable *hash_table) +{ + g_return_if_fail (hash_table != NULL); + +#ifndef G_DISABLE_ASSERT + if (hash_table->nnodes != 0) + hash_table->version++; +#endif + + g_hash_table_remove_all_nodes (hash_table, TRUE); + g_hash_table_maybe_resize (hash_table); +} + +/** + * g_hash_table_steal_all: + * @hash_table: a #GHashTable. + * + * Removes all keys and their associated values from a #GHashTable + * without calling the key and value destroy functions. + * + * Since: 2.12 + **/ +void +g_hash_table_steal_all (GHashTable *hash_table) +{ + g_return_if_fail (hash_table != NULL); + +#ifndef G_DISABLE_ASSERT + if (hash_table->nnodes != 0) + hash_table->version++; +#endif + + g_hash_table_remove_all_nodes (hash_table, FALSE); + g_hash_table_maybe_resize (hash_table); +} + +/* + * g_hash_table_foreach_remove_or_steal: + * @hash_table: our #GHashTable + * @func: the user's callback function + * @user_data: data for @func + * @notify: %TRUE if the destroy notify handlers are to be called + * + * Implements the common logic for g_hash_table_foreach_remove() and + * g_hash_table_foreach_steal(). + * + * Iterates over every node in the table, calling @func with the key + * and value of the node (and @user_data). If @func returns %TRUE the + * node is removed from the table. + * + * If @notify is true then the destroy notify handlers will be called + * for each removed node. + */ +static guint +g_hash_table_foreach_remove_or_steal (GHashTable *hash_table, + GHRFunc func, + gpointer user_data, + gboolean notify) +{ + guint deleted = 0; + gint i; + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1 && (* func) (node->key, node->value, user_data)) + { + g_hash_table_remove_node (hash_table, node, notify); + deleted++; + } + } + + g_hash_table_maybe_resize (hash_table); + +#ifndef G_DISABLE_ASSERT + if (deleted > 0) + hash_table->version++; +#endif + + return deleted; +} + +/** + * g_hash_table_foreach_remove: + * @hash_table: a #GHashTable. + * @func: the function to call for each key/value pair. + * @user_data: user data to pass to the function. + * + * Calls the given function for each key/value pair in the #GHashTable. + * If the function returns %TRUE, then the key/value pair is removed from the + * #GHashTable. If you supplied key or value destroy functions when creating + * the #GHashTable, they are used to free the memory allocated for the removed + * keys and values. + * + * See #GHashTableIter for an alternative way to loop over the + * key/value pairs in the hash table. + * + * Return value: the number of key/value pairs removed. + **/ +guint +g_hash_table_foreach_remove (GHashTable *hash_table, + GHRFunc func, + gpointer user_data) +{ + g_return_val_if_fail (hash_table != NULL, 0); + g_return_val_if_fail (func != NULL, 0); + + return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, TRUE); +} + +/** + * g_hash_table_foreach_steal: + * @hash_table: a #GHashTable. + * @func: the function to call for each key/value pair. + * @user_data: user data to pass to the function. + * + * Calls the given function for each key/value pair in the #GHashTable. + * If the function returns %TRUE, then the key/value pair is removed from the + * #GHashTable, but no key or value destroy functions are called. + * + * See #GHashTableIter for an alternative way to loop over the + * key/value pairs in the hash table. + * + * Return value: the number of key/value pairs removed. + **/ +guint +g_hash_table_foreach_steal (GHashTable *hash_table, + GHRFunc func, + gpointer user_data) +{ + g_return_val_if_fail (hash_table != NULL, 0); + g_return_val_if_fail (func != NULL, 0); + + return g_hash_table_foreach_remove_or_steal (hash_table, func, user_data, FALSE); +} + +/** + * g_hash_table_foreach: + * @hash_table: a #GHashTable. + * @func: the function to call for each key/value pair. + * @user_data: user data to pass to the function. + * + * Calls the given function for each of the key/value pairs in the + * #GHashTable. The function is passed the key and value of each + * pair, and the given @user_data parameter. The hash table may not + * be modified while iterating over it (you can't add/remove + * items). To remove all items matching a predicate, use + * g_hash_table_foreach_remove(). + * + * See g_hash_table_find() for performance caveats for linear + * order searches in contrast to g_hash_table_lookup(). + **/ +void +g_hash_table_foreach (GHashTable *hash_table, + GHFunc func, + gpointer user_data) +{ + gint i; + + g_return_if_fail (hash_table != NULL); + g_return_if_fail (func != NULL); + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1) + (* func) (node->key, node->value, user_data); + } +} + +/** + * g_hash_table_find: + * @hash_table: a #GHashTable. + * @predicate: function to test the key/value pairs for a certain property. + * @user_data: user data to pass to the function. + * + * Calls the given function for key/value pairs in the #GHashTable until + * @predicate returns %TRUE. The function is passed the key and value of + * each pair, and the given @user_data parameter. The hash table may not + * be modified while iterating over it (you can't add/remove items). + * + * Note, that hash tables are really only optimized for forward lookups, + * i.e. g_hash_table_lookup(). + * So code that frequently issues g_hash_table_find() or + * g_hash_table_foreach() (e.g. in the order of once per every entry in a + * hash table) should probably be reworked to use additional or different + * data structures for reverse lookups (keep in mind that an O(n) find/foreach + * operation issued for all n values in a hash table ends up needing O(n*n) + * operations). + * + * Return value: The value of the first key/value pair is returned, for which + * func evaluates to %TRUE. If no pair with the requested property is found, + * %NULL is returned. + * + * Since: 2.4 + **/ +gpointer +g_hash_table_find (GHashTable *hash_table, + GHRFunc predicate, + gpointer user_data) +{ + gint i; + + g_return_val_if_fail (hash_table != NULL, NULL); + g_return_val_if_fail (predicate != NULL, NULL); + + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1 && predicate (node->key, node->value, user_data)) + return node->value; + } + + return NULL; +} + +/** + * g_hash_table_size: + * @hash_table: a #GHashTable. + * + * Returns the number of elements contained in the #GHashTable. + * + * Return value: the number of key/value pairs in the #GHashTable. + **/ +guint +g_hash_table_size (GHashTable *hash_table) +{ + g_return_val_if_fail (hash_table != NULL, 0); + + return hash_table->nnodes; +} + +/** + * g_hash_table_get_keys: + * @hash_table: a #GHashTable + * + * Retrieves every key inside @hash_table. The returned data is valid + * until @hash_table is modified. + * + * Return value: a #GList containing all the keys inside the hash + * table. The content of the list is owned by the hash table and + * should not be modified or freed. Use g_list_free() when done + * using the list. + * + * Since: 2.14 + */ +GList * +g_hash_table_get_keys (GHashTable *hash_table) +{ + gint i; + GList *retval; + + g_return_val_if_fail (hash_table != NULL, NULL); + + retval = NULL; + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1) + retval = g_list_prepend (retval, node->key); + } + + return retval; +} + +/** + * g_hash_table_get_values: + * @hash_table: a #GHashTable + * + * Retrieves every value inside @hash_table. The returned data is + * valid until @hash_table is modified. + * + * Return value: a #GList containing all the values inside the hash + * table. The content of the list is owned by the hash table and + * should not be modified or freed. Use g_list_free() when done + * using the list. + * + * Since: 2.14 + */ +GList * +g_hash_table_get_values (GHashTable *hash_table) +{ + gint i; + GList *retval; + + g_return_val_if_fail (hash_table != NULL, NULL); + + retval = NULL; + for (i = 0; i < hash_table->size; i++) + { + GHashNode *node = &hash_table->nodes [i]; + + if (node->key_hash > 1) + retval = g_list_prepend (retval, node->value); + } + + return retval; +} + +#define __G_HASH_C__ +#include "galiasdef.c" diff --git a/glib/ghash.h b/glib/ghash.h new file mode 100644 index 0000000..9128721 --- /dev/null +++ b/glib/ghash.h @@ -0,0 +1,166 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_HASH_H__ +#define __G_HASH_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GHashTable GHashTable; + +typedef gboolean (*GHRFunc) (gpointer key, + gpointer value, + gpointer user_data); + +typedef struct _GHashTableIter GHashTableIter; + +struct _GHashTableIter +{ + /*< private >*/ + gpointer dummy1; + gpointer dummy2; + gpointer dummy3; + int dummy4; + gboolean dummy5; + gpointer dummy6; +}; + +/* Hash tables + */ +GHashTable* g_hash_table_new (GHashFunc hash_func, + GEqualFunc key_equal_func); +GHashTable* g_hash_table_new_full (GHashFunc hash_func, + GEqualFunc key_equal_func, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func); +void g_hash_table_destroy (GHashTable *hash_table); +void g_hash_table_insert (GHashTable *hash_table, + gpointer key, + gpointer value); +void g_hash_table_replace (GHashTable *hash_table, + gpointer key, + gpointer value); +gboolean g_hash_table_remove (GHashTable *hash_table, + gconstpointer key); +void g_hash_table_remove_all (GHashTable *hash_table); +gboolean g_hash_table_steal (GHashTable *hash_table, + gconstpointer key); +void g_hash_table_steal_all (GHashTable *hash_table); +gpointer g_hash_table_lookup (GHashTable *hash_table, + gconstpointer key); +gboolean g_hash_table_lookup_extended (GHashTable *hash_table, + gconstpointer lookup_key, + gpointer *orig_key, + gpointer *value); +void g_hash_table_foreach (GHashTable *hash_table, + GHFunc func, + gpointer user_data); +gpointer g_hash_table_find (GHashTable *hash_table, + GHRFunc predicate, + gpointer user_data); +guint g_hash_table_foreach_remove (GHashTable *hash_table, + GHRFunc func, + gpointer user_data); +guint g_hash_table_foreach_steal (GHashTable *hash_table, + GHRFunc func, + gpointer user_data); +guint g_hash_table_size (GHashTable *hash_table); +GList * g_hash_table_get_keys (GHashTable *hash_table); +GList * g_hash_table_get_values (GHashTable *hash_table); + +void g_hash_table_iter_init (GHashTableIter *iter, + GHashTable *hash_table); +gboolean g_hash_table_iter_next (GHashTableIter *iter, + gpointer *key, + gpointer *value); +GHashTable* g_hash_table_iter_get_hash_table (GHashTableIter *iter); +void g_hash_table_iter_remove (GHashTableIter *iter); +void g_hash_table_iter_steal (GHashTableIter *iter); + +/* keeping hash tables alive */ +GHashTable* g_hash_table_ref (GHashTable *hash_table); +void g_hash_table_unref (GHashTable *hash_table); + +#ifndef G_DISABLE_DEPRECATED + +/** + * g_hash_table_freeze: + * @hash_table: a #GHashTable + * + * This function is deprecated and will be removed in the next major + * release of GLib. It does nothing. + **/ +#define g_hash_table_freeze(hash_table) ((void)0) + +/** + * g_hash_table_thaw: + * @hash_table: a #GHashTable + * + * This function is deprecated and will be removed in the next major + * release of GLib. It does nothing. + **/ +#define g_hash_table_thaw(hash_table) ((void)0) + +#endif /* G_DISABLE_DEPRECATED */ + +/* Hash Functions + */ +gboolean g_str_equal (gconstpointer v1, + gconstpointer v2); +guint g_str_hash (gconstpointer v); + +gboolean g_int_equal (gconstpointer v1, + gconstpointer v2); +guint g_int_hash (gconstpointer v); + +gboolean g_int64_equal (gconstpointer v1, + gconstpointer v2); +guint g_int64_hash (gconstpointer v); + +gboolean g_double_equal (gconstpointer v1, + gconstpointer v2); +guint g_double_hash (gconstpointer v); + +/* This "hash" function will just return the key's address as an + * unsigned integer. Useful for hashing on plain addresses or + * simple integer values. + * Passing NULL into g_hash_table_new() as GHashFunc has the + * same effect as passing g_direct_hash(). + */ +guint g_direct_hash (gconstpointer v) G_GNUC_CONST; +gboolean g_direct_equal (gconstpointer v1, + gconstpointer v2) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_HASH_H__ */ diff --git a/glib/ghook.c b/glib/ghook.c new file mode 100644 index 0000000..d038ee2 --- /dev/null +++ b/glib/ghook.c @@ -0,0 +1,638 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GHook: Callback maintenance functions + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + + +/* --- functions --- */ +static void +default_finalize_hook (GHookList *hook_list, + GHook *hook) +{ + GDestroyNotify destroy = hook->destroy; + + if (destroy) + { + hook->destroy = NULL; + destroy (hook->data); + } +} + +void +g_hook_list_init (GHookList *hook_list, + guint hook_size) +{ + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_size >= sizeof (GHook)); + + hook_list->seq_id = 1; + hook_list->hook_size = hook_size; + hook_list->is_setup = TRUE; + hook_list->hooks = NULL; + hook_list->dummy3 = NULL; + hook_list->finalize_hook = default_finalize_hook; + hook_list->dummy[0] = NULL; + hook_list->dummy[1] = NULL; +} + +void +g_hook_list_clear (GHookList *hook_list) +{ + g_return_if_fail (hook_list != NULL); + + if (hook_list->is_setup) + { + GHook *hook; + + hook_list->is_setup = FALSE; + + hook = hook_list->hooks; + if (!hook) + { + /* destroy hook_list->hook_memchunk */ + } + else + do + { + GHook *tmp; + + g_hook_ref (hook_list, hook); + g_hook_destroy_link (hook_list, hook); + tmp = hook->next; + g_hook_unref (hook_list, hook); + hook = tmp; + } + while (hook); + } +} + +GHook* +g_hook_alloc (GHookList *hook_list) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + g_return_val_if_fail (hook_list->is_setup, NULL); + + hook = g_slice_alloc0 (hook_list->hook_size); + hook->data = NULL; + hook->next = NULL; + hook->prev = NULL; + hook->flags = G_HOOK_FLAG_ACTIVE; + hook->ref_count = 0; + hook->hook_id = 0; + hook->func = NULL; + hook->destroy = NULL; + + return hook; +} + +void +g_hook_free (GHookList *hook_list, + GHook *hook) +{ + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + g_return_if_fail (hook != NULL); + g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); + g_return_if_fail (!G_HOOK_IN_CALL (hook)); + + if(hook_list->finalize_hook != NULL) + hook_list->finalize_hook (hook_list, hook); + g_slice_free1 (hook_list->hook_size, hook); +} + +void +g_hook_destroy_link (GHookList *hook_list, + GHook *hook) +{ + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook != NULL); + + hook->flags &= ~G_HOOK_FLAG_ACTIVE; + if (hook->hook_id) + { + hook->hook_id = 0; + g_hook_unref (hook_list, hook); /* counterpart to g_hook_insert_before */ + } +} + +gboolean +g_hook_destroy (GHookList *hook_list, + gulong hook_id) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, FALSE); + g_return_val_if_fail (hook_id > 0, FALSE); + + hook = g_hook_get (hook_list, hook_id); + if (hook) + { + g_hook_destroy_link (hook_list, hook); + return TRUE; + } + + return FALSE; +} + +void +g_hook_unref (GHookList *hook_list, + GHook *hook) +{ + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook != NULL); + g_return_if_fail (hook->ref_count > 0); + + hook->ref_count--; + if (!hook->ref_count) + { + g_return_if_fail (hook->hook_id == 0); + g_return_if_fail (!G_HOOK_IN_CALL (hook)); + + if (hook->prev) + hook->prev->next = hook->next; + else + hook_list->hooks = hook->next; + if (hook->next) + { + hook->next->prev = hook->prev; + hook->next = NULL; + } + hook->prev = NULL; + + if (!hook_list->is_setup) + { + hook_list->is_setup = TRUE; + g_hook_free (hook_list, hook); + hook_list->is_setup = FALSE; + + if (!hook_list->hooks) + { + /* destroy hook_list->hook_memchunk */ + } + } + else + g_hook_free (hook_list, hook); + } +} + +GHook * +g_hook_ref (GHookList *hook_list, + GHook *hook) +{ + g_return_val_if_fail (hook_list != NULL, NULL); + g_return_val_if_fail (hook != NULL, NULL); + g_return_val_if_fail (hook->ref_count > 0, NULL); + + hook->ref_count++; + + return hook; +} + +void +g_hook_prepend (GHookList *hook_list, + GHook *hook) +{ + g_return_if_fail (hook_list != NULL); + + g_hook_insert_before (hook_list, hook_list->hooks, hook); +} + +void +g_hook_insert_before (GHookList *hook_list, + GHook *sibling, + GHook *hook) +{ + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + g_return_if_fail (hook != NULL); + g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); + g_return_if_fail (hook->ref_count == 0); + + hook->hook_id = hook_list->seq_id++; + hook->ref_count = 1; /* counterpart to g_hook_destroy_link */ + + if (sibling) + { + if (sibling->prev) + { + hook->prev = sibling->prev; + hook->prev->next = hook; + hook->next = sibling; + sibling->prev = hook; + } + else + { + hook_list->hooks = hook; + hook->next = sibling; + sibling->prev = hook; + } + } + else + { + if (hook_list->hooks) + { + sibling = hook_list->hooks; + while (sibling->next) + sibling = sibling->next; + hook->prev = sibling; + sibling->next = hook; + } + else + hook_list->hooks = hook; + } +} + +void +g_hook_list_invoke (GHookList *hook_list, + gboolean may_recurse) +{ + GHook *hook; + + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + + hook = g_hook_first_valid (hook_list, may_recurse); + while (hook) + { + GHookFunc func; + gboolean was_in_call; + + func = (GHookFunc) hook->func; + + was_in_call = G_HOOK_IN_CALL (hook); + hook->flags |= G_HOOK_FLAG_IN_CALL; + func (hook->data); + if (!was_in_call) + hook->flags &= ~G_HOOK_FLAG_IN_CALL; + + hook = g_hook_next_valid (hook_list, hook, may_recurse); + } +} + +void +g_hook_list_invoke_check (GHookList *hook_list, + gboolean may_recurse) +{ + GHook *hook; + + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + + hook = g_hook_first_valid (hook_list, may_recurse); + while (hook) + { + GHookCheckFunc func; + gboolean was_in_call; + gboolean need_destroy; + + func = (GHookCheckFunc) hook->func; + + was_in_call = G_HOOK_IN_CALL (hook); + hook->flags |= G_HOOK_FLAG_IN_CALL; + need_destroy = !func (hook->data); + if (!was_in_call) + hook->flags &= ~G_HOOK_FLAG_IN_CALL; + if (need_destroy) + g_hook_destroy_link (hook_list, hook); + + hook = g_hook_next_valid (hook_list, hook, may_recurse); + } +} + +void +g_hook_list_marshal_check (GHookList *hook_list, + gboolean may_recurse, + GHookCheckMarshaller marshaller, + gpointer data) +{ + GHook *hook; + + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + g_return_if_fail (marshaller != NULL); + + hook = g_hook_first_valid (hook_list, may_recurse); + while (hook) + { + gboolean was_in_call; + gboolean need_destroy; + + was_in_call = G_HOOK_IN_CALL (hook); + hook->flags |= G_HOOK_FLAG_IN_CALL; + need_destroy = !marshaller (hook, data); + if (!was_in_call) + hook->flags &= ~G_HOOK_FLAG_IN_CALL; + if (need_destroy) + g_hook_destroy_link (hook_list, hook); + + hook = g_hook_next_valid (hook_list, hook, may_recurse); + } +} + +void +g_hook_list_marshal (GHookList *hook_list, + gboolean may_recurse, + GHookMarshaller marshaller, + gpointer data) +{ + GHook *hook; + + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + g_return_if_fail (marshaller != NULL); + + hook = g_hook_first_valid (hook_list, may_recurse); + while (hook) + { + gboolean was_in_call; + + was_in_call = G_HOOK_IN_CALL (hook); + hook->flags |= G_HOOK_FLAG_IN_CALL; + marshaller (hook, data); + if (!was_in_call) + hook->flags &= ~G_HOOK_FLAG_IN_CALL; + + hook = g_hook_next_valid (hook_list, hook, may_recurse); + } +} + +GHook* +g_hook_first_valid (GHookList *hook_list, + gboolean may_be_in_call) +{ + g_return_val_if_fail (hook_list != NULL, NULL); + + if (hook_list->is_setup) + { + GHook *hook; + + hook = hook_list->hooks; + if (hook) + { + g_hook_ref (hook_list, hook); + if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) + return hook; + else + return g_hook_next_valid (hook_list, hook, may_be_in_call); + } + } + + return NULL; +} + +GHook* +g_hook_next_valid (GHookList *hook_list, + GHook *hook, + gboolean may_be_in_call) +{ + GHook *ohook = hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + + if (!hook) + return NULL; + + hook = hook->next; + while (hook) + { + if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) + { + g_hook_ref (hook_list, hook); + g_hook_unref (hook_list, ohook); + + return hook; + } + hook = hook->next; + } + g_hook_unref (hook_list, ohook); + + return NULL; +} + +GHook* +g_hook_get (GHookList *hook_list, + gulong hook_id) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + g_return_val_if_fail (hook_id > 0, NULL); + + hook = hook_list->hooks; + while (hook) + { + if (hook->hook_id == hook_id) + return hook; + hook = hook->next; + } + + return NULL; +} + +GHook* +g_hook_find (GHookList *hook_list, + gboolean need_valids, + GHookFindFunc func, + gpointer data) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + g_return_val_if_fail (func != NULL, NULL); + + hook = hook_list->hooks; + while (hook) + { + GHook *tmp; + + /* test only non-destroyed hooks */ + if (!hook->hook_id) + { + hook = hook->next; + continue; + } + + g_hook_ref (hook_list, hook); + + if (func (hook, data) && hook->hook_id && (!need_valids || G_HOOK_ACTIVE (hook))) + { + g_hook_unref (hook_list, hook); + + return hook; + } + + tmp = hook->next; + g_hook_unref (hook_list, hook); + hook = tmp; + } + + return NULL; +} + +GHook* +g_hook_find_data (GHookList *hook_list, + gboolean need_valids, + gpointer data) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + + hook = hook_list->hooks; + while (hook) + { + /* test only non-destroyed hooks */ + if (hook->data == data && + hook->hook_id && + (!need_valids || G_HOOK_ACTIVE (hook))) + return hook; + + hook = hook->next; + } + + return NULL; +} + +GHook* +g_hook_find_func (GHookList *hook_list, + gboolean need_valids, + gpointer func) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + g_return_val_if_fail (func != NULL, NULL); + + hook = hook_list->hooks; + while (hook) + { + /* test only non-destroyed hooks */ + if (hook->func == func && + hook->hook_id && + (!need_valids || G_HOOK_ACTIVE (hook))) + return hook; + + hook = hook->next; + } + + return NULL; +} + +GHook* +g_hook_find_func_data (GHookList *hook_list, + gboolean need_valids, + gpointer func, + gpointer data) +{ + GHook *hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + g_return_val_if_fail (func != NULL, NULL); + + hook = hook_list->hooks; + while (hook) + { + /* test only non-destroyed hooks */ + if (hook->data == data && + hook->func == func && + hook->hook_id && + (!need_valids || G_HOOK_ACTIVE (hook))) + return hook; + + hook = hook->next; + } + + return NULL; +} + +void +g_hook_insert_sorted (GHookList *hook_list, + GHook *hook, + GHookCompareFunc func) +{ + GHook *sibling; + + g_return_if_fail (hook_list != NULL); + g_return_if_fail (hook_list->is_setup); + g_return_if_fail (hook != NULL); + g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); + g_return_if_fail (hook->func != NULL); + g_return_if_fail (func != NULL); + + /* first non-destroyed hook */ + sibling = hook_list->hooks; + while (sibling && !sibling->hook_id) + sibling = sibling->next; + + while (sibling) + { + GHook *tmp; + + g_hook_ref (hook_list, sibling); + if (func (hook, sibling) <= 0 && sibling->hook_id) + { + g_hook_unref (hook_list, sibling); + break; + } + + /* next non-destroyed hook */ + tmp = sibling->next; + while (tmp && !tmp->hook_id) + tmp = tmp->next; + + g_hook_unref (hook_list, sibling); + sibling = tmp; + } + + g_hook_insert_before (hook_list, sibling, hook); +} + +gint +g_hook_compare_ids (GHook *new_hook, + GHook *sibling) +{ + if (new_hook->hook_id < sibling->hook_id) + return -1; + else if (new_hook->hook_id > sibling->hook_id) + return 1; + + return 0; +} + +#define __G_HOOK_C__ +#include "galiasdef.c" diff --git a/glib/ghook.h b/glib/ghook.h new file mode 100644 index 0000000..5577fc3 --- /dev/null +++ b/glib/ghook.h @@ -0,0 +1,181 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_HOOK_H__ +#define __G_HOOK_H__ + +#include + +G_BEGIN_DECLS + + +/* --- typedefs --- */ +typedef struct _GHook GHook; +typedef struct _GHookList GHookList; + +typedef gint (*GHookCompareFunc) (GHook *new_hook, + GHook *sibling); +typedef gboolean (*GHookFindFunc) (GHook *hook, + gpointer data); +typedef void (*GHookMarshaller) (GHook *hook, + gpointer marshal_data); +typedef gboolean (*GHookCheckMarshaller) (GHook *hook, + gpointer marshal_data); +typedef void (*GHookFunc) (gpointer data); +typedef gboolean (*GHookCheckFunc) (gpointer data); +typedef void (*GHookFinalizeFunc) (GHookList *hook_list, + GHook *hook); +typedef enum +{ + G_HOOK_FLAG_ACTIVE = 1 << 0, + G_HOOK_FLAG_IN_CALL = 1 << 1, + G_HOOK_FLAG_MASK = 0x0f +} GHookFlagMask; +#define G_HOOK_FLAG_USER_SHIFT (4) + + +/* --- structures --- */ +struct _GHookList +{ + gulong seq_id; + guint hook_size : 16; + guint is_setup : 1; + GHook *hooks; + gpointer dummy3; + GHookFinalizeFunc finalize_hook; + gpointer dummy[2]; +}; +struct _GHook +{ + gpointer data; + GHook *next; + GHook *prev; + guint ref_count; + gulong hook_id; + guint flags; + gpointer func; + GDestroyNotify destroy; +}; + + +/* --- macros --- */ +#define G_HOOK(hook) ((GHook*) (hook)) +#define G_HOOK_FLAGS(hook) (G_HOOK (hook)->flags) +#define G_HOOK_ACTIVE(hook) ((G_HOOK_FLAGS (hook) & \ + G_HOOK_FLAG_ACTIVE) != 0) +#define G_HOOK_IN_CALL(hook) ((G_HOOK_FLAGS (hook) & \ + G_HOOK_FLAG_IN_CALL) != 0) +#define G_HOOK_IS_VALID(hook) (G_HOOK (hook)->hook_id != 0 && \ + (G_HOOK_FLAGS (hook) & \ + G_HOOK_FLAG_ACTIVE)) +#define G_HOOK_IS_UNLINKED(hook) (G_HOOK (hook)->next == NULL && \ + G_HOOK (hook)->prev == NULL && \ + G_HOOK (hook)->hook_id == 0 && \ + G_HOOK (hook)->ref_count == 0) + + +/* --- prototypes --- */ +/* callback maintenance functions */ +void g_hook_list_init (GHookList *hook_list, + guint hook_size); +void g_hook_list_clear (GHookList *hook_list); +GHook* g_hook_alloc (GHookList *hook_list); +void g_hook_free (GHookList *hook_list, + GHook *hook); +GHook * g_hook_ref (GHookList *hook_list, + GHook *hook); +void g_hook_unref (GHookList *hook_list, + GHook *hook); +gboolean g_hook_destroy (GHookList *hook_list, + gulong hook_id); +void g_hook_destroy_link (GHookList *hook_list, + GHook *hook); +void g_hook_prepend (GHookList *hook_list, + GHook *hook); +void g_hook_insert_before (GHookList *hook_list, + GHook *sibling, + GHook *hook); +void g_hook_insert_sorted (GHookList *hook_list, + GHook *hook, + GHookCompareFunc func); +GHook* g_hook_get (GHookList *hook_list, + gulong hook_id); +GHook* g_hook_find (GHookList *hook_list, + gboolean need_valids, + GHookFindFunc func, + gpointer data); +GHook* g_hook_find_data (GHookList *hook_list, + gboolean need_valids, + gpointer data); +GHook* g_hook_find_func (GHookList *hook_list, + gboolean need_valids, + gpointer func); +GHook* g_hook_find_func_data (GHookList *hook_list, + gboolean need_valids, + gpointer func, + gpointer data); +/* return the first valid hook, and increment its reference count */ +GHook* g_hook_first_valid (GHookList *hook_list, + gboolean may_be_in_call); +/* return the next valid hook with incremented reference count, and + * decrement the reference count of the original hook + */ +GHook* g_hook_next_valid (GHookList *hook_list, + GHook *hook, + gboolean may_be_in_call); +/* GHookCompareFunc implementation to insert hooks sorted by their id */ +gint g_hook_compare_ids (GHook *new_hook, + GHook *sibling); +/* convenience macros */ +#define g_hook_append( hook_list, hook ) \ + g_hook_insert_before ((hook_list), NULL, (hook)) +/* invoke all valid hooks with the (*GHookFunc) signature. + */ +void g_hook_list_invoke (GHookList *hook_list, + gboolean may_recurse); +/* invoke all valid hooks with the (*GHookCheckFunc) signature, + * and destroy the hook if FALSE is returned. + */ +void g_hook_list_invoke_check (GHookList *hook_list, + gboolean may_recurse); +/* invoke a marshaller on all valid hooks. + */ +void g_hook_list_marshal (GHookList *hook_list, + gboolean may_recurse, + GHookMarshaller marshaller, + gpointer marshal_data); +void g_hook_list_marshal_check (GHookList *hook_list, + gboolean may_recurse, + GHookCheckMarshaller marshaller, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __G_HOOK_H__ */ diff --git a/glib/ghostutils.c b/glib/ghostutils.c new file mode 100644 index 0000000..3871456 --- /dev/null +++ b/glib/ghostutils.c @@ -0,0 +1,769 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "glib.h" +#include "glibintl.h" + +#include + +#include "galias.h" + +/** + * SECTION:ghostutils + * @short_description: Internet hostname utilities + * @include: glib.h + * + * Functions for manipulating internet hostnames; in particular, for + * converting between Unicode and ASCII-encoded forms of + * Internationalized Domain Names (IDNs). + * + * The Internationalized Domain + * Names for Applications (IDNA) standards allow for the use + * of Unicode domain names in applications, while providing + * backward-compatibility with the old ASCII-only DNS, by defining an + * ASCII-Compatible Encoding of any given Unicode name, which can be + * used with non-IDN-aware applications and protocols. (For example, + * "Παν語.org" maps to "xn--4wa8awb4637h.org".) + **/ + +#define IDNA_ACE_PREFIX "xn--" +#define IDNA_ACE_PREFIX_LEN 4 + +/* Punycode constants, from RFC 3492. */ + +#define PUNYCODE_BASE 36 +#define PUNYCODE_TMIN 1 +#define PUNYCODE_TMAX 26 +#define PUNYCODE_SKEW 38 +#define PUNYCODE_DAMP 700 +#define PUNYCODE_INITIAL_BIAS 72 +#define PUNYCODE_INITIAL_N 0x80 + +#define PUNYCODE_IS_BASIC(cp) ((guint)(cp) < 0x80) + +/* Encode/decode a single base-36 digit */ +static inline gchar +encode_digit (guint dig) +{ + if (dig < 26) + return dig + 'a'; + else + return dig - 26 + '0'; +} + +static inline guint +decode_digit (gchar dig) +{ + if (dig >= 'A' && dig <= 'Z') + return dig - 'A'; + else if (dig >= 'a' && dig <= 'z') + return dig - 'a'; + else if (dig >= '0' && dig <= '9') + return dig - '0' + 26; + else + return G_MAXUINT; +} + +/* Punycode bias adaptation algorithm, RFC 3492 section 6.1 */ +static guint +adapt (guint delta, + guint numpoints, + gboolean firsttime) +{ + guint k; + + delta = firsttime ? delta / PUNYCODE_DAMP : delta / 2; + delta += delta / numpoints; + + k = 0; + while (delta > ((PUNYCODE_BASE - PUNYCODE_TMIN) * PUNYCODE_TMAX) / 2) + { + delta /= PUNYCODE_BASE - PUNYCODE_TMIN; + k += PUNYCODE_BASE; + } + + return k + ((PUNYCODE_BASE - PUNYCODE_TMIN + 1) * delta / + (delta + PUNYCODE_SKEW)); +} + +/* Punycode encoder, RFC 3492 section 6.3. The algorithm is + * sufficiently bizarre that it's not really worth trying to explain + * here. + */ +static gboolean +punycode_encode (const gchar *input_utf8, + gsize input_utf8_length, + GString *output) +{ + guint delta, handled_chars, num_basic_chars, bias, j, q, k, t, digit; + gunichar n, m, *input; + glong input_length; + gboolean success = FALSE; + + /* Convert from UTF-8 to Unicode code points */ + input = g_utf8_to_ucs4 (input_utf8, input_utf8_length, NULL, + &input_length, NULL); + if (!input) + return FALSE; + + /* Copy basic chars */ + for (j = num_basic_chars = 0; j < input_length; j++) + { + if (PUNYCODE_IS_BASIC (input[j])) + { + g_string_append_c (output, g_ascii_tolower (input[j])); + num_basic_chars++; + } + } + if (num_basic_chars) + g_string_append_c (output, '-'); + + handled_chars = num_basic_chars; + + /* Encode non-basic chars */ + delta = 0; + bias = PUNYCODE_INITIAL_BIAS; + n = PUNYCODE_INITIAL_N; + while (handled_chars < input_length) + { + /* let m = the minimum {non-basic} code point >= n in the input */ + for (m = G_MAXUINT, j = 0; j < input_length; j++) + { + if (input[j] >= n && input[j] < m) + m = input[j]; + } + + if (m - n > (G_MAXUINT - delta) / (handled_chars + 1)) + goto fail; + delta += (m - n) * (handled_chars + 1); + n = m; + + for (j = 0; j < input_length; j++) + { + if (input[j] < n) + { + if (++delta == 0) + goto fail; + } + else if (input[j] == n) + { + q = delta; + for (k = PUNYCODE_BASE; ; k += PUNYCODE_BASE) + { + if (k <= bias) + t = PUNYCODE_TMIN; + else if (k >= bias + PUNYCODE_TMAX) + t = PUNYCODE_TMAX; + else + t = k - bias; + if (q < t) + break; + digit = t + (q - t) % (PUNYCODE_BASE - t); + g_string_append_c (output, encode_digit (digit)); + q = (q - t) / (PUNYCODE_BASE - t); + } + + g_string_append_c (output, encode_digit (q)); + bias = adapt (delta, handled_chars + 1, handled_chars == num_basic_chars); + delta = 0; + handled_chars++; + } + } + + delta++; + n++; + } + + success = TRUE; + + fail: + g_free (input); + return success; +} + +/* From RFC 3454, Table B.1 */ +#define idna_is_junk(ch) ((ch) == 0x00AD || (ch) == 0x1806 || (ch) == 0x200B || (ch) == 0x2060 || (ch) == 0xFEFF || (ch) == 0x034F || (ch) == 0x180B || (ch) == 0x180C || (ch) == 0x180D || (ch) == 0x200C || (ch) == 0x200D || ((ch) >= 0xFE00 && (ch) <= 0xFE0F)) + +/* Scan @str for "junk" and return a cleaned-up string if any junk + * is found. Else return %NULL. + */ +static gchar * +remove_junk (const gchar *str, + gint len) +{ + GString *cleaned = NULL; + const gchar *p; + gunichar ch; + + for (p = str; len == -1 ? *p : p < str + len; p = g_utf8_next_char (p)) + { + ch = g_utf8_get_char (p); + if (idna_is_junk (ch)) + { + if (!cleaned) + { + cleaned = g_string_new (NULL); + g_string_append_len (cleaned, str, p - str); + } + } + else if (cleaned) + g_string_append_unichar (cleaned, ch); + } + + if (cleaned) + return g_string_free (cleaned, FALSE); + else + return NULL; +} + +static inline gboolean +contains_uppercase_letters (const gchar *str, + gint len) +{ + const gchar *p; + + for (p = str; len == -1 ? *p : p < str + len; p = g_utf8_next_char (p)) + { + if (g_unichar_isupper (g_utf8_get_char (p))) + return TRUE; + } + return FALSE; +} + +static inline gboolean +contains_non_ascii (const gchar *str, + gint len) +{ + const gchar *p; + + for (p = str; len == -1 ? *p : p < str + len; p++) + { + if ((guchar)*p > 0x80) + return TRUE; + } + return FALSE; +} + +/* RFC 3454, Appendix C. ish. */ +static inline gboolean +idna_is_prohibited (gunichar ch) +{ + switch (g_unichar_type (ch)) + { + case G_UNICODE_CONTROL: + case G_UNICODE_FORMAT: + case G_UNICODE_UNASSIGNED: + case G_UNICODE_PRIVATE_USE: + case G_UNICODE_SURROGATE: + case G_UNICODE_LINE_SEPARATOR: + case G_UNICODE_PARAGRAPH_SEPARATOR: + case G_UNICODE_SPACE_SEPARATOR: + return TRUE; + + case G_UNICODE_OTHER_SYMBOL: + if (ch == 0xFFFC || ch == 0xFFFD || + (ch >= 0x2FF0 && ch <= 0x2FFB)) + return TRUE; + return FALSE; + + case G_UNICODE_NON_SPACING_MARK: + if (ch == 0x0340 || ch == 0x0341) + return TRUE; + return FALSE; + + default: + return FALSE; + } +} + +/* RFC 3491 IDN cleanup algorithm. */ +static gchar * +nameprep (const gchar *hostname, + gint len) +{ + gchar *name, *tmp = NULL, *p; + + /* It would be nice if we could do this without repeatedly + * allocating strings and converting back and forth between + * gunichars and UTF-8... The code does at least avoid doing most of + * the sub-operations when they would just be equivalent to a + * g_strdup(). + */ + + /* Remove presentation-only characters */ + name = remove_junk (hostname, len); + if (name) + { + tmp = name; + len = -1; + } + else + name = (gchar *)hostname; + + /* Convert to lowercase */ + if (contains_uppercase_letters (name, len)) + { + name = g_utf8_strdown (name, len); + g_free (tmp); + tmp = name; + len = -1; + } + + /* If there are no UTF8 characters, we're done. */ + if (!contains_non_ascii (name, len)) + { + if (name == (gchar *)hostname) + return len == -1 ? g_strdup (hostname) : g_strndup (hostname, len); + else + return name; + } + + /* Normalize */ + name = g_utf8_normalize (name, len, G_NORMALIZE_NFKC); + g_free (tmp); + tmp = name; + + if (!name) + return NULL; + + /* KC normalization may have created more capital letters (eg, + * angstrom -> capital A with ring). So we have to lowercasify a + * second time. (This is more-or-less how the nameprep algorithm + * does it. If tolower(nfkc(tolower(X))) is guaranteed to be the + * same as tolower(nfkc(X)), then we could skip the first tolower, + * but I'm not sure it is.) + */ + if (contains_uppercase_letters (name, -1)) + { + name = g_utf8_strdown (name, -1); + g_free (tmp); + tmp = name; + } + + /* Check for prohibited characters */ + for (p = name; *p; p = g_utf8_next_char (p)) + { + if (idna_is_prohibited (g_utf8_get_char (p))) + { + name = NULL; + g_free (tmp); + goto done; + } + } + + /* FIXME: We're supposed to verify certain constraints on bidi + * characters, but glib does not appear to have that information. + */ + + done: + return name; +} + +/** + * g_hostname_to_ascii: + * @hostname: a valid UTF-8 or ASCII hostname + * + * Converts @hostname to its canonical ASCII form; an ASCII-only + * string containing no uppercase letters and not ending with a + * trailing dot. + * + * Return value: an ASCII hostname, which must be freed, or %NULL if + * @hostname is in some way invalid. + * + * Since: 2.22 + **/ +gchar * +g_hostname_to_ascii (const gchar *hostname) +{ + gchar *name, *label, *p; + GString *out; + gssize llen, oldlen; + gboolean unicode; + + label = name = nameprep (hostname, -1); + if (!name) + return NULL; + + out = g_string_new (NULL); + + do + { + unicode = FALSE; + for (p = label; *p && *p != '.'; p++) + { + if ((guchar)*p > 0x80) + unicode = TRUE; + } + + oldlen = out->len; + llen = p - label; + if (unicode) + { + if (!strncmp (label, IDNA_ACE_PREFIX, IDNA_ACE_PREFIX_LEN)) + goto fail; + + g_string_append (out, IDNA_ACE_PREFIX); + if (!punycode_encode (label, llen, out)) + goto fail; + } + else + g_string_append_len (out, label, llen); + + if (out->len - oldlen > 63) + goto fail; + + label += llen; + if (*label && *++label) + g_string_append_c (out, '.'); + } + while (*label); + + g_free (name); + return g_string_free (out, FALSE); + + fail: + g_free (name); + g_string_free (out, TRUE); + return NULL; +} + +/** + * g_hostname_is_non_ascii: + * @hostname: a hostname + * + * Tests if @hostname contains Unicode characters. If this returns + * %TRUE, you need to encode the hostname with g_hostname_to_ascii() + * before using it in non-IDN-aware contexts. + * + * Note that a hostname might contain a mix of encoded and unencoded + * segments, and so it is possible for g_hostname_is_non_ascii() and + * g_hostname_is_ascii_encoded() to both return %TRUE for a name. + * + * Return value: %TRUE if @hostname contains any non-ASCII characters + * + * Since: 2.22 + **/ +gboolean +g_hostname_is_non_ascii (const gchar *hostname) +{ + return contains_non_ascii (hostname, -1); +} + +/* Punycode decoder, RFC 3492 section 6.2. As with punycode_encode(), + * read the RFC if you want to understand what this is actually doing. + */ +static gboolean +punycode_decode (const gchar *input, + gsize input_length, + GString *output) +{ + GArray *output_chars; + gunichar n; + guint i, bias; + guint oldi, w, k, digit, t; + const gchar *split; + + n = PUNYCODE_INITIAL_N; + i = 0; + bias = PUNYCODE_INITIAL_BIAS; + + split = input + input_length - 1; + while (split > input && *split != '-') + split--; + if (split > input) + { + output_chars = g_array_sized_new (FALSE, FALSE, sizeof (gunichar), + split - input); + input_length -= (split - input) + 1; + while (input < split) + { + gunichar ch = (gunichar)*input++; + if (!PUNYCODE_IS_BASIC (ch)) + goto fail; + g_array_append_val (output_chars, ch); + } + input++; + } + else + output_chars = g_array_new (FALSE, FALSE, sizeof (gunichar)); + + while (input_length) + { + oldi = i; + w = 1; + for (k = PUNYCODE_BASE; ; k += PUNYCODE_BASE) + { + if (!input_length--) + goto fail; + digit = decode_digit (*input++); + if (digit >= PUNYCODE_BASE) + goto fail; + if (digit > (G_MAXUINT - i) / w) + goto fail; + i += digit * w; + if (k <= bias) + t = PUNYCODE_TMIN; + else if (k >= bias + PUNYCODE_TMAX) + t = PUNYCODE_TMAX; + else + t = k - bias; + if (digit < t) + break; + if (w > G_MAXUINT / (PUNYCODE_BASE - t)) + goto fail; + w *= (PUNYCODE_BASE - t); + } + + bias = adapt (i - oldi, output_chars->len + 1, oldi == 0); + + if (i / (output_chars->len + 1) > G_MAXUINT - n) + goto fail; + n += i / (output_chars->len + 1); + i %= (output_chars->len + 1); + + g_array_insert_val (output_chars, i++, n); + } + + for (i = 0; i < output_chars->len; i++) + g_string_append_unichar (output, g_array_index (output_chars, gunichar, i)); + g_array_free (output_chars, TRUE); + return TRUE; + + fail: + g_array_free (output_chars, TRUE); + return FALSE; +} + +/** + * g_hostname_to_unicode: + * @hostname: a valid UTF-8 or ASCII hostname + * + * Converts @hostname to its canonical presentation form; a UTF-8 + * string in Unicode normalization form C, containing no uppercase + * letters, no forbidden characters, and no ASCII-encoded segments, + * and not ending with a trailing dot. + * + * Of course if @hostname is not an internationalized hostname, then + * the canonical presentation form will be entirely ASCII. + * + * Return value: a UTF-8 hostname, which must be freed, or %NULL if + * @hostname is in some way invalid. + * + * Since: 2.22 + **/ +gchar * +g_hostname_to_unicode (const gchar *hostname) +{ + GString *out; + gssize llen; + + out = g_string_new (NULL); + + do + { + llen = strcspn (hostname, "."); + if (!g_ascii_strncasecmp (hostname, IDNA_ACE_PREFIX, IDNA_ACE_PREFIX_LEN)) + { + hostname += IDNA_ACE_PREFIX_LEN; + llen -= IDNA_ACE_PREFIX_LEN; + if (!punycode_decode (hostname, llen, out)) + { + g_string_free (out, TRUE); + return NULL; + } + } + else + { + gchar *canonicalized = nameprep (hostname, llen); + + if (!canonicalized) + { + g_string_free (out, TRUE); + return NULL; + } + g_string_append (out, canonicalized); + g_free (canonicalized); + } + + hostname += llen; + if (*hostname && *++hostname) + g_string_append_c (out, '.'); + } + while (*hostname); + + return g_string_free (out, FALSE); +} + +/** + * g_hostname_is_ascii_encoded: + * @hostname: a hostname + * + * Tests if @hostname contains segments with an ASCII-compatible + * encoding of an Internationalized Domain Name. If this returns + * %TRUE, you should decode the hostname with g_hostname_to_unicode() + * before displaying it to the user. + * + * Note that a hostname might contain a mix of encoded and unencoded + * segments, and so it is possible for g_hostname_is_non_ascii() and + * g_hostname_is_ascii_encoded() to both return %TRUE for a name. + * + * Return value: %TRUE if @hostname contains any ASCII-encoded + * segments. + * + * Since: 2.22 + **/ +gboolean +g_hostname_is_ascii_encoded (const gchar *hostname) +{ + while (1) + { + if (!g_ascii_strncasecmp (hostname, IDNA_ACE_PREFIX, IDNA_ACE_PREFIX_LEN)) + return TRUE; + hostname = strchr (hostname, '.'); + if (!hostname++) + return FALSE; + } +} + +/** + * g_hostname_is_ip_address: + * @hostname: a hostname (or IP address in string form) + * + * Tests if @hostname is the string form of an IPv4 or IPv6 address. + * (Eg, "192.168.0.1".) + * + * Return value: %TRUE if @hostname is an IP address + * + * Since: 2.22 + **/ +gboolean +g_hostname_is_ip_address (const gchar *hostname) +{ + gchar *p, *end; + gint nsegments, octet; + + /* On Linux we could implement this using inet_pton, but the Windows + * equivalent of that requires linking against winsock, so we just + * figure this out ourselves. Tested by tests/hostutils.c. + */ + + p = (char *)hostname; + + if (strchr (p, ':')) + { + gboolean skipped; + + /* If it contains a ':', it's an IPv6 address (assuming it's an + * IP address at all). This consists of eight ':'-separated + * segments, each containing a 1-4 digit hex number, except that + * optionally: (a) the last two segments can be replaced by an + * IPv4 address, and (b) a single span of 1 to 8 "0000" segments + * can be replaced with just "::". + */ + + nsegments = 0; + skipped = FALSE; + while (*p && nsegments < 8) + { + /* Each segment after the first must be preceded by a ':'. + * (We also handle half of the "string starts with ::" case + * here.) + */ + if (p != (char *)hostname || (p[0] == ':' && p[1] == ':')) + { + if (*p != ':') + return FALSE; + p++; + } + + /* If there's another ':', it means we're skipping some segments */ + if (*p == ':' && !skipped) + { + skipped = TRUE; + nsegments++; + + /* Handle the "string ends with ::" case */ + if (!p[1]) + p++; + + continue; + } + + /* Read the segment, make sure it's valid. */ + for (end = p; g_ascii_isxdigit (*end); end++) + ; + if (end == p || end > p + 4) + return FALSE; + + if (*end == '.') + { + if ((nsegments == 6 && !skipped) || (nsegments <= 6 && skipped)) + goto parse_ipv4; + else + return FALSE; + } + + nsegments++; + p = end; + } + + return !*p && (nsegments == 8 || skipped); + } + + parse_ipv4: + + /* Parse IPv4: N.N.N.N, where each N <= 255 and doesn't have leading 0s. */ + for (nsegments = 0; nsegments < 4; nsegments++) + { + if (nsegments != 0) + { + if (*p != '.') + return FALSE; + p++; + } + + /* Check the segment; a little tricker than the IPv6 case since + * we can't allow extra leading 0s, and we can't assume that all + * strings of valid length are within range. + */ + octet = 0; + if (*p == '0') + end = p + 1; + else + { + for (end = p; g_ascii_isdigit (*end); end++) + octet = 10 * octet + (*end - '0'); + } + if (end == p || end > p + 3 || octet > 255) + return FALSE; + + p = end; + } + + /* If there's nothing left to parse, then it's ok. */ + return !*p; +} + +#define __G_HOST_UTILS_C__ +#include "galiasdef.c" diff --git a/glib/ghostutils.h b/glib/ghostutils.h new file mode 100644 index 0000000..0349da3 --- /dev/null +++ b/glib/ghostutils.h @@ -0,0 +1,40 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_HOST_UTILS_H__ +#define __G_HOST_UTILS_H__ + +#include + +G_BEGIN_DECLS + +gboolean g_hostname_is_non_ascii (const gchar *hostname); +gboolean g_hostname_is_ascii_encoded (const gchar *hostname); +gboolean g_hostname_is_ip_address (const gchar *hostname); + +gchar *g_hostname_to_ascii (const gchar *hostname); +gchar *g_hostname_to_unicode (const gchar *hostname); + +G_END_DECLS + +#endif /* __G_HOST_UTILS_H__ */ diff --git a/glib/gi18n-lib.h b/glib/gi18n-lib.h new file mode 100644 index 0000000..ca002a7 --- /dev/null +++ b/glib/gi18n-lib.h @@ -0,0 +1,38 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_I18N_LIB_H__ +#define __G_I18N_LIB_H__ + +#include + +#include +#include + +#ifndef GETTEXT_PACKAGE +#error You must define GETTEXT_PACKAGE before including gi18n-lib.h. Did you forget to include config.h? +#endif + +#define _(String) ((char *) g_dgettext (GETTEXT_PACKAGE, String)) +#define Q_(String) g_dpgettext (GETTEXT_PACKAGE, String, 0) +#define N_(String) (String) +#define C_(Context,String) g_dpgettext (GETTEXT_PACKAGE, Context "\004" String, strlen (Context) + 1) +#define NC_(Context, String) (String) + +#endif /* __G_I18N_LIB_H__ */ diff --git a/glib/gi18n.h b/glib/gi18n.h new file mode 100644 index 0000000..c710046 --- /dev/null +++ b/glib/gi18n.h @@ -0,0 +1,34 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_I18N_H__ +#define __G_I18N_H__ + +#include + +#include +#include + +#define _(String) gettext (String) +#define Q_(String) g_dpgettext (NULL, String, 0) +#define N_(String) (String) +#define C_(Context,String) g_dpgettext (NULL, Context "\004" String, strlen (Context) + 1) +#define NC_(Context, String) (String) + +#endif /* __G_I18N_H__ */ diff --git a/glib/giochannel.c b/glib/giochannel.c new file mode 100644 index 0000000..68acd60 --- /dev/null +++ b/glib/giochannel.c @@ -0,0 +1,2584 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * giochannel.c: IO Channel abstraction + * Copyright 1998 Owen Taylor + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#undef G_DISABLE_DEPRECATED + +#include "glib.h" + +#include "giochannel.h" + +#include "glibintl.h" + +#include "galias.h" + +/** + * SECTION: iochannels + * @title: IO Channels + * @short_description: portable support for using files, pipes and + * sockets + * @see_also: + * g_io_add_watch(), g_io_add_watch_full(), + * g_source_remove() Convenience + * functions for creating #GIOChannel instances and adding + * them to the main + * event loop. + * + * + * The #GIOChannel data type aims to provide a portable method for + * using file descriptors, pipes, and sockets, and integrating them + * into the main event + * loop. Currently full support is available on UNIX platforms, + * support for Windows is only partially complete. + * + * To create a new #GIOChannel on UNIX systems use + * g_io_channel_unix_new(). This works for plain file descriptors, + * pipes and sockets. Alternatively, a channel can be created for a + * file in a system independent manner using g_io_channel_new_file(). + * + * Once a #GIOChannel has been created, it can be used in a generic + * manner with the functions g_io_channel_read_chars(), + * g_io_channel_write_chars(), g_io_channel_seek_position(), and + * g_io_channel_shutdown(). + * + * To add a #GIOChannel to the main event loop use + * g_io_add_watch() or g_io_add_watch_full(). Here you specify which + * events you are interested in on the #GIOChannel, and provide a + * function to be called whenever these events occur. + * + * #GIOChannel instances are created with an initial reference count of + * 1. g_io_channel_ref() and g_io_channel_unref() can be used to + * increment or decrement the reference count respectively. When the + * reference count falls to 0, the #GIOChannel is freed. (Though it + * isn't closed automatically, unless it was created using + * g_io_channel_new_from_file().) Using g_io_add_watch() or + * g_io_add_watch_full() increments a channel's reference count. + * + * The new functions g_io_channel_read_chars(), + * g_io_channel_read_line(), g_io_channel_read_line_string(), + * g_io_channel_read_to_end(), g_io_channel_write_chars(), + * g_io_channel_seek_position(), and g_io_channel_flush() should not be + * mixed with the deprecated functions g_io_channel_read(), + * g_io_channel_write(), and g_io_channel_seek() on the same channel. + **/ + +/** + * GIOChannel: + * + * A data structure representing an IO Channel. The fields should be + * considered private and should only be accessed with the following + * functions. + **/ + +/** + * GIOFuncs: + * @io_read: reads raw bytes from the channel. This is called from + * various functions such as g_io_channel_read_chars() to + * read raw bytes from the channel. Encoding and buffering + * issues are dealt with at a higher level. + * @io_write: writes raw bytes to the channel. This is called from + * various functions such as g_io_channel_write_chars() to + * write raw bytes to the channel. Encoding and buffering + * issues are dealt with at a higher level. + * @io_seek: (optional) seeks the channel. This is called from + * g_io_channel_seek() on channels that support it. + * @io_close: closes the channel. This is called from + * g_io_channel_close() after flushing the buffers. + * @io_create_watch: creates a watch on the channel. This call + * corresponds directly to g_io_create_watch(). + * @io_free: called from g_io_channel_unref() when the channel needs to + * be freed. This function must free the memory associated + * with the channel, including freeing the #GIOChannel + * structure itself. The channel buffers have been flushed + * and possibly @io_close has been called by the time this + * function is called. + * @io_set_flags: sets the #GIOFlags on the channel. This is called + * from g_io_channel_set_flags() with all flags except + * for %G_IO_FLAG_APPEND and %G_IO_FLAG_NONBLOCK masked + * out. + * @io_get_flags: gets the #GIOFlags for the channel. This function + * need only return the %G_IO_FLAG_APPEND and + * %G_IO_FLAG_NONBLOCK flags; g_io_channel_get_flags() + * automatically adds the others as appropriate. + * + * A table of functions used to handle different types of #GIOChannel + * in a generic way. + **/ + +/** + * GIOStatus: + * @G_IO_STATUS_ERROR: An error occurred. + * @G_IO_STATUS_NORMAL: Success. + * @G_IO_STATUS_EOF: End of file. + * @G_IO_STATUS_AGAIN: Resource temporarily unavailable. + * + * Stati returned by most of the #GIOFuncs functions. + **/ + +/** + * GIOError: + * @G_IO_ERROR_NONE: no error + * @G_IO_ERROR_AGAIN: an EAGAIN error occurred + * @G_IO_ERROR_INVAL: an EINVAL error occurred + * @G_IO_ERROR_UNKNOWN: another error occurred + * + * #GIOError is only used by the deprecated functions + * g_io_channel_read(), g_io_channel_write(), and g_io_channel_seek(). + **/ + +#define G_IO_NICE_BUF_SIZE 1024 + +/* This needs to be as wide as the largest character in any possible encoding */ +#define MAX_CHAR_SIZE 10 + +/* Some simplifying macros, which reduce the need to worry whether the + * buffers have been allocated. These also make USE_BUF () an lvalue, + * which is used in g_io_channel_read_to_end (). + */ +#define USE_BUF(channel) ((channel)->encoding ? (channel)->encoded_read_buf \ + : (channel)->read_buf) +#define BUF_LEN(string) ((string) ? (string)->len : 0) + +static GIOError g_io_error_get_from_g_error (GIOStatus status, + GError *err); +static void g_io_channel_purge (GIOChannel *channel); +static GIOStatus g_io_channel_fill_buffer (GIOChannel *channel, + GError **err); +static GIOStatus g_io_channel_read_line_backend (GIOChannel *channel, + gsize *length, + gsize *terminator_pos, + GError **error); + +/** + * g_io_channel_init: + * @channel: a #GIOChannel + * + * Initializes a #GIOChannel struct. + * + * This is called by each of the above functions when creating a + * #GIOChannel, and so is not often needed by the application + * programmer (unless you are creating a new type of #GIOChannel). + */ +void +g_io_channel_init (GIOChannel *channel) +{ + channel->ref_count = 1; + channel->encoding = g_strdup ("UTF-8"); + channel->line_term = NULL; + channel->line_term_len = 0; + channel->buf_size = G_IO_NICE_BUF_SIZE; + channel->read_cd = (GIConv) -1; + channel->write_cd = (GIConv) -1; + channel->read_buf = NULL; /* Lazy allocate buffers */ + channel->encoded_read_buf = NULL; + channel->write_buf = NULL; + channel->partial_write_buf[0] = '\0'; + channel->use_buffer = TRUE; + channel->do_encode = FALSE; + channel->close_on_unref = FALSE; +} + +/** + * g_io_channel_ref: + * @channel: a #GIOChannel + * + * Increments the reference count of a #GIOChannel. + * + * Returns: the @channel that was passed in (since 2.6) + */ +GIOChannel * +g_io_channel_ref (GIOChannel *channel) +{ + g_return_val_if_fail (channel != NULL, NULL); + + g_atomic_int_inc (&channel->ref_count); + + return channel; +} + +/** + * g_io_channel_unref: + * @channel: a #GIOChannel + * + * Decrements the reference count of a #GIOChannel. + */ +void +g_io_channel_unref (GIOChannel *channel) +{ + gboolean is_zero; + + g_return_if_fail (channel != NULL); + + is_zero = g_atomic_int_dec_and_test (&channel->ref_count); + + if (G_UNLIKELY (is_zero)) + { + if (channel->close_on_unref) + g_io_channel_shutdown (channel, TRUE, NULL); + else + g_io_channel_purge (channel); + g_free (channel->encoding); + if (channel->read_cd != (GIConv) -1) + g_iconv_close (channel->read_cd); + if (channel->write_cd != (GIConv) -1) + g_iconv_close (channel->write_cd); + g_free (channel->line_term); + if (channel->read_buf) + g_string_free (channel->read_buf, TRUE); + if (channel->write_buf) + g_string_free (channel->write_buf, TRUE); + if (channel->encoded_read_buf) + g_string_free (channel->encoded_read_buf, TRUE); + channel->funcs->io_free (channel); + } +} + +static GIOError +g_io_error_get_from_g_error (GIOStatus status, + GError *err) +{ + switch (status) + { + case G_IO_STATUS_NORMAL: + case G_IO_STATUS_EOF: + return G_IO_ERROR_NONE; + case G_IO_STATUS_AGAIN: + return G_IO_ERROR_AGAIN; + case G_IO_STATUS_ERROR: + g_return_val_if_fail (err != NULL, G_IO_ERROR_UNKNOWN); + + if (err->domain != G_IO_CHANNEL_ERROR) + return G_IO_ERROR_UNKNOWN; + switch (err->code) + { + case G_IO_CHANNEL_ERROR_INVAL: + return G_IO_ERROR_INVAL; + default: + return G_IO_ERROR_UNKNOWN; + } + default: + g_assert_not_reached (); + } +} + +/** + * g_io_channel_read: + * @channel: a #GIOChannel + * @buf: a buffer to read the data into (which should be at least + * count bytes long) + * @count: the number of bytes to read from the #GIOChannel + * @bytes_read: returns the number of bytes actually read + * + * Reads data from a #GIOChannel. + * + * Return value: %G_IO_ERROR_NONE if the operation was successful. + * + * Deprecated:2.2: Use g_io_channel_read_chars() instead. + **/ +GIOError +g_io_channel_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read) +{ + GError *err = NULL; + GIOError error; + GIOStatus status; + + g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); + g_return_val_if_fail (bytes_read != NULL, G_IO_ERROR_UNKNOWN); + + if (count == 0) + { + if (bytes_read) + *bytes_read = 0; + return G_IO_ERROR_NONE; + } + + g_return_val_if_fail (buf != NULL, G_IO_ERROR_UNKNOWN); + + status = channel->funcs->io_read (channel, buf, count, bytes_read, &err); + + error = g_io_error_get_from_g_error (status, err); + + if (err) + g_error_free (err); + + return error; +} + +/** + * g_io_channel_write: + * @channel: a #GIOChannel + * @buf: the buffer containing the data to write + * @count: the number of bytes to write + * @bytes_written: the number of bytes actually written + * + * Writes data to a #GIOChannel. + * + * Return value: %G_IO_ERROR_NONE if the operation was successful. + * + * Deprecated:2.2: Use g_io_channel_write_chars() instead. + **/ +GIOError +g_io_channel_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written) +{ + GError *err = NULL; + GIOError error; + GIOStatus status; + + g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); + g_return_val_if_fail (bytes_written != NULL, G_IO_ERROR_UNKNOWN); + + status = channel->funcs->io_write (channel, buf, count, bytes_written, &err); + + error = g_io_error_get_from_g_error (status, err); + + if (err) + g_error_free (err); + + return error; +} + +/** + * g_io_channel_seek: + * @channel: a #GIOChannel + * @offset: an offset, in bytes, which is added to the position specified + * by @type + * @type: the position in the file, which can be %G_SEEK_CUR (the current + * position), %G_SEEK_SET (the start of the file), or %G_SEEK_END + * (the end of the file) + * + * Sets the current position in the #GIOChannel, similar to the standard + * library function fseek(). + * + * Return value: %G_IO_ERROR_NONE if the operation was successful. + * + * Deprecated:2.2: Use g_io_channel_seek_position() instead. + **/ +GIOError +g_io_channel_seek (GIOChannel *channel, + gint64 offset, + GSeekType type) +{ + GError *err = NULL; + GIOError error; + GIOStatus status; + + g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN); + g_return_val_if_fail (channel->is_seekable, G_IO_ERROR_UNKNOWN); + + switch (type) + { + case G_SEEK_CUR: + case G_SEEK_SET: + case G_SEEK_END: + break; + default: + g_warning ("g_io_channel_seek: unknown seek type"); + return G_IO_ERROR_UNKNOWN; + } + + status = channel->funcs->io_seek (channel, offset, type, &err); + + error = g_io_error_get_from_g_error (status, err); + + if (err) + g_error_free (err); + + return error; +} + +/* The function g_io_channel_new_file() is prototyped in both + * giounix.c and giowin32.c, so we stick its documentation here. + */ + +/** + * g_io_channel_new_file: + * @filename: A string containing the name of a file + * @mode: One of "r", "w", "a", "r+", "w+", "a+". These have + * the same meaning as in fopen() + * @error: A location to return an error of type %G_FILE_ERROR + * + * Open a file @filename as a #GIOChannel using mode @mode. This + * channel will be closed when the last reference to it is dropped, + * so there is no need to call g_io_channel_close() (though doing + * so will not cause problems, as long as no attempt is made to + * access the channel after it is closed). + * + * Return value: A #GIOChannel on success, %NULL on failure. + **/ + +/** + * g_io_channel_close: + * @channel: A #GIOChannel + * + * Close an IO channel. Any pending data to be written will be + * flushed, ignoring errors. The channel will not be freed until the + * last reference is dropped using g_io_channel_unref(). + * + * Deprecated:2.2: Use g_io_channel_shutdown() instead. + **/ +void +g_io_channel_close (GIOChannel *channel) +{ + GError *err = NULL; + + g_return_if_fail (channel != NULL); + + g_io_channel_purge (channel); + + channel->funcs->io_close (channel, &err); + + if (err) + { /* No way to return the error */ + g_warning ("Error closing channel: %s", err->message); + g_error_free (err); + } + + channel->close_on_unref = FALSE; /* Because we already did */ + channel->is_readable = FALSE; + channel->is_writeable = FALSE; + channel->is_seekable = FALSE; +} + +/** + * g_io_channel_shutdown: + * @channel: a #GIOChannel + * @flush: if %TRUE, flush pending + * @err: location to store a #GIOChannelError + * + * Close an IO channel. Any pending data to be written will be + * flushed if @flush is %TRUE. The channel will not be freed until the + * last reference is dropped using g_io_channel_unref(). + * + * Return value: the status of the operation. + **/ +GIOStatus +g_io_channel_shutdown (GIOChannel *channel, + gboolean flush, + GError **err) +{ + GIOStatus status, result; + GError *tmperr = NULL; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail (err == NULL || *err == NULL, G_IO_STATUS_ERROR); + + if (channel->write_buf && channel->write_buf->len > 0) + { + if (flush) + { + GIOFlags flags; + + /* Set the channel to blocking, to avoid a busy loop + */ + flags = g_io_channel_get_flags (channel); + /* Ignore any errors here, they're irrelevant */ + g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL); + + result = g_io_channel_flush (channel, &tmperr); + } + else + result = G_IO_STATUS_NORMAL; + + g_string_truncate(channel->write_buf, 0); + } + else + result = G_IO_STATUS_NORMAL; + + if (channel->partial_write_buf[0] != '\0') + { + if (flush) + g_warning ("Partial character at end of write buffer not flushed.\n"); + channel->partial_write_buf[0] = '\0'; + } + + status = channel->funcs->io_close (channel, err); + + channel->close_on_unref = FALSE; /* Because we already did */ + channel->is_readable = FALSE; + channel->is_writeable = FALSE; + channel->is_seekable = FALSE; + + if (status != G_IO_STATUS_NORMAL) + { + g_clear_error (&tmperr); + return status; + } + else if (result != G_IO_STATUS_NORMAL) + { + g_propagate_error (err, tmperr); + return result; + } + else + return G_IO_STATUS_NORMAL; +} + +/* This function is used for the final flush on close or unref */ +static void +g_io_channel_purge (GIOChannel *channel) +{ + GError *err = NULL; + GIOStatus status; + + g_return_if_fail (channel != NULL); + + if (channel->write_buf && channel->write_buf->len > 0) + { + GIOFlags flags; + + /* Set the channel to blocking, to avoid a busy loop + */ + flags = g_io_channel_get_flags (channel); + g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL); + + status = g_io_channel_flush (channel, &err); + + if (err) + { /* No way to return the error */ + g_warning ("Error flushing string: %s", err->message); + g_error_free (err); + } + } + + /* Flush these in case anyone tries to close without unrefing */ + + if (channel->read_buf) + g_string_truncate (channel->read_buf, 0); + if (channel->write_buf) + g_string_truncate (channel->write_buf, 0); + if (channel->encoding) + { + if (channel->encoded_read_buf) + g_string_truncate (channel->encoded_read_buf, 0); + + if (channel->partial_write_buf[0] != '\0') + { + g_warning ("Partial character at end of write buffer not flushed.\n"); + channel->partial_write_buf[0] = '\0'; + } + } +} + +/** + * g_io_create_watch: + * @channel: a #GIOChannel to watch + * @condition: conditions to watch for + * + * Creates a #GSource that's dispatched when @condition is met for the + * given @channel. For example, if condition is #G_IO_IN, the source will + * be dispatched when there's data available for reading. + * + * g_io_add_watch() is a simpler interface to this same functionality, for + * the case where you want to add the source to the default main loop context + * at the default priority. + * + * On Windows, polling a #GSource created to watch a channel for a socket + * puts the socket in non-blocking mode. This is a side-effect of the + * implementation and unavoidable. + * + * Returns: a new #GSource + */ +GSource * +g_io_create_watch (GIOChannel *channel, + GIOCondition condition) +{ + g_return_val_if_fail (channel != NULL, NULL); + + return channel->funcs->io_create_watch (channel, condition); +} + +/** + * g_io_add_watch_full: + * @channel: a #GIOChannel + * @priority: the priority of the #GIOChannel source + * @condition: the condition to watch for + * @func: the function to call when the condition is satisfied + * @user_data: user data to pass to @func + * @notify: the function to call when the source is removed + * + * Adds the #GIOChannel into the default main loop context + * with the given priority. + * + * This internally creates a main loop source using g_io_create_watch() + * and attaches it to the main loop context with g_source_attach(). + * You can do these steps manuallt if you need greater control. + * + * Returns: the event source id + */ +guint +g_io_add_watch_full (GIOChannel *channel, + gint priority, + GIOCondition condition, + GIOFunc func, + gpointer user_data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (channel != NULL, 0); + + source = g_io_create_watch (channel, condition); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + g_source_set_callback (source, (GSourceFunc)func, user_data, notify); + + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_io_add_watch: + * @channel: a #GIOChannel + * @condition: the condition to watch for + * @func: the function to call when the condition is satisfied + * @user_data: user data to pass to @func + * + * Adds the #GIOChannel into the default main loop context + * with the default priority. + * + * Returns: the event source id + */ +/** + * GIOFunc: + * @source: the #GIOChannel event source + * @condition: the condition which has been satisfied + * @data: user data set in g_io_add_watch() or g_io_add_watch_full() + * @Returns: the function should return %FALSE if the event source + * should be removed + * + * Specifies the type of function passed to g_io_add_watch() or + * g_io_add_watch_full(), which is called when the requested condition + * on a #GIOChannel is satisfied. + **/ +/** + * GIOCondition: + * @G_IO_IN: There is data to read. + * @G_IO_OUT: Data can be written (without blocking). + * @G_IO_PRI: There is urgent data to read. + * @G_IO_ERR: Error condition. + * @G_IO_HUP: Hung up (the connection has been broken, usually for + * pipes and sockets). + * @G_IO_NVAL: Invalid request. The file descriptor is not open. + * + * A bitwise combination representing a condition to watch for on an + * event source. + **/ +guint +g_io_add_watch (GIOChannel *channel, + GIOCondition condition, + GIOFunc func, + gpointer user_data) +{ + return g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, condition, func, user_data, NULL); +} + +/** + * g_io_channel_get_buffer_condition: + * @channel: A #GIOChannel + * + * This function returns a #GIOCondition depending on whether there + * is data to be read/space to write data in the internal buffers in + * the #GIOChannel. Only the flags %G_IO_IN and %G_IO_OUT may be set. + * + * Return value: A #GIOCondition + **/ +GIOCondition +g_io_channel_get_buffer_condition (GIOChannel *channel) +{ + GIOCondition condition = 0; + + if (channel->encoding) + { + if (channel->encoded_read_buf && (channel->encoded_read_buf->len > 0)) + condition |= G_IO_IN; /* Only return if we have full characters */ + } + else + { + if (channel->read_buf && (channel->read_buf->len > 0)) + condition |= G_IO_IN; + } + + if (channel->write_buf && (channel->write_buf->len < channel->buf_size)) + condition |= G_IO_OUT; + + return condition; +} + +/** + * g_io_channel_error_from_errno: + * @en: an errno error number, e.g. %EINVAL + * + * Converts an errno error number to a #GIOChannelError. + * + * Return value: a #GIOChannelError error number, e.g. + * %G_IO_CHANNEL_ERROR_INVAL. + **/ +GIOChannelError +g_io_channel_error_from_errno (gint en) +{ +#ifdef EAGAIN + g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED); +#endif + + switch (en) + { +#ifdef EBADF + case EBADF: + g_warning("Invalid file descriptor.\n"); + return G_IO_CHANNEL_ERROR_FAILED; +#endif + +#ifdef EFAULT + case EFAULT: + g_warning("Buffer outside valid address space.\n"); + return G_IO_CHANNEL_ERROR_FAILED; +#endif + +#ifdef EFBIG + case EFBIG: + return G_IO_CHANNEL_ERROR_FBIG; +#endif + +#ifdef EINTR + /* In general, we should catch EINTR before we get here, + * but close() is allowed to return EINTR by POSIX, so + * we need to catch it here; EINTR from close() is + * unrecoverable, because it's undefined whether + * the fd was actually closed or not, so we just return + * a generic error code. + */ + case EINTR: + return G_IO_CHANNEL_ERROR_FAILED; +#endif + +#ifdef EINVAL + case EINVAL: + return G_IO_CHANNEL_ERROR_INVAL; +#endif + +#ifdef EIO + case EIO: + return G_IO_CHANNEL_ERROR_IO; +#endif + +#ifdef EISDIR + case EISDIR: + return G_IO_CHANNEL_ERROR_ISDIR; +#endif + +#ifdef ENOSPC + case ENOSPC: + return G_IO_CHANNEL_ERROR_NOSPC; +#endif + +#ifdef ENXIO + case ENXIO: + return G_IO_CHANNEL_ERROR_NXIO; +#endif + +#ifdef EOVERFLOW + case EOVERFLOW: + return G_IO_CHANNEL_ERROR_OVERFLOW; +#endif + +#ifdef EPIPE + case EPIPE: + return G_IO_CHANNEL_ERROR_PIPE; +#endif + + default: + return G_IO_CHANNEL_ERROR_FAILED; + } +} + +/** + * g_io_channel_set_buffer_size: + * @channel: a #GIOChannel + * @size: the size of the buffer, or 0 to let GLib pick a good size + * + * Sets the buffer size. + **/ +void +g_io_channel_set_buffer_size (GIOChannel *channel, + gsize size) +{ + g_return_if_fail (channel != NULL); + + if (size == 0) + size = G_IO_NICE_BUF_SIZE; + + if (size < MAX_CHAR_SIZE) + size = MAX_CHAR_SIZE; + + channel->buf_size = size; +} + +/** + * g_io_channel_get_buffer_size: + * @channel: a #GIOChannel + * + * Gets the buffer size. + * + * Return value: the size of the buffer. + **/ +gsize +g_io_channel_get_buffer_size (GIOChannel *channel) +{ + g_return_val_if_fail (channel != NULL, 0); + + return channel->buf_size; +} + +/** + * g_io_channel_set_line_term: + * @channel: a #GIOChannel + * @line_term: The line termination string. Use %NULL for autodetect. + * Autodetection breaks on "\n", "\r\n", "\r", "\0", and + * the Unicode paragraph separator. Autodetection should + * not be used for anything other than file-based channels. + * @length: The length of the termination string. If -1 is passed, the + * string is assumed to be nul-terminated. This option allows + * termination strings with embedded nuls. + * + * This sets the string that #GIOChannel uses to determine + * where in the file a line break occurs. + **/ +void +g_io_channel_set_line_term (GIOChannel *channel, + const gchar *line_term, + gint length) +{ + g_return_if_fail (channel != NULL); + g_return_if_fail (line_term == NULL || length != 0); /* Disallow "" */ + + if (line_term == NULL) + length = 0; + else if (length < 0) + length = strlen (line_term); + + g_free (channel->line_term); + channel->line_term = line_term ? g_memdup (line_term, length) : NULL; + channel->line_term_len = length; +} + +/** + * g_io_channel_get_line_term: + * @channel: a #GIOChannel + * @length: a location to return the length of the line terminator + * + * This returns the string that #GIOChannel uses to determine + * where in the file a line break occurs. A value of %NULL + * indicates autodetection. + * + * Return value: The line termination string. This value + * is owned by GLib and must not be freed. + **/ +G_CONST_RETURN gchar* +g_io_channel_get_line_term (GIOChannel *channel, + gint *length) +{ + g_return_val_if_fail (channel != NULL, NULL); + + if (length) + *length = channel->line_term_len; + + return channel->line_term; +} + +/** + * g_io_channel_set_flags: + * @channel: a #GIOChannel + * @flags: the flags to set on the IO channel + * @error: A location to return an error of type #GIOChannelError + * + * Sets the (writeable) flags in @channel to (@flags & %G_IO_CHANNEL_SET_MASK). + * + * Return value: the status of the operation. + **/ +/** + * GIOFlags: + * @G_IO_FLAG_APPEND: turns on append mode, corresponds to %O_APPEND + * (see the documentation of the UNIX open() + * syscall). + * @G_IO_FLAG_NONBLOCK: turns on nonblocking mode, corresponds to + * %O_NONBLOCK/%O_NDELAY (see the documentation of + * the UNIX open() syscall). + * @G_IO_FLAG_IS_READABLE: indicates that the io channel is readable. + * This flag can not be changed. + * @G_IO_FLAG_IS_WRITEABLE: indicates that the io channel is writable. + * This flag can not be changed. + * @G_IO_FLAG_IS_SEEKABLE: indicates that the io channel is seekable, + * i.e. that g_io_channel_seek_position() can + * be used on it. This flag can not be changed. + * @G_IO_FLAG_MASK: the mask that specifies all the valid flags. + * @G_IO_FLAG_GET_MASK: the mask of the flags that are returned from + * g_io_channel_get_flags(). + * @G_IO_FLAG_SET_MASK: the mask of the flags that the user can modify + * with g_io_channel_set_flags(). + * + * Specifies properties of a #GIOChannel. Some of the flags can only be + * read with g_io_channel_get_flags(), but not changed with + * g_io_channel_set_flags(). + **/ +GIOStatus +g_io_channel_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **error) +{ + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + + return (*channel->funcs->io_set_flags) (channel, + flags & G_IO_FLAG_SET_MASK, + error); +} + +/** + * g_io_channel_get_flags: + * @channel: a #GIOChannel + * + * Gets the current flags for a #GIOChannel, including read-only + * flags such as %G_IO_FLAG_IS_READABLE. + * + * The values of the flags %G_IO_FLAG_IS_READABLE and %G_IO_FLAG_IS_WRITEABLE + * are cached for internal use by the channel when it is created. + * If they should change at some later point (e.g. partial shutdown + * of a socket with the UNIX shutdown() function), the user + * should immediately call g_io_channel_get_flags() to update + * the internal values of these flags. + * + * Return value: the flags which are set on the channel + **/ +GIOFlags +g_io_channel_get_flags (GIOChannel *channel) +{ + GIOFlags flags; + + g_return_val_if_fail (channel != NULL, 0); + + flags = (* channel->funcs->io_get_flags) (channel); + + /* Cross implementation code */ + + if (channel->is_seekable) + flags |= G_IO_FLAG_IS_SEEKABLE; + if (channel->is_readable) + flags |= G_IO_FLAG_IS_READABLE; + if (channel->is_writeable) + flags |= G_IO_FLAG_IS_WRITEABLE; + + return flags; +} + +/** + * g_io_channel_set_close_on_unref: + * @channel: a #GIOChannel + * @do_close: Whether to close the channel on the final unref of + * the GIOChannel data structure. The default value of + * this is %TRUE for channels created by g_io_channel_new_file (), + * and %FALSE for all other channels. + * + * Setting this flag to %TRUE for a channel you have already closed + * can cause problems. + **/ +void +g_io_channel_set_close_on_unref (GIOChannel *channel, + gboolean do_close) +{ + g_return_if_fail (channel != NULL); + + channel->close_on_unref = do_close; +} + +/** + * g_io_channel_get_close_on_unref: + * @channel: a #GIOChannel. + * + * Returns whether the file/socket/whatever associated with @channel + * will be closed when @channel receives its final unref and is + * destroyed. The default value of this is %TRUE for channels created + * by g_io_channel_new_file (), and %FALSE for all other channels. + * + * Return value: Whether the channel will be closed on the final unref of + * the GIOChannel data structure. + **/ +gboolean +g_io_channel_get_close_on_unref (GIOChannel *channel) +{ + g_return_val_if_fail (channel != NULL, FALSE); + + return channel->close_on_unref; +} + +/** + * g_io_channel_seek_position: + * @channel: a #GIOChannel + * @offset: The offset in bytes from the position specified by @type + * @type: a #GSeekType. The type %G_SEEK_CUR is only allowed in those + * cases where a call to g_io_channel_set_encoding () + * is allowed. See the documentation for + * g_io_channel_set_encoding () for details. + * @error: A location to return an error of type #GIOChannelError + * + * Replacement for g_io_channel_seek() with the new API. + * + * Return value: the status of the operation. + **/ +/** + * GSeekType: + * @G_SEEK_CUR: the current position in the file. + * @G_SEEK_SET: the start of the file. + * @G_SEEK_END: the end of the file. + * + * An enumeration specifying the base position for a + * g_io_channel_seek_position() operation. + **/ +GIOStatus +g_io_channel_seek_position (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **error) +{ + GIOStatus status; + + /* For files, only one of the read and write buffers can contain data. + * For sockets, both can contain data. + */ + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_seekable, G_IO_STATUS_ERROR); + + switch (type) + { + case G_SEEK_CUR: /* The user is seeking relative to the head of the buffer */ + if (channel->use_buffer) + { + if (channel->do_encode && channel->encoded_read_buf + && channel->encoded_read_buf->len > 0) + { + g_warning ("Seek type G_SEEK_CUR not allowed for this" + " channel's encoding.\n"); + return G_IO_STATUS_ERROR; + } + if (channel->read_buf) + offset -= channel->read_buf->len; + if (channel->encoded_read_buf) + { + g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode); + + /* If there's anything here, it's because the encoding is UTF-8, + * so we can just subtract the buffer length, the same as for + * the unencoded data. + */ + + offset -= channel->encoded_read_buf->len; + } + } + break; + case G_SEEK_SET: + case G_SEEK_END: + break; + default: + g_warning ("g_io_channel_seek_position: unknown seek type"); + return G_IO_STATUS_ERROR; + } + + if (channel->use_buffer) + { + status = g_io_channel_flush (channel, error); + if (status != G_IO_STATUS_NORMAL) + return status; + } + + status = channel->funcs->io_seek (channel, offset, type, error); + + if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer)) + { + if (channel->read_buf) + g_string_truncate (channel->read_buf, 0); + + /* Conversion state no longer matches position in file */ + if (channel->read_cd != (GIConv) -1) + g_iconv (channel->read_cd, NULL, NULL, NULL, NULL); + if (channel->write_cd != (GIConv) -1) + g_iconv (channel->write_cd, NULL, NULL, NULL, NULL); + + if (channel->encoded_read_buf) + { + g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode); + g_string_truncate (channel->encoded_read_buf, 0); + } + + if (channel->partial_write_buf[0] != '\0') + { + g_warning ("Partial character at end of write buffer not flushed.\n"); + channel->partial_write_buf[0] = '\0'; + } + } + + return status; +} + +/** + * g_io_channel_flush: + * @channel: a #GIOChannel + * @error: location to store an error of type #GIOChannelError + * + * Flushes the write buffer for the GIOChannel. + * + * Return value: the status of the operation: One of + * #G_IO_STATUS_NORMAL, #G_IO_STATUS_AGAIN, or + * #G_IO_STATUS_ERROR. + **/ +GIOStatus +g_io_channel_flush (GIOChannel *channel, + GError **error) +{ + GIOStatus status; + gsize this_time = 1, bytes_written = 0; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); + + if (channel->write_buf == NULL || channel->write_buf->len == 0) + return G_IO_STATUS_NORMAL; + + do + { + g_assert (this_time > 0); + + status = channel->funcs->io_write (channel, + channel->write_buf->str + bytes_written, + channel->write_buf->len - bytes_written, + &this_time, error); + bytes_written += this_time; + } + while ((bytes_written < channel->write_buf->len) + && (status == G_IO_STATUS_NORMAL)); + + g_string_erase (channel->write_buf, 0, bytes_written); + + return status; +} + +/** + * g_io_channel_set_buffered: + * @channel: a #GIOChannel + * @buffered: whether to set the channel buffered or unbuffered + * + * The buffering state can only be set if the channel's encoding + * is %NULL. For any other encoding, the channel must be buffered. + * + * A buffered channel can only be set unbuffered if the channel's + * internal buffers have been flushed. Newly created channels or + * channels which have returned %G_IO_STATUS_EOF + * not require such a flush. For write-only channels, a call to + * g_io_channel_flush () is sufficient. For all other channels, + * the buffers may be flushed by a call to g_io_channel_seek_position (). + * This includes the possibility of seeking with seek type %G_SEEK_CUR + * and an offset of zero. Note that this means that socket-based + * channels cannot be set unbuffered once they have had data + * read from them. + * + * On unbuffered channels, it is safe to mix read and write + * calls from the new and old APIs, if this is necessary for + * maintaining old code. + * + * The default state of the channel is buffered. + **/ +void +g_io_channel_set_buffered (GIOChannel *channel, + gboolean buffered) +{ + g_return_if_fail (channel != NULL); + + if (channel->encoding != NULL) + { + g_warning ("Need to have NULL encoding to set the buffering state of the " + "channel.\n"); + return; + } + + g_return_if_fail (!channel->read_buf || channel->read_buf->len == 0); + g_return_if_fail (!channel->write_buf || channel->write_buf->len == 0); + + channel->use_buffer = buffered; +} + +/** + * g_io_channel_get_buffered: + * @channel: a #GIOChannel + * + * Returns whether @channel is buffered. + * + * Return Value: %TRUE if the @channel is buffered. + **/ +gboolean +g_io_channel_get_buffered (GIOChannel *channel) +{ + g_return_val_if_fail (channel != NULL, FALSE); + + return channel->use_buffer; +} + +/** + * g_io_channel_set_encoding: + * @channel: a #GIOChannel + * @encoding: the encoding type + * @error: location to store an error of type #GConvertError + * + * Sets the encoding for the input/output of the channel. + * The internal encoding is always UTF-8. The default encoding + * for the external file is UTF-8. + * + * The encoding %NULL is safe to use with binary data. + * + * The encoding can only be set if one of the following conditions + * is true: + * + * + * The channel was just created, and has not been written to or read + * from yet. + * + * + * The channel is write-only. + * + * + * The channel is a file, and the file pointer was just + * repositioned by a call to g_io_channel_seek_position(). + * (This flushes all the internal buffers.) + * + * + * The current encoding is %NULL or UTF-8. + * + * + * One of the (new API) read functions has just returned %G_IO_STATUS_EOF + * (or, in the case of g_io_channel_read_to_end(), %G_IO_STATUS_NORMAL). + * + * + * One of the functions g_io_channel_read_chars() or + * g_io_channel_read_unichar() has returned %G_IO_STATUS_AGAIN or + * %G_IO_STATUS_ERROR. This may be useful in the case of + * %G_CONVERT_ERROR_ILLEGAL_SEQUENCE. + * Returning one of these statuses from g_io_channel_read_line(), + * g_io_channel_read_line_string(), or g_io_channel_read_to_end() + * does not guarantee that the encoding can + * be changed. + * + * + * Channels which do not meet one of the above conditions cannot call + * g_io_channel_seek_position() with an offset of %G_SEEK_CUR, and, if + * they are "seekable", cannot call g_io_channel_write_chars() after + * calling one of the API "read" functions. + * + * Return Value: %G_IO_STATUS_NORMAL if the encoding was successfully set. + **/ +GIOStatus +g_io_channel_set_encoding (GIOChannel *channel, + const gchar *encoding, + GError **error) +{ + GIConv read_cd, write_cd; + gboolean did_encode; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR); + + /* Make sure the encoded buffers are empty */ + + g_return_val_if_fail (!channel->do_encode || !channel->encoded_read_buf || + channel->encoded_read_buf->len == 0, G_IO_STATUS_ERROR); + + if (!channel->use_buffer) + { + g_warning ("Need to set the channel buffered before setting the encoding.\n"); + g_warning ("Assuming this is what you meant and acting accordingly.\n"); + + channel->use_buffer = TRUE; + } + + if (channel->partial_write_buf[0] != '\0') + { + g_warning ("Partial character at end of write buffer not flushed.\n"); + channel->partial_write_buf[0] = '\0'; + } + + did_encode = channel->do_encode; + + if (!encoding || strcmp (encoding, "UTF8") == 0 || strcmp (encoding, "UTF-8") == 0) + { + channel->do_encode = FALSE; + read_cd = write_cd = (GIConv) -1; + } + else + { + gint err = 0; + const gchar *from_enc = NULL, *to_enc = NULL; + + if (channel->is_readable) + { + read_cd = g_iconv_open ("UTF-8", encoding); + + if (read_cd == (GIConv) -1) + { + err = errno; + from_enc = encoding; + to_enc = "UTF-8"; + } + } + else + read_cd = (GIConv) -1; + + if (channel->is_writeable && err == 0) + { + write_cd = g_iconv_open (encoding, "UTF-8"); + + if (write_cd == (GIConv) -1) + { + err = errno; + from_enc = "UTF-8"; + to_enc = encoding; + } + } + else + write_cd = (GIConv) -1; + + if (err != 0) + { + g_assert (from_enc); + g_assert (to_enc); + + if (err == EINVAL) + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION, + _("Conversion from character set '%s' to '%s' is not supported"), + from_enc, to_enc); + else + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Could not open converter from '%s' to '%s': %s"), + from_enc, to_enc, g_strerror (err)); + + if (read_cd != (GIConv) -1) + g_iconv_close (read_cd); + if (write_cd != (GIConv) -1) + g_iconv_close (write_cd); + + return G_IO_STATUS_ERROR; + } + + channel->do_encode = TRUE; + } + + /* The encoding is ok, so set the fields in channel */ + + if (channel->read_cd != (GIConv) -1) + g_iconv_close (channel->read_cd); + if (channel->write_cd != (GIConv) -1) + g_iconv_close (channel->write_cd); + + if (channel->encoded_read_buf && channel->encoded_read_buf->len > 0) + { + g_assert (!did_encode); /* Encoding UTF-8, NULL doesn't use encoded_read_buf */ + + /* This is just validated UTF-8, so we can copy it back into read_buf + * so it can be encoded in whatever the new encoding is. + */ + + g_string_prepend_len (channel->read_buf, channel->encoded_read_buf->str, + channel->encoded_read_buf->len); + g_string_truncate (channel->encoded_read_buf, 0); + } + + channel->read_cd = read_cd; + channel->write_cd = write_cd; + + g_free (channel->encoding); + channel->encoding = g_strdup (encoding); + + return G_IO_STATUS_NORMAL; +} + +/** + * g_io_channel_get_encoding: + * @channel: a #GIOChannel + * + * Gets the encoding for the input/output of the channel. + * The internal encoding is always UTF-8. The encoding %NULL + * makes the channel safe for binary data. + * + * Return value: A string containing the encoding, this string is + * owned by GLib and must not be freed. + **/ +G_CONST_RETURN gchar* +g_io_channel_get_encoding (GIOChannel *channel) +{ + g_return_val_if_fail (channel != NULL, NULL); + + return channel->encoding; +} + +static GIOStatus +g_io_channel_fill_buffer (GIOChannel *channel, + GError **err) +{ + gsize read_size, cur_len, oldlen; + GIOStatus status; + + if (channel->is_seekable && channel->write_buf && channel->write_buf->len > 0) + { + status = g_io_channel_flush (channel, err); + if (status != G_IO_STATUS_NORMAL) + return status; + } + if (channel->is_seekable && channel->partial_write_buf[0] != '\0') + { + g_warning ("Partial character at end of write buffer not flushed.\n"); + channel->partial_write_buf[0] = '\0'; + } + + if (!channel->read_buf) + channel->read_buf = g_string_sized_new (channel->buf_size); + + cur_len = channel->read_buf->len; + + g_string_set_size (channel->read_buf, channel->read_buf->len + channel->buf_size); + + status = channel->funcs->io_read (channel, channel->read_buf->str + cur_len, + channel->buf_size, &read_size, err); + + g_assert ((status == G_IO_STATUS_NORMAL) || (read_size == 0)); + + g_string_truncate (channel->read_buf, read_size + cur_len); + + if ((status != G_IO_STATUS_NORMAL) && + ((status != G_IO_STATUS_EOF) || (channel->read_buf->len == 0))) + return status; + + g_assert (channel->read_buf->len > 0); + + if (channel->encoded_read_buf) + oldlen = channel->encoded_read_buf->len; + else + { + oldlen = 0; + if (channel->encoding) + channel->encoded_read_buf = g_string_sized_new (channel->buf_size); + } + + if (channel->do_encode) + { + gsize errnum, inbytes_left, outbytes_left; + gchar *inbuf, *outbuf; + int errval; + + g_assert (channel->encoded_read_buf); + +reencode: + + inbytes_left = channel->read_buf->len; + outbytes_left = MAX (channel->read_buf->len, + channel->encoded_read_buf->allocated_len + - channel->encoded_read_buf->len - 1); /* 1 for NULL */ + outbytes_left = MAX (outbytes_left, 6); + + inbuf = channel->read_buf->str; + g_string_set_size (channel->encoded_read_buf, + channel->encoded_read_buf->len + outbytes_left); + outbuf = channel->encoded_read_buf->str + channel->encoded_read_buf->len + - outbytes_left; + + errnum = g_iconv (channel->read_cd, &inbuf, &inbytes_left, + &outbuf, &outbytes_left); + errval = errno; + + g_assert (inbuf + inbytes_left == channel->read_buf->str + + channel->read_buf->len); + g_assert (outbuf + outbytes_left == channel->encoded_read_buf->str + + channel->encoded_read_buf->len); + + g_string_erase (channel->read_buf, 0, + channel->read_buf->len - inbytes_left); + g_string_truncate (channel->encoded_read_buf, + channel->encoded_read_buf->len - outbytes_left); + + if (errnum == (gsize) -1) + { + switch (errval) + { + case EINVAL: + if ((oldlen == channel->encoded_read_buf->len) + && (status == G_IO_STATUS_EOF)) + status = G_IO_STATUS_EOF; + else + status = G_IO_STATUS_NORMAL; + break; + case E2BIG: + /* Buffer size at least 6, wrote at least on character */ + g_assert (inbuf != channel->read_buf->str); + goto reencode; + case EILSEQ: + if (oldlen < channel->encoded_read_buf->len) + status = G_IO_STATUS_NORMAL; + else + { + g_set_error_literal (err, G_CONVERT_ERROR, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + return G_IO_STATUS_ERROR; + } + break; + default: + g_assert (errval != EBADF); /* The converter should be open */ + g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Error during conversion: %s"), g_strerror (errval)); + return G_IO_STATUS_ERROR; + } + } + g_assert ((status != G_IO_STATUS_NORMAL) + || (channel->encoded_read_buf->len > 0)); + } + else if (channel->encoding) /* UTF-8 */ + { + gchar *nextchar, *lastchar; + + g_assert (channel->encoded_read_buf); + + nextchar = channel->read_buf->str; + lastchar = channel->read_buf->str + channel->read_buf->len; + + while (nextchar < lastchar) + { + gunichar val_char; + + val_char = g_utf8_get_char_validated (nextchar, lastchar - nextchar); + + switch (val_char) + { + case -2: + /* stop, leave partial character in buffer */ + lastchar = nextchar; + break; + case -1: + if (oldlen < channel->encoded_read_buf->len) + status = G_IO_STATUS_NORMAL; + else + { + g_set_error_literal (err, G_CONVERT_ERROR, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + status = G_IO_STATUS_ERROR; + } + lastchar = nextchar; + break; + default: + nextchar = g_utf8_next_char (nextchar); + break; + } + } + + if (lastchar > channel->read_buf->str) + { + gint copy_len = lastchar - channel->read_buf->str; + + g_string_append_len (channel->encoded_read_buf, channel->read_buf->str, + copy_len); + g_string_erase (channel->read_buf, 0, copy_len); + } + } + + return status; +} + +/** + * g_io_channel_read_line: + * @channel: a #GIOChannel + * @str_return: The line read from the #GIOChannel, including the + * line terminator. This data should be freed with g_free() + * when no longer needed. This is a nul-terminated string. + * If a @length of zero is returned, this will be %NULL instead. + * @length: location to store length of the read data, or %NULL + * @terminator_pos: location to store position of line terminator, or %NULL + * @error: A location to return an error of type #GConvertError + * or #GIOChannelError + * + * Reads a line, including the terminating character(s), + * from a #GIOChannel into a newly-allocated string. + * @str_return will contain allocated memory if the return + * is %G_IO_STATUS_NORMAL. + * + * Return value: the status of the operation. + **/ +GIOStatus +g_io_channel_read_line (GIOChannel *channel, + gchar **str_return, + gsize *length, + gsize *terminator_pos, + GError **error) +{ + GIOStatus status; + gsize got_length; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail (str_return != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); + + status = g_io_channel_read_line_backend (channel, &got_length, terminator_pos, error); + + if (length) + *length = got_length; + + if (status == G_IO_STATUS_NORMAL) + { + g_assert (USE_BUF (channel)); + *str_return = g_strndup (USE_BUF (channel)->str, got_length); + g_string_erase (USE_BUF (channel), 0, got_length); + } + else + *str_return = NULL; + + return status; +} + +/** + * g_io_channel_read_line_string: + * @channel: a #GIOChannel + * @buffer: a #GString into which the line will be written. + * If @buffer already contains data, the old data will + * be overwritten. + * @terminator_pos: location to store position of line terminator, or %NULL + * @error: a location to store an error of type #GConvertError + * or #GIOChannelError + * + * Reads a line from a #GIOChannel, using a #GString as a buffer. + * + * Return value: the status of the operation. + **/ +GIOStatus +g_io_channel_read_line_string (GIOChannel *channel, + GString *buffer, + gsize *terminator_pos, + GError **error) +{ + gsize length; + GIOStatus status; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail (buffer != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); + + if (buffer->len > 0) + g_string_truncate (buffer, 0); /* clear out the buffer */ + + status = g_io_channel_read_line_backend (channel, &length, terminator_pos, error); + + if (status == G_IO_STATUS_NORMAL) + { + g_assert (USE_BUF (channel)); + g_string_append_len (buffer, USE_BUF (channel)->str, length); + g_string_erase (USE_BUF (channel), 0, length); + } + + return status; +} + + +static GIOStatus +g_io_channel_read_line_backend (GIOChannel *channel, + gsize *length, + gsize *terminator_pos, + GError **error) +{ + GIOStatus status; + gsize checked_to, line_term_len, line_length, got_term_len; + gboolean first_time = TRUE; + + if (!channel->use_buffer) + { + /* Can't do a raw read in read_line */ + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Can't do a raw read in g_io_channel_read_line_string")); + return G_IO_STATUS_ERROR; + } + + status = G_IO_STATUS_NORMAL; + + if (channel->line_term) + line_term_len = channel->line_term_len; + else + line_term_len = 3; + /* This value used for setting checked_to, it's the longest of the four + * we autodetect for. + */ + + checked_to = 0; + + while (TRUE) + { + gchar *nextchar, *lastchar; + GString *use_buf; + + if (!first_time || (BUF_LEN (USE_BUF (channel)) == 0)) + { +read_again: + status = g_io_channel_fill_buffer (channel, error); + switch (status) + { + case G_IO_STATUS_NORMAL: + if (BUF_LEN (USE_BUF (channel)) == 0) + /* Can happen when using conversion and only read + * part of a character + */ + { + first_time = FALSE; + continue; + } + break; + case G_IO_STATUS_EOF: + if (BUF_LEN (USE_BUF (channel)) == 0) + { + if (length) + *length = 0; + + if (channel->encoding && channel->read_buf->len != 0) + { + g_set_error_literal (error, G_CONVERT_ERROR, + G_CONVERT_ERROR_PARTIAL_INPUT, + _("Leftover unconverted data in " + "read buffer")); + return G_IO_STATUS_ERROR; + } + else + return G_IO_STATUS_EOF; + } + break; + default: + if (length) + *length = 0; + return status; + } + } + + g_assert (BUF_LEN (USE_BUF (channel)) != 0); + + use_buf = USE_BUF (channel); /* The buffer has been created by this point */ + + first_time = FALSE; + + lastchar = use_buf->str + use_buf->len; + + for (nextchar = use_buf->str + checked_to; nextchar < lastchar; + channel->encoding ? nextchar = g_utf8_next_char (nextchar) : nextchar++) + { + if (channel->line_term) + { + if (memcmp (channel->line_term, nextchar, line_term_len) == 0) + { + line_length = nextchar - use_buf->str; + got_term_len = line_term_len; + goto done; + } + } + else /* auto detect */ + { + switch (*nextchar) + { + case '\n': /* unix */ + line_length = nextchar - use_buf->str; + got_term_len = 1; + goto done; + case '\r': /* Warning: do not use with sockets */ + line_length = nextchar - use_buf->str; + if ((nextchar == lastchar - 1) && (status != G_IO_STATUS_EOF) + && (lastchar == use_buf->str + use_buf->len)) + goto read_again; /* Try to read more data */ + if ((nextchar < lastchar - 1) && (*(nextchar + 1) == '\n')) /* dos */ + got_term_len = 2; + else /* mac */ + got_term_len = 1; + goto done; + case '\xe2': /* Unicode paragraph separator */ + if (strncmp ("\xe2\x80\xa9", nextchar, 3) == 0) + { + line_length = nextchar - use_buf->str; + got_term_len = 3; + goto done; + } + break; + case '\0': /* Embeded null in input */ + line_length = nextchar - use_buf->str; + got_term_len = 1; + goto done; + default: /* no match */ + break; + } + } + } + + /* If encoding != NULL, valid UTF-8, didn't overshoot */ + g_assert (nextchar == lastchar); + + /* Check for EOF */ + + if (status == G_IO_STATUS_EOF) + { + if (channel->encoding && channel->read_buf->len > 0) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Channel terminates in a partial character")); + return G_IO_STATUS_ERROR; + } + line_length = use_buf->len; + got_term_len = 0; + break; + } + + if (use_buf->len > line_term_len - 1) + checked_to = use_buf->len - (line_term_len - 1); + else + checked_to = 0; + } + +done: + + if (terminator_pos) + *terminator_pos = line_length; + + if (length) + *length = line_length + got_term_len; + + return G_IO_STATUS_NORMAL; +} + +/** + * g_io_channel_read_to_end: + * @channel: a #GIOChannel + * @str_return: Location to store a pointer to a string holding + * the remaining data in the #GIOChannel. This data should + * be freed with g_free() when no longer needed. This + * data is terminated by an extra nul character, but there + * may be other nuls in the intervening data. + * @length: location to store length of the data + * @error: location to return an error of type #GConvertError + * or #GIOChannelError + * + * Reads all the remaining data from the file. + * + * Return value: %G_IO_STATUS_NORMAL on success. + * This function never returns %G_IO_STATUS_EOF. + **/ +GIOStatus +g_io_channel_read_to_end (GIOChannel *channel, + gchar **str_return, + gsize *length, + GError **error) +{ + GIOStatus status; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); + + if (str_return) + *str_return = NULL; + if (length) + *length = 0; + + if (!channel->use_buffer) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Can't do a raw read in g_io_channel_read_to_end")); + return G_IO_STATUS_ERROR; + } + + do + status = g_io_channel_fill_buffer (channel, error); + while (status == G_IO_STATUS_NORMAL); + + if (status != G_IO_STATUS_EOF) + return status; + + if (channel->encoding && channel->read_buf->len > 0) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Channel terminates in a partial character")); + return G_IO_STATUS_ERROR; + } + + if (USE_BUF (channel) == NULL) + { + /* length is already set to zero */ + if (str_return) + *str_return = g_strdup (""); + } + else + { + if (length) + *length = USE_BUF (channel)->len; + + if (str_return) + *str_return = g_string_free (USE_BUF (channel), FALSE); + else + g_string_free (USE_BUF (channel), TRUE); + + if (channel->encoding) + channel->encoded_read_buf = NULL; + else + channel->read_buf = NULL; + } + + return G_IO_STATUS_NORMAL; +} + +/** + * g_io_channel_read_chars: + * @channel: a #GIOChannel + * @buf: a buffer to read data into + * @count: the size of the buffer. Note that the buffer may + * not be complelely filled even if there is data + * in the buffer if the remaining data is not a + * complete character. + * @bytes_read: The number of bytes read. This may be zero even on + * success if count < 6 and the channel's encoding is non-%NULL. + * This indicates that the next UTF-8 character is too wide for + * the buffer. + * @error: a location to return an error of type #GConvertError + * or #GIOChannelError. + * + * Replacement for g_io_channel_read() with the new API. + * + * Return value: the status of the operation. + **/ +GIOStatus +g_io_channel_read_chars (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **error) +{ + GIOStatus status; + gsize got_bytes; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); + + if (count == 0) + { + *bytes_read = 0; + return G_IO_STATUS_NORMAL; + } + g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR); + + if (!channel->use_buffer) + { + gsize tmp_bytes; + + g_assert (!channel->read_buf || channel->read_buf->len == 0); + + status = channel->funcs->io_read (channel, buf, count, &tmp_bytes, error); + + if (bytes_read) + *bytes_read = tmp_bytes; + + return status; + } + + status = G_IO_STATUS_NORMAL; + + while (BUF_LEN (USE_BUF (channel)) < count && status == G_IO_STATUS_NORMAL) + status = g_io_channel_fill_buffer (channel, error); + + /* Only return an error if we have no data */ + + if (BUF_LEN (USE_BUF (channel)) == 0) + { + g_assert (status != G_IO_STATUS_NORMAL); + + if (status == G_IO_STATUS_EOF && channel->encoding + && BUF_LEN (channel->read_buf) > 0) + { + g_set_error_literal (error, G_CONVERT_ERROR, + G_CONVERT_ERROR_PARTIAL_INPUT, + _("Leftover unconverted data in read buffer")); + status = G_IO_STATUS_ERROR; + } + + if (bytes_read) + *bytes_read = 0; + + return status; + } + + if (status == G_IO_STATUS_ERROR) + g_clear_error (error); + + got_bytes = MIN (count, BUF_LEN (USE_BUF (channel))); + + g_assert (got_bytes > 0); + + if (channel->encoding) + /* Don't validate for NULL encoding, binary safe */ + { + gchar *nextchar, *prevchar; + + g_assert (USE_BUF (channel) == channel->encoded_read_buf); + + nextchar = channel->encoded_read_buf->str; + + do + { + prevchar = nextchar; + nextchar = g_utf8_next_char (nextchar); + g_assert (nextchar != prevchar); /* Possible for *prevchar of -1 or -2 */ + } + while (nextchar < channel->encoded_read_buf->str + got_bytes); + + if (nextchar > channel->encoded_read_buf->str + got_bytes) + got_bytes = prevchar - channel->encoded_read_buf->str; + + g_assert (got_bytes > 0 || count < 6); + } + + memcpy (buf, USE_BUF (channel)->str, got_bytes); + g_string_erase (USE_BUF (channel), 0, got_bytes); + + if (bytes_read) + *bytes_read = got_bytes; + + return G_IO_STATUS_NORMAL; +} + +/** + * g_io_channel_read_unichar: + * @channel: a #GIOChannel + * @thechar: a location to return a character + * @error: a location to return an error of type #GConvertError + * or #GIOChannelError + * + * Reads a Unicode character from @channel. + * This function cannot be called on a channel with %NULL encoding. + * + * Return value: a #GIOStatus + **/ +GIOStatus +g_io_channel_read_unichar (GIOChannel *channel, + gunichar *thechar, + GError **error) +{ + GIOStatus status = G_IO_STATUS_NORMAL; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR); + + while (BUF_LEN (channel->encoded_read_buf) == 0 && status == G_IO_STATUS_NORMAL) + status = g_io_channel_fill_buffer (channel, error); + + /* Only return an error if we have no data */ + + if (BUF_LEN (USE_BUF (channel)) == 0) + { + g_assert (status != G_IO_STATUS_NORMAL); + + if (status == G_IO_STATUS_EOF && BUF_LEN (channel->read_buf) > 0) + { + g_set_error_literal (error, G_CONVERT_ERROR, + G_CONVERT_ERROR_PARTIAL_INPUT, + _("Leftover unconverted data in read buffer")); + status = G_IO_STATUS_ERROR; + } + + if (thechar) + *thechar = (gunichar) -1; + + return status; + } + + if (status == G_IO_STATUS_ERROR) + g_clear_error (error); + + if (thechar) + *thechar = g_utf8_get_char (channel->encoded_read_buf->str); + + g_string_erase (channel->encoded_read_buf, 0, + g_utf8_next_char (channel->encoded_read_buf->str) + - channel->encoded_read_buf->str); + + return G_IO_STATUS_NORMAL; +} + +/** + * g_io_channel_write_chars: + * @channel: a #GIOChannel + * @buf: a buffer to write data from + * @count: the size of the buffer. If -1, the buffer + * is taken to be a nul-terminated string. + * @bytes_written: The number of bytes written. This can be nonzero + * even if the return value is not %G_IO_STATUS_NORMAL. + * If the return value is %G_IO_STATUS_NORMAL and the + * channel is blocking, this will always be equal + * to @count if @count >= 0. + * @error: a location to return an error of type #GConvertError + * or #GIOChannelError + * + * Replacement for g_io_channel_write() with the new API. + * + * On seekable channels with encodings other than %NULL or UTF-8, generic + * mixing of reading and writing is not allowed. A call to g_io_channel_write_chars () + * may only be made on a channel from which data has been read in the + * cases described in the documentation for g_io_channel_set_encoding (). + * + * Return value: the status of the operation. + **/ +GIOStatus +g_io_channel_write_chars (GIOChannel *channel, + const gchar *buf, + gssize count, + gsize *bytes_written, + GError **error) +{ + GIOStatus status; + gssize wrote_bytes = 0; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR); + + if ((count < 0) && buf) + count = strlen (buf); + + if (count == 0) + { + if (bytes_written) + *bytes_written = 0; + return G_IO_STATUS_NORMAL; + } + + g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail (count > 0, G_IO_STATUS_ERROR); + + /* Raw write case */ + + if (!channel->use_buffer) + { + gsize tmp_bytes; + + g_assert (!channel->write_buf || channel->write_buf->len == 0); + g_assert (channel->partial_write_buf[0] == '\0'); + + status = channel->funcs->io_write (channel, buf, count, &tmp_bytes, error); + + if (bytes_written) + *bytes_written = tmp_bytes; + + return status; + } + + /* General case */ + + if (channel->is_seekable && (( BUF_LEN (channel->read_buf) > 0) + || (BUF_LEN (channel->encoded_read_buf) > 0))) + { + if (channel->do_encode && BUF_LEN (channel->encoded_read_buf) > 0) + { + g_warning("Mixed reading and writing not allowed on encoded files"); + return G_IO_STATUS_ERROR; + } + status = g_io_channel_seek_position (channel, 0, G_SEEK_CUR, error); + if (status != G_IO_STATUS_NORMAL) + { + if (bytes_written) + *bytes_written = 0; + return status; + } + } + + if (!channel->write_buf) + channel->write_buf = g_string_sized_new (channel->buf_size); + + while (wrote_bytes < count) + { + gsize space_in_buf; + + /* If the buffer is full, try a write immediately. In + * the nonblocking case, this prevents the user from + * writing just a little bit to the buffer every time + * and never receiving an EAGAIN. + */ + + if (channel->write_buf->len >= channel->buf_size - MAX_CHAR_SIZE) + { + gsize did_write = 0, this_time; + + do + { + status = channel->funcs->io_write (channel, channel->write_buf->str + + did_write, channel->write_buf->len + - did_write, &this_time, error); + did_write += this_time; + } + while (status == G_IO_STATUS_NORMAL && + did_write < MIN (channel->write_buf->len, MAX_CHAR_SIZE)); + + g_string_erase (channel->write_buf, 0, did_write); + + if (status != G_IO_STATUS_NORMAL) + { + if (status == G_IO_STATUS_AGAIN && wrote_bytes > 0) + status = G_IO_STATUS_NORMAL; + if (bytes_written) + *bytes_written = wrote_bytes; + return status; + } + } + + space_in_buf = MAX (channel->buf_size, channel->write_buf->allocated_len - 1) + - channel->write_buf->len; /* 1 for NULL */ + + /* This is only true because g_io_channel_set_buffer_size () + * ensures that channel->buf_size >= MAX_CHAR_SIZE. + */ + g_assert (space_in_buf >= MAX_CHAR_SIZE); + + if (!channel->encoding) + { + gssize write_this = MIN (space_in_buf, count - wrote_bytes); + + g_string_append_len (channel->write_buf, buf, write_this); + buf += write_this; + wrote_bytes += write_this; + } + else + { + const gchar *from_buf; + gsize from_buf_len, from_buf_old_len, left_len; + gsize err; + gint errnum; + + if (channel->partial_write_buf[0] != '\0') + { + g_assert (wrote_bytes == 0); + + from_buf = channel->partial_write_buf; + from_buf_old_len = strlen (channel->partial_write_buf); + g_assert (from_buf_old_len > 0); + from_buf_len = MIN (6, from_buf_old_len + count); + + memcpy (channel->partial_write_buf + from_buf_old_len, buf, + from_buf_len - from_buf_old_len); + } + else + { + from_buf = buf; + from_buf_len = count - wrote_bytes; + from_buf_old_len = 0; + } + +reconvert: + + if (!channel->do_encode) /* UTF-8 encoding */ + { + const gchar *badchar; + gsize try_len = MIN (from_buf_len, space_in_buf); + + /* UTF-8, just validate, emulate g_iconv */ + + if (!g_utf8_validate (from_buf, try_len, &badchar)) + { + gunichar try_char; + gsize incomplete_len = from_buf + try_len - badchar; + + left_len = from_buf + from_buf_len - badchar; + + try_char = g_utf8_get_char_validated (badchar, incomplete_len); + + switch (try_char) + { + case -2: + g_assert (incomplete_len < 6); + if (try_len == from_buf_len) + { + errnum = EINVAL; + err = (gsize) -1; + } + else + { + errnum = 0; + err = (gsize) 0; + } + break; + case -1: + g_warning ("Invalid UTF-8 passed to g_io_channel_write_chars()."); + /* FIXME bail here? */ + errnum = EILSEQ; + err = (gsize) -1; + break; + default: + g_assert_not_reached (); + err = (gsize) -1; + errnum = 0; /* Don't confunse the compiler */ + } + } + else + { + err = (gsize) 0; + errnum = 0; + left_len = from_buf_len - try_len; + } + + g_string_append_len (channel->write_buf, from_buf, + from_buf_len - left_len); + from_buf += from_buf_len - left_len; + } + else + { + gchar *outbuf; + + left_len = from_buf_len; + g_string_set_size (channel->write_buf, channel->write_buf->len + + space_in_buf); + outbuf = channel->write_buf->str + channel->write_buf->len + - space_in_buf; + err = g_iconv (channel->write_cd, (gchar **) &from_buf, &left_len, + &outbuf, &space_in_buf); + errnum = errno; + g_string_truncate (channel->write_buf, channel->write_buf->len + - space_in_buf); + } + + if (err == (gsize) -1) + { + switch (errnum) + { + case EINVAL: + g_assert (left_len < 6); + + if (from_buf_old_len == 0) + { + /* Not from partial_write_buf */ + + memcpy (channel->partial_write_buf, from_buf, left_len); + channel->partial_write_buf[left_len] = '\0'; + if (bytes_written) + *bytes_written = count; + return G_IO_STATUS_NORMAL; + } + + /* Working in partial_write_buf */ + + if (left_len == from_buf_len) + { + /* Didn't convert anything, must still have + * less than a full character + */ + + g_assert (count == from_buf_len - from_buf_old_len); + + channel->partial_write_buf[from_buf_len] = '\0'; + + if (bytes_written) + *bytes_written = count; + + return G_IO_STATUS_NORMAL; + } + + g_assert (from_buf_len - left_len >= from_buf_old_len); + + /* We converted all the old data. This is fine */ + + break; + case E2BIG: + if (from_buf_len == left_len) + { + /* Nothing was written, add enough space for + * at least one character. + */ + space_in_buf += MAX_CHAR_SIZE; + goto reconvert; + } + break; + case EILSEQ: + g_set_error_literal (error, G_CONVERT_ERROR, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + if (from_buf_old_len > 0 && from_buf_len == left_len) + g_warning ("Illegal sequence due to partial character " + "at the end of a previous write.\n"); + else + wrote_bytes += from_buf_len - left_len - from_buf_old_len; + if (bytes_written) + *bytes_written = wrote_bytes; + channel->partial_write_buf[0] = '\0'; + return G_IO_STATUS_ERROR; + default: + g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED, + _("Error during conversion: %s"), g_strerror (errnum)); + if (from_buf_len >= left_len + from_buf_old_len) + wrote_bytes += from_buf_len - left_len - from_buf_old_len; + if (bytes_written) + *bytes_written = wrote_bytes; + channel->partial_write_buf[0] = '\0'; + return G_IO_STATUS_ERROR; + } + } + + g_assert (from_buf_len - left_len >= from_buf_old_len); + + wrote_bytes += from_buf_len - left_len - from_buf_old_len; + + if (from_buf_old_len > 0) + { + /* We were working in partial_write_buf */ + + buf += from_buf_len - left_len - from_buf_old_len; + channel->partial_write_buf[0] = '\0'; + } + else + buf = from_buf; + } + } + + if (bytes_written) + *bytes_written = count; + + return G_IO_STATUS_NORMAL; +} + +/** + * g_io_channel_write_unichar: + * @channel: a #GIOChannel + * @thechar: a character + * @error: location to return an error of type #GConvertError + * or #GIOChannelError + * + * Writes a Unicode character to @channel. + * This function cannot be called on a channel with %NULL encoding. + * + * Return value: a #GIOStatus + **/ +GIOStatus +g_io_channel_write_unichar (GIOChannel *channel, + gunichar thechar, + GError **error) +{ + GIOStatus status; + gchar static_buf[6]; + gsize char_len, wrote_len; + + g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR); + g_return_val_if_fail ((error == NULL) || (*error == NULL), + G_IO_STATUS_ERROR); + g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR); + + char_len = g_unichar_to_utf8 (thechar, static_buf); + + if (channel->partial_write_buf[0] != '\0') + { + g_warning ("Partial charater written before writing unichar.\n"); + channel->partial_write_buf[0] = '\0'; + } + + status = g_io_channel_write_chars (channel, static_buf, + char_len, &wrote_len, error); + + /* We validate UTF-8, so we can't get a partial write */ + + g_assert (wrote_len == char_len || status != G_IO_STATUS_NORMAL); + + return status; +} + +/** + * g_io_channel_error_quark: + * + * Return value: the quark used as %G_IO_CHANNEL_ERROR + **/ +/** + * G_IO_CHANNEL_ERROR: + * + * Error domain for #GIOChannel operations. Errors in this domain will + * be from the #GIOChannelError enumeration. See #GError for + * information on error domains. + **/ +/** + * GIOChannelError: + * @G_IO_CHANNEL_ERROR_FBIG: File too large. + * @G_IO_CHANNEL_ERROR_INVAL: Invalid argument. + * @G_IO_CHANNEL_ERROR_IO: IO error. + * @G_IO_CHANNEL_ERROR_ISDIR: File is a directory. + * @G_IO_CHANNEL_ERROR_NOSPC: No space left on device. + * @G_IO_CHANNEL_ERROR_NXIO: No such device or address. + * @G_IO_CHANNEL_ERROR_OVERFLOW: Value too large for defined datatype. + * @G_IO_CHANNEL_ERROR_PIPE: Broken pipe. + * @G_IO_CHANNEL_ERROR_FAILED: Some other error. + * + * Error codes returned by #GIOChannel operations. + **/ +GQuark +g_io_channel_error_quark (void) +{ + return g_quark_from_static_string ("g-io-channel-error-quark"); +} + +#define __G_IOCHANNEL_C__ +#include "galiasdef.c" diff --git a/glib/giochannel.h b/glib/giochannel.h new file mode 100644 index 0000000..2a40aa2 --- /dev/null +++ b/glib/giochannel.h @@ -0,0 +1,366 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_IOCHANNEL_H__ +#define __G_IOCHANNEL_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +/* GIOChannel + */ + +typedef struct _GIOChannel GIOChannel; +typedef struct _GIOFuncs GIOFuncs; + +typedef enum +{ + G_IO_ERROR_NONE, + G_IO_ERROR_AGAIN, + G_IO_ERROR_INVAL, + G_IO_ERROR_UNKNOWN +} GIOError; + +#define G_IO_CHANNEL_ERROR g_io_channel_error_quark() + +typedef enum +{ + /* Derived from errno */ + G_IO_CHANNEL_ERROR_FBIG, + G_IO_CHANNEL_ERROR_INVAL, + G_IO_CHANNEL_ERROR_IO, + G_IO_CHANNEL_ERROR_ISDIR, + G_IO_CHANNEL_ERROR_NOSPC, + G_IO_CHANNEL_ERROR_NXIO, + G_IO_CHANNEL_ERROR_OVERFLOW, + G_IO_CHANNEL_ERROR_PIPE, + /* Other */ + G_IO_CHANNEL_ERROR_FAILED +} GIOChannelError; + +typedef enum +{ + G_IO_STATUS_ERROR, + G_IO_STATUS_NORMAL, + G_IO_STATUS_EOF, + G_IO_STATUS_AGAIN +} GIOStatus; + +typedef enum +{ + G_SEEK_CUR, + G_SEEK_SET, + G_SEEK_END +} GSeekType; + +typedef enum +{ + G_IO_IN GLIB_SYSDEF_POLLIN, + G_IO_OUT GLIB_SYSDEF_POLLOUT, + G_IO_PRI GLIB_SYSDEF_POLLPRI, + G_IO_ERR GLIB_SYSDEF_POLLERR, + G_IO_HUP GLIB_SYSDEF_POLLHUP, + G_IO_NVAL GLIB_SYSDEF_POLLNVAL +} GIOCondition; + +typedef enum +{ + G_IO_FLAG_APPEND = 1 << 0, + G_IO_FLAG_NONBLOCK = 1 << 1, + G_IO_FLAG_IS_READABLE = 1 << 2, /* Read only flag */ + G_IO_FLAG_IS_WRITEABLE = 1 << 3, /* Read only flag */ + G_IO_FLAG_IS_SEEKABLE = 1 << 4, /* Read only flag */ + G_IO_FLAG_MASK = (1 << 5) - 1, + G_IO_FLAG_GET_MASK = G_IO_FLAG_MASK, + G_IO_FLAG_SET_MASK = G_IO_FLAG_APPEND | G_IO_FLAG_NONBLOCK +} GIOFlags; + +struct _GIOChannel +{ + /*< private >*/ + gint ref_count; + GIOFuncs *funcs; + + gchar *encoding; + GIConv read_cd; + GIConv write_cd; + gchar *line_term; /* String which indicates the end of a line of text */ + guint line_term_len; /* So we can have null in the line term */ + + gsize buf_size; + GString *read_buf; /* Raw data from the channel */ + GString *encoded_read_buf; /* Channel data converted to UTF-8 */ + GString *write_buf; /* Data ready to be written to the file */ + gchar partial_write_buf[6]; /* UTF-8 partial characters, null terminated */ + + /* Group the flags together, immediately after partial_write_buf, to save memory */ + + guint use_buffer : 1; /* The encoding uses the buffers */ + guint do_encode : 1; /* The encoding uses the GIConv coverters */ + guint close_on_unref : 1; /* Close the channel on final unref */ + guint is_readable : 1; /* Cached GIOFlag */ + guint is_writeable : 1; /* ditto */ + guint is_seekable : 1; /* ditto */ + + gpointer reserved1; + gpointer reserved2; +}; + +typedef gboolean (*GIOFunc) (GIOChannel *source, + GIOCondition condition, + gpointer data); +struct _GIOFuncs +{ + GIOStatus (*io_read) (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **err); + GIOStatus (*io_write) (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written, + GError **err); + GIOStatus (*io_seek) (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **err); + GIOStatus (*io_close) (GIOChannel *channel, + GError **err); + GSource* (*io_create_watch) (GIOChannel *channel, + GIOCondition condition); + void (*io_free) (GIOChannel *channel); + GIOStatus (*io_set_flags) (GIOChannel *channel, + GIOFlags flags, + GError **err); + GIOFlags (*io_get_flags) (GIOChannel *channel); +}; + +void g_io_channel_init (GIOChannel *channel); +GIOChannel *g_io_channel_ref (GIOChannel *channel); +void g_io_channel_unref (GIOChannel *channel); + +#ifndef G_DISABLE_DEPRECATED +GIOError g_io_channel_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read); +GIOError g_io_channel_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written); +GIOError g_io_channel_seek (GIOChannel *channel, + gint64 offset, + GSeekType type); +void g_io_channel_close (GIOChannel *channel); +#endif /* G_DISABLE_DEPRECATED */ + +GIOStatus g_io_channel_shutdown (GIOChannel *channel, + gboolean flush, + GError **err); +guint g_io_add_watch_full (GIOChannel *channel, + gint priority, + GIOCondition condition, + GIOFunc func, + gpointer user_data, + GDestroyNotify notify); +GSource * g_io_create_watch (GIOChannel *channel, + GIOCondition condition); +guint g_io_add_watch (GIOChannel *channel, + GIOCondition condition, + GIOFunc func, + gpointer user_data); + +/* character encoding conversion involved functions. + */ + +void g_io_channel_set_buffer_size (GIOChannel *channel, + gsize size); +gsize g_io_channel_get_buffer_size (GIOChannel *channel); +GIOCondition g_io_channel_get_buffer_condition (GIOChannel *channel); +GIOStatus g_io_channel_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **error); +GIOFlags g_io_channel_get_flags (GIOChannel *channel); +void g_io_channel_set_line_term (GIOChannel *channel, + const gchar *line_term, + gint length); +G_CONST_RETURN gchar* g_io_channel_get_line_term (GIOChannel *channel, + gint *length); +void g_io_channel_set_buffered (GIOChannel *channel, + gboolean buffered); +gboolean g_io_channel_get_buffered (GIOChannel *channel); +GIOStatus g_io_channel_set_encoding (GIOChannel *channel, + const gchar *encoding, + GError **error); +G_CONST_RETURN gchar* g_io_channel_get_encoding (GIOChannel *channel); +void g_io_channel_set_close_on_unref (GIOChannel *channel, + gboolean do_close); +gboolean g_io_channel_get_close_on_unref (GIOChannel *channel); + + +GIOStatus g_io_channel_flush (GIOChannel *channel, + GError **error); +GIOStatus g_io_channel_read_line (GIOChannel *channel, + gchar **str_return, + gsize *length, + gsize *terminator_pos, + GError **error); +GIOStatus g_io_channel_read_line_string (GIOChannel *channel, + GString *buffer, + gsize *terminator_pos, + GError **error); +GIOStatus g_io_channel_read_to_end (GIOChannel *channel, + gchar **str_return, + gsize *length, + GError **error); +GIOStatus g_io_channel_read_chars (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **error); +GIOStatus g_io_channel_read_unichar (GIOChannel *channel, + gunichar *thechar, + GError **error); +GIOStatus g_io_channel_write_chars (GIOChannel *channel, + const gchar *buf, + gssize count, + gsize *bytes_written, + GError **error); +GIOStatus g_io_channel_write_unichar (GIOChannel *channel, + gunichar thechar, + GError **error); +GIOStatus g_io_channel_seek_position (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **error); +#ifdef G_OS_WIN32 +#define g_io_channel_new_file g_io_channel_new_file_utf8 +#endif + +GIOChannel* g_io_channel_new_file (const gchar *filename, + const gchar *mode, + GError **error); + +/* Error handling */ + +GQuark g_io_channel_error_quark (void); +GIOChannelError g_io_channel_error_from_errno (gint en); + +/* On Unix, IO channels created with this function for any file + * descriptor or socket. + * + * On Win32, this can be used either for files opened with the MSVCRT + * (the Microsoft run-time C library) _open() or _pipe, including file + * descriptors 0, 1 and 2 (corresponding to stdin, stdout and stderr), + * or for Winsock SOCKETs. If the parameter is a legal file + * descriptor, it is assumed to be such, otherwise it should be a + * SOCKET. This relies on SOCKETs and file descriptors not + * overlapping. If you want to be certain, call either + * g_io_channel_win32_new_fd() or g_io_channel_win32_new_socket() + * instead as appropriate. + * + * The term file descriptor as used in the context of Win32 refers to + * the emulated Unix-like file descriptors MSVCRT provides. The native + * corresponding concept is file HANDLE. There isn't as of yet a way to + * get GIOChannels for Win32 file HANDLEs. + */ +GIOChannel* g_io_channel_unix_new (int fd); +gint g_io_channel_unix_get_fd (GIOChannel *channel); + + +/* Hook for GClosure / GSource integration. Don't touch */ +GLIB_VAR GSourceFuncs g_io_watch_funcs; + +#ifdef G_OS_WIN32 + +/* You can use this "pseudo file descriptor" in a GPollFD to add + * polling for Windows messages. GTK applications should not do that. + */ + +#define G_WIN32_MSG_HANDLE 19981206 + +/* Use this to get a GPollFD from a GIOChannel, so that you can call + * g_io_channel_win32_poll(). After calling this you should only use + * g_io_channel_read() to read from the GIOChannel, i.e. never read() + * from the underlying file descriptor. For SOCKETs, it is possible to call + * recv(). + */ +void g_io_channel_win32_make_pollfd (GIOChannel *channel, + GIOCondition condition, + GPollFD *fd); + +/* This can be used to wait a until at least one of the channels is readable. + * On Unix you would do a select() on the file descriptors of the channels. + */ +gint g_io_channel_win32_poll (GPollFD *fds, + gint n_fds, + gint timeout_); + +/* Create an IO channel for Windows messages for window handle hwnd. */ +#if GLIB_SIZEOF_VOID_P == 8 +/* We use gsize here so that it is still an integer type and not a + * pointer, like the guint in the traditional prototype. We can't use + * intptr_t as that is not portable enough. + */ +GIOChannel *g_io_channel_win32_new_messages (gsize hwnd); +#else +GIOChannel *g_io_channel_win32_new_messages (guint hwnd); +#endif + +/* Create an IO channel for C runtime (emulated Unix-like) file + * descriptors. After calling g_io_add_watch() on a IO channel + * returned by this function, you shouldn't call read() on the file + * descriptor. This is because adding polling for a file descriptor is + * implemented on Win32 by starting a thread that sits blocked in a + * read() from the file descriptor most of the time. All reads from + * the file descriptor should be done by this internal GLib + * thread. Your code should call only g_io_channel_read_chars(). + */ +GIOChannel* g_io_channel_win32_new_fd (gint fd); + +/* Get the C runtime file descriptor of a channel. */ +gint g_io_channel_win32_get_fd (GIOChannel *channel); + +/* Create an IO channel for a winsock socket. The parameter should be + * a SOCKET. Contrary to IO channels for file descriptors (on *Win32), + * you can use normal recv() or recvfrom() on sockets even if GLib + * is polling them. + */ +GIOChannel *g_io_channel_win32_new_socket (gint socket); + +#endif + +G_END_DECLS + +#endif /* __G_IOCHANNEL_H__ */ diff --git a/glib/giounix.c b/glib/giounix.c new file mode 100644 index 0000000..0e89d5c --- /dev/null +++ b/glib/giounix.c @@ -0,0 +1,645 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * giounix.c: IO Channels using unix file descriptors + * Copyright 1998 Owen Taylor + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#define _POSIX_SOURCE /* for SSIZE_MAX */ + +#include +#include +#include +#include +#include +#include +#include + +#include "glib.h" +#include "galias.h" + +/* + * Unix IO Channels + */ + +typedef struct _GIOUnixChannel GIOUnixChannel; +typedef struct _GIOUnixWatch GIOUnixWatch; + +struct _GIOUnixChannel +{ + GIOChannel channel; + gint fd; +}; + +struct _GIOUnixWatch +{ + GSource source; + GPollFD pollfd; + GIOChannel *channel; + GIOCondition condition; +}; + + +static GIOStatus g_io_unix_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **err); +static GIOStatus g_io_unix_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written, + GError **err); +static GIOStatus g_io_unix_seek (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **err); +static GIOStatus g_io_unix_close (GIOChannel *channel, + GError **err); +static void g_io_unix_free (GIOChannel *channel); +static GSource* g_io_unix_create_watch (GIOChannel *channel, + GIOCondition condition); +static GIOStatus g_io_unix_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **err); +static GIOFlags g_io_unix_get_flags (GIOChannel *channel); + +static gboolean g_io_unix_prepare (GSource *source, + gint *timeout); +static gboolean g_io_unix_check (GSource *source); +static gboolean g_io_unix_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data); +static void g_io_unix_finalize (GSource *source); + +GSourceFuncs g_io_watch_funcs = { + g_io_unix_prepare, + g_io_unix_check, + g_io_unix_dispatch, + g_io_unix_finalize +}; + +static GIOFuncs unix_channel_funcs = { + g_io_unix_read, + g_io_unix_write, + g_io_unix_seek, + g_io_unix_close, + g_io_unix_create_watch, + g_io_unix_free, + g_io_unix_set_flags, + g_io_unix_get_flags, +}; + +static gboolean +g_io_unix_prepare (GSource *source, + gint *timeout) +{ + GIOUnixWatch *watch = (GIOUnixWatch *)source; + GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); + + *timeout = -1; + + /* Only return TRUE here if _all_ bits in watch->condition will be set + */ + return ((watch->condition & buffer_condition) == watch->condition); +} + +static gboolean +g_io_unix_check (GSource *source) +{ + GIOUnixWatch *watch = (GIOUnixWatch *)source; + GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); + GIOCondition poll_condition = watch->pollfd.revents; + + return ((poll_condition | buffer_condition) & watch->condition); +} + +static gboolean +g_io_unix_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) + +{ + GIOFunc func = (GIOFunc)callback; + GIOUnixWatch *watch = (GIOUnixWatch *)source; + GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); + + if (!func) + { + g_warning ("IO watch dispatched without callback\n" + "You must call g_source_connect()."); + return FALSE; + } + + return (*func) (watch->channel, + (watch->pollfd.revents | buffer_condition) & watch->condition, + user_data); +} + +static void +g_io_unix_finalize (GSource *source) +{ + GIOUnixWatch *watch = (GIOUnixWatch *)source; + + g_io_channel_unref (watch->channel); +} + +static GIOStatus +g_io_unix_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **err) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + gssize result; + + if (count > SSIZE_MAX) /* At least according to the Debian manpage for read */ + count = SSIZE_MAX; + + retry: + result = read (unix_channel->fd, buf, count); + + if (result < 0) + { + int errsv = errno; + *bytes_read = 0; + + switch (errsv) + { +#ifdef EINTR + case EINTR: + goto retry; +#endif +#ifdef EAGAIN + case EAGAIN: + return G_IO_STATUS_AGAIN; +#endif + default: + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errsv), + g_strerror (errsv)); + return G_IO_STATUS_ERROR; + } + } + + *bytes_read = result; + + return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; +} + +static GIOStatus +g_io_unix_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written, + GError **err) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + gssize result; + + retry: + result = write (unix_channel->fd, buf, count); + + if (result < 0) + { + int errsv = errno; + *bytes_written = 0; + + switch (errsv) + { +#ifdef EINTR + case EINTR: + goto retry; +#endif +#ifdef EAGAIN + case EAGAIN: + return G_IO_STATUS_AGAIN; +#endif + default: + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errsv), + g_strerror (errsv)); + return G_IO_STATUS_ERROR; + } + } + + *bytes_written = result; + + return G_IO_STATUS_NORMAL; +} + +static GIOStatus +g_io_unix_seek (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **err) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + int whence; + off_t tmp_offset; + off_t result; + + switch (type) + { + case G_SEEK_SET: + whence = SEEK_SET; + break; + case G_SEEK_CUR: + whence = SEEK_CUR; + break; + case G_SEEK_END: + whence = SEEK_END; + break; + default: + whence = -1; /* Shut the compiler up */ + g_assert_not_reached (); + } + + tmp_offset = offset; + if (tmp_offset != offset) + { + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (EINVAL), + g_strerror (EINVAL)); + return G_IO_STATUS_ERROR; + } + + result = lseek (unix_channel->fd, tmp_offset, whence); + + if (result < 0) + { + int errsv = errno; + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errsv), + g_strerror (errsv)); + return G_IO_STATUS_ERROR; + } + + return G_IO_STATUS_NORMAL; +} + + +static GIOStatus +g_io_unix_close (GIOChannel *channel, + GError **err) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + + if (close (unix_channel->fd) < 0) + { + int errsv = errno; + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errsv), + g_strerror (errsv)); + return G_IO_STATUS_ERROR; + } + + return G_IO_STATUS_NORMAL; +} + +static void +g_io_unix_free (GIOChannel *channel) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + + g_free (unix_channel); +} + +static GSource * +g_io_unix_create_watch (GIOChannel *channel, + GIOCondition condition) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + GSource *source; + GIOUnixWatch *watch; + + + source = g_source_new (&g_io_watch_funcs, sizeof (GIOUnixWatch)); + watch = (GIOUnixWatch *)source; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->condition = condition; + + watch->pollfd.fd = unix_channel->fd; + watch->pollfd.events = condition; + + g_source_add_poll (source, &watch->pollfd); + + return source; +} + +static GIOStatus +g_io_unix_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **err) +{ + glong fcntl_flags; + GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel; + + fcntl_flags = 0; + + if (flags & G_IO_FLAG_APPEND) + fcntl_flags |= O_APPEND; + if (flags & G_IO_FLAG_NONBLOCK) +#ifdef O_NONBLOCK + fcntl_flags |= O_NONBLOCK; +#else + fcntl_flags |= O_NDELAY; +#endif + + if (fcntl (unix_channel->fd, F_SETFL, fcntl_flags) == -1) + { + int errsv = errno; + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errsv), + g_strerror (errsv)); + return G_IO_STATUS_ERROR; + } + + return G_IO_STATUS_NORMAL; +} + +static GIOFlags +g_io_unix_get_flags (GIOChannel *channel) +{ + GIOFlags flags = 0; + glong fcntl_flags; + GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel; + + fcntl_flags = fcntl (unix_channel->fd, F_GETFL); + + if (fcntl_flags == -1) + { + int err = errno; + g_warning (G_STRLOC "Error while getting flags for FD: %s (%d)\n", + g_strerror (err), err); + return 0; + } + + if (fcntl_flags & O_APPEND) + flags |= G_IO_FLAG_APPEND; +#ifdef O_NONBLOCK + if (fcntl_flags & O_NONBLOCK) +#else + if (fcntl_flags & O_NDELAY) +#endif + flags |= G_IO_FLAG_NONBLOCK; + + switch (fcntl_flags & (O_RDONLY | O_WRONLY | O_RDWR)) + { + case O_RDONLY: + channel->is_readable = TRUE; + channel->is_writeable = FALSE; + break; + case O_WRONLY: + channel->is_readable = FALSE; + channel->is_writeable = TRUE; + break; + case O_RDWR: + channel->is_readable = TRUE; + channel->is_writeable = TRUE; + break; + default: + g_assert_not_reached (); + } + + return flags; +} + +GIOChannel * +g_io_channel_new_file (const gchar *filename, + const gchar *mode, + GError **error) +{ + int fid, flags; + mode_t create_mode; + GIOChannel *channel; + enum { /* Cheesy hack */ + MODE_R = 1 << 0, + MODE_W = 1 << 1, + MODE_A = 1 << 2, + MODE_PLUS = 1 << 3 + } mode_num; + struct stat buffer; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (mode != NULL, NULL); + g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL); + + switch (mode[0]) + { + case 'r': + mode_num = MODE_R; + break; + case 'w': + mode_num = MODE_W; + break; + case 'a': + mode_num = MODE_A; + break; + default: + g_warning ("Invalid GIOFileMode %s.\n", mode); + return NULL; + } + + switch (mode[1]) + { + case '\0': + break; + case '+': + if (mode[2] == '\0') + { + mode_num |= MODE_PLUS; + break; + } + /* Fall through */ + default: + g_warning ("Invalid GIOFileMode %s.\n", mode); + return NULL; + } + + switch (mode_num) + { + case MODE_R: + flags = O_RDONLY; + break; + case MODE_W: + flags = O_WRONLY | O_TRUNC | O_CREAT; + break; + case MODE_A: + flags = O_WRONLY | O_APPEND | O_CREAT; + break; + case MODE_R | MODE_PLUS: + flags = O_RDWR; + break; + case MODE_W | MODE_PLUS: + flags = O_RDWR | O_TRUNC | O_CREAT; + break; + case MODE_A | MODE_PLUS: + flags = O_RDWR | O_APPEND | O_CREAT; + break; + default: + g_assert_not_reached (); + flags = 0; + } + + create_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + fid = open (filename, flags, create_mode); + if (fid == -1) + { + int err = errno; + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (err), + g_strerror (err)); + return (GIOChannel *)NULL; + } + + if (fstat (fid, &buffer) == -1) /* In case someone opens a FIFO */ + { + int err = errno; + close (fid); + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (err), + g_strerror (err)); + return (GIOChannel *)NULL; + } + + channel = (GIOChannel *) g_new (GIOUnixChannel, 1); + + channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode) + || S_ISBLK (buffer.st_mode); + + switch (mode_num) + { + case MODE_R: + channel->is_readable = TRUE; + channel->is_writeable = FALSE; + break; + case MODE_W: + case MODE_A: + channel->is_readable = FALSE; + channel->is_writeable = TRUE; + break; + case MODE_R | MODE_PLUS: + case MODE_W | MODE_PLUS: + case MODE_A | MODE_PLUS: + channel->is_readable = TRUE; + channel->is_writeable = TRUE; + break; + default: + g_assert_not_reached (); + } + + g_io_channel_init (channel); + channel->close_on_unref = TRUE; /* must be after g_io_channel_init () */ + channel->funcs = &unix_channel_funcs; + + ((GIOUnixChannel *) channel)->fd = fid; + return channel; +} + +/** + * g_io_channel_unix_new: + * @fd: a file descriptor. + * @Returns: a new #GIOChannel. + * + * Creates a new #GIOChannel given a file descriptor. On UNIX systems + * this works for plain files, pipes, and sockets. + * + * The returned #GIOChannel has a reference count of 1. + * + * The default encoding for #GIOChannel is UTF-8. If your application + * is reading output from a command using via pipe, you may need to set + * the encoding to the encoding of the current locale (see + * g_get_charset()) with the g_io_channel_set_encoding() function. + * + * If you want to read raw binary data without interpretation, then + * call the g_io_channel_set_encoding() function with %NULL for the + * encoding argument. + * + * This function is available in GLib on Windows, too, but you should + * avoid using it on Windows. The domain of file descriptors and + * sockets overlap. There is no way for GLib to know which one you mean + * in case the argument you pass to this function happens to be both a + * valid file descriptor and socket. If that happens a warning is + * issued, and GLib assumes that it is the file descriptor you mean. + **/ +GIOChannel * +g_io_channel_unix_new (gint fd) +{ + struct stat buffer; + GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1); + GIOChannel *channel = (GIOChannel *)unix_channel; + + g_io_channel_init (channel); + channel->funcs = &unix_channel_funcs; + + unix_channel->fd = fd; + + /* I'm not sure if fstat on a non-file (e.g., socket) works + * it should be safe to say if it fails, the fd isn't seekable. + */ + /* Newer UNIX versions support S_ISSOCK(), fstat() will probably + * succeed in most cases. + */ + if (fstat (unix_channel->fd, &buffer) == 0) + channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode) + || S_ISBLK (buffer.st_mode); + else /* Assume not seekable */ + channel->is_seekable = FALSE; + + g_io_unix_get_flags (channel); /* Sets is_readable, is_writeable */ + + return channel; +} + +/** + * g_io_channel_unix_get_fd: + * @channel: a #GIOChannel, created with g_io_channel_unix_new(). + * @Returns: the file descriptor of the #GIOChannel. + * + * Returns the file descriptor of the #GIOChannel. + * + * On Windows this function returns the file descriptor or socket of + * the #GIOChannel. + **/ +gint +g_io_channel_unix_get_fd (GIOChannel *channel) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + return unix_channel->fd; +} + +#define __G_IO_UNIX_C__ +#include "galiasdef.c" diff --git a/glib/giowin32.c b/glib/giowin32.c new file mode 100644 index 0000000..ae2dcde --- /dev/null +++ b/glib/giowin32.c @@ -0,0 +1,2244 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * giowin32.c: IO Channels for Win32. + * Copyright 1998 Owen Taylor and Tor Lillqvist + * Copyright 1999-2000 Tor Lillqvist and Craig Setera + * Copyright 2001-2003 Andrew Lanoix + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * Bugs that are related to the code in this file: + * + * Bug 137968 - Sometimes a GIOFunc on Win32 is called with zero condition + * http://bugzilla.gnome.org/show_bug.cgi?id=137968 + * + * Bug 324234 - Using g_io_add_watch_full() to wait for connect() to return on a non-blocking socket returns prematurely + * http://bugzilla.gnome.org/show_bug.cgi?id=324234 + * + * Bug 331214 - g_io_channel async socket io stalls + * http://bugzilla.gnome.org/show_bug.cgi?id=331214 + * + * Bug 338943 - Multiple watches on the same socket + * http://bugzilla.gnome.org/show_bug.cgi?id=338943 + * + * Bug 357674 - 2 serious bugs in giowin32.c making glib iochannels useless + * http://bugzilla.gnome.org/show_bug.cgi?id=357674 + * + * Bug 425156 - GIOChannel deadlocks on a win32 socket + * http://bugzilla.gnome.org/show_bug.cgi?id=425156 + * + * Bug 468910 - giofunc condition=0 + * http://bugzilla.gnome.org/show_bug.cgi?id=468910 + * + * Bug 500246 - Bug fixes for giowin32 + * http://bugzilla.gnome.org/show_bug.cgi?id=500246 + * + * Bug 548278 - Async GETs connections are always terminated unexpectedly on windows + * http://bugzilla.gnome.org/show_bug.cgi?id=548278 + * + * Bug 548536 - giowin32 problem when adding and removing watches + * http://bugzilla.gnome.org/show_bug.cgi?id=548536 + * + * When fixing bugs related to the code in this file, either the above + * bugs or others, make sure that the test programs attached to the + * above bugs continue to work. + */ + +#include "config.h" + +#include "glib.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gstdio.h" +#include "glibintl.h" + +#include "galias.h" + +typedef struct _GIOWin32Channel GIOWin32Channel; +typedef struct _GIOWin32Watch GIOWin32Watch; + +#define BUFFER_SIZE 4096 + +typedef enum { + G_IO_WIN32_WINDOWS_MESSAGES, /* Windows messages */ + + G_IO_WIN32_FILE_DESC, /* Unix-like file descriptors from + * _open() or _pipe(), except for + * console IO. Separate thread to read + * or write. + */ + + G_IO_WIN32_CONSOLE, /* Console IO (usually stdin, stdout, stderr) */ + + G_IO_WIN32_SOCKET /* Sockets. No separate thread. */ +} GIOWin32ChannelType; + +struct _GIOWin32Channel { + GIOChannel channel; + gint fd; /* Either a Unix-like file handle as provided + * by the Microsoft C runtime, or a SOCKET + * as provided by WinSock. + */ + GIOWin32ChannelType type; + + gboolean debug; + + /* Field used by G_IO_WIN32_WINDOWS_MESSAGES channels */ + HWND hwnd; /* Handle of window, or NULL */ + + /* Fields used by G_IO_WIN32_FILE_DESC channels. */ + CRITICAL_SECTION mutex; + + int direction; /* 0 means we read from it, + * 1 means we write to it. + */ + + gboolean running; /* Is reader or writer thread + * running. FALSE if EOF has been + * reached by the reader thread. + */ + + gboolean needs_close; /* If the channel has been closed while + * the reader thread was still running. + */ + + guint thread_id; /* If non-NULL the channel has or has + * had a reader or writer thread. + */ + HANDLE data_avail_event; + + gushort revents; + + /* Data is kept in a circular buffer. To be able to distinguish between + * empty and full buffers, we cannot fill it completely, but have to + * leave a one character gap. + * + * Data available is between indexes rdp and wrp-1 (modulo BUFFER_SIZE). + * + * Empty: wrp == rdp + * Full: (wrp + 1) % BUFFER_SIZE == rdp + * Partial: otherwise + */ + guchar *buffer; /* (Circular) buffer */ + gint wrp, rdp; /* Buffer indices for writing and reading */ + HANDLE space_avail_event; + + /* Fields used by G_IO_WIN32_SOCKET channels */ + int event_mask; + int last_events; + HANDLE event; + gboolean write_would_have_blocked; + gboolean ever_writable; +}; + +struct _GIOWin32Watch { + GSource source; + GPollFD pollfd; + GIOChannel *channel; + GIOCondition condition; +}; + +static void +g_win32_print_access_mode (int flags) +{ + g_print ("%s%s%s%s%s%s%s%s%s%s", + ((flags & 0x3) == _O_RDWR ? "O_RDWR" : + ((flags & 0x3) == _O_RDONLY ? "O_RDONLY" : + ((flags & 0x3) == _O_WRONLY ? "O_WRONLY" : "0"))), + (flags & _O_APPEND ? "|O_APPEND" : ""), + (flags & _O_RANDOM ? "|O_RANDOM" : ""), + (flags & _O_SEQUENTIAL ? "|O_SEQUENTIAL" : ""), + (flags & _O_TEMPORARY ? "|O_TEMPORARY" : ""), + (flags & _O_CREAT ? "|O_CREAT" : ""), + (flags & _O_TRUNC ? "|O_TRUNC" : ""), + (flags & _O_EXCL ? "|O_EXCL" : ""), + (flags & _O_TEXT ? "|O_TEXT" : ""), + (flags & _O_BINARY ? "|O_BINARY" : "")); +} + +static void +g_win32_print_gioflags (GIOFlags flags) +{ + char *bar = ""; + + if (flags & G_IO_FLAG_APPEND) + bar = "|", g_print ("APPEND"); + if (flags & G_IO_FLAG_NONBLOCK) + g_print ("%sNONBLOCK", bar), bar = "|"; + if (flags & G_IO_FLAG_IS_READABLE) + g_print ("%sREADABLE", bar), bar = "|"; + if (flags & G_IO_FLAG_IS_WRITEABLE) + g_print ("%sWRITEABLE", bar), bar = "|"; + if (flags & G_IO_FLAG_IS_SEEKABLE) + g_print ("%sSEEKABLE", bar), bar = "|"; +} + +static const char * +event_mask_to_string (int mask) +{ + char buf[100]; + int checked_bits = 0; + char *bufp = buf; + + if (mask == 0) + return ""; + +#define BIT(n) checked_bits |= FD_##n; if (mask & FD_##n) bufp += sprintf (bufp, "%s" #n, (bufp>buf ? "|" : "")) + + BIT (READ); + BIT (WRITE); + BIT (OOB); + BIT (ACCEPT); + BIT (CONNECT); + BIT (CLOSE); + BIT (QOS); + BIT (GROUP_QOS); + BIT (ROUTING_INTERFACE_CHANGE); + BIT (ADDRESS_LIST_CHANGE); + +#undef BIT + + if ((mask & ~checked_bits) != 0) + bufp += sprintf (bufp, "|%#x", mask & ~checked_bits); + + return g_quark_to_string (g_quark_from_string (buf)); +} + +static const char * +condition_to_string (GIOCondition condition) +{ + char buf[100]; + int checked_bits = 0; + char *bufp = buf; + + if (condition == 0) + return ""; + +#define BIT(n) checked_bits |= G_IO_##n; if (condition & G_IO_##n) bufp += sprintf (bufp, "%s" #n, (bufp>buf ? "|" : "")) + + BIT (IN); + BIT (OUT); + BIT (PRI); + BIT (ERR); + BIT (HUP); + BIT (NVAL); + +#undef BIT + + if ((condition & ~checked_bits) != 0) + bufp += sprintf (bufp, "|%#x", condition & ~checked_bits); + + return g_quark_to_string (g_quark_from_string (buf)); +} + +static gboolean +g_io_win32_get_debug_flag (void) +{ + return (getenv ("G_IO_WIN32_DEBUG") != NULL); +} + +static void +g_io_channel_win32_init (GIOWin32Channel *channel) +{ + channel->debug = g_io_win32_get_debug_flag (); + + InitializeCriticalSection (&channel->mutex); + channel->running = FALSE; + channel->needs_close = FALSE; + channel->thread_id = 0; + channel->data_avail_event = NULL; + channel->revents = 0; + channel->buffer = NULL; + channel->space_avail_event = NULL; + + channel->event_mask = 0; + channel->last_events = 0; + channel->event = NULL; + channel->write_would_have_blocked = FALSE; + channel->ever_writable = FALSE; +} + +static void +create_events (GIOWin32Channel *channel) +{ + SECURITY_ATTRIBUTES sec_attrs; + + sec_attrs.nLength = sizeof (SECURITY_ATTRIBUTES); + sec_attrs.lpSecurityDescriptor = NULL; + sec_attrs.bInheritHandle = FALSE; + + /* The data available event is manual reset, the space available event + * is automatic reset. + */ + if (!(channel->data_avail_event = CreateEvent (&sec_attrs, TRUE, FALSE, NULL)) + || !(channel->space_avail_event = CreateEvent (&sec_attrs, FALSE, FALSE, NULL))) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + + g_error ("Error creating event: %s", emsg); + g_free (emsg); + } +} + +static unsigned __stdcall +read_thread (void *parameter) +{ + GIOWin32Channel *channel = parameter; + guchar *buffer; + gint nbytes; + + g_io_channel_ref ((GIOChannel *)channel); + + if (channel->debug) + g_print ("read_thread %#x: start fd=%d, data_avail=%p space_avail=%p\n", + channel->thread_id, + channel->fd, + channel->data_avail_event, + channel->space_avail_event); + + channel->direction = 0; + channel->buffer = g_malloc (BUFFER_SIZE); + channel->rdp = channel->wrp = 0; + channel->running = TRUE; + + SetEvent (channel->space_avail_event); + + EnterCriticalSection (&channel->mutex); + while (channel->running) + { + if (channel->debug) + g_print ("read_thread %#x: rdp=%d, wrp=%d\n", + channel->thread_id, channel->rdp, channel->wrp); + if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) + { + /* Buffer is full */ + if (channel->debug) + g_print ("read_thread %#x: resetting space_avail\n", + channel->thread_id); + ResetEvent (channel->space_avail_event); + if (channel->debug) + g_print ("read_thread %#x: waiting for space\n", + channel->thread_id); + LeaveCriticalSection (&channel->mutex); + WaitForSingleObject (channel->space_avail_event, INFINITE); + EnterCriticalSection (&channel->mutex); + if (channel->debug) + g_print ("read_thread %#x: rdp=%d, wrp=%d\n", + channel->thread_id, channel->rdp, channel->wrp); + } + + buffer = channel->buffer + channel->wrp; + + /* Always leave at least one byte unused gap to be able to + * distinguish between the full and empty condition... + */ + nbytes = MIN ((channel->rdp + BUFFER_SIZE - channel->wrp - 1) % BUFFER_SIZE, + BUFFER_SIZE - channel->wrp); + + if (channel->debug) + g_print ("read_thread %#x: calling read() for %d bytes\n", + channel->thread_id, nbytes); + + LeaveCriticalSection (&channel->mutex); + + nbytes = read (channel->fd, buffer, nbytes); + + EnterCriticalSection (&channel->mutex); + + channel->revents = G_IO_IN; + if (nbytes == 0) + channel->revents |= G_IO_HUP; + else if (nbytes < 0) + channel->revents |= G_IO_ERR; + + if (channel->debug) + g_print ("read_thread %#x: read() returned %d, rdp=%d, wrp=%d\n", + channel->thread_id, nbytes, channel->rdp, channel->wrp); + + if (nbytes <= 0) + break; + + channel->wrp = (channel->wrp + nbytes) % BUFFER_SIZE; + if (channel->debug) + g_print ("read_thread %#x: rdp=%d, wrp=%d, setting data_avail\n", + channel->thread_id, channel->rdp, channel->wrp); + SetEvent (channel->data_avail_event); + } + + channel->running = FALSE; + if (channel->needs_close) + { + if (channel->debug) + g_print ("read_thread %#x: channel fd %d needs closing\n", + channel->thread_id, channel->fd); + close (channel->fd); + channel->fd = -1; + } + + if (channel->debug) + g_print ("read_thread %#x: EOF, rdp=%d, wrp=%d, setting data_avail\n", + channel->thread_id, channel->rdp, channel->wrp); + SetEvent (channel->data_avail_event); + LeaveCriticalSection (&channel->mutex); + + g_io_channel_unref ((GIOChannel *)channel); + + /* No need to call _endthreadex(), the actual thread starter routine + * in MSVCRT (see crt/src/threadex.c:_threadstartex) calls + * _endthreadex() for us. + */ + + return 0; +} + +static unsigned __stdcall +write_thread (void *parameter) +{ + GIOWin32Channel *channel = parameter; + guchar *buffer; + gint nbytes; + + g_io_channel_ref ((GIOChannel *)channel); + + if (channel->debug) + g_print ("write_thread %#x: start fd=%d, data_avail=%p space_avail=%p\n", + channel->thread_id, + channel->fd, + channel->data_avail_event, + channel->space_avail_event); + + channel->direction = 1; + channel->buffer = g_malloc (BUFFER_SIZE); + channel->rdp = channel->wrp = 0; + channel->running = TRUE; + + SetEvent (channel->space_avail_event); + + /* We use the same event objects as for a reader thread, but with + * reversed meaning. So, space_avail is used if data is available + * for writing, and data_avail is used if space is available in the + * write buffer. + */ + + EnterCriticalSection (&channel->mutex); + while (channel->running || channel->rdp != channel->wrp) + { + if (channel->debug) + g_print ("write_thread %#x: rdp=%d, wrp=%d\n", + channel->thread_id, channel->rdp, channel->wrp); + if (channel->wrp == channel->rdp) + { + /* Buffer is empty. */ + if (channel->debug) + g_print ("write_thread %#x: resetting space_avail\n", + channel->thread_id); + ResetEvent (channel->space_avail_event); + if (channel->debug) + g_print ("write_thread %#x: waiting for data\n", + channel->thread_id); + channel->revents = G_IO_OUT; + SetEvent (channel->data_avail_event); + LeaveCriticalSection (&channel->mutex); + WaitForSingleObject (channel->space_avail_event, INFINITE); + + EnterCriticalSection (&channel->mutex); + if (channel->rdp == channel->wrp) + break; + + if (channel->debug) + g_print ("write_thread %#x: rdp=%d, wrp=%d\n", + channel->thread_id, channel->rdp, channel->wrp); + } + + buffer = channel->buffer + channel->rdp; + if (channel->rdp < channel->wrp) + nbytes = channel->wrp - channel->rdp; + else + nbytes = BUFFER_SIZE - channel->rdp; + + if (channel->debug) + g_print ("write_thread %#x: calling write() for %d bytes\n", + channel->thread_id, nbytes); + + LeaveCriticalSection (&channel->mutex); + nbytes = write (channel->fd, buffer, nbytes); + EnterCriticalSection (&channel->mutex); + + if (channel->debug) + g_print ("write_thread %#x: write(%i) returned %d, rdp=%d, wrp=%d\n", + channel->thread_id, channel->fd, nbytes, channel->rdp, channel->wrp); + + channel->revents = 0; + if (nbytes > 0) + channel->revents |= G_IO_OUT; + else if (nbytes <= 0) + channel->revents |= G_IO_ERR; + + channel->rdp = (channel->rdp + nbytes) % BUFFER_SIZE; + + if (nbytes <= 0) + break; + + if (channel->debug) + g_print ("write_thread: setting data_avail for thread %#x\n", + channel->thread_id); + SetEvent (channel->data_avail_event); + } + + channel->running = FALSE; + if (channel->needs_close) + { + if (channel->debug) + g_print ("write_thread %#x: channel fd %d needs closing\n", + channel->thread_id, channel->fd); + close (channel->fd); + channel->fd = -1; + } + + LeaveCriticalSection (&channel->mutex); + + g_io_channel_unref ((GIOChannel *)channel); + + return 0; +} + +static void +create_thread (GIOWin32Channel *channel, + GIOCondition condition, + unsigned (__stdcall *thread) (void *parameter)) +{ + HANDLE thread_handle; + + thread_handle = (HANDLE) _beginthreadex (NULL, 0, thread, channel, 0, + &channel->thread_id); + if (thread_handle == 0) + g_warning ("Error creating thread: %s.", + g_strerror (errno)); + else if (!CloseHandle (thread_handle)) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + + g_warning ("Error closing thread handle: %s.", emsg); + g_free (emsg); + } + + WaitForSingleObject (channel->space_avail_event, INFINITE); +} + +static GIOStatus +buffer_read (GIOWin32Channel *channel, + gchar *dest, + gsize count, + gsize *bytes_read, + GError **err) +{ + guint nbytes; + guint left = count; + + EnterCriticalSection (&channel->mutex); + if (channel->debug) + g_print ("reading from thread %#x %" G_GSIZE_FORMAT " bytes, rdp=%d, wrp=%d\n", + channel->thread_id, count, channel->rdp, channel->wrp); + + if (channel->wrp == channel->rdp) + { + LeaveCriticalSection (&channel->mutex); + if (channel->debug) + g_print ("waiting for data from thread %#x\n", channel->thread_id); + WaitForSingleObject (channel->data_avail_event, INFINITE); + if (channel->debug) + g_print ("done waiting for data from thread %#x\n", channel->thread_id); + EnterCriticalSection (&channel->mutex); + if (channel->wrp == channel->rdp && !channel->running) + { + if (channel->debug) + g_print ("wrp==rdp, !running\n"); + LeaveCriticalSection (&channel->mutex); + *bytes_read = 0; + return G_IO_STATUS_EOF; + } + } + + if (channel->rdp < channel->wrp) + nbytes = channel->wrp - channel->rdp; + else + nbytes = BUFFER_SIZE - channel->rdp; + LeaveCriticalSection (&channel->mutex); + nbytes = MIN (left, nbytes); + if (channel->debug) + g_print ("moving %d bytes from thread %#x\n", + nbytes, channel->thread_id); + memcpy (dest, channel->buffer + channel->rdp, nbytes); + dest += nbytes; + left -= nbytes; + EnterCriticalSection (&channel->mutex); + channel->rdp = (channel->rdp + nbytes) % BUFFER_SIZE; + if (channel->debug) + g_print ("setting space_avail for thread %#x\n", channel->thread_id); + SetEvent (channel->space_avail_event); + if (channel->debug) + g_print ("for thread %#x: rdp=%d, wrp=%d\n", + channel->thread_id, channel->rdp, channel->wrp); + if (channel->running && channel->wrp == channel->rdp) + { + if (channel->debug) + g_print ("resetting data_avail of thread %#x\n", + channel->thread_id); + ResetEvent (channel->data_avail_event); + }; + LeaveCriticalSection (&channel->mutex); + + /* We have no way to indicate any errors form the actual + * read() or recv() call in the reader thread. Should we have? + */ + *bytes_read = count - left; + return (*bytes_read > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; +} + + +static GIOStatus +buffer_write (GIOWin32Channel *channel, + const gchar *dest, + gsize count, + gsize *bytes_written, + GError **err) +{ + guint nbytes; + guint left = count; + + EnterCriticalSection (&channel->mutex); + if (channel->debug) + g_print ("buffer_write: writing to thread %#x %" G_GSIZE_FORMAT " bytes, rdp=%d, wrp=%d\n", + channel->thread_id, count, channel->rdp, channel->wrp); + + if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) + { + /* Buffer is full */ + if (channel->debug) + g_print ("buffer_write: tid %#x: resetting data_avail\n", + channel->thread_id); + ResetEvent (channel->data_avail_event); + if (channel->debug) + g_print ("buffer_write: tid %#x: waiting for space\n", + channel->thread_id); + LeaveCriticalSection (&channel->mutex); + WaitForSingleObject (channel->data_avail_event, INFINITE); + EnterCriticalSection (&channel->mutex); + if (channel->debug) + g_print ("buffer_write: tid %#x: rdp=%d, wrp=%d\n", + channel->thread_id, channel->rdp, channel->wrp); + } + + nbytes = MIN ((channel->rdp + BUFFER_SIZE - channel->wrp - 1) % BUFFER_SIZE, + BUFFER_SIZE - channel->wrp); + + LeaveCriticalSection (&channel->mutex); + nbytes = MIN (left, nbytes); + if (channel->debug) + g_print ("buffer_write: tid %#x: writing %d bytes\n", + channel->thread_id, nbytes); + memcpy (channel->buffer + channel->wrp, dest, nbytes); + dest += nbytes; + left -= nbytes; + EnterCriticalSection (&channel->mutex); + + channel->wrp = (channel->wrp + nbytes) % BUFFER_SIZE; + if (channel->debug) + g_print ("buffer_write: tid %#x: rdp=%d, wrp=%d, setting space_avail\n", + channel->thread_id, channel->rdp, channel->wrp); + SetEvent (channel->space_avail_event); + + if ((channel->wrp + 1) % BUFFER_SIZE == channel->rdp) + { + /* Buffer is full */ + if (channel->debug) + g_print ("buffer_write: tid %#x: resetting data_avail\n", + channel->thread_id); + ResetEvent (channel->data_avail_event); + } + + LeaveCriticalSection (&channel->mutex); + + /* We have no way to indicate any errors form the actual + * write() call in the writer thread. Should we have? + */ + *bytes_written = count - left; + return (*bytes_written > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; +} + + +static gboolean +g_io_win32_prepare (GSource *source, + gint *timeout) +{ + GIOWin32Watch *watch = (GIOWin32Watch *)source; + GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); + GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; + int event_mask; + + *timeout = -1; + + if (channel->debug) + g_print ("g_io_win32_prepare: source=%p channel=%p", source, channel); + + switch (channel->type) + { + case G_IO_WIN32_WINDOWS_MESSAGES: + if (channel->debug) + g_print (" MSG"); + break; + + case G_IO_WIN32_CONSOLE: + if (channel->debug) + g_print (" CON"); + break; + + case G_IO_WIN32_FILE_DESC: + if (channel->debug) + g_print (" FD thread=%#x buffer_condition:{%s}" + "\n watch->pollfd.events:{%s} watch->pollfd.revents:{%s} channel->revents:{%s}", + channel->thread_id, condition_to_string (buffer_condition), + condition_to_string (watch->pollfd.events), + condition_to_string (watch->pollfd.revents), + condition_to_string (channel->revents)); + + EnterCriticalSection (&channel->mutex); + if (channel->running) + { + if (channel->direction == 0 && channel->wrp == channel->rdp) + { + if (channel->debug) + g_print ("\n setting revents=0"); + channel->revents = 0; + } + } + else + { + if (channel->direction == 1 + && (channel->wrp + 1) % BUFFER_SIZE == channel->rdp) + { + if (channel->debug) + g_print ("\n setting revents=0"); + channel->revents = 0; + } + } + LeaveCriticalSection (&channel->mutex); + break; + + case G_IO_WIN32_SOCKET: + if (channel->debug) + g_print (" SOCK"); + event_mask = 0; + if (watch->condition & G_IO_IN) + event_mask |= (FD_READ | FD_ACCEPT); + if (watch->condition & G_IO_OUT) + event_mask |= (FD_WRITE | FD_CONNECT); + event_mask |= FD_CLOSE; + + if (channel->event_mask != event_mask) + { + if (channel->debug) + g_print ("\n WSAEventSelect(%d,%p,{%s})", + channel->fd, (HANDLE) watch->pollfd.fd, + event_mask_to_string (event_mask)); + if (WSAEventSelect (channel->fd, (HANDLE) watch->pollfd.fd, + event_mask) == SOCKET_ERROR) + if (channel->debug) + { + gchar *emsg = g_win32_error_message (WSAGetLastError ()); + + g_print (" failed: %s", emsg); + g_free (emsg); + } + channel->event_mask = event_mask; + + if (channel->debug) + g_print ("\n setting last_events=0"); + channel->last_events = 0; + + if ((event_mask & FD_WRITE) && + channel->ever_writable && + !channel->write_would_have_blocked) + { + if (channel->debug) + g_print (" WSASetEvent(%p)", (WSAEVENT) watch->pollfd.fd); + WSASetEvent ((WSAEVENT) watch->pollfd.fd); + } + } + break; + + default: + g_assert_not_reached (); + abort (); + } + if (channel->debug) + g_print ("\n"); + + return ((watch->condition & buffer_condition) == watch->condition); +} + +static gboolean +g_io_win32_check (GSource *source) +{ + MSG msg; + GIOWin32Watch *watch = (GIOWin32Watch *)source; + GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; + GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); + WSANETWORKEVENTS events; + + if (channel->debug) + g_print ("g_io_win32_check: source=%p channel=%p", source, channel); + + switch (channel->type) + { + case G_IO_WIN32_WINDOWS_MESSAGES: + if (channel->debug) + g_print (" MSG\n"); + return (PeekMessage (&msg, channel->hwnd, 0, 0, PM_NOREMOVE)); + + case G_IO_WIN32_FILE_DESC: + if (channel->debug) + g_print (" FD thread=%#x buffer_condition=%s\n" + " watch->pollfd.events={%s} watch->pollfd.revents={%s} channel->revents={%s}\n", + channel->thread_id, condition_to_string (buffer_condition), + condition_to_string (watch->pollfd.events), + condition_to_string (watch->pollfd.revents), + condition_to_string (channel->revents)); + + watch->pollfd.revents = (watch->pollfd.events & channel->revents); + + return ((watch->pollfd.revents | buffer_condition) & watch->condition); + + case G_IO_WIN32_CONSOLE: + if (channel->debug) + g_print (" CON\n"); + if (watch->channel->is_writeable) + return TRUE; + else if (watch->channel->is_readable) + { + INPUT_RECORD buffer; + DWORD n; + if (PeekConsoleInput ((HANDLE) watch->pollfd.fd, &buffer, 1, &n) && + n == 1) + { + /* _kbhit() does quite complex processing to find out + * whether at least one of the key events pending corresponds + * to a "real" character that can be read. + */ + if (_kbhit ()) + return TRUE; + + /* Discard all other kinds of events */ + ReadConsoleInput ((HANDLE) watch->pollfd.fd, &buffer, 1, &n); + } + } + return FALSE; + + case G_IO_WIN32_SOCKET: + if (channel->debug) + g_print (" SOCK"); + if (channel->last_events & FD_WRITE) + { + if (channel->debug) + g_print (" sock=%d event=%p last_events has FD_WRITE", + channel->fd, (HANDLE) watch->pollfd.fd); + } + else + { + WSAEnumNetworkEvents (channel->fd, 0, &events); + + if (channel->debug) + g_print ("\n revents={%s} condition={%s}" + "\n WSAEnumNetworkEvents(%d,0) sets events={%s}", + condition_to_string (watch->pollfd.revents), + condition_to_string (watch->condition), + channel->fd, + event_mask_to_string (events.lNetworkEvents)); + + if (watch->pollfd.revents != 0 && + events.lNetworkEvents == 0 && + !(channel->event_mask & FD_WRITE)) + { + channel->event_mask = 0; + if (channel->debug) + g_print ("\n WSAEventSelect(%d,%p,{})", + channel->fd, (HANDLE) watch->pollfd.fd); + WSAEventSelect (channel->fd, (HANDLE) watch->pollfd.fd, 0); + if (channel->debug) + g_print (" ResetEvent(%p)", + (HANDLE) watch->pollfd.fd); + ResetEvent ((HANDLE) watch->pollfd.fd); + } + else if (events.lNetworkEvents & FD_WRITE) + channel->ever_writable = TRUE; + channel->last_events = events.lNetworkEvents; + } + + watch->pollfd.revents = 0; + if (channel->last_events & (FD_READ | FD_ACCEPT)) + watch->pollfd.revents |= G_IO_IN; + + if (channel->last_events & FD_WRITE) + watch->pollfd.revents |= G_IO_OUT; + else + { + /* We have called WSAEnumNetworkEvents() above but it didn't + * set FD_WRITE. + */ + if (events.lNetworkEvents & FD_CONNECT) + { + if (events.iErrorCode[FD_CONNECT_BIT] == 0) + watch->pollfd.revents |= G_IO_OUT; + else + watch->pollfd.revents |= (G_IO_HUP | G_IO_ERR); + } + if (watch->pollfd.revents == 0 && (channel->last_events & (FD_CLOSE))) + watch->pollfd.revents |= G_IO_HUP; + } + + /* Regardless of WSAEnumNetworkEvents() result, if watching for + * writability, and if we have ever got a FD_WRITE event, and + * unless last write would have blocked, set G_IO_OUT. But never + * set both G_IO_OUT and G_IO_HUP. + */ + if (!(watch->pollfd.revents & G_IO_HUP) && + channel->ever_writable && + !channel->write_would_have_blocked && + (channel->event_mask & FD_WRITE)) + watch->pollfd.revents |= G_IO_OUT; + + if (channel->debug) + g_print ("\n revents={%s} retval={%s}\n", + condition_to_string (watch->pollfd.revents), + condition_to_string ((watch->pollfd.revents | buffer_condition) & watch->condition)); + + return ((watch->pollfd.revents | buffer_condition) & watch->condition); + + default: + g_assert_not_reached (); + abort (); + } +} + +static gboolean +g_io_win32_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GIOFunc func = (GIOFunc)callback; + GIOWin32Watch *watch = (GIOWin32Watch *)source; + GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; + GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel); + + if (!func) + { + g_warning ("IO Watch dispatched without callback\n" + "You must call g_source_connect()."); + return FALSE; + } + + if (channel->debug) + g_print ("g_io_win32_dispatch: pollfd.revents=%s condition=%s result=%s\n", + condition_to_string (watch->pollfd.revents), + condition_to_string (watch->condition), + condition_to_string ((watch->pollfd.revents | buffer_condition) & watch->condition)); + + return (*func) (watch->channel, + (watch->pollfd.revents | buffer_condition) & watch->condition, + user_data); +} + +static void +g_io_win32_finalize (GSource *source) +{ + GIOWin32Watch *watch = (GIOWin32Watch *)source; + GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel; + + if (channel->debug) + g_print ("g_io_win32_finalize: source=%p channel=%p", source, channel); + + switch (channel->type) + { + case G_IO_WIN32_WINDOWS_MESSAGES: + if (channel->debug) + g_print (" MSG"); + break; + + case G_IO_WIN32_CONSOLE: + if (channel->debug) + g_print (" CON"); + break; + + case G_IO_WIN32_FILE_DESC: + if (channel->debug) + g_print (" FD thread=%#x", channel->thread_id); + break; + + case G_IO_WIN32_SOCKET: + if (channel->debug) + g_print (" SOCK sock=%d", channel->fd); + break; + + default: + g_assert_not_reached (); + abort (); + } + if (channel->debug) + g_print ("\n"); + g_io_channel_unref (watch->channel); +} + +GSourceFuncs g_io_watch_funcs = { + g_io_win32_prepare, + g_io_win32_check, + g_io_win32_dispatch, + g_io_win32_finalize +}; + +static GIOStatus +g_io_win32_msg_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + MSG msg; /* In case of alignment problems */ + + if (count < sizeof (MSG)) + { + g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_INVAL, + "Incorrect message size"); /* Informative enough error message? */ + return G_IO_STATUS_ERROR; + } + + if (win32_channel->debug) + g_print ("g_io_win32_msg_read: channel=%p hwnd=%p\n", + channel, win32_channel->hwnd); + if (!PeekMessage (&msg, win32_channel->hwnd, 0, 0, PM_REMOVE)) + return G_IO_STATUS_AGAIN; + + memmove (buf, &msg, sizeof (MSG)); + *bytes_read = sizeof (MSG); + + return G_IO_STATUS_NORMAL; +} + +static GIOStatus +g_io_win32_msg_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + MSG msg; + + if (count != sizeof (MSG)) + { + g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_INVAL, + "Incorrect message size"); /* Informative enough error message? */ + return G_IO_STATUS_ERROR; + } + + /* In case of alignment problems */ + memmove (&msg, buf, sizeof (MSG)); + if (!PostMessage (win32_channel->hwnd, msg.message, msg.wParam, msg.lParam)) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + + g_set_error_literal (err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_FAILED, emsg); + g_free (emsg); + + return G_IO_STATUS_ERROR; + } + + *bytes_written = sizeof (MSG); + + return G_IO_STATUS_NORMAL; +} + +static GIOStatus +g_io_win32_msg_close (GIOChannel *channel, + GError **err) +{ + /* Nothing to be done. Or should we set hwnd to some invalid value? */ + + return G_IO_STATUS_NORMAL; +} + +static void +g_io_win32_free (GIOChannel *channel) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + if (win32_channel->debug) + g_print ("g_io_win32_free channel=%p fd=%d\n", channel, win32_channel->fd); + + DeleteCriticalSection (&win32_channel->mutex); + + if (win32_channel->data_avail_event) + if (!CloseHandle (win32_channel->data_avail_event)) + if (win32_channel->debug) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + + g_print (" CloseHandle(%p) failed: %s\n", + win32_channel->data_avail_event, emsg); + g_free (emsg); + } + + g_free (win32_channel->buffer); + + if (win32_channel->space_avail_event) + if (!CloseHandle (win32_channel->space_avail_event)) + if (win32_channel->debug) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + + g_print (" CloseHandle(%p) failed: %s\n", + win32_channel->space_avail_event, emsg); + g_free (emsg); + } + + if (win32_channel->type == G_IO_WIN32_SOCKET && + win32_channel->fd != -1) + if (WSAEventSelect (win32_channel->fd, NULL, 0) == SOCKET_ERROR) + if (win32_channel->debug) + { + gchar *emsg = g_win32_error_message (WSAGetLastError ()); + + g_print (" WSAEventSelect(%d,NULL,{}) failed: %s\n", + win32_channel->fd, emsg); + g_free (emsg); + } + + if (win32_channel->event) + if (!WSACloseEvent (win32_channel->event)) + if (win32_channel->debug) + { + gchar *emsg = g_win32_error_message (WSAGetLastError ()); + + g_print (" WSACloseEvent(%p) failed: %s\n", + win32_channel->event, emsg); + g_free (emsg); + } + + g_free (win32_channel); +} + +static GSource * +g_io_win32_msg_create_watch (GIOChannel *channel, + GIOCondition condition) +{ + GIOWin32Watch *watch; + GSource *source; + + source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); + watch = (GIOWin32Watch *)source; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->condition = condition; + + watch->pollfd.fd = (gintptr) G_WIN32_MSG_HANDLE; + watch->pollfd.events = condition; + + g_source_add_poll (source, &watch->pollfd); + + return source; +} + +static GIOStatus +g_io_win32_fd_and_console_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + gint result; + + if (win32_channel->debug) + g_print ("g_io_win32_fd_read: fd=%d count=%" G_GSIZE_FORMAT "\n", + win32_channel->fd, count); + + if (win32_channel->thread_id) + { + return buffer_read (win32_channel, buf, count, bytes_read, err); + } + + result = read (win32_channel->fd, buf, count); + + if (win32_channel->debug) + g_print ("g_io_win32_fd_read: read() => %d\n", result); + + if (result < 0) + { + *bytes_read = 0; + + switch (errno) + { +#ifdef EAGAIN + case EAGAIN: + return G_IO_STATUS_AGAIN; +#endif + default: + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errno), + g_strerror (errno)); + return G_IO_STATUS_ERROR; + } + } + + *bytes_read = result; + + return (result > 0) ? G_IO_STATUS_NORMAL : G_IO_STATUS_EOF; +} + +static GIOStatus +g_io_win32_fd_and_console_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + gint result; + + if (win32_channel->thread_id) + { + return buffer_write (win32_channel, buf, count, bytes_written, err); + } + + result = write (win32_channel->fd, buf, count); + if (win32_channel->debug) + g_print ("g_io_win32_fd_write: fd=%d count=%" G_GSIZE_FORMAT " => %d\n", + win32_channel->fd, count, result); + + if (result < 0) + { + *bytes_written = 0; + + switch (errno) + { +#ifdef EAGAIN + case EAGAIN: + return G_IO_STATUS_AGAIN; +#endif + default: + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errno), + g_strerror (errno)); + return G_IO_STATUS_ERROR; + } + } + + *bytes_written = result; + + return G_IO_STATUS_NORMAL; +} + +static GIOStatus +g_io_win32_fd_seek (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + int whence; + off_t tmp_offset; + off_t result; + + switch (type) + { + case G_SEEK_SET: + whence = SEEK_SET; + break; + case G_SEEK_CUR: + whence = SEEK_CUR; + break; + case G_SEEK_END: + whence = SEEK_END; + break; + default: + whence = -1; /* Keep the compiler quiet */ + g_assert_not_reached (); + abort (); + } + + tmp_offset = offset; + if (tmp_offset != offset) + { + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (EINVAL), + g_strerror (EINVAL)); + return G_IO_STATUS_ERROR; + } + + result = lseek (win32_channel->fd, tmp_offset, whence); + + if (result < 0) + { + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errno), + g_strerror (errno)); + return G_IO_STATUS_ERROR; + } + + return G_IO_STATUS_NORMAL; +} + +static GIOStatus +g_io_win32_fd_close (GIOChannel *channel, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + if (win32_channel->debug) + g_print ("g_io_win32_fd_close: thread=%#x: fd=%d\n", + win32_channel->thread_id, + win32_channel->fd); + EnterCriticalSection (&win32_channel->mutex); + if (win32_channel->running) + { + if (win32_channel->debug) + g_print ("thread %#x: running, marking fd %d for later close\n", + win32_channel->thread_id, win32_channel->fd); + win32_channel->running = FALSE; + win32_channel->needs_close = TRUE; + if (win32_channel->direction == 0) + SetEvent (win32_channel->data_avail_event); + else + SetEvent (win32_channel->space_avail_event); + } + else + { + if (win32_channel->debug) + g_print ("closing fd %d\n", win32_channel->fd); + close (win32_channel->fd); + if (win32_channel->debug) + g_print ("closed fd %d, setting to -1\n", + win32_channel->fd); + win32_channel->fd = -1; + } + LeaveCriticalSection (&win32_channel->mutex); + + /* FIXME error detection? */ + + return G_IO_STATUS_NORMAL; +} + +static GSource * +g_io_win32_fd_create_watch (GIOChannel *channel, + GIOCondition condition) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); + GIOWin32Watch *watch = (GIOWin32Watch *)source; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->condition = condition; + + if (win32_channel->data_avail_event == NULL) + create_events (win32_channel); + + watch->pollfd.fd = (gintptr) win32_channel->data_avail_event; + watch->pollfd.events = condition; + + if (win32_channel->debug) + g_print ("g_io_win32_fd_create_watch: channel=%p fd=%d condition={%s} event=%p\n", + channel, win32_channel->fd, + condition_to_string (condition), (HANDLE) watch->pollfd.fd); + + EnterCriticalSection (&win32_channel->mutex); + if (win32_channel->thread_id == 0) + { + if (condition & G_IO_IN) + create_thread (win32_channel, condition, read_thread); + else if (condition & G_IO_OUT) + create_thread (win32_channel, condition, write_thread); + } + + g_source_add_poll (source, &watch->pollfd); + LeaveCriticalSection (&win32_channel->mutex); + + return source; +} + +static GIOStatus +g_io_win32_console_close (GIOChannel *channel, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + if (close (win32_channel->fd) < 0) + { + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + g_io_channel_error_from_errno (errno), + g_strerror (errno)); + return G_IO_STATUS_ERROR; + } + + return G_IO_STATUS_NORMAL; +} + +static GSource * +g_io_win32_console_create_watch (GIOChannel *channel, + GIOCondition condition) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); + GIOWin32Watch *watch = (GIOWin32Watch *)source; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->condition = condition; + + watch->pollfd.fd = _get_osfhandle (win32_channel->fd); + watch->pollfd.events = condition; + + g_source_add_poll (source, &watch->pollfd); + + return source; +} + +static GIOStatus +g_io_win32_sock_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + gint result; + GIOChannelError error; + int winsock_error; + + if (win32_channel->debug) + g_print ("g_io_win32_sock_read: channel=%p sock=%d count=%" G_GSIZE_FORMAT, + channel, win32_channel->fd, count); + + result = recv (win32_channel->fd, buf, count, 0); + if (result == SOCKET_ERROR) + winsock_error = WSAGetLastError (); + + if (win32_channel->debug) + g_print (" recv=%d", result); + + if (result == SOCKET_ERROR) + { + gchar *emsg = g_win32_error_message (winsock_error); + + if (win32_channel->debug) + g_print (" %s\n", emsg); + + *bytes_read = 0; + + switch (winsock_error) + { + case WSAEINVAL: + error = G_IO_CHANNEL_ERROR_INVAL; + break; + case WSAEWOULDBLOCK: + g_free (emsg); + return G_IO_STATUS_AGAIN; + default: + error = G_IO_CHANNEL_ERROR_FAILED; + break; + } + g_set_error_literal (err, G_IO_CHANNEL_ERROR, error, emsg); + g_free (emsg); + + return G_IO_STATUS_ERROR; + } + else + { + if (win32_channel->debug) + g_print ("\n"); + *bytes_read = result; + if (result == 0) + return G_IO_STATUS_EOF; + else + return G_IO_STATUS_NORMAL; + } +} + +static GIOStatus +g_io_win32_sock_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + gint result; + GIOChannelError error; + int winsock_error; + + if (win32_channel->debug) + g_print ("g_io_win32_sock_write: channel=%p sock=%d count=%" G_GSIZE_FORMAT, + channel, win32_channel->fd, count); + + result = send (win32_channel->fd, buf, count, 0); + if (result == SOCKET_ERROR) + winsock_error = WSAGetLastError (); + + if (win32_channel->debug) + g_print (" send=%d", result); + + if (result == SOCKET_ERROR) + { + gchar *emsg = g_win32_error_message (winsock_error); + + if (win32_channel->debug) + g_print (" %s\n", emsg); + + *bytes_written = 0; + + switch (winsock_error) + { + case WSAEINVAL: + error = G_IO_CHANNEL_ERROR_INVAL; + break; + case WSAEWOULDBLOCK: + win32_channel->write_would_have_blocked = TRUE; + win32_channel->last_events = 0; + g_free (emsg); + return G_IO_STATUS_AGAIN; + default: + error = G_IO_CHANNEL_ERROR_FAILED; + break; + } + g_set_error_literal (err, G_IO_CHANNEL_ERROR, error, emsg); + g_free (emsg); + + return G_IO_STATUS_ERROR; + } + else + { + if (win32_channel->debug) + g_print ("\n"); + *bytes_written = result; + win32_channel->write_would_have_blocked = FALSE; + + return G_IO_STATUS_NORMAL; + } +} + +static GIOStatus +g_io_win32_sock_close (GIOChannel *channel, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + if (win32_channel->fd != -1) + { + if (win32_channel->debug) + g_print ("g_io_win32_sock_close: channel=%p sock=%d\n", + channel, win32_channel->fd); + + closesocket (win32_channel->fd); + win32_channel->fd = -1; + } + + /* FIXME error detection? */ + + return G_IO_STATUS_NORMAL; +} + +static GSource * +g_io_win32_sock_create_watch (GIOChannel *channel, + GIOCondition condition) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + GSource *source = g_source_new (&g_io_watch_funcs, sizeof (GIOWin32Watch)); + GIOWin32Watch *watch = (GIOWin32Watch *)source; + + watch->channel = channel; + g_io_channel_ref (channel); + + watch->condition = condition; + + if (win32_channel->event == 0) + win32_channel->event = WSACreateEvent (); + + watch->pollfd.fd = (gintptr) win32_channel->event; + watch->pollfd.events = condition; + + if (win32_channel->debug) + g_print ("g_io_win32_sock_create_watch: channel=%p sock=%d event=%p condition={%s}\n", + channel, win32_channel->fd, (HANDLE) watch->pollfd.fd, + condition_to_string (watch->condition)); + + g_source_add_poll (source, &watch->pollfd); + + return source; +} + +GIOChannel * +g_io_channel_new_file (const gchar *filename, + const gchar *mode, + GError **error) +{ + int fid, flags, pmode; + GIOChannel *channel; + + enum { /* Cheesy hack */ + MODE_R = 1 << 0, + MODE_W = 1 << 1, + MODE_A = 1 << 2, + MODE_PLUS = 1 << 3, + } mode_num; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (mode != NULL, NULL); + g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL); + + switch (mode[0]) + { + case 'r': + mode_num = MODE_R; + break; + case 'w': + mode_num = MODE_W; + break; + case 'a': + mode_num = MODE_A; + break; + default: + g_warning ("Invalid GIOFileMode %s.", mode); + return NULL; + } + + switch (mode[1]) + { + case '\0': + break; + case '+': + if (mode[2] == '\0') + { + mode_num |= MODE_PLUS; + break; + } + /* Fall through */ + default: + g_warning ("Invalid GIOFileMode %s.", mode); + return NULL; + } + + switch (mode_num) + { + case MODE_R: + flags = O_RDONLY; + pmode = _S_IREAD; + break; + case MODE_W: + flags = O_WRONLY | O_TRUNC | O_CREAT; + pmode = _S_IWRITE; + break; + case MODE_A: + flags = O_WRONLY | O_APPEND | O_CREAT; + pmode = _S_IWRITE; + break; + case MODE_R | MODE_PLUS: + flags = O_RDWR; + pmode = _S_IREAD | _S_IWRITE; + break; + case MODE_W | MODE_PLUS: + flags = O_RDWR | O_TRUNC | O_CREAT; + pmode = _S_IREAD | _S_IWRITE; + break; + case MODE_A | MODE_PLUS: + flags = O_RDWR | O_APPEND | O_CREAT; + pmode = _S_IREAD | _S_IWRITE; + break; + default: + g_assert_not_reached (); + abort (); + } + + /* always open 'untranslated' */ + fid = g_open (filename, flags | _O_BINARY, pmode); + + if (g_io_win32_get_debug_flag ()) + { + g_print ("g_io_channel_win32_new_file: open(\"%s\",", filename); + g_win32_print_access_mode (flags|_O_BINARY); + g_print (",%#o)=%d\n", pmode, fid); + } + + if (fid < 0) + { + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (errno), + g_strerror (errno)); + return (GIOChannel *)NULL; + } + + channel = g_io_channel_win32_new_fd (fid); + + /* XXX: move this to g_io_channel_win32_new_fd () */ + channel->close_on_unref = TRUE; + channel->is_seekable = TRUE; + + /* g_io_channel_win32_new_fd sets is_readable and is_writeable to + * correspond to actual readability/writeability. Set to FALSE those + * that mode doesn't allow + */ + switch (mode_num) + { + case MODE_R: + channel->is_writeable = FALSE; + break; + case MODE_W: + case MODE_A: + channel->is_readable = FALSE; + break; + case MODE_R | MODE_PLUS: + case MODE_W | MODE_PLUS: + case MODE_A | MODE_PLUS: + break; + default: + g_assert_not_reached (); + abort (); + } + + return channel; +} + +#if !defined (_WIN64) + +#undef g_io_channel_new_file + +/* Binary compatibility version. Not for newly compiled code. */ + +GIOChannel * +g_io_channel_new_file (const gchar *filename, + const gchar *mode, + GError **error) +{ + gchar *utf8_filename = g_locale_to_utf8 (filename, -1, NULL, NULL, error); + GIOChannel *retval; + + if (utf8_filename == NULL) + return NULL; + + retval = g_io_channel_new_file_utf8 (utf8_filename, mode, error); + + g_free (utf8_filename); + + return retval; +} + +#endif + +static GIOStatus +g_io_win32_unimpl_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + if (win32_channel->debug) + { + g_print ("g_io_win32_unimpl_set_flags: "); + g_win32_print_gioflags (flags); + g_print ("\n"); + } + + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + G_IO_CHANNEL_ERROR_FAILED, + "Not implemented on Win32"); + + return G_IO_STATUS_ERROR; +} + +static GIOFlags +g_io_win32_fd_get_flags_internal (GIOChannel *channel, + struct _stati64 *st) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; + gchar c; + DWORD count; + + if (st->st_mode & _S_IFIFO) + { + channel->is_readable = + (PeekNamedPipe ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL, NULL) != 0) || GetLastError () == ERROR_BROKEN_PIPE; + channel->is_writeable = + (WriteFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0); + channel->is_seekable = FALSE; + } + else + { + channel->is_readable = + (ReadFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0); + channel->is_writeable = + (WriteFile ((HANDLE) _get_osfhandle (win32_channel->fd), &c, 0, &count, NULL) != 0); + channel->is_seekable = TRUE; + } + + /* XXX: G_IO_FLAG_APPEND */ + /* XXX: G_IO_FLAG_NONBLOCK */ + + return 0; +} + +static GIOFlags +g_io_win32_fd_get_flags (GIOChannel *channel) +{ + struct _stati64 st; + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + g_return_val_if_fail (win32_channel != NULL, 0); + g_return_val_if_fail (win32_channel->type == G_IO_WIN32_FILE_DESC, 0); + + if (0 == _fstati64 (win32_channel->fd, &st)) + return g_io_win32_fd_get_flags_internal (channel, &st); + else + return 0; +} + +static GIOFlags +g_io_win32_console_get_flags_internal (GIOChannel *channel) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel; + HANDLE handle = (HANDLE) _get_osfhandle (win32_channel->fd); + gchar c; + DWORD count; + INPUT_RECORD record; + + channel->is_readable = PeekConsoleInput (handle, &record, 1, &count); + channel->is_writeable = WriteFile (handle, &c, 0, &count, NULL); + channel->is_seekable = FALSE; + + return 0; +} + +static GIOFlags +g_io_win32_console_get_flags (GIOChannel *channel) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + g_return_val_if_fail (win32_channel != NULL, 0); + g_return_val_if_fail (win32_channel->type == G_IO_WIN32_CONSOLE, 0); + + return g_io_win32_console_get_flags_internal (channel); +} + +static GIOFlags +g_io_win32_msg_get_flags (GIOChannel *channel) +{ + return 0; +} + +static GIOStatus +g_io_win32_sock_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **err) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + u_long arg; + + if (win32_channel->debug) + { + g_print ("g_io_win32_sock_set_flags: "); + g_win32_print_gioflags (flags); + g_print ("\n"); + } + + if (flags & G_IO_FLAG_NONBLOCK) + { + arg = 1; + if (ioctlsocket (win32_channel->fd, FIONBIO, &arg) == SOCKET_ERROR) + { + gchar *emsg = g_win32_error_message (WSAGetLastError ()); + + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + G_IO_CHANNEL_ERROR_FAILED, + emsg); + g_free (emsg); + + return G_IO_STATUS_ERROR; + } + } + else + { + arg = 0; + if (ioctlsocket (win32_channel->fd, FIONBIO, &arg) == SOCKET_ERROR) + { + gchar *emsg = g_win32_error_message (WSAGetLastError ()); + + g_set_error_literal (err, G_IO_CHANNEL_ERROR, + G_IO_CHANNEL_ERROR_FAILED, + emsg); + g_free (emsg); + + return G_IO_STATUS_ERROR; + } + } + + return G_IO_STATUS_NORMAL; +} + +static GIOFlags +g_io_win32_sock_get_flags (GIOChannel *channel) +{ + /* Could we do something here? */ + return 0; +} + +static GIOFuncs win32_channel_msg_funcs = { + g_io_win32_msg_read, + g_io_win32_msg_write, + NULL, + g_io_win32_msg_close, + g_io_win32_msg_create_watch, + g_io_win32_free, + g_io_win32_unimpl_set_flags, + g_io_win32_msg_get_flags, +}; + +static GIOFuncs win32_channel_fd_funcs = { + g_io_win32_fd_and_console_read, + g_io_win32_fd_and_console_write, + g_io_win32_fd_seek, + g_io_win32_fd_close, + g_io_win32_fd_create_watch, + g_io_win32_free, + g_io_win32_unimpl_set_flags, + g_io_win32_fd_get_flags, +}; + +static GIOFuncs win32_channel_console_funcs = { + g_io_win32_fd_and_console_read, + g_io_win32_fd_and_console_write, + NULL, + g_io_win32_console_close, + g_io_win32_console_create_watch, + g_io_win32_free, + g_io_win32_unimpl_set_flags, + g_io_win32_console_get_flags, +}; + +static GIOFuncs win32_channel_sock_funcs = { + g_io_win32_sock_read, + g_io_win32_sock_write, + NULL, + g_io_win32_sock_close, + g_io_win32_sock_create_watch, + g_io_win32_free, + g_io_win32_sock_set_flags, + g_io_win32_sock_get_flags, +}; + +/** + * g_io_channel_win32_new_messages: + * @hwnd: a window handle. + * @Returns: a new #GIOChannel. + * + * Creates a new #GIOChannel given a window handle on Windows. + * + * This function creates a #GIOChannel that can be used to poll for + * Windows messages for the window in question. + **/ +GIOChannel * +#if GLIB_SIZEOF_VOID_P == 8 +g_io_channel_win32_new_messages (gsize hwnd) +#else +g_io_channel_win32_new_messages (guint hwnd) +#endif +{ + GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1); + GIOChannel *channel = (GIOChannel *)win32_channel; + + g_io_channel_init (channel); + g_io_channel_win32_init (win32_channel); + if (win32_channel->debug) + g_print ("g_io_channel_win32_new_messages: channel=%p hwnd=%p\n", + channel, (HWND) hwnd); + channel->funcs = &win32_channel_msg_funcs; + win32_channel->type = G_IO_WIN32_WINDOWS_MESSAGES; + win32_channel->hwnd = (HWND) hwnd; + + /* XXX: check this. */ + channel->is_readable = IsWindow (win32_channel->hwnd); + channel->is_writeable = IsWindow (win32_channel->hwnd); + + channel->is_seekable = FALSE; + + return channel; +} + +static GIOChannel * +g_io_channel_win32_new_fd_internal (gint fd, + struct _stati64 *st) +{ + GIOWin32Channel *win32_channel; + GIOChannel *channel; + + win32_channel = g_new (GIOWin32Channel, 1); + channel = (GIOChannel *)win32_channel; + + g_io_channel_init (channel); + g_io_channel_win32_init (win32_channel); + + win32_channel->fd = fd; + + if (win32_channel->debug) + g_print ("g_io_channel_win32_new_fd: channel=%p fd=%u\n", + channel, fd); + + if (st->st_mode & _S_IFCHR) /* console */ + { + channel->funcs = &win32_channel_console_funcs; + win32_channel->type = G_IO_WIN32_CONSOLE; + g_io_win32_console_get_flags_internal (channel); + } + else + { + channel->funcs = &win32_channel_fd_funcs; + win32_channel->type = G_IO_WIN32_FILE_DESC; + g_io_win32_fd_get_flags_internal (channel, st); + } + + return channel; +} + +/** + * g_io_channel_win32_new_fd: + * @fd: a C library file descriptor. + * @Returns: a new #GIOChannel. + * + * Creates a new #GIOChannel given a file descriptor on Windows. This + * works for file descriptors from the C runtime. + * + * This function works for file descriptors as returned by the open(), + * creat(), pipe() and fileno() calls in the Microsoft C runtime. In + * order to meaningfully use this function your code should use the + * same C runtime as GLib uses, which is msvcrt.dll. Note that in + * current Microsoft compilers it is near impossible to convince it to + * build code that would use msvcrt.dll. The last Microsoft compiler + * version that supported using msvcrt.dll as the C runtime was version + * 6. The GNU compiler and toolchain for Windows, also known as Mingw, + * fully supports msvcrt.dll. + * + * If you have created a #GIOChannel for a file descriptor and started + * watching (polling) it, you shouldn't call read() on the file + * descriptor. This is because adding polling for a file descriptor is + * implemented in GLib on Windows by starting a thread that sits + * blocked in a read() from the file descriptor most of the time. All + * reads from the file descriptor should be done by this internal GLib + * thread. Your code should call only g_io_channel_read(). + * + * This function is available only in GLib on Windows. + **/ +GIOChannel * +g_io_channel_win32_new_fd (gint fd) +{ + struct _stati64 st; + + if (_fstati64 (fd, &st) == -1) + { + g_warning ("g_io_channel_win32_new_fd: %d isn't an open file descriptor in the C library GLib uses.", fd); + return NULL; + } + + return g_io_channel_win32_new_fd_internal (fd, &st); +} + +gint +g_io_channel_win32_get_fd (GIOChannel *channel) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + return win32_channel->fd; +} + +/** + * g_io_channel_win32_new_socket: + * @socket: a Winsock socket + * @Returns: a new #GIOChannel + * + * Creates a new #GIOChannel given a socket on Windows. + * + * This function works for sockets created by Winsock. It's available + * only in GLib on Windows. + * + * Polling a #GSource created to watch a channel for a socket puts the + * socket in non-blocking mode. This is a side-effect of the + * implementation and unavoidable. + **/ +GIOChannel * +g_io_channel_win32_new_socket (int socket) +{ + GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1); + GIOChannel *channel = (GIOChannel *)win32_channel; + + g_io_channel_init (channel); + g_io_channel_win32_init (win32_channel); + if (win32_channel->debug) + g_print ("g_io_channel_win32_new_socket: channel=%p sock=%d\n", + channel, socket); + channel->funcs = &win32_channel_sock_funcs; + win32_channel->type = G_IO_WIN32_SOCKET; + win32_channel->fd = socket; + + channel->is_readable = TRUE; + channel->is_writeable = TRUE; + channel->is_seekable = FALSE; + + return channel; +} + +GIOChannel * +g_io_channel_unix_new (gint fd) +{ + gboolean is_fd, is_socket; + struct _stati64 st; + int optval, optlen; + + is_fd = (_fstati64 (fd, &st) == 0); + + optlen = sizeof (optval); + is_socket = (getsockopt (fd, SOL_SOCKET, SO_TYPE, (char *) &optval, &optlen) != SOCKET_ERROR); + + if (is_fd && is_socket) + g_warning ("g_io_channel_unix_new: %d is both a file descriptor and a socket. File descriptor interpretation assumed. To avoid ambiguity, call either g_io_channel_win32_new_fd() or g_io_channel_win32_new_socket() instead.", fd); + + if (is_fd) + return g_io_channel_win32_new_fd_internal (fd, &st); + + if (is_socket) + return g_io_channel_win32_new_socket(fd); + + g_warning ("g_io_channel_unix_new: %d is neither a file descriptor or a socket.", fd); + + return NULL; +} + +gint +g_io_channel_unix_get_fd (GIOChannel *channel) +{ + return g_io_channel_win32_get_fd (channel); +} + +void +g_io_channel_win32_set_debug (GIOChannel *channel, + gboolean flag) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + win32_channel->debug = flag; +} + +gint +g_io_channel_win32_poll (GPollFD *fds, + gint n_fds, + gint timeout) +{ + g_return_val_if_fail (n_fds >= 0, 0); + + return g_poll (fds, n_fds, timeout); +} + +void +g_io_channel_win32_make_pollfd (GIOChannel *channel, + GIOCondition condition, + GPollFD *fd) +{ + GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel; + + switch (win32_channel->type) + { + case G_IO_WIN32_FILE_DESC: + if (win32_channel->data_avail_event == NULL) + create_events (win32_channel); + + fd->fd = (gintptr) win32_channel->data_avail_event; + + if (win32_channel->thread_id == 0) + { + /* Is it meaningful for a file descriptor to be polled for + * both IN and OUT? For what kind of file descriptor would + * that be? Doesn't seem to make sense, in practise the file + * descriptors handled here are always read or write ends of + * pipes surely, and thus unidirectional. + */ + if (condition & G_IO_IN) + create_thread (win32_channel, condition, read_thread); + else if (condition & G_IO_OUT) + create_thread (win32_channel, condition, write_thread); + } + break; + + case G_IO_WIN32_CONSOLE: + fd->fd = _get_osfhandle (win32_channel->fd); + break; + + case G_IO_WIN32_SOCKET: + fd->fd = (gintptr) WSACreateEvent (); + break; + + case G_IO_WIN32_WINDOWS_MESSAGES: + fd->fd = G_WIN32_MSG_HANDLE; + break; + + default: + g_assert_not_reached (); + abort (); + } + + fd->events = condition; +} + +#ifndef _WIN64 + +/* Binary compatibility */ +GIOChannel * +g_io_channel_win32_new_stream_socket (int socket) +{ + return g_io_channel_win32_new_socket (socket); +} + +#endif + +#define __G_IO_WIN32_C__ +#include "galiasdef.c" diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c new file mode 100644 index 0000000..2226e70 --- /dev/null +++ b/glib/gkeyfile.c @@ -0,0 +1,3782 @@ +/* gkeyfile.c - key file parser + * + * Copyright 2004 Red Hat, Inc. + * + * Written by Ray Strode + * Matthias Clasen + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "gkeyfile.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef G_OS_WIN32 +#include + +#define fstat(a,b) _fstati64(a,b) +#define stat _stati64 + +#ifndef S_ISREG +#define S_ISREG(mode) ((mode)&_S_IFREG) +#endif + +#endif /* G_OS_WIN23 */ + +#include "gconvert.h" +#include "gdataset.h" +#include "gerror.h" +#include "gfileutils.h" +#include "ghash.h" +#include "glibintl.h" +#include "glist.h" +#include "gslist.h" +#include "gmem.h" +#include "gmessages.h" +#include "gstdio.h" +#include "gstring.h" +#include "gstrfuncs.h" +#include "gutils.h" + +#include "galias.h" + +typedef struct _GKeyFileGroup GKeyFileGroup; + +struct _GKeyFile +{ + GList *groups; + GHashTable *group_hash; + + GKeyFileGroup *start_group; + GKeyFileGroup *current_group; + + GString *parse_buffer; /* Holds up to one line of not-yet-parsed data */ + + /* Used for sizing the output buffer during serialization + */ + gsize approximate_size; + + gchar list_separator; + + GKeyFileFlags flags; + + gchar **locales; +}; + +typedef struct _GKeyFileKeyValuePair GKeyFileKeyValuePair; + +struct _GKeyFileGroup +{ + const gchar *name; /* NULL for above first group (which will be comments) */ + + GKeyFileKeyValuePair *comment; /* Special comment that is stuck to the top of a group */ + gboolean has_trailing_blank_line; + + GList *key_value_pairs; + + /* Used in parallel with key_value_pairs for + * increased lookup performance + */ + GHashTable *lookup_map; +}; + +struct _GKeyFileKeyValuePair +{ + gchar *key; /* NULL for comments */ + gchar *value; +}; + +static gint find_file_in_data_dirs (const gchar *file, + const gchar **data_dirs, + gchar **output_file, + GError **error); +static gboolean g_key_file_load_from_fd (GKeyFile *key_file, + gint fd, + GKeyFileFlags flags, + GError **error); +static GList *g_key_file_lookup_group_node (GKeyFile *key_file, + const gchar *group_name); +static GKeyFileGroup *g_key_file_lookup_group (GKeyFile *key_file, + const gchar *group_name); + +static GList *g_key_file_lookup_key_value_pair_node (GKeyFile *key_file, + GKeyFileGroup *group, + const gchar *key); +static GKeyFileKeyValuePair *g_key_file_lookup_key_value_pair (GKeyFile *key_file, + GKeyFileGroup *group, + const gchar *key); + +static void g_key_file_remove_group_node (GKeyFile *key_file, + GList *group_node); +static void g_key_file_remove_key_value_pair_node (GKeyFile *key_file, + GKeyFileGroup *group, + GList *pair_node); + +static void g_key_file_add_key (GKeyFile *key_file, + GKeyFileGroup *group, + const gchar *key, + const gchar *value); +static void g_key_file_add_group (GKeyFile *key_file, + const gchar *group_name); +static gboolean g_key_file_is_group_name (const gchar *name); +static gboolean g_key_file_is_key_name (const gchar *name); +static void g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair); +static gboolean g_key_file_line_is_comment (const gchar *line); +static gboolean g_key_file_line_is_group (const gchar *line); +static gboolean g_key_file_line_is_key_value_pair (const gchar *line); +static gchar *g_key_file_parse_value_as_string (GKeyFile *key_file, + const gchar *value, + GSList **separators, + GError **error); +static gchar *g_key_file_parse_string_as_value (GKeyFile *key_file, + const gchar *string, + gboolean escape_separator); +static gint g_key_file_parse_value_as_integer (GKeyFile *key_file, + const gchar *value, + GError **error); +static gchar *g_key_file_parse_integer_as_value (GKeyFile *key_file, + gint value); +static gdouble g_key_file_parse_value_as_double (GKeyFile *key_file, + const gchar *value, + GError **error); +static gboolean g_key_file_parse_value_as_boolean (GKeyFile *key_file, + const gchar *value, + GError **error); +static gchar *g_key_file_parse_boolean_as_value (GKeyFile *key_file, + gboolean value); +static gchar *g_key_file_parse_value_as_comment (GKeyFile *key_file, + const gchar *value); +static gchar *g_key_file_parse_comment_as_value (GKeyFile *key_file, + const gchar *comment); +static void g_key_file_parse_key_value_pair (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error); +static void g_key_file_parse_comment (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error); +static void g_key_file_parse_group (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error); +static gchar *key_get_locale (const gchar *key); +static void g_key_file_parse_data (GKeyFile *key_file, + const gchar *data, + gsize length, + GError **error); +static void g_key_file_flush_parse_buffer (GKeyFile *key_file, + GError **error); + + +GQuark +g_key_file_error_quark (void) +{ + return g_quark_from_static_string ("g-key-file-error-quark"); +} + +static void +g_key_file_init (GKeyFile *key_file) +{ + key_file->current_group = g_slice_new0 (GKeyFileGroup); + key_file->groups = g_list_prepend (NULL, key_file->current_group); + key_file->group_hash = g_hash_table_new (g_str_hash, g_str_equal); + key_file->start_group = NULL; + key_file->parse_buffer = g_string_sized_new (128); + key_file->approximate_size = 0; + key_file->list_separator = ';'; + key_file->flags = 0; + key_file->locales = g_strdupv ((gchar **)g_get_language_names ()); +} + +static void +g_key_file_clear (GKeyFile *key_file) +{ + GList *tmp, *group_node; + + if (key_file->locales) + { + g_strfreev (key_file->locales); + key_file->locales = NULL; + } + + if (key_file->parse_buffer) + { + g_string_free (key_file->parse_buffer, TRUE); + key_file->parse_buffer = NULL; + } + + tmp = key_file->groups; + while (tmp != NULL) + { + group_node = tmp; + tmp = tmp->next; + g_key_file_remove_group_node (key_file, group_node); + } + + g_hash_table_destroy (key_file->group_hash); + key_file->group_hash = NULL; + + g_warn_if_fail (key_file->groups == NULL); +} + + +/** + * g_key_file_new: + * + * Creates a new empty #GKeyFile object. Use + * g_key_file_load_from_file(), g_key_file_load_from_data(), + * g_key_file_load_from_dirs() or g_key_file_load_from_data_dirs() to + * read an existing key file. + * + * Return value: an empty #GKeyFile. + * + * Since: 2.6 + **/ +GKeyFile * +g_key_file_new (void) +{ + GKeyFile *key_file; + + key_file = g_slice_new0 (GKeyFile); + g_key_file_init (key_file); + + return key_file; +} + +/** + * g_key_file_set_list_separator: + * @key_file: a #GKeyFile + * @separator: the separator + * + * Sets the character which is used to separate + * values in lists. Typically ';' or ',' are used + * as separators. The default list separator is ';'. + * + * Since: 2.6 + */ +void +g_key_file_set_list_separator (GKeyFile *key_file, + gchar separator) +{ + g_return_if_fail (key_file != NULL); + + key_file->list_separator = separator; +} + + +/* Iterates through all the directories in *dirs trying to + * open file. When it successfully locates and opens a file it + * returns the file descriptor to the open file. It also + * outputs the absolute path of the file in output_file. + */ +static gint +find_file_in_data_dirs (const gchar *file, + const gchar **dirs, + gchar **output_file, + GError **error) +{ + const gchar **data_dirs, *data_dir; + gchar *path; + gint fd; + + path = NULL; + fd = -1; + + if (dirs == NULL) + return fd; + + data_dirs = dirs; + + while (data_dirs && (data_dir = *data_dirs) && fd < 0) + { + gchar *candidate_file, *sub_dir; + + candidate_file = (gchar *) file; + sub_dir = g_strdup (""); + while (candidate_file != NULL && fd < 0) + { + gchar *p; + + path = g_build_filename (data_dir, sub_dir, + candidate_file, NULL); + + fd = g_open (path, O_RDONLY, 0); + + if (fd < 0) + { + g_free (path); + path = NULL; + } + + candidate_file = strchr (candidate_file, '-'); + + if (candidate_file == NULL) + break; + + candidate_file++; + + g_free (sub_dir); + sub_dir = g_strndup (file, candidate_file - file - 1); + + for (p = sub_dir; *p != '\0'; p++) + { + if (*p == '-') + *p = G_DIR_SEPARATOR; + } + } + g_free (sub_dir); + data_dirs++; + } + + if (fd < 0) + { + g_set_error_literal (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_NOT_FOUND, + _("Valid key file could not be " + "found in search dirs")); + } + + if (output_file != NULL && fd > 0) + *output_file = g_strdup (path); + + g_free (path); + + return fd; +} + +static gboolean +g_key_file_load_from_fd (GKeyFile *key_file, + gint fd, + GKeyFileFlags flags, + GError **error) +{ + GError *key_file_error = NULL; + gssize bytes_read; + struct stat stat_buf; + gchar read_buf[4096]; + + if (fstat (fd, &stat_buf) < 0) + { + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (errno), + g_strerror (errno)); + return FALSE; + } + + if (!S_ISREG (stat_buf.st_mode)) + { + g_set_error_literal (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE, + _("Not a regular file")); + return FALSE; + } + + if (stat_buf.st_size == 0) + { + g_set_error_literal (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE, + _("File is empty")); + return FALSE; + } + + if (key_file->approximate_size > 0) + { + g_key_file_clear (key_file); + g_key_file_init (key_file); + } + key_file->flags = flags; + + do + { + bytes_read = read (fd, read_buf, 4096); + + if (bytes_read == 0) /* End of File */ + break; + + if (bytes_read < 0) + { + if (errno == EINTR || errno == EAGAIN) + continue; + + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (errno), + g_strerror (errno)); + return FALSE; + } + + g_key_file_parse_data (key_file, + read_buf, bytes_read, + &key_file_error); + } + while (!key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return FALSE; + } + + g_key_file_flush_parse_buffer (key_file, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return FALSE; + } + + return TRUE; +} + +/** + * g_key_file_load_from_file: + * @key_file: an empty #GKeyFile struct + * @file: the path of a filename to load, in the GLib filename encoding + * @flags: flags from #GKeyFileFlags + * @error: return location for a #GError, or %NULL + * + * Loads a key file into an empty #GKeyFile structure. + * If the file could not be loaded then %error is set to + * either a #GFileError or #GKeyFileError. + * + * Return value: %TRUE if a key file could be loaded, %FALSE otherwise + * + * Since: 2.6 + **/ +gboolean +g_key_file_load_from_file (GKeyFile *key_file, + const gchar *file, + GKeyFileFlags flags, + GError **error) +{ + GError *key_file_error = NULL; + gint fd; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (file != NULL, FALSE); + + fd = g_open (file, O_RDONLY, 0); + + if (fd < 0) + { + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (errno), + g_strerror (errno)); + return FALSE; + } + + g_key_file_load_from_fd (key_file, fd, flags, &key_file_error); + close (fd); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return FALSE; + } + + return TRUE; +} + +/** + * g_key_file_load_from_data: + * @key_file: an empty #GKeyFile struct + * @data: key file loaded in memory + * @length: the length of @data in bytes + * @flags: flags from #GKeyFileFlags + * @error: return location for a #GError, or %NULL + * + * Loads a key file from memory into an empty #GKeyFile structure. + * If the object cannot be created then %error is set to a #GKeyFileError. + * + * Return value: %TRUE if a key file could be loaded, %FALSE otherwise + * + * Since: 2.6 + **/ +gboolean +g_key_file_load_from_data (GKeyFile *key_file, + const gchar *data, + gsize length, + GKeyFileFlags flags, + GError **error) +{ + GError *key_file_error = NULL; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (length != 0, FALSE); + + if (length == (gsize)-1) + length = strlen (data); + + if (key_file->approximate_size > 0) + { + g_key_file_clear (key_file); + g_key_file_init (key_file); + } + key_file->flags = flags; + + g_key_file_parse_data (key_file, data, length, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return FALSE; + } + + g_key_file_flush_parse_buffer (key_file, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return FALSE; + } + + return TRUE; +} + +/** + * g_key_file_load_from_dirs: + * @key_file: an empty #GKeyFile struct + * @file: a relative path to a filename to open and parse + * @search_dirs: %NULL-terminated array of directories to search + * @full_path: return location for a string containing the full path + * of the file, or %NULL + * @flags: flags from #GKeyFileFlags + * @error: return location for a #GError, or %NULL + * + * This function looks for a key file named @file in the paths + * specified in @search_dirs, loads the file into @key_file and + * returns the file's full path in @full_path. If the file could not + * be loaded then an %error is set to either a #GFileError or + * #GKeyFileError. + * + * Return value: %TRUE if a key file could be loaded, %FALSE otherwise + * + * Since: 2.14 + **/ +gboolean +g_key_file_load_from_dirs (GKeyFile *key_file, + const gchar *file, + const gchar **search_dirs, + gchar **full_path, + GKeyFileFlags flags, + GError **error) +{ + GError *key_file_error = NULL; + const gchar **data_dirs; + gchar *output_path; + gint fd; + gboolean found_file; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (!g_path_is_absolute (file), FALSE); + g_return_val_if_fail (search_dirs != NULL, FALSE); + + found_file = FALSE; + data_dirs = search_dirs; + output_path = NULL; + while (*data_dirs != NULL && !found_file) + { + g_free (output_path); + + fd = find_file_in_data_dirs (file, data_dirs, &output_path, + &key_file_error); + + if (fd < 0) + { + if (key_file_error) + g_propagate_error (error, key_file_error); + break; + } + + found_file = g_key_file_load_from_fd (key_file, fd, flags, + &key_file_error); + close (fd); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + break; + } + } + + if (found_file && full_path) + *full_path = output_path; + else + g_free (output_path); + + return found_file; +} + +/** + * g_key_file_load_from_data_dirs: + * @key_file: an empty #GKeyFile struct + * @file: a relative path to a filename to open and parse + * @full_path: return location for a string containing the full path + * of the file, or %NULL + * @flags: flags from #GKeyFileFlags + * @error: return location for a #GError, or %NULL + * + * This function looks for a key file named @file in the paths + * returned from g_get_user_data_dir() and g_get_system_data_dirs(), + * loads the file into @key_file and returns the file's full path in + * @full_path. If the file could not be loaded then an %error is + * set to either a #GFileError or #GKeyFileError. + * + * Return value: %TRUE if a key file could be loaded, %FALSE othewise + * Since: 2.6 + **/ +gboolean +g_key_file_load_from_data_dirs (GKeyFile *key_file, + const gchar *file, + gchar **full_path, + GKeyFileFlags flags, + GError **error) +{ + gchar **all_data_dirs; + const gchar * user_data_dir; + const gchar * const * system_data_dirs; + gsize i, j; + gboolean found_file; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (!g_path_is_absolute (file), FALSE); + + user_data_dir = g_get_user_data_dir (); + system_data_dirs = g_get_system_data_dirs (); + all_data_dirs = g_new (gchar *, g_strv_length ((gchar **)system_data_dirs) + 2); + + i = 0; + all_data_dirs[i++] = g_strdup (user_data_dir); + + j = 0; + while (system_data_dirs[j] != NULL) + all_data_dirs[i++] = g_strdup (system_data_dirs[j++]); + all_data_dirs[i] = NULL; + + found_file = g_key_file_load_from_dirs (key_file, + file, + (const gchar **)all_data_dirs, + full_path, + flags, + error); + + g_strfreev (all_data_dirs); + + return found_file; +} + +/** + * g_key_file_free: + * @key_file: a #GKeyFile + * + * Frees a #GKeyFile. + * + * Since: 2.6 + **/ +void +g_key_file_free (GKeyFile *key_file) +{ + g_return_if_fail (key_file != NULL); + + g_key_file_clear (key_file); + g_slice_free (GKeyFile, key_file); +} + +/* If G_KEY_FILE_KEEP_TRANSLATIONS is not set, only returns + * true for locales that match those in g_get_language_names(). + */ +static gboolean +g_key_file_locale_is_interesting (GKeyFile *key_file, + const gchar *locale) +{ + gsize i; + + if (key_file->flags & G_KEY_FILE_KEEP_TRANSLATIONS) + return TRUE; + + for (i = 0; key_file->locales[i] != NULL; i++) + { + if (g_ascii_strcasecmp (key_file->locales[i], locale) == 0) + return TRUE; + } + + return FALSE; +} + +static void +g_key_file_parse_line (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error) +{ + GError *parse_error = NULL; + gchar *line_start; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (line != NULL); + + line_start = (gchar *) line; + while (g_ascii_isspace (*line_start)) + line_start++; + + if (g_key_file_line_is_comment (line_start)) + g_key_file_parse_comment (key_file, line, length, &parse_error); + else if (g_key_file_line_is_group (line_start)) + g_key_file_parse_group (key_file, line_start, + length - (line_start - line), + &parse_error); + else if (g_key_file_line_is_key_value_pair (line_start)) + g_key_file_parse_key_value_pair (key_file, line_start, + length - (line_start - line), + &parse_error); + else + { + gchar *line_utf8 = _g_utf8_make_valid (line); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE, + _("Key file contains line '%s' which is not " + "a key-value pair, group, or comment"), + line_utf8); + g_free (line_utf8); + + return; + } + + if (parse_error) + g_propagate_error (error, parse_error); +} + +static void +g_key_file_parse_comment (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error) +{ + GKeyFileKeyValuePair *pair; + + if (!(key_file->flags & G_KEY_FILE_KEEP_COMMENTS)) + return; + + g_warn_if_fail (key_file->current_group != NULL); + + pair = g_slice_new (GKeyFileKeyValuePair); + pair->key = NULL; + pair->value = g_strndup (line, length); + + key_file->current_group->key_value_pairs = + g_list_prepend (key_file->current_group->key_value_pairs, pair); + + if (length == 0 || line[0] != '#') + key_file->current_group->has_trailing_blank_line = TRUE; +} + +static void +g_key_file_parse_group (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error) +{ + gchar *group_name; + const gchar *group_name_start, *group_name_end; + + /* advance past opening '[' + */ + group_name_start = line + 1; + group_name_end = line + length - 1; + + while (*group_name_end != ']') + group_name_end--; + + group_name = g_strndup (group_name_start, + group_name_end - group_name_start); + + if (!g_key_file_is_group_name (group_name)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE, + _("Invalid group name: %s"), group_name); + g_free (group_name); + return; + } + + g_key_file_add_group (key_file, group_name); + g_free (group_name); +} + +static void +g_key_file_parse_key_value_pair (GKeyFile *key_file, + const gchar *line, + gsize length, + GError **error) +{ + gchar *key, *value, *key_end, *value_start, *locale; + gsize key_len, value_len; + + if (key_file->current_group == NULL || key_file->current_group->name == NULL) + { + g_set_error_literal (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not start with a group")); + return; + } + + key_end = value_start = strchr (line, '='); + + g_warn_if_fail (key_end != NULL); + + key_end--; + value_start++; + + /* Pull the key name from the line (chomping trailing whitespace) + */ + while (g_ascii_isspace (*key_end)) + key_end--; + + key_len = key_end - line + 2; + + g_warn_if_fail (key_len <= length); + + key = g_strndup (line, key_len - 1); + + if (!g_key_file_is_key_name (key)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE, + _("Invalid key name: %s"), key); + g_free (key); + return; + } + + /* Pull the value from the line (chugging leading whitespace) + */ + while (g_ascii_isspace (*value_start)) + value_start++; + + value_len = line + length - value_start + 1; + + value = g_strndup (value_start, value_len); + + g_warn_if_fail (key_file->start_group != NULL); + + if (key_file->current_group + && key_file->current_group->name + && strcmp (key_file->start_group->name, + key_file->current_group->name) == 0 + && strcmp (key, "Encoding") == 0) + { + if (g_ascii_strcasecmp (value, "UTF-8") != 0) + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_UNKNOWN_ENCODING, + _("Key file contains unsupported " + "encoding '%s'"), value_utf8); + g_free (value_utf8); + + g_free (key); + g_free (value); + return; + } + } + + /* Is this key a translation? If so, is it one that we care about? + */ + locale = key_get_locale (key); + + if (locale == NULL || g_key_file_locale_is_interesting (key_file, locale)) + g_key_file_add_key (key_file, key_file->current_group, key, value); + + g_free (locale); + g_free (key); + g_free (value); +} + +static gchar * +key_get_locale (const gchar *key) +{ + gchar *locale; + + locale = g_strrstr (key, "["); + + if (locale && strlen (locale) <= 2) + locale = NULL; + + if (locale) + locale = g_strndup (locale + 1, strlen (locale) - 2); + + return locale; +} + +static void +g_key_file_parse_data (GKeyFile *key_file, + const gchar *data, + gsize length, + GError **error) +{ + GError *parse_error; + gsize i; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (data != NULL); + + parse_error = NULL; + + for (i = 0; i < length; i++) + { + if (data[i] == '\n') + { + if (i > 0 && data[i - 1] == '\r') + g_string_erase (key_file->parse_buffer, + key_file->parse_buffer->len - 1, + 1); + + /* When a newline is encountered flush the parse buffer so that the + * line can be parsed. Note that completely blank lines won't show + * up in the parse buffer, so they get parsed directly. + */ + if (key_file->parse_buffer->len > 0) + g_key_file_flush_parse_buffer (key_file, &parse_error); + else + g_key_file_parse_comment (key_file, "", 1, &parse_error); + + if (parse_error) + { + g_propagate_error (error, parse_error); + return; + } + } + else + g_string_append_c (key_file->parse_buffer, data[i]); + } + + key_file->approximate_size += length; +} + +static void +g_key_file_flush_parse_buffer (GKeyFile *key_file, + GError **error) +{ + GError *file_error = NULL; + + g_return_if_fail (key_file != NULL); + + file_error = NULL; + + if (key_file->parse_buffer->len > 0) + { + g_key_file_parse_line (key_file, key_file->parse_buffer->str, + key_file->parse_buffer->len, + &file_error); + g_string_erase (key_file->parse_buffer, 0, -1); + + if (file_error) + { + g_propagate_error (error, file_error); + return; + } + } +} + +/** + * g_key_file_to_data: + * @key_file: a #GKeyFile + * @length: return location for the length of the + * returned string, or %NULL + * @error: return location for a #GError, or %NULL + * + * This function outputs @key_file as a string. + * + * Note that this function never reports an error, + * so it is safe to pass %NULL as @error. + * + * Return value: a newly allocated string holding + * the contents of the #GKeyFile + * + * Since: 2.6 + **/ +gchar * +g_key_file_to_data (GKeyFile *key_file, + gsize *length, + GError **error) +{ + GString *data_string; + GList *group_node, *key_file_node; + gboolean has_blank_line = TRUE; + + g_return_val_if_fail (key_file != NULL, NULL); + + data_string = g_string_sized_new (2 * key_file->approximate_size); + + for (group_node = g_list_last (key_file->groups); + group_node != NULL; + group_node = group_node->prev) + { + GKeyFileGroup *group; + + group = (GKeyFileGroup *) group_node->data; + + /* separate groups by at least an empty line */ + if (!has_blank_line) + g_string_append_c (data_string, '\n'); + has_blank_line = group->has_trailing_blank_line; + + if (group->comment != NULL) + g_string_append_printf (data_string, "%s\n", group->comment->value); + + if (group->name != NULL) + g_string_append_printf (data_string, "[%s]\n", group->name); + + for (key_file_node = g_list_last (group->key_value_pairs); + key_file_node != NULL; + key_file_node = key_file_node->prev) + { + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) key_file_node->data; + + if (pair->key != NULL) + g_string_append_printf (data_string, "%s=%s\n", pair->key, pair->value); + else + g_string_append_printf (data_string, "%s\n", pair->value); + } + } + + if (length) + *length = data_string->len; + + return g_string_free (data_string, FALSE); +} + +/** + * g_key_file_get_keys: + * @key_file: a #GKeyFile + * @group_name: a group name + * @length: return location for the number of keys returned, or %NULL + * @error: return location for a #GError, or %NULL + * + * Returns all keys for the group name @group_name. The array of + * returned keys will be %NULL-terminated, so @length may + * optionally be %NULL. In the event that the @group_name cannot + * be found, %NULL is returned and @error is set to + * #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. + * + * Return value: a newly-allocated %NULL-terminated array of strings. + * Use g_strfreev() to free it. + * + * Since: 2.6 + **/ +gchar ** +g_key_file_get_keys (GKeyFile *key_file, + const gchar *group_name, + gsize *length, + GError **error) +{ + GKeyFileGroup *group; + GList *tmp; + gchar **keys; + gsize i, num_keys; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + + group = g_key_file_lookup_group (key_file, group_name); + + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + return NULL; + } + + num_keys = 0; + for (tmp = group->key_value_pairs; tmp; tmp = tmp->next) + { + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) tmp->data; + + if (pair->key) + num_keys++; + } + + keys = g_new (gchar *, num_keys + 1); + + i = num_keys - 1; + for (tmp = group->key_value_pairs; tmp; tmp = tmp->next) + { + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) tmp->data; + + if (pair->key) + { + keys[i] = g_strdup (pair->key); + i--; + } + } + + keys[num_keys] = NULL; + + if (length) + *length = num_keys; + + return keys; +} + +/** + * g_key_file_get_start_group: + * @key_file: a #GKeyFile + * + * Returns the name of the start group of the file. + * + * Return value: The start group of the key file. + * + * Since: 2.6 + **/ +gchar * +g_key_file_get_start_group (GKeyFile *key_file) +{ + g_return_val_if_fail (key_file != NULL, NULL); + + if (key_file->start_group) + return g_strdup (key_file->start_group->name); + + return NULL; +} + +/** + * g_key_file_get_groups: + * @key_file: a #GKeyFile + * @length: return location for the number of returned groups, or %NULL + * + * Returns all groups in the key file loaded with @key_file. + * The array of returned groups will be %NULL-terminated, so + * @length may optionally be %NULL. + * + * Return value: a newly-allocated %NULL-terminated array of strings. + * Use g_strfreev() to free it. + * Since: 2.6 + **/ +gchar ** +g_key_file_get_groups (GKeyFile *key_file, + gsize *length) +{ + GList *group_node; + gchar **groups; + gsize i, num_groups; + + g_return_val_if_fail (key_file != NULL, NULL); + + num_groups = g_list_length (key_file->groups); + + g_return_val_if_fail (num_groups > 0, NULL); + + group_node = g_list_last (key_file->groups); + + g_return_val_if_fail (((GKeyFileGroup *) group_node->data)->name == NULL, NULL); + + /* Only need num_groups instead of num_groups + 1 + * because the first group of the file (last in the + * list) is always the comment group at the top, + * which we skip + */ + groups = g_new (gchar *, num_groups); + + + i = 0; + for (group_node = group_node->prev; + group_node != NULL; + group_node = group_node->prev) + { + GKeyFileGroup *group; + + group = (GKeyFileGroup *) group_node->data; + + g_warn_if_fail (group->name != NULL); + + groups[i++] = g_strdup (group->name); + } + groups[i] = NULL; + + if (length) + *length = i; + + return groups; +} + +/** + * g_key_file_get_value: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @error: return location for a #GError, or %NULL + * + * Returns the raw value associated with @key under @group_name. + * Use g_key_file_get_string() to retrieve an unescaped UTF-8 string. + * + * In the event the key cannot be found, %NULL is returned and + * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the + * event that the @group_name cannot be found, %NULL is returned + * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. + * + * + * Return value: a newly allocated string or %NULL if the specified + * key cannot be found. + * + * Since: 2.6 + **/ +gchar * +g_key_file_get_value (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GKeyFileGroup *group; + GKeyFileKeyValuePair *pair; + gchar *value = NULL; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + group = g_key_file_lookup_group (key_file, group_name); + + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + return NULL; + } + + pair = g_key_file_lookup_key_value_pair (key_file, group, key); + + if (pair) + value = g_strdup (pair->value); + else + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND, + _("Key file does not have key '%s'"), key); + + return value; +} + +/** + * g_key_file_set_value: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @value: a string + * + * Associates a new value with @key under @group_name. + * + * If @key cannot be found then it is created. If @group_name cannot + * be found then it is created. To set an UTF-8 string which may contain + * characters that need escaping (such as newlines or spaces), use + * g_key_file_set_string(). + * + * Since: 2.6 + **/ +void +g_key_file_set_value (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *value) +{ + GKeyFileGroup *group; + GKeyFileKeyValuePair *pair; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (g_key_file_is_group_name (group_name)); + g_return_if_fail (g_key_file_is_key_name (key)); + g_return_if_fail (value != NULL); + + group = g_key_file_lookup_group (key_file, group_name); + + if (!group) + { + g_key_file_add_group (key_file, group_name); + group = (GKeyFileGroup *) key_file->groups->data; + + g_key_file_add_key (key_file, group, key, value); + } + else + { + pair = g_key_file_lookup_key_value_pair (key_file, group, key); + + if (!pair) + g_key_file_add_key (key_file, group, key, value); + else + { + g_free (pair->value); + pair->value = g_strdup (value); + } + } +} + +/** + * g_key_file_get_string: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @error: return location for a #GError, or %NULL + * + * Returns the string value associated with @key under @group_name. + * Unlike g_key_file_get_value(), this function handles escape sequences + * like \s. + * + * In the event the key cannot be found, %NULL is returned and + * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the + * event that the @group_name cannot be found, %NULL is returned + * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. + * + * Return value: a newly allocated string or %NULL if the specified + * key cannot be found. + * + * Since: 2.6 + **/ +gchar * +g_key_file_get_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + gchar *value, *string_value; + GError *key_file_error; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + key_file_error = NULL; + + value = g_key_file_get_value (key_file, group_name, key, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return NULL; + } + + if (!g_utf8_validate (value, -1, NULL)) + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_UNKNOWN_ENCODING, + _("Key file contains key '%s' with value '%s' " + "which is not UTF-8"), key, value_utf8); + g_free (value_utf8); + g_free (value); + + return NULL; + } + + string_value = g_key_file_parse_value_as_string (key_file, value, NULL, + &key_file_error); + g_free (value); + + if (key_file_error) + { + if (g_error_matches (key_file_error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains key '%s' " + "which has value that cannot be interpreted."), + key); + g_error_free (key_file_error); + } + else + g_propagate_error (error, key_file_error); + } + + return string_value; +} + +/** + * g_key_file_set_string: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @string: a string + * + * Associates a new string value with @key under @group_name. + * If @key cannot be found then it is created. + * If @group_name cannot be found then it is created. + * Unlike g_key_file_set_value(), this function handles characters + * that need escaping, such as newlines. + * + * Since: 2.6 + **/ +void +g_key_file_set_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *string) +{ + gchar *value; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (string != NULL); + + value = g_key_file_parse_string_as_value (key_file, string, FALSE); + g_key_file_set_value (key_file, group_name, key, value); + g_free (value); +} + +/** + * g_key_file_get_string_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @length: return location for the number of returned strings, or %NULL + * @error: return location for a #GError, or %NULL + * + * Returns the values associated with @key under @group_name. + * + * In the event the key cannot be found, %NULL is returned and + * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the + * event that the @group_name cannot be found, %NULL is returned + * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND. + * + * Return value: a %NULL-terminated string array or %NULL if the specified + * key cannot be found. The array should be freed with g_strfreev(). + * + * Since: 2.6 + **/ +gchar ** +g_key_file_get_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) +{ + GError *key_file_error = NULL; + gchar *value, *string_value, **values; + gint i, len; + GSList *p, *pieces = NULL; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + if (length) + *length = 0; + + value = g_key_file_get_value (key_file, group_name, key, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return NULL; + } + + if (!g_utf8_validate (value, -1, NULL)) + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_UNKNOWN_ENCODING, + _("Key file contains key '%s' with value '%s' " + "which is not UTF-8"), key, value_utf8); + g_free (value_utf8); + g_free (value); + + return NULL; + } + + string_value = g_key_file_parse_value_as_string (key_file, value, &pieces, &key_file_error); + g_free (value); + g_free (string_value); + + if (key_file_error) + { + if (g_error_matches (key_file_error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains key '%s' " + "which has a value that cannot be interpreted."), + key); + g_error_free (key_file_error); + } + else + g_propagate_error (error, key_file_error); + + return NULL; + } + + len = g_slist_length (pieces); + values = g_new (gchar *, len + 1); + for (p = pieces, i = 0; p; p = p->next) + values[i++] = p->data; + values[len] = NULL; + + g_slist_free (pieces); + + if (length) + *length = len; + + return values; +} + +/** + * g_key_file_set_string_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @list: an array of string values + * @length: number of string values in @list + * + * Associates a list of string values for @key under @group_name. + * If @key cannot be found then it is created. + * If @group_name cannot be found then it is created. + * + * Since: 2.6 + **/ +void +g_key_file_set_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar * const list[], + gsize length) +{ + GString *value_list; + gsize i; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (list != NULL || length == 0); + + value_list = g_string_sized_new (length * 128); + for (i = 0; i < length && list[i] != NULL; i++) + { + gchar *value; + + value = g_key_file_parse_string_as_value (key_file, list[i], TRUE); + g_string_append (value_list, value); + g_string_append_c (value_list, key_file->list_separator); + + g_free (value); + } + + g_key_file_set_value (key_file, group_name, key, value_list->str); + g_string_free (value_list, TRUE); +} + +/** + * g_key_file_set_locale_string: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @locale: a locale identifier + * @string: a string + * + * Associates a string value for @key and @locale under @group_name. + * If the translation for @key cannot be found then it is created. + * + * Since: 2.6 + **/ +void +g_key_file_set_locale_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + const gchar *string) +{ + gchar *full_key, *value; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (key != NULL); + g_return_if_fail (locale != NULL); + g_return_if_fail (string != NULL); + + value = g_key_file_parse_string_as_value (key_file, string, FALSE); + full_key = g_strdup_printf ("%s[%s]", key, locale); + g_key_file_set_value (key_file, group_name, full_key, value); + g_free (full_key); + g_free (value); +} + +extern GSList *_g_compute_locale_variants (const gchar *locale); + +/** + * g_key_file_get_locale_string: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @locale: a locale identifier or %NULL + * @error: return location for a #GError, or %NULL + * + * Returns the value associated with @key under @group_name + * translated in the given @locale if available. If @locale is + * %NULL then the current locale is assumed. + * + * If @key cannot be found then %NULL is returned and @error is set + * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the value associated + * with @key cannot be interpreted or no suitable translation can + * be found then the untranslated value is returned. + * + * Return value: a newly allocated string or %NULL if the specified + * key cannot be found. + * + * Since: 2.6 + **/ +gchar * +g_key_file_get_locale_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + GError **error) +{ + gchar *candidate_key, *translated_value; + GError *key_file_error; + gchar **languages; + gboolean free_languages = FALSE; + gint i; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + candidate_key = NULL; + translated_value = NULL; + key_file_error = NULL; + + if (locale) + { + GSList *l, *list; + + list = _g_compute_locale_variants (locale); + + languages = g_new (gchar *, g_slist_length (list) + 1); + for (l = list, i = 0; l; l = l->next, i++) + languages[i] = l->data; + languages[i] = NULL; + + g_slist_free (list); + free_languages = TRUE; + } + else + { + languages = (gchar **) g_get_language_names (); + free_languages = FALSE; + } + + for (i = 0; languages[i]; i++) + { + candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]); + + translated_value = g_key_file_get_string (key_file, + group_name, + candidate_key, NULL); + g_free (candidate_key); + + if (translated_value) + break; + + g_free (translated_value); + translated_value = NULL; + } + + /* Fallback to untranslated key + */ + if (!translated_value) + { + translated_value = g_key_file_get_string (key_file, group_name, key, + &key_file_error); + + if (!translated_value) + g_propagate_error (error, key_file_error); + } + + if (free_languages) + g_strfreev (languages); + + return translated_value; +} + +/** + * g_key_file_get_locale_string_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @locale: a locale identifier or %NULL + * @length: return location for the number of returned strings or %NULL + * @error: return location for a #GError or %NULL + * + * Returns the values associated with @key under @group_name + * translated in the given @locale if available. If @locale is + * %NULL then the current locale is assumed. + + * If @key cannot be found then %NULL is returned and @error is set + * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the values associated + * with @key cannot be interpreted or no suitable translations + * can be found then the untranslated values are returned. The + * returned array is %NULL-terminated, so @length may optionally + * be %NULL. + * + * Return value: a newly allocated %NULL-terminated string array + * or %NULL if the key isn't found. The string array should be freed + * with g_strfreev(). + * + * Since: 2.6 + **/ +gchar ** +g_key_file_get_locale_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + gsize *length, + GError **error) +{ + GError *key_file_error; + gchar **values, *value; + char list_separator[2]; + gsize len; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + key_file_error = NULL; + + value = g_key_file_get_locale_string (key_file, group_name, + key, locale, + &key_file_error); + + if (key_file_error) + g_propagate_error (error, key_file_error); + + if (!value) + { + if (length) + *length = 0; + return NULL; + } + + len = strlen (value); + if (value[len - 1] == key_file->list_separator) + value[len - 1] = '\0'; + + list_separator[0] = key_file->list_separator; + list_separator[1] = '\0'; + values = g_strsplit (value, list_separator, 0); + + g_free (value); + + if (length) + *length = g_strv_length (values); + + return values; +} + +/** + * g_key_file_set_locale_string_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @locale: a locale identifier + * @list: a %NULL-terminated array of locale string values + * @length: the length of @list + * + * Associates a list of string values for @key and @locale under + * @group_name. If the translation for @key cannot be found then + * it is created. + * + * Since: 2.6 + **/ +void +g_key_file_set_locale_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + const gchar * const list[], + gsize length) +{ + GString *value_list; + gchar *full_key; + gsize i; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (key != NULL); + g_return_if_fail (locale != NULL); + g_return_if_fail (length != 0); + + value_list = g_string_sized_new (length * 128); + for (i = 0; i < length && list[i] != NULL; i++) + { + gchar *value; + + value = g_key_file_parse_string_as_value (key_file, list[i], TRUE); + g_string_append (value_list, value); + g_string_append_c (value_list, key_file->list_separator); + + g_free (value); + } + + full_key = g_strdup_printf ("%s[%s]", key, locale); + g_key_file_set_value (key_file, group_name, full_key, value_list->str); + g_free (full_key); + g_string_free (value_list, TRUE); +} + +/** + * g_key_file_get_boolean: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @error: return location for a #GError + * + * Returns the value associated with @key under @group_name as a + * boolean. + * + * If @key cannot be found then %FALSE is returned and @error is set + * to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value + * associated with @key cannot be interpreted as a boolean then %FALSE + * is returned and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. + * + * Return value: the value associated with the key as a boolean, + * or %FALSE if the key was not found or could not be parsed. + * + * Since: 2.6 + **/ +gboolean +g_key_file_get_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GError *key_file_error = NULL; + gchar *value; + gboolean bool_value; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (group_name != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + value = g_key_file_get_value (key_file, group_name, key, &key_file_error); + + if (!value) + { + g_propagate_error (error, key_file_error); + return FALSE; + } + + bool_value = g_key_file_parse_value_as_boolean (key_file, value, + &key_file_error); + g_free (value); + + if (key_file_error) + { + if (g_error_matches (key_file_error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains key '%s' " + "which has value that cannot be interpreted."), + key); + g_error_free (key_file_error); + } + else + g_propagate_error (error, key_file_error); + } + + return bool_value; +} + +/** + * g_key_file_set_boolean: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @value: %TRUE or %FALSE + * + * Associates a new boolean value with @key under @group_name. + * If @key cannot be found then it is created. + * + * Since: 2.6 + **/ +void +g_key_file_set_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean value) +{ + gchar *result; + + g_return_if_fail (key_file != NULL); + + result = g_key_file_parse_boolean_as_value (key_file, value); + g_key_file_set_value (key_file, group_name, key, result); + g_free (result); +} + +/** + * g_key_file_get_boolean_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @length: the number of booleans returned + * @error: return location for a #GError + * + * Returns the values associated with @key under @group_name as + * booleans. + * + * If @key cannot be found then %NULL is returned and @error is set to + * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated + * with @key cannot be interpreted as booleans then %NULL is returned + * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. + * + * Return value: the values associated with the key as a list of + * booleans, or %NULL if the key was not found or could not be parsed. + * + * Since: 2.6 + **/ +gboolean * +g_key_file_get_boolean_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) +{ + GError *key_file_error; + gchar **values; + gboolean *bool_values; + gsize i, num_bools; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + if (length) + *length = 0; + + key_file_error = NULL; + + values = g_key_file_get_string_list (key_file, group_name, key, + &num_bools, &key_file_error); + + if (key_file_error) + g_propagate_error (error, key_file_error); + + if (!values) + return NULL; + + bool_values = g_new (gboolean, num_bools); + + for (i = 0; i < num_bools; i++) + { + bool_values[i] = g_key_file_parse_value_as_boolean (key_file, + values[i], + &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + g_strfreev (values); + g_free (bool_values); + + return NULL; + } + } + g_strfreev (values); + + if (length) + *length = num_bools; + + return bool_values; +} + +/** + * g_key_file_set_boolean_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @list: an array of boolean values + * @length: length of @list + * + * Associates a list of boolean values with @key under @group_name. + * If @key cannot be found then it is created. + * If @group_name is %NULL, the start_group is used. + * + * Since: 2.6 + **/ +void +g_key_file_set_boolean_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean list[], + gsize length) +{ + GString *value_list; + gsize i; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (list != NULL); + + value_list = g_string_sized_new (length * 8); + for (i = 0; i < length; i++) + { + gchar *value; + + value = g_key_file_parse_boolean_as_value (key_file, list[i]); + + g_string_append (value_list, value); + g_string_append_c (value_list, key_file->list_separator); + + g_free (value); + } + + g_key_file_set_value (key_file, group_name, key, value_list->str); + g_string_free (value_list, TRUE); +} + +/** + * g_key_file_get_integer: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @error: return location for a #GError + * + * Returns the value associated with @key under @group_name as an + * integer. + * + * If @key cannot be found then 0 is returned and @error is set to + * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated + * with @key cannot be interpreted as an integer then 0 is returned + * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. + * + * Return value: the value associated with the key as an integer, or + * 0 if the key was not found or could not be parsed. + * + * Since: 2.6 + **/ +gint +g_key_file_get_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GError *key_file_error; + gchar *value; + gint int_value; + + g_return_val_if_fail (key_file != NULL, -1); + g_return_val_if_fail (group_name != NULL, -1); + g_return_val_if_fail (key != NULL, -1); + + key_file_error = NULL; + + value = g_key_file_get_value (key_file, group_name, key, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return 0; + } + + int_value = g_key_file_parse_value_as_integer (key_file, value, + &key_file_error); + g_free (value); + + if (key_file_error) + { + if (g_error_matches (key_file_error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains key '%s' in group '%s' " + "which has value that cannot be interpreted."), key, + group_name); + g_error_free (key_file_error); + } + else + g_propagate_error (error, key_file_error); + } + + return int_value; +} + +/** + * g_key_file_set_integer: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @value: an integer value + * + * Associates a new integer value with @key under @group_name. + * If @key cannot be found then it is created. + * + * Since: 2.6 + **/ +void +g_key_file_set_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint value) +{ + gchar *result; + + g_return_if_fail (key_file != NULL); + + result = g_key_file_parse_integer_as_value (key_file, value); + g_key_file_set_value (key_file, group_name, key, result); + g_free (result); +} + +/** + * g_key_file_get_integer_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @length: the number of integers returned + * @error: return location for a #GError + * + * Returns the values associated with @key under @group_name as + * integers. + * + * If @key cannot be found then %NULL is returned and @error is set to + * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated + * with @key cannot be interpreted as integers then %NULL is returned + * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. + * + * Return value: the values associated with the key as a list of + * integers, or %NULL if the key was not found or could not be parsed. + * + * Since: 2.6 + **/ +gint * +g_key_file_get_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) +{ + GError *key_file_error = NULL; + gchar **values; + gint *int_values; + gsize i, num_ints; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + if (length) + *length = 0; + + values = g_key_file_get_string_list (key_file, group_name, key, + &num_ints, &key_file_error); + + if (key_file_error) + g_propagate_error (error, key_file_error); + + if (!values) + return NULL; + + int_values = g_new (gint, num_ints); + + for (i = 0; i < num_ints; i++) + { + int_values[i] = g_key_file_parse_value_as_integer (key_file, + values[i], + &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + g_strfreev (values); + g_free (int_values); + + return NULL; + } + } + g_strfreev (values); + + if (length) + *length = num_ints; + + return int_values; +} + +/** + * g_key_file_set_integer_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @list: an array of integer values + * @length: number of integer values in @list + * + * Associates a list of integer values with @key under @group_name. + * If @key cannot be found then it is created. + * + * Since: 2.6 + **/ +void +g_key_file_set_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint list[], + gsize length) +{ + GString *values; + gsize i; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (list != NULL); + + values = g_string_sized_new (length * 16); + for (i = 0; i < length; i++) + { + gchar *value; + + value = g_key_file_parse_integer_as_value (key_file, list[i]); + + g_string_append (values, value); + g_string_append_c (values, key_file->list_separator); + + g_free (value); + } + + g_key_file_set_value (key_file, group_name, key, values->str); + g_string_free (values, TRUE); +} + +/** + * g_key_file_get_double: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @error: return location for a #GError + * + * Returns the value associated with @key under @group_name as a + * double. If @group_name is %NULL, the start_group is used. + * + * If @key cannot be found then 0.0 is returned and @error is set to + * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated + * with @key cannot be interpreted as a double then 0.0 is returned + * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. + * + * Return value: the value associated with the key as a double, or + * 0.0 if the key was not found or could not be parsed. + * + * Since: 2.12 + **/ +gdouble +g_key_file_get_double (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GError *key_file_error; + gchar *value; + gdouble double_value; + + g_return_val_if_fail (key_file != NULL, -1); + g_return_val_if_fail (group_name != NULL, -1); + g_return_val_if_fail (key != NULL, -1); + + key_file_error = NULL; + + value = g_key_file_get_value (key_file, group_name, key, &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + return 0; + } + + double_value = g_key_file_parse_value_as_double (key_file, value, + &key_file_error); + g_free (value); + + if (key_file_error) + { + if (g_error_matches (key_file_error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE)) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains key '%s' in group '%s' " + "which has value that cannot be interpreted."), key, + group_name); + g_error_free (key_file_error); + } + else + g_propagate_error (error, key_file_error); + } + + return double_value; +} + +/** + * g_key_file_set_double: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @value: an double value + * + * Associates a new double value with @key under @group_name. + * If @key cannot be found then it is created. + * + * Since: 2.12 + **/ +void +g_key_file_set_double (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gdouble value) +{ + gchar result[G_ASCII_DTOSTR_BUF_SIZE]; + + g_return_if_fail (key_file != NULL); + + g_ascii_dtostr (result, sizeof (result), value); + g_key_file_set_value (key_file, group_name, key, result); +} + +/** + * g_key_file_get_double_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @length: the number of doubles returned + * @error: return location for a #GError + * + * Returns the values associated with @key under @group_name as + * doubles. + * + * If @key cannot be found then %NULL is returned and @error is set to + * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values associated + * with @key cannot be interpreted as doubles then %NULL is returned + * and @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE. + * + * Return value: the values associated with the key as a list of + * doubles, or %NULL if the key was not found or could not be parsed. + * + * Since: 2.12 + **/ +gdouble * +g_key_file_get_double_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) +{ + GError *key_file_error = NULL; + gchar **values; + gdouble *double_values; + gsize i, num_doubles; + + g_return_val_if_fail (key_file != NULL, NULL); + g_return_val_if_fail (group_name != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + if (length) + *length = 0; + + values = g_key_file_get_string_list (key_file, group_name, key, + &num_doubles, &key_file_error); + + if (key_file_error) + g_propagate_error (error, key_file_error); + + if (!values) + return NULL; + + double_values = g_new (gdouble, num_doubles); + + for (i = 0; i < num_doubles; i++) + { + double_values[i] = g_key_file_parse_value_as_double (key_file, + values[i], + &key_file_error); + + if (key_file_error) + { + g_propagate_error (error, key_file_error); + g_strfreev (values); + g_free (double_values); + + return NULL; + } + } + g_strfreev (values); + + if (length) + *length = num_doubles; + + return double_values; +} + +/** + * g_key_file_set_double_list: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @list: an array of double values + * @length: number of double values in @list + * + * Associates a list of double values with @key under + * @group_name. If @key cannot be found then it is created. + * + * Since: 2.12 + **/ +void +g_key_file_set_double_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gdouble list[], + gsize length) +{ + GString *values; + gsize i; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (list != NULL); + + values = g_string_sized_new (length * 16); + for (i = 0; i < length; i++) + { + gchar result[G_ASCII_DTOSTR_BUF_SIZE]; + + g_ascii_dtostr( result, sizeof (result), list[i] ); + + g_string_append (values, result); + g_string_append_c (values, key_file->list_separator); + } + + g_key_file_set_value (key_file, group_name, key, values->str); + g_string_free (values, TRUE); +} + +static gboolean +g_key_file_set_key_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *comment, + GError **error) +{ + GKeyFileGroup *group; + GKeyFileKeyValuePair *pair; + GList *key_node, *comment_node, *tmp; + + group = g_key_file_lookup_group (key_file, group_name); + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + + return FALSE; + } + + /* First find the key the comments are supposed to be + * associated with + */ + key_node = g_key_file_lookup_key_value_pair_node (key_file, group, key); + + if (key_node == NULL) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND, + _("Key file does not have key '%s' in group '%s'"), + key, group->name); + return FALSE; + } + + /* Then find all the comments already associated with the + * key and free them + */ + tmp = key_node->next; + while (tmp != NULL) + { + pair = (GKeyFileKeyValuePair *) tmp->data; + + if (pair->key != NULL) + break; + + comment_node = tmp; + tmp = tmp->next; + g_key_file_remove_key_value_pair_node (key_file, group, + comment_node); + } + + if (comment == NULL) + return TRUE; + + /* Now we can add our new comment + */ + pair = g_slice_new (GKeyFileKeyValuePair); + pair->key = NULL; + pair->value = g_key_file_parse_comment_as_value (key_file, comment); + + key_node = g_list_insert (key_node, pair, 1); + + return TRUE; +} + +static gboolean +g_key_file_set_group_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *comment, + GError **error) +{ + GKeyFileGroup *group; + + g_return_val_if_fail (g_key_file_is_group_name (group_name), FALSE); + + group = g_key_file_lookup_group (key_file, group_name); + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + + return FALSE; + } + + /* First remove any existing comment + */ + if (group->comment) + { + g_key_file_key_value_pair_free (group->comment); + group->comment = NULL; + } + + if (comment == NULL) + return TRUE; + + /* Now we can add our new comment + */ + group->comment = g_slice_new (GKeyFileKeyValuePair); + group->comment->key = NULL; + group->comment->value = g_key_file_parse_comment_as_value (key_file, comment); + + return TRUE; +} + +static gboolean +g_key_file_set_top_comment (GKeyFile *key_file, + const gchar *comment, + GError **error) +{ + GList *group_node; + GKeyFileGroup *group; + GKeyFileKeyValuePair *pair; + + /* The last group in the list should be the top (comments only) + * group in the file + */ + g_warn_if_fail (key_file->groups != NULL); + group_node = g_list_last (key_file->groups); + group = (GKeyFileGroup *) group_node->data; + g_warn_if_fail (group->name == NULL); + + /* Note all keys must be comments at the top of + * the file, so we can just free it all. + */ + if (group->key_value_pairs != NULL) + { + g_list_foreach (group->key_value_pairs, + (GFunc) g_key_file_key_value_pair_free, + NULL); + g_list_free (group->key_value_pairs); + group->key_value_pairs = NULL; + } + + if (comment == NULL) + return TRUE; + + pair = g_slice_new (GKeyFileKeyValuePair); + pair->key = NULL; + pair->value = g_key_file_parse_comment_as_value (key_file, comment); + + group->key_value_pairs = + g_list_prepend (group->key_value_pairs, pair); + + return TRUE; +} + +/** + * g_key_file_set_comment: + * @key_file: a #GKeyFile + * @group_name: a group name, or %NULL + * @key: a key + * @comment: a comment + * @error: return location for a #GError + * + * Places a comment above @key from @group_name. + * If @key is %NULL then @comment will be written above @group_name. + * If both @key and @group_name are %NULL, then @comment will be + * written above the first group in the file. + * + * Returns: %TRUE if the comment was written, %FALSE otherwise + * + * Since: 2.6 + **/ +gboolean +g_key_file_set_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *comment, + GError **error) +{ + g_return_val_if_fail (key_file != NULL, FALSE); + + if (group_name != NULL && key != NULL) + { + if (!g_key_file_set_key_comment (key_file, group_name, key, comment, error)) + return FALSE; + } + else if (group_name != NULL) + { + if (!g_key_file_set_group_comment (key_file, group_name, comment, error)) + return FALSE; + } + else + { + if (!g_key_file_set_top_comment (key_file, comment, error)) + return FALSE; + } + + if (comment != NULL) + key_file->approximate_size += strlen (comment); + + return TRUE; +} + +static gchar * +g_key_file_get_key_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GKeyFileGroup *group; + GKeyFileKeyValuePair *pair; + GList *key_node, *tmp; + GString *string; + gchar *comment; + + g_return_val_if_fail (g_key_file_is_group_name (group_name), NULL); + + group = g_key_file_lookup_group (key_file, group_name); + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + + return NULL; + } + + /* First find the key the comments are supposed to be + * associated with + */ + key_node = g_key_file_lookup_key_value_pair_node (key_file, group, key); + + if (key_node == NULL) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND, + _("Key file does not have key '%s' in group '%s'"), + key, group->name); + return NULL; + } + + string = NULL; + + /* Then find all the comments already associated with the + * key and concatentate them. + */ + tmp = key_node->next; + if (!key_node->next) + return NULL; + + pair = (GKeyFileKeyValuePair *) tmp->data; + if (pair->key != NULL) + return NULL; + + while (tmp->next) + { + pair = (GKeyFileKeyValuePair *) tmp->next->data; + + if (pair->key != NULL) + break; + + tmp = tmp->next; + } + + while (tmp != key_node) + { + pair = (GKeyFileKeyValuePair *) tmp->data; + + if (string == NULL) + string = g_string_sized_new (512); + + comment = g_key_file_parse_value_as_comment (key_file, pair->value); + g_string_append (string, comment); + g_free (comment); + + tmp = tmp->prev; + } + + if (string != NULL) + { + comment = string->str; + g_string_free (string, FALSE); + } + else + comment = NULL; + + return comment; +} + +static gchar * +get_group_comment (GKeyFile *key_file, + GKeyFileGroup *group, + GError **error) +{ + GString *string; + GList *tmp; + gchar *comment; + + string = NULL; + + tmp = group->key_value_pairs; + while (tmp) + { + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) tmp->data; + + if (pair->key != NULL) + { + tmp = tmp->prev; + break; + } + + if (tmp->next == NULL) + break; + + tmp = tmp->next; + } + + while (tmp != NULL) + { + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) tmp->data; + + if (string == NULL) + string = g_string_sized_new (512); + + comment = g_key_file_parse_value_as_comment (key_file, pair->value); + g_string_append (string, comment); + g_free (comment); + + tmp = tmp->prev; + } + + if (string != NULL) + return g_string_free (string, FALSE); + + return NULL; +} + +static gchar * +g_key_file_get_group_comment (GKeyFile *key_file, + const gchar *group_name, + GError **error) +{ + GList *group_node; + GKeyFileGroup *group; + + group = g_key_file_lookup_group (key_file, group_name); + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + + return NULL; + } + + if (group->comment) + return g_strdup (group->comment->value); + + group_node = g_key_file_lookup_group_node (key_file, group_name); + group_node = group_node->next; + group = (GKeyFileGroup *)group_node->data; + return get_group_comment (key_file, group, error); +} + +static gchar * +g_key_file_get_top_comment (GKeyFile *key_file, + GError **error) +{ + GList *group_node; + GKeyFileGroup *group; + + /* The last group in the list should be the top (comments only) + * group in the file + */ + g_warn_if_fail (key_file->groups != NULL); + group_node = g_list_last (key_file->groups); + group = (GKeyFileGroup *) group_node->data; + g_warn_if_fail (group->name == NULL); + + return get_group_comment (key_file, group, error); +} + +/** + * g_key_file_get_comment: + * @key_file: a #GKeyFile + * @group_name: a group name, or %NULL + * @key: a key + * @error: return location for a #GError + * + * Retrieves a comment above @key from @group_name. + * If @key is %NULL then @comment will be read from above + * @group_name. If both @key and @group_name are %NULL, then + * @comment will be read from above the first group in the file. + * + * Returns: a comment that should be freed with g_free() + * + * Since: 2.6 + **/ +gchar * +g_key_file_get_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + g_return_val_if_fail (key_file != NULL, NULL); + + if (group_name != NULL && key != NULL) + return g_key_file_get_key_comment (key_file, group_name, key, error); + else if (group_name != NULL) + return g_key_file_get_group_comment (key_file, group_name, error); + else + return g_key_file_get_top_comment (key_file, error); +} + +/** + * g_key_file_remove_comment: + * @key_file: a #GKeyFile + * @group_name: a group name, or %NULL + * @key: a key + * @error: return location for a #GError + * + * Removes a comment above @key from @group_name. + * If @key is %NULL then @comment will be removed above @group_name. + * If both @key and @group_name are %NULL, then @comment will + * be removed above the first group in the file. + * + * Returns: %TRUE if the comment was removed, %FALSE otherwise + * + * Since: 2.6 + **/ + +gboolean +g_key_file_remove_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + g_return_val_if_fail (key_file != NULL, FALSE); + + if (group_name != NULL && key != NULL) + return g_key_file_set_key_comment (key_file, group_name, key, NULL, error); + else if (group_name != NULL) + return g_key_file_set_group_comment (key_file, group_name, NULL, error); + else + return g_key_file_set_top_comment (key_file, NULL, error); +} + +/** + * g_key_file_has_group: + * @key_file: a #GKeyFile + * @group_name: a group name + * + * Looks whether the key file has the group @group_name. + * + * Return value: %TRUE if @group_name is a part of @key_file, %FALSE + * otherwise. + * Since: 2.6 + **/ +gboolean +g_key_file_has_group (GKeyFile *key_file, + const gchar *group_name) +{ + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (group_name != NULL, FALSE); + + return g_key_file_lookup_group (key_file, group_name) != NULL; +} + +/** + * g_key_file_has_key: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key name + * @error: return location for a #GError + * + * Looks whether the key file has the key @key in the group + * @group_name. + * + * Return value: %TRUE if @key is a part of @group_name, %FALSE + * otherwise. + * + * Since: 2.6 + **/ +gboolean +g_key_file_has_key (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GKeyFileKeyValuePair *pair; + GKeyFileGroup *group; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (group_name != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + group = g_key_file_lookup_group (key_file, group_name); + + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + + return FALSE; + } + + pair = g_key_file_lookup_key_value_pair (key_file, group, key); + + return pair != NULL; +} + +static void +g_key_file_add_group (GKeyFile *key_file, + const gchar *group_name) +{ + GKeyFileGroup *group; + + g_return_if_fail (key_file != NULL); + g_return_if_fail (g_key_file_is_group_name (group_name)); + + group = g_key_file_lookup_group (key_file, group_name); + if (group != NULL) + { + key_file->current_group = group; + return; + } + + group = g_slice_new0 (GKeyFileGroup); + group->name = g_strdup (group_name); + group->lookup_map = g_hash_table_new (g_str_hash, g_str_equal); + key_file->groups = g_list_prepend (key_file->groups, group); + key_file->approximate_size += strlen (group_name) + 3; + key_file->current_group = group; + + if (key_file->start_group == NULL) + key_file->start_group = group; + + g_hash_table_insert (key_file->group_hash, (gpointer)group->name, group); +} + +static void +g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair) +{ + if (pair != NULL) + { + g_free (pair->key); + g_free (pair->value); + g_slice_free (GKeyFileKeyValuePair, pair); + } +} + +/* Be careful not to call this function on a node with data in the + * lookup map without removing it from the lookup map, first. + * + * Some current cases where this warning is not a concern are + * when: + * - the node being removed is a comment node + * - the entire lookup map is getting destroyed soon after + * anyway. + */ +static void +g_key_file_remove_key_value_pair_node (GKeyFile *key_file, + GKeyFileGroup *group, + GList *pair_node) +{ + + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) pair_node->data; + + group->key_value_pairs = g_list_remove_link (group->key_value_pairs, pair_node); + + if (pair->key != NULL) + key_file->approximate_size -= strlen (pair->key) + 1; + + g_warn_if_fail (pair->value != NULL); + key_file->approximate_size -= strlen (pair->value); + + g_key_file_key_value_pair_free (pair); + + g_list_free_1 (pair_node); +} + +static void +g_key_file_remove_group_node (GKeyFile *key_file, + GList *group_node) +{ + GKeyFileGroup *group; + GList *tmp; + + group = (GKeyFileGroup *) group_node->data; + + if (group->name) + g_hash_table_remove (key_file->group_hash, group->name); + + /* If the current group gets deleted make the current group the last + * added group. + */ + if (key_file->current_group == group) + { + /* groups should always contain at least the top comment group, + * unless g_key_file_clear has been called + */ + if (key_file->groups) + key_file->current_group = (GKeyFileGroup *) key_file->groups->data; + else + key_file->current_group = NULL; + } + + /* If the start group gets deleted make the start group the first + * added group. + */ + if (key_file->start_group == group) + { + tmp = g_list_last (key_file->groups); + while (tmp != NULL) + { + if (tmp != group_node && + ((GKeyFileGroup *) tmp->data)->name != NULL) + break; + + tmp = tmp->prev; + } + + if (tmp) + key_file->start_group = (GKeyFileGroup *) tmp->data; + else + key_file->start_group = NULL; + } + + key_file->groups = g_list_remove_link (key_file->groups, group_node); + + if (group->name != NULL) + key_file->approximate_size -= strlen (group->name) + 3; + + tmp = group->key_value_pairs; + while (tmp != NULL) + { + GList *pair_node; + + pair_node = tmp; + tmp = tmp->next; + g_key_file_remove_key_value_pair_node (key_file, group, pair_node); + } + + g_warn_if_fail (group->key_value_pairs == NULL); + + if (group->lookup_map) + { + g_hash_table_destroy (group->lookup_map); + group->lookup_map = NULL; + } + + g_free ((gchar *) group->name); + g_slice_free (GKeyFileGroup, group); + g_list_free_1 (group_node); +} + +/** + * g_key_file_remove_group: + * @key_file: a #GKeyFile + * @group_name: a group name + * @error: return location for a #GError or %NULL + * + * Removes the specified group, @group_name, + * from the key file. + * + * Returns: %TRUE if the group was removed, %FALSE otherwise + * + * Since: 2.6 + **/ +gboolean +g_key_file_remove_group (GKeyFile *key_file, + const gchar *group_name, + GError **error) +{ + GList *group_node; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (group_name != NULL, FALSE); + + group_node = g_key_file_lookup_group_node (key_file, group_name); + + if (!group_node) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name); + return FALSE; + } + + g_key_file_remove_group_node (key_file, group_node); + + return TRUE; +} + +static void +g_key_file_add_key (GKeyFile *key_file, + GKeyFileGroup *group, + const gchar *key, + const gchar *value) +{ + GKeyFileKeyValuePair *pair; + + pair = g_slice_new (GKeyFileKeyValuePair); + pair->key = g_strdup (key); + pair->value = g_strdup (value); + + g_hash_table_replace (group->lookup_map, pair->key, pair); + group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair); + group->has_trailing_blank_line = FALSE; + key_file->approximate_size += strlen (key) + strlen (value) + 2; +} + +/** + * g_key_file_remove_key: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key name to remove + * @error: return location for a #GError or %NULL + * + * Removes @key in @group_name from the key file. + * + * Returns: %TRUE if the key was removed, %FALSE otherwise + * + * Since: 2.6 + **/ +gboolean +g_key_file_remove_key (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + GKeyFileGroup *group; + GKeyFileKeyValuePair *pair; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (group_name != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + pair = NULL; + + group = g_key_file_lookup_group (key_file, group_name); + if (!group) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + _("Key file does not have group '%s'"), + group_name ? group_name : "(null)"); + return FALSE; + } + + pair = g_key_file_lookup_key_value_pair (key_file, group, key); + + if (!pair) + { + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND, + _("Key file does not have key '%s' in group '%s'"), + key, group->name); + return FALSE; + } + + key_file->approximate_size -= strlen (pair->key) + strlen (pair->value) + 2; + + group->key_value_pairs = g_list_remove (group->key_value_pairs, pair); + g_hash_table_remove (group->lookup_map, pair->key); + g_key_file_key_value_pair_free (pair); + + return TRUE; +} + +static GList * +g_key_file_lookup_group_node (GKeyFile *key_file, + const gchar *group_name) +{ + GKeyFileGroup *group; + GList *tmp; + + for (tmp = key_file->groups; tmp != NULL; tmp = tmp->next) + { + group = (GKeyFileGroup *) tmp->data; + + if (group && group->name && strcmp (group->name, group_name) == 0) + break; + } + + return tmp; +} + +static GKeyFileGroup * +g_key_file_lookup_group (GKeyFile *key_file, + const gchar *group_name) +{ + return (GKeyFileGroup *)g_hash_table_lookup (key_file->group_hash, group_name); +} + +static GList * +g_key_file_lookup_key_value_pair_node (GKeyFile *key_file, + GKeyFileGroup *group, + const gchar *key) +{ + GList *key_node; + + for (key_node = group->key_value_pairs; + key_node != NULL; + key_node = key_node->next) + { + GKeyFileKeyValuePair *pair; + + pair = (GKeyFileKeyValuePair *) key_node->data; + + if (pair->key && strcmp (pair->key, key) == 0) + break; + } + + return key_node; +} + +static GKeyFileKeyValuePair * +g_key_file_lookup_key_value_pair (GKeyFile *key_file, + GKeyFileGroup *group, + const gchar *key) +{ + return (GKeyFileKeyValuePair *) g_hash_table_lookup (group->lookup_map, key); +} + +/* Lines starting with # or consisting entirely of whitespace are merely + * recorded, not parsed. This function assumes all leading whitespace + * has been stripped. + */ +static gboolean +g_key_file_line_is_comment (const gchar *line) +{ + return (*line == '#' || *line == '\0' || *line == '\n'); +} + +static gboolean +g_key_file_is_group_name (const gchar *name) +{ + gchar *p, *q; + + if (name == NULL) + return FALSE; + + p = q = (gchar *) name; + while (*q && *q != ']' && *q != '[' && !g_ascii_iscntrl (*q)) + q = g_utf8_find_next_char (q, NULL); + + if (*q != '\0' || q == p) + return FALSE; + + return TRUE; +} + +static gboolean +g_key_file_is_key_name (const gchar *name) +{ + gchar *p, *q; + + if (name == NULL) + return FALSE; + + p = q = (gchar *) name; + /* We accept a little more than the desktop entry spec says, + * since gnome-vfs uses mime-types as keys in its cache. + */ + while (*q && *q != '=' && *q != '[' && *q != ']') + q = g_utf8_find_next_char (q, NULL); + + /* No empty keys, please */ + if (q == p) + return FALSE; + + /* We accept spaces in the middle of keys to not break + * existing apps, but we don't tolerate initial or final + * spaces, which would lead to silent corruption when + * rereading the file. + */ + if (*p == ' ' || q[-1] == ' ') + return FALSE; + + if (*q == '[') + { + q++; + while (*q && (g_unichar_isalnum (g_utf8_get_char_validated (q, -1)) || *q == '-' || *q == '_' || *q == '.' || *q == '@')) + q = g_utf8_find_next_char (q, NULL); + + if (*q != ']') + return FALSE; + + q++; + } + + if (*q != '\0') + return FALSE; + + return TRUE; +} + +/* A group in a key file is made up of a starting '[' followed by one + * or more letters making up the group name followed by ']'. + */ +static gboolean +g_key_file_line_is_group (const gchar *line) +{ + gchar *p; + + p = (gchar *) line; + if (*p != '[') + return FALSE; + + p++; + + while (*p && *p != ']') + p = g_utf8_find_next_char (p, NULL); + + if (*p != ']') + return FALSE; + + /* silently accept whitespace after the ] */ + p = g_utf8_find_next_char (p, NULL); + while (*p == ' ' || *p == '\t') + p = g_utf8_find_next_char (p, NULL); + + if (*p) + return FALSE; + + return TRUE; +} + +static gboolean +g_key_file_line_is_key_value_pair (const gchar *line) +{ + gchar *p; + + p = (gchar *) g_utf8_strchr (line, -1, '='); + + if (!p) + return FALSE; + + /* Key must be non-empty + */ + if (*p == line[0]) + return FALSE; + + return TRUE; +} + +static gchar * +g_key_file_parse_value_as_string (GKeyFile *key_file, + const gchar *value, + GSList **pieces, + GError **error) +{ + gchar *string_value, *p, *q0, *q; + + string_value = g_new (gchar, strlen (value) + 1); + + p = (gchar *) value; + q0 = q = string_value; + while (*p) + { + if (*p == '\\') + { + p++; + + switch (*p) + { + case 's': + *q = ' '; + break; + + case 'n': + *q = '\n'; + break; + + case 't': + *q = '\t'; + break; + + case 'r': + *q = '\r'; + break; + + case '\\': + *q = '\\'; + break; + + case '\0': + g_set_error_literal (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains escape character " + "at end of line")); + break; + + default: + if (pieces && *p == key_file->list_separator) + *q = key_file->list_separator; + else + { + *q++ = '\\'; + *q = *p; + + if (*error == NULL) + { + gchar sequence[3]; + + sequence[0] = '\\'; + sequence[1] = *p; + sequence[2] = '\0'; + + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key file contains invalid escape " + "sequence '%s'"), sequence); + } + } + break; + } + } + else + { + *q = *p; + if (pieces && (*p == key_file->list_separator)) + { + *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0)); + q0 = q + 1; + } + } + + if (*p == '\0') + break; + + q++; + p++; + } + + *q = '\0'; + if (pieces) + { + if (q0 < q) + *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0)); + *pieces = g_slist_reverse (*pieces); + } + + return string_value; +} + +static gchar * +g_key_file_parse_string_as_value (GKeyFile *key_file, + const gchar *string, + gboolean escape_separator) +{ + gchar *value, *p, *q; + gsize length; + gboolean parsing_leading_space; + + length = strlen (string) + 1; + + /* Worst case would be that every character needs to be escaped. + * In other words every character turns to two characters + */ + value = g_new (gchar, 2 * length); + + p = (gchar *) string; + q = value; + parsing_leading_space = TRUE; + while (p < (string + length - 1)) + { + gchar escaped_character[3] = { '\\', 0, 0 }; + + switch (*p) + { + case ' ': + if (parsing_leading_space) + { + escaped_character[1] = 's'; + strcpy (q, escaped_character); + q += 2; + } + else + { + *q = *p; + q++; + } + break; + case '\t': + if (parsing_leading_space) + { + escaped_character[1] = 't'; + strcpy (q, escaped_character); + q += 2; + } + else + { + *q = *p; + q++; + } + break; + case '\n': + escaped_character[1] = 'n'; + strcpy (q, escaped_character); + q += 2; + break; + case '\r': + escaped_character[1] = 'r'; + strcpy (q, escaped_character); + q += 2; + break; + case '\\': + escaped_character[1] = '\\'; + strcpy (q, escaped_character); + q += 2; + parsing_leading_space = FALSE; + break; + default: + if (escape_separator && *p == key_file->list_separator) + { + escaped_character[1] = key_file->list_separator; + strcpy (q, escaped_character); + q += 2; + parsing_leading_space = TRUE; + } + else + { + *q = *p; + q++; + parsing_leading_space = FALSE; + } + break; + } + p++; + } + *q = '\0'; + + return value; +} + +static gint +g_key_file_parse_value_as_integer (GKeyFile *key_file, + const gchar *value, + GError **error) +{ + gchar *end_of_valid_int; + glong long_value; + gint int_value; + + errno = 0; + long_value = strtol (value, &end_of_valid_int, 10); + + if (*value == '\0' || *end_of_valid_int != '\0') + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Value '%s' cannot be interpreted " + "as a number."), value_utf8); + g_free (value_utf8); + + return 0; + } + + int_value = long_value; + if (int_value != long_value || errno == ERANGE) + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Integer value '%s' out of range"), + value_utf8); + g_free (value_utf8); + + return 0; + } + + return int_value; +} + +static gchar * +g_key_file_parse_integer_as_value (GKeyFile *key_file, + gint value) + +{ + return g_strdup_printf ("%d", value); +} + +static gdouble +g_key_file_parse_value_as_double (GKeyFile *key_file, + const gchar *value, + GError **error) +{ + gchar *end_of_valid_d; + gdouble double_value = 0; + + double_value = g_ascii_strtod (value, &end_of_valid_d); + + if (*end_of_valid_d != '\0' || end_of_valid_d == value) + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Value '%s' cannot be interpreted " + "as a float number."), + value_utf8); + g_free (value_utf8); + } + + return double_value; +} + +static gboolean +g_key_file_parse_value_as_boolean (GKeyFile *key_file, + const gchar *value, + GError **error) +{ + gchar *value_utf8; + + if (strcmp (value, "true") == 0 || strcmp (value, "1") == 0) + return TRUE; + else if (strcmp (value, "false") == 0 || strcmp (value, "0") == 0) + return FALSE; + + value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Value '%s' cannot be interpreted " + "as a boolean."), value_utf8); + g_free (value_utf8); + + return FALSE; +} + +static gchar * +g_key_file_parse_boolean_as_value (GKeyFile *key_file, + gboolean value) +{ + if (value) + return g_strdup ("true"); + else + return g_strdup ("false"); +} + +static gchar * +g_key_file_parse_value_as_comment (GKeyFile *key_file, + const gchar *value) +{ + GString *string; + gchar **lines; + gsize i; + + string = g_string_sized_new (512); + + lines = g_strsplit (value, "\n", 0); + + for (i = 0; lines[i] != NULL; i++) + { + if (lines[i][0] != '#') + g_string_append_printf (string, "%s\n", lines[i]); + else + g_string_append_printf (string, "%s\n", lines[i] + 1); + } + g_strfreev (lines); + + return g_string_free (string, FALSE); +} + +static gchar * +g_key_file_parse_comment_as_value (GKeyFile *key_file, + const gchar *comment) +{ + GString *string; + gchar **lines; + gsize i; + + string = g_string_sized_new (512); + + lines = g_strsplit (comment, "\n", 0); + + for (i = 0; lines[i] != NULL; i++) + g_string_append_printf (string, "#%s%s", lines[i], + lines[i + 1] == NULL? "" : "\n"); + g_strfreev (lines); + + return g_string_free (string, FALSE); +} + +#define __G_KEY_FILE_C__ +#include "galiasdef.c" diff --git a/glib/gkeyfile.h b/glib/gkeyfile.h new file mode 100644 index 0000000..b19124c --- /dev/null +++ b/glib/gkeyfile.h @@ -0,0 +1,250 @@ +/* gkeyfile.h - desktop entry file parser + * + * Copyright 2004 Red Hat, Inc. + * + * Ray Strode + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_KEY_FILE_H__ +#define __G_KEY_FILE_H__ + +#include + +G_BEGIN_DECLS + +typedef enum +{ + G_KEY_FILE_ERROR_UNKNOWN_ENCODING, + G_KEY_FILE_ERROR_PARSE, + G_KEY_FILE_ERROR_NOT_FOUND, + G_KEY_FILE_ERROR_KEY_NOT_FOUND, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND, + G_KEY_FILE_ERROR_INVALID_VALUE +} GKeyFileError; + +#define G_KEY_FILE_ERROR g_key_file_error_quark() + +GQuark g_key_file_error_quark (void); + +typedef struct _GKeyFile GKeyFile; + +typedef enum +{ + G_KEY_FILE_NONE = 0, + G_KEY_FILE_KEEP_COMMENTS = 1 << 0, + G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1 +} GKeyFileFlags; + +GKeyFile *g_key_file_new (void); +void g_key_file_free (GKeyFile *key_file); +void g_key_file_set_list_separator (GKeyFile *key_file, + gchar separator); +gboolean g_key_file_load_from_file (GKeyFile *key_file, + const gchar *file, + GKeyFileFlags flags, + GError **error); +gboolean g_key_file_load_from_data (GKeyFile *key_file, + const gchar *data, + gsize length, + GKeyFileFlags flags, + GError **error); +gboolean g_key_file_load_from_dirs (GKeyFile *key_file, + const gchar *file, + const gchar **search_dirs, + gchar **full_path, + GKeyFileFlags flags, + GError **error); +gboolean g_key_file_load_from_data_dirs (GKeyFile *key_file, + const gchar *file, + gchar **full_path, + GKeyFileFlags flags, + GError **error); +gchar *g_key_file_to_data (GKeyFile *key_file, + gsize *length, + GError **error) G_GNUC_MALLOC; +gchar *g_key_file_get_start_group (GKeyFile *key_file) G_GNUC_MALLOC; +gchar **g_key_file_get_groups (GKeyFile *key_file, + gsize *length) G_GNUC_MALLOC; +gchar **g_key_file_get_keys (GKeyFile *key_file, + const gchar *group_name, + gsize *length, + GError **error) G_GNUC_MALLOC; +gboolean g_key_file_has_group (GKeyFile *key_file, + const gchar *group_name); +gboolean g_key_file_has_key (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +gchar *g_key_file_get_value (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_value (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *value); +gchar *g_key_file_get_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *string); +gchar *g_key_file_get_locale_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_locale_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + const gchar *string); +gboolean g_key_file_get_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +void g_key_file_set_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean value); +gint g_key_file_get_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +void g_key_file_set_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint value); +gdouble g_key_file_get_double (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +void g_key_file_set_double (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gdouble value); +gchar **g_key_file_get_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar * const list[], + gsize length); +gchar **g_key_file_get_locale_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + gsize *length, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_locale_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + const gchar * const list[], + gsize length); +gboolean *g_key_file_get_boolean_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_boolean_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean list[], + gsize length); +gint *g_key_file_get_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_double_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gdouble list[], + gsize length); +gdouble *g_key_file_get_double_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +void g_key_file_set_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint list[], + gsize length); +gboolean g_key_file_set_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *comment, + GError **error); +gchar *g_key_file_get_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) G_GNUC_MALLOC; + +gboolean g_key_file_remove_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +gboolean g_key_file_remove_key (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +gboolean g_key_file_remove_group (GKeyFile *key_file, + const gchar *group_name, + GError **error); + +/* Defines for handling freedesktop.org Desktop files */ +#define G_KEY_FILE_DESKTOP_GROUP "Desktop Entry" + +#define G_KEY_FILE_DESKTOP_KEY_TYPE "Type" +#define G_KEY_FILE_DESKTOP_KEY_VERSION "Version" +#define G_KEY_FILE_DESKTOP_KEY_NAME "Name" +#define G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME "GenericName" +#define G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY "NoDisplay" +#define G_KEY_FILE_DESKTOP_KEY_COMMENT "Comment" +#define G_KEY_FILE_DESKTOP_KEY_ICON "Icon" +#define G_KEY_FILE_DESKTOP_KEY_HIDDEN "Hidden" +#define G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN "OnlyShowIn" +#define G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN "NotShowIn" +#define G_KEY_FILE_DESKTOP_KEY_TRY_EXEC "TryExec" +#define G_KEY_FILE_DESKTOP_KEY_EXEC "Exec" +#define G_KEY_FILE_DESKTOP_KEY_PATH "Path" +#define G_KEY_FILE_DESKTOP_KEY_TERMINAL "Terminal" +#define G_KEY_FILE_DESKTOP_KEY_MIME_TYPE "MimeType" +#define G_KEY_FILE_DESKTOP_KEY_CATEGORIES "Categories" +#define G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY "StartupNotify" +#define G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS "StartupWMClass" +#define G_KEY_FILE_DESKTOP_KEY_URL "URL" + +#define G_KEY_FILE_DESKTOP_TYPE_APPLICATION "Application" +#define G_KEY_FILE_DESKTOP_TYPE_LINK "Link" +#define G_KEY_FILE_DESKTOP_TYPE_DIRECTORY "Directory" + +G_END_DECLS + +#endif /* __G_KEY_FILE_H__ */ diff --git a/glib/glib-mirroring-tab/Makefile b/glib/glib-mirroring-tab/Makefile new file mode 100644 index 0000000..8ab193c --- /dev/null +++ b/glib/glib-mirroring-tab/Makefile @@ -0,0 +1,11 @@ + +CFLAGS = `pkg-config --cflags glib-2.0` +LIBS = `pkg-config --libs glib-2.0` + + +all: gen-mirroring-tab + +gen-mirroring-tab: gen-mirroring-tab.o packtab.o + +clean: + $(RM) gen-mirroring-tab *.o diff --git a/glib/glib-mirroring-tab/gen-mirroring-tab.c b/glib/glib-mirroring-tab/gen-mirroring-tab.c new file mode 100644 index 0000000..6b16376 --- /dev/null +++ b/glib/glib-mirroring-tab/gen-mirroring-tab.c @@ -0,0 +1,232 @@ +/* gen-mirroring-tab.c - generate gmirroringtable.h for glib + * copied from FriBidi. + * + * $Id$ + * $Author$ + * $Date$ + * $Revision$ + * $Source$ + * + * Author: + * Behdad Esfahbod, 2001, 2002, 2004 + * + * Copyright (C) 2004 Sharif FarsiWeb, Inc + * Copyright (C) 2001,2002,2004 Behdad Esfahbod + * + * 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, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact . + */ + +#include + +#include +#include + +#include "packtab.h" + +#define appname "gen-mirroring-tab" +#define outputname "gmirroringtable.h" + +static void +die ( + const char *msg +) +{ + fprintf (stderr, appname ": %s\n", msg); + exit (1); +} + +static void +die2 ( + const char *fmt, + const char *p +) +{ + fprintf (stderr, appname ": "); + fprintf (stderr, fmt, p); + fprintf (stderr, "\n"); + exit (1); +} + +static void +die4 ( + const char *fmt, + unsigned long l, + unsigned long p, + unsigned long q +) +{ + fprintf (stderr, appname ": "); + fprintf (stderr, fmt, l, p, q); + fprintf (stderr, "\n"); + exit (1); +} + +#define table_name "Mir" +#define macro_name "GLIB_GET_MIRRORING" + +#define UNICODE_CHARS 0x110000 + +static signed int table[UNICODE_CHARS]; +static char buf[4000]; +static signed long max_dist; + +static void +init ( + void +) +{ + max_dist = 0; +} + +static void +clear_tab ( + void +) +{ + register gunichar c; + + for (c = 0; c < UNICODE_CHARS; c++) + table[c] = 0; +} + +static void +init_tab_mirroring_txt ( + void +) +{ + clear_tab (); +} + +static void +read_bidi_mirroring_txt ( + FILE *f +) +{ + unsigned long l; + + init_tab_mirroring_txt (); + + l = 0; + while (fgets (buf, sizeof buf, f)) + { + unsigned long i, j; + signed long dist; + int k; + const char *s = buf; + + l++; + + while (*s == ' ') + s++; + + if (s[0] == '#' || s[0] == '\0' || s[0] == '\n') + continue; + + k = sscanf (s, "%lx; %lx", &i, &j); + if (k != 2 || i >= UNICODE_CHARS || j >= UNICODE_CHARS) + die4 ("invalid pair in input at line %ld: %04lX, %04lX", l, i, j); + dist = ((signed long) j - (signed long) i); + table[i] = dist; + if (dist > max_dist) + max_dist = dist; + else if (-dist > max_dist) + max_dist = -dist; + } +} + +static void +read_data ( + const char *data_file_type, + const char *data_file_name +) +{ + FILE *f; + + fprintf (stderr, "Reading `%s'\n", data_file_name); + if (!(f = fopen (data_file_name, "rt"))) + die2 ("error: cannot open `%s' for reading", data_file_name); + + if (!strcmp (data_file_type, "BidiMirroring.txt")) + read_bidi_mirroring_txt (f); + else + die2 ("error: unknown data-file-type %s", data_file_type); + + fclose (f); +} + +static void +gen_mirroring_tab ( + int max_depth, + const char *data_file_type +) +{ + int key_bytes; + const char *key_type; + + fprintf (stderr, + "Generating `" outputname "', it may take up to a few minutes\n"); + printf ("/* " outputname "\n * generated by " appname " " + "\n" " * from the file %s of */\n\n", data_file_type); + + printf ("#define PACKTAB_UINT8 guint8\n" + "#define PACKTAB_UINT16 guint16\n" + "#define PACKTAB_UINT32 guint32\n\n"); + + key_bytes = max_dist <= 0x7f ? 1 : max_dist < 0x7fff ? 2 : 4; + key_type = key_bytes == 1 ? "gint8" : key_bytes == 2 ? + "gint16" : "gint32"; + + if (!pack_table + (table, UNICODE_CHARS, key_bytes, 0, max_depth, 1, NULL, + key_type, table_name, macro_name "_DELTA", stdout)) + die ("error: insufficient memory, decrease max_depth"); + + printf ("#undef PACKTAB_UINT8\n" + "#undef PACKTAB_UINT16\n" "#undef PACKTAB_UINT32\n\n"); + + printf ("#define " macro_name "(x) ((x) + " macro_name "_DELTA(x))\n\n"); + + printf ("/* End of generated " outputname " */\n"); +} + +int +main ( + int argc, + const char **argv +) +{ + const char *data_file_type = "BidiMirroring.txt"; + + if (argc < 3) + die2 ("usage:\n " appname " max-lookups /path/to/%s [junk...]", + data_file_type); + + { + int max_depth = atoi (argv[1]); + const char *data_file_name = argv[2]; + + if (max_depth < 2) + die ("invalid depth"); + + init (); + read_data (data_file_type, data_file_name); + gen_mirroring_tab (max_depth, data_file_type); + } + + return 0; +} diff --git a/glib/glib-mirroring-tab/packtab.c b/glib/glib-mirroring-tab/packtab.c new file mode 100644 index 0000000..7c0ff5d --- /dev/null +++ b/glib/glib-mirroring-tab/packtab.c @@ -0,0 +1,424 @@ +/* PackTab - Pack a static table + * Copyright (C) 2001 Behdad Esfahbod. + * + * 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, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact . + */ + +/* + 8 <= N <= 2^21 + int key + 1 <= max_depth <= 21 +*/ + +#include +#include +#include + +#include "packtab.h" + +typedef signed int uni_table[1024 * 1024 * 2]; +static int n, a, max_depth, digits, tab_width, per_row; +static long N; +signed int def_key; +static uni_table temp, x, perm, *tab; +static long pow[22], cluster, cmpcluster; +static const char *const *name, *key_type_name, *table_name, *macro_name; +static FILE *f; + +static long +most_binary ( + long min, + long max +) +{ + /* min should be less than max */ + register int i, ii; + + if (min == max) + return max; + + for (i = 21; max < pow[i]; i--) + ; + ii = i; + while (i && !((min ^ max) & pow[i])) + i--; + + if (ii == i) + { + /* min is less than half of max */ + for (i = 21 - 1; min < pow[i]; i--) + ; + i++; + return pow[i]; + } + + return max & (pow[i] - 1); +} + +static void +init ( + const signed int *table +) +{ + register int i; + + /* initialize powers of two */ + pow[0] = 1; + for (i = 1; i <= 21; i++) + pow[i] = pow[i - 1] << 1; + + /* reduce number of elements to get a more binary number */ + { + long essen; + + /* find number of essential items */ + essen = N - 1; + while (essen && table[essen] == def_key) + essen--; + essen++; + + N = most_binary (essen, N); + } + + for (n = 21; N % pow[n]; n--) + ; + digits = (n + 3) / 4; + for (i = 6; i; i--) + if (pow[i] * (tab_width + 1) < 80) + break; + per_row = pow[i]; +} + +static int +compare ( + const void *r, + const void *s +) +{ + int i; + for (i = 0; i < cmpcluster; i++) + if (((int *) r)[i] != ((int *) s)[i]) + return ((int *) r)[i] - ((int *) s)[i]; + return 0; +} + +static int lev, best_lev, p[22], best_p[22], nn; +static long c[22], best_c[22], s, best_s; +static long t[22], best_t[22], clusters[22], best_cluster[22]; + +static void +found ( + void +) +{ + int i; + + if (s < best_s) + { + best_s = s; + best_lev = lev; + for (i = 0; i <= lev; i++) + { + best_p[i] = p[i]; + best_c[i] = c[i]; + best_t[i] = t[i]; + best_cluster[i] = clusters[i]; + } + } +} + +static void +bt ( + int node_size +) +{ + long i, j, k, y, sbak; + long key_bytes; + + if (t[lev] == 1) + { + found (); + return; + } + if (lev == max_depth) + return; + + for (i = 1 - t[lev] % 2; i <= nn + (t[lev] >> nn) % 2; i++) + { + nn -= (p[lev] = i); + clusters[lev] = cluster = (i && nn >= 0) ? pow[i] : t[lev]; + cmpcluster = cluster + 1; + + t[lev + 1] = (t[lev] - 1) / cluster + 1; + for (j = 0; j < t[lev + 1]; j++) + { + memmove (temp + j * cmpcluster, tab[lev] + j * cluster, + cluster * sizeof (tab[lev][0])); + temp[j * cmpcluster + cluster] = j; + } + qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare); + for (j = 0; j < t[lev + 1]; j++) + { + perm[j] = temp[j * cmpcluster + cluster]; + temp[j * cmpcluster + cluster] = 0; + } + k = 1; + y = 0; + tab[lev + 1][perm[0]] = perm[0]; + for (j = 1; j < t[lev + 1]; j++) + { + if (compare (temp + y, temp + y + cmpcluster)) + { + k++; + tab[lev + 1][perm[j]] = perm[j]; + } + else + tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]]; + y += cmpcluster; + } + sbak = s; + s += k * node_size * cluster; + c[lev] = k; + + if (s >= best_s) + { + s = sbak; + nn += i; + return; + } + + key_bytes = k * cluster; + key_bytes = key_bytes < 0xff ? 1 : key_bytes < 0xffff ? 2 : 4; + lev++; + bt (key_bytes); + lev--; + + s = sbak; + nn += i; + } +} + +static void +solve ( + void +) +{ + best_lev = max_depth + 2; + best_s = N * a * 2; + lev = 0; + s = 0; + nn = n; + t[0] = N; + bt (a); +} + +static void +write_array ( + long max_key +) +{ + int i, j, k, y, ii, ofs; + const char *key_type; + + if (best_t[lev] == 1) + return; + + nn -= (i = best_p[lev]); + cluster = best_cluster[lev]; + cmpcluster = cluster + 1; + + t[lev + 1] = best_t[lev + 1]; + for (j = 0; j < t[lev + 1]; j++) + { + memmove (temp + j * cmpcluster, tab[lev] + j * cluster, + cluster * sizeof (tab[lev][0])); + temp[j * cmpcluster + cluster] = j; + } + qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare); + for (j = 0; j < t[lev + 1]; j++) + { + perm[j] = temp[j * cmpcluster + cluster]; + temp[j * cmpcluster + cluster] = 0; + } + k = 1; + y = 0; + tab[lev + 1][perm[0]] = x[0] = perm[0]; + for (j = 1; j < t[lev + 1]; j++) + { + if (compare (temp + y, temp + y + cmpcluster)) + { + x[k] = perm[j]; + tab[lev + 1][perm[j]] = x[k]; + k++; + } + else + tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]]; + y += cmpcluster; + } + + i = 0; + for (ii = 1; ii < k; ii++) + if (x[ii] < x[i]) + i = ii; + + key_type = !lev ? key_type_name : + max_key <= 0xff ? "PACKTAB_UINT8" : + max_key <= 0xffff ? "PACKTAB_UINT16" : "PACKTAB_UINT32"; + fprintf (f, "static const %s %sLev%d[%ld*%d] = {", key_type, table_name, + best_lev - lev - 1, cluster, k); + ofs = 0; + for (ii = 0; ii < k; ii++) + { + int kk, jj; + fprintf (f, "\n#define %sLev%d_%0*lX 0x%0X", table_name, + best_lev - lev - 1, digits, x[i] * pow[n - nn], ofs); + kk = x[i] * cluster; + if (!lev) + if (name) + for (j = 0; j < cluster; j++) + { + if (!(j % per_row) && j != cluster - 1) + fprintf (f, "\n "); + fprintf (f, "%*s,", tab_width, name[tab[lev][kk++]]); + } + else + for (j = 0; j < cluster; j++) + { + if (!(j % per_row) && j != cluster - 1) + fprintf (f, "\n "); + fprintf (f, "%*d,", tab_width, tab[lev][kk++]); + } + else + for (j = 0; j < cluster; j++, kk++) + fprintf (f, "\n %sLev%d_%0*lX, /* %0*lX..%0*lX */", table_name, + best_lev - lev, digits, + tab[lev][kk] * pow[n - nn - best_p[lev]], digits, + x[i] * pow[n - nn] + j * pow[n - nn - best_p[lev]], digits, + x[i] * pow[n - nn] + (j + 1) * pow[n - nn - best_p[lev]] - + 1); + ofs += cluster; + jj = i; + for (j = 0; j < k; j++) + if (x[j] > x[i] && (x[j] < x[jj] || jj == i)) + jj = j; + i = jj; + } + fprintf (f, "\n};\n\n"); + lev++; + write_array (cluster * k); + lev--; +} + +static void +write_source ( + void +) +{ + int i, j; + + lev = 0; + s = 0; + nn = n; + t[0] = N; + fprintf (f, "\n" "/* *IND" "ENT-OFF* */\n\n"); + write_array (0); + fprintf (f, "/* *IND" "ENT-ON* */\n\n"); + + fprintf (f, "#define %s(x) \\\n", macro_name); + fprintf (f, "\t((x) >= 0x%lx ? ", N); + if (name) + fprintf (f, "%s", name[def_key]); + else + fprintf (f, "%d", def_key); + fprintf (f, " : "); + j = 0; + for (i = best_lev - 1; i >= 0; i--) + { + fprintf (f, " \\\n\t%sLev%d[((x)", table_name, i); + if (j != 0) + fprintf (f, " >> %d", j); + if (i) + fprintf (f, " & 0x%02lx) +", pow[best_p[best_lev - 1 - i]] - 1); + j += best_p[best_lev - 1 - i]; + } + fprintf (f, ")"); + for (i = 0; i < best_lev; i++) + fprintf (f, "]"); + fprintf (f, ")\n\n"); +} + +static void +write_out ( + void +) +{ + int i; + fprintf (f, "/*\n" + " generated by packtab.c version %d\n\n" + " use %s(key) to access your table\n\n" + " assumed sizeof(%s): %d\n" + " required memory: %ld\n" + " lookups: %d\n" + " partition shape: %s", + packtab_version, macro_name, key_type_name, a, best_s, best_lev, + table_name); + for (i = best_lev - 1; i >= 0; i--) + fprintf (f, "[%ld]", best_cluster[i]); + fprintf (f, "\n" " different table entries:"); + for (i = best_lev - 1; i >= 0; i--) + fprintf (f, " %ld", best_c[i]); + fprintf (f, "\n*/\n"); + write_source (); +} + +int +pack_table ( + const signed int *base, + long key_num, + int key_size, + signed int default_key, + int p_max_depth, + int p_tab_width, + const char *const *p_name, + const char *p_key_type_name, + const char *p_table_name, + const char *p_macro_name, + FILE *out +) +{ + N = key_num; + a = key_size; + def_key = default_key; + max_depth = p_max_depth; + tab_width = p_tab_width; + name = p_name; + key_type_name = p_key_type_name; + table_name = p_table_name; + macro_name = p_macro_name; + f = out; + init (base); + if (!(tab = malloc ((n + 1) * sizeof (tab[0])))) + return 0; + memmove (tab[0], base, N * sizeof (base[0])); + solve (); + write_out (); + free (tab); + return 1; +} + +/* End of packtab.c */ diff --git a/glib/glib-mirroring-tab/packtab.h b/glib/glib-mirroring-tab/packtab.h new file mode 100644 index 0000000..7cab9be --- /dev/null +++ b/glib/glib-mirroring-tab/packtab.h @@ -0,0 +1,50 @@ +/* PackTab - Pack a static table + * Copyright (C) 2001 Behdad Esfahbod. + * + * 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, in a file named COPYING; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA + * + * For licensing issues, contact . + */ + +#ifndef PACKTAB_H +#define PACKTAB_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define packtab_version 3 + + int pack_table ( + const signed int *base, + long key_num, + int key_size, + signed int default_key, + int max_depth, + int tab_width, + const char *const *name, + const char *key_type_name, + const char *table_name, + const char *macro_name, + FILE *out + ); + +#ifdef __cplusplus +} +#endif + +#endif /* PACKTAB_H */ diff --git a/glib/glib-object.h b/glib/glib-object.h new file mode 100644 index 0000000..8687ef1 --- /dev/null +++ b/glib/glib-object.h @@ -0,0 +1,41 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998, 1999, 2000 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __GLIB_GOBJECT_H__ +#define __GLIB_GOBJECT_H__ + +#define __GLIB_GOBJECT_H_INSIDE__ + +/* topmost include file for GObject header files */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef __GLIB_GOBJECT_H_INSIDE__ + +#endif /* __GLIB_GOBJECT_H__ */ diff --git a/glib/glib.h b/glib/glib.h new file mode 100644 index 0000000..e07ec82 --- /dev/null +++ b/glib/glib.h @@ -0,0 +1,97 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_LIB_H__ +#define __G_LIB_H__ + +#define __GLIB_H_INSIDE__ + +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef G_PLATFORM_WIN32 +#include +#endif + +#undef __GLIB_H_INSIDE__ + +#endif /* __G_LIB_H__ */ diff --git a/glib/glib.py b/glib/glib.py new file mode 100644 index 0000000..0953aee --- /dev/null +++ b/glib/glib.py @@ -0,0 +1,252 @@ +import gdb + +# This is not quite right, as local vars may override symname +def read_global_var (symname): + return gdb.selected_frame().read_var(symname) + +def g_quark_to_string (quark): + if quark == None: + return None + quark = long(quark) + if quark == 0: + return None + val = read_global_var ("g_quarks") + max_q = long(read_global_var ("g_quark_seq_id")) + if quark < max_q: + return val[quark].string() + return None + +# We override the node printers too, so that node->next is not expanded +class GListNodePrinter: + "Prints a GList node" + + def __init__ (self, val): + self.val = val + + def to_string (self): + return "{data=%s, next=0x%x, prev=0x%x}" % (str(self.val["data"]), long(self.val["next"]), long(self.val["prev"])) + +class GSListNodePrinter: + "Prints a GSList node" + + def __init__ (self, val): + self.val = val + + def to_string (self): + return "{data=%s, next=0x%x}" % (str(self.val["data"]), long(self.val["next"])) + +class GListPrinter: + "Prints a GList" + + class _iterator: + def __init__(self, head, listtype): + self.link = head + self.listtype = listtype + self.count = 0 + + def __iter__(self): + return self + + def next(self): + if self.link == 0: + raise StopIteration + data = self.link['data'] + self.link = self.link['next'] + count = self.count + self.count = self.count + 1 + return ('[%d]' % count, data) + + def __init__ (self, val, listtype): + self.val = val + self.listtype = listtype + + def children(self): + return self._iterator(self.val, self.listtype) + + def to_string (self): + return "0x%x" % (long(self.val)) + + def display_hint (self): + return "array" + +class GHashPrinter: + "Prints a GHashTable" + + class _iterator: + def __init__(self, ht, keys_are_strings): + self.ht = ht + if ht != 0: + self.array = ht["nodes"] + self.size = ht["size"] + self.pos = 0 + self.keys_are_strings = keys_are_strings + self.value = None + + def __iter__(self): + return self + + def next(self): + if self.ht == 0: + raise StopIteration + if self.value != None: + v = self.value + self.value = None + return v + while long(self.pos) < long(self.size): + node = self.array[self.pos] + self.pos = self.pos + 1 + if long (node["key_hash"]) >= 2: + key = node["key"] + val = node["value"] + + if self.keys_are_strings: + key = key.cast (gdb.lookup_type("char").pointer()) + + # Queue value for next result + self.value = ('[%dv]'% (self.pos), val) + + # Return key + return ('[%dk]'% (self.pos), key) + raise StopIteration + + def __init__ (self, val): + self.val = val + self.keys_are_strings = False + try: + string_hash = read_global_var ("g_str_hash") + except: + try: + string_hash = read_global_var ("IA__g_str_hash") + except: + string_hash = None + if self.val != 0 and string_hash != None and self.val["hash_func"] == string_hash: + self.keys_are_strings = True + + def children(self): + return self._iterator(self.val, self.keys_are_strings) + + def to_string (self): + return "0x%x" % (long(self.val)) + + def display_hint (self): + return "map" + +def pretty_printer_lookup (val): + if is_g_type_instance (val): + return GTypePrettyPrinter (val) + +def pretty_printer_lookup (val): + # None yet, want things like hash table and list + + type = val.type.unqualified() + + # If it points to a reference, get the reference. + if type.code == gdb.TYPE_CODE_REF: + type = type.target () + + if type.code == gdb.TYPE_CODE_PTR: + type = type.target().unqualified() + t = str(type) + if t == "GList": + return GListPrinter(val, "GList") + if t == "GSList": + return GListPrinter(val, "GSList") + if t == "GHashTable": + return GHashPrinter(val) + else: + t = str(type) + if t == "GList": + return GListNodePrinter(val) + if t == "GSList *": + return GListPrinter(val, "GSList") + return None + +def register (obj): + if obj == None: + obj = gdb + + obj.pretty_printers.append(pretty_printer_lookup) + +class ForeachCommand (gdb.Command): + """Foreach on list""" + + def __init__ (self): + super (ForeachCommand, self).__init__ ("gforeach", + gdb.COMMAND_DATA, + gdb.COMPLETE_SYMBOL) + + def valid_name (self, name): + if not name[0].isalpha(): + return False + return True + + def parse_args (self, arg): + i = arg.find(" ") + if i <= 0: + raise Exception ("No var specified") + var = arg[:i] + if not self.valid_name(var): + raise Exception ("Invalid variable name") + + while i < len (arg) and arg[i].isspace(): + i = i + 1 + + if arg[i:i+2] != "in": + raise Exception ("Invalid syntax, missing in") + + i = i + 2 + + while i < len (arg) and arg[i].isspace(): + i = i + 1 + + colon = arg.find (":", i) + if colon == -1: + raise Exception ("Invalid syntax, missing colon") + + val = arg[i:colon] + + colon = colon + 1 + while colon < len (arg) and arg[colon].isspace(): + colon = colon + 1 + + command = arg[colon:] + + return (var, val, command) + + def do_iter(self, arg, item, command): + item = item.cast (gdb.lookup_type("void").pointer()) + item = long(item) + to_eval = "set $%s = (void *)0x%x\n"%(arg, item) + gdb.execute(to_eval) + gdb.execute(command) + + def slist_iterator (self, arg, container, command): + l = container.cast (gdb.lookup_type("GSList").pointer()) + while long(l) != 0: + self.do_iter (arg, l["data"], command) + l = l["next"] + + def list_iterator (self, arg, container, command): + l = container.cast (gdb.lookup_type("GList").pointer()) + while long(l) != 0: + self.do_iter (arg, l["data"], command) + l = l["next"] + + def pick_iterator (self, container): + t = container.type.unqualified() + if t.code == gdb.TYPE_CODE_PTR: + t = t.target().unqualified() + t = str(t) + if t == "GSList": + return self.slist_iterator + if t == "GList": + return self.list_iterator + raise Exception("Invalid container type %s"%(str(container.type))) + + def invoke (self, arg, from_tty): + (var, container, command) = self.parse_args(arg) + container = gdb.parse_and_eval (container) + func = self.pick_iterator(container) + func(var, container, command) + +ForeachCommand () diff --git a/glib/glib.rc.in b/glib/glib.rc.in new file mode 100644 index 0000000..60b3035 --- /dev/null +++ b/glib/glib.rc.in @@ -0,0 +1,30 @@ +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "The GLib developer community" + VALUE "FileDescription", "GLib" + VALUE "FileVersion", "@GLIB_VERSION@.0" + VALUE "InternalName", "libglib-2.0-@LT_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright © 1995-2010 Peter Mattis, Spencer Kimball, Josh MacDonald and others." + VALUE "OriginalFilename", "libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "GLib" + VALUE "ProductVersion", "@GLIB_VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END diff --git a/glib/glib.symbols b/glib/glib.symbols new file mode 100644 index 0000000..f9a0d8d --- /dev/null +++ b/glib/glib.symbols @@ -0,0 +1,1888 @@ +/* This file lists all exported symbols. It is used to generate + * the glib.def file used to control exports on Windows and the + * galias.h/galiasdef.c files used to avoid PLT entries for + * internal uses of exported functions (see makegalias.pl). + * + * Every symbol must be included in the right + * #ifdef IN_HEADER(sym) #endif and + * #ifdef IN_FILE(sym) #endif sections. + */ +#ifdef ALL_FILES +#define IN_FILE(x) 1 +#define IN_HEADER(x) 1 +#endif +#if IN_HEADER(__G_ARRAY_H__) +#if IN_FILE(__G_ARRAY_C__) +g_array_append_vals +g_array_free +g_array_insert_vals +g_array_new +g_array_ref +g_array_unref +g_array_get_element_size +g_array_prepend_vals +g_array_remove_index +g_array_remove_index_fast +g_array_remove_range +g_array_set_size +g_array_sized_new +g_array_sort +g_array_sort_with_data +g_byte_array_append +g_byte_array_free +g_byte_array_unref +g_byte_array_ref +g_byte_array_new +g_byte_array_prepend +g_byte_array_remove_index +g_byte_array_remove_index_fast +g_byte_array_remove_range +g_byte_array_set_size +g_byte_array_sized_new +g_byte_array_sort +g_byte_array_sort_with_data +g_ptr_array_add +g_ptr_array_foreach +g_ptr_array_free +g_ptr_array_unref +g_ptr_array_ref +g_ptr_array_new +g_ptr_array_new_with_free_func +g_ptr_array_set_free_func +g_ptr_array_remove +g_ptr_array_remove_fast +g_ptr_array_remove_index +g_ptr_array_remove_index_fast +g_ptr_array_remove_range +g_ptr_array_set_size +g_ptr_array_sized_new +g_ptr_array_sort +g_ptr_array_sort_with_data +#endif +#endif + +#if IN_HEADER(__G_ASYNCQUEUE_H__) +#if IN_FILE(__G_ASYNCQUEUE_C__) +g_async_queue_length +g_async_queue_length_unlocked +g_async_queue_lock +g_async_queue_new +g_async_queue_new_full +g_async_queue_pop +g_async_queue_pop_unlocked +g_async_queue_push +g_async_queue_push_unlocked +g_async_queue_push_sorted +g_async_queue_push_sorted_unlocked +g_async_queue_ref +g_async_queue_sort +g_async_queue_sort_unlocked +g_async_queue_timed_pop +g_async_queue_timed_pop_unlocked +g_async_queue_try_pop +g_async_queue_try_pop_unlocked +g_async_queue_unlock +g_async_queue_unref +#ifndef G_DISABLE_DEPRECATED +g_async_queue_ref_unlocked +g_async_queue_unref_and_unlock +#endif +#endif +#endif + +#if IN_HEADER(__G_ATOMIC_H__) +#if IN_FILE(__G_ATOMIC_C__) +g_atomic_int_add +g_atomic_int_compare_and_exchange +g_atomic_int_exchange_and_add +g_atomic_pointer_compare_and_exchange +#ifdef INCLUDE_INTERNAL_SYMBOLS + /* these are not internal, but we don't want to alias them */ +g_atomic_int_get +g_atomic_pointer_get +g_atomic_int_set +g_atomic_pointer_set +#endif +#endif +#endif + +#if IN_HEADER(__G_BACKTRACE_H__) +#if IN_FILE(__G_BACKTRACE_C__) +g_on_error_query +g_on_error_stack_trace +#endif +#endif + +#if IN_HEADER(__G_BASE64_H__) +#if IN_FILE(__G_BASE64_C__) +g_base64_encode_step +g_base64_encode_close +g_base64_encode G_GNUC_MALLOC +g_base64_decode_step +g_base64_decode G_GNUC_MALLOC +g_base64_decode_inplace +#endif +#endif + +#if IN_HEADER(__G_BOOKMARK_FILE_H__) +#if IN_FILE(__G_BOOKMARK_FILE_C__) +g_bookmark_file_error_quark +g_bookmark_file_new +g_bookmark_file_free +g_bookmark_file_load_from_file +g_bookmark_file_load_from_data +g_bookmark_file_load_from_data_dirs +g_bookmark_file_to_data +g_bookmark_file_to_file +g_bookmark_file_set_title +g_bookmark_file_get_title G_GNUC_MALLOC +g_bookmark_file_set_description +g_bookmark_file_get_description G_GNUC_MALLOC +g_bookmark_file_set_mime_type +g_bookmark_file_get_mime_type G_GNUC_MALLOC +g_bookmark_file_set_groups +g_bookmark_file_add_group +g_bookmark_file_has_group +g_bookmark_file_get_groups G_GNUC_MALLOC +g_bookmark_file_add_application +g_bookmark_file_has_application +g_bookmark_file_get_applications G_GNUC_MALLOC +g_bookmark_file_set_app_info +g_bookmark_file_get_app_info +g_bookmark_file_set_is_private +g_bookmark_file_get_is_private +g_bookmark_file_set_icon +g_bookmark_file_get_icon +g_bookmark_file_set_added +g_bookmark_file_get_added +g_bookmark_file_set_modified +g_bookmark_file_get_modified +g_bookmark_file_set_visited +g_bookmark_file_get_visited +g_bookmark_file_has_item +g_bookmark_file_get_size +g_bookmark_file_get_uris G_GNUC_MALLOC +g_bookmark_file_remove_group +g_bookmark_file_remove_application +g_bookmark_file_remove_item +g_bookmark_file_move_item +#endif +#endif + +#if IN_HEADER(__G_CACHE_H__) +#if IN_FILE(__G_CACHE_C__) +g_cache_destroy +g_cache_insert +g_cache_key_foreach +g_cache_new +g_cache_remove +#ifndef G_DISABLE_DEPRECATED +g_cache_value_foreach +#endif +#endif +#endif + +#if IN_HEADER(__G_CHECKSUM_H__) +#if IN_FILE(__G_CHECKSUM_C__) +g_checksum_type_get_length +g_checksum_new +g_checksum_copy +g_checksum_free +g_checksum_update +g_checksum_reset +g_checksum_get_string +g_checksum_get_digest +g_compute_checksum_for_data +g_compute_checksum_for_string +#endif +#endif + +#if IN_HEADER(__G_COMPLETION_H__) +#if IN_FILE(__G_COMPLETION_C__) +g_completion_add_items +g_completion_clear_items +g_completion_complete +g_completion_complete_utf8 +g_completion_free +g_completion_new +g_completion_remove_items +g_completion_set_compare +#endif +#endif + +#if IN_HEADER(__G_CONVERT_H__) +#if IN_FILE(__G_CONVERT_C__) +g_get_filename_charsets +g_convert G_GNUC_MALLOC +g_convert_error_quark +g_convert_with_fallback G_GNUC_MALLOC +g_convert_with_iconv G_GNUC_MALLOC +g_iconv +g_iconv_close +g_iconv_open +g_locale_from_utf8 G_GNUC_MALLOC +g_locale_to_utf8 G_GNUC_MALLOC +g_filename_display_name G_GNUC_MALLOC +g_filename_display_basename G_GNUC_MALLOC +#ifndef _WIN64 +g_filename_from_uri PRIVATE G_GNUC_MALLOC +g_filename_from_utf8 PRIVATE G_GNUC_MALLOC +g_filename_to_uri PRIVATE G_GNUC_MALLOC +g_filename_to_utf8 PRIVATE G_GNUC_MALLOC +#endif +#ifdef G_OS_WIN32 +g_filename_from_uri_utf8 G_GNUC_MALLOC +g_filename_from_utf8_utf8 +g_filename_to_uri_utf8 G_GNUC_MALLOC +g_filename_to_utf8_utf8 +#endif +g_uri_list_extract_uris G_GNUC_MALLOC +#endif +#endif + +#if IN_HEADER(__G_DATASET_H__) +#if IN_FILE(__G_DATASET_C__) +g_datalist_clear +g_datalist_foreach +g_datalist_get_flags +g_datalist_id_get_data +g_datalist_id_remove_no_notify +g_datalist_id_set_data_full +g_datalist_set_flags +g_datalist_unset_flags +g_datalist_init +g_dataset_destroy +g_dataset_foreach +g_dataset_id_get_data +g_dataset_id_remove_no_notify +g_dataset_id_set_data_full +#endif +#endif + +#if IN_HEADER(__G_QUARK_H__) +#if IN_FILE(__G_DATASET_C__) +g_quark_from_static_string +g_quark_from_string +g_quark_to_string G_GNUC_CONST +g_quark_try_string +g_intern_string +g_intern_static_string +#endif +#endif + +#if IN_HEADER(__G_DATE_H__) +#if IN_FILE(__G_DATE_C__) +g_date_add_days +g_date_add_months +g_date_add_years +g_date_clamp +g_date_clear +g_date_compare +g_date_days_between +g_date_free +g_date_get_day +g_date_get_day_of_year +g_date_get_days_in_month +g_date_get_iso8601_week_of_year +g_date_get_julian +g_date_get_monday_week_of_year +g_date_get_monday_weeks_in_year G_GNUC_CONST +g_date_get_month +g_date_get_sunday_week_of_year +g_date_get_sunday_weeks_in_year G_GNUC_CONST +g_date_get_weekday +g_date_get_year +g_date_is_first_of_month +g_date_is_last_of_month +g_date_is_leap_year G_GNUC_CONST +g_date_new +g_date_new_dmy +g_date_new_julian +g_date_order +g_date_set_day +g_date_set_dmy +g_date_set_julian +g_date_set_month +g_date_set_parse +#ifndef G_DISABLE_DEPRECATED +g_date_set_time +#endif +g_date_set_time_t +g_date_set_time_val +g_date_set_year +g_date_strftime +g_date_subtract_days +g_date_subtract_months +g_date_subtract_years +g_date_to_struct_tm +g_date_valid +g_date_valid_day G_GNUC_CONST +g_date_valid_dmy +g_date_valid_julian G_GNUC_CONST +g_date_valid_month G_GNUC_CONST +g_date_valid_weekday G_GNUC_CONST +g_date_valid_year G_GNUC_CONST +#endif +#endif + +#if IN_HEADER(__G_DIR_H__) +#if IN_FILE(__G_DIR_C__) +g_dir_close +#ifndef _WIN64 +g_dir_open PRIVATE +g_dir_read_name PRIVATE +#endif +#ifdef G_OS_WIN32 +g_dir_open_utf8 +g_dir_read_name_utf8 +#endif +g_dir_rewind +#endif +#endif + +#if IN_HEADER(__G_ERROR_H__) +#if IN_FILE(__G_ERROR_C__) +g_clear_error +g_error_copy +g_error_free +g_error_matches +g_error_new G_GNUC_PRINTF(3,4) +g_error_new_literal +g_error_new_valist +g_propagate_error +g_set_error G_GNUC_PRINTF(4,5) +g_set_error_literal +g_prefix_error G_GNUC_PRINTF(2,3) +g_propagate_prefixed_error G_GNUC_PRINTF(3,4) +#endif +#endif + +#if IN_HEADER(__G_FILEUTILS_H__) +#if IN_FILE(__G_FILEUTILS_C__) +g_build_filename G_GNUC_MALLOC G_GNUC_NULL_TERMINATED +g_build_filenamev G_GNUC_MALLOC +g_build_path G_GNUC_MALLOC G_GNUC_NULL_TERMINATED +g_build_pathv G_GNUC_MALLOC +g_file_error_from_errno +g_file_error_quark +#ifndef _WIN64 +g_file_get_contents PRIVATE +#endif +g_file_set_contents +#ifndef _WIN64 +g_file_open_tmp PRIVATE +g_file_test PRIVATE +#endif +g_file_read_link +g_format_size_for_display +#ifndef _WIN64 +g_mkstemp PRIVATE +#endif +g_mkstemp_full +g_mkdir_with_parents +#ifdef G_OS_WIN32 +g_file_get_contents_utf8 +g_file_open_tmp_utf8 +g_file_test_utf8 +g_mkstemp_utf8 +#endif +#endif +#endif + +#if IN_HEADER(__G_HASH_H__) +#if IN_FILE(__G_HASH_C__) +g_hash_table_destroy +g_hash_table_unref +g_hash_table_ref +g_hash_table_find +g_hash_table_foreach +g_hash_table_foreach_remove +g_hash_table_foreach_steal +g_hash_table_get_keys +g_hash_table_get_values +g_hash_table_insert +g_hash_table_lookup +g_hash_table_lookup_extended +g_hash_table_new +g_hash_table_new_full +g_hash_table_remove +g_hash_table_remove_all +g_hash_table_replace +g_hash_table_size +g_hash_table_steal +g_hash_table_steal_all +g_hash_table_iter_init +g_hash_table_iter_next +g_hash_table_iter_get_hash_table +g_hash_table_iter_remove +g_hash_table_iter_steal +#endif +#endif + +#if IN_HEADER(__G_HOOK_H__) +#if IN_FILE(__G_HOOK_C__) +g_hook_alloc +g_hook_compare_ids +g_hook_destroy +g_hook_destroy_link +g_hook_find +g_hook_find_data +g_hook_find_func +g_hook_find_func_data +g_hook_first_valid +g_hook_free +g_hook_get +g_hook_insert_before +g_hook_insert_sorted +g_hook_list_clear +g_hook_list_init +g_hook_list_invoke +g_hook_list_invoke_check +g_hook_list_marshal +g_hook_list_marshal_check +g_hook_next_valid +g_hook_prepend +g_hook_ref +g_hook_unref +#endif +#endif + +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IOCHANNEL_C__) +g_io_add_watch +g_io_add_watch_full +g_io_create_watch +g_io_channel_error_from_errno +g_io_channel_error_quark +g_io_channel_flush +g_io_channel_get_buffer_condition +g_io_channel_get_buffered +g_io_channel_get_buffer_size +g_io_channel_get_close_on_unref +g_io_channel_get_encoding +g_io_channel_get_flags +g_io_channel_get_line_term +g_io_channel_init +g_io_channel_read_chars +g_io_channel_read_line +g_io_channel_read_line_string +g_io_channel_read_to_end +g_io_channel_read_unichar +g_io_channel_ref +g_io_channel_seek_position +g_io_channel_set_buffered +g_io_channel_set_buffer_size +g_io_channel_set_close_on_unref +g_io_channel_set_encoding +g_io_channel_set_flags +g_io_channel_set_line_term +g_io_channel_shutdown +g_io_channel_unref +#ifndef G_DISABLE_DEPRECATED +g_io_channel_close +g_io_channel_read +g_io_channel_seek +g_io_channel_write +#endif +g_io_channel_write_chars +g_io_channel_write_unichar +#endif +#endif + +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IO_UNIX_C__) +#ifdef G_OS_UNIX +g_io_channel_unix_get_fd +g_io_channel_unix_new +g_io_channel_new_file PRIVATE +#endif +#endif +#endif + +#if IN_HEADER(__G_IOCHANNEL_H__) +#if IN_FILE(__G_IO_WIN32_C__) +#ifdef G_OS_WIN32 +g_io_channel_unix_get_fd +g_io_channel_unix_new +#ifndef _WIN64 +g_io_channel_new_file PRIVATE +#endif +g_io_channel_new_file_utf8 +g_io_channel_win32_get_fd +g_io_channel_win32_make_pollfd +g_io_channel_win32_new_fd +g_io_channel_win32_new_messages +g_io_channel_win32_new_socket +#ifndef _WIN64 +g_io_channel_win32_new_stream_socket PRIVATE +#endif +g_io_channel_win32_poll +g_io_channel_win32_set_debug +#endif +#endif +#endif + +#if IN_HEADER(__G_KEY_FILE_H__) +#if IN_FILE(__G_KEY_FILE_C__) +g_key_file_error_quark +g_key_file_free +g_key_file_get_boolean +g_key_file_get_boolean_list G_GNUC_MALLOC +g_key_file_get_comment G_GNUC_MALLOC +g_key_file_get_groups G_GNUC_MALLOC +g_key_file_get_double +g_key_file_get_double_list G_GNUC_MALLOC +g_key_file_get_integer +g_key_file_get_integer_list G_GNUC_MALLOC +g_key_file_get_keys G_GNUC_MALLOC +g_key_file_get_locale_string G_GNUC_MALLOC +g_key_file_get_locale_string_list G_GNUC_MALLOC +g_key_file_get_start_group G_GNUC_MALLOC +g_key_file_get_string G_GNUC_MALLOC +g_key_file_get_string_list G_GNUC_MALLOC +g_key_file_get_value G_GNUC_MALLOC +g_key_file_has_group +g_key_file_has_key +g_key_file_load_from_dirs +g_key_file_load_from_data +g_key_file_load_from_data_dirs +g_key_file_load_from_file +g_key_file_new +g_key_file_remove_comment +g_key_file_remove_group +g_key_file_remove_key +g_key_file_set_boolean +g_key_file_set_boolean_list +g_key_file_set_comment +g_key_file_set_double +g_key_file_set_double_list +g_key_file_set_integer +g_key_file_set_integer_list +g_key_file_set_list_separator +g_key_file_set_locale_string +g_key_file_set_locale_string_list +g_key_file_set_string +g_key_file_set_string_list +g_key_file_set_value +g_key_file_to_data G_GNUC_MALLOC +#endif +#endif + +#if IN_HEADER(__G_LIST_H__) +#if IN_FILE(__G_LIST_C__) +g_list_alloc +g_list_append +g_list_concat +g_list_copy +g_list_delete_link +g_list_find +g_list_find_custom +g_list_first +g_list_foreach +g_list_free +g_list_free_1 +g_list_index +g_list_insert +g_list_insert_before +g_list_insert_sorted +g_list_insert_sorted_with_data +g_list_last +g_list_length +g_list_nth +g_list_nth_data +g_list_nth_prev +#ifndef G_DISABLE_DEPRECATED +g_list_pop_allocator +#endif +g_list_position +g_list_prepend +#ifndef G_DISABLE_DEPRECATED +g_list_push_allocator +#endif +g_list_remove +g_list_remove_all +g_list_remove_link +g_list_reverse +g_list_sort +g_list_sort_with_data +#endif +#endif + +#if IN_HEADER(__G_MAIN_H__) +#if IN_FILE(__G_MAIN_C__) +g_child_watch_add +g_child_watch_add_full +g_child_watch_source_new +g_get_current_time +g_main_context_acquire +g_main_context_add_poll +g_main_context_check +g_main_context_default +g_main_context_dispatch +g_main_context_find_source_by_funcs_user_data +g_main_context_find_source_by_id +g_main_context_find_source_by_user_data +g_main_context_get_poll_func +g_main_context_get_thread_default +g_main_context_is_owner +g_main_context_iteration +g_main_context_new +g_main_context_pending +g_main_context_pop_thread_default +g_main_context_prepare +g_main_context_push_thread_default +g_main_context_query +g_main_context_ref +g_main_context_release +g_main_context_remove_poll +g_main_context_set_poll_func +g_main_context_unref +g_main_context_wait +g_main_context_wakeup +g_main_depth +g_main_current_source +g_main_loop_get_context +g_main_loop_is_running +g_main_loop_new +g_main_loop_quit +g_main_loop_ref +g_main_loop_run +g_main_loop_unref +g_source_add_poll +g_source_attach +g_source_destroy +g_source_get_can_recurse +g_source_get_context +g_source_get_current_time +g_source_get_id +g_source_get_priority +g_source_new +g_source_ref +g_source_remove +g_source_remove_by_funcs_user_data +g_source_remove_by_user_data +g_source_remove_poll +g_source_set_callback +g_source_set_callback_indirect +g_source_set_can_recurse +g_source_set_funcs +g_source_is_destroyed +g_source_set_priority +g_source_unref +g_idle_add +g_idle_add_full +g_idle_remove_by_data +g_idle_source_new +g_timeout_add +g_timeout_add_seconds +g_timeout_add_full +g_timeout_add_seconds_full +g_timeout_source_new +g_timeout_source_new_seconds +#endif +#endif + +#if IN_HEADER(__G_MAPPED_FILE_H__) +#if IN_FILE(__G_MAPPED_FILE_C__) +g_mapped_file_new G_GNUC_MALLOC +g_mapped_file_get_length +g_mapped_file_get_contents +g_mapped_file_ref +g_mapped_file_unref +#ifndef G_DISABLE_DEPRECATED +g_mapped_file_free +#endif +#endif +#endif + +#if IN_HEADER(__G_MARKUP_H__) +#if IN_FILE(__G_MARKUP_C__) +g_markup_error_quark +g_markup_escape_text +g_markup_parse_context_end_parse +g_markup_parse_context_free +g_markup_parse_context_get_element +g_markup_parse_context_get_element_stack +g_markup_parse_context_get_position +g_markup_parse_context_get_user_data +g_markup_parse_context_new +g_markup_parse_context_parse +g_markup_parse_context_push +g_markup_parse_context_pop +g_markup_printf_escaped G_GNUC_PRINTF(1,2) +g_markup_vprintf_escaped +g_markup_collect_attributes +#endif +#endif + +#if IN_HEADER(__G_MEM_H__) +#if IN_FILE(__G_MEM_C__) +g_free +g_malloc G_GNUC_MALLOC +g_malloc0 G_GNUC_MALLOC +g_malloc_n G_GNUC_MALLOC +g_malloc0_n G_GNUC_MALLOC +g_mem_is_system_malloc +g_mem_profile +g_mem_set_vtable +g_realloc +g_realloc_n +g_try_malloc G_GNUC_MALLOC +g_try_malloc0 G_GNUC_MALLOC +g_try_malloc_n G_GNUC_MALLOC +g_try_malloc0_n G_GNUC_MALLOC +g_try_realloc +g_try_realloc_n +#ifndef G_DISABLE_DEPRECATED +g_allocator_free +g_allocator_new +g_mem_chunk_alloc +g_mem_chunk_alloc0 +g_mem_chunk_clean +g_mem_chunk_destroy +g_mem_chunk_free +g_mem_chunk_info +g_mem_chunk_new +g_mem_chunk_print +g_mem_chunk_reset +g_blow_chunks +#endif +#endif +#endif + +#if IN_HEADER(__G_SLICE_H__) +#if IN_FILE(__G_SLICE_C__) +g_slice_alloc G_GNUC_MALLOC +g_slice_alloc0 G_GNUC_MALLOC +g_slice_copy G_GNUC_MALLOC +g_slice_free1 +g_slice_free_chain_with_offset +g_slice_set_config +g_slice_get_config +g_slice_get_config_state +#ifdef G_ENABLE_DEBUG +#ifdef INCLUDE_INTERNAL_SYMBOLS +g_slice_debug_tree_statistics +#endif +#endif +#endif +#endif + +#if IN_HEADER(__G_MESSAGES_H__) +#if IN_FILE(__G_MESSAGES_C__) +g_printf_string_upper_bound +g_log G_GNUC_PRINTF(3,4) +g_log_default_handler +g_log_remove_handler +g_log_set_always_fatal +g_log_set_default_handler +g_log_set_fatal_mask +g_log_set_handler +g_logv +g_return_if_fail_warning +g_warn_message +#ifndef G_DISABLE_DEPRECATED +g_assert_warning G_GNUC_NORETURN +#endif +g_print G_GNUC_PRINTF(1,2) +g_printerr G_GNUC_PRINTF(1,2) +g_set_printerr_handler +g_set_print_handler +#endif +#endif + +#if IN_HEADER(__G_NODE_H__) +#if IN_FILE(__G_NODE_C__) +g_node_child_index +g_node_child_position +g_node_children_foreach +g_node_copy +g_node_copy_deep +g_node_depth +g_node_destroy +g_node_find +g_node_find_child +g_node_first_sibling +g_node_get_root +g_node_insert +g_node_insert_after +g_node_insert_before +g_node_is_ancestor +g_node_last_child +g_node_last_sibling +g_node_max_height +g_node_n_children +g_node_new +g_node_n_nodes +g_node_nth_child +#ifndef G_DISABLE_DEPRECATED +g_node_pop_allocator +#endif +g_node_prepend +#ifndef G_DISABLE_DEPRECATED +g_node_push_allocator +#endif +g_node_reverse_children +g_node_traverse +g_node_unlink +#endif +#endif + +#if IN_HEADER(__G_OPTION_H__) +#if IN_FILE(__G_OPTION_C__) +g_option_context_add_group +g_option_context_add_main_entries +g_option_error_quark +g_option_context_free +g_option_context_get_description +g_option_context_get_help_enabled +g_option_context_get_ignore_unknown_options +g_option_context_get_main_group +g_option_context_get_summary +g_option_context_new +g_option_context_parse +g_option_context_set_description +g_option_context_set_help_enabled +g_option_context_set_ignore_unknown_options +g_option_context_set_main_group +g_option_context_set_summary +g_option_context_set_translate_func +g_option_context_set_translation_domain +g_option_context_get_help +g_option_group_add_entries +g_option_group_free +g_option_group_new +g_option_group_set_error_hook +g_option_group_set_parse_hooks +g_option_group_set_translate_func +g_option_group_set_translation_domain +#endif +#endif + +#if IN_HEADER(__G_PATTERN_H__) +#if IN_FILE(__G_PATTERN_C__) +g_pattern_match +g_pattern_match_simple +g_pattern_match_string +g_pattern_spec_equal +g_pattern_spec_free +g_pattern_spec_new +#endif +#endif + +#if IN_HEADER(__G_POLL_H__) +#if IN_FILE(__G_POLL_C__) +g_poll +#endif +#endif + +#if IN_HEADER(__G_PRIMES_H__) +#if IN_FILE(__G_PRIMES_C__) +g_spaced_primes_closest G_GNUC_CONST +#endif +#endif + +#if IN_HEADER(__G_PRINTF_H__) +#if IN_FILE(__G_PRINTF_C__) +g_fprintf G_GNUC_PRINTF(2,3) +g_printf G_GNUC_PRINTF(1,2) +g_sprintf G_GNUC_PRINTF(2,3) +g_vasprintf +g_vfprintf +g_vprintf +g_vsprintf +#endif +#endif + +#if IN_HEADER(__G_UTILS_H__) +#if IN_FILE(__G_PRINTF_C__) +g_snprintf G_GNUC_PRINTF(3,4) +g_vsnprintf +#endif +#endif + +#if IN_HEADER(__G_QSORT_H__) +#if IN_FILE(__G_QSORT_C__) +g_qsort_with_data +#endif +#endif + +#if IN_HEADER(__G_QUEUE_H__) +#if IN_FILE(__G_QUEUE_C__) +g_queue_clear +g_queue_copy +g_queue_delete_link +g_queue_find +g_queue_find_custom +g_queue_foreach +g_queue_free +g_queue_get_length +g_queue_index +g_queue_init +g_queue_insert_after +g_queue_insert_before +g_queue_insert_sorted +g_queue_is_empty +g_queue_link_index +g_queue_new +g_queue_peek_head +g_queue_peek_head_link +g_queue_peek_nth +g_queue_peek_nth_link +g_queue_peek_tail +g_queue_peek_tail_link +g_queue_pop_head +g_queue_pop_head_link +g_queue_pop_nth +g_queue_pop_nth_link +g_queue_pop_tail +g_queue_pop_tail_link +g_queue_push_head +g_queue_push_head_link +g_queue_push_nth +g_queue_push_nth_link +g_queue_push_tail +g_queue_push_tail_link +g_queue_remove +g_queue_remove_all +g_queue_reverse +g_queue_sort +g_queue_unlink +#endif +#endif + +#if IN_HEADER(__G_RAND_H__) +#if IN_FILE(__G_RAND_C__) +g_rand_copy +g_rand_double +g_rand_double_range +g_rand_free +g_rand_int +g_rand_int_range +g_rand_new +g_rand_new_with_seed +g_rand_new_with_seed_array +g_random_double +g_random_double_range +g_random_int +g_random_int_range +g_random_set_seed +g_rand_set_seed +g_rand_set_seed_array +#endif +#endif + +#if IN_HEADER(__G_REL_H__) +#if IN_FILE(__G_REL_C__) +g_relation_count +g_relation_delete +g_relation_destroy +g_relation_exists +g_relation_index +g_relation_insert +g_relation_new +g_relation_print +g_relation_select +g_tuples_destroy +g_tuples_index +#endif +#endif + +#if IN_HEADER(__G_SCANNER_H__) +#if IN_FILE(__G_SCANNER_C__) +g_scanner_cur_line +g_scanner_cur_position +g_scanner_cur_token +g_scanner_cur_value +g_scanner_destroy +g_scanner_eof +g_scanner_error G_GNUC_PRINTF(2,3) +g_scanner_get_next_token +g_scanner_input_file +g_scanner_input_text +g_scanner_lookup_symbol +g_scanner_new +g_scanner_peek_next_token +g_scanner_scope_add_symbol +g_scanner_scope_foreach_symbol +g_scanner_scope_lookup_symbol +g_scanner_scope_remove_symbol +g_scanner_set_scope +g_scanner_sync_file_offset +g_scanner_unexp_token +g_scanner_warn G_GNUC_PRINTF(2,3) +#endif +#endif + +#if IN_HEADER(__G_SEQUENCE_H__) +#if IN_FILE(__G_SEQUENCE_C__) +g_sequence_new +g_sequence_free +g_sequence_get_length +g_sequence_foreach +g_sequence_foreach_range +g_sequence_sort +g_sequence_sort_iter +g_sequence_get_begin_iter +g_sequence_get_end_iter +g_sequence_get_iter_at_pos +g_sequence_append +g_sequence_prepend +g_sequence_insert_before +g_sequence_move +g_sequence_swap +g_sequence_insert_sorted +g_sequence_insert_sorted_iter +g_sequence_sort_changed +g_sequence_sort_changed_iter +g_sequence_remove +g_sequence_remove_range +g_sequence_move_range +g_sequence_search +g_sequence_search_iter +g_sequence_get +g_sequence_set +g_sequence_iter_is_begin +g_sequence_iter_is_end +g_sequence_iter_next +g_sequence_iter_prev +g_sequence_iter_get_position +g_sequence_iter_move +g_sequence_iter_get_sequence +g_sequence_iter_compare +g_sequence_range_get_midpoint +#endif +#endif + +#if IN_HEADER(__G_SHELL_H__) +#if IN_FILE(__G_SHELL_C__) +g_shell_error_quark +g_shell_parse_argv +g_shell_quote +g_shell_unquote +#endif +#endif + +#if IN_HEADER(__G_SLIST_H__) +#if IN_FILE(__G_SLIST_C__) +g_slist_alloc +g_slist_append +g_slist_concat +g_slist_copy +g_slist_delete_link +g_slist_find +g_slist_find_custom +g_slist_foreach +g_slist_free +g_slist_free_1 +g_slist_index +g_slist_insert +g_slist_insert_before +g_slist_insert_sorted +g_slist_insert_sorted_with_data +g_slist_last +g_slist_length +g_slist_nth +g_slist_nth_data +#ifndef G_DISABLE_DEPRECATED +g_slist_pop_allocator +#endif +g_slist_position +g_slist_prepend +#ifndef G_DISABLE_DEPRECATED +g_slist_push_allocator +#endif +g_slist_remove +g_slist_remove_all +g_slist_remove_link +g_slist_reverse +g_slist_sort +g_slist_sort_with_data +#endif +#endif + +#if IN_HEADER(__G_SPAWN_H__) +#if IN_FILE(__G_SPAWN_C__) +#ifndef _WIN64 +g_spawn_async PRIVATE +g_spawn_async_with_pipes PRIVATE +#endif +g_spawn_close_pid +#ifndef _WIN64 +g_spawn_command_line_async PRIVATE +g_spawn_command_line_sync PRIVATE +#endif +g_spawn_error_quark +#ifndef _WIN64 +g_spawn_sync PRIVATE +#endif +#ifdef G_OS_WIN32 +g_spawn_async_utf8 +g_spawn_async_with_pipes_utf8 +g_spawn_command_line_async_utf8 +g_spawn_command_line_sync_utf8 +g_spawn_sync_utf8 +#endif +#endif +#endif + +#if IN_HEADER(__G_STDIO_H__) +#if IN_FILE(__G_STDIO_C__) +#if !defined(G_OS_UNIX) || defined(G_STDIO_NO_WRAP_ON_UNIX) +/* gstdio wrappers */ +g_chmod +g_open +g_creat +g_rename +g_mkdir +g_stat +g_lstat +g_remove +g_fopen +g_freopen +g_utime +#endif +g_access +g_chdir +g_unlink +g_rmdir +#endif +#endif + +#if IN_HEADER(__G_STRFUNCS_H__) +#if IN_FILE(__G_STRFUNCS_C__) +g_ascii_digit_value G_GNUC_CONST +g_ascii_dtostr +g_ascii_formatd +g_ascii_strdown G_GNUC_MALLOC +g_ascii_strtod +g_ascii_strtoull +g_ascii_strtoll +g_ascii_strup G_GNUC_MALLOC +g_ascii_tolower G_GNUC_CONST +g_ascii_toupper G_GNUC_CONST +g_ascii_xdigit_value G_GNUC_CONST +g_ascii_strcasecmp +g_ascii_strncasecmp +g_memdup G_GNUC_MALLOC +g_stpcpy +g_strcanon +g_strchomp +g_strchug +g_strcompress G_GNUC_MALLOC +g_strconcat G_GNUC_MALLOC G_GNUC_NULL_TERMINATED +g_strdelimit +g_strdup G_GNUC_MALLOC +g_strdup_printf G_GNUC_PRINTF(1,2) G_GNUC_MALLOC +g_strdupv G_GNUC_MALLOC +g_strdup_vprintf G_GNUC_MALLOC +g_strerror G_GNUC_CONST +g_strescape G_GNUC_MALLOC +g_strfreev +g_str_has_prefix +g_str_has_suffix +g_strjoin G_GNUC_MALLOC G_GNUC_NULL_TERMINATED +g_strjoinv G_GNUC_MALLOC +g_strlcat +g_strlcpy +g_strndup G_GNUC_MALLOC +g_strnfill G_GNUC_MALLOC +g_strreverse +g_strrstr +g_strrstr_len +g_strsignal G_GNUC_CONST +g_strsplit G_GNUC_MALLOC +g_strsplit_set G_GNUC_MALLOC +g_strstr_len +g_strtod +#ifndef G_DISABLE_DEPRECATED +g_strcasecmp +g_strncasecmp +g_strup +g_strdown +#endif +g_strv_length +g_strip_context G_GNUC_FORMAT(1) +g_dgettext G_GNUC_FORMAT(2) +g_dngettext G_GNUC_FORMAT(3) +g_dpgettext G_GNUC_FORMAT(2) +g_dpgettext2 G_GNUC_FORMAT(3) +#endif +#endif + +#if IN_HEADER(__G_URI_FUNCS_H__) +#if IN_FILE(__G_URI_FUNCS_C__) +g_uri_unescape_string +g_uri_unescape_segment +g_uri_parse_scheme +g_uri_escape_string +#endif +#endif + +#if IN_HEADER(__G_STRING_H__) +#if IN_FILE(__G_STRING_C__) +g_string_append +g_string_append_len +g_string_append_printf G_GNUC_PRINTF(2,3) +g_string_append_unichar +g_string_append_vprintf +g_string_ascii_down +g_string_ascii_up +g_string_assign +g_string_chunk_free +g_string_chunk_clear +g_string_chunk_insert +g_string_chunk_insert_const +g_string_chunk_insert_len +g_string_chunk_new +g_string_equal +g_string_erase +g_string_free +g_string_hash +g_string_insert +g_string_insert_c +g_string_insert_len +g_string_insert_unichar +g_string_new +g_string_new_len +g_string_overwrite +g_string_overwrite_len +g_string_prepend +g_string_prepend_c +g_string_prepend_len +g_string_prepend_unichar +g_string_printf G_GNUC_PRINTF(2,3) +g_string_set_size +g_string_sized_new +g_string_truncate +g_string_append_uri_escaped +#ifndef G_DISABLE_DEPRECATED +g_string_down +g_string_up +#endif +g_string_vprintf +#ifdef INCLUDE_INTERNAL_SYMBOLS + /* these are not internal, but we don't want to alias them */ +g_string_append_c +#endif +#endif +#endif + +#if IN_HEADER(__G_BITLOCK_H__) +#if IN_FILE(__G_BITLOCK_C__) +g_bit_lock +g_bit_trylock +g_bit_unlock +#endif +#endif + +#if IN_HEADER(__G_THREAD_H__) +#if IN_FILE(__G_THREAD_C__) +g_once_impl +g_once_init_enter_impl +g_once_init_leave +#ifdef INCLUDE_INTERNAL_SYMBOLS +g_thread_init_glib +g_once_init_enter +#endif +#ifdef INCLUDE_VARIABLES +g_thread_functions_for_glib_use +g_threads_got_initialized +g_thread_use_default_impl +g_thread_gettime +#endif +g_thread_create_full +g_thread_error_quark +g_thread_exit +g_thread_join +g_thread_self +g_thread_set_priority +g_static_mutex_free +g_static_mutex_get_mutex_impl +g_static_mutex_init +g_static_private_free +g_static_private_get +g_static_private_init +g_static_private_set +g_static_rec_mutex_free +g_static_rec_mutex_init +g_static_rec_mutex_lock +g_static_rec_mutex_lock_full +g_static_rec_mutex_trylock +g_static_rec_mutex_unlock +g_static_rec_mutex_unlock_full +g_static_rw_lock_free +g_static_rw_lock_init +g_static_rw_lock_reader_lock +g_static_rw_lock_reader_trylock +g_static_rw_lock_reader_unlock +g_static_rw_lock_writer_lock +g_static_rw_lock_writer_trylock +g_static_rw_lock_writer_unlock +g_thread_foreach +g_thread_get_initialized +#endif +#endif + +#if IN_HEADER(__G_THREADPOOL_H__) +#if IN_FILE(__G_THREADPOOL_C__) +g_thread_pool_free +g_thread_pool_get_max_threads +g_thread_pool_get_max_unused_threads +g_thread_pool_get_max_idle_time +g_thread_pool_get_num_threads +g_thread_pool_get_num_unused_threads +g_thread_pool_new +g_thread_pool_push +g_thread_pool_set_max_threads +g_thread_pool_set_max_unused_threads +g_thread_pool_set_max_idle_time +g_thread_pool_stop_unused_threads +g_thread_pool_unprocessed +g_thread_pool_set_sort_function +#endif +#endif + +#if IN_HEADER(__G_TEST_UTILS_H__) +#if IN_FILE(__G_MESSAGES_C__) +g_test_log_set_fatal_handler +#endif +#if IN_FILE(__G_TEST_UTILS_C__) +g_assertion_message G_GNUC_NORETURN +g_assertion_message_cmpnum G_GNUC_NORETURN +g_assertion_message_cmpstr G_GNUC_NORETURN +g_assertion_message_expr G_GNUC_NORETURN +g_assertion_message_error G_GNUC_NORETURN +g_strcmp0 +g_test_add_data_func +g_test_add_func +g_test_add_vtable +g_test_bug +g_test_bug_base +#ifdef INCLUDE_VARIABLES +g_test_config_vars +#endif +g_test_create_case +g_test_create_suite +g_test_get_root +g_test_init +g_test_log_buffer_free +g_test_log_buffer_new +g_test_log_buffer_pop +g_test_log_buffer_push +g_test_log_msg_free +g_test_log_type_name +g_test_maximized_result +g_test_message +g_test_minimized_result +g_test_queue_destroy +g_test_queue_free +g_test_rand_double +g_test_rand_double_range +g_test_rand_int +g_test_rand_int_range +g_test_run +g_test_run_suite +g_test_suite_add +g_test_suite_add_suite +g_test_timer_elapsed +g_test_timer_last +g_test_timer_start +g_test_trap_assertions +g_test_trap_fork +g_test_trap_has_passed +g_test_trap_reached_timeout +#endif +#endif + +#if IN_HEADER(__G_TIMER_H__) +#if IN_FILE(__G_TIMER_C__) +g_timer_continue +g_timer_destroy +g_timer_elapsed +g_timer_new +g_timer_reset +g_timer_start +g_timer_stop +g_time_val_add +g_time_val_from_iso8601 +g_time_val_to_iso8601 G_GNUC_MALLOC +g_usleep +#endif +#endif + +#if IN_HEADER(__G_TREE_H__) +#if IN_FILE(__G_TREE_C__) +g_tree_destroy +g_tree_foreach +g_tree_height +g_tree_insert +g_tree_lookup +g_tree_lookup_extended +g_tree_new +g_tree_ref +g_tree_unref +g_tree_new_full +g_tree_new_with_data +g_tree_nnodes +g_tree_remove +g_tree_replace +g_tree_search +g_tree_steal +#ifndef G_DISABLE_DEPRECATED +g_tree_traverse +#endif +#endif +#endif + +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIBREAK_C__) +g_unichar_break_type G_GNUC_CONST +#endif +#endif + +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNICOLLATE_C__) +g_utf8_collate +g_utf8_collate_key G_GNUC_MALLOC +g_utf8_collate_key_for_filename G_GNUC_MALLOC +#endif +#endif + +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIDECOMP_C__) +g_unicode_canonical_decomposition G_GNUC_MALLOC +g_unicode_canonical_ordering +g_unichar_combining_class G_GNUC_CONST +g_utf8_normalize +#endif +#endif + +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UNIPROP_C__) +g_unichar_isalnum G_GNUC_CONST +g_unichar_isalpha G_GNUC_CONST +g_unichar_iscntrl G_GNUC_CONST +g_unichar_isdefined G_GNUC_CONST +g_unichar_isdigit G_GNUC_CONST +g_unichar_isgraph G_GNUC_CONST +g_unichar_islower G_GNUC_CONST +g_unichar_isprint G_GNUC_CONST +g_unichar_ispunct G_GNUC_CONST +g_unichar_isspace G_GNUC_CONST +g_unichar_istitle G_GNUC_CONST +g_unichar_isupper G_GNUC_CONST +g_unichar_iswide G_GNUC_CONST +g_unichar_iswide_cjk G_GNUC_CONST +g_unichar_isxdigit G_GNUC_CONST +g_unichar_iszerowidth G_GNUC_CONST +g_unichar_tolower G_GNUC_CONST +g_unichar_totitle G_GNUC_CONST +g_unichar_toupper G_GNUC_CONST +g_unichar_ismark G_GNUC_CONST +g_unichar_get_mirror_char +g_unichar_get_script +g_unichar_digit_value G_GNUC_CONST +g_unichar_xdigit_value G_GNUC_CONST +g_unichar_type G_GNUC_CONST +g_utf8_casefold G_GNUC_MALLOC +g_utf8_strup G_GNUC_MALLOC +g_utf8_strdown G_GNUC_MALLOC +#endif +#endif + +#if IN_HEADER(__G_UNICODE_H__) +#if IN_FILE(__G_UTF8_C__) +g_get_charset +g_ucs4_to_utf16 G_GNUC_MALLOC +g_ucs4_to_utf8 G_GNUC_MALLOC +g_utf16_to_ucs4 G_GNUC_MALLOC +g_utf16_to_utf8 G_GNUC_MALLOC +g_utf8_find_next_char +g_utf8_find_prev_char +g_utf8_get_char +g_utf8_get_char_validated +g_utf8_offset_to_pointer +g_utf8_pointer_to_offset +g_utf8_prev_char +g_utf8_strchr +g_utf8_strlen +g_utf8_strncpy +g_utf8_strrchr +g_utf8_strreverse +g_utf8_to_ucs4 G_GNUC_MALLOC +g_utf8_to_ucs4_fast G_GNUC_MALLOC +g_utf8_to_utf16 G_GNUC_MALLOC +g_utf8_validate +g_unichar_to_utf8 +g_unichar_validate +#endif +#endif + +#if IN_HEADER(__GLIBINTL_H__) +#if IN_FILE(__G_UTILS_C__) +glib_gettext G_GNUC_FORMAT(1) +#endif +#endif + +#if IN_HEADER(__G_HASH_H__) +#if IN_FILE(__G_UTILS_C__) +g_int_equal +g_int_hash +g_int64_equal +g_int64_hash +g_double_equal +g_double_hash +g_direct_equal G_GNUC_CONST +g_direct_hash G_GNUC_CONST +#endif +#if IN_FILE(__G_STRING_C__) +g_str_equal +g_str_hash +#endif +#endif + +#if IN_HEADER(__G_UTILS_H__) +#if IN_FILE(__G_UTILS_C__) +g_atexit +#ifndef G_DISABLE_DEPRECATED +g_basename +#endif +g_get_application_name +#ifndef _WIN64 +g_find_program_in_path PRIVATE +g_get_current_dir PRIVATE +g_getenv PRIVATE +g_unsetenv PRIVATE +g_get_home_dir PRIVATE +#endif +g_get_host_name +#ifndef _WIN64 +g_setenv PRIVATE +#endif +g_listenv +#ifdef G_OS_WIN32 +g_find_program_in_path_utf8 +g_get_current_dir_utf8 +g_getenv_utf8 +g_unsetenv_utf8 +g_setenv_utf8 +g_get_home_dir_utf8 +#endif +g_get_language_names +g_get_prgname +#ifndef _WIN64 +g_get_real_name PRIVATE +#endif +#ifdef G_OS_WIN32 +g_get_real_name_utf8 +#endif +g_get_system_config_dirs +g_get_system_data_dirs +#ifdef G_OS_WIN32 +g_win32_get_system_data_dirs_for_module +#endif +#ifndef _WIN64 +g_get_tmp_dir PRIVATE +#endif +#ifdef G_OS_WIN32 +g_get_tmp_dir_utf8 +#endif +g_get_user_cache_dir +g_get_user_config_dir +g_get_user_data_dir +g_reload_user_special_dirs_cache +g_get_user_special_dir +#ifndef _WIN64 +g_get_user_name PRIVATE +#endif +#ifdef G_OS_WIN32 +g_get_user_name_utf8 +#endif +glib_check_version +g_nullify_pointer +g_parse_debug_string +g_path_get_basename G_GNUC_MALLOC +g_path_get_dirname G_GNUC_MALLOC +g_path_is_absolute +g_path_skip_root +g_set_application_name +g_set_prgname +#ifdef INCLUDE_INTERNAL_SYMBOLS +g_bit_nth_lsf +g_bit_nth_msf +g_bit_storage +g_trash_stack_height +g_trash_stack_peek +g_trash_stack_pop +g_trash_stack_push +g_get_codeset +#endif +#endif +#endif + +#if IN_HEADER(__G_REGEX_H__) +#if IN_FILE(__G_REGEX_C__) +g_regex_error_quark +g_regex_new +g_regex_ref +g_regex_unref +g_regex_get_pattern +g_regex_get_max_backref +g_regex_get_capture_count +g_regex_get_string_number +g_regex_escape_string +g_regex_match_simple +g_regex_match +g_regex_match_full +g_regex_match_all +g_regex_match_all_full +g_regex_split_simple +g_regex_split +g_regex_split_full +g_regex_replace +g_regex_replace_literal +g_regex_replace_eval +g_regex_check_replacement +g_match_info_get_regex +g_match_info_get_string +g_match_info_free +g_match_info_next +g_match_info_matches +g_match_info_get_match_count +g_match_info_is_partial_match +g_match_info_expand_references +g_match_info_fetch +g_match_info_fetch_pos +g_match_info_fetch_named +g_match_info_fetch_named_pos +g_match_info_fetch_all +#endif +#endif + +#if IN_HEADER(__G_VARIANT_TYPE_H__) +#if IN_FILE(__G_VARIANT_TYPE_C__) +g_variant_type_string_is_valid +g_variant_type_string_scan +g_variant_type_free +g_variant_type_copy +g_variant_type_new +g_variant_type_get_string_length +g_variant_type_peek_string +g_variant_type_dup_string +g_variant_type_is_definite +g_variant_type_is_container +g_variant_type_is_basic +g_variant_type_is_maybe +g_variant_type_is_array +g_variant_type_is_tuple +g_variant_type_is_dict_entry +g_variant_type_is_variant +g_variant_type_hash +g_variant_type_equal +g_variant_type_is_subtype_of +g_variant_type_element +g_variant_type_first +g_variant_type_next +g_variant_type_n_items +g_variant_type_key +g_variant_type_value +g_variant_type_new_array +g_variant_type_new_maybe +g_variant_type_new_tuple +g_variant_type_new_dict_entry +g_variant_type_checked_ +#endif +#endif + +#if IN_HEADER(__G_VARIANT_H__) +#if IN_FILE(__G_VARIANT_CORE_C__) +g_variant_unref +g_variant_ref +g_variant_ref_sink +g_variant_n_children +g_variant_get_child_value +g_variant_get_size +g_variant_get_data +g_variant_store +g_variant_is_normal_form +#endif + +#if IN_FILE(__G_VARIANT_C__) +g_variant_get_type +g_variant_get_type_string +g_variant_is_of_type +g_variant_is_container +g_variant_classify + +g_variant_new_boolean +g_variant_new_byte +g_variant_new_int16 +g_variant_new_uint16 +g_variant_new_int32 +g_variant_new_uint32 +g_variant_new_int64 +g_variant_new_uint64 +g_variant_new_handle +g_variant_new_double +g_variant_new_string +g_variant_new_object_path +g_variant_is_object_path +g_variant_new_signature +g_variant_is_signature +g_variant_new_variant +g_variant_new_strv + +g_variant_get_boolean +g_variant_get_byte +g_variant_get_int16 +g_variant_get_uint16 +g_variant_get_int32 +g_variant_get_uint32 +g_variant_get_int64 +g_variant_get_uint64 +g_variant_get_handle +g_variant_get_double +g_variant_get_string +g_variant_dup_string +g_variant_get_variant +g_variant_get_strv +g_variant_dup_strv + +g_variant_new_maybe +g_variant_new_array +g_variant_new_tuple +g_variant_new_dict_entry + +g_variant_get_maybe +g_variant_get_fixed_array + +g_variant_print +g_variant_print_string + +g_variant_hash +g_variant_equal + +g_variant_iter_copy +g_variant_iter_free +g_variant_iter_init +g_variant_iter_n_children +g_variant_iter_new +g_variant_iter_next_value + +g_variant_builder_add_value +g_variant_builder_init +g_variant_builder_clear +g_variant_builder_open +g_variant_builder_close +g_variant_builder_end +g_variant_builder_new +g_variant_builder_unref +g_variant_builder_ref + +g_variant_new_va +g_variant_get_va +g_variant_new +g_variant_get + +g_variant_builder_add +g_variant_get_child +g_variant_iter_next +g_variant_iter_loop + +g_variant_new_from_data +g_variant_get_normal_form +g_variant_byteswap +#endif + +#if IN_FILE(__G_VARIANT_PARSER_C__) +g_variant_new_parsed +g_variant_new_parsed_va +g_variant_parse +g_variant_parser_get_error_quark +#endif +#endif + +#if IN_HEADER(__G_VARIANT_TYPE_INFO_H__) +#if IN_FILE(__G_VARIANT_TYPE_INFO_C__) +g_variant_type_info_get_type_string +g_variant_type_info_query +g_variant_type_info_element +g_variant_type_info_query_element +g_variant_type_info_n_members +g_variant_type_info_member_info +g_variant_type_info_get +g_variant_type_info_ref +g_variant_type_info_unref +g_variant_type_info_assert_no_infos +#endif +#endif + +#if IN_HEADER(__G_VARIANT_SERIALISER_H__) +#if IN_FILE(__G_VARIANT_SERIALISER_C__) +g_variant_serialised_byteswap +g_variant_serialised_get_child +g_variant_serialised_is_normal +g_variant_serialised_n_children +g_variant_serialiser_is_object_path +g_variant_serialiser_is_signature +g_variant_serialiser_is_string +g_variant_serialiser_needed_size +g_variant_serialiser_serialise +#endif +#endif + +#if IN_HEADER(__G_VARIANT_INTERNAL_H__) +#if IN_FILE(__G_VARIANT_C__) +g_variant_format_string_scan_type +g_variant_format_string_scan +#endif +#endif + +#if IN_HEADER(__G_WIN32_H__) +#if IN_FILE(__G_WIN32_H__) +#ifdef G_OS_WIN32 +g_win32_error_message +g_win32_ftruncate +g_win32_get_package_installation_directory_of_module +#ifndef _WIN64 +g_win32_get_package_installation_directory PRIVATE +#endif +g_win32_get_package_installation_directory_utf8 +#ifndef _WIN64 +g_win32_get_package_installation_subdirectory PRIVATE +#endif +g_win32_get_package_installation_subdirectory_utf8 +g_win32_get_windows_version +g_win32_getlocale +g_win32_locale_filename_from_utf8 +#endif +#endif +#endif + +#if IN_HEADER(__G_HOST_UTILS_H__) +#if IN_FILE(__G_HOST_UTILS_C__) +g_hostname_is_non_ascii +g_hostname_is_ascii_encoded +g_hostname_is_ip_address +g_hostname_to_ascii +g_hostname_to_unicode +#endif +#endif + +#ifdef INCLUDE_VARIABLES +g_ascii_table +g_utf8_skip +g_idle_funcs +g_timeout_funcs +g_io_watch_funcs +g_child_watch_funcs +glib_binary_age +glib_interface_age +glib_major_version +glib_mem_profiler_table +glib_micro_version +glib_minor_version +glib_on_error_halt +g_mem_gc_friendly +#endif diff --git a/glib/glibintl.h b/glib/glibintl.h new file mode 100644 index 0000000..47a7910 --- /dev/null +++ b/glib/glibintl.h @@ -0,0 +1,38 @@ +#ifndef __GLIBINTL_H__ +#define __GLIBINTL_H__ + +#ifndef SIZEOF_CHAR +#error "config.h must be included prior to glibintl.h" +#endif + +G_CONST_RETURN gchar *glib_gettext (const gchar *str) G_GNUC_FORMAT(1); + +#ifdef ENABLE_NLS + +#include +#define _(String) glib_gettext(String) +/* Split out this in the code, but keep it in the same domain for now */ +#define P_(String) glib_gettext(String) + +#ifdef gettext_noop +#define N_(String) gettext_noop(String) +#else +#define N_(String) (String) +#endif +#else /* NLS is disabled */ +#define _(String) (String) +#define N_(String) (String) +#define P_(String) (String) +#define textdomain(String) ((String) ? (String) : "messages") +#define gettext(String) (String) +#define dgettext(Domain,String) (String) +#define dcgettext(Domain,String,Type) (String) +#define dngettext(Domain,String1,String2,N) ((N) == 1 ? (String1) : (String2)) +#define bindtextdomain(Domain,Directory) (Domain) +#define bind_textdomain_codeset(Domain,Codeset) +#endif + +/* not really I18N-related, but also a string marker macro */ +#define I_(string) g_intern_static_string (string) + +#endif /* __GLIBINTL_H__ */ diff --git a/glib/glist.c b/glib/glist.c new file mode 100644 index 0000000..252330a --- /dev/null +++ b/glib/glist.c @@ -0,0 +1,1153 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: linked_lists_double + * @title: Doubly-Linked Lists + * @short_description: linked lists containing integer values or + * pointers to data, with the ability to iterate + * over the list in both directions + * + * The #GList structure and its associated functions provide a standard + * doubly-linked list data structure. + * + * Each element in the list contains a piece of data, together with + * pointers which link to the previous and next elements in the list. + * Using these pointers it is possible to move through the list in both + * directions (unlike the Singly-Linked Lists which + * only allows movement through the list in the forward direction). + * + * The data contained in each element can be either integer values, by + * using one of the Type + * Conversion Macros, or simply pointers to any type of data. + * + * List elements are allocated from the slice allocator, which is more + * efficient than allocating elements individually. + * + * Note that most of the #GList functions expect to be passed a pointer + * to the first element in the list. The functions which insert + * elements return the new start of the list, which may have changed. + * + * There is no function to create a #GList. %NULL is considered to be + * the empty list so you simply set a #GList* to %NULL. + * + * To add elements, use g_list_append(), g_list_prepend(), + * g_list_insert() and g_list_insert_sorted(). + * + * To remove elements, use g_list_remove(). + * + * To find elements in the list use g_list_first(), g_list_last(), + * g_list_next(), g_list_previous(), g_list_nth(), g_list_nth_data(), + * g_list_find() and g_list_find_custom(). + * + * To find the index of an element use g_list_position() and + * g_list_index(). + * + * To call a function for each element in the list use g_list_foreach(). + * + * To free the entire list, use g_list_free(). + **/ + +/** + * GList: + * @data: holds the element's data, which can be a pointer to any kind + * of data, or any integer value using the Type Conversion + * Macros. + * @next: contains the link to the next element in the list. + * @prev: contains the link to the previous element in the list. + * + * The #GList struct is used for each element in a doubly-linked list. + **/ + +/** + * g_list_previous: + * @list: an element in a #GList. + * @Returns: the previous element, or %NULL if there are no previous + * elements. + * + * A convenience macro to get the previous element in a #GList. + **/ + +/** + * g_list_next: + * @list: an element in a #GList. + * @Returns: the next element, or %NULL if there are no more elements. + * + * A convenience macro to get the next element in a #GList. + **/ + + + +/** + * g_list_push_allocator: + * @allocator: the #GAllocator to use when allocating #GList elements. + * + * Sets the allocator to use to allocate #GList elements. Use + * g_list_pop_allocator() to restore the previous allocator. + * + * Note that this function is not available if GLib has been compiled + * with + * + * Deprecated:2.10: It does nothing, since #GList has been converted + * to the slice + * allocator + **/ +void g_list_push_allocator (gpointer dummy) { /* present for binary compat only */ } + +/** + * g_list_pop_allocator: + * + * Restores the previous #GAllocator, used when allocating #GList + * elements. + * + * Note that this function is not available if GLib has been compiled + * with + * + * Deprecated:2.10: It does nothing, since #GList has been converted + * to the slice + * allocator + **/ +void g_list_pop_allocator (void) { /* present for binary compat only */ } + +#define _g_list_alloc() g_slice_new (GList) +#define _g_list_alloc0() g_slice_new0 (GList) +#define _g_list_free1(list) g_slice_free (GList, list) + +/** + * g_list_alloc: + * @Returns: a pointer to the newly-allocated #GList element. + * + * Allocates space for one #GList element. It is called by + * g_list_append(), g_list_prepend(), g_list_insert() and + * g_list_insert_sorted() and so is rarely used on its own. + **/ +GList* +g_list_alloc (void) +{ + return _g_list_alloc0 (); +} + +/** + * g_list_free: + * @list: a #GList + * + * Frees all of the memory used by a #GList. + * The freed elements are returned to the slice allocator. + * + * + * If list elements contain dynamically-allocated memory, + * they should be freed first. + * + */ +void +g_list_free (GList *list) +{ + g_slice_free_chain (GList, list, next); +} + +/** + * g_list_free_1: + * @list: a #GList element + * + * Frees one #GList element. + * It is usually used after g_list_remove_link(). + */ +/** + * g_list_free1: + * + * Another name for g_list_free_1(). + **/ +void +g_list_free_1 (GList *list) +{ + _g_list_free1 (list); +} + +/** + * g_list_append: + * @list: a pointer to a #GList + * @data: the data for the new element + * + * Adds a new element on to the end of the list. + * + * + * The return value is the new start of the list, which + * may have changed, so make sure you store the new value. + * + * + * + * Note that g_list_append() has to traverse the entire list + * to find the end, which is inefficient when adding multiple + * elements. A common idiom to avoid the inefficiency is to prepend + * the elements and reverse the list when all elements have been added. + * + * + * |[ + * /* Notice that these are initialized to the empty list. */ + * GList *list = NULL, *number_list = NULL; + * + * /* This is a list of strings. */ + * list = g_list_append (list, "first"); + * list = g_list_append (list, "second"); + * + * /* This is a list of integers. */ + * number_list = g_list_append (number_list, GINT_TO_POINTER (27)); + * number_list = g_list_append (number_list, GINT_TO_POINTER (14)); + * ]| + * + * Returns: the new start of the #GList + */ +GList* +g_list_append (GList *list, + gpointer data) +{ + GList *new_list; + GList *last; + + new_list = _g_list_alloc (); + new_list->data = data; + new_list->next = NULL; + + if (list) + { + last = g_list_last (list); + /* g_assert (last != NULL); */ + last->next = new_list; + new_list->prev = last; + + return list; + } + else + { + new_list->prev = NULL; + return new_list; + } +} + +/** + * g_list_prepend: + * @list: a pointer to a #GList + * @data: the data for the new element + * + * Adds a new element on to the start of the list. + * + * + * The return value is the new start of the list, which + * may have changed, so make sure you store the new value. + * + * + * |[ + * /* Notice that it is initialized to the empty list. */ + * GList *list = NULL; + * list = g_list_prepend (list, "last"); + * list = g_list_prepend (list, "first"); + * ]| + * + * Returns: the new start of the #GList + */ +GList* +g_list_prepend (GList *list, + gpointer data) +{ + GList *new_list; + + new_list = _g_list_alloc (); + new_list->data = data; + new_list->next = list; + + if (list) + { + new_list->prev = list->prev; + if (list->prev) + list->prev->next = new_list; + list->prev = new_list; + } + else + new_list->prev = NULL; + + return new_list; +} + +/** + * g_list_insert: + * @list: a pointer to a #GList + * @data: the data for the new element + * @position: the position to insert the element. If this is + * negative, or is larger than the number of elements in the + * list, the new element is added on to the end of the list. + * + * Inserts a new element into the list at the given position. + * + * Returns: the new start of the #GList + */ +GList* +g_list_insert (GList *list, + gpointer data, + gint position) +{ + GList *new_list; + GList *tmp_list; + + if (position < 0) + return g_list_append (list, data); + else if (position == 0) + return g_list_prepend (list, data); + + tmp_list = g_list_nth (list, position); + if (!tmp_list) + return g_list_append (list, data); + + new_list = _g_list_alloc (); + new_list->data = data; + new_list->prev = tmp_list->prev; + if (tmp_list->prev) + tmp_list->prev->next = new_list; + new_list->next = tmp_list; + tmp_list->prev = new_list; + + if (tmp_list == list) + return new_list; + else + return list; +} + +/** + * g_list_insert_before: + * @list: a pointer to a #GList + * @sibling: the list element before which the new element + * is inserted or %NULL to insert at the end of the list + * @data: the data for the new element + * + * Inserts a new element into the list before the given position. + * + * Returns: the new start of the #GList + */ +GList* +g_list_insert_before (GList *list, + GList *sibling, + gpointer data) +{ + if (!list) + { + list = g_list_alloc (); + list->data = data; + g_return_val_if_fail (sibling == NULL, list); + return list; + } + else if (sibling) + { + GList *node; + + node = _g_list_alloc (); + node->data = data; + node->prev = sibling->prev; + node->next = sibling; + sibling->prev = node; + if (node->prev) + { + node->prev->next = node; + return list; + } + else + { + g_return_val_if_fail (sibling == list, node); + return node; + } + } + else + { + GList *last; + + last = list; + while (last->next) + last = last->next; + + last->next = _g_list_alloc (); + last->next->data = data; + last->next->prev = last; + last->next->next = NULL; + + return list; + } +} + +/** + * g_list_concat: + * @list1: a #GList + * @list2: the #GList to add to the end of the first #GList + * + * Adds the second #GList onto the end of the first #GList. + * Note that the elements of the second #GList are not copied. + * They are used directly. + * + * Returns: the start of the new #GList + */ +GList * +g_list_concat (GList *list1, GList *list2) +{ + GList *tmp_list; + + if (list2) + { + tmp_list = g_list_last (list1); + if (tmp_list) + tmp_list->next = list2; + else + list1 = list2; + list2->prev = tmp_list; + } + + return list1; +} + +/** + * g_list_remove: + * @list: a #GList + * @data: the data of the element to remove + * + * Removes an element from a #GList. + * If two elements contain the same data, only the first is removed. + * If none of the elements contain the data, the #GList is unchanged. + * + * Returns: the new start of the #GList + */ +GList* +g_list_remove (GList *list, + gconstpointer data) +{ + GList *tmp; + + tmp = list; + while (tmp) + { + if (tmp->data != data) + tmp = tmp->next; + else + { + if (tmp->prev) + tmp->prev->next = tmp->next; + if (tmp->next) + tmp->next->prev = tmp->prev; + + if (list == tmp) + list = list->next; + + _g_list_free1 (tmp); + + break; + } + } + return list; +} + +/** + * g_list_remove_all: + * @list: a #GList + * @data: data to remove + * + * Removes all list nodes with data equal to @data. + * Returns the new head of the list. Contrast with + * g_list_remove() which removes only the first node + * matching the given data. + * + * Returns: new head of @list + */ +GList* +g_list_remove_all (GList *list, + gconstpointer data) +{ + GList *tmp = list; + + while (tmp) + { + if (tmp->data != data) + tmp = tmp->next; + else + { + GList *next = tmp->next; + + if (tmp->prev) + tmp->prev->next = next; + else + list = next; + if (next) + next->prev = tmp->prev; + + _g_list_free1 (tmp); + tmp = next; + } + } + return list; +} + +static inline GList* +_g_list_remove_link (GList *list, + GList *link) +{ + if (link) + { + if (link->prev) + link->prev->next = link->next; + if (link->next) + link->next->prev = link->prev; + + if (link == list) + list = list->next; + + link->next = NULL; + link->prev = NULL; + } + + return list; +} + +/** + * g_list_remove_link: + * @list: a #GList + * @llink: an element in the #GList + * + * Removes an element from a #GList, without freeing the element. + * The removed element's prev and next links are set to %NULL, so + * that it becomes a self-contained list with one element. + * + * Returns: the new start of the #GList, without the element + */ +GList* +g_list_remove_link (GList *list, + GList *llink) +{ + return _g_list_remove_link (list, llink); +} + +/** + * g_list_delete_link: + * @list: a #GList + * @link_: node to delete from @list + * + * Removes the node link_ from the list and frees it. + * Compare this to g_list_remove_link() which removes the node + * without freeing it. + * + * Returns: the new head of @list + */ +GList* +g_list_delete_link (GList *list, + GList *link_) +{ + list = _g_list_remove_link (list, link_); + _g_list_free1 (link_); + + return list; +} + +/** + * g_list_copy: + * @list: a #GList + * + * Copies a #GList. + * + * + * Note that this is a "shallow" copy. If the list elements + * consist of pointers to data, the pointers are copied but + * the actual data is not. + * + * + * Returns: a copy of @list + */ +GList* +g_list_copy (GList *list) +{ + GList *new_list = NULL; + + if (list) + { + GList *last; + + new_list = _g_list_alloc (); + new_list->data = list->data; + new_list->prev = NULL; + last = new_list; + list = list->next; + while (list) + { + last->next = _g_list_alloc (); + last->next->prev = last; + last = last->next; + last->data = list->data; + list = list->next; + } + last->next = NULL; + } + + return new_list; +} + +/** + * g_list_reverse: + * @list: a #GList + * + * Reverses a #GList. + * It simply switches the next and prev pointers of each element. + * + * Returns: the start of the reversed #GList + */ +GList* +g_list_reverse (GList *list) +{ + GList *last; + + last = NULL; + while (list) + { + last = list; + list = last->next; + last->next = last->prev; + last->prev = list; + } + + return last; +} + +/** + * g_list_nth: + * @list: a #GList + * @n: the position of the element, counting from 0 + * + * Gets the element at the given position in a #GList. + * + * Returns: the element, or %NULL if the position is off + * the end of the #GList + */ +GList* +g_list_nth (GList *list, + guint n) +{ + while ((n-- > 0) && list) + list = list->next; + + return list; +} + +/** + * g_list_nth_prev: + * @list: a #GList + * @n: the position of the element, counting from 0 + * + * Gets the element @n places before @list. + * + * Returns: the element, or %NULL if the position is + * off the end of the #GList + */ +GList* +g_list_nth_prev (GList *list, + guint n) +{ + while ((n-- > 0) && list) + list = list->prev; + + return list; +} + +/** + * g_list_nth_data: + * @list: a #GList + * @n: the position of the element + * + * Gets the data of the element at the given position. + * + * Returns: the element's data, or %NULL if the position + * is off the end of the #GList + */ +gpointer +g_list_nth_data (GList *list, + guint n) +{ + while ((n-- > 0) && list) + list = list->next; + + return list ? list->data : NULL; +} + +/** + * g_list_find: + * @list: a #GList + * @data: the element data to find + * + * Finds the element in a #GList which + * contains the given data. + * + * Returns: the found #GList element, + * or %NULL if it is not found + */ +GList* +g_list_find (GList *list, + gconstpointer data) +{ + while (list) + { + if (list->data == data) + break; + list = list->next; + } + + return list; +} + +/** + * g_list_find_custom: + * @list: a #GList + * @data: user data passed to the function + * @func: the function to call for each element. + * It should return 0 when the desired element is found + * + * Finds an element in a #GList, using a supplied function to + * find the desired element. It iterates over the list, calling + * the given function which should return 0 when the desired + * element is found. The function takes two #gconstpointer arguments, + * the #GList element's data as the first argument and the + * given user data. + * + * Returns: the found #GList element, or %NULL if it is not found + */ +GList* +g_list_find_custom (GList *list, + gconstpointer data, + GCompareFunc func) +{ + g_return_val_if_fail (func != NULL, list); + + while (list) + { + if (! func (list->data, data)) + return list; + list = list->next; + } + + return NULL; +} + + +/** + * g_list_position: + * @list: a #GList + * @llink: an element in the #GList + * + * Gets the position of the given element + * in the #GList (starting from 0). + * + * Returns: the position of the element in the #GList, + * or -1 if the element is not found + */ +gint +g_list_position (GList *list, + GList *llink) +{ + gint i; + + i = 0; + while (list) + { + if (list == llink) + return i; + i++; + list = list->next; + } + + return -1; +} + +/** + * g_list_index: + * @list: a #GList + * @data: the data to find + * + * Gets the position of the element containing + * the given data (starting from 0). + * + * Returns: the index of the element containing the data, + * or -1 if the data is not found + */ +gint +g_list_index (GList *list, + gconstpointer data) +{ + gint i; + + i = 0; + while (list) + { + if (list->data == data) + return i; + i++; + list = list->next; + } + + return -1; +} + +/** + * g_list_last: + * @list: a #GList + * + * Gets the last element in a #GList. + * + * Returns: the last element in the #GList, + * or %NULL if the #GList has no elements + */ +GList* +g_list_last (GList *list) +{ + if (list) + { + while (list->next) + list = list->next; + } + + return list; +} + +/** + * g_list_first: + * @list: a #GList + * + * Gets the first element in a #GList. + * + * Returns: the first element in the #GList, + * or %NULL if the #GList has no elements + */ +GList* +g_list_first (GList *list) +{ + if (list) + { + while (list->prev) + list = list->prev; + } + + return list; +} + +/** + * g_list_length: + * @list: a #GList + * + * Gets the number of elements in a #GList. + * + * + * This function iterates over the whole list to + * count its elements. + * + * + * Returns: the number of elements in the #GList + */ +guint +g_list_length (GList *list) +{ + guint length; + + length = 0; + while (list) + { + length++; + list = list->next; + } + + return length; +} + +/** + * g_list_foreach: + * @list: a #GList + * @func: the function to call with each element's data + * @user_data: user data to pass to the function + * + * Calls a function for each element of a #GList. + */ +/** + * GFunc: + * @data: the element's data. + * @user_data: user data passed to g_list_foreach() or + * g_slist_foreach(). + * + * Specifies the type of functions passed to g_list_foreach() and + * g_slist_foreach(). + **/ +void +g_list_foreach (GList *list, + GFunc func, + gpointer user_data) +{ + while (list) + { + GList *next = list->next; + (*func) (list->data, user_data); + list = next; + } +} + +static GList* +g_list_insert_sorted_real (GList *list, + gpointer data, + GFunc func, + gpointer user_data) +{ + GList *tmp_list = list; + GList *new_list; + gint cmp; + + g_return_val_if_fail (func != NULL, list); + + if (!list) + { + new_list = _g_list_alloc0 (); + new_list->data = data; + return new_list; + } + + cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); + + while ((tmp_list->next) && (cmp > 0)) + { + tmp_list = tmp_list->next; + + cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); + } + + new_list = _g_list_alloc0 (); + new_list->data = data; + + if ((!tmp_list->next) && (cmp > 0)) + { + tmp_list->next = new_list; + new_list->prev = tmp_list; + return list; + } + + if (tmp_list->prev) + { + tmp_list->prev->next = new_list; + new_list->prev = tmp_list->prev; + } + new_list->next = tmp_list; + tmp_list->prev = new_list; + + if (tmp_list == list) + return new_list; + else + return list; +} + +/** + * g_list_insert_sorted: + * @list: a pointer to a #GList + * @data: the data for the new element + * @func: the function to compare elements in the list. It should + * return a number > 0 if the first parameter comes after the + * second parameter in the sort order. + * + * Inserts a new element into the list, using the given comparison + * function to determine its position. + * + * Returns: the new start of the #GList + */ +GList* +g_list_insert_sorted (GList *list, + gpointer data, + GCompareFunc func) +{ + return g_list_insert_sorted_real (list, data, (GFunc) func, NULL); +} + +/** + * g_list_insert_sorted_with_data: + * @list: a pointer to a #GList + * @data: the data for the new element + * @func: the function to compare elements in the list. + * It should return a number > 0 if the first parameter + * comes after the second parameter in the sort order. + * @user_data: user data to pass to comparison function. + * + * Inserts a new element into the list, using the given comparison + * function to determine its position. + * + * Returns: the new start of the #GList + * + * Since: 2.10 + */ +GList* +g_list_insert_sorted_with_data (GList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data) +{ + return g_list_insert_sorted_real (list, data, (GFunc) func, user_data); +} + +static GList * +g_list_sort_merge (GList *l1, + GList *l2, + GFunc compare_func, + gpointer user_data) +{ + GList list, *l, *lprev; + gint cmp; + + l = &list; + lprev = NULL; + + while (l1 && l2) + { + cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); + + if (cmp <= 0) + { + l->next = l1; + l1 = l1->next; + } + else + { + l->next = l2; + l2 = l2->next; + } + l = l->next; + l->prev = lprev; + lprev = l; + } + l->next = l1 ? l1 : l2; + l->next->prev = l; + + return list.next; +} + +static GList* +g_list_sort_real (GList *list, + GFunc compare_func, + gpointer user_data) +{ + GList *l1, *l2; + + if (!list) + return NULL; + if (!list->next) + return list; + + l1 = list; + l2 = list->next; + + while ((l2 = l2->next) != NULL) + { + if ((l2 = l2->next) == NULL) + break; + l1 = l1->next; + } + l2 = l1->next; + l1->next = NULL; + + return g_list_sort_merge (g_list_sort_real (list, compare_func, user_data), + g_list_sort_real (l2, compare_func, user_data), + compare_func, + user_data); +} + +/** + * g_list_sort: + * @list: a #GList + * @compare_func: the comparison function used to sort the #GList. + * This function is passed the data from 2 elements of the #GList + * and should return 0 if they are equal, a negative value if the + * first element comes before the second, or a positive value if + * the first element comes after the second. + * + * Sorts a #GList using the given comparison function. + * + * Returns: the start of the sorted #GList + */ +/** + * GCompareFunc: + * @a: a value. + * @b: a value to compare with. + * @Returns: negative value if @a < @b; zero if @a = @b; positive + * value if @a > @b. + * + * Specifies the type of a comparison function used to compare two + * values. The function should return a negative integer if the first + * value comes before the second, 0 if they are equal, or a positive + * integer if the first value comes after the second. + **/ +GList * +g_list_sort (GList *list, + GCompareFunc compare_func) +{ + return g_list_sort_real (list, (GFunc) compare_func, NULL); + +} + +/** + * g_list_sort_with_data: + * @list: a #GList + * @compare_func: comparison function + * @user_data: user data to pass to comparison function + * + * Like g_list_sort(), but the comparison function accepts + * a user data argument. + * + * Returns: the new head of @list + */ +/** + * GCompareDataFunc: + * @a: a value. + * @b: a value to compare with. + * @user_data: user data to pass to comparison function. + * @Returns: negative value if @a < @b; zero if @a = @b; positive + * value if @a > @b. + * + * Specifies the type of a comparison function used to compare two + * values. The function should return a negative integer if the first + * value comes before the second, 0 if they are equal, or a positive + * integer if the first value comes after the second. + **/ +GList * +g_list_sort_with_data (GList *list, + GCompareDataFunc compare_func, + gpointer user_data) +{ + return g_list_sort_real (list, (GFunc) compare_func, user_data); +} + +#define __G_LIST_C__ +#include "galiasdef.c" diff --git a/glib/glist.h b/glib/glist.h new file mode 100644 index 0000000..e74ed96 --- /dev/null +++ b/glib/glist.h @@ -0,0 +1,120 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_LIST_H__ +#define __G_LIST_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GList GList; + +struct _GList +{ + gpointer data; + GList *next; + GList *prev; +}; + +/* Doubly linked lists + */ +GList* g_list_alloc (void) G_GNUC_WARN_UNUSED_RESULT; +void g_list_free (GList *list); +void g_list_free_1 (GList *list); +#define g_list_free1 g_list_free_1 +GList* g_list_append (GList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_prepend (GList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_insert (GList *list, + gpointer data, + gint position) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_insert_sorted (GList *list, + gpointer data, + GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_insert_sorted_with_data (GList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_insert_before (GList *list, + GList *sibling, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_concat (GList *list1, + GList *list2) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_remove (GList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_remove_all (GList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_remove_link (GList *list, + GList *llink) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_delete_link (GList *list, + GList *link_) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_reverse (GList *list) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_copy (GList *list) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_nth (GList *list, + guint n); +GList* g_list_nth_prev (GList *list, + guint n); +GList* g_list_find (GList *list, + gconstpointer data); +GList* g_list_find_custom (GList *list, + gconstpointer data, + GCompareFunc func); +gint g_list_position (GList *list, + GList *llink); +gint g_list_index (GList *list, + gconstpointer data); +GList* g_list_last (GList *list); +GList* g_list_first (GList *list); +guint g_list_length (GList *list); +void g_list_foreach (GList *list, + GFunc func, + gpointer user_data); +GList* g_list_sort (GList *list, + GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT; +GList* g_list_sort_with_data (GList *list, + GCompareDataFunc compare_func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +gpointer g_list_nth_data (GList *list, + guint n); + + +#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) +#define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL) + +#ifndef G_DISABLE_DEPRECATED +void g_list_push_allocator (gpointer allocator); +void g_list_pop_allocator (void); +#endif + +G_END_DECLS + +#endif /* __G_LIST_H__ */ diff --git a/glib/gmacros.h b/glib/gmacros.h new file mode 100644 index 0000000..b3ff7ee --- /dev/null +++ b/glib/gmacros.h @@ -0,0 +1,277 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* This file must not include any other glib header file and must thus + * not refer to variables from glibconfig.h + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MACROS_H__ +#define __G_MACROS_H__ + +/* We include stddef.h to get the system's definition of NULL + */ +#include + +/* Here we provide G_GNUC_EXTENSION as an alias for __extension__, + * where this is valid. This allows for warningless compilation of + * "long long" types even in the presence of '-ansi -pedantic'. + */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) +# define G_GNUC_EXTENSION __extension__ +#else +# define G_GNUC_EXTENSION +#endif + +/* Provide macros to feature the GCC function attribute. + */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) +#define G_GNUC_PURE \ + __attribute__((__pure__)) +#define G_GNUC_MALLOC \ + __attribute__((__malloc__)) +#else +#define G_GNUC_PURE +#define G_GNUC_MALLOC +#endif + +#if __GNUC__ >= 4 +#define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__)) +#else +#define G_GNUC_NULL_TERMINATED +#endif + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) +#define G_GNUC_ALLOC_SIZE2(x,y) __attribute__((__alloc_size__(x,y))) +#else +#define G_GNUC_ALLOC_SIZE(x) +#define G_GNUC_ALLOC_SIZE2(x,y) +#endif + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#define G_GNUC_PRINTF( format_idx, arg_idx ) \ + __attribute__((__format__ (__printf__, format_idx, arg_idx))) +#define G_GNUC_SCANF( format_idx, arg_idx ) \ + __attribute__((__format__ (__scanf__, format_idx, arg_idx))) +#define G_GNUC_FORMAT( arg_idx ) \ + __attribute__((__format_arg__ (arg_idx))) +#define G_GNUC_NORETURN \ + __attribute__((__noreturn__)) +#define G_GNUC_CONST \ + __attribute__((__const__)) +#define G_GNUC_UNUSED \ + __attribute__((__unused__)) +#define G_GNUC_NO_INSTRUMENT \ + __attribute__((__no_instrument_function__)) +#else /* !__GNUC__ */ +#define G_GNUC_PRINTF( format_idx, arg_idx ) +#define G_GNUC_SCANF( format_idx, arg_idx ) +#define G_GNUC_FORMAT( arg_idx ) +#define G_GNUC_NORETURN +#define G_GNUC_CONST +#define G_GNUC_UNUSED +#define G_GNUC_NO_INSTRUMENT +#endif /* !__GNUC__ */ + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +#define G_GNUC_DEPRECATED \ + __attribute__((__deprecated__)) +#else +#define G_GNUC_DEPRECATED +#endif /* __GNUC__ */ + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) +# define G_GNUC_MAY_ALIAS __attribute__((may_alias)) +#else +# define G_GNUC_MAY_ALIAS +#endif + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +#define G_GNUC_WARN_UNUSED_RESULT \ + __attribute__((warn_unused_result)) +#else +#define G_GNUC_WARN_UNUSED_RESULT +#endif /* __GNUC__ */ + +#ifndef G_DISABLE_DEPRECATED +/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with + * macros, so we can refer to them as strings unconditionally. + * usage not-recommended since gcc-3.0 + */ +#if defined (__GNUC__) && (__GNUC__ < 3) +#define G_GNUC_FUNCTION __FUNCTION__ +#define G_GNUC_PRETTY_FUNCTION __PRETTY_FUNCTION__ +#else /* !__GNUC__ */ +#define G_GNUC_FUNCTION "" +#define G_GNUC_PRETTY_FUNCTION "" +#endif /* !__GNUC__ */ +#endif /* !G_DISABLE_DEPRECATED */ + +#define G_STRINGIFY(macro_or_string) G_STRINGIFY_ARG (macro_or_string) +#define G_STRINGIFY_ARG(contents) #contents + +#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2 +#define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2) +#define G_STATIC_ASSERT(expr) typedef struct { char Compile_Time_Assertion[(expr) ? 1 : -1]; } G_PASTE (_GStaticAssert_, __LINE__) + +/* Provide a string identifying the current code position */ +#if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus) +# define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()" +#else +# define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) +#endif + +/* Provide a string identifying the current function, non-concatenatable */ +#if defined (__GNUC__) +# define G_STRFUNC ((const char*) (__PRETTY_FUNCTION__)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 19901L +# define G_STRFUNC ((const char*) (__func__)) +#else +# define G_STRFUNC ((const char*) ("???")) +#endif + +/* Guard C code in headers, while including them from C++ */ +#ifdef __cplusplus +# define G_BEGIN_DECLS extern "C" { +# define G_END_DECLS } +#else +# define G_BEGIN_DECLS +# define G_END_DECLS +#endif + +/* Provide definitions for some commonly used macros. + * Some of them are only provided if they haven't already + * been defined. It is assumed that if they are already + * defined then the current definition is correct. + */ +#ifndef NULL +# ifdef __cplusplus +# define NULL (0L) +# else /* !__cplusplus */ +# define NULL ((void*) 0) +# endif /* !__cplusplus */ +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +#undef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + +#undef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#undef ABS +#define ABS(a) (((a) < 0) ? -(a) : (a)) + +#undef CLAMP +#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + +/* Count the number of elements in an array. The array must be defined + * as such; using this with a dynamically allocated array will give + * incorrect results. + */ +#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0])) + +/* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT + */ +#define GPOINTER_TO_SIZE(p) ((gsize) (p)) +#define GSIZE_TO_POINTER(s) ((gpointer) (gsize) (s)) + +/* Provide convenience macros for handling structure + * fields through their offsets. + */ + +#if defined(__GNUC__) && __GNUC__ >= 4 +# define G_STRUCT_OFFSET(struct_type, member) \ + ((glong) offsetof (struct_type, member)) +#else +# define G_STRUCT_OFFSET(struct_type, member) \ + ((glong) ((guint8*) &((struct_type*) 0)->member)) +#endif + +#define G_STRUCT_MEMBER_P(struct_p, struct_offset) \ + ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset))) +#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset) \ + (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset))) + +/* Provide simple macro statement wrappers: + * G_STMT_START { statements; } G_STMT_END; + * This can be used as a single statement, like: + * if (x) G_STMT_START { ... } G_STMT_END; else ... + * This intentionally does not use compiler extensions like GCC's '({...})' to + * avoid portability issue or side effects when compiled with different compilers. + */ +#if !(defined (G_STMT_START) && defined (G_STMT_END)) +# define G_STMT_START do +# define G_STMT_END while (0) +#endif + +/* Allow the app programmer to select whether or not return values + * (usually char*) are const or not. Don't try using this feature for + * functions with C++ linkage. + */ +#ifdef G_DISABLE_CONST_RETURNS +#define G_CONST_RETURN +#else +#define G_CONST_RETURN const +#endif + +/* + * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to + * the compiler about the expected result of an expression. Some compilers + * can use this information for optimizations. + * + * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when + * putting assignments in g_return_if_fail (). + */ +#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) +#define _G_BOOLEAN_EXPR(expr) \ + __extension__ ({ \ + int _g_boolean_var_; \ + if (expr) \ + _g_boolean_var_ = 1; \ + else \ + _g_boolean_var_ = 0; \ + _g_boolean_var_; \ +}) +#define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1)) +#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0)) +#else +#define G_LIKELY(expr) (expr) +#define G_UNLIKELY(expr) (expr) +#endif + +#endif /* __G_MACROS_H__ */ diff --git a/glib/gmain.c b/glib/gmain.c new file mode 100644 index 0000000..e04c7b5 --- /dev/null +++ b/glib/gmain.c @@ -0,0 +1,4172 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gmain.c: Main loop abstraction, timeouts, and idle functions + * Copyright 1998 Owen Taylor + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +/* Uncomment the next line (and the corresponding line in gpoll.c) to + * enable debugging printouts if the environment variable + * G_MAIN_POLL_DEBUG is set to some value. + */ +/* #define G_MAIN_POLL_DEBUG */ + +#ifdef _WIN32 +/* Always enable debugging printout on Windows, as it is more often + * needed there... + */ +#define G_MAIN_POLL_DEBUG +#endif + +#define _GNU_SOURCE /* for pipe2 */ + +#include "glib.h" +#include "gthreadprivate.h" +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif /* HAVE_SYS_TIME_H */ +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ +#include + +#ifdef G_OS_WIN32 +#define STRICT +#include +#endif /* G_OS_WIN32 */ + +#ifdef G_OS_BEOS +#include +#include +#endif /* G_OS_BEOS */ + +#ifdef G_OS_UNIX +#include +#include +#endif + +#include "galias.h" + +/* Types */ + +typedef struct _GTimeoutSource GTimeoutSource; +typedef struct _GChildWatchSource GChildWatchSource; +typedef struct _GPollRec GPollRec; +typedef struct _GSourceCallback GSourceCallback; + +typedef enum +{ + G_SOURCE_READY = 1 << G_HOOK_FLAG_USER_SHIFT, + G_SOURCE_CAN_RECURSE = 1 << (G_HOOK_FLAG_USER_SHIFT + 1) +} GSourceFlags; + +#ifdef G_THREADS_ENABLED +typedef struct _GMainWaiter GMainWaiter; + +struct _GMainWaiter +{ + GCond *cond; + GMutex *mutex; +}; +#endif + +typedef struct _GMainDispatch GMainDispatch; + +struct _GMainDispatch +{ + gint depth; + GSList *dispatching_sources; /* stack of current sources */ +}; + +#ifdef G_MAIN_POLL_DEBUG +gboolean _g_main_poll_debug = FALSE; +#endif + +struct _GMainContext +{ +#ifdef G_THREADS_ENABLED + /* The following lock is used for both the list of sources + * and the list of poll records + */ + GStaticMutex mutex; + GCond *cond; + GThread *owner; + guint owner_count; + GSList *waiters; +#endif + + gint ref_count; + + GPtrArray *pending_dispatches; + gint timeout; /* Timeout for current iteration */ + + guint next_id; + GSource *source_list; + gint in_check_or_prepare; + + GPollRec *poll_records; + guint n_poll_records; + GPollFD *cached_poll_array; + guint cached_poll_array_size; + +#ifdef G_THREADS_ENABLED +#ifndef G_OS_WIN32 +/* this pipe is used to wake up the main loop when a source is added. + */ + gint wake_up_pipe[2]; +#else /* G_OS_WIN32 */ + HANDLE wake_up_semaphore; +#endif /* G_OS_WIN32 */ + + GPollFD wake_up_rec; + gboolean poll_waiting; + +/* Flag indicating whether the set of fd's changed during a poll */ + gboolean poll_changed; +#endif /* G_THREADS_ENABLED */ + + GPollFunc poll_func; + + GTimeVal current_time; + gboolean time_is_current; +}; + +struct _GSourceCallback +{ + guint ref_count; + GSourceFunc func; + gpointer data; + GDestroyNotify notify; +}; + +struct _GMainLoop +{ + GMainContext *context; + gboolean is_running; + gint ref_count; +}; + +struct _GTimeoutSource +{ + GSource source; + GTimeVal expiration; + guint interval; + guint granularity; +}; + +struct _GChildWatchSource +{ + GSource source; + GPid pid; + gint child_status; +#ifdef G_OS_WIN32 + GPollFD poll; +#else /* G_OS_WIN32 */ + gint count; + gboolean child_exited; +#endif /* G_OS_WIN32 */ +}; + +struct _GPollRec +{ + GPollFD *fd; + GPollRec *next; + gint priority; +}; + +#ifdef G_THREADS_ENABLED +#define LOCK_CONTEXT(context) g_static_mutex_lock (&context->mutex) +#define UNLOCK_CONTEXT(context) g_static_mutex_unlock (&context->mutex) +#define G_THREAD_SELF g_thread_self () +#else +#define LOCK_CONTEXT(context) (void)0 +#define UNLOCK_CONTEXT(context) (void)0 +#define G_THREAD_SELF NULL +#endif + +#define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0) +#define SOURCE_BLOCKED(source) (((source)->flags & G_HOOK_FLAG_IN_CALL) != 0 && \ + ((source)->flags & G_SOURCE_CAN_RECURSE) == 0) + +#define SOURCE_UNREF(source, context) \ + G_STMT_START { \ + if ((source)->ref_count > 1) \ + (source)->ref_count--; \ + else \ + g_source_unref_internal ((source), (context), TRUE); \ + } G_STMT_END + + +/* Forward declarations */ + +static void g_source_unref_internal (GSource *source, + GMainContext *context, + gboolean have_lock); +static void g_source_destroy_internal (GSource *source, + GMainContext *context, + gboolean have_lock); +static void g_main_context_poll (GMainContext *context, + gint timeout, + gint priority, + GPollFD *fds, + gint n_fds); +static void g_main_context_add_poll_unlocked (GMainContext *context, + gint priority, + GPollFD *fd); +static void g_main_context_remove_poll_unlocked (GMainContext *context, + GPollFD *fd); +static void g_main_context_wakeup_unlocked (GMainContext *context); + +static gboolean g_timeout_prepare (GSource *source, + gint *timeout); +static gboolean g_timeout_check (GSource *source); +static gboolean g_timeout_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data); +static gboolean g_child_watch_prepare (GSource *source, + gint *timeout); +static gboolean g_child_watch_check (GSource *source); +static gboolean g_child_watch_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data); +static gboolean g_idle_prepare (GSource *source, + gint *timeout); +static gboolean g_idle_check (GSource *source); +static gboolean g_idle_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data); + +G_LOCK_DEFINE_STATIC (main_loop); +static GMainContext *default_main_context; +static GSList *main_contexts_without_pipe = NULL; + +#ifndef G_OS_WIN32 +/* Child status monitoring code */ +enum { + CHILD_WATCH_UNINITIALIZED, + CHILD_WATCH_INITIALIZED_SINGLE, + CHILD_WATCH_INITIALIZED_THREADED +}; +static gint child_watch_init_state = CHILD_WATCH_UNINITIALIZED; +static gint child_watch_count = 1; +static gint child_watch_wake_up_pipe[2] = {0, 0}; +#endif /* !G_OS_WIN32 */ +G_LOCK_DEFINE_STATIC (main_context_list); +static GSList *main_context_list = NULL; + +static gint timer_perturb = -1; + +GSourceFuncs g_timeout_funcs = +{ + g_timeout_prepare, + g_timeout_check, + g_timeout_dispatch, + NULL +}; + +GSourceFuncs g_child_watch_funcs = +{ + g_child_watch_prepare, + g_child_watch_check, + g_child_watch_dispatch, + NULL +}; + +GSourceFuncs g_idle_funcs = +{ + g_idle_prepare, + g_idle_check, + g_idle_dispatch, + NULL +}; + +/** + * g_main_context_ref: + * @context: a #GMainContext + * + * Increases the reference count on a #GMainContext object by one. + * + * Returns: the @context that was passed in (since 2.6) + **/ +GMainContext * +g_main_context_ref (GMainContext *context) +{ + g_return_val_if_fail (context != NULL, NULL); + g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL); + + g_atomic_int_inc (&context->ref_count); + + return context; +} + +static inline void +poll_rec_list_free (GMainContext *context, + GPollRec *list) +{ + g_slice_free_chain (GPollRec, list, next); +} + +/** + * g_main_context_unref: + * @context: a #GMainContext + * + * Decreases the reference count on a #GMainContext object by one. If + * the result is zero, free the context and free all associated memory. + **/ +void +g_main_context_unref (GMainContext *context) +{ + GSource *source; + g_return_if_fail (context != NULL); + g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); + + if (!g_atomic_int_dec_and_test (&context->ref_count)) + return; + + G_LOCK (main_context_list); + main_context_list = g_slist_remove (main_context_list, context); + G_UNLOCK (main_context_list); + + source = context->source_list; + while (source) + { + GSource *next = source->next; + g_source_destroy_internal (source, context, FALSE); + source = next; + } + +#ifdef G_THREADS_ENABLED + g_static_mutex_free (&context->mutex); +#endif + + g_ptr_array_free (context->pending_dispatches, TRUE); + g_free (context->cached_poll_array); + + poll_rec_list_free (context, context->poll_records); + +#ifdef G_THREADS_ENABLED + if (g_thread_supported()) + { +#ifndef G_OS_WIN32 + close (context->wake_up_pipe[0]); + close (context->wake_up_pipe[1]); +#else + CloseHandle (context->wake_up_semaphore); +#endif + } + else + main_contexts_without_pipe = g_slist_remove (main_contexts_without_pipe, + context); + + if (context->cond != NULL) + g_cond_free (context->cond); +#endif + + g_free (context); +} + +#ifdef G_THREADS_ENABLED +static void +g_main_context_init_pipe (GMainContext *context) +{ +# ifndef G_OS_WIN32 + if (context->wake_up_pipe[0] != -1) + return; + +#ifdef HAVE_PIPE2 + /* if this fails, we fall through and try pipe */ + pipe2 (context->wake_up_pipe, O_CLOEXEC); +#endif + if (context->wake_up_pipe[0] == -1) + { + if (pipe (context->wake_up_pipe) < 0) + g_error ("Cannot create pipe main loop wake-up: %s\n", + g_strerror (errno)); + + fcntl (context->wake_up_pipe[0], F_SETFD, FD_CLOEXEC); + fcntl (context->wake_up_pipe[1], F_SETFD, FD_CLOEXEC); + } + + context->wake_up_rec.fd = context->wake_up_pipe[0]; + context->wake_up_rec.events = G_IO_IN; +# else + if (context->wake_up_semaphore != NULL) + return; + context->wake_up_semaphore = CreateSemaphore (NULL, 0, 100, NULL); + if (context->wake_up_semaphore == NULL) + g_error ("Cannot create wake-up semaphore: %s", + g_win32_error_message (GetLastError ())); + context->wake_up_rec.fd = (gintptr) context->wake_up_semaphore; + context->wake_up_rec.events = G_IO_IN; + + if (_g_main_poll_debug) + g_print ("wake-up semaphore: %p\n", context->wake_up_semaphore); +# endif + g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec); +} + +void +_g_main_thread_init (void) +{ + GSList *curr = main_contexts_without_pipe; + while (curr) + { + g_main_context_init_pipe ((GMainContext *)curr->data); + curr = curr->next; + } + g_slist_free (main_contexts_without_pipe); + main_contexts_without_pipe = NULL; +} +#endif /* G_THREADS_ENABLED */ + +/** + * g_main_context_new: + * + * Creates a new #GMainContext structure. + * + * Return value: the new #GMainContext + **/ +GMainContext * +g_main_context_new (void) +{ + GMainContext *context = g_new0 (GMainContext, 1); + +#ifdef G_MAIN_POLL_DEBUG + { + static gboolean beenhere = FALSE; + + if (!beenhere) + { + if (getenv ("G_MAIN_POLL_DEBUG") != NULL) + _g_main_poll_debug = TRUE; + beenhere = TRUE; + } + } +#endif + +#ifdef G_THREADS_ENABLED + g_static_mutex_init (&context->mutex); + + context->owner = NULL; + context->waiters = NULL; + +# ifndef G_OS_WIN32 + context->wake_up_pipe[0] = -1; + context->wake_up_pipe[1] = -1; +# else + context->wake_up_semaphore = NULL; +# endif +#endif + + context->ref_count = 1; + + context->next_id = 1; + + context->source_list = NULL; + + context->poll_func = g_poll; + + context->cached_poll_array = NULL; + context->cached_poll_array_size = 0; + + context->pending_dispatches = g_ptr_array_new (); + + context->time_is_current = FALSE; + +#ifdef G_THREADS_ENABLED + if (g_thread_supported ()) + g_main_context_init_pipe (context); + else + main_contexts_without_pipe = g_slist_prepend (main_contexts_without_pipe, + context); +#endif + + G_LOCK (main_context_list); + main_context_list = g_slist_append (main_context_list, context); + +#ifdef G_MAIN_POLL_DEBUG + if (_g_main_poll_debug) + g_print ("created context=%p\n", context); +#endif + + G_UNLOCK (main_context_list); + + return context; +} + +/** + * g_main_context_default: + * + * Returns the global default main context. This is the main context + * used for main loop functions when a main loop is not explicitly + * specified, and corresponds to the "main" main loop. See also + * g_main_context_get_thread_default(). + * + * Return value: the global default main context. + **/ +GMainContext * +g_main_context_default (void) +{ + /* Slow, but safe */ + + G_LOCK (main_loop); + + if (!default_main_context) + { + default_main_context = g_main_context_new (); +#ifdef G_MAIN_POLL_DEBUG + if (_g_main_poll_debug) + g_print ("default context=%p\n", default_main_context); +#endif + } + + G_UNLOCK (main_loop); + + return default_main_context; +} + +static GStaticPrivate thread_context_stack = G_STATIC_PRIVATE_INIT; + +static void +free_context_stack (gpointer data) +{ + GQueue *stack = data; + GMainContext *context; + + while (!g_queue_is_empty (stack)) + { + context = g_queue_pop_head (stack); + g_main_context_release (context); + if (context) + g_main_context_unref (context); + } + g_queue_free (stack); +} + +/** + * g_main_context_push_thread_default: + * @context: a #GMainContext, or %NULL for the global default context + * + * Acquires @context and sets it as the thread-default context for the + * current thread. This will cause certain asynchronous operations + * (such as most gio-based I/O) which are + * started in this thread to run under @context and deliver their + * results to its main loop, rather than running under the global + * default context in the main thread. Note that calling this function + * changes the context returned by + * g_main_context_get_thread_default(), not the + * one returned by g_main_context_default(), so it does not affect the + * context used by functions like g_idle_add(). + * + * Normally you would call this function shortly after creating a new + * thread, passing it a #GMainContext which will be run by a + * #GMainLoop in that thread, to set a new default context for all + * async operations in that thread. (In this case, you don't need to + * ever call g_main_context_pop_thread_default().) In some cases + * however, you may want to schedule a single operation in a + * non-default context, or temporarily use a non-default context in + * the main thread. In that case, you can wrap the call to the + * asynchronous operation inside a + * g_main_context_push_thread_default() / + * g_main_context_pop_thread_default() pair, but it is up to you to + * ensure that no other asynchronous operations accidentally get + * started while the non-default context is active. + * + * Beware that libraries that predate this function may not correctly + * handle being used from a thread with a thread-default context. Eg, + * see g_file_supports_thread_contexts(). + * + * Since: 2.22 + **/ +void +g_main_context_push_thread_default (GMainContext *context) +{ + GQueue *stack; + gboolean acquired_context; + + acquired_context = g_main_context_acquire (context); + g_return_if_fail (acquired_context); + + if (context == g_main_context_default ()) + context = NULL; + else if (context) + g_main_context_ref (context); + + stack = g_static_private_get (&thread_context_stack); + if (!stack) + { + stack = g_queue_new (); + g_static_private_set (&thread_context_stack, stack, + free_context_stack); + } + + g_queue_push_head (stack, context); +} + +/** + * g_main_context_pop_thread_default: + * @context: a #GMainContext object, or %NULL + * + * Pops @context off the thread-default context stack (verifying that + * it was on the top of the stack). + * + * Since: 2.22 + **/ +void +g_main_context_pop_thread_default (GMainContext *context) +{ + GQueue *stack; + + if (context == g_main_context_default ()) + context = NULL; + + stack = g_static_private_get (&thread_context_stack); + + g_return_if_fail (stack != NULL); + g_return_if_fail (g_queue_peek_head (stack) == context); + + g_queue_pop_head (stack); + + g_main_context_release (context); + if (context) + g_main_context_unref (context); +} + +/** + * g_main_context_get_thread_default: + * + * Gets the thread-default #GMainContext for this thread. Asynchronous + * operations that want to be able to be run in contexts other than + * the default one should call this method to get a #GMainContext to + * add their #GSources to. (Note that even in single-threaded + * programs applications may sometimes want to temporarily push a + * non-default context, so it is not safe to assume that this will + * always return %NULL if threads are not initialized.) + * + * Returns: the thread-default #GMainContext, or %NULL if the + * thread-default context is the global default context. + * + * Since: 2.22 + **/ +GMainContext * +g_main_context_get_thread_default (void) +{ + GQueue *stack; + + stack = g_static_private_get (&thread_context_stack); + if (stack) + return g_queue_peek_head (stack); + else + return NULL; +} + +/* Hooks for adding to the main loop */ + +/** + * g_source_new: + * @source_funcs: structure containing functions that implement + * the sources behavior. + * @struct_size: size of the #GSource structure to create. + * + * Creates a new #GSource structure. The size is specified to + * allow creating structures derived from #GSource that contain + * additional data. The size passed in must be at least + * sizeof (GSource). + * + * The source will not initially be associated with any #GMainContext + * and must be added to one with g_source_attach() before it will be + * executed. + * + * Return value: the newly-created #GSource. + **/ +GSource * +g_source_new (GSourceFuncs *source_funcs, + guint struct_size) +{ + GSource *source; + + g_return_val_if_fail (source_funcs != NULL, NULL); + g_return_val_if_fail (struct_size >= sizeof (GSource), NULL); + + source = (GSource*) g_malloc0 (struct_size); + + source->source_funcs = source_funcs; + source->ref_count = 1; + + source->priority = G_PRIORITY_DEFAULT; + + source->flags = G_HOOK_FLAG_ACTIVE; + + /* NULL/0 initialization for all other fields */ + + return source; +} + +/* Holds context's lock + */ +static void +g_source_list_add (GSource *source, + GMainContext *context) +{ + GSource *tmp_source, *last_source; + + last_source = NULL; + tmp_source = context->source_list; + while (tmp_source && tmp_source->priority <= source->priority) + { + last_source = tmp_source; + tmp_source = tmp_source->next; + } + + source->next = tmp_source; + if (tmp_source) + tmp_source->prev = source; + + source->prev = last_source; + if (last_source) + last_source->next = source; + else + context->source_list = source; +} + +/* Holds context's lock + */ +static void +g_source_list_remove (GSource *source, + GMainContext *context) +{ + if (source->prev) + source->prev->next = source->next; + else + context->source_list = source->next; + + if (source->next) + source->next->prev = source->prev; + + source->prev = NULL; + source->next = NULL; +} + +/** + * g_source_attach: + * @source: a #GSource + * @context: a #GMainContext (if %NULL, the default context will be used) + * + * Adds a #GSource to a @context so that it will be executed within + * that context. Remove it by calling g_source_destroy(). + * + * Return value: the ID (greater than 0) for the source within the + * #GMainContext. + **/ +guint +g_source_attach (GSource *source, + GMainContext *context) +{ + guint result = 0; + GSList *tmp_list; + + g_return_val_if_fail (source->context == NULL, 0); + g_return_val_if_fail (!SOURCE_DESTROYED (source), 0); + + if (!context) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + source->context = context; + result = source->source_id = context->next_id++; + + source->ref_count++; + g_source_list_add (source, context); + + tmp_list = source->poll_fds; + while (tmp_list) + { + g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data); + tmp_list = tmp_list->next; + } + +#ifdef G_THREADS_ENABLED + /* Now wake up the main loop if it is waiting in the poll() */ + g_main_context_wakeup_unlocked (context); +#endif + + UNLOCK_CONTEXT (context); + + return result; +} + +static void +g_source_destroy_internal (GSource *source, + GMainContext *context, + gboolean have_lock) +{ + if (!have_lock) + LOCK_CONTEXT (context); + + if (!SOURCE_DESTROYED (source)) + { + GSList *tmp_list; + gpointer old_cb_data; + GSourceCallbackFuncs *old_cb_funcs; + + source->flags &= ~G_HOOK_FLAG_ACTIVE; + + old_cb_data = source->callback_data; + old_cb_funcs = source->callback_funcs; + + source->callback_data = NULL; + source->callback_funcs = NULL; + + if (old_cb_funcs) + { + UNLOCK_CONTEXT (context); + old_cb_funcs->unref (old_cb_data); + LOCK_CONTEXT (context); + } + + if (!SOURCE_BLOCKED (source)) + { + tmp_list = source->poll_fds; + while (tmp_list) + { + g_main_context_remove_poll_unlocked (context, tmp_list->data); + tmp_list = tmp_list->next; + } + } + + g_source_unref_internal (source, context, TRUE); + } + + if (!have_lock) + UNLOCK_CONTEXT (context); +} + +/** + * g_source_destroy: + * @source: a #GSource + * + * Removes a source from its #GMainContext, if any, and mark it as + * destroyed. The source cannot be subsequently added to another + * context. + **/ +void +g_source_destroy (GSource *source) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + + context = source->context; + + if (context) + g_source_destroy_internal (source, context, FALSE); + else + source->flags &= ~G_HOOK_FLAG_ACTIVE; +} + +/** + * g_source_get_id: + * @source: a #GSource + * + * Returns the numeric ID for a particular source. The ID of a source + * is a positive integer which is unique within a particular main loop + * context. The reverse + * mapping from ID to source is done by g_main_context_find_source_by_id(). + * + * Return value: the ID (greater than 0) for the source + **/ +guint +g_source_get_id (GSource *source) +{ + guint result; + + g_return_val_if_fail (source != NULL, 0); + g_return_val_if_fail (source->context != NULL, 0); + + LOCK_CONTEXT (source->context); + result = source->source_id; + UNLOCK_CONTEXT (source->context); + + return result; +} + +/** + * g_source_get_context: + * @source: a #GSource + * + * Gets the #GMainContext with which the source is associated. + * Calling this function on a destroyed source is an error. + * + * Return value: the #GMainContext with which the source is associated, + * or %NULL if the context has not yet been added + * to a source. + **/ +GMainContext * +g_source_get_context (GSource *source) +{ + g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL); + + return source->context; +} + +/** + * g_source_add_poll: + * @source:a #GSource + * @fd: a #GPollFD structure holding information about a file + * descriptor to watch. + * + * Adds a file descriptor to the set of file descriptors polled for + * this source. This is usually combined with g_source_new() to add an + * event source. The event source's check function will typically test + * the @revents field in the #GPollFD struct and return %TRUE if events need + * to be processed. + **/ +void +g_source_add_poll (GSource *source, + GPollFD *fd) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + g_return_if_fail (fd != NULL); + g_return_if_fail (!SOURCE_DESTROYED (source)); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->poll_fds = g_slist_prepend (source->poll_fds, fd); + + if (context) + { + if (!SOURCE_BLOCKED (source)) + g_main_context_add_poll_unlocked (context, source->priority, fd); + UNLOCK_CONTEXT (context); + } +} + +/** + * g_source_remove_poll: + * @source:a #GSource + * @fd: a #GPollFD structure previously passed to g_source_add_poll(). + * + * Removes a file descriptor from the set of file descriptors polled for + * this source. + **/ +void +g_source_remove_poll (GSource *source, + GPollFD *fd) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + g_return_if_fail (fd != NULL); + g_return_if_fail (!SOURCE_DESTROYED (source)); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->poll_fds = g_slist_remove (source->poll_fds, fd); + + if (context) + { + if (!SOURCE_BLOCKED (source)) + g_main_context_remove_poll_unlocked (context, fd); + UNLOCK_CONTEXT (context); + } +} + +/** + * g_source_set_callback_indirect: + * @source: the source + * @callback_data: pointer to callback data "object" + * @callback_funcs: functions for reference counting @callback_data + * and getting the callback and data + * + * Sets the callback function storing the data as a refcounted callback + * "object". This is used internally. Note that calling + * g_source_set_callback_indirect() assumes + * an initial reference count on @callback_data, and thus + * @callback_funcs->unref will eventually be called once more + * than @callback_funcs->ref. + **/ +void +g_source_set_callback_indirect (GSource *source, + gpointer callback_data, + GSourceCallbackFuncs *callback_funcs) +{ + GMainContext *context; + gpointer old_cb_data; + GSourceCallbackFuncs *old_cb_funcs; + + g_return_if_fail (source != NULL); + g_return_if_fail (callback_funcs != NULL || callback_data == NULL); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + old_cb_data = source->callback_data; + old_cb_funcs = source->callback_funcs; + + source->callback_data = callback_data; + source->callback_funcs = callback_funcs; + + if (context) + UNLOCK_CONTEXT (context); + + if (old_cb_funcs) + old_cb_funcs->unref (old_cb_data); +} + +static void +g_source_callback_ref (gpointer cb_data) +{ + GSourceCallback *callback = cb_data; + + callback->ref_count++; +} + + +static void +g_source_callback_unref (gpointer cb_data) +{ + GSourceCallback *callback = cb_data; + + callback->ref_count--; + if (callback->ref_count == 0) + { + if (callback->notify) + callback->notify (callback->data); + g_free (callback); + } +} + +static void +g_source_callback_get (gpointer cb_data, + GSource *source, + GSourceFunc *func, + gpointer *data) +{ + GSourceCallback *callback = cb_data; + + *func = callback->func; + *data = callback->data; +} + +static GSourceCallbackFuncs g_source_callback_funcs = { + g_source_callback_ref, + g_source_callback_unref, + g_source_callback_get, +}; + +/** + * g_source_set_callback: + * @source: the source + * @func: a callback function + * @data: the data to pass to callback function + * @notify: a function to call when @data is no longer in use, or %NULL. + * + * Sets the callback function for a source. The callback for a source is + * called from the source's dispatch function. + * + * The exact type of @func depends on the type of source; ie. you + * should not count on @func being called with @data as its first + * parameter. + * + * Typically, you won't use this function. Instead use functions specific + * to the type of source you are using. + **/ +void +g_source_set_callback (GSource *source, + GSourceFunc func, + gpointer data, + GDestroyNotify notify) +{ + GSourceCallback *new_callback; + + g_return_if_fail (source != NULL); + + new_callback = g_new (GSourceCallback, 1); + + new_callback->ref_count = 1; + new_callback->func = func; + new_callback->data = data; + new_callback->notify = notify; + + g_source_set_callback_indirect (source, new_callback, &g_source_callback_funcs); +} + + +/** + * g_source_set_funcs: + * @source: a #GSource + * @funcs: the new #GSourceFuncs + * + * Sets the source functions (can be used to override + * default implementations) of an unattached source. + * + * Since: 2.12 + */ +void +g_source_set_funcs (GSource *source, + GSourceFuncs *funcs) +{ + g_return_if_fail (source != NULL); + g_return_if_fail (source->context == NULL); + g_return_if_fail (source->ref_count > 0); + g_return_if_fail (funcs != NULL); + + source->source_funcs = funcs; +} + +/** + * g_source_set_priority: + * @source: a #GSource + * @priority: the new priority. + * + * Sets the priority of a source. While the main loop is being + * run, a source will be dispatched if it is ready to be dispatched and no sources + * at a higher (numerically smaller) priority are ready to be dispatched. + **/ +void +g_source_set_priority (GSource *source, + gint priority) +{ + GSList *tmp_list; + GMainContext *context; + + g_return_if_fail (source != NULL); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->priority = priority; + + if (context) + { + /* Remove the source from the context's source and then + * add it back so it is sorted in the correct plcae + */ + g_source_list_remove (source, source->context); + g_source_list_add (source, source->context); + + if (!SOURCE_BLOCKED (source)) + { + tmp_list = source->poll_fds; + while (tmp_list) + { + g_main_context_remove_poll_unlocked (context, tmp_list->data); + g_main_context_add_poll_unlocked (context, priority, tmp_list->data); + + tmp_list = tmp_list->next; + } + } + + UNLOCK_CONTEXT (source->context); + } +} + +/** + * g_source_get_priority: + * @source: a #GSource + * + * Gets the priority of a source. + * + * Return value: the priority of the source + **/ +gint +g_source_get_priority (GSource *source) +{ + g_return_val_if_fail (source != NULL, 0); + + return source->priority; +} + +/** + * g_source_set_can_recurse: + * @source: a #GSource + * @can_recurse: whether recursion is allowed for this source + * + * Sets whether a source can be called recursively. If @can_recurse is + * %TRUE, then while the source is being dispatched then this source + * will be processed normally. Otherwise, all processing of this + * source is blocked until the dispatch function returns. + **/ +void +g_source_set_can_recurse (GSource *source, + gboolean can_recurse) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + if (can_recurse) + source->flags |= G_SOURCE_CAN_RECURSE; + else + source->flags &= ~G_SOURCE_CAN_RECURSE; + + if (context) + UNLOCK_CONTEXT (context); +} + +/** + * g_source_get_can_recurse: + * @source: a #GSource + * + * Checks whether a source is allowed to be called recursively. + * see g_source_set_can_recurse(). + * + * Return value: whether recursion is allowed. + **/ +gboolean +g_source_get_can_recurse (GSource *source) +{ + g_return_val_if_fail (source != NULL, FALSE); + + return (source->flags & G_SOURCE_CAN_RECURSE) != 0; +} + +/** + * g_source_ref: + * @source: a #GSource + * + * Increases the reference count on a source by one. + * + * Return value: @source + **/ +GSource * +g_source_ref (GSource *source) +{ + GMainContext *context; + + g_return_val_if_fail (source != NULL, NULL); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->ref_count++; + + if (context) + UNLOCK_CONTEXT (context); + + return source; +} + +/* g_source_unref() but possible to call within context lock + */ +static void +g_source_unref_internal (GSource *source, + GMainContext *context, + gboolean have_lock) +{ + gpointer old_cb_data = NULL; + GSourceCallbackFuncs *old_cb_funcs = NULL; + + g_return_if_fail (source != NULL); + + if (!have_lock && context) + LOCK_CONTEXT (context); + + source->ref_count--; + if (source->ref_count == 0) + { + old_cb_data = source->callback_data; + old_cb_funcs = source->callback_funcs; + + source->callback_data = NULL; + source->callback_funcs = NULL; + + if (context && !SOURCE_DESTROYED (source)) + { + g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!"); + source->ref_count++; + } + else if (context) + g_source_list_remove (source, context); + + if (source->source_funcs->finalize) + source->source_funcs->finalize (source); + + g_slist_free (source->poll_fds); + source->poll_fds = NULL; + g_free (source); + } + + if (!have_lock && context) + UNLOCK_CONTEXT (context); + + if (old_cb_funcs) + { + if (have_lock) + UNLOCK_CONTEXT (context); + + old_cb_funcs->unref (old_cb_data); + + if (have_lock) + LOCK_CONTEXT (context); + } +} + +/** + * g_source_unref: + * @source: a #GSource + * + * Decreases the reference count of a source by one. If the + * resulting reference count is zero the source and associated + * memory will be destroyed. + **/ +void +g_source_unref (GSource *source) +{ + g_return_if_fail (source != NULL); + + g_source_unref_internal (source, source->context, FALSE); +} + +/** + * g_main_context_find_source_by_id: + * @context: a #GMainContext (if %NULL, the default context will be used) + * @source_id: the source ID, as returned by g_source_get_id(). + * + * Finds a #GSource given a pair of context and ID. + * + * Return value: the #GSource if found, otherwise, %NULL + **/ +GSource * +g_main_context_find_source_by_id (GMainContext *context, + guint source_id) +{ + GSource *source; + + g_return_val_if_fail (source_id > 0, NULL); + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + source = context->source_list; + while (source) + { + if (!SOURCE_DESTROYED (source) && + source->source_id == source_id) + break; + source = source->next; + } + + UNLOCK_CONTEXT (context); + + return source; +} + +/** + * g_main_context_find_source_by_funcs_user_data: + * @context: a #GMainContext (if %NULL, the default context will be used). + * @funcs: the @source_funcs passed to g_source_new(). + * @user_data: the user data from the callback. + * + * Finds a source with the given source functions and user data. If + * multiple sources exist with the same source function and user data, + * the first one found will be returned. + * + * Return value: the source, if one was found, otherwise %NULL + **/ +GSource * +g_main_context_find_source_by_funcs_user_data (GMainContext *context, + GSourceFuncs *funcs, + gpointer user_data) +{ + GSource *source; + + g_return_val_if_fail (funcs != NULL, NULL); + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + source = context->source_list; + while (source) + { + if (!SOURCE_DESTROYED (source) && + source->source_funcs == funcs && + source->callback_funcs) + { + GSourceFunc callback; + gpointer callback_data; + + source->callback_funcs->get (source->callback_data, source, &callback, &callback_data); + + if (callback_data == user_data) + break; + } + source = source->next; + } + + UNLOCK_CONTEXT (context); + + return source; +} + +/** + * g_main_context_find_source_by_user_data: + * @context: a #GMainContext + * @user_data: the user_data for the callback. + * + * Finds a source with the given user data for the callback. If + * multiple sources exist with the same user data, the first + * one found will be returned. + * + * Return value: the source, if one was found, otherwise %NULL + **/ +GSource * +g_main_context_find_source_by_user_data (GMainContext *context, + gpointer user_data) +{ + GSource *source; + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + source = context->source_list; + while (source) + { + if (!SOURCE_DESTROYED (source) && + source->callback_funcs) + { + GSourceFunc callback; + gpointer callback_data = NULL; + + source->callback_funcs->get (source->callback_data, source, &callback, &callback_data); + + if (callback_data == user_data) + break; + } + source = source->next; + } + + UNLOCK_CONTEXT (context); + + return source; +} + +/** + * g_source_remove: + * @tag: the ID of the source to remove. + * + * Removes the source with the given id from the default main context. + * The id of + * a #GSource is given by g_source_get_id(), or will be returned by the + * functions g_source_attach(), g_idle_add(), g_idle_add_full(), + * g_timeout_add(), g_timeout_add_full(), g_child_watch_add(), + * g_child_watch_add_full(), g_io_add_watch(), and g_io_add_watch_full(). + * + * See also g_source_destroy(). You must use g_source_destroy() for sources + * added to a non-default main context. + * + * Return value: %TRUE if the source was found and removed. + **/ +gboolean +g_source_remove (guint tag) +{ + GSource *source; + + g_return_val_if_fail (tag > 0, FALSE); + + source = g_main_context_find_source_by_id (NULL, tag); + if (source) + g_source_destroy (source); + + return source != NULL; +} + +/** + * g_source_remove_by_user_data: + * @user_data: the user_data for the callback. + * + * Removes a source from the default main loop context given the user + * data for the callback. If multiple sources exist with the same user + * data, only one will be destroyed. + * + * Return value: %TRUE if a source was found and removed. + **/ +gboolean +g_source_remove_by_user_data (gpointer user_data) +{ + GSource *source; + + source = g_main_context_find_source_by_user_data (NULL, user_data); + if (source) + { + g_source_destroy (source); + return TRUE; + } + else + return FALSE; +} + +/** + * g_source_remove_by_funcs_user_data: + * @funcs: The @source_funcs passed to g_source_new() + * @user_data: the user data for the callback + * + * Removes a source from the default main loop context given the + * source functions and user data. If multiple sources exist with the + * same source functions and user data, only one will be destroyed. + * + * Return value: %TRUE if a source was found and removed. + **/ +gboolean +g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, + gpointer user_data) +{ + GSource *source; + + g_return_val_if_fail (funcs != NULL, FALSE); + + source = g_main_context_find_source_by_funcs_user_data (NULL, funcs, user_data); + if (source) + { + g_source_destroy (source); + return TRUE; + } + else + return FALSE; +} + +/** + * g_get_current_time: + * @result: #GTimeVal structure in which to store current time. + * + * Equivalent to the UNIX gettimeofday() function, but portable. + **/ +void +g_get_current_time (GTimeVal *result) +{ +#ifndef G_OS_WIN32 + struct timeval r; + + g_return_if_fail (result != NULL); + + /*this is required on alpha, there the timeval structs are int's + not longs and a cast only would fail horribly*/ + gettimeofday (&r, NULL); + result->tv_sec = r.tv_sec; + result->tv_usec = r.tv_usec; +#else + FILETIME ft; + guint64 time64; + + g_return_if_fail (result != NULL); + + GetSystemTimeAsFileTime (&ft); + memmove (&time64, &ft, sizeof (FILETIME)); + + /* Convert from 100s of nanoseconds since 1601-01-01 + * to Unix epoch. Yes, this is Y2038 unsafe. + */ + time64 -= G_GINT64_CONSTANT (116444736000000000); + time64 /= 10; + + result->tv_sec = time64 / 1000000; + result->tv_usec = time64 % 1000000; +#endif +} + +static void +g_main_dispatch_free (gpointer dispatch) +{ + g_slice_free (GMainDispatch, dispatch); +} + +/* Running the main loop */ + +static GMainDispatch * +get_dispatch (void) +{ + static GStaticPrivate depth_private = G_STATIC_PRIVATE_INIT; + GMainDispatch *dispatch = g_static_private_get (&depth_private); + if (!dispatch) + { + dispatch = g_slice_new0 (GMainDispatch); + g_static_private_set (&depth_private, dispatch, g_main_dispatch_free); + } + + return dispatch; +} + +/** + * g_main_depth: + * + * Returns the depth of the stack of calls to + * g_main_context_dispatch() on any #GMainContext in the current thread. + * That is, when called from the toplevel, it gives 0. When + * called from within a callback from g_main_context_iteration() + * (or g_main_loop_run(), etc.) it returns 1. When called from within + * a callback to a recursive call to g_main_context_iterate(), + * it returns 2. And so forth. + * + * This function is useful in a situation like the following: + * Imagine an extremely simple "garbage collected" system. + * + * |[ + * static GList *free_list; + * + * gpointer + * allocate_memory (gsize size) + * { + * gpointer result = g_malloc (size); + * free_list = g_list_prepend (free_list, result); + * return result; + * } + * + * void + * free_allocated_memory (void) + * { + * GList *l; + * for (l = free_list; l; l = l->next); + * g_free (l->data); + * g_list_free (free_list); + * free_list = NULL; + * } + * + * [...] + * + * while (TRUE); + * { + * g_main_context_iteration (NULL, TRUE); + * free_allocated_memory(); + * } + * ]| + * + * This works from an application, however, if you want to do the same + * thing from a library, it gets more difficult, since you no longer + * control the main loop. You might think you can simply use an idle + * function to make the call to free_allocated_memory(), but that + * doesn't work, since the idle function could be called from a + * recursive callback. This can be fixed by using g_main_depth() + * + * |[ + * gpointer + * allocate_memory (gsize size) + * { + * FreeListBlock *block = g_new (FreeListBlock, 1); + * block->mem = g_malloc (size); + * block->depth = g_main_depth (); + * free_list = g_list_prepend (free_list, block); + * return block->mem; + * } + * + * void + * free_allocated_memory (void) + * { + * GList *l; + * + * int depth = g_main_depth (); + * for (l = free_list; l; ); + * { + * GList *next = l->next; + * FreeListBlock *block = l->data; + * if (block->depth > depth) + * { + * g_free (block->mem); + * g_free (block); + * free_list = g_list_delete_link (free_list, l); + * } + * + * l = next; + * } + * } + * ]| + * + * There is a temptation to use g_main_depth() to solve + * problems with reentrancy. For instance, while waiting for data + * to be received from the network in response to a menu item, + * the menu item might be selected again. It might seem that + * one could make the menu item's callback return immediately + * and do nothing if g_main_depth() returns a value greater than 1. + * However, this should be avoided since the user then sees selecting + * the menu item do nothing. Furthermore, you'll find yourself adding + * these checks all over your code, since there are doubtless many, + * many things that the user could do. Instead, you can use the + * following techniques: + * + * + * + * + * Use gtk_widget_set_sensitive() or modal dialogs to prevent + * the user from interacting with elements while the main + * loop is recursing. + * + * + * + * + * Avoid main loop recursion in situations where you can't handle + * arbitrary callbacks. Instead, structure your code so that you + * simply return to the main loop and then get called again when + * there is more work to do. + * + * + * + * + * Return value: The main loop recursion level in the current thread + **/ +int +g_main_depth (void) +{ + GMainDispatch *dispatch = get_dispatch (); + return dispatch->depth; +} + +/** + * g_main_current_source: + * + * Returns the currently firing source for this thread. + * + * Return value: The currently firing source or %NULL. + * + * Since: 2.12 + */ +GSource * +g_main_current_source (void) +{ + GMainDispatch *dispatch = get_dispatch (); + return dispatch->dispatching_sources ? dispatch->dispatching_sources->data : NULL; +} + +/** + * g_source_is_destroyed: + * @source: a #GSource + * + * Returns whether @source has been destroyed. + * + * This is important when you operate upon your objects + * from within idle handlers, but may have freed the object + * before the dispatch of your idle handler. + * + * |[ + * static gboolean + * idle_callback (gpointer data) + * { + * SomeWidget *self = data; + * + * GDK_THREADS_ENTER (); + * /* do stuff with self */ + * self->idle_id = 0; + * GDK_THREADS_LEAVE (); + * + * return FALSE; + * } + * + * static void + * some_widget_do_stuff_later (SomeWidget *self) + * { + * self->idle_id = g_idle_add (idle_callback, self); + * } + * + * static void + * some_widget_finalize (GObject *object) + * { + * SomeWidget *self = SOME_WIDGET (object); + * + * if (self->idle_id) + * g_source_remove (self->idle_id); + * + * G_OBJECT_CLASS (parent_class)->finalize (object); + * } + * ]| + * + * This will fail in a multi-threaded application if the + * widget is destroyed before the idle handler fires due + * to the use after free in the callback. A solution, to + * this particular problem, is to check to if the source + * has already been destroy within the callback. + * + * |[ + * static gboolean + * idle_callback (gpointer data) + * { + * SomeWidget *self = data; + * + * GDK_THREADS_ENTER (); + * if (!g_source_is_destroyed (g_main_current_source ())) + * { + * /* do stuff with self */ + * } + * GDK_THREADS_LEAVE (); + * + * return FALSE; + * } + * ]| + * + * Return value: %TRUE if the source has been destroyed + * + * Since: 2.12 + */ +gboolean +g_source_is_destroyed (GSource *source) +{ + return SOURCE_DESTROYED (source); +} + + +/* Temporarily remove all this source's file descriptors from the + * poll(), so that if data comes available for one of the file descriptors + * we don't continually spin in the poll() + */ +/* HOLDS: source->context's lock */ +static void +block_source (GSource *source) +{ + GSList *tmp_list; + + g_return_if_fail (!SOURCE_BLOCKED (source)); + + tmp_list = source->poll_fds; + while (tmp_list) + { + g_main_context_remove_poll_unlocked (source->context, tmp_list->data); + tmp_list = tmp_list->next; + } +} + +/* HOLDS: source->context's lock */ +static void +unblock_source (GSource *source) +{ + GSList *tmp_list; + + g_return_if_fail (!SOURCE_BLOCKED (source)); /* Source already unblocked */ + g_return_if_fail (!SOURCE_DESTROYED (source)); + + tmp_list = source->poll_fds; + while (tmp_list) + { + g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data); + tmp_list = tmp_list->next; + } +} + +/* HOLDS: context's lock */ +static void +g_main_dispatch (GMainContext *context) +{ + GMainDispatch *current = get_dispatch (); + guint i; + + for (i = 0; i < context->pending_dispatches->len; i++) + { + GSource *source = context->pending_dispatches->pdata[i]; + + context->pending_dispatches->pdata[i] = NULL; + g_assert (source); + + source->flags &= ~G_SOURCE_READY; + + if (!SOURCE_DESTROYED (source)) + { + gboolean was_in_call; + gpointer user_data = NULL; + GSourceFunc callback = NULL; + GSourceCallbackFuncs *cb_funcs; + gpointer cb_data; + gboolean need_destroy; + + gboolean (*dispatch) (GSource *, + GSourceFunc, + gpointer); + GSList current_source_link; + + dispatch = source->source_funcs->dispatch; + cb_funcs = source->callback_funcs; + cb_data = source->callback_data; + + if (cb_funcs) + cb_funcs->ref (cb_data); + + if ((source->flags & G_SOURCE_CAN_RECURSE) == 0) + block_source (source); + + was_in_call = source->flags & G_HOOK_FLAG_IN_CALL; + source->flags |= G_HOOK_FLAG_IN_CALL; + + if (cb_funcs) + cb_funcs->get (cb_data, source, &callback, &user_data); + + UNLOCK_CONTEXT (context); + + current->depth++; + /* The on-stack allocation of the GSList is unconventional, but + * we know that the lifetime of the link is bounded to this + * function as the link is kept in a thread specific list and + * not manipulated outside of this function and its descendants. + * Avoiding the overhead of a g_slist_alloc() is useful as many + * applications do little more than dispatch events. + * + * This is a performance hack - do not revert to g_slist_prepend()! + */ + current_source_link.data = source; + current_source_link.next = current->dispatching_sources; + current->dispatching_sources = ¤t_source_link; + need_destroy = ! dispatch (source, + callback, + user_data); + g_assert (current->dispatching_sources == ¤t_source_link); + current->dispatching_sources = current_source_link.next; + current->depth--; + + if (cb_funcs) + cb_funcs->unref (cb_data); + + LOCK_CONTEXT (context); + + if (!was_in_call) + source->flags &= ~G_HOOK_FLAG_IN_CALL; + + if ((source->flags & G_SOURCE_CAN_RECURSE) == 0 && + !SOURCE_DESTROYED (source)) + unblock_source (source); + + /* Note: this depends on the fact that we can't switch + * sources from one main context to another + */ + if (need_destroy && !SOURCE_DESTROYED (source)) + { + g_assert (source->context == context); + g_source_destroy_internal (source, context, TRUE); + } + } + + SOURCE_UNREF (source, context); + } + + g_ptr_array_set_size (context->pending_dispatches, 0); +} + +/* Holds context's lock */ +static inline GSource * +next_valid_source (GMainContext *context, + GSource *source) +{ + GSource *new_source = source ? source->next : context->source_list; + + while (new_source) + { + if (!SOURCE_DESTROYED (new_source)) + { + new_source->ref_count++; + break; + } + + new_source = new_source->next; + } + + if (source) + SOURCE_UNREF (source, context); + + return new_source; +} + +/** + * g_main_context_acquire: + * @context: a #GMainContext + * + * Tries to become the owner of the specified context. + * If some other thread is the owner of the context, + * returns %FALSE immediately. Ownership is properly + * recursive: the owner can require ownership again + * and will release ownership when g_main_context_release() + * is called as many times as g_main_context_acquire(). + * + * You must be the owner of a context before you + * can call g_main_context_prepare(), g_main_context_query(), + * g_main_context_check(), g_main_context_dispatch(). + * + * Return value: %TRUE if the operation succeeded, and + * this thread is now the owner of @context. + **/ +gboolean +g_main_context_acquire (GMainContext *context) +{ +#ifdef G_THREADS_ENABLED + gboolean result = FALSE; + GThread *self = G_THREAD_SELF; + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + if (!context->owner) + { + context->owner = self; + g_assert (context->owner_count == 0); + } + + if (context->owner == self) + { + context->owner_count++; + result = TRUE; + } + + UNLOCK_CONTEXT (context); + + return result; +#else /* !G_THREADS_ENABLED */ + return TRUE; +#endif /* G_THREADS_ENABLED */ +} + +/** + * g_main_context_release: + * @context: a #GMainContext + * + * Releases ownership of a context previously acquired by this thread + * with g_main_context_acquire(). If the context was acquired multiple + * times, the ownership will be released only when g_main_context_release() + * is called as many times as it was acquired. + **/ +void +g_main_context_release (GMainContext *context) +{ +#ifdef G_THREADS_ENABLED + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + context->owner_count--; + if (context->owner_count == 0) + { + context->owner = NULL; + + if (context->waiters) + { + GMainWaiter *waiter = context->waiters->data; + gboolean loop_internal_waiter = + (waiter->mutex == g_static_mutex_get_mutex (&context->mutex)); + context->waiters = g_slist_delete_link (context->waiters, + context->waiters); + if (!loop_internal_waiter) + g_mutex_lock (waiter->mutex); + + g_cond_signal (waiter->cond); + + if (!loop_internal_waiter) + g_mutex_unlock (waiter->mutex); + } + } + + UNLOCK_CONTEXT (context); +#endif /* G_THREADS_ENABLED */ +} + +/** + * g_main_context_wait: + * @context: a #GMainContext + * @cond: a condition variable + * @mutex: a mutex, currently held + * + * Tries to become the owner of the specified context, + * as with g_main_context_acquire(). But if another thread + * is the owner, atomically drop @mutex and wait on @cond until + * that owner releases ownership or until @cond is signaled, then + * try again (once) to become the owner. + * + * Return value: %TRUE if the operation succeeded, and + * this thread is now the owner of @context. + **/ +gboolean +g_main_context_wait (GMainContext *context, + GCond *cond, + GMutex *mutex) +{ +#ifdef G_THREADS_ENABLED + gboolean result = FALSE; + GThread *self = G_THREAD_SELF; + gboolean loop_internal_waiter; + + if (context == NULL) + context = g_main_context_default (); + + loop_internal_waiter = (mutex == g_static_mutex_get_mutex (&context->mutex)); + + if (!loop_internal_waiter) + LOCK_CONTEXT (context); + + if (context->owner && context->owner != self) + { + GMainWaiter waiter; + + waiter.cond = cond; + waiter.mutex = mutex; + + context->waiters = g_slist_append (context->waiters, &waiter); + + if (!loop_internal_waiter) + UNLOCK_CONTEXT (context); + g_cond_wait (cond, mutex); + if (!loop_internal_waiter) + LOCK_CONTEXT (context); + + context->waiters = g_slist_remove (context->waiters, &waiter); + } + + if (!context->owner) + { + context->owner = self; + g_assert (context->owner_count == 0); + } + + if (context->owner == self) + { + context->owner_count++; + result = TRUE; + } + + if (!loop_internal_waiter) + UNLOCK_CONTEXT (context); + + return result; +#else /* !G_THREADS_ENABLED */ + return TRUE; +#endif /* G_THREADS_ENABLED */ +} + +/** + * g_main_context_prepare: + * @context: a #GMainContext + * @priority: location to store priority of highest priority + * source already ready. + * + * Prepares to poll sources within a main loop. The resulting information + * for polling is determined by calling g_main_context_query (). + * + * Return value: %TRUE if some source is ready to be dispatched + * prior to polling. + **/ +gboolean +g_main_context_prepare (GMainContext *context, + gint *priority) +{ + gint i; + gint n_ready = 0; + gint current_priority = G_MAXINT; + GSource *source; + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + context->time_is_current = FALSE; + + if (context->in_check_or_prepare) + { + g_warning ("g_main_context_prepare() called recursively from within a source's check() or " + "prepare() member."); + UNLOCK_CONTEXT (context); + return FALSE; + } + +#ifdef G_THREADS_ENABLED + if (context->poll_waiting) + { + g_warning("g_main_context_prepare(): main loop already active in another thread"); + UNLOCK_CONTEXT (context); + return FALSE; + } + + context->poll_waiting = TRUE; +#endif /* G_THREADS_ENABLED */ + +#if 0 + /* If recursing, finish up current dispatch, before starting over */ + if (context->pending_dispatches) + { + if (dispatch) + g_main_dispatch (context, ¤t_time); + + UNLOCK_CONTEXT (context); + return TRUE; + } +#endif + + /* If recursing, clear list of pending dispatches */ + + for (i = 0; i < context->pending_dispatches->len; i++) + { + if (context->pending_dispatches->pdata[i]) + SOURCE_UNREF ((GSource *)context->pending_dispatches->pdata[i], context); + } + g_ptr_array_set_size (context->pending_dispatches, 0); + + /* Prepare all sources */ + + context->timeout = -1; + + source = next_valid_source (context, NULL); + while (source) + { + gint source_timeout = -1; + + if ((n_ready > 0) && (source->priority > current_priority)) + { + SOURCE_UNREF (source, context); + break; + } + if (SOURCE_BLOCKED (source)) + goto next; + + if (!(source->flags & G_SOURCE_READY)) + { + gboolean result; + gboolean (*prepare) (GSource *source, + gint *timeout); + + prepare = source->source_funcs->prepare; + context->in_check_or_prepare++; + UNLOCK_CONTEXT (context); + + result = (*prepare) (source, &source_timeout); + + LOCK_CONTEXT (context); + context->in_check_or_prepare--; + + if (result) + source->flags |= G_SOURCE_READY; + } + + if (source->flags & G_SOURCE_READY) + { + n_ready++; + current_priority = source->priority; + context->timeout = 0; + } + + if (source_timeout >= 0) + { + if (context->timeout < 0) + context->timeout = source_timeout; + else + context->timeout = MIN (context->timeout, source_timeout); + } + + next: + source = next_valid_source (context, source); + } + + UNLOCK_CONTEXT (context); + + if (priority) + *priority = current_priority; + + return (n_ready > 0); +} + +/** + * g_main_context_query: + * @context: a #GMainContext + * @max_priority: maximum priority source to check + * @timeout_: location to store timeout to be used in polling + * @fds: location to store #GPollFD records that need to be polled. + * @n_fds: length of @fds. + * + * Determines information necessary to poll this main loop. + * + * Return value: the number of records actually stored in @fds, + * or, if more than @n_fds records need to be stored, the number + * of records that need to be stored. + **/ +gint +g_main_context_query (GMainContext *context, + gint max_priority, + gint *timeout, + GPollFD *fds, + gint n_fds) +{ + gint n_poll; + GPollRec *pollrec; + + LOCK_CONTEXT (context); + + pollrec = context->poll_records; + n_poll = 0; + while (pollrec && max_priority >= pollrec->priority) + { + /* We need to include entries with fd->events == 0 in the array because + * otherwise if the application changes fd->events behind our back and + * makes it non-zero, we'll be out of sync when we check the fds[] array. + * (Changing fd->events after adding an FD wasn't an anticipated use of + * this API, but it occurs in practice.) */ + if (n_poll < n_fds) + { + fds[n_poll].fd = pollrec->fd->fd; + /* In direct contradiction to the Unix98 spec, IRIX runs into + * difficulty if you pass in POLLERR, POLLHUP or POLLNVAL + * flags in the events field of the pollfd while it should + * just ignoring them. So we mask them out here. + */ + fds[n_poll].events = pollrec->fd->events & ~(G_IO_ERR|G_IO_HUP|G_IO_NVAL); + fds[n_poll].revents = 0; + } + + pollrec = pollrec->next; + n_poll++; + } + +#ifdef G_THREADS_ENABLED + context->poll_changed = FALSE; +#endif + + if (timeout) + { + *timeout = context->timeout; + if (*timeout != 0) + context->time_is_current = FALSE; + } + + UNLOCK_CONTEXT (context); + + return n_poll; +} + +/** + * g_main_context_check: + * @context: a #GMainContext + * @max_priority: the maximum numerical priority of sources to check + * @fds: array of #GPollFD's that was passed to the last call to + * g_main_context_query() + * @n_fds: return value of g_main_context_query() + * + * Passes the results of polling back to the main loop. + * + * Return value: %TRUE if some sources are ready to be dispatched. + **/ +gboolean +g_main_context_check (GMainContext *context, + gint max_priority, + GPollFD *fds, + gint n_fds) +{ + GSource *source; + GPollRec *pollrec; + gint n_ready = 0; + gint i; + + LOCK_CONTEXT (context); + + if (context->in_check_or_prepare) + { + g_warning ("g_main_context_check() called recursively from within a source's check() or " + "prepare() member."); + UNLOCK_CONTEXT (context); + return FALSE; + } + +#ifdef G_THREADS_ENABLED + if (!context->poll_waiting) + { +#ifndef G_OS_WIN32 + gchar a; + read (context->wake_up_pipe[0], &a, 1); +#endif + } + else + context->poll_waiting = FALSE; + + /* If the set of poll file descriptors changed, bail out + * and let the main loop rerun + */ + if (context->poll_changed) + { + UNLOCK_CONTEXT (context); + return FALSE; + } +#endif /* G_THREADS_ENABLED */ + + pollrec = context->poll_records; + i = 0; + while (i < n_fds) + { + if (pollrec->fd->events) + pollrec->fd->revents = fds[i].revents; + + pollrec = pollrec->next; + i++; + } + + source = next_valid_source (context, NULL); + while (source) + { + if ((n_ready > 0) && (source->priority > max_priority)) + { + SOURCE_UNREF (source, context); + break; + } + if (SOURCE_BLOCKED (source)) + goto next; + + if (!(source->flags & G_SOURCE_READY)) + { + gboolean result; + gboolean (*check) (GSource *source); + + check = source->source_funcs->check; + + context->in_check_or_prepare++; + UNLOCK_CONTEXT (context); + + result = (*check) (source); + + LOCK_CONTEXT (context); + context->in_check_or_prepare--; + + if (result) + source->flags |= G_SOURCE_READY; + } + + if (source->flags & G_SOURCE_READY) + { + source->ref_count++; + g_ptr_array_add (context->pending_dispatches, source); + + n_ready++; + + /* never dispatch sources with less priority than the first + * one we choose to dispatch + */ + max_priority = source->priority; + } + + next: + source = next_valid_source (context, source); + } + + UNLOCK_CONTEXT (context); + + return n_ready > 0; +} + +/** + * g_main_context_dispatch: + * @context: a #GMainContext + * + * Dispatches all pending sources. + **/ +void +g_main_context_dispatch (GMainContext *context) +{ + LOCK_CONTEXT (context); + + if (context->pending_dispatches->len > 0) + { + g_main_dispatch (context); + } + + UNLOCK_CONTEXT (context); +} + +/* HOLDS context lock */ +static gboolean +g_main_context_iterate (GMainContext *context, + gboolean block, + gboolean dispatch, + GThread *self) +{ + gint max_priority; + gint timeout; + gboolean some_ready; + gint nfds, allocated_nfds; + GPollFD *fds = NULL; + + UNLOCK_CONTEXT (context); + +#ifdef G_THREADS_ENABLED + if (!g_main_context_acquire (context)) + { + gboolean got_ownership; + + LOCK_CONTEXT (context); + + g_return_val_if_fail (g_thread_supported (), FALSE); + + if (!block) + return FALSE; + + if (!context->cond) + context->cond = g_cond_new (); + + got_ownership = g_main_context_wait (context, + context->cond, + g_static_mutex_get_mutex (&context->mutex)); + + if (!got_ownership) + return FALSE; + } + else + LOCK_CONTEXT (context); +#endif /* G_THREADS_ENABLED */ + + if (!context->cached_poll_array) + { + context->cached_poll_array_size = context->n_poll_records; + context->cached_poll_array = g_new (GPollFD, context->n_poll_records); + } + + allocated_nfds = context->cached_poll_array_size; + fds = context->cached_poll_array; + + UNLOCK_CONTEXT (context); + + g_main_context_prepare (context, &max_priority); + + while ((nfds = g_main_context_query (context, max_priority, &timeout, fds, + allocated_nfds)) > allocated_nfds) + { + LOCK_CONTEXT (context); + g_free (fds); + context->cached_poll_array_size = allocated_nfds = nfds; + context->cached_poll_array = fds = g_new (GPollFD, nfds); + UNLOCK_CONTEXT (context); + } + + if (!block) + timeout = 0; + + g_main_context_poll (context, timeout, max_priority, fds, nfds); + + some_ready = g_main_context_check (context, max_priority, fds, nfds); + + if (dispatch) + g_main_context_dispatch (context); + +#ifdef G_THREADS_ENABLED + g_main_context_release (context); +#endif /* G_THREADS_ENABLED */ + + LOCK_CONTEXT (context); + + return some_ready; +} + +/** + * g_main_context_pending: + * @context: a #GMainContext (if %NULL, the default context will be used) + * + * Checks if any sources have pending events for the given context. + * + * Return value: %TRUE if events are pending. + **/ +gboolean +g_main_context_pending (GMainContext *context) +{ + gboolean retval; + + if (!context) + context = g_main_context_default(); + + LOCK_CONTEXT (context); + retval = g_main_context_iterate (context, FALSE, FALSE, G_THREAD_SELF); + UNLOCK_CONTEXT (context); + + return retval; +} + +/** + * g_main_context_iteration: + * @context: a #GMainContext (if %NULL, the default context will be used) + * @may_block: whether the call may block. + * + * Runs a single iteration for the given main loop. This involves + * checking to see if any event sources are ready to be processed, + * then if no events sources are ready and @may_block is %TRUE, waiting + * for a source to become ready, then dispatching the highest priority + * events sources that are ready. Otherwise, if @may_block is %FALSE + * sources are not waited to become ready, only those highest priority + * events sources will be dispatched (if any), that are ready at this + * given moment without further waiting. + * + * Note that even when @may_block is %TRUE, it is still possible for + * g_main_context_iteration() to return %FALSE, since the the wait may + * be interrupted for other reasons than an event source becoming ready. + * + * Return value: %TRUE if events were dispatched. + **/ +gboolean +g_main_context_iteration (GMainContext *context, gboolean may_block) +{ + gboolean retval; + + if (!context) + context = g_main_context_default(); + + LOCK_CONTEXT (context); + retval = g_main_context_iterate (context, may_block, TRUE, G_THREAD_SELF); + UNLOCK_CONTEXT (context); + + return retval; +} + +/** + * g_main_loop_new: + * @context: a #GMainContext (if %NULL, the default context will be used). + * @is_running: set to %TRUE to indicate that the loop is running. This + * is not very important since calling g_main_loop_run() will set this to + * %TRUE anyway. + * + * Creates a new #GMainLoop structure. + * + * Return value: a new #GMainLoop. + **/ +GMainLoop * +g_main_loop_new (GMainContext *context, + gboolean is_running) +{ + GMainLoop *loop; + + if (!context) + context = g_main_context_default(); + + g_main_context_ref (context); + + loop = g_new0 (GMainLoop, 1); + loop->context = context; + loop->is_running = is_running != FALSE; + loop->ref_count = 1; + + return loop; +} + +/** + * g_main_loop_ref: + * @loop: a #GMainLoop + * + * Increases the reference count on a #GMainLoop object by one. + * + * Return value: @loop + **/ +GMainLoop * +g_main_loop_ref (GMainLoop *loop) +{ + g_return_val_if_fail (loop != NULL, NULL); + g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL); + + g_atomic_int_inc (&loop->ref_count); + + return loop; +} + +/** + * g_main_loop_unref: + * @loop: a #GMainLoop + * + * Decreases the reference count on a #GMainLoop object by one. If + * the result is zero, free the loop and free all associated memory. + **/ +void +g_main_loop_unref (GMainLoop *loop) +{ + g_return_if_fail (loop != NULL); + g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0); + + if (!g_atomic_int_dec_and_test (&loop->ref_count)) + return; + + g_main_context_unref (loop->context); + g_free (loop); +} + +/** + * g_main_loop_run: + * @loop: a #GMainLoop + * + * Runs a main loop until g_main_loop_quit() is called on the loop. + * If this is called for the thread of the loop's #GMainContext, + * it will process events from the loop, otherwise it will + * simply wait. + **/ +void +g_main_loop_run (GMainLoop *loop) +{ + GThread *self = G_THREAD_SELF; + + g_return_if_fail (loop != NULL); + g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0); + +#ifdef G_THREADS_ENABLED + if (!g_main_context_acquire (loop->context)) + { + gboolean got_ownership = FALSE; + + /* Another thread owns this context */ + if (!g_thread_supported ()) + { + g_warning ("g_main_loop_run() was called from second thread but " + "g_thread_init() was never called."); + return; + } + + LOCK_CONTEXT (loop->context); + + g_atomic_int_inc (&loop->ref_count); + + if (!loop->is_running) + loop->is_running = TRUE; + + if (!loop->context->cond) + loop->context->cond = g_cond_new (); + + while (loop->is_running && !got_ownership) + got_ownership = g_main_context_wait (loop->context, + loop->context->cond, + g_static_mutex_get_mutex (&loop->context->mutex)); + + if (!loop->is_running) + { + UNLOCK_CONTEXT (loop->context); + if (got_ownership) + g_main_context_release (loop->context); + g_main_loop_unref (loop); + return; + } + + g_assert (got_ownership); + } + else + LOCK_CONTEXT (loop->context); +#endif /* G_THREADS_ENABLED */ + + if (loop->context->in_check_or_prepare) + { + g_warning ("g_main_loop_run(): called recursively from within a source's " + "check() or prepare() member, iteration not possible."); + return; + } + + g_atomic_int_inc (&loop->ref_count); + loop->is_running = TRUE; + while (loop->is_running) + g_main_context_iterate (loop->context, TRUE, TRUE, self); + + UNLOCK_CONTEXT (loop->context); + +#ifdef G_THREADS_ENABLED + g_main_context_release (loop->context); +#endif /* G_THREADS_ENABLED */ + + g_main_loop_unref (loop); +} + +/** + * g_main_loop_quit: + * @loop: a #GMainLoop + * + * Stops a #GMainLoop from running. Any calls to g_main_loop_run() + * for the loop will return. + * + * Note that sources that have already been dispatched when + * g_main_loop_quit() is called will still be executed. + **/ +void +g_main_loop_quit (GMainLoop *loop) +{ + g_return_if_fail (loop != NULL); + g_return_if_fail (g_atomic_int_get (&loop->ref_count) > 0); + + LOCK_CONTEXT (loop->context); + loop->is_running = FALSE; + g_main_context_wakeup_unlocked (loop->context); + +#ifdef G_THREADS_ENABLED + if (loop->context->cond) + g_cond_broadcast (loop->context->cond); +#endif /* G_THREADS_ENABLED */ + + UNLOCK_CONTEXT (loop->context); +} + +/** + * g_main_loop_is_running: + * @loop: a #GMainLoop. + * + * Checks to see if the main loop is currently being run via g_main_loop_run(). + * + * Return value: %TRUE if the mainloop is currently being run. + **/ +gboolean +g_main_loop_is_running (GMainLoop *loop) +{ + g_return_val_if_fail (loop != NULL, FALSE); + g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, FALSE); + + return loop->is_running; +} + +/** + * g_main_loop_get_context: + * @loop: a #GMainLoop. + * + * Returns the #GMainContext of @loop. + * + * Return value: the #GMainContext of @loop + **/ +GMainContext * +g_main_loop_get_context (GMainLoop *loop) +{ + g_return_val_if_fail (loop != NULL, NULL); + g_return_val_if_fail (g_atomic_int_get (&loop->ref_count) > 0, NULL); + + return loop->context; +} + +/* HOLDS: context's lock */ +static void +g_main_context_poll (GMainContext *context, + gint timeout, + gint priority, + GPollFD *fds, + gint n_fds) +{ +#ifdef G_MAIN_POLL_DEBUG + GTimer *poll_timer; + GPollRec *pollrec; + gint i; +#endif + + GPollFunc poll_func; + + if (n_fds || timeout != 0) + { +#ifdef G_MAIN_POLL_DEBUG + if (_g_main_poll_debug) + { + g_print ("polling context=%p n=%d timeout=%d\n", + context, n_fds, timeout); + poll_timer = g_timer_new (); + } +#endif + + LOCK_CONTEXT (context); + + poll_func = context->poll_func; + + UNLOCK_CONTEXT (context); + if ((*poll_func) (fds, n_fds, timeout) < 0 && errno != EINTR) + { +#ifndef G_OS_WIN32 + g_warning ("poll(2) failed due to: %s.", + g_strerror (errno)); +#else + /* If g_poll () returns -1, it has already called g_warning() */ +#endif + } + +#ifdef G_MAIN_POLL_DEBUG + if (_g_main_poll_debug) + { + LOCK_CONTEXT (context); + + g_print ("g_main_poll(%d) timeout: %d - elapsed %12.10f seconds", + n_fds, + timeout, + g_timer_elapsed (poll_timer, NULL)); + g_timer_destroy (poll_timer); + pollrec = context->poll_records; + + while (pollrec != NULL) + { + i = 0; + while (i < n_fds) + { + if (fds[i].fd == pollrec->fd->fd && + pollrec->fd->events && + fds[i].revents) + { + g_print (" [" G_POLLFD_FORMAT " :", fds[i].fd); + if (fds[i].revents & G_IO_IN) + g_print ("i"); + if (fds[i].revents & G_IO_OUT) + g_print ("o"); + if (fds[i].revents & G_IO_PRI) + g_print ("p"); + if (fds[i].revents & G_IO_ERR) + g_print ("e"); + if (fds[i].revents & G_IO_HUP) + g_print ("h"); + if (fds[i].revents & G_IO_NVAL) + g_print ("n"); + g_print ("]"); + } + i++; + } + pollrec = pollrec->next; + } + g_print ("\n"); + + UNLOCK_CONTEXT (context); + } +#endif + } /* if (n_fds || timeout != 0) */ +} + +/** + * g_main_context_add_poll: + * @context: a #GMainContext (or %NULL for the default context) + * @fd: a #GPollFD structure holding information about a file + * descriptor to watch. + * @priority: the priority for this file descriptor which should be + * the same as the priority used for g_source_attach() to ensure that the + * file descriptor is polled whenever the results may be needed. + * + * Adds a file descriptor to the set of file descriptors polled for + * this context. This will very seldomly be used directly. Instead + * a typical event source will use g_source_add_poll() instead. + **/ +void +g_main_context_add_poll (GMainContext *context, + GPollFD *fd, + gint priority) +{ + if (!context) + context = g_main_context_default (); + + g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); + g_return_if_fail (fd); + + LOCK_CONTEXT (context); + g_main_context_add_poll_unlocked (context, priority, fd); + UNLOCK_CONTEXT (context); +} + +/* HOLDS: main_loop_lock */ +static void +g_main_context_add_poll_unlocked (GMainContext *context, + gint priority, + GPollFD *fd) +{ + GPollRec *lastrec, *pollrec; + GPollRec *newrec = g_slice_new (GPollRec); + + /* This file descriptor may be checked before we ever poll */ + fd->revents = 0; + newrec->fd = fd; + newrec->priority = priority; + + lastrec = NULL; + pollrec = context->poll_records; + while (pollrec && priority >= pollrec->priority) + { + lastrec = pollrec; + pollrec = pollrec->next; + } + + if (lastrec) + lastrec->next = newrec; + else + context->poll_records = newrec; + + newrec->next = pollrec; + + context->n_poll_records++; + +#ifdef G_THREADS_ENABLED + context->poll_changed = TRUE; + + /* Now wake up the main loop if it is waiting in the poll() */ + g_main_context_wakeup_unlocked (context); +#endif +} + +/** + * g_main_context_remove_poll: + * @context:a #GMainContext + * @fd: a #GPollFD descriptor previously added with g_main_context_add_poll() + * + * Removes file descriptor from the set of file descriptors to be + * polled for a particular context. + **/ +void +g_main_context_remove_poll (GMainContext *context, + GPollFD *fd) +{ + if (!context) + context = g_main_context_default (); + + g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); + g_return_if_fail (fd); + + LOCK_CONTEXT (context); + g_main_context_remove_poll_unlocked (context, fd); + UNLOCK_CONTEXT (context); +} + +static void +g_main_context_remove_poll_unlocked (GMainContext *context, + GPollFD *fd) +{ + GPollRec *pollrec, *lastrec; + + lastrec = NULL; + pollrec = context->poll_records; + + while (pollrec) + { + if (pollrec->fd == fd) + { + if (lastrec != NULL) + lastrec->next = pollrec->next; + else + context->poll_records = pollrec->next; + + g_slice_free (GPollRec, pollrec); + + context->n_poll_records--; + break; + } + lastrec = pollrec; + pollrec = pollrec->next; + } + +#ifdef G_THREADS_ENABLED + context->poll_changed = TRUE; + + /* Now wake up the main loop if it is waiting in the poll() */ + g_main_context_wakeup_unlocked (context); +#endif +} + +/** + * g_source_get_current_time: + * @source: a #GSource + * @timeval: #GTimeVal structure in which to store current time. + * + * Gets the "current time" to be used when checking + * this source. The advantage of calling this function over + * calling g_get_current_time() directly is that when + * checking multiple sources, GLib can cache a single value + * instead of having to repeatedly get the system time. + **/ +void +g_source_get_current_time (GSource *source, + GTimeVal *timeval) +{ + GMainContext *context; + + g_return_if_fail (source->context != NULL); + + context = source->context; + + LOCK_CONTEXT (context); + + if (!context->time_is_current) + { + g_get_current_time (&context->current_time); + context->time_is_current = TRUE; + } + + *timeval = context->current_time; + + UNLOCK_CONTEXT (context); +} + +/** + * g_main_context_set_poll_func: + * @context: a #GMainContext + * @func: the function to call to poll all file descriptors + * + * Sets the function to use to handle polling of file descriptors. It + * will be used instead of the poll() system call + * (or GLib's replacement function, which is used where + * poll() isn't available). + * + * This function could possibly be used to integrate the GLib event + * loop with an external event loop. + **/ +void +g_main_context_set_poll_func (GMainContext *context, + GPollFunc func) +{ + if (!context) + context = g_main_context_default (); + + g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); + + LOCK_CONTEXT (context); + + if (func) + context->poll_func = func; + else + context->poll_func = g_poll; + + UNLOCK_CONTEXT (context); +} + +/** + * g_main_context_get_poll_func: + * @context: a #GMainContext + * + * Gets the poll function set by g_main_context_set_poll_func(). + * + * Return value: the poll function + **/ +GPollFunc +g_main_context_get_poll_func (GMainContext *context) +{ + GPollFunc result; + + if (!context) + context = g_main_context_default (); + + g_return_val_if_fail (g_atomic_int_get (&context->ref_count) > 0, NULL); + + LOCK_CONTEXT (context); + result = context->poll_func; + UNLOCK_CONTEXT (context); + + return result; +} + +/* HOLDS: context's lock */ +/* Wake the main loop up from a poll() */ +static void +g_main_context_wakeup_unlocked (GMainContext *context) +{ +#ifdef G_THREADS_ENABLED + if (g_thread_supported() && context->poll_waiting) + { + context->poll_waiting = FALSE; +#ifndef G_OS_WIN32 + write (context->wake_up_pipe[1], "A", 1); +#else + ReleaseSemaphore (context->wake_up_semaphore, 1, NULL); +#endif + } +#endif +} + +/** + * g_main_context_wakeup: + * @context: a #GMainContext + * + * If @context is currently waiting in a poll(), interrupt + * the poll(), and continue the iteration process. + **/ +void +g_main_context_wakeup (GMainContext *context) +{ + if (!context) + context = g_main_context_default (); + + g_return_if_fail (g_atomic_int_get (&context->ref_count) > 0); + + LOCK_CONTEXT (context); + g_main_context_wakeup_unlocked (context); + UNLOCK_CONTEXT (context); +} + +/** + * g_main_context_is_owner: + * @context: a #GMainContext + * + * Determines whether this thread holds the (recursive) + * ownership of this #GMaincontext. This is useful to + * know before waiting on another thread that may be + * blocking to get ownership of @context. + * + * Returns: %TRUE if current thread is owner of @context. + * + * Since: 2.10 + **/ +gboolean +g_main_context_is_owner (GMainContext *context) +{ + gboolean is_owner; + + if (!context) + context = g_main_context_default (); + +#ifdef G_THREADS_ENABLED + LOCK_CONTEXT (context); + is_owner = context->owner == G_THREAD_SELF; + UNLOCK_CONTEXT (context); +#else + is_owner = TRUE; +#endif + + return is_owner; +} + +/* Timeouts */ + +static void +g_timeout_set_expiration (GTimeoutSource *timeout_source, + GTimeVal *current_time) +{ + guint seconds = timeout_source->interval / 1000; + guint msecs = timeout_source->interval - seconds * 1000; + + timeout_source->expiration.tv_sec = current_time->tv_sec + seconds; + timeout_source->expiration.tv_usec = current_time->tv_usec + msecs * 1000; + if (timeout_source->expiration.tv_usec >= 1000000) + { + timeout_source->expiration.tv_usec -= 1000000; + timeout_source->expiration.tv_sec++; + } + if (timer_perturb==-1) + { + /* + * we want a per machine/session unique 'random' value; try the dbus + * address first, that has a UUID in it. If there is no dbus, use the + * hostname for hashing. + */ + const char *session_bus_address = g_getenv ("DBUS_SESSION_BUS_ADDRESS"); + if (!session_bus_address) + session_bus_address = g_getenv ("HOSTNAME"); + if (session_bus_address) + timer_perturb = ABS ((gint) g_str_hash (session_bus_address)); + else + timer_perturb = 0; + } + if (timeout_source->granularity) + { + gint remainder; + gint gran; /* in usecs */ + gint perturb; + + gran = timeout_source->granularity * 1000; + perturb = timer_perturb % gran; + /* + * We want to give each machine a per machine pertubation; + * shift time back first, and forward later after the rounding + */ + + timeout_source->expiration.tv_usec -= perturb; + if (timeout_source->expiration.tv_usec < 0) + { + timeout_source->expiration.tv_usec += 1000000; + timeout_source->expiration.tv_sec--; + } + + remainder = timeout_source->expiration.tv_usec % gran; + if (remainder >= gran/4) /* round up */ + timeout_source->expiration.tv_usec += gran; + timeout_source->expiration.tv_usec -= remainder; + /* shift back */ + timeout_source->expiration.tv_usec += perturb; + + /* the rounding may have overflown tv_usec */ + while (timeout_source->expiration.tv_usec > 1000000) + { + timeout_source->expiration.tv_usec -= 1000000; + timeout_source->expiration.tv_sec++; + } + } +} + +static gboolean +g_timeout_prepare (GSource *source, + gint *timeout) +{ + glong sec; + glong msec; + GTimeVal current_time; + + GTimeoutSource *timeout_source = (GTimeoutSource *)source; + + g_source_get_current_time (source, ¤t_time); + + sec = timeout_source->expiration.tv_sec - current_time.tv_sec; + msec = (timeout_source->expiration.tv_usec - current_time.tv_usec) / 1000; + + /* We do the following in a rather convoluted fashion to deal with + * the fact that we don't have an integral type big enough to hold + * the difference of two timevals in millseconds. + */ + if (sec < 0 || (sec == 0 && msec < 0)) + msec = 0; + else + { + glong interval_sec = timeout_source->interval / 1000; + glong interval_msec = timeout_source->interval % 1000; + + if (msec < 0) + { + msec += 1000; + sec -= 1; + } + + if (sec > interval_sec || + (sec == interval_sec && msec > interval_msec)) + { + /* The system time has been set backwards, so we + * reset the expiration time to now + timeout_source->interval; + * this at least avoids hanging for long periods of time. + */ + g_timeout_set_expiration (timeout_source, ¤t_time); + msec = MIN (G_MAXINT, timeout_source->interval); + } + else + { + msec = MIN (G_MAXINT, (guint)msec + 1000 * (guint)sec); + } + } + + *timeout = (gint)msec; + + return msec == 0; +} + +static gboolean +g_timeout_check (GSource *source) +{ + GTimeVal current_time; + GTimeoutSource *timeout_source = (GTimeoutSource *)source; + + g_source_get_current_time (source, ¤t_time); + + return ((timeout_source->expiration.tv_sec < current_time.tv_sec) || + ((timeout_source->expiration.tv_sec == current_time.tv_sec) && + (timeout_source->expiration.tv_usec <= current_time.tv_usec))); +} + +static gboolean +g_timeout_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GTimeoutSource *timeout_source = (GTimeoutSource *)source; + + if (!callback) + { + g_warning ("Timeout source dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + if (callback (user_data)) + { + GTimeVal current_time; + + g_source_get_current_time (source, ¤t_time); + g_timeout_set_expiration (timeout_source, ¤t_time); + + return TRUE; + } + else + return FALSE; +} + +/** + * g_timeout_source_new: + * @interval: the timeout interval in milliseconds. + * + * Creates a new timeout source. + * + * The source will not initially be associated with any #GMainContext + * and must be added to one with g_source_attach() before it will be + * executed. + * + * Return value: the newly-created timeout source + **/ +GSource * +g_timeout_source_new (guint interval) +{ + GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource)); + GTimeoutSource *timeout_source = (GTimeoutSource *)source; + GTimeVal current_time; + + timeout_source->interval = interval; + + g_get_current_time (¤t_time); + g_timeout_set_expiration (timeout_source, ¤t_time); + + return source; +} + +/** + * g_timeout_source_new_seconds: + * @interval: the timeout interval in seconds + * + * Creates a new timeout source. + * + * The source will not initially be associated with any #GMainContext + * and must be added to one with g_source_attach() before it will be + * executed. + * + * The scheduling granularity/accuracy of this timeout source will be + * in seconds. + * + * Return value: the newly-created timeout source + * + * Since: 2.14 + **/ +GSource * +g_timeout_source_new_seconds (guint interval) +{ + GSource *source = g_source_new (&g_timeout_funcs, sizeof (GTimeoutSource)); + GTimeoutSource *timeout_source = (GTimeoutSource *)source; + GTimeVal current_time; + + timeout_source->interval = 1000*interval; + timeout_source->granularity = 1000; + + g_get_current_time (¤t_time); + g_timeout_set_expiration (timeout_source, ¤t_time); + + return source; +} + + +/** + * g_timeout_add_full: + * @priority: the priority of the timeout source. Typically this will be in + * the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH. + * @interval: the time between calls to the function, in milliseconds + * (1/1000ths of a second) + * @function: function to call + * @data: data to pass to @function + * @notify: function to call when the timeout is removed, or %NULL + * + * Sets a function to be called at regular intervals, with the given + * priority. The function is called repeatedly until it returns + * %FALSE, at which point the timeout is automatically destroyed and + * the function will not be called again. The @notify function is + * called when the timeout is destroyed. The first call to the + * function will be at the end of the first @interval. + * + * Note that timeout functions may be delayed, due to the processing of other + * event sources. Thus they should not be relied on for precise timing. + * After each call to the timeout function, the time of the next + * timeout is recalculated based on the current time and the given interval + * (it does not try to 'catch up' time lost in delays). + * + * This internally creates a main loop source using g_timeout_source_new() + * and attaches it to the main loop context using g_source_attach(). You can + * do these steps manually if you need greater control. + * + * Return value: the ID (greater than 0) of the event source. + **/ +guint +g_timeout_add_full (gint priority, + guint interval, + GSourceFunc function, + gpointer data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (function != NULL, 0); + + source = g_timeout_source_new (interval); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + + g_source_set_callback (source, function, data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_timeout_add: + * @interval: the time between calls to the function, in milliseconds + * (1/1000ths of a second) + * @function: function to call + * @data: data to pass to @function + * + * Sets a function to be called at regular intervals, with the default + * priority, #G_PRIORITY_DEFAULT. The function is called repeatedly + * until it returns %FALSE, at which point the timeout is automatically + * destroyed and the function will not be called again. The first call + * to the function will be at the end of the first @interval. + * + * Note that timeout functions may be delayed, due to the processing of other + * event sources. Thus they should not be relied on for precise timing. + * After each call to the timeout function, the time of the next + * timeout is recalculated based on the current time and the given interval + * (it does not try to 'catch up' time lost in delays). + * + * If you want to have a timer in the "seconds" range and do not care + * about the exact time of the first call of the timer, use the + * g_timeout_add_seconds() function; this function allows for more + * optimizations and more efficient system power usage. + * + * This internally creates a main loop source using g_timeout_source_new() + * and attaches it to the main loop context using g_source_attach(). You can + * do these steps manually if you need greater control. + * + * Return value: the ID (greater than 0) of the event source. + **/ +guint +g_timeout_add (guint32 interval, + GSourceFunc function, + gpointer data) +{ + return g_timeout_add_full (G_PRIORITY_DEFAULT, + interval, function, data, NULL); +} + +/** + * g_timeout_add_seconds_full: + * @priority: the priority of the timeout source. Typically this will be in + * the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH. + * @interval: the time between calls to the function, in seconds + * @function: function to call + * @data: data to pass to @function + * @notify: function to call when the timeout is removed, or %NULL + * + * Sets a function to be called at regular intervals, with @priority. + * The function is called repeatedly until it returns %FALSE, at which + * point the timeout is automatically destroyed and the function will + * not be called again. + * + * Unlike g_timeout_add(), this function operates at whole second granularity. + * The initial starting point of the timer is determined by the implementation + * and the implementation is expected to group multiple timers together so that + * they fire all at the same time. + * To allow this grouping, the @interval to the first timer is rounded + * and can deviate up to one second from the specified interval. + * Subsequent timer iterations will generally run at the specified interval. + * + * Note that timeout functions may be delayed, due to the processing of other + * event sources. Thus they should not be relied on for precise timing. + * After each call to the timeout function, the time of the next + * timeout is recalculated based on the current time and the given @interval + * + * If you want timing more precise than whole seconds, use g_timeout_add() + * instead. + * + * The grouping of timers to fire at the same time results in a more power + * and CPU efficient behavior so if your timer is in multiples of seconds + * and you don't require the first timer exactly one second from now, the + * use of g_timeout_add_seconds() is preferred over g_timeout_add(). + * + * This internally creates a main loop source using + * g_timeout_source_new_seconds() and attaches it to the main loop context + * using g_source_attach(). You can do these steps manually if you need + * greater control. + * + * Return value: the ID (greater than 0) of the event source. + * + * Since: 2.14 + **/ +guint +g_timeout_add_seconds_full (gint priority, + guint32 interval, + GSourceFunc function, + gpointer data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (function != NULL, 0); + + source = g_timeout_source_new_seconds (interval); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + + g_source_set_callback (source, function, data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_timeout_add_seconds: + * @interval: the time between calls to the function, in seconds + * @function: function to call + * @data: data to pass to @function + * + * Sets a function to be called at regular intervals with the default + * priority, #G_PRIORITY_DEFAULT. The function is called repeatedly until + * it returns %FALSE, at which point the timeout is automatically destroyed + * and the function will not be called again. + * + * This internally creates a main loop source using + * g_timeout_source_new_seconds() and attaches it to the main loop context + * using g_source_attach(). You can do these steps manually if you need + * greater control. Also see g_timout_add_seconds_full(). + * + * Return value: the ID (greater than 0) of the event source. + * + * Since: 2.14 + **/ +guint +g_timeout_add_seconds (guint interval, + GSourceFunc function, + gpointer data) +{ + g_return_val_if_fail (function != NULL, 0); + + return g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, interval, function, data, NULL); +} + +/* Child watch functions */ + +#ifdef G_OS_WIN32 + +static gboolean +g_child_watch_prepare (GSource *source, + gint *timeout) +{ + *timeout = -1; + return FALSE; +} + + +static gboolean +g_child_watch_check (GSource *source) +{ + GChildWatchSource *child_watch_source; + gboolean child_exited; + + child_watch_source = (GChildWatchSource *) source; + + child_exited = child_watch_source->poll.revents & G_IO_IN; + + if (child_exited) + { + DWORD child_status; + + /* + * Note: We do _not_ check for the special value of STILL_ACTIVE + * since we know that the process has exited and doing so runs into + * problems if the child process "happens to return STILL_ACTIVE(259)" + * as Microsoft's Platform SDK puts it. + */ + if (!GetExitCodeProcess (child_watch_source->pid, &child_status)) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + g_warning (G_STRLOC ": GetExitCodeProcess() failed: %s", emsg); + g_free (emsg); + + child_watch_source->child_status = -1; + } + else + child_watch_source->child_status = child_status; + } + + return child_exited; +} + +#else /* G_OS_WIN32 */ + +static gboolean +check_for_child_exited (GSource *source) +{ + GChildWatchSource *child_watch_source; + gint count; + + /* protect against another SIGCHLD in the middle of this call */ + count = child_watch_count; + + child_watch_source = (GChildWatchSource *) source; + + if (child_watch_source->child_exited) + return TRUE; + + if (child_watch_source->count < count) + { + gint child_status; + + if (waitpid (child_watch_source->pid, &child_status, WNOHANG) > 0) + { + child_watch_source->child_status = child_status; + child_watch_source->child_exited = TRUE; + } + child_watch_source->count = count; + } + + return child_watch_source->child_exited; +} + +static gboolean +g_child_watch_prepare (GSource *source, + gint *timeout) +{ + *timeout = -1; + + return check_for_child_exited (source); +} + + +static gboolean +g_child_watch_check (GSource *source) +{ + return check_for_child_exited (source); +} + +#endif /* G_OS_WIN32 */ + +static gboolean +g_child_watch_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GChildWatchSource *child_watch_source; + GChildWatchFunc child_watch_callback = (GChildWatchFunc) callback; + + child_watch_source = (GChildWatchSource *) source; + + if (!callback) + { + g_warning ("Child watch source dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + (child_watch_callback) (child_watch_source->pid, child_watch_source->child_status, user_data); + + /* We never keep a child watch source around as the child is gone */ + return FALSE; +} + +#ifndef G_OS_WIN32 + +static void +g_child_watch_signal_handler (int signum) +{ + child_watch_count ++; + + if (child_watch_init_state == CHILD_WATCH_INITIALIZED_THREADED) + { + write (child_watch_wake_up_pipe[1], "B", 1); + } + else + { + /* We count on the signal interrupting the poll in the same thread. + */ + } +} + +static void +g_child_watch_source_init_single (void) +{ + struct sigaction action; + + g_assert (! g_thread_supported()); + g_assert (child_watch_init_state == CHILD_WATCH_UNINITIALIZED); + + child_watch_init_state = CHILD_WATCH_INITIALIZED_SINGLE; + + action.sa_handler = g_child_watch_signal_handler; + sigemptyset (&action.sa_mask); + action.sa_flags = SA_NOCLDSTOP; + sigaction (SIGCHLD, &action, NULL); +} + +G_GNUC_NORETURN static gpointer +child_watch_helper_thread (gpointer data) +{ + while (1) + { + gchar b[20]; + GSList *list; + + read (child_watch_wake_up_pipe[0], b, 20); + + /* We were woken up. Wake up all other contexts in all other threads */ + G_LOCK (main_context_list); + for (list = main_context_list; list; list = list->next) + { + GMainContext *context; + + context = list->data; + if (g_atomic_int_get (&context->ref_count) > 0) + /* Due to racing conditions we can find ref_count == 0, in + * that case, however, the context is still not destroyed + * and no poll can be active, otherwise the ref_count + * wouldn't be 0 */ + g_main_context_wakeup (context); + } + G_UNLOCK (main_context_list); + } +} + +static void +g_child_watch_source_init_multi_threaded (void) +{ + GError *error = NULL; + struct sigaction action; + + g_assert (g_thread_supported()); + + if (pipe (child_watch_wake_up_pipe) < 0) + g_error ("Cannot create wake up pipe: %s\n", g_strerror (errno)); + fcntl (child_watch_wake_up_pipe[1], F_SETFL, O_NONBLOCK | fcntl (child_watch_wake_up_pipe[1], F_GETFL)); + + /* We create a helper thread that polls on the wakeup pipe indefinitely */ + /* FIXME: Think this through for races */ + if (g_thread_create (child_watch_helper_thread, NULL, FALSE, &error) == NULL) + g_error ("Cannot create a thread to monitor child exit status: %s\n", error->message); + child_watch_init_state = CHILD_WATCH_INITIALIZED_THREADED; + + action.sa_handler = g_child_watch_signal_handler; + sigemptyset (&action.sa_mask); + action.sa_flags = SA_RESTART | SA_NOCLDSTOP; + sigaction (SIGCHLD, &action, NULL); +} + +static void +g_child_watch_source_init_promote_single_to_threaded (void) +{ + g_child_watch_source_init_multi_threaded (); +} + +static void +g_child_watch_source_init (void) +{ + if (g_thread_supported()) + { + if (child_watch_init_state == CHILD_WATCH_UNINITIALIZED) + g_child_watch_source_init_multi_threaded (); + else if (child_watch_init_state == CHILD_WATCH_INITIALIZED_SINGLE) + g_child_watch_source_init_promote_single_to_threaded (); + } + else + { + if (child_watch_init_state == CHILD_WATCH_UNINITIALIZED) + g_child_watch_source_init_single (); + } +} + +#endif /* !G_OS_WIN32 */ + +/** + * g_child_watch_source_new: + * @pid: process to watch. On POSIX the pid of a child process. On + * Windows a handle for a process (which doesn't have to be a child). + * + * Creates a new child_watch source. + * + * The source will not initially be associated with any #GMainContext + * and must be added to one with g_source_attach() before it will be + * executed. + * + * Note that child watch sources can only be used in conjunction with + * g_spawn... when the %G_SPAWN_DO_NOT_REAP_CHILD + * flag is used. + * + * Note that on platforms where #GPid must be explicitly closed + * (see g_spawn_close_pid()) @pid must not be closed while the + * source is still active. Typically, you will want to call + * g_spawn_close_pid() in the callback function for the source. + * + * Note further that using g_child_watch_source_new() is not + * compatible with calling waitpid(-1) in + * the application. Calling waitpid() for individual pids will + * still work fine. + * + * Return value: the newly-created child watch source + * + * Since: 2.4 + **/ +GSource * +g_child_watch_source_new (GPid pid) +{ + GSource *source = g_source_new (&g_child_watch_funcs, sizeof (GChildWatchSource)); + GChildWatchSource *child_watch_source = (GChildWatchSource *)source; + +#ifdef G_OS_WIN32 + child_watch_source->poll.fd = (gintptr) pid; + child_watch_source->poll.events = G_IO_IN; + + g_source_add_poll (source, &child_watch_source->poll); +#else /* G_OS_WIN32 */ + g_child_watch_source_init (); +#endif /* G_OS_WIN32 */ + + child_watch_source->pid = pid; + + return source; +} + +/** + * g_child_watch_add_full: + * @priority: the priority of the idle source. Typically this will be in the + * range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE. + * @pid: process to watch. On POSIX the pid of a child process. On + * Windows a handle for a process (which doesn't have to be a child). + * @function: function to call + * @data: data to pass to @function + * @notify: function to call when the idle is removed, or %NULL + * + * Sets a function to be called when the child indicated by @pid + * exits, at the priority @priority. + * + * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes() + * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to + * the spawn function for the child watching to work. + * + * Note that on platforms where #GPid must be explicitly closed + * (see g_spawn_close_pid()) @pid must not be closed while the + * source is still active. Typically, you will want to call + * g_spawn_close_pid() in the callback function for the source. + * + * GLib supports only a single callback per process id. + * + * This internally creates a main loop source using + * g_child_watch_source_new() and attaches it to the main loop context + * using g_source_attach(). You can do these steps manually if you + * need greater control. + * + * Return value: the ID (greater than 0) of the event source. + * + * Since: 2.4 + **/ +guint +g_child_watch_add_full (gint priority, + GPid pid, + GChildWatchFunc function, + gpointer data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (function != NULL, 0); + + source = g_child_watch_source_new (pid); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + + g_source_set_callback (source, (GSourceFunc) function, data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_child_watch_add: + * @pid: process id to watch. On POSIX the pid of a child process. On + * Windows a handle for a process (which doesn't have to be a child). + * @function: function to call + * @data: data to pass to @function + * + * Sets a function to be called when the child indicated by @pid + * exits, at a default priority, #G_PRIORITY_DEFAULT. + * + * If you obtain @pid from g_spawn_async() or g_spawn_async_with_pipes() + * you will need to pass #G_SPAWN_DO_NOT_REAP_CHILD as flag to + * the spawn function for the child watching to work. + * + * Note that on platforms where #GPid must be explicitly closed + * (see g_spawn_close_pid()) @pid must not be closed while the + * source is still active. Typically, you will want to call + * g_spawn_close_pid() in the callback function for the source. + * + * GLib supports only a single callback per process id. + * + * This internally creates a main loop source using + * g_child_watch_source_new() and attaches it to the main loop context + * using g_source_attach(). You can do these steps manually if you + * need greater control. + * + * Return value: the ID (greater than 0) of the event source. + * + * Since: 2.4 + **/ +guint +g_child_watch_add (GPid pid, + GChildWatchFunc function, + gpointer data) +{ + return g_child_watch_add_full (G_PRIORITY_DEFAULT, pid, function, data, NULL); +} + + +/* Idle functions */ + +static gboolean +g_idle_prepare (GSource *source, + gint *timeout) +{ + *timeout = 0; + + return TRUE; +} + +static gboolean +g_idle_check (GSource *source) +{ + return TRUE; +} + +static gboolean +g_idle_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + if (!callback) + { + g_warning ("Idle source dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + return callback (user_data); +} + +/** + * g_idle_source_new: + * + * Creates a new idle source. + * + * The source will not initially be associated with any #GMainContext + * and must be added to one with g_source_attach() before it will be + * executed. Note that the default priority for idle sources is + * %G_PRIORITY_DEFAULT_IDLE, as compared to other sources which + * have a default priority of %G_PRIORITY_DEFAULT. + * + * Return value: the newly-created idle source + **/ +GSource * +g_idle_source_new (void) +{ + GSource *source; + + source = g_source_new (&g_idle_funcs, sizeof (GSource)); + g_source_set_priority (source, G_PRIORITY_DEFAULT_IDLE); + + return source; +} + +/** + * g_idle_add_full: + * @priority: the priority of the idle source. Typically this will be in the + * range between #G_PRIORITY_DEFAULT_IDLE and #G_PRIORITY_HIGH_IDLE. + * @function: function to call + * @data: data to pass to @function + * @notify: function to call when the idle is removed, or %NULL + * + * Adds a function to be called whenever there are no higher priority + * events pending. If the function returns %FALSE it is automatically + * removed from the list of event sources and will not be called again. + * + * This internally creates a main loop source using g_idle_source_new() + * and attaches it to the main loop context using g_source_attach(). + * You can do these steps manually if you need greater control. + * + * Return value: the ID (greater than 0) of the event source. + **/ +guint +g_idle_add_full (gint priority, + GSourceFunc function, + gpointer data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (function != NULL, 0); + + source = g_idle_source_new (); + + if (priority != G_PRIORITY_DEFAULT_IDLE) + g_source_set_priority (source, priority); + + g_source_set_callback (source, function, data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_idle_add: + * @function: function to call + * @data: data to pass to @function. + * + * Adds a function to be called whenever there are no higher priority + * events pending to the default main loop. The function is given the + * default idle priority, #G_PRIORITY_DEFAULT_IDLE. If the function + * returns %FALSE it is automatically removed from the list of event + * sources and will not be called again. + * + * This internally creates a main loop source using g_idle_source_new() + * and attaches it to the main loop context using g_source_attach(). + * You can do these steps manually if you need greater control. + * + * Return value: the ID (greater than 0) of the event source. + **/ +guint +g_idle_add (GSourceFunc function, + gpointer data) +{ + return g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, function, data, NULL); +} + +/** + * g_idle_remove_by_data: + * @data: the data for the idle source's callback. + * + * Removes the idle function with the given data. + * + * Return value: %TRUE if an idle source was found and removed. + **/ +gboolean +g_idle_remove_by_data (gpointer data) +{ + return g_source_remove_by_funcs_user_data (&g_idle_funcs, data); +} + +#define __G_MAIN_C__ +#include "galiasdef.c" diff --git a/glib/gmain.h b/glib/gmain.h new file mode 100644 index 0000000..15fe54e --- /dev/null +++ b/glib/gmain.h @@ -0,0 +1,304 @@ +/* gmain.h - the GLib Main loop + * Copyright (C) 1998-2000 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MAIN_H__ +#define __G_MAIN_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct _GMainContext GMainContext; /* Opaque */ +typedef struct _GMainLoop GMainLoop; /* Opaque */ +typedef struct _GSource GSource; +typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs; +typedef struct _GSourceFuncs GSourceFuncs; + +typedef gboolean (*GSourceFunc) (gpointer data); +typedef void (*GChildWatchFunc) (GPid pid, + gint status, + gpointer data); +struct _GSource +{ + /*< private >*/ + gpointer callback_data; + GSourceCallbackFuncs *callback_funcs; + + GSourceFuncs *source_funcs; + guint ref_count; + + GMainContext *context; + + gint priority; + guint flags; + guint source_id; + + GSList *poll_fds; + + GSource *prev; + GSource *next; + + gpointer reserved1; + gpointer reserved2; +}; + +struct _GSourceCallbackFuncs +{ + void (*ref) (gpointer cb_data); + void (*unref) (gpointer cb_data); + void (*get) (gpointer cb_data, + GSource *source, + GSourceFunc *func, + gpointer *data); +}; + +typedef void (*GSourceDummyMarshal) (void); + +struct _GSourceFuncs +{ + gboolean (*prepare) (GSource *source, + gint *timeout_); + gboolean (*check) (GSource *source); + gboolean (*dispatch) (GSource *source, + GSourceFunc callback, + gpointer user_data); + void (*finalize) (GSource *source); /* Can be NULL */ + + /* For use by g_source_set_closure */ + GSourceFunc closure_callback; + GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */ +}; + +/* Standard priorities */ + +#define G_PRIORITY_HIGH -100 +#define G_PRIORITY_DEFAULT 0 +#define G_PRIORITY_HIGH_IDLE 100 +#define G_PRIORITY_DEFAULT_IDLE 200 +#define G_PRIORITY_LOW 300 + +/* GMainContext: */ + +GMainContext *g_main_context_new (void); +GMainContext *g_main_context_ref (GMainContext *context); +void g_main_context_unref (GMainContext *context); +GMainContext *g_main_context_default (void); + +gboolean g_main_context_iteration (GMainContext *context, + gboolean may_block); +gboolean g_main_context_pending (GMainContext *context); + +/* For implementation of legacy interfaces + */ +GSource *g_main_context_find_source_by_id (GMainContext *context, + guint source_id); +GSource *g_main_context_find_source_by_user_data (GMainContext *context, + gpointer user_data); +GSource *g_main_context_find_source_by_funcs_user_data (GMainContext *context, + GSourceFuncs *funcs, + gpointer user_data); + +/* Low level functions for implementing custom main loops. + */ +void g_main_context_wakeup (GMainContext *context); +gboolean g_main_context_acquire (GMainContext *context); +void g_main_context_release (GMainContext *context); +gboolean g_main_context_is_owner (GMainContext *context); +gboolean g_main_context_wait (GMainContext *context, + GCond *cond, + GMutex *mutex); + +gboolean g_main_context_prepare (GMainContext *context, + gint *priority); +gint g_main_context_query (GMainContext *context, + gint max_priority, + gint *timeout_, + GPollFD *fds, + gint n_fds); +gint g_main_context_check (GMainContext *context, + gint max_priority, + GPollFD *fds, + gint n_fds); +void g_main_context_dispatch (GMainContext *context); + +void g_main_context_set_poll_func (GMainContext *context, + GPollFunc func); +GPollFunc g_main_context_get_poll_func (GMainContext *context); + +/* Low level functions for use by source implementations + */ +void g_main_context_add_poll (GMainContext *context, + GPollFD *fd, + gint priority); +void g_main_context_remove_poll (GMainContext *context, + GPollFD *fd); + +gint g_main_depth (void); +GSource *g_main_current_source (void); + +/* GMainContexts for other threads + */ +void g_main_context_push_thread_default (GMainContext *context); +void g_main_context_pop_thread_default (GMainContext *context); +GMainContext *g_main_context_get_thread_default (void); + +/* GMainLoop: */ + +GMainLoop *g_main_loop_new (GMainContext *context, + gboolean is_running); +void g_main_loop_run (GMainLoop *loop); +void g_main_loop_quit (GMainLoop *loop); +GMainLoop *g_main_loop_ref (GMainLoop *loop); +void g_main_loop_unref (GMainLoop *loop); +gboolean g_main_loop_is_running (GMainLoop *loop); +GMainContext *g_main_loop_get_context (GMainLoop *loop); + +/* GSource: */ + +GSource *g_source_new (GSourceFuncs *source_funcs, + guint struct_size); +GSource *g_source_ref (GSource *source); +void g_source_unref (GSource *source); + +guint g_source_attach (GSource *source, + GMainContext *context); +void g_source_destroy (GSource *source); + +void g_source_set_priority (GSource *source, + gint priority); +gint g_source_get_priority (GSource *source); +void g_source_set_can_recurse (GSource *source, + gboolean can_recurse); +gboolean g_source_get_can_recurse (GSource *source); +guint g_source_get_id (GSource *source); + +GMainContext *g_source_get_context (GSource *source); + +void g_source_set_callback (GSource *source, + GSourceFunc func, + gpointer data, + GDestroyNotify notify); + +void g_source_set_funcs (GSource *source, + GSourceFuncs *funcs); +gboolean g_source_is_destroyed (GSource *source); + +/* Used to implement g_source_connect_closure and internally*/ +void g_source_set_callback_indirect (GSource *source, + gpointer callback_data, + GSourceCallbackFuncs *callback_funcs); + +void g_source_add_poll (GSource *source, + GPollFD *fd); +void g_source_remove_poll (GSource *source, + GPollFD *fd); + +void g_source_get_current_time (GSource *source, + GTimeVal *timeval); + + /* void g_source_connect_closure (GSource *source, + GClosure *closure); + */ + +/* Specific source types + */ +GSource *g_idle_source_new (void); +GSource *g_child_watch_source_new (GPid pid); +GSource *g_timeout_source_new (guint interval); +GSource *g_timeout_source_new_seconds (guint interval); + +/* Miscellaneous functions + */ +void g_get_current_time (GTimeVal *result); + +/* ============== Compat main loop stuff ================== */ + +#ifndef G_DISABLE_DEPRECATED + +/* Legacy names for GMainLoop functions + */ +#define g_main_new(is_running) g_main_loop_new (NULL, is_running); +#define g_main_run(loop) g_main_loop_run(loop) +#define g_main_quit(loop) g_main_loop_quit(loop) +#define g_main_destroy(loop) g_main_loop_unref(loop) +#define g_main_is_running(loop) g_main_loop_is_running(loop) + +/* Functions to manipulate the default main loop + */ + +#define g_main_iteration(may_block) g_main_context_iteration (NULL, may_block) +#define g_main_pending() g_main_context_pending (NULL) + +#define g_main_set_poll_func(func) g_main_context_set_poll_func (NULL, func) + +#endif /* G_DISABLE_DEPRECATED */ + +/* Source manipulation by ID */ +gboolean g_source_remove (guint tag); +gboolean g_source_remove_by_user_data (gpointer user_data); +gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, + gpointer user_data); + +/* Idles, child watchers and timeouts */ +guint g_timeout_add_full (gint priority, + guint interval, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +guint g_timeout_add (guint interval, + GSourceFunc function, + gpointer data); +guint g_timeout_add_seconds_full (gint priority, + guint interval, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +guint g_timeout_add_seconds (guint interval, + GSourceFunc function, + gpointer data); +guint g_child_watch_add_full (gint priority, + GPid pid, + GChildWatchFunc function, + gpointer data, + GDestroyNotify notify); +guint g_child_watch_add (GPid pid, + GChildWatchFunc function, + gpointer data); +guint g_idle_add (GSourceFunc function, + gpointer data); +guint g_idle_add_full (gint priority, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +gboolean g_idle_remove_by_data (gpointer data); + +/* Hook for GClosure / GSource integration. Don't touch */ +GLIB_VAR GSourceFuncs g_timeout_funcs; +GLIB_VAR GSourceFuncs g_child_watch_funcs; +GLIB_VAR GSourceFuncs g_idle_funcs; + +G_END_DECLS + +#endif /* __G_MAIN_H__ */ diff --git a/glib/gmappedfile.c b/glib/gmappedfile.c new file mode 100644 index 0000000..42f1322 --- /dev/null +++ b/glib/gmappedfile.c @@ -0,0 +1,348 @@ +/* GLIB - Library of useful routines for C programming + * gmappedfile.c: Simplified wrapper around the mmap() function. + * + * Copyright 2005 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_MMAP +#include +#endif + +#include "glibconfig.h" + +#ifdef G_OS_WIN32 +#include +#include + +#define fstat(a,b) _fstati64(a,b) +#define stat _stati64 + +#endif + +#include "gconvert.h" +#include "gerror.h" +#include "gfileutils.h" +#include "gmappedfile.h" +#include "gmem.h" +#include "gmessages.h" +#include "gstdio.h" +#include "gstrfuncs.h" +#include "gatomic.h" +#include "gbuffer.h" + +#include "glibintl.h" + +#include "galias.h" + +#ifndef _O_BINARY +#define _O_BINARY 0 +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif + +struct _GMappedFile +{ + gchar *contents; + gsize length; + gpointer free_func; + int ref_count; +#ifdef G_OS_WIN32 + HANDLE mapping; +#endif +}; + +/* Make sure the layout of GMappedFile is the same as GBuffer's */ +G_STATIC_ASSERT (G_STRUCT_OFFSET (GMappedFile, contents) == + G_STRUCT_OFFSET (GBuffer, data)); +G_STATIC_ASSERT (G_STRUCT_OFFSET (GMappedFile, length) == + G_STRUCT_OFFSET (GBuffer, size)); +G_STATIC_ASSERT (G_STRUCT_OFFSET (GMappedFile, ref_count) == + G_STRUCT_OFFSET (GBuffer, ref_count)); +G_STATIC_ASSERT (G_STRUCT_OFFSET (GMappedFile, free_func) == + G_STRUCT_OFFSET (GBuffer, free_func)); + +static void +g_mapped_file_destroy (GMappedFile *file) +{ + if (file->length) + { +#ifdef HAVE_MMAP + munmap (file->contents, file->length); +#endif +#ifdef G_OS_WIN32 + UnmapViewOfFile (file->contents); + CloseHandle (file->mapping); +#endif + } + + g_slice_free (GMappedFile, file); +} + +/** + * g_mapped_file_new: + * @filename: The path of the file to load, in the GLib filename encoding + * @writable: whether the mapping should be writable + * @error: return location for a #GError, or %NULL + * + * Maps a file into memory. On UNIX, this is using the mmap() function. + * + * If @writable is %TRUE, the mapped buffer may be modified, otherwise + * it is an error to modify the mapped buffer. Modifications to the buffer + * are not visible to other processes mapping the same file, and are not + * written back to the file. + * + * Note that modifications of the underlying file might affect the contents + * of the #GMappedFile. Therefore, mapping should only be used if the file + * will not be modified, or if all modifications of the file are done + * atomically (e.g. using g_file_set_contents()). + * + * Return value: a newly allocated #GMappedFile which must be unref'd + * with g_mapped_file_unref(), or %NULL if the mapping failed. + * + * Since: 2.8 + */ +GMappedFile * +g_mapped_file_new (const gchar *filename, + gboolean writable, + GError **error) +{ + GMappedFile *file; + int fd; + struct stat st; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (!error || *error == NULL, NULL); + + fd = g_open (filename, (writable ? O_RDWR : O_RDONLY) | _O_BINARY, 0); + if (fd == -1) + { + int save_errno = errno; + gchar *display_filename = g_filename_display_name (filename); + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to open file '%s': open() failed: %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + return NULL; + } + + file = g_slice_new0 (GMappedFile); + file->ref_count = 1; + file->free_func = g_mapped_file_destroy; + + if (fstat (fd, &st) == -1) + { + int save_errno = errno; + gchar *display_filename = g_filename_display_name (filename); + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to get attributes of file '%s': fstat() failed: %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + goto out; + } + + if (st.st_size == 0) + { + file->length = 0; + file->contents = NULL; + close (fd); + return file; + } + + file->contents = MAP_FAILED; + +#ifdef HAVE_MMAP + if (st.st_size > G_MAXSIZE) + { + errno = EINVAL; + } + else + { + file->length = (gsize) st.st_size; + file->contents = (gchar *) mmap (NULL, file->length, + writable ? PROT_READ|PROT_WRITE : PROT_READ, + MAP_PRIVATE, fd, 0); + } +#endif +#ifdef G_OS_WIN32 + file->length = st.st_size; + file->mapping = CreateFileMapping ((HANDLE) _get_osfhandle (fd), NULL, + writable ? PAGE_WRITECOPY : PAGE_READONLY, + 0, 0, + NULL); + if (file->mapping != NULL) + { + file->contents = MapViewOfFile (file->mapping, + writable ? FILE_MAP_COPY : FILE_MAP_READ, + 0, 0, + 0); + if (file->contents == NULL) + { + file->contents = MAP_FAILED; + CloseHandle (file->mapping); + file->mapping = NULL; + } + } +#endif + + + if (file->contents == MAP_FAILED) + { + int save_errno = errno; + gchar *display_filename = g_filename_display_name (filename); + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to map file '%s': mmap() failed: %s"), + display_filename, + g_strerror (save_errno)); + g_free (display_filename); + goto out; + } + + close (fd); + return file; + + out: + close (fd); + g_slice_free (GMappedFile, file); + + return NULL; +} + +/** + * g_mapped_file_get_length: + * @file: a #GMappedFile + * + * Returns the length of the contents of a #GMappedFile. + * + * Returns: the length of the contents of @file. + * + * Since: 2.8 + */ +gsize +g_mapped_file_get_length (GMappedFile *file) +{ + g_return_val_if_fail (file != NULL, 0); + + return file->length; +} + +/** + * g_mapped_file_get_contents: + * @file: a #GMappedFile + * + * Returns the contents of a #GMappedFile. + * + * Note that the contents may not be zero-terminated, + * even if the #GMappedFile is backed by a text file. + * + * If the file is empty then %NULL is returned. + * + * Returns: the contents of @file, or %NULL. + * + * Since: 2.8 + */ +gchar * +g_mapped_file_get_contents (GMappedFile *file) +{ + g_return_val_if_fail (file != NULL, NULL); + + return file->contents; +} + +/** + * g_mapped_file_free: + * @file: a #GMappedFile + * + * This call existed before #GMappedFile had refcounting and is currently + * exactly the same as g_mapped_file_unref(). + * + * Since: 2.8 + * Deprecated:2.22: Use g_mapped_file_unref() instead. + */ +void +g_mapped_file_free (GMappedFile *file) +{ + g_mapped_file_unref (file); +} + +/** + * g_mapped_file_ref: + * @file: a #GMappedFile + * + * Increments the reference count of @file by one. It is safe to call + * this function from any thread. + * + * Return value: the passed in #GMappedFile. + * + * Since: 2.22 + **/ +GMappedFile * +g_mapped_file_ref (GMappedFile *file) +{ + g_return_val_if_fail (file != NULL, NULL); + g_return_val_if_fail (file->ref_count > 0, file); + + g_atomic_int_inc (&file->ref_count); + + return file; +} + +/** + * g_mapped_file_unref: + * @file: a #GMappedFile + * + * Decrements the reference count of @file by one. If the reference count + * drops to 0, unmaps the buffer of @file and frees it. + * + * It is safe to call this function from any thread. + * + * Since 2.22 + **/ +void +g_mapped_file_unref (GMappedFile *file) +{ + g_return_if_fail (file != NULL); + g_return_if_fail (file->ref_count > 0); + + if (g_atomic_int_dec_and_test (&file->ref_count)) + g_mapped_file_destroy (file); +} + +#define __G_MAPPED_FILE_C__ +#include "galiasdef.c" diff --git a/glib/gmappedfile.h b/glib/gmappedfile.h new file mode 100644 index 0000000..dbb3f89 --- /dev/null +++ b/glib/gmappedfile.h @@ -0,0 +1,49 @@ +/* GLIB - Library of useful routines for C programming + * gmappedfile.h: Simplified wrapper around the mmap function + * + * Copyright 2005 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MAPPED_FILE_H__ +#define __G_MAPPED_FILE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GMappedFile GMappedFile; + +GMappedFile *g_mapped_file_new (const gchar *filename, + gboolean writable, + GError **error) G_GNUC_MALLOC; +gsize g_mapped_file_get_length (GMappedFile *file); +gchar *g_mapped_file_get_contents (GMappedFile *file); +GMappedFile *g_mapped_file_ref (GMappedFile *file); +void g_mapped_file_unref (GMappedFile *file); + +#ifndef G_DISABLE_DEPRECATED +void g_mapped_file_free (GMappedFile *file); +#endif + +G_END_DECLS + +#endif /* __G_MAPPED_FILE_H__ */ diff --git a/glib/gmarkup.c b/glib/gmarkup.c new file mode 100644 index 0000000..74be8cb --- /dev/null +++ b/glib/gmarkup.c @@ -0,0 +1,2785 @@ +/* gmarkup.c - Simple XML-like parser + * + * Copyright 2000, 2003 Red Hat, Inc. + * Copyright 2007, 2008 Ryan Lortie + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "glib.h" +#include "glibintl.h" +#include "galias.h" + +GQuark +g_markup_error_quark (void) +{ + return g_quark_from_static_string ("g-markup-error-quark"); +} + +typedef enum +{ + STATE_START, + STATE_AFTER_OPEN_ANGLE, + STATE_AFTER_CLOSE_ANGLE, + STATE_AFTER_ELISION_SLASH, /* the slash that obviates need for end element */ + STATE_INSIDE_OPEN_TAG_NAME, + STATE_INSIDE_ATTRIBUTE_NAME, + STATE_AFTER_ATTRIBUTE_NAME, + STATE_BETWEEN_ATTRIBUTES, + STATE_AFTER_ATTRIBUTE_EQUALS_SIGN, + STATE_INSIDE_ATTRIBUTE_VALUE_SQ, + STATE_INSIDE_ATTRIBUTE_VALUE_DQ, + STATE_INSIDE_TEXT, + STATE_AFTER_CLOSE_TAG_SLASH, + STATE_INSIDE_CLOSE_TAG_NAME, + STATE_AFTER_CLOSE_TAG_NAME, + STATE_INSIDE_PASSTHROUGH, + STATE_ERROR +} GMarkupParseState; + +typedef struct +{ + const char *prev_element; + const GMarkupParser *prev_parser; + gpointer prev_user_data; +} GMarkupRecursionTracker; + +struct _GMarkupParseContext +{ + const GMarkupParser *parser; + + GMarkupParseFlags flags; + + gint line_number; + gint char_number; + + gpointer user_data; + GDestroyNotify dnotify; + + /* A piece of character data or an element that + * hasn't "ended" yet so we haven't yet called + * the callback for it. + */ + GString *partial_chunk; + GSList *spare_chunks; + + GMarkupParseState state; + GSList *tag_stack; + GSList *tag_stack_gstr; + GSList *spare_list_nodes; + + GString **attr_names; + GString **attr_values; + gint cur_attr; + gint alloc_attrs; + + const gchar *current_text; + gssize current_text_len; + const gchar *current_text_end; + + /* used to save the start of the last interesting thingy */ + const gchar *start; + + const gchar *iter; + + guint document_empty : 1; + guint parsing : 1; + guint awaiting_pop : 1; + gint balance; + + /* subparser support */ + GSList *subparser_stack; /* (GMarkupRecursionTracker *) */ + const char *subparser_element; + gpointer held_user_data; +}; + +/* + * Helpers to reduce our allocation overhead, we have + * a well defined allocation lifecycle. + */ +static GSList * +get_list_node (GMarkupParseContext *context, gpointer data) +{ + GSList *node; + if (context->spare_list_nodes != NULL) + { + node = context->spare_list_nodes; + context->spare_list_nodes = g_slist_remove_link (context->spare_list_nodes, node); + } + else + node = g_slist_alloc(); + node->data = data; + return node; +} + +static void +free_list_node (GMarkupParseContext *context, GSList *node) +{ + node->data = NULL; + context->spare_list_nodes = g_slist_concat (node, context->spare_list_nodes); +} + +static inline void +string_blank (GString *string) +{ + string->str[0] = '\0'; + string->len = 0; +} + +/** + * g_markup_parse_context_new: + * @parser: a #GMarkupParser + * @flags: one or more #GMarkupParseFlags + * @user_data: user data to pass to #GMarkupParser functions + * @user_data_dnotify: user data destroy notifier called when the parse context is freed + * + * Creates a new parse context. A parse context is used to parse + * marked-up documents. You can feed any number of documents into + * a context, as long as no errors occur; once an error occurs, + * the parse context can't continue to parse text (you have to free it + * and create a new parse context). + * + * Return value: a new #GMarkupParseContext + **/ +GMarkupParseContext * +g_markup_parse_context_new (const GMarkupParser *parser, + GMarkupParseFlags flags, + gpointer user_data, + GDestroyNotify user_data_dnotify) +{ + GMarkupParseContext *context; + + g_return_val_if_fail (parser != NULL, NULL); + + context = g_new (GMarkupParseContext, 1); + + context->parser = parser; + context->flags = flags; + context->user_data = user_data; + context->dnotify = user_data_dnotify; + + context->line_number = 1; + context->char_number = 1; + + context->partial_chunk = NULL; + context->spare_chunks = NULL; + context->spare_list_nodes = NULL; + + context->state = STATE_START; + context->tag_stack = NULL; + context->tag_stack_gstr = NULL; + context->attr_names = NULL; + context->attr_values = NULL; + context->cur_attr = -1; + context->alloc_attrs = 0; + + context->current_text = NULL; + context->current_text_len = -1; + context->current_text_end = NULL; + + context->start = NULL; + context->iter = NULL; + + context->document_empty = TRUE; + context->parsing = FALSE; + + context->awaiting_pop = FALSE; + context->subparser_stack = NULL; + context->subparser_element = NULL; + + /* this is only looked at if awaiting_pop = TRUE. initialise anyway. */ + context->held_user_data = NULL; + + context->balance = 0; + + return context; +} + +static void +string_full_free (gpointer ptr, gpointer user_data) +{ + g_string_free (ptr, TRUE); +} + +static void clear_attributes (GMarkupParseContext *context); + +/** + * g_markup_parse_context_free: + * @context: a #GMarkupParseContext + * + * Frees a #GMarkupParseContext. Can't be called from inside + * one of the #GMarkupParser functions. Can't be called while + * a subparser is pushed. + **/ +void +g_markup_parse_context_free (GMarkupParseContext *context) +{ + g_return_if_fail (context != NULL); + g_return_if_fail (!context->parsing); + g_return_if_fail (!context->subparser_stack); + g_return_if_fail (!context->awaiting_pop); + + if (context->dnotify) + (* context->dnotify) (context->user_data); + + clear_attributes (context); + g_free (context->attr_names); + g_free (context->attr_values); + + g_slist_foreach (context->tag_stack_gstr, string_full_free, NULL); + g_slist_free (context->tag_stack_gstr); + g_slist_free (context->tag_stack); + + g_slist_foreach (context->spare_chunks, string_full_free, NULL); + g_slist_free (context->spare_chunks); + g_slist_free (context->spare_list_nodes); + + if (context->partial_chunk) + g_string_free (context->partial_chunk, TRUE); + + g_free (context); +} + +static void pop_subparser_stack (GMarkupParseContext *context); + +static void +mark_error (GMarkupParseContext *context, + GError *error) +{ + context->state = STATE_ERROR; + + if (context->parser->error) + (*context->parser->error) (context, error, context->user_data); + + /* report the error all the way up to free all the user-data */ + while (context->subparser_stack) + { + pop_subparser_stack (context); + context->awaiting_pop = FALSE; /* already been freed */ + + if (context->parser->error) + (*context->parser->error) (context, error, context->user_data); + } +} + +static void set_error (GMarkupParseContext *context, + GError **error, + GMarkupError code, + const gchar *format, + ...) G_GNUC_PRINTF (4, 5); + +static void +set_error_literal (GMarkupParseContext *context, + GError **error, + GMarkupError code, + const gchar *message) +{ + GError *tmp_error; + + tmp_error = g_error_new_literal (G_MARKUP_ERROR, code, message); + + g_prefix_error (&tmp_error, + _("Error on line %d char %d: "), + context->line_number, + context->char_number); + + mark_error (context, tmp_error); + + g_propagate_error (error, tmp_error); +} + +static void +set_error (GMarkupParseContext *context, + GError **error, + GMarkupError code, + const gchar *format, + ...) +{ + gchar *s; + gchar *s_valid; + va_list args; + + va_start (args, format); + s = g_strdup_vprintf (format, args); + va_end (args); + + /* Make sure that the GError message is valid UTF-8 even if it is + * complaining about invalid UTF-8 in the markup: */ + s_valid = _g_utf8_make_valid (s); + set_error_literal (context, error, code, s); + + g_free (s); + g_free (s_valid); +} + +static void +propagate_error (GMarkupParseContext *context, + GError **dest, + GError *src) +{ + if (context->flags & G_MARKUP_PREFIX_ERROR_POSITION) + g_prefix_error (&src, + _("Error on line %d char %d: "), + context->line_number, + context->char_number); + + mark_error (context, src); + + g_propagate_error (dest, src); +} + +#define IS_COMMON_NAME_END_CHAR(c) \ + ((c) == '=' || (c) == '/' || (c) == '>' || (c) == ' ') + +static gboolean +slow_name_validate (GMarkupParseContext *context, const char *name, GError **error) +{ + const char *p = name; + + if (!g_utf8_validate (name, strlen (name), NULL)) + { + set_error (context, error, G_MARKUP_ERROR_BAD_UTF8, + _("Invalid UTF-8 encoded text in name - not valid '%s'"), name); + return FALSE; + } + + if (!(g_ascii_isalpha (*p) || + (!IS_COMMON_NAME_END_CHAR (*p) && + (*p == '_' || + *p == ':' || + g_unichar_isalpha (g_utf8_get_char (p)))))) + { + set_error (context, error, G_MARKUP_ERROR_PARSE, + _("'%s' is not a valid name "), name); + return FALSE; + } + + for (p = g_utf8_next_char (name); *p != '\0'; p = g_utf8_next_char (p)) + { + /* is_name_char */ + if (!(g_ascii_isalnum (*p) || + (!IS_COMMON_NAME_END_CHAR (*p) && + (*p == '.' || + *p == '-' || + *p == '_' || + *p == ':' || + g_unichar_isalpha (g_utf8_get_char (p)))))) + { + set_error (context, error, G_MARKUP_ERROR_PARSE, + _("'%s' is not a valid name: '%c' "), name, *p); + return FALSE; + } + } + return TRUE; +} + +/* + * Use me for elements, attributes etc. + */ +static gboolean +name_validate (GMarkupParseContext *context, const char *name, GError **error) +{ + char mask; + const char *p; + + /* name start char */ + p = name; + if (G_UNLIKELY (IS_COMMON_NAME_END_CHAR (*p) || + !(g_ascii_isalpha (*p) || *p == '_' || *p == ':'))) + goto slow_validate; + + for (mask = *p++; *p != '\0'; p++) + { + mask |= *p; + + /* is_name_char */ + if (G_UNLIKELY (!(g_ascii_isalnum (*p) || + (!IS_COMMON_NAME_END_CHAR (*p) && + (*p == '.' || + *p == '-' || + *p == '_' || + *p == ':'))))) + goto slow_validate; + } + + if (mask & 0x80) /* un-common / non-ascii */ + goto slow_validate; + + return TRUE; + + slow_validate: + return slow_name_validate (context, name, error); +} + +static gboolean +text_validate (GMarkupParseContext *context, const char *p, int len, GError **error) +{ + if (!g_utf8_validate (p, len, NULL)) + { + set_error (context, error, G_MARKUP_ERROR_BAD_UTF8, + _("Invalid UTF-8 encoded text in name - not valid '%s'"), p); + return FALSE; + } + else + return TRUE; +} + +static gchar* +char_str (gunichar c, + gchar *buf) +{ + memset (buf, 0, 8); + g_unichar_to_utf8 (c, buf); + return buf; +} + +static gchar* +utf8_str (const gchar *utf8, + gchar *buf) +{ + char_str (g_utf8_get_char (utf8), buf); + return buf; +} + +static void +set_unescape_error (GMarkupParseContext *context, + GError **error, + const gchar *remaining_text, + GMarkupError code, + const gchar *format, + ...) +{ + GError *tmp_error; + gchar *s; + va_list args; + gint remaining_newlines; + const gchar *p; + + remaining_newlines = 0; + p = remaining_text; + while (*p != '\0') + { + if (*p == '\n') + ++remaining_newlines; + ++p; + } + + va_start (args, format); + s = g_strdup_vprintf (format, args); + va_end (args); + + tmp_error = g_error_new (G_MARKUP_ERROR, + code, + _("Error on line %d: %s"), + context->line_number - remaining_newlines, + s); + + g_free (s); + + mark_error (context, tmp_error); + + g_propagate_error (error, tmp_error); +} + +/* + * re-write the GString in-place, unescaping anything that escaped. + * most XML does not contain entities, or escaping. + */ +static gboolean +unescape_gstring_inplace (GMarkupParseContext *context, + GString *string, + gboolean *is_ascii, + GError **error) +{ + char mask, *to; + int line_num = 1; + const char *from; + gboolean normalize_attribute; + + *is_ascii = FALSE; + + /* are we unescaping an attribute or not ? */ + if (context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ || + context->state == STATE_INSIDE_ATTRIBUTE_VALUE_DQ) + normalize_attribute = TRUE; + else + normalize_attribute = FALSE; + + /* + * Meeks' theorum: unescaping can only shrink text. + * for < etc. this is obvious, for ￿ more + * thought is required, but this is patently so. + */ + mask = 0; + for (from = to = string->str; *from != '\0'; from++, to++) + { + *to = *from; + + mask |= *to; + if (*to == '\n') + line_num++; + if (normalize_attribute && (*to == '\t' || *to == '\n')) + *to = ' '; + if (*to == '\r') + { + *to = normalize_attribute ? ' ' : '\n'; + if (from[1] == '\n') + from++; + } + if (*from == '&') + { + from++; + if (*from == '#') + { + gboolean is_hex = FALSE; + gulong l; + gchar *end = NULL; + + from++; + + if (*from == 'x') + { + is_hex = TRUE; + from++; + } + + /* digit is between start and p */ + errno = 0; + if (is_hex) + l = strtoul (from, &end, 16); + else + l = strtoul (from, &end, 10); + + if (end == from || errno != 0) + { + set_unescape_error (context, error, + from, G_MARKUP_ERROR_PARSE, + _("Failed to parse '%-.*s', which " + "should have been a digit " + "inside a character reference " + "(ê for example) - perhaps " + "the digit is too large"), + end - from, from); + return FALSE; + } + else if (*end != ';') + { + set_unescape_error (context, error, + from, G_MARKUP_ERROR_PARSE, + _("Character reference did not end with a " + "semicolon; " + "most likely you used an ampersand " + "character without intending to start " + "an entity - escape ampersand as &")); + return FALSE; + } + else + { + /* characters XML 1.1 permits */ + if ((0 < l && l <= 0xD7FF) || + (0xE000 <= l && l <= 0xFFFD) || + (0x10000 <= l && l <= 0x10FFFF)) + { + gchar buf[8]; + char_str (l, buf); + strcpy (to, buf); + to += strlen (buf) - 1; + from = end; + if (l >= 0x80) /* not ascii */ + mask |= 0x80; + } + else + { + set_unescape_error (context, error, + from, G_MARKUP_ERROR_PARSE, + _("Character reference '%-.*s' does not " + "encode a permitted character"), + end - from, from); + return FALSE; + } + } + } + + else if (strncmp (from, "lt;", 3) == 0) + { + *to = '<'; + from += 2; + } + else if (strncmp (from, "gt;", 3) == 0) + { + *to = '>'; + from += 2; + } + else if (strncmp (from, "amp;", 4) == 0) + { + *to = '&'; + from += 3; + } + else if (strncmp (from, "quot;", 5) == 0) + { + *to = '"'; + from += 4; + } + else if (strncmp (from, "apos;", 5) == 0) + { + *to = '\''; + from += 4; + } + else + { + if (*from == ';') + set_unescape_error (context, error, + from, G_MARKUP_ERROR_PARSE, + _("Empty entity '&;' seen; valid " + "entities are: & " < > '")); + else + { + const char *end = strchr (from, ';'); + if (end) + set_unescape_error (context, error, + from, G_MARKUP_ERROR_PARSE, + _("Entity name '%-.*s' is not known"), + end-from, from); + else + set_unescape_error (context, error, + from, G_MARKUP_ERROR_PARSE, + _("Entity did not end with a semicolon; " + "most likely you used an ampersand " + "character without intending to start " + "an entity - escape ampersand as &")); + } + return FALSE; + } + } + } + + g_assert (to - string->str <= string->len); + if (to - string->str != string->len) + g_string_truncate (string, to - string->str); + + *is_ascii = !(mask & 0x80); + + return TRUE; +} + +static inline gboolean +advance_char (GMarkupParseContext *context) +{ + context->iter++; + context->char_number++; + + if (G_UNLIKELY (context->iter == context->current_text_end)) + return FALSE; + + else if (G_UNLIKELY (*context->iter == '\n')) + { + context->line_number++; + context->char_number = 1; + } + + return TRUE; +} + +static inline gboolean +xml_isspace (char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; +} + +static void +skip_spaces (GMarkupParseContext *context) +{ + do + { + if (!xml_isspace (*context->iter)) + return; + } + while (advance_char (context)); +} + +static void +advance_to_name_end (GMarkupParseContext *context) +{ + do + { + if (IS_COMMON_NAME_END_CHAR (*(context->iter))) + return; + if (xml_isspace (*(context->iter))) + return; + } + while (advance_char (context)); +} + +static void +release_chunk (GMarkupParseContext *context, GString *str) +{ + GSList *node; + if (!str) + return; + if (str->allocated_len > 256) + { /* large strings are unusual and worth freeing */ + g_string_free (str, TRUE); + return; + } + string_blank (str); + node = get_list_node (context, str); + context->spare_chunks = g_slist_concat (node, context->spare_chunks); +} + +static void +add_to_partial (GMarkupParseContext *context, + const gchar *text_start, + const gchar *text_end) +{ + if (context->partial_chunk == NULL) + { /* allocate a new chunk to parse into */ + + if (context->spare_chunks != NULL) + { + GSList *node = context->spare_chunks; + context->spare_chunks = g_slist_remove_link (context->spare_chunks, node); + context->partial_chunk = node->data; + free_list_node (context, node); + } + else + context->partial_chunk = g_string_sized_new (MAX (28, text_end - text_start)); + } + + if (text_start != text_end) + g_string_insert_len (context->partial_chunk, -1, + text_start, text_end - text_start); +} + +static inline void +truncate_partial (GMarkupParseContext *context) +{ + if (context->partial_chunk != NULL) + string_blank (context->partial_chunk); +} + +static inline const gchar* +current_element (GMarkupParseContext *context) +{ + return context->tag_stack->data; +} + +static void +pop_subparser_stack (GMarkupParseContext *context) +{ + GMarkupRecursionTracker *tracker; + + g_assert (context->subparser_stack); + + tracker = context->subparser_stack->data; + + context->awaiting_pop = TRUE; + context->held_user_data = context->user_data; + + context->user_data = tracker->prev_user_data; + context->parser = tracker->prev_parser; + context->subparser_element = tracker->prev_element; + g_slice_free (GMarkupRecursionTracker, tracker); + + context->subparser_stack = g_slist_delete_link (context->subparser_stack, + context->subparser_stack); +} + +static void +push_partial_as_tag (GMarkupParseContext *context) +{ + GString *str = context->partial_chunk; + /* sadly, this is exported by gmarkup_get_element_stack as-is */ + context->tag_stack = g_slist_concat (get_list_node (context, str->str), context->tag_stack); + context->tag_stack_gstr = g_slist_concat (get_list_node (context, str), context->tag_stack_gstr); + context->partial_chunk = NULL; +} + +static void +pop_tag (GMarkupParseContext *context) +{ + GSList *nodea, *nodeb; + + nodea = context->tag_stack; + nodeb = context->tag_stack_gstr; + release_chunk (context, nodeb->data); + context->tag_stack = g_slist_remove_link (context->tag_stack, nodea); + context->tag_stack_gstr = g_slist_remove_link (context->tag_stack_gstr, nodeb); + free_list_node (context, nodea); + free_list_node (context, nodeb); +} + +static void +possibly_finish_subparser (GMarkupParseContext *context) +{ + if (current_element (context) == context->subparser_element) + pop_subparser_stack (context); +} + +static void +ensure_no_outstanding_subparser (GMarkupParseContext *context) +{ + if (context->awaiting_pop) + g_critical ("During the first end_element call after invoking a " + "subparser you must pop the subparser stack and handle " + "the freeing of the subparser user_data. This can be " + "done by calling the end function of the subparser. " + "Very probably, your program just leaked memory."); + + /* let valgrind watch the pointer disappear... */ + context->held_user_data = NULL; + context->awaiting_pop = FALSE; +} + +static const gchar* +current_attribute (GMarkupParseContext *context) +{ + g_assert (context->cur_attr >= 0); + return context->attr_names[context->cur_attr]->str; +} + +static void +add_attribute (GMarkupParseContext *context, GString *str) +{ + if (context->cur_attr + 2 >= context->alloc_attrs) + { + context->alloc_attrs += 5; /* silly magic number */ + context->attr_names = g_realloc (context->attr_names, sizeof(GString*)*context->alloc_attrs); + context->attr_values = g_realloc (context->attr_values, sizeof(GString*)*context->alloc_attrs); + } + context->cur_attr++; + context->attr_names[context->cur_attr] = str; + context->attr_values[context->cur_attr] = NULL; + context->attr_names[context->cur_attr+1] = NULL; + context->attr_values[context->cur_attr+1] = NULL; +} + +static void +clear_attributes (GMarkupParseContext *context) +{ + /* Go ahead and free the attributes. */ + for (; context->cur_attr >= 0; context->cur_attr--) + { + int pos = context->cur_attr; + release_chunk (context, context->attr_names[pos]); + release_chunk (context, context->attr_values[pos]); + context->attr_names[pos] = context->attr_values[pos] = NULL; + } + g_assert (context->cur_attr == -1); + g_assert (context->attr_names == NULL || + context->attr_names[0] == NULL); + g_assert (context->attr_values == NULL || + context->attr_values[0] == NULL); +} + +/* This has to be a separate function to ensure the alloca's + are unwound on exit - otherwise we grow & blow the stack + with large documents */ +static inline void +emit_start_element (GMarkupParseContext *context, GError **error) +{ + int i; + const gchar *start_name; + const gchar **attr_names; + const gchar **attr_values; + GError *tmp_error; + + attr_names = g_newa (const gchar *, context->cur_attr + 2); + attr_values = g_newa (const gchar *, context->cur_attr + 2); + for (i = 0; i < context->cur_attr + 1; i++) + { + attr_names[i] = context->attr_names[i]->str; + attr_values[i] = context->attr_values[i]->str; + } + attr_names[i] = NULL; + attr_values[i] = NULL; + + /* Call user callback for element start */ + tmp_error = NULL; + start_name = current_element (context); + + if (context->parser->start_element && + name_validate (context, start_name, error)) + (* context->parser->start_element) (context, + start_name, + (const gchar **)attr_names, + (const gchar **)attr_values, + context->user_data, + &tmp_error); + clear_attributes (context); + + if (tmp_error != NULL) + propagate_error (context, error, tmp_error); +} + +/** + * g_markup_parse_context_parse: + * @context: a #GMarkupParseContext + * @text: chunk of text to parse + * @text_len: length of @text in bytes + * @error: return location for a #GError + * + * Feed some data to the #GMarkupParseContext. The data need not + * be valid UTF-8; an error will be signaled if it's invalid. + * The data need not be an entire document; you can feed a document + * into the parser incrementally, via multiple calls to this function. + * Typically, as you receive data from a network connection or file, + * you feed each received chunk of data into this function, aborting + * the process if an error occurs. Once an error is reported, no further + * data may be fed to the #GMarkupParseContext; all errors are fatal. + * + * Return value: %FALSE if an error occurred, %TRUE on success + **/ +gboolean +g_markup_parse_context_parse (GMarkupParseContext *context, + const gchar *text, + gssize text_len, + GError **error) +{ + g_return_val_if_fail (context != NULL, FALSE); + g_return_val_if_fail (text != NULL, FALSE); + g_return_val_if_fail (context->state != STATE_ERROR, FALSE); + g_return_val_if_fail (!context->parsing, FALSE); + + if (text_len < 0) + text_len = strlen (text); + + if (text_len == 0) + return TRUE; + + context->parsing = TRUE; + + + context->current_text = text; + context->current_text_len = text_len; + context->current_text_end = context->current_text + text_len; + context->iter = context->current_text; + context->start = context->iter; + + if (context->current_text_len == 0) + goto finished; + + while (context->iter != context->current_text_end) + { + switch (context->state) + { + case STATE_START: + /* Possible next state: AFTER_OPEN_ANGLE */ + + g_assert (context->tag_stack == NULL); + + /* whitespace is ignored outside of any elements */ + skip_spaces (context); + + if (context->iter != context->current_text_end) + { + if (*context->iter == '<') + { + /* Move after the open angle */ + advance_char (context); + + context->state = STATE_AFTER_OPEN_ANGLE; + + /* this could start a passthrough */ + context->start = context->iter; + + /* document is now non-empty */ + context->document_empty = FALSE; + } + else + { + set_error_literal (context, + error, + G_MARKUP_ERROR_PARSE, + _("Document must begin with an element (e.g. )")); + } + } + break; + + case STATE_AFTER_OPEN_ANGLE: + /* Possible next states: INSIDE_OPEN_TAG_NAME, + * AFTER_CLOSE_TAG_SLASH, INSIDE_PASSTHROUGH + */ + if (*context->iter == '?' || + *context->iter == '!') + { + /* include < in the passthrough */ + const gchar *openangle = "<"; + add_to_partial (context, openangle, openangle + 1); + context->start = context->iter; + context->balance = 1; + context->state = STATE_INSIDE_PASSTHROUGH; + } + else if (*context->iter == '/') + { + /* move after it */ + advance_char (context); + + context->state = STATE_AFTER_CLOSE_TAG_SLASH; + } + else if (!IS_COMMON_NAME_END_CHAR (*(context->iter))) + { + context->state = STATE_INSIDE_OPEN_TAG_NAME; + + /* start of tag name */ + context->start = context->iter; + } + else + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("'%s' is not a valid character following " + "a '<' character; it may not begin an " + "element name"), + utf8_str (context->iter, buf)); + } + break; + + /* The AFTER_CLOSE_ANGLE state is actually sort of + * broken, because it doesn't correspond to a range + * of characters in the input stream as the others do, + * and thus makes things harder to conceptualize + */ + case STATE_AFTER_CLOSE_ANGLE: + /* Possible next states: INSIDE_TEXT, STATE_START */ + if (context->tag_stack == NULL) + { + context->start = NULL; + context->state = STATE_START; + } + else + { + context->start = context->iter; + context->state = STATE_INSIDE_TEXT; + } + break; + + case STATE_AFTER_ELISION_SLASH: + /* Possible next state: AFTER_CLOSE_ANGLE */ + + { + /* We need to pop the tag stack and call the end_element + * function, since this is the close tag + */ + GError *tmp_error = NULL; + + g_assert (context->tag_stack != NULL); + + possibly_finish_subparser (context); + + tmp_error = NULL; + if (context->parser->end_element) + (* context->parser->end_element) (context, + current_element (context), + context->user_data, + &tmp_error); + + ensure_no_outstanding_subparser (context); + + if (tmp_error) + { + mark_error (context, tmp_error); + g_propagate_error (error, tmp_error); + } + else + { + if (*context->iter == '>') + { + /* move after the close angle */ + advance_char (context); + context->state = STATE_AFTER_CLOSE_ANGLE; + } + else + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("Odd character '%s', expected a '>' character " + "to end the empty-element tag '%s'"), + utf8_str (context->iter, buf), + current_element (context)); + } + } + pop_tag (context); + } + break; + + case STATE_INSIDE_OPEN_TAG_NAME: + /* Possible next states: BETWEEN_ATTRIBUTES */ + + /* if there's a partial chunk then it's the first part of the + * tag name. If there's a context->start then it's the start + * of the tag name in current_text, the partial chunk goes + * before that start though. + */ + advance_to_name_end (context); + + if (context->iter == context->current_text_end) + { + /* The name hasn't necessarily ended. Merge with + * partial chunk, leave state unchanged. + */ + add_to_partial (context, context->start, context->iter); + } + else + { + /* The name has ended. Combine it with the partial chunk + * if any; push it on the stack; enter next state. + */ + add_to_partial (context, context->start, context->iter); + push_partial_as_tag (context); + + context->state = STATE_BETWEEN_ATTRIBUTES; + context->start = NULL; + } + break; + + case STATE_INSIDE_ATTRIBUTE_NAME: + /* Possible next states: AFTER_ATTRIBUTE_NAME */ + + advance_to_name_end (context); + add_to_partial (context, context->start, context->iter); + + /* read the full name, if we enter the equals sign state + * then add the attribute to the list (without the value), + * otherwise store a partial chunk to be prepended later. + */ + if (context->iter != context->current_text_end) + context->state = STATE_AFTER_ATTRIBUTE_NAME; + break; + + case STATE_AFTER_ATTRIBUTE_NAME: + /* Possible next states: AFTER_ATTRIBUTE_EQUALS_SIGN */ + + skip_spaces (context); + + if (context->iter != context->current_text_end) + { + /* The name has ended. Combine it with the partial chunk + * if any; push it on the stack; enter next state. + */ + if (!name_validate (context, context->partial_chunk->str, error)) + break; + + add_attribute (context, context->partial_chunk); + + context->partial_chunk = NULL; + context->start = NULL; + + if (*context->iter == '=') + { + advance_char (context); + context->state = STATE_AFTER_ATTRIBUTE_EQUALS_SIGN; + } + else + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("Odd character '%s', expected a '=' after " + "attribute name '%s' of element '%s'"), + utf8_str (context->iter, buf), + current_attribute (context), + current_element (context)); + + } + } + break; + + case STATE_BETWEEN_ATTRIBUTES: + /* Possible next states: AFTER_CLOSE_ANGLE, + * AFTER_ELISION_SLASH, INSIDE_ATTRIBUTE_NAME + */ + skip_spaces (context); + + if (context->iter != context->current_text_end) + { + if (*context->iter == '/') + { + advance_char (context); + context->state = STATE_AFTER_ELISION_SLASH; + } + else if (*context->iter == '>') + { + advance_char (context); + context->state = STATE_AFTER_CLOSE_ANGLE; + } + else if (!IS_COMMON_NAME_END_CHAR (*(context->iter))) + { + context->state = STATE_INSIDE_ATTRIBUTE_NAME; + /* start of attribute name */ + context->start = context->iter; + } + else + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("Odd character '%s', expected a '>' or '/' " + "character to end the start tag of " + "element '%s', or optionally an attribute; " + "perhaps you used an invalid character in " + "an attribute name"), + utf8_str (context->iter, buf), + current_element (context)); + } + + /* If we're done with attributes, invoke + * the start_element callback + */ + if (context->state == STATE_AFTER_ELISION_SLASH || + context->state == STATE_AFTER_CLOSE_ANGLE) + emit_start_element (context, error); + } + break; + + case STATE_AFTER_ATTRIBUTE_EQUALS_SIGN: + /* Possible next state: INSIDE_ATTRIBUTE_VALUE_[SQ/DQ] */ + + skip_spaces (context); + + if (context->iter != context->current_text_end) + { + if (*context->iter == '"') + { + advance_char (context); + context->state = STATE_INSIDE_ATTRIBUTE_VALUE_DQ; + context->start = context->iter; + } + else if (*context->iter == '\'') + { + advance_char (context); + context->state = STATE_INSIDE_ATTRIBUTE_VALUE_SQ; + context->start = context->iter; + } + else + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("Odd character '%s', expected an open quote mark " + "after the equals sign when giving value for " + "attribute '%s' of element '%s'"), + utf8_str (context->iter, buf), + current_attribute (context), + current_element (context)); + } + } + break; + + case STATE_INSIDE_ATTRIBUTE_VALUE_SQ: + case STATE_INSIDE_ATTRIBUTE_VALUE_DQ: + /* Possible next states: BETWEEN_ATTRIBUTES */ + { + gchar delim; + + if (context->state == STATE_INSIDE_ATTRIBUTE_VALUE_SQ) + { + delim = '\''; + } + else + { + delim = '"'; + } + + do + { + if (*context->iter == delim) + break; + } + while (advance_char (context)); + } + if (context->iter == context->current_text_end) + { + /* The value hasn't necessarily ended. Merge with + * partial chunk, leave state unchanged. + */ + add_to_partial (context, context->start, context->iter); + } + else + { + gboolean is_ascii; + /* The value has ended at the quote mark. Combine it + * with the partial chunk if any; set it for the current + * attribute. + */ + add_to_partial (context, context->start, context->iter); + + g_assert (context->cur_attr >= 0); + + if (unescape_gstring_inplace (context, context->partial_chunk, &is_ascii, error) && + (is_ascii || text_validate (context, context->partial_chunk->str, + context->partial_chunk->len, error))) + { + /* success, advance past quote and set state. */ + context->attr_values[context->cur_attr] = context->partial_chunk; + context->partial_chunk = NULL; + advance_char (context); + context->state = STATE_BETWEEN_ATTRIBUTES; + context->start = NULL; + } + + truncate_partial (context); + } + break; + + case STATE_INSIDE_TEXT: + /* Possible next states: AFTER_OPEN_ANGLE */ + do + { + if (*context->iter == '<') + break; + } + while (advance_char (context)); + + /* The text hasn't necessarily ended. Merge with + * partial chunk, leave state unchanged. + */ + + add_to_partial (context, context->start, context->iter); + + if (context->iter != context->current_text_end) + { + gboolean is_ascii; + + /* The text has ended at the open angle. Call the text + * callback. + */ + + if (unescape_gstring_inplace (context, context->partial_chunk, &is_ascii, error) && + (is_ascii || text_validate (context, context->partial_chunk->str, + context->partial_chunk->len, error))) + { + GError *tmp_error = NULL; + + if (context->parser->text) + (*context->parser->text) (context, + context->partial_chunk->str, + context->partial_chunk->len, + context->user_data, + &tmp_error); + + if (tmp_error == NULL) + { + /* advance past open angle and set state. */ + advance_char (context); + context->state = STATE_AFTER_OPEN_ANGLE; + /* could begin a passthrough */ + context->start = context->iter; + } + else + propagate_error (context, error, tmp_error); + } + + truncate_partial (context); + } + break; + + case STATE_AFTER_CLOSE_TAG_SLASH: + /* Possible next state: INSIDE_CLOSE_TAG_NAME */ + if (!IS_COMMON_NAME_END_CHAR (*(context->iter))) + { + context->state = STATE_INSIDE_CLOSE_TAG_NAME; + + /* start of tag name */ + context->start = context->iter; + } + else + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("'%s' is not a valid character following " + "the characters 'iter, buf), + utf8_str (context->iter, buf)); + } + break; + + case STATE_INSIDE_CLOSE_TAG_NAME: + /* Possible next state: AFTER_CLOSE_TAG_NAME */ + advance_to_name_end (context); + add_to_partial (context, context->start, context->iter); + + if (context->iter != context->current_text_end) + context->state = STATE_AFTER_CLOSE_TAG_NAME; + break; + + case STATE_AFTER_CLOSE_TAG_NAME: + /* Possible next state: AFTER_CLOSE_TAG_SLASH */ + + skip_spaces (context); + + if (context->iter != context->current_text_end) + { + GString *close_name; + + close_name = context->partial_chunk; + context->partial_chunk = NULL; + + if (*context->iter != '>') + { + gchar buf[8]; + + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("'%s' is not a valid character following " + "the close element name '%s'; the allowed " + "character is '>'"), + utf8_str (context->iter, buf), + close_name->str); + } + else if (context->tag_stack == NULL) + { + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("Element '%s' was closed, no element " + "is currently open"), + close_name->str); + } + else if (strcmp (close_name->str, current_element (context)) != 0) + { + set_error (context, + error, + G_MARKUP_ERROR_PARSE, + _("Element '%s' was closed, but the currently " + "open element is '%s'"), + close_name->str, + current_element (context)); + } + else + { + GError *tmp_error; + advance_char (context); + context->state = STATE_AFTER_CLOSE_ANGLE; + context->start = NULL; + + possibly_finish_subparser (context); + + /* call the end_element callback */ + tmp_error = NULL; + if (context->parser->end_element) + (* context->parser->end_element) (context, + close_name->str, + context->user_data, + &tmp_error); + + ensure_no_outstanding_subparser (context); + pop_tag (context); + + if (tmp_error) + propagate_error (context, error, tmp_error); + } + context->partial_chunk = close_name; + truncate_partial (context); + } + break; + + case STATE_INSIDE_PASSTHROUGH: + /* Possible next state: AFTER_CLOSE_ANGLE */ + do + { + if (*context->iter == '<') + context->balance++; + if (*context->iter == '>') + { + gchar *str; + gsize len; + + context->balance--; + add_to_partial (context, context->start, context->iter); + context->start = context->iter; + + str = context->partial_chunk->str; + len = context->partial_chunk->len; + + if (str[1] == '?' && str[len - 1] == '?') + break; + if (strncmp (str, "* Create a GMemChunk with atoms 50 bytes long, and memory + * blocks holding 100 bytes. Note that this means that only 2 atoms + * fit into each memory block and so isn't very efficient. */ + * mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE); + * /* Now allocate 10000 atoms. */ + * for (i = 0; i < 10000; i++) + * { + * mem[i] = g_chunk_new (gchar, mem_chunk); + * /* Fill in the atom memory with some junk. */ + * for (j = 0; j < 50; j++) + * mem[i][j] = i * j; + * } + * /* Now free all of the atoms. Note that since we are going to + * destroy the GMemChunk, this wouldn't normally be used. */ + * for (i = 0; i < 10000; i++) + * { + * g_mem_chunk_free (mem_chunk, mem[i]); + * } + * /* We are finished with the GMemChunk, so we destroy it. */ + * g_mem_chunk_destroy (mem_chunk); + *
+ * + * + * + * Using a #GMemChunk with data structures + * + * GMemChunk *array_mem_chunk; + * GRealArray *array; + * /* Create a GMemChunk to hold GRealArray structures, using + * the g_mem_chunk_create() convenience macro. We want 1024 atoms in each + * memory block, and we want to be able to free individual atoms. */ + * array_mem_chunk = g_mem_chunk_create (GRealArray, 1024, G_ALLOC_AND_FREE); + * /* Allocate one atom, using the g_chunk_new() convenience macro. */ + * array = g_chunk_new (GRealArray, array_mem_chunk); + * /* We can now use array just like a normal pointer to a structure. */ + * array->data = NULL; + * array->len = 0; + * array->alloc = 0; + * array->zero_terminated = (zero_terminated ? 1 : 0); + * array->clear = (clear ? 1 : 0); + * array->elt_size = elt_size; + * /* We can free the element, so it can be reused. */ + * g_chunk_free (array, array_mem_chunk); + * /* We destroy the GMemChunk when we are finished with it. */ + * g_mem_chunk_destroy (array_mem_chunk); + * + * + **/ + +#ifndef G_ALLOC_AND_FREE + +/** + * GAllocator: + * + * The #GAllocator struct contains private data. and should only be + * accessed using the following functions. + **/ +typedef struct _GAllocator GAllocator; + +/** + * GMemChunk: + * + * The #GMemChunk struct is an opaque data structure representing a + * memory chunk. It should be accessed only through the use of the + * following functions. + **/ +typedef struct _GMemChunk GMemChunk; + +/** + * G_ALLOC_ONLY: + * + * Specifies the type of a #GMemChunk. Used in g_mem_chunk_new() and + * g_mem_chunk_create() to specify that atoms will never be freed + * individually. + **/ +#define G_ALLOC_ONLY 1 + +/** + * G_ALLOC_AND_FREE: + * + * Specifies the type of a #GMemChunk. Used in g_mem_chunk_new() and + * g_mem_chunk_create() to specify that atoms will be freed + * individually. + **/ +#define G_ALLOC_AND_FREE 2 +#endif + +struct _GMemChunk { + guint alloc_size; /* the size of an atom */ +}; + +/** + * g_mem_chunk_new: + * @name: a string to identify the #GMemChunk. It is not copied so it + * should be valid for the lifetime of the #GMemChunk. It is + * only used in g_mem_chunk_print(), which is used for debugging. + * @atom_size: the size, in bytes, of each element in the #GMemChunk. + * @area_size: the size, in bytes, of each block of memory allocated to + * contain the atoms. + * @type: the type of the #GMemChunk. #G_ALLOC_AND_FREE is used if the + * atoms will be freed individually. #G_ALLOC_ONLY should be + * used if atoms will never be freed individually. + * #G_ALLOC_ONLY is quicker, since it does not need to track + * free atoms, but it obviously wastes memory if you no longer + * need many of the atoms. + * @Returns: the new #GMemChunk. + * + * Creates a new #GMemChunk. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +GMemChunk* +g_mem_chunk_new (const gchar *name, + gint atom_size, + gsize area_size, + gint type) +{ + GMemChunk *mem_chunk; + g_return_val_if_fail (atom_size > 0, NULL); + + mem_chunk = g_slice_new (GMemChunk); + mem_chunk->alloc_size = atom_size; + return mem_chunk; +} + +/** + * g_mem_chunk_destroy: + * @mem_chunk: a #GMemChunk. + * + * Frees all of the memory allocated for a #GMemChunk. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void +g_mem_chunk_destroy (GMemChunk *mem_chunk) +{ + g_return_if_fail (mem_chunk != NULL); + + g_slice_free (GMemChunk, mem_chunk); +} + +/** + * g_mem_chunk_alloc: + * @mem_chunk: a #GMemChunk. + * @Returns: a pointer to the allocated atom. + * + * Allocates an atom of memory from a #GMemChunk. + * + * Deprecated:2.10: Use g_slice_alloc() instead + **/ +gpointer +g_mem_chunk_alloc (GMemChunk *mem_chunk) +{ + g_return_val_if_fail (mem_chunk != NULL, NULL); + + return g_slice_alloc (mem_chunk->alloc_size); +} + +/** + * g_mem_chunk_alloc0: + * @mem_chunk: a #GMemChunk. + * @Returns: a pointer to the allocated atom. + * + * Allocates an atom of memory from a #GMemChunk, setting the memory to + * 0. + * + * Deprecated:2.10: Use g_slice_alloc0() instead + **/ +gpointer +g_mem_chunk_alloc0 (GMemChunk *mem_chunk) +{ + g_return_val_if_fail (mem_chunk != NULL, NULL); + + return g_slice_alloc0 (mem_chunk->alloc_size); +} + +/** + * g_mem_chunk_free: + * @mem_chunk: a #GMemChunk. + * @mem: a pointer to the atom to free. + * + * Frees an atom in a #GMemChunk. This should only be called if the + * #GMemChunk was created with #G_ALLOC_AND_FREE. Otherwise it will + * simply return. + * + * Deprecated:2.10: Use g_slice_free1() instead + **/ +void +g_mem_chunk_free (GMemChunk *mem_chunk, + gpointer mem) +{ + g_return_if_fail (mem_chunk != NULL); + + g_slice_free1 (mem_chunk->alloc_size, mem); +} + +/** + * g_mem_chunk_clean: + * @mem_chunk: a #GMemChunk. + * + * Frees any blocks in a #GMemChunk which are no longer being used. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void g_mem_chunk_clean (GMemChunk *mem_chunk) {} + +/** + * g_mem_chunk_reset: + * @mem_chunk: a #GMemChunk. + * + * Resets a GMemChunk to its initial state. It frees all of the + * currently allocated blocks of memory. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void g_mem_chunk_reset (GMemChunk *mem_chunk) {} + + +/** + * g_mem_chunk_print: + * @mem_chunk: a #GMemChunk. + * + * Outputs debugging information for a #GMemChunk. It outputs the name + * of the #GMemChunk (set with g_mem_chunk_new()), the number of bytes + * used, and the number of blocks of memory allocated. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void g_mem_chunk_print (GMemChunk *mem_chunk) {} + + +/** + * g_mem_chunk_info: + * + * Outputs debugging information for all #GMemChunk objects currently + * in use. It outputs the number of #GMemChunk objects currently + * allocated, and calls g_mem_chunk_print() to output information on + * each one. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void g_mem_chunk_info (void) {} + +/** + * g_blow_chunks: + * + * Calls g_mem_chunk_clean() on all #GMemChunk objects. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void g_blow_chunks (void) {} + +/** + * g_chunk_new0: + * @type: the type of the #GMemChunk atoms, typically a structure name. + * @chunk: a #GMemChunk. + * @Returns: a pointer to the allocated atom, cast to a pointer to + * @type. + * + * A convenience macro to allocate an atom of memory from a #GMemChunk. + * It calls g_mem_chunk_alloc0() and casts the returned atom to a + * pointer to the given type, avoiding a type cast in the source code. + * + * Deprecated:2.10: Use g_slice_new0() instead + **/ + +/** + * g_chunk_free: + * @mem: a pointer to the atom to be freed. + * @mem_chunk: a #GMemChunk. + * + * A convenience macro to free an atom of memory from a #GMemChunk. It + * simply switches the arguments and calls g_mem_chunk_free() It is + * included simply to complement the other convenience macros, + * g_chunk_new() and g_chunk_new0(). + * + * Deprecated:2.10: Use g_slice_free() instead + **/ + +/** + * g_chunk_new: + * @type: the type of the #GMemChunk atoms, typically a structure name. + * @chunk: a #GMemChunk. + * @Returns: a pointer to the allocated atom, cast to a pointer to + * @type. + * + * A convenience macro to allocate an atom of memory from a #GMemChunk. + * It calls g_mem_chunk_alloc() and casts the returned atom to a + * pointer to the given type, avoiding a type cast in the source code. + * + * Deprecated:2.10: Use g_slice_new() instead + **/ + +/** + * g_mem_chunk_create: + * @type: the type of the atoms, typically a structure name. + * @pre_alloc: the number of atoms to store in each block of memory. + * @alloc_type: the type of the #GMemChunk. #G_ALLOC_AND_FREE is used + * if the atoms will be freed individually. #G_ALLOC_ONLY + * should be used if atoms will never be freed + * individually. #G_ALLOC_ONLY is quicker, since it does + * not need to track free atoms, but it obviously wastes + * memory if you no longer need many of the atoms. + * @Returns: the new #GMemChunk. + * + * A convenience macro for creating a new #GMemChunk. It calls + * g_mem_chunk_new(), using the given type to create the #GMemChunk + * name. The atom size is determined using + * sizeof(), and the area size is calculated by + * multiplying the @pre_alloc parameter with the atom size. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ + + +/** + * g_allocator_new: + * @name: the name of the #GAllocator. This name is used to set the + * name of the #GMemChunk used by the #GAllocator, and is only + * used for debugging. + * @n_preallocs: the number of elements in each block of memory + * allocated. Larger blocks mean less calls to + * g_malloc(), but some memory may be wasted. (GLib uses + * 128 elements per block by default.) The value must be + * between 1 and 65535. + * @Returns: a new #GAllocator. + * + * Creates a new #GAllocator. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +GAllocator* +g_allocator_new (const gchar *name, + guint n_preallocs) +{ + static struct _GAllocator { + gchar *name; + guint16 n_preallocs; + guint is_unused : 1; + guint type : 4; + GAllocator *last; + GMemChunk *mem_chunk; + gpointer free_list; + } dummy = { + "GAllocator is deprecated", 1, TRUE, 0, NULL, NULL, NULL, + }; + /* some (broken) GAllocator uses depend on non-NULL allocators */ + return (void*) &dummy; +} + +/** + * g_allocator_free: + * @allocator: a #GAllocator. + * + * Frees all of the memory allocated by the #GAllocator. + * + * Deprecated:2.10: Use the slice + * allocator instead + **/ +void +g_allocator_free (GAllocator *allocator) +{ +} + +#ifdef ENABLE_GC_FRIENDLY_DEFAULT +gboolean g_mem_gc_friendly = TRUE; +#else +gboolean g_mem_gc_friendly = FALSE; +#endif + +static void +g_mem_init_nomessage (void) +{ + gchar buffer[1024]; + const gchar *val; + const GDebugKey keys[] = { + { "gc-friendly", 1 }, + }; + gint flags; + if (g_mem_initialized) + return; + /* don't use g_malloc/g_message here */ + val = _g_getenv_nomalloc ("G_DEBUG", buffer); + flags = !val ? 0 : g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + if (flags & 1) /* gc-friendly */ + { + g_mem_gc_friendly = TRUE; + } + g_mem_initialized = TRUE; +} + +void +_g_mem_thread_init_noprivate_nomessage (void) +{ + /* we may only create mutexes here, locking/ + * unlocking a mutex does not yet work. + */ + g_mem_init_nomessage(); +#ifndef G_DISABLE_CHECKS + gmem_profile_mutex = g_mutex_new (); +#endif +} + +#define __G_MEM_C__ +#include "galiasdef.c" diff --git a/glib/gmem.h b/glib/gmem.h new file mode 100644 index 0000000..2fef766 --- /dev/null +++ b/glib/gmem.h @@ -0,0 +1,203 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MEM_H__ +#define __G_MEM_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GMemVTable GMemVTable; + + +#if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG +# define G_MEM_ALIGN GLIB_SIZEOF_VOID_P +#else /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ +# define G_MEM_ALIGN GLIB_SIZEOF_LONG +#endif /* GLIB_SIZEOF_VOID_P <= GLIB_SIZEOF_LONG */ + + +/* Memory allocation functions + */ + +void g_free (gpointer mem); + +gpointer g_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +gpointer g_malloc0 (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +gpointer g_realloc (gpointer mem, + gsize n_bytes) G_GNUC_WARN_UNUSED_RESULT; +gpointer g_try_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +gpointer g_try_malloc0 (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +gpointer g_try_realloc (gpointer mem, + gsize n_bytes) G_GNUC_WARN_UNUSED_RESULT; + +gpointer g_malloc_n (gsize n_blocks, + gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2); +gpointer g_malloc0_n (gsize n_blocks, + gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2); +gpointer g_realloc_n (gpointer mem, + gsize n_blocks, + gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT; +gpointer g_try_malloc_n (gsize n_blocks, + gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2); +gpointer g_try_malloc0_n (gsize n_blocks, + gsize n_block_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE2(1,2); +gpointer g_try_realloc_n (gpointer mem, + gsize n_blocks, + gsize n_block_bytes) G_GNUC_WARN_UNUSED_RESULT; + + +/* Optimise: avoid the call to the (slower) _n function if we can + * determine at compile-time that no overflow happens. + */ +#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__) +# define _G_NEW(struct_type, n_structs, func) \ + (struct_type *) (__extension__ ({ \ + gsize __n = (gsize) (n_structs); \ + gsize __s = sizeof (struct_type); \ + gpointer __p; \ + if (__s == 1) \ + __p = g_##func (__n); \ + else if (__builtin_constant_p (__n) && \ + __n <= G_MAXSIZE / __s) \ + __p = g_##func (__n * __s); \ + else \ + __p = g_##func##_n (__n, __s); \ + __p; \ + })) +# define _G_RENEW(struct_type, mem, n_structs, func) \ + (struct_type *) (__extension__ ({ \ + gsize __n = (gsize) (n_structs); \ + gsize __s = sizeof (struct_type); \ + gpointer __p = (gpointer) (mem); \ + if (__s == 1) \ + __p = g_##func (__p, __n); \ + else if (__builtin_constant_p (__n) && \ + __n <= G_MAXSIZE / __s) \ + __p = g_##func (__p, __n * __s); \ + else \ + __p = g_##func##_n (__p, __n, __s); \ + __p; \ + })) + +#else + +/* Unoptimised version: always call the _n() function. */ + +#define _G_NEW(struct_type, n_structs, func) \ + ((struct_type *) g_##func##_n ((n_structs), sizeof (struct_type))) +#define _G_RENEW(struct_type, mem, n_structs, func) \ + ((struct_type *) g_##func##_n (mem, (n_structs), sizeof (struct_type))) + +#endif + +#define g_new(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc) +#define g_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, malloc0) +#define g_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, realloc) +#define g_try_new(struct_type, n_structs) _G_NEW (struct_type, n_structs, try_malloc) +#define g_try_new0(struct_type, n_structs) _G_NEW (struct_type, n_structs, try_malloc0) +#define g_try_renew(struct_type, mem, n_structs) _G_RENEW (struct_type, mem, n_structs, try_realloc) + + +/* Memory allocation virtualization for debugging purposes + * g_mem_set_vtable() has to be the very first GLib function called + * if being used + */ +struct _GMemVTable { + gpointer (*malloc) (gsize n_bytes); + gpointer (*realloc) (gpointer mem, + gsize n_bytes); + void (*free) (gpointer mem); + /* optional; set to NULL if not used ! */ + gpointer (*calloc) (gsize n_blocks, + gsize n_block_bytes); + gpointer (*try_malloc) (gsize n_bytes); + gpointer (*try_realloc) (gpointer mem, + gsize n_bytes); +}; +void g_mem_set_vtable (GMemVTable *vtable); +gboolean g_mem_is_system_malloc (void); + +GLIB_VAR gboolean g_mem_gc_friendly; + +/* Memory profiler and checker, has to be enabled via g_mem_set_vtable() + */ +GLIB_VAR GMemVTable *glib_mem_profiler_table; +void g_mem_profile (void); + + +/* deprecated memchunks and allocators */ +#if !defined (G_DISABLE_DEPRECATED) || defined (GTK_COMPILATION) || defined (GDK_COMPILATION) +typedef struct _GAllocator GAllocator; +typedef struct _GMemChunk GMemChunk; +#define g_mem_chunk_create(type, pre_alloc, alloc_type) ( \ + g_mem_chunk_new (#type " mem chunks (" #pre_alloc ")", \ + sizeof (type), \ + sizeof (type) * (pre_alloc), \ + (alloc_type)) \ +) +#define g_chunk_new(type, chunk) ( \ + (type *) g_mem_chunk_alloc (chunk) \ +) +#define g_chunk_new0(type, chunk) ( \ + (type *) g_mem_chunk_alloc0 (chunk) \ +) +#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ + g_mem_chunk_free ((mem_chunk), (mem)); \ +} G_STMT_END +#define G_ALLOC_ONLY 1 +#define G_ALLOC_AND_FREE 2 +GMemChunk* g_mem_chunk_new (const gchar *name, + gint atom_size, + gsize area_size, + gint type); +void g_mem_chunk_destroy (GMemChunk *mem_chunk); +gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk); +gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk); +void g_mem_chunk_free (GMemChunk *mem_chunk, + gpointer mem); +void g_mem_chunk_clean (GMemChunk *mem_chunk); +void g_mem_chunk_reset (GMemChunk *mem_chunk); +void g_mem_chunk_print (GMemChunk *mem_chunk); +void g_mem_chunk_info (void); +void g_blow_chunks (void); +GAllocator*g_allocator_new (const gchar *name, + guint n_preallocs); +void g_allocator_free (GAllocator *allocator); +#define G_ALLOCATOR_LIST (1) +#define G_ALLOCATOR_SLIST (2) +#define G_ALLOCATOR_NODE (3) +#endif /* G_DISABLE_DEPRECATED */ + +G_END_DECLS + +#endif /* __G_MEM_H__ */ diff --git a/glib/gmessages.c b/glib/gmessages.c new file mode 100644 index 0000000..9a3eec3 --- /dev/null +++ b/glib/gmessages.c @@ -0,0 +1,1166 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include + +#include "glib.h" +#include "gdebug.h" +#include "gprintfint.h" +#include "gthreadprivate.h" +#include "galias.h" + +#ifdef G_OS_WIN32 +#include /* For getpid() */ +#include +# define STRICT /* Strict typing, please */ +# define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */ +# include +# undef STRICT +#endif + +/* --- structures --- */ +typedef struct _GLogDomain GLogDomain; +typedef struct _GLogHandler GLogHandler; +struct _GLogDomain +{ + gchar *log_domain; + GLogLevelFlags fatal_mask; + GLogHandler *handlers; + GLogDomain *next; +}; +struct _GLogHandler +{ + guint id; + GLogLevelFlags log_level; + GLogFunc log_func; + gpointer data; + GLogHandler *next; +}; + + +/* --- variables --- */ +static GMutex *g_messages_lock = NULL; +static GLogDomain *g_log_domains = NULL; +static GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK; +static GPrintFunc glib_print_func = NULL; +static GPrintFunc glib_printerr_func = NULL; +static GPrivate *g_log_depth = NULL; +static GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG; +static GLogFunc default_log_func = g_log_default_handler; +static gpointer default_log_data = NULL; +static GTestLogFatalFunc fatal_log_func = NULL; +static gpointer fatal_log_data; + +/* --- functions --- */ +#ifdef G_OS_WIN32 +# define STRICT +# include +# undef STRICT +static gboolean win32_keep_fatal_message = FALSE; + +/* This default message will usually be overwritten. */ +/* Yes, a fixed size buffer is bad. So sue me. But g_error() is never + * called with huge strings, is it? + */ +static gchar fatal_msg_buf[1000] = "Unspecified fatal error encountered, aborting."; +static gchar *fatal_msg_ptr = fatal_msg_buf; + +#undef write +static inline int +dowrite (int fd, + const void *buf, + unsigned int len) +{ + if (win32_keep_fatal_message) + { + memcpy (fatal_msg_ptr, buf, len); + fatal_msg_ptr += len; + *fatal_msg_ptr = 0; + return len; + } + + write (fd, buf, len); + + return len; +} +#define write(fd, buf, len) dowrite(fd, buf, len) + +#endif + +static void +write_string (int fd, + const gchar *string) +{ + write (fd, string, strlen (string)); +} + +static void +g_messages_prefixed_init (void) +{ + static gboolean initialized = FALSE; + + if (!initialized) + { + const gchar *val; + + initialized = TRUE; + val = g_getenv ("G_MESSAGES_PREFIXED"); + + if (val) + { + const GDebugKey keys[] = { + { "error", G_LOG_LEVEL_ERROR }, + { "critical", G_LOG_LEVEL_CRITICAL }, + { "warning", G_LOG_LEVEL_WARNING }, + { "message", G_LOG_LEVEL_MESSAGE }, + { "info", G_LOG_LEVEL_INFO }, + { "debug", G_LOG_LEVEL_DEBUG } + }; + + g_log_msg_prefix = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + } + } +} + +static GLogDomain* +g_log_find_domain_L (const gchar *log_domain) +{ + register GLogDomain *domain; + + domain = g_log_domains; + while (domain) + { + if (strcmp (domain->log_domain, log_domain) == 0) + return domain; + domain = domain->next; + } + return NULL; +} + +static GLogDomain* +g_log_domain_new_L (const gchar *log_domain) +{ + register GLogDomain *domain; + + domain = g_new (GLogDomain, 1); + domain->log_domain = g_strdup (log_domain); + domain->fatal_mask = G_LOG_FATAL_MASK; + domain->handlers = NULL; + + domain->next = g_log_domains; + g_log_domains = domain; + + return domain; +} + +static void +g_log_domain_check_free_L (GLogDomain *domain) +{ + if (domain->fatal_mask == G_LOG_FATAL_MASK && + domain->handlers == NULL) + { + register GLogDomain *last, *work; + + last = NULL; + + work = g_log_domains; + while (work) + { + if (work == domain) + { + if (last) + last->next = domain->next; + else + g_log_domains = domain->next; + g_free (domain->log_domain); + g_free (domain); + break; + } + last = work; + work = last->next; + } + } +} + +static GLogFunc +g_log_domain_get_handler_L (GLogDomain *domain, + GLogLevelFlags log_level, + gpointer *data) +{ + if (domain && log_level) + { + register GLogHandler *handler; + + handler = domain->handlers; + while (handler) + { + if ((handler->log_level & log_level) == log_level) + { + *data = handler->data; + return handler->log_func; + } + handler = handler->next; + } + } + + *data = default_log_data; + return default_log_func; +} + +GLogLevelFlags +g_log_set_always_fatal (GLogLevelFlags fatal_mask) +{ + GLogLevelFlags old_mask; + + /* restrict the global mask to levels that are known to glib + * since this setting applies to all domains + */ + fatal_mask &= (1 << G_LOG_LEVEL_USER_SHIFT) - 1; + /* force errors to be fatal */ + fatal_mask |= G_LOG_LEVEL_ERROR; + /* remove bogus flag */ + fatal_mask &= ~G_LOG_FLAG_FATAL; + + g_mutex_lock (g_messages_lock); + old_mask = g_log_always_fatal; + g_log_always_fatal = fatal_mask; + g_mutex_unlock (g_messages_lock); + + return old_mask; +} + +GLogLevelFlags +g_log_set_fatal_mask (const gchar *log_domain, + GLogLevelFlags fatal_mask) +{ + GLogLevelFlags old_flags; + register GLogDomain *domain; + + if (!log_domain) + log_domain = ""; + + /* force errors to be fatal */ + fatal_mask |= G_LOG_LEVEL_ERROR; + /* remove bogus flag */ + fatal_mask &= ~G_LOG_FLAG_FATAL; + + g_mutex_lock (g_messages_lock); + + domain = g_log_find_domain_L (log_domain); + if (!domain) + domain = g_log_domain_new_L (log_domain); + old_flags = domain->fatal_mask; + + domain->fatal_mask = fatal_mask; + g_log_domain_check_free_L (domain); + + g_mutex_unlock (g_messages_lock); + + return old_flags; +} + +guint +g_log_set_handler (const gchar *log_domain, + GLogLevelFlags log_levels, + GLogFunc log_func, + gpointer user_data) +{ + static guint handler_id = 0; + GLogDomain *domain; + GLogHandler *handler; + + g_return_val_if_fail ((log_levels & G_LOG_LEVEL_MASK) != 0, 0); + g_return_val_if_fail (log_func != NULL, 0); + + if (!log_domain) + log_domain = ""; + + handler = g_new (GLogHandler, 1); + + g_mutex_lock (g_messages_lock); + + domain = g_log_find_domain_L (log_domain); + if (!domain) + domain = g_log_domain_new_L (log_domain); + + handler->id = ++handler_id; + handler->log_level = log_levels; + handler->log_func = log_func; + handler->data = user_data; + handler->next = domain->handlers; + domain->handlers = handler; + + g_mutex_unlock (g_messages_lock); + + return handler_id; +} + +GLogFunc +g_log_set_default_handler (GLogFunc log_func, + gpointer user_data) +{ + GLogFunc old_log_func; + + g_mutex_lock (g_messages_lock); + old_log_func = default_log_func; + default_log_func = log_func; + default_log_data = user_data; + g_mutex_unlock (g_messages_lock); + + return old_log_func; +} + +/** + * g_test_log_set_fatal_handler: + * @log_func: the log handler function. + * @user_data: data passed to the log handler. + * + * Installs a non-error fatal log handler which can be + * used to decide whether log messages which are counted + * as fatal abort the program. + * + * The use case here is that you are running a test case + * that depends on particular libraries or circumstances + * and cannot prevent certain known critical or warning + * messages. So you install a handler that compares the + * domain and message to precisely not abort in such a case. + * + * Note that the handler is reset at the beginning of + * any test case, so you have to set it inside each test + * function which needs the special behavior. + * + * This handler has no effect on g_error messages. + * + * Since: 2.22 + **/ +void +g_test_log_set_fatal_handler (GTestLogFatalFunc log_func, + gpointer user_data) +{ + g_mutex_lock (g_messages_lock); + fatal_log_func = log_func; + fatal_log_data = user_data; + g_mutex_unlock (g_messages_lock); +} + +void +g_log_remove_handler (const gchar *log_domain, + guint handler_id) +{ + register GLogDomain *domain; + + g_return_if_fail (handler_id > 0); + + if (!log_domain) + log_domain = ""; + + g_mutex_lock (g_messages_lock); + domain = g_log_find_domain_L (log_domain); + if (domain) + { + GLogHandler *work, *last; + + last = NULL; + work = domain->handlers; + while (work) + { + if (work->id == handler_id) + { + if (last) + last->next = work->next; + else + domain->handlers = work->next; + g_log_domain_check_free_L (domain); + g_mutex_unlock (g_messages_lock); + g_free (work); + return; + } + last = work; + work = last->next; + } + } + g_mutex_unlock (g_messages_lock); + g_warning ("%s: could not find handler with id `%d' for domain \"%s\"", + G_STRLOC, handler_id, log_domain); +} + +void +g_logv (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *format, + va_list args1) +{ + gboolean was_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; + gboolean was_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0; + gint i; + + log_level &= G_LOG_LEVEL_MASK; + if (!log_level) + return; + + for (i = g_bit_nth_msf (log_level, -1); i >= 0; i = g_bit_nth_msf (log_level, i)) + { + register GLogLevelFlags test_level; + + test_level = 1 << i; + if (log_level & test_level) + { + guint depth = GPOINTER_TO_UINT (g_private_get (g_log_depth)); + GLogDomain *domain; + GLogFunc log_func; + GLogLevelFlags domain_fatal_mask; + gpointer data = NULL; + gboolean masquerade_fatal = FALSE; + + if (was_fatal) + test_level |= G_LOG_FLAG_FATAL; + if (was_recursion) + test_level |= G_LOG_FLAG_RECURSION; + + /* check recursion and lookup handler */ + g_mutex_lock (g_messages_lock); + domain = g_log_find_domain_L (log_domain ? log_domain : ""); + if (depth) + test_level |= G_LOG_FLAG_RECURSION; + depth++; + domain_fatal_mask = domain ? domain->fatal_mask : G_LOG_FATAL_MASK; + if ((domain_fatal_mask | g_log_always_fatal) & test_level) + test_level |= G_LOG_FLAG_FATAL; + if (test_level & G_LOG_FLAG_RECURSION) + log_func = _g_log_fallback_handler; + else + log_func = g_log_domain_get_handler_L (domain, test_level, &data); + domain = NULL; + g_mutex_unlock (g_messages_lock); + + g_private_set (g_log_depth, GUINT_TO_POINTER (depth)); + + /* had to defer debug initialization until we can keep track of recursion */ + if (!(test_level & G_LOG_FLAG_RECURSION) && !_g_debug_initialized) + { + GLogLevelFlags orig_test_level = test_level; + + _g_debug_init (); + if ((domain_fatal_mask | g_log_always_fatal) & test_level) + test_level |= G_LOG_FLAG_FATAL; + if (test_level != orig_test_level) + { + /* need a relookup, not nice, but not too bad either */ + g_mutex_lock (g_messages_lock); + domain = g_log_find_domain_L (log_domain ? log_domain : ""); + log_func = g_log_domain_get_handler_L (domain, test_level, &data); + domain = NULL; + g_mutex_unlock (g_messages_lock); + } + } + + if (test_level & G_LOG_FLAG_RECURSION) + { + /* we use a stack buffer of fixed size, since we're likely + * in an out-of-memory situation + */ + gchar buffer[1025]; + gsize size; + va_list args2; + + G_VA_COPY (args2, args1); + size = _g_vsnprintf (buffer, 1024, format, args2); + va_end (args2); + + log_func (log_domain, test_level, buffer, data); + } + else + { + gchar *msg; + va_list args2; + + G_VA_COPY (args2, args1); + msg = g_strdup_vprintf (format, args2); + va_end (args2); + + log_func (log_domain, test_level, msg, data); + + if ((test_level & G_LOG_FLAG_FATAL) + && !(test_level & G_LOG_LEVEL_ERROR)) + { + masquerade_fatal = fatal_log_func + && !fatal_log_func (log_domain, test_level, msg, data); + } + + g_free (msg); + } + + if ((test_level & G_LOG_FLAG_FATAL) && !masquerade_fatal) + { +#ifdef G_OS_WIN32 + gchar *locale_msg = g_locale_from_utf8 (fatal_msg_buf, -1, NULL, NULL, NULL); + + MessageBox (NULL, locale_msg, NULL, + MB_ICONERROR|MB_SETFOREGROUND); + if (IsDebuggerPresent () && !(test_level & G_LOG_FLAG_RECURSION)) + G_BREAKPOINT (); + else + abort (); +#else +#if defined (G_ENABLE_DEBUG) && defined (SIGTRAP) + if (!(test_level & G_LOG_FLAG_RECURSION)) + G_BREAKPOINT (); + else + abort (); +#else /* !G_ENABLE_DEBUG || !SIGTRAP */ + abort (); +#endif /* !G_ENABLE_DEBUG || !SIGTRAP */ +#endif /* !G_OS_WIN32 */ + } + + depth--; + g_private_set (g_log_depth, GUINT_TO_POINTER (depth)); + } + } +} + +void +g_log (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *format, + ...) +{ + va_list args; + + va_start (args, format); + g_logv (log_domain, log_level, format, args); + va_end (args); +} + +void +g_return_if_fail_warning (const char *log_domain, + const char *pretty_function, + const char *expression) +{ + /* + * Omit the prefix used by the PLT-reduction + * technique used in GTK+. + */ + if (g_str_has_prefix (pretty_function, "IA__")) + pretty_function += 4; + g_log (log_domain, + G_LOG_LEVEL_CRITICAL, + "%s: assertion `%s' failed", + pretty_function, + expression); +} + +void +g_warn_message (const char *domain, + const char *file, + int line, + const char *func, + const char *warnexpr) +{ + char *s, lstr[32]; + g_snprintf (lstr, 32, "%d", line); + if (warnexpr) + s = g_strconcat ("(", file, ":", lstr, "):", + func, func[0] ? ":" : "", + " runtime check failed: (", warnexpr, ")", NULL); + else + s = g_strconcat ("(", file, ":", lstr, "):", + func, func[0] ? ":" : "", + " ", "code should not be reached", NULL); + g_log (domain, G_LOG_LEVEL_WARNING, "%s", s); + g_free (s); +} + +void +g_assert_warning (const char *log_domain, + const char *file, + const int line, + const char *pretty_function, + const char *expression) +{ + /* + * Omit the prefix used by the PLT-reduction + * technique used in GTK+. + */ + if (g_str_has_prefix (pretty_function, "IA__")) + pretty_function += 4; + g_log (log_domain, + G_LOG_LEVEL_ERROR, + expression + ? "file %s: line %d (%s): assertion failed: (%s)" + : "file %s: line %d (%s): should not be reached", + file, + line, + pretty_function, + expression); + abort (); +} + +#define CHAR_IS_SAFE(wc) (!((wc < 0x20 && wc != '\t' && wc != '\n' && wc != '\r') || \ + (wc == 0x7f) || \ + (wc >= 0x80 && wc < 0xa0))) + +static gchar* +strdup_convert (const gchar *string, + const gchar *charset) +{ + if (!g_utf8_validate (string, -1, NULL)) + { + GString *gstring = g_string_new ("[Invalid UTF-8] "); + guchar *p; + + for (p = (guchar *)string; *p; p++) + { + if (CHAR_IS_SAFE(*p) && + !(*p == '\r' && *(p + 1) != '\n') && + *p < 0x80) + g_string_append_c (gstring, *p); + else + g_string_append_printf (gstring, "\\x%02x", (guint)(guchar)*p); + } + + return g_string_free (gstring, FALSE); + } + else + { + GError *err = NULL; + + gchar *result = g_convert_with_fallback (string, -1, charset, "UTF-8", "?", NULL, NULL, &err); + if (result) + return result; + else + { + /* Not thread-safe, but doesn't matter if we print the warning twice + */ + static gboolean warned = FALSE; + if (!warned) + { + warned = TRUE; + _g_fprintf (stderr, "GLib: Cannot convert message: %s\n", err->message); + } + g_error_free (err); + + return g_strdup (string); + } + } +} + +/* For a radix of 8 we need at most 3 output bytes for 1 input + * byte. Additionally we might need up to 2 output bytes for the + * readix prefix and 1 byte for the trailing NULL. + */ +#define FORMAT_UNSIGNED_BUFSIZE ((GLIB_SIZEOF_LONG * 3) + 3) + +static void +format_unsigned (gchar *buf, + gulong num, + guint radix) +{ + gulong tmp; + gchar c; + gint i, n; + + /* we may not call _any_ GLib functions here (or macros like g_return_if_fail()) */ + + if (radix != 8 && radix != 10 && radix != 16) + { + *buf = '\000'; + return; + } + + if (!num) + { + *buf++ = '0'; + *buf = '\000'; + return; + } + + if (radix == 16) + { + *buf++ = '0'; + *buf++ = 'x'; + } + else if (radix == 8) + { + *buf++ = '0'; + } + + n = 0; + tmp = num; + while (tmp) + { + tmp /= radix; + n++; + } + + i = n; + + /* Again we can't use g_assert; actually this check should _never_ fail. */ + if (n > FORMAT_UNSIGNED_BUFSIZE - 3) + { + *buf = '\000'; + return; + } + + while (num) + { + i--; + c = (num % radix); + if (c < 10) + buf[i] = c + '0'; + else + buf[i] = c + 'a' - 10; + num /= radix; + } + + buf[n] = '\000'; +} + +/* string size big enough to hold level prefix */ +#define STRING_BUFFER_SIZE (FORMAT_UNSIGNED_BUFSIZE + 32) + +#define ALERT_LEVELS (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING) + +static int +mklevel_prefix (gchar level_prefix[STRING_BUFFER_SIZE], + GLogLevelFlags log_level) +{ + gboolean to_stdout = TRUE; + + /* we may not call _any_ GLib functions here */ + + switch (log_level & G_LOG_LEVEL_MASK) + { + case G_LOG_LEVEL_ERROR: + strcpy (level_prefix, "ERROR"); + to_stdout = FALSE; + break; + case G_LOG_LEVEL_CRITICAL: + strcpy (level_prefix, "CRITICAL"); + to_stdout = FALSE; + break; + case G_LOG_LEVEL_WARNING: + strcpy (level_prefix, "WARNING"); + to_stdout = FALSE; + break; + case G_LOG_LEVEL_MESSAGE: + strcpy (level_prefix, "Message"); + to_stdout = FALSE; + break; + case G_LOG_LEVEL_INFO: + strcpy (level_prefix, "INFO"); + break; + case G_LOG_LEVEL_DEBUG: + strcpy (level_prefix, "DEBUG"); + break; + default: + if (log_level) + { + strcpy (level_prefix, "LOG-"); + format_unsigned (level_prefix + 4, log_level & G_LOG_LEVEL_MASK, 16); + } + else + strcpy (level_prefix, "LOG"); + break; + } + if (log_level & G_LOG_FLAG_RECURSION) + strcat (level_prefix, " (recursed)"); + if (log_level & ALERT_LEVELS) + strcat (level_prefix, " **"); + +#ifdef G_OS_WIN32 + win32_keep_fatal_message = (log_level & G_LOG_FLAG_FATAL) != 0; +#endif + return to_stdout ? 1 : 2; +} + +void +_g_log_fallback_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data) +{ + gchar level_prefix[STRING_BUFFER_SIZE]; +#ifndef G_OS_WIN32 + gchar pid_string[FORMAT_UNSIGNED_BUFSIZE]; +#endif + gboolean is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; + int fd; + + /* we can not call _any_ GLib functions in this fallback handler, + * which is why we skip UTF-8 conversion, etc. + * since we either recursed or ran out of memory, we're in a pretty + * pathologic situation anyways, what we can do is giving the + * the process ID unconditionally however. + */ + + fd = mklevel_prefix (level_prefix, log_level); + if (!message) + message = "(NULL) message"; + +#ifndef G_OS_WIN32 + format_unsigned (pid_string, getpid (), 10); +#endif + + if (log_domain) + write_string (fd, "\n"); + else + write_string (fd, "\n** "); + +#ifndef G_OS_WIN32 + write_string (fd, "(process:"); + write_string (fd, pid_string); + write_string (fd, "): "); +#endif + + if (log_domain) + { + write_string (fd, log_domain); + write_string (fd, "-"); + } + write_string (fd, level_prefix); + write_string (fd, ": "); + write_string (fd, message); + if (is_fatal) + write_string (fd, "\naborting...\n"); + else + write_string (fd, "\n"); +} + +static void +escape_string (GString *string) +{ + const char *p = string->str; + gunichar wc; + + while (p < string->str + string->len) + { + gboolean safe; + + wc = g_utf8_get_char_validated (p, -1); + if (wc == (gunichar)-1 || wc == (gunichar)-2) + { + gchar *tmp; + guint pos; + + pos = p - string->str; + + /* Emit invalid UTF-8 as hex escapes + */ + tmp = g_strdup_printf ("\\x%02x", (guint)(guchar)*p); + g_string_erase (string, pos, 1); + g_string_insert (string, pos, tmp); + + p = string->str + (pos + 4); /* Skip over escape sequence */ + + g_free (tmp); + continue; + } + if (wc == '\r') + { + safe = *(p + 1) == '\n'; + } + else + { + safe = CHAR_IS_SAFE (wc); + } + + if (!safe) + { + gchar *tmp; + guint pos; + + pos = p - string->str; + + /* Largest char we escape is 0x0a, so we don't have to worry + * about 8-digit \Uxxxxyyyy + */ + tmp = g_strdup_printf ("\\u%04x", wc); + g_string_erase (string, pos, g_utf8_next_char (p) - p); + g_string_insert (string, pos, tmp); + g_free (tmp); + + p = string->str + (pos + 6); /* Skip over escape sequence */ + } + else + p = g_utf8_next_char (p); + } +} + +void +g_log_default_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data) +{ + gboolean is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; + gchar level_prefix[STRING_BUFFER_SIZE], *string; + GString *gstring; + int fd; + + /* we can be called externally with recursion for whatever reason */ + if (log_level & G_LOG_FLAG_RECURSION) + { + _g_log_fallback_handler (log_domain, log_level, message, unused_data); + return; + } + + g_messages_prefixed_init (); + + fd = mklevel_prefix (level_prefix, log_level); + + gstring = g_string_new (NULL); + if (log_level & ALERT_LEVELS) + g_string_append (gstring, "\n"); + if (!log_domain) + g_string_append (gstring, "** "); + + if ((g_log_msg_prefix & log_level) == log_level) + { + const gchar *prg_name = g_get_prgname (); + + if (!prg_name) + g_string_append_printf (gstring, "(process:%lu): ", (gulong)getpid ()); + else + g_string_append_printf (gstring, "(%s:%lu): ", prg_name, (gulong)getpid ()); + } + + if (log_domain) + { + g_string_append (gstring, log_domain); + g_string_append_c (gstring, '-'); + } + g_string_append (gstring, level_prefix); + + g_string_append (gstring, ": "); + if (!message) + g_string_append (gstring, "(NULL) message"); + else + { + GString *msg; + const gchar *charset; + + msg = g_string_new (message); + escape_string (msg); + + if (g_get_charset (&charset)) + g_string_append (gstring, msg->str); /* charset is UTF-8 already */ + else + { + string = strdup_convert (msg->str, charset); + g_string_append (gstring, string); + g_free (string); + } + + g_string_free (msg, TRUE); + } + if (is_fatal) + g_string_append (gstring, "\naborting...\n"); + else + g_string_append (gstring, "\n"); + + string = g_string_free (gstring, FALSE); + + write_string (fd, string); + g_free (string); +} + +GPrintFunc +g_set_print_handler (GPrintFunc func) +{ + GPrintFunc old_print_func; + + g_mutex_lock (g_messages_lock); + old_print_func = glib_print_func; + glib_print_func = func; + g_mutex_unlock (g_messages_lock); + + return old_print_func; +} + +void +g_print (const gchar *format, + ...) +{ + va_list args; + gchar *string; + GPrintFunc local_glib_print_func; + + g_return_if_fail (format != NULL); + + va_start (args, format); + string = g_strdup_vprintf (format, args); + va_end (args); + + g_mutex_lock (g_messages_lock); + local_glib_print_func = glib_print_func; + g_mutex_unlock (g_messages_lock); + + if (local_glib_print_func) + local_glib_print_func (string); + else + { + const gchar *charset; + + if (g_get_charset (&charset)) + fputs (string, stdout); /* charset is UTF-8 already */ + else + { + gchar *lstring = strdup_convert (string, charset); + + fputs (lstring, stdout); + g_free (lstring); + } + fflush (stdout); + } + g_free (string); +} + +GPrintFunc +g_set_printerr_handler (GPrintFunc func) +{ + GPrintFunc old_printerr_func; + + g_mutex_lock (g_messages_lock); + old_printerr_func = glib_printerr_func; + glib_printerr_func = func; + g_mutex_unlock (g_messages_lock); + + return old_printerr_func; +} + +void +g_printerr (const gchar *format, + ...) +{ + va_list args; + gchar *string; + GPrintFunc local_glib_printerr_func; + + g_return_if_fail (format != NULL); + + va_start (args, format); + string = g_strdup_vprintf (format, args); + va_end (args); + + g_mutex_lock (g_messages_lock); + local_glib_printerr_func = glib_printerr_func; + g_mutex_unlock (g_messages_lock); + + if (local_glib_printerr_func) + local_glib_printerr_func (string); + else + { + const gchar *charset; + + if (g_get_charset (&charset)) + fputs (string, stderr); /* charset is UTF-8 already */ + else + { + gchar *lstring = strdup_convert (string, charset); + + fputs (lstring, stderr); + g_free (lstring); + } + fflush (stderr); + } + g_free (string); +} + +gsize +g_printf_string_upper_bound (const gchar *format, + va_list args) +{ + gchar c; + return _g_vsnprintf (&c, 1, format, args) + 1; +} + +void +_g_messages_thread_init_nomessage (void) +{ + g_messages_lock = g_mutex_new (); + g_log_depth = g_private_new (NULL); + g_messages_prefixed_init (); + _g_debug_init (); +} + +gboolean _g_debug_initialized = FALSE; +guint _g_debug_flags = 0; + +void +_g_debug_init (void) +{ + const gchar *val; + + _g_debug_initialized = TRUE; + + val = g_getenv ("G_DEBUG"); + if (val != NULL) + { + const GDebugKey keys[] = { + {"fatal_warnings", G_DEBUG_FATAL_WARNINGS}, + {"fatal_criticals", G_DEBUG_FATAL_CRITICALS} + }; + + _g_debug_flags = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + } + + if (_g_debug_flags & G_DEBUG_FATAL_WARNINGS) + { + GLogLevelFlags fatal_mask; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + } + + if (_g_debug_flags & G_DEBUG_FATAL_CRITICALS) + { + GLogLevelFlags fatal_mask; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + } +} + +#define __G_MESSAGES_C__ +#include "galiasdef.c" diff --git a/glib/gmessages.h b/glib/gmessages.h new file mode 100644 index 0000000..9acaec6 --- /dev/null +++ b/glib/gmessages.h @@ -0,0 +1,343 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_MESSAGES_H__ +#define __G_MESSAGES_H__ + +#include +#include +#include + +/* Suppress warnings when GCC is in -pedantic mode and not -std=c99 + */ +#if (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) +#pragma GCC system_header +#endif + +G_BEGIN_DECLS + +/* calculate a string size, guaranteed to fit format + args. + */ +gsize g_printf_string_upper_bound (const gchar* format, + va_list args); + +/* Log level shift offset for user defined + * log levels (0-7 are used by GLib). + */ +#define G_LOG_LEVEL_USER_SHIFT (8) + +/* Glib log levels and flags. + */ +typedef enum +{ + /* log flags */ + G_LOG_FLAG_RECURSION = 1 << 0, + G_LOG_FLAG_FATAL = 1 << 1, + + /* GLib log levels */ + G_LOG_LEVEL_ERROR = 1 << 2, /* always fatal */ + G_LOG_LEVEL_CRITICAL = 1 << 3, + G_LOG_LEVEL_WARNING = 1 << 4, + G_LOG_LEVEL_MESSAGE = 1 << 5, + G_LOG_LEVEL_INFO = 1 << 6, + G_LOG_LEVEL_DEBUG = 1 << 7, + + G_LOG_LEVEL_MASK = ~(G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL) +} GLogLevelFlags; + +/* GLib log levels that are considered fatal by default */ +#define G_LOG_FATAL_MASK (G_LOG_FLAG_RECURSION | G_LOG_LEVEL_ERROR) + +typedef void (*GLogFunc) (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data); + +/* Logging mechanism + */ +guint g_log_set_handler (const gchar *log_domain, + GLogLevelFlags log_levels, + GLogFunc log_func, + gpointer user_data); +void g_log_remove_handler (const gchar *log_domain, + guint handler_id); +void g_log_default_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data); +GLogFunc g_log_set_default_handler (GLogFunc log_func, + gpointer user_data); +void g_log (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *format, + ...) G_GNUC_PRINTF (3, 4); +void g_logv (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *format, + va_list args); +GLogLevelFlags g_log_set_fatal_mask (const gchar *log_domain, + GLogLevelFlags fatal_mask); +GLogLevelFlags g_log_set_always_fatal (GLogLevelFlags fatal_mask); + +/* internal */ +G_GNUC_INTERNAL void _g_log_fallback_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data); + +/* Internal functions, used to implement the following macros */ +void g_return_if_fail_warning (const char *log_domain, + const char *pretty_function, + const char *expression); +void g_warn_message (const char *domain, + const char *file, + int line, + const char *func, + const char *warnexpr); +#ifndef G_DISABLE_DEPRECATED +void g_assert_warning (const char *log_domain, + const char *file, + const int line, + const char *pretty_function, + const char *expression) G_GNUC_NORETURN; +#endif /* !G_DISABLE_DEPRECATED */ + + +#ifndef G_LOG_DOMAIN +#define G_LOG_DOMAIN ((gchar*) 0) +#endif /* G_LOG_DOMAIN */ +#ifdef G_HAVE_ISO_VARARGS +/* for(;;) ; so that GCC knows that control doesn't go past g_error(). + * Put space before ending semicolon to avoid C++ build warnings. + */ +#define g_error(...) G_STMT_START { \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_ERROR, \ + __VA_ARGS__); \ + for (;;) ; \ + } G_STMT_END + +#define g_message(...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_MESSAGE, \ + __VA_ARGS__) +#define g_critical(...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + __VA_ARGS__) +#define g_warning(...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_WARNING, \ + __VA_ARGS__) +#define g_debug(...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_DEBUG, \ + __VA_ARGS__) +#elif defined(G_HAVE_GNUC_VARARGS) +#define g_error(format...) G_STMT_START { \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_ERROR, \ + format); \ + for (;;) ; \ + } G_STMT_END + +#define g_message(format...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_MESSAGE, \ + format) +#define g_critical(format...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + format) +#define g_warning(format...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_WARNING, \ + format) +#define g_debug(format...) g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_DEBUG, \ + format) +#else /* no varargs macros */ +static void +g_error (const gchar *format, + ...) +{ + va_list args; + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, format, args); + va_end (args); + + for(;;) ; +} +static void +g_message (const gchar *format, + ...) +{ + va_list args; + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, format, args); + va_end (args); +} +static void +g_critical (const gchar *format, + ...) +{ + va_list args; + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, format, args); + va_end (args); +} +static void +g_warning (const gchar *format, + ...) +{ + va_list args; + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, format, args); + va_end (args); +} +static void +g_debug (const gchar *format, + ...) +{ + va_list args; + va_start (args, format); + g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args); + va_end (args); +} +#endif /* !__GNUC__ */ + +typedef void (*GPrintFunc) (const gchar *string); +void g_print (const gchar *format, + ...) G_GNUC_PRINTF (1, 2); +GPrintFunc g_set_print_handler (GPrintFunc func); +void g_printerr (const gchar *format, + ...) G_GNUC_PRINTF (1, 2); +GPrintFunc g_set_printerr_handler (GPrintFunc func); + + +/* Provide macros for graceful error handling. + * The "return" macros will return from the current function. + * Two different definitions are given for the macros in + * order to support gcc's __PRETTY_FUNCTION__ capability. + */ + +#define g_warn_if_reached() do { g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); } while (0) +#define g_warn_if_fail(expr) do { if G_LIKELY (expr) ; else \ + g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, #expr); } while (0) + +#ifdef G_DISABLE_CHECKS + +#define g_return_if_fail(expr) G_STMT_START{ (void)0; }G_STMT_END +#define g_return_val_if_fail(expr,val) G_STMT_START{ (void)0; }G_STMT_END +#define g_return_if_reached() G_STMT_START{ return; }G_STMT_END +#define g_return_val_if_reached(val) G_STMT_START{ return (val); }G_STMT_END + +#else /* !G_DISABLE_CHECKS */ + +#ifdef __GNUC__ + +#define g_return_if_fail(expr) G_STMT_START{ \ + if G_LIKELY(expr) { } else \ + { \ + g_return_if_fail_warning (G_LOG_DOMAIN, \ + __PRETTY_FUNCTION__, \ + #expr); \ + return; \ + }; }G_STMT_END + +#define g_return_val_if_fail(expr,val) G_STMT_START{ \ + if G_LIKELY(expr) { } else \ + { \ + g_return_if_fail_warning (G_LOG_DOMAIN, \ + __PRETTY_FUNCTION__, \ + #expr); \ + return (val); \ + }; }G_STMT_END + +#define g_return_if_reached() G_STMT_START{ \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d (%s): should not be reached", \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__); \ + return; }G_STMT_END + +#define g_return_val_if_reached(val) G_STMT_START{ \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d (%s): should not be reached", \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__); \ + return (val); }G_STMT_END + +#else /* !__GNUC__ */ + +#define g_return_if_fail(expr) G_STMT_START{ \ + if (expr) { } else \ + { \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d: assertion `%s' failed", \ + __FILE__, \ + __LINE__, \ + #expr); \ + return; \ + }; }G_STMT_END + +#define g_return_val_if_fail(expr, val) G_STMT_START{ \ + if (expr) { } else \ + { \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d: assertion `%s' failed", \ + __FILE__, \ + __LINE__, \ + #expr); \ + return (val); \ + }; }G_STMT_END + +#define g_return_if_reached() G_STMT_START{ \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d: should not be reached", \ + __FILE__, \ + __LINE__); \ + return; }G_STMT_END + +#define g_return_val_if_reached(val) G_STMT_START{ \ + g_log (G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d: should not be reached", \ + __FILE__, \ + __LINE__); \ + return (val); }G_STMT_END + +#endif /* !__GNUC__ */ + +#endif /* !G_DISABLE_CHECKS */ + +G_END_DECLS + +#endif /* __G_MESSAGES_H__ */ diff --git a/glib/gmirroringtable.h b/glib/gmirroringtable.h new file mode 100644 index 0000000..dd8f18a --- /dev/null +++ b/glib/gmirroringtable.h @@ -0,0 +1,901 @@ +/* gmirroringtable.h + * generated by gen-mirroring-tab + * from the file BidiMirroring.txt of */ + +#define PACKTAB_UINT8 guint8 +#define PACKTAB_UINT16 guint16 +#define PACKTAB_UINT32 guint32 + +/* + generated by packtab.c version 3 + + use GLIB_GET_MIRRORING_DELTA(key) to access your table + + assumed sizeof(gint16): 2 + required memory: 1008 + lookups: 4 + partition shape: Mir[256][16][4][4] + different table entries: 1 14 56 38 +*/ + +/* *INDENT-OFF* */ + +static const gint16 MirLev3[4*38] = { +#define MirLev3_0000 0x0 + 0,0,0,0, +#define MirLev3_0028 0x4 + 1,-1,0,0, +#define MirLev3_003C 0x8 + 2,0,-2,0, +#define MirLev3_0058 0xC + 0,0,0,2, +#define MirLev3_005C 0x10 + 0,-2,0,0, +#define MirLev3_00A8 0x14 + 0,0,0,16, +#define MirLev3_00B8 0x18 + 0,0,0,-16, +#define MirLev3_0F38 0x1C + 0,0,1,-1, +#define MirLev3_1698 0x20 + 0,0,0,1, +#define MirLev3_169C 0x24 + -1,0,0,0, +#define MirLev3_2038 0x28 + 0,1,-1,0, +#define MirLev3_2208 0x2C + 3,3,3,-3, +#define MirLev3_220C 0x30 + -3,-3,0,0, +#define MirLev3_2214 0x34 + 0,2016,0,0, +#define MirLev3_2240 0x38 + 0,0,0,138, +#define MirLev3_2264 0x3C + 1,-1,1,-1, +#define MirLev3_2290 0x40 + -1,1,-1,0, +#define MirLev3_2298 0x44 + 1824,0,0,0, +#define MirLev3_22A4 0x48 + 0,0,2104,0, +#define MirLev3_22A8 0x4C + 2108,2106,0,2106, +#define MirLev3_22C8 0x50 + 0,1,-1,1, +#define MirLev3_22CC 0x54 + -1,-138,0,0, +#define MirLev3_22F0 0x58 + 1,-1,8,8, +#define MirLev3_22F4 0x5C + 8,0,7,7, +#define MirLev3_22F8 0x60 + 0,0,-8,-8, +#define MirLev3_22FC 0x64 + -8,-7,-7,0, +#define MirLev3_2984 0x68 + -1,1,-1,1, +#define MirLev3_298C 0x6C + -1,3,1,-1, +#define MirLev3_2990 0x70 + -3,1,-1,1, +#define MirLev3_29B8 0x74 + -1824,0,0,0, +#define MirLev3_29F4 0x78 + 0,-2016,0,0, +#define MirLev3_2AAC 0x7C + 1,-1,0,1, +#define MirLev3_2AB0 0x80 + -1,0,0,1, +#define MirLev3_2ADC 0x84 + 0,0,-2104,0, +#define MirLev3_2AE0 0x88 + 0,0,0,-2106, +#define MirLev3_2AE4 0x8C + -2108,-2106,0,0, +#define MirLev3_FF5C 0x90 + 0,-2,0,1, +#define MirLev3_FF60 0x94 + -1,0,1,-1, +}; + +static const PACKTAB_UINT8 MirLev2[4*56] = { +#define MirLev2_0000 0x0 + MirLev3_0000, /* 0000..0003 */ + MirLev3_0000, /* 0004..0007 */ + MirLev3_0000, /* 0008..000B */ + MirLev3_0000, /* 000C..000F */ +#define MirLev2_0020 0x4 + MirLev3_0000, /* 0020..0023 */ + MirLev3_0000, /* 0024..0027 */ + MirLev3_0028, /* 0028..002B */ + MirLev3_0000, /* 002C..002F */ +#define MirLev2_0030 0x8 + MirLev3_0000, /* 0030..0033 */ + MirLev3_0000, /* 0034..0037 */ + MirLev3_0000, /* 0038..003B */ + MirLev3_003C, /* 003C..003F */ +#define MirLev2_0050 0xC + MirLev3_0000, /* 0050..0053 */ + MirLev3_0000, /* 0054..0057 */ + MirLev3_0058, /* 0058..005B */ + MirLev3_005C, /* 005C..005F */ +#define MirLev2_00A0 0x10 + MirLev3_0000, /* 00A0..00A3 */ + MirLev3_0000, /* 00A4..00A7 */ + MirLev3_00A8, /* 00A8..00AB */ + MirLev3_0000, /* 00AC..00AF */ +#define MirLev2_00B0 0x14 + MirLev3_0000, /* 00B0..00B3 */ + MirLev3_0000, /* 00B4..00B7 */ + MirLev3_00B8, /* 00B8..00BB */ + MirLev3_0000, /* 00BC..00BF */ +#define MirLev2_0F30 0x18 + MirLev3_0000, /* 0F30..0F33 */ + MirLev3_0000, /* 0F34..0F37 */ + MirLev3_0F38, /* 0F38..0F3B */ + MirLev3_0028, /* 0F3C..0F3F */ +#define MirLev2_1690 0x1C + MirLev3_0000, /* 1690..1693 */ + MirLev3_0000, /* 1694..1697 */ + MirLev3_1698, /* 1698..169B */ + MirLev3_169C, /* 169C..169F */ +#define MirLev2_2030 0x20 + MirLev3_0000, /* 2030..2033 */ + MirLev3_0000, /* 2034..2037 */ + MirLev3_2038, /* 2038..203B */ + MirLev3_0000, /* 203C..203F */ +#define MirLev2_2040 0x24 + MirLev3_0000, /* 2040..2043 */ + MirLev3_2038, /* 2044..2047 */ + MirLev3_0000, /* 2048..204B */ + MirLev3_0000, /* 204C..204F */ +#define MirLev2_2070 0x28 + MirLev3_0000, /* 2070..2073 */ + MirLev3_0000, /* 2074..2077 */ + MirLev3_0000, /* 2078..207B */ + MirLev3_2038, /* 207C..207F */ +#define MirLev2_2200 0x2C + MirLev3_0000, /* 2200..2203 */ + MirLev3_0000, /* 2204..2207 */ + MirLev3_2208, /* 2208..220B */ + MirLev3_220C, /* 220C..220F */ +#define MirLev2_2210 0x30 + MirLev3_0000, /* 2210..2213 */ + MirLev3_2214, /* 2214..2217 */ + MirLev3_0000, /* 2218..221B */ + MirLev3_0000, /* 221C..221F */ +#define MirLev2_2230 0x34 + MirLev3_0000, /* 2230..2233 */ + MirLev3_0000, /* 2234..2237 */ + MirLev3_0000, /* 2238..223B */ + MirLev3_0028, /* 223C..223F */ +#define MirLev2_2240 0x38 + MirLev3_2240, /* 2240..2243 */ + MirLev3_0000, /* 2244..2247 */ + MirLev3_0000, /* 2248..224B */ + MirLev3_0000, /* 224C..224F */ +#define MirLev2_2250 0x3C + MirLev3_0F38, /* 2250..2253 */ + MirLev3_0028, /* 2254..2257 */ + MirLev3_0000, /* 2258..225B */ + MirLev3_0000, /* 225C..225F */ +#define MirLev2_2260 0x40 + MirLev3_0000, /* 2260..2263 */ + MirLev3_2264, /* 2264..2267 */ + MirLev3_2264, /* 2268..226B */ + MirLev3_0F38, /* 226C..226F */ +#define MirLev2_2270 0x44 + MirLev3_2264, /* 2270..2273 */ + MirLev3_2264, /* 2274..2277 */ + MirLev3_2264, /* 2278..227B */ + MirLev3_2264, /* 227C..227F */ +#define MirLev2_2280 0x48 + MirLev3_2264, /* 2280..2283 */ + MirLev3_2264, /* 2284..2287 */ + MirLev3_2264, /* 2288..228B */ + MirLev3_1698, /* 228C..228F */ +#define MirLev2_2290 0x4C + MirLev3_2290, /* 2290..2293 */ + MirLev3_0000, /* 2294..2297 */ + MirLev3_2298, /* 2298..229B */ + MirLev3_0000, /* 229C..229F */ +#define MirLev2_22A0 0x50 + MirLev3_0F38, /* 22A0..22A3 */ + MirLev3_22A4, /* 22A4..22A7 */ + MirLev3_22A8, /* 22A8..22AB */ + MirLev3_0000, /* 22AC..22AF */ +#define MirLev2_22B0 0x54 + MirLev3_2264, /* 22B0..22B3 */ + MirLev3_2264, /* 22B4..22B7 */ + MirLev3_0000, /* 22B8..22BB */ + MirLev3_0000, /* 22BC..22BF */ +#define MirLev2_22C0 0x58 + MirLev3_0000, /* 22C0..22C3 */ + MirLev3_0000, /* 22C4..22C7 */ + MirLev3_22C8, /* 22C8..22CB */ + MirLev3_22CC, /* 22CC..22CF */ +#define MirLev2_22D0 0x5C + MirLev3_0028, /* 22D0..22D3 */ + MirLev3_0F38, /* 22D4..22D7 */ + MirLev3_2264, /* 22D8..22DB */ + MirLev3_2264, /* 22DC..22DF */ +#define MirLev2_22E0 0x60 + MirLev3_2264, /* 22E0..22E3 */ + MirLev3_2264, /* 22E4..22E7 */ + MirLev3_2264, /* 22E8..22EB */ + MirLev3_0028, /* 22EC..22EF */ +#define MirLev2_22F0 0x64 + MirLev3_22F0, /* 22F0..22F3 */ + MirLev3_22F4, /* 22F4..22F7 */ + MirLev3_22F8, /* 22F8..22FB */ + MirLev3_22FC, /* 22FC..22FF */ +#define MirLev2_2300 0x68 + MirLev3_0000, /* 2300..2303 */ + MirLev3_0000, /* 2304..2307 */ + MirLev3_2264, /* 2308..230B */ + MirLev3_0000, /* 230C..230F */ +#define MirLev2_2760 0x6C + MirLev3_0000, /* 2760..2763 */ + MirLev3_0000, /* 2764..2767 */ + MirLev3_2264, /* 2768..276B */ + MirLev3_2264, /* 276C..276F */ +#define MirLev2_2770 0x70 + MirLev3_2264, /* 2770..2773 */ + MirLev3_0028, /* 2774..2777 */ + MirLev3_0000, /* 2778..277B */ + MirLev3_0000, /* 277C..277F */ +#define MirLev2_27C0 0x74 + MirLev3_1698, /* 27C0..27C3 */ + MirLev3_2290, /* 27C4..27C7 */ + MirLev3_0028, /* 27C8..27CB */ + MirLev3_0000, /* 27CC..27CF */ +#define MirLev2_27D0 0x78 + MirLev3_0000, /* 27D0..27D3 */ + MirLev3_2038, /* 27D4..27D7 */ + MirLev3_0000, /* 27D8..27DB */ + MirLev3_2038, /* 27DC..27DF */ +#define MirLev2_27E0 0x7C + MirLev3_0F38, /* 27E0..27E3 */ + MirLev3_2264, /* 27E4..27E7 */ + MirLev3_2264, /* 27E8..27EB */ + MirLev3_2264, /* 27EC..27EF */ +#define MirLev2_2980 0x80 + MirLev3_1698, /* 2980..2983 */ + MirLev3_2984, /* 2984..2987 */ + MirLev3_2984, /* 2988..298B */ + MirLev3_298C, /* 298C..298F */ +#define MirLev2_2990 0x84 + MirLev3_2990, /* 2990..2993 */ + MirLev3_2984, /* 2994..2997 */ + MirLev3_169C, /* 2998..299B */ + MirLev3_0000, /* 299C..299F */ +#define MirLev2_29B0 0x88 + MirLev3_0000, /* 29B0..29B3 */ + MirLev3_0000, /* 29B4..29B7 */ + MirLev3_29B8, /* 29B8..29BB */ + MirLev3_0000, /* 29BC..29BF */ +#define MirLev2_29C0 0x8C + MirLev3_0028, /* 29C0..29C3 */ + MirLev3_0028, /* 29C4..29C7 */ + MirLev3_0000, /* 29C8..29CB */ + MirLev3_1698, /* 29CC..29CF */ +#define MirLev2_29D0 0x90 + MirLev3_2290, /* 29D0..29D3 */ + MirLev3_0028, /* 29D4..29D7 */ + MirLev3_2264, /* 29D8..29DB */ + MirLev3_0000, /* 29DC..29DF */ +#define MirLev2_29F0 0x94 + MirLev3_0000, /* 29F0..29F3 */ + MirLev3_29F4, /* 29F4..29F7 */ + MirLev3_0028, /* 29F8..29FB */ + MirLev3_0028, /* 29FC..29FF */ +#define MirLev2_2A20 0x98 + MirLev3_0000, /* 2A20..2A23 */ + MirLev3_0000, /* 2A24..2A27 */ + MirLev3_1698, /* 2A28..2A2B */ + MirLev3_2290, /* 2A2C..2A2F */ +#define MirLev2_2A30 0x9C + MirLev3_0000, /* 2A30..2A33 */ + MirLev3_0028, /* 2A34..2A37 */ + MirLev3_0000, /* 2A38..2A3B */ + MirLev3_0028, /* 2A3C..2A3F */ +#define MirLev2_2A60 0xA0 + MirLev3_0000, /* 2A60..2A63 */ + MirLev3_0028, /* 2A64..2A67 */ + MirLev3_0000, /* 2A68..2A6B */ + MirLev3_0000, /* 2A6C..2A6F */ +#define MirLev2_2A70 0xA4 + MirLev3_0000, /* 2A70..2A73 */ + MirLev3_0000, /* 2A74..2A77 */ + MirLev3_2038, /* 2A78..2A7B */ + MirLev3_22C8, /* 2A7C..2A7F */ +#define MirLev2_2A80 0xA8 + MirLev3_2984, /* 2A80..2A83 */ + MirLev3_169C, /* 2A84..2A87 */ + MirLev3_1698, /* 2A88..2A8B */ + MirLev3_169C, /* 2A8C..2A8F */ +#define MirLev2_2A90 0xAC + MirLev3_22C8, /* 2A90..2A93 */ + MirLev3_2984, /* 2A94..2A97 */ + MirLev3_2984, /* 2A98..2A9B */ + MirLev3_169C, /* 2A9C..2A9F */ +#define MirLev2_2AA0 0xB0 + MirLev3_2038, /* 2AA0..2AA3 */ + MirLev3_0F38, /* 2AA4..2AA7 */ + MirLev3_2264, /* 2AA8..2AAB */ + MirLev3_2AAC, /* 2AAC..2AAF */ +#define MirLev2_2AB0 0xB4 + MirLev3_2AB0, /* 2AB0..2AB3 */ + MirLev3_169C, /* 2AB4..2AB7 */ + MirLev3_1698, /* 2AB8..2ABB */ + MirLev3_2984, /* 2ABC..2ABF */ +#define MirLev2_2AC0 0xB8 + MirLev3_2984, /* 2AC0..2AC3 */ + MirLev3_2290, /* 2AC4..2AC7 */ + MirLev3_0000, /* 2AC8..2ACB */ + MirLev3_22C8, /* 2ACC..2ACF */ +#define MirLev2_2AD0 0xBC + MirLev3_2984, /* 2AD0..2AD3 */ + MirLev3_2290, /* 2AD4..2AD7 */ + MirLev3_0000, /* 2AD8..2ADB */ + MirLev3_2ADC, /* 2ADC..2ADF */ +#define MirLev2_2AE0 0xC0 + MirLev3_2AE0, /* 2AE0..2AE3 */ + MirLev3_2AE4, /* 2AE4..2AE7 */ + MirLev3_0000, /* 2AE8..2AEB */ + MirLev3_0028, /* 2AEC..2AEF */ +#define MirLev2_2AF0 0xC4 + MirLev3_0000, /* 2AF0..2AF3 */ + MirLev3_1698, /* 2AF4..2AF7 */ + MirLev3_2290, /* 2AF8..2AFB */ + MirLev3_0000, /* 2AFC..2AFF */ +#define MirLev2_2E00 0xC8 + MirLev3_0F38, /* 2E00..2E03 */ + MirLev3_0028, /* 2E04..2E07 */ + MirLev3_2038, /* 2E08..2E0B */ + MirLev3_0028, /* 2E0C..2E0F */ +#define MirLev2_2E20 0xCC + MirLev3_2264, /* 2E20..2E23 */ + MirLev3_2264, /* 2E24..2E27 */ + MirLev3_0028, /* 2E28..2E2B */ + MirLev3_0000, /* 2E2C..2E2F */ +#define MirLev2_3010 0xD0 + MirLev3_0028, /* 3010..3013 */ + MirLev3_2264, /* 3014..3017 */ + MirLev3_2264, /* 3018..301B */ + MirLev3_0000, /* 301C..301F */ +#define MirLev2_FE50 0xD4 + MirLev3_0000, /* FE50..FE53 */ + MirLev3_0000, /* FE54..FE57 */ + MirLev3_22C8, /* FE58..FE5B */ + MirLev3_2290, /* FE5C..FE5F */ +#define MirLev2_FF50 0xD8 + MirLev3_0000, /* FF50..FF53 */ + MirLev3_0000, /* FF54..FF57 */ + MirLev3_0058, /* FF58..FF5B */ + MirLev3_FF5C, /* FF5C..FF5F */ +#define MirLev2_FF60 0xDC + MirLev3_FF60, /* FF60..FF63 */ + MirLev3_0000, /* FF64..FF67 */ + MirLev3_0000, /* FF68..FF6B */ + MirLev3_0000, /* FF6C..FF6F */ +}; + +static const PACKTAB_UINT8 MirLev1[16*14] = { +#define MirLev1_0000 0x0 + MirLev2_0000, /* 0000..000F */ + MirLev2_0000, /* 0010..001F */ + MirLev2_0020, /* 0020..002F */ + MirLev2_0030, /* 0030..003F */ + MirLev2_0000, /* 0040..004F */ + MirLev2_0050, /* 0050..005F */ + MirLev2_0000, /* 0060..006F */ + MirLev2_0050, /* 0070..007F */ + MirLev2_0000, /* 0080..008F */ + MirLev2_0000, /* 0090..009F */ + MirLev2_00A0, /* 00A0..00AF */ + MirLev2_00B0, /* 00B0..00BF */ + MirLev2_0000, /* 00C0..00CF */ + MirLev2_0000, /* 00D0..00DF */ + MirLev2_0000, /* 00E0..00EF */ + MirLev2_0000, /* 00F0..00FF */ +#define MirLev1_0100 0x10 + MirLev2_0000, /* 0100..010F */ + MirLev2_0000, /* 0110..011F */ + MirLev2_0000, /* 0120..012F */ + MirLev2_0000, /* 0130..013F */ + MirLev2_0000, /* 0140..014F */ + MirLev2_0000, /* 0150..015F */ + MirLev2_0000, /* 0160..016F */ + MirLev2_0000, /* 0170..017F */ + MirLev2_0000, /* 0180..018F */ + MirLev2_0000, /* 0190..019F */ + MirLev2_0000, /* 01A0..01AF */ + MirLev2_0000, /* 01B0..01BF */ + MirLev2_0000, /* 01C0..01CF */ + MirLev2_0000, /* 01D0..01DF */ + MirLev2_0000, /* 01E0..01EF */ + MirLev2_0000, /* 01F0..01FF */ +#define MirLev1_0F00 0x20 + MirLev2_0000, /* 0F00..0F0F */ + MirLev2_0000, /* 0F10..0F1F */ + MirLev2_0000, /* 0F20..0F2F */ + MirLev2_0F30, /* 0F30..0F3F */ + MirLev2_0000, /* 0F40..0F4F */ + MirLev2_0000, /* 0F50..0F5F */ + MirLev2_0000, /* 0F60..0F6F */ + MirLev2_0000, /* 0F70..0F7F */ + MirLev2_0000, /* 0F80..0F8F */ + MirLev2_0000, /* 0F90..0F9F */ + MirLev2_0000, /* 0FA0..0FAF */ + MirLev2_0000, /* 0FB0..0FBF */ + MirLev2_0000, /* 0FC0..0FCF */ + MirLev2_0000, /* 0FD0..0FDF */ + MirLev2_0000, /* 0FE0..0FEF */ + MirLev2_0000, /* 0FF0..0FFF */ +#define MirLev1_1600 0x30 + MirLev2_0000, /* 1600..160F */ + MirLev2_0000, /* 1610..161F */ + MirLev2_0000, /* 1620..162F */ + MirLev2_0000, /* 1630..163F */ + MirLev2_0000, /* 1640..164F */ + MirLev2_0000, /* 1650..165F */ + MirLev2_0000, /* 1660..166F */ + MirLev2_0000, /* 1670..167F */ + MirLev2_0000, /* 1680..168F */ + MirLev2_1690, /* 1690..169F */ + MirLev2_0000, /* 16A0..16AF */ + MirLev2_0000, /* 16B0..16BF */ + MirLev2_0000, /* 16C0..16CF */ + MirLev2_0000, /* 16D0..16DF */ + MirLev2_0000, /* 16E0..16EF */ + MirLev2_0000, /* 16F0..16FF */ +#define MirLev1_2000 0x40 + MirLev2_0000, /* 2000..200F */ + MirLev2_0000, /* 2010..201F */ + MirLev2_0000, /* 2020..202F */ + MirLev2_2030, /* 2030..203F */ + MirLev2_2040, /* 2040..204F */ + MirLev2_0000, /* 2050..205F */ + MirLev2_0000, /* 2060..206F */ + MirLev2_2070, /* 2070..207F */ + MirLev2_2070, /* 2080..208F */ + MirLev2_0000, /* 2090..209F */ + MirLev2_0000, /* 20A0..20AF */ + MirLev2_0000, /* 20B0..20BF */ + MirLev2_0000, /* 20C0..20CF */ + MirLev2_0000, /* 20D0..20DF */ + MirLev2_0000, /* 20E0..20EF */ + MirLev2_0000, /* 20F0..20FF */ +#define MirLev1_2200 0x50 + MirLev2_2200, /* 2200..220F */ + MirLev2_2210, /* 2210..221F */ + MirLev2_0000, /* 2220..222F */ + MirLev2_2230, /* 2230..223F */ + MirLev2_2240, /* 2240..224F */ + MirLev2_2250, /* 2250..225F */ + MirLev2_2260, /* 2260..226F */ + MirLev2_2270, /* 2270..227F */ + MirLev2_2280, /* 2280..228F */ + MirLev2_2290, /* 2290..229F */ + MirLev2_22A0, /* 22A0..22AF */ + MirLev2_22B0, /* 22B0..22BF */ + MirLev2_22C0, /* 22C0..22CF */ + MirLev2_22D0, /* 22D0..22DF */ + MirLev2_22E0, /* 22E0..22EF */ + MirLev2_22F0, /* 22F0..22FF */ +#define MirLev1_2300 0x60 + MirLev2_2300, /* 2300..230F */ + MirLev2_0000, /* 2310..231F */ + MirLev2_2030, /* 2320..232F */ + MirLev2_0000, /* 2330..233F */ + MirLev2_0000, /* 2340..234F */ + MirLev2_0000, /* 2350..235F */ + MirLev2_0000, /* 2360..236F */ + MirLev2_0000, /* 2370..237F */ + MirLev2_0000, /* 2380..238F */ + MirLev2_0000, /* 2390..239F */ + MirLev2_0000, /* 23A0..23AF */ + MirLev2_0000, /* 23B0..23BF */ + MirLev2_0000, /* 23C0..23CF */ + MirLev2_0000, /* 23D0..23DF */ + MirLev2_0000, /* 23E0..23EF */ + MirLev2_0000, /* 23F0..23FF */ +#define MirLev1_2700 0x70 + MirLev2_0000, /* 2700..270F */ + MirLev2_0000, /* 2710..271F */ + MirLev2_0000, /* 2720..272F */ + MirLev2_0000, /* 2730..273F */ + MirLev2_0000, /* 2740..274F */ + MirLev2_0000, /* 2750..275F */ + MirLev2_2760, /* 2760..276F */ + MirLev2_2770, /* 2770..277F */ + MirLev2_0000, /* 2780..278F */ + MirLev2_0000, /* 2790..279F */ + MirLev2_0000, /* 27A0..27AF */ + MirLev2_0000, /* 27B0..27BF */ + MirLev2_27C0, /* 27C0..27CF */ + MirLev2_27D0, /* 27D0..27DF */ + MirLev2_27E0, /* 27E0..27EF */ + MirLev2_0000, /* 27F0..27FF */ +#define MirLev1_2900 0x80 + MirLev2_0000, /* 2900..290F */ + MirLev2_0000, /* 2910..291F */ + MirLev2_0000, /* 2920..292F */ + MirLev2_0000, /* 2930..293F */ + MirLev2_0000, /* 2940..294F */ + MirLev2_0000, /* 2950..295F */ + MirLev2_0000, /* 2960..296F */ + MirLev2_0000, /* 2970..297F */ + MirLev2_2980, /* 2980..298F */ + MirLev2_2990, /* 2990..299F */ + MirLev2_0000, /* 29A0..29AF */ + MirLev2_29B0, /* 29B0..29BF */ + MirLev2_29C0, /* 29C0..29CF */ + MirLev2_29D0, /* 29D0..29DF */ + MirLev2_0000, /* 29E0..29EF */ + MirLev2_29F0, /* 29F0..29FF */ +#define MirLev1_2A00 0x90 + MirLev2_0000, /* 2A00..2A0F */ + MirLev2_0000, /* 2A10..2A1F */ + MirLev2_2A20, /* 2A20..2A2F */ + MirLev2_2A30, /* 2A30..2A3F */ + MirLev2_0000, /* 2A40..2A4F */ + MirLev2_0000, /* 2A50..2A5F */ + MirLev2_2A60, /* 2A60..2A6F */ + MirLev2_2A70, /* 2A70..2A7F */ + MirLev2_2A80, /* 2A80..2A8F */ + MirLev2_2A90, /* 2A90..2A9F */ + MirLev2_2AA0, /* 2AA0..2AAF */ + MirLev2_2AB0, /* 2AB0..2ABF */ + MirLev2_2AC0, /* 2AC0..2ACF */ + MirLev2_2AD0, /* 2AD0..2ADF */ + MirLev2_2AE0, /* 2AE0..2AEF */ + MirLev2_2AF0, /* 2AF0..2AFF */ +#define MirLev1_2E00 0xA0 + MirLev2_2E00, /* 2E00..2E0F */ + MirLev2_2230, /* 2E10..2E1F */ + MirLev2_2E20, /* 2E20..2E2F */ + MirLev2_0000, /* 2E30..2E3F */ + MirLev2_0000, /* 2E40..2E4F */ + MirLev2_0000, /* 2E50..2E5F */ + MirLev2_0000, /* 2E60..2E6F */ + MirLev2_0000, /* 2E70..2E7F */ + MirLev2_0000, /* 2E80..2E8F */ + MirLev2_0000, /* 2E90..2E9F */ + MirLev2_0000, /* 2EA0..2EAF */ + MirLev2_0000, /* 2EB0..2EBF */ + MirLev2_0000, /* 2EC0..2ECF */ + MirLev2_0000, /* 2ED0..2EDF */ + MirLev2_0000, /* 2EE0..2EEF */ + MirLev2_0000, /* 2EF0..2EFF */ +#define MirLev1_3000 0xB0 + MirLev2_2760, /* 3000..300F */ + MirLev2_3010, /* 3010..301F */ + MirLev2_0000, /* 3020..302F */ + MirLev2_0000, /* 3030..303F */ + MirLev2_0000, /* 3040..304F */ + MirLev2_0000, /* 3050..305F */ + MirLev2_0000, /* 3060..306F */ + MirLev2_0000, /* 3070..307F */ + MirLev2_0000, /* 3080..308F */ + MirLev2_0000, /* 3090..309F */ + MirLev2_0000, /* 30A0..30AF */ + MirLev2_0000, /* 30B0..30BF */ + MirLev2_0000, /* 30C0..30CF */ + MirLev2_0000, /* 30D0..30DF */ + MirLev2_0000, /* 30E0..30EF */ + MirLev2_0000, /* 30F0..30FF */ +#define MirLev1_FE00 0xC0 + MirLev2_0000, /* FE00..FE0F */ + MirLev2_0000, /* FE10..FE1F */ + MirLev2_0000, /* FE20..FE2F */ + MirLev2_0000, /* FE30..FE3F */ + MirLev2_0000, /* FE40..FE4F */ + MirLev2_FE50, /* FE50..FE5F */ + MirLev2_2A60, /* FE60..FE6F */ + MirLev2_0000, /* FE70..FE7F */ + MirLev2_0000, /* FE80..FE8F */ + MirLev2_0000, /* FE90..FE9F */ + MirLev2_0000, /* FEA0..FEAF */ + MirLev2_0000, /* FEB0..FEBF */ + MirLev2_0000, /* FEC0..FECF */ + MirLev2_0000, /* FED0..FEDF */ + MirLev2_0000, /* FEE0..FEEF */ + MirLev2_0000, /* FEF0..FEFF */ +#define MirLev1_FF00 0xD0 + MirLev2_0020, /* FF00..FF0F */ + MirLev2_0030, /* FF10..FF1F */ + MirLev2_0000, /* FF20..FF2F */ + MirLev2_0050, /* FF30..FF3F */ + MirLev2_0000, /* FF40..FF4F */ + MirLev2_FF50, /* FF50..FF5F */ + MirLev2_FF60, /* FF60..FF6F */ + MirLev2_0000, /* FF70..FF7F */ + MirLev2_0000, /* FF80..FF8F */ + MirLev2_0000, /* FF90..FF9F */ + MirLev2_0000, /* FFA0..FFAF */ + MirLev2_0000, /* FFB0..FFBF */ + MirLev2_0000, /* FFC0..FFCF */ + MirLev2_0000, /* FFD0..FFDF */ + MirLev2_0000, /* FFE0..FFEF */ + MirLev2_0000, /* FFF0..FFFF */ +}; + +static const PACKTAB_UINT8 MirLev0[256*1] = { +#define MirLev0_0000 0x0 + MirLev1_0000, /* 0000..00FF */ + MirLev1_0100, /* 0100..01FF */ + MirLev1_0100, /* 0200..02FF */ + MirLev1_0100, /* 0300..03FF */ + MirLev1_0100, /* 0400..04FF */ + MirLev1_0100, /* 0500..05FF */ + MirLev1_0100, /* 0600..06FF */ + MirLev1_0100, /* 0700..07FF */ + MirLev1_0100, /* 0800..08FF */ + MirLev1_0100, /* 0900..09FF */ + MirLev1_0100, /* 0A00..0AFF */ + MirLev1_0100, /* 0B00..0BFF */ + MirLev1_0100, /* 0C00..0CFF */ + MirLev1_0100, /* 0D00..0DFF */ + MirLev1_0100, /* 0E00..0EFF */ + MirLev1_0F00, /* 0F00..0FFF */ + MirLev1_0100, /* 1000..10FF */ + MirLev1_0100, /* 1100..11FF */ + MirLev1_0100, /* 1200..12FF */ + MirLev1_0100, /* 1300..13FF */ + MirLev1_0100, /* 1400..14FF */ + MirLev1_0100, /* 1500..15FF */ + MirLev1_1600, /* 1600..16FF */ + MirLev1_0100, /* 1700..17FF */ + MirLev1_0100, /* 1800..18FF */ + MirLev1_0100, /* 1900..19FF */ + MirLev1_0100, /* 1A00..1AFF */ + MirLev1_0100, /* 1B00..1BFF */ + MirLev1_0100, /* 1C00..1CFF */ + MirLev1_0100, /* 1D00..1DFF */ + MirLev1_0100, /* 1E00..1EFF */ + MirLev1_0100, /* 1F00..1FFF */ + MirLev1_2000, /* 2000..20FF */ + MirLev1_0100, /* 2100..21FF */ + MirLev1_2200, /* 2200..22FF */ + MirLev1_2300, /* 2300..23FF */ + MirLev1_0100, /* 2400..24FF */ + MirLev1_0100, /* 2500..25FF */ + MirLev1_0100, /* 2600..26FF */ + MirLev1_2700, /* 2700..27FF */ + MirLev1_0100, /* 2800..28FF */ + MirLev1_2900, /* 2900..29FF */ + MirLev1_2A00, /* 2A00..2AFF */ + MirLev1_0100, /* 2B00..2BFF */ + MirLev1_0100, /* 2C00..2CFF */ + MirLev1_0100, /* 2D00..2DFF */ + MirLev1_2E00, /* 2E00..2EFF */ + MirLev1_0100, /* 2F00..2FFF */ + MirLev1_3000, /* 3000..30FF */ + MirLev1_0100, /* 3100..31FF */ + MirLev1_0100, /* 3200..32FF */ + MirLev1_0100, /* 3300..33FF */ + MirLev1_0100, /* 3400..34FF */ + MirLev1_0100, /* 3500..35FF */ + MirLev1_0100, /* 3600..36FF */ + MirLev1_0100, /* 3700..37FF */ + MirLev1_0100, /* 3800..38FF */ + MirLev1_0100, /* 3900..39FF */ + MirLev1_0100, /* 3A00..3AFF */ + MirLev1_0100, /* 3B00..3BFF */ + MirLev1_0100, /* 3C00..3CFF */ + MirLev1_0100, /* 3D00..3DFF */ + MirLev1_0100, /* 3E00..3EFF */ + MirLev1_0100, /* 3F00..3FFF */ + MirLev1_0100, /* 4000..40FF */ + MirLev1_0100, /* 4100..41FF */ + MirLev1_0100, /* 4200..42FF */ + MirLev1_0100, /* 4300..43FF */ + MirLev1_0100, /* 4400..44FF */ + MirLev1_0100, /* 4500..45FF */ + MirLev1_0100, /* 4600..46FF */ + MirLev1_0100, /* 4700..47FF */ + MirLev1_0100, /* 4800..48FF */ + MirLev1_0100, /* 4900..49FF */ + MirLev1_0100, /* 4A00..4AFF */ + MirLev1_0100, /* 4B00..4BFF */ + MirLev1_0100, /* 4C00..4CFF */ + MirLev1_0100, /* 4D00..4DFF */ + MirLev1_0100, /* 4E00..4EFF */ + MirLev1_0100, /* 4F00..4FFF */ + MirLev1_0100, /* 5000..50FF */ + MirLev1_0100, /* 5100..51FF */ + MirLev1_0100, /* 5200..52FF */ + MirLev1_0100, /* 5300..53FF */ + MirLev1_0100, /* 5400..54FF */ + MirLev1_0100, /* 5500..55FF */ + MirLev1_0100, /* 5600..56FF */ + MirLev1_0100, /* 5700..57FF */ + MirLev1_0100, /* 5800..58FF */ + MirLev1_0100, /* 5900..59FF */ + MirLev1_0100, /* 5A00..5AFF */ + MirLev1_0100, /* 5B00..5BFF */ + MirLev1_0100, /* 5C00..5CFF */ + MirLev1_0100, /* 5D00..5DFF */ + MirLev1_0100, /* 5E00..5EFF */ + MirLev1_0100, /* 5F00..5FFF */ + MirLev1_0100, /* 6000..60FF */ + MirLev1_0100, /* 6100..61FF */ + MirLev1_0100, /* 6200..62FF */ + MirLev1_0100, /* 6300..63FF */ + MirLev1_0100, /* 6400..64FF */ + MirLev1_0100, /* 6500..65FF */ + MirLev1_0100, /* 6600..66FF */ + MirLev1_0100, /* 6700..67FF */ + MirLev1_0100, /* 6800..68FF */ + MirLev1_0100, /* 6900..69FF */ + MirLev1_0100, /* 6A00..6AFF */ + MirLev1_0100, /* 6B00..6BFF */ + MirLev1_0100, /* 6C00..6CFF */ + MirLev1_0100, /* 6D00..6DFF */ + MirLev1_0100, /* 6E00..6EFF */ + MirLev1_0100, /* 6F00..6FFF */ + MirLev1_0100, /* 7000..70FF */ + MirLev1_0100, /* 7100..71FF */ + MirLev1_0100, /* 7200..72FF */ + MirLev1_0100, /* 7300..73FF */ + MirLev1_0100, /* 7400..74FF */ + MirLev1_0100, /* 7500..75FF */ + MirLev1_0100, /* 7600..76FF */ + MirLev1_0100, /* 7700..77FF */ + MirLev1_0100, /* 7800..78FF */ + MirLev1_0100, /* 7900..79FF */ + MirLev1_0100, /* 7A00..7AFF */ + MirLev1_0100, /* 7B00..7BFF */ + MirLev1_0100, /* 7C00..7CFF */ + MirLev1_0100, /* 7D00..7DFF */ + MirLev1_0100, /* 7E00..7EFF */ + MirLev1_0100, /* 7F00..7FFF */ + MirLev1_0100, /* 8000..80FF */ + MirLev1_0100, /* 8100..81FF */ + MirLev1_0100, /* 8200..82FF */ + MirLev1_0100, /* 8300..83FF */ + MirLev1_0100, /* 8400..84FF */ + MirLev1_0100, /* 8500..85FF */ + MirLev1_0100, /* 8600..86FF */ + MirLev1_0100, /* 8700..87FF */ + MirLev1_0100, /* 8800..88FF */ + MirLev1_0100, /* 8900..89FF */ + MirLev1_0100, /* 8A00..8AFF */ + MirLev1_0100, /* 8B00..8BFF */ + MirLev1_0100, /* 8C00..8CFF */ + MirLev1_0100, /* 8D00..8DFF */ + MirLev1_0100, /* 8E00..8EFF */ + MirLev1_0100, /* 8F00..8FFF */ + MirLev1_0100, /* 9000..90FF */ + MirLev1_0100, /* 9100..91FF */ + MirLev1_0100, /* 9200..92FF */ + MirLev1_0100, /* 9300..93FF */ + MirLev1_0100, /* 9400..94FF */ + MirLev1_0100, /* 9500..95FF */ + MirLev1_0100, /* 9600..96FF */ + MirLev1_0100, /* 9700..97FF */ + MirLev1_0100, /* 9800..98FF */ + MirLev1_0100, /* 9900..99FF */ + MirLev1_0100, /* 9A00..9AFF */ + MirLev1_0100, /* 9B00..9BFF */ + MirLev1_0100, /* 9C00..9CFF */ + MirLev1_0100, /* 9D00..9DFF */ + MirLev1_0100, /* 9E00..9EFF */ + MirLev1_0100, /* 9F00..9FFF */ + MirLev1_0100, /* A000..A0FF */ + MirLev1_0100, /* A100..A1FF */ + MirLev1_0100, /* A200..A2FF */ + MirLev1_0100, /* A300..A3FF */ + MirLev1_0100, /* A400..A4FF */ + MirLev1_0100, /* A500..A5FF */ + MirLev1_0100, /* A600..A6FF */ + MirLev1_0100, /* A700..A7FF */ + MirLev1_0100, /* A800..A8FF */ + MirLev1_0100, /* A900..A9FF */ + MirLev1_0100, /* AA00..AAFF */ + MirLev1_0100, /* AB00..ABFF */ + MirLev1_0100, /* AC00..ACFF */ + MirLev1_0100, /* AD00..ADFF */ + MirLev1_0100, /* AE00..AEFF */ + MirLev1_0100, /* AF00..AFFF */ + MirLev1_0100, /* B000..B0FF */ + MirLev1_0100, /* B100..B1FF */ + MirLev1_0100, /* B200..B2FF */ + MirLev1_0100, /* B300..B3FF */ + MirLev1_0100, /* B400..B4FF */ + MirLev1_0100, /* B500..B5FF */ + MirLev1_0100, /* B600..B6FF */ + MirLev1_0100, /* B700..B7FF */ + MirLev1_0100, /* B800..B8FF */ + MirLev1_0100, /* B900..B9FF */ + MirLev1_0100, /* BA00..BAFF */ + MirLev1_0100, /* BB00..BBFF */ + MirLev1_0100, /* BC00..BCFF */ + MirLev1_0100, /* BD00..BDFF */ + MirLev1_0100, /* BE00..BEFF */ + MirLev1_0100, /* BF00..BFFF */ + MirLev1_0100, /* C000..C0FF */ + MirLev1_0100, /* C100..C1FF */ + MirLev1_0100, /* C200..C2FF */ + MirLev1_0100, /* C300..C3FF */ + MirLev1_0100, /* C400..C4FF */ + MirLev1_0100, /* C500..C5FF */ + MirLev1_0100, /* C600..C6FF */ + MirLev1_0100, /* C700..C7FF */ + MirLev1_0100, /* C800..C8FF */ + MirLev1_0100, /* C900..C9FF */ + MirLev1_0100, /* CA00..CAFF */ + MirLev1_0100, /* CB00..CBFF */ + MirLev1_0100, /* CC00..CCFF */ + MirLev1_0100, /* CD00..CDFF */ + MirLev1_0100, /* CE00..CEFF */ + MirLev1_0100, /* CF00..CFFF */ + MirLev1_0100, /* D000..D0FF */ + MirLev1_0100, /* D100..D1FF */ + MirLev1_0100, /* D200..D2FF */ + MirLev1_0100, /* D300..D3FF */ + MirLev1_0100, /* D400..D4FF */ + MirLev1_0100, /* D500..D5FF */ + MirLev1_0100, /* D600..D6FF */ + MirLev1_0100, /* D700..D7FF */ + MirLev1_0100, /* D800..D8FF */ + MirLev1_0100, /* D900..D9FF */ + MirLev1_0100, /* DA00..DAFF */ + MirLev1_0100, /* DB00..DBFF */ + MirLev1_0100, /* DC00..DCFF */ + MirLev1_0100, /* DD00..DDFF */ + MirLev1_0100, /* DE00..DEFF */ + MirLev1_0100, /* DF00..DFFF */ + MirLev1_0100, /* E000..E0FF */ + MirLev1_0100, /* E100..E1FF */ + MirLev1_0100, /* E200..E2FF */ + MirLev1_0100, /* E300..E3FF */ + MirLev1_0100, /* E400..E4FF */ + MirLev1_0100, /* E500..E5FF */ + MirLev1_0100, /* E600..E6FF */ + MirLev1_0100, /* E700..E7FF */ + MirLev1_0100, /* E800..E8FF */ + MirLev1_0100, /* E900..E9FF */ + MirLev1_0100, /* EA00..EAFF */ + MirLev1_0100, /* EB00..EBFF */ + MirLev1_0100, /* EC00..ECFF */ + MirLev1_0100, /* ED00..EDFF */ + MirLev1_0100, /* EE00..EEFF */ + MirLev1_0100, /* EF00..EFFF */ + MirLev1_0100, /* F000..F0FF */ + MirLev1_0100, /* F100..F1FF */ + MirLev1_0100, /* F200..F2FF */ + MirLev1_0100, /* F300..F3FF */ + MirLev1_0100, /* F400..F4FF */ + MirLev1_0100, /* F500..F5FF */ + MirLev1_0100, /* F600..F6FF */ + MirLev1_0100, /* F700..F7FF */ + MirLev1_0100, /* F800..F8FF */ + MirLev1_0100, /* F900..F9FF */ + MirLev1_0100, /* FA00..FAFF */ + MirLev1_0100, /* FB00..FBFF */ + MirLev1_0100, /* FC00..FCFF */ + MirLev1_0100, /* FD00..FDFF */ + MirLev1_FE00, /* FE00..FEFF */ + MirLev1_FF00, /* FF00..FFFF */ +}; + +/* *INDENT-ON* */ + +#define GLIB_GET_MIRRORING_DELTA(x) \ + ((x) >= 0x10000 ? 0 : \ + MirLev3[((x) & 0x03) + \ + MirLev2[((x) >> 2 & 0x03) + \ + MirLev1[((x) >> 4 & 0x0f) + \ + MirLev0[((x) >> 8)]]]]) + +#undef PACKTAB_UINT8 +#undef PACKTAB_UINT16 +#undef PACKTAB_UINT32 + +#define GLIB_GET_MIRRORING(x) ((x) + GLIB_GET_MIRRORING_DELTA(x)) + +/* End of generated gmirroringtable.h */ diff --git a/glib/gnode.c b/glib/gnode.c new file mode 100644 index 0000000..7d3dfce --- /dev/null +++ b/glib/gnode.c @@ -0,0 +1,1281 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GNode: N-way tree implementation. + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: trees-nary + * @title: N-ary Trees + * @short_description: trees of data with any number of branches + * + * The #GNode struct and its associated functions provide a N-ary tree + * data structure, where nodes in the tree can contain arbitrary data. + * + * To create a new tree use g_node_new(). + * + * To insert a node into a tree use g_node_insert(), + * g_node_insert_before(), g_node_append() and g_node_prepend(). + * + * To create a new node and insert it into a tree use + * g_node_insert_data(), g_node_insert_data_before(), + * g_node_append_data() and g_node_prepend_data(). + * + * To reverse the children of a node use g_node_reverse_children(). + * + * To find a node use g_node_get_root(), g_node_find(), + * g_node_find_child(), g_node_child_index(), g_node_child_position(), + * g_node_first_child(), g_node_last_child(), g_node_nth_child(), + * g_node_first_sibling(), g_node_prev_sibling(), g_node_next_sibling() + * or g_node_last_sibling(). + * + * To get information about a node or tree use G_NODE_IS_LEAF(), + * G_NODE_IS_ROOT(), g_node_depth(), g_node_n_nodes(), + * g_node_n_children(), g_node_is_ancestor() or g_node_max_height(). + * + * To traverse a tree, calling a function for each node visited in the + * traversal, use g_node_traverse() or g_node_children_foreach(). + * + * To remove a node or subtree from a tree use g_node_unlink() or + * g_node_destroy(). + **/ + +/** + * GNode: + * @data: contains the actual data of the node. + * @next: points to the node's next sibling (a sibling is another + * #GNode with the same parent). + * @prev: points to the node's previous sibling. + * @parent: points to the parent of the #GNode, or is %NULL if the + * #GNode is the root of the tree. + * @children: points to the first child of the #GNode. The other + * children are accessed by using the @next pointer of each + * child. + * + * The #GNode struct represents one node in a + * N-ary Tree. fields + **/ + +/** + * g_node_push_allocator: + * @dummy: the #GAllocator to use when allocating #GNode elements. + * + * Sets the allocator to use to allocate #GNode elements. Use + * g_node_pop_allocator() to restore the previous allocator. + * + * Note that this function is not available if GLib has been compiled + * with + * + * Deprecated:2.10: It does nothing, since #GNode has been converted to + * the slice + * allocator + **/ +void g_node_push_allocator (gpointer dummy) { /* present for binary compat only */ } + +/** + * g_node_pop_allocator: + * + * Restores the previous #GAllocator, used when allocating #GNode + * elements. + * + * Note that this function is not available if GLib has been compiled + * with + * + * Deprecated:2.10: It does nothing, since #GNode has been converted to + * the slice + * allocator + **/ +void g_node_pop_allocator (void) { /* present for binary compat only */ } + +#define g_node_alloc0() g_slice_new0 (GNode) +#define g_node_free(node) g_slice_free (GNode, node) + +/* --- functions --- */ +/** + * g_node_new: + * @data: the data of the new node + * + * Creates a new #GNode containing the given data. + * Used to create the first node in a tree. + * + * Returns: a new #GNode + */ +GNode* +g_node_new (gpointer data) +{ + GNode *node = g_node_alloc0 (); + node->data = data; + return node; +} + +static void +g_nodes_free (GNode *node) +{ + while (node) + { + GNode *next = node->next; + if (node->children) + g_nodes_free (node->children); + g_node_free (node); + node = next; + } +} + +/** + * g_node_destroy: + * @root: the root of the tree/subtree to destroy + * + * Removes @root and its children from the tree, freeing any memory + * allocated. + */ +void +g_node_destroy (GNode *root) +{ + g_return_if_fail (root != NULL); + + if (!G_NODE_IS_ROOT (root)) + g_node_unlink (root); + + g_nodes_free (root); +} + +/** + * g_node_unlink: + * @node: the #GNode to unlink, which becomes the root of a new tree + * + * Unlinks a #GNode from a tree, resulting in two separate trees. + */ +void +g_node_unlink (GNode *node) +{ + g_return_if_fail (node != NULL); + + if (node->prev) + node->prev->next = node->next; + else if (node->parent) + node->parent->children = node->next; + node->parent = NULL; + if (node->next) + { + node->next->prev = node->prev; + node->next = NULL; + } + node->prev = NULL; +} + +/** + * g_node_copy_deep: + * @node: a #GNode + * @copy_func: the function which is called to copy the data inside each node, + * or %NULL to use the original data. + * @data: data to pass to @copy_func + * + * Recursively copies a #GNode and its data. + * + * Return value: a new #GNode containing copies of the data in @node. + * + * Since: 2.4 + **/ +GNode* +g_node_copy_deep (GNode *node, + GCopyFunc copy_func, + gpointer data) +{ + GNode *new_node = NULL; + + if (copy_func == NULL) + return g_node_copy (node); + + if (node) + { + GNode *child, *new_child; + + new_node = g_node_new (copy_func (node->data, data)); + + for (child = g_node_last_child (node); child; child = child->prev) + { + new_child = g_node_copy_deep (child, copy_func, data); + g_node_prepend (new_node, new_child); + } + } + + return new_node; +} + +/** + * g_node_copy: + * @node: a #GNode + * + * Recursively copies a #GNode (but does not deep-copy the data inside the + * nodes, see g_node_copy_deep() if you need that). + * + * Returns: a new #GNode containing the same data pointers + */ +GNode* +g_node_copy (GNode *node) +{ + GNode *new_node = NULL; + + if (node) + { + GNode *child; + + new_node = g_node_new (node->data); + + for (child = g_node_last_child (node); child; child = child->prev) + g_node_prepend (new_node, g_node_copy (child)); + } + + return new_node; +} + +/** + * g_node_insert: + * @parent: the #GNode to place @node under + * @position: the position to place @node at, with respect to its siblings + * If position is -1, @node is inserted as the last child of @parent + * @node: the #GNode to insert + * + * Inserts a #GNode beneath the parent at the given position. + * + * Returns: the inserted #GNode + */ +GNode* +g_node_insert (GNode *parent, + gint position, + GNode *node) +{ + g_return_val_if_fail (parent != NULL, node); + g_return_val_if_fail (node != NULL, node); + g_return_val_if_fail (G_NODE_IS_ROOT (node), node); + + if (position > 0) + return g_node_insert_before (parent, + g_node_nth_child (parent, position), + node); + else if (position == 0) + return g_node_prepend (parent, node); + else /* if (position < 0) */ + return g_node_append (parent, node); +} + +/** + * g_node_insert_before: + * @parent: the #GNode to place @node under + * @sibling: the sibling #GNode to place @node before. + * If sibling is %NULL, the node is inserted as the last child of @parent. + * @node: the #GNode to insert + * + * Inserts a #GNode beneath the parent before the given sibling. + * + * Returns: the inserted #GNode + */ +GNode* +g_node_insert_before (GNode *parent, + GNode *sibling, + GNode *node) +{ + g_return_val_if_fail (parent != NULL, node); + g_return_val_if_fail (node != NULL, node); + g_return_val_if_fail (G_NODE_IS_ROOT (node), node); + if (sibling) + g_return_val_if_fail (sibling->parent == parent, node); + + node->parent = parent; + + if (sibling) + { + if (sibling->prev) + { + node->prev = sibling->prev; + node->prev->next = node; + node->next = sibling; + sibling->prev = node; + } + else + { + node->parent->children = node; + node->next = sibling; + sibling->prev = node; + } + } + else + { + if (parent->children) + { + sibling = parent->children; + while (sibling->next) + sibling = sibling->next; + node->prev = sibling; + sibling->next = node; + } + else + node->parent->children = node; + } + + return node; +} + +/** + * g_node_insert_after: + * @parent: the #GNode to place @node under + * @sibling: the sibling #GNode to place @node after. + * If sibling is %NULL, the node is inserted as the first child of @parent. + * @node: the #GNode to insert + * + * Inserts a #GNode beneath the parent after the given sibling. + * + * Returns: the inserted #GNode + */ +GNode* +g_node_insert_after (GNode *parent, + GNode *sibling, + GNode *node) +{ + g_return_val_if_fail (parent != NULL, node); + g_return_val_if_fail (node != NULL, node); + g_return_val_if_fail (G_NODE_IS_ROOT (node), node); + if (sibling) + g_return_val_if_fail (sibling->parent == parent, node); + + node->parent = parent; + + if (sibling) + { + if (sibling->next) + { + sibling->next->prev = node; + } + node->next = sibling->next; + node->prev = sibling; + sibling->next = node; + } + else + { + if (parent->children) + { + node->next = parent->children; + parent->children->prev = node; + } + parent->children = node; + } + + return node; +} + +/** + * g_node_prepend: + * @parent: the #GNode to place the new #GNode under + * @node: the #GNode to insert + * + * Inserts a #GNode as the first child of the given parent. + * + * Returns: the inserted #GNode + */ +GNode* +g_node_prepend (GNode *parent, + GNode *node) +{ + g_return_val_if_fail (parent != NULL, node); + + return g_node_insert_before (parent, parent->children, node); +} + +/** + * g_node_get_root: + * @node: a #GNode + * + * Gets the root of a tree. + * + * Returns: the root of the tree + */ +GNode* +g_node_get_root (GNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + + while (node->parent) + node = node->parent; + + return node; +} + +/** + * g_node_is_ancestor: + * @node: a #GNode + * @descendant: a #GNode + * + * Returns %TRUE if @node is an ancestor of @descendant. + * This is true if node is the parent of @descendant, + * or if node is the grandparent of @descendant etc. + * + * Returns: %TRUE if @node is an ancestor of @descendant + */ +gboolean +g_node_is_ancestor (GNode *node, + GNode *descendant) +{ + g_return_val_if_fail (node != NULL, FALSE); + g_return_val_if_fail (descendant != NULL, FALSE); + + while (descendant) + { + if (descendant->parent == node) + return TRUE; + + descendant = descendant->parent; + } + + return FALSE; +} + +/** + * g_node_depth: + * @node: a #GNode + * + * Gets the depth of a #GNode. + * + * If @node is %NULL the depth is 0. The root node has a depth of 1. + * For the children of the root node the depth is 2. And so on. + * + * Returns: the depth of the #GNode + */ +guint +g_node_depth (GNode *node) +{ + guint depth = 0; + + while (node) + { + depth++; + node = node->parent; + } + + return depth; +} + +/** + * g_node_reverse_children: + * @node: a #GNode. + * + * Reverses the order of the children of a #GNode. + * (It doesn't change the order of the grandchildren.) + */ +void +g_node_reverse_children (GNode *node) +{ + GNode *child; + GNode *last; + + g_return_if_fail (node != NULL); + + child = node->children; + last = NULL; + while (child) + { + last = child; + child = last->next; + last->next = last->prev; + last->prev = child; + } + node->children = last; +} + +/** + * g_node_max_height: + * @root: a #GNode + * + * Gets the maximum height of all branches beneath a #GNode. + * This is the maximum distance from the #GNode to all leaf nodes. + * + * If @root is %NULL, 0 is returned. If @root has no children, + * 1 is returned. If @root has children, 2 is returned. And so on. + * + * Returns: the maximum height of the tree beneath @root + */ +guint +g_node_max_height (GNode *root) +{ + GNode *child; + guint max_height = 0; + + if (!root) + return 0; + + child = root->children; + while (child) + { + guint tmp_height; + + tmp_height = g_node_max_height (child); + if (tmp_height > max_height) + max_height = tmp_height; + child = child->next; + } + + return max_height + 1; +} + +static gboolean +g_node_traverse_pre_order (GNode *node, + GTraverseFlags flags, + GNodeTraverseFunc func, + gpointer data) +{ + if (node->children) + { + GNode *child; + + if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + + child = node->children; + while (child) + { + GNode *current; + + current = child; + child = current->next; + if (g_node_traverse_pre_order (current, flags, func, data)) + return TRUE; + } + } + else if ((flags & G_TRAVERSE_LEAFS) && + func (node, data)) + return TRUE; + + return FALSE; +} + +static gboolean +g_node_depth_traverse_pre_order (GNode *node, + GTraverseFlags flags, + guint depth, + GNodeTraverseFunc func, + gpointer data) +{ + if (node->children) + { + GNode *child; + + if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + + depth--; + if (!depth) + return FALSE; + + child = node->children; + while (child) + { + GNode *current; + + current = child; + child = current->next; + if (g_node_depth_traverse_pre_order (current, flags, depth, func, data)) + return TRUE; + } + } + else if ((flags & G_TRAVERSE_LEAFS) && + func (node, data)) + return TRUE; + + return FALSE; +} + +static gboolean +g_node_traverse_post_order (GNode *node, + GTraverseFlags flags, + GNodeTraverseFunc func, + gpointer data) +{ + if (node->children) + { + GNode *child; + + child = node->children; + while (child) + { + GNode *current; + + current = child; + child = current->next; + if (g_node_traverse_post_order (current, flags, func, data)) + return TRUE; + } + + if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + + } + else if ((flags & G_TRAVERSE_LEAFS) && + func (node, data)) + return TRUE; + + return FALSE; +} + +static gboolean +g_node_depth_traverse_post_order (GNode *node, + GTraverseFlags flags, + guint depth, + GNodeTraverseFunc func, + gpointer data) +{ + if (node->children) + { + depth--; + if (depth) + { + GNode *child; + + child = node->children; + while (child) + { + GNode *current; + + current = child; + child = current->next; + if (g_node_depth_traverse_post_order (current, flags, depth, func, data)) + return TRUE; + } + } + + if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + + } + else if ((flags & G_TRAVERSE_LEAFS) && + func (node, data)) + return TRUE; + + return FALSE; +} + +static gboolean +g_node_traverse_in_order (GNode *node, + GTraverseFlags flags, + GNodeTraverseFunc func, + gpointer data) +{ + if (node->children) + { + GNode *child; + GNode *current; + + child = node->children; + current = child; + child = current->next; + + if (g_node_traverse_in_order (current, flags, func, data)) + return TRUE; + + if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + + while (child) + { + current = child; + child = current->next; + if (g_node_traverse_in_order (current, flags, func, data)) + return TRUE; + } + } + else if ((flags & G_TRAVERSE_LEAFS) && + func (node, data)) + return TRUE; + + return FALSE; +} + +static gboolean +g_node_depth_traverse_in_order (GNode *node, + GTraverseFlags flags, + guint depth, + GNodeTraverseFunc func, + gpointer data) +{ + if (node->children) + { + depth--; + if (depth) + { + GNode *child; + GNode *current; + + child = node->children; + current = child; + child = current->next; + + if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) + return TRUE; + + if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + + while (child) + { + current = child; + child = current->next; + if (g_node_depth_traverse_in_order (current, flags, depth, func, data)) + return TRUE; + } + } + else if ((flags & G_TRAVERSE_NON_LEAFS) && + func (node, data)) + return TRUE; + } + else if ((flags & G_TRAVERSE_LEAFS) && + func (node, data)) + return TRUE; + + return FALSE; +} + +static gboolean +g_node_traverse_level (GNode *node, + GTraverseFlags flags, + guint level, + GNodeTraverseFunc func, + gpointer data, + gboolean *more_levels) +{ + if (level == 0) + { + if (node->children) + { + *more_levels = TRUE; + return (flags & G_TRAVERSE_NON_LEAFS) && func (node, data); + } + else + { + return (flags & G_TRAVERSE_LEAFS) && func (node, data); + } + } + else + { + node = node->children; + + while (node) + { + if (g_node_traverse_level (node, flags, level - 1, func, data, more_levels)) + return TRUE; + + node = node->next; + } + } + + return FALSE; +} + +static gboolean +g_node_depth_traverse_level (GNode *node, + GTraverseFlags flags, + guint depth, + GNodeTraverseFunc func, + gpointer data) +{ + guint level; + gboolean more_levels; + + level = 0; + while (level != depth) + { + more_levels = FALSE; + if (g_node_traverse_level (node, flags, level, func, data, &more_levels)) + return TRUE; + if (!more_levels) + break; + level++; + } + return FALSE; +} + +/** + * g_node_traverse: + * @root: the root #GNode of the tree to traverse + * @order: the order in which nodes are visited - %G_IN_ORDER, + * %G_PRE_ORDER, %G_POST_ORDER, or %G_LEVEL_ORDER. + * @flags: which types of children are to be visited, one of + * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES + * @max_depth: the maximum depth of the traversal. Nodes below this + * depth will not be visited. If max_depth is -1 all nodes in + * the tree are visited. If depth is 1, only the root is visited. + * If depth is 2, the root and its children are visited. And so on. + * @func: the function to call for each visited #GNode + * @data: user data to pass to the function + * + * Traverses a tree starting at the given root #GNode. + * It calls the given function for each node visited. + * The traversal can be halted at any point by returning %TRUE from @func. + */ +/** + * GTraverseFlags: + * @G_TRAVERSE_LEAVES: only leaf nodes should be visited. This name has + * been introduced in 2.6, for older version use + * %G_TRAVERSE_LEAFS. + * @G_TRAVERSE_NON_LEAVES: only non-leaf nodes should be visited. This + * name has been introduced in 2.6, for older + * version use %G_TRAVERSE_NON_LEAFS. + * @G_TRAVERSE_ALL: all nodes should be visited. + * @G_TRAVERSE_MASK: a mask of all traverse flags. + * @G_TRAVERSE_LEAFS: identical to %G_TRAVERSE_LEAVES. + * @G_TRAVERSE_NON_LEAFS: identical to %G_TRAVERSE_NON_LEAVES. + * + * Specifies which nodes are visited during several of the tree + * functions, including g_node_traverse() and g_node_find(). + **/ +/** + * GNodeTraverseFunc: + * @node: a #GNode. + * @data: user data passed to g_node_traverse(). + * @Returns: %TRUE to stop the traversal. + * + * Specifies the type of function passed to g_node_traverse(). The + * function is called with each of the nodes visited, together with the + * user data passed to g_node_traverse(). If the function returns + * %TRUE, then the traversal is stopped. + **/ +void +g_node_traverse (GNode *root, + GTraverseType order, + GTraverseFlags flags, + gint depth, + GNodeTraverseFunc func, + gpointer data) +{ + g_return_if_fail (root != NULL); + g_return_if_fail (func != NULL); + g_return_if_fail (order <= G_LEVEL_ORDER); + g_return_if_fail (flags <= G_TRAVERSE_MASK); + g_return_if_fail (depth == -1 || depth > 0); + + switch (order) + { + case G_PRE_ORDER: + if (depth < 0) + g_node_traverse_pre_order (root, flags, func, data); + else + g_node_depth_traverse_pre_order (root, flags, depth, func, data); + break; + case G_POST_ORDER: + if (depth < 0) + g_node_traverse_post_order (root, flags, func, data); + else + g_node_depth_traverse_post_order (root, flags, depth, func, data); + break; + case G_IN_ORDER: + if (depth < 0) + g_node_traverse_in_order (root, flags, func, data); + else + g_node_depth_traverse_in_order (root, flags, depth, func, data); + break; + case G_LEVEL_ORDER: + g_node_depth_traverse_level (root, flags, depth, func, data); + break; + } +} + +static gboolean +g_node_find_func (GNode *node, + gpointer data) +{ + gpointer *d = data; + + if (*d != node->data) + return FALSE; + + *(++d) = node; + + return TRUE; +} + +/** + * g_node_find: + * @root: the root #GNode of the tree to search + * @order: the order in which nodes are visited - %G_IN_ORDER, + * %G_PRE_ORDER, %G_POST_ORDER, or %G_LEVEL_ORDER + * @flags: which types of children are to be searched, one of + * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES + * @data: the data to find + * + * Finds a #GNode in a tree. + * + * Returns: the found #GNode, or %NULL if the data is not found + */ +GNode* +g_node_find (GNode *root, + GTraverseType order, + GTraverseFlags flags, + gpointer data) +{ + gpointer d[2]; + + g_return_val_if_fail (root != NULL, NULL); + g_return_val_if_fail (order <= G_LEVEL_ORDER, NULL); + g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); + + d[0] = data; + d[1] = NULL; + + g_node_traverse (root, order, flags, -1, g_node_find_func, d); + + return d[1]; +} + +static void +g_node_count_func (GNode *node, + GTraverseFlags flags, + guint *n) +{ + if (node->children) + { + GNode *child; + + if (flags & G_TRAVERSE_NON_LEAFS) + (*n)++; + + child = node->children; + while (child) + { + g_node_count_func (child, flags, n); + child = child->next; + } + } + else if (flags & G_TRAVERSE_LEAFS) + (*n)++; +} + +/** + * g_node_n_nodes: + * @root: a #GNode + * @flags: which types of children are to be counted, one of + * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES + * + * Gets the number of nodes in a tree. + * + * Returns: the number of nodes in the tree + */ +guint +g_node_n_nodes (GNode *root, + GTraverseFlags flags) +{ + guint n = 0; + + g_return_val_if_fail (root != NULL, 0); + g_return_val_if_fail (flags <= G_TRAVERSE_MASK, 0); + + g_node_count_func (root, flags, &n); + + return n; +} + +/** + * g_node_last_child: + * @node: a #GNode (must not be %NULL) + * + * Gets the last child of a #GNode. + * + * Returns: the last child of @node, or %NULL if @node has no children + */ +GNode* +g_node_last_child (GNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + + node = node->children; + if (node) + while (node->next) + node = node->next; + + return node; +} + +/** + * g_node_nth_child: + * @node: a #GNode + * @n: the index of the desired child + * + * Gets a child of a #GNode, using the given index. + * The first child is at index 0. If the index is + * too big, %NULL is returned. + * + * Returns: the child of @node at index @n + */ +GNode* +g_node_nth_child (GNode *node, + guint n) +{ + g_return_val_if_fail (node != NULL, NULL); + + node = node->children; + if (node) + while ((n-- > 0) && node) + node = node->next; + + return node; +} + +/** + * g_node_n_children: + * @node: a #GNode + * + * Gets the number of children of a #GNode. + * + * Returns: the number of children of @node + */ +guint +g_node_n_children (GNode *node) +{ + guint n = 0; + + g_return_val_if_fail (node != NULL, 0); + + node = node->children; + while (node) + { + n++; + node = node->next; + } + + return n; +} + +/** + * g_node_find_child: + * @node: a #GNode + * @flags: which types of children are to be searched, one of + * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES + * @data: the data to find + * + * Finds the first child of a #GNode with the given data. + * + * Returns: the found child #GNode, or %NULL if the data is not found + */ +GNode* +g_node_find_child (GNode *node, + GTraverseFlags flags, + gpointer data) +{ + g_return_val_if_fail (node != NULL, NULL); + g_return_val_if_fail (flags <= G_TRAVERSE_MASK, NULL); + + node = node->children; + while (node) + { + if (node->data == data) + { + if (G_NODE_IS_LEAF (node)) + { + if (flags & G_TRAVERSE_LEAFS) + return node; + } + else + { + if (flags & G_TRAVERSE_NON_LEAFS) + return node; + } + } + node = node->next; + } + + return NULL; +} + +/** + * g_node_child_position: + * @node: a #GNode + * @child: a child of @node + * + * Gets the position of a #GNode with respect to its siblings. + * @child must be a child of @node. The first child is numbered 0, + * the second 1, and so on. + * + * Returns: the position of @child with respect to its siblings + */ +gint +g_node_child_position (GNode *node, + GNode *child) +{ + guint n = 0; + + g_return_val_if_fail (node != NULL, -1); + g_return_val_if_fail (child != NULL, -1); + g_return_val_if_fail (child->parent == node, -1); + + node = node->children; + while (node) + { + if (node == child) + return n; + n++; + node = node->next; + } + + return -1; +} + +/** + * g_node_child_index: + * @node: a #GNode + * @data: the data to find + * + * Gets the position of the first child of a #GNode + * which contains the given data. + * + * Returns: the index of the child of @node which contains + * @data, or -1 if the data is not found + */ +gint +g_node_child_index (GNode *node, + gpointer data) +{ + guint n = 0; + + g_return_val_if_fail (node != NULL, -1); + + node = node->children; + while (node) + { + if (node->data == data) + return n; + n++; + node = node->next; + } + + return -1; +} + +/** + * g_node_first_sibling: + * @node: a #GNode + * + * Gets the first sibling of a #GNode. + * This could possibly be the node itself. + * + * Returns: the first sibling of @node + */ +GNode* +g_node_first_sibling (GNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + + if (node->parent) + return node->parent->children; + + while (node->prev) + node = node->prev; + + return node; +} + +/** + * g_node_last_sibling: + * @node: a #GNode + * + * Gets the last sibling of a #GNode. + * This could possibly be the node itself. + * + * Returns: the last sibling of @node + */ +GNode* +g_node_last_sibling (GNode *node) +{ + g_return_val_if_fail (node != NULL, NULL); + + while (node->next) + node = node->next; + + return node; +} + +/** + * g_node_children_foreach: + * @node: a #GNode + * @flags: which types of children are to be visited, one of + * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES + * @func: the function to call for each visited node + * @data: user data to pass to the function + * + * Calls a function for each of the children of a #GNode. + * Note that it doesn't descend beneath the child nodes. + */ +/** + * GNodeForeachFunc: + * @node: a #GNode. + * @data: user data passed to g_node_children_foreach(). + * + * Specifies the type of function passed to g_node_children_foreach(). + * The function is called with each child node, together with the user + * data passed to g_node_children_foreach(). + **/ +void +g_node_children_foreach (GNode *node, + GTraverseFlags flags, + GNodeForeachFunc func, + gpointer data) +{ + g_return_if_fail (node != NULL); + g_return_if_fail (flags <= G_TRAVERSE_MASK); + g_return_if_fail (func != NULL); + + node = node->children; + while (node) + { + GNode *current; + + current = node; + node = current->next; + if (G_NODE_IS_LEAF (current)) + { + if (flags & G_TRAVERSE_LEAFS) + func (current, data); + } + else + { + if (flags & G_TRAVERSE_NON_LEAFS) + func (current, data); + } + } +} + +#define __G_NODE_C__ +#include "galiasdef.c" diff --git a/glib/gnode.h b/glib/gnode.h new file mode 100644 index 0000000..f68e8b3 --- /dev/null +++ b/glib/gnode.h @@ -0,0 +1,288 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_NODE_H__ +#define __G_NODE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GNode GNode; + +/* Tree traverse flags */ +typedef enum +{ + G_TRAVERSE_LEAVES = 1 << 0, + G_TRAVERSE_NON_LEAVES = 1 << 1, + G_TRAVERSE_ALL = G_TRAVERSE_LEAVES | G_TRAVERSE_NON_LEAVES, + G_TRAVERSE_MASK = 0x03, + G_TRAVERSE_LEAFS = G_TRAVERSE_LEAVES, + G_TRAVERSE_NON_LEAFS = G_TRAVERSE_NON_LEAVES +} GTraverseFlags; + +/* Tree traverse orders */ +typedef enum +{ + G_IN_ORDER, + G_PRE_ORDER, + G_POST_ORDER, + G_LEVEL_ORDER +} GTraverseType; + +typedef gboolean (*GNodeTraverseFunc) (GNode *node, + gpointer data); +typedef void (*GNodeForeachFunc) (GNode *node, + gpointer data); + +/** + * GCopyFunc: + * @src: A pointer to the data which should be copied + * @data: Additional data + * + * A function of this signature is used to copy the node data + * when doing a deep-copy of a tree. + * + * Returns: A pointer to the copy + * + * Since: 2.4 + */ +typedef gpointer (*GCopyFunc) (gconstpointer src, + gpointer data); + +/* N-way tree implementation + */ +struct _GNode +{ + gpointer data; + GNode *next; + GNode *prev; + GNode *parent; + GNode *children; +}; + +/** + * G_NODE_IS_ROOT: + * @node: a #GNode + * + * Returns %TRUE if a #GNode is the root of a tree. + * + * Returns: %TRUE if the #GNode is the root of a tree + * (i.e. it has no parent or siblings) + */ +#define G_NODE_IS_ROOT(node) (((GNode*) (node))->parent == NULL && \ + ((GNode*) (node))->prev == NULL && \ + ((GNode*) (node))->next == NULL) + +/** + * G_NODE_IS_LEAF: + * @node: a #GNode + * + * Returns %TRUE if a #GNode is a leaf node. + * + * Returns: %TRUE if the #GNode is a leaf node + * (i.e. it has no children) + */ +#define G_NODE_IS_LEAF(node) (((GNode*) (node))->children == NULL) + +GNode* g_node_new (gpointer data); +void g_node_destroy (GNode *root); +void g_node_unlink (GNode *node); +GNode* g_node_copy_deep (GNode *node, + GCopyFunc copy_func, + gpointer data); +GNode* g_node_copy (GNode *node); +GNode* g_node_insert (GNode *parent, + gint position, + GNode *node); +GNode* g_node_insert_before (GNode *parent, + GNode *sibling, + GNode *node); +GNode* g_node_insert_after (GNode *parent, + GNode *sibling, + GNode *node); +GNode* g_node_prepend (GNode *parent, + GNode *node); +guint g_node_n_nodes (GNode *root, + GTraverseFlags flags); +GNode* g_node_get_root (GNode *node); +gboolean g_node_is_ancestor (GNode *node, + GNode *descendant); +guint g_node_depth (GNode *node); +GNode* g_node_find (GNode *root, + GTraverseType order, + GTraverseFlags flags, + gpointer data); + +/* convenience macros */ +/** + * g_node_append: + * @parent: the #GNode to place the new #GNode under + * @node: the #GNode to insert + * + * Inserts a #GNode as the last child of the given parent. + * + * Returns: the inserted #GNode + */ +#define g_node_append(parent, node) \ + g_node_insert_before ((parent), NULL, (node)) + +/** + * g_node_insert_data: + * @parent: the #GNode to place the new #GNode under + * @position: the position to place the new #GNode at. If position is -1, + * the new #GNode is inserted as the last child of @parent + * @data: the data for the new #GNode + * + * Inserts a new #GNode at the given position. + * + * Returns: the new #GNode + */ +#define g_node_insert_data(parent, position, data) \ + g_node_insert ((parent), (position), g_node_new (data)) + +/** + * g_node_insert_data_before: + * @parent: the #GNode to place the new #GNode under + * @sibling: the sibling #GNode to place the new #GNode before + * @data: the data for the new #GNode + * + * Inserts a new #GNode before the given sibling. + * + * Returns: the new #GNode + */ +#define g_node_insert_data_before(parent, sibling, data) \ + g_node_insert_before ((parent), (sibling), g_node_new (data)) + +/** + * g_node_prepend_data: + * @parent: the #GNode to place the new #GNode under + * @data: the data for the new #GNode + * + * Inserts a new #GNode as the first child of the given parent. + * + * Returns: the new #GNode + */ +#define g_node_prepend_data(parent, data) \ + g_node_prepend ((parent), g_node_new (data)) + +/** + * g_node_append_data: + * @parent: the #GNode to place the new #GNode under + * @data: the data for the new #GNode + * + * Inserts a new #GNode as the last child of the given parent. + * + * Returns: the new #GNode + */ +#define g_node_append_data(parent, data) \ + g_node_insert_before ((parent), NULL, g_node_new (data)) + +/* traversal function, assumes that `node' is root + * (only traverses `node' and its subtree). + * this function is just a high level interface to + * low level traversal functions, optimized for speed. + */ +void g_node_traverse (GNode *root, + GTraverseType order, + GTraverseFlags flags, + gint max_depth, + GNodeTraverseFunc func, + gpointer data); + +/* return the maximum tree height starting with `node', this is an expensive + * operation, since we need to visit all nodes. this could be shortened by + * adding `guint height' to struct _GNode, but then again, this is not very + * often needed, and would make g_node_insert() more time consuming. + */ +guint g_node_max_height (GNode *root); + +void g_node_children_foreach (GNode *node, + GTraverseFlags flags, + GNodeForeachFunc func, + gpointer data); +void g_node_reverse_children (GNode *node); +guint g_node_n_children (GNode *node); +GNode* g_node_nth_child (GNode *node, + guint n); +GNode* g_node_last_child (GNode *node); +GNode* g_node_find_child (GNode *node, + GTraverseFlags flags, + gpointer data); +gint g_node_child_position (GNode *node, + GNode *child); +gint g_node_child_index (GNode *node, + gpointer data); + +GNode* g_node_first_sibling (GNode *node); +GNode* g_node_last_sibling (GNode *node); + +/** + * g_node_prev_sibling: + * @node: a #GNode + * + * Gets the previous sibling of a #GNode. + * + * Returns: the previous sibling of @node, or %NULL if @node is %NULL + */ +#define g_node_prev_sibling(node) ((node) ? \ + ((GNode*) (node))->prev : NULL) + +/** + * g_node_next_sibling: + * @node: a #GNode + * + * Gets the next sibling of a #GNode. + * + * Returns: the next sibling of @node, or %NULL if @node is %NULL + */ +#define g_node_next_sibling(node) ((node) ? \ + ((GNode*) (node))->next : NULL) + +/** + * g_node_first_child: + * @node: a #GNode + * + * Gets the first child of a #GNode. + * + * Returns: the first child of @node, or %NULL if @node is %NULL + * or has no children + */ +#define g_node_first_child(node) ((node) ? \ + ((GNode*) (node))->children : NULL) + +#ifndef G_DISABLE_DEPRECATED +void g_node_push_allocator (gpointer dummy); +void g_node_pop_allocator (void); +#endif + +G_END_DECLS + +#endif /* __G_NODE_H__ */ diff --git a/glib/gnulib/Makefile.am b/glib/gnulib/Makefile.am new file mode 100644 index 0000000..5f5ef06 --- /dev/null +++ b/glib/gnulib/Makefile.am @@ -0,0 +1,22 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -DG_LOG_DOMAIN=\"GLib\" \ + $(GLIB_DEBUG_FLAGS) -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION + +noinst_LTLIBRARIES = libgnulib.la + +libgnulib_la_SOURCES = \ + asnprintf.c \ + printf-args.c \ + printf-args.h \ + printf-parse.c \ + printf-parse.h \ + vasnprintf.c \ + vasnprintf.h \ + printf.c \ + printf.h \ + g-gnulib.h + + +EXTRA_DIST += makefile.msc diff --git a/glib/gnulib/Makefile.in b/glib/gnulib/Makefile.in new file mode 100644 index 0000000..a7eae3d --- /dev/null +++ b/glib/gnulib/Makefile.in @@ -0,0 +1,670 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = glib/gnulib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libgnulib_la_LIBADD = +am_libgnulib_la_OBJECTS = asnprintf.lo printf-args.lo printf-parse.lo \ + vasnprintf.lo printf.lo +libgnulib_la_OBJECTS = $(am_libgnulib_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgnulib_la_SOURCES) +DIST_SOURCES = $(libgnulib_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = makefile.msc +TEST_PROGS = +INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/glib -DG_LOG_DOMAIN=\"GLib\" \ + $(GLIB_DEBUG_FLAGS) -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION + +noinst_LTLIBRARIES = libgnulib.la +libgnulib_la_SOURCES = \ + asnprintf.c \ + printf-args.c \ + printf-args.h \ + printf-parse.c \ + printf-parse.h \ + vasnprintf.c \ + vasnprintf.h \ + printf.c \ + printf.h \ + g-gnulib.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu glib/gnulib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu glib/gnulib/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 +libgnulib.la: $(libgnulib_la_OBJECTS) $(libgnulib_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libgnulib_la_OBJECTS) $(libgnulib_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asnprintf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-args.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-parse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasnprintf.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/glib/gnulib/README b/glib/gnulib/README new file mode 100644 index 0000000..78e09b9 --- /dev/null +++ b/glib/gnulib/README @@ -0,0 +1,44 @@ +The files + + asnprintf.c + printf-args.c + printf-args.h + printf-parse.c + printf-parse.h + vasnprintf.c + vasnprintf.h + +are taken from the vasnprintf module of the GNUlib package, which can +be found at: + + http://www.gnu.org/software/gnulib/ + +All files have been modified to include g-gnulib.h. + +vasnprintf.c has also been modified to include support for long long +printing if the system printf doesn't. This code is protected by +#ifndef HAVE_LONG_LONG_FORMAT. + +Code has been added to printf-args.[ch], printf-parse.c and vasnprintf.c +to support printing of __int64 values with the I64 format modifier. This +is protected by #ifdef HAVE_INT64_AND_I64. + +The files + + printf.h + printf.c + g-gnulib.h + +have been written by me. printf.[hc] contain implementations of the +remaining functions in the printf family based on vasnprintf. +g-gnulib.h is included by all source files in order to move all +exported functions to the _g_gnulib namespace, replace malloc by +g_malloc and make sure that snprintf is only used if it implements +C99 return value semantics. + +Matthias Clasen +November 1, 2003 + + + + diff --git a/glib/gnulib/asnprintf.c b/glib/gnulib/asnprintf.c new file mode 100644 index 0000000..765d98c --- /dev/null +++ b/glib/gnulib/asnprintf.c @@ -0,0 +1,40 @@ +/* Formatted output to strings. + Copyright (C) 1999, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "g-gnulib.h" + +/* Specification. */ +#include "vasnprintf.h" + +#include + +char * +asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) +{ + va_list args; + char *result; + + va_start (args, format); + result = vasnprintf (resultbuf, lengthp, format, args); + va_end (args); + return result; +} diff --git a/glib/gnulib/g-gnulib.h b/glib/gnulib/g-gnulib.h new file mode 100644 index 0000000..6dbf2e9 --- /dev/null +++ b/glib/gnulib/g-gnulib.h @@ -0,0 +1,50 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2003 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __G_GNULIB_H__ + +#include "config.h" +#include +#include "glib/glib.h" +#include "glib/galias.h" + +/* Private namespace for gnulib functions */ +#define asnprintf _g_gnulib_asnprintf +#define vasnprintf _g_gnulib_vasnprintf +#define printf_parse _g_gnulib_printf_parse +#define printf_fetchargs _g_gnulib_printf_fetchargs + +/* Use GLib memory allocation */ +#undef malloc +#undef realloc +#undef free +#define malloc g_malloc +#define realloc g_realloc +#define free g_free + +/* Ensure only C99 snprintf gets used */ +#undef HAVE_SNPRINTF +#ifdef HAVE_C99_SNPRINTF +#define HAVE_SNPRINTF 1 +#else +#define HAVE_SNPRINTF 0 +#endif + + +#endif /* __G_GNULIB_H__ */ + diff --git a/glib/gnulib/makefile.msc b/glib/gnulib/makefile.msc new file mode 100644 index 0000000..da2b4cf --- /dev/null +++ b/glib/gnulib/makefile.msc @@ -0,0 +1,18 @@ +TOP = ..\..\.. +!INCLUDE ..\..\build\win32\make.msc + +INCLUDES = -I ..\.. -I .. +DEFINES = -DHAVE_CONFIG_H -DHAVE_LONG_LONG_FORMAT + +OBJECTS = \ + asnprintf.obj \ + printf.obj \ + printf-args.obj \ + printf-parse.obj \ + vasnprintf.obj + +all : gnulib.lib + +gnulib.lib : $(OBJECTS) + lib -out:gnulib.lib $(OBJECTS) + diff --git a/glib/gnulib/printf-args.c b/glib/gnulib/printf-args.c new file mode 100644 index 0000000..75a2a54 --- /dev/null +++ b/glib/gnulib/printf-args.c @@ -0,0 +1,133 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "g-gnulib.h" + +/* Specification. */ +#include "printf-args.h" + +#ifdef STATIC +STATIC +#endif +int +printf_fetchargs (va_list args, arguments *a) +{ + unsigned int i; + argument *ap; + + for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) + switch (ap->type) + { + case TYPE_SCHAR: + ap->a.a_schar = va_arg (args, /*signed char*/ int); + break; + case TYPE_UCHAR: + ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); + break; + case TYPE_SHORT: + ap->a.a_short = va_arg (args, /*short*/ int); + break; + case TYPE_USHORT: + ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); + break; + case TYPE_INT: + ap->a.a_int = va_arg (args, int); + break; + case TYPE_UINT: + ap->a.a_uint = va_arg (args, unsigned int); + break; + case TYPE_LONGINT: + ap->a.a_longint = va_arg (args, long int); + break; + case TYPE_ULONGINT: + ap->a.a_ulongint = va_arg (args, unsigned long int); + break; +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + ap->a.a_longlongint = va_arg (args, long long int); + break; + case TYPE_ULONGLONGINT: + ap->a.a_ulonglongint = va_arg (args, unsigned long long int); + break; +#endif +#ifdef HAVE_INT64_AND_I64 + case TYPE_INT64: + ap->a.a_int64 = va_arg (args, __int64); + break; + case TYPE_UINT64: + ap->a.a_uint64 = va_arg (args, unsigned __int64); + break; +#endif + case TYPE_DOUBLE: + ap->a.a_double = va_arg (args, double); + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + ap->a.a_longdouble = va_arg (args, long double); + break; +#endif + case TYPE_CHAR: + ap->a.a_char = va_arg (args, int); + break; +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: +#ifdef _WIN32 + ap->a.a_wide_char = va_arg (args, int); +#else + ap->a.a_wide_char = va_arg (args, wint_t); +#endif + break; +#endif + case TYPE_STRING: + ap->a.a_string = va_arg (args, const char *); + break; +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: + ap->a.a_wide_string = va_arg (args, const wchar_t *); + break; +#endif + case TYPE_POINTER: + ap->a.a_pointer = va_arg (args, void *); + break; + case TYPE_COUNT_SCHAR_POINTER: + ap->a.a_count_schar_pointer = va_arg (args, signed char *); + break; + case TYPE_COUNT_SHORT_POINTER: + ap->a.a_count_short_pointer = va_arg (args, short *); + break; + case TYPE_COUNT_INT_POINTER: + ap->a.a_count_int_pointer = va_arg (args, int *); + break; + case TYPE_COUNT_LONGINT_POINTER: + ap->a.a_count_longint_pointer = va_arg (args, long int *); + break; +#ifdef HAVE_LONG_LONG + case TYPE_COUNT_LONGLONGINT_POINTER: + ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); + break; +#endif + default: + /* Unknown type. */ + return -1; + } + return 0; +} diff --git a/glib/gnulib/printf-args.h b/glib/gnulib/printf-args.h new file mode 100644 index 0000000..0825675 --- /dev/null +++ b/glib/gnulib/printf-args.h @@ -0,0 +1,142 @@ +/* Decomposed printf argument list. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifndef _PRINTF_ARGS_H +#define _PRINTF_ARGS_H + +/* Get wchar_t. */ +#ifdef HAVE_WCHAR_T +# include +#endif + +/* Get wint_t. */ +#ifdef HAVE_WINT_T +# include +#endif + +/* Get va_list. */ +#include + + +/* Argument types */ +typedef enum +{ + TYPE_NONE, + TYPE_SCHAR, + TYPE_UCHAR, + TYPE_SHORT, + TYPE_USHORT, + TYPE_INT, + TYPE_UINT, + TYPE_LONGINT, + TYPE_ULONGINT, +#ifdef HAVE_LONG_LONG + TYPE_LONGLONGINT, + TYPE_ULONGLONGINT, +#endif +#ifdef HAVE_INT64_AND_I64 + TYPE_INT64, + TYPE_UINT64, +#endif + TYPE_DOUBLE, +#ifdef HAVE_LONG_DOUBLE + TYPE_LONGDOUBLE, +#endif + TYPE_CHAR, +#ifdef HAVE_WINT_T + TYPE_WIDE_CHAR, +#endif + TYPE_STRING, +#ifdef HAVE_WCHAR_T + TYPE_WIDE_STRING, +#endif + TYPE_POINTER, + TYPE_COUNT_SCHAR_POINTER, + TYPE_COUNT_SHORT_POINTER, + TYPE_COUNT_INT_POINTER, + TYPE_COUNT_LONGINT_POINTER +#ifdef HAVE_LONG_LONG +, TYPE_COUNT_LONGLONGINT_POINTER +#endif +} arg_type; + +/* Polymorphic argument */ +typedef struct +{ + arg_type type; + union + { + signed char a_schar; + unsigned char a_uchar; + short a_short; + unsigned short a_ushort; + int a_int; + unsigned int a_uint; + long int a_longint; + unsigned long int a_ulongint; +#ifdef HAVE_LONG_LONG + long long int a_longlongint; + unsigned long long int a_ulonglongint; +#endif +#ifdef HAVE_INT64_AND_I64 + __int64 a_int64; + unsigned __int64 a_uint64; +#endif + float a_float; + double a_double; +#ifdef HAVE_LONG_DOUBLE + long double a_longdouble; +#endif + int a_char; +#ifdef HAVE_WINT_T + wint_t a_wide_char; +#endif + const char* a_string; +#ifdef HAVE_WCHAR_T + const wchar_t* a_wide_string; +#endif + void* a_pointer; + signed char * a_count_schar_pointer; + short * a_count_short_pointer; + int * a_count_int_pointer; + long int * a_count_longint_pointer; +#ifdef HAVE_LONG_LONG + long long int * a_count_longlongint_pointer; +#endif + } + a; +} +argument; + +typedef struct +{ + unsigned int count; + argument *arg; +} +arguments; + + +/* Fetch the arguments, putting them into a. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int printf_fetchargs (va_list args, arguments *a); + +#endif /* _PRINTF_ARGS_H */ diff --git a/glib/gnulib/printf-parse.c b/glib/gnulib/printf-parse.c new file mode 100644 index 0000000..961b081 --- /dev/null +++ b/glib/gnulib/printf-parse.c @@ -0,0 +1,498 @@ +/* Formatted output to strings. + Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "g-gnulib.h" + +/* Specification. */ +#include "printf-parse.h" + +/* Get size_t, NULL. */ +#include + +/* Get intmax_t. */ +#if HAVE_STDINT_H_WITH_UINTMAX +# include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +# include +#endif + +/* malloc(), realloc(), free(). */ +#include + +#ifdef STATIC +STATIC +#endif +int +printf_parse (const char *format, char_directives *d, arguments *a) +{ + const char *cp = format; /* pointer into format */ + int arg_posn = 0; /* number of regular arguments consumed */ + unsigned int d_allocated; /* allocated elements of d->dir */ + unsigned int a_allocated; /* allocated elements of a->arg */ + unsigned int max_width_length = 0; + unsigned int max_precision_length = 0; + + d->count = 0; + d_allocated = 1; + d->dir = malloc (d_allocated * sizeof (char_directive)); + if (d->dir == NULL) + /* Out of memory. */ + return -1; + + a->count = 0; + a_allocated = 0; + a->arg = NULL; + +#define REGISTER_ARG(_index_,_type_) \ + { \ + unsigned int n = (_index_); \ + if (n >= a_allocated) \ + { \ + argument *memory; \ + a_allocated = 2 * a_allocated; \ + if (a_allocated <= n) \ + a_allocated = n + 1; \ + memory = (a->arg \ + ? realloc (a->arg, a_allocated * sizeof (argument)) \ + : malloc (a_allocated * sizeof (argument))); \ + if (memory == NULL) \ + /* Out of memory. */ \ + goto error; \ + a->arg = memory; \ + } \ + while (a->count <= n) \ + a->arg[a->count++].type = TYPE_NONE; \ + if (a->arg[n].type == TYPE_NONE) \ + a->arg[n].type = (_type_); \ + else if (a->arg[n].type != (_type_)) \ + /* Ambiguous type for positional argument. */ \ + goto error; \ + } + + while (*cp != '\0') + { + char c = *cp++; + if (c == '%') + { + int arg_index = -1; + char_directive *dp = &d->dir[d->count];/* pointer to next directive */ + + /* Initialize the next directive. */ + dp->dir_start = cp - 1; + dp->flags = 0; + dp->width_start = NULL; + dp->width_end = NULL; + dp->width_arg_index = -1; + dp->precision_start = NULL; + dp->precision_end = NULL; + dp->precision_arg_index = -1; + dp->arg_index = -1; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const char *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + unsigned int n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = 10 * n + (*np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + arg_index = n - 1; + cp = np + 1; + } + } + + /* Read the flags. */ + for (;;) + { + if (*cp == '\'') + { + dp->flags |= FLAG_GROUP; + cp++; + } + else if (*cp == '-') + { + dp->flags |= FLAG_LEFT; + cp++; + } + else if (*cp == '+') + { + dp->flags |= FLAG_SHOWSIGN; + cp++; + } + else if (*cp == ' ') + { + dp->flags |= FLAG_SPACE; + cp++; + } + else if (*cp == '#') + { + dp->flags |= FLAG_ALT; + cp++; + } + else if (*cp == '0') + { + dp->flags |= FLAG_ZERO; + cp++; + } + else + break; + } + + /* Parse the field width. */ + if (*cp == '*') + { + dp->width_start = cp; + cp++; + dp->width_end = cp; + if (max_width_length < 1) + max_width_length = 1; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const char *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + unsigned int n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = 10 * n + (*np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + dp->width_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->width_arg_index < 0) + dp->width_arg_index = arg_posn++; + REGISTER_ARG (dp->width_arg_index, TYPE_INT); + } + else if (*cp >= '0' && *cp <= '9') + { + unsigned int width_length; + + dp->width_start = cp; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->width_end = cp; + width_length = dp->width_end - dp->width_start; + if (max_width_length < width_length) + max_width_length = width_length; + } + + /* Parse the precision. */ + if (*cp == '.') + { + cp++; + if (*cp == '*') + { + dp->precision_start = cp - 1; + cp++; + dp->precision_end = cp; + if (max_precision_length < 2) + max_precision_length = 2; + + /* Test for positional argument. */ + if (*cp >= '0' && *cp <= '9') + { + const char *np; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + ; + if (*np == '$') + { + unsigned int n = 0; + + for (np = cp; *np >= '0' && *np <= '9'; np++) + n = 10 * n + (*np - '0'); + if (n == 0) + /* Positional argument 0. */ + goto error; + dp->precision_arg_index = n - 1; + cp = np + 1; + } + } + if (dp->precision_arg_index < 0) + dp->precision_arg_index = arg_posn++; + REGISTER_ARG (dp->precision_arg_index, TYPE_INT); + } + else + { + unsigned int precision_length; + + dp->precision_start = cp - 1; + for (; *cp >= '0' && *cp <= '9'; cp++) + ; + dp->precision_end = cp; + precision_length = dp->precision_end - dp->precision_start; + if (max_precision_length < precision_length) + max_precision_length = precision_length; + } + } + + { + arg_type type; + + /* Parse argument type/size specifiers. */ + { + int flags = 0; + + for (;;) + { + if (*cp == 'h') + { + flags |= (1 << (flags & 1)); + cp++; + } + else if (*cp == 'L') + { + flags |= 4; + cp++; + } + else if (*cp == 'l') + { + flags += 8; + cp++; + } +#ifdef HAVE_INT64_AND_I64 + else if (cp[0] == 'I' && + cp[1] == '6' && + cp[2] == '4') + { + flags = 64; + cp += 3; + } +#endif +#ifdef HAVE_INTMAX_T + else if (*cp == 'j') + { + if (sizeof (intmax_t) > sizeof (long)) + { + /* intmax_t = long long */ + flags += 16; + } + else if (sizeof (intmax_t) > sizeof (int)) + { + /* intmax_t = long */ + flags += 8; + } + cp++; + } +#endif + else if (*cp == 'z' || *cp == 'Z') + { + /* 'z' is standardized in ISO C 99, but glibc uses 'Z' + because the warning facility in gcc-2.95.2 understands + only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ + if (sizeof (size_t) > sizeof (long)) + { + /* size_t = long long */ + flags += 16; + } + else if (sizeof (size_t) > sizeof (int)) + { + /* size_t = long */ + flags += 8; + } + cp++; + } + else if (*cp == 't') + { + if (sizeof (ptrdiff_t) > sizeof (long)) + { + /* ptrdiff_t = long long */ + flags += 16; + } + else if (sizeof (ptrdiff_t) > sizeof (int)) + { + /* ptrdiff_t = long */ + flags += 8; + } + cp++; + } + else + break; + } + + /* Read the conversion character. */ + c = *cp++; + switch (c) + { + case 'd': case 'i': +#ifdef HAVE_INT64_AND_I64 + if (flags == 64) + type = TYPE_INT64; + else +#endif +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGLONGINT; + else +#endif + if (flags >= 8) + type = TYPE_LONGINT; + else if (flags & 2) + type = TYPE_SCHAR; + else if (flags & 1) + type = TYPE_SHORT; + else + type = TYPE_INT; + break; + case 'o': case 'u': case 'x': case 'X': +#ifdef HAVE_INT64_AND_I64 + if (flags == 64) + type = TYPE_UINT64; + else +#endif +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_ULONGLONGINT; + else +#endif + if (flags >= 8) + type = TYPE_ULONGINT; + else if (flags & 2) + type = TYPE_UCHAR; + else if (flags & 1) + type = TYPE_USHORT; + else + type = TYPE_UINT; + break; + case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': +#ifdef HAVE_LONG_DOUBLE + if (flags >= 16 || (flags & 4)) + type = TYPE_LONGDOUBLE; + else +#endif + type = TYPE_DOUBLE; + break; + case 'c': + if (flags >= 8) +#ifdef HAVE_WINT_T + type = TYPE_WIDE_CHAR; +#else + goto error; +#endif + else + type = TYPE_CHAR; + break; +#ifdef HAVE_WINT_T + case 'C': + type = TYPE_WIDE_CHAR; + c = 'c'; + break; +#endif + case 's': + if (flags >= 8) +#ifdef HAVE_WCHAR_T + type = TYPE_WIDE_STRING; +#else + goto error; +#endif + else + type = TYPE_STRING; + break; +#ifdef HAVE_WCHAR_T + case 'S': + type = TYPE_WIDE_STRING; + c = 's'; + break; +#endif + case 'p': + type = TYPE_POINTER; + break; + case 'n': +#ifdef HAVE_LONG_LONG + if (flags >= 16 || (flags & 4)) + type = TYPE_COUNT_LONGLONGINT_POINTER; + else +#endif + if (flags >= 8) + type = TYPE_COUNT_LONGINT_POINTER; + else if (flags & 2) + type = TYPE_COUNT_SCHAR_POINTER; + else if (flags & 1) + type = TYPE_COUNT_SHORT_POINTER; + else + type = TYPE_COUNT_INT_POINTER; + break; + case '%': + type = TYPE_NONE; + break; + default: + /* Unknown conversion character. */ + goto error; + } + } + + if (type != TYPE_NONE) + { + dp->arg_index = arg_index; + if (dp->arg_index < 0) + dp->arg_index = arg_posn++; + REGISTER_ARG (dp->arg_index, type); + } + dp->conversion = c; + dp->dir_end = cp; + } + + d->count++; + if (d->count >= d_allocated) + { + char_directive *memory; + + d_allocated = 2 * d_allocated; + memory = realloc (d->dir, d_allocated * sizeof (char_directive)); + if (memory == NULL) + /* Out of memory. */ + goto error; + d->dir = memory; + } + } + } + d->dir[d->count].dir_start = cp; + + d->max_width_length = max_width_length; + d->max_precision_length = max_precision_length; + return 0; + +error: + if (a->arg) + free (a->arg); + if (d->dir) + free (d->dir); + return -1; +} diff --git a/glib/gnulib/printf-parse.h b/glib/gnulib/printf-parse.h new file mode 100644 index 0000000..ab41478 --- /dev/null +++ b/glib/gnulib/printf-parse.h @@ -0,0 +1,74 @@ +/* Parse printf format string. + Copyright (C) 1999, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifndef _PRINTF_PARSE_H +#define _PRINTF_PARSE_H + +#include "printf-args.h" + +/* Private namespace for gnulib functions */ +#define printf_parse _g_gnulib_printf_parse + +/* Flags */ +#define FLAG_GROUP 1 /* ' flag */ +#define FLAG_LEFT 2 /* - flag */ +#define FLAG_SHOWSIGN 4 /* + flag */ +#define FLAG_SPACE 8 /* space flag */ +#define FLAG_ALT 16 /* # flag */ +#define FLAG_ZERO 32 + +/* A parsed directive. */ +typedef struct +{ + const char* dir_start; + const char* dir_end; + int flags; + const char* width_start; + const char* width_end; + int width_arg_index; + const char* precision_start; + const char* precision_end; + int precision_arg_index; + char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ + int arg_index; +} +char_directive; + +/* A parsed format string. */ +typedef struct +{ + unsigned int count; + char_directive *dir; + unsigned int max_width_length; + unsigned int max_precision_length; +} +char_directives; + + +/* Parses the format string. Fills in the number N of directives, and fills + in directives[0], ..., directives[N-1], and sets directives[N].dir_start + to the end of the format string. Also fills in the arg_type fields of the + arguments and the needed count of arguments. */ +#ifdef STATIC +STATIC +#else +extern +#endif +int printf_parse (const char *format, char_directives *d, arguments *a); + +#endif /* _PRINTF_PARSE_H */ diff --git a/glib/gnulib/printf.c b/glib/gnulib/printf.c new file mode 100644 index 0000000..b339299 --- /dev/null +++ b/glib/gnulib/printf.c @@ -0,0 +1,154 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2003 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 2003. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include +#include +#include +#include "g-gnulib.h" +#include "vasnprintf.h" +#include "printf.h" + +int _g_gnulib_printf (char const *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = _g_gnulib_vprintf (format, args); + va_end (args); + + return retval; +} + +int _g_gnulib_fprintf (FILE *file, char const *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = _g_gnulib_vfprintf (file, format, args); + va_end (args); + + return retval; +} + +int _g_gnulib_sprintf (char *string, char const *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = _g_gnulib_vsprintf (string, format, args); + va_end (args); + + return retval; +} + +int _g_gnulib_snprintf (char *string, size_t n, char const *format, ...) +{ + va_list args; + int retval; + + va_start (args, format); + retval = _g_gnulib_vsnprintf (string, n, format, args); + va_end (args); + + return retval; +} + +int _g_gnulib_vprintf (char const *format, va_list args) +{ + return _g_gnulib_vfprintf (stdout, format, args); +} + +int _g_gnulib_vfprintf (FILE *file, char const *format, va_list args) +{ + char *result; + size_t length; + + result = vasnprintf (NULL, &length, format, args); + if (result == NULL) + return -1; + + fwrite (result, 1, length, file); + free (result); + + return length; +} + +int _g_gnulib_vsprintf (char *string, char const *format, va_list args) +{ + char *result; + size_t length; + + result = vasnprintf (NULL, &length, format, args); + if (result == NULL) + return -1; + + memcpy (string, result, length + 1); + free (result); + + return length; +} + +int _g_gnulib_vsnprintf (char *string, size_t n, char const *format, va_list args) +{ + char *result; + size_t length; + + result = vasnprintf (NULL, &length, format, args); + if (result == NULL) + return -1; + + if (n > 0) + { + memcpy (string, result, MIN(length + 1, n)); + string[n - 1] = 0; + } + + free (result); + + return length; +} + +int _g_gnulib_vasprintf (char **result, char const *format, va_list args) +{ + size_t length; + + *result = vasnprintf (NULL, &length, format, args); + if (*result == NULL) + return -1; + + return length; +} + + + + + diff --git a/glib/gnulib/printf.h b/glib/gnulib/printf.h new file mode 100644 index 0000000..a7be56f --- /dev/null +++ b/glib/gnulib/printf.h @@ -0,0 +1,57 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2003 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __GNULIB_PRINTF_H__ +#define __GNULIB_PRINTF_H__ + +#include +#include + +int _g_gnulib_printf (char const *format, + ...); +int _g_gnulib_fprintf (FILE *file, + char const *format, + ...); +int _g_gnulib_sprintf (char *string, + char const *format, + ...); +int _g_gnulib_snprintf (char *string, + size_t n, + char const *format, + ...); +int _g_gnulib_vprintf (char const *format, + va_list args); +int _g_gnulib_vfprintf (FILE *file, + char const *format, + va_list args); +int _g_gnulib_vsprintf (char *string, + char const *format, + va_list args); +int _g_gnulib_vsnprintf (char *string, + size_t n, + char const *format, + va_list args); +int _g_gnulib_vasprintf (char **result, + char const *format, + va_list args); + + +#endif /* __GNULIB_PRINTF_H__ */ + + + diff --git a/glib/gnulib/vasnprintf.c b/glib/gnulib/vasnprintf.c new file mode 100644 index 0000000..c981059 --- /dev/null +++ b/glib/gnulib/vasnprintf.c @@ -0,0 +1,1081 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifndef _WIN32 +/* Tell glibc's to provide a prototype for snprintf(). + This must come before because may include + , and once has been included, it's too late. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif +#include "glib/galloca.h" + +#include "g-gnulib.h" + +/* Specification. */ +#include "vasnprintf.h" + +#include /* snprintf(), sprintf() */ +#include /* abort(), malloc(), realloc(), free() */ +#include /* memcpy(), strlen() */ +#include /* errno */ +#include /* CHAR_BIT */ +#include /* DBL_MAX_EXP, LDBL_MAX_EXP */ +#include "printf-parse.h" + +#ifdef HAVE_WCHAR_T +# ifdef HAVE_WCSLEN +# define local_wcslen wcslen +# else + /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid + a dependency towards this library, here is a local substitute. + Define this substitute only once, even if this file is included + twice in the same compilation unit. */ +# ifndef local_wcslen_defined +# define local_wcslen_defined 1 +static size_t +local_wcslen (const wchar_t *s) +{ + const wchar_t *ptr; + + for (ptr = s; *ptr != (wchar_t) 0; ptr++) + ; + return ptr - s; +} +# endif +# endif +#endif + +/* For those losing systems which don't have 'alloca' we have to add + some additional code emulating it. */ +#ifdef HAVE_ALLOCA +# define freea(p) /* nothing */ +#else +# define alloca(n) malloc (n) +# define freea(p) free (p) +#endif + +#ifndef HAVE_LONG_LONG_FORMAT +static int +print_long_long (char *buf, + int len, + int width, + int precision, + unsigned long flags, + char conversion, + unsigned long long number) +{ + int negative = FALSE; + char buffer[128]; + char *bufferend; + char *pointer; + int base; + static const char *upper = "0123456789ABCDEFX"; + static const char *lower = "0123456789abcdefx"; + const char *digits; + int i; + char *p; + int count; + +#define EMIT(c) \ + if (p - buf == len - 1) \ + { \ + *p++ = '\0'; \ + return len; \ + } \ + else \ + *p++ = c; + + p = buf; + + switch (conversion) + { + case 'o': + base = 8; + digits = lower; + negative = FALSE; + break; + case 'x': + base = 16; + digits = lower; + negative = FALSE; + break; + case 'X': + base = 16; + digits = upper; + negative = FALSE; + break; + default: + base = 10; + digits = lower; + negative = (long long)number < 0; + if (negative) + number = -((long long)number); + break; + } + + /* Build number */ + pointer = bufferend = &buffer[sizeof(buffer) - 1]; + *pointer-- = '\0'; + for (i = 1; i < (int)sizeof(buffer); i++) + { + *pointer-- = digits[number % base]; + number /= base; + if (number == 0) + break; + } + + /* Adjust width */ + width -= (bufferend - pointer) - 1; + + /* Adjust precision */ + if (precision != -1) + { + precision -= (bufferend - pointer) - 1; + if (precision < 0) + precision = 0; + flags |= FLAG_ZERO; + } + + /* Adjust width further */ + if (negative || (flags & FLAG_SHOWSIGN) || (flags & FLAG_SPACE)) + width--; + if (flags & FLAG_ALT) + { + switch (base) + { + case 16: + width -= 2; + break; + case 8: + width--; + break; + default: + break; + } + } + + /* Output prefixes spaces if needed */ + if (! ((flags & FLAG_LEFT) || + ((flags & FLAG_ZERO) && (precision == -1)))) + { + count = (precision == -1) ? 0 : precision; + while (width-- > count) + *p++ = ' '; + } + + /* width has been adjusted for signs and alternatives */ + if (negative) + { + EMIT ('-'); + } + else if (flags & FLAG_SHOWSIGN) + { + EMIT('+'); + } + else if (flags & FLAG_SPACE) + { + EMIT(' '); + } + + if (flags & FLAG_ALT) + { + switch (base) + { + case 8: + EMIT('0'); + break; + case 16: + EMIT('0'); + EMIT(digits[16]); + break; + default: + break; + } /* switch base */ + } + + /* Output prefixed zero padding if needed */ + if (flags & FLAG_ZERO) + { + if (precision == -1) + precision = width; + while (precision-- > 0) + { + EMIT('0'); + width--; + } + } + + /* Output the number itself */ + while (*(++pointer)) + { + EMIT(*pointer); + } + + /* Output trailing spaces if needed */ + if (flags & FLAG_LEFT) + { + while (width-- > 0) + EMIT(' '); + } + + EMIT('\0'); + + return p - buf - 1; +} +#endif + +char * +vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) +{ + char_directives d; + arguments a; + + if (printf_parse (format, &d, &a) < 0) + { + errno = EINVAL; + return NULL; + } + +#define CLEANUP() \ + free (d.dir); \ + if (a.arg) \ + free (a.arg); + + if (printf_fetchargs (args, &a) < 0) + { + CLEANUP (); + errno = EINVAL; + return NULL; + } + + { + char *buf = + (char *) alloca (7 + d.max_width_length + d.max_precision_length + 6); + const char *cp; + unsigned int i; + char_directive *dp; + /* Output string accumulator. */ + char *result; + size_t allocated; + size_t length; + + if (resultbuf != NULL) + { + result = resultbuf; + allocated = *lengthp; + } + else + { + result = NULL; + allocated = 0; + } + length = 0; + /* Invariants: + result is either == resultbuf or == NULL or malloc-allocated. + If length > 0, then result != NULL. */ + +#define ENSURE_ALLOCATION(needed) \ + if ((needed) > allocated) \ + { \ + char *memory; \ + \ + allocated = (allocated > 0 ? 2 * allocated : 12); \ + if ((needed) > allocated) \ + allocated = (needed); \ + if (result == resultbuf || result == NULL) \ + memory = (char *) malloc (allocated); \ + else \ + memory = (char *) realloc (result, allocated); \ + \ + if (memory == NULL) \ + { \ + if (!(result == resultbuf || result == NULL)) \ + free (result); \ + freea (buf); \ + CLEANUP (); \ + errno = ENOMEM; \ + return NULL; \ + } \ + if (result == resultbuf && length > 0) \ + memcpy (memory, result, length); \ + result = memory; \ + } + + for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) + { + if (cp != dp->dir_start) + { + size_t n = dp->dir_start - cp; + + ENSURE_ALLOCATION (length + n); + memcpy (result + length, cp, n); + length += n; + } + if (i == d.count) + break; + + /* Execute a single directive. */ + if (dp->conversion == '%') + { + if (!(dp->arg_index < 0)) + abort (); + ENSURE_ALLOCATION (length + 1); + result[length] = '%'; + length += 1; + } + else + { + if (!(dp->arg_index >= 0)) + abort (); + + if (dp->conversion == 'n') + { + switch (a.arg[dp->arg_index].type) + { + case TYPE_COUNT_SCHAR_POINTER: + *a.arg[dp->arg_index].a.a_count_schar_pointer = length; + break; + case TYPE_COUNT_SHORT_POINTER: + *a.arg[dp->arg_index].a.a_count_short_pointer = length; + break; + case TYPE_COUNT_INT_POINTER: + *a.arg[dp->arg_index].a.a_count_int_pointer = length; + break; + case TYPE_COUNT_LONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longint_pointer = length; + break; +#ifdef HAVE_LONG_LONG + case TYPE_COUNT_LONGLONGINT_POINTER: + *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; + break; +#endif + default: + abort (); + } + } + else + { + arg_type type = a.arg[dp->arg_index].type; + char *p; + unsigned int prefix_count; + int prefixes[2]; +#if !HAVE_SNPRINTF + unsigned int tmp_length; + char tmpbuf[700]; + char *tmp; + + /* Allocate a temporary buffer of sufficient size for calling + sprintf. */ + { + unsigned int width; + unsigned int precision; + + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index >= 0) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + width = (arg < 0 ? -arg : arg); + } + else + { + const char *digitp = dp->width_start; + + do + width = width * 10 + (*digitp++ - '0'); + while (digitp != dp->width_end); + } + } + + precision = 6; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index >= 0) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + precision = (arg < 0 ? 0 : arg); + } + else + { + const char *digitp = dp->precision_start + 1; + + precision = 0; + while (digitp != dp->precision_end) + precision = precision * 10 + (*digitp++ - '0'); + } + } + + switch (dp->conversion) + { + case 'd': case 'i': case 'u': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + break; + + case 'o': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.333334 /* binary -> octal */ + ) + + 1 /* turn floor into ceil */ + + 1; /* account for leading sign */ + break; + + case 'x': case 'X': +# ifdef HAVE_LONG_LONG + if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + else +# endif +# ifdef HAVE_INT64_AND_I64 + if (type == TYPE_INT64 || type == TYPE_UINT64) + tmp_length = + (unsigned int) (sizeof (unsigned __int64) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + else +# endif + if (type == TYPE_LONGINT || type == TYPE_ULONGINT) + tmp_length = + (unsigned int) (sizeof (unsigned long) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + else + tmp_length = + (unsigned int) (sizeof (unsigned int) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading sign or alternate form */ + break; + + case 'f': case 'F': +# ifdef HAVE_LONG_DOUBLE + if (type == TYPE_LONGDOUBLE) + tmp_length = + (unsigned int) (LDBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + precision + + 10; /* sign, decimal point etc. */ + else +# endif + tmp_length = + (unsigned int) (DBL_MAX_EXP + * 0.30103 /* binary -> decimal */ + * 2 /* estimate for FLAG_GROUP */ + ) + + 1 /* turn floor into ceil */ + + precision + + 10; /* sign, decimal point etc. */ + break; + + case 'e': case 'E': case 'g': case 'G': + case 'a': case 'A': + tmp_length = + precision + + 12; /* sign, decimal point, exponent etc. */ + break; + + case 'c': +# ifdef HAVE_WINT_T + if (type == TYPE_WIDE_CHAR) + tmp_length = MB_CUR_MAX; + else +# endif + tmp_length = 1; + break; + + case 's': +# ifdef HAVE_WCHAR_T + if (type == TYPE_WIDE_STRING) + tmp_length = + (a.arg[dp->arg_index].a.a_wide_string == NULL + ? 6 /* wcslen(L"(null)") */ + : local_wcslen (a.arg[dp->arg_index].a.a_wide_string)) + * MB_CUR_MAX; + else +# endif + tmp_length = a.arg[dp->arg_index].a.a_string == NULL + ? 6 /* strlen("(null)") */ + : strlen (a.arg[dp->arg_index].a.a_string); + break; + + case 'p': + tmp_length = + (unsigned int) (sizeof (void *) * CHAR_BIT + * 0.25 /* binary -> hexadecimal */ + ) + + 1 /* turn floor into ceil */ + + 2; /* account for leading 0x */ + break; + + default: + abort (); + } + + if (tmp_length < width) + tmp_length = width; + + tmp_length++; /* account for trailing NUL */ + } + + if (tmp_length <= sizeof (tmpbuf)) + tmp = tmpbuf; + else + { + tmp = (char *) malloc (tmp_length); + if (tmp == NULL) + { + /* Out of memory. */ + if (!(result == resultbuf || result == NULL)) + free (result); + freea (buf); + CLEANUP (); + errno = ENOMEM; + return NULL; + } + } +#endif + + /* Construct the format string for calling snprintf or + sprintf. */ + p = buf; + *p++ = '%'; + if (dp->flags & FLAG_GROUP) + *p++ = '\''; + if (dp->flags & FLAG_LEFT) + *p++ = '-'; + if (dp->flags & FLAG_SHOWSIGN) + *p++ = '+'; + if (dp->flags & FLAG_SPACE) + *p++ = ' '; + if (dp->flags & FLAG_ALT) + *p++ = '#'; + if (dp->flags & FLAG_ZERO) + *p++ = '0'; + if (dp->width_start != dp->width_end) + { + size_t n = dp->width_end - dp->width_start; + memcpy (p, dp->width_start, n); + p += n; + } + if (dp->precision_start != dp->precision_end) + { + size_t n = dp->precision_end - dp->precision_start; + memcpy (p, dp->precision_start, n); + p += n; + } + + switch (type) + { +#ifdef HAVE_INT64_AND_I64 + case TYPE_INT64: + case TYPE_UINT64: + *p++ = 'I'; + *p++ = '6'; + *p++ = '4'; + break; +#endif +#ifdef HAVE_LONG_LONG + case TYPE_LONGLONGINT: + case TYPE_ULONGLONGINT: +#ifdef HAVE_INT64_AND_I64 /* The system (sn)printf uses %I64. Also assume + * that long long == __int64. + */ + *p++ = 'I'; + *p++ = '6'; + *p++ = '4'; + break; +#else + *p++ = 'l'; + /*FALLTHROUGH*/ +#endif +#endif + case TYPE_LONGINT: + case TYPE_ULONGINT: +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: +#endif +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: +#endif + *p++ = 'l'; + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + *p++ = 'L'; + break; +#endif + default: + break; + } + *p = dp->conversion; +#if HAVE_SNPRINTF + p[1] = '%'; + p[2] = 'n'; + p[3] = '\0'; +#else + p[1] = '\0'; +#endif + + /* Construct the arguments for calling snprintf or sprintf. */ + prefix_count = 0; + if (dp->width_arg_index >= 0) + { + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; + } + if (dp->precision_arg_index >= 0) + { + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; + } + +#if HAVE_SNPRINTF + /* Prepare checking whether snprintf returns the count + via %n. */ + ENSURE_ALLOCATION (length + 1); + result[length] = '\0'; +#endif + + for (;;) + { + size_t maxlen; + int count; + int retcount; + + maxlen = allocated - length; + count = -1; + retcount = 0; + +#if HAVE_SNPRINTF +#define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + retcount = snprintf (result + length, maxlen, buf, \ + arg, &count); \ + break; \ + case 1: \ + retcount = snprintf (result + length, maxlen, buf, \ + prefixes[0], arg, &count); \ + break; \ + case 2: \ + retcount = snprintf (result + length, maxlen, buf, \ + prefixes[0], prefixes[1], arg, \ + &count); \ + break; \ + default: \ + abort (); \ + } +#else +#define SNPRINTF_BUF(arg) \ + switch (prefix_count) \ + { \ + case 0: \ + count = sprintf (tmp, buf, arg); \ + break; \ + case 1: \ + count = sprintf (tmp, buf, prefixes[0], arg); \ + break; \ + case 2: \ + count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ + arg); \ + break; \ + default: \ + abort (); \ + } +#endif + + switch (type) + { + case TYPE_SCHAR: + { + int arg = a.arg[dp->arg_index].a.a_schar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UCHAR: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uchar; + SNPRINTF_BUF (arg); + } + break; + case TYPE_SHORT: + { + int arg = a.arg[dp->arg_index].a.a_short; + SNPRINTF_BUF (arg); + } + break; + case TYPE_USHORT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_ushort; + SNPRINTF_BUF (arg); + } + break; + case TYPE_INT: + { + int arg = a.arg[dp->arg_index].a.a_int; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UINT: + { + unsigned int arg = a.arg[dp->arg_index].a.a_uint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_LONGINT: + { + long int arg = a.arg[dp->arg_index].a.a_longint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGINT: + { + unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_INT64_AND_I64 + case TYPE_INT64: + { + __int64 arg = a.arg[dp->arg_index].a.a_int64; + SNPRINTF_BUF (arg); + } + break; + case TYPE_UINT64: + { + unsigned __int64 arg = a.arg[dp->arg_index].a.a_uint64; + SNPRINTF_BUF (arg); + } + break; +#endif +#ifdef HAVE_LONG_LONG +#ifndef HAVE_LONG_LONG_FORMAT + case TYPE_LONGLONGINT: + case TYPE_ULONGLONGINT: + { + unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; + int width; + int precision; + + width = 0; + if (dp->width_start != dp->width_end) + { + if (dp->width_arg_index >= 0) + { + int arg; + + if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->width_arg_index].a.a_int; + width = (arg < 0 ? -arg : arg); + } + else + { + const char *digitp = dp->width_start; + + do + width = width * 10 + (*digitp++ - '0'); + while (digitp != dp->width_end); + } + } + + precision = -1; + if (dp->precision_start != dp->precision_end) + { + if (dp->precision_arg_index >= 0) + { + int arg; + + if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) + abort (); + arg = a.arg[dp->precision_arg_index].a.a_int; + precision = (arg < 0 ? 0 : arg); + } + else + { + const char *digitp = dp->precision_start + 1; + + precision = 0; + do + precision = precision * 10 + (*digitp++ - '0'); + while (digitp != dp->precision_end); + } + } + +#if HAVE_SNPRINTF + count = print_long_long (result + length, maxlen, + width, precision, + dp->flags, + dp->conversion, + arg); +#else + count = print_long_long (tmp, tmp_length, + width, precision, + dp->flags, + dp->conversion, + arg); +#endif + } + break; +#else + case TYPE_LONGLONGINT: + { + long long int arg = a.arg[dp->arg_index].a.a_longlongint; + SNPRINTF_BUF (arg); + } + break; + case TYPE_ULONGLONGINT: + { + unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; + SNPRINTF_BUF (arg); + } + break; +#endif +#endif + case TYPE_DOUBLE: + { + double arg = a.arg[dp->arg_index].a.a_double; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_LONG_DOUBLE + case TYPE_LONGDOUBLE: + { + long double arg = a.arg[dp->arg_index].a.a_longdouble; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_CHAR: + { + int arg = a.arg[dp->arg_index].a.a_char; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_WINT_T + case TYPE_WIDE_CHAR: + { + wint_t arg = a.arg[dp->arg_index].a.a_wide_char; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_STRING: + { + const char *arg = a.arg[dp->arg_index].a.a_string == NULL + ? "(null)" + : a.arg[dp->arg_index].a.a_string; + SNPRINTF_BUF (arg); + } + break; +#ifdef HAVE_WCHAR_T + case TYPE_WIDE_STRING: + { + const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string == NULL + ? L"(null)" + : a.arg[dp->arg_index].a.a_wide_string; + SNPRINTF_BUF (arg); + } + break; +#endif + case TYPE_POINTER: + { + void *arg = a.arg[dp->arg_index].a.a_pointer; + SNPRINTF_BUF (arg); + } + break; + default: + abort (); + } + +#if HAVE_SNPRINTF + /* Portability: Not all implementations of snprintf() + are ISO C 99 compliant. Determine the number of + bytes that snprintf() has produced or would have + produced. */ + if (count >= 0) + { + /* Verify that snprintf() has NUL-terminated its + result. */ + if (count < maxlen && result[length + count] != '\0') + abort (); + /* Portability hack. */ + if (retcount > count) + count = retcount; + } + else + { + /* snprintf() doesn't understand the '%n' + directive. */ + if (p[1] != '\0') + { + /* Don't use the '%n' directive; instead, look + at the snprintf() return value. */ + p[1] = '\0'; + continue; + } + count = retcount; + } +#endif + + /* Attempt to handle failure. */ + if (count < 0) + { + if (!(result == resultbuf || result == NULL)) + free (result); + freea (buf); + CLEANUP (); + errno = EINVAL; + return NULL; + } + +#if !HAVE_SNPRINTF + if (count >= tmp_length) + /* tmp_length was incorrectly calculated - fix the + code above! */ + abort (); +#endif + + /* Make room for the result. */ + if (count >= maxlen) + { + /* Need at least count bytes. But allocate + proportionally, to avoid looping eternally if + snprintf() reports a too small count. */ + size_t n = length + count; + + if (n < 2 * allocated) + n = 2 * allocated; + + ENSURE_ALLOCATION (n); +#if HAVE_SNPRINTF + continue; +#endif + } + +#if HAVE_SNPRINTF + /* The snprintf() result did fit. */ +#else + /* Append the sprintf() result. */ + memcpy (result + length, tmp, count); + if (tmp != tmpbuf) + free (tmp); +#endif + + length += count; + break; + } + } + } + } + + /* Add the final NUL. */ + ENSURE_ALLOCATION (length + 1); + result[length] = '\0'; + + if (result != resultbuf && length + 1 < allocated) + { + /* Shrink the allocated memory if possible. */ + char *memory; + + memory = (char *) realloc (result, length + 1); + if (memory != NULL) + result = memory; + } + + freea (buf); + CLEANUP (); + *lengthp = length; + return result; + } +} diff --git a/glib/gnulib/vasnprintf.h b/glib/gnulib/vasnprintf.h new file mode 100644 index 0000000..65f1bc1 --- /dev/null +++ b/glib/gnulib/vasnprintf.h @@ -0,0 +1,61 @@ +/* vsprintf with automatic memory allocation. + Copyright (C) 2002-2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +#ifndef _VASNPRINTF_H +#define _VASNPRINTF_H + +/* Get va_list. */ +#include + +/* Get size_t. */ +#include + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Write formatted output to a string dynamically allocated with malloc(). + You can pass a preallocated buffer for the result in RESULTBUF and its + size in *LENGTHP; otherwise you pass RESULTBUF = NULL. + If successful, return the address of the string (this may be = RESULTBUF + if no dynamic memory allocation was necessary) and set *LENGTHP to the + number of resulting bytes, excluding the trailing NUL. Upon error, set + errno and return NULL. */ +extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) + __attribute__ ((__format__ (__printf__, 3, 0))); + +#ifdef __cplusplus +} +#endif + +#endif /* _VASNPRINTF_H */ diff --git a/glib/goption.c b/glib/goption.c new file mode 100644 index 0000000..9747d47 --- /dev/null +++ b/glib/goption.c @@ -0,0 +1,2386 @@ +/* goption.c - Option parser + * + * Copyright (C) 1999, 2003 Red Hat Software + * Copyright (C) 2004 Anders Carlsson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/** + * SECTION:option + * @Short_description: parses commandline options + * @Title: Commandline option parser + * + * The GOption commandline parser is intended to be a simpler replacement for the + * popt library. It supports short and long commandline options, as shown in the + * following example: + * + * testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2 + * + * The example demonstrates a number of features of the GOption commandline parser + * + * Options can be single letters, prefixed by a single dash. Multiple + * short options can be grouped behind a single dash. + * + * Long options are prefixed by two consecutive dashes. + * + * Options can have an extra argument, which can be a number, a string or a + * filename. For long options, the extra argument can be appended with an + * equals sign after the option name. + * + * Non-option arguments are returned to the application as rest arguments. + * + * An argument consisting solely of two dashes turns off further parsing, + * any remaining arguments (even those starting with a dash) are returned + * to the application as rest arguments. + * + * + * Another important feature of GOption is that it can automatically generate + * nicely formatted help output. Unless it is explicitly turned off with + * g_option_context_set_help_enabled(), GOption will recognize the + * , , + * and groupname options + * (where groupname is the name of a #GOptionGroup) + * and write a text similar to the one shown in the following example to stdout. + * + * + * Usage: + * testtreemodel [OPTION...] - test tree model performance + * + * Help Options: + * -h, --help Show help options + * --help-all Show all help options + * --help-gtk Show GTK+ Options + * + * Application Options: + * -r, --repeats=N Average over N repetitions + * -m, --max-size=M Test up to 2^M items + * --display=DISPLAY X display to use + * -v, --verbose Be verbose + * -b, --beep Beep when done + * --rand Randomize the data + * + * + * GOption groups options in #GOptionGroups, which makes it easy to + * incorporate options from multiple sources. The intended use for this is + * to let applications collect option groups from the libraries it uses, + * add them to their #GOptionContext, and parse all options by a single call + * to g_option_context_parse(). See gtk_get_option_group() for an example. + * + * If an option is declared to be of type string or filename, GOption takes + * care of converting it to the right encoding; strings are returned in UTF-8, + * filenames are returned in the GLib filename encoding. Note that this only + * works if setlocale() has been called before g_option_context_parse(). + * + * Here is a complete example of setting up GOption to parse the example + * commandline above and produce the example help output. + * + * + * static gint repeats = 2; + * static gint max_size = 8; + * static gboolean verbose = FALSE; + * static gboolean beep = FALSE; + * static gboolean rand = FALSE; + * + * static GOptionEntry entries[] = + * { + * { "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" }, + * { "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" }, + * { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL }, + * { "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Beep when done", NULL }, + * { "rand", 0, 0, G_OPTION_ARG_NONE, &rand, "Randomize the data", NULL }, + * { NULL } + * }; + * + * int + * main (int argc, char *argv[]) + * { + * GError *error = NULL; + * GOptionContext *context; + * + * context = g_option_context_new ("- test tree model performance"); + * g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + * g_option_context_add_group (context, gtk_get_option_group (TRUE)); + * if (!g_option_context_parse (context, &argc, &argv, &error)) + * { + * g_print ("option parsing failed: %s\n", error->message); + * exit (1); + * } + * + * // ... + * + * } + * + */ + +#include "config.h" + +#include "goption.h" +#include "glib.h" +#include "glibintl.h" +#include "gprintf.h" + +#include "galias.h" + +#include +#include +#include +#include + +#define TRANSLATE(group, str) (((group)->translate_func ? (* (group)->translate_func) ((str), (group)->translate_data) : (str))) + +#define NO_ARG(entry) ((entry)->arg == G_OPTION_ARG_NONE || \ + ((entry)->arg == G_OPTION_ARG_CALLBACK && \ + ((entry)->flags & G_OPTION_FLAG_NO_ARG))) + +#define OPTIONAL_ARG(entry) ((entry)->arg == G_OPTION_ARG_CALLBACK && \ + (entry)->flags & G_OPTION_FLAG_OPTIONAL_ARG) + +typedef struct +{ + GOptionArg arg_type; + gpointer arg_data; + union + { + gboolean bool; + gint integer; + gchar *str; + gchar **array; + gdouble dbl; + gint64 int64; + } prev; + union + { + gchar *str; + struct + { + gint len; + gchar **data; + } array; + } allocated; +} Change; + +typedef struct +{ + gchar **ptr; + gchar *value; +} PendingNull; + +struct _GOptionContext +{ + GList *groups; + + gchar *parameter_string; + gchar *summary; + gchar *description; + + GTranslateFunc translate_func; + GDestroyNotify translate_notify; + gpointer translate_data; + + guint help_enabled : 1; + guint ignore_unknown : 1; + + GOptionGroup *main_group; + + /* We keep a list of change so we can revert them */ + GList *changes; + + /* We also keep track of all argv elements + * that should be NULLed or modified. + */ + GList *pending_nulls; +}; + +struct _GOptionGroup +{ + gchar *name; + gchar *description; + gchar *help_description; + + GDestroyNotify destroy_notify; + gpointer user_data; + + GTranslateFunc translate_func; + GDestroyNotify translate_notify; + gpointer translate_data; + + GOptionEntry *entries; + gint n_entries; + + GOptionParseFunc pre_parse_func; + GOptionParseFunc post_parse_func; + GOptionErrorFunc error_func; +}; + +static void free_changes_list (GOptionContext *context, + gboolean revert); +static void free_pending_nulls (GOptionContext *context, + gboolean perform_nulls); + + +static int +_g_unichar_get_width (gunichar c) +{ + if (G_UNLIKELY (g_unichar_iszerowidth (c))) + return 0; + + /* we ignore the fact that we should call g_unichar_iswide_cjk() under + * some locales (legacy East Asian ones) */ + if (g_unichar_iswide (c)) + return 2; + + return 1; +} + +static glong +_g_utf8_strwidth (const gchar *p, + gssize max) +{ + glong len = 0; + const gchar *start = p; + g_return_val_if_fail (p != NULL || max == 0, 0); + + if (max < 0) + { + while (*p) + { + len += _g_unichar_get_width (g_utf8_get_char (p)); + p = g_utf8_next_char (p); + } + } + else + { + if (max == 0 || !*p) + return 0; + + /* this case may not be quite correct */ + + len += _g_unichar_get_width (g_utf8_get_char (p)); + p = g_utf8_next_char (p); + + while (p - start < max && *p) + { + len += _g_unichar_get_width (g_utf8_get_char (p)); + p = g_utf8_next_char (p); + } + } + + return len; +} + + +GQuark +g_option_error_quark (void) +{ + return g_quark_from_static_string ("g-option-context-error-quark"); +} + +/** + * g_option_context_new: + * @parameter_string: a string which is displayed in + * the first line of output, after the + * usage summary + * programname [OPTION...] + * + * Creates a new option context. + * + * The @parameter_string can serve multiple purposes. It can be used + * to add descriptions for "rest" arguments, which are not parsed by + * the #GOptionContext, typically something like "FILES" or + * "FILE1 FILE2...". If you are using #G_OPTION_REMAINING for + * collecting "rest" arguments, GLib handles this automatically by + * using the @arg_description of the corresponding #GOptionEntry in + * the usage summary. + * + * Another usage is to give a short summary of the program + * functionality, like " - frob the strings", which will be displayed + * in the same line as the usage. For a longer description of the + * program functionality that should be displayed as a paragraph + * below the usage line, use g_option_context_set_summary(). + * + * Note that the @parameter_string is translated using the + * function set with g_option_context_set_translate_func(), so + * it should normally be passed untranslated. + * + * Returns: a newly created #GOptionContext, which must be + * freed with g_option_context_free() after use. + * + * Since: 2.6 + */ +GOptionContext * +g_option_context_new (const gchar *parameter_string) + +{ + GOptionContext *context; + + context = g_new0 (GOptionContext, 1); + + context->parameter_string = g_strdup (parameter_string); + context->help_enabled = TRUE; + context->ignore_unknown = FALSE; + + return context; +} + +/** + * g_option_context_free: + * @context: a #GOptionContext + * + * Frees context and all the groups which have been + * added to it. + * + * Please note that parsed arguments need to be freed separately (see + * #GOptionEntry). + * + * Since: 2.6 + */ +void g_option_context_free (GOptionContext *context) +{ + g_return_if_fail (context != NULL); + + g_list_foreach (context->groups, (GFunc)g_option_group_free, NULL); + g_list_free (context->groups); + + if (context->main_group) + g_option_group_free (context->main_group); + + free_changes_list (context, FALSE); + free_pending_nulls (context, FALSE); + + g_free (context->parameter_string); + g_free (context->summary); + g_free (context->description); + + if (context->translate_notify) + (* context->translate_notify) (context->translate_data); + + g_free (context); +} + + +/** + * g_option_context_set_help_enabled: + * @context: a #GOptionContext + * @help_enabled: %TRUE to enable , %FALSE to disable it + * + * Enables or disables automatic generation of + * output. By default, g_option_context_parse() recognizes + * , , + * , + * and groupname and creates + * suitable output to stdout. + * + * Since: 2.6 + */ +void g_option_context_set_help_enabled (GOptionContext *context, + gboolean help_enabled) + +{ + g_return_if_fail (context != NULL); + + context->help_enabled = help_enabled; +} + +/** + * g_option_context_get_help_enabled: + * @context: a #GOptionContext + * + * Returns whether automatic generation + * is turned on for @context. See g_option_context_set_help_enabled(). + * + * Returns: %TRUE if automatic help generation is turned on. + * + * Since: 2.6 + */ +gboolean +g_option_context_get_help_enabled (GOptionContext *context) +{ + g_return_val_if_fail (context != NULL, FALSE); + + return context->help_enabled; +} + +/** + * g_option_context_set_ignore_unknown_options: + * @context: a #GOptionContext + * @ignore_unknown: %TRUE to ignore unknown options, %FALSE to produce + * an error when unknown options are met + * + * Sets whether to ignore unknown options or not. If an argument is + * ignored, it is left in the @argv array after parsing. By default, + * g_option_context_parse() treats unknown options as error. + * + * This setting does not affect non-option arguments (i.e. arguments + * which don't start with a dash). But note that GOption cannot reliably + * determine whether a non-option belongs to a preceding unknown option. + * + * Since: 2.6 + **/ +void +g_option_context_set_ignore_unknown_options (GOptionContext *context, + gboolean ignore_unknown) +{ + g_return_if_fail (context != NULL); + + context->ignore_unknown = ignore_unknown; +} + +/** + * g_option_context_get_ignore_unknown_options: + * @context: a #GOptionContext + * + * Returns whether unknown options are ignored or not. See + * g_option_context_set_ignore_unknown_options(). + * + * Returns: %TRUE if unknown options are ignored. + * + * Since: 2.6 + **/ +gboolean +g_option_context_get_ignore_unknown_options (GOptionContext *context) +{ + g_return_val_if_fail (context != NULL, FALSE); + + return context->ignore_unknown; +} + +/** + * g_option_context_add_group: + * @context: a #GOptionContext + * @group: the group to add + * + * Adds a #GOptionGroup to the @context, so that parsing with @context + * will recognize the options in the group. Note that the group will + * be freed together with the context when g_option_context_free() is + * called, so you must not free the group yourself after adding it + * to a context. + * + * Since: 2.6 + **/ +void +g_option_context_add_group (GOptionContext *context, + GOptionGroup *group) +{ + GList *list; + + g_return_if_fail (context != NULL); + g_return_if_fail (group != NULL); + g_return_if_fail (group->name != NULL); + g_return_if_fail (group->description != NULL); + g_return_if_fail (group->help_description != NULL); + + for (list = context->groups; list; list = list->next) + { + GOptionGroup *g = (GOptionGroup *)list->data; + + if ((group->name == NULL && g->name == NULL) || + (group->name && g->name && strcmp (group->name, g->name) == 0)) + g_warning ("A group named \"%s\" is already part of this GOptionContext", + group->name); + } + + context->groups = g_list_append (context->groups, group); +} + +/** + * g_option_context_set_main_group: + * @context: a #GOptionContext + * @group: the group to set as main group + * + * Sets a #GOptionGroup as main group of the @context. + * This has the same effect as calling g_option_context_add_group(), + * the only difference is that the options in the main group are + * treated differently when generating output. + * + * Since: 2.6 + **/ +void +g_option_context_set_main_group (GOptionContext *context, + GOptionGroup *group) +{ + g_return_if_fail (context != NULL); + g_return_if_fail (group != NULL); + + if (context->main_group) + { + g_warning ("This GOptionContext already has a main group"); + + return; + } + + context->main_group = group; +} + +/** + * g_option_context_get_main_group: + * @context: a #GOptionContext + * + * Returns a pointer to the main group of @context. + * + * Return value: the main group of @context, or %NULL if @context doesn't + * have a main group. Note that group belongs to @context and should + * not be modified or freed. + * + * Since: 2.6 + **/ +GOptionGroup * +g_option_context_get_main_group (GOptionContext *context) +{ + g_return_val_if_fail (context != NULL, NULL); + + return context->main_group; +} + +/** + * g_option_context_add_main_entries: + * @context: a #GOptionContext + * @entries: a %NULL-terminated array of #GOptionEntrys + * @translation_domain: a translation domain to use for translating + * the output for the options in @entries + * with gettext(), or %NULL + * + * A convenience function which creates a main group if it doesn't + * exist, adds the @entries to it and sets the translation domain. + * + * Since: 2.6 + **/ +void +g_option_context_add_main_entries (GOptionContext *context, + const GOptionEntry *entries, + const gchar *translation_domain) +{ + g_return_if_fail (entries != NULL); + + if (!context->main_group) + context->main_group = g_option_group_new (NULL, NULL, NULL, NULL, NULL); + + g_option_group_add_entries (context->main_group, entries); + g_option_group_set_translation_domain (context->main_group, translation_domain); +} + +static gint +calculate_max_length (GOptionGroup *group) +{ + GOptionEntry *entry; + gint i, len, max_length; + + max_length = 0; + + for (i = 0; i < group->n_entries; i++) + { + entry = &group->entries[i]; + + if (entry->flags & G_OPTION_FLAG_HIDDEN) + continue; + + len = _g_utf8_strwidth (entry->long_name, -1); + + if (entry->short_name) + len += 4; + + if (!NO_ARG (entry) && entry->arg_description) + len += 1 + _g_utf8_strwidth (TRANSLATE (group, entry->arg_description), -1); + + max_length = MAX (max_length, len); + } + + return max_length; +} + +static void +print_entry (GOptionGroup *group, + gint max_length, + const GOptionEntry *entry, + GString *string) +{ + GString *str; + + if (entry->flags & G_OPTION_FLAG_HIDDEN) + return; + + if (entry->long_name[0] == 0) + return; + + str = g_string_new (NULL); + + if (entry->short_name) + g_string_append_printf (str, " -%c, --%s", entry->short_name, entry->long_name); + else + g_string_append_printf (str, " --%s", entry->long_name); + + if (entry->arg_description) + g_string_append_printf (str, "=%s", TRANSLATE (group, entry->arg_description)); + + g_string_append_printf (string, "%s%*s %s\n", str->str, + (int) (max_length + 4 - _g_utf8_strwidth (str->str, -1)), "", + entry->description ? TRANSLATE (group, entry->description) : ""); + g_string_free (str, TRUE); +} + +static gboolean +group_has_visible_entries (GOptionContext *context, + GOptionGroup *group, + gboolean main_entries) +{ + GOptionFlags reject_filter = G_OPTION_FLAG_HIDDEN; + GOptionEntry *entry; + gint i, l; + gboolean main_group = group == context->main_group; + + if (!main_entries) + reject_filter |= G_OPTION_FLAG_IN_MAIN; + + for (i = 0, l = (group ? group->n_entries : 0); i < l; i++) + { + entry = &group->entries[i]; + + if (main_entries && !main_group && !(entry->flags & G_OPTION_FLAG_IN_MAIN)) + continue; + if (!(entry->flags & reject_filter)) + return TRUE; + } + + return FALSE; +} + +static gboolean +group_list_has_visible_entires (GOptionContext *context, + GList *group_list, + gboolean main_entries) +{ + while (group_list) + { + if (group_has_visible_entries (context, group_list->data, main_entries)) + return TRUE; + + group_list = group_list->next; + } + + return FALSE; +} + +static gboolean +context_has_h_entry (GOptionContext *context) +{ + gsize i; + GList *list; + + if (context->main_group) + { + for (i = 0; i < context->main_group->n_entries; i++) + { + if (context->main_group->entries[i].short_name == 'h') + return TRUE; + } + } + + for (list = context->groups; list != NULL; list = g_list_next (list)) + { + GOptionGroup *group; + + group = (GOptionGroup*)list->data; + for (i = 0; i < group->n_entries; i++) + { + if (group->entries[i].short_name == 'h') + return TRUE; + } + } + return FALSE; +} + +/** + * g_option_context_get_help: + * @context: a #GOptionContext + * @main_help: if %TRUE, only include the main group + * @group: the #GOptionGroup to create help for, or %NULL + * + * Returns a formatted, translated help text for the given context. + * To obtain the text produced by , call + * g_option_context_get_help (context, TRUE, NULL). + * To obtain the text produced by , call + * g_option_context_get_help (context, FALSE, NULL). + * To obtain the help text for an option group, call + * g_option_context_get_help (context, FALSE, group). + * + * Returns: A newly allocated string containing the help text + * + * Since: 2.14 + */ +gchar * +g_option_context_get_help (GOptionContext *context, + gboolean main_help, + GOptionGroup *group) +{ + GList *list; + gint max_length, len; + gint i; + GOptionEntry *entry; + GHashTable *shadow_map; + gboolean seen[256]; + const gchar *rest_description; + GString *string; + guchar token; + + string = g_string_sized_new (1024); + + rest_description = NULL; + if (context->main_group) + { + + for (i = 0; i < context->main_group->n_entries; i++) + { + entry = &context->main_group->entries[i]; + if (entry->long_name[0] == 0) + { + rest_description = TRANSLATE (context->main_group, entry->arg_description); + break; + } + } + } + + g_string_append_printf (string, "%s\n %s %s", + _("Usage:"), g_get_prgname(), _("[OPTION...]")); + + if (rest_description) + { + g_string_append (string, " "); + g_string_append (string, rest_description); + } + + if (context->parameter_string) + { + g_string_append (string, " "); + g_string_append (string, TRANSLATE (context, context->parameter_string)); + } + + g_string_append (string, "\n\n"); + + if (context->summary) + { + g_string_append (string, TRANSLATE (context, context->summary)); + g_string_append (string, "\n\n"); + } + + memset (seen, 0, sizeof (gboolean) * 256); + shadow_map = g_hash_table_new (g_str_hash, g_str_equal); + + if (context->main_group) + { + for (i = 0; i < context->main_group->n_entries; i++) + { + entry = &context->main_group->entries[i]; + g_hash_table_insert (shadow_map, + (gpointer)entry->long_name, + entry); + + if (seen[(guchar)entry->short_name]) + entry->short_name = 0; + else + seen[(guchar)entry->short_name] = TRUE; + } + } + + list = context->groups; + while (list != NULL) + { + GOptionGroup *g = list->data; + for (i = 0; i < g->n_entries; i++) + { + entry = &g->entries[i]; + if (g_hash_table_lookup (shadow_map, entry->long_name) && + !(entry->flags & G_OPTION_FLAG_NOALIAS)) + entry->long_name = g_strdup_printf ("%s-%s", g->name, entry->long_name); + else + g_hash_table_insert (shadow_map, (gpointer)entry->long_name, entry); + + if (seen[(guchar)entry->short_name] && + !(entry->flags & G_OPTION_FLAG_NOALIAS)) + entry->short_name = 0; + else + seen[(guchar)entry->short_name] = TRUE; + } + list = list->next; + } + + g_hash_table_destroy (shadow_map); + + list = context->groups; + + max_length = _g_utf8_strwidth ("-?, --help", -1); + + if (list) + { + len = _g_utf8_strwidth ("--help-all", -1); + max_length = MAX (max_length, len); + } + + if (context->main_group) + { + len = calculate_max_length (context->main_group); + max_length = MAX (max_length, len); + } + + while (list != NULL) + { + GOptionGroup *g = list->data; + + /* First, we check the --help- options */ + len = _g_utf8_strwidth ("--help-", -1) + _g_utf8_strwidth (g->name, -1); + max_length = MAX (max_length, len); + + /* Then we go through the entries */ + len = calculate_max_length (g); + max_length = MAX (max_length, len); + + list = list->next; + } + + /* Add a bit of padding */ + max_length += 4; + + if (!group) + { + list = context->groups; + + token = context_has_h_entry (context) ? '?' : 'h'; + + g_string_append_printf (string, "%s\n -%c, --%-*s %s\n", + _("Help Options:"), token, max_length - 4, "help", + _("Show help options")); + + /* We only want --help-all when there are groups */ + if (list) + g_string_append_printf (string, " --%-*s %s\n", + max_length, "help-all", + _("Show all help options")); + + while (list) + { + GOptionGroup *g = list->data; + + if (group_has_visible_entries (context, g, FALSE)) + g_string_append_printf (string, " --help-%-*s %s\n", + max_length - 5, g->name, + TRANSLATE (g, g->help_description)); + + list = list->next; + } + + g_string_append (string, "\n"); + } + + if (group) + { + /* Print a certain group */ + + if (group_has_visible_entries (context, group, FALSE)) + { + g_string_append (string, TRANSLATE (group, group->description)); + g_string_append (string, "\n"); + for (i = 0; i < group->n_entries; i++) + print_entry (group, max_length, &group->entries[i], string); + g_string_append (string, "\n"); + } + } + else if (!main_help) + { + /* Print all groups */ + + list = context->groups; + + while (list) + { + GOptionGroup *g = list->data; + + if (group_has_visible_entries (context, g, FALSE)) + { + g_string_append (string, g->description); + g_string_append (string, "\n"); + for (i = 0; i < g->n_entries; i++) + if (!(g->entries[i].flags & G_OPTION_FLAG_IN_MAIN)) + print_entry (g, max_length, &g->entries[i], string); + + g_string_append (string, "\n"); + } + + list = list->next; + } + } + + /* Print application options if --help or --help-all has been specified */ + if ((main_help || !group) && + (group_has_visible_entries (context, context->main_group, TRUE) || + group_list_has_visible_entires (context, context->groups, TRUE))) + { + list = context->groups; + + g_string_append (string, _("Application Options:")); + g_string_append (string, "\n"); + if (context->main_group) + for (i = 0; i < context->main_group->n_entries; i++) + print_entry (context->main_group, max_length, + &context->main_group->entries[i], string); + + while (list != NULL) + { + GOptionGroup *g = list->data; + + /* Print main entries from other groups */ + for (i = 0; i < g->n_entries; i++) + if (g->entries[i].flags & G_OPTION_FLAG_IN_MAIN) + print_entry (g, max_length, &g->entries[i], string); + + list = list->next; + } + + g_string_append (string, "\n"); + } + + if (context->description) + { + g_string_append (string, TRANSLATE (context, context->description)); + g_string_append (string, "\n"); + } + + return g_string_free (string, FALSE); +} + +G_GNUC_NORETURN +static void +print_help (GOptionContext *context, + gboolean main_help, + GOptionGroup *group) +{ + gchar *help; + + help = g_option_context_get_help (context, main_help, group); + g_print ("%s", help); + g_free (help); + + exit (0); +} + +static gboolean +parse_int (const gchar *arg_name, + const gchar *arg, + gint *result, + GError **error) +{ + gchar *end; + glong tmp; + + errno = 0; + tmp = strtol (arg, &end, 0); + + if (*arg == '\0' || *end != '\0') + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Cannot parse integer value '%s' for %s"), + arg, arg_name); + return FALSE; + } + + *result = tmp; + if (*result != tmp || errno == ERANGE) + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Integer value '%s' for %s out of range"), + arg, arg_name); + return FALSE; + } + + return TRUE; +} + + +static gboolean +parse_double (const gchar *arg_name, + const gchar *arg, + gdouble *result, + GError **error) +{ + gchar *end; + gdouble tmp; + + errno = 0; + tmp = g_strtod (arg, &end); + + if (*arg == '\0' || *end != '\0') + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Cannot parse double value '%s' for %s"), + arg, arg_name); + return FALSE; + } + if (errno == ERANGE) + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Double value '%s' for %s out of range"), + arg, arg_name); + return FALSE; + } + + *result = tmp; + + return TRUE; +} + + +static gboolean +parse_int64 (const gchar *arg_name, + const gchar *arg, + gint64 *result, + GError **error) +{ + gchar *end; + gint64 tmp; + + errno = 0; + tmp = g_ascii_strtoll (arg, &end, 0); + + if (*arg == '\0' || *end != '\0') + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Cannot parse integer value '%s' for %s"), + arg, arg_name); + return FALSE; + } + if (errno == ERANGE) + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Integer value '%s' for %s out of range"), + arg, arg_name); + return FALSE; + } + + *result = tmp; + + return TRUE; +} + + +static Change * +get_change (GOptionContext *context, + GOptionArg arg_type, + gpointer arg_data) +{ + GList *list; + Change *change = NULL; + + for (list = context->changes; list != NULL; list = list->next) + { + change = list->data; + + if (change->arg_data == arg_data) + goto found; + } + + change = g_new0 (Change, 1); + change->arg_type = arg_type; + change->arg_data = arg_data; + + context->changes = g_list_prepend (context->changes, change); + + found: + + return change; +} + +static void +add_pending_null (GOptionContext *context, + gchar **ptr, + gchar *value) +{ + PendingNull *n; + + n = g_new0 (PendingNull, 1); + n->ptr = ptr; + n->value = value; + + context->pending_nulls = g_list_prepend (context->pending_nulls, n); +} + +static gboolean +parse_arg (GOptionContext *context, + GOptionGroup *group, + GOptionEntry *entry, + const gchar *value, + const gchar *option_name, + GError **error) + +{ + Change *change; + + g_assert (value || OPTIONAL_ARG (entry) || NO_ARG (entry)); + + switch (entry->arg) + { + case G_OPTION_ARG_NONE: + { + change = get_change (context, G_OPTION_ARG_NONE, + entry->arg_data); + + *(gboolean *)entry->arg_data = !(entry->flags & G_OPTION_FLAG_REVERSE); + break; + } + case G_OPTION_ARG_STRING: + { + gchar *data; + + data = g_locale_to_utf8 (value, -1, NULL, NULL, error); + + if (!data) + return FALSE; + + change = get_change (context, G_OPTION_ARG_STRING, + entry->arg_data); + g_free (change->allocated.str); + + change->prev.str = *(gchar **)entry->arg_data; + change->allocated.str = data; + + *(gchar **)entry->arg_data = data; + break; + } + case G_OPTION_ARG_STRING_ARRAY: + { + gchar *data; + + data = g_locale_to_utf8 (value, -1, NULL, NULL, error); + + if (!data) + return FALSE; + + change = get_change (context, G_OPTION_ARG_STRING_ARRAY, + entry->arg_data); + + if (change->allocated.array.len == 0) + { + change->prev.array = *(gchar ***)entry->arg_data; + change->allocated.array.data = g_new (gchar *, 2); + } + else + change->allocated.array.data = + g_renew (gchar *, change->allocated.array.data, + change->allocated.array.len + 2); + + change->allocated.array.data[change->allocated.array.len] = data; + change->allocated.array.data[change->allocated.array.len + 1] = NULL; + + change->allocated.array.len ++; + + *(gchar ***)entry->arg_data = change->allocated.array.data; + + break; + } + + case G_OPTION_ARG_FILENAME: + { + gchar *data; + +#ifdef G_OS_WIN32 + data = g_locale_to_utf8 (value, -1, NULL, NULL, error); + + if (!data) + return FALSE; +#else + data = g_strdup (value); +#endif + change = get_change (context, G_OPTION_ARG_FILENAME, + entry->arg_data); + g_free (change->allocated.str); + + change->prev.str = *(gchar **)entry->arg_data; + change->allocated.str = data; + + *(gchar **)entry->arg_data = data; + break; + } + + case G_OPTION_ARG_FILENAME_ARRAY: + { + gchar *data; + +#ifdef G_OS_WIN32 + data = g_locale_to_utf8 (value, -1, NULL, NULL, error); + + if (!data) + return FALSE; +#else + data = g_strdup (value); +#endif + change = get_change (context, G_OPTION_ARG_STRING_ARRAY, + entry->arg_data); + + if (change->allocated.array.len == 0) + { + change->prev.array = *(gchar ***)entry->arg_data; + change->allocated.array.data = g_new (gchar *, 2); + } + else + change->allocated.array.data = + g_renew (gchar *, change->allocated.array.data, + change->allocated.array.len + 2); + + change->allocated.array.data[change->allocated.array.len] = data; + change->allocated.array.data[change->allocated.array.len + 1] = NULL; + + change->allocated.array.len ++; + + *(gchar ***)entry->arg_data = change->allocated.array.data; + + break; + } + + case G_OPTION_ARG_INT: + { + gint data; + + if (!parse_int (option_name, value, + &data, + error)) + return FALSE; + + change = get_change (context, G_OPTION_ARG_INT, + entry->arg_data); + change->prev.integer = *(gint *)entry->arg_data; + *(gint *)entry->arg_data = data; + break; + } + case G_OPTION_ARG_CALLBACK: + { + gchar *data; + gboolean retval; + + if (!value && entry->flags & G_OPTION_FLAG_OPTIONAL_ARG) + data = NULL; + else if (entry->flags & G_OPTION_FLAG_NO_ARG) + data = NULL; + else if (entry->flags & G_OPTION_FLAG_FILENAME) + { +#ifdef G_OS_WIN32 + data = g_locale_to_utf8 (value, -1, NULL, NULL, error); +#else + data = g_strdup (value); +#endif + } + else + data = g_locale_to_utf8 (value, -1, NULL, NULL, error); + + if (!(entry->flags & (G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG)) && + !data) + return FALSE; + + retval = (* (GOptionArgFunc) entry->arg_data) (option_name, data, group->user_data, error); + + if (!retval && error != NULL && *error == NULL) + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_FAILED, + _("Error parsing option %s"), option_name); + + g_free (data); + + return retval; + + break; + } + case G_OPTION_ARG_DOUBLE: + { + gdouble data; + + if (!parse_double (option_name, value, + &data, + error)) + { + return FALSE; + } + + change = get_change (context, G_OPTION_ARG_DOUBLE, + entry->arg_data); + change->prev.dbl = *(gdouble *)entry->arg_data; + *(gdouble *)entry->arg_data = data; + break; + } + case G_OPTION_ARG_INT64: + { + gint64 data; + + if (!parse_int64 (option_name, value, + &data, + error)) + { + return FALSE; + } + + change = get_change (context, G_OPTION_ARG_INT64, + entry->arg_data); + change->prev.int64 = *(gint64 *)entry->arg_data; + *(gint64 *)entry->arg_data = data; + break; + } + default: + g_assert_not_reached (); + } + + return TRUE; +} + +static gboolean +parse_short_option (GOptionContext *context, + GOptionGroup *group, + gint idx, + gint *new_idx, + gchar arg, + gint *argc, + gchar ***argv, + GError **error, + gboolean *parsed) +{ + gint j; + + for (j = 0; j < group->n_entries; j++) + { + if (arg == group->entries[j].short_name) + { + gchar *option_name; + gchar *value = NULL; + + option_name = g_strdup_printf ("-%c", group->entries[j].short_name); + + if (NO_ARG (&group->entries[j])) + value = NULL; + else + { + if (*new_idx > idx) + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_FAILED, + _("Error parsing option %s"), option_name); + g_free (option_name); + return FALSE; + } + + if (idx < *argc - 1) + { + if (!OPTIONAL_ARG (&group->entries[j])) + { + value = (*argv)[idx + 1]; + add_pending_null (context, &((*argv)[idx + 1]), NULL); + *new_idx = idx + 1; + } + else + { + if ((*argv)[idx + 1][0] == '-') + value = NULL; + else + { + value = (*argv)[idx + 1]; + add_pending_null (context, &((*argv)[idx + 1]), NULL); + *new_idx = idx + 1; + } + } + } + else if (idx >= *argc - 1 && OPTIONAL_ARG (&group->entries[j])) + value = NULL; + else + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Missing argument for %s"), option_name); + g_free (option_name); + return FALSE; + } + } + + if (!parse_arg (context, group, &group->entries[j], + value, option_name, error)) + { + g_free (option_name); + return FALSE; + } + + g_free (option_name); + *parsed = TRUE; + } + } + + return TRUE; +} + +static gboolean +parse_long_option (GOptionContext *context, + GOptionGroup *group, + gint *idx, + gchar *arg, + gboolean aliased, + gint *argc, + gchar ***argv, + GError **error, + gboolean *parsed) +{ + gint j; + + for (j = 0; j < group->n_entries; j++) + { + if (*idx >= *argc) + return TRUE; + + if (aliased && (group->entries[j].flags & G_OPTION_FLAG_NOALIAS)) + continue; + + if (NO_ARG (&group->entries[j]) && + strcmp (arg, group->entries[j].long_name) == 0) + { + gchar *option_name; + gboolean retval; + + option_name = g_strconcat ("--", group->entries[j].long_name, NULL); + retval = parse_arg (context, group, &group->entries[j], + NULL, option_name, error); + g_free(option_name); + + add_pending_null (context, &((*argv)[*idx]), NULL); + *parsed = TRUE; + + return retval; + } + else + { + gint len = strlen (group->entries[j].long_name); + + if (strncmp (arg, group->entries[j].long_name, len) == 0 && + (arg[len] == '=' || arg[len] == 0)) + { + gchar *value = NULL; + gchar *option_name; + + add_pending_null (context, &((*argv)[*idx]), NULL); + option_name = g_strconcat ("--", group->entries[j].long_name, NULL); + + if (arg[len] == '=') + value = arg + len + 1; + else if (*idx < *argc - 1) + { + if (!(group->entries[j].flags & G_OPTION_FLAG_OPTIONAL_ARG)) + { + value = (*argv)[*idx + 1]; + add_pending_null (context, &((*argv)[*idx + 1]), NULL); + (*idx)++; + } + else + { + if ((*argv)[*idx + 1][0] == '-') + { + gboolean retval; + retval = parse_arg (context, group, &group->entries[j], + NULL, option_name, error); + *parsed = TRUE; + g_free (option_name); + return retval; + } + else + { + value = (*argv)[*idx + 1]; + add_pending_null (context, &((*argv)[*idx + 1]), NULL); + (*idx)++; + } + } + } + else if (*idx >= *argc - 1 && + group->entries[j].flags & G_OPTION_FLAG_OPTIONAL_ARG) + { + gboolean retval; + retval = parse_arg (context, group, &group->entries[j], + NULL, option_name, error); + *parsed = TRUE; + g_free (option_name); + return retval; + } + else + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + _("Missing argument for %s"), option_name); + g_free (option_name); + return FALSE; + } + + if (!parse_arg (context, group, &group->entries[j], + value, option_name, error)) + { + g_free (option_name); + return FALSE; + } + + g_free (option_name); + *parsed = TRUE; + } + } + } + + return TRUE; +} + +static gboolean +parse_remaining_arg (GOptionContext *context, + GOptionGroup *group, + gint *idx, + gint *argc, + gchar ***argv, + GError **error, + gboolean *parsed) +{ + gint j; + + for (j = 0; j < group->n_entries; j++) + { + if (*idx >= *argc) + return TRUE; + + if (group->entries[j].long_name[0]) + continue; + + g_return_val_if_fail (group->entries[j].arg == G_OPTION_ARG_CALLBACK || + group->entries[j].arg == G_OPTION_ARG_STRING_ARRAY || + group->entries[j].arg == G_OPTION_ARG_FILENAME_ARRAY, FALSE); + + add_pending_null (context, &((*argv)[*idx]), NULL); + + if (!parse_arg (context, group, &group->entries[j], (*argv)[*idx], "", error)) + return FALSE; + + *parsed = TRUE; + return TRUE; + } + + return TRUE; +} + +static void +free_changes_list (GOptionContext *context, + gboolean revert) +{ + GList *list; + + for (list = context->changes; list != NULL; list = list->next) + { + Change *change = list->data; + + if (revert) + { + switch (change->arg_type) + { + case G_OPTION_ARG_NONE: + *(gboolean *)change->arg_data = change->prev.bool; + break; + case G_OPTION_ARG_INT: + *(gint *)change->arg_data = change->prev.integer; + break; + case G_OPTION_ARG_STRING: + case G_OPTION_ARG_FILENAME: + g_free (change->allocated.str); + *(gchar **)change->arg_data = change->prev.str; + break; + case G_OPTION_ARG_STRING_ARRAY: + case G_OPTION_ARG_FILENAME_ARRAY: + g_strfreev (change->allocated.array.data); + *(gchar ***)change->arg_data = change->prev.array; + break; + case G_OPTION_ARG_DOUBLE: + *(gdouble *)change->arg_data = change->prev.dbl; + break; + case G_OPTION_ARG_INT64: + *(gint64 *)change->arg_data = change->prev.int64; + break; + default: + g_assert_not_reached (); + } + } + + g_free (change); + } + + g_list_free (context->changes); + context->changes = NULL; +} + +static void +free_pending_nulls (GOptionContext *context, + gboolean perform_nulls) +{ + GList *list; + + for (list = context->pending_nulls; list != NULL; list = list->next) + { + PendingNull *n = list->data; + + if (perform_nulls) + { + if (n->value) + { + /* Copy back the short options */ + *(n->ptr)[0] = '-'; + strcpy (*n->ptr + 1, n->value); + } + else + *n->ptr = NULL; + } + + g_free (n->value); + g_free (n); + } + + g_list_free (context->pending_nulls); + context->pending_nulls = NULL; +} + +/** + * g_option_context_parse: + * @context: a #GOptionContext + * @argc: a pointer to the number of command line arguments + * @argv: a pointer to the array of command line arguments + * @error: a return location for errors + * + * Parses the command line arguments, recognizing options + * which have been added to @context. A side-effect of + * calling this function is that g_set_prgname() will be + * called. + * + * If the parsing is successful, any parsed arguments are + * removed from the array and @argc and @argv are updated + * accordingly. A '--' option is stripped from @argv + * unless there are unparsed options before and after it, + * or some of the options after it start with '-'. In case + * of an error, @argc and @argv are left unmodified. + * + * If automatic support is enabled + * (see g_option_context_set_help_enabled()), and the + * @argv array contains one of the recognized help options, + * this function will produce help output to stdout and + * call exit (0). + * + * Note that function depends on the + * current locale for + * automatic character set conversion of string and filename + * arguments. + * + * Return value: %TRUE if the parsing was successful, + * %FALSE if an error occurred + * + * Since: 2.6 + **/ +gboolean +g_option_context_parse (GOptionContext *context, + gint *argc, + gchar ***argv, + GError **error) +{ + gint i, j, k; + GList *list; + + /* Set program name */ + if (!g_get_prgname()) + { + if (argc && argv && *argc) + { + gchar *prgname; + + prgname = g_path_get_basename ((*argv)[0]); + g_set_prgname (prgname); + g_free (prgname); + } + else + g_set_prgname (""); + } + + /* Call pre-parse hooks */ + list = context->groups; + while (list) + { + GOptionGroup *group = list->data; + + if (group->pre_parse_func) + { + if (!(* group->pre_parse_func) (context, group, + group->user_data, error)) + goto fail; + } + + list = list->next; + } + + if (context->main_group && context->main_group->pre_parse_func) + { + if (!(* context->main_group->pre_parse_func) (context, context->main_group, + context->main_group->user_data, error)) + goto fail; + } + + if (argc && argv) + { + gboolean stop_parsing = FALSE; + gboolean has_unknown = FALSE; + gint separator_pos = 0; + + for (i = 1; i < *argc; i++) + { + gchar *arg, *dash; + gboolean parsed = FALSE; + + if ((*argv)[i][0] == '-' && (*argv)[i][1] != '\0' && !stop_parsing) + { + if ((*argv)[i][1] == '-') + { + /* -- option */ + + arg = (*argv)[i] + 2; + + /* '--' terminates list of arguments */ + if (*arg == 0) + { + separator_pos = i; + stop_parsing = TRUE; + continue; + } + + /* Handle help options */ + if (context->help_enabled) + { + if (strcmp (arg, "help") == 0) + print_help (context, TRUE, NULL); + else if (strcmp (arg, "help-all") == 0) + print_help (context, FALSE, NULL); + else if (strncmp (arg, "help-", 5) == 0) + { + list = context->groups; + + while (list) + { + GOptionGroup *group = list->data; + + if (strcmp (arg + 5, group->name) == 0) + print_help (context, FALSE, group); + + list = list->next; + } + } + } + + if (context->main_group && + !parse_long_option (context, context->main_group, &i, arg, + FALSE, argc, argv, error, &parsed)) + goto fail; + + if (parsed) + continue; + + /* Try the groups */ + list = context->groups; + while (list) + { + GOptionGroup *group = list->data; + + if (!parse_long_option (context, group, &i, arg, + FALSE, argc, argv, error, &parsed)) + goto fail; + + if (parsed) + break; + + list = list->next; + } + + if (parsed) + continue; + + /* Now look for ---@name + * @description: a description for this group to be shown in + * . This string is translated using the translation + * domain or translation function of the group + * @help_description: a description for the @name option. + * This string is translated using the translation domain or translation function + * of the group + * @user_data: user data that will be passed to the pre- and post-parse hooks, + * the error hook and to callbacks of %G_OPTION_ARG_CALLBACK options, or %NULL + * @destroy: a function that will be called to free @user_data, or %NULL + * + * Creates a new #GOptionGroup. + * + * Return value: a newly created option group. It should be added + * to a #GOptionContext or freed with g_option_group_free(). + * + * Since: 2.6 + **/ +GOptionGroup * +g_option_group_new (const gchar *name, + const gchar *description, + const gchar *help_description, + gpointer user_data, + GDestroyNotify destroy) + +{ + GOptionGroup *group; + + group = g_new0 (GOptionGroup, 1); + group->name = g_strdup (name); + group->description = g_strdup (description); + group->help_description = g_strdup (help_description); + group->user_data = user_data; + group->destroy_notify = destroy; + + return group; +} + + +/** + * g_option_group_free: + * @group: a #GOptionGroup + * + * Frees a #GOptionGroup. Note that you must not + * free groups which have been added to a #GOptionContext. + * + * Since: 2.6 + **/ +void +g_option_group_free (GOptionGroup *group) +{ + g_return_if_fail (group != NULL); + + g_free (group->name); + g_free (group->description); + g_free (group->help_description); + + g_free (group->entries); + + if (group->destroy_notify) + (* group->destroy_notify) (group->user_data); + + if (group->translate_notify) + (* group->translate_notify) (group->translate_data); + + g_free (group); +} + + +/** + * g_option_group_add_entries: + * @group: a #GOptionGroup + * @entries: a %NULL-terminated array of #GOptionEntrys + * + * Adds the options specified in @entries to @group. + * + * Since: 2.6 + **/ +void +g_option_group_add_entries (GOptionGroup *group, + const GOptionEntry *entries) +{ + gint i, n_entries; + + g_return_if_fail (entries != NULL); + + for (n_entries = 0; entries[n_entries].long_name != NULL; n_entries++) ; + + group->entries = g_renew (GOptionEntry, group->entries, group->n_entries + n_entries); + + memcpy (group->entries + group->n_entries, entries, sizeof (GOptionEntry) * n_entries); + + for (i = group->n_entries; i < group->n_entries + n_entries; i++) + { + gchar c = group->entries[i].short_name; + + if (c) + { + if (c == '-' || !g_ascii_isprint (c)) + { + g_warning (G_STRLOC": ignoring invalid short option '%c' (%d)", c, c); + group->entries[i].short_name = 0; + } + } + } + + group->n_entries += n_entries; +} + +/** + * g_option_group_set_parse_hooks: + * @group: a #GOptionGroup + * @pre_parse_func: a function to call before parsing, or %NULL + * @post_parse_func: a function to call after parsing, or %NULL + * + * Associates two functions with @group which will be called + * from g_option_context_parse() before the first option is parsed + * and after the last option has been parsed, respectively. + * + * Note that the user data to be passed to @pre_parse_func and + * @post_parse_func can be specified when constructing the group + * with g_option_group_new(). + * + * Since: 2.6 + **/ +void +g_option_group_set_parse_hooks (GOptionGroup *group, + GOptionParseFunc pre_parse_func, + GOptionParseFunc post_parse_func) +{ + g_return_if_fail (group != NULL); + + group->pre_parse_func = pre_parse_func; + group->post_parse_func = post_parse_func; +} + +/** + * g_option_group_set_error_hook: + * @group: a #GOptionGroup + * @error_func: a function to call when an error occurs + * + * Associates a function with @group which will be called + * from g_option_context_parse() when an error occurs. + * + * Note that the user data to be passed to @error_func can be + * specified when constructing the group with g_option_group_new(). + * + * Since: 2.6 + **/ +void +g_option_group_set_error_hook (GOptionGroup *group, + GOptionErrorFunc error_func) +{ + g_return_if_fail (group != NULL); + + group->error_func = error_func; +} + + +/** + * g_option_group_set_translate_func: + * @group: a #GOptionGroup + * @func: the #GTranslateFunc, or %NULL + * @data: user data to pass to @func, or %NULL + * @destroy_notify: a function which gets called to free @data, or %NULL + * + * Sets the function which is used to translate user-visible + * strings, for output. Different + * groups can use different #GTranslateFuncs. If @func + * is %NULL, strings are not translated. + * + * If you are using gettext(), you only need to set the translation + * domain, see g_option_group_set_translation_domain(). + * + * Since: 2.6 + **/ +void +g_option_group_set_translate_func (GOptionGroup *group, + GTranslateFunc func, + gpointer data, + GDestroyNotify destroy_notify) +{ + g_return_if_fail (group != NULL); + + if (group->translate_notify) + group->translate_notify (group->translate_data); + + group->translate_func = func; + group->translate_data = data; + group->translate_notify = destroy_notify; +} + +static const gchar * +dgettext_swapped (const gchar *msgid, + const gchar *domainname) +{ + return g_dgettext (domainname, msgid); +} + +/** + * g_option_group_set_translation_domain: + * @group: a #GOptionGroup + * @domain: the domain to use + * + * A convenience function to use gettext() for translating + * user-visible strings. + * + * Since: 2.6 + **/ +void +g_option_group_set_translation_domain (GOptionGroup *group, + const gchar *domain) +{ + g_return_if_fail (group != NULL); + + g_option_group_set_translate_func (group, + (GTranslateFunc)dgettext_swapped, + g_strdup (domain), + g_free); +} + +/** + * g_option_context_set_translate_func: + * @context: a #GOptionContext + * @func: the #GTranslateFunc, or %NULL + * @data: user data to pass to @func, or %NULL + * @destroy_notify: a function which gets called to free @data, or %NULL + * + * Sets the function which is used to translate the contexts + * user-visible strings, for output. + * If @func is %NULL, strings are not translated. + * + * Note that option groups have their own translation functions, + * this function only affects the @parameter_string (see g_option_context_new()), + * the summary (see g_option_context_set_summary()) and the description + * (see g_option_context_set_description()). + * + * If you are using gettext(), you only need to set the translation + * domain, see g_option_context_set_translation_domain(). + * + * Since: 2.12 + **/ +void +g_option_context_set_translate_func (GOptionContext *context, + GTranslateFunc func, + gpointer data, + GDestroyNotify destroy_notify) +{ + g_return_if_fail (context != NULL); + + if (context->translate_notify) + context->translate_notify (context->translate_data); + + context->translate_func = func; + context->translate_data = data; + context->translate_notify = destroy_notify; +} + +/** + * g_option_context_set_translation_domain: + * @context: a #GOptionContext + * @domain: the domain to use + * + * A convenience function to use gettext() for translating + * user-visible strings. + * + * Since: 2.12 + **/ +void +g_option_context_set_translation_domain (GOptionContext *context, + const gchar *domain) +{ + g_return_if_fail (context != NULL); + + g_option_context_set_translate_func (context, + (GTranslateFunc)dgettext_swapped, + g_strdup (domain), + g_free); +} + +/** + * g_option_context_set_summary: + * @context: a #GOptionContext + * @summary: a string to be shown in output + * before the list of options, or %NULL + * + * Adds a string to be displayed in output + * before the list of options. This is typically a summary of the + * program functionality. + * + * Note that the summary is translated (see + * g_option_context_set_translate_func() and + * g_option_context_set_translation_domain()). + * + * Since: 2.12 + */ +void +g_option_context_set_summary (GOptionContext *context, + const gchar *summary) +{ + g_return_if_fail (context != NULL); + + g_free (context->summary); + context->summary = g_strdup (summary); +} + + +/** + * g_option_context_get_summary: + * @context: a #GOptionContext + * + * Returns the summary. See g_option_context_set_summary(). + * + * Returns: the summary + * + * Since: 2.12 + */ +G_CONST_RETURN gchar * +g_option_context_get_summary (GOptionContext *context) +{ + g_return_val_if_fail (context != NULL, NULL); + + return context->summary; +} + +/** + * g_option_context_set_description: + * @context: a #GOptionContext + * @description: a string to be shown in output + * after the list of options, or %NULL + * + * Adds a string to be displayed in output + * after the list of options. This text often includes a bug reporting + * address. + * + * Note that the summary is translated (see + * g_option_context_set_translate_func()). + * + * Since: 2.12 + */ +void +g_option_context_set_description (GOptionContext *context, + const gchar *description) +{ + g_return_if_fail (context != NULL); + + g_free (context->description); + context->description = g_strdup (description); +} + + +/** + * g_option_context_get_description: + * @context: a #GOptionContext + * + * Returns the description. See g_option_context_set_description(). + * + * Returns: the description + * + * Since: 2.12 + */ +G_CONST_RETURN gchar * +g_option_context_get_description (GOptionContext *context) +{ + g_return_val_if_fail (context != NULL, NULL); + + return context->description; +} + + +#define __G_OPTION_C__ +#include "galiasdef.c" diff --git a/glib/goption.h b/glib/goption.h new file mode 100644 index 0000000..557d8f7 --- /dev/null +++ b/glib/goption.h @@ -0,0 +1,370 @@ +/* goption.h - Option parser + * + * Copyright (C) 2004 Anders Carlsson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_OPTION_H__ +#define __G_OPTION_H__ + +#include +#include + +G_BEGIN_DECLS + +/** + * GOptionContext: + * + * A GOptionContext struct defines which options + * are accepted by the commandline option parser. The struct has only private + * fields and should not be directly accessed. + */ +typedef struct _GOptionContext GOptionContext; + +/** + * GOptionGroup: + * + * A GOptionGroup struct defines the options in a single + * group. The struct has only private fields and should not be directly accessed. + * + * All options in a group share the same translation function. Libraries which + * need to parse commandline options are expected to provide a function for + * getting a GOptionGroup holding their options, which + * the application can then add to its #GOptionContext. + */ +typedef struct _GOptionGroup GOptionGroup; +typedef struct _GOptionEntry GOptionEntry; + +/** + * GOptionFlags: + * @G_OPTION_FLAG_HIDDEN: The option doesn't appear in + * output. + * @G_OPTION_FLAG_IN_MAIN: The option appears in the main section of the + * output, even if it is defined in a group. + * @G_OPTION_FLAG_REVERSE: For options of the %G_OPTION_ARG_NONE kind, this flag + * indicates that the sense of the option is reversed. + * @G_OPTION_FLAG_NO_ARG: For options of the %G_OPTION_ARG_CALLBACK kind, + * this flag indicates that the callback does not take any argument + * (like a %G_OPTION_ARG_NONE option). Since 2.8 + * @G_OPTION_FLAG_FILENAME: For options of the %G_OPTION_ARG_CALLBACK + * kind, this flag indicates that the argument should be passed to the + * callback in the GLib filename encoding rather than UTF-8. Since 2.8 + * @G_OPTION_FLAG_OPTIONAL_ARG: For options of the %G_OPTION_ARG_CALLBACK + * kind, this flag indicates that the argument supply is optional. If no argument + * is given then data of %GOptionParseFunc will be set to NULL. Since 2.8 + * @G_OPTION_FLAG_NOALIAS: This flag turns off the automatic conflict resolution + * which prefixes long option names with groupname- if + * there is a conflict. This option should only be used in situations where + * aliasing is necessary to model some legacy commandline interface. It is + * not safe to use this option, unless all option groups are under your + * direct control. Since 2.8. + * + * Flags which modify individual options. + */ +typedef enum +{ + G_OPTION_FLAG_HIDDEN = 1 << 0, + G_OPTION_FLAG_IN_MAIN = 1 << 1, + G_OPTION_FLAG_REVERSE = 1 << 2, + G_OPTION_FLAG_NO_ARG = 1 << 3, + G_OPTION_FLAG_FILENAME = 1 << 4, + G_OPTION_FLAG_OPTIONAL_ARG = 1 << 5, + G_OPTION_FLAG_NOALIAS = 1 << 6 +} GOptionFlags; + +/** + * GOptionArg: + * @G_OPTION_ARG_NONE: No extra argument. This is useful for simple flags. + * @G_OPTION_ARG_STRING: The option takes a string argument. + * @G_OPTION_ARG_INT: The option takes an integer argument. + * @G_OPTION_ARG_CALLBACK: The option provides a callback to parse the + * extra argument. + * @G_OPTION_ARG_FILENAME: The option takes a filename as argument. + * @G_OPTION_ARG_STRING_ARRAY: The option takes a string argument, multiple + * uses of the option are collected into an array of strings. + * @G_OPTION_ARG_FILENAME_ARRAY: The option takes a filename as argument, + * multiple uses of the option are collected into an array of strings. + * @G_OPTION_ARG_DOUBLE: The option takes a double argument. The argument + * can be formatted either for the user's locale or for the "C" locale. Since 2.12 + * @G_OPTION_ARG_INT64: The option takes a 64-bit integer. Like %G_OPTION_ARG_INT + * but for larger numbers. The number can be in decimal base, or in hexadecimal + * (when prefixed with 0x, for example, 0xffffffff). + * Since 2.12 + * + * The #GOptionArg enum values determine which type of extra argument the + * options expect to find. If an option expects an extra argument, it + * can be specified in several ways; with a short option: + * , with a long option: + * or combined in a single argument: . + */ +typedef enum +{ + G_OPTION_ARG_NONE, + G_OPTION_ARG_STRING, + G_OPTION_ARG_INT, + G_OPTION_ARG_CALLBACK, + G_OPTION_ARG_FILENAME, + G_OPTION_ARG_STRING_ARRAY, + G_OPTION_ARG_FILENAME_ARRAY, + G_OPTION_ARG_DOUBLE, + G_OPTION_ARG_INT64 +} GOptionArg; + +/** + * GOptionArgFunc: + * @option_name: The name of the option being parsed. This will be either a + * single dash followed by a single letter (for a short name) or two dashes + * followed by a long option name. + * @value: The value to be parsed. + * @data: User data added to the #GOptionGroup containing the option when it + * was created with g_option_group_new() + * @error: A return location for errors. The error code %G_OPTION_ERROR_FAILED + * is intended to be used for errors in #GOptionArgFunc callbacks. + * + * The type of function to be passed as callback for %G_OPTION_ARG_CALLBACK + * options. + * + * Returns: %TRUE if the option was successfully parsed, %FALSE if an error + * occurred, in which case @error should be set with g_set_error() + */ +typedef gboolean (*GOptionArgFunc) (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error); + +/** + * GOptionParseFunc: + * @context: The active #GOptionContext + * @group: The group to which the function belongs + * @data: User data added to the #GOptionGroup containing the option when it + * was created with g_option_group_new() + * @error: A return location for error details + * + * The type of function that can be called before and after parsing. + * + * Returns: %TRUE if the function completed successfully, %FALSE if an error + * occurred, in which case @error should be set with g_set_error() + */ +typedef gboolean (*GOptionParseFunc) (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error); + +/** + * GOptionErrorFunc: + * @context: The active #GOptionContext + * @group: The group to which the function belongs + * @data: User data added to the #GOptionGroup containing the option when it + * was created with g_option_group_new() + * @error: The #GError containing details about the parse error + * + * The type of function to be used as callback when a parse error occurs. + */ +typedef void (*GOptionErrorFunc) (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error); + +/** + * G_OPTION_ERROR: + * + * Error domain for option parsing. Errors in this domain will + * be from the #GOptionError enumeration. See #GError for information on + * error domains. + */ +#define G_OPTION_ERROR (g_option_error_quark ()) + +/** + * GOptionError: + * @G_OPTION_ERROR_UNKNOWN_OPTION: An option was not known to the parser. + * This error will only be reported, if the parser hasn't been instructed + * to ignore unknown options, see g_option_context_set_ignore_unknown_options(). + * @G_OPTION_ERROR_BAD_VALUE: A value couldn't be parsed. + * @G_OPTION_ERROR_FAILED: A #GOptionArgFunc callback failed. + * + * Error codes returned by option parsing. + */ +typedef enum +{ + G_OPTION_ERROR_UNKNOWN_OPTION, + G_OPTION_ERROR_BAD_VALUE, + G_OPTION_ERROR_FAILED +} GOptionError; + +GQuark g_option_error_quark (void); + +/** + * GOptionEntry: + * @long_name: The long name of an option can be used to specify it + * in a commandline as --long_name. Every + * option must have a long name. To resolve conflicts if multiple + * option groups contain the same long name, it is also possible to + * specify the option as + * --groupname-long_name. + * @short_name: If an option has a short name, it can be specified + * -short_name in a commandline. @short_name must be + * a printable ASCII character different from '-', or zero if the option has no + * short name. + * @flags: Flags from #GOptionFlags. + * @arg: The type of the option, as a #GOptionArg. + * @arg_data: If the @arg type is %G_OPTION_ARG_CALLBACK, then @arg_data must + * point to a #GOptionArgFunc callback function, which will be called to handle + * the extra argument. Otherwise, @arg_data is a pointer to a location to store + * the value, the required type of the location depends on the @arg type: + * + * + * %G_OPTION_ARG_NONE + * %gboolean + * + * + * %G_OPTION_ARG_STRING + * %gchar* + * + * + * %G_OPTION_ARG_INT + * %gint + * + * + * %G_OPTION_ARG_FILENAME + * %gchar* + * + * + * %G_OPTION_ARG_STRING_ARRAY + * %gchar** + * + * + * %G_OPTION_ARG_FILENAME_ARRAY + * %gchar** + * + * + * %G_OPTION_ARG_DOUBLE + * %gdouble + * + * + * If @arg type is %G_OPTION_ARG_STRING or %G_OPTION_ARG_FILENAME the location + * will contain a newly allocated string if the option was given. That string + * needs to be freed by the callee using g_free(). Likewise if @arg type is + * %G_OPTION_ARG_STRING_ARRAY or %G_OPTION_ARG_FILENAME_ARRAY, the data should + * be freed using g_strfreev(). + * @description: the description for the option in + * output. The @description is translated using the @translate_func of the + * group, see g_option_group_set_translation_domain(). + * @arg_description: The placeholder to use for the extra argument parsed + * by the option in + * output. The @arg_description is translated using the @translate_func of the + * group, see g_option_group_set_translation_domain(). + * + * A GOptionEntry defines a single option. + * To have an effect, they must be added to a #GOptionGroup with + * g_option_context_add_main_entries() or g_option_group_add_entries(). + */ +struct _GOptionEntry +{ + const gchar *long_name; + gchar short_name; + gint flags; + + GOptionArg arg; + gpointer arg_data; + + const gchar *description; + const gchar *arg_description; +}; + +/** + * G_OPTION_REMAINING: + * + * If a long option in the main group has this name, it is not treated as a + * regular option. Instead it collects all non-option arguments which would + * otherwise be left in argv. The option must be of type + * %G_OPTION_ARG_CALLBACK, %G_OPTION_ARG_STRING_ARRAY + * or %G_OPTION_ARG_FILENAME_ARRAY. + * + * + * Using #G_OPTION_REMAINING instead of simply scanning argv + * for leftover arguments has the advantage that GOption takes care of + * necessary encoding conversions for strings or filenames. + * + * Since: 2.6 + */ +#define G_OPTION_REMAINING "" + +GOptionContext *g_option_context_new (const gchar *parameter_string); +void g_option_context_set_summary (GOptionContext *context, + const gchar *summary); +G_CONST_RETURN gchar *g_option_context_get_summary (GOptionContext *context); +void g_option_context_set_description (GOptionContext *context, + const gchar *description); +G_CONST_RETURN gchar *g_option_context_get_description (GOptionContext *context); +void g_option_context_free (GOptionContext *context); +void g_option_context_set_help_enabled (GOptionContext *context, + gboolean help_enabled); +gboolean g_option_context_get_help_enabled (GOptionContext *context); +void g_option_context_set_ignore_unknown_options (GOptionContext *context, + gboolean ignore_unknown); +gboolean g_option_context_get_ignore_unknown_options (GOptionContext *context); + +void g_option_context_add_main_entries (GOptionContext *context, + const GOptionEntry *entries, + const gchar *translation_domain); +gboolean g_option_context_parse (GOptionContext *context, + gint *argc, + gchar ***argv, + GError **error); +void g_option_context_set_translate_func (GOptionContext *context, + GTranslateFunc func, + gpointer data, + GDestroyNotify destroy_notify); +void g_option_context_set_translation_domain (GOptionContext *context, + const gchar *domain); + +void g_option_context_add_group (GOptionContext *context, + GOptionGroup *group); +void g_option_context_set_main_group (GOptionContext *context, + GOptionGroup *group); +GOptionGroup *g_option_context_get_main_group (GOptionContext *context); +gchar *g_option_context_get_help (GOptionContext *context, + gboolean main_help, + GOptionGroup *group); + +GOptionGroup *g_option_group_new (const gchar *name, + const gchar *description, + const gchar *help_description, + gpointer user_data, + GDestroyNotify destroy); +void g_option_group_set_parse_hooks (GOptionGroup *group, + GOptionParseFunc pre_parse_func, + GOptionParseFunc post_parse_func); +void g_option_group_set_error_hook (GOptionGroup *group, + GOptionErrorFunc error_func); +void g_option_group_free (GOptionGroup *group); +void g_option_group_add_entries (GOptionGroup *group, + const GOptionEntry *entries); +void g_option_group_set_translate_func (GOptionGroup *group, + GTranslateFunc func, + gpointer data, + GDestroyNotify destroy_notify); +void g_option_group_set_translation_domain (GOptionGroup *group, + const gchar *domain); + +G_END_DECLS + +#endif /* __G_OPTION_H__ */ diff --git a/glib/gpattern.c b/glib/gpattern.c new file mode 100644 index 0000000..33e4aac --- /dev/null +++ b/glib/gpattern.c @@ -0,0 +1,446 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "gpattern.h" + +#include "gmacros.h" +#include "gmessages.h" +#include "gmem.h" +#include "gunicode.h" +#include "gutils.h" +#include "galias.h" + +/** + * SECTION: patterns + * @title: Glob-style pattern matching + * @short_description: matches strings against patterns containing '*' + * (wildcard) and '?' (joker) + * + * The g_pattern_match* functions match a string + * against a pattern containing '*' and '?' wildcards with similar + * semantics as the standard glob() function: '*' matches an arbitrary, + * possibly empty, string, '?' matches an arbitrary character. + * + * Note that in contrast to glob(), the '/' character + * can be matched by the wildcards, there are no + * '[...]' character ranges and '*' and '?' can + * not be escaped to include them literally in a + * pattern. + * + * When multiple strings must be matched against the same pattern, it + * is better to compile the pattern to a #GPatternSpec using + * g_pattern_spec_new() and use g_pattern_match_string() instead of + * g_pattern_match_simple(). This avoids the overhead of repeated + * pattern compilation. + **/ + +/** + * GPatternSpec: + * + * A GPatternSpec is the 'compiled' form of a + * pattern. This structure is opaque and its fields cannot be accessed + * directly. + **/ + +/* keep enum and structure of gpattern.c and patterntest.c in sync */ +typedef enum +{ + G_MATCH_ALL, /* "*A?A*" */ + G_MATCH_ALL_TAIL, /* "*A?AA" */ + G_MATCH_HEAD, /* "AAAA*" */ + G_MATCH_TAIL, /* "*AAAA" */ + G_MATCH_EXACT, /* "AAAAA" */ + G_MATCH_LAST +} GMatchType; + +struct _GPatternSpec +{ + GMatchType match_type; + guint pattern_length; + guint min_length; + guint max_length; + gchar *pattern; +}; + + +/* --- functions --- */ +static inline gboolean +g_pattern_ph_match (const gchar *match_pattern, + const gchar *match_string, + gboolean *wildcard_reached_p) +{ + register const gchar *pattern, *string; + register gchar ch; + + pattern = match_pattern; + string = match_string; + + ch = *pattern; + pattern++; + while (ch) + { + switch (ch) + { + case '?': + if (!*string) + return FALSE; + string = g_utf8_next_char (string); + break; + + case '*': + *wildcard_reached_p = TRUE; + do + { + ch = *pattern; + pattern++; + if (ch == '?') + { + if (!*string) + return FALSE; + string = g_utf8_next_char (string); + } + } + while (ch == '*' || ch == '?'); + if (!ch) + return TRUE; + do + { + gboolean next_wildcard_reached = FALSE; + while (ch != *string) + { + if (!*string) + return FALSE; + string = g_utf8_next_char (string); + } + string++; + if (g_pattern_ph_match (pattern, string, &next_wildcard_reached)) + return TRUE; + if (next_wildcard_reached) + /* the forthcoming pattern substring up to the next wildcard has + * been matched, but a mismatch occoured for the rest of the + * pattern, following the next wildcard. + * there's no need to advance the current match position any + * further if the rest pattern will not match. + */ + return FALSE; + } + while (*string); + break; + + default: + if (ch == *string) + string++; + else + return FALSE; + break; + } + + ch = *pattern; + pattern++; + } + + return *string == 0; +} + +/** + * g_pattern_match: + * @pspec: a #GPatternSpec + * @string_length: the length of @string (in bytes, i.e. strlen(), + * not g_utf8_strlen()) + * @string: the UTF-8 encoded string to match + * @string_reversed: the reverse of @string or %NULL + * @Returns: %TRUE if @string matches @pspec + * + * Matches a string against a compiled pattern. Passing the correct + * length of the string given is mandatory. The reversed string can be + * omitted by passing %NULL, this is more efficient if the reversed + * version of the string to be matched is not at hand, as + * g_pattern_match() will only construct it if the compiled pattern + * requires reverse matches. + * + * Note that, if the user code will (possibly) match a string against a + * multitude of patterns containing wildcards, chances are high that + * some patterns will require a reversed string. In this case, it's + * more efficient to provide the reversed string to avoid multiple + * constructions thereof in the various calls to g_pattern_match(). + * + * Note also that the reverse of a UTF-8 encoded string can in general + * not be obtained by g_strreverse(). This works + * only if the string doesn't contain any multibyte characters. GLib + * offers the g_utf8_strreverse() function to reverse UTF-8 encoded + * strings. + **/ +gboolean +g_pattern_match (GPatternSpec *pspec, + guint string_length, + const gchar *string, + const gchar *string_reversed) +{ + g_return_val_if_fail (pspec != NULL, FALSE); + g_return_val_if_fail (string != NULL, FALSE); + + if (string_length < pspec->min_length || + string_length > pspec->max_length) + return FALSE; + + switch (pspec->match_type) + { + gboolean dummy; + case G_MATCH_ALL: + return g_pattern_ph_match (pspec->pattern, string, &dummy); + case G_MATCH_ALL_TAIL: + if (string_reversed) + return g_pattern_ph_match (pspec->pattern, string_reversed, &dummy); + else + { + gboolean result; + gchar *tmp; + tmp = g_utf8_strreverse (string, string_length); + result = g_pattern_ph_match (pspec->pattern, tmp, &dummy); + g_free (tmp); + return result; + } + case G_MATCH_HEAD: + if (pspec->pattern_length == string_length) + return strcmp (pspec->pattern, string) == 0; + else if (pspec->pattern_length) + return strncmp (pspec->pattern, string, pspec->pattern_length) == 0; + else + return TRUE; + case G_MATCH_TAIL: + if (pspec->pattern_length) + return strcmp (pspec->pattern, string + (string_length - pspec->pattern_length)) == 0; + else + return TRUE; + case G_MATCH_EXACT: + if (pspec->pattern_length != string_length) + return FALSE; + else + return strcmp (pspec->pattern, string) == 0; + default: + g_return_val_if_fail (pspec->match_type < G_MATCH_LAST, FALSE); + return FALSE; + } +} + +/** + * g_pattern_spec_new: + * @pattern: a zero-terminated UTF-8 encoded string + * @Returns: a newly-allocated #GPatternSpec + * + * Compiles a pattern to a #GPatternSpec. + **/ +GPatternSpec* +g_pattern_spec_new (const gchar *pattern) +{ + GPatternSpec *pspec; + gboolean seen_joker = FALSE, seen_wildcard = FALSE, more_wildcards = FALSE; + gint hw_pos = -1, tw_pos = -1, hj_pos = -1, tj_pos = -1; + gboolean follows_wildcard = FALSE; + guint pending_jokers = 0; + const gchar *s; + gchar *d; + guint i; + + g_return_val_if_fail (pattern != NULL, NULL); + + /* canonicalize pattern and collect necessary stats */ + pspec = g_new (GPatternSpec, 1); + pspec->pattern_length = strlen (pattern); + pspec->min_length = 0; + pspec->max_length = 0; + pspec->pattern = g_new (gchar, pspec->pattern_length + 1); + d = pspec->pattern; + for (i = 0, s = pattern; *s != 0; s++) + { + switch (*s) + { + case '*': + if (follows_wildcard) /* compress multiple wildcards */ + { + pspec->pattern_length--; + continue; + } + follows_wildcard = TRUE; + if (hw_pos < 0) + hw_pos = i; + tw_pos = i; + break; + case '?': + pending_jokers++; + pspec->min_length++; + pspec->max_length += 4; /* maximum UTF-8 character length */ + continue; + default: + for (; pending_jokers; pending_jokers--, i++) { + *d++ = '?'; + if (hj_pos < 0) + hj_pos = i; + tj_pos = i; + } + follows_wildcard = FALSE; + pspec->min_length++; + pspec->max_length++; + break; + } + *d++ = *s; + i++; + } + for (; pending_jokers; pending_jokers--) { + *d++ = '?'; + if (hj_pos < 0) + hj_pos = i; + tj_pos = i; + } + *d++ = 0; + seen_joker = hj_pos >= 0; + seen_wildcard = hw_pos >= 0; + more_wildcards = seen_wildcard && hw_pos != tw_pos; + if (seen_wildcard) + pspec->max_length = G_MAXUINT; + + /* special case sole head/tail wildcard or exact matches */ + if (!seen_joker && !more_wildcards) + { + if (pspec->pattern[0] == '*') + { + pspec->match_type = G_MATCH_TAIL; + memmove (pspec->pattern, pspec->pattern + 1, --pspec->pattern_length); + pspec->pattern[pspec->pattern_length] = 0; + return pspec; + } + if (pspec->pattern_length > 0 && + pspec->pattern[pspec->pattern_length - 1] == '*') + { + pspec->match_type = G_MATCH_HEAD; + pspec->pattern[--pspec->pattern_length] = 0; + return pspec; + } + if (!seen_wildcard) + { + pspec->match_type = G_MATCH_EXACT; + return pspec; + } + } + + /* now just need to distinguish between head or tail match start */ + tw_pos = pspec->pattern_length - 1 - tw_pos; /* last pos to tail distance */ + tj_pos = pspec->pattern_length - 1 - tj_pos; /* last pos to tail distance */ + if (seen_wildcard) + pspec->match_type = tw_pos > hw_pos ? G_MATCH_ALL_TAIL : G_MATCH_ALL; + else /* seen_joker */ + pspec->match_type = tj_pos > hj_pos ? G_MATCH_ALL_TAIL : G_MATCH_ALL; + if (pspec->match_type == G_MATCH_ALL_TAIL) { + gchar *tmp = pspec->pattern; + pspec->pattern = g_utf8_strreverse (pspec->pattern, pspec->pattern_length); + g_free (tmp); + } + return pspec; +} + +/** + * g_pattern_spec_free: + * @pspec: a #GPatternSpec + * + * Frees the memory allocated for the #GPatternSpec. + **/ +void +g_pattern_spec_free (GPatternSpec *pspec) +{ + g_return_if_fail (pspec != NULL); + + g_free (pspec->pattern); + g_free (pspec); +} + +/** + * g_pattern_spec_equal: + * @pspec1: a #GPatternSpec + * @pspec2: another #GPatternSpec + * @Returns: Whether the compiled patterns are equal + * + * Compares two compiled pattern specs and returns whether they will + * match the same set of strings. + **/ +gboolean +g_pattern_spec_equal (GPatternSpec *pspec1, + GPatternSpec *pspec2) +{ + g_return_val_if_fail (pspec1 != NULL, FALSE); + g_return_val_if_fail (pspec2 != NULL, FALSE); + + return (pspec1->pattern_length == pspec2->pattern_length && + pspec1->match_type == pspec2->match_type && + strcmp (pspec1->pattern, pspec2->pattern) == 0); +} + +/** + * g_pattern_match_string: + * @pspec: a #GPatternSpec + * @string: the UTF-8 encoded string to match + * @Returns: %TRUE if @string matches @pspec + * + * Matches a string against a compiled pattern. If the string is to be + * matched against more than one pattern, consider using + * g_pattern_match() instead while supplying the reversed string. + **/ +gboolean +g_pattern_match_string (GPatternSpec *pspec, + const gchar *string) +{ + g_return_val_if_fail (pspec != NULL, FALSE); + g_return_val_if_fail (string != NULL, FALSE); + + return g_pattern_match (pspec, strlen (string), string, NULL); +} + +/** + * g_pattern_match_simple: + * @pattern: the UTF-8 encoded pattern + * @string: the UTF-8 encoded string to match + * @Returns: %TRUE if @string matches @pspec + * + * Matches a string against a pattern given as a string. If this + * function is to be called in a loop, it's more efficient to compile + * the pattern once with g_pattern_spec_new() and call + * g_pattern_match_string() repeatedly. + **/ +gboolean +g_pattern_match_simple (const gchar *pattern, + const gchar *string) +{ + GPatternSpec *pspec; + gboolean ergo; + + g_return_val_if_fail (pattern != NULL, FALSE); + g_return_val_if_fail (string != NULL, FALSE); + + pspec = g_pattern_spec_new (pattern); + ergo = g_pattern_match (pspec, strlen (string), string, NULL); + g_pattern_spec_free (pspec); + + return ergo; +} + +#define __G_PATTERN_C__ +#include "galiasdef.c" diff --git a/glib/gpattern.h b/glib/gpattern.h new file mode 100644 index 0000000..b653d71 --- /dev/null +++ b/glib/gpattern.h @@ -0,0 +1,49 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 1999 Peter Mattis, Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_PATTERN_H__ +#define __G_PATTERN_H__ + +#include + +G_BEGIN_DECLS + + +typedef struct _GPatternSpec GPatternSpec; + +GPatternSpec* g_pattern_spec_new (const gchar *pattern); +void g_pattern_spec_free (GPatternSpec *pspec); +gboolean g_pattern_spec_equal (GPatternSpec *pspec1, + GPatternSpec *pspec2); +gboolean g_pattern_match (GPatternSpec *pspec, + guint string_length, + const gchar *string, + const gchar *string_reversed); +gboolean g_pattern_match_string (GPatternSpec *pspec, + const gchar *string); +gboolean g_pattern_match_simple (const gchar *pattern, + const gchar *string); + +G_END_DECLS + +#endif /* __G_PATTERN_H__ */ diff --git a/glib/gpoll.c b/glib/gpoll.c new file mode 100644 index 0000000..30e5429 --- /dev/null +++ b/glib/gpoll.c @@ -0,0 +1,430 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gpoll.c: poll(2) abstraction + * Copyright 1998 Owen Taylor + * Copyright 2008 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +/* Uncomment the next line (and the corresponding line in gmain.c) to + * enable debugging printouts if the environment variable + * G_MAIN_POLL_DEBUG is set to some value. + */ +/* #define G_MAIN_POLL_DEBUG */ + +#ifdef _WIN32 +/* Always enable debugging printout on Windows, as it is more often + * needed there... + */ +#define G_MAIN_POLL_DEBUG +#endif + +#include "glib.h" +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif /* HAVE_SYS_TIME_H */ +#ifdef GLIB_HAVE_SYS_POLL_H +# include +# undef events /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */ +# undef revents /* AIX 4.1.5 & 4.3.2 define this for SVR3,4 compatibility */ + +/* The poll() emulation on OS/X doesn't handle fds=NULL, nfds=0, + * so we prefer our own poll emulation. + */ +#if defined(_POLL_EMUL_H_) || defined(BROKEN_POLL) +#undef HAVE_POLL +#endif + +#endif /* GLIB_HAVE_SYS_POLL_H */ +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ +#include + +#ifdef G_OS_WIN32 +#define STRICT +#include +#endif /* G_OS_WIN32 */ + +#include "galias.h" + +#ifdef G_MAIN_POLL_DEBUG +extern gboolean _g_main_poll_debug; +#endif + +#ifdef HAVE_POLL +/* SunOS has poll, but doesn't provide a prototype. */ +# if defined (sun) && !defined (__SVR4) +extern gint poll (struct pollfd *fds, guint nfsd, gint timeout); +# endif /* !sun */ + +/** + * g_poll: + * @fds: file descriptors to poll + * @nfds: the number of file descriptors in @fds + * @timeout: amount of time to wait, in milliseconds, or -1 to wait forever + * + * Polls @fds, as with the poll() system call, but portably. (On + * systems that don't have poll(), it is emulated using select().) + * This is used internally by #GMainContext, but it can be called + * directly if you need to block until a file descriptor is ready, but + * don't want to run the full main loop. + * + * Each element of @fds is a #GPollFD describing a single file + * descriptor to poll. The %fd field indicates the file descriptor, + * and the %events field indicates the events to poll for. On return, + * the %revents fields will be filled with the events that actually + * occurred. + * + * On POSIX systems, the file descriptors in @fds can be any sort of + * file descriptor, but the situation is much more complicated on + * Windows. If you need to use g_poll() in code that has to run on + * Windows, the easiest solution is to construct all of your + * #GPollFDs with g_io_channel_win32_make_pollfd(). + * + * Return value: the number of entries in @fds whose %revents fields + * were filled in, or 0 if the operation timed out, or -1 on error or + * if the call was interrupted. + * + * Since: 2.20 + **/ +gint +g_poll (GPollFD *fds, + guint nfds, + gint timeout) +{ + return poll ((struct pollfd *)fds, nfds, timeout); +} + +#else /* !HAVE_POLL */ + +#ifdef G_OS_WIN32 + +static int +poll_rest (gboolean poll_msgs, + HANDLE *handles, + gint nhandles, + GPollFD *fds, + guint nfds, + gint timeout) +{ + DWORD ready; + GPollFD *f; + int recursed_result; + + if (poll_msgs) + { + /* Wait for either messages or handles + * -> Use MsgWaitForMultipleObjectsEx + */ + if (_g_main_poll_debug) + g_print (" MsgWaitForMultipleObjectsEx(%d, %d)\n", nhandles, timeout); + + ready = MsgWaitForMultipleObjectsEx (nhandles, handles, timeout, + QS_ALLINPUT, MWMO_ALERTABLE); + + if (ready == WAIT_FAILED) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + g_warning ("MsgWaitForMultipleObjectsEx failed: %s", emsg); + g_free (emsg); + } + } + else if (nhandles == 0) + { + /* No handles to wait for, just the timeout */ + if (timeout == INFINITE) + ready = WAIT_FAILED; + else + { + SleepEx (timeout, TRUE); + ready = WAIT_TIMEOUT; + } + } + else + { + /* Wait for just handles + * -> Use WaitForMultipleObjectsEx + */ + if (_g_main_poll_debug) + g_print (" WaitForMultipleObjectsEx(%d, %d)\n", nhandles, timeout); + + ready = WaitForMultipleObjectsEx (nhandles, handles, FALSE, timeout, TRUE); + if (ready == WAIT_FAILED) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + g_warning ("WaitForMultipleObjectsEx failed: %s", emsg); + g_free (emsg); + } + } + + if (_g_main_poll_debug) + g_print (" wait returns %ld%s\n", + ready, + (ready == WAIT_FAILED ? " (WAIT_FAILED)" : + (ready == WAIT_TIMEOUT ? " (WAIT_TIMEOUT)" : + (poll_msgs && ready == WAIT_OBJECT_0 + nhandles ? " (msg)" : "")))); + + if (ready == WAIT_FAILED) + return -1; + else if (ready == WAIT_TIMEOUT || + ready == WAIT_IO_COMPLETION) + return 0; + else if (poll_msgs && ready == WAIT_OBJECT_0 + nhandles) + { + for (f = fds; f < &fds[nfds]; ++f) + if (f->fd == G_WIN32_MSG_HANDLE && f->events & G_IO_IN) + f->revents |= G_IO_IN; + + /* If we have a timeout, or no handles to poll, be satisfied + * with just noticing we have messages waiting. + */ + if (timeout != 0 || nhandles == 0) + return 1; + + /* If no timeout and handles to poll, recurse to poll them, + * too. + */ + recursed_result = poll_rest (FALSE, handles, nhandles, fds, nfds, 0); + return (recursed_result == -1) ? -1 : 1 + recursed_result; + } + else if (ready >= WAIT_OBJECT_0 && ready < WAIT_OBJECT_0 + nhandles) + { + for (f = fds; f < &fds[nfds]; ++f) + { + if ((HANDLE) f->fd == handles[ready - WAIT_OBJECT_0]) + { + f->revents = f->events; + if (_g_main_poll_debug) + g_print (" got event %p\n", (HANDLE) f->fd); + } + } + + /* If no timeout and polling several handles, recurse to poll + * the rest of them. + */ + if (timeout == 0 && nhandles > 1) + { + /* Remove the handle that fired */ + int i; + if (ready < nhandles - 1) + for (i = ready - WAIT_OBJECT_0 + 1; i < nhandles; i++) + handles[i-1] = handles[i]; + nhandles--; + recursed_result = poll_rest (FALSE, handles, nhandles, fds, nfds, 0); + return (recursed_result == -1) ? -1 : 1 + recursed_result; + } + return 1; + } + + return 0; +} + +gint +g_poll (GPollFD *fds, + guint nfds, + gint timeout) +{ + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; + gboolean poll_msgs = FALSE; + GPollFD *f; + gint nhandles = 0; + int retval; + + if (_g_main_poll_debug) + g_print ("g_poll: waiting for"); + + for (f = fds; f < &fds[nfds]; ++f) + if (f->fd == G_WIN32_MSG_HANDLE && (f->events & G_IO_IN)) + { + if (_g_main_poll_debug && !poll_msgs) + g_print (" MSG"); + poll_msgs = TRUE; + } + else if (f->fd > 0) + { + /* Don't add the same handle several times into the array, as + * docs say that is not allowed, even if it actually does seem + * to work. + */ + gint i; + + for (i = 0; i < nhandles; i++) + if (handles[i] == (HANDLE) f->fd) + break; + + if (i == nhandles) + { + if (nhandles == MAXIMUM_WAIT_OBJECTS) + { + g_warning ("Too many handles to wait for!\n"); + break; + } + else + { + if (_g_main_poll_debug) + g_print (" %p", (HANDLE) f->fd); + handles[nhandles++] = (HANDLE) f->fd; + } + } + } + + if (_g_main_poll_debug) + g_print ("\n"); + + for (f = fds; f < &fds[nfds]; ++f) + f->revents = 0; + + if (timeout == -1) + timeout = INFINITE; + + /* Polling for several things? */ + if (nhandles > 1 || (nhandles > 0 && poll_msgs)) + { + /* First check if one or several of them are immediately + * available + */ + retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, 0); + + /* If not, and we have a significant timeout, poll again with + * timeout then. Note that this will return indication for only + * one event, or only for messages. We ignore timeouts less than + * ten milliseconds as they are mostly pointless on Windows, the + * MsgWaitForMultipleObjectsEx() call will timeout right away + * anyway. + */ + if (retval == 0 && (timeout == INFINITE || timeout >= 10)) + retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout); + } + else + { + /* Just polling for one thing, so no need to check first if + * available immediately + */ + retval = poll_rest (poll_msgs, handles, nhandles, fds, nfds, timeout); + } + + if (retval == -1) + for (f = fds; f < &fds[nfds]; ++f) + f->revents = 0; + + return retval; +} + +#else /* !G_OS_WIN32 */ + +/* The following implementation of poll() comes from the GNU C Library. + * Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. + */ + +#include /* for bzero on BSD systems */ + +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* HAVE_SYS_SELECT_H */ + +#ifdef G_OS_BEOS +#undef NO_FD_SET +#endif /* G_OS_BEOS */ + +#ifndef NO_FD_SET +# define SELECT_MASK fd_set +#else /* !NO_FD_SET */ +# ifndef _AIX +typedef long fd_mask; +# endif /* _AIX */ +# ifdef _IBMR2 +# define SELECT_MASK void +# else /* !_IBMR2 */ +# define SELECT_MASK int +# endif /* !_IBMR2 */ +#endif /* !NO_FD_SET */ + +gint +g_poll (GPollFD *fds, + guint nfds, + gint timeout) +{ + struct timeval tv; + SELECT_MASK rset, wset, xset; + GPollFD *f; + int ready; + int maxfd = 0; + + FD_ZERO (&rset); + FD_ZERO (&wset); + FD_ZERO (&xset); + + for (f = fds; f < &fds[nfds]; ++f) + if (f->fd >= 0) + { + if (f->events & G_IO_IN) + FD_SET (f->fd, &rset); + if (f->events & G_IO_OUT) + FD_SET (f->fd, &wset); + if (f->events & G_IO_PRI) + FD_SET (f->fd, &xset); + if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI))) + maxfd = f->fd; + } + + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + + ready = select (maxfd + 1, &rset, &wset, &xset, + timeout == -1 ? NULL : &tv); + if (ready > 0) + for (f = fds; f < &fds[nfds]; ++f) + { + f->revents = 0; + if (f->fd >= 0) + { + if (FD_ISSET (f->fd, &rset)) + f->revents |= G_IO_IN; + if (FD_ISSET (f->fd, &wset)) + f->revents |= G_IO_OUT; + if (FD_ISSET (f->fd, &xset)) + f->revents |= G_IO_PRI; + } + } + + return ready; +} + +#endif /* !G_OS_WIN32 */ + +#endif /* !HAVE_POLL */ + +#define __G_POLL_C__ +#include "galiasdef.c" diff --git a/glib/gpoll.h b/glib/gpoll.h new file mode 100644 index 0000000..eec4723 --- /dev/null +++ b/glib/gpoll.h @@ -0,0 +1,93 @@ +/* gpoll.h - poll(2) support + * Copyright (C) 2008 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if !defined (__GLIB_H_INSIDE__) && !defined (__G_MAIN_H__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_POLL_H__ +#define __G_POLL_H__ + +#include + +G_BEGIN_DECLS + +/* Any definitions using GPollFD or GPollFunc are primarily + * for Unix and not guaranteed to be the compatible on all + * operating systems on which GLib runs. Right now, the + * GLib does use these functions on Win32 as well, but interprets + * them in a fairly different way than on Unix. If you use + * these definitions, you are should be prepared to recode + * for different operating systems. + * + * Note that on systems with a working poll(2), that function is used + * in place of g_poll(). Thus g_poll() must have the same signature as + * poll(), meaning GPollFD must have the same layout as struct pollfd. + * + * + * On Win32, the fd in a GPollFD should be Win32 HANDLE (*not* a file + * descriptor as provided by the C runtime) that can be used by + * MsgWaitForMultipleObjects. This does *not* include file handles + * from CreateFile, SOCKETs, nor pipe handles. (But you can use + * WSAEventSelect to signal events when a SOCKET is readable). + * + * On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to + * indicate polling for messages. + * + * But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK + * (GTK) programs, as GDK itself wants to read messages and convert them + * to GDK events. + * + * So, unless you really know what you are doing, it's best not to try + * to use the main loop polling stuff for your own needs on + * Windows. + */ +typedef struct _GPollFD GPollFD; +typedef gint (*GPollFunc) (GPollFD *ufds, + guint nfsd, + gint timeout_); + +struct _GPollFD +{ +#if defined (G_OS_WIN32) && GLIB_SIZEOF_VOID_P == 8 + gint64 fd; +#else + gint fd; +#endif + gushort events; + gushort revents; +}; + +#ifdef G_OS_WIN32 +#if GLIB_SIZEOF_VOID_P == 8 +#define G_POLLFD_FORMAT "%#I64x" +#else +#define G_POLLFD_FORMAT "%#x" +#endif +#else +#define G_POLLFD_FORMAT "%d" +#endif + +gint g_poll (GPollFD *fds, + guint nfds, + gint timeout); + +G_END_DECLS + +#endif /* __G_POLL_H__ */ diff --git a/glib/gprimes.c b/glib/gprimes.c new file mode 100644 index 0000000..7beca71 --- /dev/null +++ b/glib/gprimes.c @@ -0,0 +1,90 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + + +static const guint g_primes[] = +{ + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, +}; + +static const guint g_nprimes = sizeof (g_primes) / sizeof (g_primes[0]); + +guint +g_spaced_primes_closest (guint num) +{ + gint i; + + for (i = 0; i < g_nprimes; i++) + if (g_primes[i] > num) + return g_primes[i]; + + return g_primes[g_nprimes - 1]; +} + +#define __G_PRIMES_C__ +#include "galiasdef.c" diff --git a/glib/gprimes.h b/glib/gprimes.h new file mode 100644 index 0000000..af57286 --- /dev/null +++ b/glib/gprimes.h @@ -0,0 +1,51 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_PRIMES_H__ +#define __G_PRIMES_H__ + +#include + +G_BEGIN_DECLS + +/* Prime numbers. + */ + +/* This function returns prime numbers spaced by approximately 1.5-2.0 + * and is for use in resizing data structures which prefer + * prime-valued sizes. The closest spaced prime function returns the + * next largest prime, or the highest it knows about which is about + * MAXINT/4. + */ +guint g_spaced_primes_closest (guint num) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_PRIMES_H__ */ diff --git a/glib/gprintf.c b/glib/gprintf.c new file mode 100644 index 0000000..3528861 --- /dev/null +++ b/glib/gprintf.c @@ -0,0 +1,344 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#ifndef _WIN32 +#define _GNU_SOURCE /* For vasprintf */ +#endif + +#include +#include +#include + +#include "glib.h" +#include "gprintf.h" +#include "gprintfint.h" + +#include "galias.h" + +/** + * g_printf: + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @Varargs: the arguments to insert in the output. + * + * An implementation of the standard printf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * + * Returns: the number of bytes printed. + * + * Since: 2.2 + **/ +gint +g_printf (gchar const *format, + ...) +{ + va_list args; + gint retval; + + va_start (args, format); + retval = g_vprintf (format, args); + va_end (args); + + return retval; +} + +/** + * g_fprintf: + * @file: the stream to write to. + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @Varargs: the arguments to insert in the output. + * + * An implementation of the standard fprintf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * + * Returns: the number of bytes printed. + * + * Since: 2.2 + **/ +gint +g_fprintf (FILE *file, + gchar const *format, + ...) +{ + va_list args; + gint retval; + + va_start (args, format); + retval = g_vfprintf (file, format, args); + va_end (args); + + return retval; +} + +/** + * g_sprintf: + * @string: A pointer to a memory buffer to contain the resulting string. It + * is up to the caller to ensure that the allocated buffer is large + * enough to hold the formatted result + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @Varargs: the arguments to insert in the output. + * + * An implementation of the standard sprintf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * + * Returns: the number of bytes printed. + * + * Since: 2.2 + **/ +gint +g_sprintf (gchar *string, + gchar const *format, + ...) +{ + va_list args; + gint retval; + + va_start (args, format); + retval = g_vsprintf (string, format, args); + va_end (args); + + return retval; +} + +/** + * g_snprintf: + * @string: the buffer to hold the output. + * @n: the maximum number of bytes to produce (including the + * terminating nul character). + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @Varargs: the arguments to insert in the output. + * + * A safer form of the standard sprintf() function. The output is guaranteed + * to not exceed @n characters (including the terminating nul character), so + * it is easy to ensure that a buffer overflow cannot occur. + * + * See also g_strdup_printf(). + * + * In versions of GLib prior to 1.2.3, this function may return -1 if the + * output was truncated, and the truncated string may not be nul-terminated. + * In versions prior to 1.3.12, this function returns the length of the output + * string. + * + * The return value of g_snprintf() conforms to the snprintf() + * function as standardized in ISO C99. Note that this is different from + * traditional snprintf(), which returns the length of the output string. + * + * The format string may contain positional parameters, as specified in + * the Single Unix Specification. + * + * Returns: the number of bytes which would be produced if the buffer + * was large enough. + **/ +gint +g_snprintf (gchar *string, + gulong n, + gchar const *format, + ...) +{ + va_list args; + gint retval; + + va_start (args, format); + retval = g_vsnprintf (string, n, format, args); + va_end (args); + + return retval; +} + +/** + * g_vprintf: + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @args: the list of arguments to insert in the output. + * + * An implementation of the standard vprintf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * + * Returns: the number of bytes printed. + * + * Since: 2.2 + **/ +gint +g_vprintf (gchar const *format, + va_list args) +{ + g_return_val_if_fail (format != NULL, -1); + + return _g_vprintf (format, args); +} + +/** + * g_vfprintf: + * @file: the stream to write to. + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @args: the list of arguments to insert in the output. + * + * An implementation of the standard fprintf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * + * Returns: the number of bytes printed. + * + * Since: 2.2 + **/ +gint +g_vfprintf (FILE *file, + gchar const *format, + va_list args) +{ + g_return_val_if_fail (format != NULL, -1); + + return _g_vfprintf (file, format, args); +} + +/** + * g_vsprintf: + * @string: the buffer to hold the output. + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @args: the list of arguments to insert in the output. + * + * An implementation of the standard vsprintf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * + * Returns: the number of bytes printed. + * + * Since: 2.2 + **/ +gint +g_vsprintf (gchar *string, + gchar const *format, + va_list args) +{ + g_return_val_if_fail (string != NULL, -1); + g_return_val_if_fail (format != NULL, -1); + + return _g_vsprintf (string, format, args); +} + +/** + * g_vsnprintf: + * @string: the buffer to hold the output. + * @n: the maximum number of bytes to produce (including the + * terminating nul character). + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @args: the list of arguments to insert in the output. + * + * A safer form of the standard vsprintf() function. The output is guaranteed + * to not exceed @n characters (including the terminating nul character), so + * it is easy to ensure that a buffer overflow cannot occur. + * + * See also g_strdup_vprintf(). + * + * In versions of GLib prior to 1.2.3, this function may return -1 if the + * output was truncated, and the truncated string may not be nul-terminated. + * In versions prior to 1.3.12, this function returns the length of the output + * string. + * + * The return value of g_vsnprintf() conforms to the vsnprintf() function + * as standardized in ISO C99. Note that this is different from traditional + * vsnprintf(), which returns the length of the output string. + * + * The format string may contain positional parameters, as specified in + * the Single Unix Specification. + * + * Returns: the number of bytes which would be produced if the buffer + * was large enough. + */ +gint +g_vsnprintf (gchar *string, + gulong n, + gchar const *format, + va_list args) +{ + g_return_val_if_fail (n == 0 || string != NULL, -1); + g_return_val_if_fail (format != NULL, -1); + + return _g_vsnprintf (string, n, format, args); +} + +/** + * g_vasprintf: + * @string: the return location for the newly-allocated string. + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @args: the list of arguments to insert in the output. + * + * An implementation of the GNU vasprintf() function which supports + * positional parameters, as specified in the Single Unix Specification. + * This function is similar to g_vsprintf(), except that it allocates a + * string to hold the output, instead of putting the output in a buffer + * you allocate in advance. + * + * Returns: the number of bytes printed. + * + * Since: 2.4 + **/ +gint +g_vasprintf (gchar **string, + gchar const *format, + va_list args) +{ + gint len; + g_return_val_if_fail (string != NULL, -1); + +#if !defined(HAVE_GOOD_PRINTF) + + len = _g_gnulib_vasprintf (string, format, args); + if (len < 0) + *string = NULL; + +#elif defined (HAVE_VASPRINTF) + + len = vasprintf (string, format, args); + if (len < 0) + *string = NULL; + else if (!g_mem_is_system_malloc ()) + { + /* vasprintf returns malloc-allocated memory */ + gchar *string1 = g_strndup (*string, len); + free (*string); + *string = string1; + } + +#else + + { + va_list args2; + + G_VA_COPY (args2, args); + + *string = g_new (gchar, g_printf_string_upper_bound (format, args)); + + len = _g_vsprintf (*string, format, args2); + va_end (args2); + } +#endif + + return len; +} + +#define __G_PRINTF_C__ +#include "galiasdef.c" diff --git a/glib/gprintf.h b/glib/gprintf.h new file mode 100644 index 0000000..d96870f --- /dev/null +++ b/glib/gprintf.h @@ -0,0 +1,52 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997, 2002 Peter Mattis, Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_PRINTF_H__ +#define __G_PRINTF_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +gint g_printf (gchar const *format, + ...) G_GNUC_PRINTF (1, 2); +gint g_fprintf (FILE *file, + gchar const *format, + ...) G_GNUC_PRINTF (2, 3); +gint g_sprintf (gchar *string, + gchar const *format, + ...) G_GNUC_PRINTF (2, 3); + +gint g_vprintf (gchar const *format, + va_list args); +gint g_vfprintf (FILE *file, + gchar const *format, + va_list args); +gint g_vsprintf (gchar *string, + gchar const *format, + va_list args); +gint g_vasprintf (gchar **string, + gchar const *format, + va_list args); + +G_END_DECLS + +#endif /* __G_PRINTF_H__ */ diff --git a/glib/gprintfint.h b/glib/gprintfint.h new file mode 100644 index 0000000..0c975a1 --- /dev/null +++ b/glib/gprintfint.h @@ -0,0 +1,59 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 2002. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_PRINTFINT_H__ +#define __G_PRINTFINT_H__ + +#ifdef HAVE_GOOD_PRINTF + +#define _g_printf printf +#define _g_fprintf fprintf +#define _g_sprintf sprintf +#define _g_snprintf snprintf + +#define _g_vprintf vprintf +#define _g_vfprintf vfprintf +#define _g_vsprintf vsprintf +#define _g_vsnprintf vsnprintf + +#else + +#include "gnulib/printf.h" + +#define _g_printf _g_gnulib_printf +#define _g_fprintf _g_gnulib_fprintf +#define _g_sprintf _g_gnulib_sprintf +#define _g_snprintf _g_gnulib_snprintf + +#define _g_vprintf _g_gnulib_vprintf +#define _g_vfprintf _g_gnulib_vfprintf +#define _g_vsprintf _g_gnulib_vsprintf +#define _g_vsnprintf _g_gnulib_vsnprintf + +#endif + +#endif /* __G_PRINTF_H__ */ + diff --git a/glib/gqsort.c b/glib/gqsort.c new file mode 100644 index 0000000..176d44a --- /dev/null +++ b/glib/gqsort.c @@ -0,0 +1,287 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1991, 1992, 1996, 1997,1999,2004 Free Software Foundation, Inc. + * Copyright (C) 2000 Eazel, Inc. + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * This file was originally part of the GNU C Library, and was modified to allow + * user data to be passed in to the sorting function. + * + * Written by Douglas C. Schmidt (schmidt@ics.uci.edu). + * Modified by Maciej Stachowiak (mjs@eazel.com) + * + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with GLib + * at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#include +#include +#include + +#include "glib.h" +#include "galias.h" + +/* Byte-wise swap two items of size SIZE. */ +#define SWAP(a, b, size) \ + do \ + { \ + register size_t __size = (size); \ + register char *__a = (a), *__b = (b); \ + do \ + { \ + char __tmp = *__a; \ + *__a++ = *__b; \ + *__b++ = __tmp; \ + } while (--__size > 0); \ + } while (0) + +/* Discontinue quicksort algorithm when partition gets below this size. + This particular magic number was chosen to work best on a Sun 4/260. */ +#define MAX_THRESH 4 + +/* Stack node declarations used to store unfulfilled partition obligations. */ +typedef struct + { + char *lo; + char *hi; + } stack_node; + +/* The next 4 #defines implement a very fast in-line stack abstraction. */ +/* The stack needs log (total_elements) entries (we could even subtract + log(MAX_THRESH)). Since total_elements has type size_t, we get as + upper bound for log (total_elements): + bits per byte (CHAR_BIT) * sizeof(size_t). */ +#define STACK_SIZE (CHAR_BIT * sizeof(size_t)) +#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top)) +#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi))) +#define STACK_NOT_EMPTY (stack < top) + + +/* Order size using quicksort. This implementation incorporates + four optimizations discussed in Sedgewick: + + 1. Non-recursive, using an explicit stack of pointer that store the + next array partition to sort. To save time, this maximum amount + of space required to store an array of SIZE_MAX is allocated on the + stack. Assuming a 32-bit (64 bit) integer for size_t, this needs + only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes). + Pretty cheap, actually. + + 2. Chose the pivot element using a median-of-three decision tree. + This reduces the probability of selecting a bad pivot value and + eliminates certain extraneous comparisons. + + 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving + insertion sort to order the MAX_THRESH items within each partition. + This is a big win, since insertion sort is faster for small, mostly + sorted array segments. + + 4. The larger of the two sub-partitions is always pushed onto the + stack first, with the algorithm then concentrating on the + smaller partition. This *guarantees* no more than log (total_elems) + stack size is needed (actually O(1) in this case)! */ + +/** + * g_qsort_with_data: + * @pbase: start of array to sort + * @total_elems: elements in the array + * @size: size of each element + * @compare_func: function to compare elements + * @user_data: data to pass to @compare_func + * + * This is just like the standard C qsort() function, but + * the comparison routine accepts a user data argument. + * + **/ +void +g_qsort_with_data (gconstpointer pbase, + gint total_elems, + gsize size, + GCompareDataFunc compare_func, + gpointer user_data) +{ + register char *base_ptr = (char *) pbase; + + const size_t max_thresh = MAX_THRESH * size; + + g_return_if_fail (total_elems >= 0); + g_return_if_fail (pbase != NULL || total_elems == 0); + g_return_if_fail (compare_func != NULL); + + if (total_elems == 0) + /* Avoid lossage with unsigned arithmetic below. */ + return; + + if (total_elems > MAX_THRESH) + { + char *lo = base_ptr; + char *hi = &lo[size * (total_elems - 1)]; + stack_node stack[STACK_SIZE]; + stack_node *top = stack; + + PUSH (NULL, NULL); + + while (STACK_NOT_EMPTY) + { + char *left_ptr; + char *right_ptr; + + /* Select median value from among LO, MID, and HI. Rearrange + LO and HI so the three values are sorted. This lowers the + probability of picking a pathological pivot value and + skips a comparison for both the LEFT_PTR and RIGHT_PTR in + the while loops. */ + + char *mid = lo + size * ((hi - lo) / size >> 1); + + if ((*compare_func) ((void *) mid, (void *) lo, user_data) < 0) + SWAP (mid, lo, size); + if ((*compare_func) ((void *) hi, (void *) mid, user_data) < 0) + SWAP (mid, hi, size); + else + goto jump_over; + if ((*compare_func) ((void *) mid, (void *) lo, user_data) < 0) + SWAP (mid, lo, size); + jump_over:; + + left_ptr = lo + size; + right_ptr = hi - size; + + /* Here's the famous ``collapse the walls'' section of quicksort. + Gotta like those tight inner loops! They are the main reason + that this algorithm runs much faster than others. */ + do + { + while ((*compare_func) ((void *) left_ptr, (void *) mid, user_data) < 0) + left_ptr += size; + + while ((*compare_func) ((void *) mid, (void *) right_ptr, user_data) < 0) + right_ptr -= size; + + if (left_ptr < right_ptr) + { + SWAP (left_ptr, right_ptr, size); + if (mid == left_ptr) + mid = right_ptr; + else if (mid == right_ptr) + mid = left_ptr; + left_ptr += size; + right_ptr -= size; + } + else if (left_ptr == right_ptr) + { + left_ptr += size; + right_ptr -= size; + break; + } + } + while (left_ptr <= right_ptr); + + /* Set up pointers for next iteration. First determine whether + left and right partitions are below the threshold size. If so, + ignore one or both. Otherwise, push the larger partition's + bounds on the stack and continue sorting the smaller one. */ + + if ((size_t) (right_ptr - lo) <= max_thresh) + { + if ((size_t) (hi - left_ptr) <= max_thresh) + /* Ignore both small partitions. */ + POP (lo, hi); + else + /* Ignore small left partition. */ + lo = left_ptr; + } + else if ((size_t) (hi - left_ptr) <= max_thresh) + /* Ignore small right partition. */ + hi = right_ptr; + else if ((right_ptr - lo) > (hi - left_ptr)) + { + /* Push larger left partition indices. */ + PUSH (lo, right_ptr); + lo = left_ptr; + } + else + { + /* Push larger right partition indices. */ + PUSH (left_ptr, hi); + hi = right_ptr; + } + } + } + + /* Once the BASE_PTR array is partially sorted by quicksort the rest + is completely sorted using insertion sort, since this is efficient + for partitions below MAX_THRESH size. BASE_PTR points to the beginning + of the array to sort, and END_PTR points at the very last element in + the array (*not* one beyond it!). */ + +#define min(x, y) ((x) < (y) ? (x) : (y)) + + { + char *const end_ptr = &base_ptr[size * (total_elems - 1)]; + char *tmp_ptr = base_ptr; + char *thresh = min(end_ptr, base_ptr + max_thresh); + register char *run_ptr; + + /* Find smallest element in first threshold and place it at the + array's beginning. This is the smallest array element, + and the operation speeds up insertion sort's inner loop. */ + + for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size) + if ((*compare_func) ((void *) run_ptr, (void *) tmp_ptr, user_data) < 0) + tmp_ptr = run_ptr; + + if (tmp_ptr != base_ptr) + SWAP (tmp_ptr, base_ptr, size); + + /* Insertion sort, running from left-hand-side up to right-hand-side. */ + + run_ptr = base_ptr + size; + while ((run_ptr += size) <= end_ptr) + { + tmp_ptr = run_ptr - size; + while ((*compare_func) ((void *) run_ptr, (void *) tmp_ptr, user_data) < 0) + tmp_ptr -= size; + + tmp_ptr += size; + if (tmp_ptr != run_ptr) + { + char *trav; + + trav = run_ptr + size; + while (--trav >= run_ptr) + { + char c = *trav; + char *hi, *lo; + + for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo) + *hi = *lo; + *hi = c; + } + } + } + } +} + +#define __G_QSORT_C__ +#include "galiasdef.c" diff --git a/glib/gqsort.h b/glib/gqsort.h new file mode 100644 index 0000000..3a47a58 --- /dev/null +++ b/glib/gqsort.h @@ -0,0 +1,46 @@ + /* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_QSORT_H__ +#define __G_QSORT_H__ + +#include + +G_BEGIN_DECLS + +void g_qsort_with_data (gconstpointer pbase, + gint total_elems, + gsize size, + GCompareDataFunc compare_func, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_QSORT_H__ */ diff --git a/glib/gquark.h b/glib/gquark.h new file mode 100644 index 0000000..a0cbe2f --- /dev/null +++ b/glib/gquark.h @@ -0,0 +1,52 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_QUARK_H__ +#define __G_QUARK_H__ + +#include + +G_BEGIN_DECLS + +typedef guint32 GQuark; + +/* Quarks (string<->id association) + */ +GQuark g_quark_try_string (const gchar *string); +GQuark g_quark_from_static_string (const gchar *string); +GQuark g_quark_from_string (const gchar *string); +G_CONST_RETURN gchar* g_quark_to_string (GQuark quark) G_GNUC_CONST; + +G_CONST_RETURN gchar* g_intern_string (const gchar *string); +G_CONST_RETURN gchar* g_intern_static_string (const gchar *string); + +G_END_DECLS + +#endif /* __G_QUARK_H__ */ diff --git a/glib/gqueue.c b/glib/gqueue.c new file mode 100644 index 0000000..1368e26 --- /dev/null +++ b/glib/gqueue.c @@ -0,0 +1,1013 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GQueue: Double ended queue implementation, piggy backed on GList. + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * g_queue_new: + * + * Creates a new #GQueue. + * + * Returns: a new #GQueue. + **/ +GQueue* +g_queue_new (void) +{ + return g_slice_new0 (GQueue); +} + +/** + * g_queue_free: + * @queue: a #GQueue. + * + * Frees the memory allocated for the #GQueue. Only call this function if + * @queue was created with g_queue_new(). If queue elements contain + * dynamically-allocated memory, they should be freed first. + **/ +void +g_queue_free (GQueue *queue) +{ + g_return_if_fail (queue != NULL); + + g_list_free (queue->head); + g_slice_free (GQueue, queue); +} + +/** + * g_queue_init: + * @queue: an uninitialized #GQueue + * + * A statically-allocated #GQueue must be initialized with this function + * before it can be used. Alternatively you can initialize it with + * #G_QUEUE_INIT. It is not necessary to initialize queues created with + * g_queue_new(). + * + * Since: 2.14 + **/ +void +g_queue_init (GQueue *queue) +{ + g_return_if_fail (queue != NULL); + + queue->head = queue->tail = NULL; + queue->length = 0; +} + +/** + * g_queue_clear: + * @queue: a #GQueue + * + * Removes all the elements in @queue. If queue elements contain + * dynamically-allocated memory, they should be freed first. + * + * Since: 2.14 + */ +void +g_queue_clear (GQueue *queue) +{ + g_return_if_fail (queue != NULL); + + g_list_free (queue->head); + g_queue_init (queue); +} + +/** + * g_queue_is_empty: + * @queue: a #GQueue. + * + * Returns %TRUE if the queue is empty. + * + * Returns: %TRUE if the queue is empty. + **/ +gboolean +g_queue_is_empty (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, TRUE); + + return queue->head == NULL; +} + +/** + * g_queue_get_length: + * @queue: a #GQueue + * + * Returns the number of items in @queue. + * + * Return value: The number of items in @queue. + * + * Since: 2.4 + **/ +guint +g_queue_get_length (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, 0); + + return queue->length; +} + +/** + * g_queue_reverse: + * @queue: a #GQueue + * + * Reverses the order of the items in @queue. + * + * Since: 2.4 + **/ +void +g_queue_reverse (GQueue *queue) +{ + g_return_if_fail (queue != NULL); + + queue->tail = queue->head; + queue->head = g_list_reverse (queue->head); +} + +/** + * g_queue_copy: + * @queue: a #GQueue + * + * Copies a @queue. Note that is a shallow copy. If the elements in the + * queue consist of pointers to data, the pointers are copied, but the + * actual data is not. + * + * Return value: A copy of @queue + * + * Since: 2.4 + **/ +GQueue * +g_queue_copy (GQueue *queue) +{ + GQueue *result; + GList *list; + + g_return_val_if_fail (queue != NULL, NULL); + + result = g_queue_new (); + + for (list = queue->head; list != NULL; list = list->next) + g_queue_push_tail (result, list->data); + + return result; +} + +/** + * g_queue_foreach: + * @queue: a #GQueue + * @func: the function to call for each element's data + * @user_data: user data to pass to @func + * + * Calls @func for each element in the queue passing @user_data to the + * function. + * + * Since: 2.4 + **/ +void +g_queue_foreach (GQueue *queue, + GFunc func, + gpointer user_data) +{ + GList *list; + + g_return_if_fail (queue != NULL); + g_return_if_fail (func != NULL); + + list = queue->head; + while (list) + { + GList *next = list->next; + func (list->data, user_data); + list = next; + } +} + +/** + * g_queue_find: + * @queue: a #GQueue + * @data: data to find + * + * Finds the first link in @queue which contains @data. + * + * Return value: The first link in @queue which contains @data. + * + * Since: 2.4 + **/ +GList * +g_queue_find (GQueue *queue, + gconstpointer data) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return g_list_find (queue->head, data); +} + +/** + * g_queue_find_custom: + * @queue: a #GQueue + * @data: user data passed to @func + * @func: a #GCompareFunc to call for each element. It should return 0 + * when the desired element is found + * + * Finds an element in a #GQueue, using a supplied function to find the + * desired element. It iterates over the queue, calling the given function + * which should return 0 when the desired element is found. The function + * takes two gconstpointer arguments, the #GQueue element's data as the + * first argument and the given user data as the second argument. + * + * Return value: The found link, or %NULL if it wasn't found + * + * Since: 2.4 + **/ +GList * +g_queue_find_custom (GQueue *queue, + gconstpointer data, + GCompareFunc func) +{ + g_return_val_if_fail (queue != NULL, NULL); + g_return_val_if_fail (func != NULL, NULL); + + return g_list_find_custom (queue->head, data, func); +} + +/** + * g_queue_sort: + * @queue: a #GQueue + * @compare_func: the #GCompareDataFunc used to sort @queue. This function + * is passed two elements of the queue and should return 0 if they are + * equal, a negative value if the first comes before the second, and + * a positive value if the second comes before the first. + * @user_data: user data passed to @compare_func + * + * Sorts @queue using @compare_func. + * + * Since: 2.4 + **/ +void +g_queue_sort (GQueue *queue, + GCompareDataFunc compare_func, + gpointer user_data) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (compare_func != NULL); + + queue->head = g_list_sort_with_data (queue->head, compare_func, user_data); + queue->tail = g_list_last (queue->head); +} + +/** + * g_queue_push_head: + * @queue: a #GQueue. + * @data: the data for the new element. + * + * Adds a new element at the head of the queue. + **/ +void +g_queue_push_head (GQueue *queue, + gpointer data) +{ + g_return_if_fail (queue != NULL); + + queue->head = g_list_prepend (queue->head, data); + if (!queue->tail) + queue->tail = queue->head; + queue->length++; +} + +/** + * g_queue_push_nth: + * @queue: a #GQueue + * @data: the data for the new element + * @n: the position to insert the new element. If @n is negative or + * larger than the number of elements in the @queue, the element is + * added to the end of the queue. + * + * Inserts a new element into @queue at the given position + * + * Since: 2.4 + **/ +void +g_queue_push_nth (GQueue *queue, + gpointer data, + gint n) +{ + g_return_if_fail (queue != NULL); + + if (n < 0 || n >= queue->length) + { + g_queue_push_tail (queue, data); + return; + } + + g_queue_insert_before (queue, g_queue_peek_nth_link (queue, n), data); +} + +/** + * g_queue_push_head_link: + * @queue: a #GQueue. + * @link_: a single #GList element, not a list with + * more than one element. + * + * Adds a new element at the head of the queue. + **/ +void +g_queue_push_head_link (GQueue *queue, + GList *link) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (link != NULL); + g_return_if_fail (link->prev == NULL); + g_return_if_fail (link->next == NULL); + + link->next = queue->head; + if (queue->head) + queue->head->prev = link; + else + queue->tail = link; + queue->head = link; + queue->length++; +} + +/** + * g_queue_push_tail: + * @queue: a #GQueue. + * @data: the data for the new element. + * + * Adds a new element at the tail of the queue. + **/ +void +g_queue_push_tail (GQueue *queue, + gpointer data) +{ + g_return_if_fail (queue != NULL); + + queue->tail = g_list_append (queue->tail, data); + if (queue->tail->next) + queue->tail = queue->tail->next; + else + queue->head = queue->tail; + queue->length++; +} + +/** + * g_queue_push_tail_link: + * @queue: a #GQueue. + * @link_: a single #GList element, not a list with + * more than one element. + * + * Adds a new element at the tail of the queue. + **/ +void +g_queue_push_tail_link (GQueue *queue, + GList *link) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (link != NULL); + g_return_if_fail (link->prev == NULL); + g_return_if_fail (link->next == NULL); + + link->prev = queue->tail; + if (queue->tail) + queue->tail->next = link; + else + queue->head = link; + queue->tail = link; + queue->length++; +} + +/** + * g_queue_push_nth_link: + * @queue: a #GQueue + * @n: the position to insert the link. If this is negative or larger than + * the number of elements in @queue, the link is added to the end of + * @queue. + * @link_: the link to add to @queue + * + * Inserts @link into @queue at the given position. + * + * Since: 2.4 + **/ +void +g_queue_push_nth_link (GQueue *queue, + gint n, + GList *link_) +{ + GList *next; + GList *prev; + + g_return_if_fail (queue != NULL); + g_return_if_fail (link_ != NULL); + + if (n < 0 || n >= queue->length) + { + g_queue_push_tail_link (queue, link_); + return; + } + + g_assert (queue->head); + g_assert (queue->tail); + + next = g_queue_peek_nth_link (queue, n); + prev = next->prev; + + if (prev) + prev->next = link_; + next->prev = link_; + + link_->next = next; + link_->prev = prev; + + if (queue->head->prev) + queue->head = queue->head->prev; + + if (queue->tail->next) + queue->tail = queue->tail->next; + + queue->length++; +} + +/** + * g_queue_pop_head: + * @queue: a #GQueue. + * + * Removes the first element of the queue. + * + * Returns: the data of the first element in the queue, or %NULL if the queue + * is empty. + **/ +gpointer +g_queue_pop_head (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + if (queue->head) + { + GList *node = queue->head; + gpointer data = node->data; + + queue->head = node->next; + if (queue->head) + queue->head->prev = NULL; + else + queue->tail = NULL; + g_list_free_1 (node); + queue->length--; + + return data; + } + + return NULL; +} + +/** + * g_queue_pop_head_link: + * @queue: a #GQueue. + * + * Removes the first element of the queue. + * + * Returns: the #GList element at the head of the queue, or %NULL if the queue + * is empty. + **/ +GList* +g_queue_pop_head_link (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + if (queue->head) + { + GList *node = queue->head; + + queue->head = node->next; + if (queue->head) + { + queue->head->prev = NULL; + node->next = NULL; + } + else + queue->tail = NULL; + queue->length--; + + return node; + } + + return NULL; +} + +/** + * g_queue_peek_head_link: + * @queue: a #GQueue + * + * Returns the first link in @queue + * + * Return value: the first link in @queue, or %NULL if @queue is empty + * + * Since: 2.4 + **/ +GList* +g_queue_peek_head_link (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return queue->head; +} + +/** + * g_queue_peek_tail_link: + * @queue: a #GQueue + * + * Returns the last link @queue. + * + * Return value: the last link in @queue, or %NULL if @queue is empty + * + * Since: 2.4 + **/ +GList* +g_queue_peek_tail_link (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return queue->tail; +} + +/** + * g_queue_pop_tail: + * @queue: a #GQueue. + * + * Removes the last element of the queue. + * + * Returns: the data of the last element in the queue, or %NULL if the queue + * is empty. + **/ +gpointer +g_queue_pop_tail (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + if (queue->tail) + { + GList *node = queue->tail; + gpointer data = node->data; + + queue->tail = node->prev; + if (queue->tail) + queue->tail->next = NULL; + else + queue->head = NULL; + queue->length--; + g_list_free_1 (node); + + return data; + } + + return NULL; +} + +/** + * g_queue_pop_nth: + * @queue: a #GQueue + * @n: the position of the element. + * + * Removes the @n'th element of @queue. + * + * Return value: the element's data, or %NULL if @n is off the end of @queue. + * + * Since: 2.4 + **/ +gpointer +g_queue_pop_nth (GQueue *queue, + guint n) +{ + GList *nth_link; + gpointer result; + + g_return_val_if_fail (queue != NULL, NULL); + + if (n >= queue->length) + return NULL; + + nth_link = g_queue_peek_nth_link (queue, n); + result = nth_link->data; + + g_queue_delete_link (queue, nth_link); + + return result; +} + +/** + * g_queue_pop_tail_link: + * @queue: a #GQueue. + * + * Removes the last element of the queue. + * + * Returns: the #GList element at the tail of the queue, or %NULL if the queue + * is empty. + **/ +GList* +g_queue_pop_tail_link (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + if (queue->tail) + { + GList *node = queue->tail; + + queue->tail = node->prev; + if (queue->tail) + { + queue->tail->next = NULL; + node->prev = NULL; + } + else + queue->head = NULL; + queue->length--; + + return node; + } + + return NULL; +} + +/** + * g_queue_pop_nth_link: + * @queue: a #GQueue + * @n: the link's position + * + * Removes and returns the link at the given position. + * + * Return value: The @n'th link, or %NULL if @n is off the end of @queue. + * + * Since: 2.4 + **/ +GList* +g_queue_pop_nth_link (GQueue *queue, + guint n) +{ + GList *link; + + g_return_val_if_fail (queue != NULL, NULL); + + if (n >= queue->length) + return NULL; + + link = g_queue_peek_nth_link (queue, n); + g_queue_unlink (queue, link); + + return link; +} + +/** + * g_queue_peek_nth_link: + * @queue: a #GQueue + * @n: the position of the link + * + * Returns the link at the given position + * + * Return value: The link at the @n'th position, or %NULL if @n is off the + * end of the list + * + * Since: 2.4 + **/ +GList * +g_queue_peek_nth_link (GQueue *queue, + guint n) +{ + GList *link; + gint i; + + g_return_val_if_fail (queue != NULL, NULL); + + if (n >= queue->length) + return NULL; + + if (n > queue->length / 2) + { + n = queue->length - n - 1; + + link = queue->tail; + for (i = 0; i < n; ++i) + link = link->prev; + } + else + { + link = queue->head; + for (i = 0; i < n; ++i) + link = link->next; + } + + return link; +} + +/** + * g_queue_link_index: + * @queue: a #Gqueue + * @link_: A #GList link + * + * Returns the position of @link_ in @queue. + * + * Return value: The position of @link_, or -1 if the link is + * not part of @queue + * + * Since: 2.4 + **/ +gint +g_queue_link_index (GQueue *queue, + GList *link_) +{ + g_return_val_if_fail (queue != NULL, -1); + + return g_list_position (queue->head, link_); +} + +/** + * g_queue_unlink + * @queue: a #GQueue + * @link_: a #GList link that must be part of @queue + * + * Unlinks @link_ so that it will no longer be part of @queue. The link is + * not freed. + * + * @link_ must be part of @queue, + * + * Since: 2.4 + **/ +void +g_queue_unlink (GQueue *queue, + GList *link_) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (link_ != NULL); + + if (link_ == queue->tail) + queue->tail = queue->tail->prev; + + queue->head = g_list_remove_link (queue->head, link_); + queue->length--; +} + +/** + * g_queue_delete_link: + * @queue: a #GQueue + * @link_: a #GList link that must be part of @queue + * + * Removes @link_ from @queue and frees it. + * + * @link_ must be part of @queue. + * + * Since: 2.4 + **/ +void +g_queue_delete_link (GQueue *queue, + GList *link_) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (link_ != NULL); + + g_queue_unlink (queue, link_); + g_list_free (link_); +} + +/** + * g_queue_peek_head: + * @queue: a #GQueue. + * + * Returns the first element of the queue. + * + * Returns: the data of the first element in the queue, or %NULL if the queue + * is empty. + **/ +gpointer +g_queue_peek_head (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return queue->head ? queue->head->data : NULL; +} + +/** + * g_queue_peek_tail: + * @queue: a #GQueue. + * + * Returns the last element of the queue. + * + * Returns: the data of the last element in the queue, or %NULL if the queue + * is empty. + **/ +gpointer +g_queue_peek_tail (GQueue *queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + + return queue->tail ? queue->tail->data : NULL; +} + +/** + * g_queue_peek_nth: + * @queue: a #GQueue + * @n: the position of the element. + * + * Returns the @n'th element of @queue. + * + * Return value: The data for the @n'th element of @queue, or %NULL if @n is + * off the end of @queue. + * + * Since: 2.4 + **/ +gpointer +g_queue_peek_nth (GQueue *queue, + guint n) +{ + GList *link; + + g_return_val_if_fail (queue != NULL, NULL); + + link = g_queue_peek_nth_link (queue, n); + + if (link) + return link->data; + + return NULL; +} + +/** + * g_queue_index: + * @queue: a #GQueue + * @data: the data to find. + * + * Returns the position of the first element in @queue which contains @data. + * + * Return value: The position of the first element in @queue which contains @data, or -1 if no element in @queue contains @data. + * + * Since: 2.4 + **/ +gint +g_queue_index (GQueue *queue, + gconstpointer data) +{ + g_return_val_if_fail (queue != NULL, -1); + + return g_list_index (queue->head, data); +} + +/** + * g_queue_remove: + * @queue: a #GQueue + * @data: data to remove. + * + * Removes the first element in @queue that contains @data. + * + * Since: 2.4 + **/ +void +g_queue_remove (GQueue *queue, + gconstpointer data) +{ + GList *link; + + g_return_if_fail (queue != NULL); + + link = g_list_find (queue->head, data); + + if (link) + g_queue_delete_link (queue, link); +} + +/** + * g_queue_remove_all: + * @queue: a #GQueue + * @data: data to remove + * + * Remove all elemeents in @queue which contains @data. + * + * Since: 2.4 + **/ +void +g_queue_remove_all (GQueue *queue, + gconstpointer data) +{ + GList *list; + + g_return_if_fail (queue != NULL); + + list = queue->head; + while (list) + { + GList *next = list->next; + + if (list->data == data) + g_queue_delete_link (queue, list); + + list = next; + } +} + +/** + * g_queue_insert_before: + * @queue: a #GQueue + * @sibling: a #GList link that must be part of @queue + * @data: the data to insert + * + * Inserts @data into @queue before @sibling. + * + * @sibling must be part of @queue. + * + * Since: 2.4 + **/ +void +g_queue_insert_before (GQueue *queue, + GList *sibling, + gpointer data) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (sibling != NULL); + + queue->head = g_list_insert_before (queue->head, sibling, data); + queue->length++; +} + +/** + * g_queue_insert_after: + * @queue: a #GQueue + * @sibling: a #GList link that must be part of @queue + * @data: the data to insert + * + * Inserts @data into @queue after @sibling + * + * @sibling must be part of @queue + * + * Since: 2.4 + **/ +void +g_queue_insert_after (GQueue *queue, + GList *sibling, + gpointer data) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (sibling != NULL); + + if (sibling == queue->tail) + g_queue_push_tail (queue, data); + else + g_queue_insert_before (queue, sibling->next, data); +} + +/** + * g_queue_insert_sorted: + * @queue: a #GQueue + * @data: the data to insert + * @func: the #GCompareDataFunc used to compare elements in the queue. It is + * called with two elements of the @queue and @user_data. It should + * return 0 if the elements are equal, a negative value if the first + * element comes before the second, and a positive value if the second + * element comes before the first. + * @user_data: user data passed to @func. + * + * Inserts @data into @queue using @func to determine the new position. + * + * Since: 2.4 + **/ +void +g_queue_insert_sorted (GQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data) +{ + GList *list; + + g_return_if_fail (queue != NULL); + + list = queue->head; + while (list && func (list->data, data, user_data) < 0) + list = list->next; + + if (list) + g_queue_insert_before (queue, list, data); + else + g_queue_push_tail (queue, data); +} + +#define __G_QUEUE_C__ +#include "galiasdef.c" diff --git a/glib/gqueue.h b/glib/gqueue.h new file mode 100644 index 0000000..e78488f --- /dev/null +++ b/glib/gqueue.h @@ -0,0 +1,127 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_QUEUE_H__ +#define __G_QUEUE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GQueue GQueue; + +struct _GQueue +{ + GList *head; + GList *tail; + guint length; +}; + +#define G_QUEUE_INIT { NULL, NULL, 0 } + +/* Queues + */ +GQueue* g_queue_new (void); +void g_queue_free (GQueue *queue); +void g_queue_init (GQueue *queue); +void g_queue_clear (GQueue *queue); +gboolean g_queue_is_empty (GQueue *queue); +guint g_queue_get_length (GQueue *queue); +void g_queue_reverse (GQueue *queue); +GQueue * g_queue_copy (GQueue *queue); +void g_queue_foreach (GQueue *queue, + GFunc func, + gpointer user_data); +GList * g_queue_find (GQueue *queue, + gconstpointer data); +GList * g_queue_find_custom (GQueue *queue, + gconstpointer data, + GCompareFunc func); +void g_queue_sort (GQueue *queue, + GCompareDataFunc compare_func, + gpointer user_data); + +void g_queue_push_head (GQueue *queue, + gpointer data); +void g_queue_push_tail (GQueue *queue, + gpointer data); +void g_queue_push_nth (GQueue *queue, + gpointer data, + gint n); +gpointer g_queue_pop_head (GQueue *queue); +gpointer g_queue_pop_tail (GQueue *queue); +gpointer g_queue_pop_nth (GQueue *queue, + guint n); +gpointer g_queue_peek_head (GQueue *queue); +gpointer g_queue_peek_tail (GQueue *queue); +gpointer g_queue_peek_nth (GQueue *queue, + guint n); +gint g_queue_index (GQueue *queue, + gconstpointer data); +void g_queue_remove (GQueue *queue, + gconstpointer data); +void g_queue_remove_all (GQueue *queue, + gconstpointer data); +void g_queue_insert_before (GQueue *queue, + GList *sibling, + gpointer data); +void g_queue_insert_after (GQueue *queue, + GList *sibling, + gpointer data); +void g_queue_insert_sorted (GQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data); + +void g_queue_push_head_link (GQueue *queue, + GList *link_); +void g_queue_push_tail_link (GQueue *queue, + GList *link_); +void g_queue_push_nth_link (GQueue *queue, + gint n, + GList *link_); +GList* g_queue_pop_head_link (GQueue *queue); +GList* g_queue_pop_tail_link (GQueue *queue); +GList* g_queue_pop_nth_link (GQueue *queue, + guint n); +GList* g_queue_peek_head_link (GQueue *queue); +GList* g_queue_peek_tail_link (GQueue *queue); +GList* g_queue_peek_nth_link (GQueue *queue, + guint n); +gint g_queue_link_index (GQueue *queue, + GList *link_); +void g_queue_unlink (GQueue *queue, + GList *link_); +void g_queue_delete_link (GQueue *queue, + GList *link_); + +G_END_DECLS + +#endif /* __G_QUEUE_H__ */ diff --git a/glib/grand.c b/glib/grand.c new file mode 100644 index 0000000..231ed13 --- /dev/null +++ b/glib/grand.c @@ -0,0 +1,700 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* Originally developed and coded by Makoto Matsumoto and Takuji + * Nishimura. Please mail , if you're using + * code from this file in your own programs or libraries. + * Further information on the Mersenne Twister can be found at + * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + * This code was adapted to glib by Sebastian Wilhelmi. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "glib.h" +#include "gthreadprivate.h" +#include "galias.h" + +#ifdef G_OS_WIN32 +#include /* For getpid() */ +#endif + +/** + * SECTION: random_numbers + * @title: Random Numbers + * @short_description: pseudo-random number generator + * + * The following functions allow you to use a portable, fast and good + * pseudo-random number generator (PRNG). It uses the Mersenne Twister + * PRNG, which was originally developed by Makoto Matsumoto and Takuji + * Nishimura. Further information can be found at + * + * www.math.keio.ac.jp/~matumoto/emt.html. + * + * If you just need a random number, you simply call the + * g_random_* functions, which will create a + * globally used #GRand and use the according + * g_rand_* functions internally. Whenever you + * need a stream of reproducible random numbers, you better create a + * #GRand yourself and use the g_rand_* functions + * directly, which will also be slightly faster. Initializing a #GRand + * with a certain seed will produce exactly the same series of random + * numbers on all platforms. This can thus be used as a seed for e.g. + * games. + * + * The g_rand*_range functions will return high + * quality equally distributed random numbers, whereas for example the + * (g_random_int()%max) approach often + * doesn't yield equally distributed numbers. + * + * GLib changed the seeding algorithm for the pseudo-random number + * generator Mersenne Twister, as used by + * GRand and GRandom. + * This was necessary, because some seeds would yield very bad + * pseudo-random streams. Also the pseudo-random integers generated by + * g_rand*_int_range() will have a slightly better + * equal distribution with the new version of GLib. + * + * The original seeding and generation algorithms, as found in GLib + * 2.0.x, can be used instead of the new ones by setting the + * environment variable G_RANDOM_VERSION to the value of + * '2.0'. Use the GLib-2.0 algorithms only if you have sequences of + * numbers generated with Glib-2.0 that you need to reproduce exactly. + **/ + +/** + * GRand: + * + * The #GRand struct is an opaque data structure. It should only be + * accessed through the g_rand_* functions. + **/ + +G_LOCK_DEFINE_STATIC (global_random); +static GRand* global_random = NULL; + +/* Period parameters */ +#define N 624 +#define M 397 +#define MATRIX_A 0x9908b0df /* constant vector a */ +#define UPPER_MASK 0x80000000 /* most significant w-r bits */ +#define LOWER_MASK 0x7fffffff /* least significant r bits */ + +/* Tempering parameters */ +#define TEMPERING_MASK_B 0x9d2c5680 +#define TEMPERING_MASK_C 0xefc60000 +#define TEMPERING_SHIFT_U(y) (y >> 11) +#define TEMPERING_SHIFT_S(y) (y << 7) +#define TEMPERING_SHIFT_T(y) (y << 15) +#define TEMPERING_SHIFT_L(y) (y >> 18) + +static guint +get_random_version (void) +{ + static gboolean initialized = FALSE; + static guint random_version; + + if (!initialized) + { + const gchar *version_string = g_getenv ("G_RANDOM_VERSION"); + if (!version_string || version_string[0] == '\000' || + strcmp (version_string, "2.2") == 0) + random_version = 22; + else if (strcmp (version_string, "2.0") == 0) + random_version = 20; + else + { + g_warning ("Unknown G_RANDOM_VERSION \"%s\". Using version 2.2.", + version_string); + random_version = 22; + } + initialized = TRUE; + } + + return random_version; +} + +/* This is called from g_thread_init(). It's used to + * initialize some static data in a threadsafe way. + */ +void +_g_rand_thread_init (void) +{ + (void)get_random_version (); +} + +struct _GRand +{ + guint32 mt[N]; /* the array for the state vector */ + guint mti; +}; + +/** + * g_rand_new_with_seed: + * @seed: a value to initialize the random number generator. + * + * Creates a new random number generator initialized with @seed. + * + * Return value: the new #GRand. + **/ +GRand* +g_rand_new_with_seed (guint32 seed) +{ + GRand *rand = g_new0 (GRand, 1); + g_rand_set_seed (rand, seed); + return rand; +} + +/** + * g_rand_new_with_seed_array: + * @seed: an array of seeds to initialize the random number generator. + * @seed_length: an array of seeds to initialize the random number generator. + * + * Creates a new random number generator initialized with @seed. + * + * Return value: the new #GRand. + * + * Since: 2.4 + **/ +GRand* +g_rand_new_with_seed_array (const guint32 *seed, guint seed_length) +{ + GRand *rand = g_new0 (GRand, 1); + g_rand_set_seed_array (rand, seed, seed_length); + return rand; +} + +/** + * g_rand_new: + * + * Creates a new random number generator initialized with a seed taken + * either from /dev/urandom (if existing) or from + * the current time (as a fallback). + * + * Return value: the new #GRand. + **/ +GRand* +g_rand_new (void) +{ + guint32 seed[4]; + GTimeVal now; +#ifdef G_OS_UNIX + static gboolean dev_urandom_exists = TRUE; + + if (dev_urandom_exists) + { + FILE* dev_urandom; + + do + { + errno = 0; + dev_urandom = fopen("/dev/urandom", "rb"); + } + while G_UNLIKELY (errno == EINTR); + + if (dev_urandom) + { + int r; + + setvbuf (dev_urandom, NULL, _IONBF, 0); + do + { + errno = 0; + r = fread (seed, sizeof (seed), 1, dev_urandom); + } + while G_UNLIKELY (errno == EINTR); + + if (r != 1) + dev_urandom_exists = FALSE; + + fclose (dev_urandom); + } + else + dev_urandom_exists = FALSE; + } +#else + static gboolean dev_urandom_exists = FALSE; +#endif + + if (!dev_urandom_exists) + { + g_get_current_time (&now); + seed[0] = now.tv_sec; + seed[1] = now.tv_usec; + seed[2] = getpid (); +#ifdef G_OS_UNIX + seed[3] = getppid (); +#else + seed[3] = 0; +#endif + } + + return g_rand_new_with_seed_array (seed, 4); +} + +/** + * g_rand_free: + * @rand_: a #GRand. + * + * Frees the memory allocated for the #GRand. + **/ +void +g_rand_free (GRand* rand) +{ + g_return_if_fail (rand != NULL); + + g_free (rand); +} + +/** + * g_rand_copy: + * @rand_: a #GRand. + * + * Copies a #GRand into a new one with the same exact state as before. + * This way you can take a snapshot of the random number generator for + * replaying later. + * + * Return value: the new #GRand. + * + * Since: 2.4 + **/ +GRand * +g_rand_copy (GRand* rand) +{ + GRand* new_rand; + + g_return_val_if_fail (rand != NULL, NULL); + + new_rand = g_new0 (GRand, 1); + memcpy (new_rand, rand, sizeof (GRand)); + + return new_rand; +} + +/** + * g_rand_set_seed: + * @rand_: a #GRand. + * @seed: a value to reinitialize the random number generator. + * + * Sets the seed for the random number generator #GRand to @seed. + **/ +void +g_rand_set_seed (GRand* rand, guint32 seed) +{ + g_return_if_fail (rand != NULL); + + switch (get_random_version ()) + { + case 20: + /* setting initial seeds to mt[N] using */ + /* the generator Line 25 of Table 1 in */ + /* [KNUTH 1981, The Art of Computer Programming */ + /* Vol. 2 (2nd Ed.), pp102] */ + + if (seed == 0) /* This would make the PRNG procude only zeros */ + seed = 0x6b842128; /* Just set it to another number */ + + rand->mt[0]= seed; + for (rand->mti=1; rand->mtimti++) + rand->mt[rand->mti] = (69069 * rand->mt[rand->mti-1]); + + break; + case 22: + /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ + /* In the previous version (see above), MSBs of the */ + /* seed affect only MSBs of the array mt[]. */ + + rand->mt[0]= seed; + for (rand->mti=1; rand->mtimti++) + rand->mt[rand->mti] = 1812433253UL * + (rand->mt[rand->mti-1] ^ (rand->mt[rand->mti-1] >> 30)) + rand->mti; + break; + default: + g_assert_not_reached (); + } +} + +/** + * g_rand_set_seed_array: + * @rand_: a #GRand. + * @seed: array to initialize with + * @seed_length: length of array + * + * Initializes the random number generator by an array of + * longs. Array can be of arbitrary size, though only the + * first 624 values are taken. This function is useful + * if you have many low entropy seeds, or if you require more then + * 32bits of actual entropy for your application. + * + * Since: 2.4 + **/ +void +g_rand_set_seed_array (GRand* rand, const guint32 *seed, guint seed_length) +{ + int i, j, k; + + g_return_if_fail (rand != NULL); + g_return_if_fail (seed_length >= 1); + + g_rand_set_seed (rand, 19650218UL); + + i=1; j=0; + k = (N>seed_length ? N : seed_length); + for (; k; k--) + { + rand->mt[i] = (rand->mt[i] ^ + ((rand->mt[i-1] ^ (rand->mt[i-1] >> 30)) * 1664525UL)) + + seed[j] + j; /* non linear */ + rand->mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; j++; + if (i>=N) + { + rand->mt[0] = rand->mt[N-1]; + i=1; + } + if (j>=seed_length) + j=0; + } + for (k=N-1; k; k--) + { + rand->mt[i] = (rand->mt[i] ^ + ((rand->mt[i-1] ^ (rand->mt[i-1] >> 30)) * 1566083941UL)) + - i; /* non linear */ + rand->mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ + i++; + if (i>=N) + { + rand->mt[0] = rand->mt[N-1]; + i=1; + } + } + + rand->mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ +} + +/** + * g_rand_boolean: + * @rand_: a #GRand. + * @Returns: a random #gboolean. + * + * Returns a random #gboolean from @rand_. This corresponds to a + * unbiased coin toss. + **/ +/** + * g_rand_int: + * @rand_: a #GRand. + * + * Returns the next random #guint32 from @rand_ equally distributed over + * the range [0..2^32-1]. + * + * Return value: A random number. + **/ +guint32 +g_rand_int (GRand* rand) +{ + guint32 y; + static const guint32 mag01[2]={0x0, MATRIX_A}; + /* mag01[x] = x * MATRIX_A for x=0,1 */ + + g_return_val_if_fail (rand != NULL, 0); + + if (rand->mti >= N) { /* generate N words at one time */ + int kk; + + for (kk=0;kkmt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK); + rand->mt[kk] = rand->mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1]; + } + for (;kkmt[kk]&UPPER_MASK)|(rand->mt[kk+1]&LOWER_MASK); + rand->mt[kk] = rand->mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1]; + } + y = (rand->mt[N-1]&UPPER_MASK)|(rand->mt[0]&LOWER_MASK); + rand->mt[N-1] = rand->mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1]; + + rand->mti = 0; + } + + y = rand->mt[rand->mti++]; + y ^= TEMPERING_SHIFT_U(y); + y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B; + y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C; + y ^= TEMPERING_SHIFT_L(y); + + return y; +} + +/* transform [0..2^32] -> [0..1] */ +#define G_RAND_DOUBLE_TRANSFORM 2.3283064365386962890625e-10 + +/** + * g_rand_int_range: + * @rand_: a #GRand. + * @begin: lower closed bound of the interval. + * @end: upper open bound of the interval. + * + * Returns the next random #gint32 from @rand_ equally distributed over + * the range [@begin..@end-1]. + * + * Return value: A random number. + **/ +gint32 +g_rand_int_range (GRand* rand, gint32 begin, gint32 end) +{ + guint32 dist = end - begin; + guint32 random; + + g_return_val_if_fail (rand != NULL, begin); + g_return_val_if_fail (end > begin, begin); + + switch (get_random_version ()) + { + case 20: + if (dist <= 0x10000L) /* 2^16 */ + { + /* This method, which only calls g_rand_int once is only good + * for (end - begin) <= 2^16, because we only have 32 bits set + * from the one call to g_rand_int (). */ + + /* we are using (trans + trans * trans), because g_rand_int only + * covers [0..2^32-1] and thus g_rand_int * trans only covers + * [0..1-2^-32], but the biggest double < 1 is 1-2^-52. + */ + + gdouble double_rand = g_rand_int (rand) * + (G_RAND_DOUBLE_TRANSFORM + + G_RAND_DOUBLE_TRANSFORM * G_RAND_DOUBLE_TRANSFORM); + + random = (gint32) (double_rand * dist); + } + else + { + /* Now we use g_rand_double_range (), which will set 52 bits for + us, so that it is safe to round and still get a decent + distribution */ + random = (gint32) g_rand_double_range (rand, 0, dist); + } + break; + case 22: + if (dist == 0) + random = 0; + else + { + /* maxvalue is set to the predecessor of the greatest + * multiple of dist less or equal 2^32. */ + guint32 maxvalue; + if (dist <= 0x80000000u) /* 2^31 */ + { + /* maxvalue = 2^32 - 1 - (2^32 % dist) */ + guint32 leftover = (0x80000000u % dist) * 2; + if (leftover >= dist) leftover -= dist; + maxvalue = 0xffffffffu - leftover; + } + else + maxvalue = dist - 1; + + do + random = g_rand_int (rand); + while (random > maxvalue); + + random %= dist; + } + break; + default: + random = 0; /* Quiet GCC */ + g_assert_not_reached (); + } + + return begin + random; +} + +/** + * g_rand_double: + * @rand_: a #GRand. + * + * Returns the next random #gdouble from @rand_ equally distributed over + * the range [0..1). + * + * Return value: A random number. + **/ +gdouble +g_rand_double (GRand* rand) +{ + /* We set all 52 bits after the point for this, not only the first + 32. Thats why we need two calls to g_rand_int */ + gdouble retval = g_rand_int (rand) * G_RAND_DOUBLE_TRANSFORM; + retval = (retval + g_rand_int (rand)) * G_RAND_DOUBLE_TRANSFORM; + + /* The following might happen due to very bad rounding luck, but + * actually this should be more than rare, we just try again then */ + if (retval >= 1.0) + return g_rand_double (rand); + + return retval; +} + +/** + * g_rand_double_range: + * @rand_: a #GRand. + * @begin: lower closed bound of the interval. + * @end: upper open bound of the interval. + * + * Returns the next random #gdouble from @rand_ equally distributed over + * the range [@begin..@end). + * + * Return value: A random number. + **/ +gdouble +g_rand_double_range (GRand* rand, gdouble begin, gdouble end) +{ + return g_rand_double (rand) * (end - begin) + begin; +} + +/** + * g_random_boolean: + * @Returns: a random #gboolean. + * + * Returns a random #gboolean. This corresponds to a unbiased coin toss. + **/ +/** + * g_random_int: + * + * Return a random #guint32 equally distributed over the range + * [0..2^32-1]. + * + * Return value: A random number. + **/ +guint32 +g_random_int (void) +{ + guint32 result; + G_LOCK (global_random); + if (!global_random) + global_random = g_rand_new (); + + result = g_rand_int (global_random); + G_UNLOCK (global_random); + return result; +} + +/** + * g_random_int_range: + * @begin: lower closed bound of the interval. + * @end: upper open bound of the interval. + * + * Returns a random #gint32 equally distributed over the range + * [@begin..@end-1]. + * + * Return value: A random number. + **/ +gint32 +g_random_int_range (gint32 begin, gint32 end) +{ + gint32 result; + G_LOCK (global_random); + if (!global_random) + global_random = g_rand_new (); + + result = g_rand_int_range (global_random, begin, end); + G_UNLOCK (global_random); + return result; +} + +/** + * g_random_double: + * + * Returns a random #gdouble equally distributed over the range [0..1). + * + * Return value: A random number. + **/ +gdouble +g_random_double (void) +{ + double result; + G_LOCK (global_random); + if (!global_random) + global_random = g_rand_new (); + + result = g_rand_double (global_random); + G_UNLOCK (global_random); + return result; +} + +/** + * g_random_double_range: + * @begin: lower closed bound of the interval. + * @end: upper open bound of the interval. + * + * Returns a random #gdouble equally distributed over the range [@begin..@end). + * + * Return value: A random number. + **/ +gdouble +g_random_double_range (gdouble begin, gdouble end) +{ + double result; + G_LOCK (global_random); + if (!global_random) + global_random = g_rand_new (); + + result = g_rand_double_range (global_random, begin, end); + G_UNLOCK (global_random); + return result; +} + +/** + * g_random_set_seed: + * @seed: a value to reinitialize the global random number generator. + * + * Sets the seed for the global random number generator, which is used + * by the g_random_* functions, to @seed. + **/ +void +g_random_set_seed (guint32 seed) +{ + G_LOCK (global_random); + if (!global_random) + global_random = g_rand_new_with_seed (seed); + else + g_rand_set_seed (global_random, seed); + G_UNLOCK (global_random); +} + + +#define __G_RAND_C__ +#include "galiasdef.c" diff --git a/glib/grand.h b/glib/grand.h new file mode 100644 index 0000000..07907df --- /dev/null +++ b/glib/grand.h @@ -0,0 +1,85 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_RAND_H__ +#define __G_RAND_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GRand GRand; + +/* GRand - a good and fast random number generator: Mersenne Twister + * see http://www.math.keio.ac.jp/~matumoto/emt.html for more info. + * The range functions return a value in the intervall [begin, end). + * int -> [0..2^32-1] + * int_range -> [begin..end-1] + * double -> [0..1) + * double_range -> [begin..end) + */ + +GRand* g_rand_new_with_seed (guint32 seed); +GRand* g_rand_new_with_seed_array (const guint32 *seed, + guint seed_length); +GRand* g_rand_new (void); +void g_rand_free (GRand *rand_); +GRand* g_rand_copy (GRand *rand_); +void g_rand_set_seed (GRand *rand_, + guint32 seed); +void g_rand_set_seed_array (GRand *rand_, + const guint32 *seed, + guint seed_length); + +#define g_rand_boolean(rand_) ((g_rand_int (rand_) & (1 << 15)) != 0) + +guint32 g_rand_int (GRand *rand_); +gint32 g_rand_int_range (GRand *rand_, + gint32 begin, + gint32 end); +gdouble g_rand_double (GRand *rand_); +gdouble g_rand_double_range (GRand *rand_, + gdouble begin, + gdouble end); +void g_random_set_seed (guint32 seed); + +#define g_random_boolean() ((g_random_int () & (1 << 15)) != 0) + +guint32 g_random_int (void); +gint32 g_random_int_range (gint32 begin, + gint32 end); +gdouble g_random_double (void); +gdouble g_random_double_range (gdouble begin, + gdouble end); + + +G_END_DECLS + +#endif /* __G_RAND_H__ */ diff --git a/glib/gregex.c b/glib/gregex.c new file mode 100644 index 0000000..7e3448f --- /dev/null +++ b/glib/gregex.c @@ -0,0 +1,2758 @@ +/* GRegex -- regular expression API wrapper around PCRE. + * + * Copyright (C) 1999, 2000 Scott Wimer + * Copyright (C) 2004, Matthias Clasen + * Copyright (C) 2005 - 2007, Marco Barisione + * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include + +#include "glib.h" +#include "glibintl.h" +#include "gregex.h" + +#ifdef USE_SYSTEM_PCRE +#include +#else +#include "pcre/pcre.h" +#endif + +/* PCRE 7.3 does not contain the definition of PCRE_ERROR_NULLWSLIMIT */ +#ifndef PCRE_ERROR_NULLWSLIMIT +#define PCRE_ERROR_NULLWSLIMIT (-22) +#endif + +#include "galias.h" + +/* Mask of all the possible values for GRegexCompileFlags. */ +#define G_REGEX_COMPILE_MASK (G_REGEX_CASELESS | \ + G_REGEX_MULTILINE | \ + G_REGEX_DOTALL | \ + G_REGEX_EXTENDED | \ + G_REGEX_ANCHORED | \ + G_REGEX_DOLLAR_ENDONLY | \ + G_REGEX_UNGREEDY | \ + G_REGEX_RAW | \ + G_REGEX_NO_AUTO_CAPTURE | \ + G_REGEX_OPTIMIZE | \ + G_REGEX_DUPNAMES | \ + G_REGEX_NEWLINE_CR | \ + G_REGEX_NEWLINE_LF | \ + G_REGEX_NEWLINE_CRLF) + +/* Mask of all the possible values for GRegexMatchFlags. */ +#define G_REGEX_MATCH_MASK (G_REGEX_MATCH_ANCHORED | \ + G_REGEX_MATCH_NOTBOL | \ + G_REGEX_MATCH_NOTEOL | \ + G_REGEX_MATCH_NOTEMPTY | \ + G_REGEX_MATCH_PARTIAL | \ + G_REGEX_MATCH_NEWLINE_CR | \ + G_REGEX_MATCH_NEWLINE_LF | \ + G_REGEX_MATCH_NEWLINE_CRLF | \ + G_REGEX_MATCH_NEWLINE_ANY) + +/* if the string is in UTF-8 use g_utf8_ functions, else use + * use just +/- 1. */ +#define NEXT_CHAR(re, s) (((re)->compile_opts & PCRE_UTF8) ? \ + g_utf8_next_char (s) : \ + ((s) + 1)) +#define PREV_CHAR(re, s) (((re)->compile_opts & PCRE_UTF8) ? \ + g_utf8_prev_char (s) : \ + ((s) - 1)) + +struct _GMatchInfo +{ + GRegex *regex; /* the regex */ + GRegexMatchFlags match_opts; /* options used at match time on the regex */ + gint matches; /* number of matching sub patterns */ + gint pos; /* position in the string where last match left off */ + gint *offsets; /* array of offsets paired 0,1 ; 2,3 ; 3,4 etc */ + gint n_offsets; /* number of offsets */ + gint *workspace; /* workspace for pcre_dfa_exec() */ + gint n_workspace; /* number of workspace elements */ + const gchar *string; /* string passed to the match function */ + gssize string_len; /* length of string */ +}; + +struct _GRegex +{ + volatile gint ref_count; /* the ref count for the immutable part */ + gchar *pattern; /* the pattern */ + pcre *pcre_re; /* compiled form of the pattern */ + GRegexCompileFlags compile_opts; /* options used at compile time on the pattern */ + GRegexMatchFlags match_opts; /* options used at match time on the regex */ + pcre_extra *extra; /* data stored when G_REGEX_OPTIMIZE is used */ +}; + +/* TRUE if ret is an error code, FALSE otherwise. */ +#define IS_PCRE_ERROR(ret) ((ret) < PCRE_ERROR_NOMATCH && (ret) != PCRE_ERROR_PARTIAL) + +typedef struct _InterpolationData InterpolationData; +static gboolean interpolation_list_needs_match (GList *list); +static gboolean interpolate_replacement (const GMatchInfo *match_info, + GString *result, + gpointer data); +static GList *split_replacement (const gchar *replacement, + GError **error); +static void free_interpolation_data (InterpolationData *data); + + +static const gchar * +match_error (gint errcode) +{ + switch (errcode) + { + case PCRE_ERROR_NOMATCH: + /* not an error */ + break; + case PCRE_ERROR_NULL: + /* NULL argument, this should not happen in GRegex */ + g_warning ("A NULL argument was passed to PCRE"); + break; + case PCRE_ERROR_BADOPTION: + return "bad options"; + case PCRE_ERROR_BADMAGIC: + return _("corrupted object"); + case PCRE_ERROR_UNKNOWN_OPCODE: + return N_("internal error or corrupted object"); + case PCRE_ERROR_NOMEMORY: + return _("out of memory"); + case PCRE_ERROR_NOSUBSTRING: + /* not used by pcre_exec() */ + break; + case PCRE_ERROR_MATCHLIMIT: + return _("backtracking limit reached"); + case PCRE_ERROR_CALLOUT: + /* callouts are not implemented */ + break; + case PCRE_ERROR_BADUTF8: + case PCRE_ERROR_BADUTF8_OFFSET: + /* we do not check if strings are valid */ + break; + case PCRE_ERROR_PARTIAL: + /* not an error */ + break; + case PCRE_ERROR_BADPARTIAL: + return _("the pattern contains items not supported for partial matching"); + case PCRE_ERROR_INTERNAL: + return _("internal error"); + case PCRE_ERROR_BADCOUNT: + /* negative ovecsize, this should not happen in GRegex */ + g_warning ("A negative ovecsize was passed to PCRE"); + break; + case PCRE_ERROR_DFA_UITEM: + return _("the pattern contains items not supported for partial matching"); + case PCRE_ERROR_DFA_UCOND: + return _("back references as conditions are not supported for partial matching"); + case PCRE_ERROR_DFA_UMLIMIT: + /* the match_field field is not used in GRegex */ + break; + case PCRE_ERROR_DFA_WSSIZE: + /* handled expanding the workspace */ + break; + case PCRE_ERROR_DFA_RECURSE: + case PCRE_ERROR_RECURSIONLIMIT: + return _("recursion limit reached"); + case PCRE_ERROR_NULLWSLIMIT: + return _("workspace limit for empty substrings reached"); + case PCRE_ERROR_BADNEWLINE: + return _("invalid combination of newline flags"); + default: + break; + } + return _("unknown error"); +} + +static void +translate_compile_error (gint *errcode, const gchar **errmsg) +{ + /* Compile errors are created adding 100 to the error code returned + * by PCRE. + * If errcode is known we put the translatable error message in + * erromsg. If errcode is unknown we put the generic + * G_REGEX_ERROR_COMPILE error code in errcode and keep the + * untranslated error message returned by PCRE. + * Note that there can be more PCRE errors with the same GRegexError + * and that some PCRE errors are useless for us. + */ + *errcode += 100; + + switch (*errcode) + { + case G_REGEX_ERROR_STRAY_BACKSLASH: + *errmsg = _("\\ at end of pattern"); + break; + case G_REGEX_ERROR_MISSING_CONTROL_CHAR: + *errmsg = _("\\c at end of pattern"); + break; + case G_REGEX_ERROR_UNRECOGNIZED_ESCAPE: + *errmsg = _("unrecognized character follows \\"); + break; + case 137: + /* A number of Perl escapes are not handled by PCRE. + * Therefore it explicitly raises ERR37. + */ + *errcode = G_REGEX_ERROR_UNRECOGNIZED_ESCAPE; + *errmsg = _("case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here"); + break; + case G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER: + *errmsg = _("numbers out of order in {} quantifier"); + break; + case G_REGEX_ERROR_QUANTIFIER_TOO_BIG: + *errmsg = _("number too big in {} quantifier"); + break; + case G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS: + *errmsg = _("missing terminating ] for character class"); + break; + case G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS: + *errmsg = _("invalid escape sequence in character class"); + break; + case G_REGEX_ERROR_RANGE_OUT_OF_ORDER: + *errmsg = _("range out of order in character class"); + break; + case G_REGEX_ERROR_NOTHING_TO_REPEAT: + *errmsg = _("nothing to repeat"); + break; + case G_REGEX_ERROR_UNRECOGNIZED_CHARACTER: + *errmsg = _("unrecognized character after (?"); + break; + case 124: + *errcode = G_REGEX_ERROR_UNRECOGNIZED_CHARACTER; + *errmsg = _("unrecognized character after (?<"); + break; + case 141: + *errcode = G_REGEX_ERROR_UNRECOGNIZED_CHARACTER; + *errmsg = _("unrecognized character after (?P"); + break; + case G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS: + *errmsg = _("POSIX named classes are supported only within a class"); + break; + case G_REGEX_ERROR_UNMATCHED_PARENTHESIS: + *errmsg = _("missing terminating )"); + break; + case 122: + *errcode = G_REGEX_ERROR_UNMATCHED_PARENTHESIS; + *errmsg = _(") without opening ("); + break; + case 129: + *errcode = G_REGEX_ERROR_UNMATCHED_PARENTHESIS; + /* translators: '(?R' and '(?[+-]digits' are both meant as (groups of) + * sequences here, '(?-54' would be an example for the second group. + */ + *errmsg = _("(?R or (?[+-]digits must be followed by )"); + break; + case G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE: + *errmsg = _("reference to non-existent subpattern"); + break; + case G_REGEX_ERROR_UNTERMINATED_COMMENT: + *errmsg = _("missing ) after comment"); + break; + case G_REGEX_ERROR_EXPRESSION_TOO_LARGE: + *errmsg = _("regular expression too large"); + break; + case G_REGEX_ERROR_MEMORY_ERROR: + *errmsg = _("failed to get memory"); + break; + case G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND: + *errmsg = _("lookbehind assertion is not fixed length"); + break; + case G_REGEX_ERROR_MALFORMED_CONDITION: + *errmsg = _("malformed number or name after (?("); + break; + case G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES: + *errmsg = _("conditional group contains more than two branches"); + break; + case G_REGEX_ERROR_ASSERTION_EXPECTED: + *errmsg = _("assertion expected after (?("); + break; + case G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME: + *errmsg = _("unknown POSIX class name"); + break; + case G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED: + *errmsg = _("POSIX collating elements are not supported"); + break; + case G_REGEX_ERROR_HEX_CODE_TOO_LARGE: + *errmsg = _("character value in \\x{...} sequence is too large"); + break; + case G_REGEX_ERROR_INVALID_CONDITION: + *errmsg = _("invalid condition (?(0)"); + break; + case G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND: + *errmsg = _("\\C not allowed in lookbehind assertion"); + break; + case G_REGEX_ERROR_INFINITE_LOOP: + *errmsg = _("recursive call could loop indefinitely"); + break; + case G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR: + *errmsg = _("missing terminator in subpattern name"); + break; + case G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME: + *errmsg = _("two named subpatterns have the same name"); + break; + case G_REGEX_ERROR_MALFORMED_PROPERTY: + *errmsg = _("malformed \\P or \\p sequence"); + break; + case G_REGEX_ERROR_UNKNOWN_PROPERTY: + *errmsg = _("unknown property name after \\P or \\p"); + break; + case G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG: + *errmsg = _("subpattern name is too long (maximum 32 characters)"); + break; + case G_REGEX_ERROR_TOO_MANY_SUBPATTERNS: + *errmsg = _("too many named subpatterns (maximum 10,000)"); + break; + case G_REGEX_ERROR_INVALID_OCTAL_VALUE: + *errmsg = _("octal value is greater than \\377"); + break; + case G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE: + *errmsg = _("DEFINE group contains more than one branch"); + break; + case G_REGEX_ERROR_DEFINE_REPETION: + *errmsg = _("repeating a DEFINE group is not allowed"); + break; + case G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS: + *errmsg = _("inconsistent NEWLINE options"); + break; + case G_REGEX_ERROR_MISSING_BACK_REFERENCE: + *errmsg = _("\\g is not followed by a braced name or an optionally " + "braced non-zero number"); + break; + case 11: + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("unexpected repeat"); + break; + case 23: + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("code overflow"); + break; + case 52: + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("overran compiling workspace"); + break; + case 53: + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("previously-checked referenced subpattern not found"); + break; + case 16: + /* This should not happen as we never pass a NULL erroffset */ + g_warning ("erroffset passed as NULL"); + *errcode = G_REGEX_ERROR_COMPILE; + break; + case 17: + /* This should not happen as we check options before passing them + * to pcre_compile2() */ + g_warning ("unknown option bit(s) set"); + *errcode = G_REGEX_ERROR_COMPILE; + break; + case 32: + case 44: + case 45: + /* These errors should not happen as we are using an UTF8-enabled PCRE + * and we do not check if strings are valid */ + g_warning ("%s", *errmsg); + *errcode = G_REGEX_ERROR_COMPILE; + break; + default: + *errcode = G_REGEX_ERROR_COMPILE; + } +} + +/* GMatchInfo */ + +static GMatchInfo * +match_info_new (const GRegex *regex, + const gchar *string, + gint string_len, + gint start_position, + gint match_options, + gboolean is_dfa) +{ + GMatchInfo *match_info; + + if (string_len < 0) + string_len = strlen (string); + + match_info = g_new0 (GMatchInfo, 1); + match_info->regex = g_regex_ref ((GRegex *)regex); + match_info->string = string; + match_info->string_len = string_len; + match_info->matches = PCRE_ERROR_NOMATCH; + match_info->pos = start_position; + match_info->match_opts = match_options; + + if (is_dfa) + { + /* These values should be enough for most cases, if they are not + * enough g_regex_match_all_full() will expand them. */ + match_info->n_offsets = 24; + match_info->n_workspace = 100; + match_info->workspace = g_new (gint, match_info->n_workspace); + } + else + { + gint capture_count; + pcre_fullinfo (regex->pcre_re, regex->extra, + PCRE_INFO_CAPTURECOUNT, &capture_count); + match_info->n_offsets = (capture_count + 1) * 3; + } + + match_info->offsets = g_new0 (gint, match_info->n_offsets); + /* Set an invalid position for the previous match. */ + match_info->offsets[0] = -1; + match_info->offsets[1] = -1; + + return match_info; +} + +/** + * g_match_info_get_regex: + * @match_info: a #GMatchInfo + * + * Returns #GRegex object used in @match_info. It belongs to Glib + * and must not be freed. Use g_regex_ref() if you need to keep it + * after you free @match_info object. + * + * Returns: #GRegex object used in @match_info + * + * Since: 2.14 + */ +GRegex * +g_match_info_get_regex (const GMatchInfo *match_info) +{ + g_return_val_if_fail (match_info != NULL, NULL); + return match_info->regex; +} + +/** + * g_match_info_get_string: + * @match_info: a #GMatchInfo + * + * Returns the string searched with @match_info. This is the + * string passed to g_regex_match() or g_regex_replace() so + * you may not free it before calling this function. + * + * Returns: the string searched with @match_info + * + * Since: 2.14 + */ +const gchar * +g_match_info_get_string (const GMatchInfo *match_info) +{ + g_return_val_if_fail (match_info != NULL, NULL); + return match_info->string; +} + +/** + * g_match_info_free: + * @match_info: a #GMatchInfo + * + * Frees all the memory associated with the #GMatchInfo structure. + * + * Since: 2.14 + */ +void +g_match_info_free (GMatchInfo *match_info) +{ + if (match_info) + { + g_regex_unref (match_info->regex); + g_free (match_info->offsets); + g_free (match_info->workspace); + g_free (match_info); + } +} + +/** + * g_match_info_next: + * @match_info: a #GMatchInfo structure + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Scans for the next match using the same parameters of the previous + * call to g_regex_match_full() or g_regex_match() that returned + * @match_info. + * + * The match is done on the string passed to the match function, so you + * cannot free it before calling this function. + * + * Returns: %TRUE is the string matched, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_match_info_next (GMatchInfo *match_info, + GError **error) +{ + gint prev_match_start; + gint prev_match_end; + + g_return_val_if_fail (match_info != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + g_return_val_if_fail (match_info->pos >= 0, FALSE); + + prev_match_start = match_info->offsets[0]; + prev_match_end = match_info->offsets[1]; + + match_info->matches = pcre_exec (match_info->regex->pcre_re, + match_info->regex->extra, + match_info->string, + match_info->string_len, + match_info->pos, + match_info->regex->match_opts | match_info->match_opts, + match_info->offsets, + match_info->n_offsets); + if (IS_PCRE_ERROR (match_info->matches)) + { + g_set_error (error, G_REGEX_ERROR, G_REGEX_ERROR_MATCH, + _("Error while matching regular expression %s: %s"), + match_info->regex->pattern, match_error (match_info->matches)); + return FALSE; + } + + /* avoid infinite loops if the pattern is an empty string or something + * equivalent */ + if (match_info->pos == match_info->offsets[1]) + { + if (match_info->pos > match_info->string_len) + { + /* we have reached the end of the string */ + match_info->pos = -1; + match_info->matches = PCRE_ERROR_NOMATCH; + return FALSE; + } + + match_info->pos = NEXT_CHAR (match_info->regex, + &match_info->string[match_info->pos]) - + match_info->string; + } + else + { + match_info->pos = match_info->offsets[1]; + } + + /* it's possibile to get two identical matches when we are matching + * empty strings, for instance if the pattern is "(?=[A-Z0-9])" and + * the string is "RegExTest" we have: + * - search at position 0: match from 0 to 0 + * - search at position 1: match from 3 to 3 + * - search at position 3: match from 3 to 3 (duplicate) + * - search at position 4: match from 5 to 5 + * - search at position 5: match from 5 to 5 (duplicate) + * - search at position 6: no match -> stop + * so we have to ignore the duplicates. + * see bug #515944: http://bugzilla.gnome.org/show_bug.cgi?id=515944 */ + if (match_info->matches >= 0 && + prev_match_start == match_info->offsets[0] && + prev_match_end == match_info->offsets[1]) + { + /* ignore this match and search the next one */ + return g_match_info_next (match_info, error); + } + + return match_info->matches >= 0; +} + +/** + * g_match_info_matches: + * @match_info: a #GMatchInfo structure + * + * Returns whether the previous match operation succeeded. + * + * Returns: %TRUE if the previous match operation succeeded, + * %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_match_info_matches (const GMatchInfo *match_info) +{ + g_return_val_if_fail (match_info != NULL, FALSE); + + return match_info->matches >= 0; +} + +/** + * g_match_info_get_match_count: + * @match_info: a #GMatchInfo structure + * + * Retrieves the number of matched substrings (including substring 0, + * that is the whole matched text), so 1 is returned if the pattern + * has no substrings in it and 0 is returned if the match failed. + * + * If the last match was obtained using the DFA algorithm, that is + * using g_regex_match_all() or g_regex_match_all_full(), the retrieved + * count is not that of the number of capturing parentheses but that of + * the number of matched substrings. + * + * Returns: Number of matched substrings, or -1 if an error occurred + * + * Since: 2.14 + */ +gint +g_match_info_get_match_count (const GMatchInfo *match_info) +{ + g_return_val_if_fail (match_info, -1); + + if (match_info->matches == PCRE_ERROR_NOMATCH) + /* no match */ + return 0; + else if (match_info->matches < PCRE_ERROR_NOMATCH) + /* error */ + return -1; + else + /* match */ + return match_info->matches; +} + +/** + * g_match_info_is_partial_match: + * @match_info: a #GMatchInfo structure + * + * Usually if the string passed to g_regex_match*() matches as far as + * it goes, but is too short to match the entire pattern, %FALSE is + * returned. There are circumstances where it might be helpful to + * distinguish this case from other cases in which there is no match. + * + * Consider, for example, an application where a human is required to + * type in data for a field with specific formatting requirements. An + * example might be a date in the form ddmmmyy, defined by the pattern + * "^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$". + * If the application sees the user’s keystrokes one by one, and can + * check that what has been typed so far is potentially valid, it is + * able to raise an error as soon as a mistake is made. + * + * GRegex supports the concept of partial matching by means of the + * #G_REGEX_MATCH_PARTIAL flag. When this is set the return code for + * g_regex_match() or g_regex_match_full() is, as usual, %TRUE + * for a complete match, %FALSE otherwise. But, when these functions + * return %FALSE, you can check if the match was partial calling + * g_match_info_is_partial_match(). + * + * When using partial matching you cannot use g_match_info_fetch*(). + * + * Because of the way certain internal optimizations are implemented + * the partial matching algorithm cannot be used with all patterns. + * So repeated single characters such as "a{2,4}" and repeated single + * meta-sequences such as "\d+" are not permitted if the maximum number + * of occurrences is greater than one. Optional items such as "\d?" + * (where the maximum is one) are permitted. Quantifiers with any values + * are permitted after parentheses, so the invalid examples above can be + * coded thus "(a){2,4}" and "(\d)+". If #G_REGEX_MATCH_PARTIAL is set + * for a pattern that does not conform to the restrictions, matching + * functions return an error. + * + * Returns: %TRUE if the match was partial, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_match_info_is_partial_match (const GMatchInfo *match_info) +{ + g_return_val_if_fail (match_info != NULL, FALSE); + + return match_info->matches == PCRE_ERROR_PARTIAL; +} + +/** + * g_match_info_expand_references: + * @match_info: a #GMatchInfo or %NULL + * @string_to_expand: the string to expand + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Returns a new string containing the text in @string_to_expand with + * references and escape sequences expanded. References refer to the last + * match done with @string against @regex and have the same syntax used by + * g_regex_replace(). + * + * The @string_to_expand must be UTF-8 encoded even if #G_REGEX_RAW was + * passed to g_regex_new(). + * + * The backreferences are extracted from the string passed to the match + * function, so you cannot call this function after freeing the string. + * + * @match_info may be %NULL in which case @string_to_expand must not + * contain references. For instance "foo\n" does not refer to an actual + * pattern and '\n' merely will be replaced with \n character, + * while to expand "\0" (whole match) one needs the result of a match. + * Use g_regex_check_replacement() to find out whether @string_to_expand + * contains references. + * + * Returns: the expanded string, or %NULL if an error occurred + * + * Since: 2.14 + */ +gchar * +g_match_info_expand_references (const GMatchInfo *match_info, + const gchar *string_to_expand, + GError **error) +{ + GString *result; + GList *list; + GError *tmp_error = NULL; + + g_return_val_if_fail (string_to_expand != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + list = split_replacement (string_to_expand, &tmp_error); + if (tmp_error != NULL) + { + g_propagate_error (error, tmp_error); + return NULL; + } + + if (!match_info && interpolation_list_needs_match (list)) + { + g_critical ("String '%s' contains references to the match, can't " + "expand references without GMatchInfo object", + string_to_expand); + return NULL; + } + + result = g_string_sized_new (strlen (string_to_expand)); + interpolate_replacement (match_info, result, list); + + g_list_foreach (list, (GFunc)free_interpolation_data, NULL); + g_list_free (list); + + return g_string_free (result, FALSE); +} + +/** + * g_match_info_fetch: + * @match_info: #GMatchInfo structure + * @match_num: number of the sub expression + * + * Retrieves the text matching the @match_num'th capturing + * parentheses. 0 is the full text of the match, 1 is the first paren + * set, 2 the second, and so on. + * + * If @match_num is a valid sub pattern but it didn't match anything + * (e.g. sub pattern 1, matching "b" against "(a)?b") then an empty + * string is returned. + * + * If the match was obtained using the DFA algorithm, that is using + * g_regex_match_all() or g_regex_match_all_full(), the retrieved + * string is not that of a set of parentheses but that of a matched + * substring. Substrings are matched in reverse order of length, so + * 0 is the longest match. + * + * The string is fetched from the string passed to the match function, + * so you cannot call this function after freeing the string. + * + * Returns: The matched substring, or %NULL if an error occurred. + * You have to free the string yourself + * + * Since: 2.14 + */ +gchar * +g_match_info_fetch (const GMatchInfo *match_info, + gint match_num) +{ + /* we cannot use pcre_get_substring() because it allocates the + * string using pcre_malloc(). */ + gchar *match = NULL; + gint start, end; + + g_return_val_if_fail (match_info != NULL, NULL); + g_return_val_if_fail (match_num >= 0, NULL); + + /* match_num does not exist or it didn't matched, i.e. matching "b" + * against "(a)?b" then group 0 is empty. */ + if (!g_match_info_fetch_pos (match_info, match_num, &start, &end)) + match = NULL; + else if (start == -1) + match = g_strdup (""); + else + match = g_strndup (&match_info->string[start], end - start); + + return match; +} + +/** + * g_match_info_fetch_pos: + * @match_info: #GMatchInfo structure + * @match_num: number of the sub expression + * @start_pos: pointer to location where to store the start position + * @end_pos: pointer to location where to store the end position + * + * Retrieves the position in bytes of the @match_num'th capturing + * parentheses. 0 is the full text of the match, 1 is the first + * paren set, 2 the second, and so on. + * + * If @match_num is a valid sub pattern but it didn't match anything + * (e.g. sub pattern 1, matching "b" against "(a)?b") then @start_pos + * and @end_pos are set to -1 and %TRUE is returned. + * + * If the match was obtained using the DFA algorithm, that is using + * g_regex_match_all() or g_regex_match_all_full(), the retrieved + * position is not that of a set of parentheses but that of a matched + * substring. Substrings are matched in reverse order of length, so + * 0 is the longest match. + * + * Returns: %TRUE if the position was fetched, %FALSE otherwise. If + * the position cannot be fetched, @start_pos and @end_pos are left + * unchanged + * + * Since: 2.14 + */ +gboolean +g_match_info_fetch_pos (const GMatchInfo *match_info, + gint match_num, + gint *start_pos, + gint *end_pos) +{ + g_return_val_if_fail (match_info != NULL, FALSE); + g_return_val_if_fail (match_num >= 0, FALSE); + + /* make sure the sub expression number they're requesting is less than + * the total number of sub expressions that were matched. */ + if (match_num >= match_info->matches) + return FALSE; + + if (start_pos != NULL) + *start_pos = match_info->offsets[2 * match_num]; + + if (end_pos != NULL) + *end_pos = match_info->offsets[2 * match_num + 1]; + + return TRUE; +} + +/* + * Returns number of first matched subpattern with name @name. + * There may be more than one in case when DUPNAMES is used, + * and not all subpatterns with that name match; + * pcre_get_stringnumber() does not work in that case. + */ +static gint +get_matched_substring_number (const GMatchInfo *match_info, + const gchar *name) +{ + gint entrysize; + gchar *first, *last; + guchar *entry; + + if (!(match_info->regex->compile_opts & G_REGEX_DUPNAMES)) + return pcre_get_stringnumber (match_info->regex->pcre_re, name); + + /* This code is copied from pcre_get.c: get_first_set() */ + entrysize = pcre_get_stringtable_entries (match_info->regex->pcre_re, + name, + &first, + &last); + + if (entrysize <= 0) + return entrysize; + + for (entry = (guchar*) first; entry <= (guchar*) last; entry += entrysize) + { + gint n = (entry[0] << 8) + entry[1]; + if (match_info->offsets[n*2] >= 0) + return n; + } + + return (first[0] << 8) + first[1]; +} + +/** + * g_match_info_fetch_named: + * @match_info: #GMatchInfo structure + * @name: name of the subexpression + * + * Retrieves the text matching the capturing parentheses named @name. + * + * If @name is a valid sub pattern name but it didn't match anything + * (e.g. sub pattern "X", matching "b" against "(?P<X>a)?b") + * then an empty string is returned. + * + * The string is fetched from the string passed to the match function, + * so you cannot call this function after freeing the string. + * + * Returns: The matched substring, or %NULL if an error occurred. + * You have to free the string yourself + * + * Since: 2.14 + */ +gchar * +g_match_info_fetch_named (const GMatchInfo *match_info, + const gchar *name) +{ + /* we cannot use pcre_get_named_substring() because it allocates the + * string using pcre_malloc(). */ + gint num; + + g_return_val_if_fail (match_info != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + num = get_matched_substring_number (match_info, name); + if (num < 0) + return NULL; + else + return g_match_info_fetch (match_info, num); +} + +/** + * g_match_info_fetch_named_pos: + * @match_info: #GMatchInfo structure + * @name: name of the subexpression + * @start_pos: pointer to location where to store the start position + * @end_pos: pointer to location where to store the end position + * + * Retrieves the position in bytes of the capturing parentheses named @name. + * + * If @name is a valid sub pattern name but it didn't match anything + * (e.g. sub pattern "X", matching "b" against "(?P<X>a)?b") + * then @start_pos and @end_pos are set to -1 and %TRUE is returned. + * + * Returns: %TRUE if the position was fetched, %FALSE otherwise. If + * the position cannot be fetched, @start_pos and @end_pos are left + * unchanged + * + * Since: 2.14 + */ +gboolean +g_match_info_fetch_named_pos (const GMatchInfo *match_info, + const gchar *name, + gint *start_pos, + gint *end_pos) +{ + gint num; + + g_return_val_if_fail (match_info != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + num = get_matched_substring_number (match_info, name); + if (num < 0) + return FALSE; + + return g_match_info_fetch_pos (match_info, num, start_pos, end_pos); +} + +/** + * g_match_info_fetch_all: + * @match_info: a #GMatchInfo structure + * + * Bundles up pointers to each of the matching substrings from a match + * and stores them in an array of gchar pointers. The first element in + * the returned array is the match number 0, i.e. the entire matched + * text. + * + * If a sub pattern didn't match anything (e.g. sub pattern 1, matching + * "b" against "(a)?b") then an empty string is inserted. + * + * If the last match was obtained using the DFA algorithm, that is using + * g_regex_match_all() or g_regex_match_all_full(), the retrieved + * strings are not that matched by sets of parentheses but that of the + * matched substring. Substrings are matched in reverse order of length, + * so the first one is the longest match. + * + * The strings are fetched from the string passed to the match function, + * so you cannot call this function after freeing the string. + * + * Returns: a %NULL-terminated array of gchar * pointers. It must be + * freed using g_strfreev(). If the previous match failed %NULL is + * returned + * + * Since: 2.14 + */ +gchar ** +g_match_info_fetch_all (const GMatchInfo *match_info) +{ + /* we cannot use pcre_get_substring_list() because the returned value + * isn't suitable for g_strfreev(). */ + gchar **result; + gint i; + + g_return_val_if_fail (match_info != NULL, NULL); + + if (match_info->matches < 0) + return NULL; + + result = g_new (gchar *, match_info->matches + 1); + for (i = 0; i < match_info->matches; i++) + result[i] = g_match_info_fetch (match_info, i); + result[i] = NULL; + + return result; +} + + +/* GRegex */ + +GQuark +g_regex_error_quark (void) +{ + static GQuark error_quark = 0; + + if (error_quark == 0) + error_quark = g_quark_from_static_string ("g-regex-error-quark"); + + return error_quark; +} + +/** + * g_regex_ref: + * @regex: a #GRegex + * + * Increases reference count of @regex by 1. + * + * Returns: @regex + * + * Since: 2.14 + */ +GRegex * +g_regex_ref (GRegex *regex) +{ + g_return_val_if_fail (regex != NULL, NULL); + g_atomic_int_inc (®ex->ref_count); + return regex; +} + +/** + * g_regex_unref: + * @regex: a #GRegex + * + * Decreases reference count of @regex by 1. When reference count drops + * to zero, it frees all the memory associated with the regex structure. + * + * Since: 2.14 + */ +void +g_regex_unref (GRegex *regex) +{ + g_return_if_fail (regex != NULL); + + if (g_atomic_int_exchange_and_add (®ex->ref_count, -1) - 1 == 0) + { + g_free (regex->pattern); + if (regex->pcre_re != NULL) + pcre_free (regex->pcre_re); + if (regex->extra != NULL) + pcre_free (regex->extra); + g_free (regex); + } +} + +/** + * g_regex_new: + * @pattern: the regular expression + * @compile_options: compile options for the regular expression, or 0 + * @match_options: match options for the regular expression, or 0 + * @error: return location for a #GError + * + * Compiles the regular expression to an internal form, and does + * the initial setup of the #GRegex structure. + * + * Returns: a #GRegex structure. Call g_regex_unref() when you + * are done with it + * + * Since: 2.14 + */ +GRegex * +g_regex_new (const gchar *pattern, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options, + GError **error) +{ + GRegex *regex; + pcre *re; + const gchar *errmsg; + gint erroffset; + gint errcode; + gboolean optimize = FALSE; + static gboolean initialized = FALSE; + unsigned long int pcre_compile_options; + + g_return_val_if_fail (pattern != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail ((compile_options & ~G_REGEX_COMPILE_MASK) == 0, NULL); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL); + + if (!initialized) + { + gint support; + const gchar *msg; + + pcre_config (PCRE_CONFIG_UTF8, &support); + if (!support) + { + msg = N_("PCRE library is compiled without UTF8 support"); + g_critical ("%s", msg); + g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg)); + return NULL; + } + + pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &support); + if (!support) + { + msg = N_("PCRE library is compiled without UTF8 properties support"); + g_critical ("%s", msg); + g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, gettext (msg)); + return NULL; + } + + initialized = TRUE; + } + + /* G_REGEX_OPTIMIZE has the same numeric value of PCRE_NO_UTF8_CHECK, + * as we do not need to wrap PCRE_NO_UTF8_CHECK. */ + if (compile_options & G_REGEX_OPTIMIZE) + optimize = TRUE; + + /* In GRegex the string are, by default, UTF-8 encoded. PCRE + * instead uses UTF-8 only if required with PCRE_UTF8. */ + if (compile_options & G_REGEX_RAW) + { + /* disable utf-8 */ + compile_options &= ~G_REGEX_RAW; + } + else + { + /* enable utf-8 */ + compile_options |= PCRE_UTF8 | PCRE_NO_UTF8_CHECK; + match_options |= PCRE_NO_UTF8_CHECK; + } + + /* PCRE_NEWLINE_ANY is the default for the internal PCRE but + * not for the system one. */ + if (!(compile_options & G_REGEX_NEWLINE_CR) && + !(compile_options & G_REGEX_NEWLINE_LF)) + { + compile_options |= PCRE_NEWLINE_ANY; + } + + /* compile the pattern */ + re = pcre_compile2 (pattern, compile_options, &errcode, + &errmsg, &erroffset, NULL); + + /* if the compilation failed, set the error member and return + * immediately */ + if (re == NULL) + { + GError *tmp_error; + + /* Translate the PCRE error code to GRegexError and use a translated + * error message if possible */ + translate_compile_error (&errcode, &errmsg); + + /* PCRE uses byte offsets but we want to show character offsets */ + erroffset = g_utf8_pointer_to_offset (pattern, &pattern[erroffset]); + + tmp_error = g_error_new (G_REGEX_ERROR, errcode, + _("Error while compiling regular " + "expression %s at char %d: %s"), + pattern, erroffset, errmsg); + g_propagate_error (error, tmp_error); + + return NULL; + } + + /* For options set at the beginning of the pattern, pcre puts them into + * compile options, e.g. "(?i)foo" will make the pcre structure store + * PCRE_CASELESS even though it wasn't explicitly given for compilation. */ + pcre_fullinfo (re, NULL, PCRE_INFO_OPTIONS, &pcre_compile_options); + compile_options = pcre_compile_options; + + if (!(compile_options & G_REGEX_DUPNAMES)) + { + gboolean jchanged = FALSE; + pcre_fullinfo (re, NULL, PCRE_INFO_JCHANGED, &jchanged); + if (jchanged) + compile_options |= G_REGEX_DUPNAMES; + } + + regex = g_new0 (GRegex, 1); + regex->ref_count = 1; + regex->pattern = g_strdup (pattern); + regex->pcre_re = re; + regex->compile_opts = compile_options; + regex->match_opts = match_options; + + if (optimize) + { + regex->extra = pcre_study (regex->pcre_re, 0, &errmsg); + if (errmsg != NULL) + { + GError *tmp_error = g_error_new (G_REGEX_ERROR, + G_REGEX_ERROR_OPTIMIZE, + _("Error while optimizing " + "regular expression %s: %s"), + regex->pattern, + errmsg); + g_propagate_error (error, tmp_error); + + g_regex_unref (regex); + return NULL; + } + } + + return regex; +} + +/** + * g_regex_get_pattern: + * @regex: a #GRegex structure + * + * Gets the pattern string associated with @regex, i.e. a copy of + * the string passed to g_regex_new(). + * + * Returns: the pattern of @regex + * + * Since: 2.14 + */ +const gchar * +g_regex_get_pattern (const GRegex *regex) +{ + g_return_val_if_fail (regex != NULL, NULL); + + return regex->pattern; +} + +/** + * g_regex_get_max_backref: + * @regex: a #GRegex + * + * Returns the number of the highest back reference + * in the pattern, or 0 if the pattern does not contain + * back references. + * + * Returns: the number of the highest back reference + * + * Since: 2.14 + */ +gint +g_regex_get_max_backref (const GRegex *regex) +{ + gint value; + + pcre_fullinfo (regex->pcre_re, regex->extra, + PCRE_INFO_BACKREFMAX, &value); + + return value; +} + +/** + * g_regex_get_capture_count: + * @regex: a #GRegex + * + * Returns the number of capturing subpatterns in the pattern. + * + * Returns: the number of capturing subpatterns + * + * Since: 2.14 + */ +gint +g_regex_get_capture_count (const GRegex *regex) +{ + gint value; + + pcre_fullinfo (regex->pcre_re, regex->extra, + PCRE_INFO_CAPTURECOUNT, &value); + + return value; +} + +/** + * g_regex_match_simple: + * @pattern: the regular expression + * @string: the string to scan for matches + * @compile_options: compile options for the regular expression, or 0 + * @match_options: match options, or 0 + * + * Scans for a match in @string for @pattern. + * + * This function is equivalent to g_regex_match() but it does not + * require to compile the pattern with g_regex_new(), avoiding some + * lines of code when you need just to do a match without extracting + * substrings, capture counts, and so on. + * + * If this function is to be called on the same @pattern more than + * once, it's more efficient to compile the pattern once with + * g_regex_new() and then use g_regex_match(). + * + * Returns: %TRUE if the string matched, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_regex_match_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options) +{ + GRegex *regex; + gboolean result; + + regex = g_regex_new (pattern, compile_options, 0, NULL); + if (!regex) + return FALSE; + result = g_regex_match_full (regex, string, -1, 0, match_options, NULL, NULL); + g_regex_unref (regex); + return result; +} + +/** + * g_regex_match: + * @regex: a #GRegex structure from g_regex_new() + * @string: the string to scan for matches + * @match_options: match options + * @match_info: pointer to location where to store the #GMatchInfo, + * or %NULL if you do not need it + * + * Scans for a match in string for the pattern in @regex. + * The @match_options are combined with the match options specified + * when the @regex structure was created, letting you have more + * flexibility in reusing #GRegex structures. + * + * A #GMatchInfo structure, used to get information on the match, + * is stored in @match_info if not %NULL. Note that if @match_info + * is not %NULL then it is created even if the function returns %FALSE, + * i.e. you must free it regardless if regular expression actually matched. + * + * To retrieve all the non-overlapping matches of the pattern in + * string you can use g_match_info_next(). + * + * |[ + * static void + * print_uppercase_words (const gchar *string) + * { + * /* Print all uppercase-only words. */ + * GRegex *regex; + * GMatchInfo *match_info; + *   + * regex = g_regex_new ("[A-Z]+", 0, 0, NULL); + * g_regex_match (regex, string, 0, &match_info); + * while (g_match_info_matches (match_info)) + * { + * gchar *word = g_match_info_fetch (match_info, 0); + * g_print ("Found: %s\n", word); + * g_free (word); + * g_match_info_next (match_info, NULL); + * } + * g_match_info_free (match_info); + * g_regex_unref (regex); + * } + * ]| + * + * @string is not copied and is used in #GMatchInfo internally. If + * you use any #GMatchInfo method (except g_match_info_free()) after + * freeing or modifying @string then the behaviour is undefined. + * + * Returns: %TRUE is the string matched, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_regex_match (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options, + GMatchInfo **match_info) +{ + return g_regex_match_full (regex, string, -1, 0, match_options, + match_info, NULL); +} + +/** + * g_regex_match_full: + * @regex: a #GRegex structure from g_regex_new() + * @string: the string to scan for matches + * @string_len: the length of @string, or -1 if @string is nul-terminated + * @start_position: starting index of the string to match + * @match_options: match options + * @match_info: pointer to location where to store the #GMatchInfo, + * or %NULL if you do not need it + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Scans for a match in string for the pattern in @regex. + * The @match_options are combined with the match options specified + * when the @regex structure was created, letting you have more + * flexibility in reusing #GRegex structures. + * + * Setting @start_position differs from just passing over a shortened + * string and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern + * that begins with any kind of lookbehind assertion, such as "\b". + * + * A #GMatchInfo structure, used to get information on the match, is + * stored in @match_info if not %NULL. Note that if @match_info is + * not %NULL then it is created even if the function returns %FALSE, + * i.e. you must free it regardless if regular expression actually + * matched. + * + * @string is not copied and is used in #GMatchInfo internally. If + * you use any #GMatchInfo method (except g_match_info_free()) after + * freeing or modifying @string then the behaviour is undefined. + * + * To retrieve all the non-overlapping matches of the pattern in + * string you can use g_match_info_next(). + * + * |[ + * static void + * print_uppercase_words (const gchar *string) + * { + * /* Print all uppercase-only words. */ + * GRegex *regex; + * GMatchInfo *match_info; + * GError *error = NULL; + *   + * regex = g_regex_new ("[A-Z]+", 0, 0, NULL); + * g_regex_match_full (regex, string, -1, 0, 0, &match_info, &error); + * while (g_match_info_matches (match_info)) + * { + * gchar *word = g_match_info_fetch (match_info, 0); + * g_print ("Found: %s\n", word); + * g_free (word); + * g_match_info_next (match_info, &error); + * } + * g_match_info_free (match_info); + * g_regex_unref (regex); + * if (error != NULL) + * { + * g_printerr ("Error while matching: %s\n", error->message); + * g_error_free (error); + * } + * } + * ]| + * + * Returns: %TRUE is the string matched, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_regex_match_full (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + GMatchInfo **match_info, + GError **error) +{ + GMatchInfo *info; + gboolean match_ok; + + g_return_val_if_fail (regex != NULL, FALSE); + g_return_val_if_fail (string != NULL, FALSE); + g_return_val_if_fail (start_position >= 0, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, FALSE); + + info = match_info_new (regex, string, string_len, start_position, + match_options, FALSE); + match_ok = g_match_info_next (info, error); + if (match_info != NULL) + *match_info = info; + else + g_match_info_free (info); + + return match_ok; +} + +/** + * g_regex_match_all: + * @regex: a #GRegex structure from g_regex_new() + * @string: the string to scan for matches + * @match_options: match options + * @match_info: pointer to location where to store the #GMatchInfo, + * or %NULL if you do not need it + * + * Using the standard algorithm for regular expression matching only + * the longest match in the string is retrieved. This function uses + * a different algorithm so it can retrieve all the possible matches. + * For more documentation see g_regex_match_all_full(). + * + * A #GMatchInfo structure, used to get information on the match, is + * stored in @match_info if not %NULL. Note that if @match_info is + * not %NULL then it is created even if the function returns %FALSE, + * i.e. you must free it regardless if regular expression actually + * matched. + * + * @string is not copied and is used in #GMatchInfo internally. If + * you use any #GMatchInfo method (except g_match_info_free()) after + * freeing or modifying @string then the behaviour is undefined. + * + * Returns: %TRUE is the string matched, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_regex_match_all (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options, + GMatchInfo **match_info) +{ + return g_regex_match_all_full (regex, string, -1, 0, match_options, + match_info, NULL); +} + +/** + * g_regex_match_all_full: + * @regex: a #GRegex structure from g_regex_new() + * @string: the string to scan for matches + * @string_len: the length of @string, or -1 if @string is nul-terminated + * @start_position: starting index of the string to match + * @match_options: match options + * @match_info: pointer to location where to store the #GMatchInfo, + * or %NULL if you do not need it + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Using the standard algorithm for regular expression matching only + * the longest match in the string is retrieved, it is not possibile + * to obtain all the available matches. For instance matching + * "<a> <b> <c>" against the pattern "<.*>" + * you get "<a> <b> <c>". + * + * This function uses a different algorithm (called DFA, i.e. deterministic + * finite automaton), so it can retrieve all the possible matches, all + * starting at the same point in the string. For instance matching + * "<a> <b> <c>" against the pattern "<.*>" + * you would obtain three matches: "<a> <b> <c>", + * "<a> <b>" and "<a>". + * + * The number of matched strings is retrieved using + * g_match_info_get_match_count(). To obtain the matched strings and + * their position you can use, respectively, g_match_info_fetch() and + * g_match_info_fetch_pos(). Note that the strings are returned in + * reverse order of length; that is, the longest matching string is + * given first. + * + * Note that the DFA algorithm is slower than the standard one and it + * is not able to capture substrings, so backreferences do not work. + * + * Setting @start_position differs from just passing over a shortened + * string and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern + * that begins with any kind of lookbehind assertion, such as "\b". + * + * A #GMatchInfo structure, used to get information on the match, is + * stored in @match_info if not %NULL. Note that if @match_info is + * not %NULL then it is created even if the function returns %FALSE, + * i.e. you must free it regardless if regular expression actually + * matched. + * + * @string is not copied and is used in #GMatchInfo internally. If + * you use any #GMatchInfo method (except g_match_info_free()) after + * freeing or modifying @string then the behaviour is undefined. + * + * Returns: %TRUE is the string matched, %FALSE otherwise + * + * Since: 2.14 + */ +gboolean +g_regex_match_all_full (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + GMatchInfo **match_info, + GError **error) +{ + GMatchInfo *info; + gboolean done; + + g_return_val_if_fail (regex != NULL, FALSE); + g_return_val_if_fail (string != NULL, FALSE); + g_return_val_if_fail (start_position >= 0, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, FALSE); + + info = match_info_new (regex, string, string_len, start_position, + match_options, TRUE); + + done = FALSE; + while (!done) + { + done = TRUE; + info->matches = pcre_dfa_exec (regex->pcre_re, regex->extra, + info->string, info->string_len, + info->pos, + regex->match_opts | match_options, + info->offsets, info->n_offsets, + info->workspace, info->n_workspace); + if (info->matches == PCRE_ERROR_DFA_WSSIZE) + { + /* info->workspace is too small. */ + info->n_workspace *= 2; + info->workspace = g_realloc (info->workspace, + info->n_workspace * sizeof (gint)); + done = FALSE; + } + else if (info->matches == 0) + { + /* info->offsets is too small. */ + info->n_offsets *= 2; + info->offsets = g_realloc (info->offsets, + info->n_offsets * sizeof (gint)); + done = FALSE; + } + else if (IS_PCRE_ERROR (info->matches)) + { + g_set_error (error, G_REGEX_ERROR, G_REGEX_ERROR_MATCH, + _("Error while matching regular expression %s: %s"), + regex->pattern, match_error (info->matches)); + } + } + + /* set info->pos to -1 so that a call to g_match_info_next() fails. */ + info->pos = -1; + + if (match_info != NULL) + *match_info = info; + else + g_match_info_free (info); + + return info->matches >= 0; +} + +/** + * g_regex_get_string_number: + * @regex: #GRegex structure + * @name: name of the subexpression + * + * Retrieves the number of the subexpression named @name. + * + * Returns: The number of the subexpression or -1 if @name + * does not exists + * + * Since: 2.14 + */ +gint +g_regex_get_string_number (const GRegex *regex, + const gchar *name) +{ + gint num; + + g_return_val_if_fail (regex != NULL, -1); + g_return_val_if_fail (name != NULL, -1); + + num = pcre_get_stringnumber (regex->pcre_re, name); + if (num == PCRE_ERROR_NOSUBSTRING) + num = -1; + + return num; +} + +/** + * g_regex_split_simple: + * @pattern: the regular expression + * @string: the string to scan for matches + * @compile_options: compile options for the regular expression, or 0 + * @match_options: match options, or 0 + * + * Breaks the string on the pattern, and returns an array of + * the tokens. If the pattern contains capturing parentheses, + * then the text for each of the substrings will also be returned. + * If the pattern does not match anywhere in the string, then the + * whole string is returned as the first token. + * + * This function is equivalent to g_regex_split() but it does + * not require to compile the pattern with g_regex_new(), avoiding + * some lines of code when you need just to do a split without + * extracting substrings, capture counts, and so on. + * + * If this function is to be called on the same @pattern more than + * once, it's more efficient to compile the pattern once with + * g_regex_new() and then use g_regex_split(). + * + * As a special case, the result of splitting the empty string "" + * is an empty vector, not a vector containing a single string. + * The reason for this special case is that being able to represent + * a empty vector is typically more useful than consistent handling + * of empty elements. If you do need to represent empty elements, + * you'll need to check for the empty string before calling this + * function. + * + * A pattern that can match empty strings splits @string into + * separate characters wherever it matches the empty string between + * characters. For example splitting "ab c" using as a separator + * "\s*", you will get "a", "b" and "c". + * + * Returns: a %NULL-terminated array of strings. Free it using g_strfreev() + * + * Since: 2.14 + **/ +gchar ** +g_regex_split_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options) +{ + GRegex *regex; + gchar **result; + + regex = g_regex_new (pattern, compile_options, 0, NULL); + if (!regex) + return NULL; + result = g_regex_split_full (regex, string, -1, 0, match_options, 0, NULL); + g_regex_unref (regex); + return result; +} + +/** + * g_regex_split: + * @regex: a #GRegex structure + * @string: the string to split with the pattern + * @match_options: match time option flags + * + * Breaks the string on the pattern, and returns an array of the tokens. + * If the pattern contains capturing parentheses, then the text for each + * of the substrings will also be returned. If the pattern does not match + * anywhere in the string, then the whole string is returned as the first + * token. + * + * As a special case, the result of splitting the empty string "" is an + * empty vector, not a vector containing a single string. The reason for + * this special case is that being able to represent a empty vector is + * typically more useful than consistent handling of empty elements. If + * you do need to represent empty elements, you'll need to check for the + * empty string before calling this function. + * + * A pattern that can match empty strings splits @string into separate + * characters wherever it matches the empty string between characters. + * For example splitting "ab c" using as a separator "\s*", you will get + * "a", "b" and "c". + * + * Returns: a %NULL-terminated gchar ** array. Free it using g_strfreev() + * + * Since: 2.14 + **/ +gchar ** +g_regex_split (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options) +{ + return g_regex_split_full (regex, string, -1, 0, + match_options, 0, NULL); +} + +/** + * g_regex_split_full: + * @regex: a #GRegex structure + * @string: the string to split with the pattern + * @string_len: the length of @string, or -1 if @string is nul-terminated + * @start_position: starting index of the string to match + * @match_options: match time option flags + * @max_tokens: the maximum number of tokens to split @string into. + * If this is less than 1, the string is split completely + * @error: return location for a #GError + * + * Breaks the string on the pattern, and returns an array of the tokens. + * If the pattern contains capturing parentheses, then the text for each + * of the substrings will also be returned. If the pattern does not match + * anywhere in the string, then the whole string is returned as the first + * token. + * + * As a special case, the result of splitting the empty string "" is an + * empty vector, not a vector containing a single string. The reason for + * this special case is that being able to represent a empty vector is + * typically more useful than consistent handling of empty elements. If + * you do need to represent empty elements, you'll need to check for the + * empty string before calling this function. + * + * A pattern that can match empty strings splits @string into separate + * characters wherever it matches the empty string between characters. + * For example splitting "ab c" using as a separator "\s*", you will get + * "a", "b" and "c". + * + * Setting @start_position differs from just passing over a shortened + * string and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern + * that begins with any kind of lookbehind assertion, such as "\b". + * + * Returns: a %NULL-terminated gchar ** array. Free it using g_strfreev() + * + * Since: 2.14 + **/ +gchar ** +g_regex_split_full (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + gint max_tokens, + GError **error) +{ + GError *tmp_error = NULL; + GMatchInfo *match_info; + GList *list, *last; + gint i; + gint token_count; + gboolean match_ok; + /* position of the last separator. */ + gint last_separator_end; + /* was the last match 0 bytes long? */ + gboolean last_match_is_empty; + /* the returned array of char **s */ + gchar **string_list; + + g_return_val_if_fail (regex != NULL, NULL); + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (start_position >= 0, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL); + + if (max_tokens <= 0) + max_tokens = G_MAXINT; + + if (string_len < 0) + string_len = strlen (string); + + /* zero-length string */ + if (string_len - start_position == 0) + return g_new0 (gchar *, 1); + + if (max_tokens == 1) + { + string_list = g_new0 (gchar *, 2); + string_list[0] = g_strndup (&string[start_position], + string_len - start_position); + return string_list; + } + + list = NULL; + token_count = 0; + last_separator_end = start_position; + last_match_is_empty = FALSE; + + match_ok = g_regex_match_full (regex, string, string_len, start_position, + match_options, &match_info, &tmp_error); + while (tmp_error == NULL) + { + if (match_ok) + { + last_match_is_empty = + (match_info->offsets[0] == match_info->offsets[1]); + + /* we need to skip empty separators at the same position of the end + * of another separator. e.g. the string is "a b" and the separator + * is " *", so from 1 to 2 we have a match and at position 2 we have + * an empty match. */ + if (last_separator_end != match_info->offsets[1]) + { + gchar *token; + gint match_count; + + token = g_strndup (string + last_separator_end, + match_info->offsets[0] - last_separator_end); + list = g_list_prepend (list, token); + token_count++; + + /* if there were substrings, these need to be added to + * the list. */ + match_count = g_match_info_get_match_count (match_info); + if (match_count > 1) + { + for (i = 1; i < match_count; i++) + list = g_list_prepend (list, g_match_info_fetch (match_info, i)); + } + } + } + else + { + /* if there was no match, copy to end of string. */ + if (!last_match_is_empty) + { + gchar *token = g_strndup (string + last_separator_end, + match_info->string_len - last_separator_end); + list = g_list_prepend (list, token); + } + /* no more tokens, end the loop. */ + break; + } + + /* -1 to leave room for the last part. */ + if (token_count >= max_tokens - 1) + { + /* we have reached the maximum number of tokens, so we copy + * the remaining part of the string. */ + if (last_match_is_empty) + { + /* the last match was empty, so we have moved one char + * after the real position to avoid empty matches at the + * same position. */ + match_info->pos = PREV_CHAR (regex, &string[match_info->pos]) - string; + } + /* the if is needed in the case we have terminated the available + * tokens, but we are at the end of the string, so there are no + * characters left to copy. */ + if (string_len > match_info->pos) + { + gchar *token = g_strndup (string + match_info->pos, + string_len - match_info->pos); + list = g_list_prepend (list, token); + } + /* end the loop. */ + break; + } + + last_separator_end = match_info->pos; + if (last_match_is_empty) + /* if the last match was empty, g_match_info_next() has moved + * forward to avoid infinite loops, but we still need to copy that + * character. */ + last_separator_end = PREV_CHAR (regex, &string[last_separator_end]) - string; + + match_ok = g_match_info_next (match_info, &tmp_error); + } + g_match_info_free (match_info); + if (tmp_error != NULL) + { + g_propagate_error (error, tmp_error); + g_list_foreach (list, (GFunc)g_free, NULL); + g_list_free (list); + match_info->pos = -1; + return NULL; + } + + string_list = g_new (gchar *, g_list_length (list) + 1); + i = 0; + for (last = g_list_last (list); last; last = g_list_previous (last)) + string_list[i++] = last->data; + string_list[i] = NULL; + g_list_free (list); + + return string_list; +} + +enum +{ + REPL_TYPE_STRING, + REPL_TYPE_CHARACTER, + REPL_TYPE_SYMBOLIC_REFERENCE, + REPL_TYPE_NUMERIC_REFERENCE, + REPL_TYPE_CHANGE_CASE +}; + +typedef enum +{ + CHANGE_CASE_NONE = 1 << 0, + CHANGE_CASE_UPPER = 1 << 1, + CHANGE_CASE_LOWER = 1 << 2, + CHANGE_CASE_UPPER_SINGLE = 1 << 3, + CHANGE_CASE_LOWER_SINGLE = 1 << 4, + CHANGE_CASE_SINGLE_MASK = CHANGE_CASE_UPPER_SINGLE | CHANGE_CASE_LOWER_SINGLE, + CHANGE_CASE_LOWER_MASK = CHANGE_CASE_LOWER | CHANGE_CASE_LOWER_SINGLE, + CHANGE_CASE_UPPER_MASK = CHANGE_CASE_UPPER | CHANGE_CASE_UPPER_SINGLE +} ChangeCase; + +struct _InterpolationData +{ + gchar *text; + gint type; + gint num; + gchar c; + ChangeCase change_case; +}; + +static void +free_interpolation_data (InterpolationData *data) +{ + g_free (data->text); + g_free (data); +} + +static const gchar * +expand_escape (const gchar *replacement, + const gchar *p, + InterpolationData *data, + GError **error) +{ + const gchar *q, *r; + gint x, d, h, i; + const gchar *error_detail; + gint base = 0; + GError *tmp_error = NULL; + + p++; + switch (*p) + { + case 't': + p++; + data->c = '\t'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'n': + p++; + data->c = '\n'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'v': + p++; + data->c = '\v'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'r': + p++; + data->c = '\r'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'f': + p++; + data->c = '\f'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'a': + p++; + data->c = '\a'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'b': + p++; + data->c = '\b'; + data->type = REPL_TYPE_CHARACTER; + break; + case '\\': + p++; + data->c = '\\'; + data->type = REPL_TYPE_CHARACTER; + break; + case 'x': + p++; + x = 0; + if (*p == '{') + { + p++; + do + { + h = g_ascii_xdigit_value (*p); + if (h < 0) + { + error_detail = _("hexadecimal digit or '}' expected"); + goto error; + } + x = x * 16 + h; + p++; + } + while (*p != '}'); + p++; + } + else + { + for (i = 0; i < 2; i++) + { + h = g_ascii_xdigit_value (*p); + if (h < 0) + { + error_detail = _("hexadecimal digit expected"); + goto error; + } + x = x * 16 + h; + p++; + } + } + data->type = REPL_TYPE_STRING; + data->text = g_new0 (gchar, 8); + g_unichar_to_utf8 (x, data->text); + break; + case 'l': + p++; + data->type = REPL_TYPE_CHANGE_CASE; + data->change_case = CHANGE_CASE_LOWER_SINGLE; + break; + case 'u': + p++; + data->type = REPL_TYPE_CHANGE_CASE; + data->change_case = CHANGE_CASE_UPPER_SINGLE; + break; + case 'L': + p++; + data->type = REPL_TYPE_CHANGE_CASE; + data->change_case = CHANGE_CASE_LOWER; + break; + case 'U': + p++; + data->type = REPL_TYPE_CHANGE_CASE; + data->change_case = CHANGE_CASE_UPPER; + break; + case 'E': + p++; + data->type = REPL_TYPE_CHANGE_CASE; + data->change_case = CHANGE_CASE_NONE; + break; + case 'g': + p++; + if (*p != '<') + { + error_detail = _("missing '<' in symbolic reference"); + goto error; + } + q = p + 1; + do + { + p++; + if (!*p) + { + error_detail = _("unfinished symbolic reference"); + goto error; + } + } + while (*p != '>'); + if (p - q == 0) + { + error_detail = _("zero-length symbolic reference"); + goto error; + } + if (g_ascii_isdigit (*q)) + { + x = 0; + do + { + h = g_ascii_digit_value (*q); + if (h < 0) + { + error_detail = _("digit expected"); + p = q; + goto error; + } + x = x * 10 + h; + q++; + } + while (q != p); + data->num = x; + data->type = REPL_TYPE_NUMERIC_REFERENCE; + } + else + { + r = q; + do + { + if (!g_ascii_isalnum (*r)) + { + error_detail = _("illegal symbolic reference"); + p = r; + goto error; + } + r++; + } + while (r != p); + data->text = g_strndup (q, p - q); + data->type = REPL_TYPE_SYMBOLIC_REFERENCE; + } + p++; + break; + case '0': + /* if \0 is followed by a number is an octal number representing a + * character, else it is a numeric reference. */ + if (g_ascii_digit_value (*g_utf8_next_char (p)) >= 0) + { + base = 8; + p = g_utf8_next_char (p); + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + x = 0; + d = 0; + for (i = 0; i < 3; i++) + { + h = g_ascii_digit_value (*p); + if (h < 0) + break; + if (h > 7) + { + if (base == 8) + break; + else + base = 10; + } + if (i == 2 && base == 10) + break; + x = x * 8 + h; + d = d * 10 + h; + p++; + } + if (base == 8 || i == 3) + { + data->type = REPL_TYPE_STRING; + data->text = g_new0 (gchar, 8); + g_unichar_to_utf8 (x, data->text); + } + else + { + data->type = REPL_TYPE_NUMERIC_REFERENCE; + data->num = d; + } + break; + case 0: + error_detail = _("stray final '\\'"); + goto error; + break; + default: + error_detail = _("unknown escape sequence"); + goto error; + } + + return p; + + error: + /* G_GSSIZE_FORMAT doesn't work with gettext, so we use %lu */ + tmp_error = g_error_new (G_REGEX_ERROR, + G_REGEX_ERROR_REPLACE, + _("Error while parsing replacement " + "text \"%s\" at char %lu: %s"), + replacement, + (gulong)(p - replacement), + error_detail); + g_propagate_error (error, tmp_error); + + return NULL; +} + +static GList * +split_replacement (const gchar *replacement, + GError **error) +{ + GList *list = NULL; + InterpolationData *data; + const gchar *p, *start; + + start = p = replacement; + while (*p) + { + if (*p == '\\') + { + data = g_new0 (InterpolationData, 1); + start = p = expand_escape (replacement, p, data, error); + if (p == NULL) + { + g_list_foreach (list, (GFunc)free_interpolation_data, NULL); + g_list_free (list); + free_interpolation_data (data); + + return NULL; + } + list = g_list_prepend (list, data); + } + else + { + p++; + if (*p == '\\' || *p == '\0') + { + if (p - start > 0) + { + data = g_new0 (InterpolationData, 1); + data->text = g_strndup (start, p - start); + data->type = REPL_TYPE_STRING; + list = g_list_prepend (list, data); + } + } + } + } + + return g_list_reverse (list); +} + +/* Change the case of c based on change_case. */ +#define CHANGE_CASE(c, change_case) \ + (((change_case) & CHANGE_CASE_LOWER_MASK) ? \ + g_unichar_tolower (c) : \ + g_unichar_toupper (c)) + +static void +string_append (GString *string, + const gchar *text, + ChangeCase *change_case) +{ + gunichar c; + + if (text[0] == '\0') + return; + + if (*change_case == CHANGE_CASE_NONE) + { + g_string_append (string, text); + } + else if (*change_case & CHANGE_CASE_SINGLE_MASK) + { + c = g_utf8_get_char (text); + g_string_append_unichar (string, CHANGE_CASE (c, *change_case)); + g_string_append (string, g_utf8_next_char (text)); + *change_case = CHANGE_CASE_NONE; + } + else + { + while (*text != '\0') + { + c = g_utf8_get_char (text); + g_string_append_unichar (string, CHANGE_CASE (c, *change_case)); + text = g_utf8_next_char (text); + } + } +} + +static gboolean +interpolate_replacement (const GMatchInfo *match_info, + GString *result, + gpointer data) +{ + GList *list; + InterpolationData *idata; + gchar *match; + ChangeCase change_case = CHANGE_CASE_NONE; + + for (list = data; list; list = list->next) + { + idata = list->data; + switch (idata->type) + { + case REPL_TYPE_STRING: + string_append (result, idata->text, &change_case); + break; + case REPL_TYPE_CHARACTER: + g_string_append_c (result, CHANGE_CASE (idata->c, change_case)); + if (change_case & CHANGE_CASE_SINGLE_MASK) + change_case = CHANGE_CASE_NONE; + break; + case REPL_TYPE_NUMERIC_REFERENCE: + match = g_match_info_fetch (match_info, idata->num); + if (match) + { + string_append (result, match, &change_case); + g_free (match); + } + break; + case REPL_TYPE_SYMBOLIC_REFERENCE: + match = g_match_info_fetch_named (match_info, idata->text); + if (match) + { + string_append (result, match, &change_case); + g_free (match); + } + break; + case REPL_TYPE_CHANGE_CASE: + change_case = idata->change_case; + break; + } + } + + return FALSE; +} + +/* whether actual match_info is needed for replacement, i.e. + * whether there are references + */ +static gboolean +interpolation_list_needs_match (GList *list) +{ + while (list != NULL) + { + InterpolationData *data = list->data; + + if (data->type == REPL_TYPE_SYMBOLIC_REFERENCE || + data->type == REPL_TYPE_NUMERIC_REFERENCE) + { + return TRUE; + } + + list = list->next; + } + + return FALSE; +} + +/** + * g_regex_replace: + * @regex: a #GRegex structure + * @string: the string to perform matches against + * @string_len: the length of @string, or -1 if @string is nul-terminated + * @start_position: starting index of the string to match + * @replacement: text to replace each match with + * @match_options: options for the match + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Replaces all occurrences of the pattern in @regex with the + * replacement text. Backreferences of the form '\number' or + * '\g<number>' in the replacement text are interpolated by the + * number-th captured subexpression of the match, '\g<name>' refers + * to the captured subexpression with the given name. '\0' refers to the + * complete match, but '\0' followed by a number is the octal representation + * of a character. To include a literal '\' in the replacement, write '\\'. + * There are also escapes that changes the case of the following text: + * + * + * \l + * + * Convert to lower case the next character + * + * + * \u + * + * Convert to upper case the next character + * + * + * \L + * + * Convert to lower case till \E + * + * + * \U + * + * Convert to upper case till \E + * + * + * \E + * + * End case modification + * + * + * + * + * If you do not need to use backreferences use g_regex_replace_literal(). + * + * The @replacement string must be UTF-8 encoded even if #G_REGEX_RAW was + * passed to g_regex_new(). If you want to use not UTF-8 encoded stings + * you can use g_regex_replace_literal(). + * + * Setting @start_position differs from just passing over a shortened + * string and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern that + * begins with any kind of lookbehind assertion, such as "\b". + * + * Returns: a newly allocated string containing the replacements + * + * Since: 2.14 + */ +gchar * +g_regex_replace (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + const gchar *replacement, + GRegexMatchFlags match_options, + GError **error) +{ + gchar *result; + GList *list; + GError *tmp_error = NULL; + + g_return_val_if_fail (regex != NULL, NULL); + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (start_position >= 0, NULL); + g_return_val_if_fail (replacement != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL); + + list = split_replacement (replacement, &tmp_error); + if (tmp_error != NULL) + { + g_propagate_error (error, tmp_error); + return NULL; + } + + result = g_regex_replace_eval (regex, + string, string_len, start_position, + match_options, + interpolate_replacement, + (gpointer)list, + &tmp_error); + if (tmp_error != NULL) + g_propagate_error (error, tmp_error); + + g_list_foreach (list, (GFunc)free_interpolation_data, NULL); + g_list_free (list); + + return result; +} + +static gboolean +literal_replacement (const GMatchInfo *match_info, + GString *result, + gpointer data) +{ + g_string_append (result, data); + return FALSE; +} + +/** + * g_regex_replace_literal: + * @regex: a #GRegex structure + * @string: the string to perform matches against + * @string_len: the length of @string, or -1 if @string is nul-terminated + * @start_position: starting index of the string to match + * @replacement: text to replace each match with + * @match_options: options for the match + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Replaces all occurrences of the pattern in @regex with the + * replacement text. @replacement is replaced literally, to + * include backreferences use g_regex_replace(). + * + * Setting @start_position differs from just passing over a + * shortened string and setting #G_REGEX_MATCH_NOTBOL in the + * case of a pattern that begins with any kind of lookbehind + * assertion, such as "\b". + * + * Returns: a newly allocated string containing the replacements + * + * Since: 2.14 + */ +gchar * +g_regex_replace_literal (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + const gchar *replacement, + GRegexMatchFlags match_options, + GError **error) +{ + g_return_val_if_fail (replacement != NULL, NULL); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL); + + return g_regex_replace_eval (regex, + string, string_len, start_position, + match_options, + literal_replacement, + (gpointer)replacement, + error); +} + +/** + * g_regex_replace_eval: + * @regex: a #GRegex structure from g_regex_new() + * @string: string to perform matches against + * @string_len: the length of @string, or -1 if @string is nul-terminated + * @start_position: starting index of the string to match + * @match_options: options for the match + * @eval: a function to call for each match + * @user_data: user data to pass to the function + * @error: location to store the error occuring, or %NULL to ignore errors + * + * Replaces occurrences of the pattern in regex with the output of + * @eval for that occurrence. + * + * Setting @start_position differs from just passing over a shortened + * string and setting #G_REGEX_MATCH_NOTBOL in the case of a pattern + * that begins with any kind of lookbehind assertion, such as "\b". + * + * The following example uses g_regex_replace_eval() to replace multiple + * strings at once: + * |[ + * static gboolean + * eval_cb (const GMatchInfo *info, + * GString *res, + * gpointer data) + * { + * gchar *match; + * gchar *r; + * + * match = g_match_info_fetch (info, 0); + * r = g_hash_table_lookup ((GHashTable *)data, match); + * g_string_append (res, r); + * g_free (match); + * + * return FALSE; + * } + * + * /* ... */ + * + * GRegex *reg; + * GHashTable *h; + * gchar *res; + * + * h = g_hash_table_new (g_str_hash, g_str_equal); + * + * g_hash_table_insert (h, "1", "ONE"); + * g_hash_table_insert (h, "2", "TWO"); + * g_hash_table_insert (h, "3", "THREE"); + * g_hash_table_insert (h, "4", "FOUR"); + * + * reg = g_regex_new ("1|2|3|4", 0, 0, NULL); + * res = g_regex_replace_eval (reg, text, -1, 0, 0, eval_cb, h, NULL); + * g_hash_table_destroy (h); + * + * /* ... */ + * ]| + * + * Returns: a newly allocated string containing the replacements + * + * Since: 2.14 + */ +gchar * +g_regex_replace_eval (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + GRegexEvalCallback eval, + gpointer user_data, + GError **error) +{ + GMatchInfo *match_info; + GString *result; + gint str_pos = 0; + gboolean done = FALSE; + GError *tmp_error = NULL; + + g_return_val_if_fail (regex != NULL, NULL); + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (start_position >= 0, NULL); + g_return_val_if_fail (eval != NULL, NULL); + g_return_val_if_fail ((match_options & ~G_REGEX_MATCH_MASK) == 0, NULL); + + if (string_len < 0) + string_len = strlen (string); + + result = g_string_sized_new (string_len); + + /* run down the string making matches. */ + g_regex_match_full (regex, string, string_len, start_position, + match_options, &match_info, &tmp_error); + while (!done && g_match_info_matches (match_info)) + { + g_string_append_len (result, + string + str_pos, + match_info->offsets[0] - str_pos); + done = (*eval) (match_info, result, user_data); + str_pos = match_info->offsets[1]; + g_match_info_next (match_info, &tmp_error); + } + g_match_info_free (match_info); + if (tmp_error != NULL) + { + g_propagate_error (error, tmp_error); + g_string_free (result, TRUE); + return NULL; + } + + g_string_append_len (result, string + str_pos, string_len - str_pos); + return g_string_free (result, FALSE); +} + +/** + * g_regex_check_replacement: + * @replacement: the replacement string + * @has_references: location to store information about + * references in @replacement or %NULL + * @error: location to store error + * + * Checks whether @replacement is a valid replacement string + * (see g_regex_replace()), i.e. that all escape sequences in + * it are valid. + * + * If @has_references is not %NULL then @replacement is checked + * for pattern references. For instance, replacement text 'foo\n' + * does not contain references and may be evaluated without information + * about actual match, but '\0\1' (whole match followed by first + * subpattern) requires valid #GMatchInfo object. + * + * Returns: whether @replacement is a valid replacement string + * + * Since: 2.14 + */ +gboolean +g_regex_check_replacement (const gchar *replacement, + gboolean *has_references, + GError **error) +{ + GList *list; + GError *tmp = NULL; + + list = split_replacement (replacement, &tmp); + + if (tmp) + { + g_propagate_error (error, tmp); + return FALSE; + } + + if (has_references) + *has_references = interpolation_list_needs_match (list); + + g_list_foreach (list, (GFunc) free_interpolation_data, NULL); + g_list_free (list); + + return TRUE; +} + +/** + * g_regex_escape_string: + * @string: the string to escape + * @length: the length of @string, or -1 if @string is nul-terminated + * + * Escapes the special characters used for regular expressions + * in @string, for instance "a.b*c" becomes "a\.b\*c". This + * function is useful to dynamically generate regular expressions. + * + * @string can contain nul characters that are replaced with "\0", + * in this case remember to specify the correct length of @string + * in @length. + * + * Returns: a newly-allocated escaped string + * + * Since: 2.14 + */ +gchar * +g_regex_escape_string (const gchar *string, + gint length) +{ + GString *escaped; + const char *p, *piece_start, *end; + + g_return_val_if_fail (string != NULL, NULL); + + if (length < 0) + length = strlen (string); + + end = string + length; + p = piece_start = string; + escaped = g_string_sized_new (length + 1); + + while (p < end) + { + switch (*p) + { + case '\0': + case '\\': + case '|': + case '(': + case ')': + case '[': + case ']': + case '{': + case '}': + case '^': + case '$': + case '*': + case '+': + case '?': + case '.': + if (p != piece_start) + /* copy the previous piece. */ + g_string_append_len (escaped, piece_start, p - piece_start); + g_string_append_c (escaped, '\\'); + if (*p == '\0') + g_string_append_c (escaped, '0'); + else + g_string_append_c (escaped, *p); + piece_start = ++p; + break; + default: + p = g_utf8_next_char (p); + break; + } + } + + if (piece_start < end) + g_string_append_len (escaped, piece_start, end - piece_start); + + return g_string_free (escaped, FALSE); +} + +#define __G_REGEX_C__ +#include "galiasdef.c" diff --git a/glib/gregex.h b/glib/gregex.h new file mode 100644 index 0000000..a96fbda --- /dev/null +++ b/glib/gregex.h @@ -0,0 +1,243 @@ +/* GRegex -- regular expression API wrapper around PCRE. + * + * Copyright (C) 1999, 2000 Scott Wimer + * Copyright (C) 2004, Matthias Clasen + * Copyright (C) 2005 - 2007, Marco Barisione + * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_REGEX_H__ +#define __G_REGEX_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef enum +{ + G_REGEX_ERROR_COMPILE, + G_REGEX_ERROR_OPTIMIZE, + G_REGEX_ERROR_REPLACE, + G_REGEX_ERROR_MATCH, + G_REGEX_ERROR_INTERNAL, + + /* These are the error codes from PCRE + 100 */ + G_REGEX_ERROR_STRAY_BACKSLASH = 101, + G_REGEX_ERROR_MISSING_CONTROL_CHAR = 102, + G_REGEX_ERROR_UNRECOGNIZED_ESCAPE = 103, + G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER = 104, + G_REGEX_ERROR_QUANTIFIER_TOO_BIG = 105, + G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS = 106, + G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS = 107, + G_REGEX_ERROR_RANGE_OUT_OF_ORDER = 108, + G_REGEX_ERROR_NOTHING_TO_REPEAT = 109, + G_REGEX_ERROR_UNRECOGNIZED_CHARACTER = 112, + G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS = 113, + G_REGEX_ERROR_UNMATCHED_PARENTHESIS = 114, + G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE = 115, + G_REGEX_ERROR_UNTERMINATED_COMMENT = 118, + G_REGEX_ERROR_EXPRESSION_TOO_LARGE = 120, + G_REGEX_ERROR_MEMORY_ERROR = 121, + G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND = 125, + G_REGEX_ERROR_MALFORMED_CONDITION = 126, + G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES = 127, + G_REGEX_ERROR_ASSERTION_EXPECTED = 128, + G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME = 130, + G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED = 131, + G_REGEX_ERROR_HEX_CODE_TOO_LARGE = 134, + G_REGEX_ERROR_INVALID_CONDITION = 135, + G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND = 136, + G_REGEX_ERROR_INFINITE_LOOP = 140, + G_REGEX_ERROR_MISSING_SUBPATTERN_NAME_TERMINATOR = 142, + G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME = 143, + G_REGEX_ERROR_MALFORMED_PROPERTY = 146, + G_REGEX_ERROR_UNKNOWN_PROPERTY = 147, + G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG = 148, + G_REGEX_ERROR_TOO_MANY_SUBPATTERNS = 149, + G_REGEX_ERROR_INVALID_OCTAL_VALUE = 151, + G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE = 154, + G_REGEX_ERROR_DEFINE_REPETION = 155, + G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS = 156, + G_REGEX_ERROR_MISSING_BACK_REFERENCE = 157 +} GRegexError; + +#define G_REGEX_ERROR g_regex_error_quark () + +GQuark g_regex_error_quark (void); + +/* Remember to update G_REGEX_COMPILE_MASK in gregex.c after + * adding a new flag. */ +typedef enum +{ + G_REGEX_CASELESS = 1 << 0, + G_REGEX_MULTILINE = 1 << 1, + G_REGEX_DOTALL = 1 << 2, + G_REGEX_EXTENDED = 1 << 3, + G_REGEX_ANCHORED = 1 << 4, + G_REGEX_DOLLAR_ENDONLY = 1 << 5, + G_REGEX_UNGREEDY = 1 << 9, + G_REGEX_RAW = 1 << 11, + G_REGEX_NO_AUTO_CAPTURE = 1 << 12, + G_REGEX_OPTIMIZE = 1 << 13, + G_REGEX_DUPNAMES = 1 << 19, + G_REGEX_NEWLINE_CR = 1 << 20, + G_REGEX_NEWLINE_LF = 1 << 21, + G_REGEX_NEWLINE_CRLF = G_REGEX_NEWLINE_CR | G_REGEX_NEWLINE_LF +} GRegexCompileFlags; + +/* Remember to update G_REGEX_MATCH_MASK in gregex.c after + * adding a new flag. */ +typedef enum +{ + G_REGEX_MATCH_ANCHORED = 1 << 4, + G_REGEX_MATCH_NOTBOL = 1 << 7, + G_REGEX_MATCH_NOTEOL = 1 << 8, + G_REGEX_MATCH_NOTEMPTY = 1 << 10, + G_REGEX_MATCH_PARTIAL = 1 << 15, + G_REGEX_MATCH_NEWLINE_CR = 1 << 20, + G_REGEX_MATCH_NEWLINE_LF = 1 << 21, + G_REGEX_MATCH_NEWLINE_CRLF = G_REGEX_MATCH_NEWLINE_CR | G_REGEX_MATCH_NEWLINE_LF, + G_REGEX_MATCH_NEWLINE_ANY = 1 << 22 +} GRegexMatchFlags; + +typedef struct _GRegex GRegex; +typedef struct _GMatchInfo GMatchInfo; + +typedef gboolean (*GRegexEvalCallback) (const GMatchInfo *match_info, + GString *result, + gpointer user_data); + + +GRegex *g_regex_new (const gchar *pattern, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options, + GError **error); +GRegex *g_regex_ref (GRegex *regex); +void g_regex_unref (GRegex *regex); +const gchar *g_regex_get_pattern (const GRegex *regex); +gint g_regex_get_max_backref (const GRegex *regex); +gint g_regex_get_capture_count (const GRegex *regex); +gint g_regex_get_string_number (const GRegex *regex, + const gchar *name); +gchar *g_regex_escape_string (const gchar *string, + gint length); + +/* Matching. */ +gboolean g_regex_match_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options); +gboolean g_regex_match (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options, + GMatchInfo **match_info); +gboolean g_regex_match_full (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + GMatchInfo **match_info, + GError **error); +gboolean g_regex_match_all (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options, + GMatchInfo **match_info); +gboolean g_regex_match_all_full (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + GMatchInfo **match_info, + GError **error); + +/* String splitting. */ +gchar **g_regex_split_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options); +gchar **g_regex_split (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options); +gchar **g_regex_split_full (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + gint max_tokens, + GError **error); + +/* String replacement. */ +gchar *g_regex_replace (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + const gchar *replacement, + GRegexMatchFlags match_options, + GError **error); +gchar *g_regex_replace_literal (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + const gchar *replacement, + GRegexMatchFlags match_options, + GError **error); +gchar *g_regex_replace_eval (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_options, + GRegexEvalCallback eval, + gpointer user_data, + GError **error); +gboolean g_regex_check_replacement (const gchar *replacement, + gboolean *has_references, + GError **error); + +/* Match info */ +GRegex *g_match_info_get_regex (const GMatchInfo *match_info); +const gchar *g_match_info_get_string (const GMatchInfo *match_info); + +void g_match_info_free (GMatchInfo *match_info); +gboolean g_match_info_next (GMatchInfo *match_info, + GError **error); +gboolean g_match_info_matches (const GMatchInfo *match_info); +gint g_match_info_get_match_count (const GMatchInfo *match_info); +gboolean g_match_info_is_partial_match (const GMatchInfo *match_info); +gchar *g_match_info_expand_references(const GMatchInfo *match_info, + const gchar *string_to_expand, + GError **error); +gchar *g_match_info_fetch (const GMatchInfo *match_info, + gint match_num); +gboolean g_match_info_fetch_pos (const GMatchInfo *match_info, + gint match_num, + gint *start_pos, + gint *end_pos); +gchar *g_match_info_fetch_named (const GMatchInfo *match_info, + const gchar *name); +gboolean g_match_info_fetch_named_pos (const GMatchInfo *match_info, + const gchar *name, + gint *start_pos, + gint *end_pos); +gchar **g_match_info_fetch_all (const GMatchInfo *match_info); + +G_END_DECLS + +#endif /* __G_REGEX_H__ */ diff --git a/glib/grel.c b/glib/grel.c new file mode 100644 index 0000000..8cecd29 --- /dev/null +++ b/glib/grel.c @@ -0,0 +1,646 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: relations + * @title: Relations and Tuples + * @short_description: tables of data which can be indexed on any + * number of fields + * + * A #GRelation is a table of data which can be indexed on any number + * of fields, rather like simple database tables. A #GRelation contains + * a number of records, called tuples. Each record contains a number of + * fields. Records are not ordered, so it is not possible to find the + * record at a particular index. + * + * Note that #GRelation tables are currently limited to 2 fields. + * + * To create a GRelation, use g_relation_new(). + * + * To specify which fields should be indexed, use g_relation_index(). + * Note that this must be called before any tuples are added to the + * #GRelation. + * + * To add records to a #GRelation use g_relation_insert(). + * + * To determine if a given record appears in a #GRelation, use + * g_relation_exists(). Note that fields are compared directly, so + * pointers must point to the exact same position (i.e. different + * copies of the same string will not match.) + * + * To count the number of records which have a particular value in a + * given field, use g_relation_count(). + * + * To get all the records which have a particular value in a given + * field, use g_relation_select(). To access fields of the resulting + * records, use g_tuples_index(). To free the resulting records use + * g_tuples_destroy(). + * + * To delete all records which have a particular value in a given + * field, use g_relation_delete(). + * + * To destroy the #GRelation, use g_relation_destroy(). + * + * To help debug #GRelation objects, use g_relation_print(). + **/ + +typedef struct _GRealTuples GRealTuples; + +/** + * GRelation: + * + * The #GRelation struct is an opaque data structure to represent a + * Relation. It should + * only be accessed via the following functions. + **/ +struct _GRelation +{ + gint fields; + gint current_field; + + GHashTable *all_tuples; + GHashTable **hashed_tuple_tables; + + gint count; +}; + +/** + * GTuples: + * @len: the number of records that matched. + * + * The #GTuples struct is used to return records (or tuples) from the + * #GRelation by g_relation_select(). It only contains one public + * member - the number of records that matched. To access the matched + * records, you must use g_tuples_index(). + **/ +struct _GRealTuples +{ + gint len; + gint width; + gpointer *data; +}; + +static gboolean +tuple_equal_2 (gconstpointer v_a, + gconstpointer v_b) +{ + gpointer* a = (gpointer*) v_a; + gpointer* b = (gpointer*) v_b; + + return a[0] == b[0] && a[1] == b[1]; +} + +static guint +tuple_hash_2 (gconstpointer v_a) +{ +#if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_LONG + /* In practise this snippet has been written for 64-bit Windows + * where ints are 32 bits, pointers 64 bits. More exotic platforms + * need more tweaks. + */ + guint* a = (guint*) v_a; + + return (a[0] ^ a[1] ^ a[2] ^ a[3]); +#else + gpointer* a = (gpointer*) v_a; + + return (gulong)a[0] ^ (gulong)a[1]; +#endif +} + +static GHashFunc +tuple_hash (gint fields) +{ + switch (fields) + { + case 2: + return tuple_hash_2; + default: + g_error ("no tuple hash for %d", fields); + } + + return NULL; +} + +static GEqualFunc +tuple_equal (gint fields) +{ + switch (fields) + { + case 2: + return tuple_equal_2; + default: + g_error ("no tuple equal for %d", fields); + } + + return NULL; +} + +/** + * g_relation_new: + * @fields: the number of fields. + * @Returns: a new #GRelation. + * + * Creates a new #GRelation with the given number of fields. Note that + * currently the number of fields must be 2. + **/ +GRelation* +g_relation_new (gint fields) +{ + GRelation* rel = g_new0 (GRelation, 1); + + rel->fields = fields; + rel->all_tuples = g_hash_table_new (tuple_hash (fields), tuple_equal (fields)); + rel->hashed_tuple_tables = g_new0 (GHashTable*, fields); + + return rel; +} + +static void +relation_delete_value_tuple (gpointer tuple_key, + gpointer tuple_value, + gpointer user_data) +{ + GRelation *relation = user_data; + gpointer *tuple = tuple_value; + g_slice_free1 (relation->fields * sizeof (gpointer), tuple); +} + +static void +g_relation_free_array (gpointer key, gpointer value, gpointer user_data) +{ + g_hash_table_destroy ((GHashTable*) value); +} + +/** + * g_relation_destroy: + * @relation: a #GRelation. + * + * Destroys the #GRelation, freeing all memory allocated. However, it + * does not free memory allocated for the tuple data, so you should + * free that first if appropriate. + **/ +void +g_relation_destroy (GRelation *relation) +{ + gint i; + + if (relation) + { + for (i = 0; i < relation->fields; i += 1) + { + if (relation->hashed_tuple_tables[i]) + { + g_hash_table_foreach (relation->hashed_tuple_tables[i], g_relation_free_array, NULL); + g_hash_table_destroy (relation->hashed_tuple_tables[i]); + } + } + + g_hash_table_foreach (relation->all_tuples, relation_delete_value_tuple, relation); + g_hash_table_destroy (relation->all_tuples); + + g_free (relation->hashed_tuple_tables); + g_free (relation); + } +} + +/** + * g_relation_index: + * @relation: a #GRelation. + * @field: the field to index, counting from 0. + * @hash_func: a function to produce a hash value from the field data. + * @key_equal_func: a function to compare two values of the given field. + * + * Creates an index on the given field. Note that this must be called + * before any records are added to the #GRelation. + **/ +void +g_relation_index (GRelation *relation, + gint field, + GHashFunc hash_func, + GEqualFunc key_equal_func) +{ + g_return_if_fail (relation != NULL); + + g_return_if_fail (relation->count == 0 && relation->hashed_tuple_tables[field] == NULL); + + relation->hashed_tuple_tables[field] = g_hash_table_new (hash_func, key_equal_func); +} + +/** + * g_relation_insert: + * @relation: a #GRelation. + * @Varargs: the fields of the record to add. These must match the + * number of fields in the #GRelation, and of type #gpointer + * or #gconstpointer. + * + * Inserts a record into a #GRelation. + **/ +void +g_relation_insert (GRelation *relation, + ...) +{ + gpointer* tuple = g_slice_alloc (relation->fields * sizeof (gpointer)); + va_list args; + gint i; + + va_start (args, relation); + + for (i = 0; i < relation->fields; i += 1) + tuple[i] = va_arg (args, gpointer); + + va_end (args); + + g_hash_table_insert (relation->all_tuples, tuple, tuple); + + relation->count += 1; + + for (i = 0; i < relation->fields; i += 1) + { + GHashTable *table; + gpointer key; + GHashTable *per_key_table; + + table = relation->hashed_tuple_tables[i]; + + if (table == NULL) + continue; + + key = tuple[i]; + per_key_table = g_hash_table_lookup (table, key); + + if (per_key_table == NULL) + { + per_key_table = g_hash_table_new (tuple_hash (relation->fields), tuple_equal (relation->fields)); + g_hash_table_insert (table, key, per_key_table); + } + + g_hash_table_insert (per_key_table, tuple, tuple); + } +} + +static void +g_relation_delete_tuple (gpointer tuple_key, + gpointer tuple_value, + gpointer user_data) +{ + gpointer *tuple = (gpointer*) tuple_value; + GRelation *relation = (GRelation *) user_data; + gint j; + + g_assert (tuple_key == tuple_value); + + for (j = 0; j < relation->fields; j += 1) + { + GHashTable *one_table = relation->hashed_tuple_tables[j]; + gpointer one_key; + GHashTable *per_key_table; + + if (one_table == NULL) + continue; + + if (j == relation->current_field) + /* can't delete from the table we're foreaching in */ + continue; + + one_key = tuple[j]; + + per_key_table = g_hash_table_lookup (one_table, one_key); + + g_hash_table_remove (per_key_table, tuple); + } + + if (g_hash_table_remove (relation->all_tuples, tuple)) + g_slice_free1 (relation->fields * sizeof (gpointer), tuple); + + relation->count -= 1; +} + +/** + * g_relation_delete: + * @relation: a #GRelation. + * @key: the value to compare with. + * @field: the field of each record to match. + * @Returns: the number of records deleted. + * + * Deletes any records from a #GRelation that have the given key value + * in the given field. + **/ +gint +g_relation_delete (GRelation *relation, + gconstpointer key, + gint field) +{ + GHashTable *table; + GHashTable *key_table; + gint count; + + g_return_val_if_fail (relation != NULL, 0); + + table = relation->hashed_tuple_tables[field]; + count = relation->count; + + g_return_val_if_fail (table != NULL, 0); + + key_table = g_hash_table_lookup (table, key); + + if (!key_table) + return 0; + + relation->current_field = field; + + g_hash_table_foreach (key_table, g_relation_delete_tuple, relation); + + g_hash_table_remove (table, key); + + g_hash_table_destroy (key_table); + + /* @@@ FIXME: Remove empty hash tables. */ + + return count - relation->count; +} + +static void +g_relation_select_tuple (gpointer tuple_key, + gpointer tuple_value, + gpointer user_data) +{ + gpointer *tuple = (gpointer*) tuple_value; + GRealTuples *tuples = (GRealTuples*) user_data; + gint stride = sizeof (gpointer) * tuples->width; + + g_assert (tuple_key == tuple_value); + + memcpy (tuples->data + (tuples->len * tuples->width), + tuple, + stride); + + tuples->len += 1; +} + +/** + * g_relation_select: + * @relation: a #GRelation. + * @key: the value to compare with. + * @field: the field of each record to match. + * @Returns: the records (tuples) that matched. + * + * Returns all of the tuples which have the given key in the given + * field. Use g_tuples_index() to access the returned records. The + * returned records should be freed with g_tuples_destroy(). + **/ +GTuples* +g_relation_select (GRelation *relation, + gconstpointer key, + gint field) +{ + GHashTable *table; + GHashTable *key_table; + GRealTuples *tuples; + gint count; + + g_return_val_if_fail (relation != NULL, NULL); + + table = relation->hashed_tuple_tables[field]; + + g_return_val_if_fail (table != NULL, NULL); + + tuples = g_new0 (GRealTuples, 1); + key_table = g_hash_table_lookup (table, key); + + if (!key_table) + return (GTuples*)tuples; + + count = g_relation_count (relation, key, field); + + tuples->data = g_malloc (sizeof (gpointer) * relation->fields * count); + tuples->width = relation->fields; + + g_hash_table_foreach (key_table, g_relation_select_tuple, tuples); + + g_assert (count == tuples->len); + + return (GTuples*)tuples; +} + +/** + * g_relation_count: + * @relation: a #GRelation. + * @key: the value to compare with. + * @field: the field of each record to match. + * @Returns: the number of matches. + * + * Returns the number of tuples in a #GRelation that have the given + * value in the given field. + **/ +gint +g_relation_count (GRelation *relation, + gconstpointer key, + gint field) +{ + GHashTable *table; + GHashTable *key_table; + + g_return_val_if_fail (relation != NULL, 0); + + table = relation->hashed_tuple_tables[field]; + + g_return_val_if_fail (table != NULL, 0); + + key_table = g_hash_table_lookup (table, key); + + if (!key_table) + return 0; + + return g_hash_table_size (key_table); +} + +/** + * g_relation_exists: + * @relation: a #GRelation. + * @Varargs: the fields of the record to compare. The number must match + * the number of fields in the #GRelation. + * @Returns: %TRUE if a record matches. + * + * Returns %TRUE if a record with the given values exists in a + * #GRelation. Note that the values are compared directly, so that, for + * example, two copies of the same string will not match. + **/ +gboolean +g_relation_exists (GRelation *relation, ...) +{ + gpointer *tuple = g_slice_alloc (relation->fields * sizeof (gpointer)); + va_list args; + gint i; + gboolean result; + + va_start(args, relation); + + for (i = 0; i < relation->fields; i += 1) + tuple[i] = va_arg(args, gpointer); + + va_end(args); + + result = g_hash_table_lookup (relation->all_tuples, tuple) != NULL; + + g_slice_free1 (relation->fields * sizeof (gpointer), tuple); + + return result; +} + +/** + * g_tuples_destroy: + * @tuples: the tuple data to free. + * + * Frees the records which were returned by g_relation_select(). This + * should always be called after g_relation_select() when you are + * finished with the records. The records are not removed from the + * #GRelation. + **/ +void +g_tuples_destroy (GTuples *tuples0) +{ + GRealTuples *tuples = (GRealTuples*) tuples0; + + if (tuples) + { + g_free (tuples->data); + g_free (tuples); + } +} + +/** + * g_tuples_index: + * @tuples: the tuple data, returned by g_relation_select(). + * @index_: the index of the record. + * @field: the field to return. + * @Returns: the field of the record. + * + * Gets a field from the records returned by g_relation_select(). It + * returns the given field of the record at the given index. The + * returned value should not be changed. + **/ +gpointer +g_tuples_index (GTuples *tuples0, + gint index, + gint field) +{ + GRealTuples *tuples = (GRealTuples*) tuples0; + + g_return_val_if_fail (tuples0 != NULL, NULL); + g_return_val_if_fail (field < tuples->width, NULL); + + return tuples->data[index * tuples->width + field]; +} + +/* Print + */ + +static void +g_relation_print_one (gpointer tuple_key, + gpointer tuple_value, + gpointer user_data) +{ + gint i; + GString *gstring; + GRelation* rel = (GRelation*) user_data; + gpointer* tuples = (gpointer*) tuple_value; + + gstring = g_string_new ("["); + + for (i = 0; i < rel->fields; i += 1) + { + g_string_append_printf (gstring, "%p", tuples[i]); + + if (i < (rel->fields - 1)) + g_string_append (gstring, ","); + } + + g_string_append (gstring, "]"); + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "%s", gstring->str); + g_string_free (gstring, TRUE); +} + +static void +g_relation_print_index (gpointer tuple_key, + gpointer tuple_value, + gpointer user_data) +{ + GRelation* rel = (GRelation*) user_data; + GHashTable* table = (GHashTable*) tuple_value; + + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** key %p", tuple_key); + + g_hash_table_foreach (table, + g_relation_print_one, + rel); +} + +/** + * g_relation_print: + * @relation: a #GRelation. + * + * Outputs information about all records in a #GRelation, as well as + * the indexes. It is for debugging. + **/ +void +g_relation_print (GRelation *relation) +{ + gint i; + + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** all tuples (%d)", relation->count); + + g_hash_table_foreach (relation->all_tuples, + g_relation_print_one, + relation); + + for (i = 0; i < relation->fields; i += 1) + { + if (relation->hashed_tuple_tables[i] == NULL) + continue; + + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "*** index %d", i); + + g_hash_table_foreach (relation->hashed_tuple_tables[i], + g_relation_print_index, + relation); + } + +} + +#define __G_REL_C__ +#include "galiasdef.c" diff --git a/glib/grel.h b/glib/grel.h new file mode 100644 index 0000000..e7c9291 --- /dev/null +++ b/glib/grel.h @@ -0,0 +1,97 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_REL_H__ +#define __G_REL_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GRelation GRelation; +typedef struct _GTuples GTuples; + +struct _GTuples +{ + guint len; +}; + +/* GRelation + * + * Indexed Relations. Imagine a really simple table in a + * database. Relations are not ordered. This data type is meant for + * maintaining a N-way mapping. + * + * g_relation_new() creates a relation with FIELDS fields + * + * g_relation_destroy() frees all resources + * g_tuples_destroy() frees the result of g_relation_select() + * + * g_relation_index() indexes relation FIELD with the provided + * equality and hash functions. this must be done before any + * calls to insert are made. + * + * g_relation_insert() inserts a new tuple. you are expected to + * provide the right number of fields. + * + * g_relation_delete() deletes all relations with KEY in FIELD + * g_relation_select() returns ... + * g_relation_count() counts ... + */ + +GRelation* g_relation_new (gint fields); +void g_relation_destroy (GRelation *relation); +void g_relation_index (GRelation *relation, + gint field, + GHashFunc hash_func, + GEqualFunc key_equal_func); +void g_relation_insert (GRelation *relation, + ...); +gint g_relation_delete (GRelation *relation, + gconstpointer key, + gint field); +GTuples* g_relation_select (GRelation *relation, + gconstpointer key, + gint field); +gint g_relation_count (GRelation *relation, + gconstpointer key, + gint field); +gboolean g_relation_exists (GRelation *relation, + ...); +void g_relation_print (GRelation *relation); + +void g_tuples_destroy (GTuples *tuples); +gpointer g_tuples_index (GTuples *tuples, + gint index_, + gint field); + +G_END_DECLS + +#endif /* __G_REL_H__ */ diff --git a/glib/gscanner.c b/glib/gscanner.c new file mode 100644 index 0000000..233cc73 --- /dev/null +++ b/glib/gscanner.c @@ -0,0 +1,1767 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GScanner: Flexible lexical scanner for general purpose. + * Copyright (C) 1997, 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "glib.h" +#include "gprintfint.h" +#include "galias.h" + +#ifdef G_OS_WIN32 +#include /* For _read() */ +#endif + +/* --- defines --- */ +#define to_lower(c) ( \ + (guchar) ( \ + ( (((guchar)(c))>='A' && ((guchar)(c))<='Z') * ('a'-'A') ) | \ + ( (((guchar)(c))>=192 && ((guchar)(c))<=214) * (224-192) ) | \ + ( (((guchar)(c))>=216 && ((guchar)(c))<=222) * (248-216) ) | \ + ((guchar)(c)) \ + ) \ +) +#define READ_BUFFER_SIZE (4000) + + +/* --- typedefs --- */ +typedef struct _GScannerKey GScannerKey; + +struct _GScannerKey +{ + guint scope_id; + gchar *symbol; + gpointer value; +}; + + +/* --- variables --- */ +static const GScannerConfig g_scanner_config_template = +{ + ( + " \t\r\n" + ) /* cset_skip_characters */, + ( + G_CSET_a_2_z + "_" + G_CSET_A_2_Z + ) /* cset_identifier_first */, + ( + G_CSET_a_2_z + "_" + G_CSET_A_2_Z + G_CSET_DIGITS + G_CSET_LATINS + G_CSET_LATINC + ) /* cset_identifier_nth */, + ( "#\n" ) /* cpair_comment_single */, + + FALSE /* case_sensitive */, + + TRUE /* skip_comment_multi */, + TRUE /* skip_comment_single */, + TRUE /* scan_comment_multi */, + TRUE /* scan_identifier */, + FALSE /* scan_identifier_1char */, + FALSE /* scan_identifier_NULL */, + TRUE /* scan_symbols */, + FALSE /* scan_binary */, + TRUE /* scan_octal */, + TRUE /* scan_float */, + TRUE /* scan_hex */, + FALSE /* scan_hex_dollar */, + TRUE /* scan_string_sq */, + TRUE /* scan_string_dq */, + TRUE /* numbers_2_int */, + FALSE /* int_2_float */, + FALSE /* identifier_2_string */, + TRUE /* char_2_token */, + FALSE /* symbol_2_token */, + FALSE /* scope_0_fallback */, + FALSE /* store_int64 */, +}; + + +/* --- prototypes --- */ +static inline +GScannerKey* g_scanner_lookup_internal (GScanner *scanner, + guint scope_id, + const gchar *symbol); +static gboolean g_scanner_key_equal (gconstpointer v1, + gconstpointer v2); +static guint g_scanner_key_hash (gconstpointer v); +static void g_scanner_get_token_ll (GScanner *scanner, + GTokenType *token_p, + GTokenValue *value_p, + guint *line_p, + guint *position_p); +static void g_scanner_get_token_i (GScanner *scanner, + GTokenType *token_p, + GTokenValue *value_p, + guint *line_p, + guint *position_p); + +static guchar g_scanner_peek_next_char (GScanner *scanner); +static guchar g_scanner_get_char (GScanner *scanner, + guint *line_p, + guint *position_p); +static void g_scanner_msg_handler (GScanner *scanner, + gchar *message, + gboolean is_error); + + +/* --- functions --- */ +static inline gint +g_scanner_char_2_num (guchar c, + guchar base) +{ + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + return -1; + + if (c < base) + return c; + + return -1; +} + +GScanner* +g_scanner_new (const GScannerConfig *config_templ) +{ + GScanner *scanner; + + if (!config_templ) + config_templ = &g_scanner_config_template; + + scanner = g_new0 (GScanner, 1); + + scanner->user_data = NULL; + scanner->max_parse_errors = 1; + scanner->parse_errors = 0; + scanner->input_name = NULL; + g_datalist_init (&scanner->qdata); + + scanner->config = g_new0 (GScannerConfig, 1); + + scanner->config->case_sensitive = config_templ->case_sensitive; + scanner->config->cset_skip_characters = config_templ->cset_skip_characters; + if (!scanner->config->cset_skip_characters) + scanner->config->cset_skip_characters = ""; + scanner->config->cset_identifier_first = config_templ->cset_identifier_first; + scanner->config->cset_identifier_nth = config_templ->cset_identifier_nth; + scanner->config->cpair_comment_single = config_templ->cpair_comment_single; + scanner->config->skip_comment_multi = config_templ->skip_comment_multi; + scanner->config->skip_comment_single = config_templ->skip_comment_single; + scanner->config->scan_comment_multi = config_templ->scan_comment_multi; + scanner->config->scan_identifier = config_templ->scan_identifier; + scanner->config->scan_identifier_1char = config_templ->scan_identifier_1char; + scanner->config->scan_identifier_NULL = config_templ->scan_identifier_NULL; + scanner->config->scan_symbols = config_templ->scan_symbols; + scanner->config->scan_binary = config_templ->scan_binary; + scanner->config->scan_octal = config_templ->scan_octal; + scanner->config->scan_float = config_templ->scan_float; + scanner->config->scan_hex = config_templ->scan_hex; + scanner->config->scan_hex_dollar = config_templ->scan_hex_dollar; + scanner->config->scan_string_sq = config_templ->scan_string_sq; + scanner->config->scan_string_dq = config_templ->scan_string_dq; + scanner->config->numbers_2_int = config_templ->numbers_2_int; + scanner->config->int_2_float = config_templ->int_2_float; + scanner->config->identifier_2_string = config_templ->identifier_2_string; + scanner->config->char_2_token = config_templ->char_2_token; + scanner->config->symbol_2_token = config_templ->symbol_2_token; + scanner->config->scope_0_fallback = config_templ->scope_0_fallback; + scanner->config->store_int64 = config_templ->store_int64; + + scanner->token = G_TOKEN_NONE; + scanner->value.v_int64 = 0; + scanner->line = 1; + scanner->position = 0; + + scanner->next_token = G_TOKEN_NONE; + scanner->next_value.v_int64 = 0; + scanner->next_line = 1; + scanner->next_position = 0; + + scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal); + scanner->input_fd = -1; + scanner->text = NULL; + scanner->text_end = NULL; + scanner->buffer = NULL; + scanner->scope_id = 0; + + scanner->msg_handler = g_scanner_msg_handler; + + return scanner; +} + +static inline void +g_scanner_free_value (GTokenType *token_p, + GTokenValue *value_p) +{ + switch (*token_p) + { + case G_TOKEN_STRING: + case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER_NULL: + case G_TOKEN_COMMENT_SINGLE: + case G_TOKEN_COMMENT_MULTI: + g_free (value_p->v_string); + break; + + default: + break; + } + + *token_p = G_TOKEN_NONE; +} + +static void +g_scanner_destroy_symbol_table_entry (gpointer _key, + gpointer _value, + gpointer _data) +{ + GScannerKey *key = _key; + + g_free (key->symbol); + g_free (key); +} + +void +g_scanner_destroy (GScanner *scanner) +{ + g_return_if_fail (scanner != NULL); + + g_datalist_clear (&scanner->qdata); + g_hash_table_foreach (scanner->symbol_table, + g_scanner_destroy_symbol_table_entry, NULL); + g_hash_table_destroy (scanner->symbol_table); + g_scanner_free_value (&scanner->token, &scanner->value); + g_scanner_free_value (&scanner->next_token, &scanner->next_value); + g_free (scanner->config); + g_free (scanner->buffer); + g_free (scanner); +} + +static void +g_scanner_msg_handler (GScanner *scanner, + gchar *message, + gboolean is_error) +{ + g_return_if_fail (scanner != NULL); + + _g_fprintf (stderr, "%s:%d: ", + scanner->input_name ? scanner->input_name : "", + scanner->line); + if (is_error) + _g_fprintf (stderr, "error: "); + _g_fprintf (stderr, "%s\n", message); +} + +void +g_scanner_error (GScanner *scanner, + const gchar *format, + ...) +{ + g_return_if_fail (scanner != NULL); + g_return_if_fail (format != NULL); + + scanner->parse_errors++; + + if (scanner->msg_handler) + { + va_list args; + gchar *string; + + va_start (args, format); + string = g_strdup_vprintf (format, args); + va_end (args); + + scanner->msg_handler (scanner, string, TRUE); + + g_free (string); + } +} + +void +g_scanner_warn (GScanner *scanner, + const gchar *format, + ...) +{ + g_return_if_fail (scanner != NULL); + g_return_if_fail (format != NULL); + + if (scanner->msg_handler) + { + va_list args; + gchar *string; + + va_start (args, format); + string = g_strdup_vprintf (format, args); + va_end (args); + + scanner->msg_handler (scanner, string, FALSE); + + g_free (string); + } +} + +static gboolean +g_scanner_key_equal (gconstpointer v1, + gconstpointer v2) +{ + const GScannerKey *key1 = v1; + const GScannerKey *key2 = v2; + + return (key1->scope_id == key2->scope_id) && (strcmp (key1->symbol, key2->symbol) == 0); +} + +static guint +g_scanner_key_hash (gconstpointer v) +{ + const GScannerKey *key = v; + gchar *c; + guint h; + + h = key->scope_id; + for (c = key->symbol; *c; c++) + h = (h << 5) - h + *c; + + return h; +} + +static inline GScannerKey* +g_scanner_lookup_internal (GScanner *scanner, + guint scope_id, + const gchar *symbol) +{ + GScannerKey *key_p; + GScannerKey key; + + key.scope_id = scope_id; + + if (!scanner->config->case_sensitive) + { + gchar *d; + const gchar *c; + + key.symbol = g_new (gchar, strlen (symbol) + 1); + for (d = key.symbol, c = symbol; *c; c++, d++) + *d = to_lower (*c); + *d = 0; + key_p = g_hash_table_lookup (scanner->symbol_table, &key); + g_free (key.symbol); + } + else + { + key.symbol = (gchar*) symbol; + key_p = g_hash_table_lookup (scanner->symbol_table, &key); + } + + return key_p; +} + +void +g_scanner_scope_add_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol, + gpointer value) +{ + GScannerKey *key; + + g_return_if_fail (scanner != NULL); + g_return_if_fail (symbol != NULL); + + key = g_scanner_lookup_internal (scanner, scope_id, symbol); + + if (!key) + { + key = g_new (GScannerKey, 1); + key->scope_id = scope_id; + key->symbol = g_strdup (symbol); + key->value = value; + if (!scanner->config->case_sensitive) + { + gchar *c; + + c = key->symbol; + while (*c != 0) + { + *c = to_lower (*c); + c++; + } + } + g_hash_table_insert (scanner->symbol_table, key, key); + } + else + key->value = value; +} + +void +g_scanner_scope_remove_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol) +{ + GScannerKey *key; + + g_return_if_fail (scanner != NULL); + g_return_if_fail (symbol != NULL); + + key = g_scanner_lookup_internal (scanner, scope_id, symbol); + + if (key) + { + g_hash_table_remove (scanner->symbol_table, key); + g_free (key->symbol); + g_free (key); + } +} + +gpointer +g_scanner_lookup_symbol (GScanner *scanner, + const gchar *symbol) +{ + GScannerKey *key; + guint scope_id; + + g_return_val_if_fail (scanner != NULL, NULL); + + if (!symbol) + return NULL; + + scope_id = scanner->scope_id; + key = g_scanner_lookup_internal (scanner, scope_id, symbol); + if (!key && scope_id && scanner->config->scope_0_fallback) + key = g_scanner_lookup_internal (scanner, 0, symbol); + + if (key) + return key->value; + else + return NULL; +} + +gpointer +g_scanner_scope_lookup_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol) +{ + GScannerKey *key; + + g_return_val_if_fail (scanner != NULL, NULL); + + if (!symbol) + return NULL; + + key = g_scanner_lookup_internal (scanner, scope_id, symbol); + + if (key) + return key->value; + else + return NULL; +} + +guint +g_scanner_set_scope (GScanner *scanner, + guint scope_id) +{ + guint old_scope_id; + + g_return_val_if_fail (scanner != NULL, 0); + + old_scope_id = scanner->scope_id; + scanner->scope_id = scope_id; + + return old_scope_id; +} + +static void +g_scanner_foreach_internal (gpointer _key, + gpointer _value, + gpointer _user_data) +{ + GScannerKey *key; + gpointer *d; + GHFunc func; + gpointer user_data; + guint *scope_id; + + d = _user_data; + func = (GHFunc) d[0]; + user_data = d[1]; + scope_id = d[2]; + key = _value; + + if (key->scope_id == *scope_id) + func (key->symbol, key->value, user_data); +} + +void +g_scanner_scope_foreach_symbol (GScanner *scanner, + guint scope_id, + GHFunc func, + gpointer user_data) +{ + gpointer d[3]; + + g_return_if_fail (scanner != NULL); + + d[0] = (gpointer) func; + d[1] = user_data; + d[2] = &scope_id; + + g_hash_table_foreach (scanner->symbol_table, g_scanner_foreach_internal, d); +} + +GTokenType +g_scanner_peek_next_token (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); + + if (scanner->next_token == G_TOKEN_NONE) + { + scanner->next_line = scanner->line; + scanner->next_position = scanner->position; + g_scanner_get_token_i (scanner, + &scanner->next_token, + &scanner->next_value, + &scanner->next_line, + &scanner->next_position); + } + + return scanner->next_token; +} + +GTokenType +g_scanner_get_next_token (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); + + if (scanner->next_token != G_TOKEN_NONE) + { + g_scanner_free_value (&scanner->token, &scanner->value); + + scanner->token = scanner->next_token; + scanner->value = scanner->next_value; + scanner->line = scanner->next_line; + scanner->position = scanner->next_position; + scanner->next_token = G_TOKEN_NONE; + } + else + g_scanner_get_token_i (scanner, + &scanner->token, + &scanner->value, + &scanner->line, + &scanner->position); + + return scanner->token; +} + +GTokenType +g_scanner_cur_token (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); + + return scanner->token; +} + +GTokenValue +g_scanner_cur_value (GScanner *scanner) +{ + GTokenValue v; + + v.v_int64 = 0; + + g_return_val_if_fail (scanner != NULL, v); + + /* MSC isn't capable of handling return scanner->value; ? */ + + v = scanner->value; + + return v; +} + +guint +g_scanner_cur_line (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, 0); + + return scanner->line; +} + +guint +g_scanner_cur_position (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, 0); + + return scanner->position; +} + +gboolean +g_scanner_eof (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, TRUE); + + return scanner->token == G_TOKEN_EOF || scanner->token == G_TOKEN_ERROR; +} + +void +g_scanner_input_file (GScanner *scanner, + gint input_fd) +{ + g_return_if_fail (scanner != NULL); + g_return_if_fail (input_fd >= 0); + + if (scanner->input_fd >= 0) + g_scanner_sync_file_offset (scanner); + + scanner->token = G_TOKEN_NONE; + scanner->value.v_int64 = 0; + scanner->line = 1; + scanner->position = 0; + scanner->next_token = G_TOKEN_NONE; + + scanner->input_fd = input_fd; + scanner->text = NULL; + scanner->text_end = NULL; + + if (!scanner->buffer) + scanner->buffer = g_new (gchar, READ_BUFFER_SIZE + 1); +} + +void +g_scanner_input_text (GScanner *scanner, + const gchar *text, + guint text_len) +{ + g_return_if_fail (scanner != NULL); + if (text_len) + g_return_if_fail (text != NULL); + else + text = NULL; + + if (scanner->input_fd >= 0) + g_scanner_sync_file_offset (scanner); + + scanner->token = G_TOKEN_NONE; + scanner->value.v_int64 = 0; + scanner->line = 1; + scanner->position = 0; + scanner->next_token = G_TOKEN_NONE; + + scanner->input_fd = -1; + scanner->text = text; + scanner->text_end = text + text_len; + + if (scanner->buffer) + { + g_free (scanner->buffer); + scanner->buffer = NULL; + } +} + +static guchar +g_scanner_peek_next_char (GScanner *scanner) +{ + if (scanner->text < scanner->text_end) + { + return *scanner->text; + } + else if (scanner->input_fd >= 0) + { + gint count; + gchar *buffer; + + buffer = scanner->buffer; + do + { + count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); + } + while (count == -1 && (errno == EINTR || errno == EAGAIN)); + + if (count < 1) + { + scanner->input_fd = -1; + + return 0; + } + else + { + scanner->text = buffer; + scanner->text_end = buffer + count; + + return *buffer; + } + } + else + return 0; +} + +void +g_scanner_sync_file_offset (GScanner *scanner) +{ + g_return_if_fail (scanner != NULL); + + /* for file input, rewind the filedescriptor to the current + * buffer position and blow the file read ahead buffer. useful + * for third party uses of our file descriptor, which hooks + * onto the current scanning position. + */ + + if (scanner->input_fd >= 0 && scanner->text_end > scanner->text) + { + gint buffered; + + buffered = scanner->text_end - scanner->text; + if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0) + { + /* we succeeded, blow our buffer's contents now */ + scanner->text = NULL; + scanner->text_end = NULL; + } + else + errno = 0; + } +} + +static guchar +g_scanner_get_char (GScanner *scanner, + guint *line_p, + guint *position_p) +{ + guchar fchar; + + if (scanner->text < scanner->text_end) + fchar = *(scanner->text++); + else if (scanner->input_fd >= 0) + { + gint count; + gchar *buffer; + + buffer = scanner->buffer; + do + { + count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); + } + while (count == -1 && (errno == EINTR || errno == EAGAIN)); + + if (count < 1) + { + scanner->input_fd = -1; + fchar = 0; + } + else + { + scanner->text = buffer + 1; + scanner->text_end = buffer + count; + fchar = *buffer; + if (!fchar) + { + g_scanner_sync_file_offset (scanner); + scanner->text_end = scanner->text; + scanner->input_fd = -1; + } + } + } + else + fchar = 0; + + if (fchar == '\n') + { + (*position_p) = 0; + (*line_p)++; + } + else if (fchar) + { + (*position_p)++; + } + + return fchar; +} + +void +g_scanner_unexp_token (GScanner *scanner, + GTokenType expected_token, + const gchar *identifier_spec, + const gchar *symbol_spec, + const gchar *symbol_name, + const gchar *message, + gint is_error) +{ + gchar *token_string; + guint token_string_len; + gchar *expected_string; + guint expected_string_len; + gchar *message_prefix; + gboolean print_unexp; + void (*msg_handler) (GScanner*, const gchar*, ...); + + g_return_if_fail (scanner != NULL); + + if (is_error) + msg_handler = g_scanner_error; + else + msg_handler = g_scanner_warn; + + if (!identifier_spec) + identifier_spec = "identifier"; + if (!symbol_spec) + symbol_spec = "symbol"; + + token_string_len = 56; + token_string = g_new (gchar, token_string_len + 1); + expected_string_len = 64; + expected_string = g_new (gchar, expected_string_len + 1); + print_unexp = TRUE; + + switch (scanner->token) + { + case G_TOKEN_EOF: + _g_snprintf (token_string, token_string_len, "end of file"); + break; + + default: + if (scanner->token >= 1 && scanner->token <= 255) + { + if ((scanner->token >= ' ' && scanner->token <= '~') || + strchr (scanner->config->cset_identifier_first, scanner->token) || + strchr (scanner->config->cset_identifier_nth, scanner->token)) + _g_snprintf (token_string, token_string_len, "character `%c'", scanner->token); + else + _g_snprintf (token_string, token_string_len, "character `\\%o'", scanner->token); + break; + } + else if (!scanner->config->symbol_2_token) + { + _g_snprintf (token_string, token_string_len, "(unknown) token <%d>", scanner->token); + break; + } + /* fall through */ + case G_TOKEN_SYMBOL: + if (expected_token == G_TOKEN_SYMBOL || + (scanner->config->symbol_2_token && + expected_token > G_TOKEN_LAST)) + print_unexp = FALSE; + if (symbol_name) + _g_snprintf (token_string, + token_string_len, + "%s%s `%s'", + print_unexp ? "" : "invalid ", + symbol_spec, + symbol_name); + else + _g_snprintf (token_string, + token_string_len, + "%s%s", + print_unexp ? "" : "invalid ", + symbol_spec); + break; + + case G_TOKEN_ERROR: + print_unexp = FALSE; + expected_token = G_TOKEN_NONE; + switch (scanner->value.v_error) + { + case G_ERR_UNEXP_EOF: + _g_snprintf (token_string, token_string_len, "scanner: unexpected end of file"); + break; + + case G_ERR_UNEXP_EOF_IN_STRING: + _g_snprintf (token_string, token_string_len, "scanner: unterminated string constant"); + break; + + case G_ERR_UNEXP_EOF_IN_COMMENT: + _g_snprintf (token_string, token_string_len, "scanner: unterminated comment"); + break; + + case G_ERR_NON_DIGIT_IN_CONST: + _g_snprintf (token_string, token_string_len, "scanner: non digit in constant"); + break; + + case G_ERR_FLOAT_RADIX: + _g_snprintf (token_string, token_string_len, "scanner: invalid radix for floating constant"); + break; + + case G_ERR_FLOAT_MALFORMED: + _g_snprintf (token_string, token_string_len, "scanner: malformed floating constant"); + break; + + case G_ERR_DIGIT_RADIX: + _g_snprintf (token_string, token_string_len, "scanner: digit is beyond radix"); + break; + + case G_ERR_UNKNOWN: + default: + _g_snprintf (token_string, token_string_len, "scanner: unknown error"); + break; + } + break; + + case G_TOKEN_CHAR: + _g_snprintf (token_string, token_string_len, "character `%c'", scanner->value.v_char); + break; + + case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER_NULL: + if (expected_token == G_TOKEN_IDENTIFIER || + expected_token == G_TOKEN_IDENTIFIER_NULL) + print_unexp = FALSE; + _g_snprintf (token_string, + token_string_len, + "%s%s `%s'", + print_unexp ? "" : "invalid ", + identifier_spec, + scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null"); + break; + + case G_TOKEN_BINARY: + case G_TOKEN_OCTAL: + case G_TOKEN_INT: + case G_TOKEN_HEX: + if (scanner->config->store_int64) + _g_snprintf (token_string, token_string_len, "number `%" G_GUINT64_FORMAT "'", scanner->value.v_int64); + else + _g_snprintf (token_string, token_string_len, "number `%lu'", scanner->value.v_int); + break; + + case G_TOKEN_FLOAT: + _g_snprintf (token_string, token_string_len, "number `%.3f'", scanner->value.v_float); + break; + + case G_TOKEN_STRING: + if (expected_token == G_TOKEN_STRING) + print_unexp = FALSE; + _g_snprintf (token_string, + token_string_len, + "%s%sstring constant \"%s\"", + print_unexp ? "" : "invalid ", + scanner->value.v_string[0] == 0 ? "empty " : "", + scanner->value.v_string); + token_string[token_string_len - 2] = '"'; + token_string[token_string_len - 1] = 0; + break; + + case G_TOKEN_COMMENT_SINGLE: + case G_TOKEN_COMMENT_MULTI: + _g_snprintf (token_string, token_string_len, "comment"); + break; + + case G_TOKEN_NONE: + /* somehow the user's parsing code is screwed, there isn't much + * we can do about it. + * Note, a common case to trigger this is + * g_scanner_peek_next_token(); g_scanner_unexp_token(); + * without an intermediate g_scanner_get_next_token(). + */ + g_assert_not_reached (); + break; + } + + + switch (expected_token) + { + gboolean need_valid; + gchar *tstring; + case G_TOKEN_EOF: + _g_snprintf (expected_string, expected_string_len, "end of file"); + break; + default: + if (expected_token >= 1 && expected_token <= 255) + { + if ((expected_token >= ' ' && expected_token <= '~') || + strchr (scanner->config->cset_identifier_first, expected_token) || + strchr (scanner->config->cset_identifier_nth, expected_token)) + _g_snprintf (expected_string, expected_string_len, "character `%c'", expected_token); + else + _g_snprintf (expected_string, expected_string_len, "character `\\%o'", expected_token); + break; + } + else if (!scanner->config->symbol_2_token) + { + _g_snprintf (expected_string, expected_string_len, "(unknown) token <%d>", expected_token); + break; + } + /* fall through */ + case G_TOKEN_SYMBOL: + need_valid = (scanner->token == G_TOKEN_SYMBOL || + (scanner->config->symbol_2_token && + scanner->token > G_TOKEN_LAST)); + _g_snprintf (expected_string, + expected_string_len, + "%s%s", + need_valid ? "valid " : "", + symbol_spec); + /* FIXME: should we attempt to lookup the symbol_name for symbol_2_token? */ + break; + case G_TOKEN_CHAR: + _g_snprintf (expected_string, expected_string_len, "%scharacter", + scanner->token == G_TOKEN_CHAR ? "valid " : ""); + break; + case G_TOKEN_BINARY: + tstring = "binary"; + _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_OCTAL: + tstring = "octal"; + _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_INT: + tstring = "integer"; + _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_HEX: + tstring = "hexadecimal"; + _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_FLOAT: + tstring = "float"; + _g_snprintf (expected_string, expected_string_len, "%snumber (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_STRING: + _g_snprintf (expected_string, + expected_string_len, + "%sstring constant", + scanner->token == G_TOKEN_STRING ? "valid " : ""); + break; + case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER_NULL: + need_valid = (scanner->token == G_TOKEN_IDENTIFIER_NULL || + scanner->token == G_TOKEN_IDENTIFIER); + _g_snprintf (expected_string, + expected_string_len, + "%s%s", + need_valid ? "valid " : "", + identifier_spec); + break; + case G_TOKEN_COMMENT_SINGLE: + tstring = "single-line"; + _g_snprintf (expected_string, expected_string_len, "%scomment (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_COMMENT_MULTI: + tstring = "multi-line"; + _g_snprintf (expected_string, expected_string_len, "%scomment (%s)", + scanner->token == expected_token ? "valid " : "", tstring); + break; + case G_TOKEN_NONE: + case G_TOKEN_ERROR: + /* this is handled upon printout */ + break; + } + + if (message && message[0] != 0) + message_prefix = " - "; + else + { + message_prefix = ""; + message = ""; + } + if (expected_token == G_TOKEN_ERROR) + { + msg_handler (scanner, + "failure around %s%s%s", + token_string, + message_prefix, + message); + } + else if (expected_token == G_TOKEN_NONE) + { + if (print_unexp) + msg_handler (scanner, + "unexpected %s%s%s", + token_string, + message_prefix, + message); + else + msg_handler (scanner, + "%s%s%s", + token_string, + message_prefix, + message); + } + else + { + if (print_unexp) + msg_handler (scanner, + "unexpected %s, expected %s%s%s", + token_string, + expected_string, + message_prefix, + message); + else + msg_handler (scanner, + "%s, expected %s%s%s", + token_string, + expected_string, + message_prefix, + message); + } + + g_free (token_string); + g_free (expected_string); +} + +static void +g_scanner_get_token_i (GScanner *scanner, + GTokenType *token_p, + GTokenValue *value_p, + guint *line_p, + guint *position_p) +{ + do + { + g_scanner_free_value (token_p, value_p); + g_scanner_get_token_ll (scanner, token_p, value_p, line_p, position_p); + } + while (((*token_p > 0 && *token_p < 256) && + strchr (scanner->config->cset_skip_characters, *token_p)) || + (*token_p == G_TOKEN_CHAR && + strchr (scanner->config->cset_skip_characters, value_p->v_char)) || + (*token_p == G_TOKEN_COMMENT_MULTI && + scanner->config->skip_comment_multi) || + (*token_p == G_TOKEN_COMMENT_SINGLE && + scanner->config->skip_comment_single)); + + switch (*token_p) + { + case G_TOKEN_IDENTIFIER: + if (scanner->config->identifier_2_string) + *token_p = G_TOKEN_STRING; + break; + + case G_TOKEN_SYMBOL: + if (scanner->config->symbol_2_token) + *token_p = (GTokenType) value_p->v_symbol; + break; + + case G_TOKEN_BINARY: + case G_TOKEN_OCTAL: + case G_TOKEN_HEX: + if (scanner->config->numbers_2_int) + *token_p = G_TOKEN_INT; + break; + + default: + break; + } + + if (*token_p == G_TOKEN_INT && + scanner->config->int_2_float) + { + *token_p = G_TOKEN_FLOAT; + if (scanner->config->store_int64) + { +#ifdef _MSC_VER + /* work around error C2520, see gvaluetransform.c */ + value_p->v_float = (__int64)value_p->v_int64; +#else + value_p->v_float = value_p->v_int64; +#endif + } + else + value_p->v_float = value_p->v_int; + } + + errno = 0; +} + +static void +g_scanner_get_token_ll (GScanner *scanner, + GTokenType *token_p, + GTokenValue *value_p, + guint *line_p, + guint *position_p) +{ + GScannerConfig *config; + GTokenType token; + gboolean in_comment_multi; + gboolean in_comment_single; + gboolean in_string_sq; + gboolean in_string_dq; + GString *gstring; + GTokenValue value; + guchar ch; + + config = scanner->config; + (*value_p).v_int64 = 0; + + if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) || + scanner->token == G_TOKEN_EOF) + { + *token_p = G_TOKEN_EOF; + return; + } + + in_comment_multi = FALSE; + in_comment_single = FALSE; + in_string_sq = FALSE; + in_string_dq = FALSE; + gstring = NULL; + + do /* while (ch != 0) */ + { + gboolean dotted_float = FALSE; + + ch = g_scanner_get_char (scanner, line_p, position_p); + + value.v_int64 = 0; + token = G_TOKEN_NONE; + + /* this is *evil*, but needed ;( + * we first check for identifier first character, because it + * might interfere with other key chars like slashes or numbers + */ + if (config->scan_identifier && + ch && strchr (config->cset_identifier_first, ch)) + goto identifier_precedence; + + switch (ch) + { + case 0: + token = G_TOKEN_EOF; + (*position_p)++; + /* ch = 0; */ + break; + + case '/': + if (!config->scan_comment_multi || + g_scanner_peek_next_char (scanner) != '*') + goto default_case; + g_scanner_get_char (scanner, line_p, position_p); + token = G_TOKEN_COMMENT_MULTI; + in_comment_multi = TRUE; + gstring = g_string_new (NULL); + while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) + { + if (ch == '*' && g_scanner_peek_next_char (scanner) == '/') + { + g_scanner_get_char (scanner, line_p, position_p); + in_comment_multi = FALSE; + break; + } + else + gstring = g_string_append_c (gstring, ch); + } + ch = 0; + break; + + case '\'': + if (!config->scan_string_sq) + goto default_case; + token = G_TOKEN_STRING; + in_string_sq = TRUE; + gstring = g_string_new (NULL); + while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) + { + if (ch == '\'') + { + in_string_sq = FALSE; + break; + } + else + gstring = g_string_append_c (gstring, ch); + } + ch = 0; + break; + + case '"': + if (!config->scan_string_dq) + goto default_case; + token = G_TOKEN_STRING; + in_string_dq = TRUE; + gstring = g_string_new (NULL); + while ((ch = g_scanner_get_char (scanner, line_p, position_p)) != 0) + { + if (ch == '"') + { + in_string_dq = FALSE; + break; + } + else + { + if (ch == '\\') + { + ch = g_scanner_get_char (scanner, line_p, position_p); + switch (ch) + { + guint i; + guint fchar; + + case 0: + break; + + case '\\': + gstring = g_string_append_c (gstring, '\\'); + break; + + case 'n': + gstring = g_string_append_c (gstring, '\n'); + break; + + case 't': + gstring = g_string_append_c (gstring, '\t'); + break; + + case 'r': + gstring = g_string_append_c (gstring, '\r'); + break; + + case 'b': + gstring = g_string_append_c (gstring, '\b'); + break; + + case 'f': + gstring = g_string_append_c (gstring, '\f'); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + i = ch - '0'; + fchar = g_scanner_peek_next_char (scanner); + if (fchar >= '0' && fchar <= '7') + { + ch = g_scanner_get_char (scanner, line_p, position_p); + i = i * 8 + ch - '0'; + fchar = g_scanner_peek_next_char (scanner); + if (fchar >= '0' && fchar <= '7') + { + ch = g_scanner_get_char (scanner, line_p, position_p); + i = i * 8 + ch - '0'; + } + } + gstring = g_string_append_c (gstring, i); + break; + + default: + gstring = g_string_append_c (gstring, ch); + break; + } + } + else + gstring = g_string_append_c (gstring, ch); + } + } + ch = 0; + break; + + case '.': + if (!config->scan_float) + goto default_case; + token = G_TOKEN_FLOAT; + dotted_float = TRUE; + ch = g_scanner_get_char (scanner, line_p, position_p); + goto number_parsing; + + case '$': + if (!config->scan_hex_dollar) + goto default_case; + token = G_TOKEN_HEX; + ch = g_scanner_get_char (scanner, line_p, position_p); + goto number_parsing; + + case '0': + if (config->scan_octal) + token = G_TOKEN_OCTAL; + else + token = G_TOKEN_INT; + ch = g_scanner_peek_next_char (scanner); + if (config->scan_hex && (ch == 'x' || ch == 'X')) + { + token = G_TOKEN_HEX; + g_scanner_get_char (scanner, line_p, position_p); + ch = g_scanner_get_char (scanner, line_p, position_p); + if (ch == 0) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_UNEXP_EOF; + (*position_p)++; + break; + } + if (g_scanner_char_2_num (ch, 16) < 0) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_DIGIT_RADIX; + ch = 0; + break; + } + } + else if (config->scan_binary && (ch == 'b' || ch == 'B')) + { + token = G_TOKEN_BINARY; + g_scanner_get_char (scanner, line_p, position_p); + ch = g_scanner_get_char (scanner, line_p, position_p); + if (ch == 0) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_UNEXP_EOF; + (*position_p)++; + break; + } + if (g_scanner_char_2_num (ch, 10) < 0) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + ch = 0; + break; + } + } + else + ch = '0'; + /* fall through */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + number_parsing: + { + gboolean in_number = TRUE; + gchar *endptr; + + if (token == G_TOKEN_NONE) + token = G_TOKEN_INT; + + gstring = g_string_new (dotted_float ? "0." : ""); + gstring = g_string_append_c (gstring, ch); + + do /* while (in_number) */ + { + gboolean is_E; + + is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E'); + + ch = g_scanner_peek_next_char (scanner); + + if (g_scanner_char_2_num (ch, 36) >= 0 || + (config->scan_float && ch == '.') || + (is_E && (ch == '+' || ch == '-'))) + { + ch = g_scanner_get_char (scanner, line_p, position_p); + + switch (ch) + { + case '.': + if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL) + { + value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX; + token = G_TOKEN_ERROR; + in_number = FALSE; + } + else + { + token = G_TOKEN_FLOAT; + gstring = g_string_append_c (gstring, ch); + } + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + gstring = g_string_append_c (gstring, ch); + break; + + case '-': + case '+': + if (token != G_TOKEN_FLOAT) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + in_number = FALSE; + } + else + gstring = g_string_append_c (gstring, ch); + break; + + case 'e': + case 'E': + if ((token != G_TOKEN_HEX && !config->scan_float) || + (token != G_TOKEN_HEX && + token != G_TOKEN_OCTAL && + token != G_TOKEN_FLOAT && + token != G_TOKEN_INT)) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + in_number = FALSE; + } + else + { + if (token != G_TOKEN_HEX) + token = G_TOKEN_FLOAT; + gstring = g_string_append_c (gstring, ch); + } + break; + + default: + if (token != G_TOKEN_HEX) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + in_number = FALSE; + } + else + gstring = g_string_append_c (gstring, ch); + break; + } + } + else + in_number = FALSE; + } + while (in_number); + + endptr = NULL; + if (token == G_TOKEN_FLOAT) + value.v_float = g_strtod (gstring->str, &endptr); + else + { + guint64 ui64 = 0; + switch (token) + { + case G_TOKEN_BINARY: + ui64 = g_ascii_strtoull (gstring->str, &endptr, 2); + break; + case G_TOKEN_OCTAL: + ui64 = g_ascii_strtoull (gstring->str, &endptr, 8); + break; + case G_TOKEN_INT: + ui64 = g_ascii_strtoull (gstring->str, &endptr, 10); + break; + case G_TOKEN_HEX: + ui64 = g_ascii_strtoull (gstring->str, &endptr, 16); + break; + default: ; + } + if (scanner->config->store_int64) + value.v_int64 = ui64; + else + value.v_int = ui64; + } + if (endptr && *endptr) + { + token = G_TOKEN_ERROR; + if (*endptr == 'e' || *endptr == 'E') + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + else + value.v_error = G_ERR_DIGIT_RADIX; + } + g_string_free (gstring, TRUE); + gstring = NULL; + ch = 0; + } /* number_parsing:... */ + break; + + default: + default_case: + { + if (config->cpair_comment_single && + ch == config->cpair_comment_single[0]) + { + token = G_TOKEN_COMMENT_SINGLE; + in_comment_single = TRUE; + gstring = g_string_new (NULL); + ch = g_scanner_get_char (scanner, line_p, position_p); + while (ch != 0) + { + if (ch == config->cpair_comment_single[1]) + { + in_comment_single = FALSE; + ch = 0; + break; + } + + gstring = g_string_append_c (gstring, ch); + ch = g_scanner_get_char (scanner, line_p, position_p); + } + /* ignore a missing newline at EOF for single line comments */ + if (in_comment_single && + config->cpair_comment_single[1] == '\n') + in_comment_single = FALSE; + } + else if (config->scan_identifier && ch && + strchr (config->cset_identifier_first, ch)) + { + identifier_precedence: + + if (config->cset_identifier_nth && ch && + strchr (config->cset_identifier_nth, + g_scanner_peek_next_char (scanner))) + { + token = G_TOKEN_IDENTIFIER; + gstring = g_string_new (NULL); + gstring = g_string_append_c (gstring, ch); + do + { + ch = g_scanner_get_char (scanner, line_p, position_p); + gstring = g_string_append_c (gstring, ch); + ch = g_scanner_peek_next_char (scanner); + } + while (ch && strchr (config->cset_identifier_nth, ch)); + ch = 0; + } + else if (config->scan_identifier_1char) + { + token = G_TOKEN_IDENTIFIER; + value.v_identifier = g_new0 (gchar, 2); + value.v_identifier[0] = ch; + ch = 0; + } + } + if (ch) + { + if (config->char_2_token) + token = ch; + else + { + token = G_TOKEN_CHAR; + value.v_char = ch; + } + ch = 0; + } + } /* default_case:... */ + break; + } + g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */ + } + while (ch != 0); + + if (in_comment_multi || in_comment_single || + in_string_sq || in_string_dq) + { + token = G_TOKEN_ERROR; + if (gstring) + { + g_string_free (gstring, TRUE); + gstring = NULL; + } + (*position_p)++; + if (in_comment_multi || in_comment_single) + value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT; + else /* (in_string_sq || in_string_dq) */ + value.v_error = G_ERR_UNEXP_EOF_IN_STRING; + } + + if (gstring) + { + value.v_string = g_string_free (gstring, FALSE); + gstring = NULL; + } + + if (token == G_TOKEN_IDENTIFIER) + { + if (config->scan_symbols) + { + GScannerKey *key; + guint scope_id; + + scope_id = scanner->scope_id; + key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier); + if (!key && scope_id && scanner->config->scope_0_fallback) + key = g_scanner_lookup_internal (scanner, 0, value.v_identifier); + + if (key) + { + g_free (value.v_identifier); + token = G_TOKEN_SYMBOL; + value.v_symbol = key->value; + } + } + + if (token == G_TOKEN_IDENTIFIER && + config->scan_identifier_NULL && + strlen (value.v_identifier) == 4) + { + gchar *null_upper = "NULL"; + gchar *null_lower = "null"; + + if (scanner->config->case_sensitive) + { + if (value.v_identifier[0] == null_upper[0] && + value.v_identifier[1] == null_upper[1] && + value.v_identifier[2] == null_upper[2] && + value.v_identifier[3] == null_upper[3]) + token = G_TOKEN_IDENTIFIER_NULL; + } + else + { + if ((value.v_identifier[0] == null_upper[0] || + value.v_identifier[0] == null_lower[0]) && + (value.v_identifier[1] == null_upper[1] || + value.v_identifier[1] == null_lower[1]) && + (value.v_identifier[2] == null_upper[2] || + value.v_identifier[2] == null_lower[2]) && + (value.v_identifier[3] == null_upper[3] || + value.v_identifier[3] == null_lower[3])) + token = G_TOKEN_IDENTIFIER_NULL; + } + } + } + + *token_p = token; + *value_p = value; +} + +#define __G_SCANNER_C__ +#include "galiasdef.c" diff --git a/glib/gscanner.h b/glib/gscanner.h new file mode 100644 index 0000000..3b7ad6f --- /dev/null +++ b/glib/gscanner.h @@ -0,0 +1,278 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SCANNER_H__ +#define __G_SCANNER_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GScanner GScanner; +typedef struct _GScannerConfig GScannerConfig; +typedef union _GTokenValue GTokenValue; + +typedef void (*GScannerMsgFunc) (GScanner *scanner, + gchar *message, + gboolean error); + +/* GScanner: Flexible lexical scanner for general purpose. + */ + +/* Character sets */ +#define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz" +#define G_CSET_DIGITS "0123456789" +#define G_CSET_LATINC "\300\301\302\303\304\305\306"\ + "\307\310\311\312\313\314\315\316\317\320"\ + "\321\322\323\324\325\326"\ + "\330\331\332\333\334\335\336" +#define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\ + "\347\350\351\352\353\354\355\356\357\360"\ + "\361\362\363\364\365\366"\ + "\370\371\372\373\374\375\376\377" + +/* Error types */ +typedef enum +{ + G_ERR_UNKNOWN, + G_ERR_UNEXP_EOF, + G_ERR_UNEXP_EOF_IN_STRING, + G_ERR_UNEXP_EOF_IN_COMMENT, + G_ERR_NON_DIGIT_IN_CONST, + G_ERR_DIGIT_RADIX, + G_ERR_FLOAT_RADIX, + G_ERR_FLOAT_MALFORMED +} GErrorType; + +/* Token types */ +typedef enum +{ + G_TOKEN_EOF = 0, + + G_TOKEN_LEFT_PAREN = '(', + G_TOKEN_RIGHT_PAREN = ')', + G_TOKEN_LEFT_CURLY = '{', + G_TOKEN_RIGHT_CURLY = '}', + G_TOKEN_LEFT_BRACE = '[', + G_TOKEN_RIGHT_BRACE = ']', + G_TOKEN_EQUAL_SIGN = '=', + G_TOKEN_COMMA = ',', + + G_TOKEN_NONE = 256, + + G_TOKEN_ERROR, + + G_TOKEN_CHAR, + G_TOKEN_BINARY, + G_TOKEN_OCTAL, + G_TOKEN_INT, + G_TOKEN_HEX, + G_TOKEN_FLOAT, + G_TOKEN_STRING, + + G_TOKEN_SYMBOL, + G_TOKEN_IDENTIFIER, + G_TOKEN_IDENTIFIER_NULL, + + G_TOKEN_COMMENT_SINGLE, + G_TOKEN_COMMENT_MULTI, + G_TOKEN_LAST +} GTokenType; + +union _GTokenValue +{ + gpointer v_symbol; + gchar *v_identifier; + gulong v_binary; + gulong v_octal; + gulong v_int; + guint64 v_int64; + gdouble v_float; + gulong v_hex; + gchar *v_string; + gchar *v_comment; + guchar v_char; + guint v_error; +}; + +struct _GScannerConfig +{ + /* Character sets + */ + gchar *cset_skip_characters; /* default: " \t\n" */ + gchar *cset_identifier_first; + gchar *cset_identifier_nth; + gchar *cpair_comment_single; /* default: "#\n" */ + + /* Should symbol lookup work case sensitive? + */ + guint case_sensitive : 1; + + /* Boolean values to be adjusted "on the fly" + * to configure scanning behaviour. + */ + guint skip_comment_multi : 1; /* C like comment */ + guint skip_comment_single : 1; /* single line comment */ + guint scan_comment_multi : 1; /* scan multi line comments? */ + guint scan_identifier : 1; + guint scan_identifier_1char : 1; + guint scan_identifier_NULL : 1; + guint scan_symbols : 1; + guint scan_binary : 1; + guint scan_octal : 1; + guint scan_float : 1; + guint scan_hex : 1; /* `0x0ff0' */ + guint scan_hex_dollar : 1; /* `$0ff0' */ + guint scan_string_sq : 1; /* string: 'anything' */ + guint scan_string_dq : 1; /* string: "\\-escapes!\n" */ + guint numbers_2_int : 1; /* bin, octal, hex => int */ + guint int_2_float : 1; /* int => G_TOKEN_FLOAT? */ + guint identifier_2_string : 1; + guint char_2_token : 1; /* return G_TOKEN_CHAR? */ + guint symbol_2_token : 1; + guint scope_0_fallback : 1; /* try scope 0 on lookups? */ + guint store_int64 : 1; /* use value.v_int64 rather than v_int */ + guint padding_dummy; +}; + +struct _GScanner +{ + /* unused fields */ + gpointer user_data; + guint max_parse_errors; + + /* g_scanner_error() increments this field */ + guint parse_errors; + + /* name of input stream, featured by the default message handler */ + const gchar *input_name; + + /* quarked data */ + GData *qdata; + + /* link into the scanner configuration */ + GScannerConfig *config; + + /* fields filled in after g_scanner_get_next_token() */ + GTokenType token; + GTokenValue value; + guint line; + guint position; + + /* fields filled in after g_scanner_peek_next_token() */ + GTokenType next_token; + GTokenValue next_value; + guint next_line; + guint next_position; + + /* to be considered private */ + GHashTable *symbol_table; + gint input_fd; + const gchar *text; + const gchar *text_end; + gchar *buffer; + guint scope_id; + + /* handler function for _warn and _error */ + GScannerMsgFunc msg_handler; +}; + +GScanner* g_scanner_new (const GScannerConfig *config_templ); +void g_scanner_destroy (GScanner *scanner); +void g_scanner_input_file (GScanner *scanner, + gint input_fd); +void g_scanner_sync_file_offset (GScanner *scanner); +void g_scanner_input_text (GScanner *scanner, + const gchar *text, + guint text_len); +GTokenType g_scanner_get_next_token (GScanner *scanner); +GTokenType g_scanner_peek_next_token (GScanner *scanner); +GTokenType g_scanner_cur_token (GScanner *scanner); +GTokenValue g_scanner_cur_value (GScanner *scanner); +guint g_scanner_cur_line (GScanner *scanner); +guint g_scanner_cur_position (GScanner *scanner); +gboolean g_scanner_eof (GScanner *scanner); +guint g_scanner_set_scope (GScanner *scanner, + guint scope_id); +void g_scanner_scope_add_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol, + gpointer value); +void g_scanner_scope_remove_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol); +gpointer g_scanner_scope_lookup_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol); +void g_scanner_scope_foreach_symbol (GScanner *scanner, + guint scope_id, + GHFunc func, + gpointer user_data); +gpointer g_scanner_lookup_symbol (GScanner *scanner, + const gchar *symbol); +void g_scanner_unexp_token (GScanner *scanner, + GTokenType expected_token, + const gchar *identifier_spec, + const gchar *symbol_spec, + const gchar *symbol_name, + const gchar *message, + gint is_error); +void g_scanner_error (GScanner *scanner, + const gchar *format, + ...) G_GNUC_PRINTF (2,3); +void g_scanner_warn (GScanner *scanner, + const gchar *format, + ...) G_GNUC_PRINTF (2,3); + +#ifndef G_DISABLE_DEPRECATED + +/* keep downward source compatibility */ +#define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \ + g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \ +} G_STMT_END +#define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \ + g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \ +} G_STMT_END +#define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \ + g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \ +} G_STMT_END + +/* The following two functions are deprecated and will be removed in + * the next major release. They do no good. */ +#define g_scanner_freeze_symbol_table(scanner) ((void)0) +#define g_scanner_thaw_symbol_table(scanner) ((void)0) + +#endif /* G_DISABLE_DEPRECATED */ + +G_END_DECLS + +#endif /* __G_SCANNER_H__ */ diff --git a/glib/gscripttable.h b/glib/gscripttable.h new file mode 100644 index 0000000..b63e2da --- /dev/null +++ b/glib/gscripttable.h @@ -0,0 +1,3012 @@ +/* gscripttable.h: Generated by gen-script-table.pl + * + * Date: Mon Apr 7 23:17:02 2008 + * Source: Scripts-5.1.0.txt + * + * Do not edit. + */ + +#define G_EASY_SCRIPTS_RANGE 8192 + +static const guchar g_script_easy_table[8192] = { + + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, + G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, + G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, + G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, + G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, G_UNICODE_SCRIPT_COPTIC, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARMENIAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_HEBREW, + G_UNICODE_SCRIPT_HEBREW, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, G_UNICODE_SCRIPT_SYRIAC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, + G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_THAANA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, G_UNICODE_SCRIPT_NKO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, + G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_DEVANAGARI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, + G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_BENGALI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, + G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_GURMUKHI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_GUJARATI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GUJARATI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, + G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_ORIYA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_TAMIL, + G_UNICODE_SCRIPT_TAMIL, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, + G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_TELUGU, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, G_UNICODE_SCRIPT_KANNADA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, G_UNICODE_SCRIPT_MALAYALAM, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, G_UNICODE_SCRIPT_SINHALA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_THAI, + G_UNICODE_SCRIPT_THAI, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_LAO, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, G_UNICODE_SCRIPT_TIBETAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, G_UNICODE_SCRIPT_HANGUL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, G_UNICODE_SCRIPT_CHEROKEE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, + G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_OGHAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_RUNIC, + G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_RUNIC, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, + G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_TAGALOG, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_HANUNOO, + G_UNICODE_SCRIPT_HANUNOO, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, + G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_BUHID, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAGBANWA, + G_UNICODE_SCRIPT_TAGBANWA, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, G_UNICODE_SCRIPT_MONGOLIAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, G_UNICODE_SCRIPT_LIMBU, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_TAI_LE, + G_UNICODE_SCRIPT_TAI_LE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_NEW_TAI_LUE, G_UNICODE_SCRIPT_NEW_TAI_LUE, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, + G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_KHMER, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BUGINESE, + G_UNICODE_SCRIPT_BUGINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, + G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_BALINESE, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, G_UNICODE_SCRIPT_SUNDANESE, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, G_UNICODE_SCRIPT_LEPCHA, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, G_UNICODE_SCRIPT_OL_CHIKI, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_GREEK, + G_UNICODE_SCRIPT_GREEK, G_UNICODE_SCRIPT_UNKNOWN, +}; + +static const struct { + gunichar start; + guint16 chars; + guint16 script; +} g_script_table[] = { + { 0x2000, 12, G_UNICODE_SCRIPT_COMMON }, + { 0x200c, 2, G_UNICODE_SCRIPT_INHERITED }, + { 0x200e, 87, G_UNICODE_SCRIPT_COMMON }, + { 0x206a, 7, G_UNICODE_SCRIPT_COMMON }, + { 0x2071, 1, G_UNICODE_SCRIPT_LATIN }, + { 0x2074, 11, G_UNICODE_SCRIPT_COMMON }, + { 0x207f, 1, G_UNICODE_SCRIPT_LATIN }, + { 0x2080, 15, G_UNICODE_SCRIPT_COMMON }, + { 0x2090, 5, G_UNICODE_SCRIPT_LATIN }, + { 0x20a0, 22, G_UNICODE_SCRIPT_COMMON }, + { 0x20d0, 33, G_UNICODE_SCRIPT_INHERITED }, + { 0x2100, 38, G_UNICODE_SCRIPT_COMMON }, + { 0x2126, 1, G_UNICODE_SCRIPT_GREEK }, + { 0x2127, 3, G_UNICODE_SCRIPT_COMMON }, + { 0x212a, 2, G_UNICODE_SCRIPT_LATIN }, + { 0x212c, 6, G_UNICODE_SCRIPT_COMMON }, + { 0x2132, 1, G_UNICODE_SCRIPT_LATIN }, + { 0x2133, 27, G_UNICODE_SCRIPT_COMMON }, + { 0x214e, 1, G_UNICODE_SCRIPT_LATIN }, + { 0x214f, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x2153, 13, G_UNICODE_SCRIPT_COMMON }, + { 0x2160, 41, G_UNICODE_SCRIPT_LATIN }, + { 0x2190, 600, G_UNICODE_SCRIPT_COMMON }, + { 0x2400, 39, G_UNICODE_SCRIPT_COMMON }, + { 0x2440, 11, G_UNICODE_SCRIPT_COMMON }, + { 0x2460, 574, G_UNICODE_SCRIPT_COMMON }, + { 0x26a0, 29, G_UNICODE_SCRIPT_COMMON }, + { 0x26c0, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x2701, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x2706, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x270c, 28, G_UNICODE_SCRIPT_COMMON }, + { 0x2729, 35, G_UNICODE_SCRIPT_COMMON }, + { 0x274d, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x274f, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x2756, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x2758, 7, G_UNICODE_SCRIPT_COMMON }, + { 0x2761, 52, G_UNICODE_SCRIPT_COMMON }, + { 0x2798, 24, G_UNICODE_SCRIPT_COMMON }, + { 0x27b1, 14, G_UNICODE_SCRIPT_COMMON }, + { 0x27c0, 11, G_UNICODE_SCRIPT_COMMON }, + { 0x27cc, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x27d0, 48, G_UNICODE_SCRIPT_COMMON }, + { 0x2800, 256, G_UNICODE_SCRIPT_BRAILLE }, + { 0x2900, 589, G_UNICODE_SCRIPT_COMMON }, + { 0x2b50, 5, G_UNICODE_SCRIPT_COMMON }, + { 0x2c00, 47, G_UNICODE_SCRIPT_GLAGOLITIC }, + { 0x2c30, 47, G_UNICODE_SCRIPT_GLAGOLITIC }, + { 0x2c60, 16, G_UNICODE_SCRIPT_LATIN }, + { 0x2c71, 13, G_UNICODE_SCRIPT_LATIN }, + { 0x2c80, 107, G_UNICODE_SCRIPT_COPTIC }, + { 0x2cf9, 7, G_UNICODE_SCRIPT_COPTIC }, + { 0x2d00, 38, G_UNICODE_SCRIPT_GEORGIAN }, + { 0x2d30, 54, G_UNICODE_SCRIPT_TIFINAGH }, + { 0x2d6f, 1, G_UNICODE_SCRIPT_TIFINAGH }, + { 0x2d80, 23, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2da0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2da8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2db0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2db8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2dc0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2dc8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2dd0, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2dd8, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0x2de0, 32, G_UNICODE_SCRIPT_CYRILLIC }, + { 0x2e00, 49, G_UNICODE_SCRIPT_COMMON }, + { 0x2e80, 26, G_UNICODE_SCRIPT_HAN }, + { 0x2e9b, 89, G_UNICODE_SCRIPT_HAN }, + { 0x2f00, 214, G_UNICODE_SCRIPT_HAN }, + { 0x2ff0, 12, G_UNICODE_SCRIPT_COMMON }, + { 0x3000, 5, G_UNICODE_SCRIPT_COMMON }, + { 0x3005, 1, G_UNICODE_SCRIPT_HAN }, + { 0x3006, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x3007, 1, G_UNICODE_SCRIPT_HAN }, + { 0x3008, 25, G_UNICODE_SCRIPT_COMMON }, + { 0x3021, 9, G_UNICODE_SCRIPT_HAN }, + { 0x302a, 6, G_UNICODE_SCRIPT_INHERITED }, + { 0x3030, 8, G_UNICODE_SCRIPT_COMMON }, + { 0x3038, 4, G_UNICODE_SCRIPT_HAN }, + { 0x303c, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x3041, 86, G_UNICODE_SCRIPT_HIRAGANA }, + { 0x3099, 2, G_UNICODE_SCRIPT_INHERITED }, + { 0x309b, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x309d, 3, G_UNICODE_SCRIPT_HIRAGANA }, + { 0x30a0, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x30a1, 90, G_UNICODE_SCRIPT_KATAKANA }, + { 0x30fb, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x30fd, 3, G_UNICODE_SCRIPT_KATAKANA }, + { 0x3105, 41, G_UNICODE_SCRIPT_BOPOMOFO }, + { 0x3131, 94, G_UNICODE_SCRIPT_HANGUL }, + { 0x3190, 16, G_UNICODE_SCRIPT_COMMON }, + { 0x31a0, 24, G_UNICODE_SCRIPT_BOPOMOFO }, + { 0x31c0, 36, G_UNICODE_SCRIPT_COMMON }, + { 0x31f0, 16, G_UNICODE_SCRIPT_KATAKANA }, + { 0x3200, 31, G_UNICODE_SCRIPT_HANGUL }, + { 0x3220, 36, G_UNICODE_SCRIPT_COMMON }, + { 0x3250, 16, G_UNICODE_SCRIPT_COMMON }, + { 0x3260, 31, G_UNICODE_SCRIPT_HANGUL }, + { 0x327f, 81, G_UNICODE_SCRIPT_COMMON }, + { 0x32d0, 47, G_UNICODE_SCRIPT_KATAKANA }, + { 0x3300, 88, G_UNICODE_SCRIPT_KATAKANA }, + { 0x3358, 168, G_UNICODE_SCRIPT_COMMON }, + { 0x3400, 6582, G_UNICODE_SCRIPT_HAN }, + { 0x4dc0, 64, G_UNICODE_SCRIPT_COMMON }, + { 0x4e00, 20932, G_UNICODE_SCRIPT_HAN }, + { 0xa000, 1165, G_UNICODE_SCRIPT_YI }, + { 0xa490, 55, G_UNICODE_SCRIPT_YI }, + { 0xa500, 300, G_UNICODE_SCRIPT_VAI }, + { 0xa640, 32, G_UNICODE_SCRIPT_CYRILLIC }, + { 0xa662, 18, G_UNICODE_SCRIPT_CYRILLIC }, + { 0xa67c, 28, G_UNICODE_SCRIPT_CYRILLIC }, + { 0xa700, 34, G_UNICODE_SCRIPT_COMMON }, + { 0xa722, 102, G_UNICODE_SCRIPT_LATIN }, + { 0xa788, 3, G_UNICODE_SCRIPT_COMMON }, + { 0xa78b, 2, G_UNICODE_SCRIPT_LATIN }, + { 0xa7fb, 5, G_UNICODE_SCRIPT_LATIN }, + { 0xa800, 44, G_UNICODE_SCRIPT_SYLOTI_NAGRI }, + { 0xa840, 56, G_UNICODE_SCRIPT_PHAGS_PA }, + { 0xa880, 69, G_UNICODE_SCRIPT_SAURASHTRA }, + { 0xa8ce, 12, G_UNICODE_SCRIPT_SAURASHTRA }, + { 0xa900, 48, G_UNICODE_SCRIPT_KAYAH_LI }, + { 0xa930, 36, G_UNICODE_SCRIPT_REJANG }, + { 0xa95f, 1, G_UNICODE_SCRIPT_REJANG }, + { 0xaa00, 55, G_UNICODE_SCRIPT_CHAM }, + { 0xaa40, 14, G_UNICODE_SCRIPT_CHAM }, + { 0xaa50, 10, G_UNICODE_SCRIPT_CHAM }, + { 0xaa5c, 4, G_UNICODE_SCRIPT_CHAM }, + { 0xac00, 11172, G_UNICODE_SCRIPT_HANGUL }, + { 0xf900, 302, G_UNICODE_SCRIPT_HAN }, + { 0xfa30, 59, G_UNICODE_SCRIPT_HAN }, + { 0xfa70, 106, G_UNICODE_SCRIPT_HAN }, + { 0xfb00, 7, G_UNICODE_SCRIPT_LATIN }, + { 0xfb13, 5, G_UNICODE_SCRIPT_ARMENIAN }, + { 0xfb1d, 26, G_UNICODE_SCRIPT_HEBREW }, + { 0xfb38, 5, G_UNICODE_SCRIPT_HEBREW }, + { 0xfb3e, 1, G_UNICODE_SCRIPT_HEBREW }, + { 0xfb40, 2, G_UNICODE_SCRIPT_HEBREW }, + { 0xfb43, 2, G_UNICODE_SCRIPT_HEBREW }, + { 0xfb46, 10, G_UNICODE_SCRIPT_HEBREW }, + { 0xfb50, 98, G_UNICODE_SCRIPT_ARABIC }, + { 0xfbd3, 363, G_UNICODE_SCRIPT_ARABIC }, + { 0xfd3e, 2, G_UNICODE_SCRIPT_COMMON }, + { 0xfd50, 64, G_UNICODE_SCRIPT_ARABIC }, + { 0xfd92, 54, G_UNICODE_SCRIPT_ARABIC }, + { 0xfdf0, 13, G_UNICODE_SCRIPT_ARABIC }, + { 0xfdfd, 1, G_UNICODE_SCRIPT_COMMON }, + { 0xfe00, 16, G_UNICODE_SCRIPT_INHERITED }, + { 0xfe10, 10, G_UNICODE_SCRIPT_COMMON }, + { 0xfe20, 7, G_UNICODE_SCRIPT_INHERITED }, + { 0xfe30, 35, G_UNICODE_SCRIPT_COMMON }, + { 0xfe54, 19, G_UNICODE_SCRIPT_COMMON }, + { 0xfe68, 4, G_UNICODE_SCRIPT_COMMON }, + { 0xfe70, 5, G_UNICODE_SCRIPT_ARABIC }, + { 0xfe76, 135, G_UNICODE_SCRIPT_ARABIC }, + { 0xfeff, 1, G_UNICODE_SCRIPT_COMMON }, + { 0xff01, 32, G_UNICODE_SCRIPT_COMMON }, + { 0xff21, 26, G_UNICODE_SCRIPT_LATIN }, + { 0xff3b, 6, G_UNICODE_SCRIPT_COMMON }, + { 0xff41, 26, G_UNICODE_SCRIPT_LATIN }, + { 0xff5b, 11, G_UNICODE_SCRIPT_COMMON }, + { 0xff66, 10, G_UNICODE_SCRIPT_KATAKANA }, + { 0xff70, 1, G_UNICODE_SCRIPT_COMMON }, + { 0xff71, 45, G_UNICODE_SCRIPT_KATAKANA }, + { 0xff9e, 2, G_UNICODE_SCRIPT_COMMON }, + { 0xffa0, 31, G_UNICODE_SCRIPT_HANGUL }, + { 0xffc2, 6, G_UNICODE_SCRIPT_HANGUL }, + { 0xffca, 6, G_UNICODE_SCRIPT_HANGUL }, + { 0xffd2, 6, G_UNICODE_SCRIPT_HANGUL }, + { 0xffda, 3, G_UNICODE_SCRIPT_HANGUL }, + { 0xffe0, 7, G_UNICODE_SCRIPT_COMMON }, + { 0xffe8, 7, G_UNICODE_SCRIPT_COMMON }, + { 0xfff9, 5, G_UNICODE_SCRIPT_COMMON }, + { 0x10000, 12, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x1000d, 26, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x10028, 19, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x1003c, 2, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x1003f, 15, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x10050, 14, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x10080, 123, G_UNICODE_SCRIPT_LINEAR_B }, + { 0x10100, 3, G_UNICODE_SCRIPT_COMMON }, + { 0x10107, 45, G_UNICODE_SCRIPT_COMMON }, + { 0x10137, 9, G_UNICODE_SCRIPT_COMMON }, + { 0x10140, 75, G_UNICODE_SCRIPT_GREEK }, + { 0x10190, 12, G_UNICODE_SCRIPT_COMMON }, + { 0x101d0, 45, G_UNICODE_SCRIPT_COMMON }, + { 0x101fd, 1, G_UNICODE_SCRIPT_INHERITED }, + { 0x10280, 29, G_UNICODE_SCRIPT_LYCIAN }, + { 0x102a0, 49, G_UNICODE_SCRIPT_CARIAN }, + { 0x10300, 31, G_UNICODE_SCRIPT_OLD_ITALIC }, + { 0x10320, 4, G_UNICODE_SCRIPT_OLD_ITALIC }, + { 0x10330, 27, G_UNICODE_SCRIPT_GOTHIC }, + { 0x10380, 30, G_UNICODE_SCRIPT_UGARITIC }, + { 0x1039f, 1, G_UNICODE_SCRIPT_UGARITIC }, + { 0x103a0, 36, G_UNICODE_SCRIPT_OLD_PERSIAN }, + { 0x103c8, 14, G_UNICODE_SCRIPT_OLD_PERSIAN }, + { 0x10400, 80, G_UNICODE_SCRIPT_DESERET }, + { 0x10450, 48, G_UNICODE_SCRIPT_SHAVIAN }, + { 0x10480, 30, G_UNICODE_SCRIPT_OSMANYA }, + { 0x104a0, 10, G_UNICODE_SCRIPT_OSMANYA }, + { 0x10800, 6, G_UNICODE_SCRIPT_CYPRIOT }, + { 0x10808, 1, G_UNICODE_SCRIPT_CYPRIOT }, + { 0x1080a, 44, G_UNICODE_SCRIPT_CYPRIOT }, + { 0x10837, 2, G_UNICODE_SCRIPT_CYPRIOT }, + { 0x1083c, 1, G_UNICODE_SCRIPT_CYPRIOT }, + { 0x1083f, 1, G_UNICODE_SCRIPT_CYPRIOT }, + { 0x10900, 26, G_UNICODE_SCRIPT_PHOENICIAN }, + { 0x1091f, 1, G_UNICODE_SCRIPT_PHOENICIAN }, + { 0x10920, 26, G_UNICODE_SCRIPT_LYDIAN }, + { 0x1093f, 1, G_UNICODE_SCRIPT_LYDIAN }, + { 0x10a00, 4, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a05, 2, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a0c, 8, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a15, 3, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a19, 27, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a38, 3, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a3f, 9, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x10a50, 9, G_UNICODE_SCRIPT_KHAROSHTHI }, + { 0x12000, 879, G_UNICODE_SCRIPT_CUNEIFORM }, + { 0x12400, 99, G_UNICODE_SCRIPT_CUNEIFORM }, + { 0x12470, 4, G_UNICODE_SCRIPT_CUNEIFORM }, + { 0x1d000, 246, G_UNICODE_SCRIPT_COMMON }, + { 0x1d100, 39, G_UNICODE_SCRIPT_COMMON }, + { 0x1d129, 62, G_UNICODE_SCRIPT_COMMON }, + { 0x1d167, 3, G_UNICODE_SCRIPT_INHERITED }, + { 0x1d16a, 17, G_UNICODE_SCRIPT_COMMON }, + { 0x1d17b, 8, G_UNICODE_SCRIPT_INHERITED }, + { 0x1d183, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x1d185, 7, G_UNICODE_SCRIPT_INHERITED }, + { 0x1d18c, 30, G_UNICODE_SCRIPT_COMMON }, + { 0x1d1aa, 4, G_UNICODE_SCRIPT_INHERITED }, + { 0x1d1ae, 48, G_UNICODE_SCRIPT_COMMON }, + { 0x1d200, 70, G_UNICODE_SCRIPT_GREEK }, + { 0x1d300, 87, G_UNICODE_SCRIPT_COMMON }, + { 0x1d360, 18, G_UNICODE_SCRIPT_COMMON }, + { 0x1d400, 85, G_UNICODE_SCRIPT_COMMON }, + { 0x1d456, 71, G_UNICODE_SCRIPT_COMMON }, + { 0x1d49e, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4a2, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4a5, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4a9, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4ae, 12, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4bb, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4bd, 7, G_UNICODE_SCRIPT_COMMON }, + { 0x1d4c5, 65, G_UNICODE_SCRIPT_COMMON }, + { 0x1d507, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x1d50d, 8, G_UNICODE_SCRIPT_COMMON }, + { 0x1d516, 7, G_UNICODE_SCRIPT_COMMON }, + { 0x1d51e, 28, G_UNICODE_SCRIPT_COMMON }, + { 0x1d53b, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x1d540, 5, G_UNICODE_SCRIPT_COMMON }, + { 0x1d546, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x1d54a, 7, G_UNICODE_SCRIPT_COMMON }, + { 0x1d552, 340, G_UNICODE_SCRIPT_COMMON }, + { 0x1d6a8, 292, G_UNICODE_SCRIPT_COMMON }, + { 0x1d7ce, 50, G_UNICODE_SCRIPT_COMMON }, + { 0x1f000, 44, G_UNICODE_SCRIPT_COMMON }, + { 0x1f030, 100, G_UNICODE_SCRIPT_COMMON }, + { 0x20000, 42711, G_UNICODE_SCRIPT_HAN }, + { 0x2f800, 542, G_UNICODE_SCRIPT_HAN }, + { 0xe0001, 1, G_UNICODE_SCRIPT_COMMON }, + { 0xe0020, 96, G_UNICODE_SCRIPT_COMMON }, + { 0xe0100, 240, G_UNICODE_SCRIPT_INHERITED }, +}; diff --git a/glib/gsequence.c b/glib/gsequence.c new file mode 100644 index 0000000..ee00708 --- /dev/null +++ b/glib/gsequence.c @@ -0,0 +1,1819 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 + * Soeren Sandmann (sandmann@daimi.au.dk) + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: sequence + * @title: Sequences + * @short_description: scalable lists + * + * The #GSequence data structure has the API of a list, but is + * implemented internally with a balanced binary tree. This means that + * it is possible to maintain a sorted list of n elements in time O(n + * log n). The data contained in each element can be either integer + * values, by using of the Type Conversion Macros, + * or simply pointers to any type of data. + * + * A #GSequence is accessed through iterators, + * represented by a #GSequenceIter. An iterator represents a position + * between two elements of the sequence. For example, the + * begin iterator represents the gap immediately + * before the first element of the sequence, and the + * end iterator represents the gap immediately + * after the last element. In an empty sequence, the begin and end + * iterators are the same. + * + * Some methods on #GSequence operate on ranges of items. For example + * g_sequence_foreach_range() will call a user-specified function on + * each element with the given range. The range is delimited by the + * gaps represented by the passed-in iterators, so if you pass in the + * begin and end iterators, the range in question is the entire + * sequence. + * + * The function g_sequence_get() is used with an iterator to access the + * element immediately following the gap that the iterator represents. + * The iterator is said to point to that element. + * + * Iterators are stable across most operations on a #GSequence. For + * example an iterator pointing to some element of a sequence will + * continue to point to that element even after the sequence is sorted. + * Even moving an element to another sequence using for example + * g_sequence_move_range() will not invalidate the iterators pointing + * to it. The only operation that will invalidate an iterator is when + * the element it points to is removed from any sequence. + **/ + +/** + * GSequenceIter: + * + * The #GSequenceIter struct is an opaque data type representing an + * iterator pointing into a #GSequence. + **/ + +/** + * GSequenceIterCompareFunc: + * @a: a #GSequenceIter + * @b: a #GSequenceIter + * @data: user data + * @Returns: zero if the iterators are equal, a negative value if @a + * comes before @b, and a positive value if @b comes before + * @a. + * + * A #GSequenceIterCompareFunc is a function used to compare iterators. + * It must return zero if the iterators compare equal, a negative value + * if @a comes before @b, and a positive value if @b comes before @a. + **/ + +typedef struct _GSequenceNode GSequenceNode; + +/** + * GSequence: + * + * The #GSequence struct is an opaque data type representing a + * Sequence data type. + **/ +struct _GSequence +{ + GSequenceNode * end_node; + GDestroyNotify data_destroy_notify; + gboolean access_prohibited; + + /* The 'real_sequence' is used when temporary sequences are created + * to hold nodes that are being rearranged. The 'real_sequence' of such + * a temporary sequence points to the sequence that is actually being + * manipulated. The only reason we need this is so that when the + * sort/sort_changed/search_iter() functions call out to the application + * g_sequence_iter_get_sequence() will return the correct sequence. + */ + GSequence * real_sequence; +}; + +struct _GSequenceNode +{ + gint n_nodes; + GSequenceNode * parent; + GSequenceNode * left; + GSequenceNode * right; + gpointer data; /* For the end node, this field points + * to the sequence + */ +}; + +/* + * Declaration of GSequenceNode methods + */ +static GSequenceNode *node_new (gpointer data); +static GSequenceNode *node_get_first (GSequenceNode *node); +static GSequenceNode *node_get_last (GSequenceNode *node); +static GSequenceNode *node_get_prev (GSequenceNode *node); +static GSequenceNode *node_get_next (GSequenceNode *node); +static gint node_get_pos (GSequenceNode *node); +static GSequenceNode *node_get_by_pos (GSequenceNode *node, + gint pos); +static GSequenceNode *node_find_closest (GSequenceNode *haystack, + GSequenceNode *needle, + GSequenceNode *end, + GSequenceIterCompareFunc cmp, + gpointer user_data); +static gint node_get_length (GSequenceNode *node); +static void node_free (GSequenceNode *node, + GSequence *seq); +static void node_cut (GSequenceNode *split); +static void node_insert_before (GSequenceNode *node, + GSequenceNode *new); +static void node_unlink (GSequenceNode *node); +static void node_join (GSequenceNode *left, + GSequenceNode *right); +static void node_insert_sorted (GSequenceNode *node, + GSequenceNode *new, + GSequenceNode *end, + GSequenceIterCompareFunc cmp_func, + gpointer cmp_data); + + +/* + * Various helper functions + */ +static void +check_seq_access (GSequence *seq) +{ + if (G_UNLIKELY (seq->access_prohibited)) + { + g_warning ("Accessing a sequence while it is " + "being sorted or searched is not allowed"); + } +} + +static GSequence * +get_sequence (GSequenceNode *node) +{ + return (GSequence *)node_get_last (node)->data; +} + +static void +check_iter_access (GSequenceIter *iter) +{ + check_seq_access (get_sequence (iter)); +} + +static gboolean +is_end (GSequenceIter *iter) +{ + GSequence *seq; + + if (iter->right) + return FALSE; + + if (!iter->parent) + return TRUE; + + if (iter->parent->right != iter) + return FALSE; + + seq = get_sequence (iter); + + return seq->end_node == iter; +} + +typedef struct +{ + GCompareDataFunc cmp_func; + gpointer cmp_data; + GSequenceNode *end_node; +} SortInfo; + +/* This function compares two iters using a normal compare + * function and user_data passed in in a SortInfo struct + */ +static gint +iter_compare (GSequenceIter *node1, + GSequenceIter *node2, + gpointer data) +{ + const SortInfo *info = data; + gint retval; + + if (node1 == info->end_node) + return 1; + + if (node2 == info->end_node) + return -1; + + retval = info->cmp_func (node1->data, node2->data, info->cmp_data); + + return retval; +} + +/* + * Public API + */ + +/** + * g_sequence_new: + * @data_destroy: a #GDestroyNotify function, or %NULL + * + * Creates a new GSequence. The @data_destroy function, if non-%NULL will + * be called on all items when the sequence is destroyed and on items that + * are removed from the sequence. + * + * Return value: a new #GSequence + * + * Since: 2.14 + **/ +GSequence * +g_sequence_new (GDestroyNotify data_destroy) +{ + GSequence *seq = g_new (GSequence, 1); + seq->data_destroy_notify = data_destroy; + + seq->end_node = node_new (seq); + + seq->access_prohibited = FALSE; + + seq->real_sequence = seq; + + return seq; +} + +/** + * g_sequence_free: + * @seq: a #GSequence + * + * Frees the memory allocated for @seq. If @seq has a data destroy + * function associated with it, that function is called on all items in + * @seq. + * + * Since: 2.14 + **/ +void +g_sequence_free (GSequence *seq) +{ + g_return_if_fail (seq != NULL); + + check_seq_access (seq); + + node_free (seq->end_node, seq); + + g_free (seq); +} + +/** + * g_sequence_foreach_range: + * @begin: a #GSequenceIter + * @end: a #GSequenceIter + * @func: a #GFunc + * @user_data: user data passed to @func + * + * Calls @func for each item in the range (@begin, @end) passing + * @user_data to the function. + * + * Since: 2.14 + **/ +void +g_sequence_foreach_range (GSequenceIter *begin, + GSequenceIter *end, + GFunc func, + gpointer user_data) +{ + GSequence *seq; + GSequenceIter *iter; + + g_return_if_fail (func != NULL); + g_return_if_fail (begin != NULL); + g_return_if_fail (end != NULL); + + seq = get_sequence (begin); + + seq->access_prohibited = TRUE; + + iter = begin; + while (iter != end) + { + GSequenceIter *next = node_get_next (iter); + + func (iter->data, user_data); + + iter = next; + } + + seq->access_prohibited = FALSE; +} + +/** + * g_sequence_foreach: + * @seq: a #GSequence + * @func: the function to call for each item in @seq + * @user_data: user data passed to @func + * + * Calls @func for each item in the sequence passing @user_data + * to the function. + * + * Since: 2.14 + **/ +void +g_sequence_foreach (GSequence *seq, + GFunc func, + gpointer user_data) +{ + GSequenceIter *begin, *end; + + check_seq_access (seq); + + begin = g_sequence_get_begin_iter (seq); + end = g_sequence_get_end_iter (seq); + + g_sequence_foreach_range (begin, end, func, user_data); +} + +/** + * g_sequence_range_get_midpoint: + * @begin: a #GSequenceIter + * @end: a #GSequenceIter + * + * Finds an iterator somewhere in the range (@begin, @end). This + * iterator will be close to the middle of the range, but is not + * guaranteed to be exactly in the middle. + * + * The @begin and @end iterators must both point to the same sequence and + * @begin must come before or be equal to @end in the sequence. + * + * Return value: A #GSequenceIter pointing somewhere in the + * (@begin, @end) range. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_range_get_midpoint (GSequenceIter *begin, + GSequenceIter *end) +{ + int begin_pos, end_pos, mid_pos; + + g_return_val_if_fail (begin != NULL, NULL); + g_return_val_if_fail (end != NULL, NULL); + g_return_val_if_fail (get_sequence (begin) == get_sequence (end), NULL); + + begin_pos = node_get_pos (begin); + end_pos = node_get_pos (end); + + g_return_val_if_fail (end_pos >= begin_pos, NULL); + + mid_pos = begin_pos + (end_pos - begin_pos) / 2; + + return node_get_by_pos (begin, mid_pos); +} + +/** + * g_sequence_iter_compare: + * @a: a #GSequenceIter + * @b: a #GSequenceIter + * + * Returns a negative number if @a comes before @b, 0 if they are equal, + * and a positive number if @a comes after @b. + * + * The @a and @b iterators must point into the same sequence. + * + * Return value: A negative number if @a comes before @b, 0 if they are + * equal, and a positive number if @a comes after @b. + * + * Since: 2.14 + **/ +gint +g_sequence_iter_compare (GSequenceIter *a, + GSequenceIter *b) +{ + gint a_pos, b_pos; + + g_return_val_if_fail (a != NULL, 0); + g_return_val_if_fail (b != NULL, 0); + g_return_val_if_fail (get_sequence (a) == get_sequence (b), 0); + + check_iter_access (a); + check_iter_access (b); + + a_pos = node_get_pos (a); + b_pos = node_get_pos (b); + + if (a_pos == b_pos) + return 0; + else if (a_pos > b_pos) + return 1; + else + return -1; +} + +/** + * g_sequence_append: + * @seq: a #GSequencePointer + * @data: the data for the new item + * + * Adds a new item to the end of @seq. + * + * Return value: an iterator pointing to the new item + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_append (GSequence *seq, + gpointer data) +{ + GSequenceNode *node; + + g_return_val_if_fail (seq != NULL, NULL); + + check_seq_access (seq); + + node = node_new (data); + node_insert_before (seq->end_node, node); + + return node; +} + +/** + * g_sequence_prepend: + * @seq: a #GSequence + * @data: the data for the new item + * + * Adds a new item to the front of @seq + * + * Return value: an iterator pointing to the new item + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_prepend (GSequence *seq, + gpointer data) +{ + GSequenceNode *node, *first; + + g_return_val_if_fail (seq != NULL, NULL); + + check_seq_access (seq); + + node = node_new (data); + first = node_get_first (seq->end_node); + + node_insert_before (first, node); + + return node; +} + +/** + * g_sequence_insert_before: + * @iter: a #GSequenceIter + * @data: the data for the new item + * + * Inserts a new item just before the item pointed to by @iter. + * + * Return value: an iterator pointing to the new item + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_insert_before (GSequenceIter *iter, + gpointer data) +{ + GSequenceNode *node; + + g_return_val_if_fail (iter != NULL, NULL); + + check_iter_access (iter); + + node = node_new (data); + + node_insert_before (iter, node); + + return node; +} + +/** + * g_sequence_remove: + * @iter: a #GSequenceIter + * + * Removes the item pointed to by @iter. It is an error to pass the + * end iterator to this function. + * + * If the sequnce has a data destroy function associated with it, this + * function is called on the data for the removed item. + * + * Since: 2.14 + **/ +void +g_sequence_remove (GSequenceIter *iter) +{ + GSequence *seq; + + g_return_if_fail (iter != NULL); + g_return_if_fail (!is_end (iter)); + + check_iter_access (iter); + + seq = get_sequence (iter); + + node_unlink (iter); + node_free (iter, seq); +} + +/** + * g_sequence_remove_range: + * @begin: a #GSequenceIter + * @end: a #GSequenceIter + * + * Removes all items in the (@begin, @end) range. + * + * If the sequence has a data destroy function associated with it, this + * function is called on the data for the removed items. + * + * Since: 2.14 + **/ +void +g_sequence_remove_range (GSequenceIter *begin, + GSequenceIter *end) +{ + g_return_if_fail (get_sequence (begin) == get_sequence (end)); + + check_iter_access (begin); + check_iter_access (end); + + g_sequence_move_range (NULL, begin, end); +} + +/** + * g_sequence_move_range: + * @dest: a #GSequenceIter + * @begin: a #GSequenceIter + * @end: a #GSequenceIter + * + * Inserts the (@begin, @end) range at the destination pointed to by ptr. + * The @begin and @end iters must point into the same sequence. It is + * allowed for @dest to point to a different sequence than the one pointed + * into by @begin and @end. + * + * If @dest is NULL, the range indicated by @begin and @end is + * removed from the sequence. If @dest iter points to a place within + * the (@begin, @end) range, the range does not move. + * + * Since: 2.14 + **/ +void +g_sequence_move_range (GSequenceIter *dest, + GSequenceIter *begin, + GSequenceIter *end) +{ + GSequence *src_seq; + GSequenceNode *first; + + g_return_if_fail (begin != NULL); + g_return_if_fail (end != NULL); + + check_iter_access (begin); + check_iter_access (end); + if (dest) + check_iter_access (dest); + + src_seq = get_sequence (begin); + + g_return_if_fail (src_seq == get_sequence (end)); + + /* Dest points to begin or end? */ + if (dest == begin || dest == end) + return; + + /* begin comes after end? */ + if (g_sequence_iter_compare (begin, end) >= 0) + return; + + /* dest points somewhere in the (begin, end) range? */ + if (dest && get_sequence (dest) == src_seq && + g_sequence_iter_compare (dest, begin) > 0 && + g_sequence_iter_compare (dest, end) < 0) + { + return; + } + + src_seq = get_sequence (begin); + + first = node_get_first (begin); + + node_cut (begin); + + node_cut (end); + + if (first != begin) + node_join (first, end); + + if (dest) + { + first = node_get_first (dest); + + node_cut (dest); + + node_join (begin, dest); + + if (dest != first) + node_join (first, begin); + } + else + { + node_free (begin, src_seq); + } +} + +/** + * g_sequence_sort: + * @seq: a #GSequence + * @cmp_func: the #GCompareDataFunc used to sort @seq. This function is + * passed two items of @seq and should return 0 if they are equal, + * a negative value if the first comes before the second, and a + * positive value if the second comes before the first. + * @cmp_data: user data passed to @cmp_func + * + * Sorts @seq using @cmp_func. + * + * Since: 2.14 + **/ +void +g_sequence_sort (GSequence *seq, + GCompareDataFunc cmp_func, + gpointer cmp_data) +{ + SortInfo info; + + info.cmp_func = cmp_func; + info.cmp_data = cmp_data; + info.end_node = seq->end_node; + + check_seq_access (seq); + + g_sequence_sort_iter (seq, iter_compare, &info); +} + +/** + * g_sequence_insert_sorted: + * @seq: a #GSequence + * @data: the data to insert + * @cmp_func: the #GCompareDataFunc used to compare items in the sequence. It + * is called with two items of the @seq and @user_data. It should + * return 0 if the items are equal, a negative value if the first + * item comes before the second, and a positive value if the second + * item comes before the first. + * @cmp_data: user data passed to @cmp_func. + * + * Inserts @data into @sequence using @func to determine the new position. + * The sequence must already be sorted according to @cmp_func; otherwise the + * new position of @data is undefined. + * + * Return value: a #GSequenceIter pointing to the new item. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_insert_sorted (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data) +{ + SortInfo info; + + g_return_val_if_fail (seq != NULL, NULL); + g_return_val_if_fail (cmp_func != NULL, NULL); + + info.cmp_func = cmp_func; + info.cmp_data = cmp_data; + info.end_node = seq->end_node; + check_seq_access (seq); + + return g_sequence_insert_sorted_iter (seq, data, iter_compare, &info); +} + +/** + * g_sequence_sort_changed: + * @iter: A #GSequenceIter + * @cmp_func: the #GCompareDataFunc used to compare items in the sequence. It + * is called with two items of the @seq and @user_data. It should + * return 0 if the items are equal, a negative value if the first + * item comes before the second, and a positive value if the second + * item comes before the first. + * @cmp_data: user data passed to @cmp_func. + * + * Moves the data pointed to a new position as indicated by @cmp_func. This + * function should be called for items in a sequence already sorted according + * to @cmp_func whenever some aspect of an item changes so that @cmp_func + * may return different values for that item. + * + * Since: 2.14 + **/ +void +g_sequence_sort_changed (GSequenceIter *iter, + GCompareDataFunc cmp_func, + gpointer cmp_data) +{ + SortInfo info; + + g_return_if_fail (!is_end (iter)); + + info.cmp_func = cmp_func; + info.cmp_data = cmp_data; + info.end_node = get_sequence (iter)->end_node; + check_iter_access (iter); + + g_sequence_sort_changed_iter (iter, iter_compare, &info); +} + +/** + * g_sequence_search: + * @seq: a #GSequence + * @data: data for the new item + * @cmp_func: the #GCompareDataFunc used to compare items in the sequence. It + * is called with two items of the @seq and @user_data. It should + * return 0 if the items are equal, a negative value if the first + * item comes before the second, and a positive value if the second + * item comes before the first. + * @cmp_data: user data passed to @cmp_func. + * + * Returns an iterator pointing to the position where @data would + * be inserted according to @cmp_func and @cmp_data. + * + * Return value: an #GSequenceIter pointing to the position where @data + * would have been inserted according to @cmp_func and @cmp_data. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_search (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data) +{ + SortInfo info; + + g_return_val_if_fail (seq != NULL, NULL); + + info.cmp_func = cmp_func; + info.cmp_data = cmp_data; + info.end_node = seq->end_node; + check_seq_access (seq); + + return g_sequence_search_iter (seq, data, iter_compare, &info); +} + +/** + * g_sequence_sort_iter: + * @seq: a #GSequence + * @cmp_func: the #GSequenceItercompare used to compare iterators in the + * sequence. It is called with two iterators pointing into @seq. It should + * return 0 if the iterators are equal, a negative value if the first + * iterator comes before the second, and a positive value if the second + * iterator comes before the first. + * @cmp_data: user data passed to @cmp_func + * + * Like g_sequence_sort(), but uses a #GSequenceIterCompareFunc instead + * of a GCompareDataFunc as the compare function + * + * Since: 2.14 + **/ +void +g_sequence_sort_iter (GSequence *seq, + GSequenceIterCompareFunc cmp_func, + gpointer cmp_data) +{ + GSequence *tmp; + GSequenceNode *begin, *end; + + g_return_if_fail (seq != NULL); + g_return_if_fail (cmp_func != NULL); + + check_seq_access (seq); + + begin = g_sequence_get_begin_iter (seq); + end = g_sequence_get_end_iter (seq); + + tmp = g_sequence_new (NULL); + tmp->real_sequence = seq; + + g_sequence_move_range (g_sequence_get_begin_iter (tmp), begin, end); + + seq->access_prohibited = TRUE; + tmp->access_prohibited = TRUE; + + while (g_sequence_get_length (tmp) > 0) + { + GSequenceNode *node = g_sequence_get_begin_iter (tmp); + + node_insert_sorted (seq->end_node, node, seq->end_node, + cmp_func, cmp_data); + } + + tmp->access_prohibited = FALSE; + seq->access_prohibited = FALSE; + + g_sequence_free (tmp); +} + +/** + * g_sequence_sort_changed_iter: + * @iter: a #GSequenceIter + * @iter_cmp: the #GSequenceItercompare used to compare iterators in the + * sequence. It is called with two iterators pointing into @seq. It should + * return 0 if the iterators are equal, a negative value if the first + * iterator comes before the second, and a positive value if the second + * iterator comes before the first. + * @cmp_data: user data passed to @cmp_func + * + * Like g_sequence_sort_changed(), but uses + * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as + * the compare function. + * + * Since: 2.14 + **/ +void +g_sequence_sort_changed_iter (GSequenceIter *iter, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data) +{ + GSequence *seq, *tmp_seq; + GSequenceIter *next, *prev; + + g_return_if_fail (iter != NULL); + g_return_if_fail (!is_end (iter)); + g_return_if_fail (iter_cmp != NULL); + check_iter_access (iter); + + /* If one of the neighbours is equal to iter, then + * don't move it. This ensures that sort_changed() is + * a stable operation. + */ + + next = node_get_next (iter); + prev = node_get_prev (iter); + + if (prev != iter && iter_cmp (prev, iter, cmp_data) == 0) + return; + + if (!is_end (next) && iter_cmp (next, iter, cmp_data) == 0) + return; + + seq = get_sequence (iter); + + seq->access_prohibited = TRUE; + + tmp_seq = g_sequence_new (NULL); + tmp_seq->real_sequence = seq; + + node_unlink (iter); + node_insert_before (tmp_seq->end_node, iter); + + node_insert_sorted (seq->end_node, iter, seq->end_node, + iter_cmp, cmp_data); + + g_sequence_free (tmp_seq); + + seq->access_prohibited = FALSE; +} + +/** + * g_sequence_insert_sorted_iter: + * @seq: a #GSequence + * @data: data for the new item + * @iter_cmp: the #GSequenceItercompare used to compare iterators in the + * sequence. It is called with two iterators pointing into @seq. It should + * return 0 if the iterators are equal, a negative value if the first + * iterator comes before the second, and a positive value if the second + * iterator comes before the first. + * @cmp_data: user data passed to @cmp_func + * + * Like g_sequence_insert_sorted(), but uses + * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as + * the compare function. + * + * Return value: a #GSequenceIter pointing to the new item + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_insert_sorted_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data) +{ + GSequenceNode *new_node; + GSequence *tmp_seq; + + g_return_val_if_fail (seq != NULL, NULL); + g_return_val_if_fail (iter_cmp != NULL, NULL); + + check_seq_access (seq); + + seq->access_prohibited = TRUE; + + /* Create a new temporary sequence and put the new node into + * that. The reason for this is that the user compare function + * will be called with the new node, and if it dereferences, + * "is_end" will be called on it. But that will crash if the + * node is not actually in a sequence. + * + * node_insert_sorted() makes sure the node is unlinked before + * it is inserted. + * + * The reason we need the "iter" versions at all is that that + * is the only kind of compare functions GtkTreeView can use. + */ + tmp_seq = g_sequence_new (NULL); + tmp_seq->real_sequence = seq; + + new_node = g_sequence_append (tmp_seq, data); + + node_insert_sorted (seq->end_node, new_node, + seq->end_node, iter_cmp, cmp_data); + + g_sequence_free (tmp_seq); + + seq->access_prohibited = FALSE; + + return new_node; +} + +/** + * g_sequence_search_iter: + * @seq: a #GSequence + * @data: data for the new item + * @iter_cmp: the #GSequenceIterCompare function used to compare iterators + * in the sequence. It is called with two iterators pointing into @seq. + * It should return 0 if the iterators are equal, a negative value if the + * first iterator comes before the second, and a positive value if the + * second iterator comes before the first. + * @cmp_data: user data passed to @iter_cmp + * + * Like g_sequence_search(), but uses + * a #GSequenceIterCompareFunc instead of a #GCompareDataFunc as + * the compare function. + * + * Return value: a #GSequenceIter pointing to the position in @seq + * where @data would have been inserted according to @iter_cmp and @cmp_data. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_search_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data) +{ + GSequenceNode *node; + GSequenceNode *dummy; + GSequence *tmp_seq; + + g_return_val_if_fail (seq != NULL, NULL); + + check_seq_access (seq); + + seq->access_prohibited = TRUE; + + tmp_seq = g_sequence_new (NULL); + tmp_seq->real_sequence = seq; + + dummy = g_sequence_append (tmp_seq, data); + + node = node_find_closest (seq->end_node, dummy, + seq->end_node, iter_cmp, cmp_data); + + g_sequence_free (tmp_seq); + + seq->access_prohibited = FALSE; + + return node; +} + +/** + * g_sequence_iter_get_sequence: + * @iter: a #GSequenceIter + * + * Returns the #GSequence that @iter points into. + * + * Return value: the #GSequence that @iter points into. + * + * Since: 2.14 + **/ +GSequence * +g_sequence_iter_get_sequence (GSequenceIter *iter) +{ + GSequence *seq; + + g_return_val_if_fail (iter != NULL, NULL); + + seq = get_sequence (iter); + + /* For temporary sequences, this points to the sequence that + * is actually being manipulated + */ + return seq->real_sequence; +} + +/** + * g_sequence_get: + * @iter: a #GSequenceIter + * + * Returns the data that @iter points to. + * + * Return value: the data that @iter points to + * + * Since: 2.14 + **/ +gpointer +g_sequence_get (GSequenceIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + g_return_val_if_fail (!is_end (iter), NULL); + + return iter->data; +} + +/** + * g_sequence_set: + * @iter: a #GSequenceIter + * @data: new data for the item + * + * Changes the data for the item pointed to by @iter to be @data. If + * the sequence has a data destroy function associated with it, that + * function is called on the existing data that @iter pointed to. + * + * Since: 2.14 + **/ +void +g_sequence_set (GSequenceIter *iter, + gpointer data) +{ + GSequence *seq; + + g_return_if_fail (iter != NULL); + g_return_if_fail (!is_end (iter)); + + seq = get_sequence (iter); + + /* If @data is identical to iter->data, it is destroyed + * here. This will work right in case of ref-counted objects. Also + * it is similar to what ghashtables do. + * + * For non-refcounted data it's a little less convenient, but + * code relying on self-setting not destroying would be + * pretty dubious anyway ... + */ + + if (seq->data_destroy_notify) + seq->data_destroy_notify (iter->data); + + iter->data = data; +} + +/** + * g_sequence_get_length: + * @seq: a #GSequence + * + * Returns the length of @seq + * + * Return value: the length of @seq + * + * Since: 2.14 + **/ +gint +g_sequence_get_length (GSequence *seq) +{ + return node_get_length (seq->end_node) - 1; +} + +/** + * g_sequence_get_end_iter: + * @seq: a #GSequence + * + * Returns the end iterator for @seg + * + * Return value: the end iterator for @seq + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_get_end_iter (GSequence *seq) +{ + g_return_val_if_fail (seq != NULL, NULL); + + return seq->end_node; +} + +/** + * g_sequence_get_begin_iter: + * @seq: a #GSequence + * + * Returns the begin iterator for @seq. + * + * Return value: the begin iterator for @seq. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_get_begin_iter (GSequence *seq) +{ + g_return_val_if_fail (seq != NULL, NULL); + + return node_get_first (seq->end_node); +} + +static int +clamp_position (GSequence *seq, + int pos) +{ + gint len = g_sequence_get_length (seq); + + if (pos > len || pos < 0) + pos = len; + + return pos; +} + +/* + * if pos > number of items or -1, will return end pointer + */ +/** + * g_sequence_get_iter_at_pos: + * @seq: a #GSequence + * @pos: a position in @seq, or -1 for the end. + * + * Returns the iterator at position @pos. If @pos is negative or larger + * than the number of items in @seq, the end iterator is returned. + * + * Return value: The #GSequenceIter at position @pos + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_get_iter_at_pos (GSequence *seq, + gint pos) +{ + g_return_val_if_fail (seq != NULL, NULL); + + pos = clamp_position (seq, pos); + + return node_get_by_pos (seq->end_node, pos); +} + +/** + * g_sequence_move: + * @src: a #GSequenceIter pointing to the item to move + * @dest: a #GSequenceIter pointing to the position to which + * the item is moved. + * + * Moves the item pointed to by @src to the position indicated by @dest. + * After calling this function @dest will point to the position immediately + * after @src. It is allowed for @src and @dest to point into different + * sequences. + * + * Since: 2.14 + **/ +void +g_sequence_move (GSequenceIter *src, + GSequenceIter *dest) +{ + g_return_if_fail (src != NULL); + g_return_if_fail (dest != NULL); + g_return_if_fail (!is_end (src)); + + if (src == dest) + return; + + node_unlink (src); + node_insert_before (dest, src); +} + +/* GSequenceIter */ + +/** + * g_sequence_iter_is_end: + * @iter: a #GSequenceIter + * + * Returns whether @iter is the end iterator + * + * Return value: Whether @iter is the end iterator. + * + * Since: 2.14 + **/ +gboolean +g_sequence_iter_is_end (GSequenceIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + return is_end (iter); +} + +/** + * g_sequence_iter_is_begin: + * @iter: a #GSequenceIter + * + * Returns whether @iter is the begin iterator + * + * Return value: whether @iter is the begin iterator + * + * Since: 2.14 + **/ +gboolean +g_sequence_iter_is_begin (GSequenceIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + return (node_get_prev (iter) == iter); +} + +/** + * g_sequence_iter_get_position: + * @iter: a #GSequenceIter + * + * Returns the position of @iter + * + * Return value: the position of @iter + * + * Since: 2.14 + **/ +gint +g_sequence_iter_get_position (GSequenceIter *iter) +{ + g_return_val_if_fail (iter != NULL, -1); + + return node_get_pos (iter); +} + +/** + * g_sequence_iter_next: + * @iter: a #GSequenceIter + * + * Returns an iterator pointing to the next position after @iter. If + * @iter is the end iterator, the end iterator is returned. + * + * Return value: a #GSequenceIter pointing to the next position after @iter. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_iter_next (GSequenceIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + return node_get_next (iter); +} + +/** + * g_sequence_iter_prev: + * @iter: a #GSequenceIter + * + * Returns an iterator pointing to the previous position before @iter. If + * @iter is the begin iterator, the begin iterator is returned. + * + * Return value: a #GSequenceIter pointing to the previous position before + * @iter. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_iter_prev (GSequenceIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + return node_get_prev (iter); +} + +/** + * g_sequence_iter_move: + * @iter: a #GSequenceIter + * @delta: A positive or negative number indicating how many positions away + * from @iter the returned #GSequenceIter will be. + * + * Returns the #GSequenceIter which is @delta positions away from @iter. + * If @iter is closer than -@delta positions to the beginning of the sequence, + * the begin iterator is returned. If @iter is closer than @delta positions + * to the end of the sequence, the end iterator is returned. + * + * Return value: a #GSequenceIter which is @delta positions away from @iter. + * + * Since: 2.14 + **/ +GSequenceIter * +g_sequence_iter_move (GSequenceIter *iter, + gint delta) +{ + gint new_pos; + + g_return_val_if_fail (iter != NULL, NULL); + + new_pos = node_get_pos (iter) + delta; + + new_pos = clamp_position (get_sequence (iter), new_pos); + + return node_get_by_pos (iter, new_pos); +} + +/** + * g_sequence_swap: + * @a: a #GSequenceIter + * @b: a #GSequenceIter + * + * Swaps the items pointed to by @a and @b. It is allowed for @a and @b + * to point into difference sequences. + * + * Since: 2.14 + **/ +void +g_sequence_swap (GSequenceIter *a, + GSequenceIter *b) +{ + GSequenceNode *leftmost, *rightmost, *rightmost_next; + int a_pos, b_pos; + + g_return_if_fail (!g_sequence_iter_is_end (a)); + g_return_if_fail (!g_sequence_iter_is_end (b)); + + if (a == b) + return; + + a_pos = g_sequence_iter_get_position (a); + b_pos = g_sequence_iter_get_position (b); + + if (a_pos > b_pos) + { + leftmost = b; + rightmost = a; + } + else + { + leftmost = a; + rightmost = b; + } + + rightmost_next = node_get_next (rightmost); + + /* The situation is now like this: + * + * ..., leftmost, ......., rightmost, rightmost_next, ... + * + */ + g_sequence_move (rightmost, leftmost); + g_sequence_move (leftmost, rightmost_next); +} + +/* + * Implementation of a treap + * + * + */ +static guint +get_priority (GSequenceNode *node) +{ + guint key = GPOINTER_TO_UINT (node); + + /* This hash function is based on one found on Thomas Wang's + * web page at + * + * http://www.concentric.net/~Ttwang/tech/inthash.htm + * + */ + key = (key << 15) - key - 1; + key = key ^ (key >> 12); + key = key + (key << 2); + key = key ^ (key >> 4); + key = key + (key << 3) + (key << 11); + key = key ^ (key >> 16); + + /* We rely on 0 being less than all other priorities */ + return key? key : 1; +} + +static GSequenceNode * +find_root (GSequenceNode *node) +{ + while (node->parent) + node = node->parent; + + return node; +} + +static GSequenceNode * +node_new (gpointer data) +{ + GSequenceNode *node = g_slice_new0 (GSequenceNode); + + node->n_nodes = 1; + node->data = data; + node->left = NULL; + node->right = NULL; + node->parent = NULL; + + return node; +} + +static GSequenceNode * +node_get_first (GSequenceNode *node) +{ + node = find_root (node); + + while (node->left) + node = node->left; + + return node; +} + +static GSequenceNode * +node_get_last (GSequenceNode *node) +{ + node = find_root (node); + + while (node->right) + node = node->right; + + return node; +} + +#define NODE_LEFT_CHILD(n) (((n)->parent) && ((n)->parent->left) == (n)) +#define NODE_RIGHT_CHILD(n) (((n)->parent) && ((n)->parent->right) == (n)) + +static GSequenceNode * +node_get_next (GSequenceNode *node) +{ + GSequenceNode *n = node; + + if (n->right) + { + n = n->right; + while (n->left) + n = n->left; + } + else + { + while (NODE_RIGHT_CHILD (n)) + n = n->parent; + + if (n->parent) + n = n->parent; + else + n = node; + } + + return n; +} + +static GSequenceNode * +node_get_prev (GSequenceNode *node) +{ + GSequenceNode *n = node; + + if (n->left) + { + n = n->left; + while (n->right) + n = n->right; + } + else + { + while (NODE_LEFT_CHILD (n)) + n = n->parent; + + if (n->parent) + n = n->parent; + else + n = node; + } + + return n; +} + +#define N_NODES(n) ((n)? (n)->n_nodes : 0) + +static gint +node_get_pos (GSequenceNode *node) +{ + int n_smaller = 0; + + if (node->left) + n_smaller = node->left->n_nodes; + + while (node) + { + if (NODE_RIGHT_CHILD (node)) + n_smaller += N_NODES (node->parent->left) + 1; + + node = node->parent; + } + + return n_smaller; +} + +static GSequenceNode * +node_get_by_pos (GSequenceNode *node, + gint pos) +{ + int i; + + node = find_root (node); + + while ((i = N_NODES (node->left)) != pos) + { + if (i < pos) + { + node = node->right; + pos -= (i + 1); + } + else + { + node = node->left; + } + } + + return node; +} + +static GSequenceNode * +node_find_closest (GSequenceNode *haystack, + GSequenceNode *needle, + GSequenceNode *end, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data) +{ + GSequenceNode *best; + gint c; + + haystack = find_root (haystack); + + do + { + best = haystack; + + /* iter_cmp can't be passed the end node, since the function may + * be user-supplied + */ + if (haystack == end) + c = 1; + else + c = iter_cmp (haystack, needle, cmp_data); + + /* In the following we don't break even if c == 0. Instaed we go on + * searching along the 'bigger' nodes, so that we find the last one + * that is equal to the needle. + */ + if (c > 0) + haystack = haystack->left; + else + haystack = haystack->right; + } + while (haystack != NULL); + + /* If the best node is smaller or equal to the data, then move one step + * to the right to make sure the best one is strictly bigger than the data + */ + if (best != end && c <= 0) + best = node_get_next (best); + + return best; +} + +static gint +node_get_length (GSequenceNode *node) +{ + node = find_root (node); + + return node->n_nodes; +} + +static void +real_node_free (GSequenceNode *node, + GSequence *seq) +{ + if (node) + { + real_node_free (node->left, seq); + real_node_free (node->right, seq); + + if (seq && seq->data_destroy_notify && node != seq->end_node) + seq->data_destroy_notify (node->data); + + g_slice_free (GSequenceNode, node); + } +} + +static void +node_free (GSequenceNode *node, + GSequence *seq) +{ + node = find_root (node); + + real_node_free (node, seq); +} + +static void +node_update_fields (GSequenceNode *node) +{ + int n_nodes = 1; + + n_nodes += N_NODES (node->left); + n_nodes += N_NODES (node->right); + + node->n_nodes = n_nodes; +} + +static void +node_rotate (GSequenceNode *node) +{ + GSequenceNode *tmp, *old; + + g_assert (node->parent); + g_assert (node->parent != node); + + if (NODE_LEFT_CHILD (node)) + { + /* rotate right */ + tmp = node->right; + + node->right = node->parent; + node->parent = node->parent->parent; + if (node->parent) + { + if (node->parent->left == node->right) + node->parent->left = node; + else + node->parent->right = node; + } + + g_assert (node->right); + + node->right->parent = node; + node->right->left = tmp; + + if (node->right->left) + node->right->left->parent = node->right; + + old = node->right; + } + else + { + /* rotate left */ + tmp = node->left; + + node->left = node->parent; + node->parent = node->parent->parent; + if (node->parent) + { + if (node->parent->right == node->left) + node->parent->right = node; + else + node->parent->left = node; + } + + g_assert (node->left); + + node->left->parent = node; + node->left->right = tmp; + + if (node->left->right) + node->left->right->parent = node->left; + + old = node->left; + } + + node_update_fields (old); + node_update_fields (node); +} + +static void +node_update_fields_deep (GSequenceNode *node) +{ + if (node) + { + node_update_fields (node); + + node_update_fields_deep (node->parent); + } +} + +static void +rotate_down (GSequenceNode *node, + guint priority) +{ + guint left, right; + + left = node->left ? get_priority (node->left) : 0; + right = node->right ? get_priority (node->right) : 0; + + while (priority < left || priority < right) + { + if (left > right) + node_rotate (node->left); + else + node_rotate (node->right); + + left = node->left ? get_priority (node->left) : 0; + right = node->right ? get_priority (node->right) : 0; + } +} + +static void +node_cut (GSequenceNode *node) +{ + while (node->parent) + node_rotate (node); + + if (node->left) + node->left->parent = NULL; + + node->left = NULL; + node_update_fields (node); + + rotate_down (node, get_priority (node)); +} + +static void +node_join (GSequenceNode *left, + GSequenceNode *right) +{ + GSequenceNode *fake = node_new (NULL); + + fake->left = find_root (left); + fake->right = find_root (right); + fake->left->parent = fake; + fake->right->parent = fake; + + node_update_fields (fake); + + node_unlink (fake); + + node_free (fake, NULL); +} + +static void +node_insert_before (GSequenceNode *node, + GSequenceNode *new) +{ + new->left = node->left; + if (new->left) + new->left->parent = new; + + new->parent = node; + node->left = new; + + node_update_fields_deep (new); + + while (new->parent && get_priority (new) > get_priority (new->parent)) + node_rotate (new); + + rotate_down (new, get_priority (new)); +} + +static void +node_unlink (GSequenceNode *node) +{ + rotate_down (node, 0); + + if (NODE_RIGHT_CHILD (node)) + node->parent->right = NULL; + else if (NODE_LEFT_CHILD (node)) + node->parent->left = NULL; + + if (node->parent) + node_update_fields_deep (node->parent); + + node->parent = NULL; +} + +static void +node_insert_sorted (GSequenceNode *node, + GSequenceNode *new, + GSequenceNode *end, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data) +{ + GSequenceNode *closest; + + closest = node_find_closest (node, new, end, iter_cmp, cmp_data); + + node_unlink (new); + + node_insert_before (closest, new); +} + + +#define __G_SEQUENCE_C__ +#include "galiasdef.c" diff --git a/glib/gsequence.h b/glib/gsequence.h new file mode 100644 index 0000000..fa79066 --- /dev/null +++ b/glib/gsequence.h @@ -0,0 +1,128 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 + * Soeren Sandmann (sandmann@daimi.au.dk) + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SEQUENCE_H__ +#define __G_SEQUENCE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GSequence GSequence; +typedef struct _GSequenceNode GSequenceIter; + +typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a, + GSequenceIter *b, + gpointer data); + + +/* GSequence */ +GSequence * g_sequence_new (GDestroyNotify data_destroy); +void g_sequence_free (GSequence *seq); +gint g_sequence_get_length (GSequence *seq); +void g_sequence_foreach (GSequence *seq, + GFunc func, + gpointer user_data); +void g_sequence_foreach_range (GSequenceIter *begin, + GSequenceIter *end, + GFunc func, + gpointer user_data); +void g_sequence_sort (GSequence *seq, + GCompareDataFunc cmp_func, + gpointer cmp_data); +void g_sequence_sort_iter (GSequence *seq, + GSequenceIterCompareFunc cmp_func, + gpointer cmp_data); + + +/* Getting iters */ +GSequenceIter *g_sequence_get_begin_iter (GSequence *seq); +GSequenceIter *g_sequence_get_end_iter (GSequence *seq); +GSequenceIter *g_sequence_get_iter_at_pos (GSequence *seq, + gint pos); +GSequenceIter *g_sequence_append (GSequence *seq, + gpointer data); +GSequenceIter *g_sequence_prepend (GSequence *seq, + gpointer data); +GSequenceIter *g_sequence_insert_before (GSequenceIter *iter, + gpointer data); +void g_sequence_move (GSequenceIter *src, + GSequenceIter *dest); +void g_sequence_swap (GSequenceIter *a, + GSequenceIter *b); +GSequenceIter *g_sequence_insert_sorted (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GSequenceIter *g_sequence_insert_sorted_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); +void g_sequence_sort_changed (GSequenceIter *iter, + GCompareDataFunc cmp_func, + gpointer cmp_data); +void g_sequence_sort_changed_iter (GSequenceIter *iter, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); +void g_sequence_remove (GSequenceIter *iter); +void g_sequence_remove_range (GSequenceIter *begin, + GSequenceIter *end); +void g_sequence_move_range (GSequenceIter *dest, + GSequenceIter *begin, + GSequenceIter *end); +GSequenceIter *g_sequence_search (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GSequenceIter *g_sequence_search_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); + + +/* Dereferencing */ +gpointer g_sequence_get (GSequenceIter *iter); +void g_sequence_set (GSequenceIter *iter, + gpointer data); + +/* Operations on GSequenceIter * */ +gboolean g_sequence_iter_is_begin (GSequenceIter *iter); +gboolean g_sequence_iter_is_end (GSequenceIter *iter); +GSequenceIter *g_sequence_iter_next (GSequenceIter *iter); +GSequenceIter *g_sequence_iter_prev (GSequenceIter *iter); +gint g_sequence_iter_get_position (GSequenceIter *iter); +GSequenceIter *g_sequence_iter_move (GSequenceIter *iter, + gint delta); +GSequence * g_sequence_iter_get_sequence (GSequenceIter *iter); + + +/* Search */ +gint g_sequence_iter_compare (GSequenceIter *a, + GSequenceIter *b); +GSequenceIter *g_sequence_range_get_midpoint (GSequenceIter *begin, + GSequenceIter *end); + +G_END_DECLS + +#endif /* __G_SEQUENCE_H__ */ diff --git a/glib/gshell.c b/glib/gshell.c new file mode 100644 index 0000000..d3b76f4 --- /dev/null +++ b/glib/gshell.c @@ -0,0 +1,695 @@ +/* gshell.c - Shell-related utilities + * + * Copyright 2000 Red Hat, Inc. + * g_execvpe implementation based on GNU libc execvp: + * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "glib.h" + +#ifdef _ +#warning "FIXME remove gettext hack" +#endif + +#include "glibintl.h" +#include "galias.h" + +/** + * SECTION: shell + * @title: Shell-related Utilities + * @short_description: shell-like commandline handling + **/ + +/** + * G_SHELL_ERROR: + * + * Error domain for shell functions. Errors in this domain will be from + * the #GShellError enumeration. See #GError for information on error + * domains. + **/ + +/** + * GShellError: + * @G_SHELL_ERROR_BAD_QUOTING: Mismatched or otherwise mangled quoting. + * @G_SHELL_ERROR_EMPTY_STRING: String to be parsed was empty. + * @G_SHELL_ERROR_FAILED: Some other error. + * + * Error codes returned by shell functions. + **/ +GQuark +g_shell_error_quark (void) +{ + return g_quark_from_static_string ("g-shell-error-quark"); +} + +/* Single quotes preserve the literal string exactly. escape + * sequences are not allowed; not even \' - if you want a ' + * in the quoted text, you have to do something like 'foo'\''bar' + * + * Double quotes allow $ ` " \ and newline to be escaped with backslash. + * Otherwise double quotes preserve things literally. + */ + +static gboolean +unquote_string_inplace (gchar* str, gchar** end, GError** err) +{ + gchar* dest; + gchar* s; + gchar quote_char; + + g_return_val_if_fail(end != NULL, FALSE); + g_return_val_if_fail(err == NULL || *err == NULL, FALSE); + g_return_val_if_fail(str != NULL, FALSE); + + dest = s = str; + + quote_char = *s; + + if (!(*s == '"' || *s == '\'')) + { + g_set_error_literal (err, + G_SHELL_ERROR, + G_SHELL_ERROR_BAD_QUOTING, + _("Quoted text doesn't begin with a quotation mark")); + *end = str; + return FALSE; + } + + /* Skip the initial quote mark */ + ++s; + + if (quote_char == '"') + { + while (*s) + { + g_assert(s > dest); /* loop invariant */ + + switch (*s) + { + case '"': + /* End of the string, return now */ + *dest = '\0'; + ++s; + *end = s; + return TRUE; + break; + + case '\\': + /* Possible escaped quote or \ */ + ++s; + switch (*s) + { + case '"': + case '\\': + case '`': + case '$': + case '\n': + *dest = *s; + ++s; + ++dest; + break; + + default: + /* not an escaped char */ + *dest = '\\'; + ++dest; + /* ++s already done. */ + break; + } + break; + + default: + *dest = *s; + ++dest; + ++s; + break; + } + + g_assert(s > dest); /* loop invariant */ + } + } + else + { + while (*s) + { + g_assert(s > dest); /* loop invariant */ + + if (*s == '\'') + { + /* End of the string, return now */ + *dest = '\0'; + ++s; + *end = s; + return TRUE; + } + else + { + *dest = *s; + ++dest; + ++s; + } + + g_assert(s > dest); /* loop invariant */ + } + } + + /* If we reach here this means the close quote was never encountered */ + + *dest = '\0'; + + g_set_error_literal (err, + G_SHELL_ERROR, + G_SHELL_ERROR_BAD_QUOTING, + _("Unmatched quotation mark in command line or other shell-quoted text")); + *end = s; + return FALSE; +} + +/** + * g_shell_quote: + * @unquoted_string: a literal string + * + * Quotes a string so that the shell (/bin/sh) will interpret the + * quoted string to mean @unquoted_string. If you pass a filename to + * the shell, for example, you should first quote it with this + * function. The return value must be freed with g_free(). The + * quoting style used is undefined (single or double quotes may be + * used). + * + * Return value: quoted string + **/ +gchar* +g_shell_quote (const gchar *unquoted_string) +{ + /* We always use single quotes, because the algorithm is cheesier. + * We could use double if we felt like it, that might be more + * human-readable. + */ + + const gchar *p; + GString *dest; + + g_return_val_if_fail (unquoted_string != NULL, NULL); + + dest = g_string_new ("'"); + + p = unquoted_string; + + /* could speed this up a lot by appending chunks of text at a + * time. + */ + while (*p) + { + /* Replace literal ' with a close ', a \', and a open ' */ + if (*p == '\'') + g_string_append (dest, "'\\''"); + else + g_string_append_c (dest, *p); + + ++p; + } + + /* close the quote */ + g_string_append_c (dest, '\''); + + return g_string_free (dest, FALSE); +} + +/** + * g_shell_unquote: + * @quoted_string: shell-quoted string + * @error: error return location or NULL + * + * Unquotes a string as the shell (/bin/sh) would. Only handles + * quotes; if a string contains file globs, arithmetic operators, + * variables, backticks, redirections, or other special-to-the-shell + * features, the result will be different from the result a real shell + * would produce (the variables, backticks, etc. will be passed + * through literally instead of being expanded). This function is + * guaranteed to succeed if applied to the result of + * g_shell_quote(). If it fails, it returns %NULL and sets the + * error. The @quoted_string need not actually contain quoted or + * escaped text; g_shell_unquote() simply goes through the string and + * unquotes/unescapes anything that the shell would. Both single and + * double quotes are handled, as are escapes including escaped + * newlines. The return value must be freed with g_free(). Possible + * errors are in the #G_SHELL_ERROR domain. + * + * Shell quoting rules are a bit strange. Single quotes preserve the + * literal string exactly. escape sequences are not allowed; not even + * \' - if you want a ' in the quoted text, you have to do something + * like 'foo'\''bar'. Double quotes allow $, `, ", \, and newline to + * be escaped with backslash. Otherwise double quotes preserve things + * literally. + * + * Return value: an unquoted string + **/ +gchar* +g_shell_unquote (const gchar *quoted_string, + GError **error) +{ + gchar *unquoted; + gchar *end; + gchar *start; + GString *retval; + + g_return_val_if_fail (quoted_string != NULL, NULL); + + unquoted = g_strdup (quoted_string); + + start = unquoted; + end = unquoted; + retval = g_string_new (NULL); + + /* The loop allows cases such as + * "foo"blah blah'bar'woo foo"baz"la la la\'\''foo' + */ + while (*start) + { + /* Append all non-quoted chars, honoring backslash escape + */ + + while (*start && !(*start == '"' || *start == '\'')) + { + if (*start == '\\') + { + /* all characters can get escaped by backslash, + * except newline, which is removed if it follows + * a backslash outside of quotes + */ + + ++start; + if (*start) + { + if (*start != '\n') + g_string_append_c (retval, *start); + ++start; + } + } + else + { + g_string_append_c (retval, *start); + ++start; + } + } + + if (*start) + { + if (!unquote_string_inplace (start, &end, error)) + { + goto error; + } + else + { + g_string_append (retval, start); + start = end; + } + } + } + + g_free (unquoted); + return g_string_free (retval, FALSE); + + error: + g_assert (error == NULL || *error != NULL); + + g_free (unquoted); + g_string_free (retval, TRUE); + return NULL; +} + +/* g_parse_argv() does a semi-arbitrary weird subset of the way + * the shell parses a command line. We don't do variable expansion, + * don't understand that operators are tokens, don't do tilde expansion, + * don't do command substitution, no arithmetic expansion, IFS gets ignored, + * don't do filename globs, don't remove redirection stuff, etc. + * + * READ THE UNIX98 SPEC on "Shell Command Language" before changing + * the behavior of this code. + * + * Steps to parsing the argv string: + * + * - tokenize the string (but since we ignore operators, + * our tokenization may diverge from what the shell would do) + * note that tokenization ignores the internals of a quoted + * word and it always splits on spaces, not on IFS even + * if we used IFS. We also ignore "end of input indicator" + * (I guess this is control-D?) + * + * Tokenization steps, from UNIX98 with operator stuff removed, + * are: + * + * 1) "If the current character is backslash, single-quote or + * double-quote (\, ' or ") and it is not quoted, it will affect + * quoting for subsequent characters up to the end of the quoted + * text. The rules for quoting are as described in Quoting + * . During token recognition no substitutions will be actually + * performed, and the result token will contain exactly the + * characters that appear in the input (except for newline + * character joining), unmodified, including any embedded or + * enclosing quotes or substitution operators, between the quote + * mark and the end of the quoted text. The token will not be + * delimited by the end of the quoted field." + * + * 2) "If the current character is an unquoted newline character, + * the current token will be delimited." + * + * 3) "If the current character is an unquoted blank character, any + * token containing the previous character is delimited and the + * current character will be discarded." + * + * 4) "If the previous character was part of a word, the current + * character will be appended to that word." + * + * 5) "If the current character is a "#", it and all subsequent + * characters up to, but excluding, the next newline character + * will be discarded as a comment. The newline character that + * ends the line is not considered part of the comment. The + * "#" starts a comment only when it is at the beginning of a + * token. Since the search for the end-of-comment does not + * consider an escaped newline character specially, a comment + * cannot be continued to the next line." + * + * 6) "The current character will be used as the start of a new word." + * + * + * - for each token (word), perform portions of word expansion, namely + * field splitting (using default whitespace IFS) and quote + * removal. Field splitting may increase the number of words. + * Quote removal does not increase the number of words. + * + * "If the complete expansion appropriate for a word results in an + * empty field, that empty field will be deleted from the list of + * fields that form the completely expanded command, unless the + * original word contained single-quote or double-quote characters." + * - UNIX98 spec + * + * + */ + +static inline void +ensure_token (GString **token) +{ + if (*token == NULL) + *token = g_string_new (NULL); +} + +static void +delimit_token (GString **token, + GSList **retval) +{ + if (*token == NULL) + return; + + *retval = g_slist_prepend (*retval, g_string_free (*token, FALSE)); + + *token = NULL; +} + +static GSList* +tokenize_command_line (const gchar *command_line, + GError **error) +{ + gchar current_quote; + const gchar *p; + GString *current_token = NULL; + GSList *retval = NULL; + gboolean quoted;; + + current_quote = '\0'; + quoted = FALSE; + p = command_line; + + while (*p) + { + if (current_quote == '\\') + { + if (*p == '\n') + { + /* we append nothing; backslash-newline become nothing */ + } + else + { + /* we append the backslash and the current char, + * to be interpreted later after tokenization + */ + ensure_token (¤t_token); + g_string_append_c (current_token, '\\'); + g_string_append_c (current_token, *p); + } + + current_quote = '\0'; + } + else if (current_quote == '#') + { + /* Discard up to and including next newline */ + while (*p && *p != '\n') + ++p; + + current_quote = '\0'; + + if (*p == '\0') + break; + } + else if (current_quote) + { + if (*p == current_quote && + /* check that it isn't an escaped double quote */ + !(current_quote == '"' && quoted)) + { + /* close the quote */ + current_quote = '\0'; + } + + /* Everything inside quotes, and the close quote, + * gets appended literally. + */ + + ensure_token (¤t_token); + g_string_append_c (current_token, *p); + } + else + { + switch (*p) + { + case '\n': + delimit_token (¤t_token, &retval); + break; + + case ' ': + case '\t': + /* If the current token contains the previous char, delimit + * the current token. A nonzero length + * token should always contain the previous char. + */ + if (current_token && + current_token->len > 0) + { + delimit_token (¤t_token, &retval); + } + + /* discard all unquoted blanks (don't add them to a token) */ + break; + + + /* single/double quotes are appended to the token, + * escapes are maybe appended next time through the loop, + * comment chars are never appended. + */ + + case '\'': + case '"': + ensure_token (¤t_token); + g_string_append_c (current_token, *p); + + /* FALL THRU */ + + case '#': + case '\\': + current_quote = *p; + break; + + default: + /* Combines rules 4) and 6) - if we have a token, append to it, + * otherwise create a new token. + */ + ensure_token (¤t_token); + g_string_append_c (current_token, *p); + break; + } + } + + /* We need to count consecutive backslashes mod 2, + * to detect escaped doublequotes. + */ + if (*p != '\\') + quoted = FALSE; + else + quoted = !quoted; + + ++p; + } + + delimit_token (¤t_token, &retval); + + if (current_quote) + { + if (current_quote == '\\') + g_set_error (error, + G_SHELL_ERROR, + G_SHELL_ERROR_BAD_QUOTING, + _("Text ended just after a '\\' character." + " (The text was '%s')"), + command_line); + else + g_set_error (error, + G_SHELL_ERROR, + G_SHELL_ERROR_BAD_QUOTING, + _("Text ended before matching quote was found for %c." + " (The text was '%s')"), + current_quote, command_line); + + goto error; + } + + if (retval == NULL) + { + g_set_error_literal (error, + G_SHELL_ERROR, + G_SHELL_ERROR_EMPTY_STRING, + _("Text was empty (or contained only whitespace)")); + + goto error; + } + + /* we appended backward */ + retval = g_slist_reverse (retval); + + return retval; + + error: + g_assert (error == NULL || *error != NULL); + + if (retval) + { + g_slist_foreach (retval, (GFunc)g_free, NULL); + g_slist_free (retval); + } + + return NULL; +} + +/** + * g_shell_parse_argv: + * @command_line: command line to parse + * @argcp: return location for number of args + * @argvp: return location for array of args + * @error: return location for error + * + * Parses a command line into an argument vector, in much the same way + * the shell would, but without many of the expansions the shell would + * perform (variable expansion, globs, operators, filename expansion, + * etc. are not supported). The results are defined to be the same as + * those you would get from a UNIX98 /bin/sh, as long as the input + * contains none of the unsupported shell expansions. If the input + * does contain such expansions, they are passed through + * literally. Possible errors are those from the #G_SHELL_ERROR + * domain. Free the returned vector with g_strfreev(). + * + * Return value: %TRUE on success, %FALSE if error set + **/ +gboolean +g_shell_parse_argv (const gchar *command_line, + gint *argcp, + gchar ***argvp, + GError **error) +{ + /* Code based on poptParseArgvString() from libpopt */ + gint argc = 0; + gchar **argv = NULL; + GSList *tokens = NULL; + gint i; + GSList *tmp_list; + + g_return_val_if_fail (command_line != NULL, FALSE); + + tokens = tokenize_command_line (command_line, error); + if (tokens == NULL) + return FALSE; + + /* Because we can't have introduced any new blank space into the + * tokens (we didn't do any new expansions), we don't need to + * perform field splitting. If we were going to honor IFS or do any + * expansions, we would have to do field splitting on each word + * here. Also, if we were going to do any expansion we would need to + * remove any zero-length words that didn't contain quotes + * originally; but since there's no expansion we know all words have + * nonzero length, unless they contain quotes. + * + * So, we simply remove quotes, and don't do any field splitting or + * empty word removal, since we know there was no way to introduce + * such things. + */ + + argc = g_slist_length (tokens); + argv = g_new0 (gchar*, argc + 1); + i = 0; + tmp_list = tokens; + while (tmp_list) + { + argv[i] = g_shell_unquote (tmp_list->data, error); + + /* Since we already checked that quotes matched up in the + * tokenizer, this shouldn't be possible to reach I guess. + */ + if (argv[i] == NULL) + goto failed; + + tmp_list = g_slist_next (tmp_list); + ++i; + } + + g_slist_foreach (tokens, (GFunc)g_free, NULL); + g_slist_free (tokens); + + if (argcp) + *argcp = argc; + + if (argvp) + *argvp = argv; + else + g_strfreev (argv); + + return TRUE; + + failed: + + g_assert (error == NULL || *error != NULL); + g_strfreev (argv); + g_slist_foreach (tokens, (GFunc) g_free, NULL); + g_slist_free (tokens); + + return FALSE; +} + +#define __G_SHELL_C__ +#include "galiasdef.c" diff --git a/glib/gshell.h b/glib/gshell.h new file mode 100644 index 0000000..130f100 --- /dev/null +++ b/glib/gshell.h @@ -0,0 +1,55 @@ +/* gshell.h - Shell-related utilities + * + * Copyright 2000 Red Hat, Inc. + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SHELL_H__ +#define __G_SHELL_H__ + +#include + +G_BEGIN_DECLS + +#define G_SHELL_ERROR g_shell_error_quark () + +typedef enum +{ + /* mismatched or otherwise mangled quoting */ + G_SHELL_ERROR_BAD_QUOTING, + /* string to be parsed was empty */ + G_SHELL_ERROR_EMPTY_STRING, + G_SHELL_ERROR_FAILED +} GShellError; + +GQuark g_shell_error_quark (void); + +gchar* g_shell_quote (const gchar *unquoted_string); +gchar* g_shell_unquote (const gchar *quoted_string, + GError **error); +gboolean g_shell_parse_argv (const gchar *command_line, + gint *argcp, + gchar ***argvp, + GError **error); + +G_END_DECLS + +#endif /* __G_SHELL_H__ */ diff --git a/glib/gslice.c b/glib/gslice.c new file mode 100644 index 0000000..66fd9e5 --- /dev/null +++ b/glib/gslice.c @@ -0,0 +1,1488 @@ +/* GLIB sliced memory - fast concurrent memory chunk allocator + * Copyright (C) 2005 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +/* MT safe */ + +#include "config.h" + +#include "gslice.h" + +#if defined HAVE_POSIX_MEMALIGN && defined POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS +# define HAVE_COMPLIANT_POSIX_MEMALIGN 1 +#endif + +#ifdef HAVE_COMPLIANT_POSIX_MEMALIGN +#define _XOPEN_SOURCE 600 /* posix_memalign() */ +#endif +#include /* posix_memalign() */ +#include +#include +#include "gmem.h" /* gslice.h */ +#include "gthreadprivate.h" +#include "glib.h" +#include "galias.h" +#ifdef HAVE_UNISTD_H +#include /* sysconf() */ +#endif +#ifdef G_OS_WIN32 +#include +#include +#endif + +#include /* fputs/fprintf */ + + +/* the GSlice allocator is split up into 4 layers, roughly modelled after the slab + * allocator and magazine extensions as outlined in: + * + [Bonwick94] Jeff Bonwick, The slab allocator: An object-caching kernel + * memory allocator. USENIX 1994, http://citeseer.ist.psu.edu/bonwick94slab.html + * + [Bonwick01] Bonwick and Jonathan Adams, Magazines and vmem: Extending the + * slab allocator to many cpu's and arbitrary resources. + * USENIX 2001, http://citeseer.ist.psu.edu/bonwick01magazines.html + * the layers are: + * - the thread magazines. for each (aligned) chunk size, a magazine (a list) + * of recently freed and soon to be allocated chunks is maintained per thread. + * this way, most alloc/free requests can be quickly satisfied from per-thread + * free lists which only require one g_private_get() call to retrive the + * thread handle. + * - the magazine cache. allocating and freeing chunks to/from threads only + * occours at magazine sizes from a global depot of magazines. the depot + * maintaines a 15 second working set of allocated magazines, so full + * magazines are not allocated and released too often. + * the chunk size dependent magazine sizes automatically adapt (within limits, + * see [3]) to lock contention to properly scale performance across a variety + * of SMP systems. + * - the slab allocator. this allocator allocates slabs (blocks of memory) close + * to the system page size or multiples thereof which have to be page aligned. + * the blocks are divided into smaller chunks which are used to satisfy + * allocations from the upper layers. the space provided by the reminder of + * the chunk size division is used for cache colorization (random distribution + * of chunk addresses) to improve processor cache utilization. multiple slabs + * with the same chunk size are kept in a partially sorted ring to allow O(1) + * freeing and allocation of chunks (as long as the allocation of an entirely + * new slab can be avoided). + * - the page allocator. on most modern systems, posix_memalign(3) or + * memalign(3) should be available, so this is used to allocate blocks with + * system page size based alignments and sizes or multiples thereof. + * if no memalign variant is provided, valloc() is used instead and + * block sizes are limited to the system page size (no multiples thereof). + * as a fallback, on system without even valloc(), a malloc(3)-based page + * allocator with alloc-only behaviour is used. + * + * NOTES: + * [1] some systems memalign(3) implementations may rely on boundary tagging for + * the handed out memory chunks. to avoid excessive page-wise fragmentation, + * we reserve 2 * sizeof (void*) per block size for the systems memalign(3), + * specified in NATIVE_MALLOC_PADDING. + * [2] using the slab allocator alone already provides for a fast and efficient + * allocator, it doesn't properly scale beyond single-threaded uses though. + * also, the slab allocator implements eager free(3)-ing, i.e. does not + * provide any form of caching or working set maintenance. so if used alone, + * it's vulnerable to trashing for sequences of balanced (alloc, free) pairs + * at certain thresholds. + * [3] magazine sizes are bound by an implementation specific minimum size and + * a chunk size specific maximum to limit magazine storage sizes to roughly + * 16KB. + * [4] allocating ca. 8 chunks per block/page keeps a good balance between + * external and internal fragmentation (<= 12.5%). [Bonwick94] + */ + +/* --- macros and constants --- */ +#define LARGEALIGNMENT (256) +#define P2ALIGNMENT (2 * sizeof (gsize)) /* fits 2 pointers (assumed to be 2 * GLIB_SIZEOF_SIZE_T below) */ +#define ALIGN(size, base) ((base) * (gsize) (((size) + (base) - 1) / (base))) +#define NATIVE_MALLOC_PADDING P2ALIGNMENT /* per-page padding left for native malloc(3) see [1] */ +#define SLAB_INFO_SIZE P2ALIGN (sizeof (SlabInfo) + NATIVE_MALLOC_PADDING) +#define MAX_MAGAZINE_SIZE (256) /* see [3] and allocator_get_magazine_threshold() for this */ +#define MIN_MAGAZINE_SIZE (4) +#define MAX_STAMP_COUNTER (7) /* distributes the load of gettimeofday() */ +#define MAX_SLAB_CHUNK_SIZE(al) (((al)->max_page_size - SLAB_INFO_SIZE) / 8) /* we want at last 8 chunks per page, see [4] */ +#define MAX_SLAB_INDEX(al) (SLAB_INDEX (al, MAX_SLAB_CHUNK_SIZE (al)) + 1) +#define SLAB_INDEX(al, asize) ((asize) / P2ALIGNMENT - 1) /* asize must be P2ALIGNMENT aligned */ +#define SLAB_CHUNK_SIZE(al, ix) (((ix) + 1) * P2ALIGNMENT) +#define SLAB_BPAGE_SIZE(al,csz) (8 * (csz) + SLAB_INFO_SIZE) + +/* optimized version of ALIGN (size, P2ALIGNMENT) */ +#if GLIB_SIZEOF_SIZE_T * 2 == 8 /* P2ALIGNMENT */ +#define P2ALIGN(size) (((size) + 0x7) & ~(gsize) 0x7) +#elif GLIB_SIZEOF_SIZE_T * 2 == 16 /* P2ALIGNMENT */ +#define P2ALIGN(size) (((size) + 0xf) & ~(gsize) 0xf) +#else +#define P2ALIGN(size) ALIGN (size, P2ALIGNMENT) +#endif + +/* special helpers to avoid gmessage.c dependency */ +static void mem_error (const char *format, ...) G_GNUC_PRINTF (1,2); +#define mem_assert(cond) do { if (G_LIKELY (cond)) ; else mem_error ("assertion failed: %s", #cond); } while (0) + +/* --- structures --- */ +typedef struct _ChunkLink ChunkLink; +typedef struct _SlabInfo SlabInfo; +typedef struct _CachedMagazine CachedMagazine; +struct _ChunkLink { + ChunkLink *next; + ChunkLink *data; +}; +struct _SlabInfo { + ChunkLink *chunks; + guint n_allocated; + SlabInfo *next, *prev; +}; +typedef struct { + ChunkLink *chunks; + gsize count; /* approximative chunks list length */ +} Magazine; +typedef struct { + Magazine *magazine1; /* array of MAX_SLAB_INDEX (allocator) */ + Magazine *magazine2; /* array of MAX_SLAB_INDEX (allocator) */ +} ThreadMemory; +typedef struct { + gboolean always_malloc; + gboolean bypass_magazines; + gboolean debug_blocks; + gsize working_set_msecs; + guint color_increment; +} SliceConfig; +typedef struct { + /* const after initialization */ + gsize min_page_size, max_page_size; + SliceConfig config; + gsize max_slab_chunk_size_for_magazine_cache; + /* magazine cache */ + GMutex *magazine_mutex; + ChunkLink **magazines; /* array of MAX_SLAB_INDEX (allocator) */ + guint *contention_counters; /* array of MAX_SLAB_INDEX (allocator) */ + gint mutex_counter; + guint stamp_counter; + guint last_stamp; + /* slab allocator */ + GMutex *slab_mutex; + SlabInfo **slab_stack; /* array of MAX_SLAB_INDEX (allocator) */ + guint color_accu; +} Allocator; + +/* --- g-slice prototypes --- */ +static gpointer slab_allocator_alloc_chunk (gsize chunk_size); +static void slab_allocator_free_chunk (gsize chunk_size, + gpointer mem); +static void private_thread_memory_cleanup (gpointer data); +static gpointer allocator_memalign (gsize alignment, + gsize memsize); +static void allocator_memfree (gsize memsize, + gpointer mem); +static inline void magazine_cache_update_stamp (void); +static inline gsize allocator_get_magazine_threshold (Allocator *allocator, + guint ix); + +/* --- g-slice memory checker --- */ +static void smc_notify_alloc (void *pointer, + size_t size); +static int smc_notify_free (void *pointer, + size_t size); + +/* --- variables --- */ +static GPrivate *private_thread_memory = NULL; +static gsize sys_page_size = 0; +static Allocator allocator[1] = { { 0, }, }; +static SliceConfig slice_config = { + FALSE, /* always_malloc */ + FALSE, /* bypass_magazines */ + FALSE, /* debug_blocks */ + 15 * 1000, /* working_set_msecs */ + 1, /* color increment, alt: 0x7fffffff */ +}; +static GMutex *smc_tree_mutex = NULL; /* mutex for G_SLICE=debug-blocks */ + +/* --- auxillary funcitons --- */ +void +g_slice_set_config (GSliceConfig ckey, + gint64 value) +{ + g_return_if_fail (sys_page_size == 0); + switch (ckey) + { + case G_SLICE_CONFIG_ALWAYS_MALLOC: + slice_config.always_malloc = value != 0; + break; + case G_SLICE_CONFIG_BYPASS_MAGAZINES: + slice_config.bypass_magazines = value != 0; + break; + case G_SLICE_CONFIG_WORKING_SET_MSECS: + slice_config.working_set_msecs = value; + break; + case G_SLICE_CONFIG_COLOR_INCREMENT: + slice_config.color_increment = value; + default: ; + } +} + +gint64 +g_slice_get_config (GSliceConfig ckey) +{ + switch (ckey) + { + case G_SLICE_CONFIG_ALWAYS_MALLOC: + return slice_config.always_malloc; + case G_SLICE_CONFIG_BYPASS_MAGAZINES: + return slice_config.bypass_magazines; + case G_SLICE_CONFIG_WORKING_SET_MSECS: + return slice_config.working_set_msecs; + case G_SLICE_CONFIG_CHUNK_SIZES: + return MAX_SLAB_INDEX (allocator); + case G_SLICE_CONFIG_COLOR_INCREMENT: + return slice_config.color_increment; + default: + return 0; + } +} + +gint64* +g_slice_get_config_state (GSliceConfig ckey, + gint64 address, + guint *n_values) +{ + guint i = 0; + g_return_val_if_fail (n_values != NULL, NULL); + *n_values = 0; + switch (ckey) + { + gint64 array[64]; + case G_SLICE_CONFIG_CONTENTION_COUNTER: + array[i++] = SLAB_CHUNK_SIZE (allocator, address); + array[i++] = allocator->contention_counters[address]; + array[i++] = allocator_get_magazine_threshold (allocator, address); + *n_values = i; + return g_memdup (array, sizeof (array[0]) * *n_values); + default: + return NULL; + } +} + +static void +slice_config_init (SliceConfig *config) +{ + /* don't use g_malloc/g_message here */ + gchar buffer[1024]; + const gchar *val = _g_getenv_nomalloc ("G_SLICE", buffer); + const GDebugKey keys[] = { + { "always-malloc", 1 << 0 }, + { "debug-blocks", 1 << 1 }, + }; + gint flags = !val ? 0 : g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + *config = slice_config; + if (flags & (1 << 0)) /* always-malloc */ + config->always_malloc = TRUE; + if (flags & (1 << 1)) /* debug-blocks */ + config->debug_blocks = TRUE; +} + +static void +g_slice_init_nomessage (void) +{ + /* we may not use g_error() or friends here */ + mem_assert (sys_page_size == 0); + mem_assert (MIN_MAGAZINE_SIZE >= 4); + +#ifdef G_OS_WIN32 + { + SYSTEM_INFO system_info; + GetSystemInfo (&system_info); + sys_page_size = system_info.dwPageSize; + } +#else + sys_page_size = sysconf (_SC_PAGESIZE); /* = sysconf (_SC_PAGE_SIZE); = getpagesize(); */ +#endif + mem_assert (sys_page_size >= 2 * LARGEALIGNMENT); + mem_assert ((sys_page_size & (sys_page_size - 1)) == 0); + slice_config_init (&allocator->config); + allocator->min_page_size = sys_page_size; +#if HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN + /* allow allocation of pages up to 8KB (with 8KB alignment). + * this is useful because many medium to large sized structures + * fit less than 8 times (see [4]) into 4KB pages. + * we allow very small page sizes here, to reduce wastage in + * threads if only small allocations are required (this does + * bear the risk of incresing allocation times and fragmentation + * though). + */ + allocator->min_page_size = MAX (allocator->min_page_size, 4096); + allocator->max_page_size = MAX (allocator->min_page_size, 8192); + allocator->min_page_size = MIN (allocator->min_page_size, 128); +#else + /* we can only align to system page size */ + allocator->max_page_size = sys_page_size; +#endif + if (allocator->config.always_malloc) + { + allocator->contention_counters = NULL; + allocator->magazines = NULL; + allocator->slab_stack = NULL; + } + else + { + allocator->contention_counters = g_new0 (guint, MAX_SLAB_INDEX (allocator)); + allocator->magazines = g_new0 (ChunkLink*, MAX_SLAB_INDEX (allocator)); + allocator->slab_stack = g_new0 (SlabInfo*, MAX_SLAB_INDEX (allocator)); + } + + allocator->magazine_mutex = NULL; /* _g_slice_thread_init_nomessage() */ + allocator->mutex_counter = 0; + allocator->stamp_counter = MAX_STAMP_COUNTER; /* force initial update */ + allocator->last_stamp = 0; + allocator->slab_mutex = NULL; /* _g_slice_thread_init_nomessage() */ + allocator->color_accu = 0; + magazine_cache_update_stamp(); + /* values cached for performance reasons */ + allocator->max_slab_chunk_size_for_magazine_cache = MAX_SLAB_CHUNK_SIZE (allocator); + if (allocator->config.always_malloc || allocator->config.bypass_magazines) + allocator->max_slab_chunk_size_for_magazine_cache = 0; /* non-optimized cases */ + /* at this point, g_mem_gc_friendly() should be initialized, this + * should have been accomplished by the above g_malloc/g_new calls + */ +} + +static inline guint +allocator_categorize (gsize aligned_chunk_size) +{ + /* speed up the likely path */ + if (G_LIKELY (aligned_chunk_size && aligned_chunk_size <= allocator->max_slab_chunk_size_for_magazine_cache)) + return 1; /* use magazine cache */ + + /* the above will fail (max_slab_chunk_size_for_magazine_cache == 0) if the + * allocator is still uninitialized, or if we are not configured to use the + * magazine cache. + */ + if (!sys_page_size) + g_slice_init_nomessage (); + if (!allocator->config.always_malloc && + aligned_chunk_size && + aligned_chunk_size <= MAX_SLAB_CHUNK_SIZE (allocator)) + { + if (allocator->config.bypass_magazines) + return 2; /* use slab allocator, see [2] */ + return 1; /* use magazine cache */ + } + return 0; /* use malloc() */ +} + +void +_g_slice_thread_init_nomessage (void) +{ + /* we may not use g_error() or friends here */ + if (!sys_page_size) + g_slice_init_nomessage(); + else + { + /* g_slice_init_nomessage() has been called already, probably due + * to a g_slice_alloc1() before g_thread_init(). + */ + } + private_thread_memory = g_private_new (private_thread_memory_cleanup); + allocator->magazine_mutex = g_mutex_new(); + allocator->slab_mutex = g_mutex_new(); + if (allocator->config.debug_blocks) + smc_tree_mutex = g_mutex_new(); +} + +static inline void +g_mutex_lock_a (GMutex *mutex, + guint *contention_counter) +{ + gboolean contention = FALSE; + if (!g_mutex_trylock (mutex)) + { + g_mutex_lock (mutex); + contention = TRUE; + } + if (contention) + { + allocator->mutex_counter++; + if (allocator->mutex_counter >= 1) /* quickly adapt to contention */ + { + allocator->mutex_counter = 0; + *contention_counter = MIN (*contention_counter + 1, MAX_MAGAZINE_SIZE); + } + } + else /* !contention */ + { + allocator->mutex_counter--; + if (allocator->mutex_counter < -11) /* moderately recover magazine sizes */ + { + allocator->mutex_counter = 0; + *contention_counter = MAX (*contention_counter, 1) - 1; + } + } +} + +static inline ThreadMemory* +thread_memory_from_self (void) +{ + ThreadMemory *tmem = g_private_get (private_thread_memory); + if (G_UNLIKELY (!tmem)) + { + static ThreadMemory *single_thread_memory = NULL; /* remember single-thread info for multi-threaded case */ + if (single_thread_memory && g_thread_supported ()) + { + g_mutex_lock (allocator->slab_mutex); + if (single_thread_memory) + { + /* GSlice has been used before g_thread_init(), and now + * we are running threaded. to cope with it, use the saved + * thread memory structure from when we weren't threaded. + */ + tmem = single_thread_memory; + single_thread_memory = NULL; /* slab_mutex protected when multi-threaded */ + } + g_mutex_unlock (allocator->slab_mutex); + } + if (!tmem) + { + const guint n_magazines = MAX_SLAB_INDEX (allocator); + tmem = g_malloc0 (sizeof (ThreadMemory) + sizeof (Magazine) * 2 * n_magazines); + tmem->magazine1 = (Magazine*) (tmem + 1); + tmem->magazine2 = &tmem->magazine1[n_magazines]; + } + /* g_private_get/g_private_set works in the single-threaded xor the multi- + * threaded case. but not *across* g_thread_init(), after multi-thread + * initialization it returns NULL for previously set single-thread data. + */ + g_private_set (private_thread_memory, tmem); + /* save single-thread thread memory structure, in case we need to + * pick it up again after multi-thread initialization happened. + */ + if (!single_thread_memory && !g_thread_supported ()) + single_thread_memory = tmem; /* no slab_mutex created yet */ + } + return tmem; +} + +static inline ChunkLink* +magazine_chain_pop_head (ChunkLink **magazine_chunks) +{ + /* magazine chains are linked via ChunkLink->next. + * each ChunkLink->data of the toplevel chain may point to a subchain, + * linked via ChunkLink->next. ChunkLink->data of the subchains just + * contains uninitialized junk. + */ + ChunkLink *chunk = (*magazine_chunks)->data; + if (G_UNLIKELY (chunk)) + { + /* allocating from freed list */ + (*magazine_chunks)->data = chunk->next; + } + else + { + chunk = *magazine_chunks; + *magazine_chunks = chunk->next; + } + return chunk; +} + +#if 0 /* useful for debugging */ +static guint +magazine_count (ChunkLink *head) +{ + guint count = 0; + if (!head) + return 0; + while (head) + { + ChunkLink *child = head->data; + count += 1; + for (child = head->data; child; child = child->next) + count += 1; + head = head->next; + } + return count; +} +#endif + +static inline gsize +allocator_get_magazine_threshold (Allocator *allocator, + guint ix) +{ + /* the magazine size calculated here has a lower bound of MIN_MAGAZINE_SIZE, + * which is required by the implementation. also, for moderately sized chunks + * (say >= 64 bytes), magazine sizes shouldn't be much smaller then the number + * of chunks available per page/2 to avoid excessive traffic in the magazine + * cache for small to medium sized structures. + * the upper bound of the magazine size is effectively provided by + * MAX_MAGAZINE_SIZE. for larger chunks, this number is scaled down so that + * the content of a single magazine doesn't exceed ca. 16KB. + */ + gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix); + guint threshold = MAX (MIN_MAGAZINE_SIZE, allocator->max_page_size / MAX (5 * chunk_size, 5 * 32)); + guint contention_counter = allocator->contention_counters[ix]; + if (G_UNLIKELY (contention_counter)) /* single CPU bias */ + { + /* adapt contention counter thresholds to chunk sizes */ + contention_counter = contention_counter * 64 / chunk_size; + threshold = MAX (threshold, contention_counter); + } + return threshold; +} + +/* --- magazine cache --- */ +static inline void +magazine_cache_update_stamp (void) +{ + if (allocator->stamp_counter >= MAX_STAMP_COUNTER) + { + GTimeVal tv; + g_get_current_time (&tv); + allocator->last_stamp = tv.tv_sec * 1000 + tv.tv_usec / 1000; /* milli seconds */ + allocator->stamp_counter = 0; + } + else + allocator->stamp_counter++; +} + +static inline ChunkLink* +magazine_chain_prepare_fields (ChunkLink *magazine_chunks) +{ + ChunkLink *chunk1; + ChunkLink *chunk2; + ChunkLink *chunk3; + ChunkLink *chunk4; + /* checked upon initialization: mem_assert (MIN_MAGAZINE_SIZE >= 4); */ + /* ensure a magazine with at least 4 unused data pointers */ + chunk1 = magazine_chain_pop_head (&magazine_chunks); + chunk2 = magazine_chain_pop_head (&magazine_chunks); + chunk3 = magazine_chain_pop_head (&magazine_chunks); + chunk4 = magazine_chain_pop_head (&magazine_chunks); + chunk4->next = magazine_chunks; + chunk3->next = chunk4; + chunk2->next = chunk3; + chunk1->next = chunk2; + return chunk1; +} + +/* access the first 3 fields of a specially prepared magazine chain */ +#define magazine_chain_prev(mc) ((mc)->data) +#define magazine_chain_stamp(mc) ((mc)->next->data) +#define magazine_chain_uint_stamp(mc) GPOINTER_TO_UINT ((mc)->next->data) +#define magazine_chain_next(mc) ((mc)->next->next->data) +#define magazine_chain_count(mc) ((mc)->next->next->next->data) + +static void +magazine_cache_trim (Allocator *allocator, + guint ix, + guint stamp) +{ + /* g_mutex_lock (allocator->mutex); done by caller */ + /* trim magazine cache from tail */ + ChunkLink *current = magazine_chain_prev (allocator->magazines[ix]); + ChunkLink *trash = NULL; + while (ABS (stamp - magazine_chain_uint_stamp (current)) >= allocator->config.working_set_msecs) + { + /* unlink */ + ChunkLink *prev = magazine_chain_prev (current); + ChunkLink *next = magazine_chain_next (current); + magazine_chain_next (prev) = next; + magazine_chain_prev (next) = prev; + /* clear special fields, put on trash stack */ + magazine_chain_next (current) = NULL; + magazine_chain_count (current) = NULL; + magazine_chain_stamp (current) = NULL; + magazine_chain_prev (current) = trash; + trash = current; + /* fixup list head if required */ + if (current == allocator->magazines[ix]) + { + allocator->magazines[ix] = NULL; + break; + } + current = prev; + } + g_mutex_unlock (allocator->magazine_mutex); + /* free trash */ + if (trash) + { + const gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix); + g_mutex_lock (allocator->slab_mutex); + while (trash) + { + current = trash; + trash = magazine_chain_prev (current); + magazine_chain_prev (current) = NULL; /* clear special field */ + while (current) + { + ChunkLink *chunk = magazine_chain_pop_head (¤t); + slab_allocator_free_chunk (chunk_size, chunk); + } + } + g_mutex_unlock (allocator->slab_mutex); + } +} + +static void +magazine_cache_push_magazine (guint ix, + ChunkLink *magazine_chunks, + gsize count) /* must be >= MIN_MAGAZINE_SIZE */ +{ + ChunkLink *current = magazine_chain_prepare_fields (magazine_chunks); + ChunkLink *next, *prev; + g_mutex_lock (allocator->magazine_mutex); + /* add magazine at head */ + next = allocator->magazines[ix]; + if (next) + prev = magazine_chain_prev (next); + else + next = prev = current; + magazine_chain_next (prev) = current; + magazine_chain_prev (next) = current; + magazine_chain_prev (current) = prev; + magazine_chain_next (current) = next; + magazine_chain_count (current) = (gpointer) count; + /* stamp magazine */ + magazine_cache_update_stamp(); + magazine_chain_stamp (current) = GUINT_TO_POINTER (allocator->last_stamp); + allocator->magazines[ix] = current; + /* free old magazines beyond a certain threshold */ + magazine_cache_trim (allocator, ix, allocator->last_stamp); + /* g_mutex_unlock (allocator->mutex); was done by magazine_cache_trim() */ +} + +static ChunkLink* +magazine_cache_pop_magazine (guint ix, + gsize *countp) +{ + g_mutex_lock_a (allocator->magazine_mutex, &allocator->contention_counters[ix]); + if (!allocator->magazines[ix]) + { + guint magazine_threshold = allocator_get_magazine_threshold (allocator, ix); + gsize i, chunk_size = SLAB_CHUNK_SIZE (allocator, ix); + ChunkLink *chunk, *head; + g_mutex_unlock (allocator->magazine_mutex); + g_mutex_lock (allocator->slab_mutex); + head = slab_allocator_alloc_chunk (chunk_size); + head->data = NULL; + chunk = head; + for (i = 1; i < magazine_threshold; i++) + { + chunk->next = slab_allocator_alloc_chunk (chunk_size); + chunk = chunk->next; + chunk->data = NULL; + } + chunk->next = NULL; + g_mutex_unlock (allocator->slab_mutex); + *countp = i; + return head; + } + else + { + ChunkLink *current = allocator->magazines[ix]; + ChunkLink *prev = magazine_chain_prev (current); + ChunkLink *next = magazine_chain_next (current); + /* unlink */ + magazine_chain_next (prev) = next; + magazine_chain_prev (next) = prev; + allocator->magazines[ix] = next == current ? NULL : next; + g_mutex_unlock (allocator->magazine_mutex); + /* clear special fields and hand out */ + *countp = (gsize) magazine_chain_count (current); + magazine_chain_prev (current) = NULL; + magazine_chain_next (current) = NULL; + magazine_chain_count (current) = NULL; + magazine_chain_stamp (current) = NULL; + return current; + } +} + +/* --- thread magazines --- */ +static void +private_thread_memory_cleanup (gpointer data) +{ + ThreadMemory *tmem = data; + const guint n_magazines = MAX_SLAB_INDEX (allocator); + guint ix; + for (ix = 0; ix < n_magazines; ix++) + { + Magazine *mags[2]; + guint j; + mags[0] = &tmem->magazine1[ix]; + mags[1] = &tmem->magazine2[ix]; + for (j = 0; j < 2; j++) + { + Magazine *mag = mags[j]; + if (mag->count >= MIN_MAGAZINE_SIZE) + magazine_cache_push_magazine (ix, mag->chunks, mag->count); + else + { + const gsize chunk_size = SLAB_CHUNK_SIZE (allocator, ix); + g_mutex_lock (allocator->slab_mutex); + while (mag->chunks) + { + ChunkLink *chunk = magazine_chain_pop_head (&mag->chunks); + slab_allocator_free_chunk (chunk_size, chunk); + } + g_mutex_unlock (allocator->slab_mutex); + } + } + } + g_free (tmem); +} + +static void +thread_memory_magazine1_reload (ThreadMemory *tmem, + guint ix) +{ + Magazine *mag = &tmem->magazine1[ix]; + mem_assert (mag->chunks == NULL); /* ensure that we may reset mag->count */ + mag->count = 0; + mag->chunks = magazine_cache_pop_magazine (ix, &mag->count); +} + +static void +thread_memory_magazine2_unload (ThreadMemory *tmem, + guint ix) +{ + Magazine *mag = &tmem->magazine2[ix]; + magazine_cache_push_magazine (ix, mag->chunks, mag->count); + mag->chunks = NULL; + mag->count = 0; +} + +static inline void +thread_memory_swap_magazines (ThreadMemory *tmem, + guint ix) +{ + Magazine xmag = tmem->magazine1[ix]; + tmem->magazine1[ix] = tmem->magazine2[ix]; + tmem->magazine2[ix] = xmag; +} + +static inline gboolean +thread_memory_magazine1_is_empty (ThreadMemory *tmem, + guint ix) +{ + return tmem->magazine1[ix].chunks == NULL; +} + +static inline gboolean +thread_memory_magazine2_is_full (ThreadMemory *tmem, + guint ix) +{ + return tmem->magazine2[ix].count >= allocator_get_magazine_threshold (allocator, ix); +} + +static inline gpointer +thread_memory_magazine1_alloc (ThreadMemory *tmem, + guint ix) +{ + Magazine *mag = &tmem->magazine1[ix]; + ChunkLink *chunk = magazine_chain_pop_head (&mag->chunks); + if (G_LIKELY (mag->count > 0)) + mag->count--; + return chunk; +} + +static inline void +thread_memory_magazine2_free (ThreadMemory *tmem, + guint ix, + gpointer mem) +{ + Magazine *mag = &tmem->magazine2[ix]; + ChunkLink *chunk = mem; + chunk->data = NULL; + chunk->next = mag->chunks; + mag->chunks = chunk; + mag->count++; +} + +/* --- API functions --- */ +gpointer +g_slice_alloc (gsize mem_size) +{ + gsize chunk_size; + gpointer mem; + guint acat; + chunk_size = P2ALIGN (mem_size); + acat = allocator_categorize (chunk_size); + if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ + { + ThreadMemory *tmem = thread_memory_from_self(); + guint ix = SLAB_INDEX (allocator, chunk_size); + if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix))) + { + thread_memory_swap_magazines (tmem, ix); + if (G_UNLIKELY (thread_memory_magazine1_is_empty (tmem, ix))) + thread_memory_magazine1_reload (tmem, ix); + } + mem = thread_memory_magazine1_alloc (tmem, ix); + } + else if (acat == 2) /* allocate through slab allocator */ + { + g_mutex_lock (allocator->slab_mutex); + mem = slab_allocator_alloc_chunk (chunk_size); + g_mutex_unlock (allocator->slab_mutex); + } + else /* delegate to system malloc */ + mem = g_malloc (mem_size); + if (G_UNLIKELY (allocator->config.debug_blocks)) + smc_notify_alloc (mem, mem_size); + return mem; +} + +gpointer +g_slice_alloc0 (gsize mem_size) +{ + gpointer mem = g_slice_alloc (mem_size); + if (mem) + memset (mem, 0, mem_size); + return mem; +} + +gpointer +g_slice_copy (gsize mem_size, + gconstpointer mem_block) +{ + gpointer mem = g_slice_alloc (mem_size); + if (mem) + memcpy (mem, mem_block, mem_size); + return mem; +} + +void +g_slice_free1 (gsize mem_size, + gpointer mem_block) +{ + gsize chunk_size = P2ALIGN (mem_size); + guint acat = allocator_categorize (chunk_size); + if (G_UNLIKELY (!mem_block)) + return; + if (G_UNLIKELY (allocator->config.debug_blocks) && + !smc_notify_free (mem_block, mem_size)) + abort(); + if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ + { + ThreadMemory *tmem = thread_memory_from_self(); + guint ix = SLAB_INDEX (allocator, chunk_size); + if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) + { + thread_memory_swap_magazines (tmem, ix); + if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) + thread_memory_magazine2_unload (tmem, ix); + } + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (mem_block, 0, chunk_size); + thread_memory_magazine2_free (tmem, ix, mem_block); + } + else if (acat == 2) /* allocate through slab allocator */ + { + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (mem_block, 0, chunk_size); + g_mutex_lock (allocator->slab_mutex); + slab_allocator_free_chunk (chunk_size, mem_block); + g_mutex_unlock (allocator->slab_mutex); + } + else /* delegate to system malloc */ + { + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (mem_block, 0, mem_size); + g_free (mem_block); + } +} + +void +g_slice_free_chain_with_offset (gsize mem_size, + gpointer mem_chain, + gsize next_offset) +{ + gpointer slice = mem_chain; + /* while the thread magazines and the magazine cache are implemented so that + * they can easily be extended to allow for free lists containing more free + * lists for the first level nodes, which would allow O(1) freeing in this + * function, the benefit of such an extension is questionable, because: + * - the magazine size counts will become mere lower bounds which confuses + * the code adapting to lock contention; + * - freeing a single node to the thread magazines is very fast, so this + * O(list_length) operation is multiplied by a fairly small factor; + * - memory usage histograms on larger applications seem to indicate that + * the amount of released multi node lists is negligible in comparison + * to single node releases. + * - the major performance bottle neck, namely g_private_get() or + * g_mutex_lock()/g_mutex_unlock() has already been moved out of the + * inner loop for freeing chained slices. + */ + gsize chunk_size = P2ALIGN (mem_size); + guint acat = allocator_categorize (chunk_size); + if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ + { + ThreadMemory *tmem = thread_memory_from_self(); + guint ix = SLAB_INDEX (allocator, chunk_size); + while (slice) + { + guint8 *current = slice; + slice = *(gpointer*) (current + next_offset); + if (G_UNLIKELY (allocator->config.debug_blocks) && + !smc_notify_free (current, mem_size)) + abort(); + if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) + { + thread_memory_swap_magazines (tmem, ix); + if (G_UNLIKELY (thread_memory_magazine2_is_full (tmem, ix))) + thread_memory_magazine2_unload (tmem, ix); + } + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (current, 0, chunk_size); + thread_memory_magazine2_free (tmem, ix, current); + } + } + else if (acat == 2) /* allocate through slab allocator */ + { + g_mutex_lock (allocator->slab_mutex); + while (slice) + { + guint8 *current = slice; + slice = *(gpointer*) (current + next_offset); + if (G_UNLIKELY (allocator->config.debug_blocks) && + !smc_notify_free (current, mem_size)) + abort(); + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (current, 0, chunk_size); + slab_allocator_free_chunk (chunk_size, current); + } + g_mutex_unlock (allocator->slab_mutex); + } + else /* delegate to system malloc */ + while (slice) + { + guint8 *current = slice; + slice = *(gpointer*) (current + next_offset); + if (G_UNLIKELY (allocator->config.debug_blocks) && + !smc_notify_free (current, mem_size)) + abort(); + if (G_UNLIKELY (g_mem_gc_friendly)) + memset (current, 0, mem_size); + g_free (current); + } +} + +/* --- single page allocator --- */ +static void +allocator_slab_stack_push (Allocator *allocator, + guint ix, + SlabInfo *sinfo) +{ + /* insert slab at slab ring head */ + if (!allocator->slab_stack[ix]) + { + sinfo->next = sinfo; + sinfo->prev = sinfo; + } + else + { + SlabInfo *next = allocator->slab_stack[ix], *prev = next->prev; + next->prev = sinfo; + prev->next = sinfo; + sinfo->next = next; + sinfo->prev = prev; + } + allocator->slab_stack[ix] = sinfo; +} + +static gsize +allocator_aligned_page_size (Allocator *allocator, + gsize n_bytes) +{ + gsize val = 1 << g_bit_storage (n_bytes - 1); + val = MAX (val, allocator->min_page_size); + return val; +} + +static void +allocator_add_slab (Allocator *allocator, + guint ix, + gsize chunk_size) +{ + ChunkLink *chunk; + SlabInfo *sinfo; + gsize addr, padding, n_chunks, color = 0; + gsize page_size = allocator_aligned_page_size (allocator, SLAB_BPAGE_SIZE (allocator, chunk_size)); + /* allocate 1 page for the chunks and the slab */ + gpointer aligned_memory = allocator_memalign (page_size, page_size - NATIVE_MALLOC_PADDING); + guint8 *mem = aligned_memory; + guint i; + if (!mem) + { + const gchar *syserr = "unknown error"; +#if HAVE_STRERROR + syserr = strerror (errno); +#endif + mem_error ("failed to allocate %u bytes (alignment: %u): %s\n", + (guint) (page_size - NATIVE_MALLOC_PADDING), (guint) page_size, syserr); + } + /* mask page adress */ + addr = ((gsize) mem / page_size) * page_size; + /* assert alignment */ + mem_assert (aligned_memory == (gpointer) addr); + /* basic slab info setup */ + sinfo = (SlabInfo*) (mem + page_size - SLAB_INFO_SIZE); + sinfo->n_allocated = 0; + sinfo->chunks = NULL; + /* figure cache colorization */ + n_chunks = ((guint8*) sinfo - mem) / chunk_size; + padding = ((guint8*) sinfo - mem) - n_chunks * chunk_size; + if (padding) + { + color = (allocator->color_accu * P2ALIGNMENT) % padding; + allocator->color_accu += allocator->config.color_increment; + } + /* add chunks to free list */ + chunk = (ChunkLink*) (mem + color); + sinfo->chunks = chunk; + for (i = 0; i < n_chunks - 1; i++) + { + chunk->next = (ChunkLink*) ((guint8*) chunk + chunk_size); + chunk = chunk->next; + } + chunk->next = NULL; /* last chunk */ + /* add slab to slab ring */ + allocator_slab_stack_push (allocator, ix, sinfo); +} + +static gpointer +slab_allocator_alloc_chunk (gsize chunk_size) +{ + ChunkLink *chunk; + guint ix = SLAB_INDEX (allocator, chunk_size); + /* ensure non-empty slab */ + if (!allocator->slab_stack[ix] || !allocator->slab_stack[ix]->chunks) + allocator_add_slab (allocator, ix, chunk_size); + /* allocate chunk */ + chunk = allocator->slab_stack[ix]->chunks; + allocator->slab_stack[ix]->chunks = chunk->next; + allocator->slab_stack[ix]->n_allocated++; + /* rotate empty slabs */ + if (!allocator->slab_stack[ix]->chunks) + allocator->slab_stack[ix] = allocator->slab_stack[ix]->next; + return chunk; +} + +static void +slab_allocator_free_chunk (gsize chunk_size, + gpointer mem) +{ + ChunkLink *chunk; + gboolean was_empty; + guint ix = SLAB_INDEX (allocator, chunk_size); + gsize page_size = allocator_aligned_page_size (allocator, SLAB_BPAGE_SIZE (allocator, chunk_size)); + gsize addr = ((gsize) mem / page_size) * page_size; + /* mask page adress */ + guint8 *page = (guint8*) addr; + SlabInfo *sinfo = (SlabInfo*) (page + page_size - SLAB_INFO_SIZE); + /* assert valid chunk count */ + mem_assert (sinfo->n_allocated > 0); + /* add chunk to free list */ + was_empty = sinfo->chunks == NULL; + chunk = (ChunkLink*) mem; + chunk->next = sinfo->chunks; + sinfo->chunks = chunk; + sinfo->n_allocated--; + /* keep slab ring partially sorted, empty slabs at end */ + if (was_empty) + { + /* unlink slab */ + SlabInfo *next = sinfo->next, *prev = sinfo->prev; + next->prev = prev; + prev->next = next; + if (allocator->slab_stack[ix] == sinfo) + allocator->slab_stack[ix] = next == sinfo ? NULL : next; + /* insert slab at head */ + allocator_slab_stack_push (allocator, ix, sinfo); + } + /* eagerly free complete unused slabs */ + if (!sinfo->n_allocated) + { + /* unlink slab */ + SlabInfo *next = sinfo->next, *prev = sinfo->prev; + next->prev = prev; + prev->next = next; + if (allocator->slab_stack[ix] == sinfo) + allocator->slab_stack[ix] = next == sinfo ? NULL : next; + /* free slab */ + allocator_memfree (page_size, page); + } +} + +/* --- memalign implementation --- */ +#ifdef HAVE_MALLOC_H +#include /* memalign() */ +#endif + +/* from config.h: + * define HAVE_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works, + * define HAVE_COMPLIANT_POSIX_MEMALIGN 1 // if free(posix_memalign(3)) works for sizes != 2^n, + * define HAVE_MEMALIGN 1 // if free(memalign(3)) works, + * define HAVE_VALLOC 1 // if free(valloc(3)) works, or + * if none is provided, we implement malloc(3)-based alloc-only page alignment + */ + +#if !(HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC) +static GTrashStack *compat_valloc_trash = NULL; +#endif + +static gpointer +allocator_memalign (gsize alignment, + gsize memsize) +{ + gpointer aligned_memory = NULL; + gint err = ENOMEM; +#if HAVE_COMPLIANT_POSIX_MEMALIGN + err = posix_memalign (&aligned_memory, alignment, memsize); +#elif HAVE_MEMALIGN + errno = 0; + aligned_memory = memalign (alignment, memsize); + err = errno; +#elif HAVE_VALLOC + errno = 0; + aligned_memory = valloc (memsize); + err = errno; +#else + /* simplistic non-freeing page allocator */ + mem_assert (alignment == sys_page_size); + mem_assert (memsize <= sys_page_size); + if (!compat_valloc_trash) + { + const guint n_pages = 16; + guint8 *mem = malloc (n_pages * sys_page_size); + err = errno; + if (mem) + { + gint i = n_pages; + guint8 *amem = (guint8*) ALIGN ((gsize) mem, sys_page_size); + if (amem != mem) + i--; /* mem wasn't page aligned */ + while (--i >= 0) + g_trash_stack_push (&compat_valloc_trash, amem + i * sys_page_size); + } + } + aligned_memory = g_trash_stack_pop (&compat_valloc_trash); +#endif + if (!aligned_memory) + errno = err; + return aligned_memory; +} + +static void +allocator_memfree (gsize memsize, + gpointer mem) +{ +#if HAVE_COMPLIANT_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_VALLOC + free (mem); +#else + mem_assert (memsize <= sys_page_size); + g_trash_stack_push (&compat_valloc_trash, mem); +#endif +} + +static void +mem_error (const char *format, + ...) +{ + const char *pname; + va_list args; + /* at least, put out "MEMORY-ERROR", in case we segfault during the rest of the function */ + fputs ("\n***MEMORY-ERROR***: ", stderr); + pname = g_get_prgname(); + fprintf (stderr, "%s[%ld]: GSlice: ", pname ? pname : "", (long)getpid()); + va_start (args, format); + vfprintf (stderr, format, args); + va_end (args); + fputs ("\n", stderr); + abort(); + _exit (1); +} + +/* --- g-slice memory checker tree --- */ +typedef size_t SmcKType; /* key type */ +typedef size_t SmcVType; /* value type */ +typedef struct { + SmcKType key; + SmcVType value; +} SmcEntry; +static void smc_tree_insert (SmcKType key, + SmcVType value); +static gboolean smc_tree_lookup (SmcKType key, + SmcVType *value_p); +static gboolean smc_tree_remove (SmcKType key); + + +/* --- g-slice memory checker implementation --- */ +static void +smc_notify_alloc (void *pointer, + size_t size) +{ + size_t adress = (size_t) pointer; + if (pointer) + smc_tree_insert (adress, size); +} + +#if 0 +static void +smc_notify_ignore (void *pointer) +{ + size_t adress = (size_t) pointer; + if (pointer) + smc_tree_remove (adress); +} +#endif + +static int +smc_notify_free (void *pointer, + size_t size) +{ + size_t adress = (size_t) pointer; + SmcVType real_size; + gboolean found_one; + + if (!pointer) + return 1; /* ignore */ + found_one = smc_tree_lookup (adress, &real_size); + if (!found_one) + { + fprintf (stderr, "GSlice: MemChecker: attempt to release non-allocated block: %p size=%" G_GSIZE_FORMAT "\n", pointer, size); + return 0; + } + if (real_size != size && (real_size || size)) + { + fprintf (stderr, "GSlice: MemChecker: attempt to release block with invalid size: %p size=%" G_GSIZE_FORMAT " invalid-size=%" G_GSIZE_FORMAT "\n", pointer, real_size, size); + return 0; + } + if (!smc_tree_remove (adress)) + { + fprintf (stderr, "GSlice: MemChecker: attempt to release non-allocated block: %p size=%" G_GSIZE_FORMAT "\n", pointer, size); + return 0; + } + return 1; /* all fine */ +} + +/* --- g-slice memory checker tree implementation --- */ +#define SMC_TRUNK_COUNT (4093 /* 16381 */) /* prime, to distribute trunk collisions (big, allocated just once) */ +#define SMC_BRANCH_COUNT (511) /* prime, to distribute branch collisions */ +#define SMC_TRUNK_EXTENT (SMC_BRANCH_COUNT * 2039) /* key adress space per trunk, should distribute uniformly across BRANCH_COUNT */ +#define SMC_TRUNK_HASH(k) ((k / SMC_TRUNK_EXTENT) % SMC_TRUNK_COUNT) /* generate new trunk hash per megabyte (roughly) */ +#define SMC_BRANCH_HASH(k) (k % SMC_BRANCH_COUNT) + +typedef struct { + SmcEntry *entries; + unsigned int n_entries; +} SmcBranch; + +static SmcBranch **smc_tree_root = NULL; + +static void +smc_tree_abort (int errval) +{ + const char *syserr = "unknown error"; +#if HAVE_STRERROR + syserr = strerror (errval); +#endif + mem_error ("MemChecker: failure in debugging tree: %s", syserr); +} + +static inline SmcEntry* +smc_tree_branch_grow_L (SmcBranch *branch, + unsigned int index) +{ + unsigned int old_size = branch->n_entries * sizeof (branch->entries[0]); + unsigned int new_size = old_size + sizeof (branch->entries[0]); + SmcEntry *entry; + mem_assert (index <= branch->n_entries); + branch->entries = (SmcEntry*) realloc (branch->entries, new_size); + if (!branch->entries) + smc_tree_abort (errno); + entry = branch->entries + index; + g_memmove (entry + 1, entry, (branch->n_entries - index) * sizeof (entry[0])); + branch->n_entries += 1; + return entry; +} + +static inline SmcEntry* +smc_tree_branch_lookup_nearest_L (SmcBranch *branch, + SmcKType key) +{ + unsigned int n_nodes = branch->n_entries, offs = 0; + SmcEntry *check = branch->entries; + int cmp = 0; + while (offs < n_nodes) + { + unsigned int i = (offs + n_nodes) >> 1; + check = branch->entries + i; + cmp = key < check->key ? -1 : key != check->key; + if (cmp == 0) + return check; /* return exact match */ + else if (cmp < 0) + n_nodes = i; + else /* (cmp > 0) */ + offs = i + 1; + } + /* check points at last mismatch, cmp > 0 indicates greater key */ + return cmp > 0 ? check + 1 : check; /* return insertion position for inexact match */ +} + +static void +smc_tree_insert (SmcKType key, + SmcVType value) +{ + unsigned int ix0, ix1; + SmcEntry *entry; + + g_mutex_lock (smc_tree_mutex); + ix0 = SMC_TRUNK_HASH (key); + ix1 = SMC_BRANCH_HASH (key); + if (!smc_tree_root) + { + smc_tree_root = calloc (SMC_TRUNK_COUNT, sizeof (smc_tree_root[0])); + if (!smc_tree_root) + smc_tree_abort (errno); + } + if (!smc_tree_root[ix0]) + { + smc_tree_root[ix0] = calloc (SMC_BRANCH_COUNT, sizeof (smc_tree_root[0][0])); + if (!smc_tree_root[ix0]) + smc_tree_abort (errno); + } + entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key); + if (!entry || /* need create */ + entry >= smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries || /* need append */ + entry->key != key) /* need insert */ + entry = smc_tree_branch_grow_L (&smc_tree_root[ix0][ix1], entry - smc_tree_root[ix0][ix1].entries); + entry->key = key; + entry->value = value; + g_mutex_unlock (smc_tree_mutex); +} + +static gboolean +smc_tree_lookup (SmcKType key, + SmcVType *value_p) +{ + SmcEntry *entry = NULL; + unsigned int ix0 = SMC_TRUNK_HASH (key), ix1 = SMC_BRANCH_HASH (key); + gboolean found_one = FALSE; + *value_p = 0; + g_mutex_lock (smc_tree_mutex); + if (smc_tree_root && smc_tree_root[ix0]) + { + entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key); + if (entry && + entry < smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries && + entry->key == key) + { + found_one = TRUE; + *value_p = entry->value; + } + } + g_mutex_unlock (smc_tree_mutex); + return found_one; +} + +static gboolean +smc_tree_remove (SmcKType key) +{ + unsigned int ix0 = SMC_TRUNK_HASH (key), ix1 = SMC_BRANCH_HASH (key); + gboolean found_one = FALSE; + g_mutex_lock (smc_tree_mutex); + if (smc_tree_root && smc_tree_root[ix0]) + { + SmcEntry *entry = smc_tree_branch_lookup_nearest_L (&smc_tree_root[ix0][ix1], key); + if (entry && + entry < smc_tree_root[ix0][ix1].entries + smc_tree_root[ix0][ix1].n_entries && + entry->key == key) + { + unsigned int i = entry - smc_tree_root[ix0][ix1].entries; + smc_tree_root[ix0][ix1].n_entries -= 1; + g_memmove (entry, entry + 1, (smc_tree_root[ix0][ix1].n_entries - i) * sizeof (entry[0])); + if (!smc_tree_root[ix0][ix1].n_entries) + { + /* avoid useless pressure on the memory system */ + free (smc_tree_root[ix0][ix1].entries); + smc_tree_root[ix0][ix1].entries = NULL; + } + found_one = TRUE; + } + } + g_mutex_unlock (smc_tree_mutex); + return found_one; +} + +#ifdef G_ENABLE_DEBUG +void +g_slice_debug_tree_statistics (void) +{ + g_mutex_lock (smc_tree_mutex); + if (smc_tree_root) + { + unsigned int i, j, t = 0, o = 0, b = 0, su = 0, ex = 0, en = 4294967295u; + double tf, bf; + for (i = 0; i < SMC_TRUNK_COUNT; i++) + if (smc_tree_root[i]) + { + t++; + for (j = 0; j < SMC_BRANCH_COUNT; j++) + if (smc_tree_root[i][j].n_entries) + { + b++; + su += smc_tree_root[i][j].n_entries; + en = MIN (en, smc_tree_root[i][j].n_entries); + ex = MAX (ex, smc_tree_root[i][j].n_entries); + } + else if (smc_tree_root[i][j].entries) + o++; /* formerly used, now empty */ + } + en = b ? en : 0; + tf = MAX (t, 1.0); /* max(1) to be a valid divisor */ + bf = MAX (b, 1.0); /* max(1) to be a valid divisor */ + fprintf (stderr, "GSlice: MemChecker: %u trunks, %u branches, %u old branches\n", t, b, o); + fprintf (stderr, "GSlice: MemChecker: %f branches per trunk, %.2f%% utilization\n", + b / tf, + 100.0 - (SMC_BRANCH_COUNT - b / tf) / (0.01 * SMC_BRANCH_COUNT)); + fprintf (stderr, "GSlice: MemChecker: %f entries per branch, %u minimum, %u maximum\n", + su / bf, en, ex); + } + else + fprintf (stderr, "GSlice: MemChecker: root=NULL\n"); + g_mutex_unlock (smc_tree_mutex); + + /* sample statistics (beast + GSLice + 24h scripted core & GUI activity): + * PID %CPU %MEM VSZ RSS COMMAND + * 8887 30.3 45.8 456068 414856 beast-0.7.1 empty.bse + * $ cat /proc/8887/statm # total-program-size resident-set-size shared-pages text/code data/stack library dirty-pages + * 114017 103714 2354 344 0 108676 0 + * $ cat /proc/8887/status + * Name: beast-0.7.1 + * VmSize: 456068 kB + * VmLck: 0 kB + * VmRSS: 414856 kB + * VmData: 434620 kB + * VmStk: 84 kB + * VmExe: 1376 kB + * VmLib: 13036 kB + * VmPTE: 456 kB + * Threads: 3 + * (gdb) print g_slice_debug_tree_statistics () + * GSlice: MemChecker: 422 trunks, 213068 branches, 0 old branches + * GSlice: MemChecker: 504.900474 branches per trunk, 98.81% utilization + * GSlice: MemChecker: 4.965039 entries per branch, 1 minimum, 37 maximum + */ +} +#endif /* G_ENABLE_DEBUG */ + +#define __G_SLICE_C__ +#include "galiasdef.c" diff --git a/glib/gslice.h b/glib/gslice.h new file mode 100644 index 0000000..962199e --- /dev/null +++ b/glib/gslice.h @@ -0,0 +1,86 @@ +/* GLIB sliced memory - fast threaded memory chunk allocator + * Copyright (C) 2005 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SLICE_H__ +#define __G_SLICE_H__ + +#include + +G_BEGIN_DECLS + +/* slices - fast allocation/release of small memory blocks + */ +gpointer g_slice_alloc (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +gpointer g_slice_copy (gsize block_size, + gconstpointer mem_block) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +void g_slice_free1 (gsize block_size, + gpointer mem_block); +void g_slice_free_chain_with_offset (gsize block_size, + gpointer mem_chain, + gsize next_offset); +#define g_slice_new(type) ((type*) g_slice_alloc (sizeof (type))) +#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type))) +/* MemoryBlockType * + * g_slice_dup (MemoryBlockType, + * MemoryBlockType *mem_block); + * g_slice_free (MemoryBlockType, + * MemoryBlockType *mem_block); + * g_slice_free_chain (MemoryBlockType, + * MemoryBlockType *first_chain_block, + * memory_block_next_field); + * pseudo prototypes for the macro + * definitions following below. + */ + +/* we go through extra hoops to ensure type safety */ +#define g_slice_dup(type, mem) \ + (1 ? (type*) g_slice_copy (sizeof (type), (mem)) \ + : ((void) ((type*) 0 == (mem)), (type*) 0)) +#define g_slice_free(type, mem) do { \ + if (1) g_slice_free1 (sizeof (type), (mem)); \ + else (void) ((type*) 0 == (mem)); \ +} while (0) +#define g_slice_free_chain(type, mem_chain, next) do { \ + if (1) g_slice_free_chain_with_offset (sizeof (type), \ + (mem_chain), G_STRUCT_OFFSET (type, next)); \ + else (void) ((type*) 0 == (mem_chain)); \ +} while (0) + + +/* --- internal debugging API --- */ +typedef enum { + G_SLICE_CONFIG_ALWAYS_MALLOC = 1, + G_SLICE_CONFIG_BYPASS_MAGAZINES, + G_SLICE_CONFIG_WORKING_SET_MSECS, + G_SLICE_CONFIG_COLOR_INCREMENT, + G_SLICE_CONFIG_CHUNK_SIZES, + G_SLICE_CONFIG_CONTENTION_COUNTER +} GSliceConfig; +void g_slice_set_config (GSliceConfig ckey, gint64 value); +gint64 g_slice_get_config (GSliceConfig ckey); +gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values); + +G_END_DECLS + +#endif /* __G_SLICE_H__ */ diff --git a/glib/gslist.c b/glib/gslist.c new file mode 100644 index 0000000..5dcbc7f --- /dev/null +++ b/glib/gslist.c @@ -0,0 +1,1061 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: linked_lists_single + * @title: Singly-Linked Lists + * @short_description: linked lists containing integer values or + * pointers to data, limited to iterating over the + * list in one direction + * + * The #GSList structure and its associated functions provide a + * standard singly-linked list data structure. + * + * Each element in the list contains a piece of data, together with a + * pointer which links to the next element in the list. Using this + * pointer it is possible to move through the list in one direction + * only (unlike the Doubly-Linked Lists which + * allow movement in both directions). + * + * The data contained in each element can be either integer values, by + * using one of the Type + * Conversion Macros, or simply pointers to any type of data. + * + * List elements are allocated from the slice allocator, which is more + * efficient than allocating elements individually. + * + * Note that most of the #GSList functions expect to be passed a + * pointer to the first element in the list. The functions which insert + * elements return the new start of the list, which may have changed. + * + * There is no function to create a #GSList. %NULL is considered to be + * the empty list so you simply set a #GSList* to %NULL. + * + * To add elements, use g_slist_append(), g_slist_prepend(), + * g_slist_insert() and g_slist_insert_sorted(). + * + * To remove elements, use g_slist_remove(). + * + * To find elements in the list use g_slist_last(), g_slist_next(), + * g_slist_nth(), g_slist_nth_data(), g_slist_find() and + * g_slist_find_custom(). + * + * To find the index of an element use g_slist_position() and + * g_slist_index(). + * + * To call a function for each element in the list use + * g_slist_foreach(). + * + * To free the entire list, use g_slist_free(). + **/ + +/** + * GSList: + * @data: holds the element's data, which can be a pointer to any kind + * of data, or any integer value using the Type Conversion + * Macros. + * @next: contains the link to the next element in the list. + * + * The #GSList struct is used for each element in the singly-linked + * list. + **/ + +/** + * g_slist_next: + * @slist: an element in a #GSList. + * @Returns: the next element, or %NULL if there are no more elements. + * + * A convenience macro to get the next element in a #GSList. + **/ + + +/** + * g_slist_push_allocator: + * @dummy: the #GAllocator to use when allocating #GSList elements. + * + * Sets the allocator to use to allocate #GSList elements. Use + * g_slist_pop_allocator() to restore the previous allocator. + * + * Note that this function is not available if GLib has been compiled + * with + * + * Deprecated: 2.10: It does nothing, since #GSList has been converted + * to the slice + * allocator + **/ +void g_slist_push_allocator (gpointer dummy) { /* present for binary compat only */ } + +/** + * g_slist_pop_allocator: + * + * Restores the previous #GAllocator, used when allocating #GSList + * elements. + * + * Note that this function is not available if GLib has been compiled + * with + * + * Deprecated: 2.10: It does nothing, since #GSList has been converted + * to the slice + * allocator + **/ +void g_slist_pop_allocator (void) { /* present for binary compat only */ } + +#define _g_slist_alloc0() g_slice_new0 (GSList) +#define _g_slist_alloc() g_slice_new (GSList) +#define _g_slist_free1(slist) g_slice_free (GSList, slist) + +/** + * g_slist_alloc: + * @Returns: a pointer to the newly-allocated #GSList element. + * + * Allocates space for one #GSList element. It is called by the + * g_slist_append(), g_slist_prepend(), g_slist_insert() and + * g_slist_insert_sorted() functions and so is rarely used on its own. + **/ +GSList* +g_slist_alloc (void) +{ + return _g_slist_alloc0 (); +} + +/** + * g_slist_free: + * @list: a #GSList + * + * Frees all of the memory used by a #GSList. + * The freed elements are returned to the slice allocator. + */ +void +g_slist_free (GSList *list) +{ + g_slice_free_chain (GSList, list, next); +} + +/** + * g_slist_free_1: + * @list: a #GSList element + * + * Frees one #GSList element. + * It is usually used after g_slist_remove_link(). + */ +/** + * g_slist_free1: + * + * A macro which does the same as g_slist_free_1(). + * + * Since: 2.10 + **/ +void +g_slist_free_1 (GSList *list) +{ + _g_slist_free1 (list); +} + +/** + * g_slist_append: + * @list: a #GSList + * @data: the data for the new element + * + * Adds a new element on to the end of the list. + * + * + * The return value is the new start of the list, which may + * have changed, so make sure you store the new value. + * + * + * + * Note that g_slist_append() has to traverse the entire list + * to find the end, which is inefficient when adding multiple + * elements. A common idiom to avoid the inefficiency is to prepend + * the elements and reverse the list when all elements have been added. + * + * + * |[ + * /* Notice that these are initialized to the empty list. */ + * GSList *list = NULL, *number_list = NULL; + * + * /* This is a list of strings. */ + * list = g_slist_append (list, "first"); + * list = g_slist_append (list, "second"); + * + * /* This is a list of integers. */ + * number_list = g_slist_append (number_list, GINT_TO_POINTER (27)); + * number_list = g_slist_append (number_list, GINT_TO_POINTER (14)); + * ]| + * + * Returns: the new start of the #GSList + */ +GSList* +g_slist_append (GSList *list, + gpointer data) +{ + GSList *new_list; + GSList *last; + + new_list = _g_slist_alloc (); + new_list->data = data; + new_list->next = NULL; + + if (list) + { + last = g_slist_last (list); + /* g_assert (last != NULL); */ + last->next = new_list; + + return list; + } + else + return new_list; +} + +/** + * g_slist_prepend: + * @list: a #GSList + * @data: the data for the new element + * + * Adds a new element on to the start of the list. + * + * + * The return value is the new start of the list, which + * may have changed, so make sure you store the new value. + * + * + * |[ + * /* Notice that it is initialized to the empty list. */ + * GSList *list = NULL; + * list = g_slist_prepend (list, "last"); + * list = g_slist_prepend (list, "first"); + * ]| + * + * Returns: the new start of the #GSList + */ +GSList* +g_slist_prepend (GSList *list, + gpointer data) +{ + GSList *new_list; + + new_list = _g_slist_alloc (); + new_list->data = data; + new_list->next = list; + + return new_list; +} + +/** + * g_slist_insert: + * @list: a #GSList + * @data: the data for the new element + * @position: the position to insert the element. + * If this is negative, or is larger than the number + * of elements in the list, the new element is added on + * to the end of the list. + * + * Inserts a new element into the list at the given position. + * + * Returns: the new start of the #GSList + */ +GSList* +g_slist_insert (GSList *list, + gpointer data, + gint position) +{ + GSList *prev_list; + GSList *tmp_list; + GSList *new_list; + + if (position < 0) + return g_slist_append (list, data); + else if (position == 0) + return g_slist_prepend (list, data); + + new_list = _g_slist_alloc (); + new_list->data = data; + + if (!list) + { + new_list->next = NULL; + return new_list; + } + + prev_list = NULL; + tmp_list = list; + + while ((position-- > 0) && tmp_list) + { + prev_list = tmp_list; + tmp_list = tmp_list->next; + } + + if (prev_list) + { + new_list->next = prev_list->next; + prev_list->next = new_list; + } + else + { + new_list->next = list; + list = new_list; + } + + return list; +} + +/** + * g_slist_insert_before: + * @slist: a #GSList + * @sibling: node to insert @data before + * @data: data to put in the newly-inserted node + * + * Inserts a node before @sibling containing @data. + * + * Returns: the new head of the list. + */ +GSList* +g_slist_insert_before (GSList *slist, + GSList *sibling, + gpointer data) +{ + if (!slist) + { + slist = _g_slist_alloc (); + slist->data = data; + slist->next = NULL; + g_return_val_if_fail (sibling == NULL, slist); + return slist; + } + else + { + GSList *node, *last = NULL; + + for (node = slist; node; last = node, node = last->next) + if (node == sibling) + break; + if (!last) + { + node = _g_slist_alloc (); + node->data = data; + node->next = slist; + + return node; + } + else + { + node = _g_slist_alloc (); + node->data = data; + node->next = last->next; + last->next = node; + + return slist; + } + } +} + +/** + * g_slist_concat: + * @list1: a #GSList + * @list2: the #GSList to add to the end of the first #GSList + * + * Adds the second #GSList onto the end of the first #GSList. + * Note that the elements of the second #GSList are not copied. + * They are used directly. + * + * Returns: the start of the new #GSList + */ +GSList * +g_slist_concat (GSList *list1, GSList *list2) +{ + if (list2) + { + if (list1) + g_slist_last (list1)->next = list2; + else + list1 = list2; + } + + return list1; +} + +/** + * g_slist_remove: + * @list: a #GSList + * @data: the data of the element to remove + * + * Removes an element from a #GSList. + * If two elements contain the same data, only the first is removed. + * If none of the elements contain the data, the #GSList is unchanged. + * + * Returns: the new start of the #GSList + */ +GSList* +g_slist_remove (GSList *list, + gconstpointer data) +{ + GSList *tmp, *prev = NULL; + + tmp = list; + while (tmp) + { + if (tmp->data == data) + { + if (prev) + prev->next = tmp->next; + else + list = tmp->next; + + g_slist_free_1 (tmp); + break; + } + prev = tmp; + tmp = prev->next; + } + + return list; +} + +/** + * g_slist_remove_all: + * @list: a #GSList + * @data: data to remove + * + * Removes all list nodes with data equal to @data. + * Returns the new head of the list. Contrast with + * g_slist_remove() which removes only the first node + * matching the given data. + * + * Returns: new head of @list + */ +GSList* +g_slist_remove_all (GSList *list, + gconstpointer data) +{ + GSList *tmp, *prev = NULL; + + tmp = list; + while (tmp) + { + if (tmp->data == data) + { + GSList *next = tmp->next; + + if (prev) + prev->next = next; + else + list = next; + + g_slist_free_1 (tmp); + tmp = next; + } + else + { + prev = tmp; + tmp = prev->next; + } + } + + return list; +} + +static inline GSList* +_g_slist_remove_link (GSList *list, + GSList *link) +{ + GSList *tmp; + GSList *prev; + + prev = NULL; + tmp = list; + + while (tmp) + { + if (tmp == link) + { + if (prev) + prev->next = tmp->next; + if (list == tmp) + list = list->next; + + tmp->next = NULL; + break; + } + + prev = tmp; + tmp = tmp->next; + } + + return list; +} + +/** + * g_slist_remove_link: + * @list: a #GSList + * @link_: an element in the #GSList + * + * Removes an element from a #GSList, without + * freeing the element. The removed element's next + * link is set to %NULL, so that it becomes a + * self-contained list with one element. + * + * Returns: the new start of the #GSList, without the element + */ +GSList* +g_slist_remove_link (GSList *list, + GSList *link_) +{ + return _g_slist_remove_link (list, link_); +} + +/** + * g_slist_delete_link: + * @list: a #GSList + * @link_: node to delete + * + * Removes the node link_ from the list and frees it. + * Compare this to g_slist_remove_link() which removes the node + * without freeing it. + * + * Returns: the new head of @list + */ +GSList* +g_slist_delete_link (GSList *list, + GSList *link_) +{ + list = _g_slist_remove_link (list, link_); + _g_slist_free1 (link_); + + return list; +} + +/** + * g_slist_copy: + * @list: a #GSList + * + * Copies a #GSList. + * + * + * Note that this is a "shallow" copy. If the list elements + * consist of pointers to data, the pointers are copied but + * the actual data isn't. + * + * + * Returns: a copy of @list + */ +GSList* +g_slist_copy (GSList *list) +{ + GSList *new_list = NULL; + + if (list) + { + GSList *last; + + new_list = _g_slist_alloc (); + new_list->data = list->data; + last = new_list; + list = list->next; + while (list) + { + last->next = _g_slist_alloc (); + last = last->next; + last->data = list->data; + list = list->next; + } + last->next = NULL; + } + + return new_list; +} + +/** + * g_slist_reverse: + * @list: a #GSList + * + * Reverses a #GSList. + * + * Returns: the start of the reversed #GSList + */ +GSList* +g_slist_reverse (GSList *list) +{ + GSList *prev = NULL; + + while (list) + { + GSList *next = list->next; + + list->next = prev; + + prev = list; + list = next; + } + + return prev; +} + +/** + * g_slist_nth: + * @list: a #GSList + * @n: the position of the element, counting from 0 + * + * Gets the element at the given position in a #GSList. + * + * Returns: the element, or %NULL if the position is off + * the end of the #GSList + */ +GSList* +g_slist_nth (GSList *list, + guint n) +{ + while (n-- > 0 && list) + list = list->next; + + return list; +} + +/** + * g_slist_nth_data: + * @list: a #GSList + * @n: the position of the element + * + * Gets the data of the element at the given position. + * + * Returns: the element's data, or %NULL if the position + * is off the end of the #GSList + */ +gpointer +g_slist_nth_data (GSList *list, + guint n) +{ + while (n-- > 0 && list) + list = list->next; + + return list ? list->data : NULL; +} + +/** + * g_slist_find: + * @list: a #GSList + * @data: the element data to find + * + * Finds the element in a #GSList which + * contains the given data. + * + * Returns: the found #GSList element, + * or %NULL if it is not found + */ +GSList* +g_slist_find (GSList *list, + gconstpointer data) +{ + while (list) + { + if (list->data == data) + break; + list = list->next; + } + + return list; +} + + +/** + * g_slist_find_custom: + * @list: a #GSList + * @data: user data passed to the function + * @func: the function to call for each element. + * It should return 0 when the desired element is found + * + * Finds an element in a #GSList, using a supplied function to + * find the desired element. It iterates over the list, calling + * the given function which should return 0 when the desired + * element is found. The function takes two #gconstpointer arguments, + * the #GSList element's data as the first argument and the + * given user data. + * + * Returns: the found #GSList element, or %NULL if it is not found + */ +GSList* +g_slist_find_custom (GSList *list, + gconstpointer data, + GCompareFunc func) +{ + g_return_val_if_fail (func != NULL, list); + + while (list) + { + if (! func (list->data, data)) + return list; + list = list->next; + } + + return NULL; +} + +/** + * g_slist_position: + * @list: a #GSList + * @llink: an element in the #GSList + * + * Gets the position of the given element + * in the #GSList (starting from 0). + * + * Returns: the position of the element in the #GSList, + * or -1 if the element is not found + */ +gint +g_slist_position (GSList *list, + GSList *llink) +{ + gint i; + + i = 0; + while (list) + { + if (list == llink) + return i; + i++; + list = list->next; + } + + return -1; +} + +/** + * g_slist_index: + * @list: a #GSList + * @data: the data to find + * + * Gets the position of the element containing + * the given data (starting from 0). + * + * Returns: the index of the element containing the data, + * or -1 if the data is not found + */ +gint +g_slist_index (GSList *list, + gconstpointer data) +{ + gint i; + + i = 0; + while (list) + { + if (list->data == data) + return i; + i++; + list = list->next; + } + + return -1; +} + +/** + * g_slist_last: + * @list: a #GSList + * + * Gets the last element in a #GSList. + * + * + * This function iterates over the whole list. + * + * + * Returns: the last element in the #GSList, + * or %NULL if the #GSList has no elements + */ +GSList* +g_slist_last (GSList *list) +{ + if (list) + { + while (list->next) + list = list->next; + } + + return list; +} + +/** + * g_slist_length: + * @list: a #GSList + * + * Gets the number of elements in a #GSList. + * + * + * This function iterates over the whole list to + * count its elements. + * + * + * Returns: the number of elements in the #GSList + */ +guint +g_slist_length (GSList *list) +{ + guint length; + + length = 0; + while (list) + { + length++; + list = list->next; + } + + return length; +} + +/** + * g_slist_foreach: + * @list: a #GSList + * @func: the function to call with each element's data + * @user_data: user data to pass to the function + * + * Calls a function for each element of a #GSList. + */ +void +g_slist_foreach (GSList *list, + GFunc func, + gpointer user_data) +{ + while (list) + { + GSList *next = list->next; + (*func) (list->data, user_data); + list = next; + } +} + +static GSList* +g_slist_insert_sorted_real (GSList *list, + gpointer data, + GFunc func, + gpointer user_data) +{ + GSList *tmp_list = list; + GSList *prev_list = NULL; + GSList *new_list; + gint cmp; + + g_return_val_if_fail (func != NULL, list); + + if (!list) + { + new_list = _g_slist_alloc (); + new_list->data = data; + new_list->next = NULL; + return new_list; + } + + cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); + + while ((tmp_list->next) && (cmp > 0)) + { + prev_list = tmp_list; + tmp_list = tmp_list->next; + + cmp = ((GCompareDataFunc) func) (data, tmp_list->data, user_data); + } + + new_list = _g_slist_alloc (); + new_list->data = data; + + if ((!tmp_list->next) && (cmp > 0)) + { + tmp_list->next = new_list; + new_list->next = NULL; + return list; + } + + if (prev_list) + { + prev_list->next = new_list; + new_list->next = tmp_list; + return list; + } + else + { + new_list->next = list; + return new_list; + } +} + +/** + * g_slist_insert_sorted: + * @list: a #GSList + * @data: the data for the new element + * @func: the function to compare elements in the list. + * It should return a number > 0 if the first parameter + * comes after the second parameter in the sort order. + * + * Inserts a new element into the list, using the given + * comparison function to determine its position. + * + * Returns: the new start of the #GSList + */ +GSList* +g_slist_insert_sorted (GSList *list, + gpointer data, + GCompareFunc func) +{ + return g_slist_insert_sorted_real (list, data, (GFunc) func, NULL); +} + +/** + * g_slist_insert_sorted_with_data: + * @list: a #GSList + * @data: the data for the new element + * @func: the function to compare elements in the list. + * It should return a number > 0 if the first parameter + * comes after the second parameter in the sort order. + * @user_data: data to pass to comparison function + * + * Inserts a new element into the list, using the given + * comparison function to determine its position. + * + * Returns: the new start of the #GSList + * + * Since: 2.10 + */ +GSList* +g_slist_insert_sorted_with_data (GSList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data) +{ + return g_slist_insert_sorted_real (list, data, (GFunc) func, user_data); +} + +static GSList * +g_slist_sort_merge (GSList *l1, + GSList *l2, + GFunc compare_func, + gpointer user_data) +{ + GSList list, *l; + gint cmp; + + l=&list; + + while (l1 && l2) + { + cmp = ((GCompareDataFunc) compare_func) (l1->data, l2->data, user_data); + + if (cmp <= 0) + { + l=l->next=l1; + l1=l1->next; + } + else + { + l=l->next=l2; + l2=l2->next; + } + } + l->next= l1 ? l1 : l2; + + return list.next; +} + +static GSList * +g_slist_sort_real (GSList *list, + GFunc compare_func, + gpointer user_data) +{ + GSList *l1, *l2; + + if (!list) + return NULL; + if (!list->next) + return list; + + l1 = list; + l2 = list->next; + + while ((l2 = l2->next) != NULL) + { + if ((l2 = l2->next) == NULL) + break; + l1=l1->next; + } + l2 = l1->next; + l1->next = NULL; + + return g_slist_sort_merge (g_slist_sort_real (list, compare_func, user_data), + g_slist_sort_real (l2, compare_func, user_data), + compare_func, + user_data); +} + +/** + * g_slist_sort: + * @list: a #GSList + * @compare_func: the comparison function used to sort the #GSList. + * This function is passed the data from 2 elements of the #GSList + * and should return 0 if they are equal, a negative value if the + * first element comes before the second, or a positive value if + * the first element comes after the second. + * + * Sorts a #GSList using the given comparison function. + * + * Returns: the start of the sorted #GSList + */ +GSList * +g_slist_sort (GSList *list, + GCompareFunc compare_func) +{ + return g_slist_sort_real (list, (GFunc) compare_func, NULL); +} + +/** + * g_slist_sort_with_data: + * @list: a #GSList + * @compare_func: comparison function + * @user_data: data to pass to comparison function + * + * Like g_slist_sort(), but the sort function accepts a user data argument. + * + * Returns: new head of the list + */ +GSList * +g_slist_sort_with_data (GSList *list, + GCompareDataFunc compare_func, + gpointer user_data) +{ + return g_slist_sort_real (list, (GFunc) compare_func, user_data); +} + +#define __G_SLIST_C__ +#include "galiasdef.c" diff --git a/glib/gslist.h b/glib/gslist.h new file mode 100644 index 0000000..8b01faf --- /dev/null +++ b/glib/gslist.h @@ -0,0 +1,114 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SLIST_H__ +#define __G_SLIST_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GSList GSList; + +struct _GSList +{ + gpointer data; + GSList *next; +}; + +/* Singly linked lists + */ +GSList* g_slist_alloc (void) G_GNUC_WARN_UNUSED_RESULT; +void g_slist_free (GSList *list); +void g_slist_free_1 (GSList *list); +#define g_slist_free1 g_slist_free_1 +GSList* g_slist_append (GSList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_prepend (GSList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_insert (GSList *list, + gpointer data, + gint position) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_insert_sorted (GSList *list, + gpointer data, + GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_insert_sorted_with_data (GSList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_insert_before (GSList *slist, + GSList *sibling, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_concat (GSList *list1, + GSList *list2) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_remove (GSList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_remove_all (GSList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_remove_link (GSList *list, + GSList *link_) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_delete_link (GSList *list, + GSList *link_) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_reverse (GSList *list) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_copy (GSList *list) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_nth (GSList *list, + guint n); +GSList* g_slist_find (GSList *list, + gconstpointer data); +GSList* g_slist_find_custom (GSList *list, + gconstpointer data, + GCompareFunc func); +gint g_slist_position (GSList *list, + GSList *llink); +gint g_slist_index (GSList *list, + gconstpointer data); +GSList* g_slist_last (GSList *list); +guint g_slist_length (GSList *list); +void g_slist_foreach (GSList *list, + GFunc func, + gpointer user_data); +GSList* g_slist_sort (GSList *list, + GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT; +GSList* g_slist_sort_with_data (GSList *list, + GCompareDataFunc compare_func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +gpointer g_slist_nth_data (GSList *list, + guint n); + +#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) + +#ifndef G_DISABLE_DEPRECATED +void g_slist_push_allocator (gpointer dummy); +void g_slist_pop_allocator (void); +#endif + +G_END_DECLS + +#endif /* __G_SLIST_H__ */ diff --git a/glib/gspawn-win32-helper-console.c b/glib/gspawn-win32-helper-console.c new file mode 100644 index 0000000..dca4499 --- /dev/null +++ b/glib/gspawn-win32-helper-console.c @@ -0,0 +1,2 @@ +#define HELPER_CONSOLE +#include "gspawn-win32-helper.c" diff --git a/glib/gspawn-win32-helper.c b/glib/gspawn-win32-helper.c new file mode 100644 index 0000000..40108bb --- /dev/null +++ b/glib/gspawn-win32-helper.c @@ -0,0 +1,333 @@ +/* gspawn-win32-helper.c - Helper program for process launching on Win32. + * + * Copyright 2000 Red Hat, Inc. + * Copyright 2000 Tor Lillqvist + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#undef G_LOG_DOMAIN +#include "glib.h" +#define GSPAWN_HELPER +#include "gspawn-win32.c" /* For shared definitions */ + + +static void +write_err_and_exit (gint fd, + gintptr msg) +{ + gintptr en = errno; + + write (fd, &msg, sizeof(gintptr)); + write (fd, &en, sizeof(gintptr)); + + _exit (1); +} + +#ifdef __GNUC__ +# ifndef _stdcall +# define _stdcall __attribute__((stdcall)) +# endif +#endif + +/* We build gspawn-win32-helper.exe as a Windows GUI application + * to avoid any temporarily flashing console windows in case + * the gspawn function is invoked by a GUI program. Thus, no main() + * but a WinMain(). We do, however, still use argc and argv tucked + * away in the global __argc and __argv by the C runtime startup code. + */ + +/* Info peeked from mingw runtime's source code. __wgetmainargs() is a + * function to get the program's argv in wide char format. + */ + +typedef struct { + int newmode; +} _startupinfo; + +extern void __wgetmainargs(int *argc, + wchar_t ***wargv, + wchar_t ***wenviron, + int expand_wildcards, + _startupinfo *startupinfo); + +/* Copy of protect_argv that handles wchar_t strings */ + +static gint +protect_wargv (wchar_t **wargv, + wchar_t ***new_wargv) +{ + gint i; + gint argc = 0; + + while (wargv[argc]) + ++argc; + *new_wargv = g_new (wchar_t *, argc+1); + + /* Quote each argv element if necessary, so that it will get + * reconstructed correctly in the C runtime startup code. Note that + * the unquoting algorithm in the C runtime is really weird, and + * rather different than what Unix shells do. See stdargv.c in the C + * runtime sources (in the Platform SDK, in src/crt). + * + * Note that an new_wargv[0] constructed by this function should + * *not* be passed as the filename argument to a _wspawn* or _wexec* + * family function. That argument should be the real file name + * without any quoting. + */ + for (i = 0; i < argc; i++) + { + wchar_t *p = wargv[i]; + wchar_t *q; + gint len = 0; + gboolean need_dblquotes = FALSE; + while (*p) + { + if (*p == ' ' || *p == '\t') + need_dblquotes = TRUE; + else if (*p == '"') + len++; + else if (*p == '\\') + { + wchar_t *pp = p; + while (*pp && *pp == '\\') + pp++; + if (*pp == '"') + len++; + } + len++; + p++; + } + + q = (*new_wargv)[i] = g_new (wchar_t, len + need_dblquotes*2 + 1); + p = wargv[i]; + + if (need_dblquotes) + *q++ = '"'; + + while (*p) + { + if (*p == '"') + *q++ = '\\'; + else if (*p == '\\') + { + wchar_t *pp = p; + while (*pp && *pp == '\\') + pp++; + if (*pp == '"') + *q++ = '\\'; + } + *q++ = *p; + p++; + } + + if (need_dblquotes) + *q++ = '"'; + *q++ = '\0'; + } + (*new_wargv)[argc] = NULL; + + return argc; +} + +#ifndef HELPER_CONSOLE +int _stdcall +WinMain (struct HINSTANCE__ *hInstance, + struct HINSTANCE__ *hPrevInstance, + char *lpszCmdLine, + int nCmdShow) +#else +int +main (int ignored_argc, char **ignored_argv) +#endif +{ + int child_err_report_fd = -1; + int helper_sync_fd = -1; + int i; + int fd; + int mode; + gintptr handle; + int saved_errno; + gintptr no_error = CHILD_NO_ERROR; + gint argv_zero_offset = ARG_PROGRAM; + wchar_t **new_wargv; + int argc; + wchar_t **wargv, **wenvp; + _startupinfo si = { 0 }; + char c; + + g_assert (__argc >= ARG_COUNT); + + /* Fetch the wide-char argument vector */ + __wgetmainargs (&argc, &wargv, &wenvp, 0, &si); + + /* We still have the system codepage args in __argv. We can look + * at the first args in which gspawn-win32.c passes us flags and + * fd numbers in __argv, as we know those are just ASCII anyway. + */ + g_assert (argc == __argc); + + /* argv[ARG_CHILD_ERR_REPORT] is the file descriptor number onto + * which write error messages. + */ + child_err_report_fd = atoi (__argv[ARG_CHILD_ERR_REPORT]); + + /* Hack to implement G_SPAWN_FILE_AND_ARGV_ZERO. If + * argv[ARG_CHILD_ERR_REPORT] is suffixed with a '#' it means we get + * the program to run and its argv[0] separately. + */ + if (__argv[ARG_CHILD_ERR_REPORT][strlen (__argv[ARG_CHILD_ERR_REPORT]) - 1] == '#') + argv_zero_offset++; + + /* argv[ARG_HELPER_SYNC] is the file descriptor number we read a + * byte that tells us it is OK to exit. We have to wait until the + * parent allows us to exit, so that the parent has had time to + * duplicate the process handle we sent it. Duplicating a handle + * from another process works only if that other process exists. + */ + helper_sync_fd = atoi (__argv[ARG_HELPER_SYNC]); + + /* argv[ARG_STDIN..ARG_STDERR] are the file descriptor numbers that + * should be dup2'd to 0, 1 and 2. '-' if the corresponding fd + * should be left alone, and 'z' if it should be connected to the + * bit bucket NUL:. + */ + if (__argv[ARG_STDIN][0] == '-') + ; /* Nothing */ + else if (__argv[ARG_STDIN][0] == 'z') + { + fd = open ("NUL:", O_RDONLY); + if (fd != 0) + { + dup2 (fd, 0); + close (fd); + } + } + else + { + fd = atoi (__argv[ARG_STDIN]); + if (fd != 0) + { + dup2 (fd, 0); + close (fd); + } + } + + if (__argv[ARG_STDOUT][0] == '-') + ; /* Nothing */ + else if (__argv[ARG_STDOUT][0] == 'z') + { + fd = open ("NUL:", O_WRONLY); + if (fd != 1) + { + dup2 (fd, 1); + close (fd); + } + } + else + { + fd = atoi (__argv[ARG_STDOUT]); + if (fd != 1) + { + dup2 (fd, 1); + close (fd); + } + } + + if (__argv[ARG_STDERR][0] == '-') + ; /* Nothing */ + else if (__argv[ARG_STDERR][0] == 'z') + { + fd = open ("NUL:", O_WRONLY); + if (fd != 2) + { + dup2 (fd, 2); + close (fd); + } + } + else + { + fd = atoi (__argv[ARG_STDERR]); + if (fd != 2) + { + dup2 (fd, 2); + close (fd); + } + } + + /* __argv[ARG_WORKING_DIRECTORY] is the directory in which to run the + * process. If "-", don't change directory. + */ + if (__argv[ARG_WORKING_DIRECTORY][0] == '-' && + __argv[ARG_WORKING_DIRECTORY][1] == 0) + ; /* Nothing */ + else if (_wchdir (wargv[ARG_WORKING_DIRECTORY]) < 0) + write_err_and_exit (child_err_report_fd, CHILD_CHDIR_FAILED); + + /* __argv[ARG_CLOSE_DESCRIPTORS] is "y" if file descriptors from 3 + * upwards should be closed + */ + if (__argv[ARG_CLOSE_DESCRIPTORS][0] == 'y') + for (i = 3; i < 1000; i++) /* FIXME real limit? */ + if (i != child_err_report_fd && i != helper_sync_fd) + close (i); + + /* We don't want our child to inherit the error report and + * helper sync fds. + */ + child_err_report_fd = dup_noninherited (child_err_report_fd, _O_WRONLY); + helper_sync_fd = dup_noninherited (helper_sync_fd, _O_RDONLY); + + /* __argv[ARG_WAIT] is "w" to wait for the program to exit */ + if (__argv[ARG_WAIT][0] == 'w') + mode = P_WAIT; + else + mode = P_NOWAIT; + + /* __argv[ARG_USE_PATH] is "y" to use PATH, otherwise not */ + + /* __argv[ARG_PROGRAM] is executable file to run, + * __argv[argv_zero_offset]... is its argv. argv_zero_offset equals + * ARG_PROGRAM unless G_SPAWN_FILE_AND_ARGV_ZERO was used, in which + * case we have a separate executable name and argv[0]. + */ + + /* For the program name passed to spawnv(), don't use the quoted + * version. + */ + protect_wargv (wargv + argv_zero_offset, &new_wargv); + + if (__argv[ARG_USE_PATH][0] == 'y') + handle = _wspawnvp (mode, wargv[ARG_PROGRAM], (const wchar_t **) new_wargv); + else + handle = _wspawnv (mode, wargv[ARG_PROGRAM], (const wchar_t **) new_wargv); + + saved_errno = errno; + + if (handle == -1 && saved_errno != 0) + write_err_and_exit (child_err_report_fd, CHILD_SPAWN_FAILED); + + write (child_err_report_fd, &no_error, sizeof (no_error)); + write (child_err_report_fd, &handle, sizeof (handle)); + + read (helper_sync_fd, &c, 1); + + return 0; +} diff --git a/glib/gspawn-win32.c b/glib/gspawn-win32.c new file mode 100644 index 0000000..dc48a25 --- /dev/null +++ b/glib/gspawn-win32.c @@ -0,0 +1,1497 @@ +/* gspawn-win32.c - Process launching on Win32 + * + * Copyright 2000 Red Hat, Inc. + * Copyright 2003 Tor Lillqvist + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Implementation details on Win32. + * + * - There is no way to set the no-inherit flag for + * a "file descriptor" in the MS C runtime. The flag is there, + * and the dospawn() function uses it, but unfortunately + * this flag can only be set when opening the file. + * - As there is no fork(), we cannot reliably change directory + * before starting the child process. (There might be several threads + * running, and the current directory is common for all threads.) + * + * Thus, we must in many cases use a helper program to handle closing + * of (inherited) file descriptors and changing of directory. The + * helper process is also needed if the standard input, standard + * output, or standard error of the process to be run are supposed to + * be redirected somewhere. + * + * The structure of the source code in this file is a mess, I know. + */ + +/* Define this to get some logging all the time */ +/* #define G_SPAWN_WIN32_DEBUG */ + +#include "config.h" + +#include "glib.h" +#include "gprintfint.h" +#include "glibintl.h" +#include "galias.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef G_SPAWN_WIN32_DEBUG + static int debug = 1; + #define SETUP_DEBUG() /* empty */ +#else + static int debug = -1; + #define SETUP_DEBUG() \ + G_STMT_START \ + { \ + if (debug == -1) \ + { \ + if (getenv ("G_SPAWN_WIN32_DEBUG") != NULL) \ + debug = 1; \ + else \ + debug = 0; \ + } \ + } \ + G_STMT_END +#endif + +enum +{ + CHILD_NO_ERROR, + CHILD_CHDIR_FAILED, + CHILD_SPAWN_FAILED, +}; + +enum { + ARG_CHILD_ERR_REPORT = 1, + ARG_HELPER_SYNC, + ARG_STDIN, + ARG_STDOUT, + ARG_STDERR, + ARG_WORKING_DIRECTORY, + ARG_CLOSE_DESCRIPTORS, + ARG_USE_PATH, + ARG_WAIT, + ARG_PROGRAM, + ARG_COUNT = ARG_PROGRAM +}; + +static int +dup_noninherited (int fd, + int mode) +{ + HANDLE filehandle; + + DuplicateHandle (GetCurrentProcess (), (LPHANDLE) _get_osfhandle (fd), + GetCurrentProcess (), &filehandle, + 0, FALSE, DUPLICATE_SAME_ACCESS); + close (fd); + return _open_osfhandle ((gintptr) filehandle, mode | _O_NOINHERIT); +} + +#ifndef GSPAWN_HELPER + +#ifdef _WIN64 +#define HELPER_PROCESS "gspawn-win64-helper" +#else +#define HELPER_PROCESS "gspawn-win32-helper" +#endif + +static gchar * +protect_argv_string (const gchar *string) +{ + const gchar *p = string; + gchar *retval, *q; + gint len = 0; + gboolean need_dblquotes = FALSE; + while (*p) + { + if (*p == ' ' || *p == '\t') + need_dblquotes = TRUE; + else if (*p == '"') + len++; + else if (*p == '\\') + { + const gchar *pp = p; + while (*pp && *pp == '\\') + pp++; + if (*pp == '"') + len++; + } + len++; + p++; + } + + q = retval = g_malloc (len + need_dblquotes*2 + 1); + p = string; + + if (need_dblquotes) + *q++ = '"'; + + while (*p) + { + if (*p == '"') + *q++ = '\\'; + else if (*p == '\\') + { + const gchar *pp = p; + while (*pp && *pp == '\\') + pp++; + if (*pp == '"') + *q++ = '\\'; + } + *q++ = *p; + p++; + } + + if (need_dblquotes) + *q++ = '"'; + *q++ = '\0'; + + return retval; +} + +static gint +protect_argv (gchar **argv, + gchar ***new_argv) +{ + gint i; + gint argc = 0; + + while (argv[argc]) + ++argc; + *new_argv = g_new (gchar *, argc+1); + + /* Quote each argv element if necessary, so that it will get + * reconstructed correctly in the C runtime startup code. Note that + * the unquoting algorithm in the C runtime is really weird, and + * rather different than what Unix shells do. See stdargv.c in the C + * runtime sources (in the Platform SDK, in src/crt). + * + * Note that an new_argv[0] constructed by this function should + * *not* be passed as the filename argument to a spawn* or exec* + * family function. That argument should be the real file name + * without any quoting. + */ + for (i = 0; i < argc; i++) + (*new_argv)[i] = protect_argv_string (argv[i]); + + (*new_argv)[argc] = NULL; + + return argc; +} + +GQuark +g_spawn_error_quark (void) +{ + return g_quark_from_static_string ("g-exec-error-quark"); +} + +gboolean +g_spawn_async_utf8 (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_handle, + GError **error) +{ + g_return_val_if_fail (argv != NULL, FALSE); + + return g_spawn_async_with_pipes_utf8 (working_directory, + argv, envp, + flags, + child_setup, + user_data, + child_handle, + NULL, NULL, NULL, + error); +} + +/* Avoids a danger in threaded situations (calling close() + * on a file descriptor twice, and another thread has + * re-opened it since the first close) + */ +static void +close_and_invalidate (gint *fd) +{ + if (*fd < 0) + return; + + close (*fd); + *fd = -1; +} + +typedef enum +{ + READ_FAILED = 0, /* FALSE */ + READ_OK, + READ_EOF +} ReadResult; + +static ReadResult +read_data (GString *str, + GIOChannel *iochannel, + GError **error) +{ + GIOStatus giostatus; + gsize bytes; + gchar buf[4096]; + + again: + + giostatus = g_io_channel_read_chars (iochannel, buf, sizeof (buf), &bytes, NULL); + + if (bytes == 0) + return READ_EOF; + else if (bytes > 0) + { + g_string_append_len (str, buf, bytes); + return READ_OK; + } + else if (giostatus == G_IO_STATUS_AGAIN) + goto again; + else if (giostatus == G_IO_STATUS_ERROR) + { + g_set_error_literal (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, + _("Failed to read data from child process")); + + return READ_FAILED; + } + else + return READ_OK; +} + +static gboolean +make_pipe (gint p[2], + GError **error) +{ + if (_pipe (p, 4096, _O_BINARY) < 0) + { + int errsv = errno; + + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Failed to create pipe for communicating with child process (%s)"), + g_strerror (errsv)); + return FALSE; + } + else + return TRUE; +} + +/* The helper process writes a status report back to us, through a + * pipe, consisting of two ints. + */ +static gboolean +read_helper_report (int fd, + gintptr report[2], + GError **error) +{ + gint bytes = 0; + + while (bytes < sizeof(gintptr)*2) + { + gint chunk; + + if (debug) + g_print ("%s:read_helper_report: read %" G_GSIZE_FORMAT "...\n", + __FILE__, + sizeof(gintptr)*2 - bytes); + + chunk = read (fd, ((gchar*)report) + bytes, + sizeof(gintptr)*2 - bytes); + + if (debug) + g_print ("...got %d bytes\n", chunk); + + if (chunk < 0) + { + int errsv = errno; + + /* Some weird shit happened, bail out */ + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Failed to read from child pipe (%s)"), + g_strerror (errsv)); + + return FALSE; + } + else if (chunk == 0) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Failed to read from child pipe (%s)"), + "EOF"); + break; /* EOF */ + } + else + bytes += chunk; + } + + if (bytes < sizeof(gintptr)*2) + return FALSE; + + return TRUE; +} + +static void +set_child_error (gintptr report[2], + const gchar *working_directory, + GError **error) +{ + switch (report[0]) + { + case CHILD_CHDIR_FAILED: + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, + _("Failed to change to directory '%s' (%s)"), + working_directory, + g_strerror (report[1])); + break; + case CHILD_SPAWN_FAILED: + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Failed to execute child process (%s)"), + g_strerror (report[1])); + break; + default: + g_assert_not_reached (); + } +} + +static gboolean +utf8_charv_to_wcharv (char **utf8_charv, + wchar_t ***wcharv, + int *error_index, + GError **error) +{ + wchar_t **retval = NULL; + + *wcharv = NULL; + if (utf8_charv != NULL) + { + int n = 0, i; + + while (utf8_charv[n]) + n++; + retval = g_new (wchar_t *, n + 1); + + for (i = 0; i < n; i++) + { + retval[i] = g_utf8_to_utf16 (utf8_charv[i], -1, NULL, NULL, error); + if (retval[i] == NULL) + { + if (error_index) + *error_index = i; + while (i) + g_free (retval[--i]); + g_free (retval); + return FALSE; + } + } + + retval[n] = NULL; + } + *wcharv = retval; + return TRUE; +} + +static gboolean +do_spawn_directly (gint *exit_status, + gboolean do_return_handle, + GSpawnFlags flags, + gchar **argv, + char **envp, + char **protected_argv, + GPid *child_handle, + GError **error) +{ + const int mode = (exit_status == NULL) ? P_NOWAIT : P_WAIT; + char **new_argv; + gintptr rc = -1; + int saved_errno; + GError *conv_error = NULL; + gint conv_error_index; + wchar_t *wargv0, **wargv, **wenvp; + + new_argv = (flags & G_SPAWN_FILE_AND_ARGV_ZERO) ? protected_argv + 1 : protected_argv; + + wargv0 = g_utf8_to_utf16 (argv[0], -1, NULL, NULL, &conv_error); + if (wargv0 == NULL) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid program name: %s"), + conv_error->message); + g_error_free (conv_error); + + return FALSE; + } + + if (!utf8_charv_to_wcharv (new_argv, &wargv, &conv_error_index, &conv_error)) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid string in argument vector at %d: %s"), + conv_error_index, conv_error->message); + g_error_free (conv_error); + g_free (wargv0); + + return FALSE; + } + + if (!utf8_charv_to_wcharv (envp, &wenvp, NULL, &conv_error)) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid string in environment: %s"), + conv_error->message); + g_error_free (conv_error); + g_free (wargv0); + g_strfreev ((gchar **) wargv); + + return FALSE; + } + + if (flags & G_SPAWN_SEARCH_PATH) + if (wenvp != NULL) + rc = _wspawnvpe (mode, wargv0, (const wchar_t **) wargv, (const wchar_t **) wenvp); + else + rc = _wspawnvp (mode, wargv0, (const wchar_t **) wargv); + else + if (wenvp != NULL) + rc = _wspawnve (mode, wargv0, (const wchar_t **) wargv, (const wchar_t **) wenvp); + else + rc = _wspawnv (mode, wargv0, (const wchar_t **) wargv); + + g_free (wargv0); + g_strfreev ((gchar **) wargv); + g_strfreev ((gchar **) wenvp); + + saved_errno = errno; + + if (rc == -1 && saved_errno != 0) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Failed to execute child process (%s)"), + g_strerror (saved_errno)); + return FALSE; + } + + if (exit_status == NULL) + { + if (child_handle && do_return_handle) + *child_handle = (GPid) rc; + else + { + CloseHandle ((HANDLE) rc); + if (child_handle) + *child_handle = 0; + } + } + else + *exit_status = rc; + + return TRUE; +} + +static gboolean +do_spawn_with_pipes (gint *exit_status, + gboolean do_return_handle, + const gchar *working_directory, + gchar **argv, + char **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + GPid *child_handle, + gint *standard_input, + gint *standard_output, + gint *standard_error, + gint *err_report, + GError **error) +{ + char **protected_argv; + char args[ARG_COUNT][10]; + char **new_argv; + int i; + gintptr rc = -1; + int saved_errno; + int argc; + int stdin_pipe[2] = { -1, -1 }; + int stdout_pipe[2] = { -1, -1 }; + int stderr_pipe[2] = { -1, -1 }; + int child_err_report_pipe[2] = { -1, -1 }; + int helper_sync_pipe[2] = { -1, -1 }; + gintptr helper_report[2]; + static gboolean warned_about_child_setup = FALSE; + GError *conv_error = NULL; + gint conv_error_index; + gchar *helper_process; + CONSOLE_CURSOR_INFO cursor_info; + wchar_t *whelper, **wargv, **wenvp; + extern gchar *_glib_get_dll_directory (void); + gchar *glib_dll_directory; + + if (child_setup && !warned_about_child_setup) + { + warned_about_child_setup = TRUE; + g_warning ("passing a child setup function to the g_spawn functions is pointless on Windows and it is ignored"); + } + + argc = protect_argv (argv, &protected_argv); + + if (!standard_input && !standard_output && !standard_error && + (flags & G_SPAWN_CHILD_INHERITS_STDIN) && + !(flags & G_SPAWN_STDOUT_TO_DEV_NULL) && + !(flags & G_SPAWN_STDERR_TO_DEV_NULL) && + (working_directory == NULL || !*working_directory) && + (flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN)) + { + /* We can do without the helper process */ + gboolean retval = + do_spawn_directly (exit_status, do_return_handle, flags, + argv, envp, protected_argv, + child_handle, error); + g_strfreev (protected_argv); + return retval; + } + + if (standard_input && !make_pipe (stdin_pipe, error)) + goto cleanup_and_fail; + + if (standard_output && !make_pipe (stdout_pipe, error)) + goto cleanup_and_fail; + + if (standard_error && !make_pipe (stderr_pipe, error)) + goto cleanup_and_fail; + + if (!make_pipe (child_err_report_pipe, error)) + goto cleanup_and_fail; + + if (!make_pipe (helper_sync_pipe, error)) + goto cleanup_and_fail; + + new_argv = g_new (char *, argc + 1 + ARG_COUNT); + if (GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info)) + helper_process = HELPER_PROCESS "-console.exe"; + else + helper_process = HELPER_PROCESS ".exe"; + + glib_dll_directory = _glib_get_dll_directory (); + if (glib_dll_directory != NULL) + { + helper_process = g_build_filename (glib_dll_directory, helper_process, NULL); + g_free (glib_dll_directory); + } + else + helper_process = g_strdup (helper_process); + + new_argv[0] = protect_argv_string (helper_process); + + _g_sprintf (args[ARG_CHILD_ERR_REPORT], "%d", child_err_report_pipe[1]); + new_argv[ARG_CHILD_ERR_REPORT] = args[ARG_CHILD_ERR_REPORT]; + + /* Make the read end of the child error report pipe + * noninherited. Otherwise it will needlessly be inherited by the + * helper process, and the started actual user process. As such that + * shouldn't harm, but it is unnecessary. + */ + child_err_report_pipe[0] = dup_noninherited (child_err_report_pipe[0], _O_RDONLY); + + if (flags & G_SPAWN_FILE_AND_ARGV_ZERO) + { + /* Overload ARG_CHILD_ERR_REPORT to also encode the + * G_SPAWN_FILE_AND_ARGV_ZERO functionality. + */ + strcat (args[ARG_CHILD_ERR_REPORT], "#"); + } + + _g_sprintf (args[ARG_HELPER_SYNC], "%d", helper_sync_pipe[0]); + new_argv[ARG_HELPER_SYNC] = args[ARG_HELPER_SYNC]; + + /* Make the write end of the sync pipe noninherited. Otherwise the + * helper process will inherit it, and thus if this process happens + * to crash before writing the sync byte to the pipe, the helper + * process won't read but won't get any EOF either, as it has the + * write end open itself. + */ + helper_sync_pipe[1] = dup_noninherited (helper_sync_pipe[1], _O_WRONLY); + + if (standard_input) + { + _g_sprintf (args[ARG_STDIN], "%d", stdin_pipe[0]); + new_argv[ARG_STDIN] = args[ARG_STDIN]; + } + else if (flags & G_SPAWN_CHILD_INHERITS_STDIN) + { + /* Let stdin be alone */ + new_argv[ARG_STDIN] = "-"; + } + else + { + /* Keep process from blocking on a read of stdin */ + new_argv[ARG_STDIN] = "z"; + } + + if (standard_output) + { + _g_sprintf (args[ARG_STDOUT], "%d", stdout_pipe[1]); + new_argv[ARG_STDOUT] = args[ARG_STDOUT]; + } + else if (flags & G_SPAWN_STDOUT_TO_DEV_NULL) + { + new_argv[ARG_STDOUT] = "z"; + } + else + { + new_argv[ARG_STDOUT] = "-"; + } + + if (standard_error) + { + _g_sprintf (args[ARG_STDERR], "%d", stderr_pipe[1]); + new_argv[ARG_STDERR] = args[ARG_STDERR]; + } + else if (flags & G_SPAWN_STDERR_TO_DEV_NULL) + { + new_argv[ARG_STDERR] = "z"; + } + else + { + new_argv[ARG_STDERR] = "-"; + } + + if (working_directory && *working_directory) + new_argv[ARG_WORKING_DIRECTORY] = protect_argv_string (working_directory); + else + new_argv[ARG_WORKING_DIRECTORY] = g_strdup ("-"); + + if (!(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN)) + new_argv[ARG_CLOSE_DESCRIPTORS] = "y"; + else + new_argv[ARG_CLOSE_DESCRIPTORS] = "-"; + + if (flags & G_SPAWN_SEARCH_PATH) + new_argv[ARG_USE_PATH] = "y"; + else + new_argv[ARG_USE_PATH] = "-"; + + if (exit_status == NULL) + new_argv[ARG_WAIT] = "-"; + else + new_argv[ARG_WAIT] = "w"; + + for (i = 0; i <= argc; i++) + new_argv[ARG_PROGRAM + i] = protected_argv[i]; + + SETUP_DEBUG(); + + if (debug) + { + g_print ("calling %s with argv:\n", helper_process); + for (i = 0; i < argc + 1 + ARG_COUNT; i++) + g_print ("argv[%d]: %s\n", i, (new_argv[i] ? new_argv[i] : "NULL")); + } + + if (!utf8_charv_to_wcharv (new_argv, &wargv, &conv_error_index, &conv_error)) + { + if (conv_error_index == ARG_WORKING_DIRECTORY) + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, + _("Invalid working directory: %s"), + conv_error->message); + else + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid string in argument vector at %d: %s"), + conv_error_index - ARG_PROGRAM, conv_error->message); + g_error_free (conv_error); + g_strfreev (protected_argv); + g_free (new_argv[0]); + g_free (new_argv[ARG_WORKING_DIRECTORY]); + g_free (new_argv); + g_free (helper_process); + + goto cleanup_and_fail; + } + + if (!utf8_charv_to_wcharv (envp, &wenvp, NULL, &conv_error)) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid string in environment: %s"), + conv_error->message); + g_error_free (conv_error); + g_strfreev (protected_argv); + g_free (new_argv[0]); + g_free (new_argv[ARG_WORKING_DIRECTORY]); + g_free (new_argv); + g_free (helper_process); + g_strfreev ((gchar **) wargv); + + goto cleanup_and_fail; + } + + whelper = g_utf8_to_utf16 (helper_process, -1, NULL, NULL, NULL); + g_free (helper_process); + + if (wenvp != NULL) + rc = _wspawnvpe (P_NOWAIT, whelper, (const wchar_t **) wargv, (const wchar_t **) wenvp); + else + rc = _wspawnvp (P_NOWAIT, whelper, (const wchar_t **) wargv); + + saved_errno = errno; + + g_free (whelper); + g_strfreev ((gchar **) wargv); + g_strfreev ((gchar **) wenvp); + + /* Close the other process's ends of the pipes in this process, + * otherwise the reader will never get EOF. + */ + close_and_invalidate (&child_err_report_pipe[1]); + close_and_invalidate (&helper_sync_pipe[0]); + close_and_invalidate (&stdin_pipe[0]); + close_and_invalidate (&stdout_pipe[1]); + close_and_invalidate (&stderr_pipe[1]); + + g_strfreev (protected_argv); + + g_free (new_argv[0]); + g_free (new_argv[ARG_WORKING_DIRECTORY]); + g_free (new_argv); + + /* Check if gspawn-win32-helper couldn't be run */ + if (rc == -1 && saved_errno != 0) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Failed to execute helper program (%s)"), + g_strerror (saved_errno)); + goto cleanup_and_fail; + } + + if (exit_status != NULL) + { + /* Synchronous case. Pass helper's report pipe back to caller, + * which takes care of reading it after the grandchild has + * finished. + */ + g_assert (err_report != NULL); + *err_report = child_err_report_pipe[0]; + write (helper_sync_pipe[1], " ", 1); + close_and_invalidate (&helper_sync_pipe[1]); + } + else + { + /* Asynchronous case. We read the helper's report right away. */ + if (!read_helper_report (child_err_report_pipe[0], helper_report, error)) + goto cleanup_and_fail; + + close_and_invalidate (&child_err_report_pipe[0]); + + switch (helper_report[0]) + { + case CHILD_NO_ERROR: + if (child_handle && do_return_handle) + { + /* rc is our HANDLE for gspawn-win32-helper. It has + * told us the HANDLE of its child. Duplicate that into + * a HANDLE valid in this process. + */ + if (!DuplicateHandle ((HANDLE) rc, (HANDLE) helper_report[1], + GetCurrentProcess (), (LPHANDLE) child_handle, + 0, TRUE, DUPLICATE_SAME_ACCESS)) + { + char *emsg = g_win32_error_message (GetLastError ()); + g_print("%s\n", emsg); + *child_handle = 0; + } + } + else if (child_handle) + *child_handle = 0; + write (helper_sync_pipe[1], " ", 1); + close_and_invalidate (&helper_sync_pipe[1]); + break; + + default: + write (helper_sync_pipe[1], " ", 1); + close_and_invalidate (&helper_sync_pipe[1]); + set_child_error (helper_report, working_directory, error); + goto cleanup_and_fail; + } + } + + /* Success against all odds! return the information */ + + if (standard_input) + *standard_input = stdin_pipe[1]; + if (standard_output) + *standard_output = stdout_pipe[0]; + if (standard_error) + *standard_error = stderr_pipe[0]; + if (rc != -1) + CloseHandle ((HANDLE) rc); + + return TRUE; + + cleanup_and_fail: + + if (rc != -1) + CloseHandle ((HANDLE) rc); + if (child_err_report_pipe[0] != -1) + close (child_err_report_pipe[0]); + if (child_err_report_pipe[1] != -1) + close (child_err_report_pipe[1]); + if (helper_sync_pipe[0] != -1) + close (helper_sync_pipe[0]); + if (helper_sync_pipe[1] != -1) + close (helper_sync_pipe[1]); + if (stdin_pipe[0] != -1) + close (stdin_pipe[0]); + if (stdin_pipe[1] != -1) + close (stdin_pipe[1]); + if (stdout_pipe[0] != -1) + close (stdout_pipe[0]); + if (stdout_pipe[1] != -1) + close (stdout_pipe[1]); + if (stderr_pipe[0] != -1) + close (stderr_pipe[0]); + if (stderr_pipe[1] != -1) + close (stderr_pipe[1]); + + return FALSE; +} + +gboolean +g_spawn_sync_utf8 (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error) +{ + gint outpipe = -1; + gint errpipe = -1; + gint reportpipe = -1; + GIOChannel *outchannel = NULL; + GIOChannel *errchannel = NULL; + GPollFD outfd, errfd; + GPollFD fds[2]; + gint nfds; + gint outindex = -1; + gint errindex = -1; + gint ret; + GString *outstr = NULL; + GString *errstr = NULL; + gboolean failed; + gint status; + + g_return_val_if_fail (argv != NULL, FALSE); + g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); + g_return_val_if_fail (standard_output == NULL || + !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); + g_return_val_if_fail (standard_error == NULL || + !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); + + /* Just to ensure segfaults if callers try to use + * these when an error is reported. + */ + if (standard_output) + *standard_output = NULL; + + if (standard_error) + *standard_error = NULL; + + if (!do_spawn_with_pipes (&status, + FALSE, + working_directory, + argv, + envp, + flags, + child_setup, + NULL, + NULL, + standard_output ? &outpipe : NULL, + standard_error ? &errpipe : NULL, + &reportpipe, + error)) + return FALSE; + + /* Read data from child. */ + + failed = FALSE; + + if (outpipe >= 0) + { + outstr = g_string_new (NULL); + outchannel = g_io_channel_win32_new_fd (outpipe); + g_io_channel_set_encoding (outchannel, NULL, NULL); + g_io_channel_set_buffered (outchannel, FALSE); + g_io_channel_win32_make_pollfd (outchannel, + G_IO_IN | G_IO_ERR | G_IO_HUP, + &outfd); + if (debug) + g_print ("outfd=%p\n", (HANDLE) outfd.fd); + } + + if (errpipe >= 0) + { + errstr = g_string_new (NULL); + errchannel = g_io_channel_win32_new_fd (errpipe); + g_io_channel_set_encoding (errchannel, NULL, NULL); + g_io_channel_set_buffered (errchannel, FALSE); + g_io_channel_win32_make_pollfd (errchannel, + G_IO_IN | G_IO_ERR | G_IO_HUP, + &errfd); + if (debug) + g_print ("errfd=%p\n", (HANDLE) errfd.fd); + } + + /* Read data until we get EOF on all pipes. */ + while (!failed && (outpipe >= 0 || errpipe >= 0)) + { + nfds = 0; + if (outpipe >= 0) + { + fds[nfds] = outfd; + outindex = nfds; + nfds++; + } + if (errpipe >= 0) + { + fds[nfds] = errfd; + errindex = nfds; + nfds++; + } + + if (debug) + g_print ("g_spawn_sync: calling g_io_channel_win32_poll, nfds=%d\n", + nfds); + + ret = g_io_channel_win32_poll (fds, nfds, -1); + + if (ret < 0) + { + failed = TRUE; + + g_set_error_literal (error, G_SPAWN_ERROR, G_SPAWN_ERROR_READ, + _("Unexpected error in g_io_channel_win32_poll() reading data from a child process")); + + break; + } + + if (outpipe >= 0 && (fds[outindex].revents & G_IO_IN)) + { + switch (read_data (outstr, outchannel, error)) + { + case READ_FAILED: + if (debug) + g_print ("g_spawn_sync: outchannel: READ_FAILED\n"); + failed = TRUE; + break; + case READ_EOF: + if (debug) + g_print ("g_spawn_sync: outchannel: READ_EOF\n"); + g_io_channel_unref (outchannel); + outchannel = NULL; + close_and_invalidate (&outpipe); + break; + default: + if (debug) + g_print ("g_spawn_sync: outchannel: OK\n"); + break; + } + + if (failed) + break; + } + + if (errpipe >= 0 && (fds[errindex].revents & G_IO_IN)) + { + switch (read_data (errstr, errchannel, error)) + { + case READ_FAILED: + if (debug) + g_print ("g_spawn_sync: errchannel: READ_FAILED\n"); + failed = TRUE; + break; + case READ_EOF: + if (debug) + g_print ("g_spawn_sync: errchannel: READ_EOF\n"); + g_io_channel_unref (errchannel); + errchannel = NULL; + close_and_invalidate (&errpipe); + break; + default: + if (debug) + g_print ("g_spawn_sync: errchannel: OK\n"); + break; + } + + if (failed) + break; + } + } + + if (reportpipe == -1) + { + /* No helper process, exit status of actual spawned process + * already available. + */ + if (exit_status) + *exit_status = status; + } + else + { + /* Helper process was involved. Read its report now after the + * grandchild has finished. + */ + gintptr helper_report[2]; + + if (!read_helper_report (reportpipe, helper_report, error)) + failed = TRUE; + else + { + switch (helper_report[0]) + { + case CHILD_NO_ERROR: + if (exit_status) + *exit_status = helper_report[1]; + break; + default: + set_child_error (helper_report, working_directory, error); + failed = TRUE; + break; + } + } + close_and_invalidate (&reportpipe); + } + + + /* These should only be open still if we had an error. */ + + if (outchannel != NULL) + g_io_channel_unref (outchannel); + if (errchannel != NULL) + g_io_channel_unref (errchannel); + if (outpipe >= 0) + close_and_invalidate (&outpipe); + if (errpipe >= 0) + close_and_invalidate (&errpipe); + + if (failed) + { + if (outstr) + g_string_free (outstr, TRUE); + if (errstr) + g_string_free (errstr, TRUE); + + return FALSE; + } + else + { + if (standard_output) + *standard_output = g_string_free (outstr, FALSE); + + if (standard_error) + *standard_error = g_string_free (errstr, FALSE); + + return TRUE; + } +} + +gboolean +g_spawn_async_with_pipes_utf8 (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_handle, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + g_return_val_if_fail (argv != NULL, FALSE); + g_return_val_if_fail (standard_output == NULL || + !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); + g_return_val_if_fail (standard_error == NULL || + !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); + /* can't inherit stdin if we have an input pipe. */ + g_return_val_if_fail (standard_input == NULL || + !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE); + + return do_spawn_with_pipes (NULL, + (flags & G_SPAWN_DO_NOT_REAP_CHILD), + working_directory, + argv, + envp, + flags, + child_setup, + child_handle, + standard_input, + standard_output, + standard_error, + NULL, + error); +} + +gboolean +g_spawn_command_line_sync_utf8 (const gchar *command_line, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error) +{ + gboolean retval; + gchar **argv = 0; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = g_spawn_sync_utf8 (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + standard_output, + standard_error, + exit_status, + error); + g_strfreev (argv); + + return retval; +} + +gboolean +g_spawn_command_line_async_utf8 (const gchar *command_line, + GError **error) +{ + gboolean retval; + gchar **argv = 0; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = g_spawn_async_utf8 (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + NULL, + error); + g_strfreev (argv); + + return retval; +} + +void +g_spawn_close_pid (GPid pid) +{ + CloseHandle (pid); +} + +#if !defined (_WIN64) + +/* Binary compatibility versions that take system codepage pathnames, + * argument vectors and environments. These get used only by code + * built against 2.8.1 or earlier. Code built against 2.8.2 or later + * will use the _utf8 versions above (see the #defines in gspawn.h). + */ + +#undef g_spawn_async +#undef g_spawn_async_with_pipes +#undef g_spawn_sync +#undef g_spawn_command_line_sync +#undef g_spawn_command_line_async + +static gboolean +setup_utf8_copies (const gchar *working_directory, + gchar **utf8_working_directory, + gchar **argv, + gchar ***utf8_argv, + gchar **envp, + gchar ***utf8_envp, + GError **error) +{ + gint i, argc, envc; + + if (working_directory == NULL) + *utf8_working_directory = NULL; + else + { + GError *conv_error = NULL; + + *utf8_working_directory = g_locale_to_utf8 (working_directory, -1, NULL, NULL, &conv_error); + if (*utf8_working_directory == NULL) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_CHDIR, + _("Invalid working directory: %s"), + conv_error->message); + g_error_free (conv_error); + return FALSE; + } + } + + argc = 0; + while (argv[argc]) + ++argc; + *utf8_argv = g_new (gchar *, argc + 1); + for (i = 0; i < argc; i++) + { + GError *conv_error = NULL; + + (*utf8_argv)[i] = g_locale_to_utf8 (argv[i], -1, NULL, NULL, &conv_error); + if ((*utf8_argv)[i] == NULL) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid string in argument vector at %d: %s"), + i, conv_error->message); + g_error_free (conv_error); + + g_strfreev (*utf8_argv); + *utf8_argv = NULL; + + g_free (*utf8_working_directory); + *utf8_working_directory = NULL; + + return FALSE; + } + } + (*utf8_argv)[argc] = NULL; + + if (envp == NULL) + { + *utf8_envp = NULL; + } + else + { + envc = 0; + while (envp[envc]) + ++envc; + *utf8_envp = g_new (gchar *, envc + 1); + for (i = 0; i < envc; i++) + { + GError *conv_error = NULL; + + (*utf8_envp)[i] = g_locale_to_utf8 (envp[i], -1, NULL, NULL, &conv_error); + if ((*utf8_envp)[i] == NULL) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Invalid string in environment: %s"), + conv_error->message); + g_error_free (conv_error); + + g_strfreev (*utf8_envp); + *utf8_envp = NULL; + + g_strfreev (*utf8_argv); + *utf8_argv = NULL; + + g_free (*utf8_working_directory); + *utf8_working_directory = NULL; + + return FALSE; + } + } + (*utf8_envp)[envc] = NULL; + } + return TRUE; +} + +static void +free_utf8_copies (gchar *utf8_working_directory, + gchar **utf8_argv, + gchar **utf8_envp) +{ + g_free (utf8_working_directory); + g_strfreev (utf8_argv); + g_strfreev (utf8_envp); +} + +gboolean +g_spawn_async_with_pipes (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_handle, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + gchar *utf8_working_directory; + gchar **utf8_argv; + gchar **utf8_envp; + gboolean retval; + + if (!setup_utf8_copies (working_directory, &utf8_working_directory, + argv, &utf8_argv, + envp, &utf8_envp, + error)) + return FALSE; + + retval = g_spawn_async_with_pipes_utf8 (utf8_working_directory, + utf8_argv, utf8_envp, + flags, child_setup, user_data, + child_handle, + standard_input, standard_output, standard_error, + error); + + free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp); + + return retval; +} + +gboolean +g_spawn_async (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_handle, + GError **error) +{ + return g_spawn_async_with_pipes (working_directory, + argv, envp, + flags, + child_setup, + user_data, + child_handle, + NULL, NULL, NULL, + error); +} + +gboolean +g_spawn_sync (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error) +{ + gchar *utf8_working_directory; + gchar **utf8_argv; + gchar **utf8_envp; + gboolean retval; + + if (!setup_utf8_copies (working_directory, &utf8_working_directory, + argv, &utf8_argv, + envp, &utf8_envp, + error)) + return FALSE; + + retval = g_spawn_sync_utf8 (utf8_working_directory, + utf8_argv, utf8_envp, + flags, child_setup, user_data, + standard_output, standard_error, exit_status, + error); + + free_utf8_copies (utf8_working_directory, utf8_argv, utf8_envp); + + return retval; +} + +gboolean +g_spawn_command_line_sync (const gchar *command_line, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error) +{ + gboolean retval; + gchar **argv = 0; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = g_spawn_sync (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + standard_output, + standard_error, + exit_status, + error); + g_strfreev (argv); + + return retval; +} + +gboolean +g_spawn_command_line_async (const gchar *command_line, + GError **error) +{ + gboolean retval; + gchar **argv = 0; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = g_spawn_async (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + NULL, + error); + g_strfreev (argv); + + return retval; +} + +#endif /* !_WIN64 */ + +#endif /* !GSPAWN_HELPER */ + +#define __G_SPAWN_C__ +#include "galiasdef.c" diff --git a/glib/gspawn-win64-helper-console.c b/glib/gspawn-win64-helper-console.c new file mode 100644 index 0000000..dca4499 --- /dev/null +++ b/glib/gspawn-win64-helper-console.c @@ -0,0 +1,2 @@ +#define HELPER_CONSOLE +#include "gspawn-win32-helper.c" diff --git a/glib/gspawn-win64-helper.c b/glib/gspawn-win64-helper.c new file mode 100644 index 0000000..d8641ff --- /dev/null +++ b/glib/gspawn-win64-helper.c @@ -0,0 +1 @@ +#include "gspawn-win32-helper.c" diff --git a/glib/gspawn.c b/glib/gspawn.c new file mode 100644 index 0000000..1425450 --- /dev/null +++ b/glib/gspawn.c @@ -0,0 +1,1682 @@ +/* gspawn.c - Process launching + * + * Copyright 2000 Red Hat, Inc. + * g_execvpe implementation based on GNU libc execvp: + * Copyright 1991, 92, 95, 96, 97, 98, 99 Free Software Foundation, Inc. + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for fdwalk */ +#include + +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* HAVE_SYS_SELECT_H */ + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif /* HAVE_SYS_RESOURCE_H */ + +#include "glib.h" +#include "glibintl.h" +#include "galias.h" + +static gint g_execute (const gchar *file, + gchar **argv, + gchar **envp, + gboolean search_path); + +static gboolean make_pipe (gint p[2], + GError **error); +static gboolean fork_exec_with_pipes (gboolean intermediate_child, + const gchar *working_directory, + gchar **argv, + gchar **envp, + gboolean close_descriptors, + gboolean search_path, + gboolean stdout_to_null, + gboolean stderr_to_null, + gboolean child_inherits_stdin, + gboolean file_and_argv_zero, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error); + +GQuark +g_spawn_error_quark (void) +{ + return g_quark_from_static_string ("g-exec-error-quark"); +} + +/** + * g_spawn_async: + * @working_directory: child's current working directory, or %NULL to inherit parent's + * @argv: child's argument vector + * @envp: child's environment, or %NULL to inherit parent's + * @flags: flags from #GSpawnFlags + * @child_setup: function to run in the child just before exec() + * @user_data: user data for @child_setup + * @child_pid: return location for child process reference, or %NULL + * @error: return location for error + * + * See g_spawn_async_with_pipes() for a full description; this function + * simply calls the g_spawn_async_with_pipes() without any pipes. + * + * You should call g_spawn_close_pid() on the returned child process + * reference when you don't need it any more. + * + * + * If you are writing a GTK+ application, and the program you + * are spawning is a graphical application, too, then you may + * want to use gdk_spawn_on_screen() instead to ensure that + * the spawned program opens its windows on the right screen. + * + * + * Note that the returned @child_pid on Windows is a + * handle to the child process and not its identifier. Process handles + * and process identifiers are different concepts on Windows. + * + * + * Return value: %TRUE on success, %FALSE if error is set + **/ +gboolean +g_spawn_async (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + GError **error) +{ + g_return_val_if_fail (argv != NULL, FALSE); + + return g_spawn_async_with_pipes (working_directory, + argv, envp, + flags, + child_setup, + user_data, + child_pid, + NULL, NULL, NULL, + error); +} + +/* Avoids a danger in threaded situations (calling close() + * on a file descriptor twice, and another thread has + * re-opened it since the first close) + */ +static gint +close_and_invalidate (gint *fd) +{ + gint ret; + + if (*fd < 0) + return -1; + else + { + ret = close (*fd); + *fd = -1; + } + + return ret; +} + +/* Some versions of OS X define READ_OK in public headers */ +#undef READ_OK + +typedef enum +{ + READ_FAILED = 0, /* FALSE */ + READ_OK, + READ_EOF +} ReadResult; + +static ReadResult +read_data (GString *str, + gint fd, + GError **error) +{ + gssize bytes; + gchar buf[4096]; + + again: + + bytes = read (fd, buf, 4096); + + if (bytes == 0) + return READ_EOF; + else if (bytes > 0) + { + g_string_append_len (str, buf, bytes); + return READ_OK; + } + else if (bytes < 0 && errno == EINTR) + goto again; + else if (bytes < 0) + { + int errsv = errno; + + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_READ, + _("Failed to read data from child process (%s)"), + g_strerror (errsv)); + + return READ_FAILED; + } + else + return READ_OK; +} + +/** + * g_spawn_sync: + * @working_directory: child's current working directory, or %NULL to inherit parent's + * @argv: child's argument vector + * @envp: child's environment, or %NULL to inherit parent's + * @flags: flags from #GSpawnFlags + * @child_setup: function to run in the child just before exec() + * @user_data: user data for @child_setup + * @standard_output: return location for child output, or %NULL + * @standard_error: return location for child error messages, or %NULL + * @exit_status: return location for child exit status, as returned by waitpid(), or %NULL + * @error: return location for error, or %NULL + * + * Executes a child synchronously (waits for the child to exit before returning). + * All output from the child is stored in @standard_output and @standard_error, + * if those parameters are non-%NULL. Note that you must set the + * %G_SPAWN_STDOUT_TO_DEV_NULL and %G_SPAWN_STDERR_TO_DEV_NULL flags when + * passing %NULL for @standard_output and @standard_error. + * If @exit_status is non-%NULL, the exit status of the child is stored + * there as it would be returned by waitpid(); standard UNIX macros such + * as WIFEXITED() and WEXITSTATUS() must be used to evaluate the exit status. + * Note that this function call waitpid() even if @exit_status is %NULL, and + * does not accept the %G_SPAWN_DO_NOT_REAP_CHILD flag. + * If an error occurs, no data is returned in @standard_output, + * @standard_error, or @exit_status. + * + * This function calls g_spawn_async_with_pipes() internally; see that + * function for full details on the other parameters and details on + * how these functions work on Windows. + * + * Return value: %TRUE on success, %FALSE if an error was set. + **/ +gboolean +g_spawn_sync (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error) +{ + gint outpipe = -1; + gint errpipe = -1; + GPid pid; + fd_set fds; + gint ret; + GString *outstr = NULL; + GString *errstr = NULL; + gboolean failed; + gint status; + + g_return_val_if_fail (argv != NULL, FALSE); + g_return_val_if_fail (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), FALSE); + g_return_val_if_fail (standard_output == NULL || + !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); + g_return_val_if_fail (standard_error == NULL || + !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); + + /* Just to ensure segfaults if callers try to use + * these when an error is reported. + */ + if (standard_output) + *standard_output = NULL; + + if (standard_error) + *standard_error = NULL; + + if (!fork_exec_with_pipes (FALSE, + working_directory, + argv, + envp, + !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), + (flags & G_SPAWN_SEARCH_PATH) != 0, + (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0, + (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0, + (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0, + (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0, + child_setup, + user_data, + &pid, + NULL, + standard_output ? &outpipe : NULL, + standard_error ? &errpipe : NULL, + error)) + return FALSE; + + /* Read data from child. */ + + failed = FALSE; + + if (outpipe >= 0) + { + outstr = g_string_new (NULL); + } + + if (errpipe >= 0) + { + errstr = g_string_new (NULL); + } + + /* Read data until we get EOF on both pipes. */ + while (!failed && + (outpipe >= 0 || + errpipe >= 0)) + { + ret = 0; + + FD_ZERO (&fds); + if (outpipe >= 0) + FD_SET (outpipe, &fds); + if (errpipe >= 0) + FD_SET (errpipe, &fds); + + ret = select (MAX (outpipe, errpipe) + 1, + &fds, + NULL, NULL, + NULL /* no timeout */); + + if (ret < 0 && errno != EINTR) + { + int errsv = errno; + + failed = TRUE; + + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_READ, + _("Unexpected error in select() reading data from a child process (%s)"), + g_strerror (errsv)); + + break; + } + + if (outpipe >= 0 && FD_ISSET (outpipe, &fds)) + { + switch (read_data (outstr, outpipe, error)) + { + case READ_FAILED: + failed = TRUE; + break; + case READ_EOF: + close_and_invalidate (&outpipe); + outpipe = -1; + break; + default: + break; + } + + if (failed) + break; + } + + if (errpipe >= 0 && FD_ISSET (errpipe, &fds)) + { + switch (read_data (errstr, errpipe, error)) + { + case READ_FAILED: + failed = TRUE; + break; + case READ_EOF: + close_and_invalidate (&errpipe); + errpipe = -1; + break; + default: + break; + } + + if (failed) + break; + } + } + + /* These should only be open still if we had an error. */ + + if (outpipe >= 0) + close_and_invalidate (&outpipe); + if (errpipe >= 0) + close_and_invalidate (&errpipe); + + /* Wait for child to exit, even if we have + * an error pending. + */ + again: + + ret = waitpid (pid, &status, 0); + + if (ret < 0) + { + if (errno == EINTR) + goto again; + else if (errno == ECHILD) + { + if (exit_status) + { + g_warning ("In call to g_spawn_sync(), exit status of a child process was requested but SIGCHLD action was set to SIG_IGN and ECHILD was received by waitpid(), so exit status can't be returned. This is a bug in the program calling g_spawn_sync(); either don't request the exit status, or don't set the SIGCHLD action."); + } + else + { + /* We don't need the exit status. */ + } + } + else + { + if (!failed) /* avoid error pileups */ + { + int errsv = errno; + + failed = TRUE; + + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_READ, + _("Unexpected error in waitpid() (%s)"), + g_strerror (errsv)); + } + } + } + + if (failed) + { + if (outstr) + g_string_free (outstr, TRUE); + if (errstr) + g_string_free (errstr, TRUE); + + return FALSE; + } + else + { + if (exit_status) + *exit_status = status; + + if (standard_output) + *standard_output = g_string_free (outstr, FALSE); + + if (standard_error) + *standard_error = g_string_free (errstr, FALSE); + + return TRUE; + } +} + +/** + * g_spawn_async_with_pipes: + * @working_directory: child's current working directory, or %NULL to inherit parent's, in the GLib file name encoding + * @argv: child's argument vector, in the GLib file name encoding + * @envp: child's environment, or %NULL to inherit parent's, in the GLib file name encoding + * @flags: flags from #GSpawnFlags + * @child_setup: function to run in the child just before exec() + * @user_data: user data for @child_setup + * @child_pid: return location for child process ID, or %NULL + * @standard_input: return location for file descriptor to write to child's stdin, or %NULL + * @standard_output: return location for file descriptor to read child's stdout, or %NULL + * @standard_error: return location for file descriptor to read child's stderr, or %NULL + * @error: return location for error + * + * Executes a child program asynchronously (your program will not + * block waiting for the child to exit). The child program is + * specified by the only argument that must be provided, @argv. @argv + * should be a %NULL-terminated array of strings, to be passed as the + * argument vector for the child. The first string in @argv is of + * course the name of the program to execute. By default, the name of + * the program must be a full path; the PATH shell variable + * will only be searched if you pass the %G_SPAWN_SEARCH_PATH flag. + * + * On Windows, note that all the string or string vector arguments to + * this function and the other g_spawn*() functions are in UTF-8, the + * GLib file name encoding. Unicode characters that are not part of + * the system codepage passed in these arguments will be correctly + * available in the spawned program only if it uses wide character API + * to retrieve its command line. For C programs built with Microsoft's + * tools it is enough to make the program have a wmain() instead of + * main(). wmain() has a wide character argument vector as parameter. + * + * At least currently, mingw doesn't support wmain(), so if you use + * mingw to develop the spawned program, it will have to call the + * undocumented function __wgetmainargs() to get the wide character + * argument vector and environment. See gspawn-win32-helper.c in the + * GLib sources or init.c in the mingw runtime sources for a prototype + * for that function. Alternatively, you can retrieve the Win32 system + * level wide character command line passed to the spawned program + * using the GetCommandLineW() function. + * + * On Windows the low-level child process creation API + * CreateProcess() doesn't use argument vectors, + * but a command line. The C runtime library's + * spawn*() family of functions (which + * g_spawn_async_with_pipes() eventually calls) paste the argument + * vector elements together into a command line, and the C runtime startup code + * does a corresponding reconstruction of an argument vector from the + * command line, to be passed to main(). Complications arise when you have + * argument vector elements that contain spaces of double quotes. The + * spawn*() functions don't do any quoting or + * escaping, but on the other hand the startup code does do unquoting + * and unescaping in order to enable receiving arguments with embedded + * spaces or double quotes. To work around this asymmetry, + * g_spawn_async_with_pipes() will do quoting and escaping on argument + * vector elements that need it before calling the C runtime + * spawn() function. + * + * The returned @child_pid on Windows is a handle to the child + * process, not its identifier. Process handles and process + * identifiers are different concepts on Windows. + * + * @envp is a %NULL-terminated array of strings, where each string + * has the form KEY=VALUE. This will become + * the child's environment. If @envp is %NULL, the child inherits its + * parent's environment. + * + * @flags should be the bitwise OR of any flags you want to affect the + * function's behaviour. The %G_SPAWN_DO_NOT_REAP_CHILD means that + * the child will not automatically be reaped; you must use a + * #GChildWatch source to be notified about the death of the child + * process. Eventually you must call g_spawn_close_pid() on the + * @child_pid, in order to free resources which may be associated + * with the child process. (On Unix, using a #GChildWatch source is + * equivalent to calling waitpid() or handling the %SIGCHLD signal + * manually. On Windows, calling g_spawn_close_pid() is equivalent + * to calling CloseHandle() on the process handle returned in + * @child_pid). + * + * %G_SPAWN_LEAVE_DESCRIPTORS_OPEN means that the parent's open file + * descriptors will be inherited by the child; otherwise all + * descriptors except stdin/stdout/stderr will be closed before + * calling exec() in the child. %G_SPAWN_SEARCH_PATH + * means that argv[0] need not be an absolute path, it + * will be looked for in the user's PATH. + * %G_SPAWN_STDOUT_TO_DEV_NULL means that the child's standard output will + * be discarded, instead of going to the same location as the parent's + * standard output. If you use this flag, @standard_output must be %NULL. + * %G_SPAWN_STDERR_TO_DEV_NULL means that the child's standard error + * will be discarded, instead of going to the same location as the parent's + * standard error. If you use this flag, @standard_error must be %NULL. + * %G_SPAWN_CHILD_INHERITS_STDIN means that the child will inherit the parent's + * standard input (by default, the child's standard input is attached to + * /dev/null). If you use this flag, @standard_input must be %NULL. + * %G_SPAWN_FILE_AND_ARGV_ZERO means that the first element of @argv is + * the file to execute, while the remaining elements are the + * actual argument vector to pass to the file. Normally + * g_spawn_async_with_pipes() uses @argv[0] as the file to execute, and + * passes all of @argv to the child. + * + * @child_setup and @user_data are a function and user data. On POSIX + * platforms, the function is called in the child after GLib has + * performed all the setup it plans to perform (including creating + * pipes, closing file descriptors, etc.) but before calling + * exec(). That is, @child_setup is called just + * before calling exec() in the child. Obviously + * actions taken in this function will only affect the child, not the + * parent. + * + * On Windows, there is no separate fork() and exec() + * functionality. Child processes are created and run with a single + * API call, CreateProcess(). There is no sensible thing @child_setup + * could be used for on Windows so it is ignored and not called. + * + * If non-%NULL, @child_pid will on Unix be filled with the child's + * process ID. You can use the process ID to send signals to the + * child, or to use g_child_watch_add() (or waitpid()) if you specified the + * %G_SPAWN_DO_NOT_REAP_CHILD flag. On Windows, @child_pid will be + * filled with a handle to the child process only if you specified the + * %G_SPAWN_DO_NOT_REAP_CHILD flag. You can then access the child + * process using the Win32 API, for example wait for its termination + * with the WaitFor*() functions, or examine its + * exit code with GetExitCodeProcess(). You should close the handle + * with CloseHandle() or g_spawn_close_pid() when you no longer need it. + * + * If non-%NULL, the @standard_input, @standard_output, @standard_error + * locations will be filled with file descriptors for writing to the child's + * standard input or reading from its standard output or standard error. + * The caller of g_spawn_async_with_pipes() must close these file descriptors + * when they are no longer in use. If these parameters are %NULL, the corresponding + * pipe won't be created. + * + * If @standard_input is NULL, the child's standard input is attached to + * /dev/null unless %G_SPAWN_CHILD_INHERITS_STDIN is set. + * + * If @standard_error is NULL, the child's standard error goes to the same + * location as the parent's standard error unless %G_SPAWN_STDERR_TO_DEV_NULL + * is set. + * + * If @standard_output is NULL, the child's standard output goes to the same + * location as the parent's standard output unless %G_SPAWN_STDOUT_TO_DEV_NULL + * is set. + * + * @error can be %NULL to ignore errors, or non-%NULL to report errors. + * If an error is set, the function returns %FALSE. Errors + * are reported even if they occur in the child (for example if the + * executable in argv[0] is not found). Typically + * the message field of returned errors should be displayed + * to users. Possible errors are those from the #G_SPAWN_ERROR domain. + * + * If an error occurs, @child_pid, @standard_input, @standard_output, + * and @standard_error will not be filled with valid values. + * + * If @child_pid is not %NULL and an error does not occur then the returned + * process reference must be closed using g_spawn_close_pid(). + * + * + * If you are writing a GTK+ application, and the program you + * are spawning is a graphical application, too, then you may + * want to use gdk_spawn_on_screen_with_pipes() instead to ensure that + * the spawned program opens its windows on the right screen. + * + * + * Return value: %TRUE on success, %FALSE if an error was set + **/ +gboolean +g_spawn_async_with_pipes (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + g_return_val_if_fail (argv != NULL, FALSE); + g_return_val_if_fail (standard_output == NULL || + !(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE); + g_return_val_if_fail (standard_error == NULL || + !(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE); + /* can't inherit stdin if we have an input pipe. */ + g_return_val_if_fail (standard_input == NULL || + !(flags & G_SPAWN_CHILD_INHERITS_STDIN), FALSE); + + return fork_exec_with_pipes (!(flags & G_SPAWN_DO_NOT_REAP_CHILD), + working_directory, + argv, + envp, + !(flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN), + (flags & G_SPAWN_SEARCH_PATH) != 0, + (flags & G_SPAWN_STDOUT_TO_DEV_NULL) != 0, + (flags & G_SPAWN_STDERR_TO_DEV_NULL) != 0, + (flags & G_SPAWN_CHILD_INHERITS_STDIN) != 0, + (flags & G_SPAWN_FILE_AND_ARGV_ZERO) != 0, + child_setup, + user_data, + child_pid, + standard_input, + standard_output, + standard_error, + error); +} + +/** + * g_spawn_command_line_sync: + * @command_line: a command line + * @standard_output: return location for child output + * @standard_error: return location for child errors + * @exit_status: return location for child exit status, as returned by waitpid() + * @error: return location for errors + * + * A simple version of g_spawn_sync() with little-used parameters + * removed, taking a command line instead of an argument vector. See + * g_spawn_sync() for full details. @command_line will be parsed by + * g_shell_parse_argv(). Unlike g_spawn_sync(), the %G_SPAWN_SEARCH_PATH flag + * is enabled. Note that %G_SPAWN_SEARCH_PATH can have security + * implications, so consider using g_spawn_sync() directly if + * appropriate. Possible errors are those from g_spawn_sync() and those + * from g_shell_parse_argv(). + * + * If @exit_status is non-%NULL, the exit status of the child is stored there as + * it would be returned by waitpid(); standard UNIX macros such as WIFEXITED() + * and WEXITSTATUS() must be used to evaluate the exit status. + * + * On Windows, please note the implications of g_shell_parse_argv() + * parsing @command_line. Parsing is done according to Unix shell rules, not + * Windows command interpreter rules. + * Space is a separator, and backslashes are + * special. Thus you cannot simply pass a @command_line containing + * canonical Windows paths, like "c:\\program files\\app\\app.exe", as + * the backslashes will be eaten, and the space will act as a + * separator. You need to enclose such paths with single quotes, like + * "'c:\\program files\\app\\app.exe' 'e:\\folder\\argument.txt'". + * + * Return value: %TRUE on success, %FALSE if an error was set + **/ +gboolean +g_spawn_command_line_sync (const gchar *command_line, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error) +{ + gboolean retval; + gchar **argv = NULL; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = g_spawn_sync (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + standard_output, + standard_error, + exit_status, + error); + g_strfreev (argv); + + return retval; +} + +/** + * g_spawn_command_line_async: + * @command_line: a command line + * @error: return location for errors + * + * A simple version of g_spawn_async() that parses a command line with + * g_shell_parse_argv() and passes it to g_spawn_async(). Runs a + * command line in the background. Unlike g_spawn_async(), the + * %G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note + * that %G_SPAWN_SEARCH_PATH can have security implications, so + * consider using g_spawn_async() directly if appropriate. Possible + * errors are those from g_shell_parse_argv() and g_spawn_async(). + * + * The same concerns on Windows apply as for g_spawn_command_line_sync(). + * + * Return value: %TRUE on success, %FALSE if error is set. + **/ +gboolean +g_spawn_command_line_async (const gchar *command_line, + GError **error) +{ + gboolean retval; + gchar **argv = NULL; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = g_spawn_async (NULL, + argv, + NULL, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + NULL, + error); + g_strfreev (argv); + + return retval; +} + +static gint +exec_err_to_g_error (gint en) +{ + switch (en) + { +#ifdef EACCES + case EACCES: + return G_SPAWN_ERROR_ACCES; + break; +#endif + +#ifdef EPERM + case EPERM: + return G_SPAWN_ERROR_PERM; + break; +#endif + +#ifdef E2BIG + case E2BIG: + return G_SPAWN_ERROR_2BIG; + break; +#endif + +#ifdef ENOEXEC + case ENOEXEC: + return G_SPAWN_ERROR_NOEXEC; + break; +#endif + +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + return G_SPAWN_ERROR_NAMETOOLONG; + break; +#endif + +#ifdef ENOENT + case ENOENT: + return G_SPAWN_ERROR_NOENT; + break; +#endif + +#ifdef ENOMEM + case ENOMEM: + return G_SPAWN_ERROR_NOMEM; + break; +#endif + +#ifdef ENOTDIR + case ENOTDIR: + return G_SPAWN_ERROR_NOTDIR; + break; +#endif + +#ifdef ELOOP + case ELOOP: + return G_SPAWN_ERROR_LOOP; + break; +#endif + +#ifdef ETXTBUSY + case ETXTBUSY: + return G_SPAWN_ERROR_TXTBUSY; + break; +#endif + +#ifdef EIO + case EIO: + return G_SPAWN_ERROR_IO; + break; +#endif + +#ifdef ENFILE + case ENFILE: + return G_SPAWN_ERROR_NFILE; + break; +#endif + +#ifdef EMFILE + case EMFILE: + return G_SPAWN_ERROR_MFILE; + break; +#endif + +#ifdef EINVAL + case EINVAL: + return G_SPAWN_ERROR_INVAL; + break; +#endif + +#ifdef EISDIR + case EISDIR: + return G_SPAWN_ERROR_ISDIR; + break; +#endif + +#ifdef ELIBBAD + case ELIBBAD: + return G_SPAWN_ERROR_LIBBAD; + break; +#endif + + default: + return G_SPAWN_ERROR_FAILED; + break; + } +} + +static gssize +write_all (gint fd, gconstpointer vbuf, gsize to_write) +{ + gchar *buf = (gchar *) vbuf; + + while (to_write > 0) + { + gssize count = write (fd, buf, to_write); + if (count < 0) + { + if (errno != EINTR) + return FALSE; + } + else + { + to_write -= count; + buf += count; + } + } + + return TRUE; +} + +G_GNUC_NORETURN +static void +write_err_and_exit (gint fd, gint msg) +{ + gint en = errno; + + write_all (fd, &msg, sizeof(msg)); + write_all (fd, &en, sizeof(en)); + + _exit (1); +} + +static int +set_cloexec (void *data, gint fd) +{ + if (fd >= GPOINTER_TO_INT (data)) + fcntl (fd, F_SETFD, FD_CLOEXEC); + + return 0; +} + +#ifndef HAVE_FDWALK +static int +fdwalk (int (*cb)(void *data, int fd), void *data) +{ + gint open_max; + gint fd; + gint res = 0; + +#ifdef HAVE_SYS_RESOURCE_H + struct rlimit rl; +#endif + +#ifdef __linux__ + DIR *d; + + if ((d = opendir("/proc/self/fd"))) { + struct dirent *de; + + while ((de = readdir(d))) { + glong l; + gchar *e = NULL; + + if (de->d_name[0] == '.') + continue; + + errno = 0; + l = strtol(de->d_name, &e, 10); + if (errno != 0 || !e || *e) + continue; + + fd = (gint) l; + + if ((glong) fd != l) + continue; + + if (fd == dirfd(d)) + continue; + + if ((res = cb (data, fd)) != 0) + break; + } + + closedir(d); + return res; + } + + /* If /proc is not mounted or not accessible we fall back to the old + * rlimit trick */ + +#endif + +#ifdef HAVE_SYS_RESOURCE_H + + if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) + open_max = rl.rlim_max; + else +#endif + open_max = sysconf (_SC_OPEN_MAX); + + for (fd = 0; fd < open_max; fd++) + if ((res = cb (data, fd)) != 0) + break; + + return res; +} +#endif + +static gint +sane_dup2 (gint fd1, gint fd2) +{ + gint ret; + + retry: + ret = dup2 (fd1, fd2); + if (ret < 0 && errno == EINTR) + goto retry; + + return ret; +} + +enum +{ + CHILD_CHDIR_FAILED, + CHILD_EXEC_FAILED, + CHILD_DUP2_FAILED, + CHILD_FORK_FAILED +}; + +static void +do_exec (gint child_err_report_fd, + gint stdin_fd, + gint stdout_fd, + gint stderr_fd, + const gchar *working_directory, + gchar **argv, + gchar **envp, + gboolean close_descriptors, + gboolean search_path, + gboolean stdout_to_null, + gboolean stderr_to_null, + gboolean child_inherits_stdin, + gboolean file_and_argv_zero, + GSpawnChildSetupFunc child_setup, + gpointer user_data) +{ + if (working_directory && chdir (working_directory) < 0) + write_err_and_exit (child_err_report_fd, + CHILD_CHDIR_FAILED); + + /* Close all file descriptors but stdin stdout and stderr as + * soon as we exec. Note that this includes + * child_err_report_fd, which keeps the parent from blocking + * forever on the other end of that pipe. + */ + if (close_descriptors) + { + fdwalk (set_cloexec, GINT_TO_POINTER(3)); + } + else + { + /* We need to do child_err_report_fd anyway */ + set_cloexec (GINT_TO_POINTER(0), child_err_report_fd); + } + + /* Redirect pipes as required */ + + if (stdin_fd >= 0) + { + /* dup2 can't actually fail here I don't think */ + + if (sane_dup2 (stdin_fd, 0) < 0) + write_err_and_exit (child_err_report_fd, + CHILD_DUP2_FAILED); + + /* ignore this if it doesn't work */ + close_and_invalidate (&stdin_fd); + } + else if (!child_inherits_stdin) + { + /* Keep process from blocking on a read of stdin */ + gint read_null = open ("/dev/null", O_RDONLY); + sane_dup2 (read_null, 0); + close_and_invalidate (&read_null); + } + + if (stdout_fd >= 0) + { + /* dup2 can't actually fail here I don't think */ + + if (sane_dup2 (stdout_fd, 1) < 0) + write_err_and_exit (child_err_report_fd, + CHILD_DUP2_FAILED); + + /* ignore this if it doesn't work */ + close_and_invalidate (&stdout_fd); + } + else if (stdout_to_null) + { + gint write_null = open ("/dev/null", O_WRONLY); + sane_dup2 (write_null, 1); + close_and_invalidate (&write_null); + } + + if (stderr_fd >= 0) + { + /* dup2 can't actually fail here I don't think */ + + if (sane_dup2 (stderr_fd, 2) < 0) + write_err_and_exit (child_err_report_fd, + CHILD_DUP2_FAILED); + + /* ignore this if it doesn't work */ + close_and_invalidate (&stderr_fd); + } + else if (stderr_to_null) + { + gint write_null = open ("/dev/null", O_WRONLY); + sane_dup2 (write_null, 2); + close_and_invalidate (&write_null); + } + + /* Call user function just before we exec */ + if (child_setup) + { + (* child_setup) (user_data); + } + + g_execute (argv[0], + file_and_argv_zero ? argv + 1 : argv, + envp, search_path); + + /* Exec failed */ + write_err_and_exit (child_err_report_fd, + CHILD_EXEC_FAILED); +} + +static gboolean +read_ints (int fd, + gint* buf, + gint n_ints_in_buf, + gint *n_ints_read, + GError **error) +{ + gsize bytes = 0; + + while (TRUE) + { + gssize chunk; + + if (bytes >= sizeof(gint)*2) + break; /* give up, who knows what happened, should not be + * possible. + */ + + again: + chunk = read (fd, + ((gchar*)buf) + bytes, + sizeof(gint) * n_ints_in_buf - bytes); + if (chunk < 0 && errno == EINTR) + goto again; + + if (chunk < 0) + { + int errsv = errno; + + /* Some weird shit happened, bail out */ + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FAILED, + _("Failed to read from child pipe (%s)"), + g_strerror (errsv)); + + return FALSE; + } + else if (chunk == 0) + break; /* EOF */ + else /* chunk > 0 */ + bytes += chunk; + } + + *n_ints_read = (gint)(bytes / sizeof(gint)); + + return TRUE; +} + +static gboolean +fork_exec_with_pipes (gboolean intermediate_child, + const gchar *working_directory, + gchar **argv, + gchar **envp, + gboolean close_descriptors, + gboolean search_path, + gboolean stdout_to_null, + gboolean stderr_to_null, + gboolean child_inherits_stdin, + gboolean file_and_argv_zero, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + GPid pid = -1; + gint stdin_pipe[2] = { -1, -1 }; + gint stdout_pipe[2] = { -1, -1 }; + gint stderr_pipe[2] = { -1, -1 }; + gint child_err_report_pipe[2] = { -1, -1 }; + gint child_pid_report_pipe[2] = { -1, -1 }; + gint status; + + if (!make_pipe (child_err_report_pipe, error)) + return FALSE; + + if (intermediate_child && !make_pipe (child_pid_report_pipe, error)) + goto cleanup_and_fail; + + if (standard_input && !make_pipe (stdin_pipe, error)) + goto cleanup_and_fail; + + if (standard_output && !make_pipe (stdout_pipe, error)) + goto cleanup_and_fail; + + if (standard_error && !make_pipe (stderr_pipe, error)) + goto cleanup_and_fail; + + pid = fork (); + + if (pid < 0) + { + int errsv = errno; + + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FORK, + _("Failed to fork (%s)"), + g_strerror (errsv)); + + goto cleanup_and_fail; + } + else if (pid == 0) + { + /* Immediate child. This may or may not be the child that + * actually execs the new process. + */ + + /* Be sure we crash if the parent exits + * and we write to the err_report_pipe + */ + signal (SIGPIPE, SIG_DFL); + + /* Close the parent's end of the pipes; + * not needed in the close_descriptors case, + * though + */ + close_and_invalidate (&child_err_report_pipe[0]); + close_and_invalidate (&child_pid_report_pipe[0]); + close_and_invalidate (&stdin_pipe[1]); + close_and_invalidate (&stdout_pipe[0]); + close_and_invalidate (&stderr_pipe[0]); + + if (intermediate_child) + { + /* We need to fork an intermediate child that launches the + * final child. The purpose of the intermediate child + * is to exit, so we can waitpid() it immediately. + * Then the grandchild will not become a zombie. + */ + GPid grandchild_pid; + + grandchild_pid = fork (); + + if (grandchild_pid < 0) + { + /* report -1 as child PID */ + write_all (child_pid_report_pipe[1], &grandchild_pid, + sizeof(grandchild_pid)); + + write_err_and_exit (child_err_report_pipe[1], + CHILD_FORK_FAILED); + } + else if (grandchild_pid == 0) + { + do_exec (child_err_report_pipe[1], + stdin_pipe[0], + stdout_pipe[1], + stderr_pipe[1], + working_directory, + argv, + envp, + close_descriptors, + search_path, + stdout_to_null, + stderr_to_null, + child_inherits_stdin, + file_and_argv_zero, + child_setup, + user_data); + } + else + { + write_all (child_pid_report_pipe[1], &grandchild_pid, sizeof(grandchild_pid)); + close_and_invalidate (&child_pid_report_pipe[1]); + + _exit (0); + } + } + else + { + /* Just run the child. + */ + + do_exec (child_err_report_pipe[1], + stdin_pipe[0], + stdout_pipe[1], + stderr_pipe[1], + working_directory, + argv, + envp, + close_descriptors, + search_path, + stdout_to_null, + stderr_to_null, + child_inherits_stdin, + file_and_argv_zero, + child_setup, + user_data); + } + } + else + { + /* Parent */ + + gint buf[2]; + gint n_ints = 0; + + /* Close the uncared-about ends of the pipes */ + close_and_invalidate (&child_err_report_pipe[1]); + close_and_invalidate (&child_pid_report_pipe[1]); + close_and_invalidate (&stdin_pipe[0]); + close_and_invalidate (&stdout_pipe[1]); + close_and_invalidate (&stderr_pipe[1]); + + /* If we had an intermediate child, reap it */ + if (intermediate_child) + { + wait_again: + if (waitpid (pid, &status, 0) < 0) + { + if (errno == EINTR) + goto wait_again; + else if (errno == ECHILD) + ; /* do nothing, child already reaped */ + else + g_warning ("waitpid() should not fail in " + "'fork_exec_with_pipes'"); + } + } + + + if (!read_ints (child_err_report_pipe[0], + buf, 2, &n_ints, + error)) + goto cleanup_and_fail; + + if (n_ints >= 2) + { + /* Error from the child. */ + + switch (buf[0]) + { + case CHILD_CHDIR_FAILED: + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_CHDIR, + _("Failed to change to directory '%s' (%s)"), + working_directory, + g_strerror (buf[1])); + + break; + + case CHILD_EXEC_FAILED: + g_set_error (error, + G_SPAWN_ERROR, + exec_err_to_g_error (buf[1]), + _("Failed to execute child process \"%s\" (%s)"), + argv[0], + g_strerror (buf[1])); + + break; + + case CHILD_DUP2_FAILED: + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FAILED, + _("Failed to redirect output or input of child process (%s)"), + g_strerror (buf[1])); + + break; + + case CHILD_FORK_FAILED: + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FORK, + _("Failed to fork child process (%s)"), + g_strerror (buf[1])); + break; + + default: + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FAILED, + _("Unknown error executing child process \"%s\""), + argv[0]); + break; + } + + goto cleanup_and_fail; + } + + /* Get child pid from intermediate child pipe. */ + if (intermediate_child) + { + n_ints = 0; + + if (!read_ints (child_pid_report_pipe[0], + buf, 1, &n_ints, error)) + goto cleanup_and_fail; + + if (n_ints < 1) + { + int errsv = errno; + + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FAILED, + _("Failed to read enough data from child pid pipe (%s)"), + g_strerror (errsv)); + goto cleanup_and_fail; + } + else + { + /* we have the child pid */ + pid = buf[0]; + } + } + + /* Success against all odds! return the information */ + close_and_invalidate (&child_err_report_pipe[0]); + close_and_invalidate (&child_pid_report_pipe[0]); + + if (child_pid) + *child_pid = pid; + + if (standard_input) + *standard_input = stdin_pipe[1]; + if (standard_output) + *standard_output = stdout_pipe[0]; + if (standard_error) + *standard_error = stderr_pipe[0]; + + return TRUE; + } + + cleanup_and_fail: + + /* There was an error from the Child, reap the child to avoid it being + a zombie. + */ + + if (pid > 0) + { + wait_failed: + if (waitpid (pid, NULL, 0) < 0) + { + if (errno == EINTR) + goto wait_failed; + else if (errno == ECHILD) + ; /* do nothing, child already reaped */ + else + g_warning ("waitpid() should not fail in " + "'fork_exec_with_pipes'"); + } + } + + close_and_invalidate (&child_err_report_pipe[0]); + close_and_invalidate (&child_err_report_pipe[1]); + close_and_invalidate (&child_pid_report_pipe[0]); + close_and_invalidate (&child_pid_report_pipe[1]); + close_and_invalidate (&stdin_pipe[0]); + close_and_invalidate (&stdin_pipe[1]); + close_and_invalidate (&stdout_pipe[0]); + close_and_invalidate (&stdout_pipe[1]); + close_and_invalidate (&stderr_pipe[0]); + close_and_invalidate (&stderr_pipe[1]); + + return FALSE; +} + +static gboolean +make_pipe (gint p[2], + GError **error) +{ + if (pipe (p) < 0) + { + gint errsv = errno; + g_set_error (error, + G_SPAWN_ERROR, + G_SPAWN_ERROR_FAILED, + _("Failed to create pipe for communicating with child process (%s)"), + g_strerror (errsv)); + return FALSE; + } + else + return TRUE; +} + +/* Based on execvp from GNU C Library */ + +static void +script_execute (const gchar *file, + gchar **argv, + gchar **envp, + gboolean search_path) +{ + /* Count the arguments. */ + int argc = 0; + while (argv[argc]) + ++argc; + + /* Construct an argument list for the shell. */ + { + gchar **new_argv; + + new_argv = g_new0 (gchar*, argc + 2); /* /bin/sh and NULL */ + + new_argv[0] = (char *) "/bin/sh"; + new_argv[1] = (char *) file; + while (argc > 0) + { + new_argv[argc + 1] = argv[argc]; + --argc; + } + + /* Execute the shell. */ + if (envp) + execve (new_argv[0], new_argv, envp); + else + execv (new_argv[0], new_argv); + + g_free (new_argv); + } +} + +static gchar* +my_strchrnul (const gchar *str, gchar c) +{ + gchar *p = (gchar*) str; + while (*p && (*p != c)) + ++p; + + return p; +} + +static gint +g_execute (const gchar *file, + gchar **argv, + gchar **envp, + gboolean search_path) +{ + if (*file == '\0') + { + /* We check the simple case first. */ + errno = ENOENT; + return -1; + } + + if (!search_path || strchr (file, '/') != NULL) + { + /* Don't search when it contains a slash. */ + if (envp) + execve (file, argv, envp); + else + execv (file, argv); + + if (errno == ENOEXEC) + script_execute (file, argv, envp, FALSE); + } + else + { + gboolean got_eacces = 0; + const gchar *path, *p; + gchar *name, *freeme; + gsize len; + gsize pathlen; + + path = g_getenv ("PATH"); + if (path == NULL) + { + /* There is no `PATH' in the environment. The default + * search path in libc is the current directory followed by + * the path `confstr' returns for `_CS_PATH'. + */ + + /* In GLib we put . last, for security, and don't use the + * unportable confstr(); UNIX98 does not actually specify + * what to search if PATH is unset. POSIX may, dunno. + */ + + path = "/bin:/usr/bin:."; + } + + len = strlen (file) + 1; + pathlen = strlen (path); + freeme = name = g_malloc (pathlen + len + 1); + + /* Copy the file name at the top, including '\0' */ + memcpy (name + pathlen + 1, file, len); + name = name + pathlen; + /* And add the slash before the filename */ + *name = '/'; + + p = path; + do + { + char *startp; + + path = p; + p = my_strchrnul (path, ':'); + + if (p == path) + /* Two adjacent colons, or a colon at the beginning or the end + * of `PATH' means to search the current directory. + */ + startp = name + 1; + else + startp = memcpy (name - (p - path), path, p - path); + + /* Try to execute this name. If it works, execv will not return. */ + if (envp) + execve (startp, argv, envp); + else + execv (startp, argv); + + if (errno == ENOEXEC) + script_execute (startp, argv, envp, search_path); + + switch (errno) + { + case EACCES: + /* Record the we got a `Permission denied' error. If we end + * up finding no executable we can use, we want to diagnose + * that we did find one but were denied access. + */ + got_eacces = TRUE; + + /* FALL THRU */ + + case ENOENT: +#ifdef ESTALE + case ESTALE: +#endif +#ifdef ENOTDIR + case ENOTDIR: +#endif + /* Those errors indicate the file is missing or not executable + * by us, in which case we want to just try the next path + * directory. + */ + break; + + default: + /* Some other error means we found an executable file, but + * something went wrong executing it; return the error to our + * caller. + */ + g_free (freeme); + return -1; + } + } + while (*p++ != '\0'); + + /* We tried every element and none of them worked. */ + if (got_eacces) + /* At least one failure was due to permissions, so report that + * error. + */ + errno = EACCES; + + g_free (freeme); + } + + /* Return the error from the last attempt (probably ENOENT). */ + return -1; +} + +/** + * g_spawn_close_pid: + * @pid: The process reference to close + * + * On some platforms, notably Windows, the #GPid type represents a resource + * which must be closed to prevent resource leaking. g_spawn_close_pid() + * is provided for this purpose. It should be used on all platforms, even + * though it doesn't do anything under UNIX. + **/ +void +g_spawn_close_pid (GPid pid) +{ +} + +#define __G_SPAWN_C__ +#include "galiasdef.c" diff --git a/glib/gspawn.h b/glib/gspawn.h new file mode 100644 index 0000000..9836b34 --- /dev/null +++ b/glib/gspawn.h @@ -0,0 +1,139 @@ +/* gspawn.h - Process launching + * + * Copyright 2000 Red Hat, Inc. + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, write + * to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SPAWN_H__ +#define __G_SPAWN_H__ + +#include + +G_BEGIN_DECLS + +/* I'm not sure I remember our proposed naming convention here. */ +#define G_SPAWN_ERROR g_spawn_error_quark () + +typedef enum +{ + G_SPAWN_ERROR_FORK, /* fork failed due to lack of memory */ + G_SPAWN_ERROR_READ, /* read or select on pipes failed */ + G_SPAWN_ERROR_CHDIR, /* changing to working dir failed */ + G_SPAWN_ERROR_ACCES, /* execv() returned EACCES */ + G_SPAWN_ERROR_PERM, /* execv() returned EPERM */ + G_SPAWN_ERROR_2BIG, /* execv() returned E2BIG */ + G_SPAWN_ERROR_NOEXEC, /* execv() returned ENOEXEC */ + G_SPAWN_ERROR_NAMETOOLONG, /* "" "" ENAMETOOLONG */ + G_SPAWN_ERROR_NOENT, /* "" "" ENOENT */ + G_SPAWN_ERROR_NOMEM, /* "" "" ENOMEM */ + G_SPAWN_ERROR_NOTDIR, /* "" "" ENOTDIR */ + G_SPAWN_ERROR_LOOP, /* "" "" ELOOP */ + G_SPAWN_ERROR_TXTBUSY, /* "" "" ETXTBUSY */ + G_SPAWN_ERROR_IO, /* "" "" EIO */ + G_SPAWN_ERROR_NFILE, /* "" "" ENFILE */ + G_SPAWN_ERROR_MFILE, /* "" "" EMFLE */ + G_SPAWN_ERROR_INVAL, /* "" "" EINVAL */ + G_SPAWN_ERROR_ISDIR, /* "" "" EISDIR */ + G_SPAWN_ERROR_LIBBAD, /* "" "" ELIBBAD */ + G_SPAWN_ERROR_FAILED /* other fatal failure, error->message + * should explain + */ +} GSpawnError; + +typedef void (* GSpawnChildSetupFunc) (gpointer user_data); + +typedef enum +{ + G_SPAWN_LEAVE_DESCRIPTORS_OPEN = 1 << 0, + G_SPAWN_DO_NOT_REAP_CHILD = 1 << 1, + /* look for argv[0] in the path i.e. use execvp() */ + G_SPAWN_SEARCH_PATH = 1 << 2, + /* Dump output to /dev/null */ + G_SPAWN_STDOUT_TO_DEV_NULL = 1 << 3, + G_SPAWN_STDERR_TO_DEV_NULL = 1 << 4, + G_SPAWN_CHILD_INHERITS_STDIN = 1 << 5, + G_SPAWN_FILE_AND_ARGV_ZERO = 1 << 6 +} GSpawnFlags; + +GQuark g_spawn_error_quark (void); + +#ifdef G_OS_WIN32 +#define g_spawn_async g_spawn_async_utf8 +#define g_spawn_async_with_pipes g_spawn_async_with_pipes_utf8 +#define g_spawn_sync g_spawn_sync_utf8 +#define g_spawn_command_line_sync g_spawn_command_line_sync_utf8 +#define g_spawn_command_line_async g_spawn_command_line_async_utf8 +#endif + +gboolean g_spawn_async (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + GError **error); + + +/* Opens pipes for non-NULL standard_output, standard_input, standard_error, + * and returns the parent's end of the pipes. + */ +gboolean g_spawn_async_with_pipes (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error); + + +/* If standard_output or standard_error are non-NULL, the full + * standard output or error of the command will be placed there. + */ + +gboolean g_spawn_sync (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error); + +gboolean g_spawn_command_line_sync (const gchar *command_line, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error); +gboolean g_spawn_command_line_async (const gchar *command_line, + GError **error); + +void g_spawn_close_pid (GPid pid); + +G_END_DECLS + +#endif /* __G_SPAWN_H__ */ diff --git a/glib/gstdio.c b/glib/gstdio.c new file mode 100644 index 0000000..542a95e --- /dev/null +++ b/glib/gstdio.c @@ -0,0 +1,825 @@ +/* gstdio.c - wrappers for C library functions + * + * Copyright 2004 Tor Lillqvist + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#define G_STDIO_NO_WRAP_ON_UNIX + +#include "glib.h" + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef G_OS_WIN32 +#include +#include +#include +#include +#include +#include +#else +#include +#endif + +#include "gstdio.h" + +#include "galias.h" + +#if !defined (G_OS_UNIX) && !defined (G_OS_WIN32) && !defined (G_OS_BEOS) +#error Please port this to your operating system +#endif + +#if defined (_MSC_VER) && !defined(_WIN64) +#undef _wstat +#define _wstat _wstat32 +#endif + +/** + * g_access: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @mode: as in access() + * + * A wrapper for the POSIX access() function. This function is used to + * test a pathname for one or several of read, write or execute + * permissions, or just existence. + * + * On Windows, the file protection mechanism is not at all POSIX-like, + * and the underlying function in the C library only checks the + * FAT-style READONLY attribute, and does not look at the ACL of a + * file at all. This function is this in practise almost useless on + * Windows. Software that needs to handle file permissions on Windows + * more exactly should use the Win32 API. + * + * See your C library manual for more details about access(). + * + * Returns: zero if the pathname refers to an existing file system + * object that has all the tested permissions, or -1 otherwise or on + * error. + * + * Since: 2.8 + */ +int +g_access (const gchar *filename, + int mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + +#ifndef X_OK +#define X_OK 1 +#endif + + retval = _waccess (wfilename, mode & ~X_OK); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return access (filename, mode); +#endif +} + +/** + * g_chmod: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @mode: as in chmod() + * + * A wrapper for the POSIX chmod() function. The chmod() function is + * used to set the permissions of a file system object. + * + * On Windows the file protection mechanism is not at all POSIX-like, + * and the underlying chmod() function in the C library just sets or + * clears the FAT-style READONLY attribute. It does not touch any + * ACL. Software that needs to manage file permissions on Windows + * exactly should use the Win32 API. + * + * See your C library manual for more details about chmod(). + * + * Returns: zero if the operation succeeded, -1 on error. + * + * Since: 2.8 + */ +int +g_chmod (const gchar *filename, + int mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wchmod (wfilename, mode); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return chmod (filename, mode); +#endif +} +/** + * g_open: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @flags: as in open() + * @mode: as in open() + * + * A wrapper for the POSIX open() function. The open() function is + * used to convert a pathname into a file descriptor. + * + * On POSIX systems file descriptors are implemented by the operating + * system. On Windows, it's the C library that implements open() and + * file descriptors. The actual Win32 API for opening files is quite + * different, see MSDN documentation for CreateFile(). The Win32 API + * uses file handles, which are more randomish integers, not small + * integers like file descriptors. + * + * Because file descriptors are specific to the C library on Windows, + * the file descriptor returned by this function makes sense only to + * functions in the same C library. Thus if the GLib-using code uses a + * different C library than GLib does, the file descriptor returned by + * this function cannot be passed to C library functions like write() + * or read(). + * + * See your C library manual for more details about open(). + * + * Returns: a new file descriptor, or -1 if an error occurred. The + * return value can be used exactly like the return value from open(). + * + * Since: 2.6 + */ +int +g_open (const gchar *filename, + int flags, + int mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wopen (wfilename, flags, mode); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return open (filename, flags, mode); +#endif +} + +/** + * g_creat: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @mode: as in creat() + * + * A wrapper for the POSIX creat() function. The creat() function is + * used to convert a pathname into a file descriptor, creating a file + * if necessary. + + * On POSIX systems file descriptors are implemented by the operating + * system. On Windows, it's the C library that implements creat() and + * file descriptors. The actual Windows API for opening files is + * different, see MSDN documentation for CreateFile(). The Win32 API + * uses file handles, which are more randomish integers, not small + * integers like file descriptors. + * + * Because file descriptors are specific to the C library on Windows, + * the file descriptor returned by this function makes sense only to + * functions in the same C library. Thus if the GLib-using code uses a + * different C library than GLib does, the file descriptor returned by + * this function cannot be passed to C library functions like write() + * or read(). + * + * See your C library manual for more details about creat(). + * + * Returns: a new file descriptor, or -1 if an error occurred. The + * return value can be used exactly like the return value from creat(). + * + * Since: 2.8 + */ +int +g_creat (const gchar *filename, + int mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wcreat (wfilename, mode); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return creat (filename, mode); +#endif +} + +/** + * g_rename: + * @oldfilename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @newfilename: a pathname in the GLib file name encoding + * + * A wrapper for the POSIX rename() function. The rename() function + * renames a file, moving it between directories if required. + * + * See your C library manual for more details about how rename() works + * on your system. It is not possible in general on Windows to rename + * a file that is open to some process. + * + * Returns: 0 if the renaming succeeded, -1 if an error occurred + * + * Since: 2.6 + */ +int +g_rename (const gchar *oldfilename, + const gchar *newfilename) +{ +#ifdef G_OS_WIN32 + wchar_t *woldfilename = g_utf8_to_utf16 (oldfilename, -1, NULL, NULL, NULL); + wchar_t *wnewfilename; + int retval; + int save_errno = 0; + + if (woldfilename == NULL) + { + errno = EINVAL; + return -1; + } + + wnewfilename = g_utf8_to_utf16 (newfilename, -1, NULL, NULL, NULL); + + if (wnewfilename == NULL) + { + g_free (woldfilename); + errno = EINVAL; + return -1; + } + + if (MoveFileExW (woldfilename, wnewfilename, MOVEFILE_REPLACE_EXISTING)) + retval = 0; + else + { + retval = -1; + switch (GetLastError ()) + { +#define CASE(a,b) case ERROR_##a: save_errno = b; break + CASE (FILE_NOT_FOUND, ENOENT); + CASE (PATH_NOT_FOUND, ENOENT); + CASE (ACCESS_DENIED, EACCES); + CASE (NOT_SAME_DEVICE, EXDEV); + CASE (LOCK_VIOLATION, EACCES); + CASE (SHARING_VIOLATION, EACCES); + CASE (FILE_EXISTS, EEXIST); + CASE (ALREADY_EXISTS, EEXIST); +#undef CASE + default: save_errno = EIO; + } + } + + g_free (woldfilename); + g_free (wnewfilename); + + errno = save_errno; + return retval; +#else + return rename (oldfilename, newfilename); +#endif +} + +/** + * g_mkdir: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @mode: permissions to use for the newly created directory + * + * A wrapper for the POSIX mkdir() function. The mkdir() function + * attempts to create a directory with the given name and permissions. + * The mode argument is ignored on Windows. + * + * See your C library manual for more details about mkdir(). + * + * Returns: 0 if the directory was successfully created, -1 if an error + * occurred + * + * Since: 2.6 + */ +int +g_mkdir (const gchar *filename, + int mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wmkdir (wfilename); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return mkdir (filename, mode); +#endif +} + +/** + * g_chdir: + * @path: a pathname in the GLib file name encoding (UTF-8 on Windows) + * + * A wrapper for the POSIX chdir() function. The function changes the + * current directory of the process to @path. + * + * See your C library manual for more details about chdir(). + * + * Returns: 0 on success, -1 if an error occurred. + * + * Since: 2.8 + */ +int +g_chdir (const gchar *path) +{ +#ifdef G_OS_WIN32 + wchar_t *wpath = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wpath == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wchdir (wpath); + save_errno = errno; + + g_free (wpath); + + errno = save_errno; + return retval; +#else + return chdir (path); +#endif +} + +/** + * g_stat: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @buf: a pointer to a stat struct, which + * will be filled with the file information + * + * A wrapper for the POSIX stat() function. The stat() function + * returns information about a file. On Windows the stat() function in + * the C library checks only the FAT-style READONLY attribute and does + * not look at the ACL at all. Thus on Windows the protection bits in + * the st_mode field are a fabrication of little use. + * + * See your C library manual for more details about stat(). + * + * Returns: 0 if the information was successfully retrieved, -1 if an error + * occurred + * + * Since: 2.6 + */ +int +g_stat (const gchar *filename, +#ifdef G_OS_WIN32 + struct _g_stat_struct *buf +#else + struct stat *buf +#endif + ) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + int len; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + len = wcslen (wfilename); + while (len > 0 && G_IS_DIR_SEPARATOR (wfilename[len-1])) + len--; + if (len > 0 && + (!g_path_is_absolute (filename) || len > g_path_skip_root (filename) - filename)) + wfilename[len] = '\0'; + + retval = _wstat (wfilename, buf); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return stat (filename, buf); +#endif +} + +/** + * g_lstat: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @buf: a pointer to a stat struct, which + * will be filled with the file information + * + * A wrapper for the POSIX lstat() function. The lstat() function is + * like stat() except that in the case of symbolic links, it returns + * information about the symbolic link itself and not the file that it + * refers to. If the system does not support symbolic links g_lstat() + * is identical to g_stat(). + * + * See your C library manual for more details about lstat(). + * + * Returns: 0 if the information was successfully retrieved, -1 if an error + * occurred + * + * Since: 2.6 + */ +int +g_lstat (const gchar *filename, +#ifdef G_OS_WIN32 + struct _g_stat_struct *buf +#else + struct stat *buf +#endif + ) +{ +#ifdef HAVE_LSTAT + /* This can't be Win32, so don't do the widechar dance. */ + return lstat (filename, buf); +#else + return g_stat (filename, buf); +#endif +} + +/** + * g_unlink: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * + * A wrapper for the POSIX unlink() function. The unlink() function + * deletes a name from the filesystem. If this was the last link to the + * file and no processes have it opened, the diskspace occupied by the + * file is freed. + * + * See your C library manual for more details about unlink(). Note + * that on Windows, it is in general not possible to delete files that + * are open to some process, or mapped into memory. + * + * Returns: 0 if the name was successfully deleted, -1 if an error + * occurred + * + * Since: 2.6 + */ +int +g_unlink (const gchar *filename) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wunlink (wfilename); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return unlink (filename); +#endif +} + +/** + * g_remove: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * + * A wrapper for the POSIX remove() function. The remove() function + * deletes a name from the filesystem. + * + * See your C library manual for more details about how remove() works + * on your system. On Unix, remove() removes also directories, as it + * calls unlink() for files and rmdir() for directories. On Windows, + * although remove() in the C library only works for files, this + * function tries first remove() and then if that fails rmdir(), and + * thus works for both files and directories. Note however, that on + * Windows, it is in general not possible to remove a file that is + * open to some process, or mapped into memory. + * + * If this function fails on Windows you can't infer too much from the + * errno value. rmdir() is tried regardless of what caused remove() to + * fail. Any errno value set by remove() will be overwritten by that + * set by rmdir(). + * + * Returns: 0 if the file was successfully removed, -1 if an error + * occurred + * + * Since: 2.6 + */ +int +g_remove (const gchar *filename) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wremove (wfilename); + if (retval == -1) + retval = _wrmdir (wfilename); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return remove (filename); +#endif +} + +/** + * g_rmdir: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * + * A wrapper for the POSIX rmdir() function. The rmdir() function + * deletes a directory from the filesystem. + * + * See your C library manual for more details about how rmdir() works + * on your system. + * + * Returns: 0 if the directory was successfully removed, -1 if an error + * occurred + * + * Since: 2.6 + */ +int +g_rmdir (const gchar *filename) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wrmdir (wfilename); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return rmdir (filename); +#endif +} + +/** + * g_fopen: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @mode: a string describing the mode in which the file should be + * opened + * + * A wrapper for the stdio fopen() function. The fopen() function + * opens a file and associates a new stream with it. + * + * Because file descriptors are specific to the C library on Windows, + * and a file descriptor is partof the FILE struct, the + * FILE pointer returned by this function makes sense + * only to functions in the same C library. Thus if the GLib-using + * code uses a different C library than GLib does, the + * FILE pointer returned by this function cannot be + * passed to C library functions like fprintf() or fread(). + * + * See your C library manual for more details about fopen(). + * + * Returns: A FILE pointer if the file was successfully + * opened, or %NULL if an error occurred + * + * Since: 2.6 + */ +FILE * +g_fopen (const gchar *filename, + const gchar *mode) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + wchar_t *wmode; + FILE *retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return NULL; + } + + wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL); + + if (wmode == NULL) + { + g_free (wfilename); + errno = EINVAL; + return NULL; + } + + retval = _wfopen (wfilename, wmode); + save_errno = errno; + + g_free (wfilename); + g_free (wmode); + + errno = save_errno; + return retval; +#else + return fopen (filename, mode); +#endif +} + +/** + * g_freopen: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @mode: a string describing the mode in which the file should be + * opened + * @stream: an existing stream which will be reused, or %NULL + * + * A wrapper for the POSIX freopen() function. The freopen() function + * opens a file and associates it with an existing stream. + * + * See your C library manual for more details about freopen(). + * + * Returns: A FILE pointer if the file was successfully + * opened, or %NULL if an error occurred. + * + * Since: 2.6 + */ +FILE * +g_freopen (const gchar *filename, + const gchar *mode, + FILE *stream) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + wchar_t *wmode; + FILE *retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return NULL; + } + + wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL); + + if (wmode == NULL) + { + g_free (wfilename); + errno = EINVAL; + return NULL; + } + + retval = _wfreopen (wfilename, wmode, stream); + save_errno = errno; + + g_free (wfilename); + g_free (wmode); + + errno = save_errno; + return retval; +#else + return freopen (filename, mode, stream); +#endif +} + +/** + * g_utime: + * @filename: a pathname in the GLib file name encoding (UTF-8 on Windows) + * @utb: a pointer to a struct utimbuf. + * + * A wrapper for the POSIX utime() function. The utime() function + * sets the access and modification timestamps of a file. + * + * See your C library manual for more details about how utime() works + * on your system. + * + * Returns: 0 if the operation was successful, -1 if an error + * occurred + * + * Since: 2.18 + */ +int +g_utime (const gchar *filename, + struct utimbuf *utb) +{ +#ifdef G_OS_WIN32 + wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL); + int retval; + int save_errno; + + if (wfilename == NULL) + { + errno = EINVAL; + return -1; + } + + retval = _wutime (wfilename, (struct _utimbuf*) utb); + save_errno = errno; + + g_free (wfilename); + + errno = save_errno; + return retval; +#else + return utime (filename, utb); +#endif +} + +#define __G_STDIO_C__ +#include "galiasdef.c" diff --git a/glib/gstdio.h b/glib/gstdio.h new file mode 100644 index 0000000..b61bc6b --- /dev/null +++ b/glib/gstdio.h @@ -0,0 +1,159 @@ +/* gstdio.h - GFilename wrappers for C library functions + * + * Copyright 2004 Tor Lillqvist + * + * GLib 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 of the + * License, or (at your option) any later version. + * + * GLib 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 GLib; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_STDIO_H__ +#define __G_STDIO_H__ + +#include + +#include + +G_BEGIN_DECLS + +#if defined(G_OS_UNIX) && !defined(G_STDIO_NO_WRAP_ON_UNIX) + +/* Just pass on to the system functions, so there's no potential for data + * format mismatches, especially with large file interfaces. + * A few functions can't be handled in this way, since they are not defined + * in a portable system header that we could include here. + */ + +#define g_chmod chmod +#define g_open open +#define g_creat creat +#define g_rename rename +#define g_mkdir mkdir +#define g_stat stat +#define g_lstat lstat +#define g_remove remove +#define g_fopen fopen +#define g_freopen freopen +#define g_utime utime + +int g_access (const gchar *filename, + int mode); + +int g_chdir (const gchar *path); + +int g_unlink (const gchar *filename); + +int g_rmdir (const gchar *filename); + +#else /* ! G_OS_UNIX */ + +/* Wrappers for C library functions that take pathname arguments. On + * Unix, the pathname is a file name as it literally is in the file + * system. On well-maintained systems with consistent users who know + * what they are doing and no exchange of files with others this would + * be a well-defined encoding, preferrably UTF-8. On Windows, the + * pathname is always in UTF-8, even if that is not the on-disk + * encoding, and not the encoding accepted by the C library or Win32 + * API. + */ + +int g_access (const gchar *filename, + int mode); + +int g_chmod (const gchar *filename, + int mode); + +int g_open (const gchar *filename, + int flags, + int mode); + +int g_creat (const gchar *filename, + int mode); + +int g_rename (const gchar *oldfilename, + const gchar *newfilename); + +int g_mkdir (const gchar *filename, + int mode); + +int g_chdir (const gchar *path); + +#ifdef G_OS_WIN32 + +/* The _g_stat_struct struct tag is an internal implementation detail + * and not part of the public GLib API. + */ + +#if defined (_MSC_VER) && !defined(_WIN64) + +/* Make it clear that we mean the struct with 32-bit st_size and + * 32-bit st_*time fields as that is how the 32-bit GLib DLL normally + * has been compiled. If you get a compiler warning when calling + * g_stat(), do take it seriously and make sure that the type of + * struct stat the code in GLib fills in matches the struct the type + * of struct stat you pass to g_stat(). To avoid hassle, just use the + * GIO API instead which doesn't use struct stat to get file + * attributes, . + */ +#define _g_stat_struct _stat32 + +#else + +#define _g_stat_struct _stat + +#endif + +int g_stat (const gchar *filename, + struct _g_stat_struct *buf); + +int g_lstat (const gchar *filename, + struct _g_stat_struct *buf); + +#else + +/* No _g_stat_struct used on Unix */ + +int g_stat (const gchar *filename, + struct stat *buf); + +int g_lstat (const gchar *filename, + struct stat *buf); + +#endif + +int g_unlink (const gchar *filename); + +int g_remove (const gchar *filename); + +int g_rmdir (const gchar *filename); + +FILE *g_fopen (const gchar *filename, + const gchar *mode); + +FILE *g_freopen (const gchar *filename, + const gchar *mode, + FILE *stream); + +struct utimbuf; /* Don't need the real definition of struct utimbuf when just + * including this header. + */ + +int g_utime (const gchar *filename, + struct utimbuf *utb); + +#endif /* G_OS_UNIX */ + +G_END_DECLS + +#endif /* __G_STDIO_H__ */ diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c new file mode 100644 index 0000000..8e4b226 --- /dev/null +++ b/glib/gstrfuncs.c @@ -0,0 +1,3249 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#define _GNU_SOURCE /* For stpcpy */ + +#include +#include +#include +#include +#include +#include +#include /* For tolower() */ +#if !defined (HAVE_STRSIGNAL) || !defined(NO_SYS_SIGLIST_DECL) +#include +#endif + +#include "glib.h" +#include "gprintf.h" +#include "gprintfint.h" +#include "glibintl.h" + +#include "galias.h" + +#ifdef G_OS_WIN32 +#include +#endif + +/* do not include in this place since it + * interferes with g_strsignal() on some OSes + */ + +static const guint16 ascii_table_data[256] = { + 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, + 0x004, 0x104, 0x104, 0x004, 0x104, 0x104, 0x004, 0x004, + 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, + 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, + 0x140, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, + 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, + 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, + 0x459, 0x459, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, + 0x0d0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253, + 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, + 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, + 0x253, 0x253, 0x253, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, + 0x0d0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073, + 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, + 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, + 0x073, 0x073, 0x073, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x004 + /* the upper 128 are all zeroes */ +}; + +const guint16 * const g_ascii_table = ascii_table_data; + +/** + * g_strdup: + * @str: the string to duplicate + * + * Duplicates a string. If @str is %NULL it returns %NULL. + * The returned string should be freed with g_free() + * when no longer needed. + * + * Returns: a newly-allocated copy of @str + */ +gchar* +g_strdup (const gchar *str) +{ + gchar *new_str; + gsize length; + + if (str) + { + length = strlen (str) + 1; + new_str = g_new (char, length); + memcpy (new_str, str, length); + } + else + new_str = NULL; + + return new_str; +} + +gpointer +g_memdup (gconstpointer mem, + guint byte_size) +{ + gpointer new_mem; + + if (mem) + { + new_mem = g_malloc (byte_size); + memcpy (new_mem, mem, byte_size); + } + else + new_mem = NULL; + + return new_mem; +} + +/** + * g_strndup: + * @str: the string to duplicate + * @n: the maximum number of bytes to copy from @str + * + * Duplicates the first @n bytes of a string, returning a newly-allocated + * buffer @n + 1 bytes long which will always be nul-terminated. + * If @str is less than @n bytes long the buffer is padded with nuls. + * If @str is %NULL it returns %NULL. + * The returned value should be freed when no longer needed. + * + * + * To copy a number of characters from a UTF-8 encoded string, use + * g_utf8_strncpy() instead. + * + * + * Returns: a newly-allocated buffer containing the first @n bytes + * of @str, nul-terminated + */ +gchar* +g_strndup (const gchar *str, + gsize n) +{ + gchar *new_str; + + if (str) + { + new_str = g_new (gchar, n + 1); + strncpy (new_str, str, n); + new_str[n] = '\0'; + } + else + new_str = NULL; + + return new_str; +} + +/** + * g_strnfill: + * @length: the length of the new string + * @fill_char: the byte to fill the string with + * + * Creates a new string @length bytes long filled with @fill_char. + * The returned string should be freed when no longer needed. + * + * Returns: a newly-allocated string filled the @fill_char + */ +gchar* +g_strnfill (gsize length, + gchar fill_char) +{ + gchar *str; + + str = g_new (gchar, length + 1); + memset (str, (guchar)fill_char, length); + str[length] = '\0'; + + return str; +} + +/** + * g_stpcpy: + * @dest: destination buffer. + * @src: source string. + * + * Copies a nul-terminated string into the dest buffer, include the + * trailing nul, and return a pointer to the trailing nul byte. + * This is useful for concatenating multiple strings together + * without having to repeatedly scan for the end. + * + * Return value: a pointer to trailing nul byte. + **/ +gchar * +g_stpcpy (gchar *dest, + const gchar *src) +{ +#ifdef HAVE_STPCPY + g_return_val_if_fail (dest != NULL, NULL); + g_return_val_if_fail (src != NULL, NULL); + return stpcpy (dest, src); +#else + register gchar *d = dest; + register const gchar *s = src; + + g_return_val_if_fail (dest != NULL, NULL); + g_return_val_if_fail (src != NULL, NULL); + do + *d++ = *s; + while (*s++ != '\0'); + + return d - 1; +#endif +} + +/** + * g_strdup_vprintf: + * @format: a standard printf() format string, but notice + * string precision pitfalls + * @args: the list of parameters to insert into the format string + * + * Similar to the standard C vsprintf() function but safer, since it + * calculates the maximum space required and allocates memory to hold + * the result. The returned string should be freed with g_free() when + * no longer needed. + * + * See also g_vasprintf(), which offers the same functionality, but + * additionally returns the length of the allocated string. + * + * Returns: a newly-allocated string holding the result + */ +gchar* +g_strdup_vprintf (const gchar *format, + va_list args) +{ + gchar *string = NULL; + + g_vasprintf (&string, format, args); + + return string; +} + +/** + * g_strdup_printf: + * @format: a standard printf() format string, but notice + * string precision pitfalls + * @Varargs: the parameters to insert into the format string + * + * Similar to the standard C sprintf() function but safer, since it + * calculates the maximum space required and allocates memory to hold + * the result. The returned string should be freed with g_free() when no + * longer needed. + * + * Returns: a newly-allocated string holding the result + */ +gchar* +g_strdup_printf (const gchar *format, + ...) +{ + gchar *buffer; + va_list args; + + va_start (args, format); + buffer = g_strdup_vprintf (format, args); + va_end (args); + + return buffer; +} + +/** + * g_strconcat: + * @string1: the first string to add, which must not be %NULL + * @Varargs: a %NULL-terminated list of strings to append to the string + * + * Concatenates all of the given strings into one long string. + * The returned string should be freed with g_free() when no longer needed. + * + * + * The variable argument list must end + * with %NULL. If you forget the %NULL, g_strconcat() will start appending + * random memory junk to your string. + * + * Returns: a newly-allocated string containing all the string arguments + */ +gchar* +g_strconcat (const gchar *string1, ...) +{ + gsize l; + va_list args; + gchar *s; + gchar *concat; + gchar *ptr; + + if (!string1) + return NULL; + + l = 1 + strlen (string1); + va_start (args, string1); + s = va_arg (args, gchar*); + while (s) + { + l += strlen (s); + s = va_arg (args, gchar*); + } + va_end (args); + + concat = g_new (gchar, l); + ptr = concat; + + ptr = g_stpcpy (ptr, string1); + va_start (args, string1); + s = va_arg (args, gchar*); + while (s) + { + ptr = g_stpcpy (ptr, s); + s = va_arg (args, gchar*); + } + va_end (args); + + return concat; +} + +/** + * g_strtod: + * @nptr: the string to convert to a numeric value. + * @endptr: if non-%NULL, it returns the character after + * the last character used in the conversion. + * + * Converts a string to a #gdouble value. + * It calls the standard strtod() function to handle the conversion, but + * if the string is not completely converted it attempts the conversion + * again with g_ascii_strtod(), and returns the best match. + * + * This function should seldomly be used. The normal situation when reading + * numbers not for human consumption is to use g_ascii_strtod(). Only when + * you know that you must expect both locale formatted and C formatted numbers + * should you use this. Make sure that you don't pass strings such as comma + * separated lists of values, since the commas may be interpreted as a decimal + * point in some locales, causing unexpected results. + * + * Return value: the #gdouble value. + **/ +gdouble +g_strtod (const gchar *nptr, + gchar **endptr) +{ + gchar *fail_pos_1; + gchar *fail_pos_2; + gdouble val_1; + gdouble val_2 = 0; + + g_return_val_if_fail (nptr != NULL, 0); + + fail_pos_1 = NULL; + fail_pos_2 = NULL; + + val_1 = strtod (nptr, &fail_pos_1); + + if (fail_pos_1 && fail_pos_1[0] != 0) + val_2 = g_ascii_strtod (nptr, &fail_pos_2); + + if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2) + { + if (endptr) + *endptr = fail_pos_1; + return val_1; + } + else + { + if (endptr) + *endptr = fail_pos_2; + return val_2; + } +} + +/** + * g_ascii_strtod: + * @nptr: the string to convert to a numeric value. + * @endptr: if non-%NULL, it returns the character after + * the last character used in the conversion. + * + * Converts a string to a #gdouble value. + * + * This function behaves like the standard strtod() function + * does in the C locale. It does this without actually changing + * the current locale, since that would not be thread-safe. + * A limitation of the implementation is that this function + * will still accept localized versions of infinities and NANs. + * + * This function is typically used when reading configuration + * files or other non-user input that should be locale independent. + * To handle input from the user you should normally use the + * locale-sensitive system strtod() function. + * + * To convert from a #gdouble to a string in a locale-insensitive + * way, use g_ascii_dtostr(). + * + * If the correct value would cause overflow, plus or minus %HUGE_VAL + * is returned (according to the sign of the value), and %ERANGE is + * stored in %errno. If the correct value would cause underflow, + * zero is returned and %ERANGE is stored in %errno. + * + * This function resets %errno before calling strtod() so that + * you can reliably detect overflow and underflow. + * + * Return value: the #gdouble value. + **/ +gdouble +g_ascii_strtod (const gchar *nptr, + gchar **endptr) +{ + gchar *fail_pos; + gdouble val; + struct lconv *locale_data; + const char *decimal_point; + int decimal_point_len; + const char *p, *decimal_point_pos; + const char *end = NULL; /* Silence gcc */ + int strtod_errno; + + g_return_val_if_fail (nptr != NULL, 0); + + fail_pos = NULL; + + locale_data = localeconv (); + decimal_point = locale_data->decimal_point; + decimal_point_len = strlen (decimal_point); + + g_assert (decimal_point_len != 0); + + decimal_point_pos = NULL; + end = NULL; + + if (decimal_point[0] != '.' || + decimal_point[1] != 0) + { + p = nptr; + /* Skip leading space */ + while (g_ascii_isspace (*p)) + p++; + + /* Skip leading optional sign */ + if (*p == '+' || *p == '-') + p++; + + if (p[0] == '0' && + (p[1] == 'x' || p[1] == 'X')) + { + p += 2; + /* HEX - find the (optional) decimal point */ + + while (g_ascii_isxdigit (*p)) + p++; + + if (*p == '.') + decimal_point_pos = p++; + + while (g_ascii_isxdigit (*p)) + p++; + + if (*p == 'p' || *p == 'P') + p++; + if (*p == '+' || *p == '-') + p++; + while (g_ascii_isdigit (*p)) + p++; + + end = p; + } + else if (g_ascii_isdigit (*p) || *p == '.') + { + while (g_ascii_isdigit (*p)) + p++; + + if (*p == '.') + decimal_point_pos = p++; + + while (g_ascii_isdigit (*p)) + p++; + + if (*p == 'e' || *p == 'E') + p++; + if (*p == '+' || *p == '-') + p++; + while (g_ascii_isdigit (*p)) + p++; + + end = p; + } + /* For the other cases, we need not convert the decimal point */ + } + + if (decimal_point_pos) + { + char *copy, *c; + + /* We need to convert the '.' to the locale specific decimal point */ + copy = g_malloc (end - nptr + 1 + decimal_point_len); + + c = copy; + memcpy (c, nptr, decimal_point_pos - nptr); + c += decimal_point_pos - nptr; + memcpy (c, decimal_point, decimal_point_len); + c += decimal_point_len; + memcpy (c, decimal_point_pos + 1, end - (decimal_point_pos + 1)); + c += end - (decimal_point_pos + 1); + *c = 0; + + errno = 0; + val = strtod (copy, &fail_pos); + strtod_errno = errno; + + if (fail_pos) + { + if (fail_pos - copy > decimal_point_pos - nptr) + fail_pos = (char *)nptr + (fail_pos - copy) - (decimal_point_len - 1); + else + fail_pos = (char *)nptr + (fail_pos - copy); + } + + g_free (copy); + + } + else if (end) + { + char *copy; + + copy = g_malloc (end - (char *)nptr + 1); + memcpy (copy, nptr, end - nptr); + *(copy + (end - (char *)nptr)) = 0; + + errno = 0; + val = strtod (copy, &fail_pos); + strtod_errno = errno; + + if (fail_pos) + { + fail_pos = (char *)nptr + (fail_pos - copy); + } + + g_free (copy); + } + else + { + errno = 0; + val = strtod (nptr, &fail_pos); + strtod_errno = errno; + } + + if (endptr) + *endptr = fail_pos; + + errno = strtod_errno; + + return val; +} + + +/** + * g_ascii_dtostr: + * @buffer: A buffer to place the resulting string in + * @buf_len: The length of the buffer. + * @d: The #gdouble to convert + * + * Converts a #gdouble to a string, using the '.' as + * decimal point. + * + * This functions generates enough precision that converting + * the string back using g_ascii_strtod() gives the same machine-number + * (on machines with IEEE compatible 64bit doubles). It is + * guaranteed that the size of the resulting string will never + * be larger than @G_ASCII_DTOSTR_BUF_SIZE bytes. + * + * Return value: The pointer to the buffer with the converted string. + **/ +gchar * +g_ascii_dtostr (gchar *buffer, + gint buf_len, + gdouble d) +{ + return g_ascii_formatd (buffer, buf_len, "%.17g", d); +} + +/** + * g_ascii_formatd: + * @buffer: A buffer to place the resulting string in + * @buf_len: The length of the buffer. + * @format: The printf()-style format to use for the + * code to use for converting. + * @d: The #gdouble to convert + * + * Converts a #gdouble to a string, using the '.' as + * decimal point. To format the number you pass in + * a printf()-style format string. Allowed conversion + * specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'. + * + * If you just want to want to serialize the value into a + * string, use g_ascii_dtostr(). + * + * Return value: The pointer to the buffer with the converted string. + */ +gchar * +g_ascii_formatd (gchar *buffer, + gint buf_len, + const gchar *format, + gdouble d) +{ + struct lconv *locale_data; + const char *decimal_point; + int decimal_point_len; + gchar *p; + int rest_len; + gchar format_char; + + g_return_val_if_fail (buffer != NULL, NULL); + g_return_val_if_fail (format[0] == '%', NULL); + g_return_val_if_fail (strpbrk (format + 1, "'l%") == NULL, NULL); + + format_char = format[strlen (format) - 1]; + + g_return_val_if_fail (format_char == 'e' || format_char == 'E' || + format_char == 'f' || format_char == 'F' || + format_char == 'g' || format_char == 'G', + NULL); + + if (format[0] != '%') + return NULL; + + if (strpbrk (format + 1, "'l%")) + return NULL; + + if (!(format_char == 'e' || format_char == 'E' || + format_char == 'f' || format_char == 'F' || + format_char == 'g' || format_char == 'G')) + return NULL; + + + _g_snprintf (buffer, buf_len, format, d); + + locale_data = localeconv (); + decimal_point = locale_data->decimal_point; + decimal_point_len = strlen (decimal_point); + + g_assert (decimal_point_len != 0); + + if (decimal_point[0] != '.' || + decimal_point[1] != 0) + { + p = buffer; + + while (g_ascii_isspace (*p)) + p++; + + if (*p == '+' || *p == '-') + p++; + + while (isdigit ((guchar)*p)) + p++; + + if (strncmp (p, decimal_point, decimal_point_len) == 0) + { + *p = '.'; + p++; + if (decimal_point_len > 1) + { + rest_len = strlen (p + (decimal_point_len-1)); + memmove (p, p + (decimal_point_len-1), rest_len); + p[rest_len] = 0; + } + } + } + + return buffer; +} + +static guint64 +g_parse_long_long (const gchar *nptr, + const gchar **endptr, + guint base, + gboolean *negative) +{ + /* this code is based on on the strtol(3) code from GNU libc released under + * the GNU Lesser General Public License. + * + * Copyright (C) 1991,92,94,95,96,97,98,99,2000,01,02 + * Free Software Foundation, Inc. + */ +#define ISSPACE(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || \ + (c) == '\r' || (c) == '\t' || (c) == '\v') +#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') +#define ISLOWER(c) ((c) >= 'a' && (c) <= 'z') +#define ISALPHA(c) (ISUPPER (c) || ISLOWER (c)) +#define TOUPPER(c) (ISLOWER (c) ? (c) - 'a' + 'A' : (c)) +#define TOLOWER(c) (ISUPPER (c) ? (c) - 'A' + 'a' : (c)) + gboolean overflow; + guint64 cutoff; + guint64 cutlim; + guint64 ui64; + const gchar *s, *save; + guchar c; + + g_return_val_if_fail (nptr != NULL, 0); + + *negative = FALSE; + if (base == 1 || base > 36) + { + errno = EINVAL; + if (endptr) + *endptr = nptr; + return 0; + } + + save = s = nptr; + + /* Skip white space. */ + while (ISSPACE (*s)) + ++s; + + if (G_UNLIKELY (!*s)) + goto noconv; + + /* Check for a sign. */ + if (*s == '-') + { + *negative = TRUE; + ++s; + } + else if (*s == '+') + ++s; + + /* Recognize number prefix and if BASE is zero, figure it out ourselves. */ + if (*s == '0') + { + if ((base == 0 || base == 16) && TOUPPER (s[1]) == 'X') + { + s += 2; + base = 16; + } + else if (base == 0) + base = 8; + } + else if (base == 0) + base = 10; + + /* Save the pointer so we can check later if anything happened. */ + save = s; + cutoff = G_MAXUINT64 / base; + cutlim = G_MAXUINT64 % base; + + overflow = FALSE; + ui64 = 0; + c = *s; + for (; c; c = *++s) + { + if (c >= '0' && c <= '9') + c -= '0'; + else if (ISALPHA (c)) + c = TOUPPER (c) - 'A' + 10; + else + break; + if (c >= base) + break; + /* Check for overflow. */ + if (ui64 > cutoff || (ui64 == cutoff && c > cutlim)) + overflow = TRUE; + else + { + ui64 *= base; + ui64 += c; + } + } + + /* Check if anything actually happened. */ + if (s == save) + goto noconv; + + /* Store in ENDPTR the address of one character + past the last character we converted. */ + if (endptr) + *endptr = s; + + if (G_UNLIKELY (overflow)) + { + errno = ERANGE; + return G_MAXUINT64; + } + + return ui64; + + noconv: + /* We must handle a special case here: the base is 0 or 16 and the + first two characters are '0' and 'x', but the rest are no + hexadecimal digits. This is no error case. We return 0 and + ENDPTR points to the `x`. */ + if (endptr) + { + if (save - nptr >= 2 && TOUPPER (save[-1]) == 'X' + && save[-2] == '0') + *endptr = &save[-1]; + else + /* There was no number to convert. */ + *endptr = nptr; + } + return 0; +} + +/** + * g_ascii_strtoull: + * @nptr: the string to convert to a numeric value. + * @endptr: if non-%NULL, it returns the character after + * the last character used in the conversion. + * @base: to be used for the conversion, 2..36 or 0 + * + * Converts a string to a #guint64 value. + * This function behaves like the standard strtoull() function + * does in the C locale. It does this without actually + * changing the current locale, since that would not be + * thread-safe. + * + * This function is typically used when reading configuration + * files or other non-user input that should be locale independent. + * To handle input from the user you should normally use the + * locale-sensitive system strtoull() function. + * + * If the correct value would cause overflow, %G_MAXUINT64 + * is returned, and %ERANGE is stored in %errno. If the base is + * outside the valid range, zero is returned, and %EINVAL is stored + * in %errno. If the string conversion fails, zero is returned, and + * @endptr returns @nptr (if @endptr is non-%NULL). + * + * Return value: the #guint64 value or zero on error. + * + * Since: 2.2 + */ +guint64 +g_ascii_strtoull (const gchar *nptr, + gchar **endptr, + guint base) +{ + gboolean negative; + guint64 result; + + result = g_parse_long_long (nptr, (const gchar **) endptr, base, &negative); + + /* Return the result of the appropriate sign. */ + return negative ? -result : result; +} + +/** + * g_ascii_strtoll: + * @nptr: the string to convert to a numeric value. + * @endptr: if non-%NULL, it returns the character after + * the last character used in the conversion. + * @base: to be used for the conversion, 2..36 or 0 + * + * Converts a string to a #gint64 value. + * This function behaves like the standard strtoll() function + * does in the C locale. It does this without actually + * changing the current locale, since that would not be + * thread-safe. + * + * This function is typically used when reading configuration + * files or other non-user input that should be locale independent. + * To handle input from the user you should normally use the + * locale-sensitive system strtoll() function. + * + * If the correct value would cause overflow, %G_MAXINT64 or %G_MININT64 + * is returned, and %ERANGE is stored in %errno. If the base is + * outside the valid range, zero is returned, and %EINVAL is stored + * in %errno. If the string conversion fails, zero is returned, and + * @endptr returns @nptr (if @endptr is non-%NULL). + * + * Return value: the #gint64 value or zero on error. + * + * Since: 2.12 + */ +gint64 +g_ascii_strtoll (const gchar *nptr, + gchar **endptr, + guint base) +{ + gboolean negative; + guint64 result; + + result = g_parse_long_long (nptr, (const gchar **) endptr, base, &negative); + + if (negative && result > (guint64) G_MININT64) + { + errno = ERANGE; + return G_MININT64; + } + else if (!negative && result > (guint64) G_MAXINT64) + { + errno = ERANGE; + return G_MAXINT64; + } + else if (negative) + return - (gint64) result; + else + return (gint64) result; +} + +/** + * g_strerror: + * @errnum: the system error number. See the standard C %errno + * documentation + * + * Returns a string corresponding to the given error code, e.g. + * "no such process". You should use this function in preference to + * strerror(), because it returns a string in UTF-8 encoding, and since + * not all platforms support the strerror() function. + * + * Returns: a UTF-8 string describing the error code. If the error code + * is unknown, it returns "unknown error (<code>)". The string + * can only be used until the next call to g_strerror() + */ +G_CONST_RETURN gchar* +g_strerror (gint errnum) +{ + static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT; + char *msg; + int saved_errno = errno; + +#ifdef HAVE_STRERROR + const char *msg_locale; + + msg_locale = strerror (errnum); + if (g_get_charset (NULL)) + { + errno = saved_errno; + return msg_locale; + } + else + { + gchar *msg_utf8 = g_locale_to_utf8 (msg_locale, -1, NULL, NULL, NULL); + if (msg_utf8) + { + /* Stick in the quark table so that we can return a static result + */ + GQuark msg_quark = g_quark_from_string (msg_utf8); + g_free (msg_utf8); + + msg_utf8 = (gchar *) g_quark_to_string (msg_quark); + errno = saved_errno; + return msg_utf8; + } + } +#elif NO_SYS_ERRLIST + switch (errnum) + { +#ifdef E2BIG + case E2BIG: return "argument list too long"; +#endif +#ifdef EACCES + case EACCES: return "permission denied"; +#endif +#ifdef EADDRINUSE + case EADDRINUSE: return "address already in use"; +#endif +#ifdef EADDRNOTAVAIL + case EADDRNOTAVAIL: return "can't assign requested address"; +#endif +#ifdef EADV + case EADV: return "advertise error"; +#endif +#ifdef EAFNOSUPPORT + case EAFNOSUPPORT: return "address family not supported by protocol family"; +#endif +#ifdef EAGAIN + case EAGAIN: return "try again"; +#endif +#ifdef EALIGN + case EALIGN: return "EALIGN"; +#endif +#ifdef EALREADY + case EALREADY: return "operation already in progress"; +#endif +#ifdef EBADE + case EBADE: return "bad exchange descriptor"; +#endif +#ifdef EBADF + case EBADF: return "bad file number"; +#endif +#ifdef EBADFD + case EBADFD: return "file descriptor in bad state"; +#endif +#ifdef EBADMSG + case EBADMSG: return "not a data message"; +#endif +#ifdef EBADR + case EBADR: return "bad request descriptor"; +#endif +#ifdef EBADRPC + case EBADRPC: return "RPC structure is bad"; +#endif +#ifdef EBADRQC + case EBADRQC: return "bad request code"; +#endif +#ifdef EBADSLT + case EBADSLT: return "invalid slot"; +#endif +#ifdef EBFONT + case EBFONT: return "bad font file format"; +#endif +#ifdef EBUSY + case EBUSY: return "mount device busy"; +#endif +#ifdef ECHILD + case ECHILD: return "no children"; +#endif +#ifdef ECHRNG + case ECHRNG: return "channel number out of range"; +#endif +#ifdef ECOMM + case ECOMM: return "communication error on send"; +#endif +#ifdef ECONNABORTED + case ECONNABORTED: return "software caused connection abort"; +#endif +#ifdef ECONNREFUSED + case ECONNREFUSED: return "connection refused"; +#endif +#ifdef ECONNRESET + case ECONNRESET: return "connection reset by peer"; +#endif +#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK)) + case EDEADLK: return "resource deadlock avoided"; +#endif +#if defined(EDEADLOCK) && (!defined(EDEADLK) || (EDEADLOCK != EDEADLK)) + case EDEADLOCK: return "resource deadlock avoided"; +#endif +#ifdef EDESTADDRREQ + case EDESTADDRREQ: return "destination address required"; +#endif +#ifdef EDIRTY + case EDIRTY: return "mounting a dirty fs w/o force"; +#endif +#ifdef EDOM + case EDOM: return "math argument out of range"; +#endif +#ifdef EDOTDOT + case EDOTDOT: return "cross mount point"; +#endif +#ifdef EDQUOT + case EDQUOT: return "disk quota exceeded"; +#endif +#ifdef EDUPPKG + case EDUPPKG: return "duplicate package name"; +#endif +#ifdef EEXIST + case EEXIST: return "file already exists"; +#endif +#ifdef EFAULT + case EFAULT: return "bad address in system call argument"; +#endif +#ifdef EFBIG + case EFBIG: return "file too large"; +#endif +#ifdef EHOSTDOWN + case EHOSTDOWN: return "host is down"; +#endif +#ifdef EHOSTUNREACH + case EHOSTUNREACH: return "host is unreachable"; +#endif +#ifdef EIDRM + case EIDRM: return "identifier removed"; +#endif +#ifdef EINIT + case EINIT: return "initialization error"; +#endif +#ifdef EINPROGRESS + case EINPROGRESS: return "operation now in progress"; +#endif +#ifdef EINTR + case EINTR: return "interrupted system call"; +#endif +#ifdef EINVAL + case EINVAL: return "invalid argument"; +#endif +#ifdef EIO + case EIO: return "I/O error"; +#endif +#ifdef EISCONN + case EISCONN: return "socket is already connected"; +#endif +#ifdef EISDIR + case EISDIR: return "is a directory"; +#endif +#ifdef EISNAME + case EISNAM: return "is a name file"; +#endif +#ifdef ELBIN + case ELBIN: return "ELBIN"; +#endif +#ifdef EL2HLT + case EL2HLT: return "level 2 halted"; +#endif +#ifdef EL2NSYNC + case EL2NSYNC: return "level 2 not synchronized"; +#endif +#ifdef EL3HLT + case EL3HLT: return "level 3 halted"; +#endif +#ifdef EL3RST + case EL3RST: return "level 3 reset"; +#endif +#ifdef ELIBACC + case ELIBACC: return "can not access a needed shared library"; +#endif +#ifdef ELIBBAD + case ELIBBAD: return "accessing a corrupted shared library"; +#endif +#ifdef ELIBEXEC + case ELIBEXEC: return "can not exec a shared library directly"; +#endif +#ifdef ELIBMAX + case ELIBMAX: return "attempting to link in more shared libraries than system limit"; +#endif +#ifdef ELIBSCN + case ELIBSCN: return ".lib section in a.out corrupted"; +#endif +#ifdef ELNRNG + case ELNRNG: return "link number out of range"; +#endif +#ifdef ELOOP + case ELOOP: return "too many levels of symbolic links"; +#endif +#ifdef EMFILE + case EMFILE: return "too many open files"; +#endif +#ifdef EMLINK + case EMLINK: return "too many links"; +#endif +#ifdef EMSGSIZE + case EMSGSIZE: return "message too long"; +#endif +#ifdef EMULTIHOP + case EMULTIHOP: return "multihop attempted"; +#endif +#ifdef ENAMETOOLONG + case ENAMETOOLONG: return "file name too long"; +#endif +#ifdef ENAVAIL + case ENAVAIL: return "not available"; +#endif +#ifdef ENET + case ENET: return "ENET"; +#endif +#ifdef ENETDOWN + case ENETDOWN: return "network is down"; +#endif +#ifdef ENETRESET + case ENETRESET: return "network dropped connection on reset"; +#endif +#ifdef ENETUNREACH + case ENETUNREACH: return "network is unreachable"; +#endif +#ifdef ENFILE + case ENFILE: return "file table overflow"; +#endif +#ifdef ENOANO + case ENOANO: return "anode table overflow"; +#endif +#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR)) + case ENOBUFS: return "no buffer space available"; +#endif +#ifdef ENOCSI + case ENOCSI: return "no CSI structure available"; +#endif +#ifdef ENODATA + case ENODATA: return "no data available"; +#endif +#ifdef ENODEV + case ENODEV: return "no such device"; +#endif +#ifdef ENOENT + case ENOENT: return "no such file or directory"; +#endif +#ifdef ENOEXEC + case ENOEXEC: return "exec format error"; +#endif +#ifdef ENOLCK + case ENOLCK: return "no locks available"; +#endif +#ifdef ENOLINK + case ENOLINK: return "link has be severed"; +#endif +#ifdef ENOMEM + case ENOMEM: return "not enough memory"; +#endif +#ifdef ENOMSG + case ENOMSG: return "no message of desired type"; +#endif +#ifdef ENONET + case ENONET: return "machine is not on the network"; +#endif +#ifdef ENOPKG + case ENOPKG: return "package not installed"; +#endif +#ifdef ENOPROTOOPT + case ENOPROTOOPT: return "bad proocol option"; +#endif +#ifdef ENOSPC + case ENOSPC: return "no space left on device"; +#endif +#ifdef ENOSR + case ENOSR: return "out of stream resources"; +#endif +#ifdef ENOSTR + case ENOSTR: return "not a stream device"; +#endif +#ifdef ENOSYM + case ENOSYM: return "unresolved symbol name"; +#endif +#ifdef ENOSYS + case ENOSYS: return "function not implemented"; +#endif +#ifdef ENOTBLK + case ENOTBLK: return "block device required"; +#endif +#ifdef ENOTCONN + case ENOTCONN: return "socket is not connected"; +#endif +#ifdef ENOTDIR + case ENOTDIR: return "not a directory"; +#endif +#ifdef ENOTEMPTY + case ENOTEMPTY: return "directory not empty"; +#endif +#ifdef ENOTNAM + case ENOTNAM: return "not a name file"; +#endif +#ifdef ENOTSOCK + case ENOTSOCK: return "socket operation on non-socket"; +#endif +#ifdef ENOTTY + case ENOTTY: return "inappropriate device for ioctl"; +#endif +#ifdef ENOTUNIQ + case ENOTUNIQ: return "name not unique on network"; +#endif +#ifdef ENXIO + case ENXIO: return "no such device or address"; +#endif +#ifdef EOPNOTSUPP + case EOPNOTSUPP: return "operation not supported on socket"; +#endif +#ifdef EPERM + case EPERM: return "not owner"; +#endif +#ifdef EPFNOSUPPORT + case EPFNOSUPPORT: return "protocol family not supported"; +#endif +#ifdef EPIPE + case EPIPE: return "broken pipe"; +#endif +#ifdef EPROCLIM + case EPROCLIM: return "too many processes"; +#endif +#ifdef EPROCUNAVAIL + case EPROCUNAVAIL: return "bad procedure for program"; +#endif +#ifdef EPROGMISMATCH + case EPROGMISMATCH: return "program version wrong"; +#endif +#ifdef EPROGUNAVAIL + case EPROGUNAVAIL: return "RPC program not available"; +#endif +#ifdef EPROTO + case EPROTO: return "protocol error"; +#endif +#ifdef EPROTONOSUPPORT + case EPROTONOSUPPORT: return "protocol not suppored"; +#endif +#ifdef EPROTOTYPE + case EPROTOTYPE: return "protocol wrong type for socket"; +#endif +#ifdef ERANGE + case ERANGE: return "math result unrepresentable"; +#endif +#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED)) + case EREFUSED: return "EREFUSED"; +#endif +#ifdef EREMCHG + case EREMCHG: return "remote address changed"; +#endif +#ifdef EREMDEV + case EREMDEV: return "remote device"; +#endif +#ifdef EREMOTE + case EREMOTE: return "pathname hit remote file system"; +#endif +#ifdef EREMOTEIO + case EREMOTEIO: return "remote i/o error"; +#endif +#ifdef EREMOTERELEASE + case EREMOTERELEASE: return "EREMOTERELEASE"; +#endif +#ifdef EROFS + case EROFS: return "read-only file system"; +#endif +#ifdef ERPCMISMATCH + case ERPCMISMATCH: return "RPC version is wrong"; +#endif +#ifdef ERREMOTE + case ERREMOTE: return "object is remote"; +#endif +#ifdef ESHUTDOWN + case ESHUTDOWN: return "can't send afer socket shutdown"; +#endif +#ifdef ESOCKTNOSUPPORT + case ESOCKTNOSUPPORT: return "socket type not supported"; +#endif +#ifdef ESPIPE + case ESPIPE: return "invalid seek"; +#endif +#ifdef ESRCH + case ESRCH: return "no such process"; +#endif +#ifdef ESRMNT + case ESRMNT: return "srmount error"; +#endif +#ifdef ESTALE + case ESTALE: return "stale remote file handle"; +#endif +#ifdef ESUCCESS + case ESUCCESS: return "Error 0"; +#endif +#ifdef ETIME + case ETIME: return "timer expired"; +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: return "connection timed out"; +#endif +#ifdef ETOOMANYREFS + case ETOOMANYREFS: return "too many references: can't splice"; +#endif +#ifdef ETXTBSY + case ETXTBSY: return "text file or pseudo-device busy"; +#endif +#ifdef EUCLEAN + case EUCLEAN: return "structure needs cleaning"; +#endif +#ifdef EUNATCH + case EUNATCH: return "protocol driver not attached"; +#endif +#ifdef EUSERS + case EUSERS: return "too many users"; +#endif +#ifdef EVERSION + case EVERSION: return "version mismatch"; +#endif +#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) + case EWOULDBLOCK: return "operation would block"; +#endif +#ifdef EXDEV + case EXDEV: return "cross-domain link"; +#endif +#ifdef EXFULL + case EXFULL: return "message tables full"; +#endif + } +#else /* NO_SYS_ERRLIST */ + extern int sys_nerr; + extern char *sys_errlist[]; + + if ((errnum > 0) && (errnum <= sys_nerr)) + return sys_errlist [errnum]; +#endif /* NO_SYS_ERRLIST */ + + msg = g_static_private_get (&msg_private); + if (!msg) + { + msg = g_new (gchar, 64); + g_static_private_set (&msg_private, msg, g_free); + } + + _g_sprintf (msg, "unknown error (%d)", errnum); + + errno = saved_errno; + return msg; +} + +/** + * g_strsignal: + * @signum: the signal number. See the signal + * documentation + * + * Returns a string describing the given signal, e.g. "Segmentation fault". + * You should use this function in preference to strsignal(), because it + * returns a string in UTF-8 encoding, and since not all platforms support + * the strsignal() function. + * + * Returns: a UTF-8 string describing the signal. If the signal is unknown, + * it returns "unknown signal (<signum>)". The string can only be + * used until the next call to g_strsignal() + */ +G_CONST_RETURN gchar* +g_strsignal (gint signum) +{ + static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT; + char *msg; + +#ifdef HAVE_STRSIGNAL + const char *msg_locale; + +#if defined(G_OS_BEOS) || defined(G_WITH_CYGWIN) +extern const char *strsignal(int); +#else + /* this is declared differently (const) in string.h on BeOS */ + extern char *strsignal (int sig); +#endif /* !G_OS_BEOS && !G_WITH_CYGWIN */ + msg_locale = strsignal (signum); + if (g_get_charset (NULL)) + return msg_locale; + else + { + gchar *msg_utf8 = g_locale_to_utf8 (msg_locale, -1, NULL, NULL, NULL); + if (msg_utf8) + { + /* Stick in the quark table so that we can return a static result + */ + GQuark msg_quark = g_quark_from_string (msg_utf8); + g_free (msg_utf8); + + return g_quark_to_string (msg_quark); + } + } +#elif NO_SYS_SIGLIST + switch (signum) + { +#ifdef SIGHUP + case SIGHUP: return "Hangup"; +#endif +#ifdef SIGINT + case SIGINT: return "Interrupt"; +#endif +#ifdef SIGQUIT + case SIGQUIT: return "Quit"; +#endif +#ifdef SIGILL + case SIGILL: return "Illegal instruction"; +#endif +#ifdef SIGTRAP + case SIGTRAP: return "Trace/breakpoint trap"; +#endif +#ifdef SIGABRT + case SIGABRT: return "IOT trap/Abort"; +#endif +#ifdef SIGBUS + case SIGBUS: return "Bus error"; +#endif +#ifdef SIGFPE + case SIGFPE: return "Floating point exception"; +#endif +#ifdef SIGKILL + case SIGKILL: return "Killed"; +#endif +#ifdef SIGUSR1 + case SIGUSR1: return "User defined signal 1"; +#endif +#ifdef SIGSEGV + case SIGSEGV: return "Segmentation fault"; +#endif +#ifdef SIGUSR2 + case SIGUSR2: return "User defined signal 2"; +#endif +#ifdef SIGPIPE + case SIGPIPE: return "Broken pipe"; +#endif +#ifdef SIGALRM + case SIGALRM: return "Alarm clock"; +#endif +#ifdef SIGTERM + case SIGTERM: return "Terminated"; +#endif +#ifdef SIGSTKFLT + case SIGSTKFLT: return "Stack fault"; +#endif +#ifdef SIGCHLD + case SIGCHLD: return "Child exited"; +#endif +#ifdef SIGCONT + case SIGCONT: return "Continued"; +#endif +#ifdef SIGSTOP + case SIGSTOP: return "Stopped (signal)"; +#endif +#ifdef SIGTSTP + case SIGTSTP: return "Stopped"; +#endif +#ifdef SIGTTIN + case SIGTTIN: return "Stopped (tty input)"; +#endif +#ifdef SIGTTOU + case SIGTTOU: return "Stopped (tty output)"; +#endif +#ifdef SIGURG + case SIGURG: return "Urgent condition"; +#endif +#ifdef SIGXCPU + case SIGXCPU: return "CPU time limit exceeded"; +#endif +#ifdef SIGXFSZ + case SIGXFSZ: return "File size limit exceeded"; +#endif +#ifdef SIGVTALRM + case SIGVTALRM: return "Virtual time alarm"; +#endif +#ifdef SIGPROF + case SIGPROF: return "Profile signal"; +#endif +#ifdef SIGWINCH + case SIGWINCH: return "Window size changed"; +#endif +#ifdef SIGIO + case SIGIO: return "Possible I/O"; +#endif +#ifdef SIGPWR + case SIGPWR: return "Power failure"; +#endif +#ifdef SIGUNUSED + case SIGUNUSED: return "Unused signal"; +#endif + } +#else /* NO_SYS_SIGLIST */ + +#ifdef NO_SYS_SIGLIST_DECL + extern char *sys_siglist[]; /*(see Tue Jan 19 00:44:24 1999 in changelog)*/ +#endif + + return (char*) /* this function should return const --josh */ sys_siglist [signum]; +#endif /* NO_SYS_SIGLIST */ + + msg = g_static_private_get (&msg_private); + if (!msg) + { + msg = g_new (gchar, 64); + g_static_private_set (&msg_private, msg, g_free); + } + + _g_sprintf (msg, "unknown signal (%d)", signum); + + return msg; +} + +/* Functions g_strlcpy and g_strlcat were originally developed by + * Todd C. Miller to simplify writing secure code. + * See ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3 + * for more information. + */ + +#ifdef HAVE_STRLCPY +/* Use the native ones, if available; they might be implemented in assembly */ +gsize +g_strlcpy (gchar *dest, + const gchar *src, + gsize dest_size) +{ + g_return_val_if_fail (dest != NULL, 0); + g_return_val_if_fail (src != NULL, 0); + + return strlcpy (dest, src, dest_size); +} + +gsize +g_strlcat (gchar *dest, + const gchar *src, + gsize dest_size) +{ + g_return_val_if_fail (dest != NULL, 0); + g_return_val_if_fail (src != NULL, 0); + + return strlcat (dest, src, dest_size); +} + +#else /* ! HAVE_STRLCPY */ +/** + * g_strlcpy: + * @dest: destination buffer + * @src: source buffer + * @dest_size: length of @dest in bytes + * + * Portability wrapper that calls strlcpy() on systems which have it, + * and emulates strlcpy() otherwise. Copies @src to @dest; @dest is + * guaranteed to be nul-terminated; @src must be nul-terminated; + * @dest_size is the buffer size, not the number of chars to copy. + * + * At most dest_size - 1 characters will be copied. Always nul-terminates + * (unless dest_size == 0). This function does not + * allocate memory. Unlike strncpy(), this function doesn't pad dest (so + * it's often faster). It returns the size of the attempted result, + * strlen (src), so if @retval >= @dest_size, truncation occurred. + * + * Caveat: strlcpy() is supposedly more secure than + * strcpy() or strncpy(), but if you really want to avoid screwups, + * g_strdup() is an even better idea. + * + * Returns: length of @src + */ +gsize +g_strlcpy (gchar *dest, + const gchar *src, + gsize dest_size) +{ + register gchar *d = dest; + register const gchar *s = src; + register gsize n = dest_size; + + g_return_val_if_fail (dest != NULL, 0); + g_return_val_if_fail (src != NULL, 0); + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) + do + { + register gchar c = *s++; + + *d++ = c; + if (c == 0) + break; + } + while (--n != 0); + + /* If not enough room in dest, add NUL and traverse rest of src */ + if (n == 0) + { + if (dest_size != 0) + *d = 0; + while (*s++) + ; + } + + return s - src - 1; /* count does not include NUL */ +} + +/** + * g_strlcat: + * @dest: destination buffer, already containing one nul-terminated string + * @src: source buffer + * @dest_size: length of @dest buffer in bytes (not length of existing string + * inside @dest) + * + * Portability wrapper that calls strlcat() on systems which have it, + * and emulates it otherwise. Appends nul-terminated @src string to @dest, + * guaranteeing nul-termination for @dest. The total size of @dest won't + * exceed @dest_size. + * + * At most dest_size - 1 characters will be copied. + * Unlike strncat, dest_size is the full size of dest, not the space left over. + * This function does NOT allocate memory. + * This always NUL terminates (unless siz == 0 or there were no NUL characters + * in the dest_size characters of dest to start with). + * + * Caveat: this is supposedly a more secure alternative to + * strcat() or strncat(), but for real security g_strconcat() is harder + * to mess up. + * + * Returns size of attempted result, which is + * MIN (dest_size, strlen (original dest)) + strlen (src), + * so if retval >= dest_size, truncation occurred. + */ +gsize +g_strlcat (gchar *dest, + const gchar *src, + gsize dest_size) +{ + register gchar *d = dest; + register const gchar *s = src; + register gsize bytes_left = dest_size; + gsize dlength; /* Logically, MIN (strlen (d), dest_size) */ + + g_return_val_if_fail (dest != NULL, 0); + g_return_val_if_fail (src != NULL, 0); + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (*d != 0 && bytes_left-- != 0) + d++; + dlength = d - dest; + bytes_left = dest_size - dlength; + + if (bytes_left == 0) + return dlength + strlen (s); + + while (*s != 0) + { + if (bytes_left != 1) + { + *d++ = *s; + bytes_left--; + } + s++; + } + *d = 0; + + return dlength + (s - src); /* count does not include NUL */ +} +#endif /* ! HAVE_STRLCPY */ + +/** + * g_ascii_strdown: + * @str: a string. + * @len: length of @str in bytes, or -1 if @str is nul-terminated. + * + * Converts all upper case ASCII letters to lower case ASCII letters. + * + * Return value: a newly-allocated string, with all the upper case + * characters in @str converted to lower case, with + * semantics that exactly match g_ascii_tolower(). (Note + * that this is unlike the old g_strdown(), which modified + * the string in place.) + **/ +gchar* +g_ascii_strdown (const gchar *str, + gssize len) +{ + gchar *result, *s; + + g_return_val_if_fail (str != NULL, NULL); + + if (len < 0) + len = strlen (str); + + result = g_strndup (str, len); + for (s = result; *s; s++) + *s = g_ascii_tolower (*s); + + return result; +} + +/** + * g_ascii_strup: + * @str: a string. + * @len: length of @str in bytes, or -1 if @str is nul-terminated. + * + * Converts all lower case ASCII letters to upper case ASCII letters. + * + * Return value: a newly allocated string, with all the lower case + * characters in @str converted to upper case, with + * semantics that exactly match g_ascii_toupper(). (Note + * that this is unlike the old g_strup(), which modified + * the string in place.) + **/ +gchar* +g_ascii_strup (const gchar *str, + gssize len) +{ + gchar *result, *s; + + g_return_val_if_fail (str != NULL, NULL); + + if (len < 0) + len = strlen (str); + + result = g_strndup (str, len); + for (s = result; *s; s++) + *s = g_ascii_toupper (*s); + + return result; +} + +/** + * g_strdown: + * @string: the string to convert. + * + * Converts a string to lower case. + * + * Return value: the string + * + * Deprecated:2.2: This function is totally broken for the reasons discussed + * in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown() + * instead. + **/ +gchar* +g_strdown (gchar *string) +{ + register guchar *s; + + g_return_val_if_fail (string != NULL, NULL); + + s = (guchar *) string; + + while (*s) + { + if (isupper (*s)) + *s = tolower (*s); + s++; + } + + return (gchar *) string; +} + +/** + * g_strup: + * @string: the string to convert. + * + * Converts a string to upper case. + * + * Return value: the string + * + * Deprecated:2.2: This function is totally broken for the reasons discussed + * in the g_strncasecmp() docs - use g_ascii_strup() or g_utf8_strup() instead. + **/ +gchar* +g_strup (gchar *string) +{ + register guchar *s; + + g_return_val_if_fail (string != NULL, NULL); + + s = (guchar *) string; + + while (*s) + { + if (islower (*s)) + *s = toupper (*s); + s++; + } + + return (gchar *) string; +} + +/** + * g_strreverse: + * @string: the string to reverse + * + * Reverses all of the bytes in a string. For example, + * g_strreverse ("abcdef") will result + * in "fedcba". + * + * Note that g_strreverse() doesn't work on UTF-8 strings + * containing multibyte characters. For that purpose, use + * g_utf8_strreverse(). + * + * Returns: the same pointer passed in as @string + */ +gchar* +g_strreverse (gchar *string) +{ + g_return_val_if_fail (string != NULL, NULL); + + if (*string) + { + register gchar *h, *t; + + h = string; + t = string + strlen (string) - 1; + + while (h < t) + { + register gchar c; + + c = *h; + *h = *t; + h++; + *t = c; + t--; + } + } + + return string; +} + +/** + * g_ascii_tolower: + * @c: any character. + * + * Convert a character to ASCII lower case. + * + * Unlike the standard C library tolower() function, this only + * recognizes standard ASCII letters and ignores the locale, returning + * all non-ASCII characters unchanged, even if they are lower case + * letters in a particular character set. Also unlike the standard + * library function, this takes and returns a char, not an int, so + * don't call it on %EOF but no need to worry about casting to #guchar + * before passing a possibly non-ASCII character in. + * + * Return value: the result of converting @c to lower case. + * If @c is not an ASCII upper case letter, + * @c is returned unchanged. + **/ +gchar +g_ascii_tolower (gchar c) +{ + return g_ascii_isupper (c) ? c - 'A' + 'a' : c; +} + +/** + * g_ascii_toupper: + * @c: any character. + * + * Convert a character to ASCII upper case. + * + * Unlike the standard C library toupper() function, this only + * recognizes standard ASCII letters and ignores the locale, returning + * all non-ASCII characters unchanged, even if they are upper case + * letters in a particular character set. Also unlike the standard + * library function, this takes and returns a char, not an int, so + * don't call it on %EOF but no need to worry about casting to #guchar + * before passing a possibly non-ASCII character in. + * + * Return value: the result of converting @c to upper case. + * If @c is not an ASCII lower case letter, + * @c is returned unchanged. + **/ +gchar +g_ascii_toupper (gchar c) +{ + return g_ascii_islower (c) ? c - 'a' + 'A' : c; +} + +/** + * g_ascii_digit_value: + * @c: an ASCII character. + * + * Determines the numeric value of a character as a decimal + * digit. Differs from g_unichar_digit_value() because it takes + * a char, so there's no worry about sign extension if characters + * are signed. + * + * Return value: If @c is a decimal digit (according to + * g_ascii_isdigit()), its numeric value. Otherwise, -1. + **/ +int +g_ascii_digit_value (gchar c) +{ + if (g_ascii_isdigit (c)) + return c - '0'; + return -1; +} + +/** + * g_ascii_xdigit_value: + * @c: an ASCII character. + * + * Determines the numeric value of a character as a hexidecimal + * digit. Differs from g_unichar_xdigit_value() because it takes + * a char, so there's no worry about sign extension if characters + * are signed. + * + * Return value: If @c is a hex digit (according to + * g_ascii_isxdigit()), its numeric value. Otherwise, -1. + **/ +int +g_ascii_xdigit_value (gchar c) +{ + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + return g_ascii_digit_value (c); +} + +/** + * g_ascii_strcasecmp: + * @s1: string to compare with @s2. + * @s2: string to compare with @s1. + * + * Compare two strings, ignoring the case of ASCII characters. + * + * Unlike the BSD strcasecmp() function, this only recognizes standard + * ASCII letters and ignores the locale, treating all non-ASCII + * bytes as if they are not letters. + * + * This function should be used only on strings that are known to be + * in encodings where the bytes corresponding to ASCII letters always + * represent themselves. This includes UTF-8 and the ISO-8859-* + * charsets, but not for instance double-byte encodings like the + * Windows Codepage 932, where the trailing bytes of double-byte + * characters include all ASCII letters. If you compare two CP932 + * strings using this function, you will get false matches. + * + * Return value: 0 if the strings match, a negative value if @s1 < @s2, + * or a positive value if @s1 > @s2. + **/ +gint +g_ascii_strcasecmp (const gchar *s1, + const gchar *s2) +{ + gint c1, c2; + + g_return_val_if_fail (s1 != NULL, 0); + g_return_val_if_fail (s2 != NULL, 0); + + while (*s1 && *s2) + { + c1 = (gint)(guchar) TOLOWER (*s1); + c2 = (gint)(guchar) TOLOWER (*s2); + if (c1 != c2) + return (c1 - c2); + s1++; s2++; + } + + return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); +} + +/** + * g_ascii_strncasecmp: + * @s1: string to compare with @s2. + * @s2: string to compare with @s1. + * @n: number of characters to compare. + * + * Compare @s1 and @s2, ignoring the case of ASCII characters and any + * characters after the first @n in each string. + * + * Unlike the BSD strcasecmp() function, this only recognizes standard + * ASCII letters and ignores the locale, treating all non-ASCII + * characters as if they are not letters. + * + * The same warning as in g_ascii_strcasecmp() applies: Use this + * function only on strings known to be in encodings where bytes + * corresponding to ASCII letters always represent themselves. + * + * Return value: 0 if the strings match, a negative value if @s1 < @s2, + * or a positive value if @s1 > @s2. + **/ +gint +g_ascii_strncasecmp (const gchar *s1, + const gchar *s2, + gsize n) +{ + gint c1, c2; + + g_return_val_if_fail (s1 != NULL, 0); + g_return_val_if_fail (s2 != NULL, 0); + + while (n && *s1 && *s2) + { + n -= 1; + c1 = (gint)(guchar) TOLOWER (*s1); + c2 = (gint)(guchar) TOLOWER (*s2); + if (c1 != c2) + return (c1 - c2); + s1++; s2++; + } + + if (n) + return (((gint) (guchar) *s1) - ((gint) (guchar) *s2)); + else + return 0; +} + +/** + * g_strcasecmp: + * @s1: a string. + * @s2: a string to compare with @s1. + * + * A case-insensitive string comparison, corresponding to the standard + * strcasecmp() function on platforms which support it. + * + * Return value: 0 if the strings match, a negative value if @s1 < @s2, + * or a positive value if @s1 > @s2. + * + * Deprecated:2.2: See g_strncasecmp() for a discussion of why this function + * is deprecated and how to replace it. + **/ +gint +g_strcasecmp (const gchar *s1, + const gchar *s2) +{ +#ifdef HAVE_STRCASECMP + g_return_val_if_fail (s1 != NULL, 0); + g_return_val_if_fail (s2 != NULL, 0); + + return strcasecmp (s1, s2); +#else + gint c1, c2; + + g_return_val_if_fail (s1 != NULL, 0); + g_return_val_if_fail (s2 != NULL, 0); + + while (*s1 && *s2) + { + /* According to A. Cox, some platforms have islower's that + * don't work right on non-uppercase + */ + c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; + c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; + if (c1 != c2) + return (c1 - c2); + s1++; s2++; + } + + return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); +#endif +} + +/** + * g_strncasecmp: + * @s1: a string. + * @s2: a string to compare with @s1. + * @n: the maximum number of characters to compare. + * + * A case-insensitive string comparison, corresponding to the standard + * strncasecmp() function on platforms which support it. + * It is similar to g_strcasecmp() except it only compares the first @n + * characters of the strings. + * + * Return value: 0 if the strings match, a negative value if @s1 < @s2, + * or a positive value if @s1 > @s2. + * + * Deprecated:2.2: The problem with g_strncasecmp() is that it does the + * comparison by calling toupper()/tolower(). These functions are + * locale-specific and operate on single bytes. However, it is impossible + * to handle things correctly from an I18N standpoint by operating on + * bytes, since characters may be multibyte. Thus g_strncasecmp() is + * broken if your string is guaranteed to be ASCII, since it's + * locale-sensitive, and it's broken if your string is localized, since + * it doesn't work on many encodings at all, including UTF-8, EUC-JP, + * etc. + * + * There are therefore two replacement functions: g_ascii_strncasecmp(), + * which only works on ASCII and is not locale-sensitive, and + * g_utf8_casefold(), which is good for case-insensitive sorting of UTF-8. + **/ +gint +g_strncasecmp (const gchar *s1, + const gchar *s2, + guint n) +{ +#ifdef HAVE_STRNCASECMP + return strncasecmp (s1, s2, n); +#else + gint c1, c2; + + g_return_val_if_fail (s1 != NULL, 0); + g_return_val_if_fail (s2 != NULL, 0); + + while (n && *s1 && *s2) + { + n -= 1; + /* According to A. Cox, some platforms have islower's that + * don't work right on non-uppercase + */ + c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; + c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; + if (c1 != c2) + return (c1 - c2); + s1++; s2++; + } + + if (n) + return (((gint) (guchar) *s1) - ((gint) (guchar) *s2)); + else + return 0; +#endif +} + +gchar* +g_strdelimit (gchar *string, + const gchar *delimiters, + gchar new_delim) +{ + register gchar *c; + + g_return_val_if_fail (string != NULL, NULL); + + if (!delimiters) + delimiters = G_STR_DELIMITERS; + + for (c = string; *c; c++) + { + if (strchr (delimiters, *c)) + *c = new_delim; + } + + return string; +} + +gchar* +g_strcanon (gchar *string, + const gchar *valid_chars, + gchar substitutor) +{ + register gchar *c; + + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (valid_chars != NULL, NULL); + + for (c = string; *c; c++) + { + if (!strchr (valid_chars, *c)) + *c = substitutor; + } + + return string; +} + +gchar* +g_strcompress (const gchar *source) +{ + const gchar *p = source, *octal; + gchar *dest = g_malloc (strlen (source) + 1); + gchar *q = dest; + + while (*p) + { + if (*p == '\\') + { + p++; + switch (*p) + { + case '\0': + g_warning ("g_strcompress: trailing \\"); + goto out; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + *q = 0; + octal = p; + while ((p < octal + 3) && (*p >= '0') && (*p <= '7')) + { + *q = (*q * 8) + (*p - '0'); + p++; + } + q++; + p--; + break; + case 'b': + *q++ = '\b'; + break; + case 'f': + *q++ = '\f'; + break; + case 'n': + *q++ = '\n'; + break; + case 'r': + *q++ = '\r'; + break; + case 't': + *q++ = '\t'; + break; + default: /* Also handles \" and \\ */ + *q++ = *p; + break; + } + } + else + *q++ = *p; + p++; + } +out: + *q = 0; + + return dest; +} + +gchar * +g_strescape (const gchar *source, + const gchar *exceptions) +{ + const guchar *p; + gchar *dest; + gchar *q; + guchar excmap[256]; + + g_return_val_if_fail (source != NULL, NULL); + + p = (guchar *) source; + /* Each source byte needs maximally four destination chars (\777) */ + q = dest = g_malloc (strlen (source) * 4 + 1); + + memset (excmap, 0, 256); + if (exceptions) + { + guchar *e = (guchar *) exceptions; + + while (*e) + { + excmap[*e] = 1; + e++; + } + } + + while (*p) + { + if (excmap[*p]) + *q++ = *p; + else + { + switch (*p) + { + case '\b': + *q++ = '\\'; + *q++ = 'b'; + break; + case '\f': + *q++ = '\\'; + *q++ = 'f'; + break; + case '\n': + *q++ = '\\'; + *q++ = 'n'; + break; + case '\r': + *q++ = '\\'; + *q++ = 'r'; + break; + case '\t': + *q++ = '\\'; + *q++ = 't'; + break; + case '\\': + *q++ = '\\'; + *q++ = '\\'; + break; + case '"': + *q++ = '\\'; + *q++ = '"'; + break; + default: + if ((*p < ' ') || (*p >= 0177)) + { + *q++ = '\\'; + *q++ = '0' + (((*p) >> 6) & 07); + *q++ = '0' + (((*p) >> 3) & 07); + *q++ = '0' + ((*p) & 07); + } + else + *q++ = *p; + break; + } + } + p++; + } + *q = 0; + return dest; +} + +gchar* +g_strchug (gchar *string) +{ + guchar *start; + + g_return_val_if_fail (string != NULL, NULL); + + for (start = (guchar*) string; *start && g_ascii_isspace (*start); start++) + ; + + g_memmove (string, start, strlen ((gchar *) start) + 1); + + return string; +} + +gchar* +g_strchomp (gchar *string) +{ + gsize len; + + g_return_val_if_fail (string != NULL, NULL); + + len = strlen (string); + while (len--) + { + if (g_ascii_isspace ((guchar) string[len])) + string[len] = '\0'; + else + break; + } + + return string; +} + +/** + * g_strsplit: + * @string: a string to split. + * @delimiter: a string which specifies the places at which to split the string. + * The delimiter is not included in any of the resulting strings, unless + * @max_tokens is reached. + * @max_tokens: the maximum number of pieces to split @string into. If this is + * less than 1, the string is split completely. + * + * Splits a string into a maximum of @max_tokens pieces, using the given + * @delimiter. If @max_tokens is reached, the remainder of @string is appended + * to the last token. + * + * As a special case, the result of splitting the empty string "" is an empty + * vector, not a vector containing a single string. The reason for this + * special case is that being able to represent a empty vector is typically + * more useful than consistent handling of empty elements. If you do need + * to represent empty elements, you'll need to check for the empty string + * before calling g_strsplit(). + * + * Return value: a newly-allocated %NULL-terminated array of strings. Use + * g_strfreev() to free it. + **/ +gchar** +g_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens) +{ + GSList *string_list = NULL, *slist; + gchar **str_array, *s; + guint n = 0; + const gchar *remainder; + + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (delimiter != NULL, NULL); + g_return_val_if_fail (delimiter[0] != '\0', NULL); + + if (max_tokens < 1) + max_tokens = G_MAXINT; + + remainder = string; + s = strstr (remainder, delimiter); + if (s) + { + gsize delimiter_len = strlen (delimiter); + + while (--max_tokens && s) + { + gsize len; + + len = s - remainder; + string_list = g_slist_prepend (string_list, + g_strndup (remainder, len)); + n++; + remainder = s + delimiter_len; + s = strstr (remainder, delimiter); + } + } + if (*string) + { + n++; + string_list = g_slist_prepend (string_list, g_strdup (remainder)); + } + + str_array = g_new (gchar*, n + 1); + + str_array[n--] = NULL; + for (slist = string_list; slist; slist = slist->next) + str_array[n--] = slist->data; + + g_slist_free (string_list); + + return str_array; +} + +/** + * g_strsplit_set: + * @string: The string to be tokenized + * @delimiters: A nul-terminated string containing bytes that are used + * to split the string. + * @max_tokens: The maximum number of tokens to split @string into. + * If this is less than 1, the string is split completely + * + * Splits @string into a number of tokens not containing any of the characters + * in @delimiter. A token is the (possibly empty) longest string that does not + * contain any of the characters in @delimiters. If @max_tokens is reached, the + * remainder is appended to the last token. + * + * For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a + * %NULL-terminated vector containing the three strings "abc", "def", + * and "ghi". + * + * The result if g_strsplit_set (":def/ghi:", ":/", -1) is a %NULL-terminated + * vector containing the four strings "", "def", "ghi", and "". + * + * As a special case, the result of splitting the empty string "" is an empty + * vector, not a vector containing a single string. The reason for this + * special case is that being able to represent a empty vector is typically + * more useful than consistent handling of empty elements. If you do need + * to represent empty elements, you'll need to check for the empty string + * before calling g_strsplit_set(). + * + * Note that this function works on bytes not characters, so it can't be used + * to delimit UTF-8 strings for anything but ASCII characters. + * + * Return value: a newly-allocated %NULL-terminated array of strings. Use + * g_strfreev() to free it. + * + * Since: 2.4 + **/ +gchar ** +g_strsplit_set (const gchar *string, + const gchar *delimiters, + gint max_tokens) +{ + gboolean delim_table[256]; + GSList *tokens, *list; + gint n_tokens; + const gchar *s; + const gchar *current; + gchar *token; + gchar **result; + + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (delimiters != NULL, NULL); + + if (max_tokens < 1) + max_tokens = G_MAXINT; + + if (*string == '\0') + { + result = g_new (char *, 1); + result[0] = NULL; + return result; + } + + memset (delim_table, FALSE, sizeof (delim_table)); + for (s = delimiters; *s != '\0'; ++s) + delim_table[*(guchar *)s] = TRUE; + + tokens = NULL; + n_tokens = 0; + + s = current = string; + while (*s != '\0') + { + if (delim_table[*(guchar *)s] && n_tokens + 1 < max_tokens) + { + token = g_strndup (current, s - current); + tokens = g_slist_prepend (tokens, token); + ++n_tokens; + + current = s + 1; + } + + ++s; + } + + token = g_strndup (current, s - current); + tokens = g_slist_prepend (tokens, token); + ++n_tokens; + + result = g_new (gchar *, n_tokens + 1); + + result[n_tokens] = NULL; + for (list = tokens; list != NULL; list = list->next) + result[--n_tokens] = list->data; + + g_slist_free (tokens); + + return result; +} + +/** + * g_strfreev: + * @str_array: a %NULL-terminated array of strings to free. + + * Frees a %NULL-terminated array of strings, and the array itself. + * If called on a %NULL value, g_strfreev() simply returns. + **/ +void +g_strfreev (gchar **str_array) +{ + if (str_array) + { + int i; + + for (i = 0; str_array[i] != NULL; i++) + g_free (str_array[i]); + + g_free (str_array); + } +} + +/** + * g_strdupv: + * @str_array: %NULL-terminated array of strings. + * + * Copies %NULL-terminated array of strings. The copy is a deep copy; + * the new array should be freed by first freeing each string, then + * the array itself. g_strfreev() does this for you. If called + * on a %NULL value, g_strdupv() simply returns %NULL. + * + * Return value: a new %NULL-terminated array of strings. + **/ +gchar** +g_strdupv (gchar **str_array) +{ + if (str_array) + { + gint i; + gchar **retval; + + i = 0; + while (str_array[i]) + ++i; + + retval = g_new (gchar*, i + 1); + + i = 0; + while (str_array[i]) + { + retval[i] = g_strdup (str_array[i]); + ++i; + } + retval[i] = NULL; + + return retval; + } + else + return NULL; +} + +/** + * g_strjoinv: + * @separator: a string to insert between each of the strings, or %NULL + * @str_array: a %NULL-terminated array of strings to join + * + * Joins a number of strings together to form one long string, with the + * optional @separator inserted between each of them. The returned string + * should be freed with g_free(). + * + * Returns: a newly-allocated string containing all of the strings joined + * together, with @separator between them + */ +gchar* +g_strjoinv (const gchar *separator, + gchar **str_array) +{ + gchar *string; + gchar *ptr; + + g_return_val_if_fail (str_array != NULL, NULL); + + if (separator == NULL) + separator = ""; + + if (*str_array) + { + gint i; + gsize len; + gsize separator_len; + + separator_len = strlen (separator); + /* First part, getting length */ + len = 1 + strlen (str_array[0]); + for (i = 1; str_array[i] != NULL; i++) + len += strlen (str_array[i]); + len += separator_len * (i - 1); + + /* Second part, building string */ + string = g_new (gchar, len); + ptr = g_stpcpy (string, *str_array); + for (i = 1; str_array[i] != NULL; i++) + { + ptr = g_stpcpy (ptr, separator); + ptr = g_stpcpy (ptr, str_array[i]); + } + } + else + string = g_strdup (""); + + return string; +} + +/** + * g_strjoin: + * @separator: a string to insert between each of the strings, or %NULL + * @Varargs: a %NULL-terminated list of strings to join + * + * Joins a number of strings together to form one long string, with the + * optional @separator inserted between each of them. The returned string + * should be freed with g_free(). + * + * Returns: a newly-allocated string containing all of the strings joined + * together, with @separator between them + */ +gchar* +g_strjoin (const gchar *separator, + ...) +{ + gchar *string, *s; + va_list args; + gsize len; + gsize separator_len; + gchar *ptr; + + if (separator == NULL) + separator = ""; + + separator_len = strlen (separator); + + va_start (args, separator); + + s = va_arg (args, gchar*); + + if (s) + { + /* First part, getting length */ + len = 1 + strlen (s); + + s = va_arg (args, gchar*); + while (s) + { + len += separator_len + strlen (s); + s = va_arg (args, gchar*); + } + va_end (args); + + /* Second part, building string */ + string = g_new (gchar, len); + + va_start (args, separator); + + s = va_arg (args, gchar*); + ptr = g_stpcpy (string, s); + + s = va_arg (args, gchar*); + while (s) + { + ptr = g_stpcpy (ptr, separator); + ptr = g_stpcpy (ptr, s); + s = va_arg (args, gchar*); + } + } + else + string = g_strdup (""); + + va_end (args); + + return string; +} + + +/** + * g_strstr_len: + * @haystack: a string. + * @haystack_len: the maximum length of @haystack. Note that -1 is + * a valid length, if @haystack is nul-terminated, meaning it will + * search through the whole string. + * @needle: the string to search for. + * + * Searches the string @haystack for the first occurrence + * of the string @needle, limiting the length of the search + * to @haystack_len. + * + * Return value: a pointer to the found occurrence, or + * %NULL if not found. + **/ +gchar * +g_strstr_len (const gchar *haystack, + gssize haystack_len, + const gchar *needle) +{ + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (haystack_len < 0) + return strstr (haystack, needle); + else + { + const gchar *p = haystack; + gsize needle_len = strlen (needle); + const gchar *end; + gsize i; + + if (needle_len == 0) + return (gchar *)haystack; + + if (haystack_len < needle_len) + return NULL; + + end = haystack + haystack_len - needle_len; + + while (p <= end && *p) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (gchar *)p; + + next: + p++; + } + + return NULL; + } +} + +/** + * g_strrstr: + * @haystack: a nul-terminated string. + * @needle: the nul-terminated string to search for. + * + * Searches the string @haystack for the last occurrence + * of the string @needle. + * + * Return value: a pointer to the found occurrence, or + * %NULL if not found. + **/ +gchar * +g_strrstr (const gchar *haystack, + const gchar *needle) +{ + gsize i; + gsize needle_len; + gsize haystack_len; + const gchar *p; + + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + needle_len = strlen (needle); + haystack_len = strlen (haystack); + + if (needle_len == 0) + return (gchar *)haystack; + + if (haystack_len < needle_len) + return NULL; + + p = haystack + haystack_len - needle_len; + + while (p >= haystack) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (gchar *)p; + + next: + p--; + } + + return NULL; +} + +/** + * g_strrstr_len: + * @haystack: a nul-terminated string. + * @haystack_len: the maximum length of @haystack. + * @needle: the nul-terminated string to search for. + * + * Searches the string @haystack for the last occurrence + * of the string @needle, limiting the length of the search + * to @haystack_len. + * + * Return value: a pointer to the found occurrence, or + * %NULL if not found. + **/ +gchar * +g_strrstr_len (const gchar *haystack, + gssize haystack_len, + const gchar *needle) +{ + g_return_val_if_fail (haystack != NULL, NULL); + g_return_val_if_fail (needle != NULL, NULL); + + if (haystack_len < 0) + return g_strrstr (haystack, needle); + else + { + gsize needle_len = strlen (needle); + const gchar *haystack_max = haystack + haystack_len; + const gchar *p = haystack; + gsize i; + + while (p < haystack_max && *p) + p++; + + if (p < haystack + needle_len) + return NULL; + + p -= needle_len; + + while (p >= haystack) + { + for (i = 0; i < needle_len; i++) + if (p[i] != needle[i]) + goto next; + + return (gchar *)p; + + next: + p--; + } + + return NULL; + } +} + + +/** + * g_str_has_suffix: + * @str: a nul-terminated string. + * @suffix: the nul-terminated suffix to look for. + * + * Looks whether the string @str ends with @suffix. + * + * Return value: %TRUE if @str end with @suffix, %FALSE otherwise. + * + * Since: 2.2 + **/ +gboolean +g_str_has_suffix (const gchar *str, + const gchar *suffix) +{ + int str_len; + int suffix_len; + + g_return_val_if_fail (str != NULL, FALSE); + g_return_val_if_fail (suffix != NULL, FALSE); + + str_len = strlen (str); + suffix_len = strlen (suffix); + + if (str_len < suffix_len) + return FALSE; + + return strcmp (str + str_len - suffix_len, suffix) == 0; +} + +/** + * g_str_has_prefix: + * @str: a nul-terminated string. + * @prefix: the nul-terminated prefix to look for. + * + * Looks whether the string @str begins with @prefix. + * + * Return value: %TRUE if @str begins with @prefix, %FALSE otherwise. + * + * Since: 2.2 + **/ +gboolean +g_str_has_prefix (const gchar *str, + const gchar *prefix) +{ + int str_len; + int prefix_len; + + g_return_val_if_fail (str != NULL, FALSE); + g_return_val_if_fail (prefix != NULL, FALSE); + + str_len = strlen (str); + prefix_len = strlen (prefix); + + if (str_len < prefix_len) + return FALSE; + + return strncmp (str, prefix, prefix_len) == 0; +} + + +/** + * g_strip_context: + * @msgid: a string + * @msgval: another string + * + * An auxiliary function for gettext() support (see Q_()). + * + * Return value: @msgval, unless @msgval is identical to @msgid and contains + * a '|' character, in which case a pointer to the substring of msgid after + * the first '|' character is returned. + * + * Since: 2.4 + **/ +G_CONST_RETURN gchar * +g_strip_context (const gchar *msgid, + const gchar *msgval) +{ + if (msgval == msgid) + { + const char *c = strchr (msgid, '|'); + if (c != NULL) + return c + 1; + } + + return msgval; +} + + +/** + * g_strv_length: + * @str_array: a %NULL-terminated array of strings. + * + * Returns the length of the given %NULL-terminated + * string array @str_array. + * + * Return value: length of @str_array. + * + * Since: 2.6 + **/ +guint +g_strv_length (gchar **str_array) +{ + guint i = 0; + + g_return_val_if_fail (str_array != NULL, 0); + + while (str_array[i]) + ++i; + + return i; +} + + +/** + * g_dpgettext: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @msgctxtid: a combined message context and message id, separated + * by a \004 character + * @msgidoffset: the offset of the message id in @msgctxid + * + * This function is a variant of g_dgettext() which supports + * a disambiguating message context. GNU gettext uses the + * '\004' character to separate the message context and + * message id in @msgctxtid. + * If 0 is passed as @msgidoffset, this function will fall back to + * trying to use the deprecated convention of using "|" as a separation + * character. + * + * This uses g_dgettext() internally. See that functions for differences + * with dgettext() proper. + * + * Applications should normally not use this function directly, + * but use the C_() macro for translations with context. + * + * Returns: The translated string + * + * Since: 2.16 + */ +G_CONST_RETURN gchar * +g_dpgettext (const gchar *domain, + const gchar *msgctxtid, + gsize msgidoffset) +{ + const gchar *translation; + gchar *sep; + + translation = g_dgettext (domain, msgctxtid); + + if (translation == msgctxtid) + { + if (msgidoffset > 0) + return msgctxtid + msgidoffset; + + sep = strchr (msgctxtid, '|'); + + if (sep) + { + /* try with '\004' instead of '|', in case + * xgettext -kQ_:1g was used + */ + gchar *tmp = g_alloca (strlen (msgctxtid) + 1); + strcpy (tmp, msgctxtid); + tmp[sep - msgctxtid] = '\004'; + + translation = g_dgettext (domain, tmp); + + if (translation == tmp) + return sep + 1; + } + } + + return translation; +} + +/* This function is taken from gettext.h + * GNU gettext uses '\004' to separate context and msgid in .mo files. + */ +/** + * g_dpgettext2: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @context: the message context + * @msgid: the message + * + * This function is a variant of g_dgettext() which supports + * a disambiguating message context. GNU gettext uses the + * '\004' character to separate the message context and + * message id in @msgctxtid. + * + * This uses g_dgettext() internally. See that functions for differences + * with dgettext() proper. + * + * This function differs from C_() in that it is not a macro and + * thus you may use non-string-literals as context and msgid arguments. + * + * Returns: The translated string + * + * Since: 2.18 + */ +G_CONST_RETURN char * +g_dpgettext2 (const char *domain, + const char *msgctxt, + const char *msgid) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; + char* msg_ctxt_id; + + msg_ctxt_id = g_alloca (msgctxt_len + msgid_len); + + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + + translation = g_dgettext (domain, msg_ctxt_id); + + if (translation == msg_ctxt_id) + { + /* try the old way of doing message contexts, too */ + msg_ctxt_id[msgctxt_len - 1] = '|'; + translation = g_dgettext (domain, msg_ctxt_id); + + if (translation == msg_ctxt_id) + return msgid; + } + + return translation; +} + +static gboolean +_g_dgettext_should_translate (void) +{ + static gsize translate = 0; + enum { + SHOULD_TRANSLATE = 1, + SHOULD_NOT_TRANSLATE = 2 + }; + + if (G_UNLIKELY (g_once_init_enter (&translate))) + { + gboolean should_translate = TRUE; + + const char *default_domain = textdomain (NULL); + const char *translator_comment = gettext (""); +#ifndef G_OS_WIN32 + const char *translate_locale = setlocale (LC_MESSAGES, NULL); +#else + const char *translate_locale = g_win32_getlocale (); +#endif + /* We should NOT translate only if all the following hold: + * - user has called textdomain() and set textdomain to non-default + * - default domain has no translations + * - locale does not start with "en_" and is not "C" + * + * Rationale: + * - If text domain is still the default domain, maybe user calls + * it later. Continue with old behavior of translating. + * - If locale starts with "en_", we can continue using the + * translations even if the app doesn't have translations for + * this locale. That is, en_UK and en_CA for example. + * - If locale is "C", maybe user calls setlocale(LC_ALL,"") later. + * Continue with old behavior of translating. + */ + if (0 != strcmp (default_domain, "messages") && + '\0' == *translator_comment && + 0 != strncmp (translate_locale, "en_", 3) && + 0 != strcmp (translate_locale, "C")) + should_translate = FALSE; + + g_once_init_leave (&translate, + should_translate ? + SHOULD_TRANSLATE : + SHOULD_NOT_TRANSLATE); + } + + return translate == SHOULD_TRANSLATE; +} + +/** + * g_dgettext: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @msgid: message to translate + * + * This function is a wrapper of dgettext() which does not translate + * the message if the default domain as set with textdomain() has no + * translations for the current locale. + * + * The advantage of using this function over dgettext() proper is that + * libraries using this function (like GTK+) will not use translations + * if the application using the library does not have translations for + * the current locale. This results in a consistent English-only + * interface instead of one having partial translations. For this + * feature to work, the call to textdomain() and setlocale() should + * precede any g_dgettext() invocations. For GTK+, it means calling + * textdomain() before gtk_init or its variants. + * + * This function disables translations if and only if upon its first + * call all the following conditions hold: + * + * @domain is not %NULL + * textdomain() has been called to set a default text domain + * there is no translations available for the default text domain + * and the current locale + * current locale is not "C" or any English locales (those + * starting with "en_") + * + * + * Note that this behavior may not be desired for example if an application + * has its untranslated messages in a language other than English. In those + * cases the application should call textdomain() after initializing GTK+. + * + * Applications should normally not use this function directly, + * but use the _() macro for translations. + * + * Returns: The translated string + * + * Since: 2.18 + */ +G_CONST_RETURN gchar * +g_dgettext (const gchar *domain, + const gchar *msgid) +{ + if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) + return msgid; + + return dgettext (domain, msgid); +} + +/** + * g_dngettext: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @msgid: message to translate + * @msgid_plural: plural form of the message + * @n: the quantity for which translation is needed + * + * This function is a wrapper of dngettext() which does not translate + * the message if the default domain as set with textdomain() has no + * translations for the current locale. + * + * See g_dgettext() for details of how this differs from dngettext() + * proper. + * + * Returns: The translated string + * + * Since: 2.18 + */ +G_CONST_RETURN gchar * +g_dngettext (const gchar *domain, + const gchar *msgid, + const gchar *msgid_plural, + gulong n) +{ + if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) + return n == 1 ? msgid : msgid_plural; + + return dngettext (domain, msgid, msgid_plural, n); +} + + +#define __G_STRFUNCS_C__ +#include "galiasdef.c" diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h new file mode 100644 index 0000000..534f26e --- /dev/null +++ b/glib/gstrfuncs.h @@ -0,0 +1,267 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_STRFUNCS_H__ +#define __G_STRFUNCS_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +/* Functions like the ones in that are not affected by locale. */ +typedef enum { + G_ASCII_ALNUM = 1 << 0, + G_ASCII_ALPHA = 1 << 1, + G_ASCII_CNTRL = 1 << 2, + G_ASCII_DIGIT = 1 << 3, + G_ASCII_GRAPH = 1 << 4, + G_ASCII_LOWER = 1 << 5, + G_ASCII_PRINT = 1 << 6, + G_ASCII_PUNCT = 1 << 7, + G_ASCII_SPACE = 1 << 8, + G_ASCII_UPPER = 1 << 9, + G_ASCII_XDIGIT = 1 << 10 +} GAsciiType; + +GLIB_VAR const guint16 * const g_ascii_table; + +#define g_ascii_isalnum(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_ALNUM) != 0) + +#define g_ascii_isalpha(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_ALPHA) != 0) + +#define g_ascii_iscntrl(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_CNTRL) != 0) + +#define g_ascii_isdigit(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_DIGIT) != 0) + +#define g_ascii_isgraph(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_GRAPH) != 0) + +#define g_ascii_islower(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_LOWER) != 0) + +#define g_ascii_isprint(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_PRINT) != 0) + +#define g_ascii_ispunct(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_PUNCT) != 0) + +#define g_ascii_isspace(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_SPACE) != 0) + +#define g_ascii_isupper(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_UPPER) != 0) + +#define g_ascii_isxdigit(c) \ + ((g_ascii_table[(guchar) (c)] & G_ASCII_XDIGIT) != 0) + +gchar g_ascii_tolower (gchar c) G_GNUC_CONST; +gchar g_ascii_toupper (gchar c) G_GNUC_CONST; + +gint g_ascii_digit_value (gchar c) G_GNUC_CONST; +gint g_ascii_xdigit_value (gchar c) G_GNUC_CONST; + +/* String utility functions that modify a string argument or + * return a constant string that must not be freed. + */ +#define G_STR_DELIMITERS "_-|> <." +gchar* g_strdelimit (gchar *string, + const gchar *delimiters, + gchar new_delimiter); +gchar* g_strcanon (gchar *string, + const gchar *valid_chars, + gchar substitutor); +G_CONST_RETURN gchar* g_strerror (gint errnum) G_GNUC_CONST; +G_CONST_RETURN gchar* g_strsignal (gint signum) G_GNUC_CONST; +gchar* g_strreverse (gchar *string); +gsize g_strlcpy (gchar *dest, + const gchar *src, + gsize dest_size); +gsize g_strlcat (gchar *dest, + const gchar *src, + gsize dest_size); +gchar * g_strstr_len (const gchar *haystack, + gssize haystack_len, + const gchar *needle); +gchar * g_strrstr (const gchar *haystack, + const gchar *needle); +gchar * g_strrstr_len (const gchar *haystack, + gssize haystack_len, + const gchar *needle); + +gboolean g_str_has_suffix (const gchar *str, + const gchar *suffix); +gboolean g_str_has_prefix (const gchar *str, + const gchar *prefix); + +/* String to/from double conversion functions */ + +gdouble g_strtod (const gchar *nptr, + gchar **endptr); +gdouble g_ascii_strtod (const gchar *nptr, + gchar **endptr); +guint64 g_ascii_strtoull (const gchar *nptr, + gchar **endptr, + guint base); +gint64 g_ascii_strtoll (const gchar *nptr, + gchar **endptr, + guint base); +/* 29 bytes should enough for all possible values that + * g_ascii_dtostr can produce. + * Then add 10 for good measure */ +#define G_ASCII_DTOSTR_BUF_SIZE (29 + 10) +gchar * g_ascii_dtostr (gchar *buffer, + gint buf_len, + gdouble d); +gchar * g_ascii_formatd (gchar *buffer, + gint buf_len, + const gchar *format, + gdouble d); + +/* removes leading spaces */ +gchar* g_strchug (gchar *string); +/* removes trailing spaces */ +gchar* g_strchomp (gchar *string); +/* removes leading & trailing spaces */ +#define g_strstrip( string ) g_strchomp (g_strchug (string)) + +gint g_ascii_strcasecmp (const gchar *s1, + const gchar *s2); +gint g_ascii_strncasecmp (const gchar *s1, + const gchar *s2, + gsize n); +gchar* g_ascii_strdown (const gchar *str, + gssize len) G_GNUC_MALLOC; +gchar* g_ascii_strup (const gchar *str, + gssize len) G_GNUC_MALLOC; + +#ifndef G_DISABLE_DEPRECATED + +/* The following four functions are deprecated and will be removed in + * the next major release. They use the locale-specific tolower and + * toupper, which is almost never the right thing. + */ + +gint g_strcasecmp (const gchar *s1, + const gchar *s2); +gint g_strncasecmp (const gchar *s1, + const gchar *s2, + guint n); +gchar* g_strdown (gchar *string); +gchar* g_strup (gchar *string); + +#endif /* G_DISABLE_DEPRECATED */ + +/* String utility functions that return a newly allocated string which + * ought to be freed with g_free from the caller at some point. + */ +gchar* g_strdup (const gchar *str) G_GNUC_MALLOC; +gchar* g_strdup_printf (const gchar *format, + ...) G_GNUC_PRINTF (1, 2) G_GNUC_MALLOC; +gchar* g_strdup_vprintf (const gchar *format, + va_list args) G_GNUC_MALLOC; +gchar* g_strndup (const gchar *str, + gsize n) G_GNUC_MALLOC; +gchar* g_strnfill (gsize length, + gchar fill_char) G_GNUC_MALLOC; +gchar* g_strconcat (const gchar *string1, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +gchar* g_strjoin (const gchar *separator, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; + +/* Make a copy of a string interpreting C string -style escape + * sequences. Inverse of g_strescape. The recognized sequences are \b + * \f \n \r \t \\ \" and the octal format. + */ +gchar* g_strcompress (const gchar *source) G_GNUC_MALLOC; + +/* Copy a string escaping nonprintable characters like in C strings. + * Inverse of g_strcompress. The exceptions parameter, if non-NULL, points + * to a string containing characters that are not to be escaped. + * + * Deprecated API: gchar* g_strescape (const gchar *source); + * Luckily this function wasn't used much, using NULL as second parameter + * provides mostly identical semantics. + */ +gchar* g_strescape (const gchar *source, + const gchar *exceptions) G_GNUC_MALLOC; + +gpointer g_memdup (gconstpointer mem, + guint byte_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(2); + +/* NULL terminated string arrays. + * g_strsplit(), g_strsplit_set() split up string into max_tokens tokens + * at delim and return a newly allocated string array. + * g_strjoinv() concatenates all of str_array's strings, sliding in an + * optional separator, the returned string is newly allocated. + * g_strfreev() frees the array itself and all of its strings. + * g_strdupv() copies a NULL-terminated array of strings + * g_strv_length() returns the length of a NULL-terminated array of strings + */ +gchar** g_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens) G_GNUC_MALLOC; +gchar ** g_strsplit_set (const gchar *string, + const gchar *delimiters, + gint max_tokens) G_GNUC_MALLOC; +gchar* g_strjoinv (const gchar *separator, + gchar **str_array) G_GNUC_MALLOC; +void g_strfreev (gchar **str_array); +gchar** g_strdupv (gchar **str_array) G_GNUC_MALLOC; +guint g_strv_length (gchar **str_array); + +gchar* g_stpcpy (gchar *dest, + const char *src); + +G_CONST_RETURN gchar *g_strip_context (const gchar *msgid, + const gchar *msgval) G_GNUC_FORMAT(1); + +G_CONST_RETURN gchar *g_dgettext (const gchar *domain, + const gchar *msgid) G_GNUC_FORMAT(2); + +G_CONST_RETURN gchar *g_dngettext (const gchar *domain, + const gchar *msgid, + const gchar *msgid_plural, + gulong n) G_GNUC_FORMAT(3); +G_CONST_RETURN gchar *g_dpgettext (const gchar *domain, + const gchar *msgctxtid, + gsize msgidoffset) G_GNUC_FORMAT(2); +G_CONST_RETURN gchar *g_dpgettext2 (const gchar *domain, + const gchar *context, + const gchar *msgid) G_GNUC_FORMAT(3); + +G_END_DECLS + +#endif /* __G_STRFUNCS_H__ */ diff --git a/glib/gstring.c b/glib/gstring.c new file mode 100644 index 0000000..aaff031 --- /dev/null +++ b/glib/gstring.c @@ -0,0 +1,1521 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include + +#include "glib.h" +#include "gprintf.h" + +#include "galias.h" + +/** + * SECTION: string_chunks + * @title: String Chunks + * @short_description: efficient storage of groups of strings + * + * String chunks are used to store groups of strings. Memory is + * allocated in blocks, and as strings are added to the #GStringChunk + * they are copied into the next free position in a block. When a block + * is full a new block is allocated. + * + * When storing a large number of strings, string chunks are more + * efficient than using g_strdup() since fewer calls to malloc() are + * needed, and less memory is wasted in memory allocation overheads. + * + * By adding strings with g_string_chunk_insert_const() it is also + * possible to remove duplicates. + * + * To create a new #GStringChunk use g_string_chunk_new(). + * + * To add strings to a #GStringChunk use g_string_chunk_insert(). + * + * To add strings to a #GStringChunk, but without duplicating strings + * which are already in the #GStringChunk, use + * g_string_chunk_insert_const(). + * + * To free the entire #GStringChunk use g_string_chunk_free(). It is + * not possible to free individual strings. + **/ + +/** + * GStringChunk: + * + * An opaque data structure representing String Chunks. It should only + * be accessed by using the following functions. + **/ +struct _GStringChunk +{ + GHashTable *const_table; + GSList *storage_list; + gsize storage_next; + gsize this_size; + gsize default_size; +}; + +/* Hash Functions. + */ + +/** + * g_str_equal: + * @v1: a key + * @v2: a key to compare with @v1 + * + * Compares two strings for byte-by-byte equality and returns %TRUE + * if they are equal. It can be passed to g_hash_table_new() as the + * @key_equal_func parameter, when using strings as keys in a #GHashTable. + * + * Note that this function is primarily meant as a hash table comparison + * function. For a general-purpose, %NULL-safe string comparison function, + * see g_strcmp0(). + * + * Returns: %TRUE if the two keys match + */ +gboolean +g_str_equal (gconstpointer v1, + gconstpointer v2) +{ + const gchar *string1 = v1; + const gchar *string2 = v2; + + return strcmp (string1, string2) == 0; +} + +/** + * g_str_hash: + * @v: a string key + * + * Converts a string to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func + * parameter, when using strings as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key + */ +guint +g_str_hash (gconstpointer v) +{ + /* 31 bit hash function */ + const signed char *p = v; + guint32 h = *p; + + if (h) + for (p += 1; *p != '\0'; p++) + h = (h << 5) - h + *p; + + return h; +} + +#define MY_MAXSIZE ((gsize)-1) + +static inline gsize +nearest_power (gsize base, gsize num) +{ + if (num > MY_MAXSIZE / 2) + { + return MY_MAXSIZE; + } + else + { + gsize n = base; + + while (n < num) + n <<= 1; + + return n; + } +} + +/* String Chunks. + */ + +/** + * g_string_chunk_new: + * @size: the default size of the blocks of memory which are + * allocated to store the strings. If a particular string + * is larger than this default size, a larger block of + * memory will be allocated for it. + * + * Creates a new #GStringChunk. + * + * Returns: a new #GStringChunk + */ +GStringChunk* +g_string_chunk_new (gsize size) +{ + GStringChunk *new_chunk = g_new (GStringChunk, 1); + gsize actual_size = 1; + + actual_size = nearest_power (1, size); + + new_chunk->const_table = NULL; + new_chunk->storage_list = NULL; + new_chunk->storage_next = actual_size; + new_chunk->default_size = actual_size; + new_chunk->this_size = actual_size; + + return new_chunk; +} + +/** + * g_string_chunk_free: + * @chunk: a #GStringChunk + * + * Frees all memory allocated by the #GStringChunk. + * After calling g_string_chunk_free() it is not safe to + * access any of the strings which were contained within it. + */ +void +g_string_chunk_free (GStringChunk *chunk) +{ + GSList *tmp_list; + + g_return_if_fail (chunk != NULL); + + if (chunk->storage_list) + { + for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next) + g_free (tmp_list->data); + + g_slist_free (chunk->storage_list); + } + + if (chunk->const_table) + g_hash_table_destroy (chunk->const_table); + + g_free (chunk); +} + +/** + * g_string_chunk_clear: + * @chunk: a #GStringChunk + * + * Frees all strings contained within the #GStringChunk. + * After calling g_string_chunk_clear() it is not safe to + * access any of the strings which were contained within it. + * + * Since: 2.14 + */ +void +g_string_chunk_clear (GStringChunk *chunk) +{ + GSList *tmp_list; + + g_return_if_fail (chunk != NULL); + + if (chunk->storage_list) + { + for (tmp_list = chunk->storage_list; tmp_list; tmp_list = tmp_list->next) + g_free (tmp_list->data); + + g_slist_free (chunk->storage_list); + + chunk->storage_list = NULL; + chunk->storage_next = chunk->default_size; + chunk->this_size = chunk->default_size; + } + + if (chunk->const_table) + g_hash_table_remove_all (chunk->const_table); +} + +/** + * g_string_chunk_insert: + * @chunk: a #GStringChunk + * @string: the string to add + * + * Adds a copy of @string to the #GStringChunk. + * It returns a pointer to the new copy of the string + * in the #GStringChunk. The characters in the string + * can be changed, if necessary, though you should not + * change anything after the end of the string. + * + * Unlike g_string_chunk_insert_const(), this function + * does not check for duplicates. Also strings added + * with g_string_chunk_insert() will not be searched + * by g_string_chunk_insert_const() when looking for + * duplicates. + * + * Returns: a pointer to the copy of @string within + * the #GStringChunk + */ +gchar* +g_string_chunk_insert (GStringChunk *chunk, + const gchar *string) +{ + g_return_val_if_fail (chunk != NULL, NULL); + + return g_string_chunk_insert_len (chunk, string, -1); +} + +/** + * g_string_chunk_insert_const: + * @chunk: a #GStringChunk + * @string: the string to add + * + * Adds a copy of @string to the #GStringChunk, unless the same + * string has already been added to the #GStringChunk with + * g_string_chunk_insert_const(). + * + * This function is useful if you need to copy a large number + * of strings but do not want to waste space storing duplicates. + * But you must remember that there may be several pointers to + * the same string, and so any changes made to the strings + * should be done very carefully. + * + * Note that g_string_chunk_insert_const() will not return a + * pointer to a string added with g_string_chunk_insert(), even + * if they do match. + * + * Returns: a pointer to the new or existing copy of @string + * within the #GStringChunk + */ +gchar* +g_string_chunk_insert_const (GStringChunk *chunk, + const gchar *string) +{ + char* lookup; + + g_return_val_if_fail (chunk != NULL, NULL); + + if (!chunk->const_table) + chunk->const_table = g_hash_table_new (g_str_hash, g_str_equal); + + lookup = (char*) g_hash_table_lookup (chunk->const_table, (gchar *)string); + + if (!lookup) + { + lookup = g_string_chunk_insert (chunk, string); + g_hash_table_insert (chunk->const_table, lookup, lookup); + } + + return lookup; +} + +/** + * g_string_chunk_insert_len: + * @chunk: a #GStringChunk + * @string: bytes to insert + * @len: number of bytes of @string to insert, or -1 to insert a + * nul-terminated string + * + * Adds a copy of the first @len bytes of @string to the #GStringChunk. + * The copy is nul-terminated. + * + * Since this function does not stop at nul bytes, it is the caller's + * responsibility to ensure that @string has at least @len addressable + * bytes. + * + * The characters in the returned string can be changed, if necessary, + * though you should not change anything after the end of the string. + * + * Return value: a pointer to the copy of @string within the #GStringChunk + * + * Since: 2.4 + */ +gchar* +g_string_chunk_insert_len (GStringChunk *chunk, + const gchar *string, + gssize len) +{ + gssize size; + gchar* pos; + + g_return_val_if_fail (chunk != NULL, NULL); + + if (len < 0) + size = strlen (string); + else + size = len; + + if ((chunk->storage_next + size + 1) > chunk->this_size) + { + gsize new_size = nearest_power (chunk->default_size, size + 1); + + chunk->storage_list = g_slist_prepend (chunk->storage_list, + g_new (gchar, new_size)); + + chunk->this_size = new_size; + chunk->storage_next = 0; + } + + pos = ((gchar *) chunk->storage_list->data) + chunk->storage_next; + + *(pos + size) = '\0'; + + memcpy (pos, string, size); + + chunk->storage_next += size + 1; + + return pos; +} + +/* Strings. + */ +static void +g_string_maybe_expand (GString* string, + gsize len) +{ + if (string->len + len >= string->allocated_len) + { + string->allocated_len = nearest_power (1, string->len + len + 1); + string->str = g_realloc (string->str, string->allocated_len); + } +} + +/** + * g_string_sized_new: + * @dfl_size: the default size of the space allocated to + * hold the string + * + * Creates a new #GString, with enough space for @dfl_size + * bytes. This is useful if you are going to add a lot of + * text to the string and don't want it to be reallocated + * too often. + * + * Returns: the new #GString + */ +GString* +g_string_sized_new (gsize dfl_size) +{ + GString *string = g_slice_new (GString); + + string->allocated_len = 0; + string->len = 0; + string->str = NULL; + + g_string_maybe_expand (string, MAX (dfl_size, 2)); + string->str[0] = 0; + + return string; +} + +/** + * g_string_new: + * @init: the initial text to copy into the string + * + * Creates a new #GString, initialized with the given string. + * + * Returns: the new #GString + */ +GString* +g_string_new (const gchar *init) +{ + GString *string; + + if (init == NULL || *init == '\0') + string = g_string_sized_new (2); + else + { + gint len; + + len = strlen (init); + string = g_string_sized_new (len + 2); + + g_string_append_len (string, init, len); + } + + return string; +} + +/** + * g_string_new_len: + * @init: initial contents of the string + * @len: length of @init to use + * + * Creates a new #GString with @len bytes of the @init buffer. + * Because a length is provided, @init need not be nul-terminated, + * and can contain embedded nul bytes. + * + * Since this function does not stop at nul bytes, it is the caller's + * responsibility to ensure that @init has at least @len addressable + * bytes. + * + * Returns: a new #GString + */ +GString* +g_string_new_len (const gchar *init, + gssize len) +{ + GString *string; + + if (len < 0) + return g_string_new (init); + else + { + string = g_string_sized_new (len); + + if (init) + g_string_append_len (string, init, len); + + return string; + } +} + +/** + * g_string_free: + * @string: a #GString + * @free_segment: if %TRUE the actual character data is freed as well + * + * Frees the memory allocated for the #GString. + * If @free_segment is %TRUE it also frees the character data. + * + * Returns: the character data of @string + * (i.e. %NULL if @free_segment is %TRUE) + */ +gchar* +g_string_free (GString *string, + gboolean free_segment) +{ + gchar *segment; + + g_return_val_if_fail (string != NULL, NULL); + + if (free_segment) + { + g_free (string->str); + segment = NULL; + } + else + segment = string->str; + + g_slice_free (GString, string); + + return segment; +} + +/** + * g_string_equal: + * @v: a #GString + * @v2: another #GString + * + * Compares two strings for equality, returning %TRUE if they are equal. + * For use with #GHashTable. + * + * Returns: %TRUE if they strings are the same length and contain the + * same bytes + */ +gboolean +g_string_equal (const GString *v, + const GString *v2) +{ + gchar *p, *q; + GString *string1 = (GString *) v; + GString *string2 = (GString *) v2; + gsize i = string1->len; + + if (i != string2->len) + return FALSE; + + p = string1->str; + q = string2->str; + while (i) + { + if (*p != *q) + return FALSE; + p++; + q++; + i--; + } + return TRUE; +} + +/** + * g_string_hash: + * @str: a string to hash + * + * Creates a hash code for @str; for use with #GHashTable. + * + * Returns: hash code for @str + */ +/* 31 bit hash function */ +guint +g_string_hash (const GString *str) +{ + const gchar *p = str->str; + gsize n = str->len; + guint h = 0; + + while (n--) + { + h = (h << 5) - h + *p; + p++; + } + + return h; +} + +/** + * g_string_assign: + * @string: the destination #GString. Its current contents + * are destroyed. + * @rval: the string to copy into @string + * + * Copies the bytes from a string into a #GString, + * destroying any previous contents. It is rather like + * the standard strcpy() function, except that you do not + * have to worry about having enough space to copy the string. + * + * Returns: @string + */ +GString* +g_string_assign (GString *string, + const gchar *rval) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (rval != NULL, string); + + /* Make sure assigning to itself doesn't corrupt the string. */ + if (string->str != rval) + { + /* Assigning from substring should be ok since g_string_truncate + does not realloc. */ + g_string_truncate (string, 0); + g_string_append (string, rval); + } + + return string; +} + +/** + * g_string_truncate: + * @string: a #GString + * @len: the new size of @string + * + * Cuts off the end of the GString, leaving the first @len bytes. + * + * Returns: @string + */ +GString* +g_string_truncate (GString *string, + gsize len) +{ + g_return_val_if_fail (string != NULL, NULL); + + string->len = MIN (len, string->len); + string->str[string->len] = 0; + + return string; +} + +/** + * g_string_set_size: + * @string: a #GString + * @len: the new length + * + * Sets the length of a #GString. If the length is less than + * the current length, the string will be truncated. If the + * length is greater than the current length, the contents + * of the newly added area are undefined. (However, as + * always, string->str[string->len] will be a nul byte.) + * + * Return value: @string + **/ +GString* +g_string_set_size (GString *string, + gsize len) +{ + g_return_val_if_fail (string != NULL, NULL); + + if (len >= string->allocated_len) + g_string_maybe_expand (string, len - string->len); + + string->len = len; + string->str[len] = 0; + + return string; +} + +/** + * g_string_insert_len: + * @string: a #GString + * @pos: position in @string where insertion should + * happen, or -1 for at the end + * @val: bytes to insert + * @len: number of bytes of @val to insert + * + * Inserts @len bytes of @val into @string at @pos. + * Because @len is provided, @val may contain embedded + * nuls and need not be nul-terminated. If @pos is -1, + * bytes are inserted at the end of the string. + * + * Since this function does not stop at nul bytes, it is + * the caller's responsibility to ensure that @val has at + * least @len addressable bytes. + * + * Returns: @string + */ +GString* +g_string_insert_len (GString *string, + gssize pos, + const gchar *val, + gssize len) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (val != NULL, string); + + if (len < 0) + len = strlen (val); + + if (pos < 0) + pos = string->len; + else + g_return_val_if_fail (pos <= string->len, string); + + /* Check whether val represents a substring of string. This test + probably violates chapter and verse of the C standards, since + ">=" and "<=" are only valid when val really is a substring. + In practice, it will work on modern archs. */ + if (val >= string->str && val <= string->str + string->len) + { + gsize offset = val - string->str; + gsize precount = 0; + + g_string_maybe_expand (string, len); + val = string->str + offset; + /* At this point, val is valid again. */ + + /* Open up space where we are going to insert. */ + if (pos < string->len) + g_memmove (string->str + pos + len, string->str + pos, string->len - pos); + + /* Move the source part before the gap, if any. */ + if (offset < pos) + { + precount = MIN (len, pos - offset); + memcpy (string->str + pos, val, precount); + } + + /* Move the source part after the gap, if any. */ + if (len > precount) + memcpy (string->str + pos + precount, + val + /* Already moved: */ precount + /* Space opened up: */ len, + len - precount); + } + else + { + g_string_maybe_expand (string, len); + + /* If we aren't appending at the end, move a hunk + * of the old string to the end, opening up space + */ + if (pos < string->len) + g_memmove (string->str + pos + len, string->str + pos, string->len - pos); + + /* insert the new string */ + if (len == 1) + string->str[pos] = *val; + else + memcpy (string->str + pos, val, len); + } + + string->len += len; + + string->str[string->len] = 0; + + return string; +} + +#define SUB_DELIM_CHARS "!$&'()*+,;=" + +static gboolean +is_valid (char c, const char *reserved_chars_allowed) +{ + if (g_ascii_isalnum (c) || + c == '-' || + c == '.' || + c == '_' || + c == '~') + return TRUE; + + if (reserved_chars_allowed && + strchr (reserved_chars_allowed, c) != NULL) + return TRUE; + + return FALSE; +} + +static gboolean +gunichar_ok (gunichar c) +{ + return + (c != (gunichar) -2) && + (c != (gunichar) -1); +} + +/** + * g_string_append_uri_escaped: + * @string: a #GString + * @unescaped: a string + * @reserved_chars_allowed: a string of reserved characters allowed to be used + * @allow_utf8: set %TRUE if the escaped string may include UTF8 characters + * + * Appends @unescaped to @string, escaped any characters that + * are reserved in URIs using URI-style escape sequences. + * + * Returns: @string + * + * Since: 2.16 + **/ +GString * +g_string_append_uri_escaped (GString *string, + const char *unescaped, + const char *reserved_chars_allowed, + gboolean allow_utf8) +{ + unsigned char c; + const char *end; + static const gchar hex[16] = "0123456789ABCDEF"; + + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (unescaped != NULL, NULL); + + end = unescaped + strlen (unescaped); + + while ((c = *unescaped) != 0) + { + if (c >= 0x80 && allow_utf8 && + gunichar_ok (g_utf8_get_char_validated (unescaped, end - unescaped))) + { + int len = g_utf8_skip [c]; + g_string_append_len (string, unescaped, len); + unescaped += len; + } + else if (is_valid (c, reserved_chars_allowed)) + { + g_string_append_c (string, c); + unescaped++; + } + else + { + g_string_append_c (string, '%'); + g_string_append_c (string, hex[((guchar)c) >> 4]); + g_string_append_c (string, hex[((guchar)c) & 0xf]); + unescaped++; + } + } + + return string; +} + +/** + * g_string_append: + * @string: a #GString + * @val: the string to append onto the end of @string + * + * Adds a string onto the end of a #GString, expanding + * it if necessary. + * + * Returns: @string + */ +GString* +g_string_append (GString *string, + const gchar *val) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (val != NULL, string); + + return g_string_insert_len (string, -1, val, -1); +} + +/** + * g_string_append_len: + * @string: a #GString + * @val: bytes to append + * @len: number of bytes of @val to use + * + * Appends @len bytes of @val to @string. Because @len is + * provided, @val may contain embedded nuls and need not + * be nul-terminated. + * + * Since this function does not stop at nul bytes, it is + * the caller's responsibility to ensure that @val has at + * least @len addressable bytes. + * + * Returns: @string + */ +GString* +g_string_append_len (GString *string, + const gchar *val, + gssize len) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (val != NULL, string); + + return g_string_insert_len (string, -1, val, len); +} + +/** + * g_string_append_c: + * @string: a #GString + * @c: the byte to append onto the end of @string + * + * Adds a byte onto the end of a #GString, expanding + * it if necessary. + * + * Returns: @string + */ +#undef g_string_append_c +GString* +g_string_append_c (GString *string, + gchar c) +{ + g_return_val_if_fail (string != NULL, NULL); + + return g_string_insert_c (string, -1, c); +} + +/** + * g_string_append_unichar: + * @string: a #GString + * @wc: a Unicode character + * + * Converts a Unicode character into UTF-8, and appends it + * to the string. + * + * Return value: @string + **/ +GString* +g_string_append_unichar (GString *string, + gunichar wc) +{ + g_return_val_if_fail (string != NULL, NULL); + + return g_string_insert_unichar (string, -1, wc); +} + +/** + * g_string_prepend: + * @string: a #GString + * @val: the string to prepend on the start of @string + * + * Adds a string on to the start of a #GString, + * expanding it if necessary. + * + * Returns: @string + */ +GString* +g_string_prepend (GString *string, + const gchar *val) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (val != NULL, string); + + return g_string_insert_len (string, 0, val, -1); +} + +/** + * g_string_prepend_len: + * @string: a #GString + * @val: bytes to prepend + * @len: number of bytes in @val to prepend + * + * Prepends @len bytes of @val to @string. + * Because @len is provided, @val may contain + * embedded nuls and need not be nul-terminated. + * + * Since this function does not stop at nul bytes, + * it is the caller's responsibility to ensure that + * @val has at least @len addressable bytes. + * + * Returns: @string + */ +GString* +g_string_prepend_len (GString *string, + const gchar *val, + gssize len) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (val != NULL, string); + + return g_string_insert_len (string, 0, val, len); +} + +/** + * g_string_prepend_c: + * @string: a #GString + * @c: the byte to prepend on the start of the #GString + * + * Adds a byte onto the start of a #GString, + * expanding it if necessary. + * + * Returns: @string + */ +GString* +g_string_prepend_c (GString *string, + gchar c) +{ + g_return_val_if_fail (string != NULL, NULL); + + return g_string_insert_c (string, 0, c); +} + +/** + * g_string_prepend_unichar: + * @string: a #GString + * @wc: a Unicode character + * + * Converts a Unicode character into UTF-8, and prepends it + * to the string. + * + * Return value: @string + **/ +GString* +g_string_prepend_unichar (GString *string, + gunichar wc) +{ + g_return_val_if_fail (string != NULL, NULL); + + return g_string_insert_unichar (string, 0, wc); +} + +/** + * g_string_insert: + * @string: a #GString + * @pos: the position to insert the copy of the string + * @val: the string to insert + * + * Inserts a copy of a string into a #GString, + * expanding it if necessary. + * + * Returns: @string + */ +GString* +g_string_insert (GString *string, + gssize pos, + const gchar *val) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (val != NULL, string); + if (pos >= 0) + g_return_val_if_fail (pos <= string->len, string); + + return g_string_insert_len (string, pos, val, -1); +} + +/** + * g_string_insert_c: + * @string: a #GString + * @pos: the position to insert the byte + * @c: the byte to insert + * + * Inserts a byte into a #GString, expanding it if necessary. + * + * Returns: @string + */ +GString* +g_string_insert_c (GString *string, + gssize pos, + gchar c) +{ + g_return_val_if_fail (string != NULL, NULL); + + g_string_maybe_expand (string, 1); + + if (pos < 0) + pos = string->len; + else + g_return_val_if_fail (pos <= string->len, string); + + /* If not just an append, move the old stuff */ + if (pos < string->len) + g_memmove (string->str + pos + 1, string->str + pos, string->len - pos); + + string->str[pos] = c; + + string->len += 1; + + string->str[string->len] = 0; + + return string; +} + +/** + * g_string_insert_unichar: + * @string: a #GString + * @pos: the position at which to insert character, or -1 to + * append at the end of the string + * @wc: a Unicode character + * + * Converts a Unicode character into UTF-8, and insert it + * into the string at the given position. + * + * Return value: @string + **/ +GString* +g_string_insert_unichar (GString *string, + gssize pos, + gunichar wc) +{ + gint charlen, first, i; + gchar *dest; + + g_return_val_if_fail (string != NULL, NULL); + + /* Code copied from g_unichar_to_utf() */ + if (wc < 0x80) + { + first = 0; + charlen = 1; + } + else if (wc < 0x800) + { + first = 0xc0; + charlen = 2; + } + else if (wc < 0x10000) + { + first = 0xe0; + charlen = 3; + } + else if (wc < 0x200000) + { + first = 0xf0; + charlen = 4; + } + else if (wc < 0x4000000) + { + first = 0xf8; + charlen = 5; + } + else + { + first = 0xfc; + charlen = 6; + } + /* End of copied code */ + + g_string_maybe_expand (string, charlen); + + if (pos < 0) + pos = string->len; + else + g_return_val_if_fail (pos <= string->len, string); + + /* If not just an append, move the old stuff */ + if (pos < string->len) + g_memmove (string->str + pos + charlen, string->str + pos, string->len - pos); + + dest = string->str + pos; + /* Code copied from g_unichar_to_utf() */ + for (i = charlen - 1; i > 0; --i) + { + dest[i] = (wc & 0x3f) | 0x80; + wc >>= 6; + } + dest[0] = wc | first; + /* End of copied code */ + + string->len += charlen; + + string->str[string->len] = 0; + + return string; +} + +/** + * g_string_overwrite: + * @string: a #GString + * @pos: the position at which to start overwriting + * @val: the string that will overwrite the @string starting at @pos + * + * Overwrites part of a string, lengthening it if necessary. + * + * Return value: @string + * + * Since: 2.14 + **/ +GString * +g_string_overwrite (GString *string, + gsize pos, + const gchar *val) +{ + g_return_val_if_fail (val != NULL, string); + return g_string_overwrite_len (string, pos, val, strlen (val)); +} + +/** + * g_string_overwrite_len: + * @string: a #GString + * @pos: the position at which to start overwriting + * @val: the string that will overwrite the @string starting at @pos + * @len: the number of bytes to write from @val + * + * Overwrites part of a string, lengthening it if necessary. + * This function will work with embedded nuls. + * + * Return value: @string + * + * Since: 2.14 + **/ +GString * +g_string_overwrite_len (GString *string, + gsize pos, + const gchar *val, + gssize len) +{ + gsize end; + + g_return_val_if_fail (string != NULL, NULL); + + if (!len) + return string; + + g_return_val_if_fail (val != NULL, string); + g_return_val_if_fail (pos <= string->len, string); + + if (len < 0) + len = strlen (val); + + end = pos + len; + + if (end > string->len) + g_string_maybe_expand (string, end - string->len); + + memcpy (string->str + pos, val, len); + + if (end > string->len) + { + string->str[end] = '\0'; + string->len = end; + } + + return string; +} + +/** + * g_string_erase: + * @string: a #GString + * @pos: the position of the content to remove + * @len: the number of bytes to remove, or -1 to remove all + * following bytes + * + * Removes @len bytes from a #GString, starting at position @pos. + * The rest of the #GString is shifted down to fill the gap. + * + * Returns: @string + */ +GString* +g_string_erase (GString *string, + gssize pos, + gssize len) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (pos >= 0, string); + g_return_val_if_fail (pos <= string->len, string); + + if (len < 0) + len = string->len - pos; + else + { + g_return_val_if_fail (pos + len <= string->len, string); + + if (pos + len < string->len) + g_memmove (string->str + pos, string->str + pos + len, string->len - (pos + len)); + } + + string->len -= len; + + string->str[string->len] = 0; + + return string; +} + +/** + * g_string_ascii_down: + * @string: a GString + * + * Converts all upper case ASCII letters to lower case ASCII letters. + * + * Return value: passed-in @string pointer, with all the upper case + * characters converted to lower case in place, with + * semantics that exactly match g_ascii_tolower(). + **/ +GString* +g_string_ascii_down (GString *string) +{ + gchar *s; + gint n; + + g_return_val_if_fail (string != NULL, NULL); + + n = string->len; + s = string->str; + + while (n) + { + *s = g_ascii_tolower (*s); + s++; + n--; + } + + return string; +} + +/** + * g_string_ascii_up: + * @string: a GString + * + * Converts all lower case ASCII letters to upper case ASCII letters. + * + * Return value: passed-in @string pointer, with all the lower case + * characters converted to upper case in place, with + * semantics that exactly match g_ascii_toupper(). + **/ +GString* +g_string_ascii_up (GString *string) +{ + gchar *s; + gint n; + + g_return_val_if_fail (string != NULL, NULL); + + n = string->len; + s = string->str; + + while (n) + { + *s = g_ascii_toupper (*s); + s++; + n--; + } + + return string; +} + +/** + * g_string_down: + * @string: a #GString + * + * Converts a #GString to lowercase. + * + * Returns: the #GString. + * + * Deprecated:2.2: This function uses the locale-specific + * tolower() function, which is almost never the right thing. + * Use g_string_ascii_down() or g_utf8_strdown() instead. + */ +GString* +g_string_down (GString *string) +{ + guchar *s; + glong n; + + g_return_val_if_fail (string != NULL, NULL); + + n = string->len; + s = (guchar *) string->str; + + while (n) + { + if (isupper (*s)) + *s = tolower (*s); + s++; + n--; + } + + return string; +} + +/** + * g_string_up: + * @string: a #GString + * + * Converts a #GString to uppercase. + * + * Return value: @string + * + * Deprecated:2.2: This function uses the locale-specific + * toupper() function, which is almost never the right thing. + * Use g_string_ascii_up() or g_utf8_strup() instead. + **/ +GString* +g_string_up (GString *string) +{ + guchar *s; + glong n; + + g_return_val_if_fail (string != NULL, NULL); + + n = string->len; + s = (guchar *) string->str; + + while (n) + { + if (islower (*s)) + *s = toupper (*s); + s++; + n--; + } + + return string; +} + +/** + * g_string_append_vprintf: + * @string: a #GString + * @format: the string format. See the printf() documentation + * @args: the list of arguments to insert in the output + * + * Appends a formatted string onto the end of a #GString. + * This function is similar to g_string_append_printf() + * except that the arguments to the format string are passed + * as a va_list. + * + * Since: 2.14 + */ +void +g_string_append_vprintf (GString *string, + const gchar *format, + va_list args) +{ + gchar *buf; + gint len; + + g_return_if_fail (string != NULL); + g_return_if_fail (format != NULL); + + len = g_vasprintf (&buf, format, args); + + if (len >= 0) + { + g_string_maybe_expand (string, len); + memcpy (string->str + string->len, buf, len + 1); + string->len += len; + g_free (buf); + } +} + +/** + * g_string_vprintf: + * @string: a #GString + * @format: the string format. See the printf() documentation + * @args: the parameters to insert into the format string + * + * Writes a formatted string into a #GString. + * This function is similar to g_string_printf() except that + * the arguments to the format string are passed as a va_list. + * + * Since: 2.14 + */ +void +g_string_vprintf (GString *string, + const gchar *format, + va_list args) +{ + g_string_truncate (string, 0); + g_string_append_vprintf (string, format, args); +} + +/** + * g_string_sprintf: + * @string: a #GString + * @format: the string format. See the sprintf() documentation + * @Varargs: the parameters to insert into the format string + * + * Writes a formatted string into a #GString. + * This is similar to the standard sprintf() function, + * except that the #GString buffer automatically expands + * to contain the results. The previous contents of the + * #GString are destroyed. + * + * Deprecated: This function has been renamed to g_string_printf(). + */ + +/** + * g_string_printf: + * @string: a #GString + * @format: the string format. See the printf() documentation + * @Varargs: the parameters to insert into the format string + * + * Writes a formatted string into a #GString. + * This is similar to the standard sprintf() function, + * except that the #GString buffer automatically expands + * to contain the results. The previous contents of the + * #GString are destroyed. + */ +void +g_string_printf (GString *string, + const gchar *format, + ...) +{ + va_list args; + + g_string_truncate (string, 0); + + va_start (args, format); + g_string_append_vprintf (string, format, args); + va_end (args); +} + +/** + * g_string_sprintfa: + * @string: a #GString + * @format: the string format. See the sprintf() documentation + * @Varargs: the parameters to insert into the format string + * + * Appends a formatted string onto the end of a #GString. + * This function is similar to g_string_sprintf() except that + * the text is appended to the #GString. + * + * Deprecated: This function has been renamed to g_string_append_printf() + */ + +/** + * g_string_append_printf: + * @string: a #GString + * @format: the string format. See the printf() documentation + * @Varargs: the parameters to insert into the format string + * + * Appends a formatted string onto the end of a #GString. + * This function is similar to g_string_printf() except + * that the text is appended to the #GString. + */ +void +g_string_append_printf (GString *string, + const gchar *format, + ...) +{ + va_list args; + + va_start (args, format); + g_string_append_vprintf (string, format, args); + va_end (args); +} + +#define __G_STRING_C__ +#include "galiasdef.c" diff --git a/glib/gstring.h b/glib/gstring.h new file mode 100644 index 0000000..2b1dd6e --- /dev/null +++ b/glib/gstring.h @@ -0,0 +1,178 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_STRING_H__ +#define __G_STRING_H__ + +#include +#include +#include /* for G_CAN_INLINE */ + +G_BEGIN_DECLS + +typedef struct _GString GString; +typedef struct _GStringChunk GStringChunk; + +struct _GString +{ + gchar *str; + gsize len; + gsize allocated_len; +}; + +/* String Chunks + */ +GStringChunk* g_string_chunk_new (gsize size); +void g_string_chunk_free (GStringChunk *chunk); +void g_string_chunk_clear (GStringChunk *chunk); +gchar* g_string_chunk_insert (GStringChunk *chunk, + const gchar *string); +gchar* g_string_chunk_insert_len (GStringChunk *chunk, + const gchar *string, + gssize len); +gchar* g_string_chunk_insert_const (GStringChunk *chunk, + const gchar *string); + + +/* Strings + */ +GString* g_string_new (const gchar *init); +GString* g_string_new_len (const gchar *init, + gssize len); +GString* g_string_sized_new (gsize dfl_size); +gchar* g_string_free (GString *string, + gboolean free_segment); +gboolean g_string_equal (const GString *v, + const GString *v2); +guint g_string_hash (const GString *str); +GString* g_string_assign (GString *string, + const gchar *rval); +GString* g_string_truncate (GString *string, + gsize len); +GString* g_string_set_size (GString *string, + gsize len); +GString* g_string_insert_len (GString *string, + gssize pos, + const gchar *val, + gssize len); +GString* g_string_append (GString *string, + const gchar *val); +GString* g_string_append_len (GString *string, + const gchar *val, + gssize len); +GString* g_string_append_c (GString *string, + gchar c); +GString* g_string_append_unichar (GString *string, + gunichar wc); +GString* g_string_prepend (GString *string, + const gchar *val); +GString* g_string_prepend_c (GString *string, + gchar c); +GString* g_string_prepend_unichar (GString *string, + gunichar wc); +GString* g_string_prepend_len (GString *string, + const gchar *val, + gssize len); +GString* g_string_insert (GString *string, + gssize pos, + const gchar *val); +GString* g_string_insert_c (GString *string, + gssize pos, + gchar c); +GString* g_string_insert_unichar (GString *string, + gssize pos, + gunichar wc); +GString* g_string_overwrite (GString *string, + gsize pos, + const gchar *val); +GString* g_string_overwrite_len (GString *string, + gsize pos, + const gchar *val, + gssize len); +GString* g_string_erase (GString *string, + gssize pos, + gssize len); +GString* g_string_ascii_down (GString *string); +GString* g_string_ascii_up (GString *string); +void g_string_vprintf (GString *string, + const gchar *format, + va_list args); +void g_string_printf (GString *string, + const gchar *format, + ...) G_GNUC_PRINTF (2, 3); +void g_string_append_vprintf (GString *string, + const gchar *format, + va_list args); +void g_string_append_printf (GString *string, + const gchar *format, + ...) G_GNUC_PRINTF (2, 3); +GString * g_string_append_uri_escaped(GString *string, + const char *unescaped, + const char *reserved_chars_allowed, + gboolean allow_utf8); + +/* -- optimize g_strig_append_c --- */ +#ifdef G_CAN_INLINE +static inline GString* +g_string_append_c_inline (GString *gstring, + gchar c) +{ + if (gstring->len + 1 < gstring->allocated_len) + { + gstring->str[gstring->len++] = c; + gstring->str[gstring->len] = 0; + } + else + g_string_insert_c (gstring, -1, c); + return gstring; +} +#define g_string_append_c(gstr,c) g_string_append_c_inline (gstr, c) +#endif /* G_CAN_INLINE */ + + +#ifndef G_DISABLE_DEPRECATED + +/* The following two functions are deprecated and will be removed in + * the next major release. They use the locale-specific tolower and + * toupper, which is almost never the right thing. + */ + +GString* g_string_down (GString *string); +GString* g_string_up (GString *string); + +/* These aliases are included for compatibility. */ +#define g_string_sprintf g_string_printf +#define g_string_sprintfa g_string_append_printf + +#endif /* G_DISABLE_DEPRECATED */ + +G_END_DECLS + +#endif /* __G_STRING_H__ */ diff --git a/glib/gtester-report b/glib/gtester-report new file mode 100755 index 0000000..c2250e3 --- /dev/null +++ b/glib/gtester-report @@ -0,0 +1,358 @@ +#! /usr/bin/env python +# GLib Testing Framework Utility -*- Mode: python; -*- +# Copyright (C) 2007 Imendio AB +# Authors: Tim Janik +# +# 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 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., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +import sys, re, xml.dom.minidom +pkginstall_configvars = { + #@PKGINSTALL_CONFIGVARS_IN24LINES@ # configvars are substituted upon script installation +} + +# xml utilities +def find_child (node, child_name): + for child in node.childNodes: + if child.nodeName == child_name: + return child + return None +def list_children (node, child_name): + rlist = [] + for child in node.childNodes: + if child.nodeName == child_name: + rlist += [ child ] + return rlist +def find_node (node, name = None): + if not node or node.nodeName == name or not name: + return node + for child in node.childNodes: + c = find_node (child, name) + if c: + return c + return None +def node_as_text (node, name = None): + if name: + node = find_node (node, name) + txt = '' + if node: + if node.nodeValue: + txt += node.nodeValue + for child in node.childNodes: + txt += node_as_text (child) + return txt +def attribute_as_text (node, aname, node_name = None): + node = find_node (node, node_name) + if not node: + return '' + attr = node.attributes.get (aname, '') + if hasattr (attr, 'value'): + return attr.value + return '' + +# HTML utilities +def html_indent_string (n): + uncollapsible_space = '  ' # HTML won't compress alternating sequences of ' ' and ' ' + string = '' + for i in range (0, (n + 1) / 2): + string += uncollapsible_space + return string + +# TestBinary object, instantiated per test binary in the log file +class TestBinary: + def __init__ (self, name): + self.name = name + self.testcases = [] + self.duration = 0 + self.success_cases = 0 + self.skipped_cases = 0 + self.file = '???' + self.random_seed = '' + +# base class to handle processing/traversion of XML nodes +class TreeProcess: + def __init__ (self): + self.nest_level = 0 + def trampoline (self, node): + name = node.nodeName + if name == '#text': + self.handle_text (node) + else: + try: method = getattr (self, 'handle_' + re.sub ('[^a-zA-Z0-9]', '_', name)) + except: method = None + if method: + return method (node) + else: + return self.process_recursive (name, node) + def process_recursive (self, node_name, node): + self.process_children (node) + def process_children (self, node): + self.nest_level += 1 + for child in node.childNodes: + self.trampoline (child) + self.nest_level += 1 + +# test report reader, this class collects some statistics and merges duplicate test binary runs +class ReportReader (TreeProcess): + def __init__ (self): + TreeProcess.__init__ (self) + self.binary_names = [] + self.binaries = {} + self.last_binary = None + def binary_list (self): + lst = [] + for name in self.binary_names: + lst += [ self.binaries[name] ] + return lst + def handle_testcase (self, node): + self.last_binary.testcases += [ node ] + result = attribute_as_text (node, 'result', 'status') + if result == 'success': + self.last_binary.success_cases += 1 + if bool (int (attribute_as_text (node, 'skipped') + '0')): + self.last_binary.skipped_cases += 1 + def handle_text (self, node): + pass + def handle_testbinary (self, node): + path = node.attributes.get ('path', None).value + if self.binaries.get (path, -1) == -1: + self.binaries[path] = TestBinary (path) + self.binary_names += [ path ] + self.last_binary = self.binaries[path] + dn = find_child (node, 'duration') + dur = node_as_text (dn) + try: dur = float (dur) + except: dur = 0 + if dur: + self.last_binary.duration += dur + bin = find_child (node, 'binary') + if bin: + self.last_binary.file = attribute_as_text (bin, 'file') + rseed = find_child (node, 'random-seed') + if rseed: + self.last_binary.random_seed = node_as_text (rseed) + self.process_children (node) + +# HTML report generation class +class ReportWriter (TreeProcess): + # Javascript/CSS snippet to toggle element visibility + cssjs = r''' + + + ''' + def __init__ (self, binary_list): + TreeProcess.__init__ (self) + self.binaries = binary_list + self.bcounter = 0 + self.tcounter = 0 + self.total_tcounter = 0 + self.total_fcounter = 0 + self.total_duration = 0 + self.indent_depth = 0 + self.lastchar = '' + def oprint (self, message): + sys.stdout.write (message) + if message: + self.lastchar = message[-1] + def handle_text (self, node): + self.oprint (node.nodeValue) + def handle_testcase (self, node, binary): + skipped = bool (int (attribute_as_text (node, 'skipped') + '0')) + if skipped: + return # skipped tests are uninteresting for HTML reports + path = attribute_as_text (node, 'path') + duration = node_as_text (node, 'duration') + result = attribute_as_text (node, 'result', 'status') + rcolor = { + 'success': 'bgcolor="lightgreen"', + 'failed': 'bgcolor="red"', + }.get (result, '') + if result != 'success': + duration = '-' # ignore bogus durations + self.oprint ('\n' % (self.bcounter, self.tcounter, result)) + self.oprint ('%s %s %s \n' % (html_indent_string (4), path, duration)) + perflist = list_children (node, 'performance') + if result != 'success': + rlist = list_children (node, 'error') + txt = '' + for enode in rlist: + txt += node_as_text (enode) + if txt and txt[-1] != '\n': + txt += '\n' + txt = re.sub (r'"', r'\\"', txt) + txt = re.sub (r'\n', r'\\n', txt) + txt = re.sub (r'&', r'&', txt) + txt = re.sub (r'<', r'<', txt) + self.oprint ('\n' % (self.bcounter, self.tcounter, txt)) + self.oprint ('Details\n' % + ('TestResultWindow', binary.file, binary.random_seed, path, self.bcounter, self.tcounter)) + elif perflist: + presults = [] + for perf in perflist: + pmin = bool (int (attribute_as_text (perf, 'minimize'))) + pmax = bool (int (attribute_as_text (perf, 'maximize'))) + pval = float (attribute_as_text (perf, 'value')) + txt = node_as_text (perf) + txt = re.sub (r'&', r'&', txt) + txt = re.sub (r'<', r'>', txt) + txt = 'Performance(' + (pmin and 'minimized' or 'maximized') + '): ' + txt.strip() + '
\n' + txt = re.sub (r'"', r'\\"', txt) + txt = re.sub (r'\n', r'\\n', txt) + presults += [ (pval, txt) ] + presults.sort() + ptxt = ''.join ([e[1] for e in presults]) + self.oprint ('\n' % (self.bcounter, self.tcounter, ptxt)) + self.oprint ('Details\n' % + ('TestResultWindow', binary.file, binary.random_seed, path, self.bcounter, self.tcounter)) + else: + self.oprint ('-\n') + self.oprint ('%s\n' % (rcolor, result)) + self.oprint ('\n') + self.tcounter += 1 + self.total_tcounter += 1 + self.total_fcounter += result != 'success' + def handle_binary (self, binary): + self.tcounter = 1 + self.bcounter += 1 + self.total_duration += binary.duration + self.oprint ('%s%f \n' % (binary.name, binary.duration)) + erlink, oklink = ('', '') + real_cases = len (binary.testcases) - binary.skipped_cases + if binary.success_cases < real_cases: + erlink = 'href="javascript:toggle_display (\'ResultTable\', \'tr\', \'b%u_\', \'failed\')"' % self.bcounter + if binary.success_cases: + oklink = 'href="javascript:toggle_display (\'ResultTable\', \'tr\', \'b%u_\', \'success\')"' % self.bcounter + self.oprint ('ER\n' % erlink) + self.oprint ('OK\n' % oklink) + self.oprint ('\n') + perc = binary.success_cases * 100.0 / real_cases + pcolor = { + 100 : 'bgcolor="lightgreen"', + 0 : 'bgcolor="red"', + }.get (int (perc), 'bgcolor="yellow"') + self.oprint ('%.2f%%\n' % (pcolor, perc)) + self.oprint ('\n') + for tc in binary.testcases: + self.handle_testcase (tc, binary) + def handle_totals (self): + self.oprint ('') + self.oprint ('Totals: %u Binaries, %u Tests, %u Failed, %u Succeeded' % + (self.bcounter, self.total_tcounter, self.total_fcounter, self.total_tcounter - self.total_fcounter)) + self.oprint ('%f\n' % self.total_duration) + self.oprint ('-\n') + perc = (self.total_tcounter - self.total_fcounter) * 100.0 / self.total_tcounter + pcolor = { + 100 : 'bgcolor="lightgreen"', + 0 : 'bgcolor="red"', + }.get (int (perc), 'bgcolor="yellow"') + self.oprint ('%.2f%%\n' % (pcolor, perc)) + self.oprint ('\n') + def printout (self): + self.oprint ('\n') + self.oprint ('GTester Unit Test Report\n') + self.oprint (self.cssjs) + self.oprint ('\n') + self.oprint ('\n') + self.oprint ('

GTester Unit Test Report

\n') + self.oprint ('\n\n') + self.oprint ('\n') + self.oprint ('\n') + self.oprint ('\n') + self.oprint ('\n') + self.oprint ('\n') + for tb in self.binaries: + self.handle_binary (tb) + self.handle_totals() + self.oprint ('
Program / Testcase Duration (sec)ViewResult
\n') + self.oprint ('\n') + self.oprint ('\n') + +# main program handling +def parse_files_and_args (): + from sys import argv, stdin + files = [] + arg_iter = sys.argv[1:].__iter__() + rest = len (sys.argv) - 1 + for arg in arg_iter: + rest -= 1 + if arg == '--help' or arg == '-h': + print_help () + sys.exit (0) + elif arg == '--version' or arg == '-v': + print_help (False) + sys.exit (0) + else: + files = files + [ arg ] + return files + +def print_help (with_help = True): + import os + print "gtester-report (GLib utils) version", pkginstall_configvars.get ('glib-version', '0.0-uninstalled') + if not with_help: + return + print "Usage: %s [OPTIONS] " % os.path.basename (sys.argv[0]) + print "Generate HTML reports from the XML log files generated by gtester." + print "Options:" + print " --help, -h print this help message" + print " --version, -v print version info" + +def main(): + from sys import argv, stdin + files = parse_files_and_args() + if len (files) != 1: + print_help (True) + sys.exit (1) + xd = xml.dom.minidom.parse (files[0]) + rr = ReportReader() + rr.trampoline (xd) + rw = ReportWriter (rr.binary_list()) + rw.printout() + +if __name__ == '__main__': + main() diff --git a/glib/gtester.c b/glib/gtester.c new file mode 100644 index 0000000..ca023f7 --- /dev/null +++ b/glib/gtester.c @@ -0,0 +1,711 @@ +/* GLib testing framework runner + * Copyright (C) 2007 Sven Herzberg + * Copyright (C) 2007 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* the read buffer size in bytes */ +#define READ_BUFFER_SIZE 4096 + +/* --- prototypes --- */ +static int main_selftest (int argc, + char **argv); +static void parse_args (gint *argc_p, + gchar ***argv_p); + +/* --- variables --- */ +static GIOChannel *ioc_report = NULL; +static gboolean gtester_quiet = FALSE; +static gboolean gtester_verbose = FALSE; +static gboolean gtester_list_tests = FALSE; +static gboolean gtester_selftest = FALSE; +static gboolean subtest_running = FALSE; +static gint subtest_exitstatus = 0; +static gboolean subtest_io_pending = FALSE; +static gboolean subtest_quiet = TRUE; +static gboolean subtest_verbose = FALSE; +static gboolean subtest_mode_fatal = TRUE; +static gboolean subtest_mode_perf = FALSE; +static gboolean subtest_mode_quick = TRUE; +static const gchar *subtest_seedstr = NULL; +static gchar *subtest_last_seed = NULL; +static GSList *subtest_paths = NULL; +static GSList *subtest_args = NULL; +static gboolean testcase_open = FALSE; +static guint testcase_count = 0; +static guint testcase_fail_count = 0; +static const gchar *output_filename = NULL; +static guint log_indent = 0; +static gint log_fd = -1; + +/* --- functions --- */ +static const char* +sindent (guint n) +{ + static const char spaces[] = " "; + int l = sizeof (spaces) - 1; + n = MIN (n, l); + return spaces + l - n; +} + +static void G_GNUC_PRINTF (1, 2) +test_log_printfe (const char *format, + ...) +{ + char *result; + int r; + va_list args; + va_start (args, format); + result = g_markup_vprintf_escaped (format, args); + va_end (args); + do + r = write (log_fd, result, strlen (result)); + while (r < 0 && errno == EINTR); + g_free (result); +} + +static void +terminate (void) +{ + kill (getpid(), SIGTERM); + abort(); +} + +static void +testcase_close (long double duration, + gint exit_status, + guint n_forks) +{ + g_return_if_fail (testcase_open > 0); + test_log_printfe ("%s%.6Lf\n", sindent (log_indent), duration); + test_log_printfe ("%s\n", + sindent (log_indent), exit_status, n_forks, + exit_status ? "failed" : "success"); + log_indent -= 2; + test_log_printfe ("%s\n", sindent (log_indent)); + testcase_open--; + if (gtester_verbose) + g_print ("%s\n", exit_status ? "FAIL" : "OK"); + if (exit_status && subtest_last_seed) + g_print ("GTester: last random seed: %s\n", subtest_last_seed); + if (exit_status) + testcase_fail_count += 1; + if (subtest_mode_fatal && testcase_fail_count) + terminate(); +} + +static void +test_log_msg (GTestLogMsg *msg) +{ + switch (msg->log_type) + { + guint i; + gchar **strv; + case G_TEST_LOG_NONE: + break; + case G_TEST_LOG_ERROR: + strv = g_strsplit (msg->strings[0], "\n", -1); + for (i = 0; strv[i]; i++) + test_log_printfe ("%s%s\n", sindent (log_indent), strv[i]); + g_strfreev (strv); + break; + case G_TEST_LOG_START_BINARY: + test_log_printfe ("%s\n", sindent (log_indent), msg->strings[0]); + subtest_last_seed = g_strdup (msg->strings[1]); + test_log_printfe ("%s%s\n", sindent (log_indent), subtest_last_seed); + break; + case G_TEST_LOG_LIST_CASE: + g_print ("%s\n", msg->strings[0]); + break; + case G_TEST_LOG_START_CASE: + testcase_count++; + if (gtester_verbose) + { + gchar *sc = g_strconcat (msg->strings[0], ":", NULL); + gchar *sleft = g_strdup_printf ("%-68s", sc); + g_free (sc); + g_print ("%70s ", sleft); + g_free (sleft); + } + g_return_if_fail (testcase_open == 0); + testcase_open++; + test_log_printfe ("%s\n", sindent (log_indent), msg->strings[0]); + log_indent += 2; + break; + case G_TEST_LOG_SKIP_CASE: + if (FALSE && gtester_verbose) /* enable to debug test case skipping logic */ + { + gchar *sc = g_strconcat (msg->strings[0], ":", NULL); + gchar *sleft = g_strdup_printf ("%-68s", sc); + g_free (sc); + g_print ("%70s SKIPPED\n", sleft); + g_free (sleft); + } + test_log_printfe ("%s\n", sindent (log_indent), msg->strings[0]); + break; + case G_TEST_LOG_STOP_CASE: + testcase_close (msg->nums[2], (int) msg->nums[0], (int) msg->nums[1]); + break; + case G_TEST_LOG_MIN_RESULT: + case G_TEST_LOG_MAX_RESULT: + test_log_printfe ("%s\n", + sindent (log_indent), msg->log_type == G_TEST_LOG_MIN_RESULT, msg->log_type == G_TEST_LOG_MAX_RESULT, msg->nums[0]); + test_log_printfe ("%s%s\n", sindent (log_indent + 2), msg->strings[0]); + test_log_printfe ("%s\n", sindent (log_indent)); + break; + case G_TEST_LOG_MESSAGE: + test_log_printfe ("%s\n%s\n%s\n", sindent (log_indent), msg->strings[0], sindent (log_indent)); + break; + } +} + +static gboolean +child_report_cb (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + GTestLogBuffer *tlb = data; + GIOStatus status = G_IO_STATUS_NORMAL; + gboolean first_read_eof = FALSE, first_read = TRUE; + gsize length = 0; + do + { + guint8 buffer[READ_BUFFER_SIZE]; + GError *error = NULL; + status = g_io_channel_read_chars (source, (gchar*) buffer, sizeof (buffer), &length, &error); + if (first_read && (condition & G_IO_IN)) + { + /* on some unixes (MacOS) we need to detect non-blocking fd EOF + * by an IO_IN select/poll followed by read()==0. + */ + first_read_eof = length == 0; + } + first_read = FALSE; + if (length) + { + GTestLogMsg *msg; + g_test_log_buffer_push (tlb, length, buffer); + do + { + msg = g_test_log_buffer_pop (tlb); + if (msg) + { + test_log_msg (msg); + g_test_log_msg_free (msg); + } + } + while (msg); + } + g_clear_error (&error); + /* ignore the io channel status, which will report intermediate EOFs for non blocking fds */ + (void) status; + } + while (length > 0); + /* g_print ("LASTIOSTATE: first_read_eof=%d condition=%d\n", first_read_eof, condition); */ + if (first_read_eof || (condition & (G_IO_ERR | G_IO_HUP))) + { + /* if there's no data to read and select() reports an error or hangup, + * the fd must have been closed remotely + */ + subtest_io_pending = FALSE; + return FALSE; + } + return TRUE; /* keep polling */ +} + +static void +child_watch_cb (GPid pid, + gint status, + gpointer data) +{ + g_spawn_close_pid (pid); + if (WIFEXITED (status)) /* normal exit */ + subtest_exitstatus = WEXITSTATUS (status); + else /* signal or core dump, etc */ + subtest_exitstatus = 0xffffffff; + subtest_running = FALSE; +} + +static gchar* +queue_gfree (GSList **slistp, + gchar *string) +{ + *slistp = g_slist_prepend (*slistp, string); + return string; +} + +static void +unset_cloexec_fdp (gpointer fdp_data) +{ + int r, *fdp = fdp_data; + do + r = fcntl (*fdp, F_SETFD, 0 /* FD_CLOEXEC */); + while (r < 0 && errno == EINTR); +} + +static gboolean +launch_test_binary (const char *binary, + guint skip_tests) +{ + GTestLogBuffer *tlb; + GSList *slist, *free_list = NULL; + GError *error = NULL; + int argc = 0; + const gchar **argv; + GPid pid = 0; + gint report_pipe[2] = { -1, -1 }; + guint child_report_cb_id = 0; + gboolean loop_pending; + gint i = 0; + + if (pipe (report_pipe) < 0) + { + if (subtest_mode_fatal) + g_error ("Failed to open pipe for test binary: %s: %s", binary, g_strerror (errno)); + else + g_warning ("Failed to open pipe for test binary: %s: %s", binary, g_strerror (errno)); + return FALSE; + } + + /* setup argc */ + for (slist = subtest_args; slist; slist = slist->next) + argc++; + /* argc++; */ + if (subtest_quiet) + argc++; + if (subtest_verbose) + argc++; + if (!subtest_mode_fatal) + argc++; + if (subtest_mode_quick) + argc++; + else + argc++; + if (subtest_mode_perf) + argc++; + if (gtester_list_tests) + argc++; + if (subtest_seedstr) + argc++; + argc++; + if (skip_tests) + argc++; + for (slist = subtest_paths; slist; slist = slist->next) + argc++; + + /* setup argv */ + argv = g_malloc ((argc + 2) * sizeof(gchar *)); + argv[i++] = binary; + for (slist = subtest_args; slist; slist = slist->next) + argv[i++] = (gchar*) slist->data; + /* argv[i++] = "--debug-log"; */ + if (subtest_quiet) + argv[i++] = "--quiet"; + if (subtest_verbose) + argv[i++] = "--verbose"; + if (!subtest_mode_fatal) + argv[i++] = "--keep-going"; + if (subtest_mode_quick) + argv[i++] = "-m=quick"; + else + argv[i++] = "-m=slow"; + if (subtest_mode_perf) + argv[i++] = "-m=perf"; + if (gtester_list_tests) + argv[i++] = "-l"; + if (subtest_seedstr) + argv[i++] = queue_gfree (&free_list, g_strdup_printf ("--seed=%s", subtest_seedstr)); + argv[i++] = queue_gfree (&free_list, g_strdup_printf ("--GTestLogFD=%u", report_pipe[1])); + if (skip_tests) + argv[i++] = queue_gfree (&free_list, g_strdup_printf ("--GTestSkipCount=%u", skip_tests)); + for (slist = subtest_paths; slist; slist = slist->next) + argv[i++] = queue_gfree (&free_list, g_strdup_printf ("-p=%s", (gchar*) slist->data)); + argv[i++] = NULL; + + g_spawn_async_with_pipes (NULL, /* g_get_current_dir() */ + (gchar**) argv, + NULL, /* envp */ + G_SPAWN_DO_NOT_REAP_CHILD, /* G_SPAWN_SEARCH_PATH */ + unset_cloexec_fdp, &report_pipe[1], /* pre-exec callback */ + &pid, + NULL, /* standard_input */ + NULL, /* standard_output */ + NULL, /* standard_error */ + &error); + g_slist_foreach (free_list, (void(*)(void*,void*)) g_free, NULL); + g_slist_free (free_list); + free_list = NULL; + close (report_pipe[1]); + + if (!gtester_quiet) + g_print ("(pid=%lu)\n", (unsigned long) pid); + + if (error) + { + close (report_pipe[0]); + if (subtest_mode_fatal) + g_error ("Failed to execute test binary: %s: %s", argv[0], error->message); + else + g_warning ("Failed to execute test binary: %s: %s", argv[0], error->message); + g_clear_error (&error); + g_free (argv); + return FALSE; + } + g_free (argv); + + subtest_running = TRUE; + subtest_io_pending = TRUE; + tlb = g_test_log_buffer_new(); + if (report_pipe[0] >= 0) + { + ioc_report = g_io_channel_unix_new (report_pipe[0]); + g_io_channel_set_flags (ioc_report, G_IO_FLAG_NONBLOCK, NULL); + g_io_channel_set_encoding (ioc_report, NULL, NULL); + g_io_channel_set_buffered (ioc_report, FALSE); + child_report_cb_id = g_io_add_watch_full (ioc_report, G_PRIORITY_DEFAULT - 1, G_IO_IN | G_IO_ERR | G_IO_HUP, child_report_cb, tlb, NULL); + g_io_channel_unref (ioc_report); + } + g_child_watch_add_full (G_PRIORITY_DEFAULT + 1, pid, child_watch_cb, NULL, NULL); + + loop_pending = g_main_context_pending (NULL); + while (subtest_running || /* FALSE once child exits */ + subtest_io_pending || /* FALSE once ioc_report closes */ + loop_pending) /* TRUE while idler, etc are running */ + { + /* g_print ("LOOPSTATE: subtest_running=%d subtest_io_pending=%d\n", subtest_running, subtest_io_pending); */ + /* check for unexpected hangs that are not signalled on report_pipe */ + if (!subtest_running && /* child exited */ + subtest_io_pending && /* no EOF detected on report_pipe */ + !loop_pending) /* no IO events pending however */ + break; + g_main_context_iteration (NULL, TRUE); + loop_pending = g_main_context_pending (NULL); + } + + g_source_remove (child_report_cb_id); + close (report_pipe[0]); + g_test_log_buffer_free (tlb); + + return TRUE; +} + +static void +launch_test (const char *binary) +{ + gboolean success = TRUE; + GTimer *btimer = g_timer_new(); + gboolean need_restart; + testcase_count = 0; + testcase_fail_count = 0; + if (!gtester_quiet) + g_print ("TEST: %s... ", binary); + + retry: + test_log_printfe ("%s\n", sindent (log_indent), binary); + log_indent += 2; + g_timer_start (btimer); + subtest_exitstatus = 0; + success &= launch_test_binary (binary, testcase_count); + success &= subtest_exitstatus == 0; + need_restart = testcase_open != 0; + if (testcase_open) + testcase_close (0, -256, 0); + g_timer_stop (btimer); + test_log_printfe ("%s%.6f\n", sindent (log_indent), g_timer_elapsed (btimer, NULL)); + log_indent -= 2; + test_log_printfe ("%s\n", sindent (log_indent)); + g_free (subtest_last_seed); + subtest_last_seed = NULL; + if (need_restart) + { + /* restart test binary, skipping processed test cases */ + goto retry; + } + + if (!gtester_quiet) + g_print ("%s: %s\n", testcase_fail_count || !success ? "FAIL" : "PASS", binary); + g_timer_destroy (btimer); + if (subtest_mode_fatal && !success) + terminate(); +} + +static void +usage (gboolean just_version) +{ + if (just_version) + { + g_print ("gtester version %d.%d.%d\n", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + return; + } + g_print ("Usage: gtester [OPTIONS] testprogram...\n"); + /* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */ + g_print ("Options:\n"); + g_print (" -h, --help show this help message\n"); + g_print (" -v, --version print version informations\n"); + g_print (" --g-fatal-warnings make warnings fatal (abort)\n"); + g_print (" -k, --keep-going continue running after tests failed\n"); + g_print (" -l list paths of available test cases\n"); + g_print (" -m=perf, -m=slow, -m=quick -m=thorough\n"); + g_print (" run test cases in mode perf, slow/thorough or quick (default)\n"); + g_print (" -p=TESTPATH only start test cases matching TESTPATH\n"); + g_print (" --seed=SEEDSTRING start all tests with random number seed SEEDSTRING\n"); + g_print (" -o=LOGFILE write the test log to LOGFILE\n"); + g_print (" -q, --quiet suppress per test binary output\n"); + g_print (" --verbose report success per testcase\n"); +} + +static void +parse_args (gint *argc_p, + gchar ***argv_p) +{ + guint argc = *argc_p; + gchar **argv = *argv_p; + guint i, e; + /* parse known args */ + for (i = 1; i < argc; i++) + { + if (strcmp (argv[i], "--g-fatal-warnings") == 0) + { + GLogLevelFlags fatal_mask = (GLogLevelFlags) g_log_set_always_fatal ((GLogLevelFlags) G_LOG_FATAL_MASK); + fatal_mask = (GLogLevelFlags) (fatal_mask | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); + g_log_set_always_fatal (fatal_mask); + argv[i] = NULL; + } + else if (strcmp (argv[i], "--gtester-selftest") == 0) + { + gtester_selftest = TRUE; + argv[i] = NULL; + break; /* stop parsing regular gtester arguments */ + } + else if (strcmp (argv[i], "-h") == 0 || strcmp (argv[i], "--help") == 0) + { + usage (FALSE); + exit (0); + argv[i] = NULL; + } + else if (strcmp (argv[i], "-v") == 0 || strcmp (argv[i], "--version") == 0) + { + usage (TRUE); + exit (0); + argv[i] = NULL; + } + else if (strcmp (argv[i], "--keep-going") == 0 || + strcmp (argv[i], "-k") == 0) + { + subtest_mode_fatal = FALSE; + argv[i] = NULL; + } + else if (strcmp ("-p", argv[i]) == 0 || strncmp ("-p=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + if (*equal == '=') + subtest_paths = g_slist_prepend (subtest_paths, equal + 1); + else if (i + 1 < argc) + { + argv[i++] = NULL; + subtest_paths = g_slist_prepend (subtest_paths, argv[i]); + } + argv[i] = NULL; + } + else if (strcmp ("--test-arg", argv[i]) == 0 || strncmp ("--test-arg=", argv[i], 11) == 0) + { + gchar *equal = argv[i] + 10; + if (*equal == '=') + subtest_args = g_slist_prepend (subtest_args, equal + 1); + else if (i + 1 < argc) + { + argv[i++] = NULL; + subtest_args = g_slist_prepend (subtest_args, argv[i]); + } + argv[i] = NULL; + } + else if (strcmp ("-o", argv[i]) == 0 || strncmp ("-o=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + if (*equal == '=') + output_filename = equal + 1; + else if (i + 1 < argc) + { + argv[i++] = NULL; + output_filename = argv[i]; + } + argv[i] = NULL; + } + else if (strcmp ("-m", argv[i]) == 0 || strncmp ("-m=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + const gchar *mode = ""; + if (*equal == '=') + mode = equal + 1; + else if (i + 1 < argc) + { + argv[i++] = NULL; + mode = argv[i]; + } + if (strcmp (mode, "perf") == 0) + subtest_mode_perf = TRUE; + else if (strcmp (mode, "slow") == 0 || strcmp (mode, "thorough") == 0) + subtest_mode_quick = FALSE; + else if (strcmp (mode, "quick") == 0) + { + subtest_mode_quick = TRUE; + subtest_mode_perf = FALSE; + } + else + g_error ("unknown test mode: -m %s", mode); + argv[i] = NULL; + } + else if (strcmp ("-q", argv[i]) == 0 || strcmp ("--quiet", argv[i]) == 0) + { + gtester_quiet = TRUE; + gtester_verbose = FALSE; + argv[i] = NULL; + } + else if (strcmp ("--verbose", argv[i]) == 0) + { + gtester_quiet = FALSE; + gtester_verbose = TRUE; + argv[i] = NULL; + } + else if (strcmp ("-l", argv[i]) == 0) + { + gtester_list_tests = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--seed", argv[i]) == 0 || strncmp ("--seed=", argv[i], 7) == 0) + { + gchar *equal = argv[i] + 6; + if (*equal == '=') + subtest_seedstr = equal + 1; + else if (i + 1 < argc) + { + argv[i++] = NULL; + subtest_seedstr = argv[i]; + } + argv[i] = NULL; + } + } + /* collapse argv */ + e = 1; + for (i = 1; i < argc; i++) + if (argv[i]) + { + argv[e++] = argv[i]; + if (i >= e) + argv[i] = NULL; + } + *argc_p = e; +} + +int +main (int argc, + char **argv) +{ + guint ui; + + /* some unices need SA_RESTART for SIGCHLD to return -EAGAIN for io. + * we must fiddle with sigaction() *before* glib is used, otherwise + * we could revoke signal hanmdler setups from glib initialization code. + */ + if (TRUE) + { + struct sigaction sa; + struct sigaction osa; + sa.sa_handler = SIG_DFL; + sigfillset (&sa.sa_mask); + sa.sa_flags = SA_RESTART; + sigaction (SIGCHLD, &sa, &osa); + } + + g_set_prgname (argv[0]); + parse_args (&argc, &argv); + if (gtester_selftest) + return main_selftest (argc, argv); + + if (argc <= 1) + { + usage (FALSE); + return 1; + } + + if (output_filename) + { + log_fd = g_open (output_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (log_fd < 0) + g_error ("Failed to open log file '%s': %s", output_filename, g_strerror (errno)); + } + + test_log_printfe ("\n"); + test_log_printfe ("%s\n", sindent (log_indent)); + log_indent += 2; + for (ui = 1; ui < argc; ui++) + { + const char *binary = argv[ui]; + launch_test (binary); + /* we only get here on success or if !subtest_mode_fatal */ + } + log_indent -= 2; + test_log_printfe ("%s\n", sindent (log_indent)); + + close (log_fd); + + return testcase_fail_count == 0 ? 0 : 1; +} + +static void +fixture_setup (guint *fix, + gconstpointer test_data) +{ + g_assert_cmphex (*fix, ==, 0); + *fix = 0xdeadbeef; +} +static void +fixture_test (guint *fix, + gconstpointer test_data) +{ + g_assert_cmphex (*fix, ==, 0xdeadbeef); + g_test_message ("This is a test message API test message."); + g_test_bug_base ("http://www.example.com/bugtracker/"); + g_test_bug ("123"); + g_test_bug_base ("http://www.example.com/bugtracker?bugnum=%s;cmd=showbug"); + g_test_bug ("456"); +} +static void +fixture_teardown (guint *fix, + gconstpointer test_data) +{ + g_assert_cmphex (*fix, ==, 0xdeadbeef); +} + +static int +main_selftest (int argc, + char **argv) +{ + /* gtester main() for --gtester-selftest invokations */ + g_test_init (&argc, &argv, NULL); + g_test_add ("/gtester/fixture-test", guint, NULL, fixture_setup, fixture_test, fixture_teardown); + return g_test_run(); +} diff --git a/glib/gtestutils.c b/glib/gtestutils.c new file mode 100644 index 0000000..a6888de --- /dev/null +++ b/glib/gtestutils.c @@ -0,0 +1,2029 @@ +/* GLib testing utilities + * Copyright (C) 2007 Imendio AB + * Authors: Tim Janik, Sven Herzberg + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include "config.h" +#include "gtestutils.h" +#include +#include "galias.h" +#include +#ifdef G_OS_UNIX +#include +#include +#include +#endif +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef G_OS_WIN32 +#include +#endif +#include +#include +#ifdef HAVE_SYS_SELECT_H +#include +#endif /* HAVE_SYS_SELECT_H */ + +/* Global variable for storing assertion messages; this is the counterpart to + * glibc's (private) __abort_msg variable, and allows developers and crash + * analysis systems like Apport and ABRT to fish out assertion messages from + * core dumps, instead of having to catch them on screen output. */ +char *__glib_assert_msg = NULL; + +/* --- structures --- */ +struct GTestCase +{ + gchar *name; + guint fixture_size; + void (*fixture_setup) (void*, gconstpointer); + void (*fixture_test) (void*, gconstpointer); + void (*fixture_teardown) (void*, gconstpointer); + gpointer test_data; +}; +struct GTestSuite +{ + gchar *name; + GSList *suites; + GSList *cases; +}; +typedef struct DestroyEntry DestroyEntry; +struct DestroyEntry +{ + DestroyEntry *next; + GDestroyNotify destroy_func; + gpointer destroy_data; +}; + +/* --- prototypes --- */ +static void test_run_seed (const gchar *rseed); +static void test_trap_clear (void); +static guint8* g_test_log_dump (GTestLogMsg *msg, + guint *len); +static void gtest_default_log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data); + + +/* --- variables --- */ +static int test_log_fd = -1; +static gboolean test_mode_fatal = TRUE; +static gboolean g_test_run_once = TRUE; +static gboolean test_run_list = FALSE; +static gchar *test_run_seedstr = NULL; +static GRand *test_run_rand = NULL; +static gchar *test_run_name = ""; +static guint test_run_forks = 0; +static guint test_run_count = 0; +static guint test_skip_count = 0; +static GTimer *test_user_timer = NULL; +static double test_user_stamp = 0; +static GSList *test_paths = NULL; +static GTestSuite *test_suite_root = NULL; +static int test_trap_last_status = 0; +static int test_trap_last_pid = 0; +static char *test_trap_last_stdout = NULL; +static char *test_trap_last_stderr = NULL; +static char *test_uri_base = NULL; +static gboolean test_debug_log = FALSE; +static DestroyEntry *test_destroy_queue = NULL; +static GTestConfig mutable_test_config_vars = { + FALSE, /* test_initialized */ + TRUE, /* test_quick */ + FALSE, /* test_perf */ + FALSE, /* test_verbose */ + FALSE, /* test_quiet */ +}; +const GTestConfig * const g_test_config_vars = &mutable_test_config_vars; + +/* --- functions --- */ +const char* +g_test_log_type_name (GTestLogType log_type) +{ + switch (log_type) + { + case G_TEST_LOG_NONE: return "none"; + case G_TEST_LOG_ERROR: return "error"; + case G_TEST_LOG_START_BINARY: return "binary"; + case G_TEST_LOG_LIST_CASE: return "list"; + case G_TEST_LOG_SKIP_CASE: return "skip"; + case G_TEST_LOG_START_CASE: return "start"; + case G_TEST_LOG_STOP_CASE: return "stop"; + case G_TEST_LOG_MIN_RESULT: return "minperf"; + case G_TEST_LOG_MAX_RESULT: return "maxperf"; + case G_TEST_LOG_MESSAGE: return "message"; + } + return "???"; +} + +static void +g_test_log_send (guint n_bytes, + const guint8 *buffer) +{ + if (test_log_fd >= 0) + { + int r; + do + r = write (test_log_fd, buffer, n_bytes); + while (r < 0 && errno == EINTR); + } + if (test_debug_log) + { + GTestLogBuffer *lbuffer = g_test_log_buffer_new (); + GTestLogMsg *msg; + guint ui; + g_test_log_buffer_push (lbuffer, n_bytes, buffer); + msg = g_test_log_buffer_pop (lbuffer); + g_warn_if_fail (msg != NULL); + g_warn_if_fail (lbuffer->data->len == 0); + g_test_log_buffer_free (lbuffer); + /* print message */ + g_printerr ("{*LOG(%s)", g_test_log_type_name (msg->log_type)); + for (ui = 0; ui < msg->n_strings; ui++) + g_printerr (":{%s}", msg->strings[ui]); + if (msg->n_nums) + { + g_printerr (":("); + for (ui = 0; ui < msg->n_nums; ui++) + g_printerr ("%s%.16Lg", ui ? ";" : "", msg->nums[ui]); + g_printerr (")"); + } + g_printerr (":LOG*}\n"); + g_test_log_msg_free (msg); + } +} + +static void +g_test_log (GTestLogType lbit, + const gchar *string1, + const gchar *string2, + guint n_args, + long double *largs) +{ + gboolean fail = lbit == G_TEST_LOG_STOP_CASE && largs[0] != 0; + GTestLogMsg msg; + gchar *astrings[3] = { NULL, NULL, NULL }; + guint8 *dbuffer; + guint32 dbufferlen; + + switch (lbit) + { + case G_TEST_LOG_START_BINARY: + if (g_test_verbose()) + g_print ("GTest: random seed: %s\n", string2); + break; + case G_TEST_LOG_STOP_CASE: + if (g_test_verbose()) + g_print ("GTest: result: %s\n", fail ? "FAIL" : "OK"); + else if (!g_test_quiet()) + g_print ("%s\n", fail ? "FAIL" : "OK"); + if (fail && test_mode_fatal) + abort(); + break; + case G_TEST_LOG_MIN_RESULT: + if (g_test_verbose()) + g_print ("(MINPERF:%s)\n", string1); + break; + case G_TEST_LOG_MAX_RESULT: + if (g_test_verbose()) + g_print ("(MAXPERF:%s)\n", string1); + break; + case G_TEST_LOG_MESSAGE: + if (g_test_verbose()) + g_print ("(MSG: %s)\n", string1); + break; + default: ; + } + + msg.log_type = lbit; + msg.n_strings = (string1 != NULL) + (string1 && string2); + msg.strings = astrings; + astrings[0] = (gchar*) string1; + astrings[1] = astrings[0] ? (gchar*) string2 : NULL; + msg.n_nums = n_args; + msg.nums = largs; + dbuffer = g_test_log_dump (&msg, &dbufferlen); + g_test_log_send (dbufferlen, dbuffer); + g_free (dbuffer); + + switch (lbit) + { + case G_TEST_LOG_START_CASE: + if (g_test_verbose()) + g_print ("GTest: run: %s\n", string1); + else if (!g_test_quiet()) + g_print ("%s: ", string1); + break; + default: ; + } +} + +/* We intentionally parse the command line without GOptionContext + * because otherwise you would never be able to test it. + */ +static void +parse_args (gint *argc_p, + gchar ***argv_p) +{ + guint argc = *argc_p; + gchar **argv = *argv_p; + guint i, e; + /* parse known args */ + for (i = 1; i < argc; i++) + { + if (strcmp (argv[i], "--g-fatal-warnings") == 0) + { + GLogLevelFlags fatal_mask = (GLogLevelFlags) g_log_set_always_fatal ((GLogLevelFlags) G_LOG_FATAL_MASK); + fatal_mask = (GLogLevelFlags) (fatal_mask | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); + g_log_set_always_fatal (fatal_mask); + argv[i] = NULL; + } + else if (strcmp (argv[i], "--keep-going") == 0 || + strcmp (argv[i], "-k") == 0) + { + test_mode_fatal = FALSE; + argv[i] = NULL; + } + else if (strcmp (argv[i], "--debug-log") == 0) + { + test_debug_log = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--GTestLogFD", argv[i]) == 0 || strncmp ("--GTestLogFD=", argv[i], 13) == 0) + { + gchar *equal = argv[i] + 12; + if (*equal == '=') + test_log_fd = g_ascii_strtoull (equal + 1, NULL, 0); + else if (i + 1 < argc) + { + argv[i++] = NULL; + test_log_fd = g_ascii_strtoull (argv[i], NULL, 0); + } + argv[i] = NULL; + } + else if (strcmp ("--GTestSkipCount", argv[i]) == 0 || strncmp ("--GTestSkipCount=", argv[i], 17) == 0) + { + gchar *equal = argv[i] + 16; + if (*equal == '=') + test_skip_count = g_ascii_strtoull (equal + 1, NULL, 0); + else if (i + 1 < argc) + { + argv[i++] = NULL; + test_skip_count = g_ascii_strtoull (argv[i], NULL, 0); + } + argv[i] = NULL; + } + else if (strcmp ("-p", argv[i]) == 0 || strncmp ("-p=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + if (*equal == '=') + test_paths = g_slist_prepend (test_paths, equal + 1); + else if (i + 1 < argc) + { + argv[i++] = NULL; + test_paths = g_slist_prepend (test_paths, argv[i]); + } + argv[i] = NULL; + } + else if (strcmp ("-m", argv[i]) == 0 || strncmp ("-m=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + const gchar *mode = ""; + if (*equal == '=') + mode = equal + 1; + else if (i + 1 < argc) + { + argv[i++] = NULL; + mode = argv[i]; + } + if (strcmp (mode, "perf") == 0) + mutable_test_config_vars.test_perf = TRUE; + else if (strcmp (mode, "slow") == 0) + mutable_test_config_vars.test_quick = FALSE; + else if (strcmp (mode, "thorough") == 0) + mutable_test_config_vars.test_quick = FALSE; + else if (strcmp (mode, "quick") == 0) + { + mutable_test_config_vars.test_quick = TRUE; + mutable_test_config_vars.test_perf = FALSE; + } + else + g_error ("unknown test mode: -m %s", mode); + argv[i] = NULL; + } + else if (strcmp ("-q", argv[i]) == 0 || strcmp ("--quiet", argv[i]) == 0) + { + mutable_test_config_vars.test_quiet = TRUE; + mutable_test_config_vars.test_verbose = FALSE; + argv[i] = NULL; + } + else if (strcmp ("--verbose", argv[i]) == 0) + { + mutable_test_config_vars.test_quiet = FALSE; + mutable_test_config_vars.test_verbose = TRUE; + argv[i] = NULL; + } + else if (strcmp ("-l", argv[i]) == 0) + { + test_run_list = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--seed", argv[i]) == 0 || strncmp ("--seed=", argv[i], 7) == 0) + { + gchar *equal = argv[i] + 6; + if (*equal == '=') + test_run_seedstr = equal + 1; + else if (i + 1 < argc) + { + argv[i++] = NULL; + test_run_seedstr = argv[i]; + } + argv[i] = NULL; + } + else if (strcmp ("-?", argv[i]) == 0 || strcmp ("--help", argv[i]) == 0) + { + printf ("Usage:\n" + " %s [OPTION...]\n\n" + "Help Options:\n" + " -?, --help Show help options\n" + "Test Options:\n" + " -l List test cases available in a test executable\n" + " -seed=RANDOMSEED Provide a random seed to reproduce test\n" + " runs using random numbers\n" + " --verbose Run tests verbosely\n" + " -q, --quiet Run tests quietly\n" + " -p TESTPATH execute all tests matching TESTPATH\n" + " -m {perf|slow|thorough|quick} Execute tests according modes\n" + " --debug-log debug test logging output\n" + " -k, --keep-going gtester-specific argument\n" + " --GTestLogFD=N gtester-specific argument\n" + " --GTestSkipCount=N gtester-specific argument\n", + argv[0]); + exit (0); + } + } + /* collapse argv */ + e = 1; + for (i = 1; i < argc; i++) + if (argv[i]) + { + argv[e++] = argv[i]; + if (i >= e) + argv[i] = NULL; + } + *argc_p = e; +} + +/** + * g_test_init: + * @argc: Address of the @argc parameter of the main() function. + * Changed if any arguments were handled. + * @argv: Address of the @argv parameter of main(). + * Any parameters understood by g_test_init() stripped before return. + * @Varargs: Reserved for future extension. Currently, you must pass %NULL. + * + * Initialize the GLib testing framework, e.g. by seeding the + * test random number generator, the name for g_get_prgname() + * and parsing test related command line args. + * So far, the following arguments are understood: + * + * + * + * + * list test cases available in a test executable. + * + * + * + * + * + * provide a random seed to reproduce test runs using random numbers. + * + * + * + * + * run tests verbosely. + * + * + * , + * run tests quietly. + * + * + * + * + * execute all tests matching TESTPATH. + * + * + * + * + * + * execute tests according to these test modes: + * + * + * perf + * + * performance tests, may take long and report results. + * + * + * + * slow, thorough + * + * slow and thorough tests, may take quite long and + * maximize coverage. + * + * + * + * quick + * + * quick tests, should run really quickly and give good coverage. + * + * + * + * + * + * + * + * debug test logging output. + * + * + * , + * gtester-specific argument. + * + * + * + * gtester-specific argument. + * + * + * + * gtester-specific argument. + * + * + * + * Since: 2.16 + */ +void +g_test_init (int *argc, + char ***argv, + ...) +{ + static char seedstr[4 + 4 * 8 + 1]; + va_list args; + gpointer vararg1; + /* make warnings and criticals fatal for all test programs */ + GLogLevelFlags fatal_mask = (GLogLevelFlags) g_log_set_always_fatal ((GLogLevelFlags) G_LOG_FATAL_MASK); + fatal_mask = (GLogLevelFlags) (fatal_mask | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); + g_log_set_always_fatal (fatal_mask); + /* check caller args */ + g_return_if_fail (argc != NULL); + g_return_if_fail (argv != NULL); + g_return_if_fail (g_test_config_vars->test_initialized == FALSE); + mutable_test_config_vars.test_initialized = TRUE; + + va_start (args, argv); + vararg1 = va_arg (args, gpointer); /* reserved for future extensions */ + va_end (args); + g_return_if_fail (vararg1 == NULL); + + /* setup random seed string */ + g_snprintf (seedstr, sizeof (seedstr), "R02S%08x%08x%08x%08x", g_random_int(), g_random_int(), g_random_int(), g_random_int()); + test_run_seedstr = seedstr; + + /* parse args, sets up mode, changes seed, etc. */ + parse_args (argc, argv); + if (!g_get_prgname()) + g_set_prgname ((*argv)[0]); + + /* verify GRand reliability, needed for reliable seeds */ + if (1) + { + GRand *rg = g_rand_new_with_seed (0xc8c49fb6); + guint32 t1 = g_rand_int (rg), t2 = g_rand_int (rg), t3 = g_rand_int (rg), t4 = g_rand_int (rg); + /* g_print ("GRand-current: 0x%x 0x%x 0x%x 0x%x\n", t1, t2, t3, t4); */ + if (t1 != 0xfab39f9b || t2 != 0xb948fb0e || t3 != 0x3d31be26 || t4 != 0x43a19d66) + g_warning ("random numbers are not GRand-2.2 compatible, seeds may be broken (check $G_RANDOM_VERSION)"); + g_rand_free (rg); + } + + /* check rand seed */ + test_run_seed (test_run_seedstr); + + /* report program start */ + g_log_set_default_handler (gtest_default_log_handler, NULL); + g_test_log (G_TEST_LOG_START_BINARY, g_get_prgname(), test_run_seedstr, 0, NULL); +} + +static void +test_run_seed (const gchar *rseed) +{ + guint seed_failed = 0; + if (test_run_rand) + g_rand_free (test_run_rand); + test_run_rand = NULL; + while (strchr (" \t\v\r\n\f", *rseed)) + rseed++; + if (strncmp (rseed, "R02S", 4) == 0) /* seed for random generator 02 (GRand-2.2) */ + { + const char *s = rseed + 4; + if (strlen (s) >= 32) /* require 4 * 8 chars */ + { + guint32 seedarray[4]; + gchar *p, hexbuf[9] = { 0, }; + memcpy (hexbuf, s + 0, 8); + seedarray[0] = g_ascii_strtoull (hexbuf, &p, 16); + seed_failed += p != NULL && *p != 0; + memcpy (hexbuf, s + 8, 8); + seedarray[1] = g_ascii_strtoull (hexbuf, &p, 16); + seed_failed += p != NULL && *p != 0; + memcpy (hexbuf, s + 16, 8); + seedarray[2] = g_ascii_strtoull (hexbuf, &p, 16); + seed_failed += p != NULL && *p != 0; + memcpy (hexbuf, s + 24, 8); + seedarray[3] = g_ascii_strtoull (hexbuf, &p, 16); + seed_failed += p != NULL && *p != 0; + if (!seed_failed) + { + test_run_rand = g_rand_new_with_seed_array (seedarray, 4); + return; + } + } + } + g_error ("Unknown or invalid random seed: %s", rseed); +} + +/** + * g_test_rand_int: + * + * Get a reproducible random integer number. + * + * The random numbers generated by the g_test_rand_*() family of functions + * change with every new test program start, unless the --seed option is + * given when starting test programs. + * + * For individual test cases however, the random number generator is + * reseeded, to avoid dependencies between tests and to make --seed + * effective for all test cases. + * + * Returns: a random number from the seeded random number generator. + * + * Since: 2.16 + */ +gint32 +g_test_rand_int (void) +{ + return g_rand_int (test_run_rand); +} + +/** + * g_test_rand_int_range: + * @begin: the minimum value returned by this function + * @end: the smallest value not to be returned by this function + * + * Get a reproducible random integer number out of a specified range, + * see g_test_rand_int() for details on test case random numbers. + * + * Returns: a number with @begin <= number < @end. + * + * Since: 2.16 + */ +gint32 +g_test_rand_int_range (gint32 begin, + gint32 end) +{ + return g_rand_int_range (test_run_rand, begin, end); +} + +/** + * g_test_rand_double: + * + * Get a reproducible random floating point number, + * see g_test_rand_int() for details on test case random numbers. + * + * Returns: a random number from the seeded random number generator. + * + * Since: 2.16 + */ +double +g_test_rand_double (void) +{ + return g_rand_double (test_run_rand); +} + +/** + * g_test_rand_double_range: + * @range_start: the minimum value returned by this function + * @range_end: the minimum value not returned by this function + * + * Get a reproducible random floating pointer number out of a specified range, + * see g_test_rand_int() for details on test case random numbers. + * + * Returns: a number with @range_start <= number < @range_end. + * + * Since: 2.16 + */ +double +g_test_rand_double_range (double range_start, + double range_end) +{ + return g_rand_double_range (test_run_rand, range_start, range_end); +} + +/** + * g_test_timer_start: + * + * Start a timing test. Call g_test_timer_elapsed() when the task is supposed + * to be done. Call this function again to restart the timer. + * + * Since: 2.16 + */ +void +g_test_timer_start (void) +{ + if (!test_user_timer) + test_user_timer = g_timer_new(); + test_user_stamp = 0; + g_timer_start (test_user_timer); +} + +/** + * g_test_timer_elapsed: + * + * Get the time since the last start of the timer with g_test_timer_start(). + * + * Returns: the time since the last start of the timer, as a double + * + * Since: 2.16 + */ +double +g_test_timer_elapsed (void) +{ + test_user_stamp = test_user_timer ? g_timer_elapsed (test_user_timer, NULL) : 0; + return test_user_stamp; +} + +/** + * g_test_timer_last: + * + * Report the last result of g_test_timer_elapsed(). + * + * Returns: the last result of g_test_timer_elapsed(), as a double + * + * Since: 2.16 + */ +double +g_test_timer_last (void) +{ + return test_user_stamp; +} + +/** + * g_test_minimized_result: + * @minimized_quantity: the reported value + * @format: the format string of the report message + * @Varargs: arguments to pass to the printf() function + * + * Report the result of a performance or measurement test. + * The test should generally strive to minimize the reported + * quantities (smaller values are better than larger ones), + * this and @minimized_quantity can determine sorting + * order for test result reports. + * + * Since: 2.16 + */ +void +g_test_minimized_result (double minimized_quantity, + const char *format, + ...) +{ + long double largs = minimized_quantity; + gchar *buffer; + va_list args; + va_start (args, format); + buffer = g_strdup_vprintf (format, args); + va_end (args); + g_test_log (G_TEST_LOG_MIN_RESULT, buffer, NULL, 1, &largs); + g_free (buffer); +} + +/** + * g_test_maximized_result: + * @maximized_quantity: the reported value + * @format: the format string of the report message + * @Varargs: arguments to pass to the printf() function + * + * Report the result of a performance or measurement test. + * The test should generally strive to maximize the reported + * quantities (larger values are better than smaller ones), + * this and @maximized_quantity can determine sorting + * order for test result reports. + * + * Since: 2.16 + */ +void +g_test_maximized_result (double maximized_quantity, + const char *format, + ...) +{ + long double largs = maximized_quantity; + gchar *buffer; + va_list args; + va_start (args, format); + buffer = g_strdup_vprintf (format, args); + va_end (args); + g_test_log (G_TEST_LOG_MAX_RESULT, buffer, NULL, 1, &largs); + g_free (buffer); +} + +/** + * g_test_message: + * @format: the format string + * @...: printf-like arguments to @format + * + * Add a message to the test report. + * + * Since: 2.16 + */ +void +g_test_message (const char *format, + ...) +{ + gchar *buffer; + va_list args; + va_start (args, format); + buffer = g_strdup_vprintf (format, args); + va_end (args); + g_test_log (G_TEST_LOG_MESSAGE, buffer, NULL, 0, NULL); + g_free (buffer); +} + +/** + * g_test_bug_base: + * @uri_pattern: the base pattern for bug URIs + * + * Specify the base URI for bug reports. + * + * The base URI is used to construct bug report messages for + * g_test_message() when g_test_bug() is called. + * Calling this function outside of a test case sets the + * default base URI for all test cases. Calling it from within + * a test case changes the base URI for the scope of the test + * case only. + * Bug URIs are constructed by appending a bug specific URI + * portion to @uri_pattern, or by replacing the special string + * '%s' within @uri_pattern if that is present. + * + * Since: 2.16 + */ +void +g_test_bug_base (const char *uri_pattern) +{ + g_free (test_uri_base); + test_uri_base = g_strdup (uri_pattern); +} + +/** + * g_test_bug: + * @bug_uri_snippet: Bug specific bug tracker URI portion. + * + * This function adds a message to test reports that + * associates a bug URI with a test case. + * Bug URIs are constructed from a base URI set with g_test_bug_base() + * and @bug_uri_snippet. + * + * Since: 2.16 + */ +void +g_test_bug (const char *bug_uri_snippet) +{ + char *c; + g_return_if_fail (test_uri_base != NULL); + g_return_if_fail (bug_uri_snippet != NULL); + c = strstr (test_uri_base, "%s"); + if (c) + { + char *b = g_strndup (test_uri_base, c - test_uri_base); + char *s = g_strconcat (b, bug_uri_snippet, c + 2, NULL); + g_free (b); + g_test_message ("Bug Reference: %s", s); + g_free (s); + } + else + g_test_message ("Bug Reference: %s%s", test_uri_base, bug_uri_snippet); +} + +/** + * g_test_get_root: + * + * Get the toplevel test suite for the test path API. + * + * Returns: the toplevel #GTestSuite + * + * Since: 2.16 + */ +GTestSuite* +g_test_get_root (void) +{ + if (!test_suite_root) + { + test_suite_root = g_test_create_suite ("root"); + g_free (test_suite_root->name); + test_suite_root->name = g_strdup (""); + } + return test_suite_root; +} + +/** + * g_test_run: + * + * Runs all tests under the toplevel suite which can be retrieved + * with g_test_get_root(). Similar to g_test_run_suite(), the test + * cases to be run are filtered according to + * test path arguments (-p testpath) as + * parsed by g_test_init(). + * g_test_run_suite() or g_test_run() may only be called once + * in a program. + * + * Returns: 0 on success + * + * Since: 2.16 + */ +int +g_test_run (void) +{ + return g_test_run_suite (g_test_get_root()); +} + +/** + * g_test_create_case: + * @test_name: the name for the test case + * @data_size: the size of the fixture data structure + * @test_data: test data argument for the test functions + * @data_setup: the function to set up the fixture data + * @data_test: the actual test function + * @data_teardown: the function to teardown the fixture data + * + * Create a new #GTestCase, named @test_name, this API is fairly + * low level, calling g_test_add() or g_test_add_func() is preferable. + * When this test is executed, a fixture structure of size @data_size + * will be allocated and filled with 0s. Then data_setup() is called + * to initialize the fixture. After fixture setup, the actual test + * function data_test() is called. Once the test run completed, the + * fixture structure is torn down by calling data_teardown() and + * after that the memory is released. + * + * Splitting up a test run into fixture setup, test function and + * fixture teardown is most usful if the same fixture is used for + * multiple tests. In this cases, g_test_create_case() will be + * called with the same fixture, but varying @test_name and + * @data_test arguments. + * + * Returns: a newly allocated #GTestCase. + * + * Since: 2.16 + */ +GTestCase* +g_test_create_case (const char *test_name, + gsize data_size, + gconstpointer test_data, + void (*data_setup) (void), + void (*data_test) (void), + void (*data_teardown) (void)) +{ + GTestCase *tc; + g_return_val_if_fail (test_name != NULL, NULL); + g_return_val_if_fail (strchr (test_name, '/') == NULL, NULL); + g_return_val_if_fail (test_name[0] != 0, NULL); + g_return_val_if_fail (data_test != NULL, NULL); + tc = g_slice_new0 (GTestCase); + tc->name = g_strdup (test_name); + tc->test_data = (gpointer) test_data; + tc->fixture_size = data_size; + tc->fixture_setup = (void*) data_setup; + tc->fixture_test = (void*) data_test; + tc->fixture_teardown = (void*) data_teardown; + return tc; +} + +void +g_test_add_vtable (const char *testpath, + gsize data_size, + gconstpointer test_data, + void (*data_setup) (void), + void (*fixture_test_func) (void), + void (*data_teardown) (void)) +{ + gchar **segments; + guint ui; + GTestSuite *suite; + + g_return_if_fail (testpath != NULL); + g_return_if_fail (testpath[0] == '/'); + g_return_if_fail (fixture_test_func != NULL); + + suite = g_test_get_root(); + segments = g_strsplit (testpath, "/", -1); + for (ui = 0; segments[ui] != NULL; ui++) + { + const char *seg = segments[ui]; + gboolean islast = segments[ui + 1] == NULL; + if (islast && !seg[0]) + g_error ("invalid test case path: %s", testpath); + else if (!seg[0]) + continue; /* initial or duplicate slash */ + else if (!islast) + { + GTestSuite *csuite = g_test_create_suite (seg); + g_test_suite_add_suite (suite, csuite); + suite = csuite; + } + else /* islast */ + { + GTestCase *tc = g_test_create_case (seg, data_size, test_data, data_setup, fixture_test_func, data_teardown); + g_test_suite_add (suite, tc); + } + } + g_strfreev (segments); +} + +/** + * g_test_add_func: + * @testpath: Slash-separated test case path name for the test. + * @test_func: The test function to invoke for this test. + * + * Create a new test case, similar to g_test_create_case(). However + * the test is assumed to use no fixture, and test suites are automatically + * created on the fly and added to the root fixture, based on the + * slash-separated portions of @testpath. + * + * Since: 2.16 + */ +void +g_test_add_func (const char *testpath, + void (*test_func) (void)) +{ + g_return_if_fail (testpath != NULL); + g_return_if_fail (testpath[0] == '/'); + g_return_if_fail (test_func != NULL); + g_test_add_vtable (testpath, 0, NULL, NULL, test_func, NULL); +} + +/** + * g_test_add_data_func: + * @testpath: Slash-separated test case path name for the test. + * @test_data: Test data argument for the test function. + * @test_func: The test function to invoke for this test. + * + * Create a new test case, similar to g_test_create_case(). However + * the test is assumed to use no fixture, and test suites are automatically + * created on the fly and added to the root fixture, based on the + * slash-separated portions of @testpath. The @test_data argument + * will be passed as first argument to @test_func. + * + * Since: 2.16 + */ +void +g_test_add_data_func (const char *testpath, + gconstpointer test_data, + void (*test_func) (gconstpointer)) +{ + g_return_if_fail (testpath != NULL); + g_return_if_fail (testpath[0] == '/'); + g_return_if_fail (test_func != NULL); + g_test_add_vtable (testpath, 0, test_data, NULL, (void(*)(void)) test_func, NULL); +} + +/** + * g_test_create_suite: + * @suite_name: a name for the suite + * + * Create a new test suite with the name @suite_name. + * + * Returns: A newly allocated #GTestSuite instance. + * + * Since: 2.16 + */ +GTestSuite* +g_test_create_suite (const char *suite_name) +{ + GTestSuite *ts; + g_return_val_if_fail (suite_name != NULL, NULL); + g_return_val_if_fail (strchr (suite_name, '/') == NULL, NULL); + g_return_val_if_fail (suite_name[0] != 0, NULL); + ts = g_slice_new0 (GTestSuite); + ts->name = g_strdup (suite_name); + return ts; +} + +/** + * g_test_suite_add: + * @suite: a #GTestSuite + * @test_case: a #GTestCase + * + * Adds @test_case to @suite. + * + * Since: 2.16 + */ +void +g_test_suite_add (GTestSuite *suite, + GTestCase *test_case) +{ + g_return_if_fail (suite != NULL); + g_return_if_fail (test_case != NULL); + suite->cases = g_slist_prepend (suite->cases, test_case); +} + +/** + * g_test_suite_add_suite: + * @suite: a #GTestSuite + * @nestedsuite: another #GTestSuite + * + * Adds @nestedsuite to @suite. + * + * Since: 2.16 + */ +void +g_test_suite_add_suite (GTestSuite *suite, + GTestSuite *nestedsuite) +{ + g_return_if_fail (suite != NULL); + g_return_if_fail (nestedsuite != NULL); + suite->suites = g_slist_prepend (suite->suites, nestedsuite); +} + +/** + * g_test_queue_free: + * @gfree_pointer: the pointer to be stored. + * + * Enqueue a pointer to be released with g_free() during the next + * teardown phase. This is equivalent to calling g_test_queue_destroy() + * with a destroy callback of g_free(). + * + * Since: 2.16 + */ +void +g_test_queue_free (gpointer gfree_pointer) +{ + if (gfree_pointer) + g_test_queue_destroy (g_free, gfree_pointer); +} + +/** + * g_test_queue_destroy: + * @destroy_func: Destroy callback for teardown phase. + * @destroy_data: Destroy callback data. + * + * This function enqueus a callback @destroy_func() to be executed + * during the next test case teardown phase. This is most useful + * to auto destruct allocted test resources at the end of a test run. + * Resources are released in reverse queue order, that means enqueueing + * callback A before callback B will cause B() to be called before + * A() during teardown. + * + * Since: 2.16 + */ +void +g_test_queue_destroy (GDestroyNotify destroy_func, + gpointer destroy_data) +{ + DestroyEntry *dentry; + g_return_if_fail (destroy_func != NULL); + dentry = g_slice_new0 (DestroyEntry); + dentry->destroy_func = destroy_func; + dentry->destroy_data = destroy_data; + dentry->next = test_destroy_queue; + test_destroy_queue = dentry; +} + +static int +test_case_run (GTestCase *tc) +{ + gchar *old_name = test_run_name, *old_base = g_strdup (test_uri_base); + test_run_name = g_strconcat (old_name, "/", tc->name, NULL); + if (++test_run_count <= test_skip_count) + g_test_log (G_TEST_LOG_SKIP_CASE, test_run_name, NULL, 0, NULL); + else if (test_run_list) + { + g_print ("%s\n", test_run_name); + g_test_log (G_TEST_LOG_LIST_CASE, test_run_name, NULL, 0, NULL); + } + else + { + GTimer *test_run_timer = g_timer_new(); + long double largs[3]; + void *fixture; + g_test_log (G_TEST_LOG_START_CASE, test_run_name, NULL, 0, NULL); + test_run_forks = 0; + g_test_log_set_fatal_handler (NULL, NULL); + g_timer_start (test_run_timer); + fixture = tc->fixture_size ? g_malloc0 (tc->fixture_size) : tc->test_data; + test_run_seed (test_run_seedstr); + if (tc->fixture_setup) + tc->fixture_setup (fixture, tc->test_data); + tc->fixture_test (fixture, tc->test_data); + test_trap_clear(); + while (test_destroy_queue) + { + DestroyEntry *dentry = test_destroy_queue; + test_destroy_queue = dentry->next; + dentry->destroy_func (dentry->destroy_data); + g_slice_free (DestroyEntry, dentry); + } + if (tc->fixture_teardown) + tc->fixture_teardown (fixture, tc->test_data); + if (tc->fixture_size) + g_free (fixture); + g_timer_stop (test_run_timer); + largs[0] = 0; /* OK */ + largs[1] = test_run_forks; + largs[2] = g_timer_elapsed (test_run_timer, NULL); + g_test_log (G_TEST_LOG_STOP_CASE, NULL, NULL, G_N_ELEMENTS (largs), largs); + g_timer_destroy (test_run_timer); + } + g_free (test_run_name); + test_run_name = old_name; + g_free (test_uri_base); + test_uri_base = old_base; + return 0; +} + +static int +g_test_run_suite_internal (GTestSuite *suite, + const char *path) +{ + guint n_bad = 0, n_good = 0, bad_suite = 0, l; + gchar *rest, *old_name = test_run_name; + GSList *slist, *reversed; + g_return_val_if_fail (suite != NULL, -1); + while (path[0] == '/') + path++; + l = strlen (path); + rest = strchr (path, '/'); + l = rest ? MIN (l, rest - path) : l; + test_run_name = suite->name[0] == 0 ? g_strdup (test_run_name) : g_strconcat (old_name, "/", suite->name, NULL); + reversed = g_slist_reverse (g_slist_copy (suite->cases)); + for (slist = reversed; slist; slist = slist->next) + { + GTestCase *tc = slist->data; + guint n = l ? strlen (tc->name) : 0; + if (l == n && strncmp (path, tc->name, n) == 0) + { + n_good++; + n_bad += test_case_run (tc) != 0; + } + } + g_slist_free (reversed); + reversed = g_slist_reverse (g_slist_copy (suite->suites)); + for (slist = reversed; slist; slist = slist->next) + { + GTestSuite *ts = slist->data; + guint n = l ? strlen (ts->name) : 0; + if (l == n && strncmp (path, ts->name, n) == 0) + bad_suite += g_test_run_suite_internal (ts, rest ? rest : "") != 0; + } + g_slist_free (reversed); + g_free (test_run_name); + test_run_name = old_name; + return n_bad || bad_suite; +} + +/** + * g_test_run_suite: + * @suite: a #GTestSuite + * + * Execute the tests within @suite and all nested #GTestSuites. + * The test suites to be executed are filtered according to + * test path arguments (-p testpath) + * as parsed by g_test_init(). + * g_test_run_suite() or g_test_run() may only be called once + * in a program. + * + * Returns: 0 on success + * + * Since: 2.16 + */ +int +g_test_run_suite (GTestSuite *suite) +{ + guint n_bad = 0; + g_return_val_if_fail (g_test_config_vars->test_initialized, -1); + g_return_val_if_fail (g_test_run_once == TRUE, -1); + g_test_run_once = FALSE; + if (!test_paths) + test_paths = g_slist_prepend (test_paths, ""); + while (test_paths) + { + const char *rest, *path = test_paths->data; + guint l, n = strlen (suite->name); + test_paths = g_slist_delete_link (test_paths, test_paths); + while (path[0] == '/') + path++; + if (!n) /* root suite, run unconditionally */ + { + n_bad += 0 != g_test_run_suite_internal (suite, path); + continue; + } + /* regular suite, match path */ + rest = strchr (path, '/'); + l = strlen (path); + l = rest ? MIN (l, rest - path) : l; + if ((!l || l == n) && strncmp (path, suite->name, n) == 0) + n_bad += 0 != g_test_run_suite_internal (suite, rest ? rest : ""); + } + return n_bad; +} + +static void +gtest_default_log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data) +{ + const gchar *strv[16]; + gchar *msg; + guint i = 0; + if (log_domain) + { + strv[i++] = log_domain; + strv[i++] = "-"; + } + if (log_level & G_LOG_FLAG_FATAL) + strv[i++] = "FATAL-"; + if (log_level & G_LOG_FLAG_RECURSION) + strv[i++] = "RECURSIVE-"; + if (log_level & G_LOG_LEVEL_ERROR) + strv[i++] = "ERROR"; + if (log_level & G_LOG_LEVEL_CRITICAL) + strv[i++] = "CRITICAL"; + if (log_level & G_LOG_LEVEL_WARNING) + strv[i++] = "WARNING"; + if (log_level & G_LOG_LEVEL_MESSAGE) + strv[i++] = "MESSAGE"; + if (log_level & G_LOG_LEVEL_INFO) + strv[i++] = "INFO"; + if (log_level & G_LOG_LEVEL_DEBUG) + strv[i++] = "DEBUG"; + strv[i++] = ": "; + strv[i++] = message; + strv[i++] = NULL; + msg = g_strjoinv ("", (gchar**) strv); + g_test_log (G_TEST_LOG_ERROR, msg, NULL, 0, NULL); + g_log_default_handler (log_domain, log_level, message, unused_data); + g_free (msg); +} + +void +g_assertion_message (const char *domain, + const char *file, + int line, + const char *func, + const char *message) +{ + char lstr[32]; + char *s; + if (!message) + message = "code should not be reached"; + g_snprintf (lstr, 32, "%d", line); + s = g_strconcat (domain ? domain : "", domain && domain[0] ? ":" : "", + "ERROR:", file, ":", lstr, ":", + func, func[0] ? ":" : "", + " ", message, NULL); + g_printerr ("**\n%s\n", s); + + /* store assertion message in global variable, so that it can be found in a + * core dump */ + if (__glib_assert_msg != NULL) + /* free the old one */ + free (__glib_assert_msg); + __glib_assert_msg = (char*) malloc (strlen (s) + 1); + strcpy (__glib_assert_msg, s); + + g_test_log (G_TEST_LOG_ERROR, s, NULL, 0, NULL); + g_free (s); + abort(); +} + +void +g_assertion_message_expr (const char *domain, + const char *file, + int line, + const char *func, + const char *expr) +{ + char *s = g_strconcat ("assertion failed: (", expr, ")", NULL); + g_assertion_message (domain, file, line, func, s); + g_free (s); +} + +void +g_assertion_message_cmpnum (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + long double arg1, + const char *cmp, + long double arg2, + char numtype) +{ + char *s = NULL; + switch (numtype) + { + case 'i': s = g_strdup_printf ("assertion failed (%s): (%.0Lf %s %.0Lf)", expr, arg1, cmp, arg2); break; + case 'x': s = g_strdup_printf ("assertion failed (%s): (0x%08" G_GINT64_MODIFIER "x %s 0x%08" G_GINT64_MODIFIER "x)", expr, (guint64) arg1, cmp, (guint64) arg2); break; + case 'f': s = g_strdup_printf ("assertion failed (%s): (%.9Lg %s %.9Lg)", expr, arg1, cmp, arg2); break; + /* ideally use: floats=%.7g double=%.17g */ + } + g_assertion_message (domain, file, line, func, s); + g_free (s); +} + +void +g_assertion_message_cmpstr (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + const char *arg1, + const char *cmp, + const char *arg2) +{ + char *a1, *a2, *s, *t1 = NULL, *t2 = NULL; + a1 = arg1 ? g_strconcat ("\"", t1 = g_strescape (arg1, NULL), "\"", NULL) : g_strdup ("NULL"); + a2 = arg2 ? g_strconcat ("\"", t2 = g_strescape (arg2, NULL), "\"", NULL) : g_strdup ("NULL"); + g_free (t1); + g_free (t2); + s = g_strdup_printf ("assertion failed (%s): (%s %s %s)", expr, a1, cmp, a2); + g_free (a1); + g_free (a2); + g_assertion_message (domain, file, line, func, s); + g_free (s); +} + +void +g_assertion_message_error (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + GError *error, + GQuark error_domain, + int error_code) +{ + GString *gstring; + + /* This is used by both g_assert_error() and g_assert_no_error(), so there + * are three cases: expected an error but got the wrong error, expected + * an error but got no error, and expected no error but got an error. + */ + + gstring = g_string_new ("assertion failed "); + if (error_domain) + g_string_append_printf (gstring, "(%s == (%s, %d)): ", expr, + g_quark_to_string (error_domain), error_code); + else + g_string_append_printf (gstring, "(%s == NULL): ", expr); + + if (error) + g_string_append_printf (gstring, "%s (%s, %d)", error->message, + g_quark_to_string (error->domain), error->code); + else + g_string_append_printf (gstring, "%s is NULL", expr); + + g_assertion_message (domain, file, line, func, gstring->str); + g_string_free (gstring, TRUE); +} + +/** + * g_strcmp0: + * @str1: a C string or %NULL + * @str2: another C string or %NULL + * + * Compares @str1 and @str2 like strcmp(). Handles %NULL + * gracefully by sorting it before non-%NULL strings. + * + * Returns: -1, 0 or 1, if @str1 is <, == or > than @str2. + * + * Since: 2.16 + */ +int +g_strcmp0 (const char *str1, + const char *str2) +{ + if (!str1) + return -(str1 != str2); + if (!str2) + return str1 != str2; + return strcmp (str1, str2); +} + +#ifdef G_OS_UNIX +static int /* 0 on success */ +kill_child (int pid, + int *status, + int patience) +{ + int wr; + if (patience >= 3) /* try graceful reap */ + { + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + } + if (patience >= 2) /* try SIGHUP */ + { + kill (pid, SIGHUP); + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + g_usleep (20 * 1000); /* give it some scheduling/shutdown time */ + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + g_usleep (50 * 1000); /* give it some scheduling/shutdown time */ + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + g_usleep (100 * 1000); /* give it some scheduling/shutdown time */ + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + } + if (patience >= 1) /* try SIGTERM */ + { + kill (pid, SIGTERM); + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + g_usleep (200 * 1000); /* give it some scheduling/shutdown time */ + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + g_usleep (400 * 1000); /* give it some scheduling/shutdown time */ + if (waitpid (pid, status, WNOHANG) > 0) + return 0; + } + /* finish it off */ + kill (pid, SIGKILL); + do + wr = waitpid (pid, status, 0); + while (wr < 0 && errno == EINTR); + return wr; +} +#endif + +static inline int +g_string_must_read (GString *gstring, + int fd) +{ +#define STRING_BUFFER_SIZE 4096 + char buf[STRING_BUFFER_SIZE]; + gssize bytes; + again: + bytes = read (fd, buf, sizeof (buf)); + if (bytes == 0) + return 0; /* EOF, calling this function assumes data is available */ + else if (bytes > 0) + { + g_string_append_len (gstring, buf, bytes); + return 1; + } + else if (bytes < 0 && errno == EINTR) + goto again; + else /* bytes < 0 */ + { + g_warning ("failed to read() from child process (%d): %s", test_trap_last_pid, g_strerror (errno)); + return 1; /* ignore error after warning */ + } +} + +static inline void +g_string_write_out (GString *gstring, + int outfd, + int *stringpos) +{ + if (*stringpos < gstring->len) + { + int r; + do + r = write (outfd, gstring->str + *stringpos, gstring->len - *stringpos); + while (r < 0 && errno == EINTR); + *stringpos += MAX (r, 0); + } +} + +static void +test_trap_clear (void) +{ + test_trap_last_status = 0; + test_trap_last_pid = 0; + g_free (test_trap_last_stdout); + test_trap_last_stdout = NULL; + g_free (test_trap_last_stderr); + test_trap_last_stderr = NULL; +} + +#ifdef G_OS_UNIX + +static int +sane_dup2 (int fd1, + int fd2) +{ + int ret; + do + ret = dup2 (fd1, fd2); + while (ret < 0 && errno == EINTR); + return ret; +} + +static guint64 +test_time_stamp (void) +{ + GTimeVal tv; + guint64 stamp; + g_get_current_time (&tv); + stamp = tv.tv_sec; + stamp = stamp * 1000000 + tv.tv_usec; + return stamp; +} + +#endif + +/** + * g_test_trap_fork: + * @usec_timeout: Timeout for the forked test in micro seconds. + * @test_trap_flags: Flags to modify forking behaviour. + * + * Fork the current test program to execute a test case that might + * not return or that might abort. The forked test case is aborted + * and considered failing if its run time exceeds @usec_timeout. + * + * The forking behavior can be configured with the #GTestTrapFlags flags. + * + * In the following example, the test code forks, the forked child + * process produces some sample output and exits successfully. + * The forking parent process then asserts successful child program + * termination and validates child program outputs. + * + * |[ + * static void + * test_fork_patterns (void) + * { + * if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + * { + * g_print ("some stdout text: somagic17\n"); + * g_printerr ("some stderr text: semagic43\n"); + * exit (0); /* successful test run */ + * } + * g_test_trap_assert_passed(); + * g_test_trap_assert_stdout ("*somagic17*"); + * g_test_trap_assert_stderr ("*semagic43*"); + * } + * ]| + * + * This function is implemented only on Unix platforms. + * + * Returns: %TRUE for the forked child and %FALSE for the executing parent process. + * + * Since: 2.16 + */ +gboolean +g_test_trap_fork (guint64 usec_timeout, + GTestTrapFlags test_trap_flags) +{ +#ifdef G_OS_UNIX + gboolean pass_on_forked_log = FALSE; + int stdout_pipe[2] = { -1, -1 }; + int stderr_pipe[2] = { -1, -1 }; + int stdtst_pipe[2] = { -1, -1 }; + test_trap_clear(); + if (pipe (stdout_pipe) < 0 || pipe (stderr_pipe) < 0 || pipe (stdtst_pipe) < 0) + g_error ("failed to create pipes to fork test program: %s", g_strerror (errno)); + signal (SIGCHLD, SIG_DFL); + test_trap_last_pid = fork (); + if (test_trap_last_pid < 0) + g_error ("failed to fork test program: %s", g_strerror (errno)); + if (test_trap_last_pid == 0) /* child */ + { + int fd0 = -1; + close (stdout_pipe[0]); + close (stderr_pipe[0]); + close (stdtst_pipe[0]); + if (!(test_trap_flags & G_TEST_TRAP_INHERIT_STDIN)) + fd0 = open ("/dev/null", O_RDONLY); + if (sane_dup2 (stdout_pipe[1], 1) < 0 || sane_dup2 (stderr_pipe[1], 2) < 0 || (fd0 >= 0 && sane_dup2 (fd0, 0) < 0)) + g_error ("failed to dup2() in forked test program: %s", g_strerror (errno)); + if (fd0 >= 3) + close (fd0); + if (stdout_pipe[1] >= 3) + close (stdout_pipe[1]); + if (stderr_pipe[1] >= 3) + close (stderr_pipe[1]); + test_log_fd = stdtst_pipe[1]; + return TRUE; + } + else /* parent */ + { + GString *sout = g_string_new (NULL); + GString *serr = g_string_new (NULL); + guint64 sstamp; + int soutpos = 0, serrpos = 0, wr, need_wait = TRUE; + test_run_forks++; + close (stdout_pipe[1]); + close (stderr_pipe[1]); + close (stdtst_pipe[1]); + sstamp = test_time_stamp(); + /* read data until we get EOF on all pipes */ + while (stdout_pipe[0] >= 0 || stderr_pipe[0] >= 0 || stdtst_pipe[0] > 0) + { + fd_set fds; + struct timeval tv; + int ret; + FD_ZERO (&fds); + if (stdout_pipe[0] >= 0) + FD_SET (stdout_pipe[0], &fds); + if (stderr_pipe[0] >= 0) + FD_SET (stderr_pipe[0], &fds); + if (stdtst_pipe[0] >= 0) + FD_SET (stdtst_pipe[0], &fds); + tv.tv_sec = 0; + tv.tv_usec = MIN (usec_timeout ? usec_timeout : 1000000, 100 * 1000); /* sleep at most 0.5 seconds to catch clock skews, etc. */ + ret = select (MAX (MAX (stdout_pipe[0], stderr_pipe[0]), stdtst_pipe[0]) + 1, &fds, NULL, NULL, &tv); + if (ret < 0 && errno != EINTR) + { + g_warning ("Unexpected error in select() while reading from child process (%d): %s", test_trap_last_pid, g_strerror (errno)); + break; + } + if (stdout_pipe[0] >= 0 && FD_ISSET (stdout_pipe[0], &fds) && + g_string_must_read (sout, stdout_pipe[0]) == 0) + { + close (stdout_pipe[0]); + stdout_pipe[0] = -1; + } + if (stderr_pipe[0] >= 0 && FD_ISSET (stderr_pipe[0], &fds) && + g_string_must_read (serr, stderr_pipe[0]) == 0) + { + close (stderr_pipe[0]); + stderr_pipe[0] = -1; + } + if (stdtst_pipe[0] >= 0 && FD_ISSET (stdtst_pipe[0], &fds)) + { + guint8 buffer[4096]; + gint l, r = read (stdtst_pipe[0], buffer, sizeof (buffer)); + if (r > 0 && test_log_fd > 0) + do + l = write (pass_on_forked_log ? test_log_fd : -1, buffer, r); + while (l < 0 && errno == EINTR); + if (r == 0 || (r < 0 && errno != EINTR && errno != EAGAIN)) + { + close (stdtst_pipe[0]); + stdtst_pipe[0] = -1; + } + } + if (!(test_trap_flags & G_TEST_TRAP_SILENCE_STDOUT)) + g_string_write_out (sout, 1, &soutpos); + if (!(test_trap_flags & G_TEST_TRAP_SILENCE_STDERR)) + g_string_write_out (serr, 2, &serrpos); + if (usec_timeout) + { + guint64 nstamp = test_time_stamp(); + int status = 0; + sstamp = MIN (sstamp, nstamp); /* guard against backwards clock skews */ + if (usec_timeout < nstamp - sstamp) + { + /* timeout reached, need to abort the child now */ + kill_child (test_trap_last_pid, &status, 3); + test_trap_last_status = 1024; /* timeout */ + if (0 && WIFSIGNALED (status)) + g_printerr ("%s: child timed out and received: %s\n", G_STRFUNC, g_strsignal (WTERMSIG (status))); + need_wait = FALSE; + break; + } + } + } + close (stdout_pipe[0]); + close (stderr_pipe[0]); + close (stdtst_pipe[0]); + if (need_wait) + { + int status = 0; + do + wr = waitpid (test_trap_last_pid, &status, 0); + while (wr < 0 && errno == EINTR); + if (WIFEXITED (status)) /* normal exit */ + test_trap_last_status = WEXITSTATUS (status); /* 0..255 */ + else if (WIFSIGNALED (status)) + test_trap_last_status = (WTERMSIG (status) << 12); /* signalled */ + else /* WCOREDUMP (status) */ + test_trap_last_status = 512; /* coredump */ + } + test_trap_last_stdout = g_string_free (sout, FALSE); + test_trap_last_stderr = g_string_free (serr, FALSE); + return FALSE; + } +#else + g_message ("Not implemented: g_test_trap_fork"); + + return FALSE; +#endif +} + +/** + * g_test_trap_has_passed: + * + * Check the result of the last g_test_trap_fork() call. + * + * Returns: %TRUE if the last forked child terminated successfully. + * + * Since: 2.16 + */ +gboolean +g_test_trap_has_passed (void) +{ + return test_trap_last_status == 0; /* exit_status == 0 && !signal && !coredump */ +} + +/** + * g_test_trap_reached_timeout: + * + * Check the result of the last g_test_trap_fork() call. + * + * Returns: %TRUE if the last forked child got killed due to a fork timeout. + * + * Since: 2.16 + */ +gboolean +g_test_trap_reached_timeout (void) +{ + return 0 != (test_trap_last_status & 1024); /* timeout flag */ +} + +void +g_test_trap_assertions (const char *domain, + const char *file, + int line, + const char *func, + guint64 assertion_flags, /* 0-pass, 1-fail, 2-outpattern, 4-errpattern */ + const char *pattern) +{ +#ifdef G_OS_UNIX + gboolean must_pass = assertion_flags == 0; + gboolean must_fail = assertion_flags == 1; + gboolean match_result = 0 == (assertion_flags & 1); + const char *stdout_pattern = (assertion_flags & 2) ? pattern : NULL; + const char *stderr_pattern = (assertion_flags & 4) ? pattern : NULL; + const char *match_error = match_result ? "failed to match" : "contains invalid match"; + if (test_trap_last_pid == 0) + g_error ("child process failed to exit after g_test_trap_fork() and before g_test_trap_assert*()"); + if (must_pass && !g_test_trap_has_passed()) + { + char *msg = g_strdup_printf ("child process (%d) of test trap failed unexpectedly", test_trap_last_pid); + g_assertion_message (domain, file, line, func, msg); + g_free (msg); + } + if (must_fail && g_test_trap_has_passed()) + { + char *msg = g_strdup_printf ("child process (%d) did not fail as expected", test_trap_last_pid); + g_assertion_message (domain, file, line, func, msg); + g_free (msg); + } + if (stdout_pattern && match_result == !g_pattern_match_simple (stdout_pattern, test_trap_last_stdout)) + { + char *msg = g_strdup_printf ("stdout of child process (%d) %s: %s", test_trap_last_pid, match_error, stdout_pattern); + g_assertion_message (domain, file, line, func, msg); + g_free (msg); + } + if (stderr_pattern && match_result == !g_pattern_match_simple (stderr_pattern, test_trap_last_stderr)) + { + char *msg = g_strdup_printf ("stderr of child process (%d) %s: %s", test_trap_last_pid, match_error, stderr_pattern); + g_assertion_message (domain, file, line, func, msg); + g_free (msg); + } +#endif +} + +static void +gstring_overwrite_int (GString *gstring, + guint pos, + guint32 vuint) +{ + vuint = g_htonl (vuint); + g_string_overwrite_len (gstring, pos, (const gchar*) &vuint, 4); +} + +static void +gstring_append_int (GString *gstring, + guint32 vuint) +{ + vuint = g_htonl (vuint); + g_string_append_len (gstring, (const gchar*) &vuint, 4); +} + +static void +gstring_append_double (GString *gstring, + double vdouble) +{ + union { double vdouble; guint64 vuint64; } u; + u.vdouble = vdouble; + u.vuint64 = GUINT64_TO_BE (u.vuint64); + g_string_append_len (gstring, (const gchar*) &u.vuint64, 8); +} + +static guint8* +g_test_log_dump (GTestLogMsg *msg, + guint *len) +{ + GString *gstring = g_string_sized_new (1024); + guint ui; + gstring_append_int (gstring, 0); /* message length */ + gstring_append_int (gstring, msg->log_type); + gstring_append_int (gstring, msg->n_strings); + gstring_append_int (gstring, msg->n_nums); + gstring_append_int (gstring, 0); /* reserved */ + for (ui = 0; ui < msg->n_strings; ui++) + { + guint l = strlen (msg->strings[ui]); + gstring_append_int (gstring, l); + g_string_append_len (gstring, msg->strings[ui], l); + } + for (ui = 0; ui < msg->n_nums; ui++) + gstring_append_double (gstring, msg->nums[ui]); + *len = gstring->len; + gstring_overwrite_int (gstring, 0, *len); /* message length */ + return (guint8*) g_string_free (gstring, FALSE); +} + +static inline long double +net_double (const gchar **ipointer) +{ + union { guint64 vuint64; double vdouble; } u; + guint64 aligned_int64; + memcpy (&aligned_int64, *ipointer, 8); + *ipointer += 8; + u.vuint64 = GUINT64_FROM_BE (aligned_int64); + return u.vdouble; +} + +static inline guint32 +net_int (const gchar **ipointer) +{ + guint32 aligned_int; + memcpy (&aligned_int, *ipointer, 4); + *ipointer += 4; + return g_ntohl (aligned_int); +} + +static gboolean +g_test_log_extract (GTestLogBuffer *tbuffer) +{ + const gchar *p = tbuffer->data->str; + GTestLogMsg msg; + guint mlength; + if (tbuffer->data->len < 4 * 5) + return FALSE; + mlength = net_int (&p); + if (tbuffer->data->len < mlength) + return FALSE; + msg.log_type = net_int (&p); + msg.n_strings = net_int (&p); + msg.n_nums = net_int (&p); + if (net_int (&p) == 0) + { + guint ui; + msg.strings = g_new0 (gchar*, msg.n_strings + 1); + msg.nums = g_new0 (long double, msg.n_nums); + for (ui = 0; ui < msg.n_strings; ui++) + { + guint sl = net_int (&p); + msg.strings[ui] = g_strndup (p, sl); + p += sl; + } + for (ui = 0; ui < msg.n_nums; ui++) + msg.nums[ui] = net_double (&p); + if (p <= tbuffer->data->str + mlength) + { + g_string_erase (tbuffer->data, 0, mlength); + tbuffer->msgs = g_slist_prepend (tbuffer->msgs, g_memdup (&msg, sizeof (msg))); + return TRUE; + } + } + g_free (msg.nums); + g_strfreev (msg.strings); + g_error ("corrupt log stream from test program"); + return FALSE; +} + +/** + * g_test_log_buffer_new: + * + * Internal function for gtester to decode test log messages, no ABI guarantees provided. + */ +GTestLogBuffer* +g_test_log_buffer_new (void) +{ + GTestLogBuffer *tb = g_new0 (GTestLogBuffer, 1); + tb->data = g_string_sized_new (1024); + return tb; +} + +/** + * g_test_log_buffer_free + * + * Internal function for gtester to free test log messages, no ABI guarantees provided. + */ +void +g_test_log_buffer_free (GTestLogBuffer *tbuffer) +{ + g_return_if_fail (tbuffer != NULL); + while (tbuffer->msgs) + g_test_log_msg_free (g_test_log_buffer_pop (tbuffer)); + g_string_free (tbuffer->data, TRUE); + g_free (tbuffer); +} + +/** + * g_test_log_buffer_push + * + * Internal function for gtester to decode test log messages, no ABI guarantees provided. + */ +void +g_test_log_buffer_push (GTestLogBuffer *tbuffer, + guint n_bytes, + const guint8 *bytes) +{ + g_return_if_fail (tbuffer != NULL); + if (n_bytes) + { + gboolean more_messages; + g_return_if_fail (bytes != NULL); + g_string_append_len (tbuffer->data, (const gchar*) bytes, n_bytes); + do + more_messages = g_test_log_extract (tbuffer); + while (more_messages); + } +} + +/** + * g_test_log_buffer_pop: + * + * Internal function for gtester to retrieve test log messages, no ABI guarantees provided. + */ +GTestLogMsg* +g_test_log_buffer_pop (GTestLogBuffer *tbuffer) +{ + GTestLogMsg *msg = NULL; + g_return_val_if_fail (tbuffer != NULL, NULL); + if (tbuffer->msgs) + { + GSList *slist = g_slist_last (tbuffer->msgs); + msg = slist->data; + tbuffer->msgs = g_slist_delete_link (tbuffer->msgs, slist); + } + return msg; +} + +/** + * g_test_log_msg_free: + * + * Internal function for gtester to free test log messages, no ABI guarantees provided. + */ +void +g_test_log_msg_free (GTestLogMsg *tmsg) +{ + g_return_if_fail (tmsg != NULL); + g_strfreev (tmsg->strings); + g_free (tmsg->nums); + g_free (tmsg); +} + +/* --- macros docs START --- */ +/** + * g_test_add: + * @testpath: The test path for a new test case. + * @Fixture: The type of a fixture data structure. + * @tdata: Data argument for the test functions. + * @fsetup: The function to set up the fixture data. + * @ftest: The actual test function. + * @fteardown: The function to tear down the fixture data. + * + * Hook up a new test case at @testpath, similar to g_test_add_func(). + * A fixture data structure with setup and teardown function may be provided + * though, similar to g_test_create_case(). + * g_test_add() is implemented as a macro, so that the fsetup(), ftest() and + * fteardown() callbacks can expect a @Fixture pointer as first argument in + * a type safe manner. + * + * Since: 2.16 + **/ +/* --- macros docs END --- */ + +#define __G_TEST_UTILS_C__ +#include "galiasdef.c" diff --git a/glib/gtestutils.h b/glib/gtestutils.h new file mode 100644 index 0000000..18f1ede --- /dev/null +++ b/glib/gtestutils.h @@ -0,0 +1,292 @@ +/* GLib testing utilities + * Copyright (C) 2007 Imendio AB + * Authors: Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TEST_UTILS_H__ +#define __G_TEST_UTILS_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct GTestCase GTestCase; +typedef struct GTestSuite GTestSuite; + +/* assertion API */ +#define g_assert_cmpstr(s1, cmp, s2) do { const char *__s1 = (s1), *__s2 = (s2); \ + if (g_strcmp0 (__s1, __s2) cmp 0) ; else \ + g_assertion_message_cmpstr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #s1 " " #cmp " " #s2, __s1, #cmp, __s2); } while (0) +#define g_assert_cmpint(n1, cmp, n2) do { gint64 __n1 = (n1), __n2 = (n2); \ + if (__n1 cmp __n2) ; else \ + g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); } while (0) +#define g_assert_cmpuint(n1, cmp, n2) do { guint64 __n1 = (n1), __n2 = (n2); \ + if (__n1 cmp __n2) ; else \ + g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); } while (0) +#define g_assert_cmphex(n1, cmp, n2) do { guint64 __n1 = (n1), __n2 = (n2); \ + if (__n1 cmp __n2) ; else \ + g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'x'); } while (0) +#define g_assert_cmpfloat(n1,cmp,n2) do { long double __n1 = (n1), __n2 = (n2); \ + if (__n1 cmp __n2) ; else \ + g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'f'); } while (0) +#define g_assert_no_error(err) do { if (err) \ + g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #err, err, 0, 0); } while (0) +#define g_assert_error(err, dom, c) do { if (!err || (err)->domain != dom || (err)->code != c) \ + g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #err, err, dom, c); } while (0) +#ifdef G_DISABLE_ASSERT +#define g_assert_not_reached() do { (void) 0; } while (0) +#define g_assert(expr) do { (void) 0; } while (0) +#else /* !G_DISABLE_ASSERT */ +#define g_assert_not_reached() do { g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, NULL); } while (0) +#define g_assert(expr) do { if G_LIKELY (expr) ; else \ + g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #expr); } while (0) +#endif /* !G_DISABLE_ASSERT */ + +int g_strcmp0 (const char *str1, + const char *str2); + +/* report performance results */ +void g_test_minimized_result (double minimized_quantity, + const char *format, + ...) G_GNUC_PRINTF (2, 3); +void g_test_maximized_result (double maximized_quantity, + const char *format, + ...) G_GNUC_PRINTF (2, 3); + +/* initialize testing framework */ +void g_test_init (int *argc, + char ***argv, + ...); +/* query testing framework config */ +#define g_test_quick() (g_test_config_vars->test_quick) +#define g_test_slow() (!g_test_config_vars->test_quick) +#define g_test_thorough() (!g_test_config_vars->test_quick) +#define g_test_perf() (g_test_config_vars->test_perf) +#define g_test_verbose() (g_test_config_vars->test_verbose) +#define g_test_quiet() (g_test_config_vars->test_quiet) +/* run all tests under toplevel suite (path: /) */ +int g_test_run (void); +/* hook up a test functions under test path */ +void g_test_add_func (const char *testpath, + void (*test_func) (void)); +void g_test_add_data_func (const char *testpath, + gconstpointer test_data, + void (*test_func) (gconstpointer)); +/* hook up a test with fixture under test path */ +#define g_test_add(testpath, Fixture, tdata, fsetup, ftest, fteardown) \ + G_STMT_START { \ + void (*add_vtable) (const char*, \ + gsize, \ + gconstpointer, \ + void (*) (Fixture*, gconstpointer), \ + void (*) (Fixture*, gconstpointer), \ + void (*) (Fixture*, gconstpointer)) = (void (*) (const gchar *, gsize, gconstpointer, void (*) (Fixture*, gconstpointer), void (*) (Fixture*, gconstpointer), void (*) (Fixture*, gconstpointer))) g_test_add_vtable; \ + add_vtable \ + (testpath, sizeof (Fixture), tdata, fsetup, ftest, fteardown); \ + } G_STMT_END + +/* add test messages to the test report */ +void g_test_message (const char *format, + ...) G_GNUC_PRINTF (1, 2); +void g_test_bug_base (const char *uri_pattern); +void g_test_bug (const char *bug_uri_snippet); +/* measure test timings */ +void g_test_timer_start (void); +double g_test_timer_elapsed (void); /* elapsed seconds */ +double g_test_timer_last (void); /* repeat last elapsed() result */ + +/* automatically g_free or g_object_unref upon teardown */ +void g_test_queue_free (gpointer gfree_pointer); +void g_test_queue_destroy (GDestroyNotify destroy_func, + gpointer destroy_data); +#define g_test_queue_unref(gobject) g_test_queue_destroy (g_object_unref, gobject) + +/* test traps are guards used around forked tests */ +typedef enum { + G_TEST_TRAP_SILENCE_STDOUT = 1 << 7, + G_TEST_TRAP_SILENCE_STDERR = 1 << 8, + G_TEST_TRAP_INHERIT_STDIN = 1 << 9 +} GTestTrapFlags; +gboolean g_test_trap_fork (guint64 usec_timeout, + GTestTrapFlags test_trap_flags); +gboolean g_test_trap_has_passed (void); +gboolean g_test_trap_reached_timeout (void); +#define g_test_trap_assert_passed() g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 0, 0) +#define g_test_trap_assert_failed() g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 1, 0) +#define g_test_trap_assert_stdout(soutpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 2, soutpattern) +#define g_test_trap_assert_stdout_unmatched(soutpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 3, soutpattern) +#define g_test_trap_assert_stderr(serrpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 4, serrpattern) +#define g_test_trap_assert_stderr_unmatched(serrpattern) g_test_trap_assertions (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, 5, serrpattern) + +/* provide seed-able random numbers for tests */ +#define g_test_rand_bit() (0 != (g_test_rand_int() & (1 << 15))) +gint32 g_test_rand_int (void); +gint32 g_test_rand_int_range (gint32 begin, + gint32 end); +double g_test_rand_double (void); +double g_test_rand_double_range (double range_start, + double range_end); + +/* semi-internal API */ +GTestCase* g_test_create_case (const char *test_name, + gsize data_size, + gconstpointer test_data, + void (*data_setup) (void), + void (*data_test) (void), + void (*data_teardown) (void)); +GTestSuite* g_test_create_suite (const char *suite_name); +GTestSuite* g_test_get_root (void); +void g_test_suite_add (GTestSuite *suite, + GTestCase *test_case); +void g_test_suite_add_suite (GTestSuite *suite, + GTestSuite *nestedsuite); +int g_test_run_suite (GTestSuite *suite); + +/* internal ABI */ +void g_test_trap_assertions (const char *domain, + const char *file, + int line, + const char *func, + guint64 assertion_flags, /* 0-pass, 1-fail, 2-outpattern, 4-errpattern */ + const char *pattern); +void g_assertion_message (const char *domain, + const char *file, + int line, + const char *func, + const char *message) G_GNUC_NORETURN; +void g_assertion_message_expr (const char *domain, + const char *file, + int line, + const char *func, + const char *expr) G_GNUC_NORETURN; +void g_assertion_message_cmpstr (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + const char *arg1, + const char *cmp, + const char *arg2) G_GNUC_NORETURN; +void g_assertion_message_cmpnum (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + long double arg1, + const char *cmp, + long double arg2, + char numtype) G_GNUC_NORETURN; +void g_assertion_message_error (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + GError *error, + GQuark error_domain, + int error_code) G_GNUC_NORETURN; +void g_test_add_vtable (const char *testpath, + gsize data_size, + gconstpointer test_data, + void (*data_setup) (void), + void (*data_test) (void), + void (*data_teardown) (void)); +typedef struct { + gboolean test_initialized; + gboolean test_quick; /* disable thorough tests */ + gboolean test_perf; /* run performance tests */ + gboolean test_verbose; /* extra info */ + gboolean test_quiet; /* reduce output */ +} GTestConfig; +GLIB_VAR const GTestConfig * const g_test_config_vars; + +/* internal logging API */ +typedef enum { + G_TEST_LOG_NONE, + G_TEST_LOG_ERROR, /* s:msg */ + G_TEST_LOG_START_BINARY, /* s:binaryname s:seed */ + G_TEST_LOG_LIST_CASE, /* s:testpath */ + G_TEST_LOG_SKIP_CASE, /* s:testpath */ + G_TEST_LOG_START_CASE, /* s:testpath */ + G_TEST_LOG_STOP_CASE, /* d:status d:nforks d:elapsed */ + G_TEST_LOG_MIN_RESULT, /* s:blurb d:result */ + G_TEST_LOG_MAX_RESULT, /* s:blurb d:result */ + G_TEST_LOG_MESSAGE /* s:blurb */ +} GTestLogType; + +typedef struct { + GTestLogType log_type; + guint n_strings; + gchar **strings; /* NULL terminated */ + guint n_nums; + long double *nums; +} GTestLogMsg; +typedef struct { + /*< private >*/ + GString *data; + GSList *msgs; +} GTestLogBuffer; + +const char* g_test_log_type_name (GTestLogType log_type); +GTestLogBuffer* g_test_log_buffer_new (void); +void g_test_log_buffer_free (GTestLogBuffer *tbuffer); +void g_test_log_buffer_push (GTestLogBuffer *tbuffer, + guint n_bytes, + const guint8 *bytes); +GTestLogMsg* g_test_log_buffer_pop (GTestLogBuffer *tbuffer); +void g_test_log_msg_free (GTestLogMsg *tmsg); + +/** + * GTestLogFatalFunc: + * @log_domain: the log domain of the message + * @log_level: the log level of the message (including the fatal and recursion flags) + * @message: the message to process + * @user_data: user data, set in g_test_log_set_fatal_handler() + * + * Specifies the prototype of fatal log handler functions. + * + * Return value: %TRUE if the program should abort, %FALSE otherwise + * + * Since: 2.22 + */ +typedef gboolean (*GTestLogFatalFunc) (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data); +void +g_test_log_set_fatal_handler (GTestLogFatalFunc log_func, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_TEST_UTILS_H__ */ diff --git a/glib/gthread.c b/glib/gthread.c new file mode 100644 index 0000000..4689211 --- /dev/null +++ b/glib/gthread.c @@ -0,0 +1,2538 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gthread.c: MT safety related functions + * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe + * Owen Taylor + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* Prelude {{{1 ----------------------------------------------------------- */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +/* implement gthread.h's inline functions */ +#define G_IMPLEMENT_INLINES 1 +#define __G_THREAD_C__ + +#include "config.h" + +#include "glib.h" +#include "gthreadprivate.h" + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifndef G_OS_WIN32 +#include +#include +#else +#include +#endif /* G_OS_WIN32 */ + +#include + +#include "galias.h" + +/** + * SECTION: threads + * @title: Threads + * @short_description: thread abstraction; including threads, different + * mutexes, conditions and thread private data + * @see_also: #GThreadPool, #GAsyncQueue + * + * Threads act almost like processes, but unlike processes all threads + * of one process share the same memory. This is good, as it provides + * easy communication between the involved threads via this shared + * memory, and it is bad, because strange things (so called + * "Heisenbugs") might happen if the program is not carefully designed. + * In particular, due to the concurrent nature of threads, no + * assumptions on the order of execution of code running in different + * threads can be made, unless order is explicitly forced by the + * programmer through synchronization primitives. + * + * The aim of the thread related functions in GLib is to provide a + * portable means for writing multi-threaded software. There are + * primitives for mutexes to protect the access to portions of memory + * (#GMutex, #GStaticMutex, #G_LOCK_DEFINE, #GStaticRecMutex and + * #GStaticRWLock). There are primitives for condition variables to + * allow synchronization of threads (#GCond). There are primitives for + * thread-private data - data that every thread has a private instance + * of (#GPrivate, #GStaticPrivate). Last but definitely not least there + * are primitives to portably create and manage threads (#GThread). + * + * The threading system is initialized with g_thread_init(), which + * takes an optional custom thread implementation or %NULL for the + * default implementation. If you want to call g_thread_init() with a + * non-%NULL argument this must be done before executing any other GLib + * functions (except g_mem_set_vtable()). This is a requirement even if + * no threads are in fact ever created by the process. + * + * Calling g_thread_init() with a %NULL argument is somewhat more + * relaxed. You may call any other glib functions in the main thread + * before g_thread_init() as long as g_thread_init() is not called from + * a glib callback, or with any locks held. However, many libraries + * above glib does not support late initialization of threads, so doing + * this should be avoided if possible. + * + * Please note that since version 2.24 the GObject initialization + * function g_type_init() initializes threads (with a %NULL argument), + * so most applications, including those using Gtk+ will run with + * threads enabled. If you want a special thread implementation, make + * sure you call g_thread_init() before g_type_init() is called. + * + * After calling g_thread_init(), GLib is completely thread safe (all + * global data is automatically locked), but individual data structure + * instances are not automatically locked for performance reasons. So, + * for example you must coordinate accesses to the same #GHashTable + * from multiple threads. The two notable exceptions from this rule + * are #GMainLoop and #GAsyncQueue, which are + * threadsafe and need no further application-level locking to be + * accessed from multiple threads. + * + * To help debugging problems in multithreaded applications, GLib + * supports error-checking mutexes that will give you helpful error + * messages on common problems. To use error-checking mutexes, define + * the symbol #G_ERRORCHECK_MUTEXES when compiling the application. + **/ + +/** + * G_THREADS_IMPL_POSIX: + * + * This macro is defined if POSIX style threads are used. + **/ + +/** + * G_THREADS_ENABLED: + * + * This macro is defined if GLib was compiled with thread support. This + * does not necessarily mean that there is a thread implementation + * available, but it does mean that the infrastructure is in place and + * that once you provide a thread implementation to g_thread_init(), + * GLib will be multi-thread safe. If #G_THREADS_ENABLED is not + * defined, then Glib is not, and cannot be, multi-thread safe. + **/ + +/** + * G_THREADS_IMPL_NONE: + * + * This macro is defined if no thread implementation is used. You can, + * however, provide one to g_thread_init() to make GLib multi-thread + * safe. + **/ + +/* G_LOCK Documentation {{{1 ---------------------------------------------- */ + +/* IMPLEMENTATION NOTE: + * + * G_LOCK_DEFINE and friends are convenience macros defined in + * gthread.h. Their documentation lives here. + */ + +/** + * G_LOCK_DEFINE: + * @name: the name of the lock. + * + * The %G_LOCK_* macros provide a convenient interface to #GStaticMutex + * with the advantage that they will expand to nothing in programs + * compiled against a thread-disabled GLib, saving code and memory + * there. #G_LOCK_DEFINE defines a lock. It can appear anywhere + * variable definitions may appear in programs, i.e. in the first block + * of a function or outside of functions. The @name parameter will be + * mangled to get the name of the #GStaticMutex. This means that you + * can use names of existing variables as the parameter - e.g. the name + * of the variable you intent to protect with the lock. Look at our + * give_me_next_number() example using the + * %G_LOCK_* macros: + * + * + * Using the %G_LOCK_* convenience macros + * + * G_LOCK_DEFINE (current_number); + * + * int + * give_me_next_number (void) + * { + * static int current_number = 0; + * int ret_val; + * + * G_LOCK (current_number); + * ret_val = current_number = calc_next_number (current_number); + * G_UNLOCK (current_number); + * + * return ret_val; + * } + * + * + **/ + +/** + * G_LOCK_DEFINE_STATIC: + * @name: the name of the lock. + * + * This works like #G_LOCK_DEFINE, but it creates a static object. + **/ + +/** + * G_LOCK_EXTERN: + * @name: the name of the lock. + * + * This declares a lock, that is defined with #G_LOCK_DEFINE in another + * module. + **/ + +/** + * G_LOCK: + * @name: the name of the lock. + * + * Works like g_mutex_lock(), but for a lock defined with + * #G_LOCK_DEFINE. + **/ + +/** + * G_TRYLOCK: + * @name: the name of the lock. + * @Returns: %TRUE, if the lock could be locked. + * + * Works like g_mutex_trylock(), but for a lock defined with + * #G_LOCK_DEFINE. + **/ + +/** + * G_UNLOCK: + * @name: the name of the lock. + * + * Works like g_mutex_unlock(), but for a lock defined with + * #G_LOCK_DEFINE. + **/ + +/* GThreadError {{{1 ------------------------------------------------------- */ +/** + * GThreadError: + * @G_THREAD_ERROR_AGAIN: a thread couldn't be created due to resource + * shortage. Try again later. + * + * Possible errors of thread related functions. + **/ + +/** + * G_THREAD_ERROR: + * + * The error domain of the GLib thread subsystem. + **/ +GQuark +g_thread_error_quark (void) +{ + return g_quark_from_static_string ("g_thread_error"); +} + +/* Miscellaneous Structures {{{1 ------------------------------------------ */ +/* Keep this in sync with GRealThread in gmain.c! */ +typedef struct _GRealThread GRealThread; +struct _GRealThread +{ + GThread thread; + gpointer private_data; + GRealThread *next; + gpointer retval; + GSystemThread system_thread; +}; + +typedef struct _GStaticPrivateNode GStaticPrivateNode; +struct _GStaticPrivateNode +{ + gpointer data; + GDestroyNotify destroy; +}; + +static void g_thread_cleanup (gpointer data); +static void g_thread_fail (void); +static guint64 gettime (void); + +guint64 (*g_thread_gettime) (void) = gettime; + +/* Global Variables {{{1 -------------------------------------------------- */ + +static GSystemThread zero_thread; /* This is initialized to all zero */ +gboolean g_thread_use_default_impl = TRUE; + +/** + * g_thread_supported: + * @Returns: %TRUE, if the thread system is initialized. + * + * This function returns %TRUE if the thread system is initialized, and + * %FALSE if it is not. + * + * This function is actually a macro. Apart from taking the + * address of it you can however use it as if it was a + * function. + **/ + +/* IMPLEMENTATION NOTE: + * + * g_thread_supported() is just returns g_threads_got_initialized + */ +gboolean g_threads_got_initialized = FALSE; + + +/* Thread Implementation Virtual Function Table {{{1 ---------------------- */ +/* Virtual Function Table Documentation {{{2 ------------------------------ */ +/** + * GThreadFunctions: + * @mutex_new: virtual function pointer for g_mutex_new() + * @mutex_lock: virtual function pointer for g_mutex_lock() + * @mutex_trylock: virtual function pointer for g_mutex_trylock() + * @mutex_unlock: virtual function pointer for g_mutex_unlock() + * @mutex_free: virtual function pointer for g_mutex_free() + * @cond_new: virtual function pointer for g_cond_new() + * @cond_signal: virtual function pointer for g_cond_signal() + * @cond_broadcast: virtual function pointer for g_cond_broadcast() + * @cond_wait: virtual function pointer for g_cond_wait() + * @cond_timed_wait: virtual function pointer for g_cond_timed_wait() + * @cond_free: virtual function pointer for g_cond_free() + * @private_new: virtual function pointer for g_private_new() + * @private_get: virtual function pointer for g_private_get() + * @private_set: virtual function pointer for g_private_set() + * @thread_create: virtual function pointer for g_thread_create() + * @thread_yield: virtual function pointer for g_thread_yield() + * @thread_join: virtual function pointer for g_thread_join() + * @thread_exit: virtual function pointer for g_thread_exit() + * @thread_set_priority: virtual function pointer for + * g_thread_set_priority() + * @thread_self: virtual function pointer for g_thread_self() + * @thread_equal: used internally by recursive mutex locks and by some + * assertion checks + * + * This function table is used by g_thread_init() to initialize the + * thread system. The functions in the table are directly used by their + * g_* prepended counterparts (described in this document). For + * example, if you call g_mutex_new() then mutex_new() from the table + * provided to g_thread_init() will be called. + * + * Do not use this struct unless you know what you are + * doing. + **/ + +/* IMPLEMENTATION NOTE: + * + * g_thread_functions_for_glib_use is a global symbol that gets used by + * most of the "primative" threading calls. g_mutex_lock(), for + * example, is just a macro that calls the appropriate virtual function + * out of this table. + * + * For that reason, all of those macros are documented here. + */ +GThreadFunctions g_thread_functions_for_glib_use = { +/* GMutex Virtual Functions {{{2 ------------------------------------------ */ + +/** + * GMutex: + * + * The #GMutex struct is an opaque data structure to represent a mutex + * (mutual exclusion). It can be used to protect data against shared + * access. Take for example the following function: + * + * + * A function which will not work in a threaded environment + * + * int + * give_me_next_number (void) + * { + * static int current_number = 0; + * + * /* now do a very complicated calculation to calculate the new + * * number, this might for example be a random number generator + * */ + * current_number = calc_next_number (current_number); + * + * return current_number; + * } + * + * + * + * It is easy to see that this won't work in a multi-threaded + * application. There current_number must be protected against shared + * access. A first naive implementation would be: + * + * + * The wrong way to write a thread-safe function + * + * int + * give_me_next_number (void) + * { + * static int current_number = 0; + * int ret_val; + * static GMutex * mutex = NULL; + * + * if (!mutex) mutex = g_mutex_new (); + * + * g_mutex_lock (mutex); + * ret_val = current_number = calc_next_number (current_number); + * g_mutex_unlock (mutex); + * + * return ret_val; + * } + * + * + * + * This looks like it would work, but there is a race condition while + * constructing the mutex and this code cannot work reliable. Please do + * not use such constructs in your own programs! One working solution + * is: + * + * + * A correct thread-safe function + * + * static GMutex *give_me_next_number_mutex = NULL; + * + * /* this function must be called before any call to + * * give_me_next_number() + * * + * * it must be called exactly once. + * */ + * void + * init_give_me_next_number (void) + * { + * g_assert (give_me_next_number_mutex == NULL); + * give_me_next_number_mutex = g_mutex_new (); + * } + * + * int + * give_me_next_number (void) + * { + * static int current_number = 0; + * int ret_val; + * + * g_mutex_lock (give_me_next_number_mutex); + * ret_val = current_number = calc_next_number (current_number); + * g_mutex_unlock (give_me_next_number_mutex); + * + * return ret_val; + * } + * + * + * + * #GStaticMutex provides a simpler and safer way of doing this. + * + * If you want to use a mutex, and your code should also work without + * calling g_thread_init() first, then you can not use a #GMutex, as + * g_mutex_new() requires that the thread system be initialized. Use a + * #GStaticMutex instead. + * + * A #GMutex should only be accessed via the following functions. + * + * All of the g_mutex_* functions are + * actually macros. Apart from taking their addresses, you can however + * use them as if they were functions. + **/ + +/** + * g_mutex_new: + * @Returns: a new #GMutex. + * + * Creates a new #GMutex. + * + * This function will abort if g_thread_init() has not been + * called yet. + **/ + (GMutex*(*)())g_thread_fail, + +/** + * g_mutex_lock: + * @mutex: a #GMutex. + * + * Locks @mutex. If @mutex is already locked by another thread, the + * current thread will block until @mutex is unlocked by the other + * thread. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will do nothing. + * + * #GMutex is neither guaranteed to be recursive nor to be + * non-recursive, i.e. a thread could deadlock while calling + * g_mutex_lock(), if it already has locked @mutex. Use + * #GStaticRecMutex, if you need recursive mutexes. + **/ + NULL, + +/** + * g_mutex_trylock: + * @mutex: a #GMutex. + * @Returns: %TRUE, if @mutex could be locked. + * + * Tries to lock @mutex. If @mutex is already locked by another thread, + * it immediately returns %FALSE. Otherwise it locks @mutex and returns + * %TRUE. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will immediately return %TRUE. + * + * #GMutex is neither guaranteed to be recursive nor to be + * non-recursive, i.e. the return value of g_mutex_trylock() could be + * both %FALSE or %TRUE, if the current thread already has locked + * @mutex. Use #GStaticRecMutex, if you need recursive + * mutexes. + **/ + NULL, + +/** + * g_mutex_unlock: + * @mutex: a #GMutex. + * + * Unlocks @mutex. If another thread is blocked in a g_mutex_lock() + * call for @mutex, it will be woken and can lock @mutex itself. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will do nothing. + **/ + NULL, + +/** + * g_mutex_free: + * @mutex: a #GMutex. + * + * Destroys @mutex. + * + * Calling g_mutex_free() on a locked mutex may result in + * undefined behaviour. + **/ + NULL, + +/* GCond Virtual Functions {{{2 ------------------------------------------ */ + +/** + * GCond: + * + * The #GCond struct is an opaque data structure that represents a + * condition. Threads can block on a #GCond if they find a certain + * condition to be false. If other threads change the state of this + * condition they signal the #GCond, and that causes the waiting + * threads to be woken up. + * + * + * + * Using GCond to block a thread until a condition is satisfied + * + * + * GCond* data_cond = NULL; /* Must be initialized somewhere */ + * GMutex* data_mutex = NULL; /* Must be initialized somewhere */ + * gpointer current_data = NULL; + * + * void + * push_data (gpointer data) + * { + * g_mutex_lock (data_mutex); + * current_data = data; + * g_cond_signal (data_cond); + * g_mutex_unlock (data_mutex); + * } + * + * gpointer + * pop_data (void) + * { + * gpointer data; + * + * g_mutex_lock (data_mutex); + * while (!current_data) + * g_cond_wait (data_cond, data_mutex); + * data = current_data; + * current_data = NULL; + * g_mutex_unlock (data_mutex); + * + * return data; + * } + * + * + * + * Whenever a thread calls pop_data() now, it will + * wait until current_data is non-%NULL, i.e. until some other thread + * has called push_data(). + * + * It is important to use the g_cond_wait() and + * g_cond_timed_wait() functions only inside a loop which checks for the + * condition to be true. It is not guaranteed that the waiting thread + * will find the condition fulfilled after it wakes up, even if the + * signaling thread left the condition in that state: another thread may + * have altered the condition before the waiting thread got the chance + * to be woken up, even if the condition itself is protected by a + * #GMutex, like above. + * + * A #GCond should only be accessed via the following functions. + * + * All of the g_cond_* functions are + * actually macros. Apart from taking their addresses, you can however + * use them as if they were functions. + **/ + +/** + * g_cond_new: + * @Returns: a new #GCond. + * + * Creates a new #GCond. This function will abort, if g_thread_init() + * has not been called yet. + **/ + (GCond*(*)())g_thread_fail, + +/** + * g_cond_signal: + * @cond: a #GCond. + * + * If threads are waiting for @cond, exactly one of them is woken up. + * It is good practice to hold the same lock as the waiting thread + * while calling this function, though not required. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will do nothing. + **/ + NULL, + +/** + * g_cond_broadcast: + * @cond: a #GCond. + * + * If threads are waiting for @cond, all of them are woken up. It is + * good practice to lock the same mutex as the waiting threads, while + * calling this function, though not required. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will do nothing. + **/ + NULL, + +/** + * g_cond_wait: + * @cond: a #GCond. + * @mutex: a #GMutex, that is currently locked. + * + * Waits until this thread is woken up on @cond. The @mutex is unlocked + * before falling asleep and locked again before resuming. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will immediately return. + **/ + NULL, + +/** + * g_cond_timed_wait: + * @cond: a #GCond. + * @mutex: a #GMutex that is currently locked. + * @abs_time: a #GTimeVal, determining the final time. + * @Returns: %TRUE if @cond was signalled, or %FALSE on timeout. + * + * Waits until this thread is woken up on @cond, but not longer than + * until the time specified by @abs_time. The @mutex is unlocked before + * falling asleep and locked again before resuming. + * + * If @abs_time is %NULL, g_cond_timed_wait() acts like g_cond_wait(). + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will immediately return %TRUE. + * + * To easily calculate @abs_time a combination of g_get_current_time() + * and g_time_val_add() can be used. + **/ + NULL, + +/** + * g_cond_free: + * @cond: a #GCond. + * + * Destroys the #GCond. + **/ + NULL, + +/* GPrivate Virtual Functions {{{2 --------------------------------------- */ + +/** + * GPrivate: + * + * The #GPrivate struct is an opaque data structure to represent a + * thread private data key. Threads can thereby obtain and set a + * pointer which is private to the current thread. Take our + * give_me_next_number() example from + * above. Suppose we don't want current_number to be + * shared between the threads, but instead to be private to each thread. + * This can be done as follows: + * + * + * Using GPrivate for per-thread data + * + * GPrivate* current_number_key = NULL; /* Must be initialized somewhere + * with g_private_new (g_free); */ + * + * int + * give_me_next_number (void) + * { + * int *current_number = g_private_get (current_number_key); + * + * if (!current_number) + * { + * current_number = g_new (int, 1); + * *current_number = 0; + * g_private_set (current_number_key, current_number); + * } + * + * *current_number = calc_next_number (*current_number); + * + * return *current_number; + * } + * + * + * + * Here the pointer belonging to the key + * current_number_key is read. If it is %NULL, it has + * not been set yet. Then get memory for an integer value, assign this + * memory to the pointer and write the pointer back. Now we have an + * integer value that is private to the current thread. + * + * The #GPrivate struct should only be accessed via the following + * functions. + * + * All of the g_private_* functions are + * actually macros. Apart from taking their addresses, you can however + * use them as if they were functions. + **/ + +/** + * g_private_new: + * @destructor: a function to destroy the data keyed to #GPrivate when + * a thread ends. + * @Returns: a new #GPrivate. + * + * Creates a new #GPrivate. If @destructor is non-%NULL, it is a + * pointer to a destructor function. Whenever a thread ends and the + * corresponding pointer keyed to this instance of #GPrivate is + * non-%NULL, the destructor is called with this pointer as the + * argument. + * + * @destructor is used quite differently from @notify in + * g_static_private_set(). + * + * A #GPrivate can not be freed. Reuse it instead, if you + * can, to avoid shortage, or use #GStaticPrivate. + * + * This function will abort if g_thread_init() has not been + * called yet. + **/ + (GPrivate*(*)(GDestroyNotify))g_thread_fail, + +/** + * g_private_get: + * @private_key: a #GPrivate. + * @Returns: the corresponding pointer. + * + * Returns the pointer keyed to @private_key for the current thread. If + * g_private_set() hasn't been called for the current @private_key and + * thread yet, this pointer will be %NULL. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will return the value of @private_key + * casted to #gpointer. Note however, that private data set + * before g_thread_init() will + * not be retained after the + * call. Instead, %NULL will be returned in all threads directly after + * g_thread_init(), regardless of any g_private_set() calls issued + * before threading system intialization. + **/ + NULL, + +/** + * g_private_set: + * @private_key: a #GPrivate. + * @data: the new pointer. + * + * Sets the pointer keyed to @private_key for the current thread. + * + * This function can be used even if g_thread_init() has not yet been + * called, and, in that case, will set @private_key to @data casted to + * #GPrivate*. See g_private_get() for resulting caveats. + **/ + NULL, + +/* GThread Virtual Functions {{{2 ---------------------------------------- */ +/** + * GThread: + * + * The #GThread struct represents a running thread. It has three public + * read-only members, but the underlying struct is bigger, so you must + * not copy this struct. + * + * Resources for a joinable thread are not fully released + * until g_thread_join() is called for that thread. + **/ + +/** + * GThreadFunc: + * @data: data passed to the thread. + * @Returns: the return value of the thread, which will be returned by + * g_thread_join(). + * + * Specifies the type of the @func functions passed to + * g_thread_create() or g_thread_create_full(). + **/ + +/** + * GThreadPriority: + * @G_THREAD_PRIORITY_LOW: a priority lower than normal + * @G_THREAD_PRIORITY_NORMAL: the default priority + * @G_THREAD_PRIORITY_HIGH: a priority higher than normal + * @G_THREAD_PRIORITY_URGENT: the highest priority + * + * Specifies the priority of a thread. + * + * It is not guaranteed that threads with different priorities + * really behave accordingly. On some systems (e.g. Linux) there are no + * thread priorities. On other systems (e.g. Solaris) there doesn't + * seem to be different scheduling for different priorities. All in all + * try to avoid being dependent on priorities. + **/ + +/** + * g_thread_create: + * @func: a function to execute in the new thread. + * @data: an argument to supply to the new thread. + * @joinable: should this thread be joinable? + * @error: return location for error. + * @Returns: the new #GThread on success. + * + * This function creates a new thread with the default priority. + * + * If @joinable is %TRUE, you can wait for this threads termination + * calling g_thread_join(). Otherwise the thread will just disappear + * when it terminates. + * + * The new thread executes the function @func with the argument @data. + * If the thread was created successfully, it is returned. + * + * @error can be %NULL to ignore errors, or non-%NULL to report errors. + * The error is set, if and only if the function returns %NULL. + **/ + (void(*)(GThreadFunc, gpointer, gulong, + gboolean, gboolean, GThreadPriority, + gpointer, GError**))g_thread_fail, + +/** + * g_thread_yield: + * + * Gives way to other threads waiting to be scheduled. + * + * This function is often used as a method to make busy wait less evil. + * But in most cases you will encounter, there are better methods to do + * that. So in general you shouldn't use this function. + **/ + NULL, + + NULL, /* thread_join */ + NULL, /* thread_exit */ + NULL, /* thread_set_priority */ + NULL, /* thread_self */ + NULL /* thread_equal */ +}; + +/* Local Data {{{1 -------------------------------------------------------- */ + +static GMutex *g_once_mutex = NULL; +static GCond *g_once_cond = NULL; +static GPrivate *g_thread_specific_private = NULL; +static GRealThread *g_thread_all_threads = NULL; +static GSList *g_thread_free_indeces = NULL; +static GSList* g_once_init_list = NULL; + +G_LOCK_DEFINE_STATIC (g_thread); + +/* Initialisation {{{1 ---------------------------------------------------- */ + +#ifdef G_THREADS_ENABLED +/** + * g_thread_init: + * @vtable: a function table of type #GThreadFunctions, that provides + * the entry points to the thread system to be used. + * + * If you use GLib from more than one thread, you must initialize the + * thread system by calling g_thread_init(). Most of the time you will + * only have to call g_thread_init (NULL). + * + * Do not call g_thread_init() with a non-%NULL parameter unless + * you really know what you are doing. + * + * g_thread_init() must not be called directly or indirectly as a + * callback from GLib. Also no mutexes may be currently locked while + * calling g_thread_init(). + * + * g_thread_init() changes the way in which #GTimer measures + * elapsed time. As a consequence, timers that are running while + * g_thread_init() is called may report unreliable times. + * + * Calling g_thread_init() multiple times is allowed (since version + * 2.24), but nothing happens except for the first call. If the + * argument is non-%NULL on such a call a warning will be printed, but + * otherwise the argument is ignored. + * + * If no thread system is available and @vtable is %NULL or if not all + * elements of @vtable are non-%NULL, then g_thread_init() will abort. + * + * To use g_thread_init() in your program, you have to link with + * the libraries that the command pkg-config --libs + * gthread-2.0 outputs. This is not the case for all the + * other thread related functions of GLib. Those can be used without + * having to link with the thread libraries. + **/ + +/* This must be called only once, before any threads are created. + * It will only be called from g_thread_init() in -lgthread. + */ +void +g_thread_init_glib (void) +{ + /* We let the main thread (the one that calls g_thread_init) inherit + * the static_private data set before calling g_thread_init + */ + GRealThread* main_thread = (GRealThread*) g_thread_self (); + + /* mutex and cond creation works without g_threads_got_initialized */ + g_once_mutex = g_mutex_new (); + g_once_cond = g_cond_new (); + + /* we may only create mutex and cond in here */ + _g_mem_thread_init_noprivate_nomessage (); + + /* setup the basic threading system */ + g_threads_got_initialized = TRUE; + g_thread_specific_private = g_private_new (g_thread_cleanup); + g_private_set (g_thread_specific_private, main_thread); + G_THREAD_UF (thread_self, (&main_thread->system_thread)); + + /* complete memory system initialization, g_private_*() works now */ + _g_slice_thread_init_nomessage (); + + /* accomplish log system initialization to enable messaging */ + _g_messages_thread_init_nomessage (); + + /* we may run full-fledged initializers from here */ + _g_atomic_thread_init (); + _g_convert_thread_init (); + _g_rand_thread_init (); + _g_main_thread_init (); + _g_utils_thread_init (); + _g_futex_thread_init (); +#ifdef G_OS_WIN32 + _g_win32_thread_init (); +#endif +} +#endif /* G_THREADS_ENABLED */ + +/* The following sections implement: GOnce, GStaticMutex, GStaticRecMutex, + * GStaticPrivate, + **/ + +/* GOnce {{{1 ------------------------------------------------------------- */ + +/** + * GOnce: + * @status: the status of the #GOnce + * @retval: the value returned by the call to the function, if @status + * is %G_ONCE_STATUS_READY + * + * A #GOnce struct controls a one-time initialization function. Any + * one-time initialization function must have its own unique #GOnce + * struct. + * + * Since: 2.4 + **/ + +/** + * G_ONCE_INIT: + * + * A #GOnce must be initialized with this macro before it can be used. + * + * + * + * GOnce my_once = G_ONCE_INIT; + * + * + * + * Since: 2.4 + **/ + +/** + * GOnceStatus: + * @G_ONCE_STATUS_NOTCALLED: the function has not been called yet. + * @G_ONCE_STATUS_PROGRESS: the function call is currently in progress. + * @G_ONCE_STATUS_READY: the function has been called. + * + * The possible statuses of a one-time initialization function + * controlled by a #GOnce struct. + * + * Since: 2.4 + **/ + +/** + * g_once: + * @once: a #GOnce structure + * @func: the #GThreadFunc function associated to @once. This function + * is called only once, regardless of the number of times it and + * its associated #GOnce struct are passed to g_once(). + * @arg: data to be passed to @func + * + * The first call to this routine by a process with a given #GOnce + * struct calls @func with the given argument. Thereafter, subsequent + * calls to g_once() with the same #GOnce struct do not call @func + * again, but return the stored result of the first call. On return + * from g_once(), the status of @once will be %G_ONCE_STATUS_READY. + * + * For example, a mutex or a thread-specific data key must be created + * exactly once. In a threaded environment, calling g_once() ensures + * that the initialization is serialized across multiple threads. + * + * Calling g_once() recursively on the same #GOnce struct in + * @func will lead to a deadlock. + * + * + * + * gpointer + * get_debug_flags (void) + * { + * static GOnce my_once = G_ONCE_INIT; + * + * g_once (&my_once, parse_debug_flags, NULL); + * + * return my_once.retval; + * } + * + * + * + * Since: 2.4 + **/ +gpointer +g_once_impl (GOnce *once, + GThreadFunc func, + gpointer arg) +{ + g_mutex_lock (g_once_mutex); + + while (once->status == G_ONCE_STATUS_PROGRESS) + g_cond_wait (g_once_cond, g_once_mutex); + + if (once->status != G_ONCE_STATUS_READY) + { + once->status = G_ONCE_STATUS_PROGRESS; + g_mutex_unlock (g_once_mutex); + + once->retval = func (arg); + + g_mutex_lock (g_once_mutex); + once->status = G_ONCE_STATUS_READY; + g_cond_broadcast (g_once_cond); + } + + g_mutex_unlock (g_once_mutex); + + return once->retval; +} + +/** + * g_once_init_enter: + * @value_location: location of a static initializable variable + * containing 0. + * @Returns: %TRUE if the initialization section should be entered, + * %FALSE and blocks otherwise + * + * Function to be called when starting a critical initialization + * section. The argument @value_location must point to a static + * 0-initialized variable that will be set to a value other than 0 at + * the end of the initialization section. In combination with + * g_once_init_leave() and the unique address @value_location, it can + * be ensured that an initialization section will be executed only once + * during a program's life time, and that concurrent threads are + * blocked until initialization completed. To be used in constructs + * like this: + * + * + * + * static gsize initialization_value = 0; + * + * if (g_once_init_enter (&initialization_value)) + * { + * gsize setup_value = 42; /* initialization code here */ + * + * g_once_init_leave (&initialization_value, setup_value); + * } + * + * /* use initialization_value here */ + * + * + * + * Since: 2.14 + **/ +gboolean +g_once_init_enter_impl (volatile gsize *value_location) +{ + gboolean need_init = FALSE; + g_mutex_lock (g_once_mutex); + if (g_atomic_pointer_get (value_location) == NULL) + { + if (!g_slist_find (g_once_init_list, (void*) value_location)) + { + need_init = TRUE; + g_once_init_list = g_slist_prepend (g_once_init_list, (void*) value_location); + } + else + do + g_cond_wait (g_once_cond, g_once_mutex); + while (g_slist_find (g_once_init_list, (void*) value_location)); + } + g_mutex_unlock (g_once_mutex); + return need_init; +} + +/** + * g_once_init_leave: + * @value_location: location of a static initializable variable + * containing 0. + * @initialization_value: new non-0 value for *@value_location. + * + * Counterpart to g_once_init_enter(). Expects a location of a static + * 0-initialized initialization variable, and an initialization value + * other than 0. Sets the variable to the initialization value, and + * releases concurrent threads blocking in g_once_init_enter() on this + * initialization variable. + * + * Since: 2.14 + **/ +void +g_once_init_leave (volatile gsize *value_location, + gsize initialization_value) +{ + g_return_if_fail (g_atomic_pointer_get (value_location) == NULL); + g_return_if_fail (initialization_value != 0); + g_return_if_fail (g_once_init_list != NULL); + + g_atomic_pointer_set ((void**)value_location, (void*) initialization_value); + g_mutex_lock (g_once_mutex); + g_once_init_list = g_slist_remove (g_once_init_list, (void*) value_location); + g_cond_broadcast (g_once_cond); + g_mutex_unlock (g_once_mutex); +} + +/* GStaticMutex {{{1 ------------------------------------------------------ */ + +/** + * GStaticMutex: + * + * A #GStaticMutex works like a #GMutex, but it has one significant + * advantage. It doesn't need to be created at run-time like a #GMutex, + * but can be defined at compile-time. Here is a shorter, easier and + * safer version of our give_me_next_number() + * example: + * + * + * + * Using <structname>GStaticMutex</structname> + * to simplify thread-safe programming + * + * + * int + * give_me_next_number (void) + * { + * static int current_number = 0; + * int ret_val; + * static GStaticMutex mutex = G_STATIC_MUTEX_INIT; + * + * g_static_mutex_lock (&mutex); + * ret_val = current_number = calc_next_number (current_number); + * g_static_mutex_unlock (&mutex); + * + * return ret_val; + * } + * + * + * + * Sometimes you would like to dynamically create a mutex. If you don't + * want to require prior calling to g_thread_init(), because your code + * should also be usable in non-threaded programs, you are not able to + * use g_mutex_new() and thus #GMutex, as that requires a prior call to + * g_thread_init(). In theses cases you can also use a #GStaticMutex. + * It must be initialized with g_static_mutex_init() before using it + * and freed with with g_static_mutex_free() when not needed anymore to + * free up any allocated resources. + * + * Even though #GStaticMutex is not opaque, it should only be used with + * the following functions, as it is defined differently on different + * platforms. + * + * All of the g_static_mutex_* functions apart + * from g_static_mutex_get_mutex can also be used + * even if g_thread_init() has not yet been called. Then they do + * nothing, apart from g_static_mutex_trylock, + * which does nothing but returning %TRUE. + * + * All of the g_static_mutex_* + * functions are actually macros. Apart from taking their addresses, you + * can however use them as if they were functions. + **/ + +/** + * G_STATIC_MUTEX_INIT: + * + * A #GStaticMutex must be initialized with this macro, before it can + * be used. This macro can used be to initialize a variable, but it + * cannot be assigned to a variable. In that case you have to use + * g_static_mutex_init(). + * + * + * + * GStaticMutex my_mutex = G_STATIC_MUTEX_INIT; + * + * + **/ + +/** + * g_static_mutex_init: + * @mutex: a #GStaticMutex to be initialized. + * + * Initializes @mutex. Alternatively you can initialize it with + * #G_STATIC_MUTEX_INIT. + **/ +void +g_static_mutex_init (GStaticMutex *mutex) +{ + static const GStaticMutex init_mutex = G_STATIC_MUTEX_INIT; + + g_return_if_fail (mutex); + + *mutex = init_mutex; +} + +/* IMPLEMENTATION NOTE: + * + * On some platforms a GStaticMutex is actually a normal GMutex stored + * inside of a structure instead of being allocated dynamically. We can + * only do this for platforms on which we know, in advance, how to + * allocate (size) and initialise (value) that memory. + * + * On other platforms, a GStaticMutex is nothing more than a pointer to + * a GMutex. In that case, the first access we make to the static mutex + * must first allocate the normal GMutex and store it into the pointer. + * + * configure.in writes macros into glibconfig.h to determine if + * g_static_mutex_get_mutex() accesses the sturcture in memory directly + * (on platforms where we are able to do that) or if it ends up here, + * where we may have to allocate the GMutex before returning it. + */ + +/** + * g_static_mutex_get_mutex: + * @mutex: a #GStaticMutex. + * @Returns: the #GMutex corresponding to @mutex. + * + * For some operations (like g_cond_wait()) you must have a #GMutex + * instead of a #GStaticMutex. This function will return the + * corresponding #GMutex for @mutex. + **/ +GMutex * +g_static_mutex_get_mutex_impl (GMutex** mutex) +{ + if (!g_thread_supported ()) + return NULL; + + g_assert (g_once_mutex); + + g_mutex_lock (g_once_mutex); + + if (!(*mutex)) + g_atomic_pointer_set (mutex, g_mutex_new()); + + g_mutex_unlock (g_once_mutex); + + return *mutex; +} + +/* IMPLEMENTATION NOTE: + * + * g_static_mutex_lock(), g_static_mutex_trylock() and + * g_static_mutex_unlock() are all preprocessor macros that wrap the + * corresponding g_mutex_*() function around a call to + * g_static_mutex_get_mutex(). + */ + +/** + * g_static_mutex_lock: + * @mutex: a #GStaticMutex. + * + * Works like g_mutex_lock(), but for a #GStaticMutex. + **/ + +/** + * g_static_mutex_trylock: + * @mutex: a #GStaticMutex. + * @Returns: %TRUE, if the #GStaticMutex could be locked. + * + * Works like g_mutex_trylock(), but for a #GStaticMutex. + **/ + +/** + * g_static_mutex_unlock: + * @mutex: a #GStaticMutex. + * + * Works like g_mutex_unlock(), but for a #GStaticMutex. + **/ + +/** + * g_static_mutex_free: + * @mutex: a #GStaticMutex to be freed. + * + * Releases all resources allocated to @mutex. + * + * You don't have to call this functions for a #GStaticMutex with an + * unbounded lifetime, i.e. objects declared 'static', but if you have + * a #GStaticMutex as a member of a structure and the structure is + * freed, you should also free the #GStaticMutex. + * + * Calling g_static_mutex_free() on a locked mutex may + * result in undefined behaviour. + **/ +void +g_static_mutex_free (GStaticMutex* mutex) +{ + GMutex **runtime_mutex; + + g_return_if_fail (mutex); + + /* The runtime_mutex is the first (or only) member of GStaticMutex, + * see both versions (of glibconfig.h) in configure.in. Note, that + * this variable is NULL, if g_thread_init() hasn't been called or + * if we're using the default thread implementation and it provides + * static mutexes. */ + runtime_mutex = ((GMutex**)mutex); + + if (*runtime_mutex) + g_mutex_free (*runtime_mutex); + + *runtime_mutex = NULL; +} + +/* ------------------------------------------------------------------------ */ + +/** + * GStaticRecMutex: + * + * A #GStaticRecMutex works like a #GStaticMutex, but it can be locked + * multiple times by one thread. If you enter it n times, you have to + * unlock it n times again to let other threads lock it. An exception + * is the function g_static_rec_mutex_unlock_full(): that allows you to + * unlock a #GStaticRecMutex completely returning the depth, (i.e. the + * number of times this mutex was locked). The depth can later be used + * to restore the state of the #GStaticRecMutex by calling + * g_static_rec_mutex_lock_full(). + * + * Even though #GStaticRecMutex is not opaque, it should only be used + * with the following functions. + * + * All of the g_static_rec_mutex_* functions can + * be used even if g_thread_init() has not been called. Then they do + * nothing, apart from g_static_rec_mutex_trylock, + * which does nothing but returning %TRUE. + **/ + +/** + * G_STATIC_REC_MUTEX_INIT: + * + * A #GStaticRecMutex must be initialized with this macro before it can + * be used. This macro can used be to initialize a variable, but it + * cannot be assigned to a variable. In that case you have to use + * g_static_rec_mutex_init(). + * + * + * + * GStaticRecMutex my_mutex = G_STATIC_REC_MUTEX_INIT; + * + + **/ + +/** + * g_static_rec_mutex_init: + * @mutex: a #GStaticRecMutex to be initialized. + * + * A #GStaticRecMutex must be initialized with this function before it + * can be used. Alternatively you can initialize it with + * #G_STATIC_REC_MUTEX_INIT. + **/ +void +g_static_rec_mutex_init (GStaticRecMutex *mutex) +{ + static const GStaticRecMutex init_mutex = G_STATIC_REC_MUTEX_INIT; + + g_return_if_fail (mutex); + + *mutex = init_mutex; +} + +/** + * g_static_rec_mutex_lock: + * @mutex: a #GStaticRecMutex to lock. + * + * Locks @mutex. If @mutex is already locked by another thread, the + * current thread will block until @mutex is unlocked by the other + * thread. If @mutex is already locked by the calling thread, this + * functions increases the depth of @mutex and returns immediately. + **/ +void +g_static_rec_mutex_lock (GStaticRecMutex* mutex) +{ + GSystemThread self; + + g_return_if_fail (mutex); + + if (!g_thread_supported ()) + return; + + G_THREAD_UF (thread_self, (&self)); + + if (g_system_thread_equal (self, mutex->owner)) + { + mutex->depth++; + return; + } + g_static_mutex_lock (&mutex->mutex); + g_system_thread_assign (mutex->owner, self); + mutex->depth = 1; +} + +/** + * g_static_rec_mutex_trylock: + * @mutex: a #GStaticRecMutex to lock. + * @Returns: %TRUE, if @mutex could be locked. + * + * Tries to lock @mutex. If @mutex is already locked by another thread, + * it immediately returns %FALSE. Otherwise it locks @mutex and returns + * %TRUE. If @mutex is already locked by the calling thread, this + * functions increases the depth of @mutex and immediately returns + * %TRUE. + **/ +gboolean +g_static_rec_mutex_trylock (GStaticRecMutex* mutex) +{ + GSystemThread self; + + g_return_val_if_fail (mutex, FALSE); + + if (!g_thread_supported ()) + return TRUE; + + G_THREAD_UF (thread_self, (&self)); + + if (g_system_thread_equal (self, mutex->owner)) + { + mutex->depth++; + return TRUE; + } + + if (!g_static_mutex_trylock (&mutex->mutex)) + return FALSE; + + g_system_thread_assign (mutex->owner, self); + mutex->depth = 1; + return TRUE; +} + +/** + * g_static_rec_mutex_unlock: + * @mutex: a #GStaticRecMutex to unlock. + * + * Unlocks @mutex. Another thread will be allowed to lock @mutex only + * when it has been unlocked as many times as it had been locked + * before. If @mutex is completely unlocked and another thread is + * blocked in a g_static_rec_mutex_lock() call for @mutex, it will be + * woken and can lock @mutex itself. + **/ +void +g_static_rec_mutex_unlock (GStaticRecMutex* mutex) +{ + g_return_if_fail (mutex); + + if (!g_thread_supported ()) + return; + + if (mutex->depth > 1) + { + mutex->depth--; + return; + } + g_system_thread_assign (mutex->owner, zero_thread); + g_static_mutex_unlock (&mutex->mutex); +} + +/** + * g_static_rec_mutex_lock_full: + * @mutex: a #GStaticRecMutex to lock. + * @depth: number of times this mutex has to be unlocked to be + * completely unlocked. + * + * Works like calling g_static_rec_mutex_lock() for @mutex @depth times. + **/ +void +g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, + guint depth) +{ + GSystemThread self; + g_return_if_fail (mutex); + + if (!g_thread_supported ()) + return; + + if (depth == 0) + return; + + G_THREAD_UF (thread_self, (&self)); + + if (g_system_thread_equal (self, mutex->owner)) + { + mutex->depth += depth; + return; + } + g_static_mutex_lock (&mutex->mutex); + g_system_thread_assign (mutex->owner, self); + mutex->depth = depth; +} + +/** + * g_static_rec_mutex_unlock_full: + * @mutex: a #GStaticRecMutex to completely unlock. + * @Returns: number of times @mutex has been locked by the current + * thread. + * + * Completely unlocks @mutex. If another thread is blocked in a + * g_static_rec_mutex_lock() call for @mutex, it will be woken and can + * lock @mutex itself. This function returns the number of times that + * @mutex has been locked by the current thread. To restore the state + * before the call to g_static_rec_mutex_unlock_full() you can call + * g_static_rec_mutex_lock_full() with the depth returned by this + * function. + **/ +guint +g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex) +{ + guint depth; + + g_return_val_if_fail (mutex, 0); + + if (!g_thread_supported ()) + return 1; + + depth = mutex->depth; + + g_system_thread_assign (mutex->owner, zero_thread); + mutex->depth = 0; + g_static_mutex_unlock (&mutex->mutex); + + return depth; +} + +/** + * g_static_rec_mutex_free: + * @mutex: a #GStaticRecMutex to be freed. + * + * Releases all resources allocated to a #GStaticRecMutex. + * + * You don't have to call this functions for a #GStaticRecMutex with an + * unbounded lifetime, i.e. objects declared 'static', but if you have + * a #GStaticRecMutex as a member of a structure and the structure is + * freed, you should also free the #GStaticRecMutex. + **/ +void +g_static_rec_mutex_free (GStaticRecMutex *mutex) +{ + g_return_if_fail (mutex); + + g_static_mutex_free (&mutex->mutex); +} + +/* GStaticPrivate {{{1 ---------------------------------------------------- */ + +/** + * GStaticPrivate: + * + * A #GStaticPrivate works almost like a #GPrivate, but it has one + * significant advantage. It doesn't need to be created at run-time + * like a #GPrivate, but can be defined at compile-time. This is + * similar to the difference between #GMutex and #GStaticMutex. Now + * look at our give_me_next_number() example with + * #GStaticPrivate: + * + * + * Using GStaticPrivate for per-thread data + * + * int + * give_me_next_number () + * { + * static GStaticPrivate current_number_key = G_STATIC_PRIVATE_INIT; + * int *current_number = g_static_private_get (&current_number_key); + * + * if (!current_number) + * { + * current_number = g_new (int,1); + * *current_number = 0; + * g_static_private_set (&current_number_key, current_number, g_free); + * } + * + * *current_number = calc_next_number (*current_number); + * + * return *current_number; + * } + * + * + **/ + +/** + * G_STATIC_PRIVATE_INIT: + * + * Every #GStaticPrivate must be initialized with this macro, before it + * can be used. + * + * + * + * GStaticPrivate my_private = G_STATIC_PRIVATE_INIT; + * + * + **/ + +/** + * g_static_private_init: + * @private_key: a #GStaticPrivate to be initialized. + * + * Initializes @private_key. Alternatively you can initialize it with + * #G_STATIC_PRIVATE_INIT. + **/ +void +g_static_private_init (GStaticPrivate *private_key) +{ + private_key->index = 0; +} + +/** + * g_static_private_get: + * @private_key: a #GStaticPrivate. + * @Returns: the corresponding pointer. + * + * Works like g_private_get() only for a #GStaticPrivate. + * + * This function works even if g_thread_init() has not yet been called. + **/ +gpointer +g_static_private_get (GStaticPrivate *private_key) +{ + GRealThread *self = (GRealThread*) g_thread_self (); + GArray *array; + + array = self->private_data; + if (!array) + return NULL; + + if (!private_key->index) + return NULL; + else if (private_key->index <= array->len) + return g_array_index (array, GStaticPrivateNode, + private_key->index - 1).data; + else + return NULL; +} + +/** + * g_static_private_set: + * @private_key: a #GStaticPrivate. + * @data: the new pointer. + * @notify: a function to be called with the pointer whenever the + * current thread ends or sets this pointer again. + * + * Sets the pointer keyed to @private_key for the current thread and + * the function @notify to be called with that pointer (%NULL or + * non-%NULL), whenever the pointer is set again or whenever the + * current thread ends. + * + * This function works even if g_thread_init() has not yet been called. + * If g_thread_init() is called later, the @data keyed to @private_key + * will be inherited only by the main thread, i.e. the one that called + * g_thread_init(). + * + * @notify is used quite differently from @destructor in + * g_private_new(). + **/ +void +g_static_private_set (GStaticPrivate *private_key, + gpointer data, + GDestroyNotify notify) +{ + GRealThread *self = (GRealThread*) g_thread_self (); + GArray *array; + static guint next_index = 0; + GStaticPrivateNode *node; + + array = self->private_data; + if (!array) + { + array = g_array_new (FALSE, TRUE, sizeof (GStaticPrivateNode)); + self->private_data = array; + } + + if (!private_key->index) + { + G_LOCK (g_thread); + + if (!private_key->index) + { + if (g_thread_free_indeces) + { + private_key->index = + GPOINTER_TO_UINT (g_thread_free_indeces->data); + g_thread_free_indeces = + g_slist_delete_link (g_thread_free_indeces, + g_thread_free_indeces); + } + else + private_key->index = ++next_index; + } + + G_UNLOCK (g_thread); + } + + if (private_key->index > array->len) + g_array_set_size (array, private_key->index); + + node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1); + if (node->destroy) + { + gpointer ddata = node->data; + GDestroyNotify ddestroy = node->destroy; + + node->data = data; + node->destroy = notify; + + ddestroy (ddata); + } + else + { + node->data = data; + node->destroy = notify; + } +} + +/** + * g_static_private_free: + * @private_key: a #GStaticPrivate to be freed. + * + * Releases all resources allocated to @private_key. + * + * You don't have to call this functions for a #GStaticPrivate with an + * unbounded lifetime, i.e. objects declared 'static', but if you have + * a #GStaticPrivate as a member of a structure and the structure is + * freed, you should also free the #GStaticPrivate. + **/ +void +g_static_private_free (GStaticPrivate *private_key) +{ + guint idx = private_key->index; + GRealThread *thread; + + if (!idx) + return; + + private_key->index = 0; + + G_LOCK (g_thread); + + thread = g_thread_all_threads; + while (thread) + { + GArray *array = thread->private_data; + thread = thread->next; + + if (array && idx <= array->len) + { + GStaticPrivateNode *node = &g_array_index (array, + GStaticPrivateNode, + idx - 1); + gpointer ddata = node->data; + GDestroyNotify ddestroy = node->destroy; + + node->data = NULL; + node->destroy = NULL; + + if (ddestroy) + { + G_UNLOCK (g_thread); + ddestroy (ddata); + G_LOCK (g_thread); + } + } + } + g_thread_free_indeces = g_slist_prepend (g_thread_free_indeces, + GUINT_TO_POINTER (idx)); + G_UNLOCK (g_thread); +} + +/* GThread Extra Functions {{{1 ------------------------------------------- */ +static void +g_thread_cleanup (gpointer data) +{ + if (data) + { + GRealThread* thread = data; + if (thread->private_data) + { + GArray* array = thread->private_data; + guint i; + + for (i = 0; i < array->len; i++ ) + { + GStaticPrivateNode *node = + &g_array_index (array, GStaticPrivateNode, i); + if (node->destroy) + node->destroy (node->data); + } + g_array_free (array, TRUE); + } + + /* We only free the thread structure, if it isn't joinable. If + it is, the structure is freed in g_thread_join */ + if (!thread->thread.joinable) + { + GRealThread *t, *p; + + G_LOCK (g_thread); + for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next) + { + if (t == thread) + { + if (p) + p->next = t->next; + else + g_thread_all_threads = t->next; + break; + } + } + G_UNLOCK (g_thread); + + /* Just to make sure, this isn't used any more */ + g_system_thread_assign (thread->system_thread, zero_thread); + g_free (thread); + } + } +} + +static void +g_thread_fail (void) +{ + g_error ("The thread system is not yet initialized."); +} + +#define G_NSEC_PER_SEC 1000000000 + +static guint64 +gettime (void) +{ +#ifdef G_OS_WIN32 + guint64 v; + + /* Returns 100s of nanoseconds since start of 1601 */ + GetSystemTimeAsFileTime ((FILETIME *)&v); + + /* Offset to Unix epoch */ + v -= G_GINT64_CONSTANT (116444736000000000); + /* Convert to nanoseconds */ + v *= 100; + + return v; +#else + struct timeval tv; + + gettimeofday (&tv, NULL); + + return (guint64) tv.tv_sec * G_NSEC_PER_SEC + tv.tv_usec * (G_NSEC_PER_SEC / G_USEC_PER_SEC); +#endif +} + +static gpointer +g_thread_create_proxy (gpointer data) +{ + GRealThread* thread = data; + + g_assert (data); + + /* This has to happen before G_LOCK, as that might call g_thread_self */ + g_private_set (g_thread_specific_private, data); + + /* the lock makes sure, that thread->system_thread is written, + before thread->thread.func is called. See g_thread_create. */ + G_LOCK (g_thread); + G_UNLOCK (g_thread); + + thread->retval = thread->thread.func (thread->thread.data); + + return NULL; +} + +/** + * g_thread_create_full: + * @func: a function to execute in the new thread. + * @data: an argument to supply to the new thread. + * @stack_size: a stack size for the new thread. + * @joinable: should this thread be joinable? + * @bound: should this thread be bound to a system thread? + * @priority: a priority for the thread. + * @error: return location for error. + * @Returns: the new #GThread on success. + * + * This function creates a new thread with the priority @priority. If + * the underlying thread implementation supports it, the thread gets a + * stack size of @stack_size or the default value for the current + * platform, if @stack_size is 0. + * + * If @joinable is %TRUE, you can wait for this threads termination + * calling g_thread_join(). Otherwise the thread will just disappear + * when it terminates. If @bound is %TRUE, this thread will be + * scheduled in the system scope, otherwise the implementation is free + * to do scheduling in the process scope. The first variant is more + * expensive resource-wise, but generally faster. On some systems (e.g. + * Linux) all threads are bound. + * + * The new thread executes the function @func with the argument @data. + * If the thread was created successfully, it is returned. + * + * @error can be %NULL to ignore errors, or non-%NULL to report errors. + * The error is set, if and only if the function returns %NULL. + * + * It is not guaranteed that threads with different priorities + * really behave accordingly. On some systems (e.g. Linux) there are no + * thread priorities. On other systems (e.g. Solaris) there doesn't + * seem to be different scheduling for different priorities. All in all + * try to avoid being dependent on priorities. Use + * %G_THREAD_PRIORITY_NORMAL here as a default. + * + * Only use g_thread_create_full() if you really can't use + * g_thread_create() instead. g_thread_create() does not take + * @stack_size, @bound, and @priority as arguments, as they should only + * be used in cases in which it is unavoidable. + **/ +GThread* +g_thread_create_full (GThreadFunc func, + gpointer data, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + GError **error) +{ + GRealThread* result; + GError *local_error = NULL; + g_return_val_if_fail (func, NULL); + g_return_val_if_fail (priority >= G_THREAD_PRIORITY_LOW, NULL); + g_return_val_if_fail (priority <= G_THREAD_PRIORITY_URGENT, NULL); + + result = g_new0 (GRealThread, 1); + + result->thread.joinable = joinable; + result->thread.priority = priority; + result->thread.func = func; + result->thread.data = data; + result->private_data = NULL; + G_LOCK (g_thread); + G_THREAD_UF (thread_create, (g_thread_create_proxy, result, + stack_size, joinable, bound, priority, + &result->system_thread, &local_error)); + if (!local_error) + { + result->next = g_thread_all_threads; + g_thread_all_threads = result; + } + G_UNLOCK (g_thread); + + if (local_error) + { + g_propagate_error (error, local_error); + g_free (result); + return NULL; + } + + return (GThread*) result; +} + +/** + * g_thread_exit: + * @retval: the return value of this thread. + * + * Exits the current thread. If another thread is waiting for that + * thread using g_thread_join() and the current thread is joinable, the + * waiting thread will be woken up and get @retval as the return value + * of g_thread_join(). If the current thread is not joinable, @retval + * is ignored. Calling + * + * + * + * g_thread_exit (retval); + * + * + * + * is equivalent to returning @retval from the function @func, as given + * to g_thread_create(). + * + * Never call g_thread_exit() from within a thread of a + * #GThreadPool, as that will mess up the bookkeeping and lead to funny + * and unwanted results. + **/ +void +g_thread_exit (gpointer retval) +{ + GRealThread* real = (GRealThread*) g_thread_self (); + real->retval = retval; + G_THREAD_CF (thread_exit, (void)0, ()); +} + +/** + * g_thread_join: + * @thread: a #GThread to be waited for. + * @Returns: the return value of the thread. + * + * Waits until @thread finishes, i.e. the function @func, as given to + * g_thread_create(), returns or g_thread_exit() is called by @thread. + * All resources of @thread including the #GThread struct are released. + * @thread must have been created with @joinable=%TRUE in + * g_thread_create(). The value returned by @func or given to + * g_thread_exit() by @thread is returned by this function. + **/ +gpointer +g_thread_join (GThread* thread) +{ + GRealThread* real = (GRealThread*) thread; + GRealThread *p, *t; + gpointer retval; + + g_return_val_if_fail (thread, NULL); + g_return_val_if_fail (thread->joinable, NULL); + g_return_val_if_fail (!g_system_thread_equal (real->system_thread, + zero_thread), NULL); + + G_THREAD_UF (thread_join, (&real->system_thread)); + + retval = real->retval; + + G_LOCK (g_thread); + for (t = g_thread_all_threads, p = NULL; t; p = t, t = t->next) + { + if (t == (GRealThread*) thread) + { + if (p) + p->next = t->next; + else + g_thread_all_threads = t->next; + break; + } + } + G_UNLOCK (g_thread); + + /* Just to make sure, this isn't used any more */ + thread->joinable = 0; + g_system_thread_assign (real->system_thread, zero_thread); + + /* the thread structure for non-joinable threads is freed upon + thread end. We free the memory here. This will leave a loose end, + if a joinable thread is not joined. */ + + g_free (thread); + + return retval; +} + +/** + * g_thread_set_priority: + * @thread: a #GThread. + * @priority: a new priority for @thread. + * + * Changes the priority of @thread to @priority. + * + * It is not guaranteed that threads with different + * priorities really behave accordingly. On some systems (e.g. Linux) + * there are no thread priorities. On other systems (e.g. Solaris) there + * doesn't seem to be different scheduling for different priorities. All + * in all try to avoid being dependent on priorities. + **/ +void +g_thread_set_priority (GThread* thread, + GThreadPriority priority) +{ + GRealThread* real = (GRealThread*) thread; + + g_return_if_fail (thread); + g_return_if_fail (!g_system_thread_equal (real->system_thread, zero_thread)); + g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW); + g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT); + + thread->priority = priority; + + G_THREAD_CF (thread_set_priority, (void)0, + (&real->system_thread, priority)); +} + +/** + * g_thread_self: + * @Returns: the current thread. + * + * This functions returns the #GThread corresponding to the calling + * thread. + **/ +GThread* +g_thread_self (void) +{ + GRealThread* thread = g_private_get (g_thread_specific_private); + + if (!thread) + { + /* If no thread data is available, provide and set one. This + can happen for the main thread and for threads, that are not + created by GLib. */ + thread = g_new0 (GRealThread, 1); + thread->thread.joinable = FALSE; /* This is a save guess */ + thread->thread.priority = G_THREAD_PRIORITY_NORMAL; /* This is + just a guess */ + thread->thread.func = NULL; + thread->thread.data = NULL; + thread->private_data = NULL; + + if (g_thread_supported ()) + G_THREAD_UF (thread_self, (&thread->system_thread)); + + g_private_set (g_thread_specific_private, thread); + + G_LOCK (g_thread); + thread->next = g_thread_all_threads; + g_thread_all_threads = thread; + G_UNLOCK (g_thread); + } + + return (GThread*)thread; +} + +/* GStaticRWLock {{{1 ----------------------------------------------------- */ + +/** + * GStaticRWLock: + * + * The #GStaticRWLock struct represents a read-write lock. A read-write + * lock can be used for protecting data that some portions of code only + * read from, while others also write. In such situations it is + * desirable that several readers can read at once, whereas of course + * only one writer may write at a time. Take a look at the following + * example: + * + * + * An array with access functions + * + * GStaticRWLock rwlock = G_STATIC_RW_LOCK_INIT; + * GPtrArray *array; + * + * gpointer + * my_array_get (guint index) + * { + * gpointer retval = NULL; + * + * if (!array) + * return NULL; + * + * g_static_rw_lock_reader_lock (&rwlock); + * if (index < array->len) + * retval = g_ptr_array_index (array, index); + * g_static_rw_lock_reader_unlock (&rwlock); + * + * return retval; + * } + * + * void + * my_array_set (guint index, gpointer data) + * { + * g_static_rw_lock_writer_lock (&rwlock); + * + * if (!array) + * array = g_ptr_array_new (); + * + * if (index >= array->len) + * g_ptr_array_set_size (array, index+1); + * g_ptr_array_index (array, index) = data; + * + * g_static_rw_lock_writer_unlock (&rwlock); + * } + * + * + * + * This example shows an array which can be accessed by many readers + * (the my_array_get() function) simultaneously, + * whereas the writers (the my_array_set() + * function) will only be allowed once at a time and only if no readers + * currently access the array. This is because of the potentially + * dangerous resizing of the array. Using these functions is fully + * multi-thread safe now. + * + * Most of the time, writers should have precedence over readers. That + * means, for this implementation, that as soon as a writer wants to + * lock the data, no other reader is allowed to lock the data, whereas, + * of course, the readers that already have locked the data are allowed + * to finish their operation. As soon as the last reader unlocks the + * data, the writer will lock it. + * + * Even though #GStaticRWLock is not opaque, it should only be used + * with the following functions. + * + * All of the g_static_rw_lock_* functions can be + * used even if g_thread_init() has not been called. Then they do + * nothing, apart from g_static_rw_lock_*_trylock, + * which does nothing but returning %TRUE. + * + * A read-write lock has a higher overhead than a mutex. For + * example, both g_static_rw_lock_reader_lock() and + * g_static_rw_lock_reader_unlock() have to lock and unlock a + * #GStaticMutex, so it takes at least twice the time to lock and unlock + * a #GStaticRWLock that it does to lock and unlock a #GStaticMutex. So + * only data structures that are accessed by multiple readers, and which + * keep the lock for a considerable time justify a #GStaticRWLock. The + * above example most probably would fare better with a + * #GStaticMutex. + **/ + +/** + * G_STATIC_RW_LOCK_INIT: + * + * A #GStaticRWLock must be initialized with this macro before it can + * be used. This macro can used be to initialize a variable, but it + * cannot be assigned to a variable. In that case you have to use + * g_static_rw_lock_init(). + * + * + * + * GStaticRWLock my_lock = G_STATIC_RW_LOCK_INIT; + * + * + **/ + +/** + * g_static_rw_lock_init: + * @lock: a #GStaticRWLock to be initialized. + * + * A #GStaticRWLock must be initialized with this function before it + * can be used. Alternatively you can initialize it with + * #G_STATIC_RW_LOCK_INIT. + **/ +void +g_static_rw_lock_init (GStaticRWLock* lock) +{ + static const GStaticRWLock init_lock = G_STATIC_RW_LOCK_INIT; + + g_return_if_fail (lock); + + *lock = init_lock; +} + +inline static void +g_static_rw_lock_wait (GCond** cond, GStaticMutex* mutex) +{ + if (!*cond) + *cond = g_cond_new (); + g_cond_wait (*cond, g_static_mutex_get_mutex (mutex)); +} + +inline static void +g_static_rw_lock_signal (GStaticRWLock* lock) +{ + if (lock->want_to_write && lock->write_cond) + g_cond_signal (lock->write_cond); + else if (lock->want_to_read && lock->read_cond) + g_cond_broadcast (lock->read_cond); +} + +/** + * g_static_rw_lock_reader_lock: + * @lock: a #GStaticRWLock to lock for reading. + * + * Locks @lock for reading. There may be unlimited concurrent locks for + * reading of a #GStaticRWLock at the same time. If @lock is already + * locked for writing by another thread or if another thread is already + * waiting to lock @lock for writing, this function will block until + * @lock is unlocked by the other writing thread and no other writing + * threads want to lock @lock. This lock has to be unlocked by + * g_static_rw_lock_reader_unlock(). + * + * #GStaticRWLock is not recursive. It might seem to be possible to + * recursively lock for reading, but that can result in a deadlock, due + * to writer preference. + **/ +void +g_static_rw_lock_reader_lock (GStaticRWLock* lock) +{ + g_return_if_fail (lock); + + if (!g_threads_got_initialized) + return; + + g_static_mutex_lock (&lock->mutex); + lock->want_to_read++; + while (lock->have_writer || lock->want_to_write) + g_static_rw_lock_wait (&lock->read_cond, &lock->mutex); + lock->want_to_read--; + lock->read_counter++; + g_static_mutex_unlock (&lock->mutex); +} + +/** + * g_static_rw_lock_reader_trylock: + * @lock: a #GStaticRWLock to lock for reading. + * @Returns: %TRUE, if @lock could be locked for reading. + * + * Tries to lock @lock for reading. If @lock is already locked for + * writing by another thread or if another thread is already waiting to + * lock @lock for writing, immediately returns %FALSE. Otherwise locks + * @lock for reading and returns %TRUE. This lock has to be unlocked by + * g_static_rw_lock_reader_unlock(). + **/ +gboolean +g_static_rw_lock_reader_trylock (GStaticRWLock* lock) +{ + gboolean ret_val = FALSE; + + g_return_val_if_fail (lock, FALSE); + + if (!g_threads_got_initialized) + return TRUE; + + g_static_mutex_lock (&lock->mutex); + if (!lock->have_writer && !lock->want_to_write) + { + lock->read_counter++; + ret_val = TRUE; + } + g_static_mutex_unlock (&lock->mutex); + return ret_val; +} + +/** + * g_static_rw_lock_reader_unlock: + * @lock: a #GStaticRWLock to unlock after reading. + * + * Unlocks @lock. If a thread waits to lock @lock for writing and all + * locks for reading have been unlocked, the waiting thread is woken up + * and can lock @lock for writing. + **/ +void +g_static_rw_lock_reader_unlock (GStaticRWLock* lock) +{ + g_return_if_fail (lock); + + if (!g_threads_got_initialized) + return; + + g_static_mutex_lock (&lock->mutex); + lock->read_counter--; + if (lock->read_counter == 0) + g_static_rw_lock_signal (lock); + g_static_mutex_unlock (&lock->mutex); +} + +/** + * g_static_rw_lock_writer_lock: + * @lock: a #GStaticRWLock to lock for writing. + * + * Locks @lock for writing. If @lock is already locked for writing or + * reading by other threads, this function will block until @lock is + * completely unlocked and then lock @lock for writing. While this + * functions waits to lock @lock, no other thread can lock @lock for + * reading. When @lock is locked for writing, no other thread can lock + * @lock (neither for reading nor writing). This lock has to be + * unlocked by g_static_rw_lock_writer_unlock(). + **/ +void +g_static_rw_lock_writer_lock (GStaticRWLock* lock) +{ + g_return_if_fail (lock); + + if (!g_threads_got_initialized) + return; + + g_static_mutex_lock (&lock->mutex); + lock->want_to_write++; + while (lock->have_writer || lock->read_counter) + g_static_rw_lock_wait (&lock->write_cond, &lock->mutex); + lock->want_to_write--; + lock->have_writer = TRUE; + g_static_mutex_unlock (&lock->mutex); +} + +/** + * g_static_rw_lock_writer_trylock: + * @lock: a #GStaticRWLock to lock for writing. + * @Returns: %TRUE, if @lock could be locked for writing. + * + * Tries to lock @lock for writing. If @lock is already locked (for + * either reading or writing) by another thread, it immediately returns + * %FALSE. Otherwise it locks @lock for writing and returns %TRUE. This + * lock has to be unlocked by g_static_rw_lock_writer_unlock(). + **/ +gboolean +g_static_rw_lock_writer_trylock (GStaticRWLock* lock) +{ + gboolean ret_val = FALSE; + + g_return_val_if_fail (lock, FALSE); + + if (!g_threads_got_initialized) + return TRUE; + + g_static_mutex_lock (&lock->mutex); + if (!lock->have_writer && !lock->read_counter) + { + lock->have_writer = TRUE; + ret_val = TRUE; + } + g_static_mutex_unlock (&lock->mutex); + return ret_val; +} + +/** + * g_static_rw_lock_writer_unlock: + * @lock: a #GStaticRWLock to unlock after writing. + * + * Unlocks @lock. If a thread is waiting to lock @lock for writing and + * all locks for reading have been unlocked, the waiting thread is + * woken up and can lock @lock for writing. If no thread is waiting to + * lock @lock for writing, and some thread or threads are waiting to + * lock @lock for reading, the waiting threads are woken up and can + * lock @lock for reading. + **/ +void +g_static_rw_lock_writer_unlock (GStaticRWLock* lock) +{ + g_return_if_fail (lock); + + if (!g_threads_got_initialized) + return; + + g_static_mutex_lock (&lock->mutex); + lock->have_writer = FALSE; + g_static_rw_lock_signal (lock); + g_static_mutex_unlock (&lock->mutex); +} + +/** + * g_static_rw_lock_free: + * @lock: a #GStaticRWLock to be freed. + * + * Releases all resources allocated to @lock. + * + * You don't have to call this functions for a #GStaticRWLock with an + * unbounded lifetime, i.e. objects declared 'static', but if you have + * a #GStaticRWLock as a member of a structure, and the structure is + * freed, you should also free the #GStaticRWLock. + **/ +void +g_static_rw_lock_free (GStaticRWLock* lock) +{ + g_return_if_fail (lock); + + if (lock->read_cond) + { + g_cond_free (lock->read_cond); + lock->read_cond = NULL; + } + if (lock->write_cond) + { + g_cond_free (lock->write_cond); + lock->write_cond = NULL; + } + g_static_mutex_free (&lock->mutex); +} + +/* Unsorted {{{1 ---------------------------------------------------------- */ + +/** + * g_thread_foreach + * @thread_func: function to call for all GThread structures + * @user_data: second argument to @thread_func + * + * Call @thread_func on all existing #GThread structures. Note that + * threads may decide to exit while @thread_func is running, so + * without intimate knowledge about the lifetime of foreign threads, + * @thread_func shouldn't access the GThread* pointer passed in as + * first argument. However, @thread_func will not be called for threads + * which are known to have exited already. + * + * Due to thread lifetime checks, this function has an execution complexity + * which is quadratic in the number of existing threads. + * + * Since: 2.10 + */ +void +g_thread_foreach (GFunc thread_func, + gpointer user_data) +{ + GSList *slist = NULL; + GRealThread *thread; + g_return_if_fail (thread_func != NULL); + /* snapshot the list of threads for iteration */ + G_LOCK (g_thread); + for (thread = g_thread_all_threads; thread; thread = thread->next) + slist = g_slist_prepend (slist, thread); + G_UNLOCK (g_thread); + /* walk the list, skipping non-existant threads */ + while (slist) + { + GSList *node = slist; + slist = node->next; + /* check whether the current thread still exists */ + G_LOCK (g_thread); + for (thread = g_thread_all_threads; thread; thread = thread->next) + if (thread == node->data) + break; + G_UNLOCK (g_thread); + if (thread) + thread_func (thread, user_data); + g_slist_free_1 (node); + } +} + +/** + * g_thread_get_initialized + * + * Indicates if g_thread_init() has been called. + * + * Returns: %TRUE if threads have been initialized. + * + * Since: 2.20 + */ +gboolean +g_thread_get_initialized () +{ + return g_thread_supported (); +} + +#define __G_THREAD_C__ +#include "galiasdef.c" + diff --git a/glib/gthread.h b/glib/gthread.h new file mode 100644 index 0000000..7a0abba --- /dev/null +++ b/glib/gthread.h @@ -0,0 +1,408 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_THREAD_H__ +#define __G_THREAD_H__ + +#include +#include +#include /* for G_INLINE_FUNC */ +#include /* for g_atomic_pointer_get */ + +G_BEGIN_DECLS + +/* GLib Thread support + */ + +extern GQuark g_thread_error_quark (void); +#define G_THREAD_ERROR g_thread_error_quark () + +typedef enum +{ + G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ +} GThreadError; + +typedef gpointer (*GThreadFunc) (gpointer data); + +typedef enum +{ + G_THREAD_PRIORITY_LOW, + G_THREAD_PRIORITY_NORMAL, + G_THREAD_PRIORITY_HIGH, + G_THREAD_PRIORITY_URGENT +} GThreadPriority; + +typedef struct _GThread GThread; +struct _GThread +{ + /*< private >*/ + GThreadFunc func; + gpointer data; + gboolean joinable; + GThreadPriority priority; +}; + +typedef struct _GMutex GMutex; +typedef struct _GCond GCond; +typedef struct _GPrivate GPrivate; +typedef struct _GStaticPrivate GStaticPrivate; + +typedef struct _GThreadFunctions GThreadFunctions; +struct _GThreadFunctions +{ + GMutex* (*mutex_new) (void); + void (*mutex_lock) (GMutex *mutex); + gboolean (*mutex_trylock) (GMutex *mutex); + void (*mutex_unlock) (GMutex *mutex); + void (*mutex_free) (GMutex *mutex); + GCond* (*cond_new) (void); + void (*cond_signal) (GCond *cond); + void (*cond_broadcast) (GCond *cond); + void (*cond_wait) (GCond *cond, + GMutex *mutex); + gboolean (*cond_timed_wait) (GCond *cond, + GMutex *mutex, + GTimeVal *end_time); + void (*cond_free) (GCond *cond); + GPrivate* (*private_new) (GDestroyNotify destructor); + gpointer (*private_get) (GPrivate *private_key); + void (*private_set) (GPrivate *private_key, + gpointer data); + void (*thread_create) (GThreadFunc func, + gpointer data, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + gpointer thread, + GError **error); + void (*thread_yield) (void); + void (*thread_join) (gpointer thread); + void (*thread_exit) (void); + void (*thread_set_priority)(gpointer thread, + GThreadPriority priority); + void (*thread_self) (gpointer thread); + gboolean (*thread_equal) (gpointer thread1, + gpointer thread2); +}; + +GLIB_VAR GThreadFunctions g_thread_functions_for_glib_use; +GLIB_VAR gboolean g_thread_use_default_impl; +GLIB_VAR gboolean g_threads_got_initialized; + +GLIB_VAR guint64 (*g_thread_gettime) (void); + +/* initializes the mutex/cond/private implementation for glib, might + * only be called once, and must not be called directly or indirectly + * from another glib-function, e.g. as a callback. + */ +void g_thread_init (GThreadFunctions *vtable); + +/* Errorcheck mutexes. If you define G_ERRORCHECK_MUTEXES, then all + * mutexes will check for re-locking and re-unlocking */ + +/* Initialize thread system with errorcheck mutexes. vtable must be + * NULL. Do not call directly. Use #define G_ERRORCHECK_MUTEXES + * instead. + */ +void g_thread_init_with_errorcheck_mutexes (GThreadFunctions* vtable); + +/* Checks if thread support is initialized. Identical to the + * g_thread_supported macro but provided for language bindings. + */ +gboolean g_thread_get_initialized (void); + +/* A random number to recognize debug calls to g_mutex_... */ +#define G_MUTEX_DEBUG_MAGIC 0xf8e18ad7 + +#ifdef G_ERRORCHECK_MUTEXES +#define g_thread_init(vtable) g_thread_init_with_errorcheck_mutexes (vtable) +#endif + +/* internal function for fallback static mutex implementation */ +GMutex* g_static_mutex_get_mutex_impl (GMutex **mutex); + +#define g_static_mutex_get_mutex_impl_shortcut(mutex) \ + (g_atomic_pointer_get (mutex) ? *(mutex) : \ + g_static_mutex_get_mutex_impl (mutex)) + +/* shorthands for conditional and unconditional function calls */ + +#define G_THREAD_UF(op, arglist) \ + (*g_thread_functions_for_glib_use . op) arglist +#define G_THREAD_CF(op, fail, arg) \ + (g_thread_supported () ? G_THREAD_UF (op, arg) : (fail)) +#define G_THREAD_ECF(op, fail, mutex, type) \ + (g_thread_supported () ? \ + ((type(*)(GMutex*, const gulong, gchar const*)) \ + (*g_thread_functions_for_glib_use . op)) \ + (mutex, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : (fail)) + +#ifndef G_ERRORCHECK_MUTEXES +# define g_mutex_lock(mutex) \ + G_THREAD_CF (mutex_lock, (void)0, (mutex)) +# define g_mutex_trylock(mutex) \ + G_THREAD_CF (mutex_trylock, TRUE, (mutex)) +# define g_mutex_unlock(mutex) \ + G_THREAD_CF (mutex_unlock, (void)0, (mutex)) +# define g_mutex_free(mutex) \ + G_THREAD_CF (mutex_free, (void)0, (mutex)) +# define g_cond_wait(cond, mutex) \ + G_THREAD_CF (cond_wait, (void)0, (cond, mutex)) +# define g_cond_timed_wait(cond, mutex, abs_time) \ + G_THREAD_CF (cond_timed_wait, TRUE, (cond, mutex, abs_time)) +#else /* G_ERRORCHECK_MUTEXES */ +# define g_mutex_lock(mutex) \ + G_THREAD_ECF (mutex_lock, (void)0, (mutex), void) +# define g_mutex_trylock(mutex) \ + G_THREAD_ECF (mutex_trylock, TRUE, (mutex), gboolean) +# define g_mutex_unlock(mutex) \ + G_THREAD_ECF (mutex_unlock, (void)0, (mutex), void) +# define g_mutex_free(mutex) \ + G_THREAD_ECF (mutex_free, (void)0, (mutex), void) +# define g_cond_wait(cond, mutex) \ + (g_thread_supported () ? ((void(*)(GCond*, GMutex*, gulong, gchar*))\ + g_thread_functions_for_glib_use.cond_wait) \ + (cond, mutex, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : (void) 0) +# define g_cond_timed_wait(cond, mutex, abs_time) \ + (g_thread_supported () ? \ + ((gboolean(*)(GCond*, GMutex*, GTimeVal*, gulong, gchar*)) \ + g_thread_functions_for_glib_use.cond_timed_wait) \ + (cond, mutex, abs_time, G_MUTEX_DEBUG_MAGIC, G_STRLOC) : TRUE) +#endif /* G_ERRORCHECK_MUTEXES */ + +#if defined(G_THREADS_ENABLED) && defined(G_THREADS_MANDATORY) +#define g_thread_supported() 1 +#else +#define g_thread_supported() (g_threads_got_initialized) +#endif +#define g_mutex_new() G_THREAD_UF (mutex_new, ()) +#define g_cond_new() G_THREAD_UF (cond_new, ()) +#define g_cond_signal(cond) G_THREAD_CF (cond_signal, (void)0, (cond)) +#define g_cond_broadcast(cond) G_THREAD_CF (cond_broadcast, (void)0, (cond)) +#define g_cond_free(cond) G_THREAD_CF (cond_free, (void)0, (cond)) +#define g_private_new(destructor) G_THREAD_UF (private_new, (destructor)) +#define g_private_get(private_key) G_THREAD_CF (private_get, \ + ((gpointer)private_key), \ + (private_key)) +#define g_private_set(private_key, value) G_THREAD_CF (private_set, \ + (void) (private_key = \ + (GPrivate*) (value)), \ + (private_key, value)) +#define g_thread_yield() G_THREAD_CF (thread_yield, (void)0, ()) + +#define g_thread_create(func, data, joinable, error) \ + (g_thread_create_full (func, data, 0, joinable, FALSE, \ + G_THREAD_PRIORITY_NORMAL, error)) + +GThread* g_thread_create_full (GThreadFunc func, + gpointer data, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + GError **error); +GThread* g_thread_self (void); +void g_thread_exit (gpointer retval); +gpointer g_thread_join (GThread *thread); + +void g_thread_set_priority (GThread *thread, + GThreadPriority priority); + +/* GStaticMutexes can be statically initialized with the value + * G_STATIC_MUTEX_INIT, and then they can directly be used, that is + * much easier, than having to explicitly allocate the mutex before + * use + */ +#define g_static_mutex_lock(mutex) \ + g_mutex_lock (g_static_mutex_get_mutex (mutex)) +#define g_static_mutex_trylock(mutex) \ + g_mutex_trylock (g_static_mutex_get_mutex (mutex)) +#define g_static_mutex_unlock(mutex) \ + g_mutex_unlock (g_static_mutex_get_mutex (mutex)) +void g_static_mutex_init (GStaticMutex *mutex); +void g_static_mutex_free (GStaticMutex *mutex); + +struct _GStaticPrivate +{ + /*< private >*/ + guint index; +}; +#define G_STATIC_PRIVATE_INIT { 0 } +void g_static_private_init (GStaticPrivate *private_key); +gpointer g_static_private_get (GStaticPrivate *private_key); +void g_static_private_set (GStaticPrivate *private_key, + gpointer data, + GDestroyNotify notify); +void g_static_private_free (GStaticPrivate *private_key); + +typedef struct _GStaticRecMutex GStaticRecMutex; +struct _GStaticRecMutex +{ + /*< private >*/ + GStaticMutex mutex; + guint depth; + GSystemThread owner; +}; + +#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT } +void g_static_rec_mutex_init (GStaticRecMutex *mutex); +void g_static_rec_mutex_lock (GStaticRecMutex *mutex); +gboolean g_static_rec_mutex_trylock (GStaticRecMutex *mutex); +void g_static_rec_mutex_unlock (GStaticRecMutex *mutex); +void g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, + guint depth); +guint g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex); +void g_static_rec_mutex_free (GStaticRecMutex *mutex); + +typedef struct _GStaticRWLock GStaticRWLock; +struct _GStaticRWLock +{ + /*< private >*/ + GStaticMutex mutex; + GCond *read_cond; + GCond *write_cond; + guint read_counter; + gboolean have_writer; + guint want_to_read; + guint want_to_write; +}; + +#define G_STATIC_RW_LOCK_INIT { G_STATIC_MUTEX_INIT, NULL, NULL, 0, FALSE, 0, 0 } + +void g_static_rw_lock_init (GStaticRWLock* lock); +void g_static_rw_lock_reader_lock (GStaticRWLock* lock); +gboolean g_static_rw_lock_reader_trylock (GStaticRWLock* lock); +void g_static_rw_lock_reader_unlock (GStaticRWLock* lock); +void g_static_rw_lock_writer_lock (GStaticRWLock* lock); +gboolean g_static_rw_lock_writer_trylock (GStaticRWLock* lock); +void g_static_rw_lock_writer_unlock (GStaticRWLock* lock); +void g_static_rw_lock_free (GStaticRWLock* lock); + +void g_thread_foreach (GFunc thread_func, + gpointer user_data); + +typedef enum +{ + G_ONCE_STATUS_NOTCALLED, + G_ONCE_STATUS_PROGRESS, + G_ONCE_STATUS_READY +} GOnceStatus; + +typedef struct _GOnce GOnce; +struct _GOnce +{ + volatile GOnceStatus status; + volatile gpointer retval; +}; + +#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL } + +gpointer g_once_impl (GOnce *once, GThreadFunc func, gpointer arg); + +#ifdef G_ATOMIC_OP_MEMORY_BARRIER_NEEDED +# define g_once(once, func, arg) g_once_impl ((once), (func), (arg)) +#else /* !G_ATOMIC_OP_MEMORY_BARRIER_NEEDED*/ +# define g_once(once, func, arg) \ + (((once)->status == G_ONCE_STATUS_READY) ? \ + (once)->retval : \ + g_once_impl ((once), (func), (arg))) +#endif /* G_ATOMIC_OP_MEMORY_BARRIER_NEEDED */ + +/* initialize-once guards, keyed by value_location */ +G_INLINE_FUNC gboolean g_once_init_enter (volatile gsize *value_location); +gboolean g_once_init_enter_impl (volatile gsize *value_location); +void g_once_init_leave (volatile gsize *value_location, + gsize initialization_value); +#if defined (G_CAN_INLINE) || defined (__G_THREAD_C__) +G_INLINE_FUNC gboolean +g_once_init_enter (volatile gsize *value_location) +{ + if G_LIKELY ((gpointer) g_atomic_pointer_get (value_location) != NULL) + return FALSE; + else + return g_once_init_enter_impl (value_location); +} +#endif /* G_CAN_INLINE || __G_THREAD_C__ */ + +/* these are some convenience macros that expand to nothing if GLib + * was configured with --disable-threads. for using StaticMutexes, + * you define them with G_LOCK_DEFINE_STATIC (name) or G_LOCK_DEFINE (name) + * if you need to export the mutex. With G_LOCK_EXTERN (name) you can + * declare such an globally defined lock. name is a unique identifier + * for the protected varibale or code portion. locking, testing and + * unlocking of such mutexes can be done with G_LOCK(), G_UNLOCK() and + * G_TRYLOCK() respectively. + */ +extern void glib_dummy_decl (void); +#define G_LOCK_NAME(name) g__ ## name ## _lock +#ifdef G_THREADS_ENABLED +# define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name) +# define G_LOCK_DEFINE(name) \ + GStaticMutex G_LOCK_NAME (name) = G_STATIC_MUTEX_INIT +# define G_LOCK_EXTERN(name) extern GStaticMutex G_LOCK_NAME (name) + +# ifdef G_DEBUG_LOCKS +# define G_LOCK(name) G_STMT_START{ \ + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ + "file %s: line %d (%s): locking: %s ", \ + __FILE__, __LINE__, G_STRFUNC, \ + #name); \ + g_static_mutex_lock (&G_LOCK_NAME (name)); \ + }G_STMT_END +# define G_UNLOCK(name) G_STMT_START{ \ + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ + "file %s: line %d (%s): unlocking: %s ", \ + __FILE__, __LINE__, G_STRFUNC, \ + #name); \ + g_static_mutex_unlock (&G_LOCK_NAME (name)); \ + }G_STMT_END +# define G_TRYLOCK(name) \ + (g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ + "file %s: line %d (%s): try locking: %s ", \ + __FILE__, __LINE__, G_STRFUNC, \ + #name), g_static_mutex_trylock (&G_LOCK_NAME (name))) +# else /* !G_DEBUG_LOCKS */ +# define G_LOCK(name) g_static_mutex_lock (&G_LOCK_NAME (name)) +# define G_UNLOCK(name) g_static_mutex_unlock (&G_LOCK_NAME (name)) +# define G_TRYLOCK(name) g_static_mutex_trylock (&G_LOCK_NAME (name)) +# endif /* !G_DEBUG_LOCKS */ +#else /* !G_THREADS_ENABLED */ +# define G_LOCK_DEFINE_STATIC(name) extern void glib_dummy_decl (void) +# define G_LOCK_DEFINE(name) extern void glib_dummy_decl (void) +# define G_LOCK_EXTERN(name) extern void glib_dummy_decl (void) +# define G_LOCK(name) +# define G_UNLOCK(name) +# define G_TRYLOCK(name) (TRUE) +#endif /* !G_THREADS_ENABLED */ + +G_END_DECLS + +#endif /* __G_THREAD_H__ */ diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c new file mode 100644 index 0000000..3ece1b4 --- /dev/null +++ b/glib/gthreadpool.c @@ -0,0 +1,995 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GAsyncQueue: thread pool implementation. + * Copyright (C) 2000 Sebastian Wilhelmi; University of Karlsruhe + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: thread_pools + * @title: Thread Pools + * @short_description: pools of threads to execute work concurrently + * @see_also: + * #GThread GLib thread + * system. + * + * + * Sometimes you wish to asynchronously fork out the execution of work + * and continue working in your own thread. If that will happen often, + * the overhead of starting and destroying a thread each time might be + * too high. In such cases reusing already started threads seems like a + * good idea. And it indeed is, but implementing this can be tedious + * and error-prone. + * + * Therefore GLib provides thread pools for your convenience. An added + * advantage is, that the threads can be shared between the different + * subsystems of your program, when they are using GLib. + * + * To create a new thread pool, you use g_thread_pool_new(). It is + * destroyed by g_thread_pool_free(). + * + * If you want to execute a certain task within a thread pool, you call + * g_thread_pool_push(). + * + * To get the current number of running threads you call + * g_thread_pool_get_num_threads(). To get the number of still + * unprocessed tasks you call g_thread_pool_unprocessed(). To control + * the maximal number of threads for a thread pool, you use + * g_thread_pool_get_max_threads() and g_thread_pool_set_max_threads(). + * + * Finally you can control the number of unused threads, that are kept + * alive by GLib for future use. The current number can be fetched with + * g_thread_pool_get_num_unused_threads(). The maximal number can be + * controlled by g_thread_pool_get_max_unused_threads() and + * g_thread_pool_set_max_unused_threads(). All currently unused threads + * can be stopped by calling g_thread_pool_stop_unused_threads(). + **/ + +#define DEBUG_MSG(x) +/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ + +typedef struct _GRealThreadPool GRealThreadPool; + +/** + * GThreadPool: + * @func: the function to execute in the threads of this pool + * @user_data: the user data for the threads of this pool + * @exclusive: are all threads exclusive to this pool + * + * The #GThreadPool struct represents a thread pool. It has three + * public read-only members, but the underlying struct is bigger, so + * you must not copy this struct. + **/ +struct _GRealThreadPool +{ + GThreadPool pool; + GAsyncQueue* queue; + GCond* cond; + gint max_threads; + gint num_threads; + gboolean running; + gboolean immediate; + gboolean waiting; + GCompareDataFunc sort_func; + gpointer sort_user_data; +}; + +/* The following is just an address to mark the wakeup order for a + * thread, it could be any address (as long, as it isn't a valid + * GThreadPool address) */ +static const gpointer wakeup_thread_marker = (gpointer) &g_thread_pool_new; +static gint wakeup_thread_serial = 0; + +/* Here all unused threads are waiting */ +static GAsyncQueue *unused_thread_queue = NULL; +static gint unused_threads = 0; +static gint max_unused_threads = 0; +static gint kill_unused_threads = 0; +static guint max_idle_time = 0; + +static void g_thread_pool_queue_push_unlocked (GRealThreadPool *pool, + gpointer data); +static void g_thread_pool_free_internal (GRealThreadPool *pool); +static gpointer g_thread_pool_thread_proxy (gpointer data); +static void g_thread_pool_start_thread (GRealThreadPool *pool, + GError **error); +static void g_thread_pool_wakeup_and_stop_all (GRealThreadPool *pool); +static GRealThreadPool* g_thread_pool_wait_for_new_pool (void); +static gpointer g_thread_pool_wait_for_new_task (GRealThreadPool *pool); + +static void +g_thread_pool_queue_push_unlocked (GRealThreadPool *pool, + gpointer data) +{ + if (pool->sort_func) + g_async_queue_push_sorted_unlocked (pool->queue, + data, + pool->sort_func, + pool->sort_user_data); + else + g_async_queue_push_unlocked (pool->queue, data); +} + +static GRealThreadPool* +g_thread_pool_wait_for_new_pool (void) +{ + GRealThreadPool *pool; + gint local_wakeup_thread_serial; + guint local_max_unused_threads; + gint local_max_idle_time; + gint last_wakeup_thread_serial; + gboolean have_relayed_thread_marker = FALSE; + + local_max_unused_threads = g_atomic_int_get (&max_unused_threads); + local_max_idle_time = g_atomic_int_get (&max_idle_time); + last_wakeup_thread_serial = g_atomic_int_get (&wakeup_thread_serial); + + g_atomic_int_inc (&unused_threads); + + do + { + if (g_atomic_int_get (&unused_threads) >= local_max_unused_threads) + { + /* If this is a superfluous thread, stop it. */ + pool = NULL; + } + else if (local_max_idle_time > 0) + { + /* If a maximal idle time is given, wait for the given time. */ + GTimeVal end_time; + + g_get_current_time (&end_time); + g_time_val_add (&end_time, local_max_idle_time * 1000); + + DEBUG_MSG (("thread %p waiting in global pool for %f seconds.", + g_thread_self (), local_max_idle_time / 1000.0)); + + pool = g_async_queue_timed_pop (unused_thread_queue, &end_time); + } + else + { + /* If no maximal idle time is given, wait indefinitely. */ + DEBUG_MSG (("thread %p waiting in global pool.", + g_thread_self ())); + pool = g_async_queue_pop (unused_thread_queue); + } + + if (pool == wakeup_thread_marker) + { + local_wakeup_thread_serial = g_atomic_int_get (&wakeup_thread_serial); + if (last_wakeup_thread_serial == local_wakeup_thread_serial) + { + if (!have_relayed_thread_marker) + { + /* If this wakeup marker has been received for + * the second time, relay it. + */ + DEBUG_MSG (("thread %p relaying wakeup message to " + "waiting thread with lower serial.", + g_thread_self ())); + + g_async_queue_push (unused_thread_queue, wakeup_thread_marker); + have_relayed_thread_marker = TRUE; + + /* If a wakeup marker has been relayed, this thread + * will get out of the way for 100 microseconds to + * avoid receiving this marker again. */ + g_usleep (100); + } + } + else + { + if (g_atomic_int_exchange_and_add (&kill_unused_threads, -1) > 0) + { + pool = NULL; + break; + } + + DEBUG_MSG (("thread %p updating to new limits.", + g_thread_self ())); + + local_max_unused_threads = g_atomic_int_get (&max_unused_threads); + local_max_idle_time = g_atomic_int_get (&max_idle_time); + last_wakeup_thread_serial = local_wakeup_thread_serial; + + have_relayed_thread_marker = FALSE; + } + } + } + while (pool == wakeup_thread_marker); + + g_atomic_int_add (&unused_threads, -1); + + return pool; +} + +static gpointer +g_thread_pool_wait_for_new_task (GRealThreadPool *pool) +{ + gpointer task = NULL; + + if (pool->running || (!pool->immediate && + g_async_queue_length_unlocked (pool->queue) > 0)) + { + /* This thread pool is still active. */ + if (pool->num_threads > pool->max_threads && pool->max_threads != -1) + { + /* This is a superfluous thread, so it goes to the global pool. */ + DEBUG_MSG (("superfluous thread %p in pool %p.", + g_thread_self (), pool)); + } + else if (pool->pool.exclusive) + { + /* Exclusive threads stay attached to the pool. */ + task = g_async_queue_pop_unlocked (pool->queue); + + DEBUG_MSG (("thread %p in exclusive pool %p waits for task " + "(%d running, %d unprocessed).", + g_thread_self (), pool, pool->num_threads, + g_async_queue_length_unlocked (pool->queue))); + } + else + { + /* A thread will wait for new tasks for at most 1/2 + * second before going to the global pool. + */ + GTimeVal end_time; + + g_get_current_time (&end_time); + g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */ + + DEBUG_MSG (("thread %p in pool %p waits for up to a 1/2 second for task " + "(%d running, %d unprocessed).", + g_thread_self (), pool, pool->num_threads, + g_async_queue_length_unlocked (pool->queue))); + + task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time); + } + } + else + { + /* This thread pool is inactive, it will no longer process tasks. */ + DEBUG_MSG (("pool %p not active, thread %p will go to global pool " + "(running: %s, immediate: %s, len: %d).", + pool, g_thread_self (), + pool->running ? "true" : "false", + pool->immediate ? "true" : "false", + g_async_queue_length_unlocked (pool->queue))); + } + + return task; +} + + +static gpointer +g_thread_pool_thread_proxy (gpointer data) +{ + GRealThreadPool *pool; + + pool = data; + + DEBUG_MSG (("thread %p started for pool %p.", + g_thread_self (), pool)); + + g_async_queue_lock (pool->queue); + + while (TRUE) + { + gpointer task; + + task = g_thread_pool_wait_for_new_task (pool); + if (task) + { + if (pool->running || !pool->immediate) + { + /* A task was received and the thread pool is active, so + * execute the function. + */ + g_async_queue_unlock (pool->queue); + DEBUG_MSG (("thread %p in pool %p calling func.", + g_thread_self (), pool)); + pool->pool.func (task, pool->pool.user_data); + g_async_queue_lock (pool->queue); + } + } + else + { + /* No task was received, so this thread goes to the global + * pool. + */ + gboolean free_pool = FALSE; + + DEBUG_MSG (("thread %p leaving pool %p for global pool.", + g_thread_self (), pool)); + pool->num_threads--; + + if (!pool->running) + { + if (!pool->waiting) + { + if (pool->num_threads == 0) + { + /* If the pool is not running and no other + * thread is waiting for this thread pool to + * finish and this is the last thread of this + * pool, free the pool. + */ + free_pool = TRUE; + } + else + { + /* If the pool is not running and no other + * thread is waiting for this thread pool to + * finish and this is not the last thread of + * this pool and there are no tasks left in the + * queue, wakeup the remaining threads. + */ + if (g_async_queue_length_unlocked (pool->queue) == + - pool->num_threads) + g_thread_pool_wakeup_and_stop_all (pool); + } + } + else if (pool->immediate || + g_async_queue_length_unlocked (pool->queue) <= 0) + { + /* If the pool is not running and another thread is + * waiting for this thread pool to finish and there + * are either no tasks left or the pool shall stop + * immediatly, inform the waiting thread of a change + * of the thread pool state. + */ + g_cond_broadcast (pool->cond); + } + } + + g_async_queue_unlock (pool->queue); + + if (free_pool) + g_thread_pool_free_internal (pool); + + if ((pool = g_thread_pool_wait_for_new_pool ()) == NULL) + break; + + g_async_queue_lock (pool->queue); + + DEBUG_MSG (("thread %p entering pool %p from global pool.", + g_thread_self (), pool)); + + /* pool->num_threads++ is not done here, but in + * g_thread_pool_start_thread to make the new started thread + * known to the pool, before itself can do it. + */ + } + } + + return NULL; +} + +static void +g_thread_pool_start_thread (GRealThreadPool *pool, + GError **error) +{ + gboolean success = FALSE; + + if (pool->num_threads >= pool->max_threads && pool->max_threads != -1) + /* Enough threads are already running */ + return; + + g_async_queue_lock (unused_thread_queue); + + if (g_async_queue_length_unlocked (unused_thread_queue) < 0) + { + g_async_queue_push_unlocked (unused_thread_queue, pool); + success = TRUE; + } + + g_async_queue_unlock (unused_thread_queue); + + if (!success) + { + GError *local_error = NULL; + /* No thread was found, we have to start a new one */ + g_thread_create (g_thread_pool_thread_proxy, pool, FALSE, &local_error); + + if (local_error) + { + g_propagate_error (error, local_error); + return; + } + } + + /* See comment in g_thread_pool_thread_proxy as to why this is done + * here and not there + */ + pool->num_threads++; +} + +/** + * g_thread_pool_new: + * @func: a function to execute in the threads of the new thread pool + * @user_data: user data that is handed over to @func every time it + * is called + * @max_threads: the maximal number of threads to execute concurrently in + * the new thread pool, -1 means no limit + * @exclusive: should this thread pool be exclusive? + * @error: return location for error + * + * This function creates a new thread pool. + * + * Whenever you call g_thread_pool_push(), either a new thread is + * created or an unused one is reused. At most @max_threads threads + * are running concurrently for this thread pool. @max_threads = -1 + * allows unlimited threads to be created for this thread pool. The + * newly created or reused thread now executes the function @func with + * the two arguments. The first one is the parameter to + * g_thread_pool_push() and the second one is @user_data. + * + * The parameter @exclusive determines, whether the thread pool owns + * all threads exclusive or whether the threads are shared + * globally. If @exclusive is %TRUE, @max_threads threads are started + * immediately and they will run exclusively for this thread pool until + * it is destroyed by g_thread_pool_free(). If @exclusive is %FALSE, + * threads are created, when needed and shared between all + * non-exclusive thread pools. This implies that @max_threads may not + * be -1 for exclusive thread pools. + * + * @error can be %NULL to ignore errors, or non-%NULL to report + * errors. An error can only occur when @exclusive is set to %TRUE and + * not all @max_threads threads could be created. + * + * Return value: the new #GThreadPool + **/ +GThreadPool* +g_thread_pool_new (GFunc func, + gpointer user_data, + gint max_threads, + gboolean exclusive, + GError **error) +{ + GRealThreadPool *retval; + G_LOCK_DEFINE_STATIC (init); + + g_return_val_if_fail (func, NULL); + g_return_val_if_fail (!exclusive || max_threads != -1, NULL); + g_return_val_if_fail (max_threads >= -1, NULL); + g_return_val_if_fail (g_thread_supported (), NULL); + + retval = g_new (GRealThreadPool, 1); + + retval->pool.func = func; + retval->pool.user_data = user_data; + retval->pool.exclusive = exclusive; + retval->queue = g_async_queue_new (); + retval->cond = NULL; + retval->max_threads = max_threads; + retval->num_threads = 0; + retval->running = TRUE; + retval->sort_func = NULL; + retval->sort_user_data = NULL; + + G_LOCK (init); + if (!unused_thread_queue) + unused_thread_queue = g_async_queue_new (); + G_UNLOCK (init); + + if (retval->pool.exclusive) + { + g_async_queue_lock (retval->queue); + + while (retval->num_threads < retval->max_threads) + { + GError *local_error = NULL; + g_thread_pool_start_thread (retval, &local_error); + if (local_error) + { + g_propagate_error (error, local_error); + break; + } + } + + g_async_queue_unlock (retval->queue); + } + + return (GThreadPool*) retval; +} + +/** + * g_thread_pool_push: + * @pool: a #GThreadPool + * @data: a new task for @pool + * @error: return location for error + * + * Inserts @data into the list of tasks to be executed by @pool. When + * the number of currently running threads is lower than the maximal + * allowed number of threads, a new thread is started (or reused) with + * the properties given to g_thread_pool_new (). Otherwise @data stays + * in the queue until a thread in this pool finishes its previous task + * and processes @data. + * + * @error can be %NULL to ignore errors, or non-%NULL to report + * errors. An error can only occur when a new thread couldn't be + * created. In that case @data is simply appended to the queue of work + * to do. + **/ +void +g_thread_pool_push (GThreadPool *pool, + gpointer data, + GError **error) +{ + GRealThreadPool *real; + + real = (GRealThreadPool*) pool; + + g_return_if_fail (real); + g_return_if_fail (real->running); + + g_async_queue_lock (real->queue); + + if (g_async_queue_length_unlocked (real->queue) >= 0) + /* No thread is waiting in the queue */ + g_thread_pool_start_thread (real, error); + + g_thread_pool_queue_push_unlocked (real, data); + g_async_queue_unlock (real->queue); +} + +/** + * g_thread_pool_set_max_threads: + * @pool: a #GThreadPool + * @max_threads: a new maximal number of threads for @pool + * @error: return location for error + * + * Sets the maximal allowed number of threads for @pool. A value of -1 + * means, that the maximal number of threads is unlimited. + * + * Setting @max_threads to 0 means stopping all work for @pool. It is + * effectively frozen until @max_threads is set to a non-zero value + * again. + * + * A thread is never terminated while calling @func, as supplied by + * g_thread_pool_new (). Instead the maximal number of threads only + * has effect for the allocation of new threads in g_thread_pool_push(). + * A new thread is allocated, whenever the number of currently + * running threads in @pool is smaller than the maximal number. + * + * @error can be %NULL to ignore errors, or non-%NULL to report + * errors. An error can only occur when a new thread couldn't be + * created. + **/ +void +g_thread_pool_set_max_threads (GThreadPool *pool, + gint max_threads, + GError **error) +{ + GRealThreadPool *real; + gint to_start; + + real = (GRealThreadPool*) pool; + + g_return_if_fail (real); + g_return_if_fail (real->running); + g_return_if_fail (!real->pool.exclusive || max_threads != -1); + g_return_if_fail (max_threads >= -1); + + g_async_queue_lock (real->queue); + + real->max_threads = max_threads; + + if (pool->exclusive) + to_start = real->max_threads - real->num_threads; + else + to_start = g_async_queue_length_unlocked (real->queue); + + for ( ; to_start > 0; to_start--) + { + GError *local_error = NULL; + + g_thread_pool_start_thread (real, &local_error); + if (local_error) + { + g_propagate_error (error, local_error); + break; + } + } + + g_async_queue_unlock (real->queue); +} + +/** + * g_thread_pool_get_max_threads: + * @pool: a #GThreadPool + * + * Returns the maximal number of threads for @pool. + * + * Return value: the maximal number of threads + **/ +gint +g_thread_pool_get_max_threads (GThreadPool *pool) +{ + GRealThreadPool *real; + gint retval; + + real = (GRealThreadPool*) pool; + + g_return_val_if_fail (real, 0); + g_return_val_if_fail (real->running, 0); + + g_async_queue_lock (real->queue); + retval = real->max_threads; + g_async_queue_unlock (real->queue); + + return retval; +} + +/** + * g_thread_pool_get_num_threads: + * @pool: a #GThreadPool + * + * Returns the number of threads currently running in @pool. + * + * Return value: the number of threads currently running + **/ +guint +g_thread_pool_get_num_threads (GThreadPool *pool) +{ + GRealThreadPool *real; + guint retval; + + real = (GRealThreadPool*) pool; + + g_return_val_if_fail (real, 0); + g_return_val_if_fail (real->running, 0); + + g_async_queue_lock (real->queue); + retval = real->num_threads; + g_async_queue_unlock (real->queue); + + return retval; +} + +/** + * g_thread_pool_unprocessed: + * @pool: a #GThreadPool + * + * Returns the number of tasks still unprocessed in @pool. + * + * Return value: the number of unprocessed tasks + **/ +guint +g_thread_pool_unprocessed (GThreadPool *pool) +{ + GRealThreadPool *real; + gint unprocessed; + + real = (GRealThreadPool*) pool; + + g_return_val_if_fail (real, 0); + g_return_val_if_fail (real->running, 0); + + unprocessed = g_async_queue_length (real->queue); + + return MAX (unprocessed, 0); +} + +/** + * g_thread_pool_free: + * @pool: a #GThreadPool + * @immediate: should @pool shut down immediately? + * @wait_: should the function wait for all tasks to be finished? + * + * Frees all resources allocated for @pool. + * + * If @immediate is %TRUE, no new task is processed for + * @pool. Otherwise @pool is not freed before the last task is + * processed. Note however, that no thread of this pool is + * interrupted, while processing a task. Instead at least all still + * running threads can finish their tasks before the @pool is freed. + * + * If @wait_ is %TRUE, the functions does not return before all tasks + * to be processed (dependent on @immediate, whether all or only the + * currently running) are ready. Otherwise the function returns immediately. + * + * After calling this function @pool must not be used anymore. + **/ +void +g_thread_pool_free (GThreadPool *pool, + gboolean immediate, + gboolean wait_) +{ + GRealThreadPool *real; + + real = (GRealThreadPool*) pool; + + g_return_if_fail (real); + g_return_if_fail (real->running); + + /* If there's no thread allowed here, there is not much sense in + * not stopping this pool immediately, when it's not empty + */ + g_return_if_fail (immediate || + real->max_threads != 0 || + g_async_queue_length (real->queue) == 0); + + g_async_queue_lock (real->queue); + + real->running = FALSE; + real->immediate = immediate; + real->waiting = wait_; + + if (wait_) + { + real->cond = g_cond_new (); + + while (g_async_queue_length_unlocked (real->queue) != -real->num_threads && + !(immediate && real->num_threads == 0)) + g_cond_wait (real->cond, _g_async_queue_get_mutex (real->queue)); + } + + if (immediate || g_async_queue_length_unlocked (real->queue) == -real->num_threads) + { + /* No thread is currently doing something (and nothing is left + * to process in the queue) + */ + if (real->num_threads == 0) + { + /* No threads left, we clean up */ + g_async_queue_unlock (real->queue); + g_thread_pool_free_internal (real); + return; + } + + g_thread_pool_wakeup_and_stop_all (real); + } + + /* The last thread should cleanup the pool */ + real->waiting = FALSE; + g_async_queue_unlock (real->queue); +} + +static void +g_thread_pool_free_internal (GRealThreadPool* pool) +{ + g_return_if_fail (pool); + g_return_if_fail (pool->running == FALSE); + g_return_if_fail (pool->num_threads == 0); + + g_async_queue_unref (pool->queue); + + if (pool->cond) + g_cond_free (pool->cond); + + g_free (pool); +} + +static void +g_thread_pool_wakeup_and_stop_all (GRealThreadPool* pool) +{ + guint i; + + g_return_if_fail (pool); + g_return_if_fail (pool->running == FALSE); + g_return_if_fail (pool->num_threads != 0); + + pool->immediate = TRUE; + + for (i = 0; i < pool->num_threads; i++) + g_thread_pool_queue_push_unlocked (pool, GUINT_TO_POINTER (1)); +} + +/** + * g_thread_pool_set_max_unused_threads: + * @max_threads: maximal number of unused threads + * + * Sets the maximal number of unused threads to @max_threads. If + * @max_threads is -1, no limit is imposed on the number of unused + * threads. + **/ +void +g_thread_pool_set_max_unused_threads (gint max_threads) +{ + g_return_if_fail (max_threads >= -1); + + g_atomic_int_set (&max_unused_threads, max_threads); + + if (max_threads != -1) + { + max_threads -= g_atomic_int_get (&unused_threads); + if (max_threads < 0) + { + g_atomic_int_set (&kill_unused_threads, -max_threads); + g_atomic_int_inc (&wakeup_thread_serial); + + g_async_queue_lock (unused_thread_queue); + + do + { + g_async_queue_push_unlocked (unused_thread_queue, + wakeup_thread_marker); + } + while (++max_threads); + + g_async_queue_unlock (unused_thread_queue); + } + } +} + +/** + * g_thread_pool_get_max_unused_threads: + * + * Returns the maximal allowed number of unused threads. + * + * Return value: the maximal number of unused threads + **/ +gint +g_thread_pool_get_max_unused_threads (void) +{ + return g_atomic_int_get (&max_unused_threads); +} + +/** + * g_thread_pool_get_num_unused_threads: + * + * Returns the number of currently unused threads. + * + * Return value: the number of currently unused threads + **/ +guint +g_thread_pool_get_num_unused_threads (void) +{ + return g_atomic_int_get (&unused_threads); +} + +/** + * g_thread_pool_stop_unused_threads: + * + * Stops all currently unused threads. This does not change the + * maximal number of unused threads. This function can be used to + * regularly stop all unused threads e.g. from g_timeout_add(). + **/ +void +g_thread_pool_stop_unused_threads (void) +{ + guint oldval; + + oldval = g_thread_pool_get_max_unused_threads (); + + g_thread_pool_set_max_unused_threads (0); + g_thread_pool_set_max_unused_threads (oldval); +} + +/** + * g_thread_pool_set_sort_function: + * @pool: a #GThreadPool + * @func: the #GCompareDataFunc used to sort the list of tasks. + * This function is passed two tasks. It should return + * 0 if the order in which they are handled does not matter, + * a negative value if the first task should be processed before + * the second or a positive value if the second task should be + * processed first. + * @user_data: user data passed to @func. + * + * Sets the function used to sort the list of tasks. This allows the + * tasks to be processed by a priority determined by @func, and not + * just in the order in which they were added to the pool. + * + * Note, if the maximum number of threads is more than 1, the order + * that threads are executed can not be guranteed 100%. Threads are + * scheduled by the operating system and are executed at random. It + * cannot be assumed that threads are executed in the order they are + * created. + * + * Since: 2.10 + **/ +void +g_thread_pool_set_sort_function (GThreadPool *pool, + GCompareDataFunc func, + gpointer user_data) +{ + GRealThreadPool *real; + + real = (GRealThreadPool*) pool; + + g_return_if_fail (real); + g_return_if_fail (real->running); + + g_async_queue_lock (real->queue); + + real->sort_func = func; + real->sort_user_data = user_data; + + if (func) + g_async_queue_sort_unlocked (real->queue, + real->sort_func, + real->sort_user_data); + + g_async_queue_unlock (real->queue); +} + +/** + * g_thread_pool_set_max_idle_time: + * @interval: the maximum @interval (1/1000ths of a second) a thread + * can be idle. + * + * This function will set the maximum @interval that a thread waiting + * in the pool for new tasks can be idle for before being + * stopped. This function is similar to calling + * g_thread_pool_stop_unused_threads() on a regular timeout, except, + * this is done on a per thread basis. + * + * By setting @interval to 0, idle threads will not be stopped. + * + * This function makes use of g_async_queue_timed_pop () using + * @interval. + * + * Since: 2.10 + **/ +void +g_thread_pool_set_max_idle_time (guint interval) +{ + guint i; + + g_atomic_int_set (&max_idle_time, interval); + + i = g_atomic_int_get (&unused_threads); + if (i > 0) + { + g_atomic_int_inc (&wakeup_thread_serial); + g_async_queue_lock (unused_thread_queue); + + do + { + g_async_queue_push_unlocked (unused_thread_queue, + wakeup_thread_marker); + } + while (--i); + + g_async_queue_unlock (unused_thread_queue); + } +} + +/** + * g_thread_pool_get_max_idle_time: + * + * This function will return the maximum @interval that a thread will + * wait in the thread pool for new tasks before being stopped. + * + * If this function returns 0, threads waiting in the thread pool for + * new work are not stopped. + * + * Return value: the maximum @interval to wait for new tasks in the + * thread pool before stopping the thread (1/1000ths of a second). + * + * Since: 2.10 + **/ +guint +g_thread_pool_get_max_idle_time (void) +{ + return g_atomic_int_get (&max_idle_time); +} + +#define __G_THREADPOOL_C__ +#include "galiasdef.c" diff --git a/glib/gthreadpool.h b/glib/gthreadpool.h new file mode 100644 index 0000000..d586424 --- /dev/null +++ b/glib/gthreadpool.h @@ -0,0 +1,114 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_THREADPOOL_H__ +#define __G_THREADPOOL_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GThreadPool GThreadPool; + +/* Thread Pools + */ + +/* The real GThreadPool is bigger, so you may only create a thread + * pool with the constructor function */ +struct _GThreadPool +{ + GFunc func; + gpointer user_data; + gboolean exclusive; +}; + +/* Get a thread pool with the function func, at most max_threads may + * run at a time (max_threads == -1 means no limit), exclusive == TRUE + * means, that the threads shouldn't be shared and that they will be + * prestarted (otherwise they are started as needed) user_data is the + * 2nd argument to the func */ +GThreadPool* g_thread_pool_new (GFunc func, + gpointer user_data, + gint max_threads, + gboolean exclusive, + GError **error); + +/* Push new data into the thread pool. This task is assigned to a thread later + * (when the maximal number of threads is reached for that pool) or now + * (otherwise). If necessary a new thread will be started. The function + * returns immediatly */ +void g_thread_pool_push (GThreadPool *pool, + gpointer data, + GError **error); + +/* Set the number of threads, which can run concurrently for that pool, -1 + * means no limit. 0 means has the effect, that the pool won't process + * requests until the limit is set higher again */ +void g_thread_pool_set_max_threads (GThreadPool *pool, + gint max_threads, + GError **error); +gint g_thread_pool_get_max_threads (GThreadPool *pool); + +/* Get the number of threads assigned to that pool. This number doesn't + * necessarily represent the number of working threads in that pool */ +guint g_thread_pool_get_num_threads (GThreadPool *pool); + +/* Get the number of unprocessed items in the pool */ +guint g_thread_pool_unprocessed (GThreadPool *pool); + +/* Free the pool, immediate means, that all unprocessed items in the queue + * wont be processed, wait means, that the function doesn't return immediatly, + * but after all threads in the pool are ready processing items. immediate + * does however not mean, that threads are killed. */ +void g_thread_pool_free (GThreadPool *pool, + gboolean immediate, + gboolean wait_); + +/* Set the maximal number of unused threads before threads will be stopped by + * GLib, -1 means no limit */ +void g_thread_pool_set_max_unused_threads (gint max_threads); +gint g_thread_pool_get_max_unused_threads (void); +guint g_thread_pool_get_num_unused_threads (void); + +/* Stop all currently unused threads, but leave the limit untouched */ +void g_thread_pool_stop_unused_threads (void); + +/* Set sort function for priority threading */ +void g_thread_pool_set_sort_function (GThreadPool *pool, + GCompareDataFunc func, + gpointer user_data); + +/* Set maximum time a thread can be idle in the pool before it is stopped */ +void g_thread_pool_set_max_idle_time (guint interval); +guint g_thread_pool_get_max_idle_time (void); + +G_END_DECLS + +#endif /* __G_THREADPOOL_H__ */ diff --git a/glib/gthreadprivate.h b/glib/gthreadprivate.h new file mode 100644 index 0000000..c75924c --- /dev/null +++ b/glib/gthreadprivate.h @@ -0,0 +1,69 @@ +/* GLIB - Library of useful routines for C programming + * + * gthreadprivate.h - GLib internal thread system related declarations. + * + * Copyright (C) 2003 Sebastian Wilhelmi + * + * The Gnome 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 of the + * License, or (at your option) any later version. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_THREADPRIVATE_H__ +#define __G_THREADPRIVATE_H__ + +G_BEGIN_DECLS + +/* System thread identifier comparision and assignment */ +#if GLIB_SIZEOF_SYSTEM_THREAD == SIZEOF_VOID_P +# define g_system_thread_equal_simple(thread1, thread2) \ + ((thread1).dummy_pointer == (thread2).dummy_pointer) +# define g_system_thread_assign(dest, src) \ + ((dest).dummy_pointer = (src).dummy_pointer) +#else /* GLIB_SIZEOF_SYSTEM_THREAD != SIZEOF_VOID_P */ +# define g_system_thread_equal_simple(thread1, thread2) \ + (memcmp (&(thread1), &(thread2), GLIB_SIZEOF_SYSTEM_THREAD) == 0) +# define g_system_thread_assign(dest, src) \ + (memcpy (&(dest), &(src), GLIB_SIZEOF_SYSTEM_THREAD)) +#endif /* GLIB_SIZEOF_SYSTEM_THREAD == SIZEOF_VOID_P */ + +#define g_system_thread_equal(thread1, thread2) \ + (g_thread_functions_for_glib_use.thread_equal ? \ + g_thread_functions_for_glib_use.thread_equal (&(thread1), &(thread2)) :\ + g_system_thread_equal_simple((thread1), (thread2))) + +/* Is called from gthread/gthread-impl.c */ +void g_thread_init_glib (void); + +/* base initializers, may only use g_mutex_new(), g_cond_new() */ +G_GNUC_INTERNAL void _g_mem_thread_init_noprivate_nomessage (void); +/* initializers that may also use g_private_new() */ +G_GNUC_INTERNAL void _g_slice_thread_init_nomessage (void); +G_GNUC_INTERNAL void _g_messages_thread_init_nomessage (void); + +/* full fledged initializers */ +G_GNUC_INTERNAL void _g_convert_thread_init (void); +G_GNUC_INTERNAL void _g_rand_thread_init (void); +G_GNUC_INTERNAL void _g_main_thread_init (void); +G_GNUC_INTERNAL void _g_atomic_thread_init (void); +G_GNUC_INTERNAL void _g_utils_thread_init (void); +G_GNUC_INTERNAL void _g_futex_thread_init (void); + +#ifdef G_OS_WIN32 +G_GNUC_INTERNAL void _g_win32_thread_init (void); +#endif /* G_OS_WIN32 */ + +G_END_DECLS + +#endif /* __G_THREADPRIVATE_H__ */ diff --git a/glib/gtimer.c b/glib/gtimer.c new file mode 100644 index 0000000..91f3f8a --- /dev/null +++ b/glib/gtimer.c @@ -0,0 +1,568 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" +#include "glibconfig.h" + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ + +#ifndef G_OS_WIN32 +#include +#include +#include +#endif /* G_OS_WIN32 */ + +#ifdef G_OS_WIN32 +#include +#endif /* G_OS_WIN32 */ + +#include "glib.h" +#include "gthread.h" +#include "galias.h" + +/** + * SECTION: timers + * @title: Timers + * @short_description: keep track of elapsed time + * + * #GTimer records a start time, and counts microseconds elapsed since + * that time. This is done somewhat differently on different platforms, + * and can be tricky to get exactly right, so #GTimer provides a + * portable/convenient interface. + * + * + * #GTimer uses a higher-quality clock when thread support is available. + * Therefore, calling g_thread_init() while timers are running may lead to + * unreliable results. It is best to call g_thread_init() before starting any + * timers, if you are using threads at all. + * + **/ + +#define G_NSEC_PER_SEC 1000000000 + +#define GETTIME(v) (v = g_thread_gettime ()) + +/** + * GTimer: + * + * Opaque datatype that records a start time. + **/ +struct _GTimer +{ + guint64 start; + guint64 end; + + guint active : 1; +}; + +/** + * g_timer_new: + * @Returns: a new #GTimer. + * + * Creates a new timer, and starts timing (i.e. g_timer_start() is + * implicitly called for you). + **/ +GTimer* +g_timer_new (void) +{ + GTimer *timer; + + timer = g_new (GTimer, 1); + timer->active = TRUE; + + GETTIME (timer->start); + + return timer; +} + +/** + * g_timer_destroy: + * @timer: a #GTimer to destroy. + * + * Destroys a timer, freeing associated resources. + **/ +void +g_timer_destroy (GTimer *timer) +{ + g_return_if_fail (timer != NULL); + + g_free (timer); +} + +/** + * g_timer_start: + * @timer: a #GTimer. + * + * Marks a start time, so that future calls to g_timer_elapsed() will + * report the time since g_timer_start() was called. g_timer_new() + * automatically marks the start time, so no need to call + * g_timer_start() immediately after creating the timer. + **/ +void +g_timer_start (GTimer *timer) +{ + g_return_if_fail (timer != NULL); + + timer->active = TRUE; + + GETTIME (timer->start); +} + +/** + * g_timer_stop: + * @timer: a #GTimer. + * + * Marks an end time, so calls to g_timer_elapsed() will return the + * difference between this end time and the start time. + **/ +void +g_timer_stop (GTimer *timer) +{ + g_return_if_fail (timer != NULL); + + timer->active = FALSE; + + GETTIME (timer->end); +} + +/** + * g_timer_reset: + * @timer: a #GTimer. + * + * This function is useless; it's fine to call g_timer_start() on an + * already-started timer to reset the start time, so g_timer_reset() + * serves no purpose. + **/ +void +g_timer_reset (GTimer *timer) +{ + g_return_if_fail (timer != NULL); + + GETTIME (timer->start); +} + +/** + * g_timer_continue: + * @timer: a #GTimer. + * + * Resumes a timer that has previously been stopped with + * g_timer_stop(). g_timer_stop() must be called before using this + * function. + * + * Since: 2.4 + **/ +void +g_timer_continue (GTimer *timer) +{ + guint64 elapsed; + + g_return_if_fail (timer != NULL); + g_return_if_fail (timer->active == FALSE); + + /* Get elapsed time and reset timer start time + * to the current time minus the previously + * elapsed interval. + */ + + elapsed = timer->end - timer->start; + + GETTIME (timer->start); + + timer->start -= elapsed; + + timer->active = TRUE; +} + +/** + * g_timer_elapsed: + * @timer: a #GTimer. + * @microseconds: return location for the fractional part of seconds + * elapsed, in microseconds (that is, the total number + * of microseconds elapsed, modulo 1000000), or %NULL + * @Returns: seconds elapsed as a floating point value, including any + * fractional part. + * + * If @timer has been started but not stopped, obtains the time since + * the timer was started. If @timer has been stopped, obtains the + * elapsed time between the time it was started and the time it was + * stopped. The return value is the number of seconds elapsed, + * including any fractional part. The @microseconds out parameter is + * essentially useless. + * + * + * Calling initialization functions, in particular g_thread_init(), while a + * timer is running will cause invalid return values from this function. + * + **/ +gdouble +g_timer_elapsed (GTimer *timer, + gulong *microseconds) +{ + gdouble total; + gint64 elapsed; + + g_return_val_if_fail (timer != NULL, 0); + + if (timer->active) + GETTIME (timer->end); + + elapsed = timer->end - timer->start; + + total = elapsed / 1e9; + + if (microseconds) + *microseconds = (elapsed / 1000) % 1000000; + + return total; +} + +void +g_usleep (gulong microseconds) +{ +#ifdef G_OS_WIN32 + Sleep (microseconds / 1000); +#else /* !G_OS_WIN32 */ +# ifdef HAVE_NANOSLEEP + struct timespec request, remaining; + request.tv_sec = microseconds / G_USEC_PER_SEC; + request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC); + while (nanosleep (&request, &remaining) == -1 && errno == EINTR) + request = remaining; +# else /* !HAVE_NANOSLEEP */ +# ifdef HAVE_NSLEEP + /* on AIX, nsleep is analogous to nanosleep */ + struct timespec request, remaining; + request.tv_sec = microseconds / G_USEC_PER_SEC; + request.tv_nsec = 1000 * (microseconds % G_USEC_PER_SEC); + while (nsleep (&request, &remaining) == -1 && errno == EINTR) + request = remaining; +# else /* !HAVE_NSLEEP */ + if (g_thread_supported ()) + { + static GStaticMutex mutex = G_STATIC_MUTEX_INIT; + static GCond* cond = NULL; + GTimeVal end_time; + + g_get_current_time (&end_time); + if (microseconds > G_MAXLONG) + { + microseconds -= G_MAXLONG; + g_time_val_add (&end_time, G_MAXLONG); + } + g_time_val_add (&end_time, microseconds); + + g_static_mutex_lock (&mutex); + + if (!cond) + cond = g_cond_new (); + + while (g_cond_timed_wait (cond, g_static_mutex_get_mutex (&mutex), + &end_time)) + /* do nothing */; + + g_static_mutex_unlock (&mutex); + } + else + { + struct timeval tv; + tv.tv_sec = microseconds / G_USEC_PER_SEC; + tv.tv_usec = microseconds % G_USEC_PER_SEC; + select(0, NULL, NULL, NULL, &tv); + } +# endif /* !HAVE_NSLEEP */ +# endif /* !HAVE_NANOSLEEP */ +#endif /* !G_OS_WIN32 */ +} + +/** + * g_time_val_add: + * @time_: a #GTimeVal + * @microseconds: number of microseconds to add to @time + * + * Adds the given number of microseconds to @time_. @microseconds can + * also be negative to decrease the value of @time_. + **/ +void +g_time_val_add (GTimeVal *time_, glong microseconds) +{ + g_return_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC); + + if (microseconds >= 0) + { + time_->tv_usec += microseconds % G_USEC_PER_SEC; + time_->tv_sec += microseconds / G_USEC_PER_SEC; + if (time_->tv_usec >= G_USEC_PER_SEC) + { + time_->tv_usec -= G_USEC_PER_SEC; + time_->tv_sec++; + } + } + else + { + microseconds *= -1; + time_->tv_usec -= microseconds % G_USEC_PER_SEC; + time_->tv_sec -= microseconds / G_USEC_PER_SEC; + if (time_->tv_usec < 0) + { + time_->tv_usec += G_USEC_PER_SEC; + time_->tv_sec--; + } + } +} + +/* converts a broken down date representation, relative to UTC, to + * a timestamp; it uses timegm() if it's available. + */ +static time_t +mktime_utc (struct tm *tm) +{ + time_t retval; + +#ifndef HAVE_TIMEGM + static const gint days_before[] = + { + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 + }; +#endif + +#ifndef HAVE_TIMEGM + if (tm->tm_mon < 0 || tm->tm_mon > 11) + return (time_t) -1; + + retval = (tm->tm_year - 70) * 365; + retval += (tm->tm_year - 68) / 4; + retval += days_before[tm->tm_mon] + tm->tm_mday - 1; + + if (tm->tm_year % 4 == 0 && tm->tm_mon < 2) + retval -= 1; + + retval = ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec; +#else + retval = timegm (tm); +#endif /* !HAVE_TIMEGM */ + + return retval; +} + +/** + * g_time_val_from_iso8601: + * @iso_date: an ISO 8601 encoded date string + * @time_: a #GTimeVal + * + * Converts a string containing an ISO 8601 encoded date and time + * to a #GTimeVal and puts it into @time_. + * + * Return value: %TRUE if the conversion was successful. + * + * Since: 2.12 + */ +gboolean +g_time_val_from_iso8601 (const gchar *iso_date, + GTimeVal *time_) +{ + struct tm tm = {0}; + long val; + + g_return_val_if_fail (iso_date != NULL, FALSE); + g_return_val_if_fail (time_ != NULL, FALSE); + + /* Ensure that the first character is a digit, + * the first digit of the date, otherwise we don't + * have an ISO 8601 date */ + while (g_ascii_isspace (*iso_date)) + iso_date++; + + if (*iso_date == '\0') + return FALSE; + + if (!g_ascii_isdigit (*iso_date) && *iso_date != '-' && *iso_date != '+') + return FALSE; + + val = strtoul (iso_date, (char **)&iso_date, 10); + if (*iso_date == '-') + { + /* YYYY-MM-DD */ + tm.tm_year = val - 1900; + iso_date++; + tm.tm_mon = strtoul (iso_date, (char **)&iso_date, 10) - 1; + + if (*iso_date++ != '-') + return FALSE; + + tm.tm_mday = strtoul (iso_date, (char **)&iso_date, 10); + } + else + { + /* YYYYMMDD */ + tm.tm_mday = val % 100; + tm.tm_mon = (val % 10000) / 100 - 1; + tm.tm_year = val / 10000 - 1900; + } + + if (*iso_date++ != 'T') + return FALSE; + + val = strtoul (iso_date, (char **)&iso_date, 10); + if (*iso_date == ':') + { + /* hh:mm:ss */ + tm.tm_hour = val; + iso_date++; + tm.tm_min = strtoul (iso_date, (char **)&iso_date, 10); + + if (*iso_date++ != ':') + return FALSE; + + tm.tm_sec = strtoul (iso_date, (char **)&iso_date, 10); + } + else + { + /* hhmmss */ + tm.tm_sec = val % 100; + tm.tm_min = (val % 10000) / 100; + tm.tm_hour = val / 10000; + } + + time_->tv_usec = 0; + + if (*iso_date == ',' || *iso_date == '.') + { + glong mul = 100000; + + while (g_ascii_isdigit (*++iso_date)) + { + time_->tv_usec += (*iso_date - '0') * mul; + mul /= 10; + } + } + + /* Now parse the offset and convert tm to a time_t */ + if (*iso_date == 'Z') + { + iso_date++; + time_->tv_sec = mktime_utc (&tm); + } + else if (*iso_date == '+' || *iso_date == '-') + { + gint sign = (*iso_date == '+') ? -1 : 1; + + val = strtoul (iso_date + 1, (char **)&iso_date, 10); + + if (*iso_date == ':') + val = 60 * val + strtoul (iso_date + 1, (char **)&iso_date, 10); + else + val = 60 * (val / 100) + (val % 100); + + time_->tv_sec = mktime_utc (&tm) + (time_t) (60 * val * sign); + } + else + { + /* No "Z" or offset, so local time */ + tm.tm_isdst = -1; /* locale selects DST */ + time_->tv_sec = mktime (&tm); + } + + while (g_ascii_isspace (*iso_date)) + iso_date++; + + return *iso_date == '\0'; +} + +/** + * g_time_val_to_iso8601: + * @time_: a #GTimeVal + * + * Converts @time_ into an ISO 8601 encoded string, relative to the + * Coordinated Universal Time (UTC). + * + * Return value: a newly allocated string containing an ISO 8601 date + * + * Since: 2.12 + */ +gchar * +g_time_val_to_iso8601 (GTimeVal *time_) +{ + gchar *retval; + struct tm *tm; +#ifdef HAVE_GMTIME_R + struct tm tm_; +#endif + time_t secs; + + g_return_val_if_fail (time_->tv_usec >= 0 && time_->tv_usec < G_USEC_PER_SEC, NULL); + + secs = time_->tv_sec; +#ifdef _WIN32 + tm = gmtime (&secs); +#else +#ifdef HAVE_GMTIME_R + tm = gmtime_r (&secs, &tm_); +#else + tm = gmtime (&secs); +#endif +#endif + + if (time_->tv_usec != 0) + { + /* ISO 8601 date and time format, with fractionary seconds: + * YYYY-MM-DDTHH:MM:SS.MMMMMMZ + */ + retval = g_strdup_printf ("%4d-%02d-%02dT%02d:%02d:%02d.%06ldZ", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + time_->tv_usec); + } + else + { + /* ISO 8601 date and time format: + * YYYY-MM-DDTHH:MM:SSZ + */ + retval = g_strdup_printf ("%4d-%02d-%02dT%02d:%02d:%02dZ", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec); + } + + return retval; +} + +#define __G_TIMER_C__ +#include "galiasdef.c" diff --git a/glib/gtimer.h b/glib/gtimer.h new file mode 100644 index 0000000..743eed1 --- /dev/null +++ b/glib/gtimer.h @@ -0,0 +1,65 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TIMER_H__ +#define __G_TIMER_H__ + +#include + +G_BEGIN_DECLS + +/* Timer + */ + +/* microseconds per second */ +typedef struct _GTimer GTimer; + +#define G_USEC_PER_SEC 1000000 + +GTimer* g_timer_new (void); +void g_timer_destroy (GTimer *timer); +void g_timer_start (GTimer *timer); +void g_timer_stop (GTimer *timer); +void g_timer_reset (GTimer *timer); +void g_timer_continue (GTimer *timer); +gdouble g_timer_elapsed (GTimer *timer, + gulong *microseconds); + +void g_usleep (gulong microseconds); + +void g_time_val_add (GTimeVal *time_, + glong microseconds); +gboolean g_time_val_from_iso8601 (const gchar *iso_date, + GTimeVal *time_); +gchar* g_time_val_to_iso8601 (GTimeVal *time_) G_GNUC_MALLOC; + +G_END_DECLS + +#endif /* __G_TIMER_H__ */ diff --git a/glib/gtree.c b/glib/gtree.c new file mode 100644 index 0000000..17bfb82 --- /dev/null +++ b/glib/gtree.c @@ -0,0 +1,1417 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "galias.h" + +/** + * SECTION: trees-binary + * @title: Balanced Binary Trees + * @short_description: a sorted collection of key/value pairs optimized + * for searching and traversing in order + * + * The #GTree structure and its associated functions provide a sorted + * collection of key/value pairs optimized for searching and traversing + * in order. + * + * To create a new #GTree use g_tree_new(). + * + * To insert a key/value pair into a #GTree use g_tree_insert(). + * + * To lookup the value corresponding to a given key, use + * g_tree_lookup() and g_tree_lookup_extended(). + * + * To find out the number of nodes in a #GTree, use g_tree_nnodes(). To + * get the height of a #GTree, use g_tree_height(). + * + * To traverse a #GTree, calling a function for each node visited in + * the traversal, use g_tree_foreach(). + * + * To remove a key/value pair use g_tree_remove(). + * + * To destroy a #GTree, use g_tree_destroy(). + **/ + +#undef G_TREE_DEBUG + +#define MAX_GTREE_HEIGHT 40 + +typedef struct _GTreeNode GTreeNode; + +/** + * GTree: + * + * The GTree struct is an opaque data + * structure representing a Balanced Binary Tree. It + * should be accessed only by using the following functions. + **/ +struct _GTree +{ + GTreeNode *root; + GCompareDataFunc key_compare; + GDestroyNotify key_destroy_func; + GDestroyNotify value_destroy_func; + gpointer key_compare_data; + guint nnodes; + gint ref_count; +}; + +struct _GTreeNode +{ + gpointer key; /* key for this node */ + gpointer value; /* value stored at this node */ + GTreeNode *left; /* left subtree */ + GTreeNode *right; /* right subtree */ + gint8 balance; /* height (left) - height (right) */ + guint8 left_child; + guint8 right_child; +}; + + +static GTreeNode* g_tree_node_new (gpointer key, + gpointer value); +static void g_tree_insert_internal (GTree *tree, + gpointer key, + gpointer value, + gboolean replace); +static gboolean g_tree_remove_internal (GTree *tree, + gconstpointer key, + gboolean steal); +static GTreeNode* g_tree_node_balance (GTreeNode *node); +static GTreeNode *g_tree_find_node (GTree *tree, + gconstpointer key); +static gint g_tree_node_pre_order (GTreeNode *node, + GTraverseFunc traverse_func, + gpointer data); +static gint g_tree_node_in_order (GTreeNode *node, + GTraverseFunc traverse_func, + gpointer data); +static gint g_tree_node_post_order (GTreeNode *node, + GTraverseFunc traverse_func, + gpointer data); +static gpointer g_tree_node_search (GTreeNode *node, + GCompareFunc search_func, + gconstpointer data); +static GTreeNode* g_tree_node_rotate_left (GTreeNode *node); +static GTreeNode* g_tree_node_rotate_right (GTreeNode *node); +#ifdef G_TREE_DEBUG +static void g_tree_node_check (GTreeNode *node); +#endif + + +static GTreeNode* +g_tree_node_new (gpointer key, + gpointer value) +{ + GTreeNode *node = g_slice_new (GTreeNode); + + node->balance = 0; + node->left = NULL; + node->right = NULL; + node->left_child = FALSE; + node->right_child = FALSE; + node->key = key; + node->value = value; + + return node; +} + +/** + * g_tree_new: + * @key_compare_func: the function used to order the nodes in the #GTree. + * It should return values similar to the standard strcmp() function - + * 0 if the two arguments are equal, a negative value if the first argument + * comes before the second, or a positive value if the first argument comes + * after the second. + * + * Creates a new #GTree. + * + * Return value: a new #GTree. + **/ +GTree* +g_tree_new (GCompareFunc key_compare_func) +{ + g_return_val_if_fail (key_compare_func != NULL, NULL); + + return g_tree_new_full ((GCompareDataFunc) key_compare_func, NULL, + NULL, NULL); +} + +/** + * g_tree_new_with_data: + * @key_compare_func: qsort()-style comparison function. + * @key_compare_data: data to pass to comparison function. + * + * Creates a new #GTree with a comparison function that accepts user data. + * See g_tree_new() for more details. + * + * Return value: a new #GTree. + **/ +GTree* +g_tree_new_with_data (GCompareDataFunc key_compare_func, + gpointer key_compare_data) +{ + g_return_val_if_fail (key_compare_func != NULL, NULL); + + return g_tree_new_full (key_compare_func, key_compare_data, + NULL, NULL); +} + +/** + * g_tree_new_full: + * @key_compare_func: qsort()-style comparison function. + * @key_compare_data: data to pass to comparison function. + * @key_destroy_func: a function to free the memory allocated for the key + * used when removing the entry from the #GTree or %NULL if you don't + * want to supply such a function. + * @value_destroy_func: a function to free the memory allocated for the + * value used when removing the entry from the #GTree or %NULL if you + * don't want to supply such a function. + * + * Creates a new #GTree like g_tree_new() and allows to specify functions + * to free the memory allocated for the key and value that get called when + * removing the entry from the #GTree. + * + * Return value: a new #GTree. + **/ +GTree* +g_tree_new_full (GCompareDataFunc key_compare_func, + gpointer key_compare_data, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func) +{ + GTree *tree; + + g_return_val_if_fail (key_compare_func != NULL, NULL); + + tree = g_slice_new (GTree); + tree->root = NULL; + tree->key_compare = key_compare_func; + tree->key_destroy_func = key_destroy_func; + tree->value_destroy_func = value_destroy_func; + tree->key_compare_data = key_compare_data; + tree->nnodes = 0; + tree->ref_count = 1; + + return tree; +} + +static inline GTreeNode * +g_tree_first_node (GTree *tree) +{ + GTreeNode *tmp; + + if (!tree->root) + return NULL; + + tmp = tree->root; + + while (tmp->left_child) + tmp = tmp->left; + + return tmp; +} + +static inline GTreeNode * +g_tree_node_previous (GTreeNode *node) +{ + GTreeNode *tmp; + + tmp = node->left; + + if (node->left_child) + while (tmp->right_child) + tmp = tmp->right; + + return tmp; +} + +static inline GTreeNode * +g_tree_node_next (GTreeNode *node) +{ + GTreeNode *tmp; + + tmp = node->right; + + if (node->right_child) + while (tmp->left_child) + tmp = tmp->left; + + return tmp; +} + +static void +g_tree_remove_all (GTree *tree) +{ + GTreeNode *node; + GTreeNode *next; + + g_return_if_fail (tree != NULL); + + node = g_tree_first_node (tree); + + while (node) + { + next = g_tree_node_next (node); + + if (tree->key_destroy_func) + tree->key_destroy_func (node->key); + if (tree->value_destroy_func) + tree->value_destroy_func (node->value); + g_slice_free (GTreeNode, node); + + node = next; + } + + tree->root = NULL; + tree->nnodes = 0; +} + +/** + * g_tree_ref: + * @tree: a #GTree. + * + * Increments the reference count of @tree by one. It is safe to call + * this function from any thread. + * + * Return value: the passed in #GTree. + * + * Since: 2.22 + **/ +GTree * +g_tree_ref (GTree *tree) +{ + g_return_val_if_fail (tree != NULL, NULL); + + g_atomic_int_inc (&tree->ref_count); + + return tree; +} + +/** + * g_tree_unref: + * @tree: a #GTree. + * + * Decrements the reference count of @tree by one. If the reference count + * drops to 0, all keys and values will be destroyed (if destroy + * functions were specified) and all memory allocated by @tree will be + * released. + * + * It is safe to call this function from any thread. + * + * Since: 2.22 + **/ +void +g_tree_unref (GTree *tree) +{ + g_return_if_fail (tree != NULL); + + if (g_atomic_int_dec_and_test (&tree->ref_count)) + { + g_tree_remove_all (tree); + g_slice_free (GTree, tree); + } +} + +/** + * g_tree_destroy: + * @tree: a #GTree. + * + * Removes all keys and values from the #GTree and decreases its + * reference count by one. If keys and/or values are dynamically + * allocated, you should either free them first or create the #GTree + * using g_tree_new_full(). In the latter case the destroy functions + * you supplied will be called on all keys and values before destroying + * the #GTree. + **/ +void +g_tree_destroy (GTree *tree) +{ + g_return_if_fail (tree != NULL); + + g_tree_remove_all (tree); + g_tree_unref (tree); +} + +/** + * g_tree_insert: + * @tree: a #GTree. + * @key: the key to insert. + * @value: the value corresponding to the key. + * + * Inserts a key/value pair into a #GTree. If the given key already exists + * in the #GTree its corresponding value is set to the new value. If you + * supplied a value_destroy_func when creating the #GTree, the old value is + * freed using that function. If you supplied a @key_destroy_func when + * creating the #GTree, the passed key is freed using that function. + * + * The tree is automatically 'balanced' as new key/value pairs are added, + * so that the distance from the root to every leaf is as small as possible. + **/ +void +g_tree_insert (GTree *tree, + gpointer key, + gpointer value) +{ + g_return_if_fail (tree != NULL); + + g_tree_insert_internal (tree, key, value, FALSE); + +#ifdef G_TREE_DEBUG + g_tree_node_check (tree->root); +#endif +} + +/** + * g_tree_replace: + * @tree: a #GTree. + * @key: the key to insert. + * @value: the value corresponding to the key. + * + * Inserts a new key and value into a #GTree similar to g_tree_insert(). + * The difference is that if the key already exists in the #GTree, it gets + * replaced by the new key. If you supplied a @value_destroy_func when + * creating the #GTree, the old value is freed using that function. If you + * supplied a @key_destroy_func when creating the #GTree, the old key is + * freed using that function. + * + * The tree is automatically 'balanced' as new key/value pairs are added, + * so that the distance from the root to every leaf is as small as possible. + **/ +void +g_tree_replace (GTree *tree, + gpointer key, + gpointer value) +{ + g_return_if_fail (tree != NULL); + + g_tree_insert_internal (tree, key, value, TRUE); + +#ifdef G_TREE_DEBUG + g_tree_node_check (tree->root); +#endif +} + +/* internal insert routine */ +static void +g_tree_insert_internal (GTree *tree, + gpointer key, + gpointer value, + gboolean replace) +{ + GTreeNode *node; + GTreeNode *path[MAX_GTREE_HEIGHT]; + int idx; + + g_return_if_fail (tree != NULL); + + if (!tree->root) + { + tree->root = g_tree_node_new (key, value); + tree->nnodes++; + return; + } + + idx = 0; + path[idx++] = NULL; + node = tree->root; + + while (1) + { + int cmp = tree->key_compare (key, node->key, tree->key_compare_data); + + if (cmp == 0) + { + if (tree->value_destroy_func) + tree->value_destroy_func (node->value); + + node->value = value; + + if (replace) + { + if (tree->key_destroy_func) + tree->key_destroy_func (node->key); + + node->key = key; + } + else + { + /* free the passed key */ + if (tree->key_destroy_func) + tree->key_destroy_func (key); + } + + return; + } + else if (cmp < 0) + { + if (node->left_child) + { + path[idx++] = node; + node = node->left; + } + else + { + GTreeNode *child = g_tree_node_new (key, value); + + child->left = node->left; + child->right = node; + node->left = child; + node->left_child = TRUE; + node->balance -= 1; + + tree->nnodes++; + + break; + } + } + else + { + if (node->right_child) + { + path[idx++] = node; + node = node->right; + } + else + { + GTreeNode *child = g_tree_node_new (key, value); + + child->right = node->right; + child->left = node; + node->right = child; + node->right_child = TRUE; + node->balance += 1; + + tree->nnodes++; + + break; + } + } + } + + /* restore balance. This is the goodness of a non-recursive + implementation, when we are done with balancing we 'break' + the loop and we are done. */ + while (1) + { + GTreeNode *bparent = path[--idx]; + gboolean left_node = (bparent && node == bparent->left); + g_assert (!bparent || bparent->left == node || bparent->right == node); + + if (node->balance < -1 || node->balance > 1) + { + node = g_tree_node_balance (node); + if (bparent == NULL) + tree->root = node; + else if (left_node) + bparent->left = node; + else + bparent->right = node; + } + + if (node->balance == 0 || bparent == NULL) + break; + + if (left_node) + bparent->balance -= 1; + else + bparent->balance += 1; + + node = bparent; + } +} + +/** + * g_tree_remove: + * @tree: a #GTree. + * @key: the key to remove. + * + * Removes a key/value pair from a #GTree. + * + * If the #GTree was created using g_tree_new_full(), the key and value + * are freed using the supplied destroy functions, otherwise you have to + * make sure that any dynamically allocated values are freed yourself. + * If the key does not exist in the #GTree, the function does nothing. + * + * Returns: %TRUE if the key was found (prior to 2.8, this function returned + * nothing) + **/ +gboolean +g_tree_remove (GTree *tree, + gconstpointer key) +{ + gboolean removed; + + g_return_val_if_fail (tree != NULL, FALSE); + + removed = g_tree_remove_internal (tree, key, FALSE); + +#ifdef G_TREE_DEBUG + g_tree_node_check (tree->root); +#endif + + return removed; +} + +/** + * g_tree_steal: + * @tree: a #GTree. + * @key: the key to remove. + * + * Removes a key and its associated value from a #GTree without calling + * the key and value destroy functions. + * + * If the key does not exist in the #GTree, the function does nothing. + * + * Returns: %TRUE if the key was found (prior to 2.8, this function returned + * nothing) + **/ +gboolean +g_tree_steal (GTree *tree, + gconstpointer key) +{ + gboolean removed; + + g_return_val_if_fail (tree != NULL, FALSE); + + removed = g_tree_remove_internal (tree, key, TRUE); + +#ifdef G_TREE_DEBUG + g_tree_node_check (tree->root); +#endif + + return removed; +} + +/* internal remove routine */ +static gboolean +g_tree_remove_internal (GTree *tree, + gconstpointer key, + gboolean steal) +{ + GTreeNode *node, *parent, *balance; + GTreeNode *path[MAX_GTREE_HEIGHT]; + int idx; + gboolean left_node; + + g_return_val_if_fail (tree != NULL, FALSE); + + if (!tree->root) + return FALSE; + + idx = 0; + path[idx++] = NULL; + node = tree->root; + + while (1) + { + int cmp = tree->key_compare (key, node->key, tree->key_compare_data); + + if (cmp == 0) + break; + else if (cmp < 0) + { + if (!node->left_child) + return FALSE; + + path[idx++] = node; + node = node->left; + } + else + { + if (!node->right_child) + return FALSE; + + path[idx++] = node; + node = node->right; + } + } + + /* the following code is almost equal to g_tree_remove_node, + except that we do not have to call g_tree_node_parent. */ + balance = parent = path[--idx]; + g_assert (!parent || parent->left == node || parent->right == node); + left_node = (parent && node == parent->left); + + if (!node->left_child) + { + if (!node->right_child) + { + if (!parent) + tree->root = NULL; + else if (left_node) + { + parent->left_child = FALSE; + parent->left = node->left; + parent->balance += 1; + } + else + { + parent->right_child = FALSE; + parent->right = node->right; + parent->balance -= 1; + } + } + else /* node has a right child */ + { + GTreeNode *tmp = g_tree_node_next (node); + tmp->left = node->left; + + if (!parent) + tree->root = node->right; + else if (left_node) + { + parent->left = node->right; + parent->balance += 1; + } + else + { + parent->right = node->right; + parent->balance -= 1; + } + } + } + else /* node has a left child */ + { + if (!node->right_child) + { + GTreeNode *tmp = g_tree_node_previous (node); + tmp->right = node->right; + + if (parent == NULL) + tree->root = node->left; + else if (left_node) + { + parent->left = node->left; + parent->balance += 1; + } + else + { + parent->right = node->left; + parent->balance -= 1; + } + } + else /* node has a both children (pant, pant!) */ + { + GTreeNode *prev = node->left; + GTreeNode *next = node->right; + GTreeNode *nextp = node; + int old_idx = idx + 1; + idx++; + + /* path[idx] == parent */ + /* find the immediately next node (and its parent) */ + while (next->left_child) + { + path[++idx] = nextp = next; + next = next->left; + } + + path[old_idx] = next; + balance = path[idx]; + + /* remove 'next' from the tree */ + if (nextp != node) + { + if (next->right_child) + nextp->left = next->right; + else + nextp->left_child = FALSE; + nextp->balance += 1; + + next->right_child = TRUE; + next->right = node->right; + } + else + node->balance -= 1; + + /* set the prev to point to the right place */ + while (prev->right_child) + prev = prev->right; + prev->right = next; + + /* prepare 'next' to replace 'node' */ + next->left_child = TRUE; + next->left = node->left; + next->balance = node->balance; + + if (!parent) + tree->root = next; + else if (left_node) + parent->left = next; + else + parent->right = next; + } + } + + /* restore balance */ + if (balance) + while (1) + { + GTreeNode *bparent = path[--idx]; + g_assert (!bparent || bparent->left == balance || bparent->right == balance); + left_node = (bparent && balance == bparent->left); + + if(balance->balance < -1 || balance->balance > 1) + { + balance = g_tree_node_balance (balance); + if (!bparent) + tree->root = balance; + else if (left_node) + bparent->left = balance; + else + bparent->right = balance; + } + + if (balance->balance != 0 || !bparent) + break; + + if (left_node) + bparent->balance += 1; + else + bparent->balance -= 1; + + balance = bparent; + } + + if (!steal) + { + if (tree->key_destroy_func) + tree->key_destroy_func (node->key); + if (tree->value_destroy_func) + tree->value_destroy_func (node->value); + } + + g_slice_free (GTreeNode, node); + + tree->nnodes--; + + return TRUE; +} + +/** + * g_tree_lookup: + * @tree: a #GTree. + * @key: the key to look up. + * + * Gets the value corresponding to the given key. Since a #GTree is + * automatically balanced as key/value pairs are added, key lookup is very + * fast. + * + * Return value: the value corresponding to the key, or %NULL if the key was + * not found. + **/ +gpointer +g_tree_lookup (GTree *tree, + gconstpointer key) +{ + GTreeNode *node; + + g_return_val_if_fail (tree != NULL, NULL); + + node = g_tree_find_node (tree, key); + + return node ? node->value : NULL; +} + +/** + * g_tree_lookup_extended: + * @tree: a #GTree. + * @lookup_key: the key to look up. + * @orig_key: returns the original key. + * @value: returns the value associated with the key. + * + * Looks up a key in the #GTree, returning the original key and the + * associated value and a #gboolean which is %TRUE if the key was found. This + * is useful if you need to free the memory allocated for the original key, + * for example before calling g_tree_remove(). + * + * Return value: %TRUE if the key was found in the #GTree. + **/ +gboolean +g_tree_lookup_extended (GTree *tree, + gconstpointer lookup_key, + gpointer *orig_key, + gpointer *value) +{ + GTreeNode *node; + + g_return_val_if_fail (tree != NULL, FALSE); + + node = g_tree_find_node (tree, lookup_key); + + if (node) + { + if (orig_key) + *orig_key = node->key; + if (value) + *value = node->value; + return TRUE; + } + else + return FALSE; +} + +/** + * g_tree_foreach: + * @tree: a #GTree. + * @func: the function to call for each node visited. If this function + * returns %TRUE, the traversal is stopped. + * @user_data: user data to pass to the function. + * + * Calls the given function for each of the key/value pairs in the #GTree. + * The function is passed the key and value of each pair, and the given + * @data parameter. The tree is traversed in sorted order. + * + * The tree may not be modified while iterating over it (you can't + * add/remove items). To remove all items matching a predicate, you need + * to add each item to a list in your #GTraverseFunc as you walk over + * the tree, then walk the list and remove each item. + **/ +void +g_tree_foreach (GTree *tree, + GTraverseFunc func, + gpointer user_data) +{ + GTreeNode *node; + + g_return_if_fail (tree != NULL); + + if (!tree->root) + return; + + node = g_tree_first_node (tree); + + while (node) + { + if ((*func) (node->key, node->value, user_data)) + break; + + node = g_tree_node_next (node); + } +} + +/** + * g_tree_traverse: + * @tree: a #GTree. + * @traverse_func: the function to call for each node visited. If this + * function returns %TRUE, the traversal is stopped. + * @traverse_type: the order in which nodes are visited, one of %G_IN_ORDER, + * %G_PRE_ORDER and %G_POST_ORDER. + * @user_data: user data to pass to the function. + * + * Calls the given function for each node in the #GTree. + * + * Deprecated:2.2: The order of a balanced tree is somewhat arbitrary. If you + * just want to visit all nodes in sorted order, use g_tree_foreach() + * instead. If you really need to visit nodes in a different order, consider + * using an N-ary Tree. + **/ +/** + * GTraverseFunc: + * @key: a key of a #GTree node. + * @value: the value corresponding to the key. + * @data: user data passed to g_tree_traverse(). + * @Returns: %TRUE to stop the traversal. + * + * Specifies the type of function passed to g_tree_traverse(). It is + * passed the key and value of each node, together with the @user_data + * parameter passed to g_tree_traverse(). If the function returns + * %TRUE, the traversal is stopped. + **/ +/** + * GTraverseType: + * @G_IN_ORDER: vists a node's left child first, then the node itself, + * then its right child. This is the one to use if you + * want the output sorted according to the compare + * function. + * @G_PRE_ORDER: visits a node, then its children. + * @G_POST_ORDER: visits the node's children, then the node itself. + * @G_LEVEL_ORDER: is not implemented for Balanced Binary + * Trees. For N-ary Trees, it + * vists the root node first, then its children, then + * its grandchildren, and so on. Note that this is less + * efficient than the other orders. + * + * Specifies the type of traveral performed by g_tree_traverse(), + * g_node_traverse() and g_node_find(). + **/ +void +g_tree_traverse (GTree *tree, + GTraverseFunc traverse_func, + GTraverseType traverse_type, + gpointer user_data) +{ + g_return_if_fail (tree != NULL); + + if (!tree->root) + return; + + switch (traverse_type) + { + case G_PRE_ORDER: + g_tree_node_pre_order (tree->root, traverse_func, user_data); + break; + + case G_IN_ORDER: + g_tree_node_in_order (tree->root, traverse_func, user_data); + break; + + case G_POST_ORDER: + g_tree_node_post_order (tree->root, traverse_func, user_data); + break; + + case G_LEVEL_ORDER: + g_warning ("g_tree_traverse(): traverse type G_LEVEL_ORDER isn't implemented."); + break; + } +} + +/** + * g_tree_search: + * @tree: a #GTree. + * @search_func: a function used to search the #GTree. + * @user_data: the data passed as the second argument to the @search_func + * function. + * + * Searches a #GTree using @search_func. + * + * The @search_func is called with a pointer to the key of a key/value pair in + * the tree, and the passed in @user_data. If @search_func returns 0 for a + * key/value pair, then g_tree_search_func() will return the value of that + * pair. If @search_func returns -1, searching will proceed among the + * key/value pairs that have a smaller key; if @search_func returns 1, + * searching will proceed among the key/value pairs that have a larger key. + * + * Return value: the value corresponding to the found key, or %NULL if the key + * was not found. + **/ +gpointer +g_tree_search (GTree *tree, + GCompareFunc search_func, + gconstpointer user_data) +{ + g_return_val_if_fail (tree != NULL, NULL); + + if (tree->root) + return g_tree_node_search (tree->root, search_func, user_data); + else + return NULL; +} + +/** + * g_tree_height: + * @tree: a #GTree. + * + * Gets the height of a #GTree. + * + * If the #GTree contains no nodes, the height is 0. + * If the #GTree contains only one root node the height is 1. + * If the root node has children the height is 2, etc. + * + * Return value: the height of the #GTree. + **/ +gint +g_tree_height (GTree *tree) +{ + GTreeNode *node; + gint height; + + g_return_val_if_fail (tree != NULL, 0); + + if (!tree->root) + return 0; + + height = 0; + node = tree->root; + + while (1) + { + height += 1 + MAX(node->balance, 0); + + if (!node->left_child) + return height; + + node = node->left; + } +} + +/** + * g_tree_nnodes: + * @tree: a #GTree. + * + * Gets the number of nodes in a #GTree. + * + * Return value: the number of nodes in the #GTree. + **/ +gint +g_tree_nnodes (GTree *tree) +{ + g_return_val_if_fail (tree != NULL, 0); + + return tree->nnodes; +} + +static GTreeNode* +g_tree_node_balance (GTreeNode *node) +{ + if (node->balance < -1) + { + if (node->left->balance > 0) + node->left = g_tree_node_rotate_left (node->left); + node = g_tree_node_rotate_right (node); + } + else if (node->balance > 1) + { + if (node->right->balance < 0) + node->right = g_tree_node_rotate_right (node->right); + node = g_tree_node_rotate_left (node); + } + + return node; +} + +static GTreeNode * +g_tree_find_node (GTree *tree, + gconstpointer key) +{ + GTreeNode *node; + gint cmp; + + node = tree->root; + if (!node) + return NULL; + + while (1) + { + cmp = tree->key_compare (key, node->key, tree->key_compare_data); + if (cmp == 0) + return node; + else if (cmp < 0) + { + if (!node->left_child) + return NULL; + + node = node->left; + } + else + { + if (!node->right_child) + return NULL; + + node = node->right; + } + } +} + +static gint +g_tree_node_pre_order (GTreeNode *node, + GTraverseFunc traverse_func, + gpointer data) +{ + if ((*traverse_func) (node->key, node->value, data)) + return TRUE; + + if (node->left_child) + { + if (g_tree_node_pre_order (node->left, traverse_func, data)) + return TRUE; + } + + if (node->right_child) + { + if (g_tree_node_pre_order (node->right, traverse_func, data)) + return TRUE; + } + + return FALSE; +} + +static gint +g_tree_node_in_order (GTreeNode *node, + GTraverseFunc traverse_func, + gpointer data) +{ + if (node->left_child) + { + if (g_tree_node_in_order (node->left, traverse_func, data)) + return TRUE; + } + + if ((*traverse_func) (node->key, node->value, data)) + return TRUE; + + if (node->right_child) + { + if (g_tree_node_in_order (node->right, traverse_func, data)) + return TRUE; + } + + return FALSE; +} + +static gint +g_tree_node_post_order (GTreeNode *node, + GTraverseFunc traverse_func, + gpointer data) +{ + if (node->left_child) + { + if (g_tree_node_post_order (node->left, traverse_func, data)) + return TRUE; + } + + if (node->right_child) + { + if (g_tree_node_post_order (node->right, traverse_func, data)) + return TRUE; + } + + if ((*traverse_func) (node->key, node->value, data)) + return TRUE; + + return FALSE; +} + +static gpointer +g_tree_node_search (GTreeNode *node, + GCompareFunc search_func, + gconstpointer data) +{ + gint dir; + + if (!node) + return NULL; + + while (1) + { + dir = (* search_func) (node->key, data); + if (dir == 0) + return node->value; + else if (dir < 0) + { + if (!node->left_child) + return NULL; + + node = node->left; + } + else + { + if (!node->right_child) + return NULL; + + node = node->right; + } + } +} + +static GTreeNode* +g_tree_node_rotate_left (GTreeNode *node) +{ + GTreeNode *right; + gint a_bal; + gint b_bal; + + right = node->right; + + if (right->left_child) + node->right = right->left; + else + { + node->right_child = FALSE; + node->right = right; + right->left_child = TRUE; + } + right->left = node; + + a_bal = node->balance; + b_bal = right->balance; + + if (b_bal <= 0) + { + if (a_bal >= 1) + right->balance = b_bal - 1; + else + right->balance = a_bal + b_bal - 2; + node->balance = a_bal - 1; + } + else + { + if (a_bal <= b_bal) + right->balance = a_bal - 2; + else + right->balance = b_bal - 1; + node->balance = a_bal - b_bal - 1; + } + + return right; +} + +static GTreeNode* +g_tree_node_rotate_right (GTreeNode *node) +{ + GTreeNode *left; + gint a_bal; + gint b_bal; + + left = node->left; + + if (left->right_child) + node->left = left->right; + else + { + node->left_child = FALSE; + node->left = left; + left->right_child = TRUE; + } + left->right = node; + + a_bal = node->balance; + b_bal = left->balance; + + if (b_bal <= 0) + { + if (b_bal > a_bal) + left->balance = b_bal + 1; + else + left->balance = a_bal + 2; + node->balance = a_bal - b_bal + 1; + } + else + { + if (a_bal <= -1) + left->balance = b_bal + 1; + else + left->balance = a_bal + b_bal + 2; + node->balance = a_bal + 1; + } + + return left; +} + +#ifdef G_TREE_DEBUG +static gint +g_tree_node_height (GTreeNode *node) +{ + gint left_height; + gint right_height; + + if (node) + { + left_height = 0; + right_height = 0; + + if (node->left_child) + left_height = g_tree_node_height (node->left); + + if (node->right_child) + right_height = g_tree_node_height (node->right); + + return MAX (left_height, right_height) + 1; + } + + return 0; +} + +static void +g_tree_node_check (GTreeNode *node) +{ + gint left_height; + gint right_height; + gint balance; + GTreeNode *tmp; + + if (node) + { + if (node->left_child) + { + tmp = g_tree_node_previous (node); + g_assert (tmp->right == node); + } + + if (node->right_child) + { + tmp = g_tree_node_next (node); + g_assert (tmp->left == node); + } + + left_height = 0; + right_height = 0; + + if (node->left_child) + left_height = g_tree_node_height (node->left); + if (node->right_child) + right_height = g_tree_node_height (node->right); + + balance = right_height - left_height; + g_assert (balance == node->balance); + + if (node->left_child) + g_tree_node_check (node->left); + if (node->right_child) + g_tree_node_check (node->right); + } +} + +static void +g_tree_node_dump (GTreeNode *node, + gint indent) +{ + g_print ("%*s%c\n", indent, "", *(char *)node->key); + + if (node->left_child) + g_tree_node_dump (node->left, indent + 2); + else if (node->left) + g_print ("%*s<%c\n", indent + 2, "", *(char *)node->left->key); + + if (node->right_child) + g_tree_node_dump (node->right, indent + 2); + else if (node->right) + g_print ("%*s>%c\n", indent + 2, "", *(char *)node->right->key); +} + + +void +g_tree_dump (GTree *tree) +{ + if (tree->root) + g_tree_node_dump (tree->root, 0); +} +#endif + + +#define __G_TREE_C__ +#include "galiasdef.c" + diff --git a/glib/gtree.h b/glib/gtree.h new file mode 100644 index 0000000..db06ba3 --- /dev/null +++ b/glib/gtree.h @@ -0,0 +1,91 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TREE_H__ +#define __G_TREE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GTree GTree; + +typedef gboolean (*GTraverseFunc) (gpointer key, + gpointer value, + gpointer data); + +/* Balanced binary trees + */ +GTree* g_tree_new (GCompareFunc key_compare_func); +GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func, + gpointer key_compare_data); +GTree* g_tree_new_full (GCompareDataFunc key_compare_func, + gpointer key_compare_data, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func); +GTree* g_tree_ref (GTree *tree); +void g_tree_unref (GTree *tree); +void g_tree_destroy (GTree *tree); +void g_tree_insert (GTree *tree, + gpointer key, + gpointer value); +void g_tree_replace (GTree *tree, + gpointer key, + gpointer value); +gboolean g_tree_remove (GTree *tree, + gconstpointer key); +gboolean g_tree_steal (GTree *tree, + gconstpointer key); +gpointer g_tree_lookup (GTree *tree, + gconstpointer key); +gboolean g_tree_lookup_extended (GTree *tree, + gconstpointer lookup_key, + gpointer *orig_key, + gpointer *value); +void g_tree_foreach (GTree *tree, + GTraverseFunc func, + gpointer user_data); + +#ifndef G_DISABLE_DEPRECATED +void g_tree_traverse (GTree *tree, + GTraverseFunc traverse_func, + GTraverseType traverse_type, + gpointer user_data); +#endif /* G_DISABLE_DEPRECATED */ + +gpointer g_tree_search (GTree *tree, + GCompareFunc search_func, + gconstpointer user_data); +gint g_tree_height (GTree *tree); +gint g_tree_nnodes (GTree *tree); + +G_END_DECLS + +#endif /* __G_TREE_H__ */ diff --git a/glib/gtypes.h b/glib/gtypes.h new file mode 100644 index 0000000..e616f99 --- /dev/null +++ b/glib/gtypes.h @@ -0,0 +1,451 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TYPES_H__ +#define __G_TYPES_H__ + +#include +#include + +G_BEGIN_DECLS + +/* Provide type definitions for commonly used types. + * These are useful because a "gint8" can be adjusted + * to be 1 byte (8 bits) on all platforms. Similarly and + * more importantly, "gint32" can be adjusted to be + * 4 bytes (32 bits) on all platforms. + */ + +typedef char gchar; +typedef short gshort; +typedef long glong; +typedef int gint; +typedef gint gboolean; + +typedef unsigned char guchar; +typedef unsigned short gushort; +typedef unsigned long gulong; +typedef unsigned int guint; + +typedef float gfloat; +typedef double gdouble; + +/* Define min and max constants for the fixed size numerical types */ +#define G_MININT8 ((gint8) 0x80) +#define G_MAXINT8 ((gint8) 0x7f) +#define G_MAXUINT8 ((guint8) 0xff) + +#define G_MININT16 ((gint16) 0x8000) +#define G_MAXINT16 ((gint16) 0x7fff) +#define G_MAXUINT16 ((guint16) 0xffff) + +#define G_MININT32 ((gint32) 0x80000000) +#define G_MAXINT32 ((gint32) 0x7fffffff) +#define G_MAXUINT32 ((guint32) 0xffffffff) + +#define G_MININT64 ((gint64) G_GINT64_CONSTANT(0x8000000000000000)) +#define G_MAXINT64 G_GINT64_CONSTANT(0x7fffffffffffffff) +#define G_MAXUINT64 G_GINT64_CONSTANT(0xffffffffffffffffU) + +typedef void* gpointer; +typedef const void *gconstpointer; + +typedef gint (*GCompareFunc) (gconstpointer a, + gconstpointer b); +typedef gint (*GCompareDataFunc) (gconstpointer a, + gconstpointer b, + gpointer user_data); +typedef gboolean (*GEqualFunc) (gconstpointer a, + gconstpointer b); +typedef void (*GDestroyNotify) (gpointer data); +typedef void (*GFunc) (gpointer data, + gpointer user_data); +typedef guint (*GHashFunc) (gconstpointer key); +typedef void (*GHFunc) (gpointer key, + gpointer value, + gpointer user_data); +typedef void (*GFreeFunc) (gpointer data); + +/** + * GTranslateFunc: + * @str: the untranslated string + * @data: user data specified when installing the function, e.g. + * in g_option_group_set_translate_func() + * + * The type of functions which are used to translate user-visible + * strings, for output. + * + * Returns: a translation of the string for the current locale. + * The returned string is owned by GLib and must not be freed. + */ +typedef const gchar * (*GTranslateFunc) (const gchar *str, + gpointer data); + + +/* Define some mathematical constants that aren't available + * symbolically in some strict ISO C implementations. + * + * Note that the large number of digits used in these definitions + * doesn't imply that GLib or current computers in general would be + * able to handle floating point numbers with an accuracy like this. + * It's mostly an exercise in futility and future proofing. For + * extended precision floating point support, look somewhere else + * than GLib. + */ +#define G_E 2.7182818284590452353602874713526624977572470937000 +#define G_LN2 0.69314718055994530941723212145817656807550013436026 +#define G_LN10 2.3025850929940456840179914546843642076011014886288 +#define G_PI 3.1415926535897932384626433832795028841971693993751 +#define G_PI_2 1.5707963267948966192313216916397514420985846996876 +#define G_PI_4 0.78539816339744830961566084581987572104929234984378 +#define G_SQRT2 1.4142135623730950488016887242096980785696718753769 + +/* Portable endian checks and conversions + * + * glibconfig.h defines G_BYTE_ORDER which expands to one of + * the below macros. + */ +#define G_LITTLE_ENDIAN 1234 +#define G_BIG_ENDIAN 4321 +#define G_PDP_ENDIAN 3412 /* unused, need specific PDP check */ + + +/* Basic bit swapping functions + */ +#define GUINT16_SWAP_LE_BE_CONSTANT(val) ((guint16) ( \ + (guint16) ((guint16) (val) >> 8) | \ + (guint16) ((guint16) (val) << 8))) + +#define GUINT32_SWAP_LE_BE_CONSTANT(val) ((guint32) ( \ + (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \ + (((guint32) (val) & (guint32) 0x0000ff00U) << 8) | \ + (((guint32) (val) & (guint32) 0x00ff0000U) >> 8) | \ + (((guint32) (val) & (guint32) 0xff000000U) >> 24))) + +#define GUINT64_SWAP_LE_BE_CONSTANT(val) ((guint64) ( \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x00000000000000ffU)) << 56) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x000000000000ff00U)) << 40) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x0000000000ff0000U)) << 24) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x00000000ff000000U)) << 8) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x000000ff00000000U)) >> 8) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x0000ff0000000000U)) >> 24) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0x00ff000000000000U)) >> 40) | \ + (((guint64) (val) & \ + (guint64) G_GINT64_CONSTANT (0xff00000000000000U)) >> 56))) + +/* Arch specific stuff for speed + */ +#if defined (__GNUC__) && (__GNUC__ >= 2) && defined (__OPTIMIZE__) +# if defined (__i386__) +# define GUINT16_SWAP_LE_BE_IA32(val) \ + (__extension__ \ + ({ register guint16 __v, __x = ((guint16) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ ("rorw $8, %w0" \ + : "=r" (__v) \ + : "0" (__x) \ + : "cc"); \ + __v; })) +# if !defined (__i486__) && !defined (__i586__) \ + && !defined (__pentium__) && !defined (__i686__) \ + && !defined (__pentiumpro__) && !defined (__pentium4__) +# define GUINT32_SWAP_LE_BE_IA32(val) \ + (__extension__ \ + ({ register guint32 __v, __x = ((guint32) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ ("rorw $8, %w0\n\t" \ + "rorl $16, %0\n\t" \ + "rorw $8, %w0" \ + : "=r" (__v) \ + : "0" (__x) \ + : "cc"); \ + __v; })) +# else /* 486 and higher has bswap */ +# define GUINT32_SWAP_LE_BE_IA32(val) \ + (__extension__ \ + ({ register guint32 __v, __x = ((guint32) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ ("bswap %0" \ + : "=r" (__v) \ + : "0" (__x)); \ + __v; })) +# endif /* processor specific 32-bit stuff */ +# define GUINT64_SWAP_LE_BE_IA32(val) \ + (__extension__ \ + ({ union { guint64 __ll; \ + guint32 __l[2]; } __w, __r; \ + __w.__ll = ((guint64) (val)); \ + if (__builtin_constant_p (__w.__ll)) \ + __r.__ll = GUINT64_SWAP_LE_BE_CONSTANT (__w.__ll); \ + else \ + { \ + __r.__l[0] = GUINT32_SWAP_LE_BE (__w.__l[1]); \ + __r.__l[1] = GUINT32_SWAP_LE_BE (__w.__l[0]); \ + } \ + __r.__ll; })) + /* Possibly just use the constant version and let gcc figure it out? */ +# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA32 (val)) +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA32 (val)) +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA32 (val)) +# elif defined (__ia64__) +# define GUINT16_SWAP_LE_BE_IA64(val) \ + (__extension__ \ + ({ register guint16 __v, __x = ((guint16) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT16_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ __volatile__ ("shl %0 = %1, 48 ;;" \ + "mux1 %0 = %0, @rev ;;" \ + : "=r" (__v) \ + : "r" (__x)); \ + __v; })) +# define GUINT32_SWAP_LE_BE_IA64(val) \ + (__extension__ \ + ({ register guint32 __v, __x = ((guint32) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ __volatile__ ("shl %0 = %1, 32 ;;" \ + "mux1 %0 = %0, @rev ;;" \ + : "=r" (__v) \ + : "r" (__x)); \ + __v; })) +# define GUINT64_SWAP_LE_BE_IA64(val) \ + (__extension__ \ + ({ register guint64 __v, __x = ((guint64) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ __volatile__ ("mux1 %0 = %1, @rev ;;" \ + : "=r" (__v) \ + : "r" (__x)); \ + __v; })) +# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_IA64 (val)) +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA64 (val)) +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA64 (val)) +# elif defined (__x86_64__) +# define GUINT32_SWAP_LE_BE_X86_64(val) \ + (__extension__ \ + ({ register guint32 __v, __x = ((guint32) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT32_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ ("bswapl %0" \ + : "=r" (__v) \ + : "0" (__x)); \ + __v; })) +# define GUINT64_SWAP_LE_BE_X86_64(val) \ + (__extension__ \ + ({ register guint64 __v, __x = ((guint64) (val)); \ + if (__builtin_constant_p (__x)) \ + __v = GUINT64_SWAP_LE_BE_CONSTANT (__x); \ + else \ + __asm__ ("bswapq %0" \ + : "=r" (__v) \ + : "0" (__x)); \ + __v; })) + /* gcc seems to figure out optimal code for this on its own */ +# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val)) +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86_64 (val)) +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86_64 (val)) +# else /* generic gcc */ +# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val)) +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val)) +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val)) +# endif +#else /* generic */ +# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val)) +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val)) +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val)) +#endif /* generic */ + +#define GUINT16_SWAP_LE_PDP(val) ((guint16) (val)) +#define GUINT16_SWAP_BE_PDP(val) (GUINT16_SWAP_LE_BE (val)) +#define GUINT32_SWAP_LE_PDP(val) ((guint32) ( \ + (((guint32) (val) & (guint32) 0x0000ffffU) << 16) | \ + (((guint32) (val) & (guint32) 0xffff0000U) >> 16))) +#define GUINT32_SWAP_BE_PDP(val) ((guint32) ( \ + (((guint32) (val) & (guint32) 0x00ff00ffU) << 8) | \ + (((guint32) (val) & (guint32) 0xff00ff00U) >> 8))) + +/* The G*_TO_?E() macros are defined in glibconfig.h. + * The transformation is symmetric, so the FROM just maps to the TO. + */ +#define GINT16_FROM_LE(val) (GINT16_TO_LE (val)) +#define GUINT16_FROM_LE(val) (GUINT16_TO_LE (val)) +#define GINT16_FROM_BE(val) (GINT16_TO_BE (val)) +#define GUINT16_FROM_BE(val) (GUINT16_TO_BE (val)) +#define GINT32_FROM_LE(val) (GINT32_TO_LE (val)) +#define GUINT32_FROM_LE(val) (GUINT32_TO_LE (val)) +#define GINT32_FROM_BE(val) (GINT32_TO_BE (val)) +#define GUINT32_FROM_BE(val) (GUINT32_TO_BE (val)) + +#define GINT64_FROM_LE(val) (GINT64_TO_LE (val)) +#define GUINT64_FROM_LE(val) (GUINT64_TO_LE (val)) +#define GINT64_FROM_BE(val) (GINT64_TO_BE (val)) +#define GUINT64_FROM_BE(val) (GUINT64_TO_BE (val)) + +#define GLONG_FROM_LE(val) (GLONG_TO_LE (val)) +#define GULONG_FROM_LE(val) (GULONG_TO_LE (val)) +#define GLONG_FROM_BE(val) (GLONG_TO_BE (val)) +#define GULONG_FROM_BE(val) (GULONG_TO_BE (val)) + +#define GINT_FROM_LE(val) (GINT_TO_LE (val)) +#define GUINT_FROM_LE(val) (GUINT_TO_LE (val)) +#define GINT_FROM_BE(val) (GINT_TO_BE (val)) +#define GUINT_FROM_BE(val) (GUINT_TO_BE (val)) + +#define GSIZE_FROM_LE(val) (GSIZE_TO_LE (val)) +#define GSSIZE_FROM_LE(val) (GSSIZE_TO_LE (val)) +#define GSIZE_FROM_BE(val) (GSIZE_TO_BE (val)) +#define GSSIZE_FROM_BE(val) (GSSIZE_TO_BE (val)) + + +/* Portable versions of host-network order stuff + */ +#define g_ntohl(val) (GUINT32_FROM_BE (val)) +#define g_ntohs(val) (GUINT16_FROM_BE (val)) +#define g_htonl(val) (GUINT32_TO_BE (val)) +#define g_htons(val) (GUINT16_TO_BE (val)) + +/* IEEE Standard 754 Single Precision Storage Format (gfloat): + * + * 31 30 23 22 0 + * +--------+---------------+---------------+ + * | s 1bit | e[30:23] 8bit | f[22:0] 23bit | + * +--------+---------------+---------------+ + * B0------------------->B1------->B2-->B3--> + * + * IEEE Standard 754 Double Precision Storage Format (gdouble): + * + * 63 62 52 51 32 31 0 + * +--------+----------------+----------------+ +---------------+ + * | s 1bit | e[62:52] 11bit | f[51:32] 20bit | | f[31:0] 32bit | + * +--------+----------------+----------------+ +---------------+ + * B0--------------->B1---------->B2--->B3----> B4->B5->B6->B7-> + */ +/* subtract from biased_exponent to form base2 exponent (normal numbers) */ +typedef union _GDoubleIEEE754 GDoubleIEEE754; +typedef union _GFloatIEEE754 GFloatIEEE754; +#define G_IEEE754_FLOAT_BIAS (127) +#define G_IEEE754_DOUBLE_BIAS (1023) +/* multiply with base2 exponent to get base10 exponent (normal numbers) */ +#define G_LOG_2_BASE_10 (0.30102999566398119521) +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +union _GFloatIEEE754 +{ + gfloat v_float; + struct { + guint mantissa : 23; + guint biased_exponent : 8; + guint sign : 1; + } mpn; +}; +union _GDoubleIEEE754 +{ + gdouble v_double; + struct { + guint mantissa_low : 32; + guint mantissa_high : 20; + guint biased_exponent : 11; + guint sign : 1; + } mpn; +}; +#elif G_BYTE_ORDER == G_BIG_ENDIAN +union _GFloatIEEE754 +{ + gfloat v_float; + struct { + guint sign : 1; + guint biased_exponent : 8; + guint mantissa : 23; + } mpn; +}; +union _GDoubleIEEE754 +{ + gdouble v_double; + struct { + guint sign : 1; + guint biased_exponent : 11; + guint mantissa_high : 20; + guint mantissa_low : 32; + } mpn; +}; +#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ +#error unknown ENDIAN type +#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */ + +typedef struct _GTimeVal GTimeVal; + +struct _GTimeVal +{ + glong tv_sec; + glong tv_usec; +}; + +G_END_DECLS + +/* We prefix variable declarations so they can + * properly get exported in Windows DLLs. + */ +#ifndef GLIB_VAR +# ifdef G_PLATFORM_WIN32 +# ifdef GLIB_STATIC_COMPILATION +# define GLIB_VAR extern +# else /* !GLIB_STATIC_COMPILATION */ +# ifdef GLIB_COMPILATION +# ifdef DLL_EXPORT +# define GLIB_VAR __declspec(dllexport) +# else /* !DLL_EXPORT */ +# define GLIB_VAR extern +# endif /* !DLL_EXPORT */ +# else /* !GLIB_COMPILATION */ +# define GLIB_VAR extern __declspec(dllimport) +# endif /* !GLIB_COMPILATION */ +# endif /* !GLIB_STATIC_COMPILATION */ +# else /* !G_PLATFORM_WIN32 */ +# define GLIB_VAR extern +# endif /* !G_PLATFORM_WIN32 */ +#endif /* GLIB_VAR */ + +#endif /* __G_TYPES_H__ */ diff --git a/glib/gunibreak.c b/glib/gunibreak.c new file mode 100644 index 0000000..9c12921 --- /dev/null +++ b/glib/gunibreak.c @@ -0,0 +1,66 @@ +/* gunibreak.c - line break properties + * + * Copyright 2000 Red Hat, Inc. + * + * The Gnome 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 of the + * License, or (at your option) any later version. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "glib.h" +#include "gunibreak.h" +#include "galias.h" + +#define TPROP_PART1(Page, Char) \ + ((break_property_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (break_property_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (break_property_data[break_property_table_part1[Page]][Char])) + +#define TPROP_PART2(Page, Char) \ + ((break_property_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (break_property_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (break_property_data[break_property_table_part2[Page]][Char])) + +#define PROP(Char) \ + (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ + ? TPROP_PART1 ((Char) >> 8, (Char) & 0xff) \ + : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ + ? TPROP_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ + : G_UNICODE_BREAK_UNKNOWN)) + +/** + * g_unichar_break_type: + * @c: a Unicode character + * + * Determines the break type of @c. @c should be a Unicode character + * (to derive a character from UTF-8 encoded text, use + * g_utf8_get_char()). The break type is used to find word and line + * breaks ("text boundaries"), Pango implements the Unicode boundary + * resolution algorithms and normally you would use a function such + * as pango_break() instead of caring about break types yourself. + * + * Return value: the break type of @c + **/ +GUnicodeBreakType +g_unichar_break_type (gunichar c) +{ + return PROP (c); +} + +#define __G_UNIBREAK_C__ +#include "galiasdef.c" diff --git a/glib/gunibreak.h b/glib/gunibreak.h new file mode 100644 index 0000000..504ac47 --- /dev/null +++ b/glib/gunibreak.h @@ -0,0 +1,17919 @@ +/* This file is automatically generated. DO NOT EDIT! + Instead, edit gen-unicode-tables.pl and re-run. */ + +#ifndef BREAKTABLES_H +#define BREAKTABLES_H + +#define G_UNICODE_DATA_VERSION "5.1.0" + +#define G_UNICODE_LAST_CHAR 0x10FFFF + +#define G_UNICODE_MAX_TABLE_INDEX 10000 + +/* the last code point that should be looked up in break_property_table_part1 */ +#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF + +static const gint8 break_property_data[][256] = { + { /* page 0, index 0 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_LINE_FEED, G_UNICODE_BREAK_MANDATORY, + G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_CARRIAGE_RETURN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_SPACE, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_HYPHEN, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_SYMBOL, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NEXT_LINE, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 2, index 1 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 3, index 2 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 4, index 3 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 5, index 4 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 6, index 5 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 7, index 6 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 9, index 7 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 10, index 8 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 11, index 9 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 12, index 10 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 13, index 11 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 14, index 12 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 15, index 13 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 16, index 14 */ + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 17, index 15 */ + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 18, index 16 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 19, index 17 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 20, index 18 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 22, index 19 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 23, index 20 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 24, index 21 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 25, index 22 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 26, index 23 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 27, index 24 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 28, index 25 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 29, index 26 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK + }, + { /* page 31, index 27 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 32, index 28 */ + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ZERO_WIDTH_SPACE, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE_AND_AFTER, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INSEPARABLE, + G_UNICODE_BREAK_INSEPARABLE, G_UNICODE_BREAK_INSEPARABLE, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_MANDATORY, + G_UNICODE_BREAK_MANDATORY, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_WORD_JOINER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 33, index 29 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 34, index 30 */ + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 35, index 31 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 36, index 32 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 37, index 33 */ + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 38, index 34 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 39, index 35 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 41, index 36 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 43, index 37 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 44, index 38 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_AFTER + }, + { /* page 45, index 39 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK + }, + { /* page 46, index 40 */ + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 47, index 41 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 48, index 42 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC + }, + { /* page 49, index 43 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER + }, + { /* page 50, index 44 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 77, index 45 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 159, index 46 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 160, index 47 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC + }, + { /* page 164, index 48 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 166, index 49 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 167, index 50 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 168, index 51 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 169, index 52 */ + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 170, index 53 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 172, index 54 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 173, index 55 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 174, index 56 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 175, index 57 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 176, index 58 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 177, index 59 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 178, index 60 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 179, index 61 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 180, index 62 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 181, index 63 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 182, index 64 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 183, index 65 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 184, index 66 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 185, index 67 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 186, index 68 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 187, index 69 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 188, index 70 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 189, index 71 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 190, index 72 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 191, index 73 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 192, index 74 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 193, index 75 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 194, index 76 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 195, index 77 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 196, index 78 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 197, index 79 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 198, index 80 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 199, index 81 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 200, index 82 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 201, index 83 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 202, index 84 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 203, index 85 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 204, index 86 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 205, index 87 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 206, index 88 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 207, index 89 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 208, index 90 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 209, index 91 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 210, index 92 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 211, index 93 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 212, index 94 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 213, index 95 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 214, index 96 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE + }, + { /* page 215, index 97 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 250, index 98 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 251, index 99 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 253, index 100 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 254, index 101 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_INFIX_SEPARATOR, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_INSEPARABLE, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_WORD_JOINER + }, + { /* page 255, index 102 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_CONTINGENT, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 256, index 103 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 257, index 104 */ + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 258, index 105 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 259, index 106 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 260, index 107 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 264, index 108 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 265, index 109 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 266, index 110 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN + }, + { /* page 291, index 111 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 292, index 112 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 464, index 113 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 465, index 114 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 466, index 115 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 467, index 116 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 468, index 117 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 469, index 118 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 470, index 119 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 471, index 120 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC + }, + { /* page 496, index 121 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 678, index 122 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 762, index 123 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 3584, index 124 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 3585, index 125 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + } +}; + +/* U+0000 through U+2FAFF */ +static const gint16 break_property_table_part1[763] = { + 0 /* page 0 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 1 /* page 2 */, + 2 /* page 3 */, + 3 /* page 4 */, + 4 /* page 5 */, + 5 /* page 6 */, + 6 /* page 7 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 7 /* page 9 */, + 8 /* page 10 */, + 9 /* page 11 */, + 10 /* page 12 */, + 11 /* page 13 */, + 12 /* page 14 */, + 13 /* page 15 */, + 14 /* page 16 */, + 15 /* page 17 */, + 16 /* page 18 */, + 17 /* page 19 */, + 18 /* page 20 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 19 /* page 22 */, + 20 /* page 23 */, + 21 /* page 24 */, + 22 /* page 25 */, + 23 /* page 26 */, + 24 /* page 27 */, + 25 /* page 28 */, + 26 /* page 29 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 27 /* page 31 */, + 28 /* page 32 */, + 29 /* page 33 */, + 30 /* page 34 */, + 31 /* page 35 */, + 32 /* page 36 */, + 33 /* page 37 */, + 34 /* page 38 */, + 35 /* page 39 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 36 /* page 41 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 37 /* page 43 */, + 38 /* page 44 */, + 39 /* page 45 */, + 40 /* page 46 */, + 41 /* page 47 */, + 42 /* page 48 */, + 43 /* page 49 */, + 44 /* page 50 */, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 45 /* page 77 */, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 46 /* page 159 */, + 47 /* page 160 */, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 48 /* page 164 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 49 /* page 166 */, + 50 /* page 167 */, + 51 /* page 168 */, + 52 /* page 169 */, + 53 /* page 170 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 54 /* page 172 */, + 55 /* page 173 */, + 56 /* page 174 */, + 57 /* page 175 */, + 58 /* page 176 */, + 59 /* page 177 */, + 60 /* page 178 */, + 61 /* page 179 */, + 62 /* page 180 */, + 63 /* page 181 */, + 64 /* page 182 */, + 65 /* page 183 */, + 66 /* page 184 */, + 67 /* page 185 */, + 68 /* page 186 */, + 69 /* page 187 */, + 70 /* page 188 */, + 71 /* page 189 */, + 72 /* page 190 */, + 73 /* page 191 */, + 74 /* page 192 */, + 75 /* page 193 */, + 76 /* page 194 */, + 77 /* page 195 */, + 78 /* page 196 */, + 79 /* page 197 */, + 80 /* page 198 */, + 81 /* page 199 */, + 82 /* page 200 */, + 83 /* page 201 */, + 84 /* page 202 */, + 85 /* page 203 */, + 86 /* page 204 */, + 87 /* page 205 */, + 88 /* page 206 */, + 89 /* page 207 */, + 90 /* page 208 */, + 91 /* page 209 */, + 92 /* page 210 */, + 93 /* page 211 */, + 94 /* page 212 */, + 95 /* page 213 */, + 96 /* page 214 */, + 97 /* page 215 */, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 98 /* page 250 */, + 99 /* page 251 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 100 /* page 253 */, + 101 /* page 254 */, + 102 /* page 255 */, + 103 /* page 256 */, + 104 /* page 257 */, + 105 /* page 258 */, + 106 /* page 259 */, + 107 /* page 260 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 108 /* page 264 */, + 109 /* page 265 */, + 110 /* page 266 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 111 /* page 291 */, + 112 /* page 292 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 113 /* page 464 */, + 114 /* page 465 */, + 115 /* page 466 */, + 116 /* page 467 */, + 117 /* page 468 */, + 118 /* page 469 */, + 119 /* page 470 */, + 120 /* page 471 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 121 /* page 496 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 122 /* page 678 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 123 /* page 762 */ +}; + +/* U+E0000 through U+10FFFF */ +static const gint16 break_property_table_part2[768] = { + 124 /* page 3584 */, + 125 /* page 3585 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX +}; + +#endif /* BREAKTABLES_H */ diff --git a/glib/gunichartables.h b/glib/gunichartables.h new file mode 100644 index 0000000..044a44f --- /dev/null +++ b/glib/gunichartables.h @@ -0,0 +1,13060 @@ +/* This file is automatically generated. DO NOT EDIT! + Instead, edit gen-unicode-tables.pl and re-run. */ + +#ifndef CHARTABLES_H +#define CHARTABLES_H + +#define G_UNICODE_DATA_VERSION "5.1.0" + +#define G_UNICODE_LAST_CHAR 0x10ffff + +#define G_UNICODE_MAX_TABLE_INDEX 10000 + +#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF + +#define G_UNICODE_LAST_PAGE_PART1 762 + +static const char type_data[][256] = { + { /* page 0, index 0 */ + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_FORMAT, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_OTHER_NUMBER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER + }, + { /* page 1, index 1 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER + }, + { /* page 2, index 2 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL + }, + { /* page 3, index 3 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER + }, + { /* page 4, index 4 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER + }, + { /* page 5, index 5 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 6, index 6 */ + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_FORMAT, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_LETTER + }, + { /* page 7, index 7 */ + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 9, index 8 */ + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 10, index 9 */ + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 11, index 10 */ + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 12, index 11 */ + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 13, index 12 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 14, index 13 */ + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 15, index 14 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 16, index 15 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 17, index 16 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 18, index 17 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER + }, + { /* page 19, index 18 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 20, index 19 */ + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER + }, + { /* page 22, index 20 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 23, index 21 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 24, index 22 */ + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_UNASSIGNED, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 25, index 23 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL + }, + { /* page 26, index 24 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 27, index 25 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 28, index 26 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 29, index 27 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK + }, + { /* page 30, index 28 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER + }, + { /* page 31, index 29 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_TITLECASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_TITLECASE_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED + }, + { /* page 32, index 30 */ + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_LINE_SEPARATOR, G_UNICODE_PARAGRAPH_SEPARATOR, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_OTHER_NUMBER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_UNASSIGNED, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 33, index 31 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL + }, + { /* page 35, index 32 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 36, index 33 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER + }, + { /* page 37, index 34 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL + }, + { /* page 38, index 35 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 39, index 36 */ + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL + }, + { /* page 41, index 37 */ + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL + }, + { /* page 43, index 38 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 44, index 39 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION + }, + { /* page 45, index 40 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK + }, + { /* page 46, index 41 */ + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, + G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 47, index 42 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 48, index 43 */ + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER + }, + { /* page 49, index 44 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER + }, + { /* page 50, index 45 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED + }, + { /* page 77, index 46 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL + }, + { /* page 159, index 47 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 160, index 48 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER + }, + { /* page 164, index 49 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 166, index 50 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_ENCLOSING_MARK, G_UNICODE_ENCLOSING_MARK, + G_UNICODE_ENCLOSING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 167, index 51 */ + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER + }, + { /* page 168, index 52 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 169, index 53 */ + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 170, index 54 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 215, index 55 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 250, index 56 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 251, index 57 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER + }, + { /* page 253, index 58 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 254, index 59 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_CONNECT_PUNCTUATION, + G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT + }, + { /* page 255, index 60 */ + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_CONNECT_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 256, index 61 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 257, index 62 */ + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_NUMBER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 258, index 63 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 259, index 64 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 260, index 65 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 264, index 66 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 265, index 67 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 266, index 68 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 291, index 69 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 292, index 70 */ + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 464, index 71 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 465, index 72 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, + G_UNICODE_COMBINING_MARK, G_UNICODE_COMBINING_MARK, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 466, index 73 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 467, index 74 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 468, index 75 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER + }, + { /* page 469, index 76 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER + }, + { /* page 470, index 77 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_MATH_SYMBOL, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER + }, + { /* page 471, index 78 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_MATH_SYMBOL, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER + }, + { /* page 496, index 79 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 678, index 80 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 762, index 81 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 3584, index 82 */ + G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 3585, index 83 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 4095, index 84 */ + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 4351, index 85 */ + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + } +}; + +/* U+0000 through U+2FAFF */ +static const gint16 type_table_part1[763] = { + 0 /* page 0 */, + 1 /* page 1 */, + 2 /* page 2 */, + 3 /* page 3 */, + 4 /* page 4 */, + 5 /* page 5 */, + 6 /* page 6 */, + 7 /* page 7 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 8 /* page 9 */, + 9 /* page 10 */, + 10 /* page 11 */, + 11 /* page 12 */, + 12 /* page 13 */, + 13 /* page 14 */, + 14 /* page 15 */, + 15 /* page 16 */, + 16 /* page 17 */, + 17 /* page 18 */, + 18 /* page 19 */, + 19 /* page 20 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 20 /* page 22 */, + 21 /* page 23 */, + 22 /* page 24 */, + 23 /* page 25 */, + 24 /* page 26 */, + 25 /* page 27 */, + 26 /* page 28 */, + 27 /* page 29 */, + 28 /* page 30 */, + 29 /* page 31 */, + 30 /* page 32 */, + 31 /* page 33 */, + G_UNICODE_MATH_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, + 32 /* page 35 */, + 33 /* page 36 */, + 34 /* page 37 */, + 35 /* page 38 */, + 36 /* page 39 */, + G_UNICODE_OTHER_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, + 37 /* page 41 */, + G_UNICODE_MATH_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, + 38 /* page 43 */, + 39 /* page 44 */, + 40 /* page 45 */, + 41 /* page 46 */, + 42 /* page 47 */, + 43 /* page 48 */, + 44 /* page 49 */, + 45 /* page 50 */, + G_UNICODE_OTHER_SYMBOL + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 46 /* page 77 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 47 /* page 159 */, + 48 /* page 160 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 49 /* page 164 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 50 /* page 166 */, + 51 /* page 167 */, + 52 /* page 168 */, + 53 /* page 169 */, + 54 /* page 170 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 55 /* page 215 */, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_SURROGATE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 56 /* page 250 */, + 57 /* page 251 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 58 /* page 253 */, + 59 /* page 254 */, + 60 /* page 255 */, + 61 /* page 256 */, + 62 /* page 257 */, + 63 /* page 258 */, + 64 /* page 259 */, + 65 /* page 260 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 66 /* page 264 */, + 67 /* page 265 */, + 68 /* page 266 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 69 /* page 291 */, + 70 /* page 292 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 71 /* page 464 */, + 72 /* page 465 */, + 73 /* page 466 */, + 74 /* page 467 */, + 75 /* page 468 */, + 76 /* page 469 */, + 77 /* page 470 */, + 78 /* page 471 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 79 /* page 496 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 80 /* page 678 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 81 /* page 762 */ +}; + +/* U+E0000 through U+10FFFF */ +static const gint16 type_table_part2[768] = { + 82 /* page 3584 */, + 83 /* page 3585 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + 84 /* page 4095 */, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, + 85 /* page 4351 */ +}; + +static const gunichar attr_data[][256] = { + { /* page 0, index 0 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, + 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, + 0x007a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, + 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, + 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, + 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x039c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, + 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, + 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0000, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x1000000, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, + 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1, + 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0000, 0x00d8, 0x00d9, 0x00da, + 0x00db, 0x00dc, 0x00dd, 0x00de, 0x0178 + }, + { /* page 1, index 1 */ + 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x0107, 0x0106, 0x0109, + 0x0108, 0x010b, 0x010a, 0x010d, 0x010c, 0x010f, 0x010e, 0x0111, 0x0110, + 0x0113, 0x0112, 0x0115, 0x0114, 0x0117, 0x0116, 0x0119, 0x0118, 0x011b, + 0x011a, 0x011d, 0x011c, 0x011f, 0x011e, 0x0121, 0x0120, 0x0123, 0x0122, + 0x0125, 0x0124, 0x0127, 0x0126, 0x0129, 0x0128, 0x012b, 0x012a, 0x012d, + 0x012c, 0x012f, 0x012e, 0x1000007, 0x0049, 0x0133, 0x0132, 0x0135, + 0x0134, 0x0137, 0x0136, 0x0000, 0x013a, 0x0139, 0x013c, 0x013b, 0x013e, + 0x013d, 0x0140, 0x013f, 0x0142, 0x0141, 0x0144, 0x0143, 0x0146, 0x0145, + 0x0148, 0x0147, 0x1000086, 0x014b, 0x014a, 0x014d, 0x014c, 0x014f, + 0x014e, 0x0151, 0x0150, 0x0153, 0x0152, 0x0155, 0x0154, 0x0157, 0x0156, + 0x0159, 0x0158, 0x015b, 0x015a, 0x015d, 0x015c, 0x015f, 0x015e, 0x0161, + 0x0160, 0x0163, 0x0162, 0x0165, 0x0164, 0x0167, 0x0166, 0x0169, 0x0168, + 0x016b, 0x016a, 0x016d, 0x016c, 0x016f, 0x016e, 0x0171, 0x0170, 0x0173, + 0x0172, 0x0175, 0x0174, 0x0177, 0x0176, 0x00ff, 0x017a, 0x0179, 0x017c, + 0x017b, 0x017e, 0x017d, 0x0053, 0x0243, 0x0253, 0x0183, 0x0182, 0x0185, + 0x0184, 0x0254, 0x0188, 0x0187, 0x0256, 0x0257, 0x018c, 0x018b, 0x0000, + 0x01dd, 0x0259, 0x025b, 0x0192, 0x0191, 0x0260, 0x0263, 0x01f6, 0x0269, + 0x0268, 0x0199, 0x0198, 0x023d, 0x0000, 0x026f, 0x0272, 0x0220, 0x0275, + 0x01a1, 0x01a0, 0x01a3, 0x01a2, 0x01a5, 0x01a4, 0x0280, 0x01a8, 0x01a7, + 0x0283, 0x0000, 0x0000, 0x01ad, 0x01ac, 0x0288, 0x01b0, 0x01af, 0x028a, + 0x028b, 0x01b4, 0x01b3, 0x01b6, 0x01b5, 0x0292, 0x01b9, 0x01b8, 0x0000, + 0x0000, 0x01bd, 0x01bc, 0x0000, 0x01f7, 0x0000, 0x0000, 0x0000, 0x0000, + 0x01c6, 0x0000, 0x01c4, 0x01c9, 0x0000, 0x01c7, 0x01cc, 0x0000, 0x01ca, + 0x01ce, 0x01cd, 0x01d0, 0x01cf, 0x01d2, 0x01d1, 0x01d4, 0x01d3, 0x01d6, + 0x01d5, 0x01d8, 0x01d7, 0x01da, 0x01d9, 0x01dc, 0x01db, 0x018e, 0x01df, + 0x01de, 0x01e1, 0x01e0, 0x01e3, 0x01e2, 0x01e5, 0x01e4, 0x01e7, 0x01e6, + 0x01e9, 0x01e8, 0x01eb, 0x01ea, 0x01ed, 0x01ec, 0x01ef, 0x01ee, + 0x10000ad, 0x01f3, 0x0000, 0x01f1, 0x01f5, 0x01f4, 0x0195, 0x01bf, + 0x01f9, 0x01f8, 0x01fb, 0x01fa, 0x01fd, 0x01fc, 0x01ff, 0x01fe + }, + { /* page 2, index 2 */ + 0x0201, 0x0200, 0x0203, 0x0202, 0x0205, 0x0204, 0x0207, 0x0206, 0x0209, + 0x0208, 0x020b, 0x020a, 0x020d, 0x020c, 0x020f, 0x020e, 0x0211, 0x0210, + 0x0213, 0x0212, 0x0215, 0x0214, 0x0217, 0x0216, 0x0219, 0x0218, 0x021b, + 0x021a, 0x021d, 0x021c, 0x021f, 0x021e, 0x019e, 0x0000, 0x0223, 0x0222, + 0x0225, 0x0224, 0x0227, 0x0226, 0x0229, 0x0228, 0x022b, 0x022a, 0x022d, + 0x022c, 0x022f, 0x022e, 0x0231, 0x0230, 0x0233, 0x0232, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x2c65, 0x023c, 0x023b, 0x019a, 0x2c66, + 0x0000, 0x0000, 0x0242, 0x0241, 0x0180, 0x0289, 0x028c, 0x0247, 0x0246, + 0x0249, 0x0248, 0x024b, 0x024a, 0x024d, 0x024c, 0x024f, 0x024e, 0x2c6f, + 0x2c6d, 0x0000, 0x0181, 0x0186, 0x0000, 0x0189, 0x018a, 0x0000, 0x018f, + 0x0000, 0x0190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0193, 0x0000, 0x0000, + 0x0194, 0x0000, 0x0000, 0x0000, 0x0000, 0x0197, 0x0196, 0x0000, 0x2c62, + 0x0000, 0x0000, 0x0000, 0x019c, 0x0000, 0x2c6e, 0x019d, 0x0000, 0x0000, + 0x019f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c64, + 0x0000, 0x0000, 0x01a6, 0x0000, 0x0000, 0x01a9, 0x0000, 0x0000, 0x0000, + 0x0000, 0x01ae, 0x0244, 0x01b1, 0x01b2, 0x0245, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x01b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 3, index 3 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0371, 0x0370, 0x0373, 0x0372, 0x0000, + 0x0000, 0x0377, 0x0376, 0x0000, 0x0000, 0x0000, 0x03fd, 0x03fe, 0x03ff, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac, + 0x0000, 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce, + 0x100008f, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, + 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, + 0x03c1, 0x0000, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, + 0x03ca, 0x03cb, 0x0386, 0x0388, 0x0389, 0x038a, 0x100009e, 0x0391, + 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, + 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a3, + 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, + 0x038e, 0x038f, 0x03d7, 0x0392, 0x0398, 0x0000, 0x0000, 0x0000, 0x03a6, + 0x03a0, 0x03cf, 0x03d9, 0x03d8, 0x03db, 0x03da, 0x03dd, 0x03dc, 0x03df, + 0x03de, 0x03e1, 0x03e0, 0x03e3, 0x03e2, 0x03e5, 0x03e4, 0x03e7, 0x03e6, + 0x03e9, 0x03e8, 0x03eb, 0x03ea, 0x03ed, 0x03ec, 0x03ef, 0x03ee, 0x039a, + 0x03a1, 0x03f9, 0x0000, 0x03b8, 0x0395, 0x0000, 0x03f8, 0x03f7, 0x03f2, + 0x03fb, 0x03fa, 0x0000, 0x037b, 0x037c, 0x037d + }, + { /* page 4, index 4 */ + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, + 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0430, 0x0431, + 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, + 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, + 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, + 0x044d, 0x044e, 0x044f, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, + 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, + 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0400, + 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, + 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f, 0x0461, 0x0460, 0x0463, + 0x0462, 0x0465, 0x0464, 0x0467, 0x0466, 0x0469, 0x0468, 0x046b, 0x046a, + 0x046d, 0x046c, 0x046f, 0x046e, 0x0471, 0x0470, 0x0473, 0x0472, 0x0475, + 0x0474, 0x0477, 0x0476, 0x0479, 0x0478, 0x047b, 0x047a, 0x047d, 0x047c, + 0x047f, 0x047e, 0x0481, 0x0480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x048b, 0x048a, 0x048d, 0x048c, 0x048f, 0x048e, + 0x0491, 0x0490, 0x0493, 0x0492, 0x0495, 0x0494, 0x0497, 0x0496, 0x0499, + 0x0498, 0x049b, 0x049a, 0x049d, 0x049c, 0x049f, 0x049e, 0x04a1, 0x04a0, + 0x04a3, 0x04a2, 0x04a5, 0x04a4, 0x04a7, 0x04a6, 0x04a9, 0x04a8, 0x04ab, + 0x04aa, 0x04ad, 0x04ac, 0x04af, 0x04ae, 0x04b1, 0x04b0, 0x04b3, 0x04b2, + 0x04b5, 0x04b4, 0x04b7, 0x04b6, 0x04b9, 0x04b8, 0x04bb, 0x04ba, 0x04bd, + 0x04bc, 0x04bf, 0x04be, 0x04cf, 0x04c2, 0x04c1, 0x04c4, 0x04c3, 0x04c6, + 0x04c5, 0x04c8, 0x04c7, 0x04ca, 0x04c9, 0x04cc, 0x04cb, 0x04ce, 0x04cd, + 0x04c0, 0x04d1, 0x04d0, 0x04d3, 0x04d2, 0x04d5, 0x04d4, 0x04d7, 0x04d6, + 0x04d9, 0x04d8, 0x04db, 0x04da, 0x04dd, 0x04dc, 0x04df, 0x04de, 0x04e1, + 0x04e0, 0x04e3, 0x04e2, 0x04e5, 0x04e4, 0x04e7, 0x04e6, 0x04e9, 0x04e8, + 0x04eb, 0x04ea, 0x04ed, 0x04ec, 0x04ef, 0x04ee, 0x04f1, 0x04f0, 0x04f3, + 0x04f2, 0x04f5, 0x04f4, 0x04f7, 0x04f6, 0x04f9, 0x04f8, 0x04fb, 0x04fa, + 0x04fd, 0x04fc, 0x04ff, 0x04fe + }, + { /* page 5, index 5 */ + 0x0501, 0x0500, 0x0503, 0x0502, 0x0505, 0x0504, 0x0507, 0x0506, 0x0509, + 0x0508, 0x050b, 0x050a, 0x050d, 0x050c, 0x050f, 0x050e, 0x0511, 0x0510, + 0x0513, 0x0512, 0x0515, 0x0514, 0x0517, 0x0516, 0x0519, 0x0518, 0x051b, + 0x051a, 0x051d, 0x051c, 0x051f, 0x051e, 0x0521, 0x0520, 0x0523, 0x0522, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, + 0x0566, 0x0567, 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, + 0x056f, 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, 0x0580, + 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0531, 0x0532, + 0x0533, 0x0534, 0x0535, 0x0536, 0x0537, 0x0538, 0x0539, 0x053a, 0x053b, + 0x053c, 0x053d, 0x053e, 0x053f, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, + 0x0545, 0x0546, 0x0547, 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, + 0x054e, 0x054f, 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, + 0x1000044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 6, index 6 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 7, index 7 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 9, index 8 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 10, index 9 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 11, index 10 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 12, index 11 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 13, index 12 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 14, index 13 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 15, index 14 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 16, index 15 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d00, 0x2d01, + 0x2d02, 0x2d03, 0x2d04, 0x2d05, 0x2d06, 0x2d07, 0x2d08, 0x2d09, 0x2d0a, + 0x2d0b, 0x2d0c, 0x2d0d, 0x2d0e, 0x2d0f, 0x2d10, 0x2d11, 0x2d12, 0x2d13, + 0x2d14, 0x2d15, 0x2d16, 0x2d17, 0x2d18, 0x2d19, 0x2d1a, 0x2d1b, 0x2d1c, + 0x2d1d, 0x2d1e, 0x2d1f, 0x2d20, 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 23, index 16 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 24, index 17 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, + 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 25, index 18 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, + 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 27, index 19 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 28, index 20 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 29, index 21 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa77d, 0x0000, 0x0000, 0x0000, 0x2c63, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 30, index 22 */ + 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06, 0x1e09, + 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e, 0x1e11, 0x1e10, + 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16, 0x1e19, 0x1e18, 0x1e1b, + 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e, 0x1e21, 0x1e20, 0x1e23, 0x1e22, + 0x1e25, 0x1e24, 0x1e27, 0x1e26, 0x1e29, 0x1e28, 0x1e2b, 0x1e2a, 0x1e2d, + 0x1e2c, 0x1e2f, 0x1e2e, 0x1e31, 0x1e30, 0x1e33, 0x1e32, 0x1e35, 0x1e34, + 0x1e37, 0x1e36, 0x1e39, 0x1e38, 0x1e3b, 0x1e3a, 0x1e3d, 0x1e3c, 0x1e3f, + 0x1e3e, 0x1e41, 0x1e40, 0x1e43, 0x1e42, 0x1e45, 0x1e44, 0x1e47, 0x1e46, + 0x1e49, 0x1e48, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4c, 0x1e4f, 0x1e4e, 0x1e51, + 0x1e50, 0x1e53, 0x1e52, 0x1e55, 0x1e54, 0x1e57, 0x1e56, 0x1e59, 0x1e58, + 0x1e5b, 0x1e5a, 0x1e5d, 0x1e5c, 0x1e5f, 0x1e5e, 0x1e61, 0x1e60, 0x1e63, + 0x1e62, 0x1e65, 0x1e64, 0x1e67, 0x1e66, 0x1e69, 0x1e68, 0x1e6b, 0x1e6a, + 0x1e6d, 0x1e6c, 0x1e6f, 0x1e6e, 0x1e71, 0x1e70, 0x1e73, 0x1e72, 0x1e75, + 0x1e74, 0x1e77, 0x1e76, 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c, + 0x1e7f, 0x1e7e, 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87, + 0x1e86, 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e, + 0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0x10000b6, 0x10000bf, + 0x10000c8, 0x10000d1, 0x10000da, 0x1e60, 0x0000, 0x0000, 0x00df, 0x0000, + 0x1ea1, 0x1ea0, 0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6, 0x1ea9, + 0x1ea8, 0x1eab, 0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae, 0x1eb1, 0x1eb0, + 0x1eb3, 0x1eb2, 0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6, 0x1eb9, 0x1eb8, 0x1ebb, + 0x1eba, 0x1ebd, 0x1ebc, 0x1ebf, 0x1ebe, 0x1ec1, 0x1ec0, 0x1ec3, 0x1ec2, + 0x1ec5, 0x1ec4, 0x1ec7, 0x1ec6, 0x1ec9, 0x1ec8, 0x1ecb, 0x1eca, 0x1ecd, + 0x1ecc, 0x1ecf, 0x1ece, 0x1ed1, 0x1ed0, 0x1ed3, 0x1ed2, 0x1ed5, 0x1ed4, + 0x1ed7, 0x1ed6, 0x1ed9, 0x1ed8, 0x1edb, 0x1eda, 0x1edd, 0x1edc, 0x1edf, + 0x1ede, 0x1ee1, 0x1ee0, 0x1ee3, 0x1ee2, 0x1ee5, 0x1ee4, 0x1ee7, 0x1ee6, + 0x1ee9, 0x1ee8, 0x1eeb, 0x1eea, 0x1eed, 0x1eec, 0x1eef, 0x1eee, 0x1ef1, + 0x1ef0, 0x1ef3, 0x1ef2, 0x1ef5, 0x1ef4, 0x1ef7, 0x1ef6, 0x1ef9, 0x1ef8, + 0x1efb, 0x1efa, 0x1efd, 0x1efc, 0x1eff, 0x1efe + }, + { /* page 31, index 23 */ + 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f00, + 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, 0x1f18, 0x1f19, + 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0x0000, 0x0000, 0x1f10, 0x1f11, 0x1f12, + 0x1f13, 0x1f14, 0x1f15, 0x0000, 0x0000, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, + 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, + 0x1f25, 0x1f26, 0x1f27, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, + 0x1f3e, 0x1f3f, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, + 0x1f37, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x0000, 0x0000, + 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, + 0x10000e3, 0x1f59, 0x10000ee, 0x1f5b, 0x10000fd, 0x1f5d, 0x100010c, + 0x1f5f, 0x0000, 0x1f51, 0x0000, 0x1f53, 0x0000, 0x1f55, 0x0000, 0x1f57, + 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f60, + 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1fba, 0x1fbb, + 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, + 0x1feb, 0x1ffa, 0x1ffb, 0x0000, 0x0000, 0x10001b7, 0x10001c4, 0x10001d1, + 0x10001de, 0x10001eb, 0x10001f8, 0x1000205, 0x1000212, 0x100021f, + 0x1000229, 0x1000233, 0x100023d, 0x1000247, 0x1000251, 0x100025b, + 0x1000265, 0x100026f, 0x100027c, 0x1000289, 0x1000296, 0x10002a3, + 0x10002b0, 0x10002bd, 0x10002ca, 0x10002d7, 0x10002e1, 0x10002eb, + 0x10002f5, 0x10002ff, 0x1000309, 0x1000313, 0x100031d, 0x1000327, + 0x1000334, 0x1000341, 0x100034e, 0x100035b, 0x1000368, 0x1000375, + 0x1000382, 0x100038f, 0x1000399, 0x10003a3, 0x10003ad, 0x10003b7, + 0x10003c1, 0x10003cb, 0x10003d5, 0x1fb8, 0x1fb9, 0x100041e, 0x10003df, + 0x100042b, 0x0000, 0x100011b, 0x1000466, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, + 0x10003eb, 0x0000, 0x0399, 0x0000, 0x0000, 0x0000, 0x1000436, 0x10003f4, + 0x1000443, 0x0000, 0x1000126, 0x1000475, 0x1f72, 0x1f73, 0x1f74, 0x1f75, + 0x1000400, 0x0000, 0x0000, 0x0000, 0x1fd8, 0x1fd9, 0x1000131, 0x1000140, + 0x0000, 0x0000, 0x100014f, 0x100015a, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, + 0x0000, 0x0000, 0x0000, 0x0000, 0x1fe8, 0x1fe9, 0x1000169, 0x1000178, + 0x1000187, 0x1fec, 0x1000192, 0x100019d, 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, + 0x1fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100044e, 0x1000409, + 0x100045b, 0x0000, 0x10001ac, 0x1000484, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, + 0x1000415, 0x0000, 0x0000, 0x0000 + }, + { /* page 33, index 24 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x03c9, 0x0000, 0x0000, 0x0000, 0x006b, 0x00e5, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x214e, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2184, 0x2183, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 44, index 25 */ + 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38, + 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, 0x2c41, + 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2c48, 0x2c49, 0x2c4a, + 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, 0x2c51, 0x2c52, 0x2c53, + 0x2c54, 0x2c55, 0x2c56, 0x2c57, 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, + 0x2c5d, 0x2c5e, 0x0000, 0x2c00, 0x2c01, 0x2c02, 0x2c03, 0x2c04, 0x2c05, + 0x2c06, 0x2c07, 0x2c08, 0x2c09, 0x2c0a, 0x2c0b, 0x2c0c, 0x2c0d, 0x2c0e, + 0x2c0f, 0x2c10, 0x2c11, 0x2c12, 0x2c13, 0x2c14, 0x2c15, 0x2c16, 0x2c17, + 0x2c18, 0x2c19, 0x2c1a, 0x2c1b, 0x2c1c, 0x2c1d, 0x2c1e, 0x2c1f, 0x2c20, + 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, 0x2c28, 0x2c29, + 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x0000, 0x2c61, 0x2c60, 0x026b, + 0x1d7d, 0x027d, 0x023a, 0x023e, 0x2c68, 0x2c67, 0x2c6a, 0x2c69, 0x2c6c, + 0x2c6b, 0x0251, 0x0271, 0x0250, 0x0000, 0x0000, 0x2c73, 0x2c72, 0x0000, + 0x2c76, 0x2c75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x2c81, 0x2c80, 0x2c83, 0x2c82, 0x2c85, 0x2c84, 0x2c87, + 0x2c86, 0x2c89, 0x2c88, 0x2c8b, 0x2c8a, 0x2c8d, 0x2c8c, 0x2c8f, 0x2c8e, + 0x2c91, 0x2c90, 0x2c93, 0x2c92, 0x2c95, 0x2c94, 0x2c97, 0x2c96, 0x2c99, + 0x2c98, 0x2c9b, 0x2c9a, 0x2c9d, 0x2c9c, 0x2c9f, 0x2c9e, 0x2ca1, 0x2ca0, + 0x2ca3, 0x2ca2, 0x2ca5, 0x2ca4, 0x2ca7, 0x2ca6, 0x2ca9, 0x2ca8, 0x2cab, + 0x2caa, 0x2cad, 0x2cac, 0x2caf, 0x2cae, 0x2cb1, 0x2cb0, 0x2cb3, 0x2cb2, + 0x2cb5, 0x2cb4, 0x2cb7, 0x2cb6, 0x2cb9, 0x2cb8, 0x2cbb, 0x2cba, 0x2cbd, + 0x2cbc, 0x2cbf, 0x2cbe, 0x2cc1, 0x2cc0, 0x2cc3, 0x2cc2, 0x2cc5, 0x2cc4, + 0x2cc7, 0x2cc6, 0x2cc9, 0x2cc8, 0x2ccb, 0x2cca, 0x2ccd, 0x2ccc, 0x2ccf, + 0x2cce, 0x2cd1, 0x2cd0, 0x2cd3, 0x2cd2, 0x2cd5, 0x2cd4, 0x2cd7, 0x2cd6, + 0x2cd9, 0x2cd8, 0x2cdb, 0x2cda, 0x2cdd, 0x2cdc, 0x2cdf, 0x2cde, 0x2ce1, + 0x2ce0, 0x2ce3, 0x2ce2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 45, index 26 */ + 0x10a0, 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8, + 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0, 0x10b1, + 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8, 0x10b9, 0x10ba, + 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0, 0x10c1, 0x10c2, 0x10c3, + 0x10c4, 0x10c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 166, index 27 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, + 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xa641, 0xa640, 0xa643, 0xa642, 0xa645, 0xa644, 0xa647, 0xa646, + 0xa649, 0xa648, 0xa64b, 0xa64a, 0xa64d, 0xa64c, 0xa64f, 0xa64e, 0xa651, + 0xa650, 0xa653, 0xa652, 0xa655, 0xa654, 0xa657, 0xa656, 0xa659, 0xa658, + 0xa65b, 0xa65a, 0xa65d, 0xa65c, 0xa65f, 0xa65e, 0x0000, 0x0000, 0xa663, + 0xa662, 0xa665, 0xa664, 0xa667, 0xa666, 0xa669, 0xa668, 0xa66b, 0xa66a, + 0xa66d, 0xa66c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xa681, 0xa680, 0xa683, 0xa682, 0xa685, 0xa684, 0xa687, + 0xa686, 0xa689, 0xa688, 0xa68b, 0xa68a, 0xa68d, 0xa68c, 0xa68f, 0xa68e, + 0xa691, 0xa690, 0xa693, 0xa692, 0xa695, 0xa694, 0xa697, 0xa696, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 167, index 28 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa723, 0xa722, + 0xa725, 0xa724, 0xa727, 0xa726, 0xa729, 0xa728, 0xa72b, 0xa72a, 0xa72d, + 0xa72c, 0xa72f, 0xa72e, 0x0000, 0x0000, 0xa733, 0xa732, 0xa735, 0xa734, + 0xa737, 0xa736, 0xa739, 0xa738, 0xa73b, 0xa73a, 0xa73d, 0xa73c, 0xa73f, + 0xa73e, 0xa741, 0xa740, 0xa743, 0xa742, 0xa745, 0xa744, 0xa747, 0xa746, + 0xa749, 0xa748, 0xa74b, 0xa74a, 0xa74d, 0xa74c, 0xa74f, 0xa74e, 0xa751, + 0xa750, 0xa753, 0xa752, 0xa755, 0xa754, 0xa757, 0xa756, 0xa759, 0xa758, + 0xa75b, 0xa75a, 0xa75d, 0xa75c, 0xa75f, 0xa75e, 0xa761, 0xa760, 0xa763, + 0xa762, 0xa765, 0xa764, 0xa767, 0xa766, 0xa769, 0xa768, 0xa76b, 0xa76a, + 0xa76d, 0xa76c, 0xa76f, 0xa76e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa77a, 0xa779, 0xa77c, 0xa77b, 0x1d79, + 0xa77f, 0xa77e, 0xa781, 0xa780, 0xa783, 0xa782, 0xa785, 0xa784, 0xa787, + 0xa786, 0x0000, 0x0000, 0x0000, 0xa78c, 0xa78b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 168, index 29 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 169, index 30 */ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 170, index 31 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 251, index 32 */ + 0x100000f, 0x1000016, 0x100001d, 0x1000024, 0x100002d, 0x1000036, + 0x100003d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100004f, 0x100005a, 0x1000065, + 0x1000070, 0x100007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000 + }, + { /* page 255, index 33 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, + 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff41, 0xff42, 0xff43, + 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, + 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, + 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, + 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, + 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, + 0xff3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 260, index 34 */ + 0x10428, 0x10429, 0x1042a, 0x1042b, 0x1042c, 0x1042d, 0x1042e, 0x1042f, + 0x10430, 0x10431, 0x10432, 0x10433, 0x10434, 0x10435, 0x10436, 0x10437, + 0x10438, 0x10439, 0x1043a, 0x1043b, 0x1043c, 0x1043d, 0x1043e, 0x1043f, + 0x10440, 0x10441, 0x10442, 0x10443, 0x10444, 0x10445, 0x10446, 0x10447, + 0x10448, 0x10449, 0x1044a, 0x1044b, 0x1044c, 0x1044d, 0x1044e, 0x1044f, + 0x10400, 0x10401, 0x10402, 0x10403, 0x10404, 0x10405, 0x10406, 0x10407, + 0x10408, 0x10409, 0x1040a, 0x1040b, 0x1040c, 0x1040d, 0x1040e, 0x1040f, + 0x10410, 0x10411, 0x10412, 0x10413, 0x10414, 0x10415, 0x10416, 0x10417, + 0x10418, 0x10419, 0x1041a, 0x1041b, 0x1041c, 0x1041d, 0x1041e, 0x1041f, + 0x10420, 0x10421, 0x10422, 0x10423, 0x10424, 0x10425, 0x10426, 0x10427, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 471, index 35 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, + 0x0007, 0x0008, 0x0009, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, + 0x0006, 0x0007, 0x0008, 0x0009 + } +}; + +/* U+0000 through U+2FAFF */ +static const gint16 attr_table_part1[763] = { + 0 /* page 0 */, + 1 /* page 1 */, + 2 /* page 2 */, + 3 /* page 3 */, + 4 /* page 4 */, + 5 /* page 5 */, + 6 /* page 6 */, + 7 /* page 7 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 8 /* page 9 */, + 9 /* page 10 */, + 10 /* page 11 */, + 11 /* page 12 */, + 12 /* page 13 */, + 13 /* page 14 */, + 14 /* page 15 */, + 15 /* page 16 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 16 /* page 23 */, + 17 /* page 24 */, + 18 /* page 25 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 19 /* page 27 */, + 20 /* page 28 */, + 21 /* page 29 */, + 22 /* page 30 */, + 23 /* page 31 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 24 /* page 33 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 25 /* page 44 */, + 26 /* page 45 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 27 /* page 166 */, + 28 /* page 167 */, + 29 /* page 168 */, + 30 /* page 169 */, + 31 /* page 170 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 32 /* page 251 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 33 /* page 255 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 34 /* page 260 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 35 /* page 471 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX +}; + +/* U+E0000 through U+10FFFF */ +static const gint16 attr_table_part2[768] = { + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX +}; + +static const gunichar title_table[][3] = { + { 0x01c5, 0x01c4, 0x01c6 }, + { 0x01c8, 0x01c7, 0x01c9 }, + { 0x01cb, 0x01ca, 0x01cc }, + { 0x01f2, 0x01f1, 0x01f3 }, + { 0x1f88, 0x0000, 0x1f80 }, + { 0x1f89, 0x0000, 0x1f81 }, + { 0x1f8a, 0x0000, 0x1f82 }, + { 0x1f8b, 0x0000, 0x1f83 }, + { 0x1f8c, 0x0000, 0x1f84 }, + { 0x1f8d, 0x0000, 0x1f85 }, + { 0x1f8e, 0x0000, 0x1f86 }, + { 0x1f8f, 0x0000, 0x1f87 }, + { 0x1f98, 0x0000, 0x1f90 }, + { 0x1f99, 0x0000, 0x1f91 }, + { 0x1f9a, 0x0000, 0x1f92 }, + { 0x1f9b, 0x0000, 0x1f93 }, + { 0x1f9c, 0x0000, 0x1f94 }, + { 0x1f9d, 0x0000, 0x1f95 }, + { 0x1f9e, 0x0000, 0x1f96 }, + { 0x1f9f, 0x0000, 0x1f97 }, + { 0x1fa8, 0x0000, 0x1fa0 }, + { 0x1fa9, 0x0000, 0x1fa1 }, + { 0x1faa, 0x0000, 0x1fa2 }, + { 0x1fab, 0x0000, 0x1fa3 }, + { 0x1fac, 0x0000, 0x1fa4 }, + { 0x1fad, 0x0000, 0x1fa5 }, + { 0x1fae, 0x0000, 0x1fa6 }, + { 0x1faf, 0x0000, 0x1fa7 }, + { 0x1fbc, 0x0000, 0x1fb3 }, + { 0x1fcc, 0x0000, 0x1fc3 }, + { 0x1ffc, 0x0000, 0x1ff3 } +}; + + +/* Table of special cases for case conversion; each record contains + * First, the best single character mapping to lowercase if Lu, + * and to uppercase if Ll, followed by the output mapping for the two cases + * other than the case of the codepoint, in the order [Ll],[Lu],[Lt], + * encoded in UTF-8, separated and terminated by a null character. + */ +static const gchar special_case_table[] = { + "\x00\x53\x53\x00\x53\x73\0" /* offset 0 */ + "\x69\x69\xcc\x87\x00\xc4\xb0\0" /* offset 7 */ + "\x00\x46\x46\x00\x46\x66\0" /* offset 15 */ + "\x00\x46\x49\x00\x46\x69\0" /* offset 22 */ + "\x00\x46\x4c\x00\x46\x6c\0" /* offset 29 */ + "\x00\x46\x46\x49\x00\x46\x66\x69\0" /* offset 36 */ + "\x00\x46\x46\x4c\x00\x46\x66\x6c\0" /* offset 45 */ + "\x00\x53\x54\x00\x53\x74\0" /* offset 54 */ + "\x00\x53\x54\x00\x53\x74\0" /* offset 61 */ + "\x00\xd4\xb5\xd5\x92\x00\xd4\xb5\xd6\x82\0" /* offset 68 */ + "\x00\xd5\x84\xd5\x86\x00\xd5\x84\xd5\xb6\0" /* offset 79 */ + "\x00\xd5\x84\xd4\xb5\x00\xd5\x84\xd5\xa5\0" /* offset 90 */ + "\x00\xd5\x84\xd4\xbb\x00\xd5\x84\xd5\xab\0" /* offset 101 */ + "\x00\xd5\x8e\xd5\x86\x00\xd5\x8e\xd5\xb6\0" /* offset 112 */ + "\x00\xd5\x84\xd4\xbd\x00\xd5\x84\xd5\xad\0" /* offset 123 */ + "\x00\xca\xbc\x4e\x00\xca\xbc\x4e\0" /* offset 134 */ + "\x00\xce\x99\xcc\x88\xcc\x81\x00\xce\x99\xcc\x88\xcc\x81\0" /* offset 143 */ + "\x00\xce\xa5\xcc\x88\xcc\x81\x00\xce\xa5\xcc\x88\xcc\x81\0" /* offset 158 */ + "\x00\x4a\xcc\x8c\x00\x4a\xcc\x8c\0" /* offset 173 */ + "\x00\x48\xcc\xb1\x00\x48\xcc\xb1\0" /* offset 182 */ + "\x00\x54\xcc\x88\x00\x54\xcc\x88\0" /* offset 191 */ + "\x00\x57\xcc\x8a\x00\x57\xcc\x8a\0" /* offset 200 */ + "\x00\x59\xcc\x8a\x00\x59\xcc\x8a\0" /* offset 209 */ + "\x00\x41\xca\xbe\x00\x41\xca\xbe\0" /* offset 218 */ + "\x00\xce\xa5\xcc\x93\x00\xce\xa5\xcc\x93\0" /* offset 227 */ + "\x00\xce\xa5\xcc\x93\xcc\x80\x00\xce\xa5\xcc\x93\xcc\x80\0" /* offset 238 */ + "\x00\xce\xa5\xcc\x93\xcc\x81\x00\xce\xa5\xcc\x93\xcc\x81\0" /* offset 253 */ + "\x00\xce\xa5\xcc\x93\xcd\x82\x00\xce\xa5\xcc\x93\xcd\x82\0" /* offset 268 */ + "\x00\xce\x91\xcd\x82\x00\xce\x91\xcd\x82\0" /* offset 283 */ + "\x00\xce\x97\xcd\x82\x00\xce\x97\xcd\x82\0" /* offset 294 */ + "\x00\xce\x99\xcc\x88\xcc\x80\x00\xce\x99\xcc\x88\xcc\x80\0" /* offset 305 */ + "\x00\xce\x99\xcc\x88\xcc\x81\x00\xce\x99\xcc\x88\xcc\x81\0" /* offset 320 */ + "\x00\xce\x99\xcd\x82\x00\xce\x99\xcd\x82\0" /* offset 335 */ + "\x00\xce\x99\xcc\x88\xcd\x82\x00\xce\x99\xcc\x88\xcd\x82\0" /* offset 346 */ + "\x00\xce\xa5\xcc\x88\xcc\x80\x00\xce\xa5\xcc\x88\xcc\x80\0" /* offset 361 */ + "\x00\xce\xa5\xcc\x88\xcc\x81\x00\xce\xa5\xcc\x88\xcc\x81\0" /* offset 376 */ + "\x00\xce\xa1\xcc\x93\x00\xce\xa1\xcc\x93\0" /* offset 391 */ + "\x00\xce\xa5\xcd\x82\x00\xce\xa5\xcd\x82\0" /* offset 402 */ + "\x00\xce\xa5\xcc\x88\xcd\x82\x00\xce\xa5\xcc\x88\xcd\x82\0" /* offset 413 */ + "\x00\xce\xa9\xcd\x82\x00\xce\xa9\xcd\x82\0" /* offset 428 */ + "\xe1\xbe\x88\xe1\xbc\x88\xce\x99\x00\xe1\xbe\x88\0" /* offset 439 */ + "\xe1\xbe\x89\xe1\xbc\x89\xce\x99\x00\xe1\xbe\x89\0" /* offset 452 */ + "\xe1\xbe\x8a\xe1\xbc\x8a\xce\x99\x00\xe1\xbe\x8a\0" /* offset 465 */ + "\xe1\xbe\x8b\xe1\xbc\x8b\xce\x99\x00\xe1\xbe\x8b\0" /* offset 478 */ + "\xe1\xbe\x8c\xe1\xbc\x8c\xce\x99\x00\xe1\xbe\x8c\0" /* offset 491 */ + "\xe1\xbe\x8d\xe1\xbc\x8d\xce\x99\x00\xe1\xbe\x8d\0" /* offset 504 */ + "\xe1\xbe\x8e\xe1\xbc\x8e\xce\x99\x00\xe1\xbe\x8e\0" /* offset 517 */ + "\xe1\xbe\x8f\xe1\xbc\x8f\xce\x99\x00\xe1\xbe\x8f\0" /* offset 530 */ + "\xe1\xbe\x80\x00\xe1\xbc\x88\xce\x99\0" /* offset 543 */ + "\xe1\xbe\x81\x00\xe1\xbc\x89\xce\x99\0" /* offset 553 */ + "\xe1\xbe\x82\x00\xe1\xbc\x8a\xce\x99\0" /* offset 563 */ + "\xe1\xbe\x83\x00\xe1\xbc\x8b\xce\x99\0" /* offset 573 */ + "\xe1\xbe\x84\x00\xe1\xbc\x8c\xce\x99\0" /* offset 583 */ + "\xe1\xbe\x85\x00\xe1\xbc\x8d\xce\x99\0" /* offset 593 */ + "\xe1\xbe\x86\x00\xe1\xbc\x8e\xce\x99\0" /* offset 603 */ + "\xe1\xbe\x87\x00\xe1\xbc\x8f\xce\x99\0" /* offset 613 */ + "\xe1\xbe\x98\xe1\xbc\xa8\xce\x99\x00\xe1\xbe\x98\0" /* offset 623 */ + "\xe1\xbe\x99\xe1\xbc\xa9\xce\x99\x00\xe1\xbe\x99\0" /* offset 636 */ + "\xe1\xbe\x9a\xe1\xbc\xaa\xce\x99\x00\xe1\xbe\x9a\0" /* offset 649 */ + "\xe1\xbe\x9b\xe1\xbc\xab\xce\x99\x00\xe1\xbe\x9b\0" /* offset 662 */ + "\xe1\xbe\x9c\xe1\xbc\xac\xce\x99\x00\xe1\xbe\x9c\0" /* offset 675 */ + "\xe1\xbe\x9d\xe1\xbc\xad\xce\x99\x00\xe1\xbe\x9d\0" /* offset 688 */ + "\xe1\xbe\x9e\xe1\xbc\xae\xce\x99\x00\xe1\xbe\x9e\0" /* offset 701 */ + "\xe1\xbe\x9f\xe1\xbc\xaf\xce\x99\x00\xe1\xbe\x9f\0" /* offset 714 */ + "\xe1\xbe\x90\x00\xe1\xbc\xa8\xce\x99\0" /* offset 727 */ + "\xe1\xbe\x91\x00\xe1\xbc\xa9\xce\x99\0" /* offset 737 */ + "\xe1\xbe\x92\x00\xe1\xbc\xaa\xce\x99\0" /* offset 747 */ + "\xe1\xbe\x93\x00\xe1\xbc\xab\xce\x99\0" /* offset 757 */ + "\xe1\xbe\x94\x00\xe1\xbc\xac\xce\x99\0" /* offset 767 */ + "\xe1\xbe\x95\x00\xe1\xbc\xad\xce\x99\0" /* offset 777 */ + "\xe1\xbe\x96\x00\xe1\xbc\xae\xce\x99\0" /* offset 787 */ + "\xe1\xbe\x97\x00\xe1\xbc\xaf\xce\x99\0" /* offset 797 */ + "\xe1\xbe\xa8\xe1\xbd\xa8\xce\x99\x00\xe1\xbe\xa8\0" /* offset 807 */ + "\xe1\xbe\xa9\xe1\xbd\xa9\xce\x99\x00\xe1\xbe\xa9\0" /* offset 820 */ + "\xe1\xbe\xaa\xe1\xbd\xaa\xce\x99\x00\xe1\xbe\xaa\0" /* offset 833 */ + "\xe1\xbe\xab\xe1\xbd\xab\xce\x99\x00\xe1\xbe\xab\0" /* offset 846 */ + "\xe1\xbe\xac\xe1\xbd\xac\xce\x99\x00\xe1\xbe\xac\0" /* offset 859 */ + "\xe1\xbe\xad\xe1\xbd\xad\xce\x99\x00\xe1\xbe\xad\0" /* offset 872 */ + "\xe1\xbe\xae\xe1\xbd\xae\xce\x99\x00\xe1\xbe\xae\0" /* offset 885 */ + "\xe1\xbe\xaf\xe1\xbd\xaf\xce\x99\x00\xe1\xbe\xaf\0" /* offset 898 */ + "\xe1\xbe\xa0\x00\xe1\xbd\xa8\xce\x99\0" /* offset 911 */ + "\xe1\xbe\xa1\x00\xe1\xbd\xa9\xce\x99\0" /* offset 921 */ + "\xe1\xbe\xa2\x00\xe1\xbd\xaa\xce\x99\0" /* offset 931 */ + "\xe1\xbe\xa3\x00\xe1\xbd\xab\xce\x99\0" /* offset 941 */ + "\xe1\xbe\xa4\x00\xe1\xbd\xac\xce\x99\0" /* offset 951 */ + "\xe1\xbe\xa5\x00\xe1\xbd\xad\xce\x99\0" /* offset 961 */ + "\xe1\xbe\xa6\x00\xe1\xbd\xae\xce\x99\0" /* offset 971 */ + "\xe1\xbe\xa7\x00\xe1\xbd\xaf\xce\x99\0" /* offset 981 */ + "\xe1\xbe\xbc\xce\x91\xce\x99\x00\xe1\xbe\xbc\0" /* offset 991 */ + "\xe1\xbe\xb3\x00\xce\x91\xce\x99\0" /* offset 1003 */ + "\xe1\xbf\x8c\xce\x97\xce\x99\x00\xe1\xbf\x8c\0" /* offset 1012 */ + "\xe1\xbf\x83\x00\xce\x97\xce\x99\0" /* offset 1024 */ + "\xe1\xbf\xbc\xce\xa9\xce\x99\x00\xe1\xbf\xbc\0" /* offset 1033 */ + "\xe1\xbf\xb3\x00\xce\xa9\xce\x99\0" /* offset 1045 */ + "\x00\xe1\xbe\xba\xce\x99\x00\xe1\xbe\xba\xcd\x85\0" /* offset 1054 */ + "\x00\xce\x86\xce\x99\x00\xce\x86\xcd\x85\0" /* offset 1067 */ + "\x00\xe1\xbf\x8a\xce\x99\x00\xe1\xbf\x8a\xcd\x85\0" /* offset 1078 */ + "\x00\xce\x89\xce\x99\x00\xce\x89\xcd\x85\0" /* offset 1091 */ + "\x00\xe1\xbf\xba\xce\x99\x00\xe1\xbf\xba\xcd\x85\0" /* offset 1102 */ + "\x00\xce\x8f\xce\x99\x00\xce\x8f\xcd\x85\0" /* offset 1115 */ + "\x00\xce\x91\xcd\x82\xce\x99\x00\xce\x91\xcd\x82\xcd\x85\0" /* offset 1126 */ + "\x00\xce\x97\xcd\x82\xce\x99\x00\xce\x97\xcd\x82\xcd\x85\0" /* offset 1141 */ + "\x00\xce\xa9\xcd\x82\xce\x99\x00\xce\xa9\xcd\x82\xcd\x85\0" /* offset 1156 */ +}; + + +/* Table of casefolding cases that can't be derived by lowercasing + */ +static const struct { + guint16 ch; + gchar data[7]; +} casefold_table[] = { + { 0x00b5, "\xce\xbc" }, + { 0x00df, "\x73\x73" }, + { 0x0130, "\x69\xcc\x87" }, + { 0x0149, "\xca\xbc\x6e" }, + { 0x017f, "\x73" }, + { 0x01f0, "\x6a\xcc\x8c" }, + { 0x0345, "\xce\xb9" }, + { 0x0390, "\xce\xb9\xcc\x88\xcc\x81" }, + { 0x03b0, "\xcf\x85\xcc\x88\xcc\x81" }, + { 0x03c2, "\xcf\x83" }, + { 0x03d0, "\xce\xb2" }, + { 0x03d1, "\xce\xb8" }, + { 0x03d5, "\xcf\x86" }, + { 0x03d6, "\xcf\x80" }, + { 0x03f0, "\xce\xba" }, + { 0x03f1, "\xcf\x81" }, + { 0x03f5, "\xce\xb5" }, + { 0x0587, "\xd5\xa5\xd6\x82" }, + { 0x1e96, "\x68\xcc\xb1" }, + { 0x1e97, "\x74\xcc\x88" }, + { 0x1e98, "\x77\xcc\x8a" }, + { 0x1e99, "\x79\xcc\x8a" }, + { 0x1e9a, "\x61\xca\xbe" }, + { 0x1e9b, "\xe1\xb9\xa1" }, + { 0x1e9e, "\x73\x73" }, + { 0x1f50, "\xcf\x85\xcc\x93" }, + { 0x1f52, "\xcf\x85\xcc\x93\xcc\x80" }, + { 0x1f54, "\xcf\x85\xcc\x93\xcc\x81" }, + { 0x1f56, "\xcf\x85\xcc\x93\xcd\x82" }, + { 0x1f80, "\xe1\xbc\x80\xce\xb9" }, + { 0x1f81, "\xe1\xbc\x81\xce\xb9" }, + { 0x1f82, "\xe1\xbc\x82\xce\xb9" }, + { 0x1f83, "\xe1\xbc\x83\xce\xb9" }, + { 0x1f84, "\xe1\xbc\x84\xce\xb9" }, + { 0x1f85, "\xe1\xbc\x85\xce\xb9" }, + { 0x1f86, "\xe1\xbc\x86\xce\xb9" }, + { 0x1f87, "\xe1\xbc\x87\xce\xb9" }, + { 0x1f88, "\xe1\xbc\x80\xce\xb9" }, + { 0x1f89, "\xe1\xbc\x81\xce\xb9" }, + { 0x1f8a, "\xe1\xbc\x82\xce\xb9" }, + { 0x1f8b, "\xe1\xbc\x83\xce\xb9" }, + { 0x1f8c, "\xe1\xbc\x84\xce\xb9" }, + { 0x1f8d, "\xe1\xbc\x85\xce\xb9" }, + { 0x1f8e, "\xe1\xbc\x86\xce\xb9" }, + { 0x1f8f, "\xe1\xbc\x87\xce\xb9" }, + { 0x1f90, "\xe1\xbc\xa0\xce\xb9" }, + { 0x1f91, "\xe1\xbc\xa1\xce\xb9" }, + { 0x1f92, "\xe1\xbc\xa2\xce\xb9" }, + { 0x1f93, "\xe1\xbc\xa3\xce\xb9" }, + { 0x1f94, "\xe1\xbc\xa4\xce\xb9" }, + { 0x1f95, "\xe1\xbc\xa5\xce\xb9" }, + { 0x1f96, "\xe1\xbc\xa6\xce\xb9" }, + { 0x1f97, "\xe1\xbc\xa7\xce\xb9" }, + { 0x1f98, "\xe1\xbc\xa0\xce\xb9" }, + { 0x1f99, "\xe1\xbc\xa1\xce\xb9" }, + { 0x1f9a, "\xe1\xbc\xa2\xce\xb9" }, + { 0x1f9b, "\xe1\xbc\xa3\xce\xb9" }, + { 0x1f9c, "\xe1\xbc\xa4\xce\xb9" }, + { 0x1f9d, "\xe1\xbc\xa5\xce\xb9" }, + { 0x1f9e, "\xe1\xbc\xa6\xce\xb9" }, + { 0x1f9f, "\xe1\xbc\xa7\xce\xb9" }, + { 0x1fa0, "\xe1\xbd\xa0\xce\xb9" }, + { 0x1fa1, "\xe1\xbd\xa1\xce\xb9" }, + { 0x1fa2, "\xe1\xbd\xa2\xce\xb9" }, + { 0x1fa3, "\xe1\xbd\xa3\xce\xb9" }, + { 0x1fa4, "\xe1\xbd\xa4\xce\xb9" }, + { 0x1fa5, "\xe1\xbd\xa5\xce\xb9" }, + { 0x1fa6, "\xe1\xbd\xa6\xce\xb9" }, + { 0x1fa7, "\xe1\xbd\xa7\xce\xb9" }, + { 0x1fa8, "\xe1\xbd\xa0\xce\xb9" }, + { 0x1fa9, "\xe1\xbd\xa1\xce\xb9" }, + { 0x1faa, "\xe1\xbd\xa2\xce\xb9" }, + { 0x1fab, "\xe1\xbd\xa3\xce\xb9" }, + { 0x1fac, "\xe1\xbd\xa4\xce\xb9" }, + { 0x1fad, "\xe1\xbd\xa5\xce\xb9" }, + { 0x1fae, "\xe1\xbd\xa6\xce\xb9" }, + { 0x1faf, "\xe1\xbd\xa7\xce\xb9" }, + { 0x1fb2, "\xe1\xbd\xb0\xce\xb9" }, + { 0x1fb3, "\xce\xb1\xce\xb9" }, + { 0x1fb4, "\xce\xac\xce\xb9" }, + { 0x1fb6, "\xce\xb1\xcd\x82" }, + { 0x1fb7, "\xce\xb1\xcd\x82\xce\xb9" }, + { 0x1fbc, "\xce\xb1\xce\xb9" }, + { 0x1fbe, "\xce\xb9" }, + { 0x1fc2, "\xe1\xbd\xb4\xce\xb9" }, + { 0x1fc3, "\xce\xb7\xce\xb9" }, + { 0x1fc4, "\xce\xae\xce\xb9" }, + { 0x1fc6, "\xce\xb7\xcd\x82" }, + { 0x1fc7, "\xce\xb7\xcd\x82\xce\xb9" }, + { 0x1fcc, "\xce\xb7\xce\xb9" }, + { 0x1fd2, "\xce\xb9\xcc\x88\xcc\x80" }, + { 0x1fd3, "\xce\xb9\xcc\x88\xcc\x81" }, + { 0x1fd6, "\xce\xb9\xcd\x82" }, + { 0x1fd7, "\xce\xb9\xcc\x88\xcd\x82" }, + { 0x1fe2, "\xcf\x85\xcc\x88\xcc\x80" }, + { 0x1fe3, "\xcf\x85\xcc\x88\xcc\x81" }, + { 0x1fe4, "\xcf\x81\xcc\x93" }, + { 0x1fe6, "\xcf\x85\xcd\x82" }, + { 0x1fe7, "\xcf\x85\xcc\x88\xcd\x82" }, + { 0x1ff2, "\xe1\xbd\xbc\xce\xb9" }, + { 0x1ff3, "\xcf\x89\xce\xb9" }, + { 0x1ff4, "\xcf\x8e\xce\xb9" }, + { 0x1ff6, "\xcf\x89\xcd\x82" }, + { 0x1ff7, "\xcf\x89\xcd\x82\xce\xb9" }, + { 0x1ffc, "\xcf\x89\xce\xb9" }, + { 0x2160, "\xe2\x85\xb0" }, + { 0x2161, "\xe2\x85\xb1" }, + { 0x2162, "\xe2\x85\xb2" }, + { 0x2163, "\xe2\x85\xb3" }, + { 0x2164, "\xe2\x85\xb4" }, + { 0x2165, "\xe2\x85\xb5" }, + { 0x2166, "\xe2\x85\xb6" }, + { 0x2167, "\xe2\x85\xb7" }, + { 0x2168, "\xe2\x85\xb8" }, + { 0x2169, "\xe2\x85\xb9" }, + { 0x216a, "\xe2\x85\xba" }, + { 0x216b, "\xe2\x85\xbb" }, + { 0x216c, "\xe2\x85\xbc" }, + { 0x216d, "\xe2\x85\xbd" }, + { 0x216e, "\xe2\x85\xbe" }, + { 0x216f, "\xe2\x85\xbf" }, + { 0x24b6, "\xe2\x93\x90" }, + { 0x24b7, "\xe2\x93\x91" }, + { 0x24b8, "\xe2\x93\x92" }, + { 0x24b9, "\xe2\x93\x93" }, + { 0x24ba, "\xe2\x93\x94" }, + { 0x24bb, "\xe2\x93\x95" }, + { 0x24bc, "\xe2\x93\x96" }, + { 0x24bd, "\xe2\x93\x97" }, + { 0x24be, "\xe2\x93\x98" }, + { 0x24bf, "\xe2\x93\x99" }, + { 0x24c0, "\xe2\x93\x9a" }, + { 0x24c1, "\xe2\x93\x9b" }, + { 0x24c2, "\xe2\x93\x9c" }, + { 0x24c3, "\xe2\x93\x9d" }, + { 0x24c4, "\xe2\x93\x9e" }, + { 0x24c5, "\xe2\x93\x9f" }, + { 0x24c6, "\xe2\x93\xa0" }, + { 0x24c7, "\xe2\x93\xa1" }, + { 0x24c8, "\xe2\x93\xa2" }, + { 0x24c9, "\xe2\x93\xa3" }, + { 0x24ca, "\xe2\x93\xa4" }, + { 0x24cb, "\xe2\x93\xa5" }, + { 0x24cc, "\xe2\x93\xa6" }, + { 0x24cd, "\xe2\x93\xa7" }, + { 0x24ce, "\xe2\x93\xa8" }, + { 0x24cf, "\xe2\x93\xa9" }, + { 0xfb00, "\x66\x66" }, + { 0xfb01, "\x66\x69" }, + { 0xfb02, "\x66\x6c" }, + { 0xfb03, "\x66\x66\x69" }, + { 0xfb04, "\x66\x66\x6c" }, + { 0xfb05, "\x73\x74" }, + { 0xfb06, "\x73\x74" }, + { 0xfb13, "\xd5\xb4\xd5\xb6" }, + { 0xfb14, "\xd5\xb4\xd5\xa5" }, + { 0xfb15, "\xd5\xb4\xd5\xab" }, + { 0xfb16, "\xd5\xbe\xd5\xb6" }, + { 0xfb17, "\xd5\xb4\xd5\xad" }, +}; + +#endif /* CHARTABLES_H */ diff --git a/glib/gunicode.h b/glib/gunicode.h new file mode 100644 index 0000000..78b259e --- /dev/null +++ b/glib/gunicode.h @@ -0,0 +1,404 @@ +/* gunicode.h - Unicode manipulation functions + * + * Copyright (C) 1999, 2000 Tom Tromey + * Copyright 2000, 2005 Red Hat, Inc. + * + * The Gnome 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 of the + * License, or (at your option) any later version. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_UNICODE_H__ +#define __G_UNICODE_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef guint32 gunichar; +typedef guint16 gunichar2; + +/* These are the possible character classifications. + * See http://www.unicode.org/Public/UNIDATA/UCD.html#General_Category_Values + */ +typedef enum +{ + G_UNICODE_CONTROL, + G_UNICODE_FORMAT, + G_UNICODE_UNASSIGNED, + G_UNICODE_PRIVATE_USE, + G_UNICODE_SURROGATE, + G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, + G_UNICODE_TITLECASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_COMBINING_MARK, + G_UNICODE_ENCLOSING_MARK, + G_UNICODE_NON_SPACING_MARK, + G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_LETTER_NUMBER, + G_UNICODE_OTHER_NUMBER, + G_UNICODE_CONNECT_PUNCTUATION, + G_UNICODE_DASH_PUNCTUATION, + G_UNICODE_CLOSE_PUNCTUATION, + G_UNICODE_FINAL_PUNCTUATION, + G_UNICODE_INITIAL_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OPEN_PUNCTUATION, + G_UNICODE_CURRENCY_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MATH_SYMBOL, + G_UNICODE_OTHER_SYMBOL, + G_UNICODE_LINE_SEPARATOR, + G_UNICODE_PARAGRAPH_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR +} GUnicodeType; + +/* These are the possible line break classifications. + * Note that new types may be added in the future. + * Implementations may regard unknown values like G_UNICODE_BREAK_UNKNOWN + * See http://www.unicode.org/unicode/reports/tr14/ + */ +typedef enum +{ + G_UNICODE_BREAK_MANDATORY, + G_UNICODE_BREAK_CARRIAGE_RETURN, + G_UNICODE_BREAK_LINE_FEED, + G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_SURROGATE, + G_UNICODE_BREAK_ZERO_WIDTH_SPACE, + G_UNICODE_BREAK_INSEPARABLE, + G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_CONTINGENT, + G_UNICODE_BREAK_SPACE, + G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_BEFORE_AND_AFTER, + G_UNICODE_BREAK_HYPHEN, + G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_INFIX_SEPARATOR, + G_UNICODE_BREAK_SYMBOL, + G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, + G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NEXT_LINE, + G_UNICODE_BREAK_WORD_JOINER, + G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_V_JAMO, + G_UNICODE_BREAK_HANGUL_T_JAMO, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE +} GUnicodeBreakType; + +typedef enum +{ /* ISO 15924 code */ + G_UNICODE_SCRIPT_INVALID_CODE = -1, + G_UNICODE_SCRIPT_COMMON = 0, /* Zyyy */ + G_UNICODE_SCRIPT_INHERITED, /* Qaai */ + G_UNICODE_SCRIPT_ARABIC, /* Arab */ + G_UNICODE_SCRIPT_ARMENIAN, /* Armn */ + G_UNICODE_SCRIPT_BENGALI, /* Beng */ + G_UNICODE_SCRIPT_BOPOMOFO, /* Bopo */ + G_UNICODE_SCRIPT_CHEROKEE, /* Cher */ + G_UNICODE_SCRIPT_COPTIC, /* Qaac */ + G_UNICODE_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */ + G_UNICODE_SCRIPT_DESERET, /* Dsrt */ + G_UNICODE_SCRIPT_DEVANAGARI, /* Deva */ + G_UNICODE_SCRIPT_ETHIOPIC, /* Ethi */ + G_UNICODE_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */ + G_UNICODE_SCRIPT_GOTHIC, /* Goth */ + G_UNICODE_SCRIPT_GREEK, /* Grek */ + G_UNICODE_SCRIPT_GUJARATI, /* Gujr */ + G_UNICODE_SCRIPT_GURMUKHI, /* Guru */ + G_UNICODE_SCRIPT_HAN, /* Hani */ + G_UNICODE_SCRIPT_HANGUL, /* Hang */ + G_UNICODE_SCRIPT_HEBREW, /* Hebr */ + G_UNICODE_SCRIPT_HIRAGANA, /* Hira */ + G_UNICODE_SCRIPT_KANNADA, /* Knda */ + G_UNICODE_SCRIPT_KATAKANA, /* Kana */ + G_UNICODE_SCRIPT_KHMER, /* Khmr */ + G_UNICODE_SCRIPT_LAO, /* Laoo */ + G_UNICODE_SCRIPT_LATIN, /* Latn (Latf, Latg) */ + G_UNICODE_SCRIPT_MALAYALAM, /* Mlym */ + G_UNICODE_SCRIPT_MONGOLIAN, /* Mong */ + G_UNICODE_SCRIPT_MYANMAR, /* Mymr */ + G_UNICODE_SCRIPT_OGHAM, /* Ogam */ + G_UNICODE_SCRIPT_OLD_ITALIC, /* Ital */ + G_UNICODE_SCRIPT_ORIYA, /* Orya */ + G_UNICODE_SCRIPT_RUNIC, /* Runr */ + G_UNICODE_SCRIPT_SINHALA, /* Sinh */ + G_UNICODE_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */ + G_UNICODE_SCRIPT_TAMIL, /* Taml */ + G_UNICODE_SCRIPT_TELUGU, /* Telu */ + G_UNICODE_SCRIPT_THAANA, /* Thaa */ + G_UNICODE_SCRIPT_THAI, /* Thai */ + G_UNICODE_SCRIPT_TIBETAN, /* Tibt */ + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */ + G_UNICODE_SCRIPT_YI, /* Yiii */ + G_UNICODE_SCRIPT_TAGALOG, /* Tglg */ + G_UNICODE_SCRIPT_HANUNOO, /* Hano */ + G_UNICODE_SCRIPT_BUHID, /* Buhd */ + G_UNICODE_SCRIPT_TAGBANWA, /* Tagb */ + + /* Unicode-4.0 additions */ + G_UNICODE_SCRIPT_BRAILLE, /* Brai */ + G_UNICODE_SCRIPT_CYPRIOT, /* Cprt */ + G_UNICODE_SCRIPT_LIMBU, /* Limb */ + G_UNICODE_SCRIPT_OSMANYA, /* Osma */ + G_UNICODE_SCRIPT_SHAVIAN, /* Shaw */ + G_UNICODE_SCRIPT_LINEAR_B, /* Linb */ + G_UNICODE_SCRIPT_TAI_LE, /* Tale */ + G_UNICODE_SCRIPT_UGARITIC, /* Ugar */ + + /* Unicode-4.1 additions */ + G_UNICODE_SCRIPT_NEW_TAI_LUE, /* Talu */ + G_UNICODE_SCRIPT_BUGINESE, /* Bugi */ + G_UNICODE_SCRIPT_GLAGOLITIC, /* Glag */ + G_UNICODE_SCRIPT_TIFINAGH, /* Tfng */ + G_UNICODE_SCRIPT_SYLOTI_NAGRI, /* Sylo */ + G_UNICODE_SCRIPT_OLD_PERSIAN, /* Xpeo */ + G_UNICODE_SCRIPT_KHAROSHTHI, /* Khar */ + + /* Unicode-5.0 additions */ + G_UNICODE_SCRIPT_UNKNOWN, /* Zzzz */ + G_UNICODE_SCRIPT_BALINESE, /* Bali */ + G_UNICODE_SCRIPT_CUNEIFORM, /* Xsux */ + G_UNICODE_SCRIPT_PHOENICIAN, /* Phnx */ + G_UNICODE_SCRIPT_PHAGS_PA, /* Phag */ + G_UNICODE_SCRIPT_NKO, /* Nkoo */ + + /* Unicode-5.1 additions */ + G_UNICODE_SCRIPT_KAYAH_LI, /* Kali */ + G_UNICODE_SCRIPT_LEPCHA, /* Lepc */ + G_UNICODE_SCRIPT_REJANG, /* Rjng */ + G_UNICODE_SCRIPT_SUNDANESE, /* Sund */ + G_UNICODE_SCRIPT_SAURASHTRA, /* Saur */ + G_UNICODE_SCRIPT_CHAM, /* Cham */ + G_UNICODE_SCRIPT_OL_CHIKI, /* Olck */ + G_UNICODE_SCRIPT_VAI, /* Vaii */ + G_UNICODE_SCRIPT_CARIAN, /* Cari */ + G_UNICODE_SCRIPT_LYCIAN, /* Lyci */ + G_UNICODE_SCRIPT_LYDIAN /* Lydi */ +} GUnicodeScript; + +/* Returns TRUE if current locale uses UTF-8 charset. If CHARSET is + * not null, sets *CHARSET to the name of the current locale's + * charset. This value is statically allocated, and should be copied + * in case the locale's charset will be changed later using setlocale() + * or in some other way. + */ +gboolean g_get_charset (G_CONST_RETURN char **charset); + +/* These are all analogs of the functions. + */ +gboolean g_unichar_isalnum (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isalpha (gunichar c) G_GNUC_CONST; +gboolean g_unichar_iscntrl (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isdigit (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isgraph (gunichar c) G_GNUC_CONST; +gboolean g_unichar_islower (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isprint (gunichar c) G_GNUC_CONST; +gboolean g_unichar_ispunct (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isspace (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isupper (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isxdigit (gunichar c) G_GNUC_CONST; +gboolean g_unichar_istitle (gunichar c) G_GNUC_CONST; +gboolean g_unichar_isdefined (gunichar c) G_GNUC_CONST; +gboolean g_unichar_iswide (gunichar c) G_GNUC_CONST; +gboolean g_unichar_iswide_cjk(gunichar c) G_GNUC_CONST; +gboolean g_unichar_iszerowidth(gunichar c) G_GNUC_CONST; +gboolean g_unichar_ismark (gunichar c) G_GNUC_CONST; + +/* More functions. These convert between the three cases. + * See the Unicode book to understand title case. */ +gunichar g_unichar_toupper (gunichar c) G_GNUC_CONST; +gunichar g_unichar_tolower (gunichar c) G_GNUC_CONST; +gunichar g_unichar_totitle (gunichar c) G_GNUC_CONST; + +/* If C is a digit (according to `g_unichar_isdigit'), then return its + numeric value. Otherwise return -1. */ +gint g_unichar_digit_value (gunichar c) G_GNUC_CONST; + +gint g_unichar_xdigit_value (gunichar c) G_GNUC_CONST; + +/* Return the Unicode character type of a given character. */ +GUnicodeType g_unichar_type (gunichar c) G_GNUC_CONST; + +/* Return the line break property for a given character */ +GUnicodeBreakType g_unichar_break_type (gunichar c) G_GNUC_CONST; + +/* Returns the combining class for a given character */ +gint g_unichar_combining_class (gunichar uc) G_GNUC_CONST; + + +/* Compute canonical ordering of a string in-place. This rearranges + decomposed characters in the string according to their combining + classes. See the Unicode manual for more information. */ +void g_unicode_canonical_ordering (gunichar *string, + gsize len); + +/* Compute canonical decomposition of a character. Returns g_malloc()d + string of Unicode characters. RESULT_LEN is set to the resulting + length of the string. */ +gunichar *g_unicode_canonical_decomposition (gunichar ch, + gsize *result_len) G_GNUC_MALLOC; + +/* Array of skip-bytes-per-initial character. + */ +GLIB_VAR const gchar * const g_utf8_skip; + +#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(const guchar *)(p)]) + +gunichar g_utf8_get_char (const gchar *p) G_GNUC_PURE; +gunichar g_utf8_get_char_validated (const gchar *p, + gssize max_len) G_GNUC_PURE; + +gchar* g_utf8_offset_to_pointer (const gchar *str, + glong offset) G_GNUC_PURE; +glong g_utf8_pointer_to_offset (const gchar *str, + const gchar *pos) G_GNUC_PURE; +gchar* g_utf8_prev_char (const gchar *p) G_GNUC_PURE; +gchar* g_utf8_find_next_char (const gchar *p, + const gchar *end) G_GNUC_PURE; +gchar* g_utf8_find_prev_char (const gchar *str, + const gchar *p) G_GNUC_PURE; + +glong g_utf8_strlen (const gchar *p, + gssize max) G_GNUC_PURE; + +/* Copies n characters from src to dest */ +gchar* g_utf8_strncpy (gchar *dest, + const gchar *src, + gsize n); + +/* Find the UTF-8 character corresponding to ch, in string p. These + functions are equivalants to strchr and strrchr */ +gchar* g_utf8_strchr (const gchar *p, + gssize len, + gunichar c); +gchar* g_utf8_strrchr (const gchar *p, + gssize len, + gunichar c); +gchar* g_utf8_strreverse (const gchar *str, + gssize len); + +gunichar2 *g_utf8_to_utf16 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +gunichar * g_utf8_to_ucs4 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +gunichar * g_utf8_to_ucs4_fast (const gchar *str, + glong len, + glong *items_written) G_GNUC_MALLOC; +gunichar * g_utf16_to_ucs4 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +gchar* g_utf16_to_utf8 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +gunichar2 *g_ucs4_to_utf16 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +gchar* g_ucs4_to_utf8 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; + +/* Convert a single character into UTF-8. outbuf must have at + * least 6 bytes of space. Returns the number of bytes in the + * result. + */ +gint g_unichar_to_utf8 (gunichar c, + gchar *outbuf); + +/* Validate a UTF8 string, return TRUE if valid, put pointer to + * first invalid char in **end + */ + +gboolean g_utf8_validate (const gchar *str, + gssize max_len, + const gchar **end); + +/* Validate a Unicode character */ +gboolean g_unichar_validate (gunichar ch) G_GNUC_CONST; + +gchar *g_utf8_strup (const gchar *str, + gssize len) G_GNUC_MALLOC; +gchar *g_utf8_strdown (const gchar *str, + gssize len) G_GNUC_MALLOC; +gchar *g_utf8_casefold (const gchar *str, + gssize len) G_GNUC_MALLOC; + +typedef enum { + G_NORMALIZE_DEFAULT, + G_NORMALIZE_NFD = G_NORMALIZE_DEFAULT, + G_NORMALIZE_DEFAULT_COMPOSE, + G_NORMALIZE_NFC = G_NORMALIZE_DEFAULT_COMPOSE, + G_NORMALIZE_ALL, + G_NORMALIZE_NFKD = G_NORMALIZE_ALL, + G_NORMALIZE_ALL_COMPOSE, + G_NORMALIZE_NFKC = G_NORMALIZE_ALL_COMPOSE +} GNormalizeMode; + +gchar *g_utf8_normalize (const gchar *str, + gssize len, + GNormalizeMode mode) G_GNUC_MALLOC; + +gint g_utf8_collate (const gchar *str1, + const gchar *str2) G_GNUC_PURE; +gchar *g_utf8_collate_key (const gchar *str, + gssize len) G_GNUC_MALLOC; +gchar *g_utf8_collate_key_for_filename (const gchar *str, + gssize len) G_GNUC_MALLOC; + +gboolean g_unichar_get_mirror_char (gunichar ch, + gunichar *mirrored_ch); + +GUnicodeScript g_unichar_get_script (gunichar ch) G_GNUC_CONST; + + +/* private */ + +gchar *_g_utf8_make_valid (const gchar *name); + +G_END_DECLS + +#endif /* __G_UNICODE_H__ */ diff --git a/glib/gunicodeprivate.h b/glib/gunicodeprivate.h new file mode 100644 index 0000000..70539d4 --- /dev/null +++ b/glib/gunicodeprivate.h @@ -0,0 +1,35 @@ +/* gunicodeprivate.h + * + * Copyright (C) 2003 Noah Levitt + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_UNICODE_PRIVATE_H__ +#define __G_UNICODE_PRIVATE_H__ + +#include "glib.h" + +G_BEGIN_DECLS + +G_GNUC_INTERNAL gunichar *_g_utf8_normalize_wc + (const gchar *str, + gssize max_len, + GNormalizeMode mode); + +G_END_DECLS + +#endif /* __G_UNICODE_PRIVATE_H__ */ diff --git a/glib/gunicollate.c b/glib/gunicollate.c new file mode 100644 index 0000000..2bf579e --- /dev/null +++ b/glib/gunicollate.c @@ -0,0 +1,679 @@ +/* gunicollate.c - Collation + * + * Copyright 2001,2005 Red Hat, Inc. + * + * The Gnome 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 of the + * License, or (at your option) any later version. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#ifdef __STDC_ISO_10646__ +#include +#endif + +#ifdef HAVE_CARBON +#include +#endif + +#include "glib.h" +#include "gunicodeprivate.h" +#include "galias.h" + +#ifdef _MSC_VER +/* Workaround for bug in MSVCR80.DLL */ +static gsize +msc_strxfrm_wrapper (char *string1, + const char *string2, + gsize count) +{ + if (!string1 || count <= 0) + { + char tmp; + + return strxfrm (&tmp, string2, 1); + } + return strxfrm (string1, string2, count); +} +#define strxfrm msc_strxfrm_wrapper +#endif + +/** + * g_utf8_collate: + * @str1: a UTF-8 encoded string + * @str2: a UTF-8 encoded string + * + * Compares two strings for ordering using the linguistically + * correct rules for the current locale. + * When sorting a large number of strings, it will be significantly + * faster to obtain collation keys with g_utf8_collate_key() and + * compare the keys with strcmp() when sorting instead of sorting + * the original strings. + * + * Return value: < 0 if @str1 compares before @str2, + * 0 if they compare equal, > 0 if @str1 compares after @str2. + **/ +gint +g_utf8_collate (const gchar *str1, + const gchar *str2) +{ + gint result; + +#ifdef HAVE_CARBON + + UniChar *str1_utf16; + UniChar *str2_utf16; + glong len1; + glong len2; + SInt32 retval = 0; + + g_return_val_if_fail (str1 != NULL, 0); + g_return_val_if_fail (str2 != NULL, 0); + + str1_utf16 = g_utf8_to_utf16 (str1, -1, NULL, &len1, NULL); + str2_utf16 = g_utf8_to_utf16 (str2, -1, NULL, &len2, NULL); + + UCCompareTextDefault (kUCCollateStandardOptions, + str1_utf16, len1, str2_utf16, len2, + NULL, &retval); + result = retval; + + g_free (str2_utf16); + g_free (str1_utf16); + +#elif defined(__STDC_ISO_10646__) + + gunichar *str1_norm; + gunichar *str2_norm; + + g_return_val_if_fail (str1 != NULL, 0); + g_return_val_if_fail (str2 != NULL, 0); + + str1_norm = _g_utf8_normalize_wc (str1, -1, G_NORMALIZE_ALL_COMPOSE); + str2_norm = _g_utf8_normalize_wc (str2, -1, G_NORMALIZE_ALL_COMPOSE); + + result = wcscoll ((wchar_t *)str1_norm, (wchar_t *)str2_norm); + + g_free (str1_norm); + g_free (str2_norm); + +#else /* !__STDC_ISO_10646__ */ + + const gchar *charset; + gchar *str1_norm; + gchar *str2_norm; + + g_return_val_if_fail (str1 != NULL, 0); + g_return_val_if_fail (str2 != NULL, 0); + + str1_norm = g_utf8_normalize (str1, -1, G_NORMALIZE_ALL_COMPOSE); + str2_norm = g_utf8_normalize (str2, -1, G_NORMALIZE_ALL_COMPOSE); + + if (g_get_charset (&charset)) + { + result = strcoll (str1_norm, str2_norm); + } + else + { + gchar *str1_locale = g_convert (str1_norm, -1, charset, "UTF-8", NULL, NULL, NULL); + gchar *str2_locale = g_convert (str2_norm, -1, charset, "UTF-8", NULL, NULL, NULL); + + if (str1_locale && str2_locale) + result = strcoll (str1_locale, str2_locale); + else if (str1_locale) + result = -1; + else if (str2_locale) + result = 1; + else + result = strcmp (str1_norm, str2_norm); + + g_free (str1_locale); + g_free (str2_locale); + } + + g_free (str1_norm); + g_free (str2_norm); + +#endif /* __STDC_ISO_10646__ */ + + return result; +} + +#if defined(__STDC_ISO_10646__) || defined(HAVE_CARBON) +/* We need UTF-8 encoding of numbers to encode the weights if + * we are using wcsxfrm. However, we aren't encoding Unicode + * characters, so we can't simply use g_unichar_to_utf8. + * + * The following routine is taken (with modification) from GNU + * libc's strxfrm routine: + * + * Copyright (C) 1995-1999,2000,2001 Free Software Foundation, Inc. + * Written by Ulrich Drepper , 1995. + */ +static inline int +utf8_encode (char *buf, wchar_t val) +{ + int retval; + + if (val < 0x80) + { + if (buf) + *buf++ = (char) val; + retval = 1; + } + else + { + int step; + + for (step = 2; step < 6; ++step) + if ((val & (~(guint32)0 << (5 * step + 1))) == 0) + break; + retval = step; + + if (buf) + { + *buf = (unsigned char) (~0xff >> step); + --step; + do + { + buf[step] = 0x80 | (val & 0x3f); + val >>= 6; + } + while (--step > 0); + *buf |= val; + } + } + + return retval; +} +#endif /* __STDC_ISO_10646__ || HAVE_CARBON */ + +#ifdef HAVE_CARBON + +static gchar * +collate_key_to_string (UCCollationValue *key, + gsize key_len) +{ + gchar *result; + gsize result_len; + gsize i; + + /* Pretty smart algorithm here: ignore first eight bytes of the + * collation key. It doesn't produce results equivalent to + * UCCompareCollationKeys's, but the difference seems to be only + * that UCCompareCollationKeys in some cases produces 0 where our + * comparison gets -1 or 1. */ + + if (key_len * sizeof (UCCollationValue) <= 8) + return g_strdup (""); + + result_len = 0; + for (i = 8; i < key_len * sizeof (UCCollationValue); i++) + /* there may be nul bytes, encode byteval+1 */ + result_len += utf8_encode (NULL, *((guchar*)key + i) + 1); + + result = g_malloc (result_len + 1); + result_len = 0; + for (i = 8; i < key_len * sizeof (UCCollationValue); i++) + result_len += utf8_encode (result + result_len, *((guchar*)key + i) + 1); + + result[result_len] = 0; + return result; +} + +static gchar * +carbon_collate_key_with_collator (const gchar *str, + gssize len, + CollatorRef collator) +{ + UniChar *str_utf16 = NULL; + glong len_utf16; + OSStatus ret; + UCCollationValue staticbuf[512]; + UCCollationValue *freeme = NULL; + UCCollationValue *buf; + ItemCount buf_len; + ItemCount key_len; + ItemCount try_len; + gchar *result = NULL; + + str_utf16 = g_utf8_to_utf16 (str, len, NULL, &len_utf16, NULL); + try_len = len_utf16 * 5 + 2; + + if (try_len <= sizeof staticbuf) + { + buf = staticbuf; + buf_len = sizeof staticbuf; + } + else + { + freeme = g_new (UCCollationValue, try_len); + buf = freeme; + buf_len = try_len; + } + + ret = UCGetCollationKey (collator, str_utf16, len_utf16, + buf_len, &key_len, buf); + + if (ret == kCollateBufferTooSmall) + { + freeme = g_renew (UCCollationValue, freeme, try_len * 2); + buf = freeme; + buf_len = try_len * 2; + ret = UCGetCollationKey (collator, str_utf16, len_utf16, + buf_len, &key_len, buf); + } + + if (ret == 0) + result = collate_key_to_string (buf, key_len); + else + result = g_strdup (""); + + g_free (freeme); + g_free (str_utf16); + return result; +} + +static gchar * +carbon_collate_key (const gchar *str, + gssize len) +{ + static CollatorRef collator; + + if (G_UNLIKELY (!collator)) + { + UCCreateCollator (NULL, 0, kUCCollateStandardOptions, &collator); + + if (!collator) + { + static gboolean been_here; + if (!been_here) + g_warning ("%s: UCCreateCollator failed", G_STRLOC); + been_here = TRUE; + return g_strdup (""); + } + } + + return carbon_collate_key_with_collator (str, len, collator); +} + +static gchar * +carbon_collate_key_for_filename (const gchar *str, + gssize len) +{ + static CollatorRef collator; + + if (G_UNLIKELY (!collator)) + { + /* http://developer.apple.com/qa/qa2004/qa1159.html */ + UCCreateCollator (NULL, 0, + kUCCollateComposeInsensitiveMask + | kUCCollateWidthInsensitiveMask + | kUCCollateCaseInsensitiveMask + | kUCCollateDigitsOverrideMask + | kUCCollateDigitsAsNumberMask + | kUCCollatePunctuationSignificantMask, + &collator); + + if (!collator) + { + static gboolean been_here; + if (!been_here) + g_warning ("%s: UCCreateCollator failed", G_STRLOC); + been_here = TRUE; + return g_strdup (""); + } + } + + return carbon_collate_key_with_collator (str, len, collator); +} + +#endif /* HAVE_CARBON */ + +/** + * g_utf8_collate_key: + * @str: a UTF-8 encoded string. + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * + * Converts a string into a collation key that can be compared + * with other collation keys produced by the same function using + * strcmp(). + * + * The results of comparing the collation keys of two strings + * with strcmp() will always be the same as comparing the two + * original keys with g_utf8_collate(). + * + * Note that this function depends on the + * current locale. + * + * Return value: a newly allocated string. This string should + * be freed with g_free() when you are done with it. + **/ +gchar * +g_utf8_collate_key (const gchar *str, + gssize len) +{ + gchar *result; + +#ifdef HAVE_CARBON + + g_return_val_if_fail (str != NULL, NULL); + result = carbon_collate_key (str, len); + +#elif defined(__STDC_ISO_10646__) + + gsize xfrm_len; + gunichar *str_norm; + wchar_t *result_wc; + gsize i; + gsize result_len = 0; + + g_return_val_if_fail (str != NULL, NULL); + + str_norm = _g_utf8_normalize_wc (str, len, G_NORMALIZE_ALL_COMPOSE); + + xfrm_len = wcsxfrm (NULL, (wchar_t *)str_norm, 0); + result_wc = g_new (wchar_t, xfrm_len + 1); + wcsxfrm (result_wc, (wchar_t *)str_norm, xfrm_len + 1); + + for (i=0; i < xfrm_len; i++) + result_len += utf8_encode (NULL, result_wc[i]); + + result = g_malloc (result_len + 1); + result_len = 0; + for (i=0; i < xfrm_len; i++) + result_len += utf8_encode (result + result_len, result_wc[i]); + + result[result_len] = '\0'; + + g_free (result_wc); + g_free (str_norm); + + return result; +#else /* !__STDC_ISO_10646__ */ + + gsize xfrm_len; + const gchar *charset; + gchar *str_norm; + + g_return_val_if_fail (str != NULL, NULL); + + str_norm = g_utf8_normalize (str, len, G_NORMALIZE_ALL_COMPOSE); + + result = NULL; + + if (g_get_charset (&charset)) + { + xfrm_len = strxfrm (NULL, str_norm, 0); + if (xfrm_len >= 0 && xfrm_len < G_MAXINT - 2) + { + result = g_malloc (xfrm_len + 1); + strxfrm (result, str_norm, xfrm_len + 1); + } + } + else + { + gchar *str_locale = g_convert (str_norm, -1, charset, "UTF-8", NULL, NULL, NULL); + + if (str_locale) + { + xfrm_len = strxfrm (NULL, str_locale, 0); + if (xfrm_len < 0 || xfrm_len >= G_MAXINT - 2) + { + g_free (str_locale); + str_locale = NULL; + } + } + if (str_locale) + { + result = g_malloc (xfrm_len + 2); + result[0] = 'A'; + strxfrm (result + 1, str_locale, xfrm_len + 1); + + g_free (str_locale); + } + } + + if (!result) + { + xfrm_len = strlen (str_norm); + result = g_malloc (xfrm_len + 2); + result[0] = 'B'; + memcpy (result + 1, str_norm, xfrm_len); + result[xfrm_len+1] = '\0'; + } + + g_free (str_norm); +#endif /* __STDC_ISO_10646__ */ + + return result; +} + +/* This is a collation key that is very very likely to sort before any + collation key that libc strxfrm generates. We use this before any + special case (dot or number) to make sure that its sorted before + anything else. + */ +#define COLLATION_SENTINEL "\1\1\1" + +/** + * g_utf8_collate_key_for_filename: + * @str: a UTF-8 encoded string. + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * + * Converts a string into a collation key that can be compared + * with other collation keys produced by the same function using strcmp(). + * + * In order to sort filenames correctly, this function treats the dot '.' + * as a special case. Most dictionary orderings seem to consider it + * insignificant, thus producing the ordering "event.c" "eventgenerator.c" + * "event.h" instead of "event.c" "event.h" "eventgenerator.c". Also, we + * would like to treat numbers intelligently so that "file1" "file10" "file5" + * is sorted as "file1" "file5" "file10". + * + * Note that this function depends on the + * current locale. + * + * Return value: a newly allocated string. This string should + * be freed with g_free() when you are done with it. + * + * Since: 2.8 + */ +gchar* +g_utf8_collate_key_for_filename (const gchar *str, + gssize len) +{ +#ifndef HAVE_CARBON + GString *result; + GString *append; + const gchar *p; + const gchar *prev; + const gchar *end; + gchar *collate_key; + gint digits; + gint leading_zeros; + + /* + * How it works: + * + * Split the filename into collatable substrings which do + * not contain [.0-9] and special-cased substrings. The collatable + * substrings are run through the normal g_utf8_collate_key() and the + * resulting keys are concatenated with keys generated from the + * special-cased substrings. + * + * Special cases: Dots are handled by replacing them with '\1' which + * implies that short dot-delimited substrings are before long ones, + * e.g. + * + * a\1a (a.a) + * a-\1a (a-.a) + * aa\1a (aa.a) + * + * Numbers are handled by prepending to each number d-1 superdigits + * where d = number of digits in the number and SUPERDIGIT is a + * character with an integer value higher than any digit (for instance + * ':'). This ensures that single-digit numbers are sorted before + * double-digit numbers which in turn are sorted separately from + * triple-digit numbers, etc. To avoid strange side-effects when + * sorting strings that already contain SUPERDIGITs, a '\2' + * is also prepended, like this + * + * file\21 (file1) + * file\25 (file5) + * file\2:10 (file10) + * file\2:26 (file26) + * file\2::100 (file100) + * file:foo (file:foo) + * + * This has the side-effect of sorting numbers before everything else (except + * dots), but this is probably OK. + * + * Leading digits are ignored when doing the above. To discriminate + * numbers which differ only in the number of leading digits, we append + * the number of leading digits as a byte at the very end of the collation + * key. + * + * To try avoid conflict with any collation key sequence generated by libc we + * start each switch to a special cased part with a sentinel that hopefully + * will sort before anything libc will generate. + */ + + if (len < 0) + len = strlen (str); + + result = g_string_sized_new (len * 2); + append = g_string_sized_new (0); + + end = str + len; + + /* No need to use utf8 functions, since we're only looking for ascii chars */ + for (prev = p = str; p < end; p++) + { + switch (*p) + { + case '.': + if (prev != p) + { + collate_key = g_utf8_collate_key (prev, p - prev); + g_string_append (result, collate_key); + g_free (collate_key); + } + + g_string_append (result, COLLATION_SENTINEL "\1"); + + /* skip the dot */ + prev = p + 1; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (prev != p) + { + collate_key = g_utf8_collate_key (prev, p - prev); + g_string_append (result, collate_key); + g_free (collate_key); + } + + g_string_append (result, COLLATION_SENTINEL "\2"); + + prev = p; + + /* write d-1 colons */ + if (*p == '0') + { + leading_zeros = 1; + digits = 0; + } + else + { + leading_zeros = 0; + digits = 1; + } + + while (++p < end) + { + if (*p == '0' && !digits) + ++leading_zeros; + else if (g_ascii_isdigit(*p)) + ++digits; + else + { + /* count an all-zero sequence as + * one digit plus leading zeros + */ + if (!digits) + { + ++digits; + --leading_zeros; + } + break; + } + } + + while (digits > 1) + { + g_string_append_c (result, ':'); + --digits; + } + + if (leading_zeros > 0) + { + g_string_append_c (append, (char)leading_zeros); + prev += leading_zeros; + } + + /* write the number itself */ + g_string_append_len (result, prev, p - prev); + + prev = p; + --p; /* go one step back to avoid disturbing outer loop */ + break; + + default: + /* other characters just accumulate */ + break; + } + } + + if (prev != p) + { + collate_key = g_utf8_collate_key (prev, p - prev); + g_string_append (result, collate_key); + g_free (collate_key); + } + + g_string_append (result, append->str); + g_string_free (append, TRUE); + + return g_string_free (result, FALSE); +#else /* HAVE_CARBON */ + return carbon_collate_key_for_filename (str, len); +#endif +} + + +#define __G_UNICOLLATE_C__ +#include "galiasdef.c" diff --git a/glib/gunicomp.h b/glib/gunicomp.h new file mode 100644 index 0000000..23a9087 --- /dev/null +++ b/glib/gunicomp.h @@ -0,0 +1,682 @@ +#define COMPOSE_FIRST_START 1 +#define COMPOSE_FIRST_SINGLE_START 147 +#define COMPOSE_SECOND_START 368 +#define COMPOSE_SECOND_SINGLE_START 399 + +#define COMPOSE_TABLE_LAST 48 + +static const guint16 compose_data[][256] = { + { /* page 0, index 0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, 148, 149, 0, 0, 1, 2, 3, 4, 5, + 150, 6, 7, 8, 151, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 152, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 0, 39, 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 153, 154, + 50, 155, 0, 0, 51, 0, 0, 0, 0, 156, 0, 0, 0, 0, 52, 53, 157, 0, 158, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 55, 0, 159, 160, 56, 161, 0, 0, 57, 0, 0, 0, 0, + 162, 0, 0, 0, 0, 58, 59, 163, 0, 164, 0, 0, 0, 60, 0, 0, 0 + }, + { /* page 1, index 1 */ + 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 166, 0, + 0, 0, 0, 167, 168, 0, 0, 0, 0, 0, 0, 169, 170, 171, 172, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 0, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 175, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 + }, + { /* page 2, index 2 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 0, 0, 0, + 181, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 3, index 3 */ + 368, 369, 370, 371, 372, 0, 373, 374, 375, 376, 377, 378, 379, 0, 0, 380, + 0, 381, 0, 382, 383, 0, 0, 0, 0, 0, 0, 384, 0, 0, 0, 0, 0, 0, 0, 385, + 386, 387, 388, 389, 390, 0, 0, 0, 0, 391, 392, 0, 393, 394, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 396, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, + 72, 0, 73, 0, 74, 0, 0, 0, 0, 0, 75, 0, 184, 0, 0, 0, 76, 0, 0, 0, 77, 0, + 0, 185, 0, 186, 0, 0, 78, 0, 0, 0, 79, 0, 80, 0, 81, 0, 0, 0, 0, 0, 82, + 0, 83, 0, 0, 0, 84, 0, 0, 0, 85, 86, 87, 0, 0, 187, 0, 0, 0, 88, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 4, index 4 */ + 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 189, 0, 90, + 91, 190, 92, 0, 191, 0, 0, 0, 192, 0, 0, 0, 0, 93, 0, 0, 0, 193, 0, 0, 0, + 194, 0, 195, 0, 0, 94, 0, 0, 196, 0, 95, 96, 197, 97, 0, 198, 0, 0, 0, + 199, 0, 0, 0, 0, 98, 0, 0, 0, 200, 0, 0, 0, 201, 0, 202, 0, 0, 0, 0, 0, + 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 6, index 5 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 210, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 399, 400, 401, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, + 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 9, index 6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, + 216, 0, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 11, index 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405, 406, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 407, 0, 0, 0, 0, 0, 0, 0, 102, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 12, index 8 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, + 0, 0, 409, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, + 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 13, index 9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 104, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 16, index 10 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 27, index 11 */ + 0, 0, 0, 0, 0, 226, 0, 227, 0, 228, 0, 229, 0, 230, 0, 0, 0, 231, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, 233, 0, 234, 235, 0, 0, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 30, index 12 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 237, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 240, 0, 0, + 0, 0, 0, 0, 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 107, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 244, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 246, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 31, index 13 */ + 108, 109, 247, 248, 249, 250, 251, 252, 110, 111, 253, 254, 255, 256, + 257, 258, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, + 117, 259, 260, 261, 262, 263, 264, 118, 119, 265, 266, 267, 268, 269, + 270, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, + 0, 0, 0, 0, 0, 126, 127, 0, 0, 0, 0, 0, 0, 128, 129, 0, 0, 0, 0, 0, 0, 0, + 130, 0, 0, 0, 0, 0, 0, 131, 132, 271, 272, 273, 274, 275, 276, 133, 134, + 277, 278, 279, 280, 281, 282, 283, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, + 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 136, 0 + }, + { /* page 33, index 14 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 289, 0, 290, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 293, 0, + 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 34, index 15 */ + 0, 0, 0, 295, 0, 0, 0, 0, 296, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 299, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 301, + 0, 302, 0, 0, 303, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 305, 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 308, 309, 0, 0, 310, 311, 0, 0, 312, 313, 314, 315, 0, 0, 0, 0, + 316, 317, 0, 0, 318, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, 323, 324, 0, 325, + 0, 0, 0, 0, 0, 0, 326, 327, 328, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 48, index 16 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, + 0, 0, 0, 331, 0, 332, 0, 333, 0, 334, 0, 335, 0, 336, 0, 337, 0, 338, 0, + 339, 0, 340, 0, 341, 0, 342, 0, 0, 343, 0, 344, 0, 345, 0, 0, 0, 0, 0, 0, + 137, 0, 0, 138, 0, 0, 139, 0, 0, 140, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, 398, + 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, 0, 0, 0, 348, 0, 349, 0, 350, + 0, 351, 0, 352, 0, 353, 0, 354, 0, 355, 0, 356, 0, 357, 0, 358, 0, 359, + 0, 0, 360, 0, 361, 0, 362, 0, 0, 0, 0, 0, 0, 142, 0, 0, 143, 0, 0, 144, + 0, 0, 145, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 363, 364, 365, 366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0 + } +}; + +static const gint16 compose_table[COMPOSE_TABLE_LAST + 1] = { + 0 /* page 0 */, + 1 /* page 1 */, + 2 /* page 2 */, + 3 /* page 3 */, + 4 /* page 4 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 5 /* page 6 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 6 /* page 9 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 7 /* page 11 */, + 8 /* page 12 */, + 9 /* page 13 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 10 /* page 16 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 11 /* page 27 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 12 /* page 30 */, + 13 /* page 31 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 14 /* page 33 */, + 15 /* page 34 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 16 /* page 48 */ +}; + +static const guint16 compose_first_single[][2] = { + { 0x0338, 0x226e }, + { 0x0338, 0x2260 }, + { 0x0338, 0x226f }, + { 0x0307, 0x1e1e }, + { 0x0302, 0x0134 }, + { 0x0307, 0x1e1f }, + { 0x0304, 0x01de }, + { 0x0301, 0x01fa }, + { 0x0301, 0x1e08 }, + { 0x0301, 0x1e2e }, + { 0x0304, 0x022a }, + { 0x0301, 0x01fe }, + { 0x0304, 0x01df }, + { 0x0301, 0x01fb }, + { 0x0301, 0x1e09 }, + { 0x0301, 0x1e2f }, + { 0x0304, 0x022b }, + { 0x0301, 0x01ff }, + { 0x0307, 0x1e64 }, + { 0x0307, 0x1e65 }, + { 0x0307, 0x1e66 }, + { 0x0307, 0x1e67 }, + { 0x0301, 0x1e78 }, + { 0x0301, 0x1e79 }, + { 0x0308, 0x1e7a }, + { 0x0308, 0x1e7b }, + { 0x0307, 0x1e9b }, + { 0x030c, 0x01ee }, + { 0x0304, 0x01ec }, + { 0x0304, 0x01ed }, + { 0x0304, 0x01e0 }, + { 0x0304, 0x01e1 }, + { 0x0306, 0x1e1c }, + { 0x0306, 0x1e1d }, + { 0x0304, 0x0230 }, + { 0x0304, 0x0231 }, + { 0x030c, 0x01ef }, + { 0x0314, 0x1fec }, + { 0x0345, 0x1fb4 }, + { 0x0345, 0x1fc4 }, + { 0x0345, 0x1ff4 }, + { 0x0308, 0x0407 }, + { 0x0301, 0x0403 }, + { 0x0308, 0x04de }, + { 0x0301, 0x040c }, + { 0x0308, 0x04e6 }, + { 0x0308, 0x04f4 }, + { 0x0308, 0x04f8 }, + { 0x0308, 0x04ec }, + { 0x0301, 0x0453 }, + { 0x0308, 0x04df }, + { 0x0301, 0x045c }, + { 0x0308, 0x04e7 }, + { 0x0308, 0x04f5 }, + { 0x0308, 0x04f9 }, + { 0x0308, 0x04ed }, + { 0x0308, 0x0457 }, + { 0x030f, 0x0476 }, + { 0x030f, 0x0477 }, + { 0x0308, 0x04da }, + { 0x0308, 0x04db }, + { 0x0308, 0x04ea }, + { 0x0308, 0x04eb }, + { 0x0654, 0x0624 }, + { 0x0654, 0x0626 }, + { 0x0654, 0x06c2 }, + { 0x0654, 0x06d3 }, + { 0x0654, 0x06c0 }, + { 0x093c, 0x0929 }, + { 0x093c, 0x0931 }, + { 0x093c, 0x0934 }, + { 0x0bd7, 0x0b94 }, + { 0x0bbe, 0x0bcb }, + { 0x0c56, 0x0c48 }, + { 0x0cd5, 0x0cc0 }, + { 0x0cd5, 0x0ccb }, + { 0x0d3e, 0x0d4b }, + { 0x0dca, 0x0ddd }, + { 0x102e, 0x1026 }, + { 0x1b35, 0x1b06 }, + { 0x1b35, 0x1b08 }, + { 0x1b35, 0x1b0a }, + { 0x1b35, 0x1b0c }, + { 0x1b35, 0x1b0e }, + { 0x1b35, 0x1b12 }, + { 0x1b35, 0x1b3b }, + { 0x1b35, 0x1b3d }, + { 0x1b35, 0x1b40 }, + { 0x1b35, 0x1b41 }, + { 0x1b35, 0x1b43 }, + { 0x0304, 0x1e38 }, + { 0x0304, 0x1e39 }, + { 0x0304, 0x1e5c }, + { 0x0304, 0x1e5d }, + { 0x0307, 0x1e68 }, + { 0x0307, 0x1e69 }, + { 0x0302, 0x1ec6 }, + { 0x0302, 0x1ec7 }, + { 0x0302, 0x1ed8 }, + { 0x0302, 0x1ed9 }, + { 0x0345, 0x1f82 }, + { 0x0345, 0x1f83 }, + { 0x0345, 0x1f84 }, + { 0x0345, 0x1f85 }, + { 0x0345, 0x1f86 }, + { 0x0345, 0x1f87 }, + { 0x0345, 0x1f8a }, + { 0x0345, 0x1f8b }, + { 0x0345, 0x1f8c }, + { 0x0345, 0x1f8d }, + { 0x0345, 0x1f8e }, + { 0x0345, 0x1f8f }, + { 0x0345, 0x1f92 }, + { 0x0345, 0x1f93 }, + { 0x0345, 0x1f94 }, + { 0x0345, 0x1f95 }, + { 0x0345, 0x1f96 }, + { 0x0345, 0x1f97 }, + { 0x0345, 0x1f9a }, + { 0x0345, 0x1f9b }, + { 0x0345, 0x1f9c }, + { 0x0345, 0x1f9d }, + { 0x0345, 0x1f9e }, + { 0x0345, 0x1f9f }, + { 0x0345, 0x1fa2 }, + { 0x0345, 0x1fa3 }, + { 0x0345, 0x1fa4 }, + { 0x0345, 0x1fa5 }, + { 0x0345, 0x1fa6 }, + { 0x0345, 0x1fa7 }, + { 0x0345, 0x1faa }, + { 0x0345, 0x1fab }, + { 0x0345, 0x1fac }, + { 0x0345, 0x1fad }, + { 0x0345, 0x1fae }, + { 0x0345, 0x1faf }, + { 0x0345, 0x1fb2 }, + { 0x0345, 0x1fc2 }, + { 0x0345, 0x1ff2 }, + { 0x0345, 0x1fb7 }, + { 0x0345, 0x1fc7 }, + { 0x0345, 0x1ff7 }, + { 0x0338, 0x219a }, + { 0x0338, 0x219b }, + { 0x0338, 0x21ae }, + { 0x0338, 0x21cd }, + { 0x0338, 0x21cf }, + { 0x0338, 0x21ce }, + { 0x0338, 0x2204 }, + { 0x0338, 0x2209 }, + { 0x0338, 0x220c }, + { 0x0338, 0x2224 }, + { 0x0338, 0x2226 }, + { 0x0338, 0x2241 }, + { 0x0338, 0x2244 }, + { 0x0338, 0x2247 }, + { 0x0338, 0x2249 }, + { 0x0338, 0x226d }, + { 0x0338, 0x2262 }, + { 0x0338, 0x2270 }, + { 0x0338, 0x2271 }, + { 0x0338, 0x2274 }, + { 0x0338, 0x2275 }, + { 0x0338, 0x2278 }, + { 0x0338, 0x2279 }, + { 0x0338, 0x2280 }, + { 0x0338, 0x2281 }, + { 0x0338, 0x22e0 }, + { 0x0338, 0x22e1 }, + { 0x0338, 0x2284 }, + { 0x0338, 0x2285 }, + { 0x0338, 0x2288 }, + { 0x0338, 0x2289 }, + { 0x0338, 0x22e2 }, + { 0x0338, 0x22e3 }, + { 0x0338, 0x22ac }, + { 0x0338, 0x22ad }, + { 0x0338, 0x22ae }, + { 0x0338, 0x22af }, + { 0x0338, 0x22ea }, + { 0x0338, 0x22eb }, + { 0x0338, 0x22ec }, + { 0x0338, 0x22ed }, + { 0x3099, 0x3094 }, + { 0x3099, 0x304c }, + { 0x3099, 0x304e }, + { 0x3099, 0x3050 }, + { 0x3099, 0x3052 }, + { 0x3099, 0x3054 }, + { 0x3099, 0x3056 }, + { 0x3099, 0x3058 }, + { 0x3099, 0x305a }, + { 0x3099, 0x305c }, + { 0x3099, 0x305e }, + { 0x3099, 0x3060 }, + { 0x3099, 0x3062 }, + { 0x3099, 0x3065 }, + { 0x3099, 0x3067 }, + { 0x3099, 0x3069 }, + { 0x3099, 0x309e }, + { 0x3099, 0x30f4 }, + { 0x3099, 0x30ac }, + { 0x3099, 0x30ae }, + { 0x3099, 0x30b0 }, + { 0x3099, 0x30b2 }, + { 0x3099, 0x30b4 }, + { 0x3099, 0x30b6 }, + { 0x3099, 0x30b8 }, + { 0x3099, 0x30ba }, + { 0x3099, 0x30bc }, + { 0x3099, 0x30be }, + { 0x3099, 0x30c0 }, + { 0x3099, 0x30c2 }, + { 0x3099, 0x30c5 }, + { 0x3099, 0x30c7 }, + { 0x3099, 0x30c9 }, + { 0x3099, 0x30f7 }, + { 0x3099, 0x30f8 }, + { 0x3099, 0x30f9 }, + { 0x3099, 0x30fa }, + { 0x3099, 0x30fe } +}; +static const guint16 compose_second_single[][2] = { + { 0x0627, 0x0622 }, + { 0x0627, 0x0623 }, + { 0x0627, 0x0625 }, + { 0x09c7, 0x09cb }, + { 0x09c7, 0x09cc }, + { 0x0b47, 0x0b4b }, + { 0x0b47, 0x0b48 }, + { 0x0b47, 0x0b4c }, + { 0x0bc6, 0x0bca }, + { 0x0bc6, 0x0bcc }, + { 0x0cc6, 0x0cca }, + { 0x0cc6, 0x0cc7 }, + { 0x0cc6, 0x0cc8 }, + { 0x0d46, 0x0d4a }, + { 0x0d46, 0x0d4c }, + { 0x0dd9, 0x0dda }, + { 0x0dd9, 0x0ddc }, + { 0x0dd9, 0x0dde } +}; +static const guint16 compose_array[146][31] = { + { 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x0100, 0x0102, 0x0226, 0x00c4, 0x1ea2, 0x00c5, 0, 0x01cd, 0x0200, 0x0202, 0, 0, 0, 0x1ea0, 0, 0x1e00, 0, 0, 0x0104, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e04, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e06, 0, 0, 0, 0 }, + { 0, 0x0106, 0x0108, 0, 0, 0, 0x010a, 0, 0, 0, 0, 0x010c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00c7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e0a, 0, 0, 0, 0, 0x010e, 0, 0, 0, 0, 0, 0x1e0c, 0, 0, 0, 0x1e10, 0, 0x1e12, 0, 0, 0x1e0e, 0, 0, 0, 0 }, + { 0x00c8, 0x00c9, 0x00ca, 0x1ebc, 0x0112, 0x0114, 0x0116, 0x00cb, 0x1eba, 0, 0, 0x011a, 0x0204, 0x0206, 0, 0, 0, 0x1eb8, 0, 0, 0, 0x0228, 0x0118, 0x1e18, 0, 0x1e1a, 0, 0, 0, 0, 0 }, + { 0, 0x01f4, 0x011c, 0, 0x1e20, 0x011e, 0x0120, 0, 0, 0, 0, 0x01e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0122, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0124, 0, 0, 0, 0x1e22, 0x1e26, 0, 0, 0, 0x021e, 0, 0, 0, 0, 0, 0x1e24, 0, 0, 0, 0x1e28, 0, 0, 0x1e2a, 0, 0, 0, 0, 0, 0 }, + { 0x00cc, 0x00cd, 0x00ce, 0x0128, 0x012a, 0x012c, 0x0130, 0x00cf, 0x1ec8, 0, 0, 0x01cf, 0x0208, 0x020a, 0, 0, 0, 0x1eca, 0, 0, 0, 0, 0x012e, 0, 0, 0x1e2c, 0, 0, 0, 0, 0 }, + { 0, 0x1e30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e8, 0, 0, 0, 0, 0, 0x1e32, 0, 0, 0, 0x0136, 0, 0, 0, 0, 0x1e34, 0, 0, 0, 0 }, + { 0, 0x0139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013d, 0, 0, 0, 0, 0, 0x1e36, 0, 0, 0, 0x013b, 0, 0x1e3c, 0, 0, 0x1e3a, 0, 0, 0, 0 }, + { 0, 0x1e3e, 0, 0, 0, 0, 0x1e40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01f8, 0x0143, 0, 0x00d1, 0, 0, 0x1e44, 0, 0, 0, 0, 0x0147, 0, 0, 0, 0, 0, 0x1e46, 0, 0, 0, 0x0145, 0, 0x1e4a, 0, 0, 0x1e48, 0, 0, 0, 0 }, + { 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x014c, 0x014e, 0x022e, 0x00d6, 0x1ece, 0, 0x0150, 0x01d1, 0x020c, 0x020e, 0, 0, 0x01a0, 0x1ecc, 0, 0, 0, 0, 0x01ea, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e54, 0, 0, 0, 0, 0x1e56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0154, 0, 0, 0, 0, 0x1e58, 0, 0, 0, 0, 0x0158, 0x0210, 0x0212, 0, 0, 0, 0x1e5a, 0, 0, 0, 0x0156, 0, 0, 0, 0, 0x1e5e, 0, 0, 0, 0 }, + { 0, 0x015a, 0x015c, 0, 0, 0, 0x1e60, 0, 0, 0, 0, 0x0160, 0, 0, 0, 0, 0, 0x1e62, 0, 0, 0x0218, 0x015e, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e6a, 0, 0, 0, 0, 0x0164, 0, 0, 0, 0, 0, 0x1e6c, 0, 0, 0x021a, 0x0162, 0, 0x1e70, 0, 0, 0x1e6e, 0, 0, 0, 0 }, + { 0x00d9, 0x00da, 0x00db, 0x0168, 0x016a, 0x016c, 0, 0x00dc, 0x1ee6, 0x016e, 0x0170, 0x01d3, 0x0214, 0x0216, 0, 0, 0x01af, 0x1ee4, 0x1e72, 0, 0, 0, 0x0172, 0x1e76, 0, 0x1e74, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0x1e7c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e80, 0x1e82, 0x0174, 0, 0, 0, 0x1e86, 0x1e84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e8a, 0x1e8c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ef2, 0x00dd, 0x0176, 0x1ef8, 0x0232, 0, 0x1e8e, 0x0178, 0x1ef6, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0179, 0x1e90, 0, 0, 0, 0x017b, 0, 0, 0, 0, 0x017d, 0, 0, 0, 0, 0, 0x1e92, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e94, 0, 0, 0, 0 }, + { 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x0101, 0x0103, 0x0227, 0x00e4, 0x1ea3, 0x00e5, 0, 0x01ce, 0x0201, 0x0203, 0, 0, 0, 0x1ea1, 0, 0x1e01, 0, 0, 0x0105, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e05, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e07, 0, 0, 0, 0 }, + { 0, 0x0107, 0x0109, 0, 0, 0, 0x010b, 0, 0, 0, 0, 0x010d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00e7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e0b, 0, 0, 0, 0, 0x010f, 0, 0, 0, 0, 0, 0x1e0d, 0, 0, 0, 0x1e11, 0, 0x1e13, 0, 0, 0x1e0f, 0, 0, 0, 0 }, + { 0x00e8, 0x00e9, 0x00ea, 0x1ebd, 0x0113, 0x0115, 0x0117, 0x00eb, 0x1ebb, 0, 0, 0x011b, 0x0205, 0x0207, 0, 0, 0, 0x1eb9, 0, 0, 0, 0x0229, 0x0119, 0x1e19, 0, 0x1e1b, 0, 0, 0, 0, 0 }, + { 0, 0x01f5, 0x011d, 0, 0x1e21, 0x011f, 0x0121, 0, 0, 0, 0, 0x01e7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0123, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0125, 0, 0, 0, 0x1e23, 0x1e27, 0, 0, 0, 0x021f, 0, 0, 0, 0, 0, 0x1e25, 0, 0, 0, 0x1e29, 0, 0, 0x1e2b, 0, 0x1e96, 0, 0, 0, 0 }, + { 0x00ec, 0x00ed, 0x00ee, 0x0129, 0x012b, 0x012d, 0, 0x00ef, 0x1ec9, 0, 0, 0x01d0, 0x0209, 0x020b, 0, 0, 0, 0x1ecb, 0, 0, 0, 0, 0x012f, 0, 0, 0x1e2d, 0, 0, 0, 0, 0 }, + { 0, 0, 0x0135, 0, 0, 0, 0, 0, 0, 0, 0, 0x01f0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01e9, 0, 0, 0, 0, 0, 0x1e33, 0, 0, 0, 0x0137, 0, 0, 0, 0, 0x1e35, 0, 0, 0, 0 }, + { 0, 0x013a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x013e, 0, 0, 0, 0, 0, 0x1e37, 0, 0, 0, 0x013c, 0, 0x1e3d, 0, 0, 0x1e3b, 0, 0, 0, 0 }, + { 0, 0x1e3f, 0, 0, 0, 0, 0x1e41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01f9, 0x0144, 0, 0x00f1, 0, 0, 0x1e45, 0, 0, 0, 0, 0x0148, 0, 0, 0, 0, 0, 0x1e47, 0, 0, 0, 0x0146, 0, 0x1e4b, 0, 0, 0x1e49, 0, 0, 0, 0 }, + { 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x014d, 0x014f, 0x022f, 0x00f6, 0x1ecf, 0, 0x0151, 0x01d2, 0x020d, 0x020f, 0, 0, 0x01a1, 0x1ecd, 0, 0, 0, 0, 0x01eb, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e55, 0, 0, 0, 0, 0x1e57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x0155, 0, 0, 0, 0, 0x1e59, 0, 0, 0, 0, 0x0159, 0x0211, 0x0213, 0, 0, 0, 0x1e5b, 0, 0, 0, 0x0157, 0, 0, 0, 0, 0x1e5f, 0, 0, 0, 0 }, + { 0, 0x015b, 0x015d, 0, 0, 0, 0x1e61, 0, 0, 0, 0, 0x0161, 0, 0, 0, 0, 0, 0x1e63, 0, 0, 0x0219, 0x015f, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e6b, 0x1e97, 0, 0, 0, 0x0165, 0, 0, 0, 0, 0, 0x1e6d, 0, 0, 0x021b, 0x0163, 0, 0x1e71, 0, 0, 0x1e6f, 0, 0, 0, 0 }, + { 0x00f9, 0x00fa, 0x00fb, 0x0169, 0x016b, 0x016d, 0, 0x00fc, 0x1ee7, 0x016f, 0x0171, 0x01d4, 0x0215, 0x0217, 0, 0, 0x01b0, 0x1ee5, 0x1e73, 0, 0, 0, 0x0173, 0x1e77, 0, 0x1e75, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0x1e7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e7f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e81, 0x1e83, 0x0175, 0, 0, 0, 0x1e87, 0x1e85, 0, 0x1e98, 0, 0, 0, 0, 0, 0, 0, 0x1e89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0x1e8b, 0x1e8d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ef3, 0x00fd, 0x0177, 0x1ef9, 0x0233, 0, 0x1e8f, 0x00ff, 0x1ef7, 0x1e99, 0, 0, 0, 0, 0, 0, 0, 0x1ef5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x017a, 0x1e91, 0, 0, 0, 0x017c, 0, 0, 0, 0, 0x017e, 0, 0, 0, 0, 0, 0x1e93, 0, 0, 0, 0, 0, 0, 0, 0, 0x1e95, 0, 0, 0, 0 }, + { 0x1fed, 0x0385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc1, 0, 0, 0 }, + { 0x1ea6, 0x1ea4, 0, 0x1eaa, 0, 0, 0, 0, 0x1ea8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x01fc, 0, 0, 0x01e2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ec0, 0x1ebe, 0, 0x1ec4, 0, 0, 0, 0, 0x1ec2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ed2, 0x1ed0, 0, 0x1ed6, 0, 0, 0, 0, 0x1ed4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e4c, 0, 0, 0x022c, 0, 0, 0x1e4e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01db, 0x01d7, 0, 0, 0x01d5, 0, 0, 0, 0, 0, 0, 0x01d9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ea7, 0x1ea5, 0, 0x1eab, 0, 0, 0, 0, 0x1ea9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x01fd, 0, 0, 0x01e3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ec1, 0x1ebf, 0, 0x1ec5, 0, 0, 0, 0, 0x1ec3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ed3, 0x1ed1, 0, 0x1ed7, 0, 0, 0, 0, 0x1ed5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0x1e4d, 0, 0, 0x022d, 0, 0, 0x1e4f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x01dc, 0x01d8, 0, 0, 0x01d6, 0, 0, 0, 0, 0, 0, 0x01da, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eb0, 0x1eae, 0, 0x1eb4, 0, 0, 0, 0, 0x1eb2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eb1, 0x1eaf, 0, 0x1eb5, 0, 0, 0, 0, 0x1eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e14, 0x1e16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e15, 0x1e17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e50, 0x1e52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1e51, 0x1e53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1edc, 0x1eda, 0, 0x1ee0, 0, 0, 0, 0, 0x1ede, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1edd, 0x1edb, 0, 0x1ee1, 0, 0, 0, 0, 0x1edf, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ee3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eea, 0x1ee8, 0, 0x1eee, 0, 0, 0, 0, 0x1eec, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1eeb, 0x1ee9, 0, 0x1eef, 0, 0, 0, 0, 0x1eed, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ef1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fba, 0x0386, 0, 0, 0x1fb9, 0x1fb8, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f08, 0x1f09, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fbc, 0, 0 }, + { 0x1fc8, 0x0388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f18, 0x1f19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fca, 0x0389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f28, 0x1f29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcc, 0, 0 }, + { 0x1fda, 0x038a, 0, 0, 0x1fd9, 0x1fd8, 0, 0x03aa, 0, 0, 0, 0, 0, 0, 0x1f38, 0x1f39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ff8, 0x038c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f48, 0x1f49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1fea, 0x038e, 0, 0, 0x1fe9, 0x1fe8, 0, 0x03ab, 0, 0, 0, 0, 0, 0, 0, 0x1f59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1ffa, 0x038f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f68, 0x1f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ffc, 0, 0 }, + { 0x1f70, 0x03ac, 0, 0, 0x1fb1, 0x1fb0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f00, 0x1f01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fb6, 0x1fb3, 0, 0 }, + { 0x1f72, 0x03ad, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f10, 0x1f11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f74, 0x03ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f20, 0x1f21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fc6, 0x1fc3, 0, 0 }, + { 0x1f76, 0x03af, 0, 0, 0x1fd1, 0x1fd0, 0, 0x03ca, 0, 0, 0, 0, 0, 0, 0x1f30, 0x1f31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd6, 0, 0, 0 }, + { 0x1f78, 0x03cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f40, 0x1f41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe4, 0x1fe5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f7a, 0x03cd, 0, 0, 0x1fe1, 0x1fe0, 0, 0x03cb, 0, 0, 0, 0, 0, 0, 0x1f50, 0x1f51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe6, 0, 0, 0 }, + { 0x1f7c, 0x03ce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f60, 0x1f61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1ff6, 0x1ff3, 0, 0 }, + { 0x1fd2, 0x0390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fd7, 0, 0, 0 }, + { 0x1fe2, 0x03b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fe7, 0, 0, 0 }, + { 0, 0x03d3, 0, 0, 0, 0, 0, 0x03d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04d0, 0, 0x04d2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x0400, 0, 0, 0, 0, 0x04d6, 0, 0x0401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04c1, 0, 0x04dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x040d, 0, 0, 0, 0x04e2, 0x0419, 0, 0x04e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0x04ee, 0x040e, 0, 0x04f0, 0, 0, 0x04f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04d1, 0, 0x04d3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x0450, 0, 0, 0, 0, 0x04d7, 0, 0x0451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0x04c2, 0, 0x04dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x045d, 0, 0, 0, 0x04e3, 0x0439, 0, 0x04e5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0x04ef, 0x045e, 0, 0x04f1, 0, 0, 0x04f3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x1eac, 0, 0, 0x1eb6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0x1ead, 0, 0, 0x1eb7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f02, 0x1f04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f06, 0x1f80, 0, 0 }, + { 0x1f03, 0x1f05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f07, 0x1f81, 0, 0 }, + { 0x1f0a, 0x1f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0e, 0x1f88, 0, 0 }, + { 0x1f0b, 0x1f0d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f0f, 0x1f89, 0, 0 }, + { 0x1f12, 0x1f14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f13, 0x1f15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f1a, 0x1f1c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f1b, 0x1f1d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f22, 0x1f24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f26, 0x1f90, 0, 0 }, + { 0x1f23, 0x1f25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f27, 0x1f91, 0, 0 }, + { 0x1f2a, 0x1f2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2e, 0x1f98, 0, 0 }, + { 0x1f2b, 0x1f2d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f2f, 0x1f99, 0, 0 }, + { 0x1f32, 0x1f34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f36, 0, 0, 0 }, + { 0x1f33, 0x1f35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f37, 0, 0, 0 }, + { 0x1f3a, 0x1f3c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3e, 0, 0, 0 }, + { 0x1f3b, 0x1f3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f3f, 0, 0, 0 }, + { 0x1f42, 0x1f44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f43, 0x1f45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f4a, 0x1f4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f4b, 0x1f4d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0x1f52, 0x1f54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f56, 0, 0, 0 }, + { 0x1f53, 0x1f55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f57, 0, 0, 0 }, + { 0x1f5b, 0x1f5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f5f, 0, 0, 0 }, + { 0x1f62, 0x1f64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f66, 0x1fa0, 0, 0 }, + { 0x1f63, 0x1f65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f67, 0x1fa1, 0, 0 }, + { 0x1f6a, 0x1f6c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6e, 0x1fa8, 0, 0 }, + { 0x1f6b, 0x1f6d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1f6f, 0x1fa9, 0, 0 }, + { 0x1fcd, 0x1fce, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fcf, 0, 0, 0 }, + { 0x1fdd, 0x1fde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1fdf, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3070, 0x3071 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3073, 0x3074 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3076, 0x3077 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3079, 0x307a }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x307c, 0x307d }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d0, 0x30d1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d3, 0x30d4 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d6, 0x30d7 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30d9, 0x30da }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x30dc, 0x30dd } +}; diff --git a/glib/gunidecomp.c b/glib/gunidecomp.c new file mode 100644 index 0000000..d0fa97e --- /dev/null +++ b/glib/gunidecomp.c @@ -0,0 +1,535 @@ +/* decomp.c - Character decomposition. + * + * Copyright (C) 1999, 2000 Tom Tromey + * Copyright 2000 Red Hat, Inc. + * + * The Gnome 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 of the + * License, or (at your option) any later version. + * + * The Gnome 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 the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "glib.h" +#include "gunidecomp.h" +#include "gunicomp.h" +#include "gunicodeprivate.h" +#include "galias.h" + + +#define CC_PART1(Page, Char) \ + ((combining_class_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (combining_class_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (cclass_data[combining_class_table_part1[Page]][Char])) + +#define CC_PART2(Page, Char) \ + ((combining_class_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (combining_class_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (cclass_data[combining_class_table_part2[Page]][Char])) + +#define COMBINING_CLASS(Char) \ + (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ + ? CC_PART1 ((Char) >> 8, (Char) & 0xff) \ + : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ + ? CC_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ + : 0)) + +/** + * g_unichar_combining_class: + * @uc: a Unicode character + * + * Determines the canonical combining class of a Unicode character. + * + * Return value: the combining class of the character + * + * Since: 2.14 + **/ +gint +g_unichar_combining_class (gunichar uc) +{ + return COMBINING_CLASS (uc); +} + +/* constants for hangul syllable [de]composition */ +#define SBase 0xAC00 +#define LBase 0x1100 +#define VBase 0x1161 +#define TBase 0x11A7 +#define LCount 19 +#define VCount 21 +#define TCount 28 +#define NCount (VCount * TCount) +#define SCount (LCount * NCount) + +/** + * g_unicode_canonical_ordering: + * @string: a UCS-4 encoded string. + * @len: the maximum length of @string to use. + * + * Computes the canonical ordering of a string in-place. + * This rearranges decomposed characters in the string + * according to their combining classes. See the Unicode + * manual for more information. + **/ +void +g_unicode_canonical_ordering (gunichar *string, + gsize len) +{ + gsize i; + int swap = 1; + + while (swap) + { + int last; + swap = 0; + last = COMBINING_CLASS (string[0]); + for (i = 0; i < len - 1; ++i) + { + int next = COMBINING_CLASS (string[i + 1]); + if (next != 0 && last > next) + { + gsize j; + /* Percolate item leftward through string. */ + for (j = i + 1; j > 0; --j) + { + gunichar t; + if (COMBINING_CLASS (string[j - 1]) <= next) + break; + t = string[j]; + string[j] = string[j - 1]; + string[j - 1] = t; + swap = 1; + } + /* We're re-entering the loop looking at the old + character again. */ + next = last; + } + last = next; + } + } +} + +/* http://www.unicode.org/unicode/reports/tr15/#Hangul + * r should be null or have sufficient space. Calling with r == NULL will + * only calculate the result_len; however, a buffer with space for three + * characters will always be big enough. */ +static void +decompose_hangul (gunichar s, + gunichar *r, + gsize *result_len) +{ + gint SIndex = s - SBase; + + /* not a hangul syllable */ + if (SIndex < 0 || SIndex >= SCount) + { + if (r) + r[0] = s; + *result_len = 1; + } + else + { + gunichar L = LBase + SIndex / NCount; + gunichar V = VBase + (SIndex % NCount) / TCount; + gunichar T = TBase + SIndex % TCount; + + if (r) + { + r[0] = L; + r[1] = V; + } + + if (T != TBase) + { + if (r) + r[2] = T; + *result_len = 3; + } + else + *result_len = 2; + } +} + +/* returns a pointer to a null-terminated UTF-8 string */ +static const gchar * +find_decomposition (gunichar ch, + gboolean compat) +{ + int start = 0; + int end = G_N_ELEMENTS (decomp_table); + + if (ch >= decomp_table[start].ch && + ch <= decomp_table[end - 1].ch) + { + while (TRUE) + { + int half = (start + end) / 2; + if (ch == decomp_table[half].ch) + { + int offset; + + if (compat) + { + offset = decomp_table[half].compat_offset; + if (offset == G_UNICODE_NOT_PRESENT_OFFSET) + offset = decomp_table[half].canon_offset; + } + else + { + offset = decomp_table[half].canon_offset; + if (offset == G_UNICODE_NOT_PRESENT_OFFSET) + return NULL; + } + + return &(decomp_expansion_string[offset]); + } + else if (half == start) + break; + else if (ch > decomp_table[half].ch) + start = half; + else + end = half; + } + } + + return NULL; +} + +/** + * g_unicode_canonical_decomposition: + * @ch: a Unicode character. + * @result_len: location to store the length of the return value. + * + * Computes the canonical decomposition of a Unicode character. + * + * Return value: a newly allocated string of Unicode characters. + * @result_len is set to the resulting length of the string. + **/ +gunichar * +g_unicode_canonical_decomposition (gunichar ch, + gsize *result_len) +{ + const gchar *decomp; + const gchar *p; + gunichar *r; + + /* Hangul syllable */ + if (ch >= 0xac00 && ch <= 0xd7a3) + { + decompose_hangul (ch, NULL, result_len); + r = g_malloc (*result_len * sizeof (gunichar)); + decompose_hangul (ch, r, result_len); + } + else if ((decomp = find_decomposition (ch, FALSE)) != NULL) + { + /* Found it. */ + int i; + + *result_len = g_utf8_strlen (decomp, -1); + r = g_malloc (*result_len * sizeof (gunichar)); + + for (p = decomp, i = 0; *p != '\0'; p = g_utf8_next_char (p), i++) + r[i] = g_utf8_get_char (p); + } + else + { + /* Not in our table. */ + r = g_malloc (sizeof (gunichar)); + *r = ch; + *result_len = 1; + } + + /* Supposedly following the Unicode 2.1.9 table means that the + decompositions come out in canonical order. I haven't tested + this, but we rely on it here. */ + return r; +} + +/* L,V => LV and LV,T => LVT */ +static gboolean +combine_hangul (gunichar a, + gunichar b, + gunichar *result) +{ + gint LIndex = a - LBase; + gint SIndex = a - SBase; + + gint VIndex = b - VBase; + gint TIndex = b - TBase; + + if (0 <= LIndex && LIndex < LCount + && 0 <= VIndex && VIndex < VCount) + { + *result = SBase + (LIndex * VCount + VIndex) * TCount; + return TRUE; + } + else if (0 <= SIndex && SIndex < SCount && (SIndex % TCount) == 0 + && 0 < TIndex && TIndex < TCount) + { + *result = a + TIndex; + return TRUE; + } + + return FALSE; +} + +#define CI(Page, Char) \ + ((compose_table[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (compose_table[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (compose_data[compose_table[Page]][Char])) + +#define COMPOSE_INDEX(Char) \ + (((Char >> 8) > (COMPOSE_TABLE_LAST)) ? 0 : CI((Char) >> 8, (Char) & 0xff)) + +static gboolean +combine (gunichar a, + gunichar b, + gunichar *result) +{ + gushort index_a, index_b; + + if (combine_hangul (a, b, result)) + return TRUE; + + index_a = COMPOSE_INDEX(a); + + if (index_a >= COMPOSE_FIRST_SINGLE_START && index_a < COMPOSE_SECOND_START) + { + if (b == compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][0]) + { + *result = compose_first_single[index_a - COMPOSE_FIRST_SINGLE_START][1]; + return TRUE; + } + else + return FALSE; + } + + index_b = COMPOSE_INDEX(b); + + if (index_b >= COMPOSE_SECOND_SINGLE_START) + { + if (a == compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][0]) + { + *result = compose_second_single[index_b - COMPOSE_SECOND_SINGLE_START][1]; + return TRUE; + } + else + return FALSE; + } + + if (index_a >= COMPOSE_FIRST_START && index_a < COMPOSE_FIRST_SINGLE_START && + index_b >= COMPOSE_SECOND_START && index_b < COMPOSE_SECOND_SINGLE_START) + { + gunichar res = compose_array[index_a - COMPOSE_FIRST_START][index_b - COMPOSE_SECOND_START]; + + if (res) + { + *result = res; + return TRUE; + } + } + + return FALSE; +} + +gunichar * +_g_utf8_normalize_wc (const gchar *str, + gssize max_len, + GNormalizeMode mode) +{ + gsize n_wc; + gunichar *wc_buffer; + const char *p; + gsize last_start; + gboolean do_compat = (mode == G_NORMALIZE_NFKC || + mode == G_NORMALIZE_NFKD); + gboolean do_compose = (mode == G_NORMALIZE_NFC || + mode == G_NORMALIZE_NFKC); + + n_wc = 0; + p = str; + while ((max_len < 0 || p < str + max_len) && *p) + { + const gchar *decomp; + gunichar wc = g_utf8_get_char (p); + + if (wc >= 0xac00 && wc <= 0xd7a3) + { + gsize result_len; + decompose_hangul (wc, NULL, &result_len); + n_wc += result_len; + } + else + { + decomp = find_decomposition (wc, do_compat); + + if (decomp) + n_wc += g_utf8_strlen (decomp, -1); + else + n_wc++; + } + + p = g_utf8_next_char (p); + } + + wc_buffer = g_new (gunichar, n_wc + 1); + + last_start = 0; + n_wc = 0; + p = str; + while ((max_len < 0 || p < str + max_len) && *p) + { + gunichar wc = g_utf8_get_char (p); + const gchar *decomp; + int cc; + gsize old_n_wc = n_wc; + + if (wc >= 0xac00 && wc <= 0xd7a3) + { + gsize result_len; + decompose_hangul (wc, wc_buffer + n_wc, &result_len); + n_wc += result_len; + } + else + { + decomp = find_decomposition (wc, do_compat); + + if (decomp) + { + const char *pd; + for (pd = decomp; *pd != '\0'; pd = g_utf8_next_char (pd)) + wc_buffer[n_wc++] = g_utf8_get_char (pd); + } + else + wc_buffer[n_wc++] = wc; + } + + if (n_wc > 0) + { + cc = COMBINING_CLASS (wc_buffer[old_n_wc]); + + if (cc == 0) + { + g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start); + last_start = old_n_wc; + } + } + + p = g_utf8_next_char (p); + } + + if (n_wc > 0) + { + g_unicode_canonical_ordering (wc_buffer + last_start, n_wc - last_start); + last_start = n_wc; + } + + wc_buffer[n_wc] = 0; + + /* All decomposed and reordered */ + + if (do_compose && n_wc > 0) + { + gsize i, j; + int last_cc = 0; + last_start = 0; + + for (i = 0; i < n_wc; i++) + { + int cc = COMBINING_CLASS (wc_buffer[i]); + + if (i > 0 && + (last_cc == 0 || last_cc < cc) && + combine (wc_buffer[last_start], wc_buffer[i], + &wc_buffer[last_start])) + { + for (j = i + 1; j < n_wc; j++) + wc_buffer[j-1] = wc_buffer[j]; + n_wc--; + i--; + + if (i == last_start) + last_cc = 0; + else + last_cc = COMBINING_CLASS (wc_buffer[i-1]); + + continue; + } + + if (cc == 0) + last_start = i; + + last_cc = cc; + } + } + + wc_buffer[n_wc] = 0; + + return wc_buffer; +} + +/** + * g_utf8_normalize: + * @str: a UTF-8 encoded string. + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * @mode: the type of normalization to perform. + * + * Converts a string into canonical form, standardizing + * such issues as whether a character with an accent + * is represented as a base character and combining + * accent or as a single precomposed character. The + * string has to be valid UTF-8, otherwise %NULL is + * returned. You should generally call g_utf8_normalize() + * before comparing two Unicode strings. + * + * The normalization mode %G_NORMALIZE_DEFAULT only + * standardizes differences that do not affect the + * text content, such as the above-mentioned accent + * representation. %G_NORMALIZE_ALL also standardizes + * the "compatibility" characters in Unicode, such + * as SUPERSCRIPT THREE to the standard forms + * (in this case DIGIT THREE). Formatting information + * may be lost but for most text operations such + * characters should be considered the same. + * + * %G_NORMALIZE_DEFAULT_COMPOSE and %G_NORMALIZE_ALL_COMPOSE + * are like %G_NORMALIZE_DEFAULT and %G_NORMALIZE_ALL, + * but returned a result with composed forms rather + * than a maximally decomposed form. This is often + * useful if you intend to convert the string to + * a legacy encoding or pass it to a system with + * less capable Unicode handling. + * + * Return value: a newly allocated string, that is the + * normalized form of @str, or %NULL if @str is not + * valid UTF-8. + **/ +gchar * +g_utf8_normalize (const gchar *str, + gssize len, + GNormalizeMode mode) +{ + gunichar *result_wc = _g_utf8_normalize_wc (str, len, mode); + gchar *result; + + result = g_ucs4_to_utf8 (result_wc, -1, NULL, NULL, NULL); + g_free (result_wc); + + return result; +} + +#define __G_UNIDECOMP_C__ +#include "galiasdef.c" diff --git a/glib/gunidecomp.h b/glib/gunidecomp.h new file mode 100644 index 0000000..135d107 --- /dev/null +++ b/glib/gunidecomp.h @@ -0,0 +1,10870 @@ +/* This file is automatically generated. DO NOT EDIT! */ + +#ifndef DECOMP_H +#define DECOMP_H + +#define G_UNICODE_LAST_CHAR 0x10ffff + +#define G_UNICODE_MAX_TABLE_INDEX (0x110000 / 256) + +#define G_UNICODE_LAST_CHAR_PART1 0x2FAFF + +#define G_UNICODE_LAST_PAGE_PART1 762 + +#define G_UNICODE_NOT_PRESENT_OFFSET 65535 + +static const guchar cclass_data[][256] = { + { /* page 3, index 0 */ + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, + 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, + 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, + 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, + 220, 220, 230, 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, + 230, 232, 220, 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 4, index 1 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 5, index 2 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 220, 230, 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, + 230, 230, 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, + 222, 228, 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, + 23, 0, 24, 25, 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 6, index 3 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, + 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, + 230, 230, 230, 230, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, + 0, 230, 230, 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 7, index 4 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, + 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, + 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 9, index 5 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 10, index 6 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 11, index 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 12, index 8 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 13, index 9 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 14, index 10 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 15, index 11 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, + 132, 0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, + 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + }, + { /* page 16, index 12 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 19, index 13 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 23, index 14 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 24, index 15 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 25, index 16 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 26, index 17 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, + 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 27, index 18 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 230, 230, 230, 230, + 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 29, index 19 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 230, 220, 230, 230, 230, 230, 230, 230, 230, 220, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220 + }, + { /* page 32, index 20 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1, 1, 230, 230, + 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0, 1, 1, 230, 220, + 230, 1, 1, 220, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + }, + { /* page 48, index 21 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 228, 232, 222, + 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 168, index 22 */ + 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 251, index 23 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 254, index 24 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 266, index 25 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 1, 220, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 465, index 26 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, 216, 216, 216, + 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 220, 0, 0, + 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 466, index 27 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; + +static const gint16 combining_class_table_part1[763] = { + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 /* page 3 */, + 1 /* page 4 */, + 2 /* page 5 */, + 3 /* page 6 */, + 4 /* page 7 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 5 /* page 9 */, + 6 /* page 10 */, + 7 /* page 11 */, + 8 /* page 12 */, + 9 /* page 13 */, + 10 /* page 14 */, + 11 /* page 15 */, + 12 /* page 16 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 13 /* page 19 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 14 /* page 23 */, + 15 /* page 24 */, + 16 /* page 25 */, + 17 /* page 26 */, + 18 /* page 27 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 19 /* page 29 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 20 /* page 32 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 21 /* page 48 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 22 /* page 168 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 23 /* page 251 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 24 /* page 254 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 25 /* page 266 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 26 /* page 465 */, + 27 /* page 466 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX +}; + +static const gint16 combining_class_table_part2[768] = { + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX +}; + +typedef struct +{ + gunichar ch; + guint16 canon_offset; + guint16 compat_offset; +} decomposition; + +static const decomposition decomp_table[] = +{ + { 0x00a0, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x00a8, G_UNICODE_NOT_PRESENT_OFFSET, 2 }, + { 0x00aa, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x00af, G_UNICODE_NOT_PRESENT_OFFSET, 8 }, + { 0x00b2, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x00b3, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x00b4, G_UNICODE_NOT_PRESENT_OFFSET, 16 }, + { 0x00b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x00b8, G_UNICODE_NOT_PRESENT_OFFSET, 23 }, + { 0x00b9, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x00ba, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x00bc, G_UNICODE_NOT_PRESENT_OFFSET, 31 }, + { 0x00bd, G_UNICODE_NOT_PRESENT_OFFSET, 37 }, + { 0x00be, G_UNICODE_NOT_PRESENT_OFFSET, 43 }, + { 0x00c0, 49, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c1, 53, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c2, 57, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c3, 61, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c4, 65, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c5, 69, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c7, 73, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c8, 77, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00c9, 81, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ca, 85, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00cb, 89, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00cc, 93, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00cd, 97, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ce, 101, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00cf, 105, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d1, 109, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d2, 113, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d3, 117, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d4, 121, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d5, 125, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d6, 129, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00d9, 133, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00da, 137, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00db, 141, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00dc, 145, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00dd, 149, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e0, 153, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e1, 157, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e2, 161, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e3, 165, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e4, 169, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e5, 173, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e7, 177, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e8, 181, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00e9, 185, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ea, 189, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00eb, 193, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ec, 197, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ed, 201, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ee, 205, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ef, 209, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f1, 213, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f2, 217, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f3, 221, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f4, 225, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f5, 229, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f6, 233, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00f9, 237, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00fa, 241, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00fb, 245, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00fc, 249, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00fd, 253, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x00ff, 257, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0100, 261, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0101, 265, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0102, 269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0103, 273, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0104, 277, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0105, 281, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0106, 285, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0107, 289, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0108, 293, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0109, 297, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x010a, 301, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x010b, 305, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x010c, 309, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x010d, 313, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x010e, 317, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x010f, 321, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0112, 325, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0113, 329, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0114, 333, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0115, 337, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0116, 341, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0117, 345, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0118, 349, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0119, 353, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x011a, 357, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x011b, 361, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x011c, 365, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x011d, 369, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x011e, 373, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x011f, 377, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0120, 381, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0121, 385, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0122, 389, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0123, 393, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0124, 397, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0125, 401, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0128, 405, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0129, 409, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x012a, 413, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x012b, 417, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x012c, 421, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x012d, 425, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x012e, 429, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x012f, 433, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0130, 437, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0132, G_UNICODE_NOT_PRESENT_OFFSET, 441 }, + { 0x0133, G_UNICODE_NOT_PRESENT_OFFSET, 444 }, + { 0x0134, 447, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0135, 451, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0136, 455, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0137, 459, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0139, 463, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x013a, 467, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x013b, 471, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x013c, 475, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x013d, 479, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x013e, 483, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x013f, G_UNICODE_NOT_PRESENT_OFFSET, 487 }, + { 0x0140, G_UNICODE_NOT_PRESENT_OFFSET, 491 }, + { 0x0143, 495, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0144, 499, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0145, 503, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0146, 507, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0147, 511, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0148, 515, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0149, G_UNICODE_NOT_PRESENT_OFFSET, 519 }, + { 0x014c, 523, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x014d, 527, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x014e, 531, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x014f, 535, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0150, 539, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0151, 543, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0154, 547, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0155, 551, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0156, 555, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0157, 559, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0158, 563, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0159, 567, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x015a, 571, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x015b, 575, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x015c, 579, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x015d, 583, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x015e, 587, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x015f, 591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0160, 595, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0161, 599, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0162, 603, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0163, 607, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0164, 611, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0165, 615, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0168, 619, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0169, 623, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x016a, 627, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x016b, 631, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x016c, 635, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x016d, 639, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x016e, 643, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x016f, 647, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0170, 651, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0171, 655, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0172, 659, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0173, 663, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0174, 667, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0175, 671, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0176, 675, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0177, 679, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0178, 683, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0179, 687, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x017a, 691, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x017b, 695, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x017c, 699, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x017d, 703, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x017e, 707, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x017f, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x01a0, 713, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01a1, 717, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01af, 721, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01b0, 725, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01c4, G_UNICODE_NOT_PRESENT_OFFSET, 729 }, + { 0x01c5, G_UNICODE_NOT_PRESENT_OFFSET, 734 }, + { 0x01c6, G_UNICODE_NOT_PRESENT_OFFSET, 739 }, + { 0x01c7, G_UNICODE_NOT_PRESENT_OFFSET, 744 }, + { 0x01c8, G_UNICODE_NOT_PRESENT_OFFSET, 747 }, + { 0x01c9, G_UNICODE_NOT_PRESENT_OFFSET, 750 }, + { 0x01ca, G_UNICODE_NOT_PRESENT_OFFSET, 753 }, + { 0x01cb, G_UNICODE_NOT_PRESENT_OFFSET, 756 }, + { 0x01cc, G_UNICODE_NOT_PRESENT_OFFSET, 759 }, + { 0x01cd, 762, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ce, 766, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01cf, 770, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d0, 774, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d1, 778, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d2, 782, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d3, 786, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d4, 790, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d5, 794, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d6, 800, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d7, 806, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d8, 812, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01d9, 818, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01da, 824, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01db, 830, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01dc, 836, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01de, 842, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01df, 848, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e0, 854, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e1, 860, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e2, 866, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e3, 871, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e6, 876, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e7, 880, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e8, 884, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01e9, 888, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ea, 892, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01eb, 896, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ec, 900, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ed, 906, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ee, 912, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ef, 917, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01f0, 922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01f1, G_UNICODE_NOT_PRESENT_OFFSET, 926 }, + { 0x01f2, G_UNICODE_NOT_PRESENT_OFFSET, 929 }, + { 0x01f3, G_UNICODE_NOT_PRESENT_OFFSET, 932 }, + { 0x01f4, 935, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01f5, 939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01f8, 943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01f9, 947, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01fa, 951, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01fb, 957, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01fc, 963, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01fd, 968, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01fe, 973, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x01ff, 978, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0200, 983, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0201, 987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0202, 991, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0203, 995, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0204, 999, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0205, 1003, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0206, 1007, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0207, 1011, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0208, 1015, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0209, 1019, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x020a, 1023, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x020b, 1027, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x020c, 1031, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x020d, 1035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x020e, 1039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x020f, 1043, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0210, 1047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0211, 1051, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0212, 1055, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0213, 1059, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0214, 1063, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0215, 1067, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0216, 1071, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0217, 1075, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0218, 1079, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0219, 1083, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x021a, 1087, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x021b, 1091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x021e, 1095, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x021f, 1099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0226, 1103, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0227, 1107, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0228, 1111, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0229, 1115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x022a, 1119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x022b, 1125, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x022c, 1131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x022d, 1137, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x022e, 1143, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x022f, 1147, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0230, 1151, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0231, 1157, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0232, 1163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0233, 1167, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x02b0, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x02b1, G_UNICODE_NOT_PRESENT_OFFSET, 1173 }, + { 0x02b2, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x02b3, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x02b4, G_UNICODE_NOT_PRESENT_OFFSET, 1180 }, + { 0x02b5, G_UNICODE_NOT_PRESENT_OFFSET, 1183 }, + { 0x02b6, G_UNICODE_NOT_PRESENT_OFFSET, 1186 }, + { 0x02b7, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x02b8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x02d8, G_UNICODE_NOT_PRESENT_OFFSET, 1193 }, + { 0x02d9, G_UNICODE_NOT_PRESENT_OFFSET, 1197 }, + { 0x02da, G_UNICODE_NOT_PRESENT_OFFSET, 1201 }, + { 0x02db, G_UNICODE_NOT_PRESENT_OFFSET, 1205 }, + { 0x02dc, G_UNICODE_NOT_PRESENT_OFFSET, 1209 }, + { 0x02dd, G_UNICODE_NOT_PRESENT_OFFSET, 1213 }, + { 0x02e0, G_UNICODE_NOT_PRESENT_OFFSET, 1217 }, + { 0x02e1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x02e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x02e3, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x02e4, G_UNICODE_NOT_PRESENT_OFFSET, 1224 }, + { 0x0340, 1227, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0341, 1230, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0343, 1233, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0344, 1236, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0374, 1241, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x037a, G_UNICODE_NOT_PRESENT_OFFSET, 1244 }, + { 0x037e, 1248, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0384, G_UNICODE_NOT_PRESENT_OFFSET, 16 }, + { 0x0385, 1250, 1255 }, + { 0x0386, 1261, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0387, 1266, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0388, 1269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0389, 1274, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x038a, 1279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x038c, 1284, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x038e, 1289, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x038f, 1294, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0390, 1299, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03aa, 1306, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03ab, 1311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03ac, 1316, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03ad, 1321, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03ae, 1326, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03af, 1331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03b0, 1336, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03ca, 1343, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03cb, 1348, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03cc, 1353, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03cd, 1358, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03ce, 1363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x03d0, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x03d1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x03d2, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x03d3, 1377, 1289 }, + { 0x03d4, 1382, 1311 }, + { 0x03d5, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x03d6, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x03f0, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x03f1, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x03f2, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, + { 0x03f4, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x03f5, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x03f9, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x0400, 1411, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0401, 1416, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0403, 1421, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0407, 1426, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x040c, 1431, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x040d, 1436, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x040e, 1441, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0419, 1446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0439, 1451, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0450, 1456, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0451, 1461, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0453, 1466, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0457, 1471, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x045c, 1476, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x045d, 1481, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x045e, 1486, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0476, 1491, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0477, 1496, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04c1, 1501, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04c2, 1506, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04d0, 1511, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04d1, 1516, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04d2, 1521, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04d3, 1526, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04d6, 1531, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04d7, 1536, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04da, 1541, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04db, 1546, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04dc, 1551, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04dd, 1556, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04de, 1561, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04df, 1566, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04e2, 1571, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04e3, 1576, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04e4, 1581, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04e5, 1586, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04e6, 1591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04e7, 1596, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04ea, 1601, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04eb, 1606, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04ec, 1611, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04ed, 1616, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04ee, 1621, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04ef, 1626, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f0, 1631, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f1, 1636, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f2, 1641, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f3, 1646, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f4, 1651, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f5, 1656, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f8, 1661, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x04f9, 1666, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0587, G_UNICODE_NOT_PRESENT_OFFSET, 1671 }, + { 0x0622, 1676, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0623, 1681, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0624, 1686, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0625, 1691, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0626, 1696, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0675, G_UNICODE_NOT_PRESENT_OFFSET, 1701 }, + { 0x0676, G_UNICODE_NOT_PRESENT_OFFSET, 1706 }, + { 0x0677, G_UNICODE_NOT_PRESENT_OFFSET, 1711 }, + { 0x0678, G_UNICODE_NOT_PRESENT_OFFSET, 1716 }, + { 0x06c0, 1721, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x06c2, 1726, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x06d3, 1731, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0929, 1736, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0931, 1743, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0934, 1750, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0958, 1757, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0959, 1764, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x095a, 1771, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x095b, 1778, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x095c, 1785, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x095d, 1792, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x095e, 1799, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x095f, 1806, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x09cb, 1813, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x09cc, 1820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x09dc, 1827, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x09dd, 1834, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x09df, 1841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0a33, 1848, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0a36, 1855, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0a59, 1862, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0a5a, 1869, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0a5b, 1876, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0a5e, 1883, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0b48, 1890, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0b4b, 1897, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0b4c, 1904, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0b5c, 1911, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0b5d, 1918, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0b94, 1925, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0bca, 1932, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0bcb, 1939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0bcc, 1946, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0c48, 1953, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0cc0, 1960, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0cc7, 1967, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0cc8, 1974, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0cca, 1981, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0ccb, 1988, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0d4a, 1998, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0d4b, 2005, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0d4c, 2012, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0dda, 2019, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0ddc, 2026, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0ddd, 2033, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0dde, 2043, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0e33, G_UNICODE_NOT_PRESENT_OFFSET, 2050 }, + { 0x0eb3, G_UNICODE_NOT_PRESENT_OFFSET, 2057 }, + { 0x0edc, G_UNICODE_NOT_PRESENT_OFFSET, 2064 }, + { 0x0edd, G_UNICODE_NOT_PRESENT_OFFSET, 2071 }, + { 0x0f0c, G_UNICODE_NOT_PRESENT_OFFSET, 2078 }, + { 0x0f43, 2082, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f4d, 2089, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f52, 2096, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f57, 2103, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f5c, 2110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f69, 2117, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f73, 2124, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f75, 2131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f76, 2138, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f77, G_UNICODE_NOT_PRESENT_OFFSET, 2145 }, + { 0x0f78, 2155, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f79, G_UNICODE_NOT_PRESENT_OFFSET, 2162 }, + { 0x0f81, 2172, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f93, 2179, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0f9d, 2186, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0fa2, 2193, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0fa7, 2200, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0fac, 2207, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x0fb9, 2214, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1026, 2221, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x10fc, G_UNICODE_NOT_PRESENT_OFFSET, 2228 }, + { 0x1b06, 2232, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b08, 2239, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b0a, 2246, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b0c, 2253, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b0e, 2260, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b12, 2267, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b3b, 2274, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b3d, 2281, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b40, 2288, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b41, 2295, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1b43, 2302, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d2c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d2d, G_UNICODE_NOT_PRESENT_OFFSET, 2311 }, + { 0x1d2e, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d30, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d31, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d32, G_UNICODE_NOT_PRESENT_OFFSET, 2320 }, + { 0x1d33, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d34, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d35, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d36, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d37, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d38, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d39, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d3a, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d3c, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d3d, G_UNICODE_NOT_PRESENT_OFFSET, 2341 }, + { 0x1d3e, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d3f, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d40, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d41, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d42, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d43, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d44, G_UNICODE_NOT_PRESENT_OFFSET, 2354 }, + { 0x1d45, G_UNICODE_NOT_PRESENT_OFFSET, 2357 }, + { 0x1d46, G_UNICODE_NOT_PRESENT_OFFSET, 2360 }, + { 0x1d47, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d48, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d49, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d4a, G_UNICODE_NOT_PRESENT_OFFSET, 2370 }, + { 0x1d4b, G_UNICODE_NOT_PRESENT_OFFSET, 2373 }, + { 0x1d4c, G_UNICODE_NOT_PRESENT_OFFSET, 2376 }, + { 0x1d4d, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d4f, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d50, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d51, G_UNICODE_NOT_PRESENT_OFFSET, 2385 }, + { 0x1d52, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d53, G_UNICODE_NOT_PRESENT_OFFSET, 2388 }, + { 0x1d54, G_UNICODE_NOT_PRESENT_OFFSET, 2391 }, + { 0x1d55, G_UNICODE_NOT_PRESENT_OFFSET, 2395 }, + { 0x1d56, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d57, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d58, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d59, G_UNICODE_NOT_PRESENT_OFFSET, 2405 }, + { 0x1d5a, G_UNICODE_NOT_PRESENT_OFFSET, 2409 }, + { 0x1d5b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d5c, G_UNICODE_NOT_PRESENT_OFFSET, 2414 }, + { 0x1d5d, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d5e, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d5f, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, + { 0x1d60, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d61, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d62, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d63, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d64, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d65, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d66, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d67, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d68, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d69, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d6a, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d78, G_UNICODE_NOT_PRESENT_OFFSET, 2429 }, + { 0x1d9b, G_UNICODE_NOT_PRESENT_OFFSET, 2432 }, + { 0x1d9c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d9d, G_UNICODE_NOT_PRESENT_OFFSET, 2437 }, + { 0x1d9e, G_UNICODE_NOT_PRESENT_OFFSET, 2440 }, + { 0x1d9f, G_UNICODE_NOT_PRESENT_OFFSET, 2376 }, + { 0x1da0, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1da1, G_UNICODE_NOT_PRESENT_OFFSET, 2445 }, + { 0x1da2, G_UNICODE_NOT_PRESENT_OFFSET, 2448 }, + { 0x1da3, G_UNICODE_NOT_PRESENT_OFFSET, 2451 }, + { 0x1da4, G_UNICODE_NOT_PRESENT_OFFSET, 2454 }, + { 0x1da5, G_UNICODE_NOT_PRESENT_OFFSET, 2457 }, + { 0x1da6, G_UNICODE_NOT_PRESENT_OFFSET, 2460 }, + { 0x1da7, G_UNICODE_NOT_PRESENT_OFFSET, 2463 }, + { 0x1da8, G_UNICODE_NOT_PRESENT_OFFSET, 2467 }, + { 0x1da9, G_UNICODE_NOT_PRESENT_OFFSET, 2470 }, + { 0x1daa, G_UNICODE_NOT_PRESENT_OFFSET, 2473 }, + { 0x1dab, G_UNICODE_NOT_PRESENT_OFFSET, 2477 }, + { 0x1dac, G_UNICODE_NOT_PRESENT_OFFSET, 2480 }, + { 0x1dad, G_UNICODE_NOT_PRESENT_OFFSET, 2483 }, + { 0x1dae, G_UNICODE_NOT_PRESENT_OFFSET, 2486 }, + { 0x1daf, G_UNICODE_NOT_PRESENT_OFFSET, 2489 }, + { 0x1db0, G_UNICODE_NOT_PRESENT_OFFSET, 2492 }, + { 0x1db1, G_UNICODE_NOT_PRESENT_OFFSET, 2495 }, + { 0x1db2, G_UNICODE_NOT_PRESENT_OFFSET, 2498 }, + { 0x1db3, G_UNICODE_NOT_PRESENT_OFFSET, 2501 }, + { 0x1db4, G_UNICODE_NOT_PRESENT_OFFSET, 2504 }, + { 0x1db5, G_UNICODE_NOT_PRESENT_OFFSET, 2507 }, + { 0x1db6, G_UNICODE_NOT_PRESENT_OFFSET, 2510 }, + { 0x1db7, G_UNICODE_NOT_PRESENT_OFFSET, 2513 }, + { 0x1db8, G_UNICODE_NOT_PRESENT_OFFSET, 2516 }, + { 0x1db9, G_UNICODE_NOT_PRESENT_OFFSET, 2520 }, + { 0x1dba, G_UNICODE_NOT_PRESENT_OFFSET, 2523 }, + { 0x1dbb, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1dbc, G_UNICODE_NOT_PRESENT_OFFSET, 2528 }, + { 0x1dbd, G_UNICODE_NOT_PRESENT_OFFSET, 2531 }, + { 0x1dbe, G_UNICODE_NOT_PRESENT_OFFSET, 2534 }, + { 0x1dbf, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1e00, 2537, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e01, 2541, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e02, 2545, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e03, 2549, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e04, 2553, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e05, 2557, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e06, 2561, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e07, 2565, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e08, 2569, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e09, 2575, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e0a, 2581, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e0b, 2585, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e0c, 2589, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e0d, 2593, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e0e, 2597, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e0f, 2601, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e10, 2605, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e11, 2609, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e12, 2613, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e13, 2617, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e14, 2621, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e15, 2627, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e16, 2633, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e17, 2639, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e18, 2645, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e19, 2649, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e1a, 2653, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e1b, 2657, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e1c, 2661, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e1d, 2667, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e1e, 2673, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e1f, 2677, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e20, 2681, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e21, 2685, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e22, 2689, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e23, 2693, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e24, 2697, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e25, 2701, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e26, 2705, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e27, 2709, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e28, 2713, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e29, 2717, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e2a, 2721, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e2b, 2725, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e2c, 2729, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e2d, 2733, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e2e, 2737, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e2f, 2743, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e30, 2749, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e31, 2753, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e32, 2757, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e33, 2761, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e34, 2765, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e35, 2769, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e36, 2773, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e37, 2777, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e38, 2781, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e39, 2787, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e3a, 2793, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e3b, 2797, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e3c, 2801, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e3d, 2805, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e3e, 2809, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e3f, 2813, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e40, 2817, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e41, 2821, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e42, 2825, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e43, 2829, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e44, 2833, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e45, 2837, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e46, 2841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e47, 2845, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e48, 2849, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e49, 2853, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e4a, 2857, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e4b, 2861, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e4c, 2865, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e4d, 2871, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e4e, 2877, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e4f, 2883, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e50, 2889, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e51, 2895, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e52, 2901, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e53, 2907, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e54, 2913, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e55, 2917, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e56, 2921, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e57, 2925, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e58, 2929, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e59, 2933, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e5a, 2937, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e5b, 2941, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e5c, 2945, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e5d, 2951, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e5e, 2957, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e5f, 2961, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e60, 2965, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e61, 2969, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e62, 2973, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e63, 2977, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e64, 2981, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e65, 2987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e66, 2993, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e67, 2999, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e68, 3005, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e69, 3011, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e6a, 3017, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e6b, 3021, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e6c, 3025, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e6d, 3029, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e6e, 3033, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e6f, 3037, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e70, 3041, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e71, 3045, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e72, 3049, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e73, 3053, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e74, 3057, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e75, 3061, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e76, 3065, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e77, 3069, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e78, 3073, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e79, 3079, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e7a, 3085, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e7b, 3091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e7c, 3097, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e7d, 3101, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e7e, 3105, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e7f, 3109, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e80, 3113, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e81, 3117, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e82, 3121, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e83, 3125, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e84, 3129, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e85, 3133, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e86, 3137, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e87, 3141, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e88, 3145, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e89, 3149, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e8a, 3153, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e8b, 3157, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e8c, 3161, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e8d, 3165, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e8e, 3169, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e8f, 3173, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e90, 3177, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e91, 3181, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e92, 3185, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e93, 3189, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e94, 3193, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e95, 3197, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e96, 3201, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e97, 3205, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e98, 3209, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e99, 3213, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1e9a, G_UNICODE_NOT_PRESENT_OFFSET, 3217 }, + { 0x1e9b, 3221, 2969 }, + { 0x1ea0, 3226, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea1, 3230, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea2, 3234, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea3, 3238, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea4, 3242, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea5, 3248, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea6, 3254, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea7, 3260, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea8, 3266, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ea9, 3272, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eaa, 3278, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eab, 3284, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eac, 3290, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ead, 3296, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eae, 3302, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eaf, 3308, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb0, 3314, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb1, 3320, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb2, 3326, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb3, 3332, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb4, 3338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb5, 3344, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb6, 3350, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb7, 3356, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb8, 3362, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eb9, 3366, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eba, 3370, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ebb, 3374, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ebc, 3378, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ebd, 3382, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ebe, 3386, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ebf, 3392, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec0, 3398, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec1, 3404, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec2, 3410, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec3, 3416, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec4, 3422, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec5, 3428, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec6, 3434, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec7, 3440, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec8, 3446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ec9, 3450, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eca, 3454, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ecb, 3458, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ecc, 3462, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ecd, 3466, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ece, 3470, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ecf, 3474, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed0, 3478, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed1, 3484, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed2, 3490, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed3, 3496, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed4, 3502, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed5, 3508, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed6, 3514, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed7, 3520, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed8, 3526, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ed9, 3532, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eda, 3538, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1edb, 3544, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1edc, 3550, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1edd, 3556, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ede, 3562, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1edf, 3568, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee0, 3574, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee1, 3580, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee2, 3586, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee3, 3592, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee4, 3598, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee5, 3602, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee6, 3606, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee7, 3610, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee8, 3614, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ee9, 3620, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eea, 3626, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eeb, 3632, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eec, 3638, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eed, 3644, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eee, 3650, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1eef, 3656, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef0, 3662, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef1, 3668, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef2, 3674, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef3, 3678, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef4, 3682, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef5, 3686, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef6, 3690, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef7, 3694, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef8, 3698, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ef9, 3702, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f00, 3706, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f01, 3711, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f02, 3716, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f03, 3723, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f04, 3730, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f05, 3737, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f06, 3744, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f07, 3751, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f08, 3758, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f09, 3763, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f0a, 3768, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f0b, 3775, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f0c, 3782, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f0d, 3789, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f0e, 3796, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f0f, 3803, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f10, 3810, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f11, 3815, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f12, 3820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f13, 3827, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f14, 3834, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f15, 3841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f18, 3848, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f19, 3853, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f1a, 3858, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f1b, 3865, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f1c, 3872, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f1d, 3879, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f20, 3886, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f21, 3891, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f22, 3896, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f23, 3903, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f24, 3910, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f25, 3917, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f26, 3924, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f27, 3931, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f28, 3938, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f29, 3943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f2a, 3948, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f2b, 3955, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f2c, 3962, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f2d, 3969, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f2e, 3976, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f2f, 3983, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f30, 3990, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f31, 3995, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f32, 4000, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f33, 4007, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f34, 4014, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f35, 4021, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f36, 4028, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f37, 4035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f38, 4042, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f39, 4047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f3a, 4052, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f3b, 4059, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f3c, 4066, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f3d, 4073, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f3e, 4080, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f3f, 4087, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f40, 4094, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f41, 4099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f42, 4104, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f43, 4111, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f44, 4118, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f45, 4125, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f48, 4132, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f49, 4137, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f4a, 4142, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f4b, 4149, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f4c, 4156, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f4d, 4163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f50, 4170, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f51, 4175, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f52, 4180, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f53, 4187, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f54, 4194, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f55, 4201, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f56, 4208, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f57, 4215, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f59, 4222, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f5b, 4227, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f5d, 4234, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f5f, 4241, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f60, 4248, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f61, 4253, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f62, 4258, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f63, 4265, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f64, 4272, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f65, 4279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f66, 4286, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f67, 4293, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f68, 4300, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f69, 4305, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f6a, 4310, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f6b, 4317, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f6c, 4324, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f6d, 4331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f6e, 4338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f6f, 4345, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f70, 4352, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f71, 1316, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f72, 4357, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f73, 1321, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f74, 4362, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f75, 1326, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f76, 4367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f77, 1331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f78, 4372, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f79, 1353, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f7a, 4377, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f7b, 1358, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f7c, 4382, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f7d, 1363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f80, 4387, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f81, 4394, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f82, 4401, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f83, 4410, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f84, 4419, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f85, 4428, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f86, 4437, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f87, 4446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f88, 4455, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f89, 4462, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f8a, 4469, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f8b, 4478, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f8c, 4487, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f8d, 4496, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f8e, 4505, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f8f, 4514, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f90, 4523, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f91, 4530, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f92, 4537, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f93, 4546, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f94, 4555, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f95, 4564, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f96, 4573, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f97, 4582, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f98, 4591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f99, 4598, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f9a, 4605, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f9b, 4614, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f9c, 4623, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f9d, 4632, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f9e, 4641, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1f9f, 4650, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa0, 4659, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa1, 4666, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa2, 4673, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa3, 4682, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa4, 4691, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa5, 4700, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa6, 4709, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa7, 4718, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa8, 4727, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fa9, 4734, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1faa, 4741, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fab, 4750, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fac, 4759, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fad, 4768, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fae, 4777, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1faf, 4786, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb0, 4795, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb1, 4800, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb2, 4805, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb3, 4812, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb4, 4817, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb6, 4824, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb7, 4829, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb8, 4836, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fb9, 4841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fba, 4846, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fbb, 1261, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fbc, 4851, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fbd, G_UNICODE_NOT_PRESENT_OFFSET, 4856 }, + { 0x1fbe, 4860, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fbf, G_UNICODE_NOT_PRESENT_OFFSET, 4856 }, + { 0x1fc0, G_UNICODE_NOT_PRESENT_OFFSET, 4863 }, + { 0x1fc1, 4867, 4872 }, + { 0x1fc2, 4878, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fc3, 4885, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fc4, 4890, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fc6, 4897, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fc7, 4902, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fc8, 4909, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fc9, 1269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fca, 4914, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fcb, 1274, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fcc, 4919, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fcd, 4924, 4930 }, + { 0x1fce, 4936, 4942 }, + { 0x1fcf, 4948, 4954 }, + { 0x1fd0, 4960, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd1, 4965, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd2, 4970, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd3, 1299, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd6, 4977, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd7, 4982, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd8, 4989, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fd9, 4994, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fda, 4999, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fdb, 1279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fdd, 5004, 5010 }, + { 0x1fde, 5016, 5022 }, + { 0x1fdf, 5028, 5034 }, + { 0x1fe0, 5040, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe1, 5045, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe2, 5050, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe3, 1336, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe4, 5057, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe5, 5062, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe6, 5067, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe7, 5072, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe8, 5079, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fe9, 5084, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fea, 5089, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1feb, 1289, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fec, 5094, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1fed, 5099, 5104 }, + { 0x1fee, 1250, 1255 }, + { 0x1fef, 5110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff2, 5112, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff3, 5119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff4, 5124, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff6, 5131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff7, 5136, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff8, 5143, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ff9, 1284, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ffa, 5148, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ffb, 1294, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ffc, 5153, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1ffd, 5158, 16 }, + { 0x1ffe, G_UNICODE_NOT_PRESENT_OFFSET, 5161 }, + { 0x2000, 5165, 0 }, + { 0x2001, 5169, 0 }, + { 0x2002, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2003, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2004, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2005, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2006, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2007, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2008, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2009, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x200a, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2011, G_UNICODE_NOT_PRESENT_OFFSET, 5173 }, + { 0x2017, G_UNICODE_NOT_PRESENT_OFFSET, 5177 }, + { 0x2024, G_UNICODE_NOT_PRESENT_OFFSET, 5181 }, + { 0x2025, G_UNICODE_NOT_PRESENT_OFFSET, 5183 }, + { 0x2026, G_UNICODE_NOT_PRESENT_OFFSET, 5186 }, + { 0x202f, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2033, G_UNICODE_NOT_PRESENT_OFFSET, 5190 }, + { 0x2034, G_UNICODE_NOT_PRESENT_OFFSET, 5197 }, + { 0x2036, G_UNICODE_NOT_PRESENT_OFFSET, 5207 }, + { 0x2037, G_UNICODE_NOT_PRESENT_OFFSET, 5214 }, + { 0x203c, G_UNICODE_NOT_PRESENT_OFFSET, 5224 }, + { 0x203e, G_UNICODE_NOT_PRESENT_OFFSET, 5227 }, + { 0x2047, G_UNICODE_NOT_PRESENT_OFFSET, 5231 }, + { 0x2048, G_UNICODE_NOT_PRESENT_OFFSET, 5234 }, + { 0x2049, G_UNICODE_NOT_PRESENT_OFFSET, 5237 }, + { 0x2057, G_UNICODE_NOT_PRESENT_OFFSET, 5240 }, + { 0x205f, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x2070, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x2071, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x2074, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x2075, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x2076, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x2077, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x2078, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x2079, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x207a, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0x207b, G_UNICODE_NOT_PRESENT_OFFSET, 5269 }, + { 0x207c, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, + { 0x207d, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0x207e, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0x207f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x2080, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x2081, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x2082, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x2083, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x2084, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x2085, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x2086, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x2087, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x2088, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x2089, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x208a, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0x208b, G_UNICODE_NOT_PRESENT_OFFSET, 5269 }, + { 0x208c, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, + { 0x208d, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0x208e, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0x2090, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x2091, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x2092, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x2093, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x2094, G_UNICODE_NOT_PRESENT_OFFSET, 2370 }, + { 0x20a8, G_UNICODE_NOT_PRESENT_OFFSET, 5281 }, + { 0x2100, G_UNICODE_NOT_PRESENT_OFFSET, 5284 }, + { 0x2101, G_UNICODE_NOT_PRESENT_OFFSET, 5288 }, + { 0x2102, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x2103, G_UNICODE_NOT_PRESENT_OFFSET, 5294 }, + { 0x2105, G_UNICODE_NOT_PRESENT_OFFSET, 5298 }, + { 0x2106, G_UNICODE_NOT_PRESENT_OFFSET, 5302 }, + { 0x2107, G_UNICODE_NOT_PRESENT_OFFSET, 5306 }, + { 0x2109, G_UNICODE_NOT_PRESENT_OFFSET, 5309 }, + { 0x210a, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x210b, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x210c, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x210d, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x210e, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x210f, G_UNICODE_NOT_PRESENT_OFFSET, 5313 }, + { 0x2110, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x2111, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x2112, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x2113, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x2115, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x2116, G_UNICODE_NOT_PRESENT_OFFSET, 5316 }, + { 0x2119, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x211a, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x211b, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x211c, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x211d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x2120, G_UNICODE_NOT_PRESENT_OFFSET, 5321 }, + { 0x2121, G_UNICODE_NOT_PRESENT_OFFSET, 5324 }, + { 0x2122, G_UNICODE_NOT_PRESENT_OFFSET, 5328 }, + { 0x2124, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x2126, 5333, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2128, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x212a, 2331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x212b, 69, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x212c, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x212d, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x212f, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x2130, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x2131, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x2133, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x2134, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x2135, G_UNICODE_NOT_PRESENT_OFFSET, 5338 }, + { 0x2136, G_UNICODE_NOT_PRESENT_OFFSET, 5341 }, + { 0x2137, G_UNICODE_NOT_PRESENT_OFFSET, 5344 }, + { 0x2138, G_UNICODE_NOT_PRESENT_OFFSET, 5347 }, + { 0x2139, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x213b, G_UNICODE_NOT_PRESENT_OFFSET, 5350 }, + { 0x213c, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x213d, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x213e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x213f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x2140, G_UNICODE_NOT_PRESENT_OFFSET, 5360 }, + { 0x2145, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x2146, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x2147, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x2148, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x2149, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x2153, G_UNICODE_NOT_PRESENT_OFFSET, 5364 }, + { 0x2154, G_UNICODE_NOT_PRESENT_OFFSET, 5370 }, + { 0x2155, G_UNICODE_NOT_PRESENT_OFFSET, 5376 }, + { 0x2156, G_UNICODE_NOT_PRESENT_OFFSET, 5382 }, + { 0x2157, G_UNICODE_NOT_PRESENT_OFFSET, 5388 }, + { 0x2158, G_UNICODE_NOT_PRESENT_OFFSET, 5394 }, + { 0x2159, G_UNICODE_NOT_PRESENT_OFFSET, 5400 }, + { 0x215a, G_UNICODE_NOT_PRESENT_OFFSET, 5406 }, + { 0x215b, G_UNICODE_NOT_PRESENT_OFFSET, 5412 }, + { 0x215c, G_UNICODE_NOT_PRESENT_OFFSET, 5418 }, + { 0x215d, G_UNICODE_NOT_PRESENT_OFFSET, 5424 }, + { 0x215e, G_UNICODE_NOT_PRESENT_OFFSET, 5430 }, + { 0x215f, G_UNICODE_NOT_PRESENT_OFFSET, 5436 }, + { 0x2160, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x2161, G_UNICODE_NOT_PRESENT_OFFSET, 5441 }, + { 0x2162, G_UNICODE_NOT_PRESENT_OFFSET, 5444 }, + { 0x2163, G_UNICODE_NOT_PRESENT_OFFSET, 5448 }, + { 0x2164, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x2165, G_UNICODE_NOT_PRESENT_OFFSET, 5453 }, + { 0x2166, G_UNICODE_NOT_PRESENT_OFFSET, 5456 }, + { 0x2167, G_UNICODE_NOT_PRESENT_OFFSET, 5460 }, + { 0x2168, G_UNICODE_NOT_PRESENT_OFFSET, 5465 }, + { 0x2169, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x216a, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x216b, G_UNICODE_NOT_PRESENT_OFFSET, 5473 }, + { 0x216c, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x216d, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x216e, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x216f, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x2170, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x2171, G_UNICODE_NOT_PRESENT_OFFSET, 5477 }, + { 0x2172, G_UNICODE_NOT_PRESENT_OFFSET, 5480 }, + { 0x2173, G_UNICODE_NOT_PRESENT_OFFSET, 5484 }, + { 0x2174, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x2175, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x2176, G_UNICODE_NOT_PRESENT_OFFSET, 5490 }, + { 0x2177, G_UNICODE_NOT_PRESENT_OFFSET, 5494 }, + { 0x2178, G_UNICODE_NOT_PRESENT_OFFSET, 5499 }, + { 0x2179, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x217a, G_UNICODE_NOT_PRESENT_OFFSET, 5502 }, + { 0x217b, G_UNICODE_NOT_PRESENT_OFFSET, 5505 }, + { 0x217c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x217d, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x217e, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x217f, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x219a, 5509, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x219b, 5515, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21ae, 5521, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21cd, 5527, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21ce, 5533, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21cf, 5539, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2204, 5545, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2209, 5551, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x220c, 5557, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2224, 5563, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2226, 5569, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x222c, G_UNICODE_NOT_PRESENT_OFFSET, 5575 }, + { 0x222d, G_UNICODE_NOT_PRESENT_OFFSET, 5582 }, + { 0x222f, G_UNICODE_NOT_PRESENT_OFFSET, 5592 }, + { 0x2230, G_UNICODE_NOT_PRESENT_OFFSET, 5599 }, + { 0x2241, 5609, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2244, 5615, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2247, 5621, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2249, 5627, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2260, 5633, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2262, 5637, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x226d, 5643, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x226e, 5649, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x226f, 5653, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2270, 5657, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2271, 5663, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2274, 5669, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2275, 5675, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2278, 5681, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2279, 5687, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2280, 5693, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2281, 5699, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2284, 5705, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2285, 5711, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2288, 5717, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2289, 5723, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ac, 5729, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ad, 5735, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ae, 5741, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22af, 5747, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e0, 5753, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e1, 5759, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e2, 5765, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e3, 5771, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ea, 5777, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22eb, 5783, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ec, 5789, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ed, 5795, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2329, 5801, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x232a, 5805, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2460, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x2461, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x2462, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x2463, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x2464, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x2465, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x2466, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x2467, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x2468, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x2469, G_UNICODE_NOT_PRESENT_OFFSET, 5809 }, + { 0x246a, G_UNICODE_NOT_PRESENT_OFFSET, 5812 }, + { 0x246b, G_UNICODE_NOT_PRESENT_OFFSET, 5815 }, + { 0x246c, G_UNICODE_NOT_PRESENT_OFFSET, 5818 }, + { 0x246d, G_UNICODE_NOT_PRESENT_OFFSET, 5821 }, + { 0x246e, G_UNICODE_NOT_PRESENT_OFFSET, 5824 }, + { 0x246f, G_UNICODE_NOT_PRESENT_OFFSET, 5827 }, + { 0x2470, G_UNICODE_NOT_PRESENT_OFFSET, 5830 }, + { 0x2471, G_UNICODE_NOT_PRESENT_OFFSET, 5833 }, + { 0x2472, G_UNICODE_NOT_PRESENT_OFFSET, 5836 }, + { 0x2473, G_UNICODE_NOT_PRESENT_OFFSET, 5839 }, + { 0x2474, G_UNICODE_NOT_PRESENT_OFFSET, 5842 }, + { 0x2475, G_UNICODE_NOT_PRESENT_OFFSET, 5846 }, + { 0x2476, G_UNICODE_NOT_PRESENT_OFFSET, 5850 }, + { 0x2477, G_UNICODE_NOT_PRESENT_OFFSET, 5854 }, + { 0x2478, G_UNICODE_NOT_PRESENT_OFFSET, 5858 }, + { 0x2479, G_UNICODE_NOT_PRESENT_OFFSET, 5862 }, + { 0x247a, G_UNICODE_NOT_PRESENT_OFFSET, 5866 }, + { 0x247b, G_UNICODE_NOT_PRESENT_OFFSET, 5870 }, + { 0x247c, G_UNICODE_NOT_PRESENT_OFFSET, 5874 }, + { 0x247d, G_UNICODE_NOT_PRESENT_OFFSET, 5878 }, + { 0x247e, G_UNICODE_NOT_PRESENT_OFFSET, 5883 }, + { 0x247f, G_UNICODE_NOT_PRESENT_OFFSET, 5888 }, + { 0x2480, G_UNICODE_NOT_PRESENT_OFFSET, 5893 }, + { 0x2481, G_UNICODE_NOT_PRESENT_OFFSET, 5898 }, + { 0x2482, G_UNICODE_NOT_PRESENT_OFFSET, 5903 }, + { 0x2483, G_UNICODE_NOT_PRESENT_OFFSET, 5908 }, + { 0x2484, G_UNICODE_NOT_PRESENT_OFFSET, 5913 }, + { 0x2485, G_UNICODE_NOT_PRESENT_OFFSET, 5918 }, + { 0x2486, G_UNICODE_NOT_PRESENT_OFFSET, 5923 }, + { 0x2487, G_UNICODE_NOT_PRESENT_OFFSET, 5928 }, + { 0x2488, G_UNICODE_NOT_PRESENT_OFFSET, 5933 }, + { 0x2489, G_UNICODE_NOT_PRESENT_OFFSET, 5936 }, + { 0x248a, G_UNICODE_NOT_PRESENT_OFFSET, 5939 }, + { 0x248b, G_UNICODE_NOT_PRESENT_OFFSET, 5942 }, + { 0x248c, G_UNICODE_NOT_PRESENT_OFFSET, 5945 }, + { 0x248d, G_UNICODE_NOT_PRESENT_OFFSET, 5948 }, + { 0x248e, G_UNICODE_NOT_PRESENT_OFFSET, 5951 }, + { 0x248f, G_UNICODE_NOT_PRESENT_OFFSET, 5954 }, + { 0x2490, G_UNICODE_NOT_PRESENT_OFFSET, 5957 }, + { 0x2491, G_UNICODE_NOT_PRESENT_OFFSET, 5960 }, + { 0x2492, G_UNICODE_NOT_PRESENT_OFFSET, 5964 }, + { 0x2493, G_UNICODE_NOT_PRESENT_OFFSET, 5968 }, + { 0x2494, G_UNICODE_NOT_PRESENT_OFFSET, 5972 }, + { 0x2495, G_UNICODE_NOT_PRESENT_OFFSET, 5976 }, + { 0x2496, G_UNICODE_NOT_PRESENT_OFFSET, 5980 }, + { 0x2497, G_UNICODE_NOT_PRESENT_OFFSET, 5984 }, + { 0x2498, G_UNICODE_NOT_PRESENT_OFFSET, 5988 }, + { 0x2499, G_UNICODE_NOT_PRESENT_OFFSET, 5992 }, + { 0x249a, G_UNICODE_NOT_PRESENT_OFFSET, 5996 }, + { 0x249b, G_UNICODE_NOT_PRESENT_OFFSET, 6000 }, + { 0x249c, G_UNICODE_NOT_PRESENT_OFFSET, 6004 }, + { 0x249d, G_UNICODE_NOT_PRESENT_OFFSET, 6008 }, + { 0x249e, G_UNICODE_NOT_PRESENT_OFFSET, 6012 }, + { 0x249f, G_UNICODE_NOT_PRESENT_OFFSET, 6016 }, + { 0x24a0, G_UNICODE_NOT_PRESENT_OFFSET, 6020 }, + { 0x24a1, G_UNICODE_NOT_PRESENT_OFFSET, 6024 }, + { 0x24a2, G_UNICODE_NOT_PRESENT_OFFSET, 6028 }, + { 0x24a3, G_UNICODE_NOT_PRESENT_OFFSET, 6032 }, + { 0x24a4, G_UNICODE_NOT_PRESENT_OFFSET, 6036 }, + { 0x24a5, G_UNICODE_NOT_PRESENT_OFFSET, 6040 }, + { 0x24a6, G_UNICODE_NOT_PRESENT_OFFSET, 6044 }, + { 0x24a7, G_UNICODE_NOT_PRESENT_OFFSET, 6048 }, + { 0x24a8, G_UNICODE_NOT_PRESENT_OFFSET, 6052 }, + { 0x24a9, G_UNICODE_NOT_PRESENT_OFFSET, 6056 }, + { 0x24aa, G_UNICODE_NOT_PRESENT_OFFSET, 6060 }, + { 0x24ab, G_UNICODE_NOT_PRESENT_OFFSET, 6064 }, + { 0x24ac, G_UNICODE_NOT_PRESENT_OFFSET, 6068 }, + { 0x24ad, G_UNICODE_NOT_PRESENT_OFFSET, 6072 }, + { 0x24ae, G_UNICODE_NOT_PRESENT_OFFSET, 6076 }, + { 0x24af, G_UNICODE_NOT_PRESENT_OFFSET, 6080 }, + { 0x24b0, G_UNICODE_NOT_PRESENT_OFFSET, 6084 }, + { 0x24b1, G_UNICODE_NOT_PRESENT_OFFSET, 6088 }, + { 0x24b2, G_UNICODE_NOT_PRESENT_OFFSET, 6092 }, + { 0x24b3, G_UNICODE_NOT_PRESENT_OFFSET, 6096 }, + { 0x24b4, G_UNICODE_NOT_PRESENT_OFFSET, 6100 }, + { 0x24b5, G_UNICODE_NOT_PRESENT_OFFSET, 6104 }, + { 0x24b6, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x24b7, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x24b8, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x24b9, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x24ba, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x24bb, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x24bc, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x24bd, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x24be, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x24bf, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x24c0, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x24c1, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x24c2, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x24c3, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x24c4, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x24c5, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x24c6, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x24c7, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x24c8, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x24c9, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x24ca, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x24cb, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x24cc, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x24cd, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x24ce, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x24cf, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x24d0, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x24d1, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x24d2, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x24d3, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x24d4, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x24d5, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x24d6, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x24d7, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x24d8, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x24d9, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x24da, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x24db, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x24dc, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x24dd, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x24de, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x24df, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x24e0, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x24e1, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x24e2, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x24e3, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x24e4, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x24e5, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x24e6, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x24e7, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x24e8, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x24e9, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x24ea, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x2a0c, G_UNICODE_NOT_PRESENT_OFFSET, 6114 }, + { 0x2a74, G_UNICODE_NOT_PRESENT_OFFSET, 6127 }, + { 0x2a75, G_UNICODE_NOT_PRESENT_OFFSET, 6131 }, + { 0x2a76, G_UNICODE_NOT_PRESENT_OFFSET, 6134 }, + { 0x2adc, 6138, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2d6f, G_UNICODE_NOT_PRESENT_OFFSET, 6144 }, + { 0x2e9f, G_UNICODE_NOT_PRESENT_OFFSET, 6148 }, + { 0x2ef3, G_UNICODE_NOT_PRESENT_OFFSET, 6152 }, + { 0x2f00, G_UNICODE_NOT_PRESENT_OFFSET, 6156 }, + { 0x2f01, G_UNICODE_NOT_PRESENT_OFFSET, 6160 }, + { 0x2f02, G_UNICODE_NOT_PRESENT_OFFSET, 6164 }, + { 0x2f03, G_UNICODE_NOT_PRESENT_OFFSET, 6168 }, + { 0x2f04, G_UNICODE_NOT_PRESENT_OFFSET, 6172 }, + { 0x2f05, G_UNICODE_NOT_PRESENT_OFFSET, 6176 }, + { 0x2f06, G_UNICODE_NOT_PRESENT_OFFSET, 6180 }, + { 0x2f07, G_UNICODE_NOT_PRESENT_OFFSET, 6184 }, + { 0x2f08, G_UNICODE_NOT_PRESENT_OFFSET, 6188 }, + { 0x2f09, G_UNICODE_NOT_PRESENT_OFFSET, 6192 }, + { 0x2f0a, G_UNICODE_NOT_PRESENT_OFFSET, 6196 }, + { 0x2f0b, G_UNICODE_NOT_PRESENT_OFFSET, 6200 }, + { 0x2f0c, G_UNICODE_NOT_PRESENT_OFFSET, 6204 }, + { 0x2f0d, G_UNICODE_NOT_PRESENT_OFFSET, 6208 }, + { 0x2f0e, G_UNICODE_NOT_PRESENT_OFFSET, 6212 }, + { 0x2f0f, G_UNICODE_NOT_PRESENT_OFFSET, 6216 }, + { 0x2f10, G_UNICODE_NOT_PRESENT_OFFSET, 6220 }, + { 0x2f11, G_UNICODE_NOT_PRESENT_OFFSET, 6224 }, + { 0x2f12, G_UNICODE_NOT_PRESENT_OFFSET, 6228 }, + { 0x2f13, G_UNICODE_NOT_PRESENT_OFFSET, 6232 }, + { 0x2f14, G_UNICODE_NOT_PRESENT_OFFSET, 6236 }, + { 0x2f15, G_UNICODE_NOT_PRESENT_OFFSET, 6240 }, + { 0x2f16, G_UNICODE_NOT_PRESENT_OFFSET, 6244 }, + { 0x2f17, G_UNICODE_NOT_PRESENT_OFFSET, 6248 }, + { 0x2f18, G_UNICODE_NOT_PRESENT_OFFSET, 6252 }, + { 0x2f19, G_UNICODE_NOT_PRESENT_OFFSET, 6256 }, + { 0x2f1a, G_UNICODE_NOT_PRESENT_OFFSET, 6260 }, + { 0x2f1b, G_UNICODE_NOT_PRESENT_OFFSET, 6264 }, + { 0x2f1c, G_UNICODE_NOT_PRESENT_OFFSET, 6268 }, + { 0x2f1d, G_UNICODE_NOT_PRESENT_OFFSET, 6272 }, + { 0x2f1e, G_UNICODE_NOT_PRESENT_OFFSET, 6276 }, + { 0x2f1f, G_UNICODE_NOT_PRESENT_OFFSET, 6280 }, + { 0x2f20, G_UNICODE_NOT_PRESENT_OFFSET, 6284 }, + { 0x2f21, G_UNICODE_NOT_PRESENT_OFFSET, 6288 }, + { 0x2f22, G_UNICODE_NOT_PRESENT_OFFSET, 6292 }, + { 0x2f23, G_UNICODE_NOT_PRESENT_OFFSET, 6296 }, + { 0x2f24, G_UNICODE_NOT_PRESENT_OFFSET, 6300 }, + { 0x2f25, G_UNICODE_NOT_PRESENT_OFFSET, 6304 }, + { 0x2f26, G_UNICODE_NOT_PRESENT_OFFSET, 6308 }, + { 0x2f27, G_UNICODE_NOT_PRESENT_OFFSET, 6312 }, + { 0x2f28, G_UNICODE_NOT_PRESENT_OFFSET, 6316 }, + { 0x2f29, G_UNICODE_NOT_PRESENT_OFFSET, 6320 }, + { 0x2f2a, G_UNICODE_NOT_PRESENT_OFFSET, 6324 }, + { 0x2f2b, G_UNICODE_NOT_PRESENT_OFFSET, 6328 }, + { 0x2f2c, G_UNICODE_NOT_PRESENT_OFFSET, 6332 }, + { 0x2f2d, G_UNICODE_NOT_PRESENT_OFFSET, 6336 }, + { 0x2f2e, G_UNICODE_NOT_PRESENT_OFFSET, 6340 }, + { 0x2f2f, G_UNICODE_NOT_PRESENT_OFFSET, 6344 }, + { 0x2f30, G_UNICODE_NOT_PRESENT_OFFSET, 6348 }, + { 0x2f31, G_UNICODE_NOT_PRESENT_OFFSET, 6352 }, + { 0x2f32, G_UNICODE_NOT_PRESENT_OFFSET, 6356 }, + { 0x2f33, G_UNICODE_NOT_PRESENT_OFFSET, 6360 }, + { 0x2f34, G_UNICODE_NOT_PRESENT_OFFSET, 6364 }, + { 0x2f35, G_UNICODE_NOT_PRESENT_OFFSET, 6368 }, + { 0x2f36, G_UNICODE_NOT_PRESENT_OFFSET, 6372 }, + { 0x2f37, G_UNICODE_NOT_PRESENT_OFFSET, 6376 }, + { 0x2f38, G_UNICODE_NOT_PRESENT_OFFSET, 6380 }, + { 0x2f39, G_UNICODE_NOT_PRESENT_OFFSET, 6384 }, + { 0x2f3a, G_UNICODE_NOT_PRESENT_OFFSET, 6388 }, + { 0x2f3b, G_UNICODE_NOT_PRESENT_OFFSET, 6392 }, + { 0x2f3c, G_UNICODE_NOT_PRESENT_OFFSET, 6396 }, + { 0x2f3d, G_UNICODE_NOT_PRESENT_OFFSET, 6400 }, + { 0x2f3e, G_UNICODE_NOT_PRESENT_OFFSET, 6404 }, + { 0x2f3f, G_UNICODE_NOT_PRESENT_OFFSET, 6408 }, + { 0x2f40, G_UNICODE_NOT_PRESENT_OFFSET, 6412 }, + { 0x2f41, G_UNICODE_NOT_PRESENT_OFFSET, 6416 }, + { 0x2f42, G_UNICODE_NOT_PRESENT_OFFSET, 6420 }, + { 0x2f43, G_UNICODE_NOT_PRESENT_OFFSET, 6424 }, + { 0x2f44, G_UNICODE_NOT_PRESENT_OFFSET, 6428 }, + { 0x2f45, G_UNICODE_NOT_PRESENT_OFFSET, 6432 }, + { 0x2f46, G_UNICODE_NOT_PRESENT_OFFSET, 6436 }, + { 0x2f47, G_UNICODE_NOT_PRESENT_OFFSET, 6440 }, + { 0x2f48, G_UNICODE_NOT_PRESENT_OFFSET, 6444 }, + { 0x2f49, G_UNICODE_NOT_PRESENT_OFFSET, 6448 }, + { 0x2f4a, G_UNICODE_NOT_PRESENT_OFFSET, 6452 }, + { 0x2f4b, G_UNICODE_NOT_PRESENT_OFFSET, 6456 }, + { 0x2f4c, G_UNICODE_NOT_PRESENT_OFFSET, 6460 }, + { 0x2f4d, G_UNICODE_NOT_PRESENT_OFFSET, 6464 }, + { 0x2f4e, G_UNICODE_NOT_PRESENT_OFFSET, 6468 }, + { 0x2f4f, G_UNICODE_NOT_PRESENT_OFFSET, 6472 }, + { 0x2f50, G_UNICODE_NOT_PRESENT_OFFSET, 6476 }, + { 0x2f51, G_UNICODE_NOT_PRESENT_OFFSET, 6480 }, + { 0x2f52, G_UNICODE_NOT_PRESENT_OFFSET, 6484 }, + { 0x2f53, G_UNICODE_NOT_PRESENT_OFFSET, 6488 }, + { 0x2f54, G_UNICODE_NOT_PRESENT_OFFSET, 6492 }, + { 0x2f55, G_UNICODE_NOT_PRESENT_OFFSET, 6496 }, + { 0x2f56, G_UNICODE_NOT_PRESENT_OFFSET, 6500 }, + { 0x2f57, G_UNICODE_NOT_PRESENT_OFFSET, 6504 }, + { 0x2f58, G_UNICODE_NOT_PRESENT_OFFSET, 6508 }, + { 0x2f59, G_UNICODE_NOT_PRESENT_OFFSET, 6512 }, + { 0x2f5a, G_UNICODE_NOT_PRESENT_OFFSET, 6516 }, + { 0x2f5b, G_UNICODE_NOT_PRESENT_OFFSET, 6520 }, + { 0x2f5c, G_UNICODE_NOT_PRESENT_OFFSET, 6524 }, + { 0x2f5d, G_UNICODE_NOT_PRESENT_OFFSET, 6528 }, + { 0x2f5e, G_UNICODE_NOT_PRESENT_OFFSET, 6532 }, + { 0x2f5f, G_UNICODE_NOT_PRESENT_OFFSET, 6536 }, + { 0x2f60, G_UNICODE_NOT_PRESENT_OFFSET, 6540 }, + { 0x2f61, G_UNICODE_NOT_PRESENT_OFFSET, 6544 }, + { 0x2f62, G_UNICODE_NOT_PRESENT_OFFSET, 6548 }, + { 0x2f63, G_UNICODE_NOT_PRESENT_OFFSET, 6552 }, + { 0x2f64, G_UNICODE_NOT_PRESENT_OFFSET, 6556 }, + { 0x2f65, G_UNICODE_NOT_PRESENT_OFFSET, 6560 }, + { 0x2f66, G_UNICODE_NOT_PRESENT_OFFSET, 6564 }, + { 0x2f67, G_UNICODE_NOT_PRESENT_OFFSET, 6568 }, + { 0x2f68, G_UNICODE_NOT_PRESENT_OFFSET, 6572 }, + { 0x2f69, G_UNICODE_NOT_PRESENT_OFFSET, 6576 }, + { 0x2f6a, G_UNICODE_NOT_PRESENT_OFFSET, 6580 }, + { 0x2f6b, G_UNICODE_NOT_PRESENT_OFFSET, 6584 }, + { 0x2f6c, G_UNICODE_NOT_PRESENT_OFFSET, 6588 }, + { 0x2f6d, G_UNICODE_NOT_PRESENT_OFFSET, 6592 }, + { 0x2f6e, G_UNICODE_NOT_PRESENT_OFFSET, 6596 }, + { 0x2f6f, G_UNICODE_NOT_PRESENT_OFFSET, 6600 }, + { 0x2f70, G_UNICODE_NOT_PRESENT_OFFSET, 6604 }, + { 0x2f71, G_UNICODE_NOT_PRESENT_OFFSET, 6608 }, + { 0x2f72, G_UNICODE_NOT_PRESENT_OFFSET, 6612 }, + { 0x2f73, G_UNICODE_NOT_PRESENT_OFFSET, 6616 }, + { 0x2f74, G_UNICODE_NOT_PRESENT_OFFSET, 6620 }, + { 0x2f75, G_UNICODE_NOT_PRESENT_OFFSET, 6624 }, + { 0x2f76, G_UNICODE_NOT_PRESENT_OFFSET, 6628 }, + { 0x2f77, G_UNICODE_NOT_PRESENT_OFFSET, 6632 }, + { 0x2f78, G_UNICODE_NOT_PRESENT_OFFSET, 6636 }, + { 0x2f79, G_UNICODE_NOT_PRESENT_OFFSET, 6640 }, + { 0x2f7a, G_UNICODE_NOT_PRESENT_OFFSET, 6644 }, + { 0x2f7b, G_UNICODE_NOT_PRESENT_OFFSET, 6648 }, + { 0x2f7c, G_UNICODE_NOT_PRESENT_OFFSET, 6652 }, + { 0x2f7d, G_UNICODE_NOT_PRESENT_OFFSET, 6656 }, + { 0x2f7e, G_UNICODE_NOT_PRESENT_OFFSET, 6660 }, + { 0x2f7f, G_UNICODE_NOT_PRESENT_OFFSET, 6664 }, + { 0x2f80, G_UNICODE_NOT_PRESENT_OFFSET, 6668 }, + { 0x2f81, G_UNICODE_NOT_PRESENT_OFFSET, 6672 }, + { 0x2f82, G_UNICODE_NOT_PRESENT_OFFSET, 6676 }, + { 0x2f83, G_UNICODE_NOT_PRESENT_OFFSET, 6680 }, + { 0x2f84, G_UNICODE_NOT_PRESENT_OFFSET, 6684 }, + { 0x2f85, G_UNICODE_NOT_PRESENT_OFFSET, 6688 }, + { 0x2f86, G_UNICODE_NOT_PRESENT_OFFSET, 6692 }, + { 0x2f87, G_UNICODE_NOT_PRESENT_OFFSET, 6696 }, + { 0x2f88, G_UNICODE_NOT_PRESENT_OFFSET, 6700 }, + { 0x2f89, G_UNICODE_NOT_PRESENT_OFFSET, 6704 }, + { 0x2f8a, G_UNICODE_NOT_PRESENT_OFFSET, 6708 }, + { 0x2f8b, G_UNICODE_NOT_PRESENT_OFFSET, 6712 }, + { 0x2f8c, G_UNICODE_NOT_PRESENT_OFFSET, 6716 }, + { 0x2f8d, G_UNICODE_NOT_PRESENT_OFFSET, 6720 }, + { 0x2f8e, G_UNICODE_NOT_PRESENT_OFFSET, 6724 }, + { 0x2f8f, G_UNICODE_NOT_PRESENT_OFFSET, 6728 }, + { 0x2f90, G_UNICODE_NOT_PRESENT_OFFSET, 6732 }, + { 0x2f91, G_UNICODE_NOT_PRESENT_OFFSET, 6736 }, + { 0x2f92, G_UNICODE_NOT_PRESENT_OFFSET, 6740 }, + { 0x2f93, G_UNICODE_NOT_PRESENT_OFFSET, 6744 }, + { 0x2f94, G_UNICODE_NOT_PRESENT_OFFSET, 6748 }, + { 0x2f95, G_UNICODE_NOT_PRESENT_OFFSET, 6752 }, + { 0x2f96, G_UNICODE_NOT_PRESENT_OFFSET, 6756 }, + { 0x2f97, G_UNICODE_NOT_PRESENT_OFFSET, 6760 }, + { 0x2f98, G_UNICODE_NOT_PRESENT_OFFSET, 6764 }, + { 0x2f99, G_UNICODE_NOT_PRESENT_OFFSET, 6768 }, + { 0x2f9a, G_UNICODE_NOT_PRESENT_OFFSET, 6772 }, + { 0x2f9b, G_UNICODE_NOT_PRESENT_OFFSET, 6776 }, + { 0x2f9c, G_UNICODE_NOT_PRESENT_OFFSET, 6780 }, + { 0x2f9d, G_UNICODE_NOT_PRESENT_OFFSET, 6784 }, + { 0x2f9e, G_UNICODE_NOT_PRESENT_OFFSET, 6788 }, + { 0x2f9f, G_UNICODE_NOT_PRESENT_OFFSET, 6792 }, + { 0x2fa0, G_UNICODE_NOT_PRESENT_OFFSET, 6796 }, + { 0x2fa1, G_UNICODE_NOT_PRESENT_OFFSET, 6800 }, + { 0x2fa2, G_UNICODE_NOT_PRESENT_OFFSET, 6804 }, + { 0x2fa3, G_UNICODE_NOT_PRESENT_OFFSET, 6808 }, + { 0x2fa4, G_UNICODE_NOT_PRESENT_OFFSET, 6812 }, + { 0x2fa5, G_UNICODE_NOT_PRESENT_OFFSET, 6816 }, + { 0x2fa6, G_UNICODE_NOT_PRESENT_OFFSET, 6820 }, + { 0x2fa7, G_UNICODE_NOT_PRESENT_OFFSET, 6824 }, + { 0x2fa8, G_UNICODE_NOT_PRESENT_OFFSET, 6828 }, + { 0x2fa9, G_UNICODE_NOT_PRESENT_OFFSET, 6832 }, + { 0x2faa, G_UNICODE_NOT_PRESENT_OFFSET, 6836 }, + { 0x2fab, G_UNICODE_NOT_PRESENT_OFFSET, 6840 }, + { 0x2fac, G_UNICODE_NOT_PRESENT_OFFSET, 6844 }, + { 0x2fad, G_UNICODE_NOT_PRESENT_OFFSET, 6848 }, + { 0x2fae, G_UNICODE_NOT_PRESENT_OFFSET, 6852 }, + { 0x2faf, G_UNICODE_NOT_PRESENT_OFFSET, 6856 }, + { 0x2fb0, G_UNICODE_NOT_PRESENT_OFFSET, 6860 }, + { 0x2fb1, G_UNICODE_NOT_PRESENT_OFFSET, 6864 }, + { 0x2fb2, G_UNICODE_NOT_PRESENT_OFFSET, 6868 }, + { 0x2fb3, G_UNICODE_NOT_PRESENT_OFFSET, 6872 }, + { 0x2fb4, G_UNICODE_NOT_PRESENT_OFFSET, 6876 }, + { 0x2fb5, G_UNICODE_NOT_PRESENT_OFFSET, 6880 }, + { 0x2fb6, G_UNICODE_NOT_PRESENT_OFFSET, 6884 }, + { 0x2fb7, G_UNICODE_NOT_PRESENT_OFFSET, 6888 }, + { 0x2fb8, G_UNICODE_NOT_PRESENT_OFFSET, 6892 }, + { 0x2fb9, G_UNICODE_NOT_PRESENT_OFFSET, 6896 }, + { 0x2fba, G_UNICODE_NOT_PRESENT_OFFSET, 6900 }, + { 0x2fbb, G_UNICODE_NOT_PRESENT_OFFSET, 6904 }, + { 0x2fbc, G_UNICODE_NOT_PRESENT_OFFSET, 6908 }, + { 0x2fbd, G_UNICODE_NOT_PRESENT_OFFSET, 6912 }, + { 0x2fbe, G_UNICODE_NOT_PRESENT_OFFSET, 6916 }, + { 0x2fbf, G_UNICODE_NOT_PRESENT_OFFSET, 6920 }, + { 0x2fc0, G_UNICODE_NOT_PRESENT_OFFSET, 6924 }, + { 0x2fc1, G_UNICODE_NOT_PRESENT_OFFSET, 6928 }, + { 0x2fc2, G_UNICODE_NOT_PRESENT_OFFSET, 6932 }, + { 0x2fc3, G_UNICODE_NOT_PRESENT_OFFSET, 6936 }, + { 0x2fc4, G_UNICODE_NOT_PRESENT_OFFSET, 6940 }, + { 0x2fc5, G_UNICODE_NOT_PRESENT_OFFSET, 6944 }, + { 0x2fc6, G_UNICODE_NOT_PRESENT_OFFSET, 6948 }, + { 0x2fc7, G_UNICODE_NOT_PRESENT_OFFSET, 6952 }, + { 0x2fc8, G_UNICODE_NOT_PRESENT_OFFSET, 6956 }, + { 0x2fc9, G_UNICODE_NOT_PRESENT_OFFSET, 6960 }, + { 0x2fca, G_UNICODE_NOT_PRESENT_OFFSET, 6964 }, + { 0x2fcb, G_UNICODE_NOT_PRESENT_OFFSET, 6968 }, + { 0x2fcc, G_UNICODE_NOT_PRESENT_OFFSET, 6972 }, + { 0x2fcd, G_UNICODE_NOT_PRESENT_OFFSET, 6976 }, + { 0x2fce, G_UNICODE_NOT_PRESENT_OFFSET, 6980 }, + { 0x2fcf, G_UNICODE_NOT_PRESENT_OFFSET, 6984 }, + { 0x2fd0, G_UNICODE_NOT_PRESENT_OFFSET, 6988 }, + { 0x2fd1, G_UNICODE_NOT_PRESENT_OFFSET, 6992 }, + { 0x2fd2, G_UNICODE_NOT_PRESENT_OFFSET, 6996 }, + { 0x2fd3, G_UNICODE_NOT_PRESENT_OFFSET, 7000 }, + { 0x2fd4, G_UNICODE_NOT_PRESENT_OFFSET, 7004 }, + { 0x2fd5, G_UNICODE_NOT_PRESENT_OFFSET, 7008 }, + { 0x3000, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x3036, G_UNICODE_NOT_PRESENT_OFFSET, 7012 }, + { 0x3038, G_UNICODE_NOT_PRESENT_OFFSET, 6248 }, + { 0x3039, G_UNICODE_NOT_PRESENT_OFFSET, 7016 }, + { 0x303a, G_UNICODE_NOT_PRESENT_OFFSET, 7020 }, + { 0x304c, 7024, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x304e, 7031, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3050, 7038, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3052, 7045, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3054, 7052, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3056, 7059, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3058, 7066, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x305a, 7073, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x305c, 7080, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x305e, 7087, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3060, 7094, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3062, 7101, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3065, 7108, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3067, 7115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3069, 7122, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3070, 7129, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3071, 7136, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3073, 7143, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3074, 7150, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3076, 7157, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3077, 7164, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3079, 7171, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x307a, 7178, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x307c, 7185, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x307d, 7192, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3094, 7199, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x309b, G_UNICODE_NOT_PRESENT_OFFSET, 7206 }, + { 0x309c, G_UNICODE_NOT_PRESENT_OFFSET, 7211 }, + { 0x309e, 7216, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x309f, G_UNICODE_NOT_PRESENT_OFFSET, 7223 }, + { 0x30ac, 7230, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30ae, 7237, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b0, 7244, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b2, 7251, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b4, 7258, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b6, 7265, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b8, 7272, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30ba, 7279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30bc, 7286, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30be, 7293, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c0, 7300, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c2, 7307, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c5, 7314, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c7, 7321, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c9, 7328, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d0, 7335, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d1, 7342, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d3, 7349, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d4, 7356, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d6, 7363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d7, 7370, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d9, 7377, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30da, 7384, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30dc, 7391, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30dd, 7398, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f4, 7405, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f7, 7412, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f8, 7419, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f9, 7426, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30fa, 7433, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30fe, 7440, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30ff, G_UNICODE_NOT_PRESENT_OFFSET, 7447 }, + { 0x3131, G_UNICODE_NOT_PRESENT_OFFSET, 7454 }, + { 0x3132, G_UNICODE_NOT_PRESENT_OFFSET, 7458 }, + { 0x3133, G_UNICODE_NOT_PRESENT_OFFSET, 7462 }, + { 0x3134, G_UNICODE_NOT_PRESENT_OFFSET, 7466 }, + { 0x3135, G_UNICODE_NOT_PRESENT_OFFSET, 7470 }, + { 0x3136, G_UNICODE_NOT_PRESENT_OFFSET, 7474 }, + { 0x3137, G_UNICODE_NOT_PRESENT_OFFSET, 7478 }, + { 0x3138, G_UNICODE_NOT_PRESENT_OFFSET, 7482 }, + { 0x3139, G_UNICODE_NOT_PRESENT_OFFSET, 7486 }, + { 0x313a, G_UNICODE_NOT_PRESENT_OFFSET, 7490 }, + { 0x313b, G_UNICODE_NOT_PRESENT_OFFSET, 7494 }, + { 0x313c, G_UNICODE_NOT_PRESENT_OFFSET, 7498 }, + { 0x313d, G_UNICODE_NOT_PRESENT_OFFSET, 7502 }, + { 0x313e, G_UNICODE_NOT_PRESENT_OFFSET, 7506 }, + { 0x313f, G_UNICODE_NOT_PRESENT_OFFSET, 7510 }, + { 0x3140, G_UNICODE_NOT_PRESENT_OFFSET, 7514 }, + { 0x3141, G_UNICODE_NOT_PRESENT_OFFSET, 7518 }, + { 0x3142, G_UNICODE_NOT_PRESENT_OFFSET, 7522 }, + { 0x3143, G_UNICODE_NOT_PRESENT_OFFSET, 7526 }, + { 0x3144, G_UNICODE_NOT_PRESENT_OFFSET, 7530 }, + { 0x3145, G_UNICODE_NOT_PRESENT_OFFSET, 7534 }, + { 0x3146, G_UNICODE_NOT_PRESENT_OFFSET, 7538 }, + { 0x3147, G_UNICODE_NOT_PRESENT_OFFSET, 7542 }, + { 0x3148, G_UNICODE_NOT_PRESENT_OFFSET, 7546 }, + { 0x3149, G_UNICODE_NOT_PRESENT_OFFSET, 7550 }, + { 0x314a, G_UNICODE_NOT_PRESENT_OFFSET, 7554 }, + { 0x314b, G_UNICODE_NOT_PRESENT_OFFSET, 7558 }, + { 0x314c, G_UNICODE_NOT_PRESENT_OFFSET, 7562 }, + { 0x314d, G_UNICODE_NOT_PRESENT_OFFSET, 7566 }, + { 0x314e, G_UNICODE_NOT_PRESENT_OFFSET, 7570 }, + { 0x314f, G_UNICODE_NOT_PRESENT_OFFSET, 7574 }, + { 0x3150, G_UNICODE_NOT_PRESENT_OFFSET, 7578 }, + { 0x3151, G_UNICODE_NOT_PRESENT_OFFSET, 7582 }, + { 0x3152, G_UNICODE_NOT_PRESENT_OFFSET, 7586 }, + { 0x3153, G_UNICODE_NOT_PRESENT_OFFSET, 7590 }, + { 0x3154, G_UNICODE_NOT_PRESENT_OFFSET, 7594 }, + { 0x3155, G_UNICODE_NOT_PRESENT_OFFSET, 7598 }, + { 0x3156, G_UNICODE_NOT_PRESENT_OFFSET, 7602 }, + { 0x3157, G_UNICODE_NOT_PRESENT_OFFSET, 7606 }, + { 0x3158, G_UNICODE_NOT_PRESENT_OFFSET, 7610 }, + { 0x3159, G_UNICODE_NOT_PRESENT_OFFSET, 7614 }, + { 0x315a, G_UNICODE_NOT_PRESENT_OFFSET, 7618 }, + { 0x315b, G_UNICODE_NOT_PRESENT_OFFSET, 7622 }, + { 0x315c, G_UNICODE_NOT_PRESENT_OFFSET, 7626 }, + { 0x315d, G_UNICODE_NOT_PRESENT_OFFSET, 7630 }, + { 0x315e, G_UNICODE_NOT_PRESENT_OFFSET, 7634 }, + { 0x315f, G_UNICODE_NOT_PRESENT_OFFSET, 7638 }, + { 0x3160, G_UNICODE_NOT_PRESENT_OFFSET, 7642 }, + { 0x3161, G_UNICODE_NOT_PRESENT_OFFSET, 7646 }, + { 0x3162, G_UNICODE_NOT_PRESENT_OFFSET, 7650 }, + { 0x3163, G_UNICODE_NOT_PRESENT_OFFSET, 7654 }, + { 0x3164, G_UNICODE_NOT_PRESENT_OFFSET, 7658 }, + { 0x3165, G_UNICODE_NOT_PRESENT_OFFSET, 7662 }, + { 0x3166, G_UNICODE_NOT_PRESENT_OFFSET, 7666 }, + { 0x3167, G_UNICODE_NOT_PRESENT_OFFSET, 7670 }, + { 0x3168, G_UNICODE_NOT_PRESENT_OFFSET, 7674 }, + { 0x3169, G_UNICODE_NOT_PRESENT_OFFSET, 7678 }, + { 0x316a, G_UNICODE_NOT_PRESENT_OFFSET, 7682 }, + { 0x316b, G_UNICODE_NOT_PRESENT_OFFSET, 7686 }, + { 0x316c, G_UNICODE_NOT_PRESENT_OFFSET, 7690 }, + { 0x316d, G_UNICODE_NOT_PRESENT_OFFSET, 7694 }, + { 0x316e, G_UNICODE_NOT_PRESENT_OFFSET, 7698 }, + { 0x316f, G_UNICODE_NOT_PRESENT_OFFSET, 7702 }, + { 0x3170, G_UNICODE_NOT_PRESENT_OFFSET, 7706 }, + { 0x3171, G_UNICODE_NOT_PRESENT_OFFSET, 7710 }, + { 0x3172, G_UNICODE_NOT_PRESENT_OFFSET, 7714 }, + { 0x3173, G_UNICODE_NOT_PRESENT_OFFSET, 7718 }, + { 0x3174, G_UNICODE_NOT_PRESENT_OFFSET, 7722 }, + { 0x3175, G_UNICODE_NOT_PRESENT_OFFSET, 7726 }, + { 0x3176, G_UNICODE_NOT_PRESENT_OFFSET, 7730 }, + { 0x3177, G_UNICODE_NOT_PRESENT_OFFSET, 7734 }, + { 0x3178, G_UNICODE_NOT_PRESENT_OFFSET, 7738 }, + { 0x3179, G_UNICODE_NOT_PRESENT_OFFSET, 7742 }, + { 0x317a, G_UNICODE_NOT_PRESENT_OFFSET, 7746 }, + { 0x317b, G_UNICODE_NOT_PRESENT_OFFSET, 7750 }, + { 0x317c, G_UNICODE_NOT_PRESENT_OFFSET, 7754 }, + { 0x317d, G_UNICODE_NOT_PRESENT_OFFSET, 7758 }, + { 0x317e, G_UNICODE_NOT_PRESENT_OFFSET, 7762 }, + { 0x317f, G_UNICODE_NOT_PRESENT_OFFSET, 7766 }, + { 0x3180, G_UNICODE_NOT_PRESENT_OFFSET, 7770 }, + { 0x3181, G_UNICODE_NOT_PRESENT_OFFSET, 7774 }, + { 0x3182, G_UNICODE_NOT_PRESENT_OFFSET, 7778 }, + { 0x3183, G_UNICODE_NOT_PRESENT_OFFSET, 7782 }, + { 0x3184, G_UNICODE_NOT_PRESENT_OFFSET, 7786 }, + { 0x3185, G_UNICODE_NOT_PRESENT_OFFSET, 7790 }, + { 0x3186, G_UNICODE_NOT_PRESENT_OFFSET, 7794 }, + { 0x3187, G_UNICODE_NOT_PRESENT_OFFSET, 7798 }, + { 0x3188, G_UNICODE_NOT_PRESENT_OFFSET, 7802 }, + { 0x3189, G_UNICODE_NOT_PRESENT_OFFSET, 7806 }, + { 0x318a, G_UNICODE_NOT_PRESENT_OFFSET, 7810 }, + { 0x318b, G_UNICODE_NOT_PRESENT_OFFSET, 7814 }, + { 0x318c, G_UNICODE_NOT_PRESENT_OFFSET, 7818 }, + { 0x318d, G_UNICODE_NOT_PRESENT_OFFSET, 7822 }, + { 0x318e, G_UNICODE_NOT_PRESENT_OFFSET, 7826 }, + { 0x3192, G_UNICODE_NOT_PRESENT_OFFSET, 6156 }, + { 0x3193, G_UNICODE_NOT_PRESENT_OFFSET, 6180 }, + { 0x3194, G_UNICODE_NOT_PRESENT_OFFSET, 7830 }, + { 0x3195, G_UNICODE_NOT_PRESENT_OFFSET, 7834 }, + { 0x3196, G_UNICODE_NOT_PRESENT_OFFSET, 7838 }, + { 0x3197, G_UNICODE_NOT_PRESENT_OFFSET, 7842 }, + { 0x3198, G_UNICODE_NOT_PRESENT_OFFSET, 7846 }, + { 0x3199, G_UNICODE_NOT_PRESENT_OFFSET, 7850 }, + { 0x319a, G_UNICODE_NOT_PRESENT_OFFSET, 6172 }, + { 0x319b, G_UNICODE_NOT_PRESENT_OFFSET, 7854 }, + { 0x319c, G_UNICODE_NOT_PRESENT_OFFSET, 7858 }, + { 0x319d, G_UNICODE_NOT_PRESENT_OFFSET, 7862 }, + { 0x319e, G_UNICODE_NOT_PRESENT_OFFSET, 7866 }, + { 0x319f, G_UNICODE_NOT_PRESENT_OFFSET, 6188 }, + { 0x3200, G_UNICODE_NOT_PRESENT_OFFSET, 7870 }, + { 0x3201, G_UNICODE_NOT_PRESENT_OFFSET, 7876 }, + { 0x3202, G_UNICODE_NOT_PRESENT_OFFSET, 7882 }, + { 0x3203, G_UNICODE_NOT_PRESENT_OFFSET, 7888 }, + { 0x3204, G_UNICODE_NOT_PRESENT_OFFSET, 7894 }, + { 0x3205, G_UNICODE_NOT_PRESENT_OFFSET, 7900 }, + { 0x3206, G_UNICODE_NOT_PRESENT_OFFSET, 7906 }, + { 0x3207, G_UNICODE_NOT_PRESENT_OFFSET, 7912 }, + { 0x3208, G_UNICODE_NOT_PRESENT_OFFSET, 7918 }, + { 0x3209, G_UNICODE_NOT_PRESENT_OFFSET, 7924 }, + { 0x320a, G_UNICODE_NOT_PRESENT_OFFSET, 7930 }, + { 0x320b, G_UNICODE_NOT_PRESENT_OFFSET, 7936 }, + { 0x320c, G_UNICODE_NOT_PRESENT_OFFSET, 7942 }, + { 0x320d, G_UNICODE_NOT_PRESENT_OFFSET, 7948 }, + { 0x320e, G_UNICODE_NOT_PRESENT_OFFSET, 7954 }, + { 0x320f, G_UNICODE_NOT_PRESENT_OFFSET, 7963 }, + { 0x3210, G_UNICODE_NOT_PRESENT_OFFSET, 7972 }, + { 0x3211, G_UNICODE_NOT_PRESENT_OFFSET, 7981 }, + { 0x3212, G_UNICODE_NOT_PRESENT_OFFSET, 7990 }, + { 0x3213, G_UNICODE_NOT_PRESENT_OFFSET, 7999 }, + { 0x3214, G_UNICODE_NOT_PRESENT_OFFSET, 8008 }, + { 0x3215, G_UNICODE_NOT_PRESENT_OFFSET, 8017 }, + { 0x3216, G_UNICODE_NOT_PRESENT_OFFSET, 8026 }, + { 0x3217, G_UNICODE_NOT_PRESENT_OFFSET, 8035 }, + { 0x3218, G_UNICODE_NOT_PRESENT_OFFSET, 8044 }, + { 0x3219, G_UNICODE_NOT_PRESENT_OFFSET, 8053 }, + { 0x321a, G_UNICODE_NOT_PRESENT_OFFSET, 8062 }, + { 0x321b, G_UNICODE_NOT_PRESENT_OFFSET, 8071 }, + { 0x321c, G_UNICODE_NOT_PRESENT_OFFSET, 8080 }, + { 0x321d, G_UNICODE_NOT_PRESENT_OFFSET, 8089 }, + { 0x321e, G_UNICODE_NOT_PRESENT_OFFSET, 8107 }, + { 0x3220, G_UNICODE_NOT_PRESENT_OFFSET, 8122 }, + { 0x3221, G_UNICODE_NOT_PRESENT_OFFSET, 8128 }, + { 0x3222, G_UNICODE_NOT_PRESENT_OFFSET, 8134 }, + { 0x3223, G_UNICODE_NOT_PRESENT_OFFSET, 8140 }, + { 0x3224, G_UNICODE_NOT_PRESENT_OFFSET, 8146 }, + { 0x3225, G_UNICODE_NOT_PRESENT_OFFSET, 8152 }, + { 0x3226, G_UNICODE_NOT_PRESENT_OFFSET, 8158 }, + { 0x3227, G_UNICODE_NOT_PRESENT_OFFSET, 8164 }, + { 0x3228, G_UNICODE_NOT_PRESENT_OFFSET, 8170 }, + { 0x3229, G_UNICODE_NOT_PRESENT_OFFSET, 8176 }, + { 0x322a, G_UNICODE_NOT_PRESENT_OFFSET, 8182 }, + { 0x322b, G_UNICODE_NOT_PRESENT_OFFSET, 8188 }, + { 0x322c, G_UNICODE_NOT_PRESENT_OFFSET, 8194 }, + { 0x322d, G_UNICODE_NOT_PRESENT_OFFSET, 8200 }, + { 0x322e, G_UNICODE_NOT_PRESENT_OFFSET, 8206 }, + { 0x322f, G_UNICODE_NOT_PRESENT_OFFSET, 8212 }, + { 0x3230, G_UNICODE_NOT_PRESENT_OFFSET, 8218 }, + { 0x3231, G_UNICODE_NOT_PRESENT_OFFSET, 8224 }, + { 0x3232, G_UNICODE_NOT_PRESENT_OFFSET, 8230 }, + { 0x3233, G_UNICODE_NOT_PRESENT_OFFSET, 8236 }, + { 0x3234, G_UNICODE_NOT_PRESENT_OFFSET, 8242 }, + { 0x3235, G_UNICODE_NOT_PRESENT_OFFSET, 8248 }, + { 0x3236, G_UNICODE_NOT_PRESENT_OFFSET, 8254 }, + { 0x3237, G_UNICODE_NOT_PRESENT_OFFSET, 8260 }, + { 0x3238, G_UNICODE_NOT_PRESENT_OFFSET, 8266 }, + { 0x3239, G_UNICODE_NOT_PRESENT_OFFSET, 8272 }, + { 0x323a, G_UNICODE_NOT_PRESENT_OFFSET, 8278 }, + { 0x323b, G_UNICODE_NOT_PRESENT_OFFSET, 8284 }, + { 0x323c, G_UNICODE_NOT_PRESENT_OFFSET, 8290 }, + { 0x323d, G_UNICODE_NOT_PRESENT_OFFSET, 8296 }, + { 0x323e, G_UNICODE_NOT_PRESENT_OFFSET, 8302 }, + { 0x323f, G_UNICODE_NOT_PRESENT_OFFSET, 8308 }, + { 0x3240, G_UNICODE_NOT_PRESENT_OFFSET, 8314 }, + { 0x3241, G_UNICODE_NOT_PRESENT_OFFSET, 8320 }, + { 0x3242, G_UNICODE_NOT_PRESENT_OFFSET, 8326 }, + { 0x3243, G_UNICODE_NOT_PRESENT_OFFSET, 8332 }, + { 0x3250, G_UNICODE_NOT_PRESENT_OFFSET, 8338 }, + { 0x3251, G_UNICODE_NOT_PRESENT_OFFSET, 8342 }, + { 0x3252, G_UNICODE_NOT_PRESENT_OFFSET, 8345 }, + { 0x3253, G_UNICODE_NOT_PRESENT_OFFSET, 8348 }, + { 0x3254, G_UNICODE_NOT_PRESENT_OFFSET, 8351 }, + { 0x3255, G_UNICODE_NOT_PRESENT_OFFSET, 8354 }, + { 0x3256, G_UNICODE_NOT_PRESENT_OFFSET, 8357 }, + { 0x3257, G_UNICODE_NOT_PRESENT_OFFSET, 8360 }, + { 0x3258, G_UNICODE_NOT_PRESENT_OFFSET, 8363 }, + { 0x3259, G_UNICODE_NOT_PRESENT_OFFSET, 8366 }, + { 0x325a, G_UNICODE_NOT_PRESENT_OFFSET, 8369 }, + { 0x325b, G_UNICODE_NOT_PRESENT_OFFSET, 8372 }, + { 0x325c, G_UNICODE_NOT_PRESENT_OFFSET, 8375 }, + { 0x325d, G_UNICODE_NOT_PRESENT_OFFSET, 8378 }, + { 0x325e, G_UNICODE_NOT_PRESENT_OFFSET, 8381 }, + { 0x325f, G_UNICODE_NOT_PRESENT_OFFSET, 8384 }, + { 0x3260, G_UNICODE_NOT_PRESENT_OFFSET, 7454 }, + { 0x3261, G_UNICODE_NOT_PRESENT_OFFSET, 7466 }, + { 0x3262, G_UNICODE_NOT_PRESENT_OFFSET, 7478 }, + { 0x3263, G_UNICODE_NOT_PRESENT_OFFSET, 7486 }, + { 0x3264, G_UNICODE_NOT_PRESENT_OFFSET, 7518 }, + { 0x3265, G_UNICODE_NOT_PRESENT_OFFSET, 7522 }, + { 0x3266, G_UNICODE_NOT_PRESENT_OFFSET, 7534 }, + { 0x3267, G_UNICODE_NOT_PRESENT_OFFSET, 7542 }, + { 0x3268, G_UNICODE_NOT_PRESENT_OFFSET, 7546 }, + { 0x3269, G_UNICODE_NOT_PRESENT_OFFSET, 7554 }, + { 0x326a, G_UNICODE_NOT_PRESENT_OFFSET, 7558 }, + { 0x326b, G_UNICODE_NOT_PRESENT_OFFSET, 7562 }, + { 0x326c, G_UNICODE_NOT_PRESENT_OFFSET, 7566 }, + { 0x326d, G_UNICODE_NOT_PRESENT_OFFSET, 7570 }, + { 0x326e, G_UNICODE_NOT_PRESENT_OFFSET, 8387 }, + { 0x326f, G_UNICODE_NOT_PRESENT_OFFSET, 8394 }, + { 0x3270, G_UNICODE_NOT_PRESENT_OFFSET, 8401 }, + { 0x3271, G_UNICODE_NOT_PRESENT_OFFSET, 8408 }, + { 0x3272, G_UNICODE_NOT_PRESENT_OFFSET, 8415 }, + { 0x3273, G_UNICODE_NOT_PRESENT_OFFSET, 8422 }, + { 0x3274, G_UNICODE_NOT_PRESENT_OFFSET, 8429 }, + { 0x3275, G_UNICODE_NOT_PRESENT_OFFSET, 8436 }, + { 0x3276, G_UNICODE_NOT_PRESENT_OFFSET, 8443 }, + { 0x3277, G_UNICODE_NOT_PRESENT_OFFSET, 8450 }, + { 0x3278, G_UNICODE_NOT_PRESENT_OFFSET, 8457 }, + { 0x3279, G_UNICODE_NOT_PRESENT_OFFSET, 8464 }, + { 0x327a, G_UNICODE_NOT_PRESENT_OFFSET, 8471 }, + { 0x327b, G_UNICODE_NOT_PRESENT_OFFSET, 8478 }, + { 0x327c, G_UNICODE_NOT_PRESENT_OFFSET, 8485 }, + { 0x327d, G_UNICODE_NOT_PRESENT_OFFSET, 8501 }, + { 0x327e, G_UNICODE_NOT_PRESENT_OFFSET, 8514 }, + { 0x3280, G_UNICODE_NOT_PRESENT_OFFSET, 6156 }, + { 0x3281, G_UNICODE_NOT_PRESENT_OFFSET, 6180 }, + { 0x3282, G_UNICODE_NOT_PRESENT_OFFSET, 7830 }, + { 0x3283, G_UNICODE_NOT_PRESENT_OFFSET, 7834 }, + { 0x3284, G_UNICODE_NOT_PRESENT_OFFSET, 8521 }, + { 0x3285, G_UNICODE_NOT_PRESENT_OFFSET, 8525 }, + { 0x3286, G_UNICODE_NOT_PRESENT_OFFSET, 8529 }, + { 0x3287, G_UNICODE_NOT_PRESENT_OFFSET, 6200 }, + { 0x3288, G_UNICODE_NOT_PRESENT_OFFSET, 8533 }, + { 0x3289, G_UNICODE_NOT_PRESENT_OFFSET, 6248 }, + { 0x328a, G_UNICODE_NOT_PRESENT_OFFSET, 6448 }, + { 0x328b, G_UNICODE_NOT_PRESENT_OFFSET, 6496 }, + { 0x328c, G_UNICODE_NOT_PRESENT_OFFSET, 6492 }, + { 0x328d, G_UNICODE_NOT_PRESENT_OFFSET, 6452 }, + { 0x328e, G_UNICODE_NOT_PRESENT_OFFSET, 6820 }, + { 0x328f, G_UNICODE_NOT_PRESENT_OFFSET, 6280 }, + { 0x3290, G_UNICODE_NOT_PRESENT_OFFSET, 6440 }, + { 0x3291, G_UNICODE_NOT_PRESENT_OFFSET, 8537 }, + { 0x3292, G_UNICODE_NOT_PRESENT_OFFSET, 8541 }, + { 0x3293, G_UNICODE_NOT_PRESENT_OFFSET, 8545 }, + { 0x3294, G_UNICODE_NOT_PRESENT_OFFSET, 8549 }, + { 0x3295, G_UNICODE_NOT_PRESENT_OFFSET, 8553 }, + { 0x3296, G_UNICODE_NOT_PRESENT_OFFSET, 8557 }, + { 0x3297, G_UNICODE_NOT_PRESENT_OFFSET, 8561 }, + { 0x3298, G_UNICODE_NOT_PRESENT_OFFSET, 8565 }, + { 0x3299, G_UNICODE_NOT_PRESENT_OFFSET, 8569 }, + { 0x329a, G_UNICODE_NOT_PRESENT_OFFSET, 8573 }, + { 0x329b, G_UNICODE_NOT_PRESENT_OFFSET, 6304 }, + { 0x329c, G_UNICODE_NOT_PRESENT_OFFSET, 8577 }, + { 0x329d, G_UNICODE_NOT_PRESENT_OFFSET, 8581 }, + { 0x329e, G_UNICODE_NOT_PRESENT_OFFSET, 8585 }, + { 0x329f, G_UNICODE_NOT_PRESENT_OFFSET, 8589 }, + { 0x32a0, G_UNICODE_NOT_PRESENT_OFFSET, 8593 }, + { 0x32a1, G_UNICODE_NOT_PRESENT_OFFSET, 8597 }, + { 0x32a2, G_UNICODE_NOT_PRESENT_OFFSET, 8601 }, + { 0x32a3, G_UNICODE_NOT_PRESENT_OFFSET, 8605 }, + { 0x32a4, G_UNICODE_NOT_PRESENT_OFFSET, 7838 }, + { 0x32a5, G_UNICODE_NOT_PRESENT_OFFSET, 7842 }, + { 0x32a6, G_UNICODE_NOT_PRESENT_OFFSET, 7846 }, + { 0x32a7, G_UNICODE_NOT_PRESENT_OFFSET, 8609 }, + { 0x32a8, G_UNICODE_NOT_PRESENT_OFFSET, 8613 }, + { 0x32a9, G_UNICODE_NOT_PRESENT_OFFSET, 8617 }, + { 0x32aa, G_UNICODE_NOT_PRESENT_OFFSET, 8621 }, + { 0x32ab, G_UNICODE_NOT_PRESENT_OFFSET, 8625 }, + { 0x32ac, G_UNICODE_NOT_PRESENT_OFFSET, 8629 }, + { 0x32ad, G_UNICODE_NOT_PRESENT_OFFSET, 8633 }, + { 0x32ae, G_UNICODE_NOT_PRESENT_OFFSET, 8637 }, + { 0x32af, G_UNICODE_NOT_PRESENT_OFFSET, 8641 }, + { 0x32b0, G_UNICODE_NOT_PRESENT_OFFSET, 8645 }, + { 0x32b1, G_UNICODE_NOT_PRESENT_OFFSET, 8649 }, + { 0x32b2, G_UNICODE_NOT_PRESENT_OFFSET, 8652 }, + { 0x32b3, G_UNICODE_NOT_PRESENT_OFFSET, 8655 }, + { 0x32b4, G_UNICODE_NOT_PRESENT_OFFSET, 8658 }, + { 0x32b5, G_UNICODE_NOT_PRESENT_OFFSET, 8661 }, + { 0x32b6, G_UNICODE_NOT_PRESENT_OFFSET, 8664 }, + { 0x32b7, G_UNICODE_NOT_PRESENT_OFFSET, 8667 }, + { 0x32b8, G_UNICODE_NOT_PRESENT_OFFSET, 8670 }, + { 0x32b9, G_UNICODE_NOT_PRESENT_OFFSET, 8673 }, + { 0x32ba, G_UNICODE_NOT_PRESENT_OFFSET, 8676 }, + { 0x32bb, G_UNICODE_NOT_PRESENT_OFFSET, 8679 }, + { 0x32bc, G_UNICODE_NOT_PRESENT_OFFSET, 8682 }, + { 0x32bd, G_UNICODE_NOT_PRESENT_OFFSET, 8685 }, + { 0x32be, G_UNICODE_NOT_PRESENT_OFFSET, 8688 }, + { 0x32bf, G_UNICODE_NOT_PRESENT_OFFSET, 8691 }, + { 0x32c0, G_UNICODE_NOT_PRESENT_OFFSET, 8694 }, + { 0x32c1, G_UNICODE_NOT_PRESENT_OFFSET, 8699 }, + { 0x32c2, G_UNICODE_NOT_PRESENT_OFFSET, 8704 }, + { 0x32c3, G_UNICODE_NOT_PRESENT_OFFSET, 8709 }, + { 0x32c4, G_UNICODE_NOT_PRESENT_OFFSET, 8714 }, + { 0x32c5, G_UNICODE_NOT_PRESENT_OFFSET, 8719 }, + { 0x32c6, G_UNICODE_NOT_PRESENT_OFFSET, 8724 }, + { 0x32c7, G_UNICODE_NOT_PRESENT_OFFSET, 8729 }, + { 0x32c8, G_UNICODE_NOT_PRESENT_OFFSET, 8734 }, + { 0x32c9, G_UNICODE_NOT_PRESENT_OFFSET, 8739 }, + { 0x32ca, G_UNICODE_NOT_PRESENT_OFFSET, 8745 }, + { 0x32cb, G_UNICODE_NOT_PRESENT_OFFSET, 8751 }, + { 0x32cc, G_UNICODE_NOT_PRESENT_OFFSET, 8757 }, + { 0x32cd, G_UNICODE_NOT_PRESENT_OFFSET, 8760 }, + { 0x32ce, G_UNICODE_NOT_PRESENT_OFFSET, 8764 }, + { 0x32cf, G_UNICODE_NOT_PRESENT_OFFSET, 8767 }, + { 0x32d0, G_UNICODE_NOT_PRESENT_OFFSET, 8771 }, + { 0x32d1, G_UNICODE_NOT_PRESENT_OFFSET, 8775 }, + { 0x32d2, G_UNICODE_NOT_PRESENT_OFFSET, 8779 }, + { 0x32d3, G_UNICODE_NOT_PRESENT_OFFSET, 8783 }, + { 0x32d4, G_UNICODE_NOT_PRESENT_OFFSET, 8787 }, + { 0x32d5, G_UNICODE_NOT_PRESENT_OFFSET, 8791 }, + { 0x32d6, G_UNICODE_NOT_PRESENT_OFFSET, 8795 }, + { 0x32d7, G_UNICODE_NOT_PRESENT_OFFSET, 8799 }, + { 0x32d8, G_UNICODE_NOT_PRESENT_OFFSET, 8803 }, + { 0x32d9, G_UNICODE_NOT_PRESENT_OFFSET, 8807 }, + { 0x32da, G_UNICODE_NOT_PRESENT_OFFSET, 8811 }, + { 0x32db, G_UNICODE_NOT_PRESENT_OFFSET, 8815 }, + { 0x32dc, G_UNICODE_NOT_PRESENT_OFFSET, 8819 }, + { 0x32dd, G_UNICODE_NOT_PRESENT_OFFSET, 8823 }, + { 0x32de, G_UNICODE_NOT_PRESENT_OFFSET, 8827 }, + { 0x32df, G_UNICODE_NOT_PRESENT_OFFSET, 8831 }, + { 0x32e0, G_UNICODE_NOT_PRESENT_OFFSET, 8835 }, + { 0x32e1, G_UNICODE_NOT_PRESENT_OFFSET, 8839 }, + { 0x32e2, G_UNICODE_NOT_PRESENT_OFFSET, 8843 }, + { 0x32e3, G_UNICODE_NOT_PRESENT_OFFSET, 8847 }, + { 0x32e4, G_UNICODE_NOT_PRESENT_OFFSET, 8851 }, + { 0x32e5, G_UNICODE_NOT_PRESENT_OFFSET, 8855 }, + { 0x32e6, G_UNICODE_NOT_PRESENT_OFFSET, 8859 }, + { 0x32e7, G_UNICODE_NOT_PRESENT_OFFSET, 8863 }, + { 0x32e8, G_UNICODE_NOT_PRESENT_OFFSET, 8867 }, + { 0x32e9, G_UNICODE_NOT_PRESENT_OFFSET, 8871 }, + { 0x32ea, G_UNICODE_NOT_PRESENT_OFFSET, 8875 }, + { 0x32eb, G_UNICODE_NOT_PRESENT_OFFSET, 8879 }, + { 0x32ec, G_UNICODE_NOT_PRESENT_OFFSET, 8883 }, + { 0x32ed, G_UNICODE_NOT_PRESENT_OFFSET, 8887 }, + { 0x32ee, G_UNICODE_NOT_PRESENT_OFFSET, 8891 }, + { 0x32ef, G_UNICODE_NOT_PRESENT_OFFSET, 8895 }, + { 0x32f0, G_UNICODE_NOT_PRESENT_OFFSET, 8899 }, + { 0x32f1, G_UNICODE_NOT_PRESENT_OFFSET, 8903 }, + { 0x32f2, G_UNICODE_NOT_PRESENT_OFFSET, 8907 }, + { 0x32f3, G_UNICODE_NOT_PRESENT_OFFSET, 8911 }, + { 0x32f4, G_UNICODE_NOT_PRESENT_OFFSET, 8915 }, + { 0x32f5, G_UNICODE_NOT_PRESENT_OFFSET, 8919 }, + { 0x32f6, G_UNICODE_NOT_PRESENT_OFFSET, 8923 }, + { 0x32f7, G_UNICODE_NOT_PRESENT_OFFSET, 8927 }, + { 0x32f8, G_UNICODE_NOT_PRESENT_OFFSET, 8931 }, + { 0x32f9, G_UNICODE_NOT_PRESENT_OFFSET, 8935 }, + { 0x32fa, G_UNICODE_NOT_PRESENT_OFFSET, 8939 }, + { 0x32fb, G_UNICODE_NOT_PRESENT_OFFSET, 8943 }, + { 0x32fc, G_UNICODE_NOT_PRESENT_OFFSET, 8947 }, + { 0x32fd, G_UNICODE_NOT_PRESENT_OFFSET, 8951 }, + { 0x32fe, G_UNICODE_NOT_PRESENT_OFFSET, 8955 }, + { 0x3300, G_UNICODE_NOT_PRESENT_OFFSET, 8959 }, + { 0x3301, G_UNICODE_NOT_PRESENT_OFFSET, 8975 }, + { 0x3302, G_UNICODE_NOT_PRESENT_OFFSET, 8988 }, + { 0x3303, G_UNICODE_NOT_PRESENT_OFFSET, 9004 }, + { 0x3304, G_UNICODE_NOT_PRESENT_OFFSET, 9014 }, + { 0x3305, G_UNICODE_NOT_PRESENT_OFFSET, 9030 }, + { 0x3306, G_UNICODE_NOT_PRESENT_OFFSET, 9040 }, + { 0x3307, G_UNICODE_NOT_PRESENT_OFFSET, 9050 }, + { 0x3308, G_UNICODE_NOT_PRESENT_OFFSET, 9069 }, + { 0x3309, G_UNICODE_NOT_PRESENT_OFFSET, 9082 }, + { 0x330a, G_UNICODE_NOT_PRESENT_OFFSET, 9092 }, + { 0x330b, G_UNICODE_NOT_PRESENT_OFFSET, 9102 }, + { 0x330c, G_UNICODE_NOT_PRESENT_OFFSET, 9112 }, + { 0x330d, G_UNICODE_NOT_PRESENT_OFFSET, 9125 }, + { 0x330e, G_UNICODE_NOT_PRESENT_OFFSET, 9138 }, + { 0x330f, G_UNICODE_NOT_PRESENT_OFFSET, 9151 }, + { 0x3310, G_UNICODE_NOT_PRESENT_OFFSET, 9164 }, + { 0x3311, G_UNICODE_NOT_PRESENT_OFFSET, 9177 }, + { 0x3312, G_UNICODE_NOT_PRESENT_OFFSET, 9190 }, + { 0x3313, G_UNICODE_NOT_PRESENT_OFFSET, 9203 }, + { 0x3314, G_UNICODE_NOT_PRESENT_OFFSET, 9222 }, + { 0x3315, G_UNICODE_NOT_PRESENT_OFFSET, 9229 }, + { 0x3316, G_UNICODE_NOT_PRESENT_OFFSET, 9248 }, + { 0x3317, G_UNICODE_NOT_PRESENT_OFFSET, 9267 }, + { 0x3318, G_UNICODE_NOT_PRESENT_OFFSET, 9283 }, + { 0x3319, G_UNICODE_NOT_PRESENT_OFFSET, 9296 }, + { 0x331a, G_UNICODE_NOT_PRESENT_OFFSET, 9315 }, + { 0x331b, G_UNICODE_NOT_PRESENT_OFFSET, 9334 }, + { 0x331c, G_UNICODE_NOT_PRESENT_OFFSET, 9347 }, + { 0x331d, G_UNICODE_NOT_PRESENT_OFFSET, 9357 }, + { 0x331e, G_UNICODE_NOT_PRESENT_OFFSET, 9367 }, + { 0x331f, G_UNICODE_NOT_PRESENT_OFFSET, 9380 }, + { 0x3320, G_UNICODE_NOT_PRESENT_OFFSET, 9393 }, + { 0x3321, G_UNICODE_NOT_PRESENT_OFFSET, 9409 }, + { 0x3322, G_UNICODE_NOT_PRESENT_OFFSET, 9425 }, + { 0x3323, G_UNICODE_NOT_PRESENT_OFFSET, 9435 }, + { 0x3324, G_UNICODE_NOT_PRESENT_OFFSET, 9445 }, + { 0x3325, G_UNICODE_NOT_PRESENT_OFFSET, 9458 }, + { 0x3326, G_UNICODE_NOT_PRESENT_OFFSET, 9468 }, + { 0x3327, G_UNICODE_NOT_PRESENT_OFFSET, 9478 }, + { 0x3328, G_UNICODE_NOT_PRESENT_OFFSET, 9485 }, + { 0x3329, G_UNICODE_NOT_PRESENT_OFFSET, 9492 }, + { 0x332a, G_UNICODE_NOT_PRESENT_OFFSET, 9502 }, + { 0x332b, G_UNICODE_NOT_PRESENT_OFFSET, 9512 }, + { 0x332c, G_UNICODE_NOT_PRESENT_OFFSET, 9531 }, + { 0x332d, G_UNICODE_NOT_PRESENT_OFFSET, 9544 }, + { 0x332e, G_UNICODE_NOT_PRESENT_OFFSET, 9560 }, + { 0x332f, G_UNICODE_NOT_PRESENT_OFFSET, 9579 }, + { 0x3330, G_UNICODE_NOT_PRESENT_OFFSET, 9592 }, + { 0x3331, G_UNICODE_NOT_PRESENT_OFFSET, 9602 }, + { 0x3332, G_UNICODE_NOT_PRESENT_OFFSET, 9612 }, + { 0x3333, G_UNICODE_NOT_PRESENT_OFFSET, 9631 }, + { 0x3334, G_UNICODE_NOT_PRESENT_OFFSET, 9644 }, + { 0x3335, G_UNICODE_NOT_PRESENT_OFFSET, 9663 }, + { 0x3336, G_UNICODE_NOT_PRESENT_OFFSET, 9673 }, + { 0x3337, G_UNICODE_NOT_PRESENT_OFFSET, 9689 }, + { 0x3338, G_UNICODE_NOT_PRESENT_OFFSET, 9699 }, + { 0x3339, G_UNICODE_NOT_PRESENT_OFFSET, 9712 }, + { 0x333a, G_UNICODE_NOT_PRESENT_OFFSET, 9722 }, + { 0x333b, G_UNICODE_NOT_PRESENT_OFFSET, 9735 }, + { 0x333c, G_UNICODE_NOT_PRESENT_OFFSET, 9751 }, + { 0x333d, G_UNICODE_NOT_PRESENT_OFFSET, 9764 }, + { 0x333e, G_UNICODE_NOT_PRESENT_OFFSET, 9780 }, + { 0x333f, G_UNICODE_NOT_PRESENT_OFFSET, 9793 }, + { 0x3340, G_UNICODE_NOT_PRESENT_OFFSET, 9800 }, + { 0x3341, G_UNICODE_NOT_PRESENT_OFFSET, 9816 }, + { 0x3342, G_UNICODE_NOT_PRESENT_OFFSET, 9826 }, + { 0x3343, G_UNICODE_NOT_PRESENT_OFFSET, 9836 }, + { 0x3344, G_UNICODE_NOT_PRESENT_OFFSET, 9849 }, + { 0x3345, G_UNICODE_NOT_PRESENT_OFFSET, 9859 }, + { 0x3346, G_UNICODE_NOT_PRESENT_OFFSET, 9869 }, + { 0x3347, G_UNICODE_NOT_PRESENT_OFFSET, 9879 }, + { 0x3348, G_UNICODE_NOT_PRESENT_OFFSET, 9895 }, + { 0x3349, G_UNICODE_NOT_PRESENT_OFFSET, 9908 }, + { 0x334a, G_UNICODE_NOT_PRESENT_OFFSET, 9915 }, + { 0x334b, G_UNICODE_NOT_PRESENT_OFFSET, 9934 }, + { 0x334c, G_UNICODE_NOT_PRESENT_OFFSET, 9944 }, + { 0x334d, G_UNICODE_NOT_PRESENT_OFFSET, 9960 }, + { 0x334e, G_UNICODE_NOT_PRESENT_OFFSET, 9973 }, + { 0x334f, G_UNICODE_NOT_PRESENT_OFFSET, 9986 }, + { 0x3350, G_UNICODE_NOT_PRESENT_OFFSET, 9996 }, + { 0x3351, G_UNICODE_NOT_PRESENT_OFFSET, 10006 }, + { 0x3352, G_UNICODE_NOT_PRESENT_OFFSET, 10019 }, + { 0x3353, G_UNICODE_NOT_PRESENT_OFFSET, 10026 }, + { 0x3354, G_UNICODE_NOT_PRESENT_OFFSET, 10039 }, + { 0x3355, G_UNICODE_NOT_PRESENT_OFFSET, 10055 }, + { 0x3356, G_UNICODE_NOT_PRESENT_OFFSET, 10062 }, + { 0x3357, G_UNICODE_NOT_PRESENT_OFFSET, 10081 }, + { 0x3358, G_UNICODE_NOT_PRESENT_OFFSET, 10091 }, + { 0x3359, G_UNICODE_NOT_PRESENT_OFFSET, 10096 }, + { 0x335a, G_UNICODE_NOT_PRESENT_OFFSET, 10101 }, + { 0x335b, G_UNICODE_NOT_PRESENT_OFFSET, 10106 }, + { 0x335c, G_UNICODE_NOT_PRESENT_OFFSET, 10111 }, + { 0x335d, G_UNICODE_NOT_PRESENT_OFFSET, 10116 }, + { 0x335e, G_UNICODE_NOT_PRESENT_OFFSET, 10121 }, + { 0x335f, G_UNICODE_NOT_PRESENT_OFFSET, 10126 }, + { 0x3360, G_UNICODE_NOT_PRESENT_OFFSET, 10131 }, + { 0x3361, G_UNICODE_NOT_PRESENT_OFFSET, 10136 }, + { 0x3362, G_UNICODE_NOT_PRESENT_OFFSET, 10141 }, + { 0x3363, G_UNICODE_NOT_PRESENT_OFFSET, 10147 }, + { 0x3364, G_UNICODE_NOT_PRESENT_OFFSET, 10153 }, + { 0x3365, G_UNICODE_NOT_PRESENT_OFFSET, 10159 }, + { 0x3366, G_UNICODE_NOT_PRESENT_OFFSET, 10165 }, + { 0x3367, G_UNICODE_NOT_PRESENT_OFFSET, 10171 }, + { 0x3368, G_UNICODE_NOT_PRESENT_OFFSET, 10177 }, + { 0x3369, G_UNICODE_NOT_PRESENT_OFFSET, 10183 }, + { 0x336a, G_UNICODE_NOT_PRESENT_OFFSET, 10189 }, + { 0x336b, G_UNICODE_NOT_PRESENT_OFFSET, 10195 }, + { 0x336c, G_UNICODE_NOT_PRESENT_OFFSET, 10201 }, + { 0x336d, G_UNICODE_NOT_PRESENT_OFFSET, 10207 }, + { 0x336e, G_UNICODE_NOT_PRESENT_OFFSET, 10213 }, + { 0x336f, G_UNICODE_NOT_PRESENT_OFFSET, 10219 }, + { 0x3370, G_UNICODE_NOT_PRESENT_OFFSET, 10225 }, + { 0x3371, G_UNICODE_NOT_PRESENT_OFFSET, 10231 }, + { 0x3372, G_UNICODE_NOT_PRESENT_OFFSET, 10235 }, + { 0x3373, G_UNICODE_NOT_PRESENT_OFFSET, 10238 }, + { 0x3374, G_UNICODE_NOT_PRESENT_OFFSET, 10241 }, + { 0x3375, G_UNICODE_NOT_PRESENT_OFFSET, 10245 }, + { 0x3376, G_UNICODE_NOT_PRESENT_OFFSET, 10248 }, + { 0x3377, G_UNICODE_NOT_PRESENT_OFFSET, 10251 }, + { 0x3378, G_UNICODE_NOT_PRESENT_OFFSET, 10254 }, + { 0x3379, G_UNICODE_NOT_PRESENT_OFFSET, 10258 }, + { 0x337a, G_UNICODE_NOT_PRESENT_OFFSET, 10262 }, + { 0x337b, G_UNICODE_NOT_PRESENT_OFFSET, 10265 }, + { 0x337c, G_UNICODE_NOT_PRESENT_OFFSET, 10272 }, + { 0x337d, G_UNICODE_NOT_PRESENT_OFFSET, 10279 }, + { 0x337e, G_UNICODE_NOT_PRESENT_OFFSET, 10286 }, + { 0x337f, G_UNICODE_NOT_PRESENT_OFFSET, 10293 }, + { 0x3380, G_UNICODE_NOT_PRESENT_OFFSET, 10306 }, + { 0x3381, G_UNICODE_NOT_PRESENT_OFFSET, 10309 }, + { 0x3382, G_UNICODE_NOT_PRESENT_OFFSET, 10312 }, + { 0x3383, G_UNICODE_NOT_PRESENT_OFFSET, 10316 }, + { 0x3384, G_UNICODE_NOT_PRESENT_OFFSET, 10319 }, + { 0x3385, G_UNICODE_NOT_PRESENT_OFFSET, 10322 }, + { 0x3386, G_UNICODE_NOT_PRESENT_OFFSET, 10325 }, + { 0x3387, G_UNICODE_NOT_PRESENT_OFFSET, 10328 }, + { 0x3388, G_UNICODE_NOT_PRESENT_OFFSET, 10331 }, + { 0x3389, G_UNICODE_NOT_PRESENT_OFFSET, 10335 }, + { 0x338a, G_UNICODE_NOT_PRESENT_OFFSET, 10340 }, + { 0x338b, G_UNICODE_NOT_PRESENT_OFFSET, 10343 }, + { 0x338c, G_UNICODE_NOT_PRESENT_OFFSET, 10346 }, + { 0x338d, G_UNICODE_NOT_PRESENT_OFFSET, 10350 }, + { 0x338e, G_UNICODE_NOT_PRESENT_OFFSET, 10354 }, + { 0x338f, G_UNICODE_NOT_PRESENT_OFFSET, 10357 }, + { 0x3390, G_UNICODE_NOT_PRESENT_OFFSET, 10360 }, + { 0x3391, G_UNICODE_NOT_PRESENT_OFFSET, 10363 }, + { 0x3392, G_UNICODE_NOT_PRESENT_OFFSET, 10367 }, + { 0x3393, G_UNICODE_NOT_PRESENT_OFFSET, 10371 }, + { 0x3394, G_UNICODE_NOT_PRESENT_OFFSET, 10375 }, + { 0x3395, G_UNICODE_NOT_PRESENT_OFFSET, 10379 }, + { 0x3396, G_UNICODE_NOT_PRESENT_OFFSET, 10383 }, + { 0x3397, G_UNICODE_NOT_PRESENT_OFFSET, 10386 }, + { 0x3398, G_UNICODE_NOT_PRESENT_OFFSET, 10389 }, + { 0x3399, G_UNICODE_NOT_PRESENT_OFFSET, 10392 }, + { 0x339a, G_UNICODE_NOT_PRESENT_OFFSET, 10395 }, + { 0x339b, G_UNICODE_NOT_PRESENT_OFFSET, 10398 }, + { 0x339c, G_UNICODE_NOT_PRESENT_OFFSET, 10402 }, + { 0x339d, G_UNICODE_NOT_PRESENT_OFFSET, 10405 }, + { 0x339e, G_UNICODE_NOT_PRESENT_OFFSET, 10408 }, + { 0x339f, G_UNICODE_NOT_PRESENT_OFFSET, 10411 }, + { 0x33a0, G_UNICODE_NOT_PRESENT_OFFSET, 10415 }, + { 0x33a1, G_UNICODE_NOT_PRESENT_OFFSET, 10419 }, + { 0x33a2, G_UNICODE_NOT_PRESENT_OFFSET, 10422 }, + { 0x33a3, G_UNICODE_NOT_PRESENT_OFFSET, 10426 }, + { 0x33a4, G_UNICODE_NOT_PRESENT_OFFSET, 10430 }, + { 0x33a5, G_UNICODE_NOT_PRESENT_OFFSET, 10434 }, + { 0x33a6, G_UNICODE_NOT_PRESENT_OFFSET, 10437 }, + { 0x33a7, G_UNICODE_NOT_PRESENT_OFFSET, 10441 }, + { 0x33a8, G_UNICODE_NOT_PRESENT_OFFSET, 10447 }, + { 0x33a9, G_UNICODE_NOT_PRESENT_OFFSET, 10454 }, + { 0x33aa, G_UNICODE_NOT_PRESENT_OFFSET, 10457 }, + { 0x33ab, G_UNICODE_NOT_PRESENT_OFFSET, 10461 }, + { 0x33ac, G_UNICODE_NOT_PRESENT_OFFSET, 10465 }, + { 0x33ad, G_UNICODE_NOT_PRESENT_OFFSET, 10469 }, + { 0x33ae, G_UNICODE_NOT_PRESENT_OFFSET, 10473 }, + { 0x33af, G_UNICODE_NOT_PRESENT_OFFSET, 10481 }, + { 0x33b0, G_UNICODE_NOT_PRESENT_OFFSET, 10490 }, + { 0x33b1, G_UNICODE_NOT_PRESENT_OFFSET, 10493 }, + { 0x33b2, G_UNICODE_NOT_PRESENT_OFFSET, 10496 }, + { 0x33b3, G_UNICODE_NOT_PRESENT_OFFSET, 10500 }, + { 0x33b4, G_UNICODE_NOT_PRESENT_OFFSET, 10503 }, + { 0x33b5, G_UNICODE_NOT_PRESENT_OFFSET, 10506 }, + { 0x33b6, G_UNICODE_NOT_PRESENT_OFFSET, 10509 }, + { 0x33b7, G_UNICODE_NOT_PRESENT_OFFSET, 10513 }, + { 0x33b8, G_UNICODE_NOT_PRESENT_OFFSET, 10516 }, + { 0x33b9, G_UNICODE_NOT_PRESENT_OFFSET, 10519 }, + { 0x33ba, G_UNICODE_NOT_PRESENT_OFFSET, 10522 }, + { 0x33bb, G_UNICODE_NOT_PRESENT_OFFSET, 10525 }, + { 0x33bc, G_UNICODE_NOT_PRESENT_OFFSET, 10528 }, + { 0x33bd, G_UNICODE_NOT_PRESENT_OFFSET, 10532 }, + { 0x33be, G_UNICODE_NOT_PRESENT_OFFSET, 10535 }, + { 0x33bf, G_UNICODE_NOT_PRESENT_OFFSET, 10538 }, + { 0x33c0, G_UNICODE_NOT_PRESENT_OFFSET, 10541 }, + { 0x33c1, G_UNICODE_NOT_PRESENT_OFFSET, 10545 }, + { 0x33c2, G_UNICODE_NOT_PRESENT_OFFSET, 10549 }, + { 0x33c3, G_UNICODE_NOT_PRESENT_OFFSET, 10554 }, + { 0x33c4, G_UNICODE_NOT_PRESENT_OFFSET, 10557 }, + { 0x33c5, G_UNICODE_NOT_PRESENT_OFFSET, 10560 }, + { 0x33c6, G_UNICODE_NOT_PRESENT_OFFSET, 10563 }, + { 0x33c7, G_UNICODE_NOT_PRESENT_OFFSET, 10570 }, + { 0x33c8, G_UNICODE_NOT_PRESENT_OFFSET, 10574 }, + { 0x33c9, G_UNICODE_NOT_PRESENT_OFFSET, 10577 }, + { 0x33ca, G_UNICODE_NOT_PRESENT_OFFSET, 10580 }, + { 0x33cb, G_UNICODE_NOT_PRESENT_OFFSET, 10583 }, + { 0x33cc, G_UNICODE_NOT_PRESENT_OFFSET, 10586 }, + { 0x33cd, G_UNICODE_NOT_PRESENT_OFFSET, 10589 }, + { 0x33ce, G_UNICODE_NOT_PRESENT_OFFSET, 10592 }, + { 0x33cf, G_UNICODE_NOT_PRESENT_OFFSET, 10595 }, + { 0x33d0, G_UNICODE_NOT_PRESENT_OFFSET, 10598 }, + { 0x33d1, G_UNICODE_NOT_PRESENT_OFFSET, 10601 }, + { 0x33d2, G_UNICODE_NOT_PRESENT_OFFSET, 10604 }, + { 0x33d3, G_UNICODE_NOT_PRESENT_OFFSET, 10608 }, + { 0x33d4, G_UNICODE_NOT_PRESENT_OFFSET, 10611 }, + { 0x33d5, G_UNICODE_NOT_PRESENT_OFFSET, 10614 }, + { 0x33d6, G_UNICODE_NOT_PRESENT_OFFSET, 10618 }, + { 0x33d7, G_UNICODE_NOT_PRESENT_OFFSET, 10622 }, + { 0x33d8, G_UNICODE_NOT_PRESENT_OFFSET, 10625 }, + { 0x33d9, G_UNICODE_NOT_PRESENT_OFFSET, 10630 }, + { 0x33da, G_UNICODE_NOT_PRESENT_OFFSET, 10634 }, + { 0x33db, G_UNICODE_NOT_PRESENT_OFFSET, 10637 }, + { 0x33dc, G_UNICODE_NOT_PRESENT_OFFSET, 10640 }, + { 0x33dd, G_UNICODE_NOT_PRESENT_OFFSET, 10643 }, + { 0x33de, G_UNICODE_NOT_PRESENT_OFFSET, 10646 }, + { 0x33df, G_UNICODE_NOT_PRESENT_OFFSET, 10652 }, + { 0x33e0, G_UNICODE_NOT_PRESENT_OFFSET, 10658 }, + { 0x33e1, G_UNICODE_NOT_PRESENT_OFFSET, 10663 }, + { 0x33e2, G_UNICODE_NOT_PRESENT_OFFSET, 10668 }, + { 0x33e3, G_UNICODE_NOT_PRESENT_OFFSET, 10673 }, + { 0x33e4, G_UNICODE_NOT_PRESENT_OFFSET, 10678 }, + { 0x33e5, G_UNICODE_NOT_PRESENT_OFFSET, 10683 }, + { 0x33e6, G_UNICODE_NOT_PRESENT_OFFSET, 10688 }, + { 0x33e7, G_UNICODE_NOT_PRESENT_OFFSET, 10693 }, + { 0x33e8, G_UNICODE_NOT_PRESENT_OFFSET, 10698 }, + { 0x33e9, G_UNICODE_NOT_PRESENT_OFFSET, 10703 }, + { 0x33ea, G_UNICODE_NOT_PRESENT_OFFSET, 10709 }, + { 0x33eb, G_UNICODE_NOT_PRESENT_OFFSET, 10715 }, + { 0x33ec, G_UNICODE_NOT_PRESENT_OFFSET, 10721 }, + { 0x33ed, G_UNICODE_NOT_PRESENT_OFFSET, 10727 }, + { 0x33ee, G_UNICODE_NOT_PRESENT_OFFSET, 10733 }, + { 0x33ef, G_UNICODE_NOT_PRESENT_OFFSET, 10739 }, + { 0x33f0, G_UNICODE_NOT_PRESENT_OFFSET, 10745 }, + { 0x33f1, G_UNICODE_NOT_PRESENT_OFFSET, 10751 }, + { 0x33f2, G_UNICODE_NOT_PRESENT_OFFSET, 10757 }, + { 0x33f3, G_UNICODE_NOT_PRESENT_OFFSET, 10763 }, + { 0x33f4, G_UNICODE_NOT_PRESENT_OFFSET, 10769 }, + { 0x33f5, G_UNICODE_NOT_PRESENT_OFFSET, 10775 }, + { 0x33f6, G_UNICODE_NOT_PRESENT_OFFSET, 10781 }, + { 0x33f7, G_UNICODE_NOT_PRESENT_OFFSET, 10787 }, + { 0x33f8, G_UNICODE_NOT_PRESENT_OFFSET, 10793 }, + { 0x33f9, G_UNICODE_NOT_PRESENT_OFFSET, 10799 }, + { 0x33fa, G_UNICODE_NOT_PRESENT_OFFSET, 10805 }, + { 0x33fb, G_UNICODE_NOT_PRESENT_OFFSET, 10811 }, + { 0x33fc, G_UNICODE_NOT_PRESENT_OFFSET, 10817 }, + { 0x33fd, G_UNICODE_NOT_PRESENT_OFFSET, 10823 }, + { 0x33fe, G_UNICODE_NOT_PRESENT_OFFSET, 10829 }, + { 0x33ff, G_UNICODE_NOT_PRESENT_OFFSET, 10835 }, + { 0xf900, 10839, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf901, 10843, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf902, 6788, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf903, 10847, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf904, 10851, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf905, 10855, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf906, 10859, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf907, 7004, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf908, 7004, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf909, 10863, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90a, 6820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90b, 10867, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90c, 10871, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90d, 10875, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90e, 10879, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90f, 10883, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf910, 10887, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf911, 10891, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf912, 10895, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf913, 10899, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf914, 10903, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf915, 10907, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf916, 10911, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf917, 10915, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf918, 10919, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf919, 10923, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91a, 10927, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91b, 10931, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91c, 10935, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91d, 10939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91e, 10943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91f, 10947, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf920, 10951, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf921, 10955, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf922, 10959, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf923, 10963, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf924, 10967, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf925, 10971, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf926, 10975, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf927, 10979, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf928, 10983, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf929, 10987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92a, 10991, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92b, 10995, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92c, 10999, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92d, 11003, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92e, 11007, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92f, 11011, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf930, 11015, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf931, 11019, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf932, 11023, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf933, 11027, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf934, 6652, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf935, 11031, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf936, 11035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf937, 11039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf938, 11043, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf939, 11047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93a, 11051, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93b, 11055, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93c, 11059, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93d, 11063, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93e, 11067, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93f, 11071, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf940, 6944, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf941, 11075, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf942, 11079, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf943, 11083, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf944, 11087, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf945, 11091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf946, 11095, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf947, 11099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf948, 11103, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf949, 11107, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94a, 11111, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94b, 11115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94c, 11119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94d, 11123, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94e, 11127, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94f, 11131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf950, 11135, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf951, 11139, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf952, 11143, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf953, 11147, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf954, 11151, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf955, 11155, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf956, 11159, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf957, 11163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf958, 11167, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf959, 11171, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95a, 11175, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95b, 11179, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95c, 10903, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95d, 11183, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95e, 11187, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95f, 11191, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf960, 11195, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf961, 11199, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf962, 11203, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf963, 11207, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf964, 11211, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf965, 11215, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf966, 11219, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf967, 11223, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf968, 11227, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf969, 11231, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96a, 11235, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96b, 11239, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96c, 11243, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96d, 11247, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96e, 11251, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96f, 11255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf970, 11259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf971, 6796, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf972, 11263, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf973, 11267, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf974, 11271, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf975, 11275, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf976, 11279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf977, 11283, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf978, 11287, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf979, 11291, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97a, 11295, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97b, 11299, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97c, 11303, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97d, 11307, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97e, 11311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97f, 11315, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf980, 11319, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf981, 6304, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf982, 11323, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf983, 11327, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf984, 11331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf985, 11335, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf986, 11339, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf987, 11343, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf988, 11347, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf989, 11351, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98a, 6228, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98b, 11355, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98c, 11359, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98d, 11363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98e, 11367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98f, 11371, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf990, 11375, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf991, 11379, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf992, 11383, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf993, 11387, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf994, 11391, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf995, 11395, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf996, 11399, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf997, 11403, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf998, 11407, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf999, 11411, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99a, 11415, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99b, 11419, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99c, 11423, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99d, 11427, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99e, 11431, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99f, 11435, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a0, 11439, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a1, 11255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a2, 11443, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a3, 11447, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a4, 11451, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a5, 11455, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a6, 11459, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a7, 11463, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a8, 11467, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a9, 11471, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9aa, 11191, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ab, 11475, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ac, 11479, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ad, 11483, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ae, 11487, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9af, 11491, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b0, 11495, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b1, 11499, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b2, 11503, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b3, 11507, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b4, 11511, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b5, 11515, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b6, 11519, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b7, 11523, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b8, 11527, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b9, 11531, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ba, 11535, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bb, 11539, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bc, 11543, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bd, 11547, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9be, 11551, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bf, 10903, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c0, 11555, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c1, 11559, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c2, 11563, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c3, 11567, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c4, 7000, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c5, 11571, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c6, 11575, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c7, 11579, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c8, 11583, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c9, 11587, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ca, 11591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cb, 11595, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cc, 11599, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cd, 11603, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ce, 11607, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cf, 11611, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d0, 11615, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d1, 8525, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d2, 11619, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d3, 11623, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d4, 11627, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d5, 11631, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d6, 11635, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d7, 11639, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d8, 11643, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d9, 11647, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9da, 11651, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9db, 11199, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9dc, 11655, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9dd, 11659, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9de, 11663, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9df, 11667, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e0, 11671, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e1, 11675, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e2, 11679, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e3, 11683, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e4, 11687, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e5, 11691, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e6, 11695, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e7, 11699, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e8, 11703, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e9, 6816, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ea, 11707, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9eb, 11711, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ec, 11715, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ed, 11719, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ee, 11723, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ef, 11727, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f0, 11731, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f1, 11735, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f2, 11739, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f3, 11743, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f4, 11747, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f5, 11751, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f6, 11755, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f7, 6620, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f8, 11759, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f9, 11763, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fa, 11767, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fb, 11771, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fc, 11775, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fd, 11779, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fe, 11783, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ff, 11787, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa00, 11791, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa01, 11795, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa02, 11799, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa03, 11803, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa04, 11807, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa05, 11811, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa06, 11815, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa07, 11819, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa08, 6728, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa09, 11823, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0a, 6740, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0b, 11827, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0c, 11831, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0d, 11835, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa10, 11839, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa12, 11843, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa15, 11847, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa16, 11851, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa17, 11855, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa18, 11859, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa19, 11863, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1a, 11867, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1b, 11871, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1c, 11875, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1d, 11879, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1e, 6648, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa20, 11883, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa22, 11887, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa25, 11891, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa26, 11895, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2a, 11899, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2b, 11903, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2c, 11907, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2d, 11911, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa30, 11915, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa31, 11919, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa32, 11923, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa33, 11927, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa34, 11931, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa35, 11935, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa36, 11939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa37, 11943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa38, 11947, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa39, 11951, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3a, 11955, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3b, 11959, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3c, 6332, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3d, 11963, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3e, 11967, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3f, 11971, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa40, 11975, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa41, 11979, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa42, 11983, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa43, 11987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa44, 11991, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa45, 11995, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa46, 11999, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa47, 12003, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa48, 12007, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa49, 12011, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4a, 12015, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4b, 12019, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4c, 8545, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4d, 12023, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4e, 12027, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4f, 12031, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa50, 12035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa51, 8561, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa52, 12039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa53, 12043, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa54, 12047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa55, 12051, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa56, 12055, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa57, 11399, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa58, 12059, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa59, 12063, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5a, 12067, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5b, 12071, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5c, 12075, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5d, 12079, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5e, 12079, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5f, 12083, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa60, 12087, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa61, 12091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa62, 12095, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa63, 12099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa64, 12103, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa65, 12107, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa66, 12111, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa67, 11891, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa68, 12115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa69, 12119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa6a, 12123, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa70, 12127, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa71, 12131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa72, 12135, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa73, 12139, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa74, 12143, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa75, 12147, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa76, 12151, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa77, 12155, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa78, 11939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa79, 12159, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7a, 12163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7b, 12167, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7c, 11839, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7d, 12171, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7e, 12175, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7f, 12179, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa80, 12183, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa81, 12187, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa82, 12191, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa83, 12195, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa84, 12199, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa85, 12203, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa86, 12207, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa87, 12211, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa88, 12215, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa89, 11971, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8a, 12219, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8b, 11975, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8c, 12223, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8d, 12227, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8e, 12231, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8f, 12235, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa90, 12239, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa91, 11843, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa92, 10987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa93, 12243, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa94, 12247, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa95, 6464, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa96, 11259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa97, 11591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa98, 12251, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa99, 12255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9a, 12003, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9b, 12259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9c, 12007, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9d, 12263, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9e, 12267, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9f, 12271, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa0, 11851, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa1, 12275, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa2, 12279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa3, 12283, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa4, 12287, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa5, 12291, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa6, 11855, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa7, 12295, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa8, 12299, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa9, 12303, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaaa, 12307, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaab, 12311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaac, 12315, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaad, 12055, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaae, 12319, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaaf, 12323, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab0, 11399, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab1, 12327, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab2, 12071, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab3, 12331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab4, 12335, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab5, 12339, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab6, 12343, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab7, 12347, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab8, 12091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab9, 12351, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaba, 11887, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabb, 12355, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabc, 12095, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabd, 11183, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabe, 12359, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabf, 12099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac0, 12363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac1, 12107, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac2, 12367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac3, 12371, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac4, 12375, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac5, 12379, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac6, 12383, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac7, 12115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac8, 11875, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac9, 12387, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaca, 12119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacb, 12391, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacc, 12123, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacd, 12395, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xface, 7004, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacf, 12399, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad0, 12404, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad1, 12409, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad2, 12414, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad3, 12418, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad4, 12422, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad5, 12426, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad6, 12431, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad7, 12436, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad8, 12441, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad9, 12445, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb00, G_UNICODE_NOT_PRESENT_OFFSET, 12449 }, + { 0xfb01, G_UNICODE_NOT_PRESENT_OFFSET, 12452 }, + { 0xfb02, G_UNICODE_NOT_PRESENT_OFFSET, 12455 }, + { 0xfb03, G_UNICODE_NOT_PRESENT_OFFSET, 12458 }, + { 0xfb04, G_UNICODE_NOT_PRESENT_OFFSET, 12462 }, + { 0xfb05, G_UNICODE_NOT_PRESENT_OFFSET, 12466 }, + { 0xfb06, G_UNICODE_NOT_PRESENT_OFFSET, 12466 }, + { 0xfb13, G_UNICODE_NOT_PRESENT_OFFSET, 12469 }, + { 0xfb14, G_UNICODE_NOT_PRESENT_OFFSET, 12474 }, + { 0xfb15, G_UNICODE_NOT_PRESENT_OFFSET, 12479 }, + { 0xfb16, G_UNICODE_NOT_PRESENT_OFFSET, 12484 }, + { 0xfb17, G_UNICODE_NOT_PRESENT_OFFSET, 12489 }, + { 0xfb1d, 12494, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb1f, 12499, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb20, G_UNICODE_NOT_PRESENT_OFFSET, 12504 }, + { 0xfb21, G_UNICODE_NOT_PRESENT_OFFSET, 5338 }, + { 0xfb22, G_UNICODE_NOT_PRESENT_OFFSET, 5347 }, + { 0xfb23, G_UNICODE_NOT_PRESENT_OFFSET, 12507 }, + { 0xfb24, G_UNICODE_NOT_PRESENT_OFFSET, 12510 }, + { 0xfb25, G_UNICODE_NOT_PRESENT_OFFSET, 12513 }, + { 0xfb26, G_UNICODE_NOT_PRESENT_OFFSET, 12516 }, + { 0xfb27, G_UNICODE_NOT_PRESENT_OFFSET, 12519 }, + { 0xfb28, G_UNICODE_NOT_PRESENT_OFFSET, 12522 }, + { 0xfb29, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0xfb2a, 12525, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2b, 12530, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2c, 12535, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2d, 12542, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2e, 12549, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2f, 12554, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb30, 12559, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb31, 12564, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb32, 12569, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb33, 12574, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb34, 12579, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb35, 12584, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb36, 12589, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb38, 12594, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb39, 12599, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3a, 12604, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3b, 12609, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3c, 12614, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3e, 12619, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb40, 12624, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb41, 12629, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb43, 12634, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb44, 12639, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb46, 12644, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb47, 12649, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb48, 12654, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb49, 12659, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4a, 12664, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4b, 12669, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4c, 12674, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4d, 12679, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4e, 12684, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4f, G_UNICODE_NOT_PRESENT_OFFSET, 12689 }, + { 0xfb50, G_UNICODE_NOT_PRESENT_OFFSET, 12694 }, + { 0xfb51, G_UNICODE_NOT_PRESENT_OFFSET, 12694 }, + { 0xfb52, G_UNICODE_NOT_PRESENT_OFFSET, 12697 }, + { 0xfb53, G_UNICODE_NOT_PRESENT_OFFSET, 12697 }, + { 0xfb54, G_UNICODE_NOT_PRESENT_OFFSET, 12697 }, + { 0xfb55, G_UNICODE_NOT_PRESENT_OFFSET, 12697 }, + { 0xfb56, G_UNICODE_NOT_PRESENT_OFFSET, 12700 }, + { 0xfb57, G_UNICODE_NOT_PRESENT_OFFSET, 12700 }, + { 0xfb58, G_UNICODE_NOT_PRESENT_OFFSET, 12700 }, + { 0xfb59, G_UNICODE_NOT_PRESENT_OFFSET, 12700 }, + { 0xfb5a, G_UNICODE_NOT_PRESENT_OFFSET, 12703 }, + { 0xfb5b, G_UNICODE_NOT_PRESENT_OFFSET, 12703 }, + { 0xfb5c, G_UNICODE_NOT_PRESENT_OFFSET, 12703 }, + { 0xfb5d, G_UNICODE_NOT_PRESENT_OFFSET, 12703 }, + { 0xfb5e, G_UNICODE_NOT_PRESENT_OFFSET, 12706 }, + { 0xfb5f, G_UNICODE_NOT_PRESENT_OFFSET, 12706 }, + { 0xfb60, G_UNICODE_NOT_PRESENT_OFFSET, 12706 }, + { 0xfb61, G_UNICODE_NOT_PRESENT_OFFSET, 12706 }, + { 0xfb62, G_UNICODE_NOT_PRESENT_OFFSET, 12709 }, + { 0xfb63, G_UNICODE_NOT_PRESENT_OFFSET, 12709 }, + { 0xfb64, G_UNICODE_NOT_PRESENT_OFFSET, 12709 }, + { 0xfb65, G_UNICODE_NOT_PRESENT_OFFSET, 12709 }, + { 0xfb66, G_UNICODE_NOT_PRESENT_OFFSET, 12712 }, + { 0xfb67, G_UNICODE_NOT_PRESENT_OFFSET, 12712 }, + { 0xfb68, G_UNICODE_NOT_PRESENT_OFFSET, 12712 }, + { 0xfb69, G_UNICODE_NOT_PRESENT_OFFSET, 12712 }, + { 0xfb6a, G_UNICODE_NOT_PRESENT_OFFSET, 12715 }, + { 0xfb6b, G_UNICODE_NOT_PRESENT_OFFSET, 12715 }, + { 0xfb6c, G_UNICODE_NOT_PRESENT_OFFSET, 12715 }, + { 0xfb6d, G_UNICODE_NOT_PRESENT_OFFSET, 12715 }, + { 0xfb6e, G_UNICODE_NOT_PRESENT_OFFSET, 12718 }, + { 0xfb6f, G_UNICODE_NOT_PRESENT_OFFSET, 12718 }, + { 0xfb70, G_UNICODE_NOT_PRESENT_OFFSET, 12718 }, + { 0xfb71, G_UNICODE_NOT_PRESENT_OFFSET, 12718 }, + { 0xfb72, G_UNICODE_NOT_PRESENT_OFFSET, 12721 }, + { 0xfb73, G_UNICODE_NOT_PRESENT_OFFSET, 12721 }, + { 0xfb74, G_UNICODE_NOT_PRESENT_OFFSET, 12721 }, + { 0xfb75, G_UNICODE_NOT_PRESENT_OFFSET, 12721 }, + { 0xfb76, G_UNICODE_NOT_PRESENT_OFFSET, 12724 }, + { 0xfb77, G_UNICODE_NOT_PRESENT_OFFSET, 12724 }, + { 0xfb78, G_UNICODE_NOT_PRESENT_OFFSET, 12724 }, + { 0xfb79, G_UNICODE_NOT_PRESENT_OFFSET, 12724 }, + { 0xfb7a, G_UNICODE_NOT_PRESENT_OFFSET, 12727 }, + { 0xfb7b, G_UNICODE_NOT_PRESENT_OFFSET, 12727 }, + { 0xfb7c, G_UNICODE_NOT_PRESENT_OFFSET, 12727 }, + { 0xfb7d, G_UNICODE_NOT_PRESENT_OFFSET, 12727 }, + { 0xfb7e, G_UNICODE_NOT_PRESENT_OFFSET, 12730 }, + { 0xfb7f, G_UNICODE_NOT_PRESENT_OFFSET, 12730 }, + { 0xfb80, G_UNICODE_NOT_PRESENT_OFFSET, 12730 }, + { 0xfb81, G_UNICODE_NOT_PRESENT_OFFSET, 12730 }, + { 0xfb82, G_UNICODE_NOT_PRESENT_OFFSET, 12733 }, + { 0xfb83, G_UNICODE_NOT_PRESENT_OFFSET, 12733 }, + { 0xfb84, G_UNICODE_NOT_PRESENT_OFFSET, 12736 }, + { 0xfb85, G_UNICODE_NOT_PRESENT_OFFSET, 12736 }, + { 0xfb86, G_UNICODE_NOT_PRESENT_OFFSET, 12739 }, + { 0xfb87, G_UNICODE_NOT_PRESENT_OFFSET, 12739 }, + { 0xfb88, G_UNICODE_NOT_PRESENT_OFFSET, 12742 }, + { 0xfb89, G_UNICODE_NOT_PRESENT_OFFSET, 12742 }, + { 0xfb8a, G_UNICODE_NOT_PRESENT_OFFSET, 12745 }, + { 0xfb8b, G_UNICODE_NOT_PRESENT_OFFSET, 12745 }, + { 0xfb8c, G_UNICODE_NOT_PRESENT_OFFSET, 12748 }, + { 0xfb8d, G_UNICODE_NOT_PRESENT_OFFSET, 12748 }, + { 0xfb8e, G_UNICODE_NOT_PRESENT_OFFSET, 12751 }, + { 0xfb8f, G_UNICODE_NOT_PRESENT_OFFSET, 12751 }, + { 0xfb90, G_UNICODE_NOT_PRESENT_OFFSET, 12751 }, + { 0xfb91, G_UNICODE_NOT_PRESENT_OFFSET, 12751 }, + { 0xfb92, G_UNICODE_NOT_PRESENT_OFFSET, 12754 }, + { 0xfb93, G_UNICODE_NOT_PRESENT_OFFSET, 12754 }, + { 0xfb94, G_UNICODE_NOT_PRESENT_OFFSET, 12754 }, + { 0xfb95, G_UNICODE_NOT_PRESENT_OFFSET, 12754 }, + { 0xfb96, G_UNICODE_NOT_PRESENT_OFFSET, 12757 }, + { 0xfb97, G_UNICODE_NOT_PRESENT_OFFSET, 12757 }, + { 0xfb98, G_UNICODE_NOT_PRESENT_OFFSET, 12757 }, + { 0xfb99, G_UNICODE_NOT_PRESENT_OFFSET, 12757 }, + { 0xfb9a, G_UNICODE_NOT_PRESENT_OFFSET, 12760 }, + { 0xfb9b, G_UNICODE_NOT_PRESENT_OFFSET, 12760 }, + { 0xfb9c, G_UNICODE_NOT_PRESENT_OFFSET, 12760 }, + { 0xfb9d, G_UNICODE_NOT_PRESENT_OFFSET, 12760 }, + { 0xfb9e, G_UNICODE_NOT_PRESENT_OFFSET, 12763 }, + { 0xfb9f, G_UNICODE_NOT_PRESENT_OFFSET, 12763 }, + { 0xfba0, G_UNICODE_NOT_PRESENT_OFFSET, 12766 }, + { 0xfba1, G_UNICODE_NOT_PRESENT_OFFSET, 12766 }, + { 0xfba2, G_UNICODE_NOT_PRESENT_OFFSET, 12766 }, + { 0xfba3, G_UNICODE_NOT_PRESENT_OFFSET, 12766 }, + { 0xfba4, G_UNICODE_NOT_PRESENT_OFFSET, 1721 }, + { 0xfba5, G_UNICODE_NOT_PRESENT_OFFSET, 1721 }, + { 0xfba6, G_UNICODE_NOT_PRESENT_OFFSET, 12769 }, + { 0xfba7, G_UNICODE_NOT_PRESENT_OFFSET, 12769 }, + { 0xfba8, G_UNICODE_NOT_PRESENT_OFFSET, 12769 }, + { 0xfba9, G_UNICODE_NOT_PRESENT_OFFSET, 12769 }, + { 0xfbaa, G_UNICODE_NOT_PRESENT_OFFSET, 12772 }, + { 0xfbab, G_UNICODE_NOT_PRESENT_OFFSET, 12772 }, + { 0xfbac, G_UNICODE_NOT_PRESENT_OFFSET, 12772 }, + { 0xfbad, G_UNICODE_NOT_PRESENT_OFFSET, 12772 }, + { 0xfbae, G_UNICODE_NOT_PRESENT_OFFSET, 12775 }, + { 0xfbaf, G_UNICODE_NOT_PRESENT_OFFSET, 12775 }, + { 0xfbb0, G_UNICODE_NOT_PRESENT_OFFSET, 1731 }, + { 0xfbb1, G_UNICODE_NOT_PRESENT_OFFSET, 1731 }, + { 0xfbd3, G_UNICODE_NOT_PRESENT_OFFSET, 12778 }, + { 0xfbd4, G_UNICODE_NOT_PRESENT_OFFSET, 12778 }, + { 0xfbd5, G_UNICODE_NOT_PRESENT_OFFSET, 12778 }, + { 0xfbd6, G_UNICODE_NOT_PRESENT_OFFSET, 12778 }, + { 0xfbd7, G_UNICODE_NOT_PRESENT_OFFSET, 12781 }, + { 0xfbd8, G_UNICODE_NOT_PRESENT_OFFSET, 12781 }, + { 0xfbd9, G_UNICODE_NOT_PRESENT_OFFSET, 12784 }, + { 0xfbda, G_UNICODE_NOT_PRESENT_OFFSET, 12784 }, + { 0xfbdb, G_UNICODE_NOT_PRESENT_OFFSET, 12787 }, + { 0xfbdc, G_UNICODE_NOT_PRESENT_OFFSET, 12787 }, + { 0xfbdd, G_UNICODE_NOT_PRESENT_OFFSET, 1711 }, + { 0xfbde, G_UNICODE_NOT_PRESENT_OFFSET, 12790 }, + { 0xfbdf, G_UNICODE_NOT_PRESENT_OFFSET, 12790 }, + { 0xfbe0, G_UNICODE_NOT_PRESENT_OFFSET, 12793 }, + { 0xfbe1, G_UNICODE_NOT_PRESENT_OFFSET, 12793 }, + { 0xfbe2, G_UNICODE_NOT_PRESENT_OFFSET, 12796 }, + { 0xfbe3, G_UNICODE_NOT_PRESENT_OFFSET, 12796 }, + { 0xfbe4, G_UNICODE_NOT_PRESENT_OFFSET, 12799 }, + { 0xfbe5, G_UNICODE_NOT_PRESENT_OFFSET, 12799 }, + { 0xfbe6, G_UNICODE_NOT_PRESENT_OFFSET, 12799 }, + { 0xfbe7, G_UNICODE_NOT_PRESENT_OFFSET, 12799 }, + { 0xfbe8, G_UNICODE_NOT_PRESENT_OFFSET, 12802 }, + { 0xfbe9, G_UNICODE_NOT_PRESENT_OFFSET, 12802 }, + { 0xfbea, G_UNICODE_NOT_PRESENT_OFFSET, 12805 }, + { 0xfbeb, G_UNICODE_NOT_PRESENT_OFFSET, 12805 }, + { 0xfbec, G_UNICODE_NOT_PRESENT_OFFSET, 12812 }, + { 0xfbed, G_UNICODE_NOT_PRESENT_OFFSET, 12812 }, + { 0xfbee, G_UNICODE_NOT_PRESENT_OFFSET, 12819 }, + { 0xfbef, G_UNICODE_NOT_PRESENT_OFFSET, 12819 }, + { 0xfbf0, G_UNICODE_NOT_PRESENT_OFFSET, 12826 }, + { 0xfbf1, G_UNICODE_NOT_PRESENT_OFFSET, 12826 }, + { 0xfbf2, G_UNICODE_NOT_PRESENT_OFFSET, 12833 }, + { 0xfbf3, G_UNICODE_NOT_PRESENT_OFFSET, 12833 }, + { 0xfbf4, G_UNICODE_NOT_PRESENT_OFFSET, 12840 }, + { 0xfbf5, G_UNICODE_NOT_PRESENT_OFFSET, 12840 }, + { 0xfbf6, G_UNICODE_NOT_PRESENT_OFFSET, 12847 }, + { 0xfbf7, G_UNICODE_NOT_PRESENT_OFFSET, 12847 }, + { 0xfbf8, G_UNICODE_NOT_PRESENT_OFFSET, 12847 }, + { 0xfbf9, G_UNICODE_NOT_PRESENT_OFFSET, 12854 }, + { 0xfbfa, G_UNICODE_NOT_PRESENT_OFFSET, 12854 }, + { 0xfbfb, G_UNICODE_NOT_PRESENT_OFFSET, 12854 }, + { 0xfbfc, G_UNICODE_NOT_PRESENT_OFFSET, 12861 }, + { 0xfbfd, G_UNICODE_NOT_PRESENT_OFFSET, 12861 }, + { 0xfbfe, G_UNICODE_NOT_PRESENT_OFFSET, 12861 }, + { 0xfbff, G_UNICODE_NOT_PRESENT_OFFSET, 12861 }, + { 0xfc00, G_UNICODE_NOT_PRESENT_OFFSET, 12864 }, + { 0xfc01, G_UNICODE_NOT_PRESENT_OFFSET, 12871 }, + { 0xfc02, G_UNICODE_NOT_PRESENT_OFFSET, 12878 }, + { 0xfc03, G_UNICODE_NOT_PRESENT_OFFSET, 12854 }, + { 0xfc04, G_UNICODE_NOT_PRESENT_OFFSET, 12885 }, + { 0xfc05, G_UNICODE_NOT_PRESENT_OFFSET, 12892 }, + { 0xfc06, G_UNICODE_NOT_PRESENT_OFFSET, 12897 }, + { 0xfc07, G_UNICODE_NOT_PRESENT_OFFSET, 12902 }, + { 0xfc08, G_UNICODE_NOT_PRESENT_OFFSET, 12907 }, + { 0xfc09, G_UNICODE_NOT_PRESENT_OFFSET, 12912 }, + { 0xfc0a, G_UNICODE_NOT_PRESENT_OFFSET, 12917 }, + { 0xfc0b, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfc0c, G_UNICODE_NOT_PRESENT_OFFSET, 12927 }, + { 0xfc0d, G_UNICODE_NOT_PRESENT_OFFSET, 12932 }, + { 0xfc0e, G_UNICODE_NOT_PRESENT_OFFSET, 12937 }, + { 0xfc0f, G_UNICODE_NOT_PRESENT_OFFSET, 12942 }, + { 0xfc10, G_UNICODE_NOT_PRESENT_OFFSET, 12947 }, + { 0xfc11, G_UNICODE_NOT_PRESENT_OFFSET, 12952 }, + { 0xfc12, G_UNICODE_NOT_PRESENT_OFFSET, 12957 }, + { 0xfc13, G_UNICODE_NOT_PRESENT_OFFSET, 12962 }, + { 0xfc14, G_UNICODE_NOT_PRESENT_OFFSET, 12967 }, + { 0xfc15, G_UNICODE_NOT_PRESENT_OFFSET, 12972 }, + { 0xfc16, G_UNICODE_NOT_PRESENT_OFFSET, 12977 }, + { 0xfc17, G_UNICODE_NOT_PRESENT_OFFSET, 12982 }, + { 0xfc18, G_UNICODE_NOT_PRESENT_OFFSET, 12987 }, + { 0xfc19, G_UNICODE_NOT_PRESENT_OFFSET, 12992 }, + { 0xfc1a, G_UNICODE_NOT_PRESENT_OFFSET, 12997 }, + { 0xfc1b, G_UNICODE_NOT_PRESENT_OFFSET, 13002 }, + { 0xfc1c, G_UNICODE_NOT_PRESENT_OFFSET, 13007 }, + { 0xfc1d, G_UNICODE_NOT_PRESENT_OFFSET, 13012 }, + { 0xfc1e, G_UNICODE_NOT_PRESENT_OFFSET, 13017 }, + { 0xfc1f, G_UNICODE_NOT_PRESENT_OFFSET, 13022 }, + { 0xfc20, G_UNICODE_NOT_PRESENT_OFFSET, 13027 }, + { 0xfc21, G_UNICODE_NOT_PRESENT_OFFSET, 13032 }, + { 0xfc22, G_UNICODE_NOT_PRESENT_OFFSET, 13037 }, + { 0xfc23, G_UNICODE_NOT_PRESENT_OFFSET, 13042 }, + { 0xfc24, G_UNICODE_NOT_PRESENT_OFFSET, 13047 }, + { 0xfc25, G_UNICODE_NOT_PRESENT_OFFSET, 13052 }, + { 0xfc26, G_UNICODE_NOT_PRESENT_OFFSET, 13057 }, + { 0xfc27, G_UNICODE_NOT_PRESENT_OFFSET, 13062 }, + { 0xfc28, G_UNICODE_NOT_PRESENT_OFFSET, 13067 }, + { 0xfc29, G_UNICODE_NOT_PRESENT_OFFSET, 13072 }, + { 0xfc2a, G_UNICODE_NOT_PRESENT_OFFSET, 13077 }, + { 0xfc2b, G_UNICODE_NOT_PRESENT_OFFSET, 13082 }, + { 0xfc2c, G_UNICODE_NOT_PRESENT_OFFSET, 13087 }, + { 0xfc2d, G_UNICODE_NOT_PRESENT_OFFSET, 13092 }, + { 0xfc2e, G_UNICODE_NOT_PRESENT_OFFSET, 13097 }, + { 0xfc2f, G_UNICODE_NOT_PRESENT_OFFSET, 13102 }, + { 0xfc30, G_UNICODE_NOT_PRESENT_OFFSET, 13107 }, + { 0xfc31, G_UNICODE_NOT_PRESENT_OFFSET, 13112 }, + { 0xfc32, G_UNICODE_NOT_PRESENT_OFFSET, 13117 }, + { 0xfc33, G_UNICODE_NOT_PRESENT_OFFSET, 13122 }, + { 0xfc34, G_UNICODE_NOT_PRESENT_OFFSET, 13127 }, + { 0xfc35, G_UNICODE_NOT_PRESENT_OFFSET, 13132 }, + { 0xfc36, G_UNICODE_NOT_PRESENT_OFFSET, 13137 }, + { 0xfc37, G_UNICODE_NOT_PRESENT_OFFSET, 13142 }, + { 0xfc38, G_UNICODE_NOT_PRESENT_OFFSET, 13147 }, + { 0xfc39, G_UNICODE_NOT_PRESENT_OFFSET, 13152 }, + { 0xfc3a, G_UNICODE_NOT_PRESENT_OFFSET, 13157 }, + { 0xfc3b, G_UNICODE_NOT_PRESENT_OFFSET, 13162 }, + { 0xfc3c, G_UNICODE_NOT_PRESENT_OFFSET, 13167 }, + { 0xfc3d, G_UNICODE_NOT_PRESENT_OFFSET, 13172 }, + { 0xfc3e, G_UNICODE_NOT_PRESENT_OFFSET, 13177 }, + { 0xfc3f, G_UNICODE_NOT_PRESENT_OFFSET, 13182 }, + { 0xfc40, G_UNICODE_NOT_PRESENT_OFFSET, 13187 }, + { 0xfc41, G_UNICODE_NOT_PRESENT_OFFSET, 13192 }, + { 0xfc42, G_UNICODE_NOT_PRESENT_OFFSET, 13197 }, + { 0xfc43, G_UNICODE_NOT_PRESENT_OFFSET, 13202 }, + { 0xfc44, G_UNICODE_NOT_PRESENT_OFFSET, 13207 }, + { 0xfc45, G_UNICODE_NOT_PRESENT_OFFSET, 13212 }, + { 0xfc46, G_UNICODE_NOT_PRESENT_OFFSET, 13217 }, + { 0xfc47, G_UNICODE_NOT_PRESENT_OFFSET, 13222 }, + { 0xfc48, G_UNICODE_NOT_PRESENT_OFFSET, 13227 }, + { 0xfc49, G_UNICODE_NOT_PRESENT_OFFSET, 13232 }, + { 0xfc4a, G_UNICODE_NOT_PRESENT_OFFSET, 13237 }, + { 0xfc4b, G_UNICODE_NOT_PRESENT_OFFSET, 13242 }, + { 0xfc4c, G_UNICODE_NOT_PRESENT_OFFSET, 13247 }, + { 0xfc4d, G_UNICODE_NOT_PRESENT_OFFSET, 13252 }, + { 0xfc4e, G_UNICODE_NOT_PRESENT_OFFSET, 13257 }, + { 0xfc4f, G_UNICODE_NOT_PRESENT_OFFSET, 13262 }, + { 0xfc50, G_UNICODE_NOT_PRESENT_OFFSET, 13267 }, + { 0xfc51, G_UNICODE_NOT_PRESENT_OFFSET, 13272 }, + { 0xfc52, G_UNICODE_NOT_PRESENT_OFFSET, 13277 }, + { 0xfc53, G_UNICODE_NOT_PRESENT_OFFSET, 13282 }, + { 0xfc54, G_UNICODE_NOT_PRESENT_OFFSET, 13287 }, + { 0xfc55, G_UNICODE_NOT_PRESENT_OFFSET, 13292 }, + { 0xfc56, G_UNICODE_NOT_PRESENT_OFFSET, 13297 }, + { 0xfc57, G_UNICODE_NOT_PRESENT_OFFSET, 13302 }, + { 0xfc58, G_UNICODE_NOT_PRESENT_OFFSET, 13307 }, + { 0xfc59, G_UNICODE_NOT_PRESENT_OFFSET, 13312 }, + { 0xfc5a, G_UNICODE_NOT_PRESENT_OFFSET, 13317 }, + { 0xfc5b, G_UNICODE_NOT_PRESENT_OFFSET, 13322 }, + { 0xfc5c, G_UNICODE_NOT_PRESENT_OFFSET, 13327 }, + { 0xfc5d, G_UNICODE_NOT_PRESENT_OFFSET, 13332 }, + { 0xfc5e, G_UNICODE_NOT_PRESENT_OFFSET, 13337 }, + { 0xfc5f, G_UNICODE_NOT_PRESENT_OFFSET, 13343 }, + { 0xfc60, G_UNICODE_NOT_PRESENT_OFFSET, 13349 }, + { 0xfc61, G_UNICODE_NOT_PRESENT_OFFSET, 13355 }, + { 0xfc62, G_UNICODE_NOT_PRESENT_OFFSET, 13361 }, + { 0xfc63, G_UNICODE_NOT_PRESENT_OFFSET, 13367 }, + { 0xfc64, G_UNICODE_NOT_PRESENT_OFFSET, 13373 }, + { 0xfc65, G_UNICODE_NOT_PRESENT_OFFSET, 13380 }, + { 0xfc66, G_UNICODE_NOT_PRESENT_OFFSET, 12878 }, + { 0xfc67, G_UNICODE_NOT_PRESENT_OFFSET, 13387 }, + { 0xfc68, G_UNICODE_NOT_PRESENT_OFFSET, 12854 }, + { 0xfc69, G_UNICODE_NOT_PRESENT_OFFSET, 12885 }, + { 0xfc6a, G_UNICODE_NOT_PRESENT_OFFSET, 13394 }, + { 0xfc6b, G_UNICODE_NOT_PRESENT_OFFSET, 13399 }, + { 0xfc6c, G_UNICODE_NOT_PRESENT_OFFSET, 12907 }, + { 0xfc6d, G_UNICODE_NOT_PRESENT_OFFSET, 13404 }, + { 0xfc6e, G_UNICODE_NOT_PRESENT_OFFSET, 12912 }, + { 0xfc6f, G_UNICODE_NOT_PRESENT_OFFSET, 12917 }, + { 0xfc70, G_UNICODE_NOT_PRESENT_OFFSET, 13409 }, + { 0xfc71, G_UNICODE_NOT_PRESENT_OFFSET, 13414 }, + { 0xfc72, G_UNICODE_NOT_PRESENT_OFFSET, 12937 }, + { 0xfc73, G_UNICODE_NOT_PRESENT_OFFSET, 13419 }, + { 0xfc74, G_UNICODE_NOT_PRESENT_OFFSET, 12942 }, + { 0xfc75, G_UNICODE_NOT_PRESENT_OFFSET, 12947 }, + { 0xfc76, G_UNICODE_NOT_PRESENT_OFFSET, 13424 }, + { 0xfc77, G_UNICODE_NOT_PRESENT_OFFSET, 13429 }, + { 0xfc78, G_UNICODE_NOT_PRESENT_OFFSET, 12957 }, + { 0xfc79, G_UNICODE_NOT_PRESENT_OFFSET, 13434 }, + { 0xfc7a, G_UNICODE_NOT_PRESENT_OFFSET, 12962 }, + { 0xfc7b, G_UNICODE_NOT_PRESENT_OFFSET, 12967 }, + { 0xfc7c, G_UNICODE_NOT_PRESENT_OFFSET, 13112 }, + { 0xfc7d, G_UNICODE_NOT_PRESENT_OFFSET, 13117 }, + { 0xfc7e, G_UNICODE_NOT_PRESENT_OFFSET, 13132 }, + { 0xfc7f, G_UNICODE_NOT_PRESENT_OFFSET, 13137 }, + { 0xfc80, G_UNICODE_NOT_PRESENT_OFFSET, 13142 }, + { 0xfc81, G_UNICODE_NOT_PRESENT_OFFSET, 13162 }, + { 0xfc82, G_UNICODE_NOT_PRESENT_OFFSET, 13167 }, + { 0xfc83, G_UNICODE_NOT_PRESENT_OFFSET, 13172 }, + { 0xfc84, G_UNICODE_NOT_PRESENT_OFFSET, 13177 }, + { 0xfc85, G_UNICODE_NOT_PRESENT_OFFSET, 13197 }, + { 0xfc86, G_UNICODE_NOT_PRESENT_OFFSET, 13202 }, + { 0xfc87, G_UNICODE_NOT_PRESENT_OFFSET, 13207 }, + { 0xfc88, G_UNICODE_NOT_PRESENT_OFFSET, 13439 }, + { 0xfc89, G_UNICODE_NOT_PRESENT_OFFSET, 13227 }, + { 0xfc8a, G_UNICODE_NOT_PRESENT_OFFSET, 13444 }, + { 0xfc8b, G_UNICODE_NOT_PRESENT_OFFSET, 13449 }, + { 0xfc8c, G_UNICODE_NOT_PRESENT_OFFSET, 13257 }, + { 0xfc8d, G_UNICODE_NOT_PRESENT_OFFSET, 13454 }, + { 0xfc8e, G_UNICODE_NOT_PRESENT_OFFSET, 13262 }, + { 0xfc8f, G_UNICODE_NOT_PRESENT_OFFSET, 13267 }, + { 0xfc90, G_UNICODE_NOT_PRESENT_OFFSET, 13332 }, + { 0xfc91, G_UNICODE_NOT_PRESENT_OFFSET, 13459 }, + { 0xfc92, G_UNICODE_NOT_PRESENT_OFFSET, 13464 }, + { 0xfc93, G_UNICODE_NOT_PRESENT_OFFSET, 13307 }, + { 0xfc94, G_UNICODE_NOT_PRESENT_OFFSET, 13469 }, + { 0xfc95, G_UNICODE_NOT_PRESENT_OFFSET, 13312 }, + { 0xfc96, G_UNICODE_NOT_PRESENT_OFFSET, 13317 }, + { 0xfc97, G_UNICODE_NOT_PRESENT_OFFSET, 12864 }, + { 0xfc98, G_UNICODE_NOT_PRESENT_OFFSET, 12871 }, + { 0xfc99, G_UNICODE_NOT_PRESENT_OFFSET, 13474 }, + { 0xfc9a, G_UNICODE_NOT_PRESENT_OFFSET, 12878 }, + { 0xfc9b, G_UNICODE_NOT_PRESENT_OFFSET, 13481 }, + { 0xfc9c, G_UNICODE_NOT_PRESENT_OFFSET, 12892 }, + { 0xfc9d, G_UNICODE_NOT_PRESENT_OFFSET, 12897 }, + { 0xfc9e, G_UNICODE_NOT_PRESENT_OFFSET, 12902 }, + { 0xfc9f, G_UNICODE_NOT_PRESENT_OFFSET, 12907 }, + { 0xfca0, G_UNICODE_NOT_PRESENT_OFFSET, 13488 }, + { 0xfca1, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfca2, G_UNICODE_NOT_PRESENT_OFFSET, 12927 }, + { 0xfca3, G_UNICODE_NOT_PRESENT_OFFSET, 12932 }, + { 0xfca4, G_UNICODE_NOT_PRESENT_OFFSET, 12937 }, + { 0xfca5, G_UNICODE_NOT_PRESENT_OFFSET, 13493 }, + { 0xfca6, G_UNICODE_NOT_PRESENT_OFFSET, 12957 }, + { 0xfca7, G_UNICODE_NOT_PRESENT_OFFSET, 12972 }, + { 0xfca8, G_UNICODE_NOT_PRESENT_OFFSET, 12977 }, + { 0xfca9, G_UNICODE_NOT_PRESENT_OFFSET, 12982 }, + { 0xfcaa, G_UNICODE_NOT_PRESENT_OFFSET, 12987 }, + { 0xfcab, G_UNICODE_NOT_PRESENT_OFFSET, 12992 }, + { 0xfcac, G_UNICODE_NOT_PRESENT_OFFSET, 13002 }, + { 0xfcad, G_UNICODE_NOT_PRESENT_OFFSET, 13007 }, + { 0xfcae, G_UNICODE_NOT_PRESENT_OFFSET, 13012 }, + { 0xfcaf, G_UNICODE_NOT_PRESENT_OFFSET, 13017 }, + { 0xfcb0, G_UNICODE_NOT_PRESENT_OFFSET, 13022 }, + { 0xfcb1, G_UNICODE_NOT_PRESENT_OFFSET, 13027 }, + { 0xfcb2, G_UNICODE_NOT_PRESENT_OFFSET, 13498 }, + { 0xfcb3, G_UNICODE_NOT_PRESENT_OFFSET, 13032 }, + { 0xfcb4, G_UNICODE_NOT_PRESENT_OFFSET, 13037 }, + { 0xfcb5, G_UNICODE_NOT_PRESENT_OFFSET, 13042 }, + { 0xfcb6, G_UNICODE_NOT_PRESENT_OFFSET, 13047 }, + { 0xfcb7, G_UNICODE_NOT_PRESENT_OFFSET, 13052 }, + { 0xfcb8, G_UNICODE_NOT_PRESENT_OFFSET, 13057 }, + { 0xfcb9, G_UNICODE_NOT_PRESENT_OFFSET, 13067 }, + { 0xfcba, G_UNICODE_NOT_PRESENT_OFFSET, 13072 }, + { 0xfcbb, G_UNICODE_NOT_PRESENT_OFFSET, 13077 }, + { 0xfcbc, G_UNICODE_NOT_PRESENT_OFFSET, 13082 }, + { 0xfcbd, G_UNICODE_NOT_PRESENT_OFFSET, 13087 }, + { 0xfcbe, G_UNICODE_NOT_PRESENT_OFFSET, 13092 }, + { 0xfcbf, G_UNICODE_NOT_PRESENT_OFFSET, 13097 }, + { 0xfcc0, G_UNICODE_NOT_PRESENT_OFFSET, 13102 }, + { 0xfcc1, G_UNICODE_NOT_PRESENT_OFFSET, 13107 }, + { 0xfcc2, G_UNICODE_NOT_PRESENT_OFFSET, 13122 }, + { 0xfcc3, G_UNICODE_NOT_PRESENT_OFFSET, 13127 }, + { 0xfcc4, G_UNICODE_NOT_PRESENT_OFFSET, 13147 }, + { 0xfcc5, G_UNICODE_NOT_PRESENT_OFFSET, 13152 }, + { 0xfcc6, G_UNICODE_NOT_PRESENT_OFFSET, 13157 }, + { 0xfcc7, G_UNICODE_NOT_PRESENT_OFFSET, 13162 }, + { 0xfcc8, G_UNICODE_NOT_PRESENT_OFFSET, 13167 }, + { 0xfcc9, G_UNICODE_NOT_PRESENT_OFFSET, 13182 }, + { 0xfcca, G_UNICODE_NOT_PRESENT_OFFSET, 13187 }, + { 0xfccb, G_UNICODE_NOT_PRESENT_OFFSET, 13192 }, + { 0xfccc, G_UNICODE_NOT_PRESENT_OFFSET, 13197 }, + { 0xfccd, G_UNICODE_NOT_PRESENT_OFFSET, 13503 }, + { 0xfcce, G_UNICODE_NOT_PRESENT_OFFSET, 13212 }, + { 0xfccf, G_UNICODE_NOT_PRESENT_OFFSET, 13217 }, + { 0xfcd0, G_UNICODE_NOT_PRESENT_OFFSET, 13222 }, + { 0xfcd1, G_UNICODE_NOT_PRESENT_OFFSET, 13227 }, + { 0xfcd2, G_UNICODE_NOT_PRESENT_OFFSET, 13242 }, + { 0xfcd3, G_UNICODE_NOT_PRESENT_OFFSET, 13247 }, + { 0xfcd4, G_UNICODE_NOT_PRESENT_OFFSET, 13252 }, + { 0xfcd5, G_UNICODE_NOT_PRESENT_OFFSET, 13257 }, + { 0xfcd6, G_UNICODE_NOT_PRESENT_OFFSET, 13508 }, + { 0xfcd7, G_UNICODE_NOT_PRESENT_OFFSET, 13272 }, + { 0xfcd8, G_UNICODE_NOT_PRESENT_OFFSET, 13277 }, + { 0xfcd9, G_UNICODE_NOT_PRESENT_OFFSET, 13513 }, + { 0xfcda, G_UNICODE_NOT_PRESENT_OFFSET, 13292 }, + { 0xfcdb, G_UNICODE_NOT_PRESENT_OFFSET, 13297 }, + { 0xfcdc, G_UNICODE_NOT_PRESENT_OFFSET, 13302 }, + { 0xfcdd, G_UNICODE_NOT_PRESENT_OFFSET, 13307 }, + { 0xfcde, G_UNICODE_NOT_PRESENT_OFFSET, 13518 }, + { 0xfcdf, G_UNICODE_NOT_PRESENT_OFFSET, 12878 }, + { 0xfce0, G_UNICODE_NOT_PRESENT_OFFSET, 13481 }, + { 0xfce1, G_UNICODE_NOT_PRESENT_OFFSET, 12907 }, + { 0xfce2, G_UNICODE_NOT_PRESENT_OFFSET, 13488 }, + { 0xfce3, G_UNICODE_NOT_PRESENT_OFFSET, 12937 }, + { 0xfce4, G_UNICODE_NOT_PRESENT_OFFSET, 13493 }, + { 0xfce5, G_UNICODE_NOT_PRESENT_OFFSET, 12957 }, + { 0xfce6, G_UNICODE_NOT_PRESENT_OFFSET, 13523 }, + { 0xfce7, G_UNICODE_NOT_PRESENT_OFFSET, 13022 }, + { 0xfce8, G_UNICODE_NOT_PRESENT_OFFSET, 13528 }, + { 0xfce9, G_UNICODE_NOT_PRESENT_OFFSET, 13533 }, + { 0xfcea, G_UNICODE_NOT_PRESENT_OFFSET, 13538 }, + { 0xfceb, G_UNICODE_NOT_PRESENT_OFFSET, 13162 }, + { 0xfcec, G_UNICODE_NOT_PRESENT_OFFSET, 13167 }, + { 0xfced, G_UNICODE_NOT_PRESENT_OFFSET, 13197 }, + { 0xfcee, G_UNICODE_NOT_PRESENT_OFFSET, 13257 }, + { 0xfcef, G_UNICODE_NOT_PRESENT_OFFSET, 13508 }, + { 0xfcf0, G_UNICODE_NOT_PRESENT_OFFSET, 13307 }, + { 0xfcf1, G_UNICODE_NOT_PRESENT_OFFSET, 13518 }, + { 0xfcf2, G_UNICODE_NOT_PRESENT_OFFSET, 13543 }, + { 0xfcf3, G_UNICODE_NOT_PRESENT_OFFSET, 13550 }, + { 0xfcf4, G_UNICODE_NOT_PRESENT_OFFSET, 13557 }, + { 0xfcf5, G_UNICODE_NOT_PRESENT_OFFSET, 13564 }, + { 0xfcf6, G_UNICODE_NOT_PRESENT_OFFSET, 13569 }, + { 0xfcf7, G_UNICODE_NOT_PRESENT_OFFSET, 13574 }, + { 0xfcf8, G_UNICODE_NOT_PRESENT_OFFSET, 13579 }, + { 0xfcf9, G_UNICODE_NOT_PRESENT_OFFSET, 13584 }, + { 0xfcfa, G_UNICODE_NOT_PRESENT_OFFSET, 13589 }, + { 0xfcfb, G_UNICODE_NOT_PRESENT_OFFSET, 13594 }, + { 0xfcfc, G_UNICODE_NOT_PRESENT_OFFSET, 13599 }, + { 0xfcfd, G_UNICODE_NOT_PRESENT_OFFSET, 13604 }, + { 0xfcfe, G_UNICODE_NOT_PRESENT_OFFSET, 13609 }, + { 0xfcff, G_UNICODE_NOT_PRESENT_OFFSET, 13614 }, + { 0xfd00, G_UNICODE_NOT_PRESENT_OFFSET, 13619 }, + { 0xfd01, G_UNICODE_NOT_PRESENT_OFFSET, 13624 }, + { 0xfd02, G_UNICODE_NOT_PRESENT_OFFSET, 13629 }, + { 0xfd03, G_UNICODE_NOT_PRESENT_OFFSET, 13634 }, + { 0xfd04, G_UNICODE_NOT_PRESENT_OFFSET, 13639 }, + { 0xfd05, G_UNICODE_NOT_PRESENT_OFFSET, 13644 }, + { 0xfd06, G_UNICODE_NOT_PRESENT_OFFSET, 13649 }, + { 0xfd07, G_UNICODE_NOT_PRESENT_OFFSET, 13654 }, + { 0xfd08, G_UNICODE_NOT_PRESENT_OFFSET, 13659 }, + { 0xfd09, G_UNICODE_NOT_PRESENT_OFFSET, 13664 }, + { 0xfd0a, G_UNICODE_NOT_PRESENT_OFFSET, 13669 }, + { 0xfd0b, G_UNICODE_NOT_PRESENT_OFFSET, 13674 }, + { 0xfd0c, G_UNICODE_NOT_PRESENT_OFFSET, 13533 }, + { 0xfd0d, G_UNICODE_NOT_PRESENT_OFFSET, 13679 }, + { 0xfd0e, G_UNICODE_NOT_PRESENT_OFFSET, 13684 }, + { 0xfd0f, G_UNICODE_NOT_PRESENT_OFFSET, 13689 }, + { 0xfd10, G_UNICODE_NOT_PRESENT_OFFSET, 13694 }, + { 0xfd11, G_UNICODE_NOT_PRESENT_OFFSET, 13564 }, + { 0xfd12, G_UNICODE_NOT_PRESENT_OFFSET, 13569 }, + { 0xfd13, G_UNICODE_NOT_PRESENT_OFFSET, 13574 }, + { 0xfd14, G_UNICODE_NOT_PRESENT_OFFSET, 13579 }, + { 0xfd15, G_UNICODE_NOT_PRESENT_OFFSET, 13584 }, + { 0xfd16, G_UNICODE_NOT_PRESENT_OFFSET, 13589 }, + { 0xfd17, G_UNICODE_NOT_PRESENT_OFFSET, 13594 }, + { 0xfd18, G_UNICODE_NOT_PRESENT_OFFSET, 13599 }, + { 0xfd19, G_UNICODE_NOT_PRESENT_OFFSET, 13604 }, + { 0xfd1a, G_UNICODE_NOT_PRESENT_OFFSET, 13609 }, + { 0xfd1b, G_UNICODE_NOT_PRESENT_OFFSET, 13614 }, + { 0xfd1c, G_UNICODE_NOT_PRESENT_OFFSET, 13619 }, + { 0xfd1d, G_UNICODE_NOT_PRESENT_OFFSET, 13624 }, + { 0xfd1e, G_UNICODE_NOT_PRESENT_OFFSET, 13629 }, + { 0xfd1f, G_UNICODE_NOT_PRESENT_OFFSET, 13634 }, + { 0xfd20, G_UNICODE_NOT_PRESENT_OFFSET, 13639 }, + { 0xfd21, G_UNICODE_NOT_PRESENT_OFFSET, 13644 }, + { 0xfd22, G_UNICODE_NOT_PRESENT_OFFSET, 13649 }, + { 0xfd23, G_UNICODE_NOT_PRESENT_OFFSET, 13654 }, + { 0xfd24, G_UNICODE_NOT_PRESENT_OFFSET, 13659 }, + { 0xfd25, G_UNICODE_NOT_PRESENT_OFFSET, 13664 }, + { 0xfd26, G_UNICODE_NOT_PRESENT_OFFSET, 13669 }, + { 0xfd27, G_UNICODE_NOT_PRESENT_OFFSET, 13674 }, + { 0xfd28, G_UNICODE_NOT_PRESENT_OFFSET, 13533 }, + { 0xfd29, G_UNICODE_NOT_PRESENT_OFFSET, 13679 }, + { 0xfd2a, G_UNICODE_NOT_PRESENT_OFFSET, 13684 }, + { 0xfd2b, G_UNICODE_NOT_PRESENT_OFFSET, 13689 }, + { 0xfd2c, G_UNICODE_NOT_PRESENT_OFFSET, 13694 }, + { 0xfd2d, G_UNICODE_NOT_PRESENT_OFFSET, 13664 }, + { 0xfd2e, G_UNICODE_NOT_PRESENT_OFFSET, 13669 }, + { 0xfd2f, G_UNICODE_NOT_PRESENT_OFFSET, 13674 }, + { 0xfd30, G_UNICODE_NOT_PRESENT_OFFSET, 13533 }, + { 0xfd31, G_UNICODE_NOT_PRESENT_OFFSET, 13528 }, + { 0xfd32, G_UNICODE_NOT_PRESENT_OFFSET, 13538 }, + { 0xfd33, G_UNICODE_NOT_PRESENT_OFFSET, 13062 }, + { 0xfd34, G_UNICODE_NOT_PRESENT_OFFSET, 13007 }, + { 0xfd35, G_UNICODE_NOT_PRESENT_OFFSET, 13012 }, + { 0xfd36, G_UNICODE_NOT_PRESENT_OFFSET, 13017 }, + { 0xfd37, G_UNICODE_NOT_PRESENT_OFFSET, 13664 }, + { 0xfd38, G_UNICODE_NOT_PRESENT_OFFSET, 13669 }, + { 0xfd39, G_UNICODE_NOT_PRESENT_OFFSET, 13674 }, + { 0xfd3a, G_UNICODE_NOT_PRESENT_OFFSET, 13062 }, + { 0xfd3b, G_UNICODE_NOT_PRESENT_OFFSET, 13067 }, + { 0xfd3c, G_UNICODE_NOT_PRESENT_OFFSET, 13699 }, + { 0xfd3d, G_UNICODE_NOT_PRESENT_OFFSET, 13699 }, + { 0xfd50, G_UNICODE_NOT_PRESENT_OFFSET, 13704 }, + { 0xfd51, G_UNICODE_NOT_PRESENT_OFFSET, 13711 }, + { 0xfd52, G_UNICODE_NOT_PRESENT_OFFSET, 13711 }, + { 0xfd53, G_UNICODE_NOT_PRESENT_OFFSET, 13718 }, + { 0xfd54, G_UNICODE_NOT_PRESENT_OFFSET, 13725 }, + { 0xfd55, G_UNICODE_NOT_PRESENT_OFFSET, 13732 }, + { 0xfd56, G_UNICODE_NOT_PRESENT_OFFSET, 13739 }, + { 0xfd57, G_UNICODE_NOT_PRESENT_OFFSET, 13746 }, + { 0xfd58, G_UNICODE_NOT_PRESENT_OFFSET, 13753 }, + { 0xfd59, G_UNICODE_NOT_PRESENT_OFFSET, 13753 }, + { 0xfd5a, G_UNICODE_NOT_PRESENT_OFFSET, 13760 }, + { 0xfd5b, G_UNICODE_NOT_PRESENT_OFFSET, 13767 }, + { 0xfd5c, G_UNICODE_NOT_PRESENT_OFFSET, 13774 }, + { 0xfd5d, G_UNICODE_NOT_PRESENT_OFFSET, 13781 }, + { 0xfd5e, G_UNICODE_NOT_PRESENT_OFFSET, 13788 }, + { 0xfd5f, G_UNICODE_NOT_PRESENT_OFFSET, 13795 }, + { 0xfd60, G_UNICODE_NOT_PRESENT_OFFSET, 13795 }, + { 0xfd61, G_UNICODE_NOT_PRESENT_OFFSET, 13802 }, + { 0xfd62, G_UNICODE_NOT_PRESENT_OFFSET, 13809 }, + { 0xfd63, G_UNICODE_NOT_PRESENT_OFFSET, 13809 }, + { 0xfd64, G_UNICODE_NOT_PRESENT_OFFSET, 13816 }, + { 0xfd65, G_UNICODE_NOT_PRESENT_OFFSET, 13816 }, + { 0xfd66, G_UNICODE_NOT_PRESENT_OFFSET, 13823 }, + { 0xfd67, G_UNICODE_NOT_PRESENT_OFFSET, 13830 }, + { 0xfd68, G_UNICODE_NOT_PRESENT_OFFSET, 13830 }, + { 0xfd69, G_UNICODE_NOT_PRESENT_OFFSET, 13837 }, + { 0xfd6a, G_UNICODE_NOT_PRESENT_OFFSET, 13844 }, + { 0xfd6b, G_UNICODE_NOT_PRESENT_OFFSET, 13844 }, + { 0xfd6c, G_UNICODE_NOT_PRESENT_OFFSET, 13851 }, + { 0xfd6d, G_UNICODE_NOT_PRESENT_OFFSET, 13851 }, + { 0xfd6e, G_UNICODE_NOT_PRESENT_OFFSET, 13858 }, + { 0xfd6f, G_UNICODE_NOT_PRESENT_OFFSET, 13865 }, + { 0xfd70, G_UNICODE_NOT_PRESENT_OFFSET, 13865 }, + { 0xfd71, G_UNICODE_NOT_PRESENT_OFFSET, 13872 }, + { 0xfd72, G_UNICODE_NOT_PRESENT_OFFSET, 13872 }, + { 0xfd73, G_UNICODE_NOT_PRESENT_OFFSET, 13879 }, + { 0xfd74, G_UNICODE_NOT_PRESENT_OFFSET, 13886 }, + { 0xfd75, G_UNICODE_NOT_PRESENT_OFFSET, 13893 }, + { 0xfd76, G_UNICODE_NOT_PRESENT_OFFSET, 13900 }, + { 0xfd77, G_UNICODE_NOT_PRESENT_OFFSET, 13900 }, + { 0xfd78, G_UNICODE_NOT_PRESENT_OFFSET, 13907 }, + { 0xfd79, G_UNICODE_NOT_PRESENT_OFFSET, 13914 }, + { 0xfd7a, G_UNICODE_NOT_PRESENT_OFFSET, 13921 }, + { 0xfd7b, G_UNICODE_NOT_PRESENT_OFFSET, 13928 }, + { 0xfd7c, G_UNICODE_NOT_PRESENT_OFFSET, 13935 }, + { 0xfd7d, G_UNICODE_NOT_PRESENT_OFFSET, 13935 }, + { 0xfd7e, G_UNICODE_NOT_PRESENT_OFFSET, 13942 }, + { 0xfd7f, G_UNICODE_NOT_PRESENT_OFFSET, 13949 }, + { 0xfd80, G_UNICODE_NOT_PRESENT_OFFSET, 13956 }, + { 0xfd81, G_UNICODE_NOT_PRESENT_OFFSET, 13963 }, + { 0xfd82, G_UNICODE_NOT_PRESENT_OFFSET, 13970 }, + { 0xfd83, G_UNICODE_NOT_PRESENT_OFFSET, 13977 }, + { 0xfd84, G_UNICODE_NOT_PRESENT_OFFSET, 13977 }, + { 0xfd85, G_UNICODE_NOT_PRESENT_OFFSET, 13984 }, + { 0xfd86, G_UNICODE_NOT_PRESENT_OFFSET, 13984 }, + { 0xfd87, G_UNICODE_NOT_PRESENT_OFFSET, 13991 }, + { 0xfd88, G_UNICODE_NOT_PRESENT_OFFSET, 13991 }, + { 0xfd89, G_UNICODE_NOT_PRESENT_OFFSET, 13998 }, + { 0xfd8a, G_UNICODE_NOT_PRESENT_OFFSET, 14005 }, + { 0xfd8b, G_UNICODE_NOT_PRESENT_OFFSET, 14012 }, + { 0xfd8c, G_UNICODE_NOT_PRESENT_OFFSET, 14019 }, + { 0xfd8d, G_UNICODE_NOT_PRESENT_OFFSET, 14026 }, + { 0xfd8e, G_UNICODE_NOT_PRESENT_OFFSET, 14033 }, + { 0xfd8f, G_UNICODE_NOT_PRESENT_OFFSET, 14040 }, + { 0xfd92, G_UNICODE_NOT_PRESENT_OFFSET, 14047 }, + { 0xfd93, G_UNICODE_NOT_PRESENT_OFFSET, 14054 }, + { 0xfd94, G_UNICODE_NOT_PRESENT_OFFSET, 14061 }, + { 0xfd95, G_UNICODE_NOT_PRESENT_OFFSET, 14068 }, + { 0xfd96, G_UNICODE_NOT_PRESENT_OFFSET, 14075 }, + { 0xfd97, G_UNICODE_NOT_PRESENT_OFFSET, 14082 }, + { 0xfd98, G_UNICODE_NOT_PRESENT_OFFSET, 14082 }, + { 0xfd99, G_UNICODE_NOT_PRESENT_OFFSET, 14089 }, + { 0xfd9a, G_UNICODE_NOT_PRESENT_OFFSET, 14096 }, + { 0xfd9b, G_UNICODE_NOT_PRESENT_OFFSET, 14103 }, + { 0xfd9c, G_UNICODE_NOT_PRESENT_OFFSET, 14110 }, + { 0xfd9d, G_UNICODE_NOT_PRESENT_OFFSET, 14110 }, + { 0xfd9e, G_UNICODE_NOT_PRESENT_OFFSET, 14117 }, + { 0xfd9f, G_UNICODE_NOT_PRESENT_OFFSET, 14124 }, + { 0xfda0, G_UNICODE_NOT_PRESENT_OFFSET, 14131 }, + { 0xfda1, G_UNICODE_NOT_PRESENT_OFFSET, 14138 }, + { 0xfda2, G_UNICODE_NOT_PRESENT_OFFSET, 14145 }, + { 0xfda3, G_UNICODE_NOT_PRESENT_OFFSET, 14152 }, + { 0xfda4, G_UNICODE_NOT_PRESENT_OFFSET, 14159 }, + { 0xfda5, G_UNICODE_NOT_PRESENT_OFFSET, 14166 }, + { 0xfda6, G_UNICODE_NOT_PRESENT_OFFSET, 14173 }, + { 0xfda7, G_UNICODE_NOT_PRESENT_OFFSET, 14180 }, + { 0xfda8, G_UNICODE_NOT_PRESENT_OFFSET, 14187 }, + { 0xfda9, G_UNICODE_NOT_PRESENT_OFFSET, 14194 }, + { 0xfdaa, G_UNICODE_NOT_PRESENT_OFFSET, 14201 }, + { 0xfdab, G_UNICODE_NOT_PRESENT_OFFSET, 14208 }, + { 0xfdac, G_UNICODE_NOT_PRESENT_OFFSET, 14215 }, + { 0xfdad, G_UNICODE_NOT_PRESENT_OFFSET, 14222 }, + { 0xfdae, G_UNICODE_NOT_PRESENT_OFFSET, 14229 }, + { 0xfdaf, G_UNICODE_NOT_PRESENT_OFFSET, 14236 }, + { 0xfdb0, G_UNICODE_NOT_PRESENT_OFFSET, 14243 }, + { 0xfdb1, G_UNICODE_NOT_PRESENT_OFFSET, 14250 }, + { 0xfdb2, G_UNICODE_NOT_PRESENT_OFFSET, 14257 }, + { 0xfdb3, G_UNICODE_NOT_PRESENT_OFFSET, 14264 }, + { 0xfdb4, G_UNICODE_NOT_PRESENT_OFFSET, 13942 }, + { 0xfdb5, G_UNICODE_NOT_PRESENT_OFFSET, 13956 }, + { 0xfdb6, G_UNICODE_NOT_PRESENT_OFFSET, 14271 }, + { 0xfdb7, G_UNICODE_NOT_PRESENT_OFFSET, 14278 }, + { 0xfdb8, G_UNICODE_NOT_PRESENT_OFFSET, 14285 }, + { 0xfdb9, G_UNICODE_NOT_PRESENT_OFFSET, 14292 }, + { 0xfdba, G_UNICODE_NOT_PRESENT_OFFSET, 14299 }, + { 0xfdbb, G_UNICODE_NOT_PRESENT_OFFSET, 14306 }, + { 0xfdbc, G_UNICODE_NOT_PRESENT_OFFSET, 14299 }, + { 0xfdbd, G_UNICODE_NOT_PRESENT_OFFSET, 14285 }, + { 0xfdbe, G_UNICODE_NOT_PRESENT_OFFSET, 14313 }, + { 0xfdbf, G_UNICODE_NOT_PRESENT_OFFSET, 14320 }, + { 0xfdc0, G_UNICODE_NOT_PRESENT_OFFSET, 14327 }, + { 0xfdc1, G_UNICODE_NOT_PRESENT_OFFSET, 14334 }, + { 0xfdc2, G_UNICODE_NOT_PRESENT_OFFSET, 14341 }, + { 0xfdc3, G_UNICODE_NOT_PRESENT_OFFSET, 14306 }, + { 0xfdc4, G_UNICODE_NOT_PRESENT_OFFSET, 13893 }, + { 0xfdc5, G_UNICODE_NOT_PRESENT_OFFSET, 13823 }, + { 0xfdc6, G_UNICODE_NOT_PRESENT_OFFSET, 14348 }, + { 0xfdc7, G_UNICODE_NOT_PRESENT_OFFSET, 14355 }, + { 0xfdf0, G_UNICODE_NOT_PRESENT_OFFSET, 14362 }, + { 0xfdf1, G_UNICODE_NOT_PRESENT_OFFSET, 14369 }, + { 0xfdf2, G_UNICODE_NOT_PRESENT_OFFSET, 14376 }, + { 0xfdf3, G_UNICODE_NOT_PRESENT_OFFSET, 14385 }, + { 0xfdf4, G_UNICODE_NOT_PRESENT_OFFSET, 14394 }, + { 0xfdf5, G_UNICODE_NOT_PRESENT_OFFSET, 14403 }, + { 0xfdf6, G_UNICODE_NOT_PRESENT_OFFSET, 14412 }, + { 0xfdf7, G_UNICODE_NOT_PRESENT_OFFSET, 14421 }, + { 0xfdf8, G_UNICODE_NOT_PRESENT_OFFSET, 14430 }, + { 0xfdf9, G_UNICODE_NOT_PRESENT_OFFSET, 14439 }, + { 0xfdfa, G_UNICODE_NOT_PRESENT_OFFSET, 14446 }, + { 0xfdfb, G_UNICODE_NOT_PRESENT_OFFSET, 14480 }, + { 0xfdfc, G_UNICODE_NOT_PRESENT_OFFSET, 14496 }, + { 0xfe10, G_UNICODE_NOT_PRESENT_OFFSET, 14505 }, + { 0xfe11, G_UNICODE_NOT_PRESENT_OFFSET, 14507 }, + { 0xfe12, G_UNICODE_NOT_PRESENT_OFFSET, 14511 }, + { 0xfe13, G_UNICODE_NOT_PRESENT_OFFSET, 14515 }, + { 0xfe14, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, + { 0xfe15, G_UNICODE_NOT_PRESENT_OFFSET, 14517 }, + { 0xfe16, G_UNICODE_NOT_PRESENT_OFFSET, 14519 }, + { 0xfe17, G_UNICODE_NOT_PRESENT_OFFSET, 14521 }, + { 0xfe18, G_UNICODE_NOT_PRESENT_OFFSET, 14525 }, + { 0xfe19, G_UNICODE_NOT_PRESENT_OFFSET, 5186 }, + { 0xfe30, G_UNICODE_NOT_PRESENT_OFFSET, 5183 }, + { 0xfe31, G_UNICODE_NOT_PRESENT_OFFSET, 14529 }, + { 0xfe32, G_UNICODE_NOT_PRESENT_OFFSET, 14533 }, + { 0xfe33, G_UNICODE_NOT_PRESENT_OFFSET, 14537 }, + { 0xfe34, G_UNICODE_NOT_PRESENT_OFFSET, 14537 }, + { 0xfe35, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0xfe36, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0xfe37, G_UNICODE_NOT_PRESENT_OFFSET, 14539 }, + { 0xfe38, G_UNICODE_NOT_PRESENT_OFFSET, 14541 }, + { 0xfe39, G_UNICODE_NOT_PRESENT_OFFSET, 14543 }, + { 0xfe3a, G_UNICODE_NOT_PRESENT_OFFSET, 14547 }, + { 0xfe3b, G_UNICODE_NOT_PRESENT_OFFSET, 14551 }, + { 0xfe3c, G_UNICODE_NOT_PRESENT_OFFSET, 14555 }, + { 0xfe3d, G_UNICODE_NOT_PRESENT_OFFSET, 14559 }, + { 0xfe3e, G_UNICODE_NOT_PRESENT_OFFSET, 14563 }, + { 0xfe3f, G_UNICODE_NOT_PRESENT_OFFSET, 5801 }, + { 0xfe40, G_UNICODE_NOT_PRESENT_OFFSET, 5805 }, + { 0xfe41, G_UNICODE_NOT_PRESENT_OFFSET, 14567 }, + { 0xfe42, G_UNICODE_NOT_PRESENT_OFFSET, 14571 }, + { 0xfe43, G_UNICODE_NOT_PRESENT_OFFSET, 14575 }, + { 0xfe44, G_UNICODE_NOT_PRESENT_OFFSET, 14579 }, + { 0xfe47, G_UNICODE_NOT_PRESENT_OFFSET, 14583 }, + { 0xfe48, G_UNICODE_NOT_PRESENT_OFFSET, 14585 }, + { 0xfe49, G_UNICODE_NOT_PRESENT_OFFSET, 5227 }, + { 0xfe4a, G_UNICODE_NOT_PRESENT_OFFSET, 5227 }, + { 0xfe4b, G_UNICODE_NOT_PRESENT_OFFSET, 5227 }, + { 0xfe4c, G_UNICODE_NOT_PRESENT_OFFSET, 5227 }, + { 0xfe4d, G_UNICODE_NOT_PRESENT_OFFSET, 14537 }, + { 0xfe4e, G_UNICODE_NOT_PRESENT_OFFSET, 14537 }, + { 0xfe4f, G_UNICODE_NOT_PRESENT_OFFSET, 14537 }, + { 0xfe50, G_UNICODE_NOT_PRESENT_OFFSET, 14505 }, + { 0xfe51, G_UNICODE_NOT_PRESENT_OFFSET, 14507 }, + { 0xfe52, G_UNICODE_NOT_PRESENT_OFFSET, 5181 }, + { 0xfe54, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, + { 0xfe55, G_UNICODE_NOT_PRESENT_OFFSET, 14515 }, + { 0xfe56, G_UNICODE_NOT_PRESENT_OFFSET, 14519 }, + { 0xfe57, G_UNICODE_NOT_PRESENT_OFFSET, 14517 }, + { 0xfe58, G_UNICODE_NOT_PRESENT_OFFSET, 14529 }, + { 0xfe59, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0xfe5a, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0xfe5b, G_UNICODE_NOT_PRESENT_OFFSET, 14539 }, + { 0xfe5c, G_UNICODE_NOT_PRESENT_OFFSET, 14541 }, + { 0xfe5d, G_UNICODE_NOT_PRESENT_OFFSET, 14543 }, + { 0xfe5e, G_UNICODE_NOT_PRESENT_OFFSET, 14547 }, + { 0xfe5f, G_UNICODE_NOT_PRESENT_OFFSET, 14587 }, + { 0xfe60, G_UNICODE_NOT_PRESENT_OFFSET, 14589 }, + { 0xfe61, G_UNICODE_NOT_PRESENT_OFFSET, 14591 }, + { 0xfe62, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0xfe63, G_UNICODE_NOT_PRESENT_OFFSET, 14593 }, + { 0xfe64, G_UNICODE_NOT_PRESENT_OFFSET, 14595 }, + { 0xfe65, G_UNICODE_NOT_PRESENT_OFFSET, 14597 }, + { 0xfe66, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, + { 0xfe68, G_UNICODE_NOT_PRESENT_OFFSET, 14599 }, + { 0xfe69, G_UNICODE_NOT_PRESENT_OFFSET, 14601 }, + { 0xfe6a, G_UNICODE_NOT_PRESENT_OFFSET, 14603 }, + { 0xfe6b, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 0xfe70, G_UNICODE_NOT_PRESENT_OFFSET, 14607 }, + { 0xfe71, G_UNICODE_NOT_PRESENT_OFFSET, 14611 }, + { 0xfe72, G_UNICODE_NOT_PRESENT_OFFSET, 14616 }, + { 0xfe74, G_UNICODE_NOT_PRESENT_OFFSET, 14620 }, + { 0xfe76, G_UNICODE_NOT_PRESENT_OFFSET, 14624 }, + { 0xfe77, G_UNICODE_NOT_PRESENT_OFFSET, 14628 }, + { 0xfe78, G_UNICODE_NOT_PRESENT_OFFSET, 14633 }, + { 0xfe79, G_UNICODE_NOT_PRESENT_OFFSET, 14637 }, + { 0xfe7a, G_UNICODE_NOT_PRESENT_OFFSET, 14642 }, + { 0xfe7b, G_UNICODE_NOT_PRESENT_OFFSET, 14646 }, + { 0xfe7c, G_UNICODE_NOT_PRESENT_OFFSET, 14651 }, + { 0xfe7d, G_UNICODE_NOT_PRESENT_OFFSET, 14655 }, + { 0xfe7e, G_UNICODE_NOT_PRESENT_OFFSET, 14660 }, + { 0xfe7f, G_UNICODE_NOT_PRESENT_OFFSET, 14664 }, + { 0xfe80, G_UNICODE_NOT_PRESENT_OFFSET, 14669 }, + { 0xfe81, G_UNICODE_NOT_PRESENT_OFFSET, 1676 }, + { 0xfe82, G_UNICODE_NOT_PRESENT_OFFSET, 1676 }, + { 0xfe83, G_UNICODE_NOT_PRESENT_OFFSET, 1681 }, + { 0xfe84, G_UNICODE_NOT_PRESENT_OFFSET, 1681 }, + { 0xfe85, G_UNICODE_NOT_PRESENT_OFFSET, 1686 }, + { 0xfe86, G_UNICODE_NOT_PRESENT_OFFSET, 1686 }, + { 0xfe87, G_UNICODE_NOT_PRESENT_OFFSET, 1691 }, + { 0xfe88, G_UNICODE_NOT_PRESENT_OFFSET, 1691 }, + { 0xfe89, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, + { 0xfe8a, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, + { 0xfe8b, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, + { 0xfe8c, G_UNICODE_NOT_PRESENT_OFFSET, 1696 }, + { 0xfe8d, G_UNICODE_NOT_PRESENT_OFFSET, 14672 }, + { 0xfe8e, G_UNICODE_NOT_PRESENT_OFFSET, 14672 }, + { 0xfe8f, G_UNICODE_NOT_PRESENT_OFFSET, 14675 }, + { 0xfe90, G_UNICODE_NOT_PRESENT_OFFSET, 14675 }, + { 0xfe91, G_UNICODE_NOT_PRESENT_OFFSET, 14675 }, + { 0xfe92, G_UNICODE_NOT_PRESENT_OFFSET, 14675 }, + { 0xfe93, G_UNICODE_NOT_PRESENT_OFFSET, 14678 }, + { 0xfe94, G_UNICODE_NOT_PRESENT_OFFSET, 14678 }, + { 0xfe95, G_UNICODE_NOT_PRESENT_OFFSET, 14681 }, + { 0xfe96, G_UNICODE_NOT_PRESENT_OFFSET, 14681 }, + { 0xfe97, G_UNICODE_NOT_PRESENT_OFFSET, 14681 }, + { 0xfe98, G_UNICODE_NOT_PRESENT_OFFSET, 14681 }, + { 0xfe99, G_UNICODE_NOT_PRESENT_OFFSET, 14684 }, + { 0xfe9a, G_UNICODE_NOT_PRESENT_OFFSET, 14684 }, + { 0xfe9b, G_UNICODE_NOT_PRESENT_OFFSET, 14684 }, + { 0xfe9c, G_UNICODE_NOT_PRESENT_OFFSET, 14684 }, + { 0xfe9d, G_UNICODE_NOT_PRESENT_OFFSET, 14687 }, + { 0xfe9e, G_UNICODE_NOT_PRESENT_OFFSET, 14687 }, + { 0xfe9f, G_UNICODE_NOT_PRESENT_OFFSET, 14687 }, + { 0xfea0, G_UNICODE_NOT_PRESENT_OFFSET, 14687 }, + { 0xfea1, G_UNICODE_NOT_PRESENT_OFFSET, 14690 }, + { 0xfea2, G_UNICODE_NOT_PRESENT_OFFSET, 14690 }, + { 0xfea3, G_UNICODE_NOT_PRESENT_OFFSET, 14690 }, + { 0xfea4, G_UNICODE_NOT_PRESENT_OFFSET, 14690 }, + { 0xfea5, G_UNICODE_NOT_PRESENT_OFFSET, 14693 }, + { 0xfea6, G_UNICODE_NOT_PRESENT_OFFSET, 14693 }, + { 0xfea7, G_UNICODE_NOT_PRESENT_OFFSET, 14693 }, + { 0xfea8, G_UNICODE_NOT_PRESENT_OFFSET, 14693 }, + { 0xfea9, G_UNICODE_NOT_PRESENT_OFFSET, 14696 }, + { 0xfeaa, G_UNICODE_NOT_PRESENT_OFFSET, 14696 }, + { 0xfeab, G_UNICODE_NOT_PRESENT_OFFSET, 14699 }, + { 0xfeac, G_UNICODE_NOT_PRESENT_OFFSET, 14699 }, + { 0xfead, G_UNICODE_NOT_PRESENT_OFFSET, 14702 }, + { 0xfeae, G_UNICODE_NOT_PRESENT_OFFSET, 14702 }, + { 0xfeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14705 }, + { 0xfeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14705 }, + { 0xfeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14708 }, + { 0xfeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14708 }, + { 0xfeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14708 }, + { 0xfeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14708 }, + { 0xfeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14711 }, + { 0xfeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14711 }, + { 0xfeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14711 }, + { 0xfeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14711 }, + { 0xfeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14714 }, + { 0xfeba, G_UNICODE_NOT_PRESENT_OFFSET, 14714 }, + { 0xfebb, G_UNICODE_NOT_PRESENT_OFFSET, 14714 }, + { 0xfebc, G_UNICODE_NOT_PRESENT_OFFSET, 14714 }, + { 0xfebd, G_UNICODE_NOT_PRESENT_OFFSET, 14717 }, + { 0xfebe, G_UNICODE_NOT_PRESENT_OFFSET, 14717 }, + { 0xfebf, G_UNICODE_NOT_PRESENT_OFFSET, 14717 }, + { 0xfec0, G_UNICODE_NOT_PRESENT_OFFSET, 14717 }, + { 0xfec1, G_UNICODE_NOT_PRESENT_OFFSET, 14720 }, + { 0xfec2, G_UNICODE_NOT_PRESENT_OFFSET, 14720 }, + { 0xfec3, G_UNICODE_NOT_PRESENT_OFFSET, 14720 }, + { 0xfec4, G_UNICODE_NOT_PRESENT_OFFSET, 14720 }, + { 0xfec5, G_UNICODE_NOT_PRESENT_OFFSET, 14723 }, + { 0xfec6, G_UNICODE_NOT_PRESENT_OFFSET, 14723 }, + { 0xfec7, G_UNICODE_NOT_PRESENT_OFFSET, 14723 }, + { 0xfec8, G_UNICODE_NOT_PRESENT_OFFSET, 14723 }, + { 0xfec9, G_UNICODE_NOT_PRESENT_OFFSET, 14726 }, + { 0xfeca, G_UNICODE_NOT_PRESENT_OFFSET, 14726 }, + { 0xfecb, G_UNICODE_NOT_PRESENT_OFFSET, 14726 }, + { 0xfecc, G_UNICODE_NOT_PRESENT_OFFSET, 14726 }, + { 0xfecd, G_UNICODE_NOT_PRESENT_OFFSET, 14729 }, + { 0xfece, G_UNICODE_NOT_PRESENT_OFFSET, 14729 }, + { 0xfecf, G_UNICODE_NOT_PRESENT_OFFSET, 14729 }, + { 0xfed0, G_UNICODE_NOT_PRESENT_OFFSET, 14729 }, + { 0xfed1, G_UNICODE_NOT_PRESENT_OFFSET, 14732 }, + { 0xfed2, G_UNICODE_NOT_PRESENT_OFFSET, 14732 }, + { 0xfed3, G_UNICODE_NOT_PRESENT_OFFSET, 14732 }, + { 0xfed4, G_UNICODE_NOT_PRESENT_OFFSET, 14732 }, + { 0xfed5, G_UNICODE_NOT_PRESENT_OFFSET, 14735 }, + { 0xfed6, G_UNICODE_NOT_PRESENT_OFFSET, 14735 }, + { 0xfed7, G_UNICODE_NOT_PRESENT_OFFSET, 14735 }, + { 0xfed8, G_UNICODE_NOT_PRESENT_OFFSET, 14735 }, + { 0xfed9, G_UNICODE_NOT_PRESENT_OFFSET, 14738 }, + { 0xfeda, G_UNICODE_NOT_PRESENT_OFFSET, 14738 }, + { 0xfedb, G_UNICODE_NOT_PRESENT_OFFSET, 14738 }, + { 0xfedc, G_UNICODE_NOT_PRESENT_OFFSET, 14738 }, + { 0xfedd, G_UNICODE_NOT_PRESENT_OFFSET, 14741 }, + { 0xfede, G_UNICODE_NOT_PRESENT_OFFSET, 14741 }, + { 0xfedf, G_UNICODE_NOT_PRESENT_OFFSET, 14741 }, + { 0xfee0, G_UNICODE_NOT_PRESENT_OFFSET, 14741 }, + { 0xfee1, G_UNICODE_NOT_PRESENT_OFFSET, 14744 }, + { 0xfee2, G_UNICODE_NOT_PRESENT_OFFSET, 14744 }, + { 0xfee3, G_UNICODE_NOT_PRESENT_OFFSET, 14744 }, + { 0xfee4, G_UNICODE_NOT_PRESENT_OFFSET, 14744 }, + { 0xfee5, G_UNICODE_NOT_PRESENT_OFFSET, 14747 }, + { 0xfee6, G_UNICODE_NOT_PRESENT_OFFSET, 14747 }, + { 0xfee7, G_UNICODE_NOT_PRESENT_OFFSET, 14747 }, + { 0xfee8, G_UNICODE_NOT_PRESENT_OFFSET, 14747 }, + { 0xfee9, G_UNICODE_NOT_PRESENT_OFFSET, 14750 }, + { 0xfeea, G_UNICODE_NOT_PRESENT_OFFSET, 14750 }, + { 0xfeeb, G_UNICODE_NOT_PRESENT_OFFSET, 14750 }, + { 0xfeec, G_UNICODE_NOT_PRESENT_OFFSET, 14750 }, + { 0xfeed, G_UNICODE_NOT_PRESENT_OFFSET, 14753 }, + { 0xfeee, G_UNICODE_NOT_PRESENT_OFFSET, 14753 }, + { 0xfeef, G_UNICODE_NOT_PRESENT_OFFSET, 12802 }, + { 0xfef0, G_UNICODE_NOT_PRESENT_OFFSET, 12802 }, + { 0xfef1, G_UNICODE_NOT_PRESENT_OFFSET, 14756 }, + { 0xfef2, G_UNICODE_NOT_PRESENT_OFFSET, 14756 }, + { 0xfef3, G_UNICODE_NOT_PRESENT_OFFSET, 14756 }, + { 0xfef4, G_UNICODE_NOT_PRESENT_OFFSET, 14756 }, + { 0xfef5, G_UNICODE_NOT_PRESENT_OFFSET, 14759 }, + { 0xfef6, G_UNICODE_NOT_PRESENT_OFFSET, 14759 }, + { 0xfef7, G_UNICODE_NOT_PRESENT_OFFSET, 14766 }, + { 0xfef8, G_UNICODE_NOT_PRESENT_OFFSET, 14766 }, + { 0xfef9, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0xfefa, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0xfefb, G_UNICODE_NOT_PRESENT_OFFSET, 14780 }, + { 0xfefc, G_UNICODE_NOT_PRESENT_OFFSET, 14780 }, + { 0xff01, G_UNICODE_NOT_PRESENT_OFFSET, 14517 }, + { 0xff02, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0xff03, G_UNICODE_NOT_PRESENT_OFFSET, 14587 }, + { 0xff04, G_UNICODE_NOT_PRESENT_OFFSET, 14601 }, + { 0xff05, G_UNICODE_NOT_PRESENT_OFFSET, 14603 }, + { 0xff06, G_UNICODE_NOT_PRESENT_OFFSET, 14589 }, + { 0xff07, G_UNICODE_NOT_PRESENT_OFFSET, 14787 }, + { 0xff08, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0xff09, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0xff0a, G_UNICODE_NOT_PRESENT_OFFSET, 14591 }, + { 0xff0b, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0xff0c, G_UNICODE_NOT_PRESENT_OFFSET, 14505 }, + { 0xff0d, G_UNICODE_NOT_PRESENT_OFFSET, 14593 }, + { 0xff0e, G_UNICODE_NOT_PRESENT_OFFSET, 5181 }, + { 0xff0f, G_UNICODE_NOT_PRESENT_OFFSET, 14789 }, + { 0xff10, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0xff11, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0xff12, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0xff13, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0xff14, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0xff15, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0xff16, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0xff17, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0xff18, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0xff19, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0xff1a, G_UNICODE_NOT_PRESENT_OFFSET, 14515 }, + { 0xff1b, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, + { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 14595 }, + { 0xff1d, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, + { 0xff1e, G_UNICODE_NOT_PRESENT_OFFSET, 14597 }, + { 0xff1f, G_UNICODE_NOT_PRESENT_OFFSET, 14519 }, + { 0xff20, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 0xff21, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0xff22, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0xff23, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0xff24, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0xff25, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0xff26, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0xff27, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0xff28, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0xff29, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0xff2a, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0xff2b, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0xff2c, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0xff2d, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0xff2e, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0xff2f, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0xff30, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0xff31, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0xff32, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0xff33, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0xff34, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0xff35, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0xff36, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0xff37, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0xff38, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0xff39, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0xff3a, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0xff3b, G_UNICODE_NOT_PRESENT_OFFSET, 14583 }, + { 0xff3c, G_UNICODE_NOT_PRESENT_OFFSET, 14599 }, + { 0xff3d, G_UNICODE_NOT_PRESENT_OFFSET, 14585 }, + { 0xff3e, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0xff3f, G_UNICODE_NOT_PRESENT_OFFSET, 14537 }, + { 0xff40, G_UNICODE_NOT_PRESENT_OFFSET, 5110 }, + { 0xff41, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0xff42, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0xff43, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0xff44, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0xff45, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0xff46, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0xff47, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0xff48, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0xff49, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0xff4a, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0xff4b, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0xff4c, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0xff4d, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0xff4e, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0xff4f, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0xff50, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0xff51, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0xff52, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0xff53, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0xff54, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0xff55, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0xff56, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0xff57, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0xff58, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0xff59, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0xff5a, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0xff5b, G_UNICODE_NOT_PRESENT_OFFSET, 14539 }, + { 0xff5c, G_UNICODE_NOT_PRESENT_OFFSET, 14793 }, + { 0xff5d, G_UNICODE_NOT_PRESENT_OFFSET, 14541 }, + { 0xff5e, G_UNICODE_NOT_PRESENT_OFFSET, 14795 }, + { 0xff5f, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0xff60, G_UNICODE_NOT_PRESENT_OFFSET, 14801 }, + { 0xff61, G_UNICODE_NOT_PRESENT_OFFSET, 14511 }, + { 0xff62, G_UNICODE_NOT_PRESENT_OFFSET, 14567 }, + { 0xff63, G_UNICODE_NOT_PRESENT_OFFSET, 14571 }, + { 0xff64, G_UNICODE_NOT_PRESENT_OFFSET, 14507 }, + { 0xff65, G_UNICODE_NOT_PRESENT_OFFSET, 14805 }, + { 0xff66, G_UNICODE_NOT_PRESENT_OFFSET, 8955 }, + { 0xff67, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0xff68, G_UNICODE_NOT_PRESENT_OFFSET, 14813 }, + { 0xff69, G_UNICODE_NOT_PRESENT_OFFSET, 14817 }, + { 0xff6a, G_UNICODE_NOT_PRESENT_OFFSET, 14821 }, + { 0xff6b, G_UNICODE_NOT_PRESENT_OFFSET, 14825 }, + { 0xff6c, G_UNICODE_NOT_PRESENT_OFFSET, 14829 }, + { 0xff6d, G_UNICODE_NOT_PRESENT_OFFSET, 14833 }, + { 0xff6e, G_UNICODE_NOT_PRESENT_OFFSET, 14837 }, + { 0xff6f, G_UNICODE_NOT_PRESENT_OFFSET, 14841 }, + { 0xff70, G_UNICODE_NOT_PRESENT_OFFSET, 14845 }, + { 0xff71, G_UNICODE_NOT_PRESENT_OFFSET, 8771 }, + { 0xff72, G_UNICODE_NOT_PRESENT_OFFSET, 8775 }, + { 0xff73, G_UNICODE_NOT_PRESENT_OFFSET, 8779 }, + { 0xff74, G_UNICODE_NOT_PRESENT_OFFSET, 8783 }, + { 0xff75, G_UNICODE_NOT_PRESENT_OFFSET, 8787 }, + { 0xff76, G_UNICODE_NOT_PRESENT_OFFSET, 8791 }, + { 0xff77, G_UNICODE_NOT_PRESENT_OFFSET, 8795 }, + { 0xff78, G_UNICODE_NOT_PRESENT_OFFSET, 8799 }, + { 0xff79, G_UNICODE_NOT_PRESENT_OFFSET, 8803 }, + { 0xff7a, G_UNICODE_NOT_PRESENT_OFFSET, 8807 }, + { 0xff7b, G_UNICODE_NOT_PRESENT_OFFSET, 8811 }, + { 0xff7c, G_UNICODE_NOT_PRESENT_OFFSET, 8815 }, + { 0xff7d, G_UNICODE_NOT_PRESENT_OFFSET, 8819 }, + { 0xff7e, G_UNICODE_NOT_PRESENT_OFFSET, 8823 }, + { 0xff7f, G_UNICODE_NOT_PRESENT_OFFSET, 8827 }, + { 0xff80, G_UNICODE_NOT_PRESENT_OFFSET, 8831 }, + { 0xff81, G_UNICODE_NOT_PRESENT_OFFSET, 8835 }, + { 0xff82, G_UNICODE_NOT_PRESENT_OFFSET, 8839 }, + { 0xff83, G_UNICODE_NOT_PRESENT_OFFSET, 8843 }, + { 0xff84, G_UNICODE_NOT_PRESENT_OFFSET, 8847 }, + { 0xff85, G_UNICODE_NOT_PRESENT_OFFSET, 8851 }, + { 0xff86, G_UNICODE_NOT_PRESENT_OFFSET, 8855 }, + { 0xff87, G_UNICODE_NOT_PRESENT_OFFSET, 8859 }, + { 0xff88, G_UNICODE_NOT_PRESENT_OFFSET, 8863 }, + { 0xff89, G_UNICODE_NOT_PRESENT_OFFSET, 8867 }, + { 0xff8a, G_UNICODE_NOT_PRESENT_OFFSET, 8871 }, + { 0xff8b, G_UNICODE_NOT_PRESENT_OFFSET, 8875 }, + { 0xff8c, G_UNICODE_NOT_PRESENT_OFFSET, 8879 }, + { 0xff8d, G_UNICODE_NOT_PRESENT_OFFSET, 8883 }, + { 0xff8e, G_UNICODE_NOT_PRESENT_OFFSET, 8887 }, + { 0xff8f, G_UNICODE_NOT_PRESENT_OFFSET, 8891 }, + { 0xff90, G_UNICODE_NOT_PRESENT_OFFSET, 8895 }, + { 0xff91, G_UNICODE_NOT_PRESENT_OFFSET, 8899 }, + { 0xff92, G_UNICODE_NOT_PRESENT_OFFSET, 8903 }, + { 0xff93, G_UNICODE_NOT_PRESENT_OFFSET, 8907 }, + { 0xff94, G_UNICODE_NOT_PRESENT_OFFSET, 8911 }, + { 0xff95, G_UNICODE_NOT_PRESENT_OFFSET, 8915 }, + { 0xff96, G_UNICODE_NOT_PRESENT_OFFSET, 8919 }, + { 0xff97, G_UNICODE_NOT_PRESENT_OFFSET, 8923 }, + { 0xff98, G_UNICODE_NOT_PRESENT_OFFSET, 8927 }, + { 0xff99, G_UNICODE_NOT_PRESENT_OFFSET, 8931 }, + { 0xff9a, G_UNICODE_NOT_PRESENT_OFFSET, 8935 }, + { 0xff9b, G_UNICODE_NOT_PRESENT_OFFSET, 8939 }, + { 0xff9c, G_UNICODE_NOT_PRESENT_OFFSET, 8943 }, + { 0xff9d, G_UNICODE_NOT_PRESENT_OFFSET, 14849 }, + { 0xff9e, G_UNICODE_NOT_PRESENT_OFFSET, 14853 }, + { 0xff9f, G_UNICODE_NOT_PRESENT_OFFSET, 14857 }, + { 0xffa0, G_UNICODE_NOT_PRESENT_OFFSET, 7658 }, + { 0xffa1, G_UNICODE_NOT_PRESENT_OFFSET, 7454 }, + { 0xffa2, G_UNICODE_NOT_PRESENT_OFFSET, 7458 }, + { 0xffa3, G_UNICODE_NOT_PRESENT_OFFSET, 7462 }, + { 0xffa4, G_UNICODE_NOT_PRESENT_OFFSET, 7466 }, + { 0xffa5, G_UNICODE_NOT_PRESENT_OFFSET, 7470 }, + { 0xffa6, G_UNICODE_NOT_PRESENT_OFFSET, 7474 }, + { 0xffa7, G_UNICODE_NOT_PRESENT_OFFSET, 7478 }, + { 0xffa8, G_UNICODE_NOT_PRESENT_OFFSET, 7482 }, + { 0xffa9, G_UNICODE_NOT_PRESENT_OFFSET, 7486 }, + { 0xffaa, G_UNICODE_NOT_PRESENT_OFFSET, 7490 }, + { 0xffab, G_UNICODE_NOT_PRESENT_OFFSET, 7494 }, + { 0xffac, G_UNICODE_NOT_PRESENT_OFFSET, 7498 }, + { 0xffad, G_UNICODE_NOT_PRESENT_OFFSET, 7502 }, + { 0xffae, G_UNICODE_NOT_PRESENT_OFFSET, 7506 }, + { 0xffaf, G_UNICODE_NOT_PRESENT_OFFSET, 7510 }, + { 0xffb0, G_UNICODE_NOT_PRESENT_OFFSET, 7514 }, + { 0xffb1, G_UNICODE_NOT_PRESENT_OFFSET, 7518 }, + { 0xffb2, G_UNICODE_NOT_PRESENT_OFFSET, 7522 }, + { 0xffb3, G_UNICODE_NOT_PRESENT_OFFSET, 7526 }, + { 0xffb4, G_UNICODE_NOT_PRESENT_OFFSET, 7530 }, + { 0xffb5, G_UNICODE_NOT_PRESENT_OFFSET, 7534 }, + { 0xffb6, G_UNICODE_NOT_PRESENT_OFFSET, 7538 }, + { 0xffb7, G_UNICODE_NOT_PRESENT_OFFSET, 7542 }, + { 0xffb8, G_UNICODE_NOT_PRESENT_OFFSET, 7546 }, + { 0xffb9, G_UNICODE_NOT_PRESENT_OFFSET, 7550 }, + { 0xffba, G_UNICODE_NOT_PRESENT_OFFSET, 7554 }, + { 0xffbb, G_UNICODE_NOT_PRESENT_OFFSET, 7558 }, + { 0xffbc, G_UNICODE_NOT_PRESENT_OFFSET, 7562 }, + { 0xffbd, G_UNICODE_NOT_PRESENT_OFFSET, 7566 }, + { 0xffbe, G_UNICODE_NOT_PRESENT_OFFSET, 7570 }, + { 0xffc2, G_UNICODE_NOT_PRESENT_OFFSET, 7574 }, + { 0xffc3, G_UNICODE_NOT_PRESENT_OFFSET, 7578 }, + { 0xffc4, G_UNICODE_NOT_PRESENT_OFFSET, 7582 }, + { 0xffc5, G_UNICODE_NOT_PRESENT_OFFSET, 7586 }, + { 0xffc6, G_UNICODE_NOT_PRESENT_OFFSET, 7590 }, + { 0xffc7, G_UNICODE_NOT_PRESENT_OFFSET, 7594 }, + { 0xffca, G_UNICODE_NOT_PRESENT_OFFSET, 7598 }, + { 0xffcb, G_UNICODE_NOT_PRESENT_OFFSET, 7602 }, + { 0xffcc, G_UNICODE_NOT_PRESENT_OFFSET, 7606 }, + { 0xffcd, G_UNICODE_NOT_PRESENT_OFFSET, 7610 }, + { 0xffce, G_UNICODE_NOT_PRESENT_OFFSET, 7614 }, + { 0xffcf, G_UNICODE_NOT_PRESENT_OFFSET, 7618 }, + { 0xffd2, G_UNICODE_NOT_PRESENT_OFFSET, 7622 }, + { 0xffd3, G_UNICODE_NOT_PRESENT_OFFSET, 7626 }, + { 0xffd4, G_UNICODE_NOT_PRESENT_OFFSET, 7630 }, + { 0xffd5, G_UNICODE_NOT_PRESENT_OFFSET, 7634 }, + { 0xffd6, G_UNICODE_NOT_PRESENT_OFFSET, 7638 }, + { 0xffd7, G_UNICODE_NOT_PRESENT_OFFSET, 7642 }, + { 0xffda, G_UNICODE_NOT_PRESENT_OFFSET, 7646 }, + { 0xffdb, G_UNICODE_NOT_PRESENT_OFFSET, 7650 }, + { 0xffdc, G_UNICODE_NOT_PRESENT_OFFSET, 7654 }, + { 0xffe0, G_UNICODE_NOT_PRESENT_OFFSET, 14861 }, + { 0xffe1, G_UNICODE_NOT_PRESENT_OFFSET, 14864 }, + { 0xffe2, G_UNICODE_NOT_PRESENT_OFFSET, 14867 }, + { 0xffe3, G_UNICODE_NOT_PRESENT_OFFSET, 8 }, + { 0xffe4, G_UNICODE_NOT_PRESENT_OFFSET, 14870 }, + { 0xffe5, G_UNICODE_NOT_PRESENT_OFFSET, 14873 }, + { 0xffe6, G_UNICODE_NOT_PRESENT_OFFSET, 14876 }, + { 0xffe8, G_UNICODE_NOT_PRESENT_OFFSET, 14880 }, + { 0xffe9, G_UNICODE_NOT_PRESENT_OFFSET, 14884 }, + { 0xffea, G_UNICODE_NOT_PRESENT_OFFSET, 14888 }, + { 0xffeb, G_UNICODE_NOT_PRESENT_OFFSET, 14892 }, + { 0xffec, G_UNICODE_NOT_PRESENT_OFFSET, 14896 }, + { 0xffed, G_UNICODE_NOT_PRESENT_OFFSET, 14900 }, + { 0xffee, G_UNICODE_NOT_PRESENT_OFFSET, 14904 }, + { 0x1d15e, 14908, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d15f, 14917, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d160, 14926, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d161, 14939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d162, 14952, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d163, 14965, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d164, 14978, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bb, 14991, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bc, 15000, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bd, 15009, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1be, 15022, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bf, 15035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1c0, 15048, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d400, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d401, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d402, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d403, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d404, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d405, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d406, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d407, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d408, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d409, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d40a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d40b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d40c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d40d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d40e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d40f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d410, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d411, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d412, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d413, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d414, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d415, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d416, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d417, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d418, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d419, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d41a, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d41b, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d41c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d41d, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d41e, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d41f, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d420, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d421, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d422, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d423, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d424, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d425, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d426, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d427, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d428, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d429, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d42a, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d42b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d42c, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d42d, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d42e, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d42f, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d430, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d431, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d432, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d433, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d434, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d435, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d436, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d437, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d438, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d439, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d43a, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d43b, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d43c, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d43d, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d43e, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d43f, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d440, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d441, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d442, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d443, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d444, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d445, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d446, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d447, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d448, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d449, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d44a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d44b, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d44c, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d44d, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d44e, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d44f, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d450, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d451, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d452, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d453, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d454, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d456, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d457, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d458, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d459, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d45a, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d45b, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d45c, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d45d, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d45e, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d45f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d460, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d461, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d462, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d463, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d464, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d465, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d466, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d467, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d468, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d469, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d46a, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d46b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d46c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d46d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d46e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d46f, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d470, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d471, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d472, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d473, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d474, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d475, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d476, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d477, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d478, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d479, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d47a, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d47b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d47c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d47d, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d47e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d47f, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d480, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d481, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d482, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d483, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d484, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d485, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d486, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d487, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d488, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d489, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d48a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d48b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d48c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d48d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d48e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d48f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d490, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d491, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d492, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d493, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d494, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d495, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d496, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d497, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d498, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d499, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d49a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d49b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d49c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d49e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d49f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d4a2, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d4a5, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d4a6, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d4a9, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d4aa, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d4ab, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d4ac, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d4ae, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d4af, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d4b0, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d4b1, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d4b2, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d4b3, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d4b4, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d4b5, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d4b6, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d4b7, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d4b8, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d4b9, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d4bb, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d4bd, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d4be, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d4bf, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d4c0, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d4c1, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d4c2, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d4c3, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d4c5, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d4c6, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d4c7, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d4c8, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d4c9, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d4ca, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d4cb, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d4cc, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d4cd, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d4ce, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d4cf, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d4d0, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d4d1, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d4d2, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d4d3, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d4d4, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d4d5, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d4d6, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d4d7, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d4d8, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d4d9, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d4da, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d4db, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d4dc, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d4dd, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d4de, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d4df, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d4e0, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d4e1, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d4e2, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d4e3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d4e4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d4e5, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d4e6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d4e7, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d4e8, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d4e9, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d4ea, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d4eb, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d4ec, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d4ed, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d4ee, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d4ef, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d4f0, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d4f1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d4f2, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d4f3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d4f4, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d4f5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d4f6, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d4f7, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d4f8, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d4f9, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d4fa, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d4fb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d4fc, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d4fd, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d4fe, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d4ff, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d500, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d501, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d502, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d503, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d504, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d505, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d507, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d508, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d509, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d50a, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d50d, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d50e, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d50f, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d510, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d511, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d512, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d513, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d514, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d516, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d517, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d518, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d519, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d51a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d51b, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d51c, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d51e, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d51f, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d520, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d521, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d522, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d523, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d524, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d525, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d526, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d527, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d528, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d529, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d52a, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d52b, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d52c, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d52d, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d52e, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d52f, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d530, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d531, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d532, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d533, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d534, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d535, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d536, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d537, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d538, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d539, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d53b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d53c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d53d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d53e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d540, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d541, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d542, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d543, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d544, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d546, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d54a, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d54b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d54c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d54d, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d54e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d54f, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d550, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d552, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d553, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d554, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d555, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d556, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d557, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d558, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d559, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d55a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d55b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d55c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d55d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d55e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d55f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d560, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d561, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d562, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d563, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d564, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d565, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d566, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d567, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d568, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d569, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d56a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d56b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d56c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d56d, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d56e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d56f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d570, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d571, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d572, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d573, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d574, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d575, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d576, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d577, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d578, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d579, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d57a, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d57b, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d57c, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d57d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d57e, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d57f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d580, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d581, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d582, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d583, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d584, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d585, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d586, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d587, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d588, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d589, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d58a, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d58b, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d58c, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d58d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d58e, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d58f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d590, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d591, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d592, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d593, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d594, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d595, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d596, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d597, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d598, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d599, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d59a, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d59b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d59c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d59d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d59e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d59f, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d5a0, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d5a1, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d5a2, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d5a3, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d5a4, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d5a5, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d5a6, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d5a7, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d5a8, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d5a9, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d5aa, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d5ab, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d5ac, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d5ad, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d5ae, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d5af, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d5b0, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d5b1, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d5b2, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d5b3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d5b4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d5b5, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d5b6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d5b7, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d5b8, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d5b9, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d5ba, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d5bb, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d5bc, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d5bd, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d5be, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d5bf, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d5c0, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d5c1, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d5c2, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d5c3, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d5c4, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d5c5, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d5c6, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d5c7, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d5c8, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d5c9, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d5ca, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d5cb, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d5cc, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d5cd, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d5ce, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d5cf, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d5d0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d5d1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d5d2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d5d3, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d5d4, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d5d5, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d5d6, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d5d7, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d5d8, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d5d9, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d5da, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d5db, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d5dc, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d5dd, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d5de, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d5df, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d5e0, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d5e1, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d5e2, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d5e3, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d5e4, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d5e5, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d5e6, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d5e7, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d5e8, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d5e9, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d5ea, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d5eb, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d5ec, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d5ed, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d5ee, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d5ef, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d5f0, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d5f1, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d5f2, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d5f3, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d5f4, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d5f5, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d5f6, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d5f7, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d5f8, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d5f9, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d5fa, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d5fb, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d5fc, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d5fd, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d5fe, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d5ff, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d600, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d601, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d602, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d603, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d604, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d605, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d606, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d607, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d608, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d609, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d60a, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d60b, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d60c, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d60d, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d60e, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d60f, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d610, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d611, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d612, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d613, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d614, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d615, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d616, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d617, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d618, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d619, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d61a, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d61b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d61c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d61d, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d61e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d61f, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d620, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d621, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d622, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d623, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d624, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d625, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d626, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d627, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d628, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d629, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d62a, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d62b, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d62c, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d62d, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d62e, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d62f, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d630, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d631, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d632, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d633, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d634, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d635, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d636, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d637, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d638, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d639, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d63a, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d63b, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d63c, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d63d, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d63e, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d63f, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d640, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d641, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d642, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d643, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d644, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d645, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d646, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d647, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d648, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d649, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d64a, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d64b, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d64c, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d64d, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d64e, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d64f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d650, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d651, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d652, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d653, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d654, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d655, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d656, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d657, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d658, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d659, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d65a, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d65b, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d65c, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d65d, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d65e, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d65f, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d660, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d661, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d662, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d663, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d664, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d665, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d666, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d667, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d668, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d669, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d66a, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d66b, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d66c, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d66d, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d66e, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d66f, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d670, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1d671, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1d672, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1d673, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1d674, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1d675, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1d676, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1d677, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1d678, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1d679, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1d67a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1d67b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1d67c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1d67d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1d67e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1d67f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1d680, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1d681, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1d682, G_UNICODE_NOT_PRESENT_OFFSET, 6108 }, + { 0x1d683, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d684, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d685, G_UNICODE_NOT_PRESENT_OFFSET, 5451 }, + { 0x1d686, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d687, G_UNICODE_NOT_PRESENT_OFFSET, 5468 }, + { 0x1d688, G_UNICODE_NOT_PRESENT_OFFSET, 6110 }, + { 0x1d689, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1d68a, G_UNICODE_NOT_PRESENT_OFFSET, 6 }, + { 0x1d68b, G_UNICODE_NOT_PRESENT_OFFSET, 2364 }, + { 0x1d68c, G_UNICODE_NOT_PRESENT_OFFSET, 2435 }, + { 0x1d68d, G_UNICODE_NOT_PRESENT_OFFSET, 2366 }, + { 0x1d68e, G_UNICODE_NOT_PRESENT_OFFSET, 2368 }, + { 0x1d68f, G_UNICODE_NOT_PRESENT_OFFSET, 2443 }, + { 0x1d690, G_UNICODE_NOT_PRESENT_OFFSET, 2379 }, + { 0x1d691, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x1d692, G_UNICODE_NOT_PRESENT_OFFSET, 2427 }, + { 0x1d693, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x1d694, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x1d695, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x1d696, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x1d697, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x1d698, G_UNICODE_NOT_PRESENT_OFFSET, 29 }, + { 0x1d699, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x1d69a, G_UNICODE_NOT_PRESENT_OFFSET, 6112 }, + { 0x1d69b, G_UNICODE_NOT_PRESENT_OFFSET, 1178 }, + { 0x1d69c, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x1d69d, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 0x1d69e, G_UNICODE_NOT_PRESENT_OFFSET, 2403 }, + { 0x1d69f, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x1d6a0, G_UNICODE_NOT_PRESENT_OFFSET, 1189 }, + { 0x1d6a1, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x1d6a2, G_UNICODE_NOT_PRESENT_OFFSET, 1191 }, + { 0x1d6a3, G_UNICODE_NOT_PRESENT_OFFSET, 2526 }, + { 0x1d6a4, G_UNICODE_NOT_PRESENT_OFFSET, 15061 }, + { 0x1d6a5, G_UNICODE_NOT_PRESENT_OFFSET, 15064 }, + { 0x1d6a8, G_UNICODE_NOT_PRESENT_OFFSET, 15067 }, + { 0x1d6a9, G_UNICODE_NOT_PRESENT_OFFSET, 15070 }, + { 0x1d6aa, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d6ab, G_UNICODE_NOT_PRESENT_OFFSET, 15073 }, + { 0x1d6ac, G_UNICODE_NOT_PRESENT_OFFSET, 15076 }, + { 0x1d6ad, G_UNICODE_NOT_PRESENT_OFFSET, 15079 }, + { 0x1d6ae, G_UNICODE_NOT_PRESENT_OFFSET, 15082 }, + { 0x1d6af, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6b0, G_UNICODE_NOT_PRESENT_OFFSET, 15085 }, + { 0x1d6b1, G_UNICODE_NOT_PRESENT_OFFSET, 15088 }, + { 0x1d6b2, G_UNICODE_NOT_PRESENT_OFFSET, 15091 }, + { 0x1d6b3, G_UNICODE_NOT_PRESENT_OFFSET, 15094 }, + { 0x1d6b4, G_UNICODE_NOT_PRESENT_OFFSET, 15097 }, + { 0x1d6b5, G_UNICODE_NOT_PRESENT_OFFSET, 15100 }, + { 0x1d6b6, G_UNICODE_NOT_PRESENT_OFFSET, 15103 }, + { 0x1d6b7, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d6b8, G_UNICODE_NOT_PRESENT_OFFSET, 15106 }, + { 0x1d6b9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6ba, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 15109 }, + { 0x1d6bc, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d6bd, G_UNICODE_NOT_PRESENT_OFFSET, 15112 }, + { 0x1d6be, G_UNICODE_NOT_PRESENT_OFFSET, 15115 }, + { 0x1d6bf, G_UNICODE_NOT_PRESENT_OFFSET, 15118 }, + { 0x1d6c0, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d6c1, G_UNICODE_NOT_PRESENT_OFFSET, 15121 }, + { 0x1d6c2, G_UNICODE_NOT_PRESENT_OFFSET, 15125 }, + { 0x1d6c3, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d6c4, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d6c5, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, + { 0x1d6c6, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d6c7, G_UNICODE_NOT_PRESENT_OFFSET, 15128 }, + { 0x1d6c8, G_UNICODE_NOT_PRESENT_OFFSET, 15131 }, + { 0x1d6c9, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d6ca, G_UNICODE_NOT_PRESENT_OFFSET, 4860 }, + { 0x1d6cb, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d6cc, G_UNICODE_NOT_PRESENT_OFFSET, 15134 }, + { 0x1d6cd, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d6ce, G_UNICODE_NOT_PRESENT_OFFSET, 15137 }, + { 0x1d6cf, G_UNICODE_NOT_PRESENT_OFFSET, 15140 }, + { 0x1d6d0, G_UNICODE_NOT_PRESENT_OFFSET, 15143 }, + { 0x1d6d1, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d6d2, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d6d3, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, + { 0x1d6d4, G_UNICODE_NOT_PRESENT_OFFSET, 15146 }, + { 0x1d6d5, G_UNICODE_NOT_PRESENT_OFFSET, 15149 }, + { 0x1d6d6, G_UNICODE_NOT_PRESENT_OFFSET, 15152 }, + { 0x1d6d7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d6d8, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d6d9, G_UNICODE_NOT_PRESENT_OFFSET, 15155 }, + { 0x1d6da, G_UNICODE_NOT_PRESENT_OFFSET, 15158 }, + { 0x1d6db, G_UNICODE_NOT_PRESENT_OFFSET, 15161 }, + { 0x1d6dc, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d6dd, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d6de, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d6df, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d6e0, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d6e1, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d6e2, G_UNICODE_NOT_PRESENT_OFFSET, 15067 }, + { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 15070 }, + { 0x1d6e4, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d6e5, G_UNICODE_NOT_PRESENT_OFFSET, 15073 }, + { 0x1d6e6, G_UNICODE_NOT_PRESENT_OFFSET, 15076 }, + { 0x1d6e7, G_UNICODE_NOT_PRESENT_OFFSET, 15079 }, + { 0x1d6e8, G_UNICODE_NOT_PRESENT_OFFSET, 15082 }, + { 0x1d6e9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6ea, G_UNICODE_NOT_PRESENT_OFFSET, 15085 }, + { 0x1d6eb, G_UNICODE_NOT_PRESENT_OFFSET, 15088 }, + { 0x1d6ec, G_UNICODE_NOT_PRESENT_OFFSET, 15091 }, + { 0x1d6ed, G_UNICODE_NOT_PRESENT_OFFSET, 15094 }, + { 0x1d6ee, G_UNICODE_NOT_PRESENT_OFFSET, 15097 }, + { 0x1d6ef, G_UNICODE_NOT_PRESENT_OFFSET, 15100 }, + { 0x1d6f0, G_UNICODE_NOT_PRESENT_OFFSET, 15103 }, + { 0x1d6f1, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d6f2, G_UNICODE_NOT_PRESENT_OFFSET, 15106 }, + { 0x1d6f3, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6f4, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 15109 }, + { 0x1d6f6, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d6f7, G_UNICODE_NOT_PRESENT_OFFSET, 15112 }, + { 0x1d6f8, G_UNICODE_NOT_PRESENT_OFFSET, 15115 }, + { 0x1d6f9, G_UNICODE_NOT_PRESENT_OFFSET, 15118 }, + { 0x1d6fa, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d6fb, G_UNICODE_NOT_PRESENT_OFFSET, 15121 }, + { 0x1d6fc, G_UNICODE_NOT_PRESENT_OFFSET, 15125 }, + { 0x1d6fd, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d6fe, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d6ff, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, + { 0x1d700, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d701, G_UNICODE_NOT_PRESENT_OFFSET, 15128 }, + { 0x1d702, G_UNICODE_NOT_PRESENT_OFFSET, 15131 }, + { 0x1d703, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d704, G_UNICODE_NOT_PRESENT_OFFSET, 4860 }, + { 0x1d705, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d706, G_UNICODE_NOT_PRESENT_OFFSET, 15134 }, + { 0x1d707, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d708, G_UNICODE_NOT_PRESENT_OFFSET, 15137 }, + { 0x1d709, G_UNICODE_NOT_PRESENT_OFFSET, 15140 }, + { 0x1d70a, G_UNICODE_NOT_PRESENT_OFFSET, 15143 }, + { 0x1d70b, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d70c, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d70d, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, + { 0x1d70e, G_UNICODE_NOT_PRESENT_OFFSET, 15146 }, + { 0x1d70f, G_UNICODE_NOT_PRESENT_OFFSET, 15149 }, + { 0x1d710, G_UNICODE_NOT_PRESENT_OFFSET, 15152 }, + { 0x1d711, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d712, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d713, G_UNICODE_NOT_PRESENT_OFFSET, 15155 }, + { 0x1d714, G_UNICODE_NOT_PRESENT_OFFSET, 15158 }, + { 0x1d715, G_UNICODE_NOT_PRESENT_OFFSET, 15161 }, + { 0x1d716, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d717, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d718, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d719, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d71a, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d71b, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d71c, G_UNICODE_NOT_PRESENT_OFFSET, 15067 }, + { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 15070 }, + { 0x1d71e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d71f, G_UNICODE_NOT_PRESENT_OFFSET, 15073 }, + { 0x1d720, G_UNICODE_NOT_PRESENT_OFFSET, 15076 }, + { 0x1d721, G_UNICODE_NOT_PRESENT_OFFSET, 15079 }, + { 0x1d722, G_UNICODE_NOT_PRESENT_OFFSET, 15082 }, + { 0x1d723, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d724, G_UNICODE_NOT_PRESENT_OFFSET, 15085 }, + { 0x1d725, G_UNICODE_NOT_PRESENT_OFFSET, 15088 }, + { 0x1d726, G_UNICODE_NOT_PRESENT_OFFSET, 15091 }, + { 0x1d727, G_UNICODE_NOT_PRESENT_OFFSET, 15094 }, + { 0x1d728, G_UNICODE_NOT_PRESENT_OFFSET, 15097 }, + { 0x1d729, G_UNICODE_NOT_PRESENT_OFFSET, 15100 }, + { 0x1d72a, G_UNICODE_NOT_PRESENT_OFFSET, 15103 }, + { 0x1d72b, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d72c, G_UNICODE_NOT_PRESENT_OFFSET, 15106 }, + { 0x1d72d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d72e, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 15109 }, + { 0x1d730, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d731, G_UNICODE_NOT_PRESENT_OFFSET, 15112 }, + { 0x1d732, G_UNICODE_NOT_PRESENT_OFFSET, 15115 }, + { 0x1d733, G_UNICODE_NOT_PRESENT_OFFSET, 15118 }, + { 0x1d734, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d735, G_UNICODE_NOT_PRESENT_OFFSET, 15121 }, + { 0x1d736, G_UNICODE_NOT_PRESENT_OFFSET, 15125 }, + { 0x1d737, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d738, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d739, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, + { 0x1d73a, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d73b, G_UNICODE_NOT_PRESENT_OFFSET, 15128 }, + { 0x1d73c, G_UNICODE_NOT_PRESENT_OFFSET, 15131 }, + { 0x1d73d, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d73e, G_UNICODE_NOT_PRESENT_OFFSET, 4860 }, + { 0x1d73f, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d740, G_UNICODE_NOT_PRESENT_OFFSET, 15134 }, + { 0x1d741, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d742, G_UNICODE_NOT_PRESENT_OFFSET, 15137 }, + { 0x1d743, G_UNICODE_NOT_PRESENT_OFFSET, 15140 }, + { 0x1d744, G_UNICODE_NOT_PRESENT_OFFSET, 15143 }, + { 0x1d745, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d746, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d747, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, + { 0x1d748, G_UNICODE_NOT_PRESENT_OFFSET, 15146 }, + { 0x1d749, G_UNICODE_NOT_PRESENT_OFFSET, 15149 }, + { 0x1d74a, G_UNICODE_NOT_PRESENT_OFFSET, 15152 }, + { 0x1d74b, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d74c, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d74d, G_UNICODE_NOT_PRESENT_OFFSET, 15155 }, + { 0x1d74e, G_UNICODE_NOT_PRESENT_OFFSET, 15158 }, + { 0x1d74f, G_UNICODE_NOT_PRESENT_OFFSET, 15161 }, + { 0x1d750, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d751, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d752, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d753, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d754, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d755, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d756, G_UNICODE_NOT_PRESENT_OFFSET, 15067 }, + { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 15070 }, + { 0x1d758, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d759, G_UNICODE_NOT_PRESENT_OFFSET, 15073 }, + { 0x1d75a, G_UNICODE_NOT_PRESENT_OFFSET, 15076 }, + { 0x1d75b, G_UNICODE_NOT_PRESENT_OFFSET, 15079 }, + { 0x1d75c, G_UNICODE_NOT_PRESENT_OFFSET, 15082 }, + { 0x1d75d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d75e, G_UNICODE_NOT_PRESENT_OFFSET, 15085 }, + { 0x1d75f, G_UNICODE_NOT_PRESENT_OFFSET, 15088 }, + { 0x1d760, G_UNICODE_NOT_PRESENT_OFFSET, 15091 }, + { 0x1d761, G_UNICODE_NOT_PRESENT_OFFSET, 15094 }, + { 0x1d762, G_UNICODE_NOT_PRESENT_OFFSET, 15097 }, + { 0x1d763, G_UNICODE_NOT_PRESENT_OFFSET, 15100 }, + { 0x1d764, G_UNICODE_NOT_PRESENT_OFFSET, 15103 }, + { 0x1d765, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d766, G_UNICODE_NOT_PRESENT_OFFSET, 15106 }, + { 0x1d767, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d768, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 15109 }, + { 0x1d76a, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d76b, G_UNICODE_NOT_PRESENT_OFFSET, 15112 }, + { 0x1d76c, G_UNICODE_NOT_PRESENT_OFFSET, 15115 }, + { 0x1d76d, G_UNICODE_NOT_PRESENT_OFFSET, 15118 }, + { 0x1d76e, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d76f, G_UNICODE_NOT_PRESENT_OFFSET, 15121 }, + { 0x1d770, G_UNICODE_NOT_PRESENT_OFFSET, 15125 }, + { 0x1d771, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d772, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d773, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, + { 0x1d774, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d775, G_UNICODE_NOT_PRESENT_OFFSET, 15128 }, + { 0x1d776, G_UNICODE_NOT_PRESENT_OFFSET, 15131 }, + { 0x1d777, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d778, G_UNICODE_NOT_PRESENT_OFFSET, 4860 }, + { 0x1d779, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d77a, G_UNICODE_NOT_PRESENT_OFFSET, 15134 }, + { 0x1d77b, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d77c, G_UNICODE_NOT_PRESENT_OFFSET, 15137 }, + { 0x1d77d, G_UNICODE_NOT_PRESENT_OFFSET, 15140 }, + { 0x1d77e, G_UNICODE_NOT_PRESENT_OFFSET, 15143 }, + { 0x1d77f, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d780, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d781, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, + { 0x1d782, G_UNICODE_NOT_PRESENT_OFFSET, 15146 }, + { 0x1d783, G_UNICODE_NOT_PRESENT_OFFSET, 15149 }, + { 0x1d784, G_UNICODE_NOT_PRESENT_OFFSET, 15152 }, + { 0x1d785, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d786, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d787, G_UNICODE_NOT_PRESENT_OFFSET, 15155 }, + { 0x1d788, G_UNICODE_NOT_PRESENT_OFFSET, 15158 }, + { 0x1d789, G_UNICODE_NOT_PRESENT_OFFSET, 15161 }, + { 0x1d78a, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d78b, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d78c, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d78d, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d78e, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d78f, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d790, G_UNICODE_NOT_PRESENT_OFFSET, 15067 }, + { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 15070 }, + { 0x1d792, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d793, G_UNICODE_NOT_PRESENT_OFFSET, 15073 }, + { 0x1d794, G_UNICODE_NOT_PRESENT_OFFSET, 15076 }, + { 0x1d795, G_UNICODE_NOT_PRESENT_OFFSET, 15079 }, + { 0x1d796, G_UNICODE_NOT_PRESENT_OFFSET, 15082 }, + { 0x1d797, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d798, G_UNICODE_NOT_PRESENT_OFFSET, 15085 }, + { 0x1d799, G_UNICODE_NOT_PRESENT_OFFSET, 15088 }, + { 0x1d79a, G_UNICODE_NOT_PRESENT_OFFSET, 15091 }, + { 0x1d79b, G_UNICODE_NOT_PRESENT_OFFSET, 15094 }, + { 0x1d79c, G_UNICODE_NOT_PRESENT_OFFSET, 15097 }, + { 0x1d79d, G_UNICODE_NOT_PRESENT_OFFSET, 15100 }, + { 0x1d79e, G_UNICODE_NOT_PRESENT_OFFSET, 15103 }, + { 0x1d79f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d7a0, G_UNICODE_NOT_PRESENT_OFFSET, 15106 }, + { 0x1d7a1, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d7a2, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 15109 }, + { 0x1d7a4, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d7a5, G_UNICODE_NOT_PRESENT_OFFSET, 15112 }, + { 0x1d7a6, G_UNICODE_NOT_PRESENT_OFFSET, 15115 }, + { 0x1d7a7, G_UNICODE_NOT_PRESENT_OFFSET, 15118 }, + { 0x1d7a8, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d7a9, G_UNICODE_NOT_PRESENT_OFFSET, 15121 }, + { 0x1d7aa, G_UNICODE_NOT_PRESENT_OFFSET, 15125 }, + { 0x1d7ab, G_UNICODE_NOT_PRESENT_OFFSET, 1368 }, + { 0x1d7ac, G_UNICODE_NOT_PRESENT_OFFSET, 2418 }, + { 0x1d7ad, G_UNICODE_NOT_PRESENT_OFFSET, 2421 }, + { 0x1d7ae, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d7af, G_UNICODE_NOT_PRESENT_OFFSET, 15128 }, + { 0x1d7b0, G_UNICODE_NOT_PRESENT_OFFSET, 15131 }, + { 0x1d7b1, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d7b2, G_UNICODE_NOT_PRESENT_OFFSET, 4860 }, + { 0x1d7b3, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d7b4, G_UNICODE_NOT_PRESENT_OFFSET, 15134 }, + { 0x1d7b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d7b6, G_UNICODE_NOT_PRESENT_OFFSET, 15137 }, + { 0x1d7b7, G_UNICODE_NOT_PRESENT_OFFSET, 15140 }, + { 0x1d7b8, G_UNICODE_NOT_PRESENT_OFFSET, 15143 }, + { 0x1d7b9, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d7ba, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d7bb, G_UNICODE_NOT_PRESENT_OFFSET, 1399 }, + { 0x1d7bc, G_UNICODE_NOT_PRESENT_OFFSET, 15146 }, + { 0x1d7bd, G_UNICODE_NOT_PRESENT_OFFSET, 15149 }, + { 0x1d7be, G_UNICODE_NOT_PRESENT_OFFSET, 15152 }, + { 0x1d7bf, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d7c0, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d7c1, G_UNICODE_NOT_PRESENT_OFFSET, 15155 }, + { 0x1d7c2, G_UNICODE_NOT_PRESENT_OFFSET, 15158 }, + { 0x1d7c3, G_UNICODE_NOT_PRESENT_OFFSET, 15161 }, + { 0x1d7c4, G_UNICODE_NOT_PRESENT_OFFSET, 1405 }, + { 0x1d7c5, G_UNICODE_NOT_PRESENT_OFFSET, 1371 }, + { 0x1d7c6, G_UNICODE_NOT_PRESENT_OFFSET, 1393 }, + { 0x1d7c7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d7c8, G_UNICODE_NOT_PRESENT_OFFSET, 1396 }, + { 0x1d7c9, G_UNICODE_NOT_PRESENT_OFFSET, 1390 }, + { 0x1d7ca, G_UNICODE_NOT_PRESENT_OFFSET, 15165 }, + { 0x1d7cb, G_UNICODE_NOT_PRESENT_OFFSET, 15168 }, + { 0x1d7ce, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x1d7cf, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x1d7d0, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x1d7d1, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x1d7d2, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x1d7d3, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x1d7d4, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x1d7d5, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x1d7d6, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x1d7d7, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x1d7d8, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x1d7d9, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x1d7da, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x1d7db, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x1d7dc, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x1d7dd, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x1d7de, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x1d7df, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x1d7e0, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x1d7e1, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x1d7e2, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x1d7e3, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x1d7e4, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x1d7e5, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x1d7e6, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x1d7e7, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x1d7e8, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x1d7e9, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x1d7ea, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x1d7eb, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x1d7ec, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x1d7ed, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x1d7ee, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x1d7ef, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x1d7f0, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x1d7f1, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x1d7f2, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x1d7f3, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x1d7f4, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x1d7f5, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x1d7f6, G_UNICODE_NOT_PRESENT_OFFSET, 5253 }, + { 0x1d7f7, G_UNICODE_NOT_PRESENT_OFFSET, 27 }, + { 0x1d7f8, G_UNICODE_NOT_PRESENT_OFFSET, 12 }, + { 0x1d7f9, G_UNICODE_NOT_PRESENT_OFFSET, 14 }, + { 0x1d7fa, G_UNICODE_NOT_PRESENT_OFFSET, 5255 }, + { 0x1d7fb, G_UNICODE_NOT_PRESENT_OFFSET, 5257 }, + { 0x1d7fc, G_UNICODE_NOT_PRESENT_OFFSET, 5259 }, + { 0x1d7fd, G_UNICODE_NOT_PRESENT_OFFSET, 5261 }, + { 0x1d7fe, G_UNICODE_NOT_PRESENT_OFFSET, 5263 }, + { 0x1d7ff, G_UNICODE_NOT_PRESENT_OFFSET, 5265 }, + { 0x2f800, 15171, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f801, 15175, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f802, 15179, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f803, 15183, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f804, 15188, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f805, 11915, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f806, 15192, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f807, 15196, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f808, 15200, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f809, 15204, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80a, 11919, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80b, 15208, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80c, 15212, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80d, 15216, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80e, 11923, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80f, 15221, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f810, 15225, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f811, 15229, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f812, 15233, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f813, 15238, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f814, 15242, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f815, 15246, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f816, 15250, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f817, 15255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f818, 15259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f819, 15263, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81a, 15267, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81b, 12131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81c, 15271, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81d, 6220, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81e, 15276, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81f, 15280, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f820, 15284, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f821, 15288, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f822, 15292, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f823, 15296, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f824, 15300, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f825, 12151, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f826, 11927, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f827, 11931, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f828, 12155, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f829, 15304, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82a, 15308, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82b, 11207, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82c, 15312, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82d, 11935, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82e, 15316, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82f, 15320, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f830, 15324, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f831, 15328, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f832, 15328, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f833, 15328, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f834, 15332, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f835, 15337, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f836, 15341, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f837, 15345, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f838, 15349, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f839, 15354, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83a, 15358, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83b, 15362, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83c, 15366, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83d, 15370, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83e, 15374, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83f, 15378, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f840, 15382, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f841, 15386, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f842, 15390, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f843, 15394, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f844, 15398, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f845, 15402, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f846, 15402, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f847, 12163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f848, 15406, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f849, 15410, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84a, 15414, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84b, 15418, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84c, 11943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84d, 15422, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84e, 15426, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84f, 15430, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f850, 11791, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f851, 15434, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f852, 15438, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f853, 15442, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f854, 15446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f855, 15450, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f856, 15454, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f857, 15458, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f858, 15462, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f859, 15466, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85a, 15471, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85b, 15475, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85c, 15479, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85d, 15483, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85e, 15487, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85f, 15491, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f860, 15495, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f861, 15500, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f862, 15505, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f863, 15509, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f864, 15513, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f865, 15517, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f866, 15521, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f867, 15525, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f868, 15529, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f869, 15533, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86a, 15537, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86b, 15537, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86c, 15541, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86d, 15546, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86e, 15550, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86f, 11191, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f870, 15554, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f871, 15558, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f872, 15563, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f873, 15567, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f874, 15571, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f875, 6324, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f876, 15575, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f877, 15579, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f878, 6332, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f879, 15583, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87a, 15587, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87b, 15591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87c, 15596, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87d, 15600, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87e, 15605, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87f, 15609, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f880, 15613, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f881, 15617, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f882, 15621, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f883, 15625, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f884, 15629, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f885, 15633, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f886, 15637, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f887, 15641, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f888, 15645, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f889, 15649, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88a, 15654, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88b, 15658, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88c, 15662, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88d, 15666, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88e, 10983, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88f, 15670, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f890, 6372, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f891, 15675, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f892, 15675, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f893, 15680, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f894, 15684, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f895, 15684, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f896, 15688, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f897, 15692, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f898, 15697, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f899, 15702, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89a, 15706, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89b, 15710, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89c, 15714, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89d, 15718, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89e, 15722, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89f, 15726, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a0, 15730, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a1, 15734, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a2, 15738, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a3, 11963, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a4, 15742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a5, 15747, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a6, 15751, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a7, 15755, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a8, 12211, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a9, 15755, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8aa, 15759, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ab, 11971, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ac, 15763, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ad, 15767, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ae, 15771, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8af, 15775, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b0, 11975, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b1, 10875, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b2, 15779, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b3, 15783, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b4, 15787, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b5, 15791, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b6, 15795, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b7, 15799, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b8, 15803, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b9, 15808, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ba, 15812, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bb, 15816, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bc, 15820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bd, 15824, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8be, 15828, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bf, 15833, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c0, 15837, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c1, 15841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c2, 15845, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c3, 15849, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c4, 15853, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c5, 15857, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c6, 15861, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c7, 15865, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c8, 11979, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c9, 15869, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ca, 15873, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cb, 15878, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cc, 15882, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cd, 15886, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ce, 15890, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cf, 11987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d0, 15894, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d1, 15898, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d2, 15902, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d3, 15906, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d4, 15910, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d5, 15914, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d6, 15918, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d7, 15922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d8, 10987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d9, 12243, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8da, 15926, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8db, 15930, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8dc, 15934, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8dd, 15938, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8de, 15943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8df, 15947, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e0, 15951, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e1, 15955, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e2, 11991, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e3, 15959, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e4, 15964, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e5, 15968, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e6, 15972, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e7, 12414, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e8, 15976, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e9, 15980, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ea, 15984, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8eb, 15988, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ec, 15992, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ed, 15997, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ee, 16001, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ef, 16005, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f0, 16009, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f1, 16014, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f2, 16018, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f3, 16022, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f4, 16026, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f5, 11259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f6, 16030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f7, 16034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f8, 16039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f9, 16044, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fa, 16049, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fb, 16053, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fc, 16058, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fd, 16062, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fe, 16066, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ff, 16070, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f900, 16074, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f901, 11995, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f902, 11591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f903, 16078, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f904, 16082, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f905, 16086, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f906, 16090, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f907, 16095, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f908, 16099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f909, 16103, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90a, 16107, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90b, 12255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90c, 16111, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90d, 16115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90e, 16120, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90f, 16124, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f910, 16128, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f911, 16133, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f912, 16138, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f913, 16142, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f914, 12259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f915, 16146, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f916, 16150, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f917, 16154, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f918, 16158, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f919, 16162, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91a, 16166, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91b, 16170, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91c, 16175, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91d, 16179, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91e, 16184, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91f, 16188, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f920, 16193, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f921, 12267, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f922, 16197, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f923, 16201, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f924, 16206, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f925, 16210, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f926, 16214, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f927, 16219, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f928, 16224, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f929, 16228, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92a, 16232, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92b, 16236, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92c, 16240, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92d, 16240, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92e, 16244, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92f, 16248, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f930, 12275, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f931, 16252, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f932, 16256, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f933, 16260, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f934, 16264, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f935, 16268, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f936, 16273, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f937, 16277, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f938, 11203, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f939, 16282, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93a, 16287, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93b, 16291, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93c, 16296, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93d, 16301, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93e, 16306, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93f, 16310, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f940, 12299, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f941, 16314, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f942, 16319, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f943, 16324, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f944, 16329, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f945, 16334, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f946, 16338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f947, 16338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f948, 12303, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f949, 12422, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94a, 16342, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94b, 16346, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94c, 16350, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94d, 16354, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94e, 16359, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94f, 11055, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f950, 12311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f951, 16363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f952, 16367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f953, 12035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f954, 16372, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f955, 16377, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f956, 11871, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f957, 16382, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f958, 16386, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f959, 12047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95a, 16390, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95b, 16394, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95c, 16398, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95d, 16403, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95e, 16403, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95f, 16408, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f960, 16412, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f961, 16416, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f962, 16421, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f963, 16425, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f964, 16429, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f965, 16433, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f966, 16438, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f967, 16442, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f968, 16446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f969, 16450, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96a, 16454, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96b, 16458, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96c, 16463, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96d, 16467, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96e, 16471, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96f, 16475, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f970, 16479, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f971, 16483, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f972, 16487, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f973, 16492, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f974, 16497, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f975, 16501, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f976, 16506, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f977, 16510, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f978, 16515, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f979, 16519, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97a, 12071, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97b, 16523, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97c, 16528, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97d, 16533, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97e, 16537, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97f, 16542, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f980, 16546, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f981, 16551, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f982, 16555, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f983, 16559, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f984, 16563, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f985, 16567, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f986, 16571, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f987, 16575, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f988, 16580, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f989, 16585, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98a, 16590, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98b, 15680, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98c, 16595, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98d, 16599, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98e, 16603, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98f, 16607, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f990, 16611, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f991, 16615, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f992, 16619, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f993, 16623, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f994, 16627, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f995, 16631, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f996, 16635, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f997, 16639, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f998, 11271, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f999, 16644, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99a, 16648, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99b, 16652, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99c, 16656, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99d, 16660, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99e, 16664, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99f, 12083, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a0, 16668, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a1, 16672, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a2, 16676, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a3, 16680, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a4, 16684, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a5, 16689, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a6, 16694, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a7, 16699, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a8, 16703, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a9, 16707, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9aa, 16711, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ab, 16715, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ac, 16720, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ad, 16724, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ae, 16729, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9af, 16733, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b0, 16737, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b1, 16742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b2, 16747, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b3, 16751, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b4, 11035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b5, 16755, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b6, 16759, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b7, 16763, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b8, 16767, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b9, 16771, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ba, 16775, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bb, 12339, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bc, 16779, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bd, 16783, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9be, 16787, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bf, 16791, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c0, 16795, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c1, 16799, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c2, 16803, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c3, 16807, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c4, 6732, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c5, 16811, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c6, 16816, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c7, 16820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c8, 16824, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c9, 16828, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ca, 16832, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cb, 16836, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cc, 16841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cd, 16846, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ce, 16850, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cf, 16854, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d0, 12359, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d1, 12363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d2, 6760, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d3, 16858, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d4, 16863, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d5, 16867, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d6, 16871, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d7, 16875, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d8, 16879, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d9, 16884, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9da, 16889, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9db, 16893, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9dc, 16897, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9dd, 16901, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9de, 16906, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9df, 12367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e0, 16910, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e1, 16915, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e2, 16920, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e3, 16924, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e4, 16928, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e5, 16932, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e6, 16937, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e7, 16941, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e8, 16945, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e9, 16949, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ea, 16953, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9eb, 16957, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ec, 16961, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ed, 16965, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ee, 16970, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ef, 16974, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f0, 16978, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f1, 16982, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f2, 16987, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f3, 16991, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f4, 16995, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f5, 16999, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f6, 17003, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f7, 17008, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f8, 17013, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f9, 17017, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fa, 17021, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fb, 17025, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fc, 17030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fd, 17034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fe, 12391, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ff, 12391, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa00, 17039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa01, 17043, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa02, 17048, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa03, 17052, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa04, 17056, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa05, 17060, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa06, 17064, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa07, 17068, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa08, 17072, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa09, 17076, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0a, 12395, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0b, 17081, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0c, 17085, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0d, 17089, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0e, 17093, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0f, 17097, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa10, 17101, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa11, 17106, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa12, 17110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa13, 17115, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa14, 17120, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa15, 6952, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa16, 17125, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa17, 6968, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa18, 17129, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa19, 17133, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1a, 17137, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1b, 17141, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1c, 6988, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1d, 17145, G_UNICODE_NOT_PRESENT_OFFSET } +}; + +static const gchar decomp_expansion_string[] = + "\x20\0" /* offset 0 */ + "\x20\xcc\x88\0" /* offset 2 */ + "\x61\0" /* offset 6 */ + "\x20\xcc\x84\0" /* offset 8 */ + "\x32\0" /* offset 12 */ + "\x33\0" /* offset 14 */ + "\x20\xcc\x81\0" /* offset 16 */ + "\xce\xbc\0" /* offset 20 */ + "\x20\xcc\xa7\0" /* offset 23 */ + "\x31\0" /* offset 27 */ + "\x6f\0" /* offset 29 */ + "\x31\xe2\x81\x84\x34\0" /* offset 31 */ + "\x31\xe2\x81\x84\x32\0" /* offset 37 */ + "\x33\xe2\x81\x84\x34\0" /* offset 43 */ + "\x41\xcc\x80\0" /* offset 49 */ + "\x41\xcc\x81\0" /* offset 53 */ + "\x41\xcc\x82\0" /* offset 57 */ + "\x41\xcc\x83\0" /* offset 61 */ + "\x41\xcc\x88\0" /* offset 65 */ + "\x41\xcc\x8a\0" /* offset 69 */ + "\x43\xcc\xa7\0" /* offset 73 */ + "\x45\xcc\x80\0" /* offset 77 */ + "\x45\xcc\x81\0" /* offset 81 */ + "\x45\xcc\x82\0" /* offset 85 */ + "\x45\xcc\x88\0" /* offset 89 */ + "\x49\xcc\x80\0" /* offset 93 */ + "\x49\xcc\x81\0" /* offset 97 */ + "\x49\xcc\x82\0" /* offset 101 */ + "\x49\xcc\x88\0" /* offset 105 */ + "\x4e\xcc\x83\0" /* offset 109 */ + "\x4f\xcc\x80\0" /* offset 113 */ + "\x4f\xcc\x81\0" /* offset 117 */ + "\x4f\xcc\x82\0" /* offset 121 */ + "\x4f\xcc\x83\0" /* offset 125 */ + "\x4f\xcc\x88\0" /* offset 129 */ + "\x55\xcc\x80\0" /* offset 133 */ + "\x55\xcc\x81\0" /* offset 137 */ + "\x55\xcc\x82\0" /* offset 141 */ + "\x55\xcc\x88\0" /* offset 145 */ + "\x59\xcc\x81\0" /* offset 149 */ + "\x61\xcc\x80\0" /* offset 153 */ + "\x61\xcc\x81\0" /* offset 157 */ + "\x61\xcc\x82\0" /* offset 161 */ + "\x61\xcc\x83\0" /* offset 165 */ + "\x61\xcc\x88\0" /* offset 169 */ + "\x61\xcc\x8a\0" /* offset 173 */ + "\x63\xcc\xa7\0" /* offset 177 */ + "\x65\xcc\x80\0" /* offset 181 */ + "\x65\xcc\x81\0" /* offset 185 */ + "\x65\xcc\x82\0" /* offset 189 */ + "\x65\xcc\x88\0" /* offset 193 */ + "\x69\xcc\x80\0" /* offset 197 */ + "\x69\xcc\x81\0" /* offset 201 */ + "\x69\xcc\x82\0" /* offset 205 */ + "\x69\xcc\x88\0" /* offset 209 */ + "\x6e\xcc\x83\0" /* offset 213 */ + "\x6f\xcc\x80\0" /* offset 217 */ + "\x6f\xcc\x81\0" /* offset 221 */ + "\x6f\xcc\x82\0" /* offset 225 */ + "\x6f\xcc\x83\0" /* offset 229 */ + "\x6f\xcc\x88\0" /* offset 233 */ + "\x75\xcc\x80\0" /* offset 237 */ + "\x75\xcc\x81\0" /* offset 241 */ + "\x75\xcc\x82\0" /* offset 245 */ + "\x75\xcc\x88\0" /* offset 249 */ + "\x79\xcc\x81\0" /* offset 253 */ + "\x79\xcc\x88\0" /* offset 257 */ + "\x41\xcc\x84\0" /* offset 261 */ + "\x61\xcc\x84\0" /* offset 265 */ + "\x41\xcc\x86\0" /* offset 269 */ + "\x61\xcc\x86\0" /* offset 273 */ + "\x41\xcc\xa8\0" /* offset 277 */ + "\x61\xcc\xa8\0" /* offset 281 */ + "\x43\xcc\x81\0" /* offset 285 */ + "\x63\xcc\x81\0" /* offset 289 */ + "\x43\xcc\x82\0" /* offset 293 */ + "\x63\xcc\x82\0" /* offset 297 */ + "\x43\xcc\x87\0" /* offset 301 */ + "\x63\xcc\x87\0" /* offset 305 */ + "\x43\xcc\x8c\0" /* offset 309 */ + "\x63\xcc\x8c\0" /* offset 313 */ + "\x44\xcc\x8c\0" /* offset 317 */ + "\x64\xcc\x8c\0" /* offset 321 */ + "\x45\xcc\x84\0" /* offset 325 */ + "\x65\xcc\x84\0" /* offset 329 */ + "\x45\xcc\x86\0" /* offset 333 */ + "\x65\xcc\x86\0" /* offset 337 */ + "\x45\xcc\x87\0" /* offset 341 */ + "\x65\xcc\x87\0" /* offset 345 */ + "\x45\xcc\xa8\0" /* offset 349 */ + "\x65\xcc\xa8\0" /* offset 353 */ + "\x45\xcc\x8c\0" /* offset 357 */ + "\x65\xcc\x8c\0" /* offset 361 */ + "\x47\xcc\x82\0" /* offset 365 */ + "\x67\xcc\x82\0" /* offset 369 */ + "\x47\xcc\x86\0" /* offset 373 */ + "\x67\xcc\x86\0" /* offset 377 */ + "\x47\xcc\x87\0" /* offset 381 */ + "\x67\xcc\x87\0" /* offset 385 */ + "\x47\xcc\xa7\0" /* offset 389 */ + "\x67\xcc\xa7\0" /* offset 393 */ + "\x48\xcc\x82\0" /* offset 397 */ + "\x68\xcc\x82\0" /* offset 401 */ + "\x49\xcc\x83\0" /* offset 405 */ + "\x69\xcc\x83\0" /* offset 409 */ + "\x49\xcc\x84\0" /* offset 413 */ + "\x69\xcc\x84\0" /* offset 417 */ + "\x49\xcc\x86\0" /* offset 421 */ + "\x69\xcc\x86\0" /* offset 425 */ + "\x49\xcc\xa8\0" /* offset 429 */ + "\x69\xcc\xa8\0" /* offset 433 */ + "\x49\xcc\x87\0" /* offset 437 */ + "\x49\x4a\0" /* offset 441 */ + "\x69\x6a\0" /* offset 444 */ + "\x4a\xcc\x82\0" /* offset 447 */ + "\x6a\xcc\x82\0" /* offset 451 */ + "\x4b\xcc\xa7\0" /* offset 455 */ + "\x6b\xcc\xa7\0" /* offset 459 */ + "\x4c\xcc\x81\0" /* offset 463 */ + "\x6c\xcc\x81\0" /* offset 467 */ + "\x4c\xcc\xa7\0" /* offset 471 */ + "\x6c\xcc\xa7\0" /* offset 475 */ + "\x4c\xcc\x8c\0" /* offset 479 */ + "\x6c\xcc\x8c\0" /* offset 483 */ + "\x4c\xc2\xb7\0" /* offset 487 */ + "\x6c\xc2\xb7\0" /* offset 491 */ + "\x4e\xcc\x81\0" /* offset 495 */ + "\x6e\xcc\x81\0" /* offset 499 */ + "\x4e\xcc\xa7\0" /* offset 503 */ + "\x6e\xcc\xa7\0" /* offset 507 */ + "\x4e\xcc\x8c\0" /* offset 511 */ + "\x6e\xcc\x8c\0" /* offset 515 */ + "\xca\xbc\x6e\0" /* offset 519 */ + "\x4f\xcc\x84\0" /* offset 523 */ + "\x6f\xcc\x84\0" /* offset 527 */ + "\x4f\xcc\x86\0" /* offset 531 */ + "\x6f\xcc\x86\0" /* offset 535 */ + "\x4f\xcc\x8b\0" /* offset 539 */ + "\x6f\xcc\x8b\0" /* offset 543 */ + "\x52\xcc\x81\0" /* offset 547 */ + "\x72\xcc\x81\0" /* offset 551 */ + "\x52\xcc\xa7\0" /* offset 555 */ + "\x72\xcc\xa7\0" /* offset 559 */ + "\x52\xcc\x8c\0" /* offset 563 */ + "\x72\xcc\x8c\0" /* offset 567 */ + "\x53\xcc\x81\0" /* offset 571 */ + "\x73\xcc\x81\0" /* offset 575 */ + "\x53\xcc\x82\0" /* offset 579 */ + "\x73\xcc\x82\0" /* offset 583 */ + "\x53\xcc\xa7\0" /* offset 587 */ + "\x73\xcc\xa7\0" /* offset 591 */ + "\x53\xcc\x8c\0" /* offset 595 */ + "\x73\xcc\x8c\0" /* offset 599 */ + "\x54\xcc\xa7\0" /* offset 603 */ + "\x74\xcc\xa7\0" /* offset 607 */ + "\x54\xcc\x8c\0" /* offset 611 */ + "\x74\xcc\x8c\0" /* offset 615 */ + "\x55\xcc\x83\0" /* offset 619 */ + "\x75\xcc\x83\0" /* offset 623 */ + "\x55\xcc\x84\0" /* offset 627 */ + "\x75\xcc\x84\0" /* offset 631 */ + "\x55\xcc\x86\0" /* offset 635 */ + "\x75\xcc\x86\0" /* offset 639 */ + "\x55\xcc\x8a\0" /* offset 643 */ + "\x75\xcc\x8a\0" /* offset 647 */ + "\x55\xcc\x8b\0" /* offset 651 */ + "\x75\xcc\x8b\0" /* offset 655 */ + "\x55\xcc\xa8\0" /* offset 659 */ + "\x75\xcc\xa8\0" /* offset 663 */ + "\x57\xcc\x82\0" /* offset 667 */ + "\x77\xcc\x82\0" /* offset 671 */ + "\x59\xcc\x82\0" /* offset 675 */ + "\x79\xcc\x82\0" /* offset 679 */ + "\x59\xcc\x88\0" /* offset 683 */ + "\x5a\xcc\x81\0" /* offset 687 */ + "\x7a\xcc\x81\0" /* offset 691 */ + "\x5a\xcc\x87\0" /* offset 695 */ + "\x7a\xcc\x87\0" /* offset 699 */ + "\x5a\xcc\x8c\0" /* offset 703 */ + "\x7a\xcc\x8c\0" /* offset 707 */ + "\x73\0" /* offset 711 */ + "\x4f\xcc\x9b\0" /* offset 713 */ + "\x6f\xcc\x9b\0" /* offset 717 */ + "\x55\xcc\x9b\0" /* offset 721 */ + "\x75\xcc\x9b\0" /* offset 725 */ + "\x44\x5a\xcc\x8c\0" /* offset 729 */ + "\x44\x7a\xcc\x8c\0" /* offset 734 */ + "\x64\x7a\xcc\x8c\0" /* offset 739 */ + "\x4c\x4a\0" /* offset 744 */ + "\x4c\x6a\0" /* offset 747 */ + "\x6c\x6a\0" /* offset 750 */ + "\x4e\x4a\0" /* offset 753 */ + "\x4e\x6a\0" /* offset 756 */ + "\x6e\x6a\0" /* offset 759 */ + "\x41\xcc\x8c\0" /* offset 762 */ + "\x61\xcc\x8c\0" /* offset 766 */ + "\x49\xcc\x8c\0" /* offset 770 */ + "\x69\xcc\x8c\0" /* offset 774 */ + "\x4f\xcc\x8c\0" /* offset 778 */ + "\x6f\xcc\x8c\0" /* offset 782 */ + "\x55\xcc\x8c\0" /* offset 786 */ + "\x75\xcc\x8c\0" /* offset 790 */ + "\x55\xcc\x88\xcc\x84\0" /* offset 794 */ + "\x75\xcc\x88\xcc\x84\0" /* offset 800 */ + "\x55\xcc\x88\xcc\x81\0" /* offset 806 */ + "\x75\xcc\x88\xcc\x81\0" /* offset 812 */ + "\x55\xcc\x88\xcc\x8c\0" /* offset 818 */ + "\x75\xcc\x88\xcc\x8c\0" /* offset 824 */ + "\x55\xcc\x88\xcc\x80\0" /* offset 830 */ + "\x75\xcc\x88\xcc\x80\0" /* offset 836 */ + "\x41\xcc\x88\xcc\x84\0" /* offset 842 */ + "\x61\xcc\x88\xcc\x84\0" /* offset 848 */ + "\x41\xcc\x87\xcc\x84\0" /* offset 854 */ + "\x61\xcc\x87\xcc\x84\0" /* offset 860 */ + "\xc3\x86\xcc\x84\0" /* offset 866 */ + "\xc3\xa6\xcc\x84\0" /* offset 871 */ + "\x47\xcc\x8c\0" /* offset 876 */ + "\x67\xcc\x8c\0" /* offset 880 */ + "\x4b\xcc\x8c\0" /* offset 884 */ + "\x6b\xcc\x8c\0" /* offset 888 */ + "\x4f\xcc\xa8\0" /* offset 892 */ + "\x6f\xcc\xa8\0" /* offset 896 */ + "\x4f\xcc\xa8\xcc\x84\0" /* offset 900 */ + "\x6f\xcc\xa8\xcc\x84\0" /* offset 906 */ + "\xc6\xb7\xcc\x8c\0" /* offset 912 */ + "\xca\x92\xcc\x8c\0" /* offset 917 */ + "\x6a\xcc\x8c\0" /* offset 922 */ + "\x44\x5a\0" /* offset 926 */ + "\x44\x7a\0" /* offset 929 */ + "\x64\x7a\0" /* offset 932 */ + "\x47\xcc\x81\0" /* offset 935 */ + "\x67\xcc\x81\0" /* offset 939 */ + "\x4e\xcc\x80\0" /* offset 943 */ + "\x6e\xcc\x80\0" /* offset 947 */ + "\x41\xcc\x8a\xcc\x81\0" /* offset 951 */ + "\x61\xcc\x8a\xcc\x81\0" /* offset 957 */ + "\xc3\x86\xcc\x81\0" /* offset 963 */ + "\xc3\xa6\xcc\x81\0" /* offset 968 */ + "\xc3\x98\xcc\x81\0" /* offset 973 */ + "\xc3\xb8\xcc\x81\0" /* offset 978 */ + "\x41\xcc\x8f\0" /* offset 983 */ + "\x61\xcc\x8f\0" /* offset 987 */ + "\x41\xcc\x91\0" /* offset 991 */ + "\x61\xcc\x91\0" /* offset 995 */ + "\x45\xcc\x8f\0" /* offset 999 */ + "\x65\xcc\x8f\0" /* offset 1003 */ + "\x45\xcc\x91\0" /* offset 1007 */ + "\x65\xcc\x91\0" /* offset 1011 */ + "\x49\xcc\x8f\0" /* offset 1015 */ + "\x69\xcc\x8f\0" /* offset 1019 */ + "\x49\xcc\x91\0" /* offset 1023 */ + "\x69\xcc\x91\0" /* offset 1027 */ + "\x4f\xcc\x8f\0" /* offset 1031 */ + "\x6f\xcc\x8f\0" /* offset 1035 */ + "\x4f\xcc\x91\0" /* offset 1039 */ + "\x6f\xcc\x91\0" /* offset 1043 */ + "\x52\xcc\x8f\0" /* offset 1047 */ + "\x72\xcc\x8f\0" /* offset 1051 */ + "\x52\xcc\x91\0" /* offset 1055 */ + "\x72\xcc\x91\0" /* offset 1059 */ + "\x55\xcc\x8f\0" /* offset 1063 */ + "\x75\xcc\x8f\0" /* offset 1067 */ + "\x55\xcc\x91\0" /* offset 1071 */ + "\x75\xcc\x91\0" /* offset 1075 */ + "\x53\xcc\xa6\0" /* offset 1079 */ + "\x73\xcc\xa6\0" /* offset 1083 */ + "\x54\xcc\xa6\0" /* offset 1087 */ + "\x74\xcc\xa6\0" /* offset 1091 */ + "\x48\xcc\x8c\0" /* offset 1095 */ + "\x68\xcc\x8c\0" /* offset 1099 */ + "\x41\xcc\x87\0" /* offset 1103 */ + "\x61\xcc\x87\0" /* offset 1107 */ + "\x45\xcc\xa7\0" /* offset 1111 */ + "\x65\xcc\xa7\0" /* offset 1115 */ + "\x4f\xcc\x88\xcc\x84\0" /* offset 1119 */ + "\x6f\xcc\x88\xcc\x84\0" /* offset 1125 */ + "\x4f\xcc\x83\xcc\x84\0" /* offset 1131 */ + "\x6f\xcc\x83\xcc\x84\0" /* offset 1137 */ + "\x4f\xcc\x87\0" /* offset 1143 */ + "\x6f\xcc\x87\0" /* offset 1147 */ + "\x4f\xcc\x87\xcc\x84\0" /* offset 1151 */ + "\x6f\xcc\x87\xcc\x84\0" /* offset 1157 */ + "\x59\xcc\x84\0" /* offset 1163 */ + "\x79\xcc\x84\0" /* offset 1167 */ + "\x68\0" /* offset 1171 */ + "\xc9\xa6\0" /* offset 1173 */ + "\x6a\0" /* offset 1176 */ + "\x72\0" /* offset 1178 */ + "\xc9\xb9\0" /* offset 1180 */ + "\xc9\xbb\0" /* offset 1183 */ + "\xca\x81\0" /* offset 1186 */ + "\x77\0" /* offset 1189 */ + "\x79\0" /* offset 1191 */ + "\x20\xcc\x86\0" /* offset 1193 */ + "\x20\xcc\x87\0" /* offset 1197 */ + "\x20\xcc\x8a\0" /* offset 1201 */ + "\x20\xcc\xa8\0" /* offset 1205 */ + "\x20\xcc\x83\0" /* offset 1209 */ + "\x20\xcc\x8b\0" /* offset 1213 */ + "\xc9\xa3\0" /* offset 1217 */ + "\x6c\0" /* offset 1220 */ + "\x78\0" /* offset 1222 */ + "\xca\x95\0" /* offset 1224 */ + "\xcc\x80\0" /* offset 1227 */ + "\xcc\x81\0" /* offset 1230 */ + "\xcc\x93\0" /* offset 1233 */ + "\xcc\x88\xcc\x81\0" /* offset 1236 */ + "\xca\xb9\0" /* offset 1241 */ + "\x20\xcd\x85\0" /* offset 1244 */ + "\x3b\0" /* offset 1248 */ + "\xc2\xa8\xcc\x81\0" /* offset 1250 */ + "\x20\xcc\x88\xcc\x81\0" /* offset 1255 */ + "\xce\x91\xcc\x81\0" /* offset 1261 */ + "\xc2\xb7\0" /* offset 1266 */ + "\xce\x95\xcc\x81\0" /* offset 1269 */ + "\xce\x97\xcc\x81\0" /* offset 1274 */ + "\xce\x99\xcc\x81\0" /* offset 1279 */ + "\xce\x9f\xcc\x81\0" /* offset 1284 */ + "\xce\xa5\xcc\x81\0" /* offset 1289 */ + "\xce\xa9\xcc\x81\0" /* offset 1294 */ + "\xce\xb9\xcc\x88\xcc\x81\0" /* offset 1299 */ + "\xce\x99\xcc\x88\0" /* offset 1306 */ + "\xce\xa5\xcc\x88\0" /* offset 1311 */ + "\xce\xb1\xcc\x81\0" /* offset 1316 */ + "\xce\xb5\xcc\x81\0" /* offset 1321 */ + "\xce\xb7\xcc\x81\0" /* offset 1326 */ + "\xce\xb9\xcc\x81\0" /* offset 1331 */ + "\xcf\x85\xcc\x88\xcc\x81\0" /* offset 1336 */ + "\xce\xb9\xcc\x88\0" /* offset 1343 */ + "\xcf\x85\xcc\x88\0" /* offset 1348 */ + "\xce\xbf\xcc\x81\0" /* offset 1353 */ + "\xcf\x85\xcc\x81\0" /* offset 1358 */ + "\xcf\x89\xcc\x81\0" /* offset 1363 */ + "\xce\xb2\0" /* offset 1368 */ + "\xce\xb8\0" /* offset 1371 */ + "\xce\xa5\0" /* offset 1374 */ + "\xcf\x92\xcc\x81\0" /* offset 1377 */ + "\xcf\x92\xcc\x88\0" /* offset 1382 */ + "\xcf\x86\0" /* offset 1387 */ + "\xcf\x80\0" /* offset 1390 */ + "\xce\xba\0" /* offset 1393 */ + "\xcf\x81\0" /* offset 1396 */ + "\xcf\x82\0" /* offset 1399 */ + "\xce\x98\0" /* offset 1402 */ + "\xce\xb5\0" /* offset 1405 */ + "\xce\xa3\0" /* offset 1408 */ + "\xd0\x95\xcc\x80\0" /* offset 1411 */ + "\xd0\x95\xcc\x88\0" /* offset 1416 */ + "\xd0\x93\xcc\x81\0" /* offset 1421 */ + "\xd0\x86\xcc\x88\0" /* offset 1426 */ + "\xd0\x9a\xcc\x81\0" /* offset 1431 */ + "\xd0\x98\xcc\x80\0" /* offset 1436 */ + "\xd0\xa3\xcc\x86\0" /* offset 1441 */ + "\xd0\x98\xcc\x86\0" /* offset 1446 */ + "\xd0\xb8\xcc\x86\0" /* offset 1451 */ + "\xd0\xb5\xcc\x80\0" /* offset 1456 */ + "\xd0\xb5\xcc\x88\0" /* offset 1461 */ + "\xd0\xb3\xcc\x81\0" /* offset 1466 */ + "\xd1\x96\xcc\x88\0" /* offset 1471 */ + "\xd0\xba\xcc\x81\0" /* offset 1476 */ + "\xd0\xb8\xcc\x80\0" /* offset 1481 */ + "\xd1\x83\xcc\x86\0" /* offset 1486 */ + "\xd1\xb4\xcc\x8f\0" /* offset 1491 */ + "\xd1\xb5\xcc\x8f\0" /* offset 1496 */ + "\xd0\x96\xcc\x86\0" /* offset 1501 */ + "\xd0\xb6\xcc\x86\0" /* offset 1506 */ + "\xd0\x90\xcc\x86\0" /* offset 1511 */ + "\xd0\xb0\xcc\x86\0" /* offset 1516 */ + "\xd0\x90\xcc\x88\0" /* offset 1521 */ + "\xd0\xb0\xcc\x88\0" /* offset 1526 */ + "\xd0\x95\xcc\x86\0" /* offset 1531 */ + "\xd0\xb5\xcc\x86\0" /* offset 1536 */ + "\xd3\x98\xcc\x88\0" /* offset 1541 */ + "\xd3\x99\xcc\x88\0" /* offset 1546 */ + "\xd0\x96\xcc\x88\0" /* offset 1551 */ + "\xd0\xb6\xcc\x88\0" /* offset 1556 */ + "\xd0\x97\xcc\x88\0" /* offset 1561 */ + "\xd0\xb7\xcc\x88\0" /* offset 1566 */ + "\xd0\x98\xcc\x84\0" /* offset 1571 */ + "\xd0\xb8\xcc\x84\0" /* offset 1576 */ + "\xd0\x98\xcc\x88\0" /* offset 1581 */ + "\xd0\xb8\xcc\x88\0" /* offset 1586 */ + "\xd0\x9e\xcc\x88\0" /* offset 1591 */ + "\xd0\xbe\xcc\x88\0" /* offset 1596 */ + "\xd3\xa8\xcc\x88\0" /* offset 1601 */ + "\xd3\xa9\xcc\x88\0" /* offset 1606 */ + "\xd0\xad\xcc\x88\0" /* offset 1611 */ + "\xd1\x8d\xcc\x88\0" /* offset 1616 */ + "\xd0\xa3\xcc\x84\0" /* offset 1621 */ + "\xd1\x83\xcc\x84\0" /* offset 1626 */ + "\xd0\xa3\xcc\x88\0" /* offset 1631 */ + "\xd1\x83\xcc\x88\0" /* offset 1636 */ + "\xd0\xa3\xcc\x8b\0" /* offset 1641 */ + "\xd1\x83\xcc\x8b\0" /* offset 1646 */ + "\xd0\xa7\xcc\x88\0" /* offset 1651 */ + "\xd1\x87\xcc\x88\0" /* offset 1656 */ + "\xd0\xab\xcc\x88\0" /* offset 1661 */ + "\xd1\x8b\xcc\x88\0" /* offset 1666 */ + "\xd5\xa5\xd6\x82\0" /* offset 1671 */ + "\xd8\xa7\xd9\x93\0" /* offset 1676 */ + "\xd8\xa7\xd9\x94\0" /* offset 1681 */ + "\xd9\x88\xd9\x94\0" /* offset 1686 */ + "\xd8\xa7\xd9\x95\0" /* offset 1691 */ + "\xd9\x8a\xd9\x94\0" /* offset 1696 */ + "\xd8\xa7\xd9\xb4\0" /* offset 1701 */ + "\xd9\x88\xd9\xb4\0" /* offset 1706 */ + "\xdb\x87\xd9\xb4\0" /* offset 1711 */ + "\xd9\x8a\xd9\xb4\0" /* offset 1716 */ + "\xdb\x95\xd9\x94\0" /* offset 1721 */ + "\xdb\x81\xd9\x94\0" /* offset 1726 */ + "\xdb\x92\xd9\x94\0" /* offset 1731 */ + "\xe0\xa4\xa8\xe0\xa4\xbc\0" /* offset 1736 */ + "\xe0\xa4\xb0\xe0\xa4\xbc\0" /* offset 1743 */ + "\xe0\xa4\xb3\xe0\xa4\xbc\0" /* offset 1750 */ + "\xe0\xa4\x95\xe0\xa4\xbc\0" /* offset 1757 */ + "\xe0\xa4\x96\xe0\xa4\xbc\0" /* offset 1764 */ + "\xe0\xa4\x97\xe0\xa4\xbc\0" /* offset 1771 */ + "\xe0\xa4\x9c\xe0\xa4\xbc\0" /* offset 1778 */ + "\xe0\xa4\xa1\xe0\xa4\xbc\0" /* offset 1785 */ + "\xe0\xa4\xa2\xe0\xa4\xbc\0" /* offset 1792 */ + "\xe0\xa4\xab\xe0\xa4\xbc\0" /* offset 1799 */ + "\xe0\xa4\xaf\xe0\xa4\xbc\0" /* offset 1806 */ + "\xe0\xa7\x87\xe0\xa6\xbe\0" /* offset 1813 */ + "\xe0\xa7\x87\xe0\xa7\x97\0" /* offset 1820 */ + "\xe0\xa6\xa1\xe0\xa6\xbc\0" /* offset 1827 */ + "\xe0\xa6\xa2\xe0\xa6\xbc\0" /* offset 1834 */ + "\xe0\xa6\xaf\xe0\xa6\xbc\0" /* offset 1841 */ + "\xe0\xa8\xb2\xe0\xa8\xbc\0" /* offset 1848 */ + "\xe0\xa8\xb8\xe0\xa8\xbc\0" /* offset 1855 */ + "\xe0\xa8\x96\xe0\xa8\xbc\0" /* offset 1862 */ + "\xe0\xa8\x97\xe0\xa8\xbc\0" /* offset 1869 */ + "\xe0\xa8\x9c\xe0\xa8\xbc\0" /* offset 1876 */ + "\xe0\xa8\xab\xe0\xa8\xbc\0" /* offset 1883 */ + "\xe0\xad\x87\xe0\xad\x96\0" /* offset 1890 */ + "\xe0\xad\x87\xe0\xac\xbe\0" /* offset 1897 */ + "\xe0\xad\x87\xe0\xad\x97\0" /* offset 1904 */ + "\xe0\xac\xa1\xe0\xac\xbc\0" /* offset 1911 */ + "\xe0\xac\xa2\xe0\xac\xbc\0" /* offset 1918 */ + "\xe0\xae\x92\xe0\xaf\x97\0" /* offset 1925 */ + "\xe0\xaf\x86\xe0\xae\xbe\0" /* offset 1932 */ + "\xe0\xaf\x87\xe0\xae\xbe\0" /* offset 1939 */ + "\xe0\xaf\x86\xe0\xaf\x97\0" /* offset 1946 */ + "\xe0\xb1\x86\xe0\xb1\x96\0" /* offset 1953 */ + "\xe0\xb2\xbf\xe0\xb3\x95\0" /* offset 1960 */ + "\xe0\xb3\x86\xe0\xb3\x95\0" /* offset 1967 */ + "\xe0\xb3\x86\xe0\xb3\x96\0" /* offset 1974 */ + "\xe0\xb3\x86\xe0\xb3\x82\0" /* offset 1981 */ + "\xe0\xb3\x86\xe0\xb3\x82\xe0\xb3\x95\0" /* offset 1988 */ + "\xe0\xb5\x86\xe0\xb4\xbe\0" /* offset 1998 */ + "\xe0\xb5\x87\xe0\xb4\xbe\0" /* offset 2005 */ + "\xe0\xb5\x86\xe0\xb5\x97\0" /* offset 2012 */ + "\xe0\xb7\x99\xe0\xb7\x8a\0" /* offset 2019 */ + "\xe0\xb7\x99\xe0\xb7\x8f\0" /* offset 2026 */ + "\xe0\xb7\x99\xe0\xb7\x8f\xe0\xb7\x8a\0" /* offset 2033 */ + "\xe0\xb7\x99\xe0\xb7\x9f\0" /* offset 2043 */ + "\xe0\xb9\x8d\xe0\xb8\xb2\0" /* offset 2050 */ + "\xe0\xbb\x8d\xe0\xba\xb2\0" /* offset 2057 */ + "\xe0\xba\xab\xe0\xba\x99\0" /* offset 2064 */ + "\xe0\xba\xab\xe0\xba\xa1\0" /* offset 2071 */ + "\xe0\xbc\x8b\0" /* offset 2078 */ + "\xe0\xbd\x82\xe0\xbe\xb7\0" /* offset 2082 */ + "\xe0\xbd\x8c\xe0\xbe\xb7\0" /* offset 2089 */ + "\xe0\xbd\x91\xe0\xbe\xb7\0" /* offset 2096 */ + "\xe0\xbd\x96\xe0\xbe\xb7\0" /* offset 2103 */ + "\xe0\xbd\x9b\xe0\xbe\xb7\0" /* offset 2110 */ + "\xe0\xbd\x80\xe0\xbe\xb5\0" /* offset 2117 */ + "\xe0\xbd\xb1\xe0\xbd\xb2\0" /* offset 2124 */ + "\xe0\xbd\xb1\xe0\xbd\xb4\0" /* offset 2131 */ + "\xe0\xbe\xb2\xe0\xbe\x80\0" /* offset 2138 */ + "\xe0\xbe\xb2\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2145 */ + "\xe0\xbe\xb3\xe0\xbe\x80\0" /* offset 2155 */ + "\xe0\xbe\xb3\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2162 */ + "\xe0\xbd\xb1\xe0\xbe\x80\0" /* offset 2172 */ + "\xe0\xbe\x92\xe0\xbe\xb7\0" /* offset 2179 */ + "\xe0\xbe\x9c\xe0\xbe\xb7\0" /* offset 2186 */ + "\xe0\xbe\xa1\xe0\xbe\xb7\0" /* offset 2193 */ + "\xe0\xbe\xa6\xe0\xbe\xb7\0" /* offset 2200 */ + "\xe0\xbe\xab\xe0\xbe\xb7\0" /* offset 2207 */ + "\xe0\xbe\x90\xe0\xbe\xb5\0" /* offset 2214 */ + "\xe1\x80\xa5\xe1\x80\xae\0" /* offset 2221 */ + "\xe1\x83\x9c\0" /* offset 2228 */ + "\xe1\xac\x85\xe1\xac\xb5\0" /* offset 2232 */ + "\xe1\xac\x87\xe1\xac\xb5\0" /* offset 2239 */ + "\xe1\xac\x89\xe1\xac\xb5\0" /* offset 2246 */ + "\xe1\xac\x8b\xe1\xac\xb5\0" /* offset 2253 */ + "\xe1\xac\x8d\xe1\xac\xb5\0" /* offset 2260 */ + "\xe1\xac\x91\xe1\xac\xb5\0" /* offset 2267 */ + "\xe1\xac\xba\xe1\xac\xb5\0" /* offset 2274 */ + "\xe1\xac\xbc\xe1\xac\xb5\0" /* offset 2281 */ + "\xe1\xac\xbe\xe1\xac\xb5\0" /* offset 2288 */ + "\xe1\xac\xbf\xe1\xac\xb5\0" /* offset 2295 */ + "\xe1\xad\x82\xe1\xac\xb5\0" /* offset 2302 */ + "\x41\0" /* offset 2309 */ + "\xc3\x86\0" /* offset 2311 */ + "\x42\0" /* offset 2314 */ + "\x44\0" /* offset 2316 */ + "\x45\0" /* offset 2318 */ + "\xc6\x8e\0" /* offset 2320 */ + "\x47\0" /* offset 2323 */ + "\x48\0" /* offset 2325 */ + "\x49\0" /* offset 2327 */ + "\x4a\0" /* offset 2329 */ + "\x4b\0" /* offset 2331 */ + "\x4c\0" /* offset 2333 */ + "\x4d\0" /* offset 2335 */ + "\x4e\0" /* offset 2337 */ + "\x4f\0" /* offset 2339 */ + "\xc8\xa2\0" /* offset 2341 */ + "\x50\0" /* offset 2344 */ + "\x52\0" /* offset 2346 */ + "\x54\0" /* offset 2348 */ + "\x55\0" /* offset 2350 */ + "\x57\0" /* offset 2352 */ + "\xc9\x90\0" /* offset 2354 */ + "\xc9\x91\0" /* offset 2357 */ + "\xe1\xb4\x82\0" /* offset 2360 */ + "\x62\0" /* offset 2364 */ + "\x64\0" /* offset 2366 */ + "\x65\0" /* offset 2368 */ + "\xc9\x99\0" /* offset 2370 */ + "\xc9\x9b\0" /* offset 2373 */ + "\xc9\x9c\0" /* offset 2376 */ + "\x67\0" /* offset 2379 */ + "\x6b\0" /* offset 2381 */ + "\x6d\0" /* offset 2383 */ + "\xc5\x8b\0" /* offset 2385 */ + "\xc9\x94\0" /* offset 2388 */ + "\xe1\xb4\x96\0" /* offset 2391 */ + "\xe1\xb4\x97\0" /* offset 2395 */ + "\x70\0" /* offset 2399 */ + "\x74\0" /* offset 2401 */ + "\x75\0" /* offset 2403 */ + "\xe1\xb4\x9d\0" /* offset 2405 */ + "\xc9\xaf\0" /* offset 2409 */ + "\x76\0" /* offset 2412 */ + "\xe1\xb4\xa5\0" /* offset 2414 */ + "\xce\xb3\0" /* offset 2418 */ + "\xce\xb4\0" /* offset 2421 */ + "\xcf\x87\0" /* offset 2424 */ + "\x69\0" /* offset 2427 */ + "\xd0\xbd\0" /* offset 2429 */ + "\xc9\x92\0" /* offset 2432 */ + "\x63\0" /* offset 2435 */ + "\xc9\x95\0" /* offset 2437 */ + "\xc3\xb0\0" /* offset 2440 */ + "\x66\0" /* offset 2443 */ + "\xc9\x9f\0" /* offset 2445 */ + "\xc9\xa1\0" /* offset 2448 */ + "\xc9\xa5\0" /* offset 2451 */ + "\xc9\xa8\0" /* offset 2454 */ + "\xc9\xa9\0" /* offset 2457 */ + "\xc9\xaa\0" /* offset 2460 */ + "\xe1\xb5\xbb\0" /* offset 2463 */ + "\xca\x9d\0" /* offset 2467 */ + "\xc9\xad\0" /* offset 2470 */ + "\xe1\xb6\x85\0" /* offset 2473 */ + "\xca\x9f\0" /* offset 2477 */ + "\xc9\xb1\0" /* offset 2480 */ + "\xc9\xb0\0" /* offset 2483 */ + "\xc9\xb2\0" /* offset 2486 */ + "\xc9\xb3\0" /* offset 2489 */ + "\xc9\xb4\0" /* offset 2492 */ + "\xc9\xb5\0" /* offset 2495 */ + "\xc9\xb8\0" /* offset 2498 */ + "\xca\x82\0" /* offset 2501 */ + "\xca\x83\0" /* offset 2504 */ + "\xc6\xab\0" /* offset 2507 */ + "\xca\x89\0" /* offset 2510 */ + "\xca\x8a\0" /* offset 2513 */ + "\xe1\xb4\x9c\0" /* offset 2516 */ + "\xca\x8b\0" /* offset 2520 */ + "\xca\x8c\0" /* offset 2523 */ + "\x7a\0" /* offset 2526 */ + "\xca\x90\0" /* offset 2528 */ + "\xca\x91\0" /* offset 2531 */ + "\xca\x92\0" /* offset 2534 */ + "\x41\xcc\xa5\0" /* offset 2537 */ + "\x61\xcc\xa5\0" /* offset 2541 */ + "\x42\xcc\x87\0" /* offset 2545 */ + "\x62\xcc\x87\0" /* offset 2549 */ + "\x42\xcc\xa3\0" /* offset 2553 */ + "\x62\xcc\xa3\0" /* offset 2557 */ + "\x42\xcc\xb1\0" /* offset 2561 */ + "\x62\xcc\xb1\0" /* offset 2565 */ + "\x43\xcc\xa7\xcc\x81\0" /* offset 2569 */ + "\x63\xcc\xa7\xcc\x81\0" /* offset 2575 */ + "\x44\xcc\x87\0" /* offset 2581 */ + "\x64\xcc\x87\0" /* offset 2585 */ + "\x44\xcc\xa3\0" /* offset 2589 */ + "\x64\xcc\xa3\0" /* offset 2593 */ + "\x44\xcc\xb1\0" /* offset 2597 */ + "\x64\xcc\xb1\0" /* offset 2601 */ + "\x44\xcc\xa7\0" /* offset 2605 */ + "\x64\xcc\xa7\0" /* offset 2609 */ + "\x44\xcc\xad\0" /* offset 2613 */ + "\x64\xcc\xad\0" /* offset 2617 */ + "\x45\xcc\x84\xcc\x80\0" /* offset 2621 */ + "\x65\xcc\x84\xcc\x80\0" /* offset 2627 */ + "\x45\xcc\x84\xcc\x81\0" /* offset 2633 */ + "\x65\xcc\x84\xcc\x81\0" /* offset 2639 */ + "\x45\xcc\xad\0" /* offset 2645 */ + "\x65\xcc\xad\0" /* offset 2649 */ + "\x45\xcc\xb0\0" /* offset 2653 */ + "\x65\xcc\xb0\0" /* offset 2657 */ + "\x45\xcc\xa7\xcc\x86\0" /* offset 2661 */ + "\x65\xcc\xa7\xcc\x86\0" /* offset 2667 */ + "\x46\xcc\x87\0" /* offset 2673 */ + "\x66\xcc\x87\0" /* offset 2677 */ + "\x47\xcc\x84\0" /* offset 2681 */ + "\x67\xcc\x84\0" /* offset 2685 */ + "\x48\xcc\x87\0" /* offset 2689 */ + "\x68\xcc\x87\0" /* offset 2693 */ + "\x48\xcc\xa3\0" /* offset 2697 */ + "\x68\xcc\xa3\0" /* offset 2701 */ + "\x48\xcc\x88\0" /* offset 2705 */ + "\x68\xcc\x88\0" /* offset 2709 */ + "\x48\xcc\xa7\0" /* offset 2713 */ + "\x68\xcc\xa7\0" /* offset 2717 */ + "\x48\xcc\xae\0" /* offset 2721 */ + "\x68\xcc\xae\0" /* offset 2725 */ + "\x49\xcc\xb0\0" /* offset 2729 */ + "\x69\xcc\xb0\0" /* offset 2733 */ + "\x49\xcc\x88\xcc\x81\0" /* offset 2737 */ + "\x69\xcc\x88\xcc\x81\0" /* offset 2743 */ + "\x4b\xcc\x81\0" /* offset 2749 */ + "\x6b\xcc\x81\0" /* offset 2753 */ + "\x4b\xcc\xa3\0" /* offset 2757 */ + "\x6b\xcc\xa3\0" /* offset 2761 */ + "\x4b\xcc\xb1\0" /* offset 2765 */ + "\x6b\xcc\xb1\0" /* offset 2769 */ + "\x4c\xcc\xa3\0" /* offset 2773 */ + "\x6c\xcc\xa3\0" /* offset 2777 */ + "\x4c\xcc\xa3\xcc\x84\0" /* offset 2781 */ + "\x6c\xcc\xa3\xcc\x84\0" /* offset 2787 */ + "\x4c\xcc\xb1\0" /* offset 2793 */ + "\x6c\xcc\xb1\0" /* offset 2797 */ + "\x4c\xcc\xad\0" /* offset 2801 */ + "\x6c\xcc\xad\0" /* offset 2805 */ + "\x4d\xcc\x81\0" /* offset 2809 */ + "\x6d\xcc\x81\0" /* offset 2813 */ + "\x4d\xcc\x87\0" /* offset 2817 */ + "\x6d\xcc\x87\0" /* offset 2821 */ + "\x4d\xcc\xa3\0" /* offset 2825 */ + "\x6d\xcc\xa3\0" /* offset 2829 */ + "\x4e\xcc\x87\0" /* offset 2833 */ + "\x6e\xcc\x87\0" /* offset 2837 */ + "\x4e\xcc\xa3\0" /* offset 2841 */ + "\x6e\xcc\xa3\0" /* offset 2845 */ + "\x4e\xcc\xb1\0" /* offset 2849 */ + "\x6e\xcc\xb1\0" /* offset 2853 */ + "\x4e\xcc\xad\0" /* offset 2857 */ + "\x6e\xcc\xad\0" /* offset 2861 */ + "\x4f\xcc\x83\xcc\x81\0" /* offset 2865 */ + "\x6f\xcc\x83\xcc\x81\0" /* offset 2871 */ + "\x4f\xcc\x83\xcc\x88\0" /* offset 2877 */ + "\x6f\xcc\x83\xcc\x88\0" /* offset 2883 */ + "\x4f\xcc\x84\xcc\x80\0" /* offset 2889 */ + "\x6f\xcc\x84\xcc\x80\0" /* offset 2895 */ + "\x4f\xcc\x84\xcc\x81\0" /* offset 2901 */ + "\x6f\xcc\x84\xcc\x81\0" /* offset 2907 */ + "\x50\xcc\x81\0" /* offset 2913 */ + "\x70\xcc\x81\0" /* offset 2917 */ + "\x50\xcc\x87\0" /* offset 2921 */ + "\x70\xcc\x87\0" /* offset 2925 */ + "\x52\xcc\x87\0" /* offset 2929 */ + "\x72\xcc\x87\0" /* offset 2933 */ + "\x52\xcc\xa3\0" /* offset 2937 */ + "\x72\xcc\xa3\0" /* offset 2941 */ + "\x52\xcc\xa3\xcc\x84\0" /* offset 2945 */ + "\x72\xcc\xa3\xcc\x84\0" /* offset 2951 */ + "\x52\xcc\xb1\0" /* offset 2957 */ + "\x72\xcc\xb1\0" /* offset 2961 */ + "\x53\xcc\x87\0" /* offset 2965 */ + "\x73\xcc\x87\0" /* offset 2969 */ + "\x53\xcc\xa3\0" /* offset 2973 */ + "\x73\xcc\xa3\0" /* offset 2977 */ + "\x53\xcc\x81\xcc\x87\0" /* offset 2981 */ + "\x73\xcc\x81\xcc\x87\0" /* offset 2987 */ + "\x53\xcc\x8c\xcc\x87\0" /* offset 2993 */ + "\x73\xcc\x8c\xcc\x87\0" /* offset 2999 */ + "\x53\xcc\xa3\xcc\x87\0" /* offset 3005 */ + "\x73\xcc\xa3\xcc\x87\0" /* offset 3011 */ + "\x54\xcc\x87\0" /* offset 3017 */ + "\x74\xcc\x87\0" /* offset 3021 */ + "\x54\xcc\xa3\0" /* offset 3025 */ + "\x74\xcc\xa3\0" /* offset 3029 */ + "\x54\xcc\xb1\0" /* offset 3033 */ + "\x74\xcc\xb1\0" /* offset 3037 */ + "\x54\xcc\xad\0" /* offset 3041 */ + "\x74\xcc\xad\0" /* offset 3045 */ + "\x55\xcc\xa4\0" /* offset 3049 */ + "\x75\xcc\xa4\0" /* offset 3053 */ + "\x55\xcc\xb0\0" /* offset 3057 */ + "\x75\xcc\xb0\0" /* offset 3061 */ + "\x55\xcc\xad\0" /* offset 3065 */ + "\x75\xcc\xad\0" /* offset 3069 */ + "\x55\xcc\x83\xcc\x81\0" /* offset 3073 */ + "\x75\xcc\x83\xcc\x81\0" /* offset 3079 */ + "\x55\xcc\x84\xcc\x88\0" /* offset 3085 */ + "\x75\xcc\x84\xcc\x88\0" /* offset 3091 */ + "\x56\xcc\x83\0" /* offset 3097 */ + "\x76\xcc\x83\0" /* offset 3101 */ + "\x56\xcc\xa3\0" /* offset 3105 */ + "\x76\xcc\xa3\0" /* offset 3109 */ + "\x57\xcc\x80\0" /* offset 3113 */ + "\x77\xcc\x80\0" /* offset 3117 */ + "\x57\xcc\x81\0" /* offset 3121 */ + "\x77\xcc\x81\0" /* offset 3125 */ + "\x57\xcc\x88\0" /* offset 3129 */ + "\x77\xcc\x88\0" /* offset 3133 */ + "\x57\xcc\x87\0" /* offset 3137 */ + "\x77\xcc\x87\0" /* offset 3141 */ + "\x57\xcc\xa3\0" /* offset 3145 */ + "\x77\xcc\xa3\0" /* offset 3149 */ + "\x58\xcc\x87\0" /* offset 3153 */ + "\x78\xcc\x87\0" /* offset 3157 */ + "\x58\xcc\x88\0" /* offset 3161 */ + "\x78\xcc\x88\0" /* offset 3165 */ + "\x59\xcc\x87\0" /* offset 3169 */ + "\x79\xcc\x87\0" /* offset 3173 */ + "\x5a\xcc\x82\0" /* offset 3177 */ + "\x7a\xcc\x82\0" /* offset 3181 */ + "\x5a\xcc\xa3\0" /* offset 3185 */ + "\x7a\xcc\xa3\0" /* offset 3189 */ + "\x5a\xcc\xb1\0" /* offset 3193 */ + "\x7a\xcc\xb1\0" /* offset 3197 */ + "\x68\xcc\xb1\0" /* offset 3201 */ + "\x74\xcc\x88\0" /* offset 3205 */ + "\x77\xcc\x8a\0" /* offset 3209 */ + "\x79\xcc\x8a\0" /* offset 3213 */ + "\x61\xca\xbe\0" /* offset 3217 */ + "\xc5\xbf\xcc\x87\0" /* offset 3221 */ + "\x41\xcc\xa3\0" /* offset 3226 */ + "\x61\xcc\xa3\0" /* offset 3230 */ + "\x41\xcc\x89\0" /* offset 3234 */ + "\x61\xcc\x89\0" /* offset 3238 */ + "\x41\xcc\x82\xcc\x81\0" /* offset 3242 */ + "\x61\xcc\x82\xcc\x81\0" /* offset 3248 */ + "\x41\xcc\x82\xcc\x80\0" /* offset 3254 */ + "\x61\xcc\x82\xcc\x80\0" /* offset 3260 */ + "\x41\xcc\x82\xcc\x89\0" /* offset 3266 */ + "\x61\xcc\x82\xcc\x89\0" /* offset 3272 */ + "\x41\xcc\x82\xcc\x83\0" /* offset 3278 */ + "\x61\xcc\x82\xcc\x83\0" /* offset 3284 */ + "\x41\xcc\xa3\xcc\x82\0" /* offset 3290 */ + "\x61\xcc\xa3\xcc\x82\0" /* offset 3296 */ + "\x41\xcc\x86\xcc\x81\0" /* offset 3302 */ + "\x61\xcc\x86\xcc\x81\0" /* offset 3308 */ + "\x41\xcc\x86\xcc\x80\0" /* offset 3314 */ + "\x61\xcc\x86\xcc\x80\0" /* offset 3320 */ + "\x41\xcc\x86\xcc\x89\0" /* offset 3326 */ + "\x61\xcc\x86\xcc\x89\0" /* offset 3332 */ + "\x41\xcc\x86\xcc\x83\0" /* offset 3338 */ + "\x61\xcc\x86\xcc\x83\0" /* offset 3344 */ + "\x41\xcc\xa3\xcc\x86\0" /* offset 3350 */ + "\x61\xcc\xa3\xcc\x86\0" /* offset 3356 */ + "\x45\xcc\xa3\0" /* offset 3362 */ + "\x65\xcc\xa3\0" /* offset 3366 */ + "\x45\xcc\x89\0" /* offset 3370 */ + "\x65\xcc\x89\0" /* offset 3374 */ + "\x45\xcc\x83\0" /* offset 3378 */ + "\x65\xcc\x83\0" /* offset 3382 */ + "\x45\xcc\x82\xcc\x81\0" /* offset 3386 */ + "\x65\xcc\x82\xcc\x81\0" /* offset 3392 */ + "\x45\xcc\x82\xcc\x80\0" /* offset 3398 */ + "\x65\xcc\x82\xcc\x80\0" /* offset 3404 */ + "\x45\xcc\x82\xcc\x89\0" /* offset 3410 */ + "\x65\xcc\x82\xcc\x89\0" /* offset 3416 */ + "\x45\xcc\x82\xcc\x83\0" /* offset 3422 */ + "\x65\xcc\x82\xcc\x83\0" /* offset 3428 */ + "\x45\xcc\xa3\xcc\x82\0" /* offset 3434 */ + "\x65\xcc\xa3\xcc\x82\0" /* offset 3440 */ + "\x49\xcc\x89\0" /* offset 3446 */ + "\x69\xcc\x89\0" /* offset 3450 */ + "\x49\xcc\xa3\0" /* offset 3454 */ + "\x69\xcc\xa3\0" /* offset 3458 */ + "\x4f\xcc\xa3\0" /* offset 3462 */ + "\x6f\xcc\xa3\0" /* offset 3466 */ + "\x4f\xcc\x89\0" /* offset 3470 */ + "\x6f\xcc\x89\0" /* offset 3474 */ + "\x4f\xcc\x82\xcc\x81\0" /* offset 3478 */ + "\x6f\xcc\x82\xcc\x81\0" /* offset 3484 */ + "\x4f\xcc\x82\xcc\x80\0" /* offset 3490 */ + "\x6f\xcc\x82\xcc\x80\0" /* offset 3496 */ + "\x4f\xcc\x82\xcc\x89\0" /* offset 3502 */ + "\x6f\xcc\x82\xcc\x89\0" /* offset 3508 */ + "\x4f\xcc\x82\xcc\x83\0" /* offset 3514 */ + "\x6f\xcc\x82\xcc\x83\0" /* offset 3520 */ + "\x4f\xcc\xa3\xcc\x82\0" /* offset 3526 */ + "\x6f\xcc\xa3\xcc\x82\0" /* offset 3532 */ + "\x4f\xcc\x9b\xcc\x81\0" /* offset 3538 */ + "\x6f\xcc\x9b\xcc\x81\0" /* offset 3544 */ + "\x4f\xcc\x9b\xcc\x80\0" /* offset 3550 */ + "\x6f\xcc\x9b\xcc\x80\0" /* offset 3556 */ + "\x4f\xcc\x9b\xcc\x89\0" /* offset 3562 */ + "\x6f\xcc\x9b\xcc\x89\0" /* offset 3568 */ + "\x4f\xcc\x9b\xcc\x83\0" /* offset 3574 */ + "\x6f\xcc\x9b\xcc\x83\0" /* offset 3580 */ + "\x4f\xcc\x9b\xcc\xa3\0" /* offset 3586 */ + "\x6f\xcc\x9b\xcc\xa3\0" /* offset 3592 */ + "\x55\xcc\xa3\0" /* offset 3598 */ + "\x75\xcc\xa3\0" /* offset 3602 */ + "\x55\xcc\x89\0" /* offset 3606 */ + "\x75\xcc\x89\0" /* offset 3610 */ + "\x55\xcc\x9b\xcc\x81\0" /* offset 3614 */ + "\x75\xcc\x9b\xcc\x81\0" /* offset 3620 */ + "\x55\xcc\x9b\xcc\x80\0" /* offset 3626 */ + "\x75\xcc\x9b\xcc\x80\0" /* offset 3632 */ + "\x55\xcc\x9b\xcc\x89\0" /* offset 3638 */ + "\x75\xcc\x9b\xcc\x89\0" /* offset 3644 */ + "\x55\xcc\x9b\xcc\x83\0" /* offset 3650 */ + "\x75\xcc\x9b\xcc\x83\0" /* offset 3656 */ + "\x55\xcc\x9b\xcc\xa3\0" /* offset 3662 */ + "\x75\xcc\x9b\xcc\xa3\0" /* offset 3668 */ + "\x59\xcc\x80\0" /* offset 3674 */ + "\x79\xcc\x80\0" /* offset 3678 */ + "\x59\xcc\xa3\0" /* offset 3682 */ + "\x79\xcc\xa3\0" /* offset 3686 */ + "\x59\xcc\x89\0" /* offset 3690 */ + "\x79\xcc\x89\0" /* offset 3694 */ + "\x59\xcc\x83\0" /* offset 3698 */ + "\x79\xcc\x83\0" /* offset 3702 */ + "\xce\xb1\xcc\x93\0" /* offset 3706 */ + "\xce\xb1\xcc\x94\0" /* offset 3711 */ + "\xce\xb1\xcc\x93\xcc\x80\0" /* offset 3716 */ + "\xce\xb1\xcc\x94\xcc\x80\0" /* offset 3723 */ + "\xce\xb1\xcc\x93\xcc\x81\0" /* offset 3730 */ + "\xce\xb1\xcc\x94\xcc\x81\0" /* offset 3737 */ + "\xce\xb1\xcc\x93\xcd\x82\0" /* offset 3744 */ + "\xce\xb1\xcc\x94\xcd\x82\0" /* offset 3751 */ + "\xce\x91\xcc\x93\0" /* offset 3758 */ + "\xce\x91\xcc\x94\0" /* offset 3763 */ + "\xce\x91\xcc\x93\xcc\x80\0" /* offset 3768 */ + "\xce\x91\xcc\x94\xcc\x80\0" /* offset 3775 */ + "\xce\x91\xcc\x93\xcc\x81\0" /* offset 3782 */ + "\xce\x91\xcc\x94\xcc\x81\0" /* offset 3789 */ + "\xce\x91\xcc\x93\xcd\x82\0" /* offset 3796 */ + "\xce\x91\xcc\x94\xcd\x82\0" /* offset 3803 */ + "\xce\xb5\xcc\x93\0" /* offset 3810 */ + "\xce\xb5\xcc\x94\0" /* offset 3815 */ + "\xce\xb5\xcc\x93\xcc\x80\0" /* offset 3820 */ + "\xce\xb5\xcc\x94\xcc\x80\0" /* offset 3827 */ + "\xce\xb5\xcc\x93\xcc\x81\0" /* offset 3834 */ + "\xce\xb5\xcc\x94\xcc\x81\0" /* offset 3841 */ + "\xce\x95\xcc\x93\0" /* offset 3848 */ + "\xce\x95\xcc\x94\0" /* offset 3853 */ + "\xce\x95\xcc\x93\xcc\x80\0" /* offset 3858 */ + "\xce\x95\xcc\x94\xcc\x80\0" /* offset 3865 */ + "\xce\x95\xcc\x93\xcc\x81\0" /* offset 3872 */ + "\xce\x95\xcc\x94\xcc\x81\0" /* offset 3879 */ + "\xce\xb7\xcc\x93\0" /* offset 3886 */ + "\xce\xb7\xcc\x94\0" /* offset 3891 */ + "\xce\xb7\xcc\x93\xcc\x80\0" /* offset 3896 */ + "\xce\xb7\xcc\x94\xcc\x80\0" /* offset 3903 */ + "\xce\xb7\xcc\x93\xcc\x81\0" /* offset 3910 */ + "\xce\xb7\xcc\x94\xcc\x81\0" /* offset 3917 */ + "\xce\xb7\xcc\x93\xcd\x82\0" /* offset 3924 */ + "\xce\xb7\xcc\x94\xcd\x82\0" /* offset 3931 */ + "\xce\x97\xcc\x93\0" /* offset 3938 */ + "\xce\x97\xcc\x94\0" /* offset 3943 */ + "\xce\x97\xcc\x93\xcc\x80\0" /* offset 3948 */ + "\xce\x97\xcc\x94\xcc\x80\0" /* offset 3955 */ + "\xce\x97\xcc\x93\xcc\x81\0" /* offset 3962 */ + "\xce\x97\xcc\x94\xcc\x81\0" /* offset 3969 */ + "\xce\x97\xcc\x93\xcd\x82\0" /* offset 3976 */ + "\xce\x97\xcc\x94\xcd\x82\0" /* offset 3983 */ + "\xce\xb9\xcc\x93\0" /* offset 3990 */ + "\xce\xb9\xcc\x94\0" /* offset 3995 */ + "\xce\xb9\xcc\x93\xcc\x80\0" /* offset 4000 */ + "\xce\xb9\xcc\x94\xcc\x80\0" /* offset 4007 */ + "\xce\xb9\xcc\x93\xcc\x81\0" /* offset 4014 */ + "\xce\xb9\xcc\x94\xcc\x81\0" /* offset 4021 */ + "\xce\xb9\xcc\x93\xcd\x82\0" /* offset 4028 */ + "\xce\xb9\xcc\x94\xcd\x82\0" /* offset 4035 */ + "\xce\x99\xcc\x93\0" /* offset 4042 */ + "\xce\x99\xcc\x94\0" /* offset 4047 */ + "\xce\x99\xcc\x93\xcc\x80\0" /* offset 4052 */ + "\xce\x99\xcc\x94\xcc\x80\0" /* offset 4059 */ + "\xce\x99\xcc\x93\xcc\x81\0" /* offset 4066 */ + "\xce\x99\xcc\x94\xcc\x81\0" /* offset 4073 */ + "\xce\x99\xcc\x93\xcd\x82\0" /* offset 4080 */ + "\xce\x99\xcc\x94\xcd\x82\0" /* offset 4087 */ + "\xce\xbf\xcc\x93\0" /* offset 4094 */ + "\xce\xbf\xcc\x94\0" /* offset 4099 */ + "\xce\xbf\xcc\x93\xcc\x80\0" /* offset 4104 */ + "\xce\xbf\xcc\x94\xcc\x80\0" /* offset 4111 */ + "\xce\xbf\xcc\x93\xcc\x81\0" /* offset 4118 */ + "\xce\xbf\xcc\x94\xcc\x81\0" /* offset 4125 */ + "\xce\x9f\xcc\x93\0" /* offset 4132 */ + "\xce\x9f\xcc\x94\0" /* offset 4137 */ + "\xce\x9f\xcc\x93\xcc\x80\0" /* offset 4142 */ + "\xce\x9f\xcc\x94\xcc\x80\0" /* offset 4149 */ + "\xce\x9f\xcc\x93\xcc\x81\0" /* offset 4156 */ + "\xce\x9f\xcc\x94\xcc\x81\0" /* offset 4163 */ + "\xcf\x85\xcc\x93\0" /* offset 4170 */ + "\xcf\x85\xcc\x94\0" /* offset 4175 */ + "\xcf\x85\xcc\x93\xcc\x80\0" /* offset 4180 */ + "\xcf\x85\xcc\x94\xcc\x80\0" /* offset 4187 */ + "\xcf\x85\xcc\x93\xcc\x81\0" /* offset 4194 */ + "\xcf\x85\xcc\x94\xcc\x81\0" /* offset 4201 */ + "\xcf\x85\xcc\x93\xcd\x82\0" /* offset 4208 */ + "\xcf\x85\xcc\x94\xcd\x82\0" /* offset 4215 */ + "\xce\xa5\xcc\x94\0" /* offset 4222 */ + "\xce\xa5\xcc\x94\xcc\x80\0" /* offset 4227 */ + "\xce\xa5\xcc\x94\xcc\x81\0" /* offset 4234 */ + "\xce\xa5\xcc\x94\xcd\x82\0" /* offset 4241 */ + "\xcf\x89\xcc\x93\0" /* offset 4248 */ + "\xcf\x89\xcc\x94\0" /* offset 4253 */ + "\xcf\x89\xcc\x93\xcc\x80\0" /* offset 4258 */ + "\xcf\x89\xcc\x94\xcc\x80\0" /* offset 4265 */ + "\xcf\x89\xcc\x93\xcc\x81\0" /* offset 4272 */ + "\xcf\x89\xcc\x94\xcc\x81\0" /* offset 4279 */ + "\xcf\x89\xcc\x93\xcd\x82\0" /* offset 4286 */ + "\xcf\x89\xcc\x94\xcd\x82\0" /* offset 4293 */ + "\xce\xa9\xcc\x93\0" /* offset 4300 */ + "\xce\xa9\xcc\x94\0" /* offset 4305 */ + "\xce\xa9\xcc\x93\xcc\x80\0" /* offset 4310 */ + "\xce\xa9\xcc\x94\xcc\x80\0" /* offset 4317 */ + "\xce\xa9\xcc\x93\xcc\x81\0" /* offset 4324 */ + "\xce\xa9\xcc\x94\xcc\x81\0" /* offset 4331 */ + "\xce\xa9\xcc\x93\xcd\x82\0" /* offset 4338 */ + "\xce\xa9\xcc\x94\xcd\x82\0" /* offset 4345 */ + "\xce\xb1\xcc\x80\0" /* offset 4352 */ + "\xce\xb5\xcc\x80\0" /* offset 4357 */ + "\xce\xb7\xcc\x80\0" /* offset 4362 */ + "\xce\xb9\xcc\x80\0" /* offset 4367 */ + "\xce\xbf\xcc\x80\0" /* offset 4372 */ + "\xcf\x85\xcc\x80\0" /* offset 4377 */ + "\xcf\x89\xcc\x80\0" /* offset 4382 */ + "\xce\xb1\xcc\x93\xcd\x85\0" /* offset 4387 */ + "\xce\xb1\xcc\x94\xcd\x85\0" /* offset 4394 */ + "\xce\xb1\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4401 */ + "\xce\xb1\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4410 */ + "\xce\xb1\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4419 */ + "\xce\xb1\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4428 */ + "\xce\xb1\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4437 */ + "\xce\xb1\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4446 */ + "\xce\x91\xcc\x93\xcd\x85\0" /* offset 4455 */ + "\xce\x91\xcc\x94\xcd\x85\0" /* offset 4462 */ + "\xce\x91\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4469 */ + "\xce\x91\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4478 */ + "\xce\x91\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4487 */ + "\xce\x91\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4496 */ + "\xce\x91\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4505 */ + "\xce\x91\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4514 */ + "\xce\xb7\xcc\x93\xcd\x85\0" /* offset 4523 */ + "\xce\xb7\xcc\x94\xcd\x85\0" /* offset 4530 */ + "\xce\xb7\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4537 */ + "\xce\xb7\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4546 */ + "\xce\xb7\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4555 */ + "\xce\xb7\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4564 */ + "\xce\xb7\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4573 */ + "\xce\xb7\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4582 */ + "\xce\x97\xcc\x93\xcd\x85\0" /* offset 4591 */ + "\xce\x97\xcc\x94\xcd\x85\0" /* offset 4598 */ + "\xce\x97\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4605 */ + "\xce\x97\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4614 */ + "\xce\x97\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4623 */ + "\xce\x97\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4632 */ + "\xce\x97\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4641 */ + "\xce\x97\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4650 */ + "\xcf\x89\xcc\x93\xcd\x85\0" /* offset 4659 */ + "\xcf\x89\xcc\x94\xcd\x85\0" /* offset 4666 */ + "\xcf\x89\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4673 */ + "\xcf\x89\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4682 */ + "\xcf\x89\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4691 */ + "\xcf\x89\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4700 */ + "\xcf\x89\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4709 */ + "\xcf\x89\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4718 */ + "\xce\xa9\xcc\x93\xcd\x85\0" /* offset 4727 */ + "\xce\xa9\xcc\x94\xcd\x85\0" /* offset 4734 */ + "\xce\xa9\xcc\x93\xcc\x80\xcd\x85\0" /* offset 4741 */ + "\xce\xa9\xcc\x94\xcc\x80\xcd\x85\0" /* offset 4750 */ + "\xce\xa9\xcc\x93\xcc\x81\xcd\x85\0" /* offset 4759 */ + "\xce\xa9\xcc\x94\xcc\x81\xcd\x85\0" /* offset 4768 */ + "\xce\xa9\xcc\x93\xcd\x82\xcd\x85\0" /* offset 4777 */ + "\xce\xa9\xcc\x94\xcd\x82\xcd\x85\0" /* offset 4786 */ + "\xce\xb1\xcc\x86\0" /* offset 4795 */ + "\xce\xb1\xcc\x84\0" /* offset 4800 */ + "\xce\xb1\xcc\x80\xcd\x85\0" /* offset 4805 */ + "\xce\xb1\xcd\x85\0" /* offset 4812 */ + "\xce\xb1\xcc\x81\xcd\x85\0" /* offset 4817 */ + "\xce\xb1\xcd\x82\0" /* offset 4824 */ + "\xce\xb1\xcd\x82\xcd\x85\0" /* offset 4829 */ + "\xce\x91\xcc\x86\0" /* offset 4836 */ + "\xce\x91\xcc\x84\0" /* offset 4841 */ + "\xce\x91\xcc\x80\0" /* offset 4846 */ + "\xce\x91\xcd\x85\0" /* offset 4851 */ + "\x20\xcc\x93\0" /* offset 4856 */ + "\xce\xb9\0" /* offset 4860 */ + "\x20\xcd\x82\0" /* offset 4863 */ + "\xc2\xa8\xcd\x82\0" /* offset 4867 */ + "\x20\xcc\x88\xcd\x82\0" /* offset 4872 */ + "\xce\xb7\xcc\x80\xcd\x85\0" /* offset 4878 */ + "\xce\xb7\xcd\x85\0" /* offset 4885 */ + "\xce\xb7\xcc\x81\xcd\x85\0" /* offset 4890 */ + "\xce\xb7\xcd\x82\0" /* offset 4897 */ + "\xce\xb7\xcd\x82\xcd\x85\0" /* offset 4902 */ + "\xce\x95\xcc\x80\0" /* offset 4909 */ + "\xce\x97\xcc\x80\0" /* offset 4914 */ + "\xce\x97\xcd\x85\0" /* offset 4919 */ + "\xe1\xbe\xbf\xcc\x80\0" /* offset 4924 */ + "\x20\xcc\x93\xcc\x80\0" /* offset 4930 */ + "\xe1\xbe\xbf\xcc\x81\0" /* offset 4936 */ + "\x20\xcc\x93\xcc\x81\0" /* offset 4942 */ + "\xe1\xbe\xbf\xcd\x82\0" /* offset 4948 */ + "\x20\xcc\x93\xcd\x82\0" /* offset 4954 */ + "\xce\xb9\xcc\x86\0" /* offset 4960 */ + "\xce\xb9\xcc\x84\0" /* offset 4965 */ + "\xce\xb9\xcc\x88\xcc\x80\0" /* offset 4970 */ + "\xce\xb9\xcd\x82\0" /* offset 4977 */ + "\xce\xb9\xcc\x88\xcd\x82\0" /* offset 4982 */ + "\xce\x99\xcc\x86\0" /* offset 4989 */ + "\xce\x99\xcc\x84\0" /* offset 4994 */ + "\xce\x99\xcc\x80\0" /* offset 4999 */ + "\xe1\xbf\xbe\xcc\x80\0" /* offset 5004 */ + "\x20\xcc\x94\xcc\x80\0" /* offset 5010 */ + "\xe1\xbf\xbe\xcc\x81\0" /* offset 5016 */ + "\x20\xcc\x94\xcc\x81\0" /* offset 5022 */ + "\xe1\xbf\xbe\xcd\x82\0" /* offset 5028 */ + "\x20\xcc\x94\xcd\x82\0" /* offset 5034 */ + "\xcf\x85\xcc\x86\0" /* offset 5040 */ + "\xcf\x85\xcc\x84\0" /* offset 5045 */ + "\xcf\x85\xcc\x88\xcc\x80\0" /* offset 5050 */ + "\xcf\x81\xcc\x93\0" /* offset 5057 */ + "\xcf\x81\xcc\x94\0" /* offset 5062 */ + "\xcf\x85\xcd\x82\0" /* offset 5067 */ + "\xcf\x85\xcc\x88\xcd\x82\0" /* offset 5072 */ + "\xce\xa5\xcc\x86\0" /* offset 5079 */ + "\xce\xa5\xcc\x84\0" /* offset 5084 */ + "\xce\xa5\xcc\x80\0" /* offset 5089 */ + "\xce\xa1\xcc\x94\0" /* offset 5094 */ + "\xc2\xa8\xcc\x80\0" /* offset 5099 */ + "\x20\xcc\x88\xcc\x80\0" /* offset 5104 */ + "\x60\0" /* offset 5110 */ + "\xcf\x89\xcc\x80\xcd\x85\0" /* offset 5112 */ + "\xcf\x89\xcd\x85\0" /* offset 5119 */ + "\xcf\x89\xcc\x81\xcd\x85\0" /* offset 5124 */ + "\xcf\x89\xcd\x82\0" /* offset 5131 */ + "\xcf\x89\xcd\x82\xcd\x85\0" /* offset 5136 */ + "\xce\x9f\xcc\x80\0" /* offset 5143 */ + "\xce\xa9\xcc\x80\0" /* offset 5148 */ + "\xce\xa9\xcd\x85\0" /* offset 5153 */ + "\xc2\xb4\0" /* offset 5158 */ + "\x20\xcc\x94\0" /* offset 5161 */ + "\xe2\x80\x82\0" /* offset 5165 */ + "\xe2\x80\x83\0" /* offset 5169 */ + "\xe2\x80\x90\0" /* offset 5173 */ + "\x20\xcc\xb3\0" /* offset 5177 */ + "\x2e\0" /* offset 5181 */ + "\x2e\x2e\0" /* offset 5183 */ + "\x2e\x2e\x2e\0" /* offset 5186 */ + "\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5190 */ + "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5197 */ + "\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 5207 */ + "\xe2\x80\xb5\xe2\x80\xb5\xe2\x80\xb5\0" /* offset 5214 */ + "\x21\x21\0" /* offset 5224 */ + "\x20\xcc\x85\0" /* offset 5227 */ + "\x3f\x3f\0" /* offset 5231 */ + "\x3f\x21\0" /* offset 5234 */ + "\x21\x3f\0" /* offset 5237 */ + "\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\xe2\x80\xb2\0" /* offset 5240 */ + "\x30\0" /* offset 5253 */ + "\x34\0" /* offset 5255 */ + "\x35\0" /* offset 5257 */ + "\x36\0" /* offset 5259 */ + "\x37\0" /* offset 5261 */ + "\x38\0" /* offset 5263 */ + "\x39\0" /* offset 5265 */ + "\x2b\0" /* offset 5267 */ + "\xe2\x88\x92\0" /* offset 5269 */ + "\x3d\0" /* offset 5273 */ + "\x28\0" /* offset 5275 */ + "\x29\0" /* offset 5277 */ + "\x6e\0" /* offset 5279 */ + "\x52\x73\0" /* offset 5281 */ + "\x61\x2f\x63\0" /* offset 5284 */ + "\x61\x2f\x73\0" /* offset 5288 */ + "\x43\0" /* offset 5292 */ + "\xc2\xb0\x43\0" /* offset 5294 */ + "\x63\x2f\x6f\0" /* offset 5298 */ + "\x63\x2f\x75\0" /* offset 5302 */ + "\xc6\x90\0" /* offset 5306 */ + "\xc2\xb0\x46\0" /* offset 5309 */ + "\xc4\xa7\0" /* offset 5313 */ + "\x4e\x6f\0" /* offset 5316 */ + "\x51\0" /* offset 5319 */ + "\x53\x4d\0" /* offset 5321 */ + "\x54\x45\x4c\0" /* offset 5324 */ + "\x54\x4d\0" /* offset 5328 */ + "\x5a\0" /* offset 5331 */ + "\xce\xa9\0" /* offset 5333 */ + "\x46\0" /* offset 5336 */ + "\xd7\x90\0" /* offset 5338 */ + "\xd7\x91\0" /* offset 5341 */ + "\xd7\x92\0" /* offset 5344 */ + "\xd7\x93\0" /* offset 5347 */ + "\x46\x41\x58\0" /* offset 5350 */ + "\xce\x93\0" /* offset 5354 */ + "\xce\xa0\0" /* offset 5357 */ + "\xe2\x88\x91\0" /* offset 5360 */ + "\x31\xe2\x81\x84\x33\0" /* offset 5364 */ + "\x32\xe2\x81\x84\x33\0" /* offset 5370 */ + "\x31\xe2\x81\x84\x35\0" /* offset 5376 */ + "\x32\xe2\x81\x84\x35\0" /* offset 5382 */ + "\x33\xe2\x81\x84\x35\0" /* offset 5388 */ + "\x34\xe2\x81\x84\x35\0" /* offset 5394 */ + "\x31\xe2\x81\x84\x36\0" /* offset 5400 */ + "\x35\xe2\x81\x84\x36\0" /* offset 5406 */ + "\x31\xe2\x81\x84\x38\0" /* offset 5412 */ + "\x33\xe2\x81\x84\x38\0" /* offset 5418 */ + "\x35\xe2\x81\x84\x38\0" /* offset 5424 */ + "\x37\xe2\x81\x84\x38\0" /* offset 5430 */ + "\x31\xe2\x81\x84\0" /* offset 5436 */ + "\x49\x49\0" /* offset 5441 */ + "\x49\x49\x49\0" /* offset 5444 */ + "\x49\x56\0" /* offset 5448 */ + "\x56\0" /* offset 5451 */ + "\x56\x49\0" /* offset 5453 */ + "\x56\x49\x49\0" /* offset 5456 */ + "\x56\x49\x49\x49\0" /* offset 5460 */ + "\x49\x58\0" /* offset 5465 */ + "\x58\0" /* offset 5468 */ + "\x58\x49\0" /* offset 5470 */ + "\x58\x49\x49\0" /* offset 5473 */ + "\x69\x69\0" /* offset 5477 */ + "\x69\x69\x69\0" /* offset 5480 */ + "\x69\x76\0" /* offset 5484 */ + "\x76\x69\0" /* offset 5487 */ + "\x76\x69\x69\0" /* offset 5490 */ + "\x76\x69\x69\x69\0" /* offset 5494 */ + "\x69\x78\0" /* offset 5499 */ + "\x78\x69\0" /* offset 5502 */ + "\x78\x69\x69\0" /* offset 5505 */ + "\xe2\x86\x90\xcc\xb8\0" /* offset 5509 */ + "\xe2\x86\x92\xcc\xb8\0" /* offset 5515 */ + "\xe2\x86\x94\xcc\xb8\0" /* offset 5521 */ + "\xe2\x87\x90\xcc\xb8\0" /* offset 5527 */ + "\xe2\x87\x94\xcc\xb8\0" /* offset 5533 */ + "\xe2\x87\x92\xcc\xb8\0" /* offset 5539 */ + "\xe2\x88\x83\xcc\xb8\0" /* offset 5545 */ + "\xe2\x88\x88\xcc\xb8\0" /* offset 5551 */ + "\xe2\x88\x8b\xcc\xb8\0" /* offset 5557 */ + "\xe2\x88\xa3\xcc\xb8\0" /* offset 5563 */ + "\xe2\x88\xa5\xcc\xb8\0" /* offset 5569 */ + "\xe2\x88\xab\xe2\x88\xab\0" /* offset 5575 */ + "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 5582 */ + "\xe2\x88\xae\xe2\x88\xae\0" /* offset 5592 */ + "\xe2\x88\xae\xe2\x88\xae\xe2\x88\xae\0" /* offset 5599 */ + "\xe2\x88\xbc\xcc\xb8\0" /* offset 5609 */ + "\xe2\x89\x83\xcc\xb8\0" /* offset 5615 */ + "\xe2\x89\x85\xcc\xb8\0" /* offset 5621 */ + "\xe2\x89\x88\xcc\xb8\0" /* offset 5627 */ + "\x3d\xcc\xb8\0" /* offset 5633 */ + "\xe2\x89\xa1\xcc\xb8\0" /* offset 5637 */ + "\xe2\x89\x8d\xcc\xb8\0" /* offset 5643 */ + "\x3c\xcc\xb8\0" /* offset 5649 */ + "\x3e\xcc\xb8\0" /* offset 5653 */ + "\xe2\x89\xa4\xcc\xb8\0" /* offset 5657 */ + "\xe2\x89\xa5\xcc\xb8\0" /* offset 5663 */ + "\xe2\x89\xb2\xcc\xb8\0" /* offset 5669 */ + "\xe2\x89\xb3\xcc\xb8\0" /* offset 5675 */ + "\xe2\x89\xb6\xcc\xb8\0" /* offset 5681 */ + "\xe2\x89\xb7\xcc\xb8\0" /* offset 5687 */ + "\xe2\x89\xba\xcc\xb8\0" /* offset 5693 */ + "\xe2\x89\xbb\xcc\xb8\0" /* offset 5699 */ + "\xe2\x8a\x82\xcc\xb8\0" /* offset 5705 */ + "\xe2\x8a\x83\xcc\xb8\0" /* offset 5711 */ + "\xe2\x8a\x86\xcc\xb8\0" /* offset 5717 */ + "\xe2\x8a\x87\xcc\xb8\0" /* offset 5723 */ + "\xe2\x8a\xa2\xcc\xb8\0" /* offset 5729 */ + "\xe2\x8a\xa8\xcc\xb8\0" /* offset 5735 */ + "\xe2\x8a\xa9\xcc\xb8\0" /* offset 5741 */ + "\xe2\x8a\xab\xcc\xb8\0" /* offset 5747 */ + "\xe2\x89\xbc\xcc\xb8\0" /* offset 5753 */ + "\xe2\x89\xbd\xcc\xb8\0" /* offset 5759 */ + "\xe2\x8a\x91\xcc\xb8\0" /* offset 5765 */ + "\xe2\x8a\x92\xcc\xb8\0" /* offset 5771 */ + "\xe2\x8a\xb2\xcc\xb8\0" /* offset 5777 */ + "\xe2\x8a\xb3\xcc\xb8\0" /* offset 5783 */ + "\xe2\x8a\xb4\xcc\xb8\0" /* offset 5789 */ + "\xe2\x8a\xb5\xcc\xb8\0" /* offset 5795 */ + "\xe3\x80\x88\0" /* offset 5801 */ + "\xe3\x80\x89\0" /* offset 5805 */ + "\x31\x30\0" /* offset 5809 */ + "\x31\x31\0" /* offset 5812 */ + "\x31\x32\0" /* offset 5815 */ + "\x31\x33\0" /* offset 5818 */ + "\x31\x34\0" /* offset 5821 */ + "\x31\x35\0" /* offset 5824 */ + "\x31\x36\0" /* offset 5827 */ + "\x31\x37\0" /* offset 5830 */ + "\x31\x38\0" /* offset 5833 */ + "\x31\x39\0" /* offset 5836 */ + "\x32\x30\0" /* offset 5839 */ + "\x28\x31\x29\0" /* offset 5842 */ + "\x28\x32\x29\0" /* offset 5846 */ + "\x28\x33\x29\0" /* offset 5850 */ + "\x28\x34\x29\0" /* offset 5854 */ + "\x28\x35\x29\0" /* offset 5858 */ + "\x28\x36\x29\0" /* offset 5862 */ + "\x28\x37\x29\0" /* offset 5866 */ + "\x28\x38\x29\0" /* offset 5870 */ + "\x28\x39\x29\0" /* offset 5874 */ + "\x28\x31\x30\x29\0" /* offset 5878 */ + "\x28\x31\x31\x29\0" /* offset 5883 */ + "\x28\x31\x32\x29\0" /* offset 5888 */ + "\x28\x31\x33\x29\0" /* offset 5893 */ + "\x28\x31\x34\x29\0" /* offset 5898 */ + "\x28\x31\x35\x29\0" /* offset 5903 */ + "\x28\x31\x36\x29\0" /* offset 5908 */ + "\x28\x31\x37\x29\0" /* offset 5913 */ + "\x28\x31\x38\x29\0" /* offset 5918 */ + "\x28\x31\x39\x29\0" /* offset 5923 */ + "\x28\x32\x30\x29\0" /* offset 5928 */ + "\x31\x2e\0" /* offset 5933 */ + "\x32\x2e\0" /* offset 5936 */ + "\x33\x2e\0" /* offset 5939 */ + "\x34\x2e\0" /* offset 5942 */ + "\x35\x2e\0" /* offset 5945 */ + "\x36\x2e\0" /* offset 5948 */ + "\x37\x2e\0" /* offset 5951 */ + "\x38\x2e\0" /* offset 5954 */ + "\x39\x2e\0" /* offset 5957 */ + "\x31\x30\x2e\0" /* offset 5960 */ + "\x31\x31\x2e\0" /* offset 5964 */ + "\x31\x32\x2e\0" /* offset 5968 */ + "\x31\x33\x2e\0" /* offset 5972 */ + "\x31\x34\x2e\0" /* offset 5976 */ + "\x31\x35\x2e\0" /* offset 5980 */ + "\x31\x36\x2e\0" /* offset 5984 */ + "\x31\x37\x2e\0" /* offset 5988 */ + "\x31\x38\x2e\0" /* offset 5992 */ + "\x31\x39\x2e\0" /* offset 5996 */ + "\x32\x30\x2e\0" /* offset 6000 */ + "\x28\x61\x29\0" /* offset 6004 */ + "\x28\x62\x29\0" /* offset 6008 */ + "\x28\x63\x29\0" /* offset 6012 */ + "\x28\x64\x29\0" /* offset 6016 */ + "\x28\x65\x29\0" /* offset 6020 */ + "\x28\x66\x29\0" /* offset 6024 */ + "\x28\x67\x29\0" /* offset 6028 */ + "\x28\x68\x29\0" /* offset 6032 */ + "\x28\x69\x29\0" /* offset 6036 */ + "\x28\x6a\x29\0" /* offset 6040 */ + "\x28\x6b\x29\0" /* offset 6044 */ + "\x28\x6c\x29\0" /* offset 6048 */ + "\x28\x6d\x29\0" /* offset 6052 */ + "\x28\x6e\x29\0" /* offset 6056 */ + "\x28\x6f\x29\0" /* offset 6060 */ + "\x28\x70\x29\0" /* offset 6064 */ + "\x28\x71\x29\0" /* offset 6068 */ + "\x28\x72\x29\0" /* offset 6072 */ + "\x28\x73\x29\0" /* offset 6076 */ + "\x28\x74\x29\0" /* offset 6080 */ + "\x28\x75\x29\0" /* offset 6084 */ + "\x28\x76\x29\0" /* offset 6088 */ + "\x28\x77\x29\0" /* offset 6092 */ + "\x28\x78\x29\0" /* offset 6096 */ + "\x28\x79\x29\0" /* offset 6100 */ + "\x28\x7a\x29\0" /* offset 6104 */ + "\x53\0" /* offset 6108 */ + "\x59\0" /* offset 6110 */ + "\x71\0" /* offset 6112 */ + "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 6114 */ + "\x3a\x3a\x3d\0" /* offset 6127 */ + "\x3d\x3d\0" /* offset 6131 */ + "\x3d\x3d\x3d\0" /* offset 6134 */ + "\xe2\xab\x9d\xcc\xb8\0" /* offset 6138 */ + "\xe2\xb5\xa1\0" /* offset 6144 */ + "\xe6\xaf\x8d\0" /* offset 6148 */ + "\xe9\xbe\x9f\0" /* offset 6152 */ + "\xe4\xb8\x80\0" /* offset 6156 */ + "\xe4\xb8\xa8\0" /* offset 6160 */ + "\xe4\xb8\xb6\0" /* offset 6164 */ + "\xe4\xb8\xbf\0" /* offset 6168 */ + "\xe4\xb9\x99\0" /* offset 6172 */ + "\xe4\xba\x85\0" /* offset 6176 */ + "\xe4\xba\x8c\0" /* offset 6180 */ + "\xe4\xba\xa0\0" /* offset 6184 */ + "\xe4\xba\xba\0" /* offset 6188 */ + "\xe5\x84\xbf\0" /* offset 6192 */ + "\xe5\x85\xa5\0" /* offset 6196 */ + "\xe5\x85\xab\0" /* offset 6200 */ + "\xe5\x86\x82\0" /* offset 6204 */ + "\xe5\x86\x96\0" /* offset 6208 */ + "\xe5\x86\xab\0" /* offset 6212 */ + "\xe5\x87\xa0\0" /* offset 6216 */ + "\xe5\x87\xb5\0" /* offset 6220 */ + "\xe5\x88\x80\0" /* offset 6224 */ + "\xe5\x8a\x9b\0" /* offset 6228 */ + "\xe5\x8b\xb9\0" /* offset 6232 */ + "\xe5\x8c\x95\0" /* offset 6236 */ + "\xe5\x8c\x9a\0" /* offset 6240 */ + "\xe5\x8c\xb8\0" /* offset 6244 */ + "\xe5\x8d\x81\0" /* offset 6248 */ + "\xe5\x8d\x9c\0" /* offset 6252 */ + "\xe5\x8d\xa9\0" /* offset 6256 */ + "\xe5\x8e\x82\0" /* offset 6260 */ + "\xe5\x8e\xb6\0" /* offset 6264 */ + "\xe5\x8f\x88\0" /* offset 6268 */ + "\xe5\x8f\xa3\0" /* offset 6272 */ + "\xe5\x9b\x97\0" /* offset 6276 */ + "\xe5\x9c\x9f\0" /* offset 6280 */ + "\xe5\xa3\xab\0" /* offset 6284 */ + "\xe5\xa4\x82\0" /* offset 6288 */ + "\xe5\xa4\x8a\0" /* offset 6292 */ + "\xe5\xa4\x95\0" /* offset 6296 */ + "\xe5\xa4\xa7\0" /* offset 6300 */ + "\xe5\xa5\xb3\0" /* offset 6304 */ + "\xe5\xad\x90\0" /* offset 6308 */ + "\xe5\xae\x80\0" /* offset 6312 */ + "\xe5\xaf\xb8\0" /* offset 6316 */ + "\xe5\xb0\x8f\0" /* offset 6320 */ + "\xe5\xb0\xa2\0" /* offset 6324 */ + "\xe5\xb0\xb8\0" /* offset 6328 */ + "\xe5\xb1\xae\0" /* offset 6332 */ + "\xe5\xb1\xb1\0" /* offset 6336 */ + "\xe5\xb7\x9b\0" /* offset 6340 */ + "\xe5\xb7\xa5\0" /* offset 6344 */ + "\xe5\xb7\xb1\0" /* offset 6348 */ + "\xe5\xb7\xbe\0" /* offset 6352 */ + "\xe5\xb9\xb2\0" /* offset 6356 */ + "\xe5\xb9\xba\0" /* offset 6360 */ + "\xe5\xb9\xbf\0" /* offset 6364 */ + "\xe5\xbb\xb4\0" /* offset 6368 */ + "\xe5\xbb\xbe\0" /* offset 6372 */ + "\xe5\xbc\x8b\0" /* offset 6376 */ + "\xe5\xbc\x93\0" /* offset 6380 */ + "\xe5\xbd\x90\0" /* offset 6384 */ + "\xe5\xbd\xa1\0" /* offset 6388 */ + "\xe5\xbd\xb3\0" /* offset 6392 */ + "\xe5\xbf\x83\0" /* offset 6396 */ + "\xe6\x88\x88\0" /* offset 6400 */ + "\xe6\x88\xb6\0" /* offset 6404 */ + "\xe6\x89\x8b\0" /* offset 6408 */ + "\xe6\x94\xaf\0" /* offset 6412 */ + "\xe6\x94\xb4\0" /* offset 6416 */ + "\xe6\x96\x87\0" /* offset 6420 */ + "\xe6\x96\x97\0" /* offset 6424 */ + "\xe6\x96\xa4\0" /* offset 6428 */ + "\xe6\x96\xb9\0" /* offset 6432 */ + "\xe6\x97\xa0\0" /* offset 6436 */ + "\xe6\x97\xa5\0" /* offset 6440 */ + "\xe6\x9b\xb0\0" /* offset 6444 */ + "\xe6\x9c\x88\0" /* offset 6448 */ + "\xe6\x9c\xa8\0" /* offset 6452 */ + "\xe6\xac\xa0\0" /* offset 6456 */ + "\xe6\xad\xa2\0" /* offset 6460 */ + "\xe6\xad\xb9\0" /* offset 6464 */ + "\xe6\xae\xb3\0" /* offset 6468 */ + "\xe6\xaf\x8b\0" /* offset 6472 */ + "\xe6\xaf\x94\0" /* offset 6476 */ + "\xe6\xaf\x9b\0" /* offset 6480 */ + "\xe6\xb0\x8f\0" /* offset 6484 */ + "\xe6\xb0\x94\0" /* offset 6488 */ + "\xe6\xb0\xb4\0" /* offset 6492 */ + "\xe7\x81\xab\0" /* offset 6496 */ + "\xe7\x88\xaa\0" /* offset 6500 */ + "\xe7\x88\xb6\0" /* offset 6504 */ + "\xe7\x88\xbb\0" /* offset 6508 */ + "\xe7\x88\xbf\0" /* offset 6512 */ + "\xe7\x89\x87\0" /* offset 6516 */ + "\xe7\x89\x99\0" /* offset 6520 */ + "\xe7\x89\x9b\0" /* offset 6524 */ + "\xe7\x8a\xac\0" /* offset 6528 */ + "\xe7\x8e\x84\0" /* offset 6532 */ + "\xe7\x8e\x89\0" /* offset 6536 */ + "\xe7\x93\x9c\0" /* offset 6540 */ + "\xe7\x93\xa6\0" /* offset 6544 */ + "\xe7\x94\x98\0" /* offset 6548 */ + "\xe7\x94\x9f\0" /* offset 6552 */ + "\xe7\x94\xa8\0" /* offset 6556 */ + "\xe7\x94\xb0\0" /* offset 6560 */ + "\xe7\x96\x8b\0" /* offset 6564 */ + "\xe7\x96\x92\0" /* offset 6568 */ + "\xe7\x99\xb6\0" /* offset 6572 */ + "\xe7\x99\xbd\0" /* offset 6576 */ + "\xe7\x9a\xae\0" /* offset 6580 */ + "\xe7\x9a\xbf\0" /* offset 6584 */ + "\xe7\x9b\xae\0" /* offset 6588 */ + "\xe7\x9f\x9b\0" /* offset 6592 */ + "\xe7\x9f\xa2\0" /* offset 6596 */ + "\xe7\x9f\xb3\0" /* offset 6600 */ + "\xe7\xa4\xba\0" /* offset 6604 */ + "\xe7\xa6\xb8\0" /* offset 6608 */ + "\xe7\xa6\xbe\0" /* offset 6612 */ + "\xe7\xa9\xb4\0" /* offset 6616 */ + "\xe7\xab\x8b\0" /* offset 6620 */ + "\xe7\xab\xb9\0" /* offset 6624 */ + "\xe7\xb1\xb3\0" /* offset 6628 */ + "\xe7\xb3\xb8\0" /* offset 6632 */ + "\xe7\xbc\xb6\0" /* offset 6636 */ + "\xe7\xbd\x91\0" /* offset 6640 */ + "\xe7\xbe\x8a\0" /* offset 6644 */ + "\xe7\xbe\xbd\0" /* offset 6648 */ + "\xe8\x80\x81\0" /* offset 6652 */ + "\xe8\x80\x8c\0" /* offset 6656 */ + "\xe8\x80\x92\0" /* offset 6660 */ + "\xe8\x80\xb3\0" /* offset 6664 */ + "\xe8\x81\xbf\0" /* offset 6668 */ + "\xe8\x82\x89\0" /* offset 6672 */ + "\xe8\x87\xa3\0" /* offset 6676 */ + "\xe8\x87\xaa\0" /* offset 6680 */ + "\xe8\x87\xb3\0" /* offset 6684 */ + "\xe8\x87\xbc\0" /* offset 6688 */ + "\xe8\x88\x8c\0" /* offset 6692 */ + "\xe8\x88\x9b\0" /* offset 6696 */ + "\xe8\x88\x9f\0" /* offset 6700 */ + "\xe8\x89\xae\0" /* offset 6704 */ + "\xe8\x89\xb2\0" /* offset 6708 */ + "\xe8\x89\xb8\0" /* offset 6712 */ + "\xe8\x99\x8d\0" /* offset 6716 */ + "\xe8\x99\xab\0" /* offset 6720 */ + "\xe8\xa1\x80\0" /* offset 6724 */ + "\xe8\xa1\x8c\0" /* offset 6728 */ + "\xe8\xa1\xa3\0" /* offset 6732 */ + "\xe8\xa5\xbe\0" /* offset 6736 */ + "\xe8\xa6\x8b\0" /* offset 6740 */ + "\xe8\xa7\x92\0" /* offset 6744 */ + "\xe8\xa8\x80\0" /* offset 6748 */ + "\xe8\xb0\xb7\0" /* offset 6752 */ + "\xe8\xb1\x86\0" /* offset 6756 */ + "\xe8\xb1\x95\0" /* offset 6760 */ + "\xe8\xb1\xb8\0" /* offset 6764 */ + "\xe8\xb2\x9d\0" /* offset 6768 */ + "\xe8\xb5\xa4\0" /* offset 6772 */ + "\xe8\xb5\xb0\0" /* offset 6776 */ + "\xe8\xb6\xb3\0" /* offset 6780 */ + "\xe8\xba\xab\0" /* offset 6784 */ + "\xe8\xbb\x8a\0" /* offset 6788 */ + "\xe8\xbe\x9b\0" /* offset 6792 */ + "\xe8\xbe\xb0\0" /* offset 6796 */ + "\xe8\xbe\xb5\0" /* offset 6800 */ + "\xe9\x82\x91\0" /* offset 6804 */ + "\xe9\x85\x89\0" /* offset 6808 */ + "\xe9\x87\x86\0" /* offset 6812 */ + "\xe9\x87\x8c\0" /* offset 6816 */ + "\xe9\x87\x91\0" /* offset 6820 */ + "\xe9\x95\xb7\0" /* offset 6824 */ + "\xe9\x96\x80\0" /* offset 6828 */ + "\xe9\x98\x9c\0" /* offset 6832 */ + "\xe9\x9a\xb6\0" /* offset 6836 */ + "\xe9\x9a\xb9\0" /* offset 6840 */ + "\xe9\x9b\xa8\0" /* offset 6844 */ + "\xe9\x9d\x91\0" /* offset 6848 */ + "\xe9\x9d\x9e\0" /* offset 6852 */ + "\xe9\x9d\xa2\0" /* offset 6856 */ + "\xe9\x9d\xa9\0" /* offset 6860 */ + "\xe9\x9f\x8b\0" /* offset 6864 */ + "\xe9\x9f\xad\0" /* offset 6868 */ + "\xe9\x9f\xb3\0" /* offset 6872 */ + "\xe9\xa0\x81\0" /* offset 6876 */ + "\xe9\xa2\xa8\0" /* offset 6880 */ + "\xe9\xa3\x9b\0" /* offset 6884 */ + "\xe9\xa3\x9f\0" /* offset 6888 */ + "\xe9\xa6\x96\0" /* offset 6892 */ + "\xe9\xa6\x99\0" /* offset 6896 */ + "\xe9\xa6\xac\0" /* offset 6900 */ + "\xe9\xaa\xa8\0" /* offset 6904 */ + "\xe9\xab\x98\0" /* offset 6908 */ + "\xe9\xab\x9f\0" /* offset 6912 */ + "\xe9\xac\xa5\0" /* offset 6916 */ + "\xe9\xac\xaf\0" /* offset 6920 */ + "\xe9\xac\xb2\0" /* offset 6924 */ + "\xe9\xac\xbc\0" /* offset 6928 */ + "\xe9\xad\x9a\0" /* offset 6932 */ + "\xe9\xb3\xa5\0" /* offset 6936 */ + "\xe9\xb9\xb5\0" /* offset 6940 */ + "\xe9\xb9\xbf\0" /* offset 6944 */ + "\xe9\xba\xa5\0" /* offset 6948 */ + "\xe9\xba\xbb\0" /* offset 6952 */ + "\xe9\xbb\x83\0" /* offset 6956 */ + "\xe9\xbb\x8d\0" /* offset 6960 */ + "\xe9\xbb\x91\0" /* offset 6964 */ + "\xe9\xbb\xb9\0" /* offset 6968 */ + "\xe9\xbb\xbd\0" /* offset 6972 */ + "\xe9\xbc\x8e\0" /* offset 6976 */ + "\xe9\xbc\x93\0" /* offset 6980 */ + "\xe9\xbc\xa0\0" /* offset 6984 */ + "\xe9\xbc\xbb\0" /* offset 6988 */ + "\xe9\xbd\x8a\0" /* offset 6992 */ + "\xe9\xbd\x92\0" /* offset 6996 */ + "\xe9\xbe\x8d\0" /* offset 7000 */ + "\xe9\xbe\x9c\0" /* offset 7004 */ + "\xe9\xbe\xa0\0" /* offset 7008 */ + "\xe3\x80\x92\0" /* offset 7012 */ + "\xe5\x8d\x84\0" /* offset 7016 */ + "\xe5\x8d\x85\0" /* offset 7020 */ + "\xe3\x81\x8b\xe3\x82\x99\0" /* offset 7024 */ + "\xe3\x81\x8d\xe3\x82\x99\0" /* offset 7031 */ + "\xe3\x81\x8f\xe3\x82\x99\0" /* offset 7038 */ + "\xe3\x81\x91\xe3\x82\x99\0" /* offset 7045 */ + "\xe3\x81\x93\xe3\x82\x99\0" /* offset 7052 */ + "\xe3\x81\x95\xe3\x82\x99\0" /* offset 7059 */ + "\xe3\x81\x97\xe3\x82\x99\0" /* offset 7066 */ + "\xe3\x81\x99\xe3\x82\x99\0" /* offset 7073 */ + "\xe3\x81\x9b\xe3\x82\x99\0" /* offset 7080 */ + "\xe3\x81\x9d\xe3\x82\x99\0" /* offset 7087 */ + "\xe3\x81\x9f\xe3\x82\x99\0" /* offset 7094 */ + "\xe3\x81\xa1\xe3\x82\x99\0" /* offset 7101 */ + "\xe3\x81\xa4\xe3\x82\x99\0" /* offset 7108 */ + "\xe3\x81\xa6\xe3\x82\x99\0" /* offset 7115 */ + "\xe3\x81\xa8\xe3\x82\x99\0" /* offset 7122 */ + "\xe3\x81\xaf\xe3\x82\x99\0" /* offset 7129 */ + "\xe3\x81\xaf\xe3\x82\x9a\0" /* offset 7136 */ + "\xe3\x81\xb2\xe3\x82\x99\0" /* offset 7143 */ + "\xe3\x81\xb2\xe3\x82\x9a\0" /* offset 7150 */ + "\xe3\x81\xb5\xe3\x82\x99\0" /* offset 7157 */ + "\xe3\x81\xb5\xe3\x82\x9a\0" /* offset 7164 */ + "\xe3\x81\xb8\xe3\x82\x99\0" /* offset 7171 */ + "\xe3\x81\xb8\xe3\x82\x9a\0" /* offset 7178 */ + "\xe3\x81\xbb\xe3\x82\x99\0" /* offset 7185 */ + "\xe3\x81\xbb\xe3\x82\x9a\0" /* offset 7192 */ + "\xe3\x81\x86\xe3\x82\x99\0" /* offset 7199 */ + "\x20\xe3\x82\x99\0" /* offset 7206 */ + "\x20\xe3\x82\x9a\0" /* offset 7211 */ + "\xe3\x82\x9d\xe3\x82\x99\0" /* offset 7216 */ + "\xe3\x82\x88\xe3\x82\x8a\0" /* offset 7223 */ + "\xe3\x82\xab\xe3\x82\x99\0" /* offset 7230 */ + "\xe3\x82\xad\xe3\x82\x99\0" /* offset 7237 */ + "\xe3\x82\xaf\xe3\x82\x99\0" /* offset 7244 */ + "\xe3\x82\xb1\xe3\x82\x99\0" /* offset 7251 */ + "\xe3\x82\xb3\xe3\x82\x99\0" /* offset 7258 */ + "\xe3\x82\xb5\xe3\x82\x99\0" /* offset 7265 */ + "\xe3\x82\xb7\xe3\x82\x99\0" /* offset 7272 */ + "\xe3\x82\xb9\xe3\x82\x99\0" /* offset 7279 */ + "\xe3\x82\xbb\xe3\x82\x99\0" /* offset 7286 */ + "\xe3\x82\xbd\xe3\x82\x99\0" /* offset 7293 */ + "\xe3\x82\xbf\xe3\x82\x99\0" /* offset 7300 */ + "\xe3\x83\x81\xe3\x82\x99\0" /* offset 7307 */ + "\xe3\x83\x84\xe3\x82\x99\0" /* offset 7314 */ + "\xe3\x83\x86\xe3\x82\x99\0" /* offset 7321 */ + "\xe3\x83\x88\xe3\x82\x99\0" /* offset 7328 */ + "\xe3\x83\x8f\xe3\x82\x99\0" /* offset 7335 */ + "\xe3\x83\x8f\xe3\x82\x9a\0" /* offset 7342 */ + "\xe3\x83\x92\xe3\x82\x99\0" /* offset 7349 */ + "\xe3\x83\x92\xe3\x82\x9a\0" /* offset 7356 */ + "\xe3\x83\x95\xe3\x82\x99\0" /* offset 7363 */ + "\xe3\x83\x95\xe3\x82\x9a\0" /* offset 7370 */ + "\xe3\x83\x98\xe3\x82\x99\0" /* offset 7377 */ + "\xe3\x83\x98\xe3\x82\x9a\0" /* offset 7384 */ + "\xe3\x83\x9b\xe3\x82\x99\0" /* offset 7391 */ + "\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 7398 */ + "\xe3\x82\xa6\xe3\x82\x99\0" /* offset 7405 */ + "\xe3\x83\xaf\xe3\x82\x99\0" /* offset 7412 */ + "\xe3\x83\xb0\xe3\x82\x99\0" /* offset 7419 */ + "\xe3\x83\xb1\xe3\x82\x99\0" /* offset 7426 */ + "\xe3\x83\xb2\xe3\x82\x99\0" /* offset 7433 */ + "\xe3\x83\xbd\xe3\x82\x99\0" /* offset 7440 */ + "\xe3\x82\xb3\xe3\x83\x88\0" /* offset 7447 */ + "\xe1\x84\x80\0" /* offset 7454 */ + "\xe1\x84\x81\0" /* offset 7458 */ + "\xe1\x86\xaa\0" /* offset 7462 */ + "\xe1\x84\x82\0" /* offset 7466 */ + "\xe1\x86\xac\0" /* offset 7470 */ + "\xe1\x86\xad\0" /* offset 7474 */ + "\xe1\x84\x83\0" /* offset 7478 */ + "\xe1\x84\x84\0" /* offset 7482 */ + "\xe1\x84\x85\0" /* offset 7486 */ + "\xe1\x86\xb0\0" /* offset 7490 */ + "\xe1\x86\xb1\0" /* offset 7494 */ + "\xe1\x86\xb2\0" /* offset 7498 */ + "\xe1\x86\xb3\0" /* offset 7502 */ + "\xe1\x86\xb4\0" /* offset 7506 */ + "\xe1\x86\xb5\0" /* offset 7510 */ + "\xe1\x84\x9a\0" /* offset 7514 */ + "\xe1\x84\x86\0" /* offset 7518 */ + "\xe1\x84\x87\0" /* offset 7522 */ + "\xe1\x84\x88\0" /* offset 7526 */ + "\xe1\x84\xa1\0" /* offset 7530 */ + "\xe1\x84\x89\0" /* offset 7534 */ + "\xe1\x84\x8a\0" /* offset 7538 */ + "\xe1\x84\x8b\0" /* offset 7542 */ + "\xe1\x84\x8c\0" /* offset 7546 */ + "\xe1\x84\x8d\0" /* offset 7550 */ + "\xe1\x84\x8e\0" /* offset 7554 */ + "\xe1\x84\x8f\0" /* offset 7558 */ + "\xe1\x84\x90\0" /* offset 7562 */ + "\xe1\x84\x91\0" /* offset 7566 */ + "\xe1\x84\x92\0" /* offset 7570 */ + "\xe1\x85\xa1\0" /* offset 7574 */ + "\xe1\x85\xa2\0" /* offset 7578 */ + "\xe1\x85\xa3\0" /* offset 7582 */ + "\xe1\x85\xa4\0" /* offset 7586 */ + "\xe1\x85\xa5\0" /* offset 7590 */ + "\xe1\x85\xa6\0" /* offset 7594 */ + "\xe1\x85\xa7\0" /* offset 7598 */ + "\xe1\x85\xa8\0" /* offset 7602 */ + "\xe1\x85\xa9\0" /* offset 7606 */ + "\xe1\x85\xaa\0" /* offset 7610 */ + "\xe1\x85\xab\0" /* offset 7614 */ + "\xe1\x85\xac\0" /* offset 7618 */ + "\xe1\x85\xad\0" /* offset 7622 */ + "\xe1\x85\xae\0" /* offset 7626 */ + "\xe1\x85\xaf\0" /* offset 7630 */ + "\xe1\x85\xb0\0" /* offset 7634 */ + "\xe1\x85\xb1\0" /* offset 7638 */ + "\xe1\x85\xb2\0" /* offset 7642 */ + "\xe1\x85\xb3\0" /* offset 7646 */ + "\xe1\x85\xb4\0" /* offset 7650 */ + "\xe1\x85\xb5\0" /* offset 7654 */ + "\xe1\x85\xa0\0" /* offset 7658 */ + "\xe1\x84\x94\0" /* offset 7662 */ + "\xe1\x84\x95\0" /* offset 7666 */ + "\xe1\x87\x87\0" /* offset 7670 */ + "\xe1\x87\x88\0" /* offset 7674 */ + "\xe1\x87\x8c\0" /* offset 7678 */ + "\xe1\x87\x8e\0" /* offset 7682 */ + "\xe1\x87\x93\0" /* offset 7686 */ + "\xe1\x87\x97\0" /* offset 7690 */ + "\xe1\x87\x99\0" /* offset 7694 */ + "\xe1\x84\x9c\0" /* offset 7698 */ + "\xe1\x87\x9d\0" /* offset 7702 */ + "\xe1\x87\x9f\0" /* offset 7706 */ + "\xe1\x84\x9d\0" /* offset 7710 */ + "\xe1\x84\x9e\0" /* offset 7714 */ + "\xe1\x84\xa0\0" /* offset 7718 */ + "\xe1\x84\xa2\0" /* offset 7722 */ + "\xe1\x84\xa3\0" /* offset 7726 */ + "\xe1\x84\xa7\0" /* offset 7730 */ + "\xe1\x84\xa9\0" /* offset 7734 */ + "\xe1\x84\xab\0" /* offset 7738 */ + "\xe1\x84\xac\0" /* offset 7742 */ + "\xe1\x84\xad\0" /* offset 7746 */ + "\xe1\x84\xae\0" /* offset 7750 */ + "\xe1\x84\xaf\0" /* offset 7754 */ + "\xe1\x84\xb2\0" /* offset 7758 */ + "\xe1\x84\xb6\0" /* offset 7762 */ + "\xe1\x85\x80\0" /* offset 7766 */ + "\xe1\x85\x87\0" /* offset 7770 */ + "\xe1\x85\x8c\0" /* offset 7774 */ + "\xe1\x87\xb1\0" /* offset 7778 */ + "\xe1\x87\xb2\0" /* offset 7782 */ + "\xe1\x85\x97\0" /* offset 7786 */ + "\xe1\x85\x98\0" /* offset 7790 */ + "\xe1\x85\x99\0" /* offset 7794 */ + "\xe1\x86\x84\0" /* offset 7798 */ + "\xe1\x86\x85\0" /* offset 7802 */ + "\xe1\x86\x88\0" /* offset 7806 */ + "\xe1\x86\x91\0" /* offset 7810 */ + "\xe1\x86\x92\0" /* offset 7814 */ + "\xe1\x86\x94\0" /* offset 7818 */ + "\xe1\x86\x9e\0" /* offset 7822 */ + "\xe1\x86\xa1\0" /* offset 7826 */ + "\xe4\xb8\x89\0" /* offset 7830 */ + "\xe5\x9b\x9b\0" /* offset 7834 */ + "\xe4\xb8\x8a\0" /* offset 7838 */ + "\xe4\xb8\xad\0" /* offset 7842 */ + "\xe4\xb8\x8b\0" /* offset 7846 */ + "\xe7\x94\xb2\0" /* offset 7850 */ + "\xe4\xb8\x99\0" /* offset 7854 */ + "\xe4\xb8\x81\0" /* offset 7858 */ + "\xe5\xa4\xa9\0" /* offset 7862 */ + "\xe5\x9c\xb0\0" /* offset 7866 */ + "\x28\xe1\x84\x80\x29\0" /* offset 7870 */ + "\x28\xe1\x84\x82\x29\0" /* offset 7876 */ + "\x28\xe1\x84\x83\x29\0" /* offset 7882 */ + "\x28\xe1\x84\x85\x29\0" /* offset 7888 */ + "\x28\xe1\x84\x86\x29\0" /* offset 7894 */ + "\x28\xe1\x84\x87\x29\0" /* offset 7900 */ + "\x28\xe1\x84\x89\x29\0" /* offset 7906 */ + "\x28\xe1\x84\x8b\x29\0" /* offset 7912 */ + "\x28\xe1\x84\x8c\x29\0" /* offset 7918 */ + "\x28\xe1\x84\x8e\x29\0" /* offset 7924 */ + "\x28\xe1\x84\x8f\x29\0" /* offset 7930 */ + "\x28\xe1\x84\x90\x29\0" /* offset 7936 */ + "\x28\xe1\x84\x91\x29\0" /* offset 7942 */ + "\x28\xe1\x84\x92\x29\0" /* offset 7948 */ + "\x28\xe1\x84\x80\xe1\x85\xa1\x29\0" /* offset 7954 */ + "\x28\xe1\x84\x82\xe1\x85\xa1\x29\0" /* offset 7963 */ + "\x28\xe1\x84\x83\xe1\x85\xa1\x29\0" /* offset 7972 */ + "\x28\xe1\x84\x85\xe1\x85\xa1\x29\0" /* offset 7981 */ + "\x28\xe1\x84\x86\xe1\x85\xa1\x29\0" /* offset 7990 */ + "\x28\xe1\x84\x87\xe1\x85\xa1\x29\0" /* offset 7999 */ + "\x28\xe1\x84\x89\xe1\x85\xa1\x29\0" /* offset 8008 */ + "\x28\xe1\x84\x8b\xe1\x85\xa1\x29\0" /* offset 8017 */ + "\x28\xe1\x84\x8c\xe1\x85\xa1\x29\0" /* offset 8026 */ + "\x28\xe1\x84\x8e\xe1\x85\xa1\x29\0" /* offset 8035 */ + "\x28\xe1\x84\x8f\xe1\x85\xa1\x29\0" /* offset 8044 */ + "\x28\xe1\x84\x90\xe1\x85\xa1\x29\0" /* offset 8053 */ + "\x28\xe1\x84\x91\xe1\x85\xa1\x29\0" /* offset 8062 */ + "\x28\xe1\x84\x92\xe1\x85\xa1\x29\0" /* offset 8071 */ + "\x28\xe1\x84\x8c\xe1\x85\xae\x29\0" /* offset 8080 */ + "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x8c\xe1\x85\xa5\xe1\x86\xab\x29\0" /* offset 8089 */ + "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x92\xe1\x85\xae\x29\0" /* offset 8107 */ + "\x28\xe4\xb8\x80\x29\0" /* offset 8122 */ + "\x28\xe4\xba\x8c\x29\0" /* offset 8128 */ + "\x28\xe4\xb8\x89\x29\0" /* offset 8134 */ + "\x28\xe5\x9b\x9b\x29\0" /* offset 8140 */ + "\x28\xe4\xba\x94\x29\0" /* offset 8146 */ + "\x28\xe5\x85\xad\x29\0" /* offset 8152 */ + "\x28\xe4\xb8\x83\x29\0" /* offset 8158 */ + "\x28\xe5\x85\xab\x29\0" /* offset 8164 */ + "\x28\xe4\xb9\x9d\x29\0" /* offset 8170 */ + "\x28\xe5\x8d\x81\x29\0" /* offset 8176 */ + "\x28\xe6\x9c\x88\x29\0" /* offset 8182 */ + "\x28\xe7\x81\xab\x29\0" /* offset 8188 */ + "\x28\xe6\xb0\xb4\x29\0" /* offset 8194 */ + "\x28\xe6\x9c\xa8\x29\0" /* offset 8200 */ + "\x28\xe9\x87\x91\x29\0" /* offset 8206 */ + "\x28\xe5\x9c\x9f\x29\0" /* offset 8212 */ + "\x28\xe6\x97\xa5\x29\0" /* offset 8218 */ + "\x28\xe6\xa0\xaa\x29\0" /* offset 8224 */ + "\x28\xe6\x9c\x89\x29\0" /* offset 8230 */ + "\x28\xe7\xa4\xbe\x29\0" /* offset 8236 */ + "\x28\xe5\x90\x8d\x29\0" /* offset 8242 */ + "\x28\xe7\x89\xb9\x29\0" /* offset 8248 */ + "\x28\xe8\xb2\xa1\x29\0" /* offset 8254 */ + "\x28\xe7\xa5\x9d\x29\0" /* offset 8260 */ + "\x28\xe5\x8a\xb4\x29\0" /* offset 8266 */ + "\x28\xe4\xbb\xa3\x29\0" /* offset 8272 */ + "\x28\xe5\x91\xbc\x29\0" /* offset 8278 */ + "\x28\xe5\xad\xa6\x29\0" /* offset 8284 */ + "\x28\xe7\x9b\xa3\x29\0" /* offset 8290 */ + "\x28\xe4\xbc\x81\x29\0" /* offset 8296 */ + "\x28\xe8\xb3\x87\x29\0" /* offset 8302 */ + "\x28\xe5\x8d\x94\x29\0" /* offset 8308 */ + "\x28\xe7\xa5\xad\x29\0" /* offset 8314 */ + "\x28\xe4\xbc\x91\x29\0" /* offset 8320 */ + "\x28\xe8\x87\xaa\x29\0" /* offset 8326 */ + "\x28\xe8\x87\xb3\x29\0" /* offset 8332 */ + "\x50\x54\x45\0" /* offset 8338 */ + "\x32\x31\0" /* offset 8342 */ + "\x32\x32\0" /* offset 8345 */ + "\x32\x33\0" /* offset 8348 */ + "\x32\x34\0" /* offset 8351 */ + "\x32\x35\0" /* offset 8354 */ + "\x32\x36\0" /* offset 8357 */ + "\x32\x37\0" /* offset 8360 */ + "\x32\x38\0" /* offset 8363 */ + "\x32\x39\0" /* offset 8366 */ + "\x33\x30\0" /* offset 8369 */ + "\x33\x31\0" /* offset 8372 */ + "\x33\x32\0" /* offset 8375 */ + "\x33\x33\0" /* offset 8378 */ + "\x33\x34\0" /* offset 8381 */ + "\x33\x35\0" /* offset 8384 */ + "\xe1\x84\x80\xe1\x85\xa1\0" /* offset 8387 */ + "\xe1\x84\x82\xe1\x85\xa1\0" /* offset 8394 */ + "\xe1\x84\x83\xe1\x85\xa1\0" /* offset 8401 */ + "\xe1\x84\x85\xe1\x85\xa1\0" /* offset 8408 */ + "\xe1\x84\x86\xe1\x85\xa1\0" /* offset 8415 */ + "\xe1\x84\x87\xe1\x85\xa1\0" /* offset 8422 */ + "\xe1\x84\x89\xe1\x85\xa1\0" /* offset 8429 */ + "\xe1\x84\x8b\xe1\x85\xa1\0" /* offset 8436 */ + "\xe1\x84\x8c\xe1\x85\xa1\0" /* offset 8443 */ + "\xe1\x84\x8e\xe1\x85\xa1\0" /* offset 8450 */ + "\xe1\x84\x8f\xe1\x85\xa1\0" /* offset 8457 */ + "\xe1\x84\x90\xe1\x85\xa1\0" /* offset 8464 */ + "\xe1\x84\x91\xe1\x85\xa1\0" /* offset 8471 */ + "\xe1\x84\x92\xe1\x85\xa1\0" /* offset 8478 */ + "\xe1\x84\x8e\xe1\x85\xa1\xe1\x86\xb7\xe1\x84\x80\xe1\x85\xa9\0" /* offset 8485 */ + "\xe1\x84\x8c\xe1\x85\xae\xe1\x84\x8b\xe1\x85\xb4\0" /* offset 8501 */ + "\xe1\x84\x8b\xe1\x85\xae\0" /* offset 8514 */ + "\xe4\xba\x94\0" /* offset 8521 */ + "\xe5\x85\xad\0" /* offset 8525 */ + "\xe4\xb8\x83\0" /* offset 8529 */ + "\xe4\xb9\x9d\0" /* offset 8533 */ + "\xe6\xa0\xaa\0" /* offset 8537 */ + "\xe6\x9c\x89\0" /* offset 8541 */ + "\xe7\xa4\xbe\0" /* offset 8545 */ + "\xe5\x90\x8d\0" /* offset 8549 */ + "\xe7\x89\xb9\0" /* offset 8553 */ + "\xe8\xb2\xa1\0" /* offset 8557 */ + "\xe7\xa5\x9d\0" /* offset 8561 */ + "\xe5\x8a\xb4\0" /* offset 8565 */ + "\xe7\xa7\x98\0" /* offset 8569 */ + "\xe7\x94\xb7\0" /* offset 8573 */ + "\xe9\x81\xa9\0" /* offset 8577 */ + "\xe5\x84\xaa\0" /* offset 8581 */ + "\xe5\x8d\xb0\0" /* offset 8585 */ + "\xe6\xb3\xa8\0" /* offset 8589 */ + "\xe9\xa0\x85\0" /* offset 8593 */ + "\xe4\xbc\x91\0" /* offset 8597 */ + "\xe5\x86\x99\0" /* offset 8601 */ + "\xe6\xad\xa3\0" /* offset 8605 */ + "\xe5\xb7\xa6\0" /* offset 8609 */ + "\xe5\x8f\xb3\0" /* offset 8613 */ + "\xe5\x8c\xbb\0" /* offset 8617 */ + "\xe5\xae\x97\0" /* offset 8621 */ + "\xe5\xad\xa6\0" /* offset 8625 */ + "\xe7\x9b\xa3\0" /* offset 8629 */ + "\xe4\xbc\x81\0" /* offset 8633 */ + "\xe8\xb3\x87\0" /* offset 8637 */ + "\xe5\x8d\x94\0" /* offset 8641 */ + "\xe5\xa4\x9c\0" /* offset 8645 */ + "\x33\x36\0" /* offset 8649 */ + "\x33\x37\0" /* offset 8652 */ + "\x33\x38\0" /* offset 8655 */ + "\x33\x39\0" /* offset 8658 */ + "\x34\x30\0" /* offset 8661 */ + "\x34\x31\0" /* offset 8664 */ + "\x34\x32\0" /* offset 8667 */ + "\x34\x33\0" /* offset 8670 */ + "\x34\x34\0" /* offset 8673 */ + "\x34\x35\0" /* offset 8676 */ + "\x34\x36\0" /* offset 8679 */ + "\x34\x37\0" /* offset 8682 */ + "\x34\x38\0" /* offset 8685 */ + "\x34\x39\0" /* offset 8688 */ + "\x35\x30\0" /* offset 8691 */ + "\x31\xe6\x9c\x88\0" /* offset 8694 */ + "\x32\xe6\x9c\x88\0" /* offset 8699 */ + "\x33\xe6\x9c\x88\0" /* offset 8704 */ + "\x34\xe6\x9c\x88\0" /* offset 8709 */ + "\x35\xe6\x9c\x88\0" /* offset 8714 */ + "\x36\xe6\x9c\x88\0" /* offset 8719 */ + "\x37\xe6\x9c\x88\0" /* offset 8724 */ + "\x38\xe6\x9c\x88\0" /* offset 8729 */ + "\x39\xe6\x9c\x88\0" /* offset 8734 */ + "\x31\x30\xe6\x9c\x88\0" /* offset 8739 */ + "\x31\x31\xe6\x9c\x88\0" /* offset 8745 */ + "\x31\x32\xe6\x9c\x88\0" /* offset 8751 */ + "\x48\x67\0" /* offset 8757 */ + "\x65\x72\x67\0" /* offset 8760 */ + "\x65\x56\0" /* offset 8764 */ + "\x4c\x54\x44\0" /* offset 8767 */ + "\xe3\x82\xa2\0" /* offset 8771 */ + "\xe3\x82\xa4\0" /* offset 8775 */ + "\xe3\x82\xa6\0" /* offset 8779 */ + "\xe3\x82\xa8\0" /* offset 8783 */ + "\xe3\x82\xaa\0" /* offset 8787 */ + "\xe3\x82\xab\0" /* offset 8791 */ + "\xe3\x82\xad\0" /* offset 8795 */ + "\xe3\x82\xaf\0" /* offset 8799 */ + "\xe3\x82\xb1\0" /* offset 8803 */ + "\xe3\x82\xb3\0" /* offset 8807 */ + "\xe3\x82\xb5\0" /* offset 8811 */ + "\xe3\x82\xb7\0" /* offset 8815 */ + "\xe3\x82\xb9\0" /* offset 8819 */ + "\xe3\x82\xbb\0" /* offset 8823 */ + "\xe3\x82\xbd\0" /* offset 8827 */ + "\xe3\x82\xbf\0" /* offset 8831 */ + "\xe3\x83\x81\0" /* offset 8835 */ + "\xe3\x83\x84\0" /* offset 8839 */ + "\xe3\x83\x86\0" /* offset 8843 */ + "\xe3\x83\x88\0" /* offset 8847 */ + "\xe3\x83\x8a\0" /* offset 8851 */ + "\xe3\x83\x8b\0" /* offset 8855 */ + "\xe3\x83\x8c\0" /* offset 8859 */ + "\xe3\x83\x8d\0" /* offset 8863 */ + "\xe3\x83\x8e\0" /* offset 8867 */ + "\xe3\x83\x8f\0" /* offset 8871 */ + "\xe3\x83\x92\0" /* offset 8875 */ + "\xe3\x83\x95\0" /* offset 8879 */ + "\xe3\x83\x98\0" /* offset 8883 */ + "\xe3\x83\x9b\0" /* offset 8887 */ + "\xe3\x83\x9e\0" /* offset 8891 */ + "\xe3\x83\x9f\0" /* offset 8895 */ + "\xe3\x83\xa0\0" /* offset 8899 */ + "\xe3\x83\xa1\0" /* offset 8903 */ + "\xe3\x83\xa2\0" /* offset 8907 */ + "\xe3\x83\xa4\0" /* offset 8911 */ + "\xe3\x83\xa6\0" /* offset 8915 */ + "\xe3\x83\xa8\0" /* offset 8919 */ + "\xe3\x83\xa9\0" /* offset 8923 */ + "\xe3\x83\xaa\0" /* offset 8927 */ + "\xe3\x83\xab\0" /* offset 8931 */ + "\xe3\x83\xac\0" /* offset 8935 */ + "\xe3\x83\xad\0" /* offset 8939 */ + "\xe3\x83\xaf\0" /* offset 8943 */ + "\xe3\x83\xb0\0" /* offset 8947 */ + "\xe3\x83\xb1\0" /* offset 8951 */ + "\xe3\x83\xb2\0" /* offset 8955 */ + "\xe3\x82\xa2\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x88\0" /* offset 8959 */ + "\xe3\x82\xa2\xe3\x83\xab\xe3\x83\x95\xe3\x82\xa1\0" /* offset 8975 */ + "\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xa2\0" /* offset 8988 */ + "\xe3\x82\xa2\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9004 */ + "\xe3\x82\xa4\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9014 */ + "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9030 */ + "\xe3\x82\xa6\xe3\x82\xa9\xe3\x83\xb3\0" /* offset 9040 */ + "\xe3\x82\xa8\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9050 */ + "\xe3\x82\xa8\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc\0" /* offset 9069 */ + "\xe3\x82\xaa\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9082 */ + "\xe3\x82\xaa\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9092 */ + "\xe3\x82\xab\xe3\x82\xa4\xe3\x83\xaa\0" /* offset 9102 */ + "\xe3\x82\xab\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\0" /* offset 9112 */ + "\xe3\x82\xab\xe3\x83\xad\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9125 */ + "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9138 */ + "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xb3\xe3\x83\x9e\0" /* offset 9151 */ + "\xe3\x82\xad\xe3\x82\x99\xe3\x82\xab\xe3\x82\x99\0" /* offset 9164 */ + "\xe3\x82\xad\xe3\x82\x99\xe3\x83\x8b\xe3\x83\xbc\0" /* offset 9177 */ + "\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9190 */ + "\xe3\x82\xad\xe3\x82\x99\xe3\x83\xab\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\0" /* offset 9203 */ + "\xe3\x82\xad\xe3\x83\xad\0" /* offset 9222 */ + "\xe3\x82\xad\xe3\x83\xad\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9229 */ + "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9248 */ + "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 9267 */ + "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9283 */ + "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9296 */ + "\xe3\x82\xaf\xe3\x83\xab\xe3\x82\xbb\xe3\x82\x99\xe3\x82\xa4\xe3\x83\xad\0" /* offset 9315 */ + "\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x8d\0" /* offset 9334 */ + "\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9347 */ + "\xe3\x82\xb3\xe3\x83\xab\xe3\x83\x8a\0" /* offset 9357 */ + "\xe3\x82\xb3\xe3\x83\xbc\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 9367 */ + "\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9380 */ + "\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x81\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9393 */ + "\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9409 */ + "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9425 */ + "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9435 */ + "\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9445 */ + "\xe3\x83\x86\xe3\x82\x99\xe3\x82\xb7\0" /* offset 9458 */ + "\xe3\x83\x88\xe3\x82\x99\xe3\x83\xab\0" /* offset 9468 */ + "\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9478 */ + "\xe3\x83\x8a\xe3\x83\x8e\0" /* offset 9485 */ + "\xe3\x83\x8e\xe3\x83\x83\xe3\x83\x88\0" /* offset 9492 */ + "\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x84\0" /* offset 9502 */ + "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9512 */ + "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x84\0" /* offset 9531 */ + "\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xac\xe3\x83\xab\0" /* offset 9544 */ + "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xa2\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab\0" /* offset 9560 */ + "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9579 */ + "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xb3\0" /* offset 9592 */ + "\xe3\x83\x92\xe3\x82\x99\xe3\x83\xab\0" /* offset 9602 */ + "\xe3\x83\x95\xe3\x82\xa1\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x82\x99\0" /* offset 9612 */ + "\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc\xe3\x83\x88\0" /* offset 9631 */ + "\xe3\x83\x95\xe3\x82\x99\xe3\x83\x83\xe3\x82\xb7\xe3\x82\xa7\xe3\x83\xab\0" /* offset 9644 */ + "\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\0" /* offset 9663 */ + "\xe3\x83\x98\xe3\x82\xaf\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9673 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xbd\0" /* offset 9689 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\x8b\xe3\x83\x92\0" /* offset 9699 */ + "\xe3\x83\x98\xe3\x83\xab\xe3\x83\x84\0" /* offset 9712 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9722 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xb7\xe3\x82\x99\0" /* offset 9735 */ + "\xe3\x83\x98\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xbf\0" /* offset 9751 */ + "\xe3\x83\x9b\xe3\x82\x9a\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9764 */ + "\xe3\x83\x9b\xe3\x82\x99\xe3\x83\xab\xe3\x83\x88\0" /* offset 9780 */ + "\xe3\x83\x9b\xe3\x83\xb3\0" /* offset 9793 */ + "\xe3\x83\x9b\xe3\x82\x9a\xe3\x83\xb3\xe3\x83\x88\xe3\x82\x99\0" /* offset 9800 */ + "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9816 */ + "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xb3\0" /* offset 9826 */ + "\xe3\x83\x9e\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xad\0" /* offset 9836 */ + "\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xab\0" /* offset 9849 */ + "\xe3\x83\x9e\xe3\x83\x83\xe3\x83\x8f\0" /* offset 9859 */ + "\xe3\x83\x9e\xe3\x83\xab\xe3\x82\xaf\0" /* offset 9869 */ + "\xe3\x83\x9e\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" /* offset 9879 */ + "\xe3\x83\x9f\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9895 */ + "\xe3\x83\x9f\xe3\x83\xaa\0" /* offset 9908 */ + "\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9915 */ + "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\0" /* offset 9934 */ + "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9944 */ + "\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9960 */ + "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9973 */ + "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9986 */ + "\xe3\x83\xa6\xe3\x82\xa2\xe3\x83\xb3\0" /* offset 9996 */ + "\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x88\xe3\x83\xab\0" /* offset 10006 */ + "\xe3\x83\xaa\xe3\x83\xa9\0" /* offset 10019 */ + "\xe3\x83\xab\xe3\x83\x92\xe3\x82\x9a\xe3\x83\xbc\0" /* offset 10026 */ + "\xe3\x83\xab\xe3\x83\xbc\xe3\x83\x95\xe3\x82\x99\xe3\x83\xab\0" /* offset 10039 */ + "\xe3\x83\xac\xe3\x83\xa0\0" /* offset 10055 */ + "\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x88\xe3\x82\xb1\xe3\x82\x99\xe3\x83\xb3\0" /* offset 10062 */ + "\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 10081 */ + "\x30\xe7\x82\xb9\0" /* offset 10091 */ + "\x31\xe7\x82\xb9\0" /* offset 10096 */ + "\x32\xe7\x82\xb9\0" /* offset 10101 */ + "\x33\xe7\x82\xb9\0" /* offset 10106 */ + "\x34\xe7\x82\xb9\0" /* offset 10111 */ + "\x35\xe7\x82\xb9\0" /* offset 10116 */ + "\x36\xe7\x82\xb9\0" /* offset 10121 */ + "\x37\xe7\x82\xb9\0" /* offset 10126 */ + "\x38\xe7\x82\xb9\0" /* offset 10131 */ + "\x39\xe7\x82\xb9\0" /* offset 10136 */ + "\x31\x30\xe7\x82\xb9\0" /* offset 10141 */ + "\x31\x31\xe7\x82\xb9\0" /* offset 10147 */ + "\x31\x32\xe7\x82\xb9\0" /* offset 10153 */ + "\x31\x33\xe7\x82\xb9\0" /* offset 10159 */ + "\x31\x34\xe7\x82\xb9\0" /* offset 10165 */ + "\x31\x35\xe7\x82\xb9\0" /* offset 10171 */ + "\x31\x36\xe7\x82\xb9\0" /* offset 10177 */ + "\x31\x37\xe7\x82\xb9\0" /* offset 10183 */ + "\x31\x38\xe7\x82\xb9\0" /* offset 10189 */ + "\x31\x39\xe7\x82\xb9\0" /* offset 10195 */ + "\x32\x30\xe7\x82\xb9\0" /* offset 10201 */ + "\x32\x31\xe7\x82\xb9\0" /* offset 10207 */ + "\x32\x32\xe7\x82\xb9\0" /* offset 10213 */ + "\x32\x33\xe7\x82\xb9\0" /* offset 10219 */ + "\x32\x34\xe7\x82\xb9\0" /* offset 10225 */ + "\x68\x50\x61\0" /* offset 10231 */ + "\x64\x61\0" /* offset 10235 */ + "\x41\x55\0" /* offset 10238 */ + "\x62\x61\x72\0" /* offset 10241 */ + "\x6f\x56\0" /* offset 10245 */ + "\x70\x63\0" /* offset 10248 */ + "\x64\x6d\0" /* offset 10251 */ + "\x64\x6d\x32\0" /* offset 10254 */ + "\x64\x6d\x33\0" /* offset 10258 */ + "\x49\x55\0" /* offset 10262 */ + "\xe5\xb9\xb3\xe6\x88\x90\0" /* offset 10265 */ + "\xe6\x98\xad\xe5\x92\x8c\0" /* offset 10272 */ + "\xe5\xa4\xa7\xe6\xad\xa3\0" /* offset 10279 */ + "\xe6\x98\x8e\xe6\xb2\xbb\0" /* offset 10286 */ + "\xe6\xa0\xaa\xe5\xbc\x8f\xe4\xbc\x9a\xe7\xa4\xbe\0" /* offset 10293 */ + "\x70\x41\0" /* offset 10306 */ + "\x6e\x41\0" /* offset 10309 */ + "\xce\xbc\x41\0" /* offset 10312 */ + "\x6d\x41\0" /* offset 10316 */ + "\x6b\x41\0" /* offset 10319 */ + "\x4b\x42\0" /* offset 10322 */ + "\x4d\x42\0" /* offset 10325 */ + "\x47\x42\0" /* offset 10328 */ + "\x63\x61\x6c\0" /* offset 10331 */ + "\x6b\x63\x61\x6c\0" /* offset 10335 */ + "\x70\x46\0" /* offset 10340 */ + "\x6e\x46\0" /* offset 10343 */ + "\xce\xbc\x46\0" /* offset 10346 */ + "\xce\xbc\x67\0" /* offset 10350 */ + "\x6d\x67\0" /* offset 10354 */ + "\x6b\x67\0" /* offset 10357 */ + "\x48\x7a\0" /* offset 10360 */ + "\x6b\x48\x7a\0" /* offset 10363 */ + "\x4d\x48\x7a\0" /* offset 10367 */ + "\x47\x48\x7a\0" /* offset 10371 */ + "\x54\x48\x7a\0" /* offset 10375 */ + "\xce\xbc\x6c\0" /* offset 10379 */ + "\x6d\x6c\0" /* offset 10383 */ + "\x64\x6c\0" /* offset 10386 */ + "\x6b\x6c\0" /* offset 10389 */ + "\x66\x6d\0" /* offset 10392 */ + "\x6e\x6d\0" /* offset 10395 */ + "\xce\xbc\x6d\0" /* offset 10398 */ + "\x6d\x6d\0" /* offset 10402 */ + "\x63\x6d\0" /* offset 10405 */ + "\x6b\x6d\0" /* offset 10408 */ + "\x6d\x6d\x32\0" /* offset 10411 */ + "\x63\x6d\x32\0" /* offset 10415 */ + "\x6d\x32\0" /* offset 10419 */ + "\x6b\x6d\x32\0" /* offset 10422 */ + "\x6d\x6d\x33\0" /* offset 10426 */ + "\x63\x6d\x33\0" /* offset 10430 */ + "\x6d\x33\0" /* offset 10434 */ + "\x6b\x6d\x33\0" /* offset 10437 */ + "\x6d\xe2\x88\x95\x73\0" /* offset 10441 */ + "\x6d\xe2\x88\x95\x73\x32\0" /* offset 10447 */ + "\x50\x61\0" /* offset 10454 */ + "\x6b\x50\x61\0" /* offset 10457 */ + "\x4d\x50\x61\0" /* offset 10461 */ + "\x47\x50\x61\0" /* offset 10465 */ + "\x72\x61\x64\0" /* offset 10469 */ + "\x72\x61\x64\xe2\x88\x95\x73\0" /* offset 10473 */ + "\x72\x61\x64\xe2\x88\x95\x73\x32\0" /* offset 10481 */ + "\x70\x73\0" /* offset 10490 */ + "\x6e\x73\0" /* offset 10493 */ + "\xce\xbc\x73\0" /* offset 10496 */ + "\x6d\x73\0" /* offset 10500 */ + "\x70\x56\0" /* offset 10503 */ + "\x6e\x56\0" /* offset 10506 */ + "\xce\xbc\x56\0" /* offset 10509 */ + "\x6d\x56\0" /* offset 10513 */ + "\x6b\x56\0" /* offset 10516 */ + "\x4d\x56\0" /* offset 10519 */ + "\x70\x57\0" /* offset 10522 */ + "\x6e\x57\0" /* offset 10525 */ + "\xce\xbc\x57\0" /* offset 10528 */ + "\x6d\x57\0" /* offset 10532 */ + "\x6b\x57\0" /* offset 10535 */ + "\x4d\x57\0" /* offset 10538 */ + "\x6b\xce\xa9\0" /* offset 10541 */ + "\x4d\xce\xa9\0" /* offset 10545 */ + "\x61\x2e\x6d\x2e\0" /* offset 10549 */ + "\x42\x71\0" /* offset 10554 */ + "\x63\x63\0" /* offset 10557 */ + "\x63\x64\0" /* offset 10560 */ + "\x43\xe2\x88\x95\x6b\x67\0" /* offset 10563 */ + "\x43\x6f\x2e\0" /* offset 10570 */ + "\x64\x42\0" /* offset 10574 */ + "\x47\x79\0" /* offset 10577 */ + "\x68\x61\0" /* offset 10580 */ + "\x48\x50\0" /* offset 10583 */ + "\x69\x6e\0" /* offset 10586 */ + "\x4b\x4b\0" /* offset 10589 */ + "\x4b\x4d\0" /* offset 10592 */ + "\x6b\x74\0" /* offset 10595 */ + "\x6c\x6d\0" /* offset 10598 */ + "\x6c\x6e\0" /* offset 10601 */ + "\x6c\x6f\x67\0" /* offset 10604 */ + "\x6c\x78\0" /* offset 10608 */ + "\x6d\x62\0" /* offset 10611 */ + "\x6d\x69\x6c\0" /* offset 10614 */ + "\x6d\x6f\x6c\0" /* offset 10618 */ + "\x50\x48\0" /* offset 10622 */ + "\x70\x2e\x6d\x2e\0" /* offset 10625 */ + "\x50\x50\x4d\0" /* offset 10630 */ + "\x50\x52\0" /* offset 10634 */ + "\x73\x72\0" /* offset 10637 */ + "\x53\x76\0" /* offset 10640 */ + "\x57\x62\0" /* offset 10643 */ + "\x56\xe2\x88\x95\x6d\0" /* offset 10646 */ + "\x41\xe2\x88\x95\x6d\0" /* offset 10652 */ + "\x31\xe6\x97\xa5\0" /* offset 10658 */ + "\x32\xe6\x97\xa5\0" /* offset 10663 */ + "\x33\xe6\x97\xa5\0" /* offset 10668 */ + "\x34\xe6\x97\xa5\0" /* offset 10673 */ + "\x35\xe6\x97\xa5\0" /* offset 10678 */ + "\x36\xe6\x97\xa5\0" /* offset 10683 */ + "\x37\xe6\x97\xa5\0" /* offset 10688 */ + "\x38\xe6\x97\xa5\0" /* offset 10693 */ + "\x39\xe6\x97\xa5\0" /* offset 10698 */ + "\x31\x30\xe6\x97\xa5\0" /* offset 10703 */ + "\x31\x31\xe6\x97\xa5\0" /* offset 10709 */ + "\x31\x32\xe6\x97\xa5\0" /* offset 10715 */ + "\x31\x33\xe6\x97\xa5\0" /* offset 10721 */ + "\x31\x34\xe6\x97\xa5\0" /* offset 10727 */ + "\x31\x35\xe6\x97\xa5\0" /* offset 10733 */ + "\x31\x36\xe6\x97\xa5\0" /* offset 10739 */ + "\x31\x37\xe6\x97\xa5\0" /* offset 10745 */ + "\x31\x38\xe6\x97\xa5\0" /* offset 10751 */ + "\x31\x39\xe6\x97\xa5\0" /* offset 10757 */ + "\x32\x30\xe6\x97\xa5\0" /* offset 10763 */ + "\x32\x31\xe6\x97\xa5\0" /* offset 10769 */ + "\x32\x32\xe6\x97\xa5\0" /* offset 10775 */ + "\x32\x33\xe6\x97\xa5\0" /* offset 10781 */ + "\x32\x34\xe6\x97\xa5\0" /* offset 10787 */ + "\x32\x35\xe6\x97\xa5\0" /* offset 10793 */ + "\x32\x36\xe6\x97\xa5\0" /* offset 10799 */ + "\x32\x37\xe6\x97\xa5\0" /* offset 10805 */ + "\x32\x38\xe6\x97\xa5\0" /* offset 10811 */ + "\x32\x39\xe6\x97\xa5\0" /* offset 10817 */ + "\x33\x30\xe6\x97\xa5\0" /* offset 10823 */ + "\x33\x31\xe6\x97\xa5\0" /* offset 10829 */ + "\x67\x61\x6c\0" /* offset 10835 */ + "\xe8\xb1\x88\0" /* offset 10839 */ + "\xe6\x9b\xb4\0" /* offset 10843 */ + "\xe8\xb3\x88\0" /* offset 10847 */ + "\xe6\xbb\x91\0" /* offset 10851 */ + "\xe4\xb8\xb2\0" /* offset 10855 */ + "\xe5\x8f\xa5\0" /* offset 10859 */ + "\xe5\xa5\x91\0" /* offset 10863 */ + "\xe5\x96\x87\0" /* offset 10867 */ + "\xe5\xa5\x88\0" /* offset 10871 */ + "\xe6\x87\xb6\0" /* offset 10875 */ + "\xe7\x99\xa9\0" /* offset 10879 */ + "\xe7\xbe\x85\0" /* offset 10883 */ + "\xe8\x98\xbf\0" /* offset 10887 */ + "\xe8\x9e\xba\0" /* offset 10891 */ + "\xe8\xa3\xb8\0" /* offset 10895 */ + "\xe9\x82\x8f\0" /* offset 10899 */ + "\xe6\xa8\x82\0" /* offset 10903 */ + "\xe6\xb4\x9b\0" /* offset 10907 */ + "\xe7\x83\x99\0" /* offset 10911 */ + "\xe7\x8f\x9e\0" /* offset 10915 */ + "\xe8\x90\xbd\0" /* offset 10919 */ + "\xe9\x85\xaa\0" /* offset 10923 */ + "\xe9\xa7\xb1\0" /* offset 10927 */ + "\xe4\xba\x82\0" /* offset 10931 */ + "\xe5\x8d\xb5\0" /* offset 10935 */ + "\xe6\xac\x84\0" /* offset 10939 */ + "\xe7\x88\x9b\0" /* offset 10943 */ + "\xe8\x98\xad\0" /* offset 10947 */ + "\xe9\xb8\x9e\0" /* offset 10951 */ + "\xe5\xb5\x90\0" /* offset 10955 */ + "\xe6\xbf\xab\0" /* offset 10959 */ + "\xe8\x97\x8d\0" /* offset 10963 */ + "\xe8\xa5\xa4\0" /* offset 10967 */ + "\xe6\x8b\x89\0" /* offset 10971 */ + "\xe8\x87\x98\0" /* offset 10975 */ + "\xe8\xa0\x9f\0" /* offset 10979 */ + "\xe5\xbb\x8a\0" /* offset 10983 */ + "\xe6\x9c\x97\0" /* offset 10987 */ + "\xe6\xb5\xaa\0" /* offset 10991 */ + "\xe7\x8b\xbc\0" /* offset 10995 */ + "\xe9\x83\x8e\0" /* offset 10999 */ + "\xe4\xbe\x86\0" /* offset 11003 */ + "\xe5\x86\xb7\0" /* offset 11007 */ + "\xe5\x8b\x9e\0" /* offset 11011 */ + "\xe6\x93\x84\0" /* offset 11015 */ + "\xe6\xab\x93\0" /* offset 11019 */ + "\xe7\x88\x90\0" /* offset 11023 */ + "\xe7\x9b\xa7\0" /* offset 11027 */ + "\xe8\x98\x86\0" /* offset 11031 */ + "\xe8\x99\x9c\0" /* offset 11035 */ + "\xe8\xb7\xaf\0" /* offset 11039 */ + "\xe9\x9c\xb2\0" /* offset 11043 */ + "\xe9\xad\xaf\0" /* offset 11047 */ + "\xe9\xb7\xba\0" /* offset 11051 */ + "\xe7\xa2\x8c\0" /* offset 11055 */ + "\xe7\xa5\xbf\0" /* offset 11059 */ + "\xe7\xb6\xa0\0" /* offset 11063 */ + "\xe8\x8f\x89\0" /* offset 11067 */ + "\xe9\x8c\x84\0" /* offset 11071 */ + "\xe8\xab\x96\0" /* offset 11075 */ + "\xe5\xa3\x9f\0" /* offset 11079 */ + "\xe5\xbc\x84\0" /* offset 11083 */ + "\xe7\xb1\xa0\0" /* offset 11087 */ + "\xe8\x81\xbe\0" /* offset 11091 */ + "\xe7\x89\xa2\0" /* offset 11095 */ + "\xe7\xa3\x8a\0" /* offset 11099 */ + "\xe8\xb3\x82\0" /* offset 11103 */ + "\xe9\x9b\xb7\0" /* offset 11107 */ + "\xe5\xa3\x98\0" /* offset 11111 */ + "\xe5\xb1\xa2\0" /* offset 11115 */ + "\xe6\xa8\x93\0" /* offset 11119 */ + "\xe6\xb7\x9a\0" /* offset 11123 */ + "\xe6\xbc\x8f\0" /* offset 11127 */ + "\xe7\xb4\xaf\0" /* offset 11131 */ + "\xe7\xb8\xb7\0" /* offset 11135 */ + "\xe9\x99\x8b\0" /* offset 11139 */ + "\xe5\x8b\x92\0" /* offset 11143 */ + "\xe8\x82\x8b\0" /* offset 11147 */ + "\xe5\x87\x9c\0" /* offset 11151 */ + "\xe5\x87\x8c\0" /* offset 11155 */ + "\xe7\xa8\x9c\0" /* offset 11159 */ + "\xe7\xb6\xbe\0" /* offset 11163 */ + "\xe8\x8f\xb1\0" /* offset 11167 */ + "\xe9\x99\xb5\0" /* offset 11171 */ + "\xe8\xae\x80\0" /* offset 11175 */ + "\xe6\x8b\x8f\0" /* offset 11179 */ + "\xe8\xab\xbe\0" /* offset 11183 */ + "\xe4\xb8\xb9\0" /* offset 11187 */ + "\xe5\xaf\xa7\0" /* offset 11191 */ + "\xe6\x80\x92\0" /* offset 11195 */ + "\xe7\x8e\x87\0" /* offset 11199 */ + "\xe7\x95\xb0\0" /* offset 11203 */ + "\xe5\x8c\x97\0" /* offset 11207 */ + "\xe7\xa3\xbb\0" /* offset 11211 */ + "\xe4\xbe\xbf\0" /* offset 11215 */ + "\xe5\xbe\xa9\0" /* offset 11219 */ + "\xe4\xb8\x8d\0" /* offset 11223 */ + "\xe6\xb3\x8c\0" /* offset 11227 */ + "\xe6\x95\xb8\0" /* offset 11231 */ + "\xe7\xb4\xa2\0" /* offset 11235 */ + "\xe5\x8f\x83\0" /* offset 11239 */ + "\xe5\xa1\x9e\0" /* offset 11243 */ + "\xe7\x9c\x81\0" /* offset 11247 */ + "\xe8\x91\x89\0" /* offset 11251 */ + "\xe8\xaa\xaa\0" /* offset 11255 */ + "\xe6\xae\xba\0" /* offset 11259 */ + "\xe6\xb2\x88\0" /* offset 11263 */ + "\xe6\x8b\xbe\0" /* offset 11267 */ + "\xe8\x8b\xa5\0" /* offset 11271 */ + "\xe6\x8e\xa0\0" /* offset 11275 */ + "\xe7\x95\xa5\0" /* offset 11279 */ + "\xe4\xba\xae\0" /* offset 11283 */ + "\xe5\x85\xa9\0" /* offset 11287 */ + "\xe5\x87\x89\0" /* offset 11291 */ + "\xe6\xa2\x81\0" /* offset 11295 */ + "\xe7\xb3\xa7\0" /* offset 11299 */ + "\xe8\x89\xaf\0" /* offset 11303 */ + "\xe8\xab\x92\0" /* offset 11307 */ + "\xe9\x87\x8f\0" /* offset 11311 */ + "\xe5\x8b\xb5\0" /* offset 11315 */ + "\xe5\x91\x82\0" /* offset 11319 */ + "\xe5\xbb\xac\0" /* offset 11323 */ + "\xe6\x97\x85\0" /* offset 11327 */ + "\xe6\xbf\xbe\0" /* offset 11331 */ + "\xe7\xa4\xaa\0" /* offset 11335 */ + "\xe9\x96\xad\0" /* offset 11339 */ + "\xe9\xa9\xaa\0" /* offset 11343 */ + "\xe9\xba\x97\0" /* offset 11347 */ + "\xe9\xbb\x8e\0" /* offset 11351 */ + "\xe6\x9b\x86\0" /* offset 11355 */ + "\xe6\xad\xb7\0" /* offset 11359 */ + "\xe8\xbd\xa2\0" /* offset 11363 */ + "\xe5\xb9\xb4\0" /* offset 11367 */ + "\xe6\x86\x90\0" /* offset 11371 */ + "\xe6\x88\x80\0" /* offset 11375 */ + "\xe6\x92\x9a\0" /* offset 11379 */ + "\xe6\xbc\xa3\0" /* offset 11383 */ + "\xe7\x85\x89\0" /* offset 11387 */ + "\xe7\x92\x89\0" /* offset 11391 */ + "\xe7\xa7\x8a\0" /* offset 11395 */ + "\xe7\xb7\xb4\0" /* offset 11399 */ + "\xe8\x81\xaf\0" /* offset 11403 */ + "\xe8\xbc\xa6\0" /* offset 11407 */ + "\xe8\x93\xae\0" /* offset 11411 */ + "\xe9\x80\xa3\0" /* offset 11415 */ + "\xe9\x8d\x8a\0" /* offset 11419 */ + "\xe5\x88\x97\0" /* offset 11423 */ + "\xe5\x8a\xa3\0" /* offset 11427 */ + "\xe5\x92\xbd\0" /* offset 11431 */ + "\xe7\x83\x88\0" /* offset 11435 */ + "\xe8\xa3\x82\0" /* offset 11439 */ + "\xe5\xbb\x89\0" /* offset 11443 */ + "\xe5\xbf\xb5\0" /* offset 11447 */ + "\xe6\x8d\xbb\0" /* offset 11451 */ + "\xe6\xae\xae\0" /* offset 11455 */ + "\xe7\xb0\xbe\0" /* offset 11459 */ + "\xe7\x8d\xb5\0" /* offset 11463 */ + "\xe4\xbb\xa4\0" /* offset 11467 */ + "\xe5\x9b\xb9\0" /* offset 11471 */ + "\xe5\xb6\xba\0" /* offset 11475 */ + "\xe6\x80\x9c\0" /* offset 11479 */ + "\xe7\x8e\xb2\0" /* offset 11483 */ + "\xe7\x91\xa9\0" /* offset 11487 */ + "\xe7\xbe\x9a\0" /* offset 11491 */ + "\xe8\x81\x86\0" /* offset 11495 */ + "\xe9\x88\xb4\0" /* offset 11499 */ + "\xe9\x9b\xb6\0" /* offset 11503 */ + "\xe9\x9d\x88\0" /* offset 11507 */ + "\xe9\xa0\x98\0" /* offset 11511 */ + "\xe4\xbe\x8b\0" /* offset 11515 */ + "\xe7\xa6\xae\0" /* offset 11519 */ + "\xe9\x86\xb4\0" /* offset 11523 */ + "\xe9\x9a\xb8\0" /* offset 11527 */ + "\xe6\x83\xa1\0" /* offset 11531 */ + "\xe4\xba\x86\0" /* offset 11535 */ + "\xe5\x83\x9a\0" /* offset 11539 */ + "\xe5\xaf\xae\0" /* offset 11543 */ + "\xe5\xb0\xbf\0" /* offset 11547 */ + "\xe6\x96\x99\0" /* offset 11551 */ + "\xe7\x87\x8e\0" /* offset 11555 */ + "\xe7\x99\x82\0" /* offset 11559 */ + "\xe8\x93\xbc\0" /* offset 11563 */ + "\xe9\x81\xbc\0" /* offset 11567 */ + "\xe6\x9a\x88\0" /* offset 11571 */ + "\xe9\x98\xae\0" /* offset 11575 */ + "\xe5\x8a\x89\0" /* offset 11579 */ + "\xe6\x9d\xbb\0" /* offset 11583 */ + "\xe6\x9f\xb3\0" /* offset 11587 */ + "\xe6\xb5\x81\0" /* offset 11591 */ + "\xe6\xba\x9c\0" /* offset 11595 */ + "\xe7\x90\x89\0" /* offset 11599 */ + "\xe7\x95\x99\0" /* offset 11603 */ + "\xe7\xa1\xab\0" /* offset 11607 */ + "\xe7\xb4\x90\0" /* offset 11611 */ + "\xe9\xa1\x9e\0" /* offset 11615 */ + "\xe6\x88\xae\0" /* offset 11619 */ + "\xe9\x99\xb8\0" /* offset 11623 */ + "\xe5\x80\xab\0" /* offset 11627 */ + "\xe5\xb4\x99\0" /* offset 11631 */ + "\xe6\xb7\xaa\0" /* offset 11635 */ + "\xe8\xbc\xaa\0" /* offset 11639 */ + "\xe5\xbe\x8b\0" /* offset 11643 */ + "\xe6\x85\x84\0" /* offset 11647 */ + "\xe6\xa0\x97\0" /* offset 11651 */ + "\xe9\x9a\x86\0" /* offset 11655 */ + "\xe5\x88\xa9\0" /* offset 11659 */ + "\xe5\x90\x8f\0" /* offset 11663 */ + "\xe5\xb1\xa5\0" /* offset 11667 */ + "\xe6\x98\x93\0" /* offset 11671 */ + "\xe6\x9d\x8e\0" /* offset 11675 */ + "\xe6\xa2\xa8\0" /* offset 11679 */ + "\xe6\xb3\xa5\0" /* offset 11683 */ + "\xe7\x90\x86\0" /* offset 11687 */ + "\xe7\x97\xa2\0" /* offset 11691 */ + "\xe7\xbd\xb9\0" /* offset 11695 */ + "\xe8\xa3\x8f\0" /* offset 11699 */ + "\xe8\xa3\xa1\0" /* offset 11703 */ + "\xe9\x9b\xa2\0" /* offset 11707 */ + "\xe5\x8c\xbf\0" /* offset 11711 */ + "\xe6\xba\xba\0" /* offset 11715 */ + "\xe5\x90\x9d\0" /* offset 11719 */ + "\xe7\x87\x90\0" /* offset 11723 */ + "\xe7\x92\x98\0" /* offset 11727 */ + "\xe8\x97\xba\0" /* offset 11731 */ + "\xe9\x9a\xa3\0" /* offset 11735 */ + "\xe9\xb1\x97\0" /* offset 11739 */ + "\xe9\xba\x9f\0" /* offset 11743 */ + "\xe6\x9e\x97\0" /* offset 11747 */ + "\xe6\xb7\x8b\0" /* offset 11751 */ + "\xe8\x87\xa8\0" /* offset 11755 */ + "\xe7\xac\xa0\0" /* offset 11759 */ + "\xe7\xb2\x92\0" /* offset 11763 */ + "\xe7\x8b\x80\0" /* offset 11767 */ + "\xe7\x82\x99\0" /* offset 11771 */ + "\xe8\xad\x98\0" /* offset 11775 */ + "\xe4\xbb\x80\0" /* offset 11779 */ + "\xe8\x8c\xb6\0" /* offset 11783 */ + "\xe5\x88\xba\0" /* offset 11787 */ + "\xe5\x88\x87\0" /* offset 11791 */ + "\xe5\xba\xa6\0" /* offset 11795 */ + "\xe6\x8b\x93\0" /* offset 11799 */ + "\xe7\xb3\x96\0" /* offset 11803 */ + "\xe5\xae\x85\0" /* offset 11807 */ + "\xe6\xb4\x9e\0" /* offset 11811 */ + "\xe6\x9a\xb4\0" /* offset 11815 */ + "\xe8\xbc\xbb\0" /* offset 11819 */ + "\xe9\x99\x8d\0" /* offset 11823 */ + "\xe5\xbb\x93\0" /* offset 11827 */ + "\xe5\x85\x80\0" /* offset 11831 */ + "\xe5\x97\x80\0" /* offset 11835 */ + "\xe5\xa1\x9a\0" /* offset 11839 */ + "\xe6\x99\xb4\0" /* offset 11843 */ + "\xe5\x87\x9e\0" /* offset 11847 */ + "\xe7\x8c\xaa\0" /* offset 11851 */ + "\xe7\x9b\x8a\0" /* offset 11855 */ + "\xe7\xa4\xbc\0" /* offset 11859 */ + "\xe7\xa5\x9e\0" /* offset 11863 */ + "\xe7\xa5\xa5\0" /* offset 11867 */ + "\xe7\xa6\x8f\0" /* offset 11871 */ + "\xe9\x9d\x96\0" /* offset 11875 */ + "\xe7\xb2\xbe\0" /* offset 11879 */ + "\xe8\x98\x92\0" /* offset 11883 */ + "\xe8\xab\xb8\0" /* offset 11887 */ + "\xe9\x80\xb8\0" /* offset 11891 */ + "\xe9\x83\xbd\0" /* offset 11895 */ + "\xe9\xa3\xaf\0" /* offset 11899 */ + "\xe9\xa3\xbc\0" /* offset 11903 */ + "\xe9\xa4\xa8\0" /* offset 11907 */ + "\xe9\xb6\xb4\0" /* offset 11911 */ + "\xe4\xbe\xae\0" /* offset 11915 */ + "\xe5\x83\xa7\0" /* offset 11919 */ + "\xe5\x85\x8d\0" /* offset 11923 */ + "\xe5\x8b\x89\0" /* offset 11927 */ + "\xe5\x8b\xa4\0" /* offset 11931 */ + "\xe5\x8d\x91\0" /* offset 11935 */ + "\xe5\x96\x9d\0" /* offset 11939 */ + "\xe5\x98\x86\0" /* offset 11943 */ + "\xe5\x99\xa8\0" /* offset 11947 */ + "\xe5\xa1\x80\0" /* offset 11951 */ + "\xe5\xa2\xa8\0" /* offset 11955 */ + "\xe5\xb1\xa4\0" /* offset 11959 */ + "\xe6\x82\x94\0" /* offset 11963 */ + "\xe6\x85\xa8\0" /* offset 11967 */ + "\xe6\x86\x8e\0" /* offset 11971 */ + "\xe6\x87\xb2\0" /* offset 11975 */ + "\xe6\x95\x8f\0" /* offset 11979 */ + "\xe6\x97\xa2\0" /* offset 11983 */ + "\xe6\x9a\x91\0" /* offset 11987 */ + "\xe6\xa2\x85\0" /* offset 11991 */ + "\xe6\xb5\xb7\0" /* offset 11995 */ + "\xe6\xb8\x9a\0" /* offset 11999 */ + "\xe6\xbc\xa2\0" /* offset 12003 */ + "\xe7\x85\xae\0" /* offset 12007 */ + "\xe7\x88\xab\0" /* offset 12011 */ + "\xe7\x90\xa2\0" /* offset 12015 */ + "\xe7\xa2\x91\0" /* offset 12019 */ + "\xe7\xa5\x89\0" /* offset 12023 */ + "\xe7\xa5\x88\0" /* offset 12027 */ + "\xe7\xa5\x90\0" /* offset 12031 */ + "\xe7\xa5\x96\0" /* offset 12035 */ + "\xe7\xa6\x8d\0" /* offset 12039 */ + "\xe7\xa6\x8e\0" /* offset 12043 */ + "\xe7\xa9\x80\0" /* offset 12047 */ + "\xe7\xaa\x81\0" /* offset 12051 */ + "\xe7\xaf\x80\0" /* offset 12055 */ + "\xe7\xb8\x89\0" /* offset 12059 */ + "\xe7\xb9\x81\0" /* offset 12063 */ + "\xe7\xbd\xb2\0" /* offset 12067 */ + "\xe8\x80\x85\0" /* offset 12071 */ + "\xe8\x87\xad\0" /* offset 12075 */ + "\xe8\x89\xb9\0" /* offset 12079 */ + "\xe8\x91\x97\0" /* offset 12083 */ + "\xe8\xa4\x90\0" /* offset 12087 */ + "\xe8\xa6\x96\0" /* offset 12091 */ + "\xe8\xac\x81\0" /* offset 12095 */ + "\xe8\xac\xb9\0" /* offset 12099 */ + "\xe8\xb3\x93\0" /* offset 12103 */ + "\xe8\xb4\x88\0" /* offset 12107 */ + "\xe8\xbe\xb6\0" /* offset 12111 */ + "\xe9\x9b\xa3\0" /* offset 12115 */ + "\xe9\x9f\xbf\0" /* offset 12119 */ + "\xe9\xa0\xbb\0" /* offset 12123 */ + "\xe4\xb8\xa6\0" /* offset 12127 */ + "\xe5\x86\xb5\0" /* offset 12131 */ + "\xe5\x85\xa8\0" /* offset 12135 */ + "\xe4\xbe\x80\0" /* offset 12139 */ + "\xe5\x85\x85\0" /* offset 12143 */ + "\xe5\x86\x80\0" /* offset 12147 */ + "\xe5\x8b\x87\0" /* offset 12151 */ + "\xe5\x8b\xba\0" /* offset 12155 */ + "\xe5\x95\x95\0" /* offset 12159 */ + "\xe5\x96\x99\0" /* offset 12163 */ + "\xe5\x97\xa2\0" /* offset 12167 */ + "\xe5\xa2\xb3\0" /* offset 12171 */ + "\xe5\xa5\x84\0" /* offset 12175 */ + "\xe5\xa5\x94\0" /* offset 12179 */ + "\xe5\xa9\xa2\0" /* offset 12183 */ + "\xe5\xac\xa8\0" /* offset 12187 */ + "\xe5\xbb\x92\0" /* offset 12191 */ + "\xe5\xbb\x99\0" /* offset 12195 */ + "\xe5\xbd\xa9\0" /* offset 12199 */ + "\xe5\xbe\xad\0" /* offset 12203 */ + "\xe6\x83\x98\0" /* offset 12207 */ + "\xe6\x85\x8e\0" /* offset 12211 */ + "\xe6\x84\x88\0" /* offset 12215 */ + "\xe6\x85\xa0\0" /* offset 12219 */ + "\xe6\x88\xb4\0" /* offset 12223 */ + "\xe6\x8f\x84\0" /* offset 12227 */ + "\xe6\x90\x9c\0" /* offset 12231 */ + "\xe6\x91\x92\0" /* offset 12235 */ + "\xe6\x95\x96\0" /* offset 12239 */ + "\xe6\x9c\x9b\0" /* offset 12243 */ + "\xe6\x9d\x96\0" /* offset 12247 */ + "\xe6\xbb\x9b\0" /* offset 12251 */ + "\xe6\xbb\x8b\0" /* offset 12255 */ + "\xe7\x80\x9e\0" /* offset 12259 */ + "\xe7\x9e\xa7\0" /* offset 12263 */ + "\xe7\x88\xb5\0" /* offset 12267 */ + "\xe7\x8a\xaf\0" /* offset 12271 */ + "\xe7\x91\xb1\0" /* offset 12275 */ + "\xe7\x94\x86\0" /* offset 12279 */ + "\xe7\x94\xbb\0" /* offset 12283 */ + "\xe7\x98\x9d\0" /* offset 12287 */ + "\xe7\x98\x9f\0" /* offset 12291 */ + "\xe7\x9b\x9b\0" /* offset 12295 */ + "\xe7\x9b\xb4\0" /* offset 12299 */ + "\xe7\x9d\x8a\0" /* offset 12303 */ + "\xe7\x9d\x80\0" /* offset 12307 */ + "\xe7\xa3\x8c\0" /* offset 12311 */ + "\xe7\xaa\xb1\0" /* offset 12315 */ + "\xe7\xb1\xbb\0" /* offset 12319 */ + "\xe7\xb5\x9b\0" /* offset 12323 */ + "\xe7\xbc\xbe\0" /* offset 12327 */ + "\xe8\x8d\x92\0" /* offset 12331 */ + "\xe8\x8f\xaf\0" /* offset 12335 */ + "\xe8\x9d\xb9\0" /* offset 12339 */ + "\xe8\xa5\x81\0" /* offset 12343 */ + "\xe8\xa6\x86\0" /* offset 12347 */ + "\xe8\xaa\xbf\0" /* offset 12351 */ + "\xe8\xab\x8b\0" /* offset 12355 */ + "\xe8\xab\xad\0" /* offset 12359 */ + "\xe8\xae\x8a\0" /* offset 12363 */ + "\xe8\xbc\xb8\0" /* offset 12367 */ + "\xe9\x81\xb2\0" /* offset 12371 */ + "\xe9\x86\x99\0" /* offset 12375 */ + "\xe9\x89\xb6\0" /* offset 12379 */ + "\xe9\x99\xbc\0" /* offset 12383 */ + "\xe9\x9f\x9b\0" /* offset 12387 */ + "\xe9\xa0\x8b\0" /* offset 12391 */ + "\xe9\xac\x92\0" /* offset 12395 */ + "\xf0\xa2\xa1\x8a\0" /* offset 12399 */ + "\xf0\xa2\xa1\x84\0" /* offset 12404 */ + "\xf0\xa3\x8f\x95\0" /* offset 12409 */ + "\xe3\xae\x9d\0" /* offset 12414 */ + "\xe4\x80\x98\0" /* offset 12418 */ + "\xe4\x80\xb9\0" /* offset 12422 */ + "\xf0\xa5\x89\x89\0" /* offset 12426 */ + "\xf0\xa5\xb3\x90\0" /* offset 12431 */ + "\xf0\xa7\xbb\x93\0" /* offset 12436 */ + "\xe9\xbd\x83\0" /* offset 12441 */ + "\xe9\xbe\x8e\0" /* offset 12445 */ + "\x66\x66\0" /* offset 12449 */ + "\x66\x69\0" /* offset 12452 */ + "\x66\x6c\0" /* offset 12455 */ + "\x66\x66\x69\0" /* offset 12458 */ + "\x66\x66\x6c\0" /* offset 12462 */ + "\x73\x74\0" /* offset 12466 */ + "\xd5\xb4\xd5\xb6\0" /* offset 12469 */ + "\xd5\xb4\xd5\xa5\0" /* offset 12474 */ + "\xd5\xb4\xd5\xab\0" /* offset 12479 */ + "\xd5\xbe\xd5\xb6\0" /* offset 12484 */ + "\xd5\xb4\xd5\xad\0" /* offset 12489 */ + "\xd7\x99\xd6\xb4\0" /* offset 12494 */ + "\xd7\xb2\xd6\xb7\0" /* offset 12499 */ + "\xd7\xa2\0" /* offset 12504 */ + "\xd7\x94\0" /* offset 12507 */ + "\xd7\x9b\0" /* offset 12510 */ + "\xd7\x9c\0" /* offset 12513 */ + "\xd7\x9d\0" /* offset 12516 */ + "\xd7\xa8\0" /* offset 12519 */ + "\xd7\xaa\0" /* offset 12522 */ + "\xd7\xa9\xd7\x81\0" /* offset 12525 */ + "\xd7\xa9\xd7\x82\0" /* offset 12530 */ + "\xd7\xa9\xd6\xbc\xd7\x81\0" /* offset 12535 */ + "\xd7\xa9\xd6\xbc\xd7\x82\0" /* offset 12542 */ + "\xd7\x90\xd6\xb7\0" /* offset 12549 */ + "\xd7\x90\xd6\xb8\0" /* offset 12554 */ + "\xd7\x90\xd6\xbc\0" /* offset 12559 */ + "\xd7\x91\xd6\xbc\0" /* offset 12564 */ + "\xd7\x92\xd6\xbc\0" /* offset 12569 */ + "\xd7\x93\xd6\xbc\0" /* offset 12574 */ + "\xd7\x94\xd6\xbc\0" /* offset 12579 */ + "\xd7\x95\xd6\xbc\0" /* offset 12584 */ + "\xd7\x96\xd6\xbc\0" /* offset 12589 */ + "\xd7\x98\xd6\xbc\0" /* offset 12594 */ + "\xd7\x99\xd6\xbc\0" /* offset 12599 */ + "\xd7\x9a\xd6\xbc\0" /* offset 12604 */ + "\xd7\x9b\xd6\xbc\0" /* offset 12609 */ + "\xd7\x9c\xd6\xbc\0" /* offset 12614 */ + "\xd7\x9e\xd6\xbc\0" /* offset 12619 */ + "\xd7\xa0\xd6\xbc\0" /* offset 12624 */ + "\xd7\xa1\xd6\xbc\0" /* offset 12629 */ + "\xd7\xa3\xd6\xbc\0" /* offset 12634 */ + "\xd7\xa4\xd6\xbc\0" /* offset 12639 */ + "\xd7\xa6\xd6\xbc\0" /* offset 12644 */ + "\xd7\xa7\xd6\xbc\0" /* offset 12649 */ + "\xd7\xa8\xd6\xbc\0" /* offset 12654 */ + "\xd7\xa9\xd6\xbc\0" /* offset 12659 */ + "\xd7\xaa\xd6\xbc\0" /* offset 12664 */ + "\xd7\x95\xd6\xb9\0" /* offset 12669 */ + "\xd7\x91\xd6\xbf\0" /* offset 12674 */ + "\xd7\x9b\xd6\xbf\0" /* offset 12679 */ + "\xd7\xa4\xd6\xbf\0" /* offset 12684 */ + "\xd7\x90\xd7\x9c\0" /* offset 12689 */ + "\xd9\xb1\0" /* offset 12694 */ + "\xd9\xbb\0" /* offset 12697 */ + "\xd9\xbe\0" /* offset 12700 */ + "\xda\x80\0" /* offset 12703 */ + "\xd9\xba\0" /* offset 12706 */ + "\xd9\xbf\0" /* offset 12709 */ + "\xd9\xb9\0" /* offset 12712 */ + "\xda\xa4\0" /* offset 12715 */ + "\xda\xa6\0" /* offset 12718 */ + "\xda\x84\0" /* offset 12721 */ + "\xda\x83\0" /* offset 12724 */ + "\xda\x86\0" /* offset 12727 */ + "\xda\x87\0" /* offset 12730 */ + "\xda\x8d\0" /* offset 12733 */ + "\xda\x8c\0" /* offset 12736 */ + "\xda\x8e\0" /* offset 12739 */ + "\xda\x88\0" /* offset 12742 */ + "\xda\x98\0" /* offset 12745 */ + "\xda\x91\0" /* offset 12748 */ + "\xda\xa9\0" /* offset 12751 */ + "\xda\xaf\0" /* offset 12754 */ + "\xda\xb3\0" /* offset 12757 */ + "\xda\xb1\0" /* offset 12760 */ + "\xda\xba\0" /* offset 12763 */ + "\xda\xbb\0" /* offset 12766 */ + "\xdb\x81\0" /* offset 12769 */ + "\xda\xbe\0" /* offset 12772 */ + "\xdb\x92\0" /* offset 12775 */ + "\xda\xad\0" /* offset 12778 */ + "\xdb\x87\0" /* offset 12781 */ + "\xdb\x86\0" /* offset 12784 */ + "\xdb\x88\0" /* offset 12787 */ + "\xdb\x8b\0" /* offset 12790 */ + "\xdb\x85\0" /* offset 12793 */ + "\xdb\x89\0" /* offset 12796 */ + "\xdb\x90\0" /* offset 12799 */ + "\xd9\x89\0" /* offset 12802 */ + "\xd9\x8a\xd9\x94\xd8\xa7\0" /* offset 12805 */ + "\xd9\x8a\xd9\x94\xdb\x95\0" /* offset 12812 */ + "\xd9\x8a\xd9\x94\xd9\x88\0" /* offset 12819 */ + "\xd9\x8a\xd9\x94\xdb\x87\0" /* offset 12826 */ + "\xd9\x8a\xd9\x94\xdb\x86\0" /* offset 12833 */ + "\xd9\x8a\xd9\x94\xdb\x88\0" /* offset 12840 */ + "\xd9\x8a\xd9\x94\xdb\x90\0" /* offset 12847 */ + "\xd9\x8a\xd9\x94\xd9\x89\0" /* offset 12854 */ + "\xdb\x8c\0" /* offset 12861 */ + "\xd9\x8a\xd9\x94\xd8\xac\0" /* offset 12864 */ + "\xd9\x8a\xd9\x94\xd8\xad\0" /* offset 12871 */ + "\xd9\x8a\xd9\x94\xd9\x85\0" /* offset 12878 */ + "\xd9\x8a\xd9\x94\xd9\x8a\0" /* offset 12885 */ + "\xd8\xa8\xd8\xac\0" /* offset 12892 */ + "\xd8\xa8\xd8\xad\0" /* offset 12897 */ + "\xd8\xa8\xd8\xae\0" /* offset 12902 */ + "\xd8\xa8\xd9\x85\0" /* offset 12907 */ + "\xd8\xa8\xd9\x89\0" /* offset 12912 */ + "\xd8\xa8\xd9\x8a\0" /* offset 12917 */ + "\xd8\xaa\xd8\xac\0" /* offset 12922 */ + "\xd8\xaa\xd8\xad\0" /* offset 12927 */ + "\xd8\xaa\xd8\xae\0" /* offset 12932 */ + "\xd8\xaa\xd9\x85\0" /* offset 12937 */ + "\xd8\xaa\xd9\x89\0" /* offset 12942 */ + "\xd8\xaa\xd9\x8a\0" /* offset 12947 */ + "\xd8\xab\xd8\xac\0" /* offset 12952 */ + "\xd8\xab\xd9\x85\0" /* offset 12957 */ + "\xd8\xab\xd9\x89\0" /* offset 12962 */ + "\xd8\xab\xd9\x8a\0" /* offset 12967 */ + "\xd8\xac\xd8\xad\0" /* offset 12972 */ + "\xd8\xac\xd9\x85\0" /* offset 12977 */ + "\xd8\xad\xd8\xac\0" /* offset 12982 */ + "\xd8\xad\xd9\x85\0" /* offset 12987 */ + "\xd8\xae\xd8\xac\0" /* offset 12992 */ + "\xd8\xae\xd8\xad\0" /* offset 12997 */ + "\xd8\xae\xd9\x85\0" /* offset 13002 */ + "\xd8\xb3\xd8\xac\0" /* offset 13007 */ + "\xd8\xb3\xd8\xad\0" /* offset 13012 */ + "\xd8\xb3\xd8\xae\0" /* offset 13017 */ + "\xd8\xb3\xd9\x85\0" /* offset 13022 */ + "\xd8\xb5\xd8\xad\0" /* offset 13027 */ + "\xd8\xb5\xd9\x85\0" /* offset 13032 */ + "\xd8\xb6\xd8\xac\0" /* offset 13037 */ + "\xd8\xb6\xd8\xad\0" /* offset 13042 */ + "\xd8\xb6\xd8\xae\0" /* offset 13047 */ + "\xd8\xb6\xd9\x85\0" /* offset 13052 */ + "\xd8\xb7\xd8\xad\0" /* offset 13057 */ + "\xd8\xb7\xd9\x85\0" /* offset 13062 */ + "\xd8\xb8\xd9\x85\0" /* offset 13067 */ + "\xd8\xb9\xd8\xac\0" /* offset 13072 */ + "\xd8\xb9\xd9\x85\0" /* offset 13077 */ + "\xd8\xba\xd8\xac\0" /* offset 13082 */ + "\xd8\xba\xd9\x85\0" /* offset 13087 */ + "\xd9\x81\xd8\xac\0" /* offset 13092 */ + "\xd9\x81\xd8\xad\0" /* offset 13097 */ + "\xd9\x81\xd8\xae\0" /* offset 13102 */ + "\xd9\x81\xd9\x85\0" /* offset 13107 */ + "\xd9\x81\xd9\x89\0" /* offset 13112 */ + "\xd9\x81\xd9\x8a\0" /* offset 13117 */ + "\xd9\x82\xd8\xad\0" /* offset 13122 */ + "\xd9\x82\xd9\x85\0" /* offset 13127 */ + "\xd9\x82\xd9\x89\0" /* offset 13132 */ + "\xd9\x82\xd9\x8a\0" /* offset 13137 */ + "\xd9\x83\xd8\xa7\0" /* offset 13142 */ + "\xd9\x83\xd8\xac\0" /* offset 13147 */ + "\xd9\x83\xd8\xad\0" /* offset 13152 */ + "\xd9\x83\xd8\xae\0" /* offset 13157 */ + "\xd9\x83\xd9\x84\0" /* offset 13162 */ + "\xd9\x83\xd9\x85\0" /* offset 13167 */ + "\xd9\x83\xd9\x89\0" /* offset 13172 */ + "\xd9\x83\xd9\x8a\0" /* offset 13177 */ + "\xd9\x84\xd8\xac\0" /* offset 13182 */ + "\xd9\x84\xd8\xad\0" /* offset 13187 */ + "\xd9\x84\xd8\xae\0" /* offset 13192 */ + "\xd9\x84\xd9\x85\0" /* offset 13197 */ + "\xd9\x84\xd9\x89\0" /* offset 13202 */ + "\xd9\x84\xd9\x8a\0" /* offset 13207 */ + "\xd9\x85\xd8\xac\0" /* offset 13212 */ + "\xd9\x85\xd8\xad\0" /* offset 13217 */ + "\xd9\x85\xd8\xae\0" /* offset 13222 */ + "\xd9\x85\xd9\x85\0" /* offset 13227 */ + "\xd9\x85\xd9\x89\0" /* offset 13232 */ + "\xd9\x85\xd9\x8a\0" /* offset 13237 */ + "\xd9\x86\xd8\xac\0" /* offset 13242 */ + "\xd9\x86\xd8\xad\0" /* offset 13247 */ + "\xd9\x86\xd8\xae\0" /* offset 13252 */ + "\xd9\x86\xd9\x85\0" /* offset 13257 */ + "\xd9\x86\xd9\x89\0" /* offset 13262 */ + "\xd9\x86\xd9\x8a\0" /* offset 13267 */ + "\xd9\x87\xd8\xac\0" /* offset 13272 */ + "\xd9\x87\xd9\x85\0" /* offset 13277 */ + "\xd9\x87\xd9\x89\0" /* offset 13282 */ + "\xd9\x87\xd9\x8a\0" /* offset 13287 */ + "\xd9\x8a\xd8\xac\0" /* offset 13292 */ + "\xd9\x8a\xd8\xad\0" /* offset 13297 */ + "\xd9\x8a\xd8\xae\0" /* offset 13302 */ + "\xd9\x8a\xd9\x85\0" /* offset 13307 */ + "\xd9\x8a\xd9\x89\0" /* offset 13312 */ + "\xd9\x8a\xd9\x8a\0" /* offset 13317 */ + "\xd8\xb0\xd9\xb0\0" /* offset 13322 */ + "\xd8\xb1\xd9\xb0\0" /* offset 13327 */ + "\xd9\x89\xd9\xb0\0" /* offset 13332 */ + "\x20\xd9\x8c\xd9\x91\0" /* offset 13337 */ + "\x20\xd9\x8d\xd9\x91\0" /* offset 13343 */ + "\x20\xd9\x8e\xd9\x91\0" /* offset 13349 */ + "\x20\xd9\x8f\xd9\x91\0" /* offset 13355 */ + "\x20\xd9\x90\xd9\x91\0" /* offset 13361 */ + "\x20\xd9\x91\xd9\xb0\0" /* offset 13367 */ + "\xd9\x8a\xd9\x94\xd8\xb1\0" /* offset 13373 */ + "\xd9\x8a\xd9\x94\xd8\xb2\0" /* offset 13380 */ + "\xd9\x8a\xd9\x94\xd9\x86\0" /* offset 13387 */ + "\xd8\xa8\xd8\xb1\0" /* offset 13394 */ + "\xd8\xa8\xd8\xb2\0" /* offset 13399 */ + "\xd8\xa8\xd9\x86\0" /* offset 13404 */ + "\xd8\xaa\xd8\xb1\0" /* offset 13409 */ + "\xd8\xaa\xd8\xb2\0" /* offset 13414 */ + "\xd8\xaa\xd9\x86\0" /* offset 13419 */ + "\xd8\xab\xd8\xb1\0" /* offset 13424 */ + "\xd8\xab\xd8\xb2\0" /* offset 13429 */ + "\xd8\xab\xd9\x86\0" /* offset 13434 */ + "\xd9\x85\xd8\xa7\0" /* offset 13439 */ + "\xd9\x86\xd8\xb1\0" /* offset 13444 */ + "\xd9\x86\xd8\xb2\0" /* offset 13449 */ + "\xd9\x86\xd9\x86\0" /* offset 13454 */ + "\xd9\x8a\xd8\xb1\0" /* offset 13459 */ + "\xd9\x8a\xd8\xb2\0" /* offset 13464 */ + "\xd9\x8a\xd9\x86\0" /* offset 13469 */ + "\xd9\x8a\xd9\x94\xd8\xae\0" /* offset 13474 */ + "\xd9\x8a\xd9\x94\xd9\x87\0" /* offset 13481 */ + "\xd8\xa8\xd9\x87\0" /* offset 13488 */ + "\xd8\xaa\xd9\x87\0" /* offset 13493 */ + "\xd8\xb5\xd8\xae\0" /* offset 13498 */ + "\xd9\x84\xd9\x87\0" /* offset 13503 */ + "\xd9\x86\xd9\x87\0" /* offset 13508 */ + "\xd9\x87\xd9\xb0\0" /* offset 13513 */ + "\xd9\x8a\xd9\x87\0" /* offset 13518 */ + "\xd8\xab\xd9\x87\0" /* offset 13523 */ + "\xd8\xb3\xd9\x87\0" /* offset 13528 */ + "\xd8\xb4\xd9\x85\0" /* offset 13533 */ + "\xd8\xb4\xd9\x87\0" /* offset 13538 */ + "\xd9\x80\xd9\x8e\xd9\x91\0" /* offset 13543 */ + "\xd9\x80\xd9\x8f\xd9\x91\0" /* offset 13550 */ + "\xd9\x80\xd9\x90\xd9\x91\0" /* offset 13557 */ + "\xd8\xb7\xd9\x89\0" /* offset 13564 */ + "\xd8\xb7\xd9\x8a\0" /* offset 13569 */ + "\xd8\xb9\xd9\x89\0" /* offset 13574 */ + "\xd8\xb9\xd9\x8a\0" /* offset 13579 */ + "\xd8\xba\xd9\x89\0" /* offset 13584 */ + "\xd8\xba\xd9\x8a\0" /* offset 13589 */ + "\xd8\xb3\xd9\x89\0" /* offset 13594 */ + "\xd8\xb3\xd9\x8a\0" /* offset 13599 */ + "\xd8\xb4\xd9\x89\0" /* offset 13604 */ + "\xd8\xb4\xd9\x8a\0" /* offset 13609 */ + "\xd8\xad\xd9\x89\0" /* offset 13614 */ + "\xd8\xad\xd9\x8a\0" /* offset 13619 */ + "\xd8\xac\xd9\x89\0" /* offset 13624 */ + "\xd8\xac\xd9\x8a\0" /* offset 13629 */ + "\xd8\xae\xd9\x89\0" /* offset 13634 */ + "\xd8\xae\xd9\x8a\0" /* offset 13639 */ + "\xd8\xb5\xd9\x89\0" /* offset 13644 */ + "\xd8\xb5\xd9\x8a\0" /* offset 13649 */ + "\xd8\xb6\xd9\x89\0" /* offset 13654 */ + "\xd8\xb6\xd9\x8a\0" /* offset 13659 */ + "\xd8\xb4\xd8\xac\0" /* offset 13664 */ + "\xd8\xb4\xd8\xad\0" /* offset 13669 */ + "\xd8\xb4\xd8\xae\0" /* offset 13674 */ + "\xd8\xb4\xd8\xb1\0" /* offset 13679 */ + "\xd8\xb3\xd8\xb1\0" /* offset 13684 */ + "\xd8\xb5\xd8\xb1\0" /* offset 13689 */ + "\xd8\xb6\xd8\xb1\0" /* offset 13694 */ + "\xd8\xa7\xd9\x8b\0" /* offset 13699 */ + "\xd8\xaa\xd8\xac\xd9\x85\0" /* offset 13704 */ + "\xd8\xaa\xd8\xad\xd8\xac\0" /* offset 13711 */ + "\xd8\xaa\xd8\xad\xd9\x85\0" /* offset 13718 */ + "\xd8\xaa\xd8\xae\xd9\x85\0" /* offset 13725 */ + "\xd8\xaa\xd9\x85\xd8\xac\0" /* offset 13732 */ + "\xd8\xaa\xd9\x85\xd8\xad\0" /* offset 13739 */ + "\xd8\xaa\xd9\x85\xd8\xae\0" /* offset 13746 */ + "\xd8\xac\xd9\x85\xd8\xad\0" /* offset 13753 */ + "\xd8\xad\xd9\x85\xd9\x8a\0" /* offset 13760 */ + "\xd8\xad\xd9\x85\xd9\x89\0" /* offset 13767 */ + "\xd8\xb3\xd8\xad\xd8\xac\0" /* offset 13774 */ + "\xd8\xb3\xd8\xac\xd8\xad\0" /* offset 13781 */ + "\xd8\xb3\xd8\xac\xd9\x89\0" /* offset 13788 */ + "\xd8\xb3\xd9\x85\xd8\xad\0" /* offset 13795 */ + "\xd8\xb3\xd9\x85\xd8\xac\0" /* offset 13802 */ + "\xd8\xb3\xd9\x85\xd9\x85\0" /* offset 13809 */ + "\xd8\xb5\xd8\xad\xd8\xad\0" /* offset 13816 */ + "\xd8\xb5\xd9\x85\xd9\x85\0" /* offset 13823 */ + "\xd8\xb4\xd8\xad\xd9\x85\0" /* offset 13830 */ + "\xd8\xb4\xd8\xac\xd9\x8a\0" /* offset 13837 */ + "\xd8\xb4\xd9\x85\xd8\xae\0" /* offset 13844 */ + "\xd8\xb4\xd9\x85\xd9\x85\0" /* offset 13851 */ + "\xd8\xb6\xd8\xad\xd9\x89\0" /* offset 13858 */ + "\xd8\xb6\xd8\xae\xd9\x85\0" /* offset 13865 */ + "\xd8\xb7\xd9\x85\xd8\xad\0" /* offset 13872 */ + "\xd8\xb7\xd9\x85\xd9\x85\0" /* offset 13879 */ + "\xd8\xb7\xd9\x85\xd9\x8a\0" /* offset 13886 */ + "\xd8\xb9\xd8\xac\xd9\x85\0" /* offset 13893 */ + "\xd8\xb9\xd9\x85\xd9\x85\0" /* offset 13900 */ + "\xd8\xb9\xd9\x85\xd9\x89\0" /* offset 13907 */ + "\xd8\xba\xd9\x85\xd9\x85\0" /* offset 13914 */ + "\xd8\xba\xd9\x85\xd9\x8a\0" /* offset 13921 */ + "\xd8\xba\xd9\x85\xd9\x89\0" /* offset 13928 */ + "\xd9\x81\xd8\xae\xd9\x85\0" /* offset 13935 */ + "\xd9\x82\xd9\x85\xd8\xad\0" /* offset 13942 */ + "\xd9\x82\xd9\x85\xd9\x85\0" /* offset 13949 */ + "\xd9\x84\xd8\xad\xd9\x85\0" /* offset 13956 */ + "\xd9\x84\xd8\xad\xd9\x8a\0" /* offset 13963 */ + "\xd9\x84\xd8\xad\xd9\x89\0" /* offset 13970 */ + "\xd9\x84\xd8\xac\xd8\xac\0" /* offset 13977 */ + "\xd9\x84\xd8\xae\xd9\x85\0" /* offset 13984 */ + "\xd9\x84\xd9\x85\xd8\xad\0" /* offset 13991 */ + "\xd9\x85\xd8\xad\xd8\xac\0" /* offset 13998 */ + "\xd9\x85\xd8\xad\xd9\x85\0" /* offset 14005 */ + "\xd9\x85\xd8\xad\xd9\x8a\0" /* offset 14012 */ + "\xd9\x85\xd8\xac\xd8\xad\0" /* offset 14019 */ + "\xd9\x85\xd8\xac\xd9\x85\0" /* offset 14026 */ + "\xd9\x85\xd8\xae\xd8\xac\0" /* offset 14033 */ + "\xd9\x85\xd8\xae\xd9\x85\0" /* offset 14040 */ + "\xd9\x85\xd8\xac\xd8\xae\0" /* offset 14047 */ + "\xd9\x87\xd9\x85\xd8\xac\0" /* offset 14054 */ + "\xd9\x87\xd9\x85\xd9\x85\0" /* offset 14061 */ + "\xd9\x86\xd8\xad\xd9\x85\0" /* offset 14068 */ + "\xd9\x86\xd8\xad\xd9\x89\0" /* offset 14075 */ + "\xd9\x86\xd8\xac\xd9\x85\0" /* offset 14082 */ + "\xd9\x86\xd8\xac\xd9\x89\0" /* offset 14089 */ + "\xd9\x86\xd9\x85\xd9\x8a\0" /* offset 14096 */ + "\xd9\x86\xd9\x85\xd9\x89\0" /* offset 14103 */ + "\xd9\x8a\xd9\x85\xd9\x85\0" /* offset 14110 */ + "\xd8\xa8\xd8\xae\xd9\x8a\0" /* offset 14117 */ + "\xd8\xaa\xd8\xac\xd9\x8a\0" /* offset 14124 */ + "\xd8\xaa\xd8\xac\xd9\x89\0" /* offset 14131 */ + "\xd8\xaa\xd8\xae\xd9\x8a\0" /* offset 14138 */ + "\xd8\xaa\xd8\xae\xd9\x89\0" /* offset 14145 */ + "\xd8\xaa\xd9\x85\xd9\x8a\0" /* offset 14152 */ + "\xd8\xaa\xd9\x85\xd9\x89\0" /* offset 14159 */ + "\xd8\xac\xd9\x85\xd9\x8a\0" /* offset 14166 */ + "\xd8\xac\xd8\xad\xd9\x89\0" /* offset 14173 */ + "\xd8\xac\xd9\x85\xd9\x89\0" /* offset 14180 */ + "\xd8\xb3\xd8\xae\xd9\x89\0" /* offset 14187 */ + "\xd8\xb5\xd8\xad\xd9\x8a\0" /* offset 14194 */ + "\xd8\xb4\xd8\xad\xd9\x8a\0" /* offset 14201 */ + "\xd8\xb6\xd8\xad\xd9\x8a\0" /* offset 14208 */ + "\xd9\x84\xd8\xac\xd9\x8a\0" /* offset 14215 */ + "\xd9\x84\xd9\x85\xd9\x8a\0" /* offset 14222 */ + "\xd9\x8a\xd8\xad\xd9\x8a\0" /* offset 14229 */ + "\xd9\x8a\xd8\xac\xd9\x8a\0" /* offset 14236 */ + "\xd9\x8a\xd9\x85\xd9\x8a\0" /* offset 14243 */ + "\xd9\x85\xd9\x85\xd9\x8a\0" /* offset 14250 */ + "\xd9\x82\xd9\x85\xd9\x8a\0" /* offset 14257 */ + "\xd9\x86\xd8\xad\xd9\x8a\0" /* offset 14264 */ + "\xd8\xb9\xd9\x85\xd9\x8a\0" /* offset 14271 */ + "\xd9\x83\xd9\x85\xd9\x8a\0" /* offset 14278 */ + "\xd9\x86\xd8\xac\xd8\xad\0" /* offset 14285 */ + "\xd9\x85\xd8\xae\xd9\x8a\0" /* offset 14292 */ + "\xd9\x84\xd8\xac\xd9\x85\0" /* offset 14299 */ + "\xd9\x83\xd9\x85\xd9\x85\0" /* offset 14306 */ + "\xd8\xac\xd8\xad\xd9\x8a\0" /* offset 14313 */ + "\xd8\xad\xd8\xac\xd9\x8a\0" /* offset 14320 */ + "\xd9\x85\xd8\xac\xd9\x8a\0" /* offset 14327 */ + "\xd9\x81\xd9\x85\xd9\x8a\0" /* offset 14334 */ + "\xd8\xa8\xd8\xad\xd9\x8a\0" /* offset 14341 */ + "\xd8\xb3\xd8\xae\xd9\x8a\0" /* offset 14348 */ + "\xd9\x86\xd8\xac\xd9\x8a\0" /* offset 14355 */ + "\xd8\xb5\xd9\x84\xdb\x92\0" /* offset 14362 */ + "\xd9\x82\xd9\x84\xdb\x92\0" /* offset 14369 */ + "\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\0" /* offset 14376 */ + "\xd8\xa7\xd9\x83\xd8\xa8\xd8\xb1\0" /* offset 14385 */ + "\xd9\x85\xd8\xad\xd9\x85\xd8\xaf\0" /* offset 14394 */ + "\xd8\xb5\xd9\x84\xd8\xb9\xd9\x85\0" /* offset 14403 */ + "\xd8\xb1\xd8\xb3\xd9\x88\xd9\x84\0" /* offset 14412 */ + "\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\0" /* offset 14421 */ + "\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14430 */ + "\xd8\xb5\xd9\x84\xd9\x89\0" /* offset 14439 */ + "\xd8\xb5\xd9\x84\xd9\x89\x20\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\x20\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\x20\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14446 */ + "\xd8\xac\xd9\x84\x20\xd8\xac\xd9\x84\xd8\xa7\xd9\x84\xd9\x87\0" /* offset 14480 */ + "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" /* offset 14496 */ + "\x2c\0" /* offset 14505 */ + "\xe3\x80\x81\0" /* offset 14507 */ + "\xe3\x80\x82\0" /* offset 14511 */ + "\x3a\0" /* offset 14515 */ + "\x21\0" /* offset 14517 */ + "\x3f\0" /* offset 14519 */ + "\xe3\x80\x96\0" /* offset 14521 */ + "\xe3\x80\x97\0" /* offset 14525 */ + "\xe2\x80\x94\0" /* offset 14529 */ + "\xe2\x80\x93\0" /* offset 14533 */ + "\x5f\0" /* offset 14537 */ + "\x7b\0" /* offset 14539 */ + "\x7d\0" /* offset 14541 */ + "\xe3\x80\x94\0" /* offset 14543 */ + "\xe3\x80\x95\0" /* offset 14547 */ + "\xe3\x80\x90\0" /* offset 14551 */ + "\xe3\x80\x91\0" /* offset 14555 */ + "\xe3\x80\x8a\0" /* offset 14559 */ + "\xe3\x80\x8b\0" /* offset 14563 */ + "\xe3\x80\x8c\0" /* offset 14567 */ + "\xe3\x80\x8d\0" /* offset 14571 */ + "\xe3\x80\x8e\0" /* offset 14575 */ + "\xe3\x80\x8f\0" /* offset 14579 */ + "\x5b\0" /* offset 14583 */ + "\x5d\0" /* offset 14585 */ + "\x23\0" /* offset 14587 */ + "\x26\0" /* offset 14589 */ + "\x2a\0" /* offset 14591 */ + "\x2d\0" /* offset 14593 */ + "\x3c\0" /* offset 14595 */ + "\x3e\0" /* offset 14597 */ + "\x5c\0" /* offset 14599 */ + "\x24\0" /* offset 14601 */ + "\x25\0" /* offset 14603 */ + "\x40\0" /* offset 14605 */ + "\x20\xd9\x8b\0" /* offset 14607 */ + "\xd9\x80\xd9\x8b\0" /* offset 14611 */ + "\x20\xd9\x8c\0" /* offset 14616 */ + "\x20\xd9\x8d\0" /* offset 14620 */ + "\x20\xd9\x8e\0" /* offset 14624 */ + "\xd9\x80\xd9\x8e\0" /* offset 14628 */ + "\x20\xd9\x8f\0" /* offset 14633 */ + "\xd9\x80\xd9\x8f\0" /* offset 14637 */ + "\x20\xd9\x90\0" /* offset 14642 */ + "\xd9\x80\xd9\x90\0" /* offset 14646 */ + "\x20\xd9\x91\0" /* offset 14651 */ + "\xd9\x80\xd9\x91\0" /* offset 14655 */ + "\x20\xd9\x92\0" /* offset 14660 */ + "\xd9\x80\xd9\x92\0" /* offset 14664 */ + "\xd8\xa1\0" /* offset 14669 */ + "\xd8\xa7\0" /* offset 14672 */ + "\xd8\xa8\0" /* offset 14675 */ + "\xd8\xa9\0" /* offset 14678 */ + "\xd8\xaa\0" /* offset 14681 */ + "\xd8\xab\0" /* offset 14684 */ + "\xd8\xac\0" /* offset 14687 */ + "\xd8\xad\0" /* offset 14690 */ + "\xd8\xae\0" /* offset 14693 */ + "\xd8\xaf\0" /* offset 14696 */ + "\xd8\xb0\0" /* offset 14699 */ + "\xd8\xb1\0" /* offset 14702 */ + "\xd8\xb2\0" /* offset 14705 */ + "\xd8\xb3\0" /* offset 14708 */ + "\xd8\xb4\0" /* offset 14711 */ + "\xd8\xb5\0" /* offset 14714 */ + "\xd8\xb6\0" /* offset 14717 */ + "\xd8\xb7\0" /* offset 14720 */ + "\xd8\xb8\0" /* offset 14723 */ + "\xd8\xb9\0" /* offset 14726 */ + "\xd8\xba\0" /* offset 14729 */ + "\xd9\x81\0" /* offset 14732 */ + "\xd9\x82\0" /* offset 14735 */ + "\xd9\x83\0" /* offset 14738 */ + "\xd9\x84\0" /* offset 14741 */ + "\xd9\x85\0" /* offset 14744 */ + "\xd9\x86\0" /* offset 14747 */ + "\xd9\x87\0" /* offset 14750 */ + "\xd9\x88\0" /* offset 14753 */ + "\xd9\x8a\0" /* offset 14756 */ + "\xd9\x84\xd8\xa7\xd9\x93\0" /* offset 14759 */ + "\xd9\x84\xd8\xa7\xd9\x94\0" /* offset 14766 */ + "\xd9\x84\xd8\xa7\xd9\x95\0" /* offset 14773 */ + "\xd9\x84\xd8\xa7\0" /* offset 14780 */ + "\x22\0" /* offset 14785 */ + "\x27\0" /* offset 14787 */ + "\x2f\0" /* offset 14789 */ + "\x5e\0" /* offset 14791 */ + "\x7c\0" /* offset 14793 */ + "\x7e\0" /* offset 14795 */ + "\xe2\xa6\x85\0" /* offset 14797 */ + "\xe2\xa6\x86\0" /* offset 14801 */ + "\xe3\x83\xbb\0" /* offset 14805 */ + "\xe3\x82\xa1\0" /* offset 14809 */ + "\xe3\x82\xa3\0" /* offset 14813 */ + "\xe3\x82\xa5\0" /* offset 14817 */ + "\xe3\x82\xa7\0" /* offset 14821 */ + "\xe3\x82\xa9\0" /* offset 14825 */ + "\xe3\x83\xa3\0" /* offset 14829 */ + "\xe3\x83\xa5\0" /* offset 14833 */ + "\xe3\x83\xa7\0" /* offset 14837 */ + "\xe3\x83\x83\0" /* offset 14841 */ + "\xe3\x83\xbc\0" /* offset 14845 */ + "\xe3\x83\xb3\0" /* offset 14849 */ + "\xe3\x82\x99\0" /* offset 14853 */ + "\xe3\x82\x9a\0" /* offset 14857 */ + "\xc2\xa2\0" /* offset 14861 */ + "\xc2\xa3\0" /* offset 14864 */ + "\xc2\xac\0" /* offset 14867 */ + "\xc2\xa6\0" /* offset 14870 */ + "\xc2\xa5\0" /* offset 14873 */ + "\xe2\x82\xa9\0" /* offset 14876 */ + "\xe2\x94\x82\0" /* offset 14880 */ + "\xe2\x86\x90\0" /* offset 14884 */ + "\xe2\x86\x91\0" /* offset 14888 */ + "\xe2\x86\x92\0" /* offset 14892 */ + "\xe2\x86\x93\0" /* offset 14896 */ + "\xe2\x96\xa0\0" /* offset 14900 */ + "\xe2\x97\x8b\0" /* offset 14904 */ + "\xf0\x9d\x85\x97\xf0\x9d\x85\xa5\0" /* offset 14908 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\0" /* offset 14917 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 14926 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 14939 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb0\0" /* offset 14952 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb1\0" /* offset 14965 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb2\0" /* offset 14978 */ + "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\0" /* offset 14991 */ + "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\0" /* offset 15000 */ + "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15009 */ + "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15022 */ + "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15035 */ + "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15048 */ + "\xc4\xb1\0" /* offset 15061 */ + "\xc8\xb7\0" /* offset 15064 */ + "\xce\x91\0" /* offset 15067 */ + "\xce\x92\0" /* offset 15070 */ + "\xce\x94\0" /* offset 15073 */ + "\xce\x95\0" /* offset 15076 */ + "\xce\x96\0" /* offset 15079 */ + "\xce\x97\0" /* offset 15082 */ + "\xce\x99\0" /* offset 15085 */ + "\xce\x9a\0" /* offset 15088 */ + "\xce\x9b\0" /* offset 15091 */ + "\xce\x9c\0" /* offset 15094 */ + "\xce\x9d\0" /* offset 15097 */ + "\xce\x9e\0" /* offset 15100 */ + "\xce\x9f\0" /* offset 15103 */ + "\xce\xa1\0" /* offset 15106 */ + "\xce\xa4\0" /* offset 15109 */ + "\xce\xa6\0" /* offset 15112 */ + "\xce\xa7\0" /* offset 15115 */ + "\xce\xa8\0" /* offset 15118 */ + "\xe2\x88\x87\0" /* offset 15121 */ + "\xce\xb1\0" /* offset 15125 */ + "\xce\xb6\0" /* offset 15128 */ + "\xce\xb7\0" /* offset 15131 */ + "\xce\xbb\0" /* offset 15134 */ + "\xce\xbd\0" /* offset 15137 */ + "\xce\xbe\0" /* offset 15140 */ + "\xce\xbf\0" /* offset 15143 */ + "\xcf\x83\0" /* offset 15146 */ + "\xcf\x84\0" /* offset 15149 */ + "\xcf\x85\0" /* offset 15152 */ + "\xcf\x88\0" /* offset 15155 */ + "\xcf\x89\0" /* offset 15158 */ + "\xe2\x88\x82\0" /* offset 15161 */ + "\xcf\x9c\0" /* offset 15165 */ + "\xcf\x9d\0" /* offset 15168 */ + "\xe4\xb8\xbd\0" /* offset 15171 */ + "\xe4\xb8\xb8\0" /* offset 15175 */ + "\xe4\xb9\x81\0" /* offset 15179 */ + "\xf0\xa0\x84\xa2\0" /* offset 15183 */ + "\xe4\xbd\xa0\0" /* offset 15188 */ + "\xe4\xbe\xbb\0" /* offset 15192 */ + "\xe5\x80\x82\0" /* offset 15196 */ + "\xe5\x81\xba\0" /* offset 15200 */ + "\xe5\x82\x99\0" /* offset 15204 */ + "\xe5\x83\x8f\0" /* offset 15208 */ + "\xe3\x92\x9e\0" /* offset 15212 */ + "\xf0\xa0\x98\xba\0" /* offset 15216 */ + "\xe5\x85\x94\0" /* offset 15221 */ + "\xe5\x85\xa4\0" /* offset 15225 */ + "\xe5\x85\xb7\0" /* offset 15229 */ + "\xf0\xa0\x94\x9c\0" /* offset 15233 */ + "\xe3\x92\xb9\0" /* offset 15238 */ + "\xe5\x85\xa7\0" /* offset 15242 */ + "\xe5\x86\x8d\0" /* offset 15246 */ + "\xf0\xa0\x95\x8b\0" /* offset 15250 */ + "\xe5\x86\x97\0" /* offset 15255 */ + "\xe5\x86\xa4\0" /* offset 15259 */ + "\xe4\xbb\x8c\0" /* offset 15263 */ + "\xe5\x86\xac\0" /* offset 15267 */ + "\xf0\xa9\x87\x9f\0" /* offset 15271 */ + "\xe5\x88\x83\0" /* offset 15276 */ + "\xe3\x93\x9f\0" /* offset 15280 */ + "\xe5\x88\xbb\0" /* offset 15284 */ + "\xe5\x89\x86\0" /* offset 15288 */ + "\xe5\x89\xb2\0" /* offset 15292 */ + "\xe5\x89\xb7\0" /* offset 15296 */ + "\xe3\x94\x95\0" /* offset 15300 */ + "\xe5\x8c\x85\0" /* offset 15304 */ + "\xe5\x8c\x86\0" /* offset 15308 */ + "\xe5\x8d\x89\0" /* offset 15312 */ + "\xe5\x8d\x9a\0" /* offset 15316 */ + "\xe5\x8d\xb3\0" /* offset 15320 */ + "\xe5\x8d\xbd\0" /* offset 15324 */ + "\xe5\x8d\xbf\0" /* offset 15328 */ + "\xf0\xa0\xa8\xac\0" /* offset 15332 */ + "\xe7\x81\xb0\0" /* offset 15337 */ + "\xe5\x8f\x8a\0" /* offset 15341 */ + "\xe5\x8f\x9f\0" /* offset 15345 */ + "\xf0\xa0\xad\xa3\0" /* offset 15349 */ + "\xe5\x8f\xab\0" /* offset 15354 */ + "\xe5\x8f\xb1\0" /* offset 15358 */ + "\xe5\x90\x86\0" /* offset 15362 */ + "\xe5\x92\x9e\0" /* offset 15366 */ + "\xe5\x90\xb8\0" /* offset 15370 */ + "\xe5\x91\x88\0" /* offset 15374 */ + "\xe5\x91\xa8\0" /* offset 15378 */ + "\xe5\x92\xa2\0" /* offset 15382 */ + "\xe5\x93\xb6\0" /* offset 15386 */ + "\xe5\x94\x90\0" /* offset 15390 */ + "\xe5\x95\x93\0" /* offset 15394 */ + "\xe5\x95\xa3\0" /* offset 15398 */ + "\xe5\x96\x84\0" /* offset 15402 */ + "\xe5\x96\xab\0" /* offset 15406 */ + "\xe5\x96\xb3\0" /* offset 15410 */ + "\xe5\x97\x82\0" /* offset 15414 */ + "\xe5\x9c\x96\0" /* offset 15418 */ + "\xe5\x9c\x97\0" /* offset 15422 */ + "\xe5\x99\x91\0" /* offset 15426 */ + "\xe5\x99\xb4\0" /* offset 15430 */ + "\xe5\xa3\xae\0" /* offset 15434 */ + "\xe5\x9f\x8e\0" /* offset 15438 */ + "\xe5\x9f\xb4\0" /* offset 15442 */ + "\xe5\xa0\x8d\0" /* offset 15446 */ + "\xe5\x9e\x8b\0" /* offset 15450 */ + "\xe5\xa0\xb2\0" /* offset 15454 */ + "\xe5\xa0\xb1\0" /* offset 15458 */ + "\xe5\xa2\xac\0" /* offset 15462 */ + "\xf0\xa1\x93\xa4\0" /* offset 15466 */ + "\xe5\xa3\xb2\0" /* offset 15471 */ + "\xe5\xa3\xb7\0" /* offset 15475 */ + "\xe5\xa4\x86\0" /* offset 15479 */ + "\xe5\xa4\x9a\0" /* offset 15483 */ + "\xe5\xa4\xa2\0" /* offset 15487 */ + "\xe5\xa5\xa2\0" /* offset 15491 */ + "\xf0\xa1\x9a\xa8\0" /* offset 15495 */ + "\xf0\xa1\x9b\xaa\0" /* offset 15500 */ + "\xe5\xa7\xac\0" /* offset 15505 */ + "\xe5\xa8\x9b\0" /* offset 15509 */ + "\xe5\xa8\xa7\0" /* offset 15513 */ + "\xe5\xa7\x98\0" /* offset 15517 */ + "\xe5\xa9\xa6\0" /* offset 15521 */ + "\xe3\x9b\xae\0" /* offset 15525 */ + "\xe3\x9b\xbc\0" /* offset 15529 */ + "\xe5\xac\x88\0" /* offset 15533 */ + "\xe5\xac\xbe\0" /* offset 15537 */ + "\xf0\xa1\xa7\x88\0" /* offset 15541 */ + "\xe5\xaf\x83\0" /* offset 15546 */ + "\xe5\xaf\x98\0" /* offset 15550 */ + "\xe5\xaf\xb3\0" /* offset 15554 */ + "\xf0\xa1\xac\x98\0" /* offset 15558 */ + "\xe5\xaf\xbf\0" /* offset 15563 */ + "\xe5\xb0\x86\0" /* offset 15567 */ + "\xe5\xbd\x93\0" /* offset 15571 */ + "\xe3\x9e\x81\0" /* offset 15575 */ + "\xe5\xb1\xa0\0" /* offset 15579 */ + "\xe5\xb3\x80\0" /* offset 15583 */ + "\xe5\xb2\x8d\0" /* offset 15587 */ + "\xf0\xa1\xb7\xa4\0" /* offset 15591 */ + "\xe5\xb5\x83\0" /* offset 15596 */ + "\xf0\xa1\xb7\xa6\0" /* offset 15600 */ + "\xe5\xb5\xae\0" /* offset 15605 */ + "\xe5\xb5\xab\0" /* offset 15609 */ + "\xe5\xb5\xbc\0" /* offset 15613 */ + "\xe5\xb7\xa1\0" /* offset 15617 */ + "\xe5\xb7\xa2\0" /* offset 15621 */ + "\xe3\xa0\xaf\0" /* offset 15625 */ + "\xe5\xb7\xbd\0" /* offset 15629 */ + "\xe5\xb8\xa8\0" /* offset 15633 */ + "\xe5\xb8\xbd\0" /* offset 15637 */ + "\xe5\xb9\xa9\0" /* offset 15641 */ + "\xe3\xa1\xa2\0" /* offset 15645 */ + "\xf0\xa2\x86\x83\0" /* offset 15649 */ + "\xe3\xa1\xbc\0" /* offset 15654 */ + "\xe5\xba\xb0\0" /* offset 15658 */ + "\xe5\xba\xb3\0" /* offset 15662 */ + "\xe5\xba\xb6\0" /* offset 15666 */ + "\xf0\xaa\x8e\x92\0" /* offset 15670 */ + "\xf0\xa2\x8c\xb1\0" /* offset 15675 */ + "\xe8\x88\x81\0" /* offset 15680 */ + "\xe5\xbc\xa2\0" /* offset 15684 */ + "\xe3\xa3\x87\0" /* offset 15688 */ + "\xf0\xa3\x8a\xb8\0" /* offset 15692 */ + "\xf0\xa6\x87\x9a\0" /* offset 15697 */ + "\xe5\xbd\xa2\0" /* offset 15702 */ + "\xe5\xbd\xab\0" /* offset 15706 */ + "\xe3\xa3\xa3\0" /* offset 15710 */ + "\xe5\xbe\x9a\0" /* offset 15714 */ + "\xe5\xbf\x8d\0" /* offset 15718 */ + "\xe5\xbf\x97\0" /* offset 15722 */ + "\xe5\xbf\xb9\0" /* offset 15726 */ + "\xe6\x82\x81\0" /* offset 15730 */ + "\xe3\xa4\xba\0" /* offset 15734 */ + "\xe3\xa4\x9c\0" /* offset 15738 */ + "\xf0\xa2\x9b\x94\0" /* offset 15742 */ + "\xe6\x83\x87\0" /* offset 15747 */ + "\xe6\x85\x88\0" /* offset 15751 */ + "\xe6\x85\x8c\0" /* offset 15755 */ + "\xe6\x85\xba\0" /* offset 15759 */ + "\xe6\x86\xb2\0" /* offset 15763 */ + "\xe6\x86\xa4\0" /* offset 15767 */ + "\xe6\x86\xaf\0" /* offset 15771 */ + "\xe6\x87\x9e\0" /* offset 15775 */ + "\xe6\x88\x90\0" /* offset 15779 */ + "\xe6\x88\x9b\0" /* offset 15783 */ + "\xe6\x89\x9d\0" /* offset 15787 */ + "\xe6\x8a\xb1\0" /* offset 15791 */ + "\xe6\x8b\x94\0" /* offset 15795 */ + "\xe6\x8d\x90\0" /* offset 15799 */ + "\xf0\xa2\xac\x8c\0" /* offset 15803 */ + "\xe6\x8c\xbd\0" /* offset 15808 */ + "\xe6\x8b\xbc\0" /* offset 15812 */ + "\xe6\x8d\xa8\0" /* offset 15816 */ + "\xe6\x8e\x83\0" /* offset 15820 */ + "\xe6\x8f\xa4\0" /* offset 15824 */ + "\xf0\xa2\xaf\xb1\0" /* offset 15828 */ + "\xe6\x90\xa2\0" /* offset 15833 */ + "\xe6\x8f\x85\0" /* offset 15837 */ + "\xe6\x8e\xa9\0" /* offset 15841 */ + "\xe3\xa8\xae\0" /* offset 15845 */ + "\xe6\x91\xa9\0" /* offset 15849 */ + "\xe6\x91\xbe\0" /* offset 15853 */ + "\xe6\x92\x9d\0" /* offset 15857 */ + "\xe6\x91\xb7\0" /* offset 15861 */ + "\xe3\xa9\xac\0" /* offset 15865 */ + "\xe6\x95\xac\0" /* offset 15869 */ + "\xf0\xa3\x80\x8a\0" /* offset 15873 */ + "\xe6\x97\xa3\0" /* offset 15878 */ + "\xe6\x9b\xb8\0" /* offset 15882 */ + "\xe6\x99\x89\0" /* offset 15886 */ + "\xe3\xac\x99\0" /* offset 15890 */ + "\xe3\xac\x88\0" /* offset 15894 */ + "\xe3\xab\xa4\0" /* offset 15898 */ + "\xe5\x86\x92\0" /* offset 15902 */ + "\xe5\x86\x95\0" /* offset 15906 */ + "\xe6\x9c\x80\0" /* offset 15910 */ + "\xe6\x9a\x9c\0" /* offset 15914 */ + "\xe8\x82\xad\0" /* offset 15918 */ + "\xe4\x8f\x99\0" /* offset 15922 */ + "\xe6\x9c\xa1\0" /* offset 15926 */ + "\xe6\x9d\x9e\0" /* offset 15930 */ + "\xe6\x9d\x93\0" /* offset 15934 */ + "\xf0\xa3\x8f\x83\0" /* offset 15938 */ + "\xe3\xad\x89\0" /* offset 15943 */ + "\xe6\x9f\xba\0" /* offset 15947 */ + "\xe6\x9e\x85\0" /* offset 15951 */ + "\xe6\xa1\x92\0" /* offset 15955 */ + "\xf0\xa3\x91\xad\0" /* offset 15959 */ + "\xe6\xa2\x8e\0" /* offset 15964 */ + "\xe6\xa0\x9f\0" /* offset 15968 */ + "\xe6\xa4\x94\0" /* offset 15972 */ + "\xe6\xa5\x82\0" /* offset 15976 */ + "\xe6\xa6\xa3\0" /* offset 15980 */ + "\xe6\xa7\xaa\0" /* offset 15984 */ + "\xe6\xaa\xa8\0" /* offset 15988 */ + "\xf0\xa3\x9a\xa3\0" /* offset 15992 */ + "\xe6\xab\x9b\0" /* offset 15997 */ + "\xe3\xb0\x98\0" /* offset 16001 */ + "\xe6\xac\xa1\0" /* offset 16005 */ + "\xf0\xa3\xa2\xa7\0" /* offset 16009 */ + "\xe6\xad\x94\0" /* offset 16014 */ + "\xe3\xb1\x8e\0" /* offset 16018 */ + "\xe6\xad\xb2\0" /* offset 16022 */ + "\xe6\xae\x9f\0" /* offset 16026 */ + "\xe6\xae\xbb\0" /* offset 16030 */ + "\xf0\xa3\xaa\x8d\0" /* offset 16034 */ + "\xf0\xa1\xb4\x8b\0" /* offset 16039 */ + "\xf0\xa3\xab\xba\0" /* offset 16044 */ + "\xe6\xb1\x8e\0" /* offset 16049 */ + "\xf0\xa3\xb2\xbc\0" /* offset 16053 */ + "\xe6\xb2\xbf\0" /* offset 16058 */ + "\xe6\xb3\x8d\0" /* offset 16062 */ + "\xe6\xb1\xa7\0" /* offset 16066 */ + "\xe6\xb4\x96\0" /* offset 16070 */ + "\xe6\xb4\xbe\0" /* offset 16074 */ + "\xe6\xb5\xa9\0" /* offset 16078 */ + "\xe6\xb5\xb8\0" /* offset 16082 */ + "\xe6\xb6\x85\0" /* offset 16086 */ + "\xf0\xa3\xb4\x9e\0" /* offset 16090 */ + "\xe6\xb4\xb4\0" /* offset 16095 */ + "\xe6\xb8\xaf\0" /* offset 16099 */ + "\xe6\xb9\xae\0" /* offset 16103 */ + "\xe3\xb4\xb3\0" /* offset 16107 */ + "\xe6\xbb\x87\0" /* offset 16111 */ + "\xf0\xa3\xbb\x91\0" /* offset 16115 */ + "\xe6\xb7\xb9\0" /* offset 16120 */ + "\xe6\xbd\xae\0" /* offset 16124 */ + "\xf0\xa3\xbd\x9e\0" /* offset 16128 */ + "\xf0\xa3\xbe\x8e\0" /* offset 16133 */ + "\xe6\xbf\x86\0" /* offset 16138 */ + "\xe7\x80\xb9\0" /* offset 16142 */ + "\xe7\x80\x9b\0" /* offset 16146 */ + "\xe3\xb6\x96\0" /* offset 16150 */ + "\xe7\x81\x8a\0" /* offset 16154 */ + "\xe7\x81\xbd\0" /* offset 16158 */ + "\xe7\x81\xb7\0" /* offset 16162 */ + "\xe7\x82\xad\0" /* offset 16166 */ + "\xf0\xa0\x94\xa5\0" /* offset 16170 */ + "\xe7\x85\x85\0" /* offset 16175 */ + "\xf0\xa4\x89\xa3\0" /* offset 16179 */ + "\xe7\x86\x9c\0" /* offset 16184 */ + "\xf0\xa4\x8e\xab\0" /* offset 16188 */ + "\xe7\x88\xa8\0" /* offset 16193 */ + "\xe7\x89\x90\0" /* offset 16197 */ + "\xf0\xa4\x98\x88\0" /* offset 16201 */ + "\xe7\x8a\x80\0" /* offset 16206 */ + "\xe7\x8a\x95\0" /* offset 16210 */ + "\xf0\xa4\x9c\xb5\0" /* offset 16214 */ + "\xf0\xa4\xa0\x94\0" /* offset 16219 */ + "\xe7\x8d\xba\0" /* offset 16224 */ + "\xe7\x8e\x8b\0" /* offset 16228 */ + "\xe3\xba\xac\0" /* offset 16232 */ + "\xe7\x8e\xa5\0" /* offset 16236 */ + "\xe3\xba\xb8\0" /* offset 16240 */ + "\xe7\x91\x87\0" /* offset 16244 */ + "\xe7\x91\x9c\0" /* offset 16248 */ + "\xe7\x92\x85\0" /* offset 16252 */ + "\xe7\x93\x8a\0" /* offset 16256 */ + "\xe3\xbc\x9b\0" /* offset 16260 */ + "\xe7\x94\xa4\0" /* offset 16264 */ + "\xf0\xa4\xb0\xb6\0" /* offset 16268 */ + "\xe7\x94\xbe\0" /* offset 16273 */ + "\xf0\xa4\xb2\x92\0" /* offset 16277 */ + "\xf0\xa2\x86\x9f\0" /* offset 16282 */ + "\xe7\x98\x90\0" /* offset 16287 */ + "\xf0\xa4\xbe\xa1\0" /* offset 16291 */ + "\xf0\xa4\xbe\xb8\0" /* offset 16296 */ + "\xf0\xa5\x81\x84\0" /* offset 16301 */ + "\xe3\xbf\xbc\0" /* offset 16306 */ + "\xe4\x80\x88\0" /* offset 16310 */ + "\xf0\xa5\x83\xb3\0" /* offset 16314 */ + "\xf0\xa5\x83\xb2\0" /* offset 16319 */ + "\xf0\xa5\x84\x99\0" /* offset 16324 */ + "\xf0\xa5\x84\xb3\0" /* offset 16329 */ + "\xe7\x9c\x9e\0" /* offset 16334 */ + "\xe7\x9c\x9f\0" /* offset 16338 */ + "\xe7\x9e\x8b\0" /* offset 16342 */ + "\xe4\x81\x86\0" /* offset 16346 */ + "\xe4\x82\x96\0" /* offset 16350 */ + "\xf0\xa5\x90\x9d\0" /* offset 16354 */ + "\xe7\xa1\x8e\0" /* offset 16359 */ + "\xe4\x83\xa3\0" /* offset 16363 */ + "\xf0\xa5\x98\xa6\0" /* offset 16367 */ + "\xf0\xa5\x9a\x9a\0" /* offset 16372 */ + "\xf0\xa5\x9b\x85\0" /* offset 16377 */ + "\xe7\xa7\xab\0" /* offset 16382 */ + "\xe4\x84\xaf\0" /* offset 16386 */ + "\xe7\xa9\x8a\0" /* offset 16390 */ + "\xe7\xa9\x8f\0" /* offset 16394 */ + "\xf0\xa5\xa5\xbc\0" /* offset 16398 */ + "\xf0\xa5\xaa\xa7\0" /* offset 16403 */ + "\xe7\xab\xae\0" /* offset 16408 */ + "\xe4\x88\x82\0" /* offset 16412 */ + "\xf0\xa5\xae\xab\0" /* offset 16416 */ + "\xe7\xaf\x86\0" /* offset 16421 */ + "\xe7\xaf\x89\0" /* offset 16425 */ + "\xe4\x88\xa7\0" /* offset 16429 */ + "\xf0\xa5\xb2\x80\0" /* offset 16433 */ + "\xe7\xb3\x92\0" /* offset 16438 */ + "\xe4\x8a\xa0\0" /* offset 16442 */ + "\xe7\xb3\xa8\0" /* offset 16446 */ + "\xe7\xb3\xa3\0" /* offset 16450 */ + "\xe7\xb4\x80\0" /* offset 16454 */ + "\xf0\xa5\xbe\x86\0" /* offset 16458 */ + "\xe7\xb5\xa3\0" /* offset 16463 */ + "\xe4\x8c\x81\0" /* offset 16467 */ + "\xe7\xb7\x87\0" /* offset 16471 */ + "\xe7\xb8\x82\0" /* offset 16475 */ + "\xe7\xb9\x85\0" /* offset 16479 */ + "\xe4\x8c\xb4\0" /* offset 16483 */ + "\xf0\xa6\x88\xa8\0" /* offset 16487 */ + "\xf0\xa6\x89\x87\0" /* offset 16492 */ + "\xe4\x8d\x99\0" /* offset 16497 */ + "\xf0\xa6\x8b\x99\0" /* offset 16501 */ + "\xe7\xbd\xba\0" /* offset 16506 */ + "\xf0\xa6\x8c\xbe\0" /* offset 16510 */ + "\xe7\xbe\x95\0" /* offset 16515 */ + "\xe7\xbf\xba\0" /* offset 16519 */ + "\xf0\xa6\x93\x9a\0" /* offset 16523 */ + "\xf0\xa6\x94\xa3\0" /* offset 16528 */ + "\xe8\x81\xa0\0" /* offset 16533 */ + "\xf0\xa6\x96\xa8\0" /* offset 16537 */ + "\xe8\x81\xb0\0" /* offset 16542 */ + "\xf0\xa3\x8d\x9f\0" /* offset 16546 */ + "\xe4\x8f\x95\0" /* offset 16551 */ + "\xe8\x82\xb2\0" /* offset 16555 */ + "\xe8\x84\x83\0" /* offset 16559 */ + "\xe4\x90\x8b\0" /* offset 16563 */ + "\xe8\x84\xbe\0" /* offset 16567 */ + "\xe5\xaa\xb5\0" /* offset 16571 */ + "\xf0\xa6\x9e\xa7\0" /* offset 16575 */ + "\xf0\xa6\x9e\xb5\0" /* offset 16580 */ + "\xf0\xa3\x8e\x93\0" /* offset 16585 */ + "\xf0\xa3\x8e\x9c\0" /* offset 16590 */ + "\xe8\x88\x84\0" /* offset 16595 */ + "\xe8\xbe\x9e\0" /* offset 16599 */ + "\xe4\x91\xab\0" /* offset 16603 */ + "\xe8\x8a\x91\0" /* offset 16607 */ + "\xe8\x8a\x8b\0" /* offset 16611 */ + "\xe8\x8a\x9d\0" /* offset 16615 */ + "\xe5\x8a\xb3\0" /* offset 16619 */ + "\xe8\x8a\xb1\0" /* offset 16623 */ + "\xe8\x8a\xb3\0" /* offset 16627 */ + "\xe8\x8a\xbd\0" /* offset 16631 */ + "\xe8\x8b\xa6\0" /* offset 16635 */ + "\xf0\xa6\xac\xbc\0" /* offset 16639 */ + "\xe8\x8c\x9d\0" /* offset 16644 */ + "\xe8\x8d\xa3\0" /* offset 16648 */ + "\xe8\x8e\xad\0" /* offset 16652 */ + "\xe8\x8c\xa3\0" /* offset 16656 */ + "\xe8\x8e\xbd\0" /* offset 16660 */ + "\xe8\x8f\xa7\0" /* offset 16664 */ + "\xe8\x8d\x93\0" /* offset 16668 */ + "\xe8\x8f\x8a\0" /* offset 16672 */ + "\xe8\x8f\x8c\0" /* offset 16676 */ + "\xe8\x8f\x9c\0" /* offset 16680 */ + "\xf0\xa6\xb0\xb6\0" /* offset 16684 */ + "\xf0\xa6\xb5\xab\0" /* offset 16689 */ + "\xf0\xa6\xb3\x95\0" /* offset 16694 */ + "\xe4\x94\xab\0" /* offset 16699 */ + "\xe8\x93\xb1\0" /* offset 16703 */ + "\xe8\x93\xb3\0" /* offset 16707 */ + "\xe8\x94\x96\0" /* offset 16711 */ + "\xf0\xa7\x8f\x8a\0" /* offset 16715 */ + "\xe8\x95\xa4\0" /* offset 16720 */ + "\xf0\xa6\xbc\xac\0" /* offset 16724 */ + "\xe4\x95\x9d\0" /* offset 16729 */ + "\xe4\x95\xa1\0" /* offset 16733 */ + "\xf0\xa6\xbe\xb1\0" /* offset 16737 */ + "\xf0\xa7\x83\x92\0" /* offset 16742 */ + "\xe4\x95\xab\0" /* offset 16747 */ + "\xe8\x99\x90\0" /* offset 16751 */ + "\xe8\x99\xa7\0" /* offset 16755 */ + "\xe8\x99\xa9\0" /* offset 16759 */ + "\xe8\x9a\xa9\0" /* offset 16763 */ + "\xe8\x9a\x88\0" /* offset 16767 */ + "\xe8\x9c\x8e\0" /* offset 16771 */ + "\xe8\x9b\xa2\0" /* offset 16775 */ + "\xe8\x9c\xa8\0" /* offset 16779 */ + "\xe8\x9d\xab\0" /* offset 16783 */ + "\xe8\x9e\x86\0" /* offset 16787 */ + "\xe4\x97\x97\0" /* offset 16791 */ + "\xe8\x9f\xa1\0" /* offset 16795 */ + "\xe8\xa0\x81\0" /* offset 16799 */ + "\xe4\x97\xb9\0" /* offset 16803 */ + "\xe8\xa1\xa0\0" /* offset 16807 */ + "\xf0\xa7\x99\xa7\0" /* offset 16811 */ + "\xe8\xa3\x97\0" /* offset 16816 */ + "\xe8\xa3\x9e\0" /* offset 16820 */ + "\xe4\x98\xb5\0" /* offset 16824 */ + "\xe8\xa3\xba\0" /* offset 16828 */ + "\xe3\x92\xbb\0" /* offset 16832 */ + "\xf0\xa7\xa2\xae\0" /* offset 16836 */ + "\xf0\xa7\xa5\xa6\0" /* offset 16841 */ + "\xe4\x9a\xbe\0" /* offset 16846 */ + "\xe4\x9b\x87\0" /* offset 16850 */ + "\xe8\xaa\xa0\0" /* offset 16854 */ + "\xf0\xa7\xb2\xa8\0" /* offset 16858 */ + "\xe8\xb2\xab\0" /* offset 16863 */ + "\xe8\xb3\x81\0" /* offset 16867 */ + "\xe8\xb4\x9b\0" /* offset 16871 */ + "\xe8\xb5\xb7\0" /* offset 16875 */ + "\xf0\xa7\xbc\xaf\0" /* offset 16879 */ + "\xf0\xa0\xa0\x84\0" /* offset 16884 */ + "\xe8\xb7\x8b\0" /* offset 16889 */ + "\xe8\xb6\xbc\0" /* offset 16893 */ + "\xe8\xb7\xb0\0" /* offset 16897 */ + "\xf0\xa0\xa3\x9e\0" /* offset 16901 */ + "\xe8\xbb\x94\0" /* offset 16906 */ + "\xf0\xa8\x97\x92\0" /* offset 16910 */ + "\xf0\xa8\x97\xad\0" /* offset 16915 */ + "\xe9\x82\x94\0" /* offset 16920 */ + "\xe9\x83\xb1\0" /* offset 16924 */ + "\xe9\x84\x91\0" /* offset 16928 */ + "\xf0\xa8\x9c\xae\0" /* offset 16932 */ + "\xe9\x84\x9b\0" /* offset 16937 */ + "\xe9\x88\xb8\0" /* offset 16941 */ + "\xe9\x8b\x97\0" /* offset 16945 */ + "\xe9\x8b\x98\0" /* offset 16949 */ + "\xe9\x89\xbc\0" /* offset 16953 */ + "\xe9\x8f\xb9\0" /* offset 16957 */ + "\xe9\x90\x95\0" /* offset 16961 */ + "\xf0\xa8\xaf\xba\0" /* offset 16965 */ + "\xe9\x96\x8b\0" /* offset 16970 */ + "\xe4\xa6\x95\0" /* offset 16974 */ + "\xe9\x96\xb7\0" /* offset 16978 */ + "\xf0\xa8\xb5\xb7\0" /* offset 16982 */ + "\xe4\xa7\xa6\0" /* offset 16987 */ + "\xe9\x9b\x83\0" /* offset 16991 */ + "\xe5\xb6\xb2\0" /* offset 16995 */ + "\xe9\x9c\xa3\0" /* offset 16999 */ + "\xf0\xa9\x85\x85\0" /* offset 17003 */ + "\xf0\xa9\x88\x9a\0" /* offset 17008 */ + "\xe4\xa9\xae\0" /* offset 17013 */ + "\xe4\xa9\xb6\0" /* offset 17017 */ + "\xe9\x9f\xa0\0" /* offset 17021 */ + "\xf0\xa9\x90\x8a\0" /* offset 17025 */ + "\xe4\xaa\xb2\0" /* offset 17030 */ + "\xf0\xa9\x92\x96\0" /* offset 17034 */ + "\xe9\xa0\xa9\0" /* offset 17039 */ + "\xf0\xa9\x96\xb6\0" /* offset 17043 */ + "\xe9\xa3\xa2\0" /* offset 17048 */ + "\xe4\xac\xb3\0" /* offset 17052 */ + "\xe9\xa4\xa9\0" /* offset 17056 */ + "\xe9\xa6\xa7\0" /* offset 17060 */ + "\xe9\xa7\x82\0" /* offset 17064 */ + "\xe9\xa7\xbe\0" /* offset 17068 */ + "\xe4\xaf\x8e\0" /* offset 17072 */ + "\xf0\xa9\xac\xb0\0" /* offset 17076 */ + "\xe9\xb1\x80\0" /* offset 17081 */ + "\xe9\xb3\xbd\0" /* offset 17085 */ + "\xe4\xb3\x8e\0" /* offset 17089 */ + "\xe4\xb3\xad\0" /* offset 17093 */ + "\xe9\xb5\xa7\0" /* offset 17097 */ + "\xf0\xaa\x83\x8e\0" /* offset 17101 */ + "\xe4\xb3\xb8\0" /* offset 17106 */ + "\xf0\xaa\x84\x85\0" /* offset 17110 */ + "\xf0\xaa\x88\x8e\0" /* offset 17115 */ + "\xf0\xaa\x8a\x91\0" /* offset 17120 */ + "\xe4\xb5\x96\0" /* offset 17125 */ + "\xe9\xbb\xbe\0" /* offset 17129 */ + "\xe9\xbc\x85\0" /* offset 17133 */ + "\xe9\xbc\x8f\0" /* offset 17137 */ + "\xe9\xbc\x96\0" /* offset 17141 */ + "\xf0\xaa\x98\x80\0" /* offset 17145 */; + +#endif /* DECOMP_H */ diff --git a/glib/guniprop.c b/glib/guniprop.c new file mode 100644 index 0000000..8a28513 --- /dev/null +++ b/glib/guniprop.c @@ -0,0 +1,1302 @@ +/* guniprop.c - Unicode character properties. + * + * Copyright (C) 1999 Tom Tromey + * Copyright (C) 2000 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "glib.h" +#include "gunichartables.h" +#include "gmirroringtable.h" +#include "gscripttable.h" +#include "gunicodeprivate.h" +#include "galias.h" + +#define ATTR_TABLE(Page) (((Page) <= G_UNICODE_LAST_PAGE_PART1) \ + ? attr_table_part1[Page] \ + : attr_table_part2[(Page) - 0xe00]) + +#define ATTTABLE(Page, Char) \ + ((ATTR_TABLE(Page) == G_UNICODE_MAX_TABLE_INDEX) ? 0 : (attr_data[ATTR_TABLE(Page)][Char])) + +#define TTYPE_PART1(Page, Char) \ + ((type_table_part1[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (type_table_part1[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (type_data[type_table_part1[Page]][Char])) + +#define TTYPE_PART2(Page, Char) \ + ((type_table_part2[Page] >= G_UNICODE_MAX_TABLE_INDEX) \ + ? (type_table_part2[Page] - G_UNICODE_MAX_TABLE_INDEX) \ + : (type_data[type_table_part2[Page]][Char])) + +#define TYPE(Char) \ + (((Char) <= G_UNICODE_LAST_CHAR_PART1) \ + ? TTYPE_PART1 ((Char) >> 8, (Char) & 0xff) \ + : (((Char) >= 0xe0000 && (Char) <= G_UNICODE_LAST_CHAR) \ + ? TTYPE_PART2 (((Char) - 0xe0000) >> 8, (Char) & 0xff) \ + : G_UNICODE_UNASSIGNED)) + + +#define IS(Type, Class) (((guint)1 << (Type)) & (Class)) +#define OR(Type, Rest) (((guint)1 << (Type)) | (Rest)) + + + +#define ISALPHA(Type) IS ((Type), \ + OR (G_UNICODE_LOWERCASE_LETTER, \ + OR (G_UNICODE_UPPERCASE_LETTER, \ + OR (G_UNICODE_TITLECASE_LETTER, \ + OR (G_UNICODE_MODIFIER_LETTER, \ + OR (G_UNICODE_OTHER_LETTER, 0)))))) + +#define ISALDIGIT(Type) IS ((Type), \ + OR (G_UNICODE_DECIMAL_NUMBER, \ + OR (G_UNICODE_LETTER_NUMBER, \ + OR (G_UNICODE_OTHER_NUMBER, \ + OR (G_UNICODE_LOWERCASE_LETTER, \ + OR (G_UNICODE_UPPERCASE_LETTER, \ + OR (G_UNICODE_TITLECASE_LETTER, \ + OR (G_UNICODE_MODIFIER_LETTER, \ + OR (G_UNICODE_OTHER_LETTER, 0))))))))) + +#define ISMARK(Type) IS ((Type), \ + OR (G_UNICODE_NON_SPACING_MARK, \ + OR (G_UNICODE_COMBINING_MARK, \ + OR (G_UNICODE_ENCLOSING_MARK, 0)))) + +#define ISZEROWIDTHTYPE(Type) IS ((Type), \ + OR (G_UNICODE_NON_SPACING_MARK, \ + OR (G_UNICODE_ENCLOSING_MARK, \ + OR (G_UNICODE_FORMAT, 0)))) + +/** + * g_unichar_isalnum: + * @c: a Unicode character + * + * Determines whether a character is alphanumeric. + * Given some UTF-8 text, obtain a character value + * with g_utf8_get_char(). + * + * Return value: %TRUE if @c is an alphanumeric character + **/ +gboolean +g_unichar_isalnum (gunichar c) +{ + return ISALDIGIT (TYPE (c)) ? TRUE : FALSE; +} + +/** + * g_unichar_isalpha: + * @c: a Unicode character + * + * Determines whether a character is alphabetic (i.e. a letter). + * Given some UTF-8 text, obtain a character value with + * g_utf8_get_char(). + * + * Return value: %TRUE if @c is an alphabetic character + **/ +gboolean +g_unichar_isalpha (gunichar c) +{ + return ISALPHA (TYPE (c)) ? TRUE : FALSE; +} + + +/** + * g_unichar_iscntrl: + * @c: a Unicode character + * + * Determines whether a character is a control character. + * Given some UTF-8 text, obtain a character value with + * g_utf8_get_char(). + * + * Return value: %TRUE if @c is a control character + **/ +gboolean +g_unichar_iscntrl (gunichar c) +{ + return TYPE (c) == G_UNICODE_CONTROL; +} + +/** + * g_unichar_isdigit: + * @c: a Unicode character + * + * Determines whether a character is numeric (i.e. a digit). This + * covers ASCII 0-9 and also digits in other languages/scripts. Given + * some UTF-8 text, obtain a character value with g_utf8_get_char(). + * + * Return value: %TRUE if @c is a digit + **/ +gboolean +g_unichar_isdigit (gunichar c) +{ + return TYPE (c) == G_UNICODE_DECIMAL_NUMBER; +} + + +/** + * g_unichar_isgraph: + * @c: a Unicode character + * + * Determines whether a character is printable and not a space + * (returns %FALSE for control characters, format characters, and + * spaces). g_unichar_isprint() is similar, but returns %TRUE for + * spaces. Given some UTF-8 text, obtain a character value with + * g_utf8_get_char(). + * + * Return value: %TRUE if @c is printable unless it's a space + **/ +gboolean +g_unichar_isgraph (gunichar c) +{ + return !IS (TYPE(c), + OR (G_UNICODE_CONTROL, + OR (G_UNICODE_FORMAT, + OR (G_UNICODE_UNASSIGNED, + OR (G_UNICODE_SURROGATE, + OR (G_UNICODE_SPACE_SEPARATOR, + 0)))))); +} + +/** + * g_unichar_islower: + * @c: a Unicode character + * + * Determines whether a character is a lowercase letter. + * Given some UTF-8 text, obtain a character value with + * g_utf8_get_char(). + * + * Return value: %TRUE if @c is a lowercase letter + **/ +gboolean +g_unichar_islower (gunichar c) +{ + return TYPE (c) == G_UNICODE_LOWERCASE_LETTER; +} + + +/** + * g_unichar_isprint: + * @c: a Unicode character + * + * Determines whether a character is printable. + * Unlike g_unichar_isgraph(), returns %TRUE for spaces. + * Given some UTF-8 text, obtain a character value with + * g_utf8_get_char(). + * + * Return value: %TRUE if @c is printable + **/ +gboolean +g_unichar_isprint (gunichar c) +{ + return !IS (TYPE(c), + OR (G_UNICODE_CONTROL, + OR (G_UNICODE_FORMAT, + OR (G_UNICODE_UNASSIGNED, + OR (G_UNICODE_SURROGATE, + 0))))); +} + +/** + * g_unichar_ispunct: + * @c: a Unicode character + * + * Determines whether a character is punctuation or a symbol. + * Given some UTF-8 text, obtain a character value with + * g_utf8_get_char(). + * + * Return value: %TRUE if @c is a punctuation or symbol character + **/ +gboolean +g_unichar_ispunct (gunichar c) +{ + return IS (TYPE(c), + OR (G_UNICODE_CONNECT_PUNCTUATION, + OR (G_UNICODE_DASH_PUNCTUATION, + OR (G_UNICODE_CLOSE_PUNCTUATION, + OR (G_UNICODE_FINAL_PUNCTUATION, + OR (G_UNICODE_INITIAL_PUNCTUATION, + OR (G_UNICODE_OTHER_PUNCTUATION, + OR (G_UNICODE_OPEN_PUNCTUATION, + OR (G_UNICODE_CURRENCY_SYMBOL, + OR (G_UNICODE_MODIFIER_SYMBOL, + OR (G_UNICODE_MATH_SYMBOL, + OR (G_UNICODE_OTHER_SYMBOL, + 0)))))))))))) ? TRUE : FALSE; +} + +/** + * g_unichar_isspace: + * @c: a Unicode character + * + * Determines whether a character is a space, tab, or line separator + * (newline, carriage return, etc.). Given some UTF-8 text, obtain a + * character value with g_utf8_get_char(). + * + * (Note: don't use this to do word breaking; you have to use + * Pango or equivalent to get word breaking right, the algorithm + * is fairly complex.) + * + * Return value: %TRUE if @c is a space character + **/ +gboolean +g_unichar_isspace (gunichar c) +{ + switch (c) + { + /* special-case these since Unicode thinks they are not spaces */ + case '\t': + case '\n': + case '\r': + case '\f': + return TRUE; + break; + + default: + { + return IS (TYPE(c), + OR (G_UNICODE_SPACE_SEPARATOR, + OR (G_UNICODE_LINE_SEPARATOR, + OR (G_UNICODE_PARAGRAPH_SEPARATOR, + 0)))) ? TRUE : FALSE; + } + break; + } +} + +/** + * g_unichar_ismark: + * @c: a Unicode character + * + * Determines whether a character is a mark (non-spacing mark, + * combining mark, or enclosing mark in Unicode speak). + * Given some UTF-8 text, obtain a character value + * with g_utf8_get_char(). + * + * Note: in most cases where isalpha characters are allowed, + * ismark characters should be allowed to as they are essential + * for writing most European languages as well as many non-Latin + * scripts. + * + * Return value: %TRUE if @c is a mark character + * + * Since: 2.14 + **/ +gboolean +g_unichar_ismark (gunichar c) +{ + return ISMARK (TYPE (c)); +} + +/** + * g_unichar_isupper: + * @c: a Unicode character + * + * Determines if a character is uppercase. + * + * Return value: %TRUE if @c is an uppercase character + **/ +gboolean +g_unichar_isupper (gunichar c) +{ + return TYPE (c) == G_UNICODE_UPPERCASE_LETTER; +} + +/** + * g_unichar_istitle: + * @c: a Unicode character + * + * Determines if a character is titlecase. Some characters in + * Unicode which are composites, such as the DZ digraph + * have three case variants instead of just two. The titlecase + * form is used at the beginning of a word where only the + * first letter is capitalized. The titlecase form of the DZ + * digraph is U+01F2 LATIN CAPITAL LETTTER D WITH SMALL LETTER Z. + * + * Return value: %TRUE if the character is titlecase + **/ +gboolean +g_unichar_istitle (gunichar c) +{ + unsigned int i; + for (i = 0; i < G_N_ELEMENTS (title_table); ++i) + if (title_table[i][0] == c) + return TRUE; + return FALSE; +} + +/** + * g_unichar_isxdigit: + * @c: a Unicode character. + * + * Determines if a character is a hexidecimal digit. + * + * Return value: %TRUE if the character is a hexadecimal digit + **/ +gboolean +g_unichar_isxdigit (gunichar c) +{ + return ((c >= 'a' && c <= 'f') + || (c >= 'A' && c <= 'F') + || (TYPE (c) == G_UNICODE_DECIMAL_NUMBER)); +} + +/** + * g_unichar_isdefined: + * @c: a Unicode character + * + * Determines if a given character is assigned in the Unicode + * standard. + * + * Return value: %TRUE if the character has an assigned value + **/ +gboolean +g_unichar_isdefined (gunichar c) +{ + return !IS (TYPE(c), + OR (G_UNICODE_UNASSIGNED, + OR (G_UNICODE_SURROGATE, + 0))); +} + +/** + * g_unichar_iszerowidth: + * @c: a Unicode character + * + * Determines if a given character typically takes zero width when rendered. + * The return value is %TRUE for all non-spacing and enclosing marks + * (e.g., combining accents), format characters, zero-width + * space, but not U+00AD SOFT HYPHEN. + * + * A typical use of this function is with one of g_unichar_iswide() or + * g_unichar_iswide_cjk() to determine the number of cells a string occupies + * when displayed on a grid display (terminals). However, note that not all + * terminals support zero-width rendering of zero-width marks. + * + * Return value: %TRUE if the character has zero width + * + * Since: 2.14 + **/ +gboolean +g_unichar_iszerowidth (gunichar c) +{ + if (G_UNLIKELY (c == 0x00AD)) + return FALSE; + + if (G_UNLIKELY (ISZEROWIDTHTYPE (TYPE (c)))) + return TRUE; + + if (G_UNLIKELY ((c >= 0x1160 && c < 0x1200) || + c == 0x200B)) + return TRUE; + + return FALSE; +} + +struct Interval +{ + gunichar start, end; +}; + +static int +interval_compare (const void *key, const void *elt) +{ + gunichar c = GPOINTER_TO_UINT (key); + struct Interval *interval = (struct Interval *)elt; + + if (c < interval->start) + return -1; + if (c > interval->end) + return +1; + + return 0; +} + +/** + * g_unichar_iswide: + * @c: a Unicode character + * + * Determines if a character is typically rendered in a double-width + * cell. + * + * Return value: %TRUE if the character is wide + **/ +gboolean +g_unichar_iswide (gunichar c) +{ + /* sorted list of intervals of East_Asian_Width = W and F characters + * from Unicode 5.1.0. produced by mungling output of: + * grep ';[FW]\>' EastAsianWidth.txt */ + static const struct Interval wide[] = { + {0x1100, 0x1159}, {0x115F, 0x115F}, {0x2329, 0x232A}, {0x2E80, 0x2E99}, + {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, {0x3000, 0x303E}, + {0x3041, 0x3096}, {0x3099, 0x30FF}, {0x3105, 0x312D}, {0x3131, 0x318E}, + {0x3190, 0x31B7}, {0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3243}, + {0x3250, 0x32FE}, {0x3300, 0x4DB5}, {0x4E00, 0x9FC3}, {0xA000, 0xA48C}, + {0xA490, 0xA4C6}, {0xAC00, 0xD7A3}, {0xF900, 0xFA2D}, {0xFA30, 0xFA6A}, + {0xFA70, 0xFAD9}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52}, {0xFE54, 0xFE66}, + {0xFE68, 0xFE6B}, {0xFF01, 0xFF60}, {0xFFE0, 0xFFE6}, {0x20000, 0x2FFFD}, + {0x30000, 0x3FFFD} + }; + + if (bsearch (GUINT_TO_POINTER (c), wide, G_N_ELEMENTS (wide), sizeof wide[0], + interval_compare)) + return TRUE; + + return FALSE; +} + + +/** + * g_unichar_iswide_cjk: + * @c: a Unicode character + * + * Determines if a character is typically rendered in a double-width + * cell under legacy East Asian locales. If a character is wide according to + * g_unichar_iswide(), then it is also reported wide with this function, but + * the converse is not necessarily true. See the + * Unicode Standard + * Annex #11 for details. + * + * If a character passes the g_unichar_iswide() test then it will also pass + * this test, but not the other way around. Note that some characters may + * pas both this test and g_unichar_iszerowidth(). + * + * Return value: %TRUE if the character is wide in legacy East Asian locales + * + * Since: 2.12 + */ +gboolean +g_unichar_iswide_cjk (gunichar c) +{ + /* sorted list of intervals of East_Asian_Width = A and F characters + * from Unicode 5.1.0. produced by mungling output of: + * grep ';[A]\>' EastAsianWidth.txt */ + static const struct Interval ambiguous[] = { + {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, {0x00AA, 0x00AA}, + {0x00AD, 0x00AE}, {0x00B0, 0x00B4}, {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, + {0x00C6, 0x00C6}, {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, + {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, {0x00F0, 0x00F0}, + {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, + {0x0101, 0x0101}, {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, + {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, {0x0138, 0x0138}, + {0x013F, 0x0142}, {0x0144, 0x0144}, {0x0148, 0x014B}, {0x014D, 0x014D}, + {0x0152, 0x0153}, {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, + {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, {0x01D6, 0x01D6}, + {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, {0x01DC, 0x01DC}, {0x0251, 0x0251}, + {0x0261, 0x0261}, {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, + {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, {0x02DD, 0x02DD}, + {0x02DF, 0x02DF}, {0x0300, 0x036F}, {0x0391, 0x03A1}, {0x03A3, 0x03A9}, + {0x03B1, 0x03C1}, {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, + {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019}, + {0x201C, 0x201D}, {0x2020, 0x2022}, {0x2024, 0x2027}, {0x2030, 0x2030}, + {0x2032, 0x2033}, {0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E}, + {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC}, + {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, {0x2113, 0x2113}, + {0x2116, 0x2116}, {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, + {0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179}, + {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, + {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, {0x2207, 0x2208}, + {0x220B, 0x220B}, {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215}, + {0x221A, 0x221A}, {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, + {0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237}, {0x223C, 0x223D}, + {0x2248, 0x2248}, {0x224C, 0x224C}, {0x2252, 0x2252}, {0x2260, 0x2261}, + {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283}, + {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, {0x22A5, 0x22A5}, + {0x22BF, 0x22BF}, {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B}, + {0x2550, 0x2573}, {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, + {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, {0x25BC, 0x25BD}, + {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, + {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, + {0x260E, 0x260F}, {0x2614, 0x2615}, {0x261C, 0x261C}, {0x261E, 0x261E}, + {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, {0x2663, 0x2665}, + {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F}, {0x273D, 0x273D}, + {0x2776, 0x277F}, {0xE000, 0xF8FF}, {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, + {0xE0100, 0xE01EF}, {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD} + }; + + if (g_unichar_iswide (c)) + return TRUE; + + if (bsearch (GUINT_TO_POINTER (c), ambiguous, G_N_ELEMENTS (ambiguous), sizeof ambiguous[0], + interval_compare)) + return TRUE; + + return FALSE; +} + + +/** + * g_unichar_toupper: + * @c: a Unicode character + * + * Converts a character to uppercase. + * + * Return value: the result of converting @c to uppercase. + * If @c is not an lowercase or titlecase character, + * or has no upper case equivalent @c is returned unchanged. + **/ +gunichar +g_unichar_toupper (gunichar c) +{ + int t = TYPE (c); + if (t == G_UNICODE_LOWERCASE_LETTER) + { + gunichar val = ATTTABLE (c >> 8, c & 0xff); + if (val >= 0x1000000) + { + const gchar *p = special_case_table + val - 0x1000000; + val = g_utf8_get_char (p); + } + /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR, + * do not have an uppercase equivalent, in which case val will be + * zero. + */ + return val ? val : c; + } + else if (t == G_UNICODE_TITLECASE_LETTER) + { + unsigned int i; + for (i = 0; i < G_N_ELEMENTS (title_table); ++i) + { + if (title_table[i][0] == c) + return title_table[i][1]; + } + } + return c; +} + +/** + * g_unichar_tolower: + * @c: a Unicode character. + * + * Converts a character to lower case. + * + * Return value: the result of converting @c to lower case. + * If @c is not an upperlower or titlecase character, + * or has no lowercase equivalent @c is returned unchanged. + **/ +gunichar +g_unichar_tolower (gunichar c) +{ + int t = TYPE (c); + if (t == G_UNICODE_UPPERCASE_LETTER) + { + gunichar val = ATTTABLE (c >> 8, c & 0xff); + if (val >= 0x1000000) + { + const gchar *p = special_case_table + val - 0x1000000; + return g_utf8_get_char (p); + } + else + { + /* Not all uppercase letters are guaranteed to have a lowercase + * equivalent. If this is the case, val will be zero. */ + return val ? val : c; + } + } + else if (t == G_UNICODE_TITLECASE_LETTER) + { + unsigned int i; + for (i = 0; i < G_N_ELEMENTS (title_table); ++i) + { + if (title_table[i][0] == c) + return title_table[i][2]; + } + } + return c; +} + +/** + * g_unichar_totitle: + * @c: a Unicode character + * + * Converts a character to the titlecase. + * + * Return value: the result of converting @c to titlecase. + * If @c is not an uppercase or lowercase character, + * @c is returned unchanged. + **/ +gunichar +g_unichar_totitle (gunichar c) +{ + unsigned int i; + for (i = 0; i < G_N_ELEMENTS (title_table); ++i) + { + if (title_table[i][0] == c || title_table[i][1] == c + || title_table[i][2] == c) + return title_table[i][0]; + } + + if (TYPE (c) == G_UNICODE_LOWERCASE_LETTER) + return g_unichar_toupper (c); + + return c; +} + +/** + * g_unichar_digit_value: + * @c: a Unicode character + * + * Determines the numeric value of a character as a decimal + * digit. + * + * Return value: If @c is a decimal digit (according to + * g_unichar_isdigit()), its numeric value. Otherwise, -1. + **/ +int +g_unichar_digit_value (gunichar c) +{ + if (TYPE (c) == G_UNICODE_DECIMAL_NUMBER) + return ATTTABLE (c >> 8, c & 0xff); + return -1; +} + +/** + * g_unichar_xdigit_value: + * @c: a Unicode character + * + * Determines the numeric value of a character as a hexidecimal + * digit. + * + * Return value: If @c is a hex digit (according to + * g_unichar_isxdigit()), its numeric value. Otherwise, -1. + **/ +int +g_unichar_xdigit_value (gunichar c) +{ + if (c >= 'A' && c <= 'F') + return c - 'A' + 10; + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + if (TYPE (c) == G_UNICODE_DECIMAL_NUMBER) + return ATTTABLE (c >> 8, c & 0xff); + return -1; +} + +/** + * g_unichar_type: + * @c: a Unicode character + * + * Classifies a Unicode character by type. + * + * Return value: the type of the character. + **/ +GUnicodeType +g_unichar_type (gunichar c) +{ + return TYPE (c); +} + +/* + * Case mapping functions + */ + +typedef enum { + LOCALE_NORMAL, + LOCALE_TURKIC, + LOCALE_LITHUANIAN +} LocaleType; + +static LocaleType +get_locale_type (void) +{ +#ifdef G_OS_WIN32 + char *tem = g_win32_getlocale (); + char locale[2]; + + locale[0] = tem[0]; + locale[1] = tem[1]; + g_free (tem); +#else + const char *locale = setlocale (LC_CTYPE, NULL); +#endif + + switch (locale[0]) + { + case 'a': + if (locale[1] == 'z') + return LOCALE_TURKIC; + break; + case 'l': + if (locale[1] == 't') + return LOCALE_LITHUANIAN; + break; + case 't': + if (locale[1] == 'r') + return LOCALE_TURKIC; + break; + } + + return LOCALE_NORMAL; +} + +static gint +output_marks (const char **p_inout, + char *out_buffer, + gboolean remove_dot) +{ + const char *p = *p_inout; + gint len = 0; + + while (*p) + { + gunichar c = g_utf8_get_char (p); + + if (ISMARK (TYPE (c))) + { + if (!remove_dot || c != 0x307 /* COMBINING DOT ABOVE */) + len += g_unichar_to_utf8 (c, out_buffer ? out_buffer + len : NULL); + p = g_utf8_next_char (p); + } + else + break; + } + + *p_inout = p; + return len; +} + +static gint +output_special_case (gchar *out_buffer, + int offset, + int type, + int which) +{ + const gchar *p = special_case_table + offset; + gint len; + + if (type != G_UNICODE_TITLECASE_LETTER) + p = g_utf8_next_char (p); + + if (which == 1) + p += strlen (p) + 1; + + len = strlen (p); + if (out_buffer) + memcpy (out_buffer, p, len); + + return len; +} + +static gsize +real_toupper (const gchar *str, + gssize max_len, + gchar *out_buffer, + LocaleType locale_type) +{ + const gchar *p = str; + const char *last = NULL; + gsize len = 0; + gboolean last_was_i = FALSE; + + while ((max_len < 0 || p < str + max_len) && *p) + { + gunichar c = g_utf8_get_char (p); + int t = TYPE (c); + gunichar val; + + last = p; + p = g_utf8_next_char (p); + + if (locale_type == LOCALE_LITHUANIAN) + { + if (c == 'i') + last_was_i = TRUE; + else + { + if (last_was_i) + { + /* Nasty, need to remove any dot above. Though + * I think only E WITH DOT ABOVE occurs in practice + * which could simplify this considerably. + */ + gsize decomp_len, i; + gunichar *decomp; + + decomp = g_unicode_canonical_decomposition (c, &decomp_len); + for (i=0; i < decomp_len; i++) + { + if (decomp[i] != 0x307 /* COMBINING DOT ABOVE */) + len += g_unichar_to_utf8 (g_unichar_toupper (decomp[i]), out_buffer ? out_buffer + len : NULL); + } + g_free (decomp); + + len += output_marks (&p, out_buffer ? out_buffer + len : NULL, TRUE); + + continue; + } + + if (!ISMARK (t)) + last_was_i = FALSE; + } + } + + if (locale_type == LOCALE_TURKIC && c == 'i') + { + /* i => LATIN CAPITAL LETTER I WITH DOT ABOVE */ + len += g_unichar_to_utf8 (0x130, out_buffer ? out_buffer + len : NULL); + } + else if (c == 0x0345) /* COMBINING GREEK YPOGEGRAMMENI */ + { + /* Nasty, need to move it after other combining marks .. this would go away if + * we normalized first. + */ + len += output_marks (&p, out_buffer ? out_buffer + len : NULL, FALSE); + + /* And output as GREEK CAPITAL LETTER IOTA */ + len += g_unichar_to_utf8 (0x399, out_buffer ? out_buffer + len : NULL); + } + else if (IS (t, + OR (G_UNICODE_LOWERCASE_LETTER, + OR (G_UNICODE_TITLECASE_LETTER, + 0)))) + { + val = ATTTABLE (c >> 8, c & 0xff); + + if (val >= 0x1000000) + { + len += output_special_case (out_buffer ? out_buffer + len : NULL, val - 0x1000000, t, + t == G_UNICODE_LOWERCASE_LETTER ? 0 : 1); + } + else + { + if (t == G_UNICODE_TITLECASE_LETTER) + { + unsigned int i; + for (i = 0; i < G_N_ELEMENTS (title_table); ++i) + { + if (title_table[i][0] == c) + { + val = title_table[i][1]; + break; + } + } + } + + /* Some lowercase letters, e.g., U+000AA, FEMININE ORDINAL INDICATOR, + * do not have an uppercase equivalent, in which case val will be + * zero. */ + len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL); + } + } + else + { + gsize char_len = g_utf8_skip[*(guchar *)last]; + + if (out_buffer) + memcpy (out_buffer + len, last, char_len); + + len += char_len; + } + + } + + return len; +} + +/** + * g_utf8_strup: + * @str: a UTF-8 encoded string + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * + * Converts all Unicode characters in the string that have a case + * to uppercase. The exact manner that this is done depends + * on the current locale, and may result in the number of + * characters in the string increasing. (For instance, the + * German ess-zet will be changed to SS.) + * + * Return value: a newly allocated string, with all characters + * converted to uppercase. + **/ +gchar * +g_utf8_strup (const gchar *str, + gssize len) +{ + gsize result_len; + LocaleType locale_type; + gchar *result; + + g_return_val_if_fail (str != NULL, NULL); + + locale_type = get_locale_type (); + + /* + * We use a two pass approach to keep memory management simple + */ + result_len = real_toupper (str, len, NULL, locale_type); + result = g_malloc (result_len + 1); + real_toupper (str, len, result, locale_type); + result[result_len] = '\0'; + + return result; +} + +/* traverses the string checking for characters with combining class == 230 + * until a base character is found */ +static gboolean +has_more_above (const gchar *str) +{ + const gchar *p = str; + gint combining_class; + + while (*p) + { + combining_class = g_unichar_combining_class (g_utf8_get_char (p)); + if (combining_class == 230) + return TRUE; + else if (combining_class == 0) + break; + + p = g_utf8_next_char (p); + } + + return FALSE; +} + +static gsize +real_tolower (const gchar *str, + gssize max_len, + gchar *out_buffer, + LocaleType locale_type) +{ + const gchar *p = str; + const char *last = NULL; + gsize len = 0; + + while ((max_len < 0 || p < str + max_len) && *p) + { + gunichar c = g_utf8_get_char (p); + int t = TYPE (c); + gunichar val; + + last = p; + p = g_utf8_next_char (p); + + if (locale_type == LOCALE_TURKIC && c == 'I') + { + if (g_utf8_get_char (p) == 0x0307) + { + /* I + COMBINING DOT ABOVE => i (U+0069) */ + len += g_unichar_to_utf8 (0x0069, out_buffer ? out_buffer + len : NULL); + p = g_utf8_next_char (p); + } + else + { + /* I => LATIN SMALL LETTER DOTLESS I */ + len += g_unichar_to_utf8 (0x131, out_buffer ? out_buffer + len : NULL); + } + } + /* Introduce an explicit dot above when lowercasing capital I's and J's + * whenever there are more accents above. [SpecialCasing.txt] */ + else if (locale_type == LOCALE_LITHUANIAN && + (c == 0x00cc || c == 0x00cd || c == 0x0128)) + { + len += g_unichar_to_utf8 (0x0069, out_buffer ? out_buffer + len : NULL); + len += g_unichar_to_utf8 (0x0307, out_buffer ? out_buffer + len : NULL); + + switch (c) + { + case 0x00cc: + len += g_unichar_to_utf8 (0x0300, out_buffer ? out_buffer + len : NULL); + break; + case 0x00cd: + len += g_unichar_to_utf8 (0x0301, out_buffer ? out_buffer + len : NULL); + break; + case 0x0128: + len += g_unichar_to_utf8 (0x0303, out_buffer ? out_buffer + len : NULL); + break; + } + } + else if (locale_type == LOCALE_LITHUANIAN && + (c == 'I' || c == 'J' || c == 0x012e) && + has_more_above (p)) + { + len += g_unichar_to_utf8 (g_unichar_tolower (c), out_buffer ? out_buffer + len : NULL); + len += g_unichar_to_utf8 (0x0307, out_buffer ? out_buffer + len : NULL); + } + else if (c == 0x03A3) /* GREEK CAPITAL LETTER SIGMA */ + { + if ((max_len < 0 || p < str + max_len) && *p) + { + gunichar next_c = g_utf8_get_char (p); + int next_type = TYPE(next_c); + + /* SIGMA mapps differently depending on whether it is + * final or not. The following simplified test would + * fail in the case of combining marks following the + * sigma, but I don't think that occurs in real text. + * The test here matches that in ICU. + */ + if (ISALPHA (next_type)) /* Lu,Ll,Lt,Lm,Lo */ + val = 0x3c3; /* GREEK SMALL SIGMA */ + else + val = 0x3c2; /* GREEK SMALL FINAL SIGMA */ + } + else + val = 0x3c2; /* GREEK SMALL FINAL SIGMA */ + + len += g_unichar_to_utf8 (val, out_buffer ? out_buffer + len : NULL); + } + else if (IS (t, + OR (G_UNICODE_UPPERCASE_LETTER, + OR (G_UNICODE_TITLECASE_LETTER, + 0)))) + { + val = ATTTABLE (c >> 8, c & 0xff); + + if (val >= 0x1000000) + { + len += output_special_case (out_buffer ? out_buffer + len : NULL, val - 0x1000000, t, 0); + } + else + { + if (t == G_UNICODE_TITLECASE_LETTER) + { + unsigned int i; + for (i = 0; i < G_N_ELEMENTS (title_table); ++i) + { + if (title_table[i][0] == c) + { + val = title_table[i][2]; + break; + } + } + } + + /* Not all uppercase letters are guaranteed to have a lowercase + * equivalent. If this is the case, val will be zero. */ + len += g_unichar_to_utf8 (val ? val : c, out_buffer ? out_buffer + len : NULL); + } + } + else + { + gsize char_len = g_utf8_skip[*(guchar *)last]; + + if (out_buffer) + memcpy (out_buffer + len, last, char_len); + + len += char_len; + } + + } + + return len; +} + +/** + * g_utf8_strdown: + * @str: a UTF-8 encoded string + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * + * Converts all Unicode characters in the string that have a case + * to lowercase. The exact manner that this is done depends + * on the current locale, and may result in the number of + * characters in the string changing. + * + * Return value: a newly allocated string, with all characters + * converted to lowercase. + **/ +gchar * +g_utf8_strdown (const gchar *str, + gssize len) +{ + gsize result_len; + LocaleType locale_type; + gchar *result; + + g_return_val_if_fail (str != NULL, NULL); + + locale_type = get_locale_type (); + + /* + * We use a two pass approach to keep memory management simple + */ + result_len = real_tolower (str, len, NULL, locale_type); + result = g_malloc (result_len + 1); + real_tolower (str, len, result, locale_type); + result[result_len] = '\0'; + + return result; +} + +/** + * g_utf8_casefold: + * @str: a UTF-8 encoded string + * @len: length of @str, in bytes, or -1 if @str is nul-terminated. + * + * Converts a string into a form that is independent of case. The + * result will not correspond to any particular case, but can be + * compared for equality or ordered with the results of calling + * g_utf8_casefold() on other strings. + * + * Note that calling g_utf8_casefold() followed by g_utf8_collate() is + * only an approximation to the correct linguistic case insensitive + * ordering, though it is a fairly good one. Getting this exactly + * right would require a more sophisticated collation function that + * takes case sensitivity into account. GLib does not currently + * provide such a function. + * + * Return value: a newly allocated string, that is a + * case independent form of @str. + **/ +gchar * +g_utf8_casefold (const gchar *str, + gssize len) +{ + GString *result; + const char *p; + + g_return_val_if_fail (str != NULL, NULL); + + result = g_string_new (NULL); + p = str; + while ((len < 0 || p < str + len) && *p) + { + gunichar ch = g_utf8_get_char (p); + + int start = 0; + int end = G_N_ELEMENTS (casefold_table); + + if (ch >= casefold_table[start].ch && + ch <= casefold_table[end - 1].ch) + { + while (TRUE) + { + int half = (start + end) / 2; + if (ch == casefold_table[half].ch) + { + g_string_append (result, casefold_table[half].data); + goto next; + } + else if (half == start) + break; + else if (ch > casefold_table[half].ch) + start = half; + else + end = half; + } + } + + g_string_append_unichar (result, g_unichar_tolower (ch)); + + next: + p = g_utf8_next_char (p); + } + + return g_string_free (result, FALSE); +} + +/** + * g_unichar_get_mirror_char: + * @ch: a Unicode character + * @mirrored_ch: location to store the mirrored character + * + * In Unicode, some characters are mirrored. This + * means that their images are mirrored horizontally in text that is laid + * out from right to left. For instance, "(" would become its mirror image, + * ")", in right-to-left text. + * + * If @ch has the Unicode mirrored property and there is another unicode + * character that typically has a glyph that is the mirror image of @ch's + * glyph and @mirrored_ch is set, it puts that character in the address + * pointed to by @mirrored_ch. Otherwise the original character is put. + * + * Return value: %TRUE if @ch has a mirrored character, %FALSE otherwise + * + * Since: 2.4 + **/ +gboolean +g_unichar_get_mirror_char (gunichar ch, + gunichar *mirrored_ch) +{ + gboolean found; + gunichar mirrored; + + mirrored = GLIB_GET_MIRRORING(ch); + + found = ch != mirrored; + if (mirrored_ch) + *mirrored_ch = mirrored; + + return found; + +} + +#define G_SCRIPT_TABLE_MIDPOINT (G_N_ELEMENTS (g_script_table) / 2) + +static inline GUnicodeScript +g_unichar_get_script_bsearch (gunichar ch) +{ + int lower = 0; + int upper = G_N_ELEMENTS (g_script_table) - 1; + static int saved_mid = G_SCRIPT_TABLE_MIDPOINT; + int mid = saved_mid; + + + do + { + if (ch < g_script_table[mid].start) + upper = mid - 1; + else if (ch >= g_script_table[mid].start + g_script_table[mid].chars) + lower = mid + 1; + else + return g_script_table[saved_mid = mid].script; + + mid = (lower + upper) / 2; + } + while (lower <= upper); + + return G_UNICODE_SCRIPT_UNKNOWN; +} + +/** + * g_unichar_get_script: + * @ch: a Unicode character + * + * Looks up the #GUnicodeScript for a particular character (as defined + * by Unicode Standard Annex #24). No check is made for @ch being a + * valid Unicode character; if you pass in invalid character, the + * result is undefined. + * + * This function is equivalent to pango_script_for_unichar() and the + * two are interchangeable. + * + * Return value: the #GUnicodeScript for the character. + * + * Since: 2.14 + */ +GUnicodeScript +g_unichar_get_script (gunichar ch) +{ + if (ch < G_EASY_SCRIPTS_RANGE) + return g_script_easy_table[ch]; + else + return g_unichar_get_script_bsearch (ch); +} + + +#define __G_UNIPROP_C__ +#include "galiasdef.c" diff --git a/glib/gurifuncs.c b/glib/gurifuncs.c new file mode 100644 index 0000000..5f1ef71 --- /dev/null +++ b/glib/gurifuncs.c @@ -0,0 +1,253 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#include "config.h" + +#include "gurifuncs.h" + +#include +#include +#include +#include + +#include + +#include "config.h" +#include "galias.h" + +/** + * SECTION:gurifuncs + * @short_description: URI Functions + * + * Functions for manipulating Universal Resource Identifiers (URIs) as + * defined by + * RFC 3986. It is highly recommended that you have read and + * understand RFC 3986 for understanding this API. + */ + +static int +unescape_character (const char *scanner) +{ + int first_digit; + int second_digit; + + first_digit = g_ascii_xdigit_value (*scanner++); + if (first_digit < 0) + return -1; + + second_digit = g_ascii_xdigit_value (*scanner++); + if (second_digit < 0) + return -1; + + return (first_digit << 4) | second_digit; +} + +/** + * g_uri_unescape_segment: + * @escaped_string: a string. + * @escaped_string_end: a string. + * @illegal_characters: an optional string of illegal characters not to be allowed. + * + * Unescapes a segment of an escaped string. + * + * If any of the characters in @illegal_characters or the character zero appears + * as an escaped character in @escaped_string then that is an error and %NULL + * will be returned. This is useful it you want to avoid for instance having a + * slash being expanded in an escaped path element, which might confuse pathname + * handling. + * + * Returns: an unescaped version of @escaped_string or %NULL on error. + * The returned string should be freed when no longer needed. + * + * Since: 2.16 + **/ +char * +g_uri_unescape_segment (const char *escaped_string, + const char *escaped_string_end, + const char *illegal_characters) +{ + const char *in; + char *out, *result; + gint character; + + if (escaped_string == NULL) + return NULL; + + if (escaped_string_end == NULL) + escaped_string_end = escaped_string + strlen (escaped_string); + + result = g_malloc (escaped_string_end - escaped_string + 1); + + out = result; + for (in = escaped_string; in < escaped_string_end; in++) + { + character = *in; + + if (*in == '%') + { + in++; + + if (escaped_string_end - in < 2) + { + /* Invalid escaped char (to short) */ + g_free (result); + return NULL; + } + + character = unescape_character (in); + + /* Check for an illegal character. We consider '\0' illegal here. */ + if (character <= 0 || + (illegal_characters != NULL && + strchr (illegal_characters, (char)character) != NULL)) + { + g_free (result); + return NULL; + } + + in++; /* The other char will be eaten in the loop header */ + } + *out++ = (char)character; + } + + *out = '\0'; + + return result; +} + +/** + * g_uri_unescape_string: + * @escaped_string: an escaped string to be unescaped. + * @illegal_characters: an optional string of illegal characters not to be allowed. + * + * Unescapes a whole escaped string. + * + * If any of the characters in @illegal_characters or the character zero appears + * as an escaped character in @escaped_string then that is an error and %NULL + * will be returned. This is useful it you want to avoid for instance having a + * slash being expanded in an escaped path element, which might confuse pathname + * handling. + * + * Returns: an unescaped version of @escaped_string. The returned string + * should be freed when no longer needed. + * + * Since: 2.16 + **/ +char * +g_uri_unescape_string (const char *escaped_string, + const char *illegal_characters) +{ + return g_uri_unescape_segment (escaped_string, NULL, illegal_characters); +} + +/** + * g_uri_parse_scheme: + * @uri: a valid URI. + * + * Gets the scheme portion of a URI string. RFC 3986 decodes the scheme as: + * + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * + * Common schemes include "file", "http", "svn+ssh", etc. + * + * Returns: The "Scheme" component of the URI, or %NULL on error. + * The returned string should be freed when no longer needed. + * + * Since: 2.16 + **/ +char * +g_uri_parse_scheme (const char *uri) +{ + const char *p; + char c; + + g_return_val_if_fail (uri != NULL, NULL); + + /* From RFC 3986 Decodes: + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + */ + + p = uri; + + /* Decode scheme: + scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) + */ + + if (!g_ascii_isalpha (*p)) + return NULL; + + while (1) + { + c = *p++; + + if (c == ':') + break; + + if (!(g_ascii_isalnum(c) || + c == '+' || + c == '-' || + c == '.')) + return NULL; + } + + return g_strndup (uri, p - uri - 1); +} + +/** + * g_uri_escape_string: + * @unescaped: the unescaped input string. + * @reserved_chars_allowed: a string of reserved characters that are + * allowed to be used. + * @allow_utf8: %TRUE if the result can include UTF-8 characters. + * + * Escapes a string for use in a URI. + * + * Normally all characters that are not "unreserved" (i.e. ASCII alphanumerical + * characters plus dash, dot, underscore and tilde) are escaped. + * But if you specify characters in @reserved_chars_allowed they are not + * escaped. This is useful for the "reserved" characters in the URI + * specification, since those are allowed unescaped in some portions of + * a URI. + * + * Returns: an escaped version of @unescaped. The returned string should be + * freed when no longer needed. + * + * Since: 2.16 + **/ +char * +g_uri_escape_string (const char *unescaped, + const char *reserved_chars_allowed, + gboolean allow_utf8) +{ + GString *s; + + g_return_val_if_fail (unescaped != NULL, NULL); + + s = g_string_sized_new (strlen (unescaped) + 10); + + g_string_append_uri_escaped (s, unescaped, reserved_chars_allowed, allow_utf8); + + return g_string_free (s, FALSE); +} + +#define __G_URI_FUNCS_C__ +#include "galiasdef.c" diff --git a/glib/gurifuncs.h b/glib/gurifuncs.h new file mode 100644 index 0000000..bbc8f88 --- /dev/null +++ b/glib/gurifuncs.h @@ -0,0 +1,81 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2007 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Alexander Larsson + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_URI_FUNCS_H__ +#define __G_URI_FUNCS_H__ + +#include + +G_BEGIN_DECLS + +/** + * G_URI_RESERVED_CHARS_GENERIC_DELIMITERS: + * + * Generic delimiters characters as defined in RFC 3986. Includes ":/?#[]@". + **/ +#define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@" + +/** + * G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS + * + * Subcomponent delimiter characters as defined in RFC 3986. Includes "!$&'()*+,;=". + **/ +#define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;=" + +/** + * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT: + * + * Allowed characters in path elements. Includes "!$&'()*+,;=:@". + **/ +#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@" + +/** + * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH: + * + * Allowed characters in a path. Includes "!$&'()*+,;=:@/". + **/ +#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/" + +/** + * G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO: + * + * Allowed characters in userinfo as defined in RFC 3986. Includes "!$&'()*+,;=:". + **/ +#define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":" + +char * g_uri_unescape_string (const char *escaped_string, + const char *illegal_characters); +char * g_uri_unescape_segment (const char *escaped_string, + const char *escaped_string_end, + const char *illegal_characters); +char * g_uri_parse_scheme (const char *uri); +char * g_uri_escape_string (const char *unescaped, + const char *reserved_chars_allowed, + gboolean allow_utf8); + +G_END_DECLS + +#endif /* __G_URI_FUNCS_H__ */ diff --git a/glib/gutf8.c b/glib/gutf8.c new file mode 100644 index 0000000..27b1e4c --- /dev/null +++ b/glib/gutf8.c @@ -0,0 +1,1895 @@ +/* gutf8.c - Operations on UTF-8 strings. + * + * Copyright (C) 1999 Tom Tromey + * Copyright (C) 2000 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#ifdef HAVE_CODESET +#include +#endif +#include + +#include "glib.h" + +#ifdef G_PLATFORM_WIN32 +#include +#define STRICT +#include +#undef STRICT +#endif + +#include "libcharset/libcharset.h" + +#include "glibintl.h" +#include "galias.h" + +#define UTF8_COMPUTE(Char, Mask, Len) \ + if (Char < 128) \ + { \ + Len = 1; \ + Mask = 0x7f; \ + } \ + else if ((Char & 0xe0) == 0xc0) \ + { \ + Len = 2; \ + Mask = 0x1f; \ + } \ + else if ((Char & 0xf0) == 0xe0) \ + { \ + Len = 3; \ + Mask = 0x0f; \ + } \ + else if ((Char & 0xf8) == 0xf0) \ + { \ + Len = 4; \ + Mask = 0x07; \ + } \ + else if ((Char & 0xfc) == 0xf8) \ + { \ + Len = 5; \ + Mask = 0x03; \ + } \ + else if ((Char & 0xfe) == 0xfc) \ + { \ + Len = 6; \ + Mask = 0x01; \ + } \ + else \ + Len = -1; + +#define UTF8_LENGTH(Char) \ + ((Char) < 0x80 ? 1 : \ + ((Char) < 0x800 ? 2 : \ + ((Char) < 0x10000 ? 3 : \ + ((Char) < 0x200000 ? 4 : \ + ((Char) < 0x4000000 ? 5 : 6))))) + + +#define UTF8_GET(Result, Chars, Count, Mask, Len) \ + (Result) = (Chars)[0] & (Mask); \ + for ((Count) = 1; (Count) < (Len); ++(Count)) \ + { \ + if (((Chars)[(Count)] & 0xc0) != 0x80) \ + { \ + (Result) = -1; \ + break; \ + } \ + (Result) <<= 6; \ + (Result) |= ((Chars)[(Count)] & 0x3f); \ + } + +/** + * Check whether a Unicode (5.2) char is in a valid range. + * + * The first check comes from the Unicode guarantee to never encode + * a point above 0x0010ffff, since UTF-16 couldn't represent it. + * + * The second check covers surrogate pairs (category Cs). + * + * The last two checks cover "Noncharacter": defined as: + * "A code point that is permanently reserved for + * internal use, and that should never be interchanged. In + * Unicode 3.1, these consist of the values U+nFFFE and U+nFFFF + * (where n is from 0 to 10_16) and the values U+FDD0..U+FDEF." + * + * @param Char the character + */ +#define UNICODE_VALID(Char) \ + ((Char) < 0x110000 && \ + (((Char) & 0xFFFFF800) != 0xD800) && \ + ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ + ((Char) & 0xFFFE) != 0xFFFE) + + +static const gchar utf8_skip_data[256] = { + 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,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, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 +}; + +const gchar * const g_utf8_skip = utf8_skip_data; + +/** + * g_utf8_find_prev_char: + * @str: pointer to the beginning of a UTF-8 encoded string + * @p: pointer to some position within @str + * + * Given a position @p with a UTF-8 encoded string @str, find the start + * of the previous UTF-8 character starting before @p. Returns %NULL if no + * UTF-8 characters are present in @str before @p. + * + * @p does not have to be at the beginning of a UTF-8 character. No check + * is made to see if the character found is actually valid other than + * it starts with an appropriate byte. + * + * Return value: a pointer to the found character or %NULL. + **/ +gchar * +g_utf8_find_prev_char (const char *str, + const char *p) +{ + for (--p; p >= str; --p) + { + if ((*p & 0xc0) != 0x80) + return (gchar *)p; + } + return NULL; +} + +/** + * g_utf8_find_next_char: + * @p: a pointer to a position within a UTF-8 encoded string + * @end: a pointer to the byte following the end of the string, + * or %NULL to indicate that the string is nul-terminated. + * + * Finds the start of the next UTF-8 character in the string after @p. + * + * @p does not have to be at the beginning of a UTF-8 character. No check + * is made to see if the character found is actually valid other than + * it starts with an appropriate byte. + * + * Return value: a pointer to the found character or %NULL + **/ +gchar * +g_utf8_find_next_char (const gchar *p, + const gchar *end) +{ + if (*p) + { + if (end) + for (++p; p < end && (*p & 0xc0) == 0x80; ++p) + ; + else + for (++p; (*p & 0xc0) == 0x80; ++p) + ; + } + return (p == end) ? NULL : (gchar *)p; +} + +/** + * g_utf8_prev_char: + * @p: a pointer to a position within a UTF-8 encoded string + * + * Finds the previous UTF-8 character in the string before @p. + * + * @p does not have to be at the beginning of a UTF-8 character. No check + * is made to see if the character found is actually valid other than + * it starts with an appropriate byte. If @p might be the first + * character of the string, you must use g_utf8_find_prev_char() instead. + * + * Return value: a pointer to the found character. + **/ +gchar * +g_utf8_prev_char (const gchar *p) +{ + while (TRUE) + { + p--; + if ((*p & 0xc0) != 0x80) + return (gchar *)p; + } +} + +/** + * g_utf8_strlen: + * @p: pointer to the start of a UTF-8 encoded string + * @max: the maximum number of bytes to examine. If @max + * is less than 0, then the string is assumed to be + * nul-terminated. If @max is 0, @p will not be examined and + * may be %NULL. + * + * Computes the length of the string in characters, not including + * the terminating nul character. + * + * Return value: the length of the string in characters + **/ +glong +g_utf8_strlen (const gchar *p, + gssize max) +{ + glong len = 0; + const gchar *start = p; + g_return_val_if_fail (p != NULL || max == 0, 0); + + if (max < 0) + { + while (*p) + { + p = g_utf8_next_char (p); + ++len; + } + } + else + { + if (max == 0 || !*p) + return 0; + + p = g_utf8_next_char (p); + + while (p - start < max && *p) + { + ++len; + p = g_utf8_next_char (p); + } + + /* only do the last len increment if we got a complete + * char (don't count partial chars) + */ + if (p - start <= max) + ++len; + } + + return len; +} + +/** + * g_utf8_get_char: + * @p: a pointer to Unicode character encoded as UTF-8 + * + * Converts a sequence of bytes encoded as UTF-8 to a Unicode character. + * If @p does not point to a valid UTF-8 encoded character, results are + * undefined. If you are not sure that the bytes are complete + * valid Unicode characters, you should use g_utf8_get_char_validated() + * instead. + * + * Return value: the resulting character + **/ +gunichar +g_utf8_get_char (const gchar *p) +{ + int i, mask = 0, len; + gunichar result; + unsigned char c = (unsigned char) *p; + + UTF8_COMPUTE (c, mask, len); + if (len == -1) + return (gunichar)-1; + UTF8_GET (result, p, i, mask, len); + + return result; +} + +/** + * g_utf8_offset_to_pointer: + * @str: a UTF-8 encoded string + * @offset: a character offset within @str + * + * Converts from an integer character offset to a pointer to a position + * within the string. + * + * Since 2.10, this function allows to pass a negative @offset to + * step backwards. It is usually worth stepping backwards from the end + * instead of forwards if @offset is in the last fourth of the string, + * since moving forward is about 3 times faster than moving backward. + * + * + * This function doesn't abort when reaching the end of @str. Therefore + * you should be sure that @offset is within string boundaries before + * calling that function. Call g_utf8_strlen() when unsure. + * + * This limitation exists as this function is called frequently during + * text rendering and therefore has to be as fast as possible. + * + * + * Return value: the resulting pointer + **/ +gchar * +g_utf8_offset_to_pointer (const gchar *str, + glong offset) +{ + const gchar *s = str; + + if (offset > 0) + while (offset--) + s = g_utf8_next_char (s); + else + { + const char *s1; + + /* This nice technique for fast backwards stepping + * through a UTF-8 string was dubbed "stutter stepping" + * by its inventor, Larry Ewing. + */ + while (offset) + { + s1 = s; + s += offset; + while ((*s & 0xc0) == 0x80) + s--; + + offset += g_utf8_pointer_to_offset (s, s1); + } + } + + return (gchar *)s; +} + +/** + * g_utf8_pointer_to_offset: + * @str: a UTF-8 encoded string + * @pos: a pointer to a position within @str + * + * Converts from a pointer to position within a string to a integer + * character offset. + * + * Since 2.10, this function allows @pos to be before @str, and returns + * a negative offset in this case. + * + * Return value: the resulting character offset + **/ +glong +g_utf8_pointer_to_offset (const gchar *str, + const gchar *pos) +{ + const gchar *s = str; + glong offset = 0; + + if (pos < str) + offset = - g_utf8_pointer_to_offset (pos, str); + else + while (s < pos) + { + s = g_utf8_next_char (s); + offset++; + } + + return offset; +} + + +/** + * g_utf8_strncpy: + * @dest: buffer to fill with characters from @src + * @src: UTF-8 encoded string + * @n: character count + * + * Like the standard C strncpy() function, but + * copies a given number of characters instead of a given number of + * bytes. The @src string must be valid UTF-8 encoded text. + * (Use g_utf8_validate() on all text before trying to use UTF-8 + * utility functions with it.) + * + * Return value: @dest + **/ +gchar * +g_utf8_strncpy (gchar *dest, + const gchar *src, + gsize n) +{ + const gchar *s = src; + while (n && *s) + { + s = g_utf8_next_char(s); + n--; + } + strncpy(dest, src, s - src); + dest[s - src] = 0; + return dest; +} + +G_LOCK_DEFINE_STATIC (aliases); + +static GHashTable * +get_alias_hash (void) +{ + static GHashTable *alias_hash = NULL; + const char *aliases; + + G_LOCK (aliases); + + if (!alias_hash) + { + alias_hash = g_hash_table_new (g_str_hash, g_str_equal); + + aliases = _g_locale_get_charset_aliases (); + while (*aliases != '\0') + { + const char *canonical; + const char *alias; + const char **alias_array; + int count = 0; + + alias = aliases; + aliases += strlen (aliases) + 1; + canonical = aliases; + aliases += strlen (aliases) + 1; + + alias_array = g_hash_table_lookup (alias_hash, canonical); + if (alias_array) + { + while (alias_array[count]) + count++; + } + + alias_array = g_renew (const char *, alias_array, count + 2); + alias_array[count] = alias; + alias_array[count + 1] = NULL; + + g_hash_table_insert (alias_hash, (char *)canonical, alias_array); + } + } + + G_UNLOCK (aliases); + + return alias_hash; +} + +/* As an abuse of the alias table, the following routines gets + * the charsets that are aliases for the canonical name. + */ +G_GNUC_INTERNAL const char ** +_g_charset_get_aliases (const char *canonical_name) +{ + GHashTable *alias_hash = get_alias_hash (); + + return g_hash_table_lookup (alias_hash, canonical_name); +} + +static gboolean +g_utf8_get_charset_internal (const char *raw_data, + const char **a) +{ + const char *charset = getenv("CHARSET"); + + if (charset && *charset) + { + *a = charset; + + if (charset && strstr (charset, "UTF-8")) + return TRUE; + else + return FALSE; + } + + /* The libcharset code tries to be thread-safe without + * a lock, but has a memory leak and a missing memory + * barrier, so we lock for it + */ + G_LOCK (aliases); + charset = _g_locale_charset_unalias (raw_data); + G_UNLOCK (aliases); + + if (charset && *charset) + { + *a = charset; + + if (charset && strstr (charset, "UTF-8")) + return TRUE; + else + return FALSE; + } + + /* Assume this for compatibility at present. */ + *a = "US-ASCII"; + + return FALSE; +} + +typedef struct _GCharsetCache GCharsetCache; + +struct _GCharsetCache { + gboolean is_utf8; + gchar *raw; + gchar *charset; +}; + +static void +charset_cache_free (gpointer data) +{ + GCharsetCache *cache = data; + g_free (cache->raw); + g_free (cache->charset); + g_free (cache); +} + +/** + * g_get_charset: + * @charset: return location for character set name + * + * Obtains the character set for the current + * locale; you might use this character set as an argument to + * g_convert(), to convert from the current locale's encoding to some + * other encoding. (Frequently g_locale_to_utf8() and g_locale_from_utf8() + * are nice shortcuts, though.) + * + * On Windows the character set returned by this function is the + * so-called system default ANSI code-page. That is the character set + * used by the "narrow" versions of C library and Win32 functions that + * handle file names. It might be different from the character set + * used by the C library's current locale. + * + * The return value is %TRUE if the locale's encoding is UTF-8, in that + * case you can perhaps avoid calling g_convert(). + * + * The string returned in @charset is not allocated, and should not be + * freed. + * + * Return value: %TRUE if the returned charset is UTF-8 + **/ +gboolean +g_get_charset (G_CONST_RETURN char **charset) +{ + static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT; + GCharsetCache *cache = g_static_private_get (&cache_private); + const gchar *raw; + + if (!cache) + { + cache = g_new0 (GCharsetCache, 1); + g_static_private_set (&cache_private, cache, charset_cache_free); + } + + raw = _g_locale_charset_raw (); + + if (!(cache->raw && strcmp (cache->raw, raw) == 0)) + { + const gchar *new_charset; + + g_free (cache->raw); + g_free (cache->charset); + cache->raw = g_strdup (raw); + cache->is_utf8 = g_utf8_get_charset_internal (raw, &new_charset); + cache->charset = g_strdup (new_charset); + } + + if (charset) + *charset = cache->charset; + + return cache->is_utf8; +} + +/* unicode_strchr */ + +/** + * g_unichar_to_utf8: + * @c: a Unicode character code + * @outbuf: output buffer, must have at least 6 bytes of space. + * If %NULL, the length will be computed and returned + * and nothing will be written to @outbuf. + * + * Converts a single character to UTF-8. + * + * Return value: number of bytes written + **/ +int +g_unichar_to_utf8 (gunichar c, + gchar *outbuf) +{ + /* If this gets modified, also update the copy in g_string_insert_unichar() */ + guint len = 0; + int first; + int i; + + if (c < 0x80) + { + first = 0; + len = 1; + } + else if (c < 0x800) + { + first = 0xc0; + len = 2; + } + else if (c < 0x10000) + { + first = 0xe0; + len = 3; + } + else if (c < 0x200000) + { + first = 0xf0; + len = 4; + } + else if (c < 0x4000000) + { + first = 0xf8; + len = 5; + } + else + { + first = 0xfc; + len = 6; + } + + if (outbuf) + { + for (i = len - 1; i > 0; --i) + { + outbuf[i] = (c & 0x3f) | 0x80; + c >>= 6; + } + outbuf[0] = c | first; + } + + return len; +} + +/** + * g_utf8_strchr: + * @p: a nul-terminated UTF-8 encoded string + * @len: the maximum length of @p + * @c: a Unicode character + * + * Finds the leftmost occurrence of the given Unicode character + * in a UTF-8 encoded string, while limiting the search to @len bytes. + * If @len is -1, allow unbounded search. + * + * Return value: %NULL if the string does not contain the character, + * otherwise, a pointer to the start of the leftmost occurrence of + * the character in the string. + **/ +gchar * +g_utf8_strchr (const char *p, + gssize len, + gunichar c) +{ + gchar ch[10]; + + gint charlen = g_unichar_to_utf8 (c, ch); + ch[charlen] = '\0'; + + return g_strstr_len (p, len, ch); +} + + +/** + * g_utf8_strrchr: + * @p: a nul-terminated UTF-8 encoded string + * @len: the maximum length of @p + * @c: a Unicode character + * + * Find the rightmost occurrence of the given Unicode character + * in a UTF-8 encoded string, while limiting the search to @len bytes. + * If @len is -1, allow unbounded search. + * + * Return value: %NULL if the string does not contain the character, + * otherwise, a pointer to the start of the rightmost occurrence of the + * character in the string. + **/ +gchar * +g_utf8_strrchr (const char *p, + gssize len, + gunichar c) +{ + gchar ch[10]; + + gint charlen = g_unichar_to_utf8 (c, ch); + ch[charlen] = '\0'; + + return g_strrstr_len (p, len, ch); +} + + +/* Like g_utf8_get_char, but take a maximum length + * and return (gunichar)-2 on incomplete trailing character + */ +static inline gunichar +g_utf8_get_char_extended (const gchar *p, + gssize max_len) +{ + guint i, len; + gunichar wc = (guchar) *p; + + if (wc < 0x80) + { + return wc; + } + else if (wc < 0xc0) + { + return (gunichar)-1; + } + else if (wc < 0xe0) + { + len = 2; + wc &= 0x1f; + } + else if (wc < 0xf0) + { + len = 3; + wc &= 0x0f; + } + else if (wc < 0xf8) + { + len = 4; + wc &= 0x07; + } + else if (wc < 0xfc) + { + len = 5; + wc &= 0x03; + } + else if (wc < 0xfe) + { + len = 6; + wc &= 0x01; + } + else + { + return (gunichar)-1; + } + + if (max_len >= 0 && len > max_len) + { + for (i = 1; i < max_len; i++) + { + if ((((guchar *)p)[i] & 0xc0) != 0x80) + return (gunichar)-1; + } + return (gunichar)-2; + } + + for (i = 1; i < len; ++i) + { + gunichar ch = ((guchar *)p)[i]; + + if ((ch & 0xc0) != 0x80) + { + if (ch) + return (gunichar)-1; + else + return (gunichar)-2; + } + + wc <<= 6; + wc |= (ch & 0x3f); + } + + if (UTF8_LENGTH(wc) != len) + return (gunichar)-1; + + return wc; +} + +/** + * g_utf8_get_char_validated: + * @p: a pointer to Unicode character encoded as UTF-8 + * @max_len: the maximum number of bytes to read, or -1, for no maximum or + * if @p is nul-terminated + * + * Convert a sequence of bytes encoded as UTF-8 to a Unicode character. + * This function checks for incomplete characters, for invalid characters + * such as characters that are out of the range of Unicode, and for + * overlong encodings of valid characters. + * + * Return value: the resulting character. If @p points to a partial + * sequence at the end of a string that could begin a valid + * character (or if @max_len is zero), returns (gunichar)-2; + * otherwise, if @p does not point to a valid UTF-8 encoded + * Unicode character, returns (gunichar)-1. + **/ +gunichar +g_utf8_get_char_validated (const gchar *p, + gssize max_len) +{ + gunichar result; + + if (max_len == 0) + return (gunichar)-2; + + result = g_utf8_get_char_extended (p, max_len); + + if (result & 0x80000000) + return result; + else if (!UNICODE_VALID (result)) + return (gunichar)-1; + else + return result; +} + +/** + * g_utf8_to_ucs4_fast: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use, in bytes. If @len < 0, + * then the string is nul-terminated. + * @items_written: location to store the number of characters in the + * result, or %NULL. + * + * Convert a string from UTF-8 to a 32-bit fixed width + * representation as UCS-4, assuming valid UTF-8 input. + * This function is roughly twice as fast as g_utf8_to_ucs4() + * but does no error checking on the input. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). + **/ +gunichar * +g_utf8_to_ucs4_fast (const gchar *str, + glong len, + glong *items_written) +{ + gint j, charlen; + gunichar *result; + gint n_chars, i; + const gchar *p; + + g_return_val_if_fail (str != NULL, NULL); + + p = str; + n_chars = 0; + if (len < 0) + { + while (*p) + { + p = g_utf8_next_char (p); + ++n_chars; + } + } + else + { + while (p < str + len && *p) + { + p = g_utf8_next_char (p); + ++n_chars; + } + } + + result = g_new (gunichar, n_chars + 1); + + p = str; + for (i=0; i < n_chars; i++) + { + gunichar wc = ((unsigned char *)p)[0]; + + if (wc < 0x80) + { + result[i] = wc; + p++; + } + else + { + if (wc < 0xe0) + { + charlen = 2; + wc &= 0x1f; + } + else if (wc < 0xf0) + { + charlen = 3; + wc &= 0x0f; + } + else if (wc < 0xf8) + { + charlen = 4; + wc &= 0x07; + } + else if (wc < 0xfc) + { + charlen = 5; + wc &= 0x03; + } + else + { + charlen = 6; + wc &= 0x01; + } + + for (j = 1; j < charlen; j++) + { + wc <<= 6; + wc |= ((unsigned char *)p)[j] & 0x3f; + } + + result[i] = wc; + p += charlen; + } + } + result[i] = 0; + + if (items_written) + *items_written = i; + + return result; +} + +/** + * g_utf8_to_ucs4: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use, in bytes. If @len < 0, + * then the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of characters written or %NULL. + * The value here stored does not include the trailing 0 + * character. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-8 to a 32-bit fixed width + * representation as UCS-4. A trailing 0 will be added to the + * string after the converted text. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar * +g_utf8_to_ucs4 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gunichar *result = NULL; + gint n_chars, i; + const gchar *in; + + in = str; + n_chars = 0; + while ((len < 0 || str + len - in > 0) && *in) + { + gunichar wc = g_utf8_get_char_extended (in, len < 0 ? 6 : str + len - in); + if (wc & 0x80000000) + { + if (wc == (gunichar)-2) + { + if (items_read) + break; + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); + } + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + + goto err_out; + } + + n_chars++; + + in = g_utf8_next_char (in); + } + + result = g_new (gunichar, n_chars + 1); + + in = str; + for (i=0; i < n_chars; i++) + { + result[i] = g_utf8_get_char (in); + in = g_utf8_next_char (in); + } + result[i] = 0; + + if (items_written) + *items_written = n_chars; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_ucs4_to_utf8: + * @str: a UCS-4 encoded string + * @len: the maximum length (number of characters) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of characters read, or %NULL. + * @items_written: location to store number of bytes written or %NULL. + * The value here stored does not include the trailing 0 + * byte. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from a 32-bit fixed width representation as UCS-4. + * to UTF-8. The result will be terminated with a 0 byte. + * + * Return value: a pointer to a newly allocated UTF-8 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. In that case, @items_read will be + * set to the position of the first invalid input + * character. + **/ +gchar * +g_ucs4_to_utf8 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gint result_length; + gchar *result = NULL; + gchar *p; + gint i; + + result_length = 0; + for (i = 0; len < 0 || i < len ; i++) + { + if (!str[i]) + break; + + if (str[i] >= 0x80000000) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Character out of range for UTF-8")); + goto err_out; + } + + result_length += UTF8_LENGTH (str[i]); + } + + result = g_malloc (result_length + 1); + p = result; + + i = 0; + while (p < result + result_length) + p += g_unichar_to_utf8 (str[i++], p); + + *p = '\0'; + + if (items_written) + *items_written = p - result; + + err_out: + if (items_read) + *items_read = i; + + return result; +} + +#define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000) + +/** + * g_utf16_to_utf8: + * @str: a UTF-16 encoded string + * @len: the maximum length (number of gunichar2) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of words read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of bytes written, or %NULL. + * The value stored here does not include the trailing + * 0 byte. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-16 to UTF-8. The result will be + * terminated with a 0 byte. + * + * Note that the input is expected to be already in native endianness, + * an initial byte-order-mark character is not handled specially. + * g_convert() can be used to convert a byte buffer of UTF-16 data of + * ambiguous endianess. + * + * Further note that this function does not validate the result + * string; it may e.g. include embedded NUL characters. The only + * validation done by this function is to ensure that the input can + * be correctly interpreted as UTF-16, i.e. it doesn't contain + * things unpaired surrogates. + * + * Return value: a pointer to a newly allocated UTF-8 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gchar * +g_utf16_to_utf8 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + /* This function and g_utf16_to_ucs4 are almost exactly identical - The lines that differ + * are marked. + */ + const gunichar2 *in; + gchar *out; + gchar *result = NULL; + gint n_bytes; + gunichar high_surrogate; + + g_return_val_if_fail (str != NULL, NULL); + + n_bytes = 0; + in = str; + high_surrogate = 0; + while ((len < 0 || in - str < len) && *in) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + if (high_surrogate) + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); + goto err_out; + } + } + else + { + if (high_surrogate) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); + goto err_out; + } + + if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next1; + } + else + wc = c; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + n_bytes += UTF8_LENGTH (wc); + + next1: + in++; + } + + if (high_surrogate && !items_read) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); + goto err_out; + } + + /* At this point, everything is valid, and we just need to convert + */ + /********** DIFFERENT for UTF8/UCS4 **********/ + result = g_malloc (n_bytes + 1); + + high_surrogate = 0; + out = result; + in = str; + while (out < result + n_bytes) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next2; + } + else + wc = c; + + /********** DIFFERENT for UTF8/UCS4 **********/ + out += g_unichar_to_utf8 (wc, out); + + next2: + in++; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + *out = '\0'; + + if (items_written) + /********** DIFFERENT for UTF8/UCS4 **********/ + *items_written = out - result; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_utf16_to_ucs4: + * @str: a UTF-16 encoded string + * @len: the maximum length (number of gunichar2) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of words read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of characters written, or %NULL. + * The value stored here does not include the trailing + * 0 character. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-16 to UCS-4. The result will be + * nul-terminated. + * + * Return value: a pointer to a newly allocated UCS-4 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar * +g_utf16_to_ucs4 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + const gunichar2 *in; + gchar *out; + gchar *result = NULL; + gint n_bytes; + gunichar high_surrogate; + + g_return_val_if_fail (str != NULL, NULL); + + n_bytes = 0; + in = str; + high_surrogate = 0; + while ((len < 0 || in - str < len) && *in) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + if (high_surrogate) + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); + goto err_out; + } + } + else + { + if (high_surrogate) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); + goto err_out; + } + + if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next1; + } + else + wc = c; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + n_bytes += sizeof (gunichar); + + next1: + in++; + } + + if (high_surrogate && !items_read) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); + goto err_out; + } + + /* At this point, everything is valid, and we just need to convert + */ + /********** DIFFERENT for UTF8/UCS4 **********/ + result = g_malloc (n_bytes + 4); + + high_surrogate = 0; + out = result; + in = str; + while (out < result + n_bytes) + { + gunichar2 c = *in; + gunichar wc; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + wc = SURROGATE_VALUE (high_surrogate, c); + high_surrogate = 0; + } + else if (c >= 0xd800 && c < 0xdc00) /* high surrogate */ + { + high_surrogate = c; + goto next2; + } + else + wc = c; + + /********** DIFFERENT for UTF8/UCS4 **********/ + *(gunichar *)out = wc; + out += sizeof (gunichar); + + next2: + in++; + } + + /********** DIFFERENT for UTF8/UCS4 **********/ + *(gunichar *)out = 0; + + if (items_written) + /********** DIFFERENT for UTF8/UCS4 **********/ + *items_written = (out - result) / sizeof (gunichar); + + err_out: + if (items_read) + *items_read = in - str; + + return (gunichar *)result; +} + +/** + * g_utf8_to_utf16: + * @str: a UTF-8 encoded string + * @len: the maximum length (number of bytes) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If %NULL, then %G_CONVERT_ERROR_PARTIAL_INPUT will be + * returned in case @str contains a trailing partial + * character. If an error occurs then the index of the + * invalid input is stored here. + * @items_written: location to store number of gunichar2 written, + * or %NULL. + * The value stored here does not include the trailing 0. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UTF-8 to UTF-16. A 0 character will be + * added to the result after the converted text. + * + * Return value: a pointer to a newly allocated UTF-16 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar2 * +g_utf8_to_utf16 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gunichar2 *result = NULL; + gint n16; + const gchar *in; + gint i; + + g_return_val_if_fail (str != NULL, NULL); + + in = str; + n16 = 0; + while ((len < 0 || str + len - in > 0) && *in) + { + gunichar wc = g_utf8_get_char_extended (in, len < 0 ? 6 : str + len - in); + if (wc & 0x80000000) + { + if (wc == (gunichar)-2) + { + if (items_read) + break; + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT, + _("Partial character sequence at end of input")); + } + else + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + + goto err_out; + } + + if (wc < 0xd800) + n16 += 1; + else if (wc < 0xe000) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); + + goto err_out; + } + else if (wc < 0x10000) + n16 += 1; + else if (wc < 0x110000) + n16 += 2; + else + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Character out of range for UTF-16")); + + goto err_out; + } + + in = g_utf8_next_char (in); + } + + result = g_new (gunichar2, n16 + 1); + + in = str; + for (i = 0; i < n16;) + { + gunichar wc = g_utf8_get_char (in); + + if (wc < 0x10000) + { + result[i++] = wc; + } + else + { + result[i++] = (wc - 0x10000) / 0x400 + 0xd800; + result[i++] = (wc - 0x10000) % 0x400 + 0xdc00; + } + + in = g_utf8_next_char (in); + } + + result[i] = 0; + + if (items_written) + *items_written = n16; + + err_out: + if (items_read) + *items_read = in - str; + + return result; +} + +/** + * g_ucs4_to_utf16: + * @str: a UCS-4 encoded string + * @len: the maximum length (number of characters) of @str to use. + * If @len < 0, then the string is nul-terminated. + * @items_read: location to store number of bytes read, or %NULL. + * If an error occurs then the index of the invalid input + * is stored here. + * @items_written: location to store number of gunichar2 + * written, or %NULL. The value stored here does not + * include the trailing 0. + * @error: location to store the error occuring, or %NULL to ignore + * errors. Any of the errors in #GConvertError other than + * %G_CONVERT_ERROR_NO_CONVERSION may occur. + * + * Convert a string from UCS-4 to UTF-16. A 0 character will be + * added to the result after the converted text. + * + * Return value: a pointer to a newly allocated UTF-16 string. + * This value must be freed with g_free(). If an + * error occurs, %NULL will be returned and + * @error set. + **/ +gunichar2 * +g_ucs4_to_utf16 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) +{ + gunichar2 *result = NULL; + gint n16; + gint i, j; + + n16 = 0; + i = 0; + while ((len < 0 || i < len) && str[i]) + { + gunichar wc = str[i]; + + if (wc < 0xd800) + n16 += 1; + else if (wc < 0xe000) + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid sequence in conversion input")); + + goto err_out; + } + else if (wc < 0x10000) + n16 += 1; + else if (wc < 0x110000) + n16 += 2; + else + { + g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Character out of range for UTF-16")); + + goto err_out; + } + + i++; + } + + result = g_new (gunichar2, n16 + 1); + + for (i = 0, j = 0; j < n16; i++) + { + gunichar wc = str[i]; + + if (wc < 0x10000) + { + result[j++] = wc; + } + else + { + result[j++] = (wc - 0x10000) / 0x400 + 0xd800; + result[j++] = (wc - 0x10000) % 0x400 + 0xdc00; + } + } + result[j] = 0; + + if (items_written) + *items_written = n16; + + err_out: + if (items_read) + *items_read = i; + + return result; +} + +#define CONTINUATION_CHAR \ + G_STMT_START { \ + if ((*(guchar *)p & 0xc0) != 0x80) /* 10xxxxxx */ \ + goto error; \ + val <<= 6; \ + val |= (*(guchar *)p) & 0x3f; \ + } G_STMT_END + +static const gchar * +fast_validate (const char *str) + +{ + gunichar val = 0; + gunichar min = 0; + const gchar *p; + + for (p = str; *p; p++) + { + if (*(guchar *)p < 128) + /* done */; + else + { + const gchar *last; + + last = p; + if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */ + { + if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0)) + goto error; + p++; + if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */ + goto error; + } + else + { + if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */ + { + min = (1 << 11); + val = *(guchar *)p & 0x0f; + goto TWO_REMAINING; + } + else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */ + { + min = (1 << 16); + val = *(guchar *)p & 0x07; + } + else + goto error; + + p++; + CONTINUATION_CHAR; + TWO_REMAINING: + p++; + CONTINUATION_CHAR; + p++; + CONTINUATION_CHAR; + + if (G_UNLIKELY (val < min)) + goto error; + + if (G_UNLIKELY (!UNICODE_VALID(val))) + goto error; + } + + continue; + + error: + return last; + } + } + + return p; +} + +static const gchar * +fast_validate_len (const char *str, + gssize max_len) + +{ + gunichar val = 0; + gunichar min = 0; + const gchar *p; + + g_assert (max_len >= 0); + + for (p = str; ((p - str) < max_len) && *p; p++) + { + if (*(guchar *)p < 128) + /* done */; + else + { + const gchar *last; + + last = p; + if ((*(guchar *)p & 0xe0) == 0xc0) /* 110xxxxx */ + { + if (G_UNLIKELY (max_len - (p - str) < 2)) + goto error; + + if (G_UNLIKELY ((*(guchar *)p & 0x1e) == 0)) + goto error; + p++; + if (G_UNLIKELY ((*(guchar *)p & 0xc0) != 0x80)) /* 10xxxxxx */ + goto error; + } + else + { + if ((*(guchar *)p & 0xf0) == 0xe0) /* 1110xxxx */ + { + if (G_UNLIKELY (max_len - (p - str) < 3)) + goto error; + + min = (1 << 11); + val = *(guchar *)p & 0x0f; + goto TWO_REMAINING; + } + else if ((*(guchar *)p & 0xf8) == 0xf0) /* 11110xxx */ + { + if (G_UNLIKELY (max_len - (p - str) < 4)) + goto error; + + min = (1 << 16); + val = *(guchar *)p & 0x07; + } + else + goto error; + + p++; + CONTINUATION_CHAR; + TWO_REMAINING: + p++; + CONTINUATION_CHAR; + p++; + CONTINUATION_CHAR; + + if (G_UNLIKELY (val < min)) + goto error; + if (G_UNLIKELY (!UNICODE_VALID(val))) + goto error; + } + + continue; + + error: + return last; + } + } + + return p; +} + +/** + * g_utf8_validate: + * @str: a pointer to character data + * @max_len: max bytes to validate, or -1 to go until NUL + * @end: return location for end of valid data + * + * Validates UTF-8 encoded text. @str is the text to validate; + * if @str is nul-terminated, then @max_len can be -1, otherwise + * @max_len should be the number of bytes to validate. + * If @end is non-%NULL, then the end of the valid range + * will be stored there (i.e. the start of the first invalid + * character if some bytes were invalid, or the end of the text + * being validated otherwise). + * + * Note that g_utf8_validate() returns %FALSE if @max_len is + * positive and NUL is met before @max_len bytes have been read. + * + * Returns %TRUE if all of @str was valid. Many GLib and GTK+ + * routines require valid UTF-8 as input; + * so data read from a file or the network should be checked + * with g_utf8_validate() before doing anything else with it. + * + * Return value: %TRUE if the text was valid UTF-8 + **/ +gboolean +g_utf8_validate (const char *str, + gssize max_len, + const gchar **end) + +{ + const gchar *p; + + if (max_len < 0) + p = fast_validate (str); + else + p = fast_validate_len (str, max_len); + + if (end) + *end = p; + + if ((max_len >= 0 && p != str + max_len) || + (max_len < 0 && *p != '\0')) + return FALSE; + else + return TRUE; +} + +/** + * g_unichar_validate: + * @ch: a Unicode character + * + * Checks whether @ch is a valid Unicode character. Some possible + * integer values of @ch will not be valid. 0 is considered a valid + * character, though it's normally a string terminator. + * + * Return value: %TRUE if @ch is a valid Unicode character + **/ +gboolean +g_unichar_validate (gunichar ch) +{ + return UNICODE_VALID (ch); +} + +/** + * g_utf8_strreverse: + * @str: a UTF-8 encoded string + * @len: the maximum length of @str to use, in bytes. If @len < 0, + * then the string is nul-terminated. + * + * Reverses a UTF-8 string. @str must be valid UTF-8 encoded text. + * (Use g_utf8_validate() on all text before trying to use UTF-8 + * utility functions with it.) + * + * This function is intended for programmatic uses of reversed strings. + * It pays no attention to decomposed characters, combining marks, byte + * order marks, directional indicators (LRM, LRO, etc) and similar + * characters which might need special handling when reversing a string + * for display purposes. + * + * Note that unlike g_strreverse(), this function returns + * newly-allocated memory, which should be freed with g_free() when + * no longer needed. + * + * Returns: a newly-allocated string which is the reverse of @str. + * + * Since: 2.2 + */ +gchar * +g_utf8_strreverse (const gchar *str, + gssize len) +{ + gchar *r, *result; + const gchar *p; + + if (len < 0) + len = strlen (str); + + result = g_new (gchar, len + 1); + r = result + len; + p = str; + while (r > result) + { + gchar *m, skip = g_utf8_skip[*(guchar*) p]; + r -= skip; + for (m = r; skip; skip--) + *m++ = *p++; + } + result[len] = 0; + + return result; +} + + +gchar * +_g_utf8_make_valid (const gchar *name) +{ + GString *string; + const gchar *remainder, *invalid; + gint remaining_bytes, valid_bytes; + + g_return_val_if_fail (name != NULL, NULL); + + string = NULL; + remainder = name; + remaining_bytes = strlen (name); + + while (remaining_bytes != 0) + { + if (g_utf8_validate (remainder, remaining_bytes, &invalid)) + break; + valid_bytes = invalid - remainder; + + if (string == NULL) + string = g_string_sized_new (remaining_bytes); + + g_string_append_len (string, remainder, valid_bytes); + /* append U+FFFD REPLACEMENT CHARACTER */ + g_string_append (string, "\357\277\275"); + + remaining_bytes -= valid_bytes + 1; + remainder = invalid + 1; + } + + if (string == NULL) + return g_strdup (name); + + g_string_append (string, remainder); + + g_assert (g_utf8_validate (string->str, -1, NULL)); + + return g_string_free (string, FALSE); +} + + +#define __G_UTF8_C__ +#include "galiasdef.c" diff --git a/glib/gutils.c b/glib/gutils.c new file mode 100644 index 0000000..744663e --- /dev/null +++ b/glib/gutils.c @@ -0,0 +1,3573 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe for the unix part, FIXME: make the win32 part MT safe as well. + */ + +#include "config.h" + +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#include /* For tolower() */ +#include +#include +#include +#ifdef HAVE_PWD_H +#include +#endif +#include +#ifdef HAVE_SYS_PARAM_H +#include +#endif +#ifdef HAVE_CRT_EXTERNS_H +#include /* for _NSGetEnviron */ +#endif + +/* implement gutils's inline functions + */ +#define G_IMPLEMENT_INLINES 1 +#define __G_UTILS_C__ +#include "glib.h" +#include "gprintfint.h" +#include "gthreadprivate.h" +#include "glibintl.h" +#include "galias.h" + +#ifdef MAXPATHLEN +#define G_PATH_LENGTH MAXPATHLEN +#elif defined (PATH_MAX) +#define G_PATH_LENGTH PATH_MAX +#elif defined (_PC_PATH_MAX) +#define G_PATH_LENGTH sysconf(_PC_PATH_MAX) +#else +#define G_PATH_LENGTH 2048 +#endif + +#ifdef G_PLATFORM_WIN32 +# define STRICT /* Strict typing, please */ +# include +# undef STRICT +# ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS +# define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 2 +# define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 4 +# endif +# include /* For UNLEN */ +#endif /* G_PLATFORM_WIN32 */ + +#ifdef G_OS_WIN32 +# include +# include + /* older SDK (e.g. msvc 5.0) does not have these*/ +# ifndef CSIDL_MYMUSIC +# define CSIDL_MYMUSIC 13 +# endif +# ifndef CSIDL_MYVIDEO +# define CSIDL_MYVIDEO 14 +# endif +# ifndef CSIDL_INTERNET_CACHE +# define CSIDL_INTERNET_CACHE 32 +# endif +# ifndef CSIDL_COMMON_APPDATA +# define CSIDL_COMMON_APPDATA 35 +# endif +# ifndef CSIDL_MYPICTURES +# define CSIDL_MYPICTURES 0x27 +# endif +# ifndef CSIDL_COMMON_DOCUMENTS +# define CSIDL_COMMON_DOCUMENTS 46 +# endif +# ifndef CSIDL_PROFILE +# define CSIDL_PROFILE 40 +# endif +# include +#endif + +#ifdef HAVE_CARBON +#include +#endif + +#ifdef HAVE_CODESET +#include +#endif + +const guint glib_major_version = GLIB_MAJOR_VERSION; +const guint glib_minor_version = GLIB_MINOR_VERSION; +const guint glib_micro_version = GLIB_MICRO_VERSION; +const guint glib_interface_age = GLIB_INTERFACE_AGE; +const guint glib_binary_age = GLIB_BINARY_AGE; + +#ifdef G_PLATFORM_WIN32 + +static HMODULE glib_dll = NULL; + +#ifdef DLL_EXPORT + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + glib_dll = hinstDLL; + + return TRUE; +} + +#endif + +gchar * +_glib_get_dll_directory (void) +{ + gchar *retval; + gchar *p; + wchar_t wc_fn[MAX_PATH]; + +#ifdef DLL_EXPORT + if (glib_dll == NULL) + return NULL; +#endif + + /* This code is different from that in + * g_win32_get_package_installation_directory_of_module() in that + * here we return the actual folder where the GLib DLL is. We don't + * do the check for it being in a "bin" or "lib" subfolder and then + * returning the parent of that. + * + * In a statically built GLib, glib_dll will be NULL and we will + * thus look up the application's .exe file's location. + */ + if (!GetModuleFileNameW (glib_dll, wc_fn, MAX_PATH)) + return NULL; + + retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL); + + p = strrchr (retval, G_DIR_SEPARATOR); + if (p == NULL) + { + /* Wtf? */ + return NULL; + } + *p = '\0'; + + return retval; +} + +#endif + +/** + * glib_check_version: + * @required_major: the required major version. + * @required_minor: the required minor version. + * @required_micro: the required micro version. + * + * Checks that the GLib library in use is compatible with the + * given version. Generally you would pass in the constants + * #GLIB_MAJOR_VERSION, #GLIB_MINOR_VERSION, #GLIB_MICRO_VERSION + * as the three arguments to this function; that produces + * a check that the library in use is compatible with + * the version of GLib the application or module was compiled + * against. + * + * Compatibility is defined by two things: first the version + * of the running library is newer than the version + * @required_major.required_minor.@required_micro. Second + * the running library must be binary compatible with the + * version @required_major.required_minor.@required_micro + * (same major version.) + * + * Return value: %NULL if the GLib library is compatible with the + * given version, or a string describing the version mismatch. + * The returned string is owned by GLib and must not be modified + * or freed. + * + * Since: 2.6 + **/ +const gchar * +glib_check_version (guint required_major, + guint required_minor, + guint required_micro) +{ + gint glib_effective_micro = 100 * GLIB_MINOR_VERSION + GLIB_MICRO_VERSION; + gint required_effective_micro = 100 * required_minor + required_micro; + + if (required_major > GLIB_MAJOR_VERSION) + return "GLib version too old (major mismatch)"; + if (required_major < GLIB_MAJOR_VERSION) + return "GLib version too new (major mismatch)"; + if (required_effective_micro < glib_effective_micro - GLIB_BINARY_AGE) + return "GLib version too new (micro mismatch)"; + if (required_effective_micro > glib_effective_micro) + return "GLib version too old (micro mismatch)"; + return NULL; +} + +#if !defined (HAVE_MEMMOVE) && !defined (HAVE_WORKING_BCOPY) +/** + * g_memmove: + * @dest: the destination address to copy the bytes to. + * @src: the source address to copy the bytes from. + * @len: the number of bytes to copy. + * + * Copies a block of memory @len bytes long, from @src to @dest. + * The source and destination areas may overlap. + * + * In order to use this function, you must include + * string.h yourself, because this macro will + * typically simply resolve to memmove() and GLib does not include + * string.h for you. + */ +void +g_memmove (gpointer dest, + gconstpointer src, + gulong len) +{ + gchar* destptr = dest; + const gchar* srcptr = src; + if (src + len < dest || dest + len < src) + { + bcopy (src, dest, len); + return; + } + else if (dest <= src) + { + while (len--) + *(destptr++) = *(srcptr++); + } + else + { + destptr += len; + srcptr += len; + while (len--) + *(--destptr) = *(--srcptr); + } +} +#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */ + +#ifdef G_OS_WIN32 +#undef g_atexit +#endif + +/** + * g_atexit: + * @func: the function to call on normal program termination. + * + * Specifies a function to be called at normal program termination. + * + * Since GLib 2.8.2, on Windows g_atexit() actually is a preprocessor + * macro that maps to a call to the atexit() function in the C + * library. This means that in case the code that calls g_atexit(), + * i.e. atexit(), is in a DLL, the function will be called when the + * DLL is detached from the program. This typically makes more sense + * than that the function is called when the GLib DLL is detached, + * which happened earlier when g_atexit() was a function in the GLib + * DLL. + * + * The behaviour of atexit() in the context of dynamically loaded + * modules is not formally specified and varies wildly. + * + * On POSIX systems, calling g_atexit() (or atexit()) in a dynamically + * loaded module which is unloaded before the program terminates might + * well cause a crash at program exit. + * + * Some POSIX systems implement atexit() like Windows, and have each + * dynamically loaded module maintain an own atexit chain that is + * called when the module is unloaded. + * + * On other POSIX systems, before a dynamically loaded module is + * unloaded, the registered atexit functions (if any) residing in that + * module are called, regardless where the code that registered them + * resided. This is presumably the most robust approach. + * + * As can be seen from the above, for portability it's best to avoid + * calling g_atexit() (or atexit()) except in the main executable of a + * program. + */ +void +g_atexit (GVoidFunc func) +{ + gint result; + const gchar *error = NULL; + + /* keep this in sync with glib.h */ + +#ifdef G_NATIVE_ATEXIT + result = ATEXIT (func); + if (result) + error = g_strerror (errno); +#elif defined (HAVE_ATEXIT) +# ifdef NeXT /* @#%@! NeXTStep */ + result = !atexit ((void (*)(void)) func); + if (result) + error = g_strerror (errno); +# else + result = atexit ((void (*)(void)) func); + if (result) + error = g_strerror (errno); +# endif /* NeXT */ +#elif defined (HAVE_ON_EXIT) + result = on_exit ((void (*)(int, void *)) func, NULL); + if (result) + error = g_strerror (errno); +#else + result = 0; + error = "no implementation"; +#endif /* G_NATIVE_ATEXIT */ + + if (error) + g_error ("Could not register atexit() function: %s", error); +} + +/* Based on execvp() from GNU Libc. + * Some of this code is cut-and-pasted into gspawn.c + */ + +static gchar* +my_strchrnul (const gchar *str, + gchar c) +{ + gchar *p = (gchar*)str; + while (*p && (*p != c)) + ++p; + + return p; +} + +#ifdef G_OS_WIN32 + +static gchar *inner_find_program_in_path (const gchar *program); + +gchar* +g_find_program_in_path (const gchar *program) +{ + const gchar *last_dot = strrchr (program, '.'); + + if (last_dot == NULL || + strchr (last_dot, '\\') != NULL || + strchr (last_dot, '/') != NULL) + { + const gint program_length = strlen (program); + gchar *pathext = g_build_path (";", + ".exe;.cmd;.bat;.com", + g_getenv ("PATHEXT"), + NULL); + gchar *p; + gchar *decorated_program; + gchar *retval; + + p = pathext; + do + { + gchar *q = my_strchrnul (p, ';'); + + decorated_program = g_malloc (program_length + (q-p) + 1); + memcpy (decorated_program, program, program_length); + memcpy (decorated_program+program_length, p, q-p); + decorated_program [program_length + (q-p)] = '\0'; + + retval = inner_find_program_in_path (decorated_program); + g_free (decorated_program); + + if (retval != NULL) + { + g_free (pathext); + return retval; + } + p = q; + } while (*p++ != '\0'); + g_free (pathext); + return NULL; + } + else + return inner_find_program_in_path (program); +} + +#endif + +/** + * g_find_program_in_path: + * @program: a program name in the GLib file name encoding + * + * Locates the first executable named @program in the user's path, in the + * same way that execvp() would locate it. Returns an allocated string + * with the absolute path name, or %NULL if the program is not found in + * the path. If @program is already an absolute path, returns a copy of + * @program if @program exists and is executable, and %NULL otherwise. + * + * On Windows, if @program does not have a file type suffix, tries + * with the suffixes .exe, .cmd, .bat and .com, and the suffixes in + * the PATHEXT environment variable. + * + * On Windows, it looks for the file in the same way as CreateProcess() + * would. This means first in the directory where the executing + * program was loaded from, then in the current directory, then in the + * Windows 32-bit system directory, then in the Windows directory, and + * finally in the directories in the PATH environment + * variable. If the program is found, the return value contains the + * full name including the type suffix. + * + * Return value: absolute path, or %NULL + **/ +#ifdef G_OS_WIN32 +static gchar * +inner_find_program_in_path (const gchar *program) +#else +gchar* +g_find_program_in_path (const gchar *program) +#endif +{ + const gchar *path, *p; + gchar *name, *freeme; +#ifdef G_OS_WIN32 + const gchar *path_copy; + gchar *filename = NULL, *appdir = NULL; + gchar *sysdir = NULL, *windir = NULL; + int n; + wchar_t wfilename[MAXPATHLEN], wsysdir[MAXPATHLEN], + wwindir[MAXPATHLEN]; +#endif + gsize len; + gsize pathlen; + + g_return_val_if_fail (program != NULL, NULL); + + /* If it is an absolute path, or a relative path including subdirectories, + * don't look in PATH. + */ + if (g_path_is_absolute (program) + || strchr (program, G_DIR_SEPARATOR) != NULL +#ifdef G_OS_WIN32 + || strchr (program, '/') != NULL +#endif + ) + { + if (g_file_test (program, G_FILE_TEST_IS_EXECUTABLE) && + !g_file_test (program, G_FILE_TEST_IS_DIR)) + return g_strdup (program); + else + return NULL; + } + + path = g_getenv ("PATH"); +#if defined(G_OS_UNIX) || defined(G_OS_BEOS) + if (path == NULL) + { + /* There is no `PATH' in the environment. The default + * search path in GNU libc is the current directory followed by + * the path `confstr' returns for `_CS_PATH'. + */ + + /* In GLib we put . last, for security, and don't use the + * unportable confstr(); UNIX98 does not actually specify + * what to search if PATH is unset. POSIX may, dunno. + */ + + path = "/bin:/usr/bin:."; + } +#else + n = GetModuleFileNameW (NULL, wfilename, MAXPATHLEN); + if (n > 0 && n < MAXPATHLEN) + filename = g_utf16_to_utf8 (wfilename, -1, NULL, NULL, NULL); + + n = GetSystemDirectoryW (wsysdir, MAXPATHLEN); + if (n > 0 && n < MAXPATHLEN) + sysdir = g_utf16_to_utf8 (wsysdir, -1, NULL, NULL, NULL); + + n = GetWindowsDirectoryW (wwindir, MAXPATHLEN); + if (n > 0 && n < MAXPATHLEN) + windir = g_utf16_to_utf8 (wwindir, -1, NULL, NULL, NULL); + + if (filename) + { + appdir = g_path_get_dirname (filename); + g_free (filename); + } + + path = g_strdup (path); + + if (windir) + { + const gchar *tem = path; + path = g_strconcat (windir, ";", path, NULL); + g_free ((gchar *) tem); + g_free (windir); + } + + if (sysdir) + { + const gchar *tem = path; + path = g_strconcat (sysdir, ";", path, NULL); + g_free ((gchar *) tem); + g_free (sysdir); + } + + { + const gchar *tem = path; + path = g_strconcat (".;", path, NULL); + g_free ((gchar *) tem); + } + + if (appdir) + { + const gchar *tem = path; + path = g_strconcat (appdir, ";", path, NULL); + g_free ((gchar *) tem); + g_free (appdir); + } + + path_copy = path; +#endif + + len = strlen (program) + 1; + pathlen = strlen (path); + freeme = name = g_malloc (pathlen + len + 1); + + /* Copy the file name at the top, including '\0' */ + memcpy (name + pathlen + 1, program, len); + name = name + pathlen; + /* And add the slash before the filename */ + *name = G_DIR_SEPARATOR; + + p = path; + do + { + char *startp; + + path = p; + p = my_strchrnul (path, G_SEARCHPATH_SEPARATOR); + + if (p == path) + /* Two adjacent colons, or a colon at the beginning or the end + * of `PATH' means to search the current directory. + */ + startp = name + 1; + else + startp = memcpy (name - (p - path), path, p - path); + + if (g_file_test (startp, G_FILE_TEST_IS_EXECUTABLE) && + !g_file_test (startp, G_FILE_TEST_IS_DIR)) + { + gchar *ret; + ret = g_strdup (startp); + g_free (freeme); +#ifdef G_OS_WIN32 + g_free ((gchar *) path_copy); +#endif + return ret; + } + } + while (*p++ != '\0'); + + g_free (freeme); +#ifdef G_OS_WIN32 + g_free ((gchar *) path_copy); +#endif + + return NULL; +} + +static gboolean +debug_key_matches (const gchar *key, + const gchar *token, + guint length) +{ + for (; length; length--, key++, token++) + { + char k = (*key == '_') ? '-' : tolower (*key ); + char t = (*token == '_') ? '-' : tolower (*token); + + if (k != t) + return FALSE; + } + + return *key == '\0'; +} + +/** + * g_parse_debug_string: + * @string: a list of debug options separated by colons, spaces, or + * commas, or %NULL. + * @keys: pointer to an array of #GDebugKey which associate + * strings with bit flags. + * @nkeys: the number of #GDebugKeys in the array. + * + * Parses a string containing debugging options + * into a %guint containing bit flags. This is used + * within GDK and GTK+ to parse the debug options passed on the + * command line or through environment variables. + * + * If @string is equal to "all", all flags are set. If @string + * is equal to "help", all the available keys in @keys are printed + * out to standard error. + * + * Returns: the combined set of bit flags. + */ +guint +g_parse_debug_string (const gchar *string, + const GDebugKey *keys, + guint nkeys) +{ + guint i; + guint result = 0; + + if (string == NULL) + return 0; + + /* this function is used by gmem.c/gslice.c initialization code, + * so introducing malloc dependencies here would require adaptions + * of those code portions. + */ + + if (!g_ascii_strcasecmp (string, "all")) + { + for (i=0; i base)) + base = q; + } +#endif + + if (base) + return base + 1; + +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + return (gchar*) file_name + 2; +#endif /* G_OS_WIN32 */ + + return (gchar*) file_name; +} + +/** + * g_path_get_basename: + * @file_name: the name of the file. + * + * Gets the last component of the filename. If @file_name ends with a + * directory separator it gets the component before the last slash. If + * @file_name consists only of directory separators (and on Windows, + * possibly a drive letter), a single separator is returned. If + * @file_name is empty, it gets ".". + * + * Return value: a newly allocated string containing the last component of + * the filename. + */ +gchar* +g_path_get_basename (const gchar *file_name) +{ + register gssize base; + register gssize last_nonslash; + gsize len; + gchar *retval; + + g_return_val_if_fail (file_name != NULL, NULL); + + if (file_name[0] == '\0') + /* empty string */ + return g_strdup ("."); + + last_nonslash = strlen (file_name) - 1; + + while (last_nonslash >= 0 && G_IS_DIR_SEPARATOR (file_name [last_nonslash])) + last_nonslash--; + + if (last_nonslash == -1) + /* string only containing slashes */ + return g_strdup (G_DIR_SEPARATOR_S); + +#ifdef G_OS_WIN32 + if (last_nonslash == 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + /* string only containing slashes and a drive */ + return g_strdup (G_DIR_SEPARATOR_S); +#endif /* G_OS_WIN32 */ + + base = last_nonslash; + + while (base >=0 && !G_IS_DIR_SEPARATOR (file_name [base])) + base--; + +#ifdef G_OS_WIN32 + if (base == -1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + base = 1; +#endif /* G_OS_WIN32 */ + + len = last_nonslash - base; + retval = g_malloc (len + 1); + memcpy (retval, file_name + base + 1, len); + retval [len] = '\0'; + return retval; +} + +/** + * g_path_is_absolute: + * @file_name: a file name. + * + * Returns %TRUE if the given @file_name is an absolute file name, + * i.e. it contains a full path from the root directory such as "/usr/local" + * on UNIX or "C:\windows" on Windows systems. + * + * Returns: %TRUE if @file_name is an absolute path. + */ +gboolean +g_path_is_absolute (const gchar *file_name) +{ + g_return_val_if_fail (file_name != NULL, FALSE); + + if (G_IS_DIR_SEPARATOR (file_name[0])) + return TRUE; + +#ifdef G_OS_WIN32 + /* Recognize drive letter on native Windows */ + if (g_ascii_isalpha (file_name[0]) && + file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2])) + return TRUE; +#endif /* G_OS_WIN32 */ + + return FALSE; +} + +/** + * g_path_skip_root: + * @file_name: a file name. + * + * Returns a pointer into @file_name after the root component, i.e. after + * the "/" in UNIX or "C:\" under Windows. If @file_name is not an absolute + * path it returns %NULL. + * + * Returns: a pointer into @file_name after the root component. + */ +G_CONST_RETURN gchar* +g_path_skip_root (const gchar *file_name) +{ + g_return_val_if_fail (file_name != NULL, NULL); + +#ifdef G_PLATFORM_WIN32 + /* Skip \\server\share or //server/share */ + if (G_IS_DIR_SEPARATOR (file_name[0]) && + G_IS_DIR_SEPARATOR (file_name[1]) && + file_name[2] && + !G_IS_DIR_SEPARATOR (file_name[2])) + { + gchar *p; + + p = strchr (file_name + 2, G_DIR_SEPARATOR); +#ifdef G_OS_WIN32 + { + gchar *q = strchr (file_name + 2, '/'); + if (p == NULL || (q != NULL && q < p)) + p = q; + } +#endif + if (p && + p > file_name + 2 && + p[1]) + { + file_name = p + 1; + + while (file_name[0] && !G_IS_DIR_SEPARATOR (file_name[0])) + file_name++; + + /* Possibly skip a backslash after the share name */ + if (G_IS_DIR_SEPARATOR (file_name[0])) + file_name++; + + return (gchar *)file_name; + } + } +#endif + + /* Skip initial slashes */ + if (G_IS_DIR_SEPARATOR (file_name[0])) + { + while (G_IS_DIR_SEPARATOR (file_name[0])) + file_name++; + return (gchar *)file_name; + } + +#ifdef G_OS_WIN32 + /* Skip X:\ */ + if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && G_IS_DIR_SEPARATOR (file_name[2])) + return (gchar *)file_name + 3; +#endif + + return NULL; +} + +/** + * g_path_get_dirname: + * @file_name: the name of the file. + * + * Gets the directory components of a file name. If the file name has no + * directory components "." is returned. The returned string should be + * freed when no longer needed. + * + * Returns: the directory components of the file. + */ +gchar* +g_path_get_dirname (const gchar *file_name) +{ + register gchar *base; + register gsize len; + + g_return_val_if_fail (file_name != NULL, NULL); + + base = strrchr (file_name, G_DIR_SEPARATOR); +#ifdef G_OS_WIN32 + { + gchar *q = strrchr (file_name, '/'); + if (base == NULL || (q != NULL && q > base)) + base = q; + } +#endif + if (!base) + { +#ifdef G_OS_WIN32 + if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + { + gchar drive_colon_dot[4]; + + drive_colon_dot[0] = file_name[0]; + drive_colon_dot[1] = ':'; + drive_colon_dot[2] = '.'; + drive_colon_dot[3] = '\0'; + + return g_strdup (drive_colon_dot); + } +#endif + return g_strdup ("."); + } + + while (base > file_name && G_IS_DIR_SEPARATOR (*base)) + base--; + +#ifdef G_OS_WIN32 + /* base points to the char before the last slash. + * + * In case file_name is the root of a drive (X:\) or a child of the + * root of a drive (X:\foo), include the slash. + * + * In case file_name is the root share of an UNC path + * (\\server\share), add a slash, returning \\server\share\ . + * + * In case file_name is a direct child of a share in an UNC path + * (\\server\share\foo), include the slash after the share name, + * returning \\server\share\ . + */ + if (base == file_name + 1 && g_ascii_isalpha (file_name[0]) && file_name[1] == ':') + base++; + else if (G_IS_DIR_SEPARATOR (file_name[0]) && + G_IS_DIR_SEPARATOR (file_name[1]) && + file_name[2] && + !G_IS_DIR_SEPARATOR (file_name[2]) && + base >= file_name + 2) + { + const gchar *p = file_name + 2; + while (*p && !G_IS_DIR_SEPARATOR (*p)) + p++; + if (p == base + 1) + { + len = (guint) strlen (file_name) + 1; + base = g_new (gchar, len + 1); + strcpy (base, file_name); + base[len-1] = G_DIR_SEPARATOR; + base[len] = 0; + return base; + } + if (G_IS_DIR_SEPARATOR (*p)) + { + p++; + while (*p && !G_IS_DIR_SEPARATOR (*p)) + p++; + if (p == base + 1) + base++; + } + } +#endif + + len = (guint) 1 + base - file_name; + + base = g_new (gchar, len + 1); + g_memmove (base, file_name, len); + base[len] = 0; + + return base; +} + +/** + * g_get_current_dir: + * + * Gets the current directory. + * The returned string should be freed when no longer needed. The encoding + * of the returned string is system defined. On Windows, it is always UTF-8. + * + * Returns: the current directory. + */ +gchar* +g_get_current_dir (void) +{ +#ifdef G_OS_WIN32 + + gchar *dir = NULL; + wchar_t dummy[2], *wdir; + int len; + + len = GetCurrentDirectoryW (2, dummy); + wdir = g_new (wchar_t, len); + + if (GetCurrentDirectoryW (len, wdir) == len - 1) + dir = g_utf16_to_utf8 (wdir, -1, NULL, NULL, NULL); + + g_free (wdir); + + if (dir == NULL) + dir = g_strdup ("\\"); + + return dir; + +#else + + gchar *buffer = NULL; + gchar *dir = NULL; + static gulong max_len = 0; + + if (max_len == 0) + max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH; + + /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd") + * and, if that wasn't bad enough, hangs in doing so. + */ +#if (defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD) + buffer = g_new (gchar, max_len + 1); + *buffer = 0; + dir = getwd (buffer); +#else /* !sun || !HAVE_GETCWD */ + while (max_len < G_MAXULONG / 2) + { + g_free (buffer); + buffer = g_new (gchar, max_len + 1); + *buffer = 0; + dir = getcwd (buffer, max_len); + + if (dir || errno != ERANGE) + break; + + max_len *= 2; + } +#endif /* !sun || !HAVE_GETCWD */ + + if (!dir || !*buffer) + { + /* hm, should we g_error() out here? + * this can happen if e.g. "./" has mode \0000 + */ + buffer[0] = G_DIR_SEPARATOR; + buffer[1] = 0; + } + + dir = g_strdup (buffer); + g_free (buffer); + + return dir; +#endif /* !Win32 */ +} + +/** + * g_getenv: + * @variable: the environment variable to get, in the GLib file name encoding. + * + * Returns the value of an environment variable. The name and value + * are in the GLib file name encoding. On UNIX, this means the actual + * bytes which might or might not be in some consistent character set + * and encoding. On Windows, it is in UTF-8. On Windows, in case the + * environment variable's value contains references to other + * environment variables, they are expanded. + * + * Return value: the value of the environment variable, or %NULL if + * the environment variable is not found. The returned string may be + * overwritten by the next call to g_getenv(), g_setenv() or + * g_unsetenv(). + **/ +G_CONST_RETURN gchar* +g_getenv (const gchar *variable) +{ +#ifndef G_OS_WIN32 + + g_return_val_if_fail (variable != NULL, NULL); + + return getenv (variable); + +#else /* G_OS_WIN32 */ + + GQuark quark; + gchar *value; + wchar_t dummy[2], *wname, *wvalue; + int len; + + g_return_val_if_fail (variable != NULL, NULL); + g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), NULL); + + /* On Windows NT, it is relatively typical that environment + * variables contain references to other environment variables. If + * so, use ExpandEnvironmentStrings(). (In an ideal world, such + * environment variables would be stored in the Registry as + * REG_EXPAND_SZ type values, and would then get automatically + * expanded before a program sees them. But there is broken software + * that stores environment variables as REG_SZ values even if they + * contain references to other environment variables.) + */ + + wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); + + len = GetEnvironmentVariableW (wname, dummy, 2); + + if (len == 0) + { + g_free (wname); + return NULL; + } + else if (len == 1) + len = 2; + + wvalue = g_new (wchar_t, len); + + if (GetEnvironmentVariableW (wname, wvalue, len) != len - 1) + { + g_free (wname); + g_free (wvalue); + return NULL; + } + + if (wcschr (wvalue, L'%') != NULL) + { + wchar_t *tem = wvalue; + + len = ExpandEnvironmentStringsW (wvalue, dummy, 2); + + if (len > 0) + { + wvalue = g_new (wchar_t, len); + + if (ExpandEnvironmentStringsW (tem, wvalue, len) != len) + { + g_free (wvalue); + wvalue = tem; + } + else + g_free (tem); + } + } + + value = g_utf16_to_utf8 (wvalue, -1, NULL, NULL, NULL); + + g_free (wname); + g_free (wvalue); + + quark = g_quark_from_string (value); + g_free (value); + + return g_quark_to_string (quark); + +#endif /* G_OS_WIN32 */ +} + +/* _g_getenv_nomalloc + * this function does a getenv() without doing any kind of allocation + * through glib. it's suitable for chars <= 127 only (both, for the + * variable name and the contents) and for contents < 1024 chars in + * length. also, it aliases "" to a NULL return value. + **/ +const gchar* +_g_getenv_nomalloc (const gchar *variable, + gchar buffer[1024]) +{ + const gchar *retval = getenv (variable); + if (retval && retval[0]) + { + gint l = strlen (retval); + if (l < 1024) + { + strncpy (buffer, retval, l); + buffer[l] = 0; + return buffer; + } + } + return NULL; +} + +/** + * g_setenv: + * @variable: the environment variable to set, must not contain '='. + * @value: the value for to set the variable to. + * @overwrite: whether to change the variable if it already exists. + * + * Sets an environment variable. Both the variable's name and value + * should be in the GLib file name encoding. On UNIX, this means that + * they can be any sequence of bytes. On Windows, they should be in + * UTF-8. + * + * Note that on some systems, when variables are overwritten, the memory + * used for the previous variables and its value isn't reclaimed. + * + * Returns: %FALSE if the environment variable couldn't be set. + * + * Since: 2.4 + */ +gboolean +g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite) +{ +#ifndef G_OS_WIN32 + + gint result; +#ifndef HAVE_SETENV + gchar *string; +#endif + + g_return_val_if_fail (variable != NULL, FALSE); + g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE); + +#ifdef HAVE_SETENV + result = setenv (variable, value, overwrite); +#else + if (!overwrite && getenv (variable) != NULL) + return TRUE; + + /* This results in a leak when you overwrite existing + * settings. It would be fairly easy to fix this by keeping + * our own parallel array or hash table. + */ + string = g_strconcat (variable, "=", value, NULL); + result = putenv (string); +#endif + return result == 0; + +#else /* G_OS_WIN32 */ + + gboolean retval; + wchar_t *wname, *wvalue, *wassignment; + gchar *tem; + + g_return_val_if_fail (variable != NULL, FALSE); + g_return_val_if_fail (strchr (variable, '=') == NULL, FALSE); + g_return_val_if_fail (g_utf8_validate (variable, -1, NULL), FALSE); + g_return_val_if_fail (g_utf8_validate (value, -1, NULL), FALSE); + + if (!overwrite && g_getenv (variable) != NULL) + return TRUE; + + /* We want to (if possible) set both the environment variable copy + * kept by the C runtime and the one kept by the system. + * + * We can't use only the C runtime's putenv or _wputenv() as that + * won't work for arbitrary Unicode strings in a "non-Unicode" app + * (with main() and not wmain()). In a "main()" app the C runtime + * initializes the C runtime's environment table by converting the + * real (wide char) environment variables to system codepage, thus + * breaking those that aren't representable in the system codepage. + * + * As the C runtime's putenv() will also set the system copy, we do + * the putenv() first, then call SetEnvironmentValueW ourselves. + */ + + wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); + wvalue = g_utf8_to_utf16 (value, -1, NULL, NULL, NULL); + tem = g_strconcat (variable, "=", value, NULL); + wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL); + + g_free (tem); + _wputenv (wassignment); + g_free (wassignment); + + retval = (SetEnvironmentVariableW (wname, wvalue) != 0); + + g_free (wname); + g_free (wvalue); + + return retval; + +#endif /* G_OS_WIN32 */ +} + +#ifdef HAVE__NSGETENVIRON +#define environ (*_NSGetEnviron()) +#elif !defined(G_OS_WIN32) + +/* According to the Single Unix Specification, environ is not in + * any system header, although unistd.h often declares it. + */ +extern char **environ; +#endif + +/** + * g_unsetenv: + * @variable: the environment variable to remove, must not contain '='. + * + * Removes an environment variable from the environment. + * + * Note that on some systems, when variables are overwritten, the memory + * used for the previous variables and its value isn't reclaimed. + * Furthermore, this function can't be guaranteed to operate in a + * threadsafe way. + * + * Since: 2.4 + **/ +void +g_unsetenv (const gchar *variable) +{ +#ifndef G_OS_WIN32 + +#ifdef HAVE_UNSETENV + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + + unsetenv (variable); +#else /* !HAVE_UNSETENV */ + int len; + gchar **e, **f; + + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + + len = strlen (variable); + + /* Mess directly with the environ array. + * This seems to be the only portable way to do this. + * + * Note that we remove *all* environment entries for + * the variable name, not just the first. + */ + e = f = environ; + while (*e != NULL) + { + if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=') + { + *f = *e; + f++; + } + e++; + } + *f = NULL; +#endif /* !HAVE_UNSETENV */ + +#else /* G_OS_WIN32 */ + + wchar_t *wname, *wassignment; + gchar *tem; + + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + g_return_if_fail (g_utf8_validate (variable, -1, NULL)); + + wname = g_utf8_to_utf16 (variable, -1, NULL, NULL, NULL); + tem = g_strconcat (variable, "=", NULL); + wassignment = g_utf8_to_utf16 (tem, -1, NULL, NULL, NULL); + + g_free (tem); + _wputenv (wassignment); + g_free (wassignment); + + SetEnvironmentVariableW (wname, NULL); + + g_free (wname); + +#endif /* G_OS_WIN32 */ +} + +/** + * g_listenv: + * + * Gets the names of all variables set in the environment. + * + * Returns: a %NULL-terminated list of strings which must be freed + * with g_strfreev(). + * + * Programs that want to be portable to Windows should typically use + * this function and g_getenv() instead of using the environ array + * from the C library directly. On Windows, the strings in the environ + * array are in system codepage encoding, while in most of the typical + * use cases for environment variables in GLib-using programs you want + * the UTF-8 encoding that this function and g_getenv() provide. + * + * Since: 2.8 + */ +gchar ** +g_listenv (void) +{ +#ifndef G_OS_WIN32 + gchar **result, *eq; + gint len, i, j; + + len = g_strv_length (environ); + result = g_new0 (gchar *, len + 1); + + j = 0; + for (i = 0; i < len; i++) + { + eq = strchr (environ[i], '='); + if (eq) + result[j++] = g_strndup (environ[i], eq - environ[i]); + } + + result[j] = NULL; + + return result; +#else + gchar **result, *eq; + gint len = 0, j; + wchar_t *p, *q; + + p = (wchar_t *) GetEnvironmentStringsW (); + if (p != NULL) + { + q = p; + while (*q) + { + q += wcslen (q) + 1; + len++; + } + } + result = g_new0 (gchar *, len + 1); + + j = 0; + q = p; + while (*q) + { + result[j] = g_utf16_to_utf8 (q, -1, NULL, NULL, NULL); + if (result[j] != NULL) + { + eq = strchr (result[j], '='); + if (eq && eq > result[j]) + { + *eq = '\0'; + j++; + } + else + g_free (result[j]); + } + q += wcslen (q) + 1; + } + result[j] = NULL; + FreeEnvironmentStringsW (p); + + return result; +#endif +} + +G_LOCK_DEFINE_STATIC (g_utils_global); + +static gchar *g_tmp_dir = NULL; +static gchar *g_user_name = NULL; +static gchar *g_real_name = NULL; +static gchar *g_home_dir = NULL; +static gchar *g_host_name = NULL; + +#ifdef G_OS_WIN32 +/* System codepage versions of the above, kept at file level so that they, + * too, are produced only once. + */ +static gchar *g_tmp_dir_cp = NULL; +static gchar *g_user_name_cp = NULL; +static gchar *g_real_name_cp = NULL; +static gchar *g_home_dir_cp = NULL; +#endif + +static gchar *g_user_data_dir = NULL; +static gchar **g_system_data_dirs = NULL; +static gchar *g_user_cache_dir = NULL; +static gchar *g_user_config_dir = NULL; +static gchar **g_system_config_dirs = NULL; + +static gchar **g_user_special_dirs = NULL; + +/* fifteen minutes of fame for everybody */ +#define G_USER_DIRS_EXPIRE 15 * 60 + +#ifdef G_OS_WIN32 + +static gchar * +get_special_folder (int csidl) +{ + wchar_t path[MAX_PATH+1]; + HRESULT hr; + LPITEMIDLIST pidl = NULL; + BOOL b; + gchar *retval = NULL; + + hr = SHGetSpecialFolderLocation (NULL, csidl, &pidl); + if (hr == S_OK) + { + b = SHGetPathFromIDListW (pidl, path); + if (b) + retval = g_utf16_to_utf8 (path, -1, NULL, NULL, NULL); + CoTaskMemFree (pidl); + } + return retval; +} + +static char * +get_windows_directory_root (void) +{ + wchar_t wwindowsdir[MAX_PATH]; + + if (GetWindowsDirectoryW (wwindowsdir, G_N_ELEMENTS (wwindowsdir))) + { + /* Usually X:\Windows, but in terminal server environments + * might be an UNC path, AFAIK. + */ + char *windowsdir = g_utf16_to_utf8 (wwindowsdir, -1, NULL, NULL, NULL); + char *p; + + if (windowsdir == NULL) + return g_strdup ("C:\\"); + + p = (char *) g_path_skip_root (windowsdir); + if (G_IS_DIR_SEPARATOR (p[-1]) && p[-2] != ':') + p--; + *p = '\0'; + return windowsdir; + } + else + return g_strdup ("C:\\"); +} + +#endif + +/* HOLDS: g_utils_global_lock */ +static void +g_get_any_init_do (void) +{ + gchar hostname[100]; + + g_tmp_dir = g_strdup (g_getenv ("TMPDIR")); + if (!g_tmp_dir) + g_tmp_dir = g_strdup (g_getenv ("TMP")); + if (!g_tmp_dir) + g_tmp_dir = g_strdup (g_getenv ("TEMP")); + +#ifdef G_OS_WIN32 + if (!g_tmp_dir) + g_tmp_dir = get_windows_directory_root (); +#else +#ifdef P_tmpdir + if (!g_tmp_dir) + { + gsize k; + g_tmp_dir = g_strdup (P_tmpdir); + k = strlen (g_tmp_dir); + if (k > 1 && G_IS_DIR_SEPARATOR (g_tmp_dir[k - 1])) + g_tmp_dir[k - 1] = '\0'; + } +#endif + + if (!g_tmp_dir) + { + g_tmp_dir = g_strdup ("/tmp"); + } +#endif /* !G_OS_WIN32 */ + +#ifdef G_OS_WIN32 + /* We check $HOME first for Win32, though it is a last resort for Unix + * where we prefer the results of getpwuid(). + */ + g_home_dir = g_strdup (g_getenv ("HOME")); + + /* Only believe HOME if it is an absolute path and exists */ + if (g_home_dir) + { + if (!(g_path_is_absolute (g_home_dir) && + g_file_test (g_home_dir, G_FILE_TEST_IS_DIR))) + { + g_free (g_home_dir); + g_home_dir = NULL; + } + } + + /* In case HOME is Unix-style (it happens), convert it to + * Windows style. + */ + if (g_home_dir) + { + gchar *p; + while ((p = strchr (g_home_dir, '/')) != NULL) + *p = '\\'; + } + + if (!g_home_dir) + { + /* USERPROFILE is probably the closest equivalent to $HOME? */ + if (g_getenv ("USERPROFILE") != NULL) + g_home_dir = g_strdup (g_getenv ("USERPROFILE")); + } + + if (!g_home_dir) + g_home_dir = get_special_folder (CSIDL_PROFILE); + + if (!g_home_dir) + g_home_dir = get_windows_directory_root (); +#endif /* G_OS_WIN32 */ + +#ifdef HAVE_PWD_H + { + struct passwd *pw = NULL; + gpointer buffer = NULL; + gint error; + gchar *logname; + +# if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R) + struct passwd pwd; +# ifdef _SC_GETPW_R_SIZE_MAX + /* This reurns the maximum length */ + glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX); + + if (bufsize < 0) + bufsize = 64; +# else /* _SC_GETPW_R_SIZE_MAX */ + glong bufsize = 64; +# endif /* _SC_GETPW_R_SIZE_MAX */ + + logname = (gchar *) g_getenv ("LOGNAME"); + + do + { + g_free (buffer); + /* we allocate 6 extra bytes to work around a bug in + * Mac OS < 10.3. See #156446 + */ + buffer = g_malloc (bufsize + 6); + errno = 0; + +# ifdef HAVE_POSIX_GETPWUID_R + if (logname) { + error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw); + if (!pw || (pw->pw_uid != getuid ())) { + /* LOGNAME is lying, fall back to looking up the uid */ + error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); + } + } else { + error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw); + } + error = error < 0 ? errno : error; +# else /* HAVE_NONPOSIX_GETPWUID_R */ + /* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */ +# if defined(_AIX) || defined(__hpux) + error = getpwuid_r (getuid (), &pwd, buffer, bufsize); + pw = error == 0 ? &pwd : NULL; +# else /* !_AIX */ + if (logname) { + pw = getpwnam_r (logname, &pwd, buffer, bufsize); + if (!pw || (pw->pw_uid != getuid ())) { + /* LOGNAME is lying, fall back to looking up the uid */ + pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); + } + } else { + pw = getpwuid_r (getuid (), &pwd, buffer, bufsize); + } + error = pw ? 0 : errno; +# endif /* !_AIX */ +# endif /* HAVE_NONPOSIX_GETPWUID_R */ + + if (!pw) + { + /* we bail out prematurely if the user id can't be found + * (should be pretty rare case actually), or if the buffer + * should be sufficiently big and lookups are still not + * successfull. + */ + if (error == 0 || error == ENOENT) + { + g_warning ("getpwuid_r(): failed due to unknown user id (%lu)", + (gulong) getuid ()); + break; + } + if (bufsize > 32 * 1024) + { + g_warning ("getpwuid_r(): failed due to: %s.", + g_strerror (error)); + break; + } + + bufsize *= 2; + } + } + while (!pw); +# endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */ + + if (!pw) + { + setpwent (); + pw = getpwuid (getuid ()); + endpwent (); + } + if (pw) + { + g_user_name = g_strdup (pw->pw_name); + + if (pw->pw_gecos && *pw->pw_gecos != '\0') + { + gchar **gecos_fields; + gchar **name_parts; + + /* split the gecos field and substitute '&' */ + gecos_fields = g_strsplit (pw->pw_gecos, ",", 0); + name_parts = g_strsplit (gecos_fields[0], "&", 0); + pw->pw_name[0] = g_ascii_toupper (pw->pw_name[0]); + g_real_name = g_strjoinv (pw->pw_name, name_parts); + g_strfreev (gecos_fields); + g_strfreev (name_parts); + } + + if (!g_home_dir) + g_home_dir = g_strdup (pw->pw_dir); + } + g_free (buffer); + } + +#else /* !HAVE_PWD_H */ + +#ifdef G_OS_WIN32 + { + guint len = UNLEN+1; + wchar_t buffer[UNLEN+1]; + + if (GetUserNameW (buffer, (LPDWORD) &len)) + { + g_user_name = g_utf16_to_utf8 (buffer, -1, NULL, NULL, NULL); + g_real_name = g_strdup (g_user_name); + } + } +#endif /* G_OS_WIN32 */ + +#endif /* !HAVE_PWD_H */ + +#ifndef G_OS_WIN32 + if (!g_home_dir) + g_home_dir = g_strdup (g_getenv ("HOME")); +#endif + +#ifdef __EMX__ + /* change '\\' in %HOME% to '/' */ + g_strdelimit (g_home_dir, "\\",'/'); +#endif + if (!g_user_name) + g_user_name = g_strdup ("somebody"); + if (!g_real_name) + g_real_name = g_strdup ("Unknown"); + + { +#ifndef G_OS_WIN32 + gboolean hostname_fail = (gethostname (hostname, sizeof (hostname)) == -1); +#else + DWORD size = sizeof (hostname); + gboolean hostname_fail = (!GetComputerName (hostname, &size)); +#endif + g_host_name = g_strdup (hostname_fail ? "localhost" : hostname); + } + +#ifdef G_OS_WIN32 + g_tmp_dir_cp = g_locale_from_utf8 (g_tmp_dir, -1, NULL, NULL, NULL); + g_user_name_cp = g_locale_from_utf8 (g_user_name, -1, NULL, NULL, NULL); + g_real_name_cp = g_locale_from_utf8 (g_real_name, -1, NULL, NULL, NULL); + + if (!g_tmp_dir_cp) + g_tmp_dir_cp = g_strdup ("\\"); + if (!g_user_name_cp) + g_user_name_cp = g_strdup ("somebody"); + if (!g_real_name_cp) + g_real_name_cp = g_strdup ("Unknown"); + + /* home_dir might be NULL, unlike tmp_dir, user_name and + * real_name. + */ + if (g_home_dir) + g_home_dir_cp = g_locale_from_utf8 (g_home_dir, -1, NULL, NULL, NULL); + else + g_home_dir_cp = NULL; +#endif /* G_OS_WIN32 */ +} + +static inline void +g_get_any_init (void) +{ + if (!g_tmp_dir) + g_get_any_init_do (); +} + +static inline void +g_get_any_init_locked (void) +{ + G_LOCK (g_utils_global); + g_get_any_init (); + G_UNLOCK (g_utils_global); +} + + +/** + * g_get_user_name: + * + * Gets the user name of the current user. The encoding of the returned + * string is system-defined. On UNIX, it might be the preferred file name + * encoding, or something else, and there is no guarantee that it is even + * consistent on a machine. On Windows, it is always UTF-8. + * + * Returns: the user name of the current user. + */ +G_CONST_RETURN gchar* +g_get_user_name (void) +{ + g_get_any_init_locked (); + return g_user_name; +} + +/** + * g_get_real_name: + * + * Gets the real name of the user. This usually comes from the user's entry + * in the passwd file. The encoding of the returned + * string is system-defined. (On Windows, it is, however, always UTF-8.) + * If the real user name cannot be determined, the string "Unknown" is + * returned. + * + * Returns: the user's real name. + */ +G_CONST_RETURN gchar* +g_get_real_name (void) +{ + g_get_any_init_locked (); + return g_real_name; +} + +/** + * g_get_home_dir: + * + * Gets the current user's home directory as defined in the + * password database. + * + * Note that in contrast to traditional UNIX tools, this function + * prefers passwd entries over the HOME + * environment variable. + * + * One of the reasons for this decision is that applications in many + * cases need special handling to deal with the case where + * HOME is + * + * Not owned by the user + * Not writeable + * Not even readable + * + * Since applications are in general not written + * to deal with these situations it was considered better to make + * g_get_home_dir() not pay attention to HOME and to + * return the real home directory for the user. If applications + * want to pay attention to HOME, they can do: + * |[ + * const char *homedir = g_getenv ("HOME"); + * if (!homedir) + * homedir = g_get_home_dir (); + * ]| + * + * Returns: the current user's home directory + */ +G_CONST_RETURN gchar* +g_get_home_dir (void) +{ + g_get_any_init_locked (); + return g_home_dir; +} + +/** + * g_get_tmp_dir: + * + * Gets the directory to use for temporary files. This is found from + * inspecting the environment variables TMPDIR, + * TMP, and TEMP in that order. If none + * of those are defined "/tmp" is returned on UNIX and "C:\" on Windows. + * The encoding of the returned string is system-defined. On Windows, + * it is always UTF-8. The return value is never %NULL. + * + * Returns: the directory to use for temporary files. + */ +G_CONST_RETURN gchar* +g_get_tmp_dir (void) +{ + g_get_any_init_locked (); + return g_tmp_dir; +} + +/** + * g_get_host_name: + * + * Return a name for the machine. + * + * The returned name is not necessarily a fully-qualified domain name, + * or even present in DNS or some other name service at all. It need + * not even be unique on your local network or site, but usually it + * is. Callers should not rely on the return value having any specific + * properties like uniqueness for security purposes. Even if the name + * of the machine is changed while an application is running, the + * return value from this function does not change. The returned + * string is owned by GLib and should not be modified or freed. If no + * name can be determined, a default fixed string "localhost" is + * returned. + * + * Returns: the host name of the machine. + * + * Since: 2.8 + */ +const gchar * +g_get_host_name (void) +{ + g_get_any_init_locked (); + return g_host_name; +} + +G_LOCK_DEFINE_STATIC (g_prgname); +static gchar *g_prgname = NULL; + +/** + * g_get_prgname: + * + * Gets the name of the program. This name should not + * be localized, contrast with g_get_application_name(). + * (If you are using GDK or GTK+ the program name is set in gdk_init(), + * which is called by gtk_init(). The program name is found by taking + * the last component of argv[0].) + * + * Returns: the name of the program. The returned string belongs + * to GLib and must not be modified or freed. + */ +gchar* +g_get_prgname (void) +{ + gchar* retval; + + G_LOCK (g_prgname); +#ifdef G_OS_WIN32 + if (g_prgname == NULL) + { + static gboolean beenhere = FALSE; + + if (!beenhere) + { + gchar *utf8_buf = NULL; + wchar_t buf[MAX_PATH+1]; + + beenhere = TRUE; + if (GetModuleFileNameW (GetModuleHandle (NULL), + buf, G_N_ELEMENTS (buf)) > 0) + utf8_buf = g_utf16_to_utf8 (buf, -1, NULL, NULL, NULL); + + if (utf8_buf) + { + g_prgname = g_path_get_basename (utf8_buf); + g_free (utf8_buf); + } + } + } +#endif + retval = g_prgname; + G_UNLOCK (g_prgname); + + return retval; +} + +/** + * g_set_prgname: + * @prgname: the name of the program. + * + * Sets the name of the program. This name should not + * be localized, contrast with g_set_application_name(). Note that for + * thread-safety reasons this function can only be called once. + */ +void +g_set_prgname (const gchar *prgname) +{ + G_LOCK (g_prgname); + g_free (g_prgname); + g_prgname = g_strdup (prgname); + G_UNLOCK (g_prgname); +} + +G_LOCK_DEFINE_STATIC (g_application_name); +static gchar *g_application_name = NULL; + +/** + * g_get_application_name: + * + * Gets a human-readable name for the application, as set by + * g_set_application_name(). This name should be localized if + * possible, and is intended for display to the user. Contrast with + * g_get_prgname(), which gets a non-localized name. If + * g_set_application_name() has not been called, returns the result of + * g_get_prgname() (which may be %NULL if g_set_prgname() has also not + * been called). + * + * Return value: human-readable application name. may return %NULL + * + * Since: 2.2 + **/ +G_CONST_RETURN gchar* +g_get_application_name (void) +{ + gchar* retval; + + G_LOCK (g_application_name); + retval = g_application_name; + G_UNLOCK (g_application_name); + + if (retval == NULL) + return g_get_prgname (); + + return retval; +} + +/** + * g_set_application_name: + * @application_name: localized name of the application + * + * Sets a human-readable name for the application. This name should be + * localized if possible, and is intended for display to the user. + * Contrast with g_set_prgname(), which sets a non-localized name. + * g_set_prgname() will be called automatically by gtk_init(), + * but g_set_application_name() will not. + * + * Note that for thread safety reasons, this function can only + * be called once. + * + * The application name will be used in contexts such as error messages, + * or when displaying an application's name in the task list. + * + * Since: 2.2 + **/ +void +g_set_application_name (const gchar *application_name) +{ + gboolean already_set = FALSE; + + G_LOCK (g_application_name); + if (g_application_name) + already_set = TRUE; + else + g_application_name = g_strdup (application_name); + G_UNLOCK (g_application_name); + + if (already_set) + g_warning ("g_set_application_name() called multiple times"); +} + +/** + * g_get_user_data_dir: + * + * Returns a base directory in which to access application data such + * as icons that is customized for a particular user. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar* +g_get_user_data_dir (void) +{ + gchar *data_dir; + + G_LOCK (g_utils_global); + + if (!g_user_data_dir) + { +#ifdef G_OS_WIN32 + data_dir = get_special_folder (CSIDL_PERSONAL); +#else + data_dir = (gchar *) g_getenv ("XDG_DATA_HOME"); + + if (data_dir && data_dir[0]) + data_dir = g_strdup (data_dir); +#endif + if (!data_dir || !data_dir[0]) + { + g_get_any_init (); + + if (g_home_dir) + data_dir = g_build_filename (g_home_dir, ".local", + "share", NULL); + else + data_dir = g_build_filename (g_tmp_dir, g_user_name, ".local", + "share", NULL); + } + + g_user_data_dir = data_dir; + } + else + data_dir = g_user_data_dir; + + G_UNLOCK (g_utils_global); + + return data_dir; +} + +static void +g_init_user_config_dir (void) +{ + gchar *config_dir; + + if (!g_user_config_dir) + { +#ifdef G_OS_WIN32 + config_dir = get_special_folder (CSIDL_APPDATA); +#else + config_dir = (gchar *) g_getenv ("XDG_CONFIG_HOME"); + + if (config_dir && config_dir[0]) + config_dir = g_strdup (config_dir); +#endif + if (!config_dir || !config_dir[0]) + { + g_get_any_init (); + + if (g_home_dir) + config_dir = g_build_filename (g_home_dir, ".config", NULL); + else + config_dir = g_build_filename (g_tmp_dir, g_user_name, ".config", NULL); + } + + g_user_config_dir = config_dir; + } +} + +/** + * g_get_user_config_dir: + * + * Returns a base directory in which to store user-specific application + * configuration information such as user preferences and settings. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar* +g_get_user_config_dir (void) +{ + G_LOCK (g_utils_global); + + g_init_user_config_dir (); + + G_UNLOCK (g_utils_global); + + return g_user_config_dir; +} + +/** + * g_get_user_cache_dir: + * + * Returns a base directory in which to store non-essential, cached + * data specific to particular user. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar* +g_get_user_cache_dir (void) +{ + gchar *cache_dir; + + G_LOCK (g_utils_global); + + if (!g_user_cache_dir) + { +#ifdef G_OS_WIN32 + cache_dir = get_special_folder (CSIDL_INTERNET_CACHE); /* XXX correct? */ +#else + cache_dir = (gchar *) g_getenv ("XDG_CACHE_HOME"); + + if (cache_dir && cache_dir[0]) + cache_dir = g_strdup (cache_dir); +#endif + if (!cache_dir || !cache_dir[0]) + { + g_get_any_init (); + + if (g_home_dir) + cache_dir = g_build_filename (g_home_dir, ".cache", NULL); + else + cache_dir = g_build_filename (g_tmp_dir, g_user_name, ".cache", NULL); + } + g_user_cache_dir = cache_dir; + } + else + cache_dir = g_user_cache_dir; + + G_UNLOCK (g_utils_global); + + return cache_dir; +} + +#ifdef HAVE_CARBON + +static gchar * +find_folder (OSType type) +{ + gchar *filename = NULL; + FSRef found; + + if (FSFindFolder (kUserDomain, type, kDontCreateFolder, &found) == noErr) + { + CFURLRef url = CFURLCreateFromFSRef (kCFAllocatorSystemDefault, &found); + + if (url) + { + CFStringRef path = CFURLCopyFileSystemPath (url, kCFURLPOSIXPathStyle); + + if (path) + { + filename = g_strdup (CFStringGetCStringPtr (path, kCFStringEncodingUTF8)); + + if (! filename) + { + filename = g_new0 (gchar, CFStringGetLength (path) * 3 + 1); + + CFStringGetCString (path, filename, + CFStringGetLength (path) * 3 + 1, + kCFStringEncodingUTF8); + } + + CFRelease (path); + } + + CFRelease (url); + } + } + + return filename; +} + +static void +load_user_special_dirs (void) +{ + g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = find_folder (kDesktopFolderType); + g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = find_folder (kDocumentsFolderType); + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = find_folder (kDesktopFolderType); /* XXX correct ? */ + g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = find_folder (kMusicDocumentsFolderType); + g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = find_folder (kPictureDocumentsFolderType); + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = NULL; + g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = NULL; + g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = find_folder (kMovieDocumentsFolderType); +} + +#endif /* HAVE_CARBON */ + +#if defined(G_OS_WIN32) +static void +load_user_special_dirs (void) +{ + typedef HRESULT (WINAPI *t_SHGetKnownFolderPath) (const GUID *rfid, + DWORD dwFlags, + HANDLE hToken, + PWSTR *ppszPath); + t_SHGetKnownFolderPath p_SHGetKnownFolderPath; + static const GUID FOLDERID_Downloads = + { 0x374de290, 0x123f, 0x4565, { 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b } }; + static const GUID FOLDERID_Public = + { 0xDFDF76A2, 0xC82A, 0x4D63, { 0x90, 0x6A, 0x56, 0x44, 0xAC, 0x45, 0x73, 0x85 } }; + wchar_t *wcp; + + p_SHGetKnownFolderPath = (t_SHGetKnownFolderPath) GetProcAddress (LoadLibrary ("shell32.dll"), + "SHGetKnownFolderPath"); + + g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + g_user_special_dirs[G_USER_DIRECTORY_DOCUMENTS] = get_special_folder (CSIDL_PERSONAL); + + if (p_SHGetKnownFolderPath == NULL) + { + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + } + else + { + wcp = NULL; + (*p_SHGetKnownFolderPath) (&FOLDERID_Downloads, 0, NULL, &wcp); + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL); + if (g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] == NULL) + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + CoTaskMemFree (wcp); + } + + g_user_special_dirs[G_USER_DIRECTORY_MUSIC] = get_special_folder (CSIDL_MYMUSIC); + g_user_special_dirs[G_USER_DIRECTORY_PICTURES] = get_special_folder (CSIDL_MYPICTURES); + + if (p_SHGetKnownFolderPath == NULL) + { + /* XXX */ + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); + } + else + { + wcp = NULL; + (*p_SHGetKnownFolderPath) (&FOLDERID_Public, 0, NULL, &wcp); + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = g_utf16_to_utf8 (wcp, -1, NULL, NULL, NULL); + if (g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] == NULL) + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); + CoTaskMemFree (wcp); + } + + g_user_special_dirs[G_USER_DIRECTORY_TEMPLATES] = get_special_folder (CSIDL_TEMPLATES); + g_user_special_dirs[G_USER_DIRECTORY_VIDEOS] = get_special_folder (CSIDL_MYVIDEO); +} +#endif /* G_OS_WIN32 */ + +static void g_init_user_config_dir (void); + +#if defined(G_OS_UNIX) && !defined(HAVE_CARBON) + +/* adapted from xdg-user-dir-lookup.c + * + * Copyright (C) 2007 Red Hat Inc. + * + * 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. + */ +static void +load_user_special_dirs (void) +{ + gchar *config_file; + gchar *data; + gchar **lines; + gint n_lines, i; + + g_init_user_config_dir (); + config_file = g_build_filename (g_user_config_dir, + "user-dirs.dirs", + NULL); + + if (!g_file_get_contents (config_file, &data, NULL, NULL)) + { + g_free (config_file); + return; + } + + lines = g_strsplit (data, "\n", -1); + n_lines = g_strv_length (lines); + g_free (data); + + for (i = 0; i < n_lines; i++) + { + gchar *buffer = lines[i]; + gchar *d, *p; + gint len; + gboolean is_relative = FALSE; + GUserDirectory directory; + + /* Remove newline at end */ + len = strlen (buffer); + if (len > 0 && buffer[len - 1] == '\n') + buffer[len - 1] = 0; + + p = buffer; + while (*p == ' ' || *p == '\t') + p++; + + if (strncmp (p, "XDG_DESKTOP_DIR", strlen ("XDG_DESKTOP_DIR")) == 0) + { + directory = G_USER_DIRECTORY_DESKTOP; + p += strlen ("XDG_DESKTOP_DIR"); + } + else if (strncmp (p, "XDG_DOCUMENTS_DIR", strlen ("XDG_DOCUMENTS_DIR")) == 0) + { + directory = G_USER_DIRECTORY_DOCUMENTS; + p += strlen ("XDG_DOCUMENTS_DIR"); + } + else if (strncmp (p, "XDG_DOWNLOAD_DIR", strlen ("XDG_DOWNLOAD_DIR")) == 0) + { + directory = G_USER_DIRECTORY_DOWNLOAD; + p += strlen ("XDG_DOWNLOAD_DIR"); + } + else if (strncmp (p, "XDG_MUSIC_DIR", strlen ("XDG_MUSIC_DIR")) == 0) + { + directory = G_USER_DIRECTORY_MUSIC; + p += strlen ("XDG_MUSIC_DIR"); + } + else if (strncmp (p, "XDG_PICTURES_DIR", strlen ("XDG_PICTURES_DIR")) == 0) + { + directory = G_USER_DIRECTORY_PICTURES; + p += strlen ("XDG_PICTURES_DIR"); + } + else if (strncmp (p, "XDG_PUBLICSHARE_DIR", strlen ("XDG_PUBLICSHARE_DIR")) == 0) + { + directory = G_USER_DIRECTORY_PUBLIC_SHARE; + p += strlen ("XDG_PUBLICSHARE_DIR"); + } + else if (strncmp (p, "XDG_TEMPLATES_DIR", strlen ("XDG_TEMPLATES_DIR")) == 0) + { + directory = G_USER_DIRECTORY_TEMPLATES; + p += strlen ("XDG_TEMPLATES_DIR"); + } + else if (strncmp (p, "XDG_VIDEOS_DIR", strlen ("XDG_VIDEOS_DIR")) == 0) + { + directory = G_USER_DIRECTORY_VIDEOS; + p += strlen ("XDG_VIDEOS_DIR"); + } + else + continue; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '=') + continue; + p++; + + while (*p == ' ' || *p == '\t') + p++; + + if (*p != '"') + continue; + p++; + + if (strncmp (p, "$HOME", 5) == 0) + { + p += 5; + is_relative = TRUE; + } + else if (*p != '/') + continue; + + d = strrchr (p, '"'); + if (!d) + continue; + *d = 0; + + d = p; + + /* remove trailing slashes */ + len = strlen (d); + if (d[len - 1] == '/') + d[len - 1] = 0; + + if (is_relative) + { + g_get_any_init (); + g_user_special_dirs[directory] = g_build_filename (g_home_dir, d, NULL); + } + else + g_user_special_dirs[directory] = g_strdup (d); + } + + g_strfreev (lines); + g_free (config_file); +} + +#endif /* G_OS_UNIX && !HAVE_CARBON */ + + +/** + * g_reload_user_special_dirs_cache: + * + * Resets the cache used for g_get_user_special_dir(), so + * that the latest on-disk version is used. Call this only + * if you just changed the data on disk yourself. + * + * Due to threadsafety issues this may cause leaking of strings + * that were previously returned from g_get_user_special_dir() + * that can't be freed. We ensure to only leak the data for + * the directories that actually changed value though. + * + * Since: 2.22 + */ +void +g_reload_user_special_dirs_cache (void) +{ + int i; + + G_LOCK (g_utils_global); + + if (g_user_special_dirs != NULL) + { + /* save a copy of the pointer, to check if some memory can be preserved */ + char **old_g_user_special_dirs = g_user_special_dirs; + char *old_val; + + /* recreate and reload our cache */ + g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES); + load_user_special_dirs (); + + /* only leak changed directories */ + for (i = 0; i < G_USER_N_DIRECTORIES; i++) + { + old_val = old_g_user_special_dirs[i]; + if (g_strcmp0 (old_val, g_user_special_dirs[i]) == 0) + { + /* don't leak */ + g_free (g_user_special_dirs[i]); + g_user_special_dirs[i] = old_val; + } + else + g_free (old_val); + } + + /* free the old array */ + g_free (old_g_user_special_dirs); + } + + G_UNLOCK (g_utils_global); +} + +/** + * g_get_user_special_dir: + * @directory: the logical id of special directory + * + * Returns the full path of a special directory using its logical id. + * + * On Unix this is done using the XDG special user directories. + * For compatibility with existing practise, %G_USER_DIRECTORY_DESKTOP + * falls back to $HOME/Desktop when XDG special + * user directories have not been set up. + * + * Depending on the platform, the user might be able to change the path + * of the special directory without requiring the session to restart; GLib + * will not reflect any change once the special directories are loaded. + * + * Return value: the path to the specified special directory, or %NULL + * if the logical id was not found. The returned string is owned by + * GLib and should not be modified or freed. + * + * Since: 2.14 + */ +G_CONST_RETURN gchar * +g_get_user_special_dir (GUserDirectory directory) +{ + g_return_val_if_fail (directory >= G_USER_DIRECTORY_DESKTOP && + directory < G_USER_N_DIRECTORIES, NULL); + + G_LOCK (g_utils_global); + + if (G_UNLIKELY (g_user_special_dirs == NULL)) + { + g_user_special_dirs = g_new0 (gchar *, G_USER_N_DIRECTORIES); + + load_user_special_dirs (); + + /* Special-case desktop for historical compatibility */ + if (g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] == NULL) + { + g_get_any_init (); + + g_user_special_dirs[G_USER_DIRECTORY_DESKTOP] = + g_build_filename (g_home_dir, "Desktop", NULL); + } + } + + G_UNLOCK (g_utils_global); + + return g_user_special_dirs[directory]; +} + +#ifdef G_OS_WIN32 + +#undef g_get_system_data_dirs + +static HMODULE +get_module_for_address (gconstpointer address) +{ + /* Holds the g_utils_global lock */ + + static gboolean beenhere = FALSE; + typedef BOOL (WINAPI *t_GetModuleHandleExA) (DWORD, LPCTSTR, HMODULE *); + static t_GetModuleHandleExA p_GetModuleHandleExA = NULL; + HMODULE hmodule = NULL; + + if (!address) + return NULL; + + if (!beenhere) + { + p_GetModuleHandleExA = + (t_GetModuleHandleExA) GetProcAddress (LoadLibrary ("kernel32.dll"), + "GetModuleHandleExA"); + beenhere = TRUE; + } + + if (p_GetModuleHandleExA == NULL || + !(*p_GetModuleHandleExA) (GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + address, &hmodule)) + { + MEMORY_BASIC_INFORMATION mbi; + VirtualQuery (address, &mbi, sizeof (mbi)); + hmodule = (HMODULE) mbi.AllocationBase; + } + + return hmodule; +} + +static gchar * +get_module_share_dir (gconstpointer address) +{ + HMODULE hmodule; + gchar *filename; + gchar *retval; + + hmodule = get_module_for_address (address); + if (hmodule == NULL) + return NULL; + + filename = g_win32_get_package_installation_directory_of_module (hmodule); + retval = g_build_filename (filename, "share", NULL); + g_free (filename); + + return retval; +} + +G_CONST_RETURN gchar * G_CONST_RETURN * +g_win32_get_system_data_dirs_for_module (void (*address_of_function)()) +{ + GArray *data_dirs; + HMODULE hmodule; + static GHashTable *per_module_data_dirs = NULL; + gchar **retval; + gchar *p; + gchar *exe_root; + + if (address_of_function) + { + G_LOCK (g_utils_global); + hmodule = get_module_for_address (address_of_function); + if (hmodule != NULL) + { + if (per_module_data_dirs == NULL) + per_module_data_dirs = g_hash_table_new (NULL, NULL); + else + { + retval = g_hash_table_lookup (per_module_data_dirs, hmodule); + + if (retval != NULL) + { + G_UNLOCK (g_utils_global); + return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval; + } + } + } + } + + data_dirs = g_array_new (TRUE, TRUE, sizeof (char *)); + + /* Documents and Settings\All Users\Application Data */ + p = get_special_folder (CSIDL_COMMON_APPDATA); + if (p) + g_array_append_val (data_dirs, p); + + /* Documents and Settings\All Users\Documents */ + p = get_special_folder (CSIDL_COMMON_DOCUMENTS); + if (p) + g_array_append_val (data_dirs, p); + + /* Using the above subfolders of Documents and Settings perhaps + * makes sense from a Windows perspective. + * + * But looking at the actual use cases of this function in GTK+ + * and GNOME software, what we really want is the "share" + * subdirectory of the installation directory for the package + * our caller is a part of. + * + * The address_of_function parameter, if non-NULL, points to a + * function in the calling module. Use that to determine that + * module's installation folder, and use its "share" subfolder. + * + * Additionally, also use the "share" subfolder of the installation + * locations of GLib and the .exe file being run. + * + * To guard against none of the above being what is really wanted, + * callers of this function should have Win32-specific code to look + * up their installation folder themselves, and handle a subfolder + * "share" of it in the same way as the folders returned from this + * function. + */ + + p = get_module_share_dir (address_of_function); + if (p) + g_array_append_val (data_dirs, p); + + if (glib_dll != NULL) + { + gchar *glib_root = g_win32_get_package_installation_directory_of_module (glib_dll); + p = g_build_filename (glib_root, "share", NULL); + if (p) + g_array_append_val (data_dirs, p); + g_free (glib_root); + } + + exe_root = g_win32_get_package_installation_directory_of_module (NULL); + p = g_build_filename (exe_root, "share", NULL); + if (p) + g_array_append_val (data_dirs, p); + g_free (exe_root); + + retval = (gchar **) g_array_free (data_dirs, FALSE); + + if (address_of_function) + { + if (hmodule != NULL) + g_hash_table_insert (per_module_data_dirs, hmodule, retval); + G_UNLOCK (g_utils_global); + } + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) retval; +} + +#endif + +/** + * g_get_system_data_dirs: + * + * Returns an ordered list of base directories in which to access + * system-wide application data. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * On Windows the first elements in the list are the Application Data + * and Documents folders for All Users. (These can be determined only + * on Windows 2000 or later and are not present in the list on other + * Windows versions.) See documentation for CSIDL_COMMON_APPDATA and + * CSIDL_COMMON_DOCUMENTS. + * + * Then follows the "share" subfolder in the installation folder for + * the package containing the DLL that calls this function, if it can + * be determined. + * + * Finally the list contains the "share" subfolder in the installation + * folder for GLib, and in the installation folder for the package the + * application's .exe file belongs to. + * + * The installation folders above are determined by looking up the + * folder where the module (DLL or EXE) in question is located. If the + * folder's name is "bin", its parent is used, otherwise the folder + * itself. + * + * Note that on Windows the returned list can vary depending on where + * this function is called. + * + * Return value: a %NULL-terminated array of strings owned by GLib that must + * not be modified or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar * G_CONST_RETURN * +g_get_system_data_dirs (void) +{ + gchar **data_dir_vector; + + G_LOCK (g_utils_global); + + if (!g_system_data_dirs) + { +#ifdef G_OS_WIN32 + data_dir_vector = (gchar **) g_win32_get_system_data_dirs_for_module (NULL); +#else + gchar *data_dirs = (gchar *) g_getenv ("XDG_DATA_DIRS"); + + if (!data_dirs || !data_dirs[0]) + data_dirs = "/usr/local/share/:/usr/share/"; + + data_dir_vector = g_strsplit (data_dirs, G_SEARCHPATH_SEPARATOR_S, 0); +#endif + + g_system_data_dirs = data_dir_vector; + } + else + data_dir_vector = g_system_data_dirs; + + G_UNLOCK (g_utils_global); + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) data_dir_vector; +} + +/** + * g_get_system_config_dirs: + * + * Returns an ordered list of base directories in which to access + * system-wide configuration information. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification + * + * Return value: a %NULL-terminated array of strings owned by GLib that must + * not be modified or freed. + * Since: 2.6 + **/ +G_CONST_RETURN gchar * G_CONST_RETURN * +g_get_system_config_dirs (void) +{ + gchar *conf_dirs, **conf_dir_vector; + + G_LOCK (g_utils_global); + + if (!g_system_config_dirs) + { +#ifdef G_OS_WIN32 + conf_dirs = get_special_folder (CSIDL_COMMON_APPDATA); + if (conf_dirs) + { + conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); + g_free (conf_dirs); + } + else + { + /* Return empty list */ + conf_dir_vector = g_strsplit ("", G_SEARCHPATH_SEPARATOR_S, 0); + } +#else + conf_dirs = (gchar *) g_getenv ("XDG_CONFIG_DIRS"); + + if (!conf_dirs || !conf_dirs[0]) + conf_dirs = "/etc/xdg"; + + conf_dir_vector = g_strsplit (conf_dirs, G_SEARCHPATH_SEPARATOR_S, 0); +#endif + + g_system_config_dirs = conf_dir_vector; + } + else + conf_dir_vector = g_system_config_dirs; + G_UNLOCK (g_utils_global); + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) conf_dir_vector; +} + +#ifndef G_OS_WIN32 + +static GHashTable *alias_table = NULL; + +/* read an alias file for the locales */ +static void +read_aliases (gchar *file) +{ + FILE *fp; + char buf[256]; + + if (!alias_table) + alias_table = g_hash_table_new (g_str_hash, g_str_equal); + fp = fopen (file,"r"); + if (!fp) + return; + while (fgets (buf, 256, fp)) + { + char *p, *q; + + g_strstrip (buf); + + /* Line is a comment */ + if ((buf[0] == '#') || (buf[0] == '\0')) + continue; + + /* Reads first column */ + for (p = buf, q = NULL; *p; p++) { + if ((*p == '\t') || (*p == ' ') || (*p == ':')) { + *p = '\0'; + q = p+1; + while ((*q == '\t') || (*q == ' ')) { + q++; + } + break; + } + } + /* The line only had one column */ + if (!q || *q == '\0') + continue; + + /* Read second column */ + for (p = q; *p; p++) { + if ((*p == '\t') || (*p == ' ')) { + *p = '\0'; + break; + } + } + + /* Add to alias table if necessary */ + if (!g_hash_table_lookup (alias_table, buf)) { + g_hash_table_insert (alias_table, g_strdup (buf), g_strdup (q)); + } + } + fclose (fp); +} + +#endif + +static char * +unalias_lang (char *lang) +{ +#ifndef G_OS_WIN32 + char *p; + int i; + + if (!alias_table) + read_aliases ("/usr/share/locale/locale.alias"); + + i = 0; + while ((p = g_hash_table_lookup (alias_table, lang)) && (strcmp (p, lang) != 0)) + { + lang = p; + if (i++ == 30) + { + static gboolean said_before = FALSE; + if (!said_before) + g_warning ("Too many alias levels for a locale, " + "may indicate a loop"); + said_before = TRUE; + return lang; + } + } +#endif + return lang; +} + +/* Mask for components of locale spec. The ordering here is from + * least significant to most significant + */ +enum +{ + COMPONENT_CODESET = 1 << 0, + COMPONENT_TERRITORY = 1 << 1, + COMPONENT_MODIFIER = 1 << 2 +}; + +/* Break an X/Open style locale specification into components + */ +static guint +explode_locale (const gchar *locale, + gchar **language, + gchar **territory, + gchar **codeset, + gchar **modifier) +{ + const gchar *uscore_pos; + const gchar *at_pos; + const gchar *dot_pos; + + guint mask = 0; + + uscore_pos = strchr (locale, '_'); + dot_pos = strchr (uscore_pos ? uscore_pos : locale, '.'); + at_pos = strchr (dot_pos ? dot_pos : (uscore_pos ? uscore_pos : locale), '@'); + + if (at_pos) + { + mask |= COMPONENT_MODIFIER; + *modifier = g_strdup (at_pos); + } + else + at_pos = locale + strlen (locale); + + if (dot_pos) + { + mask |= COMPONENT_CODESET; + *codeset = g_strndup (dot_pos, at_pos - dot_pos); + } + else + dot_pos = at_pos; + + if (uscore_pos) + { + mask |= COMPONENT_TERRITORY; + *territory = g_strndup (uscore_pos, dot_pos - uscore_pos); + } + else + uscore_pos = dot_pos; + + *language = g_strndup (locale, uscore_pos - locale); + + return mask; +} + +/* + * Compute all interesting variants for a given locale name - + * by stripping off different components of the value. + * + * For simplicity, we assume that the locale is in + * X/Open format: language[_territory][.codeset][@modifier] + * + * TODO: Extend this to handle the CEN format (see the GNUlibc docs) + * as well. We could just copy the code from glibc wholesale + * but it is big, ugly, and complicated, so I'm reluctant + * to do so when this should handle 99% of the time... + */ +GSList * +_g_compute_locale_variants (const gchar *locale) +{ + GSList *retval = NULL; + + gchar *language = NULL; + gchar *territory = NULL; + gchar *codeset = NULL; + gchar *modifier = NULL; + + guint mask; + guint i; + + g_return_val_if_fail (locale != NULL, NULL); + + mask = explode_locale (locale, &language, &territory, &codeset, &modifier); + + /* Iterate through all possible combinations, from least attractive + * to most attractive. + */ + for (i = 0; i <= mask; i++) + if ((i & ~mask) == 0) + { + gchar *val = g_strconcat (language, + (i & COMPONENT_TERRITORY) ? territory : "", + (i & COMPONENT_CODESET) ? codeset : "", + (i & COMPONENT_MODIFIER) ? modifier : "", + NULL); + retval = g_slist_prepend (retval, val); + } + + g_free (language); + if (mask & COMPONENT_CODESET) + g_free (codeset); + if (mask & COMPONENT_TERRITORY) + g_free (territory); + if (mask & COMPONENT_MODIFIER) + g_free (modifier); + + return retval; +} + +/* The following is (partly) taken from the gettext package. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. */ + +static const gchar * +guess_category_value (const gchar *category_name) +{ + const gchar *retval; + + /* The highest priority value is the `LANGUAGE' environment + variable. This is a GNU extension. */ + retval = g_getenv ("LANGUAGE"); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + + /* `LANGUAGE' is not set. So we have to proceed with the POSIX + methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some + systems this can be done by the `setlocale' function itself. */ + + /* Setting of LC_ALL overwrites all other. */ + retval = g_getenv ("LC_ALL"); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + + /* Next comes the name of the desired category. */ + retval = g_getenv (category_name); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + + /* Last possibility is the LANG environment variable. */ + retval = g_getenv ("LANG"); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; + +#ifdef G_PLATFORM_WIN32 + /* g_win32_getlocale() first checks for LC_ALL, LC_MESSAGES and + * LANG, which we already did above. Oh well. The main point of + * calling g_win32_getlocale() is to get the thread's locale as used + * by Windows and the Microsoft C runtime (in the "English_United + * States" format) translated into the Unixish format. + */ + retval = g_win32_getlocale (); + if ((retval != NULL) && (retval[0] != '\0')) + return retval; +#endif + + return NULL; +} + +typedef struct _GLanguageNamesCache GLanguageNamesCache; + +struct _GLanguageNamesCache { + gchar *languages; + gchar **language_names; +}; + +static void +language_names_cache_free (gpointer data) +{ + GLanguageNamesCache *cache = data; + g_free (cache->languages); + g_strfreev (cache->language_names); + g_free (cache); +} + +/** + * g_get_language_names: + * + * Computes a list of applicable locale names, which can be used to + * e.g. construct locale-dependent filenames or search paths. The returned + * list is sorted from most desirable to least desirable and always contains + * the default locale "C". + * + * For example, if LANGUAGE=de:en_US, then the returned list is + * "de", "en_US", "en", "C". + * + * This function consults the environment variables LANGUAGE, + * LC_ALL, LC_MESSAGES and LANG + * to find the list of locales specified by the user. + * + * Return value: a %NULL-terminated array of strings owned by GLib + * that must not be modified or freed. + * + * Since: 2.6 + **/ +G_CONST_RETURN gchar * G_CONST_RETURN * +g_get_language_names (void) +{ + static GStaticPrivate cache_private = G_STATIC_PRIVATE_INIT; + GLanguageNamesCache *cache = g_static_private_get (&cache_private); + const gchar *value; + + if (!cache) + { + cache = g_new0 (GLanguageNamesCache, 1); + g_static_private_set (&cache_private, cache, language_names_cache_free); + } + + value = guess_category_value ("LC_MESSAGES"); + if (!value) + value = "C"; + + if (!(cache->languages && strcmp (cache->languages, value) == 0)) + { + gchar **languages; + gchar **alist, **a; + GSList *list, *l; + gint i; + + g_free (cache->languages); + g_strfreev (cache->language_names); + cache->languages = g_strdup (value); + + alist = g_strsplit (value, ":", 0); + list = NULL; + for (a = alist; *a; a++) + { + gchar *b = unalias_lang (*a); + list = g_slist_concat (list, _g_compute_locale_variants (b)); + } + g_strfreev (alist); + list = g_slist_append (list, g_strdup ("C")); + + cache->language_names = languages = g_new (gchar *, g_slist_length (list) + 1); + for (l = list, i = 0; l; l = l->next, i++) + languages[i] = l->data; + languages[i] = NULL; + + g_slist_free (list); + } + + return (G_CONST_RETURN gchar * G_CONST_RETURN *) cache->language_names; +} + +/** + * g_direct_hash: + * @v: a #gpointer key + * + * Converts a gpointer to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + */ +guint +g_direct_hash (gconstpointer v) +{ + return GPOINTER_TO_UINT (v); +} + +/** + * g_direct_equal: + * @v1: a key. + * @v2: a key to compare with @v1. + * + * Compares two #gpointer arguments and returns %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using pointers as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + */ +gboolean +g_direct_equal (gconstpointer v1, + gconstpointer v2) +{ + return v1 == v2; +} + +/** + * g_int_equal: + * @v1: a pointer to a #gint key. + * @v2: a pointer to a #gint key to compare with @v1. + * + * Compares the two #gint values being pointed to and returns + * %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using pointers to integers as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + */ +gboolean +g_int_equal (gconstpointer v1, + gconstpointer v2) +{ + return *((const gint*) v1) == *((const gint*) v2); +} + +/** + * g_int_hash: + * @v: a pointer to a #gint key + * + * Converts a pointer to a #gint to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers to integers values as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + */ +guint +g_int_hash (gconstpointer v) +{ + return *(const gint*) v; +} + +/** + * g_int64_equal: + * @v1: a pointer to a #gint64 key. + * @v2: a pointer to a #gint64 key to compare with @v1. + * + * Compares the two #gint64 values being pointed to and returns + * %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using pointers to 64-bit integers as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + * + * Since: 2.22 + */ +gboolean +g_int64_equal (gconstpointer v1, + gconstpointer v2) +{ + return *((const gint64*) v1) == *((const gint64*) v2); +} + +/** + * g_int64_hash: + * @v: a pointer to a #gint64 key + * + * Converts a pointer to a #gint64 to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers to 64-bit integers values as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + * + * Since: 2.22 + */ +guint +g_int64_hash (gconstpointer v) +{ + return (guint) *(const gint64*) v; +} + +/** + * g_double_equal: + * @v1: a pointer to a #gdouble key. + * @v2: a pointer to a #gdouble key to compare with @v1. + * + * Compares the two #gdouble values being pointed to and returns + * %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using pointers to doubles as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + * + * Since: 2.22 + */ +gboolean +g_double_equal (gconstpointer v1, + gconstpointer v2) +{ + return *((const gdouble*) v1) == *((const gdouble*) v2); +} + +/** + * g_double_hash: + * @v: a pointer to a #gdouble key + * + * Converts a pointer to a #gdouble to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using pointers to doubles as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + * + * Since: 2.22 + */ +guint +g_double_hash (gconstpointer v) +{ + return (guint) *(const gdouble*) v; +} + +/** + * g_nullify_pointer: + * @nullify_location: the memory address of the pointer. + * + * Set the pointer at the specified location to %NULL. + **/ +void +g_nullify_pointer (gpointer *nullify_location) +{ + g_return_if_fail (nullify_location != NULL); + + *nullify_location = NULL; +} + +/** + * g_get_codeset: + * + * Get the codeset for the current locale. + * + * Return value: a newly allocated string containing the name + * of the codeset. This string must be freed with g_free(). + **/ +gchar * +g_get_codeset (void) +{ + const gchar *charset; + + g_get_charset (&charset); + + return g_strdup (charset); +} + +/* This is called from g_thread_init(). It's used to + * initialize some static data in a threadsafe way. + */ +void +_g_utils_thread_init (void) +{ + g_get_language_names (); +} + +#ifdef G_OS_WIN32 + +/** + * _glib_get_locale_dir: + * + * Return the path to the share\locale or lib\locale subfolder of the + * GLib installation folder. The path is in the system codepage. We + * have to use system codepage as bindtextdomain() doesn't have a + * UTF-8 interface. + */ +static gchar * +_glib_get_locale_dir (void) +{ + gchar *install_dir = NULL, *locale_dir; + gchar *retval = NULL; + + if (glib_dll != NULL) + install_dir = g_win32_get_package_installation_directory_of_module (glib_dll); + + if (install_dir) + { + /* + * Append "/share/locale" or "/lib/locale" depending on whether + * autoconfigury detected GNU gettext or not. + */ + const char *p = GLIB_LOCALE_DIR + strlen (GLIB_LOCALE_DIR); + while (*--p != '/') + ; + while (*--p != '/') + ; + + locale_dir = g_build_filename (install_dir, p, NULL); + + retval = g_win32_locale_filename_from_utf8 (locale_dir); + + g_free (install_dir); + g_free (locale_dir); + } + + if (retval) + return retval; + else + return g_strdup (""); +} + +#undef GLIB_LOCALE_DIR + +#endif /* G_OS_WIN32 */ + +/** + * glib_gettext: + * @str: The string to be translated + * + * Returns the translated string from the glib translations. + * This is an internal function and should only be used by + * the internals of glib (such as libgio). + * + * Returns: the transation of @str to the current locale + */ +G_CONST_RETURN gchar * +glib_gettext (const gchar *str) +{ + static gboolean _glib_gettext_initialized = FALSE; + + if (!_glib_gettext_initialized) + { +#ifdef G_OS_WIN32 + gchar *tmp = _glib_get_locale_dir (); + bindtextdomain (GETTEXT_PACKAGE, tmp); + g_free (tmp); +#else + bindtextdomain (GETTEXT_PACKAGE, GLIB_LOCALE_DIR); +#endif +# ifdef HAVE_BIND_TEXTDOMAIN_CODESET + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +# endif + _glib_gettext_initialized = TRUE; + } + + return g_dgettext (GETTEXT_PACKAGE, str); +} + +#if defined (G_OS_WIN32) && !defined (_WIN64) + +/* Binary compatibility versions. Not for newly compiled code. */ + +#undef g_find_program_in_path + +gchar* +g_find_program_in_path (const gchar *program) +{ + gchar *utf8_program = g_locale_to_utf8 (program, -1, NULL, NULL, NULL); + gchar *utf8_retval = g_find_program_in_path_utf8 (utf8_program); + gchar *retval; + + g_free (utf8_program); + if (utf8_retval == NULL) + return NULL; + retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL); + g_free (utf8_retval); + + return retval; +} + +#undef g_get_current_dir + +gchar* +g_get_current_dir (void) +{ + gchar *utf8_dir = g_get_current_dir_utf8 (); + gchar *dir = g_locale_from_utf8 (utf8_dir, -1, NULL, NULL, NULL); + g_free (utf8_dir); + return dir; +} + +#undef g_getenv + +G_CONST_RETURN gchar* +g_getenv (const gchar *variable) +{ + gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); + const gchar *utf8_value = g_getenv_utf8 (utf8_variable); + gchar *value; + GQuark quark; + + g_free (utf8_variable); + if (!utf8_value) + return NULL; + value = g_locale_from_utf8 (utf8_value, -1, NULL, NULL, NULL); + quark = g_quark_from_string (value); + g_free (value); + + return g_quark_to_string (quark); +} + +#undef g_setenv + +gboolean +g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite) +{ + gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); + gchar *utf8_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL); + gboolean retval = g_setenv_utf8 (utf8_variable, utf8_value, overwrite); + + g_free (utf8_variable); + g_free (utf8_value); + + return retval; +} + +#undef g_unsetenv + +void +g_unsetenv (const gchar *variable) +{ + gchar *utf8_variable = g_locale_to_utf8 (variable, -1, NULL, NULL, NULL); + + g_unsetenv_utf8 (utf8_variable); + + g_free (utf8_variable); +} + +#undef g_get_user_name + +G_CONST_RETURN gchar* +g_get_user_name (void) +{ + g_get_any_init_locked (); + return g_user_name_cp; +} + +#undef g_get_real_name + +G_CONST_RETURN gchar* +g_get_real_name (void) +{ + g_get_any_init_locked (); + return g_real_name_cp; +} + +#undef g_get_home_dir + +G_CONST_RETURN gchar* +g_get_home_dir (void) +{ + g_get_any_init_locked (); + return g_home_dir_cp; +} + +#undef g_get_tmp_dir + +G_CONST_RETURN gchar* +g_get_tmp_dir (void) +{ + g_get_any_init_locked (); + return g_tmp_dir_cp; +} + +#endif + +#define __G_UTILS_C__ +#include "galiasdef.c" diff --git a/glib/gutils.h b/glib/gutils.h new file mode 100644 index 0000000..bb4da80 --- /dev/null +++ b/glib/gutils.h @@ -0,0 +1,490 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_UTILS_H__ +#define __G_UTILS_H__ + +#include +#include + +G_BEGIN_DECLS + +#ifdef G_OS_WIN32 + +/* On Win32, the canonical directory separator is the backslash, and + * the search path separator is the semicolon. Note that also the + * (forward) slash works as directory separator. + */ +#define G_DIR_SEPARATOR '\\' +#define G_DIR_SEPARATOR_S "\\" +#define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR || (c) == '/') +#define G_SEARCHPATH_SEPARATOR ';' +#define G_SEARCHPATH_SEPARATOR_S ";" + +#else /* !G_OS_WIN32 */ + +/* Unix */ + +#define G_DIR_SEPARATOR '/' +#define G_DIR_SEPARATOR_S "/" +#define G_IS_DIR_SEPARATOR(c) ((c) == G_DIR_SEPARATOR) +#define G_SEARCHPATH_SEPARATOR ':' +#define G_SEARCHPATH_SEPARATOR_S ":" + +#endif /* !G_OS_WIN32 */ + +/* Define G_VA_COPY() to do the right thing for copying va_list variables. + * glibconfig.h may have already defined G_VA_COPY as va_copy or __va_copy. + */ +#if !defined (G_VA_COPY) +# if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) +# define G_VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) +# elif defined (G_VA_COPY_AS_ARRAY) +# define G_VA_COPY(ap1, ap2) g_memmove ((ap1), (ap2), sizeof (va_list)) +# else /* va_list is a pointer */ +# define G_VA_COPY(ap1, ap2) ((ap1) = (ap2)) +# endif /* va_list is a pointer */ +#endif /* !G_VA_COPY */ + +/* inlining hassle. for compilers that don't allow the `inline' keyword, + * mostly because of strict ANSI C compliance or dumbness, we try to fall + * back to either `__inline__' or `__inline'. + * G_CAN_INLINE is defined in glibconfig.h if the compiler seems to be + * actually *capable* to do function inlining, in which case inline + * function bodies do make sense. we also define G_INLINE_FUNC to properly + * export the function prototypes if no inlining can be performed. + * inline function bodies have to be special cased with G_CAN_INLINE and a + * .c file specific macro to allow one compiled instance with extern linkage + * of the functions by defining G_IMPLEMENT_INLINES and the .c file macro. + */ +#if defined (G_HAVE_INLINE) && defined (__GNUC__) && defined (__STRICT_ANSI__) +# undef inline +# define inline __inline__ +#elif !defined (G_HAVE_INLINE) +# undef inline +# if defined (G_HAVE___INLINE__) +# define inline __inline__ +# elif defined (G_HAVE___INLINE) +# define inline __inline +# else /* !inline && !__inline__ && !__inline */ +# define inline /* don't inline, then */ +# endif +#endif +#ifdef G_IMPLEMENT_INLINES +# define G_INLINE_FUNC +# undef G_CAN_INLINE +#elif defined (__GNUC__) +# define G_INLINE_FUNC static __inline __attribute__ ((unused)) +#elif defined (G_CAN_INLINE) +# define G_INLINE_FUNC static inline +#else /* can't inline */ +# define G_INLINE_FUNC +#endif /* !G_INLINE_FUNC */ + +/* Retrive static string info + */ +#ifdef G_OS_WIN32 +#define g_get_user_name g_get_user_name_utf8 +#define g_get_real_name g_get_real_name_utf8 +#define g_get_home_dir g_get_home_dir_utf8 +#define g_get_tmp_dir g_get_tmp_dir_utf8 +#endif + +G_CONST_RETURN gchar* g_get_user_name (void); +G_CONST_RETURN gchar* g_get_real_name (void); +G_CONST_RETURN gchar* g_get_home_dir (void); +G_CONST_RETURN gchar* g_get_tmp_dir (void); +G_CONST_RETURN gchar* g_get_host_name (void); +gchar* g_get_prgname (void); +void g_set_prgname (const gchar *prgname); +G_CONST_RETURN gchar* g_get_application_name (void); +void g_set_application_name (const gchar *application_name); + +void g_reload_user_special_dirs_cache (void); +G_CONST_RETURN gchar* g_get_user_data_dir (void); +G_CONST_RETURN gchar* g_get_user_config_dir (void); +G_CONST_RETURN gchar* g_get_user_cache_dir (void); +G_CONST_RETURN gchar* G_CONST_RETURN * g_get_system_data_dirs (void); + +#ifdef G_OS_WIN32 +/* This functions is not part of the public GLib API */ +G_CONST_RETURN gchar* G_CONST_RETURN * g_win32_get_system_data_dirs_for_module (void (*address_of_function)(void)); +#endif + +#if defined (G_OS_WIN32) && defined (G_CAN_INLINE) && !defined (__cplusplus) +/* This function is not part of the public GLib API either. Just call + * g_get_system_data_dirs() in your code, never mind that that is + * actually a macro and you will in fact call this inline function. + */ +static inline G_CONST_RETURN gchar * G_CONST_RETURN * +_g_win32_get_system_data_dirs (void) +{ + return g_win32_get_system_data_dirs_for_module ((void (*)(void)) &_g_win32_get_system_data_dirs); +} +#define g_get_system_data_dirs _g_win32_get_system_data_dirs +#endif + +G_CONST_RETURN gchar* G_CONST_RETURN * g_get_system_config_dirs (void); + +G_CONST_RETURN gchar* G_CONST_RETURN * g_get_language_names (void); + +/** + * GUserDirectory: + * @G_USER_DIRECTORY_DESKTOP: the user's Desktop directory + * @G_USER_DIRECTORY_DOCUMENTS: the user's Documents directory + * @G_USER_DIRECTORY_DOWNLOAD: the user's Downloads directory + * @G_USER_DIRECTORY_MUSIC: the user's Music directory + * @G_USER_DIRECTORY_PICTURES: the user's Pictures directory + * @G_USER_DIRECTORY_PUBLIC_SHARE: the user's shared directory + * @G_USER_DIRECTORY_TEMPLATES: the user's Templates directory + * @G_USER_DIRECTORY_VIDEOS: the user's Movies directory + * @G_USER_N_DIRECTORIES: the number of enum values + * + * These are logical ids for special directories which are defined + * depending on the platform used. You should use g_get_user_special_dir() + * to retrieve the full path associated to the logical id. + * + * The #GUserDirectory enumeration can be extended at later date. Not + * every platform has a directory for every logical id in this + * enumeration. + * + * Since: 2.14 + */ +typedef enum { + G_USER_DIRECTORY_DESKTOP, + G_USER_DIRECTORY_DOCUMENTS, + G_USER_DIRECTORY_DOWNLOAD, + G_USER_DIRECTORY_MUSIC, + G_USER_DIRECTORY_PICTURES, + G_USER_DIRECTORY_PUBLIC_SHARE, + G_USER_DIRECTORY_TEMPLATES, + G_USER_DIRECTORY_VIDEOS, + + G_USER_N_DIRECTORIES +} GUserDirectory; + +G_CONST_RETURN gchar* g_get_user_special_dir (GUserDirectory directory); + +typedef struct _GDebugKey GDebugKey; +struct _GDebugKey +{ + const gchar *key; + guint value; +}; + +/* Miscellaneous utility functions + */ +guint g_parse_debug_string (const gchar *string, + const GDebugKey *keys, + guint nkeys); + +gint g_snprintf (gchar *string, + gulong n, + gchar const *format, + ...) G_GNUC_PRINTF (3, 4); +gint g_vsnprintf (gchar *string, + gulong n, + gchar const *format, + va_list args); + +/* Check if a file name is an absolute path */ +gboolean g_path_is_absolute (const gchar *file_name); + +/* In case of absolute paths, skip the root part */ +G_CONST_RETURN gchar* g_path_skip_root (const gchar *file_name); + +#ifndef G_DISABLE_DEPRECATED + +/* These two functions are deprecated and will be removed in the next + * major release of GLib. Use g_path_get_dirname/g_path_get_basename + * instead. Whatch out! The string returned by g_path_get_basename + * must be g_freed, while the string returned by g_basename must not.*/ +G_CONST_RETURN gchar* g_basename (const gchar *file_name); +#define g_dirname g_path_get_dirname + +#endif /* G_DISABLE_DEPRECATED */ + +#ifdef G_OS_WIN32 +#define g_get_current_dir g_get_current_dir_utf8 +#endif + +/* The returned strings are newly allocated with g_malloc() */ +gchar* g_get_current_dir (void); +gchar* g_path_get_basename (const gchar *file_name) G_GNUC_MALLOC; +gchar* g_path_get_dirname (const gchar *file_name) G_GNUC_MALLOC; + +/* Set the pointer at the specified location to NULL */ +void g_nullify_pointer (gpointer *nullify_location); + +/* return the environment string for the variable. The returned memory + * must not be freed. */ +#ifdef G_OS_WIN32 +#define g_getenv g_getenv_utf8 +#define g_setenv g_setenv_utf8 +#define g_unsetenv g_unsetenv_utf8 +#define g_find_program_in_path g_find_program_in_path_utf8 +#endif + +G_CONST_RETURN gchar* g_getenv (const gchar *variable); +gboolean g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite); +void g_unsetenv (const gchar *variable); +gchar** g_listenv (void); + +/* private */ +const gchar* _g_getenv_nomalloc (const gchar *variable, + gchar buffer[1024]); + +/* we try to provide a useful equivalent for ATEXIT if it is + * not defined, but use is actually abandoned. people should + * use g_atexit() instead. + */ +typedef void (*GVoidFunc) (void); +#ifndef ATEXIT +# define ATEXIT(proc) g_ATEXIT(proc) +#else +# define G_NATIVE_ATEXIT +#endif /* ATEXIT */ +/* we use a GLib function as a replacement for ATEXIT, so + * the programmer is not required to check the return value + * (if there is any in the implementation) and doesn't encounter + * missing include files. + */ +void g_atexit (GVoidFunc func); + +#ifdef G_OS_WIN32 +/* It's a bad idea to wrap atexit() on Windows. If the GLib DLL calls + * atexit(), the function will be called when the GLib DLL is detached + * from the program, which is not what the caller wants. The caller + * wants the function to be called when it *itself* exits (or is + * detached, in case the caller, too, is a DLL). + */ +#if (defined(__MINGW_H) && !defined(_STDLIB_H_)) || (defined(_MSC_VER) && !defined(_INC_STDLIB)) +int atexit (void (*)(void)); +#endif +#define g_atexit(func) atexit(func) +#endif + +/* Look for an executable in PATH, following execvp() rules */ +gchar* g_find_program_in_path (const gchar *program); + +/* Bit tests + */ +G_INLINE_FUNC gint g_bit_nth_lsf (gulong mask, + gint nth_bit) G_GNUC_CONST; +G_INLINE_FUNC gint g_bit_nth_msf (gulong mask, + gint nth_bit) G_GNUC_CONST; +G_INLINE_FUNC guint g_bit_storage (gulong number) G_GNUC_CONST; + +/* Trash Stacks + * elements need to be >= sizeof (gpointer) + */ +typedef struct _GTrashStack GTrashStack; +struct _GTrashStack +{ + GTrashStack *next; +}; + +G_INLINE_FUNC void g_trash_stack_push (GTrashStack **stack_p, + gpointer data_p); +G_INLINE_FUNC gpointer g_trash_stack_pop (GTrashStack **stack_p); +G_INLINE_FUNC gpointer g_trash_stack_peek (GTrashStack **stack_p); +G_INLINE_FUNC guint g_trash_stack_height (GTrashStack **stack_p); + +/* inline function implementations + */ +#if defined (G_CAN_INLINE) || defined (__G_UTILS_C__) +G_INLINE_FUNC gint +g_bit_nth_lsf (gulong mask, + gint nth_bit) +{ + if (G_UNLIKELY (nth_bit < -1)) + nth_bit = -1; + while (nth_bit < ((GLIB_SIZEOF_LONG * 8) - 1)) + { + nth_bit++; + if (mask & (1UL << nth_bit)) + return nth_bit; + } + return -1; +} +G_INLINE_FUNC gint +g_bit_nth_msf (gulong mask, + gint nth_bit) +{ + if (nth_bit < 0 || G_UNLIKELY (nth_bit > GLIB_SIZEOF_LONG * 8)) + nth_bit = GLIB_SIZEOF_LONG * 8; + while (nth_bit > 0) + { + nth_bit--; + if (mask & (1UL << nth_bit)) + return nth_bit; + } + return -1; +} +G_INLINE_FUNC guint +g_bit_storage (gulong number) +{ +#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__) + return G_LIKELY (number) ? + ((GLIB_SIZEOF_LONG * 8 - 1) ^ __builtin_clzl(number)) + 1 : 1; +#else + register guint n_bits = 0; + + do + { + n_bits++; + number >>= 1; + } + while (number); + return n_bits; +#endif +} +G_INLINE_FUNC void +g_trash_stack_push (GTrashStack **stack_p, + gpointer data_p) +{ + GTrashStack *data = (GTrashStack *) data_p; + + data->next = *stack_p; + *stack_p = data; +} +G_INLINE_FUNC gpointer +g_trash_stack_pop (GTrashStack **stack_p) +{ + GTrashStack *data; + + data = *stack_p; + if (data) + { + *stack_p = data->next; + /* NULLify private pointer here, most platforms store NULL as + * subsequent 0 bytes + */ + data->next = NULL; + } + + return data; +} +G_INLINE_FUNC gpointer +g_trash_stack_peek (GTrashStack **stack_p) +{ + GTrashStack *data; + + data = *stack_p; + + return data; +} +G_INLINE_FUNC guint +g_trash_stack_height (GTrashStack **stack_p) +{ + GTrashStack *data; + guint i = 0; + + for (data = *stack_p; data; data = data->next) + i++; + + return i; +} +#endif /* G_CAN_INLINE || __G_UTILS_C__ */ + +/* Glib version. + * we prefix variable declarations so they can + * properly get exported in windows dlls. + */ +GLIB_VAR const guint glib_major_version; +GLIB_VAR const guint glib_minor_version; +GLIB_VAR const guint glib_micro_version; +GLIB_VAR const guint glib_interface_age; +GLIB_VAR const guint glib_binary_age; + +const gchar * glib_check_version (guint required_major, + guint required_minor, + guint required_micro); + +#define GLIB_CHECK_VERSION(major,minor,micro) \ + (GLIB_MAJOR_VERSION > (major) || \ + (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION > (minor)) || \ + (GLIB_MAJOR_VERSION == (major) && GLIB_MINOR_VERSION == (minor) && \ + GLIB_MICRO_VERSION >= (micro))) + +G_END_DECLS + +#ifndef G_DISABLE_DEPRECATED + +/* + * This macro is deprecated. This DllMain() is too complex. It is + * recommended to write an explicit minimal DLlMain() that just saves + * the handle to the DLL and then use that handle instead, for + * instance passing it to + * g_win32_get_package_installation_directory_of_module(). + * + * On Windows, this macro defines a DllMain function that stores the + * actual DLL name that the code being compiled will be included in. + * STATIC should be empty or 'static'. DLL_NAME is the name of the + * (pointer to the) char array where the DLL name will be stored. If + * this is used, you must also include . If you need a more complex + * DLL entry point function, you cannot use this. + * + * On non-Windows platforms, expands to nothing. + */ + +#ifndef G_PLATFORM_WIN32 +# define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) +#else +# define G_WIN32_DLLMAIN_FOR_DLL_NAME(static, dll_name) \ +static char *dll_name; \ + \ +BOOL WINAPI \ +DllMain (HINSTANCE hinstDLL, \ + DWORD fdwReason, \ + LPVOID lpvReserved) \ +{ \ + wchar_t wcbfr[1000]; \ + char *tem; \ + switch (fdwReason) \ + { \ + case DLL_PROCESS_ATTACH: \ + GetModuleFileNameW ((HMODULE) hinstDLL, wcbfr, G_N_ELEMENTS (wcbfr)); \ + tem = g_utf16_to_utf8 (wcbfr, -1, NULL, NULL, NULL); \ + dll_name = g_path_get_basename (tem); \ + g_free (tem); \ + break; \ + } \ + \ + return TRUE; \ +} + +#endif /* !G_DISABLE_DEPRECATED */ + +#endif /* G_PLATFORM_WIN32 */ + +#endif /* __G_UTILS_H__ */ diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c new file mode 100644 index 0000000..e3597e4 --- /dev/null +++ b/glib/gvariant-core.c @@ -0,0 +1,932 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "galias.h" + +/* + * This file includes the structure definition for GVariant and a small + * set of functions that are allowed to access the structure directly. + * + * This minimises the amount of code that can possibly touch a GVariant + * structure directly to a few simple fundamental operations. These few + * operations are written to be completely threadsafe with respect to + * all possible outside access. This means that we only need to be + * concerned about thread safety issues in this one small file. + * + * Most GVariant API functions are in gvariant.c. + */ + +/** + * GVariant: + * + * #GVariant is an opaque data structure and can only be accessed + * using the following functions. + * + * Since: 2.24 + **/ +struct _GVariant +/* see below for field member documentation */ +{ + GVariantTypeInfo *type_info; + gsize size; + + union + { + struct + { + GBuffer *buffer; + gconstpointer data; + } serialised; + + struct + { + GVariant **children; + gsize n_children; + } tree; + } contents; + + gint state; + gint ref_count; +}; + +/* struct GVariant: + * + * There are two primary forms of GVariant instances: "serialised form" + * and "tree form". + * + * "serialised form": A serialised GVariant instance stores its value in + * the GVariant serialisation format. All + * basic-typed instances (ie: non-containers) are in + * serialised format, as are some containers. + * + * "tree form": Some containers are in "tree form". In this case, + * instead of containing the serialised data for the + * container, the instance contains an array of pointers to + * the child values of the container (thus forming a tree). + * + * It is possible for an instance to transition from tree form to + * serialised form. This happens, implicitly, if the serialised data is + * requested (eg: via g_variant_get_data()). Serialised form instances + * never transition into tree form. + * + * + * The fields of the structure are documented here: + * + * type_info: this is a reference to a GVariantTypeInfo describing the + * type of the instance. When the instance is freed, this + * reference must be released with g_variant_type_info_unref(). + * + * The type_info field never changes during the life of the + * instance, so it can be accessed without a lock. + * + * size: this is the size of the serialised form for the instance, if it + * is known. If the instance is in serialised form then it is, by + * definition, known. If the instance is in tree form then it may + * be unknown (in which case it is -1). It is possible for the + * size to be known when in tree form if, for example, the user + * has called g_variant_get_size() without calling + * g_variant_get_data(). Additionally, even when the user calls + * g_variant_get_data() the size of the data must first be + * determined so that a large enough buffer can be allocated for + * the data. + * + * Once the size is known, it can never become unknown again. + * g_variant_ensure_size() is used to ensure that the size is in + * the known state -- it calculates the size if needed. After + * that, the size field can be accessed without a lock. + * + * contents: a union containing either the information associated with + * holding a value in serialised form or holding a value in + * tree form. + * + * .serialised: Only valid when the instance is in serialised form. + * + * Since an instance can never transition away from + * serialised form, once these fields are set, they will + * never be changed. It is therefore valid to access + * them without holding a lock. + * + * .buffer: the #GBuffer that contains the memory pointed to by + * .data, or %NULL if .data is %NULL. In the event that + * the instance was deserialised from another instance, + * then the buffer will be shared by both of them. When + * the instance is freed, this reference must be released + * with g_buffer_unref(). + * + * .data: the serialised data (of size 'size') of the instance. + * This pointer should not be freed or modified in any way. + * #GBuffer is responsible for memory management. + * + * This pointer may be %NULL in two cases: + * + * - if the serialised size of the instance is 0 + * + * - if the instance is of a fixed-sized type and was + * deserialised out of a corrupted container such that + * the container contains too few bytes to point to the + * entire proper fixed-size of this instance. In this + * case, 'size' will still be equal to the proper fixed + * size, but this pointer will be %NULL. This is exactly + * the reason that g_variant_get_data() sometimes returns + * %NULL. For all other calls, the effect should be as + * if .data pointed to the appropriate number of nul + * bytes. + * + * .tree: Only valid when the instance is in tree form. + * + * Note that accesses from other threads could result in + * conversion of the instance from tree form to serialised form + * at any time. For this reason, the instance lock must always + * be held while performing any operations on 'contents.tree'. + * + * .children: the array of the child instances of this instance. + * When the instance is freed (or converted to serialised + * form) then each child must have g_variant_unref() + * called on it and the array must be freed using + * g_free(). + * + * .n_children: the number of items in the .children array. + * + * state: a bitfield describing the state of the instance. It is a + * bitwise-or of the following STATE_* constants: + * + * STATE_LOCKED: the instance lock is held. This is the bit used by + * g_bit_lock(). + * + * STATE_SERIALISED: the instance is in serialised form. If this + * flag is not set then the instance is in tree + * form. + * + * STATE_TRUSTED: for serialised form instances, this means that the + * serialised data is known to be in normal form (ie: + * not corrupted). + * + * For tree form instances, this means that all of the + * child instances in the contents.tree.children array + * are trusted. This means that if the container is + * serialised then the resulting data will be in + * normal form. + * + * If this flag is unset it does not imply that the + * data is corrupted. It merely means that we're not + * sure that it's valid. See g_variant_is_trusted(). + * + * STATE_FLOATING: if this flag is set then the object has a floating + * reference. See g_variant_ref_sink(). + * + * ref_count: the reference count of the instance + */ +#define STATE_LOCKED 1 +#define STATE_SERIALISED 2 +#define STATE_TRUSTED 4 +#define STATE_FLOATING 8 + +/* -- private -- */ +/* < private > + * g_variant_lock: + * @value: a #GVariant + * + * Locks @value for performing sensitive operations. + */ +static void +g_variant_lock (GVariant *value) +{ + g_bit_lock (&value->state, 0); +} + +/* < private > + * g_variant_unlock: + * @value: a #GVariant + * + * Unlocks @value after performing sensitive operations. + */ +static void +g_variant_unlock (GVariant *value) +{ + g_bit_unlock (&value->state, 0); +} + +/* < private > + * g_variant_release_children: + * @value: a #GVariant + * + * Releases the reference held on each child in the 'children' array of + * @value and frees the array itself. @value must be in tree form. + * + * This is done when freeing a tree-form instance or converting it to + * serialised form. + * + * The current thread must hold the lock on @value. + */ +static void +g_variant_release_children (GVariant *value) +{ + gsize i; + + g_assert (value->state & STATE_LOCKED); + g_assert (~value->state & STATE_SERIALISED); + + for (i = 0; i < value->contents.tree.n_children; i++) + g_variant_unref (value->contents.tree.children[i]); + + g_free (value->contents.tree.children); +} + +/* This begins the main body of the recursive serialiser. + * + * There are 3 functions here that work as a team with the serialiser to + * get things done. g_variant_store() has a trivial role, but as a + * public API function, it has its definition elsewhere. + * + * Note that "serialisation" of an instance does not mean that the + * instance is converted to serialised form -- it means that the + * serialised form of an instance is written to an external buffer. + * g_variant_ensure_serialised() (which is not part of this set of + * functions) is the function that is responsible for converting an + * instance to serialised form. + * + * We are only concerned here with container types since non-container + * instances are always in serialised form. For these instances, + * storing their serialised form merely involves a memcpy(). + * + * Serialisation is a two-step process. First, the size of the + * serialised data must be calculated so that an appropriately-sized + * buffer can be allocated. Second, the data is written into the + * buffer. + * + * Determining the size: + * The process of determining the size is triggered by a call to + * g_variant_ensure_size() on a container. This invokes the + * serialiser code to determine the size. The serialiser is passed + * g_variant_fill_gvs() as a callback. + * + * g_variant_fill_gvs() is called by the serialiser on each child of + * the container which, in turn, calls g_variant_ensure_size() on + * itself and fills in the result of its own size calculation. + * + * The serialiser uses the size information from the children to + * calculate the size needed for the entire container. + * + * Writing the data: + * After the buffer has been allocated, g_variant_serialise() is + * called on the container. This invokes the serialiser code to write + * the bytes to the container. The serialiser is, again, passed + * g_variant_fill_gvs() as a callback. + * + * This time, when g_variant_fill_gvs() is called for each child, the + * child is given a pointer to a sub-region of the allocated buffer + * where it should write its data. This is done by calling + * g_variant_store(). In the event that the instance is in serialised + * form this means a memcpy() of the serialised data into the + * allocated buffer. In the event that the instance is in tree form + * this means a recursive call back into g_variant_serialise(). + * + * + * The forward declaration here allows corecursion via callback: + */ +static void g_variant_fill_gvs (GVariantSerialised *, gpointer); + +/* < private > + * g_variant_ensure_size: + * @value: a #GVariant + * + * Ensures that the ->size field of @value is filled in properly. This + * must be done as a precursor to any serialisation of the value in + * order to know how large of a buffer is needed to store the data. + * + * The current thread must hold the lock on @value. + */ +static void +g_variant_ensure_size (GVariant *value) +{ + g_assert (value->state & STATE_LOCKED); + + if (value->size == (gssize) -1) + { + gpointer *children; + gsize n_children; + + children = (gpointer *) value->contents.tree.children; + n_children = value->contents.tree.n_children; + value->size = g_variant_serialiser_needed_size (value->type_info, + g_variant_fill_gvs, + children, n_children); + } +} + +/* < private > + * g_variant_serialise: + * @value: a #GVariant + * @data: an appropriately-sized buffer + * + * Serialises @value into @data. @value must be in tree form. + * + * No change is made to @value. + * + * The current thread must hold the lock on @value. + */ +static void +g_variant_serialise (GVariant *value, + gpointer data) +{ + GVariantSerialised serialised = { 0, }; + gpointer *children; + gsize n_children; + + g_assert (~value->state & STATE_SERIALISED); + g_assert (value->state & STATE_LOCKED); + + serialised.type_info = value->type_info; + serialised.size = value->size; + serialised.data = data; + + children = (gpointer *) value->contents.tree.children; + n_children = value->contents.tree.n_children; + + g_variant_serialiser_serialise (serialised, g_variant_fill_gvs, + children, n_children); +} + +/* < private > + * g_variant_fill_gvs: + * @serialised: a pointer to a #GVariantSerialised + * @data: a #GVariant instance + * + * This is the callback that is passed by a tree-form container instance + * to the serialiser. This callback gets called on each child of the + * container. Each child is responsible for performing the following + * actions: + * + * - reporting its type + * + * - reporting its serialised size (requires knowing the size first) + * + * - possibly storing its serialised form into the provided buffer + */ +static void +g_variant_fill_gvs (GVariantSerialised *serialised, + gpointer data) +{ + GVariant *value = data; + + g_variant_lock (value); + g_variant_ensure_size (value); + g_variant_unlock (value); + + if (serialised->type_info == NULL) + serialised->type_info = value->type_info; + g_assert (serialised->type_info == value->type_info); + + if (serialised->size == 0) + serialised->size = value->size; + g_assert (serialised->size == value->size); + + if (serialised->data) + /* g_variant_store() is a public API, so it + * it will reacquire the lock if it needs to. + */ + g_variant_store (value, serialised->data); +} + +/* this ends the main body of the recursive serialiser */ + +/* < private > + * g_variant_ensure_serialised: + * @value: a #GVariant + * + * Ensures that @value is in serialised form. + * + * If @value is in tree form then this function ensures that the + * serialised size is known and then allocates a buffer of that size and + * serialises the instance into the buffer. The 'children' array is + * then released and the instance is set to serialised form based on the + * contents of the buffer. + * + * The current thread must hold the lock on @value. + */ +static void +g_variant_ensure_serialised (GVariant *value) +{ + g_assert (value->state & STATE_LOCKED); + + if (~value->state & STATE_SERIALISED) + { + GBuffer *buffer; + gpointer data; + + g_variant_ensure_size (value); + data = g_malloc (value->size); + g_variant_serialise (value, data); + + g_variant_release_children (value); + + buffer = g_buffer_new_take_data (data, value->size); + value->contents.serialised.data = buffer->data; + value->contents.serialised.buffer = buffer; + value->state |= STATE_SERIALISED; + } +} + +/* < private > + * g_variant_alloc: + * @type: the type of the new instance + * @serialised: if the instance will be in serialised form + * @trusted: if the instance will be trusted + * @returns: a new #GVariant with a floating reference + * + * Allocates a #GVariant instance and does some common work (such as + * looking up and filling in the type info), setting the state field, + * and setting the ref_count to 1. + */ +static GVariant * +g_variant_alloc (const GVariantType *type, + gboolean serialised, + gboolean trusted) +{ + GVariant *value; + + value = g_slice_new (GVariant); + value->type_info = g_variant_type_info_get (type); + value->state = (serialised ? STATE_SERIALISED : 0) | + (trusted ? STATE_TRUSTED : 0) | + STATE_FLOATING; + value->size = (gssize) -1; + value->ref_count = 1; + + return value; +} + +/* -- internal -- */ +/* < internal > + * g_variant_new_from_buffer: + * @type: a #GVariantType + * @buffer: a #GBuffer + * @trusted: if the contents of @buffer are trusted + * @returns: a new #GVariant with a floating reference + * + * Constructs a new serialised-mode #GVariant instance. This is the + * inner interface for creation of new serialised values that gets + * called from various functions in gvariant.c. + * + * A reference is taken on @buffer. + */ +GVariant * +g_variant_new_from_buffer (const GVariantType *type, + GBuffer *buffer, + gboolean trusted) +{ + GVariant *value; + + value = g_variant_alloc (type, TRUE, trusted); + value->contents.serialised.buffer = g_buffer_ref (buffer); + value->contents.serialised.data = buffer->data; + value->size = buffer->size; + + return value; +} + +/* < internal > + * g_variant_new_from_children: + * @type: a #GVariantType + * @children: an array of #GVariant pointers. Consumed. + * @n_children: the length of @children + * @trusted: %TRUE if every child in @children in trusted + * @returns: a new #GVariant with a floating reference + * + * Constructs a new tree-mode #GVariant instance. This is the inner + * interface for creation of new serialised values that gets called from + * various functions in gvariant.c. + * + * @children is consumed by this function. g_free() will be called on + * it some time later. + */ +GVariant * +g_variant_new_from_children (const GVariantType *type, + GVariant **children, + gsize n_children, + gboolean trusted) +{ + GVariant *value; + + value = g_variant_alloc (type, FALSE, trusted); + value->contents.tree.children = children; + value->contents.tree.n_children = n_children; + + return value; +} + +/* < internal > + * g_variant_get_type_info: + * @value: a #GVariant + * @returns: the #GVariantTypeInfo for @value + * + * Returns the #GVariantTypeInfo corresponding to the type of @value. A + * reference is not added, so the return value is only good for the + * duration of the life of @value. + */ +GVariantTypeInfo * +g_variant_get_type_info (GVariant *value) +{ + return value->type_info; +} + +/* < internal > + * g_variant_is_trusted: + * @value: a #GVariant + * @returns: if @value is trusted + * + * Determines if @value is trusted by #GVariant to contain only + * fully-valid data. All values constructed solely via #GVariant APIs + * are trusted, but values containing data read in from other sources + * are usually not trusted. + * + * The main advantage of trusted data is that certain checks can be + * skipped. For example, we don't need to check that a string is + * properly nul-terminated or that an object path is actually a + * properly-formatted object path. + */ +gboolean +g_variant_is_trusted (GVariant *value) +{ + return (value->state & STATE_TRUSTED) != 0; +} + +/* -- public -- */ + +/** + * g_variant_unref: + * @value: a #GVariant + * + * Decreases the reference count of @value. When its reference count + * drops to 0, the memory used by the variant is freed. + * + * Since: 2.24 + **/ +void +g_variant_unref (GVariant *value) +{ + if (g_atomic_int_dec_and_test (&value->ref_count)) + { + if G_UNLIKELY (value->state & STATE_LOCKED) + g_critical ("attempting to free a locked GVariant instance. " + "This should never happen."); + + value->state |= STATE_LOCKED; + + g_variant_type_info_unref (value->type_info); + + if (value->state & STATE_SERIALISED) + g_buffer_unref (value->contents.serialised.buffer); + else + g_variant_release_children (value); + + g_slice_free (GVariant, value); + } +} + +/** + * g_variant_ref: + * @value: a #GVariant + * @returns: the same @value + * + * Increases the reference count of @value. + * + * Since: 2.24 + **/ +GVariant * +g_variant_ref (GVariant *value) +{ + g_atomic_int_inc (&value->ref_count); + + return value; +} + +/** + * g_variant_ref_sink: + * @value: a #GVariant + * @returns: the same @value + * + * #GVariant uses a floating reference count system. All functions with + * names starting with g_variant_new_ return floating + * references. + * + * Calling g_variant_ref_sink() on a #GVariant with a floating reference + * will convert the floating reference into a full reference. Calling + * g_variant_ref_sink() on a non-floating #GVariant results in an + * additional normal reference being added. + * + * In other words, if the @value is floating, then this call "assumes + * ownership" of the floating reference, converting it to a normal + * reference. If the @value is not floating, then this call adds a + * new normal reference increasing the reference count by one. + * + * All calls that result in a #GVariant instance being inserted into a + * container will call g_variant_ref_sink() on the instance. This means + * that if the value was just created (and has only its floating + * reference) then the container will assume sole ownership of the value + * at that point and the caller will not need to unreference it. This + * makes certain common styles of programming much easier while still + * maintaining normal refcounting semantics in situations where values + * are not floating. + * + * Since: 2.24 + **/ +GVariant * +g_variant_ref_sink (GVariant *value) +{ + g_variant_lock (value); + + if (~value->state & STATE_FLOATING) + g_variant_ref (value); + else + value->state &= ~STATE_FLOATING; + + g_variant_unlock (value); + + return value; +} + +/** + * g_variant_get_size: + * @value: a #GVariant instance + * @returns: the serialised size of @value + * + * Determines the number of bytes that would be required to store @value + * with g_variant_store(). + * + * If @value has a fixed-sized type then this function always returned + * that fixed size. + * + * In the case that @value is already in serialised form or the size has + * already been calculated (ie: this function has been called before) + * then this function is O(1). Otherwise, the size is calculated, an + * operation which is approximately O(n) in the number of values + * involved. + * + * Since: 2.24 + **/ +gsize +g_variant_get_size (GVariant *value) +{ + g_variant_lock (value); + g_variant_ensure_size (value); + g_variant_unlock (value); + + return value->size; +} + +/** + * g_variant_get_data: + * @value: a #GVariant instance + * @returns: the serialised form of @value, or %NULL + * + * Returns a pointer to the serialised form of a #GVariant instance. + * The returned data may not be in fully-normalised form if read from an + * untrusted source. The returned data must not be freed; it remains + * valid for as long as @value exists. + * + * If @value is a fixed-sized value that was deserialised from a + * corrupted serialised container then %NULL may be returned. In this + * case, the proper thing to do is typically to use the appropriate + * number of nul bytes in place of @value. If @value is not fixed-sized + * then %NULL is never returned. + * + * In the case that @value is already in serialised form, this function + * is O(1). If the value is not already in serialised form, + * serialisation occurs implicitly and is approximately O(n) in the size + * of the result. + * + * Since: 2.24 + **/ +gconstpointer +g_variant_get_data (GVariant *value) +{ + g_variant_lock (value); + g_variant_ensure_serialised (value); + g_variant_unlock (value); + + return value->contents.serialised.data; +} + +/** + * g_variant_n_children: + * @value: a container #GVariant + * @returns: the number of children in the container + * + * Determines the number of children in a container #GVariant instance. + * This includes variants, maybes, arrays, tuples and dictionary + * entries. It is an error to call this function on any other type of + * #GVariant. + * + * For variants, the return value is always 1. For values with maybe + * types, it is always zero or one. For arrays, it is the length of the + * array. For tuples it is the number of tuple items (which depends + * only on the type). For dictionary entries, it is always 2 + * + * This function is O(1). + * + * Since: 2.24 + **/ +gsize +g_variant_n_children (GVariant *value) +{ + gsize n_children; + + g_variant_lock (value); + + if (value->state & STATE_SERIALISED) + { + GVariantSerialised serialised = { + value->type_info, + (gpointer) value->contents.serialised.data, + value->size + }; + + n_children = g_variant_serialised_n_children (serialised); + } + else + n_children = value->contents.tree.n_children; + + g_variant_unlock (value); + + return n_children; +} + +/** + * g_variant_get_child_value: + * @value: a container #GVariant + * @index_: the index of the child to fetch + * @returns: the child at the specified index + * + * Reads a child item out of a container #GVariant instance. This + * includes variants, maybes, arrays, tuples and dictionary + * entries. It is an error to call this function on any other type of + * #GVariant. + * + * It is an error if @index_ is greater than the number of child items + * in the container. See g_variant_n_children(). + * + * This function is O(1). + * + * Since: 2.24 + **/ +GVariant * +g_variant_get_child_value (GVariant *value, + gsize index_) +{ + GVariant *child = NULL; + + g_variant_lock (value); + + if (value->state & STATE_SERIALISED) + { + GVariantSerialised serialised = { + value->type_info, + (gpointer) value->contents.serialised.data, + value->size + }; + GVariantSerialised s_child; + + /* get the serialiser to extract the serialised data for the child + * from the serialised data for the container + */ + s_child = g_variant_serialised_get_child (serialised, index_); + + /* create a new serialised instance out of it */ + child = g_slice_new (GVariant); + child->type_info = s_child.type_info; + child->state = (value->state & STATE_TRUSTED) | + STATE_SERIALISED; + child->size = s_child.size; + child->ref_count = 1; + child->contents.serialised.buffer = + g_buffer_ref (value->contents.serialised.buffer); + child->contents.serialised.data = s_child.data; + } + else + child = g_variant_ref (value->contents.tree.children[index_]); + + g_variant_unlock (value); + + return child; +} + +/** + * g_variant_store: + * @value: the #GVariant to store + * @data: the location to store the serialised data at + * + * Stores the serialised form of @value at @data. @data should be + * large enough. See g_variant_get_size(). + * + * The stored data is in machine native byte order but may not be in + * fully-normalised form if read from an untrusted source. See + * g_variant_normalise() for a solution. + * + * This function is approximately O(n) in the size of @data. + * + * Since: 2.24 + **/ +void +g_variant_store (GVariant *value, + gpointer data) +{ + g_variant_lock (value); + + if (value->state & STATE_SERIALISED) + { + if (value->contents.serialised.data != NULL) + memcpy (data, value->contents.serialised.data, value->size); + else + memset (data, 0, value->size); + } + else + g_variant_serialise (value, data); + + g_variant_unlock (value); +} + +/** + * g_variant_is_normal_form: + * @value: a #GVariant instance + * @returns: %TRUE if @value is in normal form + * + * Checks if @value is in normal form. + * + * The main reason to do this is to detect if a given chunk of + * serialised data is in normal form: load the data into a #GVariant + * using g_variant_create_from_data() and then use this function to + * check. + * + * If @value is found to be in normal form then it will be marked as + * being trusted. If the value was already marked as being trusted then + * this function will immediately return %TRUE. + * + * Since: 2.24 + **/ +gboolean +g_variant_is_normal_form (GVariant *value) +{ + if (value->state & STATE_TRUSTED) + return TRUE; + + g_variant_lock (value); + + if (value->state & STATE_SERIALISED) + { + GVariantSerialised serialised = { + value->type_info, + (gpointer) value->contents.serialised.data, + value->size + }; + + if (g_variant_serialised_is_normal (serialised)) + value->state |= STATE_TRUSTED; + } + else + { + gboolean normal = TRUE; + gsize i; + + for (i = 0; i < value->contents.tree.n_children; i++) + normal &= g_variant_is_normal_form (value->contents.tree.children[i]); + + if (normal) + value->state |= STATE_TRUSTED; + } + + g_variant_unlock (value); + + return (value->state & STATE_TRUSTED) != 0; +} + +#define __G_VARIANT_CORE_C__ +#include "galiasdef.c" diff --git a/glib/gvariant-core.h b/glib/gvariant-core.h new file mode 100644 index 0000000..33c0ef3 --- /dev/null +++ b/glib/gvariant-core.h @@ -0,0 +1,46 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_VARIANT_CORE_H__ +#define __G_VARIANT_CORE_H__ + +#include +#include +#include + +/* gvariant-core.c */ +G_GNUC_INTERNAL +GVariant * g_variant_new_from_buffer (const GVariantType *type, + GBuffer *buffer, + gboolean trusted); + +G_GNUC_INTERNAL +GVariant * g_variant_new_from_children (const GVariantType *type, + GVariant **children, + gsize n_children, + gboolean trusted); + +G_GNUC_INTERNAL +gboolean g_variant_is_trusted (GVariant *value); + +G_GNUC_INTERNAL +GVariantTypeInfo * g_variant_get_type_info (GVariant *value); + +#endif /* __G_VARIANT_CORE_H__ */ diff --git a/glib/gvariant-internal.h b/glib/gvariant-internal.h new file mode 100644 index 0000000..66a080a --- /dev/null +++ b/glib/gvariant-internal.h @@ -0,0 +1,49 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + + +/* The purpose of this header is to allow certain internal symbols of + * GVariant to be put under test cases. + */ + +#ifndef __G_VARIANT_INTERNAL_H__ +#define __G_VARIANT_INTERNAL_H__ + +#ifndef GLIB_COMPILATION +#define GLIB_COMPILATION +#endif + +#include +#include + +#include "gvariant-serialiser.h" +#include "gvarianttypeinfo.h" + +gboolean g_variant_format_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr); + +GVariantType * g_variant_format_string_scan_type (const gchar *string, + const gchar *limit, + const gchar **endptr); + +#endif /* __G_VARIANT_INTERNAL_H__ */ diff --git a/glib/gvariant-parser.c b/glib/gvariant-parser.c new file mode 100644 index 0000000..1020633 --- /dev/null +++ b/glib/gvariant-parser.c @@ -0,0 +1,2214 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#include +#include +#include +#include + +#include "galias.h" + +/* + * two-pass algorithm + * designed by ryan lortie and william hua + * designed in itb-229 and at ghazi's, 2009. + */ + +/** + * G_VARIANT_PARSE_ERROR: + * + * Error domain for GVariant text format parsing. Specific error codes + * are not currently defined for this domain. See #GError for + * information on error domains. + **/ +GQuark +g_variant_parser_get_error_quark (void) +{ + static GQuark the_quark; + + if (the_quark == 0) + the_quark = g_quark_from_static_string ("g-variant-parse-error-quark"); + + return the_quark; +} + +typedef struct +{ + gint start, end; +} SourceRef; + +static void +parser_set_error_va (GError **error, + SourceRef *location, + SourceRef *other, + const gchar *format, + va_list ap) +{ + GString *msg = g_string_new (NULL); + + if (location->start == location->end) + g_string_append_printf (msg, "%d", location->start); + else + g_string_append_printf (msg, "%d-%d", location->start, location->end); + + if (other != NULL) + { + g_assert (other->start != other->end); + g_string_append_printf (msg, ",%d-%d", other->start, other->end); + } + g_string_append_c (msg, ':'); + + g_string_append_vprintf (msg, format, ap); + g_set_error_literal (error, G_VARIANT_PARSE_ERROR, 0, msg->str); + g_string_free (msg, TRUE); +} + +static void +parser_set_error (GError **error, + SourceRef *location, + SourceRef *other, + const gchar *format, + ...) +{ + va_list ap; + + va_start (ap, format); + parser_set_error_va (error, location, other, format, ap); + va_end (ap); +} + +typedef struct +{ + const gchar *start; + const gchar *stream; + const gchar *end; + + const gchar *this; +} TokenStream; + + +static void +token_stream_set_error (TokenStream *stream, + GError **error, + gboolean this_token, + const gchar *format, + ...) +{ + SourceRef ref; + va_list ap; + + ref.start = stream->this - stream->start; + + if (this_token) + ref.end = stream->stream - stream->start; + else + ref.end = ref.start; + + va_start (ap, format); + parser_set_error_va (error, &ref, NULL, format, ap); + va_end (ap); +} + +static void +token_stream_prepare (TokenStream *stream) +{ + gint brackets = 0; + const gchar *end; + + if (stream->this != NULL) + return; + + while (stream->stream != stream->end && g_ascii_isspace (*stream->stream)) + stream->stream++; + + if (stream->stream == stream->end || *stream->stream == '\0') + { + stream->this = stream->stream; + return; + } + + switch (stream->stream[0]) + { + case '-': case '+': case '.': case '0': case '1': case '2': + case '3': case '4': case '5': case '6': case '7': case '8': + case '9': + for (end = stream->stream; end != stream->end; end++) + if (!g_ascii_isalnum (*end) && + *end != '-' && *end != '+' && *end != '.') + break; + break; + + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': + case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': + case 's': case 't': case 'u': case 'v': case 'w': case 'x': + case 'y': case 'z': + for (end = stream->stream; end != stream->end; end++) + if (!g_ascii_isalnum (*end)) + break; + break; + + case '@': case '%': + /* stop at the first space, comma, colon or unmatched bracket. + * deals nicely with cases like (%i, %i) or {%i: %i}. + */ + for (end = stream->stream + 1; + end != stream->end && *end != ',' && + *end != ':' && !g_ascii_isspace (*end); + end++) + + if (*end == '(' || *end == '{') + brackets++; + + else if ((*end == ')' || *end == '}') && !brackets--) + break; + + break; + + case '\'': case '"': + for (end = stream->stream + 1; end != stream->end; end++) + if (*end == stream->stream[0] || *end == '\0' || + (*end == '\\' && (++end == stream->end || *end == '\0'))) + break; + + if (end != stream->end && *end) + end++; + break; + + default: + end = stream->stream + 1; + break; + } + + stream->this = stream->stream; + stream->stream = end; +} + +static void +token_stream_next (TokenStream *stream) +{ + stream->this = NULL; +} + +static gboolean +token_stream_peek (TokenStream *stream, + gchar first_char) +{ + token_stream_prepare (stream); + + return stream->this[0] == first_char; +} + +static gboolean +token_stream_is_keyword (TokenStream *stream) +{ + token_stream_prepare (stream); + + return g_ascii_isalpha (stream->this[0]); +} + +static gboolean +token_stream_is_numeric (TokenStream *stream) +{ + token_stream_prepare (stream); + + return (g_ascii_isdigit (stream->this[0]) || + stream->this[0] == '-' || + stream->this[0] == '+' || + stream->this[0] == '.'); +} + +static gboolean +token_stream_consume (TokenStream *stream, + const gchar *token) +{ + gint length = strlen (token); + + token_stream_prepare (stream); + + if (stream->stream - stream->this == length && + memcmp (stream->this, token, length) == 0) + { + token_stream_next (stream); + return TRUE; + } + + return FALSE; +} + +static gboolean +token_stream_require (TokenStream *stream, + const gchar *token, + const gchar *purpose, + GError **error) +{ + + if (!token_stream_consume (stream, token)) + { + token_stream_set_error (stream, error, FALSE, + "expected `%s'%s", token, purpose); + return FALSE; + } + + return TRUE; +} + +static void +token_stream_assert (TokenStream *stream, + const gchar *token) +{ + gboolean correct_token; + + correct_token = token_stream_consume (stream, token); + g_assert (correct_token); +} + +static gchar * +token_stream_get (TokenStream *stream) +{ + gchar *result; + + token_stream_prepare (stream); + + result = g_strndup (stream->this, stream->stream - stream->this); + + return result; +} + +static void +token_stream_start_ref (TokenStream *stream, + SourceRef *ref) +{ + token_stream_prepare (stream); + ref->start = stream->this - stream->start; +} + +static void +token_stream_end_ref (TokenStream *stream, + SourceRef *ref) +{ + ref->end = stream->stream - stream->start; +} + +void +pattern_copy (gchar **out, + const gchar **in) +{ + gint brackets = 0; + + while (**in == 'a' || **in == 'm' || **in == 'M') + *(*out)++ = *(*in)++; + + do + { + if (**in == '(' || **in == '{') + brackets++; + + else if (**in == ')' || **in == '}') + brackets--; + + *(*out)++ = *(*in)++; + } + while (brackets); +} + +static gchar * +pattern_coalesce (const gchar *left, + const gchar *right) +{ + gchar *result; + gchar *out; + + /* the length of the output is loosely bound by the sum of the input + * lengths, not simply the greater of the two lengths. + * + * (*(iii)) + ((iii)*) ((iii)(iii)) + * + * 8 + 8 = 12 + */ + out = result = g_malloc (strlen (left) + strlen (right)); + + while (*left && *right) + { + if (*left == *right) + { + *out++ = *left++; + right++; + } + + else + { + const gchar **one = &left, **the_other = &right; + + again: + if (**one == '*' && **the_other != ')') + { + pattern_copy (&out, the_other); + (*one)++; + } + + else if (**one == 'M' && **the_other == 'm') + { + *out++ = *(*the_other)++; + } + + else if (**one == 'M' && **the_other != 'm') + { + (*one)++; + } + + else if (**one == 'N' && strchr ("ynqiuxthd", **the_other)) + { + *out++ = *(*the_other)++; + (*one)++; + } + + else if (**one == 'S' && strchr ("sog", **the_other)) + { + *out++ = *(*the_other)++; + (*one)++; + } + + else if (one == &left) + { + one = &right, the_other = &left; + goto again; + } + + else + break; + } + } + + if (*left || *right) + { + g_free (result); + result = NULL; + } + else + *out++ = '\0'; + + return result; +} + +typedef struct _AST AST; +typedef gchar * (*get_pattern_func) (AST *ast, + GError **error); +typedef GVariant * (*get_value_func) (AST *ast, + const GVariantType *type, + GError **error); +typedef GVariant * (*get_base_value_func) (AST *ast, + const GVariantType *type, + GError **error); +typedef void (*free_func) (AST *ast); + +typedef struct +{ + gchar * (* get_pattern) (AST *ast, + GError **error); + GVariant * (* get_value) (AST *ast, + const GVariantType *type, + GError **error); + GVariant * (* get_base_value) (AST *ast, + const GVariantType *type, + GError **error); + void (* free) (AST *ast); +} ASTClass; + +struct _AST +{ + const ASTClass *class; + SourceRef source_ref; +}; + +static gchar * +ast_get_pattern (AST *ast, + GError **error) +{ + return ast->class->get_pattern (ast, error); +} + +static GVariant * +ast_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + return ast->class->get_value (ast, type, error); +} + +static void +ast_free (AST *ast) +{ + ast->class->free (ast); +} + +static void +ast_set_error (AST *ast, + GError **error, + AST *other_ast, + const gchar *format, + ...) +{ + va_list ap; + + va_start (ap, format); + parser_set_error_va (error, &ast->source_ref, + other_ast ? & other_ast->source_ref : NULL, + format, ap); + va_end (ap); +} + +static GVariant * +ast_type_error (AST *ast, + const GVariantType *type, + GError **error) +{ + gchar *typestr; + + typestr = g_variant_type_dup_string (type); + ast_set_error (ast, error, NULL, + "can not parse as value of type `%s'", + typestr); + g_free (typestr); + + return NULL; +} + +static GVariant * +ast_resolve (AST *ast, + GError **error) +{ + GVariant *value; + gchar *pattern; + gint i, j = 0; + + pattern = ast_get_pattern (ast, error); + + if (pattern == NULL) + return NULL; + + /* choose reasonable defaults + * + * 1) favour non-maybe values where possible + * 2) default type for strings is 's' + * 3) default type for integers is 'i' + */ + for (i = 0; pattern[i]; i++) + switch (pattern[i]) + { + case '*': + ast_set_error (ast, error, NULL, "unable to infer type"); + g_free (pattern); + return NULL; + + case 'M': + break; + + case 'S': + pattern[j++] = 's'; + break; + + case 'N': + pattern[j++] = 'i'; + break; + + default: + pattern[j++] = pattern[i]; + break; + } + pattern[j++] = '\0'; + + value = ast_get_value (ast, G_VARIANT_TYPE (pattern), error); + g_free (pattern); + + return value; +} + + +static AST *parse (TokenStream *stream, + va_list *app, + GError **error); + +static void +ast_array_append (AST ***array, + gint *n_items, + AST *ast) +{ + if ((*n_items & (*n_items - 1)) == 0) + *array = g_renew (AST *, *array, *n_items ? 2 ** n_items : 1); + + (*array)[(*n_items)++] = ast; +} + +static void +ast_array_free (AST **array, + gint n_items) +{ + gint i; + + for (i = 0; i < n_items; i++) + ast_free (array[i]); + g_free (array); +} + +static gchar * +ast_array_get_pattern (AST **array, + gint n_items, + GError **error) +{ + gchar *pattern; + gint i; + + pattern = ast_get_pattern (array[0], error); + + if (pattern == NULL) + return NULL; + + for (i = 1; i < n_items; i++) + { + gchar *tmp, *merged; + + tmp = ast_get_pattern (array[i], error); + + if (tmp == NULL) + { + g_free (pattern); + return NULL; + } + + merged = pattern_coalesce (pattern, tmp); + g_free (pattern); + pattern = merged; + + if (merged == NULL) + /* set coalescence implies pairwise coalescence (i think). + * we should therefore be able to trace the failure to a single + * pair of values. + */ + { + int j = 0; + + while (TRUE) + { + gchar *tmp2; + gchar *m; + + /* if 'j' reaches 'i' then we failed to find the pair */ + g_assert (j < i); + + tmp2 = ast_get_pattern (array[j], NULL); + g_assert (tmp2 != NULL); + + m = pattern_coalesce (tmp, tmp2); + g_free (tmp2); + g_free (m); + + if (m == NULL) + { + /* we found a conflict between 'i' and 'j'. + * + * report the error. note: 'j' is first. + */ + ast_set_error (array[j], error, array[i], + "unable to find a common type"); + g_free (tmp); + return NULL; + } + + j++; + } + } + } + + return pattern; +} + +typedef struct +{ + AST ast; + + AST *child; +} Maybe; + +static gchar * +maybe_get_pattern (AST *ast, + GError **error) +{ + Maybe *maybe = (Maybe *) ast; + + if (maybe->child != NULL) + { + gchar *child_pattern; + gchar *pattern; + + child_pattern = ast_get_pattern (maybe->child, error); + + if (child_pattern == NULL) + return NULL; + + pattern = g_strdup_printf ("m%s", child_pattern); + g_free (child_pattern); + + return pattern; + } + + return g_strdup ("m*"); +} + +static GVariant * +maybe_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Maybe *maybe = (Maybe *) ast; + GVariant *value; + + if (!g_variant_type_is_maybe (type)) + return ast_type_error (ast, type, error); + + type = g_variant_type_element (type); + + if (maybe->child) + { + value = ast_get_value (maybe->child, type, error); + + if (value == NULL) + return NULL; + } + else + value = NULL; + + return g_variant_new_maybe (type, value); +} + +static void +maybe_free (AST *ast) +{ + Maybe *maybe = (Maybe *) ast; + + if (maybe->child != NULL) + ast_free (maybe->child); + + g_slice_free (Maybe, maybe); +} + +static AST * +maybe_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass maybe_class = { + maybe_get_pattern, + maybe_get_value, NULL, + maybe_free + }; + AST *child = NULL; + Maybe *maybe; + + if (token_stream_consume (stream, "just")) + { + child = parse (stream, app, error); + if (child == NULL) + return NULL; + } + + else if (!token_stream_consume (stream, "nothing")) + { + token_stream_set_error (stream, error, TRUE, "unknown keyword"); + return NULL; + } + + maybe = g_slice_new (Maybe); + maybe->ast.class = &maybe_class; + maybe->child = child; + + return (AST *) maybe; +} + +static GVariant * +maybe_wrapper (AST *ast, + const GVariantType *type, + GError **error) +{ + const GVariantType *t; + GVariant *value; + int depth; + + for (depth = 0, t = type; + g_variant_type_is_maybe (t); + depth++, t = g_variant_type_element (t)); + + value = ast->class->get_base_value (ast, t, error); + + if (value == NULL) + return NULL; + + while (depth--) + value = g_variant_new_maybe (NULL, value); + + return value; +} + +typedef struct +{ + AST ast; + + AST **children; + gint n_children; +} Array; + +static gchar * +array_get_pattern (AST *ast, + GError **error) +{ + Array *array = (Array *) ast; + gchar *pattern; + gchar *result; + + if (array->n_children == 0) + return g_strdup ("Ma*"); + + pattern = ast_array_get_pattern (array->children, array->n_children, error); + + if (pattern == NULL) + return NULL; + + result = g_strdup_printf ("Ma%s", pattern); + g_free (pattern); + + return result; +} + +static GVariant * +array_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Array *array = (Array *) ast; + const GVariantType *childtype; + GVariantBuilder builder; + gint i; + + if (!g_variant_type_is_array (type)) + return ast_type_error (ast, type, error); + + g_variant_builder_init (&builder, type); + childtype = g_variant_type_element (type); + + for (i = 0; i < array->n_children; i++) + { + GVariant *child; + + if (!(child = ast_get_value (array->children[i], childtype, error))) + { + g_variant_builder_clear (&builder); + return NULL; + } + + g_variant_builder_add_value (&builder, child); + } + + return g_variant_builder_end (&builder); +} + +static void +array_free (AST *ast) +{ + Array *array = (Array *) ast; + + ast_array_free (array->children, array->n_children); + g_slice_free (Array, array); +} + +static AST * +array_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass array_class = { + array_get_pattern, + maybe_wrapper, array_get_value, + array_free + }; + gboolean need_comma = FALSE; + Array *array; + + array = g_slice_new (Array); + array->ast.class = &array_class; + array->children = NULL; + array->n_children = 0; + + token_stream_assert (stream, "["); + while (!token_stream_consume (stream, "]")) + { + AST *child; + + if (need_comma && + !token_stream_require (stream, ",", + " or `]' to follow array element", + error)) + goto error; + + child = parse (stream, app, error); + + if (!child) + goto error; + + ast_array_append (&array->children, &array->n_children, child); + need_comma = TRUE; + } + + return (AST *) array; + + error: + ast_array_free (array->children, array->n_children); + g_slice_free (Array, array); + + return NULL; +} + +typedef struct +{ + AST ast; + + AST **children; + gint n_children; +} Tuple; + +static gchar * +tuple_get_pattern (AST *ast, + GError **error) +{ + Tuple *tuple = (Tuple *) ast; + gchar *result = NULL; + gchar **parts; + gint i; + + parts = g_new (gchar *, tuple->n_children + 4); + parts[tuple->n_children + 1] = (gchar *) ")"; + parts[tuple->n_children + 2] = NULL; + parts[0] = (gchar *) "M("; + + for (i = 0; i < tuple->n_children; i++) + if (!(parts[i + 1] = ast_get_pattern (tuple->children[i], error))) + break; + + if (i == tuple->n_children) + result = g_strjoinv ("", parts); + + /* parts[0] should not be freed */ + while (i) + g_free (parts[i--]); + g_free (parts); + + return result; +} + +static GVariant * +tuple_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Tuple *tuple = (Tuple *) ast; + const GVariantType *childtype; + GVariantBuilder builder; + gint i; + + if (!g_variant_type_is_tuple (type)) + return ast_type_error (ast, type, error); + + g_variant_builder_init (&builder, type); + childtype = g_variant_type_first (type); + + for (i = 0; i < tuple->n_children; i++) + { + GVariant *child; + + if (!(child = ast_get_value (tuple->children[i], childtype, error))) + { + g_variant_builder_clear (&builder); + return FALSE; + } + + g_variant_builder_add_value (&builder, child); + childtype = g_variant_type_next (childtype); + } + + return g_variant_builder_end (&builder); +} + +static void +tuple_free (AST *ast) +{ + Tuple *tuple = (Tuple *) ast; + + ast_array_free (tuple->children, tuple->n_children); + g_slice_free (Tuple, tuple); +} + +static AST * +tuple_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass tuple_class = { + tuple_get_pattern, + maybe_wrapper, tuple_get_value, + tuple_free + }; + gboolean need_comma = FALSE; + gboolean first = TRUE; + Tuple *tuple; + + tuple = g_slice_new (Tuple); + tuple->ast.class = &tuple_class; + tuple->children = NULL; + tuple->n_children = 0; + + token_stream_assert (stream, "("); + while (!token_stream_consume (stream, ")")) + { + AST *child; + + if (need_comma && + !token_stream_require (stream, ",", + " or `)' to follow tuple element", + error)) + goto error; + + child = parse (stream, app, error); + + if (!child) + goto error; + + ast_array_append (&tuple->children, &tuple->n_children, child); + + /* the first time, we absolutely require a comma, so grab it here + * and leave need_comma = FALSE so that the code above doesn't + * require a second comma. + * + * the second and remaining times, we set need_comma = TRUE. + */ + if (first) + { + if (!token_stream_require (stream, ",", + " after first tuple element", error)) + goto error; + + first = FALSE; + } + else + need_comma = TRUE; + } + + return (AST *) tuple; + + error: + ast_array_free (tuple->children, tuple->n_children); + g_slice_free (Tuple, tuple); + + return NULL; +} + +typedef struct +{ + AST ast; + + AST *value; +} Variant; + +static gchar * +variant_get_pattern (AST *ast, + GError **error) +{ + return g_strdup ("Mv"); +} + +static GVariant * +variant_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Variant *variant = (Variant *) ast; + GVariant *child; + + g_assert (g_variant_type_equal (type, G_VARIANT_TYPE_VARIANT)); + child = ast_resolve (variant->value, error); + + if (child == NULL) + return NULL; + + return g_variant_new_variant (child); +} + +static void +variant_free (AST *ast) +{ + Variant *variant = (Variant *) ast; + + ast_free (variant->value); + g_slice_free (Variant, variant); +} + +static AST * +variant_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass variant_class = { + variant_get_pattern, + maybe_wrapper, variant_get_value, + variant_free + }; + Variant *variant; + AST *value; + + token_stream_assert (stream, "<"); + value = parse (stream, app, error); + + if (!value) + return NULL; + + if (!token_stream_require (stream, ">", " to follow variant value", error)) + { + ast_free (value); + return NULL; + } + + variant = g_slice_new (Variant); + variant->ast.class = &variant_class; + variant->value = value; + + return (AST *) variant; +} + +typedef struct +{ + AST ast; + + AST **keys; + AST **values; + gint n_children; +} Dictionary; + +static gchar * +dictionary_get_pattern (AST *ast, + GError **error) +{ + Dictionary *dict = (Dictionary *) ast; + gchar *value_pattern; + gchar *key_pattern; + gchar key_char; + gchar *result; + + if (dict->n_children == 0) + return g_strdup ("Ma{**}"); + + key_pattern = ast_array_get_pattern (dict->keys, + abs (dict->n_children), + error); + + if (key_pattern == NULL) + return NULL; + + /* we can not have maybe keys */ + if (key_pattern[0] == 'M') + key_char = key_pattern[1]; + else + key_char = key_pattern[0]; + + g_free (key_pattern); + + /* the basic types, + * plus undetermined number type and undetermined string type. + */ + if (!strchr ("bynqiuxthdsogNS", key_char)) + { + ast_set_error (ast, error, NULL, + "dictionary keys must have basic types"); + return NULL; + } + + value_pattern = ast_get_pattern (dict->values[0], error); + + if (value_pattern == NULL) + return NULL; + + result = g_strdup_printf ("M%s{%c%s}", + dict->n_children > 0 ? "a" : "", + key_char, value_pattern); + g_free (value_pattern); + + return result; +} + +static GVariant * +dictionary_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Dictionary *dict = (Dictionary *) ast; + + if (dict->n_children == -1) + { + const GVariantType *subtype; + GVariantBuilder builder; + GVariant *subvalue; + + if (!g_variant_type_is_dict_entry (type)) + return ast_type_error (ast, type, error); + + g_variant_builder_init (&builder, type); + + subtype = g_variant_type_key (type); + if (!(subvalue = ast_get_value (dict->keys[0], subtype, error))) + { + g_variant_builder_clear (&builder); + return FALSE; + } + g_variant_builder_add_value (&builder, subvalue); + + subtype = g_variant_type_value (type); + if (!(subvalue = ast_get_value (dict->values[0], subtype, error))) + { + g_variant_builder_clear (&builder); + return FALSE; + } + g_variant_builder_add_value (&builder, subvalue); + + return g_variant_builder_end (&builder); + } + else + { + const GVariantType *entry, *key, *val; + GVariantBuilder builder; + gint i; + + if (!g_variant_type_is_subtype_of (type, G_VARIANT_TYPE_DICTIONARY)) + return ast_type_error (ast, type, error); + + entry = g_variant_type_element (type); + key = g_variant_type_key (entry); + val = g_variant_type_value (entry); + + g_variant_builder_init (&builder, type); + + for (i = 0; i < dict->n_children; i++) + { + GVariant *subvalue; + + g_variant_builder_open (&builder, entry); + + if (!(subvalue = ast_get_value (dict->keys[i], key, error))) + { + g_variant_builder_clear (&builder); + return FALSE; + } + g_variant_builder_add_value (&builder, subvalue); + + if (!(subvalue = ast_get_value (dict->values[i], val, error))) + { + g_variant_builder_clear (&builder); + return FALSE; + } + g_variant_builder_add_value (&builder, subvalue); + g_variant_builder_close (&builder); + } + + return g_variant_builder_end (&builder); + } +} + +static void +dictionary_free (AST *ast) +{ + Dictionary *dict = (Dictionary *) ast; + gint n_children; + + if (dict->n_children > -1) + n_children = dict->n_children; + else + n_children = 1; + + ast_array_free (dict->keys, n_children); + ast_array_free (dict->values, n_children); + g_slice_free (Dictionary, dict); +} + +static AST * +dictionary_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass dictionary_class = { + dictionary_get_pattern, + maybe_wrapper, dictionary_get_value, + dictionary_free + }; + gint n_keys, n_values; + gboolean only_one; + Dictionary *dict; + AST *first; + + dict = g_slice_new (Dictionary); + dict->ast.class = &dictionary_class; + dict->keys = NULL; + dict->values = NULL; + n_keys = n_values = 0; + + token_stream_assert (stream, "{"); + + if (token_stream_consume (stream, "}")) + { + dict->n_children = 0; + return (AST *) dict; + } + + if ((first = parse (stream, app, error)) == NULL) + goto error; + + ast_array_append (&dict->keys, &n_keys, first); + + only_one = token_stream_consume (stream, ","); + if (!only_one && + !token_stream_require (stream, ":", + " or `,' to follow dictionary entry key", + error)) + goto error; + + if ((first = parse (stream, app, error)) == NULL) + goto error; + + ast_array_append (&dict->values, &n_values, first); + + if (only_one) + { + if (!token_stream_require (stream, "}", " at end of dictionary entry", + error)) + goto error; + + g_assert (n_keys == 1 && n_values == 1); + dict->n_children = -1; + + return (AST *) dict; + } + + while (!token_stream_consume (stream, "}")) + { + AST *child; + + if (!token_stream_require (stream, ",", + " or `}' to follow dictionary entry", error)) + goto error; + + child = parse (stream, app, error); + + if (!child) + goto error; + + ast_array_append (&dict->keys, &n_keys, child); + + if (!token_stream_require (stream, ":", + " to follow dictionary entry key", error)) + goto error; + + child = parse (stream, app, error); + + if (!child) + goto error; + + ast_array_append (&dict->values, &n_values, child); + } + + g_assert (n_keys == n_values); + dict->n_children = n_keys; + + return (AST *) dict; + + error: + ast_array_free (dict->keys, n_keys); + ast_array_free (dict->values, n_values); + g_slice_free (Dictionary, dict); + + return NULL; +} + +typedef struct +{ + AST ast; + gchar *string; +} String; + +static gchar * +string_get_pattern (AST *ast, + GError **error) +{ + return g_strdup ("MS"); +} + +static GVariant * +string_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + String *string = (String *) ast; + + if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) + return g_variant_new_string (string->string); + + else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH)) + { + if (!g_variant_is_object_path (string->string)) + { + ast_set_error (ast, error, NULL, "not a valid object path"); + return NULL; + } + + return g_variant_new_object_path (string->string); + } + + else if (g_variant_type_equal (type, G_VARIANT_TYPE_SIGNATURE)) + { + if (!g_variant_is_signature (string->string)) + { + ast_set_error (ast, error, NULL, "not a valid signature"); + return NULL; + } + + return g_variant_new_signature (string->string); + } + + else + return ast_type_error (ast, type, error); +} + +static void +string_free (AST *ast) +{ + String *string = (String *) ast; + + g_free (string->string); + g_slice_free (String, string); +} + +static AST * +string_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass string_class = { + string_get_pattern, + maybe_wrapper, string_get_value, + string_free + }; + String *string; + SourceRef ref; + gchar *token; + gsize length; + gchar quote; + gchar *str; + gint i, j; + + token_stream_start_ref (stream, &ref); + token = token_stream_get (stream); + token_stream_end_ref (stream, &ref); + length = strlen (token); + quote = token[0]; + + str = g_malloc (length); + g_assert (quote == '"' || quote == '\''); + j = 0; + i = 1; + while (token[i] != quote) + switch (token[i]) + { + case '\0': + parser_set_error (error, &ref, NULL, + "unterminated string constant"); + g_free (token); + return NULL; + + case '\\': + switch (token[++i]) + { + case '\0': + parser_set_error (error, &ref, NULL, + "unterminated string constant"); + g_free (token); + return NULL; + + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + { + /* up to 3 characters */ + guchar val = token[i++] - '0'; + + if ('0' <= token[i] && token[i] < '8') + val = (val << 3) | (token[i++] - '0'); + + if ('0' <= token[i] && token[i] < '8') + val = (val << 3) | (token[i++] - '0'); + + str[j++] = val; + } + continue; + + case 'b': str[j++] = '\b'; i++; continue; + case 'f': str[j++] = '\f'; i++; continue; + case 'n': str[j++] = '\n'; i++; continue; + case 'r': str[j++] = '\r'; i++; continue; + case 't': str[j++] = '\t'; i++; continue; + case '\n': i++; continue; + } + + default: + str[j++] = token[i++]; + } + str[j++] = '\0'; + g_free (token); + + string = g_slice_new (String); + string->ast.class = &string_class; + string->string = str; + + token_stream_next (stream); + + return (AST *) string; +} + +typedef struct +{ + AST ast; + + gchar *token; +} Number; + +static gchar * +number_get_pattern (AST *ast, + GError **error) +{ + Number *number = (Number *) ast; + + if (strchr (number->token, '.') || + (!g_str_has_prefix (number->token, "0x") && + strchr (number->token, 'e'))) + return g_strdup ("Md"); + + return g_strdup ("MN"); +} + +static GVariant * +number_overflow (AST *ast, + const GVariantType *type, + GError **error) +{ + ast_set_error (ast, error, NULL, "number out of range for type `%c'", + g_variant_type_peek_string (type)[0]); + return NULL; +} + +static GVariant * +number_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Number *number = (Number *) ast; + const gchar *token; + gboolean negative; + gboolean floating; + guint64 abs_val; + gdouble dbl_val; + gchar *end; + + token = number->token; + + if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) + { + floating = TRUE; + + errno = 0; + dbl_val = g_ascii_strtod (token, &end); + if (dbl_val != 0.0 && errno == ERANGE) + { + ast_set_error (ast, error, NULL, "number too big for any type"); + return NULL; + } + + /* silence uninitialised warnings... */ + negative = FALSE; + abs_val = 0; + } + else + { + floating = FALSE; + negative = token[0] == '-'; + if (token[0] == '-') + token++; + + errno = 0; + abs_val = g_ascii_strtoull (token, &end, 0); + if (abs_val == G_MAXUINT64 && errno == ERANGE) + { + ast_set_error (ast, error, NULL, "integer too big for any type"); + return NULL; + } + + if (abs_val == 0) + negative = FALSE; + + /* silence uninitialised warning... */ + dbl_val = 0.0; + } + + if (*end != '\0') + { + SourceRef ref; + + ref = ast->source_ref; + ref.start += end - number->token; + ref.end = ref.start + 1; + + parser_set_error (error, &ref, NULL, + "invalid character in number"); + return NULL; + } + + if (floating) + return g_variant_new_double (dbl_val); + + switch (*g_variant_type_peek_string (type)) + { + case 'y': + if (negative || abs_val > G_MAXUINT8) + return number_overflow (ast, type, error); + return g_variant_new_byte (abs_val); + + case 'n': + if (abs_val - negative > G_MAXINT16) + return number_overflow (ast, type, error); + return g_variant_new_int16 (negative ? -abs_val : abs_val); + + case 'q': + if (negative || abs_val > G_MAXUINT16) + return number_overflow (ast, type, error); + return g_variant_new_uint16 (negative ? -abs_val : abs_val); + + case 'i': + if (abs_val - negative > G_MAXINT32) + return number_overflow (ast, type, error); + return g_variant_new_int32 (negative ? -abs_val : abs_val); + + case 'u': + if (negative || abs_val > G_MAXUINT32) + return number_overflow (ast, type, error); + return g_variant_new_uint32 (negative ? -abs_val : abs_val); + + case 'x': + if (abs_val - negative > G_MAXINT64) + return number_overflow (ast, type, error); + return g_variant_new_int64 (negative ? -abs_val : abs_val); + + case 't': + if (negative) + return number_overflow (ast, type, error); + return g_variant_new_uint64 (negative ? -abs_val : abs_val); + + case 'h': + if (abs_val - negative > G_MAXINT32) + return number_overflow (ast, type, error); + return g_variant_new_handle (negative ? -abs_val : abs_val); + + default: + return ast_type_error (ast, type, error); + } +} + +static void +number_free (AST *ast) +{ + Number *number = (Number *) ast; + + g_free (number->token); + g_slice_free (Number, number); +} + +static AST * +number_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass number_class = { + number_get_pattern, + maybe_wrapper, number_get_value, + number_free + }; + Number *number; + + number = g_slice_new (Number); + number->ast.class = &number_class; + number->token = token_stream_get (stream); + token_stream_next (stream); + + return (AST *) number; +} + +typedef struct +{ + AST ast; + gboolean value; +} Boolean; + +static gchar * +boolean_get_pattern (AST *ast, + GError **error) +{ + return g_strdup ("Mb"); +} + +static GVariant * +boolean_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Boolean *boolean = (Boolean *) ast; + + if (!g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN)) + return ast_type_error (ast, type, error); + + return g_variant_new_boolean (boolean->value); +} + +static void +boolean_free (AST *ast) +{ + Boolean *boolean = (Boolean *) ast; + + g_slice_free (Boolean, boolean); +} + +static AST * +boolean_new (gboolean value) +{ + static const ASTClass boolean_class = { + boolean_get_pattern, + maybe_wrapper, boolean_get_value, + boolean_free + }; + Boolean *boolean; + + boolean = g_slice_new (Boolean); + boolean->ast.class = &boolean_class; + boolean->value = value; + + return (AST *) boolean; +} + +typedef struct +{ + AST ast; + + GVariant *value; +} Positional; + +static gchar * +positional_get_pattern (AST *ast, + GError **error) +{ + Positional *positional = (Positional *) ast; + + return g_strdup (g_variant_get_type_string (positional->value)); +} + +static GVariant * +positional_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + Positional *positional = (Positional *) ast; + GVariant *value; + + g_assert (positional->value != NULL); + + if G_UNLIKELY (!g_variant_is_of_type (positional->value, type)) + return ast_type_error (ast, type, error); + + /* NOTE: if _get is called more than once then + * things get messed up with respect to floating refs. + * + * fortunately, this function should only ever get called once. + */ + g_assert (positional->value != NULL); + value = positional->value; + positional->value = NULL; + + return value; +} + +static void +positional_free (AST *ast) +{ + Positional *positional = (Positional *) ast; + + /* if positional->value is set, just leave it. + * memory management doesn't matter in case of programmer error. + */ + g_slice_free (Positional, positional); +} + +static AST * +positional_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass positional_class = { + positional_get_pattern, + positional_get_value, NULL, + positional_free + }; + Positional *positional; + const gchar *endptr; + gchar *token; + + token = token_stream_get (stream); + g_assert (token[0] == '%'); + + positional = g_slice_new (Positional); + positional->ast.class = &positional_class; + positional->value = g_variant_new_va (token + 1, &endptr, app); + + if (*endptr || positional->value == NULL) + { + token_stream_set_error (stream, error, TRUE, + "invalid GVariant format string"); + /* memory management doesn't matter in case of programmer error. */ + return NULL; + } + + token_stream_next (stream); + g_free (token); + + return (AST *) positional; +} + +typedef struct +{ + AST ast; + + GVariantType *type; + AST *child; +} TypeDecl; + +static gchar * +typedecl_get_pattern (AST *ast, + GError **error) +{ + TypeDecl *decl = (TypeDecl *) ast; + + return g_variant_type_dup_string (decl->type); +} + +static GVariant * +typedecl_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + TypeDecl *decl = (TypeDecl *) ast; + + return ast_get_value (decl->child, type, error); +} + +static void +typedecl_free (AST *ast) +{ + TypeDecl *decl = (TypeDecl *) ast; + + ast_free (decl->child); + g_variant_type_free (decl->type); + g_slice_free (TypeDecl, decl); +} + +static AST * +typedecl_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass typedecl_class = { + typedecl_get_pattern, + typedecl_get_value, NULL, + typedecl_free + }; + GVariantType *type; + TypeDecl *decl; + AST *child; + + if (token_stream_peek (stream, '@')) + { + gchar *token; + + token = token_stream_get (stream); + + if (!g_variant_type_string_is_valid (token + 1)) + { + token_stream_set_error (stream, error, TRUE, + "invalid type declaration"); + g_free (token); + + return NULL; + } + + type = g_variant_type_new (token + 1); + + if (!g_variant_type_is_definite (type)) + { + token_stream_set_error (stream, error, TRUE, + "type declarations must be definite"); + g_variant_type_free (type); + g_free (token); + + return NULL; + } + + token_stream_next (stream); + g_free (token); + } + else + { + if (token_stream_consume (stream, "boolean")) + type = g_variant_type_copy (G_VARIANT_TYPE_BOOLEAN); + + else if (token_stream_consume (stream, "byte")) + type = g_variant_type_copy (G_VARIANT_TYPE_BYTE); + + else if (token_stream_consume (stream, "int16")) + type = g_variant_type_copy (G_VARIANT_TYPE_INT16); + + else if (token_stream_consume (stream, "uint16")) + type = g_variant_type_copy (G_VARIANT_TYPE_UINT16); + + else if (token_stream_consume (stream, "int32")) + type = g_variant_type_copy (G_VARIANT_TYPE_INT32); + + else if (token_stream_consume (stream, "handle")) + type = g_variant_type_copy (G_VARIANT_TYPE_HANDLE); + + else if (token_stream_consume (stream, "uint32")) + type = g_variant_type_copy (G_VARIANT_TYPE_UINT32); + + else if (token_stream_consume (stream, "int64")) + type = g_variant_type_copy (G_VARIANT_TYPE_INT64); + + else if (token_stream_consume (stream, "uint64")) + type = g_variant_type_copy (G_VARIANT_TYPE_UINT64); + + else if (token_stream_consume (stream, "double")) + type = g_variant_type_copy (G_VARIANT_TYPE_DOUBLE); + + else if (token_stream_consume (stream, "string")) + type = g_variant_type_copy (G_VARIANT_TYPE_STRING); + + else if (token_stream_consume (stream, "objectpath")) + type = g_variant_type_copy (G_VARIANT_TYPE_OBJECT_PATH); + + else if (token_stream_consume (stream, "signature")) + type = g_variant_type_copy (G_VARIANT_TYPE_SIGNATURE); + + else + { + token_stream_set_error (stream, error, TRUE, "unknown keyword"); + return NULL; + } + } + + if ((child = parse (stream, app, error)) == NULL) + { + g_variant_type_free (type); + return NULL; + } + + decl = g_slice_new (TypeDecl); + decl->ast.class = &typedecl_class; + decl->type = type; + decl->child = child; + + return (AST *) decl; +} + +static AST * +parse (TokenStream *stream, + va_list *app, + GError **error) +{ + SourceRef source_ref; + AST *result; + + token_stream_prepare (stream); + token_stream_start_ref (stream, &source_ref); + + if (token_stream_peek (stream, '[')) + result = array_parse (stream, app, error); + + else if (token_stream_peek (stream, '(')) + result = tuple_parse (stream, app, error); + + else if (token_stream_peek (stream, '<')) + result = variant_parse (stream, app, error); + + else if (token_stream_peek (stream, '{')) + result = dictionary_parse (stream, app, error); + + else if (app && token_stream_peek (stream, '%')) + result = positional_parse (stream, app, error); + + else if (token_stream_consume (stream, "true")) + result = boolean_new (TRUE); + + else if (token_stream_consume (stream, "false")) + result = boolean_new (FALSE); + + else if (token_stream_peek (stream, 'n') || + token_stream_peek (stream, 'j')) + result = maybe_parse (stream, app, error); + + else if (token_stream_peek (stream, '@') || + token_stream_is_keyword (stream)) + result = typedecl_parse (stream, app, error); + + else if (token_stream_is_numeric (stream)) + result = number_parse (stream, app, error); + + else if (token_stream_peek (stream, '\'') || + token_stream_peek (stream, '"')) + result = string_parse (stream, app, error); + + else + { + token_stream_set_error (stream, error, FALSE, "expected value"); + return NULL; + } + + if (result != NULL) + { + token_stream_end_ref (stream, &source_ref); + result->source_ref = source_ref; + } + + return result; +} + +/** + * g_variant_parse: + * @type: a #GVariantType, or %NULL + * @text: a string containing a GVariant in text form + * @limit: a pointer to the end of @text, or %NULL + * @endptr: a location to store the end pointer, or %NULL + * @error: a pointer to a %NULL #GError pointer, or %NULL + * @Returns: a reference to a #GVariant, or %NULL + * + * Parses a #GVariant from a text representation. + * + * A single #GVariant is parsed from the content of @text. + * + * The memory at @limit will never be accessed and the parser behaves as + * if the character at @limit is the nul terminator. This has the + * effect of bounding @text. + * + * If @endptr is non-%NULL then @text is permitted to contain data + * following the value that this function parses and @endptr will be + * updated to point to the first character past the end of the text + * parsed by this function. If @endptr is %NULL and there is extra data + * then an error is returned. + * + * If @type is non-%NULL then the value will be parsed to have that + * type. This may result in additional parse errors (in the case that + * the parsed value doesn't fit the type) but may also result in fewer + * errors (in the case that the type would have been ambiguous, such as + * with empty arrays). + * + * In the event that the parsing is successful, the resulting #GVariant + * is returned. + * + * In case of any error, %NULL will be returned. If @error is non-%NULL + * then it will be set to reflect the error that occured. + * + * Officially, the language understood by the parser is "any string + * produced by g_variant_print()". + **/ +GVariant * +g_variant_parse (const GVariantType *type, + const gchar *text, + const gchar *limit, + const gchar **endptr, + GError **error) +{ + TokenStream stream = { 0, }; + GVariant *result = NULL; + AST *ast; + + g_return_val_if_fail (text != NULL, NULL); + g_return_val_if_fail (text == limit || text != NULL, NULL); + + stream.start = text; + stream.stream = text; + stream.end = limit; + + if ((ast = parse (&stream, NULL, error))) + { + if (type == NULL) + result = ast_resolve (ast, error); + else + result = ast_get_value (ast, type, error); + + if (result != NULL) + { + g_variant_ref_sink (result); + + if (endptr == NULL) + { + while (stream.stream != limit && + g_ascii_isspace (*stream.stream)) + stream.stream++; + + if (stream.stream != limit && *stream.stream != '\0') + { + SourceRef ref = { stream.stream - text, + stream.stream - text }; + + parser_set_error (error, &ref, NULL, + "expected end of input"); + g_variant_unref (result); + + result = NULL; + } + } + else + *endptr = stream.stream; + } + + ast_free (ast); + } + + return result; +} + +/** + * g_variant_new_parsed_va: + * @format: a text format #GVariant + * @app: a pointer to a #va_list + * @returns: a new, usually floating, #GVariant + * + * Parses @format and returns the result. + * + * This is the version of g_variant_new_parsed() intended to be used + * from libraries. + * + * The return value will be floating if it was a newly created GVariant + * instance. In the case that @format simply specified the collection + * of a #GVariant pointer (eg: @format was "%*") then the collected + * #GVariant pointer will be returned unmodified, without adding any + * additional references. + * + * In order to behave correctly in all cases it is necessary for the + * calling function to g_variant_ref_sink() the return result before + * returning control to the user that originally provided the pointer. + * At this point, the caller will have their own full reference to the + * result. This can also be done by adding the result to a container, + * or by passing it to another g_variant_new() call. + **/ +GVariant * +g_variant_new_parsed_va (const gchar *format, + va_list *app) +{ + TokenStream stream = { 0, }; + GVariant *result = NULL; + GError *error = NULL; + AST *ast; + + g_return_val_if_fail (format != NULL, NULL); + g_return_val_if_fail (app != NULL, NULL); + + stream.start = format; + stream.stream = format; + stream.end = NULL; + + if ((ast = parse (&stream, app, &error))) + { + result = ast_resolve (ast, &error); + ast_free (ast); + } + + if (result == NULL) + g_error ("g_variant_new_parsed: %s", error->message); + + if (*stream.stream) + g_error ("g_variant_new_parsed: trailing text after value"); + + return result; +} + +/** + * g_variant_new_parsed: + * @format: a text format #GVariant + * @...: arguments as per @format + * @returns: a new floating #GVariant instance + * + * Parses @format and returns the result. + * + * @format must be a text format #GVariant with one extention: at any + * point that a value may appear in the text, a '%' character followed + * by a GVariant format string (as per g_variant_new()) may appear. In + * that case, the same arguments are collected from the argument list as + * g_variant_new() would have collected. + * + * Consider this simple example: + * + * + * g_variant_new_parsed ("[('one', 1), ('two', %i), (%s, 3)]", 2, "three"); + * + * + * In the example, the variable argument parameters are collected and + * filled in as if they were part of the original string to produce the + * result of [('one', 1), ('two', 2), ('three', 3)]. + * + * This function is intended only to be used with @format as a string + * literal. Any parse error is fatal to the calling process. If you + * want to parse data from untrusted sources, use g_variant_parse(). + * + * You may not use this function to return, unmodified, a single + * #GVariant pointer from the argument list. ie: @format may not solely + * be anything along the lines of "%*", "%?", "%r", or anything starting + * with "%@". + **/ +GVariant * +g_variant_new_parsed (const gchar *format, + ...) +{ + GVariant *result; + va_list ap; + + va_start (ap, format); + result = g_variant_new_parsed_va (format, &ap); + va_end (ap); + + return result; +} + +#define __G_VARIANT_PARSER_C__ +#include "galiasdef.c" diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c new file mode 100644 index 0000000..b365a49 --- /dev/null +++ b/glib/gvariant-serialiser.c @@ -0,0 +1,1664 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +/* Prologue {{{1 */ +#include "config.h" + +#include "gvariant-serialiser.h" + +#include +#include +#include + +#include + +#include "galias.h" + +/* GVariantSerialiser + * + * After this prologue section, this file has roughly 2 parts. + * + * The first part is split up into sections according to various + * container types. Maybe, Array, Tuple, Variant. The Maybe and Array + * sections are subdivided for element types being fixed or + * variable-sized types. + * + * Each section documents the format of that particular type of + * container and implements 5 functions for dealing with it: + * + * n_children: + * - determines (according to serialised data) how many child values + * are inside a particular container value. + * + * get_child: + * - gets the type of and the serialised data corresponding to a + * given child value within the container value. + * + * needed_size: + * - determines how much space would be required to serialise a + * container of this type, containing the given children so that + * buffers can be preallocated before serialising. + * + * serialise: + * - write the serialised data for a container of this type, + * containing the given children, to a buffer. + * + * is_normal: + * - check the given data to ensure that it is in normal form. For a + * given set of child values, there is exactly one normal form for + * the serialised data of a container. Other forms are possible + * while maintaining the same children (for example, by inserting + * something other than zero bytes as padding) but only one form is + * the normal form. + * + * The second part contains the main entry point for each of the above 5 + * functions and logic to dispatch it to the handler for the appropriate + * container type code. + * + * The second part also contains a routine to byteswap serialised + * values. This code makes use of the n_children() and get_child() + * functions above to do its work so no extra support is needed on a + * per-container-type basis. + * + * There is also additional code for checking for normal form. All + * numeric types are always in normal form since the full range of + * values is permitted (eg: 0 to 255 is a valid byte). Special checks + * need to be performed for booleans (only 0 or 1 allowed), strings + * (properly nul-terminated) and object paths and signature strings + * (meeting the DBus specification requirements). + */ + +/* < private > + * GVariantSerialised: + * @type_info: the #GVariantTypeInfo of this value + * @data: the serialised data of this value, or %NULL + * @size: the size of this value + * + * A structure representing a GVariant in serialised form. This + * structure is used with #GVariantSerialisedFiller functions and as the + * primary interface to the serialiser. See #GVariantSerialisedFiller + * for a description of its use there. + * + * When used with the serialiser API functions, the following invariants + * apply to all #GVariantTypeSerialised structures passed to and + * returned from the serialiser. + * + * @type_info must be non-%NULL. + * + * @data must be properly aligned for the type described by @type_info. + * + * If @type_info describes a fixed-sized type then @size must always be + * equal to the fixed size of that type. + * + * For fixed-sized types (and only fixed-sized types), @data may be + * %NULL even if @size is non-zero. This happens when a framing error + * occurs while attempting to extract a fixed-sized value out of a + * variable-sized container. There is no data to return for the + * fixed-sized type, yet @size must be non-zero. The effect of this + * combination should be as if @data were a pointer to an + * appropriately-sized zero-filled region. + */ + +/* < private > + * g_variant_serialised_check: + * @serialised: a #GVariantSerialised struct + * + * Checks @serialised for validity according to the invariants described + * above. + */ +static void +g_variant_serialised_check (GVariantSerialised serialised) +{ + gsize fixed_size; + guint alignment; + + g_assert (serialised.type_info != NULL); + g_variant_type_info_query (serialised.type_info, &alignment, &fixed_size); + + if (fixed_size) + g_assert_cmpint (serialised.size, ==, fixed_size); + else + g_assert (serialised.size == 0 || serialised.data != NULL); + + g_assert_cmpint (alignment & (gsize) serialised.data, ==, 0); +} + +/* < private > + * GVariantSerialisedFiller: + * @serialised: a #GVariantSerialised instance to fill + * @data: data from the children array + * + * This function is called back from g_variant_serialiser_needed_size() + * and g_variant_serialiser_serialise(). It fills in missing details + * from a partially-complete #GVariantSerialised. + * + * The @data parameter passed back to the function is one of the items + * that was passed to the serialiser in the @children array. It + * represents a single child item of the container that is being + * serialised. The information filled in to @serialised is the + * information for this child. + * + * If the @type_info field of @serialised is %NULL then the callback + * function must set it to the type information corresponding to the + * type of the child. No reference should be added. If it is non-%NULL + * then the callback should assert that it is equal to the actual type + * of the child. + * + * If the @size field is zero then the callback must fill it in with the + * required amount of space to store the serialised form of the child. + * If it is non-zero then the callback should assert that it is equal to + * the needed size of the child. + * + * If @data is non-%NULL then it points to a space that is properly + * aligned for and large enough to store the serialised data of the + * child. The callback must store the serialised form of the child at + * @data. + * + * If the child value is another container then the callback will likely + * recurse back into the serialiser by calling + * g_variant_serialiser_needed_size() to determine @size and + * g_variant_serialiser_serialise() to write to @data. + */ + +/* PART 1: Container types {{{1 + * + * This section contains the serialiser implementation functions for + * each container type. + */ + +/* Maybe {{{2 + * + * Maybe types are handled depending on if the element type of the maybe + * type is a fixed-sized or variable-sized type. Although all maybe + * types themselves are variable-sized types, herein, a maybe value with + * a fixed-sized element type is called a "fixed-sized maybe" for + * convenience and a maybe value with a variable-sized element type is + * called a "variable-sized maybe". + */ + +/* Fixed-sized Maybe {{{3 + * + * The size of a maybe value with a fixed-sized element type is either 0 + * or equal to the fixed size of its element type. The case where the + * size of the maybe value is zero corresponds to the "Nothing" case and + * the case where the size of the maybe value is equal to the fixed size + * of the element type corresponds to the "Just" case; in that case, the + * serialised data of the child value forms the entire serialised data + * of the maybe value. + * + * In the event that a fixed-sized maybe value is presented with a size + * that is not equal to the fixed size of the element type then the + * value must be taken to be "Nothing". + */ + +static gsize +gvs_fixed_sized_maybe_n_children (GVariantSerialised value) +{ + gsize element_fixed_size; + + g_variant_type_info_query_element (value.type_info, NULL, + &element_fixed_size); + + return (element_fixed_size == value.size) ? 1 : 0; +} + +static GVariantSerialised +gvs_fixed_sized_maybe_get_child (GVariantSerialised value, + gsize index_) +{ + /* the child has the same bounds as the + * container, so just update the type. + */ + value.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_ref (value.type_info); + + return value; +} + +static gsize +gvs_fixed_sized_maybe_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + if (n_children) + { + gsize element_fixed_size; + + g_variant_type_info_query_element (type_info, NULL, + &element_fixed_size); + + return element_fixed_size; + } + else + return 0; +} + +static void +gvs_fixed_sized_maybe_serialise (GVariantSerialised value, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + if (n_children) + { + GVariantSerialised child = { NULL, value.data, value.size }; + + gvs_filler (&child, children[0]); + } +} + +static gboolean +gvs_fixed_sized_maybe_is_normal (GVariantSerialised value) +{ + if (value.size > 0) + { + gsize element_fixed_size; + + g_variant_type_info_query_element (value.type_info, + NULL, &element_fixed_size); + + if (value.size != element_fixed_size) + return FALSE; + + /* proper element size: "Just". recurse to the child. */ + value.type_info = g_variant_type_info_element (value.type_info); + + return g_variant_serialised_is_normal (value); + } + + /* size of 0: "Nothing" */ + return TRUE; +} + +/* Variable-sized Maybe + * + * The size of a maybe value with a variable-sized element type is + * either 0 or strictly greater than 0. The case where the size of the + * maybe value is zero corresponds to the "Nothing" case and the case + * where the size of the maybe value is greater than zero corresponds to + * the "Just" case; in that case, the serialised data of the child value + * forms the first part of the serialised data of the maybe value and is + * followed by a single zero byte. This zero byte is always appended, + * regardless of any zero bytes that may already be at the end of the + * serialised ata of the child value. + */ + +static gsize +gvs_variable_sized_maybe_n_children (GVariantSerialised value) +{ + return (value.size > 0) ? 1 : 0; +} + +static GVariantSerialised +gvs_variable_sized_maybe_get_child (GVariantSerialised value, + gsize index_) +{ + /* remove the padding byte and update the type. */ + value.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_ref (value.type_info); + value.size--; + + /* if it's zero-sized then it may as well be NULL */ + if (value.size == 0) + value.data = NULL; + + return value; +} + +static gsize +gvs_variable_sized_maybe_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + if (n_children) + { + GVariantSerialised child = { 0, }; + + gvs_filler (&child, children[0]); + + return child.size + 1; + } + else + return 0; +} + +static void +gvs_variable_sized_maybe_serialise (GVariantSerialised value, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + if (n_children) + { + GVariantSerialised child = { NULL, value.data, value.size - 1 }; + + /* write the data for the child. */ + gvs_filler (&child, children[0]); + value.data[child.size] = '\0'; + } +} + +static gboolean +gvs_variable_sized_maybe_is_normal (GVariantSerialised value) +{ + if (value.size == 0) + return TRUE; + + if (value.data[value.size - 1] != '\0') + return FALSE; + + value.type_info = g_variant_type_info_element (value.type_info); + value.size--; + + return g_variant_serialised_is_normal (value); +} + +/* Arrays {{{2 + * + * Just as with maybe types, array types are handled depending on if the + * element type of the array type is a fixed-sized or variable-sized + * type. Similar to maybe types, for convenience, an array value with a + * fixed-sized element type is called a "fixed-sized array" and an array + * value with a variable-sized element type is called a "variable sized + * array". + */ + +/* Fixed-sized Array {{{3 + * + * For fixed sized arrays, the serialised data is simply a concatenation + * of the serialised data of each element, in order. Since fixed-sized + * values always have a fixed size that is a multiple of their alignment + * requirement no extra padding is required. + * + * In the event that a fixed-sized array is presented with a size that + * is not an integer multiple of the element size then the value of the + * array must be taken as being empty. + */ + +static gsize +gvs_fixed_sized_array_n_children (GVariantSerialised value) +{ + gsize element_fixed_size; + + g_variant_type_info_query_element (value.type_info, NULL, + &element_fixed_size); + + if (value.size % element_fixed_size == 0) + return value.size / element_fixed_size; + + return 0; +} + +static GVariantSerialised +gvs_fixed_sized_array_get_child (GVariantSerialised value, + gsize index_) +{ + GVariantSerialised child = { 0, }; + + child.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_query (child.type_info, NULL, &child.size); + child.data = value.data + (child.size * index_); + g_variant_type_info_ref (child.type_info); + + return child; +} + +static gsize +gvs_fixed_sized_array_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + gsize element_fixed_size; + + g_variant_type_info_query_element (type_info, NULL, &element_fixed_size); + + return element_fixed_size * n_children; +} + +static void +gvs_fixed_sized_array_serialise (GVariantSerialised value, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + GVariantSerialised child = { 0, }; + gsize i; + + child.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_query (child.type_info, NULL, &child.size); + child.data = value.data; + + for (i = 0; i < n_children; i++) + { + gvs_filler (&child, children[i]); + child.data += child.size; + } +} + +static gboolean +gvs_fixed_sized_array_is_normal (GVariantSerialised value) +{ + GVariantSerialised child = { 0, }; + + child.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_query (child.type_info, NULL, &child.size); + + if (value.size % child.size != 0) + return FALSE; + + for (child.data = value.data; + child.data < value.data + value.size; + child.data += child.size) + { + if (!g_variant_serialised_is_normal (child)) + return FALSE; + } + + return TRUE; +} + +/* Variable-sized Array {{{3 + * + * Variable sized arrays, containing variable-sized elements, must be + * able to determine the boundaries between the elements. The items + * cannot simply be concatenated. Additionally, we are faced with the + * fact that non-fixed-sized values do not neccessarily have a size that + * is a multiple of their alignment requirement, so we may need to + * insert zero-filled padding. + * + * While it is possible to find the start of an item by starting from + * the end of the item before it and padding for alignment, it is not + * generally possible to do the reverse operation. For this reason, we + * record the end point of each element in the array. + * + * GVariant works in terms of "offsets". An offset is a pointer to a + * boundary between two bytes. In 4 bytes of serialised data, there + * would be 5 possible offsets: one at the start ('0'), one between each + * pair of adjacent bytes ('1', '2', '3') and one at the end ('4'). + * + * The numeric value of an offset is an unsigned integer given relative + * to the start of the serialised data of the array. Offsets are always + * stored in little endian byte order and are always only as big as they + * need to be. For example, in 255 bytes of serialised data, there are + * 256 offsets. All possibilities can be stored in an 8 bit unsigned + * integer. In 256 bytes of serialised data, however, there are 257 + * possible offsets so 16 bit integers must be used. The size of an + * offset is always a power of 2. + * + * The offsets are stored at the end of the serialised data of the + * array. They are simply concatenated on without any particular + * alignment. The size of the offsets is included in the size of the + * serialised data for purposes of determining the size of the offsets. + * This presents a possibly ambiguity; in certain cases, a particular + * value of array could have two different serialised forms. + * + * Imagine an array containing a single string of 253 bytes in length + * (so, 254 bytes including the nul terminator). Now the offset must be + * written. If an 8 bit offset is written, it will bring the size of + * the array's serialised data to 255 -- which means that the use of an + * 8 bit offset was valid. If a 16 bit offset is used then the total + * size of the array will be 256 -- which means that the use of a 16 bit + * offset was valid. Although both of these will be accepted by the + * deserialiser, only the smaller of the two is considered to be in + * normal form and that is the one that the serialiser must produce. + */ + +static inline gsize +gvs_read_unaligned_le (guchar *bytes, + guint size) +{ + union + { + guchar bytes[GLIB_SIZEOF_SIZE_T]; + gsize integer; + } tmpvalue; + + tmpvalue.integer = 0; + memcpy (&tmpvalue.bytes, bytes, size); + + return GSIZE_FROM_LE (tmpvalue.integer); +} + +static inline void +gvs_write_unaligned_le (guchar *bytes, + gsize value, + guint size) +{ + union + { + guchar bytes[GLIB_SIZEOF_SIZE_T]; + gsize integer; + } tmpvalue; + + tmpvalue.integer = GSIZE_TO_LE (value); + memcpy (bytes, &tmpvalue.bytes, size); +} + +static guint +gvs_get_offset_size (gsize size) +{ + if (size > G_MAXUINT32) + return 8; + + else if (size > G_MAXUINT16) + return 4; + + else if (size > G_MAXUINT8) + return 2; + + else if (size > 0) + return 1; + + return 0; +} + +static gsize +gvs_calculate_total_size (gsize body_size, + gsize offsets) +{ + if (body_size + 1 * offsets <= G_MAXUINT8) + return body_size + 1 * offsets; + + if (body_size + 2 * offsets <= G_MAXUINT16) + return body_size + 2 * offsets; + + if (body_size + 4 * offsets <= G_MAXUINT32) + return body_size + 4 * offsets; + + return body_size + 8 * offsets; +} + +static gsize +gvs_variable_sized_array_n_children (GVariantSerialised value) +{ + gsize offsets_array_size; + gsize offset_size; + gsize last_end; + + if (value.size == 0) + return 0; + + offset_size = gvs_get_offset_size (value.size); + + last_end = gvs_read_unaligned_le (value.data + value.size - + offset_size, offset_size); + + if (last_end > value.size) + return 0; + + offsets_array_size = value.size - last_end; + + if (offsets_array_size % offset_size) + return 0; + + return offsets_array_size / offset_size; +} + +static GVariantSerialised +gvs_variable_sized_array_get_child (GVariantSerialised value, + gsize index_) +{ + GVariantSerialised child = { 0, }; + gsize offset_size; + gsize last_end; + gsize start; + gsize end; + + child.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_ref (child.type_info); + + offset_size = gvs_get_offset_size (value.size); + + last_end = gvs_read_unaligned_le (value.data + value.size - + offset_size, offset_size); + + if (index_ > 0) + { + guint alignment; + + start = gvs_read_unaligned_le (value.data + last_end + + (offset_size * (index_ - 1)), + offset_size); + + g_variant_type_info_query (child.type_info, &alignment, NULL); + start += (-start) & alignment; + } + else + start = 0; + + end = gvs_read_unaligned_le (value.data + last_end + + (offset_size * index_), + offset_size); + + if (start < end && end <= value.size) + { + child.data = value.data + start; + child.size = end - start; + } + + return child; +} + +static gsize +gvs_variable_sized_array_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + guint alignment; + gsize offset; + gsize i; + + g_variant_type_info_query (type_info, &alignment, NULL); + offset = 0; + + for (i = 0; i < n_children; i++) + { + GVariantSerialised child = { 0, }; + + offset += (-offset) & alignment; + gvs_filler (&child, children[i]); + offset += child.size; + } + + return gvs_calculate_total_size (offset, n_children); +} + +static void +gvs_variable_sized_array_serialise (GVariantSerialised value, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + guchar *offset_ptr; + gsize offset_size; + guint alignment; + gsize offset; + gsize i; + + g_variant_type_info_query (value.type_info, &alignment, NULL); + offset_size = gvs_get_offset_size (value.size); + offset = 0; + + offset_ptr = value.data + value.size - offset_size * n_children; + + for (i = 0; i < n_children; i++) + { + GVariantSerialised child = { 0, }; + + while (offset & alignment) + value.data[offset++] = '\0'; + + child.data = value.data + offset; + gvs_filler (&child, children[i]); + offset += child.size; + + gvs_write_unaligned_le (offset_ptr, offset, offset_size); + offset_ptr += offset_size; + } +} + +static gboolean +gvs_variable_sized_array_is_normal (GVariantSerialised value) +{ + GVariantSerialised child = { 0, }; + gsize offsets_array_size; + guchar *offsets_array; + guint offset_size; + guint alignment; + gsize last_end; + gsize length; + gsize offset; + gsize i; + + if (value.size == 0) + return TRUE; + + offset_size = gvs_get_offset_size (value.size); + last_end = gvs_read_unaligned_le (value.data + value.size - + offset_size, offset_size); + + if (last_end > value.size) + return FALSE; + + offsets_array_size = value.size - last_end; + + if (offsets_array_size % offset_size) + return FALSE; + + offsets_array = value.data + value.size - offsets_array_size; + length = offsets_array_size / offset_size; + + if (length == 0) + return FALSE; + + child.type_info = g_variant_type_info_element (value.type_info); + g_variant_type_info_query (child.type_info, &alignment, NULL); + offset = 0; + + for (i = 0; i < length; i++) + { + gsize this_end; + + this_end = gvs_read_unaligned_le (offsets_array + offset_size * i, + offset_size); + + if (this_end < offset || this_end > last_end) + return FALSE; + + while (offset & alignment) + { + if (!(offset < this_end && value.data[offset] == '\0')) + return FALSE; + offset++; + } + + child.data = value.data + offset; + child.size = this_end - offset; + + if (child.size == 0) + child.data = NULL; + + if (!g_variant_serialised_is_normal (child)) + return FALSE; + + offset = this_end; + } + + g_assert (offset == last_end); + + return TRUE; +} + +/* Tuples {{{2 + * + * Since tuples can contain a mix of variable- and fixed-sized items, + * they are, in terms of serialisation, a hybrid of variable-sized and + * fixed-sized arrays. + * + * Offsets are only stored for variable-sized items. Also, since the + * number of items in a tuple is known from its type, we are able to + * know exactly how many offsets to expect in the serialised data (and + * therefore how much space is taken up by the offset array). This + * means that we know where the end of the serialised data for the last + * item is -- we can just subtract the size of the offset array from the + * total size of the tuple. For this reason, the last item in the tuple + * doesn't need an offset stored. + * + * Tuple offsets are stored in reverse. This design choice allows + * iterator-based deserialisers to be more efficient. + * + * Most of the "heavy lifting" here is handled by the GVariantTypeInfo + * for the tuple. See the notes in gvarianttypeinfo.h. + */ + +static gsize +gvs_tuple_n_children (GVariantSerialised value) +{ + return g_variant_type_info_n_members (value.type_info); +} + +static GVariantSerialised +gvs_tuple_get_child (GVariantSerialised value, + gsize index_) +{ + const GVariantMemberInfo *member_info; + GVariantSerialised child = { 0, }; + gsize offset_size; + gsize start, end; + + member_info = g_variant_type_info_member_info (value.type_info, index_); + child.type_info = g_variant_type_info_ref (member_info->type_info); + offset_size = gvs_get_offset_size (value.size); + + /* tuples are the only (potentially) fixed-sized containers, so the + * only ones that have to deal with the possibility of having %NULL + * data with a non-zero %size if errors occured elsewhere. + */ + if G_UNLIKELY (value.data == NULL && value.size != 0) + { + g_variant_type_info_query (child.type_info, NULL, &child.size); + + /* this can only happen in fixed-sized tuples, + * so the child must also be fixed sized. + */ + g_assert (child.size != 0); + child.data = NULL; + + return child; + } + + if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET) + { + if (offset_size * (member_info->i + 2) > value.size) + return child; + } + else + { + if (offset_size * (member_info->i + 1) > value.size) + { + /* if the child is fixed size, return its size. + * if child is not fixed-sized, return size = 0. + */ + g_variant_type_info_query (child.type_info, NULL, &child.size); + + return child; + } + } + + if (member_info->i + 1) + start = gvs_read_unaligned_le (value.data + value.size - + offset_size * (member_info->i + 1), + offset_size); + else + start = 0; + + start += member_info->a; + start &= member_info->b; + start |= member_info->c; + + if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_LAST) + end = value.size - offset_size * (member_info->i + 1); + + else if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_FIXED) + { + gsize fixed_size; + + g_variant_type_info_query (child.type_info, NULL, &fixed_size); + end = start + fixed_size; + child.size = fixed_size; + } + + else /* G_VARIANT_MEMEBER_ENDING_OFFSET */ + end = gvs_read_unaligned_le (value.data + value.size - + offset_size * (member_info->i + 2), + offset_size); + + if (start < end && end <= value.size) + { + child.data = value.data + start; + child.size = end - start; + } + + return child; +} + +static gsize +gvs_tuple_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + const GVariantMemberInfo *member_info = NULL; + gsize fixed_size; + gsize offset; + gsize i; + + g_variant_type_info_query (type_info, NULL, &fixed_size); + + if (fixed_size) + return fixed_size; + + offset = 0; + + for (i = 0; i < n_children; i++) + { + guint alignment; + + member_info = g_variant_type_info_member_info (type_info, i); + g_variant_type_info_query (member_info->type_info, + &alignment, &fixed_size); + offset += (-offset) & alignment; + + if (fixed_size) + offset += fixed_size; + else + { + GVariantSerialised child = { 0, }; + + gvs_filler (&child, children[i]); + offset += child.size; + } + } + + return gvs_calculate_total_size (offset, member_info->i + 1); +} + +static void +gvs_tuple_serialise (GVariantSerialised value, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + gsize offset_size; + gsize offset; + gsize i; + + offset_size = gvs_get_offset_size (value.size); + offset = 0; + + for (i = 0; i < n_children; i++) + { + const GVariantMemberInfo *member_info; + GVariantSerialised child = { 0, }; + guint alignment; + + member_info = g_variant_type_info_member_info (value.type_info, i); + g_variant_type_info_query (member_info->type_info, &alignment, NULL); + + while (offset & alignment) + value.data[offset++] = '\0'; + + child.data = value.data + offset; + gvs_filler (&child, children[i]); + offset += child.size; + + if (member_info->ending_type == G_VARIANT_MEMBER_ENDING_OFFSET) + { + value.size -= offset_size; + gvs_write_unaligned_le (value.data + value.size, + offset, offset_size); + } + } + + while (offset < value.size) + value.data[offset++] = '\0'; +} + +static gboolean +gvs_tuple_is_normal (GVariantSerialised value) +{ + guint offset_size; + gsize offset_ptr; + gsize length; + gsize offset; + gsize i; + + offset_size = gvs_get_offset_size (value.size); + length = g_variant_type_info_n_members (value.type_info); + offset_ptr = value.size; + offset = 0; + + for (i = 0; i < length; i++) + { + const GVariantMemberInfo *member_info; + GVariantSerialised child; + gsize fixed_size; + guint alignment; + gsize end; + + member_info = g_variant_type_info_member_info (value.type_info, i); + child.type_info = member_info->type_info; + + g_variant_type_info_query (child.type_info, &alignment, &fixed_size); + + while (offset & alignment) + { + if (offset > value.size || value.data[offset] != '\0') + return FALSE; + offset++; + } + + child.data = value.data + offset; + + switch (member_info->ending_type) + { + case G_VARIANT_MEMBER_ENDING_FIXED: + end = offset + fixed_size; + break; + + case G_VARIANT_MEMBER_ENDING_LAST: + end = offset_ptr; + break; + + case G_VARIANT_MEMBER_ENDING_OFFSET: + offset_ptr -= offset_size; + + if (offset_ptr < offset) + return FALSE; + + end = gvs_read_unaligned_le (value.data + offset_ptr, offset_size); + break; + + default: + g_assert_not_reached (); + } + + if (end < offset || end > offset_ptr) + return FALSE; + + child.size = end - offset; + + if (child.size == 0) + child.data = NULL; + + if (!g_variant_serialised_is_normal (child)) + return FALSE; + + offset = end; + } + + { + gsize fixed_size; + guint alignment; + + g_variant_type_info_query (value.type_info, &alignment, &fixed_size); + + if (fixed_size) + { + g_assert (fixed_size == value.size); + g_assert (offset_ptr == value.size); + + if (i == 0) + { + if (value.data[offset++] != '\0') + return FALSE; + } + else + { + while (offset & alignment) + if (value.data[offset++] != '\0') + return FALSE; + } + + g_assert (offset == value.size); + } + } + + return offset_ptr == offset; +} + +/* Variants {{{2 + * + * Variants are stored by storing the serialised data of the child, + * followed by a '\0' character, followed by the type string of the + * child. + * + * In the case that a value is presented that contains no '\0' + * character, or doesn't have a single well-formed definite type string + * following that character, the variant must be taken as containing the + * unit tuple: (). + */ + +static inline gsize +gvs_variant_n_children (GVariantSerialised value) +{ + return 1; +} + +static inline GVariantSerialised +gvs_variant_get_child (GVariantSerialised value, + gsize index_) +{ + GVariantSerialised child = { 0, }; + + /* NOTE: not O(1) and impossible for it to be... */ + if (value.size) + { + /* find '\0' character */ + for (child.size = value.size - 1; child.size; child.size--) + if (value.data[child.size] == '\0') + break; + + /* ensure we didn't just hit the start of the string */ + if (value.data[child.size] == '\0') + { + const gchar *type_string = (gchar *) &value.data[child.size + 1]; + const gchar *limit = (gchar *) &value.data[value.size]; + const gchar *end; + + if (g_variant_type_string_scan (type_string, limit, &end) && + end == limit) + { + const GVariantType *type = (GVariantType *) type_string; + + if (g_variant_type_is_definite (type)) + { + gsize fixed_size; + + child.type_info = g_variant_type_info_get (type); + + if (child.size != 0) + /* only set to non-%NULL if size > 0 */ + child.data = value.data; + + g_variant_type_info_query (child.type_info, + NULL, &fixed_size); + + if (!fixed_size || fixed_size == child.size) + return child; + + g_variant_type_info_unref (child.type_info); + } + } + } + } + + child.type_info = g_variant_type_info_get (G_VARIANT_TYPE_UNIT); + child.data = NULL; + child.size = 1; + + return child; +} + +static inline gsize +gvs_variant_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + GVariantSerialised child = { 0, }; + const gchar *type_string; + + gvs_filler (&child, children[0]); + type_string = g_variant_type_info_get_type_string (child.type_info); + + return child.size + 1 + strlen (type_string); +} + +static inline void +gvs_variant_serialise (GVariantSerialised value, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + GVariantSerialised child = { 0, }; + const gchar *type_string; + + child.data = value.data; + + gvs_filler (&child, children[0]); + type_string = g_variant_type_info_get_type_string (child.type_info); + value.data[child.size] = '\0'; + memcpy (value.data + child.size + 1, type_string, strlen (type_string)); +} + +static inline gboolean +gvs_variant_is_normal (GVariantSerialised value) +{ + GVariantSerialised child; + gboolean normal; + + child = gvs_variant_get_child (value, 0); + + normal = (child.data != NULL || child.size == 0) && + g_variant_serialised_is_normal (child); + + g_variant_type_info_unref (child.type_info); + + return normal; +} + + + +/* PART 2: Serialiser API {{{1 + * + * This is the implementation of the API of the serialiser as advertised + * in gvariant-serialiser.h. + */ + +/* Dispatch Utilities {{{2 + * + * These macros allow a given function (for example, + * g_variant_serialiser_serialise) to be dispatched to the appropriate + * type-specific function above (fixed/variable-sized maybe, + * fixed/variable-sized array, tuple or variant). + */ +#define DISPATCH_FIXED(type_info, before, after) \ + { \ + gsize fixed_size; \ + \ + g_variant_type_info_query_element (type_info, NULL, \ + &fixed_size); \ + \ + if (fixed_size) \ + { \ + before ## fixed_sized ## after \ + } \ + else \ + { \ + before ## variable_sized ## after \ + } \ + } + +#define DISPATCH_CASES(type_info, before, after) \ + switch (g_variant_type_info_get_type_char (type_info)) \ + { \ + case G_VARIANT_TYPE_INFO_CHAR_MAYBE: \ + DISPATCH_FIXED (type_info, before, _maybe ## after) \ + \ + case G_VARIANT_TYPE_INFO_CHAR_ARRAY: \ + DISPATCH_FIXED (type_info, before, _array ## after) \ + \ + case G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY: \ + case G_VARIANT_TYPE_INFO_CHAR_TUPLE: \ + { \ + before ## tuple ## after \ + } \ + \ + case G_VARIANT_TYPE_INFO_CHAR_VARIANT: \ + { \ + before ## variant ## after \ + } \ + } + +/* Serialiser entry points {{{2 + * + * These are the functions that are called in order for the serialiser + * to do its thing. + */ + +/* < private > + * g_variant_serialised_n_children: + * @serialised: a #GVariantSerialised + * @returns: the number of children + * + * For serialised data that represents a container value (maybes, + * tuples, arrays, variants), determine how many child items are inside + * that container. + */ +gsize +g_variant_serialised_n_children (GVariantSerialised serialised) +{ + g_variant_serialised_check (serialised); + + DISPATCH_CASES (serialised.type_info, + + return gvs_/**/,/**/_n_children (serialised); + + ) + g_assert_not_reached (); +} + +/* < private > + * g_variant_serialised_get_child: + * @serialised: a #GVariantSerialised + * @index_: the index of the child to fetch + * @returns: a #GVariantSerialised for the child + * + * Extracts a child from a serialised data representing a container + * value. + * + * It is an error to call this function with an index out of bounds. + * + * If the result .data == %NULL and .size > 0 then there has been an + * error extracting the requested fixed-sized value. This number of + * zero bytes needs to be allocated instead. + * + * In the case that .data == %NULL and .size == 0 then a zero-sized + * item of a variable-sized type is being returned. + * + * .data is never non-%NULL if size is 0. + */ +GVariantSerialised +g_variant_serialised_get_child (GVariantSerialised serialised, + gsize index_) +{ + GVariantSerialised child; + + g_variant_serialised_check (serialised); + + if G_LIKELY (index_ < g_variant_serialised_n_children (serialised)) + { + DISPATCH_CASES (serialised.type_info, + + child = gvs_/**/,/**/_get_child (serialised, index_); + g_assert (child.size || child.data == NULL); + g_variant_serialised_check (child); + return child; + + ) + g_assert_not_reached (); + } + + g_error ("Attempt to access item %"G_GSIZE_FORMAT + " in a container with only %"G_GSIZE_FORMAT" items", + index_, g_variant_serialised_n_children (serialised)); +} + +/* < private > + * g_variant_serialiser_serialise: + * @serialised: a #GVariantSerialised, properly set up + * @gvs_filler: the filler function + * @children: an array of child items + * @n_children: the size of @children + * + * Writes data in serialised form. + * + * The type_info field of @serialised must be filled in to type info for + * the type that we are serialising. + * + * The size field of @serialised must be filled in with the value + * returned by a previous call to g_variant_serialiser_needed_size(). + * + * The data field of @serialised must be a pointer to a properly-aligned + * memory region large enough to serialise into (ie: at least as big as + * the size field). + * + * This function is only resonsible for serialising the top-level + * container. @gvs_filler is called on each child of the container in + * order for all of the data of that child to be filled in. + */ +void +g_variant_serialiser_serialise (GVariantSerialised serialised, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + g_variant_serialised_check (serialised); + + DISPATCH_CASES (serialised.type_info, + + gvs_/**/,/**/_serialise (serialised, gvs_filler, + children, n_children); + return; + + ) + g_assert_not_reached (); +} + +/* < private > + * g_variant_serialiser_needed_size: + * @type_info: the type to serialise for + * @gvs_filler: the filler function + * @children: an array of child items + * @n_children: the size of @children + * + * Determines how much memory would be needed to serialise this value. + * + * This function is only resonsible for performing calculations for the + * top-level container. @gvs_filler is called on each child of the + * container in order to determine its size. + */ +gsize +g_variant_serialiser_needed_size (GVariantTypeInfo *type_info, + GVariantSerialisedFiller gvs_filler, + const gpointer *children, + gsize n_children) +{ + DISPATCH_CASES (type_info, + + return gvs_/**/,/**/_needed_size (type_info, gvs_filler, + children, n_children); + + ) + g_assert_not_reached (); +} + +/* Byteswapping {{{2 */ + +/* < private > + * g_variant_serialised_byteswap: + * @value: a #GVariantSerialised + * + * Byte-swap serialised data. The result of this function is only + * well-defined if the data is in normal form. + */ +void +g_variant_serialised_byteswap (GVariantSerialised serialised) +{ + gsize fixed_size; + guint alignment; + + g_variant_serialised_check (serialised); + + if (!serialised.data) + return; + + /* the types we potentially need to byteswap are + * exactly those with alignment requirements. + */ + g_variant_type_info_query (serialised.type_info, &alignment, &fixed_size); + if (!alignment) + return; + + /* if fixed size and alignment are equal then we are down + * to the base integer type and we should swap it. the + * only exception to this is if we have a tuple with a + * single item, and then swapping it will be OK anyway. + */ + if (alignment + 1 == fixed_size) + { + switch (fixed_size) + { + case 2: + { + guint16 *ptr = (guint16 *) serialised.data; + + g_assert_cmpint (serialised.size, ==, 2); + *ptr = GUINT16_SWAP_LE_BE (*ptr); + } + return; + + case 4: + { + guint32 *ptr = (guint32 *) serialised.data; + + g_assert_cmpint (serialised.size, ==, 4); + *ptr = GUINT32_SWAP_LE_BE (*ptr); + } + return; + + case 8: + { + guint64 *ptr = (guint64 *) serialised.data; + + g_assert_cmpint (serialised.size, ==, 8); + *ptr = GUINT64_SWAP_LE_BE (*ptr); + } + return; + + default: + g_assert_not_reached (); + } + } + + /* else, we have a container that potentially contains + * some children that need to be byteswapped. + */ + else + { + gsize children, i; + + children = g_variant_serialised_n_children (serialised); + for (i = 0; i < children; i++) + { + GVariantSerialised child; + + child = g_variant_serialised_get_child (serialised, i); + g_variant_serialised_byteswap (child); + g_variant_type_info_unref (child.type_info); + } + } +} + +/* Normal form checking {{{2 */ + +/* < private > + * g_variant_serialised_is_normal: + * @serialised: a #GVariantSerialised + * + * Determines, recursively if @serialised is in normal form. There is + * precisely one normal form of serialised data for each possible value. + * + * It is possible that multiple byte sequences form the serialised data + * for a given value if, for example, the padding bytes are filled in + * with something other than zeros, but only one form is the normal + * form. + */ +gboolean +g_variant_serialised_is_normal (GVariantSerialised serialised) +{ + DISPATCH_CASES (serialised.type_info, + + return gvs_/**/,/**/_is_normal (serialised); + + ) + + /* some hard-coded terminal cases */ + switch (g_variant_type_info_get_type_char (serialised.type_info)) + { + case 'b': /* boolean */ + return serialised.data[0] < 2; + + case 's': /* string */ + return g_variant_serialiser_is_string (serialised.data, + serialised.size); + + case 'o': + return g_variant_serialiser_is_object_path (serialised.data, + serialised.size); + + case 'g': + return g_variant_serialiser_is_signature (serialised.data, + serialised.size); + + default: + /* all of the other types are fixed-sized numerical types for + * which all possible values are valid (including various NaN + * representations for floating point values). + */ + return TRUE; + } +} + +/* Validity-checking functions {{{2 + * + * Checks if strings, object paths and signature strings are valid. + */ + +/* < private > + * g_variant_serialiser_is_string: + * @data: a possible string + * @size: the size of @data + * + * Ensures that @data is a valid string with a nul terminator at the end + * and no nul bytes embedded. + */ +gboolean +g_variant_serialiser_is_string (gconstpointer data, + gsize size) +{ + const gchar *string = data; + + if (size == 0) + return FALSE; + + if (string[size - 1] != '\0') + return FALSE; + + return strlen (string) == size - 1; +} + +/* < private > + * g_variant_serialiser_is_object_path: + * @data: a possible DBus object path + * @size: the size of @data + * + * Performs the checks for being a valid string. + * + * Also, ensures that @data is a valid DBus object path, as per the DBus + * specification. + */ +gboolean +g_variant_serialiser_is_object_path (gconstpointer data, + gsize size) +{ + const gchar *string = data; + gsize i; + + if (!g_variant_serialiser_is_string (data, size)) + return FALSE; + + /* The path must begin with an ASCII '/' (integer 47) character */ + if (string[0] != '/') + return FALSE; + + for (i = 1; string[i]; i++) + /* Each element must only contain the ASCII characters + * "[A-Z][a-z][0-9]_" + */ + if (g_ascii_isalnum (string[i]) || string[i] == '_') + ; + + /* must consist of elements separated by slash characters. */ + else if (string[i] == '/') + { + /* No element may be the empty string. */ + /* Multiple '/' characters cannot occur in sequence. */ + if (string[i - 1] == '/') + return FALSE; + } + + else + return FALSE; + + /* A trailing '/' character is not allowed unless the path is the + * root path (a single '/' character). + */ + if (i > 1 && string[i - 1] == '/') + return FALSE; + + return TRUE; +} + +/* < private > + * g_variant_serialiser_is_signature: + * @data: a possible DBus signature + * @size: the size of @data + * + * Performs the checks for being a valid string. + * + * Also, ensures that @data is a valid DBus type signature, as per the + * DBus specification. + */ +gboolean +g_variant_serialiser_is_signature (gconstpointer data, + gsize size) +{ + const gchar *string = data; + gsize first_invalid; + + if (!g_variant_serialiser_is_string (data, size)) + return FALSE; + + /* make sure no non-definite characters appear */ + first_invalid = strspn (string, "ybnqiuxthdvasog(){}"); + if (string[first_invalid]) + return FALSE; + + /* make sure each type string is well-formed */ + while (*string) + if (!g_variant_type_string_scan (string, NULL, &string)) + return FALSE; + + return TRUE; +} + +/* Epilogue {{{1 */ +#define __G_VARIANT_SERIALISER_C__ +#include "galiasdef.c" + +/* vim:set foldmethod=marker: */ diff --git a/glib/gvariant-serialiser.h b/glib/gvariant-serialiser.h new file mode 100644 index 0000000..f26b118 --- /dev/null +++ b/glib/gvariant-serialiser.h @@ -0,0 +1,66 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#ifndef __G_VARIANT_SERIALISER_H__ +#define __G_VARIANT_SERIALISER_H__ + +#include "gvarianttypeinfo.h" + +typedef struct +{ + GVariantTypeInfo *type_info; + guchar *data; + gsize size; +} GVariantSerialised; + +/* deserialisation */ +gsize g_variant_serialised_n_children (GVariantSerialised container); +GVariantSerialised g_variant_serialised_get_child (GVariantSerialised container, + gsize index); + +/* serialisation */ +typedef void (*GVariantSerialisedFiller) (GVariantSerialised *serialised, + gpointer data); + +gsize g_variant_serialiser_needed_size (GVariantTypeInfo *info, + GVariantSerialisedFiller gsv_filler, + const gpointer *children, + gsize n_children); + +void g_variant_serialiser_serialise (GVariantSerialised container, + GVariantSerialisedFiller gsv_filler, + const gpointer *children, + gsize n_children); + +/* misc */ +gboolean g_variant_serialised_is_normal (GVariantSerialised value); +void g_variant_serialised_byteswap (GVariantSerialised value); + +/* validation of strings */ +gboolean g_variant_serialiser_is_string (gconstpointer data, + gsize size); +gboolean g_variant_serialiser_is_object_path (gconstpointer data, + gsize size); +gboolean g_variant_serialiser_is_signature (gconstpointer data, + gsize size); + +#endif /* __G_VARIANT_SERIALISER_H__ */ diff --git a/glib/gvariant.c b/glib/gvariant.c new file mode 100644 index 0000000..721740f --- /dev/null +++ b/glib/gvariant.c @@ -0,0 +1,4147 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +/* Prologue {{{1 */ + +#include "config.h" + +#include +#include "gvariant-internal.h" +#include +#include +#include +#include +#include + +#include + +#include "galias.h" + +/** + * SECTION: gvariant + * @title: GVariant + * @short_description: strongly typed value datatype + * @see_also: GVariantType + * + * #GVariant is a variant datatype; it stores a value along with + * information about the type of that value. The range of possible + * values is determined by the type. The type system used by #GVariant + * is #GVariantType. + * + * #GVariant instances always have a type and a value (which are given + * at construction time). The type and value of a #GVariant instance + * can never change other than by the #GVariant itself being + * destroyed. A #GVariant can not contain a pointer. + * + * #GVariant is reference counted using g_variant_ref() and + * g_variant_unref(). #GVariant also has floating reference counts -- + * see g_variant_ref_sink(). + * + * #GVariant is completely threadsafe. A #GVariant instance can be + * concurrently accessed in any way from any number of threads without + * problems. + * + * #GVariant is heavily optimised for dealing with data in serialised + * form. It works particularly well with data located in memory-mapped + * files. It can perform nearly all deserialisation operations in a + * small constant time, usually touching only a single memory page. + * Serialised #GVariant data can also be sent over the network. + * + * #GVariant is largely compatible with DBus. Almost all types of + * #GVariant instances can be sent over DBus. See #GVariantType for + * exceptions. + * + * For convenience to C programmers, #GVariant features powerful + * varargs-based value construction and destruction. This feature is + * designed to be embedded in other libraries. + * + * There is a Python-inspired text language for describing #GVariant + * values. #GVariant includes a printer for this language and a parser + * with type inferencing. + * + * + * Memory Use + * + * #GVariant tries to be quite efficient with respect to memory use. + * This section gives a rough idea of how much memory is used by the + * current implementation. The information here is subject to change + * in the future. + * + * + * The memory allocated by #GVariant can be grouped into 4 broad + * purposes: memory for serialised data, memory for the type + * information cache, buffer management memory and memory for the + * #GVariant structure itself. + * + * + * Serialised Data Memory + * + * This is the memory that is used for storing GVariant data in + * serialised form. This is what would be sent over the network or + * what would end up on disk. + * + * + * The amount of memory required to store a boolean is 1 byte. 16, + * 32 and 64 bit integers and double precision floating point numbers + * use their "natural" size. Strings (including object path and + * signature strings) are stored with a nul terminator, and as such + * use the length of the string plus 1 byte. + * + * + * Maybe types use no space at all to represent the null value and + * use the same amount of space (sometimes plus one byte) as the + * equivalent non-maybe-typed value to represent the non-null case. + * + * + * Arrays use the amount of space required to store each of their + * members, concatenated. Additionally, if the items stored in an + * array are not of a fixed-size (ie: strings, other arrays, etc) + * then an additional framing offset is stored for each item. The + * size of this offset is either 1, 2 or 4 bytes depending on the + * overall size of the container. Additionally, extra padding bytes + * are added as required for alignment of child values. + * + * + * Tuples (including dictionary entries) use the amount of space + * required to store each of their members, concatenated, plus one + * framing offset (as per arrays) for each non-fixed-sized item in + * the tuple, except for the last one. Additionally, extra padding + * bytes are added as required for alignment of child values. + * + * + * Variants use the same amount of space as the item inside of the + * variant, plus 1 byte, plus the length of the type string for the + * item inside the variant. + * + * + * As an example, consider a dictionary mapping strings to variants. + * In the case that the dictionary is empty, 0 bytes are required for + * the serialisation. + * + * + * If we add an item "width" that maps to the int32 value of 500 then + * we will use 4 byte to store the int32 (so 6 for the variant + * containing it) and 6 bytes for the string. The variant must be + * aligned to 8 after the 6 bytes of the string, so that's 2 extra + * bytes. 6 (string) + 2 (padding) + 6 (variant) is 14 bytes used + * for the dictionary entry. An additional 1 byte is added to the + * array as a framing offset making a total of 15 bytes. + * + * + * If we add another entry, "title" that maps to a nullable string + * that happens to have a value of null, then we use 0 bytes for the + * null value (and 3 bytes for the variant to contain it along with + * its type string) plus 6 bytes for the string. Again, we need 2 + * padding bytes. That makes a total of 6 + 2 + 3 = 11 bytes. + * + * + * We now require extra padding between the two items in the array. + * After the 14 bytes of the first item, that's 2 bytes required. We + * now require 2 framing offsets for an extra two bytes. 14 + 2 + 11 + * + 2 = 29 bytes to encode the entire two-item dictionary. + * + * + * + * Type Information Cache + * + * For each GVariant type that currently exists in the program a type + * information structure is kept in the type information cache. The + * type information structure is required for rapid deserialisation. + * + * + * Continuing with the above example, if a #GVariant exists with the + * type "a{sv}" then a type information struct will exist for + * "a{sv}", "{sv}", "s", and "v". Multiple uses of the same type + * will share the same type information. Additionally, all + * single-digit types are stored in read-only static memory and do + * not contribute to the writable memory footprint of a program using + * #GVariant. + * + * + * Aside from the type information structures stored in read-only + * memory, there are two forms of type information. One is used for + * container types where there is a single element type: arrays and + * maybe types. The other is used for container types where there + * are multiple element types: tuples and dictionary entries. + * + * + * Array type info structures are 6 * sizeof (void *), plus the + * memory required to store the type string itself. This means that + * on 32bit systems, the cache entry for "a{sv}" would require 30 + * bytes of memory (plus malloc overhead). + * + * + * Tuple type info structures are 6 * sizeof (void *), plus 4 * + * sizeof (void *) for each item in the tuple, plus the memory + * required to store the type string itself. A 2-item tuple, for + * example, would have a type information structure that consumed + * writable memory in the size of 14 * sizeof (void *) (plus type + * string) This means that on 32bit systems, the cache entry for + * "{sv}" would require 61 bytes of memory (plus malloc overhead). + * + * + * This means that in total, for our "a{sv}" example, 91 bytes of + * type information would be allocated. + * + * + * The type information cache, additionally, uses a #GHashTable to + * store and lookup the cached items and stores a pointer to this + * hash table in static storage. The hash table is freed when there + * are zero items in the type cache. + * + * + * Although these sizes may seem large it is important to remember + * that a program will probably only have a very small number of + * different types of values in it and that only one type information + * structure is required for many different values of the same type. + * + * + * + * Buffer Management Memory + * + * #GVariant uses an internal buffer management structure to deal + * with the various different possible sources of serialised data + * that it uses. The buffer is responsible for ensuring that the + * correct call is made when the data is no longer in use by + * #GVariant. This may involve a g_free() or a g_slice_free() or + * even g_mapped_file_unref(). + * + * + * One buffer management structure is used for each chunk of + * serialised data. The size of the buffer management structure is 4 + * * (void *). On 32bit systems, that's 16 bytes. + * + * + * + * GVariant structure + * + * The size of a #GVariant structure is 6 * (void *). On 32 bit + * systems, that's 24 bytes. + * + * + * #GVariant structures only exist if they are explicitly created + * with API calls. For example, if a #GVariant is constructed out of + * serialised data for the example given above (with the dictionary) + * then although there are 9 individual values that comprise the + * entire dictionary (two keys, two values, two variants containing + * the values, two dictionary entries, plus the dictionary itself), + * only 1 #GVariant instance exists -- the one refering to the + * dictionary. + * + * + * If calls are made to start accessing the other values then + * #GVariant instances will exist for those values only for as long + * as they are in use (ie: until you call g_variant_unref()). The + * type information is shared. The serialised data and the buffer + * management structure for that serialised data is shared by the + * child. + * + * + * + * Summary + * + * To put the entire example together, for our dictionary mapping + * strings to variants (with two entries, as given above), we are + * using 91 bytes of memory for type information, 29 byes of memory + * for the serialised data, 16 bytes for buffer management and 24 + * bytes for the #GVariant instance, or a total of 160 bytes, plus + * malloc overhead. If we were to use g_variant_get_child_value() to + * access the two dictionary entries, we would use an additional 48 + * bytes. If we were to have other dictionaries of the same type, we + * would use more memory for the serialised data and buffer + * management for those dictionaries, but the type information would + * be shared. + * + * + * + */ + +/* definition of GVariant structure is in gvariant-core.c */ + +/* this is a g_return_val_if_fail() for making + * sure a (GVariant *) has the required type. + */ +#define TYPE_CHECK(value, TYPE, val) \ + if G_UNLIKELY (!g_variant_is_of_type (value, TYPE)) { \ + g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, \ + "g_variant_is_of_type (" #value \ + ", " #TYPE ")"); \ + return val; \ + } + +/* Numeric Type Constructor/Getters {{{1 */ +/* < private > + * g_variant_new_from_trusted: + * @type: the #GVariantType + * @data: the data to use + * @size: the size of @data + * @returns: a new floating #GVariant + * + * Constructs a new trusted #GVariant instance from the provided data. + * This is used to implement g_variant_new_* for all the basic types. + */ +static GVariant * +g_variant_new_from_trusted (const GVariantType *type, + gconstpointer data, + gsize size) +{ + GVariant *value; + GBuffer *buffer; + + buffer = g_buffer_new_from_data (data, size); + value = g_variant_new_from_buffer (type, buffer, TRUE); + g_buffer_unref (buffer); + + return value; +} + +/** + * g_variant_new_boolean: + * @boolean: a #gboolean value + * @returns: a new boolean #GVariant instance + * + * Creates a new boolean #GVariant instance -- either %TRUE or %FALSE. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_boolean (gboolean value) +{ + guchar v = value; + + return g_variant_new_from_trusted (G_VARIANT_TYPE_BOOLEAN, &v, 1); +} + +/** + * g_variant_get_boolean: + * @value: a boolean #GVariant instance + * @returns: %TRUE or %FALSE + * + * Returns the boolean value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_BOOLEAN. + * + * Since: 2.24 + **/ +gboolean +g_variant_get_boolean (GVariant *value) +{ + const guchar *data; + + TYPE_CHECK (value, G_VARIANT_TYPE_BOOLEAN, FALSE); + + data = g_variant_get_data (value); + + return data != NULL ? *data != 0 : FALSE; +} + +/* the constructors and accessors for byte, int{16,32,64}, handles and + * doubles all look pretty much exactly the same, so we reduce + * copy/pasting here. + */ +#define NUMERIC_TYPE(TYPE, type, ctype) \ + GVariant *g_variant_new_##type (ctype value) { \ + return g_variant_new_from_trusted (G_VARIANT_TYPE_##TYPE, \ + &value, sizeof value); \ + } \ + ctype g_variant_get_##type (GVariant *value) { \ + const ctype *data; \ + TYPE_CHECK (value, G_VARIANT_TYPE_ ## TYPE, 0); \ + data = g_variant_get_data (value); \ + return data != NULL ? *data : 0; \ + } + + +/** + * g_variant_new_byte: + * @byte: a #guint8 value + * @returns: a new byte #GVariant instance + * + * Creates a new byte #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_byte: + * @value: a byte #GVariant instance + * @returns: a #guchar + * + * Returns the byte value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_BYTE. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (BYTE, byte, guchar) + +/** + * g_variant_new_int16: + * @int16: a #gint16 value + * @returns: a new int16 #GVariant instance + * + * Creates a new int16 #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_int16: + * @value: a int16 #GVariant instance + * @returns: a #gint16 + * + * Returns the 16-bit signed integer value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_INT16. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (INT16, int16, gint16) + +/** + * g_variant_new_uint16: + * @uint16: a #guint16 value + * @returns: a new uint16 #GVariant instance + * + * Creates a new uint16 #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_uint16: + * @value: a uint16 #GVariant instance + * @returns: a #guint16 + * + * Returns the 16-bit unsigned integer value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_UINT16. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (UINT16, uint16, guint16) + +/** + * g_variant_new_int32: + * @int32: a #gint32 value + * @returns: a new int32 #GVariant instance + * + * Creates a new int32 #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_int32: + * @value: a int32 #GVariant instance + * @returns: a #gint32 + * + * Returns the 32-bit signed integer value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_INT32. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (INT32, int32, gint32) + +/** + * g_variant_new_uint32: + * @uint32: a #guint32 value + * @returns: a new uint32 #GVariant instance + * + * Creates a new uint32 #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_uint32: + * @value: a uint32 #GVariant instance + * @returns: a #guint32 + * + * Returns the 32-bit unsigned integer value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_UINT32. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (UINT32, uint32, guint32) + +/** + * g_variant_new_int64: + * @int64: a #gint64 value + * @returns: a new int64 #GVariant instance + * + * Creates a new int64 #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_int64: + * @value: a int64 #GVariant instance + * @returns: a #gint64 + * + * Returns the 64-bit signed integer value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_INT64. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (INT64, int64, gint64) + +/** + * g_variant_new_uint64: + * @uint64: a #guint64 value + * @returns: a new uint64 #GVariant instance + * + * Creates a new uint64 #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_uint64: + * @value: a uint64 #GVariant instance + * @returns: a #guint64 + * + * Returns the 64-bit unsigned integer value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_UINT64. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (UINT64, uint64, guint64) + +/** + * g_variant_new_handle: + * @handle: a #gint32 value + * @returns: a new handle #GVariant instance + * + * Creates a new handle #GVariant instance. + * + * By convention, handles are indexes into an array of file descriptors + * that are sent alongside a DBus message. If you're not interacting + * with DBus, you probably don't need them. + * + * Since: 2.24 + **/ +/** + * g_variant_get_handle: + * @value: a handle #GVariant instance + * @returns: a #gint32 + * + * Returns the 32-bit signed integer value of @value. + * + * It is an error to call this function with a @value of any type other + * than %G_VARIANT_TYPE_HANDLE. + * + * By convention, handles are indexes into an array of file descriptors + * that are sent alongside a DBus message. If you're not interacting + * with DBus, you probably don't need them. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (HANDLE, handle, gint32) + +/** + * g_variant_new_double: + * @floating: a #gdouble floating point value + * @returns: a new double #GVariant instance + * + * Creates a new double #GVariant instance. + * + * Since: 2.24 + **/ +/** + * g_variant_get_double: + * @value: a double #GVariant instance + * @returns: a #gdouble + * + * Returns the double precision floating point value of @value. + * + * It is an error to call this function with a @value of any type + * other than %G_VARIANT_TYPE_DOUBLE. + * + * Since: 2.24 + **/ +NUMERIC_TYPE (DOUBLE, double, gdouble) + +/* Container type Constructor / Deconstructors {{{1 */ +/** + * g_variant_new_maybe: + * @child_type: the #GVariantType of the child + * @child: the child value, or %NULL + * @returns: a new #GVariant maybe instance + * + * Depending on if @value is %NULL, either wraps @value inside of a + * maybe container or creates a Nothing instance for the given @type. + * + * At least one of @type and @value must be non-%NULL. If @type is + * non-%NULL then it must be a definite type. If they are both + * non-%NULL then @type must be the type of @value. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_maybe (const GVariantType *child_type, + GVariant *child) +{ + GVariantType *maybe_type; + GVariant *value; + + g_return_val_if_fail (child_type == NULL || g_variant_type_is_definite + (child_type), 0); + g_return_val_if_fail (child_type != NULL || child != NULL, NULL); + g_return_val_if_fail (child_type == NULL || child == NULL || + g_variant_is_of_type (child, child_type), + NULL); + + if (child_type == NULL) + child_type = g_variant_get_type (child); + + maybe_type = g_variant_type_new_maybe (child_type); + + if (child != NULL) + { + GVariant **children; + gboolean trusted; + + children = g_new (GVariant *, 1); + children[0] = g_variant_ref_sink (child); + trusted = g_variant_is_trusted (children[0]); + + value = g_variant_new_from_children (maybe_type, children, 1, trusted); + } + else + value = g_variant_new_from_children (maybe_type, NULL, 0, TRUE); + + g_variant_type_free (maybe_type); + + return value; +} + +/** + * g_variant_get_maybe: + * @value: a maybe-typed value + * @returns: the contents of @value, or %NULL + * + * Given a maybe-typed #GVariant instance, extract its value. If the + * value is Nothing, then this function returns %NULL. + * + * Since: 2.24 + **/ +GVariant * +g_variant_get_maybe (GVariant *value) +{ + TYPE_CHECK (value, G_VARIANT_TYPE_MAYBE, NULL); + + if (g_variant_n_children (value)) + return g_variant_get_child_value (value, 0); + + return NULL; +} + +/** + * g_variant_new_variant: + * @value: a #GVariance instance + * @returns: a new variant #GVariant instance + * + * Boxes @value. The result is a #GVariant instance representing a + * variant containing the original value. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_variant (GVariant *value) +{ + g_return_val_if_fail (value != NULL, NULL); + + g_variant_ref_sink (value); + + return g_variant_new_from_children (G_VARIANT_TYPE_VARIANT, + g_memdup (&value, sizeof value), + 1, g_variant_is_trusted (value)); +} + +/** + * g_variant_get_variant: + * @value: a variant #GVariance instance + * @returns: the item contained in the variant + * + * Unboxes @value. The result is the #GVariant instance that was + * contained in @value. + * + * Since: 2.24 + **/ +GVariant * +g_variant_get_variant (GVariant *value) +{ + TYPE_CHECK (value, G_VARIANT_TYPE_VARIANT, NULL); + + return g_variant_get_child_value (value, 0); +} + +/** + * g_variant_new_array: + * @child_type: the element type of the new array + * @children: an array of #GVariant pointers, the children + * @n_children: the length of @children + * @returns: a new #GVariant array + * + * Creates a new #GVariant array from @children. + * + * @child_type must be non-%NULL if @n_children is zero. Otherwise, the + * child type is determined by inspecting the first element of the + * @children array. If @child_type is non-%NULL then it must be a + * definite type. + * + * The items of the array are taken from the @children array. No entry + * in the @children array may be %NULL. + * + * All items in the array must have the same type, which must be the + * same as @child_type, if given. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_array (const GVariantType *child_type, + GVariant * const *children, + gsize n_children) +{ + GVariantType *array_type; + GVariant **my_children; + gboolean trusted; + GVariant *value; + gsize i; + + g_return_val_if_fail (n_children > 0 || child_type != NULL, NULL); + g_return_val_if_fail (n_children == 0 || children != NULL, NULL); + g_return_val_if_fail (child_type == NULL || + g_variant_type_is_definite (child_type), NULL); + + my_children = g_new (GVariant *, n_children); + trusted = TRUE; + + if (child_type == NULL) + child_type = g_variant_get_type (children[0]); + array_type = g_variant_type_new_array (child_type); + + for (i = 0; i < n_children; i++) + { + TYPE_CHECK (children[i], child_type, NULL); + my_children[i] = g_variant_ref_sink (children[i]); + trusted &= g_variant_is_trusted (children[i]); + } + + value = g_variant_new_from_children (array_type, my_children, + n_children, trusted); + g_variant_type_free (array_type); + + return value; +} + +/*< private > + * g_variant_make_tuple_type: + * @children: an array of GVariant * + * @n_children: the length of @children + * + * Return the type of a tuple containing @children as its items. + **/ +static GVariantType * +g_variant_make_tuple_type (GVariant * const *children, + gsize n_children) +{ + const GVariantType **types; + GVariantType *type; + gsize i; + + types = g_new (const GVariantType *, n_children); + + for (i = 0; i < n_children; i++) + types[i] = g_variant_get_type (children[i]); + + type = g_variant_type_new_tuple (types, n_children); + g_free (types); + + return type; +} + +/** + * g_variant_new_tuple: + * @children: the items to make the tuple out of + * @n_children: the length of @children + * @returns: a new #GVariant tuple + * + * Creates a new tuple #GVariant out of the items in @children. The + * type is determined from the types of @children. No entry in the + * @children array may be %NULL. + * + * If @n_children is 0 then the unit tuple is constructed. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_tuple (GVariant * const *children, + gsize n_children) +{ + GVariantType *tuple_type; + GVariant **my_children; + gboolean trusted; + GVariant *value; + gsize i; + + g_return_val_if_fail (n_children == 0 || children != NULL, NULL); + + my_children = g_new (GVariant *, n_children); + trusted = TRUE; + + for (i = 0; i < n_children; i++) + { + my_children[i] = g_variant_ref_sink (children[i]); + trusted &= g_variant_is_trusted (children[i]); + } + + tuple_type = g_variant_make_tuple_type (children, n_children); + value = g_variant_new_from_children (tuple_type, my_children, + n_children, trusted); + g_variant_type_free (tuple_type); + + return value; +} + +/*< private > + * g_variant_make_dict_entry_type: + * @key: a #GVariant, the key + * @val: a #GVariant, the value + * + * Return the type of a dictionary entry containing @key and @val as its + * children. + **/ +static GVariantType * +g_variant_make_dict_entry_type (GVariant *key, + GVariant *val) +{ + return g_variant_type_new_dict_entry (g_variant_get_type (key), + g_variant_get_type (val)); +} + +/** + * g_variant_new_dict_entry: + * @key: a basic #GVariant, the key + * @value: a #GVariant, the value + * @returns: a new dictionary entry #GVariant + * + * Creates a new dictionary entry #GVariant. @key and @value must be + * non-%NULL. + * + * @key must be a value of a basic type (ie: not a container). + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_dict_entry (GVariant *key, + GVariant *value) +{ + GVariantType *dict_type; + GVariant **children; + gboolean trusted; + + g_return_val_if_fail (key != NULL && value != NULL, NULL); + g_return_val_if_fail (!g_variant_is_container (key), NULL); + + children = g_new (GVariant *, 2); + children[0] = g_variant_ref_sink (key); + children[1] = g_variant_ref_sink (value); + trusted = g_variant_is_trusted (key) && g_variant_is_trusted (value); + + dict_type = g_variant_make_dict_entry_type (key, value); + value = g_variant_new_from_children (dict_type, children, 2, trusted); + g_variant_type_free (dict_type); + + return value; +} + +/** + * g_variant_get_fixed_array: + * @value: a #GVariant array with fixed-sized elements + * @n_elements: a pointer to the location to store the number of items + * @element_size: the size of each element + * @returns: a pointer to the fixed array + * + * Provides access to the serialised data for an array of fixed-sized + * items. + * + * @value must be an array with fixed-sized elements. Numeric types are + * fixed-size as are tuples containing only other fixed-sized types. + * + * @element_size must be the size of a single element in the array. For + * example, if calling this function for an array of 32 bit integers, + * you might say sizeof (gint32). This value isn't used + * except for the purpose of a double-check that the form of the + * seralised data matches the caller's expectation. + * + * @n_elements, which must be non-%NULL is set equal to the number of + * items in the array. + * + * Since: 2.24 + **/ +gconstpointer +g_variant_get_fixed_array (GVariant *value, + gsize *n_elements, + gsize element_size) +{ + GVariantTypeInfo *array_info; + gsize array_element_size; + gconstpointer data; + gsize size; + + TYPE_CHECK (value, G_VARIANT_TYPE_ARRAY, NULL); + + g_return_val_if_fail (n_elements != NULL, NULL); + g_return_val_if_fail (element_size > 0, NULL); + + array_info = g_variant_get_type_info (value); + g_variant_type_info_query_element (array_info, NULL, &array_element_size); + + g_return_val_if_fail (array_element_size, NULL); + + if G_UNLIKELY (array_element_size != element_size) + { + if (array_element_size) + g_critical ("g_variant_get_fixed_array: assertion " + "`g_variant_array_has_fixed_size (value, element_size)' " + "failed: array size %"G_GSIZE_FORMAT" does not match " + "given element_size %"G_GSIZE_FORMAT".", + array_element_size, element_size); + else + g_critical ("g_variant_get_fixed_array: assertion " + "`g_variant_array_has_fixed_size (value, element_size)' " + "failed: array does not have fixed size."); + } + + data = g_variant_get_data (value); + size = g_variant_get_size (value); + + if (size % element_size) + *n_elements = 0; + else + *n_elements = size / element_size; + + if (*n_elements) + return data; + + return NULL; +} + +/* String type constructor/getters/validation {{{1 */ +/** + * g_variant_new_string: + * @string: a normal C nul-terminated string + * @returns: a new string #GVariant instance + * + * Creates a string #GVariant with the contents of @string. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_string (const gchar *string) +{ + g_return_val_if_fail (string != NULL, NULL); + + return g_variant_new_from_trusted (G_VARIANT_TYPE_STRING, + string, strlen (string) + 1); +} + +/** + * g_variant_new_object_path: + * @object_path: a normal C nul-terminated string + * @returns: a new object path #GVariant instance + * + * Creates a DBus object path #GVariant with the contents of @string. + * @string must be a valid DBus object path. Use + * g_variant_is_object_path() if you're not sure. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_object_path (const gchar *object_path) +{ + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + + return g_variant_new_from_trusted (G_VARIANT_TYPE_OBJECT_PATH, + object_path, strlen (object_path) + 1); +} + +/** + * g_variant_is_object_path: + * @string: a normal C nul-terminated string + * @returns: %TRUE if @string is a DBus object path + * + * Determines if a given string is a valid DBus object path. You + * should ensure that a string is a valid DBus object path before + * passing it to g_variant_new_object_path(). + * + * A valid object path starts with '/' followed by zero or more + * sequences of characters separated by '/' characters. Each sequence + * must contain only the characters "[A-Z][a-z][0-9]_". No sequence + * (including the one following the final '/' character) may be empty. + * + * Since: 2.24 + **/ +gboolean +g_variant_is_object_path (const gchar *string) +{ + g_return_val_if_fail (string != NULL, FALSE); + + return g_variant_serialiser_is_object_path (string, strlen (string) + 1); +} + +/** + * g_variant_new_signature: + * @signature: a normal C nul-terminated string + * @returns: a new signature #GVariant instance + * + * Creates a DBus type signature #GVariant with the contents of + * @string. @string must be a valid DBus type signature. Use + * g_variant_is_signature() if you're not sure. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_signature (const gchar *signature) +{ + g_return_val_if_fail (g_variant_is_signature (signature), NULL); + + return g_variant_new_from_trusted (G_VARIANT_TYPE_SIGNATURE, + signature, strlen (signature) + 1); +} + +/** + * g_variant_is_signature: + * @string: a normal C nul-terminated string + * @returns: %TRUE if @string is a DBus type signature + * + * Determines if a given string is a valid DBus type signature. You + * should ensure that a string is a valid DBus object path before + * passing it to g_variant_new_signature(). + * + * DBus type signatures consist of zero or more definite #GVariantType + * strings in sequence. + * + * Since: 2.24 + **/ +gboolean +g_variant_is_signature (const gchar *string) +{ + g_return_val_if_fail (string != NULL, FALSE); + + return g_variant_serialiser_is_signature (string, strlen (string) + 1); +} + +/** + * g_variant_get_string: + * @value: a string #GVariant instance + * @length: a pointer to a #gsize, to store the length + * @returns: the constant string + * + * Returns the string value of a #GVariant instance with a string + * type. This includes the types %G_VARIANT_TYPE_STRING, + * %G_VARIANT_TYPE_OBJECT_PATH and %G_VARIANT_TYPE_SIGNATURE. + * + * If @length is non-%NULL then the length of the string (in bytes) is + * returned there. For trusted values, this information is already + * known. For untrusted values, a strlen() will be performed. + * + * It is an error to call this function with a @value of any type + * other than those three. + * + * The return value remains valid as long as @value exists. + * + * Since: 2.24 + **/ +const gchar * +g_variant_get_string (GVariant *value, + gsize *length) +{ + gconstpointer data; + gsize size; + + g_return_val_if_fail (value != NULL, NULL); + g_return_val_if_fail ( + g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) || + g_variant_is_of_type (value, G_VARIANT_TYPE_OBJECT_PATH) || + g_variant_is_of_type (value, G_VARIANT_TYPE_SIGNATURE), NULL); + + data = g_variant_get_data (value); + size = g_variant_get_size (value); + + if (!g_variant_is_trusted (value)) + { + switch (g_variant_classify (value)) + { + case G_VARIANT_CLASS_STRING: + if (g_variant_serialiser_is_string (data, size)) + break; + + data = ""; + size = 1; + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + if (g_variant_serialiser_is_object_path (data, size)) + break; + + data = "/"; + size = 2; + break; + + case G_VARIANT_CLASS_SIGNATURE: + if (g_variant_serialiser_is_signature (data, size)) + break; + + data = ""; + size = 1; + break; + + default: + g_assert_not_reached (); + } + } + + if (length) + *length = size - 1; + + return data; +} + +/** + * g_variant_dup_string: + * @value: a string #GVariant instance + * @length: a pointer to a #gsize, to store the length + * @returns: a newly allocated string + * + * Similar to g_variant_get_string() except that instead of returning + * a constant string, the string is duplicated. + * + * The return value must be freed using g_free(). + * + * Since: 2.24 + **/ +gchar * +g_variant_dup_string (GVariant *value, + gsize *length) +{ + return g_strdup (g_variant_get_string (value, length)); +} + +/** + * g_variant_new_strv: + * @strv: an array of strings + * @length: the length of @strv, or -1 + * @returns: a new floating #GVariant instance + * + * Constructs an array of strings #GVariant from the given array of + * strings. + * + * If @length is not -1 then it gives the maximum length of @strv. In + * any case, a %NULL pointer in @strv is taken as a terminator. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_strv (const gchar * const *strv, + gssize length) +{ + GVariant **strings; + gsize i; + + g_return_val_if_fail (length == 0 || strv != NULL, NULL); + + if (length < 0) + length = g_strv_length ((gchar **) strv); + + strings = g_new (GVariant *, length); + for (i = 0; i < length; i++) + strings[i] = g_variant_ref_sink (g_variant_new_string (strv[i])); + + return g_variant_new_from_children (G_VARIANT_TYPE ("as"), + strings, length, TRUE); +} + +/** + * g_variant_get_strv: + * @value: an array of strings #GVariant + * @length: the length of the result, or %NULL + * @returns: an array of constant strings + * + * Gets the contents of an array of strings #GVariant. This call + * makes a shallow copy; the return result should be released with + * g_free(), but the individual strings must not be modified. + * + * If @length is non-%NULL then the number of elements in the result + * is stored there. In any case, the resulting array will be + * %NULL-terminated. + * + * For an empty array, @length will be set to 0 and a pointer to a + * %NULL pointer will be returned. + * + * Since: 2.24 + **/ +const gchar ** +g_variant_get_strv (GVariant *value, + gsize *length) +{ + const gchar **strv; + gsize n; + gsize i; + + g_return_val_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE ("as")) || + g_variant_is_of_type (value, G_VARIANT_TYPE ("ao")) || + g_variant_is_of_type (value, G_VARIANT_TYPE ("ag")), + NULL); + + g_variant_get_data (value); + n = g_variant_n_children (value); + strv = g_new (const gchar *, n + 1); + + for (i = 0; i < n; i++) + { + GVariant *string; + + string = g_variant_get_child_value (value, i); + strv[i] = g_variant_get_string (string, NULL); + g_variant_unref (string); + } + strv[i] = NULL; + + if (length) + *length = n; + + return strv; +} + +/** + * g_variant_dup_strv: + * @value: an array of strings #GVariant + * @length: the length of the result, or %NULL + * @returns: an array of constant strings + * + * Gets the contents of an array of strings #GVariant. This call + * makes a deep copy; the return result should be released with + * g_strfreev(). + * + * If @length is non-%NULL then the number of elements in the result + * is stored there. In any case, the resulting array will be + * %NULL-terminated. + * + * For an empty array, @length will be set to 0 and a pointer to a + * %NULL pointer will be returned. + * + * Since: 2.24 + **/ +gchar ** +g_variant_dup_strv (GVariant *value, + gsize *length) +{ + gchar **strv; + gsize n; + gsize i; + + g_return_val_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE ("as")) || + g_variant_is_of_type (value, G_VARIANT_TYPE ("ao")) || + g_variant_is_of_type (value, G_VARIANT_TYPE ("ag")), + NULL); + + n = g_variant_n_children (value); + strv = g_new (gchar *, n + 1); + + for (i = 0; i < n; i++) + { + GVariant *string; + + string = g_variant_get_child_value (value, i); + strv[i] = g_variant_dup_string (string, NULL); + g_variant_unref (string); + } + strv[i] = NULL; + + if (length) + *length = n; + + return strv; +} + +/* Type checking and querying {{{1 */ +/** + * g_variant_get_type: + * @value: a #GVariant + * @returns: a #GVariantType + * + * Determines the type of @value. + * + * The return value is valid for the lifetime of @value and must not + * be freed. + * + * Since: 2.24 + **/ +const GVariantType * +g_variant_get_type (GVariant *value) +{ + GVariantTypeInfo *type_info; + + g_return_val_if_fail (value != NULL, NULL); + + type_info = g_variant_get_type_info (value); + + return (GVariantType *) g_variant_type_info_get_type_string (type_info); +} + +/** + * g_variant_get_type_string: + * @value: a #GVariant + * @returns: the type string for the type of @value + * + * Returns the type string of @value. Unlike the result of calling + * g_variant_type_peek_string(), this string is nul-terminated. This + * string belongs to #GVariant and must not be freed. + * + * Since: 2.24 + **/ +const gchar * +g_variant_get_type_string (GVariant *value) +{ + GVariantTypeInfo *type_info; + + g_return_val_if_fail (value != NULL, NULL); + + type_info = g_variant_get_type_info (value); + + return g_variant_type_info_get_type_string (type_info); +} + +/** + * g_variant_is_of_type: + * @value: a #GVariant instance + * @type: a #GVariantType + * @returns: %TRUE if the type of @value matches @type + * + * Checks if a value has a type matching the provided type. + * + * Since: 2.24 + **/ +gboolean +g_variant_is_of_type (GVariant *value, + const GVariantType *type) +{ + return g_variant_type_is_subtype_of (g_variant_get_type (value), type); +} + +/** + * g_variant_is_container: + * @value: a #GVariant instance + * @returns: %TRUE if @value is a container + * + * Checks if @value is a container. + */ +gboolean +g_variant_is_container (GVariant *value) +{ + return g_variant_type_is_container (g_variant_get_type (value)); +} + + +/** + * g_variant_classify: + * @value: a #GVariant + * @returns: the #GVariantClass of @value + * + * Classifies @value according to its top-level type. + * + * Since: 2.24 + **/ +/** + * GVariantClass: + * @G_VARIANT_CLASS_BOOLEAN: The #GVariant is a boolean. + * @G_VARIANT_CLASS_BYTE: The #GVariant is a byte. + * @G_VARIANT_CLASS_INT16: The #GVariant is a signed 16 bit integer. + * @G_VARIANT_CLASS_UINT16: The #GVariant is an unsigned 16 bit integer. + * @G_VARIANT_CLASS_INT32: The #GVariant is a signed 32 bit integer. + * @G_VARIANT_CLASS_UINT32: The #GVariant is an unsigned 32 bit integer. + * @G_VARIANT_CLASS_INT64: The #GVariant is a signed 64 bit integer. + * @G_VARIANT_CLASS_UINT64: The #GVariant is an unsigned 64 bit integer. + * @G_VARIANT_CLASS_HANDLE: The #GVariant is a file handle index. + * @G_VARIANT_CLASS_DOUBLE: The #GVariant is a double precision floating + * point value. + * @G_VARIANT_CLASS_STRING: The #GVariant is a normal string. + * @G_VARIANT_CLASS_OBJECT_PATH: The #GVariant is a DBus object path + * string. + * @G_VARIANT_CLASS_SIGNATURE: The #GVariant is a DBus signature string. + * @G_VARIANT_CLASS_VARIANT: The #GVariant is a variant. + * @G_VARIANT_CLASS_MAYBE: The #GVariant is a maybe-typed value. + * @G_VARIANT_CLASS_ARRAY: The #GVariant is an array. + * @G_VARIANT_CLASS_TUPLE: The #GVariant is a tuple. + * @G_VARIANT_CLASS_DICT_ENTRY: The #GVariant is a dictionary entry. + * + * The range of possible top-level types of #GVariant instances. + * + * Since: 2.24 + **/ +GVariantClass +g_variant_classify (GVariant *value) +{ + g_return_val_if_fail (value != NULL, 0); + + return *g_variant_get_type_string (value); +} + +/* Pretty printer {{{1 */ +/** + * g_variant_print_string: + * @value: a #GVariant + * @string: a #GString, or %NULL + * @type_annotate: %TRUE if type information should be included in + * the output + * @returns: a #GString containing the string + * + * Behaves as g_variant_print(), but operates on a #GString. + * + * If @string is non-%NULL then it is appended to and returned. Else, + * a new empty #GString is allocated and it is returned. + * + * Since: 2.24 + **/ +GString * +g_variant_print_string (GVariant *value, + GString *string, + gboolean type_annotate) +{ + if G_UNLIKELY (string == NULL) + string = g_string_new (NULL); + + switch (g_variant_classify (value)) + { + case G_VARIANT_CLASS_MAYBE: + if (type_annotate) + g_string_append_printf (string, "@%s ", + g_variant_get_type_string (value)); + + if (g_variant_n_children (value)) + { + gchar *printed_child; + GVariant *element; + + /* Nested maybes: + * + * Consider the case of the type "mmi". In this case we could + * write "just just 4", but "4" alone is totally unambiguous, + * so we try to drop "just" where possible. + * + * We have to be careful not to always drop "just", though, + * since "nothing" needs to be distinguishable from "just + * nothing". The case where we need to ensure we keep the + * "just" is actually exactly the case where we have a nested + * Nothing. + * + * Instead of searching for that nested Nothing, we just print + * the contained value into a separate string and see if we + * end up with "nothing" at the end of it. If so, we need to + * add "just" at our level. + */ + element = g_variant_get_child_value (value, 0); + printed_child = g_variant_print (element, FALSE); + g_variant_unref (element); + + if (g_str_has_suffix (printed_child, "nothing")) + g_string_append (string, "just "); + g_string_append (string, printed_child); + g_free (printed_child); + } + else + g_string_append (string, "nothing"); + + break; + + case G_VARIANT_CLASS_ARRAY: + /* it's an array so the first character of the type string is 'a' + * + * if the first two characters are 'a{' then it's an array of + * dictionary entries (ie: a dictionary) so we print that + * differently. + */ + if (g_variant_get_type_string (value)[1] == '{') + /* dictionary */ + { + const gchar *comma = ""; + gsize n, i; + + if ((n = g_variant_n_children (value)) == 0) + { + if (type_annotate) + g_string_append_printf (string, "@%s ", + g_variant_get_type_string (value)); + g_string_append (string, "{}"); + break; + } + + g_string_append_c (string, '{'); + for (i = 0; i < n; i++) + { + GVariant *entry, *key, *val; + + g_string_append (string, comma); + comma = ", "; + + entry = g_variant_get_child_value (value, i); + key = g_variant_get_child_value (entry, 0); + val = g_variant_get_child_value (entry, 1); + g_variant_unref (entry); + + g_variant_print_string (key, string, type_annotate); + g_variant_unref (key); + g_string_append (string, ": "); + g_variant_print_string (val, string, type_annotate); + g_variant_unref (val); + type_annotate = FALSE; + } + g_string_append_c (string, '}'); + } + else + /* normal (non-dictionary) array */ + { + const gchar *comma = ""; + gsize n, i; + + if ((n = g_variant_n_children (value)) == 0) + { + if (type_annotate) + g_string_append_printf (string, "@%s ", + g_variant_get_type_string (value)); + g_string_append (string, "[]"); + break; + } + + g_string_append_c (string, '['); + for (i = 0; i < n; i++) + { + GVariant *element; + + g_string_append (string, comma); + comma = ", "; + + element = g_variant_get_child_value (value, i); + + g_variant_print_string (element, string, type_annotate); + g_variant_unref (element); + type_annotate = FALSE; + } + g_string_append_c (string, ']'); + } + + break; + + case G_VARIANT_CLASS_TUPLE: + { + gsize n, i; + + n = g_variant_n_children (value); + + g_string_append_c (string, '('); + for (i = 0; i < n; i++) + { + GVariant *element; + + element = g_variant_get_child_value (value, i); + g_variant_print_string (element, string, type_annotate); + g_string_append (string, ", "); + g_variant_unref (element); + } + + /* for >1 item: remove final ", " + * for 1 item: remove final " ", but leave the "," + * for 0 items: there is only "(", so remove nothing + */ + g_string_truncate (string, string->len - (n > 0) - (n > 1)); + g_string_append_c (string, ')'); + } + break; + + case G_VARIANT_CLASS_DICT_ENTRY: + { + GVariant *element; + + g_string_append_c (string, '{'); + + element = g_variant_get_child_value (value, 0); + g_variant_print_string (element, string, type_annotate); + g_variant_unref (element); + + g_string_append (string, ", "); + + element = g_variant_get_child_value (value, 1); + g_variant_print_string (element, string, type_annotate); + g_variant_unref (element); + + g_string_append_c (string, '}'); + } + break; + + case G_VARIANT_CLASS_VARIANT: + { + GVariant *child = g_variant_get_variant (value); + + /* Always annotate types in nested variants, because they are + * (by nature) of variable type. + */ + g_string_append_c (string, '<'); + g_variant_print_string (child, string, TRUE); + g_string_append_c (string, '>'); + + g_variant_unref (child); + } + break; + + case G_VARIANT_CLASS_BOOLEAN: + if (g_variant_get_boolean (value)) + g_string_append (string, "true"); + else + g_string_append (string, "false"); + break; + + case G_VARIANT_CLASS_STRING: + { + const gchar *str = g_variant_get_string (value, NULL); + gchar *escaped = g_strescape (str, NULL); + + /* use double quotes only if a ' is in the string */ + if (strchr (str, '\'')) + g_string_append_printf (string, "\"%s\"", escaped); + else + g_string_append_printf (string, "'%s'", escaped); + + g_free (escaped); + } + break; + + case G_VARIANT_CLASS_BYTE: + if (type_annotate) + g_string_append (string, "byte "); + g_string_append_printf (string, "0x%02x", + g_variant_get_byte (value)); + break; + + case G_VARIANT_CLASS_INT16: + if (type_annotate) + g_string_append (string, "int16 "); + g_string_append_printf (string, "%"G_GINT16_FORMAT, + g_variant_get_int16 (value)); + break; + + case G_VARIANT_CLASS_UINT16: + if (type_annotate) + g_string_append (string, "uint16 "); + g_string_append_printf (string, "%"G_GUINT16_FORMAT, + g_variant_get_uint16 (value)); + break; + + case G_VARIANT_CLASS_INT32: + /* Never annotate this type because it is the default for numbers + * (and this is a *pretty* printer) + */ + g_string_append_printf (string, "%"G_GINT32_FORMAT, + g_variant_get_int32 (value)); + break; + + case G_VARIANT_CLASS_HANDLE: + if (type_annotate) + g_string_append (string, "handle "); + g_string_append_printf (string, "%"G_GINT32_FORMAT, + g_variant_get_handle (value)); + break; + + case G_VARIANT_CLASS_UINT32: + if (type_annotate) + g_string_append (string, "uint32 "); + g_string_append_printf (string, "%"G_GUINT32_FORMAT, + g_variant_get_uint32 (value)); + break; + + case G_VARIANT_CLASS_INT64: + if (type_annotate) + g_string_append (string, "int64 "); + g_string_append_printf (string, "%"G_GINT64_FORMAT, + g_variant_get_int64 (value)); + break; + + case G_VARIANT_CLASS_UINT64: + if (type_annotate) + g_string_append (string, "uint64 "); + g_string_append_printf (string, "%"G_GUINT64_FORMAT, + g_variant_get_uint64 (value)); + break; + + case G_VARIANT_CLASS_DOUBLE: + { + gchar buffer[100]; + gint i; + + g_ascii_dtostr (buffer, sizeof buffer, g_variant_get_double (value)); + + for (i = 0; buffer[i]; i++) + if (buffer[i] == '.' || buffer[i] == 'e' || + buffer[i] == 'n' || buffer[i] == 'N') + break; + + /* if there is no '.' or 'e' in the float then add one */ + if (buffer[i] == '\0') + { + buffer[i++] = '.'; + buffer[i++] = '0'; + buffer[i++] = '\0'; + } + + g_string_append (string, buffer); + } + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + if (type_annotate) + g_string_append (string, "objectpath "); + g_string_append_printf (string, "\'%s\'", + g_variant_get_string (value, NULL)); + break; + + case G_VARIANT_CLASS_SIGNATURE: + if (type_annotate) + g_string_append (string, "signature "); + g_string_append_printf (string, "\'%s\'", + g_variant_get_string (value, NULL)); + break; + + default: + g_assert_not_reached (); + } + + return string; +} + +/** + * g_variant_print: + * @value: a #GVariant + * @type_annotate: %TRUE if type information should be included in + * the output + * @returns: a newly-allocated string holding the result. + * + * Pretty-prints @value in the format understood by g_variant_parse(). + * + * If @type_annotate is %TRUE, then type information is included in + * the output. + */ +gchar * +g_variant_print (GVariant *value, + gboolean type_annotate) +{ + return g_string_free (g_variant_print_string (value, NULL, type_annotate), + FALSE); +}; + +/* Hash, Equal {{{1 */ +/** + * g_variant_hash: + * @value: a basic #GVariant value as a #gconstpointer + * @returns: a hash value corresponding to @value + * + * Generates a hash value for a #GVariant instance. + * + * The output of this function is guaranteed to be the same for a given + * value only per-process. It may change between different processor + * architectures or even different versions of GLib. Do not use this + * function as a basis for building protocols or file formats. + * + * The type of @value is #gconstpointer only to allow use of this + * function with #GHashTable. @value must be a #GVariant. + * + * Since: 2.24 + **/ +guint +g_variant_hash (gconstpointer value_) +{ + GVariant *value = (GVariant *) value_; + + switch (g_variant_classify (value)) + { + case G_VARIANT_CLASS_STRING: + case G_VARIANT_CLASS_OBJECT_PATH: + case G_VARIANT_CLASS_SIGNATURE: + return g_str_hash (g_variant_get_string (value, NULL)); + + case G_VARIANT_CLASS_BOOLEAN: + /* this is a very odd thing to hash... */ + return g_variant_get_boolean (value); + + case G_VARIANT_CLASS_BYTE: + return g_variant_get_byte (value); + + case G_VARIANT_CLASS_INT16: + case G_VARIANT_CLASS_UINT16: + { + const guint16 *ptr; + + ptr = g_variant_get_data (value); + + if (ptr) + return *ptr; + else + return 0; + } + + case G_VARIANT_CLASS_INT32: + case G_VARIANT_CLASS_UINT32: + case G_VARIANT_CLASS_HANDLE: + { + const guint *ptr; + + ptr = g_variant_get_data (value); + + if (ptr) + return *ptr; + else + return 0; + } + + case G_VARIANT_CLASS_INT64: + case G_VARIANT_CLASS_UINT64: + case G_VARIANT_CLASS_DOUBLE: + /* need a separate case for these guys because otherwise + * performance could be quite bad on big endian systems + */ + { + const guint *ptr; + + ptr = g_variant_get_data (value); + + if (ptr) + return ptr[0] + ptr[1]; + else + return 0; + } + + default: + g_return_val_if_fail (!g_variant_is_container (value), 0); + g_assert_not_reached (); + } +} + +/** + * g_variant_equal: + * @one: a #GVariant instance + * @two: a #GVariant instance + * @returns: %TRUE if @one and @two are equal + * + * Checks if @one and @two have the same type and value. + * + * The types of @one and @two are #gconstpointer only to allow use of + * this function with #GHashTable. They must each be a #GVariant. + * + * Since: 2.24 + **/ +gboolean +g_variant_equal (gconstpointer one, + gconstpointer two) +{ + gboolean equal; + + g_return_val_if_fail (one != NULL && two != NULL, FALSE); + + if (g_variant_get_type_info ((GVariant *) one) != + g_variant_get_type_info ((GVariant *) two)) + return FALSE; + + /* if both values are trusted to be in their canonical serialised form + * then a simple memcmp() of their serialised data will answer the + * question. + * + * if not, then this might generate a false negative (since it is + * possible for two different byte sequences to represent the same + * value). for now we solve this by pretty-printing both values and + * comparing the result. + */ + if (g_variant_is_trusted ((GVariant *) one) && + g_variant_is_trusted ((GVariant *) two)) + { + gconstpointer data_one, data_two; + gsize size_one, size_two; + + size_one = g_variant_get_size ((GVariant *) one); + size_two = g_variant_get_size ((GVariant *) two); + + if (size_one != size_two) + return FALSE; + + data_one = g_variant_get_data ((GVariant *) one); + data_two = g_variant_get_data ((GVariant *) two); + + equal = memcmp (data_one, data_two, size_one) == 0; + } + else + { + gchar *strone, *strtwo; + + strone = g_variant_print ((GVariant *) one, FALSE); + strtwo = g_variant_print ((GVariant *) two, FALSE); + equal = strcmp (strone, strtwo) == 0; + g_free (strone); + g_free (strtwo); + } + + return equal; +} + +/* GVariantIter {{{1 */ +/** + * GVariantIter: + * + * #GVariantIter is an opaque data structure and can only be accessed + * using the following functions. + **/ +struct stack_iter +{ + GVariant *value; + gssize n, i; + + const gchar *loop_format; + + gsize padding[3]; + gsize magic; +}; + +G_STATIC_ASSERT (sizeof (struct stack_iter) <= sizeof (GVariantIter)); + +struct heap_iter +{ + struct stack_iter iter; + + GVariant *value_ref; + gsize magic; +}; + +#define GVSI(i) ((struct stack_iter *) (i)) +#define GVHI(i) ((struct heap_iter *) (i)) +#define GVSI_MAGIC ((gsize) 3579507750u) +#define GVHI_MAGIC ((gsize) 1450270775u) +#define is_valid_iter(i) (i != NULL && \ + GVSI(i)->magic == GVSI_MAGIC) +#define is_valid_heap_iter(i) (GVHI(i)->magic == GVHI_MAGIC && \ + is_valid_iter(i)) + +/** + * g_variant_iter_new: + * @value: a container #GVariant + * @returns: a new heap-allocated #GVariantIter + * + * Creates a heap-allocated #GVariantIter for iterating over the items + * in @value. + * + * Use g_variant_iter_free() to free the return value when you no longer + * need it. + * + * A reference is taken to @value and will be released only when + * g_variant_iter_free() is called. + * + * Since: 2.24 + **/ +GVariantIter * +g_variant_iter_new (GVariant *value) +{ + GVariantIter *iter; + + iter = (GVariantIter *) g_slice_new (struct heap_iter); + GVHI(iter)->value_ref = g_variant_ref (value); + GVHI(iter)->magic = GVHI_MAGIC; + + g_variant_iter_init (iter, value); + + return iter; +} + +/** + * g_variant_iter_init: + * @iter: a pointer to a #GVariantIter + * @value: a container #GVariant + * @returns: the number of items in @value + * + * Initialises (without allocating) a #GVariantIter. @iter may be + * completely uninitialised prior to this call; its old value is + * ignored. + * + * The iterator remains valid for as long as @value exists, and need not + * be freed in any way. + * + * Since: 2.24 + **/ +gsize +g_variant_iter_init (GVariantIter *iter, + GVariant *value) +{ + GVSI(iter)->magic = GVSI_MAGIC; + GVSI(iter)->value = value; + GVSI(iter)->n = g_variant_n_children (value); + GVSI(iter)->i = -1; + GVSI(iter)->loop_format = NULL; + + return GVSI(iter)->n; +} + +/** + * g_variant_iter_copy: + * @iter: a #GVariantIter + * @returns: a new heap-allocated #GVariantIter + * + * Creates a new heap-allocated #GVariantIter to iterate over the + * container that was being iterated over by @iter. Iteration begins on + * the new iterator from the current position of the old iterator but + * the two copies are independent past that point. + * + * Use g_variant_iter_free() to free the return value when you no longer + * need it. + * + * A reference is taken to the container that @iter is iterating over + * and will be releated only when g_variant_iter_free() is called. + * + * Since: 2.24 + **/ +GVariantIter * +g_variant_iter_copy (GVariantIter *iter) +{ + GVariantIter *copy; + + g_return_val_if_fail (is_valid_iter (iter), 0); + + copy = g_variant_iter_new (GVSI(iter)->value); + GVSI(copy)->i = GVSI(iter)->i; + + return copy; +} + +/** + * g_variant_iter_n_children: + * @iter: a #GVariantIter + * @returns: the number of children in the container + * + * Queries the number of child items in the container that we are + * iterating over. This is the total number of items -- not the number + * of items remaining. + * + * This function might be useful for preallocation of arrays. + * + * Since: 2.24 + **/ +gsize +g_variant_iter_n_children (GVariantIter *iter) +{ + g_return_val_if_fail (is_valid_iter (iter), 0); + + return GVSI(iter)->n; +} + +/** + * g_variant_iter_free: + * @iter: a heap-allocated #GVariantIter + * + * Frees a heap-allocated #GVariantIter. Only call this function on + * iterators that were returned by g_variant_iter_new() or + * g_variant_iter_copy(). + * + * Since: 2.24 + **/ +void +g_variant_iter_free (GVariantIter *iter) +{ + g_return_if_fail (is_valid_heap_iter (iter)); + + g_variant_unref (GVHI(iter)->value_ref); + GVHI(iter)->magic = 0; + + g_slice_free (struct heap_iter, GVHI(iter)); +} + +/** + * g_variant_iter_next_value: + * @iter: a #GVariantIter + * @returns: a #GVariant, or %NULL + * + * Gets the next item in the container. If no more items remain then + * %NULL is returned. + * + * Use g_variant_unref() to drop your reference on the return value when + * you no longer need it. + * + * + * Iterating with g_variant_iter_next_value() + * + * /* recursively iterate a container */ + * void + * iterate_container_recursive (GVariant *container) + * { + * GVariantIter iter; + * GVariant *child; + * + * g_variant_iter_init (&iter, dictionary); + * while ((child = g_variant_iter_next_value (&iter))) + * { + * g_print ("type '%s'\n", g_variant_get_type_string (child)); + * + * if (g_variant_is_container (child)) + * iterate_container_recursive (child); + * + * g_variant_unref (child); + * } + * } + * + * + * + * Since: 2.24 + **/ +GVariant * +g_variant_iter_next_value (GVariantIter *iter) +{ + g_return_val_if_fail (is_valid_iter (iter), FALSE); + + if G_UNLIKELY (GVSI(iter)->i >= GVSI(iter)->n) + { + g_critical ("g_variant_iter_next_value: must not be called again " + "after NULL has already been returned."); + return NULL; + } + + GVSI(iter)->i++; + + if (GVSI(iter)->i < GVSI(iter)->n) + return g_variant_get_child_value (GVSI(iter)->value, GVSI(iter)->i); + + return NULL; +} + +/* GVariantBuilder {{{1 */ +/** + * GVariantBuilder: + * + * A utility type for constructing container-type #GVariant instances. + * + * This is an opaque structure and may only be accessed using the + * following functions. + * + * #GVariantBuilder is not threadsafe in any way. Do not attempt to + * access it from more than one thread. + **/ + +struct stack_builder +{ + GVariantBuilder *parent; + GVariantType *type; + + /* type constraint explicitly specified by 'type'. + * for tuple types, this moves along as we add more items. + */ + const GVariantType *expected_type; + + /* type constraint implied by previous array item. + */ + const GVariantType *prev_item_type; + + /* constraints on the number of children. max = -1 for unlimited. */ + gsize min_items; + gsize max_items; + + /* dynamically-growing pointer array */ + GVariant **children; + gsize allocated_children; + gsize offset; + + /* set to '1' if all items in the container will have the same type + * (ie: maybe, array, variant) '0' if not (ie: tuple, dict entry) + */ + guint uniform_item_types : 1; + + /* set to '1' initially and changed to '0' if an untrusted value is + * added + */ + guint trusted : 1; + + gsize magic; +}; + +G_STATIC_ASSERT (sizeof (struct stack_builder) <= sizeof (GVariantBuilder)); + +struct heap_builder +{ + GVariantBuilder builder; + gsize magic; + + gint ref_count; +}; + +#define GVSB(b) ((struct stack_builder *) (b)) +#define GVHB(b) ((struct heap_builder *) (b)) +#define GVSB_MAGIC ((gsize) 1033660112u) +#define GVHB_MAGIC ((gsize) 3087242682u) +#define is_valid_builder(b) (b != NULL && \ + GVSB(b)->magic == GVSB_MAGIC) +#define is_valid_heap_builder(b) (GVHB(b)->magic == GVHB_MAGIC) + +/** + * g_variant_builder_new: + * @type: a container type + * @returns: a #GVariantBuilder + * + * Allocates and initialises a new #GVariantBuilder. + * + * You should call g_variant_builder_unref() on the return value when it + * is no longer needed. The memory will not be automatically freed by + * any other call. + * + * In most cases it is easier to place a #GVariantBuilder directly on + * the stack of the calling function and initialise it with + * g_variant_builder_init(). + * + * Since: 2.24 + **/ +GVariantBuilder * +g_variant_builder_new (const GVariantType *type) +{ + GVariantBuilder *builder; + + builder = (GVariantBuilder *) g_slice_new (struct heap_builder); + g_variant_builder_init (builder, type); + GVHB(builder)->magic = GVHB_MAGIC; + GVHB(builder)->ref_count = 1; + + return builder; +} + +/** + * g_variant_builder_unref: + * @builder: a #GVariantBuilder allocated by g_variant_builder_new() + * + * Decreases the reference count on @builder. + * + * In the event that there are no more references, releases all memory + * associated with the #GVariantBuilder. + * + * Don't call this on stack-allocated #GVariantBuilder instances or bad + * things will happen. + * + * Since: 2.24 + **/ +void +g_variant_builder_unref (GVariantBuilder *builder) +{ + g_return_if_fail (is_valid_heap_builder (builder)); + + if (--GVHB(builder)->ref_count) + return; + + g_variant_builder_clear (builder); + GVHB(builder)->magic = 0; + + g_slice_free (struct heap_builder, GVHB(builder)); +} + +/** + * g_variant_builder_ref: + * @builder: a #GVariantBuilder allocated by g_variant_builder_new() + * @returns: a new reference to @builder + * + * Increases the reference count on @builder. + * + * Don't call this on stack-allocated #GVariantBuilder instances or bad + * things will happen. + * + * Since: 2.24 + **/ +GVariantBuilder * +g_variant_builder_ref (GVariantBuilder *builder) +{ + g_return_val_if_fail (is_valid_heap_builder (builder), NULL); + + GVHB(builder)->ref_count++; + + return builder; +} + +/** + * g_variant_builder_clear: + * @builder: a #GVariantBuilder + * + * Releases all memory associated with a #GVariantBuilder without + * freeing the #GVariantBuilder structure itself. + * + * It typically only makes sense to do this on a stack-allocated + * #GVariantBuilder if you want to abort building the value part-way + * through. This function need not be called if you call + * g_variant_builder_end() and it also doesn't need to be called on + * builders allocated with g_variant_builder_new (see + * g_variant_builder_free() for that). + * + * This function leaves the #GVariantBuilder structure set to all-zeros. + * It is valid to call this function on either an initialised + * #GVariantBuilder or one that is set to all-zeros but it is not valid + * to call this function on uninitialised memory. + * + * Since: 2.24 + **/ +void +g_variant_builder_clear (GVariantBuilder *builder) +{ + gsize i; + + if (GVSB(builder)->magic == 0) + /* all-zeros case */ + return; + + g_return_if_fail (is_valid_builder (builder)); + + g_variant_type_free (GVSB(builder)->type); + + for (i = 0; i < GVSB(builder)->offset; i++) + g_variant_unref (GVSB(builder)->children[i]); + + g_free (GVSB(builder)->children); + + if (GVSB(builder)->parent) + { + g_variant_builder_clear (GVSB(builder)->parent); + g_slice_free (GVariantBuilder, GVSB(builder)->parent); + } + + memset (builder, 0, sizeof (GVariantBuilder)); +} + +/** + * g_variant_builder_init: + * @builder: a #GVariantBuilder + * @type: a container type + * + * Initialises a #GVariantBuilder structure. + * + * @type must be non-%NULL. It specifies the type of container to + * construct. It can be an indefinite type such as + * %G_VARIANT_TYPE_ARRAY or a definite type such as "as" or "(ii)". + * Maybe, array, tuple, dictionary entry and variant-typed values may be + * constructed. + * + * After the builder is initialised, values are added using + * g_variant_builder_add_value() or g_variant_builder_add(). + * + * After all the child values are added, g_variant_builder_end() frees + * the memory associated with the builder and returns the #GVariant that + * was created. + * + * This function completely ignores the previous contents of @builder. + * On one hand this means that it is valid to pass in completely + * uninitialised memory. On the other hand, this means that if you are + * initialising over top of an existing #GVariantBuilder you need to + * first call g_variant_builder_clear() in order to avoid leaking + * memory. + * + * You must not call g_variant_builder_ref() or + * g_variant_builder_unref() on a #GVariantBuilder that was initialised + * with this function. If you ever pass a reference to a + * #GVariantBuilder outside of the control of your own code then you + * should assume that the person receiving that reference may try to use + * reference counting; you should use g_variant_builder_new() instead of + * this function. + * + * Since: 2.24 + **/ +void +g_variant_builder_init (GVariantBuilder *builder, + const GVariantType *type) +{ + g_return_if_fail (type != NULL); + g_return_if_fail (g_variant_type_is_container (type)); + + memset (builder, 0, sizeof (GVariantBuilder)); + + GVSB(builder)->type = g_variant_type_copy (type); + GVSB(builder)->magic = GVSB_MAGIC; + GVSB(builder)->trusted = TRUE; + + switch (*(const gchar *) type) + { + case G_VARIANT_CLASS_VARIANT: + GVSB(builder)->uniform_item_types = TRUE; + GVSB(builder)->allocated_children = 1; + GVSB(builder)->expected_type = NULL; + GVSB(builder)->min_items = 1; + GVSB(builder)->max_items = 1; + break; + + case G_VARIANT_CLASS_ARRAY: + GVSB(builder)->uniform_item_types = TRUE; + GVSB(builder)->allocated_children = 8; + GVSB(builder)->expected_type = + g_variant_type_element (GVSB(builder)->type); + GVSB(builder)->min_items = 0; + GVSB(builder)->max_items = -1; + break; + + case G_VARIANT_CLASS_MAYBE: + GVSB(builder)->uniform_item_types = TRUE; + GVSB(builder)->allocated_children = 1; + GVSB(builder)->expected_type = + g_variant_type_element (GVSB(builder)->type); + GVSB(builder)->min_items = 0; + GVSB(builder)->max_items = 1; + break; + + case G_VARIANT_CLASS_DICT_ENTRY: + GVSB(builder)->uniform_item_types = FALSE; + GVSB(builder)->allocated_children = 2; + GVSB(builder)->expected_type = + g_variant_type_key (GVSB(builder)->type); + GVSB(builder)->min_items = 2; + GVSB(builder)->max_items = 2; + break; + + case 'r': /* G_VARIANT_TYPE_TUPLE was given */ + GVSB(builder)->uniform_item_types = FALSE; + GVSB(builder)->allocated_children = 8; + GVSB(builder)->expected_type = NULL; + GVSB(builder)->min_items = 0; + GVSB(builder)->max_items = -1; + break; + + case G_VARIANT_CLASS_TUPLE: /* a definite tuple type was given */ + GVSB(builder)->allocated_children = g_variant_type_n_items (type); + GVSB(builder)->expected_type = + g_variant_type_first (GVSB(builder)->type); + GVSB(builder)->min_items = GVSB(builder)->allocated_children; + GVSB(builder)->max_items = GVSB(builder)->allocated_children; + GVSB(builder)->uniform_item_types = FALSE; + break; + + default: + g_assert_not_reached (); + } + + GVSB(builder)->children = g_new (GVariant *, + GVSB(builder)->allocated_children); +} + +static void +g_variant_builder_make_room (struct stack_builder *builder) +{ + if (builder->offset == builder->allocated_children) + { + builder->allocated_children *= 2; + builder->children = g_renew (GVariant *, builder->children, + builder->allocated_children); + } +} + +/** + * g_variant_builder_add_value: + * @builder: a #GVariantBuilder + * @value: a #GVariant + * + * Adds @value to @builder. + * + * It is an error to call this function in any way that would create an + * inconsistent value to be constructed. Some examples of this are + * putting different types of items into an array, putting the wrong + * types or number of items in a tuple, putting more than one value into + * a variant, etc. + * + * Since: 2.24 + **/ +void +g_variant_builder_add_value (GVariantBuilder *builder, + GVariant *value) +{ + g_return_if_fail (is_valid_builder (builder)); + g_return_if_fail (GVSB(builder)->offset < GVSB(builder)->max_items); + g_return_if_fail (!GVSB(builder)->expected_type || + g_variant_is_of_type (value, + GVSB(builder)->expected_type)); + g_return_if_fail (!GVSB(builder)->prev_item_type || + g_variant_is_of_type (value, + GVSB(builder)->prev_item_type)); + + GVSB(builder)->trusted &= g_variant_is_trusted (value); + + if (!GVSB(builder)->uniform_item_types) + { + /* advance our expected type pointers */ + if (GVSB(builder)->expected_type) + GVSB(builder)->expected_type = + g_variant_type_next (GVSB(builder)->expected_type); + + if (GVSB(builder)->prev_item_type) + GVSB(builder)->prev_item_type = + g_variant_type_next (GVSB(builder)->prev_item_type); + } + else + GVSB(builder)->prev_item_type = g_variant_get_type (value); + + g_variant_builder_make_room (GVSB(builder)); + + GVSB(builder)->children[GVSB(builder)->offset++] = + g_variant_ref_sink (value); +} + +/** + * g_variant_builder_open: + * @builder: a #GVariantBuilder + * @type: a #GVariantType + * + * Opens a subcontainer inside the given @builder. When done adding + * items to the subcontainer, g_variant_builder_close() must be called. + * + * It is an error to call this function in any way that would cause an + * inconsistent value to be constructed (ie: adding too many values or + * a value of an incorrect type). + * + * Since: 2.24 + **/ +void +g_variant_builder_open (GVariantBuilder *builder, + const GVariantType *type) +{ + GVariantBuilder *parent; + + g_return_if_fail (is_valid_builder (builder)); + g_return_if_fail (GVSB(builder)->offset < GVSB(builder)->max_items); + g_return_if_fail (!GVSB(builder)->expected_type || + g_variant_type_is_subtype_of (type, + GVSB(builder)->expected_type)); + g_return_if_fail (!GVSB(builder)->prev_item_type || + g_variant_type_is_subtype_of (GVSB(builder)->prev_item_type, + type)); + + parent = g_slice_dup (GVariantBuilder, builder); + g_variant_builder_init (builder, type); + GVSB(builder)->parent = parent; + + /* push the prev_item_type down into the subcontainer */ + if (GVSB(parent)->prev_item_type) + { + if (!GVSB(builder)->uniform_item_types) + /* tuples and dict entries */ + GVSB(builder)->prev_item_type = + g_variant_type_first (GVSB(parent)->prev_item_type); + + else if (!g_variant_type_is_variant (GVSB(builder)->type)) + /* maybes and arrays */ + GVSB(builder)->prev_item_type = + g_variant_type_element (GVSB(parent)->prev_item_type); + } +} + +/** + * g_variant_builder_close: + * @builder: a #GVariantBuilder + * + * Closes the subcontainer inside the given @builder that was opened by + * the most recent call to g_variant_builder_open(). + * + * It is an error to call this function in any way that would create an + * inconsistent value to be constructed (ie: too few values added to the + * subcontainer). + * + * Since: 2.24 + **/ +void +g_variant_builder_close (GVariantBuilder *builder) +{ + GVariantBuilder *parent; + + g_return_if_fail (is_valid_builder (builder)); + g_return_if_fail (GVSB(builder)->parent != NULL); + + parent = GVSB(builder)->parent; + GVSB(builder)->parent = NULL; + + g_variant_builder_add_value (parent, g_variant_builder_end (builder)); + *builder = *parent; + + g_slice_free (GVariantBuilder, parent); +} + +/*< private > + * g_variant_make_maybe_type: + * @element: a #GVariant + * + * Return the type of a maybe containing @element. + */ +static GVariantType * +g_variant_make_maybe_type (GVariant *element) +{ + return g_variant_type_new_maybe (g_variant_get_type (element)); +} + +/*< private > + * g_variant_make_array_type: + * @element: a #GVariant + * + * Return the type of an array containing @element. + */ +static GVariantType * +g_variant_make_array_type (GVariant *element) +{ + return g_variant_type_new_array (g_variant_get_type (element)); +} + +/** + * g_variant_builder_end: + * @builder: a #GVariantBuilder + * @returns: a new, floating, #GVariant + * + * Ends the builder process and returns the constructed value. + * + * This call automatically reduces the reference count on @builder by + * one, unless it has previously had g_variant_builder_no_autofree() + * called on it. Unless you've taken other actions, this is usually + * sufficient to free @builder. + * + * Even if additional references are held, it is not permissible to use + * @builder in any way after this call except for further reference + * counting operations. + * + * It is an error to call this function in any way that would create an + * inconsistent value to be constructed (ie: insufficient number of + * items added to a container with a specific number of children + * required). It is also an error to call this function if the builder + * was created with an indefinite array or maybe type and no children + * have been added; in this case it is impossible to infer the type of + * the empty array. + * + * Since: 2.24 + **/ +GVariant * +g_variant_builder_end (GVariantBuilder *builder) +{ + GVariantType *my_type; + GVariant *value; + + g_return_val_if_fail (is_valid_builder (builder), NULL); + g_return_val_if_fail (GVSB(builder)->offset >= GVSB(builder)->min_items, + NULL); + g_return_val_if_fail (!GVSB(builder)->uniform_item_types || + GVSB(builder)->prev_item_type != NULL || + g_variant_type_is_definite (GVSB(builder)->type), + NULL); + + if (g_variant_type_is_definite (GVSB(builder)->type)) + my_type = g_variant_type_copy (GVSB(builder)->type); + + else if (g_variant_type_is_maybe (GVSB(builder)->type)) + my_type = g_variant_make_maybe_type (GVSB(builder)->children[0]); + + else if (g_variant_type_is_array (GVSB(builder)->type)) + my_type = g_variant_make_array_type (GVSB(builder)->children[0]); + + else if (g_variant_type_is_tuple (GVSB(builder)->type)) + my_type = g_variant_make_tuple_type (GVSB(builder)->children, + GVSB(builder)->offset); + + else if (g_variant_type_is_dict_entry (GVSB(builder)->type)) + my_type = g_variant_make_dict_entry_type (GVSB(builder)->children[0], + GVSB(builder)->children[1]); + else + g_assert_not_reached (); + + value = g_variant_new_from_children (my_type, + g_renew (GVariant *, + GVSB(builder)->children, + GVSB(builder)->offset), + GVSB(builder)->offset, + GVSB(builder)->trusted); + GVSB(builder)->children = NULL; + GVSB(builder)->offset = 0; + + g_variant_builder_clear (builder); + g_variant_type_free (my_type); + + return value; +} + +/* Format strings {{{1 */ +/*< private > + * g_variant_format_string_scan: + * @string: a string that may be prefixed with a format string + * @limit: a pointer to the end of @string, or %NULL + * @endptr: location to store the end pointer, or %NULL + * @returns: %TRUE if there was a valid format string + * + * Checks the string pointed to by @string for starting with a properly + * formed #GVariant varargs format string. If no valid format string is + * found then %FALSE is returned. + * + * If @string does start with a valid format string then %TRUE is + * returned. If @endptr is non-%NULL then it is updated to point to the + * first character after the format string. + * + * If @limit is non-%NULL then @limit (and any charater after it) will + * not be accessed and the effect is otherwise equivalent to if the + * character at @limit were nul. + * + * See the section on GVariant + * Format Strings. + * + * Since: 2.24 + */ +gboolean +g_variant_format_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr) +{ +#define next_char() (string == limit ? '\0' : *string++) +#define peek_char() (string == limit ? '\0' : *string) + char c; + + switch (next_char()) + { + case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': + case 'x': case 't': case 'h': case 'd': case 's': case 'o': + case 'g': case 'v': case '*': case '?': case 'r': + break; + + case 'm': + return g_variant_format_string_scan (string, limit, endptr); + + case 'a': + case '@': + return g_variant_type_string_scan (string, limit, endptr); + + case '(': + while (peek_char() != ')') + if (!g_variant_format_string_scan (string, limit, &string)) + return FALSE; + + next_char(); /* consume ')' */ + break; + + case '{': + c = next_char(); + + if (c == '&') + { + c = next_char (); + + if (c != 's' && c != 'o' && c != 'g') + return FALSE; + } + else + { + if (c == '@') + c = next_char (); + + /* ISO/IEC 9899:1999 (C99) §7.21.5.2: + * The terminating null character is considered to be + * part of the string. + */ + if (c != '\0' && strchr ("bynqiuxthdsog?", c) == NULL) + return FALSE; + } + + if (!g_variant_format_string_scan (string, limit, &string)) + return FALSE; + + if (next_char() != '}') + return FALSE; + + break; + + case '^': /* '^as' or '^a&s' only */ + if (next_char() != 'a') + return FALSE; + + if (peek_char() == '&') + next_char (); + + c = next_char (); + + if (c != 's' && c != 'o' && c != 'g') + return FALSE; + + break; + + case '&': + c = next_char(); + + if (c != 's' && c != 'o' && c != 'g') + return FALSE; + + break; + + default: + return FALSE; + } + + if (endptr != NULL) + *endptr = string; + +#undef next_char +#undef peek_char + + return TRUE; +} + +/*< private > + * g_variant_format_string_scan_type: + * @string: a string that may be prefixed with a format string + * @limit: a pointer to the end of @string + * @endptr: location to store the end pointer, or %NULL + * @returns: a #GVariantType if there was a valid format string + * + * If @string starts with a valid format string then this function will + * return the type that the format string corresponds to. Otherwise + * this function returns %NULL. + * + * Use g_variant_type_free() to free the return value when you no longer + * need it. + * + * This function is otherwise exactly like + * g_variant_format_string_scan(). + * + * Since: 2.24 + */ +GVariantType * +g_variant_format_string_scan_type (const gchar *string, + const gchar *limit, + const gchar **endptr) +{ + const gchar *my_end; + gchar *dest; + gchar *new; + + if (endptr == NULL) + endptr = &my_end; + + if (!g_variant_format_string_scan (string, limit, endptr)) + return NULL; + + dest = new = g_malloc (*endptr - string + 1); + while (string != *endptr) + { + if (*string != '@' && *string != '&' && *string != '^') + *dest++ = *string; + string++; + } + *dest = '\0'; + + return (GVariantType *) G_VARIANT_TYPE (new); +} + +static gboolean +valid_format_string (const gchar *format_string, + gboolean single, + GVariant *value) +{ + const gchar *endptr; + GVariantType *type; + + type = g_variant_format_string_scan_type (format_string, NULL, &endptr); + + if G_UNLIKELY (type == NULL || (single && *endptr != '\0')) + { + if (single) + g_critical ("`%s' is not a valid GVariant format string", + format_string); + else + g_critical ("`%s' does not have a valid GVariant format " + "string as a prefix", format_string); + + if (type != NULL) + g_variant_type_free (type); + + return FALSE; + } + + if G_UNLIKELY (value && !g_variant_is_of_type (value, type)) + { + gchar *fragment; + gchar *typestr; + + fragment = g_strndup (format_string, endptr - format_string); + typestr = g_variant_type_dup_string (type); + + g_critical ("the GVariant format string `%s' has a type of " + "`%s' but the given value has a type of `%s'", + fragment, typestr, g_variant_get_type_string (value)); + + g_variant_type_free (type); + + return FALSE; + } + + g_variant_type_free (type); + + return TRUE; +} + +/* Variable Arguments {{{1 */ +/* We consider 2 main classes of format strings: + * + * - recursive format strings + * these are ones that result in recursion and the collection of + * possibly more than one argument. Maybe types, tuples, + * dictionary entries. + * + * - leaf format string + * these result in the collection of a single argument. + * + * Leaf format strings are further subdivided into two categories: + * + * - single non-null pointer ("nnp") + * these either collect or return a single non-null pointer. + * + * - other + * these collect or return something else (bool, number, etc). + * + * Based on the above, the varargs handling code is split into 4 main parts: + * + * - nnp handling code + * - leaf handling code (which may invoke nnp code) + * - generic handling code (may be recursive, may invoke leaf code) + * - user-facing API (which invokes the generic code) + * + * Each section implements some of the following functions: + * + * - skip: + * collect the arguments for the format string as if + * g_variant_new() had been called, but do nothing with them. used + * for skipping over arguments when constructing a Nothing maybe + * type. + * + * - new: + * create a GVariant * + * + * - get: + * unpack a GVariant * + * + * - free (nnp only): + * free a previously allocated item + */ + +static gboolean +g_variant_format_string_is_leaf (const gchar *str) +{ + return str[0] != 'm' && str[0] != '(' && str[0] != '{'; +} + +static gboolean +g_variant_format_string_is_nnp (const gchar *str) +{ + return str[0] == 'a' || str[0] == 's' || str[0] == 'o' || str[0] == 'g' || + str[0] == '^' || str[0] == '@' || str[0] == '*' || str[0] == '?' || + str[0] == 'r' || str[0] == 'v' || str[0] == '&'; +} + +/* Single non-null pointer ("nnp") {{{2 */ +static void +g_variant_valist_free_nnp (const gchar *str, + gpointer ptr) +{ + switch (*str) + { + case 'a': + g_variant_iter_free (ptr); + break; + + case '^': + if (str[2] != '&') /* '^as' */ + g_strfreev (ptr); + else /* '^a&s' */ + g_free (ptr); + break; + + case 's': + case 'o': + case 'g': + g_free (ptr); + break; + + case '@': + case '*': + case '?': + case 'v': + g_variant_unref (ptr); + break; + + case '&': + break; + + default: + g_assert_not_reached (); + } +} + +static GVariant * +g_variant_valist_new_nnp (const gchar **str, + gpointer ptr) +{ + if (**str == '&') + (*str)++; + + switch (*(*str)++) + { + case 'a': + { + const GVariantType *type; + GVariant *value; + + value = g_variant_builder_end (ptr); + type = g_variant_get_type (value); + + if G_UNLIKELY (!g_variant_type_is_array (type)) + g_error ("g_variant_new: expected array GVariantBuilder but " + "the built value has type `%s'", + g_variant_get_type_string (value)); + + type = g_variant_type_element (type); + + if G_UNLIKELY (!g_variant_type_is_subtype_of (type, (GVariantType *) *str)) + g_error ("g_variant_new: expected GVariantBuilder array element " + "type `%s' but the built value has element type `%s'", + g_variant_type_dup_string ((GVariantType *) *str), + g_variant_get_type_string (value) + 1); + + g_variant_type_string_scan (*str, NULL, str); + + return value; + } + + case 's': + return g_variant_new_string (ptr); + + case 'o': + return g_variant_new_object_path (ptr); + + case 'g': + return g_variant_new_signature (ptr); + + case '^': + { + const GVariantType *type; + GVariantType *array_type; + GVariant **children; + gchar **strv = ptr; + GVariant *value; + guint length, i; + + if ((*str)[1] == '&') /* '^a&s' */ + (*str) += 2; + else /* '^as' */ + (*str)++; + + type = (GVariantType *) (*str)++; + array_type = g_variant_type_new_array (type); + length = g_strv_length (strv); + children = g_new (GVariant *, length); + for (i = 0; i < length; i++) + children[i] = g_variant_ref_sink ( + g_variant_new_from_trusted (type, strv[i], strlen (strv[i]) + 1)); + + value = g_variant_new_from_children (array_type, children, + length, TRUE); + g_variant_type_free (array_type); + + return value; + } + + case '@': + if G_UNLIKELY (!g_variant_is_of_type (ptr, (GVariantType *) *str)) + g_error ("g_variant_new: expected GVariant of type `%s' but " + "received value has type `%s'", + g_variant_type_dup_string ((GVariantType *) *str), + g_variant_get_type_string (ptr)); + + g_variant_type_string_scan (*str, NULL, str); + + return ptr; + + case '*': + return ptr; + + case '?': + if G_UNLIKELY (!g_variant_type_is_basic (g_variant_get_type (ptr))) + g_error ("g_variant_new: format string `?' expects basic-typed " + "GVariant, but received value has type `%s'", + g_variant_get_type_string (ptr)); + + return ptr; + + case 'r': + if G_UNLIKELY (!g_variant_type_is_tuple (g_variant_get_type (ptr))) + g_error ("g_variant_new: format string `r` expects tuple-typed " + "GVariant, but received value has type `%s'", + g_variant_get_type_string (ptr)); + + return ptr; + + case 'v': + return g_variant_new_variant (ptr); + + default: + g_assert_not_reached (); + } +} + +static gpointer +g_variant_valist_get_nnp (const gchar **str, + GVariant *value) +{ + switch (*(*str)++) + { + case 'a': + g_variant_type_string_scan (*str, NULL, str); + return g_variant_iter_new (value); + + case '&': + (*str)++; + return (gchar *) g_variant_get_string (value, NULL); + + case 's': + case 'o': + case 'g': + return g_variant_dup_string (value, NULL); + + case '^': + if ((*str)[1] == '&') /* '^a&s' */ + { + (*str) += 3; + return g_variant_get_strv (value, NULL); + } + else /* '^as' */ + { + (*str) += 2; + return g_variant_dup_strv (value, NULL); + } + + case '@': + g_variant_type_string_scan (*str, NULL, str); + /* fall through */ + + case '*': + case '?': + case 'r': + return g_variant_ref (value); + + case 'v': + return g_variant_get_variant (value); + + default: + g_assert_not_reached (); + } +} + +/* Leaves {{{2 */ +static void +g_variant_valist_skip_leaf (const gchar **str, + va_list *app) +{ + if (g_variant_format_string_is_nnp (*str)) + { + g_variant_format_string_scan (*str, NULL, str); + va_arg (*app, gpointer); + return; + } + + switch (*(*str)++) + { + case 'b': + case 'y': + case 'n': + case 'q': + case 'i': + case 'u': + case 'h': + va_arg (*app, int); + return; + + case 'x': + case 't': + va_arg (*app, guint64); + return; + + case 'd': + va_arg (*app, gdouble); + return; + + default: + g_assert_not_reached (); + } +} + +static GVariant * +g_variant_valist_new_leaf (const gchar **str, + va_list *app) +{ + if (g_variant_format_string_is_nnp (*str)) + return g_variant_valist_new_nnp (str, va_arg (*app, gpointer)); + + switch (*(*str)++) + { + case 'b': + return g_variant_new_boolean (va_arg (*app, gboolean)); + + case 'y': + return g_variant_new_byte (va_arg (*app, guint)); + + case 'n': + return g_variant_new_int16 (va_arg (*app, gint)); + + case 'q': + return g_variant_new_uint16 (va_arg (*app, guint)); + + case 'i': + return g_variant_new_int32 (va_arg (*app, gint)); + + case 'u': + return g_variant_new_uint32 (va_arg (*app, guint)); + + case 'x': + return g_variant_new_int64 (va_arg (*app, gint64)); + + case 't': + return g_variant_new_uint64 (va_arg (*app, guint64)); + + case 'h': + return g_variant_new_handle (va_arg (*app, gint)); + + case 'd': + return g_variant_new_double (va_arg (*app, gdouble)); + + default: + g_assert_not_reached (); + } +} + +/* The code below assumes this */ +G_STATIC_ASSERT (sizeof (gboolean) == sizeof (guint32)); +G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64)); + +static void +g_variant_valist_get_leaf (const gchar **str, + GVariant *value, + gboolean free, + va_list *app) +{ + gpointer ptr = va_arg (*app, gpointer); + + if (ptr == NULL) + { + g_variant_format_string_scan (*str, NULL, str); + return; + } + + if (g_variant_format_string_is_nnp (*str)) + { + gpointer *nnp = (gpointer *) ptr; + + if (free && *nnp != NULL) + g_variant_valist_free_nnp (*str, *nnp); + + *nnp = NULL; + + if (value != NULL) + *nnp = g_variant_valist_get_nnp (str, value); + else + g_variant_format_string_scan (*str, NULL, str); + + return; + } + + if (value != NULL) + { + switch (*(*str)++) + { + case 'b': + *(gboolean *) ptr = g_variant_get_boolean (value); + return; + + case 'y': + *(guchar *) ptr = g_variant_get_byte (value); + return; + + case 'n': + *(gint16 *) ptr = g_variant_get_int16 (value); + return; + + case 'q': + *(guint16 *) ptr = g_variant_get_uint16 (value); + return; + + case 'i': + *(gint32 *) ptr = g_variant_get_int32 (value); + return; + + case 'u': + *(guint32 *) ptr = g_variant_get_uint32 (value); + return; + + case 'x': + *(gint64 *) ptr = g_variant_get_int64 (value); + return; + + case 't': + *(guint64 *) ptr = g_variant_get_uint64 (value); + return; + + case 'h': + *(gint32 *) ptr = g_variant_get_handle (value); + return; + + case 'd': + *(gdouble *) ptr = g_variant_get_double (value); + return; + } + } + else + { + switch (*(*str)++) + { + case 'y': + *(guchar *) ptr = 0; + return; + + case 'n': + case 'q': + *(guint16 *) ptr = 0; + return; + + case 'i': + case 'u': + case 'h': + case 'b': + *(guint32 *) ptr = 0; + return; + + case 'x': + case 't': + case 'd': + *(guint64 *) ptr = 0; + return; + } + } + + g_assert_not_reached (); +} + +/* Generic (recursive) {{{2 */ +static void +g_variant_valist_skip (const gchar **str, + va_list *app) +{ + if (g_variant_format_string_is_leaf (*str)) + g_variant_valist_skip_leaf (str, app); + + else if (**str == 'm') /* maybe */ + { + (*str)++; + + if (!g_variant_format_string_is_nnp (*str)) + va_arg (*app, gboolean); + + g_variant_valist_skip (str, app); + } + else /* tuple, dictionary entry */ + { + g_assert (**str == '(' || **str == '{'); + (*str)++; + while (**str != ')' && **str != '}') + g_variant_valist_skip (str, app); + (*str)++; + } +} + +static GVariant * +g_variant_valist_new (const gchar **str, + va_list *app) +{ + if (g_variant_format_string_is_leaf (*str)) + return g_variant_valist_new_leaf (str, app); + + if (**str == 'm') /* maybe */ + { + GVariantType *type = NULL; + GVariant *value = NULL; + + (*str)++; + + if (g_variant_format_string_is_nnp (*str)) + { + gpointer nnp = va_arg (*app, gpointer); + + if (nnp != NULL) + value = g_variant_valist_new_nnp (str, nnp); + else + type = g_variant_format_string_scan_type (*str, NULL, str); + } + else + { + gboolean just = va_arg (*app, gboolean); + + if (just) + value = g_variant_valist_new (str, app); + else + { + type = g_variant_format_string_scan_type (*str, NULL, NULL); + g_variant_valist_skip (str, app); + } + } + + value = g_variant_new_maybe (type, value); + + if (type != NULL) + g_variant_type_free (type); + + return value; + } + else /* tuple, dictionary entry */ + { + GVariantBuilder b; + + if (**str == '(') + g_variant_builder_init (&b, G_VARIANT_TYPE_TUPLE); + else + { + g_assert (**str == '{'); + g_variant_builder_init (&b, G_VARIANT_TYPE_DICT_ENTRY); + } + + (*str)++; /* '(' */ + while (**str != ')' && **str != '}') + g_variant_builder_add_value (&b, g_variant_valist_new (str, app)); + (*str)++; /* ')' */ + + return g_variant_builder_end (&b); + } +} + +static void +g_variant_valist_get (const gchar **str, + GVariant *value, + gboolean free, + va_list *app) +{ + if (g_variant_format_string_is_leaf (*str)) + g_variant_valist_get_leaf (str, value, free, app); + + else if (**str == 'm') + { + (*str)++; + + if (value != NULL) + value = g_variant_get_maybe (value); + + if (!g_variant_format_string_is_nnp (*str)) + { + gboolean *ptr = va_arg (*app, gboolean *); + + if (ptr != NULL) + *ptr = value != NULL; + } + + g_variant_valist_get (str, value, free, app); + + if (value != NULL) + g_variant_unref (value); + } + + else /* tuple, dictionary entry */ + { + GVariantIter iter; + + g_assert (**str == '(' || **str == '{'); + g_variant_iter_init (&iter, value); + + (*str)++; + while (**str != ')' && **str != '}') + { + value = g_variant_iter_next_value (&iter); + g_variant_valist_get (str, value, free, app); + g_variant_unref (value); + } + (*str)++; + } +} + +/* User-facing API {{{2 */ +/** + * g_variant_new: + * @format_string: a #GVariant format string + * @...: arguments, as per @format_string + * @returns: a new floating #GVariant instance + * + * Creates a new #GVariant instance. + * + * Think of this function as an analogue to g_strdup_printf(). + * + * The type of the created instance and the arguments that are + * expected by this function are determined by @format_string. See the + * section on GVariant Format + * Strings. Please note that the syntax of the format string is + * very likely to be extended in the future. + * + * The first character of the format string must not be '*' '?' '@' or + * 'r'; in essence, a new #GVariant must always be constructed by this + * function (and not merely passed through it unmodified). + * + * Since: 2.24 + **/ +GVariant * +g_variant_new (const gchar *format_string, + ...) +{ + GVariant *value; + va_list ap; + + g_return_val_if_fail (valid_format_string (format_string, TRUE, NULL) && + format_string[0] != '?' && format_string[0] != '@' && + format_string[0] != '*' && format_string[0] != 'r', + NULL); + + va_start (ap, format_string); + value = g_variant_new_va (format_string, NULL, &ap); + va_end (ap); + + return value; +} + +/** + * g_variant_new_va: + * @format_string: a string that is prefixed with a format string + * @endptr: location to store the end pointer, or %NULL + * @app: a pointer to a #va_list + * @returns: a new, usually floating, #GVariant + * + * This function is intended to be used by libraries based on + * #GVariant that want to provide g_variant_new()-like functionality + * to their users. + * + * The API is more general than g_variant_new() to allow a wider range + * of possible uses. + * + * @format_string must still point to a valid format string, but it only + * needs to be nul-terminated if @endptr is %NULL. If @endptr is + * non-%NULL then it is updated to point to the first character past the + * end of the format string. + * + * @app is a pointer to a #va_list. The arguments, according to + * @format_string, are collected from this #va_list and the list is left + * pointing to the argument following the last. + * + * These two generalisations allow mixing of multiple calls to + * g_variant_new_va() and g_variant_get_va() within a single actual + * varargs call by the user. + * + * The return value will be floating if it was a newly created GVariant + * instance (for example, if the format string was "(ii)"). In the case + * that the format_string was '*', '?', 'r', or a format starting with + * '@' then the collected #GVariant pointer will be returned unmodified, + * without adding any additional references. + * + * In order to behave correctly in all cases it is necessary for the + * calling function to g_variant_ref_sink() the return result before + * returning control to the user that originally provided the pointer. + * At this point, the caller will have their own full reference to the + * result. This can also be done by adding the result to a container, + * or by passing it to another g_variant_new() call. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_va (const gchar *format_string, + const gchar **endptr, + va_list *app) +{ + GVariant *value; + + g_return_val_if_fail (valid_format_string (format_string, !endptr, NULL), + NULL); + g_return_val_if_fail (app != NULL, NULL); + + value = g_variant_valist_new (&format_string, app); + + if (endptr != NULL) + *endptr = format_string; + + return value; +} + +/** + * g_variant_get: + * @value: a #GVariant instance + * @format_string: a #GVariant format string + * @...: arguments, as per @format_string + * + * Deconstructs a #GVariant instance. + * + * Think of this function as an analogue to scanf(). + * + * The arguments that are expected by this function are entirely + * determined by @format_string. @format_string also restricts the + * permissible types of @value. It is an error to give a value with + * an incompatible type. See the section on GVariant Format Strings. + * Please note that the syntax of the format string is very likely to be + * extended in the future. + * + * Since: 2.24 + **/ +void +g_variant_get (GVariant *value, + const gchar *format_string, + ...) +{ + va_list ap; + + g_return_if_fail (valid_format_string (format_string, TRUE, value)); + + /* if any direct-pointer-access formats are in use, flatten first */ + if (strchr (format_string, '&')) + g_variant_get_data (value); + + va_start (ap, format_string); + g_variant_get_va (value, format_string, NULL, &ap); + va_end (ap); +} + +/** + * g_variant_get_va: + * @value: a #GVariant + * @format_string: a string that is prefixed with a format string + * @endptr: location to store the end pointer, or %NULL + * @app: a pointer to a #va_list + * + * This function is intended to be used by libraries based on #GVariant + * that want to provide g_variant_get()-like functionality to their + * users. + * + * The API is more general than g_variant_get() to allow a wider range + * of possible uses. + * + * @format_string must still point to a valid format string, but it only + * need to be nul-terminated if @endptr is %NULL. If @endptr is + * non-%NULL then it is updated to point to the first character past the + * end of the format string. + * + * @app is a pointer to a #va_list. The arguments, according to + * @format_string, are collected from this #va_list and the list is left + * pointing to the argument following the last. + * + * These two generalisations allow mixing of multiple calls to + * g_variant_new_va() and g_variant_get_va() within a single actual + * varargs call by the user. + * + * Since: 2.24 + **/ +void +g_variant_get_va (GVariant *value, + const gchar *format_string, + const gchar **endptr, + va_list *app) +{ + g_return_if_fail (valid_format_string (format_string, !endptr, value)); + g_return_if_fail (value != NULL); + g_return_if_fail (app != NULL); + + /* if any direct-pointer-access formats are in use, flatten first */ + if (strchr (format_string, '&')) + g_variant_get_data (value); + + g_variant_valist_get (&format_string, value, FALSE, app); + + if (endptr != NULL) + *endptr = format_string; +} + +/* Varargs-enabled Utility Functions {{{1 */ + +/** + * g_variant_builder_add: + * @builder: a #GVariantBuilder + * @format_string: a #GVariant varargs format string + * @...: arguments, as per @format_string + * + * Adds to a #GVariantBuilder. + * + * This call is a convenience wrapper that is exactly equivalent to + * calling g_variant_new() followed by g_variant_builder_add_value(). + * + * This function might be used as follows: + * + * + * GVariant * + * make_pointless_dictionary (void) + * { + * GVariantBuilder *builder; + * int i; + * + * builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, + * NULL); + * for (i = 0; i < 16; i++) + * { + * gchar buf[3]; + * + * sprintf (buf, "%d", i); + * g_variant_builder_add (builder, "{is}", i, buf); + * } + * + * return g_variant_builder_end (builder); + * } + * + * + * Since: 2.24 + **/ +void +g_variant_builder_add (GVariantBuilder *builder, + const gchar *format_string, + ...) +{ + GVariant *variant; + va_list ap; + + va_start (ap, format_string); + variant = g_variant_new_va (format_string, NULL, &ap); + va_end (ap); + + g_variant_builder_add_value (builder, variant); +} + +/** + * g_variant_get_child: + * @value: a container #GVariant + * @index_: the index of the child to deconstruct + * @format_string: a #GVariant format string + * @...: arguments, as per @format_string + * + * Reads a child item out of a container #GVariant instance and + * deconstructs it according to @format_string. This call is + * essentially a combination of g_variant_get_child_value() and + * g_variant_get(). + * + * Since: 2.24 + **/ +void +g_variant_get_child (GVariant *value, + gsize index_, + const gchar *format_string, + ...) +{ + GVariant *child; + va_list ap; + + child = g_variant_get_child_value (value, index_); + g_return_if_fail (valid_format_string (format_string, TRUE, child)); + + va_start (ap, format_string); + g_variant_get_va (child, format_string, NULL, &ap); + va_end (ap); + + g_variant_unref (child); +} + +/** + * g_variant_iter_next: + * @iter: a #GVariantIter + * @format_string: a GVariant format string + * @...: the arguments to unpack the value into + * @returns: %TRUE if a value was unpacked, or %FALSE if there as no + * value + * + * Gets the next item in the container and unpacks it into the variable + * argument list according to @format_string, returning %TRUE. + * + * If no more items remain then %FALSE is returned. + * + * All of the pointers given on the variable arguments list of this + * function are assumed to point at uninitialised memory. It is the + * responsibility of the caller to free all of the values returned by + * the unpacking process. + * + * + * Memory management with g_variant_iter_next() + * + * /* Iterates a dictionary of type 'a{sv}' */ + * void + * iterate_dictionary (GVariant *dictionary) + * { + * GVariantIter iter; + * GVariant *value; + * gchar *key; + * + * g_variant_iter_init (&iter, dictionary); + * while (g_variant_iter_next (&iter, "{sv}", &key, &value)) + * { + * g_print ("Item '%s' has type '%s'\n", key, + * g_variant_get_type_string (value)); + * + * /* must free data for ourselves */ + * g_variant_unref (value); + * g_free (key); + * } + * } + * + * + * + * For a solution that is likely to be more convenient to C programmers + * when dealing with loops, see g_variant_iter_loop(). + * + * Since: 2.24 + **/ +gboolean +g_variant_iter_next (GVariantIter *iter, + const gchar *format_string, + ...) +{ + GVariant *value; + + value = g_variant_iter_next_value (iter); + + g_return_val_if_fail (valid_format_string (format_string, TRUE, value), + FALSE); + + if (value != NULL) + { + va_list ap; + + va_start (ap, format_string); + g_variant_valist_get (&format_string, value, FALSE, &ap); + va_end (ap); + + g_variant_unref (value); + } + + return value != NULL; +} + +/** + * g_variant_iter_loop: + * @iter: a #GVariantIter + * @format_string: a GVariant format string + * @...: the arguments to unpack the value into + * @returns: %TRUE if a value was unpacked, or %FALSE if there as no + * value + * + * Gets the next item in the container and unpacks it into the variable + * argument list according to @format_string, returning %TRUE. + * + * If no more items remain then %FALSE is returned. + * + * On the first call to this function, the pointers appearing on the + * variable argument list are assumed to point at uninitialised memory. + * On the second and later calls, it is assumed that the same pointers + * will be given and that they will point to the memory as set by the + * previous call to this function. This allows the previous values to + * be freed, as appropriate. + * + * This function is intended to be used with a while loop as + * demonstrated in the following example. This function can only be + * used when iterating over an array. It is only valid to call this + * function with a string constant for the format string and the same + * string constant must be used each time. Mixing calls to this + * function and g_variant_iter_next() or g_variant_iter_next_value() on + * the same iterator is not recommended. + * + * + * Memory management with g_variant_iter_loop() + * + * /* Iterates a dictionary of type 'a{sv}' */ + * void + * iterate_dictionary (GVariant *dictionary) + * { + * GVariantIter iter; + * GVariant *value; + * gchar *key; + * + * g_variant_iter_init (&iter, dictionary); + * while (g_variant_iter_loop (&iter, "{sv}", &key, &value)) + * { + * g_print ("Item '%s' has type '%s'\n", key, + * g_variant_get_type_string (value)); + * + * /* no need to free 'key' and 'value' here */ + * } + * } + * + * + * + * If you want a slightly less magical alternative that requires more + * typing, see g_variant_iter_next(). + * + * Since: 2.24 + **/ +gboolean +g_variant_iter_loop (GVariantIter *iter, + const gchar *format_string, + ...) +{ + gboolean first_time = GVSI(iter)->loop_format == NULL; + GVariant *value; + va_list ap; + + g_return_val_if_fail (first_time || + format_string == GVSI(iter)->loop_format, + FALSE); + + if (first_time) + { + TYPE_CHECK (GVSI(iter)->value, G_VARIANT_TYPE_ARRAY, FALSE); + GVSI(iter)->loop_format = format_string; + + if (strchr (format_string, '&')) + g_variant_get_data (GVSI(iter)->value); + } + + value = g_variant_iter_next_value (iter); + + g_return_val_if_fail (!first_time || + valid_format_string (format_string, TRUE, value), + FALSE); + + va_start (ap, format_string); + g_variant_valist_get (&format_string, value, !first_time, &ap); + va_end (ap); + + if (value != NULL) + g_variant_unref (value); + + return value != NULL; +} + +/* Serialised data {{{1 */ +static GVariant * +g_variant_deep_copy (GVariant *value) +{ + switch (g_variant_classify (value)) + { + case G_VARIANT_CLASS_MAYBE: + case G_VARIANT_CLASS_ARRAY: + case G_VARIANT_CLASS_TUPLE: + case G_VARIANT_CLASS_DICT_ENTRY: + case G_VARIANT_CLASS_VARIANT: + { + GVariantBuilder builder; + GVariantIter iter; + GVariant *child; + + g_variant_builder_init (&builder, g_variant_get_type (value)); + g_variant_iter_init (&iter, value); + + while ((child = g_variant_iter_next_value (&iter))) + { + g_variant_builder_add_value (&builder, g_variant_deep_copy (child)); + g_variant_unref (child); + } + + return g_variant_builder_end (&builder); + } + + case G_VARIANT_CLASS_BOOLEAN: + return g_variant_new_boolean (g_variant_get_boolean (value)); + + case G_VARIANT_CLASS_BYTE: + return g_variant_new_byte (g_variant_get_byte (value)); + + case G_VARIANT_CLASS_INT16: + return g_variant_new_int16 (g_variant_get_int16 (value)); + + case G_VARIANT_CLASS_UINT16: + return g_variant_new_uint16 (g_variant_get_uint16 (value)); + + case G_VARIANT_CLASS_INT32: + return g_variant_new_int32 (g_variant_get_int32 (value)); + + case G_VARIANT_CLASS_UINT32: + return g_variant_new_uint32 (g_variant_get_uint32 (value)); + + case G_VARIANT_CLASS_INT64: + return g_variant_new_int64 (g_variant_get_int64 (value)); + + case G_VARIANT_CLASS_UINT64: + return g_variant_new_uint64 (g_variant_get_uint64 (value)); + + case G_VARIANT_CLASS_HANDLE: + return g_variant_new_handle (g_variant_get_handle (value)); + + case G_VARIANT_CLASS_DOUBLE: + return g_variant_new_double (g_variant_get_double (value)); + + case G_VARIANT_CLASS_STRING: + return g_variant_new_string (g_variant_get_string (value, NULL)); + + case G_VARIANT_CLASS_OBJECT_PATH: + return g_variant_new_object_path (g_variant_get_string (value, NULL)); + + case G_VARIANT_CLASS_SIGNATURE: + return g_variant_new_signature (g_variant_get_string (value, NULL)); + } + + g_assert_not_reached (); +} + +/** + * g_variant_get_normal_form: + * @value: a #GVariant + * @returns: a trusted #GVariant + * + * Gets a #GVariant instance that has the same value as @value and is + * trusted to be in normal form. + * + * If @value is already trusted to be in normal form then a new + * reference to @value is returned. + * + * If @value is not already trusted, then it is scanned to check if it + * is in normal form. If it is found to be in normal form then it is + * marked as trusted and a new reference to it is returned. + * + * If @value is found not to be in normal form then a new trusted + * #GVariant is created with the same value as @value. + * + * It makes sense to call this function if you've received #GVariant + * data from untrusted sources and you want to ensure your serialised + * output is definitely in normal form. + * + * Since: 2.24 + **/ +GVariant * +g_variant_get_normal_form (GVariant *value) +{ + GVariant *trusted; + + if (g_variant_is_normal_form (value)) + return g_variant_ref (value); + + trusted = g_variant_deep_copy (value); + g_assert (g_variant_is_trusted (trusted)); + + return g_variant_ref_sink (trusted); +} + +/** + * g_variant_byteswap: + * @value: a #GVariant + * @returns: the byteswapped form of @value + * + * Performs a byteswapping operation on the contents of @value. The + * result is that all multi-byte numeric data contained in @value is + * byteswapped. That includes 16, 32, and 64bit signed and unsigned + * integers as well as file handles and double precision floating point + * values. + * + * This function is an identity mapping on any value that does not + * contain multi-byte numeric data. That include strings, booleans, + * bytes and containers containing only these things (recursively). + * + * The returned value is always in normal form and is marked as trusted. + * + * Since: 2.24 + **/ +GVariant * +g_variant_byteswap (GVariant *value) +{ + GVariantSerialised serialised; + GVariant *trusted; + GBuffer *buffer; + GVariant *new; + + trusted = g_variant_get_normal_form (value); + serialised.type_info = g_variant_get_type_info (trusted); + serialised.size = g_variant_get_size (trusted); + serialised.data = g_malloc (serialised.size); + g_variant_store (trusted, serialised.data); + g_variant_unref (trusted); + + g_variant_serialised_byteswap (serialised); + + buffer = g_buffer_new_take_data (serialised.data, serialised.size); + new = g_variant_new_from_buffer (g_variant_get_type (value), buffer, TRUE); + g_buffer_unref (buffer); + + return g_variant_ref_sink (new); +} + +/** + * g_variant_new_from_data: + * @type: a #GVariantType + * @data: the serialised data + * @size: the size of @data + * @trusted: %TRUE if @data is definitely in normal form + * @notify: function to call when @data is no longer needed + * @user_data: data for @notify + * @returns: a new floating #GVariant of type @type + * + * Creates a new #GVariant instance from serialised data. + * + * @type is the type of #GVariant instance that will be constructed. + * The interpretation of @data depends on knowing the type. + * + * @data is not modified by this function and must remain valid with an + * unchanging value until such a time as @notify is called with + * @user_data. If the contents of @data change before that time then + * the result is undefined. + * + * If @data is trusted to be serialised data in normal form then + * @trusted should be %TRUE. This applies to serialised data created + * within this process or read from a trusted location on the disk (such + * as a file installed in /usr/lib alongside your application). You + * should set trusted to %FALSE if @data is read from the network, a + * file in the user's home directory, etc. + * + * @notify will be called with @user_data when @data is no longer + * needed. The exact time of this call is unspecified and might even be + * before this function returns. + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_from_data (const GVariantType *type, + gconstpointer data, + gsize size, + gboolean trusted, + GDestroyNotify notify, + gpointer user_data) +{ + GVariant *value; + GBuffer *buffer; + + if (notify) + buffer = g_buffer_new_from_pointer (data, size, notify, user_data); + else + buffer = g_buffer_new_from_static_data (data, size); + + value = g_variant_new_from_buffer (type, buffer, trusted); + g_buffer_unref (buffer); + + return value; +} + +/* Epilogue {{{1 */ +#define __G_VARIANT_C__ +#include "galiasdef.c" + +/* vim:set foldmethod=marker: */ diff --git a/glib/gvariant.h b/glib/gvariant.h new file mode 100644 index 0000000..9a17157 --- /dev/null +++ b/glib/gvariant.h @@ -0,0 +1,224 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#ifndef __G_VARIANT_H__ +#define __G_VARIANT_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GVariant GVariant; + +typedef enum +{ + G_VARIANT_CLASS_BOOLEAN = 'b', + G_VARIANT_CLASS_BYTE = 'y', + G_VARIANT_CLASS_INT16 = 'n', + G_VARIANT_CLASS_UINT16 = 'q', + G_VARIANT_CLASS_INT32 = 'i', + G_VARIANT_CLASS_UINT32 = 'u', + G_VARIANT_CLASS_INT64 = 'x', + G_VARIANT_CLASS_UINT64 = 't', + G_VARIANT_CLASS_HANDLE = 'h', + G_VARIANT_CLASS_DOUBLE = 'd', + G_VARIANT_CLASS_STRING = 's', + G_VARIANT_CLASS_OBJECT_PATH = 'o', + G_VARIANT_CLASS_SIGNATURE = 'g', + G_VARIANT_CLASS_VARIANT = 'v', + G_VARIANT_CLASS_MAYBE = 'm', + G_VARIANT_CLASS_ARRAY = 'a', + G_VARIANT_CLASS_TUPLE = '(', + G_VARIANT_CLASS_DICT_ENTRY = '{' +} GVariantClass; + +void g_variant_unref (GVariant *value); +GVariant * g_variant_ref (GVariant *value); +GVariant * g_variant_ref_sink (GVariant *value); + +const GVariantType * g_variant_get_type (GVariant *value); +const gchar * g_variant_get_type_string (GVariant *value); +gboolean g_variant_is_of_type (GVariant *value, + const GVariantType *type); +gboolean g_variant_is_container (GVariant *value); +GVariantClass g_variant_classify (GVariant *value); + +GVariant * g_variant_new_boolean (gboolean boolean); +GVariant * g_variant_new_byte (guchar byte); +GVariant * g_variant_new_int16 (gint16 int16); +GVariant * g_variant_new_uint16 (guint16 uint16); +GVariant * g_variant_new_int32 (gint32 int32); +GVariant * g_variant_new_uint32 (guint32 uint32); +GVariant * g_variant_new_int64 (gint64 int64); +GVariant * g_variant_new_uint64 (guint64 uint64); +GVariant * g_variant_new_handle (gint32 handle); +GVariant * g_variant_new_double (gdouble floating); +GVariant * g_variant_new_string (const gchar *string); +GVariant * g_variant_new_object_path (const gchar *object_path); +gboolean g_variant_is_object_path (const gchar *string); +GVariant * g_variant_new_signature (const gchar *signature); +gboolean g_variant_is_signature (const gchar *string); +GVariant * g_variant_new_variant (GVariant *value); +GVariant * g_variant_new_strv (const gchar * const *strv, + gssize length); + +gboolean g_variant_get_boolean (GVariant *value); +guchar g_variant_get_byte (GVariant *value); +gint16 g_variant_get_int16 (GVariant *value); +guint16 g_variant_get_uint16 (GVariant *value); +gint32 g_variant_get_int32 (GVariant *value); +guint32 g_variant_get_uint32 (GVariant *value); +gint64 g_variant_get_int64 (GVariant *value); +guint64 g_variant_get_uint64 (GVariant *value); +gint32 g_variant_get_handle (GVariant *value); +gdouble g_variant_get_double (GVariant *value); +GVariant * g_variant_get_variant (GVariant *value); +const gchar * g_variant_get_string (GVariant *value, + gsize *length); +gchar * g_variant_dup_string (GVariant *value, + gsize *length); +const gchar ** g_variant_get_strv (GVariant *value, + gsize *length); +gchar ** g_variant_dup_strv (GVariant *value, + gsize *length); + +GVariant * g_variant_new_maybe (const GVariantType *child_type, + GVariant *child); +GVariant * g_variant_new_array (const GVariantType *child_type, + GVariant * const *children, + gsize n_children); +GVariant * g_variant_new_tuple (GVariant * const *children, + gsize n_children); +GVariant * g_variant_new_dict_entry (GVariant *key, + GVariant *value); + +GVariant * g_variant_get_maybe (GVariant *value); +gsize g_variant_n_children (GVariant *value); +void g_variant_get_child (GVariant *value, + gsize index_, + const gchar *format_string, + ...); +GVariant * g_variant_get_child_value (GVariant *value, + gsize index_); +gconstpointer g_variant_get_fixed_array (GVariant *value, + gsize *n_elements, + gsize element_size); + +gsize g_variant_get_size (GVariant *value); +gconstpointer g_variant_get_data (GVariant *value); +void g_variant_store (GVariant *value, + gpointer data); + +gchar * g_variant_print (GVariant *value, + gboolean type_annotate); +GString * g_variant_print_string (GVariant *value, + GString *string, + gboolean type_annotate); + +guint g_variant_hash (gconstpointer value); +gboolean g_variant_equal (gconstpointer one, + gconstpointer two); + +GVariant * g_variant_get_normal_form (GVariant *value); +gboolean g_variant_is_normal_form (GVariant *value); +GVariant * g_variant_byteswap (GVariant *value); +GVariant * g_variant_new_from_data (const GVariantType *type, + gconstpointer data, + gsize size, + gboolean trusted, + GDestroyNotify notify, + gpointer user_data); + +typedef struct _GVariantIter GVariantIter; +struct _GVariantIter { + /*< private >*/ + gsize x[16]; +}; + +GVariantIter * g_variant_iter_new (GVariant *value); +gsize g_variant_iter_init (GVariantIter *iter, + GVariant *value); +GVariantIter * g_variant_iter_copy (GVariantIter *iter); +gsize g_variant_iter_n_children (GVariantIter *iter); +void g_variant_iter_free (GVariantIter *iter); +GVariant * g_variant_iter_next_value (GVariantIter *iter); +gboolean g_variant_iter_next (GVariantIter *iter, + const gchar *format_string, + ...); +gboolean g_variant_iter_loop (GVariantIter *iter, + const gchar *format_string, + ...); + + +typedef struct _GVariantBuilder GVariantBuilder; +struct _GVariantBuilder { + /*< private >*/ + gsize x[16]; +}; + +#define G_VARIANT_PARSE_ERROR (g_variant_parser_get_error_quark ()) +GQuark g_variant_parser_get_error_quark (void); + +GVariantBuilder * g_variant_builder_new (const GVariantType *type); +void g_variant_builder_unref (GVariantBuilder *builder); +GVariantBuilder * g_variant_builder_ref (GVariantBuilder *builder); +void g_variant_builder_init (GVariantBuilder *builder, + const GVariantType *type); +GVariant * g_variant_builder_end (GVariantBuilder *builder); +void g_variant_builder_clear (GVariantBuilder *builder); +void g_variant_builder_open (GVariantBuilder *builder, + const GVariantType *type); +void g_variant_builder_close (GVariantBuilder *builder); +void g_variant_builder_add_value (GVariantBuilder *builder, + GVariant *value); +void g_variant_builder_add (GVariantBuilder *builder, + const gchar *format_string, + ...); + +GVariant * g_variant_new (const gchar *format_string, + ...); +void g_variant_get (GVariant *value, + const gchar *format_string, + ...); +GVariant * g_variant_new_va (const gchar *format_string, + const gchar **endptr, + va_list *app); +void g_variant_get_va (GVariant *value, + const gchar *format_string, + const gchar **endptr, + va_list *app); + + +GVariant * g_variant_parse (const GVariantType *type, + const gchar *text, + const gchar *limit, + const gchar **endptr, + GError **error); +GVariant * g_variant_new_parsed (const gchar *format, + ...); +GVariant * g_variant_new_parsed_va (const gchar *format, + va_list *app); + +G_END_DECLS + +#endif /* __G_VARIANT_H__ */ diff --git a/glib/gvarianttype.c b/glib/gvarianttype.c new file mode 100644 index 0000000..1c1d158 --- /dev/null +++ b/glib/gvarianttype.c @@ -0,0 +1,1494 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#include "config.h" + +#include "gvarianttype.h" + +#include +#include + +#include + +#include "galias.h" + +/** + * SECTION: gvarianttype + * @title: GVariantType + * @short_description: introduction to the GVariant type system + * @see_also: #GVariantType, #GVariant + * + * This section introduces the GVariant type system. It is based, in + * large part, on the DBus type system, with two major changes and some minor + * lifting of restrictions. The DBus + * specification, therefore, provides a significant amount of + * information that is useful when working with GVariant. + * + * The first major change with respect to the DBus type system is the + * introduction of maybe (or "nullable") types. Any type in GVariant can be + * converted to a maybe type, in which case, "nothing" (or "null") becomes a + * valid value. Maybe types have been added by introducing the + * character "m" to type strings. + * + * The second major change is that the GVariant type system supports the + * concept of "indefinite types" -- types that are less specific than + * the normal types found in DBus. For example, it is possible to speak + * of "an array of any type" in GVariant, where the DBus type system + * would require you to speak of "an array of integers" or "an array of + * strings". Indefinite types have been added by introducing the + * characters "*", "?" and + * "r" to type strings. + * + * Finally, all arbitrary restrictions relating to the complexity of + * types are lifted along with the restriction that dictionary entries + * may only appear nested inside of arrays. + * + * Just as in DBus, GVariant types are described with strings ("type + * strings"). Subject to the differences mentioned above, these strings + * are of the same form as those found in DBus. Note, however: DBus + * always works in terms of messages and therefore individual type + * strings appear nowhere in its interface. Instead, "signatures" + * are a concatenation of the strings of the type of each argument in a + * message. GVariant deals with single values directly so GVariant type + * strings always describe the type of exactly one value. This means + * that a DBus signature string is generally not a valid GVariant type + * string -- except in the case that it is the signature of a message + * containing exactly one argument. + * + * An indefinite type is similar in spirit to what may be called an + * abstract type in other type systems. No value can exist that has an + * indefinite type as its type, but values can exist that have types + * that are subtypes of indefinite types. That is to say, + * g_variant_get_type() will never return an indefinite type, but + * calling g_variant_is_a() with an indefinite type may return %TRUE. + * For example, you can not have a value that represents "an array of no + * particular type", but you can have an "array of integers" which + * certainly matches the type of "an array of no particular type", since + * "array of integers" is a subtype of "array of no particular type". + * + * This is similar to how instances of abstract classes may not + * directly exist in other type systems, but instances of their + * non-abstract subtypes may. For example, in GTK, no object that has + * the type of #GtkBin can exist (since #GtkBin is an abstract class), + * but a #GtkWindow can certainly be instantiated, and you would say + * that the #GtkWindow is a #GtkBin (since #GtkWindow is a subclass of + * #GtkBin). + * + * A detailed description of GVariant type strings is given here: + * + * + * GVariant Type Strings + * + * A GVariant type string can be any of the following: + * + * + * + * + * any basic type string (listed below) + * + * + * + * + * "v", "r" or + * "*" + * + * + * + * + * one of the characters 'a' or + * 'm', followed by another type string + * + * + * + * + * the character '(', followed by a concatenation + * of zero or more other type strings, followed by the character + * ')' + * + * + * + * + * the character '{', followed by a basic type + * string (see below), followed by another type string, followed by + * the character '}' + * + * + * + * + * A basic type string describes a basic type (as per + * g_variant_type_is_basic()) and is always a single + * character in length. The valid basic type strings are + * "b", "y", + * "n", "q", + * "i", "u", + * "x", "t", + * "h", "d", + * "s", "o", + * "g" and "?". + * + * + * The above definition is recursive to arbitrary depth. + * "aaaaai" and "(ui(nq((y)))s)" + * are both valid type strings, as is + * "a(aa(ui)(qna{ya(yd)}))". + * + * + * The meaning of each of the characters is as follows: + * + * + * + * + * + * + * + * Character + * + * + * + * + * Meaning + * + * + * + * + * + * + * b + * + * + * + * + * the type string of %G_VARIANT_TYPE_BOOLEAN; a boolean value. + * + * + * + * + * + * + * y + * + * + * + * + * the type string of %G_VARIANT_TYPE_BYTE; a byte. + * + * + * + * + * + * + * n + * + * + * + * + * the type string of %G_VARIANT_TYPE_INT16; a signed 16 bit + * integer. + * + * + * + * + * + * + * q + * + * + * + * + * the type string of %G_VARIANT_TYPE_UINT16; an unsigned 16 bit + * integer. + * + * + * + * + * + * + * i + * + * + * + * + * the type string of %G_VARIANT_TYPE_INT32; a signed 32 bit + * integer. + * + * + * + * + * + * + * u + * + * + * + * + * the type string of %G_VARIANT_TYPE_UINT32; an unsigned 32 bit + * integer. + * + * + * + * + * + * + * x + * + * + * + * + * the type string of %G_VARIANT_TYPE_INT64; a signed 64 bit + * integer. + * + * + * + * + * + * + * t + * + * + * + * + * the type string of %G_VARIANT_TYPE_UINT64; an unsigned 64 bit + * integer. + * + * + * + * + * + * + * h + * + * + * + * + * the type string of %G_VARIANT_TYPE_HANDLE; a signed 32 bit + * value that, by convention, is used as an index into an array + * of file descriptors that are sent alongside a DBus message. + * + * + * + * + * + * + * d + * + * + * + * + * the type string of %G_VARIANT_TYPE_DOUBLE; a double precision + * floating point value. + * + * + * + * + * + * + * s + * + * + * + * + * the type string of %G_VARIANT_TYPE_STRING; a string. + * + * + * + * + * + * + * o + * + * + * + * + * the type string of %G_VARIANT_TYPE_OBJECT_PATH; a string in + * the form of a DBus object path. + * + * + * + * + * + * + * g + * + * + * + * + * the type string of %G_VARIANT_TYPE_STRING; a string in the + * form of a DBus type signature. + * + * + * + * + * + * + * ? + * + * + * + * + * the type string of %G_VARIANT_TYPE_BASIC; an indefinite type + * that is a supertype of any of the basic types. + * + * + * + * + * + * + * v + * + * + * + * + * the type string of %G_VARIANT_TYPE_VARIANT; a container type + * that contain any other type of value. + * + * + * + * + * + * + * a + * + * + * + * + * used as a prefix on another type string to mean an array of + * that type; the type string "ai", for + * example, is the type of an array of 32 bit signed integers. + * + * + * + * + * + * + * m + * + * + * + * + * used as a prefix on another type string to mean a "maybe", or + * "nullable", version of that type; the type string + * "ms", for example, is the type of a value + * that maybe contains a string, or maybe contains nothing. + * + * + * + * + * + * + * () + * + * + * + * + * used to enclose zero or more other concatenated type strings + * to create a tuple type; the type string + * "(is)", for example, is the type of a pair + * of an integer and a string. + * + * + * + * + * + * + * r + * + * + * + * + * the type string of %G_VARIANT_TYPE_TUPLE; an indefinite type + * that is a supertype of any tuple type, regardless of the + * number of items. + * + * + * + * + * + * + * {} + * + * + * + * + * used to enclose a basic type string concatenated with another + * type string to create a dictionary entry type, which usually + * appears inside of an array to form a dictionary; the type + * string "a{sd}", for example, is the type of + * a dictionary that maps strings to double precision floating + * point values. + * + * + * The first type (the basic type) is the key type and the second + * type is the value type. The reason that the first type is + * restricted to being a basic type is so that it can easily be + * hashed. + * + * + * + * + * + * + * * + * + * + * + * + * the type string of %G_VARIANT_TYPE_ANY; the indefinite type + * that is a supertype of all types. Note that, as with all type + * strings, this character represents exactly one type. It + * cannot be used inside of tuples to mean "any number of items". + * + * + * + * + * + * + * + * Any type string of a container that contains an indefinite type is, + * itself, an indefinite type. For example, the type string + * "a*" (corresponding to %G_VARIANT_TYPE_ARRAY) is + * an indefinite type that is a supertype of every array type. + * "(*s)" is a supertype of all tuples that + * contain exactly two items where the second item is a string. + * + * + * "a{?*}" is an indefinite type that is a + * supertype of all arrays containing dictionary entries where the key + * is any basic type and the value is any type at all. This is, by + * definition, a dictionary, so this type string corresponds to + * %G_VARIANT_TYPE_DICTIONARY. Note that, due to the restriction that + * the key of a dictionary entry must be a basic type, + * "{**}" is not a valid type string. + * + * + */ + + +static gboolean +g_variant_type_check (const GVariantType *type) +{ + const gchar *type_string; + + if (type == NULL) + return FALSE; + + type_string = (const gchar *) type; +#ifndef G_DISABLE_CHECKS + return g_variant_type_string_scan (type_string, NULL, NULL); +#else + return TRUE; +#endif +} + +/** + * g_variant_type_string_scan: + * @string: a pointer to any string + * @limit: the end of @string, or %NULL + * @endptr: location to store the end pointer, or %NULL + * @returns: %TRUE if a valid type string was found + * + * Scan for a single complete and valid GVariant type string in @string. + * The memory pointed to by @limit (or bytes beyond it) is never + * accessed. + * + * If a valid type string is found, @endptr is updated to point to the + * first character past the end of the string that was found and %TRUE + * is returned. + * + * If there is no valid type string starting at @string, or if the type + * string does not end before @limit then %FALSE is returned. + * + * For the simple case of checking if a string is a valid type string, + * see g_variant_type_string_is_valid(). + * + * Since: 2.24 + **/ +gboolean +g_variant_type_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr) +{ + g_return_val_if_fail (string != NULL, FALSE); + + if (string == limit || *string == '\0') + return FALSE; + + switch (*string++) + { + case '(': + while (string == limit || *string != ')') + if (!g_variant_type_string_scan (string, limit, &string)) + return FALSE; + + string++; + break; + + case '{': + if (string == limit || *string == '\0' || /* { */ + !strchr ("bynqihuxtdsog?", *string++) || /* key */ + !g_variant_type_string_scan (string, limit, &string) || /* value */ + string == limit || *string++ != '}') /* } */ + return FALSE; + + break; + + case 'm': case 'a': + return g_variant_type_string_scan (string, limit, endptr); + + case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': + case 'x': case 't': case 'd': case 's': case 'o': case 'g': + case 'v': case 'r': case '*': case '?': case 'h': + break; + + default: + return FALSE; + } + + if (endptr != NULL) + *endptr = string; + + return TRUE; +} + +/** + * g_variant_type_string_is_valid: + * @type_string: a pointer to any string + * @returns: %TRUE if @type_string is exactly one valid type string + * + * Checks if @type_string is a valid GVariant type string. This call is + * equivalent to calling g_variant_type_string_scan() and confirming + * that the following character is a nul terminator. + * + * Since 2.24 + **/ +gboolean +g_variant_type_string_is_valid (const gchar *type_string) +{ + const gchar *endptr; + + g_return_val_if_fail (type_string != NULL, FALSE); + + if (!g_variant_type_string_scan (type_string, NULL, &endptr)) + return FALSE; + + return *endptr == '\0'; +} + +/** + * g_variant_type_free: + * @type: a #GVariantType, or %NULL + * + * Frees a #GVariantType that was allocated with + * g_variant_type_copy(), g_variant_type_new() or one of the container + * type constructor functions. + * + * In the case that @type is %NULL, this function does nothing. + * + * Since 2.24 + **/ +void +g_variant_type_free (GVariantType *type) +{ + g_return_if_fail (type == NULL || g_variant_type_check (type)); + + g_free (type); +} + +/** + * g_variant_type_copy: + * @type: a #GVariantType + * @returns: a new #GVariantType + * + * Makes a copy of a #GVariantType. It is appropriate to call + * g_variant_type_free() on the return value. @type may not be %NULL. + * + * Since 2.24 + **/ +GVariantType * +g_variant_type_copy (const GVariantType *type) +{ + gsize length; + gchar *new; + + g_return_val_if_fail (g_variant_type_check (type), NULL); + + length = g_variant_type_get_string_length (type); + new = g_malloc (length + 1); + + memcpy (new, type, length); + new[length] = '\0'; + + return (GVariantType *) new; +} + +/** + * g_variant_type_new: + * @type_string: a valid GVariant type string + * @returns: a new #GVariantType + * + * Creates a new #GVariantType corresponding to the type string given + * by @type_string. It is appropriate to call g_variant_type_free() on + * the return value. + * + * It is a programmer error to call this function with an invalid type + * string. Use g_variant_type_string_is_valid() if you are unsure. + * + * Since: 2.24 + */ +GVariantType * +g_variant_type_new (const gchar *type_string) +{ + g_return_val_if_fail (type_string != NULL, NULL); + + return g_variant_type_copy (G_VARIANT_TYPE (type_string)); +} + +/** + * g_variant_type_get_string_length: + * @type: a #GVariantType + * @returns: the length of the corresponding type string + * + * Returns the length of the type string corresponding to the given + * @type. This function must be used to determine the valid extent of + * the memory region returned by g_variant_type_peek_string(). + * + * Since 2.24 + **/ +gsize +g_variant_type_get_string_length (const GVariantType *type) +{ + const gchar *type_string = (const gchar *) type; + gint brackets = 0; + gsize index = 0; + + g_return_val_if_fail (g_variant_type_check (type), 0); + + do + { + while (type_string[index] == 'a' || type_string[index] == 'm') + index++; + + if (type_string[index] == '(' || type_string[index] == '{') + brackets++; + + else if (type_string[index] == ')' || type_string[index] == '}') + brackets--; + + index++; + } + while (brackets); + + return index; +} + +/** + * g_variant_type_peek_string: + * @type: a #GVariantType + * @returns: the corresponding type string (not nul-terminated) + * + * Returns the type string corresponding to the given @type. The + * result is not nul-terminated; in order to determine its length you + * must call g_variant_type_get_string_length(). + * + * To get a nul-terminated string, see g_variant_type_dup_string(). + * + * Since 2.24 + **/ +const gchar * +g_variant_type_peek_string (const GVariantType *type) +{ + g_return_val_if_fail (g_variant_type_check (type), NULL); + + return (const gchar *) type; +} + +/** + * g_variant_type_dup_string: + * @type: a #GVariantType + * @returns: the corresponding type string + * + * Returns a newly-allocated copy of the type string corresponding to + * @type. The returned string is nul-terminated. It is appropriate to + * call g_free() on the return value. + * + * Since 2.24 + **/ +gchar * +g_variant_type_dup_string (const GVariantType *type) +{ + g_return_val_if_fail (g_variant_type_check (type), NULL); + + return g_strndup (g_variant_type_peek_string (type), + g_variant_type_get_string_length (type)); +} + +/** + * g_variant_type_is_definite: + * @type: a #GVariantType + * @returns: %TRUE if @type is definite + * + * Determines if the given @type is definite (ie: not indefinite). + * + * A type is definite if its type string does not contain any indefinite + * type characters ('*', '?', or 'r'). + * + * A #GVariant instance may not have an indefinite type, so calling + * this function on the result of g_variant_get_type() will always + * result in %TRUE being returned. Calling this function on an + * indefinite type like %G_VARIANT_TYPE_ARRAY, however, will result in + * %FALSE being returned. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_definite (const GVariantType *type) +{ + const gchar *type_string; + gsize type_length; + gsize i; + + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + type_length = g_variant_type_get_string_length (type); + type_string = g_variant_type_peek_string (type); + + for (i = 0; i < type_length; i++) + if (type_string[i] == '*' || + type_string[i] == '?' || + type_string[i] == 'r') + return FALSE; + + return TRUE; +} + +/** + * g_variant_type_is_container: + * @type: a #GVariantType + * @returns: %TRUE if @type is a container type + * + * Determines if the given @type is a container type. + * + * Container types are any array, maybe, tuple, or dictionary + * entry types plus the variant type. + * + * This function returns %TRUE for any indefinite type for which every + * definite subtype is a container -- %G_VARIANT_TYPE_ARRAY, for + * example. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_container (const GVariantType *type) +{ + gchar first_char; + + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + first_char = g_variant_type_peek_string (type)[0]; + switch (first_char) + { + case 'a': + case 'm': + case 'r': + case '(': + case '{': + case 'v': + return TRUE; + + default: + return FALSE; + } +} + +/** + * g_variant_type_is_basic: + * @type: a #GVariantType + * @returns: %TRUE if @type is a basic type + * + * Determines if the given @type is a basic type. + * + * Basic types are booleans, bytes, integers, doubles, strings, object + * paths and signatures. + * + * Only a basic type may be used as the key of a dictionary entry. + * + * This function returns %FALSE for all indefinite types except + * %G_VARIANT_TYPE_BASIC. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_basic (const GVariantType *type) +{ + gchar first_char; + + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + first_char = g_variant_type_peek_string (type)[0]; + switch (first_char) + { + case 'b': + case 'y': + case 'n': + case 'q': + case 'i': + case 'h': + case 'u': + case 't': + case 'x': + case 'd': + case 's': + case 'o': + case 'g': + case '?': + return TRUE; + + default: + return FALSE; + } +} + +/** + * g_variant_type_is_maybe: + * @type: a #GVariantType + * @returns: %TRUE if @type is a maybe type + * + * Determines if the given @type is a maybe type. This is true if the + * type string for @type starts with an 'm'. + * + * This function returns %TRUE for any indefinite type for which every + * definite subtype is a maybe type -- %G_VARIANT_TYPE_MAYBE, for + * example. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_maybe (const GVariantType *type) +{ + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + return g_variant_type_peek_string (type)[0] == 'm'; +} + +/** + * g_variant_type_is_array: + * @type: a #GVariantType + * @returns: %TRUE if @type is an array type + * + * Determines if the given @type is an array type. This is true if the + * type string for @type starts with an 'a'. + * + * This function returns %TRUE for any indefinite type for which every + * definite subtype is an array type -- %G_VARIANT_TYPE_ARRAY, for + * example. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_array (const GVariantType *type) +{ + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + return g_variant_type_peek_string (type)[0] == 'a'; +} + +/** + * g_variant_type_is_tuple: + * @type: a #GVariantType + * @returns: %TRUE if @type is a tuple type + * + * Determines if the given @type is a tuple type. This is true if the + * type string for @type starts with a '(' or if @type is + * %G_VARIANT_TYPE_TUPLE. + * + * This function returns %TRUE for any indefinite type for which every + * definite subtype is a tuple type -- %G_VARIANT_TYPE_TUPLE, for + * example. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_tuple (const GVariantType *type) +{ + gchar type_char; + + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + type_char = g_variant_type_peek_string (type)[0]; + return type_char == 'r' || type_char == '('; +} + +/** + * g_variant_type_is_dict_entry: + * @type: a #GVariantType + * @returns: %TRUE if @type is a dictionary entry type + * + * Determines if the given @type is a dictionary entry type. This is + * true if the type string for @type starts with a '{'. + * + * This function returns %TRUE for any indefinite type for which every + * definite subtype is a dictionary entry type -- + * %G_VARIANT_TYPE_DICT_ENTRY, for example. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_dict_entry (const GVariantType *type) +{ + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + return g_variant_type_peek_string (type)[0] == '{'; +} + +/** + * g_variant_type_is_variant: + * @type: a #GVariantType + * @returns: %TRUE if @type is the variant type + * + * Determines if the given @type is the variant type. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_variant (const GVariantType *type) +{ + g_return_val_if_fail (g_variant_type_check (type), FALSE); + + return g_variant_type_peek_string (type)[0] == 'v'; +} + +/** + * g_variant_type_hash: + * @type: a #GVariantType + * @returns: the hash value + * + * Hashes @type. + * + * The argument type of @type is only #gconstpointer to allow use with + * #GHashTable without function pointer casting. A valid + * #GVariantType must be provided. + * + * Since 2.24 + **/ +guint +g_variant_type_hash (gconstpointer type) +{ + const gchar *type_string; + guint value = 0; + gsize length; + gsize i; + + g_return_val_if_fail (g_variant_type_check (type), 0); + + type_string = g_variant_type_peek_string (type); + length = g_variant_type_get_string_length (type); + + for (i = 0; i < length; i++) + value = (value << 5) - value + type_string[i]; + + return value; +} + +/** + * g_variant_type_equal: + * @type1: a #GVariantType + * @type2: a #GVariantType + * @returns: %TRUE if @type1 and @type2 are exactly equal + * + * Compares @type1 and @type2 for equality. + * + * Only returns %TRUE if the types are exactly equal. Even if one type + * is an indefinite type and the other is a subtype of it, %FALSE will + * be returned if they are not exactly equal. If you want to check for + * subtypes, use g_variant_type_is_subtype_of(). + * + * The argument types of @type1 and @type2 are only #gconstpointer to + * allow use with #GHashTable without function pointer casting. For + * both arguments, a valid #GVariantType must be provided. + * + * Since 2.24 + **/ +gboolean +g_variant_type_equal (gconstpointer type1, + gconstpointer type2) +{ + const gchar *string1, *string2; + gsize size1, size2; + + g_return_val_if_fail (g_variant_type_check (type1), FALSE); + g_return_val_if_fail (g_variant_type_check (type2), FALSE); + + if (type1 == type2) + return TRUE; + + size1 = g_variant_type_get_string_length (type1); + size2 = g_variant_type_get_string_length (type2); + + if (size1 != size2) + return FALSE; + + string1 = g_variant_type_peek_string (type1); + string2 = g_variant_type_peek_string (type2); + + return memcmp (string1, string2, size1) == 0; +} + +/** + * g_variant_type_is_subtype_of: + * @type: a #GVariantType + * @supertype: a #GVariantType + * @returns: %TRUE if @type is a subtype of @supertype + * + * Checks if @type is a subtype of @supertype. + * + * This function returns %TRUE if @type is a subtype of @supertype. All + * types are considered to be subtypes of themselves. Aside from that, + * only indefinite types can have subtypes. + * + * Since 2.24 + **/ +gboolean +g_variant_type_is_subtype_of (const GVariantType *type, + const GVariantType *supertype) +{ + const gchar *supertype_string; + const gchar *supertype_end; + const gchar *type_string; + + g_return_val_if_fail (g_variant_type_check (type), FALSE); + g_return_val_if_fail (g_variant_type_check (supertype), FALSE); + + supertype_string = g_variant_type_peek_string (supertype); + type_string = g_variant_type_peek_string (type); + + supertype_end = supertype_string + + g_variant_type_get_string_length (supertype); + + /* we know that type and supertype are both well-formed, so it's + * safe to treat this merely as a text processing problem. + */ + while (supertype_string < supertype_end) + { + char supertype_char = *supertype_string++; + + if (supertype_char == *type_string) + type_string++; + + else if (*type_string == ')') + return FALSE; + + else + { + const GVariantType *target_type = (GVariantType *) type_string; + + switch (supertype_char) + { + case 'r': + if (!g_variant_type_is_tuple (target_type)) + return FALSE; + break; + + case '*': + break; + + case '?': + if (!g_variant_type_is_basic (target_type)) + return FALSE; + break; + + default: + return FALSE; + } + + type_string += g_variant_type_get_string_length (target_type); + } + } + + return TRUE; +} + +/** + * g_variant_type_element: + * @type: an array or maybe #GVariantType + * @returns: the element type of @type + * + * Determines the element type of an array or maybe type. + * + * This function may only be used with array or maybe types. + * + * Since 2.24 + **/ +const GVariantType * +g_variant_type_element (const GVariantType *type) +{ + const gchar *type_string; + + g_return_val_if_fail (g_variant_type_check (type), NULL); + + type_string = g_variant_type_peek_string (type); + + g_assert (type_string[0] == 'a' || type_string[0] == 'm'); + + return (const GVariantType *) &type_string[1]; +} + +/** + * g_variant_type_first: + * @type: a tuple or dictionary entry #GVariantType + * @returns: the first item type of @type, or %NULL + * + * Determines the first item type of a tuple or dictionary entry + * type. + * + * This function may only be used with tuple or dictionary entry types, + * but must not be used with the generic tuple type + * %G_VARIANT_TYPE_TUPLE. + * + * In the case of a dictionary entry type, this returns the type of + * the key. + * + * %NULL is returned in case of @type being %G_VARIANT_TYPE_UNIT. + * + * This call, together with g_variant_type_next() provides an iterator + * interface over tuple and dictionary entry types. + * + * Since 2.24 + **/ +const GVariantType * +g_variant_type_first (const GVariantType *type) +{ + const gchar *type_string; + + g_return_val_if_fail (g_variant_type_check (type), NULL); + + type_string = g_variant_type_peek_string (type); + g_assert (type_string[0] == '(' || type_string[0] == '{'); + + if (type_string[1] == ')') + return NULL; + + return (const GVariantType *) &type_string[1]; +} + +/** + * g_variant_type_next: + * @type: a #GVariantType from a previous call + * @returns: the next #GVariantType after @type, or %NULL + * + * Determines the next item type of a tuple or dictionary entry + * type. + * + * @type must be the result of a previous call to + * g_variant_type_first() or g_variant_type_next(). + * + * If called on the key type of a dictionary entry then this call + * returns the value type. If called on the value type of a dictionary + * entry then this call returns %NULL. + * + * For tuples, %NULL is returned when @type is the last item in a tuple. + * + * Since 2.24 + **/ +const GVariantType * +g_variant_type_next (const GVariantType *type) +{ + const gchar *type_string; + + g_return_val_if_fail (g_variant_type_check (type), NULL); + + type_string = g_variant_type_peek_string (type); + type_string += g_variant_type_get_string_length (type); + + if (*type_string == ')' || *type_string == '}') + return NULL; + + return (const GVariantType *) type_string; +} + +/** + * g_variant_type_n_items: + * @type: a tuple or dictionary entry #GVariantType + * @returns: the number of items in @type + * + * Determines the number of items contained in a tuple or + * dictionary entry type. + * + * This function may only be used with tuple or dictionary entry types, + * but must not be used with the generic tuple type + * %G_VARIANT_TYPE_TUPLE. + * + * In the case of a dictionary entry type, this function will always + * return 2. + * + * Since 2.24 + **/ +gsize +g_variant_type_n_items (const GVariantType *type) +{ + gsize count = 0; + + g_return_val_if_fail (g_variant_type_check (type), 0); + + for (type = g_variant_type_first (type); + type; + type = g_variant_type_next (type)) + count++; + + return count; +} + +/** + * g_variant_type_key: + * @type: a dictionary entry #GVariantType + * @returns: the key type of the dictionary entry + * + * Determines the key type of a dictionary entry type. + * + * This function may only be used with a dictionary entry type. Other + * than the additional restriction, this call is equivalent to + * g_variant_type_first(). + * + * Since 2.24 + **/ +const GVariantType * +g_variant_type_key (const GVariantType *type) +{ + const gchar *type_string; + + g_return_val_if_fail (g_variant_type_check (type), NULL); + + type_string = g_variant_type_peek_string (type); + g_assert (type_string[0] == '{'); + + return (const GVariantType *) &type_string[1]; +} + +/** + * g_variant_type_value: + * @type: a dictionary entry #GVariantType + * @returns: the value type of the dictionary entry + * + * Determines the value type of a dictionary entry type. + * + * This function may only be used with a dictionary entry type. + * + * Since 2.24 + **/ +const GVariantType * +g_variant_type_value (const GVariantType *type) +{ + const gchar *type_string; + + g_return_val_if_fail (g_variant_type_check (type), NULL); + + type_string = g_variant_type_peek_string (type); + g_assert (type_string[0] == '{'); + + return g_variant_type_next (g_variant_type_key (type)); +} + +/** + * g_variant_type_new_tuple: + * @items: an array of #GVariantTypes, one for each item + * @length: the length of @items, or -1 + * @returns: a new tuple #GVariantType + * + * Constructs a new tuple type, from @items. + * + * @length is the number of items in @items, or -1 to indicate that + * @items is %NULL-terminated. + * + * It is appropriate to call g_variant_type_free() on the return value. + * + * Since 2.24 + **/ +static GVariantType * +g_variant_type_new_tuple_slow (const GVariantType * const *items, + gint length) +{ + /* the "slow" version is needed in case the static buffer of 1024 + * bytes is exceeded when running the normal version. this will + * happen only in truly insane code, so it can be slow. + */ + GString *string; + gsize i; + + string = g_string_new ("("); + for (i = 0; i < length; i++) + { + const GVariantType *type; + gsize size; + + g_return_val_if_fail (g_variant_type_check (items[i]), NULL); + + type = items[i]; + size = g_variant_type_get_string_length (type); + g_string_append_len (string, (const gchar *) type, size); + } + g_string_append_c (string, ')'); + + return (GVariantType *) g_string_free (string, FALSE); +} + +GVariantType * +g_variant_type_new_tuple (const GVariantType * const *items, + gint length) +{ + char buffer[1024]; + gsize offset; + gsize i; + + g_return_val_if_fail (length == 0 || items != NULL, NULL); + + if (length < 0) + for (length = 0; items[length] != NULL; length++); + + offset = 0; + buffer[offset++] = '('; + + for (i = 0; i < length; i++) + { + const GVariantType *type; + gsize size; + + g_return_val_if_fail (g_variant_type_check (items[i]), NULL); + + type = items[i]; + size = g_variant_type_get_string_length (type); + + if (offset + size >= sizeof buffer) /* leave room for ')' */ + return g_variant_type_new_tuple_slow (items, length); + + memcpy (&buffer[offset], type, size); + offset += size; + } + + g_assert (offset < sizeof buffer); + buffer[offset++] = ')'; + + return (GVariantType *) g_memdup (buffer, offset); +} + +/** + * g_variant_type_new_array: + * @element: a #GVariantType + * @returns: a new array #GVariantType + * + * Constructs the type corresponding to an array of elements of the + * type @type. + * + * It is appropriate to call g_variant_type_free() on the return value. + * + * Since 2.24 + **/ +GVariantType * +g_variant_type_new_array (const GVariantType *element) +{ + gsize size; + gchar *new; + + g_return_val_if_fail (g_variant_type_check (element), NULL); + + size = g_variant_type_get_string_length (element); + new = g_malloc (size + 1); + + new[0] = 'a'; + memcpy (new + 1, element, size); + + return (GVariantType *) new; +} + +/** + * g_variant_type_new_maybe: + * @element: a #GVariantType + * @returns: a new maybe #GVariantType + * + * Constructs the type corresponding to a maybe instance containing + * type @type or Nothing. + * + * It is appropriate to call g_variant_type_free() on the return value. + * + * Since 2.24 + **/ +GVariantType * +g_variant_type_new_maybe (const GVariantType *element) +{ + gsize size; + gchar *new; + + g_return_val_if_fail (g_variant_type_check (element), NULL); + + size = g_variant_type_get_string_length (element); + new = g_malloc (size + 1); + + new[0] = 'm'; + memcpy (new + 1, element, size); + + return (GVariantType *) new; +} + +/** + * g_variant_type_new_dict_entry: + * @key: a basic #GVariantType + * @value: a #GVariantType + * @returns: a new dictionary entry #GVariantType + * + * Constructs the type corresponding to a dictionary entry with a key + * of type @key and a value of type @value. + * + * It is appropriate to call g_variant_type_free() on the return value. + * + * Since 2.24 + **/ +GVariantType * +g_variant_type_new_dict_entry (const GVariantType *key, + const GVariantType *value) +{ + gsize keysize, valsize; + gchar *new; + + g_return_val_if_fail (g_variant_type_check (key), NULL); + g_return_val_if_fail (g_variant_type_check (value), NULL); + + keysize = g_variant_type_get_string_length (key); + valsize = g_variant_type_get_string_length (value); + + new = g_malloc (1 + keysize + valsize + 1); + + new[0] = '{'; + memcpy (new + 1, key, keysize); + memcpy (new + 1 + keysize, value, valsize); + new[1 + keysize + valsize] = '}'; + + return (GVariantType *) new; +} + +/* private */ +const GVariantType * +g_variant_type_checked_ (const gchar *type_string) +{ + g_return_val_if_fail (g_variant_type_string_is_valid (type_string), NULL); + return (const GVariantType *) type_string; +} + +#define __G_VARIANT_TYPE_C__ +#include "galiasdef.c" diff --git a/glib/gvarianttype.h b/glib/gvarianttype.h new file mode 100644 index 0000000..1a477d6 --- /dev/null +++ b/glib/gvarianttype.h @@ -0,0 +1,305 @@ +/* + * Copyright © 2007, 2008 Ryan Lortie + * Copyright © 2009, 2010 Codethink Limited + * + * 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 of the licence, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#ifndef __G_VARIANT_TYPE_H__ +#define __G_VARIANT_TYPE_H__ + +#include +#include + +G_BEGIN_DECLS + +/** + * GVariantType: + * + * A type in the GVariant type system. + * + * Two types may not be compared by value; use g_variant_type_equal() or + * g_variant_type_is_subtype(). May be copied using + * g_variant_type_copy() and freed using g_variant_type_free(). + **/ +typedef struct _GVariantType GVariantType; + +/** + * G_VARIANT_TYPE_BOOLEAN: + * + * The type of a value that can be either %TRUE or %FALSE. + **/ +#define G_VARIANT_TYPE_BOOLEAN ((const GVariantType *) "b") + +/** + * G_VARIANT_TYPE_BYTE: + * + * The type of an integer value that can range from 0 to 255. + **/ +#define G_VARIANT_TYPE_BYTE ((const GVariantType *) "y") + +/** + * G_VARIANT_TYPE_INT16: + * + * The type of an integer value that can range from -32768 to 32767. + **/ +#define G_VARIANT_TYPE_INT16 ((const GVariantType *) "n") + +/** + * G_VARIANT_TYPE_UINT16: + * + * The type of an integer value that can range from 0 to 65535. + * There were about this many people living in Toronto in the 1870s. + **/ +#define G_VARIANT_TYPE_UINT16 ((const GVariantType *) "q") + +/** + * G_VARIANT_TYPE_INT32: + * + * The type of an integer value that can range from -2147483648 to + * 2147483647. + **/ +#define G_VARIANT_TYPE_INT32 ((const GVariantType *) "i") + +/** + * G_VARIANT_TYPE_UINT32: + * + * The type of an integer value that can range from 0 to 4294967295. + * That's one number for everyone who was around in the late 1970s. + **/ +#define G_VARIANT_TYPE_UINT32 ((const GVariantType *) "u") + +/** + * G_VARIANT_TYPE_INT64: + * + * The type of an integer value that can range from + * -9223372036854775808 to 9223372036854775807. + **/ +#define G_VARIANT_TYPE_INT64 ((const GVariantType *) "x") + +/** + * G_VARIANT_TYPE_UINT64: + * + * The type of an integer value that can range from 0 to + * 18446744073709551616. That's a really big number, but a Rubik's + * cube can have a bit more than twice as many possible positions. + **/ +#define G_VARIANT_TYPE_UINT64 ((const GVariantType *) "t") + +/** + * G_VARIANT_TYPE_DOUBLE: + * + * The type of a double precision IEEE754 floating point number. + * These guys go up to about 1.80e308 (plus and minus) but miss out on + * some numbers in between. In any case, that's far greater than the + * estimated number of fundamental particles in the observable + * universe. + **/ +#define G_VARIANT_TYPE_DOUBLE ((const GVariantType *) "d") + +/** + * G_VARIANT_TYPE_STRING: + * + * The type of a string. "" is a string. %NULL is not a string. + **/ +#define G_VARIANT_TYPE_STRING ((const GVariantType *) "s") + +/** + * G_VARIANT_TYPE_OBJECT_PATH: + * + * The type of a DBus object reference. These are strings of a + * specific format used to identify objects at a given destination on + * the bus. + * + * If you are not interacting with DBus, then there is no reason to make + * use of this type. If you are, then the DBus specification contains a + * precise description of valid object paths. + **/ +#define G_VARIANT_TYPE_OBJECT_PATH ((const GVariantType *) "o") + +/** + * G_VARIANT_TYPE_SIGNATURE: + * + * The type of a DBus type signature. These are strings of a specific + * format used as type signatures for DBus methods and messages. + * + * If you are not interacting with DBus, then there is no reason to make + * use of this type. If you are, then the DBus specification contains a + * precise description of valid signature strings. + **/ +#define G_VARIANT_TYPE_SIGNATURE ((const GVariantType *) "g") + +/** + * G_VARIANT_TYPE_VARIANT: + * + * The type of a box that contains any other value (including another + * variant). + **/ +#define G_VARIANT_TYPE_VARIANT ((const GVariantType *) "v") + +/** + * G_VARIANT_TYPE_HANDLE: + * + * The type of a 32bit signed integer value, that by convention, is used + * as an index into an array of file descriptors that are sent alongside + * a DBus message. + * + * If you are not interacting with DBus, then there is no reason to make + * use of this type. + **/ +#define G_VARIANT_TYPE_HANDLE ((const GVariantType *) "h") + +/** + * G_VARIANT_TYPE_UNIT: + * + * The empty tuple type. Has only one instance. Known also as "triv" + * or "void". + **/ +#define G_VARIANT_TYPE_UNIT ((const GVariantType *) "()") + +/** + * G_VARIANT_TYPE_ANY: + * + * An indefinite type that is a supertype of every type (including + * itself). + **/ +#define G_VARIANT_TYPE_ANY ((const GVariantType *) "*") + +/** + * G_VARIANT_TYPE_BASIC: + * + * An indefinite type that is a supertype of every basic (ie: + * non-container) type. + **/ +#define G_VARIANT_TYPE_BASIC ((const GVariantType *) "?") + +/** + * G_VARIANT_TYPE_MAYBE: + * + * An indefinite type that is a supertype of every maybe type. + **/ +#define G_VARIANT_TYPE_MAYBE ((const GVariantType *) "m*") + +/** + * G_VARIANT_TYPE_ARRAY: + * + * An indefinite type that is a supertype of every array type. + **/ +#define G_VARIANT_TYPE_ARRAY ((const GVariantType *) "a*") + +/** + * G_VARIANT_TYPE_TUPLE: + * + * An indefinite type that is a supertype of every tuple type, + * regardless of the number of items in the tuple. + **/ +#define G_VARIANT_TYPE_TUPLE ((const GVariantType *) "r") + +/** + * G_VARIANT_TYPE_DICT_ENTRY: + * + * An indefinite type that is a supertype of every dictionary entry + * type. + **/ +#define G_VARIANT_TYPE_DICT_ENTRY ((const GVariantType *) "{?*}") + +/** + * G_VARIANT_TYPE_DICTIONARY: + * + * An indefinite type that is a supertype of every dictionary type -- + * that is, any array type that has an element type equal to any + * dictionary entry type. + **/ +#define G_VARIANT_TYPE_DICTIONARY ((const GVariantType *) "a{?*}") + +/** + * G_VARIANT_TYPE: + * @type_string: a well-formed #GVariantType type string + * + * Converts a string to a const #GVariantType. Depending on the + * current debugging level, this function may perform a runtime check + * to ensure that @string is a valid GVariant type string. + * + * It is always a programmer error to use this macro with an invalid + * type string. + * + * Since 2.24 + **/ +#ifndef G_DISABLE_CHECKS +# define G_VARIANT_TYPE(type_string) (g_variant_type_checked_ ((type_string))) +#else +# define G_VARIANT_TYPE(type_string) ((const GVariantType *) (type_string)) +#endif + +/* type string checking */ +gboolean g_variant_type_string_is_valid (const gchar *type_string); +gboolean g_variant_type_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr); + +/* create/destroy */ +void g_variant_type_free (GVariantType *type); +GVariantType * g_variant_type_copy (const GVariantType *type); +GVariantType * g_variant_type_new (const gchar *type_string); + +/* getters */ +gsize g_variant_type_get_string_length (const GVariantType *type); +const gchar * g_variant_type_peek_string (const GVariantType *type); +gchar * g_variant_type_dup_string (const GVariantType *type); + +/* classification */ +gboolean g_variant_type_is_definite (const GVariantType *type); +gboolean g_variant_type_is_container (const GVariantType *type); +gboolean g_variant_type_is_basic (const GVariantType *type); +gboolean g_variant_type_is_maybe (const GVariantType *type); +gboolean g_variant_type_is_array (const GVariantType *type); +gboolean g_variant_type_is_tuple (const GVariantType *type); +gboolean g_variant_type_is_dict_entry (const GVariantType *type); +gboolean g_variant_type_is_variant (const GVariantType *type); + +/* for hash tables */ +guint g_variant_type_hash (gconstpointer type); +gboolean g_variant_type_equal (gconstpointer type1, + gconstpointer type2); + +/* subtypes */ +gboolean g_variant_type_is_subtype_of (const GVariantType *type, + const GVariantType *supertype); + +/* type iterator interface */ +const GVariantType * g_variant_type_element (const GVariantType *type); +const GVariantType * g_variant_type_first (const GVariantType *type); +const GVariantType * g_variant_type_next (const GVariantType *type); +gsize g_variant_type_n_items (const GVariantType *type); +const GVariantType * g_variant_type_key (const GVariantType *type); +const GVariantType * g_variant_type_value (const GVariantType *type); + +/* constructors */ +GVariantType * g_variant_type_new_array (const GVariantType *element); +GVariantType * g_variant_type_new_maybe (const GVariantType *element); +GVariantType * g_variant_type_new_tuple (const GVariantType * const *items, + gint length); +GVariantType * g_variant_type_new_dict_entry (const GVariantType *key, + const GVariantType *value); + +/*< private >*/ +const GVariantType * g_variant_type_checked_ (const gchar *); + +G_END_DECLS + +#endif /* __G_VARIANT_TYPE_H__ */ diff --git a/glib/gvarianttypeinfo.c b/glib/gvarianttypeinfo.c new file mode 100644 index 0000000..52f7b7d --- /dev/null +++ b/glib/gvarianttypeinfo.c @@ -0,0 +1,873 @@ +/* + * Copyright © 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#include "config.h" + +#include "gvarianttypeinfo.h" + +#include +#include +#include + +#include "galias.h" + +/* < private > + * GVariantTypeInfo: + * + * This structure contains the necessary information to facilitate the + * serialisation and fast deserialisation of a given type of GVariant + * value. A GVariant instance holds a pointer to one of these + * structures to provide for efficient operation. + * + * The GVariantTypeInfo structures for all of the base types, plus the + * "variant" type are stored in a read-only static array. + * + * For container types, a hash table and reference counting is used to + * ensure that only one of these structures exists for any given type. + * In general, a container GVariantTypeInfo will exist for a given type + * only if one or more GVariant instances of that type exist or if + * another GVariantTypeInfo has that type as a subtype. For example, if + * a process contains a single GVariant instance with type "(asv)", then + * container GVariantTypeInfo structures will exist for "(asv)" and + * for "as" (note that "s" and "v" always exist in the static array). + * + * The trickiest part of GVariantTypeInfo (and in fact, the major reason + * for its existance) is the storage of somewhat magical constants that + * allow for O(1) lookups of items in tuples. This is described below. + * + * 'container_class' is set to 'a' or 'r' if the GVariantTypeInfo is + * contained inside of an ArrayInfo or TupleInfo, respectively. This + * allows the storage of the necessary additional information. + * + * 'fixed_size' is set to the fixed size of the type, if applicable, or + * 0 otherwise (since no type has a fixed size of 0). + * + * 'alignment' is set to one less than the alignment requirement for + * this type. This makes many operations much more convenient. + */ +struct _GVariantTypeInfo +{ + gsize fixed_size; + guchar alignment; + guchar container_class; +}; + +/* Container types are reference counted. They also need to have their + * type string stored explicitly since it is not merely a single letter. + */ +typedef struct +{ + GVariantTypeInfo info; + + gchar *type_string; + gint ref_count; +} ContainerInfo; + +/* For 'array' and 'maybe' types, we store some extra information on the + * end of the GVariantTypeInfo struct -- the element type (ie: "s" for + * "as"). The container GVariantTypeInfo structure holds a reference to + * the element typeinfo. + */ +typedef struct +{ + ContainerInfo container; + + GVariantTypeInfo *element; +} ArrayInfo; + +/* For 'tuple' and 'dict entry' types, we store extra information for + * each member -- its type and how to find it inside the serialised data + * in O(1) time using 4 variables -- 'i', 'a', 'b', and 'c'. See the + * comment on GVariantMemberInfo in gvarianttypeinfo.h. + */ +typedef struct +{ + ContainerInfo container; + + GVariantMemberInfo *members; + gsize n_members; +} TupleInfo; + + +/* Hard-code the base types in a constant array */ +static const GVariantTypeInfo g_variant_type_info_basic_table[24] = { +#define fixed_aligned(x) x, x - 1 +#define not_a_type 0, +#define unaligned 0, 0 +#define aligned(x) 0, x - 1 + /* 'b' */ { fixed_aligned(1) }, /* boolean */ + /* 'c' */ { not_a_type }, + /* 'd' */ { fixed_aligned(8) }, /* double */ + /* 'e' */ { not_a_type }, + /* 'f' */ { not_a_type }, + /* 'g' */ { unaligned }, /* signature string */ + /* 'h' */ { fixed_aligned(4) }, /* file handle (int32) */ + /* 'i' */ { fixed_aligned(4) }, /* int32 */ + /* 'j' */ { not_a_type }, + /* 'k' */ { not_a_type }, + /* 'l' */ { not_a_type }, + /* 'm' */ { not_a_type }, + /* 'n' */ { fixed_aligned(2) }, /* int16 */ + /* 'o' */ { unaligned }, /* object path string */ + /* 'p' */ { not_a_type }, + /* 'q' */ { fixed_aligned(2) }, /* uint16 */ + /* 'r' */ { not_a_type }, + /* 's' */ { unaligned }, /* string */ + /* 't' */ { fixed_aligned(8) }, /* uint64 */ + /* 'u' */ { fixed_aligned(4) }, /* uint32 */ + /* 'v' */ { aligned(8) }, /* variant */ + /* 'w' */ { not_a_type }, + /* 'x' */ { fixed_aligned(8) }, /* int64 */ + /* 'y' */ { fixed_aligned(1) }, /* byte */ +#undef fixed_aligned +#undef not_a_type +#undef unaligned +#undef aligned +}; + +/* We need to have type strings to return for the base types. We store + * those in another array. Since all base type strings are single + * characters this is easy. By not storing pointers to strings into the + * GVariantTypeInfo itself, we save a bunch of relocations. + */ +static const char g_variant_type_info_basic_chars[24][2] = { + "b", " ", "d", " ", " ", "g", "h", "i", " ", " ", " ", " ", + "n", "o", " ", "q", " ", "s", "t", "u", "v", " ", "x", "y" +}; + +/* sanity checks to make debugging easier */ +static void +g_variant_type_info_check (const GVariantTypeInfo *info, + char container_class) +{ + g_assert (!container_class || info->container_class == container_class); + + /* alignment can only be one of these */ + g_assert (info->alignment == 0 || info->alignment == 1 || + info->alignment == 3 || info->alignment == 7); + + if (info->container_class) + { + ContainerInfo *container = (ContainerInfo *) info; + + /* extra checks for containers */ + g_assert_cmpint (container->ref_count, >, 0); + g_assert (container->type_string != NULL); + } + else + { + gint index; + + /* if not a container, then ensure that it is a valid member of + * the basic types table + */ + index = info - g_variant_type_info_basic_table; + + g_assert (G_N_ELEMENTS (g_variant_type_info_basic_table) == 24); + g_assert (G_N_ELEMENTS (g_variant_type_info_basic_chars) == 24); + g_assert (0 <= index && index < 24); + g_assert (g_variant_type_info_basic_chars[index][0] != ' '); + } +} + +/* < private > + * g_variant_type_info_get_type_string: + * @info: a #GVariantTypeInfo + * + * Gets the type string for @info. The string is nul-terminated. + */ +const gchar * +g_variant_type_info_get_type_string (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, 0); + + if (info->container_class) + { + ContainerInfo *container = (ContainerInfo *) info; + + /* containers have their type string stored inside them */ + return container->type_string; + } + else + { + gint index; + + /* look up the type string in the base type array. the call to + * g_variant_type_info_check() above already ensured validity. + */ + index = info - g_variant_type_info_basic_table; + + return g_variant_type_info_basic_chars[index]; + } +} + +/* < private > + * g_variant_type_info_query: + * @info: a #GVariantTypeInfo + * @alignment: the location to store the alignment, or %NULL + * @fixed_size: the location to store the fixed size, or %NULL + * + * Queries @info to determine the alignment requirements and fixed size + * (if any) of the type. + * + * @fixed_size, if non-%NULL is set to the fixed size of the type, or 0 + * to indicate that the type is a variable-sized type. No type has a + * fixed size of 0. + * + * @alignment, if non-%NULL, is set to one less than the required + * alignment of the type. For example, for a 32bit integer, @alignment + * would be set to 3. This allows you to round an integer up to the + * proper alignment by performing the following efficient calculation: + * + * offset += ((-offset) & alignment); + */ +void +g_variant_type_info_query (GVariantTypeInfo *info, + guint *alignment, + gsize *fixed_size) +{ + g_variant_type_info_check (info, 0); + + if (alignment) + *alignment = info->alignment; + + if (fixed_size) + *fixed_size = info->fixed_size; +} + +/* == array == */ +#define ARRAY_INFO_CLASS 'a' +static ArrayInfo * +ARRAY_INFO (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, ARRAY_INFO_CLASS); + + return (ArrayInfo *) info; +} + +static void +array_info_free (GVariantTypeInfo *info) +{ + ArrayInfo *array_info; + + g_assert (info->container_class == ARRAY_INFO_CLASS); + array_info = (ArrayInfo *) info; + + g_variant_type_info_unref (array_info->element); + g_slice_free (ArrayInfo, array_info); +} + +static ContainerInfo * +array_info_new (const GVariantType *type) +{ + ArrayInfo *info; + + info = g_slice_new (ArrayInfo); + info->container.info.container_class = ARRAY_INFO_CLASS; + + info->element = g_variant_type_info_get (g_variant_type_element (type)); + info->container.info.alignment = info->element->alignment; + info->container.info.fixed_size = 0; + + return (ContainerInfo *) info; +} + +/* < private > + * g_variant_type_info_element: + * @info: a #GVariantTypeInfo for an array or maybe type + * + * Returns the element type for the array or maybe type. A reference is + * not added, so the caller must add their own. + */ +GVariantTypeInfo * +g_variant_type_info_element (GVariantTypeInfo *info) +{ + return ARRAY_INFO (info)->element; +} + +/* < private > + * g_variant_type_query_element: + * @info: a #GVariantTypeInfo for an array or maybe type + * @alignment: the location to store the alignment, or %NULL + * @fixed_size: the location to store the fixed size, or %NULL + * + * Returns the alignment requires and fixed size (if any) for the + * element type of the array. This call is a convenience wrapper around + * g_variant_type_info_element() and g_variant_type_info_query(). + */ +void +g_variant_type_info_query_element (GVariantTypeInfo *info, + guint *alignment, + gsize *fixed_size) +{ + g_variant_type_info_query (ARRAY_INFO (info)->element, + alignment, fixed_size); +} + +/* == tuple == */ +#define TUPLE_INFO_CLASS 'r' +static TupleInfo * +TUPLE_INFO (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, TUPLE_INFO_CLASS); + + return (TupleInfo *) info; +} + +static void +tuple_info_free (GVariantTypeInfo *info) +{ + TupleInfo *tuple_info; + gint i; + + g_assert (info->container_class == TUPLE_INFO_CLASS); + tuple_info = (TupleInfo *) info; + + for (i = 0; i < tuple_info->n_members; i++) + g_variant_type_info_unref (tuple_info->members[i].type_info); + + g_slice_free1 (sizeof (GVariantMemberInfo) * tuple_info->n_members, + tuple_info->members); + g_slice_free (TupleInfo, tuple_info); +} + +static void +tuple_allocate_members (const GVariantType *type, + GVariantMemberInfo **members, + gsize *n_members) +{ + const GVariantType *item_type; + gsize i = 0; + + *n_members = g_variant_type_n_items (type); + *members = g_slice_alloc (sizeof (GVariantMemberInfo) * *n_members); + + item_type = g_variant_type_first (type); + while (item_type) + { + GVariantMemberInfo *member = &(*members)[i++]; + + member->type_info = g_variant_type_info_get (item_type); + item_type = g_variant_type_next (item_type); + + if (member->type_info->fixed_size) + member->ending_type = G_VARIANT_MEMBER_ENDING_FIXED; + else if (item_type == NULL) + member->ending_type = G_VARIANT_MEMBER_ENDING_LAST; + else + member->ending_type = G_VARIANT_MEMBER_ENDING_OFFSET; + } + + g_assert (i == *n_members); +} + +/* this is g_variant_type_info_query for a given member of the tuple. + * before the access is done, it is ensured that the item is within + * range and %FALSE is returned if not. + */ +static gboolean +tuple_get_item (TupleInfo *info, + GVariantMemberInfo *item, + gsize *d, + gsize *e) +{ + if (&info->members[info->n_members] == item) + return FALSE; + + *d = item->type_info->alignment; + *e = item->type_info->fixed_size; + return TRUE; +} + +/* Read the documentation for #GVariantMemberInfo in gvarianttype.h + * before attempting to understand this. + * + * This function adds one set of "magic constant" values (for one item + * in the tuple) to the table. + * + * The algorithm in tuple_generate_table() calculates values of 'a', 'b' + * and 'c' for each item, such that the procedure for finding the item + * is to start at the end of the previous variable-sized item, add 'a', + * then round up to the nearest multiple of 'b', then then add 'c'. + * Note that 'b' is stored in the usual "one less than" form. ie: + * + * start = ROUND_UP(prev_end + a, (b + 1)) + c; + * + * We tweak these values a little to allow for a slightly easier + * computation and more compact storage. + */ +static void +tuple_table_append (GVariantMemberInfo **items, + gsize i, + gsize a, + gsize b, + gsize c) +{ + GVariantMemberInfo *item = (*items)++; + + /* We can shift multiples of the alignment size from 'c' into 'a'. + * As long as we're shifting whole multiples, it won't affect the + * result. This means that we can take the "aligned" portion off of + * 'c' and add it into 'a'. + * + * Imagine (for sake of clarity) that ROUND_10 rounds up to the + * nearest 10. It is clear that: + * + * ROUND_10(a) + c == ROUND_10(a + 10*(c / 10)) + (c % 10) + * + * ie: remove the 10s portion of 'c' and add it onto 'a'. + * + * To put some numbers on it, imagine we start with a = 34 and c = 27: + * + * ROUND_10(34) + 27 = 40 + 27 = 67 + * + * but also, we can split 27 up into 20 and 7 and do this: + * + * ROUND_10(34 + 20) + 7 = ROUND_10(54) + 7 = 60 + 7 = 67 + * ^^ ^ + * without affecting the result. We do that here. + * + * This reduction in the size of 'c' means that we can store it in a + * gchar instead of a gsize. Due to how the structure is packed, this + * ends up saving us 'two pointer sizes' per item in each tuple when + * allocating using GSlice. + */ + a += ~b & c; /* take the "aligned" part of 'c' and add to 'a' */ + c &= b; /* chop 'c' to contain only the unaligned part */ + + + /* Finally, we made one last adjustment. Recall: + * + * start = ROUND_UP(prev_end + a, (b + 1)) + c; + * + * Forgetting the '+ c' for the moment: + * + * ROUND_UP(prev_end + a, (b + 1)); + * + * we can do a "round up" operation by adding 1 less than the amount + * to round up to, then rounding down. ie: + * + * #define ROUND_UP(x, y) ROUND_DOWN(x + (y-1), y) + * + * Of course, for rounding down to a power of two, we can just mask + * out the appropriate number of low order bits: + * + * #define ROUND_DOWN(x, y) (x & ~(y - 1)) + * + * Which gives us + * + * #define ROUND_UP(x, y) (x + (y - 1) & ~(y - 1)) + * + * but recall that our alignment value 'b' is already "one less". + * This means that to round 'prev_end + a' up to 'b' we can just do: + * + * ((prev_end + a) + b) & ~b + * + * Associativity, and putting the 'c' back on: + * + * (prev_end + (a + b)) & ~b + c + * + * Now, since (a + b) is constant, we can just add 'b' to 'a' now and + * store that as the number to add to prev_end. Then we use ~b as the + * number to take a bitwise 'and' with. Finally, 'c' is added on. + * + * Note, however, that all the low order bits of the 'aligned' value + * are masked out and that all of the high order bits of 'c' have been + * "moved" to 'a' (in the previous step). This means that there are + * no overlapping bits in the addition -- so we can do a bitwise 'or' + * equivalently. + * + * This means that we can now compute the start address of a given + * item in the tuple using the algorithm given in the documentation + * for #GVariantMemberInfo: + * + * item_start = ((prev_end + a) & b) | c; + */ + + item->i = i; + item->a = a + b; + item->b = ~b; + item->c = c; +} + +static gsize +tuple_align (gsize offset, + guint alignment) +{ + return offset + ((-offset) & alignment); +} + +/* This function is the heart of the algorithm for calculating 'i', 'a', + * 'b' and 'c' for each item in the tuple. + * + * Imagine we want to find the start of the "i" in the type "(su(qx)ni)". + * That's a string followed by a uint32, then a tuple containing a + * uint16 and a int64, then an int16, then our "i". In order to get to + * our "i" we: + * + * Start at the end of the string, align to 4 (for the uint32), add 4. + * Align to 8, add 16 (for the tuple). Align to 2, add 2 (for the + * int16). Then we're there. It turns out that, given 3 simple rules, + * we can flatten this iteration into one addition, one alignment, then + * one more addition. + * + * The loop below plays through each item in the tuple, querying its + * alignment and fixed_size into 'd' and 'e', respectively. At all + * times the variables 'a', 'b', and 'c' are maintained such that in + * order to get to the current point, you add 'a', align to 'b' then add + * 'c'. 'b' is kept in "one less than" form. For each item, the proper + * alignment is applied to find the values of 'a', 'b' and 'c' to get to + * the start of that item. Those values are recorded into the table. + * The fixed size of the item (if applicable) is then added on. + * + * These 3 rules are how 'a', 'b' and 'c' are modified for alignment and + * addition of fixed size. They have been proven correct but are + * presented here, without proof: + * + * 1) in order to "align to 'd'" where 'd' is less than or equal to the + * largest level of alignment seen so far ('b'), you align 'c' to + * 'd'. + * 2) in order to "align to 'd'" where 'd' is greater than the largest + * level of alignment seen so far, you add 'c' aligned to 'b' to the + * value of 'a', set 'b' to 'd' (ie: increase the 'largest alignment + * seen') and reset 'c' to 0. + * 3) in order to "add 'e'", just add 'e' to 'c'. + */ +static void +tuple_generate_table (TupleInfo *info) +{ + GVariantMemberInfo *items = info->members; + gsize i = -1, a = 0, b = 0, c = 0, d, e; + + /* iterate over each item in the tuple. + * 'd' will be the alignment of the item (in one-less form) + * 'e' will be the fixed size (or 0 for variable-size items) + */ + while (tuple_get_item (info, items, &d, &e)) + { + /* align to 'd' */ + if (d <= b) + c = tuple_align (c, d); /* rule 1 */ + else + a += tuple_align (c, b), b = d, c = 0; /* rule 2 */ + + /* the start of the item is at this point (ie: right after we + * have aligned for it). store this information in the table. + */ + tuple_table_append (&items, i, a, b, c); + + /* "move past" the item by adding in its size. */ + if (e == 0) + /* variable size: + * + * we'll have an offset stored to mark the end of this item, so + * just bump the offset index to give us a new starting point + * and reset all the counters. + */ + i++, a = b = c = 0; + else + /* fixed size */ + c += e; /* rule 3 */ + } +} + +static void +tuple_set_base_info (TupleInfo *info) +{ + GVariantTypeInfo *base = &info->container.info; + + if (info->n_members > 0) + { + GVariantMemberInfo *m; + + /* the alignment requirement of the tuple is the alignment + * requirement of its largest item. + */ + base->alignment = 0; + for (m = info->members; m < &info->members[info->n_members]; m++) + /* can find the max of a list of "one less than" powers of two + * by 'or'ing them + */ + base->alignment |= m->type_info->alignment; + + m--; /* take 'm' back to the last item */ + + /* the structure only has a fixed size if no variable-size + * offsets are stored and the last item is fixed-sized too (since + * an offset is never stored for the last item). + */ + if (m->i == -1 && m->type_info->fixed_size) + /* in that case, the fixed size can be found by finding the + * start of the last item (in the usual way) and adding its + * fixed size. + * + * if a tuple has a fixed size then it is always a multiple of + * the alignment requirement (to make packing into arrays + * easier) so we round up to that here. + */ + base->fixed_size = + tuple_align (((m->a & m->b) | m->c) + m->type_info->fixed_size, + base->alignment); + else + /* else, the tuple is not fixed size */ + base->fixed_size = 0; + } + else + { + /* the empty tuple: '()'. + * + * has a size of 1 and an no alignment requirement. + * + * It has a size of 1 (not 0) for two practical reasons: + * + * 1) So we can determine how many of them are in an array + * without dividing by zero or without other tricks. + * + * 2) Even if we had some trick to know the number of items in + * the array (as GVariant did at one time) this would open a + * potential denial of service attack: an attacker could send + * you an extremely small array (in terms of number of bytes) + * containing trillions of zero-sized items. If you iterated + * over this array you would effectively infinite-loop your + * program. By forcing a size of at least one, we bound the + * amount of computation done in response to a message to a + * reasonable function of the size of that message. + */ + base->alignment = 0; + base->fixed_size = 1; + } +} + +static ContainerInfo * +tuple_info_new (const GVariantType *type) +{ + TupleInfo *info; + + info = g_slice_new (TupleInfo); + info->container.info.container_class = TUPLE_INFO_CLASS; + + tuple_allocate_members (type, &info->members, &info->n_members); + tuple_generate_table (info); + tuple_set_base_info (info); + + return (ContainerInfo *) info; +} + +/* < private > + * g_variant_type_info_n_members: + * @info: a #GVariantTypeInfo for a tuple or dictionary entry type + * + * Returns the number of members in a tuple or dictionary entry type. + * For a dictionary entry this will always be 2. + */ +gsize +g_variant_type_info_n_members (GVariantTypeInfo *info) +{ + return TUPLE_INFO (info)->n_members; +} + +/* < private > + * g_variant_type_info_member_info: + * @info: a #GVariantTypeInfo for a tuple or dictionary entry type + * @index: the member to fetch information for + * + * Returns the #GVariantMemberInfo for a given member. See + * documentation for that structure for why you would want this + * information. + * + * @index must refer to a valid child (ie: strictly less than + * g_variant_type_info_n_members() returns). + */ +const GVariantMemberInfo * +g_variant_type_info_member_info (GVariantTypeInfo *info, + gsize index) +{ + TupleInfo *tuple_info = TUPLE_INFO (info); + + if (index < tuple_info->n_members) + return &tuple_info->members[index]; + + return NULL; +} + +/* == new/ref/unref == */ +static GStaticRecMutex g_variant_type_info_lock = G_STATIC_REC_MUTEX_INIT; +static GHashTable *g_variant_type_info_table; + +/* < private > + * g_variant_type_info_get: + * @type: a #GVariantType + * + * Returns a reference to a #GVariantTypeInfo for @type. + * + * If an info structure already exists for this type, a new reference is + * returned. If not, the required calculations are performed and a new + * info structure is returned. + * + * It is appropriate to call g_variant_type_info_unref() on the return + * value. + */ +GVariantTypeInfo * +g_variant_type_info_get (const GVariantType *type) +{ + char type_char; + + type_char = g_variant_type_peek_string (type)[0]; + + if (type_char == G_VARIANT_TYPE_INFO_CHAR_MAYBE || + type_char == G_VARIANT_TYPE_INFO_CHAR_ARRAY || + type_char == G_VARIANT_TYPE_INFO_CHAR_TUPLE || + type_char == G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY) + { + GVariantTypeInfo *info; + gchar *type_string; + + type_string = g_variant_type_dup_string (type); + + g_static_rec_mutex_lock (&g_variant_type_info_lock); + + if (g_variant_type_info_table == NULL) + g_variant_type_info_table = g_hash_table_new (g_str_hash, + g_str_equal); + info = g_hash_table_lookup (g_variant_type_info_table, type_string); + + if (info == NULL) + { + ContainerInfo *container; + + if (type_char == G_VARIANT_TYPE_INFO_CHAR_MAYBE || + type_char == G_VARIANT_TYPE_INFO_CHAR_ARRAY) + { + container = array_info_new (type); + } + else /* tuple or dict entry */ + { + container = tuple_info_new (type); + } + + info = (GVariantTypeInfo *) container; + container->type_string = type_string; + container->ref_count = 1; + + g_hash_table_insert (g_variant_type_info_table, type_string, info); + type_string = NULL; + } + else + g_variant_type_info_ref (info); + + g_static_rec_mutex_unlock (&g_variant_type_info_lock); + g_variant_type_info_check (info, 0); + g_free (type_string); + + return info; + } + else + { + const GVariantTypeInfo *info; + int index; + + index = type_char - 'b'; + g_assert (G_N_ELEMENTS (g_variant_type_info_basic_table) == 24); + g_assert_cmpint (0, <=, index); + g_assert_cmpint (index, <, 24); + + info = g_variant_type_info_basic_table + index; + g_variant_type_info_check (info, 0); + + return (GVariantTypeInfo *) info; + } +} + +/* < private > + * g_variant_type_info_ref: + * @info: a #GVariantTypeInfo + * + * Adds a reference to @info. + */ +GVariantTypeInfo * +g_variant_type_info_ref (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, 0); + + if (info->container_class) + { + ContainerInfo *container = (ContainerInfo *) info; + + g_assert_cmpint (container->ref_count, >, 0); + g_atomic_int_inc (&container->ref_count); + } + + return info; +} + +/* < private > + * g_variant_type_info_unref: + * @info: a #GVariantTypeInfo + * + * Releases a reference held on @info. This may result in @info being + * freed. + */ +void +g_variant_type_info_unref (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, 0); + + if (info->container_class) + { + ContainerInfo *container = (ContainerInfo *) info; + + g_static_rec_mutex_lock (&g_variant_type_info_lock); + if (g_atomic_int_dec_and_test (&container->ref_count)) + { + g_hash_table_remove (g_variant_type_info_table, + container->type_string); + if (g_hash_table_size (g_variant_type_info_table) == 0) + { + g_hash_table_unref (g_variant_type_info_table); + g_variant_type_info_table = NULL; + } + g_static_rec_mutex_unlock (&g_variant_type_info_lock); + + g_free (container->type_string); + + if (info->container_class == ARRAY_INFO_CLASS) + array_info_free (info); + + else if (info->container_class == TUPLE_INFO_CLASS) + tuple_info_free (info); + + else + g_assert_not_reached (); + } + else + g_static_rec_mutex_unlock (&g_variant_type_info_lock); + } +} + +void +g_variant_type_info_assert_no_infos (void) +{ + g_assert (g_variant_type_info_table == NULL); +} + +#define __G_VARIANT_TYPE_INFO_C__ +#include "galiasdef.c" diff --git a/glib/gvarianttypeinfo.h b/glib/gvarianttypeinfo.h new file mode 100644 index 0000000..7c7b544 --- /dev/null +++ b/glib/gvarianttypeinfo.h @@ -0,0 +1,151 @@ +/* + * Copyright © 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Ryan Lortie + */ + +#ifndef __G_VARIANT_TYPE_INFO_H__ +#define __G_VARIANT_TYPE_INFO_H__ + +#include + +#define G_VARIANT_TYPE_INFO_CHAR_MAYBE 'm' +#define G_VARIANT_TYPE_INFO_CHAR_ARRAY 'a' +#define G_VARIANT_TYPE_INFO_CHAR_TUPLE '(' +#define G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY '{' +#define G_VARIANT_TYPE_INFO_CHAR_VARIANT 'v' +#define g_variant_type_info_get_type_char(info) \ + (g_variant_type_info_get_type_string(info)[0]) + +typedef struct _GVariantTypeInfo GVariantTypeInfo; + +/* < private > + * GVariantMemberInfo: + * + * This structure describes how to construct a GVariant instance + * corresponding to a given child of a tuple or dictionary entry in a + * very short constant time. It contains the typeinfo of the child, + * along with 4 constants that allow the bounds of the child's + * serialised data within the container's serialised data to be found + * very efficiently. + * + * Since dictionary entries are serialised as if they were tuples of 2 + * items, the term "tuple" will be used here in the general sense to + * refer to tuples and dictionary entries. + * + * BACKGROUND: + * The serialised data for a tuple contains an array of "offsets" at + * the end. There is one "offset" in this array for each + * variable-sized item in the tuple (except for the last one). The + * offset points to the end point of that item's serialised data. The + * procedure for finding the start point is described below. An + * offset is not needed for the last item because the end point of the + * last item is merely the end point of the container itself (after + * the offsets array has been accounted for). An offset is not needed + * for fixed-sized items (like integers) because, due to their fixed + * size, the end point is a constant addition to the start point. + * + * It is clear that the starting point of a given item in the tuple is + * determined by the items that preceed it in the tuple. Logically, + * the start point of a particular item in a given type of tuple can + * be determined entirely by the end point of the nearest + * variable-sized item that came before it (or from the start of the + * container itself in case there is no preceeding variable-sized + * item). In the case of "(isis)" for example, in order to find out + * the start point of the last string, one must start at the end point + * of the first string, align to 4 (for the integer's alignment) and + * then add 4 (for storing the integer). That's the point where the + * string starts (since no special alignment is required for strings). + * + * Of course, this process requires iterating over the types in the + * tuple up to the item of interest. As it turns out, it is possible + * to determine 3 constants 'a', 'b', and 'c' for each item in the + * tuple, such that, given the ending offset of the nearest previous + * variable-sized item (prev_end), a very simple calculation can be + * performed to determine the start of the item of interest. + * + * The constants in this structure are used as follows: + * + * First, among the array of offets contained in the tuple, 'i' is the + * index of the offset that refers to the end of the variable-sized item + * preceeding the item of interest. If no variable-sized items preceed + * this item, then 'i' will be -1. + * + * Let 'prev_end' be the end offset of the previous item (or 0 in the + * case that there was no such item). The start address of this item + * can then be calculate using 'a', 'b', and 'c': + * + * item_start = ((prev_end + a) & b) | c; + * + * For details about how 'a', 'b' and 'c' are calculated, see the + * comments at the point of the implementation in gvariantypeinfo.c. + * + * The end address of the item is then determined in one of three ways, + * according to the 'end_type' field. + * + * - FIXED: For fixed sized items, the end address is equal to the + * start address plus the fixed size. + * + * - LAST: For the last variable sized item in the tuple, the end + * address is equal to the end address of the tuple, minus the size + * of the offset array. + * + * - OFFSET: For other variable sized items, the next index past 'i' + * (ie: 'i + 1') must be consulted to find the end of this item. + */ + +typedef struct +{ + GVariantTypeInfo *type_info; + + gsize i, a; + gint8 b, c; + + guint8 ending_type; +} GVariantMemberInfo; + +#define G_VARIANT_MEMBER_ENDING_FIXED 0 +#define G_VARIANT_MEMBER_ENDING_LAST 1 +#define G_VARIANT_MEMBER_ENDING_OFFSET 2 + +/* query */ +const gchar * g_variant_type_info_get_type_string (GVariantTypeInfo *typeinfo); + +void g_variant_type_info_query (GVariantTypeInfo *typeinfo, + guint *alignment, + gsize *size); + +/* array */ +GVariantTypeInfo * g_variant_type_info_element (GVariantTypeInfo *typeinfo); +void g_variant_type_info_query_element (GVariantTypeInfo *typeinfo, + guint *alignment, + gsize *size); + +/* structure */ +gsize g_variant_type_info_n_members (GVariantTypeInfo *typeinfo); +const GVariantMemberInfo * g_variant_type_info_member_info (GVariantTypeInfo *typeinfo, + gsize index); + +/* new/ref/unref */ +GVariantTypeInfo * g_variant_type_info_get (const GVariantType *type); +GVariantTypeInfo * g_variant_type_info_ref (GVariantTypeInfo *typeinfo); +void g_variant_type_info_unref (GVariantTypeInfo *typeinfo); +void g_variant_type_info_assert_no_infos (void); + +#endif /* __G_VARIANT_TYPE_INFO_H__ */ diff --git a/glib/gwin32.c b/glib/gwin32.c new file mode 100644 index 0000000..1440327 --- /dev/null +++ b/glib/gwin32.c @@ -0,0 +1,600 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald + * Copyright (C) 1998-1999 Tor Lillqvist + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe for the unix part, FIXME: make the win32 part MT safe as well. + */ + +#include "config.h" + +#include "glibconfig.h" + +#include +#include +#include +#include +#include + +#define STRICT /* Strict typing, please */ +#include +#undef STRICT +#ifndef G_WITH_CYGWIN +#include +#endif +#include +#include +#if defined(_MSC_VER) || defined(__DMC__) +# include +#endif /* _MSC_VER || __DMC__ */ + +#include "glib.h" +#include "galias.h" + +#ifdef G_WITH_CYGWIN +#include +#endif + +#ifndef G_WITH_CYGWIN + +gint +g_win32_ftruncate (gint fd, + guint size) +{ + return _chsize (fd, size); +} + +#endif + +/** + * g_win32_getlocale: + * + * The setlocale() function in the Microsoft C library uses locale + * names of the form "English_United States.1252" etc. We want the + * UNIXish standard form "en_US", "zh_TW" etc. This function gets the + * current thread locale from Windows - without any encoding info - + * and returns it as a string of the above form for use in forming + * file names etc. The returned string should be deallocated with + * g_free(). + * + * Returns: newly-allocated locale name. + **/ + +#ifndef SUBLANG_SERBIAN_LATIN_BA +#define SUBLANG_SERBIAN_LATIN_BA 0x06 +#endif + +gchar * +g_win32_getlocale (void) +{ + LCID lcid; + LANGID langid; + gchar *ev; + gint primary, sub; + char iso639[10]; + char iso3166[10]; + const gchar *script = NULL; + + /* Let the user override the system settings through environment + * variables, as on POSIX systems. Note that in GTK+ applications + * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the + * Win32 locale and C library locale through code in gtkmain.c. + */ + if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0') + || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0') + || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0')) + return g_strdup (ev); + + lcid = GetThreadLocale (); + + if (!GetLocaleInfo (lcid, LOCALE_SISO639LANGNAME, iso639, sizeof (iso639)) || + !GetLocaleInfo (lcid, LOCALE_SISO3166CTRYNAME, iso3166, sizeof (iso3166))) + return g_strdup ("C"); + + /* Strip off the sorting rules, keep only the language part. */ + langid = LANGIDFROMLCID (lcid); + + /* Split into language and territory part. */ + primary = PRIMARYLANGID (langid); + sub = SUBLANGID (langid); + + /* Handle special cases */ + switch (primary) + { + case LANG_AZERI: + switch (sub) + { + case SUBLANG_AZERI_LATIN: + script = "@Latn"; + break; + case SUBLANG_AZERI_CYRILLIC: + script = "@Cyrl"; + break; + } + break; + case LANG_SERBIAN: /* LANG_CROATIAN == LANG_SERBIAN */ + switch (sub) + { + case SUBLANG_SERBIAN_LATIN: + case 0x06: /* Serbian (Latin) - Bosnia and Herzegovina */ + script = "@Latn"; + break; + } + break; + case LANG_UZBEK: + switch (sub) + { + case SUBLANG_UZBEK_LATIN: + script = "@Latn"; + break; + case SUBLANG_UZBEK_CYRILLIC: + script = "@Cyrl"; + break; + } + break; + } + return g_strconcat (iso639, "_", iso3166, script, NULL); +} + +/** + * g_win32_error_message: + * @error: error code. + * + * Translate a Win32 error code (as returned by GetLastError()) into + * the corresponding message. The message is either language neutral, + * or in the thread's language, or the user's language, the system's + * language, or US English (see docs for FormatMessage()). The + * returned string is in UTF-8. It should be deallocated with + * g_free(). + * + * Returns: newly-allocated error message + **/ +gchar * +g_win32_error_message (gint error) +{ + gchar *retval; + wchar_t *msg = NULL; + int nchars; + + FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER + |FORMAT_MESSAGE_IGNORE_INSERTS + |FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, + (LPWSTR) &msg, 0, NULL); + if (msg != NULL) + { + nchars = wcslen (msg); + + if (nchars > 2 && msg[nchars-1] == '\n' && msg[nchars-2] == '\r') + msg[nchars-2] = '\0'; + + retval = g_utf16_to_utf8 (msg, -1, NULL, NULL, NULL); + + LocalFree (msg); + } + else + retval = g_strdup (""); + + return retval; +} + +/** + * g_win32_get_package_installation_directory_of_module: + * @hmodule: The Win32 handle for a DLL loaded into the current process, or %NULL + * + * This function tries to determine the installation directory of a + * software package based on the location of a DLL of the software + * package. + * + * @hmodule should be the handle of a loaded DLL or %NULL. The + * function looks up the directory that DLL was loaded from. If + * @hmodule is NULL, the directory the main executable of the current + * process is looked up. If that directory's last component is "bin" + * or "lib", its parent directory is returned, otherwise the directory + * itself. + * + * It thus makes sense to pass only the handle to a "public" DLL of a + * software package to this function, as such DLLs typically are known + * to be installed in a "bin" or occasionally "lib" subfolder of the + * installation folder. DLLs that are of the dynamically loaded module + * or plugin variety are often located in more private locations + * deeper down in the tree, from which it is impossible for GLib to + * deduce the root of the package installation. + * + * The typical use case for this function is to have a DllMain() that + * saves the handle for the DLL. Then when code in the DLL needs to + * construct names of files in the installation tree it calls this + * function passing the DLL handle. + * + * Returns: a string containing the guessed installation directory for + * the software package @hmodule is from. The string is in the GLib + * file name encoding, i.e. UTF-8. The return value should be freed + * with g_free() when not needed any longer. If the function fails + * %NULL is returned. + * + * Since: 2.16 + */ +gchar * +g_win32_get_package_installation_directory_of_module (gpointer hmodule) +{ + gchar *retval; + gchar *p; + wchar_t wc_fn[MAX_PATH]; + + if (!GetModuleFileNameW (hmodule, wc_fn, MAX_PATH)) + return NULL; + + retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL); + + if ((p = strrchr (retval, G_DIR_SEPARATOR)) != NULL) + *p = '\0'; + + p = strrchr (retval, G_DIR_SEPARATOR); + if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0 || + g_ascii_strcasecmp (p + 1, "lib") == 0)) + *p = '\0'; + +#ifdef G_WITH_CYGWIN + /* In Cygwin we need to have POSIX paths */ + { + gchar tmp[MAX_PATH]; + + cygwin_conv_to_posix_path (retval, tmp); + g_free (retval); + retval = g_strdup (tmp); + } +#endif + + return retval; +} + +static gchar * +get_package_directory_from_module (const gchar *module_name) +{ + static GHashTable *module_dirs = NULL; + G_LOCK_DEFINE_STATIC (module_dirs); + HMODULE hmodule = NULL; + gchar *fn; + + G_LOCK (module_dirs); + + if (module_dirs == NULL) + module_dirs = g_hash_table_new (g_str_hash, g_str_equal); + + fn = g_hash_table_lookup (module_dirs, module_name ? module_name : ""); + + if (fn) + { + G_UNLOCK (module_dirs); + return g_strdup (fn); + } + + if (module_name) + { + wchar_t *wc_module_name = g_utf8_to_utf16 (module_name, -1, NULL, NULL, NULL); + hmodule = GetModuleHandleW (wc_module_name); + g_free (wc_module_name); + + if (!hmodule) + { + G_UNLOCK (module_dirs); + return NULL; + } + } + + fn = g_win32_get_package_installation_directory_of_module (hmodule); + + if (fn == NULL) + { + G_UNLOCK (module_dirs); + return NULL; + } + + g_hash_table_insert (module_dirs, module_name ? g_strdup (module_name) : "", fn); + + G_UNLOCK (module_dirs); + + return g_strdup (fn); +} + +/** + * g_win32_get_package_installation_directory: + * @package: You should pass %NULL for this. + * @dll_name: The name of a DLL that a package provides in UTF-8, or %NULL. + * + * Try to determine the installation directory for a software package. + * + * This function is deprecated. Use + * g_win32_get_package_installation_directory_of_module() instead. + * + * The use of @package is deprecated. You should always pass %NULL. A + * warning is printed if non-NULL is passed as @package. + * + * The original intended use of @package was for a short identifier of + * the package, typically the same identifier as used for + * GETTEXT_PACKAGE in software configured using GNU + * autotools. The function first looks in the Windows Registry for the + * value #InstallationDirectory in the key + * #HKLM\Software\@package, and if that value + * exists and is a string, returns that. + * + * It is strongly recommended that packagers of GLib-using libraries + * for Windows do not store installation paths in the Registry to be + * used by this function as that interfers with having several + * parallel installations of the library. Enabling multiple + * installations of different versions of some GLib-using library, or + * GLib itself, is desirable for various reasons. + * + * For this reason it is recommeded to always pass %NULL as + * @package to this function, to avoid the temptation to use the + * Registry. In version 2.20 of GLib the @package parameter + * will be ignored and this function won't look in the Registry at all. + * + * If @package is %NULL, or the above value isn't found in the + * Registry, but @dll_name is non-%NULL, it should name a DLL loaded + * into the current process. Typically that would be the name of the + * DLL calling this function, looking for its installation + * directory. The function then asks Windows what directory that DLL + * was loaded from. If that directory's last component is "bin" or + * "lib", the parent directory is returned, otherwise the directory + * itself. If that DLL isn't loaded, the function proceeds as if + * @dll_name was %NULL. + * + * If both @package and @dll_name are %NULL, the directory from where + * the main executable of the process was loaded is used instead in + * the same way as above. + * + * Returns: a string containing the installation directory for + * @package. The string is in the GLib file name encoding, + * i.e. UTF-8. The return value should be freed with g_free() when not + * needed any longer. If the function fails %NULL is returned. + * + * Deprecated: 2.18: Pass the HMODULE of a DLL or EXE to + * g_win32_get_package_installation_directory_of_module() instead. + **/ + + gchar * +g_win32_get_package_installation_directory_utf8 (const gchar *package, + const gchar *dll_name) +{ + gchar *result = NULL; + + if (package != NULL) + g_warning ("Passing a non-NULL package to g_win32_get_package_installation_directory() is deprecated and it is ignored."); + + if (dll_name != NULL) + result = get_package_directory_from_module (dll_name); + + if (result == NULL) + result = get_package_directory_from_module (NULL); + + return result; +} + +#if !defined (_WIN64) + +/* DLL ABI binary compatibility version that uses system codepage file names */ + +gchar * +g_win32_get_package_installation_directory (const gchar *package, + const gchar *dll_name) +{ + gchar *utf8_package = NULL, *utf8_dll_name = NULL; + gchar *utf8_retval, *retval; + + if (package != NULL) + utf8_package = g_locale_to_utf8 (package, -1, NULL, NULL, NULL); + + if (dll_name != NULL) + utf8_dll_name = g_locale_to_utf8 (dll_name, -1, NULL, NULL, NULL); + + utf8_retval = + g_win32_get_package_installation_directory_utf8 (utf8_package, + utf8_dll_name); + + retval = g_locale_from_utf8 (utf8_retval, -1, NULL, NULL, NULL); + + g_free (utf8_package); + g_free (utf8_dll_name); + g_free (utf8_retval); + + return retval; +} + +#endif + +/** + * g_win32_get_package_installation_subdirectory: + * @package: You should pass %NULL for this. + * @dll_name: The name of a DLL that a package provides, in UTF-8, or %NULL. + * @subdir: A subdirectory of the package installation directory, also in UTF-8 + * + * This function is deprecated. Use + * g_win32_get_package_installation_directory_of_module() and + * g_build_filename() instead. + * + * Returns a newly-allocated string containing the path of the + * subdirectory @subdir in the return value from calling + * g_win32_get_package_installation_directory() with the @package and + * @dll_name parameters. See the documentation for + * g_win32_get_package_installation_directory() for more details. In + * particular, note that it is deprecated to pass anything except NULL + * as @package. + * + * Returns: a string containing the complete path to @subdir inside + * the installation directory of @package. The returned string is in + * the GLib file name encoding, i.e. UTF-8. The return value should be + * freed with g_free() when no longer needed. If something goes wrong, + * %NULL is returned. + * + * Deprecated: 2.18: Pass the HMODULE of a DLL or EXE to + * g_win32_get_package_installation_directory_of_module() instead, and + * then construct a subdirectory pathname with g_build_filename(). + **/ + +gchar * +g_win32_get_package_installation_subdirectory_utf8 (const gchar *package, + const gchar *dll_name, + const gchar *subdir) +{ + gchar *prefix; + gchar *dirname; + + prefix = g_win32_get_package_installation_directory_utf8 (package, dll_name); + + dirname = g_build_filename (prefix, subdir, NULL); + g_free (prefix); + + return dirname; +} + +#if !defined (_WIN64) + +/* DLL ABI binary compatibility version that uses system codepage file names */ + +gchar * +g_win32_get_package_installation_subdirectory (const gchar *package, + const gchar *dll_name, + const gchar *subdir) +{ + gchar *prefix; + gchar *dirname; + + prefix = g_win32_get_package_installation_directory (package, dll_name); + + dirname = g_build_filename (prefix, subdir, NULL); + g_free (prefix); + + return dirname; +} + +#endif + +static guint windows_version; + +static void +g_win32_windows_version_init (void) +{ + static gboolean beenhere = FALSE; + + if (!beenhere) + { + beenhere = TRUE; + windows_version = GetVersion (); + + if (windows_version & 0x80000000) + g_error ("This version of GLib requires NT-based Windows."); + } +} + +void +_g_win32_thread_init (void) +{ + g_win32_windows_version_init (); +} + +/** + * g_win32_get_windows_version: + * + * Returns version information for the Windows operating system the + * code is running on. See MSDN documentation for the GetVersion() + * function. To summarize, the most significant bit is one on Win9x, + * and zero on NT-based systems. Since version 2.14, GLib works only + * on NT-based systems, so checking whether your are running on Win9x + * in your own software is moot. The least significant byte is 4 on + * Windows NT 4, and 5 on Windows XP. Software that needs really + * detailled version and feature information should use Win32 API like + * GetVersionEx() and VerifyVersionInfo(). + * + * Returns: The version information. + * + * Since: 2.6 + **/ +guint +g_win32_get_windows_version (void) +{ + g_win32_windows_version_init (); + + return windows_version; +} + +/** + * g_win32_locale_filename_from_utf8: + * @utf8filename: a UTF-8 encoded filename. + * + * Converts a filename from UTF-8 to the system codepage. + * + * On NT-based Windows, on NTFS file systems, file names are in + * Unicode. It is quite possible that Unicode file names contain + * characters not representable in the system codepage. (For instance, + * Greek or Cyrillic characters on Western European or US Windows + * installations, or various less common CJK characters on CJK Windows + * installations.) + * + * In such a case, and if the filename refers to an existing file, and + * the file system stores alternate short (8.3) names for directory + * entries, the short form of the filename is returned. Note that the + * "short" name might in fact be longer than the Unicode name if the + * Unicode name has very short pathname components containing + * non-ASCII characters. If no system codepage name for the file is + * possible, %NULL is returned. + * + * The return value is dynamically allocated and should be freed with + * g_free() when no longer needed. + * + * Return value: The converted filename, or %NULL on conversion + * failure and lack of short names. + * + * Since: 2.8 + */ +gchar * +g_win32_locale_filename_from_utf8 (const gchar *utf8filename) +{ + gchar *retval = g_locale_from_utf8 (utf8filename, -1, NULL, NULL, NULL); + + if (retval == NULL) + { + /* Conversion failed, so convert to wide chars, check if there + * is a 8.3 version, and use that. + */ + wchar_t *wname = g_utf8_to_utf16 (utf8filename, -1, NULL, NULL, NULL); + if (wname != NULL) + { + wchar_t wshortname[MAX_PATH + 1]; + if (GetShortPathNameW (wname, wshortname, G_N_ELEMENTS (wshortname))) + { + gchar *tem = g_utf16_to_utf8 (wshortname, -1, NULL, NULL, NULL); + retval = g_locale_from_utf8 (tem, -1, NULL, NULL, NULL); + g_free (tem); + } + g_free (wname); + } + } + return retval; +} + +#define __G_WIN32_C__ +#include "galiasdef.c" diff --git a/glib/gwin32.h b/glib/gwin32.h new file mode 100644 index 0000000..5793335 --- /dev/null +++ b/glib/gwin32.h @@ -0,0 +1,114 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#if defined(G_DISABLE_SINGLE_INCLUDES) && !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_WIN32_H__ +#define __G_WIN32_H__ + +#include + +#ifdef G_PLATFORM_WIN32 + +G_BEGIN_DECLS + +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +#ifdef G_OS_WIN32 + +/* + * To get prototypes for the following POSIXish functions, you have to + * include the indicated non-POSIX headers. The functions are defined + * in OLDNAMES.LIB (MSVC) or -lmoldname-msvc (mingw32). But note that + * for POSIX functions that take or return file names in the system + * codepage, in many cases you would want to use the GLib wrappers in + * gstdio.h and UTF-8 instead. + * + * getcwd: (MSVC), (mingw32) + * getpid: + * access: + * unlink: or + * open, read, write, lseek, close: + * rmdir: + * pipe: (actually, _pipe()) + */ + +/* For some POSIX functions that are not provided by the MS runtime, + * we provide emulation functions in glib, which are prefixed with + * g_win32_. Or that was the idea at some time, but there is just one + * of those: + */ +gint g_win32_ftruncate (gint f, + guint size); +#endif /* G_OS_WIN32 */ + +/* The MS setlocale uses locale names of the form "English_United + * States.1252" etc. We want the Unixish standard form "en", "zh_TW" + * etc. This function gets the current thread locale from Windows and + * returns it as a string of the above form for use in forming file + * names etc. The returned string should be deallocated with g_free(). + */ +gchar* g_win32_getlocale (void); + +/* Translate a Win32 error code (as returned by GetLastError()) into + * the corresponding message. The returned string should be deallocated + * with g_free(). + */ +gchar* g_win32_error_message (gint error); + +#ifndef G_DISABLE_DEPRECATED + +#define g_win32_get_package_installation_directory g_win32_get_package_installation_directory_utf8 +#define g_win32_get_package_installation_subdirectory g_win32_get_package_installation_subdirectory_utf8 + +gchar* g_win32_get_package_installation_directory (const gchar *package, + const gchar *dll_name); + +gchar* g_win32_get_package_installation_subdirectory (const gchar *package, + const gchar *dll_name, + const gchar *subdir); + +#endif + +gchar* g_win32_get_package_installation_directory_of_module (gpointer hmodule); + +guint g_win32_get_windows_version (void); + +gchar* g_win32_locale_filename_from_utf8 (const gchar *utf8filename); + +/* As of GLib 2.14 we only support NT-based Windows */ +#define G_WIN32_IS_NT_BASED() TRUE +#define G_WIN32_HAVE_WIDECHAR_API() TRUE + +G_END_DECLS + +#endif /* G_PLATFORM_WIN32 */ + +#endif /* __G_WIN32_H__ */ diff --git a/glib/libcharset/Makefile.am b/glib/libcharset/Makefile.am new file mode 100644 index 0000000..cfa3412 --- /dev/null +++ b/glib/libcharset/Makefile.am @@ -0,0 +1,64 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +INCLUDES = \ + -DLIBDIR=\"$(libdir)\" -I$(top_srcdir) + +noinst_LTLIBRARIES = libcharset.la + +libcharset_la_SOURCES = \ + libcharset.h \ + localcharset.h \ + localcharset.c + +EXTRA_DIST += \ + README \ + config.charset \ + ref-add.sin \ + ref-del.sin \ + glibc21.m4 \ + codeset.m4 \ + update.sh \ + make-patch.sh \ + libcharset-glib.patch + +charset_alias = $(DESTDIR)$(libdir)/charset.alias +charset_tmp = $(DESTDIR)$(libdir)/charset.tmp +install-exec-local: all-local + $(mkinstalldirs) $(DESTDIR)$(libdir) + if test -f $(charset_alias); then \ + sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \ + rm -f $(charset_tmp) ; \ + else \ + if test @GLIBC21@ = no; then \ + sed -f ref-add.sed charset.alias > $(charset_tmp) ; \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \ + rm -f $(charset_tmp) ; \ + fi ; \ + fi + +uninstall-local: all-local + if test -f $(charset_alias); then \ + sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \ + if grep '^# Packages using this file: $$' $(charset_tmp) \ + > /dev/null; then \ + rm -f $(charset_alias); \ + else \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \ + fi; \ + rm -f $(charset_tmp); \ + fi + +charset.alias: config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +all-local: ref-add.sed ref-del.sed charset.alias + +SUFFIXES = .sed .sin +.sin.sed: + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ + mv t-$@ $@ + +CLEANFILES = charset.alias ref-add.sed ref-del.sed diff --git a/glib/libcharset/Makefile.in b/glib/libcharset/Makefile.in new file mode 100644 index 0000000..71b6b73 --- /dev/null +++ b/glib/libcharset/Makefile.in @@ -0,0 +1,699 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = glib/libcharset +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libcharset_la_LIBADD = +am_libcharset_la_OBJECTS = localcharset.lo +libcharset_la_OBJECTS = $(am_libcharset_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libcharset_la_SOURCES) +DIST_SOURCES = $(libcharset_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = README config.charset ref-add.sin ref-del.sin glibc21.m4 \ + codeset.m4 update.sh make-patch.sh libcharset-glib.patch +TEST_PROGS = +INCLUDES = \ + -DLIBDIR=\"$(libdir)\" -I$(top_srcdir) + +noinst_LTLIBRARIES = libcharset.la +libcharset_la_SOURCES = \ + libcharset.h \ + localcharset.h \ + localcharset.c + +charset_alias = $(DESTDIR)$(libdir)/charset.alias +charset_tmp = $(DESTDIR)$(libdir)/charset.tmp +SUFFIXES = .sed .sin +CLEANFILES = charset.alias ref-add.sed ref-del.sed +all: all-am + +.SUFFIXES: +.SUFFIXES: .sed .sin .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu glib/libcharset/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu glib/libcharset/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 +libcharset.la: $(libcharset_la_OBJECTS) $(libcharset_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libcharset_la_OBJECTS) $(libcharset_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localcharset.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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-exec-local + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ + clean clean-generic clean-libtool clean-noinstLTLIBRARIES \ + ctags 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-exec-local 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-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am \ + uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test +install-exec-local: all-local + $(mkinstalldirs) $(DESTDIR)$(libdir) + if test -f $(charset_alias); then \ + sed -f ref-add.sed $(charset_alias) > $(charset_tmp) ; \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \ + rm -f $(charset_tmp) ; \ + else \ + if test @GLIBC21@ = no; then \ + sed -f ref-add.sed charset.alias > $(charset_tmp) ; \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias) ; \ + rm -f $(charset_tmp) ; \ + fi ; \ + fi + +uninstall-local: all-local + if test -f $(charset_alias); then \ + sed -f ref-del.sed $(charset_alias) > $(charset_tmp); \ + if grep '^# Packages using this file: $$' $(charset_tmp) \ + > /dev/null; then \ + rm -f $(charset_alias); \ + else \ + $(INSTALL_DATA) $(charset_tmp) $(charset_alias); \ + fi; \ + rm -f $(charset_tmp); \ + fi + +charset.alias: config.charset + $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + mv t-$@ $@ + +all-local: ref-add.sed ref-del.sed charset.alias +.sin.sed: + sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ + mv t-$@ $@ + +# 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/glib/libcharset/README b/glib/libcharset/README new file mode 100644 index 0000000..c8f53bd --- /dev/null +++ b/glib/libcharset/README @@ -0,0 +1,46 @@ +The sources are derived from Bruno Haible's libcharset library included +with libiconv: + + http//www.gnu.org/software/libiconv + +The 'update.sh' script in this directory, when pointed at +the original sources updates the files in this directory +(and elsewhere in the GLib distribution) to the new version + +The 'make-patch.sh' script in this directory regenerates +the patch files included in this directory from a copy +of the pristine sources and the files in this directory. + +The license on the portions from libiconv portions is reproduced +below. + +Owen Taylor +26 September 2001 + +Updated to libiconv-1.12. + +Behdad Esfahbod +20 May 2008 + +==== + +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library 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. */ + +/* Written by Bruno Haible . */ diff --git a/glib/libcharset/codeset.m4 b/glib/libcharset/codeset.m4 new file mode 100644 index 0000000..a6e67ec --- /dev/null +++ b/glib/libcharset/codeset.m4 @@ -0,0 +1,21 @@ +# codeset.m4 serial AM1 (gettext-0.10.40) +dnl Copyright (C) 2000-2002 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_LANGINFO_CODESET], +[ + AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET);], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +]) diff --git a/glib/libcharset/config.charset b/glib/libcharset/config.charset new file mode 100755 index 0000000..e8c258b --- /dev/null +++ b/glib/libcharset/config.charset @@ -0,0 +1,640 @@ +#! /bin/sh +# Output a system dependent table of character encoding aliases. +# +# Copyright (C) 2000-2004, 2006 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. +# +# The table consists of lines of the form +# ALIAS CANONICAL +# +# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". +# ALIAS is compared in a case sensitive way. +# +# CANONICAL is the GNU canonical name for this character encoding. +# It must be an encoding supported by libiconv. Support by GNU libc is +# also desirable. CANONICAL is case insensitive. Usually an upper case +# MIME charset name is preferred. +# The current list of GNU canonical charset names is as follows. +# +# name MIME? used by which systems +# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin +# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd darwin +# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd darwin +# ISO-8859-3 Y glibc solaris +# ISO-8859-4 Y osf solaris freebsd netbsd darwin +# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd darwin +# ISO-8859-6 Y glibc aix hpux solaris +# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd darwin +# ISO-8859-8 Y glibc aix hpux osf solaris +# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin +# ISO-8859-13 glibc netbsd darwin +# ISO-8859-14 glibc +# ISO-8859-15 glibc aix osf solaris freebsd darwin +# KOI8-R Y glibc solaris freebsd netbsd darwin +# KOI8-U Y glibc freebsd netbsd darwin +# KOI8-T glibc +# CP437 dos +# CP775 dos +# CP850 aix osf dos +# CP852 dos +# CP855 dos +# CP856 aix +# CP857 dos +# CP861 dos +# CP862 dos +# CP864 dos +# CP865 dos +# CP866 freebsd netbsd darwin dos +# CP869 dos +# CP874 woe32 dos +# CP922 aix +# CP932 aix woe32 dos +# CP943 aix +# CP949 osf woe32 dos +# CP950 woe32 dos +# CP1046 aix +# CP1124 aix +# CP1125 dos +# CP1129 aix +# CP1250 woe32 +# CP1251 glibc solaris netbsd darwin woe32 +# CP1252 aix woe32 +# CP1253 woe32 +# CP1254 woe32 +# CP1255 glibc woe32 +# CP1256 woe32 +# CP1257 woe32 +# GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin +# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin +# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin +# EUC-TW glibc aix hpux irix osf solaris netbsd +# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin +# BIG5-HKSCS glibc solaris +# GBK glibc aix osf solaris woe32 dos +# GB18030 glibc solaris netbsd +# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin +# JOHAB glibc solaris woe32 +# TIS-620 glibc aix hpux osf solaris +# VISCII Y glibc +# TCVN5712-1 glibc +# GEORGIAN-PS glibc +# HP-ROMAN8 hpux +# HP-ARABIC8 hpux +# HP-GREEK8 hpux +# HP-HEBREW8 hpux +# HP-TURKISH8 hpux +# HP-KANA8 hpux +# DEC-KANJI osf +# DEC-HANYU osf +# UTF-8 Y glibc aix hpux osf solaris netbsd darwin +# +# Note: Names which are not marked as being a MIME name should not be used in +# Internet protocols for information interchange (mail, news, etc.). +# +# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications +# must understand both names and treat them as equivalent. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + +host="$1" +os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` +echo "# This file contains a table of character encoding aliases," +echo "# suitable for operating system '${os}'." +echo "# It was automatically generated from config.charset." +# List of references, updated during installation: +echo "# Packages using this file: " +case "$os" in + linux-gnulibc1*) + # Linux libc5 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "C ASCII" + echo "POSIX ASCII" + for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ + en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ + en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ + es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ + et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ + fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ + it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ + sv_FI sv_SE; do + echo "$l ISO-8859-1" + echo "$l.iso-8859-1 ISO-8859-1" + echo "$l.iso-8859-15 ISO-8859-15" + echo "$l.iso-8859-15@euro ISO-8859-15" + echo "$l@euro ISO-8859-15" + echo "$l.cp-437 CP437" + echo "$l.cp-850 CP850" + echo "$l.cp-1252 CP1252" + echo "$l.cp-1252@euro CP1252" + #echo "$l.atari-st ATARI-ST" # not a commonly used encoding + echo "$l.utf-8 UTF-8" + echo "$l.utf-8@euro UTF-8" + done + for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ + sl_SI sr sr_CS sr_YU; do + echo "$l ISO-8859-2" + echo "$l.iso-8859-2 ISO-8859-2" + echo "$l.cp-852 CP852" + echo "$l.cp-1250 CP1250" + echo "$l.utf-8 UTF-8" + done + for l in mk mk_MK ru ru_RU; do + echo "$l ISO-8859-5" + echo "$l.iso-8859-5 ISO-8859-5" + echo "$l.koi8-r KOI8-R" + echo "$l.cp-866 CP866" + echo "$l.cp-1251 CP1251" + echo "$l.utf-8 UTF-8" + done + for l in ar ar_SA; do + echo "$l ISO-8859-6" + echo "$l.iso-8859-6 ISO-8859-6" + echo "$l.cp-864 CP864" + #echo "$l.cp-868 CP868" # not a commonly used encoding + echo "$l.cp-1256 CP1256" + echo "$l.utf-8 UTF-8" + done + for l in el el_GR gr gr_GR; do + echo "$l ISO-8859-7" + echo "$l.iso-8859-7 ISO-8859-7" + echo "$l.cp-869 CP869" + echo "$l.cp-1253 CP1253" + echo "$l.cp-1253@euro CP1253" + echo "$l.utf-8 UTF-8" + echo "$l.utf-8@euro UTF-8" + done + for l in he he_IL iw iw_IL; do + echo "$l ISO-8859-8" + echo "$l.iso-8859-8 ISO-8859-8" + echo "$l.cp-862 CP862" + echo "$l.cp-1255 CP1255" + echo "$l.utf-8 UTF-8" + done + for l in tr tr_TR; do + echo "$l ISO-8859-9" + echo "$l.iso-8859-9 ISO-8859-9" + echo "$l.cp-857 CP857" + echo "$l.cp-1254 CP1254" + echo "$l.utf-8 UTF-8" + done + for l in lt lt_LT lv lv_LV; do + #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name + echo "$l ISO-8859-13" + done + for l in ru_UA uk uk_UA; do + echo "$l KOI8-U" + done + for l in zh zh_CN; do + #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name + echo "$l GB2312" + done + for l in ja ja_JP ja_JP.EUC; do + echo "$l EUC-JP" + done + for l in ko ko_KR; do + echo "$l EUC-KR" + done + for l in th th_TH; do + echo "$l TIS-620" + done + for l in fa fa_IR; do + #echo "$l ISIRI-3342" # a broken encoding + echo "$l.utf-8 UTF-8" + done + ;; + linux* | *-gnu*) + # With glibc-2.1 or newer, we don't need any canonicalization, + # because glibc has iconv and both glibc and libiconv support all + # GNU canonical names directly. Therefore, the Makefile does not + # need to install the alias file at all. + # The following applies only to glibc-2.0.x and older libcs. + echo "ISO_646.IRV:1983 ASCII" + ;; + aix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "IBM-850 CP850" + echo "IBM-856 CP856" + echo "IBM-921 ISO-8859-13" + echo "IBM-922 CP922" + echo "IBM-932 CP932" + echo "IBM-943 CP943" + echo "IBM-1046 CP1046" + echo "IBM-1124 CP1124" + echo "IBM-1129 CP1129" + echo "IBM-1252 CP1252" + echo "IBM-eucCN GB2312" + echo "IBM-eucJP EUC-JP" + echo "IBM-eucKR EUC-KR" + echo "IBM-eucTW EUC-TW" + echo "big5 BIG5" + echo "GBK GBK" + echo "TIS-620 TIS-620" + echo "UTF-8 UTF-8" + ;; + hpux*) + echo "iso88591 ISO-8859-1" + echo "iso88592 ISO-8859-2" + echo "iso88595 ISO-8859-5" + echo "iso88596 ISO-8859-6" + echo "iso88597 ISO-8859-7" + echo "iso88598 ISO-8859-8" + echo "iso88599 ISO-8859-9" + echo "iso885915 ISO-8859-15" + echo "roman8 HP-ROMAN8" + echo "arabic8 HP-ARABIC8" + echo "greek8 HP-GREEK8" + echo "hebrew8 HP-HEBREW8" + echo "turkish8 HP-TURKISH8" + echo "kana8 HP-KANA8" + echo "tis620 TIS-620" + echo "big5 BIG5" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "hp15CN GB2312" + #echo "ccdc ?" # what is this? + echo "SJIS SHIFT_JIS" + echo "utf8 UTF-8" + ;; + irix*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-9 ISO-8859-9" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + ;; + osf*) + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "cp850 CP850" + echo "big5 BIG5" + echo "dechanyu DEC-HANYU" + echo "dechanzi GB2312" + echo "deckanji DEC-KANJI" + echo "deckorean EUC-KR" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "GBK GBK" + echo "KSC5601 CP949" + echo "sdeckanji EUC-JP" + echo "SJIS SHIFT_JIS" + echo "TACTIS TIS-620" + echo "UTF-8 UTF-8" + ;; + solaris*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-3 ISO-8859-3" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-6 ISO-8859-6" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-8 ISO-8859-8" + echo "ISO8859-9 ISO-8859-9" + echo "ISO8859-15 ISO-8859-15" + echo "koi8-r KOI8-R" + echo "ansi-1251 CP1251" + echo "BIG5 BIG5" + echo "Big5-HKSCS BIG5-HKSCS" + echo "gb2312 GB2312" + echo "GBK GBK" + echo "GB18030 GB18030" + echo "cns11643 EUC-TW" + echo "5601 EUC-KR" + echo "ko_KR.johap92 JOHAB" + echo "eucJP EUC-JP" + echo "PCK SHIFT_JIS" + echo "TIS620.2533 TIS-620" + #echo "sun_eu_greek ?" # what is this? + echo "UTF-8 UTF-8" + ;; + freebsd* | os2*) + # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just + # reuse FreeBSD's locale data for OS/2. + echo "C ASCII" + echo "US-ASCII ASCII" + for l in la_LN lt_LN; do + echo "$l.ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ + lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do + echo "$l.ISO_8859-1 ISO-8859-1" + echo "$l.DIS_8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do + echo "$l.ISO_8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO_8859-4 ISO-8859-4" + done + for l in ru_RU ru_SU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO_8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ja_JP.Shift_JIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + netbsd*) + echo "646 ASCII" + echo "ISO8859-1 ISO-8859-1" + echo "ISO8859-2 ISO-8859-2" + echo "ISO8859-4 ISO-8859-4" + echo "ISO8859-5 ISO-8859-5" + echo "ISO8859-7 ISO-8859-7" + echo "ISO8859-13 ISO-8859-13" + echo "ISO8859-15 ISO-8859-15" + echo "eucCN GB2312" + echo "eucJP EUC-JP" + echo "eucKR EUC-KR" + echo "eucTW EUC-TW" + echo "BIG5 BIG5" + echo "SJIS SHIFT_JIS" + ;; + darwin[56]*) + # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "C ASCII" + for l in en_AU en_CA en_GB en_US la_LN; do + echo "$l.US-ASCII ASCII" + done + for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ + fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ + nl_NL no_NO pt_PT sv_SE; do + echo "$l ISO-8859-1" + echo "$l.ISO8859-1 ISO-8859-1" + echo "$l.ISO8859-15 ISO-8859-15" + done + for l in la_LN; do + echo "$l.ISO8859-1 ISO-8859-1" + echo "$l.ISO8859-15 ISO-8859-15" + done + for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do + echo "$l.ISO8859-2 ISO-8859-2" + done + for l in la_LN lt_LT; do + echo "$l.ISO8859-4 ISO-8859-4" + done + for l in ru_RU; do + echo "$l.KOI8-R KOI8-R" + echo "$l.ISO8859-5 ISO-8859-5" + echo "$l.CP866 CP866" + done + for l in bg_BG; do + echo "$l.CP1251 CP1251" + done + echo "uk_UA.KOI8-U KOI8-U" + echo "zh_TW.BIG5 BIG5" + echo "zh_TW.Big5 BIG5" + echo "zh_CN.EUC GB2312" + echo "ja_JP.EUC EUC-JP" + echo "ja_JP.SJIS SHIFT_JIS" + echo "ko_KR.EUC EUC-KR" + ;; + darwin*) + # Darwin 7.5 has nl_langinfo(CODESET), but it is useless: + # - It returns the empty string when LANG is set to a locale of the + # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 + # LC_CTYPE file. + # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by + # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. + # - The documentation says: + # "... all code that calls BSD system routines should ensure + # that the const *char parameters of these routines are in UTF-8 + # encoding. All BSD system functions expect their string + # parameters to be in UTF-8 encoding and nothing else." + # It also says + # "An additional caveat is that string parameters for files, + # paths, and other file-system entities must be in canonical + # UTF-8. In a canonical UTF-8 Unicode string, all decomposable + # characters are decomposed ..." + # but this is not true: You can pass non-decomposed UTF-8 strings + # to file system functions, and it is the OS which will convert + # them to decomposed UTF-8 before accessing the file system. + # - The Apple Terminal application displays UTF-8 by default. + # - However, other applications are free to use different encodings: + # - xterm uses ISO-8859-1 by default. + # - TextEdit uses MacRoman by default. + # We prefer UTF-8 over decomposed UTF-8-MAC because one should + # minimize the use of decomposed Unicode. Unfortunately, through the + # Darwin file system, decomposed UTF-8 strings are leaked into user + # space nevertheless. + echo "* UTF-8" + ;; + beos*) + # BeOS has a single locale, and it has UTF-8 encoding. + echo "* UTF-8" + ;; + msdosdjgpp*) + # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore + # localcharset.c falls back to using the full locale name + # from the environment variables. + echo "#" + echo "# The encodings given here may not all be correct." + echo "# If you find that the encoding given for your language and" + echo "# country is not the one your DOS machine actually uses, just" + echo "# correct it in this file, and send a mail to" + echo "# Juan Manuel Guerrero " + echo "# and Bruno Haible ." + echo "#" + echo "C ASCII" + # ISO-8859-1 languages + echo "ca CP850" + echo "ca_ES CP850" + echo "da CP865" # not CP850 ?? + echo "da_DK CP865" # not CP850 ?? + echo "de CP850" + echo "de_AT CP850" + echo "de_CH CP850" + echo "de_DE CP850" + echo "en CP850" + echo "en_AU CP850" # not CP437 ?? + echo "en_CA CP850" + echo "en_GB CP850" + echo "en_NZ CP437" + echo "en_US CP437" + echo "en_ZA CP850" # not CP437 ?? + echo "es CP850" + echo "es_AR CP850" + echo "es_BO CP850" + echo "es_CL CP850" + echo "es_CO CP850" + echo "es_CR CP850" + echo "es_CU CP850" + echo "es_DO CP850" + echo "es_EC CP850" + echo "es_ES CP850" + echo "es_GT CP850" + echo "es_HN CP850" + echo "es_MX CP850" + echo "es_NI CP850" + echo "es_PA CP850" + echo "es_PY CP850" + echo "es_PE CP850" + echo "es_SV CP850" + echo "es_UY CP850" + echo "es_VE CP850" + echo "et CP850" + echo "et_EE CP850" + echo "eu CP850" + echo "eu_ES CP850" + echo "fi CP850" + echo "fi_FI CP850" + echo "fr CP850" + echo "fr_BE CP850" + echo "fr_CA CP850" + echo "fr_CH CP850" + echo "fr_FR CP850" + echo "ga CP850" + echo "ga_IE CP850" + echo "gd CP850" + echo "gd_GB CP850" + echo "gl CP850" + echo "gl_ES CP850" + echo "id CP850" # not CP437 ?? + echo "id_ID CP850" # not CP437 ?? + echo "is CP861" # not CP850 ?? + echo "is_IS CP861" # not CP850 ?? + echo "it CP850" + echo "it_CH CP850" + echo "it_IT CP850" + echo "lt CP775" + echo "lt_LT CP775" + echo "lv CP775" + echo "lv_LV CP775" + echo "nb CP865" # not CP850 ?? + echo "nb_NO CP865" # not CP850 ?? + echo "nl CP850" + echo "nl_BE CP850" + echo "nl_NL CP850" + echo "nn CP865" # not CP850 ?? + echo "nn_NO CP865" # not CP850 ?? + echo "no CP865" # not CP850 ?? + echo "no_NO CP865" # not CP850 ?? + echo "pt CP850" + echo "pt_BR CP850" + echo "pt_PT CP850" + echo "sv CP850" + echo "sv_SE CP850" + # ISO-8859-2 languages + echo "cs CP852" + echo "cs_CZ CP852" + echo "hr CP852" + echo "hr_HR CP852" + echo "hu CP852" + echo "hu_HU CP852" + echo "pl CP852" + echo "pl_PL CP852" + echo "ro CP852" + echo "ro_RO CP852" + echo "sk CP852" + echo "sk_SK CP852" + echo "sl CP852" + echo "sl_SI CP852" + echo "sq CP852" + echo "sq_AL CP852" + echo "sr CP852" # CP852 or CP866 or CP855 ?? + echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? + echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? + # ISO-8859-3 languages + echo "mt CP850" + echo "mt_MT CP850" + # ISO-8859-5 languages + echo "be CP866" + echo "be_BE CP866" + echo "bg CP866" # not CP855 ?? + echo "bg_BG CP866" # not CP855 ?? + echo "mk CP866" # not CP855 ?? + echo "mk_MK CP866" # not CP855 ?? + echo "ru CP866" + echo "ru_RU CP866" + echo "uk CP1125" + echo "uk_UA CP1125" + # ISO-8859-6 languages + echo "ar CP864" + echo "ar_AE CP864" + echo "ar_DZ CP864" + echo "ar_EG CP864" + echo "ar_IQ CP864" + echo "ar_IR CP864" + echo "ar_JO CP864" + echo "ar_KW CP864" + echo "ar_MA CP864" + echo "ar_OM CP864" + echo "ar_QA CP864" + echo "ar_SA CP864" + echo "ar_SY CP864" + # ISO-8859-7 languages + echo "el CP869" + echo "el_GR CP869" + # ISO-8859-8 languages + echo "he CP862" + echo "he_IL CP862" + # ISO-8859-9 languages + echo "tr CP857" + echo "tr_TR CP857" + # Japanese + echo "ja CP932" + echo "ja_JP CP932" + # Chinese + echo "zh_CN GBK" + echo "zh_TW CP950" # not CP938 ?? + # Korean + echo "kr CP949" # not CP934 ?? + echo "kr_KR CP949" # not CP934 ?? + # Thai + echo "th CP874" + echo "th_TH CP874" + # Other + echo "eo CP850" + echo "eo_EO CP850" + ;; +esac diff --git a/glib/libcharset/glibc21.m4 b/glib/libcharset/glibc21.m4 new file mode 100644 index 0000000..d95fd98 --- /dev/null +++ b/glib/libcharset/glibc21.m4 @@ -0,0 +1,30 @@ +# glibc21.m4 serial 3 +dnl Copyright (C) 2000-2002, 2004 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. + +# Test for the GNU C Library, version 2.1 or newer. +# From Bruno Haible. + +AC_DEFUN([gl_GLIBC21], + [ + AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, + ac_cv_gnu_library_2_1, + [AC_EGREP_CPP([Lucky GNU user], + [ +#include +#ifdef __GNU_LIBRARY__ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) + Lucky GNU user + #endif +#endif + ], + ac_cv_gnu_library_2_1=yes, + ac_cv_gnu_library_2_1=no) + ] + ) + AC_SUBST(GLIBC21) + GLIBC21="$ac_cv_gnu_library_2_1" + ] +) diff --git a/glib/libcharset/libcharset-glib.patch b/glib/libcharset/libcharset-glib.patch new file mode 100644 index 0000000..358d774 --- /dev/null +++ b/glib/libcharset/libcharset-glib.patch @@ -0,0 +1,77 @@ +# Patch against libcharset version 1.4 +--- libiconv-1.12/libcharset//lib/localcharset.c 2006-10-18 07:55:49.000000000 -0400 ++++ localcharset.c 2008-05-20 18:36:24.000000000 -0400 +@@ -103,8 +103,8 @@ + static const char * volatile charset_aliases; + + /* Return a pointer to the contents of the charset.alias file. */ +-static const char * +-get_charset_aliases (void) ++const char * ++_g_locale_get_charset_aliases (void) + { + const char *cp; + +@@ -280,14 +280,10 @@ + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +-#ifdef STATIC +-STATIC +-#endif + const char * +-locale_charset (void) ++_g_locale_charset_raw (void) + { + const char *codeset; +- const char *aliases; + + #if !(defined WIN32_NATIVE || defined OS2) + +@@ -436,12 +432,20 @@ + + #endif + ++ return codeset; ++} ++ ++const char * ++_g_locale_charset_unalias (const char *codeset) ++{ ++ const char *aliases; ++ + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ +- for (aliases = get_charset_aliases (); ++ for (aliases = _g_locale_get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 +--- libiconv-1.12/libcharset//include/libcharset.h.in 2005-05-19 13:14:56.000000000 -0400 ++++ libcharset.h 2008-05-20 18:39:44.000000000 -0400 +@@ -19,7 +19,7 @@ + #ifndef _LIBCHARSET_H + #define _LIBCHARSET_H + +-#include ++#include "localcharset.h" + + + #ifdef __cplusplus +--- libiconv-1.12/libcharset//include/localcharset.h.in 2005-05-19 13:14:57.000000000 -0400 ++++ localcharset.h 2008-05-20 18:36:24.000000000 -0400 +@@ -31,8 +31,9 @@ + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ +-extern const char * locale_charset (void); +- ++extern const char * _g_locale_charset_raw (void); ++extern const char * _g_locale_charset_unalias (const char *codeset); ++extern const char * _g_locale_get_charset_aliases (void); + + #ifdef __cplusplus + } diff --git a/glib/libcharset/libcharset.h b/glib/libcharset/libcharset.h new file mode 100644 index 0000000..686241e --- /dev/null +++ b/glib/libcharset/libcharset.h @@ -0,0 +1,46 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU CHARSET Library. + + The GNU CHARSET Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU CHARSET Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with the GNU CHARSET Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street, + Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _LIBCHARSET_H +#define _LIBCHARSET_H + +#include "localcharset.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Support for relocatable packages. */ + +/* Sets the original and the current installation prefix of the package. + Relocation simply replaces a pathname starting with the original prefix + by the corresponding pathname with the current prefix instead. Both + prefixes should be directory names without trailing slash (i.e. use "" + instead of "/"). */ +extern void libcharset_set_relocation_prefix (const char *orig_prefix, + const char *curr_prefix); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _LIBCHARSET_H */ diff --git a/glib/libcharset/localcharset.c b/glib/libcharset/localcharset.c new file mode 100644 index 0000000..0d001f9 --- /dev/null +++ b/glib/libcharset/localcharset.c @@ -0,0 +1,465 @@ +/* Determine a canonical name for the current locale's character encoding. + + Copyright (C) 2000-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* Written by Bruno Haible . */ + +#include "config.h" + +/* Specification. */ +#include "localcharset.h" + +#include +#include +#include +#include + +#if defined _WIN32 || defined __WIN32__ +# define WIN32_NATIVE +#endif + +#if defined __EMX__ +/* Assume EMX program runs on OS/2, even if compiled under DOS. */ +# define OS2 +#endif + +#if !defined WIN32_NATIVE +# if HAVE_LANGINFO_CODESET +# include +# else +# if 0 /* see comment below */ +# include +# endif +# endif +# ifdef __CYGWIN__ +# define WIN32_LEAN_AND_MEAN +# include +# endif +#elif defined WIN32_NATIVE +# define WIN32_LEAN_AND_MEAN +# include +#endif +#if defined OS2 +# define INCL_DOS +# include +#endif + +#if ENABLE_RELOCATABLE +# include "relocatable.h" +#else +# define relocate(pathname) (pathname) +#endif + +/* Get LIBDIR. */ +#ifndef LIBDIR +# include "configmake.h" +#endif + +#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ + /* Win32, Cygwin, OS/2, DOS */ +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +#endif + +#if HAVE_DECL_GETC_UNLOCKED +# undef getc +# define getc getc_unlocked +#endif + +/* The following static variable is declared 'volatile' to avoid a + possible multithread problem in the function get_charset_aliases. If we + are running in a threaded environment, and if two threads initialize + 'charset_aliases' simultaneously, both will produce the same value, + and everything will be ok if the two assignments to 'charset_aliases' + are atomic. But I don't know what will happen if the two assignments mix. */ +#if __STDC__ != 1 +# define volatile /* empty */ +#endif +/* Pointer to the contents of the charset.alias file, if it has already been + read, else NULL. Its format is: + ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ +static const char * volatile charset_aliases; + +/* Return a pointer to the contents of the charset.alias file. */ +const char * +_g_locale_get_charset_aliases (void) +{ + const char *cp; + + cp = charset_aliases; + if (cp == NULL) + { +#if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) + FILE *fp; + const char *dir; + const char *base = "charset.alias"; + char *file_name; + + /* Make it possible to override the charset.alias location. This is + necessary for running the testsuite before "make install". */ + dir = getenv ("CHARSETALIASDIR"); + if (dir == NULL || dir[0] == '\0') + dir = relocate (LIBDIR); + + /* Concatenate dir and base into freshly allocated file_name. */ + { + size_t dir_len = strlen (dir); + size_t base_len = strlen (base); + int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); + file_name = (char *) malloc (dir_len + add_slash + base_len + 1); + if (file_name != NULL) + { + memcpy (file_name, dir, dir_len); + if (add_slash) + file_name[dir_len] = DIRECTORY_SEPARATOR; + memcpy (file_name + dir_len + add_slash, base, base_len + 1); + } + } + + if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) + /* Out of memory or file not found, treat it as empty. */ + cp = ""; + else + { + /* Parse the file's contents. */ + char *res_ptr = NULL; + size_t res_size = 0; + + for (;;) + { + int c; + char buf1[50+1]; + char buf2[50+1]; + size_t l1, l2; + char *old_res_ptr; + + c = getc (fp); + if (c == EOF) + break; + if (c == '\n' || c == ' ' || c == '\t') + continue; + if (c == '#') + { + /* Skip comment, to end of line. */ + do + c = getc (fp); + while (!(c == EOF || c == '\n')); + if (c == EOF) + break; + continue; + } + ungetc (c, fp); + if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) + break; + l1 = strlen (buf1); + l2 = strlen (buf2); + old_res_ptr = res_ptr; + if (res_size == 0) + { + res_size = l1 + 1 + l2 + 1; + res_ptr = (char *) malloc (res_size + 1); + } + else + { + res_size += l1 + 1 + l2 + 1; + res_ptr = (char *) realloc (res_ptr, res_size + 1); + } + if (res_ptr == NULL) + { + /* Out of memory. */ + res_size = 0; + if (old_res_ptr != NULL) + free (old_res_ptr); + break; + } + strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); + strcpy (res_ptr + res_size - (l2 + 1), buf2); + } + fclose (fp); + if (res_size == 0) + cp = ""; + else + { + *(res_ptr + res_size) = '\0'; + cp = res_ptr; + } + } + + if (file_name != NULL) + free (file_name); + +#else + +# if defined VMS + /* To avoid the troubles of an extra file charset.alias_vms in the + sources of many GNU packages, simply inline the aliases here. */ + /* The list of encodings is taken from the OpenVMS 7.3-1 documentation + "Compaq C Run-Time Library Reference Manual for OpenVMS systems" + section 10.7 "Handling Different Character Sets". */ + cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" + "ISO8859-2" "\0" "ISO-8859-2" "\0" + "ISO8859-5" "\0" "ISO-8859-5" "\0" + "ISO8859-7" "\0" "ISO-8859-7" "\0" + "ISO8859-8" "\0" "ISO-8859-8" "\0" + "ISO8859-9" "\0" "ISO-8859-9" "\0" + /* Japanese */ + "eucJP" "\0" "EUC-JP" "\0" + "SJIS" "\0" "SHIFT_JIS" "\0" + "DECKANJI" "\0" "DEC-KANJI" "\0" + "SDECKANJI" "\0" "EUC-JP" "\0" + /* Chinese */ + "eucTW" "\0" "EUC-TW" "\0" + "DECHANYU" "\0" "DEC-HANYU" "\0" + "DECHANZI" "\0" "GB2312" "\0" + /* Korean */ + "DECKOREAN" "\0" "EUC-KR" "\0"; +# endif + +# if defined WIN32_NATIVE || defined __CYGWIN__ + /* To avoid the troubles of installing a separate file in the same + directory as the DLL and of retrieving the DLL's directory at + runtime, simply inline the aliases here. */ + + cp = "CP936" "\0" "GBK" "\0" + "CP1361" "\0" "JOHAB" "\0" + "CP20127" "\0" "ASCII" "\0" + "CP20866" "\0" "KOI8-R" "\0" + "CP20936" "\0" "GB2312" "\0" + "CP21866" "\0" "KOI8-RU" "\0" + "CP28591" "\0" "ISO-8859-1" "\0" + "CP28592" "\0" "ISO-8859-2" "\0" + "CP28593" "\0" "ISO-8859-3" "\0" + "CP28594" "\0" "ISO-8859-4" "\0" + "CP28595" "\0" "ISO-8859-5" "\0" + "CP28596" "\0" "ISO-8859-6" "\0" + "CP28597" "\0" "ISO-8859-7" "\0" + "CP28598" "\0" "ISO-8859-8" "\0" + "CP28599" "\0" "ISO-8859-9" "\0" + "CP28605" "\0" "ISO-8859-15" "\0" + "CP38598" "\0" "ISO-8859-8" "\0" + "CP51932" "\0" "EUC-JP" "\0" + "CP51936" "\0" "GB2312" "\0" + "CP51949" "\0" "EUC-KR" "\0" + "CP51950" "\0" "EUC-TW" "\0" + "CP54936" "\0" "GB18030" "\0" + "CP65001" "\0" "UTF-8" "\0"; +# endif +#endif + + charset_aliases = cp; + } + + return cp; +} + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ + +const char * +_g_locale_charset_raw (void) +{ + const char *codeset; + +#if !(defined WIN32_NATIVE || defined OS2) + +# if HAVE_LANGINFO_CODESET + + /* Most systems support nl_langinfo (CODESET) nowadays. */ + codeset = nl_langinfo (CODESET); + +# ifdef __CYGWIN__ + /* Cygwin 2006 does not have locales. nl_langinfo (CODESET) always + returns "US-ASCII". As long as this is not fixed, return the suffix + of the locale name from the environment variables (if present) or + the codepage as a number. */ + if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) + { + const char *locale; + static char buf[2 + 10 + 1]; + + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return + it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + } + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + } +# endif + +# else + + /* On old systems which lack it, use setlocale or getenv. */ + const char *locale = NULL; + + /* But most old systems don't have a complete set of locales. Some + (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't + use setlocale here; it would return "C" when it doesn't support the + locale name the user has set. */ +# if 0 + locale = setlocale (LC_CTYPE, NULL); +# endif + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + } + + /* On some old systems, one used to set locale = "iso8859_1". On others, + you set it to "language_COUNTRY.charset". In any case, we resolve it + through the charset.alias file. */ + codeset = locale; + +# endif + +#elif defined WIN32_NATIVE + + static char buf[2 + 10 + 1]; + + /* Woe32 has a function returning the locale's codepage as a number. */ + sprintf (buf, "CP%u", GetACP ()); + codeset = buf; + +#elif defined OS2 + + const char *locale; + static char buf[2 + 10 + 1]; + ULONG cp[3]; + ULONG cplen; + + /* Allow user to override the codeset, as set in the operating system, + with standard language environment variables. */ + locale = getenv ("LC_ALL"); + if (locale == NULL || locale[0] == '\0') + { + locale = getenv ("LC_CTYPE"); + if (locale == NULL || locale[0] == '\0') + locale = getenv ("LANG"); + } + if (locale != NULL && locale[0] != '\0') + { + /* If the locale name contains an encoding after the dot, return it. */ + const char *dot = strchr (locale, '.'); + + if (dot != NULL) + { + const char *modifier; + + dot++; + /* Look for the possible @... trailer and remove it, if any. */ + modifier = strchr (dot, '@'); + if (modifier == NULL) + return dot; + if (modifier - dot < sizeof (buf)) + { + memcpy (buf, dot, modifier - dot); + buf [modifier - dot] = '\0'; + return buf; + } + } + + /* Resolve through the charset.alias file. */ + codeset = locale; + } + else + { + /* OS/2 has a function returning the locale's codepage as a number. */ + if (DosQueryCp (sizeof (cp), cp, &cplen)) + codeset = ""; + else + { + sprintf (buf, "CP%u", cp[0]); + codeset = buf; + } + } + +#endif + + return codeset; +} + +const char * +_g_locale_charset_unalias (const char *codeset) +{ + const char *aliases; + + if (codeset == NULL) + /* The canonical name cannot be determined. */ + codeset = ""; + + /* Resolve alias. */ + for (aliases = _g_locale_get_charset_aliases (); + *aliases != '\0'; + aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) + if (strcmp (codeset, aliases) == 0 + || (aliases[0] == '*' && aliases[1] == '\0')) + { + codeset = aliases + strlen (aliases) + 1; + break; + } + + /* Don't return an empty string. GNU libc and GNU libiconv interpret + the empty string as denoting "the locale's character encoding", + thus GNU libiconv would call this function a second time. */ + if (codeset[0] == '\0') + codeset = "ASCII"; + + return codeset; +} diff --git a/glib/libcharset/localcharset.h b/glib/libcharset/localcharset.h new file mode 100644 index 0000000..674aa3a --- /dev/null +++ b/glib/libcharset/localcharset.h @@ -0,0 +1,43 @@ +/* Determine a canonical name for the current locale's character encoding. + Copyright (C) 2000-2003 Free Software Foundation, Inc. + This file is part of the GNU CHARSET Library. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LOCALCHARSET_H +#define _LOCALCHARSET_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Determine the current locale's character encoding, and canonicalize it + into one of the canonical names listed in config.charset. + The result must not be freed; it is statically allocated. + If the canonical name cannot be determined, the result is a non-canonical + name. */ +extern const char * _g_locale_charset_raw (void); +extern const char * _g_locale_charset_unalias (const char *codeset); +extern const char * _g_locale_get_charset_aliases (void); + +#ifdef __cplusplus +} +#endif + + +#endif /* _LOCALCHARSET_H */ diff --git a/glib/libcharset/make-patch.sh b/glib/libcharset/make-patch.sh new file mode 100755 index 0000000..e60014a --- /dev/null +++ b/glib/libcharset/make-patch.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +if test $# = 1 ; then + ORIGINAL=$1 +else + echo "Usage: make-patch.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +if test -f $ORIGINAL/lib/localcharset.c ; then : ; else + echo "Usage: make-patch.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +VERSION=`grep VERSION= $ORIGINAL/configure.ac | sed s/VERSION=//` + +echo "# Patch against libcharset version $VERSION" > libcharset-glib.patch + +for i in localcharset.c ref-add.sin ref-del.sin ; do + diff -u $ORIGINAL/lib/$i $i >> libcharset-glib.patch +done + +for i in glibc21.m4 codeset.m4 ; do + diff -u $ORIGINAL/m4/$i $i >> libcharset-glib.patch +done + +diff -u $ORIGINAL/include/libcharset.h.in libcharset.h >> libcharset-glib.patch +diff -u $ORIGINAL/include/localcharset.h.in localcharset.h >> libcharset-glib.patch diff --git a/glib/libcharset/ref-add.sin b/glib/libcharset/ref-add.sin new file mode 100644 index 0000000..0e2b97b --- /dev/null +++ b/glib/libcharset/ref-add.sin @@ -0,0 +1,31 @@ +# Add this package to a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + ta + :a + s/ @PACKAGE@ / @PACKAGE@ / + tb + s/ $/ @PACKAGE@ / + :b + s/^/# Packages using this file:/ +} diff --git a/glib/libcharset/ref-del.sin b/glib/libcharset/ref-del.sin new file mode 100644 index 0000000..1fafbfc --- /dev/null +++ b/glib/libcharset/ref-del.sin @@ -0,0 +1,26 @@ +# Remove this package from a list of references stored in a text file. +# +# Copyright (C) 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; either version 2, 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +# USA. +# +# Written by Bruno Haible . +# +/^# Packages using this file: / { + s/# Packages using this file:// + s/ @PACKAGE@ / / + s/^/# Packages using this file:/ +} diff --git a/glib/libcharset/update.sh b/glib/libcharset/update.sh new file mode 100755 index 0000000..5873fc7 --- /dev/null +++ b/glib/libcharset/update.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +if test $# = 1 ; then + ORIGINAL=$1 +else + echo "Usage: update.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +if test -f $ORIGINAL/lib/localcharset.c ; then : ; else + echo "Usage: update.sh /path/to/libcharset" 1>&2 + exit 1 +fi + +VERSION=`grep VERSION= $ORIGINAL/configure.ac | sed s/VERSION=//` + +for i in localcharset.c ref-add.sin ref-del.sin config.charset ; do + cp $ORIGINAL/lib/$i . +done + +for i in libcharset.h localcharset.h ; do + cp $ORIGINAL/include/$i.in ./$i +done + +for i in codeset.m4 glibc21.m4 ; do + cp $ORIGINAL/m4/$i . +done + +patch -p0 < libcharset-glib.patch + +echo "dnl From libcharset $VERSION" > ../../aclibcharset.m4 + + diff --git a/glib/libglib-gdb.py.in b/glib/libglib-gdb.py.in new file mode 100644 index 0000000..78316be --- /dev/null +++ b/glib/libglib-gdb.py.in @@ -0,0 +1,10 @@ +import sys +import gdb + +# Update module path. +dir = '@datadir@/glib-2.0/gdb' +if not dir in sys.path: + sys.path.insert(0, dir) + +from glib import register +register (gdb.current_objfile ()) diff --git a/glib/makefile.msc.in b/glib/makefile.msc.in new file mode 100644 index 0000000..e13673a --- /dev/null +++ b/glib/makefile.msc.in @@ -0,0 +1,151 @@ +## Makefile for building the GLib dlls with Microsoft C +## Use: nmake -f makefile.msc + +TOP = ..\.. + +!INCLUDE ..\build\win32\make.msc + +################################################################ + +INCLUDES = -FImsvc_recommended_pragmas.h -I . -I .. +DEFINES = \ + -DHAVE_CONFIG_H -DGLIB_COMPILATION -DG_LOG_DOMAIN=\"GLib\" \ + -DG_ENABLE_DEBUG -DPCRE_STATIC -DG_DISABLE_DEPRECATED \ + -DDLL_EXPORT=1 + +DEPCFLAGS = -Zm400 $(INTL_CFLAGS) $(DIRENT_CFLAGS) + +all : \ + ..\config.h \ + ..\glibconfig.h \ + galias.h \ + galiasdef.c \ + gnulib\gnulib.lib \ + pcre\pcre.lib \ + libglib-2.0-0.dll \ + glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib \ + gspawn-win32-helper.exe \ + gspawn-win32-helper-console.exe \ + + +gnulib\gnulib.lib : + cd gnulib + nmake -f makefile.msc + cd .. + +pcre\pcre.lib : + cd pcre + nmake -f makefile.msc + cd .. + +glib_OBJECTS = \ + garray.obj \ + gasyncqueue.obj \ + gatomic.obj \ + gbacktrace.obj \ + gbase64.obj \ + gbookmarkfile.obj \ + gcache.obj \ + gchecksum.obj \ + gcompletion.obj \ + gconvert.obj \ + gdataset.obj \ + gdate.obj \ + gdir.obj \ + gerror.obj \ + gfileutils.obj \ + ghash.obj \ + ghostutils.obj \ + ghook.obj \ + giochannel.obj \ + giowin32.obj \ + gpoll.obj \ + gkeyfile.obj \ + glist.obj \ + gmain.obj \ + gmappedfile.obj \ + gmarkup.obj \ + gmem.obj \ + gmessages.obj \ + gnode.obj \ + goption.obj \ + gpattern.obj \ + gprimes.obj \ + gprintf.obj \ + gqsort.obj \ + gqueue.obj \ + grand.obj \ + gregex.obj \ + grel.obj \ + gscanner.obj \ + gsequence.obj \ + gshell.obj \ + gslice.obj \ + gslist.obj \ + gspawn-win32.obj \ + gstdio.obj \ + gstrfuncs.obj \ + gstring.obj \ + gtestutils.obj \ + gthread.obj \ + gthreadpool.obj \ + gtimer.obj \ + gtree.obj \ + gunibreak.obj \ + gunicollate.obj \ + gunidecomp.obj \ + guniprop.obj \ + gurifuncs.obj \ + gutf8.obj \ + gutils.obj \ + gwin32.obj \ + localcharset.obj + +..\glibconfig.h: ..\glibconfig.h.win32 + copy ..\glibconfig.h.win32 ..\glibconfig.h + +..\config.h: ..\config.h.win32 + copy ..\config.h.win32 ..\config.h + +galias.h: glib.symbols + perl makegalias.pl < glib.symbols > galias.h + +galiasdef.c: glib.symbols + perl makegalias.pl -def < glib.symbols > galiasdef.c + +localcharset.obj : libcharset\localcharset.c + $(CC) $(CFLAGS) -DLIBDIR=\".\" -c libcharset\localcharset.c + +glib.def: glib.symbols + echo EXPORTS > glib.def + cl /EP -DINCLUDE_VARIABLES -DG_OS_WIN32 -DINCLUDE_INTERNAL_SYMBOLS -DALL_FILES \ + -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_NORETURN= \ + -DG_GNUC_PRINTF=;G_GNUC_PRINTF -DG_GNUC_FORMAT=;G_GNUC_FORMAT glib.symbols >> glib.def + +glib.res : glib.rc + rc -DBUILDNUMBER=0 -r -fo glib.res glib.rc + +################ glib + +# create a static libary +# static library can well have the real version number in the name +glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib : $(glib_OBJECTS) gnulib\gnulib.lib pcre\pcre.lib + lib /out:glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib $(glib_OBJECTS) gnulib\gnulib.lib pcre\pcre.lib + +libglib-2.0-0.dll : $(glib_OBJECTS) gnulib\gnulib.lib pcre\pcre.lib glib.def glib.res + $(CC) $(CFLAGS) -LD -Fe$@ $(glib_OBJECTS) glib.res $(INTL_LIBS) \ + gnulib\gnulib.lib pcre\pcre.lib $(DIRENT_LIBS) user32.lib advapi32.lib shell32.lib wsock32.lib ole32.lib ws2_32.lib \ + $(LDFLAGS) /implib:glib-2.0.lib /def:glib.def + +gspawn-win32-helper.exe : gspawn-win32-helper.c libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll + $(CC) $(CFLAGS) -Fe$@ -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32-helper.c glib-2.0.lib $(LDFLAGS) /subsystem:windows user32.lib + +gspawn-win32-helper-console.exe : gspawn-win32-helper.c libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll + $(CC) $(CFLAGS) -Fe$@ -DG_LOG_DOMAIN=\"gspawn-win32-helper\" gspawn-win32-helper.c glib-2.0.lib $(LDFLAGS) /subsystem:console user32.lib + +################ other stuff + +clean:: + del ..\config.h + del ..\glibconfig.h + diff --git a/glib/makegalias.pl b/glib/makegalias.pl new file mode 100755 index 0000000..622026a --- /dev/null +++ b/glib/makegalias.pl @@ -0,0 +1,136 @@ +#!/usr/bin/perl -w + +my $do_def = 0; + +if (($#ARGV >= 0) && ($ARGV[0] eq "-def")) { + shift; + $do_def = 1; +} + +print <) { + + # ignore empty lines + next if /^\s*$/; + + # skip comments + if ($_ =~ /^\s*\/\*/) + { + $in_comment = 1; + } + + if ($in_comment) + { + if ($_ =~ /\*\/\s$/) + { + $in_comment = 0; + } + + next; + } + + # handle ifdefs + if ($_ =~ /^\#endif/) + { + if (!$in_skipped_section) + { + print $_; + } + + $in_skipped_section = 0; + + next; + } + + if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS|ALL_FILES)/) + { + $in_skipped_section = 1; + } + + if ($in_skipped_section) + { + next; + } + + if ($_ =~ /^\#ifn?def\s+(G|DISABLE_MEM_POOLS|_WIN64)/) + { + print $_; + + next; + } + + if ($_ =~ /^\#if.*(G_STDIO_NO_WRAP_ON_UNIX|IN_FILE|IN_HEADER|IN_FILE)/) + { + print $_; + + next; + } + + chop; + my $str = $_; + my @words; + my $attributes = ""; + + @words = split(/ /, $str); + $str = shift(@words); + chomp($str); + my $alias = "IA__".$str; + + # Drop any Win32 specific .def file syntax, but keep attributes + foreach $word (@words) { + $attributes = "$attributes $word" unless $word eq "PRIVATE"; + } + + if (!$do_def) { + print <' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/glib/pcre/makefile.msc b/glib/pcre/makefile.msc new file mode 100644 index 0000000..1ec1d72 --- /dev/null +++ b/glib/pcre/makefile.msc @@ -0,0 +1,30 @@ +TOP = ..\..\.. +!INCLUDE ..\..\build\win32\make.msc + +INCLUDES = \ + -I ..\.. \ + -I .. + +DEFINES = \ + -DPCRE_STATIC \ + -DHAVE_CONFIG_H \ + -DHAVE_LONG_LONG_FORMAT \ + -DSUPPORT_UCP \ + -DSUPPORT_UTF8 \ + -DNEWLINE=-1 \ + -DMATCH_LIMIT=10000000 \ + -DMATCH_LIMIT_RECURSION=10000000 \ + -DMAX_NAME_SIZE=32 \ + -DMAX_NAME_COUNT=10000 \ + -DMAX_DUPLENGTH=30000 \ + -DLINK_SIZE=2 \ + -DEBCDIC=0 \ + -DPOSIX_MALLOC_THRESHOLD=10 + +OBJECTS = \ + + +all : pcre.lib + +pcre.lib : $(OBJECTS) + lib -out:pcre.lib $(OBJECTS) diff --git a/glib/pcre/pcre.h b/glib/pcre/pcre.h new file mode 100644 index 0000000..8fc80a7 --- /dev/null +++ b/glib/pcre/pcre.h @@ -0,0 +1,293 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* This is the public header file for the PCRE library, to be #included by +applications that call the PCRE functions. + + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +#ifndef _PCRE_H +#define _PCRE_H + +/* The current PCRE version information. */ + +#define PCRE_MAJOR 7 +#define PCRE_MINOR 8 +#define PCRE_PRERELEASE +#define PCRE_DATE 2008-09-05 + +/* When an application links to a PCRE DLL in Windows, the symbols that are +imported have to be identified as such. When building PCRE, the appropriate +export setting is defined in pcre_internal.h, which includes this file. So we +don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ + +#if defined(_WIN32) && !defined(PCRE_STATIC) +# ifndef PCRE_EXP_DECL +# define PCRE_EXP_DECL extern __declspec(dllimport) +# endif +# ifdef __cplusplus +# ifndef PCRECPP_EXP_DECL +# define PCRECPP_EXP_DECL extern __declspec(dllimport) +# endif +# ifndef PCRECPP_EXP_DEFN +# define PCRECPP_EXP_DEFN __declspec(dllimport) +# endif +# endif +#endif + +/* By default, we use the standard "extern" declarations. */ + +#ifndef PCRE_EXP_DECL +# ifdef __cplusplus +# define PCRE_EXP_DECL extern "C" +# else +# define PCRE_EXP_DECL extern +# endif +#endif + +#ifdef __cplusplus +# ifndef PCRECPP_EXP_DECL +# define PCRECPP_EXP_DECL extern +# endif +# ifndef PCRECPP_EXP_DEFN +# define PCRECPP_EXP_DEFN +# endif +#endif + +/* Have to include stdlib.h in order to ensure that size_t is defined; +it is needed here for malloc. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options */ + +#define PCRE_CASELESS 0x00000001 +#define PCRE_MULTILINE 0x00000002 +#define PCRE_DOTALL 0x00000004 +#define PCRE_EXTENDED 0x00000008 +#define PCRE_ANCHORED 0x00000010 +#define PCRE_DOLLAR_ENDONLY 0x00000020 +#define PCRE_EXTRA 0x00000040 +#define PCRE_NOTBOL 0x00000080 +#define PCRE_NOTEOL 0x00000100 +#define PCRE_UNGREEDY 0x00000200 +#define PCRE_NOTEMPTY 0x00000400 +#define PCRE_UTF8 0x00000800 +#define PCRE_NO_AUTO_CAPTURE 0x00001000 +#define PCRE_NO_UTF8_CHECK 0x00002000 +#define PCRE_AUTO_CALLOUT 0x00004000 +#define PCRE_PARTIAL 0x00008000 +#define PCRE_DFA_SHORTEST 0x00010000 +#define PCRE_DFA_RESTART 0x00020000 +#define PCRE_FIRSTLINE 0x00040000 +#define PCRE_DUPNAMES 0x00080000 +#define PCRE_NEWLINE_CR 0x00100000 +#define PCRE_NEWLINE_LF 0x00200000 +#define PCRE_NEWLINE_CRLF 0x00300000 +#define PCRE_NEWLINE_ANY 0x00400000 +#define PCRE_NEWLINE_ANYCRLF 0x00500000 +#define PCRE_BSR_ANYCRLF 0x00800000 +#define PCRE_BSR_UNICODE 0x01000000 +#define PCRE_JAVASCRIPT_COMPAT 0x02000000 + +/* Exec-time and get/set-time error codes */ + +#define PCRE_ERROR_NOMATCH (-1) +#define PCRE_ERROR_NULL (-2) +#define PCRE_ERROR_BADOPTION (-3) +#define PCRE_ERROR_BADMAGIC (-4) +#define PCRE_ERROR_UNKNOWN_OPCODE (-5) +#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ +#define PCRE_ERROR_NOMEMORY (-6) +#define PCRE_ERROR_NOSUBSTRING (-7) +#define PCRE_ERROR_MATCHLIMIT (-8) +#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ +#define PCRE_ERROR_BADUTF8 (-10) +#define PCRE_ERROR_BADUTF8_OFFSET (-11) +#define PCRE_ERROR_PARTIAL (-12) +#define PCRE_ERROR_BADPARTIAL (-13) +#define PCRE_ERROR_INTERNAL (-14) +#define PCRE_ERROR_BADCOUNT (-15) +#define PCRE_ERROR_DFA_UITEM (-16) +#define PCRE_ERROR_DFA_UCOND (-17) +#define PCRE_ERROR_DFA_UMLIMIT (-18) +#define PCRE_ERROR_DFA_WSSIZE (-19) +#define PCRE_ERROR_DFA_RECURSE (-20) +#define PCRE_ERROR_RECURSIONLIMIT (-21) +#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */ +#define PCRE_ERROR_BADNEWLINE (-23) + +/* Request types for pcre_fullinfo() */ + +#define PCRE_INFO_OPTIONS 0 +#define PCRE_INFO_SIZE 1 +#define PCRE_INFO_CAPTURECOUNT 2 +#define PCRE_INFO_BACKREFMAX 3 +#define PCRE_INFO_FIRSTBYTE 4 +#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ +#define PCRE_INFO_FIRSTTABLE 5 +#define PCRE_INFO_LASTLITERAL 6 +#define PCRE_INFO_NAMEENTRYSIZE 7 +#define PCRE_INFO_NAMECOUNT 8 +#define PCRE_INFO_NAMETABLE 9 +#define PCRE_INFO_STUDYSIZE 10 +#define PCRE_INFO_DEFAULT_TABLES 11 +#define PCRE_INFO_OKPARTIAL 12 +#define PCRE_INFO_JCHANGED 13 +#define PCRE_INFO_HASCRORLF 14 + +/* Request types for pcre_config(). Do not re-arrange, in order to remain +compatible. */ + +#define PCRE_CONFIG_UTF8 0 +#define PCRE_CONFIG_NEWLINE 1 +#define PCRE_CONFIG_LINK_SIZE 2 +#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 +#define PCRE_CONFIG_MATCH_LIMIT 4 +#define PCRE_CONFIG_STACKRECURSE 5 +#define PCRE_CONFIG_UNICODE_PROPERTIES 6 +#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 +#define PCRE_CONFIG_BSR 8 + +/* Bit flags for the pcre_extra structure. Do not re-arrange or redefine +these bits, just add new ones on the end, in order to remain compatible. */ + +#define PCRE_EXTRA_STUDY_DATA 0x0001 +#define PCRE_EXTRA_MATCH_LIMIT 0x0002 +#define PCRE_EXTRA_CALLOUT_DATA 0x0004 +#define PCRE_EXTRA_TABLES 0x0008 +#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 + +/* Types */ + +struct real_pcre; /* declaration; the definition is private */ +typedef struct real_pcre pcre; + +/* When PCRE is compiled as a C++ library, the subject pointer type can be +replaced with a custom type. For conventional use, the public interface is a +const char *. */ + +#ifndef PCRE_SPTR +#define PCRE_SPTR const char * +#endif + +/* The structure for passing additional data to pcre_exec(). This is defined in +such as way as to be extensible. Always add new fields at the end, in order to +remain compatible. */ + +typedef struct pcre_extra { + unsigned long int flags; /* Bits for which fields are set */ + void *study_data; /* Opaque data from pcre_study() */ + unsigned long int match_limit; /* Maximum number of calls to match() */ + void *callout_data; /* Data passed back in callouts */ + const unsigned char *tables; /* Pointer to character tables */ + unsigned long int match_limit_recursion; /* Max recursive calls to match() */ +} pcre_extra; + +/* The structure for passing out data via the pcre_callout_function. We use a +structure so that new fields can be added on the end in future versions, +without changing the API of the function, thereby allowing old clients to work +without modification. */ + +typedef struct pcre_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR subject; /* The subject being matched */ + int subject_length; /* The length of the subject */ + int start_match; /* Offset to start of this match attempt */ + int current_position; /* Where we currently are in the subject */ + int capture_top; /* Max current capture */ + int capture_last; /* Most recently closed capture */ + void *callout_data; /* Data passed in with the call */ + /* ------------------- Added for Version 1 -------------------------- */ + int pattern_position; /* Offset to next item in the pattern */ + int next_item_length; /* Length of next item in the pattern */ + /* ------------------------------------------------------------------ */ +} pcre_callout_block; + +#include "glib.h" +#include "galias.h" + +#define pcre_malloc g_try_malloc +#define pcre_free g_free +#define pcre_stack_malloc g_try_malloc + +PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); + +/* Exported PCRE functions */ + +PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL int pcre_config(int, void *); +PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, + int *, int, const char *, char *, int); +PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, char *, + int); +PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, + const char *, int, int, int, int *, int , int *, int); +PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, + int, int, int, int *, int); +PCRE_EXP_DECL void pcre_free_substring(const char *); +PCRE_EXP_DECL void pcre_free_substring_list(const char **); +PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, + void *); +PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, + int *, int, const char *, const char **); +PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); +PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, + char **, char **); +PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, + const char **); +PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, + const char ***); +PCRE_EXP_DECL int pcre_info(const pcre *, int *, int *); +PCRE_EXP_DECL const unsigned char *pcre_maketables(void); +PCRE_EXP_DECL int pcre_refcount(pcre *, int); +PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); +PCRE_EXP_DECL const char *pcre_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/glib/pcre/pcre_chartables.c b/glib/pcre/pcre_chartables.c new file mode 100644 index 0000000..ae45db0 --- /dev/null +++ b/glib/pcre/pcre_chartables.c @@ -0,0 +1,198 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* This file contains character tables that are used when no external tables +are passed to PCRE by the application that calls it. The tables are used only +for characters whose code values are less than 256. + +This is a default version of the tables that assumes ASCII encoding. A program +called dftables (which is distributed with PCRE) can be used to build +alternative versions of this file. This is necessary if you are running in an +EBCDIC environment, or if you want to default to a different encoding, for +example ISO-8859-1. When dftables is run, it creates these tables in the +current locale. If PCRE is configured with --enable-rebuild-chartables, this +happens automatically. + +The following #includes are present because without the gcc 4.x may remove the +array definition from the final binary if PCRE is built into a static library +and dead code stripping is activated. This leads to link errors. Pulling in the +header ensures that the array gets flagged as "someone outside this compilation +unit might reference this" and so it will always be supplied to the linker. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +const unsigned char _pcre_default_tables[] = { + +/* This table is a lower casing table. */ + + 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, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table is a case flipping table. */ + + 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, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table contains bit maps for various character classes. Each map is 32 +bytes long and the bits run from the least significant end of each byte. The +classes that have their own maps are: space, xdigit, digit, upper, lower, word, +graph, print, punct, and cntrl. Other classes are built from combinations. */ + + 0x00,0x3e,0x00,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,0xff,0x03, + 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,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, + 0xfe,0xff,0xff,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,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, + 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0xff,0xff,0xff,0xff,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, + +/* This table identifies various classes of character by individual bits: + 0x01 white space character + 0x02 letter + 0x04 decimal digit + 0x08 hexadecimal digit + 0x10 alphanumeric or '_' + 0x80 regular expression metacharacter or binary zero +*/ + + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ + 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ + 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ + 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ + +/* End of pcre_chartables.c */ diff --git a/glib/pcre/pcre_compile.c b/glib/pcre/pcre_compile.c new file mode 100644 index 0000000..ae68fb5 --- /dev/null +++ b/glib/pcre/pcre_compile.c @@ -0,0 +1,6258 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_compile(), along with +supporting internal functions that are not used by other modules. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NLBLOCK cd /* Block containing newline information */ +#define PSSTART start_pattern /* Field containing processed string start */ +#define PSEND end_pattern /* Field containing processed string end */ + +#include "pcre_internal.h" + + +/* When DEBUG is defined, we need the pcre_printint() function, which is also +used by pcretest. DEBUG is not defined when building a production library. */ + +#ifdef DEBUG +#include "pcre_printint.src" +#endif + + +/* Macro for setting individual bits in class bitmaps. */ + +#define SETBIT(a,b) a[b/8] |= (1 << (b%8)) + +/* Maximum length value to check against when making sure that the integer that +holds the compiled pattern length does not overflow. We make it a bit less than +INT_MAX to allow for adding in group terminating bytes, so that we don't have +to check them every time. */ + +#define OFLOW_MAX (INT_MAX - 20) + + +/************************************************* +* Code parameters and static tables * +*************************************************/ + +/* This value specifies the size of stack workspace that is used during the +first pre-compile phase that determines how much memory is required. The regex +is partly compiled into this space, but the compiled parts are discarded as +soon as they can be, so that hopefully there will never be an overrun. The code +does, however, check for an overrun. The largest amount I've seen used is 218, +so this number is very generous. + +The same workspace is used during the second, actual compile phase for +remembering forward references to groups so that they can be filled in at the +end. Each entry in this list occupies LINK_SIZE bytes, so even when LINK_SIZE +is 4 there is plenty of room. */ + +#define COMPILE_WORK_SIZE (4096) + + +/* Table for handling escaped characters in the range '0'-'z'. Positive returns +are simple data values; negative values are for special things like \d and so +on. Zero means further processing is needed (for things like \x), or the escape +is invalid. */ + +#ifndef EBCDIC /* This is the "normal" table for ASCII systems */ +static const short int escapes[] = { + 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ + 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ + '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E, 0, -ESC_G, /* @ - G */ +-ESC_H, 0, 0, -ESC_K, 0, 0, 0, 0, /* H - O */ +-ESC_P, -ESC_Q, -ESC_R, -ESC_S, 0, 0, -ESC_V, -ESC_W, /* P - W */ +-ESC_X, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */ + '`', 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* ` - g */ +-ESC_h, 0, 0, -ESC_k, 0, 0, ESC_n, 0, /* h - o */ +-ESC_p, 0, ESC_r, -ESC_s, ESC_tee, 0, -ESC_v, -ESC_w, /* p - w */ + 0, 0, -ESC_z /* x - z */ +}; + +#else /* This is the "abnormal" table for EBCDIC systems */ +static const short int escapes[] = { +/* 48 */ 0, 0, 0, '.', '<', '(', '+', '|', +/* 50 */ '&', 0, 0, 0, 0, 0, 0, 0, +/* 58 */ 0, 0, '!', '$', '*', ')', ';', '~', +/* 60 */ '-', '/', 0, 0, 0, 0, 0, 0, +/* 68 */ 0, 0, '|', ',', '%', '_', '>', '?', +/* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"', +/* 80 */ 0, 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, +/* 88 */-ESC_h, 0, 0, '{', 0, 0, 0, 0, +/* 90 */ 0, 0, -ESC_k, 'l', 0, ESC_n, 0, -ESC_p, +/* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0, +/* A0 */ 0, '~', -ESC_s, ESC_tee, 0,-ESC_v, -ESC_w, 0, +/* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0, +/* B0 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', +/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, +/* C8 */-ESC_H, 0, 0, 0, 0, 0, 0, 0, +/* D0 */ '}', 0, -ESC_K, 0, 0, 0, 0, -ESC_P, +/* D8 */-ESC_Q,-ESC_R, 0, 0, 0, 0, 0, 0, +/* E0 */ '\\', 0, -ESC_S, 0, 0,-ESC_V, -ESC_W, -ESC_X, +/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, +/* F0 */ 0, 0, 0, 0, 0, 0, 0, 0, +/* F8 */ 0, 0, 0, 0, 0, 0, 0, 0 +}; +#endif + + +/* Table of special "verbs" like (*PRUNE). This is a short table, so it is +searched linearly. Put all the names into a single string, in order to reduce +the number of relocations when a shared library is dynamically linked. */ + +typedef struct verbitem { + int len; + int op; +} verbitem; + +static const char verbnames[] = + "ACCEPT\0" + "COMMIT\0" + "F\0" + "FAIL\0" + "PRUNE\0" + "SKIP\0" + "THEN"; + +static const verbitem verbs[] = { + { 6, OP_ACCEPT }, + { 6, OP_COMMIT }, + { 1, OP_FAIL }, + { 4, OP_FAIL }, + { 5, OP_PRUNE }, + { 4, OP_SKIP }, + { 4, OP_THEN } +}; + +static const int verbcount = sizeof(verbs)/sizeof(verbitem); + + +/* Tables of names of POSIX character classes and their lengths. The names are +now all in a single string, to reduce the number of relocations when a shared +library is dynamically loaded. The list of lengths is terminated by a zero +length entry. The first three must be alpha, lower, upper, as this is assumed +for handling case independence. */ + +static const char posix_names[] = + "alpha\0" "lower\0" "upper\0" "alnum\0" "ascii\0" "blank\0" + "cntrl\0" "digit\0" "graph\0" "print\0" "punct\0" "space\0" + "word\0" "xdigit"; + +static const uschar posix_name_lengths[] = { + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; + +/* Table of class bit maps for each POSIX class. Each class is formed from a +base map, with an optional addition or removal of another map. Then, for some +classes, there is some additional tweaking: for [:blank:] the vertical space +characters are removed, and for [:alpha:] and [:alnum:] the underscore +character is removed. The triples in the table consist of the base map offset, +second map offset or -1 if no second map, and a non-negative value for map +addition or a negative value for map subtraction (if there are two maps). The +absolute value of the third field has these meanings: 0 => no tweaking, 1 => +remove vertical space characters, 2 => remove underscore. */ + +static const int posix_class_maps[] = { + cbit_word, cbit_digit, -2, /* alpha */ + cbit_lower, -1, 0, /* lower */ + cbit_upper, -1, 0, /* upper */ + cbit_word, -1, 2, /* alnum - word without underscore */ + cbit_print, cbit_cntrl, 0, /* ascii */ + cbit_space, -1, 1, /* blank - a GNU extension */ + cbit_cntrl, -1, 0, /* cntrl */ + cbit_digit, -1, 0, /* digit */ + cbit_graph, -1, 0, /* graph */ + cbit_print, -1, 0, /* print */ + cbit_punct, -1, 0, /* punct */ + cbit_space, -1, 0, /* space */ + cbit_word, -1, 0, /* word - a Perl extension */ + cbit_xdigit,-1, 0 /* xdigit */ +}; + + +#define STRING(a) # a +#define XSTRING(s) STRING(s) + +/* The texts of compile-time error messages. These are "char *" because they +are passed to the outside world. Do not ever re-use any error number, because +they are documented. Always add a new error instead. Messages marked DEAD below +are no longer used. This used to be a table of strings, but in order to reduce +the number of relocations needed when a shared library is loaded dynamically, +it is now one long string. We cannot use a table of offsets, because the +lengths of inserts such as XSTRING(MAX_NAME_SIZE) are not known. Instead, we +simply count through to the one we want - this isn't a performance issue +because these strings are used only when there is a compilation error. */ + +static const char error_texts[] = + "no error\0" + "\\ at end of pattern\0" + "\\c at end of pattern\0" + "unrecognized character follows \\\0" + "numbers out of order in {} quantifier\0" + /* 5 */ + "number too big in {} quantifier\0" + "missing terminating ] for character class\0" + "invalid escape sequence in character class\0" + "range out of order in character class\0" + "nothing to repeat\0" + /* 10 */ + "operand of unlimited repeat could match the empty string\0" /** DEAD **/ + "internal error: unexpected repeat\0" + "unrecognized character after (? or (?-\0" + "POSIX named classes are supported only within a class\0" + "missing )\0" + /* 15 */ + "reference to non-existent subpattern\0" + "erroffset passed as NULL\0" + "unknown option bit(s) set\0" + "missing ) after comment\0" + "parentheses nested too deeply\0" /** DEAD **/ + /* 20 */ + "regular expression is too large\0" + "failed to get memory\0" + "unmatched parentheses\0" + "internal error: code overflow\0" + "unrecognized character after (?<\0" + /* 25 */ + "lookbehind assertion is not fixed length\0" + "malformed number or name after (?(\0" + "conditional group contains more than two branches\0" + "assertion expected after (?(\0" + "(?R or (?[+-]digits must be followed by )\0" + /* 30 */ + "unknown POSIX class name\0" + "POSIX collating elements are not supported\0" + "this version of PCRE is not compiled with PCRE_UTF8 support\0" + "spare error\0" /** DEAD **/ + "character value in \\x{...} sequence is too large\0" + /* 35 */ + "invalid condition (?(0)\0" + "\\C not allowed in lookbehind assertion\0" + "PCRE does not support \\L, \\l, \\N, \\U, or \\u\0" + "number after (?C is > 255\0" + "closing ) for (?C expected\0" + /* 40 */ + "recursive call could loop indefinitely\0" + "unrecognized character after (?P\0" + "syntax error in subpattern name (missing terminator)\0" + "two named subpatterns have the same name\0" + "invalid UTF-8 string\0" + /* 45 */ + "support for \\P, \\p, and \\X has not been compiled\0" + "malformed \\P or \\p sequence\0" + "unknown property name after \\P or \\p\0" + "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)\0" + "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")\0" + /* 50 */ + "repeated subpattern is too long\0" /** DEAD **/ + "octal value is greater than \\377 (not in UTF-8 mode)\0" + "internal error: overran compiling workspace\0" + "internal error: previously-checked referenced subpattern not found\0" + "DEFINE group contains more than one branch\0" + /* 55 */ + "repeating a DEFINE group is not allowed\0" + "inconsistent NEWLINE options\0" + "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number\0" + "a numbered reference must not be zero\0" + "(*VERB) with an argument is not supported\0" + /* 60 */ + "(*VERB) not recognized\0" + "number is too big\0" + "subpattern name expected\0" + "digit expected after (?+\0" + "] is an invalid data character in JavaScript compatibility mode"; + + +/* Definition to allow mutual recursion */ + +static BOOL + compile_regex(int, int, uschar **, const uschar **, int *, BOOL, BOOL, int, + int *, int *, branch_chain *, compile_data *, int *); + + + +/************************************************* +* Find an error text * +*************************************************/ + +/* The error texts are now all in one long string, to save on relocations. As +some of the text is of unknown length, we can't use a table of offsets. +Instead, just count through the strings. This is not a performance issue +because it happens only when there has been a compilation error. + +Argument: the error number +Returns: pointer to the error string +*/ + +static const char * +find_error_text(int n) +{ +const char *s = error_texts; +for (; n > 0; n--) while (*s++ != 0) {}; +return s; +} + + +/************************************************* +* Handle escapes * +*************************************************/ + +/* This function is called when a \ has been encountered. It either returns a +positive value for a simple escape such as \n, or a negative value which +encodes one of the more complicated things such as \d. A backreference to group +n is returned as -(ESC_REF + n); ESC_REF is the highest ESC_xxx macro. When +UTF-8 is enabled, a positive value greater than 255 may be returned. On entry, +ptr is pointing at the \. On exit, it is on the final character of the escape +sequence. + +Arguments: + ptrptr points to the pattern position pointer + errorcodeptr points to the errorcode variable + bracount number of previous extracting brackets + options the options bits + isclass TRUE if inside a character class + +Returns: zero or positive => a data character + negative => a special escape sequence + on error, errorcodeptr is set +*/ + +static int +check_escape(const uschar **ptrptr, int *errorcodeptr, int bracount, + int options, BOOL isclass) +{ +BOOL utf8 = (options & PCRE_UTF8) != 0; +const uschar *ptr = *ptrptr + 1; +int c, i; + +GETCHARINCTEST(c, ptr); /* Get character value, increment pointer */ +ptr--; /* Set pointer back to the last byte */ + +/* If backslash is at the end of the pattern, it's an error. */ + +if (c == 0) *errorcodeptr = ERR1; + +/* Non-alphanumerics are literals. For digits or letters, do an initial lookup +in a table. A non-zero result is something that can be returned immediately. +Otherwise further processing may be required. */ + +#ifndef EBCDIC /* ASCII coding */ +else if (c < '0' || c > 'z') {} /* Not alphanumeric */ +else if ((i = escapes[c - '0']) != 0) c = i; + +#else /* EBCDIC coding */ +else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {} /* Not alphanumeric */ +else if ((i = escapes[c - 0x48]) != 0) c = i; +#endif + +/* Escapes that need further processing, or are illegal. */ + +else + { + const uschar *oldptr; + BOOL braced, negated; + + switch (c) + { + /* A number of Perl escapes are not handled by PCRE. We give an explicit + error. */ + + case 'l': + case 'L': + case 'N': + case 'u': + case 'U': + *errorcodeptr = ERR37; + break; + + /* \g must be followed by one of a number of specific things: + + (1) A number, either plain or braced. If positive, it is an absolute + backreference. If negative, it is a relative backreference. This is a Perl + 5.10 feature. + + (2) Perl 5.10 also supports \g{name} as a reference to a named group. This + is part of Perl's movement towards a unified syntax for back references. As + this is synonymous with \k{name}, we fudge it up by pretending it really + was \k. + + (3) For Oniguruma compatibility we also support \g followed by a name or a + number either in angle brackets or in single quotes. However, these are + (possibly recursive) subroutine calls, _not_ backreferences. Just return + the -ESC_g code (cf \k). */ + + case 'g': + if (ptr[1] == '<' || ptr[1] == '\'') + { + c = -ESC_g; + break; + } + + /* Handle the Perl-compatible cases */ + + if (ptr[1] == '{') + { + const uschar *p; + for (p = ptr+2; *p != 0 && *p != '}'; p++) + if (*p != '-' && g_ascii_isdigit (*p) == 0) break; + if (*p != 0 && *p != '}') + { + c = -ESC_k; + break; + } + braced = TRUE; + ptr++; + } + else braced = FALSE; + + if (ptr[1] == '-') + { + negated = TRUE; + ptr++; + } + else negated = FALSE; + + c = 0; + while (g_ascii_isdigit (ptr[1]) != 0) + c = c * 10 + *(++ptr) - '0'; + + if (c < 0) /* Integer overflow */ + { + *errorcodeptr = ERR61; + break; + } + + if (braced && *(++ptr) != '}') + { + *errorcodeptr = ERR57; + break; + } + + if (c == 0) + { + *errorcodeptr = ERR58; + break; + } + + if (negated) + { + if (c > bracount) + { + *errorcodeptr = ERR15; + break; + } + c = bracount - (c - 1); + } + + c = -(ESC_REF + c); + break; + + /* The handling of escape sequences consisting of a string of digits + starting with one that is not zero is not straightforward. By experiment, + the way Perl works seems to be as follows: + + Outside a character class, the digits are read as a decimal number. If the + number is less than 10, or if there are that many previous extracting + left brackets, then it is a back reference. Otherwise, up to three octal + digits are read to form an escaped byte. Thus \123 is likely to be octal + 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal + value is greater than 377, the least significant 8 bits are taken. Inside a + character class, \ followed by a digit is always an octal number. */ + + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + + if (!isclass) + { + oldptr = ptr; + c -= '0'; + while (g_ascii_isdigit (ptr[1])) + c = c * 10 + *(++ptr) - '0'; + if (c < 0) /* Integer overflow */ + { + *errorcodeptr = ERR61; + break; + } + if (c < 10 || c <= bracount) + { + c = -(ESC_REF + c); + break; + } + ptr = oldptr; /* Put the pointer back and fall through */ + } + + /* Handle an octal number following \. If the first digit is 8 or 9, Perl + generates a binary zero byte and treats the digit as a following literal. + Thus we have to pull back the pointer by one. */ + + if ((c = *ptr) >= '8') + { + ptr--; + c = 0; + break; + } + + /* \0 always starts an octal number, but we may drop through to here with a + larger first octal digit. The original code used just to take the least + significant 8 bits of octal numbers (I think this is what early Perls used + to do). Nowadays we allow for larger numbers in UTF-8 mode, but no more + than 3 octal digits. */ + + case '0': + c -= '0'; + while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7') + c = c * 8 + *(++ptr) - '0'; + if (!utf8 && c > 255) *errorcodeptr = ERR51; + break; + + /* \x is complicated. \x{ddd} is a character number which can be greater + than 0xff in utf8 mode, but only if the ddd are hex digits. If not, { is + treated as a data character. */ + + case 'x': + if (ptr[1] == '{') + { + const uschar *pt = ptr + 2; + int count = 0; + + c = 0; + while (g_ascii_isxdigit (*pt) != 0) + { + register int cc = *pt++; + if (c == 0 && cc == '0') continue; /* Leading zeroes */ + count++; + +#ifndef EBCDIC /* ASCII coding */ + if (cc >= 'a') cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < 'A')? '0' : ('A' - 10)); +#else /* EBCDIC coding */ + if (cc >= 'a' && cc <= 'z') cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= '0')? '0' : ('A' - 10)); +#endif + } + + if (*pt == '}') + { + if (c < 0 || count > (utf8? 8 : 2)) *errorcodeptr = ERR34; + ptr = pt; + break; + } + + /* If the sequence of hex digits does not end with '}', then we don't + recognize this construct; fall through to the normal \x handling. */ + } + + /* Read just a single-byte hex-defined char */ + + c = 0; + while (i++ < 2 && g_ascii_isxdigit (ptr[1]) != 0) + { + int cc; /* Some compilers don't like ++ */ + cc = *(++ptr); /* in initializers */ +#ifndef EBCDIC /* ASCII coding */ + if (cc >= 'a') cc -= 32; /* Convert to upper case */ + c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10)); +#else /* EBCDIC coding */ + if (cc <= 'z') cc += 64; /* Convert to upper case */ + c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10)); +#endif + } + break; + + /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped. + This coding is ASCII-specific, but then the whole concept of \cx is + ASCII-specific. (However, an EBCDIC equivalent has now been added.) */ + + case 'c': + c = *(++ptr); + if (c == 0) + { + *errorcodeptr = ERR2; + break; + } + +#ifndef EBCDIC /* ASCII coding */ + if (c >= 'a' && c <= 'z') c -= 32; + c ^= 0x40; +#else /* EBCDIC coding */ + if (c >= 'a' && c <= 'z') c += 64; + c ^= 0xC0; +#endif + break; + + /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any + other alphanumeric following \ is an error if PCRE_EXTRA was set; + otherwise, for Perl compatibility, it is a literal. This code looks a bit + odd, but there used to be some cases other than the default, and there may + be again in future, so I haven't "optimized" it. */ + + default: + if ((options & PCRE_EXTRA) != 0) switch(c) + { + default: + *errorcodeptr = ERR3; + break; + } + break; + } + } + +*ptrptr = ptr; +return c; +} + + + +#ifdef SUPPORT_UCP +/************************************************* +* Handle \P and \p * +*************************************************/ + +/* This function is called after \P or \p has been encountered, provided that +PCRE is compiled with support for Unicode properties. On entry, ptrptr is +pointing at the P or p. On exit, it is pointing at the final character of the +escape sequence. + +Argument: + ptrptr points to the pattern position pointer + negptr points to a boolean that is set TRUE for negation else FALSE + dptr points to an int that is set to the detailed property value + errorcodeptr points to the error code variable + +Returns: type value from ucp_type_table, or -1 for an invalid type +*/ + +static int +get_ucp(const uschar **ptrptr, BOOL *negptr, int *dptr, int *errorcodeptr) +{ +int c, i, bot, top; +const uschar *ptr = *ptrptr; +char name[32]; + +c = *(++ptr); +if (c == 0) goto ERROR_RETURN; + +*negptr = FALSE; + +/* \P or \p can be followed by a name in {}, optionally preceded by ^ for +negation. */ + +if (c == '{') + { + if (ptr[1] == '^') + { + *negptr = TRUE; + ptr++; + } + for (i = 0; i < (int)sizeof(name) - 1; i++) + { + c = *(++ptr); + if (c == 0) goto ERROR_RETURN; + if (c == '}') break; + name[i] = c; + } + if (c !='}') goto ERROR_RETURN; + name[i] = 0; + } + +/* Otherwise there is just one following character */ + +else + { + name[0] = c; + name[1] = 0; + } + +*ptrptr = ptr; + +/* Search for a recognized property name using binary chop */ + +bot = 0; +top = _pcre_utt_size; + +while (bot < top) + { + i = (bot + top) >> 1; + c = strcmp(name, _pcre_utt_names + _pcre_utt[i].name_offset); + if (c == 0) + { + *dptr = _pcre_utt[i].value; + return _pcre_utt[i].type; + } + if (c > 0) bot = i + 1; else top = i; + } + +*errorcodeptr = ERR47; +*ptrptr = ptr; +return -1; + +ERROR_RETURN: +*errorcodeptr = ERR46; +*ptrptr = ptr; +return -1; +} +#endif + + + + +/************************************************* +* Check for counted repeat * +*************************************************/ + +/* This function is called when a '{' is encountered in a place where it might +start a quantifier. It looks ahead to see if it really is a quantifier or not. +It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} +where the ddds are digits. + +Arguments: + p pointer to the first char after '{' + +Returns: TRUE or FALSE +*/ + +static BOOL +is_counted_repeat(const uschar *p) +{ +if (g_ascii_isdigit (*p++) == 0) return FALSE; +while (g_ascii_isdigit (*p) != 0) p++; +if (*p == '}') return TRUE; + +if (*p++ != ',') return FALSE; +if (*p == '}') return TRUE; + +if (g_ascii_isdigit (*p++) == 0) return FALSE; +while (g_ascii_isdigit (*p) != 0) p++; + +return (*p == '}'); +} + + + +/************************************************* +* Read repeat counts * +*************************************************/ + +/* Read an item of the form {n,m} and return the values. This is called only +after is_counted_repeat() has confirmed that a repeat-count quantifier exists, +so the syntax is guaranteed to be correct, but we need to check the values. + +Arguments: + p pointer to first char after '{' + minp pointer to int for min + maxp pointer to int for max + returned as -1 if no max + errorcodeptr points to error code variable + +Returns: pointer to '}' on success; + current ptr on error, with errorcodeptr set non-zero +*/ + +static const uschar * +read_repeat_counts(const uschar *p, int *minp, int *maxp, int *errorcodeptr) +{ +int min = 0; +int max = -1; + +/* Read the minimum value and do a paranoid check: a negative value indicates +an integer overflow. */ + +while (g_ascii_isdigit (*p) != 0) min = min * 10 + *p++ - '0'; +if (min < 0 || min > 65535) + { + *errorcodeptr = ERR5; + return p; + } + +/* Read the maximum value if there is one, and again do a paranoid on its size. +Also, max must not be less than min. */ + +if (*p == '}') max = min; else + { + if (*(++p) != '}') + { + max = 0; + while(g_ascii_isdigit (*p) != 0) max = max * 10 + *p++ - '0'; + if (max < 0 || max > 65535) + { + *errorcodeptr = ERR5; + return p; + } + if (max < min) + { + *errorcodeptr = ERR4; + return p; + } + } + } + +/* Fill in the required variables, and pass back the pointer to the terminating +'}'. */ + +*minp = min; +*maxp = max; +return p; +} + + + +/************************************************* +* Find forward referenced subpattern * +*************************************************/ + +/* This function scans along a pattern's text looking for capturing +subpatterns, and counting them. If it finds a named pattern that matches the +name it is given, it returns its number. Alternatively, if the name is NULL, it +returns when it reaches a given numbered subpattern. This is used for forward +references to subpatterns. We know that if (?P< is encountered, the name will +be terminated by '>' because that is checked in the first pass. + +Arguments: + ptr current position in the pattern + cd compile background data + name name to seek, or NULL if seeking a numbered subpattern + lorn name length, or subpattern number if name is NULL + xmode TRUE if we are in /x mode + +Returns: the number of the named subpattern, or -1 if not found +*/ + +static int +find_parens(const uschar *ptr, compile_data *cd, const uschar *name, int lorn, + BOOL xmode) +{ +const uschar *thisname; +int count = cd->bracount; + +for (; *ptr != 0; ptr++) + { + int term; + + /* Skip over backslashed characters and also entire \Q...\E */ + + if (*ptr == '\\') + { + if (*(++ptr) == 0) return -1; + if (*ptr == 'Q') for (;;) + { + while (*(++ptr) != 0 && *ptr != '\\') {}; + if (*ptr == 0) return -1; + if (*(++ptr) == 'E') break; + } + continue; + } + + /* Skip over character classes; this logic must be similar to the way they + are handled for real. If the first character is '^', skip it. Also, if the + first few characters (either before or after ^) are \Q\E or \E we skip them + too. This makes for compatibility with Perl. */ + + if (*ptr == '[') + { + BOOL negate_class = FALSE; + for (;;) + { + int c = *(++ptr); + if (c == '\\') + { + if (ptr[1] == 'E') ptr++; + else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3; + else break; + } + else if (!negate_class && c == '^') + negate_class = TRUE; + else break; + } + + /* If the next character is ']', it is a data character that must be + skipped, except in JavaScript compatibility mode. */ + + if (ptr[1] == ']' && (cd->external_options & PCRE_JAVASCRIPT_COMPAT) == 0) + ptr++; + + while (*(++ptr) != ']') + { + if (*ptr == 0) return -1; + if (*ptr == '\\') + { + if (*(++ptr) == 0) return -1; + if (*ptr == 'Q') for (;;) + { + while (*(++ptr) != 0 && *ptr != '\\') {}; + if (*ptr == 0) return -1; + if (*(++ptr) == 'E') break; + } + continue; + } + } + continue; + } + + /* Skip comments in /x mode */ + + if (xmode && *ptr == '#') + { + while (*(++ptr) != 0 && *ptr != '\n') {}; + if (*ptr == 0) return -1; + continue; + } + + /* An opening parens must now be a real metacharacter */ + + if (*ptr != '(') continue; + if (ptr[1] != '?' && ptr[1] != '*') + { + count++; + if (name == NULL && count == lorn) return count; + continue; + } + + ptr += 2; + if (*ptr == 'P') ptr++; /* Allow optional P */ + + /* We have to disambiguate (? */ + + if ((*ptr != '<' || ptr[1] == '!' || ptr[1] == '=') && + *ptr != '\'') + continue; + + count++; + + if (name == NULL && count == lorn) return count; + term = *ptr++; + if (term == '<') term = '>'; + thisname = ptr; + while (*ptr != term) ptr++; + if (name != NULL && lorn == ptr - thisname && + strncmp((const char *)name, (const char *)thisname, lorn) == 0) + return count; + } + +return -1; +} + + + +/************************************************* +* Find first significant op code * +*************************************************/ + +/* This is called by several functions that scan a compiled expression looking +for a fixed first character, or an anchoring op code etc. It skips over things +that do not influence this. For some calls, a change of option is important. +For some calls, it makes sense to skip negative forward and all backward +assertions, and also the \b assertion; for others it does not. + +Arguments: + code pointer to the start of the group + options pointer to external options + optbit the option bit whose changing is significant, or + zero if none are + skipassert TRUE if certain assertions are to be skipped + +Returns: pointer to the first significant opcode +*/ + +static const uschar* +first_significant_code(const uschar *code, int *options, int optbit, + BOOL skipassert) +{ +for (;;) + { + switch ((int)*code) + { + case OP_OPT: + if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) + *options = (int)code[1]; + code += 2; + break; + + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + if (!skipassert) return code; + do code += GET(code, 1); while (*code == OP_ALT); + code += _pcre_OP_lengths[*code]; + break; + + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + if (!skipassert) return code; + /* Fall through */ + + case OP_CALLOUT: + case OP_CREF: + case OP_RREF: + case OP_DEF: + code += _pcre_OP_lengths[*code]; + break; + + default: + return code; + } + } +/* Control never reaches here */ +} + + + + +/************************************************* +* Find the fixed length of a pattern * +*************************************************/ + +/* Scan a pattern and compute the fixed length of subject that will match it, +if the length is fixed. This is needed for dealing with backward assertions. +In UTF8 mode, the result is in characters rather than bytes. + +Arguments: + code points to the start of the pattern (the bracket) + options the compiling options + +Returns: the fixed length, or -1 if there is no fixed length, + or -2 if \C was encountered +*/ + +static int +find_fixedlength(uschar *code, int options) +{ +int length = -1; + +register int branchlength = 0; +register uschar *cc = code + 1 + LINK_SIZE; + +/* Scan along the opcodes for this branch. If we get to the end of the +branch, check the length against that of the other branches. */ + +for (;;) + { + int d; + register int op = *cc; + switch (op) + { + case OP_CBRA: + case OP_BRA: + case OP_ONCE: + case OP_COND: + d = find_fixedlength(cc + ((op == OP_CBRA)? 2:0), options); + if (d < 0) return d; + branchlength += d; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* Reached end of a branch; if it's a ket it is the end of a nested + call. If it's ALT it is an alternation in a nested call. If it is + END it's the end of the outer call. All can be handled by the same code. */ + + case OP_ALT: + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_END: + if (length < 0) length = branchlength; + else if (length != branchlength) return -1; + if (*cc != OP_ALT) return length; + cc += 1 + LINK_SIZE; + branchlength = 0; + break; + + /* Skip over assertive subpatterns */ + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do cc += GET(cc, 1); while (*cc == OP_ALT); + /* Fall through */ + + /* Skip over things that don't match chars */ + + case OP_REVERSE: + case OP_CREF: + case OP_RREF: + case OP_DEF: + case OP_OPT: + case OP_CALLOUT: + case OP_SOD: + case OP_SOM: + case OP_EOD: + case OP_EODN: + case OP_CIRC: + case OP_DOLL: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + cc += _pcre_OP_lengths[*cc]; + break; + + /* Handle literal characters */ + + case OP_CHAR: + case OP_CHARNC: + case OP_NOT: + branchlength++; + cc += 2; +#ifdef SUPPORT_UTF8 + if ((options & PCRE_UTF8) != 0) + { + while ((*cc & 0xc0) == 0x80) cc++; + } +#endif + break; + + /* Handle exact repetitions. The count is already in characters, but we + need to skip over a multibyte character in UTF8 mode. */ + + case OP_EXACT: + branchlength += GET2(cc,1); + cc += 4; +#ifdef SUPPORT_UTF8 + if ((options & PCRE_UTF8) != 0) + { + while((*cc & 0x80) == 0x80) cc++; + } +#endif + break; + + case OP_TYPEEXACT: + branchlength += GET2(cc,1); + if (cc[3] == OP_PROP || cc[3] == OP_NOTPROP) cc += 2; + cc += 4; + break; + + /* Handle single-char matchers */ + + case OP_PROP: + case OP_NOTPROP: + cc += 2; + /* Fall through */ + + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + branchlength++; + cc++; + break; + + /* The single-byte matcher isn't allowed */ + + case OP_ANYBYTE: + return -2; + + /* Check a class for variable quantification */ + +#ifdef SUPPORT_UTF8 + case OP_XCLASS: + cc += GET(cc, 1) - 33; + /* Fall through */ +#endif + + case OP_CLASS: + case OP_NCLASS: + cc += 33; + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + return -1; + + case OP_CRRANGE: + case OP_CRMINRANGE: + if (GET2(cc,1) != GET2(cc,3)) return -1; + branchlength += GET2(cc,1); + cc += 5; + break; + + default: + branchlength++; + } + break; + + /* Anything else is variable length */ + + default: + return -1; + } + } +/* Control never gets here */ +} + + + + +/************************************************* +* Scan compiled regex for numbered bracket * +*************************************************/ + +/* This little function scans through a compiled pattern until it finds a +capturing bracket with the given number. + +Arguments: + code points to start of expression + utf8 TRUE in UTF-8 mode + number the required bracket number + +Returns: pointer to the opcode for the bracket, or NULL if not found +*/ + +static const uschar * +find_bracket(const uschar *code, BOOL utf8, int number) +{ +for (;;) + { + register int c = *code; + if (c == OP_END) return NULL; + + /* XCLASS is used for classes that cannot be represented just by a bit + map. This includes negated single high-valued characters. The length in + the table is zero; the actual length is stored in the compiled code. */ + + if (c == OP_XCLASS) code += GET(code, 1); + + /* Handle capturing bracket */ + + else if (c == OP_CBRA) + { + int n = GET2(code, 1+LINK_SIZE); + if (n == number) return (uschar *)code; + code += _pcre_OP_lengths[c]; + } + + /* Otherwise, we can get the item's length from the table, except that for + repeated character types, we have to test for \p and \P, which have an extra + two bytes of parameters. */ + + else + { + switch(c) + { + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSUPTO: + if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2; + break; + } + + /* Add in the fixed length from the table */ + + code += _pcre_OP_lengths[c]; + + /* In UTF-8 mode, opcodes that are followed by a character may be followed by + a multi-byte character. The length in the table is a minimum, so we have to + arrange to skip the extra bytes. */ + +#ifdef SUPPORT_UTF8 + if (utf8) switch(c) + { + case OP_CHAR: + case OP_CHARNC: + case OP_EXACT: + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f]; + break; + } +#else + (void)(utf8); /* Keep compiler happy by referencing function argument */ +#endif + } + } +} + + + +/************************************************* +* Scan compiled regex for recursion reference * +*************************************************/ + +/* This little function scans through a compiled pattern until it finds an +instance of OP_RECURSE. + +Arguments: + code points to start of expression + utf8 TRUE in UTF-8 mode + +Returns: pointer to the opcode for OP_RECURSE, or NULL if not found +*/ + +static const uschar * +find_recurse(const uschar *code, BOOL utf8) +{ +for (;;) + { + register int c = *code; + if (c == OP_END) return NULL; + if (c == OP_RECURSE) return code; + + /* XCLASS is used for classes that cannot be represented just by a bit + map. This includes negated single high-valued characters. The length in + the table is zero; the actual length is stored in the compiled code. */ + + if (c == OP_XCLASS) code += GET(code, 1); + + /* Otherwise, we can get the item's length from the table, except that for + repeated character types, we have to test for \p and \P, which have an extra + two bytes of parameters. */ + + else + { + switch(c) + { + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + case OP_TYPEPOSUPTO: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2; + break; + } + + /* Add in the fixed length from the table */ + + code += _pcre_OP_lengths[c]; + + /* In UTF-8 mode, opcodes that are followed by a character may be followed + by a multi-byte character. The length in the table is a minimum, so we have + to arrange to skip the extra bytes. */ + +#ifdef SUPPORT_UTF8 + if (utf8) switch(c) + { + case OP_CHAR: + case OP_CHARNC: + case OP_EXACT: + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f]; + break; + } +#else + (void)(utf8); /* Keep compiler happy by referencing function argument */ +#endif + } + } +} + + + +/************************************************* +* Scan compiled branch for non-emptiness * +*************************************************/ + +/* This function scans through a branch of a compiled pattern to see whether it +can match the empty string or not. It is called from could_be_empty() +below and from compile_branch() when checking for an unlimited repeat of a +group that can match nothing. Note that first_significant_code() skips over +backward and negative forward assertions when its final argument is TRUE. If we +hit an unclosed bracket, we return "empty" - this means we've struck an inner +bracket whose current branch will already have been scanned. + +Arguments: + code points to start of search + endcode points to where to stop + utf8 TRUE if in UTF8 mode + +Returns: TRUE if what is matched could be empty +*/ + +static BOOL +could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8) +{ +register int c; +for (code = first_significant_code(code + _pcre_OP_lengths[*code], NULL, 0, TRUE); + code < endcode; + code = first_significant_code(code + _pcre_OP_lengths[c], NULL, 0, TRUE)) + { + const uschar *ccode; + + c = *code; + + /* Skip over forward assertions; the other assertions are skipped by + first_significant_code() with a TRUE final argument. */ + + if (c == OP_ASSERT) + { + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* Groups with zero repeats can of course be empty; skip them. */ + + if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO) + { + code += _pcre_OP_lengths[c]; + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* For other groups, scan the branches. */ + + if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND) + { + BOOL empty_branch; + if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ + + /* Scan a closed bracket */ + + empty_branch = FALSE; + do + { + if (!empty_branch && could_be_empty_branch(code, endcode, utf8)) + empty_branch = TRUE; + code += GET(code, 1); + } + while (*code == OP_ALT); + if (!empty_branch) return FALSE; /* All branches are non-empty */ + c = *code; + continue; + } + + /* Handle the other opcodes */ + + switch (c) + { + /* Check for quantifiers after a class. XCLASS is used for classes that + cannot be represented just by a bit map. This includes negated single + high-valued characters. The length in _pcre_OP_lengths[] is zero; the + actual length is stored in the compiled code, so we must update "code" + here. */ + +#ifdef SUPPORT_UTF8 + case OP_XCLASS: + ccode = code += GET(code, 1); + goto CHECK_CLASS_REPEAT; +#endif + + case OP_CLASS: + case OP_NCLASS: + ccode = code + 33; + +#ifdef SUPPORT_UTF8 + CHECK_CLASS_REPEAT: +#endif + + switch (*ccode) + { + case OP_CRSTAR: /* These could be empty; continue */ + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + break; + + default: /* Non-repeat => class must match */ + case OP_CRPLUS: /* These repeats aren't empty */ + case OP_CRMINPLUS: + return FALSE; + + case OP_CRRANGE: + case OP_CRMINRANGE: + if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */ + break; + } + break; + + /* Opcodes that must match a character */ + + case OP_PROP: + case OP_NOTPROP: + case OP_EXTUNI: + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + case OP_ALLANY: + case OP_ANYBYTE: + case OP_CHAR: + case OP_CHARNC: + case OP_NOT: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_EXACT: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTPOSPLUS: + case OP_NOTEXACT: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + case OP_TYPEEXACT: + return FALSE; + + /* These are going to continue, as they may be empty, but we have to + fudge the length for the \p and \P cases. */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; + break; + + /* Same for these */ + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2; + break; + + /* End of branch */ + + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_ALT: + return TRUE; + + /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO, + MINUPTO, and POSUPTO may be followed by a multibyte character */ + +#ifdef SUPPORT_UTF8 + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + if (utf8) while ((code[2] & 0xc0) == 0x80) code++; + break; +#endif + } + } + +return TRUE; +} + + + +/************************************************* +* Scan compiled regex for non-emptiness * +*************************************************/ + +/* This function is called to check for left recursive calls. We want to check +the current branch of the current pattern to see if it could match the empty +string. If it could, we must look outwards for branches at other levels, +stopping when we pass beyond the bracket which is the subject of the recursion. + +Arguments: + code points to start of the recursion + endcode points to where to stop (current RECURSE item) + bcptr points to the chain of current (unclosed) branch starts + utf8 TRUE if in UTF-8 mode + +Returns: TRUE if what is matched could be empty +*/ + +static BOOL +could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr, + BOOL utf8) +{ +while (bcptr != NULL && bcptr->current >= code) + { + if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE; + bcptr = bcptr->outer; + } +return TRUE; +} + + + +/************************************************* +* Check for POSIX class syntax * +*************************************************/ + +/* This function is called when the sequence "[:" or "[." or "[=" is +encountered in a character class. It checks whether this is followed by a +sequence of characters terminated by a matching ":]" or ".]" or "=]". If we +reach an unescaped ']' without the special preceding character, return FALSE. + +Originally, this function only recognized a sequence of letters between the +terminators, but it seems that Perl recognizes any sequence of characters, +though of course unknown POSIX names are subsequently rejected. Perl gives an +"Unknown POSIX class" error for [:f\oo:] for example, where previously PCRE +didn't consider this to be a POSIX class. Likewise for [:1234:]. + +The problem in trying to be exactly like Perl is in the handling of escapes. We +have to be sure that [abc[:x\]pqr] is *not* treated as containing a POSIX +class, but [abc[:x\]pqr:]] is (so that an error can be generated). The code +below handles the special case of \], but does not try to do any other escape +processing. This makes it different from Perl for cases such as [:l\ower:] +where Perl recognizes it as the POSIX class "lower" but PCRE does not recognize +"l\ower". This is a lesser evil that not diagnosing bad classes when Perl does, +I think. + +Arguments: + ptr pointer to the initial [ + endptr where to return the end pointer + +Returns: TRUE or FALSE +*/ + +static BOOL +check_posix_syntax(const uschar *ptr, const uschar **endptr) +{ +int terminator; /* Don't combine these lines; the Solaris cc */ +terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ +for (++ptr; *ptr != 0; ptr++) + { + if (*ptr == '\\' && ptr[1] == ']') ptr++; else + { + if (*ptr == ']') return FALSE; + if (*ptr == terminator && ptr[1] == ']') + { + *endptr = ptr; + return TRUE; + } + } + } +return FALSE; +} + + + + +/************************************************* +* Check POSIX class name * +*************************************************/ + +/* This function is called to check the name given in a POSIX-style class entry +such as [:alnum:]. + +Arguments: + ptr points to the first letter + len the length of the name + +Returns: a value representing the name, or -1 if unknown +*/ + +static int +check_posix_name(const uschar *ptr, int len) +{ +const char *pn = posix_names; +register int yield = 0; +while (posix_name_lengths[yield] != 0) + { + if (len == posix_name_lengths[yield] && + strncmp((const char *)ptr, pn, len) == 0) return yield; + pn += posix_name_lengths[yield] + 1; + yield++; + } +return -1; +} + + +/************************************************* +* Adjust OP_RECURSE items in repeated group * +*************************************************/ + +/* OP_RECURSE items contain an offset from the start of the regex to the group +that is referenced. This means that groups can be replicated for fixed +repetition simply by copying (because the recursion is allowed to refer to +earlier groups that are outside the current group). However, when a group is +optional (i.e. the minimum quantifier is zero), OP_BRAZERO or OP_SKIPZERO is +inserted before it, after it has been compiled. This means that any OP_RECURSE +items within it that refer to the group itself or any contained groups have to +have their offsets adjusted. That one of the jobs of this function. Before it +is called, the partially compiled regex must be temporarily terminated with +OP_END. + +This function has been extended with the possibility of forward references for +recursions and subroutine calls. It must also check the list of such references +for the group we are dealing with. If it finds that one of the recursions in +the current group is on this list, it adjusts the offset in the list, not the +value in the reference (which is a group number). + +Arguments: + group points to the start of the group + adjust the amount by which the group is to be moved + utf8 TRUE in UTF-8 mode + cd contains pointers to tables etc. + save_hwm the hwm forward reference pointer at the start of the group + +Returns: nothing +*/ + +static void +adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd, + uschar *save_hwm) +{ +uschar *ptr = group; + +while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL) + { + int offset; + uschar *hc; + + /* See if this recursion is on the forward reference list. If so, adjust the + reference. */ + + for (hc = save_hwm; hc < cd->hwm; hc += LINK_SIZE) + { + offset = GET(hc, 0); + if (cd->start_code + offset == ptr + 1) + { + PUT(hc, 0, offset + adjust); + break; + } + } + + /* Otherwise, adjust the recursion offset if it's after the start of this + group. */ + + if (hc >= cd->hwm) + { + offset = GET(ptr, 1); + if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust); + } + + ptr += 1 + LINK_SIZE; + } +} + + + +/************************************************* +* Insert an automatic callout point * +*************************************************/ + +/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert +callout points before each pattern item. + +Arguments: + code current code pointer + ptr current pattern pointer + cd pointers to tables etc + +Returns: new code pointer +*/ + +static uschar * +auto_callout(uschar *code, const uschar *ptr, compile_data *cd) +{ +*code++ = OP_CALLOUT; +*code++ = 255; +PUT(code, 0, ptr - cd->start_pattern); /* Pattern offset */ +PUT(code, LINK_SIZE, 0); /* Default length */ +return code + 2*LINK_SIZE; +} + + + +/************************************************* +* Complete a callout item * +*************************************************/ + +/* A callout item contains the length of the next item in the pattern, which +we can't fill in till after we have reached the relevant point. This is used +for both automatic and manual callouts. + +Arguments: + previous_callout points to previous callout item + ptr current pattern pointer + cd pointers to tables etc + +Returns: nothing +*/ + +static void +complete_callout(uschar *previous_callout, const uschar *ptr, compile_data *cd) +{ +int length = ptr - cd->start_pattern - GET(previous_callout, 2); +PUT(previous_callout, 2 + LINK_SIZE, length); +} + + + +#ifdef SUPPORT_UCP +/************************************************* +* Get othercase range * +*************************************************/ + +/* This function is passed the start and end of a class range, in UTF-8 mode +with UCP support. It searches up the characters, looking for internal ranges of +characters in the "other" case. Each call returns the next one, updating the +start address. + +Arguments: + cptr points to starting character value; updated + d end value + ocptr where to put start of othercase range + odptr where to put end of othercase range + +Yield: TRUE when range returned; FALSE when no more +*/ + +static BOOL +get_othercase_range(unsigned int *cptr, unsigned int d, unsigned int *ocptr, + unsigned int *odptr) +{ +unsigned int c, othercase, next; + +for (c = *cptr; c <= d; c++) + { if ((othercase = UCD_OTHERCASE(c)) != c) break; } + +if (c > d) return FALSE; + +*ocptr = othercase; +next = othercase + 1; + +for (++c; c <= d; c++) + { + if (UCD_OTHERCASE(c) != next) break; + next++; + } + +*odptr = next - 1; +*cptr = c; + +return TRUE; +} +#endif /* SUPPORT_UCP */ + + + +/************************************************* +* Check if auto-possessifying is possible * +*************************************************/ + +/* This function is called for unlimited repeats of certain items, to see +whether the next thing could possibly match the repeated item. If not, it makes +sense to automatically possessify the repeated item. + +Arguments: + op_code the repeated op code + this data for this item, depends on the opcode + utf8 TRUE in UTF-8 mode + utf8_char used for utf8 character bytes, NULL if not relevant + ptr next character in pattern + options options bits + cd contains pointers to tables etc. + +Returns: TRUE if possessifying is wanted +*/ + +static BOOL +check_auto_possessive(int op_code, int item, BOOL utf8, uschar *utf8_char, + const uschar *ptr, int options, compile_data *cd) +{ +int next; + +/* Skip whitespace and comments in extended mode */ + +if ((options & PCRE_EXTENDED) != 0) + { + for (;;) + { + while ((cd->ctypes[*ptr] & ctype_space) != 0) ptr++; + if (*ptr == '#') + { + while (*(++ptr) != 0) + if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } + } + else break; + } + } + +/* If the next item is one that we can handle, get its value. A non-negative +value is a character, a negative value is an escape value. */ + +if (*ptr == '\\') + { + int temperrorcode = 0; + next = check_escape(&ptr, &temperrorcode, cd->bracount, options, FALSE); + if (temperrorcode != 0) return FALSE; + ptr++; /* Point after the escape sequence */ + } + +else if ((cd->ctypes[*ptr] & ctype_meta) == 0) + { +#ifdef SUPPORT_UTF8 + if (utf8) { GETCHARINC(next, ptr); } else +#endif + next = *ptr++; + } + +else return FALSE; + +/* Skip whitespace and comments in extended mode */ + +if ((options & PCRE_EXTENDED) != 0) + { + for (;;) + { + while ((cd->ctypes[*ptr] & ctype_space) != 0) ptr++; + if (*ptr == '#') + { + while (*(++ptr) != 0) + if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } + } + else break; + } + } + +/* If the next thing is itself optional, we have to give up. */ + +if (*ptr == '*' || *ptr == '?' || strncmp((char *)ptr, "{0,", 3) == 0) + return FALSE; + +/* Now compare the next item with the previous opcode. If the previous is a +positive single character match, "item" either contains the character or, if +"item" is greater than 127 in utf8 mode, the character's bytes are in +utf8_char. */ + + +/* Handle cases when the next item is a character. */ + +if (next >= 0) switch(op_code) + { + case OP_CHAR: +#ifdef SUPPORT_UTF8 + if (utf8 && item > 127) { GETCHAR(item, utf8_char); } +#else + (void)(utf8_char); /* Keep compiler happy by referencing function argument */ +#endif + return item != next; + + /* For CHARNC (caseless character) we must check the other case. If we have + Unicode property support, we can use it to test the other case of + high-valued characters. */ + + case OP_CHARNC: +#ifdef SUPPORT_UTF8 + if (utf8 && item > 127) { GETCHAR(item, utf8_char); } +#endif + if (item == next) return FALSE; +#ifdef SUPPORT_UTF8 + if (utf8) + { + unsigned int othercase; + if (next < 128) othercase = cd->fcc[next]; else +#ifdef SUPPORT_UCP + othercase = UCD_OTHERCASE((unsigned int)next); +#else + othercase = NOTACHAR; +#endif + return (unsigned int)item != othercase; + } + else +#endif /* SUPPORT_UTF8 */ + return (item != cd->fcc[next]); /* Non-UTF-8 mode */ + + /* For OP_NOT, "item" must be a single-byte character. */ + + case OP_NOT: + if (item == next) return TRUE; + if ((options & PCRE_CASELESS) == 0) return FALSE; +#ifdef SUPPORT_UTF8 + if (utf8) + { + unsigned int othercase; + if (next < 128) othercase = cd->fcc[next]; else +#ifdef SUPPORT_UCP + othercase = UCD_OTHERCASE(next); +#else + othercase = NOTACHAR; +#endif + return (unsigned int)item == othercase; + } + else +#endif /* SUPPORT_UTF8 */ + return (item == cd->fcc[next]); /* Non-UTF-8 mode */ + + case OP_DIGIT: + return next > 127 || (cd->ctypes[next] & ctype_digit) == 0; + + case OP_NOT_DIGIT: + return next <= 127 && (cd->ctypes[next] & ctype_digit) != 0; + + case OP_WHITESPACE: + return next > 127 || (cd->ctypes[next] & ctype_space) == 0; + + case OP_NOT_WHITESPACE: + return next <= 127 && (cd->ctypes[next] & ctype_space) != 0; + + case OP_WORDCHAR: + return next > 127 || (cd->ctypes[next] & ctype_word) == 0; + + case OP_NOT_WORDCHAR: + return next <= 127 && (cd->ctypes[next] & ctype_word) != 0; + + case OP_HSPACE: + case OP_NOT_HSPACE: + switch(next) + { + case 0x09: + case 0x20: + case 0xa0: + case 0x1680: + case 0x180e: + case 0x2000: + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + case 0x2009: + case 0x200A: + case 0x202f: + case 0x205f: + case 0x3000: + return op_code != OP_HSPACE; + default: + return op_code == OP_HSPACE; + } + + case OP_VSPACE: + case OP_NOT_VSPACE: + switch(next) + { + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x85: + case 0x2028: + case 0x2029: + return op_code != OP_VSPACE; + default: + return op_code == OP_VSPACE; + } + + default: + return FALSE; + } + + +/* Handle the case when the next item is \d, \s, etc. */ + +switch(op_code) + { + case OP_CHAR: + case OP_CHARNC: +#ifdef SUPPORT_UTF8 + if (utf8 && item > 127) { GETCHAR(item, utf8_char); } +#endif + switch(-next) + { + case ESC_d: + return item > 127 || (cd->ctypes[item] & ctype_digit) == 0; + + case ESC_D: + return item <= 127 && (cd->ctypes[item] & ctype_digit) != 0; + + case ESC_s: + return item > 127 || (cd->ctypes[item] & ctype_space) == 0; + + case ESC_S: + return item <= 127 && (cd->ctypes[item] & ctype_space) != 0; + + case ESC_w: + return item > 127 || (cd->ctypes[item] & ctype_word) == 0; + + case ESC_W: + return item <= 127 && (cd->ctypes[item] & ctype_word) != 0; + + case ESC_h: + case ESC_H: + switch(item) + { + case 0x09: + case 0x20: + case 0xa0: + case 0x1680: + case 0x180e: + case 0x2000: + case 0x2001: + case 0x2002: + case 0x2003: + case 0x2004: + case 0x2005: + case 0x2006: + case 0x2007: + case 0x2008: + case 0x2009: + case 0x200A: + case 0x202f: + case 0x205f: + case 0x3000: + return -next != ESC_h; + default: + return -next == ESC_h; + } + + case ESC_v: + case ESC_V: + switch(item) + { + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x85: + case 0x2028: + case 0x2029: + return -next != ESC_v; + default: + return -next == ESC_v; + } + + default: + return FALSE; + } + + case OP_DIGIT: + return next == -ESC_D || next == -ESC_s || next == -ESC_W || + next == -ESC_h || next == -ESC_v; + + case OP_NOT_DIGIT: + return next == -ESC_d; + + case OP_WHITESPACE: + return next == -ESC_S || next == -ESC_d || next == -ESC_w; + + case OP_NOT_WHITESPACE: + return next == -ESC_s || next == -ESC_h || next == -ESC_v; + + case OP_HSPACE: + return next == -ESC_S || next == -ESC_H || next == -ESC_d || next == -ESC_w; + + case OP_NOT_HSPACE: + return next == -ESC_h; + + /* Can't have \S in here because VT matches \S (Perl anomaly) */ + case OP_VSPACE: + return next == -ESC_V || next == -ESC_d || next == -ESC_w; + + case OP_NOT_VSPACE: + return next == -ESC_v; + + case OP_WORDCHAR: + return next == -ESC_W || next == -ESC_s || next == -ESC_h || next == -ESC_v; + + case OP_NOT_WORDCHAR: + return next == -ESC_w || next == -ESC_d; + + default: + return FALSE; + } + +/* Control does not reach here */ +} + + + +/************************************************* +* Compile one branch * +*************************************************/ + +/* Scan the pattern, compiling it into the a vector. If the options are +changed during the branch, the pointer is used to change the external options +bits. This function is used during the pre-compile phase when we are trying +to find out the amount of memory needed, as well as during the real compile +phase. The value of lengthptr distinguishes the two phases. + +Arguments: + optionsptr pointer to the option bits + codeptr points to the pointer to the current code point + ptrptr points to the current pattern pointer + errorcodeptr points to error code variable + firstbyteptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE) + reqbyteptr set to the last literal character required, else < 0 + bcptr points to current branch chain + cd contains pointers to tables etc. + lengthptr NULL during the real compile phase + points to length accumulator during pre-compile phase + +Returns: TRUE on success + FALSE, with *errorcodeptr set non-zero on error +*/ + +static BOOL +compile_branch(int *optionsptr, uschar **codeptr, const uschar **ptrptr, + int *errorcodeptr, int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, + compile_data *cd, int *lengthptr) +{ +int repeat_type, op_type; +int repeat_min = 0, repeat_max = 0; /* To please picky compilers */ +int bravalue = 0; +int greedy_default, greedy_non_default; +int firstbyte, reqbyte; +int zeroreqbyte, zerofirstbyte; +int req_caseopt, reqvary, tempreqvary; +int options = *optionsptr; +int after_manual_callout = 0; +int length_prevgroup = 0; +register int c; +register uschar *code = *codeptr; +uschar *last_code = code; +uschar *orig_code = code; +uschar *tempcode; +BOOL inescq = FALSE; +BOOL groupsetfirstbyte = FALSE; +const uschar *ptr = *ptrptr; +const uschar *tempptr; +uschar *previous = NULL; +uschar *previous_callout = NULL; +uschar *save_hwm = NULL; +uschar classbits[32]; + +#ifdef SUPPORT_UTF8 +BOOL class_utf8; +BOOL utf8 = (options & PCRE_UTF8) != 0; +uschar *class_utf8data; +uschar *class_utf8data_base; +uschar utf8_char[6]; +#else +BOOL utf8 = FALSE; +uschar *utf8_char = NULL; +#endif + +#ifdef DEBUG +if (lengthptr != NULL) DPRINTF((">> start branch\n")); +#endif + +/* Set up the default and non-default settings for greediness */ + +greedy_default = ((options & PCRE_UNGREEDY) != 0); +greedy_non_default = greedy_default ^ 1; + +/* Initialize no first byte, no required byte. REQ_UNSET means "no char +matching encountered yet". It gets changed to REQ_NONE if we hit something that +matches a non-fixed char first char; reqbyte just remains unset if we never +find one. + +When we hit a repeat whose minimum is zero, we may have to adjust these values +to take the zero repeat into account. This is implemented by setting them to +zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual +item types that can be repeated set these backoff variables appropriately. */ + +firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET; + +/* The variable req_caseopt contains either the REQ_CASELESS value or zero, +according to the current setting of the caseless flag. REQ_CASELESS is a bit +value > 255. It is added into the firstbyte or reqbyte variables to record the +case status of the value. This is used only for ASCII characters. */ + +req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; + +/* Switch on next character until the end of the branch */ + +for (;; ptr++) + { + BOOL negate_class; + BOOL should_flip_negation; + BOOL possessive_quantifier; + BOOL is_quantifier; + BOOL is_recurse; + BOOL reset_bracount; + int class_charcount; + int class_lastchar; + int newoptions; + int recno; + int refsign; + int skipbytes; + int subreqbyte; + int subfirstbyte; + int terminator; + int mclength; + uschar mcbuffer[8]; + + /* Get next byte in the pattern */ + + c = *ptr; + + /* If we are in the pre-compile phase, accumulate the length used for the + previous cycle of this loop. */ + + if (lengthptr != NULL) + { +#ifdef DEBUG + if (code > cd->hwm) cd->hwm = code; /* High water info */ +#endif + if (code > cd->start_workspace + COMPILE_WORK_SIZE) /* Check for overrun */ + { + *errorcodeptr = ERR52; + goto FAILED; + } + + /* There is at least one situation where code goes backwards: this is the + case of a zero quantifier after a class (e.g. [ab]{0}). At compile time, + the class is simply eliminated. However, it is created first, so we have to + allow memory for it. Therefore, don't ever reduce the length at this point. + */ + + if (code < last_code) code = last_code; + + /* Paranoid check for integer overflow */ + + if (OFLOW_MAX - *lengthptr < code - last_code) + { + *errorcodeptr = ERR20; + goto FAILED; + } + + *lengthptr += code - last_code; + DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c)); + + /* If "previous" is set and it is not at the start of the work space, move + it back to there, in order to avoid filling up the work space. Otherwise, + if "previous" is NULL, reset the current code pointer to the start. */ + + if (previous != NULL) + { + if (previous > orig_code) + { + memmove(orig_code, previous, code - previous); + code -= previous - orig_code; + previous = orig_code; + } + } + else code = orig_code; + + /* Remember where this code item starts so we can pick up the length + next time round. */ + + last_code = code; + } + + /* In the real compile phase, just check the workspace used by the forward + reference list. */ + + else if (cd->hwm > cd->start_workspace + COMPILE_WORK_SIZE) + { + *errorcodeptr = ERR52; + goto FAILED; + } + + /* If in \Q...\E, check for the end; if not, we have a literal */ + + if (inescq && c != 0) + { + if (c == '\\' && ptr[1] == 'E') + { + inescq = FALSE; + ptr++; + continue; + } + else + { + if (previous_callout != NULL) + { + if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ + complete_callout(previous_callout, ptr, cd); + previous_callout = NULL; + } + if ((options & PCRE_AUTO_CALLOUT) != 0) + { + previous_callout = code; + code = auto_callout(code, ptr, cd); + } + goto NORMAL_CHAR; + } + } + + /* Fill in length of a previous callout, except when the next thing is + a quantifier. */ + + is_quantifier = c == '*' || c == '+' || c == '?' || + (c == '{' && is_counted_repeat(ptr+1)); + + if (!is_quantifier && previous_callout != NULL && + after_manual_callout-- <= 0) + { + if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ + complete_callout(previous_callout, ptr, cd); + previous_callout = NULL; + } + + /* In extended mode, skip white space and comments */ + + if ((options & PCRE_EXTENDED) != 0) + { + if ((cd->ctypes[c] & ctype_space) != 0) continue; + if (c == '#') + { + while (*(++ptr) != 0) + { + if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; } + } + if (*ptr != 0) continue; + + /* Else fall through to handle end of string */ + c = 0; + } + } + + /* No auto callout for quantifiers. */ + + if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier) + { + previous_callout = code; + code = auto_callout(code, ptr, cd); + } + + switch(c) + { + /* ===================================================================*/ + case 0: /* The branch terminates at string end */ + case '|': /* or | or ) */ + case ')': + *firstbyteptr = firstbyte; + *reqbyteptr = reqbyte; + *codeptr = code; + *ptrptr = ptr; + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < code - last_code) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += code - last_code; /* To include callout length */ + DPRINTF((">> end branch\n")); + } + return TRUE; + + + /* ===================================================================*/ + /* Handle single-character metacharacters. In multiline mode, ^ disables + the setting of any following char as a first character. */ + + case '^': + if ((options & PCRE_MULTILINE) != 0) + { + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + } + previous = NULL; + *code++ = OP_CIRC; + break; + + case '$': + previous = NULL; + *code++ = OP_DOLL; + break; + + /* There can never be a first char if '.' is first, whatever happens about + repeats. The value of reqbyte doesn't change either. */ + + case '.': + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + zerofirstbyte = firstbyte; + zeroreqbyte = reqbyte; + previous = code; + *code++ = ((options & PCRE_DOTALL) != 0)? OP_ALLANY: OP_ANY; + break; + + + /* ===================================================================*/ + /* Character classes. If the included characters are all < 256, we build a + 32-byte bitmap of the permitted characters, except in the special case + where there is only one such character. For negated classes, we build the + map as usual, then invert it at the end. However, we use a different opcode + so that data characters > 255 can be handled correctly. + + If the class contains characters outside the 0-255 range, a different + opcode is compiled. It may optionally have a bit map for characters < 256, + but those above are are explicitly listed afterwards. A flag byte tells + whether the bitmap is present, and whether this is a negated class or not. + + In JavaScript compatibility mode, an isolated ']' causes an error. In + default (Perl) mode, it is treated as a data character. */ + + case ']': + if ((cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + *errorcodeptr = ERR64; + goto FAILED; + } + goto NORMAL_CHAR; + + case '[': + previous = code; + + /* PCRE supports POSIX class stuff inside a class. Perl gives an error if + they are encountered at the top level, so we'll do that too. */ + + if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && + check_posix_syntax(ptr, &tempptr)) + { + *errorcodeptr = (ptr[1] == ':')? ERR13 : ERR31; + goto FAILED; + } + + /* If the first character is '^', set the negation flag and skip it. Also, + if the first few characters (either before or after ^) are \Q\E or \E we + skip them too. This makes for compatibility with Perl. */ + + negate_class = FALSE; + for (;;) + { + c = *(++ptr); + if (c == '\\') + { + if (ptr[1] == 'E') ptr++; + else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3; + else break; + } + else if (!negate_class && c == '^') + negate_class = TRUE; + else break; + } + + /* Empty classes are allowed in JavaScript compatibility mode. Otherwise, + an initial ']' is taken as a data character -- the code below handles + that. In JS mode, [] must always fail, so generate OP_FAIL, whereas + [^] must match any character, so generate OP_ALLANY. */ + + if (c ==']' && (cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + *code++ = negate_class? OP_ALLANY : OP_FAIL; + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + zerofirstbyte = firstbyte; + break; + } + + /* If a class contains a negative special such as \S, we need to flip the + negation flag at the end, so that support for characters > 255 works + correctly (they are all included in the class). */ + + should_flip_negation = FALSE; + + /* Keep a count of chars with values < 256 so that we can optimize the case + of just a single character (as long as it's < 256). However, For higher + valued UTF-8 characters, we don't yet do any optimization. */ + + class_charcount = 0; + class_lastchar = -1; + + /* Initialize the 32-char bit map to all zeros. We build the map in a + temporary bit of memory, in case the class contains only 1 character (less + than 256), because in that case the compiled code doesn't use the bit map. + */ + + memset(classbits, 0, 32 * sizeof(uschar)); + +#ifdef SUPPORT_UTF8 + class_utf8 = FALSE; /* No chars >= 256 */ + class_utf8data = code + LINK_SIZE + 2; /* For UTF-8 items */ + class_utf8data_base = class_utf8data; /* For resetting in pass 1 */ +#endif + + /* Process characters until ] is reached. By writing this as a "do" it + means that an initial ] is taken as a data character. At the start of the + loop, c contains the first byte of the character. */ + + if (c != 0) do + { + const uschar *oldptr; + +#ifdef SUPPORT_UTF8 + if (utf8 && c > 127) + { /* Braces are required because the */ + GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ + } + + /* In the pre-compile phase, accumulate the length of any UTF-8 extra + data and reset the pointer. This is so that very large classes that + contain a zillion UTF-8 characters no longer overwrite the work space + (which is on the stack). */ + + if (lengthptr != NULL) + { + *lengthptr += class_utf8data - class_utf8data_base; + class_utf8data = class_utf8data_base; + } + +#endif + + /* Inside \Q...\E everything is literal except \E */ + + if (inescq) + { + if (c == '\\' && ptr[1] == 'E') /* If we are at \E */ + { + inescq = FALSE; /* Reset literal state */ + ptr++; /* Skip the 'E' */ + continue; /* Carry on with next */ + } + goto CHECK_RANGE; /* Could be range if \E follows */ + } + + /* Handle POSIX class names. Perl allows a negation extension of the + form [:^name:]. A square bracket that doesn't match the syntax is + treated as a literal. We also recognize the POSIX constructions + [.ch.] and [=ch=] ("collating elements") and fault them, as Perl + 5.6 and 5.8 do. */ + + if (c == '[' && + (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && + check_posix_syntax(ptr, &tempptr)) + { + BOOL local_negate = FALSE; + int posix_class, taboffset, tabopt; + register const uschar *cbits = cd->cbits; + uschar pbits[32]; + + if (ptr[1] != ':') + { + *errorcodeptr = ERR31; + goto FAILED; + } + + ptr += 2; + if (*ptr == '^') + { + local_negate = TRUE; + should_flip_negation = TRUE; /* Note negative special */ + ptr++; + } + + posix_class = check_posix_name(ptr, tempptr - ptr); + if (posix_class < 0) + { + *errorcodeptr = ERR30; + goto FAILED; + } + + /* If matching is caseless, upper and lower are converted to + alpha. This relies on the fact that the class table starts with + alpha, lower, upper as the first 3 entries. */ + + if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) + posix_class = 0; + + /* We build the bit map for the POSIX class in a chunk of local store + because we may be adding and subtracting from it, and we don't want to + subtract bits that may be in the main map already. At the end we or the + result into the bit map that is being built. */ + + posix_class *= 3; + + /* Copy in the first table (always present) */ + + memcpy(pbits, cbits + posix_class_maps[posix_class], + 32 * sizeof(uschar)); + + /* If there is a second table, add or remove it as required. */ + + taboffset = posix_class_maps[posix_class + 1]; + tabopt = posix_class_maps[posix_class + 2]; + + if (taboffset >= 0) + { + if (tabopt >= 0) + for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset]; + else + for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset]; + } + + /* Not see if we need to remove any special characters. An option + value of 1 removes vertical space and 2 removes underscore. */ + + if (tabopt < 0) tabopt = -tabopt; + if (tabopt == 1) pbits[1] &= ~0x3c; + else if (tabopt == 2) pbits[11] &= 0x7f; + + /* Add the POSIX table or its complement into the main table that is + being built and we are done. */ + + if (local_negate) + for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c]; + else + for (c = 0; c < 32; c++) classbits[c] |= pbits[c]; + + ptr = tempptr + 1; + class_charcount = 10; /* Set > 1; assumes more than 1 per class */ + continue; /* End of POSIX syntax handling */ + } + + /* Backslash may introduce a single character, or it may introduce one + of the specials, which just set a flag. The sequence \b is a special + case. Inside a class (and only there) it is treated as backspace. + Elsewhere it marks a word boundary. Other escapes have preset maps ready + to 'or' into the one we are building. We assume they have more than one + character in them, so set class_charcount bigger than one. */ + + if (c == '\\') + { + c = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE); + if (*errorcodeptr != 0) goto FAILED; + + if (-c == ESC_b) c = '\b'; /* \b is backspace in a class */ + else if (-c == ESC_X) c = 'X'; /* \X is literal X in a class */ + else if (-c == ESC_R) c = 'R'; /* \R is literal R in a class */ + else if (-c == ESC_Q) /* Handle start of quoted string */ + { + if (ptr[1] == '\\' && ptr[2] == 'E') + { + ptr += 2; /* avoid empty string */ + } + else inescq = TRUE; + continue; + } + else if (-c == ESC_E) continue; /* Ignore orphan \E */ + + if (c < 0) + { + register const uschar *cbits = cd->cbits; + class_charcount += 2; /* Greater than 1 is what matters */ + + /* Save time by not doing this in the pre-compile phase. */ + + if (lengthptr == NULL) switch (-c) + { + case ESC_d: + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit]; + continue; + + case ESC_D: + should_flip_negation = TRUE; + for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit]; + continue; + + case ESC_w: + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word]; + continue; + + case ESC_W: + should_flip_negation = TRUE; + for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word]; + continue; + + case ESC_s: + for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; + classbits[1] &= ~0x08; /* Perl 5.004 onwards omits VT from \s */ + continue; + + case ESC_S: + should_flip_negation = TRUE; + for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space]; + classbits[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */ + continue; + + default: /* Not recognized; fall through */ + break; /* Need "default" setting to stop compiler warning. */ + } + + /* In the pre-compile phase, just do the recognition. */ + + else if (c == -ESC_d || c == -ESC_D || c == -ESC_w || + c == -ESC_W || c == -ESC_s || c == -ESC_S) continue; + + /* We need to deal with \H, \h, \V, and \v in both phases because + they use extra memory. */ + + if (-c == ESC_h) + { + SETBIT(classbits, 0x09); /* VT */ + SETBIT(classbits, 0x20); /* SPACE */ + SETBIT(classbits, 0xa0); /* NSBP */ +#ifdef SUPPORT_UTF8 + if (utf8) + { + class_utf8 = TRUE; + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(0x1680, class_utf8data); + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(0x180e, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x2000, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x200A, class_utf8data); + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(0x202f, class_utf8data); + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(0x205f, class_utf8data); + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(0x3000, class_utf8data); + } +#endif + continue; + } + + if (-c == ESC_H) + { + for (c = 0; c < 32; c++) + { + int x = 0xff; + switch (c) + { + case 0x09/8: x ^= 1 << (0x09%8); break; + case 0x20/8: x ^= 1 << (0x20%8); break; + case 0xa0/8: x ^= 1 << (0xa0%8); break; + default: break; + } + classbits[c] |= x; + } + +#ifdef SUPPORT_UTF8 + if (utf8) + { + class_utf8 = TRUE; + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x0100, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x167f, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x1681, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x180d, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x180f, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x1fff, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x200B, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x202e, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x2030, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x205e, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x2060, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x2fff, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x3001, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x7fffffff, class_utf8data); + } +#endif + continue; + } + + if (-c == ESC_v) + { + SETBIT(classbits, 0x0a); /* LF */ + SETBIT(classbits, 0x0b); /* VT */ + SETBIT(classbits, 0x0c); /* FF */ + SETBIT(classbits, 0x0d); /* CR */ + SETBIT(classbits, 0x85); /* NEL */ +#ifdef SUPPORT_UTF8 + if (utf8) + { + class_utf8 = TRUE; + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x2028, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x2029, class_utf8data); + } +#endif + continue; + } + + if (-c == ESC_V) + { + for (c = 0; c < 32; c++) + { + int x = 0xff; + switch (c) + { + case 0x0a/8: x ^= 1 << (0x0a%8); + x ^= 1 << (0x0b%8); + x ^= 1 << (0x0c%8); + x ^= 1 << (0x0d%8); + break; + case 0x85/8: x ^= 1 << (0x85%8); break; + default: break; + } + classbits[c] |= x; + } + +#ifdef SUPPORT_UTF8 + if (utf8) + { + class_utf8 = TRUE; + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x0100, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x2027, class_utf8data); + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(0x2029, class_utf8data); + class_utf8data += _pcre_ord2utf8(0x7fffffff, class_utf8data); + } +#endif + continue; + } + + /* We need to deal with \P and \p in both phases. */ + +#ifdef SUPPORT_UCP + if (-c == ESC_p || -c == ESC_P) + { + BOOL negated; + int pdata; + int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr); + if (ptype < 0) goto FAILED; + class_utf8 = TRUE; + *class_utf8data++ = ((-c == ESC_p) != negated)? + XCL_PROP : XCL_NOTPROP; + *class_utf8data++ = ptype; + *class_utf8data++ = pdata; + class_charcount -= 2; /* Not a < 256 character */ + continue; + } +#endif + /* Unrecognized escapes are faulted if PCRE is running in its + strict mode. By default, for compatibility with Perl, they are + treated as literals. */ + + if ((options & PCRE_EXTRA) != 0) + { + *errorcodeptr = ERR7; + goto FAILED; + } + + class_charcount -= 2; /* Undo the default count from above */ + c = *ptr; /* Get the final character and fall through */ + } + + /* Fall through if we have a single character (c >= 0). This may be + greater than 256 in UTF-8 mode. */ + + } /* End of backslash handling */ + + /* A single character may be followed by '-' to form a range. However, + Perl does not permit ']' to be the end of the range. A '-' character + at the end is treated as a literal. Perl ignores orphaned \E sequences + entirely. The code for handling \Q and \E is messy. */ + + CHECK_RANGE: + while (ptr[1] == '\\' && ptr[2] == 'E') + { + inescq = FALSE; + ptr += 2; + } + + oldptr = ptr; + + /* Remember \r or \n */ + + if (c == '\r' || c == '\n') cd->external_flags |= PCRE_HASCRORLF; + + /* Check for range */ + + if (!inescq && ptr[1] == '-') + { + int d; + ptr += 2; + while (*ptr == '\\' && ptr[1] == 'E') ptr += 2; + + /* If we hit \Q (not followed by \E) at this point, go into escaped + mode. */ + + while (*ptr == '\\' && ptr[1] == 'Q') + { + ptr += 2; + if (*ptr == '\\' && ptr[1] == 'E') { ptr += 2; continue; } + inescq = TRUE; + break; + } + + if (*ptr == 0 || (!inescq && *ptr == ']')) + { + ptr = oldptr; + goto LONE_SINGLE_CHARACTER; + } + +#ifdef SUPPORT_UTF8 + if (utf8) + { /* Braces are required because the */ + GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */ + } + else +#endif + d = *ptr; /* Not UTF-8 mode */ + + /* The second part of a range can be a single-character escape, but + not any of the other escapes. Perl 5.6 treats a hyphen as a literal + in such circumstances. */ + + if (!inescq && d == '\\') + { + d = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE); + if (*errorcodeptr != 0) goto FAILED; + + /* \b is backspace; \X is literal X; \R is literal R; any other + special means the '-' was literal */ + + if (d < 0) + { + if (d == -ESC_b) d = '\b'; + else if (d == -ESC_X) d = 'X'; + else if (d == -ESC_R) d = 'R'; else + { + ptr = oldptr; + goto LONE_SINGLE_CHARACTER; /* A few lines below */ + } + } + } + + /* Check that the two values are in the correct order. Optimize + one-character ranges */ + + if (d < c) + { + *errorcodeptr = ERR8; + goto FAILED; + } + + if (d == c) goto LONE_SINGLE_CHARACTER; /* A few lines below */ + + /* Remember \r or \n */ + + if (d == '\r' || d == '\n') cd->external_flags |= PCRE_HASCRORLF; + + /* In UTF-8 mode, if the upper limit is > 255, or > 127 for caseless + matching, we have to use an XCLASS with extra data items. Caseless + matching for characters > 127 is available only if UCP support is + available. */ + +#ifdef SUPPORT_UTF8 + if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127))) + { + class_utf8 = TRUE; + + /* With UCP support, we can find the other case equivalents of + the relevant characters. There may be several ranges. Optimize how + they fit with the basic range. */ + +#ifdef SUPPORT_UCP + if ((options & PCRE_CASELESS) != 0) + { + unsigned int occ, ocd; + unsigned int cc = c; + unsigned int origd = d; + while (get_othercase_range(&cc, origd, &occ, &ocd)) + { + if (occ >= (unsigned int)c && + ocd <= (unsigned int)d) + continue; /* Skip embedded ranges */ + + if (occ < (unsigned int)c && + ocd >= (unsigned int)c - 1) /* Extend the basic range */ + { /* if there is overlap, */ + c = occ; /* noting that if occ < c */ + continue; /* we can't have ocd > d */ + } /* because a subrange is */ + if (ocd > (unsigned int)d && + occ <= (unsigned int)d + 1) /* always shorter than */ + { /* the basic range. */ + d = ocd; + continue; + } + + if (occ == ocd) + { + *class_utf8data++ = XCL_SINGLE; + } + else + { + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(occ, class_utf8data); + } + class_utf8data += _pcre_ord2utf8(ocd, class_utf8data); + } + } +#endif /* SUPPORT_UCP */ + + /* Now record the original range, possibly modified for UCP caseless + overlapping ranges. */ + + *class_utf8data++ = XCL_RANGE; + class_utf8data += _pcre_ord2utf8(c, class_utf8data); + class_utf8data += _pcre_ord2utf8(d, class_utf8data); + + /* With UCP support, we are done. Without UCP support, there is no + caseless matching for UTF-8 characters > 127; we can use the bit map + for the smaller ones. */ + +#ifdef SUPPORT_UCP + continue; /* With next character in the class */ +#else + if ((options & PCRE_CASELESS) == 0 || c > 127) continue; + + /* Adjust upper limit and fall through to set up the map */ + + d = 127; + +#endif /* SUPPORT_UCP */ + } +#endif /* SUPPORT_UTF8 */ + + /* We use the bit map for all cases when not in UTF-8 mode; else + ranges that lie entirely within 0-127 when there is UCP support; else + for partial ranges without UCP support. */ + + class_charcount += d - c + 1; + class_lastchar = d; + + /* We can save a bit of time by skipping this in the pre-compile. */ + + if (lengthptr == NULL) for (; c <= d; c++) + { + classbits[c/8] |= (1 << (c&7)); + if ((options & PCRE_CASELESS) != 0) + { + int uc = cd->fcc[c]; /* flip case */ + classbits[uc/8] |= (1 << (uc&7)); + } + } + + continue; /* Go get the next char in the class */ + } + + /* Handle a lone single character - we can get here for a normal + non-escape char, or after \ that introduces a single character or for an + apparent range that isn't. */ + + LONE_SINGLE_CHARACTER: + + /* Handle a character that cannot go in the bit map */ + +#ifdef SUPPORT_UTF8 + if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127))) + { + class_utf8 = TRUE; + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(c, class_utf8data); + +#ifdef SUPPORT_UCP + if ((options & PCRE_CASELESS) != 0) + { + unsigned int othercase; + if ((othercase = UCD_OTHERCASE(c)) != c) + { + *class_utf8data++ = XCL_SINGLE; + class_utf8data += _pcre_ord2utf8(othercase, class_utf8data); + } + } +#endif /* SUPPORT_UCP */ + + } + else +#endif /* SUPPORT_UTF8 */ + + /* Handle a single-byte character */ + { + classbits[c/8] |= (1 << (c&7)); + if ((options & PCRE_CASELESS) != 0) + { + c = cd->fcc[c]; /* flip case */ + classbits[c/8] |= (1 << (c&7)); + } + class_charcount++; + class_lastchar = c; + } + } + + /* Loop until ']' reached. This "while" is the end of the "do" above. */ + + while ((c = *(++ptr)) != 0 && (c != ']' || inescq)); + + if (c == 0) /* Missing terminating ']' */ + { + *errorcodeptr = ERR6; + goto FAILED; + } + + +/* This code has been disabled because it would mean that \s counts as +an explicit \r or \n reference, and that's not really what is wanted. Now +we set the flag only if there is a literal "\r" or "\n" in the class. */ + +#if 0 + /* Remember whether \r or \n are in this class */ + + if (negate_class) + { + if ((classbits[1] & 0x24) != 0x24) cd->external_flags |= PCRE_HASCRORLF; + } + else + { + if ((classbits[1] & 0x24) != 0) cd->external_flags |= PCRE_HASCRORLF; + } +#endif + + + /* If class_charcount is 1, we saw precisely one character whose value is + less than 256. As long as there were no characters >= 128 and there was no + use of \p or \P, in other words, no use of any XCLASS features, we can + optimize. + + In UTF-8 mode, we can optimize the negative case only if there were no + characters >= 128 because OP_NOT and the related opcodes like OP_NOTSTAR + operate on single-bytes only. This is an historical hangover. Maybe one day + we can tidy these opcodes to handle multi-byte characters. + + The optimization throws away the bit map. We turn the item into a + 1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note + that OP_NOT does not support multibyte characters. In the positive case, it + can cause firstbyte to be set. Otherwise, there can be no first char if + this item is first, whatever repeat count may follow. In the case of + reqbyte, save the previous value for reinstating. */ + +#ifdef SUPPORT_UTF8 + if (class_charcount == 1 && !class_utf8 && + (!utf8 || !negate_class || class_lastchar < 128)) +#else + if (class_charcount == 1) +#endif + { + zeroreqbyte = reqbyte; + + /* The OP_NOT opcode works on one-byte characters only. */ + + if (negate_class) + { + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + zerofirstbyte = firstbyte; + *code++ = OP_NOT; + *code++ = class_lastchar; + break; + } + + /* For a single, positive character, get the value into mcbuffer, and + then we can handle this with the normal one-character code. */ + +#ifdef SUPPORT_UTF8 + if (utf8 && class_lastchar > 127) + mclength = _pcre_ord2utf8(class_lastchar, mcbuffer); + else +#endif + { + mcbuffer[0] = class_lastchar; + mclength = 1; + } + goto ONE_CHAR; + } /* End of 1-char optimization */ + + /* The general case - not the one-char optimization. If this is the first + thing in the branch, there can be no first char setting, whatever the + repeat count. Any reqbyte setting must remain unchanged after any kind of + repeat. */ + + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + zerofirstbyte = firstbyte; + zeroreqbyte = reqbyte; + + /* If there are characters with values > 255, we have to compile an + extended class, with its own opcode, unless there was a negated special + such as \S in the class, because in that case all characters > 255 are in + the class, so any that were explicitly given as well can be ignored. If + (when there are explicit characters > 255 that must be listed) there are no + characters < 256, we can omit the bitmap in the actual compiled code. */ + +#ifdef SUPPORT_UTF8 + if (class_utf8 && !should_flip_negation) + { + *class_utf8data++ = XCL_END; /* Marks the end of extra data */ + *code++ = OP_XCLASS; + code += LINK_SIZE; + *code = negate_class? XCL_NOT : 0; + + /* If the map is required, move up the extra data to make room for it; + otherwise just move the code pointer to the end of the extra data. */ + + if (class_charcount > 0) + { + *code++ |= XCL_MAP; + memmove(code + 32, code, class_utf8data - code); + memcpy(code, classbits, 32); + code = class_utf8data + 32; + } + else code = class_utf8data; + + /* Now fill in the complete length of the item */ + + PUT(previous, 1, code - previous); + break; /* End of class handling */ + } +#endif + + /* If there are no characters > 255, set the opcode to OP_CLASS or + OP_NCLASS, depending on whether the whole class was negated and whether + there were negative specials such as \S in the class. Then copy the 32-byte + map into the code vector, negating it if necessary. */ + + *code++ = (negate_class == should_flip_negation) ? OP_CLASS : OP_NCLASS; + if (negate_class) + { + if (lengthptr == NULL) /* Save time in the pre-compile phase */ + for (c = 0; c < 32; c++) code[c] = ~classbits[c]; + } + else + { + memcpy(code, classbits, 32); + } + code += 32; + break; + + + /* ===================================================================*/ + /* Various kinds of repeat; '{' is not necessarily a quantifier, but this + has been tested above. */ + + case '{': + if (!is_quantifier) goto NORMAL_CHAR; + ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorcodeptr); + if (*errorcodeptr != 0) goto FAILED; + goto REPEAT; + + case '*': + repeat_min = 0; + repeat_max = -1; + goto REPEAT; + + case '+': + repeat_min = 1; + repeat_max = -1; + goto REPEAT; + + case '?': + repeat_min = 0; + repeat_max = 1; + + REPEAT: + if (previous == NULL) + { + *errorcodeptr = ERR9; + goto FAILED; + } + + if (repeat_min == 0) + { + firstbyte = zerofirstbyte; /* Adjust for zero repeat */ + reqbyte = zeroreqbyte; /* Ditto */ + } + + /* Remember whether this is a variable length repeat */ + + reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY; + + op_type = 0; /* Default single-char op codes */ + possessive_quantifier = FALSE; /* Default not possessive quantifier */ + + /* Save start of previous item, in case we have to move it up to make space + for an inserted OP_ONCE for the additional '+' extension. */ + + tempcode = previous; + + /* If the next character is '+', we have a possessive quantifier. This + implies greediness, whatever the setting of the PCRE_UNGREEDY option. + If the next character is '?' this is a minimizing repeat, by default, + but if PCRE_UNGREEDY is set, it works the other way round. We change the + repeat type to the non-default. */ + + if (ptr[1] == '+') + { + repeat_type = 0; /* Force greedy */ + possessive_quantifier = TRUE; + ptr++; + } + else if (ptr[1] == '?') + { + repeat_type = greedy_non_default; + ptr++; + } + else repeat_type = greedy_default; + + /* If previous was a character match, abolish the item and generate a + repeat item instead. If a char item has a minumum of more than one, ensure + that it is set in reqbyte - it might not be if a sequence such as x{3} is + the first thing in a branch because the x will have gone into firstbyte + instead. */ + + if (*previous == OP_CHAR || *previous == OP_CHARNC) + { + /* Deal with UTF-8 characters that take up more than one byte. It's + easier to write this out separately than try to macrify it. Use c to + hold the length of the character in bytes, plus 0x80 to flag that it's a + length rather than a small character. */ + +#ifdef SUPPORT_UTF8 + if (utf8 && (code[-1] & 0x80) != 0) + { + uschar *lastchar = code - 1; + while((*lastchar & 0xc0) == 0x80) lastchar--; + c = code - lastchar; /* Length of UTF-8 character */ + memcpy(utf8_char, lastchar, c); /* Save the char */ + c |= 0x80; /* Flag c as a length */ + } + else +#endif + + /* Handle the case of a single byte - either with no UTF8 support, or + with UTF-8 disabled, or for a UTF-8 character < 128. */ + + { + c = code[-1]; + if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt; + } + + /* If the repetition is unlimited, it pays to see if the next thing on + the line is something that cannot possibly match this character. If so, + automatically possessifying this item gains some performance in the case + where the match fails. */ + + if (!possessive_quantifier && + repeat_max < 0 && + check_auto_possessive(*previous, c, utf8, utf8_char, ptr + 1, + options, cd)) + { + repeat_type = 0; /* Force greedy */ + possessive_quantifier = TRUE; + } + + goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ + } + + /* If previous was a single negated character ([^a] or similar), we use + one of the special opcodes, replacing it. The code is shared with single- + character repeats by setting opt_type to add a suitable offset into + repeat_type. We can also test for auto-possessification. OP_NOT is + currently used only for single-byte chars. */ + + else if (*previous == OP_NOT) + { + op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */ + c = previous[1]; + if (!possessive_quantifier && + repeat_max < 0 && + check_auto_possessive(OP_NOT, c, utf8, NULL, ptr + 1, options, cd)) + { + repeat_type = 0; /* Force greedy */ + possessive_quantifier = TRUE; + } + goto OUTPUT_SINGLE_REPEAT; + } + + /* If previous was a character type match (\d or similar), abolish it and + create a suitable repeat item. The code is shared with single-character + repeats by setting op_type to add a suitable offset into repeat_type. Note + the the Unicode property types will be present only when SUPPORT_UCP is + defined, but we don't wrap the little bits of code here because it just + makes it horribly messy. */ + + else if (*previous < OP_EODN) + { + uschar *oldcode; + int prop_type, prop_value; + op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ + c = *previous; + + if (!possessive_quantifier && + repeat_max < 0 && + check_auto_possessive(c, 0, utf8, NULL, ptr + 1, options, cd)) + { + repeat_type = 0; /* Force greedy */ + possessive_quantifier = TRUE; + } + + OUTPUT_SINGLE_REPEAT: + if (*previous == OP_PROP || *previous == OP_NOTPROP) + { + prop_type = previous[1]; + prop_value = previous[2]; + } + else prop_type = prop_value = -1; + + oldcode = code; + code = previous; /* Usually overwrite previous item */ + + /* If the maximum is zero then the minimum must also be zero; Perl allows + this case, so we do too - by simply omitting the item altogether. */ + + if (repeat_max == 0) goto END_REPEAT; + + /* All real repeats make it impossible to handle partial matching (maybe + one day we will be able to remove this restriction). */ + + if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; + + /* Combine the op_type with the repeat_type */ + + repeat_type += op_type; + + /* A minimum of zero is handled either as the special case * or ?, or as + an UPTO, with the maximum given. */ + + if (repeat_min == 0) + { + if (repeat_max == -1) *code++ = OP_STAR + repeat_type; + else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; + else + { + *code++ = OP_UPTO + repeat_type; + PUT2INC(code, 0, repeat_max); + } + } + + /* A repeat minimum of 1 is optimized into some special cases. If the + maximum is unlimited, we use OP_PLUS. Otherwise, the original item is + left in place and, if the maximum is greater than 1, we use OP_UPTO with + one less than the maximum. */ + + else if (repeat_min == 1) + { + if (repeat_max == -1) + *code++ = OP_PLUS + repeat_type; + else + { + code = oldcode; /* leave previous item in place */ + if (repeat_max == 1) goto END_REPEAT; + *code++ = OP_UPTO + repeat_type; + PUT2INC(code, 0, repeat_max - 1); + } + } + + /* The case {n,n} is just an EXACT, while the general case {n,m} is + handled as an EXACT followed by an UPTO. */ + + else + { + *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ + PUT2INC(code, 0, repeat_min); + + /* If the maximum is unlimited, insert an OP_STAR. Before doing so, + we have to insert the character for the previous code. For a repeated + Unicode property match, there are two extra bytes that define the + required property. In UTF-8 mode, long characters have their length in + c, with the 0x80 bit as a flag. */ + + if (repeat_max < 0) + { +#ifdef SUPPORT_UTF8 + if (utf8 && c >= 128) + { + memcpy(code, utf8_char, c & 7); + code += c & 7; + } + else +#endif + { + *code++ = c; + if (prop_type >= 0) + { + *code++ = prop_type; + *code++ = prop_value; + } + } + *code++ = OP_STAR + repeat_type; + } + + /* Else insert an UPTO if the max is greater than the min, again + preceded by the character, for the previously inserted code. If the + UPTO is just for 1 instance, we can use QUERY instead. */ + + else if (repeat_max != repeat_min) + { +#ifdef SUPPORT_UTF8 + if (utf8 && c >= 128) + { + memcpy(code, utf8_char, c & 7); + code += c & 7; + } + else +#endif + *code++ = c; + if (prop_type >= 0) + { + *code++ = prop_type; + *code++ = prop_value; + } + repeat_max -= repeat_min; + + if (repeat_max == 1) + { + *code++ = OP_QUERY + repeat_type; + } + else + { + *code++ = OP_UPTO + repeat_type; + PUT2INC(code, 0, repeat_max); + } + } + } + + /* The character or character type itself comes last in all cases. */ + +#ifdef SUPPORT_UTF8 + if (utf8 && c >= 128) + { + memcpy(code, utf8_char, c & 7); + code += c & 7; + } + else +#endif + *code++ = c; + + /* For a repeated Unicode property match, there are two extra bytes that + define the required property. */ + +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + *code++ = prop_type; + *code++ = prop_value; + } +#endif + } + + /* If previous was a character class or a back reference, we put the repeat + stuff after it, but just skip the item if the repeat was {0,0}. */ + + else if (*previous == OP_CLASS || + *previous == OP_NCLASS || +#ifdef SUPPORT_UTF8 + *previous == OP_XCLASS || +#endif + *previous == OP_REF) + { + if (repeat_max == 0) + { + code = previous; + goto END_REPEAT; + } + + /* All real repeats make it impossible to handle partial matching (maybe + one day we will be able to remove this restriction). */ + + if (repeat_max != 1) cd->external_flags |= PCRE_NOPARTIAL; + + if (repeat_min == 0 && repeat_max == -1) + *code++ = OP_CRSTAR + repeat_type; + else if (repeat_min == 1 && repeat_max == -1) + *code++ = OP_CRPLUS + repeat_type; + else if (repeat_min == 0 && repeat_max == 1) + *code++ = OP_CRQUERY + repeat_type; + else + { + *code++ = OP_CRRANGE + repeat_type; + PUT2INC(code, 0, repeat_min); + if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ + PUT2INC(code, 0, repeat_max); + } + } + + /* If previous was a bracket group, we may have to replicate it in certain + cases. */ + + else if (*previous == OP_BRA || *previous == OP_CBRA || + *previous == OP_ONCE || *previous == OP_COND) + { + register int i; + int ketoffset = 0; + int len = code - previous; + uschar *bralink = NULL; + + /* Repeating a DEFINE group is pointless */ + + if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF) + { + *errorcodeptr = ERR55; + goto FAILED; + } + + /* If the maximum repeat count is unlimited, find the end of the bracket + by scanning through from the start, and compute the offset back to it + from the current code pointer. There may be an OP_OPT setting following + the final KET, so we can't find the end just by going back from the code + pointer. */ + + if (repeat_max == -1) + { + register uschar *ket = previous; + do ket += GET(ket, 1); while (*ket != OP_KET); + ketoffset = code - ket; + } + + /* The case of a zero minimum is special because of the need to stick + OP_BRAZERO in front of it, and because the group appears once in the + data, whereas in other cases it appears the minimum number of times. For + this reason, it is simplest to treat this case separately, as otherwise + the code gets far too messy. There are several special subcases when the + minimum is zero. */ + + if (repeat_min == 0) + { + /* If the maximum is also zero, we used to just omit the group from the + output altogether, like this: + + ** if (repeat_max == 0) + ** { + ** code = previous; + ** goto END_REPEAT; + ** } + + However, that fails when a group is referenced as a subroutine from + elsewhere in the pattern, so now we stick in OP_SKIPZERO in front of it + so that it is skipped on execution. As we don't have a list of which + groups are referenced, we cannot do this selectively. + + If the maximum is 1 or unlimited, we just have to stick in the BRAZERO + and do no more at this point. However, we do need to adjust any + OP_RECURSE calls inside the group that refer to the group itself or any + internal or forward referenced group, because the offset is from the + start of the whole regex. Temporarily terminate the pattern while doing + this. */ + + if (repeat_max <= 1) /* Covers 0, 1, and unlimited */ + { + *code = OP_END; + adjust_recurse(previous, 1, utf8, cd, save_hwm); + memmove(previous+1, previous, len); + code++; + if (repeat_max == 0) + { + *previous++ = OP_SKIPZERO; + goto END_REPEAT; + } + *previous++ = OP_BRAZERO + repeat_type; + } + + /* If the maximum is greater than 1 and limited, we have to replicate + in a nested fashion, sticking OP_BRAZERO before each set of brackets. + The first one has to be handled carefully because it's the original + copy, which has to be moved up. The remainder can be handled by code + that is common with the non-zero minimum case below. We have to + adjust the value or repeat_max, since one less copy is required. Once + again, we may have to adjust any OP_RECURSE calls inside the group. */ + + else + { + int offset; + *code = OP_END; + adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd, save_hwm); + memmove(previous + 2 + LINK_SIZE, previous, len); + code += 2 + LINK_SIZE; + *previous++ = OP_BRAZERO + repeat_type; + *previous++ = OP_BRA; + + /* We chain together the bracket offset fields that have to be + filled in later when the ends of the brackets are reached. */ + + offset = (bralink == NULL)? 0 : previous - bralink; + bralink = previous; + PUTINC(previous, 0, offset); + } + + repeat_max--; + } + + /* If the minimum is greater than zero, replicate the group as many + times as necessary, and adjust the maximum to the number of subsequent + copies that we need. If we set a first char from the group, and didn't + set a required char, copy the latter from the former. If there are any + forward reference subroutine calls in the group, there will be entries on + the workspace list; replicate these with an appropriate increment. */ + + else + { + if (repeat_min > 1) + { + /* In the pre-compile phase, we don't actually do the replication. We + just adjust the length as if we had. Do some paranoid checks for + potential integer overflow. */ + + if (lengthptr != NULL) + { + int delta = (repeat_min - 1)*length_prevgroup; + if ((double)(repeat_min - 1)*(double)length_prevgroup > + (double)INT_MAX || + OFLOW_MAX - *lengthptr < delta) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += delta; + } + + /* This is compiling for real */ + + else + { + if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte; + for (i = 1; i < repeat_min; i++) + { + uschar *hc; + uschar *this_hwm = cd->hwm; + memcpy(code, previous, len); + for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE) + { + PUT(cd->hwm, 0, GET(hc, 0) + len); + cd->hwm += LINK_SIZE; + } + save_hwm = this_hwm; + code += len; + } + } + } + + if (repeat_max > 0) repeat_max -= repeat_min; + } + + /* This code is common to both the zero and non-zero minimum cases. If + the maximum is limited, it replicates the group in a nested fashion, + remembering the bracket starts on a stack. In the case of a zero minimum, + the first one was set up above. In all cases the repeat_max now specifies + the number of additional copies needed. Again, we must remember to + replicate entries on the forward reference list. */ + + if (repeat_max >= 0) + { + /* In the pre-compile phase, we don't actually do the replication. We + just adjust the length as if we had. For each repetition we must add 1 + to the length for BRAZERO and for all but the last repetition we must + add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some + paranoid checks to avoid integer overflow. */ + + if (lengthptr != NULL && repeat_max > 0) + { + int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - + 2 - 2*LINK_SIZE; /* Last one doesn't nest */ + if ((double)repeat_max * + (double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) + > (double)INT_MAX || + OFLOW_MAX - *lengthptr < delta) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += delta; + } + + /* This is compiling for real */ + + else for (i = repeat_max - 1; i >= 0; i--) + { + uschar *hc; + uschar *this_hwm = cd->hwm; + + *code++ = OP_BRAZERO + repeat_type; + + /* All but the final copy start a new nesting, maintaining the + chain of brackets outstanding. */ + + if (i != 0) + { + int offset; + *code++ = OP_BRA; + offset = (bralink == NULL)? 0 : code - bralink; + bralink = code; + PUTINC(code, 0, offset); + } + + memcpy(code, previous, len); + for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE) + { + PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1)); + cd->hwm += LINK_SIZE; + } + save_hwm = this_hwm; + code += len; + } + + /* Now chain through the pending brackets, and fill in their length + fields (which are holding the chain links pro tem). */ + + while (bralink != NULL) + { + int oldlinkoffset; + int offset = code - bralink + 1; + uschar *bra = code - offset; + oldlinkoffset = GET(bra, 1); + bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; + *code++ = OP_KET; + PUTINC(code, 0, offset); + PUT(bra, 1, offset); + } + } + + /* If the maximum is unlimited, set a repeater in the final copy. We + can't just offset backwards from the current code point, because we + don't know if there's been an options resetting after the ket. The + correct offset was computed above. + + Then, when we are doing the actual compile phase, check to see whether + this group is a non-atomic one that could match an empty string. If so, + convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so + that runtime checking can be done. [This check is also applied to + atomic groups at runtime, but in a different way.] */ + + else + { + uschar *ketcode = code - ketoffset; + uschar *bracode = ketcode - GET(ketcode, 1); + *ketcode = OP_KETRMAX + repeat_type; + if (lengthptr == NULL && *bracode != OP_ONCE) + { + uschar *scode = bracode; + do + { + if (could_be_empty_branch(scode, ketcode, utf8)) + { + *bracode += OP_SBRA - OP_BRA; + break; + } + scode += GET(scode, 1); + } + while (*scode == OP_ALT); + } + } + } + + /* If previous is OP_FAIL, it was generated by an empty class [] in + JavaScript mode. The other ways in which OP_FAIL can be generated, that is + by (*FAIL) or (?!) set previous to NULL, which gives a "nothing to repeat" + error above. We can just ignore the repeat in JS case. */ + + else if (*previous == OP_FAIL) goto END_REPEAT; + + /* Else there's some kind of shambles */ + + else + { + *errorcodeptr = ERR11; + goto FAILED; + } + + /* If the character following a repeat is '+', or if certain optimization + tests above succeeded, possessive_quantifier is TRUE. For some of the + simpler opcodes, there is an special alternative opcode for this. For + anything else, we wrap the entire repeated item inside OP_ONCE brackets. + The '+' notation is just syntactic sugar, taken from Sun's Java package, + but the special opcodes can optimize it a bit. The repeated item starts at + tempcode, not at previous, which might be the first part of a string whose + (former) last char we repeated. + + Possessifying an 'exact' quantifier has no effect, so we can ignore it. But + an 'upto' may follow. We skip over an 'exact' item, and then test the + length of what remains before proceeding. */ + + if (possessive_quantifier) + { + int len; + if (*tempcode == OP_EXACT || *tempcode == OP_TYPEEXACT || + *tempcode == OP_NOTEXACT) + tempcode += _pcre_OP_lengths[*tempcode] + + ((*tempcode == OP_TYPEEXACT && + (tempcode[3] == OP_PROP || tempcode[3] == OP_NOTPROP))? 2:0); + len = code - tempcode; + if (len > 0) switch (*tempcode) + { + case OP_STAR: *tempcode = OP_POSSTAR; break; + case OP_PLUS: *tempcode = OP_POSPLUS; break; + case OP_QUERY: *tempcode = OP_POSQUERY; break; + case OP_UPTO: *tempcode = OP_POSUPTO; break; + + case OP_TYPESTAR: *tempcode = OP_TYPEPOSSTAR; break; + case OP_TYPEPLUS: *tempcode = OP_TYPEPOSPLUS; break; + case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break; + case OP_TYPEUPTO: *tempcode = OP_TYPEPOSUPTO; break; + + case OP_NOTSTAR: *tempcode = OP_NOTPOSSTAR; break; + case OP_NOTPLUS: *tempcode = OP_NOTPOSPLUS; break; + case OP_NOTQUERY: *tempcode = OP_NOTPOSQUERY; break; + case OP_NOTUPTO: *tempcode = OP_NOTPOSUPTO; break; + + default: + memmove(tempcode + 1+LINK_SIZE, tempcode, len); + code += 1 + LINK_SIZE; + len += 1 + LINK_SIZE; + tempcode[0] = OP_ONCE; + *code++ = OP_KET; + PUTINC(code, 0, len); + PUT(tempcode, 1, len); + break; + } + } + + /* In all case we no longer have a previous item. We also set the + "follows varying string" flag for subsequently encountered reqbytes if + it isn't already set and we have just passed a varying length item. */ + + END_REPEAT: + previous = NULL; + cd->req_varyopt |= reqvary; + break; + + + /* ===================================================================*/ + /* Start of nested parenthesized sub-expression, or comment or lookahead or + lookbehind or option setting or condition or all the other extended + parenthesis forms. */ + + case '(': + newoptions = options; + skipbytes = 0; + bravalue = OP_CBRA; + save_hwm = cd->hwm; + reset_bracount = FALSE; + + /* First deal with various "verbs" that can be introduced by '*'. */ + + if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0) + { + int i, namelen; + const char *vn = verbnames; + const uschar *name = ++ptr; + previous = NULL; + while ((cd->ctypes[*++ptr] & ctype_letter) != 0) {}; + if (*ptr == ':') + { + *errorcodeptr = ERR59; /* Not supported */ + goto FAILED; + } + if (*ptr != ')') + { + *errorcodeptr = ERR60; + goto FAILED; + } + namelen = ptr - name; + for (i = 0; i < verbcount; i++) + { + if (namelen == verbs[i].len && + strncmp((char *)name, vn, namelen) == 0) + { + *code = verbs[i].op; + if (*code++ == OP_ACCEPT) cd->had_accept = TRUE; + break; + } + vn += verbs[i].len + 1; + } + if (i < verbcount) continue; + *errorcodeptr = ERR60; + goto FAILED; + } + + /* Deal with the extended parentheses; all are introduced by '?', and the + appearance of any of them means that this is not a capturing group. */ + + else if (*ptr == '?') + { + int i, set, unset, namelen; + int *optset; + const uschar *name; + uschar *slot; + + switch (*(++ptr)) + { + case '#': /* Comment; skip to ket */ + ptr++; + while (*ptr != 0 && *ptr != ')') ptr++; + if (*ptr == 0) + { + *errorcodeptr = ERR18; + goto FAILED; + } + continue; + + + /* ------------------------------------------------------------ */ + case '|': /* Reset capture count for each branch */ + reset_bracount = TRUE; + /* Fall through */ + + /* ------------------------------------------------------------ */ + case ':': /* Non-capturing bracket */ + bravalue = OP_BRA; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case '(': + bravalue = OP_COND; /* Conditional group */ + + /* A condition can be an assertion, a number (referring to a numbered + group), a name (referring to a named group), or 'R', referring to + recursion. R and R&name are also permitted for recursion tests. + + There are several syntaxes for testing a named group: (?(name)) is used + by Python; Perl 5.10 onwards uses (?() or (?('name')). + + There are two unfortunate ambiguities, caused by history. (a) 'R' can + be the recursive thing or the name 'R' (and similarly for 'R' followed + by digits), and (b) a number could be a name that consists of digits. + In both cases, we look for a name first; if not found, we try the other + cases. */ + + /* For conditions that are assertions, check the syntax, and then exit + the switch. This will take control down to where bracketed groups, + including assertions, are processed. */ + + if (ptr[1] == '?' && (ptr[2] == '=' || ptr[2] == '!' || ptr[2] == '<')) + break; + + /* Most other conditions use OP_CREF (a couple change to OP_RREF + below), and all need to skip 3 bytes at the start of the group. */ + + code[1+LINK_SIZE] = OP_CREF; + skipbytes = 3; + refsign = -1; + + /* Check for a test for recursion in a named group. */ + + if (ptr[1] == 'R' && ptr[2] == '&') + { + terminator = -1; + ptr += 2; + code[1+LINK_SIZE] = OP_RREF; /* Change the type of test */ + } + + /* Check for a test for a named group's having been set, using the Perl + syntax (?() or (?('name') */ + + else if (ptr[1] == '<') + { + terminator = '>'; + ptr++; + } + else if (ptr[1] == '\'') + { + terminator = '\''; + ptr++; + } + else + { + terminator = 0; + if (ptr[1] == '-' || ptr[1] == '+') refsign = *(++ptr); + } + + /* We now expect to read a name; any thing else is an error */ + + if ((cd->ctypes[ptr[1]] & ctype_word) == 0) + { + ptr += 1; /* To get the right offset */ + *errorcodeptr = ERR28; + goto FAILED; + } + + /* Read the name, but also get it as a number if it's all digits */ + + recno = 0; + name = ++ptr; + while ((cd->ctypes[*ptr] & ctype_word) != 0) + { + if (recno >= 0) + recno = (g_ascii_isdigit (*ptr) != 0)? + recno * 10 + *ptr - '0' : -1; + ptr++; + } + namelen = ptr - name; + + if ((terminator > 0 && *ptr++ != terminator) || *ptr++ != ')') + { + ptr--; /* Error offset */ + *errorcodeptr = ERR26; + goto FAILED; + } + + /* Do no further checking in the pre-compile phase. */ + + if (lengthptr != NULL) break; + + /* In the real compile we do the work of looking for the actual + reference. If the string started with "+" or "-" we require the rest to + be digits, in which case recno will be set. */ + + if (refsign > 0) + { + if (recno <= 0) + { + *errorcodeptr = ERR58; + goto FAILED; + } + recno = (refsign == '-')? + cd->bracount - recno + 1 : recno +cd->bracount; + if (recno <= 0 || recno > cd->final_bracount) + { + *errorcodeptr = ERR15; + goto FAILED; + } + PUT2(code, 2+LINK_SIZE, recno); + break; + } + + /* Otherwise (did not start with "+" or "-"), start by looking for the + name. */ + + slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break; + slot += cd->name_entry_size; + } + + /* Found a previous named subpattern */ + + if (i < cd->names_found) + { + recno = GET2(slot, 0); + PUT2(code, 2+LINK_SIZE, recno); + } + + /* Search the pattern for a forward reference */ + + else if ((i = find_parens(ptr, cd, name, namelen, + (options & PCRE_EXTENDED) != 0)) > 0) + { + PUT2(code, 2+LINK_SIZE, i); + } + + /* If terminator == 0 it means that the name followed directly after + the opening parenthesis [e.g. (?(abc)...] and in this case there are + some further alternatives to try. For the cases where terminator != 0 + [things like (?(... or (?('name')... or (?(R&name)... ] we have + now checked all the possibilities, so give an error. */ + + else if (terminator != 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + + /* Check for (?(R) for recursion. Allow digits after R to specify a + specific group number. */ + + else if (*name == 'R') + { + recno = 0; + for (i = 1; i < namelen; i++) + { + if (g_ascii_isdigit (name[i]) == 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + recno = recno * 10 + name[i] - '0'; + } + if (recno == 0) recno = RREF_ANY; + code[1+LINK_SIZE] = OP_RREF; /* Change test type */ + PUT2(code, 2+LINK_SIZE, recno); + } + + /* Similarly, check for the (?(DEFINE) "condition", which is always + false. */ + + else if (namelen == 6 && strncmp((char *)name, "DEFINE", 6) == 0) + { + code[1+LINK_SIZE] = OP_DEF; + skipbytes = 1; + } + + /* Check for the "name" actually being a subpattern number. We are + in the second pass here, so final_bracount is set. */ + + else if (recno > 0 && recno <= cd->final_bracount) + { + PUT2(code, 2+LINK_SIZE, recno); + } + + /* Either an unidentified subpattern, or a reference to (?(0) */ + + else + { + *errorcodeptr = (recno == 0)? ERR35: ERR15; + goto FAILED; + } + break; + + + /* ------------------------------------------------------------ */ + case '=': /* Positive lookahead */ + bravalue = OP_ASSERT; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case '!': /* Negative lookahead */ + ptr++; + if (*ptr == ')') /* Optimize (?!) */ + { + *code++ = OP_FAIL; + previous = NULL; + continue; + } + bravalue = OP_ASSERT_NOT; + break; + + + /* ------------------------------------------------------------ */ + case '<': /* Lookbehind or named define */ + switch (ptr[1]) + { + case '=': /* Positive lookbehind */ + bravalue = OP_ASSERTBACK; + ptr += 2; + break; + + case '!': /* Negative lookbehind */ + bravalue = OP_ASSERTBACK_NOT; + ptr += 2; + break; + + default: /* Could be name define, else bad */ + if ((cd->ctypes[ptr[1]] & ctype_word) != 0) goto DEFINE_NAME; + ptr++; /* Correct offset for error */ + *errorcodeptr = ERR24; + goto FAILED; + } + break; + + + /* ------------------------------------------------------------ */ + case '>': /* One-time brackets */ + bravalue = OP_ONCE; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case 'C': /* Callout - may be followed by digits; */ + previous_callout = code; /* Save for later completion */ + after_manual_callout = 1; /* Skip one item before completing */ + *code++ = OP_CALLOUT; + { + int n = 0; + while (g_ascii_isdigit (*(++ptr)) != 0) + n = n * 10 + *ptr - '0'; + if (*ptr != ')') + { + *errorcodeptr = ERR39; + goto FAILED; + } + if (n > 255) + { + *errorcodeptr = ERR38; + goto FAILED; + } + *code++ = n; + PUT(code, 0, ptr - cd->start_pattern + 1); /* Pattern offset */ + PUT(code, LINK_SIZE, 0); /* Default length */ + code += 2 * LINK_SIZE; + } + previous = NULL; + continue; + + + /* ------------------------------------------------------------ */ + case 'P': /* Python-style named subpattern handling */ + if (*(++ptr) == '=' || *ptr == '>') /* Reference or recursion */ + { + is_recurse = *ptr == '>'; + terminator = ')'; + goto NAMED_REF_OR_RECURSE; + } + else if (*ptr != '<') /* Test for Python-style definition */ + { + *errorcodeptr = ERR41; + goto FAILED; + } + /* Fall through to handle (?P< as (?< is handled */ + + + /* ------------------------------------------------------------ */ + DEFINE_NAME: /* Come here from (?< handling */ + case '\'': + { + terminator = (*ptr == '<')? '>' : '\''; + name = ++ptr; + + while ((cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = ptr - name; + + /* In the pre-compile phase, just do a syntax check. */ + + if (lengthptr != NULL) + { + if (*ptr != terminator) + { + *errorcodeptr = ERR42; + goto FAILED; + } + if (cd->names_found >= MAX_NAME_COUNT) + { + *errorcodeptr = ERR49; + goto FAILED; + } + if (namelen + 3 > cd->name_entry_size) + { + cd->name_entry_size = namelen + 3; + if (namelen > MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } + } + } + + /* In the real compile, create the entry in the table */ + + else + { + slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + int crc = memcmp(name, slot+2, namelen); + if (crc == 0) + { + if (slot[2+namelen] == 0) + { + if ((options & PCRE_DUPNAMES) == 0) + { + *errorcodeptr = ERR43; + goto FAILED; + } + } + else crc = -1; /* Current name is substring */ + } + if (crc < 0) + { + memmove(slot + cd->name_entry_size, slot, + (cd->names_found - i) * cd->name_entry_size); + break; + } + slot += cd->name_entry_size; + } + + PUT2(slot, 0, cd->bracount + 1); + memcpy(slot + 2, name, namelen); + slot[2+namelen] = 0; + } + } + + /* In both cases, count the number of names we've encountered. */ + + ptr++; /* Move past > or ' */ + cd->names_found++; + goto NUMBERED_GROUP; + + + /* ------------------------------------------------------------ */ + case '&': /* Perl recursion/subroutine syntax */ + terminator = ')'; + is_recurse = TRUE; + /* Fall through */ + + /* We come here from the Python syntax above that handles both + references (?P=name) and recursion (?P>name), as well as falling + through from the Perl recursion syntax (?&name). We also come here from + the Perl \k or \k'name' back reference syntax and the \k{name} + .NET syntax, and the Oniguruma \g<...> and \g'...' subroutine syntax. */ + + NAMED_REF_OR_RECURSE: + name = ++ptr; + while ((cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = ptr - name; + + /* In the pre-compile phase, do a syntax check and set a dummy + reference number. */ + + if (lengthptr != NULL) + { + if (namelen == 0) + { + *errorcodeptr = ERR62; + goto FAILED; + } + if (*ptr != terminator) + { + *errorcodeptr = ERR42; + goto FAILED; + } + if (namelen > MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } + recno = 0; + } + + /* In the real compile, seek the name in the table. We check the name + first, and then check that we have reached the end of the name in the + table. That way, if the name that is longer than any in the table, + the comparison will fail without reading beyond the table entry. */ + + else + { + slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (strncmp((char *)name, (char *)slot+2, namelen) == 0 && + slot[2+namelen] == 0) + break; + slot += cd->name_entry_size; + } + + if (i < cd->names_found) /* Back reference */ + { + recno = GET2(slot, 0); + } + else if ((recno = /* Forward back reference */ + find_parens(ptr, cd, name, namelen, + (options & PCRE_EXTENDED) != 0)) <= 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + } + + /* In both phases, we can now go to the code than handles numerical + recursion or backreferences. */ + + if (is_recurse) goto HANDLE_RECURSION; + else goto HANDLE_REFERENCE; + + + /* ------------------------------------------------------------ */ + case 'R': /* Recursion */ + ptr++; /* Same as (?0) */ + /* Fall through */ + + + /* ------------------------------------------------------------ */ + case '-': case '+': + case '0': case '1': case '2': case '3': case '4': /* Recursion or */ + case '5': case '6': case '7': case '8': case '9': /* subroutine */ + { + const uschar *called; + terminator = ')'; + + /* Come here from the \g<...> and \g'...' code (Oniguruma + compatibility). However, the syntax has been checked to ensure that + the ... are a (signed) number, so that neither ERR63 nor ERR29 will + be called on this path, nor with the jump to OTHER_CHAR_AFTER_QUERY + ever be taken. */ + + HANDLE_NUMERICAL_RECURSION: + + if ((refsign = *ptr) == '+') + { + ptr++; + if (g_ascii_isdigit (*ptr) == 0) + { + *errorcodeptr = ERR63; + goto FAILED; + } + } + else if (refsign == '-') + { + if (g_ascii_isdigit (ptr[1]) == 0) + goto OTHER_CHAR_AFTER_QUERY; + ptr++; + } + + recno = 0; + while(g_ascii_isdigit (*ptr) != 0) + recno = recno * 10 + *ptr++ - '0'; + + if (*ptr != terminator) + { + *errorcodeptr = ERR29; + goto FAILED; + } + + if (refsign == '-') + { + if (recno == 0) + { + *errorcodeptr = ERR58; + goto FAILED; + } + recno = cd->bracount - recno + 1; + if (recno <= 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + } + else if (refsign == '+') + { + if (recno == 0) + { + *errorcodeptr = ERR58; + goto FAILED; + } + recno += cd->bracount; + } + + /* Come here from code above that handles a named recursion */ + + HANDLE_RECURSION: + + previous = code; + called = cd->start_code; + + /* When we are actually compiling, find the bracket that is being + referenced. Temporarily end the regex in case it doesn't exist before + this point. If we end up with a forward reference, first check that + the bracket does occur later so we can give the error (and position) + now. Then remember this forward reference in the workspace so it can + be filled in at the end. */ + + if (lengthptr == NULL) + { + *code = OP_END; + if (recno != 0) called = find_bracket(cd->start_code, utf8, recno); + + /* Forward reference */ + + if (called == NULL) + { + if (find_parens(ptr, cd, NULL, recno, + (options & PCRE_EXTENDED) != 0) < 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + called = cd->start_code + recno; + PUTINC(cd->hwm, 0, code + 2 + LINK_SIZE - cd->start_code); + } + + /* If not a forward reference, and the subpattern is still open, + this is a recursive call. We check to see if this is a left + recursion that could loop for ever, and diagnose that case. */ + + else if (GET(called, 1) == 0 && + could_be_empty(called, code, bcptr, utf8)) + { + *errorcodeptr = ERR40; + goto FAILED; + } + } + + /* Insert the recursion/subroutine item, automatically wrapped inside + "once" brackets. Set up a "previous group" length so that a + subsequent quantifier will work. */ + + *code = OP_ONCE; + PUT(code, 1, 2 + 2*LINK_SIZE); + code += 1 + LINK_SIZE; + + *code = OP_RECURSE; + PUT(code, 1, called - cd->start_code); + code += 1 + LINK_SIZE; + + *code = OP_KET; + PUT(code, 1, 2 + 2*LINK_SIZE); + code += 1 + LINK_SIZE; + + length_prevgroup = 3 + 3*LINK_SIZE; + } + + /* Can't determine a first byte now */ + + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + continue; + + + /* ------------------------------------------------------------ */ + default: /* Other characters: check option setting */ + OTHER_CHAR_AFTER_QUERY: + set = unset = 0; + optset = &set; + + while (*ptr != ')' && *ptr != ':') + { + switch (*ptr++) + { + case '-': optset = &unset; break; + + case 'J': /* Record that it changed in the external options */ + *optset |= PCRE_DUPNAMES; + cd->external_flags |= PCRE_JCHANGED; + break; + + case 'i': *optset |= PCRE_CASELESS; break; + case 'm': *optset |= PCRE_MULTILINE; break; + case 's': *optset |= PCRE_DOTALL; break; + case 'x': *optset |= PCRE_EXTENDED; break; + case 'U': *optset |= PCRE_UNGREEDY; break; + case 'X': *optset |= PCRE_EXTRA; break; + + default: *errorcodeptr = ERR12; + ptr--; /* Correct the offset */ + goto FAILED; + } + } + + /* Set up the changed option bits, but don't change anything yet. */ + + newoptions = (options | set) & (~unset); + + /* If the options ended with ')' this is not the start of a nested + group with option changes, so the options change at this level. If this + item is right at the start of the pattern, the options can be + abstracted and made external in the pre-compile phase, and ignored in + the compile phase. This can be helpful when matching -- for instance in + caseless checking of required bytes. + + If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are + definitely *not* at the start of the pattern because something has been + compiled. In the pre-compile phase, however, the code pointer can have + that value after the start, because it gets reset as code is discarded + during the pre-compile. However, this can happen only at top level - if + we are within parentheses, the starting BRA will still be present. At + any parenthesis level, the length value can be used to test if anything + has been compiled at that level. Thus, a test for both these conditions + is necessary to ensure we correctly detect the start of the pattern in + both phases. + + If we are not at the pattern start, compile code to change the ims + options if this setting actually changes any of them, and reset the + greedy defaults and the case value for firstbyte and reqbyte. */ + + if (*ptr == ')') + { + if (code == cd->start_code + 1 + LINK_SIZE && + (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE)) + { + cd->external_options = newoptions; + } + else + { + if ((options & PCRE_IMS) != (newoptions & PCRE_IMS)) + { + *code++ = OP_OPT; + *code++ = newoptions & PCRE_IMS; + } + greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); + greedy_non_default = greedy_default ^ 1; + req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; + } + + /* Change options at this level, and pass them back for use + in subsequent branches. When not at the start of the pattern, this + information is also necessary so that a resetting item can be + compiled at the end of a group (if we are in a group). */ + + *optionsptr = options = newoptions; + previous = NULL; /* This item can't be repeated */ + continue; /* It is complete */ + } + + /* If the options ended with ':' we are heading into a nested group + with possible change of options. Such groups are non-capturing and are + not assertions of any kind. All we need to do is skip over the ':'; + the newoptions value is handled below. */ + + bravalue = OP_BRA; + ptr++; + } /* End of switch for character following (? */ + } /* End of (? handling */ + + /* Opening parenthesis not followed by '?'. If PCRE_NO_AUTO_CAPTURE is set, + all unadorned brackets become non-capturing and behave like (?:...) + brackets. */ + + else if ((options & PCRE_NO_AUTO_CAPTURE) != 0) + { + bravalue = OP_BRA; + } + + /* Else we have a capturing group. */ + + else + { + NUMBERED_GROUP: + cd->bracount += 1; + PUT2(code, 1+LINK_SIZE, cd->bracount); + skipbytes = 2; + } + + /* Process nested bracketed regex. Assertions may not be repeated, but + other kinds can be. All their opcodes are >= OP_ONCE. We copy code into a + non-register variable in order to be able to pass its address because some + compilers complain otherwise. Pass in a new setting for the ims options if + they have changed. */ + + previous = (bravalue >= OP_ONCE)? code : NULL; + *code = bravalue; + tempcode = code; + tempreqvary = cd->req_varyopt; /* Save value before bracket */ + length_prevgroup = 0; /* Initialize for pre-compile phase */ + + if (!compile_regex( + newoptions, /* The complete new option state */ + options & PCRE_IMS, /* The previous ims option state */ + &tempcode, /* Where to put code (updated) */ + &ptr, /* Input pointer (updated) */ + errorcodeptr, /* Where to put an error message */ + (bravalue == OP_ASSERTBACK || + bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ + reset_bracount, /* True if (?| group */ + skipbytes, /* Skip over bracket number */ + &subfirstbyte, /* For possible first char */ + &subreqbyte, /* For possible last char */ + bcptr, /* Current branch chain */ + cd, /* Tables block */ + (lengthptr == NULL)? NULL : /* Actual compile phase */ + &length_prevgroup /* Pre-compile phase */ + )) + goto FAILED; + + /* At the end of compiling, code is still pointing to the start of the + group, while tempcode has been updated to point past the end of the group + and any option resetting that may follow it. The pattern pointer (ptr) + is on the bracket. */ + + /* If this is a conditional bracket, check that there are no more than + two branches in the group, or just one if it's a DEFINE group. We do this + in the real compile phase, not in the pre-pass, where the whole group may + not be available. */ + + if (bravalue == OP_COND && lengthptr == NULL) + { + uschar *tc = code; + int condcount = 0; + + do { + condcount++; + tc += GET(tc,1); + } + while (*tc != OP_KET); + + /* A DEFINE group is never obeyed inline (the "condition" is always + false). It must have only one branch. */ + + if (code[LINK_SIZE+1] == OP_DEF) + { + if (condcount > 1) + { + *errorcodeptr = ERR54; + goto FAILED; + } + bravalue = OP_DEF; /* Just a flag to suppress char handling below */ + } + + /* A "normal" conditional group. If there is just one branch, we must not + make use of its firstbyte or reqbyte, because this is equivalent to an + empty second branch. */ + + else + { + if (condcount > 2) + { + *errorcodeptr = ERR27; + goto FAILED; + } + if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE; + } + } + + /* Error if hit end of pattern */ + + if (*ptr != ')') + { + *errorcodeptr = ERR14; + goto FAILED; + } + + /* In the pre-compile phase, update the length by the length of the group, + less the brackets at either end. Then reduce the compiled code to just a + set of non-capturing brackets so that it doesn't use much memory if it is + duplicated by a quantifier.*/ + + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; + *code++ = OP_BRA; + PUTINC(code, 0, 1 + LINK_SIZE); + *code++ = OP_KET; + PUTINC(code, 0, 1 + LINK_SIZE); + break; /* No need to waste time with special character handling */ + } + + /* Otherwise update the main code pointer to the end of the group. */ + + code = tempcode; + + /* For a DEFINE group, required and first character settings are not + relevant. */ + + if (bravalue == OP_DEF) break; + + /* Handle updating of the required and first characters for other types of + group. Update for normal brackets of all kinds, and conditions with two + branches (see code above). If the bracket is followed by a quantifier with + zero repeat, we have to back off. Hence the definition of zeroreqbyte and + zerofirstbyte outside the main loop so that they can be accessed for the + back off. */ + + zeroreqbyte = reqbyte; + zerofirstbyte = firstbyte; + groupsetfirstbyte = FALSE; + + if (bravalue >= OP_ONCE) + { + /* If we have not yet set a firstbyte in this branch, take it from the + subpattern, remembering that it was set here so that a repeat of more + than one can replicate it as reqbyte if necessary. If the subpattern has + no firstbyte, set "none" for the whole branch. In both cases, a zero + repeat forces firstbyte to "none". */ + + if (firstbyte == REQ_UNSET) + { + if (subfirstbyte >= 0) + { + firstbyte = subfirstbyte; + groupsetfirstbyte = TRUE; + } + else firstbyte = REQ_NONE; + zerofirstbyte = REQ_NONE; + } + + /* If firstbyte was previously set, convert the subpattern's firstbyte + into reqbyte if there wasn't one, using the vary flag that was in + existence beforehand. */ + + else if (subfirstbyte >= 0 && subreqbyte < 0) + subreqbyte = subfirstbyte | tempreqvary; + + /* If the subpattern set a required byte (or set a first byte that isn't + really the first byte - see above), set it. */ + + if (subreqbyte >= 0) reqbyte = subreqbyte; + } + + /* For a forward assertion, we take the reqbyte, if set. This can be + helpful if the pattern that follows the assertion doesn't set a different + char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte + for an assertion, however because it leads to incorrect effect for patterns + such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead + of a firstbyte. This is overcome by a scan at the end if there's no + firstbyte, looking for an asserted first char. */ + + else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte; + break; /* End of processing '(' */ + + + /* ===================================================================*/ + /* Handle metasequences introduced by \. For ones like \d, the ESC_ values + are arranged to be the negation of the corresponding OP_values. For the + back references, the values are ESC_REF plus the reference number. Only + back references and those types that consume a character may be repeated. + We can test for values between ESC_b and ESC_Z for the latter; this may + have to change if any new ones are ever created. */ + + case '\\': + tempptr = ptr; + c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE); + if (*errorcodeptr != 0) goto FAILED; + + if (c < 0) + { + if (-c == ESC_Q) /* Handle start of quoted string */ + { + if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */ + else inescq = TRUE; + continue; + } + + if (-c == ESC_E) continue; /* Perl ignores an orphan \E */ + + /* For metasequences that actually match a character, we disable the + setting of a first character if it hasn't already been set. */ + + if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z) + firstbyte = REQ_NONE; + + /* Set values to reset to if this is followed by a zero repeat. */ + + zerofirstbyte = firstbyte; + zeroreqbyte = reqbyte; + + /* \g or \g'name' is a subroutine call by name and \g or \g'n' + is a subroutine call by number (Oniguruma syntax). In fact, the value + -ESC_g is returned only for these cases. So we don't need to check for < + or ' if the value is -ESC_g. For the Perl syntax \g{n} the value is + -ESC_REF+n, and for the Perl syntax \g{name} the result is -ESC_k (as + that is a synonym for a named back reference). */ + + if (-c == ESC_g) + { + const uschar *p; + save_hwm = cd->hwm; /* Normally this is set when '(' is read */ + terminator = (*(++ptr) == '<')? '>' : '\''; + + /* These two statements stop the compiler for warning about possibly + unset variables caused by the jump to HANDLE_NUMERICAL_RECURSION. In + fact, because we actually check for a number below, the paths that + would actually be in error are never taken. */ + + skipbytes = 0; + reset_bracount = FALSE; + + /* Test for a name */ + + if (ptr[1] != '+' && ptr[1] != '-') + { + BOOL isnumber = TRUE; + for (p = ptr + 1; *p != 0 && *p != terminator; p++) + { + if ((cd->ctypes[*p] & ctype_digit) == 0) isnumber = FALSE; + if ((cd->ctypes[*p] & ctype_word) == 0) break; + } + if (*p != terminator) + { + *errorcodeptr = ERR57; + break; + } + if (isnumber) + { + ptr++; + goto HANDLE_NUMERICAL_RECURSION; + } + is_recurse = TRUE; + goto NAMED_REF_OR_RECURSE; + } + + /* Test a signed number in angle brackets or quotes. */ + + p = ptr + 2; + while (g_ascii_isdigit (*p) != 0) p++; + if (*p != terminator) + { + *errorcodeptr = ERR57; + break; + } + ptr++; + goto HANDLE_NUMERICAL_RECURSION; + } + + /* \k or \k'name' is a back reference by name (Perl syntax). + We also support \k{name} (.NET syntax) */ + + if (-c == ESC_k && (ptr[1] == '<' || ptr[1] == '\'' || ptr[1] == '{')) + { + is_recurse = FALSE; + terminator = (*(++ptr) == '<')? '>' : (*ptr == '\'')? '\'' : '}'; + goto NAMED_REF_OR_RECURSE; + } + + /* Back references are handled specially; must disable firstbyte if + not set to cope with cases like (?=(\w+))\1: which would otherwise set + ':' later. */ + + if (-c >= ESC_REF) + { + recno = -c - ESC_REF; + + HANDLE_REFERENCE: /* Come here from named backref handling */ + if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; + previous = code; + *code++ = OP_REF; + PUT2INC(code, 0, recno); + cd->backref_map |= (recno < 32)? (1 << recno) : 1; + if (recno > cd->top_backref) cd->top_backref = recno; + } + + /* So are Unicode property matches, if supported. */ + +#ifdef SUPPORT_UCP + else if (-c == ESC_P || -c == ESC_p) + { + BOOL negated; + int pdata; + int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr); + if (ptype < 0) goto FAILED; + previous = code; + *code++ = ((-c == ESC_p) != negated)? OP_PROP : OP_NOTPROP; + *code++ = ptype; + *code++ = pdata; + } +#else + + /* If Unicode properties are not supported, \X, \P, and \p are not + allowed. */ + + else if (-c == ESC_X || -c == ESC_P || -c == ESC_p) + { + *errorcodeptr = ERR45; + goto FAILED; + } +#endif + + /* For the rest (including \X when Unicode properties are supported), we + can obtain the OP value by negating the escape value. */ + + else + { + previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; + *code++ = -c; + } + continue; + } + + /* We have a data character whose value is in c. In UTF-8 mode it may have + a value > 127. We set its representation in the length/buffer, and then + handle it as a data character. */ + +#ifdef SUPPORT_UTF8 + if (utf8 && c > 127) + mclength = _pcre_ord2utf8(c, mcbuffer); + else +#endif + + { + mcbuffer[0] = c; + mclength = 1; + } + goto ONE_CHAR; + + + /* ===================================================================*/ + /* Handle a literal character. It is guaranteed not to be whitespace or # + when the extended flag is set. If we are in UTF-8 mode, it may be a + multi-byte literal character. */ + + default: + NORMAL_CHAR: + mclength = 1; + mcbuffer[0] = c; + +#ifdef SUPPORT_UTF8 + if (utf8 && c >= 0xc0) + { + while ((ptr[1] & 0xc0) == 0x80) + mcbuffer[mclength++] = *(++ptr); + } +#endif + + /* At this point we have the character's bytes in mcbuffer, and the length + in mclength. When not in UTF-8 mode, the length is always 1. */ + + ONE_CHAR: + previous = code; + *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARNC : OP_CHAR; + for (c = 0; c < mclength; c++) *code++ = mcbuffer[c]; + + /* Remember if \r or \n were seen */ + + if (mcbuffer[0] == '\r' || mcbuffer[0] == '\n') + cd->external_flags |= PCRE_HASCRORLF; + + /* Set the first and required bytes appropriately. If no previous first + byte, set it from this character, but revert to none on a zero repeat. + Otherwise, leave the firstbyte value alone, and don't change it on a zero + repeat. */ + + if (firstbyte == REQ_UNSET) + { + zerofirstbyte = REQ_NONE; + zeroreqbyte = reqbyte; + + /* If the character is more than one byte long, we can set firstbyte + only if it is not to be matched caselessly. */ + + if (mclength == 1 || req_caseopt == 0) + { + firstbyte = mcbuffer[0] | req_caseopt; + if (mclength != 1) reqbyte = code[-1] | cd->req_varyopt; + } + else firstbyte = reqbyte = REQ_NONE; + } + + /* firstbyte was previously set; we can set reqbyte only the length is + 1 or the matching is caseful. */ + + else + { + zerofirstbyte = firstbyte; + zeroreqbyte = reqbyte; + if (mclength == 1 || req_caseopt == 0) + reqbyte = code[-1] | req_caseopt | cd->req_varyopt; + } + + break; /* End of literal character handling */ + } + } /* end of big loop */ + + +/* Control never reaches here by falling through, only by a goto for all the +error states. Pass back the position in the pattern so that it can be displayed +to the user for diagnosing the error. */ + +FAILED: +*ptrptr = ptr; +return FALSE; +} + + + + +/************************************************* +* Compile sequence of alternatives * +*************************************************/ + +/* On entry, ptr is pointing past the bracket character, but on return it +points to the closing bracket, or vertical bar, or end of string. The code +variable is pointing at the byte into which the BRA operator has been stored. +If the ims options are changed at the start (for a (?ims: group) or during any +branch, we need to insert an OP_OPT item at the start of every following branch +to ensure they get set correctly at run time, and also pass the new options +into every subsequent branch compile. + +This function is used during the pre-compile phase when we are trying to find +out the amount of memory needed, as well as during the real compile phase. The +value of lengthptr distinguishes the two phases. + +Arguments: + options option bits, including any changes for this subpattern + oldims previous settings of ims option bits + codeptr -> the address of the current code pointer + ptrptr -> the address of the current pattern pointer + errorcodeptr -> pointer to error code variable + lookbehind TRUE if this is a lookbehind assertion + reset_bracount TRUE to reset the count for each branch + skipbytes skip this many bytes at start (for brackets and OP_COND) + firstbyteptr place to put the first required character, or a negative number + reqbyteptr place to put the last required character, or a negative number + bcptr pointer to the chain of currently open branches + cd points to the data block with tables pointers etc. + lengthptr NULL during the real compile phase + points to length accumulator during pre-compile phase + +Returns: TRUE on success +*/ + +static BOOL +compile_regex(int options, int oldims, uschar **codeptr, const uschar **ptrptr, + int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes, + int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd, + int *lengthptr) +{ +const uschar *ptr = *ptrptr; +uschar *code = *codeptr; +uschar *last_branch = code; +uschar *start_bracket = code; +uschar *reverse_count = NULL; +int firstbyte, reqbyte; +int branchfirstbyte, branchreqbyte; +int length; +int orig_bracount; +int max_bracount; +branch_chain bc; + +bc.outer = bcptr; +bc.current = code; + +firstbyte = reqbyte = REQ_UNSET; + +/* Accumulate the length for use in the pre-compile phase. Start with the +length of the BRA and KET and any extra bytes that are required at the +beginning. We accumulate in a local variable to save frequent testing of +lenthptr for NULL. We cannot do this by looking at the value of code at the +start and end of each alternative, because compiled items are discarded during +the pre-compile phase so that the work space is not exceeded. */ + +length = 2 + 2*LINK_SIZE + skipbytes; + +/* WARNING: If the above line is changed for any reason, you must also change +the code that abstracts option settings at the start of the pattern and makes +them global. It tests the value of length for (2 + 2*LINK_SIZE) in the +pre-compile phase to find out whether anything has yet been compiled or not. */ + +/* Offset is set zero to mark that this bracket is still open */ + +PUT(code, 1, 0); +code += 1 + LINK_SIZE + skipbytes; + +/* Loop for each alternative branch */ + +orig_bracount = max_bracount = cd->bracount; +for (;;) + { + /* For a (?| group, reset the capturing bracket count so that each branch + uses the same numbers. */ + + if (reset_bracount) cd->bracount = orig_bracount; + + /* Handle a change of ims options at the start of the branch */ + + if ((options & PCRE_IMS) != oldims) + { + *code++ = OP_OPT; + *code++ = options & PCRE_IMS; + length += 2; + } + + /* Set up dummy OP_REVERSE if lookbehind assertion */ + + if (lookbehind) + { + *code++ = OP_REVERSE; + reverse_count = code; + PUTINC(code, 0, 0); + length += 1 + LINK_SIZE; + } + + /* Now compile the branch; in the pre-compile phase its length gets added + into the length. */ + + if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstbyte, + &branchreqbyte, &bc, cd, (lengthptr == NULL)? NULL : &length)) + { + *ptrptr = ptr; + return FALSE; + } + + /* Keep the highest bracket count in case (?| was used and some branch + has fewer than the rest. */ + + if (cd->bracount > max_bracount) max_bracount = cd->bracount; + + /* In the real compile phase, there is some post-processing to be done. */ + + if (lengthptr == NULL) + { + /* If this is the first branch, the firstbyte and reqbyte values for the + branch become the values for the regex. */ + + if (*last_branch != OP_ALT) + { + firstbyte = branchfirstbyte; + reqbyte = branchreqbyte; + } + + /* If this is not the first branch, the first char and reqbyte have to + match the values from all the previous branches, except that if the + previous value for reqbyte didn't have REQ_VARY set, it can still match, + and we set REQ_VARY for the regex. */ + + else + { + /* If we previously had a firstbyte, but it doesn't match the new branch, + we have to abandon the firstbyte for the regex, but if there was + previously no reqbyte, it takes on the value of the old firstbyte. */ + + if (firstbyte >= 0 && firstbyte != branchfirstbyte) + { + if (reqbyte < 0) reqbyte = firstbyte; + firstbyte = REQ_NONE; + } + + /* If we (now or from before) have no firstbyte, a firstbyte from the + branch becomes a reqbyte if there isn't a branch reqbyte. */ + + if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0) + branchreqbyte = branchfirstbyte; + + /* Now ensure that the reqbytes match */ + + if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY)) + reqbyte = REQ_NONE; + else reqbyte |= branchreqbyte; /* To "or" REQ_VARY */ + } + + /* If lookbehind, check that this branch matches a fixed-length string, and + put the length into the OP_REVERSE item. Temporarily mark the end of the + branch with OP_END. */ + + if (lookbehind) + { + int fixed_length; + *code = OP_END; + fixed_length = find_fixedlength(last_branch, options); + DPRINTF(("fixed length = %d\n", fixed_length)); + if (fixed_length < 0) + { + *errorcodeptr = (fixed_length == -2)? ERR36 : ERR25; + *ptrptr = ptr; + return FALSE; + } + PUT(reverse_count, 0, fixed_length); + } + } + + /* Reached end of expression, either ')' or end of pattern. In the real + compile phase, go back through the alternative branches and reverse the chain + of offsets, with the field in the BRA item now becoming an offset to the + first alternative. If there are no alternatives, it points to the end of the + group. The length in the terminating ket is always the length of the whole + bracketed item. If any of the ims options were changed inside the group, + compile a resetting op-code following, except at the very end of the pattern. + Return leaving the pointer at the terminating char. */ + + if (*ptr != '|') + { + if (lengthptr == NULL) + { + int branch_length = code - last_branch; + do + { + int prev_length = GET(last_branch, 1); + PUT(last_branch, 1, branch_length); + branch_length = prev_length; + last_branch -= branch_length; + } + while (branch_length > 0); + } + + /* Fill in the ket */ + + *code = OP_KET; + PUT(code, 1, code - start_bracket); + code += 1 + LINK_SIZE; + + /* Resetting option if needed */ + + if ((options & PCRE_IMS) != oldims && *ptr == ')') + { + *code++ = OP_OPT; + *code++ = oldims; + length += 2; + } + + /* Retain the highest bracket number, in case resetting was used. */ + + cd->bracount = max_bracount; + + /* Set values to pass back */ + + *codeptr = code; + *ptrptr = ptr; + *firstbyteptr = firstbyte; + *reqbyteptr = reqbyte; + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < length) + { + *errorcodeptr = ERR20; + return FALSE; + } + *lengthptr += length; + } + return TRUE; + } + + /* Another branch follows. In the pre-compile phase, we can move the code + pointer back to where it was for the start of the first branch. (That is, + pretend that each branch is the only one.) + + In the real compile phase, insert an ALT node. Its length field points back + to the previous branch while the bracket remains open. At the end the chain + is reversed. It's done like this so that the start of the bracket has a + zero offset until it is closed, making it possible to detect recursion. */ + + if (lengthptr != NULL) + { + code = *codeptr + 1 + LINK_SIZE + skipbytes; + length += 1 + LINK_SIZE; + } + else + { + *code = OP_ALT; + PUT(code, 1, code - last_branch); + bc.current = last_branch = code; + code += 1 + LINK_SIZE; + } + + ptr++; + } +/* Control never reaches here */ +} + + + + +/************************************************* +* Check for anchored expression * +*************************************************/ + +/* Try to find out if this is an anchored regular expression. Consider each +alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket +all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then +it's anchored. However, if this is a multiline pattern, then only OP_SOD +counts, since OP_CIRC can match in the middle. + +We can also consider a regex to be anchored if OP_SOM starts all its branches. +This is the code for \G, which means "match at start of match position, taking +into account the match offset". + +A branch is also implicitly anchored if it starts with .* and DOTALL is set, +because that will try the rest of the pattern at all possible matching points, +so there is no point trying again.... er .... + +.... except when the .* appears inside capturing parentheses, and there is a +subsequent back reference to those parentheses. We haven't enough information +to catch that case precisely. + +At first, the best we could do was to detect when .* was in capturing brackets +and the highest back reference was greater than or equal to that level. +However, by keeping a bitmap of the first 31 back references, we can catch some +of the more common cases more precisely. + +Arguments: + code points to start of expression (the bracket) + options points to the options setting + bracket_map a bitmap of which brackets we are inside while testing; this + handles up to substring 31; after that we just have to take + the less precise approach + backref_map the back reference bitmap + +Returns: TRUE or FALSE +*/ + +static BOOL +is_anchored(register const uschar *code, int *options, unsigned int bracket_map, + unsigned int backref_map) +{ +do { + const uschar *scode = first_significant_code(code + _pcre_OP_lengths[*code], + options, PCRE_MULTILINE, FALSE); + register int op = *scode; + + /* Non-capturing brackets */ + + if (op == OP_BRA) + { + if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE; + } + + /* Capturing brackets */ + + else if (op == OP_CBRA) + { + int n = GET2(scode, 1+LINK_SIZE); + int new_map = bracket_map | ((n < 32)? (1 << n) : 1); + if (!is_anchored(scode, options, new_map, backref_map)) return FALSE; + } + + /* Other brackets */ + + else if (op == OP_ASSERT || op == OP_ONCE || op == OP_COND) + { + if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE; + } + + /* .* is not anchored unless DOTALL is set (which generates OP_ALLANY) and + it isn't in brackets that are or may be referenced. */ + + else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR || + op == OP_TYPEPOSSTAR)) + { + if (scode[1] != OP_ALLANY || (bracket_map & backref_map) != 0) + return FALSE; + } + + /* Check for explicit anchoring */ + + else if (op != OP_SOD && op != OP_SOM && + ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) + return FALSE; + code += GET(code, 1); + } +while (*code == OP_ALT); /* Loop for each alternative */ +return TRUE; +} + + + +/************************************************* +* Check for starting with ^ or .* * +*************************************************/ + +/* This is called to find out if every branch starts with ^ or .* so that +"first char" processing can be done to speed things up in multiline +matching and for non-DOTALL patterns that start with .* (which must start at +the beginning or after \n). As in the case of is_anchored() (see above), we +have to take account of back references to capturing brackets that contain .* +because in that case we can't make the assumption. + +Arguments: + code points to start of expression (the bracket) + bracket_map a bitmap of which brackets we are inside while testing; this + handles up to substring 31; after that we just have to take + the less precise approach + backref_map the back reference bitmap + +Returns: TRUE or FALSE +*/ + +static BOOL +is_startline(const uschar *code, unsigned int bracket_map, + unsigned int backref_map) +{ +do { + const uschar *scode = first_significant_code(code + _pcre_OP_lengths[*code], + NULL, 0, FALSE); + register int op = *scode; + + /* Non-capturing brackets */ + + if (op == OP_BRA) + { + if (!is_startline(scode, bracket_map, backref_map)) return FALSE; + } + + /* Capturing brackets */ + + else if (op == OP_CBRA) + { + int n = GET2(scode, 1+LINK_SIZE); + int new_map = bracket_map | ((n < 32)? (1 << n) : 1); + if (!is_startline(scode, new_map, backref_map)) return FALSE; + } + + /* Other brackets */ + + else if (op == OP_ASSERT || op == OP_ONCE || op == OP_COND) + { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; } + + /* .* means "start at start or after \n" if it isn't in brackets that + may be referenced. */ + + else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR) + { + if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; + } + + /* Check for explicit circumflex */ + + else if (op != OP_CIRC) return FALSE; + + /* Move on to the next alternative */ + + code += GET(code, 1); + } +while (*code == OP_ALT); /* Loop for each alternative */ +return TRUE; +} + + + +/************************************************* +* Check for asserted fixed first char * +*************************************************/ + +/* During compilation, the "first char" settings from forward assertions are +discarded, because they can cause conflicts with actual literals that follow. +However, if we end up without a first char setting for an unanchored pattern, +it is worth scanning the regex to see if there is an initial asserted first +char. If all branches start with the same asserted char, or with a bracket all +of whose alternatives start with the same asserted char (recurse ad lib), then +we return that char, otherwise -1. + +Arguments: + code points to start of expression (the bracket) + options pointer to the options (used to check casing changes) + inassert TRUE if in an assertion + +Returns: -1 or the fixed first char +*/ + +static int +find_firstassertedchar(const uschar *code, int *options, BOOL inassert) +{ +register int c = -1; +do { + int d; + const uschar *scode = + first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS, TRUE); + register int op = *scode; + + switch(op) + { + default: + return -1; + + case OP_BRA: + case OP_CBRA: + case OP_ASSERT: + case OP_ONCE: + case OP_COND: + if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0) + return -1; + if (c < 0) c = d; else if (c != d) return -1; + break; + + case OP_EXACT: /* Fall through */ + scode += 2; + + case OP_CHAR: + case OP_CHARNC: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + if (!inassert) return -1; + if (c < 0) + { + c = scode[1]; + if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS; + } + else if (c != scode[1]) return -1; + break; + } + + code += GET(code, 1); + } +while (*code == OP_ALT); +return c; +} + + + +/************************************************* +* Compile a Regular Expression * +*************************************************/ + +/* This function takes a string and returns a pointer to a block of store +holding a compiled version of the expression. The original API for this +function had no error code return variable; it is retained for backwards +compatibility. The new function is given a new name. + +Arguments: + pattern the regular expression + options various option bits + errorcodeptr pointer to error code variable (pcre_compile2() only) + can be NULL if you don't want a code value + errorptr pointer to pointer to error text + erroroffset ptr offset in pattern where error was detected + tables pointer to character tables or NULL + +Returns: pointer to compiled data block, or NULL on error, + with errorptr and erroroffset set +*/ + +PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION +pcre_compile(const char *pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +{ +return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables); +} + + +PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION +pcre_compile2(const char *pattern, int options, int *errorcodeptr, + const char **errorptr, int *erroroffset, const unsigned char *tables) +{ +real_pcre *re; +int length = 1; /* For final END opcode */ +int firstbyte, reqbyte, newline; +int errorcode = 0; +int skipatstart = 0; +#ifdef SUPPORT_UTF8 +BOOL utf8; +#endif +size_t size; +uschar *code; +const uschar *codestart; +const uschar *ptr; +compile_data compile_block; +compile_data *cd = &compile_block; + +/* This space is used for "compiling" into during the first phase, when we are +computing the amount of memory that is needed. Compiled items are thrown away +as soon as possible, so that a fairly large buffer should be sufficient for +this purpose. The same space is used in the second phase for remembering where +to fill in forward references to subpatterns. */ + +uschar cworkspace[COMPILE_WORK_SIZE]; + +/* Set this early so that early errors get offset 0. */ + +ptr = (const uschar *)pattern; + +/* We can't pass back an error message if errorptr is NULL; I guess the best we +can do is just return NULL, but we can set a code value if there is a code +pointer. */ + +if (errorptr == NULL) + { + if (errorcodeptr != NULL) *errorcodeptr = 99; + return NULL; + } + +*errorptr = NULL; +if (errorcodeptr != NULL) *errorcodeptr = ERR0; + +/* However, we can give a message for this error */ + +if (erroroffset == NULL) + { + errorcode = ERR16; + goto PCRE_EARLY_ERROR_RETURN2; + } + +*erroroffset = 0; + +/* Can't support UTF8 unless PCRE has been compiled to include the code. */ + +#ifdef SUPPORT_UTF8 +utf8 = (options & PCRE_UTF8) != 0; +if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 && + (*erroroffset = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0) + { + errorcode = ERR44; + goto PCRE_EARLY_ERROR_RETURN2; + } +#else +if ((options & PCRE_UTF8) != 0) + { + errorcode = ERR32; + goto PCRE_EARLY_ERROR_RETURN; + } +#endif + +if ((options & ~PUBLIC_OPTIONS) != 0) + { + errorcode = ERR17; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Set up pointers to the individual character tables */ + +if (tables == NULL) tables = _pcre_default_tables; +cd->lcc = tables + lcc_offset; +cd->fcc = tables + fcc_offset; +cd->cbits = tables + cbits_offset; +cd->ctypes = tables + ctypes_offset; + +/* Check for global one-time settings at the start of the pattern, and remember +the offset for later. */ + +while (ptr[skipatstart] == '(' && ptr[skipatstart+1] == '*') + { + int newnl = 0; + int newbsr = 0; + + if (strncmp((char *)(ptr+skipatstart+2), "CR)", 3) == 0) + { skipatstart += 5; newnl = PCRE_NEWLINE_CR; } + else if (strncmp((char *)(ptr+skipatstart+2), "LF)", 3) == 0) + { skipatstart += 5; newnl = PCRE_NEWLINE_LF; } + else if (strncmp((char *)(ptr+skipatstart+2), "CRLF)", 5) == 0) + { skipatstart += 7; newnl = PCRE_NEWLINE_CR + PCRE_NEWLINE_LF; } + else if (strncmp((char *)(ptr+skipatstart+2), "ANY)", 4) == 0) + { skipatstart += 6; newnl = PCRE_NEWLINE_ANY; } + else if (strncmp((char *)(ptr+skipatstart+2), "ANYCRLF)", 8) == 0) + { skipatstart += 10; newnl = PCRE_NEWLINE_ANYCRLF; } + + else if (strncmp((char *)(ptr+skipatstart+2), "BSR_ANYCRLF)", 12) == 0) + { skipatstart += 14; newbsr = PCRE_BSR_ANYCRLF; } + else if (strncmp((char *)(ptr+skipatstart+2), "BSR_UNICODE)", 12) == 0) + { skipatstart += 14; newbsr = PCRE_BSR_UNICODE; } + + if (newnl != 0) + options = (options & ~PCRE_NEWLINE_BITS) | newnl; + else if (newbsr != 0) + options = (options & ~(PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) | newbsr; + else break; + } + +/* Check validity of \R options. */ + +switch (options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) + { + case 0: + case PCRE_BSR_ANYCRLF: + case PCRE_BSR_UNICODE: + break; + default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN; + } + +/* Handle different types of newline. The three bits give seven cases. The +current code allows for fixed one- or two-byte sequences, plus "any" and +"anycrlf". */ + +switch (options & PCRE_NEWLINE_BITS) + { + case 0: newline = NEWLINE; break; /* Build-time default */ + case PCRE_NEWLINE_CR: newline = '\r'; break; + case PCRE_NEWLINE_LF: newline = '\n'; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break; + case PCRE_NEWLINE_ANY: newline = -1; break; + case PCRE_NEWLINE_ANYCRLF: newline = -2; break; + default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN; + } + +if (newline == -2) + { + cd->nltype = NLTYPE_ANYCRLF; + } +else if (newline < 0) + { + cd->nltype = NLTYPE_ANY; + } +else + { + cd->nltype = NLTYPE_FIXED; + if (newline > 255) + { + cd->nllen = 2; + cd->nl[0] = (newline >> 8) & 255; + cd->nl[1] = newline & 255; + } + else + { + cd->nllen = 1; + cd->nl[0] = newline; + } + } + +/* Maximum back reference and backref bitmap. The bitmap records up to 31 back +references to help in deciding whether (.*) can be treated as anchored or not. +*/ + +cd->top_backref = 0; +cd->backref_map = 0; + +/* Reflect pattern for debugging output */ + +DPRINTF(("------------------------------------------------------------------\n")); +DPRINTF(("%s\n", pattern)); + +/* Pretend to compile the pattern while actually just accumulating the length +of memory required. This behaviour is triggered by passing a non-NULL final +argument to compile_regex(). We pass a block of workspace (cworkspace) for it +to compile parts of the pattern into; the compiled code is discarded when it is +no longer needed, so hopefully this workspace will never overflow, though there +is a test for its doing so. */ + +cd->bracount = cd->final_bracount = 0; +cd->names_found = 0; +cd->name_entry_size = 0; +cd->name_table = NULL; +cd->start_workspace = cworkspace; +cd->start_code = cworkspace; +cd->hwm = cworkspace; +cd->start_pattern = (const uschar *)pattern; +cd->end_pattern = (const uschar *)(pattern + strlen(pattern)); +cd->req_varyopt = 0; +cd->external_options = options; +cd->external_flags = 0; + +/* Now do the pre-compile. On error, errorcode will be set non-zero, so we +don't need to look at the result of the function here. The initial options have +been put into the cd block so that they can be changed if an option setting is +found within the regex right at the beginning. Bringing initial option settings +outside can help speed up starting point checks. */ + +ptr += skipatstart; +code = cworkspace; +*code = OP_BRA; +(void)compile_regex(cd->external_options, cd->external_options & PCRE_IMS, + &code, &ptr, &errorcode, FALSE, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, + &length); +if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN; + +DPRINTF(("end pre-compile: length=%d workspace=%d\n", length, + cd->hwm - cworkspace)); + +if (length > MAX_PATTERN_SIZE) + { + errorcode = ERR20; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Compute the size of data block needed and get it, either from malloc or +externally provided function. Integer overflow should no longer be possible +because nowadays we limit the maximum value of cd->names_found and +cd->name_entry_size. */ + +size = length + sizeof(real_pcre) + cd->names_found * (cd->name_entry_size + 3); +re = (real_pcre *)(pcre_malloc)(size); + +if (re == NULL) + { + errorcode = ERR21; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Put in the magic number, and save the sizes, initial options, internal +flags, and character table pointer. NULL is used for the default character +tables. The nullpad field is at the end; it's there to help in the case when a +regex compiled on a system with 4-byte pointers is run on another with 8-byte +pointers. */ + +re->magic_number = MAGIC_NUMBER; +re->size = size; +re->options = cd->external_options; +re->flags = cd->external_flags; +re->dummy1 = 0; +re->first_byte = 0; +re->req_byte = 0; +re->name_table_offset = sizeof(real_pcre); +re->name_entry_size = cd->name_entry_size; +re->name_count = cd->names_found; +re->ref_count = 0; +re->tables = (tables == _pcre_default_tables)? NULL : tables; +re->nullpad = NULL; + +/* The starting points of the name/number translation table and of the code are +passed around in the compile data block. The start/end pattern and initial +options are already set from the pre-compile phase, as is the name_entry_size +field. Reset the bracket count and the names_found field. Also reset the hwm +field; this time it's used for remembering forward references to subpatterns. +*/ + +cd->final_bracount = cd->bracount; /* Save for checking forward references */ +cd->bracount = 0; +cd->names_found = 0; +cd->name_table = (uschar *)re + re->name_table_offset; +codestart = cd->name_table + re->name_entry_size * re->name_count; +cd->start_code = codestart; +cd->hwm = cworkspace; +cd->req_varyopt = 0; +cd->had_accept = FALSE; + +/* Set up a starting, non-extracting bracket, then compile the expression. On +error, errorcode will be set non-zero, so we don't need to look at the result +of the function here. */ + +ptr = (const uschar *)pattern + skipatstart; +code = (uschar *)codestart; +*code = OP_BRA; +(void)compile_regex(re->options, re->options & PCRE_IMS, &code, &ptr, + &errorcode, FALSE, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, NULL); +re->top_bracket = cd->bracount; +re->top_backref = cd->top_backref; +re->flags = cd->external_flags; + +if (cd->had_accept) reqbyte = -1; /* Must disable after (*ACCEPT) */ + +/* If not reached end of pattern on success, there's an excess bracket. */ + +if (errorcode == 0 && *ptr != 0) errorcode = ERR22; + +/* Fill in the terminating state and check for disastrous overflow, but +if debugging, leave the test till after things are printed out. */ + +*code++ = OP_END; + +#ifndef DEBUG +if (code - codestart > length) errorcode = ERR23; +#endif + +/* Fill in any forward references that are required. */ + +while (errorcode == 0 && cd->hwm > cworkspace) + { + int offset, recno; + const uschar *groupptr; + cd->hwm -= LINK_SIZE; + offset = GET(cd->hwm, 0); + recno = GET(codestart, offset); + groupptr = find_bracket(codestart, (re->options & PCRE_UTF8) != 0, recno); + if (groupptr == NULL) errorcode = ERR53; + else PUT(((uschar *)codestart), offset, groupptr - codestart); + } + +/* Give an error if there's back reference to a non-existent capturing +subpattern. */ + +if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; + +/* Failed to compile, or error while post-processing */ + +if (errorcode != 0) + { + (pcre_free)(re); + PCRE_EARLY_ERROR_RETURN: + *erroroffset = ptr - (const uschar *)pattern; + PCRE_EARLY_ERROR_RETURN2: + *errorptr = find_error_text(errorcode); + if (errorcodeptr != NULL) *errorcodeptr = errorcode; + return NULL; + } + +/* If the anchored option was not passed, set the flag if we can determine that +the pattern is anchored by virtue of ^ characters or \A or anything else (such +as starting with .* when DOTALL is set). + +Otherwise, if we know what the first byte has to be, save it, because that +speeds up unanchored matches no end. If not, see if we can set the +PCRE_STARTLINE flag. This is helpful for multiline matches when all branches +start with ^. and also when all branches start with .* for non-DOTALL matches. +*/ + +if ((re->options & PCRE_ANCHORED) == 0) + { + int temp_options = re->options; /* May get changed during these scans */ + if (is_anchored(codestart, &temp_options, 0, cd->backref_map)) + re->options |= PCRE_ANCHORED; + else + { + if (firstbyte < 0) + firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE); + if (firstbyte >= 0) /* Remove caseless flag for non-caseable chars */ + { + int ch = firstbyte & 255; + re->first_byte = ((firstbyte & REQ_CASELESS) != 0 && + cd->fcc[ch] == ch)? ch : firstbyte; + re->flags |= PCRE_FIRSTSET; + } + else if (is_startline(codestart, 0, cd->backref_map)) + re->flags |= PCRE_STARTLINE; + } + } + +/* For an anchored pattern, we use the "required byte" only if it follows a +variable length item in the regex. Remove the caseless flag for non-caseable +bytes. */ + +if (reqbyte >= 0 && + ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0)) + { + int ch = reqbyte & 255; + re->req_byte = ((reqbyte & REQ_CASELESS) != 0 && + cd->fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte; + re->flags |= PCRE_REQCHSET; + } + +/* Print out the compiled data if debugging is enabled. This is never the +case when building a production library. */ + +#ifdef DEBUG + +printf("Length = %d top_bracket = %d top_backref = %d\n", + length, re->top_bracket, re->top_backref); + +printf("Options=%08x\n", re->options); + +if ((re->flags & PCRE_FIRSTSET) != 0) + { + int ch = re->first_byte & 255; + const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? + "" : " (caseless)"; + if (isprint(ch)) printf("First char = %c%s\n", ch, caseless); + else printf("First char = \\x%02x%s\n", ch, caseless); + } + +if ((re->flags & PCRE_REQCHSET) != 0) + { + int ch = re->req_byte & 255; + const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? + "" : " (caseless)"; + if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless); + else printf("Req char = \\x%02x%s\n", ch, caseless); + } + +pcre_printint(re, stdout, TRUE); + +/* This check is done here in the debugging case so that the code that +was compiled can be seen. */ + +if (code - codestart > length) + { + (pcre_free)(re); + *errorptr = find_error_text(ERR23); + *erroroffset = ptr - (uschar *)pattern; + if (errorcodeptr != NULL) *errorcodeptr = ERR23; + return NULL; + } +#endif /* DEBUG */ + +return (pcre *)re; +} + +/* End of pcre_compile.c */ diff --git a/glib/pcre/pcre_config.c b/glib/pcre/pcre_config.c new file mode 100644 index 0000000..114f0fb --- /dev/null +++ b/glib/pcre/pcre_config.c @@ -0,0 +1,128 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_config(). */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Return info about what features are configured * +*************************************************/ + +/* This function has an extensible interface so that additional items can be +added compatibly. + +Arguments: + what what information is required + where where to put the information + +Returns: 0 if data returned, negative on error +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_config(int what, void *where) +{ +switch (what) + { + case PCRE_CONFIG_UTF8: +#ifdef SUPPORT_UTF8 + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_UNICODE_PROPERTIES: +#ifdef SUPPORT_UCP + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_NEWLINE: + *((int *)where) = NEWLINE; + break; + + case PCRE_CONFIG_BSR: +#ifdef BSR_ANYCRLF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_LINK_SIZE: + *((int *)where) = LINK_SIZE; + break; + + case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD: + *((int *)where) = POSIX_MALLOC_THRESHOLD; + break; + + case PCRE_CONFIG_MATCH_LIMIT: + *((unsigned int *)where) = MATCH_LIMIT; + break; + + case PCRE_CONFIG_MATCH_LIMIT_RECURSION: + *((unsigned int *)where) = MATCH_LIMIT_RECURSION; + break; + + case PCRE_CONFIG_STACKRECURSE: +#ifdef NO_RECURSE + *((int *)where) = 0; +#else + *((int *)where) = 1; +#endif + break; + + default: return PCRE_ERROR_BADOPTION; + } + +return 0; +} + +/* End of pcre_config.c */ diff --git a/glib/pcre/pcre_dfa_exec.c b/glib/pcre/pcre_dfa_exec.c new file mode 100644 index 0000000..9a73a52 --- /dev/null +++ b/glib/pcre/pcre_dfa_exec.c @@ -0,0 +1,2920 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_dfa_exec(), which is an +alternative matching function that uses a sort of DFA algorithm (not a true +FSM). This is NOT Perl- compatible, but it has advantages in certain +applications. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NLBLOCK md /* Block containing newline information */ +#define PSSTART start_subject /* Field containing processed string start */ +#define PSEND end_subject /* Field containing processed string end */ + +#include "pcre_internal.h" + + +/* For use to indent debugging output */ + +#define SP " " + + + +/************************************************* +* Code parameters and static tables * +*************************************************/ + +/* These are offsets that are used to turn the OP_TYPESTAR and friends opcodes +into others, under special conditions. A gap of 20 between the blocks should be +enough. The resulting opcodes don't have to be less than 256 because they are +never stored, so we push them well clear of the normal opcodes. */ + +#define OP_PROP_EXTRA 300 +#define OP_EXTUNI_EXTRA 320 +#define OP_ANYNL_EXTRA 340 +#define OP_HSPACE_EXTRA 360 +#define OP_VSPACE_EXTRA 380 + + +/* This table identifies those opcodes that are followed immediately by a +character that is to be tested in some way. This makes is possible to +centralize the loading of these characters. In the case of Type * etc, the +"character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a +small value. ***NOTE*** If the start of this table is modified, the two tables +that follow must also be modified. */ + +static const uschar coptable[] = { + 0, /* End */ + 0, 0, 0, 0, 0, /* \A, \G, \K, \B, \b */ + 0, 0, 0, 0, 0, 0, /* \D, \d, \S, \s, \W, \w */ + 0, 0, 0, /* Any, AllAny, Anybyte */ + 0, 0, 0, /* NOTPROP, PROP, EXTUNI */ + 0, 0, 0, 0, 0, /* \R, \H, \h, \V, \v */ + 0, 0, 0, 0, 0, /* \Z, \z, Opt, ^, $ */ + 1, /* Char */ + 1, /* Charnc */ + 1, /* not */ + /* Positive single-char repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 3, 3, 3, /* upto, minupto, exact */ + 1, 1, 1, 3, /* *+, ++, ?+, upto+ */ + /* Negative single-char repeats - only for chars < 256 */ + 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */ + 3, 3, 3, /* NOT upto, minupto, exact */ + 1, 1, 1, 3, /* NOT *+, ++, ?+, updo+ */ + /* Positive type repeats */ + 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */ + 3, 3, 3, /* Type upto, minupto, exact */ + 1, 1, 1, 3, /* Type *+, ++, ?+, upto+ */ + /* Character class & ref repeats */ + 0, 0, 0, 0, 0, 0, /* *, *?, +, +?, ?, ?? */ + 0, 0, /* CRRANGE, CRMINRANGE */ + 0, /* CLASS */ + 0, /* NCLASS */ + 0, /* XCLASS - variable length */ + 0, /* REF */ + 0, /* RECURSE */ + 0, /* CALLOUT */ + 0, /* Alt */ + 0, /* Ket */ + 0, /* KetRmax */ + 0, /* KetRmin */ + 0, /* Assert */ + 0, /* Assert not */ + 0, /* Assert behind */ + 0, /* Assert behind not */ + 0, /* Reverse */ + 0, 0, 0, 0, /* ONCE, BRA, CBRA, COND */ + 0, 0, 0, /* SBRA, SCBRA, SCOND */ + 0, /* CREF */ + 0, /* RREF */ + 0, /* DEF */ + 0, 0, /* BRAZERO, BRAMINZERO */ + 0, 0, 0, 0, /* PRUNE, SKIP, THEN, COMMIT */ + 0, 0, 0 /* FAIL, ACCEPT, SKIPZERO */ +}; + +/* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W, +and \w */ + +static const uschar toptable1[] = { + 0, 0, 0, 0, 0, 0, + ctype_digit, ctype_digit, + ctype_space, ctype_space, + ctype_word, ctype_word, + 0, 0 /* OP_ANY, OP_ALLANY */ +}; + +static const uschar toptable2[] = { + 0, 0, 0, 0, 0, 0, + ctype_digit, 0, + ctype_space, 0, + ctype_word, 0, + 1, 1 /* OP_ANY, OP_ALLANY */ +}; + + +/* Structure for holding data about a particular state, which is in effect the +current data for an active path through the match tree. It must consist +entirely of ints because the working vector we are passed, and which we put +these structures in, is a vector of ints. */ + +typedef struct stateblock { + int offset; /* Offset to opcode */ + int count; /* Count for repeats */ + int ims; /* ims flag bits */ + int data; /* Some use extra data */ +} stateblock; + +#define INTS_PER_STATEBLOCK (sizeof(stateblock)/sizeof(int)) + + +#ifdef DEBUG +/************************************************* +* Print character string * +*************************************************/ + +/* Character string printing function for debugging. + +Arguments: + p points to string + length number of bytes + f where to print + +Returns: nothing +*/ + +static void +pchars(unsigned char *p, int length, FILE *f) +{ +int c; +while (length-- > 0) + { + if (isprint(c = *(p++))) + fprintf(f, "%c", c); + else + fprintf(f, "\\x%02x", c); + } +} +#endif + + + +/************************************************* +* Execute a Regular Expression - DFA engine * +*************************************************/ + +/* This internal function applies a compiled pattern to a subject string, +starting at a given point, using a DFA engine. This function is called from the +external one, possibly multiple times if the pattern is not anchored. The +function calls itself recursively for some kinds of subpattern. + +Arguments: + md the match_data block with fixed information + this_start_code the opening bracket of this subexpression's code + current_subject where we currently are in the subject string + start_offset start offset in the subject string + offsets vector to contain the matching string offsets + offsetcount size of same + workspace vector of workspace + wscount size of same + ims the current ims flags + rlevel function call recursion level + recursing regex recursive call level + +Returns: > 0 => number of match offset pairs placed in offsets + = 0 => offsets overflowed; longest matches are present + -1 => failed to match + < -1 => some kind of unexpected problem + +The following macros are used for adding states to the two state vectors (one +for the current character, one for the following character). */ + +#define ADD_ACTIVE(x,y) \ + if (active_count++ < wscount) \ + { \ + next_active_state->offset = (x); \ + next_active_state->count = (y); \ + next_active_state->ims = ims; \ + next_active_state++; \ + DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +#define ADD_ACTIVE_DATA(x,y,z) \ + if (active_count++ < wscount) \ + { \ + next_active_state->offset = (x); \ + next_active_state->count = (y); \ + next_active_state->ims = ims; \ + next_active_state->data = (z); \ + next_active_state++; \ + DPRINTF(("%.*sADD_ACTIVE_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +#define ADD_NEW(x,y) \ + if (new_count++ < wscount) \ + { \ + next_new_state->offset = (x); \ + next_new_state->count = (y); \ + next_new_state->ims = ims; \ + next_new_state++; \ + DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +#define ADD_NEW_DATA(x,y,z) \ + if (new_count++ < wscount) \ + { \ + next_new_state->offset = (x); \ + next_new_state->count = (y); \ + next_new_state->ims = ims; \ + next_new_state->data = (z); \ + next_new_state++; \ + DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +/* And now, here is the code */ + +static int +internal_dfa_exec( + dfa_match_data *md, + const uschar *this_start_code, + const uschar *current_subject, + int start_offset, + int *offsets, + int offsetcount, + int *workspace, + int wscount, + int ims, + int rlevel, + int recursing) +{ +stateblock *active_states, *new_states, *temp_states; +stateblock *next_active_state, *next_new_state; + +const uschar *ctypes, *lcc, *fcc; +const uschar *ptr; +const uschar *end_code, *first_op; + +int active_count, new_count, match_count; + +/* Some fields in the md block are frequently referenced, so we load them into +independent variables in the hope that this will perform better. */ + +const uschar *start_subject = md->start_subject; +const uschar *end_subject = md->end_subject; +const uschar *start_code = md->start_code; + +#ifdef SUPPORT_UTF8 +BOOL utf8 = (md->poptions & PCRE_UTF8) != 0; +#else +BOOL utf8 = FALSE; +#endif + +rlevel++; +offsetcount &= (-2); + +wscount -= 2; +wscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) / + (2 * INTS_PER_STATEBLOCK); + +DPRINTF(("\n%.*s---------------------\n" + "%.*sCall to internal_dfa_exec f=%d r=%d\n", + rlevel*2-2, SP, rlevel*2-2, SP, rlevel, recursing)); + +ctypes = md->tables + ctypes_offset; +lcc = md->tables + lcc_offset; +fcc = md->tables + fcc_offset; + +match_count = PCRE_ERROR_NOMATCH; /* A negative number */ + +active_states = (stateblock *)(workspace + 2); +next_new_state = new_states = active_states + wscount; +new_count = 0; + +first_op = this_start_code + 1 + LINK_SIZE + + ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0); + +/* The first thing in any (sub) pattern is a bracket of some sort. Push all +the alternative states onto the list, and find out where the end is. This +makes is possible to use this function recursively, when we want to stop at a +matching internal ket rather than at the end. + +If the first opcode in the first alternative is OP_REVERSE, we are dealing with +a backward assertion. In that case, we have to find out the maximum amount to +move back, and set up each alternative appropriately. */ + +if (*first_op == OP_REVERSE) + { + int max_back = 0; + int gone_back; + + end_code = this_start_code; + do + { + int back = GET(end_code, 2+LINK_SIZE); + if (back > max_back) max_back = back; + end_code += GET(end_code, 1); + } + while (*end_code == OP_ALT); + + /* If we can't go back the amount required for the longest lookbehind + pattern, go back as far as we can; some alternatives may still be viable. */ + +#ifdef SUPPORT_UTF8 + /* In character mode we have to step back character by character */ + + if (utf8) + { + for (gone_back = 0; gone_back < max_back; gone_back++) + { + if (current_subject <= start_subject) break; + current_subject--; + while (current_subject > start_subject && + (*current_subject & 0xc0) == 0x80) + current_subject--; + } + } + else +#endif + + /* In byte-mode we can do this quickly. */ + + { + gone_back = (current_subject - max_back < start_subject)? + current_subject - start_subject : max_back; + current_subject -= gone_back; + } + + /* Now we can process the individual branches. */ + + end_code = this_start_code; + do + { + int back = GET(end_code, 2+LINK_SIZE); + if (back <= gone_back) + { + int bstate = end_code - start_code + 2 + 2*LINK_SIZE; + ADD_NEW_DATA(-bstate, 0, gone_back - back); + } + end_code += GET(end_code, 1); + } + while (*end_code == OP_ALT); + } + +/* This is the code for a "normal" subpattern (not a backward assertion). The +start of a whole pattern is always one of these. If we are at the top level, +we may be asked to restart matching from the same point that we reached for a +previous partial match. We still have to scan through the top-level branches to +find the end state. */ + +else + { + end_code = this_start_code; + + /* Restarting */ + + if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0) + { + do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT); + new_count = workspace[1]; + if (!workspace[0]) + memcpy(new_states, active_states, new_count * sizeof(stateblock)); + } + + /* Not restarting */ + + else + { + int length = 1 + LINK_SIZE + + ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0); + do + { + ADD_NEW(end_code - start_code + length, 0); + end_code += GET(end_code, 1); + length = 1 + LINK_SIZE; + } + while (*end_code == OP_ALT); + } + } + +workspace[0] = 0; /* Bit indicating which vector is current */ + +DPRINTF(("%.*sEnd state = %d\n", rlevel*2-2, SP, end_code - start_code)); + +/* Loop for scanning the subject */ + +ptr = current_subject; +for (;;) + { + int i, j; + int clen, dlen; + unsigned int c, d; + + /* Make the new state list into the active state list and empty the + new state list. */ + + temp_states = active_states; + active_states = new_states; + new_states = temp_states; + active_count = new_count; + new_count = 0; + + workspace[0] ^= 1; /* Remember for the restarting feature */ + workspace[1] = active_count; + +#ifdef DEBUG + printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP); + pchars((uschar *)ptr, strlen((char *)ptr), stdout); + printf("\"\n"); + + printf("%.*sActive states: ", rlevel*2-2, SP); + for (i = 0; i < active_count; i++) + printf("%d/%d ", active_states[i].offset, active_states[i].count); + printf("\n"); +#endif + + /* Set the pointers for adding new states */ + + next_active_state = active_states + active_count; + next_new_state = new_states; + + /* Load the current character from the subject outside the loop, as many + different states may want to look at it, and we assume that at least one + will. */ + + if (ptr < end_subject) + { + clen = 1; /* Number of bytes in the character */ +#ifdef SUPPORT_UTF8 + if (utf8) { GETCHARLEN(c, ptr, clen); } else +#endif /* SUPPORT_UTF8 */ + c = *ptr; + } + else + { + clen = 0; /* This indicates the end of the subject */ + c = NOTACHAR; /* This value should never actually be used */ + } + + /* Scan up the active states and act on each one. The result of an action + may be to add more states to the currently active list (e.g. on hitting a + parenthesis) or it may be to put states on the new list, for considering + when we move the character pointer on. */ + + for (i = 0; i < active_count; i++) + { + stateblock *current_state = active_states + i; + const uschar *code; + int state_offset = current_state->offset; + int count, codevalue; + +#ifdef DEBUG + printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset); + if (clen == 0) printf("EOL\n"); + else if (c > 32 && c < 127) printf("'%c'\n", c); + else printf("0x%02x\n", c); +#endif + + /* This variable is referred to implicity in the ADD_xxx macros. */ + + ims = current_state->ims; + + /* A negative offset is a special case meaning "hold off going to this + (negated) state until the number of characters in the data field have + been skipped". */ + + if (state_offset < 0) + { + if (current_state->data > 0) + { + DPRINTF(("%.*sSkipping this character\n", rlevel*2-2, SP)); + ADD_NEW_DATA(state_offset, current_state->count, + current_state->data - 1); + continue; + } + else + { + current_state->offset = state_offset = -state_offset; + } + } + + /* Check for a duplicate state with the same count, and skip if found. */ + + for (j = 0; j < i; j++) + { + if (active_states[j].offset == state_offset && + active_states[j].count == current_state->count) + { + DPRINTF(("%.*sDuplicate state: skipped\n", rlevel*2-2, SP)); + goto NEXT_ACTIVE_STATE; + } + } + + /* The state offset is the offset to the opcode */ + + code = start_code + state_offset; + codevalue = *code; + + /* If this opcode is followed by an inline character, load it. It is + tempting to test for the presence of a subject character here, but that + is wrong, because sometimes zero repetitions of the subject are + permitted. + + We also use this mechanism for opcodes such as OP_TYPEPLUS that take an + argument that is not a data character - but is always one byte long. We + have to take special action to deal with \P, \p, \H, \h, \V, \v and \X in + this case. To keep the other cases fast, convert these ones to new opcodes. + */ + + if (coptable[codevalue] > 0) + { + dlen = 1; +#ifdef SUPPORT_UTF8 + if (utf8) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else +#endif /* SUPPORT_UTF8 */ + d = code[coptable[codevalue]]; + if (codevalue >= OP_TYPESTAR) + { + switch(d) + { + case OP_ANYBYTE: return PCRE_ERROR_DFA_UITEM; + case OP_NOTPROP: + case OP_PROP: codevalue += OP_PROP_EXTRA; break; + case OP_ANYNL: codevalue += OP_ANYNL_EXTRA; break; + case OP_EXTUNI: codevalue += OP_EXTUNI_EXTRA; break; + case OP_NOT_HSPACE: + case OP_HSPACE: codevalue += OP_HSPACE_EXTRA; break; + case OP_NOT_VSPACE: + case OP_VSPACE: codevalue += OP_VSPACE_EXTRA; break; + default: break; + } + } + } + else + { + dlen = 0; /* Not strictly necessary, but compilers moan */ + d = NOTACHAR; /* if these variables are not set. */ + } + + + /* Now process the individual opcodes */ + + switch (codevalue) + { + +/* ========================================================================== */ + /* Reached a closing bracket. If not at the end of the pattern, carry + on with the next opcode. Otherwise, unless we have an empty string and + PCRE_NOTEMPTY is set, save the match data, shifting up all previous + matches so we always have the longest first. */ + + case OP_KET: + case OP_KETRMIN: + case OP_KETRMAX: + if (code != end_code) + { + ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0); + if (codevalue != OP_KET) + { + ADD_ACTIVE(state_offset - GET(code, 1), 0); + } + } + else if (ptr > current_subject || (md->moptions & PCRE_NOTEMPTY) == 0) + { + if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0; + else if (match_count > 0 && ++match_count * 2 >= offsetcount) + match_count = 0; + count = ((match_count == 0)? offsetcount : match_count * 2) - 2; + if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int)); + if (offsetcount >= 2) + { + offsets[0] = current_subject - start_subject; + offsets[1] = ptr - start_subject; + DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP, + offsets[1] - offsets[0], current_subject)); + } + if ((md->moptions & PCRE_DFA_SHORTEST) != 0) + { + DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n" + "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, + match_count, rlevel*2-2, SP)); + return match_count; + } + } + break; + +/* ========================================================================== */ + /* These opcodes add to the current list of states without looking + at the current character. */ + + /*-----------------------------------------------------------------*/ + case OP_ALT: + do { code += GET(code, 1); } while (*code == OP_ALT); + ADD_ACTIVE(code - start_code, 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_BRA: + case OP_SBRA: + do + { + ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); + code += GET(code, 1); + } + while (*code == OP_ALT); + break; + + /*-----------------------------------------------------------------*/ + case OP_CBRA: + case OP_SCBRA: + ADD_ACTIVE(code - start_code + 3 + LINK_SIZE, 0); + code += GET(code, 1); + while (*code == OP_ALT) + { + ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); + code += GET(code, 1); + } + break; + + /*-----------------------------------------------------------------*/ + case OP_BRAZERO: + case OP_BRAMINZERO: + ADD_ACTIVE(state_offset + 1, 0); + code += 1 + GET(code, 2); + while (*code == OP_ALT) code += GET(code, 1); + ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_SKIPZERO: + code += 1 + GET(code, 2); + while (*code == OP_ALT) code += GET(code, 1); + ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_CIRC: + if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) || + ((ims & PCRE_MULTILINE) != 0 && + ptr != end_subject && + WAS_NEWLINE(ptr))) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_EOD: + if (ptr >= end_subject) { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_OPT: + ims = code[1]; + ADD_ACTIVE(state_offset + 2, 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_SOD: + if (ptr == start_subject) { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_SOM: + if (ptr == start_subject + start_offset) { ADD_ACTIVE(state_offset + 1, 0); } + break; + + +/* ========================================================================== */ + /* These opcodes inspect the next subject character, and sometimes + the previous one as well, but do not have an argument. The variable + clen contains the length of the current character and is zero if we are + at the end of the subject. */ + + /*-----------------------------------------------------------------*/ + case OP_ANY: + if (clen > 0 && !IS_NEWLINE(ptr)) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_ALLANY: + if (clen > 0) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_EODN: + if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - md->nllen)) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_DOLL: + if ((md->moptions & PCRE_NOTEOL) == 0) + { + if (clen == 0 || + (IS_NEWLINE(ptr) && + ((ims & PCRE_MULTILINE) != 0 || ptr == end_subject - md->nllen) + )) + { ADD_ACTIVE(state_offset + 1, 0); } + } + else if ((ims & PCRE_MULTILINE) != 0 && IS_NEWLINE(ptr)) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + + case OP_DIGIT: + case OP_WHITESPACE: + case OP_WORDCHAR: + if (clen > 0 && c < 256 && + ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_NOT_DIGIT: + case OP_NOT_WHITESPACE: + case OP_NOT_WORDCHAR: + if (clen > 0 && (c >= 256 || + ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)) + { ADD_NEW(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + { + int left_word, right_word; + + if (ptr > start_subject) + { + const uschar *temp = ptr - 1; +#ifdef SUPPORT_UTF8 + if (utf8) BACKCHAR(temp); +#endif + GETCHARTEST(d, temp); + left_word = d < 256 && (ctypes[d] & ctype_word) != 0; + } + else left_word = 0; + + if (clen > 0) right_word = c < 256 && (ctypes[c] & ctype_word) != 0; + else right_word = 0; + + if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY)) + { ADD_ACTIVE(state_offset + 1, 0); } + } + break; + + + /*-----------------------------------------------------------------*/ + /* Check the next character by Unicode property. We will get here only + if the support is in the binary; otherwise a compile-time error occurs. + */ + +#ifdef SUPPORT_UCP + case OP_PROP: + case OP_NOTPROP: + if (clen > 0) + { + BOOL OK; + int chartype = UCD_CHARTYPE(c); + switch(code[1]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; + break; + + case PT_GC: + OK = _pcre_ucp_gentype[chartype] == code[2]; + break; + + case PT_PC: + OK = chartype == code[2]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[2]; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (codevalue == OP_PROP)) { ADD_NEW(state_offset + 3, 0); } + } + break; +#endif + + + +/* ========================================================================== */ + /* These opcodes likewise inspect the subject character, but have an + argument that is not a data character. It is one of these opcodes: + OP_ANY, OP_ALLANY, OP_DIGIT, OP_NOT_DIGIT, OP_WHITESPACE, OP_NOT_SPACE, + OP_WORDCHAR, OP_NOT_WORDCHAR. The value is loaded into d. */ + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (count > 0 && codevalue == OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (codevalue == OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset + 2, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (codevalue == OP_TYPEPOSSTAR) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEEXACT: + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (++count >= GET2(code, 1)) + { ADD_NEW(state_offset + 4, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + ADD_ACTIVE(state_offset + 4, 0); + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || + (c < 256 && + (d != OP_ANY || !IS_NEWLINE(ptr)) && + ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) + { + if (codevalue == OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= GET2(code, 1)) + { ADD_NEW(state_offset + 4, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + +/* ========================================================================== */ + /* These are virtual opcodes that are used when something like + OP_TYPEPLUS has OP_PROP, OP_NOTPROP, OP_ANYNL, or OP_EXTUNI as its + argument. It keeps the code above fast for the other cases. The argument + is in the d variable. */ + +#ifdef SUPPORT_UCP + case OP_PROP_EXTRA + OP_TYPEPLUS: + case OP_PROP_EXTRA + OP_TYPEMINPLUS: + case OP_PROP_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 4, 0); } + if (clen > 0) + { + BOOL OK; + int chartype = UCD_CHARTYPE(c); + switch(code[2]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; + break; + + case PT_GC: + OK = _pcre_ucp_gentype[chartype] == code[3]; + break; + + case PT_PC: + OK = chartype == code[3]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[3]; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (d == OP_PROP)) + { + if (count > 0 && codevalue == OP_PROP_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXTUNI_EXTRA + OP_TYPEPLUS: + case OP_EXTUNI_EXTRA + OP_TYPEMINPLUS: + case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0 && UCD_CATEGORY(c) != ucp_M) + { + const uschar *nptr = ptr + clen; + int ncount = 0; + if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + while (nptr < end_subject) + { + int nd; + int ndlen = 1; + GETCHARLEN(nd, nptr, ndlen); + if (UCD_CATEGORY(nd) != ucp_M) break; + ncount++; + nptr += ndlen; + } + count++; + ADD_NEW_DATA(-state_offset, count, ncount); + } + break; +#endif + + /*-----------------------------------------------------------------*/ + case OP_ANYNL_EXTRA + OP_TYPEPLUS: + case OP_ANYNL_EXTRA + OP_TYPEMINPLUS: + case OP_ANYNL_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + int ncount = 0; + switch (c) + { + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + goto ANYNL01; + + case 0x000d: + if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1; + /* Fall through */ + + ANYNL01: + case 0x000a: + if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW_DATA(-state_offset, count, ncount); + break; + + default: + break; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE_EXTRA + OP_TYPEPLUS: + case OP_VSPACE_EXTRA + OP_TYPEMINPLUS: + case OP_VSPACE_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + BOOL OK; + switch (c) + { + case 0x000a: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x0085: + case 0x2028: + case 0x2029: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_VSPACE)) + { + if (count > 0 && codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW_DATA(-state_offset, count, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE_EXTRA + OP_TYPEPLUS: + case OP_HSPACE_EXTRA + OP_TYPEMINPLUS: + case OP_HSPACE_EXTRA + OP_TYPEPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } + if (clen > 0) + { + BOOL OK; + switch (c) + { + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_HSPACE)) + { + if (count > 0 && codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSPLUS) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW_DATA(-state_offset, count, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ +#ifdef SUPPORT_UCP + case OP_PROP_EXTRA + OP_TYPEQUERY: + case OP_PROP_EXTRA + OP_TYPEMINQUERY: + case OP_PROP_EXTRA + OP_TYPEPOSQUERY: + count = 4; + goto QS1; + + case OP_PROP_EXTRA + OP_TYPESTAR: + case OP_PROP_EXTRA + OP_TYPEMINSTAR: + case OP_PROP_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS1: + + ADD_ACTIVE(state_offset + 4, 0); + if (clen > 0) + { + BOOL OK; + int chartype = UCD_CHARTYPE(c); + switch(code[2]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; + break; + + case PT_GC: + OK = _pcre_ucp_gentype[chartype] == code[3]; + break; + + case PT_PC: + OK = chartype == code[3]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[3]; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (d == OP_PROP)) + { + if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_PROP_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset + count, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXTUNI_EXTRA + OP_TYPEQUERY: + case OP_EXTUNI_EXTRA + OP_TYPEMINQUERY: + case OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS2; + + case OP_EXTUNI_EXTRA + OP_TYPESTAR: + case OP_EXTUNI_EXTRA + OP_TYPEMINSTAR: + case OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS2: + + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0 && UCD_CATEGORY(c) != ucp_M) + { + const uschar *nptr = ptr + clen; + int ncount = 0; + if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + while (nptr < end_subject) + { + int nd; + int ndlen = 1; + GETCHARLEN(nd, nptr, ndlen); + if (UCD_CATEGORY(nd) != ucp_M) break; + ncount++; + nptr += ndlen; + } + ADD_NEW_DATA(-(state_offset + count), 0, ncount); + } + break; +#endif + + /*-----------------------------------------------------------------*/ + case OP_ANYNL_EXTRA + OP_TYPEQUERY: + case OP_ANYNL_EXTRA + OP_TYPEMINQUERY: + case OP_ANYNL_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS3; + + case OP_ANYNL_EXTRA + OP_TYPESTAR: + case OP_ANYNL_EXTRA + OP_TYPEMINSTAR: + case OP_ANYNL_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS3: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + int ncount = 0; + switch (c) + { + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + goto ANYNL02; + + case 0x000d: + if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1; + /* Fall through */ + + ANYNL02: + case 0x000a: + if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW_DATA(-(state_offset + count), 0, ncount); + break; + + default: + break; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE_EXTRA + OP_TYPEQUERY: + case OP_VSPACE_EXTRA + OP_TYPEMINQUERY: + case OP_VSPACE_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS4; + + case OP_VSPACE_EXTRA + OP_TYPESTAR: + case OP_VSPACE_EXTRA + OP_TYPEMINSTAR: + case OP_VSPACE_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS4: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + BOOL OK; + switch (c) + { + case 0x000a: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x0085: + case 0x2028: + case 0x2029: + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + if (OK == (d == OP_VSPACE)) + { + if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW_DATA(-(state_offset + count), 0, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE_EXTRA + OP_TYPEQUERY: + case OP_HSPACE_EXTRA + OP_TYPEMINQUERY: + case OP_HSPACE_EXTRA + OP_TYPEPOSQUERY: + count = 2; + goto QS5; + + case OP_HSPACE_EXTRA + OP_TYPESTAR: + case OP_HSPACE_EXTRA + OP_TYPEMINSTAR: + case OP_HSPACE_EXTRA + OP_TYPEPOSSTAR: + count = 0; + + QS5: + ADD_ACTIVE(state_offset + 2, 0); + if (clen > 0) + { + BOOL OK; + switch (c) + { + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_HSPACE)) + { + if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSSTAR || + codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW_DATA(-(state_offset + count), 0, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ +#ifdef SUPPORT_UCP + case OP_PROP_EXTRA + OP_TYPEEXACT: + case OP_PROP_EXTRA + OP_TYPEUPTO: + case OP_PROP_EXTRA + OP_TYPEMINUPTO: + case OP_PROP_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_PROP_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 6, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + int chartype = UCD_CHARTYPE(c); + switch(code[4]) + { + case PT_ANY: + OK = TRUE; + break; + + case PT_LAMP: + OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; + break; + + case PT_GC: + OK = _pcre_ucp_gentype[chartype] == code[5]; + break; + + case PT_PC: + OK = chartype == code[5]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[5]; + break; + + /* Should never occur, but keep compilers from grumbling. */ + + default: + OK = codevalue != OP_PROP; + break; + } + + if (OK == (d == OP_PROP)) + { + if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= GET2(code, 1)) + { ADD_NEW(state_offset + 6, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXTUNI_EXTRA + OP_TYPEEXACT: + case OP_EXTUNI_EXTRA + OP_TYPEUPTO: + case OP_EXTUNI_EXTRA + OP_TYPEMINUPTO: + case OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 4, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0 && UCD_CATEGORY(c) != ucp_M) + { + const uschar *nptr = ptr + clen; + int ncount = 0; + if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + while (nptr < end_subject) + { + int nd; + int ndlen = 1; + GETCHARLEN(nd, nptr, ndlen); + if (UCD_CATEGORY(nd) != ucp_M) break; + ncount++; + nptr += ndlen; + } + if (++count >= GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); } + else + { ADD_NEW_DATA(-state_offset, count, ncount); } + } + break; +#endif + + /*-----------------------------------------------------------------*/ + case OP_ANYNL_EXTRA + OP_TYPEEXACT: + case OP_ANYNL_EXTRA + OP_TYPEUPTO: + case OP_ANYNL_EXTRA + OP_TYPEMINUPTO: + case OP_ANYNL_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_ANYNL_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 4, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + int ncount = 0; + switch (c) + { + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + goto ANYNL03; + + case 0x000d: + if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1; + /* Fall through */ + + ANYNL03: + case 0x000a: + if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); } + else + { ADD_NEW_DATA(-state_offset, count, ncount); } + break; + + default: + break; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE_EXTRA + OP_TYPEEXACT: + case OP_VSPACE_EXTRA + OP_TYPEUPTO: + case OP_VSPACE_EXTRA + OP_TYPEMINUPTO: + case OP_VSPACE_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_VSPACE_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 4, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + switch (c) + { + case 0x000a: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x0085: + case 0x2028: + case 0x2029: + OK = TRUE; + break; + + default: + OK = FALSE; + } + + if (OK == (d == OP_VSPACE)) + { + if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 4), 0, 0); } + else + { ADD_NEW_DATA(-state_offset, count, 0); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE_EXTRA + OP_TYPEEXACT: + case OP_HSPACE_EXTRA + OP_TYPEUPTO: + case OP_HSPACE_EXTRA + OP_TYPEMINUPTO: + case OP_HSPACE_EXTRA + OP_TYPEPOSUPTO: + if (codevalue != OP_HSPACE_EXTRA + OP_TYPEEXACT) + { ADD_ACTIVE(state_offset + 4, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + switch (c) + { + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + OK = TRUE; + break; + + default: + OK = FALSE; + break; + } + + if (OK == (d == OP_HSPACE)) + { + if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 4), 0, 0); } + else + { ADD_NEW_DATA(-state_offset, count, 0); } + } + } + break; + +/* ========================================================================== */ + /* These opcodes are followed by a character that is usually compared + to the current subject character; it is loaded into d. We still get + here even if there is no subject character, because in some cases zero + repetitions are permitted. */ + + /*-----------------------------------------------------------------*/ + case OP_CHAR: + if (clen > 0 && c == d) { ADD_NEW(state_offset + dlen + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_CHARNC: + if (clen == 0) break; + +#ifdef SUPPORT_UTF8 + if (utf8) + { + if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else + { + unsigned int othercase; + if (c < 128) othercase = fcc[c]; else + + /* If we have Unicode property support, we can use it to test the + other case of the character. */ + +#ifdef SUPPORT_UCP + othercase = UCD_OTHERCASE(c); +#else + othercase = NOTACHAR; +#endif + + if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); } + } + } + else +#endif /* SUPPORT_UTF8 */ + + /* Non-UTF-8 mode */ + { + if (lcc[c] == lcc[d]) { ADD_NEW(state_offset + 2, 0); } + } + break; + + +#ifdef SUPPORT_UCP + /*-----------------------------------------------------------------*/ + /* This is a tricky one because it can match more than one character. + Find out how many characters to skip, and then set up a negative state + to wait for them to pass before continuing. */ + + case OP_EXTUNI: + if (clen > 0 && UCD_CATEGORY(c) != ucp_M) + { + const uschar *nptr = ptr + clen; + int ncount = 0; + while (nptr < end_subject) + { + int nclen = 1; + GETCHARLEN(c, nptr, nclen); + if (UCD_CATEGORY(c) != ucp_M) break; + ncount++; + nptr += nclen; + } + ADD_NEW_DATA(-(state_offset + 1), 0, ncount); + } + break; +#endif + + /*-----------------------------------------------------------------*/ + /* This is a tricky like EXTUNI because it too can match more than one + character (when CR is followed by LF). In this case, set up a negative + state to wait for one character to pass before continuing. */ + + case OP_ANYNL: + if (clen > 0) switch(c) + { + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if ((md->moptions & PCRE_BSR_ANYCRLF) != 0) break; + + case 0x000a: + ADD_NEW(state_offset + 1, 0); + break; + + case 0x000d: + if (ptr + 1 < end_subject && ptr[1] == 0x0a) + { + ADD_NEW_DATA(-(state_offset + 1), 0, 1); + } + else + { + ADD_NEW(state_offset + 1, 0); + } + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_NOT_VSPACE: + if (clen > 0) switch(c) + { + case 0x000a: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x0085: + case 0x2028: + case 0x2029: + break; + + default: + ADD_NEW(state_offset + 1, 0); + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_VSPACE: + if (clen > 0) switch(c) + { + case 0x000a: + case 0x000b: + case 0x000c: + case 0x000d: + case 0x0085: + case 0x2028: + case 0x2029: + ADD_NEW(state_offset + 1, 0); + break; + + default: break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_NOT_HSPACE: + if (clen > 0) switch(c) + { + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + break; + + default: + ADD_NEW(state_offset + 1, 0); + break; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_HSPACE: + if (clen > 0) switch(c) + { + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + ADD_NEW(state_offset + 1, 0); + break; + } + break; + + /*-----------------------------------------------------------------*/ + /* Match a negated single character. This is only used for one-byte + characters, that is, we know that d < 256. The character we are + checking (c) can be multibyte. */ + + case OP_NOT: + if (clen > 0) + { + unsigned int otherd = ((ims & PCRE_CASELESS) != 0)? fcc[d] : d; + if (c != d && c != otherd) { ADD_NEW(state_offset + dlen + 1, 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTPOSPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); } + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 + if (utf8 && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF8 */ + otherd = fcc[d]; + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (count > 0 && + (codevalue == OP_POSPLUS || codevalue == OP_NOTPOSPLUS)) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + count++; + ADD_NEW(state_offset, count); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTPOSQUERY: + ADD_ACTIVE(state_offset + dlen + 1, 0); + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 + if (utf8 && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF8 */ + otherd = fcc[d]; + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (codevalue == OP_POSQUERY || codevalue == OP_NOTPOSQUERY) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset + dlen + 1, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPOSSTAR: + ADD_ACTIVE(state_offset + dlen + 1, 0); + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 + if (utf8 && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF8 */ + otherd = fcc[d]; + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (codevalue == OP_POSSTAR || codevalue == OP_NOTPOSSTAR) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + ADD_NEW(state_offset, 0); + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_EXACT: + case OP_NOTEXACT: + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 + if (utf8 && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF8 */ + otherd = fcc[d]; + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (++count >= GET2(code, 1)) + { ADD_NEW(state_offset + dlen + 3, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTPOSUPTO: + ADD_ACTIVE(state_offset + dlen + 3, 0); + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 + if (utf8 && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF8 */ + otherd = fcc[d]; + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (codevalue == OP_POSUPTO || codevalue == OP_NOTPOSUPTO) + { + active_count--; /* Remove non-match possibility */ + next_active_state--; + } + if (++count >= GET2(code, 1)) + { ADD_NEW(state_offset + dlen + 3, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + +/* ========================================================================== */ + /* These are the class-handling opcodes */ + + case OP_CLASS: + case OP_NCLASS: + case OP_XCLASS: + { + BOOL isinclass = FALSE; + int next_state_offset; + const uschar *ecode; + + /* For a simple class, there is always just a 32-byte table, and we + can set isinclass from it. */ + + if (codevalue != OP_XCLASS) + { + ecode = code + 33; + if (clen > 0) + { + isinclass = (c > 255)? (codevalue == OP_NCLASS) : + ((code[1 + c/8] & (1 << (c&7))) != 0); + } + } + + /* An extended class may have a table or a list of single characters, + ranges, or both, and it may be positive or negative. There's a + function that sorts all this out. */ + + else + { + ecode = code + GET(code, 1); + if (clen > 0) isinclass = _pcre_xclass(c, code + 1 + LINK_SIZE); + } + + /* At this point, isinclass is set for all kinds of class, and ecode + points to the byte after the end of the class. If there is a + quantifier, this is where it will be. */ + + next_state_offset = ecode - start_code; + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + ADD_ACTIVE(next_state_offset + 1, 0); + if (isinclass) { ADD_NEW(state_offset, 0); } + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + count = current_state->count; /* Already matched */ + if (count > 0) { ADD_ACTIVE(next_state_offset + 1, 0); } + if (isinclass) { count++; ADD_NEW(state_offset, count); } + break; + + case OP_CRQUERY: + case OP_CRMINQUERY: + ADD_ACTIVE(next_state_offset + 1, 0); + if (isinclass) { ADD_NEW(next_state_offset + 1, 0); } + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + count = current_state->count; /* Already matched */ + if (count >= GET2(ecode, 1)) + { ADD_ACTIVE(next_state_offset + 5, 0); } + if (isinclass) + { + int max = GET2(ecode, 3); + if (++count >= max && max != 0) /* Max 0 => no limit */ + { ADD_NEW(next_state_offset + 5, 0); } + else + { ADD_NEW(state_offset, count); } + } + break; + + default: + if (isinclass) { ADD_NEW(next_state_offset, 0); } + break; + } + } + break; + +/* ========================================================================== */ + /* These are the opcodes for fancy brackets of various kinds. We have + to use recursion in order to handle them. The "always failing" assersion + (?!) is optimised when compiling to OP_FAIL, so we have to support that, + though the other "backtracking verbs" are not supported. */ + + case OP_FAIL: + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + { + int rc; + int local_offsets[2]; + int local_workspace[1000]; + const uschar *endasscode = code + GET(code, 1); + + while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1); + + rc = internal_dfa_exec( + md, /* static match data */ + code, /* this subexpression's code */ + ptr, /* where we currently are */ + ptr - start_subject, /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + ims, /* the current ims flags */ + rlevel, /* function recursion level */ + recursing); /* pass on regex recursion */ + + if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK)) + { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_COND: + case OP_SCOND: + { + int local_offsets[1000]; + int local_workspace[1000]; + int condcode = code[LINK_SIZE+1]; + + /* Back reference conditions are not supported */ + + if (condcode == OP_CREF) return PCRE_ERROR_DFA_UCOND; + + /* The DEFINE condition is always false */ + + if (condcode == OP_DEF) + { + ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); + } + + /* The only supported version of OP_RREF is for the value RREF_ANY, + which means "test if in any recursion". We can't test for specifically + recursed groups. */ + + else if (condcode == OP_RREF) + { + int value = GET2(code, LINK_SIZE+2); + if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND; + if (recursing > 0) { ADD_ACTIVE(state_offset + LINK_SIZE + 4, 0); } + else { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); } + } + + /* Otherwise, the condition is an assertion */ + + else + { + int rc; + const uschar *asscode = code + LINK_SIZE + 1; + const uschar *endasscode = asscode + GET(asscode, 1); + + while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1); + + rc = internal_dfa_exec( + md, /* fixed match data */ + asscode, /* this subexpression's code */ + ptr, /* where we currently are */ + ptr - start_subject, /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + ims, /* the current ims flags */ + rlevel, /* function recursion level */ + recursing); /* pass on regex recursion */ + + if ((rc >= 0) == + (condcode == OP_ASSERT || condcode == OP_ASSERTBACK)) + { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); } + else + { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_RECURSE: + { + int local_offsets[1000]; + int local_workspace[1000]; + int rc; + + DPRINTF(("%.*sStarting regex recursion %d\n", rlevel*2-2, SP, + recursing + 1)); + + rc = internal_dfa_exec( + md, /* fixed match data */ + start_code + GET(code, 1), /* this subexpression's code */ + ptr, /* where we currently are */ + ptr - start_subject, /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + ims, /* the current ims flags */ + rlevel, /* function recursion level */ + recursing + 1); /* regex recurse level */ + + DPRINTF(("%.*sReturn from regex recursion %d: rc=%d\n", rlevel*2-2, SP, + recursing + 1, rc)); + + /* Ran out of internal offsets */ + + if (rc == 0) return PCRE_ERROR_DFA_RECURSE; + + /* For each successful matched substring, set up the next state with a + count of characters to skip before trying it. Note that the count is in + characters, not bytes. */ + + if (rc > 0) + { + for (rc = rc*2 - 2; rc >= 0; rc -= 2) + { + const uschar *p = start_subject + local_offsets[rc]; + const uschar *pp = start_subject + local_offsets[rc+1]; + int charcount = local_offsets[rc+1] - local_offsets[rc]; + while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--; + if (charcount > 0) + { + ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1)); + } + else + { + ADD_ACTIVE(state_offset + LINK_SIZE + 1, 0); + } + } + } + else if (rc != PCRE_ERROR_NOMATCH) return rc; + } + break; + + /*-----------------------------------------------------------------*/ + case OP_ONCE: + { + int local_offsets[2]; + int local_workspace[1000]; + + int rc = internal_dfa_exec( + md, /* fixed match data */ + code, /* this subexpression's code */ + ptr, /* where we currently are */ + ptr - start_subject, /* start offset */ + local_offsets, /* offset vector */ + sizeof(local_offsets)/sizeof(int), /* size of same */ + local_workspace, /* workspace vector */ + sizeof(local_workspace)/sizeof(int), /* size of same */ + ims, /* the current ims flags */ + rlevel, /* function recursion level */ + recursing); /* pass on regex recursion */ + + if (rc >= 0) + { + const uschar *end_subpattern = code; + int charcount = local_offsets[1] - local_offsets[0]; + int next_state_offset, repeat_state_offset; + + do { end_subpattern += GET(end_subpattern, 1); } + while (*end_subpattern == OP_ALT); + next_state_offset = end_subpattern - start_code + LINK_SIZE + 1; + + /* If the end of this subpattern is KETRMAX or KETRMIN, we must + arrange for the repeat state also to be added to the relevant list. + Calculate the offset, or set -1 for no repeat. */ + + repeat_state_offset = (*end_subpattern == OP_KETRMAX || + *end_subpattern == OP_KETRMIN)? + end_subpattern - start_code - GET(end_subpattern, 1) : -1; + + /* If we have matched an empty string, add the next state at the + current character pointer. This is important so that the duplicate + checking kicks in, which is what breaks infinite loops that match an + empty string. */ + + if (charcount == 0) + { + ADD_ACTIVE(next_state_offset, 0); + } + + /* Optimization: if there are no more active states, and there + are no new states yet set up, then skip over the subject string + right here, to save looping. Otherwise, set up the new state to swing + into action when the end of the substring is reached. */ + + else if (i + 1 >= active_count && new_count == 0) + { + ptr += charcount; + clen = 0; + ADD_NEW(next_state_offset, 0); + + /* If we are adding a repeat state at the new character position, + we must fudge things so that it is the only current state. + Otherwise, it might be a duplicate of one we processed before, and + that would cause it to be skipped. */ + + if (repeat_state_offset >= 0) + { + next_active_state = active_states; + active_count = 0; + i = -1; + ADD_ACTIVE(repeat_state_offset, 0); + } + } + else + { + const uschar *p = start_subject + local_offsets[0]; + const uschar *pp = start_subject + local_offsets[1]; + while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--; + ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1)); + if (repeat_state_offset >= 0) + { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); } + } + + } + else if (rc != PCRE_ERROR_NOMATCH) return rc; + } + break; + + +/* ========================================================================== */ + /* Handle callouts */ + + case OP_CALLOUT: + if (pcre_callout != NULL) + { + int rrc; + pcre_callout_block cb; + cb.version = 1; /* Version 1 of the callout block */ + cb.callout_number = code[1]; + cb.offset_vector = offsets; + cb.subject = (PCRE_SPTR)start_subject; + cb.subject_length = end_subject - start_subject; + cb.start_match = current_subject - start_subject; + cb.current_position = ptr - start_subject; + cb.pattern_position = GET(code, 2); + cb.next_item_length = GET(code, 2 + LINK_SIZE); + cb.capture_top = 1; + cb.capture_last = -1; + cb.callout_data = md->callout_data; + if ((rrc = (*pcre_callout)(&cb)) < 0) return rrc; /* Abandon */ + if (rrc == 0) { ADD_ACTIVE(state_offset + 2 + 2*LINK_SIZE, 0); } + } + break; + + +/* ========================================================================== */ + default: /* Unsupported opcode */ + return PCRE_ERROR_DFA_UITEM; + } + + NEXT_ACTIVE_STATE: continue; + + } /* End of loop scanning active states */ + + /* We have finished the processing at the current subject character. If no + new states have been set for the next character, we have found all the + matches that we are going to find. If we are at the top level and partial + matching has been requested, check for appropriate conditions. */ + + if (new_count <= 0) + { + if (match_count < 0 && /* No matches found */ + rlevel == 1 && /* Top level match function */ + (md->moptions & PCRE_PARTIAL) != 0 && /* Want partial matching */ + ptr >= end_subject && /* Reached end of subject */ + ptr > current_subject) /* Matched non-empty string */ + { + if (offsetcount >= 2) + { + offsets[0] = current_subject - start_subject; + offsets[1] = end_subject - start_subject; + } + match_count = PCRE_ERROR_PARTIAL; + } + + DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n" + "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count, + rlevel*2-2, SP)); + break; /* In effect, "return", but see the comment below */ + } + + /* One or more states are active for the next character. */ + + ptr += clen; /* Advance to next subject character */ + } /* Loop to move along the subject string */ + +/* Control gets here from "break" a few lines above. We do it this way because +if we use "return" above, we have compiler trouble. Some compilers warn if +there's nothing here because they think the function doesn't return a value. On +the other hand, if we put a dummy statement here, some more clever compilers +complain that it can't be reached. Sigh. */ + +return match_count; +} + + + + +/************************************************* +* Execute a Regular Expression - DFA engine * +*************************************************/ + +/* This external function applies a compiled re to a subject string using a DFA +engine. This function calls the internal function multiple times if the pattern +is not anchored. + +Arguments: + argument_re points to the compiled expression + extra_data points to extra data or is NULL + subject points to the subject string + length length of subject string (may contain binary zeros) + start_offset where to start in the subject string + options option bits + offsets vector of match offsets + offsetcount size of same + workspace workspace vector + wscount size of same + +Returns: > 0 => number of match offset pairs placed in offsets + = 0 => offsets overflowed; longest matches are present + -1 => failed to match + < -1 => some kind of unexpected problem +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data, + const char *subject, int length, int start_offset, int options, int *offsets, + int offsetcount, int *workspace, int wscount) +{ +real_pcre *re = (real_pcre *)argument_re; +dfa_match_data match_block; +dfa_match_data *md = &match_block; +BOOL utf8, anchored, startline, firstline; +const uschar *current_subject, *end_subject, *lcc; + +pcre_study_data internal_study; +const pcre_study_data *study = NULL; +real_pcre internal_re; + +const uschar *req_byte_ptr; +const uschar *start_bits = NULL; +BOOL first_byte_caseless = FALSE; +BOOL req_byte_caseless = FALSE; +int first_byte = -1; +int req_byte = -1; +int req_byte2 = -1; +int newline; + +/* Plausibility checks */ + +if ((options & ~PUBLIC_DFA_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; +if (re == NULL || subject == NULL || workspace == NULL || + (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; +if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; +if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE; + +/* We need to find the pointer to any study data before we test for byte +flipping, so we scan the extra_data block first. This may set two fields in the +match block, so we must initialize them beforehand. However, the other fields +in the match block must not be set until after the byte flipping. */ + +md->tables = re->tables; +md->callout_data = NULL; + +if (extra_data != NULL) + { + unsigned int flags = extra_data->flags; + if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) + study = (const pcre_study_data *)extra_data->study_data; + if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) return PCRE_ERROR_DFA_UMLIMIT; + if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0) + return PCRE_ERROR_DFA_UMLIMIT; + if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) + md->callout_data = extra_data->callout_data; + if ((flags & PCRE_EXTRA_TABLES) != 0) + md->tables = extra_data->tables; + } + +/* Check that the first field in the block is the magic number. If it is not, +test for a regex that was compiled on a host of opposite endianness. If this is +the case, flipped values are put in internal_re and internal_study if there was +study data too. */ + +if (re->magic_number != MAGIC_NUMBER) + { + re = _pcre_try_flipped(re, &internal_re, study, &internal_study); + if (re == NULL) return PCRE_ERROR_BADMAGIC; + if (study != NULL) study = &internal_study; + } + +/* Set some local values */ + +current_subject = (const unsigned char *)subject + start_offset; +end_subject = (const unsigned char *)subject + length; +req_byte_ptr = current_subject - 1; + +#ifdef SUPPORT_UTF8 +utf8 = (re->options & PCRE_UTF8) != 0; +#else +utf8 = FALSE; +#endif + +anchored = (options & (PCRE_ANCHORED|PCRE_DFA_RESTART)) != 0 || + (re->options & PCRE_ANCHORED) != 0; + +/* The remaining fixed data for passing around. */ + +md->start_code = (const uschar *)argument_re + + re->name_table_offset + re->name_count * re->name_entry_size; +md->start_subject = (const unsigned char *)subject; +md->end_subject = end_subject; +md->moptions = options; +md->poptions = re->options; + +/* If the BSR option is not set at match time, copy what was set +at compile time. */ + +if ((md->moptions & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) == 0) + { + if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0) + md->moptions |= re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE); +#ifdef BSR_ANYCRLF + else md->moptions |= PCRE_BSR_ANYCRLF; +#endif + } + +/* Handle different types of newline. The three bits give eight cases. If +nothing is set at run time, whatever was used at compile time applies. */ + +switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) & + PCRE_NEWLINE_BITS) + { + case 0: newline = NEWLINE; break; /* Compile-time default */ + case PCRE_NEWLINE_CR: newline = '\r'; break; + case PCRE_NEWLINE_LF: newline = '\n'; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break; + case PCRE_NEWLINE_ANY: newline = -1; break; + case PCRE_NEWLINE_ANYCRLF: newline = -2; break; + default: return PCRE_ERROR_BADNEWLINE; + } + +if (newline == -2) + { + md->nltype = NLTYPE_ANYCRLF; + } +else if (newline < 0) + { + md->nltype = NLTYPE_ANY; + } +else + { + md->nltype = NLTYPE_FIXED; + if (newline > 255) + { + md->nllen = 2; + md->nl[0] = (newline >> 8) & 255; + md->nl[1] = newline & 255; + } + else + { + md->nllen = 1; + md->nl[0] = newline; + } + } + +/* Check a UTF-8 string if required. Unfortunately there's no way of passing +back the character offset. */ + +#ifdef SUPPORT_UTF8 +if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0) + { + if (_pcre_valid_utf8((uschar *)subject, length) >= 0) + return PCRE_ERROR_BADUTF8; + if (start_offset > 0 && start_offset < length) + { + int tb = ((uschar *)subject)[start_offset]; + if (tb > 127) + { + tb &= 0xc0; + if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET; + } + } + } +#endif + +/* If the exec call supplied NULL for tables, use the inbuilt ones. This +is a feature that makes it possible to save compiled regex and re-use them +in other programs later. */ + +if (md->tables == NULL) md->tables = _pcre_default_tables; + +/* The lower casing table and the "must be at the start of a line" flag are +used in a loop when finding where to start. */ + +lcc = md->tables + lcc_offset; +startline = (re->flags & PCRE_STARTLINE) != 0; +firstline = (re->options & PCRE_FIRSTLINE) != 0; + +/* Set up the first character to match, if available. The first_byte value is +never set for an anchored regular expression, but the anchoring may be forced +at run time, so we have to test for anchoring. The first char may be unset for +an unanchored pattern, of course. If there's no first char and the pattern was +studied, there may be a bitmap of possible first characters. */ + +if (!anchored) + { + if ((re->flags & PCRE_FIRSTSET) != 0) + { + first_byte = re->first_byte & 255; + if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE) + first_byte = lcc[first_byte]; + } + else + { + if (startline && study != NULL && + (study->options & PCRE_STUDY_MAPPED) != 0) + start_bits = study->start_bits; + } + } + +/* For anchored or unanchored matches, there may be a "last known required +character" set. */ + +if ((re->flags & PCRE_REQCHSET) != 0) + { + req_byte = re->req_byte & 255; + req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0; + req_byte2 = (md->tables + fcc_offset)[req_byte]; /* case flipped */ + } + +/* Call the main matching function, looping for a non-anchored regex after a +failed match. Unless restarting, optimize by moving to the first match +character if possible, when not anchored. Then unless wanting a partial match, +check for a required later character. */ + +for (;;) + { + int rc; + + if ((options & PCRE_DFA_RESTART) == 0) + { + const uschar *save_end_subject = end_subject; + + /* Advance to a unique first char if possible. If firstline is TRUE, the + start of the match is constrained to the first line of a multiline string. + Implement this by temporarily adjusting end_subject so that we stop + scanning at a newline. If the match fails at the newline, later code breaks + this loop. */ + + if (firstline) + { + USPTR t = current_subject; +#ifdef SUPPORT_UTF8 + if (utf8) + { + while (t < md->end_subject && !IS_NEWLINE(t)) + { + t++; + while (t < end_subject && (*t & 0xc0) == 0x80) t++; + } + } + else +#endif + while (t < md->end_subject && !IS_NEWLINE(t)) t++; + end_subject = t; + } + + if (first_byte >= 0) + { + if (first_byte_caseless) + while (current_subject < end_subject && + lcc[*current_subject] != first_byte) + current_subject++; + else + while (current_subject < end_subject && *current_subject != first_byte) + current_subject++; + } + + /* Or to just after a linebreak for a multiline match if possible */ + + else if (startline) + { + if (current_subject > md->start_subject + start_offset) + { +#ifdef SUPPORT_UTF8 + if (utf8) + { + while (current_subject < end_subject && !WAS_NEWLINE(current_subject)) + { + current_subject++; + while(current_subject < end_subject && + (*current_subject & 0xc0) == 0x80) + current_subject++; + } + } + else +#endif + while (current_subject < end_subject && !WAS_NEWLINE(current_subject)) + current_subject++; + + /* If we have just passed a CR and the newline option is ANY or + ANYCRLF, and we are now at a LF, advance the match position by one more + character. */ + + if (current_subject[-1] == '\r' && + (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && + current_subject < end_subject && + *current_subject == '\n') + current_subject++; + } + } + + /* Or to a non-unique first char after study */ + + else if (start_bits != NULL) + { + while (current_subject < end_subject) + { + register unsigned int c = *current_subject; + if ((start_bits[c/8] & (1 << (c&7))) == 0) current_subject++; + else break; + } + } + + /* Restore fudged end_subject */ + + end_subject = save_end_subject; + } + + /* If req_byte is set, we know that that character must appear in the subject + for the match to succeed. If the first character is set, req_byte must be + later in the subject; otherwise the test starts at the match point. This + optimization can save a huge amount of work in patterns with nested unlimited + repeats that aren't going to match. Writing separate code for cased/caseless + versions makes it go faster, as does using an autoincrement and backing off + on a match. + + HOWEVER: when the subject string is very, very long, searching to its end can + take a long time, and give bad performance on quite ordinary patterns. This + showed up when somebody was matching /^C/ on a 32-megabyte string... so we + don't do this when the string is sufficiently long. + + ALSO: this processing is disabled when partial matching is requested. + */ + + if (req_byte >= 0 && + end_subject - current_subject < REQ_BYTE_MAX && + (options & PCRE_PARTIAL) == 0) + { + register const uschar *p = current_subject + ((first_byte >= 0)? 1 : 0); + + /* We don't need to repeat the search if we haven't yet reached the + place we found it at last time. */ + + if (p > req_byte_ptr) + { + if (req_byte_caseless) + { + while (p < end_subject) + { + register int pp = *p++; + if (pp == req_byte || pp == req_byte2) { p--; break; } + } + } + else + { + while (p < end_subject) + { + if (*p++ == req_byte) { p--; break; } + } + } + + /* If we can't find the required character, break the matching loop, + which will cause a return or PCRE_ERROR_NOMATCH. */ + + if (p >= end_subject) break; + + /* If we have found the required character, save the point where we + found it, so that we don't search again next time round the loop if + the start hasn't passed this character yet. */ + + req_byte_ptr = p; + } + } + + /* OK, now we can do the business */ + + rc = internal_dfa_exec( + md, /* fixed match data */ + md->start_code, /* this subexpression's code */ + current_subject, /* where we currently are */ + start_offset, /* start offset in subject */ + offsets, /* offset vector */ + offsetcount, /* size of same */ + workspace, /* workspace vector */ + wscount, /* size of same */ + re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL), /* ims flags */ + 0, /* function recurse level */ + 0); /* regex recurse level */ + + /* Anything other than "no match" means we are done, always; otherwise, carry + on only if not anchored. */ + + if (rc != PCRE_ERROR_NOMATCH || anchored) return rc; + + /* Advance to the next subject character unless we are at the end of a line + and firstline is set. */ + + if (firstline && IS_NEWLINE(current_subject)) break; + current_subject++; + if (utf8) + { + while (current_subject < end_subject && (*current_subject & 0xc0) == 0x80) + current_subject++; + } + if (current_subject > end_subject) break; + + /* If we have just passed a CR and we are now at a LF, and the pattern does + not contain any explicit matches for \r or \n, and the newline option is CRLF + or ANY or ANYCRLF, advance the match position by one more character. */ + + if (current_subject[-1] == '\r' && + current_subject < end_subject && + *current_subject == '\n' && + (re->flags & PCRE_HASCRORLF) == 0 && + (md->nltype == NLTYPE_ANY || + md->nltype == NLTYPE_ANYCRLF || + md->nllen == 2)) + current_subject++; + + } /* "Bumpalong" loop */ + +return PCRE_ERROR_NOMATCH; +} + +/* End of pcre_dfa_exec.c */ diff --git a/glib/pcre/pcre_exec.c b/glib/pcre/pcre_exec.c new file mode 100644 index 0000000..06ce8f7 --- /dev/null +++ b/glib/pcre/pcre_exec.c @@ -0,0 +1,4998 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains pcre_exec(), the externally visible function that does +pattern matching using an NFA algorithm, trying to mimic Perl as closely as +possible. There are also some static supporting functions. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define NLBLOCK md /* Block containing newline information */ +#define PSSTART start_subject /* Field containing processed string start */ +#define PSEND end_subject /* Field containing processed string end */ + +#include "pcre_internal.h" + +/* Undefine some potentially clashing cpp symbols */ + +#undef min +#undef max + +/* Flag bits for the match() function */ + +#define match_condassert 0x01 /* Called to check a condition assertion */ +#define match_cbegroup 0x02 /* Could-be-empty unlimited repeat group */ + +/* Non-error returns from the match() function. Error returns are externally +defined PCRE_ERROR_xxx codes, which are all negative. */ + +#define MATCH_MATCH 1 +#define MATCH_NOMATCH 0 + +/* Special internal returns from the match() function. Make them sufficiently +negative to avoid the external error codes. */ + +#define MATCH_COMMIT (-999) +#define MATCH_PRUNE (-998) +#define MATCH_SKIP (-997) +#define MATCH_THEN (-996) + +/* Maximum number of ints of offset to save on the stack for recursive calls. +If the offset vector is bigger, malloc is used. This should be a multiple of 3, +because the offset vector is always a multiple of 3 long. */ + +#define REC_STACK_SAVE_MAX 30 + +/* Min and max values for the common repeats; for the maxima, 0 => infinity */ + +static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; +static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; + + + +#ifdef DEBUG +/************************************************* +* Debugging function to print chars * +*************************************************/ + +/* Print a sequence of chars in printable format, stopping at the end of the +subject if the requested. + +Arguments: + p points to characters + length number to print + is_subject TRUE if printing from within md->start_subject + md pointer to matching data block, if is_subject is TRUE + +Returns: nothing +*/ + +static void +pchars(const uschar *p, int length, BOOL is_subject, match_data *md) +{ +unsigned int c; +if (is_subject && length > md->end_subject - p) length = md->end_subject - p; +while (length-- > 0) + if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c); +} +#endif + + + +/************************************************* +* Match a back-reference * +*************************************************/ + +/* If a back reference hasn't been set, the length that is passed is greater +than the number of characters left in the string, so the match fails. + +Arguments: + offset index into the offset vector + eptr points into the subject + length length to be matched + md points to match data block + ims the ims flags + +Returns: TRUE if matched +*/ + +static BOOL +match_ref(int offset, register USPTR eptr, int length, match_data *md, + unsigned long int ims) +{ +USPTR p = md->start_subject + md->offset_vector[offset]; + +#ifdef DEBUG +if (eptr >= md->end_subject) + printf("matching subject "); +else + { + printf("matching subject "); + pchars(eptr, length, TRUE, md); + } +printf(" against backref "); +pchars(p, length, FALSE, md); +printf("\n"); +#endif + +/* Always fail if not enough characters left */ + +if (length > md->end_subject - eptr) return FALSE; + +/* Separate the caseless case for speed. In UTF-8 mode we can only do this +properly if Unicode properties are supported. Otherwise, we can check only +ASCII characters. */ + +if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 +#ifdef SUPPORT_UCP + if (md->utf8) + { + USPTR endptr = eptr + length; + while (eptr < endptr) + { + int c, d; + GETCHARINC(c, eptr); + GETCHARINC(d, p); + if (c != d && c != UCD_OTHERCASE(d)) return FALSE; + } + } + else +#endif +#endif + + /* The same code works when not in UTF-8 mode and in UTF-8 mode when there + is no UCP support. */ + + while (length-- > 0) + { if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; } + } + +/* In the caseful case, we can just compare the bytes, whether or not we +are in UTF-8 mode. */ + +else + { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } + +return TRUE; +} + + + +/*************************************************************************** +**************************************************************************** + RECURSION IN THE match() FUNCTION + +The match() function is highly recursive, though not every recursive call +increases the recursive depth. Nevertheless, some regular expressions can cause +it to recurse to a great depth. I was writing for Unix, so I just let it call +itself recursively. This uses the stack for saving everything that has to be +saved for a recursive call. On Unix, the stack can be large, and this works +fine. + +It turns out that on some non-Unix-like systems there are problems with +programs that use a lot of stack. (This despite the fact that every last chip +has oodles of memory these days, and techniques for extending the stack have +been known for decades.) So.... + +There is a fudge, triggered by defining NO_RECURSE, which avoids recursive +calls by keeping local variables that need to be preserved in blocks of memory +obtained from malloc() instead instead of on the stack. Macros are used to +achieve this so that the actual code doesn't look very different to what it +always used to. + +The original heap-recursive code used longjmp(). However, it seems that this +can be very slow on some operating systems. Following a suggestion from Stan +Switzer, the use of longjmp() has been abolished, at the cost of having to +provide a unique number for each call to RMATCH. There is no way of generating +a sequence of numbers at compile time in C. I have given them names, to make +them stand out more clearly. + +Crude tests on x86 Linux show a small speedup of around 5-8%. However, on +FreeBSD, avoiding longjmp() more than halves the time taken to run the standard +tests. Furthermore, not using longjmp() means that local dynamic variables +don't have indeterminate values; this has meant that the frame size can be +reduced because the result can be "passed back" by straight setting of the +variable instead of being passed in the frame. +**************************************************************************** +***************************************************************************/ + +/* Numbers for RMATCH calls. When this list is changed, the code at HEAP_RETURN +below must be updated in sync. */ + +enum { RM1=1, RM2, RM3, RM4, RM5, RM6, RM7, RM8, RM9, RM10, + RM11, RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20, + RM21, RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30, + RM31, RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40, + RM41, RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50, + RM51, RM52, RM53, RM54 }; + +/* These versions of the macros use the stack, as normal. There are debugging +versions and production versions. Note that the "rw" argument of RMATCH isn't +actuall used in this definition. */ + +#ifndef NO_RECURSE +#define REGISTER register + +#ifdef DEBUG +#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ + { \ + printf("match() called in line %d\n", __LINE__); \ + rrc = match(ra,rb,mstart,rc,rd,re,rf,rg,rdepth+1); \ + printf("to line %d\n", __LINE__); \ + } +#define RRETURN(ra) \ + { \ + printf("match() returned %d from line %d ", ra, __LINE__); \ + return ra; \ + } +#else +#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ + rrc = match(ra,rb,mstart,rc,rd,re,rf,rg,rdepth+1) +#define RRETURN(ra) return ra +#endif + +#else + + +/* These versions of the macros manage a private stack on the heap. Note that +the "rd" argument of RMATCH isn't actually used in this definition. It's the md +argument of match(), which never changes. */ + +#define REGISTER + +#define RMATCH(ra,rb,rc,rd,re,rf,rg,rw)\ + {\ + heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\ + frame->Xwhere = rw; \ + newframe->Xeptr = ra;\ + newframe->Xecode = rb;\ + newframe->Xmstart = mstart;\ + newframe->Xoffset_top = rc;\ + newframe->Xims = re;\ + newframe->Xeptrb = rf;\ + newframe->Xflags = rg;\ + newframe->Xrdepth = frame->Xrdepth + 1;\ + newframe->Xprevframe = frame;\ + frame = newframe;\ + DPRINTF(("restarting from line %d\n", __LINE__));\ + goto HEAP_RECURSE;\ + L_##rw:\ + DPRINTF(("jumped back to line %d\n", __LINE__));\ + } + +#define RRETURN(ra)\ + {\ + heapframe *newframe = frame;\ + frame = newframe->Xprevframe;\ + (pcre_stack_free)(newframe);\ + if (frame != NULL)\ + {\ + rrc = ra;\ + goto HEAP_RETURN;\ + }\ + return ra;\ + } + + +/* Structure for remembering the local variables in a private frame */ + +typedef struct heapframe { + struct heapframe *Xprevframe; + + /* Function arguments that may change */ + + const uschar *Xeptr; + const uschar *Xecode; + const uschar *Xmstart; + int Xoffset_top; + long int Xims; + eptrblock *Xeptrb; + int Xflags; + unsigned int Xrdepth; + + /* Function local variables */ + + const uschar *Xcallpat; + const uschar *Xcharptr; + const uschar *Xdata; + const uschar *Xnext; + const uschar *Xpp; + const uschar *Xprev; + const uschar *Xsaved_eptr; + + recursion_info Xnew_recursive; + + BOOL Xcur_is_word; + BOOL Xcondition; + BOOL Xprev_is_word; + + unsigned long int Xoriginal_ims; + +#ifdef SUPPORT_UCP + int Xprop_type; + int Xprop_value; + int Xprop_fail_result; + int Xprop_category; + int Xprop_chartype; + int Xprop_script; + int Xoclength; + uschar Xocchars[8]; +#endif + + int Xctype; + unsigned int Xfc; + int Xfi; + int Xlength; + int Xmax; + int Xmin; + int Xnumber; + int Xoffset; + int Xop; + int Xsave_capture_last; + int Xsave_offset1, Xsave_offset2, Xsave_offset3; + int Xstacksave[REC_STACK_SAVE_MAX]; + + eptrblock Xnewptrb; + + /* Where to jump back to */ + + int Xwhere; + +} heapframe; + +#endif + + +/*************************************************************************** +***************************************************************************/ + + + +/************************************************* +* Match from current position * +*************************************************/ + +/* This function is called recursively in many circumstances. Whenever it +returns a negative (error) response, the outer incarnation must also return the +same response. + +Performance note: It might be tempting to extract commonly used fields from the +md structure (e.g. utf8, end_subject) into individual variables to improve +performance. Tests using gcc on a SPARC disproved this; in the first case, it +made performance worse. + +Arguments: + eptr pointer to current character in subject + ecode pointer to current position in compiled code + mstart pointer to the current match start position (can be modified + by encountering \K) + offset_top current top pointer + md pointer to "static" info for the match + ims current /i, /m, and /s options + eptrb pointer to chain of blocks containing eptr at start of + brackets - for testing for empty matches + flags can contain + match_condassert - this is an assertion condition + match_cbegroup - this is the start of an unlimited repeat + group that can match an empty string + rdepth the recursion depth + +Returns: MATCH_MATCH if matched ) these values are >= 0 + MATCH_NOMATCH if failed to match ) + a negative PCRE_ERROR_xxx value if aborted by an error condition + (e.g. stopped by repeated call or recursion limit) +*/ + +static int +match(REGISTER USPTR eptr, REGISTER const uschar *ecode, const uschar *mstart, + int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, + int flags, unsigned int rdepth) +{ +/* These variables do not need to be preserved over recursion in this function, +so they can be ordinary variables in all cases. Mark some of them with +"register" because they are used a lot in loops. */ + +register int rrc; /* Returns from recursive calls */ +register int i; /* Used for loops not involving calls to RMATCH() */ +register unsigned int c; /* Character values not kept over RMATCH() calls */ +register BOOL utf8; /* Local copy of UTF-8 flag for speed */ + +BOOL minimize, possessive; /* Quantifier options */ + +/* When recursion is not being used, all "local" variables that have to be +preserved over calls to RMATCH() are part of a "frame" which is obtained from +heap storage. Set up the top-level frame here; others are obtained from the +heap whenever RMATCH() does a "recursion". See the macro definitions above. */ + +#ifdef NO_RECURSE +heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe)); +frame->Xprevframe = NULL; /* Marks the top level */ + +/* Copy in the original argument variables */ + +frame->Xeptr = eptr; +frame->Xecode = ecode; +frame->Xmstart = mstart; +frame->Xoffset_top = offset_top; +frame->Xims = ims; +frame->Xeptrb = eptrb; +frame->Xflags = flags; +frame->Xrdepth = rdepth; + +/* This is where control jumps back to to effect "recursion" */ + +HEAP_RECURSE: + +/* Macros make the argument variables come from the current frame */ + +#define eptr frame->Xeptr +#define ecode frame->Xecode +#define mstart frame->Xmstart +#define offset_top frame->Xoffset_top +#define ims frame->Xims +#define eptrb frame->Xeptrb +#define flags frame->Xflags +#define rdepth frame->Xrdepth + +/* Ditto for the local variables */ + +#ifdef SUPPORT_UTF8 +#define charptr frame->Xcharptr +#endif +#define callpat frame->Xcallpat +#define data frame->Xdata +#define next frame->Xnext +#define pp frame->Xpp +#define prev frame->Xprev +#define saved_eptr frame->Xsaved_eptr + +#define new_recursive frame->Xnew_recursive + +#define cur_is_word frame->Xcur_is_word +#define condition frame->Xcondition +#define prev_is_word frame->Xprev_is_word + +#define original_ims frame->Xoriginal_ims + +#ifdef SUPPORT_UCP +#define prop_type frame->Xprop_type +#define prop_value frame->Xprop_value +#define prop_fail_result frame->Xprop_fail_result +#define prop_category frame->Xprop_category +#define prop_chartype frame->Xprop_chartype +#define prop_script frame->Xprop_script +#define oclength frame->Xoclength +#define occhars frame->Xocchars +#endif + +#define ctype frame->Xctype +#define fc frame->Xfc +#define fi frame->Xfi +#define length frame->Xlength +#define max frame->Xmax +#define min frame->Xmin +#define number frame->Xnumber +#define offset frame->Xoffset +#define op frame->Xop +#define save_capture_last frame->Xsave_capture_last +#define save_offset1 frame->Xsave_offset1 +#define save_offset2 frame->Xsave_offset2 +#define save_offset3 frame->Xsave_offset3 +#define stacksave frame->Xstacksave + +#define newptrb frame->Xnewptrb + +/* When recursion is being used, local variables are allocated on the stack and +get preserved during recursion in the normal way. In this environment, fi and +i, and fc and c, can be the same variables. */ + +#else /* NO_RECURSE not defined */ +#define fi i +#define fc c + + +#ifdef SUPPORT_UTF8 /* Many of these variables are used only */ +const uschar *charptr; /* in small blocks of the code. My normal */ +#endif /* style of coding would have declared */ +const uschar *callpat; /* them within each of those blocks. */ +const uschar *data; /* However, in order to accommodate the */ +const uschar *next; /* version of this code that uses an */ +USPTR pp; /* external "stack" implemented on the */ +const uschar *prev; /* heap, it is easier to declare them all */ +USPTR saved_eptr; /* here, so the declarations can be cut */ + /* out in a block. The only declarations */ +recursion_info new_recursive; /* within blocks below are for variables */ + /* that do not have to be preserved over */ +BOOL cur_is_word; /* a recursive call to RMATCH(). */ +BOOL condition; +BOOL prev_is_word; + +unsigned long int original_ims; + +#ifdef SUPPORT_UCP +int prop_type; +int prop_value; +int prop_fail_result; +int prop_category; +int prop_chartype; +int prop_script; +int oclength; +uschar occhars[8]; +#endif + +int ctype; +int length; +int max; +int min; +int number; +int offset; +int op; +int save_capture_last; +int save_offset1, save_offset2, save_offset3; +int stacksave[REC_STACK_SAVE_MAX]; + +eptrblock newptrb; +#endif /* NO_RECURSE */ + +/* These statements are here to stop the compiler complaining about unitialized +variables. */ + +#ifdef SUPPORT_UCP +prop_value = 0; +prop_fail_result = 0; +#endif + + +/* This label is used for tail recursion, which is used in a few cases even +when NO_RECURSE is not defined, in order to reduce the amount of stack that is +used. Thanks to Ian Taylor for noticing this possibility and sending the +original patch. */ + +TAIL_RECURSE: + +/* OK, now we can get on with the real code of the function. Recursive calls +are specified by the macro RMATCH and RRETURN is used to return. When +NO_RECURSE is *not* defined, these just turn into a recursive call to match() +and a "return", respectively (possibly with some debugging if DEBUG is +defined). However, RMATCH isn't like a function call because it's quite a +complicated macro. It has to be used in one particular way. This shouldn't, +however, impact performance when true recursion is being used. */ + +#ifdef SUPPORT_UTF8 +utf8 = md->utf8; /* Local copy of the flag */ +#else +utf8 = FALSE; +#endif + +/* First check that we haven't called match() too many times, or that we +haven't exceeded the recursive call limit. */ + +if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT); +if (rdepth >= md->match_limit_recursion) RRETURN(PCRE_ERROR_RECURSIONLIMIT); + +original_ims = ims; /* Save for resetting on ')' */ + +/* At the start of a group with an unlimited repeat that may match an empty +string, the match_cbegroup flag is set. When this is the case, add the current +subject pointer to the chain of such remembered pointers, to be checked when we +hit the closing ket, in order to break infinite loops that match no characters. +When match() is called in other circumstances, don't add to the chain. The +match_cbegroup flag must NOT be used with tail recursion, because the memory +block that is used is on the stack, so a new one may be required for each +match(). */ + +if ((flags & match_cbegroup) != 0) + { + newptrb.epb_saved_eptr = eptr; + newptrb.epb_prev = eptrb; + eptrb = &newptrb; + } + +/* Now start processing the opcodes. */ + +for (;;) + { + minimize = possessive = FALSE; + op = *ecode; + + /* For partial matching, remember if we ever hit the end of the subject after + matching at least one subject character. */ + + if (md->partial && + eptr >= md->end_subject && + eptr > mstart) + md->hitend = TRUE; + + switch(op) + { + case OP_FAIL: + RRETURN(MATCH_NOMATCH); + + case OP_PRUNE: + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, + ims, eptrb, flags, RM51); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + RRETURN(MATCH_PRUNE); + + case OP_COMMIT: + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, + ims, eptrb, flags, RM52); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + RRETURN(MATCH_COMMIT); + + case OP_SKIP: + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, + ims, eptrb, flags, RM53); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->start_match_ptr = eptr; /* Pass back current position */ + RRETURN(MATCH_SKIP); + + case OP_THEN: + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, + ims, eptrb, flags, RM54); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + RRETURN(MATCH_THEN); + + /* Handle a capturing bracket. If there is space in the offset vector, save + the current subject position in the working slot at the top of the vector. + We mustn't change the current values of the data slot, because they may be + set from a previous iteration of this group, and be referred to by a + reference inside the group. + + If the bracket fails to match, we need to restore this value and also the + values of the final offsets, in case they were set by a previous iteration + of the same bracket. + + If there isn't enough space in the offset vector, treat this as if it were + a non-capturing bracket. Don't worry about setting the flag for the error + case here; that is handled in the code for KET. */ + + case OP_CBRA: + case OP_SCBRA: + number = GET2(ecode, 1+LINK_SIZE); + offset = number << 1; + +#ifdef DEBUG + printf("start bracket %d\n", number); + printf("subject="); + pchars(eptr, 16, TRUE, md); + printf("\n"); +#endif + + if (offset < md->offset_max) + { + save_offset1 = md->offset_vector[offset]; + save_offset2 = md->offset_vector[offset+1]; + save_offset3 = md->offset_vector[md->offset_end - number]; + save_capture_last = md->capture_last; + + DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); + md->offset_vector[md->offset_end - number] = eptr - md->start_subject; + + flags = (op == OP_SCBRA)? match_cbegroup : 0; + do + { + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, + ims, eptrb, flags, RM1); + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + md->capture_last = save_capture_last; + ecode += GET(ecode, 1); + } + while (*ecode == OP_ALT); + + DPRINTF(("bracket %d failed\n", number)); + + md->offset_vector[offset] = save_offset1; + md->offset_vector[offset+1] = save_offset2; + md->offset_vector[md->offset_end - number] = save_offset3; + + RRETURN(MATCH_NOMATCH); + } + + /* FALL THROUGH ... Insufficient room for saving captured contents. Treat + as a non-capturing bracket. */ + + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + + DPRINTF(("insufficient capture room: treat as non-capturing\n")); + + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + /* VVVVVVVVVVVVVVVVVVVVVVVVV */ + + /* Non-capturing bracket. Loop for all the alternatives. When we get to the + final alternative within the brackets, we would return the result of a + recursive call to match() whatever happened. We can reduce stack usage by + turning this into a tail recursion, except in the case when match_cbegroup + is set.*/ + + case OP_BRA: + case OP_SBRA: + DPRINTF(("start non-capturing bracket\n")); + flags = (op >= OP_SBRA)? match_cbegroup : 0; + for (;;) + { + if (ecode[GET(ecode, 1)] != OP_ALT) /* Final alternative */ + { + if (flags == 0) /* Not a possibly empty group */ + { + ecode += _pcre_OP_lengths[*ecode]; + DPRINTF(("bracket 0 tail recursion\n")); + goto TAIL_RECURSE; + } + + /* Possibly empty group; can't use tail recursion. */ + + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, + eptrb, flags, RM48); + RRETURN(rrc); + } + + /* For non-final alternatives, continue the loop for a NOMATCH result; + otherwise return. */ + + RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, + eptrb, flags, RM2); + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + ecode += GET(ecode, 1); + } + /* Control never reaches here. */ + + /* Conditional group: compilation checked that there are no more than + two branches. If the condition is false, skipping the first branch takes us + past the end if there is only one branch, but that's OK because that is + exactly what going to the ket would do. As there is only one branch to be + obeyed, we can use tail recursion to avoid using another stack frame. */ + + case OP_COND: + case OP_SCOND: + if (ecode[LINK_SIZE+1] == OP_RREF) /* Recursion test */ + { + offset = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ + condition = md->recursive != NULL && + (offset == RREF_ANY || offset == md->recursive->group_num); + ecode += condition? 3 : GET(ecode, 1); + } + + else if (ecode[LINK_SIZE+1] == OP_CREF) /* Group used test */ + { + offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ + condition = offset < offset_top && md->offset_vector[offset] >= 0; + ecode += condition? 3 : GET(ecode, 1); + } + + else if (ecode[LINK_SIZE+1] == OP_DEF) /* DEFINE - always false */ + { + condition = FALSE; + ecode += GET(ecode, 1); + } + + /* The condition is an assertion. Call match() to evaluate it - setting + the final argument match_condassert causes it to stop at the end of an + assertion. */ + + else + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, + match_condassert, RM3); + if (rrc == MATCH_MATCH) + { + condition = TRUE; + ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE + 2); + while (*ecode == OP_ALT) ecode += GET(ecode, 1); + } + else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) + { + RRETURN(rrc); /* Need braces because of following else */ + } + else + { + condition = FALSE; + ecode += GET(ecode, 1); + } + } + + /* We are now at the branch that is to be obeyed. As there is only one, + we can use tail recursion to avoid using another stack frame, except when + match_cbegroup is required for an unlimited repeat of a possibly empty + group. If the second alternative doesn't exist, we can just plough on. */ + + if (condition || *ecode == OP_ALT) + { + ecode += 1 + LINK_SIZE; + if (op == OP_SCOND) /* Possibly empty group */ + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, match_cbegroup, RM49); + RRETURN(rrc); + } + else /* Group must match something */ + { + flags = 0; + goto TAIL_RECURSE; + } + } + else /* Condition false & no 2nd alternative */ + { + ecode += 1 + LINK_SIZE; + } + break; + + + /* End of the pattern, either real or forced. If we are in a top-level + recursion, we should restore the offsets appropriately and continue from + after the call. */ + + case OP_ACCEPT: + case OP_END: + if (md->recursive != NULL && md->recursive->group_num == 0) + { + recursion_info *rec = md->recursive; + DPRINTF(("End of pattern in a (?0) recursion\n")); + md->recursive = rec->prevrec; + memmove(md->offset_vector, rec->offset_save, + rec->saved_max * sizeof(int)); + mstart = rec->save_start; + ims = original_ims; + ecode = rec->after_call; + break; + } + + /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty + string - backtracking will then try other alternatives, if any. */ + + if (md->notempty && eptr == mstart) RRETURN(MATCH_NOMATCH); + md->end_match_ptr = eptr; /* Record where we ended */ + md->end_offset_top = offset_top; /* and how many extracts were taken */ + md->start_match_ptr = mstart; /* and the start (\K can modify) */ + RRETURN(MATCH_MATCH); + + /* Change option settings */ + + case OP_OPT: + ims = ecode[1]; + ecode += 2; + DPRINTF(("ims set to %02lx\n", ims)); + break; + + /* Assertion brackets. Check the alternative branches in turn - the + matching won't pass the KET for an assertion. If any one branch matches, + the assertion is true. Lookbehind assertions have an OP_REVERSE item at the + start of each branch to move the current point backwards, so the code at + this level is identical to the lookahead case. */ + + case OP_ASSERT: + case OP_ASSERTBACK: + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0, + RM4); + if (rrc == MATCH_MATCH) break; + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + ecode += GET(ecode, 1); + } + while (*ecode == OP_ALT); + if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH); + + /* If checking an assertion for a condition, return MATCH_MATCH. */ + + if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); + + /* Continue from after the assertion, updating the offsets high water + mark, since extracts may have been taken during the assertion. */ + + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + ecode += 1 + LINK_SIZE; + offset_top = md->end_offset_top; + continue; + + /* Negative assertion: all branches must fail to match */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK_NOT: + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0, + RM5); + if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH); + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + ecode += GET(ecode,1); + } + while (*ecode == OP_ALT); + + if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); + + ecode += 1 + LINK_SIZE; + continue; + + /* Move the subject pointer back. This occurs only at the start of + each branch of a lookbehind assertion. If we are too close to the start to + move back, this match function fails. When working with UTF-8 we move + back a number of characters, not bytes. */ + + case OP_REVERSE: +#ifdef SUPPORT_UTF8 + if (utf8) + { + i = GET(ecode, 1); + while (i-- > 0) + { + eptr--; + if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); + BACKCHAR(eptr); + } + } + else +#endif + + /* No UTF-8 support, or not in UTF-8 mode: count is byte count */ + + { + eptr -= GET(ecode, 1); + if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); + } + + /* Skip to next op code */ + + ecode += 1 + LINK_SIZE; + break; + + /* The callout item calls an external function, if one is provided, passing + details of the match so far. This is mainly for debugging, though the + function is able to force a failure. */ + + case OP_CALLOUT: + if (pcre_callout != NULL) + { + pcre_callout_block cb; + cb.version = 1; /* Version 1 of the callout block */ + cb.callout_number = ecode[1]; + cb.offset_vector = md->offset_vector; + cb.subject = (PCRE_SPTR)md->start_subject; + cb.subject_length = md->end_subject - md->start_subject; + cb.start_match = mstart - md->start_subject; + cb.current_position = eptr - md->start_subject; + cb.pattern_position = GET(ecode, 2); + cb.next_item_length = GET(ecode, 2 + LINK_SIZE); + cb.capture_top = offset_top/2; + cb.capture_last = md->capture_last; + cb.callout_data = md->callout_data; + if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH); + if (rrc < 0) RRETURN(rrc); + } + ecode += 2 + 2*LINK_SIZE; + break; + + /* Recursion either matches the current regex, or some subexpression. The + offset data is the offset to the starting bracket from the start of the + whole pattern. (This is so that it works from duplicated subpatterns.) + + If there are any capturing brackets started but not finished, we have to + save their starting points and reinstate them after the recursion. However, + we don't know how many such there are (offset_top records the completed + total) so we just have to save all the potential data. There may be up to + 65535 such values, which is too large to put on the stack, but using malloc + for small numbers seems expensive. As a compromise, the stack is used when + there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc + is used. A problem is what to do if the malloc fails ... there is no way of + returning to the top level with an error. Save the top REC_STACK_SAVE_MAX + values on the stack, and accept that the rest may be wrong. + + There are also other values that have to be saved. We use a chained + sequence of blocks that actually live on the stack. Thanks to Robin Houston + for the original version of this logic. */ + + case OP_RECURSE: + { + callpat = md->start_code + GET(ecode, 1); + new_recursive.group_num = (callpat == md->start_code)? 0 : + GET2(callpat, 1 + LINK_SIZE); + + /* Add to "recursing stack" */ + + new_recursive.prevrec = md->recursive; + md->recursive = &new_recursive; + + /* Find where to continue from afterwards */ + + ecode += 1 + LINK_SIZE; + new_recursive.after_call = ecode; + + /* Now save the offset data. */ + + new_recursive.saved_max = md->offset_end; + if (new_recursive.saved_max <= REC_STACK_SAVE_MAX) + new_recursive.offset_save = stacksave; + else + { + new_recursive.offset_save = + (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int)); + if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY); + } + + memcpy(new_recursive.offset_save, md->offset_vector, + new_recursive.saved_max * sizeof(int)); + new_recursive.save_start = mstart; + mstart = eptr; + + /* OK, now we can do the recursion. For each top-level alternative we + restore the offset and recursion data. */ + + DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); + flags = (*callpat >= OP_SBRA)? match_cbegroup : 0; + do + { + RMATCH(eptr, callpat + _pcre_OP_lengths[*callpat], offset_top, + md, ims, eptrb, flags, RM6); + if (rrc == MATCH_MATCH) + { + DPRINTF(("Recursion matched\n")); + md->recursive = new_recursive.prevrec; + if (new_recursive.offset_save != stacksave) + (pcre_free)(new_recursive.offset_save); + RRETURN(MATCH_MATCH); + } + else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) + { + DPRINTF(("Recursion gave error %d\n", rrc)); + RRETURN(rrc); + } + + md->recursive = &new_recursive; + memcpy(md->offset_vector, new_recursive.offset_save, + new_recursive.saved_max * sizeof(int)); + callpat += GET(callpat, 1); + } + while (*callpat == OP_ALT); + + DPRINTF(("Recursion didn't match\n")); + md->recursive = new_recursive.prevrec; + if (new_recursive.offset_save != stacksave) + (pcre_free)(new_recursive.offset_save); + RRETURN(MATCH_NOMATCH); + } + /* Control never reaches here */ + + /* "Once" brackets are like assertion brackets except that after a match, + the point in the subject string is not moved back. Thus there can never be + a move back into the brackets. Friedl calls these "atomic" subpatterns. + Check the alternative branches in turn - the matching won't pass the KET + for this kind of subpattern. If any one branch matches, we carry on as at + the end of a normal bracket, leaving the subject pointer. */ + + case OP_ONCE: + prev = ecode; + saved_eptr = eptr; + + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM7); + if (rrc == MATCH_MATCH) break; + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + ecode += GET(ecode,1); + } + while (*ecode == OP_ALT); + + /* If hit the end of the group (which could be repeated), fail */ + + if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH); + + /* Continue as from after the assertion, updating the offsets high water + mark, since extracts may have been taken. */ + + do ecode += GET(ecode, 1); while (*ecode == OP_ALT); + + offset_top = md->end_offset_top; + eptr = md->end_match_ptr; + + /* For a non-repeating ket, just continue at this level. This also + happens for a repeating ket if no characters were matched in the group. + This is the forcible breaking of infinite loops as implemented in Perl + 5.005. If there is an options reset, it will get obeyed in the normal + course of events. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + ecode += 1+LINK_SIZE; + break; + } + + /* The repeating kets try the rest of the pattern or restart from the + preceding bracket, in the appropriate order. The second "call" of match() + uses tail recursion, to avoid using another stack frame. We need to reset + any options that changed within the bracket before re-running it, so + check the next opcode. */ + + if (ecode[1+LINK_SIZE] == OP_OPT) + { + ims = (ims & ~PCRE_IMS) | ecode[4]; + DPRINTF(("ims set to %02lx at group repeat\n", ims)); + } + + if (*ecode == OP_KETRMIN) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM8); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode = prev; + flags = 0; + goto TAIL_RECURSE; + } + else /* OP_KETRMAX */ + { + RMATCH(eptr, prev, offset_top, md, ims, eptrb, match_cbegroup, RM9); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += 1 + LINK_SIZE; + flags = 0; + goto TAIL_RECURSE; + } + /* Control never gets here */ + + /* An alternation is the end of a branch; scan along to find the end of the + bracketed group and go to there. */ + + case OP_ALT: + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + break; + + /* BRAZERO, BRAMINZERO and SKIPZERO occur just before a bracket group, + indicating that it may occur zero times. It may repeat infinitely, or not + at all - i.e. it could be ()* or ()? or even (){0} in the pattern. Brackets + with fixed upper repeat limits are compiled as a number of copies, with the + optional ones preceded by BRAZERO or BRAMINZERO. */ + + case OP_BRAZERO: + { + next = ecode+1; + RMATCH(eptr, next, offset_top, md, ims, eptrb, 0, RM10); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + do next += GET(next,1); while (*next == OP_ALT); + ecode = next + 1 + LINK_SIZE; + } + break; + + case OP_BRAMINZERO: + { + next = ecode+1; + do next += GET(next, 1); while (*next == OP_ALT); + RMATCH(eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0, RM11); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode++; + } + break; + + case OP_SKIPZERO: + { + next = ecode+1; + do next += GET(next,1); while (*next == OP_ALT); + ecode = next + 1 + LINK_SIZE; + } + break; + + /* End of a group, repeated or non-repeating. */ + + case OP_KET: + case OP_KETRMIN: + case OP_KETRMAX: + prev = ecode - GET(ecode, 1); + + /* If this was a group that remembered the subject start, in order to break + infinite repeats of empty string matches, retrieve the subject start from + the chain. Otherwise, set it NULL. */ + + if (*prev >= OP_SBRA) + { + saved_eptr = eptrb->epb_saved_eptr; /* Value at start of group */ + eptrb = eptrb->epb_prev; /* Backup to previous group */ + } + else saved_eptr = NULL; + + /* If we are at the end of an assertion group, stop matching and return + MATCH_MATCH, but record the current high water mark for use by positive + assertions. Do this also for the "once" (atomic) groups. */ + + if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || + *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || + *prev == OP_ONCE) + { + md->end_match_ptr = eptr; /* For ONCE */ + md->end_offset_top = offset_top; + RRETURN(MATCH_MATCH); + } + + /* For capturing groups we have to check the group number back at the start + and if necessary complete handling an extraction by setting the offsets and + bumping the high water mark. Note that whole-pattern recursion is coded as + a recurse into group 0, so it won't be picked up here. Instead, we catch it + when the OP_END is reached. Other recursion is handled here. */ + + if (*prev == OP_CBRA || *prev == OP_SCBRA) + { + number = GET2(prev, 1+LINK_SIZE); + offset = number << 1; + +#ifdef DEBUG + printf("end bracket %d", number); + printf("\n"); +#endif + + md->capture_last = number; + if (offset >= md->offset_max) md->offset_overflow = TRUE; else + { + md->offset_vector[offset] = + md->offset_vector[md->offset_end - number]; + md->offset_vector[offset+1] = eptr - md->start_subject; + if (offset_top <= offset) offset_top = offset + 2; + } + + /* Handle a recursively called group. Restore the offsets + appropriately and continue from after the call. */ + + if (md->recursive != NULL && md->recursive->group_num == number) + { + recursion_info *rec = md->recursive; + DPRINTF(("Recursion (%d) succeeded - continuing\n", number)); + md->recursive = rec->prevrec; + mstart = rec->save_start; + memcpy(md->offset_vector, rec->offset_save, + rec->saved_max * sizeof(int)); + ecode = rec->after_call; + ims = original_ims; + break; + } + } + + /* For both capturing and non-capturing groups, reset the value of the ims + flags, in case they got changed during the group. */ + + ims = original_ims; + DPRINTF(("ims reset to %02lx\n", ims)); + + /* For a non-repeating ket, just continue at this level. This also + happens for a repeating ket if no characters were matched in the group. + This is the forcible breaking of infinite loops as implemented in Perl + 5.005. If there is an options reset, it will get obeyed in the normal + course of events. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + ecode += 1 + LINK_SIZE; + break; + } + + /* The repeating kets try the rest of the pattern or restart from the + preceding bracket, in the appropriate order. In the second case, we can use + tail recursion to avoid using another stack frame, unless we have an + unlimited repeat of a group that can match an empty string. */ + + flags = (*prev >= OP_SBRA)? match_cbegroup : 0; + + if (*ecode == OP_KETRMIN) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM12); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (flags != 0) /* Could match an empty string */ + { + RMATCH(eptr, prev, offset_top, md, ims, eptrb, flags, RM50); + RRETURN(rrc); + } + ecode = prev; + goto TAIL_RECURSE; + } + else /* OP_KETRMAX */ + { + RMATCH(eptr, prev, offset_top, md, ims, eptrb, flags, RM13); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += 1 + LINK_SIZE; + flags = 0; + goto TAIL_RECURSE; + } + /* Control never gets here */ + + /* Start of subject unless notbol, or after internal newline if multiline */ + + case OP_CIRC: + if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); + if ((ims & PCRE_MULTILINE) != 0) + { + if (eptr != md->start_subject && + (eptr == md->end_subject || !WAS_NEWLINE(eptr))) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + } + /* ... else fall through */ + + /* Start of subject assertion */ + + case OP_SOD: + if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Start of match assertion */ + + case OP_SOM: + if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Reset the start of match point */ + + case OP_SET_SOM: + mstart = eptr; + ecode++; + break; + + /* Assert before internal newline if multiline, or before a terminating + newline unless endonly is set, else end of subject unless noteol is set. */ + + case OP_DOLL: + if ((ims & PCRE_MULTILINE) != 0) + { + if (eptr < md->end_subject) + { if (!IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); } + else + { if (md->noteol) RRETURN(MATCH_NOMATCH); } + ecode++; + break; + } + else + { + if (md->noteol) RRETURN(MATCH_NOMATCH); + if (!md->endonly) + { + if (eptr != md->end_subject && + (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen)) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + } + } + /* ... else fall through for endonly */ + + /* End of subject assertion (\z) */ + + case OP_EOD: + if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* End of subject or ending \n assertion (\Z) */ + + case OP_EODN: + if (eptr != md->end_subject && + (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen)) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Word boundary assertions */ + + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + { + + /* Find out if the previous and current characters are "word" characters. + It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to + be "non-word" characters. */ + +#ifdef SUPPORT_UTF8 + if (utf8) + { + if (eptr == md->start_subject) prev_is_word = FALSE; else + { + const uschar *lastptr = eptr - 1; + while((*lastptr & 0xc0) == 0x80) lastptr--; + GETCHAR(c, lastptr); + prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; + } + if (eptr >= md->end_subject) cur_is_word = FALSE; else + { + GETCHAR(c, eptr); + cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; + } + } + else +#endif + + /* More streamlined when not in UTF-8 mode */ + + { + prev_is_word = (eptr != md->start_subject) && + ((md->ctypes[eptr[-1]] & ctype_word) != 0); + cur_is_word = (eptr < md->end_subject) && + ((md->ctypes[*eptr] & ctype_word) != 0); + } + + /* Now see if the situation is what we want */ + + if ((*ecode++ == OP_WORD_BOUNDARY)? + cur_is_word == prev_is_word : cur_is_word != prev_is_word) + RRETURN(MATCH_NOMATCH); + } + break; + + /* Match a single character type; inline for speed */ + + case OP_ANY: + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + /* Fall through */ + + case OP_ALLANY: + if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + ecode++; + break; + + /* Match a single byte, even in UTF-8 mode. This opcode really does match + any byte, even newline, independent of the setting of PCRE_DOTALL. */ + + case OP_ANYBYTE: + if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_DIGIT: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + if ( +#ifdef SUPPORT_UTF8 + c < 256 && +#endif + (md->ctypes[c] & ctype_digit) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_DIGIT: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + if ( +#ifdef SUPPORT_UTF8 + c >= 256 || +#endif + (md->ctypes[c] & ctype_digit) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_WHITESPACE: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + if ( +#ifdef SUPPORT_UTF8 + c < 256 && +#endif + (md->ctypes[c] & ctype_space) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_WHITESPACE: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + if ( +#ifdef SUPPORT_UTF8 + c >= 256 || +#endif + (md->ctypes[c] & ctype_space) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_WORDCHAR: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + if ( +#ifdef SUPPORT_UTF8 + c < 256 && +#endif + (md->ctypes[c] & ctype_word) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_WORDCHAR: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + if ( +#ifdef SUPPORT_UTF8 + c >= 256 || +#endif + (md->ctypes[c] & ctype_word) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_ANYNL: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x000d: + if (eptr < md->end_subject && *eptr == 0x0a) eptr++; + break; + + case 0x000a: + break; + + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + ecode++; + break; + + case OP_NOT_HSPACE: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + switch(c) + { + default: break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + RRETURN(MATCH_NOMATCH); + } + ecode++; + break; + + case OP_HSPACE: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + break; + } + ecode++; + break; + + case OP_NOT_VSPACE: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + switch(c) + { + default: break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + RRETURN(MATCH_NOMATCH); + } + ecode++; + break; + + case OP_VSPACE: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + break; + } + ecode++; + break; + +#ifdef SUPPORT_UCP + /* Check the next character by Unicode property. We will get here only + if the support is in the binary; otherwise a compile-time error occurs. */ + + case OP_PROP: + case OP_NOTPROP: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + { + int chartype = UCD_CHARTYPE(c); + switch(ecode[1]) + { + case PT_ANY: + if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH); + break; + + case PT_LAMP: + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + chartype == ucp_Lt) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_GC: + if ((ecode[2] != _pcre_ucp_gentype[chartype]) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_PC: + if ((ecode[2] != chartype) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_SC: + if ((ecode[2] != UCD_SCRIPT(c)) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + ecode += 3; + } + break; + + /* Match an extended Unicode sequence. We will get here only if the support + is in the binary; otherwise a compile-time error occurs. */ + + case OP_EXTUNI: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + { + int category = UCD_CATEGORY(c); + if (category == ucp_M) RRETURN(MATCH_NOMATCH); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf8) c = *eptr; else + { + GETCHARLEN(c, eptr, len); + } + category = UCD_CATEGORY(c); + if (category != ucp_M) break; + eptr += len; + } + } + ecode++; + break; +#endif + + + /* Match a back reference, possibly repeatedly. Look past the end of the + item to see if there is repeat information following. The code is similar + to that for character classes, but repeated for efficiency. Then obey + similar code to character type repeats - written out again for speed. + However, if the referenced string is the empty string, always treat + it as matched, any number of times (otherwise there could be infinite + loops). */ + + case OP_REF: + { + offset = GET2(ecode, 1) << 1; /* Doubled ref number */ + ecode += 3; + + /* If the reference is unset, there are two possibilities: + + (a) In the default, Perl-compatible state, set the length to be longer + than the amount of subject left; this ensures that every attempt at a + match fails. We can't just fail here, because of the possibility of + quantifiers with zero minima. + + (b) If the JavaScript compatibility flag is set, set the length to zero + so that the back reference matches an empty string. + + Otherwise, set the length to the length of what was matched by the + referenced subpattern. */ + + if (offset >= offset_top || md->offset_vector[offset] < 0) + length = (md->jscript_compat)? 0 : md->end_subject - eptr + 1; + else + length = md->offset_vector[offset+1] - md->offset_vector[offset]; + + /* Set up for repetition, or handle the non-repeated case */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + c = *ecode++ - OP_CRSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + minimize = (*ecode == OP_CRMINRANGE); + min = GET2(ecode, 1); + max = GET2(ecode, 3); + if (max == 0) max = INT_MAX; + ecode += 5; + break; + + default: /* No repeat follows */ + if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); + eptr += length; + continue; /* With the main loop */ + } + + /* If the length of the reference is zero, just continue with the + main loop. */ + + if (length == 0) continue; + + /* First, ensure the minimum number of matches are present. We get back + the length of the reference string explicitly rather than passing the + address of eptr, so that eptr can be a register variable. */ + + for (i = 1; i <= min; i++) + { + if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); + eptr += length; + } + + /* If min = max, continue at the same level without recursion. + They are not both allowed to be zero. */ + + if (min == max) continue; + + /* If minimizing, keep trying and advancing the pointer */ + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || !match_ref(offset, eptr, length, md, ims)) + RRETURN(MATCH_NOMATCH); + eptr += length; + } + /* Control never gets here */ + } + + /* If maximizing, find the longest string and work backwards */ + + else + { + pp = eptr; + for (i = min; i < max; i++) + { + if (!match_ref(offset, eptr, length, md, ims)) break; + eptr += length; + } + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr -= length; + } + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + + + + /* Match a bit-mapped character class, possibly repeatedly. This op code is + used when all the characters in the class have values in the range 0-255, + and either the matching is caseful, or the characters are in the range + 0-127 when UTF-8 processing is enabled. The only difference between + OP_CLASS and OP_NCLASS occurs when a data character outside the range is + encountered. + + First, look past the end of the item to see if there is repeat information + following. Then obey similar code to character type repeats - written out + again for speed. */ + + case OP_NCLASS: + case OP_CLASS: + { + data = ecode + 1; /* Save for matching */ + ecode += 33; /* Advance past the item */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + c = *ecode++ - OP_CRSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + minimize = (*ecode == OP_CRMINRANGE); + min = GET2(ecode, 1); + max = GET2(ecode, 3); + if (max == 0) max = INT_MAX; + ecode += 5; + break; + + default: /* No repeat follows */ + min = max = 1; + break; + } + + /* First, ensure the minimum number of matches are present. */ + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else + { + if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + c = *eptr++; + if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + + /* If max == min we can continue with the main loop without the + need to recurse. */ + + if (min == max) continue; + + /* If minimizing, keep testing the rest of the expression and advancing + the pointer while it matches the class. */ + + if (minimize) + { +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else + { + if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + c = *eptr++; + if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + /* If maximizing, find the longest possible run, then work backwards. */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c > 255) + { + if (op == OP_CLASS) break; + } + else + { + if ((data[c/8] & (1 << (c&7))) == 0) break; + } + eptr += len; + } + for (;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + c = *eptr; + if ((data[c/8] & (1 << (c&7))) == 0) break; + eptr++; + } + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + + + /* Match an extended character class. This opcode is encountered only + in UTF-8 mode, because that's the only time it is compiled. */ + +#ifdef SUPPORT_UTF8 + case OP_XCLASS: + { + data = ecode + 1 + LINK_SIZE; /* Save for matching */ + ecode += GET(ecode, 1); /* Advance past the item */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + c = *ecode++ - OP_CRSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + minimize = (*ecode == OP_CRMINRANGE); + min = GET2(ecode, 1); + max = GET2(ecode, 3); + if (max == 0) max = INT_MAX; + ecode += 5; + break; + + default: /* No repeat follows */ + min = max = 1; + break; + } + + /* First, ensure the minimum number of matches are present. */ + + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); + } + + /* If max == min we can continue with the main loop without the + need to recurse. */ + + if (min == max) continue; + + /* If minimizing, keep testing the rest of the expression and advancing + the pointer while it matches the class. */ + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + + /* If maximizing, find the longest possible run, then work backwards. */ + + else + { + pp = eptr; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (!_pcre_xclass(c, data)) break; + eptr += len; + } + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + if (utf8) BACKCHAR(eptr); + } + RRETURN(MATCH_NOMATCH); + } + + /* Control never gets here */ + } +#endif /* End of XCLASS */ + + /* Match a single character, casefully */ + + case OP_CHAR: +#ifdef SUPPORT_UTF8 + if (utf8) + { + length = 1; + ecode++; + GETCHARLEN(fc, ecode, length); + if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); + } + else +#endif + + /* Non-UTF-8 mode */ + { + if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); + if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); + ecode += 2; + } + break; + + /* Match a single character, caselessly */ + + case OP_CHARNC: +#ifdef SUPPORT_UTF8 + if (utf8) + { + length = 1; + ecode++; + GETCHARLEN(fc, ecode, length); + + if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + + /* If the pattern character's value is < 128, we have only one byte, and + can use the fast lookup table. */ + + if (fc < 128) + { + if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); + } + + /* Otherwise we must pick up the subject character */ + + else + { + unsigned int dc; + GETCHARINC(dc, eptr); + ecode += length; + + /* If we have Unicode property support, we can use it to test the other + case of the character, if there is one. */ + + if (fc != dc) + { +#ifdef SUPPORT_UCP + if (dc != UCD_OTHERCASE(fc)) +#endif + RRETURN(MATCH_NOMATCH); + } + } + } + else +#endif /* SUPPORT_UTF8 */ + + /* Non-UTF-8 mode */ + { + if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); + if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); + ecode += 2; + } + break; + + /* Match a single character repeatedly. */ + + case OP_EXACT: + min = max = GET2(ecode, 1); + ecode += 3; + goto REPEATCHAR; + + case OP_POSUPTO: + possessive = TRUE; + /* Fall through */ + + case OP_UPTO: + case OP_MINUPTO: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_MINUPTO; + ecode += 3; + goto REPEATCHAR; + + case OP_POSSTAR: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATCHAR; + + case OP_POSPLUS: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATCHAR; + + case OP_POSQUERY: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATCHAR; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + c = *ecode++ - OP_STAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single-character matches. We can give + up quickly if there are fewer than the minimum number of characters left in + the subject. */ + + REPEATCHAR: +#ifdef SUPPORT_UTF8 + if (utf8) + { + length = 1; + charptr = ecode; + GETCHARLEN(fc, ecode, length); + if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + ecode += length; + + /* Handle multibyte character matching specially here. There is + support for caseless matching if UCP support is present. */ + + if (length > 1) + { +#ifdef SUPPORT_UCP + unsigned int othercase; + if ((ims & PCRE_CASELESS) != 0 && + (othercase = UCD_OTHERCASE(fc)) != fc) + oclength = _pcre_ord2utf8(othercase, occhars); + else oclength = 0; +#endif /* SUPPORT_UCP */ + + for (i = 1; i <= min; i++) + { + if (memcmp(eptr, charptr, length) == 0) eptr += length; +#ifdef SUPPORT_UCP + /* Need braces because of following else */ + else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } + else + { + if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); + eptr += oclength; + } +#else /* without SUPPORT_UCP */ + else { RRETURN(MATCH_NOMATCH); } +#endif /* SUPPORT_UCP */ + } + + if (min == max) continue; + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + if (memcmp(eptr, charptr, length) == 0) eptr += length; +#ifdef SUPPORT_UCP + /* Need braces because of following else */ + else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } + else + { + if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); + eptr += oclength; + } +#else /* without SUPPORT_UCP */ + else { RRETURN (MATCH_NOMATCH); } +#endif /* SUPPORT_UCP */ + } + /* Control never gets here */ + } + + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr > md->end_subject - length) break; + if (memcmp(eptr, charptr, length) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength == 0) break; + else + { + if (memcmp(eptr, occhars, oclength) != 0) break; + eptr += oclength; + } +#else /* without SUPPORT_UCP */ + else break; +#endif /* SUPPORT_UCP */ + } + + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr == pp) RRETURN(MATCH_NOMATCH); +#ifdef SUPPORT_UCP + eptr--; + BACKCHAR(eptr); +#else /* without SUPPORT_UCP */ + eptr -= length; +#endif /* SUPPORT_UCP */ + } + } + /* Control never gets here */ + } + + /* If the length of a UTF-8 character is 1, we fall through here, and + obey the code as for non-UTF-8 characters below, though in this case the + value of fc will always be < 128. */ + } + else +#endif /* SUPPORT_UTF8 */ + + /* When not in UTF-8 mode, load a single-byte character. */ + { + if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + fc = *ecode++; + } + + /* The value of fc at this point is always less than 256, though we may or + may not be in UTF-8 mode. The code is duplicated for the caseless and + caseful cases, for speed, since matching characters is likely to be quite + common. First, ensure the minimum number of matches are present. If min = + max, continue at the same level without recursing. Otherwise, if + minimizing, keep trying the rest of the expression and advancing one + matching character if failing, up to the maximum. Alternatively, if + maximizing, find the maximum number of characters and work backwards. */ + + DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max, + max, eptr)); + + if ((ims & PCRE_CASELESS) != 0) + { + fc = md->lcc[fc]; + for (i = 1; i <= min; i++) + if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); + if (min == max) continue; + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject || + fc != md->lcc[*eptr++]) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; + eptr++; + } + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25); + eptr--; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + } + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + + /* Caseful comparisons (includes all multi-byte characters) */ + + else + { + for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH); + if (min == max) continue; + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject || fc != *eptr++) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || fc != *eptr) break; + eptr++; + } + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27); + eptr--; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + } + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + + /* Match a negated single one-byte character. The character we are + checking can be multibyte. */ + + case OP_NOT: + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + ecode++; + GETCHARINCTEST(c, eptr); + if ((ims & PCRE_CASELESS) != 0) + { +#ifdef SUPPORT_UTF8 + if (c < 256) +#endif + c = md->lcc[c]; + if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH); + } + else + { + if (*ecode++ == c) RRETURN(MATCH_NOMATCH); + } + break; + + /* Match a negated single one-byte character repeatedly. This is almost a + repeat of the code for a repeated single character, but I haven't found a + nice way of commoning these up that doesn't require a test of the + positive/negative option for each character match. Maybe that wouldn't add + very much to the time taken, but character matching *is* what this is all + about... */ + + case OP_NOTEXACT: + min = max = GET2(ecode, 1); + ecode += 3; + goto REPEATNOTCHAR; + + case OP_NOTUPTO: + case OP_NOTMINUPTO: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_NOTMINUPTO; + ecode += 3; + goto REPEATNOTCHAR; + + case OP_NOTPOSSTAR: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSPLUS: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSQUERY: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSUPTO: + possessive = TRUE; + min = 0; + max = GET2(ecode, 1); + ecode += 3; + goto REPEATNOTCHAR; + + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + c = *ecode++ - OP_NOTSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single-byte matches. We can give up quickly + if there are fewer than the minimum number of bytes left in the + subject. */ + + REPEATNOTCHAR: + if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + fc = *ecode++; + + /* The code is duplicated for the caseless and caseful cases, for speed, + since matching characters is likely to be quite common. First, ensure the + minimum number of matches are present. If min = max, continue at the same + level without recursing. Otherwise, if minimizing, keep trying the rest of + the expression and advancing one matching character if failing, up to the + maximum. Alternatively, if maximizing, find the maximum number of + characters and work backwards. */ + + DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max, + max, eptr)); + + if ((ims & PCRE_CASELESS) != 0) + { + fc = md->lcc[fc]; + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + register unsigned int d; + for (i = 1; i <= min; i++) + { + GETCHARINC(d, eptr); + if (d < 256) d = md->lcc[d]; + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + + /* Not UTF-8 mode */ + { + for (i = 1; i <= min; i++) + if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); + } + + if (min == max) continue; + + if (minimize) + { +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + register unsigned int d; + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(d, eptr); + if (d < 256) d = md->lcc[d]; + if (fc == d) RRETURN(MATCH_NOMATCH); + + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++]) + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + /* Maximize case */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + register unsigned int d; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(d, eptr, len); + if (d < 256) d = md->lcc[d]; + if (fc == d) break; + eptr += len; + } + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM30); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; + eptr++; + } + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM31); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + + /* Caseful comparisons */ + + else + { +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + register unsigned int d; + for (i = 1; i <= min; i++) + { + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (i = 1; i <= min; i++) + if (fc == *eptr++) RRETURN(MATCH_NOMATCH); + } + + if (min == max) continue; + + if (minimize) + { +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + register unsigned int d; + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject || fc == *eptr++) + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + /* Maximize case */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + register unsigned int d; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(d, eptr, len); + if (fc == d) break; + eptr += len; + } + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM34); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || fc == *eptr) break; + eptr++; + } + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM35); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + + /* Match a single character type repeatedly; several different opcodes + share code. This is very similar to the code for single characters, but we + repeat it in the interests of efficiency. */ + + case OP_TYPEEXACT: + min = max = GET2(ecode, 1); + minimize = TRUE; + ecode += 3; + goto REPEATTYPE; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_TYPEMINUPTO; + ecode += 3; + goto REPEATTYPE; + + case OP_TYPEPOSSTAR: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATTYPE; + + case OP_TYPEPOSPLUS: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATTYPE; + + case OP_TYPEPOSQUERY: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATTYPE; + + case OP_TYPEPOSUPTO: + possessive = TRUE; + min = 0; + max = GET2(ecode, 1); + ecode += 3; + goto REPEATTYPE; + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + c = *ecode++ - OP_TYPESTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single character type matches. Note that + in UTF-8 mode, '.' matches a character of any length, but for the other + character types, the valid characters are all one-byte long. */ + + REPEATTYPE: + ctype = *ecode++; /* Code for the character type */ + +#ifdef SUPPORT_UCP + if (ctype == OP_PROP || ctype == OP_NOTPROP) + { + prop_fail_result = ctype == OP_NOTPROP; + prop_type = *ecode++; + prop_value = *ecode++; + } + else prop_type = -1; +#endif + + /* First, ensure the minimum number of matches are present. Use inline + code for maximizing the speed, and do the type test once at the start + (i.e. keep it out of the loop). Also we can test that there are at least + the minimum number of bytes before we start. This isn't as effective in + UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that + is tidier. Also separate the UCP code, which can be the same for both UTF-8 + and single-bytes. */ + + if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); + if (min > 0) + { +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + switch(prop_type) + { + case PT_ANY: + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + } + break; + + case PT_LAMP: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + prop_chartype = UCD_CHARTYPE(c); + if ((prop_chartype == ucp_Lu || + prop_chartype == ucp_Ll || + prop_chartype == ucp_Lt) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_GC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + prop_category = UCD_CATEGORY(c); + if ((prop_category == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_PC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + prop_chartype = UCD_CHARTYPE(c); + if ((prop_chartype == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_SC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + prop_script = UCD_SCRIPT(c); + if ((prop_script == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + + /* Match extended Unicode sequences. We will get here only if the + support is in the binary; otherwise a compile-time error occurs. */ + + else if (ctype == OP_EXTUNI) + { + for (i = 1; i <= min; i++) + { + GETCHARINCTEST(c, eptr); + prop_category = UCD_CATEGORY(c); + if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf8) c = *eptr; else + { + GETCHARLEN(c, eptr, len); + } + prop_category = UCD_CATEGORY(c); + if (prop_category != ucp_M) break; + eptr += len; + } + } + } + + else +#endif /* SUPPORT_UCP */ + +/* Handle all other cases when the coding is UTF-8 */ + +#ifdef SUPPORT_UTF8 + if (utf8) switch(ctype) + { + case OP_ANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || IS_NEWLINE(eptr)) + RRETURN(MATCH_NOMATCH); + eptr++; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + break; + + case OP_ALLANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + eptr++; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + break; + + case OP_ANYBYTE: + eptr += min; + break; + + case OP_ANYNL: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x000d: + if (eptr < md->end_subject && *eptr == 0x0a) eptr++; + break; + + case 0x000a: + break; + + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + } + break; + + case OP_NOT_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(c) + { + default: break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + break; + } + } + break; + + case OP_NOT_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(c) + { + default: break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + break; + } + } + break; + + case OP_NOT_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || + *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + /* No need to skip more bytes - we know it's a 1-byte character */ + } + break; + + case OP_NOT_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || + (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0)) + RRETURN(MATCH_NOMATCH); + while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); + } + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || + *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + /* No need to skip more bytes - we know it's a 1-byte character */ + } + break; + + case OP_NOT_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || + (*eptr < 128 && (md->ctypes[*eptr] & ctype_word) != 0)) + RRETURN(MATCH_NOMATCH); + while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); + } + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || + *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + /* No need to skip more bytes - we know it's a 1-byte character */ + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } /* End switch(ctype) */ + + else +#endif /* SUPPORT_UTF8 */ + + /* Code for the non-UTF-8 case for minimum matching of operators other + than OP_PROP and OP_NOTPROP. We can assume that there are the minimum + number of bytes present, as this was tested above. */ + + switch(ctype) + { + case OP_ANY: + for (i = 1; i <= min; i++) + { + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_ALLANY: + eptr += min; + break; + + case OP_ANYBYTE: + eptr += min; + break; + + /* Because of the CRLF case, we can't assume the minimum number of + bytes are present in this case. */ + + case OP_ANYNL: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + case 0x000d: + if (eptr < md->end_subject && *eptr == 0x0a) eptr++; + break; + case 0x000a: + break; + + case 0x000b: + case 0x000c: + case 0x0085: + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + } + break; + + case OP_NOT_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + switch(*eptr++) + { + default: break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + break; + } + } + break; + + case OP_NOT_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + switch(*eptr++) + { + default: break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + break; + } + } + break; + + case OP_NOT_DIGIT: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_DIGIT: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WHITESPACE: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WORDCHAR: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + + /* If min = max, continue at the same level without recursing */ + + if (min == max) continue; + + /* If minimizing, we have to test the rest of the pattern before each + subsequent match. Again, separate the UTF-8 case for speed, and also + separate the UCP cases. */ + + if (minimize) + { +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + switch(prop_type) + { + case PT_ANY: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_LAMP: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + prop_chartype = UCD_CHARTYPE(c); + if ((prop_chartype == ucp_Lu || + prop_chartype == ucp_Ll || + prop_chartype == ucp_Lt) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_GC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + prop_category = UCD_CATEGORY(c); + if ((prop_category == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_PC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + prop_chartype = UCD_CHARTYPE(c); + if ((prop_chartype == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_SC: + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + prop_script = UCD_SCRIPT(c); + if ((prop_script == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + + /* Match extended Unicode sequences. We will get here only if the + support is in the binary; otherwise a compile-time error occurs. */ + + else if (ctype == OP_EXTUNI) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); + GETCHARINCTEST(c, eptr); + prop_category = UCD_CATEGORY(c); + if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf8) c = *eptr; else + { + GETCHARLEN(c, eptr, len); + } + prop_category = UCD_CATEGORY(c); + if (prop_category != ucp_M) break; + eptr += len; + } + } + } + + else +#endif /* SUPPORT_UCP */ + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + if (utf8) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject || + (ctype == OP_ANY && IS_NEWLINE(eptr))) + RRETURN(MATCH_NOMATCH); + + GETCHARINC(c, eptr); + switch(ctype) + { + case OP_ANY: /* This is the non-NL case */ + case OP_ALLANY: + case OP_ANYBYTE: + break; + + case OP_ANYNL: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x000d: + if (eptr < md->end_subject && *eptr == 0x0a) eptr++; + break; + case 0x000a: + break; + + case 0x000b: + case 0x000c: + case 0x0085: + case 0x2028: + case 0x2029: + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + break; + + case OP_NOT_HSPACE: + switch(c) + { + default: break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_HSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + break; + } + break; + + case OP_NOT_VSPACE: + switch(c) + { + default: break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_VSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + break; + } + break; + + case OP_NOT_DIGIT: + if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_DIGIT: + if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WHITESPACE: + if (c < 256 && (md->ctypes[c] & ctype_space) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_WHITESPACE: + if (c >= 256 || (md->ctypes[c] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WORDCHAR: + if (c < 256 && (md->ctypes[c] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + break; + + case OP_WORDCHAR: + if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + } + else +#endif + /* Not UTF-8 mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max || eptr >= md->end_subject || + (ctype == OP_ANY && IS_NEWLINE(eptr))) + RRETURN(MATCH_NOMATCH); + + c = *eptr++; + switch(ctype) + { + case OP_ANY: /* This is the non-NL case */ + case OP_ALLANY: + case OP_ANYBYTE: + break; + + case OP_ANYNL: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x000d: + if (eptr < md->end_subject && *eptr == 0x0a) eptr++; + break; + + case 0x000a: + break; + + case 0x000b: + case 0x000c: + case 0x0085: + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + break; + + case OP_NOT_HSPACE: + switch(c) + { + default: break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_HSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + break; + } + break; + + case OP_NOT_VSPACE: + switch(c) + { + default: break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_VSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + break; + } + break; + + case OP_NOT_DIGIT: + if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_DIGIT: + if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WHITESPACE: + if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WHITESPACE: + if ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WORDCHAR: + if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WORDCHAR: + if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + } + } + /* Control never gets here */ + } + + /* If maximizing, it is worth using inline code for speed, doing the type + test once at the start (i.e. keep it out of the loop). Again, keep the + UTF-8 and UCP stuff separate. */ + + else + { + pp = eptr; /* Remember where we started */ + +#ifdef SUPPORT_UCP + if (prop_type >= 0) + { + switch(prop_type) + { + case PT_ANY: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (prop_fail_result) break; + eptr+= len; + } + break; + + case PT_LAMP: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + prop_chartype = UCD_CHARTYPE(c); + if ((prop_chartype == ucp_Lu || + prop_chartype == ucp_Ll || + prop_chartype == ucp_Lt) == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_GC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + prop_category = UCD_CATEGORY(c); + if ((prop_category == prop_value) == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_PC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + prop_chartype = UCD_CHARTYPE(c); + if ((prop_chartype == prop_value) == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_SC: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + prop_script = UCD_SCRIPT(c); + if ((prop_script == prop_value) == prop_fail_result) + break; + eptr+= len; + } + break; + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM44); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + if (utf8) BACKCHAR(eptr); + } + } + + /* Match extended Unicode sequences. We will get here only if the + support is in the binary; otherwise a compile-time error occurs. */ + + else if (ctype == OP_EXTUNI) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + GETCHARINCTEST(c, eptr); + prop_category = UCD_CATEGORY(c); + if (prop_category == ucp_M) break; + while (eptr < md->end_subject) + { + int len = 1; + if (!utf8) c = *eptr; else + { + GETCHARLEN(c, eptr, len); + } + prop_category = UCD_CATEGORY(c); + if (prop_category != ucp_M) break; + eptr += len; + } + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM45); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + for (;;) /* Move back over one extended */ + { + int len = 1; + if (!utf8) c = *eptr; else + { + BACKCHAR(eptr); + GETCHARLEN(c, eptr, len); + } + prop_category = UCD_CATEGORY(c); + if (prop_category != ucp_M) break; + eptr--; + } + } + } + + else +#endif /* SUPPORT_UCP */ + +#ifdef SUPPORT_UTF8 + /* UTF-8 mode */ + + if (utf8) + { + switch(ctype) + { + case OP_ANY: + if (max < INT_MAX) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; + eptr++; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + } + + /* Handle unlimited UTF-8 repeat */ + + else + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; + eptr++; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + } + break; + + case OP_ALLANY: + if (max < INT_MAX) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + eptr++; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + } + else eptr = md->end_subject; /* Unlimited UTF-8 repeat */ + break; + + /* The byte case is the same as non-UTF8 */ + + case OP_ANYBYTE: + c = max - min; + if (c > (unsigned int)(md->end_subject - eptr)) + c = md->end_subject - eptr; + eptr += c; + break; + + case OP_ANYNL: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c == 0x000d) + { + if (++eptr >= md->end_subject) break; + if (*eptr == 0x000a) eptr++; + } + else + { + if (c != 0x000a && + (md->bsr_anycrlf || + (c != 0x000b && c != 0x000c && + c != 0x0085 && c != 0x2028 && c != 0x2029))) + break; + eptr += len; + } + } + break; + + case OP_NOT_HSPACE: + case OP_HSPACE: + for (i = min; i < max; i++) + { + BOOL gotspace; + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + switch(c) + { + default: gotspace = FALSE; break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ + case 0x1680: /* OGHAM SPACE MARK */ + case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ + case 0x2000: /* EN QUAD */ + case 0x2001: /* EM QUAD */ + case 0x2002: /* EN SPACE */ + case 0x2003: /* EM SPACE */ + case 0x2004: /* THREE-PER-EM SPACE */ + case 0x2005: /* FOUR-PER-EM SPACE */ + case 0x2006: /* SIX-PER-EM SPACE */ + case 0x2007: /* FIGURE SPACE */ + case 0x2008: /* PUNCTUATION SPACE */ + case 0x2009: /* THIN SPACE */ + case 0x200A: /* HAIR SPACE */ + case 0x202f: /* NARROW NO-BREAK SPACE */ + case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ + case 0x3000: /* IDEOGRAPHIC SPACE */ + gotspace = TRUE; + break; + } + if (gotspace == (ctype == OP_NOT_HSPACE)) break; + eptr += len; + } + break; + + case OP_NOT_VSPACE: + case OP_VSPACE: + for (i = min; i < max; i++) + { + BOOL gotspace; + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + switch(c) + { + default: gotspace = FALSE; break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ + gotspace = TRUE; + break; + } + if (gotspace == (ctype == OP_NOT_VSPACE)) break; + eptr += len; + } + break; + + case OP_NOT_DIGIT: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break; + eptr+= len; + } + break; + + case OP_DIGIT: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break; + eptr+= len; + } + break; + + case OP_NOT_WHITESPACE: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break; + eptr+= len; + } + break; + + case OP_WHITESPACE: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break; + eptr+= len; + } + break; + + case OP_NOT_WORDCHAR: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break; + eptr+= len; + } + break; + + case OP_WORDCHAR: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len); + if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break; + eptr+= len; + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM46); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif /* SUPPORT_UTF8 */ + + /* Not UTF-8 mode */ + { + switch(ctype) + { + case OP_ANY: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; + eptr++; + } + break; + + case OP_ALLANY: + case OP_ANYBYTE: + c = max - min; + if (c > (unsigned int)(md->end_subject - eptr)) + c = md->end_subject - eptr; + eptr += c; + break; + + case OP_ANYNL: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + c = *eptr; + if (c == 0x000d) + { + if (++eptr >= md->end_subject) break; + if (*eptr == 0x000a) eptr++; + } + else + { + if (c != 0x000a && + (md->bsr_anycrlf || + (c != 0x000b && c != 0x000c && c != 0x0085))) + break; + eptr++; + } + } + break; + + case OP_NOT_HSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + c = *eptr; + if (c == 0x09 || c == 0x20 || c == 0xa0) break; + eptr++; + } + break; + + case OP_HSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + c = *eptr; + if (c != 0x09 && c != 0x20 && c != 0xa0) break; + eptr++; + } + break; + + case OP_NOT_VSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + c = *eptr; + if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85) + break; + eptr++; + } + break; + + case OP_VSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + c = *eptr; + if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85) + break; + eptr++; + } + break; + + case OP_NOT_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) + break; + eptr++; + } + break; + + case OP_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) + break; + eptr++; + } + break; + + case OP_NOT_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) + break; + eptr++; + } + break; + + case OP_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) + break; + eptr++; + } + break; + + case OP_NOT_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) + break; + eptr++; + } + break; + + case OP_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) + break; + eptr++; + } + break; + + default: + RRETURN(PCRE_ERROR_INTERNAL); + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM47); + eptr--; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + } + } + + /* Get here if we can't make it match with any permitted repetitions */ + + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + /* There's been some horrible disaster. Arrival here can only mean there is + something seriously wrong in the code above or the OP_xxx definitions. */ + + default: + DPRINTF(("Unknown opcode %d\n", *ecode)); + RRETURN(PCRE_ERROR_UNKNOWN_OPCODE); + } + + /* Do not stick any code in here without much thought; it is assumed + that "continue" in the code above comes out to here to repeat the main + loop. */ + + } /* End of main loop */ +/* Control never reaches here */ + + +/* When compiling to use the heap rather than the stack for recursive calls to +match(), the RRETURN() macro jumps here. The number that is saved in +frame->Xwhere indicates which label we actually want to return to. */ + +#ifdef NO_RECURSE +#define LBL(val) case val: goto L_RM##val; +HEAP_RETURN: +switch (frame->Xwhere) + { + LBL( 1) LBL( 2) LBL( 3) LBL( 4) LBL( 5) LBL( 6) LBL( 7) LBL( 8) + LBL( 9) LBL(10) LBL(11) LBL(12) LBL(13) LBL(14) LBL(15) LBL(17) + LBL(19) LBL(24) LBL(25) LBL(26) LBL(27) LBL(29) LBL(31) LBL(33) + LBL(35) LBL(43) LBL(47) LBL(48) LBL(49) LBL(50) LBL(51) LBL(52) + LBL(53) LBL(54) +#ifdef SUPPORT_UTF8 + LBL(16) LBL(18) LBL(20) LBL(21) LBL(22) LBL(23) LBL(28) LBL(30) + LBL(32) LBL(34) LBL(42) LBL(46) +#ifdef SUPPORT_UCP + LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45) +#endif /* SUPPORT_UCP */ +#endif /* SUPPORT_UTF8 */ + default: + DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere)); + return PCRE_ERROR_INTERNAL; + } +#undef LBL +#endif /* NO_RECURSE */ +} + + +/*************************************************************************** +**************************************************************************** + RECURSION IN THE match() FUNCTION + +Undefine all the macros that were defined above to handle this. */ + +#ifdef NO_RECURSE +#undef eptr +#undef ecode +#undef mstart +#undef offset_top +#undef ims +#undef eptrb +#undef flags + +#undef callpat +#undef charptr +#undef data +#undef next +#undef pp +#undef prev +#undef saved_eptr + +#undef new_recursive + +#undef cur_is_word +#undef condition +#undef prev_is_word + +#undef original_ims + +#undef ctype +#undef length +#undef max +#undef min +#undef number +#undef offset +#undef op +#undef save_capture_last +#undef save_offset1 +#undef save_offset2 +#undef save_offset3 +#undef stacksave + +#undef newptrb + +#endif + +/* These two are defined as macros in both cases */ + +#undef fc +#undef fi + +/*************************************************************************** +***************************************************************************/ + + + +/************************************************* +* Execute a Regular Expression * +*************************************************/ + +/* This function applies a compiled re to a subject string and picks out +portions of the string if it matches. Two elements in the vector are set for +each substring: the offsets to the start and end of the substring. + +Arguments: + argument_re points to the compiled expression + extra_data points to extra data or is NULL + subject points to the subject string + length length of subject string (may contain binary zeros) + start_offset where to start in the subject string + options option bits + offsets points to a vector of ints to be filled in with offsets + offsetcount the number of elements in the vector + +Returns: > 0 => success; value is the number of elements filled in + = 0 => success, but offsets is not big enough + -1 => failed to match + < -1 => some kind of unexpected problem +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_exec(const pcre *argument_re, const pcre_extra *extra_data, + PCRE_SPTR subject, int length, int start_offset, int options, int *offsets, + int offsetcount) +{ +int rc, resetcount, ocount; +int first_byte = -1; +int req_byte = -1; +int req_byte2 = -1; +int newline; +unsigned long int ims; +BOOL using_temporary_offsets = FALSE; +BOOL anchored; +BOOL startline; +BOOL firstline; +BOOL first_byte_caseless = FALSE; +BOOL req_byte_caseless = FALSE; +BOOL utf8; +match_data match_block; +match_data *md = &match_block; +const uschar *tables; +const uschar *start_bits = NULL; +USPTR start_match = (USPTR)subject + start_offset; +USPTR end_subject; +USPTR req_byte_ptr = start_match - 1; + +pcre_study_data internal_study; +const pcre_study_data *study; + +real_pcre internal_re; +const real_pcre *external_re = (const real_pcre *)argument_re; +const real_pcre *re = external_re; + +/* Plausibility checks */ + +if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; +if (re == NULL || subject == NULL || + (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; +if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; + +/* Fish out the optional data from the extra_data structure, first setting +the default values. */ + +study = NULL; +md->match_limit = MATCH_LIMIT; +md->match_limit_recursion = MATCH_LIMIT_RECURSION; +md->callout_data = NULL; + +/* The table pointer is always in native byte order. */ + +tables = external_re->tables; + +if (extra_data != NULL) + { + register unsigned int flags = extra_data->flags; + if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) + study = (const pcre_study_data *)extra_data->study_data; + if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) + md->match_limit = extra_data->match_limit; + if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0) + md->match_limit_recursion = extra_data->match_limit_recursion; + if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) + md->callout_data = extra_data->callout_data; + if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables; + } + +/* If the exec call supplied NULL for tables, use the inbuilt ones. This +is a feature that makes it possible to save compiled regex and re-use them +in other programs later. */ + +if (tables == NULL) tables = _pcre_default_tables; + +/* Check that the first field in the block is the magic number. If it is not, +test for a regex that was compiled on a host of opposite endianness. If this is +the case, flipped values are put in internal_re and internal_study if there was +study data too. */ + +if (re->magic_number != MAGIC_NUMBER) + { + re = _pcre_try_flipped(re, &internal_re, study, &internal_study); + if (re == NULL) return PCRE_ERROR_BADMAGIC; + if (study != NULL) study = &internal_study; + } + +/* Set up other data */ + +anchored = ((re->options | options) & PCRE_ANCHORED) != 0; +startline = (re->flags & PCRE_STARTLINE) != 0; +firstline = (re->options & PCRE_FIRSTLINE) != 0; + +/* The code starts after the real_pcre block and the capture name table. */ + +md->start_code = (const uschar *)external_re + re->name_table_offset + + re->name_count * re->name_entry_size; + +md->start_subject = (USPTR)subject; +md->start_offset = start_offset; +md->end_subject = md->start_subject + length; +end_subject = md->end_subject; + +md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; +utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0; +md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; + +md->notbol = (options & PCRE_NOTBOL) != 0; +md->noteol = (options & PCRE_NOTEOL) != 0; +md->notempty = (options & PCRE_NOTEMPTY) != 0; +md->partial = (options & PCRE_PARTIAL) != 0; +md->hitend = FALSE; + +md->recursive = NULL; /* No recursion at top level */ + +md->lcc = tables + lcc_offset; +md->ctypes = tables + ctypes_offset; + +/* Handle different \R options. */ + +switch (options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) + { + case 0: + if ((re->options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) != 0) + md->bsr_anycrlf = (re->options & PCRE_BSR_ANYCRLF) != 0; + else +#ifdef BSR_ANYCRLF + md->bsr_anycrlf = TRUE; +#else + md->bsr_anycrlf = FALSE; +#endif + break; + + case PCRE_BSR_ANYCRLF: + md->bsr_anycrlf = TRUE; + break; + + case PCRE_BSR_UNICODE: + md->bsr_anycrlf = FALSE; + break; + + default: return PCRE_ERROR_BADNEWLINE; + } + +/* Handle different types of newline. The three bits give eight cases. If +nothing is set at run time, whatever was used at compile time applies. */ + +switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : + (pcre_uint32)options) & PCRE_NEWLINE_BITS) + { + case 0: newline = NEWLINE; break; /* Compile-time default */ + case PCRE_NEWLINE_CR: newline = '\r'; break; + case PCRE_NEWLINE_LF: newline = '\n'; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break; + case PCRE_NEWLINE_ANY: newline = -1; break; + case PCRE_NEWLINE_ANYCRLF: newline = -2; break; + default: return PCRE_ERROR_BADNEWLINE; + } + +if (newline == -2) + { + md->nltype = NLTYPE_ANYCRLF; + } +else if (newline < 0) + { + md->nltype = NLTYPE_ANY; + } +else + { + md->nltype = NLTYPE_FIXED; + if (newline > 255) + { + md->nllen = 2; + md->nl[0] = (newline >> 8) & 255; + md->nl[1] = newline & 255; + } + else + { + md->nllen = 1; + md->nl[0] = newline; + } + } + +/* Partial matching is supported only for a restricted set of regexes at the +moment. */ + +if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0) + return PCRE_ERROR_BADPARTIAL; + +/* Check a UTF-8 string if required. Unfortunately there's no way of passing +back the character offset. */ + +#ifdef SUPPORT_UTF8 +if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0) + { + if (_pcre_valid_utf8((uschar *)subject, length) >= 0) + return PCRE_ERROR_BADUTF8; + if (start_offset > 0 && start_offset < length) + { + int tb = ((uschar *)subject)[start_offset]; + if (tb > 127) + { + tb &= 0xc0; + if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET; + } + } + } +#endif + +/* The ims options can vary during the matching as a result of the presence +of (?ims) items in the pattern. They are kept in a local variable so that +restoring at the exit of a group is easy. */ + +ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); + +/* If the expression has got more back references than the offsets supplied can +hold, we get a temporary chunk of working store to use during the matching. +Otherwise, we can use the vector supplied, rounding down its size to a multiple +of 3. */ + +ocount = offsetcount - (offsetcount % 3); + +if (re->top_backref > 0 && re->top_backref >= ocount/3) + { + ocount = re->top_backref * 3 + 3; + md->offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); + if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY; + using_temporary_offsets = TRUE; + DPRINTF(("Got memory to hold back references\n")); + } +else md->offset_vector = offsets; + +md->offset_end = ocount; +md->offset_max = (2*ocount)/3; +md->offset_overflow = FALSE; +md->capture_last = -1; + +/* Compute the minimum number of offsets that we need to reset each time. Doing +this makes a huge difference to execution time when there aren't many brackets +in the pattern. */ + +resetcount = 2 + re->top_bracket * 2; +if (resetcount > offsetcount) resetcount = ocount; + +/* Reset the working variable associated with each extraction. These should +never be used unless previously set, but they get saved and restored, and so we +initialize them to avoid reading uninitialized locations. */ + +if (md->offset_vector != NULL) + { + register int *iptr = md->offset_vector + ocount; + register int *iend = iptr - resetcount/2 + 1; + while (--iptr >= iend) *iptr = -1; + } + +/* Set up the first character to match, if available. The first_byte value is +never set for an anchored regular expression, but the anchoring may be forced +at run time, so we have to test for anchoring. The first char may be unset for +an unanchored pattern, of course. If there's no first char and the pattern was +studied, there may be a bitmap of possible first characters. */ + +if (!anchored) + { + if ((re->flags & PCRE_FIRSTSET) != 0) + { + first_byte = re->first_byte & 255; + if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE) + first_byte = md->lcc[first_byte]; + } + else + if (!startline && study != NULL && + (study->options & PCRE_STUDY_MAPPED) != 0) + start_bits = study->start_bits; + } + +/* For anchored or unanchored matches, there may be a "last known required +character" set. */ + +if ((re->flags & PCRE_REQCHSET) != 0) + { + req_byte = re->req_byte & 255; + req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0; + req_byte2 = (tables + fcc_offset)[req_byte]; /* case flipped */ + } + + +/* ==========================================================================*/ + +/* Loop for handling unanchored repeated matching attempts; for anchored regexs +the loop runs just once. */ + +for(;;) + { + USPTR save_end_subject = end_subject; + USPTR new_start_match; + + /* Reset the maximum number of extractions we might see. */ + + if (md->offset_vector != NULL) + { + register int *iptr = md->offset_vector; + register int *iend = iptr + resetcount; + while (iptr < iend) *iptr++ = -1; + } + + /* Advance to a unique first char if possible. If firstline is TRUE, the + start of the match is constrained to the first line of a multiline string. + That is, the match must be before or at the first newline. Implement this by + temporarily adjusting end_subject so that we stop scanning at a newline. If + the match fails at the newline, later code breaks this loop. */ + + if (firstline) + { + USPTR t = start_match; +#ifdef SUPPORT_UTF8 + if (utf8) + { + while (t < md->end_subject && !IS_NEWLINE(t)) + { + t++; + while (t < end_subject && (*t & 0xc0) == 0x80) t++; + } + } + else +#endif + while (t < md->end_subject && !IS_NEWLINE(t)) t++; + end_subject = t; + } + + /* Now advance to a unique first byte if there is one. */ + + if (first_byte >= 0) + { + if (first_byte_caseless) + while (start_match < end_subject && md->lcc[*start_match] != first_byte) + start_match++; + else + while (start_match < end_subject && *start_match != first_byte) + start_match++; + } + + /* Or to just after a linebreak for a multiline match */ + + else if (startline) + { + if (start_match > md->start_subject + start_offset) + { +#ifdef SUPPORT_UTF8 + if (utf8) + { + while (start_match < end_subject && !WAS_NEWLINE(start_match)) + { + start_match++; + while(start_match < end_subject && (*start_match & 0xc0) == 0x80) + start_match++; + } + } + else +#endif + while (start_match < end_subject && !WAS_NEWLINE(start_match)) + start_match++; + + /* If we have just passed a CR and the newline option is ANY or ANYCRLF, + and we are now at a LF, advance the match position by one more character. + */ + + if (start_match[-1] == '\r' && + (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && + start_match < end_subject && + *start_match == '\n') + start_match++; + } + } + + /* Or to a non-unique first byte after study */ + + else if (start_bits != NULL) + { + while (start_match < end_subject) + { + register unsigned int c = *start_match; + if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; + else break; + } + } + + /* Restore fudged end_subject */ + + end_subject = save_end_subject; + +#ifdef DEBUG /* Sigh. Some compilers never learn. */ + printf(">>>> Match against: "); + pchars(start_match, end_subject - start_match, TRUE, md); + printf("\n"); +#endif + + /* If req_byte is set, we know that that character must appear in the subject + for the match to succeed. If the first character is set, req_byte must be + later in the subject; otherwise the test starts at the match point. This + optimization can save a huge amount of backtracking in patterns with nested + unlimited repeats that aren't going to match. Writing separate code for + cased/caseless versions makes it go faster, as does using an autoincrement + and backing off on a match. + + HOWEVER: when the subject string is very, very long, searching to its end can + take a long time, and give bad performance on quite ordinary patterns. This + showed up when somebody was matching something like /^\d+C/ on a 32-megabyte + string... so we don't do this when the string is sufficiently long. + + ALSO: this processing is disabled when partial matching is requested. + */ + + if (req_byte >= 0 && + end_subject - start_match < REQ_BYTE_MAX && + !md->partial) + { + register USPTR p = start_match + ((first_byte >= 0)? 1 : 0); + + /* We don't need to repeat the search if we haven't yet reached the + place we found it at last time. */ + + if (p > req_byte_ptr) + { + if (req_byte_caseless) + { + while (p < end_subject) + { + register int pp = *p++; + if (pp == req_byte || pp == req_byte2) { p--; break; } + } + } + else + { + while (p < end_subject) + { + if (*p++ == req_byte) { p--; break; } + } + } + + /* If we can't find the required character, break the matching loop, + forcing a match failure. */ + + if (p >= end_subject) + { + rc = MATCH_NOMATCH; + break; + } + + /* If we have found the required character, save the point where we + found it, so that we don't search again next time round the loop if + the start hasn't passed this character yet. */ + + req_byte_ptr = p; + } + } + + /* OK, we can now run the match. */ + + md->start_match_ptr = start_match; + md->match_call_count = 0; + rc = match(start_match, md->start_code, start_match, 2, md, ims, NULL, 0, 0); + + switch(rc) + { + /* NOMATCH and PRUNE advance by one character. THEN at this level acts + exactly like PRUNE. */ + + case MATCH_NOMATCH: + case MATCH_PRUNE: + case MATCH_THEN: + new_start_match = start_match + 1; +#ifdef SUPPORT_UTF8 + if (utf8) + while(new_start_match < end_subject && (*new_start_match & 0xc0) == 0x80) + new_start_match++; +#endif + break; + + /* SKIP passes back the next starting point explicitly. */ + + case MATCH_SKIP: + new_start_match = md->start_match_ptr; + break; + + /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */ + + case MATCH_COMMIT: + rc = MATCH_NOMATCH; + goto ENDLOOP; + + /* Any other return is some kind of error. */ + + default: + goto ENDLOOP; + } + + /* Control reaches here for the various types of "no match at this point" + result. Reset the code to MATCH_NOMATCH for subsequent checking. */ + + rc = MATCH_NOMATCH; + + /* If PCRE_FIRSTLINE is set, the match must happen before or at the first + newline in the subject (though it may continue over the newline). Therefore, + if we have just failed to match, starting at a newline, do not continue. */ + + if (firstline && IS_NEWLINE(start_match)) break; + + /* Advance to new matching position */ + + start_match = new_start_match; + + /* Break the loop if the pattern is anchored or if we have passed the end of + the subject. */ + + if (anchored || start_match > end_subject) break; + + /* If we have just passed a CR and we are now at a LF, and the pattern does + not contain any explicit matches for \r or \n, and the newline option is CRLF + or ANY or ANYCRLF, advance the match position by one more character. */ + + if (start_match[-1] == '\r' && + start_match < end_subject && + *start_match == '\n' && + (re->flags & PCRE_HASCRORLF) == 0 && + (md->nltype == NLTYPE_ANY || + md->nltype == NLTYPE_ANYCRLF || + md->nllen == 2)) + start_match++; + + } /* End of for(;;) "bumpalong" loop */ + +/* ==========================================================================*/ + +/* We reach here when rc is not MATCH_NOMATCH, or if one of the stopping +conditions is true: + +(1) The pattern is anchored or the match was failed by (*COMMIT); + +(2) We are past the end of the subject; + +(3) PCRE_FIRSTLINE is set and we have failed to match at a newline, because + this option requests that a match occur at or before the first newline in + the subject. + +When we have a match and the offset vector is big enough to deal with any +backreferences, captured substring offsets will already be set up. In the case +where we had to get some local store to hold offsets for backreference +processing, copy those that we can. In this case there need not be overflow if +certain parts of the pattern were not used, even though there are more +capturing parentheses than vector slots. */ + +ENDLOOP: + +if (rc == MATCH_MATCH) + { + if (using_temporary_offsets) + { + if (offsetcount >= 4) + { + memcpy(offsets + 2, md->offset_vector + 2, + (offsetcount - 2) * sizeof(int)); + DPRINTF(("Copied offsets from temporary memory\n")); + } + if (md->end_offset_top > offsetcount) md->offset_overflow = TRUE; + DPRINTF(("Freeing temporary memory\n")); + (pcre_free)(md->offset_vector); + } + + /* Set the return code to the number of captured strings, or 0 if there are + too many to fit into the vector. */ + + rc = md->offset_overflow? 0 : md->end_offset_top/2; + + /* If there is space, set up the whole thing as substring 0. The value of + md->start_match_ptr might be modified if \K was encountered on the success + matching path. */ + + if (offsetcount < 2) rc = 0; else + { + offsets[0] = md->start_match_ptr - md->start_subject; + offsets[1] = md->end_match_ptr - md->start_subject; + } + + DPRINTF((">>>> returning %d\n", rc)); + return rc; + } + +/* Control gets here if there has been an error, or if the overall match +attempt has failed at all permitted starting positions. */ + +if (using_temporary_offsets) + { + DPRINTF(("Freeing temporary memory\n")); + (pcre_free)(md->offset_vector); + } + +if (rc != MATCH_NOMATCH) + { + DPRINTF((">>>> error: returning %d\n", rc)); + return rc; + } +else if (md->partial && md->hitend) + { + DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); + return PCRE_ERROR_PARTIAL; + } +else + { + DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n")); + return PCRE_ERROR_NOMATCH; + } +} + +/* End of pcre_exec.c */ diff --git a/glib/pcre/pcre_fullinfo.c b/glib/pcre/pcre_fullinfo.c new file mode 100644 index 0000000..30566bb --- /dev/null +++ b/glib/pcre/pcre_fullinfo.c @@ -0,0 +1,165 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_fullinfo(), which returns +information about a compiled pattern. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Return info about compiled pattern * +*************************************************/ + +/* This is a newer "info" function which has an extensible interface so +that additional items can be added compatibly. + +Arguments: + argument_re points to compiled code + extra_data points extra data, or NULL + what what information is required + where where to put the information + +Returns: 0 if data returned, negative on error +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what, + void *where) +{ +real_pcre internal_re; +pcre_study_data internal_study; +const real_pcre *re = (const real_pcre *)argument_re; +const pcre_study_data *study = NULL; + +if (re == NULL || where == NULL) return PCRE_ERROR_NULL; + +if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) + study = (const pcre_study_data *)extra_data->study_data; + +if (re->magic_number != MAGIC_NUMBER) + { + re = _pcre_try_flipped(re, &internal_re, study, &internal_study); + if (re == NULL) return PCRE_ERROR_BADMAGIC; + if (study != NULL) study = &internal_study; + } + +switch (what) + { + case PCRE_INFO_OPTIONS: + *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; + break; + + case PCRE_INFO_SIZE: + *((size_t *)where) = re->size; + break; + + case PCRE_INFO_STUDYSIZE: + *((size_t *)where) = (study == NULL)? 0 : study->size; + break; + + case PCRE_INFO_CAPTURECOUNT: + *((int *)where) = re->top_bracket; + break; + + case PCRE_INFO_BACKREFMAX: + *((int *)where) = re->top_backref; + break; + + case PCRE_INFO_FIRSTBYTE: + *((int *)where) = + ((re->flags & PCRE_FIRSTSET) != 0)? re->first_byte : + ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2; + break; + + /* Make sure we pass back the pointer to the bit vector in the external + block, not the internal copy (with flipped integer fields). */ + + case PCRE_INFO_FIRSTTABLE: + *((const uschar **)where) = + (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? + ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL; + break; + + case PCRE_INFO_LASTLITERAL: + *((int *)where) = + ((re->flags & PCRE_REQCHSET) != 0)? re->req_byte : -1; + break; + + case PCRE_INFO_NAMEENTRYSIZE: + *((int *)where) = re->name_entry_size; + break; + + case PCRE_INFO_NAMECOUNT: + *((int *)where) = re->name_count; + break; + + case PCRE_INFO_NAMETABLE: + *((const uschar **)where) = (const uschar *)re + re->name_table_offset; + break; + + case PCRE_INFO_DEFAULT_TABLES: + *((const uschar **)where) = (const uschar *)(_pcre_default_tables); + break; + + case PCRE_INFO_OKPARTIAL: + *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0; + break; + + case PCRE_INFO_JCHANGED: + *((int *)where) = (re->flags & PCRE_JCHANGED) != 0; + break; + + case PCRE_INFO_HASCRORLF: + *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0; + break; + + default: return PCRE_ERROR_BADOPTION; + } + +return 0; +} + +/* End of pcre_fullinfo.c */ diff --git a/glib/pcre/pcre_get.c b/glib/pcre/pcre_get.c new file mode 100644 index 0000000..6117786 --- /dev/null +++ b/glib/pcre/pcre_get.c @@ -0,0 +1,465 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains some convenience functions for extracting substrings +from the subject string after a regex match has succeeded. The original idea +for these functions came from Scott Wimer. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Find number for named string * +*************************************************/ + +/* This function is used by the get_first_set() function below, as well +as being generally available. It assumes that names are unique. + +Arguments: + code the compiled regex + stringname the name whose number is required + +Returns: the number of the named parentheses, or a negative number + (PCRE_ERROR_NOSUBSTRING) if not found +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_stringnumber(const pcre *code, const char *stringname) +{ +int rc; +int entrysize; +int top, bot; +uschar *nametable; + +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; + +bot = 0; +while (top > bot) + { + int mid = (top + bot) / 2; + uschar *entry = nametable + entrysize*mid; + int c = strcmp(stringname, (char *)(entry + 2)); + if (c == 0) return (entry[0] << 8) + entry[1]; + if (c > 0) bot = mid + 1; else top = mid; + } + +return PCRE_ERROR_NOSUBSTRING; +} + + + +/************************************************* +* Find (multiple) entries for named string * +*************************************************/ + +/* This is used by the get_first_set() function below, as well as being +generally available. It is used when duplicated names are permitted. + +Arguments: + code the compiled regex + stringname the name whose entries required + firstptr where to put the pointer to the first entry + lastptr where to put the pointer to the last entry + +Returns: the length of each entry, or a negative number + (PCRE_ERROR_NOSUBSTRING) if not found +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_stringtable_entries(const pcre *code, const char *stringname, + char **firstptr, char **lastptr) +{ +int rc; +int entrysize; +int top, bot; +uschar *nametable, *lastentry; + +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; + +lastentry = nametable + entrysize * (top - 1); +bot = 0; +while (top > bot) + { + int mid = (top + bot) / 2; + uschar *entry = nametable + entrysize*mid; + int c = strcmp(stringname, (char *)(entry + 2)); + if (c == 0) + { + uschar *first = entry; + uschar *last = entry; + while (first > nametable) + { + if (strcmp(stringname, (char *)(first - entrysize + 2)) != 0) break; + first -= entrysize; + } + while (last < lastentry) + { + if (strcmp(stringname, (char *)(last + entrysize + 2)) != 0) break; + last += entrysize; + } + *firstptr = (char *)first; + *lastptr = (char *)last; + return entrysize; + } + if (c > 0) bot = mid + 1; else top = mid; + } + +return PCRE_ERROR_NOSUBSTRING; +} + + + +/************************************************* +* Find first set of multiple named strings * +*************************************************/ + +/* This function allows for duplicate names in the table of named substrings. +It returns the number of the first one that was set in a pattern match. + +Arguments: + code the compiled regex + stringname the name of the capturing substring + ovector the vector of matched substrings + +Returns: the number of the first that is set, + or the number of the last one if none are set, + or a negative number on error +*/ + +static int +get_first_set(const pcre *code, const char *stringname, int *ovector) +{ +const real_pcre *re = (const real_pcre *)code; +int entrysize; +char *first, *last; +uschar *entry; +if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) + return pcre_get_stringnumber(code, stringname); +entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last); +if (entrysize <= 0) return entrysize; +for (entry = (uschar *)first; entry <= (uschar *)last; entry += entrysize) + { + int n = (entry[0] << 8) + entry[1]; + if (ovector[n*2] >= 0) return n; + } +return (first[0] << 8) + first[1]; +} + + + + +/************************************************* +* Copy captured string to given buffer * +*************************************************/ + +/* This function copies a single captured substring into a given buffer. +Note that we use memcpy() rather than strncpy() in case there are binary zeros +in the string. + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringnumber the number of the required substring + buffer where to put the substring + size the size of the buffer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) buffer too small + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_copy_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, char *buffer, int size) +{ +int yield; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +if (size < yield + 1) return PCRE_ERROR_NOMEMORY; +memcpy(buffer, subject + ovector[stringnumber], yield); +buffer[yield] = 0; +return yield; +} + + + +/************************************************* +* Copy named captured string to given buffer * +*************************************************/ + +/* This function copies a single captured substring into a given buffer, +identifying it by name. If the regex permits duplicate names, the first +substring that is set is chosen. + +Arguments: + code the compiled regex + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringname the name of the required substring + buffer where to put the substring + size the size of the buffer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) buffer too small + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, + int stringcount, const char *stringname, char *buffer, int size) +{ +int n = get_first_set(code, stringname, ovector); +if (n <= 0) return n; +return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); +} + + + +/************************************************* +* Copy all captured strings to new store * +*************************************************/ + +/* This function gets one chunk of store and builds a list of pointers and all +of the captured substrings in it. A NULL pointer is put on the end of the list. + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + listptr set to point to the list of pointers + +Returns: if successful: 0 + if not successful: + PCRE_ERROR_NOMEMORY (-6) failed to get store +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_substring_list(const char *subject, int *ovector, int stringcount, + const char ***listptr) +{ +int i; +int size = sizeof(char *); +int double_count = stringcount * 2; +char **stringlist; +char *p; + +for (i = 0; i < double_count; i += 2) + size += sizeof(char *) + ovector[i+1] - ovector[i] + 1; + +stringlist = (char **)(pcre_malloc)(size); +if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; + +*listptr = (const char **)stringlist; +p = (char *)(stringlist + stringcount + 1); + +for (i = 0; i < double_count; i += 2) + { + int len = ovector[i+1] - ovector[i]; + memcpy(p, subject + ovector[i], len); + *stringlist++ = p; + p += len; + *p++ = 0; + } + +*stringlist = NULL; +return 0; +} + + + +/************************************************* +* Free store obtained by get_substring_list * +*************************************************/ + +/* This function exists for the benefit of people calling PCRE from non-C +programs that can call its functions, but not free() or (pcre_free)() directly. + +Argument: the result of a previous pcre_get_substring_list() +Returns: nothing +*/ + +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre_free_substring_list(const char **pointer) +{ +(pcre_free)((void *)pointer); +} + + + +/************************************************* +* Copy captured string to new store * +*************************************************/ + +/* This function copies a single captured substring into a piece of new +store + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringnumber the number of the required substring + stringptr where to put a pointer to the substring + +Returns: if successful: + the length of the string, not including the zero that + is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) failed to get store + PCRE_ERROR_NOSUBSTRING (-7) substring not present +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, const char **stringptr) +{ +int yield; +char *substring; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +substring = (char *)(pcre_malloc)(yield + 1); +if (substring == NULL) return PCRE_ERROR_NOMEMORY; +memcpy(substring, subject + ovector[stringnumber], yield); +substring[yield] = 0; +*stringptr = substring; +return yield; +} + + + +/************************************************* +* Copy named captured string to new store * +*************************************************/ + +/* This function copies a single captured substring, identified by name, into +new store. If the regex permits duplicate names, the first substring that is +set is chosen. + +Arguments: + code the compiled regex + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringname the name of the required substring + stringptr where to put the pointer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) couldn't get memory + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_named_substring(const pcre *code, const char *subject, int *ovector, + int stringcount, const char *stringname, const char **stringptr) +{ +int n = get_first_set(code, stringname, ovector); +if (n <= 0) return n; +return pcre_get_substring(subject, ovector, stringcount, n, stringptr); +} + + + + +/************************************************* +* Free store obtained by get_substring * +*************************************************/ + +/* This function exists for the benefit of people calling PCRE from non-C +programs that can call its functions, but not free() or (pcre_free)() directly. + +Argument: the result of a previous pcre_get_substring() +Returns: nothing +*/ + +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre_free_substring(const char *pointer) +{ +(pcre_free)((void *)pointer); +} + +/* End of pcre_get.c */ diff --git a/glib/pcre/pcre_globals.c b/glib/pcre/pcre_globals.c new file mode 100644 index 0000000..e759ed5 --- /dev/null +++ b/glib/pcre/pcre_globals.c @@ -0,0 +1,57 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains global variables that are exported by the PCRE library. +PCRE is thread-clean and doesn't use any global variables in the normal sense. +However, it calls memory allocation and freeing functions via the four +indirections below, and it can optionally do callouts, using the fifth +indirection. These values can be changed by the caller, but are shared between +all threads. However, when compiling for Virtual Pascal, things are done +differently, and global variables are not used (see pcre.in). */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +PCRE_EXP_DATA_DEFN int (*pcre_callout)(pcre_callout_block *) = NULL; + +/* End of pcre_globals.c */ diff --git a/glib/pcre/pcre_info.c b/glib/pcre/pcre_info.c new file mode 100644 index 0000000..02cf1c9 --- /dev/null +++ b/glib/pcre/pcre_info.c @@ -0,0 +1,93 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_info(), which gives some +information about a compiled pattern. However, use of this function is now +deprecated, as it has been superseded by pcre_fullinfo(). */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* (Obsolete) Return info about compiled pattern * +*************************************************/ + +/* This is the original "info" function. It picks potentially useful data out +of the private structure, but its interface was too rigid. It remains for +backwards compatibility. The public options are passed back in an int - though +the re->options field has been expanded to a long int, all the public options +at the low end of it, and so even on 16-bit systems this will still be OK. +Therefore, I haven't changed the API for pcre_info(). + +Arguments: + argument_re points to compiled code + optptr where to pass back the options + first_byte where to pass back the first character, + or -1 if multiline and all branches start ^, + or -2 otherwise + +Returns: number of capturing subpatterns + or negative values on error +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_info(const pcre *argument_re, int *optptr, int *first_byte) +{ +real_pcre internal_re; +const real_pcre *re = (const real_pcre *)argument_re; +if (re == NULL) return PCRE_ERROR_NULL; +if (re->magic_number != MAGIC_NUMBER) + { + re = _pcre_try_flipped(re, &internal_re, NULL, NULL); + if (re == NULL) return PCRE_ERROR_BADMAGIC; + } +if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS); +if (first_byte != NULL) + *first_byte = ((re->flags & PCRE_FIRSTSET) != 0)? re->first_byte : + ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2; +return re->top_bracket; +} + +/* End of pcre_info.c */ diff --git a/glib/pcre/pcre_internal.h b/glib/pcre/pcre_internal.h new file mode 100644 index 0000000..519b871 --- /dev/null +++ b/glib/pcre/pcre_internal.h @@ -0,0 +1,1157 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This header contains definitions that are shared between the different +modules, but which are not relevant to the exported API. This includes some +functions whose names all begin with "_pcre_". */ + +#ifndef PCRE_INTERNAL_H +#define PCRE_INTERNAL_H + +/* Define DEBUG to get debugging output on stdout. */ + +#if 0 +#define DEBUG +#endif + +/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef +inline, and there are *still* stupid compilers about that don't like indented +pre-processor statements, or at least there were when I first wrote this. After +all, it had only been about 10 years then... + +It turns out that the Mac Debugging.h header also defines the macro DPRINTF, so +be absolutely sure we get our version. */ + +#undef DPRINTF +#ifdef DEBUG +#define DPRINTF(p) printf p +#else +#define DPRINTF(p) /* Nothing */ +#endif + + +/* Standard C headers plus the external interface definition. The only time +setjmp and stdarg are used is when NO_RECURSE is set. */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* When compiling a DLL for Windows, the exported symbols have to be declared +using some MS magic. I found some useful information on this web page: +http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the +information there, using __declspec(dllexport) without "extern" we have a +definition; with "extern" we have a declaration. The settings here override the +setting in pcre.h (which is included below); it defines only PCRE_EXP_DECL, +which is all that is needed for applications (they just import the symbols). We +use: + + PCRE_EXP_DECL for declarations + PCRE_EXP_DEFN for definitions of exported functions + PCRE_EXP_DATA_DEFN for definitions of exported variables + +The reason for the two DEFN macros is that in non-Windows environments, one +does not want to have "extern" before variable definitions because it leads to +compiler warnings. So we distinguish between functions and variables. In +Windows, the two should always be the same. + +The reason for wrapping this in #ifndef PCRE_EXP_DECL is so that pcretest, +which is an application, but needs to import this file in order to "peek" at +internals, can #include pcre.h first to get an application's-eye view. + +In principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon, +special-purpose environments) might want to stick other stuff in front of +exported symbols. That's why, in the non-Windows case, we set PCRE_EXP_DEFN and +PCRE_EXP_DATA_DEFN only if they are not already set. */ + +#ifndef PCRE_EXP_DECL +# ifdef _WIN32 +# ifndef PCRE_STATIC +# define PCRE_EXP_DECL extern __declspec(dllexport) +# define PCRE_EXP_DEFN __declspec(dllexport) +# define PCRE_EXP_DATA_DEFN __declspec(dllexport) +# else +# define PCRE_EXP_DECL extern +# define PCRE_EXP_DEFN +# define PCRE_EXP_DATA_DEFN +# endif +# else +# ifdef __cplusplus +# define PCRE_EXP_DECL extern "C" +# else +# define PCRE_EXP_DECL extern +# endif +# ifndef PCRE_EXP_DEFN +# define PCRE_EXP_DEFN PCRE_EXP_DECL +# endif +# ifndef PCRE_EXP_DATA_DEFN +# define PCRE_EXP_DATA_DEFN +# endif +# endif +#endif + +/* When compiling with the MSVC compiler, it is sometimes necessary to include +a "calling convention" before exported function names. (This is secondhand +information; I know nothing about MSVC myself). For example, something like + + void __cdecl function(....) + +might be needed. In order so make this easy, all the exported functions have +PCRE_CALL_CONVENTION just before their names. It is rarely needed; if not +set, we ensure here that it has no effect. */ + +#ifndef PCRE_CALL_CONVENTION +#define PCRE_CALL_CONVENTION +#endif + +/* We need to have types that specify unsigned 16-bit and 32-bit integers. We +cannot determine these outside the compilation (e.g. by running a program as +part of "configure") because PCRE is often cross-compiled for use on other +systems. Instead we make use of the maximum sizes that are available at +preprocessor time in standard C environments. */ + +#if USHRT_MAX == 65535 + typedef unsigned short pcre_uint16; + typedef short pcre_int16; +#elif UINT_MAX == 65535 + typedef unsigned int pcre_uint16; + typedef int pcre_int16; +#else + #error Cannot determine a type for 16-bit unsigned integers +#endif + +#if UINT_MAX == 4294967295 + typedef unsigned int pcre_uint32; + typedef int pcre_int32; +#elif ULONG_MAX == 4294967295 + typedef unsigned long int pcre_uint32; + typedef long int pcre_int32; +#else + #error Cannot determine a type for 32-bit unsigned integers +#endif + +/* All character handling must be done as unsigned characters. Otherwise there +are problems with top-bit-set characters and functions such as isspace(). +However, we leave the interface to the outside world as char *, because that +should make things easier for callers. We define a short type for unsigned char +to save lots of typing. I tried "uchar", but it causes problems on Digital +Unix, where it is defined in sys/types, so use "uschar" instead. */ + +typedef unsigned char uschar; + +/* This is an unsigned int value that no character can ever have. UTF-8 +characters only go up to 0x7fffffff (though Unicode doesn't go beyond +0x0010ffff). */ + +#define NOTACHAR 0xffffffff + +/* PCRE is able to support several different kinds of newline (CR, LF, CRLF, +"any" and "anycrlf" at present). The following macros are used to package up +testing for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various +modules to indicate in which datablock the parameters exist, and what the +start/end of string field names are. */ + +#define NLTYPE_FIXED 0 /* Newline is a fixed length string */ +#define NLTYPE_ANY 1 /* Newline is any Unicode line ending */ +#define NLTYPE_ANYCRLF 2 /* Newline is CR, LF, or CRLF */ + +/* This macro checks for a newline at the given position */ + +#define IS_NEWLINE(p) \ + ((NLBLOCK->nltype != NLTYPE_FIXED)? \ + ((p) < NLBLOCK->PSEND && \ + _pcre_is_newline((p), NLBLOCK->nltype, NLBLOCK->PSEND, &(NLBLOCK->nllen),\ + utf8)) \ + : \ + ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \ + (p)[0] == NLBLOCK->nl[0] && \ + (NLBLOCK->nllen == 1 || (p)[1] == NLBLOCK->nl[1]) \ + ) \ + ) + +/* This macro checks for a newline immediately preceding the given position */ + +#define WAS_NEWLINE(p) \ + ((NLBLOCK->nltype != NLTYPE_FIXED)? \ + ((p) > NLBLOCK->PSSTART && \ + _pcre_was_newline((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \ + &(NLBLOCK->nllen), utf8)) \ + : \ + ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \ + (p)[-NLBLOCK->nllen] == NLBLOCK->nl[0] && \ + (NLBLOCK->nllen == 1 || (p)[-NLBLOCK->nllen+1] == NLBLOCK->nl[1]) \ + ) \ + ) + +/* When PCRE is compiled as a C++ library, the subject pointer can be replaced +with a custom type. This makes it possible, for example, to allow pcre_exec() +to process subject strings that are discontinuous by using a smart pointer +class. It must always be possible to inspect all of the subject string in +pcre_exec() because of the way it backtracks. Two macros are required in the +normal case, for sign-unspecified and unsigned char pointers. The former is +used for the external interface and appears in pcre.h, which is why its name +must begin with PCRE_. */ + +#ifdef CUSTOM_SUBJECT_PTR +#define PCRE_SPTR CUSTOM_SUBJECT_PTR +#define USPTR CUSTOM_SUBJECT_PTR +#else +#define PCRE_SPTR const char * +#define USPTR const unsigned char * +#endif + + + +/* Include the public PCRE header and the definitions of UCP character property +values. */ + +#include "pcre.h" +#include "ucp.h" + +/* When compiling for use with the Virtual Pascal compiler, these functions +need to have their names changed. PCRE must be compiled with the -DVPCOMPAT +option on the command line. */ + +#ifdef VPCOMPAT +#define strlen(s) _strlen(s) +#define strncmp(s1,s2,m) _strncmp(s1,s2,m) +#define memcmp(s,c,n) _memcmp(s,c,n) +#define memcpy(d,s,n) _memcpy(d,s,n) +#define memset(s,c,n) _memset(s,c,n) +#else /* VPCOMPAT */ + +/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), +define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY +is set. Otherwise, include an emulating function for those systems that have +neither (there some non-Unix environments where this is the case). */ + +#ifndef HAVE_MEMMOVE +#undef memmove /* some systems may have a macro */ +#ifdef HAVE_BCOPY +#define memmove(a, b, c) bcopy(b, a, c) +#else /* HAVE_BCOPY */ +static void * +pcre_memmove(void *d, const void *s, size_t n) +{ +size_t i; +unsigned char *dest = (unsigned char *)d; +const unsigned char *src = (const unsigned char *)s; +if (dest > src) + { + dest += n; + src += n; + for (i = 0; i < n; ++i) *(--dest) = *(--src); + return (void *)dest; + } +else + { + for (i = 0; i < n; ++i) *dest++ = *src++; + return (void *)(dest - n); + } +} +#define memmove(a, b, c) pcre_memmove(a, b, c) +#endif /* not HAVE_BCOPY */ +#endif /* not HAVE_MEMMOVE */ +#endif /* not VPCOMPAT */ + + +/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored +in big-endian order) by default. These are used, for example, to link from the +start of a subpattern to its alternatives and its end. The use of 2 bytes per +offset limits the size of the compiled regex to around 64K, which is big enough +for almost everybody. However, I received a request for an even bigger limit. +For this reason, and also to make the code easier to maintain, the storing and +loading of offsets from the byte string is now handled by the macros that are +defined here. + +The macros are controlled by the value of LINK_SIZE. This defaults to 2 in +the config.h file, but can be overridden by using -D on the command line. This +is automated on Unix systems via the "configure" command. */ + +#if LINK_SIZE == 2 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 8), \ + (a[(n)+1] = (d) & 255) + +#define GET(a,n) \ + (((a)[n] << 8) | (a)[(n)+1]) + +#define MAX_PATTERN_SIZE (1 << 16) + + +#elif LINK_SIZE == 3 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 16), \ + (a[(n)+1] = (d) >> 8), \ + (a[(n)+2] = (d) & 255) + +#define GET(a,n) \ + (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2]) + +#define MAX_PATTERN_SIZE (1 << 24) + + +#elif LINK_SIZE == 4 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 24), \ + (a[(n)+1] = (d) >> 16), \ + (a[(n)+2] = (d) >> 8), \ + (a[(n)+3] = (d) & 255) + +#define GET(a,n) \ + (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3]) + +#define MAX_PATTERN_SIZE (1 << 30) /* Keep it positive */ + + +#else +#error LINK_SIZE must be either 2, 3, or 4 +#endif + + +/* Convenience macro defined in terms of the others */ + +#define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE + + +/* PCRE uses some other 2-byte quantities that do not change when the size of +offsets changes. There are used for repeat counts and for other things such as +capturing parenthesis numbers in back references. */ + +#define PUT2(a,n,d) \ + a[n] = (d) >> 8; \ + a[(n)+1] = (d) & 255 + +#define GET2(a,n) \ + (((a)[n] << 8) | (a)[(n)+1]) + +#define PUT2INC(a,n,d) PUT2(a,n,d), a += 2 + + +/* When UTF-8 encoding is being used, a character is no longer just a single +byte. The macros for character handling generate simple sequences when used in +byte-mode, and more complicated ones for UTF-8 characters. BACKCHAR should +never be called in byte mode. To make sure it can never even appear when UTF-8 +support is omitted, we don't even define it. */ + +#ifndef SUPPORT_UTF8 +#define GETCHAR(c, eptr) c = *eptr; +#define GETCHARTEST(c, eptr) c = *eptr; +#define GETCHARINC(c, eptr) c = *eptr++; +#define GETCHARINCTEST(c, eptr) c = *eptr++; +#define GETCHARLEN(c, eptr, len) c = *eptr; +/* #define BACKCHAR(eptr) */ + +#else /* SUPPORT_UTF8 */ + +/* Get the next UTF-8 character, not advancing the pointer. This is called when +we know we are in UTF-8 mode. */ + +#define GETCHAR(c, eptr) \ + c = *eptr; \ + if (c >= 0xc0) \ + { \ + int gcii; \ + int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int gcss = 6*gcaa; \ + c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ + for (gcii = 1; gcii <= gcaa; gcii++) \ + { \ + gcss -= 6; \ + c |= (eptr[gcii] & 0x3f) << gcss; \ + } \ + } + +/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the +pointer. */ + +#define GETCHARTEST(c, eptr) \ + c = *eptr; \ + if (utf8 && c >= 0xc0) \ + { \ + int gcii; \ + int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int gcss = 6*gcaa; \ + c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ + for (gcii = 1; gcii <= gcaa; gcii++) \ + { \ + gcss -= 6; \ + c |= (eptr[gcii] & 0x3f) << gcss; \ + } \ + } + +/* Get the next UTF-8 character, advancing the pointer. This is called when we +know we are in UTF-8 mode. */ + +#define GETCHARINC(c, eptr) \ + c = *eptr++; \ + if (c >= 0xc0) \ + { \ + int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int gcss = 6*gcaa; \ + c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ + while (gcaa-- > 0) \ + { \ + gcss -= 6; \ + c |= (*eptr++ & 0x3f) << gcss; \ + } \ + } + +/* Get the next character, testing for UTF-8 mode, and advancing the pointer */ + +#define GETCHARINCTEST(c, eptr) \ + c = *eptr++; \ + if (utf8 && c >= 0xc0) \ + { \ + int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int gcss = 6*gcaa; \ + c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ + while (gcaa-- > 0) \ + { \ + gcss -= 6; \ + c |= (*eptr++ & 0x3f) << gcss; \ + } \ + } + +/* Get the next UTF-8 character, not advancing the pointer, incrementing length +if there are extra bytes. This is called when we know we are in UTF-8 mode. */ + +#define GETCHARLEN(c, eptr, len) \ + c = *eptr; \ + if (c >= 0xc0) \ + { \ + int gcii; \ + int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int gcss = 6*gcaa; \ + c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ + for (gcii = 1; gcii <= gcaa; gcii++) \ + { \ + gcss -= 6; \ + c |= (eptr[gcii] & 0x3f) << gcss; \ + } \ + len += gcaa; \ + } + +/* If the pointer is not at the start of a character, move it back until +it is. This is called only in UTF-8 mode - we don't put a test within the macro +because almost all calls are already within a block of UTF-8 only code. */ + +#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr-- + +#endif + + +/* In case there is no definition of offsetof() provided - though any proper +Standard C system should have one. */ + +#ifndef offsetof +#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) +#endif + + +/* These are the public options that can change during matching. */ + +#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) + +/* Private flags containing information about the compiled regex. They used to +live at the top end of the options word, but that got almost full, so now they +are in a 16-bit flags word. */ + +#define PCRE_NOPARTIAL 0x0001 /* can't use partial with this regex */ +#define PCRE_FIRSTSET 0x0002 /* first_byte is set */ +#define PCRE_REQCHSET 0x0004 /* req_byte is set */ +#define PCRE_STARTLINE 0x0008 /* start after \n for multiline */ +#define PCRE_JCHANGED 0x0010 /* j option used in regex */ +#define PCRE_HASCRORLF 0x0020 /* explicit \r or \n in pattern */ + +/* Options for the "extra" block produced by pcre_study(). */ + +#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ + +/* Masks for identifying the public options that are permitted at compile +time, run time, or study time, respectively. */ + +#define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY| \ + PCRE_NEWLINE_ANYCRLF) + +#define PUBLIC_OPTIONS \ + (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ + PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ + PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \ + PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ + PCRE_JAVASCRIPT_COMPAT) + +#define PUBLIC_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ + PCRE_PARTIAL|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE) + +#define PUBLIC_DFA_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ + PCRE_PARTIAL|PCRE_DFA_SHORTEST|PCRE_DFA_RESTART|PCRE_NEWLINE_BITS| \ + PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE) + +#define PUBLIC_STUDY_OPTIONS 0 /* None defined */ + +/* Magic number to provide a small check against being handed junk. Also used +to detect whether a pattern was compiled on a host of different endianness. */ + +#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ + +/* Negative values for the firstchar and reqchar variables */ + +#define REQ_UNSET (-2) +#define REQ_NONE (-1) + +/* The maximum remaining length of subject we are prepared to search for a +req_byte match. */ + +#define REQ_BYTE_MAX 1000 + +/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a +variable-length repeat, or a anything other than literal characters. */ + +#define REQ_CASELESS 0x0100 /* indicates caselessness */ +#define REQ_VARY 0x0200 /* reqbyte followed non-literal item */ + +/* Miscellaneous definitions. The #ifndef is to pacify compiler warnings in +environments where these macros are defined elsewhere. */ + +typedef gboolean BOOL; + +/* Escape items that are just an encoding of a particular data value. */ + +#ifndef ESC_e +#define ESC_e 27 +#endif + +#ifndef ESC_f +#define ESC_f '\f' +#endif + +#ifndef ESC_n +#define ESC_n '\n' +#endif + +#ifndef ESC_r +#define ESC_r '\r' +#endif + +/* We can't officially use ESC_t because it is a POSIX reserved identifier +(presumably because of all the others like size_t). */ + +#ifndef ESC_tee +#define ESC_tee '\t' +#endif + +/* Codes for different types of Unicode property */ + +#define PT_ANY 0 /* Any property - matches all chars */ +#define PT_LAMP 1 /* L& - the union of Lu, Ll, Lt */ +#define PT_GC 2 /* General characteristic (e.g. L) */ +#define PT_PC 3 /* Particular characteristic (e.g. Lu) */ +#define PT_SC 4 /* Script (e.g. Han) */ + +/* Flag bits and data types for the extended class (OP_XCLASS) for classes that +contain UTF-8 characters with values greater than 255. */ + +#define XCL_NOT 0x01 /* Flag: this is a negative class */ +#define XCL_MAP 0x02 /* Flag: a 32-byte map is present */ + +#define XCL_END 0 /* Marks end of individual items */ +#define XCL_SINGLE 1 /* Single item (one multibyte char) follows */ +#define XCL_RANGE 2 /* A range (two multibyte chars) follows */ +#define XCL_PROP 3 /* Unicode property (2-byte property code follows) */ +#define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */ + +/* These are escaped items that aren't just an encoding of a particular data +value such as \n. They must have non-zero values, as check_escape() returns +their negation. Also, they must appear in the same order as in the opcode +definitions below, up to ESC_z. There's a dummy for OP_ANY because it +corresponds to "." rather than an escape sequence, and another for OP_ALLANY +(which is used for [^] in JavaScript compatibility mode). + +The final escape must be ESC_REF as subsequent values are used for +backreferences (\1, \2, \3, etc). There are two tests in the code for an escape +greater than ESC_b and less than ESC_Z to detect the types that may be +repeated. These are the types that consume characters. If any new escapes are +put in between that don't consume a character, that code will have to change. +*/ + +enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, + ESC_W, ESC_w, ESC_dum1, ESC_dum2, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H, + ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z, ESC_E, ESC_Q, ESC_g, ESC_k, + ESC_REF }; + + +/* Opcode table: Starting from 1 (i.e. after OP_END), the values up to +OP_EOD must correspond in order to the list of escapes immediately above. + +*** NOTE NOTE NOTE *** Whenever this list is updated, the two macro definitions +that follow must also be updated to match. There is also a table called +"coptable" in pcre_dfa_exec.c that must be updated. */ + +enum { + OP_END, /* 0 End of pattern */ + + /* Values corresponding to backslashed metacharacters */ + + OP_SOD, /* 1 Start of data: \A */ + OP_SOM, /* 2 Start of match (subject + offset): \G */ + OP_SET_SOM, /* 3 Set start of match (\K) */ + OP_NOT_WORD_BOUNDARY, /* 4 \B */ + OP_WORD_BOUNDARY, /* 5 \b */ + OP_NOT_DIGIT, /* 6 \D */ + OP_DIGIT, /* 7 \d */ + OP_NOT_WHITESPACE, /* 8 \S */ + OP_WHITESPACE, /* 9 \s */ + OP_NOT_WORDCHAR, /* 10 \W */ + OP_WORDCHAR, /* 11 \w */ + OP_ANY, /* 12 Match any character (subject to DOTALL) */ + OP_ALLANY, /* 13 Match any character (not subject to DOTALL) */ + OP_ANYBYTE, /* 14 Match any byte (\C); different to OP_ANY for UTF-8 */ + OP_NOTPROP, /* 15 \P (not Unicode property) */ + OP_PROP, /* 16 \p (Unicode property) */ + OP_ANYNL, /* 17 \R (any newline sequence) */ + OP_NOT_HSPACE, /* 18 \H (not horizontal whitespace) */ + OP_HSPACE, /* 19 \h (horizontal whitespace) */ + OP_NOT_VSPACE, /* 20 \V (not vertical whitespace) */ + OP_VSPACE, /* 21 \v (vertical whitespace) */ + OP_EXTUNI, /* 22 \X (extended Unicode sequence */ + OP_EODN, /* 23 End of data or \n at end of data: \Z. */ + OP_EOD, /* 24 End of data: \z */ + + OP_OPT, /* 25 Set runtime options */ + OP_CIRC, /* 26 Start of line - varies with multiline switch */ + OP_DOLL, /* 27 End of line - varies with multiline switch */ + OP_CHAR, /* 28 Match one character, casefully */ + OP_CHARNC, /* 29 Match one character, caselessly */ + OP_NOT, /* 30 Match one character, not the following one */ + + OP_STAR, /* 31 The maximizing and minimizing versions of */ + OP_MINSTAR, /* 32 these six opcodes must come in pairs, with */ + OP_PLUS, /* 33 the minimizing one second. */ + OP_MINPLUS, /* 34 This first set applies to single characters.*/ + OP_QUERY, /* 35 */ + OP_MINQUERY, /* 36 */ + + OP_UPTO, /* 37 From 0 to n matches */ + OP_MINUPTO, /* 38 */ + OP_EXACT, /* 39 Exactly n matches */ + + OP_POSSTAR, /* 40 Possessified star */ + OP_POSPLUS, /* 41 Possessified plus */ + OP_POSQUERY, /* 42 Posesssified query */ + OP_POSUPTO, /* 43 Possessified upto */ + + OP_NOTSTAR, /* 44 The maximizing and minimizing versions of */ + OP_NOTMINSTAR, /* 45 these six opcodes must come in pairs, with */ + OP_NOTPLUS, /* 46 the minimizing one second. They must be in */ + OP_NOTMINPLUS, /* 47 exactly the same order as those above. */ + OP_NOTQUERY, /* 48 This set applies to "not" single characters. */ + OP_NOTMINQUERY, /* 49 */ + + OP_NOTUPTO, /* 50 From 0 to n matches */ + OP_NOTMINUPTO, /* 51 */ + OP_NOTEXACT, /* 52 Exactly n matches */ + + OP_NOTPOSSTAR, /* 53 Possessified versions */ + OP_NOTPOSPLUS, /* 54 */ + OP_NOTPOSQUERY, /* 55 */ + OP_NOTPOSUPTO, /* 56 */ + + OP_TYPESTAR, /* 57 The maximizing and minimizing versions of */ + OP_TYPEMINSTAR, /* 58 these six opcodes must come in pairs, with */ + OP_TYPEPLUS, /* 59 the minimizing one second. These codes must */ + OP_TYPEMINPLUS, /* 60 be in exactly the same order as those above. */ + OP_TYPEQUERY, /* 61 This set applies to character types such as \d */ + OP_TYPEMINQUERY, /* 62 */ + + OP_TYPEUPTO, /* 63 From 0 to n matches */ + OP_TYPEMINUPTO, /* 64 */ + OP_TYPEEXACT, /* 65 Exactly n matches */ + + OP_TYPEPOSSTAR, /* 66 Possessified versions */ + OP_TYPEPOSPLUS, /* 67 */ + OP_TYPEPOSQUERY, /* 68 */ + OP_TYPEPOSUPTO, /* 69 */ + + OP_CRSTAR, /* 70 The maximizing and minimizing versions of */ + OP_CRMINSTAR, /* 71 all these opcodes must come in pairs, with */ + OP_CRPLUS, /* 72 the minimizing one second. These codes must */ + OP_CRMINPLUS, /* 73 be in exactly the same order as those above. */ + OP_CRQUERY, /* 74 These are for character classes and back refs */ + OP_CRMINQUERY, /* 75 */ + OP_CRRANGE, /* 76 These are different to the three sets above. */ + OP_CRMINRANGE, /* 77 */ + + OP_CLASS, /* 78 Match a character class, chars < 256 only */ + OP_NCLASS, /* 79 Same, but the bitmap was created from a negative + class - the difference is relevant only when a UTF-8 + character > 255 is encountered. */ + + OP_XCLASS, /* 80 Extended class for handling UTF-8 chars within the + class. This does both positive and negative. */ + + OP_REF, /* 81 Match a back reference */ + OP_RECURSE, /* 82 Match a numbered subpattern (possibly recursive) */ + OP_CALLOUT, /* 83 Call out to external function if provided */ + + OP_ALT, /* 84 Start of alternation */ + OP_KET, /* 85 End of group that doesn't have an unbounded repeat */ + OP_KETRMAX, /* 86 These two must remain together and in this */ + OP_KETRMIN, /* 87 order. They are for groups the repeat for ever. */ + + /* The assertions must come before BRA, CBRA, ONCE, and COND.*/ + + OP_ASSERT, /* 88 Positive lookahead */ + OP_ASSERT_NOT, /* 89 Negative lookahead */ + OP_ASSERTBACK, /* 90 Positive lookbehind */ + OP_ASSERTBACK_NOT, /* 91 Negative lookbehind */ + OP_REVERSE, /* 92 Move pointer back - used in lookbehind assertions */ + + /* ONCE, BRA, CBRA, and COND must come after the assertions, with ONCE first, + as there's a test for >= ONCE for a subpattern that isn't an assertion. */ + + OP_ONCE, /* 93 Atomic group */ + OP_BRA, /* 94 Start of non-capturing bracket */ + OP_CBRA, /* 95 Start of capturing bracket */ + OP_COND, /* 96 Conditional group */ + + /* These three must follow the previous three, in the same order. There's a + check for >= SBRA to distinguish the two sets. */ + + OP_SBRA, /* 97 Start of non-capturing bracket, check empty */ + OP_SCBRA, /* 98 Start of capturing bracket, check empty */ + OP_SCOND, /* 99 Conditional group, check empty */ + + OP_CREF, /* 100 Used to hold a capture number as condition */ + OP_RREF, /* 101 Used to hold a recursion number as condition */ + OP_DEF, /* 102 The DEFINE condition */ + + OP_BRAZERO, /* 103 These two must remain together and in this */ + OP_BRAMINZERO, /* 104 order. */ + + /* These are backtracking control verbs */ + + OP_PRUNE, /* 105 */ + OP_SKIP, /* 106 */ + OP_THEN, /* 107 */ + OP_COMMIT, /* 108 */ + + /* These are forced failure and success verbs */ + + OP_FAIL, /* 109 */ + OP_ACCEPT, /* 110 */ + + /* This is used to skip a subpattern with a {0} quantifier */ + + OP_SKIPZERO /* 111 */ +}; + + +/* This macro defines textual names for all the opcodes. These are used only +for debugging. The macro is referenced only in pcre_printint.c. */ + +#define OP_NAME_LIST \ + "End", "\\A", "\\G", "\\K", "\\B", "\\b", "\\D", "\\d", \ + "\\S", "\\s", "\\W", "\\w", "Any", "AllAny", "Anybyte", \ + "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v", \ + "extuni", "\\Z", "\\z", \ + "Opt", "^", "$", "char", "charnc", "not", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", \ + "class", "nclass", "xclass", "Ref", "Recurse", "Callout", \ + "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \ + "AssertB", "AssertB not", "Reverse", \ + "Once", "Bra", "CBra", "Cond", "SBra", "SCBra", "SCond", \ + "Cond ref", "Cond rec", "Cond def", "Brazero", "Braminzero", \ + "*PRUNE", "*SKIP", "*THEN", "*COMMIT", "*FAIL", "*ACCEPT", \ + "Skip zero" + + +/* This macro defines the length of fixed length operations in the compiled +regex. The lengths are used when searching for specific things, and also in the +debugging printing of a compiled regex. We use a macro so that it can be +defined close to the definitions of the opcodes themselves. + +As things have been extended, some of these are no longer fixed lenths, but are +minima instead. For example, the length of a single-character repeat may vary +in UTF-8 mode. The code that uses this table must know about such things. */ + +#define OP_LENGTHS \ + 1, /* End */ \ + 1, 1, 1, 1, 1, /* \A, \G, \K, \B, \b */ \ + 1, 1, 1, 1, 1, 1, /* \D, \d, \S, \s, \W, \w */ \ + 1, 1, 1, /* Any, AllAny, Anybyte */ \ + 3, 3, 1, /* NOTPROP, PROP, EXTUNI */ \ + 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ \ + 1, 1, 2, 1, 1, /* \Z, \z, Opt, ^, $ */ \ + 2, /* Char - the minimum length */ \ + 2, /* Charnc - the minimum length */ \ + 2, /* not */ \ + /* Positive single-char repeats ** These are */ \ + 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \ + 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \ + 2, 2, 2, 4, /* *+, ++, ?+, upto+ */ \ + /* Negative single-char repeats - only for chars < 256 */ \ + 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ + 4, 4, 4, /* NOT upto, minupto, exact */ \ + 2, 2, 2, 4, /* Possessive *, +, ?, upto */ \ + /* Positive type repeats */ \ + 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \ + 4, 4, 4, /* Type upto, minupto, exact */ \ + 2, 2, 2, 4, /* Possessive *+, ++, ?+, upto+ */ \ + /* Character class & ref repeats */ \ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ + 5, 5, /* CRRANGE, CRMINRANGE */ \ + 33, /* CLASS */ \ + 33, /* NCLASS */ \ + 0, /* XCLASS - variable length */ \ + 3, /* REF */ \ + 1+LINK_SIZE, /* RECURSE */ \ + 2+2*LINK_SIZE, /* CALLOUT */ \ + 1+LINK_SIZE, /* Alt */ \ + 1+LINK_SIZE, /* Ket */ \ + 1+LINK_SIZE, /* KetRmax */ \ + 1+LINK_SIZE, /* KetRmin */ \ + 1+LINK_SIZE, /* Assert */ \ + 1+LINK_SIZE, /* Assert not */ \ + 1+LINK_SIZE, /* Assert behind */ \ + 1+LINK_SIZE, /* Assert behind not */ \ + 1+LINK_SIZE, /* Reverse */ \ + 1+LINK_SIZE, /* ONCE */ \ + 1+LINK_SIZE, /* BRA */ \ + 3+LINK_SIZE, /* CBRA */ \ + 1+LINK_SIZE, /* COND */ \ + 1+LINK_SIZE, /* SBRA */ \ + 3+LINK_SIZE, /* SCBRA */ \ + 1+LINK_SIZE, /* SCOND */ \ + 3, /* CREF */ \ + 3, /* RREF */ \ + 1, /* DEF */ \ + 1, 1, /* BRAZERO, BRAMINZERO */ \ + 1, 1, 1, 1, /* PRUNE, SKIP, THEN, COMMIT, */ \ + 1, 1, 1 /* FAIL, ACCEPT, SKIPZERO */ + + +/* A magic value for OP_RREF to indicate the "any recursion" condition. */ + +#define RREF_ANY 0xffff + +/* Error code numbers. They are given names so that they can more easily be +tracked. */ + +enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, + ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, + ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29, + ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, + ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49, + ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, + ERR60, ERR61, ERR62, ERR63, ERR64 }; + +/* The real format of the start of the pcre block; the index of names and the +code vector run on as long as necessary after the end. We store an explicit +offset to the name table so that if a regex is compiled on one host, saved, and +then run on another where the size of pointers is different, all might still +be well. For the case of compiled-on-4 and run-on-8, we include an extra +pointer that is always NULL. For future-proofing, a few dummy fields were +originally included - even though you can never get this planning right - but +there is only one left now. + +NOTE NOTE NOTE: +Because people can now save and re-use compiled patterns, any additions to this +structure should be made at the end, and something earlier (e.g. a new +flag in the options or one of the dummy fields) should indicate that the new +fields are present. Currently PCRE always sets the dummy fields to zero. +NOTE NOTE NOTE: +*/ + +typedef struct real_pcre { + pcre_uint32 magic_number; + pcre_uint32 size; /* Total that was malloced */ + pcre_uint32 options; /* Public options */ + pcre_uint16 flags; /* Private flags */ + pcre_uint16 dummy1; /* For future use */ + pcre_uint16 top_bracket; + pcre_uint16 top_backref; + pcre_uint16 first_byte; + pcre_uint16 req_byte; + pcre_uint16 name_table_offset; /* Offset to name table that follows */ + pcre_uint16 name_entry_size; /* Size of any name items */ + pcre_uint16 name_count; /* Number of name items */ + pcre_uint16 ref_count; /* Reference count */ + + const unsigned char *tables; /* Pointer to tables or NULL for std */ + const unsigned char *nullpad; /* NULL padding */ +} real_pcre; + +/* The format of the block used to store data from pcre_study(). The same +remark (see NOTE above) about extending this structure applies. */ + +typedef struct pcre_study_data { + pcre_uint32 size; /* Total that was malloced */ + pcre_uint32 options; + uschar start_bits[32]; +} pcre_study_data; + +/* Structure for passing "static" information around between the functions +doing the compiling, so that they are thread-safe. */ + +typedef struct compile_data { + const uschar *lcc; /* Points to lower casing table */ + const uschar *fcc; /* Points to case-flipping table */ + const uschar *cbits; /* Points to character type table */ + const uschar *ctypes; /* Points to table of type maps */ + const uschar *start_workspace;/* The start of working space */ + const uschar *start_code; /* The start of the compiled code */ + const uschar *start_pattern; /* The start of the pattern */ + const uschar *end_pattern; /* The end of the pattern */ + uschar *hwm; /* High watermark of workspace */ + uschar *name_table; /* The name/number table */ + int names_found; /* Number of entries so far */ + int name_entry_size; /* Size of each entry */ + int bracount; /* Count of capturing parens as we compile */ + int final_bracount; /* Saved value after first pass */ + int top_backref; /* Maximum back reference */ + unsigned int backref_map; /* Bitmap of low back refs */ + int external_options; /* External (initial) options */ + int external_flags; /* External flag bits to be set */ + int req_varyopt; /* "After variable item" flag for reqbyte */ + BOOL had_accept; /* (*ACCEPT) encountered */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + uschar nl[4]; /* Newline string when fixed length */ +} compile_data; + +/* Structure for maintaining a chain of pointers to the currently incomplete +branches, for testing for left recursion. */ + +typedef struct branch_chain { + struct branch_chain *outer; + uschar *current; +} branch_chain; + +/* Structure for items in a linked list that represents an explicit recursive +call within the pattern. */ + +typedef struct recursion_info { + struct recursion_info *prevrec; /* Previous recursion record (or NULL) */ + int group_num; /* Number of group that was called */ + const uschar *after_call; /* "Return value": points after the call in the expr */ + USPTR save_start; /* Old value of mstart */ + int *offset_save; /* Pointer to start of saved offsets */ + int saved_max; /* Number of saved offsets */ +} recursion_info; + +/* Structure for building a chain of data for holding the values of the subject +pointer at the start of each subpattern, so as to detect when an empty string +has been matched by a subpattern - to break infinite loops. */ + +typedef struct eptrblock { + struct eptrblock *epb_prev; + USPTR epb_saved_eptr; +} eptrblock; + + +/* Structure for passing "static" information around between the functions +doing traditional NFA matching, so that they are thread-safe. */ + +typedef struct match_data { + unsigned long int match_call_count; /* As it says */ + unsigned long int match_limit; /* As it says */ + unsigned long int match_limit_recursion; /* As it says */ + int *offset_vector; /* Offset vector */ + int offset_end; /* One past the end */ + int offset_max; /* The maximum usable for return data */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + uschar nl[4]; /* Newline string when fixed */ + const uschar *lcc; /* Points to lower casing table */ + const uschar *ctypes; /* Points to table of type maps */ + BOOL offset_overflow; /* Set if too many extractions */ + BOOL notbol; /* NOTBOL flag */ + BOOL noteol; /* NOTEOL flag */ + BOOL utf8; /* UTF8 flag */ + BOOL jscript_compat; /* JAVASCRIPT_COMPAT flag */ + BOOL endonly; /* Dollar not before final \n */ + BOOL notempty; /* Empty string match not wanted */ + BOOL partial; /* PARTIAL flag */ + BOOL hitend; /* Hit the end of the subject at some point */ + BOOL bsr_anycrlf; /* \R is just any CRLF, not full Unicode */ + const uschar *start_code; /* For use when recursing */ + USPTR start_subject; /* Start of the subject string */ + USPTR end_subject; /* End of the subject string */ + USPTR start_match_ptr; /* Start of matched string */ + USPTR end_match_ptr; /* Subject position at end match */ + int end_offset_top; /* Highwater mark at end of match */ + int capture_last; /* Most recent capture number */ + int start_offset; /* The start offset value */ + eptrblock *eptrchain; /* Chain of eptrblocks for tail recursions */ + int eptrn; /* Next free eptrblock */ + recursion_info *recursive; /* Linked list of recursion data */ + void *callout_data; /* To pass back to callouts */ +} match_data; + +/* A similar structure is used for the same purpose by the DFA matching +functions. */ + +typedef struct dfa_match_data { + const uschar *start_code; /* Start of the compiled pattern */ + const uschar *start_subject; /* Start of the subject string */ + const uschar *end_subject; /* End of subject string */ + const uschar *tables; /* Character tables */ + int moptions; /* Match options */ + int poptions; /* Pattern options */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + uschar nl[4]; /* Newline string when fixed */ + void *callout_data; /* To pass back to callouts */ +} dfa_match_data; + +/* Bit definitions for entries in the pcre_ctypes table. */ + +#define ctype_space 0x01 +#define ctype_letter 0x02 +#define ctype_digit 0x04 +#define ctype_xdigit 0x08 +#define ctype_word 0x10 /* alphanumeric or '_' */ +#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ + +/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set +of bits for a class map. Some classes are built by combining these tables. */ + +#define cbit_space 0 /* [:space:] or \s */ +#define cbit_xdigit 32 /* [:xdigit:] */ +#define cbit_digit 64 /* [:digit:] or \d */ +#define cbit_upper 96 /* [:upper:] */ +#define cbit_lower 128 /* [:lower:] */ +#define cbit_word 160 /* [:word:] or \w */ +#define cbit_graph 192 /* [:graph:] */ +#define cbit_print 224 /* [:print:] */ +#define cbit_punct 256 /* [:punct:] */ +#define cbit_cntrl 288 /* [:cntrl:] */ +#define cbit_length 320 /* Length of the cbits table */ + +/* Offsets of the various tables from the base tables pointer, and +total length. */ + +#define lcc_offset 0 +#define fcc_offset 256 +#define cbits_offset 512 +#define ctypes_offset (cbits_offset + cbit_length) +#define tables_length (ctypes_offset + 256) + +/* Layout of the UCP type table that translates property names into types and +codes. Each entry used to point directly to a name, but to reduce the number of +relocations in shared libraries, it now has an offset into a single string +instead. */ + +typedef struct { + pcre_uint16 name_offset; + pcre_uint16 type; + pcre_uint16 value; +} ucp_type_table; + + +/* Internal shared data tables. These are tables that are used by more than one +of the exported public functions. They have to be "external" in the C sense, +but are not part of the PCRE public API. The data for these tables is in the +pcre_tables.c module. */ + +extern const int _pcre_utf8_table1[]; +extern const int _pcre_utf8_table2[]; +extern const int _pcre_utf8_table3[]; +extern const uschar _pcre_utf8_table4[]; + +extern const int _pcre_utf8_table1_size; + +extern const char _pcre_utt_names[]; +extern const ucp_type_table _pcre_utt[]; +extern const int _pcre_utt_size; + +extern const uschar _pcre_default_tables[]; + +extern const uschar _pcre_OP_lengths[]; + + +/* Internal shared functions. These are functions that are used by more than +one of the exported public functions. They have to be "external" in the C +sense, but are not part of the PCRE public API. */ + +extern BOOL _pcre_is_newline(const uschar *, int, const uschar *, + int *, BOOL); +extern int _pcre_ord2utf8(int, uschar *); +extern real_pcre *_pcre_try_flipped(const real_pcre *, real_pcre *, + const pcre_study_data *, pcre_study_data *); +extern int _pcre_valid_utf8(const uschar *, int); +extern BOOL _pcre_was_newline(const uschar *, int, const uschar *, + int *, BOOL); +extern BOOL _pcre_xclass(int, const uschar *); +extern unsigned int _pcre_ucp_othercase(unsigned int); + + +extern const int _pcre_ucp_gentype[]; + + +/* UCD access macros */ + +#include "../glib.h" + +#define UCD_CHARTYPE(ch) g_unichar_type(ch) +#define UCD_SCRIPT(ch) g_unichar_get_script(ch) +#define UCD_CATEGORY(ch) _pcre_ucp_gentype[UCD_CHARTYPE(ch)] +#define UCD_OTHERCASE(ch) _pcre_ucp_othercase(ch) + +#endif + +/* End of pcre_internal.h */ diff --git a/glib/pcre/pcre_maketables.c b/glib/pcre/pcre_maketables.c new file mode 100644 index 0000000..219973e --- /dev/null +++ b/glib/pcre/pcre_maketables.c @@ -0,0 +1,143 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_maketables(), which builds +character tables for PCRE in the current locale. The file is compiled on its +own as part of the PCRE library. However, it is also included in the +compilation of dftables.c, in which case the macro DFTABLES is defined. */ + + +#ifndef DFTABLES +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif +# include "pcre_internal.h" +#endif + + +/************************************************* +* Create PCRE character tables * +*************************************************/ + +/* This function builds a set of character tables for use by PCRE and returns +a pointer to them. They are build using the ctype functions, and consequently +their contents will depend upon the current locale setting. When compiled as +part of the library, the store is obtained via pcre_malloc(), but when compiled +inside dftables, use malloc(). + +Arguments: none +Returns: pointer to the contiguous block of data +*/ + +const unsigned char * +pcre_maketables(void) +{ +unsigned char *yield, *p; +int i; + +#ifndef DFTABLES +yield = (unsigned char*)(pcre_malloc)(tables_length); +#else +yield = (unsigned char*)malloc(tables_length); +#endif + +if (yield == NULL) return NULL; +p = yield; + +/* First comes the lower casing table */ + +for (i = 0; i < 256; i++) *p++ = tolower(i); + +/* Next the case-flipping table */ + +for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); + +/* Then the character class tables. Don't try to be clever and save effort on +exclusive ones - in some locales things may be different. Note that the table +for "space" includes everything "isspace" gives, including VT in the default +locale. This makes it work for the POSIX class [:space:]. Note also that it is +possible for a character to be alnum or alpha without being lower or upper, +such as "male and female ordinals" (\xAA and \xBA) in the fr_FR locale (at +least under Debian Linux's locales as of 12/2005). So we must test for alnum +specially. */ + +memset(p, 0, cbit_length); +for (i = 0; i < 256; i++) + { + if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7); + if (isupper(i)) p[cbit_upper + i/8] |= 1 << (i&7); + if (islower(i)) p[cbit_lower + i/8] |= 1 << (i&7); + if (isalnum(i)) p[cbit_word + i/8] |= 1 << (i&7); + if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); + if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); + if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); + if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); + if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); + if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); + if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); + } +p += cbit_length; + +/* Finally, the character type table. In this, we exclude VT from the white +space chars, because Perl doesn't recognize it as such for \s and for comments +within regexes. */ + +for (i = 0; i < 256; i++) + { + int x = 0; + if (i != 0x0b && isspace(i)) x += ctype_space; + if (isalpha(i)) x += ctype_letter; + if (isdigit(i)) x += ctype_digit; + if (isxdigit(i)) x += ctype_xdigit; + if (isalnum(i) || i == '_') x += ctype_word; + + /* Note: strchr includes the terminating zero in the characters it considers. + In this instance, that is ok because we want binary zero to be flagged as a + meta-character, which in this sense is any character that terminates a run + of data characters. */ + + if (strchr("\\*+?{^.$|()[", i) != 0) x += ctype_meta; + *p++ = x; + } + +return yield; +} + +/* End of pcre_maketables.c */ diff --git a/glib/pcre/pcre_newline.c b/glib/pcre/pcre_newline.c new file mode 100644 index 0000000..5888576 --- /dev/null +++ b/glib/pcre/pcre_newline.c @@ -0,0 +1,164 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains internal functions for testing newlines when more than +one kind of newline is to be recognized. When a newline is found, its length is +returned. In principle, we could implement several newline "types", each +referring to a different set of newline characters. At present, PCRE supports +only NLTYPE_FIXED, which gets handled without these functions, NLTYPE_ANYCRLF, +and NLTYPE_ANY. The full list of Unicode newline characters is taken from +http://unicode.org/unicode/reports/tr18/. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + + +/************************************************* +* Check for newline at given position * +*************************************************/ + +/* It is guaranteed that the initial value of ptr is less than the end of the +string that is being processed. + +Arguments: + ptr pointer to possible newline + type the newline type + endptr pointer to the end of the string + lenptr where to return the length + utf8 TRUE if in utf8 mode + +Returns: TRUE or FALSE +*/ + +BOOL +_pcre_is_newline(const uschar *ptr, int type, const uschar *endptr, + int *lenptr, BOOL utf8) +{ +int c; +if (utf8) { GETCHAR(c, ptr); } else c = *ptr; + +if (type == NLTYPE_ANYCRLF) switch(c) + { + case 0x000a: *lenptr = 1; return TRUE; /* LF */ + case 0x000d: *lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a)? 2 : 1; + return TRUE; /* CR */ + default: return FALSE; + } + +/* NLTYPE_ANY */ + +else switch(c) + { + case 0x000a: /* LF */ + case 0x000b: /* VT */ + case 0x000c: *lenptr = 1; return TRUE; /* FF */ + case 0x000d: *lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a)? 2 : 1; + return TRUE; /* CR */ + case 0x0085: *lenptr = utf8? 2 : 1; return TRUE; /* NEL */ + case 0x2028: /* LS */ + case 0x2029: *lenptr = 3; return TRUE; /* PS */ + default: return FALSE; + } +} + + + +/************************************************* +* Check for newline at previous position * +*************************************************/ + +/* It is guaranteed that the initial value of ptr is greater than the start of +the string that is being processed. + +Arguments: + ptr pointer to possible newline + type the newline type + startptr pointer to the start of the string + lenptr where to return the length + utf8 TRUE if in utf8 mode + +Returns: TRUE or FALSE +*/ + +BOOL +_pcre_was_newline(const uschar *ptr, int type, const uschar *startptr, + int *lenptr, BOOL utf8) +{ +int c; +ptr--; +#ifdef SUPPORT_UTF8 +if (utf8) + { + BACKCHAR(ptr); + GETCHAR(c, ptr); + } +else c = *ptr; +#else /* no UTF-8 support */ +c = *ptr; +#endif /* SUPPORT_UTF8 */ + +if (type == NLTYPE_ANYCRLF) switch(c) + { + case 0x000a: *lenptr = (ptr > startptr && ptr[-1] == 0x0d)? 2 : 1; + return TRUE; /* LF */ + case 0x000d: *lenptr = 1; return TRUE; /* CR */ + default: return FALSE; + } + +else switch(c) + { + case 0x000a: *lenptr = (ptr > startptr && ptr[-1] == 0x0d)? 2 : 1; + return TRUE; /* LF */ + case 0x000b: /* VT */ + case 0x000c: /* FF */ + case 0x000d: *lenptr = 1; return TRUE; /* CR */ + case 0x0085: *lenptr = utf8? 2 : 1; return TRUE; /* NEL */ + case 0x2028: /* LS */ + case 0x2029: *lenptr = 3; return TRUE; /* PS */ + default: return FALSE; + } +} + +/* End of pcre_newline.c */ diff --git a/glib/pcre/pcre_ord2utf8.c b/glib/pcre/pcre_ord2utf8.c new file mode 100644 index 0000000..6f4eb9e --- /dev/null +++ b/glib/pcre/pcre_ord2utf8.c @@ -0,0 +1,87 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This file contains a private PCRE function that converts an ordinal +character value into a UTF8 string. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Convert character value to UTF-8 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x7fffffff +and encodes it as a UTF-8 character in 0 to 6 bytes. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 6 bytes long + +Returns: number of characters placed in the buffer +*/ + +int +_pcre_ord2utf8(int cvalue, uschar *buffer) +{ +#ifdef SUPPORT_UTF8 +register int i, j; +for (i = 0; i < _pcre_utf8_table1_size; i++) + if (cvalue <= _pcre_utf8_table1[i]) break; +buffer += i; +for (j = i; j > 0; j--) + { + *buffer-- = 0x80 | (cvalue & 0x3f); + cvalue >>= 6; + } +*buffer = _pcre_utf8_table2[i] | cvalue; +return i + 1; +#else +(void)(cvalue); /* Keep compiler happy; this function won't ever be */ +(void)(buffer); /* called when SUPPORT_UTF8 is not defined. */ +return 0; +#endif +} + +/* End of pcre_ord2utf8.c */ diff --git a/glib/pcre/pcre_refcount.c b/glib/pcre/pcre_refcount.c new file mode 100644 index 0000000..92e4b85 --- /dev/null +++ b/glib/pcre/pcre_refcount.c @@ -0,0 +1,82 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_refcount(), which is an +auxiliary function that can be used to maintain a reference count in a compiled +pattern data block. This might be helpful in applications where the block is +shared by different users. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Maintain reference count * +*************************************************/ + +/* The reference count is a 16-bit field, initialized to zero. It is not +possible to transfer a non-zero count from one host to a different host that +has a different byte order - though I can't see why anyone in their right mind +would ever want to do that! + +Arguments: + argument_re points to compiled code + adjust value to add to the count + +Returns: the (possibly updated) count value (a non-negative number), or + a negative error number +*/ + +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_refcount(pcre *argument_re, int adjust) +{ +real_pcre *re = (real_pcre *)argument_re; +if (re == NULL) return PCRE_ERROR_NULL; +re->ref_count = (-adjust > re->ref_count)? 0 : + (adjust + re->ref_count > 65535)? 65535 : + re->ref_count + adjust; +return re->ref_count; +} + +/* End of pcre_refcount.c */ diff --git a/glib/pcre/pcre_study.c b/glib/pcre/pcre_study.c new file mode 100644 index 0000000..778851d --- /dev/null +++ b/glib/pcre/pcre_study.c @@ -0,0 +1,588 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_study(), along with local +supporting functions. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/* Returns from set_start_bits() */ + +enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE }; + + +/************************************************* +* Set a bit and maybe its alternate case * +*************************************************/ + +/* Given a character, set its bit in the table, and also the bit for the other +version of a letter if we are caseless. + +Arguments: + start_bits points to the bit map + c is the character + caseless the caseless flag + cd the block with char table pointers + +Returns: nothing +*/ + +static void +set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd) +{ +start_bits[c/8] |= (1 << (c&7)); +if (caseless && (cd->ctypes[c] & ctype_letter) != 0) + start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7)); +} + + + +/************************************************* +* Create bitmap of starting bytes * +*************************************************/ + +/* This function scans a compiled unanchored expression recursively and +attempts to build a bitmap of the set of possible starting bytes. As time goes +by, we may be able to get more clever at doing this. The SSB_CONTINUE return is +useful for parenthesized groups in patterns such as (a*)b where the group +provides some optional starting bytes but scanning must continue at the outer +level to find at least one mandatory byte. At the outermost level, this +function fails unless the result is SSB_DONE. + +Arguments: + code points to an expression + start_bits points to a 32-byte table, initialized to 0 + caseless the current state of the caseless flag + utf8 TRUE if in UTF-8 mode + cd the block with char table pointers + +Returns: SSB_FAIL => Failed to find any starting bytes + SSB_DONE => Found mandatory starting bytes + SSB_CONTINUE => Found optional starting bytes +*/ + +static int +set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless, + BOOL utf8, compile_data *cd) +{ +register int c; +int yield = SSB_DONE; + +#if 0 +/* ========================================================================= */ +/* The following comment and code was inserted in January 1999. In May 2006, +when it was observed to cause compiler warnings about unused values, I took it +out again. If anybody is still using OS/2, they will have to put it back +manually. */ + +/* This next statement and the later reference to dummy are here in order to +trick the optimizer of the IBM C compiler for OS/2 into generating correct +code. Apparently IBM isn't going to fix the problem, and we would rather not +disable optimization (in this module it actually makes a big difference, and +the pcre module can use all the optimization it can get). */ + +volatile int dummy; +/* ========================================================================= */ +#endif + +do + { + const uschar *tcode = code + (((int)*code == OP_CBRA)? 3:1) + LINK_SIZE; + BOOL try_next = TRUE; + + while (try_next) /* Loop for items in this branch */ + { + int rc; + switch(*tcode) + { + /* Fail if we reach something we don't understand */ + + default: + return SSB_FAIL; + + /* If we hit a bracket or a positive lookahead assertion, recurse to set + bits from within the subpattern. If it can't find anything, we have to + give up. If it finds some mandatory character(s), we are done for this + branch. Otherwise, carry on scanning after the subpattern. */ + + case OP_BRA: + case OP_SBRA: + case OP_CBRA: + case OP_SCBRA: + case OP_ONCE: + case OP_ASSERT: + rc = set_start_bits(tcode, start_bits, caseless, utf8, cd); + if (rc == SSB_FAIL) return SSB_FAIL; + if (rc == SSB_DONE) try_next = FALSE; else + { + do tcode += GET(tcode, 1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + } + break; + + /* If we hit ALT or KET, it means we haven't found anything mandatory in + this branch, though we might have found something optional. For ALT, we + continue with the next alternative, but we have to arrange that the final + result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET, + return SSB_CONTINUE: if this is the top level, that indicates failure, + but after a nested subpattern, it causes scanning to continue. */ + + case OP_ALT: + yield = SSB_CONTINUE; + try_next = FALSE; + break; + + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + return SSB_CONTINUE; + + /* Skip over callout */ + + case OP_CALLOUT: + tcode += 2 + 2*LINK_SIZE; + break; + + /* Skip over lookbehind and negative lookahead assertions */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do tcode += GET(tcode, 1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + break; + + /* Skip over an option setting, changing the caseless flag */ + + case OP_OPT: + caseless = (tcode[1] & PCRE_CASELESS) != 0; + tcode += 2; + break; + + /* BRAZERO does the bracket, but carries on. */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + if (set_start_bits(++tcode, start_bits, caseless, utf8, cd) == SSB_FAIL) + return SSB_FAIL; +/* ========================================================================= + See the comment at the head of this function concerning the next line, + which was an old fudge for the benefit of OS/2. + dummy = 1; + ========================================================================= */ + do tcode += GET(tcode,1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + break; + + /* SKIPZERO skips the bracket. */ + + case OP_SKIPZERO: + tcode++; + do tcode += GET(tcode,1); while (*tcode == OP_ALT); + tcode += 1 + LINK_SIZE; + break; + + /* Single-char * or ? sets the bit and tries the next item */ + + case OP_STAR: + case OP_MINSTAR: + case OP_POSSTAR: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSQUERY: + set_bit(start_bits, tcode[1], caseless, cd); + tcode += 2; +#ifdef SUPPORT_UTF8 + if (utf8 && tcode[-1] >= 0xc0) + tcode += _pcre_utf8_table4[tcode[-1] & 0x3f]; +#endif + break; + + /* Single-char upto sets the bit and tries the next */ + + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + set_bit(start_bits, tcode[3], caseless, cd); + tcode += 4; +#ifdef SUPPORT_UTF8 + if (utf8 && tcode[-1] >= 0xc0) + tcode += _pcre_utf8_table4[tcode[-1] & 0x3f]; +#endif + break; + + /* At least one single char sets the bit and stops */ + + case OP_EXACT: /* Fall through */ + tcode += 2; + + case OP_CHAR: + case OP_CHARNC: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + set_bit(start_bits, tcode[1], caseless, cd); + try_next = FALSE; + break; + + /* Single character type sets the bits and stops */ + + case OP_NOT_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_digit]; + try_next = FALSE; + break; + + case OP_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_digit]; + try_next = FALSE; + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + discard it. */ + + case OP_NOT_WHITESPACE: + for (c = 0; c < 32; c++) + { + int d = cd->cbits[c+cbit_space]; + if (c == 1) d &= ~0x08; + start_bits[c] |= ~d; + } + try_next = FALSE; + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + discard it. */ + + case OP_WHITESPACE: + for (c = 0; c < 32; c++) + { + int d = cd->cbits[c+cbit_space]; + if (c == 1) d &= ~0x08; + start_bits[c] |= d; + } + try_next = FALSE; + break; + + case OP_NOT_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_word]; + try_next = FALSE; + break; + + case OP_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_word]; + try_next = FALSE; + break; + + /* One or more character type fudges the pointer and restarts, knowing + it will hit a single character type and stop there. */ + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + tcode++; + break; + + case OP_TYPEEXACT: + tcode += 3; + break; + + /* Zero or more repeats of character types set the bits and then + try again. */ + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + tcode += 2; /* Fall through */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + switch(tcode[1]) + { + case OP_ANY: + case OP_ALLANY: + return SSB_FAIL; + + case OP_NOT_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_digit]; + break; + + case OP_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_digit]; + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + discard it. */ + + case OP_NOT_WHITESPACE: + for (c = 0; c < 32; c++) + { + int d = cd->cbits[c+cbit_space]; + if (c == 1) d &= ~0x08; + start_bits[c] |= ~d; + } + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + discard it. */ + + case OP_WHITESPACE: + for (c = 0; c < 32; c++) + { + int d = cd->cbits[c+cbit_space]; + if (c == 1) d &= ~0x08; + start_bits[c] |= d; + } + break; + + case OP_NOT_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_word]; + break; + + case OP_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_word]; + break; + } + + tcode += 2; + break; + + /* Character class where all the information is in a bit map: set the + bits and either carry on or not, according to the repeat count. If it was + a negative class, and we are operating with UTF-8 characters, any byte + with a value >= 0xc4 is a potentially valid starter because it starts a + character with a value > 255. */ + + case OP_NCLASS: +#ifdef SUPPORT_UTF8 + if (utf8) + { + start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */ + memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */ + } +#endif + /* Fall through */ + + case OP_CLASS: + { + tcode++; + + /* In UTF-8 mode, the bits in a bit map correspond to character + values, not to byte values. However, the bit map we are constructing is + for byte values. So we have to do a conversion for characters whose + value is > 127. In fact, there are only two possible starting bytes for + characters in the range 128 - 255. */ + +#ifdef SUPPORT_UTF8 + if (utf8) + { + for (c = 0; c < 16; c++) start_bits[c] |= tcode[c]; + for (c = 128; c < 256; c++) + { + if ((tcode[c/8] && (1 << (c&7))) != 0) + { + int d = (c >> 6) | 0xc0; /* Set bit for this starter */ + start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */ + c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ + } + } + } + + /* In non-UTF-8 mode, the two bit maps are completely compatible. */ + + else +#endif + { + for (c = 0; c < 32; c++) start_bits[c] |= tcode[c]; + } + + /* Advance past the bit map, and act on what follows */ + + tcode += 32; + switch (*tcode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + tcode++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5; + else try_next = FALSE; + break; + + default: + try_next = FALSE; + break; + } + } + break; /* End of bitmap class handling */ + + } /* End of switch */ + } /* End of try_next loop */ + + code += GET(code, 1); /* Advance to next branch */ + } +while (*code == OP_ALT); +return yield; +} + + + +/************************************************* +* Study a compiled expression * +*************************************************/ + +/* This function is handed a compiled expression that it must study to produce +information that will speed up the matching. It returns a pcre_extra block +which then gets handed back to pcre_exec(). + +Arguments: + re points to the compiled expression + options contains option bits + errorptr points to where to place error messages; + set NULL unless error + +Returns: pointer to a pcre_extra block, with study_data filled in and the + appropriate flag set; + NULL on error or if no optimization possible +*/ + +PCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION +pcre_study(const pcre *external_re, int options, const char **errorptr) +{ +uschar start_bits[32]; +pcre_extra *extra; +pcre_study_data *study; +const uschar *tables; +uschar *code; +compile_data compile_block; +const real_pcre *re = (const real_pcre *)external_re; + +*errorptr = NULL; + +if (re == NULL || re->magic_number != MAGIC_NUMBER) + { + *errorptr = "argument is not a compiled regular expression"; + return NULL; + } + +if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) + { + *errorptr = "unknown or incorrect option bit(s) set"; + return NULL; + } + +code = (uschar *)re + re->name_table_offset + + (re->name_count * re->name_entry_size); + +/* For an anchored pattern, or an unanchored pattern that has a first char, or +a multiline pattern that matches only at "line starts", no further processing +at present. */ + +if ((re->options & PCRE_ANCHORED) != 0 || + (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) + return NULL; + +/* Set the character tables in the block that is passed around */ + +tables = re->tables; +if (tables == NULL) + (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, + (void *)(&tables)); + +compile_block.lcc = tables + lcc_offset; +compile_block.fcc = tables + fcc_offset; +compile_block.cbits = tables + cbits_offset; +compile_block.ctypes = tables + ctypes_offset; + +/* See if we can find a fixed set of initial characters for the pattern. */ + +memset(start_bits, 0, 32 * sizeof(uschar)); +if (set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0, + (re->options & PCRE_UTF8) != 0, &compile_block) != SSB_DONE) return NULL; + +/* Get a pcre_extra block and a pcre_study_data block. The study data is put in +the latter, which is pointed to by the former, which may also get additional +data set later by the calling program. At the moment, the size of +pcre_study_data is fixed. We nevertheless save it in a field for returning via +the pcre_fullinfo() function so that if it becomes variable in the future, we +don't have to change that code. */ + +extra = (pcre_extra *)(pcre_malloc) + (sizeof(pcre_extra) + sizeof(pcre_study_data)); + +if (extra == NULL) + { + *errorptr = "failed to get memory"; + return NULL; + } + +study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra)); +extra->flags = PCRE_EXTRA_STUDY_DATA; +extra->study_data = study; + +study->size = sizeof(pcre_study_data); +study->options = PCRE_STUDY_MAPPED; +memcpy(study->start_bits, start_bits, sizeof(start_bits)); + +return extra; +} + +/* End of pcre_study.c */ diff --git a/glib/pcre/pcre_tables.c b/glib/pcre/pcre_tables.c new file mode 100644 index 0000000..160bc5d --- /dev/null +++ b/glib/pcre/pcre_tables.c @@ -0,0 +1,356 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains some fixed tables that are used by more than one of the +PCRE code modules. The tables are also #included by the pcretest program, which +uses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name +clashes with the library. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that +the definition is next to the definition of the opcodes in pcre_internal.h. */ + +const uschar _pcre_OP_lengths[] = { OP_LENGTHS }; + + + +/************************************************* +* Tables for UTF-8 support * +*************************************************/ + +/* These are the breakpoints for different numbers of bytes in a UTF-8 +character. */ + +#ifdef SUPPORT_UTF8 + +const int _pcre_utf8_table1[] = + { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; + +const int _pcre_utf8_table1_size = sizeof(_pcre_utf8_table1)/sizeof(int); + +/* These are the indicator bits and the mask for the data bits to set in the +first byte of a character, indexed by the number of additional bytes. */ + +const int _pcre_utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; +const int _pcre_utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; + +/* Table of the number of extra bytes, indexed by the first byte masked with +0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */ + +const uschar _pcre_utf8_table4[] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; + +/* Table to translate from particular type value to the general value. */ + +const int _pcre_ucp_gentype[] = { + ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */ + ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */ + ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */ + ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */ + ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */ + ucp_P, ucp_P, /* Ps, Po */ + ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */ + ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */ +}; + +/* The pcre_utt[] table below translates Unicode property names into type and +code values. It is searched by binary chop, so must be in collating sequence of +name. Originally, the table contained pointers to the name strings in the first +field of each entry. However, that leads to a large number of relocations when +a shared library is dynamically loaded. A significant reduction is made by +putting all the names into a single, large string and then using offsets in the +table itself. Maintenance is more error-prone, but frequent changes to this +data are unlikely. + +July 2008: There is now a script called maint/GenerateUtt.py which can be used +to generate this data instead of maintaining it entirely by hand. */ + +const char _pcre_utt_names[] = + "Any\0" + "Arabic\0" + "Armenian\0" + "Balinese\0" + "Bengali\0" + "Bopomofo\0" + "Braille\0" + "Buginese\0" + "Buhid\0" + "C\0" + "Canadian_Aboriginal\0" + "Carian\0" + "Cc\0" + "Cf\0" + "Cham\0" + "Cherokee\0" + "Cn\0" + "Co\0" + "Common\0" + "Coptic\0" + "Cs\0" + "Cuneiform\0" + "Cypriot\0" + "Cyrillic\0" + "Deseret\0" + "Devanagari\0" + "Ethiopic\0" + "Georgian\0" + "Glagolitic\0" + "Gothic\0" + "Greek\0" + "Gujarati\0" + "Gurmukhi\0" + "Han\0" + "Hangul\0" + "Hanunoo\0" + "Hebrew\0" + "Hiragana\0" + "Inherited\0" + "Kannada\0" + "Katakana\0" + "Kayah_Li\0" + "Kharoshthi\0" + "Khmer\0" + "L\0" + "L&\0" + "Lao\0" + "Latin\0" + "Lepcha\0" + "Limbu\0" + "Linear_B\0" + "Ll\0" + "Lm\0" + "Lo\0" + "Lt\0" + "Lu\0" + "Lycian\0" + "Lydian\0" + "M\0" + "Malayalam\0" + "Mc\0" + "Me\0" + "Mn\0" + "Mongolian\0" + "Myanmar\0" + "N\0" + "Nd\0" + "New_Tai_Lue\0" + "Nko\0" + "Nl\0" + "No\0" + "Ogham\0" + "Ol_Chiki\0" + "Old_Italic\0" + "Old_Persian\0" + "Oriya\0" + "Osmanya\0" + "P\0" + "Pc\0" + "Pd\0" + "Pe\0" + "Pf\0" + "Phags_Pa\0" + "Phoenician\0" + "Pi\0" + "Po\0" + "Ps\0" + "Rejang\0" + "Runic\0" + "S\0" + "Saurashtra\0" + "Sc\0" + "Shavian\0" + "Sinhala\0" + "Sk\0" + "Sm\0" + "So\0" + "Sundanese\0" + "Syloti_Nagri\0" + "Syriac\0" + "Tagalog\0" + "Tagbanwa\0" + "Tai_Le\0" + "Tamil\0" + "Telugu\0" + "Thaana\0" + "Thai\0" + "Tibetan\0" + "Tifinagh\0" + "Ugaritic\0" + "Vai\0" + "Yi\0" + "Z\0" + "Zl\0" + "Zp\0" + "Zs\0"; + +const ucp_type_table _pcre_utt[] = { + { 0, PT_ANY, 0 }, + { 4, PT_SC, ucp_Arabic }, + { 11, PT_SC, ucp_Armenian }, + { 20, PT_SC, ucp_Balinese }, + { 29, PT_SC, ucp_Bengali }, + { 37, PT_SC, ucp_Bopomofo }, + { 46, PT_SC, ucp_Braille }, + { 54, PT_SC, ucp_Buginese }, + { 63, PT_SC, ucp_Buhid }, + { 69, PT_GC, ucp_C }, + { 71, PT_SC, ucp_Canadian_Aboriginal }, + { 91, PT_SC, ucp_Carian }, + { 98, PT_PC, ucp_Cc }, + { 101, PT_PC, ucp_Cf }, + { 104, PT_SC, ucp_Cham }, + { 109, PT_SC, ucp_Cherokee }, + { 118, PT_PC, ucp_Cn }, + { 121, PT_PC, ucp_Co }, + { 124, PT_SC, ucp_Common }, + { 131, PT_SC, ucp_Coptic }, + { 138, PT_PC, ucp_Cs }, + { 141, PT_SC, ucp_Cuneiform }, + { 151, PT_SC, ucp_Cypriot }, + { 159, PT_SC, ucp_Cyrillic }, + { 168, PT_SC, ucp_Deseret }, + { 176, PT_SC, ucp_Devanagari }, + { 187, PT_SC, ucp_Ethiopic }, + { 196, PT_SC, ucp_Georgian }, + { 205, PT_SC, ucp_Glagolitic }, + { 216, PT_SC, ucp_Gothic }, + { 223, PT_SC, ucp_Greek }, + { 229, PT_SC, ucp_Gujarati }, + { 238, PT_SC, ucp_Gurmukhi }, + { 247, PT_SC, ucp_Han }, + { 251, PT_SC, ucp_Hangul }, + { 258, PT_SC, ucp_Hanunoo }, + { 266, PT_SC, ucp_Hebrew }, + { 273, PT_SC, ucp_Hiragana }, + { 282, PT_SC, ucp_Inherited }, + { 292, PT_SC, ucp_Kannada }, + { 300, PT_SC, ucp_Katakana }, + { 309, PT_SC, ucp_Kayah_Li }, + { 318, PT_SC, ucp_Kharoshthi }, + { 329, PT_SC, ucp_Khmer }, + { 335, PT_GC, ucp_L }, + { 337, PT_LAMP, 0 }, + { 340, PT_SC, ucp_Lao }, + { 344, PT_SC, ucp_Latin }, + { 350, PT_SC, ucp_Lepcha }, + { 357, PT_SC, ucp_Limbu }, + { 363, PT_SC, ucp_Linear_B }, + { 372, PT_PC, ucp_Ll }, + { 375, PT_PC, ucp_Lm }, + { 378, PT_PC, ucp_Lo }, + { 381, PT_PC, ucp_Lt }, + { 384, PT_PC, ucp_Lu }, + { 387, PT_SC, ucp_Lycian }, + { 394, PT_SC, ucp_Lydian }, + { 401, PT_GC, ucp_M }, + { 403, PT_SC, ucp_Malayalam }, + { 413, PT_PC, ucp_Mc }, + { 416, PT_PC, ucp_Me }, + { 419, PT_PC, ucp_Mn }, + { 422, PT_SC, ucp_Mongolian }, + { 432, PT_SC, ucp_Myanmar }, + { 440, PT_GC, ucp_N }, + { 442, PT_PC, ucp_Nd }, + { 445, PT_SC, ucp_New_Tai_Lue }, + { 457, PT_SC, ucp_Nko }, + { 461, PT_PC, ucp_Nl }, + { 464, PT_PC, ucp_No }, + { 467, PT_SC, ucp_Ogham }, + { 473, PT_SC, ucp_Ol_Chiki }, + { 482, PT_SC, ucp_Old_Italic }, + { 493, PT_SC, ucp_Old_Persian }, + { 505, PT_SC, ucp_Oriya }, + { 511, PT_SC, ucp_Osmanya }, + { 519, PT_GC, ucp_P }, + { 521, PT_PC, ucp_Pc }, + { 524, PT_PC, ucp_Pd }, + { 527, PT_PC, ucp_Pe }, + { 530, PT_PC, ucp_Pf }, + { 533, PT_SC, ucp_Phags_Pa }, + { 542, PT_SC, ucp_Phoenician }, + { 553, PT_PC, ucp_Pi }, + { 556, PT_PC, ucp_Po }, + { 559, PT_PC, ucp_Ps }, + { 562, PT_SC, ucp_Rejang }, + { 569, PT_SC, ucp_Runic }, + { 575, PT_GC, ucp_S }, + { 577, PT_SC, ucp_Saurashtra }, + { 588, PT_PC, ucp_Sc }, + { 591, PT_SC, ucp_Shavian }, + { 599, PT_SC, ucp_Sinhala }, + { 607, PT_PC, ucp_Sk }, + { 610, PT_PC, ucp_Sm }, + { 613, PT_PC, ucp_So }, + { 616, PT_SC, ucp_Sundanese }, + { 626, PT_SC, ucp_Syloti_Nagri }, + { 639, PT_SC, ucp_Syriac }, + { 646, PT_SC, ucp_Tagalog }, + { 654, PT_SC, ucp_Tagbanwa }, + { 663, PT_SC, ucp_Tai_Le }, + { 670, PT_SC, ucp_Tamil }, + { 676, PT_SC, ucp_Telugu }, + { 683, PT_SC, ucp_Thaana }, + { 690, PT_SC, ucp_Thai }, + { 695, PT_SC, ucp_Tibetan }, + { 703, PT_SC, ucp_Tifinagh }, + { 712, PT_SC, ucp_Ugaritic }, + { 721, PT_SC, ucp_Vai }, + { 725, PT_SC, ucp_Yi }, + { 728, PT_GC, ucp_Z }, + { 730, PT_PC, ucp_Zl }, + { 733, PT_PC, ucp_Zp }, + { 736, PT_PC, ucp_Zs } +}; + +const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table); + +#endif /* SUPPORT_UTF8 */ + +/* End of pcre_tables.c */ diff --git a/glib/pcre/pcre_try_flipped.c b/glib/pcre/pcre_try_flipped.c new file mode 100644 index 0000000..0d2f3a2 --- /dev/null +++ b/glib/pcre/pcre_try_flipped.c @@ -0,0 +1,137 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains an internal function that tests a compiled pattern to +see if it was compiled with the opposite endianness. If so, it uses an +auxiliary local function to flip the appropriate bytes. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Flip bytes in an integer * +*************************************************/ + +/* This function is called when the magic number in a regex doesn't match, in +order to flip its bytes to see if we are dealing with a pattern that was +compiled on a host of different endianness. If so, this function is used to +flip other byte values. + +Arguments: + value the number to flip + n the number of bytes to flip (assumed to be 2 or 4) + +Returns: the flipped value +*/ + +static unsigned long int +byteflip(unsigned long int value, int n) +{ +if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8); +return ((value & 0x000000ff) << 24) | + ((value & 0x0000ff00) << 8) | + ((value & 0x00ff0000) >> 8) | + ((value & 0xff000000) >> 24); +} + + + +/************************************************* +* Test for a byte-flipped compiled regex * +*************************************************/ + +/* This function is called from pcre_exec(), pcre_dfa_exec(), and also from +pcre_fullinfo(). Its job is to test whether the regex is byte-flipped - that +is, it was compiled on a system of opposite endianness. The function is called +only when the native MAGIC_NUMBER test fails. If the regex is indeed flipped, +we flip all the relevant values into a different data block, and return it. + +Arguments: + re points to the regex + study points to study data, or NULL + internal_re points to a new regex block + internal_study points to a new study block + +Returns: the new block if is is indeed a byte-flipped regex + NULL if it is not +*/ + +real_pcre * +_pcre_try_flipped(const real_pcre *re, real_pcre *internal_re, + const pcre_study_data *study, pcre_study_data *internal_study) +{ +if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER) + return NULL; + +*internal_re = *re; /* To copy other fields */ +internal_re->size = byteflip(re->size, sizeof(re->size)); +internal_re->options = byteflip(re->options, sizeof(re->options)); +internal_re->flags = (pcre_uint16)byteflip(re->flags, sizeof(re->flags)); +internal_re->top_bracket = + (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket)); +internal_re->top_backref = + (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref)); +internal_re->first_byte = + (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte)); +internal_re->req_byte = + (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte)); +internal_re->name_table_offset = + (pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset)); +internal_re->name_entry_size = + (pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size)); +internal_re->name_count = + (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count)); + +if (study != NULL) + { + *internal_study = *study; /* To copy other fields */ + internal_study->size = byteflip(study->size, sizeof(study->size)); + internal_study->options = byteflip(study->options, sizeof(study->options)); + } + +return internal_re; +} + +/* End of pcre_tryflipped.c */ diff --git a/glib/pcre/pcre_ucp_searchfuncs.c b/glib/pcre/pcre_ucp_searchfuncs.c new file mode 100644 index 0000000..3e1ed38 --- /dev/null +++ b/glib/pcre/pcre_ucp_searchfuncs.c @@ -0,0 +1,85 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2006 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This file has been modified to use glib instead of the internal table + * in ucptable.c -- Marco Barisione */ + +/* This module contains code for searching the table of Unicode character +properties. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#include "ucp.h" /* Category definitions */ + + +/************************************************* +* Search table and return other case * +*************************************************/ + +/* If the given character is a letter, and there is another case for the +letter, return the other case. Otherwise, return -1. + +Arguments: + c the character value + +Returns: the other case or NOTACHAR if none +*/ + +unsigned int +_pcre_ucp_othercase(const unsigned int c) +{ +unsigned int other_case = NOTACHAR; + +if (g_unichar_islower(c)) + other_case = g_unichar_toupper(c); +else if (g_unichar_isupper(c)) + other_case = g_unichar_tolower(c); + +if (other_case == c) + other_case = NOTACHAR; + +return other_case; +} + + +/* End of pcre_ucp_searchfuncs.c */ diff --git a/glib/pcre/pcre_valid_utf8.c b/glib/pcre/pcre_valid_utf8.c new file mode 100644 index 0000000..b7671a9 --- /dev/null +++ b/glib/pcre/pcre_valid_utf8.c @@ -0,0 +1,14 @@ +#include "config.h" +#include "pcre_internal.h" + +/* + * This function is not needed by GRegex, so print an error and + * return always -1, that is the string is a valid UTF-8 encoded + * string. + */ +int +_pcre_valid_utf8(const uschar *string, int length) +{ +g_warning ("%s: this function should not be called", G_STRLOC); +return -1; +} diff --git a/glib/pcre/pcre_version.c b/glib/pcre/pcre_version.c new file mode 100644 index 0000000..7067cd4 --- /dev/null +++ b/glib/pcre/pcre_version.c @@ -0,0 +1,90 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains the external function pcre_version(), which returns a +string that identifies the PCRE version that is in use. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Return version string * +*************************************************/ + +/* These macros are the standard way of turning unquoted text into C strings. +They allow macros like PCRE_MAJOR to be defined without quotes, which is +convenient for user programs that want to test its value. */ + +#define STRING(a) # a +#define XSTRING(s) STRING(s) + +/* A problem turned up with PCRE_PRERELEASE, which is defined empty for +production releases. Originally, it was used naively in this code: + + return XSTRING(PCRE_MAJOR) + "." XSTRING(PCRE_MINOR) + XSTRING(PCRE_PRERELEASE) + " " XSTRING(PCRE_DATE); + +However, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of +STRING(). The C standard states: "If (before argument substitution) any +argument consists of no preprocessing tokens, the behavior is undefined." It +turns out the gcc treats this case as a single empty string - which is what we +really want - but Visual C grumbles about the lack of an argument for the +macro. Unfortunately, both are within their rights. To cope with both ways of +handling this, I had resort to some messy hackery that does a test at run time. +I could find no way of detecting that a macro is defined as an empty string at +pre-processor time. This hack uses a standard trick for avoiding calling +the STRING macro with an empty argument when doing the test. */ + +PCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION +pcre_version(void) +{ +return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)? + XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) : + XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE); +} + +/* End of pcre_version.c */ diff --git a/glib/pcre/pcre_xclass.c b/glib/pcre/pcre_xclass.c new file mode 100644 index 0000000..e8e7a50 --- /dev/null +++ b/glib/pcre/pcre_xclass.c @@ -0,0 +1,146 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2008 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + + +/* This module contains an internal function that is used to match an extended +class (one that contains characters whose values are > 255). It is used by both +pcre_exec() and pcre_def_exec(). */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Match character against an XCLASS * +*************************************************/ + +/* This function is called to match a character against an extended class that +might contain values > 255. + +Arguments: + c the character + data points to the flag byte of the XCLASS data + +Returns: TRUE if character matches, else FALSE +*/ + +BOOL +_pcre_xclass(int c, const uschar *data) +{ +int t; +BOOL negated = (*data & XCL_NOT) != 0; + +/* Character values < 256 are matched against a bitmap, if one is present. If +not, we still carry on, because there may be ranges that start below 256 in the +additional data. */ + +if (c < 256) + { + if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0) + return !negated; /* char found */ + } + +/* First skip the bit map if present. Then match against the list of Unicode +properties or large chars or ranges that end with a large char. We won't ever +encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */ + +if ((*data++ & XCL_MAP) != 0) data += 32; + +while ((t = *data++) != XCL_END) + { + int x, y; + if (t == XCL_SINGLE) + { + GETCHARINC(x, data); + if (c == x) return !negated; + } + else if (t == XCL_RANGE) + { + GETCHARINC(x, data); + GETCHARINC(y, data); + if (c >= x && c <= y) return !negated; + } + +#ifdef SUPPORT_UCP + else /* XCL_PROP & XCL_NOTPROP */ + { + int chartype = UCD_CHARTYPE(c); + switch(*data) + { + case PT_ANY: + if (t == XCL_PROP) return !negated; + break; + + case PT_LAMP: + if ((chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt) == + (t == XCL_PROP)) return !negated; + break; + + case PT_GC: + if ((data[1] == _pcre_ucp_gentype[chartype]) == (t == XCL_PROP)) return !negated; + break; + + case PT_PC: + if ((data[1] == chartype) == (t == XCL_PROP)) return !negated; + break; + + case PT_SC: + if ((data[1] == UCD_SCRIPT(c)) == (t == XCL_PROP)) return !negated; + break; + + /* This should never occur, but compilers may mutter if there is no + default. */ + + default: + return FALSE; + } + + data += 2; + } +#endif /* SUPPORT_UCP */ + } + +return negated; /* char did not match */ +} + +/* End of pcre_xclass.c */ diff --git a/glib/pcre/ucp.h b/glib/pcre/ucp.h new file mode 100644 index 0000000..fe910ce --- /dev/null +++ b/glib/pcre/ucp.h @@ -0,0 +1,144 @@ +/************************************************* +* Unicode Property Table handler * +*************************************************/ + +#ifndef _UCP_H +#define _UCP_H + +/* This file contains definitions of the property values that are returned by +the function _pcre_ucp_findprop(). New values that are added for new releases +of Unicode should always be at the end of each enum, for backwards +compatibility. */ + +/* These are the general character categories. */ + +enum { + ucp_C, /* Other */ + ucp_L, /* Letter */ + ucp_M, /* Mark */ + ucp_N, /* Number */ + ucp_P, /* Punctuation */ + ucp_S, /* Symbol */ + ucp_Z /* Separator */ +}; + +/* These are the particular character types. */ + +enum { + ucp_Cc, /* Control */ + ucp_Cf, /* Format */ + ucp_Cn, /* Unassigned */ + ucp_Co, /* Private use */ + ucp_Cs, /* Surrogate */ + ucp_Ll, /* Lower case letter */ + ucp_Lm, /* Modifier letter */ + ucp_Lo, /* Other letter */ + ucp_Lt, /* Title case letter */ + ucp_Lu, /* Upper case letter */ + ucp_Mc, /* Spacing mark */ + ucp_Me, /* Enclosing mark */ + ucp_Mn, /* Non-spacing mark */ + ucp_Nd, /* Decimal number */ + ucp_Nl, /* Letter number */ + ucp_No, /* Other number */ + ucp_Pc, /* Connector punctuation */ + ucp_Pd, /* Dash punctuation */ + ucp_Pe, /* Close punctuation */ + ucp_Pf, /* Final punctuation */ + ucp_Pi, /* Initial punctuation */ + ucp_Po, /* Other punctuation */ + ucp_Ps, /* Open punctuation */ + ucp_Sc, /* Currency symbol */ + ucp_Sk, /* Modifier symbol */ + ucp_Sm, /* Mathematical symbol */ + ucp_So, /* Other symbol */ + ucp_Zl, /* Line separator */ + ucp_Zp, /* Paragraph separator */ + ucp_Zs /* Space separator */ +}; + +/* These are the script identifications. */ + +enum { + ucp_Arabic = G_UNICODE_SCRIPT_ARABIC, + ucp_Armenian = G_UNICODE_SCRIPT_ARMENIAN, + ucp_Bengali = G_UNICODE_SCRIPT_BENGALI, + ucp_Bopomofo = G_UNICODE_SCRIPT_BOPOMOFO, + ucp_Braille = G_UNICODE_SCRIPT_BRAILLE, + ucp_Buginese = G_UNICODE_SCRIPT_BUGINESE, + ucp_Buhid = G_UNICODE_SCRIPT_BUHID, + ucp_Canadian_Aboriginal = G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + ucp_Cherokee = G_UNICODE_SCRIPT_CHEROKEE, + ucp_Common = G_UNICODE_SCRIPT_COMMON, + ucp_Coptic = G_UNICODE_SCRIPT_COPTIC, + ucp_Cypriot = G_UNICODE_SCRIPT_CYPRIOT, + ucp_Cyrillic = G_UNICODE_SCRIPT_CYRILLIC, + ucp_Deseret = G_UNICODE_SCRIPT_DESERET, + ucp_Devanagari = G_UNICODE_SCRIPT_DEVANAGARI, + ucp_Ethiopic = G_UNICODE_SCRIPT_ETHIOPIC, + ucp_Georgian = G_UNICODE_SCRIPT_GEORGIAN, + ucp_Glagolitic = G_UNICODE_SCRIPT_GLAGOLITIC, + ucp_Gothic = G_UNICODE_SCRIPT_GOTHIC, + ucp_Greek = G_UNICODE_SCRIPT_GREEK, + ucp_Gujarati = G_UNICODE_SCRIPT_GUJARATI, + ucp_Gurmukhi = G_UNICODE_SCRIPT_GURMUKHI, + ucp_Han = G_UNICODE_SCRIPT_HAN, + ucp_Hangul = G_UNICODE_SCRIPT_HANGUL, + ucp_Hanunoo = G_UNICODE_SCRIPT_HANUNOO, + ucp_Hebrew = G_UNICODE_SCRIPT_HEBREW, + ucp_Hiragana = G_UNICODE_SCRIPT_HIRAGANA, + ucp_Inherited = G_UNICODE_SCRIPT_INHERITED, + ucp_Kannada = G_UNICODE_SCRIPT_KANNADA, + ucp_Katakana = G_UNICODE_SCRIPT_KATAKANA, + ucp_Kharoshthi = G_UNICODE_SCRIPT_KHAROSHTHI, + ucp_Khmer = G_UNICODE_SCRIPT_KHMER, + ucp_Lao = G_UNICODE_SCRIPT_LAO, + ucp_Latin = G_UNICODE_SCRIPT_LATIN, + ucp_Limbu = G_UNICODE_SCRIPT_LIMBU, + ucp_Linear_B = G_UNICODE_SCRIPT_LINEAR_B, + ucp_Malayalam = G_UNICODE_SCRIPT_MALAYALAM, + ucp_Mongolian = G_UNICODE_SCRIPT_MONGOLIAN, + ucp_Myanmar = G_UNICODE_SCRIPT_MYANMAR, + ucp_New_Tai_Lue = G_UNICODE_SCRIPT_NEW_TAI_LUE, + ucp_Ogham = G_UNICODE_SCRIPT_OGHAM, + ucp_Old_Italic = G_UNICODE_SCRIPT_OLD_ITALIC, + ucp_Old_Persian = G_UNICODE_SCRIPT_OLD_PERSIAN, + ucp_Oriya = G_UNICODE_SCRIPT_ORIYA, + ucp_Osmanya = G_UNICODE_SCRIPT_OSMANYA, + ucp_Runic = G_UNICODE_SCRIPT_RUNIC, + ucp_Shavian = G_UNICODE_SCRIPT_SHAVIAN, + ucp_Sinhala = G_UNICODE_SCRIPT_SINHALA, + ucp_Syloti_Nagri = G_UNICODE_SCRIPT_SYLOTI_NAGRI, + ucp_Syriac = G_UNICODE_SCRIPT_SYRIAC, + ucp_Tagalog = G_UNICODE_SCRIPT_TAGALOG, + ucp_Tagbanwa = G_UNICODE_SCRIPT_TAGBANWA, + ucp_Tai_Le = G_UNICODE_SCRIPT_TAI_LE, + ucp_Tamil = G_UNICODE_SCRIPT_TAMIL, + ucp_Telugu = G_UNICODE_SCRIPT_TELUGU, + ucp_Thaana = G_UNICODE_SCRIPT_THAANA, + ucp_Thai = G_UNICODE_SCRIPT_THAI, + ucp_Tibetan = G_UNICODE_SCRIPT_TIBETAN, + ucp_Tifinagh = G_UNICODE_SCRIPT_TIFINAGH, + ucp_Ugaritic = G_UNICODE_SCRIPT_UGARITIC, + ucp_Yi = G_UNICODE_SCRIPT_YI, + ucp_Balinese = G_UNICODE_SCRIPT_BALINESE, /* New for Unicode 5.0.0 */ + ucp_Cuneiform = G_UNICODE_SCRIPT_CUNEIFORM, /* New for Unicode 5.0.0 */ + ucp_Nko = G_UNICODE_SCRIPT_NKO, /* New for Unicode 5.0.0 */ + ucp_Phags_Pa = G_UNICODE_SCRIPT_PHAGS_PA, /* New for Unicode 5.0.0 */ + ucp_Phoenician = G_UNICODE_SCRIPT_PHOENICIAN, /* New for Unicode 5.0.0 */ + ucp_Carian = G_UNICODE_SCRIPT_CARIAN, /* New for Unicode 5.1 */ + ucp_Cham = G_UNICODE_SCRIPT_CHAM, /* New for Unicode 5.1 */ + ucp_Kayah_Li = G_UNICODE_SCRIPT_KAYAH_LI, /* New for Unicode 5.1 */ + ucp_Lepcha = G_UNICODE_SCRIPT_LEPCHA, /* New for Unicode 5.1 */ + ucp_Lycian = G_UNICODE_SCRIPT_LYCIAN, /* New for Unicode 5.1 */ + ucp_Lydian = G_UNICODE_SCRIPT_LYDIAN, /* New for Unicode 5.1 */ + ucp_Ol_Chiki = G_UNICODE_SCRIPT_OL_CHIKI, /* New for Unicode 5.1 */ + ucp_Rejang = G_UNICODE_SCRIPT_REJANG, /* New for Unicode 5.1 */ + ucp_Saurashtra = G_UNICODE_SCRIPT_SAURASHTRA, /* New for Unicode 5.1 */ + ucp_Sundanese = G_UNICODE_SCRIPT_SUNDANESE, /* New for Unicode 5.1 */ + ucp_Vai = G_UNICODE_SCRIPT_VAI /* New for Unicode 5.1 */ +}; + +#endif + +/* End of ucp.h */ diff --git a/glib/pcre/ucpinternal.h b/glib/pcre/ucpinternal.h new file mode 100644 index 0000000..a96667b --- /dev/null +++ b/glib/pcre/ucpinternal.h @@ -0,0 +1,92 @@ +/************************************************* +* Unicode Property Table handler * +*************************************************/ + +#ifndef _UCPINTERNAL_H +#define _UCPINTERNAL_H + +/* Internal header file defining the layout of the bits in each pair of 32-bit +words that form a data item in the table. */ + +typedef struct cnode { + pcre_uint32 f0; + pcre_uint32 f1; +} cnode; + +/* Things for the f0 field */ + +#define f0_scriptmask 0xff000000 /* Mask for script field */ +#define f0_scriptshift 24 /* Shift for script value */ +#define f0_rangeflag 0x00800000 /* Flag for a range item */ +#define f0_charmask 0x001fffff /* Mask for code point value */ + +/* Things for the f1 field */ + +#define f1_typemask 0xfc000000 /* Mask for char type field */ +#define f1_typeshift 26 /* Shift for the type field */ +#define f1_rangemask 0x0000ffff /* Mask for a range offset */ +#define f1_casemask 0x0000ffff /* Mask for a case offset */ +#define f1_caseneg 0xffff8000 /* Bits for negation */ + +/* The data consists of a vector of structures of type cnode. The two unsigned +32-bit integers are used as follows: + +(f0) (1) The most significant byte holds the script number. The numbers are + defined by the enum in ucp.h. + + (2) The 0x00800000 bit is set if this entry defines a range of characters. + It is not set if this entry defines a single character + + (3) The 0x00600000 bits are spare. + + (4) The 0x001fffff bits contain the code point. No Unicode code point will + ever be greater than 0x0010ffff, so this should be OK for ever. + +(f1) (1) The 0xfc000000 bits contain the character type number. The numbers are + defined by an enum in ucp.h. + + (2) The 0x03ff0000 bits are spare. + + (3) The 0x0000ffff bits contain EITHER the unsigned offset to the top of + range if this entry defines a range, OR the *signed* offset to the + character's "other case" partner if this entry defines a single + character. There is no partner if the value is zero. + +------------------------------------------------------------------------------- +| script (8) |.|.|.| codepoint (21) || type (6) |.|.| spare (8) | offset (16) | +------------------------------------------------------------------------------- + | | | | | + | | |-> spare | |-> spare + | | | + | |-> spare |-> spare + | + |-> range flag + +The upper/lower casing information is set only for characters that come in +pairs. The non-one-to-one mappings in the Unicode data are ignored. + +When searching the data, proceed as follows: + +(1) Set up for a binary chop search. + +(2) If the top is not greater than the bottom, the character is not in the + table. Its type must therefore be "Cn" ("Undefined"). + +(3) Find the middle vector element. + +(4) Extract the code point and compare. If equal, we are done. + +(5) If the test character is smaller, set the top to the current point, and + goto (2). + +(6) If the current entry defines a range, compute the last character by adding + the offset, and see if the test character is within the range. If it is, + we are done. + +(7) Otherwise, set the bottom to one element past the current point and goto + (2). +*/ + +#endif /* _UCPINTERNAL_H */ + +/* End of ucpinternal.h */ diff --git a/glib/pltcheck.sh b/glib/pltcheck.sh new file mode 100755 index 0000000..236eeb1 --- /dev/null +++ b/glib/pltcheck.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +LANG=C + +status=0 + +if ! which readelf 2>/dev/null >/dev/null; then + echo "'readelf' not found; skipping test" + exit 0 +fi + +for so in .libs/lib*.so; do + echo Checking $so for local PLT entries + # g_string_insert_c is used in g_string_append_c_inline + # unaliased. Couldn't find a way to fix it. + # Same for g_once_init_enter + readelf -r $so | grep 'JU\?MP_SLOT\?' | \ + grep -v '\' | \ + grep -v '\' | \ + grep -v '\' | \ + grep -v '\/dev/null; test "$$?" != 0 || ${XMLLINT} --noout tmpsample.xml +check-am: gtester-xmllint-check + +endif + +CLEANFILES = \ + tmpsample.xml + +EXTRA_DIST += \ + 4096-random-bytes diff --git a/glib/tests/Makefile.in b/glib/tests/Makefile.in new file mode 100644 index 0000000..92799c8 --- /dev/null +++ b/glib/tests/Makefile.in @@ -0,0 +1,783 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +noinst_PROGRAMS = $(am__EXEEXT_1) +subdir = glib/tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = testing$(EXEEXT) option-context$(EXEEXT) \ + keyfile$(EXEEXT) fileutils$(EXEEXT) printf$(EXEEXT) \ + rand$(EXEEXT) strfuncs$(EXEEXT) string$(EXEEXT) \ + markup-subparser$(EXEEXT) array-test$(EXEEXT) \ + hostutils$(EXEEXT) gvariant$(EXEEXT) mem-overflow$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +array_test_SOURCES = array-test.c +array_test_OBJECTS = array-test.$(OBJEXT) +array_test_DEPENDENCIES = $(progs_ldadd) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am_fileutils_OBJECTS = fileutils.$(OBJEXT) +fileutils_OBJECTS = $(am_fileutils_OBJECTS) +fileutils_DEPENDENCIES = $(progs_ldadd) +gvariant_SOURCES = gvariant.c +gvariant_OBJECTS = gvariant.$(OBJEXT) +gvariant_DEPENDENCIES = $(progs_ldadd) +hostutils_SOURCES = hostutils.c +hostutils_OBJECTS = hostutils.$(OBJEXT) +hostutils_DEPENDENCIES = $(progs_ldadd) +am_keyfile_OBJECTS = keyfile.$(OBJEXT) +keyfile_OBJECTS = $(am_keyfile_OBJECTS) +keyfile_DEPENDENCIES = $(progs_ldadd) +markup_subparser_SOURCES = markup-subparser.c +markup_subparser_OBJECTS = markup-subparser.$(OBJEXT) +markup_subparser_DEPENDENCIES = $(progs_ldadd) +mem_overflow_SOURCES = mem-overflow.c +mem_overflow_OBJECTS = mem-overflow.$(OBJEXT) +mem_overflow_DEPENDENCIES = $(progs_ldadd) +am_option_context_OBJECTS = option-context.$(OBJEXT) +option_context_OBJECTS = $(am_option_context_OBJECTS) +option_context_DEPENDENCIES = $(progs_ldadd) +am_printf_OBJECTS = printf.$(OBJEXT) +printf_OBJECTS = $(am_printf_OBJECTS) +printf_DEPENDENCIES = $(progs_ldadd) +am_rand_OBJECTS = rand.$(OBJEXT) +rand_OBJECTS = $(am_rand_OBJECTS) +rand_DEPENDENCIES = $(progs_ldadd) +am_strfuncs_OBJECTS = strfuncs.$(OBJEXT) +strfuncs_OBJECTS = $(am_strfuncs_OBJECTS) +strfuncs_DEPENDENCIES = $(progs_ldadd) +am_string_OBJECTS = string.$(OBJEXT) +string_OBJECTS = $(am_string_OBJECTS) +string_DEPENDENCIES = $(progs_ldadd) +am_testing_OBJECTS = testing.$(OBJEXT) +testing_OBJECTS = $(am_testing_OBJECTS) +testing_DEPENDENCIES = $(progs_ldadd) +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = array-test.c $(fileutils_SOURCES) gvariant.c hostutils.c \ + $(keyfile_SOURCES) markup-subparser.c mem-overflow.c \ + $(option_context_SOURCES) $(printf_SOURCES) $(rand_SOURCES) \ + $(strfuncs_SOURCES) $(string_SOURCES) $(testing_SOURCES) +DIST_SOURCES = array-test.c $(fileutils_SOURCES) gvariant.c \ + hostutils.c $(keyfile_SOURCES) markup-subparser.c \ + mem-overflow.c $(option_context_SOURCES) $(printf_SOURCES) \ + $(rand_SOURCES) $(strfuncs_SOURCES) $(string_SOURCES) \ + $(testing_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = 4096-random-bytes +TEST_PROGS = testing option-context keyfile fileutils printf rand \ + strfuncs string markup-subparser array-test hostutils gvariant \ + mem-overflow +INCLUDES = -g -I$(top_srcdir) -I$(top_srcdir)/glib $(GLIB_DEBUG_FLAGS) +progs_ldadd = $(top_builddir)/glib/libglib-2.0.la +testing_SOURCES = testing.c +testing_LDADD = $(progs_ldadd) +option_context_SOURCES = option-context.c +option_context_LDADD = $(progs_ldadd) +keyfile_SOURCES = keyfile.c +keyfile_LDADD = $(progs_ldadd) +fileutils_SOURCES = fileutils.c +fileutils_LDADD = $(progs_ldadd) +printf_SOURCES = printf.c +printf_LDADD = $(progs_ldadd) -lm +rand_SOURCES = rand.c +rand_LDADD = $(progs_ldadd) -lm +strfuncs_SOURCES = strfuncs.c +strfuncs_LDADD = $(progs_ldadd) -lm +string_SOURCES = string.c +string_LDADD = $(progs_ldadd) -lm +markup_subparser_LDADD = $(progs_ldadd) +array_test_LDADD = $(progs_ldadd) +hostutils_LDADD = $(progs_ldadd) +gvariant_LDADD = $(progs_ldadd) +mem_overflow_LDADD = $(progs_ldadd) + +# some testing of gtester funcitonality +@OS_UNIX_TRUE@XMLLINT = xmllint +CLEANFILES = \ + tmpsample.xml + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu glib/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu glib/tests/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-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 +array-test$(EXEEXT): $(array_test_OBJECTS) $(array_test_DEPENDENCIES) + @rm -f array-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(array_test_OBJECTS) $(array_test_LDADD) $(LIBS) +fileutils$(EXEEXT): $(fileutils_OBJECTS) $(fileutils_DEPENDENCIES) + @rm -f fileutils$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(fileutils_OBJECTS) $(fileutils_LDADD) $(LIBS) +gvariant$(EXEEXT): $(gvariant_OBJECTS) $(gvariant_DEPENDENCIES) + @rm -f gvariant$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gvariant_OBJECTS) $(gvariant_LDADD) $(LIBS) +hostutils$(EXEEXT): $(hostutils_OBJECTS) $(hostutils_DEPENDENCIES) + @rm -f hostutils$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(hostutils_OBJECTS) $(hostutils_LDADD) $(LIBS) +keyfile$(EXEEXT): $(keyfile_OBJECTS) $(keyfile_DEPENDENCIES) + @rm -f keyfile$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(keyfile_OBJECTS) $(keyfile_LDADD) $(LIBS) +markup-subparser$(EXEEXT): $(markup_subparser_OBJECTS) $(markup_subparser_DEPENDENCIES) + @rm -f markup-subparser$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(markup_subparser_OBJECTS) $(markup_subparser_LDADD) $(LIBS) +mem-overflow$(EXEEXT): $(mem_overflow_OBJECTS) $(mem_overflow_DEPENDENCIES) + @rm -f mem-overflow$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(mem_overflow_OBJECTS) $(mem_overflow_LDADD) $(LIBS) +option-context$(EXEEXT): $(option_context_OBJECTS) $(option_context_DEPENDENCIES) + @rm -f option-context$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(option_context_OBJECTS) $(option_context_LDADD) $(LIBS) +printf$(EXEEXT): $(printf_OBJECTS) $(printf_DEPENDENCIES) + @rm -f printf$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(printf_OBJECTS) $(printf_LDADD) $(LIBS) +rand$(EXEEXT): $(rand_OBJECTS) $(rand_DEPENDENCIES) + @rm -f rand$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rand_OBJECTS) $(rand_LDADD) $(LIBS) +strfuncs$(EXEEXT): $(strfuncs_OBJECTS) $(strfuncs_DEPENDENCIES) + @rm -f strfuncs$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(strfuncs_OBJECTS) $(strfuncs_LDADD) $(LIBS) +string$(EXEEXT): $(string_OBJECTS) $(string_DEPENDENCIES) + @rm -f string$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(string_OBJECTS) $(string_LDADD) $(LIBS) +testing$(EXEEXT): $(testing_OBJECTS) $(testing_DEPENDENCIES) + @rm -f testing$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testing_OBJECTS) $(testing_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileutils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvariant.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hostutils.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyfile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/markup-subparser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem-overflow.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/option-context.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strfuncs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testing.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstPROGRAMS ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test +@OS_UNIX_TRUE@gtester-xmllint-check: # check testreport xml with xmllint if present +@OS_UNIX_TRUE@ ${GTESTER} -k --quiet -o tmpsample.xml --test-arg=--gtester-selftest ${GTESTER} +@OS_UNIX_TRUE@ ${XMLLINT} --version 2>/dev/null; test "$$?" != 0 || ${XMLLINT} --noout tmpsample.xml +@OS_UNIX_TRUE@check-am: gtester-xmllint-check + +# 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/glib/tests/array-test.c b/glib/tests/array-test.c new file mode 100644 index 0000000..6bfe46b --- /dev/null +++ b/glib/tests/array-test.c @@ -0,0 +1,335 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include "glib.h" + +static void +sum_up (gpointer data, + gpointer user_data) +{ + gint *sum = (gint *)user_data; + + *sum += GPOINTER_TO_INT (data); +} + +static void +array_append (void) +{ + GArray *garray; + gint i; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 10000; i++) + g_array_append_val (garray, i); + + for (i = 0; i < 10000; i++) + g_assert_cmpint (g_array_index (garray, gint, i), ==, i); + + g_array_free (garray, TRUE); +} + +static void +array_prepend (void) +{ + GArray *garray; + gint i; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 100; i++) + g_array_prepend_val (garray, i); + + for (i = 0; i < 100; i++) + g_assert_cmpint (g_array_index (garray, gint, i), ==, (100 - i - 1)); + + g_array_free (garray, TRUE); +} + +static void +array_ref_count (void) +{ + GArray *garray; + GArray *garray2; + gint i; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + g_assert_cmpint (g_array_get_element_size (garray), ==, sizeof (gint)); + for (i = 0; i < 100; i++) + g_array_prepend_val (garray, i); + + /* check we can ref, unref and still access the array */ + garray2 = g_array_ref (garray); + g_assert (garray == garray2); + g_array_unref (garray2); + for (i = 0; i < 100; i++) + g_assert_cmpint (g_array_index (garray, gint, i), ==, (100 - i - 1)); + + /* garray2 should be an empty valid GArray wrapper */ + garray2 = g_array_ref (garray); + g_array_free (garray, TRUE); + + g_assert_cmpint (garray2->len, ==, 0); + g_array_unref (garray2); +} + +static void +array_large_size (void) +{ + GArray* array; + + g_test_bug ("568760"); + + array = g_array_new (TRUE, TRUE, sizeof (char)); + + /* it might take really long until the allocation happens */ + if (g_test_trap_fork (10 /* s */ * 1000 /* ms */ * 1000 /* µs */, 0)) + { + g_array_set_size (array, 1073750016); + exit (0); /* success */ + } + + if (!g_test_trap_has_passed ()) + { + g_test_trap_assert_stderr ("*failed to allocate 2147483648 bytes*"); + } + + g_array_free (array, TRUE); +} + +static void +pointer_array_add (void) +{ + GPtrArray *gparray; + gint i; + gint sum = 0; + + gparray = g_ptr_array_new (); + for (i = 0; i < 10000; i++) + g_ptr_array_add (gparray, GINT_TO_POINTER (i)); + + for (i = 0; i < 10000; i++) + g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i)); + + g_ptr_array_foreach (gparray, sum_up, &sum); + g_assert (sum == 49995000); + + g_ptr_array_free (gparray, TRUE); +} + +static void +pointer_array_ref_count (void) +{ + GPtrArray *gparray; + GPtrArray *gparray2; + gint i; + gint sum = 0; + + gparray = g_ptr_array_new (); + for (i = 0; i < 10000; i++) + g_ptr_array_add (gparray, GINT_TO_POINTER (i)); + + /* check we can ref, unref and still access the array */ + gparray2 = g_ptr_array_ref (gparray); + g_assert (gparray == gparray2); + g_ptr_array_unref (gparray2); + for (i = 0; i < 10000; i++) + g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i)); + + g_ptr_array_foreach (gparray, sum_up, &sum); + g_assert (sum == 49995000); + + /* gparray2 should be an empty valid GPtrArray wrapper */ + gparray2 = g_ptr_array_ref (gparray); + g_ptr_array_free (gparray, TRUE); + + g_assert_cmpint (gparray2->len, ==, 0); + g_ptr_array_unref (gparray2); +} + +static gint num_free_func_invocations = 0; + +static void +my_free_func (gpointer data) +{ + num_free_func_invocations++; + g_free (data); +} + +static void +pointer_array_free_func (void) +{ + GPtrArray *gparray; + GPtrArray *gparray2; + gchar **strv; + gchar *s; + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_unref (gparray); + g_assert_cmpint (num_free_func_invocations, ==, 0); + + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_free (gparray, TRUE); + g_assert_cmpint (num_free_func_invocations, ==, 0); + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_add (gparray, g_strdup ("foo")); + g_ptr_array_add (gparray, g_strdup ("bar")); + g_ptr_array_add (gparray, g_strdup ("baz")); + g_ptr_array_remove_index (gparray, 0); + g_assert_cmpint (num_free_func_invocations, ==, 1); + s = g_strdup ("frob"); + g_ptr_array_add (gparray, s); + g_assert (g_ptr_array_remove (gparray, s)); + g_assert_cmpint (num_free_func_invocations, ==, 2); + g_ptr_array_set_size (gparray, 1); + g_assert_cmpint (num_free_func_invocations, ==, 3); + g_ptr_array_ref (gparray); + g_ptr_array_unref (gparray); + g_assert_cmpint (num_free_func_invocations, ==, 3); + g_ptr_array_unref (gparray); + g_assert_cmpint (num_free_func_invocations, ==, 4); + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_add (gparray, g_strdup ("foo")); + g_ptr_array_add (gparray, g_strdup ("bar")); + g_ptr_array_add (gparray, g_strdup ("baz")); + g_ptr_array_add (gparray, NULL); + gparray2 = g_ptr_array_ref (gparray); + strv = (gchar **) g_ptr_array_free (gparray, FALSE); + g_assert_cmpint (num_free_func_invocations, ==, 0); + g_strfreev (strv); + g_ptr_array_unref (gparray2); + g_assert_cmpint (num_free_func_invocations, ==, 0); + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_add (gparray, g_strdup ("foo")); + g_ptr_array_add (gparray, g_strdup ("bar")); + g_ptr_array_add (gparray, g_strdup ("baz")); + g_ptr_array_unref (gparray); + g_assert_cmpint (num_free_func_invocations, ==, 3); + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_add (gparray, g_strdup ("foo")); + g_ptr_array_add (gparray, g_strdup ("bar")); + g_ptr_array_add (gparray, g_strdup ("baz")); + g_ptr_array_free (gparray, TRUE); + g_assert_cmpint (num_free_func_invocations, ==, 3); + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_with_free_func (my_free_func); + g_ptr_array_add (gparray, "foo"); + g_ptr_array_add (gparray, "bar"); + g_ptr_array_add (gparray, "baz"); + g_ptr_array_set_free_func (gparray, NULL); + g_ptr_array_free (gparray, TRUE); + g_assert_cmpint (num_free_func_invocations, ==, 0); +} + +static void +byte_array_append (void) +{ + GByteArray *gbarray; + gint i; + + gbarray = g_byte_array_new (); + for (i = 0; i < 10000; i++) + g_byte_array_append (gbarray, (guint8*) "abcd", 4); + + for (i = 0; i < 10000; i++) + { + g_assert (gbarray->data[4*i] == 'a'); + g_assert (gbarray->data[4*i+1] == 'b'); + g_assert (gbarray->data[4*i+2] == 'c'); + g_assert (gbarray->data[4*i+3] == 'd'); + } + + g_byte_array_free (gbarray, TRUE); +} + +static void +byte_array_ref_count (void) +{ + GByteArray *gbarray; + GByteArray *gbarray2; + gint i; + + gbarray = g_byte_array_new (); + for (i = 0; i < 10000; i++) + g_byte_array_append (gbarray, (guint8*) "abcd", 4); + + gbarray2 = g_byte_array_ref (gbarray); + g_assert (gbarray2 == gbarray); + g_byte_array_unref (gbarray2); + for (i = 0; i < 10000; i++) + { + g_assert (gbarray->data[4*i] == 'a'); + g_assert (gbarray->data[4*i+1] == 'b'); + g_assert (gbarray->data[4*i+2] == 'c'); + g_assert (gbarray->data[4*i+3] == 'd'); + } + + gbarray2 = g_byte_array_ref (gbarray); + g_assert (gbarray2 == gbarray); + g_byte_array_free (gbarray, TRUE); + g_assert_cmpint (gbarray2->len, ==, 0); + g_byte_array_unref (gbarray2); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugs.gnome.org/%s"); + + /* array tests */ + g_test_add_func ("/array/append", array_append); + g_test_add_func ("/array/prepend", array_prepend); + g_test_add_func ("/array/ref-count", array_ref_count); + g_test_add_func ("/array/large-size", array_large_size); + + /* pointer arrays */ + g_test_add_func ("/pointerarray/add", pointer_array_add); + g_test_add_func ("/pointerarray/ref-count", pointer_array_ref_count); + g_test_add_func ("/pointerarray/free-func", pointer_array_free_func); + + /* byte arrays */ + g_test_add_func ("/bytearray/append", byte_array_append); + g_test_add_func ("/bytearray/ref-count", byte_array_ref_count); + + return g_test_run (); +} + diff --git a/glib/tests/fileutils.c b/glib/tests/fileutils.c new file mode 100644 index 0000000..225c6ce --- /dev/null +++ b/glib/tests/fileutils.c @@ -0,0 +1,508 @@ +/* Unit tests for gfileutils + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include + +#define S G_DIR_SEPARATOR_S + +static void +check_string (gchar *str, gchar *expected) +{ + g_assert (str != NULL); + g_assert_cmpstr (str, ==, expected); + g_free (str); +} + +static void +test_build_path (void) +{ +/* check_string (g_build_path ("", NULL), "");*/ + check_string (g_build_path ("", "", NULL), ""); + check_string (g_build_path ("", "x", NULL), "x"); + check_string (g_build_path ("", "x", "y", NULL), "xy"); + check_string (g_build_path ("", "x", "y", "z", NULL), "xyz"); + +/* check_string (g_build_path (":", NULL), "");*/ + check_string (g_build_path (":", ":", NULL), ":"); + check_string (g_build_path (":", ":x", NULL), ":x"); + check_string (g_build_path (":", "x:", NULL), "x:"); + check_string (g_build_path (":", "", "x", NULL), "x"); + check_string (g_build_path (":", "", ":x", NULL), ":x"); + check_string (g_build_path (":", ":", "x", NULL), ":x"); + check_string (g_build_path (":", "::", "x", NULL), "::x"); + check_string (g_build_path (":", "x", "", NULL), "x"); + check_string (g_build_path (":", "x:", "", NULL), "x:"); + check_string (g_build_path (":", "x", ":", NULL), "x:"); + check_string (g_build_path (":", "x", "::", NULL), "x::"); + check_string (g_build_path (":", "x", "y", NULL), "x:y"); + check_string (g_build_path (":", ":x", "y", NULL), ":x:y"); + check_string (g_build_path (":", "x", "y:", NULL), "x:y:"); + check_string (g_build_path (":", ":x:", ":y:", NULL), ":x:y:"); + check_string (g_build_path (":", ":x::", "::y:", NULL), ":x:y:"); + check_string (g_build_path (":", "x", "","y", NULL), "x:y"); + check_string (g_build_path (":", "x", ":", "y", NULL), "x:y"); + check_string (g_build_path (":", "x", "::", "y", NULL), "x:y"); + check_string (g_build_path (":", "x", "y", "z", NULL), "x:y:z"); + check_string (g_build_path (":", ":x:", ":y:", ":z:", NULL), ":x:y:z:"); + check_string (g_build_path (":", "::x::", "::y::", "::z::", NULL), "::x:y:z::"); + +/* check_string (g_build_path ("::", NULL), "");*/ + check_string (g_build_path ("::", "::", NULL), "::"); + check_string (g_build_path ("::", ":::", NULL), ":::"); + check_string (g_build_path ("::", "::x", NULL), "::x"); + check_string (g_build_path ("::", "x::", NULL), "x::"); + check_string (g_build_path ("::", "", "x", NULL), "x"); + check_string (g_build_path ("::", "", "::x", NULL), "::x"); + check_string (g_build_path ("::", "::", "x", NULL), "::x"); + check_string (g_build_path ("::", "::::", "x", NULL), "::::x"); + check_string (g_build_path ("::", "x", "", NULL), "x"); + check_string (g_build_path ("::", "x::", "", NULL), "x::"); + check_string (g_build_path ("::", "x", "::", NULL), "x::"); + + /* This following is weird, but keeps the definition simple */ + check_string (g_build_path ("::", "x", ":::", NULL), "x:::::"); + check_string (g_build_path ("::", "x", "::::", NULL), "x::::"); + check_string (g_build_path ("::", "x", "y", NULL), "x::y"); + check_string (g_build_path ("::", "::x", "y", NULL), "::x::y"); + check_string (g_build_path ("::", "x", "y::", NULL), "x::y::"); + check_string (g_build_path ("::", "::x::", "::y::", NULL), "::x::y::"); + check_string (g_build_path ("::", "::x:::", ":::y::", NULL), "::x::::y::"); + check_string (g_build_path ("::", "::x::::", "::::y::", NULL), "::x::y::"); + check_string (g_build_path ("::", "x", "", "y", NULL), "x::y"); + check_string (g_build_path ("::", "x", "::", "y", NULL), "x::y"); + check_string (g_build_path ("::", "x", "::::", "y", NULL), "x::y"); + check_string (g_build_path ("::", "x", "y", "z", NULL), "x::y::z"); + check_string (g_build_path ("::", "::x::", "::y::", "::z::", NULL), "::x::y::z::"); + check_string (g_build_path ("::", ":::x:::", ":::y:::", ":::z:::", NULL), ":::x::::y::::z:::"); + check_string (g_build_path ("::", "::::x::::", "::::y::::", "::::z::::", NULL), "::::x::y::z::::"); +} + +static void +test_build_pathv (void) +{ + gchar *args[10]; + + args[0] = NULL; + check_string (g_build_pathv ("", args), ""); + args[0] = ""; args[1] = NULL; + check_string (g_build_pathv ("", args), ""); + args[0] = "x"; args[1] = NULL; + check_string (g_build_pathv ("", args), "x"); + args[0] = "x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_pathv ("", args), "xy"); + args[0] = "x"; args[1] = "y"; args[2] = "z", args[3] = NULL; + check_string (g_build_pathv ("", args), "xyz"); + + args[0] = NULL; + check_string (g_build_pathv (":", args), ""); + args[0] = ":"; args[1] = NULL; + check_string (g_build_pathv (":", args), ":"); + args[0] = ":x"; args[1] = NULL; + check_string (g_build_pathv (":", args), ":x"); + args[0] = "x:"; args[1] = NULL; + check_string (g_build_pathv (":", args), "x:"); + args[0] = ""; args[1] = "x"; args[2] = NULL; + check_string (g_build_pathv (":", args), "x"); + args[0] = ""; args[1] = ":x"; args[2] = NULL; + check_string (g_build_pathv (":", args), ":x"); + args[0] = ":"; args[1] = "x"; args[2] = NULL; + check_string (g_build_pathv (":", args), ":x"); + args[0] = "::"; args[1] = "x"; args[2] = NULL; + check_string (g_build_pathv (":", args), "::x"); + args[0] = "x"; args[1] = ""; args[2] = NULL; + check_string (g_build_pathv (":", args), "x"); + args[0] = "x:"; args[1] = ""; args[2] = NULL; + check_string (g_build_pathv (":", args), "x:"); + args[0] = "x"; args[1] = ":"; args[2] = NULL; + check_string (g_build_pathv (":", args), "x:"); + args[0] = "x"; args[1] = "::"; args[2] = NULL; + check_string (g_build_pathv (":", args), "x::"); + args[0] = "x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_pathv (":", args), "x:y"); + args[0] = ":x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_pathv (":", args), ":x:y"); + args[0] = "x"; args[1] = "y:"; args[2] = NULL; + check_string (g_build_pathv (":", args), "x:y:"); + args[0] = ":x:"; args[1] = ":y:"; args[2] = NULL; + check_string (g_build_pathv (":", args), ":x:y:"); + args[0] = ":x::"; args[1] = "::y:"; args[2] = NULL; + check_string (g_build_pathv (":", args), ":x:y:"); + args[0] = "x"; args[1] = ""; args[2] = "y"; args[3] = NULL; + check_string (g_build_pathv (":", args), "x:y"); + args[0] = "x"; args[1] = ":"; args[2] = "y"; args[3] = NULL; + check_string (g_build_pathv (":", args), "x:y"); + args[0] = "x"; args[1] = "::"; args[2] = "y"; args[3] = NULL; + check_string (g_build_pathv (":", args), "x:y"); + args[0] = "x"; args[1] = "y"; args[2] = "z"; args[3] = NULL; + check_string (g_build_pathv (":", args), "x:y:z"); + args[0] = ":x:"; args[1] = ":y:"; args[2] = ":z:"; args[3] = NULL; + check_string (g_build_pathv (":", args), ":x:y:z:"); + args[0] = "::x::"; args[1] = "::y::"; args[2] = "::z::"; args[3] = NULL; + check_string (g_build_pathv (":", args), "::x:y:z::"); + + args[0] = NULL; + check_string (g_build_pathv ("::", args), ""); + args[0] = "::"; args[1] = NULL; + check_string (g_build_pathv ("::", args), "::"); + args[0] = ":::"; args[1] = NULL; + check_string (g_build_pathv ("::", args), ":::"); + args[0] = "::x"; args[1] = NULL; + check_string (g_build_pathv ("::", args), "::x"); + args[0] = "x::"; args[1] = NULL; + check_string (g_build_pathv ("::", args), "x::"); + args[0] = ""; args[1] = "x"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x"); + args[0] = ""; args[1] = "::x"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::x"); + args[0] = "::"; args[1] = "x"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::x"); + args[0] = "::::"; args[1] = "x"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::::x"); + args[0] = "x"; args[1] = ""; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x"); + args[0] = "x::"; args[1] = ""; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x::"); + args[0] = "x"; args[1] = "::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x::"); + /* This following is weird, but keeps the definition simple */ + args[0] = "x"; args[1] = ":::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x:::::"); + args[0] = "x"; args[1] = "::::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x::::"); + args[0] = "x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x::y"); + args[0] = "::x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::x::y"); + args[0] = "x"; args[1] = "y::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "x::y::"); + args[0] = "::x::"; args[1] = "::y::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::x::y::"); + args[0] = "::x:::"; args[1] = ":::y::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::x::::y::"); + args[0] = "::x::::"; args[1] = "::::y::"; args[2] = NULL; + check_string (g_build_pathv ("::", args), "::x::y::"); + args[0] = "x"; args[1] = ""; args[2] = "y"; args[3] = NULL; + check_string (g_build_pathv ("::", args), "x::y"); + args[0] = "x"; args[1] = "::"; args[2] = "y"; args[3] = NULL; + check_string (g_build_pathv ("::", args), "x::y"); + args[0] = "x"; args[1] = "::::"; args[2] = "y"; args[3] = NULL; + check_string (g_build_pathv ("::", args), "x::y"); + args[0] = "x"; args[1] = "y"; args[2] = "z"; args[3] = NULL; + check_string (g_build_pathv ("::", args), "x::y::z"); + args[0] = "::x::"; args[1] = "::y::"; args[2] = "::z::"; args[3] = NULL; + check_string (g_build_pathv ("::", args), "::x::y::z::"); + args[0] = ":::x:::"; args[1] = ":::y:::"; args[2] = ":::z:::"; args[3] = NULL; + check_string (g_build_pathv ("::", args), ":::x::::y::::z:::"); + args[0] = "::::x::::"; args[1] = "::::y::::"; args[2] = "::::z::::"; args[3] = NULL; + check_string (g_build_pathv ("::", args), "::::x::y::z::::"); +} + +static void +test_build_filename (void) +{ +/* check_string (g_build_filename (NULL), "");*/ + check_string (g_build_filename (S, NULL), S); + check_string (g_build_filename (S"x", NULL), S"x"); + check_string (g_build_filename ("x"S, NULL), "x"S); + check_string (g_build_filename ("", "x", NULL), "x"); + check_string (g_build_filename ("", S"x", NULL), S"x"); + check_string (g_build_filename (S, "x", NULL), S"x"); + check_string (g_build_filename (S S, "x", NULL), S S"x"); + check_string (g_build_filename ("x", "", NULL), "x"); + check_string (g_build_filename ("x"S, "", NULL), "x"S); + check_string (g_build_filename ("x", S, NULL), "x"S); + check_string (g_build_filename ("x", S S, NULL), "x"S S); + check_string (g_build_filename ("x", "y", NULL), "x"S"y"); + check_string (g_build_filename (S"x", "y", NULL), S"x"S"y"); + check_string (g_build_filename ("x", "y"S, NULL), "x"S"y"S); + check_string (g_build_filename (S"x"S, S"y"S, NULL), S"x"S"y"S); + check_string (g_build_filename (S"x"S S, S S"y"S, NULL), S"x"S"y"S); + check_string (g_build_filename ("x", "", "y", NULL), "x"S"y"); + check_string (g_build_filename ("x", S, "y", NULL), "x"S"y"); + check_string (g_build_filename ("x", S S, "y", NULL), "x"S"y"); + check_string (g_build_filename ("x", "y", "z", NULL), "x"S"y"S"z"); + check_string (g_build_filename (S"x"S, S"y"S, S"z"S, NULL), S"x"S"y"S"z"S); + check_string (g_build_filename (S S"x"S S, S S"y"S S, S S"z"S S, NULL), S S"x"S"y"S"z"S S); + +#ifdef G_OS_WIN32 + + /* Test also using the slash as file name separator */ +#define U "/" + check_string (g_build_filename (NULL), ""); + check_string (g_build_filename (U, NULL), U); + check_string (g_build_filename (U"x", NULL), U"x"); + check_string (g_build_filename ("x"U, NULL), "x"U); + check_string (g_build_filename ("", U"x", NULL), U"x"); + check_string (g_build_filename ("", U"x", NULL), U"x"); + check_string (g_build_filename (U, "x", NULL), U"x"); + check_string (g_build_filename (U U, "x", NULL), U U"x"); + check_string (g_build_filename (U S, "x", NULL), U S"x"); + check_string (g_build_filename ("x"U, "", NULL), "x"U); + check_string (g_build_filename ("x"S"y", "z"U"a", NULL), "x"S"y"S"z"U"a"); + check_string (g_build_filename ("x", U, NULL), "x"U); + check_string (g_build_filename ("x", U U, NULL), "x"U U); + check_string (g_build_filename ("x", S U, NULL), "x"S U); + check_string (g_build_filename (U"x", "y", NULL), U"x"U"y"); + check_string (g_build_filename ("x", "y"U, NULL), "x"U"y"U); + check_string (g_build_filename (U"x"U, U"y"U, NULL), U"x"U"y"U); + check_string (g_build_filename (U"x"U U, U U"y"U, NULL), U"x"U"y"U); + check_string (g_build_filename ("x", U, "y", NULL), "x"U"y"); + check_string (g_build_filename ("x", U U, "y", NULL), "x"U"y"); + check_string (g_build_filename ("x", U S, "y", NULL), "x"S"y"); + check_string (g_build_filename ("x", S U, "y", NULL), "x"U"y"); + check_string (g_build_filename ("x", U "y", "z", NULL), "x"U"y"U"z"); + check_string (g_build_filename ("x", S "y", "z", NULL), "x"S"y"S"z"); + check_string (g_build_filename ("x", S "y", "z", U, "a", "b", NULL), "x"S"y"S"z"U"a"U"b"); + check_string (g_build_filename (U"x"U, U"y"U, U"z"U, NULL), U"x"U"y"U"z"U); + check_string (g_build_filename (U U"x"U U, U U"y"U U, U U"z"U U, NULL), U U"x"U"y"U"z"U U); + +#undef U + +#endif /* G_OS_WIN32 */ + +} + +static void +test_build_filenamev (void) +{ + gchar *args[10]; + + args[0] = NULL; + check_string (g_build_filenamev (args), ""); + args[0] = S; args[1] = NULL; + check_string (g_build_filenamev (args), S); + args[0] = S"x"; args[1] = NULL; + check_string (g_build_filenamev (args), S"x"); + args[0] = "x"S; args[1] = NULL; + check_string (g_build_filenamev (args), "x"S); + args[0] = ""; args[1] = "x"; args[2] = NULL; + check_string (g_build_filenamev (args), "x"); + args[0] = ""; args[1] = S"x"; args[2] = NULL; + check_string (g_build_filenamev (args), S"x"); + args[0] = S; args[1] = "x"; args[2] = NULL; + check_string (g_build_filenamev (args), S"x"); + args[0] = S S; args[1] = "x"; args[2] = NULL; + check_string (g_build_filenamev (args), S S"x"); + args[0] = "x"; args[1] = ""; args[2] = NULL; + check_string (g_build_filenamev (args), "x"); + args[0] = "x"S; args[1] = ""; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S); + args[0] = "x"; args[1] = S; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S); + args[0] = "x"; args[1] = S S; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S S); + args[0] = "x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S"y"); + args[0] = S"x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_filenamev (args), S"x"S"y"); + args[0] = "x"; args[1] = "y"S; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S"y"S); + args[0] = S"x"S; args[1] = S"y"S; args[2] = NULL; + check_string (g_build_filenamev (args), S"x"S"y"S); + args[0] = S"x"S S; args[1] = S S"y"S; args[2] = NULL; + check_string (g_build_filenamev (args), S"x"S"y"S); + args[0] = "x"; args[1] = ""; args[2] = "y"; args[3] = NULL; + check_string (g_build_filenamev (args), "x"S"y"); + args[0] = "x"; args[1] = S; args[2] = "y"; args[3] = NULL; + check_string (g_build_filenamev (args), "x"S"y"); + args[0] = "x"; args[1] = S S; args[2] = "y"; args[3] = NULL; + check_string (g_build_filenamev (args), "x"S"y"); + args[0] = "x"; args[1] = "y"; args[2] = "z"; args[3] = NULL; + check_string (g_build_filenamev (args), "x"S"y"S"z"); + args[0] = S"x"S; args[1] = S"y"S; args[2] = S"z"S; args[3] = NULL; + check_string (g_build_filenamev (args), S"x"S"y"S"z"S); + args[0] = S S"x"S S; args[1] = S S"y"S S; args[2] = S S"z"S S; args[3] = NULL; + check_string (g_build_filenamev (args), S S"x"S"y"S"z"S S); + +#ifdef G_OS_WIN32 + + /* Test also using the slash as file name separator */ +#define U "/" + args[0] = NULL; + check_string (g_build_filenamev (args), ""); + args[0] = U; args[1] = NULL; + check_string (g_build_filenamev (args), U); + args[0] = U"x"; args[1] = NULL; + check_string (g_build_filenamev (args), U"x"); + args[0] = "x"U; args[1] = NULL; + check_string (g_build_filenamev (args), "x"U); + args[0] = ""; args[1] = U"x"; args[2] = NULL; + check_string (g_build_filenamev (args), U"x"); + args[0] = ""; args[1] = U"x"; args[2] = NULL; + check_string (g_build_filenamev (args), U"x"); + args[0] = U; args[1] = "x"; args[2] = NULL; + check_string (g_build_filenamev (args), U"x"); + args[0] = U U; args[1] = "x"; args[2] = NULL; + check_string (g_build_filenamev (args), U U"x"); + args[0] = U S; args[1] = "x"; args[2] = NULL; + check_string (g_build_filenamev (args), U S"x"); + args[0] = "x"U; args[1] = ""; args[2] = NULL; + check_string (g_build_filenamev (args), "x"U); + args[0] = "x"S"y"; args[1] = "z"U"a"; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S"y"S"z"U"a"); + args[0] = "x"; args[1] = U; args[2] = NULL; + check_string (g_build_filenamev (args), "x"U); + args[0] = "x"; args[1] = U U; args[2] = NULL; + check_string (g_build_filenamev (args), "x"U U); + args[0] = "x"; args[1] = S U; args[2] = NULL; + check_string (g_build_filenamev (args), "x"S U); + args[0] = U"x"; args[1] = "y"; args[2] = NULL; + check_string (g_build_filenamev (args), U"x"U"y"); + args[0] = "x"; args[1] = "y"U; args[2] = NULL; + check_string (g_build_filenamev (args), "x"U"y"U); + args[0] = U"x"U; args[1] = U"y"U; args[2] = NULL; + check_string (g_build_filenamev (args), U"x"U"y"U); + args[0] = U"x"U U; args[1] = U U"y"U; args[2] = NULL; + check_string (g_build_filenamev (args), U"x"U"y"U); + args[0] = "x"; args[1] = U; args[2] = "y", args[3] = NULL; + check_string (g_build_filenamev (args), "x"U"y"); + args[0] = "x"; args[1] = U U; args[2] = "y", args[3] = NULL; + check_string (g_build_filenamev (args), "x"U"y"); + args[0] = "x"; args[1] = U S; args[2] = "y", args[3] = NULL; + check_string (g_build_filenamev (args), "x"S"y"); + args[0] = "x"; args[1] = S U; args[2] = "y", args[3] = NULL; + check_string (g_build_filenamev (args), "x"U"y"); + args[0] = "x"; args[1] = U "y"; args[2] = "z", args[3] = NULL; + check_string (g_build_filenamev (args), "x"U"y"U"z"); + args[0] = "x"; args[1] = S "y"; args[2] = "z", args[3] = NULL; + check_string (g_build_filenamev (args), "x"S"y"S"z"); + args[0] = "x"; args[1] = S "y"; args[2] = "z", args[3] = U; + args[4] = "a"; args[5] = "b"; args[6] = NULL; + check_string (g_build_filenamev (args), "x"S"y"S"z"U"a"U"b"); + args[0] = U"x"U; args[1] = U"y"U; args[2] = U"z"U, args[3] = NULL; + check_string (g_build_filenamev (args), U"x"U"y"U"z"U); + args[0] = U U"x"U U; args[1] = U U"y"U U; args[2] = U U"z"U U, args[3] = NULL; + check_string (g_build_filenamev (args), U U"x"U"y"U"z"U U); + +#undef U + +#endif /* G_OS_WIN32 */ +} + +#undef S + +static void +test_mkdir_with_parents_1 (const gchar *base) +{ + char *p0 = g_build_filename (base, "fum", NULL); + char *p1 = g_build_filename (p0, "tem", NULL); + char *p2 = g_build_filename (p1, "zap", NULL); + FILE *f; + + g_remove (p2); + g_remove (p1); + g_remove (p0); + + if (g_file_test (p0, G_FILE_TEST_EXISTS)) + g_error ("failed, %s exists, cannot test g_mkdir_with_parents\n", p0); + + if (g_file_test (p1, G_FILE_TEST_EXISTS)) + g_error ("failed, %s exists, cannot test g_mkdir_with_parents\n", p1); + + if (g_file_test (p2, G_FILE_TEST_EXISTS)) + g_error ("failed, %s exists, cannot test g_mkdir_with_parents\n", p2); + + if (g_mkdir_with_parents (p2, 0777) == -1) + g_error ("failed, g_mkdir_with_parents(%s) failed: %s\n", p2, g_strerror (errno)); + + if (!g_file_test (p2, G_FILE_TEST_IS_DIR)) + g_error ("failed, g_mkdir_with_parents(%s) succeeded, but %s is not a directory\n", p2, p2); + + if (!g_file_test (p1, G_FILE_TEST_IS_DIR)) + g_error ("failed, g_mkdir_with_parents(%s) succeeded, but %s is not a directory\n", p2, p1); + + if (!g_file_test (p0, G_FILE_TEST_IS_DIR)) + g_error ("failed, g_mkdir_with_parents(%s) succeeded, but %s is not a directory\n", p2, p0); + + g_rmdir (p2); + if (g_file_test (p2, G_FILE_TEST_EXISTS)) + g_error ("failed, did g_rmdir(%s), but %s is still there\n", p2, p2); + + g_rmdir (p1); + if (g_file_test (p1, G_FILE_TEST_EXISTS)) + g_error ("failed, did g_rmdir(%s), but %s is still there\n", p1, p1); + + f = g_fopen (p1, "w"); + if (f == NULL) + g_error ("failed, couldn't create file %s\n", p1); + fclose (f); + + if (g_mkdir_with_parents (p1, 0666) == 0) + g_error ("failed, g_mkdir_with_parents(%s) succeeded, even if %s is a file\n", p1, p1); + + if (g_mkdir_with_parents (p2, 0666) == 0) + g_error("failed, g_mkdir_with_parents(%s) succeeded, even if %s is a file\n", p2, p1); + + g_remove (p2); + g_remove (p1); + g_remove (p0); +} + +static void +test_mkdir_with_parents (void) +{ + gchar *cwd; + if (g_test_verbose()) + g_print ("checking g_mkdir_with_parents() in subdir ./hum/"); + test_mkdir_with_parents_1 ("hum"); + g_remove ("hum"); + if (g_test_verbose()) + g_print ("checking g_mkdir_with_parents() in subdir ./hii///haa/hee/"); + test_mkdir_with_parents_1 ("hii///haa/hee"); + g_remove ("hii/haa/hee"); + g_remove ("hii/haa"); + g_remove ("hii"); + cwd = g_get_current_dir (); + if (g_test_verbose()) + g_print ("checking g_mkdir_with_parents() in cwd: %s", cwd); + test_mkdir_with_parents_1 (cwd); + g_free (cwd); +} + +static void +test_format_size_for_display (void) +{ + check_string (g_format_size_for_display (0), "0 bytes"); + check_string (g_format_size_for_display (1), "1 byte"); + check_string (g_format_size_for_display (2), "2 bytes"); + check_string (g_format_size_for_display (1024), "1.0 KB"); + check_string (g_format_size_for_display (1024 * 1024), "1.0 MB"); + check_string (g_format_size_for_display (1024 * 1024 * 1024), "1.0 GB"); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/fileutils/build-path", test_build_path); + g_test_add_func ("/fileutils/build-pathv", test_build_pathv); + g_test_add_func ("/fileutils/build-filename", test_build_filename); + g_test_add_func ("/fileutils/build-filenamev", test_build_filenamev); + g_test_add_func ("/fileutils/mkdir-with-parents", test_mkdir_with_parents); + g_test_add_func ("/fileutils/format-size-for-display", test_format_size_for_display); + + return g_test_run(); +} diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c new file mode 100644 index 0000000..b37f5a7 --- /dev/null +++ b/glib/tests/gvariant.c @@ -0,0 +1,3741 @@ +/* + * Copyright © 2010 Codethink Limited + * + * 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 of the licence, or (at your option) any later version. + * + * See the included COPYING file for more information. + * + * Author: Ryan Lortie + */ + +#include +#include +#include +#include + +#define BASIC "bynqiuxthdsog?" +#define N_BASIC (G_N_ELEMENTS (BASIC) - 1) + +#define INVALIDS "cefjklpwz&@^$" +#define N_INVALIDS (G_N_ELEMENTS (INVALIDS) - 1) + +static gboolean +randomly (gdouble prob) +{ + return g_test_rand_double_range (0, 1) < prob; +} + +/* corecursion */ +static GVariantType * +append_tuple_type_string (GString *, GString *, gboolean, gint); + +/* append a random GVariantType to a GString + * append a description of the type to another GString + * return what the type is + */ +static GVariantType * +append_type_string (GString *string, + GString *description, + gboolean definite, + gint depth) +{ + if (!depth-- || randomly (0.3)) + { + gchar b = BASIC[g_test_rand_int_range (0, N_BASIC - definite)]; + g_string_append_c (string, b); + g_string_append_c (description, b); + + switch (b) + { + case 'b': + return g_variant_type_copy (G_VARIANT_TYPE_BOOLEAN); + case 'y': + return g_variant_type_copy (G_VARIANT_TYPE_BYTE); + case 'n': + return g_variant_type_copy (G_VARIANT_TYPE_INT16); + case 'q': + return g_variant_type_copy (G_VARIANT_TYPE_UINT16); + case 'i': + return g_variant_type_copy (G_VARIANT_TYPE_INT32); + case 'u': + return g_variant_type_copy (G_VARIANT_TYPE_UINT32); + case 'x': + return g_variant_type_copy (G_VARIANT_TYPE_INT64); + case 't': + return g_variant_type_copy (G_VARIANT_TYPE_UINT64); + case 'h': + return g_variant_type_copy (G_VARIANT_TYPE_HANDLE); + case 'd': + return g_variant_type_copy (G_VARIANT_TYPE_DOUBLE); + case 's': + return g_variant_type_copy (G_VARIANT_TYPE_STRING); + case 'o': + return g_variant_type_copy (G_VARIANT_TYPE_OBJECT_PATH); + case 'g': + return g_variant_type_copy (G_VARIANT_TYPE_SIGNATURE); + case '?': + return g_variant_type_copy (G_VARIANT_TYPE_BASIC); + default: + g_assert_not_reached (); + } + } + else + { + GVariantType *result; + + switch (g_test_rand_int_range (0, definite ? 5 : 7)) + { + case 0: + { + GVariantType *element; + + g_string_append_c (string, 'a'); + g_string_append (description, "a of "); + element = append_type_string (string, description, + definite, depth); + result = g_variant_type_new_array (element); + g_variant_type_free (element); + } + + g_assert (g_variant_type_is_array (result)); + break; + + case 1: + { + GVariantType *element; + + g_string_append_c (string, 'm'); + g_string_append (description, "m of "); + element = append_type_string (string, description, + definite, depth); + result = g_variant_type_new_maybe (element); + g_variant_type_free (element); + } + + g_assert (g_variant_type_is_maybe (result)); + break; + + case 2: + result = append_tuple_type_string (string, description, + definite, depth); + + g_assert (g_variant_type_is_tuple (result)); + break; + + case 3: + { + GVariantType *key, *value; + + g_string_append_c (string, '{'); + g_string_append (description, "e of ["); + key = append_type_string (string, description, definite, 0); + g_string_append (description, ", "); + value = append_type_string (string, description, definite, depth); + g_string_append_c (description, ']'); + g_string_append_c (string, '}'); + result = g_variant_type_new_dict_entry (key, value); + g_variant_type_free (key); + g_variant_type_free (value); + } + + g_assert (g_variant_type_is_dict_entry (result)); + break; + + case 4: + g_string_append_c (string, 'v'); + g_string_append_c (description, 'V'); + result = g_variant_type_copy (G_VARIANT_TYPE_VARIANT); + g_assert (g_variant_type_equal (result, G_VARIANT_TYPE_VARIANT)); + break; + + case 5: + g_string_append_c (string, '*'); + g_string_append_c (description, 'S'); + result = g_variant_type_copy (G_VARIANT_TYPE_ANY); + g_assert (g_variant_type_equal (result, G_VARIANT_TYPE_ANY)); + break; + + case 6: + g_string_append_c (string, 'r'); + g_string_append_c (description, 'R'); + result = g_variant_type_copy (G_VARIANT_TYPE_TUPLE); + g_assert (g_variant_type_is_tuple (result)); + break; + + default: + g_assert_not_reached (); + } + + return result; + } +} + +static GVariantType * +append_tuple_type_string (GString *string, + GString *description, + gboolean definite, + gint depth) +{ + GVariantType *result, *other_result; + GVariantType **types; + gint size; + gint i; + + g_string_append_c (string, '('); + g_string_append (description, "t of ["); + + size = g_test_rand_int_range (0, 20); + types = g_new (GVariantType *, size + 1); + + for (i = 0; i < size; i++) + { + types[i] = append_type_string (string, description, definite, depth); + + if (i < size - 1) + g_string_append (description, ", "); + } + + types[i] = NULL; + + g_string_append_c (description, ']'); + g_string_append_c (string, ')'); + + result = g_variant_type_new_tuple ((gpointer) types, size); + other_result = g_variant_type_new_tuple ((gpointer) types, -1); + g_assert (g_variant_type_equal (result, other_result)); + g_variant_type_free (other_result); + for (i = 0; i < size; i++) + g_variant_type_free (types[i]); + g_free (types); + + return result; +} + +/* given a valid type string, make it invalid */ +static gchar * +invalid_mutation (const gchar *type_string) +{ + gboolean have_parens, have_braces; + + /* it's valid, so '(' implies ')' and same for '{' and '}' */ + have_parens = strchr (type_string, '(') != NULL; + have_braces = strchr (type_string, '{') != NULL; + + if (have_parens && have_braces && randomly (0.3)) + { + /* swap a paren and a brace */ + gchar *pp, *bp; + gint np, nb; + gchar p, b; + gchar *new; + + new = g_strdup (type_string); + + if (randomly (0.5)) + p = '(', b = '{'; + else + p = ')', b = '}'; + + np = nb = 0; + pp = bp = new - 1; + + /* count number of parens/braces */ + while ((pp = strchr (pp + 1, p))) np++; + while ((bp = strchr (bp + 1, b))) nb++; + + /* randomly pick one of each */ + np = g_test_rand_int_range (0, np) + 1; + nb = g_test_rand_int_range (0, nb) + 1; + + /* find it */ + pp = bp = new - 1; + while (np--) pp = strchr (pp + 1, p); + while (nb--) bp = strchr (bp + 1, b); + + /* swap */ + g_assert (*bp == b && *pp == p); + *bp = p; + *pp = b; + + return new; + } + + if ((have_parens || have_braces) && randomly (0.3)) + { + /* drop a paren/brace */ + gchar *new; + gchar *pp; + gint np; + gchar p; + + if (have_parens) + if (randomly (0.5)) p = '('; else p = ')'; + else + if (randomly (0.5)) p = '{'; else p = '}'; + + new = g_strdup (type_string); + + np = 0; + pp = new - 1; + while ((pp = strchr (pp + 1, p))) np++; + np = g_test_rand_int_range (0, np) + 1; + pp = new - 1; + while (np--) pp = strchr (pp + 1, p); + g_assert (*pp == p); + + while (*pp) + { + *pp = *(pp + 1); + pp++; + } + + return new; + } + + /* else, perform a random mutation at a random point */ + { + gint length, n; + gchar *new; + gchar p; + + if (randomly (0.3)) + { + /* insert a paren/brace */ + if (randomly (0.5)) + if (randomly (0.5)) p = '('; else p = ')'; + else + if (randomly (0.5)) p = '{'; else p = '}'; + } + else if (randomly (0.5)) + { + /* insert junk */ + p = INVALIDS[g_test_rand_int_range (0, N_INVALIDS)]; + } + else + { + /* truncate */ + p = '\0'; + } + + + length = strlen (type_string); + new = g_malloc (length + 2); + n = g_test_rand_int_range (0, length); + memcpy (new, type_string, n); + new[n] = p; + memcpy (new + n + 1, type_string + n, length - n); + new[length + 1] = '\0'; + + return new; + } +} + +/* describe a type using the same language as is generated + * while generating the type with append_type_string + */ +static gchar * +describe_type (const GVariantType *type) +{ + gchar *result; + + if (g_variant_type_is_container (type)) + { + g_assert (!g_variant_type_is_basic (type)); + + if (g_variant_type_is_array (type)) + { + gchar *subtype = describe_type (g_variant_type_element (type)); + result = g_strdup_printf ("a of %s", subtype); + g_free (subtype); + } + else if (g_variant_type_is_maybe (type)) + { + gchar *subtype = describe_type (g_variant_type_element (type)); + result = g_strdup_printf ("m of %s", subtype); + g_free (subtype); + } + else if (g_variant_type_is_tuple (type)) + { + if (!g_variant_type_equal (type, G_VARIANT_TYPE_TUPLE)) + { + const GVariantType *sub; + GString *string; + gint length; + gint i; + + string = g_string_new ("t of ["); + + length = g_variant_type_n_items (type); + sub = g_variant_type_first (type); + for (i = 0; i < length; i++) + { + gchar *subtype = describe_type (sub); + g_string_append (string, subtype); + g_free (subtype); + + if ((sub = g_variant_type_next (sub))) + g_string_append (string, ", "); + } + g_assert (sub == NULL); + g_string_append_c (string, ']'); + + result = g_string_free (string, FALSE); + } + else + result = g_strdup ("R"); + } + else if (g_variant_type_is_dict_entry (type)) + { + gchar *key, *value, *key2, *value2; + + key = describe_type (g_variant_type_key (type)); + value = describe_type (g_variant_type_value (type)); + key2 = describe_type (g_variant_type_first (type)); + value2 = describe_type ( + g_variant_type_next (g_variant_type_first (type))); + g_assert (g_variant_type_next (g_variant_type_next ( + g_variant_type_first (type))) == NULL); + g_assert_cmpstr (key, ==, key2); + g_assert_cmpstr (value, ==, value2); + result = g_strjoin ("", "e of [", key, ", ", value, "]", NULL); + g_free (key2); + g_free (value2); + g_free (key); + g_free (value); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_VARIANT)) + { + result = g_strdup ("V"); + } + else + g_assert_not_reached (); + } + else + { + if (g_variant_type_is_definite (type)) + { + g_assert (g_variant_type_is_basic (type)); + + if (g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN)) + result = g_strdup ("b"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_BYTE)) + result = g_strdup ("y"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16)) + result = g_strdup ("n"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16)) + result = g_strdup ("q"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32)) + result = g_strdup ("i"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32)) + result = g_strdup ("u"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64)) + result = g_strdup ("x"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64)) + result = g_strdup ("t"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE)) + result = g_strdup ("h"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) + result = g_strdup ("d"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) + result = g_strdup ("s"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH)) + result = g_strdup ("o"); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_SIGNATURE)) + result = g_strdup ("g"); + else + g_assert_not_reached (); + } + else + { + if (g_variant_type_equal (type, G_VARIANT_TYPE_ANY)) + { + result = g_strdup ("S"); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_BASIC)) + { + result = g_strdup ("?"); + } + else + g_assert_not_reached (); + } + } + + return result; +} + +/* given a type string, replace one of the indefinite type characters in + * it with a matching type (possibly the same type). + */ +static gchar * +generate_subtype (const gchar *type_string) +{ + GVariantType *replacement; + GString *result, *junk; + gint length, n = 0, l; + + result = g_string_new (NULL); + junk = g_string_new (NULL); + + /* count the number of indefinite type characters */ + for (length = 0; type_string[length]; length++) + n += type_string[length] == 'r' || + type_string[length] == '?' || + type_string[length] == '*'; + /* length now is strlen (type_string) */ + + /* pick one at random to replace */ + n = g_test_rand_int_range (0, n) + 1; + + /* find it */ + l = -1; + while (n--) l += strcspn (type_string + l + 1, "r?*") + 1; + g_assert (type_string[l] == 'r' || + type_string[l] == '?' || + type_string[l] == '*'); + + /* store up to that point in a GString */ + g_string_append_len (result, type_string, l); + + /* then store the replacement in the GString */ + if (type_string[l] == 'r') + replacement = append_tuple_type_string (result, junk, FALSE, 3); + + else if (type_string[l] == '?') + replacement = append_type_string (result, junk, FALSE, 0); + + else if (type_string[l] == '*') + replacement = append_type_string (result, junk, FALSE, 3); + + else + g_assert_not_reached (); + + /* ensure the replacement has the proper type */ + g_assert (g_variant_type_is_subtype_of (replacement, + (gpointer) &type_string[l])); + + /* store the rest from the original type string */ + g_string_append (result, type_string + l + 1); + + g_variant_type_free (replacement); + g_string_free (junk, TRUE); + + return g_string_free (result, FALSE); +} + +struct typestack +{ + const GVariantType *type; + struct typestack *parent; +}; + +/* given an indefinite type string, replace one of the indefinite + * characters in it with a matching type and ensure that the result is a + * subtype of the original. repeat. + */ +static void +subtype_check (const gchar *type_string, + struct typestack *parent_ts) +{ + struct typestack ts, *node; + gchar *subtype; + gint depth = 0; + + subtype = generate_subtype (type_string); + + ts.type = G_VARIANT_TYPE (subtype); + ts.parent = parent_ts; + + for (node = &ts; node; node = node->parent) + { + /* this type should be a subtype of each parent type */ + g_assert (g_variant_type_is_subtype_of (ts.type, node->type)); + + /* it should only be a supertype when it is exactly equal */ + g_assert (g_variant_type_is_subtype_of (node->type, ts.type) == + g_variant_type_equal (ts.type, node->type)); + + depth++; + } + + if (!g_variant_type_is_definite (ts.type) && depth < 5) + { + /* the type is still indefinite and we haven't repeated too many + * times. go once more. + */ + + subtype_check (subtype, &ts); + } + + g_free (subtype); +} + +static void +test_gvarianttype (void) +{ + gint i; + + for (i = 0; i < 2000; i++) + { + GString *type_string, *description; + GVariantType *type, *other_type; + const GVariantType *ctype; + gchar *invalid; + gchar *desc; + + type_string = g_string_new (NULL); + description = g_string_new (NULL); + + /* generate a random type, its type string and a description + * + * exercises type constructor functions and g_variant_type_copy() + */ + type = append_type_string (type_string, description, FALSE, 6); + + /* convert the type string to a type and ensure that it is equal + * to the one produced with the type constructor routines + */ + ctype = G_VARIANT_TYPE (type_string->str); + g_assert (g_variant_type_equal (ctype, type)); + g_assert (g_variant_type_is_subtype_of (ctype, type)); + g_assert (g_variant_type_is_subtype_of (type, ctype)); + + /* check if the type is indefinite */ + if (!g_variant_type_is_definite (type)) + { + struct typestack ts = { type, NULL }; + + /* if it is indefinite, then replace one of the indefinite + * characters with a matching type and ensure that the result + * is a subtype of the original type. repeat. + */ + subtype_check (type_string->str, &ts); + } + else + /* ensure that no indefinite characters appear */ + g_assert (strcspn (type_string->str, "r?*") == type_string->len); + + + /* describe the type. + * + * exercises the type iterator interface + */ + desc = describe_type (type); + + /* make sure the description matches */ + g_assert_cmpstr (desc, ==, description->str); + g_free (desc); + + /* make an invalid mutation to the type and make sure the type + * validation routines catch it */ + invalid = invalid_mutation (type_string->str); + g_assert (g_variant_type_string_is_valid (type_string->str)); + g_assert (!g_variant_type_string_is_valid (invalid)); + g_free (invalid); + + /* concatenate another type to the type string and ensure that + * the result is recognised as being invalid + */ + other_type = append_type_string (type_string, description, FALSE, 2); + + g_string_free (description, TRUE); + g_string_free (type_string, TRUE); + g_variant_type_free (other_type); + g_variant_type_free (type); + } +} + +#define ALIGNED(x, y) (((x + (y - 1)) / y) * y) + +/* do our own calculation of the fixed_size and alignment of a type + * using a simple algorithm to make sure the "fancy" one in the + * implementation is correct. + */ +static void +calculate_type_info (const GVariantType *type, + gsize *fixed_size, + guint *alignment) +{ + if (g_variant_type_is_array (type) || + g_variant_type_is_maybe (type)) + { + calculate_type_info (g_variant_type_element (type), NULL, alignment); + + if (fixed_size) + *fixed_size = 0; + } + else if (g_variant_type_is_tuple (type) || + g_variant_type_is_dict_entry (type)) + { + if (g_variant_type_n_items (type)) + { + const GVariantType *sub; + gboolean variable; + gsize size; + guint al; + + variable = FALSE; + size = 0; + al = 0; + + sub = g_variant_type_first (type); + do + { + gsize this_fs; + guint this_al; + + calculate_type_info (sub, &this_fs, &this_al); + + al = MAX (al, this_al); + + if (!this_fs) + { + variable = TRUE; + size = 0; + } + + if (!variable) + { + size = ALIGNED (size, this_al); + size += this_fs; + } + } + while ((sub = g_variant_type_next (sub))); + + size = ALIGNED (size, al); + + if (alignment) + *alignment = al; + + if (fixed_size) + *fixed_size = size; + } + else + { + if (fixed_size) + *fixed_size = 1; + + if (alignment) + *alignment = 1; + } + } + else + { + gint fs, al; + + if (g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN) || + g_variant_type_equal (type, G_VARIANT_TYPE_BYTE)) + { + al = fs = 1; + } + + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16) || + g_variant_type_equal (type, G_VARIANT_TYPE_UINT16)) + { + al = fs = 2; + } + + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32) || + g_variant_type_equal (type, G_VARIANT_TYPE_UINT32) || + g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE)) + { + al = fs = 4; + } + + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64) || + g_variant_type_equal (type, G_VARIANT_TYPE_UINT64) || + g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) + { + al = fs = 8; + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING) || + g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH) || + g_variant_type_equal (type, G_VARIANT_TYPE_SIGNATURE)) + { + al = 1; + fs = 0; + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_VARIANT)) + { + al = 8; + fs = 0; + } + else + g_assert_not_reached (); + + if (fixed_size) + *fixed_size = fs; + + if (alignment) + *alignment = al; + } +} + +/* same as the describe_type() function above, but iterates over + * typeinfo instead of types. + */ +static gchar * +describe_info (GVariantTypeInfo *info) +{ + gchar *result; + + switch (g_variant_type_info_get_type_char (info)) + { + case G_VARIANT_TYPE_INFO_CHAR_MAYBE: + { + gchar *element; + + element = describe_info (g_variant_type_info_element (info)); + result = g_strdup_printf ("m of %s", element); + g_free (element); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_ARRAY: + { + gchar *element; + + element = describe_info (g_variant_type_info_element (info)); + result = g_strdup_printf ("a of %s", element); + g_free (element); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_TUPLE: + { + const gchar *sep = ""; + GString *string; + gint length; + gint i; + + string = g_string_new ("t of ["); + length = g_variant_type_info_n_members (info); + + for (i = 0; i < length; i++) + { + const GVariantMemberInfo *minfo; + gchar *subtype; + + g_string_append (string, sep); + sep = ", "; + + minfo = g_variant_type_info_member_info (info, i); + subtype = describe_info (minfo->type_info); + g_string_append (string, subtype); + g_free (subtype); + } + + g_string_append_c (string, ']'); + + result = g_string_free (string, FALSE); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY: + { + const GVariantMemberInfo *keyinfo, *valueinfo; + gchar *key, *value; + + g_assert_cmpint (g_variant_type_info_n_members (info), ==, 2); + keyinfo = g_variant_type_info_member_info (info, 0); + valueinfo = g_variant_type_info_member_info (info, 1); + key = describe_info (keyinfo->type_info); + value = describe_info (valueinfo->type_info); + result = g_strjoin ("", "e of [", key, ", ", value, "]", NULL); + g_free (key); + g_free (value); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_VARIANT: + result = g_strdup ("V"); + break; + + default: + result = g_strdup (g_variant_type_info_get_type_string (info)); + g_assert_cmpint (strlen (result), ==, 1); + break; + } + + return result; +} + +/* check that the O(1) method of calculating offsets meshes with the + * results of simple iteration. + */ +static void +check_offsets (GVariantTypeInfo *info, + const GVariantType *type) +{ + gint flavour; + gint length; + + length = g_variant_type_info_n_members (info); + g_assert_cmpint (length, ==, g_variant_type_n_items (type)); + + /* the 'flavour' is the low order bits of the ending point of + * variable-size items in the tuple. this lets us test that the type + * info is correct for various starting alignments. + */ + for (flavour = 0; flavour < 8; flavour++) + { + const GVariantType *subtype; + gsize last_offset_index; + gsize last_offset; + gsize position; + gint i; + + subtype = g_variant_type_first (type); + last_offset_index = -1; + last_offset = 0; + position = 0; + + /* go through the tuple, keeping track of our position */ + for (i = 0; i < length; i++) + { + gsize fixed_size; + guint alignment; + + calculate_type_info (subtype, &fixed_size, &alignment); + + position = ALIGNED (position, alignment); + + /* compare our current aligned position (ie: the start of this + * item) to the start offset that would be calculated if we + * used the type info + */ + { + const GVariantMemberInfo *member; + gsize start; + + member = g_variant_type_info_member_info (info, i); + g_assert_cmpint (member->i, ==, last_offset_index); + + /* do the calculation using the typeinfo */ + start = last_offset; + start += member->a; + start &= member->b; + start |= member->c; + + /* did we reach the same spot? */ + g_assert_cmpint (start, ==, position); + } + + if (fixed_size) + { + /* fixed size. add that size. */ + position += fixed_size; + } + else + { + /* variable size. do the flavouring. */ + while ((position & 0x7) != flavour) + position++; + + /* and store the offset, just like it would be in the + * serialised data. + */ + last_offset = position; + last_offset_index++; + } + + /* next type */ + subtype = g_variant_type_next (subtype); + } + + /* make sure we used up exactly all the types */ + g_assert (subtype == NULL); + } +} + +static void +test_gvarianttypeinfo (void) +{ + gint i; + + for (i = 0; i < 2000; i++) + { + GString *type_string, *description; + gsize fixed_size1, fixed_size2; + guint alignment1, alignment2; + GVariantTypeInfo *info; + GVariantType *type; + gchar *desc; + + type_string = g_string_new (NULL); + description = g_string_new (NULL); + + /* random type */ + type = append_type_string (type_string, description, TRUE, 6); + + /* create a typeinfo for it */ + info = g_variant_type_info_get (type); + + /* make sure the typeinfo has the right type string */ + g_assert_cmpstr (g_variant_type_info_get_type_string (info), ==, + type_string->str); + + /* calculate the alignment and fixed size, compare to the + * typeinfo's calculations + */ + calculate_type_info (type, &fixed_size1, &alignment1); + g_variant_type_info_query (info, &alignment2, &fixed_size2); + g_assert_cmpint (fixed_size1, ==, fixed_size2); + g_assert_cmpint (alignment1, ==, alignment2 + 1); + + /* test the iteration functions over typeinfo structures by + * "describing" the typeinfo and verifying equality. + */ + desc = describe_info (info); + g_assert_cmpstr (desc, ==, description->str); + + /* do extra checks for containers */ + if (g_variant_type_is_array (type) || + g_variant_type_is_maybe (type)) + { + const GVariantType *element; + gsize efs1, efs2; + guint ea1, ea2; + + element = g_variant_type_element (type); + calculate_type_info (element, &efs1, &ea1); + g_variant_type_info_query_element (info, &ea2, &efs2); + g_assert_cmpint (efs1, ==, efs2); + g_assert_cmpint (ea1, ==, ea2 + 1); + + g_assert_cmpint (ea1, ==, alignment1); + g_assert_cmpint (0, ==, fixed_size1); + } + else if (g_variant_type_is_tuple (type) || + g_variant_type_is_dict_entry (type)) + { + /* make sure the "magic constants" are working */ + check_offsets (info, type); + } + + g_string_free (type_string, TRUE); + g_string_free (description, TRUE); + g_variant_type_info_unref (info); + g_variant_type_free (type); + g_free (desc); + } + + g_variant_type_info_assert_no_infos (); +} + +#define MAX_FIXED_MULTIPLIER 256 +#define MAX_INSTANCE_SIZE 1024 +#define MAX_ARRAY_CHILDREN 128 +#define MAX_TUPLE_CHILDREN 128 + +/* this function generates a random type such that all characteristics + * that are "interesting" to the serialiser are tested. + * + * this basically means: + * - test different alignments + * - test variable sized items and fixed sized items + * - test different fixed sizes + */ +static gchar * +random_type_string (void) +{ + const guchar base_types[] = "ynix"; + guchar base_type; + + base_type = base_types[g_test_rand_int_range (0, 4)]; + + if (g_test_rand_bit ()) + /* construct a fixed-sized type */ + { + char type_string[MAX_FIXED_MULTIPLIER]; + guint multiplier; + guint i = 0; + + multiplier = g_test_rand_int_range (1, sizeof type_string - 1); + + type_string[i++] = '('; + while (multiplier--) + type_string[i++] = base_type; + type_string[i++] = ')'; + + return g_strndup (type_string, i); + } + else + /* construct a variable-sized type */ + { + char type_string[2] = { 'a', base_type }; + + return g_strndup (type_string, 2); + } +} + +typedef struct +{ + GVariantTypeInfo *type_info; + guint alignment; + gsize size; + gboolean is_fixed_sized; + + guint32 seed; + +#define INSTANCE_MAGIC 1287582829 + guint magic; +} RandomInstance; + +static RandomInstance * +random_instance (GVariantTypeInfo *type_info) +{ + RandomInstance *instance; + + instance = g_slice_new (RandomInstance); + + if (type_info == NULL) + { + gchar *str = random_type_string (); + instance->type_info = g_variant_type_info_get (G_VARIANT_TYPE (str)); + g_free (str); + } + else + instance->type_info = g_variant_type_info_ref (type_info); + + instance->seed = g_test_rand_int (); + + g_variant_type_info_query (instance->type_info, + &instance->alignment, + &instance->size); + + instance->is_fixed_sized = instance->size != 0; + + if (!instance->is_fixed_sized) + instance->size = g_test_rand_int_range (0, MAX_INSTANCE_SIZE); + + instance->magic = INSTANCE_MAGIC; + + return instance; +} + +static void +random_instance_free (RandomInstance *instance) +{ + g_variant_type_info_unref (instance->type_info); + g_slice_free (RandomInstance, instance); +} + +static void +append_instance_size (RandomInstance *instance, + gsize *offset) +{ + *offset += (-*offset) & instance->alignment; + *offset += instance->size; +} + +static void +random_instance_write (RandomInstance *instance, + guchar *buffer) +{ + GRand *rand; + gint i; + + g_assert_cmpint ((gsize) buffer & instance->alignment, ==, 0); + + rand = g_rand_new_with_seed (instance->seed); + for (i = 0; i < instance->size; i++) + buffer[i] = g_rand_int (rand); + g_rand_free (rand); +} + +static void +append_instance_data (RandomInstance *instance, + guchar **buffer) +{ + while (((gsize) *buffer) & instance->alignment) + *(*buffer)++ = '\0'; + + random_instance_write (instance, *buffer); + *buffer += instance->size; +} + +static gboolean +random_instance_assert (RandomInstance *instance, + guchar *buffer, + gsize size) +{ + GRand *rand; + gint i; + + g_assert_cmpint ((gsize) buffer & instance->alignment, ==, 0); + g_assert_cmpint (size, ==, instance->size); + + rand = g_rand_new_with_seed (instance->seed); + for (i = 0; i < instance->size; i++) + { + guchar byte = g_rand_int (rand); + + g_assert (buffer[i] == byte); + } + g_rand_free (rand); + + return i == instance->size; +} + +static gboolean +random_instance_check (RandomInstance *instance, + guchar *buffer, + gsize size) +{ + GRand *rand; + gint i; + + g_assert_cmpint ((gsize) buffer & instance->alignment, ==, 0); + + if (size != instance->size) + return FALSE; + + rand = g_rand_new_with_seed (instance->seed); + for (i = 0; i < instance->size; i++) + if (buffer[i] != (guchar) g_rand_int (rand)) + break; + g_rand_free (rand); + + return i == instance->size; +} + +static void +random_instance_filler (GVariantSerialised *serialised, + gpointer data) +{ + RandomInstance *instance = data; + + g_assert (instance->magic == INSTANCE_MAGIC); + + if (serialised->type_info == NULL) + serialised->type_info = instance->type_info; + + if (serialised->size == 0) + serialised->size = instance->size; + + g_assert (serialised->type_info == instance->type_info); + g_assert (serialised->size == instance->size); + + if (serialised->data) + random_instance_write (instance, serialised->data); +} + +static gsize +calculate_offset_size (gsize body_size, + gsize n_offsets) +{ + if (body_size == 0) + return 0; + + if (body_size + n_offsets <= G_MAXUINT8) + return 1; + + if (body_size + 2 * n_offsets <= G_MAXUINT16) + return 2; + + if (body_size + 4 * n_offsets <= G_MAXUINT32) + return 4; + + /* the test case won't generate anything bigger */ + g_assert_not_reached (); +} + +static gpointer +flavoured_malloc (gsize size, gsize flavour) +{ + g_assert (flavour < 8); + + if (size == 0) + return NULL; + + return ((gchar *) g_malloc (size + flavour)) + flavour; +} + +static void +flavoured_free (gpointer data) +{ + g_free ((gpointer) (((gsize) data) & ~7)); +} + +static void +append_offset (guchar **offset_ptr, + gsize offset, + guint offset_size) +{ + union + { + guchar bytes[sizeof (gsize)]; + gsize integer; + } tmpvalue; + + tmpvalue.integer = GSIZE_TO_LE (offset); + memcpy (*offset_ptr, tmpvalue.bytes, offset_size); + *offset_ptr += offset_size; +} + +static void +prepend_offset (guchar **offset_ptr, + gsize offset, + guint offset_size) +{ + union + { + guchar bytes[sizeof (gsize)]; + gsize integer; + } tmpvalue; + + *offset_ptr -= offset_size; + tmpvalue.integer = GSIZE_TO_LE (offset); + memcpy (*offset_ptr, tmpvalue.bytes, offset_size); +} + +static void +test_maybe (void) +{ + GVariantTypeInfo *type_info; + RandomInstance *instance; + gsize needed_size; + guchar *data; + + instance = random_instance (NULL); + + { + const gchar *element; + gchar *tmp; + + element = g_variant_type_info_get_type_string (instance->type_info); + tmp = g_strdup_printf ("m%s", element); + type_info = g_variant_type_info_get (G_VARIANT_TYPE (tmp)); + g_free (tmp); + } + + needed_size = g_variant_serialiser_needed_size (type_info, + random_instance_filler, + NULL, 0); + g_assert_cmpint (needed_size, ==, 0); + + needed_size = g_variant_serialiser_needed_size (type_info, + random_instance_filler, + (gpointer *) &instance, 1); + + if (instance->is_fixed_sized) + g_assert_cmpint (needed_size, ==, instance->size); + else + g_assert_cmpint (needed_size, ==, instance->size + 1); + + { + guchar *ptr; + + ptr = data = g_malloc (needed_size); + append_instance_data (instance, &ptr); + + if (!instance->is_fixed_sized) + *ptr++ = '\0'; + + g_assert_cmpint (ptr - data, ==, needed_size); + } + + { + guint alignment; + guint flavour; + + alignment = instance->alignment + 1; + + for (flavour = 0; flavour < 8; flavour += alignment) + { + GVariantSerialised serialised; + GVariantSerialised child; + + serialised.type_info = type_info; + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + + g_variant_serialiser_serialise (serialised, + random_instance_filler, + (gpointer *) &instance, 1); + child = g_variant_serialised_get_child (serialised, 0); + g_assert (child.type_info == instance->type_info); + random_instance_assert (instance, child.data, child.size); + g_variant_type_info_unref (child.type_info); + flavoured_free (serialised.data); + } + } + + g_variant_type_info_unref (type_info); + random_instance_free (instance); + g_free (data); +} + +static void +test_maybes (void) +{ + guint i; + + for (i = 0; i < 1000; i++) + test_maybe (); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_array (void) +{ + GVariantTypeInfo *element_info; + GVariantTypeInfo *array_info; + RandomInstance **instances; + gsize needed_size; + gsize offset_size; + guint n_children; + guchar *data; + + { + gchar *element_type, *array_type; + + element_type = random_type_string (); + array_type = g_strdup_printf ("a%s", element_type); + + element_info = g_variant_type_info_get (G_VARIANT_TYPE (element_type)); + array_info = g_variant_type_info_get (G_VARIANT_TYPE (array_type)); + g_assert (g_variant_type_info_element (array_info) == element_info); + + g_free (element_type); + g_free (array_type); + } + + { + guint i; + + n_children = g_test_rand_int_range (0, MAX_ARRAY_CHILDREN); + instances = g_new (RandomInstance *, n_children); + for (i = 0; i < n_children; i++) + instances[i] = random_instance (element_info); + } + + needed_size = g_variant_serialiser_needed_size (array_info, + random_instance_filler, + (gpointer *) instances, + n_children); + + { + gsize element_fixed_size; + gsize body_size = 0; + guint i; + + for (i = 0; i < n_children; i++) + append_instance_size (instances[i], &body_size); + + g_variant_type_info_query (element_info, NULL, &element_fixed_size); + + if (!element_fixed_size) + { + offset_size = calculate_offset_size (body_size, n_children); + + if (offset_size == 0) + offset_size = 1; + } + else + offset_size = 0; + + g_assert_cmpint (needed_size, ==, body_size + n_children * offset_size); + } + + { + guchar *offset_ptr, *body_ptr; + guint i; + + body_ptr = data = g_malloc (needed_size); + offset_ptr = body_ptr + needed_size - offset_size * n_children; + + for (i = 0; i < n_children; i++) + { + append_instance_data (instances[i], &body_ptr); + append_offset (&offset_ptr, body_ptr - data, offset_size); + } + + g_assert (body_ptr == data + needed_size - offset_size * n_children); + g_assert (offset_ptr == data + needed_size); + } + + { + guint alignment; + gsize flavour; + guint i; + + g_variant_type_info_query (array_info, &alignment, NULL); + alignment++; + + for (flavour = 0; flavour < 8; flavour += alignment) + { + GVariantSerialised serialised; + + serialised.type_info = array_info; + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) instances, n_children); + + g_assert (memcmp (serialised.data, data, serialised.size) == 0); + g_assert (g_variant_serialised_n_children (serialised) == n_children); + + for (i = 0; i < n_children; i++) + { + GVariantSerialised child; + + child = g_variant_serialised_get_child (serialised, i); + g_assert (child.type_info == instances[i]->type_info); + random_instance_assert (instances[i], child.data, child.size); + g_variant_type_info_unref (child.type_info); + } + + flavoured_free (serialised.data); + } + } + + { + guint i; + + for (i = 0; i < n_children; i++) + random_instance_free (instances[i]); + g_free (instances); + } + + g_variant_type_info_unref (element_info); + g_variant_type_info_unref (array_info); + g_free (data); +} + +static void +test_arrays (void) +{ + guint i; + + for (i = 0; i < 100; i++) + test_array (); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_tuple (void) +{ + GVariantTypeInfo *type_info; + RandomInstance **instances; + gboolean fixed_size; + gsize needed_size; + gsize offset_size; + guint n_children; + guint alignment; + guchar *data; + + n_children = g_test_rand_int_range (0, MAX_TUPLE_CHILDREN); + instances = g_new (RandomInstance *, n_children); + + { + GString *type_string; + guint i; + + fixed_size = TRUE; + alignment = 0; + + type_string = g_string_new ("("); + for (i = 0; i < n_children; i++) + { + const gchar *str; + + instances[i] = random_instance (NULL); + + alignment |= instances[i]->alignment; + if (!instances[i]->is_fixed_sized) + fixed_size = FALSE; + + str = g_variant_type_info_get_type_string (instances[i]->type_info); + g_string_append (type_string, str); + } + g_string_append_c (type_string, ')'); + + type_info = g_variant_type_info_get (G_VARIANT_TYPE (type_string->str)); + g_string_free (type_string, TRUE); + } + + needed_size = g_variant_serialiser_needed_size (type_info, + random_instance_filler, + (gpointer *) instances, + n_children); + { + gsize body_size = 0; + gsize offsets = 0; + guint i; + + for (i = 0; i < n_children; i++) + { + append_instance_size (instances[i], &body_size); + + if (i != n_children - 1 && !instances[i]->is_fixed_sized) + offsets++; + } + + if (fixed_size) + { + body_size += (-body_size) & alignment; + + g_assert ((body_size == 0) == (n_children == 0)); + if (n_children == 0) + body_size = 1; + } + + offset_size = calculate_offset_size (body_size, offsets); + g_assert_cmpint (needed_size, ==, body_size + offsets * offset_size); + } + + { + guchar *body_ptr; + guchar *ofs_ptr; + guint i; + + body_ptr = data = g_malloc (needed_size); + ofs_ptr = body_ptr + needed_size; + + for (i = 0; i < n_children; i++) + { + append_instance_data (instances[i], &body_ptr); + + if (i != n_children - 1 && !instances[i]->is_fixed_sized) + prepend_offset (&ofs_ptr, body_ptr - data, offset_size); + } + + if (fixed_size) + { + while (((gsize) body_ptr) & alignment) + *body_ptr++ = '\0'; + + g_assert ((body_ptr == data) == (n_children == 0)); + if (n_children == 0) + *body_ptr++ = '\0'; + + } + + + g_assert (body_ptr == ofs_ptr); + } + + { + gsize flavour; + guint i; + + alignment++; + + for (flavour = 0; flavour < 8; flavour += alignment) + { + GVariantSerialised serialised; + + serialised.type_info = type_info; + serialised.data = flavoured_malloc (needed_size, flavour); + serialised.size = needed_size; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) instances, n_children); + + g_assert (memcmp (serialised.data, data, serialised.size) == 0); + g_assert (g_variant_serialised_n_children (serialised) == n_children); + + for (i = 0; i < n_children; i++) + { + GVariantSerialised child; + + child = g_variant_serialised_get_child (serialised, i); + g_assert (child.type_info == instances[i]->type_info); + random_instance_assert (instances[i], child.data, child.size); + g_variant_type_info_unref (child.type_info); + } + + flavoured_free (serialised.data); + } + } + + { + guint i; + + for (i = 0; i < n_children; i++) + random_instance_free (instances[i]); + g_free (instances); + } + + g_variant_type_info_unref (type_info); + g_free (data); +} + +static void +test_tuples (void) +{ + guint i; + + for (i = 0; i < 100; i++) + test_tuple (); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_variant (void) +{ + GVariantTypeInfo *type_info; + RandomInstance *instance; + const gchar *type_string; + gsize needed_size; + guchar *data; + gsize len; + + type_info = g_variant_type_info_get (G_VARIANT_TYPE_VARIANT); + instance = random_instance (NULL); + + type_string = g_variant_type_info_get_type_string (instance->type_info); + len = strlen (type_string); + + needed_size = g_variant_serialiser_needed_size (type_info, + random_instance_filler, + (gpointer *) &instance, 1); + + g_assert_cmpint (needed_size, ==, instance->size + 1 + len); + + { + guchar *ptr; + + ptr = data = g_malloc (needed_size); + append_instance_data (instance, &ptr); + *ptr++ = '\0'; + memcpy (ptr, type_string, len); + ptr += len; + + g_assert (data + needed_size == ptr); + } + + { + /* variants are 8-aligned, so no extra flavouring */ + GVariantSerialised serialised; + GVariantSerialised child; + + serialised.type_info = type_info; + serialised.data = flavoured_malloc (needed_size, 0); + serialised.size = needed_size; + + g_variant_serialiser_serialise (serialised, random_instance_filler, + (gpointer *) &instance, 1); + + g_assert (memcmp (serialised.data, data, serialised.size) == 0); + g_assert (g_variant_serialised_n_children (serialised) == 1); + + child = g_variant_serialised_get_child (serialised, 0); + g_assert (child.type_info == instance->type_info); + random_instance_check (instance, child.data, child.size); + + g_variant_type_info_unref (child.type_info); + flavoured_free (serialised.data); + } + + g_variant_type_info_unref (type_info); + random_instance_free (instance); + g_free (data); +} + +static void +test_variants (void) +{ + guint i; + + for (i = 0; i < 100; i++) + test_variant (); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_strings (void) +{ + struct { + guint flags; + guint size; + gconstpointer data; + } test_cases[] = { +#define is_nval 0 +#define is_string 1 +#define is_objpath is_string | 2 +#define is_sig is_string | 4 + { is_sig, 1, "" }, + { is_nval, 0, NULL }, + { is_string, 13, "hello world!" }, + { is_nval, 13, "hello world\0" }, + { is_nval, 13, "hello\0world!" }, + { is_nval, 12, "hello world!" }, + + { is_objpath, 2, "/" }, + { is_objpath, 3, "/a" }, + { is_string, 3, "//" }, + { is_objpath, 11, "/some/path" }, + { is_string, 12, "/some/path/" }, + { is_nval, 11, "/some\0path" }, + { is_string, 11, "/some\\path" }, + { is_string, 12, "/some//path" }, + { is_string, 12, "/some-/path" }, + + { is_sig, 2, "i" }, + { is_sig, 2, "s" }, + { is_sig, 5, "(si)" }, + { is_string, 4, "(si" }, + { is_string, 2, "*" }, + { is_sig, 3, "ai" }, + { is_string, 3, "mi" }, + { is_string, 2, "r" }, + { is_sig, 15, "(yyy{sv}ssiai)" }, + { is_string, 16, "(yyy{yv}ssiai))" }, + { is_string, 15, "(yyy{vv}ssiai)" }, + { is_string, 15, "(yyy{sv)ssiai}" } + }; + guint i; + + for (i = 0; i < G_N_ELEMENTS (test_cases); i++) + { + guint flags; + + flags = g_variant_serialiser_is_string (test_cases[i].data, + test_cases[i].size) + ? 1 : 0; + + flags |= g_variant_serialiser_is_object_path (test_cases[i].data, + test_cases[i].size) + ? 2 : 0; + + flags |= g_variant_serialiser_is_signature (test_cases[i].data, + test_cases[i].size) + ? 4 : 0; + + g_assert (flags == test_cases[i].flags); + } +} + +typedef struct _TreeInstance TreeInstance; +struct _TreeInstance +{ + GVariantTypeInfo *info; + + TreeInstance **children; + gsize n_children; + + union { + guint64 integer; + gdouble floating; + gchar string[32]; + } data; + gsize data_size; +}; + +static GVariantType * +make_random_definite_type (int depth) +{ + GString *description; + GString *type_string; + GVariantType *type; + + description = g_string_new (NULL); + type_string = g_string_new (NULL); + type = append_type_string (type_string, description, TRUE, depth); + g_string_free (description, TRUE); + g_string_free (type_string, TRUE); + + return type; +} + +static void +make_random_string (gchar *string, + gsize size, + const GVariantType *type) +{ + gint i; + + /* create strings that are valid signature strings */ +#define good_chars "bynqiuxthdsog" + + for (i = 0; i < size - 1; i++) + string[i] = good_chars[g_test_rand_int_range (0, strlen (good_chars))]; + string[i] = '\0'; + + /* in case we need an object path, prefix a '/' */ + if (*g_variant_type_peek_string (type) == 'o') + string[0] = '/'; + +#undef good_chars +} + +static TreeInstance * +tree_instance_new (const GVariantType *type, + int depth) +{ + const GVariantType *child_type = NULL; + GVariantType *mytype = NULL; + TreeInstance *instance; + gboolean is_tuple_type; + + if (type == NULL) + type = mytype = make_random_definite_type (depth); + + instance = g_slice_new (TreeInstance); + instance->info = g_variant_type_info_get (type); + instance->children = NULL; + instance->n_children = 0; + instance->data_size = 0; + + is_tuple_type = FALSE; + + switch (*g_variant_type_peek_string (type)) + { + case G_VARIANT_TYPE_INFO_CHAR_MAYBE: + instance->n_children = g_test_rand_int_range (0, 2); + child_type = g_variant_type_element (type); + break; + + case G_VARIANT_TYPE_INFO_CHAR_ARRAY: + instance->n_children = g_test_rand_int_range (0, MAX_ARRAY_CHILDREN); + child_type = g_variant_type_element (type); + break; + + case G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY: + case G_VARIANT_TYPE_INFO_CHAR_TUPLE: + instance->n_children = g_variant_type_n_items (type); + child_type = g_variant_type_first (type); + is_tuple_type = TRUE; + break; + + case G_VARIANT_TYPE_INFO_CHAR_VARIANT: + instance->n_children = 1; + child_type = NULL; + break; + + case 'b': + instance->data.integer = g_test_rand_int_range (0, 2); + instance->data_size = 1; + break; + + case 'y': + instance->data.integer = g_test_rand_int (); + instance->data_size = 1; + break; + + case 'n': case 'q': + instance->data.integer = g_test_rand_int (); + instance->data_size = 2; + break; + + case 'i': case 'u': case 'h': + instance->data.integer = g_test_rand_int (); + instance->data_size = 4; + break; + + case 'x': case 't': + instance->data.integer = g_test_rand_int (); + instance->data.integer <<= 32; + instance->data.integer |= (guint32) g_test_rand_int (); + instance->data_size = 8; + break; + + case 'd': + instance->data.floating = g_test_rand_double (); + instance->data_size = 8; + break; + + case 's': case 'o': case 'g': + instance->data_size = g_test_rand_int_range (10, 20); + make_random_string (instance->data.string, instance->data_size, type); + break; + } + + if (instance->data_size == 0) + /* no data -> it is a container */ + { + guint i; + + instance->children = g_new (TreeInstance *, instance->n_children); + + for (i = 0; i < instance->n_children; i++) + { + instance->children[i] = tree_instance_new (child_type, depth - 1); + + if (is_tuple_type) + child_type = g_variant_type_next (child_type); + } + + g_assert (!is_tuple_type || child_type == NULL); + } + + g_variant_type_free (mytype); + + return instance; +} + +static void +tree_instance_free (TreeInstance *instance) +{ + gint i; + + g_variant_type_info_unref (instance->info); + for (i = 0; i < instance->n_children; i++) + tree_instance_free (instance->children[i]); + g_free (instance->children); + g_slice_free (TreeInstance, instance); +} + +static gboolean i_am_writing_byteswapped; + +static void +tree_filler (GVariantSerialised *serialised, + gpointer data) +{ + TreeInstance *instance = data; + + if (serialised->type_info == NULL) + serialised->type_info = instance->info; + + if (instance->data_size == 0) + /* is a container */ + { + if (serialised->size == 0) + serialised->size = + g_variant_serialiser_needed_size (instance->info, tree_filler, + (gpointer *) instance->children, + instance->n_children); + + if (serialised->data) + g_variant_serialiser_serialise (*serialised, tree_filler, + (gpointer *) instance->children, + instance->n_children); + } + else + /* it is a leaf */ + { + if (serialised->size == 0) + serialised->size = instance->data_size; + + if (serialised->data) + { + switch (instance->data_size) + { + case 1: + *serialised->data = instance->data.integer; + break; + + case 2: + { + guint16 value = instance->data.integer; + + if (i_am_writing_byteswapped) + value = GUINT16_SWAP_LE_BE (value); + + *(guint16 *) serialised->data = value; + } + break; + + case 4: + { + guint32 value = instance->data.integer; + + if (i_am_writing_byteswapped) + value = GUINT32_SWAP_LE_BE (value); + + *(guint32 *) serialised->data = value; + } + break; + + case 8: + { + guint64 value = instance->data.integer; + + if (i_am_writing_byteswapped) + value = GUINT64_SWAP_LE_BE (value); + + *(guint64 *) serialised->data = value; + } + break; + + default: + memcpy (serialised->data, + instance->data.string, + instance->data_size); + break; + } + } + } +} + +static gboolean +check_tree (TreeInstance *instance, + GVariantSerialised serialised) +{ + if (instance->info != serialised.type_info) + return FALSE; + + if (instance->data_size == 0) + /* is a container */ + { + gint i; + + if (g_variant_serialised_n_children (serialised) != + instance->n_children) + return FALSE; + + for (i = 0; i < instance->n_children; i++) + { + GVariantSerialised child; + gpointer data = NULL; + gboolean ok; + + child = g_variant_serialised_get_child (serialised, i); + if (child.size && child.data == NULL) + child.data = data = g_malloc0 (child.size); + ok = check_tree (instance->children[i], child); + g_variant_type_info_unref (child.type_info); + g_free (data); + + if (!ok) + return FALSE; + } + + return TRUE; + } + else + /* it is a leaf */ + { + switch (instance->data_size) + { + case 1: + g_assert (serialised.size == 1); + return *(guint8 *) serialised.data == + (guint8) instance->data.integer; + + case 2: + g_assert (serialised.size == 2); + return *(guint16 *) serialised.data == + (guint16) instance->data.integer; + + case 4: + g_assert (serialised.size == 4); + return *(guint32 *) serialised.data == + (guint32) instance->data.integer; + + case 8: + g_assert (serialised.size == 8); + return *(guint64 *) serialised.data == + (guint64) instance->data.integer; + + default: + if (serialised.size != instance->data_size) + return FALSE; + + return memcmp (serialised.data, + instance->data.string, + instance->data_size) == 0; + } + } +} + +static void +serialise_tree (TreeInstance *tree, + GVariantSerialised *serialised) +{ + GVariantSerialised empty = { }; + + *serialised = empty; + tree_filler (serialised, tree); + serialised->data = g_malloc (serialised->size); + tree_filler (serialised, tree); +} + +static void +test_byteswap (void) +{ + GVariantSerialised one, two; + TreeInstance *tree; + + tree = tree_instance_new (NULL, 3); + serialise_tree (tree, &one); + + i_am_writing_byteswapped = TRUE; + serialise_tree (tree, &two); + i_am_writing_byteswapped = FALSE; + + g_variant_serialised_byteswap (two); + + g_assert_cmpint (one.size, ==, two.size); + g_assert (memcmp (one.data, two.data, one.size) == 0); + + tree_instance_free (tree); + g_free (one.data); + g_free (two.data); +} + +static void +test_byteswaps (void) +{ + int i; + + for (i = 0; i < 200; i++) + test_byteswap (); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_fuzz (gdouble *fuzziness) +{ + GVariantSerialised serialised; + TreeInstance *tree; + + /* make an instance */ + tree = tree_instance_new (NULL, 3); + + /* serialise it */ + serialise_tree (tree, &serialised); + + g_assert (g_variant_serialised_is_normal (serialised)); + g_assert (check_tree (tree, serialised)); + + if (serialised.size) + { + gboolean fuzzed = FALSE; + gboolean a, b; + + while (!fuzzed) + { + gint i; + + for (i = 0; i < serialised.size; i++) + if (randomly (*fuzziness)) + { + serialised.data[i] += g_test_rand_int_range (1, 256); + fuzzed = TRUE; + } + } + + /* at least one byte in the serialised data has changed. + * + * this means that at least one of the following is true: + * + * - the serialised data now represents a different value: + * check_tree() will return FALSE + * + * - the serialised data is in non-normal form: + * g_variant_serialiser_is_normal() will return FALSE + * + * we always do both checks to increase exposure of the serialiser + * to corrupt data. + */ + a = g_variant_serialised_is_normal (serialised); + b = check_tree (tree, serialised); + + g_assert (!a || !b); + } + + tree_instance_free (tree); + g_free (serialised.data); +} + + +static void +test_fuzzes (gpointer data) +{ + gdouble fuzziness; + int i; + + fuzziness = GPOINTER_TO_INT (data) / 100.; + + for (i = 0; i < 200; i++) + test_fuzz (&fuzziness); + + g_variant_type_info_assert_no_infos (); +} + +static GVariant * +tree_instance_get_gvariant (TreeInstance *tree) +{ + const GVariantType *type; + GVariant *result; + + type = (GVariantType *) g_variant_type_info_get_type_string (tree->info); + + switch (g_variant_type_info_get_type_char (tree->info)) + { + case G_VARIANT_TYPE_INFO_CHAR_MAYBE: + { + const GVariantType *child_type; + GVariant *child; + + if (tree->n_children) + child = tree_instance_get_gvariant (tree->children[0]); + else + child = NULL; + + child_type = g_variant_type_element (type); + + if (child != NULL && randomly (0.5)) + child_type = NULL; + + result = g_variant_new_maybe (child_type, child); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_ARRAY: + { + const GVariantType *child_type; + GVariant **children; + gint i; + + children = g_new (GVariant *, tree->n_children); + for (i = 0; i < tree->n_children; i++) + children[i] = tree_instance_get_gvariant (tree->children[i]); + + child_type = g_variant_type_element (type); + + if (i > 0 && randomly (0.5)) + child_type = NULL; + + result = g_variant_new_array (child_type, children, tree->n_children); + g_free (children); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_TUPLE: + { + GVariant **children; + gint i; + + children = g_new (GVariant *, tree->n_children); + for (i = 0; i < tree->n_children; i++) + children[i] = tree_instance_get_gvariant (tree->children[i]); + + result = g_variant_new_tuple (children, tree->n_children); + g_free (children); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY: + { + GVariant *key, *val; + + g_assert (tree->n_children == 2); + + key = tree_instance_get_gvariant (tree->children[0]); + val = tree_instance_get_gvariant (tree->children[1]); + + result = g_variant_new_dict_entry (key, val); + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_VARIANT: + { + GVariant *value; + + g_assert (tree->n_children == 1); + + value = tree_instance_get_gvariant (tree->children[0]); + result = g_variant_new_variant (value); + } + break; + + case 'b': + result = g_variant_new_boolean (tree->data.integer > 0); + break; + + case 'y': + result = g_variant_new_byte (tree->data.integer); + break; + + case 'n': + result = g_variant_new_int16 (tree->data.integer); + break; + + case 'q': + result = g_variant_new_uint16 (tree->data.integer); + break; + + case 'i': + result = g_variant_new_int32 (tree->data.integer); + break; + + case 'u': + result = g_variant_new_uint32 (tree->data.integer); + break; + + case 'x': + result = g_variant_new_int64 (tree->data.integer); + break; + + case 't': + result = g_variant_new_uint64 (tree->data.integer); + break; + + case 'h': + result = g_variant_new_handle (tree->data.integer); + break; + + case 'd': + result = g_variant_new_double (tree->data.floating); + break; + + case 's': + result = g_variant_new_string (tree->data.string); + break; + + case 'o': + result = g_variant_new_object_path (tree->data.string); + break; + + case 'g': + result = g_variant_new_signature (tree->data.string); + break; + + default: + g_assert_not_reached (); + } + + return result; +} + +static gboolean +tree_instance_check_gvariant (TreeInstance *tree, + GVariant *value) +{ + const GVariantType *type; + + type = (GVariantType *) g_variant_type_info_get_type_string (tree->info); + g_assert (g_variant_is_of_type (value, type)); + + switch (g_variant_type_info_get_type_char (tree->info)) + { + case G_VARIANT_TYPE_INFO_CHAR_MAYBE: + { + GVariant *child; + gboolean equal; + + child = g_variant_get_maybe (value); + + if (child != NULL && tree->n_children == 1) + equal = tree_instance_check_gvariant (tree->children[0], child); + else if (child == NULL && tree->n_children == 0) + equal = TRUE; + else + equal = FALSE; + + if (child != NULL) + g_variant_unref (child); + + return equal; + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_ARRAY: + case G_VARIANT_TYPE_INFO_CHAR_TUPLE: + case G_VARIANT_TYPE_INFO_CHAR_DICT_ENTRY: + { + gsize i; + + if (g_variant_n_children (value) != tree->n_children) + return FALSE; + + for (i = 0; i < tree->n_children; i++) + { + GVariant *child; + gboolean equal; + + child = g_variant_get_child_value (value, i); + equal = tree_instance_check_gvariant (tree->children[i], child); + g_variant_unref (child); + + if (!equal) + return FALSE; + } + + return TRUE; + } + break; + + case G_VARIANT_TYPE_INFO_CHAR_VARIANT: + { + const gchar *str1, *str2; + GVariant *child; + gboolean equal; + + child = g_variant_get_variant (value); + str1 = g_variant_get_type_string (child); + str2 = g_variant_type_info_get_type_string (tree->children[0]->info); + /* GVariant only keeps one copy of type strings around */ + equal = str1 == str2 && + tree_instance_check_gvariant (tree->children[0], child); + + g_variant_unref (child); + + return equal; + } + break; + + case 'b': + return g_variant_get_boolean (value) == tree->data.integer; + + case 'y': + return g_variant_get_byte (value) == (guchar) tree->data.integer; + + case 'n': + return g_variant_get_int16 (value) == (gint16) tree->data.integer; + + case 'q': + return g_variant_get_uint16 (value) == (guint16) tree->data.integer; + + case 'i': + return g_variant_get_int32 (value) == (gint32) tree->data.integer; + + case 'u': + return g_variant_get_uint32 (value) == (guint32) tree->data.integer; + + case 'x': + return g_variant_get_int64 (value) == (gint64) tree->data.integer; + + case 't': + return g_variant_get_uint64 (value) == (guint64) tree->data.integer; + + case 'h': + return g_variant_get_handle (value) == (gint32) tree->data.integer; + + case 'd': + { + gdouble floating = g_variant_get_double (value); + + return memcmp (&floating, &tree->data.floating, sizeof floating) == 0; + } + + case 's': + case 'o': + case 'g': + return strcmp (g_variant_get_string (value, NULL), + tree->data.string) == 0; + + default: + g_assert_not_reached (); + } +} + +static void +tree_instance_build_gvariant (TreeInstance *tree, + GVariantBuilder *builder, + gboolean guess_ok) +{ + const GVariantType *type; + + type = (GVariantType *) g_variant_type_info_get_type_string (tree->info); + + if (g_variant_type_is_container (type)) + { + gsize i; + + /* force GVariantBuilder to guess the type half the time */ + if (guess_ok && randomly (0.5)) + { + if (g_variant_type_is_array (type) && tree->n_children) + type = G_VARIANT_TYPE_ARRAY; + + if (g_variant_type_is_maybe (type) && tree->n_children) + type = G_VARIANT_TYPE_MAYBE; + + if (g_variant_type_is_tuple (type)) + type = G_VARIANT_TYPE_TUPLE; + + if (g_variant_type_is_dict_entry (type)) + type = G_VARIANT_TYPE_DICT_ENTRY; + } + else + guess_ok = FALSE; + + g_variant_builder_open (builder, type); + + for (i = 0; i < tree->n_children; i++) + tree_instance_build_gvariant (tree->children[i], builder, guess_ok); + + g_variant_builder_close (builder); + } + else + g_variant_builder_add_value (builder, tree_instance_get_gvariant (tree)); +} + + +static gboolean +tree_instance_check_iter (TreeInstance *tree, + GVariantIter *iter) +{ + GVariant *value; + + value = g_variant_iter_next_value (iter); + + if (g_variant_is_container (value)) + { + gsize i; + + iter = g_variant_iter_new (value); + g_variant_unref (value); + + if (g_variant_iter_n_children (iter) != tree->n_children) + { + g_variant_iter_free (iter); + return FALSE; + } + + for (i = 0; i < tree->n_children; i++) + if (!tree_instance_check_iter (tree->children[i], iter)) + { + g_variant_iter_free (iter); + return FALSE; + } + + g_assert (g_variant_iter_next_value (iter) == NULL); + g_variant_iter_free (iter); + + return TRUE; + } + + else + { + gboolean equal; + + equal = tree_instance_check_gvariant (tree, value); + g_variant_unref (value); + + return equal; + } +} + +static void +test_container (void) +{ + TreeInstance *tree; + GVariant *value; + gchar *s1, *s2; + + tree = tree_instance_new (NULL, 3); + value = g_variant_ref_sink (tree_instance_get_gvariant (tree)); + + s1 = g_variant_print (value, TRUE); + g_assert (tree_instance_check_gvariant (tree, value)); + + g_variant_get_data (value); + + s2 = g_variant_print (value, TRUE); + g_assert (tree_instance_check_gvariant (tree, value)); + + g_assert_cmpstr (s1, ==, s2); + + if (g_variant_is_container (value)) + { + GVariantBuilder builder; + GVariantIter iter; + GVariant *built; + GVariant *val; + gchar *s3; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARIANT); + tree_instance_build_gvariant (tree, &builder, TRUE); + built = g_variant_builder_end (&builder); + g_variant_ref_sink (built); + g_variant_get_data (built); + val = g_variant_get_variant (built); + + s3 = g_variant_print (val, TRUE); + g_assert_cmpstr (s1, ==, s3); + + g_variant_iter_init (&iter, built); + g_assert (tree_instance_check_iter (tree, &iter)); + g_assert (g_variant_iter_next_value (&iter) == NULL); + + g_variant_unref (built); + g_variant_unref (val); + g_free (s3); + } + + tree_instance_free (tree); + g_variant_unref (value); + g_free (s2); + g_free (s1); +} + +static void +test_containers (void) +{ + gint i; + + for (i = 0; i < 100; i++) + { + test_container (); + } + + g_variant_type_info_assert_no_infos (); +} + +static void +test_format_strings (void) +{ + GVariantType *type; + const gchar *end; + + g_assert (g_variant_format_string_scan ("i", NULL, &end) && *end == '\0'); + g_assert (g_variant_format_string_scan ("@i", NULL, &end) && *end == '\0'); + g_assert (g_variant_format_string_scan ("@ii", NULL, &end) && *end == 'i'); + g_assert (g_variant_format_string_scan ("^a&s", NULL, &end) && *end == '\0'); + g_assert (g_variant_format_string_scan ("(^as)", NULL, &end) && + *end == '\0'); + g_assert (!g_variant_format_string_scan ("(^s)", NULL, &end)); + g_assert (!g_variant_format_string_scan ("(^a)", NULL, &end)); + g_assert (!g_variant_format_string_scan ("(z)", NULL, &end)); + g_assert (!g_variant_format_string_scan ("az", NULL, &end)); + g_assert (!g_variant_format_string_scan ("{**}", NULL, &end)); + g_assert (!g_variant_format_string_scan ("{@**}", NULL, &end)); + g_assert (g_variant_format_string_scan ("{@y*}", NULL, &end) && + *end == '\0'); + g_assert (g_variant_format_string_scan ("{yv}", NULL, &end) && + *end == '\0'); + g_assert (!g_variant_format_string_scan ("{&?v}", NULL, &end)); + g_assert (g_variant_format_string_scan ("{@?v}", NULL, &end) && + *end == '\0'); + g_assert (!g_variant_format_string_scan ("{&@sv}", NULL, &end)); + g_assert (!g_variant_format_string_scan ("{@&sv}", NULL, &end)); + g_assert (g_variant_format_string_scan ("{&sv}", NULL, &end) && + *end == '\0'); + g_assert (!g_variant_format_string_scan ("{vv}", NULL, &end)); + g_assert (!g_variant_format_string_scan ("{y}", NULL, &end)); + g_assert (!g_variant_format_string_scan ("{yyy}", NULL, &end)); + g_assert (!g_variant_format_string_scan ("{ya}", NULL, &end)); + g_assert (g_variant_format_string_scan ("&s", NULL, &end) && *end == '\0'); + g_assert (!g_variant_format_string_scan ("&as", NULL, &end)); + g_assert (!g_variant_format_string_scan ("@z", NULL, &end)); + g_assert (!g_variant_format_string_scan ("az", NULL, &end)); + g_assert (!g_variant_format_string_scan ("a&s", NULL, &end)); + + type = g_variant_format_string_scan_type ("mm(@xy^a&s*?@?)", NULL, &end); + g_assert (type && *end == '\0'); + g_assert (g_variant_type_equal (type, G_VARIANT_TYPE ("mm(xyas*?\?)"))); + g_variant_type_free (type); + + type = g_variant_format_string_scan_type ("mm(@xy^a&*?@?)", NULL, NULL); + g_assert (type == NULL); +} + +static void +exit_on_abort (int signal) +{ + exit (signal); +} + +static gboolean +do_failed_test (const gchar *pattern) +{ + if (g_test_trap_fork (1000000, G_TEST_TRAP_SILENCE_STDERR)) + { + signal (SIGABRT, exit_on_abort); + return TRUE; + } + + g_test_trap_assert_failed (); + g_test_trap_assert_stderr (pattern); + + return FALSE; +} + +static void +test_invalid_varargs (void) +{ + if (do_failed_test ("*GVariant format string*")) + { + g_variant_new ("z"); + abort (); + } + + if (do_failed_test ("*valid GVariant format string as a prefix*")) + { + const gchar *end; + + g_variant_new_va ("z", &end, NULL); + abort (); + } + + if (do_failed_test ("*type of `q' but * has a type of `y'*")) + { + g_variant_get (g_variant_new ("y", 'a'), "q"); + abort (); + } +} + +static void +check_and_free (GVariant *value, + const gchar *str) +{ + gchar *valstr = g_variant_print (value, FALSE); + g_assert_cmpstr (str, ==, valstr); + g_variant_unref (value); + g_free (valstr); +} + +static void +test_varargs (void) +{ + { + GVariantBuilder array; + + g_variant_builder_init (&array, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add (&array, "{sv}", "size", + g_variant_new ("(ii)", 800, 600)); + g_variant_builder_add (&array, "{sv}", "title", + g_variant_new_string ("Test case")); + g_variant_builder_add_value (&array, + g_variant_new_dict_entry (g_variant_new_string ("temperature"), + g_variant_new_variant ( + g_variant_new_double (37.5)))); + check_and_free (g_variant_new ("(ma{sv}m(a{sv})ma{sv}ii)", + NULL, FALSE, NULL, &array, 7777, 8888), + "(nothing, nothing, {'size': <(800, 600)>, " + "'title': <'Test case'>, " + "'temperature': <37.5>}, " + "7777, 8888)"); + + check_and_free (g_variant_new ("(imimimmimmimmi)", + 123, + FALSE, 321, + TRUE, 123, + FALSE, TRUE, 321, + TRUE, FALSE, 321, + TRUE, TRUE, 123), + "(123, nothing, 123, nothing, just nothing, 123)"); + + check_and_free (g_variant_new ("(ybnixd)", + 'a', 1, 22, 33, (guint64) 44, 5.5), + "(0x61, true, 22, 33, 44, 5.5)"); + + check_and_free (g_variant_new ("(@y?*rv)", + g_variant_new ("y", 'a'), + g_variant_new ("y", 'b'), + g_variant_new ("y", 'c'), + g_variant_new ("(y)", 'd'), + g_variant_new ("y", 'e')), + "(0x61, 0x62, 0x63, (0x64,), )"); + } + + { + GVariantBuilder array; + GVariantIter iter; + GVariant *value; + gchar *number; + gboolean just; + gint i, val; + + g_variant_builder_init (&array, G_VARIANT_TYPE_ARRAY); + for (i = 0; i < 100; i++) + { + number = g_strdup_printf ("%d", i); + g_variant_builder_add (&array, "s", number); + g_free (number); + } + + value = g_variant_builder_end (&array); + g_variant_iter_init (&iter, value); + + i = 0; + while (g_variant_iter_loop (&iter, "s", &number)) + { + gchar *check = g_strdup_printf ("%d", i++); + g_assert_cmpstr (number, ==, check); + g_free (check); + } + g_assert (number == NULL); + g_assert (i == 100); + + g_variant_unref (value); + + g_variant_builder_init (&array, G_VARIANT_TYPE_ARRAY); + for (i = 0; i < 100; i++) + g_variant_builder_add (&array, "mi", i % 2 == 0, i); + value = g_variant_builder_end (&array); + + i = 0; + g_variant_iter_init (&iter, value); + while (g_variant_iter_loop (&iter, "mi", NULL, &val)) + g_assert (val == i++ || val == 0); + g_assert (i == 100); + + i = 0; + g_variant_iter_init (&iter, value); + while (g_variant_iter_loop (&iter, "mi", &just, &val)) + { + gint this = i++; + + if (this % 2 == 0) + { + g_assert (just); + g_assert (val == this); + } + else + { + g_assert (!just); + g_assert (val == 0); + } + } + g_assert (i == 100); + + g_variant_unref (value); + } + + { + const gchar *strvector[] = {"/hello", "/world", NULL}; + const gchar *test_strs[] = {"/foo", "/bar", "/baz" }; + GVariantBuilder builder; + GVariantIter *array; + GVariantIter tuple; + const gchar **strv; + gchar **my_strv; + GVariant *value; + gchar *str; + gint i; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("ao")); + g_variant_builder_add (&builder, "o", "/foo"); + g_variant_builder_add (&builder, "o", "/bar"); + g_variant_builder_add (&builder, "o", "/baz"); + value = g_variant_new("(ao^ao^a&o)", &builder, strvector, strvector); + g_variant_iter_init (&tuple, value); + g_variant_iter_next (&tuple, "ao", &array); + + i = 0; + while (g_variant_iter_loop (array, "o", &str)) + g_assert_cmpstr (str, ==, test_strs[i++]); + g_assert (i == 3); + + g_variant_iter_free (array); + + /* start over */ + g_variant_iter_init (&tuple, value); + g_variant_iter_next (&tuple, "ao", &array); + + i = 0; + while (g_variant_iter_loop (array, "&o", &str)) + g_assert_cmpstr (str, ==, test_strs[i++]); + g_assert (i == 3); + + g_variant_iter_free (array); + + g_variant_iter_next (&tuple, "^a&o", &strv); + g_variant_iter_next (&tuple, "^ao", &my_strv); + + g_assert_cmpstr (strv[0], ==, "/hello"); + g_assert_cmpstr (strv[1], ==, "/world"); + g_assert (strv[2] == NULL); + g_assert_cmpstr (my_strv[0], ==, "/hello"); + g_assert_cmpstr (my_strv[1], ==, "/world"); + g_assert (my_strv[2] == NULL); + + g_variant_unref (value); + g_strfreev (my_strv); + g_free (strv); + } + + { + const gchar *strvector[] = { "i", "ii", "iii", "iv", "v", "vi", NULL }; + GVariantBuilder builder; + GVariantIter iter; + GVariantIter *i2; + GVariantIter *i3; + GVariant *value; + GVariant *sub; + gchar **strv; + gint i; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aag")); + g_variant_builder_open (&builder, G_VARIANT_TYPE ("ag")); + for (i = 0; i < 6; i++) + if (i & 1) + g_variant_builder_add (&builder, "g", strvector[i]); + else + g_variant_builder_add (&builder, "&g", strvector[i]); + g_variant_builder_close (&builder); + g_variant_builder_add (&builder, "^ag", strvector); + g_variant_builder_add (&builder, "^ag", strvector); + value = g_variant_new ("aag", &builder); + + g_variant_iter_init (&iter, value); + while (g_variant_iter_loop (&iter, "^ag", &strv)) + for (i = 0; i < 6; i++) + g_assert_cmpstr (strv[i], ==, strvector[i]); + + g_variant_iter_init (&iter, value); + while (g_variant_iter_loop (&iter, "^a&g", &strv)) + for (i = 0; i < 6; i++) + g_assert_cmpstr (strv[i], ==, strvector[i]); + + g_variant_iter_init (&iter, value); + while (g_variant_iter_loop (&iter, "ag", &i2)) + { + gchar *str; + + i = 0; + while (g_variant_iter_loop (i2, "g", &str)) + g_assert_cmpstr (str, ==, strvector[i++]); + g_assert (i == 6); + } + + g_variant_iter_init (&iter, value); + i3 = g_variant_iter_copy (&iter); + while (g_variant_iter_loop (&iter, "@ag", &sub)) + { + gchar *str = g_variant_print (sub, TRUE); + g_assert_cmpstr (str, ==, + "[signature 'i', 'ii', 'iii', 'iv', 'v', 'vi']"); + g_free (str); + } + + if (do_failed_test ("*NULL has already been returned*")) + { + g_variant_iter_next_value (&iter); + abort (); + } + + + while (g_variant_iter_loop (i3, "*", &sub)) + { + gchar *str = g_variant_print (sub, TRUE); + g_assert_cmpstr (str, ==, + "[signature 'i', 'ii', 'iii', 'iv', 'v', 'vi']"); + g_free (str); + } + + g_variant_iter_free (i3); + + for (i = 0; i < g_variant_n_children (value); i++) + { + gint j; + + g_variant_get_child (value, i, "*", &sub); + + for (j = 0; j < g_variant_n_children (sub); j++) + { + const gchar *str = NULL; + GVariant *cval; + + g_variant_get_child (sub, j, "&g", &str); + g_assert_cmpstr (str, ==, strvector[j]); + + cval = g_variant_get_child_value (sub, j); + g_variant_get (cval, "&g", &str); + g_assert_cmpstr (str, ==, strvector[j]); + g_variant_unref (cval); + } + + g_variant_unref (sub); + } + + g_variant_unref (value); + } + + { + gboolean justs[10]; + GVariant *value; + + GVariant *vval; + guchar byteval; + gboolean bval; + gint16 i16val; + guint16 u16val; + gint32 i32val; + guint32 u32val; + gint64 i64val; + guint64 u64val; + gdouble dval; + gint32 hval; + + /* test all 'nothing' */ + value = g_variant_new ("(mymbmnmqmimumxmtmhmdmv)", + FALSE, 'a', + FALSE, TRUE, + FALSE, (gint16) 123, + FALSE, (guint16) 123, + FALSE, (gint32) 123, + FALSE, (guint32) 123, + FALSE, (gint64) 123, + FALSE, (guint64) 123, + FALSE, (gint32) -1, + FALSE, (gdouble) 37.5, + NULL); + + /* both NULL */ + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL); + + /* NULL values */ + memset (justs, 1, sizeof justs); + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + &justs[0], NULL, + &justs[1], NULL, + &justs[2], NULL, + &justs[3], NULL, + &justs[4], NULL, + &justs[5], NULL, + &justs[6], NULL, + &justs[7], NULL, + &justs[8], NULL, + &justs[9], NULL, + NULL); + g_assert (!(justs[0] || justs[1] || justs[2] || justs[3] || justs[4] || + justs[5] || justs[6] || justs[7] || justs[8] || justs[9])); + + /* both non-NULL */ + memset (justs, 1, sizeof justs); + byteval = i16val = u16val = i32val = u32val = i64val = u64val = hval = 88; + vval = (void *) 1; + bval = TRUE; + dval = 88.88; + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + &justs[0], &byteval, + &justs[1], &bval, + &justs[2], &i16val, + &justs[3], &u16val, + &justs[4], &i32val, + &justs[5], &u32val, + &justs[6], &i64val, + &justs[7], &u64val, + &justs[8], &hval, + &justs[9], &dval, + &vval); + g_assert (!(justs[0] || justs[1] || justs[2] || justs[3] || justs[4] || + justs[5] || justs[6] || justs[7] || justs[8] || justs[9])); + g_assert (byteval == '\0' && bval == FALSE); + g_assert (i16val == 0 && u16val == 0 && i32val == 0 && + u32val == 0 && i64val == 0 && u64val == 0 && + hval == 0 && dval == 0.0); + g_assert (vval == NULL); + + /* NULL justs */ + byteval = i16val = u16val = i32val = u32val = i64val = u64val = hval = 88; + vval = (void *) 1; + bval = TRUE; + dval = 88.88; + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + NULL, &byteval, + NULL, &bval, + NULL, &i16val, + NULL, &u16val, + NULL, &i32val, + NULL, &u32val, + NULL, &i64val, + NULL, &u64val, + NULL, &hval, + NULL, &dval, + &vval); + g_assert (byteval == '\0' && bval == FALSE); + g_assert (i16val == 0 && u16val == 0 && i32val == 0 && + u32val == 0 && i64val == 0 && u64val == 0 && + hval == 0 && dval == 0.0); + g_assert (vval == NULL); + + g_variant_unref (value); + + + /* test all 'just' */ + value = g_variant_new ("(mymbmnmqmimumxmtmhmdmv)", + TRUE, 'a', + TRUE, TRUE, + TRUE, (gint16) 123, + TRUE, (guint16) 123, + TRUE, (gint32) 123, + TRUE, (guint32) 123, + TRUE, (gint64) 123, + TRUE, (guint64) 123, + TRUE, (gint32) -1, + TRUE, (gdouble) 37.5, + g_variant_new ("()")); + + /* both NULL */ + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL, NULL, + NULL); + + /* NULL values */ + memset (justs, 0, sizeof justs); + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + &justs[0], NULL, + &justs[1], NULL, + &justs[2], NULL, + &justs[3], NULL, + &justs[4], NULL, + &justs[5], NULL, + &justs[6], NULL, + &justs[7], NULL, + &justs[8], NULL, + &justs[9], NULL, + NULL); + g_assert (justs[0] && justs[1] && justs[2] && justs[3] && justs[4] && + justs[5] && justs[6] && justs[7] && justs[8] && justs[9]); + + /* both non-NULL */ + memset (justs, 0, sizeof justs); + byteval = i16val = u16val = i32val = u32val = i64val = u64val = hval = 88; + vval = (void *) 1; + bval = FALSE; + dval = 88.88; + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + &justs[0], &byteval, + &justs[1], &bval, + &justs[2], &i16val, + &justs[3], &u16val, + &justs[4], &i32val, + &justs[5], &u32val, + &justs[6], &i64val, + &justs[7], &u64val, + &justs[8], &hval, + &justs[9], &dval, + &vval); + g_assert (justs[0] && justs[1] && justs[2] && justs[3] && justs[4] && + justs[5] && justs[6] && justs[7] && justs[8] && justs[9]); + g_assert (byteval == 'a' && bval == TRUE); + g_assert (i16val == 123 && u16val == 123 && i32val == 123 && + u32val == 123 && i64val == 123 && u64val == 123 && + hval == -1 && dval == 37.5); + g_assert (g_variant_is_of_type (vval, G_VARIANT_TYPE_UNIT)); + g_variant_unref (vval); + + /* NULL justs */ + byteval = i16val = u16val = i32val = u32val = i64val = u64val = hval = 88; + vval = (void *) 1; + bval = TRUE; + dval = 88.88; + g_variant_get (value, "(mymbmnmqmimumxmtmhmdmv)", + NULL, &byteval, + NULL, &bval, + NULL, &i16val, + NULL, &u16val, + NULL, &i32val, + NULL, &u32val, + NULL, &i64val, + NULL, &u64val, + NULL, &hval, + NULL, &dval, + &vval); + g_assert (byteval == 'a' && bval == TRUE); + g_assert (i16val == 123 && u16val == 123 && i32val == 123 && + u32val == 123 && i64val == 123 && u64val == 123 && + hval == -1 && dval == 37.5); + g_assert (g_variant_is_of_type (vval, G_VARIANT_TYPE_UNIT)); + g_variant_unref (vval); + + g_variant_unref (value); + } + + g_variant_type_info_assert_no_infos (); +} + +static void +hash_get (GVariant *value, + const gchar *format, + ...) +{ + const gchar *endptr = NULL; + gboolean hash; + va_list ap; + + hash = g_str_has_suffix (format, "#"); + + va_start (ap, format); + g_variant_get_va (value, format, hash ? &endptr : NULL, &ap); + va_end (ap); + + if (hash) + g_assert (*endptr == '#'); +} + +static GVariant * +hash_new (const gchar *format, + ...) +{ + const gchar *endptr = NULL; + GVariant *value; + gboolean hash; + va_list ap; + + hash = g_str_has_suffix (format, "#"); + + va_start (ap, format); + value = g_variant_new_va (format, hash ? &endptr : NULL, &ap); + va_end (ap); + + if (hash) + g_assert (*endptr == '#'); + + return value; +} + +static void +test_valist (void) +{ + GVariant *value; + gint32 x; + + x = 0; + value = hash_new ("i", 234); + hash_get (value, "i", &x); + g_assert (x == 234); + g_variant_unref (value); + + x = 0; + value = hash_new ("i#", 234); + hash_get (value, "i#", &x); + g_assert (x == 234); + g_variant_unref (value); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_builder_memory (void) +{ + GVariantBuilder *hb; + GVariantBuilder sb; + + hb = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + g_variant_builder_open (hb, G_VARIANT_TYPE_ARRAY); + g_variant_builder_open (hb, G_VARIANT_TYPE_ARRAY); + g_variant_builder_open (hb, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add (hb, "s", "some value"); + g_variant_builder_ref (hb); + g_variant_builder_unref (hb); + g_variant_builder_unref (hb); + + hb = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + g_variant_builder_unref (hb); + + hb = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + g_variant_builder_clear (hb); + g_variant_builder_unref (hb); + + g_variant_builder_init (&sb, G_VARIANT_TYPE_ARRAY); + g_variant_builder_open (&sb, G_VARIANT_TYPE_ARRAY); + g_variant_builder_open (&sb, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add (&sb, "s", "some value"); + g_variant_builder_clear (&sb); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_hashing (void) +{ + GVariant *items[4096]; + GHashTable *table; + gint i; + + table = g_hash_table_new_full (g_variant_hash, g_variant_equal, + (GDestroyNotify ) g_variant_unref, + NULL); + + for (i = 0; i < G_N_ELEMENTS (items); i++) + { + TreeInstance *tree; + gint j; + + again: + tree = tree_instance_new (NULL, 0); + items[i] = tree_instance_get_gvariant (tree); + tree_instance_free (tree); + + for (j = 0; j < i; j++) + if (g_variant_equal (items[i], items[j])) + { + g_variant_unref (items[i]); + goto again; + } + + g_hash_table_insert (table, + g_variant_ref_sink (items[i]), + GINT_TO_POINTER (i)); + } + + for (i = 0; i < G_N_ELEMENTS (items); i++) + { + gpointer result; + + result = g_hash_table_lookup (table, items[i]); + g_assert_cmpint (GPOINTER_TO_INT (result), ==, i); + } + + g_hash_table_unref (table); + + g_variant_type_info_assert_no_infos (); +} + +static void +test_gv_byteswap () +{ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +# define native16(x) x, 0 +# define swapped16(x) 0, x +#else +# define native16(x) 0, x +# define swapped16(x) x, 0 +#endif + /* all kinds of of crazy randomised testing already performed on the + * byteswapper in the /gvariant/serialiser/byteswap test and all kinds + * of crazy randomised testing performed against the serialiser + * normalisation functions in the /gvariant/serialiser/fuzz/ tests. + * + * just test a few simple cases here to make sure they each work + */ + guchar valid_data[] = { 'a', '\0', swapped16(66), 2, + 0, + 'b', '\0', swapped16(77), 2, + 5, 11 }; + guchar corrupt_data[] = { 'a', '\0', swapped16(66), 2, + 0, + 'b', '\0', swapped16(77), 2, + 6, 11 }; + GVariant *value, *swapped; + gchar *string, *string2; + + + /* trusted */ + value = g_variant_new_from_data (G_VARIANT_TYPE ("a(sn)"), + valid_data, sizeof valid_data, TRUE, + NULL, NULL); + swapped = g_variant_byteswap (value); + g_variant_unref (value); + g_assert (g_variant_get_size (swapped) == 13); + string = g_variant_print (swapped, FALSE); + g_variant_unref (swapped); + g_assert_cmpstr (string, ==, "[('a', 66), ('b', 77)]"); + g_free (string); + + /* untrusted but valid */ + value = g_variant_new_from_data (G_VARIANT_TYPE ("a(sn)"), + valid_data, sizeof valid_data, FALSE, + NULL, NULL); + swapped = g_variant_byteswap (value); + g_variant_unref (value); + g_assert (g_variant_get_size (swapped) == 13); + string = g_variant_print (swapped, FALSE); + g_variant_unref (swapped); + g_assert_cmpstr (string, ==, "[('a', 66), ('b', 77)]"); + g_free (string); + + /* untrusted, invalid */ + value = g_variant_new_from_data (G_VARIANT_TYPE ("a(sn)"), + corrupt_data, sizeof corrupt_data, FALSE, + NULL, NULL); + string = g_variant_print (value, FALSE); + swapped = g_variant_byteswap (value); + g_variant_unref (value); + g_assert (g_variant_get_size (swapped) == 13); + value = g_variant_byteswap (swapped); + g_variant_unref (swapped); + string2 = g_variant_print (value, FALSE); + g_assert (g_variant_get_size (value) == 13); + g_variant_unref (value); + g_assert_cmpstr (string, ==, string2); + g_free (string2); + g_free (string); +} + +static void +test_parser (void) +{ + TreeInstance *tree; + GVariant *parsed; + GVariant *value; + gchar *pt, *p; + gchar *res; + + tree = tree_instance_new (NULL, 3); + value = tree_instance_get_gvariant (tree); + tree_instance_free (tree); + + pt = g_variant_print (value, TRUE); + p = g_variant_print (value, FALSE); + + parsed = g_variant_parse (NULL, pt, NULL, NULL, NULL); + res = g_variant_print (parsed, FALSE); + g_assert_cmpstr (p, ==, res); + g_variant_unref (parsed); + g_free (res); + + parsed = g_variant_parse (g_variant_get_type (value), p, + NULL, NULL, NULL); + res = g_variant_print (parsed, TRUE); + g_assert_cmpstr (pt, ==, res); + g_variant_unref (parsed); + g_free (res); + + g_variant_unref (value); + g_free (pt); + g_free (p); +} + +static void +test_parses (void) +{ + gint i; + + for (i = 0; i < 100; i++) + { + test_parser (); + } + + /* mini test */ + { + gchar str[256]; + GVariant *val; + gchar *p, *p2; + + for (i = 0; i < 256; i++) + str[i] = i + 1; + + val = g_variant_new_string (str); + p = g_variant_print (val, FALSE); + g_variant_unref (val); + + val = g_variant_parse (NULL, p, NULL, NULL, NULL); + p2 = g_variant_print (val, FALSE); + + g_assert_cmpstr (str, ==, g_variant_get_string (val, NULL)); + g_assert_cmpstr (p, ==, p2); + + g_variant_unref (val); + g_free (p2); + g_free (p); + } + + /* another mini test */ + { + const gchar *end; + GVariant *value; + + value = g_variant_parse (G_VARIANT_TYPE_INT32, "1 2 3", NULL, &end, NULL); + g_assert_cmpint (g_variant_get_int32 (value), ==, 1); + /* make sure endptr returning works */ + g_assert_cmpstr (end, ==, " 2 3"); + g_variant_unref (value); + } + + g_variant_type_info_assert_no_infos (); +} + +static void +test_parse_failures (void) +{ + const gchar *test[] = { + "[1, 2,", "6:", "expected value", + "", "0:", "expected value", + "(1, 2,", "6:", "expected value", + "<1", "2:", "expected `>'", + "[]", "0-2:", "unable to infer", + "(,", "1:", "expected value", + "[4,'']", "1-2,3-5:", "common type", + "[4, '', 5]", "1-2,4-6:", "common type", + "['', 4, 5]", "1-3,5-6:", "common type", + "[4, 5, '']", "1-2,7-9:", "common type", + "[[4], [], ['']]", "1-4,10-14:", "common type", + "[[], [4], ['']]", "5-8,10-14:", "common type", + "just", "4:", "expected value", + "nothing", "0-7:", "unable to infer", + "just [4, '']", "6-7,9-11:", "common type", + "[[4,'']]", "2-3,4-6:", "common type", + "([4,''],)", "2-3,4-6:", "common type", + "(4)", "2:", "`,'", + "{}", "0-2:", "unable to infer", + "{[1,2],[3,4]}", "0-13:", "basic types", + "{[1,2]:[3,4]}", "0-13:", "basic types", + "justt", "0-5:", "unknown keyword", + "nothng", "0-6:", "unknown keyword", + "uint33", "0-6:", "unknown keyword", + "@mi just ''", "9-11:", "can not parse as", + "@ai ['']", "5-7:", "can not parse as", + "@(i) ('',)", "6-8:", "can not parse as", + "[[], 5]", "1-3,5-6:", "common type", + "[[5], 5]", "1-4,6-7:", "common type", + "5 5", "2:", "expected end of input", + "[5, [5, '']]", "5-6,8-10:", "common type", + "@i just 5", "3-9:", "can not parse as", + "@i nothing", "3-10:", "can not parse as", + "@i []", "3-5:", "can not parse as", + "@i ()", "3-5:", "can not parse as", + "@ai (4,)", "4-8:", "can not parse as", + "@(i) []", "5-7:", "can not parse as", + "(5 5)", "3:", "expected `,'", + "[5 5]", "3:", "expected `,' or `]'", + "(5, 5 5)", "6:", "expected `,' or `)'", + "[5, 5 5]", "6:", "expected `,' or `]'", + "<@i []>", "4-6:", "can not parse as", + "<[5 5]>", "4:", "expected `,' or `]'", + "{[4,''],5}", "2-3,4-6:", "common type", + "{5,[4,'']}", "4-5,6-8:", "common type", + "@i {1,2}", "3-8:", "can not parse as", + "{@i '', 5}", "4-6:", "can not parse as", + "{5, @i ''}", "7-9:", "can not parse as", + "@ai {}", "4-6:", "can not parse as", + "{@i '': 5}", "4-6:", "can not parse as", + "{5: @i ''}", "7-9:", "can not parse as", + "{<4,5}", "3:", "expected `>'", + "{4,<5}", "5:", "expected `>'", + "{4,5,6}", "4:", "expected `}'", + "{5 5}", "3:", "expected `:' or `,'", + "{4: 5: 6}", "5:", "expected `,' or `}'", + "{4:5,<6:7}", "7:", "expected `>'", + "{4:5,6:<7}", "9:", "expected `>'", + "{4:5,6 7}", "7:", "expected `:'", + "@o 'foo'", "3-8:", "object path", + "@g 'zzz'", "3-8:", "signature", + "@i true", "3-7:", "can not parse as", + "@z 4", "0-2:", "invalid type", + "@a* []", "0-3:", "definite", + "@ai [3 3]", "7:", "expected `,' or `]'", + "18446744073709551616", "0-20:", "too big for any type", + "-18446744073709551616", "0-21:", "too big for any type", + "byte 256", "5-8:", "out of range for type", + "byte -1", "5-7:", "out of range for type", + "int16 32768", "6-11:", "out of range for type", + "int16 -32769", "6-12:", "out of range for type", + "uint16 -1", "7-9:", "out of range for type", + "uint16 65536", "7-12:", "out of range for type", + "2147483648", "0-10:", "out of range for type", + "-2147483649", "0-11:", "out of range for type", + "uint32 -1", "7-9:", "out of range for type", + "uint32 4294967296", "7-17:", "out of range for type", + "@x 9223372036854775808", "3-22:", "out of range for type", + "@x -9223372036854775809", "3-23:", "out of range for type", + "@t -1", "3-5:", "out of range for type", + "@t 18446744073709551616", "3-23:", "too big for any type", + "handle 2147483648", "7-17:", "out of range for type", + "handle -2147483649", "7-18:", "out of range for type", + "1.798e308", "0-9:", "too big for any type", + "37.5a488", "4-5:", "invalid character", + "0x7ffgf", "5-6:", "invalid character", + "07758", "4-5:", "invalid character", + "123a5", "3-4:", "invalid character", + "@ai 123", "4-7:", "can not parse as", + "'\"\\'", "0-4:", "unterminated string", + "'\"\\'\\", "0-5:", "unterminated string", + "boolean 4", "8-9:", "can not parse as", + "int32 true", "6-10:", "can not parse as", + "[double 5, int32 5]", "1-9,11-18:", "common type", + "string 4", "7-8:", "can not parse as" + }; + gint i; + + for (i = 0; i < G_N_ELEMENTS (test); i += 3) + { + GError *error = NULL; + GVariant *value; + + value = g_variant_parse (NULL, test[i], NULL, NULL, &error); + g_assert (value == NULL); + + if (!strstr (error->message, test[i+2])) + g_error ("test %d: Can't find `%s' in `%s'", i / 3, + test[i+2], error->message); + + if (!g_str_has_prefix (error->message, test[i+1])) + g_error ("test %d: Expected location `%s' in `%s'", i / 3, + test[i+1], error->message); + + g_error_free (error); + } +} + +static void +test_parse_positional (void) +{ + GVariant *value; + check_and_free (g_variant_new_parsed ("[('one', 1), (%s, 2)," + " ('three', %i)]", "two", 3), + "[('one', 1), ('two', 2), ('three', 3)]"); + value = g_variant_new_parsed ("[('one', 1), (%s, 2)," + " ('three', %u)]", "two", 3); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE ("a(su)"))); + check_and_free (value, "[('one', 1), ('two', 2), ('three', 3)]"); + check_and_free (g_variant_new_parsed ("{%s:%i}", "one", 1), "{'one': 1}"); + + if (do_failed_test ("*GVariant format string*")) + { + g_variant_new_parsed ("%z"); + abort (); + } + + if (do_failed_test ("*can not parse as*")) + { + g_variant_new_parsed ("uint32 %i", 2); + abort (); + } + + if (do_failed_test ("*expected GVariant of type `i'*")) + { + g_variant_new_parsed ("%@i", g_variant_new_uint32 (2)); + abort (); + } +} + +int +main (int argc, char **argv) +{ + gint i; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gvariant/type", test_gvarianttype); + g_test_add_func ("/gvariant/typeinfo", test_gvarianttypeinfo); + g_test_add_func ("/gvariant/serialiser/maybe", test_maybes); + g_test_add_func ("/gvariant/serialiser/array", test_arrays); + g_test_add_func ("/gvariant/serialiser/tuple", test_tuples); + g_test_add_func ("/gvariant/serialiser/variant", test_variants); + g_test_add_func ("/gvariant/serialiser/strings", test_strings); + g_test_add_func ("/gvariant/serialiser/byteswap", test_byteswaps); + + for (i = 1; i <= 20; i += 4) + { + char *testname; + + testname = g_strdup_printf ("/gvariant/serialiser/fuzz/%d%%", i); + g_test_add_data_func (testname, GINT_TO_POINTER (i), + (gpointer) test_fuzzes); + g_free (testname); + } + + g_test_add_func ("/gvariant/containers", test_containers); + g_test_add_func ("/gvariant/format-strings", test_format_strings); + g_test_add_func ("/gvariant/invalid-varargs", test_invalid_varargs); + g_test_add_func ("/gvariant/varargs", test_varargs); + g_test_add_func ("/gvariant/valist", test_valist); + g_test_add_func ("/gvariant/builder-memory", test_builder_memory); + g_test_add_func ("/gvariant/hashing", test_hashing); + g_test_add_func ("/gvariant/byteswap", test_gv_byteswap); + g_test_add_func ("/gvariant/parser", test_parses); + g_test_add_func ("/gvariant/parse-failures", test_parse_failures); + g_test_add_func ("/gvariant/parse-positional", test_parse_positional); + + return g_test_run (); +} diff --git a/glib/tests/hostutils.c b/glib/tests/hostutils.c new file mode 100644 index 0000000..622a0ce --- /dev/null +++ b/glib/tests/hostutils.c @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2008 Red Hat, Inc + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include + +static const struct { + const gchar *ascii_name, *unicode_name; +} idn_test_domains[] = { + /* "example.test" in various languages */ + { "xn--mgbh0fb.xn--kgbechtv", "\xd9\x85\xd8\xab\xd8\xa7\xd9\x84.\xd8\xa5\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1" }, + { "xn--fsqu00a.xn--0zwm56d", "\xe4\xbe\x8b\xe5\xad\x90.\xe6\xb5\x8b\xe8\xaf\x95" }, + { "xn--fsqu00a.xn--g6w251d", "\xe4\xbe\x8b\xe5\xad\x90.\xe6\xb8\xac\xe8\xa9\xa6" }, + { "xn--hxajbheg2az3al.xn--jxalpdlp", "\xcf\x80\xce\xb1\xcf\x81\xce\xac\xce\xb4\xce\xb5\xce\xb9\xce\xb3\xce\xbc\xce\xb1.\xce\xb4\xce\xbf\xce\xba\xce\xb9\xce\xbc\xce\xae" }, + { "xn--p1b6ci4b4b3a.xn--11b5bs3a9aj6g", "\xe0\xa4\x89\xe0\xa4\xa6\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa4\xb0\xe0\xa4\xa3.\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe" }, + { "xn--r8jz45g.xn--zckzah", "\xe4\xbe\x8b\xe3\x81\x88.\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88" }, + { "xn--9n2bp8q.xn--9t4b11yi5a", "\xec\x8b\xa4\xeb\xa1\x80.\xed\x85\x8c\xec\x8a\xa4\xed\x8a\xb8" }, + { "xn--mgbh0fb.xn--hgbk6aj7f53bba", "\xd9\x85\xd8\xab\xd8\xa7\xd9\x84.\xd8\xa2\xd8\xb2\xd9\x85\xd8\xa7\xdb\x8c\xd8\xb4\xdb\x8c" }, + { "xn--e1afmkfd.xn--80akhbyknj4f", "\xd0\xbf\xd1\x80\xd0\xb8\xd0\xbc\xd0\xb5\xd1\x80.\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5" }, + { "xn--zkc6cc5bi7f6e.xn--hlcj6aya9esc7a", "\xe0\xae\x89\xe0\xae\xa4\xe0\xae\xbe\xe0\xae\xb0\xe0\xae\xa3\xe0\xae\xae\xe0\xaf\x8d.\xe0\xae\xaa\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\x9f\xe0\xaf\x8d\xe0\xae\x9a\xe0\xaf\x88" }, + { "xn--fdbk5d8ap9b8a8d.xn--deba0ad", "\xd7\x91\xd7\xb2\xd6\xb7\xd7\xa9\xd7\xa4\xd6\xbc\xd7\x99\xd7\x9c.\xd7\x98\xd7\xa2\xd7\xa1\xd7\x98" }, + + /* further examples without their own IDN-ized TLD */ + { "xn--1xd0bwwra.idn.icann.org", "\xe1\x8a\xa0\xe1\x88\x9b\xe1\x88\xad\xe1\x8a\x9b.idn.icann.org" }, + { "xn--54b7fta0cc.idn.icann.org", "\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe.idn.icann.org" }, + { "xn--5dbqzzl.idn.icann.org", "\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa.idn.icann.org" }, + { "xn--j2e7beiw1lb2hqg.idn.icann.org", "\xe1\x9e\x97\xe1\x9e\xb6\xe1\x9e\x9f\xe1\x9e\xb6\xe1\x9e\x81\xe1\x9f\x92\xe1\x9e\x98\xe1\x9f\x82\xe1\x9e\x9a.idn.icann.org" }, + { "xn--o3cw4h.idn.icann.org", "\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2.idn.icann.org" }, + { "xn--mgbqf7g.idn.icann.org", "\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88.idn.icann.org" } +}; +static const gint num_idn_test_domains = G_N_ELEMENTS (idn_test_domains); + +static const gchar *bad_names[] = { + "disallowed\xef\xbf\xbd" "character", + "non-utf\x88", + "xn--mixed-\xc3\xbcp" +}; +static const gint num_bad_names = G_N_ELEMENTS (bad_names); + +static void +test_to_ascii (void) +{ + gint i; + gchar *ascii; + + for (i = 0; i < num_idn_test_domains; i++) + { + g_assert (g_hostname_is_non_ascii (idn_test_domains[i].unicode_name)); + ascii = g_hostname_to_ascii (idn_test_domains[i].unicode_name); + g_assert_cmpstr (idn_test_domains[i].ascii_name, ==, ascii); + g_free (ascii); + + ascii = g_hostname_to_ascii (idn_test_domains[i].ascii_name); + g_assert_cmpstr (idn_test_domains[i].ascii_name, ==, ascii); + g_free (ascii); + } + + for (i = 0; i < num_bad_names; i++) + { + ascii = g_hostname_to_ascii (bad_names[i]); + g_assert_cmpstr (ascii, ==, NULL); + } +} + +static void +test_to_unicode (void) +{ + gint i; + gchar *unicode; + + for (i = 0; i < num_idn_test_domains; i++) + { + g_assert (g_hostname_is_ascii_encoded (idn_test_domains[i].ascii_name)); + unicode = g_hostname_to_unicode (idn_test_domains[i].ascii_name); + g_assert_cmpstr (idn_test_domains[i].unicode_name, ==, unicode); + g_free (unicode); + + unicode = g_hostname_to_unicode (idn_test_domains[i].unicode_name); + g_assert_cmpstr (idn_test_domains[i].unicode_name, ==, unicode); + g_free (unicode); + } + + for (i = 0; i < num_bad_names; i++) + { + unicode = g_hostname_to_unicode (bad_names[i]); + g_assert_cmpstr (unicode, ==, NULL); + } +} + +static const struct { + const gchar *addr; + gboolean is_addr; +} ip_addr_tests[] = { + /* IPv6 tests */ + + { "0123:4567:89AB:cdef:3210:7654:ba98:FeDc", TRUE }, + + { "0123:4567:89AB:cdef:3210:7654:ba98::", TRUE }, + { "0123:4567:89AB:cdef:3210:7654::", TRUE }, + { "0123:4567:89AB:cdef:3210::", TRUE }, + { "0123:4567:89AB:cdef::", TRUE }, + { "0123:4567:89AB::", TRUE }, + { "0123:4567::", TRUE }, + { "0123::", TRUE }, + + { "::4567:89AB:cdef:3210:7654:ba98:FeDc", TRUE }, + { "::89AB:cdef:3210:7654:ba98:FeDc", TRUE }, + { "::cdef:3210:7654:ba98:FeDc", TRUE }, + { "::3210:7654:ba98:FeDc", TRUE }, + { "::7654:ba98:FeDc", TRUE }, + { "::ba98:FeDc", TRUE }, + { "::FeDc", TRUE }, + + { "0123::89AB:cdef:3210:7654:ba98:FeDc", TRUE }, + { "0123:4567::cdef:3210:7654:ba98:FeDc", TRUE }, + { "0123:4567:89AB::3210:7654:ba98:FeDc", TRUE }, + { "0123:4567:89AB:cdef::7654:ba98:FeDc", TRUE }, + { "0123:4567:89AB:cdef:3210::ba98:FeDc", TRUE }, + { "0123:4567:89AB:cdef:3210:7654::FeDc", TRUE }, + + { "0123::cdef:3210:7654:ba98:FeDc", TRUE }, + { "0123:4567::3210:7654:ba98:FeDc", TRUE }, + { "0123:4567:89AB::7654:ba98:FeDc", TRUE }, + { "0123:4567:89AB:cdef::ba98:FeDc", TRUE }, + { "0123:4567:89AB:cdef:3210::FeDc", TRUE }, + + { "0123::3210:7654:ba98:FeDc", TRUE }, + { "0123:4567::7654:ba98:FeDc", TRUE }, + { "0123:4567:89AB::ba98:FeDc", TRUE }, + { "0123:4567:89AB:cdef::FeDc", TRUE }, + + { "0123::7654:ba98:FeDc", TRUE }, + { "0123:4567::ba98:FeDc", TRUE }, + { "0123:4567:89AB::FeDc", TRUE }, + + { "0123::ba98:FeDc", TRUE }, + { "0123:4567::FeDc", TRUE }, + + { "0123::FeDc", TRUE }, + + { "::", TRUE }, + + { "0:12:345:6789:a:bc:def::", TRUE }, + + { "0123:4567:89AB:cdef:3210:7654:123.45.67.89", TRUE }, + { "0123:4567:89AB:cdef:3210::123.45.67.89", TRUE }, + { "0123:4567:89AB:cdef::123.45.67.89", TRUE }, + { "0123:4567:89AB::123.45.67.89", TRUE }, + { "0123:4567::123.45.67.89", TRUE }, + { "0123::123.45.67.89", TRUE }, + { "::123.45.67.89", TRUE }, + + /* Contain non-hex chars */ + { "012x:4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:45x7:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:8xAB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:xdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:321;:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:76*4:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:b-98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:ba98:+eDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:ba98:FeDc and some trailing junk", FALSE }, + { " 123:4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "012 :4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123: 567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:ba98:FeD ", FALSE }, + + /* Contains too-long/out-of-range segments */ + { "00123:4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:04567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:189AB:cdef:3210:7654:ba98:FeDc", FALSE }, + + /* Too short */ + { "0123:4567:89AB:cdef:3210:7654:ba98", FALSE }, + { "0123:4567:89AB:cdef:3210:7654", FALSE }, + { "0123:4567:89AB:cdef:3210", FALSE }, + { "0123", FALSE }, + { "", FALSE }, + + /* Too long */ + { "0123:4567:89AB:cdef:3210:7654:ba98:FeDc:9999", FALSE }, + { "0123::4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567::89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB::cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef::3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210::7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654::ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:ba98::FeDc", FALSE }, + + /* Invalid use of ":"s */ + { "0123::89AB::3210:7654:ba98:FeDc", FALSE }, + { "::4567:89AB:cdef:3210:7654::FeDc", FALSE }, + { "0123::89AB:cdef:3210:7654:ba98::", FALSE }, + { ":4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:ba98:", FALSE }, + { "0123:::cdef:3210:7654:ba98:FeDc", FALSE }, + { "0123:4567:89AB:cdef:3210:7654:ba98:FeDc:", FALSE }, + { ":0123:4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, + { ":::", FALSE }, + + /* IPv4 address at wrong place */ + { "0123:4567:89AB:cdef:3210:123.45.67.89", FALSE }, + { "0123:4567:89AB:cdef:3210:7654::123.45.67.89", FALSE }, + { "0123:4567:89AB:cdef:123.45.67.89", FALSE }, + { "0123:4567:89AB:cdef:3210:123.45.67.89:FeDc", FALSE }, + + + /* IPv4 tests */ + + { "123.45.67.89", TRUE }, + { "1.2.3.4", TRUE }, + { "1.2.3.0", TRUE }, + + { "023.045.067.089", FALSE }, + { "1234.5.67.89", FALSE }, + { "123.45.67.00", FALSE }, + { " 1.2.3.4", FALSE }, + { "1 .2.3.4", FALSE }, + { "1. 2.3.4", FALSE }, + { "1.2.3.4 ", FALSE }, + { "1.2.3", FALSE }, + { "1.2.3.4.5", FALSE }, + { "1.b.3.4", FALSE }, + { "1.2.3:4", FALSE }, + { "1.2.3.4, etc", FALSE }, + { "1,2,3,4", FALSE }, + { "1.2.3.com", FALSE }, + { "1.2.3.4.", FALSE }, + { "1.2.3.", FALSE }, + { ".1.2.3.4", FALSE }, + { ".2.3.4", FALSE }, + { "1..2.3.4", FALSE }, + { "1..3.4", FALSE } +}; +static const gint num_ip_addr_tests = G_N_ELEMENTS (ip_addr_tests); + +static void +test_is_ip_addr (void) +{ + gint i; + + for (i = 0; i < num_ip_addr_tests; i++) + { + if (g_hostname_is_ip_address (ip_addr_tests[i].addr) != ip_addr_tests[i].is_addr) + { + char *msg = g_strdup_printf ("g_hostname_is_ip_address (\"%s\") == %s", + ip_addr_tests[i].addr, + ip_addr_tests[i].is_addr ? "TRUE" : "FALSE"); + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg); + } + } +} + +/* FIXME: test names with both unicode and ACE-encoded labels */ +/* FIXME: test invalid unicode names */ + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/hostutils/to_ascii", test_to_ascii); + g_test_add_func ("/hostutils/to_unicode", test_to_unicode); + g_test_add_func ("/hostutils/is_ip_addr", test_is_ip_addr); + + return g_test_run (); +} diff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c new file mode 100644 index 0000000..dfc7d25 --- /dev/null +++ b/glib/tests/keyfile.c @@ -0,0 +1,1263 @@ +#include +#include +#include +#include + +static GKeyFile * +load_data (const gchar *data, + GKeyFileFlags flags) +{ + GKeyFile *keyfile; + GError *error = NULL; + + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, flags, &error); + g_assert_no_error (error); + return keyfile; +} + +static void +check_error (GError **error, + GQuark domain, + gint code) +{ + g_assert_error (*error, domain, code); + g_error_free (*error); + *error = NULL; +} + +static void +check_no_error (GError **error) +{ + g_assert_no_error (*error); +} + +static void +check_string_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + const gchar *expected) +{ + GError *error = NULL; + gchar *value; + + value = g_key_file_get_string (keyfile, group, key, &error); + check_no_error (&error); + g_assert (value != NULL); + g_assert_cmpstr (value, ==, expected); + g_free (value); +} + +static void +check_locale_string_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + const gchar *locale, + const gchar *expected) +{ + GError *error = NULL; + gchar *value; + + value = g_key_file_get_locale_string (keyfile, group, key, locale, &error); + check_no_error (&error); + g_assert (value != NULL); + g_assert_cmpstr (value, ==, expected); + g_free (value); +} + +static void +check_string_list_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + ...) +{ + gint i; + gchar *v, **value; + va_list args; + gsize len; + GError *error = NULL; + + value = g_key_file_get_string_list (keyfile, group, key, &len, &error); + check_no_error (&error); + g_assert (value != NULL); + + va_start (args, key); + i = 0; + v = va_arg (args, gchar*); + while (v) + { + g_assert (value[i] != NULL); + g_assert_cmpstr (v, ==, value[i]); + i++; + v = va_arg (args, gchar*); + } + + va_end (args); + + g_strfreev (value); +} + +static void +check_locale_string_list_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + const gchar *locale, + ...) +{ + gint i; + gchar *v, **value; + va_list args; + gsize len; + GError *error = NULL; + + value = g_key_file_get_locale_string_list (keyfile, group, key, locale, &len, &error); + check_no_error (&error); + g_assert (value != NULL); + + va_start (args, locale); + i = 0; + v = va_arg (args, gchar*); + while (v) + { + g_assert (value[i] != NULL); + g_assert_cmpstr (v, ==, value[i]); + i++; + v = va_arg (args, gchar*); + } + + va_end (args); + + g_strfreev (value); +} + +static void +check_integer_list_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + ...) +{ + gint i; + gint v, *value; + va_list args; + gsize len; + GError *error = NULL; + + value = g_key_file_get_integer_list (keyfile, group, key, &len, &error); + check_no_error (&error); + g_assert (value != NULL); + + va_start (args, key); + i = 0; + v = va_arg (args, gint); + while (v != -100) + { + g_assert_cmpint (i, <, len); + g_assert_cmpint (value[i], ==, v); + i++; + v = va_arg (args, gint); + } + + va_end (args); + + g_free (value); +} + +static void +check_double_list_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + ...) +{ + gint i; + gdouble v, *value; + va_list args; + gsize len; + GError *error = NULL; + + value = g_key_file_get_double_list (keyfile, group, key, &len, &error); + check_no_error (&error); + g_assert (value != NULL); + + va_start (args, key); + i = 0; + v = va_arg (args, gdouble); + while (v != -100) + { + g_assert_cmpint (i, <, len); + g_assert_cmpfloat (value[i], ==, v); + i++; + v = va_arg (args, gdouble); + } + + va_end (args); + + g_free (value); +} + +static void +check_boolean_list_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + ...) +{ + gint i; + gboolean v, *value; + va_list args; + gsize len; + GError *error = NULL; + + value = g_key_file_get_boolean_list (keyfile, group, key, &len, &error); + check_no_error (&error); + g_assert (value != NULL); + + va_start (args, key); + i = 0; + v = va_arg (args, gboolean); + while (v != -100) + { + g_assert_cmpint (i, <, len); + g_assert_cmpint (value[i], ==, v); + i++; + v = va_arg (args, gboolean); + } + + va_end (args); + + g_free (value); +} + +static void +check_boolean_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + gboolean expected) +{ + GError *error = NULL; + gboolean value; + + value = g_key_file_get_boolean (keyfile, group, key, &error); + check_no_error (&error); + g_assert_cmpint (value, ==, expected); +} + +static void +check_integer_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + gint expected) +{ + GError *error = NULL; + gint value; + + value = g_key_file_get_integer (keyfile, group, key, &error); + check_no_error (&error); + g_assert_cmpint (value, ==, expected); +} + +static void +check_double_value (GKeyFile *keyfile, + const gchar *group, + const gchar *key, + gdouble expected) +{ + GError *error = NULL; + gdouble value; + + value = g_key_file_get_double (keyfile, group, key, &error); + check_no_error (&error); + g_assert_cmpfloat (value, ==, expected); +} + +static void +check_name (const gchar *what, + const gchar *value, + const gchar *expected, + gint position) +{ + g_assert_cmpstr (value, ==, expected); +} + +static void +check_length (const gchar *what, + gint n_items, + gint length, + gint expected) +{ + g_assert_cmpint (n_items, ==, length); + g_assert_cmpint (n_items, ==, expected); +} + + +/* check that both \n and \r\n are accepted as line ends, + * and that stray \r are passed through + */ +static void +test_line_ends (void) +{ + GKeyFile *keyfile; + + const gchar *data = + "[group1]\n" + "key1=value1\n" + "key2=value2\r\n" + "[group2]\r\n" + "key3=value3\r\r\n" + "key4=value4\n"; + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "group1", "key1", "value1"); + check_string_value (keyfile, "group1", "key2", "value2"); + check_string_value (keyfile, "group2", "key3", "value3\r"); + check_string_value (keyfile, "group2", "key4", "value4"); + + g_key_file_free (keyfile); +} + +/* check handling of whitespace + */ +static void +test_whitespace (void) +{ + GKeyFile *keyfile; + + const gchar *data = + "[group1]\n" + "key1 = value1\n" + "key2\t=\tvalue2\n" + " [ group2 ] \n" + "key3 = value3 \n" + "key4 = value \t4\n" + " key5 = value5\n"; + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "group1", "key1", "value1"); + check_string_value (keyfile, "group1", "key2", "value2"); + check_string_value (keyfile, " group2 ", "key3", "value3 "); + check_string_value (keyfile, " group2 ", "key4", "value \t4"); + check_string_value (keyfile, " group2 ", "key5", "value5"); + + g_key_file_free (keyfile); +} + +/* check handling of comments + */ +static void +test_comments (void) +{ + GKeyFile *keyfile; + gchar **names; + gsize len; + GError *error = NULL; + gchar *comment; + + const gchar *data = + "# top comment\n" + "# top comment, continued\n" + "[group1]\n" + "key1 = value1\n" + "# key comment\n" + "# key comment, continued\n" + "key2 = value2\n" + "# line end check\r\n" + "key3 = value3\n" + "key4 = value4\n" + "# group comment\n" + "# group comment, continued\n" + "[group2]\n"; + + const gchar *top_comment= " top comment\n top comment, continued\n"; + const gchar *group_comment= " group comment\n group comment, continued\n"; + const gchar *key_comment= " key comment\n key comment, continued\n"; + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "group1", "key1", "value1"); + check_string_value (keyfile, "group1", "key2", "value2"); + check_string_value (keyfile, "group1", "key3", "value3"); + check_string_value (keyfile, "group1", "key4", "value4"); + + names = g_key_file_get_keys (keyfile, "group1", &len, &error); + check_no_error (&error); + + check_length ("keys", g_strv_length (names), len, 4); + check_name ("key", names[0], "key1", 0); + check_name ("key", names[1], "key2", 1); + check_name ("key", names[2], "key3", 2); + check_name ("key", names[3], "key4", 3); + + g_strfreev (names); + + g_key_file_free (keyfile); + + keyfile = load_data (data, G_KEY_FILE_KEEP_COMMENTS); + + names = g_key_file_get_keys (keyfile, "group1", &len, &error); + check_no_error (&error); + + check_length ("keys", g_strv_length (names), len, 4); + check_name ("key", names[0], "key1", 0); + check_name ("key", names[1], "key2", 1); + check_name ("key", names[2], "key3", 2); + check_name ("key", names[3], "key4", 3); + + g_strfreev (names); + + comment = g_key_file_get_comment (keyfile, NULL, NULL, &error); + check_no_error (&error); + check_name ("top comment", comment, top_comment, 0); + g_free (comment); + + comment = g_key_file_get_comment (keyfile, "group1", "key2", &error); + check_no_error (&error); + check_name ("key comment", comment, key_comment, 0); + g_free (comment); + + comment = g_key_file_get_comment (keyfile, "group2", NULL, &error); + check_no_error (&error); + check_name ("group comment", comment, group_comment, 0); + g_free (comment); + + comment = g_key_file_get_comment (keyfile, "group3", NULL, &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + g_assert (comment == NULL); + + g_key_file_free (keyfile); +} + + +/* check key and group listing */ +static void +test_listing (void) +{ + GKeyFile *keyfile; + gchar **names; + gsize len; + gchar *start; + GError *error = NULL; + + const gchar *data = + "[group1]\n" + "key1=value1\n" + "key2=value2\n" + "[group2]\n" + "key3=value3\n" + "key4=value4\n"; + + keyfile = load_data (data, 0); + + names = g_key_file_get_groups (keyfile, &len); + g_assert (names != NULL); + + check_length ("groups", g_strv_length (names), len, 2); + check_name ("group name", names[0], "group1", 0); + check_name ("group name", names[1], "group2", 1); + + g_strfreev (names); + + names = g_key_file_get_keys (keyfile, "group1", &len, &error); + check_no_error (&error); + + check_length ("keys", g_strv_length (names), len, 2); + check_name ("key", names[0], "key1", 0); + check_name ("key", names[1], "key2", 1); + + g_strfreev (names); + + names = g_key_file_get_keys (keyfile, "no-such-group", &len, &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + + g_strfreev (names); + + g_assert (g_key_file_has_group (keyfile, "group1")); + g_assert (g_key_file_has_group (keyfile, "group2")); + g_assert (!g_key_file_has_group (keyfile, "group10")); + g_assert (!g_key_file_has_group (keyfile, "group20")); + + start = g_key_file_get_start_group (keyfile); + g_assert_cmpstr (start, ==, "group1"); + g_free (start); + + g_assert (g_key_file_has_key (keyfile, "group1", "key1", &error)); + check_no_error (&error); + g_assert (g_key_file_has_key (keyfile, "group2", "key3", &error)); + check_no_error (&error); + g_assert (!g_key_file_has_key (keyfile, "group2", "no-such-key", NULL)); + + g_key_file_has_key (keyfile, "no-such-group", "key", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + + g_key_file_free (keyfile); +} + +/* check parsing of string values */ +static void +test_string (void) +{ + GKeyFile *keyfile; + GError *error = NULL; + gchar *value; + + const gchar *data = + "[valid]\n" + "key1=\\s\\n\\t\\r\\\\\n" + "key2=\"quoted\"\n" + "key3='quoted'\n" + "key4=\xe2\x89\xa0\xe2\x89\xa0\n" + "[invalid]\n" + "key1=\\a\\b\\0800xff\n" + "key2=blabla\\\n"; + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "valid", "key1", " \n\t\r\\"); + check_string_value (keyfile, "valid", "key2", "\"quoted\""); + check_string_value (keyfile, "valid", "key3", "'quoted'"); + check_string_value (keyfile, "valid", "key4", "\xe2\x89\xa0\xe2\x89\xa0"); + + value = g_key_file_get_string (keyfile, "invalid", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + g_free (value); + + value = g_key_file_get_string (keyfile, "invalid", "key2", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + g_free (value); + + g_key_file_free (keyfile); +} + +/* check parsing of boolean values */ +static void +test_boolean (void) +{ + GKeyFile *keyfile; + GError *error = NULL; + + const gchar *data = + "[valid]\n" + "key1=true\n" + "key2=false\n" + "key3=1\n" + "key4=0\n" + "[invalid]\n" + "key1=t\n" + "key2=f\n" + "key3=yes\n" + "key4=no\n"; + + keyfile = load_data (data, 0); + + check_boolean_value (keyfile, "valid", "key1", TRUE); + check_boolean_value (keyfile, "valid", "key2", FALSE); + check_boolean_value (keyfile, "valid", "key3", TRUE); + check_boolean_value (keyfile, "valid", "key4", FALSE); + + g_key_file_get_boolean (keyfile, "invalid", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_boolean (keyfile, "invalid", "key2", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_boolean (keyfile, "invalid", "key3", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_boolean (keyfile, "invalid", "key4", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_free (keyfile); +} + +/* check parsing of integer and double values */ +static void +test_number (void) +{ + GKeyFile *keyfile; + GError *error = NULL; + + const gchar *data = + "[valid]\n" + "key1=0\n" + "key2=1\n" + "key3=-1\n" + "key4=2324431\n" + "key5=-2324431\n" + "key6=000111\n" + "dkey1=000111\n" + "dkey2=145.45\n" + "dkey3=-3453.7\n" + "[invalid]\n" + "key1=0xffff\n" + "key2=0.5\n" + "key3=1e37\n" + "key4=ten\n" + "key5=\n" + "key6=1.0.0\n" + "key7=2x2\n" + "key8=abc\n"; + + keyfile = load_data (data, 0); + + check_integer_value (keyfile, "valid", "key1", 0); + check_integer_value (keyfile, "valid", "key2", 1); + check_integer_value (keyfile, "valid", "key3", -1); + check_integer_value (keyfile, "valid", "key4", 2324431); + check_integer_value (keyfile, "valid", "key5", -2324431); + check_integer_value (keyfile, "valid", "key6", 111); + check_double_value (keyfile, "valid", "dkey1", 111.0); + check_double_value (keyfile, "valid", "dkey2", 145.45); + check_double_value (keyfile, "valid", "dkey3", -3453.7); + + g_key_file_get_integer (keyfile, "invalid", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_integer (keyfile, "invalid", "key2", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_integer (keyfile, "invalid", "key3", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_integer (keyfile, "invalid", "key4", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_double (keyfile, "invalid", "key5", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_double (keyfile, "invalid", "key6", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_double (keyfile, "invalid", "key7", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_get_double (keyfile, "invalid", "key8", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + + g_key_file_free (keyfile); +} + +/* check handling of translated strings */ +static void +test_locale_string (void) +{ + GKeyFile *keyfile; + + const gchar *data = + "[valid]\n" + "key1=v1\n" + "key1[de]=v1-de\n" + "key1[de_DE]=v1-de_DE\n" + "key1[de_DE.UTF8]=v1-de_DE.UTF8\n" + "key1[fr]=v1-fr\n" + "key1[en] =v1-en\n" + "key1[sr@Latn]=v1-sr\n"; + + keyfile = load_data (data, G_KEY_FILE_KEEP_TRANSLATIONS); + + check_locale_string_value (keyfile, "valid", "key1", "it", "v1"); + check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de"); + check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de_DE"); + check_locale_string_value (keyfile, "valid", "key1", "de_DE.UTF8", "v1-de_DE.UTF8"); + check_locale_string_value (keyfile, "valid", "key1", "fr", "v1-fr"); + check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1-fr"); + check_locale_string_value (keyfile, "valid", "key1", "en", "v1-en"); + check_locale_string_value (keyfile, "valid", "key1", "sr@Latn", "v1-sr"); + + g_key_file_free (keyfile); + + /* now test that translations are thrown away */ + + g_setenv ("LANGUAGE", "de", TRUE); + setlocale (LC_ALL, ""); + + keyfile = load_data (data, 0); + + check_locale_string_value (keyfile, "valid", "key1", "it", "v1"); + check_locale_string_value (keyfile, "valid", "key1", "de", "v1-de"); + check_locale_string_value (keyfile, "valid", "key1", "de_DE", "v1-de"); + check_locale_string_value (keyfile, "valid", "key1", "de_DE.UTF8", "v1-de"); + check_locale_string_value (keyfile, "valid", "key1", "fr", "v1"); + check_locale_string_value (keyfile, "valid", "key1", "fr_FR", "v1"); + check_locale_string_value (keyfile, "valid", "key1", "en", "v1"); + + g_key_file_free (keyfile); +} + +static void +test_lists (void) +{ + GKeyFile *keyfile; + + const gchar *data = + "[valid]\n" + "key1=v1;v2\n" + "key2=v1;v2;\n" + "key3=v1,v2\n" + "key4=v1\\;v2\n" + "key5=true;false\n" + "key6=1;0;-1\n" + "key7= 1 ; 0 ; -1 \n" + "key8=v1\\,v2\n" + "key9=0;1.3456;-76532.456\n"; + + keyfile = load_data (data, 0); + + check_string_list_value (keyfile, "valid", "key1", "v1", "v2", NULL); + check_string_list_value (keyfile, "valid", "key2", "v1", "v2", NULL); + check_string_list_value (keyfile, "valid", "key3", "v1,v2", NULL); + check_string_list_value (keyfile, "valid", "key4", "v1;v2", NULL); + check_boolean_list_value (keyfile, "valid", "key5", TRUE, FALSE, -100); + check_integer_list_value (keyfile, "valid", "key6", 1, 0, -1, -100); + check_double_list_value (keyfile, "valid", "key9", 0.0, 1.3456, -76532.456, -100.0); + /* maybe these should be valid */ + /* check_integer_list_value (keyfile, "valid", "key7", 1, 0, -1, -100);*/ + /* check_string_list_value (keyfile, "valid", "key8", "v1\\,v2", NULL);*/ + + g_key_file_free (keyfile); + + /* Now check an alternate separator */ + + keyfile = load_data (data, 0); + g_key_file_set_list_separator (keyfile, ','); + + check_string_list_value (keyfile, "valid", "key1", "v1;v2", NULL); + check_string_list_value (keyfile, "valid", "key2", "v1;v2;", NULL); + check_string_list_value (keyfile, "valid", "key3", "v1", "v2", NULL); + + g_key_file_free (keyfile); +} + +static void +test_lists_set_get (void) +{ + GKeyFile *keyfile; + static const char * const strings[] = { "v1", "v2" }; + static const char * const locale_strings[] = { "v1-l", "v2-l" }; + static int integers[] = { 1, -1, 2 }; + static gdouble doubles[] = { 3.14, 2.71 }; + + keyfile = g_key_file_new (); + g_key_file_set_string_list (keyfile, "group0", "key1", strings, G_N_ELEMENTS (strings)); + g_key_file_set_locale_string_list (keyfile, "group0", "key1", "de", locale_strings, G_N_ELEMENTS (locale_strings)); + g_key_file_set_integer_list (keyfile, "group0", "key2", integers, G_N_ELEMENTS (integers)); + g_key_file_set_double_list (keyfile, "group0", "key3", doubles, G_N_ELEMENTS (doubles)); + + check_string_list_value (keyfile, "group0", "key1", strings[0], strings[1], NULL); + check_locale_string_list_value (keyfile, "group0", "key1", "de", locale_strings[0], locale_strings[1], NULL); + check_integer_list_value (keyfile, "group0", "key2", integers[0], integers[1], -100); + check_double_list_value (keyfile, "group0", "key3", doubles[0], doubles[1], -100.0); + g_key_file_free (keyfile); + + /* and again with a different list separator */ + keyfile = g_key_file_new (); + g_key_file_set_list_separator (keyfile, ','); + g_key_file_set_string_list (keyfile, "group0", "key1", strings, G_N_ELEMENTS (strings)); + g_key_file_set_locale_string_list (keyfile, "group0", "key1", "de", locale_strings, G_N_ELEMENTS (locale_strings)); + g_key_file_set_integer_list (keyfile, "group0", "key2", integers, G_N_ELEMENTS (integers)); + g_key_file_set_double_list (keyfile, "group0", "key3", doubles, G_N_ELEMENTS (doubles)); + + check_string_list_value (keyfile, "group0", "key1", strings[0], strings[1], NULL); + check_locale_string_list_value (keyfile, "group0", "key1", "de", locale_strings[0], locale_strings[1], NULL); + check_integer_list_value (keyfile, "group0", "key2", integers[0], integers[1], -100); + check_double_list_value (keyfile, "group0", "key3", doubles[0], doubles[1], -100.0); + g_key_file_free (keyfile); +} + +static void +test_group_remove (void) +{ + GKeyFile *keyfile; + gchar **names; + gsize len; + GError *error = NULL; + + const gchar *data = + "[group1]\n" + "[group2]\n" + "key1=bla\n" + "key2=bla\n" + "[group3]\n" + "key1=bla\n" + "key2=bla\n"; + + g_test_bug ("165887"); + + keyfile = load_data (data, 0); + + names = g_key_file_get_groups (keyfile, &len); + g_assert (names != NULL); + + check_length ("groups", g_strv_length (names), len, 3); + check_name ("group name", names[0], "group1", 0); + check_name ("group name", names[1], "group2", 1); + check_name ("group name", names[2], "group3", 2); + + g_key_file_remove_group (keyfile, "group1", &error); + check_no_error (&error); + + g_strfreev (names); + + names = g_key_file_get_groups (keyfile, &len); + g_assert (names != NULL); + + check_length ("groups", g_strv_length (names), len, 2); + check_name ("group name", names[0], "group2", 0); + check_name ("group name", names[1], "group3", 1); + + g_key_file_remove_group (keyfile, "group2", &error); + check_no_error (&error); + + g_strfreev (names); + + names = g_key_file_get_groups (keyfile, &len); + g_assert (names != NULL); + + check_length ("groups", g_strv_length (names), len, 1); + check_name ("group name", names[0], "group3", 0); + + g_key_file_remove_group (keyfile, "no such group", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + + g_strfreev (names); + + g_key_file_free (keyfile); +} + +static void +test_key_remove (void) +{ + GKeyFile *keyfile; + gchar *value; + GError *error = NULL; + + const gchar *data = + "[group1]\n" + "key1=bla\n" + "key2=bla\n"; + + g_test_bug ("165980"); + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "group1", "key1", "bla"); + + g_key_file_remove_key (keyfile, "group1", "key1", &error); + check_no_error (&error); + + value = g_key_file_get_string (keyfile, "group1", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND); + g_free (value); + + g_key_file_remove_key (keyfile, "group1", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND); + + g_key_file_remove_key (keyfile, "no such group", "key1", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + + g_key_file_free (keyfile); +} + + +static void +test_groups (void) +{ + GKeyFile *keyfile; + + const gchar *data = + "[1]\n" + "key1=123\n" + "[2]\n" + "key2=123\n"; + + g_test_bug ("316309"); + + keyfile = load_data (data, 0); + + check_string_value (keyfile, "1", "key1", "123"); + check_string_value (keyfile, "2", "key2", "123"); + + g_key_file_free (keyfile); +} + +static void +test_group_names (void) +{ + GKeyFile *keyfile; + GError *error = NULL; + const gchar *data; + gchar *value; + + /* [ in group name */ + data = "[a[b]\n" + "key1=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* ] in group name */ + data = "[a]b]\n" + "key1=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* control char in group name */ + data = "[a\tb]\n" + "key1=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* empty group name */ + data = "[]\n" + "key1=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* Unicode in group name */ + data = "[\xc2\xbd]\n" + "key1=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_no_error (&error); + + keyfile = g_key_file_new (); + /*g_key_file_set_string (keyfile, "a[b", "key1", "123");*/ + value = g_key_file_get_string (keyfile, "a[b", "key1", &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + /*g_key_file_set_string (keyfile, "a]b", "key1", "123");*/ + value = g_key_file_get_string (keyfile, "a]b", "key1", &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + /*g_key_file_set_string (keyfile, "a\tb", "key1", "123");*/ + value = g_key_file_get_string (keyfile, "a\tb", "key1", &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "\xc2\xbd", "key1", "123"); + check_string_value (keyfile, "\xc2\xbd", "key1", "123"); + g_key_file_free (keyfile); +} + +static void +test_key_names (void) +{ + GKeyFile *keyfile; + GError *error = NULL; + const gchar *data; + gchar *value; + + /* [ in key name */ + data = "[a]\n" + "key[=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* empty key name */ + data = "[a]\n" + " =123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* empty key name */ + data = "[a]\n" + " [de] =123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* bad locale suffix */ + data = "[a]\n" + "foo[@#!&%]=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + + /* initial space */ + data = "[a]\n" + " foo=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + check_no_error (&error); + check_string_value (keyfile, "a", "foo", "123"); + g_key_file_free (keyfile); + + /* final space */ + data = "[a]\n" + "foo =123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + check_no_error (&error); + check_string_value (keyfile, "a", "foo", "123"); + g_key_file_free (keyfile); + + /* inner space */ + data = "[a]\n" + "foo bar=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + check_no_error (&error); + check_string_value (keyfile, "a", "foo bar", "123"); + g_key_file_free (keyfile); + + /* inner space */ + data = "[a]\n" + "foo [de] =123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_PARSE); + g_key_file_free (keyfile); + + /* control char in key name */ + data = "[a]\n" + "key\tfoo=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_no_error (&error); + + /* Unicode in key name */ + data = "[a]\n" + "\xc2\xbd=123\n"; + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + g_key_file_free (keyfile); + check_no_error (&error); + + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "a", "x", "123"); + /*g_key_file_set_string (keyfile, "a", "key=", "123");*/ + value = g_key_file_get_string (keyfile, "a", "key=", &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "a", "x", "123"); + /*g_key_file_set_string (keyfile, "a", "key[", "123");*/ + value = g_key_file_get_string (keyfile, "a", "key[", &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "a", "x", "123"); + g_key_file_set_string (keyfile, "a", "key\tfoo", "123"); + value = g_key_file_get_string (keyfile, "a", "key\tfoo", &error); + check_no_error (&error); + g_free (value); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "a", "x", "123"); + /*g_key_file_set_string (keyfile, "a", " key", "123");*/ + value = g_key_file_get_string (keyfile, "a", " key", &error); + check_error (&error, + G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + g_key_file_set_string (keyfile, "a", "x", "123"); + + /* Unicode key */ + g_key_file_set_string (keyfile, "a", "\xc2\xbd", "123"); + check_string_value (keyfile, "a", "\xc2\xbd", "123"); + + /* Keys with / + . (as used by the gnome-vfs mime cache) */ + g_key_file_set_string (keyfile, "a", "foo/bar", "/"); + check_string_value (keyfile, "a", "foo/bar", "/"); + g_key_file_set_string (keyfile, "a", "foo+bar", "+"); + check_string_value (keyfile, "a", "foo+bar", "+"); + g_key_file_set_string (keyfile, "a", "foo.bar", "."); + check_string_value (keyfile, "a", "foo.bar", "."); + + g_key_file_free (keyfile); +} + +static void +test_duplicate_keys (void) +{ + GKeyFile *keyfile; + const gchar *data = + "[1]\n" + "key1=123\n" + "key1=345\n"; + + keyfile = load_data (data, 0); + check_string_value (keyfile, "1", "key1", "345"); + + g_key_file_free (keyfile); +} + +static void +test_duplicate_groups (void) +{ + GKeyFile *keyfile; + const gchar *data = + "[Desktop Entry]\n" + "key1=123\n" + "[Desktop Entry]\n" + "key2=123\n"; + + g_test_bug ("157877"); + + keyfile = load_data (data, 0); + check_string_value (keyfile, "Desktop Entry", "key1", "123"); + check_string_value (keyfile, "Desktop Entry", "key2", "123"); + + g_key_file_free (keyfile); +} + +static void +test_duplicate_groups2 (void) +{ + GKeyFile *keyfile; + const gchar *data = + "[A]\n" + "foo=bar\n" + "[B]\n" + "foo=baz\n" + "[A]\n" + "foo=bang\n"; + + g_test_bug ("385910"); + + keyfile = load_data (data, 0); + check_string_value (keyfile, "A", "foo", "bang"); + check_string_value (keyfile, "B", "foo", "baz"); + + g_key_file_free (keyfile); +} + +static void +test_reload_idempotency (void) +{ + static const gchar *original_data="" + "# Top comment\n" + "\n" + "# First comment\n" + "[first]\n" + "key=value\n" + "# A random comment in the first group\n" + "anotherkey=anothervalue\n" + "# Second comment - one line\n" + "[second]\n" + "# Third comment - two lines\n" + "# Third comment - two lines\n" + "[third]\n" + "blank_line=1\n" + "\n" + "blank_lines=2\n" + "\n\n" + "[fourth]\n" + "[fifth]\n"; + GKeyFile *keyfile; + GError *error = NULL; + gchar *data1, *data2; + gsize len1, len2; + + g_test_bug ("420686"); + + /* check that we only insert a single new line between groups */ + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, + original_data, strlen(original_data), + G_KEY_FILE_KEEP_COMMENTS, + &error); + check_no_error (&error); + + data1 = g_key_file_to_data (keyfile, &len1, &error); + g_assert (data1 != NULL); + g_key_file_free (keyfile); + + keyfile = g_key_file_new (); + g_key_file_load_from_data (keyfile, + data1, len1, + G_KEY_FILE_KEEP_COMMENTS, + &error); + check_no_error (&error); + + data2 = g_key_file_to_data (keyfile, &len2, &error); + g_assert (data2 != NULL); + g_key_file_free (keyfile); + + g_assert_cmpstr (data1, ==, data2); + + g_free (data2); + g_free (data1); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/keyfile/line-ends", test_line_ends); + g_test_add_func ("/keyfile/whitespace", test_whitespace); + g_test_add_func ("/keyfile/comments", test_comments); + g_test_add_func ("/keyfile/listing", test_listing); + g_test_add_func ("/keyfile/string", test_string); + g_test_add_func ("/keyfile/boolean", test_boolean); + g_test_add_func ("/keyfile/number", test_number); + g_test_add_func ("/keyfile/locale-string", test_locale_string); + g_test_add_func ("/keyfile/lists", test_lists); + g_test_add_func ("/keyfile/lists-set-get", test_lists_set_get); + g_test_add_func ("/keyfile/group-remove", test_group_remove); + g_test_add_func ("/keyfile/key-remove", test_key_remove); + g_test_add_func ("/keyfile/groups", test_groups); + g_test_add_func ("/keyfile/duplicate-keys", test_duplicate_keys); + g_test_add_func ("/keyfile/duplicate-groups", test_duplicate_groups); + g_test_add_func ("/keyfile/duplicate-groups2", test_duplicate_groups2); + g_test_add_func ("/keyfile/group-names", test_group_names); + g_test_add_func ("/keyfile/key-names", test_key_names); + g_test_add_func ("/keyfile/reload", test_reload_idempotency); + + return g_test_run (); +} diff --git a/glib/tests/markup-subparser.c b/glib/tests/markup-subparser.c new file mode 100644 index 0000000..0b3c746 --- /dev/null +++ b/glib/tests/markup-subparser.c @@ -0,0 +1,377 @@ +/* + * Copyright © 2008 Ryan Lortie + * + * This program 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 of the + * License, or (at your option) any later version. + * + * See the included COPYING file for more information. + */ + +#include +#include +#include + +/* keep track of GString instances to make sure nothing leaks */ +static int strings_allocated; + +/* === the GMarkupParser functions === */ +static void +subparser_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + g_string_append_printf (user_data, "{%s}", element_name); + + /* we don't like trouble... */ + if (strcmp (element_name, "trouble") == 0) + g_set_error (error, 0, 0, "we don't like trouble"); +} + +static void +subparser_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + g_string_append_printf (user_data, "{/%s}", element_name); +} + +static void +subparser_error (GMarkupParseContext *context, + GError *error, + gpointer user_data) +{ + g_string_free (user_data, TRUE); + strings_allocated--; +} + +static GMarkupParser subparser_parser = +{ + subparser_start_element, + subparser_end_element, + NULL, + NULL, + subparser_error +}; + +/* convenience functions for a parser that does not + * replay the starting tag into the subparser... + */ +static void +subparser_start (GMarkupParseContext *ctx) +{ + gpointer user_data; + + user_data = g_string_new (NULL); + strings_allocated++; + g_markup_parse_context_push (ctx, &subparser_parser, user_data); +} + +static char * +subparser_end (GMarkupParseContext *ctx, + GError **error) +{ + GString *string; + char *result; + + string = g_markup_parse_context_pop (ctx); + result = string->str; + + g_string_free (string, FALSE); + strings_allocated--; + + if (result == NULL || result[0] == '\0') + { + g_free (result); + g_set_error (error, 0, 0, "got no data"); + + return NULL; + } + + return result; +} + +/* convenience functions for a parser that -does- + * replay the starting tag into the subparser... + */ +static gboolean +replay_parser_start (GMarkupParseContext *ctx, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + GError **error) +{ + GError *tmp_error = NULL; + gpointer user_data; + + user_data = g_string_new (NULL); + strings_allocated++; + + subparser_parser.start_element (ctx, element_name, + attribute_names, attribute_values, + user_data, &tmp_error); + + if (tmp_error) + { + g_propagate_error (error, tmp_error); + g_string_free (user_data, TRUE); + strings_allocated--; + + return FALSE; + } + + g_markup_parse_context_push (ctx, &subparser_parser, user_data); + + return TRUE; +} + +static char * +replay_parser_end (GMarkupParseContext *ctx, + GError **error) +{ + GError *tmp_error = NULL; + GString *string; + char *result; + + string = g_markup_parse_context_pop (ctx); + + subparser_parser.end_element (ctx, g_markup_parse_context_get_element (ctx), + string, &tmp_error); + + if (tmp_error) + { + g_propagate_error (error, tmp_error); + g_string_free (string, TRUE); + strings_allocated--; + + return FALSE; + } + + result = string->str; + + g_string_free (string, FALSE); + strings_allocated--; + + if (result == NULL || result[0] == '\0') + { + g_free (result); + g_set_error (error, 0, 0, "got no data"); + + return NULL; + } + + return result; +} + + +/* === start interface between subparser and calling parser === */ +static void subparser_start (GMarkupParseContext *ctx); +static char *subparser_end (GMarkupParseContext *ctx, + GError **error); +/* === end interface between subparser and calling parser === */ + +/* === start interface between replay parser and calling parser === */ +static gboolean replay_parser_start (GMarkupParseContext *ctx, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + GError **error); +static char *replay_parser_end (GMarkupParseContext *ctx, + GError **error); +/* === end interface between replay parser and calling parser === */ + + + +/* now comes our parser for the test. + * + * we recognise the tags and . + * is ignored. + * invokes the subparser (no replay). + * + * "unknown tags" are passed to the reply subparser + * (so the unknown tag is fed to the subparser...) + */ +static void +start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + g_string_append_printf (user_data, "<%s>", element_name); + + if (strcmp (element_name, "test") == 0) + { + /* do nothing */ + } + else if (strcmp (element_name, "sub") == 0) + { + /* invoke subparser */ + subparser_start (context); + } + else + { + /* unknown tag. invoke replay subparser */ + if (!replay_parser_start (context, element_name, + attribute_names, attribute_values, + error)) + return; + } +} + +static void +end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + if (strcmp (element_name, "test") == 0) + { + /* do nothing */ + } + else if (strcmp (element_name, "sub") == 0) + { + char *result; + + if ((result = subparser_end (context, error)) == NULL) + return; + + g_string_append_printf (user_data, "<<%s>>", result); + g_free (result); + } + else + { + char *result; + + if ((result = replay_parser_end (context, error)) == NULL) + return; + + g_string_append_printf (user_data, "[[%s]]", result); + g_free (result); + } + + g_string_append_printf (user_data, "", element_name); +} + +static GMarkupParser parser = +{ + start_element, + end_element +}; + +typedef struct +{ + const char *markup; + const char *result; + const char *error_message; +} TestCase; + +void +test (gconstpointer user_data) +{ + const TestCase *tc = user_data; + GMarkupParseContext *ctx; + GString *string; + gboolean result; + GError *error; + + error = NULL; + string = g_string_new (NULL); + ctx = g_markup_parse_context_new (&parser, 0, string, NULL); + result = g_markup_parse_context_parse (ctx, tc->markup, + strlen (tc->markup), &error); + if (result) + result = g_markup_parse_context_end_parse (ctx, &error); + g_markup_parse_context_free (ctx); + g_assert (strings_allocated == 0); + + if (result) + { + if (tc->error_message) + g_error ("expected failure (about '%s') passed!\n" + " in: %s\n out: %s", + tc->error_message, tc->markup, string->str); + } + else + { + if (!tc->error_message) + g_error ("unexpected failure: '%s'\n" + " in: %s\n out: %s", + error->message, tc->markup, string->str); + + if (!strstr (error->message, tc->error_message)) + g_error ("failed for the wrong reason.\n" + " expecting message about '%s'\n" + " got message '%s'\n" + " in: %s\n out: %s", + tc->error_message, error->message, tc->markup, string->str); + } + + if (strcmp (string->str, tc->result) != 0) + g_error ("got the wrong result.\n" + " expected: '%s'\n" + " got: '%s'\n" + " input: %s", + tc->result, string->str, tc->markup); + + if (error) + g_error_free (error); + + g_string_free (string, TRUE); +} + +TestCase test_cases[] = /* successful runs */ +{ + /* in */ /* out */ + { "", "" }, + { "", "<<{foo}{/foo}>>" }, + { "", "<<{foo}{/foo}{bar}{/bar}>>" }, + { "", "[[{foo}{bar}{/bar}{/foo}]]" }, + { "", "[[{foo}{x}{/x}{y}{/y}{/foo}]]" }, + { "", "[[{foo}{/foo}]]" }, + { "", "<<{foo}{/foo}>>" + "[[{bar}{/bar}]]" } +}; + +TestCase error_cases[] = /* error cases */ +{ + /* in */ /* out */ /* error */ + { "<>", "", ">"}, + { "", "", "empty" }, + { "", "", "trouble" }, + { "", "", "trouble" }, + { "", "", "trouble" }, + { "", "", "no data" }, + { "", "", "no data" } +}; + +#define add_tests(func, basename, array) \ + G_STMT_START { \ + int __add_tests_i; \ + \ + for (__add_tests_i = 0; \ + __add_tests_i < G_N_ELEMENTS (array); \ + __add_tests_i++) \ + { \ + char *testname; \ + \ + testname = g_strdup_printf ("%s/%d", basename, __add_tests_i); \ + g_test_add_data_func (testname, &array[__add_tests_i], func); \ + g_free (testname); \ + } \ + } G_STMT_END + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + add_tests (test, "/glib/markup/subparser/success", test_cases); + add_tests (test, "/glib/markup/subparser/failure", error_cases); + return g_test_run (); +} diff --git a/glib/tests/mem-overflow.c b/glib/tests/mem-overflow.c new file mode 100644 index 0000000..9ebd443 --- /dev/null +++ b/glib/tests/mem-overflow.c @@ -0,0 +1,108 @@ +/* Unit tests for g + * Copyright (C) 2010 Red Hat, Inc. + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include "glib.h" +#include + +static void +mem_overflow (void) +{ + gsize a = G_MAXSIZE / 10 + 10; + gsize b = 10; + gpointer p, q; + typedef char X[10]; + +#define CHECK_PASS(P) p = (P); g_assert (p == NULL); +#define CHECK_FAIL(P) p = (P); g_assert (p != NULL); + + CHECK_PASS (g_try_malloc_n (a, a)); + CHECK_PASS (g_try_malloc_n (a, b)); + CHECK_PASS (g_try_malloc_n (b, a)); + CHECK_FAIL (g_try_malloc_n (b, b)); + + CHECK_PASS (g_try_malloc0_n (a, a)); + CHECK_PASS (g_try_malloc0_n (a, b)); + CHECK_PASS (g_try_malloc0_n (b, a)); + CHECK_FAIL (g_try_malloc0_n (b, b)); + + q = g_malloc (1); + CHECK_PASS (g_try_realloc_n (q, a, a)); + CHECK_PASS (g_try_realloc_n (q, a, b)); + CHECK_PASS (g_try_realloc_n (q, b, a)); + CHECK_FAIL (g_try_realloc_n (q, b, b)); + free (p); + + CHECK_PASS (g_try_new (X, a)); + CHECK_FAIL (g_try_new (X, b)); + + CHECK_PASS (g_try_new0 (X, a)); + CHECK_FAIL (g_try_new0 (X, b)); + + q = g_try_malloc (1); + CHECK_PASS (g_try_renew (X, q, a)); + CHECK_FAIL (g_try_renew (X, q, b)); + free (p); + +#undef CHECK_FAIL +#undef CHECK_PASS + +#define CHECK_FAIL(P) if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { p = (P); exit (0); } g_test_trap_assert_failed(); +#define CHECK_PASS(P) if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { p = (P); exit (0); } g_test_trap_assert_passed(); + + CHECK_FAIL (g_malloc_n (a, a)); + CHECK_FAIL (g_malloc_n (a, b)); + CHECK_FAIL (g_malloc_n (b, a)); + CHECK_PASS (g_malloc_n (b, b)); + + CHECK_FAIL (g_malloc0_n (a, a)); + CHECK_FAIL (g_malloc0_n (a, b)); + CHECK_FAIL (g_malloc0_n (b, a)); + CHECK_PASS (g_malloc0_n (b, b)); + + q = g_malloc (1); + CHECK_FAIL (g_realloc_n (q, a, a)); + CHECK_FAIL (g_realloc_n (q, a, b)); + CHECK_FAIL (g_realloc_n (q, b, a)); + CHECK_PASS (g_realloc_n (q, b, b)); + free (q); + + CHECK_FAIL (g_new (X, a)); + CHECK_PASS (g_new (X, b)); + + CHECK_FAIL (g_new0 (X, a)); + CHECK_PASS (g_new0 (X, b)); + + q = g_malloc (1); + CHECK_FAIL (g_renew (X, q, a)); + CHECK_PASS (g_renew (X, q, b)); + free (q); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/mem/overflow", mem_overflow); + + return g_test_run(); +} diff --git a/glib/tests/option-context.c b/glib/tests/option-context.c new file mode 100644 index 0000000..913ad5c --- /dev/null +++ b/glib/tests/option-context.c @@ -0,0 +1,1794 @@ +/* Unit tests for GOptionContext + * Copyright (C) 2007 Openismus GmbH + * Authors: Mathias Hasselmann + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include + +#include +#include +#include +#include + +static void +group_captions (void) +{ + gchar *help_variants[] = { "--help", "--help-all", "--help-test" }; + + GOptionEntry main_entries[] = { + { "main-switch", 0, + G_OPTION_FLAG_NO_ARG, + G_OPTION_ARG_NONE, NULL, + "A switch that is in the main group", NULL }, + { NULL } + }; + + GOptionEntry group_entries[] = { + { "test-switch", 0, + G_OPTION_FLAG_NO_ARG, + G_OPTION_ARG_NONE, NULL, + "A switch that is in the test group", NULL }, + { NULL } + }; + + gint i, j; + + g_test_bug ("504142"); + + for (i = 0; i < 4; ++i) + { + gboolean have_main_entries = (0 != (i & 1)); + gboolean have_test_entries = (0 != (i & 2)); + + GOptionContext *options; + GOptionGroup *group = NULL; + + options = g_option_context_new (NULL); + + if (have_main_entries) + g_option_context_add_main_entries (options, main_entries, NULL); + if (have_test_entries) + { + group = g_option_group_new ("test", "Test Options", + "Show all test options", + NULL, NULL); + g_option_context_add_group (options, group); + g_option_group_add_entries (group, group_entries); + } + + for (j = 0; j < G_N_ELEMENTS (help_variants); ++j) + { + GTestTrapFlags trap_flags = 0; + gchar *args[3]; + + args[0] = __FILE__; + args[1] = help_variants[j]; + args[2] = NULL; + + if (!g_test_verbose ()) + trap_flags |= G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR; + + g_test_message ("test setup: args='%s', main-entries=%d, test-entries=%d", + args[1], have_main_entries, have_test_entries); + + if (g_test_trap_fork (0, trap_flags)) + { + gchar **argv = args; + gint argc = 2; + GError *error = NULL; + + g_setenv ("LANG", "C", TRUE); + + g_option_context_parse (options, &argc, &argv, &error); + exit(0); + } + else + { + gboolean expect_main_description = FALSE; + gboolean expect_main_switch = FALSE; + + gboolean expect_test_description = FALSE; + gboolean expect_test_switch = FALSE; + gboolean expect_test_group = FALSE; + + g_test_trap_assert_passed (); + g_test_trap_assert_stderr (""); + + switch (j) + { + case 0: + g_assert_cmpstr ("--help", ==, args[1]); + expect_main_switch = have_main_entries; + expect_test_group = have_test_entries; + break; + + case 1: + g_assert_cmpstr ("--help-all", ==, args[1]); + expect_main_switch = have_main_entries; + expect_test_switch = have_test_entries; + expect_test_group = have_test_entries; + break; + + case 2: + g_assert_cmpstr ("--help-test", ==, args[1]); + expect_test_switch = have_test_entries; + break; + + default: + g_assert_not_reached (); + break; + } + + expect_main_description |= expect_main_switch; + expect_test_description |= expect_test_switch; + + if (expect_main_description) + g_test_trap_assert_stdout ("*Application Options*"); + else + g_test_trap_assert_stdout_unmatched ("*Application Options*"); + if (expect_main_switch) + g_test_trap_assert_stdout ("*--main-switch*"); + else + g_test_trap_assert_stdout_unmatched ("*--main-switch*"); + + if (expect_test_description) + g_test_trap_assert_stdout ("*Test Options*"); + else + g_test_trap_assert_stdout_unmatched ("*Test Options*"); + if (expect_test_switch) + g_test_trap_assert_stdout ("*--test-switch*"); + else + g_test_trap_assert_stdout_unmatched ("*--test-switch*"); + + if (expect_test_group) + g_test_trap_assert_stdout ("*--help-test*"); + else + g_test_trap_assert_stdout_unmatched ("*--help-test*"); + } + } + } +} + +int error_test1_int; +char *error_test2_string; +gboolean error_test3_boolean; + +int arg_test1_int; +gchar *arg_test2_string; +gchar *arg_test3_filename; +gdouble arg_test4_double; +gdouble arg_test5_double; +gint64 arg_test6_int64; +gint64 arg_test6_int64_2; + +gchar *callback_test1_string; +int callback_test2_int; + +gchar *callback_test_optional_string; +gboolean callback_test_optional_boolean; + +gchar **array_test1_array; + +gboolean ignore_test1_boolean; +gboolean ignore_test2_boolean; +gchar *ignore_test3_string; + +gchar ** +split_string (const char *str, int *argc) +{ + gchar **argv; + int len; + + argv = g_strsplit (str, " ", 0); + + for (len = 0; argv[len] != NULL; len++); + + if (argc) + *argc = len; + + return argv; +} + +gchar * +join_stringv (int argc, char **argv) +{ + int i; + GString *str; + + str = g_string_new (NULL); + + for (i = 0; i < argc; i++) + { + g_string_append (str, argv[i]); + + if (i < argc - 1) + g_string_append_c (str, ' '); + } + + return g_string_free (str, FALSE); +} + +/* Performs a shallow copy */ +char ** +copy_stringv (char **argv, int argc) +{ + return g_memdup (argv, sizeof (char *) * (argc + 1)); +} + + +static gboolean +error_test1_pre_parse (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert (error_test1_int == 0x12345678); + + return TRUE; +} + +static gboolean +error_test1_post_parse (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert (error_test1_int == 20); + + /* Set an error in the post hook */ + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, " "); + + return FALSE; +} + +void +error_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionGroup *main_group; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_INT, &error_test1_int, NULL, NULL }, + { NULL } }; + + error_test1_int = 0x12345678; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Set pre and post parse hooks */ + main_group = g_option_context_get_main_group (context); + g_option_group_set_parse_hooks (main_group, + error_test1_pre_parse, error_test1_post_parse); + + /* Now try parsing */ + argv = split_string ("program --test 20", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + + /* On failure, values should be reset */ + g_assert (error_test1_int == 0x12345678); + + g_strfreev (argv); + g_option_context_free (context); +} + +static gboolean +error_test2_pre_parse (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert (strcmp (error_test2_string, "foo") == 0); + + return TRUE; +} + +static gboolean +error_test2_post_parse (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert (strcmp (error_test2_string, "bar") == 0); + + /* Set an error in the post hook */ + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, " "); + + return FALSE; +} + +void +error_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionGroup *main_group; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_STRING, &error_test2_string, NULL, NULL }, + { NULL } }; + + error_test2_string = "foo"; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Set pre and post parse hooks */ + main_group = g_option_context_get_main_group (context); + g_option_group_set_parse_hooks (main_group, + error_test2_pre_parse, error_test2_post_parse); + + /* Now try parsing */ + argv = split_string ("program --test bar", &argc); + retval = g_option_context_parse (context, &argc, &argv, &error); + + g_error_free (error); + g_assert (retval == FALSE); + + g_assert (strcmp (error_test2_string, "foo") == 0); + + g_strfreev (argv); + g_option_context_free (context); +} + +static gboolean +error_test3_pre_parse (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert (!error_test3_boolean); + + return TRUE; +} + +static gboolean +error_test3_post_parse (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert (error_test3_boolean); + + /* Set an error in the post hook */ + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, " "); + + return FALSE; +} + +void +error_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionGroup *main_group; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_NONE, &error_test3_boolean, NULL, NULL }, + { NULL } }; + + error_test3_boolean = FALSE; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Set pre and post parse hooks */ + main_group = g_option_context_get_main_group (context); + g_option_group_set_parse_hooks (main_group, + error_test3_pre_parse, error_test3_post_parse); + + /* Now try parsing */ + argv = split_string ("program --test", &argc); + retval = g_option_context_parse (context, &argc, &argv, &error); + + g_error_free (error); + g_assert (retval == FALSE); + + g_assert (!error_test3_boolean); + + g_strfreev (argv); + g_option_context_free (context); +} + +static void +assert_no_error (GError *error) +{ + if (error) + { + fprintf (stderr, "unexpected error: %s, %d, %s\n", g_quark_to_string (error->domain), error->code, error->message); + exit (1); + } +} + +void +arg_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_INT, &arg_test1_int, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test 20 --test 30", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (arg_test1_int == 30); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +arg_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_STRING, &arg_test2_string, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo --test bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (strcmp (arg_test2_string, "bar") == 0); + + g_free (arg_test2_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +arg_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_FILENAME, &arg_test3_filename, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo.txt", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (strcmp (arg_test3_filename, "foo.txt") == 0); + + g_free (arg_test3_filename); + + g_strfreev (argv); + g_option_context_free (context); +} + + +void +arg_test4 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_DOUBLE, &arg_test4_double, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test 20.0 --test 30.03", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (arg_test4_double == 30.03); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +arg_test5 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + char *old_locale, *current_locale; + const char *locale = "de_DE"; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_DOUBLE, &arg_test5_double, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test 20,0 --test 30,03", &argc); + + /* set it to some locale that uses commas instead of decimal points */ + + old_locale = g_strdup (setlocale (LC_NUMERIC, locale)); + current_locale = setlocale (LC_NUMERIC, NULL); + if (strcmp (current_locale, locale) != 0) + { + fprintf (stderr, "Cannot set locale to %s, skipping\n", locale); + goto cleanup; + } + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (arg_test5_double == 30.03); + + cleanup: + setlocale (LC_NUMERIC, old_locale); + g_free (old_locale); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +arg_test6 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_INT64, &arg_test6_int64, NULL, NULL }, + { "test2", 0, 0, G_OPTION_ARG_INT64, &arg_test6_int64_2, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test 4294967297 --test 4294967296 --test2 0xfffffffff", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (arg_test6_int64 == G_GINT64_CONSTANT(4294967296)); + g_assert (arg_test6_int64_2 == G_GINT64_CONSTANT(0xfffffffff)); + + g_strfreev (argv); + g_option_context_free (context); +} + +static gboolean +callback_parse1 (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + callback_test1_string = g_strdup (value); + return TRUE; +} + +void +callback_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_CALLBACK, callback_parse1, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo.txt", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (strcmp (callback_test1_string, "foo.txt") == 0); + + g_free (callback_test1_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +static gboolean +callback_parse2 (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + callback_test2_int++; + return TRUE; +} + +void +callback_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, callback_parse2, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test --test", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test2_int == 2); + + g_strfreev (argv); + g_option_context_free (context); +} + +static gboolean +callback_parse_optional (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + callback_test_optional_boolean = TRUE; + if (value) + callback_test_optional_string = g_strdup (value); + else + callback_test_optional_string = NULL; + return TRUE; +} + +void +callback_test_optional_1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo.txt", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (strcmp (callback_test_optional_string, "foo.txt") == 0); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +callback_test_optional_2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test_optional_string == NULL); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +callback_test_optional_3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -t foo.txt", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (strcmp (callback_test_optional_string, "foo.txt") == 0); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + + +void +callback_test_optional_4 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -t", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test_optional_string == NULL); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +callback_test_optional_5 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL }, + { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test --dummy", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test_optional_string == NULL); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +callback_test_optional_6 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL }, + { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -t -d", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test_optional_string == NULL); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +callback_test_optional_7 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL }, + { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -td", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test_optional_string == NULL); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +callback_test_optional_8 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "dummy", 'd', 0, G_OPTION_ARG_NONE, &dummy, NULL }, + { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, + callback_parse_optional, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -dt foo.txt", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_test_optional_string); + + g_assert (callback_test_optional_boolean); + + g_free (callback_test_optional_string); + + g_strfreev (argv); + g_option_context_free (context); +} + +static GPtrArray *callback_remaining_args; +static gboolean +callback_remaining_test1_callback (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + g_ptr_array_add (callback_remaining_args, g_strdup (value)); + return TRUE; +} + +void +callback_remaining_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_CALLBACK, callback_remaining_test1_callback, NULL, NULL }, + { NULL } }; + + callback_remaining_args = g_ptr_array_new (); + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo.txt blah.txt", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (callback_remaining_args->len == 2); + g_assert (strcmp (callback_remaining_args->pdata[0], "foo.txt") == 0); + g_assert (strcmp (callback_remaining_args->pdata[1], "blah.txt") == 0); + + g_ptr_array_foreach (callback_remaining_args, (GFunc) g_free, NULL); + g_ptr_array_free (callback_remaining_args, TRUE); + + g_strfreev (argv); + g_option_context_free (context); +} + +static gboolean +callback_error (const gchar *option_name, const gchar *value, + gpointer data, GError **error) +{ + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "42"); + return FALSE; +} + +static void +callback_returns_false (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "error", 0, 0, G_OPTION_ARG_CALLBACK, callback_error, NULL, NULL }, + { "error-no-arg", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, callback_error, NULL, NULL }, + { "error-optional-arg", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, callback_error, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --error value", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE); + g_assert (retval == FALSE); + + g_option_context_free (context); + g_clear_error (&error); + + /* And again, this time with a no-arg variant */ + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + argv = split_string ("program --error-no-arg", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE); + g_assert (retval == FALSE); + + g_option_context_free (context); + g_clear_error (&error); + + /* And again, this time with a optional arg variant, with argument */ + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + argv = split_string ("program --error-optional-arg value", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE); + g_assert (retval == FALSE); + + g_option_context_free (context); + g_clear_error (&error); + + /* And again, this time with a optional arg variant, without argument */ + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + argv = split_string ("program --error-optional-arg", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE); + g_assert (retval == FALSE); + + g_option_context_free (context); + g_clear_error (&error); +} + + +void +ignore_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv, **argv_copy; + int argc; + gchar *arg; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_set_ignore_unknown_options (context, TRUE); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test --hello", &argc); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + arg = join_stringv (argc, argv); + g_assert (strcmp (arg, "program --hello") == 0); + + g_free (arg); + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +void +ignore_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + gchar *arg; + GOptionEntry entries [] = + { { "test", 't', 0, G_OPTION_ARG_NONE, &ignore_test2_boolean, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_set_ignore_unknown_options (context, TRUE); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -test", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + arg = join_stringv (argc, argv); + g_assert (strcmp (arg, "program -es") == 0); + + g_free (arg); + g_strfreev (argv); + g_option_context_free (context); +} + +void +ignore_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv, **argv_copy; + int argc; + gchar *arg; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_STRING, &ignore_test3_string, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_set_ignore_unknown_options (context, TRUE); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo --hello", &argc); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + arg = join_stringv (argc, argv); + g_assert (strcmp (arg, "program --hello") == 0); + + g_assert (strcmp (ignore_test3_string, "foo") == 0); + g_free (ignore_test3_string); + + g_free (arg); + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +void +array_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = + { { "test", 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo --test bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (strcmp (array_test1_array[0], "foo") == 0); + g_assert (strcmp (array_test1_array[1], "bar") == 0); + g_assert (array_test1_array[2] == NULL); + + g_strfreev (array_test1_array); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +add_test1 (void) +{ + GOptionContext *context; + + GOptionEntry entries1 [] = + { { "test1", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, NULL, NULL }, + { NULL } }; + GOptionEntry entries2 [] = + { { "test2", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries1, NULL); + g_option_context_add_main_entries (context, entries2, NULL); + + g_option_context_free (context); +} + +void +empty_test1 (void) +{ + GOptionContext *context; + GOptionEntry entries [] = + { { NULL } }; + char *prgname; + + g_set_prgname (NULL); + context = g_option_context_new (NULL); + + g_option_context_add_main_entries (context, entries, NULL); + + g_option_context_parse (context, NULL, NULL, NULL); + + prgname = g_get_prgname (); + g_assert (prgname && strcmp (prgname, "") == 0); + + g_option_context_free (context); +} + +void +empty_test2 (void) +{ + GOptionContext *context; + + context = g_option_context_new (NULL); + g_option_context_parse (context, NULL, NULL, NULL); + + g_option_context_free (context); +} + +void +empty_test3 (void) +{ + GOptionContext *context; + gint argc; + gchar **argv; + + argc = 0; + argv = NULL; + + context = g_option_context_new (NULL); + g_option_context_parse (context, &argc, &argv, NULL); + + g_option_context_free (context); +} + +/* check that non-option arguments are left in argv by default */ +void +rest_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (argv[0], "program") == 0); + g_assert (strcmp (argv[1], "foo") == 0); + g_assert (strcmp (argv[2], "bar") == 0); + g_assert (argv[3] == NULL); + + g_strfreev (argv); + g_option_context_free (context); +} + +/* check that -- works */ +void +rest_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test -- -bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (argv[0], "program") == 0); + g_assert (strcmp (argv[1], "foo") == 0); + g_assert (strcmp (argv[2], "--") == 0); + g_assert (strcmp (argv[3], "-bar") == 0); + g_assert (argv[4] == NULL); + + g_strfreev (argv); + g_option_context_free (context); +} + +/* check that -- stripping works */ +void +rest_test2a (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test -- bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (argv[0], "program") == 0); + g_assert (strcmp (argv[1], "foo") == 0); + g_assert (strcmp (argv[2], "bar") == 0); + g_assert (argv[3] == NULL); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +rest_test2b (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_set_ignore_unknown_options (context, TRUE); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test -bar --", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (argv[0], "program") == 0); + g_assert (strcmp (argv[1], "foo") == 0); + g_assert (strcmp (argv[2], "-bar") == 0); + g_assert (argv[3] == NULL); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +rest_test2c (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test foo -- bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (argv[0], "program") == 0); + g_assert (strcmp (argv[1], "foo") == 0); + g_assert (strcmp (argv[2], "bar") == 0); + g_assert (argv[3] == NULL); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +rest_test2d (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test -- -bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (argv[0], "program") == 0); + g_assert (strcmp (argv[1], "--") == 0); + g_assert (strcmp (argv[2], "-bar") == 0); + g_assert (argv[3] == NULL); + + g_strfreev (argv); + g_option_context_free (context); +} + + +/* check that G_OPTION_REMAINING collects non-option arguments */ +void +rest_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (array_test1_array[0], "foo") == 0); + g_assert (strcmp (array_test1_array[1], "bar") == 0); + g_assert (array_test1_array[2] == NULL); + + g_strfreev (array_test1_array); + + g_strfreev (argv); + g_option_context_free (context); +} + + +/* check that G_OPTION_REMAINING and -- work together */ +void +rest_test4 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &array_test1_array, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test -- -bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (array_test1_array[0], "foo") == 0); + g_assert (strcmp (array_test1_array[1], "-bar") == 0); + g_assert (array_test1_array[2] == NULL); + + g_strfreev (array_test1_array); + + g_strfreev (argv); + g_option_context_free (context); +} + +/* test that G_OPTION_REMAINING works with G_OPTION_ARG_FILENAME_ARRAY */ +void +rest_test5 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { + { "test", 0, 0, G_OPTION_ARG_NONE, &ignore_test1_boolean, NULL, NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &array_test1_array, NULL, NULL }, + { NULL } + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program foo --test bar", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + /* Check array */ + g_assert (ignore_test1_boolean); + g_assert (strcmp (array_test1_array[0], "foo") == 0); + g_assert (strcmp (array_test1_array[1], "bar") == 0); + g_assert (array_test1_array[2] == NULL); + + g_strfreev (array_test1_array); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +unknown_short_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + GOptionEntry entries [] = { { NULL } }; + + g_test_bug ("166609"); + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program -0", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (!retval); + + g_strfreev (argv); + g_option_context_free (context); +} + +/* test that lone dashes are treated as non-options */ +void lonely_dash_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + + g_test_bug ("168008"); + + context = g_option_context_new (NULL); + + /* Now try parsing */ + argv = split_string ("program -", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + assert_no_error (error); + g_assert (retval); + + g_assert (argv[1] && strcmp (argv[1], "-") == 0); + + g_strfreev (argv); + g_option_context_free (context); +} + +void +missing_arg_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + int argc; + gchar *arg = NULL; + GOptionEntry entries [] = + { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL }, + { NULL } }; + + g_test_bug ("305576"); + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_clear_error (&error); + + g_strfreev (argv); + + /* Try parsing again */ + argv = split_string ("program --t", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + + g_strfreev (argv); + g_option_context_free (context); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + g_test_add_func ("/group/captions", group_captions); + + /* Test that restoration on failure works */ + g_test_add_func ("/restoration/int", error_test1); + g_test_add_func ("/restoration/string", error_test2); + g_test_add_func ("/restoration/boolean", error_test3); + + /* Test that special argument parsing works */ + g_test_add_func ("/arg/repetition/int", arg_test1); + g_test_add_func ("/arg/repetition/string", arg_test2); + g_test_add_func ("/arg/repetition/filename", arg_test3); + g_test_add_func ("/arg/repetition/double", arg_test4); + g_test_add_func ("/arg/repetition/locale", arg_test5); + g_test_add_func ("/arg/repetition/int64", arg_test6); + + /* Test string arrays */ + g_test_add_func ("/arg/array/string", array_test1); + + /* Test callback args */ + g_test_add_func ("/arg/callback/string", callback_test1); + g_test_add_func ("/arg/callback/count", callback_test2); + + /* Test optional arg flag for callback */ + g_test_add_func ("/arg/callback/optional1", callback_test_optional_1); + g_test_add_func ("/arg/callback/optional2", callback_test_optional_2); + g_test_add_func ("/arg/callback/optional3", callback_test_optional_3); + g_test_add_func ("/arg/callback/optional4", callback_test_optional_4); + g_test_add_func ("/arg/callback/optional5", callback_test_optional_5); + g_test_add_func ("/arg/callback/optional6", callback_test_optional_6); + g_test_add_func ("/arg/callback/optional7", callback_test_optional_7); + g_test_add_func ("/arg/callback/optional8", callback_test_optional_8); + + /* Test callback with G_OPTION_REMAINING */ + g_test_add_func ("/arg/remaining/callback", callback_remaining_test1); + + /* Test callbacks which return FALSE */ + g_test_add_func ("/arg/remaining/callback-false", callback_returns_false); + + /* Test ignoring options */ + g_test_add_func ("/arg/ignore/long", ignore_test1); + g_test_add_func ("/arg/ignore/short", ignore_test2); + g_test_add_func ("/arg/ignore/arg", ignore_test3); + + g_test_add_func ("/context/add", add_test1); + + /* Test parsing empty args */ + g_test_add_func ("/context/empty1", empty_test1); + g_test_add_func ("/context/empty2", empty_test2); + g_test_add_func ("/context/empty3", empty_test3); + + /* Test handling of rest args */ + g_test_add_func ("/arg/rest/non-option", rest_test1); + g_test_add_func ("/arg/rest/separator1", rest_test2); + g_test_add_func ("/arg/rest/separator2", rest_test2a); + g_test_add_func ("/arg/rest/separator3", rest_test2b); + g_test_add_func ("/arg/rest/separator4", rest_test2c); + g_test_add_func ("/arg/rest/separator5", rest_test2d); + g_test_add_func ("/arg/remaining/non-option", rest_test3); + g_test_add_func ("/arg/remaining/separator", rest_test4); + g_test_add_func ("/arg/remaining/array", rest_test5); + + /* regression tests for individual bugs */ + g_test_add_func ("/bug/unknown-short", unknown_short_test); + g_test_add_func ("/bug/lonely-dash", lonely_dash_test); + g_test_add_func ("/bug/missing-arg", missing_arg_test); + + return g_test_run(); +} diff --git a/glib/tests/printf.c b/glib/tests/printf.c new file mode 100644 index 0000000..a8ab0dc --- /dev/null +++ b/glib/tests/printf.c @@ -0,0 +1,711 @@ +/* Unit tests for gprintf + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include "glib.h" + +static void +test_retval_and_trunc (void) +{ + gchar buf[128]; + gint res; + + res = g_snprintf (buf, 0, "abc"); + g_assert_cmpint (res, ==, 3); + + res = g_snprintf (NULL, 0, "abc"); + g_assert_cmpint (res, ==, 3); + + res = g_snprintf (buf, 5, "abc"); + g_assert_cmpint (res, ==, 3); + + res = g_snprintf (buf, 1, "abc"); + g_assert_cmpint (res, ==, 3); + g_assert (buf[0] == '\0'); + g_assert_cmpstr (buf, ==, ""); + + res = g_snprintf (buf, 2, "abc"); + g_assert_cmpint (res, ==, 3); + g_assert (buf[1] == '\0'); + g_assert_cmpstr (buf, ==, "a"); + + res = g_snprintf (buf, 3, "abc"); + g_assert_cmpint (res, ==, 3); + g_assert (buf[2] == '\0'); + g_assert_cmpstr (buf, ==, "ab"); + + res = g_snprintf (buf, 4, "abc"); + g_assert_cmpint (res, ==, 3); + g_assert (buf[3] == '\0'); + g_assert_cmpstr (buf, ==, "abc"); + + res = g_snprintf (buf, 5, "abc"); + g_assert_cmpint (res, ==, 3); + g_assert (buf[3] == '\0'); + g_assert_cmpstr (buf, ==, "abc"); +} + +static void +test_d (void) +{ + gchar buf[128]; + gint res; + const gchar *fmt; + + /* %d basic formatting */ + + res = g_snprintf (buf, 128, "%d", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%d", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); + + res = g_snprintf (buf, 128, "%.0d", 0); + g_assert_cmpint (res, ==, 0); + g_assert_cmpstr (buf, ==, ""); + + res = g_snprintf (buf, 128, "%.0d", 1); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "1"); + + res = g_snprintf (buf, 128, "%.d", 2); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "2"); + + res = g_snprintf (buf, 128, "%d", -1); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "-1"); + + res = g_snprintf (buf, 128, "%.3d", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%.3d", -5); + g_assert_cmpint (res, ==, 4); + g_assert_cmpstr (buf, ==, "-005"); + + res = g_snprintf (buf, 128, "%5.3d", 5); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " 005"); + + res = g_snprintf (buf, 128, "%-5.3d", -5); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "-005 "); + + /* %d, length modifiers */ + + res = g_snprintf (buf, 128, "%" G_GINT16_FORMAT, (gint16)-5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "-5"); + + res = g_snprintf (buf, 128, "%" G_GUINT16_FORMAT, (guint16)5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%" G_GINT32_FORMAT, (gint32)-5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "-5"); + + res = g_snprintf (buf, 128, "%" G_GUINT32_FORMAT, (guint32)5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "-5"); + + res = g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%" G_GSSIZE_FORMAT, (gssize)-5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "-5"); + + res = g_snprintf (buf, 128, "%" G_GSIZE_FORMAT, (gsize)5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + /* %d, flags */ + + res = g_snprintf (buf, 128, "%-d", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%-+d", 5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "+5"); + + res = g_snprintf (buf, 128, "%+-d", 5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "+5"); + + res = g_snprintf (buf, 128, "%+d", -5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "-5"); + + res = g_snprintf (buf, 128, "% d", 5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, " 5"); + + res = g_snprintf (buf, 128, "% .0d", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, " "); + + res = g_snprintf (buf, 128, "%03d", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%03d", -5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "-05"); + + /* gcc emits warnings for the following formats, since the C spec + * says some of the flags must be ignored. (The " " in "% +d" and + * the "0" in "%-03d".) But we need to test that our printf gets + * those rules right. So we fool gcc into not warning. + */ + fmt = "% +d"; + res = g_snprintf (buf, 128, fmt, 5); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "+5"); + + fmt = "%-03d"; + res = g_snprintf (buf, 128, fmt, -5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "-5 "); +} + +static void +test_o (void) +{ + gchar buf[128]; + gint res; + + /* %o basic formatting */ + + res = g_snprintf (buf, 128, "%o", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%o", 8); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "10"); + + res = g_snprintf (buf, 128, "%o", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); + + res = g_snprintf (buf, 128, "%.0o", 0); + g_assert_cmpint (res, ==, 0); + g_assert_cmpstr (buf, ==, ""); + + res = g_snprintf (buf, 128, "%.0o", 1); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "1"); + + res = g_snprintf (buf, 128, "%.3o", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%.3o", 8); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "010"); + + res = g_snprintf (buf, 128, "%5.3o", 5); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " 005"); +} + +static void +test_u (void) +{ + gchar buf[128]; + gint res; + + /* %u, basic formatting */ + + res = g_snprintf (buf, 128, "%u", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%u", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); + + res = g_snprintf (buf, 128, "%.0u", 0); + g_assert_cmpint (res, ==, 0); + g_assert_cmpstr (buf, ==, ""); + + res = g_snprintf (buf, 128, "%.0u", 1); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "1"); + + res = g_snprintf (buf, 128, "%.3u", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%5.3u", 5); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " 005"); +} + +static void +test_x (void) +{ + gchar buf[128]; + gint res; + + /* %x, basic formatting */ + + res = g_snprintf (buf, 128, "%x", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%x", 31); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "1f"); + + res = g_snprintf (buf, 128, "%x", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); + + res = g_snprintf (buf, 128, "%.0x", 0); + g_assert_cmpint (res, ==, 0); + g_assert_cmpstr (buf, ==, ""); + + res = g_snprintf (buf, 128, "%.0x", 1); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "1"); + + res = g_snprintf (buf, 128, "%.3x", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%.3x", 31); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "01f"); + + res = g_snprintf (buf, 128, "%5.3x", 5); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " 005"); + + /* %x, flags */ + + res = g_snprintf (buf, 128, "%-x", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%03x", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%#x", 31); + g_assert_cmpint (res, ==, 4); + g_assert_cmpstr (buf, ==, "0x1f"); + + res = g_snprintf (buf, 128, "%#x", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); +} + +static void +test_X (void) +{ + gchar buf[128]; + gint res; + + /* %X, basic formatting */ + + res = g_snprintf (buf, 128, "%X", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%X", 31); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "1F"); + + res = g_snprintf (buf, 128, "%X", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); + + res = g_snprintf (buf, 128, "%.0X", 0); + g_assert_cmpint (res, ==, 0); + g_assert_cmpstr (buf, ==, ""); + + res = g_snprintf (buf, 128, "%.0X", 1); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "1"); + + res = g_snprintf (buf, 128, "%.3X", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%.3X", 31); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "01F"); + + res = g_snprintf (buf, 128, "%5.3X", 5); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " 005"); + + /* %X, flags */ + + res = g_snprintf (buf, 128, "%-X", 5); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "5"); + + res = g_snprintf (buf, 128, "%03X", 5); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "005"); + + res = g_snprintf (buf, 128, "%#X", 31); + g_assert_cmpint (res, ==, 4); + g_assert_cmpstr (buf, ==, "0X1F"); + + res = g_snprintf (buf, 128, "%#X", 0); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "0"); +} + +static void +test_f (void) +{ + gchar buf[128]; + gint res; + + /* %f, basic formattting */ + + res = g_snprintf (buf, 128, "%f", G_PI); + g_assert_cmpint (res, ==, 8); + g_assert (0 == strncmp (buf, "3.14159", 7)); + + res = g_snprintf (buf, 128, "%.8f", G_PI); + g_assert_cmpint (res, ==, 10); + g_assert (0 == strncmp (buf, "3.1415926", 9)); + + res = g_snprintf (buf, 128, "%.0f", G_PI); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "3"); + + res = g_snprintf (buf, 128, "%1.f", G_PI); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "3"); + + res = g_snprintf (buf, 128, "%3.f", G_PI); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, " 3"); + + /* %f, flags */ + + res = g_snprintf (buf, 128, "%+f", G_PI); + g_assert_cmpint (res, ==, 9); + g_assert (0 == strncmp (buf, "+3.14159", 8)); + + res = g_snprintf (buf, 128, "% f", G_PI); + g_assert_cmpint (res, ==, 9); + g_assert (0 == strncmp (buf, " 3.14159", 8)); + + res = g_snprintf (buf, 128, "%#.0f", G_PI); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "3."); + + res = g_snprintf (buf, 128, "%05.2f", G_PI); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "03.14"); +} + +static gboolean +same_value (const gchar *actual, + const gchar *expected) +{ + gdouble actual_value, expected_value; + + actual_value = g_ascii_strtod (actual, NULL); + expected_value = g_ascii_strtod (expected, NULL); + + return actual_value == expected_value; +} + +static void +test_e (void) +{ + gchar buf[128]; + gint res; + + /* %e, basic formatting */ + /* for %e we can't expect to reproduce exact strings and lengths, since SUS + * only guarantees that the exponent shall always contain at least two + * digits. On Windows, it seems to be at least three digits long. + * Therefore, we compare the results of parsing the expected result and the + * actual result. + */ + + res = g_snprintf (buf, 128, "%e", G_PI); + g_assert_cmpint (res, >=, 12); + g_assert (same_value (buf, "3.141593e+00")); + + res = g_snprintf (buf, 128, "%.8e", G_PI); + g_assert_cmpint (res, >=, 14); + g_assert (same_value (buf, "3.14159265e+00")); + + res = g_snprintf (buf, 128, "%.0e", G_PI); + g_assert_cmpint (res, >=, 5); + g_assert (same_value (buf, "3e+00")); + + res = g_snprintf (buf, 128, "%.1e", 0.0); + g_assert_cmpint (res, >=, 7); + g_assert (same_value (buf, "0.0e+00")); + + res = g_snprintf (buf, 128, "%.1e", 0.00001); + g_assert_cmpint (res, >=, 7); + g_assert (same_value (buf, "1.0e-05")); + + res = g_snprintf (buf, 128, "%.1e", 10000.0); + g_assert_cmpint (res, >=, 7); + g_assert (same_value (buf, "1.0e+04")); + + /* %e, flags */ + + res = g_snprintf (buf, 128, "%+e", G_PI); + g_assert_cmpint (res, >=, 13); + g_assert (same_value (buf, "+3.141593e+00")); + + res = g_snprintf (buf, 128, "% e", G_PI); + g_assert_cmpint (res, >=, 13); + g_assert (same_value (buf, " 3.141593e+00")); + + res = g_snprintf (buf, 128, "%#.0e", G_PI); + g_assert_cmpint (res, >=, 6); + g_assert (same_value (buf, "3.e+00")); + + res = g_snprintf (buf, 128, "%09.2e", G_PI); + g_assert_cmpint (res, >=, 9); + g_assert (same_value (buf, "03.14e+00")); +} + +static void +test_c (void) +{ + gchar buf[128]; + gint res; + + res = g_snprintf (buf, 128, "%c", 'a'); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "a"); +} + +static void +test_s (void) +{ + gchar buf[128]; + gint res; + + res = g_snprintf (buf, 128, "%.2s", "abc"); + g_assert_cmpint (res, ==, 2); + g_assert_cmpstr (buf, ==, "ab"); + + res = g_snprintf (buf, 128, "%.6s", "abc"); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "abc"); + + res = g_snprintf (buf, 128, "%5s", "abc"); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " abc"); + + res = g_snprintf (buf, 128, "%-5s", "abc"); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "abc "); + + res = g_snprintf (buf, 128, "%5.2s", "abc"); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " ab"); + + res = g_snprintf (buf, 128, "%*s", 5, "abc"); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " abc"); + +#if 0 /* HP-UX doesn't get this right */ + res = g_snprintf (buf, 128, "%*s", -5, "abc"); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "abc "); +#endif + + res = g_snprintf (buf, 128, "%*.*s", 5, 2, "abc"); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " ab"); +} + +static void +test_n (void) +{ + gchar buf[128]; + gint res; + gint i; + glong l; + + res = g_snprintf (buf, 128, "abc%n", &i); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "abc"); + g_assert_cmpint (i, ==, 3); + + res = g_snprintf (buf, 128, "abc%ln", &l); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "abc"); + g_assert_cmpint (l, ==, 3); +} + +static void +test_percent (void) +{ + gchar buf[128]; + gint res; + + res = g_snprintf (buf, 128, "%%"); + g_assert_cmpint (res, ==, 1); + g_assert_cmpstr (buf, ==, "%"); +} + +static void +test_positional_params (void) +{ + gchar buf[128]; + gint res; + + res = g_snprintf (buf, 128, "%2$c %1$c", 'b', 'a'); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "a b"); + + res = g_snprintf (buf, 128, "%1$*2$.*3$s", "abc", 5, 2); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " ab"); + + res = g_snprintf (buf, 128, "%1$s%1$s", "abc"); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "abcabc"); +} + +static void +test_64bit (void) +{ + gchar buf[128]; + gint res; + + res = g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)123456); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "123456"); + + res = g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-123456); + g_assert_cmpint (res, ==, 7); + g_assert_cmpstr (buf, ==, "-123456"); + + res = g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)123456); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "123456"); + + res = g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "o", (gint64)123456); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "361100"); + + res = g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "o", (gint64)123456); + g_assert_cmpint (res, ==, 7); + g_assert_cmpstr (buf, ==, "0361100"); + + res = g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "x", (gint64)123456); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "1e240"); + + res = g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "x", (gint64)123456); + g_assert_cmpint (res, ==, 7); + g_assert_cmpstr (buf, ==, "0x1e240"); + + res = g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "X", (gint64)123456); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "1E240"); + +#ifdef G_OS_WIN32 + /* On Win32, test that the "ll" modifier also works, for backward + * compatibility. One really should use the G_GINT64_MODIFIER (which + * on Win32 is the "I64" that the (msvcrt) C library's printf uses), + * but "ll" used to work with the "trio" g_printf implementation in + * GLib 2.2, so it's best if it continues to work. + */ + + res = g_snprintf (buf, 128, "%" "lli", (gint64)123456); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "123456"); + + res = g_snprintf (buf, 128, "%" "lli", (gint64)-123456); + g_assert_cmpint (res, ==, 7); + g_assert_cmpstr (buf, ==, "-123456"); + + res = g_snprintf (buf, 128, "%" "llu", (guint64)123456); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "123456"); + + res = g_snprintf (buf, 128, "%" "ll" "o", (gint64)123456); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "361100"); + + res = g_snprintf (buf, 128, "%#" "ll" "o", (gint64)123456); + g_assert_cmpint (res, ==, 7); + g_assert_cmpstr (buf, ==, "0361100"); + + res = g_snprintf (buf, 128, "%" "ll" "x", (gint64)123456); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "1e240"); + + res = g_snprintf (buf, 128, "%#" "ll" "x", (gint64)123456); + g_assert_cmpint (res, ==, 7); + g_assert_cmpstr (buf, ==, "0x1e240"); + + res = g_snprintf (buf, 128, "%" "ll" "X", (gint64)123456); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, "1E240"); +#endif +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/printf/test-retval-and-trunc", test_retval_and_trunc); + g_test_add_func ("/printf/test-d", test_d); + g_test_add_func ("/printf/test-o", test_o); + g_test_add_func ("/printf/test-u", test_u); + g_test_add_func ("/printf/test-x", test_x); + g_test_add_func ("/printf/test-X", test_X); + g_test_add_func ("/printf/test-f", test_f); + g_test_add_func ("/printf/test-e", test_e); + g_test_add_func ("/printf/test-c", test_c); + g_test_add_func ("/printf/test-s", test_s); + g_test_add_func ("/printf/test-n", test_n); + g_test_add_func ("/printf/test-percent", test_percent); + g_test_add_func ("/printf/test-positional-params", test_positional_params); + g_test_add_func ("/printf/test-64bit", test_64bit); + + return g_test_run(); +} diff --git a/glib/tests/rand.c b/glib/tests/rand.c new file mode 100644 index 0000000..62b5f75 --- /dev/null +++ b/glib/tests/rand.c @@ -0,0 +1,160 @@ +/* Unit tests for grand + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include "glib.h" + +/* Outputs tested against the reference implementation mt19937ar.c from + http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html */ + +/* Tests for a simple seed, first number is the seed */ +const guint32 first_numbers[] = +{ + 0x7a7a7a7a, + 0xfdcc2d54, + 0x3a279ceb, + 0xc4d39c33, + 0xf31895cd, + 0x46ca0afc, + 0x3f5484ff, + 0x54bc9557, + 0xed2c24b1, + 0x84062503, + 0x8f6404b3, + 0x599a94b3, + 0xe46d03d5, + 0x310beb78, + 0x7bee5d08, + 0x760d09be, + 0x59b6e163, + 0xbf6d16ec, + 0xcca5fb54, + 0x5de7259b, + 0x1696330c, +}; + +/* array seed */ +const guint32 seed_array[] = +{ + 0x6553375f, + 0xd6b8d43b, + 0xa1e7667f, + 0x2b10117c +}; + +/* tests for the array seed */ +const guint32 array_outputs[] = +{ + 0xc22b7dc3, + 0xfdecb8ae, + 0xb4af0738, + 0x516bc6e1, + 0x7e372e91, + 0x2d38ff80, + 0x6096494a, + 0xd162d5a8, + 0x3c0aaa0d, + 0x10e736ae +}; + +static void +test_rand (void) +{ + guint n; + guint ones; + double proportion; + GRand *rand; + GRand *copy; + + rand = g_rand_new_with_seed (first_numbers[0]); + + for (n = 1; n < G_N_ELEMENTS (first_numbers); n++) + g_assert (first_numbers[n] == g_rand_int (rand)); + + g_rand_set_seed (rand, 2); + g_rand_set_seed_array (rand, seed_array, G_N_ELEMENTS (seed_array)); + + for (n = 0; n < G_N_ELEMENTS (array_outputs); n++) + g_assert (array_outputs[n] == g_rand_int (rand)); + + copy = g_rand_copy (rand); + for (n = 0; n < 100; n++) + g_assert (g_rand_int (copy) == g_rand_int (rand)); + + for (n = 1; n < 100000; n++) + { + gint32 i; + gdouble d; + gboolean b; + + i = g_rand_int_range (rand, 8,16); + g_assert (i >= 8 && i < 16); + + i = g_random_int_range (8,16); + g_assert (i >= 8 && i < 16); + + d = g_rand_double (rand); + g_assert (d >= 0 && d < 1); + + d = g_random_double (); + g_assert (d >= 0 && d < 1); + + d = g_rand_double_range (rand, -8, 32); + g_assert (d >= -8 && d < 32); + + d = g_random_double_range (-8, 32); + g_assert (d >= -8 && d < 32); + + b = g_random_boolean (); + g_assert (b == TRUE || b == FALSE); + + b = g_rand_boolean (rand); + g_assert (b == TRUE || b == FALSE); + } + + /* Statistical sanity check, count the number of ones + * when getting random numbers in range [0,3) and see + * that it must be semi-close to 0.25 with a VERY large + * probability */ + ones = 0; + for (n = 1; n < 100000; n++) + { + if (g_random_int_range (0, 4) == 1) + ones ++; + } + + proportion = (double)ones / (double)100000; + /* 0.025 is overkill, but should suffice to test for some unreasonability */ + g_assert (ABS (proportion - 0.25) < 0.025); + + g_rand_free (rand); + g_rand_free (copy); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/rand/test-rand", test_rand); + + return g_test_run(); +} diff --git a/glib/tests/strfuncs.c b/glib/tests/strfuncs.c new file mode 100644 index 0000000..8928ae6 --- /dev/null +++ b/glib/tests/strfuncs.c @@ -0,0 +1,1241 @@ +/* Unit tests for gstrfuncs + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "glib.h" + +#define GLIB_TEST_STRING "el dorado " + +#define FOR_ALL_CTYPE(macro) \ + macro(isalnum) \ + macro(isalpha) \ + macro(iscntrl) \ + macro(isdigit) \ + macro(isgraph) \ + macro(islower) \ + macro(isprint) \ + macro(ispunct) \ + macro(isspace) \ + macro(isupper) \ + macro(isxdigit) + +#define DEFINE_CALL_CTYPE(function) \ + static int \ + call_##function (int c) \ + { \ + return function (c); \ + } + +#define DEFINE_CALL_G_ASCII_CTYPE(function) \ + static gboolean \ + call_g_ascii_##function (gchar c) \ + { \ + return g_ascii_##function (c); \ + } + +FOR_ALL_CTYPE (DEFINE_CALL_CTYPE) +FOR_ALL_CTYPE (DEFINE_CALL_G_ASCII_CTYPE) + +static void +test_is_function (const char *name, + gboolean (* ascii_function) (gchar), + int (* c_library_function) (int), + gboolean (* unicode_function) (gunichar)) +{ + int c; + + for (c = 0; c <= 0x7F; c++) + { + gboolean ascii_result = ascii_function ((gchar)c); + gboolean c_library_result = c_library_function (c) != 0; + gboolean unicode_result = unicode_function ((gunichar) c); + if (ascii_result != c_library_result && c != '\v') + { + g_error ("g_ascii_%s returned %d and %s returned %d for 0x%X", + name, ascii_result, name, c_library_result, c); + } + if (ascii_result != unicode_result) + { + g_error ("g_ascii_%s returned %d and g_unichar_%s returned %d for 0x%X", + name, ascii_result, name, unicode_result, c); + } + } + for (c = 0x80; c <= 0xFF; c++) + { + gboolean ascii_result = ascii_function ((gchar)c); + if (ascii_result) + { + g_error ("g_ascii_%s returned TRUE for 0x%X", name, c); + } + } +} + +static void +test_to_function (const char *name, + gchar (* ascii_function) (gchar), + int (* c_library_function) (int), + gunichar (* unicode_function) (gunichar)) +{ + int c; + + for (c = 0; c <= 0x7F; c++) + { + int ascii_result = (guchar) ascii_function ((gchar) c); + int c_library_result = c_library_function (c); + int unicode_result = unicode_function ((gunichar) c); + if (ascii_result != c_library_result) + { + g_error ("g_ascii_%s returned 0x%X and %s returned 0x%X for 0x%X", + name, ascii_result, name, c_library_result, c); + } + if (ascii_result != unicode_result) + { + g_error ("g_ascii_%s returned 0x%X and g_unichar_%s returned 0x%X for 0x%X", + name, ascii_result, name, unicode_result, c); + } + } + for (c = 0x80; c <= 0xFF; c++) + { + int ascii_result = (guchar) ascii_function ((gchar) c); + if (ascii_result != c) + { + g_error ("g_ascii_%s returned 0x%X for 0x%X", + name, ascii_result, c); + } + } +} + +static void +test_digit_function (const char *name, + int (* ascii_function) (gchar), + int (* unicode_function) (gunichar)) +{ + int c; + + for (c = 0; c <= 0x7F; c++) + { + int ascii_result = ascii_function ((gchar) c); + int unicode_result = unicode_function ((gunichar) c); + if (ascii_result != unicode_result) + { + g_error ("g_ascii_%s_value returned %d and g_unichar_%s_value returned %d for 0x%X", + name, ascii_result, name, unicode_result, c); + } + } + for (c = 0x80; c <= 0xFF; c++) + { + int ascii_result = ascii_function ((gchar) c); + if (ascii_result != -1) + { + g_error ("g_ascii_%s_value returned %d for 0x%X", + name, ascii_result, c); + } + } +} + +static void +test_is_to_digit (void) +{ + #define TEST_IS(name) test_is_function (#name, call_g_ascii_##name, call_##name, g_unichar_##name); + + FOR_ALL_CTYPE(TEST_IS) + + #undef TEST_IS + + #define TEST_TO(name) test_to_function (#name, g_ascii_##name, name, g_unichar_##name) + + TEST_TO (tolower); + TEST_TO (toupper); + + #undef TEST_TO + + #define TEST_DIGIT(name) test_digit_function (#name, g_ascii_##name##_value, g_unichar_##name##_value) + + TEST_DIGIT (digit); + TEST_DIGIT (xdigit); + + #undef TEST_DIGIT +} + +static void +test_strdup (void) +{ + gchar *str; + + str = g_strdup (NULL); + g_assert (str == NULL); + + str = g_strdup (GLIB_TEST_STRING); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, GLIB_TEST_STRING); + g_free (str); +} + +static void +test_strndup (void) +{ + gchar *str; + + str = g_strndup (NULL, 3); + g_assert (str == NULL); + + str = g_strndup ("aaaa", 5); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "aaaa"); + g_free (str); + + str = g_strndup ("aaaa", 2); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "aa"); + g_free (str); +} + +static void +test_strdup_printf (void) +{ + gchar *str; + + str = g_strdup_printf ("%05d %-5s", 21, "test"); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "00021 test "); + g_free (str); +} + +static void +test_strdupv (void) +{ + gchar *vec[] = { "Foo", "Bar", NULL }; + gchar **copy; + + copy = g_strdupv (NULL); + g_assert (copy == NULL); + + copy = g_strdupv (vec); + g_assert (copy != NULL); + g_assert_cmpstr (copy[0], ==, "Foo"); + g_assert_cmpstr (copy[1], ==, "Bar"); + g_assert (copy[2] == NULL); + g_strfreev (copy); +} + +static void +test_strnfill (void) +{ + gchar *str; + + str = g_strnfill (0, 'a'); + g_assert (str != NULL); + g_assert (*str == '\0'); + g_free (str); + + str = g_strnfill (5, 'a'); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "aaaaa"); + g_free (str); +} + +static void +test_strconcat (void) +{ + gchar *str; + + str = g_strconcat (GLIB_TEST_STRING, NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, GLIB_TEST_STRING); + g_free (str); + + str = g_strconcat (GLIB_TEST_STRING, + GLIB_TEST_STRING, + GLIB_TEST_STRING, + NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, GLIB_TEST_STRING GLIB_TEST_STRING GLIB_TEST_STRING); + g_free (str); +} + +static void +test_strjoin (void) +{ + gchar *str; + + str = g_strjoin (NULL, NULL); + g_assert (str != NULL); + g_assert (*str == '\0'); + g_free (str); + + str = g_strjoin (":", NULL); + g_assert (str != NULL); + g_assert (*str == '\0'); + g_free (str); + + str = g_strjoin (NULL, GLIB_TEST_STRING, NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, GLIB_TEST_STRING); + g_free (str); + + str = g_strjoin (NULL, + GLIB_TEST_STRING, + GLIB_TEST_STRING, + GLIB_TEST_STRING, + NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, GLIB_TEST_STRING GLIB_TEST_STRING GLIB_TEST_STRING); + g_free (str); + + str = g_strjoin (":", + GLIB_TEST_STRING, + GLIB_TEST_STRING, + GLIB_TEST_STRING, + NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, GLIB_TEST_STRING ":" GLIB_TEST_STRING ":" GLIB_TEST_STRING); + g_free (str); +} + +static void +test_strcanon (void) +{ + gchar *str; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + str = g_strcanon (NULL, "ab", 'y'); + } + g_test_trap_assert_failed (); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + str = g_strdup ("abxabxab"); + str = g_strcanon (str, NULL, 'y'); + g_free (str); + } + g_test_trap_assert_failed (); + + str = g_strdup ("abxabxab"); + str = g_strcanon (str, "ab", 'y'); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abyabyab"); + g_free (str); +} + +static void +test_strcompress_strescape (void) +{ + gchar *str; + gchar *tmp; + + /* test compress */ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + str = g_strcompress (NULL); + } + g_test_trap_assert_failed (); + + /* trailing slashes are not allowed */ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + str = g_strcompress ("abc\\"); + } + g_test_trap_assert_failed (); + + str = g_strcompress ("abc\\\\\\\"\\b\\f\\n\\r\\t\\003\\177\\234\\313\\12345z"); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\"\b\f\n\r\t\003\177\234\313\12345z"); + g_free (str); + + /* test escape */ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + str = g_strescape (NULL, NULL); + } + g_test_trap_assert_failed (); + + str = g_strescape ("abc\\\"\b\f\n\r\t\003\177\234\313", NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\\\\\"\\b\\f\\n\\r\\t\\003\\177\\234\\313"); + g_free (str); + + str = g_strescape ("abc\\\"\b\f\n\r\t\003\177\234\313", + "\b\f\001\002\003\004"); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\\\\\"\b\f\\n\\r\\t\003\\177\\234\\313"); + g_free (str); + + /* round trip */ + tmp = g_strescape ("abc\\\"\b\f\n\r\t\003\177\234\313", NULL); + str = g_strcompress (tmp); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\"\b\f\n\r\t\003\177\234\313"); + g_free (str); + g_free (tmp); +} + +static void +test_ascii_strcasecmp (void) +{ + gboolean res; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_ascii_strcasecmp ("foo", NULL); + } + g_test_trap_assert_failed (); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_ascii_strcasecmp (NULL, "foo"); + } + g_test_trap_assert_failed (); + + res = g_ascii_strcasecmp ("FroboZZ", "frobozz"); + g_assert_cmpint (res, ==, 0); + + res = g_ascii_strcasecmp ("frobozz", "frobozz"); + g_assert_cmpint (res, ==, 0); + + res = g_ascii_strcasecmp ("frobozz", "FROBOZZ"); + g_assert_cmpint (res, ==, 0); + + res = g_ascii_strcasecmp ("FROBOZZ", "froboz"); + g_assert_cmpint (res, !=, 0); + + res = g_ascii_strcasecmp ("", ""); + g_assert_cmpint (res, ==, 0); + + res = g_ascii_strcasecmp ("!#%&/()", "!#%&/()"); + g_assert_cmpint (res, ==, 0); + + res = g_ascii_strcasecmp ("a", "b"); + g_assert_cmpint (res, <, 0); + + res = g_ascii_strcasecmp ("a", "B"); + g_assert_cmpint (res, <, 0); + + res = g_ascii_strcasecmp ("A", "b"); + g_assert_cmpint (res, <, 0); + + res = g_ascii_strcasecmp ("A", "B"); + g_assert_cmpint (res, <, 0); + + res = g_ascii_strcasecmp ("b", "a"); + g_assert_cmpint (res, >, 0); + + res = g_ascii_strcasecmp ("b", "A"); + g_assert_cmpint (res, >, 0); + + res = g_ascii_strcasecmp ("B", "a"); + g_assert_cmpint (res, >, 0); + + res = g_ascii_strcasecmp ("B", "A"); + g_assert_cmpint (res, >, 0); +} + +static void +do_test_strchug (const gchar *str, const gchar *expected) +{ + gchar *tmp; + gboolean res; + + tmp = g_strdup (str); + + g_strchug (tmp); + res = (strcmp (tmp, expected) == 0); + g_free (tmp); + + g_assert_cmpint (res, ==, TRUE); +} + +static void +test_strchug (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_strchug (NULL); + } + g_test_trap_assert_failed (); + + do_test_strchug ("", ""); + do_test_strchug (" ", ""); + do_test_strchug ("\t\r\n ", ""); + do_test_strchug (" a", "a"); + do_test_strchug (" a", "a"); + do_test_strchug ("a a", "a a"); + do_test_strchug (" a a", "a a"); +} + +static void +do_test_strchomp (const gchar *str, const gchar *expected) +{ + gchar *tmp; + gboolean res; + + tmp = g_strdup (str); + + g_strchomp (tmp); + res = (strcmp (tmp, expected) == 0); + g_free (tmp); + + g_assert_cmpint (res, ==, TRUE); +} + +static void +test_strchomp (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_strchomp (NULL); + } + g_test_trap_assert_failed (); + + do_test_strchomp ("", ""); + do_test_strchomp (" ", ""); + do_test_strchomp (" \t\r\n", ""); + do_test_strchomp ("a ", "a"); + do_test_strchomp ("a ", "a"); + do_test_strchomp ("a a", "a a"); + do_test_strchomp ("a a ", "a a"); +} + +static void +test_strreverse (void) +{ + gchar *str; + gchar *p; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + str = g_strreverse (NULL); + } + g_test_trap_assert_failed (); + + str = p = g_strdup ("abcde"); + str = g_strreverse (str); + g_assert (str != NULL); + g_assert (p == str); + g_assert_cmpstr (str, ==, "edcba"); + g_free (str); +} + +static void +test_strstr (void) +{ + gchar *haystack; + gchar *res; + + haystack = g_strdup ("FooBarFooBarFoo"); + + /* strstr_len */ + res = g_strstr_len (haystack, 6, "xxx"); + g_assert (res == NULL); + + res = g_strstr_len (haystack, 6, "FooBarFooBarFooBar"); + g_assert (res == NULL); + + res = g_strstr_len (haystack, 3, "Bar"); + g_assert (res == NULL); + + res = g_strstr_len (haystack, 6, ""); + g_assert (res == haystack); + g_assert_cmpstr (res, ==, "FooBarFooBarFoo"); + + res = g_strstr_len (haystack, 6, "Bar"); + g_assert (res == haystack + 3); + g_assert_cmpstr (res, ==, "BarFooBarFoo"); + + res = g_strstr_len (haystack, -1, "Bar"); + g_assert (res == haystack + 3); + g_assert_cmpstr (res, ==, "BarFooBarFoo"); + + /* strrstr */ + res = g_strrstr (haystack, "xxx"); + g_assert (res == NULL); + + res = g_strrstr (haystack, "FooBarFooBarFooBar"); + g_assert (res == NULL); + + res = g_strrstr (haystack, ""); + g_assert (res == haystack); + g_assert_cmpstr (res, ==, "FooBarFooBarFoo"); + + res = g_strrstr (haystack, "Bar"); + g_assert (res == haystack + 9); + g_assert_cmpstr (res, ==, "BarFoo"); + + /* strrstr_len */ + res = g_strrstr_len (haystack, 14, "xxx"); + g_assert (res == NULL); + + res = g_strrstr_len (haystack, 14, "FooBarFooBarFooBar"); + g_assert (res == NULL); + + res = g_strrstr_len (haystack, 3, "Bar"); + g_assert (res == NULL); + + res = g_strrstr_len (haystack, 14, "BarFoo"); + g_assert (res == haystack + 3); + g_assert_cmpstr (res, ==, "BarFooBarFoo"); + + res = g_strrstr_len (haystack, 15, "BarFoo"); + g_assert (res == haystack + 9); + g_assert_cmpstr (res, ==, "BarFoo"); + + res = g_strrstr_len (haystack, -1, "BarFoo"); + g_assert (res == haystack + 9); + g_assert_cmpstr (res, ==, "BarFoo"); + + /* test case for strings with \0 in the middle */ + *(haystack + 7) = '\0'; + res = g_strstr_len (haystack, 15, "BarFoo"); + g_assert (res == NULL); + + g_free (haystack); +} + +static void +test_has_prefix (void) +{ + gboolean res; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_str_has_prefix ("foo", NULL); + } + g_test_trap_assert_failed (); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_str_has_prefix (NULL, "foo"); + } + g_test_trap_assert_failed (); + + res = g_str_has_prefix ("foo", "bar"); + g_assert_cmpint (res, ==, FALSE); + + res = g_str_has_prefix ("foo", "foobar"); + g_assert_cmpint (res, ==, FALSE); + + res = g_str_has_prefix ("foobar", "bar"); + g_assert_cmpint (res, ==, FALSE); + + res = g_str_has_prefix ("foobar", "foo"); + g_assert_cmpint (res, ==, TRUE); + + res = g_str_has_prefix ("foo", ""); + g_assert_cmpint (res, ==, TRUE); + + res = g_str_has_prefix ("foo", "foo"); + g_assert_cmpint (res, ==, TRUE); + + res = g_str_has_prefix ("", ""); + g_assert_cmpint (res, ==, TRUE); +} + +static void +test_has_suffix (void) +{ + gboolean res; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_str_has_suffix ("foo", NULL); + } + g_test_trap_assert_failed (); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_str_has_suffix (NULL, "foo"); + } + g_test_trap_assert_failed (); + + res = g_str_has_suffix ("foo", "bar"); + g_assert_cmpint (res, ==, FALSE); + + res = g_str_has_suffix ("bar", "foobar"); + g_assert_cmpint (res, ==, FALSE); + + res = g_str_has_suffix ("foobar", "foo"); + g_assert_cmpint (res, ==, FALSE); + + res = g_str_has_suffix ("foobar", "bar"); + g_assert_cmpint (res, ==, TRUE); + + res = g_str_has_suffix ("foo", ""); + g_assert_cmpint (res, ==, TRUE); + + res = g_str_has_suffix ("foo", "foo"); + g_assert_cmpint (res, ==, TRUE); + + res = g_str_has_suffix ("", ""); + g_assert_cmpint (res, ==, TRUE); +} + +static void +strv_check (gchar **strv, ...) +{ + gboolean ok = TRUE; + gint i = 0; + va_list list; + + va_start (list, strv); + while (ok) + { + const gchar *str = va_arg (list, const char *); + if (strv[i] == NULL) + { + g_assert (str == NULL); + break; + } + if (str == NULL) + { + ok = FALSE; + } + else + { + g_assert_cmpstr (strv[i], ==, str); + } + i++; + } + va_end (list); + + g_strfreev (strv); +} + +static void +test_strsplit (void) +{ + strv_check (g_strsplit ("", ",", 0), NULL); + strv_check (g_strsplit ("x", ",", 0), "x", NULL); + strv_check (g_strsplit ("x,y", ",", 0), "x", "y", NULL); + strv_check (g_strsplit ("x,y,", ",", 0), "x", "y", "", NULL); + strv_check (g_strsplit (",x,y", ",", 0), "", "x", "y", NULL); + strv_check (g_strsplit (",x,y,", ",", 0), "", "x", "y", "", NULL); + strv_check (g_strsplit ("x,y,z", ",", 0), "x", "y", "z", NULL); + strv_check (g_strsplit ("x,y,z,", ",", 0), "x", "y", "z", "", NULL); + strv_check (g_strsplit (",x,y,z", ",", 0), "", "x", "y", "z", NULL); + strv_check (g_strsplit (",x,y,z,", ",", 0), "", "x", "y", "z", "", NULL); + strv_check (g_strsplit (",,x,,y,,z,,", ",", 0), "", "", "x", "", "y", "", "z", "", "", NULL); + strv_check (g_strsplit (",,x,,y,,z,,", ",,", 0), "", "x", "y", "z", "", NULL); + + strv_check (g_strsplit ("", ",", 1), NULL); + strv_check (g_strsplit ("x", ",", 1), "x", NULL); + strv_check (g_strsplit ("x,y", ",", 1), "x,y", NULL); + strv_check (g_strsplit ("x,y,", ",", 1), "x,y,", NULL); + strv_check (g_strsplit (",x,y", ",", 1), ",x,y", NULL); + strv_check (g_strsplit (",x,y,", ",", 1), ",x,y,", NULL); + strv_check (g_strsplit ("x,y,z", ",", 1), "x,y,z", NULL); + strv_check (g_strsplit ("x,y,z,", ",", 1), "x,y,z,", NULL); + strv_check (g_strsplit (",x,y,z", ",", 1), ",x,y,z", NULL); + strv_check (g_strsplit (",x,y,z,", ",", 1), ",x,y,z,", NULL); + strv_check (g_strsplit (",,x,,y,,z,,", ",", 1), ",,x,,y,,z,,", NULL); + strv_check (g_strsplit (",,x,,y,,z,,", ",,", 1), ",,x,,y,,z,,", NULL); + + strv_check (g_strsplit ("", ",", 2), NULL); + strv_check (g_strsplit ("x", ",", 2), "x", NULL); + strv_check (g_strsplit ("x,y", ",", 2), "x", "y", NULL); + strv_check (g_strsplit ("x,y,", ",", 2), "x", "y,", NULL); + strv_check (g_strsplit (",x,y", ",", 2), "", "x,y", NULL); + strv_check (g_strsplit (",x,y,", ",", 2), "", "x,y,", NULL); + strv_check (g_strsplit ("x,y,z", ",", 2), "x", "y,z", NULL); + strv_check (g_strsplit ("x,y,z,", ",", 2), "x", "y,z,", NULL); + strv_check (g_strsplit (",x,y,z", ",", 2), "", "x,y,z", NULL); + strv_check (g_strsplit (",x,y,z,", ",", 2), "", "x,y,z,", NULL); + strv_check (g_strsplit (",,x,,y,,z,,", ",", 2), "", ",x,,y,,z,,", NULL); + strv_check (g_strsplit (",,x,,y,,z,,", ",,", 2), "", "x,,y,,z,,", NULL); +} + +static void +test_strsplit_set (void) +{ + strv_check (g_strsplit_set ("", ",/", 0), NULL); + strv_check (g_strsplit_set (":def/ghi:", ":/", -1), "", "def", "ghi", "", NULL); + strv_check (g_strsplit_set ("abc:def/ghi", ":/", -1), "abc", "def", "ghi", NULL); + strv_check (g_strsplit_set (",;,;,;,;", ",;", -1), "", "", "", "", "", "", "", "", "", NULL); + strv_check (g_strsplit_set (",,abc.def", ".,", -1), "", "", "abc", "def", NULL); + + strv_check (g_strsplit_set (",x.y", ",.", 0), "", "x", "y", NULL); + strv_check (g_strsplit_set (".x,y,", ",.", 0), "", "x", "y", "", NULL); + strv_check (g_strsplit_set ("x,y.z", ",.", 0), "x", "y", "z", NULL); + strv_check (g_strsplit_set ("x.y,z,", ",.", 0), "x", "y", "z", "", NULL); + strv_check (g_strsplit_set (",x.y,z", ",.", 0), "", "x", "y", "z", NULL); + strv_check (g_strsplit_set (",x,y,z,", ",.", 0), "", "x", "y", "z", "", NULL); + strv_check (g_strsplit_set (",.x,,y,;z..", ".,;", 0), "", "", "x", "", "y", "", "z", "", "", NULL); + strv_check (g_strsplit_set (",,x,,y,,z,,", ",,", 0), "", "", "x", "", "y", "", "z", "", "", NULL); + + strv_check (g_strsplit_set ("x,y.z", ",.", 1), "x,y.z", NULL); + strv_check (g_strsplit_set ("x.y,z,", ",.", 1), "x.y,z,", NULL); + strv_check (g_strsplit_set (",x,y,z", ",.", 1), ",x,y,z", NULL); + strv_check (g_strsplit_set (",x,y.z,", ",.", 1), ",x,y.z,", NULL); + strv_check (g_strsplit_set (",,x,.y,,z,,", ",.", 1), ",,x,.y,,z,,", NULL); + strv_check (g_strsplit_set (",.x,,y,,z,,", ",,..", 1), ",.x,,y,,z,,", NULL); + + strv_check (g_strsplit_set ("", ",", 0), NULL); + strv_check (g_strsplit_set ("x", ",", 0), "x", NULL); + strv_check (g_strsplit_set ("x,y", ",", 0), "x", "y", NULL); + strv_check (g_strsplit_set ("x,y,", ",", 0), "x", "y", "", NULL); + strv_check (g_strsplit_set (",x,y", ",", 0), "", "x", "y", NULL); + strv_check (g_strsplit_set (",x,y,", ",", 0), "", "x", "y", "", NULL); + strv_check (g_strsplit_set ("x,y,z", ",", 0), "x", "y", "z", NULL); + strv_check (g_strsplit_set ("x,y,z,", ",", 0), "x", "y", "z", "", NULL); + strv_check (g_strsplit_set (",x,y,z", ",", 0), "", "x", "y", "z", NULL); + strv_check (g_strsplit_set (",x,y,z,", ",", 0), "", "x", "y", "z", "", NULL); + strv_check (g_strsplit_set (",,x,,y,,z,,", ",", 0), "", "", "x", "", "y", "", "z", "", "", NULL); + + strv_check (g_strsplit_set ("", ",", 1), NULL); + strv_check (g_strsplit_set ("x", ",", 1), "x", NULL); + strv_check (g_strsplit_set ("x,y", ",", 1), "x,y", NULL); + strv_check (g_strsplit_set ("x,y,", ",", 1), "x,y,", NULL); + strv_check (g_strsplit_set (",x,y", ",", 1), ",x,y", NULL); + strv_check (g_strsplit_set (",x,y,", ",", 1), ",x,y,", NULL); + strv_check (g_strsplit_set ("x,y,z", ",", 1), "x,y,z", NULL); + strv_check (g_strsplit_set ("x,y,z,", ",", 1), "x,y,z,", NULL); + strv_check (g_strsplit_set (",x,y,z", ",", 1), ",x,y,z", NULL); + strv_check (g_strsplit_set (",x,y,z,", ",", 1), ",x,y,z,", NULL); + strv_check (g_strsplit_set (",,x,,y,,z,,", ",", 1), ",,x,,y,,z,,", NULL); + strv_check (g_strsplit_set (",,x,,y,,z,,", ",,", 1), ",,x,,y,,z,,", NULL); + + strv_check (g_strsplit_set ("", ",", 2), NULL); + strv_check (g_strsplit_set ("x", ",", 2), "x", NULL); + strv_check (g_strsplit_set ("x,y", ",", 2), "x", "y", NULL); + strv_check (g_strsplit_set ("x,y,", ",", 2), "x", "y,", NULL); + strv_check (g_strsplit_set (",x,y", ",", 2), "", "x,y", NULL); + strv_check (g_strsplit_set (",x,y,", ",", 2), "", "x,y,", NULL); + strv_check (g_strsplit_set ("x,y,z", ",", 2), "x", "y,z", NULL); + strv_check (g_strsplit_set ("x,y,z,", ",", 2), "x", "y,z,", NULL); + strv_check (g_strsplit_set (",x,y,z", ",", 2), "", "x,y,z", NULL); + strv_check (g_strsplit_set (",x,y,z,", ",", 2), "", "x,y,z,", NULL); + strv_check (g_strsplit_set (",,x,,y,,z,,", ",", 2), "", ",x,,y,,z,,", NULL); + + strv_check (g_strsplit_set (",,x,.y,..z,,", ",.", 3), "", "", "x,.y,..z,,", NULL); +} + +static void +test_strv_length (void) +{ + guint l; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + l = g_strv_length (NULL); + } + g_test_trap_assert_failed (); + + l = g_strv_length (g_strsplit ("1,2,3,4", ",", -1)); + g_assert_cmpuint (l, ==, 4); +} + +static char *locales[] = {"sv_SE", "en_US", "fa_IR", "C", "ru_RU"}; + +void +check_strtod_string (gchar *number, + double res, + gboolean check_end, + gint correct_len) +{ + double d; + gint l; + gchar *dummy; + + /* we try a copy of number, with some free space for malloc before that. + * This is supposed to smash the some wrong pointer calculations. */ + + dummy = g_malloc (100000); + number = g_strdup (number); + g_free (dummy); + + for (l = 0; l < G_N_ELEMENTS (locales); l++) + { + gboolean ok; + gchar *end = "(unset)"; + + setlocale (LC_NUMERIC, locales[l]); + d = g_ascii_strtod (number, &end); + ok = isnan (res) ? isnan (d) : (d == res); + if (!ok) + { + g_error ("g_ascii_strtod on \"%s\" for locale %s failed\n" \ + "expected %f (nan %d) actual %f (nan %d)\n", + number, locales[l], + res, isnan (res), + d, isnan (d)); + } + + ok = (end - number) == (check_end ? correct_len : strlen (number)); + if (!ok) { + if (end == NULL) + g_error ("g_ascii_strtod on \"%s\" for locale %s endptr was NULL\n", + number, locales[l]); + else if (end >= number && end <= number + strlen (number)) + g_error ("g_ascii_strtod on \"%s\" for locale %s endptr was wrong, leftover: \"%s\"\n", + number, locales[l], end); + else + g_error ("g_ascii_strtod on \"%s\" for locale %s endptr was REALLY wrong (number=%p, end=%p)\n", + number, locales[l], number, end); + } + } + + g_free (number); +} + +static void +check_strtod_number (gdouble num, gchar *fmt, gchar *str) +{ + int l; + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; + + for (l = 0; l < G_N_ELEMENTS (locales); l++) + { + g_ascii_formatd (buf, G_ASCII_DTOSTR_BUF_SIZE, fmt, num); + g_assert_cmpstr (buf, ==, str); + } +} + +static void +test_strtod (void) +{ + gdouble d, our_nan, our_inf; + char buffer[G_ASCII_DTOSTR_BUF_SIZE]; + +#ifdef NAN + our_nan = NAN; +#else + /* Do this before any call to setlocale. */ + our_nan = atof ("NaN"); +#endif + g_assert (isnan (our_nan)); + +#ifdef INFINITY + our_inf = INFINITY; +#else + our_inf = atof ("Infinity"); +#endif + g_assert (our_inf > 1 && our_inf == our_inf / 2); + + check_strtod_string ("123.123", 123.123, FALSE, 0); + check_strtod_string ("123.123e2", 123.123e2, FALSE, 0); + check_strtod_string ("123.123e-2", 123.123e-2, FALSE, 0); + check_strtod_string ("-123.123", -123.123, FALSE, 0); + check_strtod_string ("-123.123e2", -123.123e2, FALSE, 0); + check_strtod_string ("-123.123e-2", -123.123e-2, FALSE, 0); + check_strtod_string ("5.4", 5.4, TRUE, 3); + check_strtod_string ("5.4,5.5", 5.4, TRUE, 3); + check_strtod_string ("5,4", 5.0, TRUE, 1); + /* the following are for #156421 */ + check_strtod_string ("1e1", 1e1, FALSE, 0); + check_strtod_string ("NAN", our_nan, FALSE, 0); + check_strtod_string ("-nan", -our_nan, FALSE, 0); + check_strtod_string ("INF", our_inf, FALSE, 0); + check_strtod_string ("-infinity", -our_inf, FALSE, 0); + check_strtod_string ("-.75,0", -0.75, TRUE, 4); + + d = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0; + g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL)); + + d = -179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0; + g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL)); + + d = pow (2.0, -1024.1); + g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL)); + + d = -pow (2.0, -1024.1); + g_assert (d == g_ascii_strtod (g_ascii_dtostr (buffer, sizeof (buffer), d), NULL)); + + /* for #343899 */ + check_strtod_string (" 0.75", 0.75, FALSE, 0); + check_strtod_string (" +0.75", 0.75, FALSE, 0); + check_strtod_string (" -0.75", -0.75, FALSE, 0); + check_strtod_string ("\f0.75", 0.75, FALSE, 0); + check_strtod_string ("\n0.75", 0.75, FALSE, 0); + check_strtod_string ("\r0.75", 0.75, FALSE, 0); + check_strtod_string ("\t0.75", 0.75, FALSE, 0); + +#if 0 + /* g_ascii_isspace() returns FALSE for vertical tab, see #59388 */ + check_strtod_string ("\v0.75", 0.75, FALSE, 0); +#endif + + /* for #343899 */ + check_strtod_number (0.75, "%0.2f", "0.75"); + check_strtod_number (0.75, "%5.2f", " 0.75"); + check_strtod_number (-0.75, "%0.2f", "-0.75"); + check_strtod_number (-0.75, "%5.2f", "-0.75"); + check_strtod_number (1e99, "%.0e", "1e+99"); +} + +static void +check_uint64 (const gchar *str, + const gchar *end, + gint base, + guint64 result, + gint error) +{ + guint64 actual; + gchar *endptr = NULL; + gint err; + + errno = 0; + actual = g_ascii_strtoull (str, &endptr, base); + err = errno; + + g_assert (actual == result); + g_assert_cmpstr (end, ==, endptr); + g_assert (err == error); +} + +static void +check_int64 (const gchar *str, + const gchar *end, + gint base, + gint64 result, + gint error) +{ + gint64 actual; + gchar *endptr = NULL; + gint err; + + errno = 0; + actual = g_ascii_strtoll (str, &endptr, base); + err = errno; + + g_assert (actual == result); + g_assert_cmpstr (end, ==, endptr); + g_assert (err == error); +} + +static void +test_strtoll (void) +{ + check_uint64 ("0", "", 10, 0, 0); + check_uint64 ("+0", "", 10, 0, 0); + check_uint64 ("-0", "", 10, 0, 0); + check_uint64 ("18446744073709551615", "", 10, G_MAXUINT64, 0); + check_uint64 ("18446744073709551616", "", 10, G_MAXUINT64, ERANGE); + check_uint64 ("20xyz", "xyz", 10, 20, 0); + check_uint64 ("-1", "", 10, G_MAXUINT64, 0); + + check_int64 ("0", "", 10, 0, 0); + check_int64 ("9223372036854775807", "", 10, G_MAXINT64, 0); + check_int64 ("9223372036854775808", "", 10, G_MAXINT64, ERANGE); + check_int64 ("-9223372036854775808", "", 10, G_MININT64, 0); + check_int64 ("-9223372036854775809", "", 10, G_MININT64, ERANGE); + check_int64 ("32768", "", 10, 32768, 0); + check_int64 ("-32768", "", 10, -32768, 0); + check_int64 ("001", "", 10, 1, 0); + check_int64 ("-001", "", 10, -1, 0); +} + +static void +test_bounds (void) +{ + GMappedFile *file, *before, *after; + char buffer[4097]; + char *tmp, *tmp2; + char **array; + char *string; + + /* if we allocate the file between two others and then free those + * other two, then hopefully we end up with unmapped memory on either + * side. + */ + before = g_mapped_file_new ("4096-random-bytes", TRUE, NULL); + + /* quick workaround until #549783 can be fixed */ + if (before == NULL) + return; + + file = g_mapped_file_new ("4096-random-bytes", TRUE, NULL); + after = g_mapped_file_new ("4096-random-bytes", TRUE, NULL); + g_mapped_file_free (before); + g_mapped_file_free (after); + + g_assert (file != NULL); + g_assert_cmpint (g_mapped_file_get_length (file), ==, 4096); + string = g_mapped_file_get_contents (file); + + /* ensure they're all non-nul */ + g_assert (memchr (string, '\0', 4096) == NULL); + + /* test set 1: ensure that nothing goes past its maximum length, even in + * light of a missing nul terminator. + * + * we try to test all of the 'n' functions here. + */ + tmp = g_strndup (string, 4096); + g_assert_cmpint (strlen (tmp), ==, 4096); + g_free (tmp); + + /* found no bugs in gnome, i hope :) */ + g_assert (g_strstr_len (string, 4096, "BUGS") == NULL); + g_strstr_len (string, 4096, "B"); + g_strstr_len (string, 4096, "."); + g_strstr_len (string, 4096, ""); + + g_strrstr_len (string, 4096, "BUGS"); + g_strrstr_len (string, 4096, "B"); + g_strrstr_len (string, 4096, "."); + g_strrstr_len (string, 4096, ""); + + g_ascii_strdown (string, 4096); + g_ascii_strdown (string, 4096); + g_ascii_strup (string, 4096); + g_ascii_strup (string, 4096); + + g_ascii_strncasecmp (string, string, 4096); + + tmp = g_markup_escape_text (string, 4096); + g_free (tmp); + + /* test set 2: ensure that nothing reads even one byte past a '\0'. + */ + g_assert_cmpint (string[4095], ==, '\n'); + string[4095] = '\0'; + + tmp = g_strdup (string); + g_assert_cmpint (strlen (tmp), ==, 4095); + g_free (tmp); + + tmp = g_strndup (string, 10000); + g_assert_cmpint (strlen (tmp), ==, 4095); + g_free (tmp); + + g_stpcpy (buffer, string); + g_assert_cmpint (strlen (buffer), ==, 4095); + + g_strstr_len (string, 10000, "BUGS"); + g_strstr_len (string, 10000, "B"); + g_strstr_len (string, 10000, "."); + g_strstr_len (string, 10000, ""); + + g_strrstr (string, "BUGS"); + g_strrstr (string, "B"); + g_strrstr (string, "."); + g_strrstr (string, ""); + + g_strrstr_len (string, 10000, "BUGS"); + g_strrstr_len (string, 10000, "B"); + g_strrstr_len (string, 10000, "."); + g_strrstr_len (string, 10000, ""); + + g_str_has_prefix (string, "this won't do very much..."); + g_str_has_suffix (string, "but maybe this will..."); + g_str_has_suffix (string, "HMMMM."); + g_str_has_suffix (string, "MMMM."); + g_str_has_suffix (string, "M."); + + g_strlcpy (buffer, string, sizeof buffer); + g_assert_cmpint (strlen (buffer), ==, 4095); + g_strlcpy (buffer, string, sizeof buffer); + buffer[0] = '\0'; + g_strlcat (buffer, string, sizeof buffer); + g_assert_cmpint (strlen (buffer), ==, 4095); + + tmp = g_strdup_printf ("<%s>", string); + g_assert_cmpint (strlen (tmp), ==, 4095 + 2); + g_free (tmp); + + g_ascii_strdown (string, -1); + g_ascii_strdown (string, -1); + g_ascii_strup (string, -1); + g_ascii_strup (string, -1); + + g_ascii_strcasecmp (string, string); + g_ascii_strncasecmp (string, string, 10000); + + g_strreverse (string); + g_strreverse (string); + g_strchug (string); + g_strchomp (string); + g_strstrip (string); + g_assert_cmpint (strlen (string), ==, 4095); + + g_strdelimit (string, "M", 'N'); + g_strcanon (string, " N.", ':'); + g_assert_cmpint (strlen (string), ==, 4095); + + array = g_strsplit (string, ".", -1); + tmp = g_strjoinv (".", array); + g_strfreev (array); + + g_assert_cmpint (strlen (tmp), ==, 4095); + g_assert (memcmp (tmp, string, 4095) == 0); + g_free (tmp); + + tmp = g_strconcat (string, string, string, NULL); + g_assert_cmpint (strlen (tmp), ==, 4095 * 3); + g_free (tmp); + + tmp = g_strjoin ("!", string, string, NULL); + g_assert_cmpint (strlen (tmp), ==, 4095 + 1 + 4095); + g_free (tmp); + + tmp = g_markup_escape_text (string, -1); + g_free (tmp); + + tmp = g_markup_printf_escaped ("%s", string); + g_free (tmp); + + tmp = g_strescape (string, NULL); + tmp2 = g_strcompress (tmp); + g_assert_cmpstr (string, ==, tmp2); + g_free (tmp2); + g_free (tmp); + + g_mapped_file_free (file); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/strfuncs/test-is-to-digit", test_is_to_digit); + g_test_add_func ("/strfuncs/strdup", test_strdup); + g_test_add_func ("/strfuncs/strndup", test_strndup); + g_test_add_func ("/strfuncs/strdup-printf", test_strdup_printf); + g_test_add_func ("/strfuncs/strdupv", test_strdupv); + g_test_add_func ("/strfuncs/strnfill", test_strnfill); + g_test_add_func ("/strfuncs/strconcat", test_strconcat); + g_test_add_func ("/strfuncs/strjoin", test_strjoin); + g_test_add_func ("/strfuncs/strcanon", test_strcanon); + g_test_add_func ("/strfuncs/strcompress-strescape", test_strcompress_strescape); + g_test_add_func ("/strfuncs/ascii-strcasecmp", test_ascii_strcasecmp); + g_test_add_func ("/strfuncs/strchug", test_strchug); + g_test_add_func ("/strfuncs/strchomp", test_strchomp); + g_test_add_func ("/strfuncs/strreverse", test_strreverse); + g_test_add_func ("/strfuncs/strstr", test_strstr); + g_test_add_func ("/strfuncs/has-prefix", test_has_prefix); + g_test_add_func ("/strfuncs/has-suffix", test_has_suffix); + g_test_add_func ("/strfuncs/strsplit", test_strsplit); + g_test_add_func ("/strfuncs/strsplit-set", test_strsplit_set); + g_test_add_func ("/strfuncs/strv-length", test_strv_length); + g_test_add_func ("/strfuncs/strtod", test_strtod); + g_test_add_func ("/strfuncs/strtoull-strtoll", test_strtoll); + g_test_add_func ("/strfuncs/bounds-check", test_bounds); + + return g_test_run(); +} diff --git a/glib/tests/string.c b/glib/tests/string.c new file mode 100644 index 0000000..d3f289f --- /dev/null +++ b/glib/tests/string.c @@ -0,0 +1,417 @@ +/* Unit tests for gstring + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include "glib.h" + + +static void +test_string_chunks (void) +{ + GStringChunk *string_chunk; + gchar *tmp_string, *tmp_string_2; + gint i; + + string_chunk = g_string_chunk_new (1024); + + for (i = 0; i < 100000; i ++) + { + tmp_string = g_string_chunk_insert (string_chunk, "hi pete"); + g_assert_cmpstr ("hi pete", ==, tmp_string); + } + + tmp_string_2 = g_string_chunk_insert_const (string_chunk, tmp_string); + g_assert (tmp_string_2 != tmp_string); + g_assert_cmpstr (tmp_string_2, ==, tmp_string); + + tmp_string = g_string_chunk_insert_const (string_chunk, tmp_string); + g_assert_cmpstr (tmp_string_2, ==, tmp_string); + + g_string_chunk_free (string_chunk); +} + +static void +test_string_chunk_insert (void) +{ + const gchar s0[] = "Testing GStringChunk"; + const gchar s1[] = "a\0b\0c\0d\0"; + const gchar s2[] = "Hello, world"; + GStringChunk *chunk; + gchar *str[3]; + + chunk = g_string_chunk_new (512); + + str[0] = g_string_chunk_insert (chunk, s0); + str[1] = g_string_chunk_insert_len (chunk, s1, 8); + str[2] = g_string_chunk_insert (chunk, s2); + + g_assert (memcmp (s0, str[0], sizeof s0) == 0); + g_assert (memcmp (s1, str[1], sizeof s1) == 0); + g_assert (memcmp (s2, str[2], sizeof s2) == 0); + + g_string_chunk_free (chunk); +} + +static void +test_string_new (void) +{ + GString *string1, *string2; + + string1 = g_string_new ("hi pete!"); + string2 = g_string_new (NULL); + + g_assert (string1 != NULL); + g_assert (string2 != NULL); + g_assert (strlen (string1->str) == string1->len); + g_assert (strlen (string2->str) == string2->len); + g_assert (string2->len == 0); + g_assert_cmpstr ("hi pete!", ==, string1->str); + g_assert_cmpstr ("", ==, string2->str); + + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); +} + +static void +test_string_printf (void) +{ + GString *string; + + string = g_string_new (NULL); + +#ifndef G_OS_WIN32 + /* MSVC and mingw32 use the same run-time C library, which doesn't like + the %10000.10000f format... */ + g_string_printf (string, "%s|%0100d|%s|%0*d|%*.*f|%10000.10000f", + "this pete guy sure is a wuss, like he's the number ", + 1, + " wuss. everyone agrees.\n", + 10, 666, 15, 15, 666.666666666, 666.666666666); +#else + g_string_printf (string, "%s|%0100d|%s|%0*d|%*.*f|%100.100f", + "this pete guy sure is a wuss, like he's the number ", + 1, + " wuss. everyone agrees.\n", + 10, 666, 15, 15, 666.666666666, 666.666666666); +#endif + + g_string_free (string, TRUE); +} + +static void +test_string_assign (void) +{ + GString *string; + + string = g_string_new (NULL); + g_string_assign (string, "boring text"); + g_assert_cmpstr (string->str, ==, "boring text"); + g_string_free (string, TRUE); + + /* assign with string overlap */ + string = g_string_new ("textbeforetextafter"); + g_string_assign (string, string->str + 10); + g_assert_cmpstr (string->str, ==, "textafter"); + g_string_free (string, TRUE); + + string = g_string_new ("boring text"); + g_string_assign (string, string->str); + g_assert_cmpstr (string->str, ==, "boring text"); + g_string_free (string, TRUE); +} + +static void +test_string_append_c (void) +{ + GString *string; + gint i; + + string = g_string_new ("hi pete!"); + + for (i = 0; i < 10000; i++) + g_string_append_c (string, 'a'+(i%26)); + + g_assert((strlen("hi pete!") + 10000) == string->len); + g_assert((strlen("hi pete!") + 10000) == strlen(string->str)); + + g_string_free (string, TRUE); +} + +static void +test_string_append (void) +{ + GString *string; + + /* append */ + string = g_string_new ("firsthalf"); + g_string_append (string, "lasthalf"); + g_assert_cmpstr (string->str, ==, "firsthalflasthalf"); + g_string_free (string, TRUE); + + /* append_len */ + string = g_string_new ("firsthalf"); + g_string_append_len (string, "lasthalfjunkjunk", strlen ("lasthalf")); + g_assert_cmpstr (string->str, ==, "firsthalflasthalf"); + g_string_free (string, TRUE); +} + +static void +test_string_prepend_c (void) +{ + GString *string; + gint i; + + string = g_string_new ("hi pete!"); + + for (i = 0; i < 10000; i++) + g_string_prepend_c (string, 'a'+(i%26)); + + g_assert((strlen("hi pete!") + 10000) == string->len); + g_assert((strlen("hi pete!") + 10000) == strlen(string->str)); + + g_string_free (string, TRUE); +} + +static void +test_string_prepend (void) +{ + GString *string; + + /* prepend */ + string = g_string_new ("lasthalf"); + g_string_prepend (string, "firsthalf"); + g_assert_cmpstr (string->str, ==, "firsthalflasthalf"); + g_string_free (string, TRUE); + + /* prepend_len */ + string = g_string_new ("lasthalf"); + g_string_prepend_len (string, "firsthalfjunkjunk", strlen ("firsthalf")); + g_assert_cmpstr (string->str, ==, "firsthalflasthalf"); + g_string_free (string, TRUE); +} + +static void +test_string_insert (void) +{ + GString *string; + + /* insert */ + string = g_string_new ("firstlast"); + g_string_insert (string, 5, "middle"); + g_assert_cmpstr (string->str, ==, "firstmiddlelast"); + g_string_free (string, TRUE); + + /* insert with pos == end of the string */ + string = g_string_new ("firstmiddle"); + g_string_insert (string, strlen ("firstmiddle"), "last"); + g_assert_cmpstr (string->str, ==, "firstmiddlelast"); + g_string_free (string, TRUE); + + /* insert_len */ + string = g_string_new ("firstlast"); + g_string_insert_len (string, 5, "middlejunkjunk", strlen ("middle")); + g_assert_cmpstr (string->str, ==, "firstmiddlelast"); + g_string_free (string, TRUE); + + /* insert_len with magic -1 pos for append */ + string = g_string_new ("first"); + g_string_insert_len (string, -1, "lastjunkjunk", strlen ("last")); + g_assert_cmpstr (string->str, ==, "firstlast"); + g_string_free (string, TRUE); + + /* insert_len with magic -1 len for strlen-the-string */ + string = g_string_new ("first"); + g_string_insert_len (string, 5, "last", -1); + g_assert_cmpstr (string->str, ==, "firstlast"); + g_string_free (string, TRUE); + + /* insert_len with string overlap */ + string = g_string_new ("textbeforetextafter"); + g_string_insert_len (string, 10, string->str + 8, 5); + g_assert_cmpstr (string->str, ==, "textbeforeretextextafter"); + g_string_free (string, TRUE); +} + +static void +test_string_insert_unichar (void) +{ + GString *string; + + /* insert_unichar with insertion in middle */ + string = g_string_new ("firsthalf"); + g_string_insert_unichar (string, 5, 0x0041); + g_assert_cmpstr (string->str, ==, "first\x41half"); + g_string_free (string, TRUE); + + string = g_string_new ("firsthalf"); + g_string_insert_unichar (string, 5, 0x0298); + g_assert_cmpstr (string->str, ==, "first\xCA\x98half"); + g_string_free (string, TRUE); + + string = g_string_new ("firsthalf"); + g_string_insert_unichar (string, 5, 0xFFFD); + g_assert_cmpstr (string->str, ==, "first\xEF\xBF\xBDhalf"); + g_string_free (string, TRUE); + + string = g_string_new ("firsthalf"); + g_string_insert_unichar (string, 5, 0x1D100); + g_assert_cmpstr (string->str, ==, "first\xF0\x9D\x84\x80half"); + g_string_free (string, TRUE); + + /* insert_unichar with insertion at end */ + string = g_string_new ("start"); + g_string_insert_unichar (string, -1, 0x0041); + g_assert_cmpstr (string->str, ==, "start\x41"); + g_string_free (string, TRUE); + + string = g_string_new ("start"); + g_string_insert_unichar (string, -1, 0x0298); + g_assert_cmpstr (string->str, ==, "start\xCA\x98"); + g_string_free (string, TRUE); + + string = g_string_new ("start"); + g_string_insert_unichar (string, -1, 0xFFFD); + g_assert_cmpstr (string->str, ==, "start\xEF\xBF\xBD"); + g_string_free (string, TRUE); + + string = g_string_new ("start"); + g_string_insert_unichar (string, -1, 0x1D100); + g_assert_cmpstr (string->str, ==, "start\xF0\x9D\x84\x80"); + g_string_free (string, TRUE); +} + +static void +test_string_equal (void) +{ + GString *string1, *string2; + + string1 = g_string_new ("test"); + string2 = g_string_new ("te"); + g_assert (!g_string_equal(string1, string2)); + g_string_append (string2, "st"); + g_assert (g_string_equal(string1, string2)); + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); +} + +static void +test_string_truncate (void) +{ + GString *string; + + string = g_string_new ("testing"); + + g_string_truncate (string, 1000); + g_assert (string->len == strlen("testing")); + g_assert_cmpstr (string->str, ==, "testing"); + + g_string_truncate (string, 4); + g_assert (string->len == 4); + g_assert_cmpstr (string->str, ==, "test"); + + g_string_truncate (string, 0); + g_assert (string->len == 0); + g_assert_cmpstr (string->str, ==, ""); + + g_string_free (string, TRUE); +} + +static void +test_string_overwrite (void) +{ + GString *string; + + /* overwriting functions */ + string = g_string_new ("testing"); + + g_string_overwrite (string, 4, " and expand"); + g_assert (15 == string->len); + g_assert ('\0' == string->str[15]); + g_assert (g_str_equal ("test and expand", string->str)); + + g_string_overwrite (string, 5, "NOT-"); + g_assert (15 == string->len); + g_assert ('\0' == string->str[15]); + g_assert (g_str_equal ("test NOT-expand", string->str)); + + g_string_overwrite_len (string, 9, "blablabla", 6); + g_assert (15 == string->len); + g_assert ('\0' == string->str[15]); + g_assert (g_str_equal ("test NOT-blabla", string->str)); + + g_string_free (string, TRUE); +} + +static void +test_string_nul_handling (void) +{ + GString *string1, *string2; + + /* Check handling of embedded ASCII 0 (NUL) characters in GString. */ + string1 = g_string_new ("fiddle"); + string2 = g_string_new ("fiddle"); + g_assert (g_string_equal (string1, string2)); + g_string_append_c (string1, '\0'); + g_assert (!g_string_equal (string1, string2)); + g_string_append_c (string2, '\0'); + g_assert (g_string_equal (string1, string2)); + g_string_append_c (string1, 'x'); + g_string_append_c (string2, 'y'); + g_assert (!g_string_equal (string1, string2)); + g_assert (string1->len == 8); + g_string_append (string1, "yzzy"); + g_assert (string1->len == 12); + g_assert (memcmp (string1->str, "fiddle\0xyzzy", 13) == 0); + g_string_insert (string1, 1, "QED"); + g_assert (memcmp (string1->str, "fQEDiddle\0xyzzy", 16) == 0); + g_string_printf (string1, "fiddle%cxyzzy", '\0'); + g_assert (string1->len == 12); + g_assert (memcmp (string1->str, "fiddle\0xyzzy", 13) == 0); + + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/string/test-string-chunks", test_string_chunks); + g_test_add_func ("/string/test-string-chunk-insert", test_string_chunk_insert); + g_test_add_func ("/string/test-string-new", test_string_new); + g_test_add_func ("/string/test-string-printf", test_string_printf); + g_test_add_func ("/string/test-string-assign", test_string_assign); + g_test_add_func ("/string/test-string-append-c", test_string_append_c); + g_test_add_func ("/string/test-string-append", test_string_append); + g_test_add_func ("/string/test-string-prepend-c", test_string_prepend_c); + g_test_add_func ("/string/test-string-prepend", test_string_prepend); + g_test_add_func ("/string/test-string-insert", test_string_insert); + g_test_add_func ("/string/test-string-insert-unichar", test_string_insert_unichar); + g_test_add_func ("/string/test-string-equal", test_string_equal); + g_test_add_func ("/string/test-string-truncate", test_string_truncate); + g_test_add_func ("/string/test-string-overwrite", test_string_overwrite); + g_test_add_func ("/string/test-string-nul-handling", test_string_nul_handling); + + return g_test_run(); +} diff --git a/glib/tests/testing.c b/glib/tests/testing.c new file mode 100644 index 0000000..ef8bcf9 --- /dev/null +++ b/glib/tests/testing.c @@ -0,0 +1,241 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2007 Imendio AB + * Authors: Tim Janik + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include + +#include + +/* test assertion variants */ +static void +test_assertions (void) +{ + gchar *fuu; + g_assert_cmpint (1, >, 0); + g_assert_cmphex (2, ==, 2); + g_assert_cmpfloat (3.3, !=, 7); + g_assert_cmpfloat (7, <=, 3 + 4); + g_assert (TRUE); + g_assert_cmpstr ("foo", !=, "faa"); + fuu = g_strdup_printf ("f%s", "uu"); + g_test_queue_free (fuu); + g_assert_cmpstr ("foo", !=, fuu); + g_assert_cmpstr ("fuu", ==, fuu); + g_assert_cmpstr (NULL, <, ""); + g_assert_cmpstr (NULL, ==, NULL); + g_assert_cmpstr ("", >, NULL); + g_assert_cmpstr ("foo", <, "fzz"); + g_assert_cmpstr ("fzz", >, "faa"); + g_assert_cmpstr ("fzz", ==, "fzz"); +} + +/* test g_test_timer* API */ +static void +test_timer (void) +{ + double ttime; + g_test_timer_start(); + g_assert_cmpfloat (g_test_timer_last(), ==, 0); + g_usleep (25 * 1000); + ttime = g_test_timer_elapsed(); + g_assert_cmpfloat (ttime, >, 0); + g_assert_cmpfloat (g_test_timer_last(), ==, ttime); + g_test_minimized_result (ttime, "timer-test-time: %fsec", ttime); + g_test_maximized_result (5, "bogus-quantity: %ddummies", 5); /* simple API test */ +} + +/* fork out for a failing test */ +static void +test_fork_fail (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_assert_not_reached(); + } + g_test_trap_assert_failed(); + g_test_trap_assert_stderr ("*ERROR*test_fork_fail*should not be reached*"); +} + +/* fork out to assert stdout and stderr patterns */ +static void +test_fork_patterns (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + g_print ("some stdout text: somagic17\n"); + g_printerr ("some stderr text: semagic43\n"); + exit (0); + } + g_test_trap_assert_passed(); + g_test_trap_assert_stdout ("*somagic17*"); + g_test_trap_assert_stderr ("*semagic43*"); +} + +/* fork out for a timeout test */ +static void +test_fork_timeout (void) +{ + /* allow child to run for only a fraction of a second */ + if (g_test_trap_fork (0.11 * 1000000, 0)) + { + /* loop and sleep forever */ + while (TRUE) + g_usleep (1000 * 1000); + } + g_test_trap_assert_failed(); + g_assert (g_test_trap_reached_timeout()); +} + +/* run a test with fixture setup and teardown */ +typedef struct { + guint seed; + guint prime; + gchar *msg; +} Fixturetest; +static void +fixturetest_setup (Fixturetest *fix, + gconstpointer test_data) +{ + g_assert (test_data == (void*) 0xc0cac01a); + fix->seed = 18; + fix->prime = 19; + fix->msg = g_strdup_printf ("%d", fix->prime); +} +static void +fixturetest_test (Fixturetest *fix, + gconstpointer test_data) +{ + guint prime = g_spaced_primes_closest (fix->seed); + g_assert_cmpint (prime, ==, fix->prime); + prime = g_ascii_strtoull (fix->msg, NULL, 0); + g_assert_cmpint (prime, ==, fix->prime); + g_assert (test_data == (void*) 0xc0cac01a); +} +static void +fixturetest_teardown (Fixturetest *fix, + gconstpointer test_data) +{ + g_assert (test_data == (void*) 0xc0cac01a); + g_free (fix->msg); +} + +static struct { + int bit, vint1, vint2, irange; + long double vdouble, drange; +} shared_rand_state; + +static void +test_rand1 (void) +{ + shared_rand_state.bit = g_test_rand_bit(); + shared_rand_state.vint1 = g_test_rand_int(); + shared_rand_state.vint2 = g_test_rand_int(); + g_assert_cmpint (shared_rand_state.vint1, !=, shared_rand_state.vint2); + shared_rand_state.irange = g_test_rand_int_range (17, 35); + g_assert_cmpint (shared_rand_state.irange, >=, 17); + g_assert_cmpint (shared_rand_state.irange, <=, 35); + shared_rand_state.vdouble = g_test_rand_double(); + shared_rand_state.drange = g_test_rand_double_range (-999, +17); + g_assert_cmpfloat (shared_rand_state.drange, >=, -999); + g_assert_cmpfloat (shared_rand_state.drange, <=, +17); +} + +static void +test_rand2 (void) +{ + /* this test only works if run after test1. + * we do this to check that random number generators + * are reseeded upon fixture setup. + */ + g_assert_cmpint (shared_rand_state.bit, ==, g_test_rand_bit()); + g_assert_cmpint (shared_rand_state.vint1, ==, g_test_rand_int()); + g_assert_cmpint (shared_rand_state.vint2, ==, g_test_rand_int()); + g_assert_cmpint (shared_rand_state.irange, ==, g_test_rand_int_range (17, 35)); + g_assert_cmpfloat (shared_rand_state.vdouble, ==, g_test_rand_double()); + g_assert_cmpfloat (shared_rand_state.drange, ==, g_test_rand_double_range (-999, +17)); +} + +static void +test_data_test (gconstpointer test_data) +{ + g_assert (test_data == (void*) 0xc0c0baba); +} + +static void +test_random_conversions (void) +{ + /* very simple conversion test using random numbers */ + int vint = g_test_rand_int(); + char *err, *str = g_strdup_printf ("%d", vint); + gint64 vint64 = g_ascii_strtoll (str, &err, 10); + g_assert_cmphex (vint, ==, vint64); + g_assert (!err || *err == 0); + g_free (str); +} + +static gboolean +fatal_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + return FALSE; +} + +static void +test_log_handler (void) +{ + g_test_log_set_fatal_handler (fatal_handler, NULL); + g_str_has_prefix (NULL, "file://"); + g_critical ("Test passing"); + + g_test_log_set_fatal_handler (NULL, NULL); + if (g_test_trap_fork (0, 0)) + g_error ("Test failing"); + g_test_trap_assert_failed (); + + if (g_test_trap_fork (0, 0)) + g_str_has_prefix (NULL, "file://"); + g_test_trap_assert_failed (); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/random-generator/rand-1", test_rand1); + g_test_add_func ("/random-generator/rand-2", test_rand2); + g_test_add_func ("/random-generator/random-conversions", test_random_conversions); + g_test_add_func ("/misc/assertions", test_assertions); + g_test_add_data_func ("/misc/test-data", (void*) 0xc0c0baba, test_data_test); + g_test_add ("/misc/primetoul", Fixturetest, (void*) 0xc0cac01a, fixturetest_setup, fixturetest_test, fixturetest_teardown); + if (g_test_perf()) + g_test_add_func ("/misc/timer", test_timer); + g_test_add_func ("/forking/fail assertion", test_fork_fail); + g_test_add_func ("/forking/patterns", test_fork_patterns); + if (g_test_slow()) + g_test_add_func ("/forking/timeout", test_fork_timeout); + g_test_add_func ("/misc/log-handler", test_log_handler); + + return g_test_run(); +} diff --git a/glib/update-pcre/Makefile.am b/glib/update-pcre/Makefile.am new file mode 100644 index 0000000..b7f80c6 --- /dev/null +++ b/glib/update-pcre/Makefile.am @@ -0,0 +1,10 @@ +include $(top_srcdir)/Makefile.decl + +EXTRA_DIST += \ + update.sh \ + Makefile.am-1 \ + Makefile.am-2 \ + digitab.patch \ + memory.patch \ + pcre_ucp_searchfuncs.c \ + pcre_valid_utf8.c diff --git a/glib/update-pcre/Makefile.am-1 b/glib/update-pcre/Makefile.am-1 new file mode 100644 index 0000000..d4255b7 --- /dev/null +++ b/glib/update-pcre/Makefile.am-1 @@ -0,0 +1,30 @@ +INCLUDES = \ + -DG_LOG_DOMAIN=\"GLib-GRegex\" \ + -DSUPPORT_UCP \ + -DSUPPORT_UTF8 \ + -DNEWLINE=-1 \ + -DMATCH_LIMIT=10000000 \ + -DMATCH_LIMIT_RECURSION=10000000 \ + -DMAX_NAME_SIZE=32 \ + -DMAX_NAME_COUNT=10000 \ + -DMAX_DUPLENGTH=30000 \ + -DLINK_SIZE=2 \ + -DEBCDIC=0 \ + -DPOSIX_MALLOC_THRESHOLD=10 \ + -DPCRE_STATIC \ + -I$(top_srcdir) \ + -I$(srcdir) \ + -I$(top_srcdir)/glib \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED \ + -DGLIB_COMPILATION \ + $(DEPRECATED_FLAGS)\ + $(WARN_CFLAGS) \ + $(PCRE_WARN_CFLAGS) \ + $(DEP_CFLAGS) + +noinst_LTLIBRARIES = libpcre.la + +libpcre_headers = + +libpcre_la_SOURCES = \ diff --git a/glib/update-pcre/Makefile.am-2 b/glib/update-pcre/Makefile.am-2 new file mode 100644 index 0000000..94d4d3c --- /dev/null +++ b/glib/update-pcre/Makefile.am-2 @@ -0,0 +1,10 @@ + $(libpcre_headers) + +libpcre_la_LIBADD = $(DEP_LIBS) + +libpcre_la_LDFLAGS = -no-undefined + +EXTRA_DIST = \ + COPYING \ + makefile.msc + diff --git a/glib/update-pcre/Makefile.in b/glib/update-pcre/Makefile.in new file mode 100644 index 0000000..7080884 --- /dev/null +++ b/glib/update-pcre/Makefile.in @@ -0,0 +1,523 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = glib/update-pcre +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = update.sh Makefile.am-1 Makefile.am-2 digitab.patch \ + memory.patch pcre_ucp_searchfuncs.c pcre_valid_utf8.c +TEST_PROGS = +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu glib/update-pcre/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu glib/update-pcre/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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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: check-am install-am install-strip + +.PHONY: all all-am check check-am check-local 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 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/glib/update-pcre/digitab.patch b/glib/update-pcre/digitab.patch new file mode 100644 index 0000000..a745fbb --- /dev/null +++ b/glib/update-pcre/digitab.patch @@ -0,0 +1,133 @@ +--- pcre_compile.c 2006-10-10 12:00:00.000000000 +0200 ++++ pcre_compile.c 2006-10-10 12:00:00.000000000 +0200 +@@ -246,130 +246,6 @@ static const char *error_texts[] = { + }; + + +-/* Table to identify digits and hex digits. This is used when compiling +-patterns. Note that the tables in chartables are dependent on the locale, and +-may mark arbitrary characters as digits - but the PCRE compiling code expects +-to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have +-a private table here. It costs 256 bytes, but it is a lot faster than doing +-character value tests (at least in some simple cases I timed), and in some +-applications one wants PCRE to compile efficiently as well as match +-efficiently. +- +-For convenience, we use the same bit definitions as in chartables: +- +- 0x04 decimal digit +- 0x08 hexadecimal digit +- +-Then we can use ctype_digit and ctype_xdigit in the code. */ +- +-#if !EBCDIC /* This is the "normal" case, for ASCII systems */ +-static const unsigned char digitab[] = +- { +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */ +- 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */ +- 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ +- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */ +- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ +- +-#else /* This is the "abnormal" case, for EBCDIC systems */ +-static const unsigned char digitab[] = +- { +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- ¬ */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ +- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ +- 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ +- 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */ +- 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ +- +-static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */ +- 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */ +- 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ +- 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ +- 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ +- 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */ +- 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */ +- 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- ¬ */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */ +- 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */ +- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ +- 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */ +- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ +- 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */ +- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ +- 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */ +- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ +- 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */ +- 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ +- 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */ +- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ +- 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */ +- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ +- 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */ +- 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ +- 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ +- 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ +-#endif +- +- + /* Definition to allow mutual recursion */ + + static BOOL diff --git a/glib/update-pcre/memory.patch b/glib/update-pcre/memory.patch new file mode 100644 index 0000000..65b7b97 --- /dev/null +++ b/glib/update-pcre/memory.patch @@ -0,0 +1,87 @@ +diff -r 0f4042339eb5 pcre/pcre.h +--- pcre/pcre.h Tue Jul 25 22:39:16 2006 +0200 ++++ pcre/pcre.h Tue Jul 25 22:52:10 2006 +0200 +@@ -233,25 +233,14 @@ typedef struct pcre_callout_block { + /* ------------------------------------------------------------------ */ + } pcre_callout_block; + +-/* Indirection for store get and free functions. These can be set to +-alternative malloc/free functions if required. Special ones are used in the +-non-recursive case for "frames". There is also an optional callout function +-that is triggered by the (?) regex item. For Virtual Pascal, these definitions +-have to take another form. */ +- +-#ifndef VPCOMPAT +-PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t); +-PCRE_DATA_SCOPE void (*pcre_free)(void *); +-PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t); +-PCRE_DATA_SCOPE void (*pcre_stack_free)(void *); ++#include "glib.h" ++#include "galias.h" ++ ++#define pcre_malloc g_try_malloc ++#define pcre_free g_free ++#define pcre_stack_malloc g_try_malloc ++ + PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *); +-#else /* VPCOMPAT */ +-PCRE_DATA_SCOPE void *pcre_malloc(size_t); +-PCRE_DATA_SCOPE void pcre_free(void *); +-PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t); +-PCRE_DATA_SCOPE void pcre_stack_free(void *); +-PCRE_DATA_SCOPE int pcre_callout(pcre_callout_block *); +-#endif /* VPCOMPAT */ + + /* Exported PCRE functions */ + +diff -r 0f4042339eb5 pcre/pcre_globals.c +--- pcre/pcre_globals.c Tue Jul 25 22:39:16 2006 +0200 ++++ pcre/pcre_globals.c Tue Jul 25 22:52:10 2006 +0200 +@@ -50,32 +50,9 @@ differently, and global variables are no + #include "pcre_internal.h" + + +-#ifndef VPCOMPAT +- +-/************************************************************************** +-This code used to be here for use when compiling as a C++ library. However, +-according to Dair Grant it is not needed: " +- +- Including 'extern "C"' in the declaration generates an "initialized and +- declared `extern'" warning from gcc 4.0.1. Since we include pcre_internal.h, +- which includes pcre.h, which declares these prototypes within an extern "C" {} +- block, we shouldn't need the prefix here. +- +-So, from Release 7.0 I have cut this out. +- + #ifdef __cplusplus +-extern "C" void *(*pcre_malloc)(size_t) = malloc; +-extern "C" void (*pcre_free)(void *) = free; +-extern "C" void *(*pcre_stack_malloc)(size_t) = malloc; +-extern "C" void (*pcre_stack_free)(void *) = free; + extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL; + #else +-**************************************************************************/ +- +-void *(*pcre_malloc)(size_t) = malloc; +-void (*pcre_free)(void *) = free; +-void *(*pcre_stack_malloc)(size_t) = malloc; +-void (*pcre_stack_free)(void *) = free; + int (*pcre_callout)(pcre_callout_block *) = NULL; + #endif + +diff -r 0f4042339eb5 pcre/pcre_internal.h +--- pcre/pcre_internal.h Tue Jul 25 22:39:16 2006 +0200 ++++ pcre/pcre_internal.h Tue Jul 25 22:52:10 2006 +0200 +@@ -480,10 +480,7 @@ variable-length repeat, or a anything ot + + /* Miscellaneous definitions */ + +-typedef int BOOL; +- +-#define FALSE 0 +-#define TRUE 1 ++typedef gboolean BOOL; + + /* Escape items that are just an encoding of a particular data value. */ + diff --git a/glib/update-pcre/pcre_ucp_searchfuncs.c b/glib/update-pcre/pcre_ucp_searchfuncs.c new file mode 100644 index 0000000..77ec8d1 --- /dev/null +++ b/glib/update-pcre/pcre_ucp_searchfuncs.c @@ -0,0 +1,130 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + + Written by Philip Hazel + Copyright (c) 1997-2006 University of Cambridge + +----------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the University of Cambridge nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- +*/ + +/* This file has been modified to use glib instead of the internal table + * in ucptable.c -- Marco Barisione */ + +/* This module contains code for searching the table of Unicode character +properties. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#include "ucp.h" /* Category definitions */ +#include "ucpinternal.h" /* Internal table details */ + + +/* Table to translate from particular type value to the general value. */ + +static int ucp_gentype[] = { + ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */ + ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */ + ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */ + ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */ + ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */ + ucp_P, ucp_P, /* Ps, Po */ + ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */ + ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */ +}; + + + +/************************************************* +* Search table and return type * +*************************************************/ + +/* Three values are returned: the category is ucp_C, ucp_L, etc. The detailed +character type is ucp_Lu, ucp_Nd, etc. The script is ucp_Latin, etc. + +Arguments: + c the character value + type_ptr the detailed character type is returned here + script_ptr the script is returned here + +Returns: the character type category +*/ + +int +_pcre_ucp_findprop(const unsigned int c, int *type_ptr, int *script_ptr) +{ +/* Note that the Unicode types have the same values in glib and in + * PCRE, so ucp_Ll == G_UNICODE_LOWERCASE_LETTER, + * ucp_Zs == G_UNICODE_SPACE_SEPARATOR, and so on. */ +*type_ptr = g_unichar_type(c); +*script_ptr = g_unichar_get_script(c); +return ucp_gentype[*type_ptr]; +} + + + + +/************************************************* +* Search table and return other case * +*************************************************/ + +/* If the given character is a letter, and there is another case for the +letter, return the other case. Otherwise, return -1. + +Arguments: + c the character value + +Returns: the other case or NOTACHAR if none +*/ + +unsigned int +_pcre_ucp_othercase(const unsigned int c) +{ +int other_case = NOTACHAR; + +if (g_unichar_islower(c)) + other_case = g_unichar_toupper(c); +else if (g_unichar_isupper(c)) + other_case = g_unichar_tolower(c); + +if (other_case == c) + other_case = NOTACHAR; + +return other_case; +} + + +/* End of pcre_ucp_searchfuncs.c */ diff --git a/glib/update-pcre/pcre_valid_utf8.c b/glib/update-pcre/pcre_valid_utf8.c new file mode 100644 index 0000000..b7671a9 --- /dev/null +++ b/glib/update-pcre/pcre_valid_utf8.c @@ -0,0 +1,14 @@ +#include "config.h" +#include "pcre_internal.h" + +/* + * This function is not needed by GRegex, so print an error and + * return always -1, that is the string is a valid UTF-8 encoded + * string. + */ +int +_pcre_valid_utf8(const uschar *string, int length) +{ +g_warning ("%s: this function should not be called", G_STRLOC); +return -1; +} diff --git a/glib/update-pcre/update.sh b/glib/update-pcre/update.sh new file mode 100644 index 0000000..960b4d2 --- /dev/null +++ b/glib/update-pcre/update.sh @@ -0,0 +1,159 @@ +#! /bin/sh + +IN="../update-pcre" +PCRE=$1 + +if [ "x$PCRE" = x -o "x$PCRE" = x--help -o "x$PCRE" = x-h ]; then + cat >&2 << EOF + +$0 PCRE-DIR + + Updates the local PCRE copy with a different version of the library, + contained in the directory PCRE-DIR. + + This will delete the content of the local pcre directory, copy the + necessary files from PCRE-DIR, and generate other needed files, such + as Makefile.am +EOF + exit +fi + +if [ ! -f gregex.h ]; then + echo "This script should be executed from the directory containing gregex.c." 2> /dev/null + exit 1 +fi + +if [ ! -f $PCRE/Makefile.in -o ! -f $PCRE/pcre_compile.c ]; then + echo "'$PCRE' does not contain a valid PCRE version." 2> /dev/null + exit 1 +fi + + +echo "Deleting old PCRE library" +mv pcre/.svn tmp-pcre-svn +rm -R pcre 2> /dev/null +mkdir pcre +cd pcre + +# pcre_chartables.c is generated by dfatables. +# We do not want to compile and execute dfatables.c every time, because +# this could be a problem (e.g. when cross-compiling), so now generate +# the file and then distribuite it with GRegex. +echo "Generating pcre_chartables.c" +cp -R $PCRE tmp-build +cd tmp-build +./configure --enable-utf8 --enable-unicode-properties --disable-cpp > /dev/null +make pcre_chartables.c > /dev/null +cat > ../pcre_chartables.c << \EOF +/* This file is autogenerated by ../update-pcre/update.sh during + * the update of the local copy of PCRE. + */ +EOF +cat pcre_chartables.c >> ../pcre_chartables.c +cd .. +rm -R tmp-build + +# Compiled C files. +echo "Generating makefiles" +all_files=`awk '/^OBJ = /, /^\\s*$/ \ + { \ + sub("^OBJ = ", ""); \ + sub(".@OBJEXT@[[:blank:]]*\\\\\\\\", ""); \ + sub("\\\\$\\\\(POSIX_OBJ\\\\)", ""); \ + print; \ + }' \ + $PCRE/Makefile.in` + +# Headers. +included_files="pcre.h pcre_internal.h ucp.h ucpinternal.h" + +# Generate Makefile.am. +cat $IN/Makefile.am-1 > Makefile.am +for name in $all_files; do + echo " $name.c \\" >> Makefile.am + if [ $name != pcre_chartables ]; then + # pcre_chartables.c is a generated file. + cp $PCRE/$name.c . + fi +done +for f in $included_files; do + echo " $f \\" >> Makefile.am + cp $PCRE/$f . +done +cat $IN/Makefile.am-2 >> Makefile.am + +# Generate makefile.msc +cat > makefile.msc << EOF +TOP = ..\..\.. +!INCLUDE ..\..\build\win32\make.msc + +INCLUDES = \\ + -I ..\.. \\ + -I .. + +DEFINES = \\ + -DPCRE_STATIC \\ + -DHAVE_CONFIG_H \\ + -DHAVE_LONG_LONG_FORMAT \\ + -DSUPPORT_UCP \\ + -DSUPPORT_UTF8 \\ + -DNEWLINE=-1 \\ + -DMATCH_LIMIT=10000000 \\ + -DMATCH_LIMIT_RECURSION=10000000 \\ + -DMAX_NAME_SIZE=32 \\ + -DMAX_NAME_COUNT=10000 \\ + -DMAX_DUPLENGTH=30000 \\ + -DLINK_SIZE=2 \\ + -DEBCDIC=0 \\ + -DPOSIX_MALLOC_THRESHOLD=10 + +OBJECTS = \\ +` +for f in $all_files; do + echo " $f.obj \\\\" +done +` + +all : pcre.lib + +pcre.lib : \$(OBJECTS) + lib -out:pcre.lib \$(OBJECTS) +EOF + +echo "Patching PCRE" + +# Copy the license. +cp $PCRE/COPYING . + +# Use glib for memory allocation. +patch > /dev/null < $IN/memory.patch + +# Copy the modified version of pcre_valid_utf8.c. +cp $IN/pcre_valid_utf8.c . + +# Copy the modified version of pcre_ucp_searchfuncs.c that uses glib +# for Unicode properties. +cp $IN/pcre_ucp_searchfuncs.c . +patch > /dev/null < $IN/ucp.patch + +# Remove the digitab array in pcre_compile.c. +patch > /dev/null < $IN/digitab.patch +sed -i -e 's/(digitab\[\(.*\)\] & ctype_digit)/g_ascii_isdigit(\1)/' pcre_compile.c +sed -i -e 's/(digitab\[\(.*\)\] & ctype_xdigit)/g_ascii_isxdigit(\1)/' pcre_compile.c + +# Reduce the number of relocations. +python $IN/make_utt.py +patch > /dev/null < $IN/utt.patch +patch > /dev/null < $IN/table-reduction.patch + +# Copy back the old SVN directory. +mv ../tmp-pcre-svn .svn + + +cat << EOF + +Update completed. You now should check that everything is working. +Remember to update the regex syntax doc with the new features +(docs/reference/glib/regex-syntax.sgml) and to run the tests. +EOF + diff --git a/glib/win_iconv.c b/glib/win_iconv.c new file mode 100644 index 0000000..ea19240 --- /dev/null +++ b/glib/win_iconv.c @@ -0,0 +1,1956 @@ +/* + * iconv library implemented with Win32 API. + * + * This file is placed in the public domain. + * + * Maintainer: Yukihiro Nakadaira + * + * If $WINICONV_LIBICONV_DLL environment variable was defined, win_iconv + * loads the specified DLL dynamically and uses it. If loading the DLL + * or iconv_open() failed, falls back to internal conversion. + * $WINICONV_LIBICONV_DLL is a comma separated list. The first loadable + * DLL is used. The specified DLL should have iconv_open(), + * iconv_close() and iconv() functions. Or these functions can be + * libiconv_open(), libiconv_close() and libiconv(). + * + * Win32 API does not support strict encoding conversion for some + * codepage. And MLang function drop or replace invalid bytes and does + * not return useful error status as iconv. This implementation cannot + * be used for encoding validation purpose. + */ + +/* for WC_NO_BEST_FIT_CHARS */ +#ifndef WINVER +# define WINVER 0x0500 +#endif + +#define STRICT +#include +#include +#include +#include + +#if 0 +# define MAKE_EXE +# define MAKE_DLL +# define USE_LIBICONV_DLL +#endif + +#if !defined(DEFAULT_LIBICONV_DLL) +# define DEFAULT_LIBICONV_DLL "" +#endif + +#define MB_CHAR_MAX 16 + +#define UNICODE_MODE_BOM_DONE 1 +#define UNICODE_MODE_SWAPPED 2 + +#define FLAG_USE_BOM_ENDIAN 1 +#define FLAG_TRANSLIT 2 /* //TRANSLIT */ +#define FLAG_IGNORE 4 /* //IGNORE (not implemented) */ + +#define return_error(code) \ + do { \ + errno = code; \ + return -1; \ + } while (0) + +#define xstrlcpy(dst, src, size) \ + do { \ + strncpy(dst, src, size); \ + dst[size - 1] = 0; \ + } while (0) + +#define xstrlcpyn(dst, src, srclen, size) \ + xstrlcpy(dst, src, xmin((srclen) + 1, size)) + +#define xmin(a, b) ((a) < (b) ? (a) : (b)) +#define xmax(a, b) ((a) > (b) ? (a) : (b)) + +#define STATIC_STRLEN(arr) (sizeof(arr) - 1) + +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; + +typedef void* iconv_t; + +iconv_t iconv_open(const char *tocode, const char *fromcode); +int iconv_close(iconv_t cd); +size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); + +/* libiconv interface for vim */ +#if defined(MAKE_DLL) +int +iconvctl (iconv_t cd, int request, void* argument) +{ + /* not supported */ + return 0; +} +#endif + +typedef struct compat_t compat_t; +typedef struct csconv_t csconv_t; +typedef struct rec_iconv_t rec_iconv_t; + +typedef iconv_t (*f_iconv_open)(const char *tocode, const char *fromcode); +typedef int (*f_iconv_close)(iconv_t cd); +typedef size_t (*f_iconv)(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); +typedef int* (*f_errno)(void); +typedef int (*f_mbtowc)(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); +typedef int (*f_wctomb)(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); +typedef int (*f_mblen)(csconv_t *cv, const uchar *buf, int bufsize); +typedef int (*f_flush)(csconv_t *cv, uchar *buf, int bufsize); + +#define COMPAT_IN 1 +#define COMPAT_OUT 2 + +/* unicode mapping for compatibility with other conversion table. */ +struct compat_t { + uint in; + uint out; + uint flag; +}; + +struct csconv_t { + int codepage; + int flags; + f_mbtowc mbtowc; + f_wctomb wctomb; + f_mblen mblen; + f_flush flush; + DWORD mode; + compat_t *compat; +}; + +struct rec_iconv_t { + iconv_t cd; + f_iconv_close iconv_close; + f_iconv iconv; + f_errno _errno; + csconv_t from; + csconv_t to; +#if defined(USE_LIBICONV_DLL) + HMODULE hlibiconv; +#endif +}; + +static int win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode); +static int win_iconv_close(iconv_t cd); +static size_t win_iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); + +static int load_mlang(); +static csconv_t make_csconv(const char *name); +static int name_to_codepage(const char *name); +static uint utf16_to_ucs4(const ushort *wbuf); +static void ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize); +static int is_unicode(int codepage); +static int mbtowc_flags(int codepage); +static int must_use_null_useddefaultchar(int codepage); +static void check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize); +static char *strrstr(const char *str, const char *token); + +#if defined(USE_LIBICONV_DLL) +static int libiconv_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode); +static PVOID MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size); +static HMODULE find_imported_module_by_funcname(HMODULE hModule, const char *funcname); + +static HMODULE hwiniconv; +static HMODULE hlastdll; /* keep dll loaded for efficiency (unnecessary?) */ +#endif + +static int sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); +static int dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); +static int mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize); +static int utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize); +static int eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize); + +static int kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); +static int kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); +static int mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); +static int mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); +static int utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); +static int utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); +static int utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); +static int utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); +static int iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize); +static int iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize); +static int iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize); + +static struct { + int codepage; + const char *name; +} codepage_alias[] = { + {65001, "CP65001"}, + {65001, "UTF8"}, + {65001, "UTF-8"}, + + {1200, "CP1200"}, + {1200, "UTF16LE"}, + {1200, "UTF-16LE"}, + {1200, "UCS2LE"}, + {1200, "UCS-2LE"}, + + {1201, "CP1201"}, + {1201, "UTF16BE"}, + {1201, "UTF-16BE"}, + {1201, "UCS2BE"}, + {1201, "UCS-2BE"}, + {1201, "unicodeFFFE"}, + + {12000, "CP12000"}, + {12000, "UTF32LE"}, + {12000, "UTF-32LE"}, + {12000, "UCS4LE"}, + {12000, "UCS-4LE"}, + + {12001, "CP12001"}, + {12001, "UTF32BE"}, + {12001, "UTF-32BE"}, + {12001, "UCS4BE"}, + {12001, "UCS-4BE"}, + +#ifndef GLIB_COMPILATION + /* + * Default is big endian. + * See rfc2781 4.3 Interpreting text labelled as UTF-16. + */ + {1201, "UTF16"}, + {1201, "UTF-16"}, + {12001, "UTF32"}, + {12001, "UTF-32"}, + {12001, "UCS-4"}, + {12001, "UCS4"}, +#else + /* Default is little endian, because the platform is */ + {1200, "UTF16"}, + {1200, "UTF-16"}, + {1200, "UCS2"}, + {1200, "UCS-2"}, + {12000, "UTF32"}, + {12000, "UTF-32"}, + {12000, "UCS4"}, + {12000, "UCS-4"}, +#endif + + /* copy from libiconv `iconv -l` */ + /* !IsValidCodePage(367) */ + {20127, "ANSI_X3.4-1968"}, + {20127, "ANSI_X3.4-1986"}, + {20127, "ASCII"}, + {20127, "CP367"}, + {20127, "IBM367"}, + {20127, "ISO-IR-6"}, + {20127, "ISO646-US"}, + {20127, "ISO_646.IRV:1991"}, + {20127, "US"}, + {20127, "US-ASCII"}, + {20127, "CSASCII"}, + + /* !IsValidCodePage(819) */ + {1252, "CP819"}, + {1252, "IBM819"}, + {28591, "ISO-8859-1"}, + {28591, "ISO-IR-100"}, + {28591, "ISO8859-1"}, + {28591, "ISO_8859-1"}, + {28591, "ISO_8859-1:1987"}, + {28591, "L1"}, + {28591, "LATIN1"}, + {28591, "CSISOLATIN1"}, + + {1250, "CP1250"}, + {1250, "MS-EE"}, + {1250, "WINDOWS-1250"}, + + {1251, "CP1251"}, + {1251, "MS-CYRL"}, + {1251, "WINDOWS-1251"}, + + {1252, "CP1252"}, + {1252, "MS-ANSI"}, + {1252, "WINDOWS-1252"}, + + {1253, "CP1253"}, + {1253, "MS-GREEK"}, + {1253, "WINDOWS-1253"}, + + {1254, "CP1254"}, + {1254, "MS-TURK"}, + {1254, "WINDOWS-1254"}, + + {1255, "CP1255"}, + {1255, "MS-HEBR"}, + {1255, "WINDOWS-1255"}, + + {1256, "CP1256"}, + {1256, "MS-ARAB"}, + {1256, "WINDOWS-1256"}, + + {1257, "CP1257"}, + {1257, "WINBALTRIM"}, + {1257, "WINDOWS-1257"}, + + {1258, "CP1258"}, + {1258, "WINDOWS-1258"}, + + {850, "850"}, + {850, "CP850"}, + {850, "IBM850"}, + {850, "CSPC850MULTILINGUAL"}, + + /* !IsValidCodePage(862) */ + {862, "862"}, + {862, "CP862"}, + {862, "IBM862"}, + {862, "CSPC862LATINHEBREW"}, + + {866, "866"}, + {866, "CP866"}, + {866, "IBM866"}, + {866, "CSIBM866"}, + + /* !IsValidCodePage(154) */ + {154, "CP154"}, + {154, "CYRILLIC-ASIAN"}, + {154, "PT154"}, + {154, "PTCP154"}, + {154, "CSPTCP154"}, + + /* !IsValidCodePage(1133) */ + {1133, "CP1133"}, + {1133, "IBM-CP1133"}, + + {874, "CP874"}, + {874, "WINDOWS-874"}, + + /* !IsValidCodePage(51932) */ + {51932, "CP51932"}, + {51932, "MS51932"}, + {51932, "WINDOWS-51932"}, + {51932, "EUC-JP"}, + + {932, "CP932"}, + {932, "MS932"}, + {932, "SHIFFT_JIS"}, + {932, "SHIFFT_JIS-MS"}, + {932, "SJIS"}, + {932, "SJIS-MS"}, + {932, "SJIS-OPEN"}, + {932, "SJIS-WIN"}, + {932, "WINDOWS-31J"}, + {932, "WINDOWS-932"}, + {932, "CSWINDOWS31J"}, + + {50221, "CP50221"}, + {50221, "ISO-2022-JP"}, + {50221, "ISO-2022-JP-MS"}, + {50221, "ISO2022-JP"}, + {50221, "ISO2022-JP-MS"}, + {50221, "MS50221"}, + {50221, "WINDOWS-50221"}, + + {936, "CP936"}, + {936, "GBK"}, + {936, "MS936"}, + {936, "WINDOWS-936"}, + + {950, "CP950"}, + {950, "BIG5"}, + + {949, "CP949"}, + {949, "UHC"}, + {949, "EUC-KR"}, + + {1361, "CP1361"}, + {1361, "JOHAB"}, + + {437, "437"}, + {437, "CP437"}, + {437, "IBM437"}, + {437, "CSPC8CODEPAGE437"}, + + {737, "CP737"}, + + {775, "CP775"}, + {775, "IBM775"}, + {775, "CSPC775BALTIC"}, + + {852, "852"}, + {852, "CP852"}, + {852, "IBM852"}, + {852, "CSPCP852"}, + + /* !IsValidCodePage(853) */ + {853, "CP853"}, + + {855, "855"}, + {855, "CP855"}, + {855, "IBM855"}, + {855, "CSIBM855"}, + + {857, "857"}, + {857, "CP857"}, + {857, "IBM857"}, + {857, "CSIBM857"}, + + /* !IsValidCodePage(858) */ + {858, "CP858"}, + + {860, "860"}, + {860, "CP860"}, + {860, "IBM860"}, + {860, "CSIBM860"}, + + {861, "861"}, + {861, "CP-IS"}, + {861, "CP861"}, + {861, "IBM861"}, + {861, "CSIBM861"}, + + {863, "863"}, + {863, "CP863"}, + {863, "IBM863"}, + {863, "CSIBM863"}, + + {864, "CP864"}, + {864, "IBM864"}, + {864, "CSIBM864"}, + + {865, "865"}, + {865, "CP865"}, + {865, "IBM865"}, + {865, "CSIBM865"}, + + {869, "869"}, + {869, "CP-GR"}, + {869, "CP869"}, + {869, "IBM869"}, + {869, "CSIBM869"}, + + /* !IsValidCodePage(1152) */ + {1125, "CP1125"}, + + /* + * Code Page Identifiers + * http://msdn2.microsoft.com/en-us/library/ms776446.aspx + */ + {37, "IBM037"}, /* IBM EBCDIC US-Canada */ + {437, "IBM437"}, /* OEM United States */ + {500, "IBM500"}, /* IBM EBCDIC International */ + {708, "ASMO-708"}, /* Arabic (ASMO 708) */ + /* 709 Arabic (ASMO-449+, BCON V4) */ + /* 710 Arabic - Transparent Arabic */ + {720, "DOS-720"}, /* Arabic (Transparent ASMO); Arabic (DOS) */ + {737, "ibm737"}, /* OEM Greek (formerly 437G); Greek (DOS) */ + {775, "ibm775"}, /* OEM Baltic; Baltic (DOS) */ + {850, "ibm850"}, /* OEM Multilingual Latin 1; Western European (DOS) */ + {852, "ibm852"}, /* OEM Latin 2; Central European (DOS) */ + {855, "IBM855"}, /* OEM Cyrillic (primarily Russian) */ + {857, "ibm857"}, /* OEM Turkish; Turkish (DOS) */ + {858, "IBM00858"}, /* OEM Multilingual Latin 1 + Euro symbol */ + {860, "IBM860"}, /* OEM Portuguese; Portuguese (DOS) */ + {861, "ibm861"}, /* OEM Icelandic; Icelandic (DOS) */ + {862, "DOS-862"}, /* OEM Hebrew; Hebrew (DOS) */ + {863, "IBM863"}, /* OEM French Canadian; French Canadian (DOS) */ + {864, "IBM864"}, /* OEM Arabic; Arabic (864) */ + {865, "IBM865"}, /* OEM Nordic; Nordic (DOS) */ + {866, "cp866"}, /* OEM Russian; Cyrillic (DOS) */ + {869, "ibm869"}, /* OEM Modern Greek; Greek, Modern (DOS) */ + {870, "IBM870"}, /* IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2 */ + {874, "windows-874"}, /* ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows) */ + {875, "cp875"}, /* IBM EBCDIC Greek Modern */ + {932, "shift_jis"}, /* ANSI/OEM Japanese; Japanese (Shift-JIS) */ + {932, "shift-jis"}, /* alternative name for it */ + {936, "gb2312"}, /* ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312) */ + {949, "ks_c_5601-1987"}, /* ANSI/OEM Korean (Unified Hangul Code) */ + {950, "big5"}, /* ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5) */ + {1026, "IBM1026"}, /* IBM EBCDIC Turkish (Latin 5) */ + {1047, "IBM01047"}, /* IBM EBCDIC Latin 1/Open System */ + {1140, "IBM01140"}, /* IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro) */ + {1141, "IBM01141"}, /* IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro) */ + {1142, "IBM01142"}, /* IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro) */ + {1143, "IBM01143"}, /* IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro) */ + {1144, "IBM01144"}, /* IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro) */ + {1145, "IBM01145"}, /* IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro) */ + {1146, "IBM01146"}, /* IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro) */ + {1147, "IBM01147"}, /* IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro) */ + {1148, "IBM01148"}, /* IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro) */ + {1149, "IBM01149"}, /* IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro) */ + {1250, "windows-1250"}, /* ANSI Central European; Central European (Windows) */ + {1251, "windows-1251"}, /* ANSI Cyrillic; Cyrillic (Windows) */ + {1252, "windows-1252"}, /* ANSI Latin 1; Western European (Windows) */ + {1253, "windows-1253"}, /* ANSI Greek; Greek (Windows) */ + {1254, "windows-1254"}, /* ANSI Turkish; Turkish (Windows) */ + {1255, "windows-1255"}, /* ANSI Hebrew; Hebrew (Windows) */ + {1256, "windows-1256"}, /* ANSI Arabic; Arabic (Windows) */ + {1257, "windows-1257"}, /* ANSI Baltic; Baltic (Windows) */ + {1258, "windows-1258"}, /* ANSI/OEM Vietnamese; Vietnamese (Windows) */ + {1361, "Johab"}, /* Korean (Johab) */ + {10000, "macintosh"}, /* MAC Roman; Western European (Mac) */ + {10001, "x-mac-japanese"}, /* Japanese (Mac) */ + {10002, "x-mac-chinesetrad"}, /* MAC Traditional Chinese (Big5); Chinese Traditional (Mac) */ + {10003, "x-mac-korean"}, /* Korean (Mac) */ + {10004, "x-mac-arabic"}, /* Arabic (Mac) */ + {10005, "x-mac-hebrew"}, /* Hebrew (Mac) */ + {10006, "x-mac-greek"}, /* Greek (Mac) */ + {10007, "x-mac-cyrillic"}, /* Cyrillic (Mac) */ + {10008, "x-mac-chinesesimp"}, /* MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac) */ + {10010, "x-mac-romanian"}, /* Romanian (Mac) */ + {10017, "x-mac-ukrainian"}, /* Ukrainian (Mac) */ + {10021, "x-mac-thai"}, /* Thai (Mac) */ + {10029, "x-mac-ce"}, /* MAC Latin 2; Central European (Mac) */ + {10079, "x-mac-icelandic"}, /* Icelandic (Mac) */ + {10081, "x-mac-turkish"}, /* Turkish (Mac) */ + {10082, "x-mac-croatian"}, /* Croatian (Mac) */ + {20000, "x-Chinese_CNS"}, /* CNS Taiwan; Chinese Traditional (CNS) */ + {20001, "x-cp20001"}, /* TCA Taiwan */ + {20002, "x_Chinese-Eten"}, /* Eten Taiwan; Chinese Traditional (Eten) */ + {20003, "x-cp20003"}, /* IBM5550 Taiwan */ + {20004, "x-cp20004"}, /* TeleText Taiwan */ + {20005, "x-cp20005"}, /* Wang Taiwan */ + {20105, "x-IA5"}, /* IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5) */ + {20106, "x-IA5-German"}, /* IA5 German (7-bit) */ + {20107, "x-IA5-Swedish"}, /* IA5 Swedish (7-bit) */ + {20108, "x-IA5-Norwegian"}, /* IA5 Norwegian (7-bit) */ + {20127, "us-ascii"}, /* US-ASCII (7-bit) */ + {20261, "x-cp20261"}, /* T.61 */ + {20269, "x-cp20269"}, /* ISO 6937 Non-Spacing Accent */ + {20273, "IBM273"}, /* IBM EBCDIC Germany */ + {20277, "IBM277"}, /* IBM EBCDIC Denmark-Norway */ + {20278, "IBM278"}, /* IBM EBCDIC Finland-Sweden */ + {20280, "IBM280"}, /* IBM EBCDIC Italy */ + {20284, "IBM284"}, /* IBM EBCDIC Latin America-Spain */ + {20285, "IBM285"}, /* IBM EBCDIC United Kingdom */ + {20290, "IBM290"}, /* IBM EBCDIC Japanese Katakana Extended */ + {20297, "IBM297"}, /* IBM EBCDIC France */ + {20420, "IBM420"}, /* IBM EBCDIC Arabic */ + {20423, "IBM423"}, /* IBM EBCDIC Greek */ + {20424, "IBM424"}, /* IBM EBCDIC Hebrew */ + {20833, "x-EBCDIC-KoreanExtended"}, /* IBM EBCDIC Korean Extended */ + {20838, "IBM-Thai"}, /* IBM EBCDIC Thai */ + {20866, "koi8-r"}, /* Russian (KOI8-R); Cyrillic (KOI8-R) */ + {20871, "IBM871"}, /* IBM EBCDIC Icelandic */ + {20880, "IBM880"}, /* IBM EBCDIC Cyrillic Russian */ + {20905, "IBM905"}, /* IBM EBCDIC Turkish */ + {20924, "IBM00924"}, /* IBM EBCDIC Latin 1/Open System (1047 + Euro symbol) */ + {20932, "EUC-JP"}, /* Japanese (JIS 0208-1990 and 0121-1990) */ + {20936, "x-cp20936"}, /* Simplified Chinese (GB2312); Chinese Simplified (GB2312-80) */ + {20949, "x-cp20949"}, /* Korean Wansung */ + {21025, "cp1025"}, /* IBM EBCDIC Cyrillic Serbian-Bulgarian */ + /* 21027 (deprecated) */ + {21866, "koi8-u"}, /* Ukrainian (KOI8-U); Cyrillic (KOI8-U) */ + {28591, "iso-8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */ + {28591, "iso8859-1"}, /* ISO 8859-1 Latin 1; Western European (ISO) */ + {28592, "iso-8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */ + {28592, "iso8859-2"}, /* ISO 8859-2 Central European; Central European (ISO) */ + {28593, "iso-8859-3"}, /* ISO 8859-3 Latin 3 */ + {28593, "iso8859-3"}, /* ISO 8859-3 Latin 3 */ + {28594, "iso-8859-4"}, /* ISO 8859-4 Baltic */ + {28594, "iso8859-4"}, /* ISO 8859-4 Baltic */ + {28595, "iso-8859-5"}, /* ISO 8859-5 Cyrillic */ + {28595, "iso8859-5"}, /* ISO 8859-5 Cyrillic */ + {28596, "iso-8859-6"}, /* ISO 8859-6 Arabic */ + {28596, "iso8859-6"}, /* ISO 8859-6 Arabic */ + {28597, "iso-8859-7"}, /* ISO 8859-7 Greek */ + {28597, "iso8859-7"}, /* ISO 8859-7 Greek */ + {28598, "iso-8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */ + {28598, "iso8859-8"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Visual) */ + {28599, "iso-8859-9"}, /* ISO 8859-9 Turkish */ + {28599, "iso8859-9"}, /* ISO 8859-9 Turkish */ + {28603, "iso-8859-13"}, /* ISO 8859-13 Estonian */ + {28603, "iso8859-13"}, /* ISO 8859-13 Estonian */ + {28605, "iso-8859-15"}, /* ISO 8859-15 Latin 9 */ + {28605, "iso8859-15"}, /* ISO 8859-15 Latin 9 */ + {29001, "x-Europa"}, /* Europa 3 */ + {38598, "iso-8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */ + {38598, "iso8859-8-i"}, /* ISO 8859-8 Hebrew; Hebrew (ISO-Logical) */ + {50220, "iso-2022-jp"}, /* ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) */ + {50221, "csISO2022JP"}, /* ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana) */ + {50222, "iso-2022-jp"}, /* ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI) */ + {50225, "iso-2022-kr"}, /* ISO 2022 Korean */ + {50225, "iso2022-kr"}, /* ISO 2022 Korean */ + {50227, "x-cp50227"}, /* ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022) */ + /* 50229 ISO 2022 Traditional Chinese */ + /* 50930 EBCDIC Japanese (Katakana) Extended */ + /* 50931 EBCDIC US-Canada and Japanese */ + /* 50933 EBCDIC Korean Extended and Korean */ + /* 50935 EBCDIC Simplified Chinese Extended and Simplified Chinese */ + /* 50936 EBCDIC Simplified Chinese */ + /* 50937 EBCDIC US-Canada and Traditional Chinese */ + /* 50939 EBCDIC Japanese (Latin) Extended and Japanese */ + {51932, "euc-jp"}, /* EUC Japanese */ + {51936, "EUC-CN"}, /* EUC Simplified Chinese; Chinese Simplified (EUC) */ + {51949, "euc-kr"}, /* EUC Korean */ + /* 51950 EUC Traditional Chinese */ + {52936, "hz-gb-2312"}, /* HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ) */ + {54936, "GB18030"}, /* Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030) */ + {57002, "x-iscii-de"}, /* ISCII Devanagari */ + {57003, "x-iscii-be"}, /* ISCII Bengali */ + {57004, "x-iscii-ta"}, /* ISCII Tamil */ + {57005, "x-iscii-te"}, /* ISCII Telugu */ + {57006, "x-iscii-as"}, /* ISCII Assamese */ + {57007, "x-iscii-or"}, /* ISCII Oriya */ + {57008, "x-iscii-ka"}, /* ISCII Kannada */ + {57009, "x-iscii-ma"}, /* ISCII Malayalam */ + {57010, "x-iscii-gu"}, /* ISCII Gujarati */ + {57011, "x-iscii-pa"}, /* ISCII Punjabi */ + + {0, NULL} +}; + +/* + * SJIS SHIFTJIS table CP932 table + * ---- --------------------------- -------------------------------- + * 5C U+00A5 YEN SIGN U+005C REVERSE SOLIDUS + * 7E U+203E OVERLINE U+007E TILDE + * 815C U+2014 EM DASH U+2015 HORIZONTAL BAR + * 815F U+005C REVERSE SOLIDUS U+FF3C FULLWIDTH REVERSE SOLIDUS + * 8160 U+301C WAVE DASH U+FF5E FULLWIDTH TILDE + * 8161 U+2016 DOUBLE VERTICAL LINE U+2225 PARALLEL TO + * 817C U+2212 MINUS SIGN U+FF0D FULLWIDTH HYPHEN-MINUS + * 8191 U+00A2 CENT SIGN U+FFE0 FULLWIDTH CENT SIGN + * 8192 U+00A3 POUND SIGN U+FFE1 FULLWIDTH POUND SIGN + * 81CA U+00AC NOT SIGN U+FFE2 FULLWIDTH NOT SIGN + * + * EUC-JP and ISO-2022-JP should be compatible with CP932. + * + * Kernel and MLang have different Unicode mapping table. Make sure + * which API is used. + */ +static compat_t cp932_compat[] = { + {0x00A5, 0x005C, COMPAT_OUT}, + {0x203E, 0x007E, COMPAT_OUT}, + {0x2014, 0x2015, COMPAT_OUT}, + {0x301C, 0xFF5E, COMPAT_OUT}, + {0x2016, 0x2225, COMPAT_OUT}, + {0x2212, 0xFF0D, COMPAT_OUT}, + {0x00A2, 0xFFE0, COMPAT_OUT}, + {0x00A3, 0xFFE1, COMPAT_OUT}, + {0x00AC, 0xFFE2, COMPAT_OUT}, + {0, 0, 0} +}; + +static compat_t cp20932_compat[] = { + {0x00A5, 0x005C, COMPAT_OUT}, + {0x203E, 0x007E, COMPAT_OUT}, + {0x2014, 0x2015, COMPAT_OUT}, + {0xFF5E, 0x301C, COMPAT_OUT|COMPAT_IN}, + {0x2225, 0x2016, COMPAT_OUT|COMPAT_IN}, + {0xFF0D, 0x2212, COMPAT_OUT|COMPAT_IN}, + {0xFFE0, 0x00A2, COMPAT_OUT|COMPAT_IN}, + {0xFFE1, 0x00A3, COMPAT_OUT|COMPAT_IN}, + {0xFFE2, 0x00AC, COMPAT_OUT|COMPAT_IN}, + {0, 0, 0} +}; + +static compat_t *cp51932_compat = cp932_compat; + +/* cp20932_compat for kernel. cp932_compat for mlang. */ +static compat_t *cp5022x_compat = cp932_compat; + +typedef HRESULT (WINAPI *CONVERTINETSTRING)( + LPDWORD lpdwMode, + DWORD dwSrcEncoding, + DWORD dwDstEncoding, + LPCSTR lpSrcStr, + LPINT lpnSrcSize, + LPBYTE lpDstStr, + LPINT lpnDstSize +); +typedef HRESULT (WINAPI *CONVERTINETMULTIBYTETOUNICODE)( + LPDWORD lpdwMode, + DWORD dwSrcEncoding, + LPCSTR lpSrcStr, + LPINT lpnMultiCharCount, + LPWSTR lpDstStr, + LPINT lpnWideCharCount +); +typedef HRESULT (WINAPI *CONVERTINETUNICODETOMULTIBYTE)( + LPDWORD lpdwMode, + DWORD dwEncoding, + LPCWSTR lpSrcStr, + LPINT lpnWideCharCount, + LPSTR lpDstStr, + LPINT lpnMultiCharCount +); +typedef HRESULT (WINAPI *ISCONVERTINETSTRINGAVAILABLE)( + DWORD dwSrcEncoding, + DWORD dwDstEncoding +); +typedef HRESULT (WINAPI *LCIDTORFC1766A)( + LCID Locale, + LPSTR pszRfc1766, + int nChar +); +typedef HRESULT (WINAPI *LCIDTORFC1766W)( + LCID Locale, + LPWSTR pszRfc1766, + int nChar +); +typedef HRESULT (WINAPI *RFC1766TOLCIDA)( + LCID *pLocale, + LPSTR pszRfc1766 +); +typedef HRESULT (WINAPI *RFC1766TOLCIDW)( + LCID *pLocale, + LPWSTR pszRfc1766 +); +static CONVERTINETSTRING ConvertINetString; +static CONVERTINETMULTIBYTETOUNICODE ConvertINetMultiByteToUnicode; +static CONVERTINETUNICODETOMULTIBYTE ConvertINetUnicodeToMultiByte; +static ISCONVERTINETSTRINGAVAILABLE IsConvertINetStringAvailable; +static LCIDTORFC1766A LcidToRfc1766A; +static RFC1766TOLCIDA Rfc1766ToLcidA; + +static int +load_mlang() +{ + HMODULE h; + if (ConvertINetString != NULL) + return TRUE; + h = LoadLibrary("mlang.dll"); + if (!h) + return FALSE; + ConvertINetString = (CONVERTINETSTRING)GetProcAddress(h, "ConvertINetString"); + ConvertINetMultiByteToUnicode = (CONVERTINETMULTIBYTETOUNICODE)GetProcAddress(h, "ConvertINetMultiByteToUnicode"); + ConvertINetUnicodeToMultiByte = (CONVERTINETUNICODETOMULTIBYTE)GetProcAddress(h, "ConvertINetUnicodeToMultiByte"); + IsConvertINetStringAvailable = (ISCONVERTINETSTRINGAVAILABLE)GetProcAddress(h, "IsConvertINetStringAvailable"); + LcidToRfc1766A = (LCIDTORFC1766A)GetProcAddress(h, "LcidToRfc1766A"); + Rfc1766ToLcidA = (RFC1766TOLCIDA)GetProcAddress(h, "Rfc1766ToLcidA"); + return TRUE; +} + +iconv_t +iconv_open(const char *tocode, const char *fromcode) +{ + rec_iconv_t *cd; + + cd = (rec_iconv_t *)calloc(1, sizeof(rec_iconv_t)); + if (cd == NULL) + { + errno = ENOMEM; + return (iconv_t)(-1); + } + +#if defined(USE_LIBICONV_DLL) + if (libiconv_iconv_open(cd, tocode, fromcode)) + return (iconv_t)cd; +#endif + + if (win_iconv_open(cd, tocode, fromcode)) + return (iconv_t)cd; + + free(cd); + errno = EINVAL; + return (iconv_t)(-1); +} + +int +iconv_close(iconv_t _cd) +{ + rec_iconv_t *cd = (rec_iconv_t *)_cd; + int r = cd->iconv_close(cd->cd); + int e = *(cd->_errno()); +#if defined(USE_LIBICONV_DLL) + if (cd->hlibiconv != NULL) + FreeLibrary(cd->hlibiconv); +#endif + free(cd); + errno = e; + return r; +} + +size_t +iconv(iconv_t _cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) +{ + rec_iconv_t *cd = (rec_iconv_t *)_cd; + size_t r = cd->iconv(cd->cd, inbuf, inbytesleft, outbuf, outbytesleft); + errno = *(cd->_errno()); + return r; +} + +static int +win_iconv_open(rec_iconv_t *cd, const char *tocode, const char *fromcode) +{ + cd->from = make_csconv(fromcode); + cd->to = make_csconv(tocode); + if (cd->from.codepage == -1 || cd->to.codepage == -1) + return FALSE; + cd->iconv_close = win_iconv_close; + cd->iconv = win_iconv; + cd->_errno = _errno; + cd->cd = (iconv_t)cd; + return TRUE; +} + +static int +win_iconv_close(iconv_t cd) +{ + return 0; +} + +static size_t +win_iconv(iconv_t _cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) +{ + rec_iconv_t *cd = (rec_iconv_t *)_cd; + ushort wbuf[MB_CHAR_MAX]; /* enough room for one character */ + int insize; + int outsize; + int wsize; + DWORD mode; + uint wc; + compat_t *cp; + int i; + + if (inbuf == NULL || *inbuf == NULL) + { + if (outbuf != NULL && *outbuf != NULL && cd->to.flush != NULL) + { + outsize = cd->to.flush(&cd->to, (uchar *)*outbuf, *outbytesleft); + if (outsize == -1) + return (size_t)(-1); + *outbuf += outsize; + *outbytesleft -= outsize; + } + if (is_unicode(cd->from.codepage) && (cd->from.mode & UNICODE_MODE_SWAPPED)) + cd->from.codepage ^= 1; + cd->from.mode = 0; + cd->to.mode = 0; + return 0; + } + + while (*inbytesleft != 0) + { + mode = cd->from.mode; + wsize = MB_CHAR_MAX; + + insize = cd->from.mbtowc(&cd->from, (const uchar *)*inbuf, *inbytesleft, wbuf, &wsize); + if (insize == -1) + return (size_t)(-1); + + if (is_unicode(cd->from.codepage) && !(cd->from.mode & UNICODE_MODE_BOM_DONE)) + { + check_utf_bom(cd, wbuf, &wsize); + cd->from.mode |= UNICODE_MODE_BOM_DONE; + } + + if (wsize == 0) + { + *inbuf += insize; + *inbytesleft -= insize; + continue; + } + + if (cd->from.compat != NULL) + { + wc = utf16_to_ucs4(wbuf); + cp = cd->from.compat; + for (i = 0; cp[i].in != 0; ++i) + { + if ((cp[i].flag & COMPAT_IN) && cp[i].out == wc) + { + ucs4_to_utf16(cp[i].in, wbuf, &wsize); + break; + } + } + } + + if (cd->to.compat != NULL) + { + wc = utf16_to_ucs4(wbuf); + cp = cd->to.compat; + for (i = 0; cp[i].in != 0; ++i) + { + if ((cp[i].flag & COMPAT_OUT) && cp[i].in == wc) + { + ucs4_to_utf16(cp[i].out, wbuf, &wsize); + break; + } + } + } + + outsize = cd->to.wctomb(&cd->to, wbuf, wsize, (uchar *)*outbuf, *outbytesleft); + if (outsize == -1) + { + cd->from.mode = mode; + return (size_t)(-1); + } + + *inbuf += insize; + *outbuf += outsize; + *inbytesleft -= insize; + *outbytesleft -= outsize; + } + + return 0; +} + +static csconv_t +make_csconv(const char *_name) +{ + CPINFOEX cpinfoex; + csconv_t cv; + int use_compat = TRUE; + int flag = 0; + char name[128]; + char *p; + + xstrlcpy(name, _name, sizeof(name)); + + /* check for option "enc_name//opt1//opt2" */ + while ((p = strrstr(name, "//")) != NULL) + { + if (_stricmp(p + 2, "nocompat") == 0) + use_compat = FALSE; + else if (_stricmp(p + 2, "translit") == 0) + flag |= FLAG_TRANSLIT; + else if (_stricmp(p + 2, "ignore") == 0) + flag |= FLAG_IGNORE; + *p = 0; + } + + cv.mode = 0; + cv.flags = flag; + cv.mblen = NULL; + cv.flush = NULL; + cv.compat = NULL; + cv.codepage = name_to_codepage(name); + if (cv.codepage == 1200 || cv.codepage == 1201) + { + cv.mbtowc = utf16_mbtowc; + cv.wctomb = utf16_wctomb; + if (_stricmp(name, "UTF-16") == 0 || + _stricmp(name, "UTF16") == 0 || + _stricmp(name, "UCS-2") == 0 || + _stricmp(name, "UCS2") == 0) + cv.flags |= FLAG_USE_BOM_ENDIAN; + } + else if (cv.codepage == 12000 || cv.codepage == 12001) + { + cv.mbtowc = utf32_mbtowc; + cv.wctomb = utf32_wctomb; + if (_stricmp(name, "UTF-32") == 0 || + _stricmp(name, "UTF32") == 0 || + _stricmp(name, "UCS-4") == 0 || + _stricmp(name, "UCS4") == 0) + cv.flags |= FLAG_USE_BOM_ENDIAN; + } + else if (cv.codepage == 65001) + { + cv.mbtowc = kernel_mbtowc; + cv.wctomb = kernel_wctomb; + cv.mblen = utf8_mblen; + } + else if ((cv.codepage == 50220 || cv.codepage == 50221 || cv.codepage == 50222) && load_mlang()) + { + cv.mbtowc = iso2022jp_mbtowc; + cv.wctomb = iso2022jp_wctomb; + cv.flush = iso2022jp_flush; + } + else if (cv.codepage == 51932 && load_mlang()) + { + cv.mbtowc = mlang_mbtowc; + cv.wctomb = mlang_wctomb; + cv.mblen = eucjp_mblen; + } + else if (IsValidCodePage(cv.codepage) + && GetCPInfoEx(cv.codepage, 0, &cpinfoex) != 0) + { + cv.mbtowc = kernel_mbtowc; + cv.wctomb = kernel_wctomb; + if (cpinfoex.MaxCharSize == 1) + cv.mblen = sbcs_mblen; + else if (cpinfoex.MaxCharSize == 2) + cv.mblen = dbcs_mblen; + else + cv.mblen = mbcs_mblen; + } + else + { + /* not supported */ + cv.codepage = -1; + } + if (use_compat) + { + switch (cv.codepage) + { + case 932: cv.compat = cp932_compat; break; + case 20932: cv.compat = cp20932_compat; break; + case 51932: cv.compat = cp51932_compat; break; + case 50220: case 50221: case 50222: cv.compat = cp5022x_compat; break; + } + } + return cv; +} + +static int +name_to_codepage(const char *name) +{ + int i; + + if (*name == '\0' || + strcmp(name, "char") == 0) + return GetACP(); + else if (strcmp(name, "wchar_t") == 0) + return 1200; + else if (_strnicmp(name, "cp", 2) == 0) + return atoi(name + 2); /* CP123 */ + else if ('0' <= name[0] && name[0] <= '9') + return atoi(name); /* 123 */ + else if (_strnicmp(name, "xx", 2) == 0) + return atoi(name + 2); /* XX123 for debug */ + + for (i = 0; codepage_alias[i].name != NULL; ++i) + if (_stricmp(name, codepage_alias[i].name) == 0) + return codepage_alias[i].codepage; + return -1; +} + +/* + * http://www.faqs.org/rfcs/rfc2781.html + */ +static uint +utf16_to_ucs4(const ushort *wbuf) +{ + uint wc = wbuf[0]; + if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) + wc = ((wbuf[0] & 0x3FF) << 10) + (wbuf[1] & 0x3FF) + 0x10000; + return wc; +} + +static void +ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize) +{ + if (wc < 0x10000) + { + wbuf[0] = wc; + *wbufsize = 1; + } + else + { + wc -= 0x10000; + wbuf[0] = 0xD800 | ((wc >> 10) & 0x3FF); + wbuf[1] = 0xDC00 | (wc & 0x3FF); + *wbufsize = 2; + } +} + +static int +is_unicode(int codepage) +{ + return (codepage == 1200 || codepage == 1201 || + codepage == 12000 || codepage == 12001 || + codepage == 65000 || codepage == 65001); +} + +/* + * Check if codepage is one of those for which the dwFlags parameter + * to MultiByteToWideChar() must be zero. Return zero or + * MB_ERR_INVALID_CHARS. The docs in Platform SDK for for Windows + * Server 2003 R2 claims that also codepage 65001 is one of these, but + * that doesn't seem to be the case. The MSDN docs for MSVS2008 leave + * out 65001 (UTF-8), and that indeed seems to be the case on XP, it + * works fine to pass MB_ERR_INVALID_CHARS in dwFlags when converting + * from UTF-8. + */ +static int +mbtowc_flags(int codepage) +{ + return (codepage == 50220 || codepage == 50221 || + codepage == 50222 || codepage == 50225 || + codepage == 50227 || codepage == 50229 || + codepage == 52936 || codepage == 54936 || + (codepage >= 57002 && codepage <= 57011) || + codepage == 65000 || codepage == 42) ? 0 : MB_ERR_INVALID_CHARS; +} + +/* + * Check if codepage is one those for which the lpUsedDefaultChar + * parameter to WideCharToMultiByte() must be NULL. The docs in + * Platform SDK for for Windows Server 2003 R2 claims that this is the + * list below, while the MSDN docs for MSVS2008 claim that it is only + * for 65000 (UTF-7) and 65001 (UTF-8). This time the earlier Platform + * SDK seems to be correct, at least for XP. + */ +static int +must_use_null_useddefaultchar(int codepage) +{ + return (codepage == 65000 || codepage == 65001 || + codepage == 50220 || codepage == 50221 || + codepage == 50222 || codepage == 50225 || + codepage == 50227 || codepage == 50229 || + codepage == 52936 || codepage == 54936 || + (codepage >= 57002 && codepage <= 57011) || + codepage == 42); +} + +static void +check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize) +{ + /* If we have a BOM, trust it, despite what the caller said */ + if (wbuf[0] == 0xFFFE && (cd->from.flags & FLAG_USE_BOM_ENDIAN)) + { + /* swap endian: 1200 <-> 1201 or 12000 <-> 12001 */ + cd->from.codepage ^= 1; + cd->from.mode |= UNICODE_MODE_SWAPPED; + wbuf[0] = 0xFEFF; + } + + /* + * Remove BOM. + * Don't do this if "to" is Unicode, + * except if "to" is UTF-8. + */ + if (wbuf[0] == 0xFEFF && (!is_unicode(cd->to.codepage) || cd->to.codepage == 65001)) + *wbufsize = 0; +} + +static char * +strrstr(const char *str, const char *token) +{ + int len = strlen(token); + const char *p = str + strlen(str); + + while (str <= --p) + if (p[0] == token[0] && strncmp(p, token, len) == 0) + return (char *)p; + return NULL; +} + +#if defined(USE_LIBICONV_DLL) +static int +libiconv_iconv_open(rec_iconv_t *cd, const char *fromcode, const char *tocode) +{ + HMODULE hlibiconv = NULL; + HMODULE hmsvcrt = NULL; + char dllname[_MAX_PATH]; + const char *p; + const char *e; + f_iconv_open _iconv_open; + + /* + * always try to load dll, so that we can switch dll in runtime. + */ + + /* XXX: getenv() can't get variable set by SetEnvironmentVariable() */ + p = getenv("WINICONV_LIBICONV_DLL"); + if (p == NULL) + p = DEFAULT_LIBICONV_DLL; + /* parse comma separated value */ + for ( ; *p != 0; p = (*e == ',') ? e + 1 : e) + { + e = strchr(p, ','); + if (p == e) + continue; + else if (e == NULL) + e = p + strlen(p); + xstrlcpyn(dllname, p, e - p, sizeof(dllname)); + hlibiconv = LoadLibrary(dllname); + if (hlibiconv != NULL) + { + if (hlibiconv == hwiniconv) + { + FreeLibrary(hlibiconv); + hlibiconv = NULL; + continue; + } + break; + } + } + + if (hlastdll != NULL) + { + /* decrement reference count */ + FreeLibrary(hlastdll); + hlastdll = NULL; + } + + if (hlibiconv == NULL) + goto failed; + + hmsvcrt = find_imported_module_by_funcname(hlibiconv, "_errno"); + if (hmsvcrt == NULL) + goto failed; + + _iconv_open = (f_iconv_open)GetProcAddress(hlibiconv, "libiconv_open"); + if (_iconv_open == NULL) + _iconv_open = (f_iconv_open)GetProcAddress(hlibiconv, "iconv_open"); + cd->iconv_close = (f_iconv_close)GetProcAddress(hlibiconv, "libiconv_close"); + if (cd->iconv_close == NULL) + cd->iconv_close = (f_iconv_close)GetProcAddress(hlibiconv, "iconv_close"); + cd->iconv = (f_iconv)GetProcAddress(hlibiconv, "libiconv"); + if (cd->iconv == NULL) + cd->iconv = (f_iconv)GetProcAddress(hlibiconv, "iconv"); + cd->_errno = (f_errno)GetProcAddress(hmsvcrt, "_errno"); + if (_iconv_open == NULL || cd->iconv_close == NULL + || cd->iconv == NULL || cd->_errno == NULL) + goto failed; + + /* increment reference count */ + hlastdll = LoadLibrary(dllname); + + cd->cd = _iconv_open(tocode, fromcode); + if (cd->cd == (iconv_t)(-1)) + goto failed; + + cd->hlibiconv = hlibiconv; + return TRUE; + +failed: + if (hlibiconv != NULL) + FreeLibrary(hlibiconv); + /* do not free hmsvcrt which is obtained by GetModuleHandle() */ + return FALSE; +} + +/* + * Reference: + * http://forums.belution.com/ja/vc/000/234/78s.shtml + * http://nienie.com/~masapico/api_ImageDirectoryEntryToData.html + * + * The formal way is + * imagehlp.h or dbghelp.h + * imagehlp.lib or dbghelp.lib + * ImageDirectoryEntryToData() + */ +#define TO_DOS_HEADER(base) ((PIMAGE_DOS_HEADER)(base)) +#define TO_NT_HEADERS(base) ((PIMAGE_NT_HEADERS)((LPBYTE)(base) + TO_DOS_HEADER(base)->e_lfanew)) +static PVOID +MyImageDirectoryEntryToData(LPVOID Base, BOOLEAN MappedAsImage, USHORT DirectoryEntry, PULONG Size) +{ + /* TODO: MappedAsImage? */ + PIMAGE_DATA_DIRECTORY p; + p = TO_NT_HEADERS(Base)->OptionalHeader.DataDirectory + DirectoryEntry; + if (p->VirtualAddress == 0) { + *Size = 0; + return NULL; + } + *Size = p->Size; + return (PVOID)((LPBYTE)Base + p->VirtualAddress); +} + +static HMODULE +find_imported_module_by_funcname(HMODULE hModule, const char *funcname) +{ + DWORD Base; + ULONG Size; + PIMAGE_IMPORT_DESCRIPTOR Imp; + PIMAGE_THUNK_DATA Name; /* Import Name Table */ + PIMAGE_IMPORT_BY_NAME ImpName; + + Base = (DWORD)hModule; + Imp = MyImageDirectoryEntryToData( + (LPVOID)Base, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + &Size); + if (Imp == NULL) + return NULL; + for ( ; Imp->OriginalFirstThunk != 0; ++Imp) + { + Name = (PIMAGE_THUNK_DATA)(Base + Imp->OriginalFirstThunk); + for ( ; Name->u1.Ordinal != 0; ++Name) + { + if (!IMAGE_SNAP_BY_ORDINAL(Name->u1.Ordinal)) + { + ImpName = (PIMAGE_IMPORT_BY_NAME) + (Base + (DWORD)Name->u1.AddressOfData); + if (strcmp((char *)ImpName->Name, funcname) == 0) + return GetModuleHandle((char *)(Base + Imp->Name)); + } + } + } + return NULL; +} +#endif + +static int +sbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) +{ + return 1; +} + +static int +dbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) +{ + int len = IsDBCSLeadByteEx(cv->codepage, buf[0]) ? 2 : 1; + if (bufsize < len) + return_error(EINVAL); + return len; +} + +static int +mbcs_mblen(csconv_t *cv, const uchar *buf, int bufsize) +{ + int len = 0; + + if (cv->codepage == 54936) { + if (buf[0] <= 0x7F) len = 1; + else if (buf[0] >= 0x81 && buf[0] <= 0xFE && + bufsize >= 2 && + ((buf[1] >= 0x40 && buf[1] <= 0x7E) || + (buf[1] >= 0x80 && buf[1] <= 0xFE))) len = 2; + else if (buf[0] >= 0x81 && buf[0] <= 0xFE && + bufsize >= 4 && + buf[1] >= 0x30 && buf[1] <= 0x39) len = 4; + else + return_error(EINVAL); + return len; + } + else + return_error(EINVAL); +} + +static int +utf8_mblen(csconv_t *cv, const uchar *buf, int bufsize) +{ + int len = 0; + + if (buf[0] < 0x80) len = 1; + else if ((buf[0] & 0xE0) == 0xC0) len = 2; + else if ((buf[0] & 0xF0) == 0xE0) len = 3; + else if ((buf[0] & 0xF8) == 0xF0) len = 4; + else if ((buf[0] & 0xFC) == 0xF8) len = 5; + else if ((buf[0] & 0xFE) == 0xFC) len = 6; + + if (len == 0) + return_error(EILSEQ); + else if (bufsize < len) + return_error(EINVAL); + return len; +} + +static int +eucjp_mblen(csconv_t *cv, const uchar *buf, int bufsize) +{ + if (buf[0] < 0x80) /* ASCII */ + return 1; + else if (buf[0] == 0x8E) /* JIS X 0201 */ + { + if (bufsize < 2) + return_error(EINVAL); + else if (!(0xA1 <= buf[1] && buf[1] <= 0xDF)) + return_error(EILSEQ); + return 2; + } + else if (buf[0] == 0x8F) /* JIS X 0212 */ + { + if (bufsize < 3) + return_error(EINVAL); + else if (!(0xA1 <= buf[1] && buf[1] <= 0xFE) + || !(0xA1 <= buf[2] && buf[2] <= 0xFE)) + return_error(EILSEQ); + return 3; + } + else /* JIS X 0208 */ + { + if (bufsize < 2) + return_error(EINVAL); + else if (!(0xA1 <= buf[0] && buf[0] <= 0xFE) + || !(0xA1 <= buf[1] && buf[1] <= 0xFE)) + return_error(EILSEQ); + return 2; + } +} + +static int +kernel_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) +{ + int len; + + len = cv->mblen(cv, buf, bufsize); + if (len == -1) + return -1; + /* If converting from ASCII, reject 8bit + * chars. MultiByteToWideChar() doesn't. Note that for ASCII we + * know that the mblen function is sbcs_mblen() so len is 1. + */ + if (cv->codepage == 20127 && buf[0] >= 0x80) + return_error(EILSEQ); + *wbufsize = MultiByteToWideChar(cv->codepage, mbtowc_flags (cv->codepage), + (const char *)buf, len, (wchar_t *)wbuf, *wbufsize); + if (*wbufsize == 0) + return_error(EILSEQ); + return len; +} + +static int +kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) +{ + BOOL usedDefaultChar = 0; + BOOL *p = NULL; + int flags = 0; + int len; + + if (bufsize == 0) + return_error(E2BIG); + if (!must_use_null_useddefaultchar(cv->codepage)) + { + p = &usedDefaultChar; +#ifdef WC_NO_BEST_FIT_CHARS + if (!(cv->flags & FLAG_TRANSLIT)) + flags |= WC_NO_BEST_FIT_CHARS; +#endif + } + len = WideCharToMultiByte(cv->codepage, flags, + (const wchar_t *)wbuf, wbufsize, (char *)buf, bufsize, NULL, p); + if (len == 0) + { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + return_error(E2BIG); + return_error(EILSEQ); + } + else if (usedDefaultChar) + return_error(EILSEQ); + else if (cv->mblen(cv, buf, len) != len) /* validate result */ + return_error(EILSEQ); + return len; +} + +/* + * It seems that the mode (cv->mode) is fixnum. + * For example, when converting iso-2022-jp(cp50221) to unicode: + * in ascii sequence: mode=0xC42C0000 + * in jisx0208 sequence: mode=0xC42C0001 + * "C42C" is same for each convert session. + * It should be: ((codepage-1)<<16)|state + */ +static int +mlang_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) +{ + int len; + int insize; + HRESULT hr; + + len = cv->mblen(cv, buf, bufsize); + if (len == -1) + return -1; + insize = len; + hr = ConvertINetMultiByteToUnicode(&cv->mode, cv->codepage, + (const char *)buf, &insize, (wchar_t *)wbuf, wbufsize); + if (hr != S_OK || insize != len) + return_error(EILSEQ); + return len; +} + +static int +mlang_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) +{ + char tmpbuf[MB_CHAR_MAX]; /* enough room for one character */ + int tmpsize = MB_CHAR_MAX; + int insize = wbufsize; + HRESULT hr; + + hr = ConvertINetUnicodeToMultiByte(&cv->mode, cv->codepage, + (const wchar_t *)wbuf, &wbufsize, tmpbuf, &tmpsize); + if (hr != S_OK || insize != wbufsize) + return_error(EILSEQ); + else if (bufsize < tmpsize) + return_error(E2BIG); + else if (cv->mblen(cv, (uchar *)tmpbuf, tmpsize) != tmpsize) + return_error(EILSEQ); + memcpy(buf, tmpbuf, tmpsize); + return tmpsize; +} + +static int +utf16_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) +{ + if (bufsize < 2) + return_error(EINVAL); + if (cv->codepage == 1200) /* little endian */ + wbuf[0] = (buf[1] << 8) | buf[0]; + else if (cv->codepage == 1201) /* big endian */ + wbuf[0] = (buf[0] << 8) | buf[1]; + if (0xDC00 <= wbuf[0] && wbuf[0] <= 0xDFFF) + return_error(EILSEQ); + if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) + { + if (bufsize < 4) + return_error(EINVAL); + if (cv->codepage == 1200) /* little endian */ + wbuf[1] = (buf[3] << 8) | buf[2]; + else if (cv->codepage == 1201) /* big endian */ + wbuf[1] = (buf[2] << 8) | buf[3]; + if (!(0xDC00 <= wbuf[1] && wbuf[1] <= 0xDFFF)) + return_error(EILSEQ); + *wbufsize = 2; + return 4; + } + *wbufsize = 1; + return 2; +} + +static int +utf16_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) +{ + if (bufsize < 2) + return_error(E2BIG); + if (cv->codepage == 1200) /* little endian */ + { + buf[0] = (wbuf[0] & 0x00FF); + buf[1] = (wbuf[0] & 0xFF00) >> 8; + } + else if (cv->codepage == 1201) /* big endian */ + { + buf[0] = (wbuf[0] & 0xFF00) >> 8; + buf[1] = (wbuf[0] & 0x00FF); + } + if (0xD800 <= wbuf[0] && wbuf[0] <= 0xDBFF) + { + if (bufsize < 4) + return_error(E2BIG); + if (cv->codepage == 1200) /* little endian */ + { + buf[2] = (wbuf[1] & 0x00FF); + buf[3] = (wbuf[1] & 0xFF00) >> 8; + } + else if (cv->codepage == 1201) /* big endian */ + { + buf[2] = (wbuf[1] & 0xFF00) >> 8; + buf[3] = (wbuf[1] & 0x00FF); + } + return 4; + } + return 2; +} + +static int +utf32_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) +{ + uint wc; + + if (bufsize < 4) + return_error(EINVAL); + if (cv->codepage == 12000) /* little endian */ + wc = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + else if (cv->codepage == 12001) /* big endian */ + wc = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; + if ((0xD800 <= wc && wc <= 0xDFFF) || 0x10FFFF < wc) + return_error(EILSEQ); + ucs4_to_utf16(wc, wbuf, wbufsize); + return 4; +} + +static int +utf32_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) +{ + uint wc; + + if (bufsize < 4) + return_error(E2BIG); + wc = utf16_to_ucs4(wbuf); + if (cv->codepage == 12000) /* little endian */ + { + buf[0] = wc & 0x000000FF; + buf[1] = (wc & 0x0000FF00) >> 8; + buf[2] = (wc & 0x00FF0000) >> 16; + buf[3] = (wc & 0xFF000000) >> 24; + } + else if (cv->codepage == 12001) /* big endian */ + { + buf[0] = (wc & 0xFF000000) >> 24; + buf[1] = (wc & 0x00FF0000) >> 16; + buf[2] = (wc & 0x0000FF00) >> 8; + buf[3] = wc & 0x000000FF; + } + return 4; +} + +/* + * 50220: ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS) + * 50221: ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow + * 1 byte Kana) + * 50222: ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte + * Kana - SO/SI) + * + * MultiByteToWideChar() and WideCharToMultiByte() behave differently + * depending on Windows version. On XP, WideCharToMultiByte() doesn't + * terminate result sequence with ascii escape. But Vista does. + * Use MLang instead. + */ + +#define ISO2022_MODE(cs, shift) (((cs) << 8) | (shift)) +#define ISO2022_MODE_CS(mode) (((mode) >> 8) & 0xFF) +#define ISO2022_MODE_SHIFT(mode) ((mode) & 0xFF) + +#define ISO2022_SI 0 +#define ISO2022_SO 1 + +/* shift in */ +static const char iso2022_SI_seq[] = "\x0F"; +/* shift out */ +static const char iso2022_SO_seq[] = "\x0E"; + +typedef struct iso2022_esc_t iso2022_esc_t; +struct iso2022_esc_t { + const char *esc; + int esc_len; + int len; + int cs; +}; + +#define ISO2022JP_CS_ASCII 0 +#define ISO2022JP_CS_JISX0201_ROMAN 1 +#define ISO2022JP_CS_JISX0201_KANA 2 +#define ISO2022JP_CS_JISX0208_1978 3 +#define ISO2022JP_CS_JISX0208_1983 4 +#define ISO2022JP_CS_JISX0212 5 + +static iso2022_esc_t iso2022jp_esc[] = { + {"\x1B\x28\x42", 3, 1, ISO2022JP_CS_ASCII}, + {"\x1B\x28\x4A", 3, 1, ISO2022JP_CS_JISX0201_ROMAN}, + {"\x1B\x28\x49", 3, 1, ISO2022JP_CS_JISX0201_KANA}, + {"\x1B\x24\x40", 3, 2, ISO2022JP_CS_JISX0208_1983}, /* unify 1978 with 1983 */ + {"\x1B\x24\x42", 3, 2, ISO2022JP_CS_JISX0208_1983}, + {"\x1B\x24\x28\x44", 4, 2, ISO2022JP_CS_JISX0212}, + {NULL, 0, 0, 0} +}; + +static int +iso2022jp_mbtowc(csconv_t *cv, const uchar *buf, int bufsize, ushort *wbuf, int *wbufsize) +{ + iso2022_esc_t *iesc = iso2022jp_esc; + char tmp[MB_CHAR_MAX]; + int insize; + HRESULT hr; + DWORD dummy = 0; + int len; + int esc_len; + int cs; + int shift; + int i; + + if (buf[0] == 0x1B) + { + for (i = 0; iesc[i].esc != NULL; ++i) + { + esc_len = iesc[i].esc_len; + if (bufsize < esc_len) + { + if (strncmp((char *)buf, iesc[i].esc, bufsize) == 0) + return_error(EINVAL); + } + else + { + if (strncmp((char *)buf, iesc[i].esc, esc_len) == 0) + { + cv->mode = ISO2022_MODE(iesc[i].cs, ISO2022_SI); + *wbufsize = 0; + return esc_len; + } + } + } + /* not supported escape sequence */ + return_error(EILSEQ); + } + else if (buf[0] == iso2022_SO_seq[0]) + { + cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SO); + *wbufsize = 0; + return 1; + } + else if (buf[0] == iso2022_SI_seq[0]) + { + cv->mode = ISO2022_MODE(ISO2022_MODE_CS(cv->mode), ISO2022_SI); + *wbufsize = 0; + return 1; + } + + cs = ISO2022_MODE_CS(cv->mode); + shift = ISO2022_MODE_SHIFT(cv->mode); + + /* reset the mode for informal sequence */ + if (buf[0] < 0x20) + { + cs = ISO2022JP_CS_ASCII; + shift = ISO2022_SI; + } + + len = iesc[cs].len; + if (bufsize < len) + return_error(EINVAL); + for (i = 0; i < len; ++i) + if (!(buf[i] < 0x80)) + return_error(EILSEQ); + esc_len = iesc[cs].esc_len; + memcpy(tmp, iesc[cs].esc, esc_len); + if (shift == ISO2022_SO) + { + memcpy(tmp + esc_len, iso2022_SO_seq, 1); + esc_len += 1; + } + memcpy(tmp + esc_len, buf, len); + + if ((cv->codepage == 50220 || cv->codepage == 50221 + || cv->codepage == 50222) && shift == ISO2022_SO) + { + /* XXX: shift-out cannot be used for mbtowc (both kernel and + * mlang) */ + esc_len = iesc[ISO2022JP_CS_JISX0201_KANA].esc_len; + memcpy(tmp, iesc[ISO2022JP_CS_JISX0201_KANA].esc, esc_len); + memcpy(tmp + esc_len, buf, len); + } + + insize = len + esc_len; + hr = ConvertINetMultiByteToUnicode(&dummy, cv->codepage, + (const char *)tmp, &insize, (wchar_t *)wbuf, wbufsize); + if (hr != S_OK || insize != len + esc_len) + return_error(EILSEQ); + + /* Check for conversion error. Assuming defaultChar is 0x3F. */ + /* ascii should be converted from ascii */ + if (wbuf[0] == buf[0] + && cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI)) + return_error(EILSEQ); + + /* reset the mode for informal sequence */ + if (cv->mode != ISO2022_MODE(cs, shift)) + cv->mode = ISO2022_MODE(cs, shift); + + return len; +} + +static int +iso2022jp_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize) +{ + iso2022_esc_t *iesc = iso2022jp_esc; + char tmp[MB_CHAR_MAX]; + int tmpsize = MB_CHAR_MAX; + int insize = wbufsize; + HRESULT hr; + DWORD dummy = 0; + int len; + int esc_len; + int cs; + int shift; + int i; + + /* + * MultiByte = [escape sequence] + character + [escape sequence] + * + * Whether trailing escape sequence is added depends on which API is + * used (kernel or MLang, and its version). + */ + hr = ConvertINetUnicodeToMultiByte(&dummy, cv->codepage, + (const wchar_t *)wbuf, &wbufsize, tmp, &tmpsize); + if (hr != S_OK || insize != wbufsize) + return_error(EILSEQ); + else if (bufsize < tmpsize) + return_error(E2BIG); + + if (tmpsize == 1) + { + cs = ISO2022JP_CS_ASCII; + esc_len = 0; + } + else + { + for (i = 1; iesc[i].esc != NULL; ++i) + { + esc_len = iesc[i].esc_len; + if (strncmp(tmp, iesc[i].esc, esc_len) == 0) + { + cs = iesc[i].cs; + break; + } + } + if (iesc[i].esc == NULL) + /* not supported escape sequence */ + return_error(EILSEQ); + } + + shift = ISO2022_SI; + if (tmp[esc_len] == iso2022_SO_seq[0]) + { + shift = ISO2022_SO; + esc_len += 1; + } + + len = iesc[cs].len; + + /* Check for converting error. Assuming defaultChar is 0x3F. */ + /* ascii should be converted from ascii */ + if (cs == ISO2022JP_CS_ASCII && !(wbuf[0] < 0x80)) + return_error(EILSEQ); + else if (tmpsize < esc_len + len) + return_error(EILSEQ); + + if (cv->mode == ISO2022_MODE(cs, shift)) + { + /* remove escape sequence */ + if (esc_len != 0) + memmove(tmp, tmp + esc_len, len); + esc_len = 0; + } + else + { + if (cs == ISO2022JP_CS_ASCII) + { + esc_len = iesc[ISO2022JP_CS_ASCII].esc_len; + memmove(tmp + esc_len, tmp, len); + memcpy(tmp, iesc[ISO2022JP_CS_ASCII].esc, esc_len); + } + if (ISO2022_MODE_SHIFT(cv->mode) == ISO2022_SO) + { + /* shift-in before changing to other mode */ + memmove(tmp + 1, tmp, len + esc_len); + memcpy(tmp, iso2022_SI_seq, 1); + esc_len += 1; + } + } + + if (bufsize < len + esc_len) + return_error(E2BIG); + memcpy(buf, tmp, len + esc_len); + cv->mode = ISO2022_MODE(cs, shift); + return len + esc_len; +} + +static int +iso2022jp_flush(csconv_t *cv, uchar *buf, int bufsize) +{ + iso2022_esc_t *iesc = iso2022jp_esc; + int esc_len; + + if (cv->mode != ISO2022_MODE(ISO2022JP_CS_ASCII, ISO2022_SI)) + { + esc_len = 0; + if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI) + esc_len += 1; + if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII) + esc_len += iesc[ISO2022JP_CS_ASCII].esc_len; + if (bufsize < esc_len) + return_error(E2BIG); + + esc_len = 0; + if (ISO2022_MODE_SHIFT(cv->mode) != ISO2022_SI) + { + memcpy(buf, iso2022_SI_seq, 1); + esc_len += 1; + } + if (ISO2022_MODE_CS(cv->mode) != ISO2022JP_CS_ASCII) + { + memcpy(buf + esc_len, iesc[ISO2022JP_CS_ASCII].esc, + iesc[ISO2022JP_CS_ASCII].esc_len); + esc_len += iesc[ISO2022JP_CS_ASCII].esc_len; + } + return esc_len; + } + return 0; +} + +#if defined(MAKE_DLL) && defined(USE_LIBICONV_DLL) +BOOL WINAPI +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) +{ + switch( fdwReason ) + { + case DLL_PROCESS_ATTACH: + hwiniconv = (HMODULE)hinstDLL; + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} +#endif + +#if defined(MAKE_EXE) +#include +#include +#include +int +main(int argc, char **argv) +{ + char *fromcode = NULL; + char *tocode = NULL; + int i; + char inbuf[BUFSIZ]; + char outbuf[BUFSIZ]; + const char *pin; + char *pout; + size_t inbytesleft; + size_t outbytesleft; + size_t rest = 0; + iconv_t cd; + size_t r; + FILE *in = stdin; + + _setmode(_fileno(stdin), _O_BINARY); + _setmode(_fileno(stdout), _O_BINARY); + + for (i = 1; i < argc; ++i) + { + if (strcmp(argv[i], "-l") == 0) + { + for (i = 0; codepage_alias[i].name != NULL; ++i) + printf("%s\n", codepage_alias[i].name); + return 0; + } + + if (strcmp(argv[i], "-f") == 0) + fromcode = argv[++i]; + else if (strcmp(argv[i], "-t") == 0) + tocode = argv[++i]; + else + { + in = fopen(argv[i], "rb"); + if (in == NULL) + { + fprintf(stderr, "cannot open %s\n", argv[i]); + return 1; + } + break; + } + } + + if (fromcode == NULL || tocode == NULL) + { + printf("usage: %s -f from-enc -t to-enc [file]\n", argv[0]); + return 0; + } + + cd = iconv_open(tocode, fromcode); + if (cd == (iconv_t)(-1)) + { + perror("iconv_open error"); + return 1; + } + + while ((inbytesleft = fread(inbuf + rest, 1, sizeof(inbuf) - rest, in)) != 0 + || rest != 0) + { + inbytesleft += rest; + pin = inbuf; + pout = outbuf; + outbytesleft = sizeof(outbuf); + r = iconv(cd, &pin, &inbytesleft, &pout, &outbytesleft); + fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, stdout); + if (r == (size_t)(-1) && errno != EINVAL && errno != E2BIG) + { + perror("conversion error"); + return 1; + } + memmove(inbuf, pin, inbytesleft); + rest = inbytesleft; + } + pout = outbuf; + outbytesleft = sizeof(outbuf); + r = iconv(cd, NULL, NULL, &pout, &outbytesleft); + fwrite(outbuf, 1, sizeof(outbuf) - outbytesleft, stdout); + if (r == (size_t)(-1)) + { + perror("conversion error"); + return 1; + } + + iconv_close(cd); + + return 0; +} +#endif + diff --git a/glibconfig.h.win32.in b/glibconfig.h.win32.in new file mode 100644 index 0000000..fbac9d2 --- /dev/null +++ b/glibconfig.h.win32.in @@ -0,0 +1,284 @@ +/* glibconfig.h.win32.in. Originally merged from two versions of + * glibconfig.h, generated by the GLib configure script, for gcc and + * MSVC. + */ + +/* glibconfig.h + * + * This is a generated file. Please modify 'glibconfig.h.win32.in' + */ + +#ifndef __G_LIBCONFIG_H__ +#define __G_LIBCONFIG_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +#define G_MINFLOAT FLT_MIN +#define G_MAXFLOAT FLT_MAX +#define G_MINDOUBLE DBL_MIN +#define G_MAXDOUBLE DBL_MAX +#define G_MINSHORT SHRT_MIN +#define G_MAXSHORT SHRT_MAX +#define G_MAXUSHORT USHRT_MAX +#define G_MININT INT_MIN +#define G_MAXINT INT_MAX +#define G_MAXUINT UINT_MAX +#define G_MINLONG LONG_MIN +#define G_MAXLONG LONG_MAX +#define G_MAXULONG ULONG_MAX + +typedef signed char gint8; +typedef unsigned char guint8; +typedef signed short gint16; +typedef unsigned short guint16; +#define G_GINT16_MODIFIER "h" +#define G_GINT16_FORMAT "hi" +#define G_GUINT16_FORMAT "hu" +typedef signed int gint32; +typedef unsigned int guint32; +#define G_GINT32_MODIFIER "" +#define G_GINT32_FORMAT "i" +#define G_GUINT32_FORMAT "u" +#define G_HAVE_GINT64 1 /* deprecated, always true */ + +#ifndef _MSC_VER +G_GNUC_EXTENSION typedef signed long long gint64; +G_GNUC_EXTENSION typedef unsigned long long guint64; +#else /* _MSC_VER */ +typedef signed __int64 gint64; +typedef unsigned __int64 guint64; +#endif /* _MSC_VER */ + +#ifndef _MSC_VER +#define G_GINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##LL)) +#else /* _MSC_VER */ +#define G_GINT64_CONSTANT(val) (val##i64) +#endif /* _MSC_VER */ +#ifndef _MSC_VER +#define G_GUINT64_CONSTANT(val) (G_GNUC_EXTENSION (val##ULL)) +#else /* _MSC_VER */ +#define G_GUINT64_CONSTANT(val) (val##Ui64) +#endif /* _MSC_VER */ +#define G_GINT64_MODIFIER "I64" +#define G_GINT64_FORMAT "I64i" +#define G_GUINT64_FORMAT "I64u" + +#if defined(_WIN64) || defined(_M_X64) || defined(_M_AMD64) + +#define GLIB_SIZEOF_VOID_P 8 +#define GLIB_SIZEOF_LONG 4 +#define GLIB_SIZEOF_SIZE_T 8 + +typedef signed long long gssize; +typedef unsigned long long gsize; +#define G_GSIZE_MODIFIER "I64" +#define G_GSSIZE_FORMAT "I64d" +#define G_GSIZE_FORMAT "I64u" + +#define G_MAXSIZE G_MAXUINT64 +#define G_MINSSIZE G_MININT64 +#define G_MAXSSIZE G_MAXINT64 + +#else + +#define GLIB_SIZEOF_VOID_P 4 +#define GLIB_SIZEOF_LONG 4 +#define GLIB_SIZEOF_SIZE_T 4 + +typedef signed int gssize; +typedef unsigned int gsize; +#define G_GSIZE_MODIFIER "" +#define G_GSSIZE_FORMAT "i" +#define G_GSIZE_FORMAT "u" + +#define G_MAXSIZE G_MAXUINT +#define G_MINSSIZE G_MININT +#define G_MAXSSIZE G_MAXINT + +#endif + +typedef gint64 goffset; +#define G_MINOFFSET G_MININT64 +#define G_MAXOFFSET G_MAXINT64 + +#define G_GOFFSET_MODIFIER G_GINT64_MODIFIER +#define G_GOFFSET_FORMAT G_GINT64_FORMAT +#define G_GOFFSET_CONSTANT(val) G_GINT64_CONSTANT(val) + + +#ifndef _WIN64 + +#define GPOINTER_TO_INT(p) ((gint) (p)) +#define GPOINTER_TO_UINT(p) ((guint) (p)) + +#define GINT_TO_POINTER(i) ((gpointer) (i)) +#define GUINT_TO_POINTER(u) ((gpointer) (u)) + +typedef signed int gintptr; +typedef unsigned int guintptr; + +#define G_GINTPTR_MODIFIER "" +#define G_GINTPTR_FORMAT "i" +#define G_GUINTPTR_FORMAT "u" + +#else + +#define GPOINTER_TO_INT(p) ((gint) (gint64) (p)) +#define GPOINTER_TO_UINT(p) ((guint) (guint64) (p)) + +#define GINT_TO_POINTER(i) ((gpointer) (gint64) (i)) +#define GUINT_TO_POINTER(u) ((gpointer) (guint64) (u)) + +#ifndef _MSC_VER +typedef signed long long gintptr; +typedef unsigned long long guintptr; +#else +typedef signed __int64 gintptr; +typedef unsigned __int64 guintptr; +#endif + +#define G_GINTPTR_MODIFIER "I64" +#define G_GINTPTR_FORMAT "I64i" +#define G_GUINTPTR_FORMAT "I64u" + +#endif + +#ifdef NeXT /* @#%@! NeXTStep */ +# define g_ATEXIT(proc) (!atexit (proc)) +#else +# define g_ATEXIT(proc) (atexit (proc)) +#endif + +#define g_memmove(dest,src,len) G_STMT_START { memmove ((dest), (src), (len)); } G_STMT_END + +#define GLIB_MAJOR_VERSION @GLIB_MAJOR_VERSION@ +#define GLIB_MINOR_VERSION @GLIB_MINOR_VERSION@ +#define GLIB_MICRO_VERSION @GLIB_MICRO_VERSION@ + +#define G_OS_WIN32 +#define G_PLATFORM_WIN32 +@GLIB_WIN32_STATIC_COMPILATION_DEFINE@ + +#ifndef _MSC_VER +#define G_VA_COPY va_copy +#endif /* not _MSC_VER */ + +#ifdef __cplusplus +#define G_HAVE_INLINE 1 +#else /* !__cplusplus */ +#ifndef _MSC_VER +#define G_HAVE_INLINE 1 +#endif /* _MSC_VER */ +#define G_HAVE___INLINE 1 +#if !defined(_MSC_VER) && !defined(__DMC__) +#define G_HAVE___INLINE__ 1 +#endif /* !_MSC_VER and !__DMC__ */ +#endif /* !__cplusplus */ + +#define G_CAN_INLINE 1 + +#ifndef _MSC_VER +#define G_HAVE_ISO_VARARGS 1 + +/* gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi + * is passed ISO vararg support is turned off, and there is no work + * around to turn it on, so we unconditionally turn it off. + */ +#if __GNUC__ == 2 && __GNUC_MINOR__ == 95 +# undef G_HAVE_ISO_VARARGS +#endif + +#define G_HAVE_GNUC_VARARGS 1 +#else /* _MSC_VER */ +/* varargs macros available since msvc8 (vs2005) */ +# if _MSC_VER >= 1400 +# define G_HAVE_ISO_VARARGS 1 +# endif +#endif /* not _MSC_VER */ +#define G_HAVE_GROWING_STACK 0 + +#define G_GNUC_INTERNAL + +#define G_THREADS_ENABLED +#define G_THREADS_IMPL_WIN32 +typedef struct _GMutex* GStaticMutex; +#define G_STATIC_MUTEX_INIT NULL +#define g_static_mutex_get_mutex(mutex) \ + (g_static_mutex_get_mutex_impl_shortcut (mutex)) +/* This represents a system thread as used by the implementation. An + * alien implementaion, as loaded by g_thread_init can only count on + * "sizeof (gpointer)" bytes to store their info. We however need more + * for some of our native implementations. */ +typedef union _GSystemThread GSystemThread; +union _GSystemThread +{ +#ifndef _WIN64 + char data[4]; +#else + char data[8]; +#endif + double dummy_double; + void *dummy_pointer; + long dummy_long; +}; + +#define GINT16_TO_LE(val) ((gint16) (val)) +#define GUINT16_TO_LE(val) ((guint16) (val)) +#define GINT16_TO_BE(val) ((gint16) GUINT16_SWAP_LE_BE (val)) +#define GUINT16_TO_BE(val) (GUINT16_SWAP_LE_BE (val)) +#define GINT32_TO_LE(val) ((gint32) (val)) +#define GUINT32_TO_LE(val) ((guint32) (val)) +#define GINT32_TO_BE(val) ((gint32) GUINT32_SWAP_LE_BE (val)) +#define GUINT32_TO_BE(val) (GUINT32_SWAP_LE_BE (val)) +#define GINT64_TO_LE(val) ((gint64) (val)) +#define GUINT64_TO_LE(val) ((guint64) (val)) +#define GINT64_TO_BE(val) ((gint64) GUINT64_SWAP_LE_BE (val)) +#define GUINT64_TO_BE(val) (GUINT64_SWAP_LE_BE (val)) +#define GLONG_TO_LE(val) ((glong) GINT32_TO_LE (val)) +#define GULONG_TO_LE(val) ((gulong) GUINT32_TO_LE (val)) +#define GLONG_TO_BE(val) ((glong) GINT32_TO_BE (val)) +#define GULONG_TO_BE(val) ((gulong) GUINT32_TO_BE (val)) +#define GINT_TO_LE(val) ((gint) GINT32_TO_LE (val)) +#define GUINT_TO_LE(val) ((guint) GUINT32_TO_LE (val)) +#define GINT_TO_BE(val) ((gint) GINT32_TO_BE (val)) +#define GUINT_TO_BE(val) ((guint) GUINT32_TO_BE (val)) +#define GSIZE_TO_LE(val) ((gsize) GUINT32_TO_LE (val)) +#define GSSIZE_TO_LE(val) ((gssize) GINT32_TO_LE (val)) +#define GSIZE_TO_BE(val) ((gsize) GUINT32_TO_BE (val)) +#define GSSIZE_TO_BE(val) ((gssize) GINT32_TO_BE (val)) +#define G_BYTE_ORDER G_LITTLE_ENDIAN + +#define GLIB_SYSDEF_POLLIN =1 +#define GLIB_SYSDEF_POLLOUT =4 +#define GLIB_SYSDEF_POLLPRI =2 +#define GLIB_SYSDEF_POLLHUP =16 +#define GLIB_SYSDEF_POLLERR =8 +#define GLIB_SYSDEF_POLLNVAL =32 + +#define G_MODULE_SUFFIX "dll" + +/* A GPid is an abstraction for a process "handle". It is *not* an + * abstraction for a process identifier in general. GPid is used in + * GLib only for descendant processes spawned with the g_spawn* + * functions. On POSIX there is no "process handle" concept as such, + * but on Windows a GPid is a handle to a process, a kind of pointer, + * not a process identifier. + */ +typedef void * GPid; + +#define GLIB_SYSDEF_AF_UNIX 1 +#define GLIB_SYSDEF_AF_INET 2 +#define GLIB_SYSDEF_AF_INET6 23 + +#define GLIB_SYSDEF_MSG_OOB 1 +#define GLIB_SYSDEF_MSG_PEEK 2 +#define GLIB_SYSDEF_MSG_DONTROUTE 4 + +G_END_DECLS + +#endif /* GLIBCONFIG_H */ diff --git a/gmodule-2.0-uninstalled.pc.in b/gmodule-2.0-uninstalled.pc.in new file mode 100644 index 0000000..68f3091 --- /dev/null +++ b/gmodule-2.0-uninstalled.pc.in @@ -0,0 +1,8 @@ +gmodule_supported=@G_MODULE_SUPPORTED@ + +Name: GModule Uninstalled +Description: Dynamic module loader for GLib, Not Installed +Requires: glib-2.0-uninstalled +Version: @VERSION@ +Libs: @G_MODULE_LDFLAGS@ ${pc_top_builddir}/${pcfiledir}/gmodule/libgmodule-2.0.la @G_THREAD_LIBS@ +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@/gmodule @G_THREAD_CFLAGS@ diff --git a/gmodule-2.0.pc.in b/gmodule-2.0.pc.in new file mode 100644 index 0000000..c9cd04c --- /dev/null +++ b/gmodule-2.0.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +gmodule_supported=@G_MODULE_SUPPORTED@ + +Name: GModule +Description: Dynamic module loader for GLib +Requires: glib-2.0 +Version: @VERSION@ +Libs: -L${libdir} @G_MODULE_LDFLAGS@ -lgmodule-2.0 @G_THREAD_LIBS@ +Libs.private: @G_MODULE_LIBS@ +Cflags: @G_THREAD_CFLAGS@ diff --git a/gmodule-export-2.0.pc.in b/gmodule-export-2.0.pc.in new file mode 100644 index 0000000..c9cd04c --- /dev/null +++ b/gmodule-export-2.0.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +gmodule_supported=@G_MODULE_SUPPORTED@ + +Name: GModule +Description: Dynamic module loader for GLib +Requires: glib-2.0 +Version: @VERSION@ +Libs: -L${libdir} @G_MODULE_LDFLAGS@ -lgmodule-2.0 @G_THREAD_LIBS@ +Libs.private: @G_MODULE_LIBS@ +Cflags: @G_THREAD_CFLAGS@ diff --git a/gmodule-no-export-2.0-uninstalled.pc.in b/gmodule-no-export-2.0-uninstalled.pc.in new file mode 100644 index 0000000..115820d --- /dev/null +++ b/gmodule-no-export-2.0-uninstalled.pc.in @@ -0,0 +1,14 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +gmodule_supported=true + +Name: GModule +Description: Dynamic module loader for GLib +Requires: glib-2.0 +Version: @VERSION@ +Libs: ${pc_top_builddir}/${pcfiledir}/gmodule/libgmodule-2.0.la @G_THREAD_LIBS@ +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@/gmodule @G_THREAD_CFLAGS@ + diff --git a/gmodule-no-export-2.0.pc.in b/gmodule-no-export-2.0.pc.in new file mode 100644 index 0000000..3edd98b --- /dev/null +++ b/gmodule-no-export-2.0.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +gmodule_supported=@G_MODULE_SUPPORTED@ + +Name: GModule +Description: Dynamic module loader for GLib +Requires: glib-2.0 +Version: @VERSION@ +Libs: -L${libdir} -lgmodule-2.0 @G_THREAD_LIBS@ +Libs.private: @G_MODULE_LIBS@ +Cflags: @G_THREAD_CFLAGS@ diff --git a/gmodule/AUTHORS b/gmodule/AUTHORS new file mode 100644 index 0000000..3282695 --- /dev/null +++ b/gmodule/AUTHORS @@ -0,0 +1 @@ +Tim Janik diff --git a/gmodule/COPYING b/gmodule/COPYING new file mode 100644 index 0000000..bf50f20 --- /dev/null +++ b/gmodule/COPYING @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307 USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/gmodule/ChangeLog b/gmodule/ChangeLog new file mode 100644 index 0000000..fff7980 --- /dev/null +++ b/gmodule/ChangeLog @@ -0,0 +1,1042 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-03-01 Matthias Clasen + + Bug 71704 - Header file include order + + * gmodule.c: Include gmodule.h before io.h. + Pointed out by Kazuki Iwamoto + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + +2008-12-15 Matthias Clasen + + * === Released 2.19.3 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + +2008-10-16 Matthias Clasen + + * === Released 2.19.0 === + +2008-09-26 Tor Lillqvist + + * gmodule-win32.c: Improve error reporting: When g_module_open() + fails, include the name of the module passed to LoadLibrary() in + what g_module_error() returns. + +2008-09-17 Matthias Clasen + + * === Released 2.18.1 === + +2008-09-08 Tor Lillqvist + + Bug 551408 - gmodule.def generated to builddir, but required in srcdir + + * Makefile.am: Use gmodule.def from builddir, not srcdir. + +2008-09-02 Matthias Clasen + + * === Released 2.18.0 === + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.5 === + +2008-08-01 Hans Breuer + + * makefile.msc.in : adapt to gmodule.symbols usage + +2008-07-27 Tor Lillqvist + + * gmodule.symbols: New file. + + * gmodule.c: Bypass the Windows ABI compatibility symbols on + 64-bit Windows. Thus no need to keep the file name in system + codepage around on 64-bit Windows either. + + * Makefile.am: Produce gmodule.def from gmodule.symbols. Dist + gmodule.symbols instead of gmodule.def. + + * gmodule.def: Drop from SVN. + +2008-07-27 Tor Lillqvist + + * Makefile.am (gmodule-2.0.lib): Pass appropriate -machine flag to + lib.exe. + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.2 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.1 === + +2008-05-28 Michael Natterer + + * Makefile.am: don't define G_DISABLE_SINGLE_INCLUDES, it's in + the global CPPFLAGS now. + +2008-05-27 Matthias Clasen + + * === Released 2.17.0 === + +2008-05-05 Michael Natterer + + * Makefile.am. build with G_DISABLE_SINGLE_INCLUDES to prevent + code from being checked in that breaks the build of applications + which use G_DISABLE_SINGLE_INCLUDES. + + * gmodule.c: #include "glib.h" instead of "glibconfig.h" + +2008-03-16 Tor Lillqvist + + * Makefile.am: Define gmodule_def locally here instead of using an + Autoconf variable. + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + +2008-02-25 Matthias Clasen + + * === Released 2.15.6 === + +2008-02-11 Matthias Clasen + + * === Released 2.15.5 === + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + +2008-01-14 Matthias Clasen + + * === Released 2.15.2 === + +008-01-07 Matthias Clasen + + * === Released 2.15.1 === + +2007-12-22 Matthias Clasen + + * gmodule.c (g_module_open): Don't fail to load modules + with suffix .la. (#480122, Andrey Tsyvarev) + +2007-12-20 Matthias Clasen + + * === Released 2.15.0 === + +2007-11-08 Matthias Clasen + + * gmodule.c: Include glibconfig.h before checking G_OS_WIN32. + +2007-11-07 Matthias Clasen + + * *.c: Make header include order consistent (#71704, + Diego Escalante Urrelo) + +2007-11-07 Matthias Clasen + + * === Released 2.14.3 === + +2007-10-16 Matthias Clasen + + * === Released 2.14.2 === + +2007-09-19 Matthias Clasen + + * === Released 2.14.1 === + +2007-08-03 Matthias Clasen + + * === Released 2.14.0 === + +2007-07-12 Matthias Clasen + + * === Released 2.13.7 === + +2007-07-09 Matthias Clasen + + * gmodule.c (g_module_open): Include the module file + name to the error message given when module initialization + fails. (#445813, Gustavo Carneiro) + +Fri Jun 29 2007 Matthias Clasen + + * === Released 2.13.6 === + +2007-06-18 Matthias Clasen + + * === Released 2.13.5 === + +2007-06-05 Matthias Clasen + + * === Released 2.13.4 === + +2007-06-04 Matthias Clasen + + * === Released 2.13.3 === + +2007-05-22 Matthias Clasen + + * === Released 2.13.2 === + +2007-05-03 Matthias Clasen + + * === Released 2.13.1 === + +2007-03-16 Matthias Clasen + + * === Released 2.13.0 === + +2007-01-19 Tor Lillqvist + + * Makefile.am (gmodule-2.0.lib): Use $(srcdir) for builds outside + srcdir. + +2006-12-31 Matthias Clasen + + * gmodule.c: Fix include order for win32. (#390943, + Kazuki Iwamoto) + +2006-12-28 Matthias Clasen + + * gmodule.c: Clean up includes. + +2006-12-13 Matthias Clasen + + * gmodule.c (g_module_open): + * gmodule-dl.c (_g_module_symbol): Handle valid symbols + that are NULL correctly. (#385388, Felix Kater) + +Mon Sep 11 14:58:56 2006 Tim Janik + + * gmodule.c: applied patch from Christian Persch to support + G_DEBUG flags resident-modules and bind-now-modules, bug #345099. + +2006-08-29 Tor Lillqvist + + Remove support for Windows 9x/ME. GTK+ hasn't worked on Win9x + since 2.6. It's pointless to keep the Win9x code in here as it + isn't being maintained anyway. If somebody is interested, it is in + older GLib versions, and in CVS. + + * gmodule-win32.c (_g_module_open): Remove the Win9x branch of if + statement. + +2006-08-15 Matthias Clasen + + * === Released 2.12.2 === + +2006-07-22 Matthias Clasen + + * === Released 2.12.1 === + +2006-07-02 Matthias Clasen + + * === Released 2.12.0 === + +2006-06-20 Matthias Clasen + + * === Released 2.11.4 === + +2006-06-12 Matthias Clasen + + * === Released 2.11.3 === + +2006-06-05 Matthias Clasen + + * === Released 2.11.2 === + +2006-05-15 Matthias Clasen + + * === Released 2.11.1 === + +2006-05-02 Matthias Clasen + + * === Released 2.11.0 === + +2006-03-29 Matthias Clasen + + * gmodule.c (g_module_symbol): Make sure to + not return TRUE if symbol is NULL. (#334440, + ITOH Yasufumi) + +2006-03-07 Matthias Clasen + + * === Released 2.10.1 === + +2006-02-24 Matthias Clasen + + * === Released 2.10.0 === + +2006-02-10 Matthias Clasen + + * === Released 2.9.6 === + +2006-01-27 Matthias Clasen + + * === Released 2.9.5 === + +2006-01-18 Matthias Clasen + + * === Released 2.9.4 === + +2006-01-16 Matthias Clasen + + * === Released 2.9.3 === + +2006-01-05 Matthias Clasen + + * === Released 2.9.2 === + +2005-12-09 Matthias Clasen + + * === Released 2.9.1 === + +2005-11-28 Matthias Clasen + + * gmodule.c (parse_libtool_archive): Silence + compiler warnings. + +2005-11-17 Matthias Clasen + + * === Released 2.9.0 === + +2005-08-23 Matthias Clasen + + * === Released 2.8.1 === + +2005-08-12 Matthias Clasen + + * === Released 2.8.0 === + +2005-08-05 Matthias Clasen + + * === Released 2.7.7 === + +2005-08-03 Matthias Clasen + + * === Released 2.7.6 === + +2005-08-02 Matthias Clasen + + * === Released 2.7.5 === + +2005-07-21 Matthias Clasen + + * === Released 2.7.4 === + +2005-07-15 Matthias Clasen + + * === Released 2.7.3 === + +2005-07-09 Tor Lillqvist + + * Makefile.am: Don't use the scripts in build/win32 to compile + gmodule.rc into a resource object file. (This means we lose the + build number increment magic, but I doubt it was that useful + anyway.) Instead use windres directly. To pass the normal .o file + produced by windres through libtool, which wants .lo files, pass + it directly to the linker using a -Wl option. + + * gmodule.rc.in: Thus replace BUILDNUMBER with 0. + +2005-07-08 Matthias Clasen + + * === Released 2.7.2 === + +2005-06-30 Matthias Clasen + + * === Released 2.7.1 === + +2005-06-30 Matthias Clasen + + * gmodule-ar.c: Include stdlib.h + +2005-06-26 Tor Lillqvist + + * Makefile.am: libtool installs/uninstalls the import library, no + need to do it ourselves. Do still install/uninstall the .def file, + though. + +2005-06-24 Tor Lillqvist + + * Makefile.am (install-libtool-import-lib): Current GNU tools do + understand the PRIVATE keyword. + +2005-06-10 Matthias Clasen + + * === Released 2.7.0 === + +2005-01-07 Matthias Clasen + + * === Released 2.6.1 === + +2004-12-31 Tor Lillqvist + + * gmodule.c (g_module_open): It's wrong to call g_file_test() with + more than one test (both G_FILE_TEST_EXISTS and _IS_REGULAR). (It + would succeed even if the pathname existed as a nonregular file.) + Just G_FILE_TEST_IS_REGULAR works fine. (#162594) + +2004-12-16 Matthias Clasen + + * === Released 2.6.0 === + +2004-12-06 Tor Lillqvist + + * Makefile.am + * gmodule.def + * gmodule.[hc]: Win32 DLL ABI stability cruft like in ../glib. + +2004-12-02 Matthias Clasen + + * === Released 2.5.7 === + +2004-11-12 Matthias Clasen + + * === Released 2.5.6 === + +2004-11-04 Tor Lillqvist + + * gmodule-win32.c (_g_module_open): Argument is in UTF-8. Use wide + character Win32 API if present. + + * gmodule.c (parse_libtool_archive, g_module_open): Convert file + name to UTF-8 before storing in the error message string. + + * gmodule.c (parse_libtool_archive): Use g_open(). + +2004-11-02 Matthias Clasen + + * === Released 2.5.5 === + +2004-10-27 Matthias Clasen + + * === Released 2.5.4 === + +2004-09-18 Matthias Clasen + + * === Released 2.5.3 === + +2004-08-25 Matthias Clasen + + * === Released 2.5.2 === + +2004-08-01 Matthias Clasen + + * === Released 2.5.1 === + +Sun Jul 18 18:03:08 2004 Soeren Sandmann + + * === Released 2.5.0 === + +Mon May 31 00:09:10 2004 Matthias Clasen + + * Makefile.am (EXTRA_DIST): Add gmodule-ar.c. (#85930, Tomas Ögren) + +Tue May 11 23:23:21 2004 Matthias Clasen + + * gmodule-ar.c (_g_module_open): Make it compile on AIX. + (#141159, Michael Wilson) + +2004-03-31 Tor Lillqvist + + * gmodule-win32.c (_g_module_build_path): On Cygwin, use the "cyg" + prefix, and accept also the normal "lib". (#138403, Roger Leigh) + +Tue Feb 24 14:09:21 2004 Owen Taylor + + * === Released 2.3.3 === + +Sun Feb 22 02:28:43 2004 Matthias Clasen + + Bug #85930, Laurent Vivier: + + * gmodule-ar.c: Implementation of native module management for AIX. + * gmoduleconf.h.in: + * gmodule.c: Support gmodule-ar.c + +2003-01-01 Tor Lillqvist + + * gmodule-win32.c (_g_module_build_path): Use g_ascii_strcasecmp(). + +Tue Dec 3 20:56:19 2002 Owen Taylor + + * gmodule.c (g_module_open): Properly refcount the + main module if it is already open. (#98648) + +Sat Mar 2 14:46:17 2002 Owen Taylor + + * gmodule-beos.c (_g_module_build_path) * gmodule-dyld.c (_g_module_build_path) + gmodule-dl.c (_g_module_build_path): Use G_MODULE_SUFFIX rather than + a hardcoded ".so". (#72803) + +Sun Feb 17 18:15:22 2002 Owen Taylor + + * gmodule.c (g_module_open): Fix typo when checking + if file + module_suffix exists. (Miroslaw Dobrzanski-Neumann, + #71801) + +2001-11-24 Tor Lillqvist + + * Makefile.am: Remove rule for testgmodule.exp, too. + +2001-11-22 Tor Lillqvist + + * gmodule-win32.c: Current w32api headers do include tlhelp32.h, + so no need to have an extract from it here. + +Mon Nov 19 16:12:12 2001 Owen Taylor + + * Makefile.am makefile.msc.in makefile.mingw.in: Remove + testgmodule and associated plugin files; we don't need _both_ this + and ../tests/module-test.c + +2001-11-16 Michael Meeks + + * gmodule.c (parse_libtool_archive): fix leak. + +2001-10-30 Dan Winship + + * Makefile.am (EXTRA_DIST): Add gmodule-dyld.c + +2001-10-23 Tor Lillqvist + + * Makefile.am: (Win32): If we have built the MSVC import library, + install it. Install the gcc import library. Also support + uninstall. + +2001-10-09 Tor Lillqvist + + * gmodule-win32.c (_g_module_build_path): More Unix compatibility: + Add "lib" prefix in case the module name doesn't already have it, + except if it ends with ".dll" (in which case it probably already + is the name of an existing DLL). This is needed for instance for + the gdk-pixbuf loaders, which are called "lib*.dll", but + gdk-pixbuf-io calls g_module_build_path without the "lib" prefix. + +2001-10-03 jacob berkman + + * libgplugin_a.c: (gplugin_a_module_func): + * gmodule.h: s/retrive/retrieve/ + +2001-09-25 Tor Lillqvist + + * makefile.mingw.in: Fix missing end @ in @LT_CURRENT@. + + * makefile.msc.in: Use same DLL and import library names as + libtool. + +2001-09-19 Tor Lillqvist + + * gmodule.rc.in: Correct InternalName and OriginalFilename to + match what we actually produce. + +2001-09-18 Tor Lillqvist + + * Makefile.am: On Win32, pass a dummy -rpath flag to libtool when + building libgplugin_[ab].la, otherwise libtool doesn't create a + DLL, but a static archive. + +2001-07-20 Hans Breuer + + * makefile.msc.in : reflect glib move + +2001-05-21 Mark Murnane + + * gmodule.c (g_str_check_suffix): Modified type of string_len + and suffix_len to be gsize. Properly accommodates return from + strlen(). + +2001-05-29 Sebastian Wilhelmi + + * gmodule.c (g_module_set_error_unduped): Do not g_strdup, as + promised in the function name. + +Tue May 29 12:57:51 2001 Tim Janik + + * gmodule.c (g_module_symbol): erk, strconcat needs NULL as last arg. + make sure we pass module name with suffix into backend open. + +Mon May 28 20:19:25 2001 Tim Janik + + * gmodule.c (g_module_open): as a last resort, if we can't access() + the module, leave it up to the platform backends to find it. + (fixes implicit search patch loading i broke with my last + commit, spotted by Padraig O'Briain). + +Thu May 24 03:43:12 2001 Tim Janik + + * gmodule.c (g_module_open): reordered code so we have a single + module loading point (for reliable error messages). do access() + tests to figure plausible file names. + make error messages more verbose so users canfigure what's going on. + +2001-04-20 Dan Winship + + * gmodule-dyld.c: gmodule implementation for Darwin/Mac OS X + + * gmodule.c: + * gmoduleconf.h.in: Add gmodule-dyld support + + * testgmodule.c (main): Fix spelling + +2001-03-13 Tor Lillqvist + + From Edward M. Lee : + + * gmodule-win32.c (_g_module_build_path): use (cygwin friendly) dir + separator. + +2001-03-12 Tor Lillqvist + + * Makefile.am (libgplugin_a_la_LIBADD, libgplugin_b_la_LIBADD): + Link with the libgmodule la only on Win32. + +2001-03-10 Tor Lillqvist + + * Makefile.am: Use the _LIBADD dependency on libglib only on the + Win32 platform (including Cygwin). + +2001-03-07 Sebastian Wilhelmi + + * Makefile.am, makefile.mingw.in, makefile.msc.in: Set + G_LOG_DOMAIN to \"GModule\" instead of g_log_domain_gmodule. + + * gmodule.def, gmodule.h, gmodule.c: Removed g_log_domain_gmodule. + +2001-02-21 Tor Lillqvist + + * gmodule.h: Use G_BEGIN_DECLS and G_END_DECLS. Define + G_MODULE_EXPORT correctly on Cygwin, too. + + * gmodule-win32.c (_g_module_open): Convert path to Windows format + on Cygwin. + + * Makefile.am (libglib): Use libglib-1.3.la from + top_builddir. Invoke libtool with -no-undefined for Win32 and + Cygwin. + +2001-02-17 Havoc Pennington + + Applied patch from Soeren Sandmann: + + * gmodule.c (g_module_error): G_CONST_RETURN + (g_module_name): G_CONST_RETURN + +Sat Feb 17 07:27:15 2001 Tim Janik + + * gmodule.c: work around platforms that have broken RTLD_GLOBAL. + +2001-01-27 Tor Lillqvist + + * gmodule.c: (Win32) Need for open() and close(). + +2000-12-22 Sebastian Wilhelmi + + * gmodule.c: Make g_module_open more tolerant wrt to the module + name. First it tries to open the module as named, if that fails, + it checks, whether it is a libtool archive and parses it, if that + fails it appends the systems shared library suffix + (i.e. ".so") (if not already found) and tries again and if that + fails it tries to append the ".la" libtool suffix (if not already + found) and parses it. + + * gmodule.c: Lock recursive mutex during most module functions for + safety. + + * gmodule-dl.c: Return an error from _g_module_symbol only, if + dlerror says so. All other functions return an error as well, if + dlerror returns NULL. + + * testgmodule.c: Thanks to the above change the #ifdefs have + vanished. + +2000-10-15 Raja R Harinath + + * Makefile.am (BUILT_EXTRA_DIST): New variable. + (dist-hook): Handle $(BUILT_EXTRA_DIST). + +2000-09-28 Sebastian Wilhelmi + + * gmodule.h: Moved declaration of g_log_domain_gmodule up before + the inclusion of glib.h to make it compile on non-gcc compilers. + +2000-07-22 Tor Lillqvist + + * makefile.mingw.in: Remove leftover gmodule-win32res.o stuff. The + build-dll script automagically handles resources. + +2000-07-20 Sebastian Wilhelmi + + * libgplugin_a.c, testgmodule.c: Use g_path_get_basename instead + of the deprecated g_basename. + +2000-07-19 Sebastian Wilhelmi + + * gmodule.h: include glib.h before doing extern "C". Makes some C++ + compiler happy. Reported by Denis Vakatov + . + +2000-07-19 Tor Lillqvist + + * gmodule-win32.c: Don't #include when compiling with + gcc, as it isn't provided. Declaration of a needed struct (from + www.microsoft.com) inserted instead. + +2000-05-13 Tor Lillqvist + + * makefile.mingw.in: New file, with gmodule stuff + moved from ../makefile.mingw.in. + + * Makefile.am: Add to EXTRA_DIST, and add rule to make makefile.mingw. + +2000-05-02 Tor Lillqvist + + * gmodule-win32.c: No need to include + +2000-03-23 Tor Lillqvist + + * gmodule-win32.c (_g_module_symbol): When looking for symbols in + the "main" module we must search both the main program and all + currently loaded DLLs. Not only the main program, or even just the + DLLs loaded as gmodules. Libglade requires this. + + Thus we need to get a list of all modules in the current + process. There are two alternative APIs to do this: PSAPI and + Toolhelp. The former is only available on NT (including Win2k), + the latter on Win9x and Win2k. Check which one works, and use + that. + + First check for the symbol in the main program, and if not found + there, in all the modules. + + Code for using PSAPI and Toolhelp was borrowed from the Dr. Mingw + tool written by José Fonseca . Thanks. + +2000-03-04 Tor Lillqvist + + * gmodule-win32.c: Call g_win32_error_message() to get the error + message strings. + + * libgplugin_a.c + * libgplugin_b.c + * gmodule.c: Remove LibMain functions that were needed by LCC, + which is not a supported compiler. + + * testgmodule.c (main): Test for G_MODULE_IMPL == + G_MODULE_IMPL_WIN32, not G_OS_WIN32. + + * gmoduleconf.h.win32: Remove LCC stuff from here, too. + +Wed Mar 1 05:34:47 2000 Tim Janik + + * gmodule-beos.c (_g_module_symbol): do not return NULL symbols. + + * gmodule-os2.c: removed NetBSD specific defines. + (_g_module_self): set an error message for unsupported behaviour. + + * gmodule-beos.c: many coding style fixups. + (_g_module_open): + (_g_module_self): + (_g_module_close): + (_g_module_symbol): bunch of memory leaks plugged. + + * gmodule-dl.c: make sure the error message returned from dlerror() + is always != NULL, by using a wrapper function fetch_dlerror(). based + on a patch to fix _g_module_symbol() for NetBSD from Scott Presnell + . + + * gmodule-dld.c: minor indentation. + + * gmodule-win32.c: minor cleanups. + + * merges from glib-1-2. + +Sat Feb 19 19:43:29 2000 Tim Janik + + * testgmodule.c (main): added test to check that not yet bound symbols + in shared libraries of the main module are retrievable, from David Gero. + +2000-01-13 Martin Baulig + + * gmodule.c (g_module_open): Check whether `check_init' is not NULL + before we attempt to call it. + +Sun Oct 3 19:30:52 PDT 1999 Manish Singh + + * gmodule.h + * testgmodule.c: use G_OS stuff + +Sat Jul 24 20:47:18 1999 Tim Janik + + * merged changes from GLib-1-2 branch. + +1999-05-06 Tor Lillqvist + + * gmodule.c: Remove LibMain. + +Sat May 1 10:58:57 PDT 1999 Manish Singh + + * Makefile.am: use -avoid-version and -module for test plugins + +Mon Apr 19 08:43:59 1999 ape@lrdpf.spacetec.no (Asbjorn Pettersen) + + * Makefile.am (EXTRA_DIST): Add gmodule-os2.c + +Wed Apr 7 20:12:58 1999 ape@lrdpf.spacetec.no (Asbjorn Pettersen) + + * gmodule-os2.c: OS/2 specific file for gmodule. + * gmodule.c (_g_module_open): Add gmodule-os2.c if G_MODULE_IMPL_OS2. + * gmoduleconf.h.in: Add G_MODULE_IMPL_OS2. + +Fri Apr 23 09:03:48 1999 Tim Janik + + * gmodule.c (g_module_symbol): removed inline variable assignment. + s/CHECK_ERROR/SUPPORT_OR_RETURN/ to make the code more self descriptive. + +Wed Feb 10 12:06:30 1999 Tim Janik + + * gmodule.c (CHECK_ERROR): be more descriptive on unsupported systems. + +Wed Feb 10 07:56:33 1999 Tim Janik + + * gmodule.c (g_module_error): fixed errernerous code wrt to thread + specific error string allocation handling. + +Thu Jan 21 12:40:11 EST 1999 Jeff Garzik + + * gmodule-dl.c (_g_module_build_path): + Add braces to eliminate an ambiguous else warning. + +1999-01-16 Tor Lillqvist + + * gmodule-dl.c gmodule-dld.c: In + _g_module_build_path, don't add the "lib" prefix and + ".so" or ".sl" suffix if already there. + + * gmodule-win32.c: Likewise for the ".dll" suffix. + +1998-12-10 Sebastian Wilhelmi + + * gmodule.c: Made it MT safe, the g_module_error() is now thread + specific. + +Fri Nov 20 14:43:44 1998 Tim Janik + + * gmodule.c (_g_module_build_path): added empty default imlementation + so gmodule.so compiles on systems that are not yet supported, fix from + Erik Bagfors . + +1998-11-13 Nuno Ferreira + + * Makefile.am (INCLUDES): The previous commit message is wrong + about the -I$(top_srcdir) being redundant. I put it back. + +Wed Nov 11 23:23:22 EST 1998 Jeff Garzik + + * Makefile.am : INCLUDES is the right way to add to CFLAGS, not + DEFS. Also there are bugs with '+=' in makefiles. + Got rid of DEFS line by moving G_LOG_DOMAIN setting into INCLUDES. + Removed redundant -I from INCLUDES. + +Tue Oct 27 04:00:11 1998 Tim Janik + + * testgmodule.c (main): changed the #ifdef WIN32 test to NATIVE_WIN32, + this needs to be more constistent throughout the code, do we go for + NATIVE_WIN32 or WIN32? + + * gmodule.c (LibMain): special cased the #ifdef __LCC__ case for + NATIVE_WIN32, since lcc maybe used on other platforms as well. + * libgplugin_a.c (LibMain): + * libgplugin_b.c (LibMain): + likewise. not sure i like this special requirement for lcc in here. + + * gmodule-dl.c (_g_module_build_path): + feature empty "" directories and prepend the module name with "lib". + + * gmodule-dld.c (_g_module_build_path): + * gmodule-win32.c (_g_module_build_path): + feature empty "" directories. + + * we need some more magic in the _g_module_build_path variants + so we don't append/prepend lib and .so, .sl or .dll for those names + that already contain it. + + * applied patch from Tor Lillqvist for g_module_build_path() and + windows support. + +1998-10-20: Tor Lillqvist + + * gmodule/gmodule-win32.c: + New file. + + * gmodule/gmodule.c gmodule/gmodule.h: + Added the funcion g_module_build_path that builds the path to + a module file, decorating the name according to the system's + conventions. Added the Windows implementation. + + * gmodule/libgplugin_a.c gmodule/libgplugin_b.c: + Added LibMain for LCC-Win32. + + * gmodule/testgmodule.c: + Handle Windows dll names. + +1998-10-25 Raja R Harinath + + * gmodule.h: Remove `#pragma }'. + * gmoduleconf.h.in: Likewise. + +Wed Oct 21 19:58:27 1998 Tim Janik + + * gmodule.c (g_module_symbol): fixed a string pointer bug that could + cause garbage error messages from g_module_symbol() for systems that + NEED_USCORE. + +Mon Sep 21 01:54:48 1998 Tim Janik + + * gmodule.h: + * gmodule.c: renamed old _de_init functionality to _unload. + modules are now expected to export: + G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module); + and + G_MODULE_EXPORT void g_module_unload (GModule *module); + returning a string other than NULL from g_module_check_init() will + prevent the module from being loaded. a call to g_module_make_resident() + from g_module_unload() will prevent the module from being unloaded and + still make it resident. + +Thu Sep 17 06:34:22 1998 Tim Janik + + * gmodule.h: + * gmodule.c: implemented g_module_make_resident() which can be + used to make modules resident. + fixed a buglet about the optional "g_module_de_init" function in + modules, which could get invoked twice on very obscure occasions. + +Tue Sep 15 14:57:30 1998 Owen Taylor + + * Makefile.am: Update to libtool-1.2b, + change library versioning scheme to drop LT_RELEASE + from the -l line, while keeping it in the soname. + +Thu Aug 20 07:08:16 1998 Tim Janik + + * gmodule.c: provide no operation implementation for the underlying + _g_module_* functions, so we at least compile on systems that have + neither of G_MODULE_IMPL_DL or G_MODULE_IMPL_DLD. + +Mon Aug 17 03:41:52 1998 Tim Janik + + * gmodule.h: + * gmodule.c (g_module_open): changed the return type for the + GModuleCheckInit function to be a string, describing the error + condition. + (g_module_symbol): show the failing symbol on error messages. + +Fri Aug 14 02:24:39 1998 Tim Janik + + * Makefile.am: feature the G_LOG_DOMAIN macro to set the log domain + to "GModule" upon compilation. we currently have to add this definition + to the DEFS variable. + * testgmodule.c: we need an ugly #undef G_LOG_DOMAIN at the start + of this file currently, since automake doesn't support per target + _CFLAGS yet. + +Mon Aug 10 03:35:57 1998 Tim Janik + + * gmodule.c: minor changes to internal interface. + * gmodule-dl.c: + * gmodule-dld.c: put some comments into the files, and provided + better error checking for shl_findsym(). whish i had a system to + test this stuff on. + +Mon Aug 10 02:18:31 1998 Tim Janik + + * Makefile.am (lib_LTLIBRARIES): for now, skip the dependency on + -lglib for libgmodule-1.1.la, libgplugin_a.la and libgplugin_b.la + since this clashes with inter-library-dependencies for not installed + libraries. glib-config takes care of this for the usuall case, but + there needs to be a better way... + +Sun Aug 9 15:57:38 1998 Tim Janik + + * testgmodule.c: test program for GModule. + * libgplugin_a.c: + * libgplugin_b.c: test plugins for testgmodule.c. + + * gmodule.h: + * gmodule.c: GModule library implementation, which is basically + a wrapper about system specifc dynamic loading facilities. + +Sun Aug 9 10:31:05 1998 Tim Janik + + * ChangeLog start for gmodule. diff --git a/gmodule/Makefile.am b/gmodule/Makefile.am new file mode 100644 index 0000000..93a8473 --- /dev/null +++ b/gmodule/Makefile.am @@ -0,0 +1,127 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -DG_LOG_DOMAIN=\"GModule\" \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED + +gmodule.def: gmodule.symbols + (echo -e EXPORTS; $(CPP) -P - <$(srcdir)/gmodule.symbols | sed -e '/^$$/d' -e 's/^/ /') > gmodule.def + +EXTRA_DIST += \ + makefile.msc.in \ + gmoduleconf.h.in \ + gmodule.symbols \ + gmodule-dl.c \ + gmodule-dld.c \ + gmodule-dyld.c \ + gmodule-os2.c \ + gmodule-win32.c \ + gmodule-beos.c \ + gmodule-ar.c \ + gmoduleconf.h.win32 \ + gmodule.rc.in + +BUILT_EXTRA_DIST = \ + makefile.msc \ + gmodule.rc + +BUILT_SOURCES = gmoduleconf.h +gmoduleconf.h: gmoduleconf.h.in + +glibincludedir=$(includedir)/glib-2.0 +glibinclude_HEADERS = \ + gmodule.h + +libglib = $(top_builddir)/glib/libglib-2.0.la + +top_builddir_full=`cd \$(top_builddir); pwd` + +lib_LTLIBRARIES = libgmodule-2.0.la + +if OS_WIN32_AND_DLL_COMPILATION +if MS_LIB_AVAILABLE +noinst_DATA = gmodule-2.0.lib + +install_ms_lib_cmd = $(INSTALL) gmodule-2.0.lib $(DESTDIR)$(libdir) +uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gmodule-2.0.lib +endif +endif + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +export_symbols = -export-symbols gmodule.def +gmodule_def = gmodule.def + +gmodule_win32_res = gmodule-win32-res.o +gmodule_win32_res_ldflag = -Wl,$(gmodule_win32_res) + +install-def-file: + $(INSTALL) gmodule.def $(DESTDIR)$(libdir)/gmodule-2.0.def + +uninstall-def-file: + -rm $(DESTDIR)$(libdir)/gmodule-2.0.def +else +install-def-file: +uninstall-def-file: +endif + +libgmodule_2_0_la_SOURCES = gmodule.c +libgmodule_2_0_la_LDFLAGS = \ + $(gmodule_win32_res_ldflag) \ + $(G_MODULE_LDFLAGS) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgmodule_2_0_la_LIBADD = $(G_MODULE_LIBS_EXTRA) $(G_MODULE_LIBS) $(libglib) + +libgmodule_2_0_la_DEPENDENCIES = $(gmodule_win32_res) $(gmodule_def) + +gmodule-win32-res.o: gmodule.rc + $(WINDRES) gmodule.rc $@ + +gmodule-2.0.lib: libgmodule-2.0.la gmodule.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgmodule-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gmodule.def -out:$@ + +.PHONY: files release + +files: + @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ + echo $$p; \ + done + +release: + $(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"` + +dist-hook: $(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 + + +install-data-local: install-ms-lib install-def-file + +uninstall-local: uninstall-ms-lib uninstall-def-file + +if HAVE_GLIB_RUNTIME_LIBDIR +install-data-hook: + mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgmodule-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgmodule-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + rm -f $(DESTDIR)$(libdir)/libgmodule-2.0.so + ln -s $(GLIB_RUNTIME_LIBDIR)/libgmodule-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgmodule-2.0.so +endif diff --git a/gmodule/Makefile.in b/gmodule/Makefile.in new file mode 100644 index 0000000..31c1454 --- /dev/null +++ b/gmodule/Makefile.in @@ -0,0 +1,837 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + + +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@ +DIST_COMMON = $(glibinclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/gmodule.rc.in \ + $(srcdir)/gmoduleconf.h.in $(srcdir)/makefile.msc.in \ + $(top_srcdir)/Makefile.decl AUTHORS COPYING ChangeLog +subdir = gmodule +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = gmoduleconf.h makefile.msc gmodule.rc +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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(glibincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +am_libgmodule_2_0_la_OBJECTS = gmodule.lo +libgmodule_2_0_la_OBJECTS = $(am_libgmodule_2_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgmodule_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libgmodule_2_0_la_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgmodule_2_0_la_SOURCES) +DIST_SOURCES = $(libgmodule_2_0_la_SOURCES) +DATA = $(noinst_DATA) +HEADERS = $(glibinclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = makefile.msc.in gmoduleconf.h.in gmodule.symbols \ + gmodule-dl.c gmodule-dld.c gmodule-dyld.c gmodule-os2.c \ + gmodule-win32.c gmodule-beos.c gmodule-ar.c \ + gmoduleconf.h.win32 gmodule.rc.in +TEST_PROGS = +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + -DG_LOG_DOMAIN=\"GModule\" \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED + +BUILT_EXTRA_DIST = \ + makefile.msc \ + gmodule.rc + +BUILT_SOURCES = gmoduleconf.h +glibincludedir = $(includedir)/glib-2.0 +glibinclude_HEADERS = \ + gmodule.h + +libglib = $(top_builddir)/glib/libglib-2.0.la +top_builddir_full = `cd \$(top_builddir); pwd` +lib_LTLIBRARIES = libgmodule-2.0.la +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@noinst_DATA = gmodule-2.0.lib +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@install_ms_lib_cmd = $(INSTALL) gmodule-2.0.lib $(DESTDIR)$(libdir) +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gmodule-2.0.lib +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +@OS_WIN32_AND_DLL_COMPILATION_TRUE@export_symbols = -export-symbols gmodule.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gmodule_def = gmodule.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gmodule_win32_res = gmodule-win32-res.o +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gmodule_win32_res_ldflag = -Wl,$(gmodule_win32_res) +libgmodule_2_0_la_SOURCES = gmodule.c +libgmodule_2_0_la_LDFLAGS = \ + $(gmodule_win32_res_ldflag) \ + $(G_MODULE_LDFLAGS) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgmodule_2_0_la_LIBADD = $(G_MODULE_LIBS_EXTRA) $(G_MODULE_LIBS) $(libglib) +libgmodule_2_0_la_DEPENDENCIES = $(gmodule_win32_res) $(gmodule_def) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gmodule/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gmodule/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): +gmoduleconf.h: $(top_builddir)/config.status $(srcdir)/gmoduleconf.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +makefile.msc: $(top_builddir)/config.status $(srcdir)/makefile.msc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +gmodule.rc: $(top_builddir)/config.status $(srcdir)/gmodule.rc.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 +libgmodule-2.0.la: $(libgmodule_2_0_la_OBJECTS) $(libgmodule_2_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgmodule_2_0_la_LINK) -rpath $(libdir) $(libgmodule_2_0_la_OBJECTS) $(libgmodule_2_0_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmodule.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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-glibincludeHEADERS: $(glibinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(glibincludedir)" || $(MKDIR_P) "$(DESTDIR)$(glibincludedir)" + @list='$(glibinclude_HEADERS)'; test -n "$(glibincludedir)" || 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)$(glibincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(glibincludedir)" || exit $$?; \ + done + +uninstall-glibincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(glibinclude_HEADERS)'; test -n "$(glibincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(glibincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(glibincludedir)" && rm -f $$files + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(glibincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +@HAVE_GLIB_RUNTIME_LIBDIR_FALSE@install-data-hook: +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-glibincludeHEADERS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-glibincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + +.MAKE: all check check-am install install-am install-data-am \ + install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libLTLIBRARIES clean-libtool ctags \ + dist-hook 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-hook install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-glibincludeHEADERS 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 maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-glibincludeHEADERS \ + uninstall-libLTLIBRARIES uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +gmodule.def: gmodule.symbols + (echo -e EXPORTS; $(CPP) -P - <$(srcdir)/gmodule.symbols | sed -e '/^$$/d' -e 's/^/ /') > gmodule.def +gmoduleconf.h: gmoduleconf.h.in + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ $(INSTALL) gmodule.def $(DESTDIR)$(libdir)/gmodule-2.0.def + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ -rm $(DESTDIR)$(libdir)/gmodule-2.0.def +@OS_WIN32_AND_DLL_COMPILATION_FALSE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_FALSE@uninstall-def-file: + +gmodule-win32-res.o: gmodule.rc + $(WINDRES) gmodule.rc $@ + +gmodule-2.0.lib: libgmodule-2.0.la gmodule.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgmodule-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gmodule.def -out:$@ + +.PHONY: files release + +files: + @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ + echo $$p; \ + done + +release: + $(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"` + +dist-hook: $(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 + +install-data-local: install-ms-lib install-def-file + +uninstall-local: uninstall-ms-lib uninstall-def-file + +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@install-data-hook: +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgmodule-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgmodule-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ rm -f $(DESTDIR)$(libdir)/libgmodule-2.0.so +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ ln -s $(GLIB_RUNTIME_LIBDIR)/libgmodule-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgmodule-2.0.so + +# 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/gmodule/gmodule-ar.c b/gmodule/gmodule-ar.c new file mode 100644 index 0000000..8bc847d --- /dev/null +++ b/gmodule/gmodule-ar.c @@ -0,0 +1,187 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +/* because we are compatible with archive format only since AIX 4.3 */ + +#define __AR_BIG__ + +#include "config.h" + +#include +#include + +#include + +/* --- functions --- */ +static gchar* +fetch_dlerror (gboolean replace_null) +{ + gchar *msg = dlerror (); + + /* make sure we always return an error message != NULL, if + * expected to do so. */ + + if (!msg && replace_null) + return "unknown dl-error"; + + return msg; +} + +static gchar* _g_module_get_member(const gchar* file_name) +{ + gchar* member = NULL; + struct fl_hdr file_header; + struct ar_hdr ar_header; + long first_member; + long name_len; + int fd; + + fd = open(file_name, O_RDONLY); + if (fd == -1) + return NULL; + + if (read(fd, (void*)&file_header, FL_HSZ) != FL_HSZ) + goto exit; + + if (strncmp(file_header.fl_magic, AIAMAGBIG, SAIAMAG) != 0) + goto exit; + + /* read first archive file member header */ + + first_member = atol(file_header.fl_fstmoff); + + if (lseek(fd, first_member, SEEK_SET) != first_member) + goto exit; + + if (read(fd, (void*)&ar_header, AR_HSZ - 2) != AR_HSZ - 2) + goto exit; + + /* read member name */ + + name_len = atol(ar_header.ar_namlen); + + member = g_malloc(name_len+1); + if (!member) + goto exit; + + if (read(fd, (void*)member, name_len) != name_len) + { + g_free(member); + member = NULL; + goto exit; + } + + member[name_len] = 0; + +exit: + close(fd); + + return member; +} + +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + gpointer handle; + gchar* member; + gchar* full_name; + + /* extract name of first member of archive */ + + member = _g_module_get_member (file_name); + if (member != NULL) + { + full_name = g_strconcat (file_name, "(", member, ")", NULL); + g_free (member); + } + else + full_name = g_strdup (file_name); + + handle = dlopen (full_name, + (bind_local ? RTLD_LOCAL : RTLD_GLOBAL) | RTLD_MEMBER | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + + g_free (full_name); + + if (!handle) + g_module_set_error (fetch_dlerror (TRUE)); + + return handle; +} + +static gpointer +_g_module_self (void) +{ + gpointer handle; + + handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY); + if (!handle) + g_module_set_error (fetch_dlerror (TRUE)); + + return handle; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + /* are there any systems out there that have dlopen()/dlclose() + * without a reference count implementation? + */ + is_unref |= 1; + + if (is_unref) + { + if (dlclose (handle) != 0) + g_module_set_error (fetch_dlerror (TRUE)); + } +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + gpointer p; + + p = dlsym (handle, symbol_name); + if (!p) + g_module_set_error (fetch_dlerror (FALSE)); + + return p; +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + if (directory && *directory) { + if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, "/", module_name, NULL); + else + return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL); + } else if (strncmp (module_name, "lib", 3) == 0) + return g_strdup (module_name); + else + return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL); +} diff --git a/gmodule/gmodule-beos.c b/gmodule/gmodule-beos.c new file mode 100644 index 0000000..c54eed9 --- /dev/null +++ b/gmodule/gmodule-beos.c @@ -0,0 +1,204 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * BeOS GMODULE implementation + * Copyright (C) 1999 Richard Offer and Shawn T. Amundson (amundson@gtk.org) + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ +#include "config.h" + +#include /* image (aka DSO) handling functions... */ + +/* + * The BeOS doesn't use the same symantics as Unix's dlopen.... + * + */ +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif /* RTLD_GLOBAL */ +#ifndef RTLD_LAZY +#define RTLD_LAZY 1 +#endif /* RTLD_LAZY */ +#ifndef RTLD_NOW +#define RTLD_NOW 0 +#endif /* RTLD_NOW */ + + +/* + * Points to Ponder + * + * You can load the same DSO more than once, in which case you'll have + * different image_id's. While this means that we don't have to worry about + * reference counts, it could lead to problems in the future.... + * richard. + * + * load_add_on() apparently does not support lazy or local binding. Need + * to confirm that the actual behavior is non-lazy/local. --ds + */ + +#include +#include + +/* --- functions --- */ +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + image_id handle; + + handle = load_add_on (file_name); + if (handle < B_OK) + { + gchar *msg = g_strdup_printf ("failed to load_add_on(%s): %s", + file_name, + strerror (handle)); + + g_module_set_error (msg); + g_free (msg); + + return NULL; + } + + return (gpointer) handle; +} + +static gpointer +_g_module_self (void) +{ + image_info info; + int32 cookie = 0; + status_t status; + + /* Is it always the first one? I'm guessing yes. */ + status = get_next_image_info (0, &cookie, &info); + if (status == B_OK) + return (gpointer) info.id; + else + { + gchar *msg = g_strdup_printf ("failed to get_next_image_info(self): %s", + strerror (status)); + + g_module_set_error (msg); + g_free (msg); + + return NULL; + } +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + image_info info; + gchar *name; + + if (unload_add_on ((image_id) handle) != B_OK) + { + gchar *msg; + + /* Try and get the name of the image. */ + if (get_image_info ((image_id) handle, &info) != B_OK) + name = g_strdup ("unknown"); + else + name = g_strdup (info.name); + + msg = g_strdup_printf ("failed to unload_add_on(%s): %s", name, strerror (status)); + g_module_set_error (msg); + g_free (msg); + g_free (name); + } +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + image_id id; + status_t status; + image_info info; + int32 type, name_len; + void *p; + gchar *msg, name[256]; + gint n, l; + + id = (image_id) handle; + + status = get_image_info (id, &info); + if (status != B_OK) + { + msg = g_strdup_printf ("failed to get_image_info(): %s", strerror (status)); + g_module_set_error (msg); + g_free (msg); + + return NULL; + } + + l = strlen (symbol_name); + name_len = 256; + type = B_SYMBOL_TYPE_ANY; + n = 0; + status = get_nth_image_symbol (id, n, name, &name_len, &type, &p); + while (status == B_OK) + { + if (p && strncmp (name, symbol_name, l) == 0) + return p; + + if (strcmp (name, "_end") == 0) + { + msg = g_strdup_printf ("unmatched symbol name `%s'", symbol_name); + g_module_set_error (msg); + g_free (msg); + + return NULL; + } + + name_len = 256; + type = B_SYMBOL_TYPE_ANY; + n++; + status = get_nth_image_symbol (id, n, name, &name_len, &type, &p); + } + + msg = g_strdup_printf ("failed to get_image_symbol(%s): %s", symbol_name, strerror (status)); + g_module_set_error (msg); + g_free (msg); + + return NULL; +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + g_warning ("_g_module_build_path() untested for BeOS!"); + + if (directory && *directory) + { + if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, "/", module_name, NULL); + else + return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL); + } + else if (strncmp (module_name, "lib", 3) == 0) + return g_strdup (module_name); + else + return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL); +} diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c new file mode 100644 index 0000000..035b2a9 --- /dev/null +++ b/gmodule/gmodule-dl.c @@ -0,0 +1,168 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ +#include "config.h" + +#include + +/* Perl includes and instead of on some systmes? */ + + +/* dlerror() is not implemented on all systems + */ +#ifndef G_MODULE_HAVE_DLERROR +# ifdef __NetBSD__ +# define dlerror() g_strerror (errno) +# else /* !__NetBSD__ */ +/* could we rely on errno's state here? */ +# define dlerror() "unknown dl-error" +# endif /* !__NetBSD__ */ +#endif /* G_MODULE_HAVE_DLERROR */ + +/* some flags are missing on some systems, so we provide + * harmless defaults. + * The Perl sources say, RTLD_LAZY needs to be defined as (1), + * at least for Solaris 1. + * + * Mandatory: + * RTLD_LAZY - resolve undefined symbols as code from the dynamic library + * is executed. + * RTLD_NOW - resolve all undefined symbols before dlopen returns, and fail + * if this cannot be done. + * Optionally: + * RTLD_GLOBAL - the external symbols defined in the library will be made + * available to subsequently loaded libraries. + */ +#ifndef RTLD_LAZY +#define RTLD_LAZY 1 +#endif /* RTLD_LAZY */ +#ifndef RTLD_NOW +#define RTLD_NOW 0 +#endif /* RTLD_NOW */ +/* some systems (OSF1 V5.0) have broken RTLD_GLOBAL linkage */ +#ifdef G_MODULE_BROKEN_RTLD_GLOBAL +#undef RTLD_GLOBAL +#endif /* G_MODULE_BROKEN_RTLD_GLOBAL */ +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif /* RTLD_GLOBAL */ + + +/* --- functions --- */ +static gchar* +fetch_dlerror (gboolean replace_null) +{ + gchar *msg = dlerror (); + + /* make sure we always return an error message != NULL, if + * expected to do so. */ + + if (!msg && replace_null) + return "unknown dl-error"; + + return msg; +} + +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + gpointer handle; + + handle = dlopen (file_name, + (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + if (!handle) + g_module_set_error (fetch_dlerror (TRUE)); + + return handle; +} + +static gpointer +_g_module_self (void) +{ + gpointer handle; + + /* to query symbols from the program itself, special link options + * are required on some systems. + */ + + handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY); + if (!handle) + g_module_set_error (fetch_dlerror (TRUE)); + + return handle; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + /* are there any systems out there that have dlopen()/dlclose() + * without a reference count implementation? + */ + is_unref |= 1; + + if (is_unref) + { + if (dlclose (handle) != 0) + g_module_set_error (fetch_dlerror (TRUE)); + } +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + gpointer p; + gchar *msg; + + fetch_dlerror (FALSE); + p = dlsym (handle, symbol_name); + msg = fetch_dlerror (FALSE); + if (msg) + g_module_set_error (msg); + + return p; +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + if (directory && *directory) { + if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, "/", module_name, NULL); + else + return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL); + } else if (strncmp (module_name, "lib", 3) == 0) + return g_strdup (module_name); + else + return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL); +} diff --git a/gmodule/gmodule-dld.c b/gmodule/gmodule-dld.c new file mode 100644 index 0000000..401b32f --- /dev/null +++ b/gmodule/gmodule-dld.c @@ -0,0 +1,163 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ +#include "config.h" + +#include + + +/* some flags are missing on some systems, so we provide + * harmless defaults. + * + * Mandatory: + * BIND_IMMEDIATE - Resolve symbol references when the library is loaded. + * BIND_DEFERRED - Delay code symbol resolution until actual reference. + * + * Optionally: + * BIND_FIRST - Place the library at the head of the symbol search order. + * BIND_NONFATAL - The default BIND_IMMEDIATE behavior is to treat all unsatisfied + * symbols as fatal. This flag allows binding of unsatisfied code + * symbols to be deferred until use. + * [Perl: For certain libraries, like DCE, deferred binding often + * causes run time problems. Adding BIND_NONFATAL to BIND_IMMEDIATE + * still allows unresolved references in situations like this.] + * BIND_NOSTART - Do not call the initializer for the shared library when the + * library is loaded, nor on a future call to shl_unload(). + * BIND_VERBOSE - Print verbose messages concerning possible unsatisfied symbols. + * + * hp9000s700/hp9000s800: + * BIND_RESTRICTED - Restrict symbols visible by the library to those present at + * library load time. + * DYNAMIC_PATH - Allow the loader to dynamically search for the library specified + * by the path argument. + */ +#ifndef DYNAMIC_PATH +#define DYNAMIC_PATH 0 +#endif /* DYNAMIC_PATH */ +#ifndef BIND_RESTRICTED +#define BIND_RESTRICTED 0 +#endif /* BIND_RESTRICTED */ + +#define OPT_BIND_FLAGS (BIND_NONFATAL | BIND_VERBOSE) + + +/* --- functions --- */ + +/* + * shl_load() does not appear to support making symbols invisible to + * the global namespace. However, the default is to put the library + * last in the search order, which is approximately what we want, + * since it will cause symbols that conflict with existing symbols to + * be invisible. It is unclear if BIND_FIRST should be used when + * bind_local==0, since it may cause the loaded symbols to be used + * preferentially to the application's symbols, which is Almost + * Always Wrong. --ds + */ +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + shl_t shl_handle; + + shl_handle = shl_load (file_name, + (bind_lazy ? BIND_DEFERRED : BIND_IMMEDIATE) | OPT_BIND_FLAGS, 0); + if (!shl_handle) + { + /* the hp-docs say we should better abort() if errno==ENOSYM ;( */ + g_module_set_error (g_strerror (errno)); + } + + return (gpointer) shl_handle; +} + +static gpointer +_g_module_self (void) +{ + shl_t shl_handle; + + shl_handle = PROG_HANDLE; + if (!shl_handle) + g_module_set_error (g_strerror (errno)); + + return shl_handle; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + if (!is_unref) + { + if (shl_unload ((shl_t) handle) != 0) + g_module_set_error (g_strerror (errno)); + } +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + gpointer p = NULL; + + /* should we restrict lookups to TYPE_PROCEDURE? + */ + if (handle == PROG_HANDLE) + { + /* PROG_HANDLE will only lookup symbols in the program itself, not honouring + * libraries. passing NULL as a handle will also try to lookup the symbol + * in currently loaded libraries. fix pointed out and supplied by: + * David Gero + */ + handle = NULL; + } + if (shl_findsym ((shl_t*) &handle, symbol_name, TYPE_UNDEFINED, &p) != 0 || + handle == NULL || p == NULL) + { + /* the hp-docs say we should better abort() if errno==ENOSYM ;( */ + g_module_set_error (g_strerror (errno)); + } + + return p; +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + if (directory && *directory) + if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, "/", module_name, NULL); + else + return g_strconcat (directory, "/lib", module_name, ".sl", NULL); + else if (strncmp (module_name, "lib", 3) == 0) + return g_strdup (module_name); + else + return g_strconcat ("lib", module_name, ".sl", NULL); +} diff --git a/gmodule/gmodule-dyld.c b/gmodule/gmodule-dyld.c new file mode 100644 index 0000000..1896b43 --- /dev/null +++ b/gmodule/gmodule-dyld.c @@ -0,0 +1,154 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * dyld (Darwin) GMODULE implementation + * Copyright (C) 2001 Dan Winship + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include "config.h" + +#include + +static gpointer self_module = GINT_TO_POINTER (1); + +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + NSObjectFileImage image; + NSObjectFileImageReturnCode ret; + NSModule module; + unsigned long options; + char *msg; + + ret = NSCreateObjectFileImageFromFile (file_name, &image); + if (ret != NSObjectFileImageSuccess) + { + switch (ret) + { + case NSObjectFileImageInappropriateFile: + case NSObjectFileImageFormat: + msg = g_strdup_printf ("%s is not a loadable module", file_name); + break; + + case NSObjectFileImageArch: + msg = g_strdup_printf ("%s is not built for this architecture", + file_name); + break; + + case NSObjectFileImageAccess: + if (access (file_name, F_OK) == 0) + msg = g_strdup_printf ("%s: permission denied", file_name); + else + msg = g_strdup_printf ("%s: no such file or directory", file_name); + break; + + default: + msg = g_strdup_printf ("unknown error for %s", file_name); + break; + } + + g_module_set_error (msg); + g_free (msg); + return NULL; + } + + options = NSLINKMODULE_OPTION_RETURN_ON_ERROR; + if (bind_local) + options |= NSLINKMODULE_OPTION_PRIVATE; + if (!bind_lazy) + options |= NSLINKMODULE_OPTION_BINDNOW; + module = NSLinkModule (image, file_name, options); + NSDestroyObjectFileImage (image); + if (!module) + { + NSLinkEditErrors c; + int error_number; + const char *file, *error; + + NSLinkEditError (&c, &error_number, &file, &error); + msg = g_strdup_printf ("could not link %s: %s", file_name, error); + g_module_set_error (msg); + g_free (msg); + return NULL; + } + + return module; +} + +static gpointer +_g_module_self (void) +{ + return &self_module; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + if (handle == &self_module) + return; + + if (!NSUnLinkModule (handle, 0)) + g_module_set_error ("could not unlink module"); +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + NSSymbol sym; + char *msg; + + if (handle == &self_module) + { + if (NSIsSymbolNameDefined (symbol_name)) + sym = NSLookupAndBindSymbol (symbol_name); + else + sym = NULL; + } + else + sym = NSLookupSymbolInModule (handle, symbol_name); + + if (!sym) + { + msg = g_strdup_printf ("no such symbol %s", symbol_name); + g_module_set_error (msg); + g_free (msg); + return NULL; + } + + return NSAddressOfSymbol (sym); +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + if (directory && *directory) + { + if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, "/", module_name, NULL); + else + return g_strconcat (directory, "/lib", module_name, "." G_MODULE_SUFFIX, NULL); + } + else if (strncmp (module_name, "lib", 3) == 0) + return g_strdup (module_name); + else + return g_strconcat ("lib", module_name, "." G_MODULE_SUFFIX, NULL); +} diff --git a/gmodule/gmodule-os2.c b/gmodule/gmodule-os2.c new file mode 100644 index 0000000..d074d8c --- /dev/null +++ b/gmodule/gmodule-os2.c @@ -0,0 +1,144 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ +#include "config.h" + +#include + +/* Perl includes and instead of on some systmes? */ + + +/* dlerror() is not implemented on all systems + */ +#ifndef G_MODULE_HAVE_DLERROR +/* could we rely on errno's state here? */ +# define dlerror() "unknown dl-error" +#endif /* G_MODULE_HAVE_DLERROR */ + +/* some flags are missing on some systems, so we provide + * harmless defaults. + * The Perl sources say, RTLD_LAZY needs to be defined as (1), + * at least for Solaris 1. + * + * Mandatory: + * RTLD_LAZY - resolve undefined symbols as code from the dynamic library + * is executed. + * RTLD_NOW - resolve all undefined symbols before dlopen returns, and fail + * if this cannot be done. + * Optionally: + * RTLD_GLOBAL - the external symbols defined in the library will be made + * available to subsequently loaded libraries. + */ +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif /* RTLD_GLOBAL */ +#ifndef RTLD_LAZY +#define RTLD_LAZY 1 +#endif /* RTLD_LAZY */ +#ifndef RTLD_NOW +#define RTLD_NOW 0 +#endif /* RTLD_NOW */ + + +/* --- functions --- */ +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + gpointer handle; + + handle = dlopen (file_name, + (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + if (!handle) + g_module_set_error (dlerror ()); + + return handle; +} + +static gpointer +_g_module_self (void) +{ + gpointer handle; + + /* to query symbols from the program itself, special link options + * are required on some systems. + */ + + /* XXX, not supported */ + handle = NULL; + g_module_set_error ("module handle for self not supported"); + + return handle; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + /* are there any systems out there that have dlopen()/dlclose() + * without a reference count implementation? + */ + is_unref |= 1; + + if (is_unref) + { + /* XXX, no return code */ + dlclose (handle); + } +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + gpointer p; + + p = dlsym (handle, symbol_name); + if (!p) + g_module_set_error (dlerror ()); + + return p; +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + gchar *suffix = strrchr(module_name, '.'); + if (directory && *directory) + if (suffix && (stricmp (suffix, ".dll") == 0)) + return g_strconcat (directory, "/", module_name, NULL); + else + return g_strconcat (directory, "/", module_name, ".dll", NULL); + else if (suffix && (stricmp (suffix, ".dll") == 0)) + return g_strdup (module_name); + else + return g_strconcat (module_name, ".dll", NULL); +} diff --git a/gmodule/gmodule-win32.c b/gmodule/gmodule-win32.c new file mode 100644 index 0000000..98d3fb9 --- /dev/null +++ b/gmodule/gmodule-win32.c @@ -0,0 +1,276 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998, 2000 Tim Janik + * + * Win32 GMODULE implementation + * Copyright (C) 1998 Tor Lillqvist + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ +#include "config.h" + +#include +#include + +#include + +#ifdef G_WITH_CYGWIN +#include +#endif + +static void +set_error (const gchar *format, + ...) +{ + gchar *error; + gchar *detail; + gchar *message; + va_list args; + + error = g_win32_error_message (GetLastError ()); + + va_start (args, format); + detail = g_strdup_vprintf (format, args); + va_end (args); + + message = g_strconcat (detail, error, NULL); + + g_module_set_error (message); + g_free (message); + g_free (detail); + g_free (error); +} + +/* --- functions --- */ +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + HINSTANCE handle; + wchar_t *wfilename; +#ifdef G_WITH_CYGWIN + gchar tmp[MAX_PATH]; + + cygwin_conv_to_win32_path(file_name, tmp); + file_name = tmp; +#endif + wfilename = g_utf8_to_utf16 (file_name, -1, NULL, NULL, NULL); + + handle = LoadLibraryW (wfilename); + g_free (wfilename); + + if (!handle) + set_error ("`%s': ", file_name); + + return handle; +} + +static gint dummy; +static gpointer null_module_handle = &dummy; + +static gpointer +_g_module_self (void) +{ + return null_module_handle; +} + +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ + if (handle != null_module_handle) + if (!FreeLibrary (handle)) + set_error (""); +} + +static gpointer +find_in_any_module_using_toolhelp (const gchar *symbol_name) +{ + typedef HANDLE (WINAPI *PFNCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD); + static PFNCREATETOOLHELP32SNAPSHOT pfnCreateToolhelp32Snapshot = NULL; + + typedef BOOL (WINAPI *PFNMODULE32FIRST)(HANDLE, MODULEENTRY32*); + static PFNMODULE32FIRST pfnModule32First= NULL; + + typedef BOOL (WINAPI *PFNMODULE32NEXT)(HANDLE, MODULEENTRY32*); + static PFNMODULE32NEXT pfnModule32Next = NULL; + + static HMODULE kernel32; + + HANDLE snapshot; + MODULEENTRY32 me32; + + gpointer p; + + if (!pfnCreateToolhelp32Snapshot || !pfnModule32First || !pfnModule32Next) + { + if (!kernel32) + if (!(kernel32 = GetModuleHandle ("kernel32.dll"))) + return NULL; + + if (!(pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT) GetProcAddress (kernel32, "CreateToolhelp32Snapshot")) + || !(pfnModule32First = (PFNMODULE32FIRST) GetProcAddress (kernel32, "Module32First")) + || !(pfnModule32Next = (PFNMODULE32NEXT) GetProcAddress (kernel32, "Module32Next"))) + return NULL; + } + + if ((snapshot = (*pfnCreateToolhelp32Snapshot) (TH32CS_SNAPMODULE, 0)) == (HANDLE) -1) + return NULL; + + me32.dwSize = sizeof (me32); + p = NULL; + if ((*pfnModule32First) (snapshot, &me32)) + { + do { + if ((p = GetProcAddress (me32.hModule, symbol_name)) != NULL) + break; + } while ((*pfnModule32Next) (snapshot, &me32)); + } + + CloseHandle (snapshot); + + return p; +} + +static gpointer +find_in_any_module_using_psapi (const gchar *symbol_name) +{ + static HMODULE psapi = NULL; + + typedef BOOL (WINAPI *PFNENUMPROCESSMODULES) (HANDLE, HMODULE *, DWORD, LPDWORD) ; + static PFNENUMPROCESSMODULES pfnEnumProcessModules = NULL; + + HMODULE *modules; + HMODULE dummy; + gint i, size; + DWORD needed; + + gpointer p; + + if (!pfnEnumProcessModules) + { + if (!psapi) + if ((psapi = LoadLibrary ("psapi.dll")) == NULL) + return NULL; + + if (!(pfnEnumProcessModules = (PFNENUMPROCESSMODULES) GetProcAddress (psapi, "EnumProcessModules"))) + return NULL; + } + + if (!(*pfnEnumProcessModules) (GetCurrentProcess (), &dummy, + sizeof (HMODULE), &needed)) + return NULL; + + size = needed + 10 * sizeof (HMODULE); + modules = g_malloc (size); + + if (!(*pfnEnumProcessModules) (GetCurrentProcess (), modules, + size, &needed) + || needed > size) + { + g_free (modules); + return NULL; + } + + p = NULL; + for (i = 0; i < needed / sizeof (HMODULE); i++) + if ((p = GetProcAddress (modules[i], symbol_name)) != NULL) + break; + + g_free (modules); + + return p; +} + +static gpointer +find_in_any_module (const gchar *symbol_name) +{ + gpointer result; + + if ((result = find_in_any_module_using_toolhelp (symbol_name)) == NULL + && (result = find_in_any_module_using_psapi (symbol_name)) == NULL) + return NULL; + else + return result; +} + +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + gpointer p; + + if (handle == null_module_handle) + { + if ((p = GetProcAddress (GetModuleHandle (NULL), symbol_name)) == NULL) + p = find_in_any_module (symbol_name); + } + else + p = GetProcAddress (handle, symbol_name); + + if (!p) + set_error (""); + + return p; +} + +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + gint k; + + k = strlen (module_name); + + if (directory && *directory) + if (k > 4 && g_ascii_strcasecmp (module_name + k - 4, ".dll") == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, NULL); +#ifdef G_WITH_CYGWIN + else if (strncmp (module_name, "lib", 3) == 0 || strncmp (module_name, "cyg", 3) == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, ".dll", NULL); + else + return g_strconcat (directory, G_DIR_SEPARATOR_S, "cyg", module_name, ".dll", NULL); +#else + else if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (directory, G_DIR_SEPARATOR_S, module_name, ".dll", NULL); + else + return g_strconcat (directory, G_DIR_SEPARATOR_S, "lib", module_name, ".dll", NULL); +#endif + else if (k > 4 && g_ascii_strcasecmp (module_name + k - 4, ".dll") == 0) + return g_strdup (module_name); +#ifdef G_WITH_CYGWIN + else if (strncmp (module_name, "lib", 3) == 0 || strncmp (module_name, "cyg", 3) == 0) + return g_strconcat (module_name, ".dll", NULL); + else + return g_strconcat ("cyg", module_name, ".dll", NULL); +#else + else if (strncmp (module_name, "lib", 3) == 0) + return g_strconcat (module_name, ".dll", NULL); + else + return g_strconcat ("lib", module_name, ".dll", NULL); +#endif +} diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c new file mode 100644 index 0000000..2d7f410 --- /dev/null +++ b/gmodule/gmodule.c @@ -0,0 +1,686 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "gmodule.h" + +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef G_OS_WIN32 +#include /* For open() and close() prototypes. */ +#endif + +#include "gmoduleconf.h" +#include "gstdio.h" + +/* We maintain a list of modules, so we can reference count them. + * That's needed because some platforms don't support refernce counts on + * modules e.g. the shl_* implementation of HP-UX + * (http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html). + * Also, the module for the program itself is kept seperatedly for + * faster access and because it has special semantics. + */ + + +/* --- structures --- */ +struct _GModule +{ + gchar *file_name; +#if defined (G_OS_WIN32) && !defined(_WIN64) + gchar *cp_file_name; +#endif + gpointer handle; + guint ref_count : 31; + guint is_resident : 1; + GModuleUnload unload; + GModule *next; +}; + + +/* --- prototypes --- */ +static gpointer _g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local); +static void _g_module_close (gpointer handle, + gboolean is_unref); +static gpointer _g_module_self (void); +static gpointer _g_module_symbol (gpointer handle, + const gchar *symbol_name); +static gchar* _g_module_build_path (const gchar *directory, + const gchar *module_name); +static inline void g_module_set_error (const gchar *error); +static inline GModule* g_module_find_by_handle (gpointer handle); +static inline GModule* g_module_find_by_name (const gchar *name); + + +/* --- variables --- */ +static GModule *modules = NULL; +static GModule *main_module = NULL; +static GStaticPrivate module_error_private = G_STATIC_PRIVATE_INIT; +static gboolean module_debug_initialized = FALSE; +static guint module_debug_flags = 0; + + +/* --- inline functions --- */ +static inline GModule* +g_module_find_by_handle (gpointer handle) +{ + GModule *module; + GModule *retval = NULL; + + if (main_module && main_module->handle == handle) + retval = main_module; + else + for (module = modules; module; module = module->next) + if (handle == module->handle) + { + retval = module; + break; + } + + return retval; +} + +static inline GModule* +g_module_find_by_name (const gchar *name) +{ + GModule *module; + GModule *retval = NULL; + + for (module = modules; module; module = module->next) + if (strcmp (name, module->file_name) == 0) + { + retval = module; + break; + } + + return retval; +} + +static inline void +g_module_set_error_unduped (gchar *error) +{ + g_static_private_set (&module_error_private, error, g_free); + errno = 0; +} + +static inline void +g_module_set_error (const gchar *error) +{ + g_module_set_error_unduped (g_strdup (error)); +} + + +/* --- include platform specifc code --- */ +#define SUPPORT_OR_RETURN(rv) { g_module_set_error (NULL); } +#if (G_MODULE_IMPL == G_MODULE_IMPL_DL) +#include "gmodule-dl.c" +#elif (G_MODULE_IMPL == G_MODULE_IMPL_DLD) +#include "gmodule-dld.c" +#elif (G_MODULE_IMPL == G_MODULE_IMPL_WIN32) +#include "gmodule-win32.c" +#elif (G_MODULE_IMPL == G_MODULE_IMPL_DYLD) +#include "gmodule-dyld.c" +#elif (G_MODULE_IMPL == G_MODULE_IMPL_AR) +#include "gmodule-ar.c" +#else +#undef SUPPORT_OR_RETURN +#define SUPPORT_OR_RETURN(rv) { g_module_set_error ("dynamic modules are " \ + "not supported by this system"); return rv; } +static gpointer +_g_module_open (const gchar *file_name, + gboolean bind_lazy, + gboolean bind_local) +{ + return NULL; +} +static void +_g_module_close (gpointer handle, + gboolean is_unref) +{ +} +static gpointer +_g_module_self (void) +{ + return NULL; +} +static gpointer +_g_module_symbol (gpointer handle, + const gchar *symbol_name) +{ + return NULL; +} +static gchar* +_g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + return NULL; +} +#endif /* no implementation */ + +/* --- functions --- */ +gboolean +g_module_supported (void) +{ + SUPPORT_OR_RETURN (FALSE); + + return TRUE; +} + +static gchar* +parse_libtool_archive (const gchar* libtool_name) +{ + const guint TOKEN_DLNAME = G_TOKEN_LAST + 1; + const guint TOKEN_INSTALLED = G_TOKEN_LAST + 2; + const guint TOKEN_LIBDIR = G_TOKEN_LAST + 3; + gchar *lt_dlname = NULL; + gboolean lt_installed = TRUE; + gchar *lt_libdir = NULL; + gchar *name; + GTokenType token; + GScanner *scanner; + + int fd = g_open (libtool_name, O_RDONLY, 0); + if (fd < 0) + { + gchar *display_libtool_name = g_filename_display_name (libtool_name); + g_module_set_error_unduped (g_strdup_printf ("failed to open libtool archive \"%s\"", display_libtool_name)); + g_free (display_libtool_name); + return NULL; + } + /* search libtool's dlname specification */ + scanner = g_scanner_new (NULL); + g_scanner_input_file (scanner, fd); + scanner->config->symbol_2_token = TRUE; + g_scanner_scope_add_symbol (scanner, 0, "dlname", + GUINT_TO_POINTER (TOKEN_DLNAME)); + g_scanner_scope_add_symbol (scanner, 0, "installed", + GUINT_TO_POINTER (TOKEN_INSTALLED)); + g_scanner_scope_add_symbol (scanner, 0, "libdir", + GUINT_TO_POINTER (TOKEN_LIBDIR)); + while (!g_scanner_eof (scanner)) + { + token = g_scanner_get_next_token (scanner); + if (token == TOKEN_DLNAME || token == TOKEN_INSTALLED || + token == TOKEN_LIBDIR) + { + if (g_scanner_get_next_token (scanner) != '=' || + g_scanner_get_next_token (scanner) != + (token == TOKEN_INSTALLED ? + G_TOKEN_IDENTIFIER : G_TOKEN_STRING)) + { + gchar *display_libtool_name = g_filename_display_name (libtool_name); + g_module_set_error_unduped (g_strdup_printf ("unable to parse libtool archive \"%s\"", display_libtool_name)); + g_free (display_libtool_name); + + g_free (lt_dlname); + g_free (lt_libdir); + g_scanner_destroy (scanner); + close (fd); + + return NULL; + } + else + { + if (token == TOKEN_DLNAME) + { + g_free (lt_dlname); + lt_dlname = g_strdup (scanner->value.v_string); + } + else if (token == TOKEN_INSTALLED) + lt_installed = + strcmp (scanner->value.v_identifier, "yes") == 0; + else /* token == TOKEN_LIBDIR */ + { + g_free (lt_libdir); + lt_libdir = g_strdup (scanner->value.v_string); + } + } + } + } + + if (!lt_installed) + { + gchar *dir = g_path_get_dirname (libtool_name); + g_free (lt_libdir); + lt_libdir = g_strconcat (dir, G_DIR_SEPARATOR_S ".libs", NULL); + g_free (dir); + } + + name = g_strconcat (lt_libdir, G_DIR_SEPARATOR_S, lt_dlname, NULL); + + g_free (lt_dlname); + g_free (lt_libdir); + g_scanner_destroy (scanner); + close (fd); + + return name; +} + +static inline gboolean +str_check_suffix (const gchar* string, + const gchar* suffix) +{ + gsize string_len = strlen (string); + gsize suffix_len = strlen (suffix); + + return string_len >= suffix_len && + strcmp (string + string_len - suffix_len, suffix) == 0; +} + +enum +{ + G_MODULE_DEBUG_RESIDENT_MODULES = 1 << 0, + G_MODULE_DEBUG_BIND_NOW_MODULES = 1 << 1 +}; + +static void +_g_module_debug_init (void) +{ + const GDebugKey keys[] = { + { "resident-modules", G_MODULE_DEBUG_RESIDENT_MODULES }, + { "bind-now-modules", G_MODULE_DEBUG_BIND_NOW_MODULES } + }; + const gchar *env; + + env = g_getenv ("G_DEBUG"); + + module_debug_flags = + !env ? 0 : g_parse_debug_string (env, keys, G_N_ELEMENTS (keys)); + + module_debug_initialized = TRUE; +} + +static GStaticRecMutex g_module_global_lock = G_STATIC_REC_MUTEX_INIT; + +GModule* +g_module_open (const gchar *file_name, + GModuleFlags flags) +{ + GModule *module; + gpointer handle = NULL; + gchar *name = NULL; + + SUPPORT_OR_RETURN (NULL); + + g_static_rec_mutex_lock (&g_module_global_lock); + + if (G_UNLIKELY (!module_debug_initialized)) + _g_module_debug_init (); + + if (module_debug_flags & G_MODULE_DEBUG_BIND_NOW_MODULES) + flags &= ~G_MODULE_BIND_LAZY; + + if (!file_name) + { + if (!main_module) + { + handle = _g_module_self (); + if (handle) + { + main_module = g_new (GModule, 1); + main_module->file_name = NULL; +#if defined (G_OS_WIN32) && !defined(_WIN64) + main_module->cp_file_name = NULL; +#endif + main_module->handle = handle; + main_module->ref_count = 1; + main_module->is_resident = TRUE; + main_module->unload = NULL; + main_module->next = NULL; + } + } + else + main_module->ref_count++; + + g_static_rec_mutex_unlock (&g_module_global_lock); + return main_module; + } + + /* we first search the module list by name */ + module = g_module_find_by_name (file_name); + if (module) + { + module->ref_count++; + + g_static_rec_mutex_unlock (&g_module_global_lock); + return module; + } + + /* check whether we have a readable file right away */ + if (g_file_test (file_name, G_FILE_TEST_IS_REGULAR)) + name = g_strdup (file_name); + /* try completing file name with standard library suffix */ + if (!name) + { + name = g_strconcat (file_name, "." G_MODULE_SUFFIX, NULL); + if (!g_file_test (name, G_FILE_TEST_IS_REGULAR)) + { + g_free (name); + name = NULL; + } + } + /* try completing by appending libtool suffix */ + if (!name) + { + name = g_strconcat (file_name, ".la", NULL); + if (!g_file_test (name, G_FILE_TEST_IS_REGULAR)) + { + g_free (name); + name = NULL; + } + } + /* we can't access() the file, lets hope the platform backends finds + * it via library paths + */ + if (!name) + { + gchar *dot = strrchr (file_name, '.'); + gchar *slash = strrchr (file_name, G_DIR_SEPARATOR); + + /* make sure the name has a suffix */ + if (!dot || dot < slash) + name = g_strconcat (file_name, "." G_MODULE_SUFFIX, NULL); + else + name = g_strdup (file_name); + } + + /* ok, try loading the module */ + if (name) + { + /* if it's a libtool archive, figure library file to load */ + if (str_check_suffix (name, ".la")) /* libtool archive? */ + { + gchar *real_name = parse_libtool_archive (name); + + /* real_name might be NULL, but then module error is already set */ + if (real_name) + { + g_free (name); + name = real_name; + } + } + if (name) + handle = _g_module_open (name, (flags & G_MODULE_BIND_LAZY) != 0, + (flags & G_MODULE_BIND_LOCAL) != 0); + } + else + { + gchar *display_file_name = g_filename_display_name (file_name); + g_module_set_error_unduped (g_strdup_printf ("unable to access file \"%s\"", display_file_name)); + g_free (display_file_name); + } + g_free (name); + + if (handle) + { + gchar *saved_error; + GModuleCheckInit check_init; + const gchar *check_failed = NULL; + + /* search the module list by handle, since file names are not unique */ + module = g_module_find_by_handle (handle); + if (module) + { + _g_module_close (module->handle, TRUE); + module->ref_count++; + g_module_set_error (NULL); + + g_static_rec_mutex_unlock (&g_module_global_lock); + return module; + } + + saved_error = g_strdup (g_module_error ()); + g_module_set_error (NULL); + + module = g_new (GModule, 1); + module->file_name = g_strdup (file_name); +#if defined (G_OS_WIN32) && !defined(_WIN64) + module->cp_file_name = g_locale_from_utf8 (file_name, -1, + NULL, NULL, NULL); +#endif + module->handle = handle; + module->ref_count = 1; + module->is_resident = FALSE; + module->unload = NULL; + module->next = modules; + modules = module; + + /* check initialization */ + if (g_module_symbol (module, "g_module_check_init", (gpointer) &check_init) && check_init != NULL) + check_failed = check_init (module); + + /* we don't call unload() if the initialization check failed. */ + if (!check_failed) + g_module_symbol (module, "g_module_unload", (gpointer) &module->unload); + + if (check_failed) + { + gchar *error; + + error = g_strconcat ("GModule (", + file_name ? file_name : "NULL", + ") initialization check failed: ", + check_failed, NULL); + g_module_close (module); + module = NULL; + g_module_set_error (error); + g_free (error); + } + else + g_module_set_error (saved_error); + + g_free (saved_error); + } + + if (module != NULL && + (module_debug_flags & G_MODULE_DEBUG_RESIDENT_MODULES)) + g_module_make_resident (module); + + g_static_rec_mutex_unlock (&g_module_global_lock); + return module; +} + +#if defined (G_OS_WIN32) && !defined(_WIN64) + +#undef g_module_open + +GModule* +g_module_open (const gchar *file_name, + GModuleFlags flags) +{ + gchar *utf8_file_name = g_locale_to_utf8 (file_name, -1, NULL, NULL, NULL); + GModule *retval = g_module_open_utf8 (utf8_file_name, flags); + + g_free (utf8_file_name); + + return retval; +} + +#endif + +gboolean +g_module_close (GModule *module) +{ + SUPPORT_OR_RETURN (FALSE); + + g_return_val_if_fail (module != NULL, FALSE); + g_return_val_if_fail (module->ref_count > 0, FALSE); + + g_static_rec_mutex_lock (&g_module_global_lock); + + module->ref_count--; + + if (!module->ref_count && !module->is_resident && module->unload) + { + GModuleUnload unload; + + unload = module->unload; + module->unload = NULL; + unload (module); + } + + if (!module->ref_count && !module->is_resident) + { + GModule *last; + GModule *node; + + last = NULL; + + node = modules; + while (node) + { + if (node == module) + { + if (last) + last->next = node->next; + else + modules = node->next; + break; + } + last = node; + node = last->next; + } + module->next = NULL; + + _g_module_close (module->handle, FALSE); + g_free (module->file_name); +#if defined (G_OS_WIN32) && !defined(_WIN64) + g_free (module->cp_file_name); +#endif + g_free (module); + } + + g_static_rec_mutex_unlock (&g_module_global_lock); + return g_module_error() == NULL; +} + +void +g_module_make_resident (GModule *module) +{ + g_return_if_fail (module != NULL); + + module->is_resident = TRUE; +} + +G_CONST_RETURN gchar* +g_module_error (void) +{ + return g_static_private_get (&module_error_private); +} + +gboolean +g_module_symbol (GModule *module, + const gchar *symbol_name, + gpointer *symbol) +{ + const gchar *module_error; + + if (symbol) + *symbol = NULL; + SUPPORT_OR_RETURN (FALSE); + + g_return_val_if_fail (module != NULL, FALSE); + g_return_val_if_fail (symbol_name != NULL, FALSE); + g_return_val_if_fail (symbol != NULL, FALSE); + + g_static_rec_mutex_lock (&g_module_global_lock); + +#ifdef G_MODULE_NEED_USCORE + { + gchar *name; + + name = g_strconcat ("_", symbol_name, NULL); + *symbol = _g_module_symbol (module->handle, name); + g_free (name); + } +#else /* !G_MODULE_NEED_USCORE */ + *symbol = _g_module_symbol (module->handle, symbol_name); +#endif /* !G_MODULE_NEED_USCORE */ + + module_error = g_module_error (); + if (module_error) + { + gchar *error; + + error = g_strconcat ("`", symbol_name, "': ", module_error, NULL); + g_module_set_error (error); + g_free (error); + *symbol = NULL; + } + + g_static_rec_mutex_unlock (&g_module_global_lock); + return !module_error; +} + +G_CONST_RETURN gchar* +g_module_name (GModule *module) +{ + g_return_val_if_fail (module != NULL, NULL); + + if (module == main_module) + return "main"; + + return module->file_name; +} + +#if defined (G_OS_WIN32) && !defined(_WIN64) + +#undef g_module_name + +G_CONST_RETURN gchar* +g_module_name (GModule *module) +{ + g_return_val_if_fail (module != NULL, NULL); + + if (module == main_module) + return "main"; + + return module->cp_file_name; +} + +#endif + +gchar* +g_module_build_path (const gchar *directory, + const gchar *module_name) +{ + g_return_val_if_fail (module_name != NULL, NULL); + + return _g_module_build_path (directory, module_name); +} diff --git a/gmodule/gmodule.h b/gmodule/gmodule.h new file mode 100644 index 0000000..ae7f8e5 --- /dev/null +++ b/gmodule/gmodule.h @@ -0,0 +1,101 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __GMODULE_H__ +#define __GMODULE_H__ + +#include + +G_BEGIN_DECLS + +/* exporting and importing functions, this is special cased + * to feature Windows dll stubs. + */ +#define G_MODULE_IMPORT extern +#ifdef G_PLATFORM_WIN32 +# define G_MODULE_EXPORT __declspec(dllexport) +#else /* !G_PLATFORM_WIN32 */ +# define G_MODULE_EXPORT +#endif /* !G_PLATFORM_WIN32 */ + +typedef enum +{ + G_MODULE_BIND_LAZY = 1 << 0, + G_MODULE_BIND_LOCAL = 1 << 1, + G_MODULE_BIND_MASK = 0x03 +} GModuleFlags; + +typedef struct _GModule GModule; +typedef const gchar* (*GModuleCheckInit) (GModule *module); +typedef void (*GModuleUnload) (GModule *module); + +#ifdef G_OS_WIN32 +#define g_module_open g_module_open_utf8 +#define g_module_name g_module_name_utf8 +#endif + +/* return TRUE if dynamic module loading is supported */ +gboolean g_module_supported (void) G_GNUC_CONST; + +/* open a module `file_name' and return handle, which is NULL on error */ +GModule* g_module_open (const gchar *file_name, + GModuleFlags flags); + +/* close a previously opened module, returns TRUE on success */ +gboolean g_module_close (GModule *module); + +/* make a module resident so g_module_close on it will be ignored */ +void g_module_make_resident (GModule *module); + +/* query the last module error as a string */ +G_CONST_RETURN gchar* g_module_error (void); + +/* retrieve a symbol pointer from `module', returns TRUE on success */ +gboolean g_module_symbol (GModule *module, + const gchar *symbol_name, + gpointer *symbol); + +/* retrieve the file name from an existing module */ +G_CONST_RETURN gchar* g_module_name (GModule *module); + +/* Build the actual file name containing a module. `directory' is the + * directory where the module file is supposed to be, or NULL or empty + * in which case it should either be in the current directory or, on + * some operating systems, in some standard place, for instance on the + * PATH. Hence, to be absoultely sure to get the correct module, + * always pass in a directory. The file name consists of the directory, + * if supplied, and `module_name' suitably decorated accoring to + * the operating system's conventions (for instance lib*.so or *.dll). + * + * No checks are made that the file exists, or is of correct type. + */ +gchar* g_module_build_path (const gchar *directory, + const gchar *module_name); + + +G_END_DECLS + +#endif /* __GMODULE_H__ */ diff --git a/gmodule/gmodule.rc.in b/gmodule/gmodule.rc.in new file mode 100644 index 0000000..4ce8bfd --- /dev/null +++ b/gmodule/gmodule.rc.in @@ -0,0 +1,30 @@ +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "The GLib developer community" + VALUE "FileDescription", "GModule" + VALUE "FileVersion", "@GLIB_VERSION@.0" + VALUE "InternalName", "libgmodule-2.0-@LT_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright © 1998-2010 Tim Janik and others." + VALUE "OriginalFilename", "libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "GLib" + VALUE "ProductVersion", "@GLIB_VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END diff --git a/gmodule/gmodule.symbols b/gmodule/gmodule.symbols new file mode 100644 index 0000000..1d5b6e3 --- /dev/null +++ b/gmodule/gmodule.symbols @@ -0,0 +1,14 @@ +g_module_build_path +g_module_close +g_module_error +g_module_make_resident +#ifndef _WIN64 +g_module_name PRIVATE +#endif +g_module_name_utf8 +#ifndef _WIN64 +g_module_open PRIVATE +#endif +g_module_open_utf8 +g_module_supported +g_module_symbol diff --git a/gmodule/gmoduleconf.h.in b/gmodule/gmoduleconf.h.in new file mode 100644 index 0000000..168cf23 --- /dev/null +++ b/gmodule/gmoduleconf.h.in @@ -0,0 +1,54 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __G_MODULE_CONF_H__ +#define __G_MODULE_CONF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define G_MODULE_IMPL_NONE 0 +#define G_MODULE_IMPL_DL 1 +#define G_MODULE_IMPL_DLD 2 +#define G_MODULE_IMPL_WIN32 3 +#define G_MODULE_IMPL_OS2 4 +#define G_MODULE_IMPL_BEOS 5 +#define G_MODULE_IMPL_DYLD 6 +#define G_MODULE_IMPL_AR 7 + +#define G_MODULE_IMPL @G_MODULE_IMPL@ +#undef G_MODULE_HAVE_DLERROR +#if (@G_MODULE_HAVE_DLERROR@) +#define G_MODULE_HAVE_DLERROR +#endif +#if (@G_MODULE_NEED_USCORE@) || defined (hp9000s300) || defined (__hp9000s300) || defined (__hp9000s300__) +#define G_MODULE_NEED_USCORE +#endif +#if (@G_MODULE_BROKEN_RTLD_GLOBAL@) +#define G_MODULE_BROKEN_RTLD_GLOBAL +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __G_MODULE_CONF_H__ */ diff --git a/gmodule/gmoduleconf.h.win32 b/gmodule/gmoduleconf.h.win32 new file mode 100644 index 0000000..18bee9b --- /dev/null +++ b/gmodule/gmoduleconf.h.win32 @@ -0,0 +1,44 @@ +/* GMODULE - GLIB wrapper code for dynamic module loading + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __G_MODULE_CONF_H__ +#define __G_MODULE_CONF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define G_MODULE_IMPL_NONE 0 +#define G_MODULE_IMPL_DL 1 +#define G_MODULE_IMPL_DLD 2 +#define G_MODULE_IMPL_WIN32 3 +#define G_MODULE_IMPL_OS2 4 +#define G_MODULE_IMPL_BEOS 5 +#define G_MODULE_IMPL_DYLD 6 + +#define G_MODULE_IMPL G_MODULE_IMPL_WIN32 +#undef G_MODULE_HAVE_DLERROR + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __G_MODULE_CONF_H__ */ diff --git a/gmodule/makefile.msc.in b/gmodule/makefile.msc.in new file mode 100644 index 0000000..431dd50 --- /dev/null +++ b/gmodule/makefile.msc.in @@ -0,0 +1,37 @@ +## Makefile for building the gmodule dll with Microsoft C +## Use: nmake -f makefile.msc install + +TOP = ..\.. + +!INCLUDE ..\build\win32\make.msc + +################################################################ + +INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I . -I ..\glib +DEFINES = -DHAVE_CONFIG_H -DG_LOG_DOMAIN=\"GModule\" + +all : \ + gmoduleconf.h \ + libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll + +gmodule_OBJECTS = \ + gmodule.obj +gmodule.def: gmodule.symbols + echo EXPORTS > gmodule.def + cl /EP -DINCLUDE_VARIABLES -DG_OS_WIN32 -DINCLUDE_INTERNAL_SYMBOLS -DALL_FILES \ + -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_NORETURN= \ + -DG_GNUC_PRINTF=;G_GNUC_PRINTF gmodule.symbols >> gmodule.def + + +gmoduleconf.h: gmoduleconf.h.win32 + copy gmoduleconf.h.win32 gmoduleconf.h + +gmodule.res : gmodule.rc + rc -DBUILDNUMBER=0 -r -fo gmodule.res gmodule.rc + +libgmodule-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(gmodule_OBJECTS) gmodule.def gmodule.res + $(CC) $(CFLAGS) -LD -Fe$@ $(gmodule_OBJECTS) gmodule.res \ + ..\glib\glib-2.0.lib $(LDFLAGS) /implib:gmodule-2.0.lib /def:gmodule.def + +clean:: + del gmoduleconf.h diff --git a/gobject-2.0-uninstalled.pc.in b/gobject-2.0-uninstalled.pc.in new file mode 100644 index 0000000..d9378a5 --- /dev/null +++ b/gobject-2.0-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: GObject Uninstalled +Description: Object/type system for GLib, Not Installed +Requires: glib-2.0-uninstalled,gthread-2.0-uninstalled +Version: @VERSION@ +Libs: ${pc_top_builddir}/${pcfiledir}/gobject/libgobject-2.0.la +## cflags contains builddir in addition to srcdir because of gmarshal.h +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@ -I${pc_top_builddir}/${pcfiledir} diff --git a/gobject-2.0.pc.in b/gobject-2.0.pc.in new file mode 100644 index 0000000..41505a9 --- /dev/null +++ b/gobject-2.0.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: GObject +Description: GLib Type, Object, Parameter and Signal Library +Requires: glib-2.0,gthread-2.0 +Version: @VERSION@ +Libs: -L${libdir} -lgobject-2.0 +Cflags: diff --git a/gobject/ChangeLog b/gobject/ChangeLog new file mode 100644 index 0000000..61b8c53 --- /dev/null +++ b/gobject/ChangeLog @@ -0,0 +1,3973 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-13 Kristian Rietveld + + * gsignal.c (signal_lookup_closure): when defaulting to the only + item in the array, check if this is indeed the default closure. + (patch by Tim Janik). + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-03-01 Matthias Clasen + + Bug 556706 – Inconsistent help arguments -h, -? + + * glib-genmarshal.c: + * glib-mkenums.in: Adjust help output, accept -?, capitalize. + Patch by Christian Dywan + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-17 Matthias Clasen + + * gobject.c: Remove (now) unnecessary cases from g_atomic_int_get + calls. + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + +2009-01-02 Behdad Esfahbod + + Bug 565136 – Gobject's "notify" signal parameters are wrong in gtk-doc + Patch from Andrzej Zaborowski + + * gobject.c (g_object_do_class_init): Fix param order in docs. + +2008-12-15 Matthias Clasen + + * === Released 2.19.3 === + +2008-12-12 Dan Winship + + * pltcheck.sh: make this work on x86_64 + +2008-12-02 Matthias Clasen + + Bug 473150 – g_type_module_use inconsistently increases the use + counter in case of error + + * gtypemodule.c (g_type_module_use): Always reset the use count + to its previous value before returning FALSE. Pointed out by + Johan Billien. + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + +2008-11-28 Matthias Clasen + + Bug 559456 – GObject Reference Manual (typo) + + * gsignal.c (g_signal_newv): Fix a typo in the docs, pointed out + by Andrew Feren + +2008-11-03 Matthias Clasen + + Bug 555935 – Clear the mechanism of overwriting properties + + * gobject.c: Expand the docs of g_object_class_install_property. + Proposed by Maciej Piechotka + +2008-10-16 Matthias Clasen + + * === Released 2.19.0 === + +2008-09-26 Dan Winship + + * gobject.c (g_object_ref, g_object_unref) + (g_object_freeze_notify, g_object_notify, g_object_thaw_notify): + * gparam.c (g_param_spec_ref, g_param_spec_unref): + * gsignal.c (handler_ref, handler_unref_R): add uint* -> int* + casts in g_atomic_int calls to avoid gcc warnings + +2008-09-17 Matthias Clasen + + * === Released 2.18.1 === + +2008-09-02 Matthias Clasen + + * === Released 2.18.0 === + +2008-08-21 Johan Dahlin + + * gobject.h: + Mark g_object_get_type function as const, it's + a fundamental type and can safely marked as const, + as opposed to traditionally *_get_type functions. + +2008-08-21 Johan Dahlin + + Bug 548800 – Missing a g_object_get_type function + + * gobject.c (g_object_get_type): + * gobject.h: + * gobject.symbols: + Add g_object_get_type + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.5 === + +2008-08-01 Matthias Clasen + + Bug 545395 – Language tweak for g_value_set_string* docs + + * gvaluetypes.c: Clarify the docs of some GValue setters. + Proposed by Erik Walthinsen + +2008-07-27 Tor Lillqvist + + * gtype.h + * gtype.c: Revert my change from 2008-07-24. No G_TYPE_FORMAT is + needed. Just use G_GSIZE_FORMAT always when printing GType values. + +2008-07-27 Tor Lillqvist + + * Makefile.am (gobject-2.0.lib): Pass appropriate -machine flag to lib.exe. + +2008-07-24 Tor Lillqvist + + * gtype.h: Define G_TYPE_FORMAT as the printf format for a GType + value. Either G_GSIZE_FORMAT or "lu". + + * gtype.c: Use it instead of the C99 zu. + +2008-07-23 Matthias Clasen + + 544177 - Fix trivial cut and paste error in documentation + + * gtype.h: Fix a typo. Pointed out by Paul Bolle. + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + +2008-07-21 Michael Natterer + + Reviewed by Tim Janik: + + * gsignal.c (g_signal_chain_from_overridden_handler): allocate + the temp GValue array with GSLice. + + (g_signal_emit_valist): dito. Remove optimization/obfuscation of + allocating up to 16 GValues on the stack and always use GSLice. + +2008-07-05 Matthias Clasen + + Bug 539229 – gobject-query calls itself query + + * gobject-query.c: Use the right binary name in help output. + Patch by Hiroyuki Ikezoe. + +2008-07-04 Michael Natterer + + * gobject.c: remove unused #define PREALLOC_CPARAMS. + +2008-07-04 Michael Natterer + + Bug 541208 – Functions to easily install and use signals without + class struct slot + + * gobject.symbols + * gsignal.[ch] (g_signal_new_class_handler): the same as + _gtk_binding_signal_new(), to install signals with a callback + instead of a class struct slot as class closure. + + The next two functions are C convenience and much easier to use + than the generic overriding and chaining APIs which are intended + primarily for language bindings: + + (g_signal_override_class_handler): to override a signal with a + callback instead of a class struct slot. + + (g_signal_chain_from_overridden_handler): to chain up from a + signal without class struct slot. The API is similar to + g_signal_emit(). + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-07-01 Matthias Clasen + + * *.c: Fix up section comments far enough to avoid regressions. + +2008-06-27 Hans Breuer + + * glib-genmarshal.c : move G_OS_WIN32 inclusion of down to + where G_OS_WIN32 will be defined (#540047, Kazuki IWAMOTO) + +2008-06-22 Michael Natterer + + * *.c: remove trailing whitespace from newly added gtk-doc + comments and reformatted some where they contained overly long or + ill-formatted lines. + +2008-06-22 Michael Natterer + + * *.c: moved includes back to the top of the files (before gtk-doc + SECTION comments). Add "config.h" in all files and move system + included before glib includes. Remove trailing whitespace from + SECTION comments and did some reformatting where lines were overly + long, no documentation content was changed. + +2008-06-22 Stefan Kost + + * docs/reference/gobject/tmpl/gobject-unused.sgml: + * gobject/gobject.h: + * gobject/gtype.c: + * gobject/gtype.h: + Move some content for gobject-unused.sgml and cleared empty entries. + The remaining 4 ones should be checked by some else. If they are not + needed. The file can be removed. + +2008-06-22 Stefan Kost + + * docs/reference/gobject/tmpl/value_collection.sgml: + * gobject/gvaluecollector.h: + Migrating docs. + +2008-06-22 Stefan Kost + + * docs/reference/gobject/tmpl/value_arrays.sgml: + * gobject/gvaluearray.c: + * gobject/gvaluearray.h: + Migrating docs. + +2008-06-22 Stefan Kost + + * gobject/gsignal.c: + Fix compiler warning in format string check. + +2008-06-22 Stefan Kost + + * docs/reference/gobject/tmpl/signals.sgml: + * gobject/gclosure.c: + * gobject/gobject.c: + * gobject/gsignal.c: + * gobject/gsignal.h: + Migrating docs. + +2008-06-22 Stefan Kost + + * docs/reference/gobject/Makefile.am: + Help poor little gtkdoc a bit and tell that it can ignore + G_GNUC_INTERNAL. Also disable including the unit-test header as this + causes warnings and we don't need it here. + +2008-06-22 Stefan Kost + + * docs/reference/gobject/tmpl/param_value_types.sgml: + * gobject/gboxed.c: + * gobject/gboxed.h: + * gobject/genums.c: + * gobject/genums.h: + * gobject/gobject.c: + * gobject/gobject.h: + * gobject/gparam.c: + * gobject/gparam.h: + * gobject/gparamspecs.c: + * gobject/gparamspecs.h: + * gobject/gvaluetypes.c: + * gobject/gvaluetypes.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/objects.sgml: + * gobject/gobject.c: + * gobject/gobject.h: + * gobject/gparam.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/gtypeplugin.sgml: + * gobject/gtypeplugin.c: + * gobject/gtypeplugin.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/Makefile.am: + Add --sgml-mode to allow sgml in doc-fragments (which somehow works + before already). + + * gobject/gboxed.h: + * gobject/gclosure.c: + * gobject/gparam.c: + * gobject/gparam.h: + * gobject/gtype.h: + Convert character entities back. Fix some broken sgml. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/gtypemodule.sgml: + * gobject/gtypemodule.c: + * gobject/gtypemodule.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * gobject/gboxed.c: + * gobject/gclosure.c: + * gobject/genums.c: + * gobject/gparam.c: + * gobject/gvalue.c: + Add titles back from tmpl. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/gtype.sgml: + * gobject/gtype.c: + * gobject/gtype.h: + * gobject/gvaluetypes.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * gobject/gclosure.h: + * gobject/gparam.h: + Add one missing ':' and reformate GParamFlags docs. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/gparamspec.sgml: + * gobject/gparam.c: + * gobject/gparam.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * gobject/gboxed.c: + * gobject/gclosure.c: + * gobject/genums.c: + * gobject/gvalue.c: + Use file-names from the section file for SECTION: comments. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/generic_values.sgml: + * gobject/gboxed.h: + * gobject/gtype.h: + * gobject/gvalue.c: + * gobject/gvalue.h: + * gobject/gvaluetypes.c: + Migrating docs. + +2008-06-21 Stefan Kost + + * gobject/genums.h: + Fix documentation for return values. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/gclosure.sgml: + * gobject/gboxed.h: + * gobject/gclosure.c: + * gobject/gclosure.h: + * gobject/gobject.c: + * gobject/gsourceclosure.c: + * gobject/gsourceclosure.h: + Migrating docs. + +2008-06-21 Tor Lillqvist + + * glib/gstdio.c: Improve Windows-specific parts of + documentation. Mention the different C library issue in more + places. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/gobject-sections.txt: + Remove duplicated entries. They are documented and should be shown. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/enumerations_flags.sgml: + * gobject/genums.c: + * gobject/genums.h: + Migrating docs. + +2008-06-21 Stefan Kost + + * docs/reference/gobject/tmpl/gboxed.sgml: + * gobject/gboxed.c: + * gobject/gboxed.h: + * gobject/gvaluetypes.c: + Migrating docs. + +2008-06-12 Matthias Clasen + + * === Released 2.17.2 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.1 === + +2008-06-10 13:34:01 Tim Janik + + * tests/threadtests.c: added race condition tester from Michael Meeks + with a couple fixes so it's not triggering development warnings. From: + Bug 537555 - GObject instantiation not thread safe ... + +2008-06-10 13:15:29 Tim Janik + + * gtype.c (g_type_class_ref): fixed race condition where references to + partially initialized classes could be handed out. + +2008-05-28 Michael Natterer + + * Makefile.am: don't define G_DISABLE_SINGLE_INCLUDES, it's in + the global CPPFLAGS now. + +2008-05-27 Matthias Clasen + + * === Released 2.17.0 === + +2008-05-05 Michael Natterer + + * Makefile.am. build with G_DISABLE_SINGLE_INCLUDES to prevent + code from being checked in that breaks the build of applications + which use G_DISABLE_SINGLE_INCLUDES. + +2008-03-16 Tor Lillqvist + + * Makefile.am: Define gobject_def locally here instead of using an + Autoconf variable. + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + +2008-02-25 Matthias Clasen + + * === Released 2.15.6 === + +2008-02-11 Matthias Clasen + + * === Released 2.15.5 === + +2008-02-06 Benjamin Otte + + * gparamspecs.c: (param_gtype_set_default), (param_gtype_validate): + make GParamGType require the set type during construction instead of + using G_TYPE_NONE, which causes issues when setting. + Bug 513073 - g_param_spec_gtype breaks with G_PARAM_CONSTRUCT + +2008-02-05 18:52:07 Tim Janik + + * gtype.c: added recursive mutex to protect class initialization, + default interface initialization and per-class interface construction. + a lock to this recursive mutex is held during user callback invocations + such as initializers or finalizers, effectively allowing only one thread + to run class/interface initializers/finalizers at a time. + also made misc fixups. this fixes: + Bug 64764 - Class initialization isn't thread safe. + +2008-02-05 18:41:22 Tim Janik + + * Makefile.am: integrate tests/. + + * tests/: new directory for libgobject tests. + + * tests/Makefile.am: build and run threadtests. + + * tests/threadtests.c: test multi-threaded initializers for + object classes and interfaces. + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + +2008-01-14 Matthias Clasen + + * === Released 2.15.2 === + +008-01-07 Matthias Clasen + + * === Released 2.15.1 === + +2007-12-26 Behdad Esfahbod + + * gclosure.h (G_CCLOSURE_SWAP_DATA): Fix macro argument. + (#505674, Areg Beketovski) + +2007-12-20 Matthias Clasen + + * === Released 2.15.0 === + +2007-11-11 Mathias Hasselmann + + Always exit with non-zero error code when printing warnings. + + * gobject/glib-genmarshal.c: Add global exit_status variable, and use + it in pad() and process_signature() to return with non-zero error code + when printing warnings. (#495294) + +2007-11-08 Matthias Clasen + + * glib-mkenums.in: Don't shift ARGV[0] to undefined. + (#466557, Aidan Delaney) + +2007-11-07 Matthias Clasen + + * === Released 2.14.3 === + +2007-10-16 Matthias Clasen + + * === Released 2.14.2 === + +2007-09-20 Carlos Garnacho + + * gtypemodule.h: make sure we define GType g_define_type_id in + G_G_DEFINE_DYNAMIC_TYPE_EXTENDED so it works together with + G_IMPLEMENT_INTERFACE. (#478459) + +2007-09-19 Matthias Clasen + + * === Released 2.14.1 === + +2007-08-03 Matthias Clasen + + * === Released 2.14.0 === + +2007-07-12 Matthias Clasen + + * === Released 2.13.7 === + +Tue Jul 10 12:31:50 2007 Tim Janik + + * gtype.h: use g_once_init_enter/g_once_init_leave to guard critical + initialization section of *_get_type implementations in G_DEFINE_TYPE, + bug #65041. + +Fri Jun 29 2007 Matthias Clasen + + * === Released 2.13.6 === + +Fri Jun 22 11:31:27 2007 Tim Janik + + * gtype.h: reintroduce typedef gulong GType; for C++, to avoid + C++ specific ABI breakage. + +2007-06-18 Matthias Clasen + + * === Released 2.13.5 === + +Thu Jun 14 23:32:00 2007 Tim Janik + + * gtype.h: always define GType unconditionally in terms of gsize, + there's no need to jump through a glong hoop ever and this fixes + the printf modifier to %zu. + +Thu Jun 14 22:33:11 2007 Tim Janik + + * gparamspecs.c (g_param_spec_types_init): work around SGI IDO cc, + fixes #363986. + +2007-06-05 Matthias Clasen + + * === Released 2.13.4 === + +2007-06-04 Matthias Clasen + + * === Released 2.13.3 === + +2007-05-22 Matthias Clasen + + * === Released 2.13.2 === + +2007-05-17 Matthias Clasen + + * gtype.h: Move G_GNUC_INTERNAL before function + declarations to fix compilation with sun studio. (#438873, + Damien Carbery) + +2007-05-03 Matthias Clasen + + * === Released 2.13.1 === + +2007-04-25 Michael Natterer + + * gparamspecs.c (param_string_validate): also clear the + NOCOPY_CONTENTS flag when replacing NULL with the empty string. + +2007-04-24 Michael Natterer + + * gparamspecs.c (param_string_validate): don't free or modify + static strings, dup them when needed and clear the + G_VALUE_NOCOPY_CONTENTS flag. Fixes bug #432895. + +Tue Apr 3 12:34:14 2007 Tim Janik + + * gobject.[hc]: invoke GObjectClass.constructed() only for newly + constructed objects, and invoke it while the notify queue is + still being frozen, after all CONSTRUCT* properties have been + set and before random other properties are being set. + + * applied modified patch from Ryan Lortie to implement + GObjectClass.constructed() to fix #425324. + +2007-04-02 Ryan Lortie + + * gobject/gobject.h: Add 'constructed' vcall to GObjectClass. + * gobject/gobject.c (g_object_newv): call ->constructed() as last + step of object construction. + +2007-03-16 Matthias Clasen + + * === Released 2.13.0 === + +2007-03-15 Matthias Clasen + + * gvaluearray.c: Use g_slice. (#404430, Chris Wilson) + +2007-03-14 Stefan Kost + + * gparam.h: + Add G_PARAM_STATIC_STRINGS define (fixes #418021). + +Mon Mar 12 13:30:20 2007 Tim Janik + + * gtype.h: marked purely functional g_type accessors as PURE or CONST, + closes #305100. + +2007-01-02 Tor Lillqvist + + * glib-genmarshal.c (main): Handle "/dev/stdin" by dup()ing fd 0 + so that it works on Win32 and other systems without + /dev/stdin. (#407431) + +2006-12-29 Matthias Clasen + + * gtypemodule.h: Define G_DEFINE_DYNAMIC_TYPE and + and _EXTENDED variant. (#334437) + +Fri Dec 15 2006 Matthias Clasen + + * gtype.c (instance_real_class_get): Dereference the pointer + before dropping the lock. (#378078, Jonathan Matthew) + +Tue Oct 10 12:06:08 2006 Tim Janik + + * glib-mkenums.in: + * glib-mkenums.1: applied patch from David Necas which introduces + an underscore_name option and fixes #358734. + +Mon Oct 2 15:50:16 2006 Tim Janik + + * gvalue.c (g_value_peek_pointer): reverted a change to have an + assert instead of a g_return_val_if_fail() here. libraries (and + programs) should only ever g_assert or g_error if there is no way + to carry on with the current program state. that's clearly not + the case here. + + * ChangeLog: added missing changelog entry for 2003-12-30. + +Sat Sep 30 2006 Matthias Clasen + + * pltcheck.sh: Script to check PLT entries. + + * Makefile.am (TESTS): Run pltcheck.sh + + * gtype.c: + * gsignal.c: + * gobject.c: + * gvaluetypes.c: Move all includes before gobjectalias.h. + (#3545422, Behdad Esfahbod) + +Fri Sep 22 13:41:02 2006 Tim Janik + + * gtype.h: applied patch from Behdad with slight optimization, + fixes #356175. + + * gobjectnotifyqueue.c: fixed include-guard macro name. + +Mon Sep 11 12:12:45 2006 Tim Janik + + * gparam.c (g_param_spec_sink): reimplemented floating flag handling by + atomically accessing a reserved GData bit, fixes #330556. + +Tue Aug 29 13:27:33 2006 Tim Janik + + * glib-mkenums.in: fixed to print usage and version info on STDOUT + (#322502). + + * gobject.c (g_initially_unowned_init): restore ; after G_DEFINE_TYPE. + +2006-08-26 Matthias Clasen + + * gobject.c: Remove ; after G_DEFINE_TYPE. (#351741, Kjartan Maraas) + +Wed Aug 23 10:35:32 2006 Tim Janik + + * gobject.[hc]: changed return value of g_value_dup_object(), fixes #343292. + +2006-08-23 Sven Neumann + + * gobject/glib-genmarshal.[c1]: added new command-line option + "--internal" that can be used to let glib-genmarshal generate + internal functions using the G_GNUC_INTERNAL attribute (bug #346647). + +Wed Aug 16 13:55:08 2006 Tim Janik + + * gobject.c: conditionally thaw the notify queue after construction, + so we don't trigger warnings when trying to thaw an unfrozen singleton. + +2006-08-15 Matthias Clasen + + * === Released 2.12.2 === + +2006-08-05 Matthias Clasen + + * gparamspecs.c (g_param_spec_types_init): Don't initialize + struct members with function calls. (#349952) + +2006-07-22 Matthias Clasen + + * === Released 2.12.1 === + +2006-07-21 Matthias Clasen + + * gtypemodule.c (g_type_module_register_type): Copy the complete + value table, not just the first 4 bytes. (#348136, Coverity) + +2006-07-02 Matthias Clasen + + * === Released 2.12.0 === + +2006-06-20 Matthias Clasen + + * === Released 2.11.4 === + +2006-06-15 Federico Mena Quintero + + * gtype.c (g_type_instance_get_private): Fix the error message so + that it mentions the right functions: + "g_type_instance_get_private() requires a prior call to + g_type_class_add_private()". + +2006-06-12 Matthias Clasen + + * === Released 2.11.3 === + +2006-06-05 Matthias Clasen + + * === Released 2.11.2 === + +2006-06-02 Behdad Esfahbod + + * gobject/genum.h: Make value_name and value_nick const in structs + _GEnumValue and _GFlagValue. (#317793) + +Tue May 16 14:01:43 2006 Tim Janik + + * gtype.h (G_IMPLEMENT_INTERFACE): turn off compiler warnings, #337129. + +2006-05-15 Matthias Clasen + + * === Released 2.11.1 === + +2006-05-02 Matthias Clasen + + * === Released 2.11.0 === + +Tue May 2 14:51:03 2006 Tim Janik + + * gtype.h: split up G_DEFINE_*TYPE macro definitions so C CODE arguments + are not passed on to nested macro calls. patch mostly courtesy of Behdad + Esfahbod, fixes #337128. + +2006-04-23 Matthias Clasen + + * gobject.symbols: Fix a typo. + + * gtype.c: (g_type_register_static_simple): Add a + missing return. + + * gtype.h: Silence warnings from G_DEFINE_TYPE. + +2006-04-21 Matthias Clasen + + * gobject.symbols: + * gtype.[hc]: Add a g_type_register_static_simple + variant of g_type_register_static that does not take + a relocation-causing GTypeInfo struct, and use it + in G_DEFINE_TYPE. + +2006-03-07 Matthias Clasen + + * === Released 2.10.1 === + +Tue Mar 7 17:09:07 2006 Tim Janik + + * gobject.c (g_object_compat_control): added case3 to hand out the + original floating flag handler. required by gtk+ >= 2.10. + +2006-02-24 Matthias Clasen + + * === Released 2.10.0 === + +2006-02-10 Matthias Clasen + + * === Released 2.9.6 === + +2006-01-29 Matthias Clasen + + * gclosure.c: Remove C++ comment. + +2006-01-27 Matthias Clasen + + * === Released 2.9.5 === + +2006-01-18 Matthias Clasen + + * === Released 2.9.4 === + +2006-01-18 Matthias Clasen + + * gobject.h: Make g_object_compat_control() visible + for GTK+ compilation, to avoid segfaults on 64bit + platforms. + +2006-01-16 Matthias Clasen + + * === Released 2.9.3 === + +2006-01-05 Matthias Clasen + + * === Released 2.9.2 === + +2006-01-04 Matthias Clasen + + * gobject.symbols: Add g_initially_unowned_get_type. + +2005-12-30 Matthias Clasen + + * gsignal.c: Remove the handler trash stack, which + is now unused. + (g_signal_init): Remove the restriction that HandlerMatch + must be the same size as GList, and obsolete comments + referring to mem chunks. + +2005-12-24 Matthias Clasen + + * gobject.symbols: Add new functions. + +Thu Dec 22 18:53:14 2005 Tim Janik + + * gobject.[hc]: renamed GUnowned to GInitiallyUnowned. + +Thu Dec 22 14:59:24 2005 Tim Janik + + * gvaluetypes.[hc]: implemented G_TYPE_GTPYE. applied patch + from matthias which implements GType accessors for GValue. + + * gparamspecs.[hc]: applied patch from matthias which + implements G_TYPE_PARAM_GTYPE. + + * gobject.[hc]: + GUnowned: introduced a new object type that has an initially + floating reference. + g_object_compat_control(): allow setting of a floating flag handler. + +2005-12-09 Matthias Clasen + + * === Released 2.9.1 === + +2005-12-05 Matthias Clasen + + * genums.h (G_FLAGS_CLASS_TYPE_NAME): Use G_FLAGS_CLASS_TYPE. + (#323273, Kalle Vahlman) + +Thu Dec 1 12:53:26 2005 Tim Janik + + * gtype.c: use g_slic_* for all object allocations. + +2005-11-28 Matthias Clasen + + * gobjectnotifyqueue.c (g_object_notify_queue_thaw): + * gobject-query.c (main): Silence compiler warnings. + + * glib-genmarshal.c (main): Use G_N_ELEMENTS. + +2005-11-27 Matthias Clasen + + * gboxed.h: Declare g_hash_table_get_type. + +Wed Nov 23 18:01:46 2005 Tim Janik + + * gobject.[hc]: added floating reference count. + g_object_is_floating(): + g_object_ref_sink(): new functions to deal with floating references. + g_object_force_floating(): new funciton for object implementations + to set the floating flag. + + * gobject.c (g_object_init): make objects initially floating. + +Wed Nov 23 17:58:13 2005 Tim Janik + + * gparam.[hc]: added g_param_spec_ref_sink(). + +Wed Nov 23 13:36:02 2005 Tim Janik + + * gboxed.[hc]: minor cleanups, implemented G_TYPE_HASH_TABLE. + +2005-11-17 Matthias Clasen + + * === Released 2.9.0 === + +2005-11-17 Matthias Clasen + + * glib-genmarshal.c: const correctness fixes, found + by Arjan van de Ven and gcc. + +Tue Nov 1 17:07:43 2005 Tim Janik + + * gsignal.c: allocate signal handlers and handler match structures + via the new g_slice_*() API (get's rid of GList allocation hack). + + * gtype.c: got rid of per-type memchunks. if GTypeInfo.n_preallocs + is > 0, objects are allocated via g_slice_*() instead of g_malloc(). + +2005-10-03 Matthias Clasen + + * glib-mkenums.in: Really fix #314890. + +2005-09-28 Michael Natterer + + * gtype.h (G_IMPLEMENT_INTERFACE): revert last change, it breaks + all users of G_IMPLEMENT_INTERFACE() inside + G_DEFINE_TYPE_WITH_CODE(), since apparently GCC doesn't like + commas enclosed in {}, not (), in nested macro calls. + +2005-09-26 DindinX + + * gobject/gtype.h: initialize all the fields of GInterfaceInfo in the + G_IMPLEMENT_INTERFACE macro, to shut up a warning when compiling at -W + +2005-09-26 Matthias Clasen + + * glib-mkenums.in: Don't hang on '{' following a trigraph comment + in the same line. (#314890, Mathias Hasselmann) + +Thu Sep 22 12:42:12 2005 Tim Janik + + * gparam.c (g_param_spec_internal): fix pspec->name assignment which + needs to be strdup()ed for non G_PARAM_STATIC_NAME pspecs. this fixes + recently introduced crashes during plugin unloading. + also, ensure that static pspec names are canonicalized. + + * gsignal.h: reverted last change from matthias, we don't guarantee + that type ids aren't mangled with G_SIGNAL_TYPE_STATIC_SCOPE anywhere. + +2005-09-20 Matthias Clasen + + * gsignal.h (struct _GSignalQuery): Remove the misleading comment + about G_SIGNAL_TYPE_STATIC_SCOPE, since we don't allow that + on return types. + +2005-09-08 Kjartan Maraas + + * gclosure.c: (g_closure_set_meta_marshal): Remove some unused + code. + * gsignal.c: (g_signal_emitv): Same here + * gtype.c: (g_type_register_fundamental): And here + * testgobject.c: Mark some functions static. + +2005-09-05 Matthias Clasen + + * gsignal.c (struct _SignalNode): Make the name field const. + (g_signal_newv): Don't keep an unnecessary extra copy of the + signal name around, and don't forget to free the name if + an existing node is reused. + +2005-08-31 Matthias Clasen + + * gobject.c (g_object_do_class_init): Intern the signal name. + + * gparam.c (g_param_spec_internal): Intern the name here, + since we need the quark anyway when sending change notification. + + * gboxed.c: + * gparamspecs.c: + * gtype.c (g_type_init_with_debug_flags): Intern type name + before registering the types. + + * gtype.h (G_DEFINE_TYPE_EXTENDED): Intern type name + before registering the type. + + * gvaluetypes.c (g_value_types_init): + * gtypeplugin.c (g_type_plugin_get_type): + * gtypemodule.c (g_type_module_get_type): + * gparam.c (g_param_type_init): + * gobject.c (g_object_type_init): + * genums.c (g_enum_types_init): + * gboxed.c (g_boxed_type_init): Intern type names + before registering the type to avoid unnecessary + copies. + +2005-08-23 Matthias Clasen + + * === Released 2.8.1 === + +2005-08-12 Matthias Clasen + + * === Released 2.8.0 === + +2005-08-09 Matthias Clasen + + * gvaluetransform.c: Access enum and flags + values as v_long/v_ulong, not v_int/v_uint, + to make value transformation of such types + work on bigendian 64bit machines. (#312485, + Michael Lorenz) + +2005-08-05 Matthias Clasen + + * abicheck.sh: Also check exported variables + + * === Released 2.7.7 === + +2005-08-03 Matthias Clasen + + * === Released 2.7.6 === + +2005-08-02 Matthias Clasen + + * gclosure.c (union ClosureInt): Mark the vint member as + volatile, which seems to be necessary to make atomic operations + work on s390. + + * === Released 2.7.5 === + +Mon Aug 1 23:00:42 2005 Tim Janik + + * gclosure.c: turned all modifications to the first 32 integer bits in a + closure into atomic accesses. wrapped write accesses into special macros + to keep the atomic modification logic in a single place. comment cleanups. + + * gclosure.h: made all atomicly accessed closure fields volatile. + + * gobject.h: made ref_count field volatile. + +Sun Jul 31 02:04:23 2005 Tim Janik + + * gobject.c: use g_datalist_set_flags() and g_datalist_unset_flags() to + allow proper locking around &qdata modifications. + +Sat Jul 30 21:10:26 2005 Tim Janik + + * gobject.c: reverted notify_mutex introduction, since this prevents + parallelized setting of object properties on different objects, and + serves no apparent purpose (to me at least). + g_object_real_dispose(): removed non-atomic reference count + modifications. + g_object_unref(): make sure the closures array is destroyed when + destroying signal handlers. + + * gparam.c: cosmetic changes. + + * gsignal.c: comment fixup. allow 16bit blocking count. + + * gsignal.c: reverted GClosure related changes. + + * gclosure.c: reverted premature commit of atomic reference + counting attempt. + +2005-07-21 Matthias Clasen + + * === Released 2.7.4 === + +2005-07-15 Matthias Clasen + + * === Released 2.7.3 === + +2005-07-15 Matthias Clasen + + Make refcounting threadsafe by using atomic + operations. (#166020, Wim Taymans) + + * gobject.c: Use a recursive lock to protect the + notify queue. + (g_object_unref): Get rid of g_object_last_unref and + do the last unref handling in g_object_unref. + (g_object_ref, g_object_unref): Use atomic operations. + + * gsignal.c (struct _HandlerMatch): Use a full integer + for the ref_count field. + (handler_ref, handler_unref_R): Use atomic operations. + + * gparam.c (g_param_spec_ref, g_param_spec_unref): + Use atomic operations instead of a lock to make the + refcounting threadsafe. + + * gclosure.c (g_closure_ref, g_closure_unref): Use atomic + operations. This is more complicated here, since the + refcount is stored in a bitfield, so we also have + to access all other bitfield members atomically. + + * gsignal.c (handlers_find): Read the meta_marshal flag + of the closure atomically. + +2005-07-11 Matthias Clasen + + * gobject.h: + * gobject.symbols: Remove G_GNUC_NULL_TERMINATED from + g_object_new again, since that makes gcc warn on calls of + the form g_object_new (some_type, NULL) + +2005-07-09 Tor Lillqvist + + * Makefile.am: Don't use the scripts in build/win32 to compile + gobject.rc into a resource object file. (This means we lose the + build number increment magic, but I doubt it was that useful + anyway.) Instead use windres directly. To pass the normal .o file + produced by windres through libtool, which wants .lo files, pass + it directly to the linker using a -Wl option. + + * gobject.rc.in: Thus replace BUILDNUMBER with 0. + +2005-07-08 Matthias Clasen + + * === Released 2.7.2 === + +2005-06-30 Matthias Clasen + + * === Released 2.7.1 === + +2005-06-26 Tor Lillqvist + + * Makefile.am: libtool installs/uninstalls the import library, no + need to do it ourselves. Do still install/uninstall the .def file, + though. + +2005-06-24 Tor Lillqvist + + * Makefile.am (install-libtool-import-lib): Current GNU tools do + understand the PRIVATE keyword. + +2005-06-19 Matthias Clasen + + * gparam.h (GParamFlags): Avoid a warning. (#308295, + Murray Cumming). + +2005-06-13 Matthias Clasen + + * gparam.h (GParamFlags): Re-add G_PARAM_PRIVATE as a + deprecated name for bit 5, since some language bindings + have it bound. + +2005-06-10 Matthias Clasen + + * === Released 2.7.0 === + +2005-05-20 Matthias Clasen + + * gvaluetypes.c (g_value_set_string): dup the new value + before freeing the old, just in case. (#172142, Morten + Welinder) + +2005-05-13 Matthias Clasen + + * glib-genmarshal.1: Mention 64bit integer types. + +2005-05-05 Owen Taylor + + * gobject.[ch] gobject.symbols: Add + g_object_add/remove_toggle_ref() functions to get notification + when a reference count is the last remaining reference; this + enables better memory management for language bindings. + (http://mail.gnome.org/archives/gtk-devel-list/2005-April/msg00095.html) + +2005-04-29 Matthias Clasen + + * gobject.symbols: + * gboxed.h (G_TYPE_DATE): + * gboxed.c: Add a boxed type for GDate. (#301787, Tim-Philipp + Müller) + +2005-03-25 Matthias Clasen + + * gparam.c (param_spec_ht_lookup): Don't do the second + lookup if the name was already canonical. (#171502, Morten + Welinder) + +Tue Mar 22 14:15:23 2005 Manish Singh + + * gparam.c (g_param_spec_internal): cast away any constness on + assignment. + +2005-03-21 Matthias Clasen + + * glib-mkenums.in: Avoid forcing extra newlines when using + template files. (#171005) + +2005-03-20 Matthias Clasen + + * gparam.c (g_param_spec_internal): Don't copy strings + which are marked as static. Don't allow non-canonical static + names. + + * gparam.h (GParamFlags): Add G_PARAM_STATIC_{NAME,NICK,BLURB} + flags. (#160655, Ben Maurer) + +2005-03-18 Hans Breuer + + * makefile.msc.in : handle gobjectaliasdef.c + +2005-03-14 Matthias Clasen + + Make PLT-reduction work with gcc4, and don't include + everything in gobjectalias.h: + + * gobject.symbols: Group symbols by header and source + file. + * makegobjectalias.pl: Protect definitions by the same + preprocessor symbols used to guard the headers. Move + the alias declarations to a separate file which is + produced when calling makegalias.pl -def + * Makefile.am (gobjectaliasdef.c): Add a rule to + build this file. + * *.c: Include gobjectalias.h after the other i + GLib headers, include gobjectaliasdef.c at the bottom. + +2005-03-08 Matthias Clasen + + * gobject.symbols: Add the new attributes here, too. + + * gobject.h: Use G_GNUC_NULL_TERMINATED where + appropriate. (#164706, Marc Meissner) + + * gvaluearray.h: Small cleanup (use G_BEGIN/END_DECLS). + (#168474, Fabricio Barros Cabral) + +2005-02-24 Tor Lillqvist + + * Makefile.am (EXTRA_DIST): Don't distribute + gobject.def. (#167496, J. Ali Harlow) + +Sun Feb 6 22:00:46 2005 Manish Singh + + * abicheck.sh: feed the contents of config.h and glibconfig.h + into the preprocessor, since glib.symbols could need #defines + from them. + +2005-01-12 Matthias Clasen + + Cosmetic fixes (#163792, Benoît Carpentier): + + * gobject-query.c (main): Remove duplicate lines. + + * gvaluetransform.c: Remove duplicate definitions of + value_transform_[u]int64_[u]int64. + +2005-01-07 Matthias Clasen + + * === Released 2.6.1 === + +2004-12-27 Matthias Clasen + + * Makefile.am: Only check the ABI on linux, since + the shell script is not portable. (#161734, Adrian Bunk) + +2004-12-16 Matthias Clasen + + * === Released 2.6.0 === + +2004-12-02 Matthias Clasen + + * === Released 2.5.7 === + +2004-11-30 Tor Lillqvist + + * Makefile.am (gobject.def): gcc -E complains "linker input file + unused because linking not done" if told to preprocess the + gobject.symbols file. Use '-' and redirection to pass it as + standard input instead. + +Sun Nov 28 13:21:12 2004 Manish Singh + + * abicheck.sh: filter G_GNUC before PRIVATE so $ is still true. + +Sun Nov 28 01:37:54 2004 + + * gsignal.c: applied patch by sven@gimp.org (#153727) to reduce + signal connection complexity from O(n_handlers) to O(1). + +Thu Nov 25 14:09:41 2004 Manish Singh + + * abicheck.sh: filter out G_GNUC stuff when doing the compare. + +2004-11-23 Matthias Clasen + + * gobject.symbols: Typo fix. + + Fix a problem with the PLT reduction changes which caused the + internal aliases to lose all attributes. + + * gobject.symbols: Add attribute annotations. + * makegobjectalias.pl: Keep attribute annotations, but strip PRIVATE. + * Makefile.am (gobject.def): Strip attribute annotations, but keep + PRIVATE. + + * gtypemodule.h (g_type_module_get_type): Mark as const, + like all other get_type() functions. + +2004-11-12 Matthias Clasen + + * === Released 2.5.6 === + +Mon Nov 8 10:47:41 2004 Manish Singh + + * gobject/gsourceclosure.c: removed wrap_g_io_channel_ref() hack, + since g_io_channel_ref() has a compatible API now. + +2004-11-02 Matthias Clasen + + * === Released 2.5.5 === + +2004-10-27 Matthias Clasen + + * === Released 2.5.4 === + +2004-10-27 Matthias Clasen + + * abicheck.sh: Strip Win32 specific defs file syntax. + + * Makefile.am (gobjectalias.h): Fix srcdir != builddir + builds. (#156447, Thomas Fitzsimmons) + +2004-10-26 Matthias Clasen + + * abicheck.sh: Don't include symbols which are just in the + symbols list for .defs file compatibility. + +2004-10-23 Matthias Clasen + + * gtype.h (GTypeInterfaceCheckFunc): Rename first parameter to + check_data, since apparently the system headers on AIX leak a + macro named func_data. (#155178, Andrea Campi) + +Wed Oct 6 02:12:44 2004 + + * gtype.c (g_type_instance_get_private): applied patch from Jean-Yves + Lefort to not access the instance_real_class_bsa + pointer without holding the instance_real_class lock. + +2004-10-04 Matthias Clasen + + * gsignal.c (g_signal_add_emission_hook): Improve the warning + if G_SIGNAL_NO_HOOKS is set. (#154299, Nickolay V. Shmyrev) + +2004-09-22 Tor Lillqvist + + * Makefile.am (install-libtool-import-lib): [Win32] Add code to + remove the bug-compatibility entries (see #134813, and related + comments below) from the import library. The PRIVATE keyword in + the .def file is supposed to mean that, but it isn't implemented + yet by GNU ld. + + * makegobjectalias.pl: In case the symbol is followed by some + stuff ("PRIVATE") that's intended for the .def file, use just the + actual symbol. + + * gobject.symbols: For binary bug compatibility on Win32, add the + g_slist_remove_all and g_unichar_validate symbols inside #ifdef + INCLUDE_INTERNAL_SYMBOLS. (See #134813 and log entries from March + below.) + +2004-09-18 Matthias Clasen + + * === Released 2.5.3 === + +Thu Sep 16 18:42:46 2004 Manish Singh + + * abicheck.sh: don't hardcode lengths for cut, instead split on + the third field. + +2004-09-16 Matthias Clasen + + Implement the same PLT reduction technique used in GTK+: + + * Makefile.am: Generate gobjectalias.h from gobject.symbols. + (BUILT_SOURCES): Add gobjectalias.h. + + * makegobjectalias.pl: Script to generate gobjectalias.h. + + * *.c: Include gobjectalias.h + +2004-09-16 Matthias Clasen + + Add ABI control using the same technique that is used in GTK+. + + * gobject.symbols: Master list of symbols. + + * gobject.def: Removed. It is now generated from gobject.symbols. + + * Makefile.am: Generate gobject.def from gobject.symbols. + (TESTS): Add abicheck.sh + (EXTRA_DIST): Add abicheck.sh + (export_symbols): Don't export _-prefixed symbols. + + * gtype.h: + * gtype.c: Move the declarations of the various _init() functions + to the header, and mark them as G_GNUC_INTERNAL. + +2004-08-25 Matthias Clasen + + * === Released 2.5.2 === + +2004-08-01 Matthias Clasen + + * === Released 2.5.1 === + +2004-07-28 Matthias Clasen + + * gtype.c (g_type_instance_get_private): Catch cases of + forgotten g_type_add_private(). (#148368, Tommi Komulainen) + +2004-07-21 Matthias Clasen + + * glib-genmarshal.c (put_marshal_value_getters): Use the + correct fields for enums and flags. (#145015, Tommi Komulainen) + +Sun Jul 18 18:03:08 2004 Soeren Sandmann + + * === Released 2.5.0 === + +2004-07-12 Matthias Clasen + + * gsignal.c (g_signal_handler_is_connected): Don't + choke on a zero handler_id. + +Tue Jul 6 00:46:43 2004 Matthias Clasen + + * gtypemodule.h: + * gtypemodule.c: Fix the declarations of the new + functions to return GType, not void. + Also add missing includes. (#145508, Morten Welinder) + +Tue Jul 6 00:46:43 2004 Matthias Clasen + + * gtypemodule.h: + * gtypemodule.c (g_type_module_register_flags): + * gtypemodule.c (g_type_module_register_enum): New + functions to register enum and flags types from a + GTypeModule. (#145396, Sven Neumann) + +Wed Jun 23 12:55:34 2004 Matthias Clasen + + * gtype.h (G_DEFINE_TYPE_EXTENDED): Add an initializer for + the g_define_type_info.value_table. (#144678, Mariano + Suárez-Alvarez) + +Tue Jun 22 21:50:47 2004 Matthias Clasen + + * gsignal.c: Fix a couple of typos. + +Fri Jun 18 22:53:13 2004 Matthias Clasen + + * gsourceclosure.h (__G_SOURCECLOSURE_H__): Actually + define the guard after checking for it. (#108038, + Morten Welinder) + +2004-04-30 Matthias Clasen + + * === Released 2.4.1 === + +2004-04-22 Matthias Clasen + + * glib-mkenums.in: Actually convert escape chars in + --vprod. (#139058, Christophe Saout) + +2004-04-15 Matthias Clasen + + * gparamspecs.c (param_float_init): Correct the initial + minimal value to be -G_MAXFLOAT. The initial values were + inconsistant before, with the initial default being smaller + than the inital minimum. + (param_double_init): Correct the initial minimal value + to be -G_MAXDOUBLE. + +Tue Mar 9 09:16:11 2004 Owen Taylor + + * === Released 2.4.0 === + +2004-03-10 Tor Lillqvist + + * gobject.def: Mark the two entries that shouldn't be in the + import library (see below) as PRIVATE. + +Tue Mar 9 09:16:11 2004 Owen Taylor + + * === Released 2.3.6 === + +2004-03-04 Tor Lillqvist + + * gobject.def: Another of the glib DLL's functions was erronously + present in the stable branch's gobject.def: g_unichar_validate, + and nobody noticed until too late. Thus there are applications + deployed that expect it to be found in the gobject DLL, and to + keep ABI compatibility, we must keep it there forever. Argh. + +Mon Mar 1 16:49:51 2004 Owen Taylor + + * === Released 2.3.5 === + +2004-03-01 Tor Lillqvist + + * gobject.def: Add g_slist_remove_all back for ABI + compatibility. That entry point actually is in the glib DLL, but + it was at some time many years ago by mistake added to + gobject.def. Thus there presumably are executables out there that + expect it to be exported from the gobject DLL. We don't want to + break those. (#134813, J. Ali Harlow) + +Fri Feb 27 01:49:22 2004 Matthias Clasen + + * glib-mkenums.in: Support parsing of intializers containing + macros with arguments. (#129717) + +2003-02-28 Hans Breuer + + * gobject.def : added g_strv_get_type + +Tue Feb 24 14:09:21 2004 Owen Taylor + + * === Released 2.3.3 === + +Fri Feb 20 02:44:54 2004 Tim Janik + + * gtype.h (G_DEFINE_TYPE_EXTENDED): added (GTypeFlags) cast needed by C++. + +Tue Feb 3 21:24:01 2004 Tim Janik + + * gtype.h (_G_TYPE_CVH): provide a short-cut version for + this macro in case value->g_type==checked_type for gcc, similar + to instance and class check short-cuts. this speeds up code that + makes frequent use of G_VALUE_HOLDS_*() (e.g. setters/getters). + + * gtype.c (type_data_last_unref_Wm): don't call class-cache functions + for the uncached case, this rendered g_type_class_unref_uncached() + useless. pointed out by Stefan Westerfeld. + +Sat Jan 24 18:20:13 2004 Tim Janik + + * gtype.h: prefixed the parent_class variable defined by G_DEFINE_TYPE() + with type_name. removed type_parent_class argument + from G_DEFINE_TYPE_EXTENDED(). + +2004-01-24 Tor Lillqvist + + * gobject.def: Add a missing entry. + +Sun Jan 11 15:34:35 2004 Manish Singh + + * gsourceclosure.c: wrap g_io_channel_ref in a function that returns + the passed in GIOChannel, so we aren't abusing GBoxedCopyFunc + semantics. Fixes bug #131076. + +Sat Jan 10 23:55:42 2004 Matthias Clasen + + * glib-mkenums.1: Document the lowercase_name trigraph option. + +Sat Jan 10 02:43:20 2004 Tim Janik + + * gtype.h: made G_DEFINE_TYPE_INTERNAL() public by renaming it to + G_DEFINE_TYPE_EXTENDED() and moving it into the appropriate section. + +Fri Jan 9 23:41:00 2004 Matthias Clasen + + * gboxed.h: + * gboxed.c (g_strv_get_type): Add a boxed type for nul-terminated + string arrays. (#110528) + +Fri Jan 9 15:34:15 2004 Tim Janik + + * gtype.h: added convenience macros G_IMPLEMENT_INTERFACE() and + G_DEFINE_TYPE() plus variants. + +2003-12-30 Murray Cumming + + * gobject/glib-mkenums.in: Added a lowercase_name option, to be used + next to the enum declaration, where the flag option is already used, + when it is not possible to guess where to put the underscores in the + _get_type() function name, for instance for GNOMEVFSURIHide. + +Fri Dec 26 01:34:01 2003 Matthias Clasen + + * gtype.c (g_type_class_peek_parent): Don't acquire a read lock + here. (#106433, Owen Taylor) + +Wed Dec 17 23:29:17 2003 Matthias Clasen + + * gvalue.c (g_value_peek_pointer): Use g_assert() instead of + g_return_val_if_fail(), suggested by Sheldon Simms. + +2003-12-13 Hans Breuer + + gobject.def : update externals + +Sat Nov 29 14:57:20 2003 Tim Janik + + * gobject.c: fix g_object_set() within _init() implementations + not working for construct-only properties. + (g_object_init): make the object enter a construct_objects list. + (g_object_newv): remove object from construct_objects after creation. + (g_object_set_valist): + (g_object_set_property): allow construct-only properties for + objects which are in construct_objects. + +Thu Nov 27 17:53:52 2003 Tim Janik + + * gtype.[hc]: + (g_type_class_peek_static): variant of class_peek() which works for + static types only. + + * gobject.c: + (g_object_do_class_init): make ::notify a run-action signal. + (g_object_newv): use g_type_class_peek_static() by default to + speed up common code path (trades two write-locks for one read-lock). + (g_object_disconnect): + (g_object_connect): allow signal specification words to be + seperated by '-'. + (g_object_set_valist): + (g_object_new_valist): don't leak values. + (g_object_get_property): check property for readability. + (g_object_set_property): check property for writability and to + not be construct-only. + (g_object_set_valist): check property to not be construct-only. + +Sat Oct 25 01:09:17 2003 Matthias Clasen + + * gparam.h (struct _GParamSpecClass): Add /*< private >*/ + marker for documentation purposes. + +Tue Oct 21 23:17:06 2003 Matthias Clasen + + * genums.h (struct _GEnumClass): + * genums.h (struct _GFlagsClass): + * gtypemodule.h (struct _GTypeModuleClass): + * gtypemodule.h (struct _GTypeModule): Add /*< public >*/ + and /*< private >*/ markers for documentation purposes. + +Tue Oct 14 17:40:19 2003 Owen Taylor + + * gparamspecs.[ch]: Add a new GParamSpecOverride type + that is a pointer to a different paramspec in a parent + class or interface. + + * gparam.[ch]: Add g_paramspec_get_redirect_target() + which follows GParamSpecOverride to the real property. + Make g_param_spec_pool_list() hand redirections, + properties on interfaces. + + * gobject.[ch] gobjectnotifyqueue.c: Add + g_object_interface_install_property, + g_object_interface_find_property, + g_object_interface_list_properties(). Redirect virtually all + publically exposed GParamSpec's to the redirect target if + any. (->constructor is the exception.) + (#105894) + +Mon Oct 20 22:06:12 2003 Matthias Clasen + + * gobject.h (struct _GObjectClass): Add /*< public >*/ + and /*< private >*/ markers for documentation purposes. + +Sat Oct 18 01:24:14 2003 Matthias Clasen + + * gtypeplugin.h (struct _GTypePluginClass): Add /*< public >*/ + and /*< private >*/ markers for documentation purposes. + +Thu Oct 2 07:37:12 2003 Tim Janik + + * gtype.c: fix post class_init interface initialization logic + for child types. + +Thu Oct 2 01:16:50 2003 Owen Taylor + + * gtype.[ch]: Add g_type_add/remove_interface_check(), + which allows inserting a post-interface-initialization + check. + + * testgobject.c: Fix a deprecated usage. + +Mon Sep 29 10:51:01 2003 Owen Taylor + + * gtype.[ch]: Add g_type_default_interface_ref/peek/unref + for accessing the default vtable of an interface. + +Fri Sep 26 17:24:53 2003 Owen Taylor + + * gtype.c (g_type_instance_get_private): You can + have instance_real_class_bsa be non-NULL, but still + the class not be in the bsa. (Found by Kris Rietveld) + +2003-09-15 Matthias Clasen + + * glib-genmarshal.c (complete_out_arg): Don't generate code + using deprecated APIs. (#122292, Christian Persch) + +Fri Sep 12 16:31:40 2003 Owen Taylor + + * gsignal.[ch]: Add g_signal_accumulator_true_handled(), to + do TRUE-stops-emit signals. (#80487, Ron Steinke) + + * Makefile.am: Move testoverride.c and testifaceinit.c to + tests/gobject. + +2003-09-12 Matthias Clasen + + Make the g_value_set_x_take_ownership() functions "official" + part of the API (#100948): + + * gvaluetypes.[hc]: Add g_value_take_string() (synonym to the + now deprecated g_value_set_string_take_ownership()). + + * gparam.[hc]: Add g_value_take_param() (synonym to the + now deprecated g_value_set_param_take_ownership()). + + * gobject.[hc]: Add g_value_take_object() (synonym to the + now deprecated g_value_set_object_take_ownership()). + + * gboxed.[hc]: Add g_value_take_boxed() (synonym to the + now deprecated g_value_set_boxed_take_ownership()). + +Tue Sep 2 19:37:21 2003 Tim Janik + + * gtype.[hc]: added support for a "default vtable" per interface, + that interface vtables are initialized from. + the default vtable is initialized and finalized through class_init, + class_finalize and class_data from the interfaces GTypeInfo struct. + (type_data_last_unref_Wm): unload child plugin before unreffing + parent type. + + testifaceinit.c: minor fixups. fixed up base_init() assertions, since + with a default vtable, base_init() may be called multiple times. + added default initializer to iface1. + +Tue Sep 2 14:53:41 2003 Tim Janik + + * gobject-query.c (main): fix iterating over fundamental types. + + * gtype.c: applied patch from owen which keeps internal + class initialization state to maintain class and interface + initialization happen in the order of: + 1. class' base_init + 2. interface' base_init + = interfaces added after here are immediately base_init-ialized + 3. class_init + 4. Interface_init + = interfaces added here are immediately Interface_init-ialized + +Wed Aug 27 19:53:26 2003 Manish Singh + + * gobject.c: removed stray change from previous commit. + +Wed Aug 27 01:25:40 2003 Owen Taylor + + * Makefile.am testifaceinit.c: Add a detailed test case + for interface initialization, testing the ability to + add interfaces during class initialization and the ordering + of interface base_init, class init, and interface_init. + (Expected to fail at the moment.) + +Mon Aug 25 14:51:46 2003 Manish Singh + + * gtypemodule.c (g_type_module_register_type): fix typo in last + commit, cast to GTypeValueTable * to get rid of const warning. + +Mon Aug 25 14:16:48 2003 Owen Taylor + + * gtypemodule.c (g_type_module_register_type): Clarify + docs on the return. Fix a memory leak if a type with a + value table is reloaded. (#112439, Daniel Yacob) + +Tue Aug 19 05:21:04 2003 Tim Janik + + * testgobject.c (main): check private instance data after + initialization. + + * gtype.c: for instances with private data, store the real class + pointer in a bsearch array during class initialization. + (g_type_instance_get_private): fetch the real class of + an instance from the bsearch array if necessary. + +Tue Aug 19 04:08:14 2003 Tim Janik + + * gvalue.c: adapt to new gbsearcharray.h code. + (g_value_register_transform_func): turn transform function + replacement into a valid operation. + + * gsignal.c: adapt to new gbsearcharray.h code. + + * gboxed.c: adapt to new gbsearcharray.h code. + +Tue Aug 19 01:31:28 2003 Tim Janik + + * gsignal.c: added optimizations to skip NOP signal emissions. + +2003-08-08 Matthias Clasen + + * gobject.c (object_set_property): Improve the wording of the warning for invalid + values. (#117246, Mariano Suarez-Alvarez) + +Wed Aug 6 09:57:14 2003 Owen Taylor + + * testgobject.c (test_signal_accumulator): Add check + for instance private usage within in instance_init. + (Currently will fail.) + +2003-07-20 Hans Breuer + + * gobject.def : updated externals + +Tue Jul 8 22:29:31 2003 Soeren Sandmann + + * gtype.c (type_class_init_Wm): Only access node->data->instance + when the node is instantiable. + +Tue Jul 8 14:55:27 2003 Owen Taylor + + * gtype.c (type_class_init_Wm): Initialize + node->data->instance.private_size here rather than + in type_data_make_W() since the class init for the parent + class may have changed pnode->data->instance.private_size. + (#116921, reported by Soeren Sandmann) + +2003-06-18 Matthias Clasen + + * Makefile.am (man_MANS): Removed, these are now installed from + docs/reference/gobject. + +Fri May 30 14:42:24 2003 Owen Taylor + + * gobject.c (g_value_set_object): Order refs/unrefs + so setting the same object back is safe. (#112861, + Morten Welinder) + +2003-03-24 Sven Neumann + + * gtype.c (type_data_finalize_class_ifaces_Wm): removed leftover + debugging message (bug #109093). + +Thu Feb 27 17:33:19 2003 Owen Taylor + + * gtype.[ch] testgobject.c: Add support for instance-private data. + g_type_class_add_private(), g_type_instance_get_private(), + G_TYPE_INSTANCE_GET_PRIVATE(). (#101959, patch partly by + Mark McLoughlin, extensive feedback from Tim Janik.) + +2003-03-06 Matthias Clasen + + * gsignal.c (g_signal_handlers_block_matched): + (g_signal_handlers_unblock_matched): + (g_signal_handlers_disconnect_matched): Fix 0/FALSE confusion. + (#107662, Morten Welinder) + +Mon Feb 17 20:59:47 2003 Tim Janik + + * gvalue.c (g_value_register_transform_func): don't assert the types + passed in to have value tables. this prevents dynamic types from + registering transform functions. + +Sun Feb 9 13:44:01 2003 Soeren Sandmann + + * gboxed.c (boxed_proxy_value_init): remove lookup of unused + BoxedNode. + +2003-02-07 Matthias Clasen + + * gtypemodule.c: + * gtype.c: + * gsourceclosure.c: + * gparamspecs.c: + * gparam.c: + * gobject.c: + * gsignal.c: Remove all docs from gobject at Tims + request. Documentation is only for weenies anyway... + +2003-01-12 Tor Lillqvist + + * gobject.def: Add g_type_interface_prerequisites. Thanks to + Kenichi SUTO. + +2002-12-18 Matthias Clasen + + * gobject.c: Add docs. + +2002-12-18 Michael Natterer + + * gobject/gtype.c (type_data_finalize_class_ifaces_Wm): applied + patch I got from Tim Janik for testing which fixes bug #101521. + (restart iterating the interface enties each time we finalized one + because they might have been modified). + +2002-12-17 Matthias Clasen + + * gparam.c (g_param_spec_internal): Remove markup from doc + comment, as GObject doesn't use --sgml-mode yet. + +2002-12-15 Matthias Clasen + + * gsignal.c (g_signal_new): Typo fix. + + * gparamspecs.c: + * gparam.c (g_param_spec_internal): + * gobject.c (g_object_class_install_property): Add docs. + +2002-12-13 Matthias Clasen + + * glib-genmarshal.c, gobject-query.c: Use g_printf() instead of + system printf. (#99319) + +Thu Dec 12 15:00:10 2002 Manish Singh + + * gvaluetransform.c: use G_G[U]INT64_FORMAT unconditionally, + since we'll always have it now. + +2002-12-07 Matthias Clasen + + * gparam.c (canonalize_key): Rename to canonicalize_key. Adjust + all callers. + +2002-12-05 Matthias Clasen + + * gsignal.c (g_signal_new): Explain allowed signal names in more + detail. + +2002-12-04 Matthias Clasen + + * gsignal.h (g_signal_add_emission_hook): + * gtype.h (g_type_interface_get_plugin): Sync parameter names with + docs and implementation. + + * gtype.c (g_type_add_interface_dynamic): + (g_type_interface_get_plugin): + (g_type_interface_peek_parent): + (g_type_query): Add docs. + +2002-12-03 Matthias Clasen + + * gtype.c (g_type_get_qdata): + (g_type_set_qdata): + (g_type_interface_add_prerequisite): Add docs. + +2002-12-02 Matthias Clasen + + * gobject.c (g_signal_connect_object): Add docs. + +2002-11-30 Matthias Clasen + + * gsignal.c: More docs. + +2002-11-28 Matthias Clasen + + * gtype.c (g_type_interface_prerequisites): Document as 2.2 + API addition. + +Thu Nov 21 16:05:50 2002 Owen Taylor + + * gtype.c (g_type_check_instance_cast): Allow + NULL to be cast to any type. (Frequently requested, + most recently #99023, Lars Clausen.) + +Mon Nov 4 14:42:36 2002 Owen Taylor + + * gtype.c gsignal.c gvaluearray.c: Include config.h + so DISABLE_MEMPOOLS actually has an effect. + (#96437, Morten Welinder) + + * gsignal.c: Conditionalize definition of g_handler_ts + on DISABLE_MEM_POOLS (#96437) + +2002-10-20 Matthias Clasen + + * gtype.c (g_type_interface_prerequisites): Report only the most + specific instantiatable prerequisite, filter out all supertypes of + this one (the supertypes are added to the prerequisites array for + technical reasons). + +2002-10-16 Matthias Clasen + + * glib-mkenums.in: Support for template files. + + * glib-mkenums.1: Document --template. + +2002-10-15 Matthias Clasen + + * gtype.c (g_type_interface_prerequisites): New function to obtain + the prerequisites of an interface type. + +Sat Oct 12 22:02:32 2002 Tim Janik + + * merged up from 2.0: + + * testgobject.c: test creation of new fundamental types. + + * gtype.c (g_type_fundamental_next), (type_node_fundamental_new_W): + account for static_fundamental_next storing non-shifted fundamental + IDs. this fixes g_type_fundamental_next() not returning a new usable + fundamental ID. + +Wed Sep 11 16:50:20 2002 Dom Lachowicz + + * gtype.h: Fix problems with excessive C++ warnings: "ISO C++ forbids nested groups within expressions" + +Fri Jul 26 15:46:36 2002 Owen Taylor + + * gvaluetransform.c: Fix problems with excess ';' + by addition of strategic 'extern void glib_dummy_decl (void)' + (#83272, David L. Cooper II) + +Thu Jul 25 20:34:39 2002 Owen Taylor + + * gtype.c (g_type_interface_add_prerequisite): When + adding ancestral prerequisites, add the grandparents, + not the siblings. (Problem found by Jon Trowbridge, patch from + Dave Camp, #86879) + +2002-07-05 Anders Carlsson + + * gobject.c (g_object_base_class_finalize): Remove debugging + message, approved by Tim Janik. + +2002-06-11 Anders Carlsson + + * gtypemodule.c: (g_type_module_complete_interface_info): + * gtypeplugin.h: + Fix argument order. Fixes #82806. + +Mon May 20 15:57:47 2002 Owen Taylor + + * gsignal.c: When printing errors, handle NULL + returns from g_type_debug(). (#73559, Laszlo Peter) + + * gtype.c (type_descriptive_name_I): De-inline, + since it's only used for debugging. + +Tue May 7 15:03:02 2002 Owen Taylor + + * glib-genmarshal.c: Fix include order for config.h (#71704, + Morten Welinder) + +2002-05-07 Michael Natterer + + * Makefile.am: use the glib-genmarshal found at configure time + if CROSS_COMPILING is set, use the one which was just built + otherwise. + +Mon May 6 16:06:23 2002 Owen Taylor + + [ merged from stable ] + + * gobject.c: Remove PROPERTIES_CHANGED enumeration + value that wasn't used any more. (#78833, + Matthias Clasen) + + * gboxed.c (g_boxed_copy): Remove check on data[2] + that no longer exists. (#80814, Daniel Elstner) + +Tue Mar 26 15:21:47 2002 Owen Taylor + + * gsignal.h (g_signal_handlers_*_by_func): Add explicit + cast of G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA to + GSignalMatchType so that these macros work for C++. + (#76454, Damien Sandras) + +Mon Mar 25 17:51:05 2002 Owen Taylor + + * glib-mkenums.in (parse_entries): Fix various bugs and + excessive stack usage that crept in the conversion from + gtk-mkenums. (#74431) + +Mon Mar 25 17:25:57 2002 Owen Taylor + + * gtype.c (g_type_free_instance): Wrap setting freed instance + memory to 0xaa in #ifdef G_ENABLE_DEBUG + +Thu Mar 21 01:28:14 2002 Tim Janik + + * gsignal.[hc]: + * gobject.[hc]: fix extraneous include. + +Tue Mar 19 18:57:12 2002 Tim Janik + + * gtype.c (check_add_interface_L): applied patch from Matthias Clasen + to check for prerequisite of interfaces, fixes #74427. + fixed mutex recursion in his patch (we can't call g_type_is_a() while + holding a read lock). + + * gparam.c (canonalize_key): cleanup. + +2002-03-13 Alexander Larsson + + * gparam.c (canonalize_key): + Function to canonicalize parameter names. Faster than + using g_strcanon(). + (g_param_spec_internal, param_spec_ht_lookup): + Use canonalize_key. + +2002-03-13 Erwann Chenede + * gobject/gclosure.c + * gobject/gobject.c + * gobject/gsignal.c: fixed cast problems with function pointer + to avoid warnings (with forte compiler) (#73898) + +2002-03-05 Sven Neumann + + * gvaluetransform.c (g_value_transforms_init): don't try to + register undeclared value transform functions if G_GINT64_FORMAT + or G_GUINT64_FORMAT are undefined (#73586). + +2002-03-03 Tor Lillqvist + + * makefile.msc.in + * makefile.mingw.in: Rename testgruntime to testgobject here, too. + +Sun Mar 3 04:11:58 2002 Tim Janik + + * gobject.c: placed a comment about not changing CArray until we have + g_object_list_watched_closures(). + + * gparam.h (struct _GParamSpecClass): added padding. + + * gobjectnotifyqueue.c (struct _GObjectNotifyQueue): abuse + g_list_alloc() to allocate GObjectNotifyQueue to et rid + of locking issues. + +Tue Feb 26 10:51:00 2002 Owen Taylor + + * Makefile.am (testgobject_LDADD): Rename testgruntime + to testgobject. + +Sun Feb 24 22:08:29 2002 Owen Taylor + + * gtypemodule.[ch] (g_type_module_add_interface): Make + GInterfaceInfo paramter const to correspond to the + conventions for the g_type_add_interface() functions. + (#72461, Miroslaw Dobrzanski-Neumann) + +Sat Feb 23 13:28:56 2002 Owen Taylor + + * gtypeplugin.h (struct _GTypePluginClass): Add some + padding to the class. + + * gclosure.h (struct _GClosure): Fix typo in comment. + +2002-02-20 Tor Lillqvist + + * gobject.def: Add g_value_set_object_take_ownership and + g_value_set_param_take_ownership. + +Wed Feb 20 22:55:15 2002 Owen Taylor + + * gobject.c: Fix implicit conversions between void * and + function pointer (Miroslaw Dobrzanski-Neumann, #71963) + +Sun Feb 16 22:08:48 2002 Tim Janik + + * gobject.[hc]: + * gparam.[hc]: provide marshaller specific value_set_*_take_ownership() + variants. + + * gvalue.h: shrink GValue's data contents to 2 unions. + + * glib-genmarshal.c: fix release and realeas_check hackage by always + using _take_ownership() variants. directly access value contents if + G_ENABLE_DEBUG is not defined. + + * gobject.h: add padding pointers to the class struct. + +Wed Feb 13 17:22:37 2002 Tim Janik + + * gtype.c (g_type_value_table_peek): fixed a check for node not being NULL. + +Wed Feb 13 06:53:50 2002 Tim Janik + + * gparam.c: remove extraneous redefinition of G_PARAM_SPEC_CLASS(). + +Wed Feb 13 06:29:51 2002 Tim Janik + + * gvaluetransform.c: cosmetic cleanups, fixed [u]int64->string + conversions. + + * ChangeLog: added entry from owen which went into the wrong + file. + +Fri Feb 8 23:52:27 2002 Owen Taylor + + * gobject/gvaluetransform.c: Register transformations for + gint64, guint64. (#70780, patch from Andy Wingo) + +2002-02-10 Hans Breuer + + * gvaluetransform.c : msvc 5.0 can't cast from uint64 to + double. Disable respective transform_func than. + + * makefile.msc.in : build test programs + +Thu Jan 24 07:39:56 2002 Tim Janik + + * gobject.c (g_signal_connect_object): return gulong instead + of guint. + +Fri Jan 11 12:26:36 2002 Tim Janik + + * gparamspecs.c: fixed param_value_array_values_cmp(), + param_value_array_validate() and + param_value_array_set_default() to deal with NULL value + arrays. + +Wed Jan 9 05:23:27 2002 Tim Janik + + * gobject.h (G_OBJECT_WARN_INVALID_PROPERTY_ID): cosmetic fix. + +2002-01-05 Hans Breuer + + * makefile.msc.in : use -FImsvc_recommended_pragmas.h + +Fri Jan 4 04:36:46 2002 Tim Janik + + * gtype.h (G_TYPE_FLAG_RESERVED_ID_BIT): turn this into a GType, + so negating it works on 64bit platforms. + +2001-12-21 Tor Lillqvist + + * gobject.def: Add g_signal_get_invocation_hint. + +Tue Dec 18 21:39:57 2001 Tim Janik + + * testoverride.c: added some assertions to test + g_signal_get_invocation_hint(). + + * gsignal.[hc]: remove signal_id argument from + g_signal_chain_from_overridden(), the parameters are assumed to match + the innermost signal currently in emission for this instance. + added g_signal_get_invocation_hint() to figure the invocation hint + of the innermost signal emission of an instance. + + * gsignal.c (g_signal_list_ids): fix G_BSEARCH_ARRAY_NODES() to + access a bsearch array and not a pointer to it (discovered by + Sven Neumann). + +2001-12-17 Anders Carlsson + + * gtype.h (G_TYPE_FLAG_RESERVED_ID_BIT): Set the reserved bit + to (1 << 0) instead of (1 << 30). + +2001-12-14 James Henstridge + + * Makefile.am: add rules to build it. + + * testoverride.c: test program for closure override/chaining. + +Thu Dec 13 08:03:17 2001 Tim Janik + + * gsignal.c: implemented closure chaining. + +2001-12-08 Christopher Blizzard + + * gsignal.h (g_signal_connect): Explicitly add a cast to the last + argument so that the macro will work from C++. + +2001-12-06 Tor Lillqvist + + * makefile.mingw.in (gobject_OBJECTS): Add gsourceclosure.o. + +Mon Nov 26 09:55:12 2001 Tim Janik + + * gtype.h: typedef GType to gulong instead of gsize, if possible. + + * gtype.c: fixups for GType being sizeof(long) wide (changed + UINT casts). + * gsignal.c: + * gclosure.c: + * gparam.c: likewise. + +Sun Nov 25 22:33:32 2001 Tim Janik + + * gtype.h: removed enum GTypeFundamentals. use macros + to provide the constant fundamental type IDs, so they + all return numbers of type GType, and not int. + sizeof(GTypeFundamentals) < sizeof(GType) problem reported + and fix sugegsted by Havoc. + +2001-11-23 Hans Breuer + + * gobject.def : updated externals + +Mon Nov 19 14:35:56 2001 Owen Taylor + + * *.h: Improve the detection of invalid includes by moving + the test outside the duplicate include guards. + + * gsourceclosure.c (g_source_set_closure): Doc fix. + +Thu Nov 22 03:30:57 2001 Tim Janik + + * gvalue.h (G_TYPE_IS_VALUE): use g_type_check_is_value_type() + instead of g_type_value_table_peek(). + + * gtype.[hc] (type_check_is_value_type_U): speed up check + LOCK-less by caching lookups in node->mutatable_has_value_table. + + * gtype.[hc]: removed locks where possible. partly based on + patches from owen and alex. + +Thu Nov 22 00:26:26 2001 Tim Janik + + * gtype.[hc]: provide G_TYPE_FUNDAMENTAL_SHIFT and + g_type_fundamental_next() to return next usable fundamental + type. use TypeNode pointers as type IDs. + +2001-11-22 Tor Lillqvist + + * makefile.mingw.in (DEFINES): Set G_LOG_DOMAIN as in Makefile.am. + + * gparamspecs.h (GOBJECT_VAR): Can't use GLIB_VAR here, as that + makes sense only when building libglib. GOBJECT_VAR is similar for + libgobject. + + * gobject.def: Add g_param_spec_types, remove + g_type_fundamental_branch_last. + +Wed Nov 21 17:23:33 2001 Tim Janik + + * gparamspecs.[hc]: put newly created param spec types into a + global array. + + * gboxed.[hc]: moved boxed types with _get_type() function here, + for: G_TYPE_CLOSURE, G_TYPE_VALUE, G_TYPE_VALUE_ARRAY, + G_TYPE_GSTRING. + + * gtype.h: removed fundamental branch APIs and derived enum + values. define GType as gsize. + +2001-11-19 jacob berkman + + * gobjectnotifyqueue.c: include glib-object.h rather than + gobject/gobject.h + +2001-11-16 Mark McLoughlin + + * glib-mkenums.in: allow the enums name to not be on the same + line as the trailing '}'. (#64714) + +2001-11-18 Hans Breuer + + * makefile.msc.in : remove g_log_domain_gruntime usage + +Sat Nov 17 18:14:40 2001 Owen Taylor + + * glib-genmarshal.c: Exit with non-zero exit status if + any errors were encountered. + + * glib-genmarshal.c: Instead of generating gobject/gmarshal.h + #include only for the header, generate glib-object.h + #include for both the header and body. (#63834) + + * glib-genmarshal.c: Generate include guards around the + content unless --nostdinc is specified. + +2001-11-17 Tor Lillqvist + + * gobject.def: Add g_pointer_type_register_static. + +2001-11-15 Tor Lillqvist + + * gobject.def: Reflect recent changes. + +Tue Nov 13 23:18:10 2001 Tim Janik + + * gsignal.[hc]: add API for chaining: + g_signal_chain_from_overridden() and g_signal_override_class_closure(), + implementation yet to come. + + * gtype.[hc], Makefile.am: provide G_LOG_DOMAIN as compile flag. + + * gparam.[hc]: s/g_param_get/g_param_spec_get/ for get_nick, + get_name and get_blurb, to be consistent with the rest of the + g_param_spec_*() functions. + + * gparamspecs.[hc]: got rid of bogus GClosure paramspec. + G_TYPE_CLOSURE is a boxed type already. + +Tue Nov 13 22:16:41 2001 Tim Janik + + * gtype.[hc]: API cleanups. + remove g_type_check_flags(), provide g_type_test_flags() as + a *private* function. + s/g_type_check_is_a/g_type_check_class_is_a/, private function. + s/g_type_instance_is_a/g_type_check_instance_is_a/, also private. + +Tue Nov 13 20:02:47 2001 Tim Janik + + * gparam.h: fix standard type macros. + +Wed Nov 7 00:56:00 2001 Tim Janik + + * gclosure.h: provide G_CLOSURE_N_NOTIFIERS() for people that need + to walk the notifier list (puhh, black magic, stay-away-warning ;). + +Mon Nov 5 18:59:08 2001 Tim Janik + + * gobject.h: + * gsignal.h: we need signal.h for G_BREAKPOINT(). + +Sun Nov 4 14:01:23 2001 Owen Taylor + + * gvaluetypes.[ch]: Add a function g_pointer_type_register_static() + to register a type derived from G_TYPE_POINTER. + +2001-11-03 Hans Breuer + + * makefile.msc.in : gobject-query needs gmarshal.[hc,stings] + so build it after them. Add gsourceclosure.obj. + + * gobject.def : removed duplicates, added mising + +Mon Oct 29 11:05:15 2001 Owen Taylor + + * glib-mkenums.in: Generate glib-mkenums from glib-mkenums.in, + substituting in path to perl. (#63093, Dan Winship) + + * Makefile.am (bin_SCRIPTS): Remove hack to copy glib-mkenums + from srcdir. + +2001-10-26 Tor Lillqvist + + * makefile.mingw.in: When running glib-genmarshal, set PATH to + include ../glib. + +2001-10-23 Tor Lillqvist + + * Makefile.am: (Win32): If we have built the MSVC import library, + install it. Install the gcc import library. Also support + uninstall. + +2001-10-13 Matthias Clasen + + * glib-genmarshal.1, glib-mkenums.1: Typo fixes. + +Fri Oct 12 18:40:18 2001 Tim Janik + + * cosmetic fixups. + +Wed Oct 10 17:25:22 2001 Joshua N Pritikin + + * glib-genmarshal.c gparamspecs.[ch] gtype.[ch] gvalue.h + gvaluecollector.h gvaluetypes.[ch]: Fill in missing support for + gint64 & guint64 (#59254). + + * Unconditionalize same (compile with or without G_HAVE_INT64). + +Wed Oct 10 15:38:58 2001 Joshua N Pritikin + + * gparamspecs.h (G_IS_PARAM_SPEC_FLAGS): Fix order of + *_PARAM_SPEC_ULONG defines. + +Thu Oct 4 01:10:52 2001 Owen Taylor + + * gparamspecs.h: Add missing G_HAVE_GINT64 conditionalization. + +Wed Oct 3 16:02:24 2001 Owen Taylor + + * glib-genmarshal.c gparamspecs.[ch] gvalue.h + gobject/gvaluetypes.[ch]: Add support for G_TYPE_INT64 + and storing it in GValue (Patch from Mathieu Lacage, #59254.) + +2001-10-03 jacob berkman + + * gtype.c (type_iface_retrieve_holder_info_Wm): + (type_iface_vtable_init_Wm): + (type_iface_vtable_finalize_Wm): + (g_type_class_ref): + + * gobject.c (g_object_get_property): s/retrive/retrieve/ + +2001-09-25 Tor Lillqvist + + * Makefile.am: Use new macros for .def file, and check for + MS_LIB_AVAILABLE, new rule to build MS import library. + + * makefile.msc.in: Use same DLL and import library names as + libtool. + +2001-09-21 Hans Breuer + + * gobject.def : updated externals + +2001-09-19 Tor Lillqvist + + * gobject.rc.in: Correct InternalName and OriginalFilename to + match what we actually produce. + +Tue Sep 18 23:09:02 2001 Tim Janik + + * gparam.[hc]: rename *nick and *blurb fields to catch + direct accesses in third party code. + provide g_param_get_nick(), g_param_get_blurb() and + g_param_get_name() accessors. + +Mon Sep 10 20:31:37 2001 Tim Janik + + * gobject.[hc]: removed extraneous GObject* returns from a + couple functions that are very unlikely to be used in nested. + changed gpointer->GObject* for a couple return values/arguments. + this fixes #50206. + +Mon Sep 10 19:27:47 2001 Tim Janik + + * gtype.[hc]: + g_type_add_interface*(): implement the ability to add an interface to + a type whose parents already conform to this interface. + such "overriding" interfaces, when initialized, are not just initialized + with 0, but with a copy of the interface they override. + g_type_interface_peek_parent(): new function, return the interface + that this interface "overrides", if any. + + * testgruntime.c: test new interface stuff. + +2001-09-10 Alex Larsson + + * gobject/gboxed.[ch]: + * gobject/gsourceclosure.c: + Removed is_refcounted and GBoxedInitFunc from + g_boxed_type_register_static(). + +Sat Sep 8 14:13:57 2001 Owen Taylor + + * gobject/Makefile.am: Move gbsearcharray.[ch] to glib + as a private ininstalled header. + +Tue Sep 4 22:24:48 2001 Matthias Clasen + + * gobject.c (g_object_base_class_finalize): typo fix. + +Tue Sep 4 01:49:18 2001 Tim Janik + + * gsourceclosure.c: make closure_callback_funcs static, + added some g_return_if_fail() statements. + +Mon Aug 27 14:55:27 2001 Owen Taylor + + * gsourceclosure.[ch] (g_source_set_closure): Implement. + + * gsourceclosure.[ch]: Add GType's for GIOChannel, GIOCondition. + +2001-08-17 James Henstridge + + * gobject.c (WeakRefStack): add an object member to the structure. + (weak_refs_notify): pass wstack->object as extra argument to + notify functions. + (g_object_weak_ref): set wstack->object when initialising + WeakRefStack. + + * gobject.h (GWeakNotify): add second argument to prototype which + gives the pointer to where the object that is being disposed of + was. + +Wed Jul 18 19:42:31 2001 Tim Janik + + * gtype.h: if __GNUC__ is defined, inline a test for an exact type + match for instances and classes in G_TYPE_CHECK_INSTANCE_TYPE() and + G_TYPE_CHECK_CLASS_TYPE() before calling g_type_instance_is_a(). + +Sun Aug 12 02:07:10 2001 Tim Janik + + * gvaluearray.[hc]: fix preallocation logic, support DISABLE_MEM_POOLS + properly, group value allocations. + (g_value_array_new): fix semantic of n_prealloced argument, so it's + really just about preallocation space. + +2001-07-23 Padraig O'Briain + + * gobject/gobjectnotifyqueue.c: fix unconditional check of + first GParamSpec in g_object_notify_queue_thaw(); to prevent + property notification being lost. + +2001-08-06 Sven Neumann + + * gobject.[ch]: + added new functions g_object_[add|remove]_weak_pointer(). + +2001-08-01 Sven Neumann + + * gsignal.h: added convenience macro g_signal_connect_after(). + +2001-07-29 Hans Breuer + + * gobject.def : updated externals + +2001-07-20 Hans Breuer + + * gobject.def : updated externals + + * makefile.msc.in : reflect glib move + +Tue Jul 10 18:50:16 2001 Tim Janik + + * gsignal.h (struct _GSignalQuery): fix misplaced comment. + +Mon Jul 2 07:17:47 2001 Tim Janik + + * gobject.c (g_object_weak_ref): + (g_object_watch_closure): congrats tim, introducing of-by-one + errors like on my very first day of C programming. + +Sat Jun 30 11:07:00 2001 Tim Janik + + * gobject.[hc]: provide weak_ref/weak_unref functions, + invoked from ->dispose. renamed ->shutdown() to ->dispose(), + provide "public" API entry here: g_object_run_dispose(), this + fucntion should _only_ be called from object system implementations + (e.g. gtkobject.c) if at all. + + * gtypemodule.c (g_type_module_dispose): s/shutdown/dispose/ + + * gsignal.h: removed compat aliases. + + * gobject.c (g_object_connect): support data objects. + +Sat Jun 30 13:17:12 2001 Owen Taylor + + * testgruntime.c (test_object_class_init) + gobject.c (g_object_do_class_init): + g_signal_newc() => g_signal_new(). + +Thu Jun 28 22:49:40 2001 Owen Taylor + + * gtype.[ch] gobject-query.c testgruntime.c: Remove + debug flag argument to g_type_init() and add + g_type_init_with_debug_flags(). + +Thu Jun 28 16:42:49 2001 Tim Janik + + * gsignal.c (g_signal_lookup): + (g_signal_list_ids): give elaborate warnings about invalid types, + non-instantiatable types and unloaded types that we can't operate on. + + * gparam.[hc]: g_param_spec_pool_belongings() -> + g_param_spec_pool_list_owned(). + + * gsignal.[hc]: renamed: + g_signal_newc -> g_signal_new + g_signal_disconnect_by_func -> g_signal_handlers_disconnect_by_func + g_signal_block_by_func -> g_signal_handlers_block_by_func + g_signal_unblock_by_func -> g_signal_handlers_unblock_by_func + added GConnectType to simplify (..gboolean swapped, gboolean after) + args. + + * gobject.[hc]: changed prototypes accordingly. + +2001-06-22 Hans Breuer + + * gobject.def : updated externals + + * gobjectnotifyqueue.c : include for memset () + +Thu Jun 21 02:43:10 2001 Tim Janik + + * gparamspecs.h: s/long/int/ for default_value in enum and flags + pspecs. + +Wed Jun 20 03:59:42 2001 Tim Janik + + * gtype.[hc]: added debugging variants g_type_name_from_class(), + g_type_name_from_instance(). + +Mon Jun 11 17:07:06 2001 Tim Janik + + * gboxed.[hc]: remove left-over usages of an anonymous GBoxed typedef. + + * gobjectnotifyqueue.c: moved property notify queue implementation + bits into this function. + + * gparam.[hc]: added g_param_spec_pool_belongings(), completed + g_param_spec_pool_list(). added GParameter for _setv() functions. + + * gobject.[hc]: use gobjectnotifyqueue.h implementation now. + got rid of properties_changed signal. + new functions g_object_newv(), g_object_class_list_properties(). + removed "properties_changed" signal. + + * gtype.[hc]: added g_type_depth() to figure number of parent + types + 1 for a type. + + * gsignal.h: add g_signal_connect() (as per owen's request) and + g_signal_connect_swapped(). + +2001-06-13 Havoc Pennington + + * Makefile.am (progs_LDADD): link to ./libgobject-1.3.la + since an installed libgobject was somehow being found; think + it's a libtool bug, but this workaround should do for now. + +2001-06-12 Havoc Pennington + + * Makefile.am (glib-mkenums): don't put $(srcdir)/glib-mkenums in + bin_SCRIPTS, that breaks make install. Instead put 'glib-mkenums' + in bin_SCRIPTS and cp it into builddir + +Thu May 31 17:56:47 2001 Owen Taylor + + * gobject-query.c: Fix mispelling in help output. + (#53952, Skip Montanaro) + +2001-05-28 Sebastian Wilhelmi + + * Makefile.am (EXTRA_DIST): Really distribute glib-mkenums, now + that bin_SCRIPTS doesn't seem to care about doing so anymore. + +Mon May 28 06:51:24 2001 Tim Janik + + * gsignal.c (signal_emit_unlocked_R): fixed bad faux-pass, forgot + to release signal lock when restarting emissions. + +Sun May 27 04:52:28 2001 Tim Janik + + * gsignal.[hc] (g_signal_stop_emission_by_name): added variant + to stop signal emissions through a detailed_signal string. + + * gsignal.c (signal_emit_R) (g_signal_emit_valist): account for + the fact that g_value_* functions may cause signal emissons by + unlocking the global signal system lock around g_value_* functions. + (signal_emit_unlocked_R): renamed this from signal_emit_R() to reflect + that this functions acquires the lock on its own now. + +2001-05-24 Hans Breuer + + * makefile.msc.in : changed depndencies to build glib-genmarshal + first and statically linked with glib, which makes it independent + from the installed glib version. Added new object files to build. + + * gobject.def : updated + +Thu May 24 08:52:02 2001 Owen Taylor + + * gobject.[ch] (g_value_set_object): gpointer, not + gpointer *. + +2001-05-22 Sebastian Wilhelmi + + * Makefile.am (bin_SCRIPTS): made 'make distcheck' happy. + + * gobject.def: Removed g_param_spec_stringc. + +Tue May 22 02:46:13 2001 Tim Janik + + * gobject.c (g_value_set_object): make g_value_set_object() + take a gpointer v_object so people don't need to G_OBJECT() + cast NULL pointers (C code convenience). + +Mon May 14 01:49:01 2001 Tim Janik + + * gsignal.[hc] (g_signal_handler_is_connected): new function + to check whether a handler is still connected to an instance + (by handler id). + +Thu May 10 14:00:48 2001 Tim Janik + + * gparamspecs.[hc]: removed g_param_spec_stringc() in lack of + evidence of public need. + + * gsignal.h: added g_signal_disconnect_by_func(), + g_signal_block_by_func() and g_signal_unblock_by_func() convenience + macros as per owen's request. + + * gtype.c (SIZEOF_FUNDAMENTAL_INFO): align sizeof (GTypeFundamentalInfo) + to size of longs and pointers. + +2001-05-05 James Henstridge + + * Makefile.am: glib-mkenums is not a compiled program, so shouldn't + be in the bin_PROGRAMS primary. Put it in bin_SCRIPTS instead, and + removed the glib_mkenums_SOURCES var. + +Thu May 3 06:10:23 2001 Owen Taylor + + * gobject.c (g_object_set_[q]data_full): Make types of ternary + operator correspond. (Fixes compilation errors with Sun CC, + #52230) + +Mon Apr 30 20:03:56 2001 Tim Janik + + * glib-mkenums (usage): removed \v escaping, newer perl versions don't + support this, and it'S probably useless anyways. + +Sat Apr 28 23:39:42 2001 Tim Janik + + * gsignal.[hc]: made signal handler and emission hook ids gulongs. + (signal_handlers_foreach_matched_R): only invoke callback for handlers + that are not disconnected (id>0). + (signal_emit_R): prevent invocation of signal handlers during the + emission they were connected within. + + * glib-mkenums: publically installed perl-script to parse C code + enums and generate descriptions thereof. + * glib-mkenums.1: assorted man page. + +2001-04-19 Havoc Pennington + + * gobject.c (g_object_get_valist): We were returning junk memory + here, because we didn't copy the value (G_VALUE_NOCOPY_CONTENTS + passed to G_VALUE_LCOPY) and then we freed the GValue immediately + after. Removed G_VALUE_NOCOPY_CONTENTS from here; need a + G_VALUE_STEAL_CONTENTS or the like if we want this optimization. + +Wed Apr 18 09:46:56 2001 Owen Taylor + + * gobject.c gsignal.c: Change C++ comments for FIXME's to + C comments. (Patch from Andres Salomon) + +2001-04-14 Hans Breuer + + * gobject.def : updated + +Mon Apr 9 18:56:15 2001 Tim Janik + + * gclosure.c (g_closure_invoke): only require marshal/meta_marshal if + we're valid (about to actually do marshalling). + +Tue Apr 3 20:23:24 2001 Tim Janik + + * NEWS: updates. + +Tue Apr 3 14:06:00 2001 Tim Janik + + * gparam.[hc]: added g_param_spec_pool_list() to list pspecs per + owner_type. the pspecs are not referenced, so the caller is + supposed to have some idea about owner_type not randomly + nuking his pspec's. if this is going to provide problems in + the future, we can either auto-ref the pspecs, or add a + _foreach variant, though the latter would have to invoke + the callback while pspec's mutex is acquired, so i just + went for the _list variant for now. + + * gclosure.h (G_CALLBACK): made GCallback a void (*) (void) fucntion. + +Sat Mar 31 23:55:58 2001 Tim Janik + + * gtype.h: + * gparamspecs.[hc]: applied patch from owen to implement + GParamSpecUnichar. + +Fri Mar 30 07:34:02 2001 Tim Janik + + * gtype.c (type_iface_retrive_holder_info_Wm): + * gtypeplugin.c (g_type_plugin_complete_interface_info): + * gtypemodule.c (g_type_module_complete_interface_info): + change order of instance_type and interface_type so they match + the g_type_add_interface_*() API. + + * gsignal.c (g_signal_emit_valist): always assign C return value + location, people depending on unaltered return values after emissions + that had no handlers to run need to use g_signal_emitv(). + + * gtype.[hc] (g_type_query): new function to allow querying of + class and object size (semantics like g_signal_query()). + currently the implementation is better held conservative so as to + only support types that are classed and static. + +2001-03-29 Tor Lillqvist + + * gobject.def: Updates. + +Wed Mar 28 17:04:06 2001 Tim Janik + + * gobject.c (object_queue_property): only queue readable properties + for notification changes. + +Thu Mar 22 13:36:50 2001 Tim Janik + + * gsignal.c (g_signal_newv): catch G_SIGNAL_RUN_FIRST with a return value. + +2001-03-21 Martin Baulig + + * gboxed.[ch] (g_value_dup_boxed): This takes a `const GValue *' + argument. + +2001-03-18 Tor Lillqvist + + * gobject.def: Correct some renamed functions. + +Sat Mar 17 23:18:36 2001 Tim Janik + + * gobject.c (g_object_get_property): minor bug-fix. + + * gbsearcharray.[hc]: provide a macro for static initialization and + functions g_bsearch_array_new() and g_bsearch_array_destroy() for + dynamic allocations. + + * gboxed.c: introduce G_TYPE_GSTRING, boxed type for GString. + + * gclosure.[hc]: naming corrections. + +Fri Mar 9 16:42:08 2001 Tim Janik + + * gvaluetypes.[hc]: moved g_strdup_value_contents() into this file as + a public function (was static in gobject.c before). it's a bit odd + to have that function here, especially since it requires extra includes, + but then it doesn't very well fit somewhere else either. + + * gparamspecs.c: added default/max/min checks to param spec creation + functions. + +2001-03-10 Tor Lillqvist + + * gobject.def: Add a couple of missing entries. + + * Makefile.am (libgobject_1_3_la_LIBADD): Use only on Win32. + +Fri Mar 9 14:57:17 2001 Tim Janik + + * testgruntime.c: test program. covers run first/last/cleanup signal + handlers, return value accumulator, signal string returns, and + interface types in signal arguments. + + * gtype.c (g_type_value_table_peek): for interface types without + value table, try looking up a value table from an instantiatable + prerequisite type (this is safe as an interface may only have + one instantiatable prerequisiste). + (type_check_is_value_type_U): same here. + + * gsignal.c (g_signal_newv): assert that return types never have + G_SIGNAL_TYPE_STATIC_SCOPE set. + (g_signal_newc): only create class closure if the class_offset is not + 0. + +Fri Mar 9 10:14:00 2001 Tim Janik + + * gparamspecs.c (g_param_spec_object): use g_type_is_a() to check + for object_type being a G_TYPE_OBJECT, not G_TYPE_IS_OBJECT(), since + that wouldn't allow interface types. + + * gtype.c (g_type_interface_add_prerequisite): arg, fixed small cnp bug + with bad implications and an off-by-one error. + +Thu Mar 8 16:34:22 2001 Owen Taylor + + * gvaluetransform.c: Include for memcpy. + + * gvaluetransform.c (DEFINE_SPRINTF): Remove unnecessary + and ANSI-illegal ## token pasting. + +Thu Mar 8 18:11:52 2001 Tim Janik + + * gsignal.c: eek, fixed old hook detail storage code. + +Thu Mar 8 16:35:48 2001 Tim Janik + + * gparamspecs.[hc]: s/g_param_spec_string_c/g_param_spec_stringc/. + + * gsignal.[hc]: fixed accumulator invocation, implemented emission + hooks. and no, neither of these callbacks are called via a closure, + language bindings can wrap the accumulator and emission hook + interface, they already get parameters marshalled into a GValue array. + (g_signal_connect): removed this function as its C specific, doesn't + cover the swapped argument, is too close to its broken original + gtk_signal_connect() and creates demand for _swapped, _after and + _swapped_after variants . + (g_signal_connectc): convenience macro to connect a C handler + func with data, like the old g_signal_connect() plus swapped + argument. + + * gtype.h: + * gboxed.c: added G_TYPE_VALUE boxed type. + +Wed Mar 7 19:02:51 2001 Tim Janik + + * gtype.c (type_node_add_iface_entry_W): catch when adding an interface + to an ancestor of a child that already conforms to this interface. + currently we spew a warning here, should we be silent? + (g_type_interface_add_prerequisite): new function to add a prerequisite + type to an interface, that must succeed an instance is_a prerequisite + type check before the interface can be added to an instance. the + prerequisite types are also suuported in is_a checks of the interface. + (g_type_instance_is_a): + (g_type_check_instance_cast): + (g_type_check_instance): cleanups and optimizations. + (g_type_class_is_a): + (g_type_check_class_cast): same, also prevented these from accepting + interface types, as class structures don't nest interfaces. + +2001-03-07 Sebastian Wilhelmi + + * Makefile.am: Avoid rebuilding everything everytime. + +Wed Mar 7 09:36:33 2001 Tim Janik + + * gboxed.[hc]: changed prototype of g_boxed_type_register_static() + to contain an optional init function and a hint at whether the + boxed structure uses ref counting internally. + added g_value_set_boxed_take_ownership(). + made G_TYPE_BOXED an abstract value type. + + * genums.[hc]: made G_TYPE_ENUM and G_TYPE_FLAGS abstract value + types. + + * glib-genmarshal.c: argument type changes, preparation for third-party + arg specification. + + * gobject.[hc]: cleaned up get/set property code. + added g_strdup_value_contents() to improve warnings. + + * gparam.[hc]: added g_param_value_convert(), taking over responsibility + of the old g_value_convert(). added G_PARAM_LAX_VALIDATION flag so + validation alterations may be valid a part of the property setting + process. + + * gparamspecs.[hc]: made value comparisons stable (for sort applications). + added GParamSpecValueArray, a param spec for value arrays and + GParamSpecClosure. nuked the value exchange functions and + GParamSpecCCallback. + + * gtype.[hc]: catch unintialized usages of the type system with + g_return_val_if_uninitialized(). introduced G_TYPE_FLAG_VALUE_ABSTRACT + to flag types that introduce a value table, but can't be used for + g_value_init(). cleaned up reserved type ids. + + * gvalue.[hc]: code cleanups and saner checking. + nuked the value exchange API. implemented value transformations, we + can't really "convert" values, rather transforms are an anylogy to + C casts, real conversions need a param spec for validation, which is + why g_param_value_convert() does real conversions now. + + * gvaluearray.[hc]: new files that implement a GValueArray, a struct + that can hold inhomogeneous arrays of value (to that extend that it + also allowes undefined values, i.e. G_VALUE_TYPE(value)==0). + this is exposed to the type system as a boxed type. + + * gvaluetransform.c: new file implementing most of the former value + exchange functions as single-sided transformations. + + * gvaluetypes.[hc]: nuked G_TYPE_CCALLBACK, added + g_value_set_string_take_ownership(). + + * *.h: s/G_IS_VALUE_/G_VALUE_HOLDS_/. + + * *.[hc]: many fixes and cleanups. + + * many warning improvements. + +Tue Feb 27 18:35:15 2001 Tim Janik + + * gobject.c (g_object_get_valist): urg, pass G_VALUE_NOCOPY_CONTENTS + into G_VALUE_LCOPY(), this needs proper documenting. + + * gparam.c: fixed G_PARAM_USER_MASK. + + * gtype.c (type_data_make_W): + (type_data_last_unref_Wm): fixed invalid memory freeing. + + * gobject.c (g_object_last_unref): destroy signal handlers associated + with object, right before finalization. + + * gsignal.c (g_signal_parse_name): catch destroyed nodes or signals + that don't actually support details. + + * gobject.[hc]: got rid of property trailers. nuked GObject + properties "data" and the "signal" variants. + (g_object_connect): new convenience function to do multiple + signal connections at once. + (g_object_disconnect): likewise, for disconnections. + + * gparam.[hc] (g_param_spec_pool_lookup): took out trailer support. + + * gvalue.[hc]: marked g_value_fits_pointer() and g_value_peek_pointer() + as private (the latter got renamed from g_value_get_as_pointer()). + +2001-02-21 Tor Lillqvist + + * *.h: Use G_BEGIN_DECLS and G_END_DECLS. + + * Makefile.am: Use libglib-1.3.la from top_builddir. Invoke + libtool with -no-undefined for Win32 and Cygwin. + +Wed Feb 21 18:31:46 2001 Jonathan Blandford + + * gsignal.h (g_signal_connect): Add g_signal_connect define to + make porting from gtk_signal_connect easy. + + * gsignal.c (g_signal_emit_valist): Use G_TYPE_FROM_INSTANCE + (instance) instead of node->itype when initting the value. + +2001-02-17 Havoc Pennington + + Applied patch from Soeren Sandmann: + + * gvaluetypes.c (g_value_get_string): G_CONST_RETURN + + * gtype.c (g_type_name): G_CONST_RETURN + + * gsignal.c (g_signal_name): G_CONST_RETURN + + * gobject-query.c (main): const fix + +Sat Feb 17 07:58:46 2001 Tim Janik + + * genums.h (G_TYPE_IS_FLAGS): patch from sven to fixup + G_ENUM_CLASS_TYPE() macro. + +Sat Feb 17 04:55:35 2001 Tim Janik + + * gtype.[hc]: changed collect_format, collect_value() and lcopy_format, + lcopy_value() in the GTypeValueTable. the collect functions are now + called only once per value, collect_format/lcopy_format are strings + that enlist all necessary GTypeCValues to be varargs-collected. + + * gvalue.h: ranamed STATIC_TAG to G_VALUE_NOCOPY_CONTENTS to indicate that + a value shouldn't copy its contents. + + * gvaluecollector.h: changed G_VALUE_COLLECT() and G_VALUE_LCOPY() + macros to carry an additional argument (flags) that can be used + to pass G_VALUE_NOCOPY_CONTENTS along to the collection functions. + + * *.c: adapted collect_value() and lcopy_value() functions to the new + prototypes, support G_VALUE_NOCOPY_CONTENTS where apropriate. + + * gsignal.[hc]: introduced a G_SIGNAL_TYPE_STATIC_SCOPE flag that can + be passed along (ORed) with the parameter types, indicating that the + emission arguments are to be considered static for the scope of the + emission. should be used with care and only if the caller knows that + a parameter cannot be destroyed/freed from signal handlers connected + to an emission. + +Fri Feb 16 07:10:44 2001 Tim Janik + + * gclosure.c: + (g_closure_ref): + (g_closure_sink): make closure sinking explicit. + + * gsignal.c: + (g_signal_connect_data): + (g_signal_connect_closure): + (g_signal_connect_closure_by_id): + (g_signal_newv): perform explicit closure sinking. + +Thu Feb 8 00:31:45 2001 Tim Janik + + * gtype.h: added G_TYPE_DEBUG_NONE for/from Eric Lemings ;) + +2001-02-04 Tor Lillqvist + + * gobject.def: Remove glib_debug_objects. + +Sun Feb 4 07:30:53 2001 Tim Janik + + * gtype.[hc]: changed g_type_init() to take debugging flags + initially, a combination of G_TYPE_DEBUG_OBJECTS and + G_TYPE_DEBUG_SIGNALS. using the G_TYPE_ prefix is a bit odd + here, but basically g_type_int() serves as initialization + fucntion for all of GType, GObject, GSignal, so what the heck. + + * gobject.c: special case debugging code properly. + changed glib_trap_object_ref to g_trap_object_ref. + + * gsignal.c: add signal emission debugging abilities, along with + a new trap object g_trap_instance_signals. + +2001-02-04 Tor Lillqvist + + * Makefile.am (progs_LDADD): Change order of libs to libgobject + first, then libglib. Needed for cygwin, says jbdoll@kepri.re.kr. + +Wed Jan 31 06:19:49 2001 Tim Janik + + * gparam.h: gtk-doc sucks for not dealing with #define inside enums. + + * gtype.[hc]: added G_TYPE_FLAG_RESERVED_ID_BIT, a bit in the type + number that's supposed to be left untouched (preserved mainly + for the signal code). + + * *.c: added thread safety code, based on an old patch from sebastian. + the remaining thread safety issues are now datalists on pspecs (to be + solved im gdataset.c) and gvalue.c where locking concerns value exchange + functionality only, and that's soon to be revised. + +2001-01-27 Tor Lillqvist + + * makefile.msc.in: Don't try to compile gmarshal.c on its own. + +2001-01-24 + + * gclosure.c (g_closure_unref): + Don't leak closure->notifiers. + +2001-01-05 Havoc Pennington + + * gparamspecs.c (g_param_spec_enum): set the value_type in the + param spec; closes bug 40210 + (g_param_spec_flags): ditto for flags + +2001-01-03 Alexander Larsson + + * gobject.c: + Move glib_debug_objects out of the G_ENABLE_DEBUG #ifdef. + +Thu Dec 28 11:36:44 2000 Tim Janik + + * gbsearcharray.c (upper_power2): disable G_BSEARCH_ALIGN_POWER2 + fucntionality if DISABLE_MEM_POOLS is defined. + + * gtype.c: honour DISABLE_MEM_POOLS. + + * gsignal.c (g_signal_init): flag signal key bsearch array with + G_BSEARCH_ALIGN_POWER2 to avoid excessive growth time. honour + DISABLE_MEM_POOLS. + + * gparam.h: added G_PARAM_READWRITE alias for (G_PARAM_READABLE | + G_PARAM_WRITABLE). + +2000-12-15 Tor Lillqvist + + * gobject.def: Update. + +2000-12-15 Havoc Pennington + + * gobject.c (g_object_do_class_init): use g_signal_newc + + * gsignal.c (g_signal_newc): convenience function for signals + created from C + (g_signal_new_valist): added + (g_signal_new): removed + +Fri Dec 15 04:40:23 2000 Tim Janik + + * gparam.[hc]: add an instance member value_type so the default + value of the pspec class can be overridden. + +2000-12-14 Tor Lillqvist + + * makefile.mingw.in: Update, include parts from Makefile.am to + build gmarshal.[ch]. Some day, we won't need these separate + makefiles for Win32 compilation. I hope. + + * makefile.msc.in: Update. No use trying to build gmarshal.[ch] + here, it would require Unixish tools. MSVC users building from CVS + sources are out of luck. + + * gobject.def: Update. + +Wed Dec 13 09:31:26 2000 Tim Janik + + * gparamspecs.[hc]: add G_TYPE_PARAM_BOXED implementation. + + * gobject.[hc]: minor fixes. + +Tue Dec 12 23:38:02 2000 Tim Janik + + * Makefile.am: _never_ touch oldest-source-stamp. + + * gobject.[hc]: construct property handling fixes/improvements. + fixed trailer handling in get/set property. + + * gparam.[hc]: implement param spec pool, got rid of param spec + hashtable. the most prominent change is that e deal with type + prefixes here. + +2000-12-12 Elliot Lee + + * Makefile.am: + . You have to 'touch oldest-source-stamp' if you want to avoid having + the Makefile constantly rebuild itself. + . Fix marshaller generation rules to work with srcdir != builddir + (there were issues with trying to run "./glib-genmarshal", etc.) + +Mon Dec 11 04:44:11 2000 Tim Janik + + * gboxed.c: fixed dealing with collection/lcopy of NULL values. + + * gclosure.h: removed insane ramblings, added G_CALLBACK() a casting + convenience macro. + + * Makefile.am: cleanups, marshaller generation rules. + + * gmarshal.[hc]: new files with GRuntime standard marshallers. + + * glib-genmarshal.c: fix log domain, support gruntime standard + marshallers, suport G_TYPE_PARAM, come with extern "C" and + #include gmarshal.h. + + * glib-genmarshal.1: reflect glib-genmarshal.c updates. + + * gobject.[hc]: implement object constructor. rework parameter + changed notification queueing, we support queue freezes now and + don't dispatch from an idle handler anymore. + parameter->property rename hassle. + implemented ::properties_changed and ::notify::* signals for + property change notification (the later supports property names + as details). added signal connection and named data properties. + (g_signal_connect_object): new function to setup while_alive + connections. + (g_object_class_install_property): sink properties now, since they + are initially floating. + (g_object_steal_data): + (g_object_set_data_full): + (g_object_set_data): + (g_object_get_data): set/get data by using g_datalist_*() functions + directly. + (g_object_queue_param_changed): nuked. + (g_object_freeze_notify): start queueing of property changes (freeze/ + thaw calls stack). + (g_object_notify): announce changes of a certain property directly. + (g_object_thaw_notify): process queue of property changes, therefore + emitting GObject::notify::detail with detail being the changed + properties names. + (G_OBJECT_WARN_INVALID_PROPERTY_ID): saner macro variant of former + G_WARN_INVALID_PARAM_ID(). + + * gparam.[hc]: param specs are now initially floating and need to be + sunken with g_param_spec_sink(), support G_TYPE_PARAM values. + added G_PARAM_CONSTRUCT and G_PARAM_CONSTRUCT_ONLY parameter flags, + required by GObjectClass.constructor(). + + * gparamspecs.[hc]: added GParamSpecParam, GParamSpecPointer and + GParamSpecCCallback, param specs for G_TYPE_PARAM, G_TYPE_POINTER + and G_TYPE_CCALLBACK respectively. + + * gsignal.[hc]: cleanups. + (signal_id_lookup): after walking the anchestry, try interfaces as well. + (g_signal_new): new function to create signals from varargs type list. + (g_signal_connect_closure): closure connection variant that works from + signal name+detail. + (g_signal_connect_data): c handler connection variant that works from + signal name+detail. + (g_signal_emit_valist): emit signal for an instance with paraneters + collected from a va_list. + (g_signal_emit): emit signal, taking parameters from varargs list. + (g_signal_emit_by_name): same as g_signal_emit, working from + signal name+detail. + (signal_emit_R): return whether return_value needs to be altered. + + * gtype.[hc]: set log-domain to GRuntime, i'm slowly getting to all + the points that need to reflect the upcoming rename. + melt g_type_conforms_to() functionality into g_type_is_a(), as that + is what we really want (liskov substitution principle). + assorted changes to other files due to conforms_to->is_a. + + * gvalue.[hc]: implemented g_value_set_instance() that sets a value + from an instantiatable type via the value_table's collect_value() + function (based on an idea from James Henstridge ). + cleanups/fixes. + + * gvaluetypes.[hc]: implement G_TYPE_CCALLBACK and G_TYPE_PARAM. + +Wed Nov 29 13:30:05 2000 Tim Janik + + * gsignal.c (handlers_find): fix elliots "logic fix" that dereferences + NULL nodes if C handlers are searched for specific signals. + +2000-11-28 Elliot Lee + + * gsignal.c: Fix warnings about possible use of uninitialized + variables, and fix logic that would leave 'node' unset in cases + that it might be used in. + + * glib-genmarshal.c: Fix warning about printf format. + +2000-11-28 Tor Lillqvist + + * gboxed.c: Include for memset (). + +2000-11-22 Tor Lillqvist + + * gobject.def: Update. + +2000-11-20 Havoc Pennington + + * gobject.c (g_object_get_data) + (g_object_set_data) + (g_object_set_data_full) + (g_object_steal_data): More convenient data-setting functions + +Wed Nov 15 20:58:05 2000 Owen Taylor + + * gtypemodule.c (g_type_module_use): If loading the + module fails, don't increment the use count. + +Thu Nov 9 01:49:43 2000 Tim Janik + + * gobject.h (G_WARN_INVALID_PARAM_ID): doh, + s/BSE_OBJECT_TYPE_NAME/G_OBJECT_TYPE_NAME/; reported by Maas-Maarten + Zeeman . + +Mon Nov 13 00:48:39 2000 Owen Taylor + + * Makefile.am (EXTRA_DIST): Add glib-genmarshal.1 + +2000-11-11 Tor Lillqvist + + * gtypemodule.c: Include stdlib.h for exit(). + + * makefile.{mingw,msc}.in (gobject_OBJECTS): Add gtypemodule. + + * gobject.def: Add missing functions. + +Sun Nov 5 13:21:28 2000 Owen Taylor + + * Makefile.am gtypemodule.[ch]: New basic implementation of + GTypePlugin interface as a GObject. Dynamically loaded modules can + register any number of types and interface on the module. + +Sun Nov 5 10:25:40 2000 Owen Taylor + + * gsignal.c (handlers_find): When appending handlers and + not matching on signal_id, use hlist->signal_id instead of + signal_id. Having the correct signal_id when unreffing + the handlers makes things work a lot better. + +2000-11-05 Tor Lillqvist + + * makefile.{mingw,msc}.in (gobject_OBJECTS): Add gtypeplugin. + + * gobject.def: Update. + +Sun Nov 5 05:22:55 2000 Tim Janik + + * gsignal.c: + fixed a bag full of subtle bugs of immensive screw-up potential in + handlers_find(), luckily no one found out about them yet ;) + fixed signal_handlers_foreach_matched_R() so it operates on an + initial handler list snapshot provided by handlers_find() to work + around general reentrancy problems and to avoid multiple callback() + invocations on the same handlers. + this code is now officially 80% bug free (10% remaining for interface + types, and 10% remaining for destroyed signals ;) + +Sat Nov 4 02:01:33 2000 Tim Janik + + * gsignal.c (_g_signals_destroy): valid signal nodes start out at 1. + + * gtypeplugin.[hc]: new files holding a GTypePlugin interface + implementation that provides the API required by GType to deal with + dynamically loadable types. + + * gtype.[hc]: displace any GTypePlugin business to gtypeplugin.h. + +Fri Nov 3 07:35:00 2000 Tim Janik + + * gsignal.[hc]: prefix internal functions with '_'. renamed + g_signal_connect_closure() to g_signal_connect_closure_by_id(). + added g_signal_parse_name() to retrive signal_id and detail quark + from a signal name (internal). + +Wed Nov 1 03:36:54 2000 Tim Janik + + * gobject.c (g_object_base_class_finalize): destroy all signals that + the finalized obejct type introduced. + + * gsignal.c (g_signals_destroy): don't require itype to have + signals. + + * gobject.c (g_object_do_finalize): make sure all signal handlers + are destroyed. + + * gsignal.[hc]: + (g_signal_handler_find): only match on non-0 masks. + (g_signal_handlers_block_matched): + (g_signal_handlers_unblock_matched): + (g_signal_handlers_disconnect_matched): new functions to block/unblock + or disconnect handlers in groups. + +2000-10-30 Sebastian Wilhelmi + + * gvalue.c (exchange_entries_equal), gparam.c (param_spec_equals): + made both functions return gboolean just for the little extra + standard conformance now that GEqualFunc is introduced. + +Mon Oct 30 05:52:45 2000 Tim Janik + + * gsignal.c (g_signal_list_ids): get rid of inline documentation owen + added, the doc system would ignore it anyways (for some reason not + aparent to me). + +Mon Oct 30 03:00:07 2000 Tim Janik + + * gsignal.[hc] (g_signal_list_ids): renamed owen's g_type_signals(), + added required mutex locks. + +Sun Oct 29 02:31:03 2000 Owen Taylor + + * gsignal.c (g_type_signals): Fix problem where signals + with "_" in them appeared twice in the result array. + +Sun Oct 29 01:58:44 2000 Owen Taylor + + * gsignal.h: Add g_type_signals() - a function to list + all signals for a given type. + +Sat Oct 28 00:28:09 2000 Tim Janik + + * gclosure.c (g_closure_add_marshal_guards): fixed notifier position + for post_marshal guard which was off at 0. + +Fri Oct 27 21:49:31 2000 Tim Janik + + * gobject.[hc]: doh, fix argument order in for + g_cclosure_new_object_swap and g_cclosure_new_object. + +2000-10-28 Tor Lillqvist + + * makefile.{mingw,msc}.in: Make glib-genmarshal.exe. + + * glib-genmarshal.c: Conditionalise include of unistd.h. + Include on Win32. + + * gobject.def: Add some missing entry points. + +Fri Oct 27 16:33:41 2000 Tim Janik + + * gsignal.[hc]: publically define GSignalInvocationHint structure + that gets passed in to closure invocations. added signal details. + renamed GSignalType to GSignalFlags to comply with conventions. + quite some cleanups and minor fixes. avoid uneccessary handler list + walks upon invocation of after handlers. relookup handler list for + restarted emissions. preliminary abort normal handler invocation if + after handler is encountered. + + * glib-genmarshal.c: + * gclosure.[hc]: moved invocation_hint to the end of the + g_closure_invoke() arguments as sugegsted by kenelson. + also made it a gpointer to be more generic. the invocation_hint + is a caller specific thing that can be used to pass additional + data in to closure invocations as documented with the caller + invoking the closure. + +Fri Oct 27 05:35:14 2000 Tim Janik + + * gobject.c (g_object_watch_closure): fixed realloc bug, reported + by havoc. + + * gsignal.c (g_signal_newv): fixed deadlock scenarion where + g_signal_lookup() would be called with the signal lock being + held. reported by james henstridge. + + * gclosure.c (g_closure_set_meta_marshal): fixed memcpy/overwrite bug + reported by owen. + +2000-10-26 Tor Lillqvist + + * gbsearcharray.c (bsearch_array_insert): Fix gccisms (pointer + arithmetic on void pointer, label without statement following. + + * gtype.c (type_node_fundamental_info): Don't apply unary minus to + result of sizeof operator, it can be unsigned. Cast first to + gssize. + + * gobject.def: Add new functions. + + * makefile.{mingw,msc}.in: Add new objects. + +2000-10-26 Sebastian Wilhelmi + + * Makefile.am: Remove empty SUBDIRS line _again_, as that _still_ + prevents 'make dist' from working. + +Wed Oct 25 19:11:03 2000 Owen Taylor + + * gbsearcharray.h (g_bsearch_array_get_nth): Don't use implicit + casts from void * since this will get included from C++ too + at times. + +Thu Oct 26 00:30:27 2000 Tim Janik + + * gvaluetypes.[hc]: added g_value_set_static_string(). + + * gboxed.[hc]: const corrections. added g_value_set_static_boxed(). + +Wed Oct 25 20:27:02 2000 Tim Janik + + * gtype.c (g_type_free_instance): for the moment, freeing object + structures will fill their memory portion with 0xAA. there's a + FIXME there, remove this line at a later point. + +Tue Oct 24 23:10:26 2000 Tim Janik + + * glib-genmarshal.1: + * glib-genmarshal.c: added publically installed marshaller generator. + + * gtype.h: added G_TYPE_INSTANCE_GET_INTERFACE() to retrive a certain + interface VTable from instances. + +Mon Oct 23 08:28:15 2000 Tim Janik + + * gobject.[hc]: new functions for closure maintenance: + (g_object_watch_closure): maintain validity of the object and + the closure for objects that are used as data part of a closure. + (g_cclosure_new_object): convenience function to create C closures + that have an object as data argument. + (g_closure_new_object): convenience function to create closures + that have an object as data argument. + + * gclosure.[hc]: implementation of GClosure mechanism. + a closure is basically an encapsulation of a callback function + and its environment. ideally, most places supporting callback + functions will simply take a GClosure* pointer and thus unify + callback environments wrg destroy notification etc. + GClosure provides destroy notifiers for arbitrary data pointers, + reference counting, invalidation notification (it can be invalidated + which is merely a deactivate state) and a marshallinbg abstraction. + GCClosure is also provided in these files, they present a specialized + GClosure implementation for C language callbacks. + + * genum.c: macro cleanups. + + * gboxed.[hc]: new files, for boxed type abstraction. + (g_boxed_copy): copy a boxed structure + (g_boxed_free): free a boxed structure + (g_value_set_boxed): + (g_value_get_boxed): standard GValue functions for boxed types + (g_boxed_type_register_static): convenience function for easy + introduction of new G_TYPE_BOXED derivatives. + + * gparam.[hc]: introduced g_param_type_register_static(), a short hand + for creation of new GParamSpec derived types. + + * gtype.[hc]: many fixes, introduced ability to flag individual + type nodes as ABSTRACT upon registration, added value_peek_pointer() + to the value table to peek at GValue contents as a pointer for types + that support this. fixed up GValue checks. + + * gvalue.[hc]: added g_value_fits_pointer() and g_value_get_as_pointer() + to peek at the value contents as pointer. + + * *.[hc]: adaptions to type macro fixes and changes in the type + registration API. + + * many const corrections over the place. + +Sat Oct 21 02:49:56 2000 Tim Janik + + * gtype.c (g_type_conforms_to): this function basically behaves like + and is_a check, except that it _additionally_ features interfaces + for instantiatable types. enforce this in the second branch as well + (`type' conforms_to `type') even if `type' is not an interface type. + +Fri Oct 20 15:31:04 2000 Tim Janik + + * gvaluetypes.[hc]: added G_TYPE_POINTER implementation from jrb. + + * gtype.[hc]: + * gobject.c: + * gvaluetypes.c: added GTypeValueTable.value_peek_pointer and + suitable implementations of this for G_TYPE_STRING, G_TYPE_OBJECT + and G_TYPE_POINTER. + +Mon Aug 21 04:13:37 2000 Tim Janik + + * gbsearcharray.[hc]: long standing needed generic implementation + of a binary searchable, sorted and dynamically sized array. + +2000-10-15 Raja R Harinath + + * Makefile.am (BUILT_EXTRA_DIST): New variable. + (dist-hook): Handle $(BUILT_EXTRA_DIST). + (*): Remove traces of @STRIP_{BEGIN,END}@. + +2000-09-29 Martin Baulig + + Several minor ANSI C fixes. + + Added missing casts: + * gtype.c (type_class_init): + `(gpointer) bnode->data->class.class_init_base' + in call to g_slist_prepend() and + 'GBaseInitFunc class_init_base = (GBaseInitFunc) slist->data'. + + * gobject.c: Put text following #endif into comments. + +2000-09-25 Sebastian Wilhelmi + + * Makefile.am: Remove empty SUBDIRS line, as that prevents make + dist from working. + +Sat Sep 9 20:04:13 2000 Owen Taylor + + * gobject.c (g_object_last_unref): Move call to + g_type_free_instance() here from g_object_do_finalize, + since g_type_free_instance() can unload the object's + implementation. + +2000-07-27 Tor Lillqvist + + * gobject.c: No, don't mark glib_debug_objects for export here, + it's handled specially in gtktypeutils.c. + + * gobject.def: Export g_type_fundamental_last (the function). + +2000-07-26 Tor Lillqvist + + * gobject.def + * gobject.c: Mark glib_debug_objects for export/import as it is + used by GTK+. + +Sun Jul 23 17:23:35 2000 Tim Janik + + * gtype.[hc]: make g_type_fundamental_last() a function, avoiding all + that extern variable clutter and avoiding further problems with thread + safety. + +2000-07-19 Tor Lillqvist + + * gparam.h + * gvalue.h + * gparam.c + * gtype.c: Shut up Sun's picky compiler. + +2000-07-14 Tor Lillqvist + + * gobject.def: Add g_type_get_plugin. + +Thu Jul 13 02:07:54 2000 Tim Janik + + * gparam.c (g_param_value_defaults): default initialize the temporary + default value, instead of nuking the caller's value contents. + +2000-07-11 Raja R Harinath + + * gtype.c (g_type_get_plugin): Don't return just 0 or 1. + +Tue Jul 11 02:48:13 2000 Tim Janik + + * gtype.[hc]: removed g_type_is_dynamic() and added g_type_get_plugin(). + +2000-07-10 Tor Lillqvist + + * gobject-query.c: Include ../config.h for HAVE_UNISTD_H. Use it + to guard inclusion of . + + * gtype.h: Fix copy-paste errors in the ifdefs on how to declare a + variable for export. Call the macro GOBJECT_VAR. + + * gtype.c: Declare _g_type_fundamental_last for export here, too. + (type_node_any_new): Use only constant expressions for sizeof + operator (for instance MSVC requires this). + + * makefile.mingw.in: Define GOBJECT_COMPILATION. + +Sun Jul 9 21:21:46 2000 Owen Taylor + + * genums.c: Move string.h include into the .c file + instead of where it was in the .h file by mistake. + +Thu Jul 6 15:30:27 2000 Owen Taylor + + * Makefile.am (EXTRA_DIST): dist fixes. + + * gobject.c: Add a global variable glib_debug_objects + (not in header file) to control object tracing. + +2000-07-01 Tor Lillqvist + + * gobject.def: Update added and renamed entry points. + + * makefile.mingw.in: Add gvaluetypes.o. + +Thu Jun 29 16:02:07 2000 Owen Taylor + + * gobject.c:include string.h for memset + * genums.h: include string.h for strcpy + * gvalue.c: include string.h for memset, memcpy. + +Sat Jun 24 23:03:04 2000 Tim Janik + + * gtype.[hc]: provide G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_BOOLEAN, + G_TYPE_INT, G_TYPE_UINT, G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_FLOAT, + G_TYPE_DOUBLE and G_TYPE_STRING fundamental types. + added a GTypeValueTable* pointer to GTypeInfo structure for types + to implement GValue handling functions. + GTypeValueTable contains the following members: + value_init(): initialize a GValue structure. + value_free(): free GValue structure contents (optional). + value_copy(): copy one GValue contents to another GValue structure of + collect_type: varargs collection type for the first variable argument + to be collected by collect_value(). + collect_value(): variable arguments collection function (optional). + lcopy_type: varargs collection type for the first variable argument + to be location copyied by lcopy_value(). + lcopy_value(): variable arguments location copy function (optional). + g_type_value_table_peek(): new function to retrive the GTypeValueTable* + for a type node. ValueTables get inherited from parent types, unless + overridden through the GTypeInfo structure. internally, GTypeValueTable + support means an added overhead of one pointer per static or used + dynamic type node. + g_type_add_class_cache_func(): provide a cache_func/data pair to be + called prior to a type nodes last_unref() function, this can be used + to prevent premature class destruction. multiple installed cache_func() + will be chained upon last_unref() untill one of them returns TRUE. + the cache_func()s have to check the class id passed in to figure whether + they actually want to cache the class of this type (since all classes + are routed through the cache_func() chain). + g_type_remove_class_cache_func(): remove a previously installed + cache_func/data pair. the cache maintained by this function has to be + clear when calling g_type_remove_class_cache_func() to avoid leaks. + g_type_class_unref_uncached(): class unref function for cache_func() + implementations, unreferences a class omitting the cache chain (and + therefore unref->cache->unref->... loops). + + * gvaluetypes.[hc]: provide the value setters/getters for the primitive + fundamental types boolean, char, uchar, int, uint, long, ulong, float, + double and string. + + * gvalue.[hc]: provide G_TYPE_IS_VALUE() in terms of whether a + GTypeValueTable is provided for this type. + removed g_value_init_default(), g_value_validate(), g_value_defaults(), + g_value_set_default() and g_values_cmp() as these are supplied by the + GParamSpec API now. + moved g_values_exchange() into the "implementation details" section, + since it just provides the underlying functionality for + g_value_convert(). + + * gvaluecollector.h: renamed the varargs value container from + GParamCValue to GTypeCValue as the value collection methods are + supplied by the type system now. + G_PARAM_COLLECT_VALUE() and G_PARAM_LCOPY_VALUE() got renamed to + G_VALUE_COLLECT() and G_VALUE_LCOPY() and operate without a + GParamSpec structure now. + + * genums.h: macros cleanups/fixes. + + * genum.c: provide G_TYPE_ENUM and G_TYPE_FLAGS type + and assorted g_value_{s|g}et_{enum|flags}() implementations. + + * gobject.[hc]: + provide G_IS_VALUE_OBJECT(), G_TYPE_OBJECT ValueTable methods + and g_value_{s|g}et_object(). + + * gparam.[hc]: reduced class to value_set_default(), + value_validate() and values_cmp(). also parameters now need to fill + in a GType value_type; field to indicate the GValue type they + are handling. provide g_param_value_set_default(), + g_param_value_defaults(), g_param_value_validate() and + g_param_values_cmp(). + + * gparamspecs.[hc]: got rid of the g_value_* functions and + the G_IS_VALUE_* macros. adapted param spec implementations + according to the GParamSpecClass changes. + +Sat Jun 10 08:38:27 2000 Tim Janik + + * gtype.c (type_class_init): fetch the nth iface entry of the + type node in the nth loop iteration, not alwys the first. + bug discovered by Walt Pohl . + (type_data_finalize_class_ifaces): same here, cut and paste + rulez. + +Wed Jun 7 09:21:05 2000 Owen Taylor + + * Makefile.am (INCLUDES): Add top_builddir so glibconfig.h + is found properly when build srcdir != builddir. (Patch from + Eric Lemings) + +2000-05-13 Tor Lillqvist + + * makefile.mingw.in + * gobject.def + * gobject.rc.in: New files, for Win32 (mingw) build. + + * Makefile.am: Add to EXTRA_DIST. Add rules to produce the + corresponding non-*.in files. + + * gtype.h: (Win32:) Mark _g_type_fundamental_last for + export/import from DLL. + +Fri May 5 01:15:48 2000 Tim Janik + + * gtype.h: add reserved fundamental ids for gtk types (for transition + time). added G_TYPE_FUNDAMENTAL_MAX for gtk. + +Mon Apr 17 20:45:50 2000 Tim Janik + + * glib-gobject.c (g_object_base_class_finalize): oops, don't unset + n_params prior to destructing them. + +Tue Apr 11 04:28:10 2000 Tim Janik + + * fixed a couple of bugs in the initial parameter/object + implementations, after getting beast running on GObject and GValue. + +Fri Apr 7 04:27:49 2000 Tim Janik + + * glib-gobject.[hc]: completed parameter set/get implementations, + along with asyncronous parameter changed notification queue. + +Sun Apr 2 04:54:36 2000 Tim Janik + + * glib-gobject.[hc]: GObject implementation, that is facilities + for setting/getting quarked data and reference counting. + + * glib-gparamspecs.[hc]: first actuall parameter implementations + for GLib, so far we have: char, uchar, bool, int, uint, long, + ulong, enum, flags, float, double, string and object. each of these + GParamSpecs is a new instantiatable type in its own respect, + so the .c file derives 13 new types from G_TYPE_PARAM and + defines over 50 (*2) conversion facilities. + + * glib-gvaluecollector.h: generic varargs handling stubs for + GParamSpecs, private header file (does get installed for + inclusion into user code though). + + * glib-gvalue.[hc]: GValue functionality implementation. + + * glib-gparam.[hc]: basis GParamSpec implementation for + the virtual base type G_TYPE_PARAM. + + * glib-genums.[hc]: enum/flags type implementation, based on + bseenum.[hc]. + + * glib-gtype.[hc]: GLib Type System implementation, heavily + based on BSE's dynamic type system. diff --git a/gobject/Makefile.am b/gobject/Makefile.am new file mode 100644 index 0000000..5f31e2a --- /dev/null +++ b/gobject/Makefile.am @@ -0,0 +1,303 @@ +# GObject - GLib Type, Object, Parameter and Signal Library +# Copyright (C) 1997,98,99,2000 Tim Janik and Red Hat, Inc. +# +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +SUBDIRS = . tests + +if HAVE_THREADS +THREAD_FLAGS=-DG_THREADS_MANDATORY +endif + +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GObject\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_builddir) \ + $(GLIB_DEBUG_FLAGS) \ + $(THREAD_FLAGS) \ + -DG_DISABLE_DEPRECATED \ + -DGOBJECT_COMPILATION \ + -DG_DISABLE_CONST_RETURNS + +gobject.def: gobject.symbols + (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/gobject.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gobject.def + +gobjectalias.h: gobject.symbols + $(PERL) $(srcdir)/makegobjectalias.pl < $(srcdir)/gobject.symbols > gobjectalias.h + +gobjectaliasdef.c: gobject.symbols + $(PERL) $(srcdir)/makegobjectalias.pl -def < $(srcdir)/gobject.symbols > gobjectaliasdef.c + +if OS_LINUX +if HAVE_GNUC_VISIBILITY +TESTS = abicheck.sh pltcheck.sh +endif +endif + +libglib = $(top_builddir)/glib/libglib-2.0.la $(top_builddir)/gthread/libgthread-2.0.la + +# libraries to compile and install +lib_LTLIBRARIES = libgobject-2.0.la + +if OS_WIN32_AND_DLL_COMPILATION +if MS_LIB_AVAILABLE +noinst_DATA = gobject-2.0.lib + +install_ms_lib_cmd = $(INSTALL) gobject-2.0.lib $(DESTDIR)$(libdir) +uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gobject-2.0.lib +endif +endif + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +export_symbols = -export-symbols gobject.def +gobject_def = gobject.def + +gobject_win32_res = gobject-win32-res.o +gobject_win32_res_ldflag = -Wl,$(gobject_win32_res) + +install-def-file: + $(INSTALL) gobject.def $(DESTDIR)$(libdir)/gobject-2.0.def + +uninstall-def-file: + -rm $(DESTDIR)$(libdir)/gobject-2.0.def +else +install-def-file: +uninstall-def-file: + +export_symbols = $(LIBTOOL_EXPORT_OPTIONS) +endif + +# libtool stuff: set version and export symbols for resolving +libgobjectincludedir = $(includedir)/glib-2.0/gobject +libgobject_2_0_la_LDFLAGS = \ + $(gobject_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgobject_2_0_la_LIBADD = $(libglib) + +libgobject_2_0_la_DEPENDENCIES = $(gobject_win32_res) $(gobject_def) + +# +# setup source file variables +# +# GObject library header files for public installation +gobject_public_h_sources = \ + gboxed.h \ + gclosure.h \ + genums.h \ + gobject.h \ + gparam.h \ + gparamspecs.h \ + gsignal.h \ + gsourceclosure.h \ + gtype.h \ + gtypemodule.h \ + gtypeplugin.h \ + gvalue.h \ + gvaluearray.h \ + gvaluecollector.h \ + gvaluetypes.h \ + gobjectnotifyqueue.c \ + gmarshal.h + +# GObject library header files that don't get installed +gobject_private_h_sources = \ + gatomicarray.h \ + gtype-private.h + +# GObject library C sources to build the library from +gobject_c_sources = \ + gatomicarray.c \ + gboxed.c \ + gclosure.c \ + genums.c \ + gobject.c \ + gparam.c \ + gparamspecs.c \ + gsignal.c \ + gsourceclosure.c \ + gtype.c \ + gtypemodule.c \ + gtypeplugin.c \ + gvalue.c \ + gvaluearray.c \ + gvaluetransform.c \ + gvaluetypes.c + +# these sources (also mentioned above) are generated. +BUILT_SOURCES = gmarshal.h gmarshal.c gobjectalias.h gobjectaliasdef.c + +# non-header sources (headers should be specified in the above variables) +# that don't serve as direct make target sources, i.e. they don't have +# their own .lo rules and don't get publically installed +gobject_extra_sources = \ + gmarshal.list \ + gmarshal.strings \ + gobject.symbols + + +# +# setup GObject library sources and their dependancies +# +gobject_target_headers = $(gobject_public_h_sources) +gobject_target_sources = $(gobject_c_sources) +EXTRA_HEADERS = +EXTRA_DIST += \ + $(gobject_private_h_sources) \ + $(gobject_extra_sources) \ + makegobjectalias.pl \ + marshal-genstrings.pl + +# +# rules to generate built sources +# +# setup autogeneration dependancies +gen_sources = xgen-gmh xgen-gmc xgen-gms +CLEANFILES = $(gen_sources) + +# normal autogeneration rules +# all autogenerated files need to be generated in the srcdir, +# so old versions get remade and are not confused with newer +# versions in the build dir. thus a development setup requires +# srcdir to be writable, passing --disable-rebuilds to +# ../configure will supress all autogeneration rules. + +if CROSS_COMPILING + glib_genmarshal=$(GLIB_GENMARSHAL) +else + glib_genmarshal=./glib-genmarshal +endif + +gmarshal.h: stamp-gmarshal.h + @true +stamp-gmarshal.h: @REBUILD@ gmarshal.list glib-genmarshal$(EXEEXT) + $(MAKE) glib-genmarshal$(EXEEXT) + echo "#ifndef __G_MARSHAL_H__" > xgen-gmh \ + && echo "#define __G_MARSHAL_H__" >> xgen-gmh \ + && $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --header >> xgen-gmh \ + && echo "#endif /* __G_MARSHAL_H__ */" >> xgen-gmh \ + && (cmp -s xgen-gmh gmarshal.h 2>/dev/null || cp xgen-gmh gmarshal.h) \ + && rm -f xgen-gmh xgen-gmh~ \ + && echo timestamp > $@ + +gmarshal.c: @REBUILD@ stamp-gmarshal.h + $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --body >> xgen-gmc \ + && cp xgen-gmc gmarshal.c \ + && rm -f xgen-gmc xgen-gmc~ + +gmarshal.strings: @REBUILD@ $(srcdir)/gmarshal.list + grep '^[A-Z]' $(srcdir)/gmarshal.list \ + | sed -e 's/^/"g_cclosure_marshal_/' -e 's/:/__/' -e 's/,/_/g' -e 's/$$/",/' > xgen-gms \ + && cp xgen-gms gmarshal.strings \ + && rm -f xgen-gms xgen-gms~ + +glib-genmarshal.o: gmarshal.strings +gsignal.lo: gmarshal.c + + +# target platform: +libgobjectinclude_HEADERS = $(gobject_target_headers) +libgobject_2_0_la_SOURCES = $(gobject_target_sources) + +# +# programs to compile and install +# +bin_PROGRAMS = gobject-query glib-genmarshal +bin_SCRIPTS = glib-mkenums +noinst_PROGRAMS = testgobject +# source files +gobject_query_SOURCES = gobject-query.c +glib_genmarshal_SOURCES = glib-genmarshal.c +testgobject_SOURCES = testgobject.c +# link programs against libgobject +progs_LDADD = ./libgobject-2.0.la $(libglib) +glib_genmarshal_LDADD = $(libglib) +gobject_query_LDADD = $(progs_LDADD) +testgobject_LDADD = $(progs_LDADD) + +# +# auxillary files +# +EXTRA_DIST += \ + makefile.msc.in \ + gobject.rc.in \ + libgobject-gdb.py.in \ + glib-genmarshal.1 \ + glib-mkenums.in \ + glib-mkenums.1 \ + abicheck.sh \ + pltcheck.sh + +BUILT_EXTRA_DIST = \ + makefile.msc \ + gobject.rc \ + gmarshal.h \ + gmarshal.c \ + stamp-gmarshal.h \ + gobjectalias.h \ + gobjectaliasdef.c + +gobject-win32-res.o: gobject.rc + $(WINDRES) gobject.rc $@ + +gobject-2.0.lib: libgobject-2.0.la gobject.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgobject-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gobject.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/gobject.vcproj + 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 + +../build/win32/vs9/gobject.vcproj: $(top_srcdir)/build/win32/vs9/gobject.vcprojin + for F in $(libgobject_2_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libgobject.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/gobject.vcprojin >$@ + +install-data-local: install-ms-lib install-def-file + +uninstall-local: uninstall-ms-lib uninstall-def-file uninstall-gdb + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + rm -f libgobject-gdb.py; \ + fi + +# install gdb scripts +gdbdir = $(datadir)/glib-2.0/gdb +dist_gdb_SCRIPTS = gobject.py + +libgobject-gdb.py: libgobject-gdb.py.in + sed -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libgobject-gdb.py.in > libgobject-gdb.py + +uninstall-gdb: + -rm -r $(DESTDIR)$(datadir)/gdb + +install-data-hook: libgobject-gdb.py + mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR) + $(INSTALL) libgobject-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION)-gdb.py +if HAVE_GLIB_RUNTIME_LIBDIR + mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + rm -f $(DESTDIR)$(libdir)/libgobject-2.0.so + ln -s $(GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgobject-2.0.so +endif diff --git a/gobject/Makefile.in b/gobject/Makefile.in new file mode 100644 index 0000000..fc32104 --- /dev/null +++ b/gobject/Makefile.in @@ -0,0 +1,1428 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + + + + +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@ +DIST_COMMON = $(dist_gdb_SCRIPTS) $(libgobjectinclude_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/glib-mkenums.in $(srcdir)/gobject.rc.in \ + $(srcdir)/makefile.msc.in $(top_srcdir)/Makefile.decl \ + ChangeLog +bin_PROGRAMS = gobject-query$(EXEEXT) glib-genmarshal$(EXEEXT) +noinst_PROGRAMS = testgobject$(EXEEXT) +subdir = gobject +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = glib-mkenums makefile.msc gobject.rc +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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gdbdir)" \ + "$(DESTDIR)$(libgobjectincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__objects_1 = gatomicarray.lo gboxed.lo gclosure.lo genums.lo \ + gobject.lo gparam.lo gparamspecs.lo gsignal.lo \ + gsourceclosure.lo gtype.lo gtypemodule.lo gtypeplugin.lo \ + gvalue.lo gvaluearray.lo gvaluetransform.lo gvaluetypes.lo +am__objects_2 = $(am__objects_1) +am_libgobject_2_0_la_OBJECTS = $(am__objects_2) +libgobject_2_0_la_OBJECTS = $(am_libgobject_2_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgobject_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libgobject_2_0_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am_glib_genmarshal_OBJECTS = glib-genmarshal.$(OBJEXT) +glib_genmarshal_OBJECTS = $(am_glib_genmarshal_OBJECTS) +glib_genmarshal_DEPENDENCIES = $(libglib) +am_gobject_query_OBJECTS = gobject-query.$(OBJEXT) +gobject_query_OBJECTS = $(am_gobject_query_OBJECTS) +gobject_query_DEPENDENCIES = $(progs_LDADD) +am_testgobject_OBJECTS = testgobject.$(OBJEXT) +testgobject_OBJECTS = $(am_testgobject_OBJECTS) +testgobject_DEPENDENCIES = $(progs_LDADD) +SCRIPTS = $(bin_SCRIPTS) $(dist_gdb_SCRIPTS) +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgobject_2_0_la_SOURCES) $(glib_genmarshal_SOURCES) \ + $(gobject_query_SOURCES) $(testgobject_SOURCES) +DIST_SOURCES = $(libgobject_2_0_la_SOURCES) $(glib_genmarshal_SOURCES) \ + $(gobject_query_SOURCES) $(testgobject_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 +DATA = $(noinst_DATA) +HEADERS = $(libgobjectinclude_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 +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending + +# +# auxillary files +# +EXTRA_DIST = $(gobject_private_h_sources) $(gobject_extra_sources) \ + makegobjectalias.pl marshal-genstrings.pl makefile.msc.in \ + gobject.rc.in libgobject-gdb.py.in glib-genmarshal.1 \ + glib-mkenums.in glib-mkenums.1 abicheck.sh pltcheck.sh +TEST_PROGS = + +# GObject - GLib Type, Object, Parameter and Signal Library +# Copyright (C) 1997,98,99,2000 Tim Janik and Red Hat, Inc. +# +SUBDIRS = . tests +@HAVE_THREADS_TRUE@THREAD_FLAGS = -DG_THREADS_MANDATORY +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GObject\" \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_builddir) \ + $(GLIB_DEBUG_FLAGS) \ + $(THREAD_FLAGS) \ + -DG_DISABLE_DEPRECATED \ + -DGOBJECT_COMPILATION \ + -DG_DISABLE_CONST_RETURNS + +@HAVE_GNUC_VISIBILITY_TRUE@@OS_LINUX_TRUE@TESTS = abicheck.sh pltcheck.sh +libglib = $(top_builddir)/glib/libglib-2.0.la $(top_builddir)/gthread/libgthread-2.0.la + +# libraries to compile and install +lib_LTLIBRARIES = libgobject-2.0.la +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@noinst_DATA = gobject-2.0.lib +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@install_ms_lib_cmd = $(INSTALL) gobject-2.0.lib $(DESTDIR)$(libdir) +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gobject-2.0.lib +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +@OS_WIN32_AND_DLL_COMPILATION_FALSE@export_symbols = $(LIBTOOL_EXPORT_OPTIONS) +@OS_WIN32_AND_DLL_COMPILATION_TRUE@export_symbols = -export-symbols gobject.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gobject_def = gobject.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gobject_win32_res = gobject-win32-res.o +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gobject_win32_res_ldflag = -Wl,$(gobject_win32_res) + +# libtool stuff: set version and export symbols for resolving +libgobjectincludedir = $(includedir)/glib-2.0/gobject +libgobject_2_0_la_LDFLAGS = \ + $(gobject_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgobject_2_0_la_LIBADD = $(libglib) +libgobject_2_0_la_DEPENDENCIES = $(gobject_win32_res) $(gobject_def) + +# +# setup source file variables +# +# GObject library header files for public installation +gobject_public_h_sources = \ + gboxed.h \ + gclosure.h \ + genums.h \ + gobject.h \ + gparam.h \ + gparamspecs.h \ + gsignal.h \ + gsourceclosure.h \ + gtype.h \ + gtypemodule.h \ + gtypeplugin.h \ + gvalue.h \ + gvaluearray.h \ + gvaluecollector.h \ + gvaluetypes.h \ + gobjectnotifyqueue.c \ + gmarshal.h + + +# GObject library header files that don't get installed +gobject_private_h_sources = \ + gatomicarray.h \ + gtype-private.h + + +# GObject library C sources to build the library from +gobject_c_sources = \ + gatomicarray.c \ + gboxed.c \ + gclosure.c \ + genums.c \ + gobject.c \ + gparam.c \ + gparamspecs.c \ + gsignal.c \ + gsourceclosure.c \ + gtype.c \ + gtypemodule.c \ + gtypeplugin.c \ + gvalue.c \ + gvaluearray.c \ + gvaluetransform.c \ + gvaluetypes.c + + +# these sources (also mentioned above) are generated. +BUILT_SOURCES = gmarshal.h gmarshal.c gobjectalias.h gobjectaliasdef.c + +# non-header sources (headers should be specified in the above variables) +# that don't serve as direct make target sources, i.e. they don't have +# their own .lo rules and don't get publically installed +gobject_extra_sources = \ + gmarshal.list \ + gmarshal.strings \ + gobject.symbols + + +# +# setup GObject library sources and their dependancies +# +gobject_target_headers = $(gobject_public_h_sources) +gobject_target_sources = $(gobject_c_sources) +EXTRA_HEADERS = + +# +# rules to generate built sources +# +# setup autogeneration dependancies +gen_sources = xgen-gmh xgen-gmc xgen-gms +CLEANFILES = $(gen_sources) +@CROSS_COMPILING_FALSE@glib_genmarshal = ./glib-genmarshal + +# normal autogeneration rules +# all autogenerated files need to be generated in the srcdir, +# so old versions get remade and are not confused with newer +# versions in the build dir. thus a development setup requires +# srcdir to be writable, passing --disable-rebuilds to +# ../configure will supress all autogeneration rules. +@CROSS_COMPILING_TRUE@glib_genmarshal = $(GLIB_GENMARSHAL) + +# target platform: +libgobjectinclude_HEADERS = $(gobject_target_headers) +libgobject_2_0_la_SOURCES = $(gobject_target_sources) +bin_SCRIPTS = glib-mkenums +# source files +gobject_query_SOURCES = gobject-query.c +glib_genmarshal_SOURCES = glib-genmarshal.c +testgobject_SOURCES = testgobject.c +# link programs against libgobject +progs_LDADD = ./libgobject-2.0.la $(libglib) +glib_genmarshal_LDADD = $(libglib) +gobject_query_LDADD = $(progs_LDADD) +testgobject_LDADD = $(progs_LDADD) +BUILT_EXTRA_DIST = \ + makefile.msc \ + gobject.rc \ + gmarshal.h \ + gmarshal.c \ + stamp-gmarshal.h \ + gobjectalias.h \ + gobjectaliasdef.c + + +# install gdb scripts +gdbdir = $(datadir)/glib-2.0/gdb +dist_gdb_SCRIPTS = gobject.py +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gobject/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gobject/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): +glib-mkenums: $(top_builddir)/config.status $(srcdir)/glib-mkenums.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +makefile.msc: $(top_builddir)/config.status $(srcdir)/makefile.msc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +gobject.rc: $(top_builddir)/config.status $(srcdir)/gobject.rc.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 +libgobject-2.0.la: $(libgobject_2_0_la_OBJECTS) $(libgobject_2_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgobject_2_0_la_LINK) -rpath $(libdir) $(libgobject_2_0_la_OBJECTS) $(libgobject_2_0_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_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 + +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 +glib-genmarshal$(EXEEXT): $(glib_genmarshal_OBJECTS) $(glib_genmarshal_DEPENDENCIES) + @rm -f glib-genmarshal$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(glib_genmarshal_OBJECTS) $(glib_genmarshal_LDADD) $(LIBS) +gobject-query$(EXEEXT): $(gobject_query_OBJECTS) $(gobject_query_DEPENDENCIES) + @rm -f gobject-query$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gobject_query_OBJECTS) $(gobject_query_LDADD) $(LIBS) +testgobject$(EXEEXT): $(testgobject_OBJECTS) $(testgobject_DEPENDENCIES) + @rm -f testgobject$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testgobject_OBJECTS) $(testgobject_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files +install-dist_gdbSCRIPTS: $(dist_gdb_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(gdbdir)" || $(MKDIR_P) "$(DESTDIR)$(gdbdir)" + @list='$(dist_gdb_SCRIPTS)'; test -n "$(gdbdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(gdbdir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(gdbdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-dist_gdbSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_gdb_SCRIPTS)'; test -n "$(gdbdir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(gdbdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gdbdir)" && rm -f $$files + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gatomicarray.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gboxed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gclosure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genums.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glib-genmarshal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gobject-query.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gobject.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gparam.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gparamspecs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsignal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsourceclosure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtypemodule.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtypeplugin.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvalue.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvaluearray.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvaluetransform.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvaluetypes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testgobject.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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-libgobjectincludeHEADERS: $(libgobjectinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(libgobjectincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libgobjectincludedir)" + @list='$(libgobjectinclude_HEADERS)'; test -n "$(libgobjectincludedir)" || 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)$(libgobjectincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgobjectincludedir)" || exit $$?; \ + done + +uninstall-libgobjectincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libgobjectinclude_HEADERS)'; test -n "$(libgobjectincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libgobjectincludedir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libgobjectincludedir)" && rm -f $$files + +# 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 + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ + $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gdbdir)" "$(DESTDIR)$(libgobjectincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-recursive + +clean-am: clean-binPROGRAMS 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-local distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-data-local install-dist_gdbSCRIPTS \ + install-libgobjectincludeHEADERS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS \ + 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-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-dist_gdbSCRIPTS uninstall-libLTLIBRARIES \ + uninstall-libgobjectincludeHEADERS uninstall-local + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ + check-am ctags-recursive install install-am install-data-am \ + install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-TESTS check-am check-local clean \ + clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS ctags ctags-recursive \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-local distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-binSCRIPTS install-data \ + install-data-am install-data-hook install-data-local \ + install-dist_gdbSCRIPTS install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-libgobjectincludeHEADERS 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-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-dist_gdbSCRIPTS uninstall-libLTLIBRARIES \ + uninstall-libgobjectincludeHEADERS uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +gobject.def: gobject.symbols + (echo -e EXPORTS; $(CPP) -P -DINCLUDE_VARIABLES -DINCLUDE_INTERNAL_SYMBOLS -DG_OS_WIN32 -DALL_FILES - <$(srcdir)/gobject.symbols | sed -e '/^$$/d' -e 's/^/ /' -e 's/G_GNUC_[^ ]*//g' | sort) > gobject.def + +gobjectalias.h: gobject.symbols + $(PERL) $(srcdir)/makegobjectalias.pl < $(srcdir)/gobject.symbols > gobjectalias.h + +gobjectaliasdef.c: gobject.symbols + $(PERL) $(srcdir)/makegobjectalias.pl -def < $(srcdir)/gobject.symbols > gobjectaliasdef.c + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ $(INSTALL) gobject.def $(DESTDIR)$(libdir)/gobject-2.0.def + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ -rm $(DESTDIR)$(libdir)/gobject-2.0.def +@OS_WIN32_AND_DLL_COMPILATION_FALSE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_FALSE@uninstall-def-file: + +gmarshal.h: stamp-gmarshal.h + @true +stamp-gmarshal.h: @REBUILD@ gmarshal.list glib-genmarshal$(EXEEXT) + $(MAKE) glib-genmarshal$(EXEEXT) + echo "#ifndef __G_MARSHAL_H__" > xgen-gmh \ + && echo "#define __G_MARSHAL_H__" >> xgen-gmh \ + && $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --header >> xgen-gmh \ + && echo "#endif /* __G_MARSHAL_H__ */" >> xgen-gmh \ + && (cmp -s xgen-gmh gmarshal.h 2>/dev/null || cp xgen-gmh gmarshal.h) \ + && rm -f xgen-gmh xgen-gmh~ \ + && echo timestamp > $@ + +gmarshal.c: @REBUILD@ stamp-gmarshal.h + $(glib_genmarshal) --nostdinc --prefix=g_cclosure_marshal $(srcdir)/gmarshal.list --body >> xgen-gmc \ + && cp xgen-gmc gmarshal.c \ + && rm -f xgen-gmc xgen-gmc~ + +gmarshal.strings: @REBUILD@ $(srcdir)/gmarshal.list + grep '^[A-Z]' $(srcdir)/gmarshal.list \ + | sed -e 's/^/"g_cclosure_marshal_/' -e 's/:/__/' -e 's/,/_/g' -e 's/$$/",/' > xgen-gms \ + && cp xgen-gms gmarshal.strings \ + && rm -f xgen-gms xgen-gms~ + +glib-genmarshal.o: gmarshal.strings +gsignal.lo: gmarshal.c + +gobject-win32-res.o: gobject.rc + $(WINDRES) gobject.rc $@ + +gobject-2.0.lib: libgobject-2.0.la gobject.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgobject-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:gobject.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/gobject.vcproj + 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 + +../build/win32/vs9/gobject.vcproj: $(top_srcdir)/build/win32/vs9/gobject.vcprojin + for F in $(libgobject_2_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libgobject.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/gobject.vcprojin >$@ + +install-data-local: install-ms-lib install-def-file + +uninstall-local: uninstall-ms-lib uninstall-def-file uninstall-gdb + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + rm -f libgobject-gdb.py; \ + fi + +libgobject-gdb.py: libgobject-gdb.py.in + sed -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libgobject-gdb.py.in > libgobject-gdb.py + +uninstall-gdb: + -rm -r $(DESTDIR)$(datadir)/gdb + +install-data-hook: libgobject-gdb.py + mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR) + $(INSTALL) libgobject-gdb.py $(DESTDIR)$(datadir)/gdb/auto-load/$(ABS_GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION)-gdb.py +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ rm -f $(DESTDIR)$(libdir)/libgobject-2.0.so +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ ln -s $(GLIB_RUNTIME_LIBDIR)/libgobject-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgobject-2.0.so + +# 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/gobject/abicheck.sh b/gobject/abicheck.sh new file mode 100755 index 0000000..74391cd --- /dev/null +++ b/gobject/abicheck.sh @@ -0,0 +1,13 @@ +#! /bin/sh + +egrep '^#([^i]|if).*[^\]$' "${top_builddir:-..}/glibconfig.h" > glibconfig.cpp + +INCLUDES="-include ${top_builddir:-..}/config.h" +INCLUDES="$INCLUDES -include glibconfig.cpp" + +cpp -DINCLUDE_VARIABLES -P $INCLUDES -DALL_FILES ${srcdir:-.}/gobject.symbols | sed -e '/^$/d' -e 's/ G_GNUC.*$//' -e 's/ PRIVATE$//' | sort > expected-abi +rm glibconfig.cpp + +nm -D -g --defined-only .libs/libgobject-2.0.so | cut -d ' ' -f 3 | sort > actual-abi + +diff -u expected-abi actual-abi && rm expected-abi actual-abi diff --git a/gobject/gatomicarray.c b/gobject/gatomicarray.c new file mode 100644 index 0000000..2c2a09c --- /dev/null +++ b/gobject/gatomicarray.c @@ -0,0 +1,169 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2009 Benjamin Otte + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "gatomicarray.h" + +#include + +/* A GAtomicArray is a growable, mutable array of data + * generally of the form of a header of a specific size and + * then a array of items of a fixed size. + * + * It is possible to do lock-less read transactions from the + * array without any protection against other reads or writes, + * but such read operation must be aware that the data in the + * atomic array can change at any time during the transaction, + * and only at the end can we verify if the transaction succeeded + * or not. Thus the reading transaction cannot for instance + * dereference a pointer in the array inside the transaction. + * + * The size of an array however cannot change during a read + * transaction. + * + * Writes to the array is done in a copy-update style, but there + * is no real protection against multiple writers overwriting each + * others updates, so writes must be protected by an external lock. + */ + +G_LOCK_DEFINE_STATIC (array); + +typedef struct _FreeListNode FreeListNode; +struct _FreeListNode { + FreeListNode *next; +}; + +/* This is really a list of array memory blocks, using the + * first item as the next pointer to chain them together. + * Protected by array lock */ +static FreeListNode *freelist = NULL; + +/* must hold array lock */ +static gpointer +freelist_alloc (gsize size, gboolean reuse) +{ + gpointer mem; + FreeListNode *free, **prev; + gsize real_size; + + if (reuse) + { + for (free = freelist, prev = &freelist; free != NULL; prev = &free->next, free = free->next) + { + if (G_ATOMIC_ARRAY_DATA_SIZE (free) == size) + { + *prev = free->next; + return (gpointer)free; + } + } + } + + real_size = sizeof (gsize) + MAX (size, sizeof (FreeListNode)); + mem = g_slice_alloc (real_size); + mem = ((char *) mem) + sizeof (gsize); + G_ATOMIC_ARRAY_DATA_SIZE (mem) = size; + return mem; +} + +/* must hold array lock */ +static void +freelist_free (gpointer mem) +{ + FreeListNode *free; + + free = mem; + free->next = freelist; + freelist = free; +} + +void +_g_atomic_array_init (GAtomicArray *array) +{ + array->data = NULL; +} + +/* Get a copy of the data (if non-NULL) that + * can be changed and then re-applied with + * g_atomic_array_update(). + * + * If additional_element_size is > 0 then + * then the new memory chunk is that much + * larger, or there were no data we return + * a chunk of header_size + additional_element_size. + * This means you can use this to grow the + * array part and it handles the first element + * being added automatically. + */ +gpointer +_g_atomic_array_copy (GAtomicArray *array, + gsize header_size, + gsize additional_element_size) +{ + guint8 *new, *old; + gsize old_size, new_size; + + /* We don't support shrinking arrays, as if + we then re-grow we may reuse an old pointer + value and confuse the transaction check. */ + g_assert (additional_element_size >= 0); + + G_LOCK (array); + old = g_atomic_pointer_get (&array->data); + if (old) + { + old_size = G_ATOMIC_ARRAY_DATA_SIZE (old); + new_size = old_size + additional_element_size; + /* Don't reuse if copying to same size, as this may end + up reusing the same pointer for the same array thus + confusing the transaction check */ + new = freelist_alloc (new_size, additional_element_size != 0); + memcpy (new, old, old_size); + } + else if (additional_element_size != 0) + { + new_size = header_size + additional_element_size; + new = freelist_alloc (new_size, TRUE); + } + else + new = NULL; + G_UNLOCK (array); + return new; +} + +/* Replace the data in the array with the new data, + * freeing the old data (for reuse). The new data may + * not be smaller than the current data. + */ +void +_g_atomic_array_update (GAtomicArray *array, + gpointer new_data) +{ + guint8 *old; + + G_LOCK (array); + old = g_atomic_pointer_get (&array->data); + + g_assert (old == NULL || G_ATOMIC_ARRAY_DATA_SIZE (old) <= G_ATOMIC_ARRAY_DATA_SIZE (new_data)); + + g_atomic_pointer_set (&array->data, new_data); + if (old) + freelist_free (old); + G_UNLOCK (array); +} diff --git a/gobject/gatomicarray.h b/gobject/gatomicarray.h new file mode 100644 index 0000000..4d4b3d5 --- /dev/null +++ b/gobject/gatomicarray.h @@ -0,0 +1,60 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2009 Benjamin Otte + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ATOMIC_ARRAY_H__ +#define __G_ATOMIC_ARRAY_H__ + +#include + +G_BEGIN_DECLS + +#define G_ATOMIC_ARRAY_DATA_SIZE(mem) (*((gsize *) (mem) - 1)) + +typedef struct _GAtomicArray GAtomicArray; +struct _GAtomicArray { + volatile gpointer data; /* elements - atomic */ +}; + +void _g_atomic_array_init (GAtomicArray *array); +gpointer _g_atomic_array_copy (GAtomicArray *array, + gsize header_size, + gsize additional_element_size); +void _g_atomic_array_update (GAtomicArray *array, + gpointer new_data); + +#define G_ATOMIC_ARRAY_GET_LOCKED(_array, _type) ((_type *)((_array)->data)) + +#define G_ATOMIC_ARRAY_DO_TRANSACTION(_array, _type, _C_) G_STMT_START { \ + volatile gpointer *_datap = &(_array)->data; \ + _type *transaction_data, *__check; \ + \ + __check = g_atomic_pointer_get (_datap); \ + do { \ + transaction_data = __check; \ + {_C_;} \ + __check = g_atomic_pointer_get (_datap); \ + } while (transaction_data != __check); \ + } G_STMT_END + +G_END_DECLS + +#endif /* __G_ATOMIC_ARRAY_H__ */ diff --git a/gobject/gboxed.c b/gobject/gboxed.c new file mode 100644 index 0000000..8b515ad --- /dev/null +++ b/gobject/gboxed.c @@ -0,0 +1,659 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000-2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "gboxed.h" +#include "gtype-private.h" +#include "gvalue.h" +#include "gvaluearray.h" +#include "gclosure.h" +#include "gvaluecollector.h" +#include "gobjectalias.h" + + +/** + * SECTION:gboxed + * @short_description: A mechanism to wrap opaque C structures registered + * by the type system + * @see_also: #GParamSpecBoxed, g_param_spec_boxed() + * @title: Boxed Types + * + * GBoxed is a generic wrapper mechanism for arbitrary C structures. The only + * thing the type system needs to know about the structures is how to copy and + * free them, beyond that they are treated as opaque chunks of memory. + * + * Boxed types are useful for simple value-holder structures like rectangles or + * points. They can also be used for wrapping structures defined in non-GObject + * based libraries. + */ + +static inline void /* keep this function in sync with gvalue.c */ +value_meminit (GValue *value, + GType value_type) +{ + value->g_type = value_type; + memset (value->data, 0, sizeof (value->data)); +} + +static gpointer +value_copy (gpointer boxed) +{ + const GValue *src_value = boxed; + GValue *dest_value = g_new0 (GValue, 1); + + if (G_VALUE_TYPE (src_value)) + { + g_value_init (dest_value, G_VALUE_TYPE (src_value)); + g_value_copy (src_value, dest_value); + } + return dest_value; +} + +static void +value_free (gpointer boxed) +{ + GValue *value = boxed; + + if (G_VALUE_TYPE (value)) + g_value_unset (value); + g_free (value); +} + +void +g_boxed_type_init (void) +{ + static const GTypeInfo info = { + 0, /* class_size */ + NULL, /* base_init */ + NULL, /* base_destroy */ + NULL, /* class_init */ + NULL, /* class_destroy */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + NULL, /* value_table */ + }; + const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, }; + GType type; + + /* G_TYPE_BOXED + */ + type = g_type_register_fundamental (G_TYPE_BOXED, g_intern_static_string ("GBoxed"), &info, &finfo, + G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT); + g_assert (type == G_TYPE_BOXED); +} + +GType +g_closure_get_type (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GClosure"), + (GBoxedCopyFunc) g_closure_ref, + (GBoxedFreeFunc) g_closure_unref); + return type_id; +} + +GType +g_value_get_type (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GValue"), + value_copy, + value_free); + return type_id; +} + +GType +g_value_array_get_type (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GValueArray"), + (GBoxedCopyFunc) g_value_array_copy, + (GBoxedFreeFunc) g_value_array_free); + return type_id; +} + +static gpointer +gdate_copy (gpointer boxed) +{ + const GDate *date = (const GDate*) boxed; + + return g_date_new_julian (g_date_get_julian (date)); +} + +GType +g_date_get_type (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GDate"), + (GBoxedCopyFunc) gdate_copy, + (GBoxedFreeFunc) g_date_free); + return type_id; +} + +GType +g_strv_get_type (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GStrv"), + (GBoxedCopyFunc) g_strdupv, + (GBoxedFreeFunc) g_strfreev); + return type_id; +} + +static gpointer +gstring_copy (gpointer boxed) +{ + const GString *src_gstring = boxed; + + return g_string_new_len (src_gstring->str, src_gstring->len); +} + +static void +gstring_free (gpointer boxed) +{ + GString *gstring = boxed; + + g_string_free (gstring, TRUE); +} + +GType +g_gstring_get_type (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GString"), + /* the naming is a bit odd, but GString is obviously not G_TYPE_STRING */ + gstring_copy, + gstring_free); + return type_id; +} + +static gpointer +hash_table_copy (gpointer boxed) +{ + GHashTable *hash_table = boxed; + return g_hash_table_ref (hash_table); +} + +static void +hash_table_free (gpointer boxed) +{ + GHashTable *hash_table = boxed; + g_hash_table_unref (hash_table); +} + +GType +g_hash_table_get_type (void) +{ + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GHashTable"), + hash_table_copy, hash_table_free); + return type_id; +} + +GType +g_regex_get_type (void) +{ + static GType type_id = 0; + +#ifdef ENABLE_REGEX + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GRegex"), + (GBoxedCopyFunc) g_regex_ref, + (GBoxedFreeFunc) g_regex_unref); +#endif + + return type_id; +} + +GType +g_array_get_type (void) +{ + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GArray"), + (GBoxedCopyFunc) g_array_ref, + (GBoxedFreeFunc) g_array_unref); + return type_id; +} + +GType +g_ptr_array_get_type (void) +{ + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GPtrArray"), + (GBoxedCopyFunc) g_ptr_array_ref, + (GBoxedFreeFunc) g_ptr_array_unref); + return type_id; +} + +GType +g_byte_array_get_type (void) +{ + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GByteArray"), + (GBoxedCopyFunc) g_byte_array_ref, + (GBoxedFreeFunc) g_byte_array_unref); + + return type_id; +} + +GType +g_variant_type_get_gtype (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GVariantType"), + (GBoxedCopyFunc) g_variant_type_copy, + (GBoxedFreeFunc) g_variant_type_free); + + return type_id; +} + +GType +g_variant_get_gtype (void) +{ + static GType type_id = 0; + + if (!type_id) + type_id = g_boxed_type_register_static (g_intern_static_string ("GVariant"), + (GBoxedCopyFunc) g_variant_ref, + (GBoxedFreeFunc) g_variant_unref); + + return type_id; +} + +static void +boxed_proxy_value_init (GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static void +boxed_proxy_value_free (GValue *value) +{ + if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) + _g_type_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer); +} + +static void +boxed_proxy_value_copy (const GValue *src_value, + GValue *dest_value) +{ + if (src_value->data[0].v_pointer) + dest_value->data[0].v_pointer = _g_type_boxed_copy (G_VALUE_TYPE (src_value), src_value->data[0].v_pointer); + else + dest_value->data[0].v_pointer = src_value->data[0].v_pointer; +} + +static gpointer +boxed_proxy_value_peek_pointer (const GValue *value) +{ + return value->data[0].v_pointer; +} + +static gchar* +boxed_proxy_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + if (!collect_values[0].v_pointer) + value->data[0].v_pointer = NULL; + else + { + if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + { + value->data[0].v_pointer = collect_values[0].v_pointer; + value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; + } + else + value->data[0].v_pointer = _g_type_boxed_copy (G_VALUE_TYPE (value), collect_values[0].v_pointer); + } + + return NULL; +} + +static gchar* +boxed_proxy_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gpointer *boxed_p = collect_values[0].v_pointer; + + if (!boxed_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + if (!value->data[0].v_pointer) + *boxed_p = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + *boxed_p = value->data[0].v_pointer; + else + *boxed_p = _g_type_boxed_copy (G_VALUE_TYPE (value), value->data[0].v_pointer); + + return NULL; +} + +/** + * g_boxed_type_register_static: + * @name: Name of the new boxed type. + * @boxed_copy: Boxed structure copy function. + * @boxed_free: Boxed structure free function. + * + * This function creates a new %G_TYPE_BOXED derived type id for a new + * boxed type with name @name. Boxed type handling functions have to be + * provided to copy and free opaque boxed structures of this type. + * + * Returns: New %G_TYPE_BOXED derived type id for @name. + */ +GType +g_boxed_type_register_static (const gchar *name, + GBoxedCopyFunc boxed_copy, + GBoxedFreeFunc boxed_free) +{ + static const GTypeValueTable vtable = { + boxed_proxy_value_init, + boxed_proxy_value_free, + boxed_proxy_value_copy, + boxed_proxy_value_peek_pointer, + "p", + boxed_proxy_collect_value, + "p", + boxed_proxy_lcopy_value, + }; + GTypeInfo type_info = { + 0, /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + &vtable, /* value_table */ + }; + GType type; + + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (boxed_copy != NULL, 0); + g_return_val_if_fail (boxed_free != NULL, 0); + g_return_val_if_fail (g_type_from_name (name) == 0, 0); + + type = g_type_register_static (G_TYPE_BOXED, name, &type_info, 0); + + /* install proxy functions upon successfull registration */ + if (type) + _g_type_boxed_init (type, boxed_copy, boxed_free); + + return type; +} + +/** + * g_boxed_copy: + * @boxed_type: The type of @src_boxed. + * @src_boxed: The boxed structure to be copied. + * + * Provide a copy of a boxed structure @src_boxed which is of type @boxed_type. + * + * Returns: The newly created copy of the boxed structure. + */ +gpointer +g_boxed_copy (GType boxed_type, + gconstpointer src_boxed) +{ + GTypeValueTable *value_table; + gpointer dest_boxed; + + g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL); + g_return_val_if_fail (G_TYPE_IS_ABSTRACT (boxed_type) == FALSE, NULL); + g_return_val_if_fail (src_boxed != NULL, NULL); + + value_table = g_type_value_table_peek (boxed_type); + if (!value_table) + g_return_val_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type), NULL); + + /* check if our proxying implementation is used, we can short-cut here */ + if (value_table->value_copy == boxed_proxy_value_copy) + dest_boxed = _g_type_boxed_copy (boxed_type, (gpointer) src_boxed); + else + { + GValue src_value, dest_value; + + /* we heavily rely on third-party boxed type value vtable + * implementations to follow normal boxed value storage + * (data[0].v_pointer is the boxed struct, and + * data[1].v_uint holds the G_VALUE_NOCOPY_CONTENTS flag, + * rest zero). + * but then, we can expect that since we layed out the + * g_boxed_*() API. + * data[1].v_uint&G_VALUE_NOCOPY_CONTENTS shouldn't be set + * after a copy. + */ + /* equiv. to g_value_set_static_boxed() */ + value_meminit (&src_value, boxed_type); + src_value.data[0].v_pointer = (gpointer) src_boxed; + src_value.data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; + + /* call third-party code copy function, fingers-crossed */ + value_meminit (&dest_value, boxed_type); + value_table->value_copy (&src_value, &dest_value); + + /* double check and grouse if things went wrong */ + if (dest_value.data[1].v_ulong) + g_warning ("the copy_value() implementation of type `%s' seems to make use of reserved GValue fields", + g_type_name (boxed_type)); + + dest_boxed = dest_value.data[0].v_pointer; + } + + return dest_boxed; +} + +/** + * g_boxed_free: + * @boxed_type: The type of @boxed. + * @boxed: The boxed structure to be freed. + * + * Free the boxed structure @boxed which is of type @boxed_type. + */ +void +g_boxed_free (GType boxed_type, + gpointer boxed) +{ + GTypeValueTable *value_table; + + g_return_if_fail (G_TYPE_IS_BOXED (boxed_type)); + g_return_if_fail (G_TYPE_IS_ABSTRACT (boxed_type) == FALSE); + g_return_if_fail (boxed != NULL); + + value_table = g_type_value_table_peek (boxed_type); + if (!value_table) + g_return_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type)); + + /* check if our proxying implementation is used, we can short-cut here */ + if (value_table->value_free == boxed_proxy_value_free) + _g_type_boxed_free (boxed_type, boxed); + else + { + GValue value; + + /* see g_boxed_copy() on why we think we can do this */ + value_meminit (&value, boxed_type); + value.data[0].v_pointer = boxed; + value_table->value_free (&value); + } +} + +/** + * g_value_get_boxed: + * @value: a valid #GValue of %G_TYPE_BOXED derived type + * + * Get the contents of a %G_TYPE_BOXED derived #GValue. + * + * Returns: boxed contents of @value + */ +gpointer +g_value_get_boxed (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL); + g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL); + + return value->data[0].v_pointer; +} + +/** + * g_value_dup_boxed: + * @value: a valid #GValue of %G_TYPE_BOXED derived type + * + * Get the contents of a %G_TYPE_BOXED derived #GValue. Upon getting, + * the boxed value is duplicated and needs to be later freed with + * g_boxed_free(), e.g. like: g_boxed_free (G_VALUE_TYPE (@value), + * return_value); + * + * Returns: boxed contents of @value + */ +gpointer +g_value_dup_boxed (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL); + g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL); + + return value->data[0].v_pointer ? g_boxed_copy (G_VALUE_TYPE (value), value->data[0].v_pointer) : NULL; +} + +static inline void +value_set_boxed_internal (GValue *value, + gconstpointer boxed, + gboolean need_copy, + gboolean need_free) +{ + if (!boxed) + { + /* just resetting to NULL might not be desired, need to + * have value reinitialized also (for values defaulting + * to other default value states than a NULL data pointer), + * g_value_reset() will handle this + */ + g_value_reset (value); + return; + } + + if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) + g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer); + value->data[1].v_uint = need_free ? 0 : G_VALUE_NOCOPY_CONTENTS; + value->data[0].v_pointer = need_copy ? g_boxed_copy (G_VALUE_TYPE (value), boxed) : (gpointer) boxed; +} + +/** + * g_value_set_boxed: + * @value: a valid #GValue of %G_TYPE_BOXED derived type + * @v_boxed: boxed value to be set + * + * Set the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed. + */ +void +g_value_set_boxed (GValue *value, + gconstpointer boxed) +{ + g_return_if_fail (G_VALUE_HOLDS_BOXED (value)); + g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value))); + + value_set_boxed_internal (value, boxed, TRUE, TRUE); +} + +/** + * g_value_set_static_boxed: + * @value: a valid #GValue of %G_TYPE_BOXED derived type + * @v_boxed: static boxed value to be set + * + * Set the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed. + * The boxed value is assumed to be static, and is thus not duplicated + * when setting the #GValue. + */ +void +g_value_set_static_boxed (GValue *value, + gconstpointer boxed) +{ + g_return_if_fail (G_VALUE_HOLDS_BOXED (value)); + g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value))); + + value_set_boxed_internal (value, boxed, FALSE, FALSE); +} + +/** + * g_value_set_boxed_take_ownership: + * @value: a valid #GValue of %G_TYPE_BOXED derived type + * @v_boxed: duplicated unowned boxed value to be set + * + * This is an internal function introduced mainly for C marshallers. + * + * Deprecated: 2.4: Use g_value_take_boxed() instead. + */ +void +g_value_set_boxed_take_ownership (GValue *value, + gconstpointer boxed) +{ + g_value_take_boxed (value, boxed); +} + +/** + * g_value_take_boxed: + * @value: a valid #GValue of %G_TYPE_BOXED derived type + * @v_boxed: duplicated unowned boxed value to be set + * + * Sets the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed + * and takes over the ownership of the callers reference to @v_boxed; + * the caller doesn't have to unref it any more. + * + * Since: 2.4 + */ +void +g_value_take_boxed (GValue *value, + gconstpointer boxed) +{ + g_return_if_fail (G_VALUE_HOLDS_BOXED (value)); + g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value))); + + value_set_boxed_internal (value, boxed, FALSE, TRUE); +} + +#define __G_BOXED_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gboxed.h b/gobject/gboxed.h new file mode 100644 index 0000000..10e293f --- /dev/null +++ b/gobject/gboxed.h @@ -0,0 +1,236 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000-2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_BOXED_H__ +#define __G_BOXED_H__ + +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +#define G_TYPE_IS_BOXED(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_BOXED) +/** + * G_VALUE_HOLDS_BOXED: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values derived from type %G_TYPE_BOXED. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_BOXED(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOXED)) + + +/* --- typedefs --- */ +/** + * GBoxedCopyFunc: + * @boxed: The boxed structure to be copied. + * + * This function is provided by the user and should produce a copy of the passed + * in boxed structure. + * + * Returns: The newly created copy of the boxed structure. + */ +typedef gpointer (*GBoxedCopyFunc) (gpointer boxed); + +/** + * GBoxedFreeFunc: + * @boxed: The boxed structure to be freed. + * + * This function is provided by the user and should free the boxed + * structure passed. + */ +typedef void (*GBoxedFreeFunc) (gpointer boxed); + + +/* --- prototypes --- */ +gpointer g_boxed_copy (GType boxed_type, + gconstpointer src_boxed); +void g_boxed_free (GType boxed_type, + gpointer boxed); +void g_value_set_boxed (GValue *value, + gconstpointer v_boxed); +void g_value_set_static_boxed (GValue *value, + gconstpointer v_boxed); +gpointer g_value_get_boxed (const GValue *value); +gpointer g_value_dup_boxed (const GValue *value); + + +/* --- convenience --- */ +GType g_boxed_type_register_static (const gchar *name, + GBoxedCopyFunc boxed_copy, + GBoxedFreeFunc boxed_free); + + +/* --- GLib boxed types --- */ +/** + * G_TYPE_CLOSURE: + * + * The #GType for #GClosure. + */ +#define G_TYPE_CLOSURE (g_closure_get_type ()) +/** + * G_TYPE_VALUE: + * + * The type ID of the "GValue" type which is a boxed type, + * used to pass around pointers to GValues. + */ +#define G_TYPE_VALUE (g_value_get_type ()) +/** + * G_TYPE_VALUE_ARRAY: + * + * The type ID of the "GValueArray" type which is a boxed type, + * used to pass around pointers to GValueArrays. + */ +#define G_TYPE_VALUE_ARRAY (g_value_array_get_type ()) +/** + * G_TYPE_DATE: + * + * The #GType for #GDate. + */ +#define G_TYPE_DATE (g_date_get_type ()) +/** + * G_TYPE_STRV: + * + * The #GType for a boxed type holding a %NULL-terminated array of strings. + * + * The code fragments in the following example show the use of a property of + * type #G_TYPE_STRV with g_object_class_install_property(), g_object_set() + * and g_object_get(). + * + * |[ + * g_object_class_install_property (object_class, + * PROP_AUTHORS, + * g_param_spec_boxed ("authors", + * _("Authors"), + * _("List of authors"), + * G_TYPE_STRV, + * G_PARAM_READWRITE)); + * + * + * gchar *authors[] = { "Owen", "Tim", NULL }; + * g_object_set (obj, "authors", authors, NULL); + * + * + * gchar *writers[]; + * g_object_get (obj, "authors", &writers, NULL); + * // do something with writers + * g_strfreev (writers); + * ]| + * + * Since: 2.4 + */ +#define G_TYPE_STRV (g_strv_get_type ()) +/** + * G_TYPE_GSTRING: + * + * The #GType for #GString. + */ +#define G_TYPE_GSTRING (g_gstring_get_type ()) +/** + * G_TYPE_HASH_TABLE: + * + * The #GType for a boxed type holding a #GHashTable reference. + * + * Since: 2.10 + */ +#define G_TYPE_HASH_TABLE (g_hash_table_get_type ()) +/** + * G_TYPE_REGEX: + * + * The #GType for a boxed type holding a #GRegex reference. + * + * Since: 2.14 + */ +#define G_TYPE_REGEX (g_regex_get_type ()) +/** + * G_TYPE_ARRAY: + * + * The #GType for a boxed type holding a #GArray reference. + * + * Since: 2.22 + */ +#define G_TYPE_ARRAY (g_array_get_type ()) +/** + * G_TYPE_BYTE_ARRAY: + * + * The #GType for a boxed type holding a #GByteArray reference. + * + * Since: 2.22 + */ +#define G_TYPE_BYTE_ARRAY (g_byte_array_get_type ()) +/** + * G_TYPE_PTR_ARRAY: + * + * The #GType for a boxed type holding a #GPtrArray reference. + * + * Since: 2.22 + */ +#define G_TYPE_PTR_ARRAY (g_ptr_array_get_type ()) +/** + * G_TYPE_VARIANT_TYPE: + * + * The #GType for a boxed type holding a #GVariantType. + * + * Since: 2.24 + */ +#define G_TYPE_VARIANT_TYPE (g_variant_type_get_gtype ()) +/** + * G_TYPE_VARIANT: + * + * The #GType for a boxed type holding a #GVariant reference. + * + * Since: 2.24 + */ +#define G_TYPE_VARIANT (g_variant_get_gtype ()) + + +void g_value_take_boxed (GValue *value, + gconstpointer v_boxed); +#ifndef G_DISABLE_DEPRECATED +void g_value_set_boxed_take_ownership (GValue *value, + gconstpointer v_boxed); +#endif +GType g_closure_get_type (void) G_GNUC_CONST; +GType g_value_get_type (void) G_GNUC_CONST; +GType g_value_array_get_type (void) G_GNUC_CONST; +GType g_date_get_type (void) G_GNUC_CONST; +GType g_strv_get_type (void) G_GNUC_CONST; +GType g_gstring_get_type (void) G_GNUC_CONST; +GType g_hash_table_get_type (void) G_GNUC_CONST; +GType g_array_get_type (void) G_GNUC_CONST; +GType g_byte_array_get_type (void) G_GNUC_CONST; +GType g_ptr_array_get_type (void) G_GNUC_CONST; +GType g_variant_type_get_gtype(void) G_GNUC_CONST; +GType g_variant_get_gtype (void) G_GNUC_CONST; +GType g_regex_get_type (void) G_GNUC_CONST; + +/** + * GStrv: + * + * A C representable type name for #G_TYPE_STRV. + */ +typedef gchar** GStrv; + +G_END_DECLS + +#endif /* __G_BOXED_H__ */ diff --git a/gobject/gclosure.c b/gobject/gclosure.c new file mode 100644 index 0000000..eaa7e09 --- /dev/null +++ b/gobject/gclosure.c @@ -0,0 +1,1226 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000-2001 Red Hat, Inc. + * Copyright (C) 2005 Imendio AB + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe with regards to reference counting. + */ + +#include "config.h" + +#include + +#include "gclosure.h" +#include "gvalue.h" +#include "gobjectalias.h" + + +/** + * SECTION:gclosure + * @short_description: Functions as first-class objects + * @title: Closures + * + * A #GClosure represents a callback supplied by the programmer. It + * will generally comprise a function of some kind and a marshaller + * used to call it. It is the reponsibility of the marshaller to + * convert the arguments for the invocation from #GValues into + * a suitable form, perform the callback on the converted arguments, + * and transform the return value back into a #GValue. + * + * In the case of C programs, a closure usually just holds a pointer + * to a function and maybe a data argument, and the marshaller + * converts between #GValue and native C types. The GObject + * library provides the #GCClosure type for this purpose. Bindings for + * other languages need marshallers which convert between #GValues and suitable representations in the runtime of the language in + * order to use functions written in that languages as callbacks. + * + * Within GObject, closures play an important role in the + * implementation of signals. When a signal is registered, the + * @c_marshaller argument to g_signal_new() specifies the default C + * marshaller for any closure which is connected to this + * signal. GObject provides a number of C marshallers for this + * purpose, see the g_cclosure_marshal_*() functions. Additional C + * marshallers can be generated with the glib-genmarshal utility. Closures + * can be explicitly connected to signals with + * g_signal_connect_closure(), but it usually more convenient to let + * GObject create a closure automatically by using one of the + * g_signal_connect_*() functions which take a callback function/user + * data pair. + * + * Using closures has a number of important advantages over a simple + * callback function/data pointer combination: + * + * + * Closures allow the callee to get the types of the callback parameters, + * which means that language bindings don't have to write individual glue + * for each callback type. + * + * + * The reference counting of #GClosure makes it easy to handle reentrancy + * right; if a callback is removed while it is being invoked, the closure + * and its parameters won't be freed until the invocation finishes. + * + * + * g_closure_invalidate() and invalidation notifiers allow callbacks to be + * automatically removed when the objects they point to go away. + * + * + */ + + +#define CLOSURE_MAX_REF_COUNT ((1 << 15) - 1) +#define CLOSURE_MAX_N_GUARDS ((1 << 1) - 1) +#define CLOSURE_MAX_N_FNOTIFIERS ((1 << 2) - 1) +#define CLOSURE_MAX_N_INOTIFIERS ((1 << 8) - 1) +#define CLOSURE_N_MFUNCS(cl) ((cl)->meta_marshal + \ + ((cl)->n_guards << 1L)) +/* same as G_CLOSURE_N_NOTIFIERS() (keep in sync) */ +#define CLOSURE_N_NOTIFIERS(cl) (CLOSURE_N_MFUNCS (cl) + \ + (cl)->n_fnotifiers + \ + (cl)->n_inotifiers) + +typedef union { + GClosure closure; + volatile gint vint; +} ClosureInt; + +#define CHANGE_FIELD(_closure, _field, _OP, _value, _must_set, _SET_OLD, _SET_NEW) \ +G_STMT_START { \ + ClosureInt *cunion = (ClosureInt*) _closure; \ + gint new_int, old_int, success; \ + do \ + { \ + ClosureInt tmp; \ + tmp.vint = old_int = cunion->vint; \ + _SET_OLD tmp.closure._field; \ + tmp.closure._field _OP _value; \ + _SET_NEW tmp.closure._field; \ + new_int = tmp.vint; \ + success = g_atomic_int_compare_and_exchange (&cunion->vint, old_int, new_int); \ + } \ + while (!success && _must_set); \ +} G_STMT_END + +#define SWAP(_closure, _field, _value, _oldv) CHANGE_FIELD (_closure, _field, =, _value, TRUE, *(_oldv) =, (void) ) +#define SET(_closure, _field, _value) CHANGE_FIELD (_closure, _field, =, _value, TRUE, (void), (void) ) +#define INC(_closure, _field) CHANGE_FIELD (_closure, _field, +=, 1, TRUE, (void), (void) ) +#define INC_ASSIGN(_closure, _field, _newv) CHANGE_FIELD (_closure, _field, +=, 1, TRUE, (void), *(_newv) = ) +#define DEC(_closure, _field) CHANGE_FIELD (_closure, _field, -=, 1, TRUE, (void), (void) ) +#define DEC_ASSIGN(_closure, _field, _newv) CHANGE_FIELD (_closure, _field, -=, 1, TRUE, (void), *(_newv) = ) + +#if 0 /* for non-thread-safe closures */ +#define SWAP(cl,f,v,o) (void) (*(o) = cl->f, cl->f = v) +#define SET(cl,f,v) (void) (cl->f = v) +#define INC(cl,f) (void) (cl->f += 1) +#define INC_ASSIGN(cl,f,n) (void) (cl->f += 1, *(n) = cl->f) +#define DEC(cl,f) (void) (cl->f -= 1) +#define DEC_ASSIGN(cl,f,n) (void) (cl->f -= 1, *(n) = cl->f) +#endif + +enum { + FNOTIFY, + INOTIFY, + PRE_NOTIFY, + POST_NOTIFY +}; + + +/* --- functions --- */ +/** + * g_closure_new_simple: + * @sizeof_closure: the size of the structure to allocate, must be at least + * sizeof (GClosure) + * @data: data to store in the @data field of the newly allocated #GClosure + * + * Allocates a struct of the given size and initializes the initial + * part as a #GClosure. This function is mainly useful when + * implementing new types of closures. + * + * |[ + * typedef struct _MyClosure MyClosure; + * struct _MyClosure + * { + * GClosure closure; + * // extra data goes here + * }; + * + * static void + * my_closure_finalize (gpointer notify_data, + * GClosure *closure) + * { + * MyClosure *my_closure = (MyClosure *)closure; + * + * // free extra data here + * } + * + * MyClosure *my_closure_new (gpointer data) + * { + * GClosure *closure; + * MyClosure *my_closure; + * + * closure = g_closure_new_simple (sizeof (MyClosure), data); + * my_closure = (MyClosure *) closure; + * + * // initialize extra data here + * + * g_closure_add_finalize_notifier (closure, notify_data, + * my_closure_finalize); + * return my_closure; + * } + * ]| + * + * Returns: a newly allocated #GClosure + */ +GClosure* +g_closure_new_simple (guint sizeof_closure, + gpointer data) +{ + GClosure *closure; + + g_return_val_if_fail (sizeof_closure >= sizeof (GClosure), NULL); + + closure = g_malloc0 (sizeof_closure); + SET (closure, ref_count, 1); + SET (closure, meta_marshal, 0); + SET (closure, n_guards, 0); + SET (closure, n_fnotifiers, 0); + SET (closure, n_inotifiers, 0); + SET (closure, in_inotify, FALSE); + SET (closure, floating, TRUE); + SET (closure, derivative_flag, 0); + SET (closure, in_marshal, FALSE); + SET (closure, is_invalid, FALSE); + closure->marshal = NULL; + closure->data = data; + closure->notifiers = NULL; + memset (G_STRUCT_MEMBER_P (closure, sizeof (*closure)), 0, sizeof_closure - sizeof (*closure)); + + return closure; +} + +static inline void +closure_invoke_notifiers (GClosure *closure, + guint notify_type) +{ + /* notifier layout: + * meta_marshal n_guards n_guards n_fnotif. n_inotifiers + * ->[[meta_marshal][pre_guards][post_guards][fnotifiers][inotifiers]] + * + * CLOSURE_N_MFUNCS(cl) = meta_marshal + n_guards + n_guards; + * CLOSURE_N_NOTIFIERS(cl) = CLOSURE_N_MFUNCS(cl) + n_fnotifiers + n_inotifiers + * + * constrains/catches: + * - closure->notifiers may be reloacted during callback + * - closure->n_fnotifiers and closure->n_inotifiers may change during callback + * - i.e. callbacks can be removed/added during invocation + * - must prepare for callback removal during FNOTIFY and INOTIFY (done via ->marshal= & ->data=) + * - must distinguish (->marshal= & ->data=) for INOTIFY vs. FNOTIFY (via ->in_inotify) + * + closure->n_guards is const during PRE_NOTIFY & POST_NOTIFY + * + closure->meta_marshal is const for all cases + * + none of the callbacks can cause recursion + * + closure->n_inotifiers is const 0 during FNOTIFY + */ + switch (notify_type) + { + GClosureNotifyData *ndata; + guint i, offs; + case FNOTIFY: + while (closure->n_fnotifiers) + { + guint n; + DEC_ASSIGN (closure, n_fnotifiers, &n); + + ndata = closure->notifiers + CLOSURE_N_MFUNCS (closure) + n; + closure->marshal = (GClosureMarshal) ndata->notify; + closure->data = ndata->data; + ndata->notify (ndata->data, closure); + } + closure->marshal = NULL; + closure->data = NULL; + break; + case INOTIFY: + SET (closure, in_inotify, TRUE); + while (closure->n_inotifiers) + { + guint n; + DEC_ASSIGN (closure, n_inotifiers, &n); + + ndata = closure->notifiers + CLOSURE_N_MFUNCS (closure) + closure->n_fnotifiers + n; + closure->marshal = (GClosureMarshal) ndata->notify; + closure->data = ndata->data; + ndata->notify (ndata->data, closure); + } + closure->marshal = NULL; + closure->data = NULL; + SET (closure, in_inotify, FALSE); + break; + case PRE_NOTIFY: + i = closure->n_guards; + offs = closure->meta_marshal; + while (i--) + { + ndata = closure->notifiers + offs + i; + ndata->notify (ndata->data, closure); + } + break; + case POST_NOTIFY: + i = closure->n_guards; + offs = closure->meta_marshal + i; + while (i--) + { + ndata = closure->notifiers + offs + i; + ndata->notify (ndata->data, closure); + } + break; + } +} + +/** + * g_closure_set_meta_marshal: + * @closure: a #GClosure + * @marshal_data: context-dependent data to pass to @meta_marshal + * @meta_marshal: a #GClosureMarshal function + * + * Sets the meta marshaller of @closure. A meta marshaller wraps + * @closure->marshal and modifies the way it is called in some + * fashion. The most common use of this facility is for C callbacks. + * The same marshallers (generated by glib-genmarshal) are used + * everywhere, but the way that we get the callback function + * differs. In most cases we want to use @closure->callback, but in + * other cases we want to use some different technique to retrieve the + * callback function. + * + * For example, class closures for signals (see + * g_signal_type_cclosure_new()) retrieve the callback function from a + * fixed offset in the class structure. The meta marshaller retrieves + * the right callback and passes it to the marshaller as the + * @marshal_data argument. + */ +void +g_closure_set_meta_marshal (GClosure *closure, + gpointer marshal_data, + GClosureMarshal meta_marshal) +{ + GClosureNotifyData *notifiers; + + g_return_if_fail (closure != NULL); + g_return_if_fail (meta_marshal != NULL); + g_return_if_fail (closure->is_invalid == FALSE); + g_return_if_fail (closure->in_marshal == FALSE); + g_return_if_fail (closure->meta_marshal == 0); + + notifiers = closure->notifiers; + closure->notifiers = g_renew (GClosureNotifyData, NULL, CLOSURE_N_NOTIFIERS (closure) + 1); + if (notifiers) + { + /* usually the meta marshal will be setup right after creation, so the + * g_memmove() should be rare-case scenario + */ + g_memmove (closure->notifiers + 1, notifiers, CLOSURE_N_NOTIFIERS (closure) * sizeof (notifiers[0])); + g_free (notifiers); + } + closure->notifiers[0].data = marshal_data; + closure->notifiers[0].notify = (GClosureNotify) meta_marshal; + SET (closure, meta_marshal, 1); +} + +/** + * g_closure_add_marshal_guards: + * @closure: a #GClosure + * @pre_marshal_data: data to pass to @pre_marshal_notify + * @pre_marshal_notify: a function to call before the closure callback + * @post_marshal_data: data to pass to @post_marshal_notify + * @post_marshal_notify: a function to call after the closure callback + * + * Adds a pair of notifiers which get invoked before and after the + * closure callback, respectively. This is typically used to protect + * the extra arguments for the duration of the callback. See + * g_object_watch_closure() for an example of marshal guards. + */ +void +g_closure_add_marshal_guards (GClosure *closure, + gpointer pre_marshal_data, + GClosureNotify pre_marshal_notify, + gpointer post_marshal_data, + GClosureNotify post_marshal_notify) +{ + guint i; + + g_return_if_fail (closure != NULL); + g_return_if_fail (pre_marshal_notify != NULL); + g_return_if_fail (post_marshal_notify != NULL); + g_return_if_fail (closure->is_invalid == FALSE); + g_return_if_fail (closure->in_marshal == FALSE); + g_return_if_fail (closure->n_guards < CLOSURE_MAX_N_GUARDS); + + closure->notifiers = g_renew (GClosureNotifyData, closure->notifiers, CLOSURE_N_NOTIFIERS (closure) + 2); + if (closure->n_inotifiers) + closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + + closure->n_inotifiers + 1)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + 0)]; + if (closure->n_inotifiers > 1) + closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + + closure->n_inotifiers)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + 1)]; + if (closure->n_fnotifiers) + closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + 1)] = closure->notifiers[CLOSURE_N_MFUNCS (closure) + 0]; + if (closure->n_fnotifiers > 1) + closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers)] = closure->notifiers[CLOSURE_N_MFUNCS (closure) + 1]; + if (closure->n_guards) + closure->notifiers[(closure->meta_marshal + + closure->n_guards + + closure->n_guards + 1)] = closure->notifiers[closure->meta_marshal + closure->n_guards]; + i = closure->n_guards; + closure->notifiers[closure->meta_marshal + i].data = pre_marshal_data; + closure->notifiers[closure->meta_marshal + i].notify = pre_marshal_notify; + closure->notifiers[closure->meta_marshal + i + 1].data = post_marshal_data; + closure->notifiers[closure->meta_marshal + i + 1].notify = post_marshal_notify; + INC (closure, n_guards); +} + +/** + * g_closure_add_finalize_notifier: + * @closure: a #GClosure + * @notify_data: data to pass to @notify_func + * @notify_func: the callback function to register + * + * Registers a finalization notifier which will be called when the + * reference count of @closure goes down to 0. Multiple finalization + * notifiers on a single closure are invoked in unspecified order. If + * a single call to g_closure_unref() results in the closure being + * both invalidated and finalized, then the invalidate notifiers will + * be run before the finalize notifiers. + */ +void +g_closure_add_finalize_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func) +{ + guint i; + + g_return_if_fail (closure != NULL); + g_return_if_fail (notify_func != NULL); + g_return_if_fail (closure->n_fnotifiers < CLOSURE_MAX_N_FNOTIFIERS); + + closure->notifiers = g_renew (GClosureNotifyData, closure->notifiers, CLOSURE_N_NOTIFIERS (closure) + 1); + if (closure->n_inotifiers) + closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + + closure->n_inotifiers)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + 0)]; + i = CLOSURE_N_MFUNCS (closure) + closure->n_fnotifiers; + closure->notifiers[i].data = notify_data; + closure->notifiers[i].notify = notify_func; + INC (closure, n_fnotifiers); +} + +/** + * g_closure_add_invalidate_notifier: + * @closure: a #GClosure + * @notify_data: data to pass to @notify_func + * @notify_func: the callback function to register + * + * Registers an invalidation notifier which will be called when the + * @closure is invalidated with g_closure_invalidate(). Invalidation + * notifiers are invoked before finalization notifiers, in an + * unspecified order. + */ +void +g_closure_add_invalidate_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func) +{ + guint i; + + g_return_if_fail (closure != NULL); + g_return_if_fail (notify_func != NULL); + g_return_if_fail (closure->is_invalid == FALSE); + g_return_if_fail (closure->n_inotifiers < CLOSURE_MAX_N_INOTIFIERS); + + closure->notifiers = g_renew (GClosureNotifyData, closure->notifiers, CLOSURE_N_NOTIFIERS (closure) + 1); + i = CLOSURE_N_MFUNCS (closure) + closure->n_fnotifiers + closure->n_inotifiers; + closure->notifiers[i].data = notify_data; + closure->notifiers[i].notify = notify_func; + INC (closure, n_inotifiers); +} + +static inline gboolean +closure_try_remove_inotify (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func) +{ + GClosureNotifyData *ndata, *nlast; + + nlast = closure->notifiers + CLOSURE_N_NOTIFIERS (closure) - 1; + for (ndata = nlast + 1 - closure->n_inotifiers; ndata <= nlast; ndata++) + if (ndata->notify == notify_func && ndata->data == notify_data) + { + DEC (closure, n_inotifiers); + if (ndata < nlast) + *ndata = *nlast; + + return TRUE; + } + return FALSE; +} + +static inline gboolean +closure_try_remove_fnotify (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func) +{ + GClosureNotifyData *ndata, *nlast; + + nlast = closure->notifiers + CLOSURE_N_NOTIFIERS (closure) - closure->n_inotifiers - 1; + for (ndata = nlast + 1 - closure->n_fnotifiers; ndata <= nlast; ndata++) + if (ndata->notify == notify_func && ndata->data == notify_data) + { + DEC (closure, n_fnotifiers); + if (ndata < nlast) + *ndata = *nlast; + if (closure->n_inotifiers) + closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers)] = closure->notifiers[(CLOSURE_N_MFUNCS (closure) + + closure->n_fnotifiers + + closure->n_inotifiers)]; + return TRUE; + } + return FALSE; +} + +/** + * g_closure_ref: + * @closure: #GClosure to increment the reference count on + * + * Increments the reference count on a closure to force it staying + * alive while the caller holds a pointer to it. + * + * Returns: The @closure passed in, for convenience + */ +GClosure* +g_closure_ref (GClosure *closure) +{ + guint new_ref_count; + g_return_val_if_fail (closure != NULL, NULL); + g_return_val_if_fail (closure->ref_count > 0, NULL); + g_return_val_if_fail (closure->ref_count < CLOSURE_MAX_REF_COUNT, NULL); + + INC_ASSIGN (closure, ref_count, &new_ref_count); + g_return_val_if_fail (new_ref_count > 1, NULL); + + return closure; +} + +/** + * g_closure_invalidate: + * @closure: GClosure to invalidate + * + * Sets a flag on the closure to indicate that its calling + * environment has become invalid, and thus causes any future + * invocations of g_closure_invoke() on this @closure to be + * ignored. Also, invalidation notifiers installed on the closure will + * be called at this point. Note that unless you are holding a + * reference to the closure yourself, the invalidation notifiers may + * unref the closure and cause it to be destroyed, so if you need to + * access the closure after calling g_closure_invalidate(), make sure + * that you've previously called g_closure_ref(). + * + * Note that g_closure_invalidate() will also be called when the + * reference count of a closure drops to zero (unless it has already + * been invalidated before). + */ +void +g_closure_invalidate (GClosure *closure) +{ + g_return_if_fail (closure != NULL); + + if (!closure->is_invalid) + { + gboolean was_invalid; + g_closure_ref (closure); /* preserve floating flag */ + SWAP (closure, is_invalid, TRUE, &was_invalid); + /* invalidate only once */ + if (!was_invalid) + closure_invoke_notifiers (closure, INOTIFY); + g_closure_unref (closure); + } +} + +/** + * g_closure_unref: + * @closure: #GClosure to decrement the reference count on + * + * Decrements the reference count of a closure after it was previously + * incremented by the same caller. If no other callers are using the + * closure, then the closure will be destroyed and freed. + */ +void +g_closure_unref (GClosure *closure) +{ + guint new_ref_count; + + g_return_if_fail (closure != NULL); + g_return_if_fail (closure->ref_count > 0); + + if (closure->ref_count == 1) /* last unref, invalidate first */ + g_closure_invalidate (closure); + + DEC_ASSIGN (closure, ref_count, &new_ref_count); + + if (new_ref_count == 0) + { + closure_invoke_notifiers (closure, FNOTIFY); + g_free (closure->notifiers); + g_free (closure); + } +} + +/** + * g_closure_sink: + * @closure: #GClosure to decrement the initial reference count on, if it's + * still being held + * + * Takes over the initial ownership of a closure. Each closure is + * initially created in a floating state, which + * means that the initial reference count is not owned by any caller. + * g_closure_sink() checks to see if the object is still floating, and + * if so, unsets the floating state and decreases the reference + * count. If the closure is not floating, g_closure_sink() does + * nothing. The reason for the existance of the floating state is to + * prevent cumbersome code sequences like: + * |[ + * closure = g_cclosure_new (cb_func, cb_data); + * g_source_set_closure (source, closure); + * g_closure_unref (closure); // XXX GObject doesn't really need this + * ]| + * Because g_source_set_closure() (and similar functions) take ownership of the + * initial reference count, if it is unowned, we instead can write: + * |[ + * g_source_set_closure (source, g_cclosure_new (cb_func, cb_data)); + * ]| + * + * Generally, this function is used together with g_closure_ref(). Ane example + * of storing a closure for later notification looks like: + * |[ + * static GClosure *notify_closure = NULL; + * void + * foo_notify_set_closure (GClosure *closure) + * { + * if (notify_closure) + * g_closure_unref (notify_closure); + * notify_closure = closure; + * if (notify_closure) + * { + * g_closure_ref (notify_closure); + * g_closure_sink (notify_closure); + * } + * } + * ]| + * + * Because g_closure_sink() may decrement the reference count of a closure + * (if it hasn't been called on @closure yet) just like g_closure_unref(), + * g_closure_ref() should be called prior to this function. + */ +void +g_closure_sink (GClosure *closure) +{ + g_return_if_fail (closure != NULL); + g_return_if_fail (closure->ref_count > 0); + + /* floating is basically a kludge to avoid creating closures + * with a ref_count of 0. so the intial ref_count a closure has + * is unowned. with invoking g_closure_sink() code may + * indicate that it takes over that intiial ref_count. + */ + if (closure->floating) + { + gboolean was_floating; + SWAP (closure, floating, FALSE, &was_floating); + /* unref floating flag only once */ + if (was_floating) + g_closure_unref (closure); + } +} + +/** + * g_closure_remove_invalidate_notifier: + * @closure: a #GClosure + * @notify_data: data which was passed to g_closure_add_invalidate_notifier() + * when registering @notify_func + * @notify_func: the callback function to remove + * + * Removes an invalidation notifier. + * + * Notice that notifiers are automatically removed after they are run. + */ +void +g_closure_remove_invalidate_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func) +{ + g_return_if_fail (closure != NULL); + g_return_if_fail (notify_func != NULL); + + if (closure->is_invalid && closure->in_inotify && /* account removal of notify_func() while it's called */ + ((gpointer) closure->marshal) == ((gpointer) notify_func) && + closure->data == notify_data) + closure->marshal = NULL; + else if (!closure_try_remove_inotify (closure, notify_data, notify_func)) + g_warning (G_STRLOC ": unable to remove uninstalled invalidation notifier: %p (%p)", + notify_func, notify_data); +} + +/** + * g_closure_remove_finalize_notifier: + * @closure: a #GClosure + * @notify_data: data which was passed to g_closure_add_finalize_notifier() + * when registering @notify_func + * @notify_func: the callback function to remove + * + * Removes a finalization notifier. + * + * Notice that notifiers are automatically removed after they are run. + */ +void +g_closure_remove_finalize_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func) +{ + g_return_if_fail (closure != NULL); + g_return_if_fail (notify_func != NULL); + + if (closure->is_invalid && !closure->in_inotify && /* account removal of notify_func() while it's called */ + ((gpointer) closure->marshal) == ((gpointer) notify_func) && + closure->data == notify_data) + closure->marshal = NULL; + else if (!closure_try_remove_fnotify (closure, notify_data, notify_func)) + g_warning (G_STRLOC ": unable to remove uninstalled finalization notifier: %p (%p)", + notify_func, notify_data); +} + +/** + * g_closure_invoke: + * @closure: a #GClosure + * @return_value: a #GValue to store the return value. May be %NULL if the + * callback of @closure doesn't return a value. + * @n_param_values: the length of the @param_values array + * @param_values: an array of #GValues holding the arguments on + * which to invoke the callback of @closure + * @invocation_hint: a context-dependent invocation hint + * + * Invokes the closure, i.e. executes the callback represented by the @closure. + */ +void +g_closure_invoke (GClosure *closure, + GValue /*out*/ *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint) +{ + g_return_if_fail (closure != NULL); + + g_closure_ref (closure); /* preserve floating flag */ + if (!closure->is_invalid) + { + GClosureMarshal marshal; + gpointer marshal_data; + gboolean in_marshal = closure->in_marshal; + + g_return_if_fail (closure->marshal || closure->meta_marshal); + + SET (closure, in_marshal, TRUE); + if (closure->meta_marshal) + { + marshal_data = closure->notifiers[0].data; + marshal = (GClosureMarshal) closure->notifiers[0].notify; + } + else + { + marshal_data = NULL; + marshal = closure->marshal; + } + if (!in_marshal) + closure_invoke_notifiers (closure, PRE_NOTIFY); + marshal (closure, + return_value, + n_param_values, param_values, + invocation_hint, + marshal_data); + if (!in_marshal) + closure_invoke_notifiers (closure, POST_NOTIFY); + SET (closure, in_marshal, in_marshal); + } + g_closure_unref (closure); +} + +/** + * g_closure_set_marshal: + * @closure: a #GClosure + * @marshal: a #GClosureMarshal function + * + * Sets the marshaller of @closure. The marshal_data + * of @marshal provides a way for a meta marshaller to provide additional + * information to the marshaller. (See g_closure_set_meta_marshal().) For + * GObject's C predefined marshallers (the g_cclosure_marshal_*() + * functions), what it provides is a callback function to use instead of + * @closure->callback. + */ +void +g_closure_set_marshal (GClosure *closure, + GClosureMarshal marshal) +{ + g_return_if_fail (closure != NULL); + g_return_if_fail (marshal != NULL); + + if (closure->marshal && closure->marshal != marshal) + g_warning ("attempt to override closure->marshal (%p) with new marshal (%p)", + closure->marshal, marshal); + else + closure->marshal = marshal; +} + +/** + * g_cclosure_new: + * @callback_func: the function to invoke + * @user_data: user data to pass to @callback_func + * @destroy_data: destroy notify to be called when @user_data is no longer used + * + * Creates a new closure which invokes @callback_func with @user_data as + * the last parameter. + * + * Returns: a new #GCClosure + */ +GClosure* +g_cclosure_new (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data) +{ + GClosure *closure; + + g_return_val_if_fail (callback_func != NULL, NULL); + + closure = g_closure_new_simple (sizeof (GCClosure), user_data); + if (destroy_data) + g_closure_add_finalize_notifier (closure, user_data, destroy_data); + ((GCClosure*) closure)->callback = (gpointer) callback_func; + + return closure; +} + +/** + * g_cclosure_new_swap: + * @callback_func: the function to invoke + * @user_data: user data to pass to @callback_func + * @destroy_data: destroy notify to be called when @user_data is no longer used + * + * Creates a new closure which invokes @callback_func with @user_data as + * the first parameter. + * + * Returns: a new #GCClosure + */ +GClosure* +g_cclosure_new_swap (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data) +{ + GClosure *closure; + + g_return_val_if_fail (callback_func != NULL, NULL); + + closure = g_closure_new_simple (sizeof (GCClosure), user_data); + if (destroy_data) + g_closure_add_finalize_notifier (closure, user_data, destroy_data); + ((GCClosure*) closure)->callback = (gpointer) callback_func; + SET (closure, derivative_flag, TRUE); + + return closure; +} + +static void +g_type_class_meta_marshal (GClosure *closure, + GValue /*out*/ *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + GTypeClass *class; + gpointer callback; + /* GType itype = (GType) closure->data; */ + guint offset = GPOINTER_TO_UINT (marshal_data); + + class = G_TYPE_INSTANCE_GET_CLASS (g_value_peek_pointer (param_values + 0), itype, GTypeClass); + callback = G_STRUCT_MEMBER (gpointer, class, offset); + if (callback) + closure->marshal (closure, + return_value, + n_param_values, param_values, + invocation_hint, + callback); +} + +static void +g_type_iface_meta_marshal (GClosure *closure, + GValue /*out*/ *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + GTypeClass *class; + gpointer callback; + GType itype = (GType) closure->data; + guint offset = GPOINTER_TO_UINT (marshal_data); + + class = G_TYPE_INSTANCE_GET_INTERFACE (g_value_peek_pointer (param_values + 0), itype, GTypeClass); + callback = G_STRUCT_MEMBER (gpointer, class, offset); + if (callback) + closure->marshal (closure, + return_value, + n_param_values, param_values, + invocation_hint, + callback); +} + +/** + * g_signal_type_cclosure_new: + * @itype: the #GType identifier of an interface or classed type + * @struct_offset: the offset of the member function of @itype's class + * structure which is to be invoked by the new closure + * + * Creates a new closure which invokes the function found at the offset + * @struct_offset in the class structure of the interface or classed type + * identified by @itype. + * + * Returns: a new #GCClosure + */ +GClosure* +g_signal_type_cclosure_new (GType itype, + guint struct_offset) +{ + GClosure *closure; + + g_return_val_if_fail (G_TYPE_IS_CLASSED (itype) || G_TYPE_IS_INTERFACE (itype), NULL); + g_return_val_if_fail (struct_offset >= sizeof (GTypeClass), NULL); + + closure = g_closure_new_simple (sizeof (GClosure), (gpointer) itype); + if (G_TYPE_IS_INTERFACE (itype)) + g_closure_set_meta_marshal (closure, GUINT_TO_POINTER (struct_offset), g_type_iface_meta_marshal); + else + g_closure_set_meta_marshal (closure, GUINT_TO_POINTER (struct_offset), g_type_class_meta_marshal); + + return closure; +} + + +/** + * g_cclosure_marshal_VOID__VOID: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 1 + * @param_values: a #GValue array holding only the instance + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__BOOLEAN: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gboolean parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gboolean arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__CHAR: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gchar parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gchar arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__UCHAR: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #guchar parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, guchar arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__INT: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gint parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gint arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__UINT: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #guint parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, guint arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__LONG: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #glong parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, glong arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__ULONG: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gulong parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gulong arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__ENUM: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the enumeration parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gint arg1, gpointer user_data) where the #gint parameter denotes an enumeration type.. + */ + +/** + * g_cclosure_marshal_VOID__FLAGS: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the flags parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gint arg1, gpointer user_data) where the #gint parameter denotes a flags type. + */ + +/** + * g_cclosure_marshal_VOID__FLOAT: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gfloat parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gfloat arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__DOUBLE: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gdouble parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gdouble arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__STRING: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gchar* parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, const gchar *arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__PARAM: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #GParamSpec* parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, GParamSpec *arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__BOXED: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #GBoxed* parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, GBoxed *arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__POINTER: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #gpointer parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, gpointer arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__OBJECT: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 2 + * @param_values: a #GValue array holding the instance and the #GObject* parameter + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, GOBject *arg1, gpointer user_data). + */ + +/** + * g_cclosure_marshal_VOID__UINT_POINTER: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: ignored + * @n_param_values: 3 + * @param_values: a #GValue array holding instance, arg1 and arg2 + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * void (*callback) (gpointer instance, guint arg1, gpointer arg2, gpointer user_data). + */ + +/** + * g_cclosure_marshal_BOOLEAN__FLAGS: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: a #GValue which can store the returned #gboolean + * @n_param_values: 2 + * @param_values: a #GValue array holding instance and arg1 + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * gboolean (*callback) (gpointer instance, gint arg1, gpointer user_data) where the #gint parameter + * denotes a flags type. + */ + +/** + * g_cclosure_marshal_BOOL__FLAGS: + * + * Another name for g_cclosure_marshal_BOOLEAN__FLAGS(). + */ +/** + * g_cclosure_marshal_STRING__OBJECT_POINTER: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: a #GValue, which can store the returned string + * @n_param_values: 3 + * @param_values: a #GValue array holding instance, arg1 and arg2 + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller + * + * A marshaller for a #GCClosure with a callback of type + * gchar* (*callback) (gpointer instance, GObject *arg1, gpointer arg2, gpointer user_data). + */ + +#define __G_CLOSURE_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gclosure.h b/gobject/gclosure.h new file mode 100644 index 0000000..fc0cb47 --- /dev/null +++ b/gobject/gclosure.h @@ -0,0 +1,251 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000-2001 Red Hat, Inc. + * Copyright (C) 2005 Imendio AB + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_CLOSURE_H__ +#define __G_CLOSURE_H__ + +#include + +G_BEGIN_DECLS + +/* --- defines --- */ +/** + * G_CLOSURE_NEEDS_MARSHAL: + * @closure: a #GClosure + * + * Check if the closure still needs a marshaller. See g_closure_set_marshal(). + * + * Returns: %TRUE if a #GClosureMarshal marshaller has not yet been set on + * @closure. + */ +#define G_CLOSURE_NEEDS_MARSHAL(closure) (((GClosure*) (closure))->marshal == NULL) +/** + * G_CLOSURE_N_NOTIFIERS: + * @cl: a #GClosure + * + * Get the total number of notifiers connected with the closure @cl. + * The count includes the meta marshaller, the finalize and invalidate notifiers + * and the marshal guards. Note that each guard counts as two notifiers. + * See g_closure_set_meta_marshal(), g_closure_add_finalize_notifier(), + * g_closure_add_invalidate_notifier() and g_closure_add_marshal_guards(). + * + * Returns: number of notifiers + */ +#define G_CLOSURE_N_NOTIFIERS(cl) ((cl)->meta_marshal + ((cl)->n_guards << 1L) + \ + (cl)->n_fnotifiers + (cl)->n_inotifiers) +/** + * G_CCLOSURE_SWAP_DATA: + * @cclosure: a #GCClosure + * + * Checks whether the user data of the #GCClosure should be passed as the + * first parameter to the callback. See g_cclosure_new_swap(). + * + * Returns: %TRUE if data has to be swapped. + */ +#define G_CCLOSURE_SWAP_DATA(cclosure) (((GClosure*) (cclosure))->derivative_flag) +/** + * G_CALLBACK: + * @f: a function pointer. + * + * Cast a function pointer to a #GCallback. + */ +#define G_CALLBACK(f) ((GCallback) (f)) + + +/* -- typedefs --- */ +typedef struct _GClosure GClosure; +typedef struct _GClosureNotifyData GClosureNotifyData; + +/** + * GCallback: + * + * The type used for callback functions in structure definitions and function + * signatures. This doesn't mean that all callback functions must take no + * parameters and return void. The required signature of a callback function + * is determined by the context in which is used (e.g. the signal to which it + * is connected). Use G_CALLBACK() to cast the callback function to a #GCallback. + */ +typedef void (*GCallback) (void); +/** + * GClosureNotify: + * @data: data specified when registering the notification callback + * @closure: the #GClosure on which the notification is emitted + * + * The type used for the various notification callbacks which can be registered + * on closures. + */ +typedef void (*GClosureNotify) (gpointer data, + GClosure *closure); +/** + * GClosureMarshal: + * @closure: the #GClosure to which the marshaller belongs + * @return_value: a #GValue to store the return value. May be %NULL if the + * callback of @closure doesn't return a value. + * @n_param_values: the length of the @param_values array + * @param_values: an array of #GValues holding the arguments on + * which to invoke the callback of @closure + * @invocation_hint: the invocation hint given as the last argument + * to g_closure_invoke() + * @marshal_data: additional data specified when registering the marshaller, + * see g_closure_set_marshal() and g_closure_set_meta_marshal() + * + * The type used for marshaller functions. + */ +typedef void (*GClosureMarshal) (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +/** + * GCClosure: + * @closure: the #GClosure + * @callback: the callback function + * + * A #GCClosure is a specialization of #GClosure for C function callbacks. + */ +typedef struct _GCClosure GCClosure; + + +/* --- structures --- */ +struct _GClosureNotifyData +{ + gpointer data; + GClosureNotify notify; +}; +/** + * GClosure: + * @in_marshal: Indicates whether the closure is currently being invoked with + * g_closure_invoke() + * @is_invalid: Indicates whether the closure has been invalidated by + * g_closure_invalidate() + * + * A #GClosure represents a callback supplied by the programmer. + */ +struct _GClosure +{ + /*< private >*/ + volatile guint ref_count : 15; + volatile guint meta_marshal : 1; + volatile guint n_guards : 1; + volatile guint n_fnotifiers : 2; /* finalization notifiers */ + volatile guint n_inotifiers : 8; /* invalidation notifiers */ + volatile guint in_inotify : 1; + volatile guint floating : 1; + /*< protected >*/ + volatile guint derivative_flag : 1; + /*< public >*/ + volatile guint in_marshal : 1; + volatile guint is_invalid : 1; + + /*< private >*/ void (*marshal) (GClosure *closure, + GValue /*out*/ *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + /*< protected >*/ gpointer data; + + /*< private >*/ GClosureNotifyData *notifiers; + + /* invariants/constrains: + * - ->marshal and ->data are _invalid_ as soon as ->is_invalid==TRUE + * - invocation of all inotifiers occours prior to fnotifiers + * - order of inotifiers is random + * inotifiers may _not_ free/invalidate parameter values (e.g. ->data) + * - order of fnotifiers is random + * - each notifier may only be removed before or during its invocation + * - reference counting may only happen prior to fnotify invocation + * (in that sense, fnotifiers are really finalization handlers) + */ +}; +/* closure for C function calls, callback() is the user function + */ +struct _GCClosure +{ + GClosure closure; + gpointer callback; +}; + + +/* --- prototypes --- */ +GClosure* g_cclosure_new (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data); +GClosure* g_cclosure_new_swap (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data); +GClosure* g_signal_type_cclosure_new (GType itype, + guint struct_offset); + + +/* --- prototypes --- */ +GClosure* g_closure_ref (GClosure *closure); +void g_closure_sink (GClosure *closure); +void g_closure_unref (GClosure *closure); +/* intimidating */ +GClosure* g_closure_new_simple (guint sizeof_closure, + gpointer data); +void g_closure_add_finalize_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +void g_closure_remove_finalize_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +void g_closure_add_invalidate_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +void g_closure_remove_invalidate_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +void g_closure_add_marshal_guards (GClosure *closure, + gpointer pre_marshal_data, + GClosureNotify pre_marshal_notify, + gpointer post_marshal_data, + GClosureNotify post_marshal_notify); +void g_closure_set_marshal (GClosure *closure, + GClosureMarshal marshal); +void g_closure_set_meta_marshal (GClosure *closure, + gpointer marshal_data, + GClosureMarshal meta_marshal); +void g_closure_invalidate (GClosure *closure); +void g_closure_invoke (GClosure *closure, + GValue /*out*/ *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint); + +/* FIXME: + OK: data_object::destroy -> closure_invalidate(); + MIS: closure_invalidate() -> disconnect(closure); + MIS: disconnect(closure) -> (unlink) closure_unref(); + OK: closure_finalize() -> g_free (data_string); + + random remarks: + - need marshaller repo with decent aliasing to base types + - provide marshaller collection, virtually covering anything out there +*/ + +G_END_DECLS + +#endif /* __G_CLOSURE_H__ */ diff --git a/gobject/genums.c b/gobject/genums.c new file mode 100644 index 0000000..d506a5b --- /dev/null +++ b/gobject/genums.c @@ -0,0 +1,624 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include + +#include "genums.h" +#include "gvalue.h" +#include "gvaluecollector.h" +#include "gobjectalias.h" + + +/** + * SECTION:enumerations_flags + * @short_description: Enumeration and flags types + * @title: Enumeration and Flag Types + * @see_also:#GParamSpecEnum, #GParamSpecFlags, g_param_spec_enum(), + * g_param_spec_flags() + * + * The GLib type system provides fundamental types for enumeration and + * flags types. (Flags types are like enumerations, but allow their + * values to be combined by bitwise or). A registered enumeration or + * flags type associates a name and a nickname with each allowed + * value, and the methods g_enum_get_value_by_name(), + * g_enum_get_value_by_nick(), g_flags_get_value_by_name() and + * g_flags_get_value_by_nick() can look up values by their name or + * nickname. When an enumeration or flags type is registered with the + * GLib type system, it can be used as value type for object + * properties, using g_param_spec_enum() or g_param_spec_flags(). + * + * GObject ships with a utility called glib-mkenums that can construct + * suitable type registration functions from C enumeration + * definitions. + */ + + +/* --- prototypes --- */ +static void g_enum_class_init (GEnumClass *class, + gpointer class_data); +static void g_flags_class_init (GFlagsClass *class, + gpointer class_data); +static void value_flags_enum_init (GValue *value); +static void value_flags_enum_copy_value (const GValue *src_value, + GValue *dest_value); +static gchar* value_flags_enum_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +static gchar* value_flags_enum_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); + +/* --- functions --- */ +void +g_enum_types_init (void) +{ + static gboolean initialized = FALSE; + static const GTypeValueTable flags_enum_value_table = { + value_flags_enum_init, /* value_init */ + NULL, /* value_free */ + value_flags_enum_copy_value, /* value_copy */ + NULL, /* value_peek_pointer */ + "i", /* collect_format */ + value_flags_enum_collect_value, /* collect_value */ + "p", /* lcopy_format */ + value_flags_enum_lcopy_value, /* lcopy_value */ + }; + static GTypeInfo info = { + 0, /* class_size */ + NULL, /* base_init */ + NULL, /* base_destroy */ + NULL, /* class_init */ + NULL, /* class_destroy */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + &flags_enum_value_table, /* value_table */ + }; + static const GTypeFundamentalInfo finfo = { + G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_DERIVABLE, + }; + GType type; + + g_return_if_fail (initialized == FALSE); + initialized = TRUE; + + /* G_TYPE_ENUM + */ + info.class_size = sizeof (GEnumClass); + type = g_type_register_fundamental (G_TYPE_ENUM, g_intern_static_string ("GEnum"), &info, &finfo, + G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT); + g_assert (type == G_TYPE_ENUM); + + /* G_TYPE_FLAGS + */ + info.class_size = sizeof (GFlagsClass); + type = g_type_register_fundamental (G_TYPE_FLAGS, g_intern_static_string ("GFlags"), &info, &finfo, + G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT); + g_assert (type == G_TYPE_FLAGS); +} + +static void +value_flags_enum_init (GValue *value) +{ + value->data[0].v_long = 0; +} + +static void +value_flags_enum_copy_value (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_long = src_value->data[0].v_long; +} + +static gchar* +value_flags_enum_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_long = collect_values[0].v_int; + + return NULL; +} + +static gchar* +value_flags_enum_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gint *int_p = collect_values[0].v_pointer; + + if (!int_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *int_p = value->data[0].v_long; + + return NULL; +} + +/** + * g_enum_register_static: + * @name: A nul-terminated string used as the name of the new type. + * @const_static_values: An array of #GEnumValue structs for the possible + * enumeration values. The array is terminated by a struct with all + * members being 0. GObject keeps a reference to the data, so it cannot + * be stack-allocated. + * + * Registers a new static enumeration type with the name @name. + * + * It is normally more convenient to let glib-mkenums generate a + * my_enum_get_type() function from a usual C enumeration definition + * than to write one yourself using g_enum_register_static(). + * + * Returns: The new type identifier. + */ +GType +g_enum_register_static (const gchar *name, + const GEnumValue *const_static_values) +{ + GTypeInfo enum_type_info = { + sizeof (GEnumClass), /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) g_enum_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + NULL, /* value_table */ + }; + GType type; + + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (const_static_values != NULL, 0); + + enum_type_info.class_data = const_static_values; + + type = g_type_register_static (G_TYPE_ENUM, name, &enum_type_info, 0); + + return type; +} + +/** + * g_flags_register_static: + * @name: A nul-terminated string used as the name of the new type. + * @const_static_values: An array of #GFlagsValue structs for the possible + * flags values. The array is terminated by a struct with all members being 0. + * GObject keeps a reference to the data, so it cannot be stack-allocated. + * + * Registers a new static flags type with the name @name. + * + * It is normally more convenient to let glib-mkenums generate a + * my_flags_get_type() function from a usual C enumeration definition + * than to write one yourself using g_flags_register_static(). + * + * Returns: The new type identifier. + */ +GType +g_flags_register_static (const gchar *name, + const GFlagsValue *const_static_values) +{ + GTypeInfo flags_type_info = { + sizeof (GFlagsClass), /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) g_flags_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + NULL, /* value_table */ + }; + GType type; + + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (const_static_values != NULL, 0); + + flags_type_info.class_data = const_static_values; + + type = g_type_register_static (G_TYPE_FLAGS, name, &flags_type_info, 0); + + return type; +} + +/** + * g_enum_complete_type_info: + * @g_enum_type: the type identifier of the type being completed + * @info: the #GTypeInfo struct to be filled in + * @const_values: An array of #GEnumValue structs for the possible + * enumeration values. The array is terminated by a struct with all + * members being 0. + * + * This function is meant to be called from the complete_type_info() + * function of a #GTypePlugin implementation, as in the following + * example: + * + * |[ + * static void + * my_enum_complete_type_info (GTypePlugin *plugin, + * GType g_type, + * GTypeInfo *info, + * GTypeValueTable *value_table) + * { + * static const GEnumValue values[] = { + * { MY_ENUM_FOO, "MY_ENUM_FOO", "foo" }, + * { MY_ENUM_BAR, "MY_ENUM_BAR", "bar" }, + * { 0, NULL, NULL } + * }; + * + * g_enum_complete_type_info (type, info, values); + * } + * ]| + */ +void +g_enum_complete_type_info (GType g_enum_type, + GTypeInfo *info, + const GEnumValue *const_values) +{ + g_return_if_fail (G_TYPE_IS_ENUM (g_enum_type)); + g_return_if_fail (info != NULL); + g_return_if_fail (const_values != NULL); + + info->class_size = sizeof (GEnumClass); + info->base_init = NULL; + info->base_finalize = NULL; + info->class_init = (GClassInitFunc) g_enum_class_init; + info->class_finalize = NULL; + info->class_data = const_values; +} + +/** + * g_flags_complete_type_info: + * @g_flags_type: the type identifier of the type being completed + * @info: the #GTypeInfo struct to be filled in + * @const_values: An array of #GFlagsValue structs for the possible + * enumeration values. The array is terminated by a struct with all + * members being 0. + * + * This function is meant to be called from the complete_type_info() + * function of a #GTypePlugin implementation, see the example for + * g_enum_complete_type_info() above. + */ +void +g_flags_complete_type_info (GType g_flags_type, + GTypeInfo *info, + const GFlagsValue *const_values) +{ + g_return_if_fail (G_TYPE_IS_FLAGS (g_flags_type)); + g_return_if_fail (info != NULL); + g_return_if_fail (const_values != NULL); + + info->class_size = sizeof (GFlagsClass); + info->base_init = NULL; + info->base_finalize = NULL; + info->class_init = (GClassInitFunc) g_flags_class_init; + info->class_finalize = NULL; + info->class_data = const_values; +} + +static void +g_enum_class_init (GEnumClass *class, + gpointer class_data) +{ + g_return_if_fail (G_IS_ENUM_CLASS (class)); + + class->minimum = 0; + class->maximum = 0; + class->n_values = 0; + class->values = class_data; + + if (class->values) + { + GEnumValue *values; + + class->minimum = class->values->value; + class->maximum = class->values->value; + for (values = class->values; values->value_name; values++) + { + class->minimum = MIN (class->minimum, values->value); + class->maximum = MAX (class->maximum, values->value); + class->n_values++; + } + } +} + +static void +g_flags_class_init (GFlagsClass *class, + gpointer class_data) +{ + g_return_if_fail (G_IS_FLAGS_CLASS (class)); + + class->mask = 0; + class->n_values = 0; + class->values = class_data; + + if (class->values) + { + GFlagsValue *values; + + for (values = class->values; values->value_name; values++) + { + class->mask |= values->value; + class->n_values++; + } + } +} + +/** + * g_enum_get_value_by_name: + * @enum_class: a #GEnumClass + * @name: the name to look up + * + * Looks up a #GEnumValue by name. + * + * Returns: the #GEnumValue with name @name, or %NULL if the + * enumeration doesn't have a member with that name + */ +GEnumValue* +g_enum_get_value_by_name (GEnumClass *enum_class, + const gchar *name) +{ + g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), NULL); + g_return_val_if_fail (name != NULL, NULL); + + if (enum_class->n_values) + { + GEnumValue *enum_value; + + for (enum_value = enum_class->values; enum_value->value_name; enum_value++) + if (strcmp (name, enum_value->value_name) == 0) + return enum_value; + } + + return NULL; +} + +/** + * g_flags_get_value_by_name: + * @flags_class: a #GFlagsClass + * @name: the name to look up + * + * Looks up a #GFlagsValue by name. + * + * Returns: the #GFlagsValue with name @name, or %NULL if there is no + * flag with that name + */ +GFlagsValue* +g_flags_get_value_by_name (GFlagsClass *flags_class, + const gchar *name) +{ + g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL); + g_return_val_if_fail (name != NULL, NULL); + + if (flags_class->n_values) + { + GFlagsValue *flags_value; + + for (flags_value = flags_class->values; flags_value->value_name; flags_value++) + if (strcmp (name, flags_value->value_name) == 0) + return flags_value; + } + + return NULL; +} + +/** + * g_enum_get_value_by_nick: + * @enum_class: a #GEnumClass + * @nick: the nickname to look up + * + * Looks up a #GEnumValue by nickname. + * + * Returns: the #GEnumValue with nickname @nick, or %NULL if the + * enumeration doesn't have a member with that nickname + */ +GEnumValue* +g_enum_get_value_by_nick (GEnumClass *enum_class, + const gchar *nick) +{ + g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), NULL); + g_return_val_if_fail (nick != NULL, NULL); + + if (enum_class->n_values) + { + GEnumValue *enum_value; + + for (enum_value = enum_class->values; enum_value->value_name; enum_value++) + if (enum_value->value_nick && strcmp (nick, enum_value->value_nick) == 0) + return enum_value; + } + + return NULL; +} + +/** + * g_flags_get_value_by_nick: + * @flags_class: a #GFlagsClass + * @nick: the nickname to look up + * + * Looks up a #GFlagsValue by nickname. + * + * Returns: the #GFlagsValue with nickname @nick, or %NULL if there is + * no flag with that nickname + */ +GFlagsValue* +g_flags_get_value_by_nick (GFlagsClass *flags_class, + const gchar *nick) +{ + g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL); + g_return_val_if_fail (nick != NULL, NULL); + + if (flags_class->n_values) + { + GFlagsValue *flags_value; + + for (flags_value = flags_class->values; flags_value->value_nick; flags_value++) + if (flags_value->value_nick && strcmp (nick, flags_value->value_nick) == 0) + return flags_value; + } + + return NULL; +} + +/** + * g_enum_get_value: + * @enum_class: a #GEnumClass + * @value: the value to look up + * + * Returns the #GEnumValue for a value. + * + * Returns: the #GEnumValue for @value, or %NULL if @value is not a + * member of the enumeration + */ +GEnumValue* +g_enum_get_value (GEnumClass *enum_class, + gint value) +{ + g_return_val_if_fail (G_IS_ENUM_CLASS (enum_class), NULL); + + if (enum_class->n_values) + { + GEnumValue *enum_value; + + for (enum_value = enum_class->values; enum_value->value_name; enum_value++) + if (enum_value->value == value) + return enum_value; + } + + return NULL; +} + +/** + * g_flags_get_first_value: + * @flags_class: a #GFlagsClass + * @value: the value + * + * Returns the first #GFlagsValue which is set in @value. + * + * Returns: the first #GFlagsValue which is set in @value, or %NULL if + * none is set + */ +GFlagsValue* +g_flags_get_first_value (GFlagsClass *flags_class, + guint value) +{ + g_return_val_if_fail (G_IS_FLAGS_CLASS (flags_class), NULL); + + if (flags_class->n_values) + { + GFlagsValue *flags_value; + + if (value == 0) + { + for (flags_value = flags_class->values; flags_value->value_name; flags_value++) + if (flags_value->value == 0) + return flags_value; + } + else + { + for (flags_value = flags_class->values; flags_value->value_name; flags_value++) + if (flags_value->value != 0 && (flags_value->value & value) == flags_value->value) + return flags_value; + } + } + + return NULL; +} + +/** + * g_value_set_enum: + * @value: a valid #GValue whose type is derived from %G_TYPE_ENUM + * @v_enum: enum value to be set + * + * Set the contents of a %G_TYPE_ENUM #GValue to @v_enum. + */ +void +g_value_set_enum (GValue *value, + gint v_enum) +{ + g_return_if_fail (G_VALUE_HOLDS_ENUM (value)); + + value->data[0].v_long = v_enum; +} + +/** + * g_value_get_enum: + * @value: a valid #GValue whose type is derived from %G_TYPE_ENUM + * + * Get the contents of a %G_TYPE_ENUM #GValue. + * + * Returns: enum contents of @value + */ +gint +g_value_get_enum (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_ENUM (value), 0); + + return value->data[0].v_long; +} + +/** + * g_value_set_flags: + * @value: a valid #GValue whose type is derived from %G_TYPE_FLAGS + * @v_flags: flags value to be set + * + * Set the contents of a %G_TYPE_FLAGS #GValue to @v_flags. + */ +void +g_value_set_flags (GValue *value, + guint v_flags) +{ + g_return_if_fail (G_VALUE_HOLDS_FLAGS (value)); + + value->data[0].v_ulong = v_flags; +} + +/** + * g_value_get_flags: + * @value: a valid #GValue whose type is derived from %G_TYPE_FLAGS + * + * Get the contents of a %G_TYPE_FLAGS #GValue. + * + * Returns: flags contents of @value + */ +guint +g_value_get_flags (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_FLAGS (value), 0); + + return value->data[0].v_ulong; +} + +#define __G_ENUMS_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/genums.h b/gobject/genums.h new file mode 100644 index 0000000..bf8a419 --- /dev/null +++ b/gobject/genums.h @@ -0,0 +1,261 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_ENUMS_H__ +#define __G_ENUMS_H__ + +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +/** + * G_TYPE_IS_ENUM: + * @type: a #GType ID. + * + * Checks whether @type "is a" %G_TYPE_ENUM. + * + * Returns: %TRUE if @type "is a" %G_TYPE_ENUM. + */ +#define G_TYPE_IS_ENUM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_ENUM) +/** + * G_ENUM_CLASS: + * @class: a valid #GEnumClass + * + * Casts a derived #GEnumClass structure into a #GEnumClass structure. + */ +#define G_ENUM_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_ENUM, GEnumClass)) +/** + * G_IS_ENUM_CLASS: + * @class: a #GEnumClass + * + * Checks whether @class "is a" valid #GEnumClass structure of type %G_TYPE_ENUM + * or derived. + */ +#define G_IS_ENUM_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_ENUM)) +/** + * G_ENUM_CLASS_TYPE: + * @class: a #GEnumClass + * + * Get the type identifier from a given #GEnumClass structure. + * + * Returns: the #GType + */ +#define G_ENUM_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class)) +/** + * G_ENUM_CLASS_TYPE_NAME: + * @class: a #GEnumClass + * + * Get the static type name from a given #GEnumClass structure. + * + * Returns: the type name. + */ +#define G_ENUM_CLASS_TYPE_NAME(class) (g_type_name (G_ENUM_CLASS_TYPE (class))) + + +/** + * G_TYPE_IS_FLAGS: + * @type: a #GType ID. + * + * Checks whether @type "is a" %G_TYPE_FLAGS. + * + * Returns: %TRUE if @type "is a" %G_TYPE_FLAGS. + */ +#define G_TYPE_IS_FLAGS(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_FLAGS) +/** + * G_FLAGS_CLASS: + * @class: a valid #GFlagsClass + * + * Casts a derived #GFlagsClass structure into a #GFlagsClass structure. + */ +#define G_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_FLAGS, GFlagsClass)) +/** + * G_IS_FLAGS_CLASS: + * @class: a #GFlagsClass + * + * Checks whether @class "is a" valid #GFlagsClass structure of type %G_TYPE_FLAGS + * or derived. + */ +#define G_IS_FLAGS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_FLAGS)) +/** + * G_FLAGS_CLASS_TYPE: + * @class: a #GFlagsClass + * + * Get the type identifier from a given #GFlagsClass structure. + * + * Returns: the #GType + */ +#define G_FLAGS_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class)) +/** + * G_FLAGS_CLASS_TYPE_NAME: + * @class: a #GFlagsClass + * + * Get the static type name from a given #GFlagsClass structure. + * + * Returns: the type name. + */ +#define G_FLAGS_CLASS_TYPE_NAME(class) (g_type_name (G_FLAGS_CLASS_TYPE (class))) + + +/** + * G_VALUE_HOLDS_ENUM: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values derived from type %G_TYPE_ENUM. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_ENUM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ENUM)) +/** + * G_VALUE_HOLDS_FLAGS: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values derived from type %G_TYPE_FLAGS. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_FLAGS(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLAGS)) + + +/* --- enum/flag values & classes --- */ +typedef struct _GEnumClass GEnumClass; +typedef struct _GFlagsClass GFlagsClass; +typedef struct _GEnumValue GEnumValue; +typedef struct _GFlagsValue GFlagsValue; + +/** + * GEnumClass: + * @g_type_class: the parent class + * @minimum: the smallest possible value. + * @maximum: the largest possible value. + * @n_values: the number of possible values. + * @values: an array of #GEnumValue structs describing the + * individual values. + * + * The class of an enumeration type holds information about its + * possible values. + */ +struct _GEnumClass +{ + GTypeClass g_type_class; + + /*< public >*/ + gint minimum; + gint maximum; + guint n_values; + GEnumValue *values; +}; +/** + * GFlagsClass: + * @g_type_class: the parent class + * @mask: a mask covering all possible values. + * @n_values: the number of possible values. + * @values: an array of #GFlagsValue structs describing the + * individual values. + * + * The class of a flags type holds information about its + * possible values. + */ +struct _GFlagsClass +{ + GTypeClass g_type_class; + + /*< public >*/ + guint mask; + guint n_values; + GFlagsValue *values; +}; +/** + * GEnumValue: + * @value: the enum value + * @value_name: the name of the value + * @value_nick: the nickname of the value + * + * A structure which contains a single enum value, its name, and its + * nickname. + */ +struct _GEnumValue +{ + gint value; + const gchar *value_name; + const gchar *value_nick; +}; +/** + * GFlagsValue: + * @value: the flags value + * @value_name: the name of the value + * @value_nick: the nickname of the value + * + * A structure which contains a single flags value, its name, and its + * nickname. + */ +struct _GFlagsValue +{ + guint value; + const gchar *value_name; + const gchar *value_nick; +}; + + +/* --- prototypes --- */ +GEnumValue* g_enum_get_value (GEnumClass *enum_class, + gint value); +GEnumValue* g_enum_get_value_by_name (GEnumClass *enum_class, + const gchar *name); +GEnumValue* g_enum_get_value_by_nick (GEnumClass *enum_class, + const gchar *nick); +GFlagsValue* g_flags_get_first_value (GFlagsClass *flags_class, + guint value); +GFlagsValue* g_flags_get_value_by_name (GFlagsClass *flags_class, + const gchar *name); +GFlagsValue* g_flags_get_value_by_nick (GFlagsClass *flags_class, + const gchar *nick); +void g_value_set_enum (GValue *value, + gint v_enum); +gint g_value_get_enum (const GValue *value); +void g_value_set_flags (GValue *value, + guint v_flags); +guint g_value_get_flags (const GValue *value); + + + +/* --- registration functions --- */ +/* const_static_values is a NULL terminated array of enum/flags + * values that is taken over! + */ +GType g_enum_register_static (const gchar *name, + const GEnumValue *const_static_values); +GType g_flags_register_static (const gchar *name, + const GFlagsValue *const_static_values); +/* functions to complete the type information + * for enums/flags implemented by plugins + */ +void g_enum_complete_type_info (GType g_enum_type, + GTypeInfo *info, + const GEnumValue *const_values); +void g_flags_complete_type_info (GType g_flags_type, + GTypeInfo *info, + const GFlagsValue *const_values); + +G_END_DECLS + +#endif /* __G_ENUMS_H__ */ diff --git a/gobject/glib-genmarshal.1 b/gobject/glib-genmarshal.1 new file mode 100644 index 0000000..f0adfaa --- /dev/null +++ b/gobject/glib-genmarshal.1 @@ -0,0 +1,212 @@ +.TH GLIB-GENMARSHAL 1 "18 Oct 2000" +.SH NAME +glib-genmarshal \- C code marshaller generation utility for GLib closures +.SH SYNOPSIS + +\fBglib-genmarshal\fP [\fIoptions\fP] [\fIfiles...\fP] + +.SH DESCRIPTION +\fBglib-genmarshal\fP is a small utility that generates C code marshallers +for callback functions of the GClosure mechanism in the GObject sublibrary +of GLib. The marshaller functions have a standard signature, they get passed +in the invoking closure, an array of value structures holding the callback +function parameters and a value structure for the return value of the +callback. The marshaller is then responsible to call the respective C code +function of the closure with all the parameters on the stack and to collect +its return value. + +.SH INVOCATION + +\fBglib-genmarshal\fP takes a list of marshallers to generate as input. +The marshaller list is either read from standard input or from files +passed as additional arguments on the command line. + +.SS Options +.TP +\fI--header +Generate header file contents of the marshallers. +.TP +\fI--body +Generate C code file contents of the marshallers. +.TP +\fI--prefix=string, --prefix string +Specify marshaller prefix. The default prefix is `\fIg_cclosure_marshal\fP'. +.TP +\fI--skip-source +Skip source location remarks in generated comments. +.TP +\fI--nostdinc +Do not use the standard marshallers of the GObject library, and skip +gmarshal.h include directive in generated header files. +.TP +\fI--internal +Mark generated function as internal by using the G_GNUC_INTERNAL macro. +.TP +\fI--g-fatal-warnings +Make warnings fatal, that is, exit immediately once a warning occurs. +.TP +\fI-h, --help\fP +Print brief help and exit. +.TP +\fI-v, --version\fP +Print version and exit. +.PP + +.SS Marshaller list format +.PP +The marshaller lists are processed line by line, a line can contain a +comment in the form of +.RS +.PP +# this is a comment +.PP +.RE +or a marshaller specification of the form +.RS +.PP +\fIRTYPE\fP:\fBPTYPE\fP +.PP +\fIRTYPE\fP:\fBPTYPE\fP,\fBPTYPE\fP +.PP +\fIRTYPE\fP:\fBPTYPE\fP,\fBPTYPE\fP,\fBPTYPE\fP +.PP +# up to 16 \fBPTYPE\fPs may be present +.PP +.RE +The \fIRTYPE\fP part specifies the callback's return type and +the \fBPTYPE\fPs right to the colon specify the callback's +parameter list, except for the first and the last arguments which +are always pointers. +.PP + +.SS Parameter types +Currently, the following types are supported: +.TP 12 +\fIVOID +indicates no return type, or no extra parameters. if \fIVOID\fP is used as +the parameter list, no additional parameters may be present. +.TP 12 +\fIBOOLEAN +for boolean types (gboolean) +.TP 12 +\fICHAR +for signed char types (gchar) +.TP 12 +\fIUCHAR +for unsigned char types (guchar) +.TP 12 +\fIINT +for signed integer types (gint) +.TP 12 +\fIUINT +for unsigned integer types (guint) +.TP 12 +\fILONG +for signed long integer types (glong) +.TP 12 +\fIULONG +for unsigned long integer types (gulong) +.TP 12 +\fIINT64 +for signed 64bit integer types (gint64) +.TP 12 +\fIUINT64 +for unsigned 64bit integer types (guint64) +.TP 12 +\fIENUM +for enumeration types (gint) +.TP 12 +\fIFLAGS +for flag enumeration types (guint) +.TP 12 +\fIFLOAT +for single-precision float types (gfloat) +.TP 12 +\fIDOUBLE +for double-precision float types (gdouble) +.TP 12 +\fISTRING +for string types (gchar*) +.TP 12 +\fIBOXED +for boxed (anonymous but reference counted) types (GBoxed*) +.TP 12 +\fIPARAM +for GParamSpec or derived types (GParamSpec*) +.TP 12 +\fIPOINTER +for anonymous pointer types (gpointer) +.TP 12 +\fIOBJECT +for GObject or derived types (GObject*) +.TP 12 +\fINONE +deprecated alias for \fIVOID\fP +.TP 12 +\fIBOOL +deprecated alias for \fIBOOLEAN\fP + +.SH EXAMPLE +To generate marshallers for the following callback functions: +.PP +.RS +.nf +void foo (gpointer data1, + gpointer data2); +void bar (gpointer data1, + gint param1, + gpointer data2); +gfloat baz (gpointer data1, + gboolean param1, + guchar param2, + gpointer data2); +.fi +.RE +.PP +The marshaller list has to look like this: +.PP +.RS +.nf +VOID:VOID +VOID:INT +FLOAT:BOOLEAN,UCHAR +.fi +.RE +.PP +The generated marshallers have the arguments encoded +in their function name. For this particular list, they +are +g_cclosure_marshal_VOID__VOID(), +g_cclosure_marshal_VOID__INT(), +g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR(). +.PP +They can be used directly for GClosures or be passed in as +the GSignalCMarshaller c_marshaller; argument upon creation +of signals: +.PP +.nf +GClosure *cc_foo, *cc_bar, *cc_baz; + +cc_foo = g_cclosure_new (NULL, foo, NULL); +g_closure_set_marshal (cc_foo, g_cclosure_marshal_VOID__VOID); +cc_bar = g_cclosure_new (NULL, bar, NULL); +g_closure_set_marshal (cc_bar, g_cclosure_marshal_VOID__INT); +cc_baz = g_cclosure_new (NULL, baz, NULL); +g_closure_set_marshal (cc_baz, g_cclosure_marshal_FLOAT__BOOLEAN_UCHAR); +.fi +.PP + + +.SH SEE ALSO +\fB +glib-mkenums(1) +\fP + +.SH BUGS +None known yet. + +.SH AUTHOR +.B glib-genmarshal +has been written by Tim Janik . +.PP +This manual page was provided by Tim Janik . diff --git a/gobject/glib-genmarshal.c b/gobject/glib-genmarshal.c new file mode 100644 index 0000000..f96f466 --- /dev/null +++ b/gobject/glib-genmarshal.c @@ -0,0 +1,892 @@ +/* GLIB-GenMarshal - Marshaller generator for GObject library + * Copyright (C) 2000-2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "GLib-Genmarshal" +#include +#include + +#ifdef G_OS_WIN32 +#include +#endif + +/* --- defines --- */ +#define PRG_NAME "glib-genmarshal" +#define PKG_NAME "GLib" +#define PKG_HTTP_HOME "http://www.gtk.org" + + +/* --- typedefs & structures --- */ +typedef struct +{ + gchar *keyword; /* marhaller list keyword [MY_STRING] */ + const gchar *sig_name; /* signature name [STRING] */ + const gchar *ctype; /* C type name [gchar*] */ + const gchar *getter; /* value getter function [g_value_get_string] */ +} InArgument; +typedef struct +{ + gchar *keyword; /* marhaller list keyword [MY_STRING] */ + const gchar *sig_name; /* signature name [STRING] */ + const gchar *ctype; /* C type name [gchar*] */ + const gchar *setter; /* value setter function [g_value_set_string] */ +} OutArgument; +typedef struct +{ + gchar *ploc; + OutArgument *rarg; + GList *args; /* of type InArgument* */ +} Signature; + + +/* --- prototypes --- */ +static void parse_args (gint *argc_p, + gchar ***argv_p); +static void print_blurb (FILE *bout, + gboolean print_help); + + +/* --- variables --- */ +static const GScannerConfig scanner_config_template = +{ + ( + " \t\r" /* "\n" is statement delimiter */ + ) /* cset_skip_characters */, + ( + G_CSET_a_2_z + "_" + G_CSET_A_2_Z + ) /* cset_identifier_first */, + ( + G_CSET_a_2_z + "_0123456789" + G_CSET_A_2_Z + ) /* cset_identifier_nth */, + ( "#\n" ) /* cpair_comment_single */, + + FALSE /* case_sensitive */, + + TRUE /* skip_comment_multi */, + TRUE /* skip_comment_single */, + TRUE /* scan_comment_multi */, + TRUE /* scan_identifier */, + FALSE /* scan_identifier_1char */, + FALSE /* scan_identifier_NULL */, + TRUE /* scan_symbols */, + FALSE /* scan_binary */, + TRUE /* scan_octal */, + TRUE /* scan_float */, + TRUE /* scan_hex */, + FALSE /* scan_hex_dollar */, + TRUE /* scan_string_sq */, + TRUE /* scan_string_dq */, + TRUE /* numbers_2_int */, + FALSE /* int_2_float */, + FALSE /* identifier_2_string */, + TRUE /* char_2_token */, + FALSE /* symbol_2_token */, + FALSE /* scope_0_fallback */, +}; +static gchar * const std_marshaller_prefix = "g_cclosure_marshal"; +static gchar *marshaller_prefix = "g_cclosure_user_marshal"; +static GHashTable *marshallers = NULL; +static FILE *fout = NULL; +static gboolean gen_cheader = FALSE; +static gboolean gen_cbody = FALSE; +static gboolean gen_internal = FALSE; +static gboolean skip_ploc = FALSE; +static gboolean std_includes = TRUE; +static gint exit_status = 0; + + +/* --- functions --- */ +static void +put_marshal_value_getters (void) +{ + fputs ("\n", fout); + fputs ("#ifdef G_ENABLE_DEBUG\n", fout); + fputs ("#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)\n", fout); + fputs ("#define g_marshal_value_peek_char(v) g_value_get_char (v)\n", fout); + fputs ("#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)\n", fout); + fputs ("#define g_marshal_value_peek_int(v) g_value_get_int (v)\n", fout); + fputs ("#define g_marshal_value_peek_uint(v) g_value_get_uint (v)\n", fout); + fputs ("#define g_marshal_value_peek_long(v) g_value_get_long (v)\n", fout); + fputs ("#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)\n", fout); + fputs ("#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)\n", fout); + fputs ("#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)\n", fout); + fputs ("#define g_marshal_value_peek_enum(v) g_value_get_enum (v)\n", fout); + fputs ("#define g_marshal_value_peek_flags(v) g_value_get_flags (v)\n", fout); + fputs ("#define g_marshal_value_peek_float(v) g_value_get_float (v)\n", fout); + fputs ("#define g_marshal_value_peek_double(v) g_value_get_double (v)\n", fout); + fputs ("#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)\n", fout); + fputs ("#define g_marshal_value_peek_param(v) g_value_get_param (v)\n", fout); + fputs ("#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)\n", fout); + fputs ("#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)\n", fout); + fputs ("#define g_marshal_value_peek_object(v) g_value_get_object (v)\n", fout); + fputs ("#else /* !G_ENABLE_DEBUG */\n", fout); + fputs ("/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.\n", fout); + fputs (" * Do not access GValues directly in your code. Instead, use the\n", fout); + fputs (" * g_value_get_*() functions\n", fout); + fputs (" */\n", fout); + fputs ("#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int\n", fout); + fputs ("#define g_marshal_value_peek_char(v) (v)->data[0].v_int\n", fout); + fputs ("#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint\n", fout); + fputs ("#define g_marshal_value_peek_int(v) (v)->data[0].v_int\n", fout); + fputs ("#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint\n", fout); + fputs ("#define g_marshal_value_peek_long(v) (v)->data[0].v_long\n", fout); + fputs ("#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong\n", fout); + fputs ("#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64\n", fout); + fputs ("#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64\n", fout); + fputs ("#define g_marshal_value_peek_enum(v) (v)->data[0].v_long\n", fout); + fputs ("#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong\n", fout); + fputs ("#define g_marshal_value_peek_float(v) (v)->data[0].v_float\n", fout); + fputs ("#define g_marshal_value_peek_double(v) (v)->data[0].v_double\n", fout); + fputs ("#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer\n", fout); + fputs ("#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer\n", fout); + fputs ("#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer\n", fout); + fputs ("#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer\n", fout); + fputs ("#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer\n", fout); + fputs ("#endif /* !G_ENABLE_DEBUG */\n", fout); + fputs ("\n", fout); +} + +static gboolean +complete_in_arg (InArgument *iarg) +{ + static const InArgument args[] = { + /* keyword sig_name ctype getter */ + { "VOID", "VOID", "void", NULL, }, + { "BOOLEAN", "BOOLEAN", "gboolean", "g_marshal_value_peek_boolean", }, + { "CHAR", "CHAR", "gchar", "g_marshal_value_peek_char", }, + { "UCHAR", "UCHAR", "guchar", "g_marshal_value_peek_uchar", }, + { "INT", "INT", "gint", "g_marshal_value_peek_int", }, + { "UINT", "UINT", "guint", "g_marshal_value_peek_uint", }, + { "LONG", "LONG", "glong", "g_marshal_value_peek_long", }, + { "ULONG", "ULONG", "gulong", "g_marshal_value_peek_ulong", }, + { "INT64", "INT64", "gint64", "g_marshal_value_peek_int64", }, + { "UINT64", "UINT64", "guint64", "g_marshal_value_peek_uint64", }, + { "ENUM", "ENUM", "gint", "g_marshal_value_peek_enum", }, + { "FLAGS", "FLAGS", "guint", "g_marshal_value_peek_flags", }, + { "FLOAT", "FLOAT", "gfloat", "g_marshal_value_peek_float", }, + { "DOUBLE", "DOUBLE", "gdouble", "g_marshal_value_peek_double", }, + { "STRING", "STRING", "gpointer", "g_marshal_value_peek_string", }, + { "PARAM", "PARAM", "gpointer", "g_marshal_value_peek_param", }, + { "BOXED", "BOXED", "gpointer", "g_marshal_value_peek_boxed", }, + { "POINTER", "POINTER", "gpointer", "g_marshal_value_peek_pointer", }, + { "OBJECT", "OBJECT", "gpointer", "g_marshal_value_peek_object", }, + /* deprecated: */ + { "NONE", "VOID", "void", NULL, }, + { "BOOL", "BOOLEAN", "gboolean", "g_marshal_value_peek_boolean", }, + }; + guint i; + + g_return_val_if_fail (iarg != NULL, FALSE); + + for (i = 0; i < G_N_ELEMENTS (args); i++) + if (strcmp (args[i].keyword, iarg->keyword) == 0) + { + iarg->sig_name = args[i].sig_name; + iarg->ctype = args[i].ctype; + iarg->getter = args[i].getter; + + return TRUE; + } + return FALSE; +} + +static gboolean +complete_out_arg (OutArgument *oarg) +{ + static const OutArgument args[] = { + /* keyword sig_name ctype setter */ + { "VOID", "VOID", "void", NULL, }, + { "BOOLEAN", "BOOLEAN", "gboolean", "g_value_set_boolean", }, + { "CHAR", "CHAR", "gchar", "g_value_set_char", }, + { "UCHAR", "UCHAR", "guchar", "g_value_set_uchar", }, + { "INT", "INT", "gint", "g_value_set_int", }, + { "UINT", "UINT", "guint", "g_value_set_uint", }, + { "LONG", "LONG", "glong", "g_value_set_long", }, + { "ULONG", "ULONG", "gulong", "g_value_set_ulong", }, + { "INT64", "INT64", "gint64", "g_value_set_int64", }, + { "UINT64", "UINT64", "guint64", "g_value_set_uint64", }, + { "ENUM", "ENUM", "gint", "g_value_set_enum", }, + { "FLAGS", "FLAGS", "guint", "g_value_set_flags", }, + { "FLOAT", "FLOAT", "gfloat", "g_value_set_float", }, + { "DOUBLE", "DOUBLE", "gdouble", "g_value_set_double", }, + { "STRING", "STRING", "gchar*", "g_value_take_string", }, + { "PARAM", "PARAM", "GParamSpec*", "g_value_take_param", }, + { "BOXED", "BOXED", "gpointer", "g_value_take_boxed", }, + { "POINTER", "POINTER", "gpointer", "g_value_set_pointer", }, + { "OBJECT", "OBJECT", "GObject*", "g_value_take_object", }, + /* deprecated: */ + { "NONE", "VOID", "void", NULL, }, + { "BOOL", "BOOLEAN", "gboolean", "g_value_set_boolean", }, + }; + guint i; + + g_return_val_if_fail (oarg != NULL, FALSE); + + for (i = 0; i < G_N_ELEMENTS (args); i++) + if (strcmp (args[i].keyword, oarg->keyword) == 0) + { + oarg->sig_name = args[i].sig_name; + oarg->ctype = args[i].ctype; + oarg->setter = args[i].setter; + + return TRUE; + } + return FALSE; +} + +static const gchar* +pad (const gchar *string) +{ +#define PAD_LENGTH 12 + static gchar *buffer = NULL; + gint i; + + g_return_val_if_fail (string != NULL, NULL); + + if (!buffer) + buffer = g_new (gchar, PAD_LENGTH + 1); + + /* paranoid check */ + if (strlen (string) >= PAD_LENGTH) + { + g_free (buffer); + buffer = g_strdup_printf ("%s ", string); + g_warning ("overfull string (%u bytes) for padspace", + (guint) strlen (string)); + exit_status |= 2; + + return buffer; + } + + for (i = 0; i < PAD_LENGTH; i++) + { + gboolean done = *string == 0; + + buffer[i] = done ? ' ' : *string++; + } + buffer[i] = 0; + + return buffer; +} + +static const gchar* +indent (guint n_spaces) +{ + static gchar *buffer = NULL; + static guint blength = 0; + + if (blength <= n_spaces) + { + blength = n_spaces + 1; + g_free (buffer); + buffer = g_new (gchar, blength); + } + memset (buffer, ' ', n_spaces); + buffer[n_spaces] = 0; + + return buffer; +} + +static void +generate_marshal (const gchar *signame, + Signature *sig) +{ + guint ind, a; + GList *node; + gchar *tmp = g_strconcat (marshaller_prefix, "_", signame, NULL); + gboolean have_std_marshaller = FALSE; + + /* here we have to make sure a marshaller named _ + * exists. we might have put it out already, can revert to a standard + * marshaller provided by glib, or need to generate one. + */ + + if (g_hash_table_lookup (marshallers, tmp)) + { + /* done, marshaller already generated */ + g_free (tmp); + return; + } + else + { + /* need to alias/generate marshaller, register name */ + g_hash_table_insert (marshallers, tmp, tmp); + } + + /* can we revert to a standard marshaller? */ + if (std_includes) + { + tmp = g_strconcat (std_marshaller_prefix, "_", signame, NULL); + have_std_marshaller = g_hash_table_lookup (marshallers, tmp) != NULL; + g_free (tmp); + } + + if (gen_cheader && have_std_marshaller) + { + g_fprintf (fout, "#define %s_%s\t%s_%s\n", marshaller_prefix, signame, std_marshaller_prefix, signame); + } + if (gen_cheader && !have_std_marshaller) + { + ind = g_fprintf (fout, gen_internal ? "G_GNUC_INTERNAL " : "extern "); + ind += g_fprintf (fout, "void "); + ind += g_fprintf (fout, "%s_%s (", marshaller_prefix, signame); + g_fprintf (fout, "GClosure *closure,\n"); + g_fprintf (fout, "%sGValue *return_value,\n", indent (ind)); + g_fprintf (fout, "%sguint n_param_values,\n", indent (ind)); + g_fprintf (fout, "%sconst GValue *param_values,\n", indent (ind)); + g_fprintf (fout, "%sgpointer invocation_hint,\n", indent (ind)); + g_fprintf (fout, "%sgpointer marshal_data);\n", + indent (ind)); + } + if (gen_cbody && !have_std_marshaller) + { + /* cfile marshal header */ + g_fprintf (fout, "void\n"); + ind = g_fprintf (fout, "%s_%s (", marshaller_prefix, signame); + g_fprintf (fout, "GClosure *closure,\n"); + g_fprintf (fout, "%sGValue *return_value G_GNUC_UNUSED,\n", indent (ind)); + g_fprintf (fout, "%sguint n_param_values,\n", indent (ind)); + g_fprintf (fout, "%sconst GValue *param_values,\n", indent (ind)); + g_fprintf (fout, "%sgpointer invocation_hint G_GNUC_UNUSED,\n", indent (ind)); + g_fprintf (fout, "%sgpointer marshal_data)\n", indent (ind)); + g_fprintf (fout, "{\n"); + + /* cfile GMarshalFunc typedef */ + ind = g_fprintf (fout, " typedef %s (*GMarshalFunc_%s) (", sig->rarg->ctype, signame); + g_fprintf (fout, "%s data1,\n", pad ("gpointer")); + for (a = 1, node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + g_fprintf (fout, "%s%s arg_%d,\n", indent (ind), pad (iarg->ctype), a++); + } + g_fprintf (fout, "%s%s data2);\n", indent (ind), pad ("gpointer")); + + /* cfile marshal variables */ + g_fprintf (fout, " register GMarshalFunc_%s callback;\n", signame); + g_fprintf (fout, " register GCClosure *cc = (GCClosure*) closure;\n"); + g_fprintf (fout, " register gpointer data1, data2;\n"); + if (sig->rarg->setter) + g_fprintf (fout, " %s v_return;\n", sig->rarg->ctype); + + if (sig->args || sig->rarg->setter) + { + g_fprintf (fout, "\n"); + + if (sig->rarg->setter) + g_fprintf (fout, " g_return_if_fail (return_value != NULL);\n"); + if (sig->args) + { + for (a = 0, node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + a++; + } + g_fprintf (fout, " g_return_if_fail (n_param_values == %u);\n", 1 + a); + } + } + + /* cfile marshal data1, data2 and callback setup */ + g_fprintf (fout, "\n"); + g_fprintf (fout, " if (G_CCLOSURE_SWAP_DATA (closure))\n {\n"); + g_fprintf (fout, " data1 = closure->data;\n"); + g_fprintf (fout, " data2 = g_value_peek_pointer (param_values + 0);\n"); + g_fprintf (fout, " }\n else\n {\n"); + g_fprintf (fout, " data1 = g_value_peek_pointer (param_values + 0);\n"); + g_fprintf (fout, " data2 = closure->data;\n"); + g_fprintf (fout, " }\n"); + g_fprintf (fout, " callback = (GMarshalFunc_%s) (marshal_data ? marshal_data : cc->callback);\n", signame); + + /* cfile marshal callback action */ + g_fprintf (fout, "\n"); + ind = g_fprintf (fout, " %s callback (", sig->rarg->setter ? " v_return =" : ""); + g_fprintf (fout, "data1,\n"); + for (a = 1, node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + g_fprintf (fout, "%s%s (param_values + %d),\n", indent (ind), iarg->getter, a++); + } + g_fprintf (fout, "%sdata2);\n", indent (ind)); + + /* cfile marshal return value storage */ + if (sig->rarg->setter) + { + g_fprintf (fout, "\n"); + g_fprintf (fout, " %s (return_value, v_return);\n", sig->rarg->setter); + } + + /* cfile marshal footer */ + g_fprintf (fout, "}\n"); + } +} + +static void +process_signature (Signature *sig) +{ + gchar *pname, *sname, *tmp; + GList *node; + + /* lookup and complete info on arguments */ + if (!complete_out_arg (sig->rarg)) + { + g_warning ("unknown type: %s", sig->rarg->keyword); + exit_status |= 1; + return; + } + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (!complete_in_arg (iarg)) + { + g_warning ("unknown type: %s", iarg->keyword); + exit_status |= 1; + return; + } + } + + /* construct requested marshaller name and technical marshaller name */ + pname = g_strconcat (sig->rarg->keyword, "_", NULL); + sname = g_strconcat (sig->rarg->sig_name, "_", NULL); + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + gchar *tmp; + + tmp = sname; + sname = g_strconcat (tmp, "_", iarg->sig_name, NULL); + g_free (tmp); + tmp = pname; + pname = g_strconcat (tmp, "_", iarg->keyword, NULL); + g_free (tmp); + } + + /* introductionary comment */ + g_fprintf (fout, "\n/* %s", sig->rarg->keyword); + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + g_fprintf (fout, "%c%s", node->prev ? ',' : ':', iarg->keyword); + } + if (!skip_ploc) + g_fprintf (fout, " (%s)", sig->ploc); + g_fprintf (fout, " */\n"); + + /* ensure technical marshaller exists (_) */ + generate_marshal (sname, sig); + + /* put out marshaller alias for requested name if required (_) */ + tmp = g_strconcat (marshaller_prefix, "_", pname, NULL); + if (gen_cheader && !g_hash_table_lookup (marshallers, tmp)) + { + g_fprintf (fout, "#define %s_%s\t%s_%s\n", marshaller_prefix, pname, marshaller_prefix, sname); + + g_hash_table_insert (marshallers, tmp, tmp); + } + else + g_free (tmp); + + g_free (pname); + g_free (sname); +} + +static InArgument* +new_in_arg (const gchar *pname) +{ + InArgument *iarg = g_new0 (InArgument, 1); + + iarg->keyword = g_strdup (pname); + + return iarg; +} + +static OutArgument* +new_out_arg (const gchar *pname) +{ + OutArgument *oarg = g_new0 (OutArgument, 1); + + oarg->keyword = g_strdup (pname); + + return oarg; +} + +static guint +parse_line (GScanner *scanner, + Signature *sig) +{ + /* parse identifier for return value */ + if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER) + return G_TOKEN_IDENTIFIER; + sig->rarg = new_out_arg (scanner->value.v_identifier); + + /* keep a note on the location */ + sig->ploc = g_strdup_printf ("%s:%u", scanner->input_name, scanner->line); + + /* expect ':' */ + if (g_scanner_get_next_token (scanner) != ':') + return ':'; + + /* parse first argument */ + if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER) + return G_TOKEN_IDENTIFIER; + sig->args = g_list_append (sig->args, new_in_arg (scanner->value.v_identifier)); + + /* parse rest of argument list */ + while (g_scanner_peek_next_token (scanner) == ',') + { + /* eat comma */ + g_scanner_get_next_token (scanner); + + /* parse arg identifier */ + if (g_scanner_get_next_token (scanner) != G_TOKEN_IDENTIFIER) + return G_TOKEN_IDENTIFIER; + sig->args = g_list_append (sig->args, new_in_arg (scanner->value.v_identifier)); + } + + /* expect end of line, done */ + if (g_scanner_get_next_token (scanner) != '\n') + return '\n'; + + /* success */ + return G_TOKEN_NONE; +} + +static gboolean +string_key_destroy (gpointer key, + gpointer value, + gpointer user_data) +{ + g_free (key); + + return TRUE; +} + +int +main (int argc, + char *argv[]) +{ + const gchar *gobject_marshallers[] = { +#include "gmarshal.strings" + }; + GScanner *scanner; + GSList *slist, *files = NULL; + gint i; + + /* parse args and do fast exits */ + parse_args (&argc, &argv); + + /* list input files */ + for (i = 1; i < argc; i++) + files = g_slist_prepend (files, argv[i]); + if (files) + files = g_slist_reverse (files); + else + files = g_slist_prepend (files, "/dev/stdin"); + + /* setup auxillary structs */ + scanner = g_scanner_new (&scanner_config_template); + fout = stdout; + marshallers = g_hash_table_new (g_str_hash, g_str_equal); + + /* add standard marshallers of the GObject library */ + if (std_includes) + for (i = 0; i < G_N_ELEMENTS (gobject_marshallers); i++) + { + gchar *tmp = g_strdup (gobject_marshallers[i]); + + g_hash_table_insert (marshallers, tmp, tmp); + } + + /* put out initial heading */ + g_fprintf (fout, "\n"); + + if (gen_cheader && std_includes) + { + g_fprintf (fout, "#ifndef __%s_MARSHAL_H__\n", marshaller_prefix); + g_fprintf (fout, "#define __%s_MARSHAL_H__\n\n", marshaller_prefix); + } + + if ((gen_cheader || gen_cbody) && std_includes) + g_fprintf (fout, "#include\t\n\n"); + + if (gen_cheader) + g_fprintf (fout, "G_BEGIN_DECLS\n"); + + /* generate necessary preprocessor directives */ + if (gen_cbody) + put_marshal_value_getters (); + + /* process input files */ + for (slist = files; slist; slist = slist->next) + { + gchar *file = slist->data; + gint fd; + + if (strcmp (file, "/dev/stdin") == 0) + /* Mostly for Win32. This is equivalent to opening /dev/stdin */ + fd = dup (0); + else + fd = open (file, O_RDONLY); + + if (fd < 0) + { + g_warning ("failed to open \"%s\": %s", file, g_strerror (errno)); + exit_status |= 1; + continue; + } + + /* set file name for error reports */ + scanner->input_name = file; + + /* parse & process file */ + g_scanner_input_file (scanner, fd); + + /* scanning loop, we parse the input until its end is reached, + * or our sub routine came across invalid syntax + */ + do + { + guint expected_token = G_TOKEN_NONE; + + switch (g_scanner_peek_next_token (scanner)) + { + case '\n': + /* eat newline and restart */ + g_scanner_get_next_token (scanner); + continue; + case G_TOKEN_EOF: + /* done */ + break; + default: + /* parse and process signatures */ + { + Signature signature = { NULL, NULL, NULL }; + GList *node; + + expected_token = parse_line (scanner, &signature); + + /* once we got a valid signature, process it */ + if (expected_token == G_TOKEN_NONE) + process_signature (&signature); + + /* clean up signature contents */ + g_free (signature.ploc); + if (signature.rarg) + g_free (signature.rarg->keyword); + g_free (signature.rarg); + for (node = signature.args; node; node = node->next) + { + InArgument *iarg = node->data; + + g_free (iarg->keyword); + g_free (iarg); + } + g_list_free (signature.args); + } + break; + } + + /* bail out on errors */ + if (expected_token != G_TOKEN_NONE) + { + g_scanner_unexp_token (scanner, expected_token, "type name", NULL, NULL, NULL, TRUE); + exit_status |= 1; + break; + } + + g_scanner_peek_next_token (scanner); + } + while (scanner->next_token != G_TOKEN_EOF); + + close (fd); + } + + /* put out trailer */ + if (gen_cheader) + { + g_fprintf (fout, "\nG_END_DECLS\n"); + + if (std_includes) + g_fprintf (fout, "\n#endif /* __%s_MARSHAL_H__ */\n", marshaller_prefix); + } + g_fprintf (fout, "\n"); + + /* clean up */ + g_slist_free (files); + g_scanner_destroy (scanner); + g_hash_table_foreach_remove (marshallers, string_key_destroy, NULL); + g_hash_table_destroy (marshallers); + + return exit_status; +} + +static void +parse_args (gint *argc_p, + gchar ***argv_p) +{ + guint argc = *argc_p; + gchar **argv = *argv_p; + guint i, e; + + for (i = 1; i < argc; i++) + { + if (strcmp ("--header", argv[i]) == 0) + { + gen_cheader = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--body", argv[i]) == 0) + { + gen_cbody = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--skip-source", argv[i]) == 0) + { + skip_ploc = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--nostdinc", argv[i]) == 0) + { + std_includes = FALSE; + argv[i] = NULL; + } + else if (strcmp ("--stdinc", argv[i]) == 0) + { + std_includes = TRUE; + argv[i] = NULL; + } + else if (strcmp ("--internal", argv[i]) == 0) + { + gen_internal = TRUE; + argv[i] = NULL; + } + else if ((strcmp ("--prefix", argv[i]) == 0) || + (strncmp ("--prefix=", argv[i], 9) == 0)) + { + gchar *equal = argv[i] + 8; + + if (*equal == '=') + marshaller_prefix = g_strdup (equal + 1); + else if (i + 1 < argc) + { + marshaller_prefix = g_strdup (argv[i + 1]); + argv[i] = NULL; + i += 1; + } + argv[i] = NULL; + } + else if (strcmp ("-h", argv[i]) == 0 || + strcmp ("-?", argv[i]) == 0 || + strcmp ("--help", argv[i]) == 0) + { + print_blurb (stderr, TRUE); + argv[i] = NULL; + exit (0); + } + else if (strcmp ("-v", argv[i]) == 0 || + strcmp ("--version", argv[i]) == 0) + { + print_blurb (stderr, FALSE); + argv[i] = NULL; + exit (0); + } + else if (strcmp (argv[i], "--g-fatal-warnings") == 0) + { + GLogLevelFlags fatal_mask; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + + argv[i] = NULL; + } + } + + e = 0; + for (i = 1; i < argc; i++) + { + if (e) + { + if (argv[i]) + { + argv[e++] = argv[i]; + argv[i] = NULL; + } + } + else if (!argv[i]) + e = i; + } + if (e) + *argc_p = e; +} + +static void +print_blurb (FILE *bout, + gboolean print_help) +{ + if (!print_help) + { + g_fprintf (bout, "%s version ", PRG_NAME); + g_fprintf (bout, "%u.%u.%u", GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + g_fprintf (bout, "\n"); + g_fprintf (bout, "%s comes with ABSOLUTELY NO WARRANTY.\n", PRG_NAME); + g_fprintf (bout, "You may redistribute copies of %s under the terms of\n", PRG_NAME); + g_fprintf (bout, "the GNU General Public License which can be found in the\n"); + g_fprintf (bout, "%s source package. Sources, examples and contact\n", PKG_NAME); + g_fprintf (bout, "information are available at %s\n", PKG_HTTP_HOME); + } + else + { + g_fprintf (bout, "Usage:\n"); + g_fprintf (bout, " %s [OPTION...] [FILES...]\n\n", PRG_NAME); + g_fprintf (bout, "Help Options:\n"); + g_fprintf (bout, " -h, --help Show this help message\n\n"); + g_fprintf (bout, "Utility Options:\n"); + g_fprintf (bout, " --header Generate C headers\n"); + g_fprintf (bout, " --body Generate C code\n"); + g_fprintf (bout, " --prefix=string Specify marshaller prefix\n"); + g_fprintf (bout, " --skip-source Skip source location comments\n"); + g_fprintf (bout, " --stdinc, --nostdinc Include/use standard marshallers\n"); + g_fprintf (bout, " --internal Mark generated functions as internal\n"); + g_fprintf (bout, " -v, --version Print version informations\n"); + g_fprintf (bout, " --g-fatal-warnings Make warnings fatal (abort)\n"); + } +} diff --git a/gobject/glib-mkenums.1 b/gobject/glib-mkenums.1 new file mode 100644 index 0000000..cacddff --- /dev/null +++ b/gobject/glib-mkenums.1 @@ -0,0 +1,169 @@ +.TH GLIB-MKENUMS 1 "27 Jul 2002" +.SH NAME +glib-mkenums \- C language enum description generation utility +.SH SYNOPSIS + +\fBglib-mkenums\fP [\fIoptions\fP] [\fIfiles...\fP] + +.SH DESCRIPTION +\fBglib-mkenums\fP is a small perl-script utility that parses C code to extract enum +definitions and produces enum descriptions based on text templates specified +by the user. Most frequently this script is used to produce C code that contains +enum values as strings so programs can provide value name strings for introspection. + +.SH INVOCATION + +\fBglib-mkenums\fP takes a list of valid C code files as input. The options +specified control the text that is output, certain substitutions are performed +on the text templates for keywords enclosed in @ characters. + + +.SS Options +.TP +\fI--fhead +Put out prior to processing input files. +.TP +\fI--fprod +Put out everytime a new input file is being processed. +.TP +\fI--ftail +Put out after all input files have been processed. +.TP +\fI--eprod +Put out everytime an enum is encountered in the input files. +.TP +\fI--vhead +Put out before iterating over the set of values of an enum. +.TP +\fI--vprod +Put out for every value of an enum. +.TP +\fI--vtail +Put out after iterating over all values of an enum. +.TP +\fI--comments +Template for auto-generated comments, the default (for C code generations) is +"/* @comment@ */". +.TP +\fI--template file +Read templates from the given file. The templates are enclosed in +specially-formatted C comments +.PP +.RS +.nf +/*** BEGIN section ***/ +/*** END section ***/ +.fi +.PP +where section may be file-header, file-production, file-tail, +enumeration-production, value-header, value-production, value-tail or +comment. +.TP +\fI-h, --help\fP +Print brief help and exit. +.TP +\fI-v, --version\fP +Print version and exit. +.PP + + +.SS Production text substitutions +Certain keywords enclosed in @ characters will be substituted in the outputted +text. For the substitution examples of the keywords below, the following example +enum definition is assumed: +.PP +.RS +.nf +typedef enum +{ + PREFIX_THE_XVALUE = 1 << 3, + PREFIX_ANOTHER_VALUE = 1 << 4 +} PrefixTheXEnum; +.fi +.RE + +.TP 12 +\fI@EnumName@ +The name of the enum currently being processed, enum names are assumed to be +properly namespaced and to use mixed capitalization to separate +words (e.g. PrefixTheXEnum). +.TP 12 +\fI@enum_name@ +The enum name with words lowercase and word-separated by underscores (e.g. prefix_the_xenum). +.TP 12 +\fI@ENUMNAME@ +The enum name with words uppercase and word-separated by underscores (e.g. PREFIX_THE_XENUM). +.TP 12 +\fI@ENUMSHORT@ +The enum name with words uppercase and word-separated by underscores, prefix stripped (e.g. THE_XENUM). +.TP 12 +\fI@VALUENAME@ +The enum value name currently being processed with words uppercase and word-separated by underscores, +this is the assumed literal notation of enum values in the C sources (e.g. PREFIX_THE_XVALUE). +.TP 12 +\fI@valuenick@ +A nick name for the enum value currently being processed, this is usually generated by stripping +common prefix words of all the enum values of the current enum, the words are lowercase and +underscores are substituted by a minus (e.g. the-xvalue). +.TP 12 +\fI@type@ +This is substituted either by "enum" or "flags", depending on whether the enum value definitions +contained bit-shift operators or not (e.g. flags). +.TP 12 +\fI@Type@ +The same as \fI@type@\fP with the first letter capitalized (e.g. Flags). +.TP 12 +\fI@TYPE@ +The same as \fI@type@\fP with all letters uppercased (e.g. FLAGS). +.TP 12 +\fI@filename@ +The name of the input file currently being processed (e.g. foo.h). +.TP 12 +\fI@basename@ +The base name of the input file currently being processed (e.g. foo.h). (Since: 2.22) + +.SS Trigraph extensions +Some C comments are treated specially in the parsed enum definitions, such comments +start out with the trigraph sequence "/*<" and end with the trigraph sequence ">*/". +.PP +Per enum definition, the options "skip" and "flags" can be specified, to indicate +this enum definition to be skipped, or for it to be treated as a flags definition, or +to specify the common prefix to be stripped from all values to generate value nicknames, +respectively. The "underscore_name" option can be used to specify the underscorized name +variant used in the *_get_type() function and *_TYPE_* macro. For instance, +/*< underscore_name=gnome_vfs_uri_hide_options >*/. +.PP +Per value definition, the options "skip" and "nick" are supported. The former causes the +value to be skipped, and the latter can be used to specify the otherwise auto-generated +nickname. +Examples: +.PP +.RS +.nf +typedef enum /*< skip >*/ +{ + PREFIX_FOO +} PrefixThisEnumWillBeSkipped; +typedef enum /*< flags,prefix=PREFIX >*/ +{ + PREFIX_THE_ZEROTH_VALUE, /*< skip >*/ + PREFIX_THE_FIRST_VALUE, + PREFIX_THE_SECOND_VALUE, + PREFIX_THE_THIRD_VALUE, /*< nick=the-last-value >*/ +} PrefixTheFlagsEnum; +.fi +.RE + +.SH SEE ALSO +\fB +glib-genmarshal(1) +\fP + +.SH BUGS +None known yet. + +.SH AUTHOR +.B glib-mkenums +was written by Tim Janik and Owen Taylor . +.PP +This manual page was provided by Tim Janik . diff --git a/gobject/glib-mkenums.in b/gobject/glib-mkenums.in new file mode 100755 index 0000000..6dcb474 --- /dev/null +++ b/gobject/glib-mkenums.in @@ -0,0 +1,511 @@ +#!@PERL_PATH@ -w + +use File::Basename; + +# glib-mkenums.pl +# Information about the current enumeration +my $flags; # Is enumeration a bitmask? +my $option_underscore_name; # Overriden underscore variant of the enum name + # for example to fix the cases we don't get the + # mixed-case -> underscorized transform right. +my $option_lowercase_name; # DEPRECATED. A lower case name to use as part + # of the *_get_type() function, instead of the + # one that we guess. For instance, when an enum + # uses abnormal capitalization and we can not + # guess where to put the underscores. +my $seenbitshift; # Have we seen bitshift operators? +my $enum_prefix; # Prefix for this enumeration +my $enumname; # Name for this enumeration +my $enumshort; # $enumname without prefix +my $enumname_prefix; # prefix of $enumname +my $enumindex = 0; # Global enum counter +my $firstenum = 1; # Is this the first enumeration per file? +my @entries; # [ $name, $val ] for each entry + +sub parse_trigraph { + my $opts = shift; + my @opts; + + for $opt (split /\s*,\s*/, $opts) { + $opt =~ s/^\s*//; + $opt =~ s/\s*$//; + my ($key,$val) = $opt =~ /(\w+)(?:=(.+))?/; + defined $val or $val = 1; + push @opts, $key, $val; + } + @opts; +} +sub parse_entries { + my $file = shift; + my $file_name = shift; + my $looking_for_name = 0; + + while (<$file>) { + # read lines until we have no open comments + while (m@/\*([^*]|\*(?!/))*$@) { + my $new; + defined ($new = <$file>) || die "Unmatched comment in $ARGV"; + $_ .= $new; + } + # strip comments w/o options + s@/\*(?!<) + ([^*]+|\*(?!/))* + \*/@@gx; + + # strip newlines + s@\n@ @; + + # skip empty lines + next if m@^\s*$@; + + if ($looking_for_name) { + if (/^\s*(\w+)/) { + $enumname = $1; + return 1; + } + } + + # Handle include files + if (/^\#include\s*<([^>]*)>/ ) { + my $file= "../$1"; + open NEWFILE, $file or die "Cannot open include file $file: $!\n"; + + if (parse_entries (\*NEWFILE, $NEWFILE)) { + return 1; + } else { + next; + } + } + + if (/^\s*\}\s*(\w+)/) { + $enumname = $1; + $enumindex++; + return 1; + } + + if (/^\s*\}/) { + $enumindex++; + $looking_for_name = 1; + next; + } + + if (m@^\s* + (\w+)\s* # name + (?:=( # value + \s*\w+\s*\(.*\)\s* # macro with multiple args + | # OR + (?:[^,/]|/(?!\*))* # anything but a comma or comment + ))?,?\s* + (?:/\*< # options + (([^*]|\*(?!/))*) + >\s*\*/)?,? + \s*$ + @x) { + my ($name, $value, $options) = ($1,$2,$3); + + if (!defined $flags && defined $value && $value =~ /< Output file header\n"; + print " --fprod Per input file production\n"; + print " --ftail Output file trailer\n"; + print " --eprod Per enum text (produced prior to value itarations)\n"; + print " --vhead Value header, produced before iterating over enum values\n"; + print " --vprod Value text, produced for each enum value\n"; + print " --vtail Value tail, produced after iterating over enum values\n"; + print " --comments Comment structure\n"; + print " --template file Template file\n"; + print " -v, --version Print version informations\n\n"; + print "Production text substitutions:\n"; + print " \@EnumName\@ PrefixTheXEnum\n"; + print " \@enum_name\@ prefix_the_xenum\n"; + print " \@ENUMNAME\@ PREFIX_THE_XENUM\n"; + print " \@ENUMSHORT\@ THE_XENUM\n"; + print " \@ENUMPREFIX\@ PREFIX\n"; + print " \@VALUENAME\@ PREFIX_THE_XVALUE\n"; + print " \@valuenick\@ the-xvalue\n"; + print " \@type\@ either enum or flags\n"; + print " \@Type\@ either Enum or Flags\n"; + print " \@TYPE\@ either ENUM or FLAGS\n"; + print " \@filename\@ name of current input file\n"; + print " \@basename\@ base name of the current input file (Since: 2.22)\n"; + exit 0; +} + +# production variables: +my $fhead = ""; # output file header +my $fprod = ""; # per input file production +my $ftail = ""; # output file trailer +my $eprod = ""; # per enum text (produced prior to value itarations) +my $vhead = ""; # value header, produced before iterating over enum values +my $vprod = ""; # value text, produced for each enum value +my $vtail = ""; # value tail, produced after iterating over enum values +# other options +my $comment_tmpl = "/* \@comment\@ */"; + +sub read_template_file { + my ($file) = @_; + my %tmpl = ('file-header', $fhead, + 'file-production', $fprod, + 'file-tail', $ftail, + 'enumeration-production', $eprod, + 'value-header', $vhead, + 'value-production', $vprod, + 'value-tail', $vtail, + 'comment', $comment_tmpl); + my $in = 'junk'; + open (FILE, $file) || die "Can't open $file: $!\n"; + while () { + if (/^\/\*\*\*\s+(BEGIN|END)\s+([\w-]+)\s+\*\*\*\//) { + if (($in eq 'junk') && ($1 eq 'BEGIN') && (exists($tmpl{$2}))) { + $in = $2; + next; + } + elsif (($in eq $2) && ($1 eq 'END') && (exists($tmpl{$2}))) { + $in = 'junk'; + next; + } else { + die "Malformed template file $file\n"; + } + } + if (!($in eq 'junk')) { + $tmpl{$in} .= $_; + } + } + close (FILE); + if (!($in eq 'junk')) { + die "Malformed template file $file\n"; + } + $fhead = $tmpl{'file-header'}; + $fprod = $tmpl{'file-production'}; + $ftail = $tmpl{'file-tail'}; + $eprod = $tmpl{'enumeration-production'}; + $vhead = $tmpl{'value-header'}; + $vprod = $tmpl{'value-production'}; + $vtail = $tmpl{'value-tail'}; + $comment_tmpl = $tmpl{'comment'}; +} + +if (!defined $ARGV[0]) { + usage; +} +while ($_=$ARGV[0],/^-/) { + shift; + last if /^--$/; + if (/^--template$/) { read_template_file (shift); } + elsif (/^--fhead$/) { $fhead = $fhead . shift } + elsif (/^--fprod$/) { $fprod = $fprod . shift } + elsif (/^--ftail$/) { $ftail = $ftail . shift } + elsif (/^--eprod$/) { $eprod = $eprod . shift } + elsif (/^--vhead$/) { $vhead = $vhead . shift } + elsif (/^--vprod$/) { $vprod = $vprod . shift } + elsif (/^--vtail$/) { $vtail = $vtail . shift } + elsif (/^--comments$/) { $comment_tmpl = shift } + elsif (/^--help$/ || /^-h$/ || /^-\?$/) { usage; } + elsif (/^--version$/ || /^-v$/) { version; } + else { usage; } + last if not defined($ARGV[0]); +} + +# put auto-generation comment +{ + my $comment = $comment_tmpl; + $comment =~ s/\@comment\@/Generated data (by glib-mkenums)/; + print "\n" . $comment . "\n\n"; +} + +if (length($fhead)) { + my $prod = $fhead; + my $base = basename ($ARGV[0]); + + $prod =~ s/\@filename\@/$ARGV[0]/g; + $prod =~ s/\@basename\@/$base/g; + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + chomp ($prod); + + print "$prod\n"; +} + +while (<>) { + if (eof) { + close (ARGV); # reset line numbering + $firstenum = 1; # Flag to print filename at next enum + } + + # read lines until we have no open comments + while (m@/\*([^*]|\*(?!/))*$@) { + my $new; + defined ($new = <>) || die "Unmatched comment in $ARGV"; + $_ .= $new; + } + # strip comments w/o options + s@/\*(?!<) + ([^*]+|\*(?!/))* + \*/@@gx; + + if (m@^\s*typedef\s+enum\s* + ({)?\s* + (?:/\*< + (([^*]|\*(?!/))*) + >\s*\*/)? + \s*({)? + @x) { + if (defined $2) { + my %options = parse_trigraph ($2); + next if defined $options{skip}; + $enum_prefix = $options{prefix}; + $flags = $options{flags}; + $option_lowercase_name = $options{lowercase_name}; + $option_underscore_name = $options{underscore_name}; + } else { + $enum_prefix = undef; + $flags = undef; + $option_lowercase_name = undef; + $option_underscore_name = undef; + } + if (defined $option_lowercase_name) { + if (defined $option_underscore_name) { + print STDERR "$0: $ARGV:$.: lowercase_name overriden with underscore_name\n"; + $option_lowercase_name = undef; + } else { + print STDERR "$0: $ARGV:$.: lowercase_name is deprecated, use underscore_name\n"; + } + } + # Didn't have trailing '{' look on next lines + if (!defined $1 && !defined $4) { + while (<>) { + if (s/^\s*\{//) { + last; + } + } + } + + $seenbitshift = 0; + @entries = (); + + # Now parse the entries + parse_entries (\*ARGV, $ARGV); + + # figure out if this was a flags or enums enumeration + if (!defined $flags) { + $flags = $seenbitshift; + } + + # Autogenerate a prefix + if (!defined $enum_prefix) { + for (@entries) { + my $nick = $_->[1]; + if (!defined $nick) { + my $name = $_->[0]; + if (defined $enum_prefix) { + my $tmp = ~ ($name ^ $enum_prefix); + ($tmp) = $tmp =~ /(^\xff*)/; + $enum_prefix = $enum_prefix & $tmp; + } else { + $enum_prefix = $name; + } + } + } + if (!defined $enum_prefix) { + $enum_prefix = ""; + } else { + # Trim so that it ends in an underscore + $enum_prefix =~ s/_[^_]*$/_/; + } + } else { + # canonicalize user defined prefixes + $enum_prefix = uc($enum_prefix); + $enum_prefix =~ s/-/_/g; + $enum_prefix =~ s/(.*)([^_])$/$1$2_/; + } + + for $entry (@entries) { + my ($name,$nick) = @{$entry}; + if (!defined $nick) { + ($nick = $name) =~ s/^$enum_prefix//; + $nick =~ tr/_/-/; + $nick = lc($nick); + @{$entry} = ($name, $nick); + } + } + + + # Spit out the output + if (defined $option_underscore_name) { + $enumlong = uc $option_underscore_name; + $enumsym = lc $option_underscore_name; + $enumshort = $enumlong; + $enumshort =~ s/^[A-Z][A-Z0-9]*_//; + + $enumname_prefix = $enumlong; + $enumname_prefix =~ s/$enumshort$//; + } else { + # enumname is e.g. GMatchType + $enspace = $enumname; + $enspace =~ s/^([A-Z][a-z]*).*$/$1/; + + $enumshort = $enumname; + $enumshort =~ s/^[A-Z][a-z]*//; + $enumshort =~ s/([^A-Z])([A-Z])/$1_$2/g; + $enumshort =~ s/([A-Z][A-Z])([A-Z][0-9a-z])/$1_$2/g; + $enumshort = uc($enumshort); + + $enumname_prefix = $enumname; + $enumname_prefix =~ s/^([A-Z][a-z]*).*$/$1/; + $enumname_prefix = uc($enumname_prefix); + + $enumlong = uc($enspace) . "_" . $enumshort; + $enumsym = lc($enspace) . "_" . lc($enumshort); + + if (defined($option_lowercase_name)) { + $enumsym = $option_lowercase_name; + } + } + + if ($firstenum) { + $firstenum = 0; + + if (length($fprod)) { + my $prod = $fprod; + my $base = basename ($ARGV); + + $prod =~ s/\@filename\@/$ARGV/g; + $prod =~ s/\@basename\@/$base/g; + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + chomp ($prod); + + print "$prod\n"; + } + } + + if (length($eprod)) { + my $prod = $eprod; + + $prod =~ s/\@enum_name\@/$enumsym/g; + $prod =~ s/\@EnumName\@/$enumname/g; + $prod =~ s/\@ENUMSHORT\@/$enumshort/g; + $prod =~ s/\@ENUMNAME\@/$enumlong/g; + $prod =~ s/\@ENUMPREFIX\@/$enumname_prefix/g; + if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; } + if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; } + if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; } + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + chomp ($prod); + + print "$prod\n"; + } + + if (length($vhead)) { + my $prod = $vhead; + + $prod =~ s/\@enum_name\@/$enumsym/g; + $prod =~ s/\@EnumName\@/$enumname/g; + $prod =~ s/\@ENUMSHORT\@/$enumshort/g; + $prod =~ s/\@ENUMNAME\@/$enumlong/g; + $prod =~ s/\@ENUMPREFIX\@/$enumname_prefix/g; + if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; } + if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; } + if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; } + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + chomp ($prod); + + print "$prod\n"; + } + + if (length($vprod)) { + my $prod = $vprod; + + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + for (@entries) { + my ($name,$nick) = @{$_}; + my $tmp_prod = $prod; + + $tmp_prod =~ s/\@VALUENAME\@/$name/g; + $tmp_prod =~ s/\@valuenick\@/$nick/g; + if ($flags) { $tmp_prod =~ s/\@type\@/flags/g; } else { $tmp_prod =~ s/\@type\@/enum/g; } + if ($flags) { $tmp_prod =~ s/\@Type\@/Flags/g; } else { $tmp_prod =~ s/\@Type\@/Enum/g; } + if ($flags) { $tmp_prod =~ s/\@TYPE\@/FLAGS/g; } else { $tmp_prod =~ s/\@TYPE\@/ENUM/g; } + chomp ($tmp_prod); + + print "$tmp_prod\n"; + } + } + + if (length($vtail)) { + my $prod = $vtail; + + $prod =~ s/\@enum_name\@/$enumsym/g; + $prod =~ s/\@EnumName\@/$enumname/g; + $prod =~ s/\@ENUMSHORT\@/$enumshort/g; + $prod =~ s/\@ENUMNAME\@/$enumlong/g; + $prod =~ s/\@ENUMPREFIX\@/$enumname_prefix/g; + if ($flags) { $prod =~ s/\@type\@/flags/g; } else { $prod =~ s/\@type\@/enum/g; } + if ($flags) { $prod =~ s/\@Type\@/Flags/g; } else { $prod =~ s/\@Type\@/Enum/g; } + if ($flags) { $prod =~ s/\@TYPE\@/FLAGS/g; } else { $prod =~ s/\@TYPE\@/ENUM/g; } + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + chomp ($prod); + + print "$prod\n"; + } + } +} + +if (length($ftail)) { + my $prod = $ftail; + my $base = basename ($ARGV); + + $prod =~ s/\@filename\@/$ARGV/g; + $prod =~ s/\@basename\@/$base/g; + $prod =~ s/\\a/\a/g; $prod =~ s/\\b/\b/g; $prod =~ s/\\t/\t/g; $prod =~ s/\\n/\n/g; + $prod =~ s/\\f/\f/g; $prod =~ s/\\r/\r/g; + chomp ($prod); + + print "$prod\n"; +} + +# put auto-generation comment +{ + my $comment = $comment_tmpl; + $comment =~ s/\@comment\@/Generated data ends here/; + print "\n" . $comment . "\n\n"; +} diff --git a/gobject/gmarshal.c b/gobject/gmarshal.c new file mode 100644 index 0000000..d59cbc7 --- /dev/null +++ b/gobject/gmarshal.c @@ -0,0 +1,757 @@ + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:VOID (./gmarshal.list:26) */ +void +g_cclosure_marshal_VOID__VOID (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__VOID) (gpointer data1, + gpointer data2); + register GMarshalFunc_VOID__VOID callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 1); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__VOID) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + data2); +} + +/* VOID:BOOLEAN (./gmarshal.list:27) */ +void +g_cclosure_marshal_VOID__BOOLEAN (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__BOOLEAN) (gpointer data1, + gboolean arg_1, + gpointer data2); + register GMarshalFunc_VOID__BOOLEAN callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOOLEAN) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_boolean (param_values + 1), + data2); +} + +/* VOID:CHAR (./gmarshal.list:28) */ +void +g_cclosure_marshal_VOID__CHAR (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__CHAR) (gpointer data1, + gchar arg_1, + gpointer data2); + register GMarshalFunc_VOID__CHAR callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__CHAR) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_char (param_values + 1), + data2); +} + +/* VOID:UCHAR (./gmarshal.list:29) */ +void +g_cclosure_marshal_VOID__UCHAR (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UCHAR) (gpointer data1, + guchar arg_1, + gpointer data2); + register GMarshalFunc_VOID__UCHAR callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UCHAR) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uchar (param_values + 1), + data2); +} + +/* VOID:INT (./gmarshal.list:30) */ +void +g_cclosure_marshal_VOID__INT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__INT) (gpointer data1, + gint arg_1, + gpointer data2); + register GMarshalFunc_VOID__INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_int (param_values + 1), + data2); +} + +/* VOID:UINT (./gmarshal.list:31) */ +void +g_cclosure_marshal_VOID__UINT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT) (gpointer data1, + guint arg_1, + gpointer data2); + register GMarshalFunc_VOID__UINT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + data2); +} + +/* VOID:LONG (./gmarshal.list:32) */ +void +g_cclosure_marshal_VOID__LONG (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__LONG) (gpointer data1, + glong arg_1, + gpointer data2); + register GMarshalFunc_VOID__LONG callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__LONG) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_long (param_values + 1), + data2); +} + +/* VOID:ULONG (./gmarshal.list:33) */ +void +g_cclosure_marshal_VOID__ULONG (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__ULONG) (gpointer data1, + gulong arg_1, + gpointer data2); + register GMarshalFunc_VOID__ULONG callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__ULONG) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_ulong (param_values + 1), + data2); +} + +/* VOID:ENUM (./gmarshal.list:34) */ +void +g_cclosure_marshal_VOID__ENUM (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__ENUM) (gpointer data1, + gint arg_1, + gpointer data2); + register GMarshalFunc_VOID__ENUM callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__ENUM) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_enum (param_values + 1), + data2); +} + +/* VOID:FLAGS (./gmarshal.list:35) */ +void +g_cclosure_marshal_VOID__FLAGS (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__FLAGS) (gpointer data1, + guint arg_1, + gpointer data2); + register GMarshalFunc_VOID__FLAGS callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__FLAGS) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_flags (param_values + 1), + data2); +} + +/* VOID:FLOAT (./gmarshal.list:36) */ +void +g_cclosure_marshal_VOID__FLOAT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__FLOAT) (gpointer data1, + gfloat arg_1, + gpointer data2); + register GMarshalFunc_VOID__FLOAT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__FLOAT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_float (param_values + 1), + data2); +} + +/* VOID:DOUBLE (./gmarshal.list:37) */ +void +g_cclosure_marshal_VOID__DOUBLE (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__DOUBLE) (gpointer data1, + gdouble arg_1, + gpointer data2); + register GMarshalFunc_VOID__DOUBLE callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__DOUBLE) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_double (param_values + 1), + data2); +} + +/* VOID:STRING (./gmarshal.list:38) */ +void +g_cclosure_marshal_VOID__STRING (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_VOID__STRING callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_string (param_values + 1), + data2); +} + +/* VOID:PARAM (./gmarshal.list:39) */ +void +g_cclosure_marshal_VOID__PARAM (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__PARAM) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_VOID__PARAM callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__PARAM) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_param (param_values + 1), + data2); +} + +/* VOID:BOXED (./gmarshal.list:40) */ +void +g_cclosure_marshal_VOID__BOXED (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__BOXED) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_VOID__BOXED callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + data2); +} + +/* VOID:POINTER (./gmarshal.list:41) */ +void +g_cclosure_marshal_VOID__POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__POINTER) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_VOID__POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + data2); +} + +/* VOID:OBJECT (./gmarshal.list:42) */ +void +g_cclosure_marshal_VOID__OBJECT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__OBJECT) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_VOID__OBJECT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_object (param_values + 1), + data2); +} + +/* VOID:UINT,POINTER (./gmarshal.list:45) */ +void +g_cclosure_marshal_VOID__UINT_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__UINT_POINTER) (gpointer data1, + guint arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_VOID__UINT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_uint (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); +} + +/* BOOL:FLAGS (./gmarshal.list:46) */ +void +g_cclosure_marshal_BOOLEAN__FLAGS (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__FLAGS) (gpointer data1, + guint arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__FLAGS callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__FLAGS) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_flags (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* STRING:OBJECT,POINTER (./gmarshal.list:47) */ +void +g_cclosure_marshal_STRING__OBJECT_POINTER (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gchar* (*GMarshalFunc_STRING__OBJECT_POINTER) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_STRING__OBJECT_POINTER callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gchar* v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_STRING__OBJECT_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_object (param_values + 1), + g_marshal_value_peek_pointer (param_values + 2), + data2); + + g_value_take_string (return_value, v_return); +} + diff --git a/gobject/gmarshal.h b/gobject/gmarshal.h new file mode 100644 index 0000000..ca43bdb --- /dev/null +++ b/gobject/gmarshal.h @@ -0,0 +1,169 @@ +#ifndef __G_MARSHAL_H__ +#define __G_MARSHAL_H__ + +G_BEGIN_DECLS + +/* VOID:VOID (./gmarshal.list:26) */ +extern void g_cclosure_marshal_VOID__VOID (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:BOOLEAN (./gmarshal.list:27) */ +extern void g_cclosure_marshal_VOID__BOOLEAN (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:CHAR (./gmarshal.list:28) */ +extern void g_cclosure_marshal_VOID__CHAR (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UCHAR (./gmarshal.list:29) */ +extern void g_cclosure_marshal_VOID__UCHAR (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:INT (./gmarshal.list:30) */ +extern void g_cclosure_marshal_VOID__INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT (./gmarshal.list:31) */ +extern void g_cclosure_marshal_VOID__UINT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:LONG (./gmarshal.list:32) */ +extern void g_cclosure_marshal_VOID__LONG (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:ULONG (./gmarshal.list:33) */ +extern void g_cclosure_marshal_VOID__ULONG (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:ENUM (./gmarshal.list:34) */ +extern void g_cclosure_marshal_VOID__ENUM (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:FLAGS (./gmarshal.list:35) */ +extern void g_cclosure_marshal_VOID__FLAGS (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:FLOAT (./gmarshal.list:36) */ +extern void g_cclosure_marshal_VOID__FLOAT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:DOUBLE (./gmarshal.list:37) */ +extern void g_cclosure_marshal_VOID__DOUBLE (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:STRING (./gmarshal.list:38) */ +extern void g_cclosure_marshal_VOID__STRING (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:PARAM (./gmarshal.list:39) */ +extern void g_cclosure_marshal_VOID__PARAM (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:BOXED (./gmarshal.list:40) */ +extern void g_cclosure_marshal_VOID__BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:POINTER (./gmarshal.list:41) */ +extern void g_cclosure_marshal_VOID__POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:OBJECT (./gmarshal.list:42) */ +extern void g_cclosure_marshal_VOID__OBJECT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* VOID:UINT,POINTER (./gmarshal.list:45) */ +extern void g_cclosure_marshal_VOID__UINT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* BOOL:FLAGS (./gmarshal.list:46) */ +extern void g_cclosure_marshal_BOOLEAN__FLAGS (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +#define g_cclosure_marshal_BOOL__FLAGS g_cclosure_marshal_BOOLEAN__FLAGS + +/* STRING:OBJECT,POINTER (./gmarshal.list:47) */ +extern void g_cclosure_marshal_STRING__OBJECT_POINTER (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __G_MARSHAL_H__ */ diff --git a/gobject/gmarshal.list b/gobject/gmarshal.list new file mode 100644 index 0000000..f3844a1 --- /dev/null +++ b/gobject/gmarshal.list @@ -0,0 +1,47 @@ +# see glib-genmarshal(1) for a detailed description of the file format, +# possible parameter types are: +# VOID indicates no return type, or no extra +# parameters. if VOID is used as the parameter +# list, no additional parameters may be present. +# BOOLEAN for boolean types (gboolean) +# CHAR for signed char types (gchar) +# UCHAR for unsigned char types (guchar) +# INT for signed integer types (gint) +# UINT for unsigned integer types (guint) +# LONG for signed long integer types (glong) +# ULONG for unsigned long integer types (gulong) +# ENUM for enumeration types (gint) +# FLAGS for flag enumeration types (guint) +# FLOAT for single-precision float types (gfloat) +# DOUBLE for double-precision float types (gdouble) +# STRING for string types (gchar*) +# PARAM for GParamSpec or derived types (GParamSpec*) +# BOXED for boxed (anonymous but reference counted) types (GBoxed*) +# POINTER for anonymous pointer types (gpointer) +# OBJECT for GObject or derived types (GObject*) +# NONE deprecated alias for VOID +# BOOL deprecated alias for BOOLEAN + +# standard VOID return marshallers +VOID:VOID +VOID:BOOLEAN +VOID:CHAR +VOID:UCHAR +VOID:INT +VOID:UINT +VOID:LONG +VOID:ULONG +VOID:ENUM +VOID:FLAGS +VOID:FLOAT +VOID:DOUBLE +VOID:STRING +VOID:PARAM +VOID:BOXED +VOID:POINTER +VOID:OBJECT + +# GRuntime specific marshallers +VOID:UINT,POINTER +BOOL:FLAGS +STRING:OBJECT,POINTER diff --git a/gobject/gmarshal.strings b/gobject/gmarshal.strings new file mode 100644 index 0000000..7869ecf --- /dev/null +++ b/gobject/gmarshal.strings @@ -0,0 +1,20 @@ +"g_cclosure_marshal_VOID__VOID", +"g_cclosure_marshal_VOID__BOOLEAN", +"g_cclosure_marshal_VOID__CHAR", +"g_cclosure_marshal_VOID__UCHAR", +"g_cclosure_marshal_VOID__INT", +"g_cclosure_marshal_VOID__UINT", +"g_cclosure_marshal_VOID__LONG", +"g_cclosure_marshal_VOID__ULONG", +"g_cclosure_marshal_VOID__ENUM", +"g_cclosure_marshal_VOID__FLAGS", +"g_cclosure_marshal_VOID__FLOAT", +"g_cclosure_marshal_VOID__DOUBLE", +"g_cclosure_marshal_VOID__STRING", +"g_cclosure_marshal_VOID__PARAM", +"g_cclosure_marshal_VOID__BOXED", +"g_cclosure_marshal_VOID__POINTER", +"g_cclosure_marshal_VOID__OBJECT", +"g_cclosure_marshal_VOID__UINT_POINTER", +"g_cclosure_marshal_BOOL__FLAGS", +"g_cclosure_marshal_STRING__OBJECT_POINTER", diff --git a/gobject/gobject-query.c b/gobject/gobject-query.c new file mode 100644 index 0000000..7f208ed --- /dev/null +++ b/gobject/gobject-query.c @@ -0,0 +1,230 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#include +#include + + +static gchar *indent_inc = NULL; +static guint spacing = 1; +static FILE *f_out = NULL; +static GType root = 0; +static gboolean recursion = TRUE; + +#if 0 +# define O_SPACE "\\as" +# define O_ESPACE " " +# define O_BRANCH "\\aE" +# define O_VLINE "\\al" +# define O_LLEAF "\\aL" +# define O_KEY_FILL "_" +#else +# define O_SPACE " " +# define O_ESPACE "" +# define O_BRANCH "+" +# define O_VLINE "|" +# define O_LLEAF "`" +# define O_KEY_FILL "_" +#endif + +static void +show_nodes (GType type, + GType sibling, + const gchar *indent) +{ + GType *children; + guint i; + + if (!type) + return; + + children = g_type_children (type, NULL); + + if (type != root) + for (i = 0; i < spacing; i++) + g_fprintf (f_out, "%s%s\n", indent, O_VLINE); + + g_fprintf (f_out, "%s%s%s%s", + indent, + sibling ? O_BRANCH : (type != root ? O_LLEAF : O_SPACE), + O_ESPACE, + g_type_name (type)); + + for (i = strlen (g_type_name (type)); i <= strlen (indent_inc); i++) + fputs (O_KEY_FILL, f_out); + + fputc ('\n', f_out); + + if (children && recursion) + { + gchar *new_indent; + GType *child; + + if (sibling) + new_indent = g_strconcat (indent, O_VLINE, indent_inc, NULL); + else + new_indent = g_strconcat (indent, O_SPACE, indent_inc, NULL); + + for (child = children; *child; child++) + show_nodes (child[0], child[1], new_indent); + + g_free (new_indent); + } + + g_free (children); +} + +static gint +help (gchar *arg) +{ + g_fprintf (stderr, "usage: gobject-query [-r ] [-{i|b} \"\"] [-s #] [-{h|x|y}]\n"); + g_fprintf (stderr, " -r specifiy root type\n"); + g_fprintf (stderr, " -n don't descend type tree\n"); + g_fprintf (stderr, " -h guess what ;)\n"); + g_fprintf (stderr, " -b specify indent string\n"); + g_fprintf (stderr, " -i specify incremental indent string\n"); + g_fprintf (stderr, " -s specify line spacing\n"); + g_fprintf (stderr, "qualifiers:\n"); + g_fprintf (stderr, " froots iterate over fundamental roots\n"); + g_fprintf (stderr, " tree print type tree\n"); + + return arg != NULL; +} + +int +main (gint argc, + gchar *argv[]) +{ + GLogLevelFlags fatal_mask; + gboolean gen_froots = 0; + gboolean gen_tree = 0; + gint i; + gchar *iindent = ""; + + f_out = stdout; + + fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); + fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; + g_log_set_always_fatal (fatal_mask); + + root = G_TYPE_OBJECT; + + g_type_init (); + + for (i = 1; i < argc; i++) + { + if (strcmp ("-s", argv[i]) == 0) + { + i++; + if (i < argc) + spacing = atoi (argv[i]); + } + else if (strcmp ("-i", argv[i]) == 0) + { + i++; + if (i < argc) + { + char *p; + guint n; + + p = argv[i]; + while (*p) + p++; + n = p - argv[i]; + indent_inc = g_new (gchar, n * strlen (O_SPACE) + 1); + *indent_inc = 0; + while (n) + { + n--; + strcpy (indent_inc, O_SPACE); + } + } + } + else if (strcmp ("-b", argv[i]) == 0) + { + i++; + if (i < argc) + iindent = argv[i]; + } + else if (strcmp ("-r", argv[i]) == 0) + { + i++; + if (i < argc) + root = g_type_from_name (argv[i]); + } + else if (strcmp ("-n", argv[i]) == 0) + { + recursion = FALSE; + } + else if (strcmp ("froots", argv[i]) == 0) + { + gen_froots = 1; + } + else if (strcmp ("tree", argv[i]) == 0) + { + gen_tree = 1; + } + else if (strcmp ("-h", argv[i]) == 0) + { + return help (NULL); + } + else if (strcmp ("--help", argv[i]) == 0) + { + return help (NULL); + } + else + return help (argv[i]); + } + + if (!gen_froots && !gen_tree) + return help (argv[i-1]); + + if (!indent_inc) + { + indent_inc = g_new (gchar, strlen (O_SPACE) + 1); + *indent_inc = 0; + strcpy (indent_inc, O_SPACE); + } + + if (gen_tree) + show_nodes (root, 0, iindent); + if (gen_froots) + { + root = ~0; + for (i = 0; i <= G_TYPE_FUNDAMENTAL_MAX; i += G_TYPE_MAKE_FUNDAMENTAL (1)) + { + const gchar *name = g_type_name (i); + + if (name) + show_nodes (i, 0, iindent); + } + } + + return 0; +} diff --git a/gobject/gobject.c b/gobject/gobject.c new file mode 100644 index 0000000..56e6f9e --- /dev/null +++ b/gobject/gobject.c @@ -0,0 +1,3231 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe with regards to reference counting. + */ + +#include "config.h" + +#include +#include + +#include "glib/gdatasetprivate.h" + +#include "gobject.h" +#include "gvaluecollector.h" +#include "gsignal.h" +#include "gparamspecs.h" +#include "gvaluetypes.h" +#include "gobjectalias.h" + +/* This should be included after gobjectalias.h (or pltcheck.sh will fail) */ +#include "gobjectnotifyqueue.c" + + +/** + * SECTION:objects + * @short_description: The base object type + * @see_also: #GParamSpecObject, g_param_spec_object() + * @title: The Base Object Type + * + * GObject is the fundamental type providing the common attributes and + * methods for all object types in GTK+, Pango and other libraries + * based on GObject. The GObject class provides methods for object + * construction and destruction, property access methods, and signal + * support. Signals are described in detail in . + * + * + * #GInitiallyUnowned is derived from #GObject. The only difference between + * the two is that the initial reference of a #GInitiallyUnowned is flagged + * as a floating reference. + * This means that it is not specifically claimed to be "owned" by + * any code portion. The main motivation for providing floating references is + * C convenience. In particular, it allows code to be written as: + * |[ + * container = create_container(); + * container_add_child (container, create_child()); + * ]| + * If container_add_child() will g_object_ref_sink() the + * passed in child, no reference of the newly created child is leaked. + * Without floating references, container_add_child() + * can only g_object_ref() the new child, so to implement this code without + * reference leaks, it would have to be written as: + * |[ + * Child *child; + * container = create_container(); + * child = create_child(); + * container_add_child (container, child); + * g_object_unref (child); + * ]| + * The floating reference can be converted into + * an ordinary reference by calling g_object_ref_sink(). + * For already sunken objects (objects that don't have a floating reference + * anymore), g_object_ref_sink() is equivalent to g_object_ref() and returns + * a new reference. + * Since floating references are useful almost exclusively for C convenience, + * language bindings that provide automated reference and memory ownership + * maintenance (such as smart pointers or garbage collection) therefore don't + * need to expose floating references in their API. + * + * + * Some object implementations may need to save an objects floating state + * across certain code portions (an example is #GtkMenu), to achive this, the + * following sequence can be used: + * + * |[ + * // save floating state + * gboolean was_floating = g_object_is_floating (object); + * g_object_ref_sink (object); + * // protected code portion + * ...; + * // restore floating state + * if (was_floating) + * g_object_force_floating (object); + * g_obejct_unref (object); // release previously acquired reference + * ]| + */ + + +/* --- macros --- */ +#define PARAM_SPEC_PARAM_ID(pspec) ((pspec)->param_id) +#define PARAM_SPEC_SET_PARAM_ID(pspec, id) ((pspec)->param_id = (id)) + +#define OBJECT_HAS_TOGGLE_REF_FLAG 0x1 +#define OBJECT_HAS_TOGGLE_REF(object) \ + ((G_DATALIST_GET_FLAGS (&(object)->qdata) & OBJECT_HAS_TOGGLE_REF_FLAG) != 0) +#define OBJECT_FLOATING_FLAG 0x2 + +#define CLASS_HAS_PROPS_FLAG 0x1 +#define CLASS_HAS_PROPS(class) \ + ((class)->flags & CLASS_HAS_PROPS_FLAG) +#define CLASS_HAS_CUSTOM_CONSTRUCTOR(class) \ + ((class)->constructor != g_object_constructor) + +#define CLASS_HAS_DERIVED_CLASS_FLAG 0x2 +#define CLASS_HAS_DERIVED_CLASS(class) \ + ((class)->flags & CLASS_HAS_DERIVED_CLASS_FLAG) + +/* --- signals --- */ +enum { + NOTIFY, + LAST_SIGNAL +}; + + +/* --- properties --- */ +enum { + PROP_NONE +}; + + +/* --- prototypes --- */ +static void g_object_base_class_init (GObjectClass *class); +static void g_object_base_class_finalize (GObjectClass *class); +static void g_object_do_class_init (GObjectClass *class); +static void g_object_init (GObject *object, + GObjectClass *class); +static GObject* g_object_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params); +static void g_object_real_dispose (GObject *object); +static void g_object_finalize (GObject *object); +static void g_object_do_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void g_object_do_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); +static void g_value_object_init (GValue *value); +static void g_value_object_free_value (GValue *value); +static void g_value_object_copy_value (const GValue *src_value, + GValue *dest_value); +static void g_value_object_transform_value (const GValue *src_value, + GValue *dest_value); +static gpointer g_value_object_peek_pointer (const GValue *value); +static gchar* g_value_object_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +static gchar* g_value_object_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +static void g_object_dispatch_properties_changed (GObject *object, + guint n_pspecs, + GParamSpec **pspecs); +static inline void object_get_property (GObject *object, + GParamSpec *pspec, + GValue *value); +static inline void object_set_property (GObject *object, + GParamSpec *pspec, + const GValue *value, + GObjectNotifyQueue *nqueue); +static guint object_floating_flag_handler (GObject *object, + gint job); + +static void object_interface_check_properties (gpointer func_data, + gpointer g_iface); + + +/* --- variables --- */ +static GQuark quark_closure_array = 0; +static GQuark quark_weak_refs = 0; +static GQuark quark_toggle_refs = 0; +static GParamSpecPool *pspec_pool = NULL; +static GObjectNotifyContext property_notify_context = { 0, }; +static gulong gobject_signals[LAST_SIGNAL] = { 0, }; +static guint (*floating_flag_handler) (GObject*, gint) = object_floating_flag_handler; +G_LOCK_DEFINE_STATIC (construction_mutex); +static GSList *construction_objects = NULL; + +/* --- functions --- */ +#ifdef G_ENABLE_DEBUG +#define IF_DEBUG(debug_type) if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) +G_LOCK_DEFINE_STATIC (debug_objects); +static volatile GObject *g_trap_object_ref = NULL; +static guint debug_objects_count = 0; +static GHashTable *debug_objects_ht = NULL; + +static void +debug_objects_foreach (gpointer key, + gpointer value, + gpointer user_data) +{ + GObject *object = value; + + g_message ("[%p] stale %s\tref_count=%u", + object, + G_OBJECT_TYPE_NAME (object), + object->ref_count); +} + +static void +debug_objects_atexit (void) +{ + IF_DEBUG (OBJECTS) + { + G_LOCK (debug_objects); + g_message ("stale GObjects: %u", debug_objects_count); + g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL); + G_UNLOCK (debug_objects); + } +} +#endif /* G_ENABLE_DEBUG */ + +void +g_object_type_init (void) +{ + static gboolean initialized = FALSE; + static const GTypeFundamentalInfo finfo = { + G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE, + }; + static GTypeInfo info = { + sizeof (GObjectClass), + (GBaseInitFunc) g_object_base_class_init, + (GBaseFinalizeFunc) g_object_base_class_finalize, + (GClassInitFunc) g_object_do_class_init, + NULL /* class_destroy */, + NULL /* class_data */, + sizeof (GObject), + 0 /* n_preallocs */, + (GInstanceInitFunc) g_object_init, + NULL, /* value_table */ + }; + static const GTypeValueTable value_table = { + g_value_object_init, /* value_init */ + g_value_object_free_value, /* value_free */ + g_value_object_copy_value, /* value_copy */ + g_value_object_peek_pointer, /* value_peek_pointer */ + "p", /* collect_format */ + g_value_object_collect_value, /* collect_value */ + "p", /* lcopy_format */ + g_value_object_lcopy_value, /* lcopy_value */ + }; + GType type; + + g_return_if_fail (initialized == FALSE); + initialized = TRUE; + + /* G_TYPE_OBJECT + */ + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_OBJECT, g_intern_static_string ("GObject"), &info, &finfo, 0); + g_assert (type == G_TYPE_OBJECT); + g_value_register_transform_func (G_TYPE_OBJECT, G_TYPE_OBJECT, g_value_object_transform_value); + +#ifdef G_ENABLE_DEBUG + IF_DEBUG (OBJECTS) + { + debug_objects_ht = g_hash_table_new (g_direct_hash, NULL); + g_atexit (debug_objects_atexit); + } +#endif /* G_ENABLE_DEBUG */ +} + +static void +g_object_base_class_init (GObjectClass *class) +{ + GObjectClass *pclass = g_type_class_peek_parent (class); + + /* Don't inherit HAS_DERIVED_CLASS flag from parent class */ + class->flags &= ~CLASS_HAS_DERIVED_CLASS_FLAG; + + if (pclass) + pclass->flags |= CLASS_HAS_DERIVED_CLASS_FLAG; + + /* reset instance specific fields and methods that don't get inherited */ + class->construct_properties = pclass ? g_slist_copy (pclass->construct_properties) : NULL; + class->get_property = NULL; + class->set_property = NULL; +} + +static void +g_object_base_class_finalize (GObjectClass *class) +{ + GList *list, *node; + + _g_signals_destroy (G_OBJECT_CLASS_TYPE (class)); + + g_slist_free (class->construct_properties); + class->construct_properties = NULL; + list = g_param_spec_pool_list_owned (pspec_pool, G_OBJECT_CLASS_TYPE (class)); + for (node = list; node; node = node->next) + { + GParamSpec *pspec = node->data; + + g_param_spec_pool_remove (pspec_pool, pspec); + PARAM_SPEC_SET_PARAM_ID (pspec, 0); + g_param_spec_unref (pspec); + } + g_list_free (list); +} + +static void +g_object_notify_dispatcher (GObject *object, + guint n_pspecs, + GParamSpec **pspecs) +{ + G_OBJECT_GET_CLASS (object)->dispatch_properties_changed (object, n_pspecs, pspecs); +} + +static void +g_object_do_class_init (GObjectClass *class) +{ + /* read the comment about typedef struct CArray; on why not to change this quark */ + quark_closure_array = g_quark_from_static_string ("GObject-closure-array"); + + quark_weak_refs = g_quark_from_static_string ("GObject-weak-references"); + quark_toggle_refs = g_quark_from_static_string ("GObject-toggle-references"); + pspec_pool = g_param_spec_pool_new (TRUE); + property_notify_context.quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue"); + property_notify_context.dispatcher = g_object_notify_dispatcher; + + class->constructor = g_object_constructor; + class->set_property = g_object_do_set_property; + class->get_property = g_object_do_get_property; + class->dispose = g_object_real_dispose; + class->finalize = g_object_finalize; + class->dispatch_properties_changed = g_object_dispatch_properties_changed; + class->notify = NULL; + + /** + * GObject::notify: + * @gobject: the object which received the signal. + * @pspec: the #GParamSpec of the property which changed. + * + * The notify signal is emitted on an object when one of its + * properties has been changed. Note that getting this signal + * doesn't guarantee that the value of the property has actually + * changed, it may also be emitted when the setter for the property + * is called to reinstate the previous value. + * + * This signal is typically used to obtain change notification for a + * single property, by specifying the property name as a detail in the + * g_signal_connect() call, like this: + * |[ + * g_signal_connect (text_view->buffer, "notify::paste-target-list", + * G_CALLBACK (gtk_text_view_target_list_notify), + * text_view) + * ]| + * It is important to note that you must use + * canonical parameter names as + * detail strings for the notify signal. + */ + gobject_signals[NOTIFY] = + g_signal_new (g_intern_static_string ("notify"), + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (GObjectClass, notify), + NULL, NULL, + g_cclosure_marshal_VOID__PARAM, + G_TYPE_NONE, + 1, G_TYPE_PARAM); + + /* Install a check function that we'll use to verify that classes that + * implement an interface implement all properties for that interface + */ + g_type_add_interface_check (NULL, object_interface_check_properties); +} + +static void +install_property_internal (GType g_type, + guint property_id, + GParamSpec *pspec) +{ + if (g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type, FALSE)) + { + g_warning ("When installing property: type `%s' already has a property named `%s'", + g_type_name (g_type), + pspec->name); + return; + } + + g_param_spec_ref (pspec); + g_param_spec_sink (pspec); + PARAM_SPEC_SET_PARAM_ID (pspec, property_id); + g_param_spec_pool_insert (pspec_pool, pspec, g_type); +} + +/** + * g_object_class_install_property: + * @oclass: a #GObjectClass + * @property_id: the id for the new property + * @pspec: the #GParamSpec for the new property + * + * Installs a new property. This is usually done in the class initializer. + * + * Note that it is possible to redefine a property in a derived class, + * by installing a property with the same name. This can be useful at times, + * e.g. to change the range of allowed values or the default value. + */ +void +g_object_class_install_property (GObjectClass *class, + guint property_id, + GParamSpec *pspec) +{ + g_return_if_fail (G_IS_OBJECT_CLASS (class)); + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + + if (CLASS_HAS_DERIVED_CLASS (class)) + g_error ("Attempt to add property %s::%s to class after it was derived", + G_OBJECT_CLASS_NAME (class), pspec->name); + + class->flags |= CLASS_HAS_PROPS_FLAG; + + if (pspec->flags & G_PARAM_WRITABLE) + g_return_if_fail (class->set_property != NULL); + if (pspec->flags & G_PARAM_READABLE) + g_return_if_fail (class->get_property != NULL); + g_return_if_fail (property_id > 0); + g_return_if_fail (PARAM_SPEC_PARAM_ID (pspec) == 0); /* paranoid */ + if (pspec->flags & G_PARAM_CONSTRUCT) + g_return_if_fail ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) == 0); + if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) + g_return_if_fail (pspec->flags & G_PARAM_WRITABLE); + + install_property_internal (G_OBJECT_CLASS_TYPE (class), property_id, pspec); + + if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) + class->construct_properties = g_slist_prepend (class->construct_properties, pspec); + + /* for property overrides of construct poperties, we have to get rid + * of the overidden inherited construct property + */ + pspec = g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type_parent (G_OBJECT_CLASS_TYPE (class)), TRUE); + if (pspec && pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) + class->construct_properties = g_slist_remove (class->construct_properties, pspec); +} + +/** + * g_object_interface_install_property: + * @g_iface: any interface vtable for the interface, or the default + * vtable for the interface. + * @pspec: the #GParamSpec for the new property + * + * Add a property to an interface; this is only useful for interfaces + * that are added to GObject-derived types. Adding a property to an + * interface forces all objects classes with that interface to have a + * compatible property. The compatible property could be a newly + * created #GParamSpec, but normally + * g_object_class_override_property() will be used so that the object + * class only needs to provide an implementation and inherits the + * property description, default value, bounds, and so forth from the + * interface property. + * + * This function is meant to be called from the interface's default + * vtable initialization function (the @class_init member of + * #GTypeInfo.) It must not be called after after @class_init has + * been called for any object types implementing this interface. + * + * Since: 2.4 + */ +void +g_object_interface_install_property (gpointer g_iface, + GParamSpec *pspec) +{ + GTypeInterface *iface_class = g_iface; + + g_return_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type)); + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (!G_IS_PARAM_SPEC_OVERRIDE (pspec)); /* paranoid */ + g_return_if_fail (PARAM_SPEC_PARAM_ID (pspec) == 0); /* paranoid */ + + install_property_internal (iface_class->g_type, 0, pspec); +} + +/** + * g_object_class_find_property: + * @oclass: a #GObjectClass + * @property_name: the name of the property to look up + * + * Looks up the #GParamSpec for a property of a class. + * + * Returns: the #GParamSpec for the property, or %NULL if the class + * doesn't have a property of that name + */ +GParamSpec* +g_object_class_find_property (GObjectClass *class, + const gchar *property_name) +{ + GParamSpec *pspec; + GParamSpec *redirect; + + g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL); + g_return_val_if_fail (property_name != NULL, NULL); + + pspec = g_param_spec_pool_lookup (pspec_pool, + property_name, + G_OBJECT_CLASS_TYPE (class), + TRUE); + if (pspec) + { + redirect = g_param_spec_get_redirect_target (pspec); + if (redirect) + return redirect; + else + return pspec; + } + else + return NULL; +} + +/** + * g_object_interface_find_property: + * @g_iface: any interface vtable for the interface, or the default + * vtable for the interface + * @property_name: name of a property to lookup. + * + * Find the #GParamSpec with the given name for an + * interface. Generally, the interface vtable passed in as @g_iface + * will be the default vtable from g_type_default_interface_ref(), or, + * if you know the interface has already been loaded, + * g_type_default_interface_peek(). + * + * Since: 2.4 + * + * Returns: the #GParamSpec for the property of the interface with the + * name @property_name, or %NULL if no such property exists. + */ +GParamSpec* +g_object_interface_find_property (gpointer g_iface, + const gchar *property_name) +{ + GTypeInterface *iface_class = g_iface; + + g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL); + g_return_val_if_fail (property_name != NULL, NULL); + + return g_param_spec_pool_lookup (pspec_pool, + property_name, + iface_class->g_type, + FALSE); +} + +/** + * g_object_class_override_property: + * @oclass: a #GObjectClass + * @property_id: the new property ID + * @name: the name of a property registered in a parent class or + * in an interface of this class. + * + * Registers @property_id as referring to a property with the + * name @name in a parent class or in an interface implemented + * by @oclass. This allows this class to override + * a property implementation in a parent class or to provide + * the implementation of a property from an interface. + * + * + * Internally, overriding is implemented by creating a property of type + * #GParamSpecOverride; generally operations that query the properties of + * the object class, such as g_object_class_find_property() or + * g_object_class_list_properties() will return the overridden + * property. However, in one case, the @construct_properties argument of + * the @constructor virtual function, the #GParamSpecOverride is passed + * instead, so that the @param_id field of the #GParamSpec will be + * correct. For virtually all uses, this makes no difference. If you + * need to get the overridden property, you can call + * g_param_spec_get_redirect_target(). + * + * + * Since: 2.4 + */ +void +g_object_class_override_property (GObjectClass *oclass, + guint property_id, + const gchar *name) +{ + GParamSpec *overridden = NULL; + GParamSpec *new; + GType parent_type; + + g_return_if_fail (G_IS_OBJECT_CLASS (oclass)); + g_return_if_fail (property_id > 0); + g_return_if_fail (name != NULL); + + /* Find the overridden property; first check parent types + */ + parent_type = g_type_parent (G_OBJECT_CLASS_TYPE (oclass)); + if (parent_type != G_TYPE_NONE) + overridden = g_param_spec_pool_lookup (pspec_pool, + name, + parent_type, + TRUE); + if (!overridden) + { + GType *ifaces; + guint n_ifaces; + + /* Now check interfaces + */ + ifaces = g_type_interfaces (G_OBJECT_CLASS_TYPE (oclass), &n_ifaces); + while (n_ifaces-- && !overridden) + { + overridden = g_param_spec_pool_lookup (pspec_pool, + name, + ifaces[n_ifaces], + FALSE); + } + + g_free (ifaces); + } + + if (!overridden) + { + g_warning ("%s: Can't find property to override for '%s::%s'", + G_STRFUNC, G_OBJECT_CLASS_NAME (oclass), name); + return; + } + + new = g_param_spec_override (name, overridden); + g_object_class_install_property (oclass, property_id, new); +} + +/** + * g_object_class_list_properties: + * @oclass: a #GObjectClass + * @n_properties: return location for the length of the returned array + * + * Get an array of #GParamSpec* for all properties of a class. + * + * Returns: an array of #GParamSpec* which should be freed after use + */ +GParamSpec** /* free result */ +g_object_class_list_properties (GObjectClass *class, + guint *n_properties_p) +{ + GParamSpec **pspecs; + guint n; + + g_return_val_if_fail (G_IS_OBJECT_CLASS (class), NULL); + + pspecs = g_param_spec_pool_list (pspec_pool, + G_OBJECT_CLASS_TYPE (class), + &n); + if (n_properties_p) + *n_properties_p = n; + + return pspecs; +} + +/** + * g_object_interface_list_properties: + * @g_iface: any interface vtable for the interface, or the default + * vtable for the interface + * @n_properties_p: location to store number of properties returned. + * + * Lists the properties of an interface.Generally, the interface + * vtable passed in as @g_iface will be the default vtable from + * g_type_default_interface_ref(), or, if you know the interface has + * already been loaded, g_type_default_interface_peek(). + * + * Since: 2.4 + * + * Returns: a pointer to an array of pointers to #GParamSpec + * structures. The paramspecs are owned by GLib, but the + * array should be freed with g_free() when you are done with + * it. + */ +GParamSpec** +g_object_interface_list_properties (gpointer g_iface, + guint *n_properties_p) +{ + GTypeInterface *iface_class = g_iface; + GParamSpec **pspecs; + guint n; + + g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL); + + pspecs = g_param_spec_pool_list (pspec_pool, + iface_class->g_type, + &n); + if (n_properties_p) + *n_properties_p = n; + + return pspecs; +} + +static void +g_object_init (GObject *object, + GObjectClass *class) +{ + object->ref_count = 1; + g_datalist_init (&object->qdata); + + if (CLASS_HAS_PROPS (class)) + { + /* freeze object's notification queue, g_object_newv() preserves pairedness */ + g_object_notify_queue_freeze (object, &property_notify_context); + } + + if (CLASS_HAS_CUSTOM_CONSTRUCTOR (class)) + { + /* enter construction list for notify_queue_thaw() and to allow construct-only properties */ + G_LOCK (construction_mutex); + construction_objects = g_slist_prepend (construction_objects, object); + G_UNLOCK (construction_mutex); + } + +#ifdef G_ENABLE_DEBUG + IF_DEBUG (OBJECTS) + { + G_LOCK (debug_objects); + debug_objects_count++; + g_hash_table_insert (debug_objects_ht, object, object); + G_UNLOCK (debug_objects); + } +#endif /* G_ENABLE_DEBUG */ +} + +static void +g_object_do_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_object_do_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_object_real_dispose (GObject *object) +{ + g_signal_handlers_destroy (object); + g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL); + g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL); +} + +static void +g_object_finalize (GObject *object) +{ + g_datalist_clear (&object->qdata); + +#ifdef G_ENABLE_DEBUG + IF_DEBUG (OBJECTS) + { + G_LOCK (debug_objects); + g_assert (g_hash_table_lookup (debug_objects_ht, object) == object); + g_hash_table_remove (debug_objects_ht, object); + debug_objects_count--; + G_UNLOCK (debug_objects); + } +#endif /* G_ENABLE_DEBUG */ +} + + +static void +g_object_dispatch_properties_changed (GObject *object, + guint n_pspecs, + GParamSpec **pspecs) +{ + guint i; + + for (i = 0; i < n_pspecs; i++) + g_signal_emit (object, gobject_signals[NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]); +} + +/** + * g_object_run_dispose: + * @object: a #GObject + * + * Releases all references to other objects. This can be used to break + * reference cycles. + * + * This functions should only be called from object system implementations. + */ +void +g_object_run_dispose (GObject *object) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (object->ref_count > 0); + + g_object_ref (object); + G_OBJECT_GET_CLASS (object)->dispose (object); + g_object_unref (object); +} + +/** + * g_object_freeze_notify: + * @object: a #GObject + * + * Increases the freeze count on @object. If the freeze count is + * non-zero, the emission of "notify" signals on @object is + * stopped. The signals are queued until the freeze count is decreased + * to zero. + * + * This is necessary for accessors that modify multiple properties to prevent + * premature notification while the object is still being modified. + */ +void +g_object_freeze_notify (GObject *object) +{ + g_return_if_fail (G_IS_OBJECT (object)); + + if (g_atomic_int_get (&object->ref_count) == 0) + return; + + g_object_ref (object); + g_object_notify_queue_freeze (object, &property_notify_context); + g_object_unref (object); +} + +/** + * g_object_notify: + * @object: a #GObject + * @property_name: the name of a property installed on the class of @object. + * + * Emits a "notify" signal for the property @property_name on @object. + */ +void +g_object_notify (GObject *object, + const gchar *property_name) +{ + GParamSpec *pspec; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (property_name != NULL); + if (g_atomic_int_get (&object->ref_count) == 0) + return; + + g_object_ref (object); + /* We don't need to get the redirect target + * (by, e.g. calling g_object_class_find_property()) + * because g_object_notify_queue_add() does that + */ + pspec = g_param_spec_pool_lookup (pspec_pool, + property_name, + G_OBJECT_TYPE (object), + TRUE); + + if (!pspec) + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + G_OBJECT_TYPE_NAME (object), + property_name); + else + { + GObjectNotifyQueue *nqueue; + + nqueue = g_object_notify_queue_freeze (object, &property_notify_context); + g_object_notify_queue_add (object, nqueue, pspec); + g_object_notify_queue_thaw (object, nqueue); + } + g_object_unref (object); +} + +/** + * g_object_thaw_notify: + * @object: a #GObject + * + * Reverts the effect of a previous call to + * g_object_freeze_notify(). The freeze count is decreased on @object + * and when it reaches zero, all queued "notify" signals are emitted. + * + * It is an error to call this function when the freeze count is zero. + */ +void +g_object_thaw_notify (GObject *object) +{ + GObjectNotifyQueue *nqueue; + + g_return_if_fail (G_IS_OBJECT (object)); + if (g_atomic_int_get (&object->ref_count) == 0) + return; + + g_object_ref (object); + nqueue = g_object_notify_queue_from_object (object, &property_notify_context); + if (!nqueue || !nqueue->freeze_count) + g_warning ("%s: property-changed notification for %s(%p) is not frozen", + G_STRFUNC, G_OBJECT_TYPE_NAME (object), object); + else + g_object_notify_queue_thaw (object, nqueue); + g_object_unref (object); +} + +static inline void +object_get_property (GObject *object, + GParamSpec *pspec, + GValue *value) +{ + GObjectClass *class = g_type_class_peek (pspec->owner_type); + guint param_id = PARAM_SPEC_PARAM_ID (pspec); + GParamSpec *redirect; + + redirect = g_param_spec_get_redirect_target (pspec); + if (redirect) + pspec = redirect; + + class->get_property (object, param_id, value, pspec); +} + +static inline void +object_set_property (GObject *object, + GParamSpec *pspec, + const GValue *value, + GObjectNotifyQueue *nqueue) +{ + GValue tmp_value = { 0, }; + GObjectClass *class = g_type_class_peek (pspec->owner_type); + guint param_id = PARAM_SPEC_PARAM_ID (pspec); + GParamSpec *redirect; + + redirect = g_param_spec_get_redirect_target (pspec); + if (redirect) + pspec = redirect; + + /* provide a copy to work from, convert (if necessary) and validate */ + g_value_init (&tmp_value, pspec->value_type); + if (!g_value_transform (value, &tmp_value)) + g_warning ("unable to set property `%s' of type `%s' from value of type `%s'", + pspec->name, + g_type_name (pspec->value_type), + G_VALUE_TYPE_NAME (value)); + else if (g_param_value_validate (pspec, &tmp_value) && !(pspec->flags & G_PARAM_LAX_VALIDATION)) + { + gchar *contents = g_strdup_value_contents (value); + + g_warning ("value \"%s\" of type `%s' is invalid or out of range for property `%s' of type `%s'", + contents, + G_VALUE_TYPE_NAME (value), + pspec->name, + g_type_name (pspec->value_type)); + g_free (contents); + } + else + { + class->set_property (object, param_id, &tmp_value, pspec); + g_object_notify_queue_add (object, nqueue, pspec); + } + g_value_unset (&tmp_value); +} + +static void +object_interface_check_properties (gpointer func_data, + gpointer g_iface) +{ + GTypeInterface *iface_class = g_iface; + GObjectClass *class = g_type_class_peek (iface_class->g_instance_type); + GType iface_type = iface_class->g_type; + GParamSpec **pspecs; + guint n; + + if (!G_IS_OBJECT_CLASS (class)) + return; + + pspecs = g_param_spec_pool_list (pspec_pool, iface_type, &n); + + while (n--) + { + GParamSpec *class_pspec = g_param_spec_pool_lookup (pspec_pool, + pspecs[n]->name, + G_OBJECT_CLASS_TYPE (class), + TRUE); + + if (!class_pspec) + { + g_critical ("Object class %s doesn't implement property " + "'%s' from interface '%s'", + g_type_name (G_OBJECT_CLASS_TYPE (class)), + pspecs[n]->name, + g_type_name (iface_type)); + + continue; + } + + /* The implementation paramspec must have a less restrictive + * type than the interface parameter spec for set() and a + * more restrictive type for get(). We just require equality, + * rather than doing something more complicated checking + * the READABLE and WRITABLE flags. We also simplify here + * by only checking the value type, not the G_PARAM_SPEC_TYPE. + */ + if (class_pspec && + !g_type_is_a (pspecs[n]->value_type, + class_pspec->value_type)) + { + g_critical ("Property '%s' on class '%s' has type '%s' " + "which is different from the type '%s', " + "of the property on interface '%s'\n", + pspecs[n]->name, + g_type_name (G_OBJECT_CLASS_TYPE (class)), + g_type_name (G_PARAM_SPEC_VALUE_TYPE (class_pspec)), + g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspecs[n])), + g_type_name (iface_type)); + } + +#define SUBSET(a,b,mask) (((a) & ~(b) & (mask)) == 0) + + /* CONSTRUCT and CONSTRUCT_ONLY add restrictions. + * READABLE and WRITABLE remove restrictions. The implementation + * paramspec must have less restrictive flags. + */ + if (class_pspec && + (!SUBSET (class_pspec->flags, + pspecs[n]->flags, + G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY) || + !SUBSET (pspecs[n]->flags, + class_pspec->flags, + G_PARAM_READABLE | G_PARAM_WRITABLE))) + { + g_critical ("Flags for property '%s' on class '%s' " + "are not compatible with the property on" + "interface '%s'\n", + pspecs[n]->name, + g_type_name (G_OBJECT_CLASS_TYPE (class)), + g_type_name (iface_type)); + } +#undef SUBSET + } + + g_free (pspecs); +} + +GType +g_object_get_type (void) +{ + return G_TYPE_OBJECT; +} + +/** + * g_object_new: + * @object_type: the type id of the #GObject subtype to instantiate + * @first_property_name: the name of the first property + * @...: the value of the first property, followed optionally by more + * name/value pairs, followed by %NULL + * + * Creates a new instance of a #GObject subtype and sets its properties. + * + * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) + * which are not explicitly specified are set to their default values. + * + * Returns: a new instance of @object_type + */ +gpointer +g_object_new (GType object_type, + const gchar *first_property_name, + ...) +{ + GObject *object; + va_list var_args; + + g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL); + + /* short circuit for calls supplying no properties */ + if (!first_property_name) + return g_object_newv (object_type, 0, NULL); + + va_start (var_args, first_property_name); + object = g_object_new_valist (object_type, first_property_name, var_args); + va_end (var_args); + + return object; +} + +static gboolean +slist_maybe_remove (GSList **slist, + gconstpointer data) +{ + GSList *last = NULL, *node = *slist; + while (node) + { + if (node->data == data) + { + if (last) + last->next = node->next; + else + *slist = node->next; + g_slist_free_1 (node); + return TRUE; + } + last = node; + node = last->next; + } + return FALSE; +} + +static inline gboolean +object_in_construction_list (GObject *object) +{ + gboolean in_construction; + G_LOCK (construction_mutex); + in_construction = g_slist_find (construction_objects, object) != NULL; + G_UNLOCK (construction_mutex); + return in_construction; +} + +/** + * g_object_newv: + * @object_type: the type id of the #GObject subtype to instantiate + * @n_parameters: the length of the @parameters array + * @parameters: an array of #GParameter + * + * Creates a new instance of a #GObject subtype and sets its properties. + * + * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) + * which are not explicitly specified are set to their default values. + * + * Returns: a new instance of @object_type + */ +gpointer +g_object_newv (GType object_type, + guint n_parameters, + GParameter *parameters) +{ + GObjectConstructParam *cparams = NULL, *oparams; + GObjectNotifyQueue *nqueue = NULL; /* shouldn't be initialized, just to silence compiler */ + GObject *object; + GObjectClass *class, *unref_class = NULL; + GSList *slist; + guint n_total_cparams = 0, n_cparams = 0, n_oparams = 0, n_cvalues; + GValue *cvalues; + GList *clist = NULL; + gboolean newly_constructed; + guint i; + + g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL); + + class = g_type_class_peek_static (object_type); + if (!class) + class = unref_class = g_type_class_ref (object_type); + for (slist = class->construct_properties; slist; slist = slist->next) + { + clist = g_list_prepend (clist, slist->data); + n_total_cparams += 1; + } + + if (n_parameters == 0 && n_total_cparams == 0) + { + /* This is a simple object with no construct properties, and + * no properties are being set, so short circuit the parameter + * handling. This speeds up simple object construction. + */ + oparams = NULL; + object = class->constructor (object_type, 0, NULL); + goto did_construction; + } + + /* collect parameters, sort into construction and normal ones */ + oparams = g_new (GObjectConstructParam, n_parameters); + cparams = g_new (GObjectConstructParam, n_total_cparams); + for (i = 0; i < n_parameters; i++) + { + GValue *value = ¶meters[i].value; + GParamSpec *pspec = g_param_spec_pool_lookup (pspec_pool, + parameters[i].name, + object_type, + TRUE); + if (!pspec) + { + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + g_type_name (object_type), + parameters[i].name); + continue; + } + if (!(pspec->flags & G_PARAM_WRITABLE)) + { + g_warning ("%s: property `%s' of object class `%s' is not writable", + G_STRFUNC, + pspec->name, + g_type_name (object_type)); + continue; + } + if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) + { + GList *list = g_list_find (clist, pspec); + + if (!list) + { + g_warning ("%s: construct property \"%s\" for object `%s' can't be set twice", + G_STRFUNC, pspec->name, g_type_name (object_type)); + continue; + } + cparams[n_cparams].pspec = pspec; + cparams[n_cparams].value = value; + n_cparams++; + if (!list->prev) + clist = list->next; + else + list->prev->next = list->next; + if (list->next) + list->next->prev = list->prev; + g_list_free_1 (list); + } + else + { + oparams[n_oparams].pspec = pspec; + oparams[n_oparams].value = value; + n_oparams++; + } + } + + /* set remaining construction properties to default values */ + n_cvalues = n_total_cparams - n_cparams; + cvalues = g_new (GValue, n_cvalues); + while (clist) + { + GList *tmp = clist->next; + GParamSpec *pspec = clist->data; + GValue *value = cvalues + n_total_cparams - n_cparams - 1; + + value->g_type = 0; + g_value_init (value, pspec->value_type); + g_param_value_set_default (pspec, value); + + cparams[n_cparams].pspec = pspec; + cparams[n_cparams].value = value; + n_cparams++; + + g_list_free_1 (clist); + clist = tmp; + } + + /* construct object from construction parameters */ + object = class->constructor (object_type, n_total_cparams, cparams); + /* free construction values */ + g_free (cparams); + while (n_cvalues--) + g_value_unset (cvalues + n_cvalues); + g_free (cvalues); + + did_construction: + if (CLASS_HAS_CUSTOM_CONSTRUCTOR (class)) + { + /* adjust freeze_count according to g_object_init() and remaining properties */ + G_LOCK (construction_mutex); + newly_constructed = slist_maybe_remove (&construction_objects, object); + G_UNLOCK (construction_mutex); + } + else + newly_constructed = TRUE; + + if (CLASS_HAS_PROPS (class)) + { + if (newly_constructed || n_oparams) + nqueue = g_object_notify_queue_freeze (object, &property_notify_context); + if (newly_constructed) + g_object_notify_queue_thaw (object, nqueue); + } + + /* run 'constructed' handler if there is one */ + if (newly_constructed && class->constructed) + class->constructed (object); + + /* set remaining properties */ + for (i = 0; i < n_oparams; i++) + object_set_property (object, oparams[i].pspec, oparams[i].value, nqueue); + g_free (oparams); + + if (CLASS_HAS_PROPS (class)) + { + /* release our own freeze count and handle notifications */ + if (newly_constructed || n_oparams) + g_object_notify_queue_thaw (object, nqueue); + } + + if (unref_class) + g_type_class_unref (unref_class); + + return object; +} + +/** + * g_object_new_valist: + * @object_type: the type id of the #GObject subtype to instantiate + * @first_property_name: the name of the first property + * @var_args: the value of the first property, followed optionally by more + * name/value pairs, followed by %NULL + * + * Creates a new instance of a #GObject subtype and sets its properties. + * + * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) + * which are not explicitly specified are set to their default values. + * + * Returns: a new instance of @object_type + */ +GObject* +g_object_new_valist (GType object_type, + const gchar *first_property_name, + va_list var_args) +{ + GObjectClass *class; + GParameter *params; + const gchar *name; + GObject *object; + guint n_params = 0, n_alloced_params = 16; + + g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL); + + if (!first_property_name) + return g_object_newv (object_type, 0, NULL); + + class = g_type_class_ref (object_type); + + params = g_new0 (GParameter, n_alloced_params); + name = first_property_name; + while (name) + { + gchar *error = NULL; + GParamSpec *pspec = g_param_spec_pool_lookup (pspec_pool, + name, + object_type, + TRUE); + if (!pspec) + { + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + g_type_name (object_type), + name); + break; + } + if (n_params >= n_alloced_params) + { + n_alloced_params += 16; + params = g_renew (GParameter, params, n_alloced_params); + } + params[n_params].name = name; + G_VALUE_COLLECT_INIT (¶ms[n_params].value, pspec->value_type, + var_args, 0, &error); + if (error) + { + g_warning ("%s: %s", G_STRFUNC, error); + g_free (error); + g_value_unset (¶ms[n_params].value); + break; + } + n_params++; + name = va_arg (var_args, gchar*); + } + + object = g_object_newv (object_type, n_params, params); + + while (n_params--) + g_value_unset (¶ms[n_params].value); + g_free (params); + + g_type_class_unref (class); + + return object; +} + +static GObject* +g_object_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + + /* create object */ + object = (GObject*) g_type_create_instance (type); + + /* set construction parameters */ + if (n_construct_properties) + { + GObjectNotifyQueue *nqueue = g_object_notify_queue_freeze (object, &property_notify_context); + + /* set construct properties */ + while (n_construct_properties--) + { + GValue *value = construct_params->value; + GParamSpec *pspec = construct_params->pspec; + + construct_params++; + object_set_property (object, pspec, value, nqueue); + } + g_object_notify_queue_thaw (object, nqueue); + /* the notification queue is still frozen from g_object_init(), so + * we don't need to handle it here, g_object_newv() takes + * care of that + */ + } + + return object; +} + +/** + * g_object_set_valist: + * @object: a #GObject + * @first_property_name: name of the first property to set + * @var_args: value for the first property, followed optionally by more + * name/value pairs, followed by %NULL + * + * Sets properties on an object. + */ +void +g_object_set_valist (GObject *object, + const gchar *first_property_name, + va_list var_args) +{ + GObjectNotifyQueue *nqueue; + const gchar *name; + + g_return_if_fail (G_IS_OBJECT (object)); + + g_object_ref (object); + nqueue = g_object_notify_queue_freeze (object, &property_notify_context); + + name = first_property_name; + while (name) + { + GValue value = { 0, }; + GParamSpec *pspec; + gchar *error = NULL; + + pspec = g_param_spec_pool_lookup (pspec_pool, + name, + G_OBJECT_TYPE (object), + TRUE); + if (!pspec) + { + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + G_OBJECT_TYPE_NAME (object), + name); + break; + } + if (!(pspec->flags & G_PARAM_WRITABLE)) + { + g_warning ("%s: property `%s' of object class `%s' is not writable", + G_STRFUNC, + pspec->name, + G_OBJECT_TYPE_NAME (object)); + break; + } + if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) && !object_in_construction_list (object)) + { + g_warning ("%s: construct property \"%s\" for object `%s' can't be set after construction", + G_STRFUNC, pspec->name, G_OBJECT_TYPE_NAME (object)); + break; + } + + G_VALUE_COLLECT_INIT (&value, pspec->value_type, var_args, + 0, &error); + if (error) + { + g_warning ("%s: %s", G_STRFUNC, error); + g_free (error); + g_value_unset (&value); + break; + } + + object_set_property (object, pspec, &value, nqueue); + g_value_unset (&value); + + name = va_arg (var_args, gchar*); + } + + g_object_notify_queue_thaw (object, nqueue); + g_object_unref (object); +} + +/** + * g_object_get_valist: + * @object: a #GObject + * @first_property_name: name of the first property to get + * @var_args: return location for the first property, followed optionally by more + * name/return location pairs, followed by %NULL + * + * Gets properties of an object. + * + * In general, a copy is made of the property contents and the caller + * is responsible for freeing the memory in the appropriate manner for + * the type, for instance by calling g_free() or g_object_unref(). + * + * See g_object_get(). + */ +void +g_object_get_valist (GObject *object, + const gchar *first_property_name, + va_list var_args) +{ + const gchar *name; + + g_return_if_fail (G_IS_OBJECT (object)); + + g_object_ref (object); + + name = first_property_name; + + while (name) + { + GValue value = { 0, }; + GParamSpec *pspec; + gchar *error; + + pspec = g_param_spec_pool_lookup (pspec_pool, + name, + G_OBJECT_TYPE (object), + TRUE); + if (!pspec) + { + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + G_OBJECT_TYPE_NAME (object), + name); + break; + } + if (!(pspec->flags & G_PARAM_READABLE)) + { + g_warning ("%s: property `%s' of object class `%s' is not readable", + G_STRFUNC, + pspec->name, + G_OBJECT_TYPE_NAME (object)); + break; + } + + g_value_init (&value, pspec->value_type); + + object_get_property (object, pspec, &value); + + G_VALUE_LCOPY (&value, var_args, 0, &error); + if (error) + { + g_warning ("%s: %s", G_STRFUNC, error); + g_free (error); + g_value_unset (&value); + break; + } + + g_value_unset (&value); + + name = va_arg (var_args, gchar*); + } + + g_object_unref (object); +} + +/** + * g_object_set: + * @object: a #GObject + * @first_property_name: name of the first property to set + * @...: value for the first property, followed optionally by more + * name/value pairs, followed by %NULL + * + * Sets properties on an object. + */ +void +g_object_set (gpointer _object, + const gchar *first_property_name, + ...) +{ + GObject *object = _object; + va_list var_args; + + g_return_if_fail (G_IS_OBJECT (object)); + + va_start (var_args, first_property_name); + g_object_set_valist (object, first_property_name, var_args); + va_end (var_args); +} + +/** + * g_object_get: + * @object: a #GObject + * @first_property_name: name of the first property to get + * @...: return location for the first property, followed optionally by more + * name/return location pairs, followed by %NULL + * + * Gets properties of an object. + * + * In general, a copy is made of the property contents and the caller + * is responsible for freeing the memory in the appropriate manner for + * the type, for instance by calling g_free() or g_object_unref(). + * + * + * Using g_object_get(<!-- -->) + * An example of using g_object_get() to get the contents + * of three properties - one of type #G_TYPE_INT, + * one of type #G_TYPE_STRING, and one of type #G_TYPE_OBJECT: + * + * gint intval; + * gchar *strval; + * GObject *objval; + * + * g_object_get (my_object, + * "int-property", &intval, + * "str-property", &strval, + * "obj-property", &objval, + * NULL); + * + * // Do something with intval, strval, objval + * + * g_free (strval); + * g_object_unref (objval); + * + * + */ +void +g_object_get (gpointer _object, + const gchar *first_property_name, + ...) +{ + GObject *object = _object; + va_list var_args; + + g_return_if_fail (G_IS_OBJECT (object)); + + va_start (var_args, first_property_name); + g_object_get_valist (object, first_property_name, var_args); + va_end (var_args); +} + +/** + * g_object_set_property: + * @object: a #GObject + * @property_name: the name of the property to set + * @value: the value + * + * Sets a property on an object. + */ +void +g_object_set_property (GObject *object, + const gchar *property_name, + const GValue *value) +{ + GObjectNotifyQueue *nqueue; + GParamSpec *pspec; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (property_name != NULL); + g_return_if_fail (G_IS_VALUE (value)); + + g_object_ref (object); + nqueue = g_object_notify_queue_freeze (object, &property_notify_context); + + pspec = g_param_spec_pool_lookup (pspec_pool, + property_name, + G_OBJECT_TYPE (object), + TRUE); + if (!pspec) + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + G_OBJECT_TYPE_NAME (object), + property_name); + else if (!(pspec->flags & G_PARAM_WRITABLE)) + g_warning ("%s: property `%s' of object class `%s' is not writable", + G_STRFUNC, + pspec->name, + G_OBJECT_TYPE_NAME (object)); + else if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) && !object_in_construction_list (object)) + g_warning ("%s: construct property \"%s\" for object `%s' can't be set after construction", + G_STRFUNC, pspec->name, G_OBJECT_TYPE_NAME (object)); + else + object_set_property (object, pspec, value, nqueue); + + g_object_notify_queue_thaw (object, nqueue); + g_object_unref (object); +} + +/** + * g_object_get_property: + * @object: a #GObject + * @property_name: the name of the property to get + * @value: return location for the property value + * + * Gets a property of an object. + * + * In general, a copy is made of the property contents and the caller is + * responsible for freeing the memory by calling g_value_unset(). + * + * Note that g_object_get_property() is really intended for language + * bindings, g_object_get() is much more convenient for C programming. + */ +void +g_object_get_property (GObject *object, + const gchar *property_name, + GValue *value) +{ + GParamSpec *pspec; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (property_name != NULL); + g_return_if_fail (G_IS_VALUE (value)); + + g_object_ref (object); + + pspec = g_param_spec_pool_lookup (pspec_pool, + property_name, + G_OBJECT_TYPE (object), + TRUE); + if (!pspec) + g_warning ("%s: object class `%s' has no property named `%s'", + G_STRFUNC, + G_OBJECT_TYPE_NAME (object), + property_name); + else if (!(pspec->flags & G_PARAM_READABLE)) + g_warning ("%s: property `%s' of object class `%s' is not readable", + G_STRFUNC, + pspec->name, + G_OBJECT_TYPE_NAME (object)); + else + { + GValue *prop_value, tmp_value = { 0, }; + + /* auto-conversion of the callers value type + */ + if (G_VALUE_TYPE (value) == pspec->value_type) + { + g_value_reset (value); + prop_value = value; + } + else if (!g_value_type_transformable (pspec->value_type, G_VALUE_TYPE (value))) + { + g_warning ("%s: can't retrieve property `%s' of type `%s' as value of type `%s'", + G_STRFUNC, pspec->name, + g_type_name (pspec->value_type), + G_VALUE_TYPE_NAME (value)); + g_object_unref (object); + return; + } + else + { + g_value_init (&tmp_value, pspec->value_type); + prop_value = &tmp_value; + } + object_get_property (object, pspec, prop_value); + if (prop_value != value) + { + g_value_transform (prop_value, value); + g_value_unset (&tmp_value); + } + } + + g_object_unref (object); +} + +/** + * g_object_connect: + * @object: a #GObject + * @signal_spec: the spec for the first signal + * @...: #GCallback for the first signal, followed by data for the + * first signal, followed optionally by more signal + * spec/callback/data triples, followed by %NULL + * + * A convenience function to connect multiple signals at once. + * + * The signal specs expected by this function have the form + * "modifier::signal_name", where modifier can be one of the following: + * + * + * signal + * + * equivalent to g_signal_connect_data (..., NULL, 0) + * + * + * + * object_signal + * object-signal + * + * equivalent to g_signal_connect_object (..., 0) + * + * + * + * swapped_signal + * swapped-signal + * + * equivalent to g_signal_connect_data (..., NULL, G_CONNECT_SWAPPED) + * + * + * + * swapped_object_signal + * swapped-object-signal + * + * equivalent to g_signal_connect_object (..., G_CONNECT_SWAPPED) + * + * + * + * signal_after + * signal-after + * + * equivalent to g_signal_connect_data (..., NULL, G_CONNECT_AFTER) + * + * + * + * object_signal_after + * object-signal-after + * + * equivalent to g_signal_connect_object (..., G_CONNECT_AFTER) + * + * + * + * swapped_signal_after + * swapped-signal-after + * + * equivalent to g_signal_connect_data (..., NULL, G_CONNECT_SWAPPED | G_CONNECT_AFTER) + * + * + * + * swapped_object_signal_after + * swapped-object-signal-after + * + * equivalent to g_signal_connect_object (..., G_CONNECT_SWAPPED | G_CONNECT_AFTER) + * + * + * + * + * |[ + * menu->toplevel = g_object_connect (g_object_new (GTK_TYPE_WINDOW, + * "type", GTK_WINDOW_POPUP, + * "child", menu, + * NULL), + * "signal::event", gtk_menu_window_event, menu, + * "signal::size_request", gtk_menu_window_size_request, menu, + * "signal::destroy", gtk_widget_destroyed, &menu->toplevel, + * NULL); + * ]| + * + * Returns: @object + */ +gpointer +g_object_connect (gpointer _object, + const gchar *signal_spec, + ...) +{ + GObject *object = _object; + va_list var_args; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (object->ref_count > 0, object); + + va_start (var_args, signal_spec); + while (signal_spec) + { + GCallback callback = va_arg (var_args, GCallback); + gpointer data = va_arg (var_args, gpointer); + gulong sid; + + if (strncmp (signal_spec, "signal::", 8) == 0) + sid = g_signal_connect_data (object, signal_spec + 8, + callback, data, NULL, + 0); + else if (strncmp (signal_spec, "object_signal::", 15) == 0 || + strncmp (signal_spec, "object-signal::", 15) == 0) + sid = g_signal_connect_object (object, signal_spec + 15, + callback, data, + 0); + else if (strncmp (signal_spec, "swapped_signal::", 16) == 0 || + strncmp (signal_spec, "swapped-signal::", 16) == 0) + sid = g_signal_connect_data (object, signal_spec + 16, + callback, data, NULL, + G_CONNECT_SWAPPED); + else if (strncmp (signal_spec, "swapped_object_signal::", 23) == 0 || + strncmp (signal_spec, "swapped-object-signal::", 23) == 0) + sid = g_signal_connect_object (object, signal_spec + 23, + callback, data, + G_CONNECT_SWAPPED); + else if (strncmp (signal_spec, "signal_after::", 14) == 0 || + strncmp (signal_spec, "signal-after::", 14) == 0) + sid = g_signal_connect_data (object, signal_spec + 14, + callback, data, NULL, + G_CONNECT_AFTER); + else if (strncmp (signal_spec, "object_signal_after::", 21) == 0 || + strncmp (signal_spec, "object-signal-after::", 21) == 0) + sid = g_signal_connect_object (object, signal_spec + 21, + callback, data, + G_CONNECT_AFTER); + else if (strncmp (signal_spec, "swapped_signal_after::", 22) == 0 || + strncmp (signal_spec, "swapped-signal-after::", 22) == 0) + sid = g_signal_connect_data (object, signal_spec + 22, + callback, data, NULL, + G_CONNECT_SWAPPED | G_CONNECT_AFTER); + else if (strncmp (signal_spec, "swapped_object_signal_after::", 29) == 0 || + strncmp (signal_spec, "swapped-object-signal-after::", 29) == 0) + sid = g_signal_connect_object (object, signal_spec + 29, + callback, data, + G_CONNECT_SWAPPED | G_CONNECT_AFTER); + else + { + g_warning ("%s: invalid signal spec \"%s\"", G_STRFUNC, signal_spec); + break; + } + signal_spec = va_arg (var_args, gchar*); + } + va_end (var_args); + + return object; +} + +/** + * g_object_disconnect: + * @object: a #GObject + * @signal_spec: the spec for the first signal + * @...: #GCallback for the first signal, followed by data for the first signal, + * followed optionally by more signal spec/callback/data triples, + * followed by %NULL + * + * A convenience function to disconnect multiple signals at once. + * + * The signal specs expected by this function have the form + * "any_signal", which means to disconnect any signal with matching + * callback and data, or "any_signal::signal_name", which only + * disconnects the signal named "signal_name". + */ +void +g_object_disconnect (gpointer _object, + const gchar *signal_spec, + ...) +{ + GObject *object = _object; + va_list var_args; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (object->ref_count > 0); + + va_start (var_args, signal_spec); + while (signal_spec) + { + GCallback callback = va_arg (var_args, GCallback); + gpointer data = va_arg (var_args, gpointer); + guint sid = 0, detail = 0, mask = 0; + + if (strncmp (signal_spec, "any_signal::", 12) == 0 || + strncmp (signal_spec, "any-signal::", 12) == 0) + { + signal_spec += 12; + mask = G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA; + } + else if (strcmp (signal_spec, "any_signal") == 0 || + strcmp (signal_spec, "any-signal") == 0) + { + signal_spec += 10; + mask = G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA; + } + else + { + g_warning ("%s: invalid signal spec \"%s\"", G_STRFUNC, signal_spec); + break; + } + + if ((mask & G_SIGNAL_MATCH_ID) && + !g_signal_parse_name (signal_spec, G_OBJECT_TYPE (object), &sid, &detail, FALSE)) + g_warning ("%s: invalid signal name \"%s\"", G_STRFUNC, signal_spec); + else if (!g_signal_handlers_disconnect_matched (object, mask | (detail ? G_SIGNAL_MATCH_DETAIL : 0), + sid, detail, + NULL, (gpointer)callback, data)) + g_warning ("%s: signal handler %p(%p) is not connected", G_STRFUNC, callback, data); + signal_spec = va_arg (var_args, gchar*); + } + va_end (var_args); +} + +typedef struct { + GObject *object; + guint n_weak_refs; + struct { + GWeakNotify notify; + gpointer data; + } weak_refs[1]; /* flexible array */ +} WeakRefStack; + +static void +weak_refs_notify (gpointer data) +{ + WeakRefStack *wstack = data; + guint i; + + for (i = 0; i < wstack->n_weak_refs; i++) + wstack->weak_refs[i].notify (wstack->weak_refs[i].data, wstack->object); + g_free (wstack); +} + +/** + * g_object_weak_ref: + * @object: #GObject to reference weakly + * @notify: callback to invoke before the object is freed + * @data: extra data to pass to notify + * + * Adds a weak reference callback to an object. Weak references are + * used for notification when an object is finalized. They are called + * "weak references" because they allow you to safely hold a pointer + * to an object without calling g_object_ref() (g_object_ref() adds a + * strong reference, that is, forces the object to stay alive). + */ +void +g_object_weak_ref (GObject *object, + GWeakNotify notify, + gpointer data) +{ + WeakRefStack *wstack; + guint i; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (notify != NULL); + g_return_if_fail (object->ref_count >= 1); + + wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_refs); + if (wstack) + { + i = wstack->n_weak_refs++; + wstack = g_realloc (wstack, sizeof (*wstack) + sizeof (wstack->weak_refs[0]) * i); + } + else + { + wstack = g_renew (WeakRefStack, NULL, 1); + wstack->object = object; + wstack->n_weak_refs = 1; + i = 0; + } + wstack->weak_refs[i].notify = notify; + wstack->weak_refs[i].data = data; + g_datalist_id_set_data_full (&object->qdata, quark_weak_refs, wstack, weak_refs_notify); +} + +/** + * g_object_weak_unref: + * @object: #GObject to remove a weak reference from + * @notify: callback to search for + * @data: data to search for + * + * Removes a weak reference callback to an object. + */ +void +g_object_weak_unref (GObject *object, + GWeakNotify notify, + gpointer data) +{ + WeakRefStack *wstack; + gboolean found_one = FALSE; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (notify != NULL); + + wstack = g_datalist_id_get_data (&object->qdata, quark_weak_refs); + if (wstack) + { + guint i; + + for (i = 0; i < wstack->n_weak_refs; i++) + if (wstack->weak_refs[i].notify == notify && + wstack->weak_refs[i].data == data) + { + found_one = TRUE; + wstack->n_weak_refs -= 1; + if (i != wstack->n_weak_refs) + wstack->weak_refs[i] = wstack->weak_refs[wstack->n_weak_refs]; + + break; + } + } + if (!found_one) + g_warning ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data); +} + +/** + * g_object_add_weak_pointer: + * @object: The object that should be weak referenced. + * @weak_pointer_location: The memory address of a pointer. + * + * Adds a weak reference from weak_pointer to @object to indicate that + * the pointer located at @weak_pointer_location is only valid during + * the lifetime of @object. When the @object is finalized, + * @weak_pointer will be set to %NULL. + */ +void +g_object_add_weak_pointer (GObject *object, + gpointer *weak_pointer_location) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (weak_pointer_location != NULL); + + g_object_weak_ref (object, + (GWeakNotify) g_nullify_pointer, + weak_pointer_location); +} + +/** + * g_object_remove_weak_pointer: + * @object: The object that is weak referenced. + * @weak_pointer_location: The memory address of a pointer. + * + * Removes a weak reference from @object that was previously added + * using g_object_add_weak_pointer(). The @weak_pointer_location has + * to match the one used with g_object_add_weak_pointer(). + */ +void +g_object_remove_weak_pointer (GObject *object, + gpointer *weak_pointer_location) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (weak_pointer_location != NULL); + + g_object_weak_unref (object, + (GWeakNotify) g_nullify_pointer, + weak_pointer_location); +} + +static guint +object_floating_flag_handler (GObject *object, + gint job) +{ + switch (job) + { + gpointer oldvalue; + case +1: /* force floating if possible */ + do + oldvalue = g_atomic_pointer_get (&object->qdata); + while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue, + (gpointer) ((gsize) oldvalue | OBJECT_FLOATING_FLAG))); + return (gsize) oldvalue & OBJECT_FLOATING_FLAG; + case -1: /* sink if possible */ + do + oldvalue = g_atomic_pointer_get (&object->qdata); + while (!g_atomic_pointer_compare_and_exchange ((void**) &object->qdata, oldvalue, + (gpointer) ((gsize) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG))); + return (gsize) oldvalue & OBJECT_FLOATING_FLAG; + default: /* check floating */ + return 0 != ((gsize) g_atomic_pointer_get (&object->qdata) & OBJECT_FLOATING_FLAG); + } +} + +/** + * g_object_is_floating: + * @object: a #GObject + * + * Checks wether @object has a floating + * reference. + * + * Since: 2.10 + * + * Returns: %TRUE if @object has a floating reference + */ +gboolean +g_object_is_floating (gpointer _object) +{ + GObject *object = _object; + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + return floating_flag_handler (object, 0); +} + +/** + * g_object_ref_sink: + * @object: a #GObject + * + * Increase the reference count of @object, and possibly remove the + * floating reference, if @object + * has a floating reference. + * + * In other words, if the object is floating, then this call "assumes + * ownership" of the floating reference, converting it to a normal + * reference by clearing the floating flag while leaving the reference + * count unchanged. If the object is not floating, then this call + * adds a new normal reference increasing the reference count by one. + * + * Since: 2.10 + * + * Returns: @object + */ +gpointer +g_object_ref_sink (gpointer _object) +{ + GObject *object = _object; + gboolean was_floating; + g_return_val_if_fail (G_IS_OBJECT (object), object); + g_return_val_if_fail (object->ref_count >= 1, object); + g_object_ref (object); + was_floating = floating_flag_handler (object, -1); + if (was_floating) + g_object_unref (object); + return object; +} + +/** + * g_object_force_floating: + * @object: a #GObject + * + * This function is intended for #GObject implementations to re-enforce a + * floating object reference. + * Doing this is seldomly required, all + * #GInitiallyUnowneds are created with a floating reference which + * usually just needs to be sunken by calling g_object_ref_sink(). + * + * Since: 2.10 + */ +void +g_object_force_floating (GObject *object) +{ + gboolean was_floating; + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (object->ref_count >= 1); + + was_floating = floating_flag_handler (object, +1); +} + +typedef struct { + GObject *object; + guint n_toggle_refs; + struct { + GToggleNotify notify; + gpointer data; + } toggle_refs[1]; /* flexible array */ +} ToggleRefStack; + +static void +toggle_refs_notify (GObject *object, + gboolean is_last_ref) +{ + ToggleRefStack *tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs); + + /* Reentrancy here is not as tricky as it seems, because a toggle reference + * will only be notified when there is exactly one of them. + */ + g_assert (tstack->n_toggle_refs == 1); + tstack->toggle_refs[0].notify (tstack->toggle_refs[0].data, tstack->object, is_last_ref); +} + +/** + * g_object_add_toggle_ref: + * @object: a #GObject + * @notify: a function to call when this reference is the + * last reference to the object, or is no longer + * the last reference. + * @data: data to pass to @notify + * + * Increases the reference count of the object by one and sets a + * callback to be called when all other references to the object are + * dropped, or when this is already the last reference to the object + * and another reference is established. + * + * This functionality is intended for binding @object to a proxy + * object managed by another memory manager. This is done with two + * paired references: the strong reference added by + * g_object_add_toggle_ref() and a reverse reference to the proxy + * object which is either a strong reference or weak reference. + * + * The setup is that when there are no other references to @object, + * only a weak reference is held in the reverse direction from @object + * to the proxy object, but when there are other references held to + * @object, a strong reference is held. The @notify callback is called + * when the reference from @object to the proxy object should be + * toggled from strong to weak (@is_last_ref + * true) or weak to strong (@is_last_ref false). + * + * Since a (normal) reference must be held to the object before + * calling g_object_toggle_ref(), the initial state of the reverse + * link is always strong. + * + * Multiple toggle references may be added to the same gobject, + * however if there are multiple toggle references to an object, none + * of them will ever be notified until all but one are removed. For + * this reason, you should only ever use a toggle reference if there + * is important state in the proxy object. + * + * Since: 2.8 + */ +void +g_object_add_toggle_ref (GObject *object, + GToggleNotify notify, + gpointer data) +{ + ToggleRefStack *tstack; + guint i; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (notify != NULL); + g_return_if_fail (object->ref_count >= 1); + + g_object_ref (object); + + tstack = g_datalist_id_remove_no_notify (&object->qdata, quark_toggle_refs); + if (tstack) + { + i = tstack->n_toggle_refs++; + /* allocate i = tstate->n_toggle_refs - 1 positions beyond the 1 declared + * in tstate->toggle_refs */ + tstack = g_realloc (tstack, sizeof (*tstack) + sizeof (tstack->toggle_refs[0]) * i); + } + else + { + tstack = g_renew (ToggleRefStack, NULL, 1); + tstack->object = object; + tstack->n_toggle_refs = 1; + i = 0; + } + + /* Set a flag for fast lookup after adding the first toggle reference */ + if (tstack->n_toggle_refs == 1) + g_datalist_set_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG); + + tstack->toggle_refs[i].notify = notify; + tstack->toggle_refs[i].data = data; + g_datalist_id_set_data_full (&object->qdata, quark_toggle_refs, tstack, + (GDestroyNotify)g_free); +} + +/** + * g_object_remove_toggle_ref: + * @object: a #GObject + * @notify: a function to call when this reference is the + * last reference to the object, or is no longer + * the last reference. + * @data: data to pass to @notify + * + * Removes a reference added with g_object_add_toggle_ref(). The + * reference count of the object is decreased by one. + * + * Since: 2.8 + */ +void +g_object_remove_toggle_ref (GObject *object, + GToggleNotify notify, + gpointer data) +{ + ToggleRefStack *tstack; + gboolean found_one = FALSE; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (notify != NULL); + + tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs); + if (tstack) + { + guint i; + + for (i = 0; i < tstack->n_toggle_refs; i++) + if (tstack->toggle_refs[i].notify == notify && + tstack->toggle_refs[i].data == data) + { + found_one = TRUE; + tstack->n_toggle_refs -= 1; + if (i != tstack->n_toggle_refs) + tstack->toggle_refs[i] = tstack->toggle_refs[tstack->n_toggle_refs]; + + if (tstack->n_toggle_refs == 0) + g_datalist_unset_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG); + + g_object_unref (object); + + break; + } + } + + if (!found_one) + g_warning ("%s: couldn't find toggle ref %p(%p)", G_STRFUNC, notify, data); +} + +/** + * g_object_ref: + * @object: a #GObject + * + * Increases the reference count of @object. + * + * Returns: the same @object + */ +gpointer +g_object_ref (gpointer _object) +{ + GObject *object = _object; + gint old_val; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (object->ref_count > 0, NULL); + +#ifdef G_ENABLE_DEBUG + if (g_trap_object_ref == object) + G_BREAKPOINT (); +#endif /* G_ENABLE_DEBUG */ + + + old_val = g_atomic_int_exchange_and_add ((int *)&object->ref_count, 1); + + if (old_val == 1 && OBJECT_HAS_TOGGLE_REF (object)) + toggle_refs_notify (object, FALSE); + + return object; +} + +/** + * g_object_unref: + * @object: a #GObject + * + * Decreases the reference count of @object. When its reference count + * drops to 0, the object is finalized (i.e. its memory is freed). + */ +void +g_object_unref (gpointer _object) +{ + GObject *object = _object; + gint old_ref; + gboolean is_zero; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (object->ref_count > 0); + +#ifdef G_ENABLE_DEBUG + if (g_trap_object_ref == object) + G_BREAKPOINT (); +#endif /* G_ENABLE_DEBUG */ + + /* here we want to atomically do: if (ref_count>1) { ref_count--; return; } */ + retry_atomic_decrement1: + old_ref = g_atomic_int_get (&object->ref_count); + if (old_ref > 1) + { + /* valid if last 2 refs are owned by this call to unref and the toggle_ref */ + gboolean has_toggle_ref = OBJECT_HAS_TOGGLE_REF (object); + + if (!g_atomic_int_compare_and_exchange ((int *)&object->ref_count, old_ref, old_ref - 1)) + goto retry_atomic_decrement1; + + /* if we went from 2->1 we need to notify toggle refs if any */ + if (old_ref == 2 && has_toggle_ref) /* The last ref being held in this case is owned by the toggle_ref */ + toggle_refs_notify (object, TRUE); + } + else + { + /* we are about tp remove the last reference */ + G_OBJECT_GET_CLASS (object)->dispose (object); + + /* may have been re-referenced meanwhile */ + retry_atomic_decrement2: + old_ref = g_atomic_int_get ((int *)&object->ref_count); + if (old_ref > 1) + { + /* valid if last 2 refs are owned by this call to unref and the toggle_ref */ + gboolean has_toggle_ref = OBJECT_HAS_TOGGLE_REF (object); + + if (!g_atomic_int_compare_and_exchange ((int *)&object->ref_count, old_ref, old_ref - 1)) + goto retry_atomic_decrement2; + + /* if we went from 2->1 we need to notify toggle refs if any */ + if (old_ref == 2 && has_toggle_ref) /* The last ref being held in this case is owned by the toggle_ref */ + toggle_refs_notify (object, TRUE); + + return; + } + + /* we are still in the process of taking away the last ref */ + g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL); + g_signal_handlers_destroy (object); + g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL); + + /* decrement the last reference */ + is_zero = g_atomic_int_dec_and_test ((int *)&object->ref_count); + + /* may have been re-referenced meanwhile */ + if (G_LIKELY (is_zero)) + { + G_OBJECT_GET_CLASS (object)->finalize (object); +#ifdef G_ENABLE_DEBUG + IF_DEBUG (OBJECTS) + { + /* catch objects not chaining finalize handlers */ + G_LOCK (debug_objects); + g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL); + G_UNLOCK (debug_objects); + } +#endif /* G_ENABLE_DEBUG */ + g_type_free_instance ((GTypeInstance*) object); + } + } +} + +/** + * g_object_get_qdata: + * @object: The GObject to get a stored user data pointer from + * @quark: A #GQuark, naming the user data pointer + * + * This function gets back user data pointers stored via + * g_object_set_qdata(). + * + * Returns: The user data pointer set, or %NULL + */ +gpointer +g_object_get_qdata (GObject *object, + GQuark quark) +{ + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + + return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL; +} + +/** + * g_object_set_qdata: + * @object: The GObject to set store a user data pointer + * @quark: A #GQuark, naming the user data pointer + * @data: An opaque user data pointer + * + * This sets an opaque, named pointer on an object. + * The name is specified through a #GQuark (retrived e.g. via + * g_quark_from_static_string()), and the pointer + * can be gotten back from the @object with g_object_get_qdata() + * until the @object is finalized. + * Setting a previously set user data pointer, overrides (frees) + * the old pointer set, using #NULL as pointer essentially + * removes the data stored. + */ +void +g_object_set_qdata (GObject *object, + GQuark quark, + gpointer data) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (quark > 0); + + g_datalist_id_set_data (&object->qdata, quark, data); +} + +/** + * g_object_set_qdata_full: + * @object: The GObject to set store a user data pointer + * @quark: A #GQuark, naming the user data pointer + * @data: An opaque user data pointer + * @destroy: Function to invoke with @data as argument, when @data + * needs to be freed + * + * This function works like g_object_set_qdata(), but in addition, + * a void (*destroy) (gpointer) function may be specified which is + * called with @data as argument when the @object is finalized, or + * the data is being overwritten by a call to g_object_set_qdata() + * with the same @quark. + */ +void +g_object_set_qdata_full (GObject *object, + GQuark quark, + gpointer data, + GDestroyNotify destroy) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (quark > 0); + + g_datalist_id_set_data_full (&object->qdata, quark, data, + data ? destroy : (GDestroyNotify) NULL); +} + +/** + * g_object_steal_qdata: + * @object: The GObject to get a stored user data pointer from + * @quark: A #GQuark, naming the user data pointer + * + * This function gets back user data pointers stored via + * g_object_set_qdata() and removes the @data from object + * without invoking its destroy() function (if any was + * set). + * Usually, calling this function is only required to update + * user data pointers with a destroy notifier, for example: + * |[ + * void + * object_add_to_user_list (GObject *object, + * const gchar *new_string) + * { + * // the quark, naming the object data + * GQuark quark_string_list = g_quark_from_static_string ("my-string-list"); + * // retrive the old string list + * GList *list = g_object_steal_qdata (object, quark_string_list); + * + * // prepend new string + * list = g_list_prepend (list, g_strdup (new_string)); + * // this changed 'list', so we need to set it again + * g_object_set_qdata_full (object, quark_string_list, list, free_string_list); + * } + * static void + * free_string_list (gpointer data) + * { + * GList *node, *list = data; + * + * for (node = list; node; node = node->next) + * g_free (node->data); + * g_list_free (list); + * } + * ]| + * Using g_object_get_qdata() in the above example, instead of + * g_object_steal_qdata() would have left the destroy function set, + * and thus the partial string list would have been freed upon + * g_object_set_qdata_full(). + * + * Returns: The user data pointer set, or %NULL + */ +gpointer +g_object_steal_qdata (GObject *object, + GQuark quark) +{ + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (quark > 0, NULL); + + return g_datalist_id_remove_no_notify (&object->qdata, quark); +} + +/** + * g_object_get_data: + * @object: #GObject containing the associations + * @key: name of the key for that association + * + * Gets a named field from the objects table of associations (see g_object_set_data()). + * + * Returns: the data if found, or %NULL if no such data exists. + */ +gpointer +g_object_get_data (GObject *object, + const gchar *key) +{ + GQuark quark; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (key != NULL, NULL); + + quark = g_quark_try_string (key); + + return quark ? g_datalist_id_get_data (&object->qdata, quark) : NULL; +} + +/** + * g_object_set_data: + * @object: #GObject containing the associations. + * @key: name of the key + * @data: data to associate with that key + * + * Each object carries around a table of associations from + * strings to pointers. This function lets you set an association. + * + * If the object already had an association with that name, + * the old association will be destroyed. + */ +void +g_object_set_data (GObject *object, + const gchar *key, + gpointer data) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (key != NULL); + + g_datalist_id_set_data (&object->qdata, g_quark_from_string (key), data); +} + +/** + * g_object_set_data_full: + * @object: #GObject containing the associations + * @key: name of the key + * @data: data to associate with that key + * @destroy: function to call when the association is destroyed + * + * Like g_object_set_data() except it adds notification + * for when the association is destroyed, either by setting it + * to a different value or when the object is destroyed. + * + * Note that the @destroy callback is not called if @data is %NULL. + */ +void +g_object_set_data_full (GObject *object, + const gchar *key, + gpointer data, + GDestroyNotify destroy) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (key != NULL); + + g_datalist_id_set_data_full (&object->qdata, g_quark_from_string (key), data, + data ? destroy : (GDestroyNotify) NULL); +} + +/** + * g_object_steal_data: + * @object: #GObject containing the associations + * @key: name of the key + * + * Remove a specified datum from the object's data associations, + * without invoking the association's destroy handler. + * + * Returns: the data if found, or %NULL if no such data exists. + */ +gpointer +g_object_steal_data (GObject *object, + const gchar *key) +{ + GQuark quark; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (key != NULL, NULL); + + quark = g_quark_try_string (key); + + return quark ? g_datalist_id_remove_no_notify (&object->qdata, quark) : NULL; +} + +static void +g_value_object_init (GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static void +g_value_object_free_value (GValue *value) +{ + if (value->data[0].v_pointer) + g_object_unref (value->data[0].v_pointer); +} + +static void +g_value_object_copy_value (const GValue *src_value, + GValue *dest_value) +{ + if (src_value->data[0].v_pointer) + dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer); + else + dest_value->data[0].v_pointer = NULL; +} + +static void +g_value_object_transform_value (const GValue *src_value, + GValue *dest_value) +{ + if (src_value->data[0].v_pointer && g_type_is_a (G_OBJECT_TYPE (src_value->data[0].v_pointer), G_VALUE_TYPE (dest_value))) + dest_value->data[0].v_pointer = g_object_ref (src_value->data[0].v_pointer); + else + dest_value->data[0].v_pointer = NULL; +} + +static gpointer +g_value_object_peek_pointer (const GValue *value) +{ + return value->data[0].v_pointer; +} + +static gchar* +g_value_object_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + if (collect_values[0].v_pointer) + { + GObject *object = collect_values[0].v_pointer; + + if (object->g_type_instance.g_class == NULL) + return g_strconcat ("invalid unclassed object pointer for value type `", + G_VALUE_TYPE_NAME (value), + "'", + NULL); + else if (!g_value_type_compatible (G_OBJECT_TYPE (object), G_VALUE_TYPE (value))) + return g_strconcat ("invalid object type `", + G_OBJECT_TYPE_NAME (object), + "' for value type `", + G_VALUE_TYPE_NAME (value), + "'", + NULL); + /* never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types */ + value->data[0].v_pointer = g_object_ref (object); + } + else + value->data[0].v_pointer = NULL; + + return NULL; +} + +static gchar* +g_value_object_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + GObject **object_p = collect_values[0].v_pointer; + + if (!object_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + if (!value->data[0].v_pointer) + *object_p = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + *object_p = value->data[0].v_pointer; + else + *object_p = g_object_ref (value->data[0].v_pointer); + + return NULL; +} + +/** + * g_value_set_object: + * @value: a valid #GValue of %G_TYPE_OBJECT derived type + * @v_object: object value to be set + * + * Set the contents of a %G_TYPE_OBJECT derived #GValue to @v_object. + * + * g_value_set_object() increases the reference count of @v_object + * (the #GValue holds a reference to @v_object). If you do not wish + * to increase the reference count of the object (i.e. you wish to + * pass your current reference to the #GValue because you no longer + * need it), use g_value_take_object() instead. + * + * It is important that your #GValue holds a reference to @v_object (either its + * own, or one it has taken) to ensure that the object won't be destroyed while + * the #GValue still exists). + */ +void +g_value_set_object (GValue *value, + gpointer v_object) +{ + GObject *old; + + g_return_if_fail (G_VALUE_HOLDS_OBJECT (value)); + + old = value->data[0].v_pointer; + + if (v_object) + { + g_return_if_fail (G_IS_OBJECT (v_object)); + g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value))); + + value->data[0].v_pointer = v_object; + g_object_ref (value->data[0].v_pointer); + } + else + value->data[0].v_pointer = NULL; + + if (old) + g_object_unref (old); +} + +/** + * g_value_set_object_take_ownership: + * @value: a valid #GValue of %G_TYPE_OBJECT derived type + * @v_object: object value to be set + * + * This is an internal function introduced mainly for C marshallers. + * + * Deprecated: 2.4: Use g_value_take_object() instead. + */ +void +g_value_set_object_take_ownership (GValue *value, + gpointer v_object) +{ + g_value_take_object (value, v_object); +} + +/** + * g_value_take_object: + * @value: a valid #GValue of %G_TYPE_OBJECT derived type + * @v_object: object value to be set + * + * Sets the contents of a %G_TYPE_OBJECT derived #GValue to @v_object + * and takes over the ownership of the callers reference to @v_object; + * the caller doesn't have to unref it any more (i.e. the reference + * count of the object is not increased). + * + * If you want the #GValue to hold its own reference to @v_object, use + * g_value_set_object() instead. + * + * Since: 2.4 + */ +void +g_value_take_object (GValue *value, + gpointer v_object) +{ + g_return_if_fail (G_VALUE_HOLDS_OBJECT (value)); + + if (value->data[0].v_pointer) + { + g_object_unref (value->data[0].v_pointer); + value->data[0].v_pointer = NULL; + } + + if (v_object) + { + g_return_if_fail (G_IS_OBJECT (v_object)); + g_return_if_fail (g_value_type_compatible (G_OBJECT_TYPE (v_object), G_VALUE_TYPE (value))); + + value->data[0].v_pointer = v_object; /* we take over the reference count */ + } +} + +/** + * g_value_get_object: + * @value: a valid #GValue of %G_TYPE_OBJECT derived type + * + * Get the contents of a %G_TYPE_OBJECT derived #GValue. + * + * Returns: object contents of @value + */ +gpointer +g_value_get_object (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL); + + return value->data[0].v_pointer; +} + +/** + * g_value_dup_object: + * @value: a valid #GValue whose type is derived from %G_TYPE_OBJECT + * + * Get the contents of a %G_TYPE_OBJECT derived #GValue, increasing + * its reference count. + * + * Returns: object content of @value, should be unreferenced when no + * longer needed. + */ +gpointer +g_value_dup_object (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_OBJECT (value), NULL); + + return value->data[0].v_pointer ? g_object_ref (value->data[0].v_pointer) : NULL; +} + +/** + * g_signal_connect_object: + * @instance: the instance to connect to. + * @detailed_signal: a string of the form "signal-name::detail". + * @c_handler: the #GCallback to connect. + * @gobject: the object to pass as data to @c_handler. + * @connect_flags: a combination of #GConnnectFlags. + * + * This is similar to g_signal_connect_data(), but uses a closure which + * ensures that the @gobject stays alive during the call to @c_handler + * by temporarily adding a reference count to @gobject. + * + * Note that there is a bug in GObject that makes this function + * much less useful than it might seem otherwise. Once @gobject is + * disposed, the callback will no longer be called, but, the signal + * handler is not currently disconnected. If the + * @instance is itself being freed at the same time than this doesn't + * matter, since the signal will automatically be removed, but + * if @instance persists, then the signal handler will leak. You + * should not remove the signal yourself because in a future versions of + * GObject, the handler will automatically + * be disconnected. + * + * It's possible to work around this problem in a way that will + * continue to work with future versions of GObject by checking + * that the signal handler is still connected before disconnected it: + * + * if (g_signal_handler_is_connected (instance, id)) + * g_signal_handler_disconnect (instance, id); + * + * + * Returns: the handler id. + */ +gulong +g_signal_connect_object (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer gobject, + GConnectFlags connect_flags) +{ + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail (detailed_signal != NULL, 0); + g_return_val_if_fail (c_handler != NULL, 0); + + if (gobject) + { + GClosure *closure; + + g_return_val_if_fail (G_IS_OBJECT (gobject), 0); + + closure = ((connect_flags & G_CONNECT_SWAPPED) ? g_cclosure_new_object_swap : g_cclosure_new_object) (c_handler, gobject); + + return g_signal_connect_closure (instance, detailed_signal, closure, connect_flags & G_CONNECT_AFTER); + } + else + return g_signal_connect_data (instance, detailed_signal, c_handler, NULL, NULL, connect_flags); +} + +typedef struct { + GObject *object; + guint n_closures; + GClosure *closures[1]; /* flexible array */ +} CArray; +/* don't change this structure without supplying an accessor for + * watched closures, e.g.: + * GSList* g_object_list_watched_closures (GObject *object) + * { + * CArray *carray; + * g_return_val_if_fail (G_IS_OBJECT (object), NULL); + * carray = g_object_get_data (object, "GObject-closure-array"); + * if (carray) + * { + * GSList *slist = NULL; + * guint i; + * for (i = 0; i < carray->n_closures; i++) + * slist = g_slist_prepend (slist, carray->closures[i]); + * return slist; + * } + * return NULL; + * } + */ + +static void +object_remove_closure (gpointer data, + GClosure *closure) +{ + GObject *object = data; + CArray *carray = g_object_get_qdata (object, quark_closure_array); + guint i; + + for (i = 0; i < carray->n_closures; i++) + if (carray->closures[i] == closure) + { + carray->n_closures--; + if (i < carray->n_closures) + carray->closures[i] = carray->closures[carray->n_closures]; + return; + } + g_assert_not_reached (); +} + +static void +destroy_closure_array (gpointer data) +{ + CArray *carray = data; + GObject *object = carray->object; + guint i, n = carray->n_closures; + + for (i = 0; i < n; i++) + { + GClosure *closure = carray->closures[i]; + + /* removing object_remove_closure() upfront is probably faster than + * letting it fiddle with quark_closure_array which is empty anyways + */ + g_closure_remove_invalidate_notifier (closure, object, object_remove_closure); + g_closure_invalidate (closure); + } + g_free (carray); +} + +/** + * g_object_watch_closure: + * @object: GObject restricting lifetime of @closure + * @closure: GClosure to watch + * + * This function essentially limits the life time of the @closure to + * the life time of the object. That is, when the object is finalized, + * the @closure is invalidated by calling g_closure_invalidate() on + * it, in order to prevent invocations of the closure with a finalized + * (nonexisting) object. Also, g_object_ref() and g_object_unref() are + * added as marshal guards to the @closure, to ensure that an extra + * reference count is held on @object during invocation of the + * @closure. Usually, this function will be called on closures that + * use this @object as closure data. + */ +void +g_object_watch_closure (GObject *object, + GClosure *closure) +{ + CArray *carray; + guint i; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (closure != NULL); + g_return_if_fail (closure->is_invalid == FALSE); + g_return_if_fail (closure->in_marshal == FALSE); + g_return_if_fail (object->ref_count > 0); /* this doesn't work on finalizing objects */ + + g_closure_add_invalidate_notifier (closure, object, object_remove_closure); + g_closure_add_marshal_guards (closure, + object, (GClosureNotify) g_object_ref, + object, (GClosureNotify) g_object_unref); + carray = g_datalist_id_remove_no_notify (&object->qdata, quark_closure_array); + if (!carray) + { + carray = g_renew (CArray, NULL, 1); + carray->object = object; + carray->n_closures = 1; + i = 0; + } + else + { + i = carray->n_closures++; + carray = g_realloc (carray, sizeof (*carray) + sizeof (carray->closures[0]) * i); + } + carray->closures[i] = closure; + g_datalist_id_set_data_full (&object->qdata, quark_closure_array, carray, destroy_closure_array); +} + +/** + * g_closure_new_object: + * @sizeof_closure: the size of the structure to allocate, must be at least + * sizeof (GClosure) + * @object: a #GObject pointer to store in the @data field of the newly + * allocated #GClosure + * + * A variant of g_closure_new_simple() which stores @object in the + * @data field of the closure and calls g_object_watch_closure() on + * @object and the created closure. This function is mainly useful + * when implementing new types of closures. + * + * Returns: a newly allocated #GClosure + */ +GClosure* +g_closure_new_object (guint sizeof_closure, + GObject *object) +{ + GClosure *closure; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */ + + closure = g_closure_new_simple (sizeof_closure, object); + g_object_watch_closure (object, closure); + + return closure; +} + +/** + * g_cclosure_new_object: + * @callback_func: the function to invoke + * @object: a #GObject pointer to pass to @callback_func + * + * A variant of g_cclosure_new() which uses @object as @user_data and + * calls g_object_watch_closure() on @object and the created + * closure. This function is useful when you have a callback closely + * associated with a #GObject, and want the callback to no longer run + * after the object is is freed. + * + * Returns: a new #GCClosure + */ +GClosure* +g_cclosure_new_object (GCallback callback_func, + GObject *object) +{ + GClosure *closure; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */ + g_return_val_if_fail (callback_func != NULL, NULL); + + closure = g_cclosure_new (callback_func, object, NULL); + g_object_watch_closure (object, closure); + + return closure; +} + +/** + * g_cclosure_new_object_swap: + * @callback_func: the function to invoke + * @object: a #GObject pointer to pass to @callback_func + * + * A variant of g_cclosure_new_swap() which uses @object as @user_data + * and calls g_object_watch_closure() on @object and the created + * closure. This function is useful when you have a callback closely + * associated with a #GObject, and want the callback to no longer run + * after the object is is freed. + * + * Returns: a new #GCClosure + */ +GClosure* +g_cclosure_new_object_swap (GCallback callback_func, + GObject *object) +{ + GClosure *closure; + + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (object->ref_count > 0, NULL); /* this doesn't work on finalizing objects */ + g_return_val_if_fail (callback_func != NULL, NULL); + + closure = g_cclosure_new_swap (callback_func, object, NULL); + g_object_watch_closure (object, closure); + + return closure; +} + +gsize +g_object_compat_control (gsize what, + gpointer data) +{ + switch (what) + { + gpointer *pp; + case 1: /* floating base type */ + return G_TYPE_INITIALLY_UNOWNED; + case 2: /* FIXME: remove this once GLib/Gtk+ break ABI again */ + floating_flag_handler = (guint(*)(GObject*,gint)) data; + return 1; + case 3: /* FIXME: remove this once GLib/Gtk+ break ABI again */ + pp = data; + *pp = floating_flag_handler; + return 1; + default: + return 0; + } +} + +G_DEFINE_TYPE (GInitiallyUnowned, g_initially_unowned, G_TYPE_OBJECT); + +static void +g_initially_unowned_init (GInitiallyUnowned *object) +{ + g_object_force_floating (object); +} + +static void +g_initially_unowned_class_init (GInitiallyUnownedClass *klass) +{ +} + +#define __G_OBJECT_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gobject.h b/gobject/gobject.h new file mode 100644 index 0000000..751e5f2 --- /dev/null +++ b/gobject/gobject.h @@ -0,0 +1,562 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_OBJECT_H__ +#define __G_OBJECT_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +/** + * G_TYPE_IS_OBJECT: + * @type: Type id to check + * + * Check if the passed in type id is a %G_TYPE_OBJECT or derived from it. + * + * Returns: %FALSE or %TRUE, indicating whether @type is a %G_TYPE_OBJECT. + */ +#define G_TYPE_IS_OBJECT(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT) +/** + * G_OBJECT: + * @object: Object which is subject to casting. + * + * Casts a #GObject or derived pointer into a (GObject*) pointer. + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + */ +#define G_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_OBJECT, GObject)) +/** + * G_OBJECT_CLASS: + * @class: a valid #GObjectClass + * + * Casts a derived #GObjectClass structure into a #GObjectClass structure. + */ +#define G_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_OBJECT, GObjectClass)) +/** + * G_IS_OBJECT: + * @object: Instance to check for being a %G_TYPE_OBJECT. + * + * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_OBJECT. + */ +#define G_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_OBJECT)) +/** + * G_IS_OBJECT_CLASS: + * @class: a #GObjectClass + * + * Checks whether @class "is a" valid #GObjectClass structure of type + * %G_TYPE_OBJECT or derived. + */ +#define G_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_OBJECT)) +/** + * G_OBJECT_GET_CLASS: + * @object: a #GObject instance. + * + * Get the class structure associated to a #GObject instance. + * + * Returns: pointer to object class structure. + */ +#define G_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_OBJECT, GObjectClass)) +/** + * G_OBJECT_TYPE: + * @object: Object to return the type id for. + * + * Get the type id of an object. + * + * Returns: Type id of @object. + */ +#define G_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object)) +/** + * G_OBJECT_TYPE_NAME: + * @object: Object to return the type name for. + * + * Get the name of an object's type. + * + * Returns: Type name of @object. The string is owned by the type system and + * should not be freed. + */ +#define G_OBJECT_TYPE_NAME(object) (g_type_name (G_OBJECT_TYPE (object))) +/** + * G_OBJECT_CLASS_TYPE: + * @class: a valid #GObjectClass + * + * Get the type id of a class structure. + * + * Returns: Type id of @class. + */ +#define G_OBJECT_CLASS_TYPE(class) (G_TYPE_FROM_CLASS (class)) +/** + * G_OBJECT_CLASS_NAME: + * @class: a valid #GObjectClass + * + * Return the name of a class structure's type. + * + * Returns: Type name of @class. The string is owned by the type system and + * should not be freed. + */ +#define G_OBJECT_CLASS_NAME(class) (g_type_name (G_OBJECT_CLASS_TYPE (class))) +/** + * G_VALUE_HOLDS_OBJECT: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values derived from type %G_TYPE_OBJECT. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_OBJECT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_OBJECT)) + +/* --- type macros --- */ +/** + * G_TYPE_INITIALLY_UNOWNED: + * + * The type for #GInitiallyUnowned. + */ +#define G_TYPE_INITIALLY_UNOWNED (g_initially_unowned_get_type()) +/** + * G_INITIALLY_UNOWNED: + * @object: Object which is subject to casting. + * + * Casts a #GInitiallyUnowned or derived pointer into a (GInitiallyUnowned*) + * pointer. Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + */ +#define G_INITIALLY_UNOWNED(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnowned)) +/** + * G_INITIALLY_UNOWNED_CLASS: + * @class: a valid #GInitiallyUnownedClass + * + * Casts a derived #GInitiallyUnownedClass structure into a + * #GInitiallyUnownedClass structure. + */ +#define G_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass)) +/** + * G_IS_INITIALLY_UNOWNED: + * @object: Instance to check for being a %G_TYPE_INITIALLY_UNOWNED. + * + * Checks whether a valid #GTypeInstance pointer is of type %G_TYPE_INITIALLY_UNOWNED. + */ +#define G_IS_INITIALLY_UNOWNED(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), G_TYPE_INITIALLY_UNOWNED)) +/** + * G_IS_INITIALLY_UNOWNED_CLASS: + * @class: a #GInitiallyUnownedClass + * + * Checks whether @class "is a" valid #GInitiallyUnownedClass structure of type + * %G_TYPE_INITIALLY_UNOWNED or derived. + */ +#define G_IS_INITIALLY_UNOWNED_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_INITIALLY_UNOWNED)) +/** + * G_INITIALLY_UNOWNED_GET_CLASS: + * @object: a #GInitiallyUnowned instance. + * + * Get the class structure associated to a #GInitiallyUnowned instance. + * + * Returns: pointer to object class structure. + */ +#define G_INITIALLY_UNOWNED_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), G_TYPE_INITIALLY_UNOWNED, GInitiallyUnownedClass)) +/* GInitiallyUnowned ia a GObject with initially floating reference count */ + + +/* --- typedefs & structures --- */ +typedef struct _GObject GObject; +typedef struct _GObjectClass GObjectClass; +typedef struct _GObject GInitiallyUnowned; +typedef struct _GObjectClass GInitiallyUnownedClass; +typedef struct _GObjectConstructParam GObjectConstructParam; +/** + * GObjectGetPropertyFunc: + * @object: a #GObject + * @property_id: the numeric id under which the property was registered with + * g_object_class_install_property(). + * @value: a #GValue to return the property value in + * @pspec: the #GParamSpec describing the property + * + * The type of the @get_property function of #GObjectClass. + */ +typedef void (*GObjectGetPropertyFunc) (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); +/** + * GObjectSetPropertyFunc: + * @object: a #GObject + * @property_id: the numeric id under which the property was registered with + * g_object_class_install_property(). + * @value: the new value for the property + * @pspec: the #GParamSpec describing the property + * + * The type of the @set_property function of #GObjectClass. + */ +typedef void (*GObjectSetPropertyFunc) (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +/** + * GObjectFinalizeFunc: + * @object: the #GObject being finalized + * + * The type of the @finalize function of #GObjectClass. + */ +typedef void (*GObjectFinalizeFunc) (GObject *object); +/** + * GWeakNotify: + * @data: data that was provided when the weak reference was established + * @where_the_object_was: the object being finalized + * + * A #GWeakNotify function can be added to an object as a callback that gets + * triggered when the object is finalized. Since the object is already being + * finalized when the #GWeakNotify is called, there's not much you could do + * with the object, apart from e.g. using its adress as hash-index or the like. + */ +typedef void (*GWeakNotify) (gpointer data, + GObject *where_the_object_was); +/** + * GObject: + * + * All the fields in the GObject structure are private + * to the #GObject implementation and should never be accessed directly. + */ +struct _GObject +{ + GTypeInstance g_type_instance; + + /*< private >*/ + volatile guint ref_count; + GData *qdata; +}; +/** + * GObjectClass: + * @g_type_class: the parent class + * @constructor: the @constructor function is called by g_object_new () to + * complete the object initialization after all the construction properties are + * set. The first thing a @constructor implementation must do is chain up to the + * @constructor of the parent class. Overriding @constructor should be rarely + * needed, e.g. to handle construct properties, or to implement singletons. + * @set_property: the generic setter for all properties of this type. Should be + * overridden for every type with properties. Implementations of @set_property + * don't need to emit property change notification explicitly, this is handled + * by the type system. + * @get_property: the generic getter for all properties of this type. Should be + * overridden for every type with properties. + * @dispose: the @dispose function is supposed to drop all references to other + * objects, but keep the instance otherwise intact, so that client method + * invocations still work. It may be run multiple times (due to reference + * loops). Before returning, @dispose should chain up to the @dispose method + * of the parent class. + * @finalize: instance finalization function, should finish the finalization of + * the instance begun in @dispose and chain up to the @finalize method of the + * parent class. + * @dispatch_properties_changed: emits property change notification for a bunch + * of properties. Overriding @dispatch_properties_changed should be rarely + * needed. + * @notify: the class closure for the notify signal + * @constructed: the @constructed function is called by g_object_new() as the + * final step of the object creation process. At the point of the call, all + * construction properties have been set on the object. The purpose of this + * call is to allow for object initialisation steps that can only be performed + * after construction properties have been set. @constructed implementors + * should chain up to the @constructed call of their parent class to allow it + * to complete its initialisation. + * + * The class structure for the GObject type. + * + * + * Implementing singletons using a constructor + * + * static MySingleton *the_singleton = NULL; + * + * static GObject* + * my_singleton_constructor (GType type, + * guint n_construct_params, + * GObjectConstructParam *construct_params) + * { + * GObject *object; + * + * if (!the_singleton) + * { + * object = G_OBJECT_CLASS (parent_class)->constructor (type, + * n_construct_params, + * construct_params); + * the_singleton = MY_SINGLETON (object); + * } + * else + * object = g_object_ref (G_OBJECT (the_singleton)); + * + * return object; + * } + * + */ +struct _GObjectClass +{ + GTypeClass g_type_class; + + /*< private >*/ + GSList *construct_properties; + + /*< public >*/ + /* seldomly overidden */ + GObject* (*constructor) (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties); + /* overridable methods */ + void (*set_property) (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); + void (*get_property) (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + void (*dispose) (GObject *object); + void (*finalize) (GObject *object); + /* seldomly overidden */ + void (*dispatch_properties_changed) (GObject *object, + guint n_pspecs, + GParamSpec **pspecs); + /* signals */ + void (*notify) (GObject *object, + GParamSpec *pspec); + + /* called when done constructing */ + void (*constructed) (GObject *object); + + /*< private >*/ + gsize flags; + + /* padding */ + gpointer pdummy[6]; +}; +/** + * GObjectConstructParam: + * @pspec: the #GParamSpec of the construct parameter + * @value: the value to set the parameter to + * + * The GObjectConstructParam struct is an auxiliary + * structure used to hand #GParamSpec/#GValue pairs to the @constructor of + * a #GObjectClass. + */ +struct _GObjectConstructParam +{ + GParamSpec *pspec; + GValue *value; +}; + +/** + * GInitiallyUnowned: + * + * All the fields in the GInitiallyUnowned structure + * are private to the #GInitiallyUnowned implementation and should never be + * accessed directly. + */ +/** + * GInitiallyUnownedClass: + * + * The class structure for the GInitiallyUnowned type. + */ + + +/* --- prototypes --- */ +GType g_initially_unowned_get_type (void); +void g_object_class_install_property (GObjectClass *oclass, + guint property_id, + GParamSpec *pspec); +GParamSpec* g_object_class_find_property (GObjectClass *oclass, + const gchar *property_name); +GParamSpec**g_object_class_list_properties (GObjectClass *oclass, + guint *n_properties); +void g_object_class_override_property (GObjectClass *oclass, + guint property_id, + const gchar *name); + +void g_object_interface_install_property (gpointer g_iface, + GParamSpec *pspec); +GParamSpec* g_object_interface_find_property (gpointer g_iface, + const gchar *property_name); +GParamSpec**g_object_interface_list_properties (gpointer g_iface, + guint *n_properties_p); + +GType g_object_get_type (void) G_GNUC_CONST; +gpointer g_object_new (GType object_type, + const gchar *first_property_name, + ...); +gpointer g_object_newv (GType object_type, + guint n_parameters, + GParameter *parameters); +GObject* g_object_new_valist (GType object_type, + const gchar *first_property_name, + va_list var_args); +void g_object_set (gpointer object, + const gchar *first_property_name, + ...) G_GNUC_NULL_TERMINATED; +void g_object_get (gpointer object, + const gchar *first_property_name, + ...) G_GNUC_NULL_TERMINATED; +gpointer g_object_connect (gpointer object, + const gchar *signal_spec, + ...) G_GNUC_NULL_TERMINATED; +void g_object_disconnect (gpointer object, + const gchar *signal_spec, + ...) G_GNUC_NULL_TERMINATED; +void g_object_set_valist (GObject *object, + const gchar *first_property_name, + va_list var_args); +void g_object_get_valist (GObject *object, + const gchar *first_property_name, + va_list var_args); +void g_object_set_property (GObject *object, + const gchar *property_name, + const GValue *value); +void g_object_get_property (GObject *object, + const gchar *property_name, + GValue *value); +void g_object_freeze_notify (GObject *object); +void g_object_notify (GObject *object, + const gchar *property_name); +void g_object_thaw_notify (GObject *object); +gboolean g_object_is_floating (gpointer object); +gpointer g_object_ref_sink (gpointer object); +gpointer g_object_ref (gpointer object); +void g_object_unref (gpointer object); +void g_object_weak_ref (GObject *object, + GWeakNotify notify, + gpointer data); +void g_object_weak_unref (GObject *object, + GWeakNotify notify, + gpointer data); +void g_object_add_weak_pointer (GObject *object, + gpointer *weak_pointer_location); +void g_object_remove_weak_pointer (GObject *object, + gpointer *weak_pointer_location); + +/** + * GToggleNotify: + * @data: Callback data passed to g_object_add_toggle_ref() + * @object: The object on which g_object_add_toggle_ref() was called. + * @is_last_ref: %TRUE if the toggle reference is now the + * last reference to the object. %FALSE if the toggle + * reference was the last reference and there are now other + * references. + * + * A callback function used for notification when the state + * of a toggle reference changes. See g_object_add_toggle_ref(). + */ +typedef void (*GToggleNotify) (gpointer data, + GObject *object, + gboolean is_last_ref); + +void g_object_add_toggle_ref (GObject *object, + GToggleNotify notify, + gpointer data); +void g_object_remove_toggle_ref (GObject *object, + GToggleNotify notify, + gpointer data); + +gpointer g_object_get_qdata (GObject *object, + GQuark quark); +void g_object_set_qdata (GObject *object, + GQuark quark, + gpointer data); +void g_object_set_qdata_full (GObject *object, + GQuark quark, + gpointer data, + GDestroyNotify destroy); +gpointer g_object_steal_qdata (GObject *object, + GQuark quark); +gpointer g_object_get_data (GObject *object, + const gchar *key); +void g_object_set_data (GObject *object, + const gchar *key, + gpointer data); +void g_object_set_data_full (GObject *object, + const gchar *key, + gpointer data, + GDestroyNotify destroy); +gpointer g_object_steal_data (GObject *object, + const gchar *key); +void g_object_watch_closure (GObject *object, + GClosure *closure); +GClosure* g_cclosure_new_object (GCallback callback_func, + GObject *object); +GClosure* g_cclosure_new_object_swap (GCallback callback_func, + GObject *object); +GClosure* g_closure_new_object (guint sizeof_closure, + GObject *object); +void g_value_set_object (GValue *value, + gpointer v_object); +gpointer g_value_get_object (const GValue *value); +gpointer g_value_dup_object (const GValue *value); +gulong g_signal_connect_object (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer gobject, + GConnectFlags connect_flags); + +/*< protected >*/ +void g_object_force_floating (GObject *object); +void g_object_run_dispose (GObject *object); + + +void g_value_take_object (GValue *value, + gpointer v_object); +#ifndef G_DISABLE_DEPRECATED +void g_value_set_object_take_ownership (GValue *value, + gpointer v_object); +#endif + +#if !defined(G_DISABLE_DEPRECATED) || defined(GTK_COMPILATION) +gsize g_object_compat_control (gsize what, + gpointer data); +#endif + +/* --- implementation macros --- */ +#define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \ +G_STMT_START { \ + GObject *_object = (GObject*) (object); \ + GParamSpec *_pspec = (GParamSpec*) (pspec); \ + guint _property_id = (property_id); \ + g_warning ("%s: invalid %s id %u for \"%s\" of type `%s' in `%s'", \ + G_STRLOC, \ + (pname), \ + _property_id, \ + _pspec->name, \ + g_type_name (G_PARAM_SPEC_TYPE (_pspec)), \ + G_OBJECT_TYPE_NAME (_object)); \ +} G_STMT_END +/** + * G_OBJECT_WARN_INVALID_PROPERTY_ID: + * @object: the #GObject on which set_property() or get_property() was called + * @property_id: the numeric id of the property + * @pspec: the #GParamSpec of the property + * + * This macro should be used to emit a standard warning about unexpected + * properties in set_property() and get_property() implementations. + */ +#define G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec) \ + G_OBJECT_WARN_INVALID_PSPEC ((object), "property", (property_id), (pspec)) + +G_END_DECLS + +#endif /* __G_OBJECT_H__ */ diff --git a/gobject/gobject.py b/gobject/gobject.py new file mode 100644 index 0000000..b96d150 --- /dev/null +++ b/gobject/gobject.py @@ -0,0 +1,305 @@ +import gdb +import glib +import gdb.backtrace +import gdb.command.backtrace + +# This is not quite right, as local vars may override symname +def read_global_var (symname): + return gdb.selected_frame().read_var(symname) + +def g_type_to_name (gtype): + def lookup_fundamental_type (typenode): + if typenode == 0: + return None + val = read_global_var ("static_fundamental_type_nodes") + if val == None: + return None + return val[typenode >> 2].address() + + gtype = long(gtype) + typenode = gtype - gtype % 4 + if typenode > (255 << 2): + typenode = gdb.Value(typenode).cast (gdb.lookup_type("TypeNode").pointer()) + else: + typenode = lookup_fundamental_type (typenode) + if typenode != None: + return glib.g_quark_to_string (typenode["qname"]) + return None + +def is_g_type_instance (val): + def is_g_type_instance_helper (type): + if str(type) == "GTypeInstance": + return True + + while type.code == gdb.TYPE_CODE_TYPEDEF: + type = type.target() + + if type.code != gdb.TYPE_CODE_STRUCT: + return False + + fields = type.fields() + if len (fields) < 1: + return False + + first_field = fields[0] + return is_g_type_instance_helper(first_field.type) + + type = val.type + if type.code != gdb.TYPE_CODE_PTR: + return False + type = type.target() + return is_g_type_instance_helper (type) + +def g_type_name_from_instance (instance): + if long(instance) != 0: + try: + inst = instance.cast (gdb.lookup_type("GTypeInstance").pointer()) + klass = inst["g_class"] + gtype = klass["g_type"] + name = g_type_to_name (gtype) + return name + except RuntimeError: + pass + return None + +class GTypePrettyPrinter: + "Prints a GType instance pointer" + + def __init__ (self, val): + self.val = val + + def to_string (self): + name = g_type_name_from_instance (self.val) + if name: + return ("0x%x [%s]")% (long(self.val), name) + return ("0x%x") % (long(self.val)) + +def pretty_printer_lookup (val): + if is_g_type_instance (val): + return GTypePrettyPrinter (val) + + return None + +def get_signal_name (id): + if id == None: + return None + id = long(id) + if id == 0: + return None + val = read_global_var ("g_signal_nodes") + max_s = read_global_var ("g_n_signal_nodes") + max_s = long(max_s) + if id < max_s: + return val[id]["name"].string() + return None + +class GFrameWrapper: + def __init__ (self, frame): + self.frame = frame; + + def name (self): + name = self.frame.name() + if name and name.startswith("IA__"): + return name[4:] + return name + + def __getattr__ (self, name): + return getattr (self.frame, name) + +# Monkey patch FrameWrapper to avoid IA__ in symbol names +old__init__ = gdb.command.backtrace.FrameWrapper.__init__ +def monkey_patched_init(self, frame): + name = frame.name() + if name and name.startswith("IA__"): + frame = GFrameWrapper(frame) + old__init__(self,frame) +gdb.command.backtrace.FrameWrapper.__init__ = monkey_patched_init + +class DummyFrame: + def __init__ (self, frame): + self.frame = frame + + def name (self): + return "signal-emission-dummy" + + def describe (self, stream, full): + stream.write (" <...>\n") + + def __getattr__ (self, name): + return getattr (self.frame, name) + +class SignalFrame: + def __init__ (self, frames): + self.frame = frames[-1] + self.frames = frames; + + def name (self): + return "signal-emission" + + def read_var (self, frame, name, array = None): + try: + v = frame.read_var (name) + if v == None or v.is_optimized_out: + return None + if array != None: + array.append (v) + return v + except ValueError: + return None + + def read_object (self, frame, name, array = None): + try: + v = frame.read_var (name) + if v == None or v.is_optimized_out: + return None + v = v.cast (gdb.lookup_type("GObject").pointer()) + # Ensure this is a somewhat correct object pointer + if v != None and g_type_name_from_instance (v): + if array != None: + array.append (v) + return v + return None + except ValueError: + return None + + def append (self, array, obj): + if obj != None: + array.append (obj) + + def or_join_array (self, array): + if len(array) == 0: + return "???" + + v = {} + for i in range(len(array)): + v[str(array[i])] = 1 + array = v.keys() + s = array[0] + for i in range(1, len(array)): + s = s + " or %s"%array[i] + + return s + + def describe (self, stream, full): + instances = [] + signals = [] + + for frame in self.frames: + name = frame.name() + if name == "signal_emit_unlocked_R": + self.read_object (frame, "instance", instances) + node = self.read_var (frame, "node") + if node: + signal = node["name"].string() + detail = self.read_var (frame, "detail") + detail = glib.g_quark_to_string (detail) + if detail != None: + signal = signal + ":" + detail + self.append (signals, signal) + + if name == "g_signal_emitv": + instance_and_params = self.read_var (frame, "instance_and_params") + if instance_and_params: + instance = instance_and_params[0]["v_pointer"].cast (gdb.Type("GObject").pointer()) + self.append (instances, instance) + id = self.read_var (frame, "signal_id") + signal = get_signal_name (id) + if signal: + detail = self.read_var (frame, "detail") + detail = glib.g_quark_to_string (detail) + if detail != None: + signal = signal + ":" + detail + self.append (signals, signal) + + if name == "g_signal_emit_valist" or name == "g_signal_emit": + self.read_object (frame, "instance", instances) + id = self.read_var (frame, "signal_id") + signal = get_signal_name (id) + if signal: + detail = self.read_var (frame, "detail") + detail = glib.g_quark_to_string (detail) + if detail != None: + signal = signal + ":" + detail + self.append (signals, signal) + + if name == "g_signal_emit_by_name": + self.read_object (frame, "instance", instances) + self.read_var (frame, "detailed_signal", signals) + break + + instance = self.or_join_array (instances) + signal = self.or_join_array (signals) + + stream.write (" \n" % (signal, instance)) + + def __getattr__ (self, name): + return getattr (self.frame, name) + +class GFrameFilter: + def __init__ (self, iter): + self.queue = [] + self.iter = iter + + def __iter__ (self): + return self + + def fill (self): + while len(self.queue) <= 6: + try: + f = self.iter.next () + self.queue.append (f) + except StopIteration: + return + + def find_signal_emission (self): + for i in range (min (len(self.queue), 3)): + if self.queue[i].name() == "signal_emit_unlocked_R": + return i + return -1 + + def next (self): + # Ensure we have enough frames for a full signal emission + self.fill() + + # Are we at the end? + if len(self.queue) == 0: + raise StopIteration + + emission = self.find_signal_emission () + if emission > 0: + start = emission + while True: + if start == 0: + break + prev_name = self.queue[start-1].name() + if prev_name.find("_marshal_") or prev_name == "g_closure_invoke": + start = start - 1 + else: + break + end = emission + 1 + while end < len(self.queue): + if self.queue[end].name() in ["g_signal_emitv", + "g_signal_emit_valist", + "g_signal_emit", + "g_signal_emit_by_name"]: + end = end + 1 + else: + break + + signal_frames = self.queue[start:end] + new_frames = [] + for i in range(len(signal_frames)-1): + new_frames.append(DummyFrame(signal_frames[i])) + new_frames.append(SignalFrame(signal_frames)) + + self.queue[start:end] = new_frames + + return self.queue.pop(0) + + +def register (obj): + if obj == None: + obj = gdb + + gdb.backtrace.push_frame_filter (GFrameFilter) + obj.pretty_printers.append(pretty_printer_lookup) diff --git a/gobject/gobject.rc.in b/gobject/gobject.rc.in new file mode 100644 index 0000000..3dbc898 --- /dev/null +++ b/gobject/gobject.rc.in @@ -0,0 +1,30 @@ +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "The GLib developer community" + VALUE "FileDescription", "GObject" + VALUE "FileVersion", "@GLIB_VERSION@.0" + VALUE "InternalName", "libgobject-2.0-@LT_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright © 1998-2010 Tim Janik, Red Hat, Inc. and others" + VALUE "OriginalFilename", "libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "GLib" + VALUE "ProductVersion", "@GLIB_VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END diff --git a/gobject/gobject.symbols b/gobject/gobject.symbols new file mode 100644 index 0000000..aa91a3e --- /dev/null +++ b/gobject/gobject.symbols @@ -0,0 +1,448 @@ +/* This file lists all exported symbols. It is used to generate + * the gobject.def file used to control exports on Windows and the + * gobjectalias.h/gobjectaliasdef.c files used to avoid PLT entries for + * internal uses of exported functions (see makegobjectalias.pl). + * + * Every symbol must be included in the right + * #ifdef IN_HEADER(sym) #endif and + * #ifdef IN_FILE(sym) #endif sections. + */ +#ifdef ALL_FILES +#define IN_FILE(x) 1 +#define IN_HEADER(x) 1 +#endif +#if IN_HEADER(__G_BOXED_H__) +#if IN_FILE(__G_BOXED_C__) +g_boxed_copy +g_boxed_free +g_boxed_type_register_static +g_date_get_type G_GNUC_CONST +g_gstring_get_type G_GNUC_CONST +g_strv_get_type G_GNUC_CONST +g_hash_table_get_type G_GNUC_CONST +g_array_get_type G_GNUC_CONST +g_byte_array_get_type G_GNUC_CONST +g_ptr_array_get_type G_GNUC_CONST +g_regex_get_type G_GNUC_CONST +g_variant_type_get_gtype G_GNUC_CONST +g_variant_get_gtype G_GNUC_CONST +g_closure_get_type G_GNUC_CONST +g_value_get_type G_GNUC_CONST +g_value_array_get_type G_GNUC_CONST +g_value_set_boxed +g_value_take_boxed +g_value_dup_boxed +g_value_get_boxed +g_value_set_static_boxed +#ifndef G_DISABLE_DEPRECATED +g_value_set_boxed_take_ownership +#endif +#endif +#endif + +#if IN_HEADER(__G_MARSHAL_H__) +#if IN_FILE(__G_SIGNAL_C__) +g_cclosure_marshal_BOOLEAN__FLAGS +g_cclosure_marshal_STRING__OBJECT_POINTER +g_cclosure_marshal_VOID__BOOLEAN +g_cclosure_marshal_VOID__BOXED +g_cclosure_marshal_VOID__CHAR +g_cclosure_marshal_VOID__DOUBLE +g_cclosure_marshal_VOID__ENUM +g_cclosure_marshal_VOID__FLAGS +g_cclosure_marshal_VOID__FLOAT +g_cclosure_marshal_VOID__INT +g_cclosure_marshal_VOID__LONG +g_cclosure_marshal_VOID__OBJECT +g_cclosure_marshal_VOID__PARAM +g_cclosure_marshal_VOID__POINTER +g_cclosure_marshal_VOID__STRING +g_cclosure_marshal_VOID__UCHAR +g_cclosure_marshal_VOID__UINT +g_cclosure_marshal_VOID__UINT_POINTER +g_cclosure_marshal_VOID__ULONG +g_cclosure_marshal_VOID__VOID +#endif +#endif + +#if IN_HEADER(__G_CLOSURE_H__) +#if IN_FILE(__G_CLOSURE_C__) +g_cclosure_new +g_cclosure_new_swap +g_closure_add_finalize_notifier +g_closure_add_invalidate_notifier +g_closure_add_marshal_guards +g_closure_invalidate +g_closure_invoke +g_closure_new_simple +g_closure_ref +g_closure_remove_finalize_notifier +g_closure_remove_invalidate_notifier +g_closure_set_marshal +g_closure_set_meta_marshal +g_closure_sink +g_closure_unref +g_signal_type_cclosure_new +#endif +#endif + +#if IN_HEADER(__G_ENUMS_H__) +#if IN_FILE(__G_ENUMS_C__) +g_enum_complete_type_info +g_enum_get_value +g_enum_get_value_by_name +g_enum_get_value_by_nick +g_enum_register_static +g_flags_complete_type_info +g_flags_get_first_value +g_flags_get_value_by_name +g_flags_get_value_by_nick +g_flags_register_static +g_value_set_enum +g_value_set_flags +g_value_get_enum +g_value_get_flags +#endif +#endif + +#if IN_HEADER(__G_SOURCECLOSURE_H__) +#if IN_FILE(__G_SOURCECLOSURE_C__) +g_io_channel_get_type +g_io_condition_get_type +g_source_set_closure +#endif +#endif + +#if IN_HEADER(__G_OBJECT_H__) +#if IN_FILE(__G_OBJECT_C__) +g_cclosure_new_object +g_cclosure_new_object_swap +g_closure_new_object +g_initially_unowned_get_type +g_object_add_weak_pointer +g_object_class_find_property +g_object_class_install_property +g_object_class_list_properties +g_object_class_override_property +g_object_connect G_GNUC_NULL_TERMINATED +g_object_disconnect G_GNUC_NULL_TERMINATED +g_object_freeze_notify +g_object_get G_GNUC_NULL_TERMINATED +g_object_get_data +g_object_get_property +g_object_get_qdata +g_object_get_type +g_object_get_valist +g_object_interface_find_property +g_object_interface_install_property +g_object_interface_list_properties +g_object_new +g_object_newv +g_object_new_valist +g_object_notify +g_object_is_floating +g_object_ref_sink +g_object_force_floating +g_object_ref +g_object_unref +g_object_remove_weak_pointer +g_object_run_dispose +g_object_set G_GNUC_NULL_TERMINATED +g_object_set_data +g_object_set_data_full +g_object_set_property +g_object_set_qdata +g_object_set_qdata_full +g_object_set_valist +g_object_steal_data +g_object_steal_qdata +g_object_thaw_notify +g_object_watch_closure +g_object_weak_ref +g_object_weak_unref +g_object_add_toggle_ref +g_object_remove_toggle_ref +g_value_get_object +g_value_set_object +g_value_dup_object +g_value_take_object +#ifndef G_DISABLE_DEPRECATED +g_value_set_object_take_ownership +g_object_compat_control +#endif +g_signal_connect_object +#endif +#endif + +#if IN_HEADER(__G_PARAMSPECS_H__) +#if IN_FILE(__G_PARAMSPECS_C__) +g_param_spec_boolean +g_param_spec_boxed +g_param_spec_char +g_param_spec_double +g_param_spec_enum +g_param_spec_flags +g_param_spec_float +g_param_spec_int +g_param_spec_int64 +g_param_spec_long +g_param_spec_object +g_param_spec_override +g_param_spec_gtype +g_param_spec_param +g_param_spec_pointer +g_param_spec_string +g_param_spec_uchar +g_param_spec_uint +g_param_spec_uint64 +g_param_spec_ulong +g_param_spec_unichar +g_param_spec_value_array +#endif +#endif + +#if IN_HEADER(__G_PARAM_H__) +#if IN_FILE(__G_PARAM_C__) +g_param_spec_get_blurb +g_param_spec_get_name +g_param_spec_get_nick +g_param_spec_get_redirect_target +g_param_spec_internal +g_param_type_register_static +g_param_spec_ref +g_param_spec_ref_sink +g_param_spec_unref +g_param_spec_sink +g_param_spec_steal_qdata +g_param_spec_set_qdata +g_param_spec_set_qdata_full +g_param_spec_get_qdata +g_param_value_convert +g_param_value_defaults +g_param_values_cmp +g_param_value_set_default +g_param_value_validate +g_param_spec_pool_insert +g_param_spec_pool_list +g_param_spec_pool_list_owned +g_param_spec_pool_lookup +g_param_spec_pool_new +g_param_spec_pool_remove +g_value_get_param +g_value_set_param +g_value_dup_param +g_value_take_param +#ifndef G_DISABLE_DEPRECATED +g_value_set_param_take_ownership +#endif +#endif +#endif + +#if IN_HEADER(__G_VALUETYPES_H__) +#if IN_FILE(__G_VALUETYPES_C__) +g_pointer_type_register_static +g_strdup_value_contents +g_value_set_boolean +g_value_set_char +g_value_set_double +g_value_set_float +g_value_set_int +g_value_set_int64 +g_value_set_long +g_value_set_pointer +g_value_set_static_string +g_value_set_string +#ifndef G_DISABLE_DEPRECATED +g_value_set_string_take_ownership +#endif +g_value_set_uchar +g_value_set_uint +g_value_set_uint64 +g_value_set_ulong +g_value_dup_string +g_value_get_boolean +g_value_get_char +g_value_get_double +g_value_get_float +g_value_get_int +g_value_get_int64 +g_value_get_long +g_value_get_pointer +g_value_get_string +g_value_get_uchar +g_value_get_uint +g_value_get_uint64 +g_value_get_ulong +g_value_take_string +g_gtype_get_type +g_value_set_gtype +g_value_get_gtype +#endif +#endif + +#if IN_HEADER(__G_SIGNAL_H__) +#if IN_FILE(__G_SIGNAL_C__) +g_signal_accumulator_true_handled +g_signal_add_emission_hook +g_signal_chain_from_overridden +g_signal_chain_from_overridden_handler +g_signal_connect_closure +g_signal_connect_closure_by_id +g_signal_connect_data +g_signal_emit +g_signal_emit_by_name +g_signal_emitv +g_signal_emit_valist +g_signal_get_invocation_hint +g_signal_handler_block +g_signal_handler_disconnect +g_signal_handler_find +g_signal_handler_is_connected +g_signal_handlers_block_matched +g_signal_handlers_destroy +g_signal_handlers_disconnect_matched +g_signal_handlers_unblock_matched +g_signal_handler_unblock +g_signal_has_handler_pending +g_signal_list_ids +g_signal_lookup +g_signal_name +g_signal_new +g_signal_newv +g_signal_new_valist +g_signal_new_class_handler +g_signal_override_class_closure +g_signal_override_class_handler +g_signal_parse_name +g_signal_query +g_signal_remove_emission_hook +g_signal_stop_emission +g_signal_stop_emission_by_name +#endif +#endif + +#if IN_HEADER(__G_TYPE_H__) +#if IN_FILE(__G_TYPE_C__) +g_type_add_class_cache_func +g_type_add_interface_check +g_type_add_interface_dynamic +g_type_add_interface_static +g_type_check_class_cast +g_type_check_class_is_a +g_type_check_instance +g_type_check_instance_cast +g_type_check_instance_is_a +g_type_check_is_value_type +g_type_check_value +g_type_check_value_holds +g_type_children +g_type_class_add_private +g_type_class_peek +g_type_class_peek_parent +g_type_class_peek_static +g_type_class_ref +g_type_class_unref +g_type_class_unref_uncached +g_type_create_instance +g_type_default_interface_peek +g_type_default_interface_ref +g_type_default_interface_unref +g_type_depth +g_type_free_instance +g_type_from_name +g_type_fundamental +g_type_fundamental_next +g_type_get_plugin +g_type_get_qdata +g_type_init +g_type_init_with_debug_flags +g_type_instance_get_private +g_type_interface_add_prerequisite +g_type_interface_get_plugin +g_type_interface_peek +g_type_interface_peek_parent +g_type_interface_prerequisites +g_type_interfaces +g_type_is_a +g_type_name +g_type_name_from_class +g_type_name_from_instance +g_type_next_base +g_type_parent +g_type_qname +g_type_query +g_type_register_dynamic +g_type_register_fundamental +g_type_register_static +g_type_register_static_simple +g_type_remove_class_cache_func +g_type_remove_interface_check +g_type_set_qdata +g_type_test_flags +g_type_value_table_peek +g_type_class_get_private +g_type_add_class_private +#endif +#endif + +#if IN_HEADER(__G_TYPE_MODULE_H__) +#if IN_FILE(__G_TYPE_MODULE_C__) +g_type_module_add_interface +g_type_module_get_type G_GNUC_CONST +g_type_module_register_enum +g_type_module_register_flags +g_type_module_register_type +g_type_module_set_name +g_type_module_unuse +g_type_module_use +#endif +#endif + +#if IN_HEADER(__G_VALUE_ARRAY_H__) +#if IN_FILE(__G_VALUE_ARRAY_C__) +g_value_array_append +g_value_array_copy +g_value_array_free +g_value_array_get_nth +g_value_array_insert +g_value_array_new +g_value_array_prepend +g_value_array_remove +g_value_array_sort +g_value_array_sort_with_data +#endif +#endif + +#if IN_HEADER(__G_TYPE_PLUGIN_H__) +#if IN_FILE(__G_TYPE_PLUGIN_C__) +g_type_plugin_complete_interface_info +g_type_plugin_complete_type_info +g_type_plugin_get_type G_GNUC_CONST +g_type_plugin_unuse +g_type_plugin_use +#endif +#endif + +#if IN_HEADER(__G_VALUE_H__) +#if IN_FILE(__G_VALUE_C__) +g_value_copy +g_value_fits_pointer +g_value_init +g_value_peek_pointer +g_value_register_transform_func +g_value_reset +g_value_transform +g_value_type_compatible +g_value_type_transformable +g_value_unset +g_value_set_instance +#endif +#endif + +#ifdef INCLUDE_VARIABLES +g_param_spec_types +#endif +#ifdef INCLUDE_INTERNAL_SYMBOLS +g_slist_remove_all PRIVATE +g_unichar_validate PRIVATE +#endif diff --git a/gobject/gobjectalias.h b/gobject/gobjectalias.h new file mode 100644 index 0000000..221a8f4 --- /dev/null +++ b/gobject/gobjectalias.h @@ -0,0 +1,1117 @@ +/* Generated by makegobjectalias.pl */ + +#ifndef DISABLE_VISIBILITY + +#include "glibconfig.h" + +#ifdef G_HAVE_GNUC_VISIBILITY + +#define IN_FILE(x) 1 +#define IN_HEADER defined + +#if IN_HEADER(__G_BOXED_H__) +#if IN_FILE(__G_BOXED_C__) +extern __typeof (g_boxed_copy) IA__g_boxed_copy __attribute((visibility("hidden"))); +#define g_boxed_copy IA__g_boxed_copy + +extern __typeof (g_boxed_free) IA__g_boxed_free __attribute((visibility("hidden"))); +#define g_boxed_free IA__g_boxed_free + +extern __typeof (g_boxed_type_register_static) IA__g_boxed_type_register_static __attribute((visibility("hidden"))); +#define g_boxed_type_register_static IA__g_boxed_type_register_static + +extern __typeof (g_date_get_type) IA__g_date_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_date_get_type IA__g_date_get_type + +extern __typeof (g_gstring_get_type) IA__g_gstring_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_gstring_get_type IA__g_gstring_get_type + +extern __typeof (g_strv_get_type) IA__g_strv_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_strv_get_type IA__g_strv_get_type + +extern __typeof (g_hash_table_get_type) IA__g_hash_table_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_hash_table_get_type IA__g_hash_table_get_type + +extern __typeof (g_array_get_type) IA__g_array_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_array_get_type IA__g_array_get_type + +extern __typeof (g_byte_array_get_type) IA__g_byte_array_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_byte_array_get_type IA__g_byte_array_get_type + +extern __typeof (g_ptr_array_get_type) IA__g_ptr_array_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_ptr_array_get_type IA__g_ptr_array_get_type + +extern __typeof (g_regex_get_type) IA__g_regex_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_regex_get_type IA__g_regex_get_type + +extern __typeof (g_variant_type_get_gtype) IA__g_variant_type_get_gtype __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_variant_type_get_gtype IA__g_variant_type_get_gtype + +extern __typeof (g_variant_get_gtype) IA__g_variant_get_gtype __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_variant_get_gtype IA__g_variant_get_gtype + +extern __typeof (g_closure_get_type) IA__g_closure_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_closure_get_type IA__g_closure_get_type + +extern __typeof (g_value_get_type) IA__g_value_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_value_get_type IA__g_value_get_type + +extern __typeof (g_value_array_get_type) IA__g_value_array_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_value_array_get_type IA__g_value_array_get_type + +extern __typeof (g_value_set_boxed) IA__g_value_set_boxed __attribute((visibility("hidden"))); +#define g_value_set_boxed IA__g_value_set_boxed + +extern __typeof (g_value_take_boxed) IA__g_value_take_boxed __attribute((visibility("hidden"))); +#define g_value_take_boxed IA__g_value_take_boxed + +extern __typeof (g_value_dup_boxed) IA__g_value_dup_boxed __attribute((visibility("hidden"))); +#define g_value_dup_boxed IA__g_value_dup_boxed + +extern __typeof (g_value_get_boxed) IA__g_value_get_boxed __attribute((visibility("hidden"))); +#define g_value_get_boxed IA__g_value_get_boxed + +extern __typeof (g_value_set_static_boxed) IA__g_value_set_static_boxed __attribute((visibility("hidden"))); +#define g_value_set_static_boxed IA__g_value_set_static_boxed + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_value_set_boxed_take_ownership) IA__g_value_set_boxed_take_ownership __attribute((visibility("hidden"))); +#define g_value_set_boxed_take_ownership IA__g_value_set_boxed_take_ownership + +#endif +#endif +#endif +#if IN_HEADER(__G_MARSHAL_H__) +#if IN_FILE(__G_SIGNAL_C__) +extern __typeof (g_cclosure_marshal_BOOLEAN__FLAGS) IA__g_cclosure_marshal_BOOLEAN__FLAGS __attribute((visibility("hidden"))); +#define g_cclosure_marshal_BOOLEAN__FLAGS IA__g_cclosure_marshal_BOOLEAN__FLAGS + +extern __typeof (g_cclosure_marshal_STRING__OBJECT_POINTER) IA__g_cclosure_marshal_STRING__OBJECT_POINTER __attribute((visibility("hidden"))); +#define g_cclosure_marshal_STRING__OBJECT_POINTER IA__g_cclosure_marshal_STRING__OBJECT_POINTER + +extern __typeof (g_cclosure_marshal_VOID__BOOLEAN) IA__g_cclosure_marshal_VOID__BOOLEAN __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__BOOLEAN IA__g_cclosure_marshal_VOID__BOOLEAN + +extern __typeof (g_cclosure_marshal_VOID__BOXED) IA__g_cclosure_marshal_VOID__BOXED __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__BOXED IA__g_cclosure_marshal_VOID__BOXED + +extern __typeof (g_cclosure_marshal_VOID__CHAR) IA__g_cclosure_marshal_VOID__CHAR __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__CHAR IA__g_cclosure_marshal_VOID__CHAR + +extern __typeof (g_cclosure_marshal_VOID__DOUBLE) IA__g_cclosure_marshal_VOID__DOUBLE __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__DOUBLE IA__g_cclosure_marshal_VOID__DOUBLE + +extern __typeof (g_cclosure_marshal_VOID__ENUM) IA__g_cclosure_marshal_VOID__ENUM __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__ENUM IA__g_cclosure_marshal_VOID__ENUM + +extern __typeof (g_cclosure_marshal_VOID__FLAGS) IA__g_cclosure_marshal_VOID__FLAGS __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__FLAGS IA__g_cclosure_marshal_VOID__FLAGS + +extern __typeof (g_cclosure_marshal_VOID__FLOAT) IA__g_cclosure_marshal_VOID__FLOAT __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__FLOAT IA__g_cclosure_marshal_VOID__FLOAT + +extern __typeof (g_cclosure_marshal_VOID__INT) IA__g_cclosure_marshal_VOID__INT __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__INT IA__g_cclosure_marshal_VOID__INT + +extern __typeof (g_cclosure_marshal_VOID__LONG) IA__g_cclosure_marshal_VOID__LONG __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__LONG IA__g_cclosure_marshal_VOID__LONG + +extern __typeof (g_cclosure_marshal_VOID__OBJECT) IA__g_cclosure_marshal_VOID__OBJECT __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__OBJECT IA__g_cclosure_marshal_VOID__OBJECT + +extern __typeof (g_cclosure_marshal_VOID__PARAM) IA__g_cclosure_marshal_VOID__PARAM __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__PARAM IA__g_cclosure_marshal_VOID__PARAM + +extern __typeof (g_cclosure_marshal_VOID__POINTER) IA__g_cclosure_marshal_VOID__POINTER __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__POINTER IA__g_cclosure_marshal_VOID__POINTER + +extern __typeof (g_cclosure_marshal_VOID__STRING) IA__g_cclosure_marshal_VOID__STRING __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__STRING IA__g_cclosure_marshal_VOID__STRING + +extern __typeof (g_cclosure_marshal_VOID__UCHAR) IA__g_cclosure_marshal_VOID__UCHAR __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__UCHAR IA__g_cclosure_marshal_VOID__UCHAR + +extern __typeof (g_cclosure_marshal_VOID__UINT) IA__g_cclosure_marshal_VOID__UINT __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__UINT IA__g_cclosure_marshal_VOID__UINT + +extern __typeof (g_cclosure_marshal_VOID__UINT_POINTER) IA__g_cclosure_marshal_VOID__UINT_POINTER __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__UINT_POINTER IA__g_cclosure_marshal_VOID__UINT_POINTER + +extern __typeof (g_cclosure_marshal_VOID__ULONG) IA__g_cclosure_marshal_VOID__ULONG __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__ULONG IA__g_cclosure_marshal_VOID__ULONG + +extern __typeof (g_cclosure_marshal_VOID__VOID) IA__g_cclosure_marshal_VOID__VOID __attribute((visibility("hidden"))); +#define g_cclosure_marshal_VOID__VOID IA__g_cclosure_marshal_VOID__VOID + +#endif +#endif +#if IN_HEADER(__G_CLOSURE_H__) +#if IN_FILE(__G_CLOSURE_C__) +extern __typeof (g_cclosure_new) IA__g_cclosure_new __attribute((visibility("hidden"))); +#define g_cclosure_new IA__g_cclosure_new + +extern __typeof (g_cclosure_new_swap) IA__g_cclosure_new_swap __attribute((visibility("hidden"))); +#define g_cclosure_new_swap IA__g_cclosure_new_swap + +extern __typeof (g_closure_add_finalize_notifier) IA__g_closure_add_finalize_notifier __attribute((visibility("hidden"))); +#define g_closure_add_finalize_notifier IA__g_closure_add_finalize_notifier + +extern __typeof (g_closure_add_invalidate_notifier) IA__g_closure_add_invalidate_notifier __attribute((visibility("hidden"))); +#define g_closure_add_invalidate_notifier IA__g_closure_add_invalidate_notifier + +extern __typeof (g_closure_add_marshal_guards) IA__g_closure_add_marshal_guards __attribute((visibility("hidden"))); +#define g_closure_add_marshal_guards IA__g_closure_add_marshal_guards + +extern __typeof (g_closure_invalidate) IA__g_closure_invalidate __attribute((visibility("hidden"))); +#define g_closure_invalidate IA__g_closure_invalidate + +extern __typeof (g_closure_invoke) IA__g_closure_invoke __attribute((visibility("hidden"))); +#define g_closure_invoke IA__g_closure_invoke + +extern __typeof (g_closure_new_simple) IA__g_closure_new_simple __attribute((visibility("hidden"))); +#define g_closure_new_simple IA__g_closure_new_simple + +extern __typeof (g_closure_ref) IA__g_closure_ref __attribute((visibility("hidden"))); +#define g_closure_ref IA__g_closure_ref + +extern __typeof (g_closure_remove_finalize_notifier) IA__g_closure_remove_finalize_notifier __attribute((visibility("hidden"))); +#define g_closure_remove_finalize_notifier IA__g_closure_remove_finalize_notifier + +extern __typeof (g_closure_remove_invalidate_notifier) IA__g_closure_remove_invalidate_notifier __attribute((visibility("hidden"))); +#define g_closure_remove_invalidate_notifier IA__g_closure_remove_invalidate_notifier + +extern __typeof (g_closure_set_marshal) IA__g_closure_set_marshal __attribute((visibility("hidden"))); +#define g_closure_set_marshal IA__g_closure_set_marshal + +extern __typeof (g_closure_set_meta_marshal) IA__g_closure_set_meta_marshal __attribute((visibility("hidden"))); +#define g_closure_set_meta_marshal IA__g_closure_set_meta_marshal + +extern __typeof (g_closure_sink) IA__g_closure_sink __attribute((visibility("hidden"))); +#define g_closure_sink IA__g_closure_sink + +extern __typeof (g_closure_unref) IA__g_closure_unref __attribute((visibility("hidden"))); +#define g_closure_unref IA__g_closure_unref + +extern __typeof (g_signal_type_cclosure_new) IA__g_signal_type_cclosure_new __attribute((visibility("hidden"))); +#define g_signal_type_cclosure_new IA__g_signal_type_cclosure_new + +#endif +#endif +#if IN_HEADER(__G_ENUMS_H__) +#if IN_FILE(__G_ENUMS_C__) +extern __typeof (g_enum_complete_type_info) IA__g_enum_complete_type_info __attribute((visibility("hidden"))); +#define g_enum_complete_type_info IA__g_enum_complete_type_info + +extern __typeof (g_enum_get_value) IA__g_enum_get_value __attribute((visibility("hidden"))); +#define g_enum_get_value IA__g_enum_get_value + +extern __typeof (g_enum_get_value_by_name) IA__g_enum_get_value_by_name __attribute((visibility("hidden"))); +#define g_enum_get_value_by_name IA__g_enum_get_value_by_name + +extern __typeof (g_enum_get_value_by_nick) IA__g_enum_get_value_by_nick __attribute((visibility("hidden"))); +#define g_enum_get_value_by_nick IA__g_enum_get_value_by_nick + +extern __typeof (g_enum_register_static) IA__g_enum_register_static __attribute((visibility("hidden"))); +#define g_enum_register_static IA__g_enum_register_static + +extern __typeof (g_flags_complete_type_info) IA__g_flags_complete_type_info __attribute((visibility("hidden"))); +#define g_flags_complete_type_info IA__g_flags_complete_type_info + +extern __typeof (g_flags_get_first_value) IA__g_flags_get_first_value __attribute((visibility("hidden"))); +#define g_flags_get_first_value IA__g_flags_get_first_value + +extern __typeof (g_flags_get_value_by_name) IA__g_flags_get_value_by_name __attribute((visibility("hidden"))); +#define g_flags_get_value_by_name IA__g_flags_get_value_by_name + +extern __typeof (g_flags_get_value_by_nick) IA__g_flags_get_value_by_nick __attribute((visibility("hidden"))); +#define g_flags_get_value_by_nick IA__g_flags_get_value_by_nick + +extern __typeof (g_flags_register_static) IA__g_flags_register_static __attribute((visibility("hidden"))); +#define g_flags_register_static IA__g_flags_register_static + +extern __typeof (g_value_set_enum) IA__g_value_set_enum __attribute((visibility("hidden"))); +#define g_value_set_enum IA__g_value_set_enum + +extern __typeof (g_value_set_flags) IA__g_value_set_flags __attribute((visibility("hidden"))); +#define g_value_set_flags IA__g_value_set_flags + +extern __typeof (g_value_get_enum) IA__g_value_get_enum __attribute((visibility("hidden"))); +#define g_value_get_enum IA__g_value_get_enum + +extern __typeof (g_value_get_flags) IA__g_value_get_flags __attribute((visibility("hidden"))); +#define g_value_get_flags IA__g_value_get_flags + +#endif +#endif +#if IN_HEADER(__G_SOURCECLOSURE_H__) +#if IN_FILE(__G_SOURCECLOSURE_C__) +extern __typeof (g_io_channel_get_type) IA__g_io_channel_get_type __attribute((visibility("hidden"))); +#define g_io_channel_get_type IA__g_io_channel_get_type + +extern __typeof (g_io_condition_get_type) IA__g_io_condition_get_type __attribute((visibility("hidden"))); +#define g_io_condition_get_type IA__g_io_condition_get_type + +extern __typeof (g_source_set_closure) IA__g_source_set_closure __attribute((visibility("hidden"))); +#define g_source_set_closure IA__g_source_set_closure + +#endif +#endif +#if IN_HEADER(__G_OBJECT_H__) +#if IN_FILE(__G_OBJECT_C__) +extern __typeof (g_cclosure_new_object) IA__g_cclosure_new_object __attribute((visibility("hidden"))); +#define g_cclosure_new_object IA__g_cclosure_new_object + +extern __typeof (g_cclosure_new_object_swap) IA__g_cclosure_new_object_swap __attribute((visibility("hidden"))); +#define g_cclosure_new_object_swap IA__g_cclosure_new_object_swap + +extern __typeof (g_closure_new_object) IA__g_closure_new_object __attribute((visibility("hidden"))); +#define g_closure_new_object IA__g_closure_new_object + +extern __typeof (g_initially_unowned_get_type) IA__g_initially_unowned_get_type __attribute((visibility("hidden"))); +#define g_initially_unowned_get_type IA__g_initially_unowned_get_type + +extern __typeof (g_object_add_weak_pointer) IA__g_object_add_weak_pointer __attribute((visibility("hidden"))); +#define g_object_add_weak_pointer IA__g_object_add_weak_pointer + +extern __typeof (g_object_class_find_property) IA__g_object_class_find_property __attribute((visibility("hidden"))); +#define g_object_class_find_property IA__g_object_class_find_property + +extern __typeof (g_object_class_install_property) IA__g_object_class_install_property __attribute((visibility("hidden"))); +#define g_object_class_install_property IA__g_object_class_install_property + +extern __typeof (g_object_class_list_properties) IA__g_object_class_list_properties __attribute((visibility("hidden"))); +#define g_object_class_list_properties IA__g_object_class_list_properties + +extern __typeof (g_object_class_override_property) IA__g_object_class_override_property __attribute((visibility("hidden"))); +#define g_object_class_override_property IA__g_object_class_override_property + +extern __typeof (g_object_connect) IA__g_object_connect __attribute((visibility("hidden"))) G_GNUC_NULL_TERMINATED; +#define g_object_connect IA__g_object_connect + +extern __typeof (g_object_disconnect) IA__g_object_disconnect __attribute((visibility("hidden"))) G_GNUC_NULL_TERMINATED; +#define g_object_disconnect IA__g_object_disconnect + +extern __typeof (g_object_freeze_notify) IA__g_object_freeze_notify __attribute((visibility("hidden"))); +#define g_object_freeze_notify IA__g_object_freeze_notify + +extern __typeof (g_object_get) IA__g_object_get __attribute((visibility("hidden"))) G_GNUC_NULL_TERMINATED; +#define g_object_get IA__g_object_get + +extern __typeof (g_object_get_data) IA__g_object_get_data __attribute((visibility("hidden"))); +#define g_object_get_data IA__g_object_get_data + +extern __typeof (g_object_get_property) IA__g_object_get_property __attribute((visibility("hidden"))); +#define g_object_get_property IA__g_object_get_property + +extern __typeof (g_object_get_qdata) IA__g_object_get_qdata __attribute((visibility("hidden"))); +#define g_object_get_qdata IA__g_object_get_qdata + +extern __typeof (g_object_get_type) IA__g_object_get_type __attribute((visibility("hidden"))); +#define g_object_get_type IA__g_object_get_type + +extern __typeof (g_object_get_valist) IA__g_object_get_valist __attribute((visibility("hidden"))); +#define g_object_get_valist IA__g_object_get_valist + +extern __typeof (g_object_interface_find_property) IA__g_object_interface_find_property __attribute((visibility("hidden"))); +#define g_object_interface_find_property IA__g_object_interface_find_property + +extern __typeof (g_object_interface_install_property) IA__g_object_interface_install_property __attribute((visibility("hidden"))); +#define g_object_interface_install_property IA__g_object_interface_install_property + +extern __typeof (g_object_interface_list_properties) IA__g_object_interface_list_properties __attribute((visibility("hidden"))); +#define g_object_interface_list_properties IA__g_object_interface_list_properties + +extern __typeof (g_object_new) IA__g_object_new __attribute((visibility("hidden"))); +#define g_object_new IA__g_object_new + +extern __typeof (g_object_newv) IA__g_object_newv __attribute((visibility("hidden"))); +#define g_object_newv IA__g_object_newv + +extern __typeof (g_object_new_valist) IA__g_object_new_valist __attribute((visibility("hidden"))); +#define g_object_new_valist IA__g_object_new_valist + +extern __typeof (g_object_notify) IA__g_object_notify __attribute((visibility("hidden"))); +#define g_object_notify IA__g_object_notify + +extern __typeof (g_object_is_floating) IA__g_object_is_floating __attribute((visibility("hidden"))); +#define g_object_is_floating IA__g_object_is_floating + +extern __typeof (g_object_ref_sink) IA__g_object_ref_sink __attribute((visibility("hidden"))); +#define g_object_ref_sink IA__g_object_ref_sink + +extern __typeof (g_object_force_floating) IA__g_object_force_floating __attribute((visibility("hidden"))); +#define g_object_force_floating IA__g_object_force_floating + +extern __typeof (g_object_ref) IA__g_object_ref __attribute((visibility("hidden"))); +#define g_object_ref IA__g_object_ref + +extern __typeof (g_object_unref) IA__g_object_unref __attribute((visibility("hidden"))); +#define g_object_unref IA__g_object_unref + +extern __typeof (g_object_remove_weak_pointer) IA__g_object_remove_weak_pointer __attribute((visibility("hidden"))); +#define g_object_remove_weak_pointer IA__g_object_remove_weak_pointer + +extern __typeof (g_object_run_dispose) IA__g_object_run_dispose __attribute((visibility("hidden"))); +#define g_object_run_dispose IA__g_object_run_dispose + +extern __typeof (g_object_set) IA__g_object_set __attribute((visibility("hidden"))) G_GNUC_NULL_TERMINATED; +#define g_object_set IA__g_object_set + +extern __typeof (g_object_set_data) IA__g_object_set_data __attribute((visibility("hidden"))); +#define g_object_set_data IA__g_object_set_data + +extern __typeof (g_object_set_data_full) IA__g_object_set_data_full __attribute((visibility("hidden"))); +#define g_object_set_data_full IA__g_object_set_data_full + +extern __typeof (g_object_set_property) IA__g_object_set_property __attribute((visibility("hidden"))); +#define g_object_set_property IA__g_object_set_property + +extern __typeof (g_object_set_qdata) IA__g_object_set_qdata __attribute((visibility("hidden"))); +#define g_object_set_qdata IA__g_object_set_qdata + +extern __typeof (g_object_set_qdata_full) IA__g_object_set_qdata_full __attribute((visibility("hidden"))); +#define g_object_set_qdata_full IA__g_object_set_qdata_full + +extern __typeof (g_object_set_valist) IA__g_object_set_valist __attribute((visibility("hidden"))); +#define g_object_set_valist IA__g_object_set_valist + +extern __typeof (g_object_steal_data) IA__g_object_steal_data __attribute((visibility("hidden"))); +#define g_object_steal_data IA__g_object_steal_data + +extern __typeof (g_object_steal_qdata) IA__g_object_steal_qdata __attribute((visibility("hidden"))); +#define g_object_steal_qdata IA__g_object_steal_qdata + +extern __typeof (g_object_thaw_notify) IA__g_object_thaw_notify __attribute((visibility("hidden"))); +#define g_object_thaw_notify IA__g_object_thaw_notify + +extern __typeof (g_object_watch_closure) IA__g_object_watch_closure __attribute((visibility("hidden"))); +#define g_object_watch_closure IA__g_object_watch_closure + +extern __typeof (g_object_weak_ref) IA__g_object_weak_ref __attribute((visibility("hidden"))); +#define g_object_weak_ref IA__g_object_weak_ref + +extern __typeof (g_object_weak_unref) IA__g_object_weak_unref __attribute((visibility("hidden"))); +#define g_object_weak_unref IA__g_object_weak_unref + +extern __typeof (g_object_add_toggle_ref) IA__g_object_add_toggle_ref __attribute((visibility("hidden"))); +#define g_object_add_toggle_ref IA__g_object_add_toggle_ref + +extern __typeof (g_object_remove_toggle_ref) IA__g_object_remove_toggle_ref __attribute((visibility("hidden"))); +#define g_object_remove_toggle_ref IA__g_object_remove_toggle_ref + +extern __typeof (g_value_get_object) IA__g_value_get_object __attribute((visibility("hidden"))); +#define g_value_get_object IA__g_value_get_object + +extern __typeof (g_value_set_object) IA__g_value_set_object __attribute((visibility("hidden"))); +#define g_value_set_object IA__g_value_set_object + +extern __typeof (g_value_dup_object) IA__g_value_dup_object __attribute((visibility("hidden"))); +#define g_value_dup_object IA__g_value_dup_object + +extern __typeof (g_value_take_object) IA__g_value_take_object __attribute((visibility("hidden"))); +#define g_value_take_object IA__g_value_take_object + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_value_set_object_take_ownership) IA__g_value_set_object_take_ownership __attribute((visibility("hidden"))); +#define g_value_set_object_take_ownership IA__g_value_set_object_take_ownership + +extern __typeof (g_object_compat_control) IA__g_object_compat_control __attribute((visibility("hidden"))); +#define g_object_compat_control IA__g_object_compat_control + +#endif +extern __typeof (g_signal_connect_object) IA__g_signal_connect_object __attribute((visibility("hidden"))); +#define g_signal_connect_object IA__g_signal_connect_object + +#endif +#endif +#if IN_HEADER(__G_PARAMSPECS_H__) +#if IN_FILE(__G_PARAMSPECS_C__) +extern __typeof (g_param_spec_boolean) IA__g_param_spec_boolean __attribute((visibility("hidden"))); +#define g_param_spec_boolean IA__g_param_spec_boolean + +extern __typeof (g_param_spec_boxed) IA__g_param_spec_boxed __attribute((visibility("hidden"))); +#define g_param_spec_boxed IA__g_param_spec_boxed + +extern __typeof (g_param_spec_char) IA__g_param_spec_char __attribute((visibility("hidden"))); +#define g_param_spec_char IA__g_param_spec_char + +extern __typeof (g_param_spec_double) IA__g_param_spec_double __attribute((visibility("hidden"))); +#define g_param_spec_double IA__g_param_spec_double + +extern __typeof (g_param_spec_enum) IA__g_param_spec_enum __attribute((visibility("hidden"))); +#define g_param_spec_enum IA__g_param_spec_enum + +extern __typeof (g_param_spec_flags) IA__g_param_spec_flags __attribute((visibility("hidden"))); +#define g_param_spec_flags IA__g_param_spec_flags + +extern __typeof (g_param_spec_float) IA__g_param_spec_float __attribute((visibility("hidden"))); +#define g_param_spec_float IA__g_param_spec_float + +extern __typeof (g_param_spec_int) IA__g_param_spec_int __attribute((visibility("hidden"))); +#define g_param_spec_int IA__g_param_spec_int + +extern __typeof (g_param_spec_int64) IA__g_param_spec_int64 __attribute((visibility("hidden"))); +#define g_param_spec_int64 IA__g_param_spec_int64 + +extern __typeof (g_param_spec_long) IA__g_param_spec_long __attribute((visibility("hidden"))); +#define g_param_spec_long IA__g_param_spec_long + +extern __typeof (g_param_spec_object) IA__g_param_spec_object __attribute((visibility("hidden"))); +#define g_param_spec_object IA__g_param_spec_object + +extern __typeof (g_param_spec_override) IA__g_param_spec_override __attribute((visibility("hidden"))); +#define g_param_spec_override IA__g_param_spec_override + +extern __typeof (g_param_spec_gtype) IA__g_param_spec_gtype __attribute((visibility("hidden"))); +#define g_param_spec_gtype IA__g_param_spec_gtype + +extern __typeof (g_param_spec_param) IA__g_param_spec_param __attribute((visibility("hidden"))); +#define g_param_spec_param IA__g_param_spec_param + +extern __typeof (g_param_spec_pointer) IA__g_param_spec_pointer __attribute((visibility("hidden"))); +#define g_param_spec_pointer IA__g_param_spec_pointer + +extern __typeof (g_param_spec_string) IA__g_param_spec_string __attribute((visibility("hidden"))); +#define g_param_spec_string IA__g_param_spec_string + +extern __typeof (g_param_spec_uchar) IA__g_param_spec_uchar __attribute((visibility("hidden"))); +#define g_param_spec_uchar IA__g_param_spec_uchar + +extern __typeof (g_param_spec_uint) IA__g_param_spec_uint __attribute((visibility("hidden"))); +#define g_param_spec_uint IA__g_param_spec_uint + +extern __typeof (g_param_spec_uint64) IA__g_param_spec_uint64 __attribute((visibility("hidden"))); +#define g_param_spec_uint64 IA__g_param_spec_uint64 + +extern __typeof (g_param_spec_ulong) IA__g_param_spec_ulong __attribute((visibility("hidden"))); +#define g_param_spec_ulong IA__g_param_spec_ulong + +extern __typeof (g_param_spec_unichar) IA__g_param_spec_unichar __attribute((visibility("hidden"))); +#define g_param_spec_unichar IA__g_param_spec_unichar + +extern __typeof (g_param_spec_value_array) IA__g_param_spec_value_array __attribute((visibility("hidden"))); +#define g_param_spec_value_array IA__g_param_spec_value_array + +#endif +#endif +#if IN_HEADER(__G_PARAM_H__) +#if IN_FILE(__G_PARAM_C__) +extern __typeof (g_param_spec_get_blurb) IA__g_param_spec_get_blurb __attribute((visibility("hidden"))); +#define g_param_spec_get_blurb IA__g_param_spec_get_blurb + +extern __typeof (g_param_spec_get_name) IA__g_param_spec_get_name __attribute((visibility("hidden"))); +#define g_param_spec_get_name IA__g_param_spec_get_name + +extern __typeof (g_param_spec_get_nick) IA__g_param_spec_get_nick __attribute((visibility("hidden"))); +#define g_param_spec_get_nick IA__g_param_spec_get_nick + +extern __typeof (g_param_spec_get_redirect_target) IA__g_param_spec_get_redirect_target __attribute((visibility("hidden"))); +#define g_param_spec_get_redirect_target IA__g_param_spec_get_redirect_target + +extern __typeof (g_param_spec_internal) IA__g_param_spec_internal __attribute((visibility("hidden"))); +#define g_param_spec_internal IA__g_param_spec_internal + +extern __typeof (g_param_type_register_static) IA__g_param_type_register_static __attribute((visibility("hidden"))); +#define g_param_type_register_static IA__g_param_type_register_static + +extern __typeof (g_param_spec_ref) IA__g_param_spec_ref __attribute((visibility("hidden"))); +#define g_param_spec_ref IA__g_param_spec_ref + +extern __typeof (g_param_spec_ref_sink) IA__g_param_spec_ref_sink __attribute((visibility("hidden"))); +#define g_param_spec_ref_sink IA__g_param_spec_ref_sink + +extern __typeof (g_param_spec_unref) IA__g_param_spec_unref __attribute((visibility("hidden"))); +#define g_param_spec_unref IA__g_param_spec_unref + +extern __typeof (g_param_spec_sink) IA__g_param_spec_sink __attribute((visibility("hidden"))); +#define g_param_spec_sink IA__g_param_spec_sink + +extern __typeof (g_param_spec_steal_qdata) IA__g_param_spec_steal_qdata __attribute((visibility("hidden"))); +#define g_param_spec_steal_qdata IA__g_param_spec_steal_qdata + +extern __typeof (g_param_spec_set_qdata) IA__g_param_spec_set_qdata __attribute((visibility("hidden"))); +#define g_param_spec_set_qdata IA__g_param_spec_set_qdata + +extern __typeof (g_param_spec_set_qdata_full) IA__g_param_spec_set_qdata_full __attribute((visibility("hidden"))); +#define g_param_spec_set_qdata_full IA__g_param_spec_set_qdata_full + +extern __typeof (g_param_spec_get_qdata) IA__g_param_spec_get_qdata __attribute((visibility("hidden"))); +#define g_param_spec_get_qdata IA__g_param_spec_get_qdata + +extern __typeof (g_param_value_convert) IA__g_param_value_convert __attribute((visibility("hidden"))); +#define g_param_value_convert IA__g_param_value_convert + +extern __typeof (g_param_value_defaults) IA__g_param_value_defaults __attribute((visibility("hidden"))); +#define g_param_value_defaults IA__g_param_value_defaults + +extern __typeof (g_param_values_cmp) IA__g_param_values_cmp __attribute((visibility("hidden"))); +#define g_param_values_cmp IA__g_param_values_cmp + +extern __typeof (g_param_value_set_default) IA__g_param_value_set_default __attribute((visibility("hidden"))); +#define g_param_value_set_default IA__g_param_value_set_default + +extern __typeof (g_param_value_validate) IA__g_param_value_validate __attribute((visibility("hidden"))); +#define g_param_value_validate IA__g_param_value_validate + +extern __typeof (g_param_spec_pool_insert) IA__g_param_spec_pool_insert __attribute((visibility("hidden"))); +#define g_param_spec_pool_insert IA__g_param_spec_pool_insert + +extern __typeof (g_param_spec_pool_list) IA__g_param_spec_pool_list __attribute((visibility("hidden"))); +#define g_param_spec_pool_list IA__g_param_spec_pool_list + +extern __typeof (g_param_spec_pool_list_owned) IA__g_param_spec_pool_list_owned __attribute((visibility("hidden"))); +#define g_param_spec_pool_list_owned IA__g_param_spec_pool_list_owned + +extern __typeof (g_param_spec_pool_lookup) IA__g_param_spec_pool_lookup __attribute((visibility("hidden"))); +#define g_param_spec_pool_lookup IA__g_param_spec_pool_lookup + +extern __typeof (g_param_spec_pool_new) IA__g_param_spec_pool_new __attribute((visibility("hidden"))); +#define g_param_spec_pool_new IA__g_param_spec_pool_new + +extern __typeof (g_param_spec_pool_remove) IA__g_param_spec_pool_remove __attribute((visibility("hidden"))); +#define g_param_spec_pool_remove IA__g_param_spec_pool_remove + +extern __typeof (g_value_get_param) IA__g_value_get_param __attribute((visibility("hidden"))); +#define g_value_get_param IA__g_value_get_param + +extern __typeof (g_value_set_param) IA__g_value_set_param __attribute((visibility("hidden"))); +#define g_value_set_param IA__g_value_set_param + +extern __typeof (g_value_dup_param) IA__g_value_dup_param __attribute((visibility("hidden"))); +#define g_value_dup_param IA__g_value_dup_param + +extern __typeof (g_value_take_param) IA__g_value_take_param __attribute((visibility("hidden"))); +#define g_value_take_param IA__g_value_take_param + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_value_set_param_take_ownership) IA__g_value_set_param_take_ownership __attribute((visibility("hidden"))); +#define g_value_set_param_take_ownership IA__g_value_set_param_take_ownership + +#endif +#endif +#endif +#if IN_HEADER(__G_VALUETYPES_H__) +#if IN_FILE(__G_VALUETYPES_C__) +extern __typeof (g_pointer_type_register_static) IA__g_pointer_type_register_static __attribute((visibility("hidden"))); +#define g_pointer_type_register_static IA__g_pointer_type_register_static + +extern __typeof (g_strdup_value_contents) IA__g_strdup_value_contents __attribute((visibility("hidden"))); +#define g_strdup_value_contents IA__g_strdup_value_contents + +extern __typeof (g_value_set_boolean) IA__g_value_set_boolean __attribute((visibility("hidden"))); +#define g_value_set_boolean IA__g_value_set_boolean + +extern __typeof (g_value_set_char) IA__g_value_set_char __attribute((visibility("hidden"))); +#define g_value_set_char IA__g_value_set_char + +extern __typeof (g_value_set_double) IA__g_value_set_double __attribute((visibility("hidden"))); +#define g_value_set_double IA__g_value_set_double + +extern __typeof (g_value_set_float) IA__g_value_set_float __attribute((visibility("hidden"))); +#define g_value_set_float IA__g_value_set_float + +extern __typeof (g_value_set_int) IA__g_value_set_int __attribute((visibility("hidden"))); +#define g_value_set_int IA__g_value_set_int + +extern __typeof (g_value_set_int64) IA__g_value_set_int64 __attribute((visibility("hidden"))); +#define g_value_set_int64 IA__g_value_set_int64 + +extern __typeof (g_value_set_long) IA__g_value_set_long __attribute((visibility("hidden"))); +#define g_value_set_long IA__g_value_set_long + +extern __typeof (g_value_set_pointer) IA__g_value_set_pointer __attribute((visibility("hidden"))); +#define g_value_set_pointer IA__g_value_set_pointer + +extern __typeof (g_value_set_static_string) IA__g_value_set_static_string __attribute((visibility("hidden"))); +#define g_value_set_static_string IA__g_value_set_static_string + +extern __typeof (g_value_set_string) IA__g_value_set_string __attribute((visibility("hidden"))); +#define g_value_set_string IA__g_value_set_string + +#ifndef G_DISABLE_DEPRECATED +extern __typeof (g_value_set_string_take_ownership) IA__g_value_set_string_take_ownership __attribute((visibility("hidden"))); +#define g_value_set_string_take_ownership IA__g_value_set_string_take_ownership + +#endif +extern __typeof (g_value_set_uchar) IA__g_value_set_uchar __attribute((visibility("hidden"))); +#define g_value_set_uchar IA__g_value_set_uchar + +extern __typeof (g_value_set_uint) IA__g_value_set_uint __attribute((visibility("hidden"))); +#define g_value_set_uint IA__g_value_set_uint + +extern __typeof (g_value_set_uint64) IA__g_value_set_uint64 __attribute((visibility("hidden"))); +#define g_value_set_uint64 IA__g_value_set_uint64 + +extern __typeof (g_value_set_ulong) IA__g_value_set_ulong __attribute((visibility("hidden"))); +#define g_value_set_ulong IA__g_value_set_ulong + +extern __typeof (g_value_dup_string) IA__g_value_dup_string __attribute((visibility("hidden"))); +#define g_value_dup_string IA__g_value_dup_string + +extern __typeof (g_value_get_boolean) IA__g_value_get_boolean __attribute((visibility("hidden"))); +#define g_value_get_boolean IA__g_value_get_boolean + +extern __typeof (g_value_get_char) IA__g_value_get_char __attribute((visibility("hidden"))); +#define g_value_get_char IA__g_value_get_char + +extern __typeof (g_value_get_double) IA__g_value_get_double __attribute((visibility("hidden"))); +#define g_value_get_double IA__g_value_get_double + +extern __typeof (g_value_get_float) IA__g_value_get_float __attribute((visibility("hidden"))); +#define g_value_get_float IA__g_value_get_float + +extern __typeof (g_value_get_int) IA__g_value_get_int __attribute((visibility("hidden"))); +#define g_value_get_int IA__g_value_get_int + +extern __typeof (g_value_get_int64) IA__g_value_get_int64 __attribute((visibility("hidden"))); +#define g_value_get_int64 IA__g_value_get_int64 + +extern __typeof (g_value_get_long) IA__g_value_get_long __attribute((visibility("hidden"))); +#define g_value_get_long IA__g_value_get_long + +extern __typeof (g_value_get_pointer) IA__g_value_get_pointer __attribute((visibility("hidden"))); +#define g_value_get_pointer IA__g_value_get_pointer + +extern __typeof (g_value_get_string) IA__g_value_get_string __attribute((visibility("hidden"))); +#define g_value_get_string IA__g_value_get_string + +extern __typeof (g_value_get_uchar) IA__g_value_get_uchar __attribute((visibility("hidden"))); +#define g_value_get_uchar IA__g_value_get_uchar + +extern __typeof (g_value_get_uint) IA__g_value_get_uint __attribute((visibility("hidden"))); +#define g_value_get_uint IA__g_value_get_uint + +extern __typeof (g_value_get_uint64) IA__g_value_get_uint64 __attribute((visibility("hidden"))); +#define g_value_get_uint64 IA__g_value_get_uint64 + +extern __typeof (g_value_get_ulong) IA__g_value_get_ulong __attribute((visibility("hidden"))); +#define g_value_get_ulong IA__g_value_get_ulong + +extern __typeof (g_value_take_string) IA__g_value_take_string __attribute((visibility("hidden"))); +#define g_value_take_string IA__g_value_take_string + +extern __typeof (g_gtype_get_type) IA__g_gtype_get_type __attribute((visibility("hidden"))); +#define g_gtype_get_type IA__g_gtype_get_type + +extern __typeof (g_value_set_gtype) IA__g_value_set_gtype __attribute((visibility("hidden"))); +#define g_value_set_gtype IA__g_value_set_gtype + +extern __typeof (g_value_get_gtype) IA__g_value_get_gtype __attribute((visibility("hidden"))); +#define g_value_get_gtype IA__g_value_get_gtype + +#endif +#endif +#if IN_HEADER(__G_SIGNAL_H__) +#if IN_FILE(__G_SIGNAL_C__) +extern __typeof (g_signal_accumulator_true_handled) IA__g_signal_accumulator_true_handled __attribute((visibility("hidden"))); +#define g_signal_accumulator_true_handled IA__g_signal_accumulator_true_handled + +extern __typeof (g_signal_add_emission_hook) IA__g_signal_add_emission_hook __attribute((visibility("hidden"))); +#define g_signal_add_emission_hook IA__g_signal_add_emission_hook + +extern __typeof (g_signal_chain_from_overridden) IA__g_signal_chain_from_overridden __attribute((visibility("hidden"))); +#define g_signal_chain_from_overridden IA__g_signal_chain_from_overridden + +extern __typeof (g_signal_chain_from_overridden_handler) IA__g_signal_chain_from_overridden_handler __attribute((visibility("hidden"))); +#define g_signal_chain_from_overridden_handler IA__g_signal_chain_from_overridden_handler + +extern __typeof (g_signal_connect_closure) IA__g_signal_connect_closure __attribute((visibility("hidden"))); +#define g_signal_connect_closure IA__g_signal_connect_closure + +extern __typeof (g_signal_connect_closure_by_id) IA__g_signal_connect_closure_by_id __attribute((visibility("hidden"))); +#define g_signal_connect_closure_by_id IA__g_signal_connect_closure_by_id + +extern __typeof (g_signal_connect_data) IA__g_signal_connect_data __attribute((visibility("hidden"))); +#define g_signal_connect_data IA__g_signal_connect_data + +extern __typeof (g_signal_emit) IA__g_signal_emit __attribute((visibility("hidden"))); +#define g_signal_emit IA__g_signal_emit + +extern __typeof (g_signal_emit_by_name) IA__g_signal_emit_by_name __attribute((visibility("hidden"))); +#define g_signal_emit_by_name IA__g_signal_emit_by_name + +extern __typeof (g_signal_emitv) IA__g_signal_emitv __attribute((visibility("hidden"))); +#define g_signal_emitv IA__g_signal_emitv + +extern __typeof (g_signal_emit_valist) IA__g_signal_emit_valist __attribute((visibility("hidden"))); +#define g_signal_emit_valist IA__g_signal_emit_valist + +extern __typeof (g_signal_get_invocation_hint) IA__g_signal_get_invocation_hint __attribute((visibility("hidden"))); +#define g_signal_get_invocation_hint IA__g_signal_get_invocation_hint + +extern __typeof (g_signal_handler_block) IA__g_signal_handler_block __attribute((visibility("hidden"))); +#define g_signal_handler_block IA__g_signal_handler_block + +extern __typeof (g_signal_handler_disconnect) IA__g_signal_handler_disconnect __attribute((visibility("hidden"))); +#define g_signal_handler_disconnect IA__g_signal_handler_disconnect + +extern __typeof (g_signal_handler_find) IA__g_signal_handler_find __attribute((visibility("hidden"))); +#define g_signal_handler_find IA__g_signal_handler_find + +extern __typeof (g_signal_handler_is_connected) IA__g_signal_handler_is_connected __attribute((visibility("hidden"))); +#define g_signal_handler_is_connected IA__g_signal_handler_is_connected + +extern __typeof (g_signal_handlers_block_matched) IA__g_signal_handlers_block_matched __attribute((visibility("hidden"))); +#define g_signal_handlers_block_matched IA__g_signal_handlers_block_matched + +extern __typeof (g_signal_handlers_destroy) IA__g_signal_handlers_destroy __attribute((visibility("hidden"))); +#define g_signal_handlers_destroy IA__g_signal_handlers_destroy + +extern __typeof (g_signal_handlers_disconnect_matched) IA__g_signal_handlers_disconnect_matched __attribute((visibility("hidden"))); +#define g_signal_handlers_disconnect_matched IA__g_signal_handlers_disconnect_matched + +extern __typeof (g_signal_handlers_unblock_matched) IA__g_signal_handlers_unblock_matched __attribute((visibility("hidden"))); +#define g_signal_handlers_unblock_matched IA__g_signal_handlers_unblock_matched + +extern __typeof (g_signal_handler_unblock) IA__g_signal_handler_unblock __attribute((visibility("hidden"))); +#define g_signal_handler_unblock IA__g_signal_handler_unblock + +extern __typeof (g_signal_has_handler_pending) IA__g_signal_has_handler_pending __attribute((visibility("hidden"))); +#define g_signal_has_handler_pending IA__g_signal_has_handler_pending + +extern __typeof (g_signal_list_ids) IA__g_signal_list_ids __attribute((visibility("hidden"))); +#define g_signal_list_ids IA__g_signal_list_ids + +extern __typeof (g_signal_lookup) IA__g_signal_lookup __attribute((visibility("hidden"))); +#define g_signal_lookup IA__g_signal_lookup + +extern __typeof (g_signal_name) IA__g_signal_name __attribute((visibility("hidden"))); +#define g_signal_name IA__g_signal_name + +extern __typeof (g_signal_new) IA__g_signal_new __attribute((visibility("hidden"))); +#define g_signal_new IA__g_signal_new + +extern __typeof (g_signal_newv) IA__g_signal_newv __attribute((visibility("hidden"))); +#define g_signal_newv IA__g_signal_newv + +extern __typeof (g_signal_new_valist) IA__g_signal_new_valist __attribute((visibility("hidden"))); +#define g_signal_new_valist IA__g_signal_new_valist + +extern __typeof (g_signal_new_class_handler) IA__g_signal_new_class_handler __attribute((visibility("hidden"))); +#define g_signal_new_class_handler IA__g_signal_new_class_handler + +extern __typeof (g_signal_override_class_closure) IA__g_signal_override_class_closure __attribute((visibility("hidden"))); +#define g_signal_override_class_closure IA__g_signal_override_class_closure + +extern __typeof (g_signal_override_class_handler) IA__g_signal_override_class_handler __attribute((visibility("hidden"))); +#define g_signal_override_class_handler IA__g_signal_override_class_handler + +extern __typeof (g_signal_parse_name) IA__g_signal_parse_name __attribute((visibility("hidden"))); +#define g_signal_parse_name IA__g_signal_parse_name + +extern __typeof (g_signal_query) IA__g_signal_query __attribute((visibility("hidden"))); +#define g_signal_query IA__g_signal_query + +extern __typeof (g_signal_remove_emission_hook) IA__g_signal_remove_emission_hook __attribute((visibility("hidden"))); +#define g_signal_remove_emission_hook IA__g_signal_remove_emission_hook + +extern __typeof (g_signal_stop_emission) IA__g_signal_stop_emission __attribute((visibility("hidden"))); +#define g_signal_stop_emission IA__g_signal_stop_emission + +extern __typeof (g_signal_stop_emission_by_name) IA__g_signal_stop_emission_by_name __attribute((visibility("hidden"))); +#define g_signal_stop_emission_by_name IA__g_signal_stop_emission_by_name + +#endif +#endif +#if IN_HEADER(__G_TYPE_H__) +#if IN_FILE(__G_TYPE_C__) +extern __typeof (g_type_add_class_cache_func) IA__g_type_add_class_cache_func __attribute((visibility("hidden"))); +#define g_type_add_class_cache_func IA__g_type_add_class_cache_func + +extern __typeof (g_type_add_interface_check) IA__g_type_add_interface_check __attribute((visibility("hidden"))); +#define g_type_add_interface_check IA__g_type_add_interface_check + +extern __typeof (g_type_add_interface_dynamic) IA__g_type_add_interface_dynamic __attribute((visibility("hidden"))); +#define g_type_add_interface_dynamic IA__g_type_add_interface_dynamic + +extern __typeof (g_type_add_interface_static) IA__g_type_add_interface_static __attribute((visibility("hidden"))); +#define g_type_add_interface_static IA__g_type_add_interface_static + +extern __typeof (g_type_check_class_cast) IA__g_type_check_class_cast __attribute((visibility("hidden"))); +#define g_type_check_class_cast IA__g_type_check_class_cast + +extern __typeof (g_type_check_class_is_a) IA__g_type_check_class_is_a __attribute((visibility("hidden"))); +#define g_type_check_class_is_a IA__g_type_check_class_is_a + +extern __typeof (g_type_check_instance) IA__g_type_check_instance __attribute((visibility("hidden"))); +#define g_type_check_instance IA__g_type_check_instance + +extern __typeof (g_type_check_instance_cast) IA__g_type_check_instance_cast __attribute((visibility("hidden"))); +#define g_type_check_instance_cast IA__g_type_check_instance_cast + +extern __typeof (g_type_check_instance_is_a) IA__g_type_check_instance_is_a __attribute((visibility("hidden"))); +#define g_type_check_instance_is_a IA__g_type_check_instance_is_a + +extern __typeof (g_type_check_is_value_type) IA__g_type_check_is_value_type __attribute((visibility("hidden"))); +#define g_type_check_is_value_type IA__g_type_check_is_value_type + +extern __typeof (g_type_check_value) IA__g_type_check_value __attribute((visibility("hidden"))); +#define g_type_check_value IA__g_type_check_value + +extern __typeof (g_type_check_value_holds) IA__g_type_check_value_holds __attribute((visibility("hidden"))); +#define g_type_check_value_holds IA__g_type_check_value_holds + +extern __typeof (g_type_children) IA__g_type_children __attribute((visibility("hidden"))); +#define g_type_children IA__g_type_children + +extern __typeof (g_type_class_add_private) IA__g_type_class_add_private __attribute((visibility("hidden"))); +#define g_type_class_add_private IA__g_type_class_add_private + +extern __typeof (g_type_class_peek) IA__g_type_class_peek __attribute((visibility("hidden"))); +#define g_type_class_peek IA__g_type_class_peek + +extern __typeof (g_type_class_peek_parent) IA__g_type_class_peek_parent __attribute((visibility("hidden"))); +#define g_type_class_peek_parent IA__g_type_class_peek_parent + +extern __typeof (g_type_class_peek_static) IA__g_type_class_peek_static __attribute((visibility("hidden"))); +#define g_type_class_peek_static IA__g_type_class_peek_static + +extern __typeof (g_type_class_ref) IA__g_type_class_ref __attribute((visibility("hidden"))); +#define g_type_class_ref IA__g_type_class_ref + +extern __typeof (g_type_class_unref) IA__g_type_class_unref __attribute((visibility("hidden"))); +#define g_type_class_unref IA__g_type_class_unref + +extern __typeof (g_type_class_unref_uncached) IA__g_type_class_unref_uncached __attribute((visibility("hidden"))); +#define g_type_class_unref_uncached IA__g_type_class_unref_uncached + +extern __typeof (g_type_create_instance) IA__g_type_create_instance __attribute((visibility("hidden"))); +#define g_type_create_instance IA__g_type_create_instance + +extern __typeof (g_type_default_interface_peek) IA__g_type_default_interface_peek __attribute((visibility("hidden"))); +#define g_type_default_interface_peek IA__g_type_default_interface_peek + +extern __typeof (g_type_default_interface_ref) IA__g_type_default_interface_ref __attribute((visibility("hidden"))); +#define g_type_default_interface_ref IA__g_type_default_interface_ref + +extern __typeof (g_type_default_interface_unref) IA__g_type_default_interface_unref __attribute((visibility("hidden"))); +#define g_type_default_interface_unref IA__g_type_default_interface_unref + +extern __typeof (g_type_depth) IA__g_type_depth __attribute((visibility("hidden"))); +#define g_type_depth IA__g_type_depth + +extern __typeof (g_type_free_instance) IA__g_type_free_instance __attribute((visibility("hidden"))); +#define g_type_free_instance IA__g_type_free_instance + +extern __typeof (g_type_from_name) IA__g_type_from_name __attribute((visibility("hidden"))); +#define g_type_from_name IA__g_type_from_name + +extern __typeof (g_type_fundamental) IA__g_type_fundamental __attribute((visibility("hidden"))); +#define g_type_fundamental IA__g_type_fundamental + +extern __typeof (g_type_fundamental_next) IA__g_type_fundamental_next __attribute((visibility("hidden"))); +#define g_type_fundamental_next IA__g_type_fundamental_next + +extern __typeof (g_type_get_plugin) IA__g_type_get_plugin __attribute((visibility("hidden"))); +#define g_type_get_plugin IA__g_type_get_plugin + +extern __typeof (g_type_get_qdata) IA__g_type_get_qdata __attribute((visibility("hidden"))); +#define g_type_get_qdata IA__g_type_get_qdata + +extern __typeof (g_type_init) IA__g_type_init __attribute((visibility("hidden"))); +#define g_type_init IA__g_type_init + +extern __typeof (g_type_init_with_debug_flags) IA__g_type_init_with_debug_flags __attribute((visibility("hidden"))); +#define g_type_init_with_debug_flags IA__g_type_init_with_debug_flags + +extern __typeof (g_type_instance_get_private) IA__g_type_instance_get_private __attribute((visibility("hidden"))); +#define g_type_instance_get_private IA__g_type_instance_get_private + +extern __typeof (g_type_interface_add_prerequisite) IA__g_type_interface_add_prerequisite __attribute((visibility("hidden"))); +#define g_type_interface_add_prerequisite IA__g_type_interface_add_prerequisite + +extern __typeof (g_type_interface_get_plugin) IA__g_type_interface_get_plugin __attribute((visibility("hidden"))); +#define g_type_interface_get_plugin IA__g_type_interface_get_plugin + +extern __typeof (g_type_interface_peek) IA__g_type_interface_peek __attribute((visibility("hidden"))); +#define g_type_interface_peek IA__g_type_interface_peek + +extern __typeof (g_type_interface_peek_parent) IA__g_type_interface_peek_parent __attribute((visibility("hidden"))); +#define g_type_interface_peek_parent IA__g_type_interface_peek_parent + +extern __typeof (g_type_interface_prerequisites) IA__g_type_interface_prerequisites __attribute((visibility("hidden"))); +#define g_type_interface_prerequisites IA__g_type_interface_prerequisites + +extern __typeof (g_type_interfaces) IA__g_type_interfaces __attribute((visibility("hidden"))); +#define g_type_interfaces IA__g_type_interfaces + +extern __typeof (g_type_is_a) IA__g_type_is_a __attribute((visibility("hidden"))); +#define g_type_is_a IA__g_type_is_a + +extern __typeof (g_type_name) IA__g_type_name __attribute((visibility("hidden"))); +#define g_type_name IA__g_type_name + +extern __typeof (g_type_name_from_class) IA__g_type_name_from_class __attribute((visibility("hidden"))); +#define g_type_name_from_class IA__g_type_name_from_class + +extern __typeof (g_type_name_from_instance) IA__g_type_name_from_instance __attribute((visibility("hidden"))); +#define g_type_name_from_instance IA__g_type_name_from_instance + +extern __typeof (g_type_next_base) IA__g_type_next_base __attribute((visibility("hidden"))); +#define g_type_next_base IA__g_type_next_base + +extern __typeof (g_type_parent) IA__g_type_parent __attribute((visibility("hidden"))); +#define g_type_parent IA__g_type_parent + +extern __typeof (g_type_qname) IA__g_type_qname __attribute((visibility("hidden"))); +#define g_type_qname IA__g_type_qname + +extern __typeof (g_type_query) IA__g_type_query __attribute((visibility("hidden"))); +#define g_type_query IA__g_type_query + +extern __typeof (g_type_register_dynamic) IA__g_type_register_dynamic __attribute((visibility("hidden"))); +#define g_type_register_dynamic IA__g_type_register_dynamic + +extern __typeof (g_type_register_fundamental) IA__g_type_register_fundamental __attribute((visibility("hidden"))); +#define g_type_register_fundamental IA__g_type_register_fundamental + +extern __typeof (g_type_register_static) IA__g_type_register_static __attribute((visibility("hidden"))); +#define g_type_register_static IA__g_type_register_static + +extern __typeof (g_type_register_static_simple) IA__g_type_register_static_simple __attribute((visibility("hidden"))); +#define g_type_register_static_simple IA__g_type_register_static_simple + +extern __typeof (g_type_remove_class_cache_func) IA__g_type_remove_class_cache_func __attribute((visibility("hidden"))); +#define g_type_remove_class_cache_func IA__g_type_remove_class_cache_func + +extern __typeof (g_type_remove_interface_check) IA__g_type_remove_interface_check __attribute((visibility("hidden"))); +#define g_type_remove_interface_check IA__g_type_remove_interface_check + +extern __typeof (g_type_set_qdata) IA__g_type_set_qdata __attribute((visibility("hidden"))); +#define g_type_set_qdata IA__g_type_set_qdata + +extern __typeof (g_type_test_flags) IA__g_type_test_flags __attribute((visibility("hidden"))); +#define g_type_test_flags IA__g_type_test_flags + +extern __typeof (g_type_value_table_peek) IA__g_type_value_table_peek __attribute((visibility("hidden"))); +#define g_type_value_table_peek IA__g_type_value_table_peek + +extern __typeof (g_type_class_get_private) IA__g_type_class_get_private __attribute((visibility("hidden"))); +#define g_type_class_get_private IA__g_type_class_get_private + +extern __typeof (g_type_add_class_private) IA__g_type_add_class_private __attribute((visibility("hidden"))); +#define g_type_add_class_private IA__g_type_add_class_private + +#endif +#endif +#if IN_HEADER(__G_TYPE_MODULE_H__) +#if IN_FILE(__G_TYPE_MODULE_C__) +extern __typeof (g_type_module_add_interface) IA__g_type_module_add_interface __attribute((visibility("hidden"))); +#define g_type_module_add_interface IA__g_type_module_add_interface + +extern __typeof (g_type_module_get_type) IA__g_type_module_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_type_module_get_type IA__g_type_module_get_type + +extern __typeof (g_type_module_register_enum) IA__g_type_module_register_enum __attribute((visibility("hidden"))); +#define g_type_module_register_enum IA__g_type_module_register_enum + +extern __typeof (g_type_module_register_flags) IA__g_type_module_register_flags __attribute((visibility("hidden"))); +#define g_type_module_register_flags IA__g_type_module_register_flags + +extern __typeof (g_type_module_register_type) IA__g_type_module_register_type __attribute((visibility("hidden"))); +#define g_type_module_register_type IA__g_type_module_register_type + +extern __typeof (g_type_module_set_name) IA__g_type_module_set_name __attribute((visibility("hidden"))); +#define g_type_module_set_name IA__g_type_module_set_name + +extern __typeof (g_type_module_unuse) IA__g_type_module_unuse __attribute((visibility("hidden"))); +#define g_type_module_unuse IA__g_type_module_unuse + +extern __typeof (g_type_module_use) IA__g_type_module_use __attribute((visibility("hidden"))); +#define g_type_module_use IA__g_type_module_use + +#endif +#endif +#if IN_HEADER(__G_VALUE_ARRAY_H__) +#if IN_FILE(__G_VALUE_ARRAY_C__) +extern __typeof (g_value_array_append) IA__g_value_array_append __attribute((visibility("hidden"))); +#define g_value_array_append IA__g_value_array_append + +extern __typeof (g_value_array_copy) IA__g_value_array_copy __attribute((visibility("hidden"))); +#define g_value_array_copy IA__g_value_array_copy + +extern __typeof (g_value_array_free) IA__g_value_array_free __attribute((visibility("hidden"))); +#define g_value_array_free IA__g_value_array_free + +extern __typeof (g_value_array_get_nth) IA__g_value_array_get_nth __attribute((visibility("hidden"))); +#define g_value_array_get_nth IA__g_value_array_get_nth + +extern __typeof (g_value_array_insert) IA__g_value_array_insert __attribute((visibility("hidden"))); +#define g_value_array_insert IA__g_value_array_insert + +extern __typeof (g_value_array_new) IA__g_value_array_new __attribute((visibility("hidden"))); +#define g_value_array_new IA__g_value_array_new + +extern __typeof (g_value_array_prepend) IA__g_value_array_prepend __attribute((visibility("hidden"))); +#define g_value_array_prepend IA__g_value_array_prepend + +extern __typeof (g_value_array_remove) IA__g_value_array_remove __attribute((visibility("hidden"))); +#define g_value_array_remove IA__g_value_array_remove + +extern __typeof (g_value_array_sort) IA__g_value_array_sort __attribute((visibility("hidden"))); +#define g_value_array_sort IA__g_value_array_sort + +extern __typeof (g_value_array_sort_with_data) IA__g_value_array_sort_with_data __attribute((visibility("hidden"))); +#define g_value_array_sort_with_data IA__g_value_array_sort_with_data + +#endif +#endif +#if IN_HEADER(__G_TYPE_PLUGIN_H__) +#if IN_FILE(__G_TYPE_PLUGIN_C__) +extern __typeof (g_type_plugin_complete_interface_info) IA__g_type_plugin_complete_interface_info __attribute((visibility("hidden"))); +#define g_type_plugin_complete_interface_info IA__g_type_plugin_complete_interface_info + +extern __typeof (g_type_plugin_complete_type_info) IA__g_type_plugin_complete_type_info __attribute((visibility("hidden"))); +#define g_type_plugin_complete_type_info IA__g_type_plugin_complete_type_info + +extern __typeof (g_type_plugin_get_type) IA__g_type_plugin_get_type __attribute((visibility("hidden"))) G_GNUC_CONST; +#define g_type_plugin_get_type IA__g_type_plugin_get_type + +extern __typeof (g_type_plugin_unuse) IA__g_type_plugin_unuse __attribute((visibility("hidden"))); +#define g_type_plugin_unuse IA__g_type_plugin_unuse + +extern __typeof (g_type_plugin_use) IA__g_type_plugin_use __attribute((visibility("hidden"))); +#define g_type_plugin_use IA__g_type_plugin_use + +#endif +#endif +#if IN_HEADER(__G_VALUE_H__) +#if IN_FILE(__G_VALUE_C__) +extern __typeof (g_value_copy) IA__g_value_copy __attribute((visibility("hidden"))); +#define g_value_copy IA__g_value_copy + +extern __typeof (g_value_fits_pointer) IA__g_value_fits_pointer __attribute((visibility("hidden"))); +#define g_value_fits_pointer IA__g_value_fits_pointer + +extern __typeof (g_value_init) IA__g_value_init __attribute((visibility("hidden"))); +#define g_value_init IA__g_value_init + +extern __typeof (g_value_peek_pointer) IA__g_value_peek_pointer __attribute((visibility("hidden"))); +#define g_value_peek_pointer IA__g_value_peek_pointer + +extern __typeof (g_value_register_transform_func) IA__g_value_register_transform_func __attribute((visibility("hidden"))); +#define g_value_register_transform_func IA__g_value_register_transform_func + +extern __typeof (g_value_reset) IA__g_value_reset __attribute((visibility("hidden"))); +#define g_value_reset IA__g_value_reset + +extern __typeof (g_value_transform) IA__g_value_transform __attribute((visibility("hidden"))); +#define g_value_transform IA__g_value_transform + +extern __typeof (g_value_type_compatible) IA__g_value_type_compatible __attribute((visibility("hidden"))); +#define g_value_type_compatible IA__g_value_type_compatible + +extern __typeof (g_value_type_transformable) IA__g_value_type_transformable __attribute((visibility("hidden"))); +#define g_value_type_transformable IA__g_value_type_transformable + +extern __typeof (g_value_unset) IA__g_value_unset __attribute((visibility("hidden"))); +#define g_value_unset IA__g_value_unset + +extern __typeof (g_value_set_instance) IA__g_value_set_instance __attribute((visibility("hidden"))); +#define g_value_set_instance IA__g_value_set_instance + +#endif +#endif + +#endif /* G_HAVE_GNUC_VISIBILITY */ +#endif /* DISABLE_VISIBILITY */ diff --git a/gobject/gobjectaliasdef.c b/gobject/gobjectaliasdef.c new file mode 100644 index 0000000..9fd1f17 --- /dev/null +++ b/gobject/gobjectaliasdef.c @@ -0,0 +1,1120 @@ +/* Generated by makegobjectalias.pl */ + +#ifndef DISABLE_VISIBILITY + +#include "glibconfig.h" + +#ifdef G_HAVE_GNUC_VISIBILITY + +#undef IN_FILE +#define IN_FILE defined + +#undef IN_HEADER +#define IN_HEADER(x) 1 + +#if IN_HEADER(__G_BOXED_H__) +#if IN_FILE(__G_BOXED_C__) +#undef g_boxed_copy +extern __typeof (g_boxed_copy) g_boxed_copy __attribute((alias("IA__g_boxed_copy"), visibility("default"))); + +#undef g_boxed_free +extern __typeof (g_boxed_free) g_boxed_free __attribute((alias("IA__g_boxed_free"), visibility("default"))); + +#undef g_boxed_type_register_static +extern __typeof (g_boxed_type_register_static) g_boxed_type_register_static __attribute((alias("IA__g_boxed_type_register_static"), visibility("default"))); + +#undef g_date_get_type +extern __typeof (g_date_get_type) g_date_get_type __attribute((alias("IA__g_date_get_type"), visibility("default"))); + +#undef g_gstring_get_type +extern __typeof (g_gstring_get_type) g_gstring_get_type __attribute((alias("IA__g_gstring_get_type"), visibility("default"))); + +#undef g_strv_get_type +extern __typeof (g_strv_get_type) g_strv_get_type __attribute((alias("IA__g_strv_get_type"), visibility("default"))); + +#undef g_hash_table_get_type +extern __typeof (g_hash_table_get_type) g_hash_table_get_type __attribute((alias("IA__g_hash_table_get_type"), visibility("default"))); + +#undef g_array_get_type +extern __typeof (g_array_get_type) g_array_get_type __attribute((alias("IA__g_array_get_type"), visibility("default"))); + +#undef g_byte_array_get_type +extern __typeof (g_byte_array_get_type) g_byte_array_get_type __attribute((alias("IA__g_byte_array_get_type"), visibility("default"))); + +#undef g_ptr_array_get_type +extern __typeof (g_ptr_array_get_type) g_ptr_array_get_type __attribute((alias("IA__g_ptr_array_get_type"), visibility("default"))); + +#undef g_regex_get_type +extern __typeof (g_regex_get_type) g_regex_get_type __attribute((alias("IA__g_regex_get_type"), visibility("default"))); + +#undef g_variant_type_get_gtype +extern __typeof (g_variant_type_get_gtype) g_variant_type_get_gtype __attribute((alias("IA__g_variant_type_get_gtype"), visibility("default"))); + +#undef g_variant_get_gtype +extern __typeof (g_variant_get_gtype) g_variant_get_gtype __attribute((alias("IA__g_variant_get_gtype"), visibility("default"))); + +#undef g_closure_get_type +extern __typeof (g_closure_get_type) g_closure_get_type __attribute((alias("IA__g_closure_get_type"), visibility("default"))); + +#undef g_value_get_type +extern __typeof (g_value_get_type) g_value_get_type __attribute((alias("IA__g_value_get_type"), visibility("default"))); + +#undef g_value_array_get_type +extern __typeof (g_value_array_get_type) g_value_array_get_type __attribute((alias("IA__g_value_array_get_type"), visibility("default"))); + +#undef g_value_set_boxed +extern __typeof (g_value_set_boxed) g_value_set_boxed __attribute((alias("IA__g_value_set_boxed"), visibility("default"))); + +#undef g_value_take_boxed +extern __typeof (g_value_take_boxed) g_value_take_boxed __attribute((alias("IA__g_value_take_boxed"), visibility("default"))); + +#undef g_value_dup_boxed +extern __typeof (g_value_dup_boxed) g_value_dup_boxed __attribute((alias("IA__g_value_dup_boxed"), visibility("default"))); + +#undef g_value_get_boxed +extern __typeof (g_value_get_boxed) g_value_get_boxed __attribute((alias("IA__g_value_get_boxed"), visibility("default"))); + +#undef g_value_set_static_boxed +extern __typeof (g_value_set_static_boxed) g_value_set_static_boxed __attribute((alias("IA__g_value_set_static_boxed"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_value_set_boxed_take_ownership +extern __typeof (g_value_set_boxed_take_ownership) g_value_set_boxed_take_ownership __attribute((alias("IA__g_value_set_boxed_take_ownership"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_MARSHAL_H__) +#if IN_FILE(__G_SIGNAL_C__) +#undef g_cclosure_marshal_BOOLEAN__FLAGS +extern __typeof (g_cclosure_marshal_BOOLEAN__FLAGS) g_cclosure_marshal_BOOLEAN__FLAGS __attribute((alias("IA__g_cclosure_marshal_BOOLEAN__FLAGS"), visibility("default"))); + +#undef g_cclosure_marshal_STRING__OBJECT_POINTER +extern __typeof (g_cclosure_marshal_STRING__OBJECT_POINTER) g_cclosure_marshal_STRING__OBJECT_POINTER __attribute((alias("IA__g_cclosure_marshal_STRING__OBJECT_POINTER"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__BOOLEAN +extern __typeof (g_cclosure_marshal_VOID__BOOLEAN) g_cclosure_marshal_VOID__BOOLEAN __attribute((alias("IA__g_cclosure_marshal_VOID__BOOLEAN"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__BOXED +extern __typeof (g_cclosure_marshal_VOID__BOXED) g_cclosure_marshal_VOID__BOXED __attribute((alias("IA__g_cclosure_marshal_VOID__BOXED"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__CHAR +extern __typeof (g_cclosure_marshal_VOID__CHAR) g_cclosure_marshal_VOID__CHAR __attribute((alias("IA__g_cclosure_marshal_VOID__CHAR"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__DOUBLE +extern __typeof (g_cclosure_marshal_VOID__DOUBLE) g_cclosure_marshal_VOID__DOUBLE __attribute((alias("IA__g_cclosure_marshal_VOID__DOUBLE"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__ENUM +extern __typeof (g_cclosure_marshal_VOID__ENUM) g_cclosure_marshal_VOID__ENUM __attribute((alias("IA__g_cclosure_marshal_VOID__ENUM"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__FLAGS +extern __typeof (g_cclosure_marshal_VOID__FLAGS) g_cclosure_marshal_VOID__FLAGS __attribute((alias("IA__g_cclosure_marshal_VOID__FLAGS"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__FLOAT +extern __typeof (g_cclosure_marshal_VOID__FLOAT) g_cclosure_marshal_VOID__FLOAT __attribute((alias("IA__g_cclosure_marshal_VOID__FLOAT"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__INT +extern __typeof (g_cclosure_marshal_VOID__INT) g_cclosure_marshal_VOID__INT __attribute((alias("IA__g_cclosure_marshal_VOID__INT"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__LONG +extern __typeof (g_cclosure_marshal_VOID__LONG) g_cclosure_marshal_VOID__LONG __attribute((alias("IA__g_cclosure_marshal_VOID__LONG"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__OBJECT +extern __typeof (g_cclosure_marshal_VOID__OBJECT) g_cclosure_marshal_VOID__OBJECT __attribute((alias("IA__g_cclosure_marshal_VOID__OBJECT"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__PARAM +extern __typeof (g_cclosure_marshal_VOID__PARAM) g_cclosure_marshal_VOID__PARAM __attribute((alias("IA__g_cclosure_marshal_VOID__PARAM"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__POINTER +extern __typeof (g_cclosure_marshal_VOID__POINTER) g_cclosure_marshal_VOID__POINTER __attribute((alias("IA__g_cclosure_marshal_VOID__POINTER"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__STRING +extern __typeof (g_cclosure_marshal_VOID__STRING) g_cclosure_marshal_VOID__STRING __attribute((alias("IA__g_cclosure_marshal_VOID__STRING"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__UCHAR +extern __typeof (g_cclosure_marshal_VOID__UCHAR) g_cclosure_marshal_VOID__UCHAR __attribute((alias("IA__g_cclosure_marshal_VOID__UCHAR"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__UINT +extern __typeof (g_cclosure_marshal_VOID__UINT) g_cclosure_marshal_VOID__UINT __attribute((alias("IA__g_cclosure_marshal_VOID__UINT"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__UINT_POINTER +extern __typeof (g_cclosure_marshal_VOID__UINT_POINTER) g_cclosure_marshal_VOID__UINT_POINTER __attribute((alias("IA__g_cclosure_marshal_VOID__UINT_POINTER"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__ULONG +extern __typeof (g_cclosure_marshal_VOID__ULONG) g_cclosure_marshal_VOID__ULONG __attribute((alias("IA__g_cclosure_marshal_VOID__ULONG"), visibility("default"))); + +#undef g_cclosure_marshal_VOID__VOID +extern __typeof (g_cclosure_marshal_VOID__VOID) g_cclosure_marshal_VOID__VOID __attribute((alias("IA__g_cclosure_marshal_VOID__VOID"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_CLOSURE_H__) +#if IN_FILE(__G_CLOSURE_C__) +#undef g_cclosure_new +extern __typeof (g_cclosure_new) g_cclosure_new __attribute((alias("IA__g_cclosure_new"), visibility("default"))); + +#undef g_cclosure_new_swap +extern __typeof (g_cclosure_new_swap) g_cclosure_new_swap __attribute((alias("IA__g_cclosure_new_swap"), visibility("default"))); + +#undef g_closure_add_finalize_notifier +extern __typeof (g_closure_add_finalize_notifier) g_closure_add_finalize_notifier __attribute((alias("IA__g_closure_add_finalize_notifier"), visibility("default"))); + +#undef g_closure_add_invalidate_notifier +extern __typeof (g_closure_add_invalidate_notifier) g_closure_add_invalidate_notifier __attribute((alias("IA__g_closure_add_invalidate_notifier"), visibility("default"))); + +#undef g_closure_add_marshal_guards +extern __typeof (g_closure_add_marshal_guards) g_closure_add_marshal_guards __attribute((alias("IA__g_closure_add_marshal_guards"), visibility("default"))); + +#undef g_closure_invalidate +extern __typeof (g_closure_invalidate) g_closure_invalidate __attribute((alias("IA__g_closure_invalidate"), visibility("default"))); + +#undef g_closure_invoke +extern __typeof (g_closure_invoke) g_closure_invoke __attribute((alias("IA__g_closure_invoke"), visibility("default"))); + +#undef g_closure_new_simple +extern __typeof (g_closure_new_simple) g_closure_new_simple __attribute((alias("IA__g_closure_new_simple"), visibility("default"))); + +#undef g_closure_ref +extern __typeof (g_closure_ref) g_closure_ref __attribute((alias("IA__g_closure_ref"), visibility("default"))); + +#undef g_closure_remove_finalize_notifier +extern __typeof (g_closure_remove_finalize_notifier) g_closure_remove_finalize_notifier __attribute((alias("IA__g_closure_remove_finalize_notifier"), visibility("default"))); + +#undef g_closure_remove_invalidate_notifier +extern __typeof (g_closure_remove_invalidate_notifier) g_closure_remove_invalidate_notifier __attribute((alias("IA__g_closure_remove_invalidate_notifier"), visibility("default"))); + +#undef g_closure_set_marshal +extern __typeof (g_closure_set_marshal) g_closure_set_marshal __attribute((alias("IA__g_closure_set_marshal"), visibility("default"))); + +#undef g_closure_set_meta_marshal +extern __typeof (g_closure_set_meta_marshal) g_closure_set_meta_marshal __attribute((alias("IA__g_closure_set_meta_marshal"), visibility("default"))); + +#undef g_closure_sink +extern __typeof (g_closure_sink) g_closure_sink __attribute((alias("IA__g_closure_sink"), visibility("default"))); + +#undef g_closure_unref +extern __typeof (g_closure_unref) g_closure_unref __attribute((alias("IA__g_closure_unref"), visibility("default"))); + +#undef g_signal_type_cclosure_new +extern __typeof (g_signal_type_cclosure_new) g_signal_type_cclosure_new __attribute((alias("IA__g_signal_type_cclosure_new"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_ENUMS_H__) +#if IN_FILE(__G_ENUMS_C__) +#undef g_enum_complete_type_info +extern __typeof (g_enum_complete_type_info) g_enum_complete_type_info __attribute((alias("IA__g_enum_complete_type_info"), visibility("default"))); + +#undef g_enum_get_value +extern __typeof (g_enum_get_value) g_enum_get_value __attribute((alias("IA__g_enum_get_value"), visibility("default"))); + +#undef g_enum_get_value_by_name +extern __typeof (g_enum_get_value_by_name) g_enum_get_value_by_name __attribute((alias("IA__g_enum_get_value_by_name"), visibility("default"))); + +#undef g_enum_get_value_by_nick +extern __typeof (g_enum_get_value_by_nick) g_enum_get_value_by_nick __attribute((alias("IA__g_enum_get_value_by_nick"), visibility("default"))); + +#undef g_enum_register_static +extern __typeof (g_enum_register_static) g_enum_register_static __attribute((alias("IA__g_enum_register_static"), visibility("default"))); + +#undef g_flags_complete_type_info +extern __typeof (g_flags_complete_type_info) g_flags_complete_type_info __attribute((alias("IA__g_flags_complete_type_info"), visibility("default"))); + +#undef g_flags_get_first_value +extern __typeof (g_flags_get_first_value) g_flags_get_first_value __attribute((alias("IA__g_flags_get_first_value"), visibility("default"))); + +#undef g_flags_get_value_by_name +extern __typeof (g_flags_get_value_by_name) g_flags_get_value_by_name __attribute((alias("IA__g_flags_get_value_by_name"), visibility("default"))); + +#undef g_flags_get_value_by_nick +extern __typeof (g_flags_get_value_by_nick) g_flags_get_value_by_nick __attribute((alias("IA__g_flags_get_value_by_nick"), visibility("default"))); + +#undef g_flags_register_static +extern __typeof (g_flags_register_static) g_flags_register_static __attribute((alias("IA__g_flags_register_static"), visibility("default"))); + +#undef g_value_set_enum +extern __typeof (g_value_set_enum) g_value_set_enum __attribute((alias("IA__g_value_set_enum"), visibility("default"))); + +#undef g_value_set_flags +extern __typeof (g_value_set_flags) g_value_set_flags __attribute((alias("IA__g_value_set_flags"), visibility("default"))); + +#undef g_value_get_enum +extern __typeof (g_value_get_enum) g_value_get_enum __attribute((alias("IA__g_value_get_enum"), visibility("default"))); + +#undef g_value_get_flags +extern __typeof (g_value_get_flags) g_value_get_flags __attribute((alias("IA__g_value_get_flags"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SOURCECLOSURE_H__) +#if IN_FILE(__G_SOURCECLOSURE_C__) +#undef g_io_channel_get_type +extern __typeof (g_io_channel_get_type) g_io_channel_get_type __attribute((alias("IA__g_io_channel_get_type"), visibility("default"))); + +#undef g_io_condition_get_type +extern __typeof (g_io_condition_get_type) g_io_condition_get_type __attribute((alias("IA__g_io_condition_get_type"), visibility("default"))); + +#undef g_source_set_closure +extern __typeof (g_source_set_closure) g_source_set_closure __attribute((alias("IA__g_source_set_closure"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_OBJECT_H__) +#if IN_FILE(__G_OBJECT_C__) +#undef g_cclosure_new_object +extern __typeof (g_cclosure_new_object) g_cclosure_new_object __attribute((alias("IA__g_cclosure_new_object"), visibility("default"))); + +#undef g_cclosure_new_object_swap +extern __typeof (g_cclosure_new_object_swap) g_cclosure_new_object_swap __attribute((alias("IA__g_cclosure_new_object_swap"), visibility("default"))); + +#undef g_closure_new_object +extern __typeof (g_closure_new_object) g_closure_new_object __attribute((alias("IA__g_closure_new_object"), visibility("default"))); + +#undef g_initially_unowned_get_type +extern __typeof (g_initially_unowned_get_type) g_initially_unowned_get_type __attribute((alias("IA__g_initially_unowned_get_type"), visibility("default"))); + +#undef g_object_add_weak_pointer +extern __typeof (g_object_add_weak_pointer) g_object_add_weak_pointer __attribute((alias("IA__g_object_add_weak_pointer"), visibility("default"))); + +#undef g_object_class_find_property +extern __typeof (g_object_class_find_property) g_object_class_find_property __attribute((alias("IA__g_object_class_find_property"), visibility("default"))); + +#undef g_object_class_install_property +extern __typeof (g_object_class_install_property) g_object_class_install_property __attribute((alias("IA__g_object_class_install_property"), visibility("default"))); + +#undef g_object_class_list_properties +extern __typeof (g_object_class_list_properties) g_object_class_list_properties __attribute((alias("IA__g_object_class_list_properties"), visibility("default"))); + +#undef g_object_class_override_property +extern __typeof (g_object_class_override_property) g_object_class_override_property __attribute((alias("IA__g_object_class_override_property"), visibility("default"))); + +#undef g_object_connect +extern __typeof (g_object_connect) g_object_connect __attribute((alias("IA__g_object_connect"), visibility("default"))); + +#undef g_object_disconnect +extern __typeof (g_object_disconnect) g_object_disconnect __attribute((alias("IA__g_object_disconnect"), visibility("default"))); + +#undef g_object_freeze_notify +extern __typeof (g_object_freeze_notify) g_object_freeze_notify __attribute((alias("IA__g_object_freeze_notify"), visibility("default"))); + +#undef g_object_get +extern __typeof (g_object_get) g_object_get __attribute((alias("IA__g_object_get"), visibility("default"))); + +#undef g_object_get_data +extern __typeof (g_object_get_data) g_object_get_data __attribute((alias("IA__g_object_get_data"), visibility("default"))); + +#undef g_object_get_property +extern __typeof (g_object_get_property) g_object_get_property __attribute((alias("IA__g_object_get_property"), visibility("default"))); + +#undef g_object_get_qdata +extern __typeof (g_object_get_qdata) g_object_get_qdata __attribute((alias("IA__g_object_get_qdata"), visibility("default"))); + +#undef g_object_get_type +extern __typeof (g_object_get_type) g_object_get_type __attribute((alias("IA__g_object_get_type"), visibility("default"))); + +#undef g_object_get_valist +extern __typeof (g_object_get_valist) g_object_get_valist __attribute((alias("IA__g_object_get_valist"), visibility("default"))); + +#undef g_object_interface_find_property +extern __typeof (g_object_interface_find_property) g_object_interface_find_property __attribute((alias("IA__g_object_interface_find_property"), visibility("default"))); + +#undef g_object_interface_install_property +extern __typeof (g_object_interface_install_property) g_object_interface_install_property __attribute((alias("IA__g_object_interface_install_property"), visibility("default"))); + +#undef g_object_interface_list_properties +extern __typeof (g_object_interface_list_properties) g_object_interface_list_properties __attribute((alias("IA__g_object_interface_list_properties"), visibility("default"))); + +#undef g_object_new +extern __typeof (g_object_new) g_object_new __attribute((alias("IA__g_object_new"), visibility("default"))); + +#undef g_object_newv +extern __typeof (g_object_newv) g_object_newv __attribute((alias("IA__g_object_newv"), visibility("default"))); + +#undef g_object_new_valist +extern __typeof (g_object_new_valist) g_object_new_valist __attribute((alias("IA__g_object_new_valist"), visibility("default"))); + +#undef g_object_notify +extern __typeof (g_object_notify) g_object_notify __attribute((alias("IA__g_object_notify"), visibility("default"))); + +#undef g_object_is_floating +extern __typeof (g_object_is_floating) g_object_is_floating __attribute((alias("IA__g_object_is_floating"), visibility("default"))); + +#undef g_object_ref_sink +extern __typeof (g_object_ref_sink) g_object_ref_sink __attribute((alias("IA__g_object_ref_sink"), visibility("default"))); + +#undef g_object_force_floating +extern __typeof (g_object_force_floating) g_object_force_floating __attribute((alias("IA__g_object_force_floating"), visibility("default"))); + +#undef g_object_ref +extern __typeof (g_object_ref) g_object_ref __attribute((alias("IA__g_object_ref"), visibility("default"))); + +#undef g_object_unref +extern __typeof (g_object_unref) g_object_unref __attribute((alias("IA__g_object_unref"), visibility("default"))); + +#undef g_object_remove_weak_pointer +extern __typeof (g_object_remove_weak_pointer) g_object_remove_weak_pointer __attribute((alias("IA__g_object_remove_weak_pointer"), visibility("default"))); + +#undef g_object_run_dispose +extern __typeof (g_object_run_dispose) g_object_run_dispose __attribute((alias("IA__g_object_run_dispose"), visibility("default"))); + +#undef g_object_set +extern __typeof (g_object_set) g_object_set __attribute((alias("IA__g_object_set"), visibility("default"))); + +#undef g_object_set_data +extern __typeof (g_object_set_data) g_object_set_data __attribute((alias("IA__g_object_set_data"), visibility("default"))); + +#undef g_object_set_data_full +extern __typeof (g_object_set_data_full) g_object_set_data_full __attribute((alias("IA__g_object_set_data_full"), visibility("default"))); + +#undef g_object_set_property +extern __typeof (g_object_set_property) g_object_set_property __attribute((alias("IA__g_object_set_property"), visibility("default"))); + +#undef g_object_set_qdata +extern __typeof (g_object_set_qdata) g_object_set_qdata __attribute((alias("IA__g_object_set_qdata"), visibility("default"))); + +#undef g_object_set_qdata_full +extern __typeof (g_object_set_qdata_full) g_object_set_qdata_full __attribute((alias("IA__g_object_set_qdata_full"), visibility("default"))); + +#undef g_object_set_valist +extern __typeof (g_object_set_valist) g_object_set_valist __attribute((alias("IA__g_object_set_valist"), visibility("default"))); + +#undef g_object_steal_data +extern __typeof (g_object_steal_data) g_object_steal_data __attribute((alias("IA__g_object_steal_data"), visibility("default"))); + +#undef g_object_steal_qdata +extern __typeof (g_object_steal_qdata) g_object_steal_qdata __attribute((alias("IA__g_object_steal_qdata"), visibility("default"))); + +#undef g_object_thaw_notify +extern __typeof (g_object_thaw_notify) g_object_thaw_notify __attribute((alias("IA__g_object_thaw_notify"), visibility("default"))); + +#undef g_object_watch_closure +extern __typeof (g_object_watch_closure) g_object_watch_closure __attribute((alias("IA__g_object_watch_closure"), visibility("default"))); + +#undef g_object_weak_ref +extern __typeof (g_object_weak_ref) g_object_weak_ref __attribute((alias("IA__g_object_weak_ref"), visibility("default"))); + +#undef g_object_weak_unref +extern __typeof (g_object_weak_unref) g_object_weak_unref __attribute((alias("IA__g_object_weak_unref"), visibility("default"))); + +#undef g_object_add_toggle_ref +extern __typeof (g_object_add_toggle_ref) g_object_add_toggle_ref __attribute((alias("IA__g_object_add_toggle_ref"), visibility("default"))); + +#undef g_object_remove_toggle_ref +extern __typeof (g_object_remove_toggle_ref) g_object_remove_toggle_ref __attribute((alias("IA__g_object_remove_toggle_ref"), visibility("default"))); + +#undef g_value_get_object +extern __typeof (g_value_get_object) g_value_get_object __attribute((alias("IA__g_value_get_object"), visibility("default"))); + +#undef g_value_set_object +extern __typeof (g_value_set_object) g_value_set_object __attribute((alias("IA__g_value_set_object"), visibility("default"))); + +#undef g_value_dup_object +extern __typeof (g_value_dup_object) g_value_dup_object __attribute((alias("IA__g_value_dup_object"), visibility("default"))); + +#undef g_value_take_object +extern __typeof (g_value_take_object) g_value_take_object __attribute((alias("IA__g_value_take_object"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_value_set_object_take_ownership +extern __typeof (g_value_set_object_take_ownership) g_value_set_object_take_ownership __attribute((alias("IA__g_value_set_object_take_ownership"), visibility("default"))); + +#undef g_object_compat_control +extern __typeof (g_object_compat_control) g_object_compat_control __attribute((alias("IA__g_object_compat_control"), visibility("default"))); + +#endif +#undef g_signal_connect_object +extern __typeof (g_signal_connect_object) g_signal_connect_object __attribute((alias("IA__g_signal_connect_object"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_PARAMSPECS_H__) +#if IN_FILE(__G_PARAMSPECS_C__) +#undef g_param_spec_boolean +extern __typeof (g_param_spec_boolean) g_param_spec_boolean __attribute((alias("IA__g_param_spec_boolean"), visibility("default"))); + +#undef g_param_spec_boxed +extern __typeof (g_param_spec_boxed) g_param_spec_boxed __attribute((alias("IA__g_param_spec_boxed"), visibility("default"))); + +#undef g_param_spec_char +extern __typeof (g_param_spec_char) g_param_spec_char __attribute((alias("IA__g_param_spec_char"), visibility("default"))); + +#undef g_param_spec_double +extern __typeof (g_param_spec_double) g_param_spec_double __attribute((alias("IA__g_param_spec_double"), visibility("default"))); + +#undef g_param_spec_enum +extern __typeof (g_param_spec_enum) g_param_spec_enum __attribute((alias("IA__g_param_spec_enum"), visibility("default"))); + +#undef g_param_spec_flags +extern __typeof (g_param_spec_flags) g_param_spec_flags __attribute((alias("IA__g_param_spec_flags"), visibility("default"))); + +#undef g_param_spec_float +extern __typeof (g_param_spec_float) g_param_spec_float __attribute((alias("IA__g_param_spec_float"), visibility("default"))); + +#undef g_param_spec_int +extern __typeof (g_param_spec_int) g_param_spec_int __attribute((alias("IA__g_param_spec_int"), visibility("default"))); + +#undef g_param_spec_int64 +extern __typeof (g_param_spec_int64) g_param_spec_int64 __attribute((alias("IA__g_param_spec_int64"), visibility("default"))); + +#undef g_param_spec_long +extern __typeof (g_param_spec_long) g_param_spec_long __attribute((alias("IA__g_param_spec_long"), visibility("default"))); + +#undef g_param_spec_object +extern __typeof (g_param_spec_object) g_param_spec_object __attribute((alias("IA__g_param_spec_object"), visibility("default"))); + +#undef g_param_spec_override +extern __typeof (g_param_spec_override) g_param_spec_override __attribute((alias("IA__g_param_spec_override"), visibility("default"))); + +#undef g_param_spec_gtype +extern __typeof (g_param_spec_gtype) g_param_spec_gtype __attribute((alias("IA__g_param_spec_gtype"), visibility("default"))); + +#undef g_param_spec_param +extern __typeof (g_param_spec_param) g_param_spec_param __attribute((alias("IA__g_param_spec_param"), visibility("default"))); + +#undef g_param_spec_pointer +extern __typeof (g_param_spec_pointer) g_param_spec_pointer __attribute((alias("IA__g_param_spec_pointer"), visibility("default"))); + +#undef g_param_spec_string +extern __typeof (g_param_spec_string) g_param_spec_string __attribute((alias("IA__g_param_spec_string"), visibility("default"))); + +#undef g_param_spec_uchar +extern __typeof (g_param_spec_uchar) g_param_spec_uchar __attribute((alias("IA__g_param_spec_uchar"), visibility("default"))); + +#undef g_param_spec_uint +extern __typeof (g_param_spec_uint) g_param_spec_uint __attribute((alias("IA__g_param_spec_uint"), visibility("default"))); + +#undef g_param_spec_uint64 +extern __typeof (g_param_spec_uint64) g_param_spec_uint64 __attribute((alias("IA__g_param_spec_uint64"), visibility("default"))); + +#undef g_param_spec_ulong +extern __typeof (g_param_spec_ulong) g_param_spec_ulong __attribute((alias("IA__g_param_spec_ulong"), visibility("default"))); + +#undef g_param_spec_unichar +extern __typeof (g_param_spec_unichar) g_param_spec_unichar __attribute((alias("IA__g_param_spec_unichar"), visibility("default"))); + +#undef g_param_spec_value_array +extern __typeof (g_param_spec_value_array) g_param_spec_value_array __attribute((alias("IA__g_param_spec_value_array"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_PARAM_H__) +#if IN_FILE(__G_PARAM_C__) +#undef g_param_spec_get_blurb +extern __typeof (g_param_spec_get_blurb) g_param_spec_get_blurb __attribute((alias("IA__g_param_spec_get_blurb"), visibility("default"))); + +#undef g_param_spec_get_name +extern __typeof (g_param_spec_get_name) g_param_spec_get_name __attribute((alias("IA__g_param_spec_get_name"), visibility("default"))); + +#undef g_param_spec_get_nick +extern __typeof (g_param_spec_get_nick) g_param_spec_get_nick __attribute((alias("IA__g_param_spec_get_nick"), visibility("default"))); + +#undef g_param_spec_get_redirect_target +extern __typeof (g_param_spec_get_redirect_target) g_param_spec_get_redirect_target __attribute((alias("IA__g_param_spec_get_redirect_target"), visibility("default"))); + +#undef g_param_spec_internal +extern __typeof (g_param_spec_internal) g_param_spec_internal __attribute((alias("IA__g_param_spec_internal"), visibility("default"))); + +#undef g_param_type_register_static +extern __typeof (g_param_type_register_static) g_param_type_register_static __attribute((alias("IA__g_param_type_register_static"), visibility("default"))); + +#undef g_param_spec_ref +extern __typeof (g_param_spec_ref) g_param_spec_ref __attribute((alias("IA__g_param_spec_ref"), visibility("default"))); + +#undef g_param_spec_ref_sink +extern __typeof (g_param_spec_ref_sink) g_param_spec_ref_sink __attribute((alias("IA__g_param_spec_ref_sink"), visibility("default"))); + +#undef g_param_spec_unref +extern __typeof (g_param_spec_unref) g_param_spec_unref __attribute((alias("IA__g_param_spec_unref"), visibility("default"))); + +#undef g_param_spec_sink +extern __typeof (g_param_spec_sink) g_param_spec_sink __attribute((alias("IA__g_param_spec_sink"), visibility("default"))); + +#undef g_param_spec_steal_qdata +extern __typeof (g_param_spec_steal_qdata) g_param_spec_steal_qdata __attribute((alias("IA__g_param_spec_steal_qdata"), visibility("default"))); + +#undef g_param_spec_set_qdata +extern __typeof (g_param_spec_set_qdata) g_param_spec_set_qdata __attribute((alias("IA__g_param_spec_set_qdata"), visibility("default"))); + +#undef g_param_spec_set_qdata_full +extern __typeof (g_param_spec_set_qdata_full) g_param_spec_set_qdata_full __attribute((alias("IA__g_param_spec_set_qdata_full"), visibility("default"))); + +#undef g_param_spec_get_qdata +extern __typeof (g_param_spec_get_qdata) g_param_spec_get_qdata __attribute((alias("IA__g_param_spec_get_qdata"), visibility("default"))); + +#undef g_param_value_convert +extern __typeof (g_param_value_convert) g_param_value_convert __attribute((alias("IA__g_param_value_convert"), visibility("default"))); + +#undef g_param_value_defaults +extern __typeof (g_param_value_defaults) g_param_value_defaults __attribute((alias("IA__g_param_value_defaults"), visibility("default"))); + +#undef g_param_values_cmp +extern __typeof (g_param_values_cmp) g_param_values_cmp __attribute((alias("IA__g_param_values_cmp"), visibility("default"))); + +#undef g_param_value_set_default +extern __typeof (g_param_value_set_default) g_param_value_set_default __attribute((alias("IA__g_param_value_set_default"), visibility("default"))); + +#undef g_param_value_validate +extern __typeof (g_param_value_validate) g_param_value_validate __attribute((alias("IA__g_param_value_validate"), visibility("default"))); + +#undef g_param_spec_pool_insert +extern __typeof (g_param_spec_pool_insert) g_param_spec_pool_insert __attribute((alias("IA__g_param_spec_pool_insert"), visibility("default"))); + +#undef g_param_spec_pool_list +extern __typeof (g_param_spec_pool_list) g_param_spec_pool_list __attribute((alias("IA__g_param_spec_pool_list"), visibility("default"))); + +#undef g_param_spec_pool_list_owned +extern __typeof (g_param_spec_pool_list_owned) g_param_spec_pool_list_owned __attribute((alias("IA__g_param_spec_pool_list_owned"), visibility("default"))); + +#undef g_param_spec_pool_lookup +extern __typeof (g_param_spec_pool_lookup) g_param_spec_pool_lookup __attribute((alias("IA__g_param_spec_pool_lookup"), visibility("default"))); + +#undef g_param_spec_pool_new +extern __typeof (g_param_spec_pool_new) g_param_spec_pool_new __attribute((alias("IA__g_param_spec_pool_new"), visibility("default"))); + +#undef g_param_spec_pool_remove +extern __typeof (g_param_spec_pool_remove) g_param_spec_pool_remove __attribute((alias("IA__g_param_spec_pool_remove"), visibility("default"))); + +#undef g_value_get_param +extern __typeof (g_value_get_param) g_value_get_param __attribute((alias("IA__g_value_get_param"), visibility("default"))); + +#undef g_value_set_param +extern __typeof (g_value_set_param) g_value_set_param __attribute((alias("IA__g_value_set_param"), visibility("default"))); + +#undef g_value_dup_param +extern __typeof (g_value_dup_param) g_value_dup_param __attribute((alias("IA__g_value_dup_param"), visibility("default"))); + +#undef g_value_take_param +extern __typeof (g_value_take_param) g_value_take_param __attribute((alias("IA__g_value_take_param"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_value_set_param_take_ownership +extern __typeof (g_value_set_param_take_ownership) g_value_set_param_take_ownership __attribute((alias("IA__g_value_set_param_take_ownership"), visibility("default"))); + +#endif +#endif +#endif +#if IN_HEADER(__G_VALUETYPES_H__) +#if IN_FILE(__G_VALUETYPES_C__) +#undef g_pointer_type_register_static +extern __typeof (g_pointer_type_register_static) g_pointer_type_register_static __attribute((alias("IA__g_pointer_type_register_static"), visibility("default"))); + +#undef g_strdup_value_contents +extern __typeof (g_strdup_value_contents) g_strdup_value_contents __attribute((alias("IA__g_strdup_value_contents"), visibility("default"))); + +#undef g_value_set_boolean +extern __typeof (g_value_set_boolean) g_value_set_boolean __attribute((alias("IA__g_value_set_boolean"), visibility("default"))); + +#undef g_value_set_char +extern __typeof (g_value_set_char) g_value_set_char __attribute((alias("IA__g_value_set_char"), visibility("default"))); + +#undef g_value_set_double +extern __typeof (g_value_set_double) g_value_set_double __attribute((alias("IA__g_value_set_double"), visibility("default"))); + +#undef g_value_set_float +extern __typeof (g_value_set_float) g_value_set_float __attribute((alias("IA__g_value_set_float"), visibility("default"))); + +#undef g_value_set_int +extern __typeof (g_value_set_int) g_value_set_int __attribute((alias("IA__g_value_set_int"), visibility("default"))); + +#undef g_value_set_int64 +extern __typeof (g_value_set_int64) g_value_set_int64 __attribute((alias("IA__g_value_set_int64"), visibility("default"))); + +#undef g_value_set_long +extern __typeof (g_value_set_long) g_value_set_long __attribute((alias("IA__g_value_set_long"), visibility("default"))); + +#undef g_value_set_pointer +extern __typeof (g_value_set_pointer) g_value_set_pointer __attribute((alias("IA__g_value_set_pointer"), visibility("default"))); + +#undef g_value_set_static_string +extern __typeof (g_value_set_static_string) g_value_set_static_string __attribute((alias("IA__g_value_set_static_string"), visibility("default"))); + +#undef g_value_set_string +extern __typeof (g_value_set_string) g_value_set_string __attribute((alias("IA__g_value_set_string"), visibility("default"))); + +#ifndef G_DISABLE_DEPRECATED +#undef g_value_set_string_take_ownership +extern __typeof (g_value_set_string_take_ownership) g_value_set_string_take_ownership __attribute((alias("IA__g_value_set_string_take_ownership"), visibility("default"))); + +#endif +#undef g_value_set_uchar +extern __typeof (g_value_set_uchar) g_value_set_uchar __attribute((alias("IA__g_value_set_uchar"), visibility("default"))); + +#undef g_value_set_uint +extern __typeof (g_value_set_uint) g_value_set_uint __attribute((alias("IA__g_value_set_uint"), visibility("default"))); + +#undef g_value_set_uint64 +extern __typeof (g_value_set_uint64) g_value_set_uint64 __attribute((alias("IA__g_value_set_uint64"), visibility("default"))); + +#undef g_value_set_ulong +extern __typeof (g_value_set_ulong) g_value_set_ulong __attribute((alias("IA__g_value_set_ulong"), visibility("default"))); + +#undef g_value_dup_string +extern __typeof (g_value_dup_string) g_value_dup_string __attribute((alias("IA__g_value_dup_string"), visibility("default"))); + +#undef g_value_get_boolean +extern __typeof (g_value_get_boolean) g_value_get_boolean __attribute((alias("IA__g_value_get_boolean"), visibility("default"))); + +#undef g_value_get_char +extern __typeof (g_value_get_char) g_value_get_char __attribute((alias("IA__g_value_get_char"), visibility("default"))); + +#undef g_value_get_double +extern __typeof (g_value_get_double) g_value_get_double __attribute((alias("IA__g_value_get_double"), visibility("default"))); + +#undef g_value_get_float +extern __typeof (g_value_get_float) g_value_get_float __attribute((alias("IA__g_value_get_float"), visibility("default"))); + +#undef g_value_get_int +extern __typeof (g_value_get_int) g_value_get_int __attribute((alias("IA__g_value_get_int"), visibility("default"))); + +#undef g_value_get_int64 +extern __typeof (g_value_get_int64) g_value_get_int64 __attribute((alias("IA__g_value_get_int64"), visibility("default"))); + +#undef g_value_get_long +extern __typeof (g_value_get_long) g_value_get_long __attribute((alias("IA__g_value_get_long"), visibility("default"))); + +#undef g_value_get_pointer +extern __typeof (g_value_get_pointer) g_value_get_pointer __attribute((alias("IA__g_value_get_pointer"), visibility("default"))); + +#undef g_value_get_string +extern __typeof (g_value_get_string) g_value_get_string __attribute((alias("IA__g_value_get_string"), visibility("default"))); + +#undef g_value_get_uchar +extern __typeof (g_value_get_uchar) g_value_get_uchar __attribute((alias("IA__g_value_get_uchar"), visibility("default"))); + +#undef g_value_get_uint +extern __typeof (g_value_get_uint) g_value_get_uint __attribute((alias("IA__g_value_get_uint"), visibility("default"))); + +#undef g_value_get_uint64 +extern __typeof (g_value_get_uint64) g_value_get_uint64 __attribute((alias("IA__g_value_get_uint64"), visibility("default"))); + +#undef g_value_get_ulong +extern __typeof (g_value_get_ulong) g_value_get_ulong __attribute((alias("IA__g_value_get_ulong"), visibility("default"))); + +#undef g_value_take_string +extern __typeof (g_value_take_string) g_value_take_string __attribute((alias("IA__g_value_take_string"), visibility("default"))); + +#undef g_gtype_get_type +extern __typeof (g_gtype_get_type) g_gtype_get_type __attribute((alias("IA__g_gtype_get_type"), visibility("default"))); + +#undef g_value_set_gtype +extern __typeof (g_value_set_gtype) g_value_set_gtype __attribute((alias("IA__g_value_set_gtype"), visibility("default"))); + +#undef g_value_get_gtype +extern __typeof (g_value_get_gtype) g_value_get_gtype __attribute((alias("IA__g_value_get_gtype"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_SIGNAL_H__) +#if IN_FILE(__G_SIGNAL_C__) +#undef g_signal_accumulator_true_handled +extern __typeof (g_signal_accumulator_true_handled) g_signal_accumulator_true_handled __attribute((alias("IA__g_signal_accumulator_true_handled"), visibility("default"))); + +#undef g_signal_add_emission_hook +extern __typeof (g_signal_add_emission_hook) g_signal_add_emission_hook __attribute((alias("IA__g_signal_add_emission_hook"), visibility("default"))); + +#undef g_signal_chain_from_overridden +extern __typeof (g_signal_chain_from_overridden) g_signal_chain_from_overridden __attribute((alias("IA__g_signal_chain_from_overridden"), visibility("default"))); + +#undef g_signal_chain_from_overridden_handler +extern __typeof (g_signal_chain_from_overridden_handler) g_signal_chain_from_overridden_handler __attribute((alias("IA__g_signal_chain_from_overridden_handler"), visibility("default"))); + +#undef g_signal_connect_closure +extern __typeof (g_signal_connect_closure) g_signal_connect_closure __attribute((alias("IA__g_signal_connect_closure"), visibility("default"))); + +#undef g_signal_connect_closure_by_id +extern __typeof (g_signal_connect_closure_by_id) g_signal_connect_closure_by_id __attribute((alias("IA__g_signal_connect_closure_by_id"), visibility("default"))); + +#undef g_signal_connect_data +extern __typeof (g_signal_connect_data) g_signal_connect_data __attribute((alias("IA__g_signal_connect_data"), visibility("default"))); + +#undef g_signal_emit +extern __typeof (g_signal_emit) g_signal_emit __attribute((alias("IA__g_signal_emit"), visibility("default"))); + +#undef g_signal_emit_by_name +extern __typeof (g_signal_emit_by_name) g_signal_emit_by_name __attribute((alias("IA__g_signal_emit_by_name"), visibility("default"))); + +#undef g_signal_emitv +extern __typeof (g_signal_emitv) g_signal_emitv __attribute((alias("IA__g_signal_emitv"), visibility("default"))); + +#undef g_signal_emit_valist +extern __typeof (g_signal_emit_valist) g_signal_emit_valist __attribute((alias("IA__g_signal_emit_valist"), visibility("default"))); + +#undef g_signal_get_invocation_hint +extern __typeof (g_signal_get_invocation_hint) g_signal_get_invocation_hint __attribute((alias("IA__g_signal_get_invocation_hint"), visibility("default"))); + +#undef g_signal_handler_block +extern __typeof (g_signal_handler_block) g_signal_handler_block __attribute((alias("IA__g_signal_handler_block"), visibility("default"))); + +#undef g_signal_handler_disconnect +extern __typeof (g_signal_handler_disconnect) g_signal_handler_disconnect __attribute((alias("IA__g_signal_handler_disconnect"), visibility("default"))); + +#undef g_signal_handler_find +extern __typeof (g_signal_handler_find) g_signal_handler_find __attribute((alias("IA__g_signal_handler_find"), visibility("default"))); + +#undef g_signal_handler_is_connected +extern __typeof (g_signal_handler_is_connected) g_signal_handler_is_connected __attribute((alias("IA__g_signal_handler_is_connected"), visibility("default"))); + +#undef g_signal_handlers_block_matched +extern __typeof (g_signal_handlers_block_matched) g_signal_handlers_block_matched __attribute((alias("IA__g_signal_handlers_block_matched"), visibility("default"))); + +#undef g_signal_handlers_destroy +extern __typeof (g_signal_handlers_destroy) g_signal_handlers_destroy __attribute((alias("IA__g_signal_handlers_destroy"), visibility("default"))); + +#undef g_signal_handlers_disconnect_matched +extern __typeof (g_signal_handlers_disconnect_matched) g_signal_handlers_disconnect_matched __attribute((alias("IA__g_signal_handlers_disconnect_matched"), visibility("default"))); + +#undef g_signal_handlers_unblock_matched +extern __typeof (g_signal_handlers_unblock_matched) g_signal_handlers_unblock_matched __attribute((alias("IA__g_signal_handlers_unblock_matched"), visibility("default"))); + +#undef g_signal_handler_unblock +extern __typeof (g_signal_handler_unblock) g_signal_handler_unblock __attribute((alias("IA__g_signal_handler_unblock"), visibility("default"))); + +#undef g_signal_has_handler_pending +extern __typeof (g_signal_has_handler_pending) g_signal_has_handler_pending __attribute((alias("IA__g_signal_has_handler_pending"), visibility("default"))); + +#undef g_signal_list_ids +extern __typeof (g_signal_list_ids) g_signal_list_ids __attribute((alias("IA__g_signal_list_ids"), visibility("default"))); + +#undef g_signal_lookup +extern __typeof (g_signal_lookup) g_signal_lookup __attribute((alias("IA__g_signal_lookup"), visibility("default"))); + +#undef g_signal_name +extern __typeof (g_signal_name) g_signal_name __attribute((alias("IA__g_signal_name"), visibility("default"))); + +#undef g_signal_new +extern __typeof (g_signal_new) g_signal_new __attribute((alias("IA__g_signal_new"), visibility("default"))); + +#undef g_signal_newv +extern __typeof (g_signal_newv) g_signal_newv __attribute((alias("IA__g_signal_newv"), visibility("default"))); + +#undef g_signal_new_valist +extern __typeof (g_signal_new_valist) g_signal_new_valist __attribute((alias("IA__g_signal_new_valist"), visibility("default"))); + +#undef g_signal_new_class_handler +extern __typeof (g_signal_new_class_handler) g_signal_new_class_handler __attribute((alias("IA__g_signal_new_class_handler"), visibility("default"))); + +#undef g_signal_override_class_closure +extern __typeof (g_signal_override_class_closure) g_signal_override_class_closure __attribute((alias("IA__g_signal_override_class_closure"), visibility("default"))); + +#undef g_signal_override_class_handler +extern __typeof (g_signal_override_class_handler) g_signal_override_class_handler __attribute((alias("IA__g_signal_override_class_handler"), visibility("default"))); + +#undef g_signal_parse_name +extern __typeof (g_signal_parse_name) g_signal_parse_name __attribute((alias("IA__g_signal_parse_name"), visibility("default"))); + +#undef g_signal_query +extern __typeof (g_signal_query) g_signal_query __attribute((alias("IA__g_signal_query"), visibility("default"))); + +#undef g_signal_remove_emission_hook +extern __typeof (g_signal_remove_emission_hook) g_signal_remove_emission_hook __attribute((alias("IA__g_signal_remove_emission_hook"), visibility("default"))); + +#undef g_signal_stop_emission +extern __typeof (g_signal_stop_emission) g_signal_stop_emission __attribute((alias("IA__g_signal_stop_emission"), visibility("default"))); + +#undef g_signal_stop_emission_by_name +extern __typeof (g_signal_stop_emission_by_name) g_signal_stop_emission_by_name __attribute((alias("IA__g_signal_stop_emission_by_name"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TYPE_H__) +#if IN_FILE(__G_TYPE_C__) +#undef g_type_add_class_cache_func +extern __typeof (g_type_add_class_cache_func) g_type_add_class_cache_func __attribute((alias("IA__g_type_add_class_cache_func"), visibility("default"))); + +#undef g_type_add_interface_check +extern __typeof (g_type_add_interface_check) g_type_add_interface_check __attribute((alias("IA__g_type_add_interface_check"), visibility("default"))); + +#undef g_type_add_interface_dynamic +extern __typeof (g_type_add_interface_dynamic) g_type_add_interface_dynamic __attribute((alias("IA__g_type_add_interface_dynamic"), visibility("default"))); + +#undef g_type_add_interface_static +extern __typeof (g_type_add_interface_static) g_type_add_interface_static __attribute((alias("IA__g_type_add_interface_static"), visibility("default"))); + +#undef g_type_check_class_cast +extern __typeof (g_type_check_class_cast) g_type_check_class_cast __attribute((alias("IA__g_type_check_class_cast"), visibility("default"))); + +#undef g_type_check_class_is_a +extern __typeof (g_type_check_class_is_a) g_type_check_class_is_a __attribute((alias("IA__g_type_check_class_is_a"), visibility("default"))); + +#undef g_type_check_instance +extern __typeof (g_type_check_instance) g_type_check_instance __attribute((alias("IA__g_type_check_instance"), visibility("default"))); + +#undef g_type_check_instance_cast +extern __typeof (g_type_check_instance_cast) g_type_check_instance_cast __attribute((alias("IA__g_type_check_instance_cast"), visibility("default"))); + +#undef g_type_check_instance_is_a +extern __typeof (g_type_check_instance_is_a) g_type_check_instance_is_a __attribute((alias("IA__g_type_check_instance_is_a"), visibility("default"))); + +#undef g_type_check_is_value_type +extern __typeof (g_type_check_is_value_type) g_type_check_is_value_type __attribute((alias("IA__g_type_check_is_value_type"), visibility("default"))); + +#undef g_type_check_value +extern __typeof (g_type_check_value) g_type_check_value __attribute((alias("IA__g_type_check_value"), visibility("default"))); + +#undef g_type_check_value_holds +extern __typeof (g_type_check_value_holds) g_type_check_value_holds __attribute((alias("IA__g_type_check_value_holds"), visibility("default"))); + +#undef g_type_children +extern __typeof (g_type_children) g_type_children __attribute((alias("IA__g_type_children"), visibility("default"))); + +#undef g_type_class_add_private +extern __typeof (g_type_class_add_private) g_type_class_add_private __attribute((alias("IA__g_type_class_add_private"), visibility("default"))); + +#undef g_type_class_peek +extern __typeof (g_type_class_peek) g_type_class_peek __attribute((alias("IA__g_type_class_peek"), visibility("default"))); + +#undef g_type_class_peek_parent +extern __typeof (g_type_class_peek_parent) g_type_class_peek_parent __attribute((alias("IA__g_type_class_peek_parent"), visibility("default"))); + +#undef g_type_class_peek_static +extern __typeof (g_type_class_peek_static) g_type_class_peek_static __attribute((alias("IA__g_type_class_peek_static"), visibility("default"))); + +#undef g_type_class_ref +extern __typeof (g_type_class_ref) g_type_class_ref __attribute((alias("IA__g_type_class_ref"), visibility("default"))); + +#undef g_type_class_unref +extern __typeof (g_type_class_unref) g_type_class_unref __attribute((alias("IA__g_type_class_unref"), visibility("default"))); + +#undef g_type_class_unref_uncached +extern __typeof (g_type_class_unref_uncached) g_type_class_unref_uncached __attribute((alias("IA__g_type_class_unref_uncached"), visibility("default"))); + +#undef g_type_create_instance +extern __typeof (g_type_create_instance) g_type_create_instance __attribute((alias("IA__g_type_create_instance"), visibility("default"))); + +#undef g_type_default_interface_peek +extern __typeof (g_type_default_interface_peek) g_type_default_interface_peek __attribute((alias("IA__g_type_default_interface_peek"), visibility("default"))); + +#undef g_type_default_interface_ref +extern __typeof (g_type_default_interface_ref) g_type_default_interface_ref __attribute((alias("IA__g_type_default_interface_ref"), visibility("default"))); + +#undef g_type_default_interface_unref +extern __typeof (g_type_default_interface_unref) g_type_default_interface_unref __attribute((alias("IA__g_type_default_interface_unref"), visibility("default"))); + +#undef g_type_depth +extern __typeof (g_type_depth) g_type_depth __attribute((alias("IA__g_type_depth"), visibility("default"))); + +#undef g_type_free_instance +extern __typeof (g_type_free_instance) g_type_free_instance __attribute((alias("IA__g_type_free_instance"), visibility("default"))); + +#undef g_type_from_name +extern __typeof (g_type_from_name) g_type_from_name __attribute((alias("IA__g_type_from_name"), visibility("default"))); + +#undef g_type_fundamental +extern __typeof (g_type_fundamental) g_type_fundamental __attribute((alias("IA__g_type_fundamental"), visibility("default"))); + +#undef g_type_fundamental_next +extern __typeof (g_type_fundamental_next) g_type_fundamental_next __attribute((alias("IA__g_type_fundamental_next"), visibility("default"))); + +#undef g_type_get_plugin +extern __typeof (g_type_get_plugin) g_type_get_plugin __attribute((alias("IA__g_type_get_plugin"), visibility("default"))); + +#undef g_type_get_qdata +extern __typeof (g_type_get_qdata) g_type_get_qdata __attribute((alias("IA__g_type_get_qdata"), visibility("default"))); + +#undef g_type_init +extern __typeof (g_type_init) g_type_init __attribute((alias("IA__g_type_init"), visibility("default"))); + +#undef g_type_init_with_debug_flags +extern __typeof (g_type_init_with_debug_flags) g_type_init_with_debug_flags __attribute((alias("IA__g_type_init_with_debug_flags"), visibility("default"))); + +#undef g_type_instance_get_private +extern __typeof (g_type_instance_get_private) g_type_instance_get_private __attribute((alias("IA__g_type_instance_get_private"), visibility("default"))); + +#undef g_type_interface_add_prerequisite +extern __typeof (g_type_interface_add_prerequisite) g_type_interface_add_prerequisite __attribute((alias("IA__g_type_interface_add_prerequisite"), visibility("default"))); + +#undef g_type_interface_get_plugin +extern __typeof (g_type_interface_get_plugin) g_type_interface_get_plugin __attribute((alias("IA__g_type_interface_get_plugin"), visibility("default"))); + +#undef g_type_interface_peek +extern __typeof (g_type_interface_peek) g_type_interface_peek __attribute((alias("IA__g_type_interface_peek"), visibility("default"))); + +#undef g_type_interface_peek_parent +extern __typeof (g_type_interface_peek_parent) g_type_interface_peek_parent __attribute((alias("IA__g_type_interface_peek_parent"), visibility("default"))); + +#undef g_type_interface_prerequisites +extern __typeof (g_type_interface_prerequisites) g_type_interface_prerequisites __attribute((alias("IA__g_type_interface_prerequisites"), visibility("default"))); + +#undef g_type_interfaces +extern __typeof (g_type_interfaces) g_type_interfaces __attribute((alias("IA__g_type_interfaces"), visibility("default"))); + +#undef g_type_is_a +extern __typeof (g_type_is_a) g_type_is_a __attribute((alias("IA__g_type_is_a"), visibility("default"))); + +#undef g_type_name +extern __typeof (g_type_name) g_type_name __attribute((alias("IA__g_type_name"), visibility("default"))); + +#undef g_type_name_from_class +extern __typeof (g_type_name_from_class) g_type_name_from_class __attribute((alias("IA__g_type_name_from_class"), visibility("default"))); + +#undef g_type_name_from_instance +extern __typeof (g_type_name_from_instance) g_type_name_from_instance __attribute((alias("IA__g_type_name_from_instance"), visibility("default"))); + +#undef g_type_next_base +extern __typeof (g_type_next_base) g_type_next_base __attribute((alias("IA__g_type_next_base"), visibility("default"))); + +#undef g_type_parent +extern __typeof (g_type_parent) g_type_parent __attribute((alias("IA__g_type_parent"), visibility("default"))); + +#undef g_type_qname +extern __typeof (g_type_qname) g_type_qname __attribute((alias("IA__g_type_qname"), visibility("default"))); + +#undef g_type_query +extern __typeof (g_type_query) g_type_query __attribute((alias("IA__g_type_query"), visibility("default"))); + +#undef g_type_register_dynamic +extern __typeof (g_type_register_dynamic) g_type_register_dynamic __attribute((alias("IA__g_type_register_dynamic"), visibility("default"))); + +#undef g_type_register_fundamental +extern __typeof (g_type_register_fundamental) g_type_register_fundamental __attribute((alias("IA__g_type_register_fundamental"), visibility("default"))); + +#undef g_type_register_static +extern __typeof (g_type_register_static) g_type_register_static __attribute((alias("IA__g_type_register_static"), visibility("default"))); + +#undef g_type_register_static_simple +extern __typeof (g_type_register_static_simple) g_type_register_static_simple __attribute((alias("IA__g_type_register_static_simple"), visibility("default"))); + +#undef g_type_remove_class_cache_func +extern __typeof (g_type_remove_class_cache_func) g_type_remove_class_cache_func __attribute((alias("IA__g_type_remove_class_cache_func"), visibility("default"))); + +#undef g_type_remove_interface_check +extern __typeof (g_type_remove_interface_check) g_type_remove_interface_check __attribute((alias("IA__g_type_remove_interface_check"), visibility("default"))); + +#undef g_type_set_qdata +extern __typeof (g_type_set_qdata) g_type_set_qdata __attribute((alias("IA__g_type_set_qdata"), visibility("default"))); + +#undef g_type_test_flags +extern __typeof (g_type_test_flags) g_type_test_flags __attribute((alias("IA__g_type_test_flags"), visibility("default"))); + +#undef g_type_value_table_peek +extern __typeof (g_type_value_table_peek) g_type_value_table_peek __attribute((alias("IA__g_type_value_table_peek"), visibility("default"))); + +#undef g_type_class_get_private +extern __typeof (g_type_class_get_private) g_type_class_get_private __attribute((alias("IA__g_type_class_get_private"), visibility("default"))); + +#undef g_type_add_class_private +extern __typeof (g_type_add_class_private) g_type_add_class_private __attribute((alias("IA__g_type_add_class_private"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TYPE_MODULE_H__) +#if IN_FILE(__G_TYPE_MODULE_C__) +#undef g_type_module_add_interface +extern __typeof (g_type_module_add_interface) g_type_module_add_interface __attribute((alias("IA__g_type_module_add_interface"), visibility("default"))); + +#undef g_type_module_get_type +extern __typeof (g_type_module_get_type) g_type_module_get_type __attribute((alias("IA__g_type_module_get_type"), visibility("default"))); + +#undef g_type_module_register_enum +extern __typeof (g_type_module_register_enum) g_type_module_register_enum __attribute((alias("IA__g_type_module_register_enum"), visibility("default"))); + +#undef g_type_module_register_flags +extern __typeof (g_type_module_register_flags) g_type_module_register_flags __attribute((alias("IA__g_type_module_register_flags"), visibility("default"))); + +#undef g_type_module_register_type +extern __typeof (g_type_module_register_type) g_type_module_register_type __attribute((alias("IA__g_type_module_register_type"), visibility("default"))); + +#undef g_type_module_set_name +extern __typeof (g_type_module_set_name) g_type_module_set_name __attribute((alias("IA__g_type_module_set_name"), visibility("default"))); + +#undef g_type_module_unuse +extern __typeof (g_type_module_unuse) g_type_module_unuse __attribute((alias("IA__g_type_module_unuse"), visibility("default"))); + +#undef g_type_module_use +extern __typeof (g_type_module_use) g_type_module_use __attribute((alias("IA__g_type_module_use"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VALUE_ARRAY_H__) +#if IN_FILE(__G_VALUE_ARRAY_C__) +#undef g_value_array_append +extern __typeof (g_value_array_append) g_value_array_append __attribute((alias("IA__g_value_array_append"), visibility("default"))); + +#undef g_value_array_copy +extern __typeof (g_value_array_copy) g_value_array_copy __attribute((alias("IA__g_value_array_copy"), visibility("default"))); + +#undef g_value_array_free +extern __typeof (g_value_array_free) g_value_array_free __attribute((alias("IA__g_value_array_free"), visibility("default"))); + +#undef g_value_array_get_nth +extern __typeof (g_value_array_get_nth) g_value_array_get_nth __attribute((alias("IA__g_value_array_get_nth"), visibility("default"))); + +#undef g_value_array_insert +extern __typeof (g_value_array_insert) g_value_array_insert __attribute((alias("IA__g_value_array_insert"), visibility("default"))); + +#undef g_value_array_new +extern __typeof (g_value_array_new) g_value_array_new __attribute((alias("IA__g_value_array_new"), visibility("default"))); + +#undef g_value_array_prepend +extern __typeof (g_value_array_prepend) g_value_array_prepend __attribute((alias("IA__g_value_array_prepend"), visibility("default"))); + +#undef g_value_array_remove +extern __typeof (g_value_array_remove) g_value_array_remove __attribute((alias("IA__g_value_array_remove"), visibility("default"))); + +#undef g_value_array_sort +extern __typeof (g_value_array_sort) g_value_array_sort __attribute((alias("IA__g_value_array_sort"), visibility("default"))); + +#undef g_value_array_sort_with_data +extern __typeof (g_value_array_sort_with_data) g_value_array_sort_with_data __attribute((alias("IA__g_value_array_sort_with_data"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_TYPE_PLUGIN_H__) +#if IN_FILE(__G_TYPE_PLUGIN_C__) +#undef g_type_plugin_complete_interface_info +extern __typeof (g_type_plugin_complete_interface_info) g_type_plugin_complete_interface_info __attribute((alias("IA__g_type_plugin_complete_interface_info"), visibility("default"))); + +#undef g_type_plugin_complete_type_info +extern __typeof (g_type_plugin_complete_type_info) g_type_plugin_complete_type_info __attribute((alias("IA__g_type_plugin_complete_type_info"), visibility("default"))); + +#undef g_type_plugin_get_type +extern __typeof (g_type_plugin_get_type) g_type_plugin_get_type __attribute((alias("IA__g_type_plugin_get_type"), visibility("default"))); + +#undef g_type_plugin_unuse +extern __typeof (g_type_plugin_unuse) g_type_plugin_unuse __attribute((alias("IA__g_type_plugin_unuse"), visibility("default"))); + +#undef g_type_plugin_use +extern __typeof (g_type_plugin_use) g_type_plugin_use __attribute((alias("IA__g_type_plugin_use"), visibility("default"))); + +#endif +#endif +#if IN_HEADER(__G_VALUE_H__) +#if IN_FILE(__G_VALUE_C__) +#undef g_value_copy +extern __typeof (g_value_copy) g_value_copy __attribute((alias("IA__g_value_copy"), visibility("default"))); + +#undef g_value_fits_pointer +extern __typeof (g_value_fits_pointer) g_value_fits_pointer __attribute((alias("IA__g_value_fits_pointer"), visibility("default"))); + +#undef g_value_init +extern __typeof (g_value_init) g_value_init __attribute((alias("IA__g_value_init"), visibility("default"))); + +#undef g_value_peek_pointer +extern __typeof (g_value_peek_pointer) g_value_peek_pointer __attribute((alias("IA__g_value_peek_pointer"), visibility("default"))); + +#undef g_value_register_transform_func +extern __typeof (g_value_register_transform_func) g_value_register_transform_func __attribute((alias("IA__g_value_register_transform_func"), visibility("default"))); + +#undef g_value_reset +extern __typeof (g_value_reset) g_value_reset __attribute((alias("IA__g_value_reset"), visibility("default"))); + +#undef g_value_transform +extern __typeof (g_value_transform) g_value_transform __attribute((alias("IA__g_value_transform"), visibility("default"))); + +#undef g_value_type_compatible +extern __typeof (g_value_type_compatible) g_value_type_compatible __attribute((alias("IA__g_value_type_compatible"), visibility("default"))); + +#undef g_value_type_transformable +extern __typeof (g_value_type_transformable) g_value_type_transformable __attribute((alias("IA__g_value_type_transformable"), visibility("default"))); + +#undef g_value_unset +extern __typeof (g_value_unset) g_value_unset __attribute((alias("IA__g_value_unset"), visibility("default"))); + +#undef g_value_set_instance +extern __typeof (g_value_set_instance) g_value_set_instance __attribute((alias("IA__g_value_set_instance"), visibility("default"))); + +#endif +#endif + +#endif /* G_HAVE_GNUC_VISIBILITY */ +#endif /* DISABLE_VISIBILITY */ diff --git a/gobject/gobjectnotifyqueue.c b/gobject/gobjectnotifyqueue.c new file mode 100644 index 0000000..56422c2 --- /dev/null +++ b/gobject/gobjectnotifyqueue.c @@ -0,0 +1,166 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __G_OBJECT_NOTIFY_QUEUE_H__ +#define __G_OBJECT_NOTIFY_QUEUE_H__ + +#include /* memset */ + +#include + +G_BEGIN_DECLS + + +/* --- typedefs --- */ +typedef struct _GObjectNotifyContext GObjectNotifyContext; +typedef struct _GObjectNotifyQueue GObjectNotifyQueue; +typedef void (*GObjectNotifyQueueDispatcher) (GObject *object, + guint n_pspecs, + GParamSpec **pspecs); + + +/* --- structures --- */ +struct _GObjectNotifyContext +{ + GQuark quark_notify_queue; + GObjectNotifyQueueDispatcher dispatcher; + GTrashStack *_nqueue_trash; /* unused */ +}; +struct _GObjectNotifyQueue +{ + GObjectNotifyContext *context; + GSList *pspecs; + guint16 n_pspecs; + guint16 freeze_count; +}; + +/* --- functions --- */ +static void +g_object_notify_queue_free (gpointer data) +{ + GObjectNotifyQueue *nqueue = data; + + g_slist_free (nqueue->pspecs); + g_slice_free (GObjectNotifyQueue, nqueue); +} + +static inline GObjectNotifyQueue* +g_object_notify_queue_freeze (GObject *object, + GObjectNotifyContext *context) +{ + GObjectNotifyQueue *nqueue; + + nqueue = g_datalist_id_get_data (&object->qdata, context->quark_notify_queue); + if (!nqueue) + { + nqueue = g_slice_new0 (GObjectNotifyQueue); + nqueue->context = context; + g_datalist_id_set_data_full (&object->qdata, context->quark_notify_queue, + nqueue, g_object_notify_queue_free); + } + + g_return_val_if_fail (nqueue->freeze_count < 65535, nqueue); + nqueue->freeze_count++; + + return nqueue; +} + +static inline void +g_object_notify_queue_thaw (GObject *object, + GObjectNotifyQueue *nqueue) +{ + GObjectNotifyContext *context = nqueue->context; + GParamSpec *pspecs_mem[16], **pspecs, **free_me = NULL; + GSList *slist; + guint n_pspecs = 0; + + g_return_if_fail (nqueue->freeze_count > 0); + + nqueue->freeze_count--; + if (nqueue->freeze_count) + return; + g_return_if_fail (object->ref_count > 0); + + pspecs = nqueue->n_pspecs > 16 ? free_me = g_new (GParamSpec*, nqueue->n_pspecs) : pspecs_mem; + /* set first entry to NULL since it's checked unconditionally */ + pspecs[0] = NULL; + for (slist = nqueue->pspecs; slist; slist = slist->next) + { + GParamSpec *pspec = slist->data; + guint i = 0; + + /* dedup, make pspecs in the list unique */ + redo_dedup_check: + if (pspecs[i] == pspec) + continue; + if (++i < n_pspecs) + goto redo_dedup_check; + + pspecs[n_pspecs++] = pspec; + } + g_datalist_id_set_data (&object->qdata, context->quark_notify_queue, NULL); + + if (n_pspecs) + context->dispatcher (object, n_pspecs, pspecs); + g_free (free_me); +} + +static inline void +g_object_notify_queue_clear (GObject *object, + GObjectNotifyQueue *nqueue) +{ + g_return_if_fail (nqueue->freeze_count > 0); + + g_slist_free (nqueue->pspecs); + nqueue->pspecs = NULL; + nqueue->n_pspecs = 0; +} + +static inline void +g_object_notify_queue_add (GObject *object, + GObjectNotifyQueue *nqueue, + GParamSpec *pspec) +{ + if (pspec->flags & G_PARAM_READABLE) + { + GParamSpec *redirect; + + g_return_if_fail (nqueue->n_pspecs < 65535); + + redirect = g_param_spec_get_redirect_target (pspec); + if (redirect) + pspec = redirect; + + /* we do the deduping in _thaw */ + nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec); + nqueue->n_pspecs++; + } +} + +static inline GObjectNotifyQueue* +g_object_notify_queue_from_object (GObject *object, + GObjectNotifyContext *context) +{ + return g_datalist_id_get_data (&object->qdata, context->quark_notify_queue); +} + + +G_END_DECLS + +#endif /* __G_OBJECT_NOTIFY_QUEUE_H__ */ diff --git a/gobject/gparam.c b/gobject/gparam.c new file mode 100644 index 0000000..139baa0 --- /dev/null +++ b/gobject/gparam.c @@ -0,0 +1,1501 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include + +#include "gparam.h" +#include "gparamspecs.h" +#include "gvaluecollector.h" +#include "gobjectalias.h" + + +/** + * SECTION:gparamspec + * @short_description: Metadata for parameter specifications + * @see_also: g_object_class_install_property(), g_object_set(), + * g_object_get(), g_object_set_property(), g_object_get_property(), + * g_value_register_transform_func() + * @title: GParamSpec + * + * #GParamSpec is an object structure that encapsulates the metadata + * required to specify parameters, such as e.g. #GObject properties. + * + * + * Parameter names need to start with a letter (a-z or A-Z). Subsequent + * characters can be letters, numbers or a '-'. + * All other characters are replaced by a '-' during construction. + * The result of this replacement is called the canonical name of the + * parameter. + * + */ + + +/* --- defines --- */ +#define PARAM_FLOATING_FLAG 0x2 +#define G_PARAM_USER_MASK (~0 << G_PARAM_USER_SHIFT) +#define PSPEC_APPLIES_TO_VALUE(pspec, value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_PARAM_SPEC_VALUE_TYPE (pspec))) +#define G_SLOCK(mutex) g_static_mutex_lock (mutex) +#define G_SUNLOCK(mutex) g_static_mutex_unlock (mutex) + + +/* --- prototypes --- */ +static void g_param_spec_class_base_init (GParamSpecClass *class); +static void g_param_spec_class_base_finalize (GParamSpecClass *class); +static void g_param_spec_class_init (GParamSpecClass *class, + gpointer class_data); +static void g_param_spec_init (GParamSpec *pspec, + GParamSpecClass *class); +static void g_param_spec_finalize (GParamSpec *pspec); +static void value_param_init (GValue *value); +static void value_param_free_value (GValue *value); +static void value_param_copy_value (const GValue *src_value, + GValue *dest_value); +static void value_param_transform_value (const GValue *src_value, + GValue *dest_value); +static gpointer value_param_peek_pointer (const GValue *value); +static gchar* value_param_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +static gchar* value_param_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); + + +/* --- functions --- */ +void +g_param_type_init (void) +{ + static const GTypeFundamentalInfo finfo = { + (G_TYPE_FLAG_CLASSED | + G_TYPE_FLAG_INSTANTIATABLE | + G_TYPE_FLAG_DERIVABLE | + G_TYPE_FLAG_DEEP_DERIVABLE), + }; + static const GTypeValueTable param_value_table = { + value_param_init, /* value_init */ + value_param_free_value, /* value_free */ + value_param_copy_value, /* value_copy */ + value_param_peek_pointer, /* value_peek_pointer */ + "p", /* collect_format */ + value_param_collect_value, /* collect_value */ + "p", /* lcopy_format */ + value_param_lcopy_value, /* lcopy_value */ + }; + static const GTypeInfo param_spec_info = { + sizeof (GParamSpecClass), + + (GBaseInitFunc) g_param_spec_class_base_init, + (GBaseFinalizeFunc) g_param_spec_class_base_finalize, + (GClassInitFunc) g_param_spec_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + + sizeof (GParamSpec), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_param_spec_init, + + ¶m_value_table, + }; + GType type; + + /* This should be registred as GParamSpec instead of GParam, for + * consistency sake, so that type name can be mapped to struct name, + * However, some language bindings, most noticable the python ones + * depends on the "GParam" identifier, see #548689 + */ + type = g_type_register_fundamental (G_TYPE_PARAM, g_intern_static_string ("GParam"), ¶m_spec_info, &finfo, G_TYPE_FLAG_ABSTRACT); + g_assert (type == G_TYPE_PARAM); + g_value_register_transform_func (G_TYPE_PARAM, G_TYPE_PARAM, value_param_transform_value); +} + +static void +g_param_spec_class_base_init (GParamSpecClass *class) +{ +} + +static void +g_param_spec_class_base_finalize (GParamSpecClass *class) +{ +} + +static void +g_param_spec_class_init (GParamSpecClass *class, + gpointer class_data) +{ + class->value_type = G_TYPE_NONE; + class->finalize = g_param_spec_finalize; + class->value_set_default = NULL; + class->value_validate = NULL; + class->values_cmp = NULL; +} + +static void +g_param_spec_init (GParamSpec *pspec, + GParamSpecClass *class) +{ + pspec->name = NULL; + pspec->_nick = NULL; + pspec->_blurb = NULL; + pspec->flags = 0; + pspec->value_type = class->value_type; + pspec->owner_type = 0; + pspec->qdata = NULL; + g_datalist_init (&pspec->qdata); + g_datalist_set_flags (&pspec->qdata, PARAM_FLOATING_FLAG); + pspec->ref_count = 1; + pspec->param_id = 0; +} + +static void +g_param_spec_finalize (GParamSpec *pspec) +{ + g_datalist_clear (&pspec->qdata); + + if (!(pspec->flags & G_PARAM_STATIC_NAME)) + g_free (pspec->name); + + if (!(pspec->flags & G_PARAM_STATIC_NICK)) + g_free (pspec->_nick); + + if (!(pspec->flags & G_PARAM_STATIC_BLURB)) + g_free (pspec->_blurb); + + g_type_free_instance ((GTypeInstance*) pspec); +} + +/** + * g_param_spec_ref: + * @pspec: a valid #GParamSpec + * + * Increments the reference count of @pspec. + * + * Returns: the #GParamSpec that was passed into this function + */ +GParamSpec* +g_param_spec_ref (GParamSpec *pspec) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + g_return_val_if_fail (pspec->ref_count > 0, NULL); + + g_atomic_int_inc ((int *)&pspec->ref_count); + + return pspec; +} + +/** + * g_param_spec_unref: + * @pspec: a valid #GParamSpec + * + * Decrements the reference count of a @pspec. + */ +void +g_param_spec_unref (GParamSpec *pspec) +{ + gboolean is_zero; + + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (pspec->ref_count > 0); + + is_zero = g_atomic_int_dec_and_test ((int *)&pspec->ref_count); + + if (G_UNLIKELY (is_zero)) + { + G_PARAM_SPEC_GET_CLASS (pspec)->finalize (pspec); + } +} + +/** + * g_param_spec_sink: + * @pspec: a valid #GParamSpec + * + * The initial reference count of a newly created #GParamSpec is 1, + * even though no one has explicitly called g_param_spec_ref() on it + * yet. So the initial reference count is flagged as "floating", until + * someone calls g_param_spec_ref (pspec); g_param_spec_sink + * (pspec); in sequence on it, taking over the initial + * reference count (thus ending up with a @pspec that has a reference + * count of 1 still, but is not flagged "floating" anymore). + */ +void +g_param_spec_sink (GParamSpec *pspec) +{ + gpointer oldvalue; + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (pspec->ref_count > 0); + + do + oldvalue = g_atomic_pointer_get (&pspec->qdata); + while (!g_atomic_pointer_compare_and_exchange ((void**) &pspec->qdata, oldvalue, + (gpointer) ((gsize) oldvalue & ~(gsize) PARAM_FLOATING_FLAG))); + if ((gsize) oldvalue & PARAM_FLOATING_FLAG) + g_param_spec_unref (pspec); +} + +/** + * g_param_spec_ref_sink: + * @pspec: a valid #GParamSpec + * + * Convenience function to ref and sink a #GParamSpec. + * + * Since: 2.10 + * Returns: the #GParamSpec that was passed into this function + */ +GParamSpec* +g_param_spec_ref_sink (GParamSpec *pspec) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + g_return_val_if_fail (pspec->ref_count > 0, NULL); + + g_param_spec_ref (pspec); + g_param_spec_sink (pspec); + return pspec; +} + +/** + * g_param_spec_get_name: + * @pspec: a valid #GParamSpec + * + * Get the name of a #GParamSpec. + * + * Returns: the name of @pspec. + */ +G_CONST_RETURN gchar* +g_param_spec_get_name (GParamSpec *pspec) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + + return pspec->name; +} + +/** + * g_param_spec_get_nick: + * @pspec: a valid #GParamSpec + * + * Get the nickname of a #GParamSpec. + * + * Returns: the nickname of @pspec. + */ +G_CONST_RETURN gchar* +g_param_spec_get_nick (GParamSpec *pspec) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + + if (pspec->_nick) + return pspec->_nick; + else + { + GParamSpec *redirect_target; + + redirect_target = g_param_spec_get_redirect_target (pspec); + if (redirect_target && redirect_target->_nick) + return redirect_target->_nick; + } + + return pspec->name; +} + +/** + * g_param_spec_get_blurb: + * @pspec: a valid #GParamSpec + * + * Get the short description of a #GParamSpec. + * + * Returns: the short description of @pspec. + */ +G_CONST_RETURN gchar* +g_param_spec_get_blurb (GParamSpec *pspec) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + + if (pspec->_blurb) + return pspec->_blurb; + else + { + GParamSpec *redirect_target; + + redirect_target = g_param_spec_get_redirect_target (pspec); + if (redirect_target && redirect_target->_blurb) + return redirect_target->_blurb; + } + + return NULL; +} + +static void +canonicalize_key (gchar *key) +{ + gchar *p; + + for (p = key; *p != 0; p++) + { + gchar c = *p; + + if (c != '-' && + (c < '0' || c > '9') && + (c < 'A' || c > 'Z') && + (c < 'a' || c > 'z')) + *p = '-'; + } +} + +static gboolean +is_canonical (const gchar *key) +{ + const gchar *p; + + for (p = key; *p != 0; p++) + { + gchar c = *p; + + if (c != '-' && + (c < '0' || c > '9') && + (c < 'A' || c > 'Z') && + (c < 'a' || c > 'z')) + return FALSE; + } + + return TRUE; +} + +/** + * g_param_spec_internal: + * @param_type: the #GType for the property; must be derived from #G_TYPE_PARAM + * @name: the canonical name of the property + * @nick: the nickname of the property + * @blurb: a short description of the property + * @flags: a combination of #GParamFlags + * + * Creates a new #GParamSpec instance. + * + * A property name consists of segments consisting of ASCII letters and + * digits, separated by either the '-' or '_' character. The first + * character of a property name must be a letter. Names which violate these + * rules lead to undefined behaviour. + * + * When creating and looking up a #GParamSpec, either separator can be + * used, but they cannot be mixed. Using '-' is considerably more + * efficient and in fact required when using property names as detail + * strings for signals. + * + * Beyond the name, #GParamSpecs have two more descriptive + * strings associated with them, the @nick, which should be suitable + * for use as a label for the property in a property editor, and the + * @blurb, which should be a somewhat longer description, suitable for + * e.g. a tooltip. The @nick and @blurb should ideally be localized. + * + * Returns: a newly allocated #GParamSpec instance + */ +gpointer +g_param_spec_internal (GType param_type, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamFlags flags) +{ + GParamSpec *pspec; + + g_return_val_if_fail (G_TYPE_IS_PARAM (param_type) && param_type != G_TYPE_PARAM, NULL); + g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail ((name[0] >= 'A' && name[0] <= 'Z') || (name[0] >= 'a' && name[0] <= 'z'), NULL); + g_return_val_if_fail (!(flags & G_PARAM_STATIC_NAME) || is_canonical (name), NULL); + + pspec = (gpointer) g_type_create_instance (param_type); + + if (flags & G_PARAM_STATIC_NAME) + { + pspec->name = g_intern_static_string (name); + if (!is_canonical (pspec->name)) + g_warning ("G_PARAM_STATIC_NAME used with non-canonical pspec name: %s", pspec->name); + } + else + { + pspec->name = g_strdup (name); + canonicalize_key (pspec->name); + g_intern_string (pspec->name); + } + + if (flags & G_PARAM_STATIC_NICK) + pspec->_nick = (gchar*) nick; + else + pspec->_nick = g_strdup (nick); + + if (flags & G_PARAM_STATIC_BLURB) + pspec->_blurb = (gchar*) blurb; + else + pspec->_blurb = g_strdup (blurb); + + pspec->flags = (flags & G_PARAM_USER_MASK) | (flags & G_PARAM_MASK); + + return pspec; +} + +/** + * g_param_spec_get_qdata: + * @pspec: a valid #GParamSpec + * @quark: a #GQuark, naming the user data pointer + * + * Gets back user data pointers stored via g_param_spec_set_qdata(). + * + * Returns: the user data pointer set, or %NULL + */ +gpointer +g_param_spec_get_qdata (GParamSpec *pspec, + GQuark quark) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + + return quark ? g_datalist_id_get_data (&pspec->qdata, quark) : NULL; +} + +/** + * g_param_spec_set_qdata: + * @pspec: the #GParamSpec to set store a user data pointer + * @quark: a #GQuark, naming the user data pointer + * @data: an opaque user data pointer + * + * Sets an opaque, named pointer on a #GParamSpec. The name is + * specified through a #GQuark (retrieved e.g. via + * g_quark_from_static_string()), and the pointer can be gotten back + * from the @pspec with g_param_spec_get_qdata(). Setting a + * previously set user data pointer, overrides (frees) the old pointer + * set, using %NULL as pointer essentially removes the data stored. + */ +void +g_param_spec_set_qdata (GParamSpec *pspec, + GQuark quark, + gpointer data) +{ + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (quark > 0); + + g_datalist_id_set_data (&pspec->qdata, quark, data); +} + +/** + * g_param_spec_set_qdata_full: + * @pspec: the #GParamSpec to set store a user data pointer + * @quark: a #GQuark, naming the user data pointer + * @data: an opaque user data pointer + * @destroy: function to invoke with @data as argument, when @data needs to + * be freed + * + * This function works like g_param_spec_set_qdata(), but in addition, + * a void (*destroy) (gpointer) function may be + * specified which is called with @data as argument when the @pspec is + * finalized, or the data is being overwritten by a call to + * g_param_spec_set_qdata() with the same @quark. + */ +void +g_param_spec_set_qdata_full (GParamSpec *pspec, + GQuark quark, + gpointer data, + GDestroyNotify destroy) +{ + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (quark > 0); + + g_datalist_id_set_data_full (&pspec->qdata, quark, data, data ? destroy : (GDestroyNotify) NULL); +} + +/** + * g_param_spec_steal_qdata: + * @pspec: the #GParamSpec to get a stored user data pointer from + * @quark: a #GQuark, naming the user data pointer + * + * Gets back user data pointers stored via g_param_spec_set_qdata() + * and removes the @data from @pspec without invoking its destroy() + * function (if any was set). Usually, calling this function is only + * required to update user data pointers with a destroy notifier. + * + * Returns: the user data pointer set, or %NULL + */ +gpointer +g_param_spec_steal_qdata (GParamSpec *pspec, + GQuark quark) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + g_return_val_if_fail (quark > 0, NULL); + + return g_datalist_id_remove_no_notify (&pspec->qdata, quark); +} + +/** + * g_param_spec_get_redirect_target: + * @pspec: a #GParamSpec + * + * If the paramspec redirects operations to another paramspec, + * returns that paramspec. Redirect is used typically for + * providing a new implementation of a property in a derived + * type while preserving all the properties from the parent + * type. Redirection is established by creating a property + * of type #GParamSpecOverride. See g_object_class_override_property() + * for an example of the use of this capability. + * + * Since: 2.4 + * + * Returns: paramspec to which requests on this paramspec should + * be redirected, or %NULL if none. + */ +GParamSpec* +g_param_spec_get_redirect_target (GParamSpec *pspec) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + + if (G_IS_PARAM_SPEC_OVERRIDE (pspec)) + { + GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); + + return ospec->overridden; + } + else + return NULL; +} + +/** + * g_param_value_set_default: + * @pspec: a valid #GParamSpec + * @value: a #GValue of correct type for @pspec + * + * Sets @value to its default value as specified in @pspec. + */ +void +g_param_value_set_default (GParamSpec *pspec, + GValue *value) +{ + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + g_return_if_fail (G_IS_VALUE (value)); + g_return_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value)); + + g_value_reset (value); + G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, value); +} + +/** + * g_param_value_defaults: + * @pspec: a valid #GParamSpec + * @value: a #GValue of correct type for @pspec + * + * Checks whether @value contains the default value as specified in @pspec. + * + * Returns: whether @value contains the canonical default for this @pspec + */ +gboolean +g_param_value_defaults (GParamSpec *pspec, + GValue *value) +{ + GValue dflt_value = { 0, }; + gboolean defaults; + + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE); + g_return_val_if_fail (G_IS_VALUE (value), FALSE); + g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value), FALSE); + + g_value_init (&dflt_value, G_PARAM_SPEC_VALUE_TYPE (pspec)); + G_PARAM_SPEC_GET_CLASS (pspec)->value_set_default (pspec, &dflt_value); + defaults = G_PARAM_SPEC_GET_CLASS (pspec)->values_cmp (pspec, value, &dflt_value) == 0; + g_value_unset (&dflt_value); + + return defaults; +} + +/** + * g_param_value_validate: + * @pspec: a valid #GParamSpec + * @value: a #GValue of correct type for @pspec + * + * Ensures that the contents of @value comply with the specifications + * set out by @pspec. For example, a #GParamSpecInt might require + * that integers stored in @value may not be smaller than -42 and not be + * greater than +42. If @value contains an integer outside of this range, + * it is modified accordingly, so the resulting value will fit into the + * range -42 .. +42. + * + * Returns: whether modifying @value was necessary to ensure validity + */ +gboolean +g_param_value_validate (GParamSpec *pspec, + GValue *value) +{ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE); + g_return_val_if_fail (G_IS_VALUE (value), FALSE); + g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value), FALSE); + + if (G_PARAM_SPEC_GET_CLASS (pspec)->value_validate) + { + GValue oval = *value; + + if (G_PARAM_SPEC_GET_CLASS (pspec)->value_validate (pspec, value) || + memcmp (&oval.data, &value->data, sizeof (oval.data))) + return TRUE; + } + + return FALSE; +} + +/** + * g_param_value_convert: + * @pspec: a valid #GParamSpec + * @src_value: souce #GValue + * @dest_value: destination #GValue of correct type for @pspec + * @strict_validation: %TRUE requires @dest_value to conform to @pspec + * without modifications + * + * Transforms @src_value into @dest_value if possible, and then + * validates @dest_value, in order for it to conform to @pspec. If + * @strict_validation is %TRUE this function will only succeed if the + * transformed @dest_value complied to @pspec without modifications. + * + * See also g_value_type_transformable(), g_value_transform() and + * g_param_value_validate(). + * + * Returns: %TRUE if transformation and validation were successful, + * %FALSE otherwise and @dest_value is left untouched. + */ +gboolean +g_param_value_convert (GParamSpec *pspec, + const GValue *src_value, + GValue *dest_value, + gboolean strict_validation) +{ + GValue tmp_value = { 0, }; + + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), FALSE); + g_return_val_if_fail (G_IS_VALUE (src_value), FALSE); + g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE); + g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, dest_value), FALSE); + + /* better leave dest_value untouched when returning FALSE */ + + g_value_init (&tmp_value, G_VALUE_TYPE (dest_value)); + if (g_value_transform (src_value, &tmp_value) && + (!g_param_value_validate (pspec, &tmp_value) || !strict_validation)) + { + g_value_unset (dest_value); + + /* values are relocatable */ + memcpy (dest_value, &tmp_value, sizeof (tmp_value)); + + return TRUE; + } + else + { + g_value_unset (&tmp_value); + + return FALSE; + } +} + +/** + * g_param_values_cmp: + * @pspec: a valid #GParamSpec + * @value1: a #GValue of correct type for @pspec + * @value2: a #GValue of correct type for @pspec + * + * Compares @value1 with @value2 according to @pspec, and return -1, 0 or +1, + * if @value1 is found to be less than, equal to or greater than @value2, + * respectively. + * + * Returns: -1, 0 or +1, for a less than, equal to or greater than result + */ +gint +g_param_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + gint cmp; + + /* param_values_cmp() effectively does: value1 - value2 + * so the return values are: + * -1) value1 < value2 + * 0) value1 == value2 + * 1) value1 > value2 + */ + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), 0); + g_return_val_if_fail (G_IS_VALUE (value1), 0); + g_return_val_if_fail (G_IS_VALUE (value2), 0); + g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value1), 0); + g_return_val_if_fail (PSPEC_APPLIES_TO_VALUE (pspec, value2), 0); + + cmp = G_PARAM_SPEC_GET_CLASS (pspec)->values_cmp (pspec, value1, value2); + + return CLAMP (cmp, -1, 1); +} + +static void +value_param_init (GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static void +value_param_free_value (GValue *value) +{ + if (value->data[0].v_pointer) + g_param_spec_unref (value->data[0].v_pointer); +} + +static void +value_param_copy_value (const GValue *src_value, + GValue *dest_value) +{ + if (src_value->data[0].v_pointer) + dest_value->data[0].v_pointer = g_param_spec_ref (src_value->data[0].v_pointer); + else + dest_value->data[0].v_pointer = NULL; +} + +static void +value_param_transform_value (const GValue *src_value, + GValue *dest_value) +{ + if (src_value->data[0].v_pointer && + g_type_is_a (G_PARAM_SPEC_TYPE (dest_value->data[0].v_pointer), G_VALUE_TYPE (dest_value))) + dest_value->data[0].v_pointer = g_param_spec_ref (src_value->data[0].v_pointer); + else + dest_value->data[0].v_pointer = NULL; +} + +static gpointer +value_param_peek_pointer (const GValue *value) +{ + return value->data[0].v_pointer; +} + +static gchar* +value_param_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + if (collect_values[0].v_pointer) + { + GParamSpec *param = collect_values[0].v_pointer; + + if (param->g_type_instance.g_class == NULL) + return g_strconcat ("invalid unclassed param spec pointer for value type `", + G_VALUE_TYPE_NAME (value), + "'", + NULL); + else if (!g_value_type_compatible (G_PARAM_SPEC_TYPE (param), G_VALUE_TYPE (value))) + return g_strconcat ("invalid param spec type `", + G_PARAM_SPEC_TYPE_NAME (param), + "' for value type `", + G_VALUE_TYPE_NAME (value), + "'", + NULL); + value->data[0].v_pointer = g_param_spec_ref (param); + } + else + value->data[0].v_pointer = NULL; + + return NULL; +} + +static gchar* +value_param_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + GParamSpec **param_p = collect_values[0].v_pointer; + + if (!param_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + if (!value->data[0].v_pointer) + *param_p = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + *param_p = value->data[0].v_pointer; + else + *param_p = g_param_spec_ref (value->data[0].v_pointer); + + return NULL; +} + + +/* --- param spec pool --- */ +/** + * GParamSpecPool: + * + * A #GParamSpecPool maintains a collection of #GParamSpecs which can be + * quickly accessed by owner and name. The implementation of the #GObject property + * system uses such a pool to store the #GParamSpecs of the properties all object + * types. + */ +struct _GParamSpecPool +{ + GStaticMutex smutex; + gboolean type_prefixing; + GHashTable *hash_table; +}; + +static guint +param_spec_pool_hash (gconstpointer key_spec) +{ + const GParamSpec *key = key_spec; + const gchar *p; + guint h = key->owner_type; + + for (p = key->name; *p; p++) + h = (h << 5) - h + *p; + + return h; +} + +static gboolean +param_spec_pool_equals (gconstpointer key_spec_1, + gconstpointer key_spec_2) +{ + const GParamSpec *key1 = key_spec_1; + const GParamSpec *key2 = key_spec_2; + + return (key1->owner_type == key2->owner_type && + strcmp (key1->name, key2->name) == 0); +} + +/** + * g_param_spec_pool_new: + * @type_prefixing: Whether the pool will support type-prefixed property names. + * + * Creates a new #GParamSpecPool. + * + * If @type_prefixing is %TRUE, lookups in the newly created pool will + * allow to specify the owner as a colon-separated prefix of the + * property name, like "GtkContainer:border-width". This feature is + * deprecated, so you should always set @type_prefixing to %FALSE. + * + * Returns: a newly allocated #GParamSpecPool. + */ +GParamSpecPool* +g_param_spec_pool_new (gboolean type_prefixing) +{ + static GStaticMutex init_smutex = G_STATIC_MUTEX_INIT; + GParamSpecPool *pool = g_new (GParamSpecPool, 1); + + memcpy (&pool->smutex, &init_smutex, sizeof (init_smutex)); + pool->type_prefixing = type_prefixing != FALSE; + pool->hash_table = g_hash_table_new (param_spec_pool_hash, param_spec_pool_equals); + + return pool; +} + +/** + * g_param_spec_pool_insert: + * @pool: a #GParamSpecPool. + * @pspec: the #GParamSpec to insert + * @owner_type: a #GType identifying the owner of @pspec + * + * Inserts a #GParamSpec in the pool. + */ +void +g_param_spec_pool_insert (GParamSpecPool *pool, + GParamSpec *pspec, + GType owner_type) +{ + gchar *p; + + if (pool && pspec && owner_type > 0 && pspec->owner_type == 0) + { + G_SLOCK (&pool->smutex); + for (p = pspec->name; *p; p++) + { + if (!strchr (G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", *p)) + { + g_warning (G_STRLOC ": pspec name \"%s\" contains invalid characters", pspec->name); + G_SUNLOCK (&pool->smutex); + return; + } + } + + pspec->owner_type = owner_type; + g_param_spec_ref (pspec); + g_hash_table_insert (pool->hash_table, pspec, pspec); + G_SUNLOCK (&pool->smutex); + } + else + { + g_return_if_fail (pool != NULL); + g_return_if_fail (pspec); + g_return_if_fail (owner_type > 0); + g_return_if_fail (pspec->owner_type == 0); + } +} + +/** + * g_param_spec_pool_remove: + * @pool: a #GParamSpecPool + * @pspec: the #GParamSpec to remove + * + * Removes a #GParamSpec from the pool. + */ +void +g_param_spec_pool_remove (GParamSpecPool *pool, + GParamSpec *pspec) +{ + if (pool && pspec) + { + G_SLOCK (&pool->smutex); + if (g_hash_table_remove (pool->hash_table, pspec)) + g_param_spec_unref (pspec); + else + g_warning (G_STRLOC ": attempt to remove unknown pspec `%s' from pool", pspec->name); + G_SUNLOCK (&pool->smutex); + } + else + { + g_return_if_fail (pool != NULL); + g_return_if_fail (pspec); + } +} + +static inline GParamSpec* +param_spec_ht_lookup (GHashTable *hash_table, + const gchar *param_name, + GType owner_type, + gboolean walk_ancestors) +{ + GParamSpec key, *pspec; + + key.owner_type = owner_type; + key.name = (gchar*) param_name; + if (walk_ancestors) + do + { + pspec = g_hash_table_lookup (hash_table, &key); + if (pspec) + return pspec; + key.owner_type = g_type_parent (key.owner_type); + } + while (key.owner_type); + else + pspec = g_hash_table_lookup (hash_table, &key); + + if (!pspec && !is_canonical (param_name)) + { + /* try canonicalized form */ + key.name = g_strdup (param_name); + key.owner_type = owner_type; + + canonicalize_key (key.name); + if (walk_ancestors) + do + { + pspec = g_hash_table_lookup (hash_table, &key); + if (pspec) + { + g_free (key.name); + return pspec; + } + key.owner_type = g_type_parent (key.owner_type); + } + while (key.owner_type); + else + pspec = g_hash_table_lookup (hash_table, &key); + g_free (key.name); + } + + return pspec; +} + +/** + * g_param_spec_pool_lookup: + * @pool: a #GParamSpecPool + * @param_name: the name to look for + * @owner_type: the owner to look for + * @walk_ancestors: If %TRUE, also try to find a #GParamSpec with @param_name + * owned by an ancestor of @owner_type. + * + * Looks up a #GParamSpec in the pool. + * + * Returns: The found #GParamSpec, or %NULL if no matching #GParamSpec was found. + */ +GParamSpec* +g_param_spec_pool_lookup (GParamSpecPool *pool, + const gchar *param_name, + GType owner_type, + gboolean walk_ancestors) +{ + GParamSpec *pspec; + gchar *delim; + + if (!pool || !param_name) + { + g_return_val_if_fail (pool != NULL, NULL); + g_return_val_if_fail (param_name != NULL, NULL); + } + + G_SLOCK (&pool->smutex); + + delim = pool->type_prefixing ? strchr (param_name, ':') : NULL; + + /* try quick and away, i.e. without prefix */ + if (!delim) + { + pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors); + G_SUNLOCK (&pool->smutex); + + return pspec; + } + + /* strip type prefix */ + if (pool->type_prefixing && delim[1] == ':') + { + guint l = delim - param_name; + gchar stack_buffer[32], *buffer = l < 32 ? stack_buffer : g_new (gchar, l + 1); + GType type; + + strncpy (buffer, param_name, delim - param_name); + buffer[l] = 0; + type = g_type_from_name (buffer); + if (l >= 32) + g_free (buffer); + if (type) /* type==0 isn't a valid type pefix */ + { + /* sanity check, these cases don't make a whole lot of sense */ + if ((!walk_ancestors && type != owner_type) || !g_type_is_a (owner_type, type)) + { + G_SUNLOCK (&pool->smutex); + + return NULL; + } + owner_type = type; + param_name += l + 2; + pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors); + G_SUNLOCK (&pool->smutex); + + return pspec; + } + } + /* malformed param_name */ + + G_SUNLOCK (&pool->smutex); + + return NULL; +} + +static void +pool_list (gpointer key, + gpointer value, + gpointer user_data) +{ + GParamSpec *pspec = value; + gpointer *data = user_data; + GType owner_type = (GType) data[1]; + + if (owner_type == pspec->owner_type) + data[0] = g_list_prepend (data[0], pspec); +} + +/** + * g_param_spec_pool_list_owned: + * @pool: a #GParamSpecPool + * @owner_type: the owner to look for + * + * Gets an #GList of all #GParamSpecs owned by @owner_type in + * the pool. + * + * Returns: a #GList of all #GParamSpecs owned by @owner_type + * in the pool#GParamSpecs. + */ +GList* +g_param_spec_pool_list_owned (GParamSpecPool *pool, + GType owner_type) +{ + gpointer data[2]; + + g_return_val_if_fail (pool != NULL, NULL); + g_return_val_if_fail (owner_type > 0, NULL); + + G_SLOCK (&pool->smutex); + data[0] = NULL; + data[1] = (gpointer) owner_type; + g_hash_table_foreach (pool->hash_table, pool_list, &data); + G_SUNLOCK (&pool->smutex); + + return data[0]; +} + +static gint +pspec_compare_id (gconstpointer a, + gconstpointer b) +{ + const GParamSpec *pspec1 = a, *pspec2 = b; + + return pspec1->param_id < pspec2->param_id ? -1 : pspec1->param_id > pspec2->param_id; +} + +static inline GSList* +pspec_list_remove_overridden_and_redirected (GSList *plist, + GHashTable *ht, + GType owner_type, + guint *n_p) +{ + GSList *rlist = NULL; + + while (plist) + { + GSList *tmp = plist->next; + GParamSpec *pspec = plist->data; + GParamSpec *found; + gboolean remove = FALSE; + + /* Remove paramspecs that are redirected, and also paramspecs + * that have are overridden by non-redirected properties. + * The idea is to get the single paramspec for each name that + * best corresponds to what the application sees. + */ + if (g_param_spec_get_redirect_target (pspec)) + remove = TRUE; + else + { + found = param_spec_ht_lookup (ht, pspec->name, owner_type, TRUE); + if (found != pspec) + { + GParamSpec *redirect = g_param_spec_get_redirect_target (found); + if (redirect != pspec) + remove = TRUE; + } + } + + if (remove) + { + g_slist_free_1 (plist); + } + else + { + plist->next = rlist; + rlist = plist; + *n_p += 1; + } + plist = tmp; + } + return rlist; +} + +static void +pool_depth_list (gpointer key, + gpointer value, + gpointer user_data) +{ + GParamSpec *pspec = value; + gpointer *data = user_data; + GSList **slists = data[0]; + GType owner_type = (GType) data[1]; + + if (g_type_is_a (owner_type, pspec->owner_type)) + { + if (G_TYPE_IS_INTERFACE (pspec->owner_type)) + { + slists[0] = g_slist_prepend (slists[0], pspec); + } + else + { + guint d = g_type_depth (pspec->owner_type); + + slists[d - 1] = g_slist_prepend (slists[d - 1], pspec); + } + } +} + +/* We handle interfaces specially since we don't want to + * count interface prerequisites like normal inheritance; + * the property comes from the direct inheritance from + * the prerequisite class, not from the interface that + * prerequires it. + * + * also 'depth' isn't a meaningful concept for interface + * prerequites. + */ +static void +pool_depth_list_for_interface (gpointer key, + gpointer value, + gpointer user_data) +{ + GParamSpec *pspec = value; + gpointer *data = user_data; + GSList **slists = data[0]; + GType owner_type = (GType) data[1]; + + if (pspec->owner_type == owner_type) + slists[0] = g_slist_prepend (slists[0], pspec); +} + +/** + * g_param_spec_pool_list: + * @pool: a #GParamSpecPool + * @owner_type: the owner to look for + * @n_pspecs_p: return location for the length of the returned array + * + * Gets an array of all #GParamSpecs owned by @owner_type in + * the pool. + * + * Returns: a newly allocated array containing pointers to all + * #GParamSpecs owned by @owner_type in the pool + */ +GParamSpec** +g_param_spec_pool_list (GParamSpecPool *pool, + GType owner_type, + guint *n_pspecs_p) +{ + GParamSpec **pspecs, **p; + GSList **slists, *node; + gpointer data[2]; + guint d, i; + + g_return_val_if_fail (pool != NULL, NULL); + g_return_val_if_fail (owner_type > 0, NULL); + g_return_val_if_fail (n_pspecs_p != NULL, NULL); + + G_SLOCK (&pool->smutex); + *n_pspecs_p = 0; + d = g_type_depth (owner_type); + slists = g_new0 (GSList*, d); + data[0] = slists; + data[1] = (gpointer) owner_type; + + g_hash_table_foreach (pool->hash_table, + G_TYPE_IS_INTERFACE (owner_type) ? + pool_depth_list_for_interface : + pool_depth_list, + &data); + + for (i = 0; i < d; i++) + slists[i] = pspec_list_remove_overridden_and_redirected (slists[i], pool->hash_table, owner_type, n_pspecs_p); + pspecs = g_new (GParamSpec*, *n_pspecs_p + 1); + p = pspecs; + for (i = 0; i < d; i++) + { + slists[i] = g_slist_sort (slists[i], pspec_compare_id); + for (node = slists[i]; node; node = node->next) + *p++ = node->data; + g_slist_free (slists[i]); + } + *p++ = NULL; + g_free (slists); + G_SUNLOCK (&pool->smutex); + + return pspecs; +} + + +/* --- auxillary functions --- */ +typedef struct +{ + /* class portion */ + GType value_type; + void (*finalize) (GParamSpec *pspec); + void (*value_set_default) (GParamSpec *pspec, + GValue *value); + gboolean (*value_validate) (GParamSpec *pspec, + GValue *value); + gint (*values_cmp) (GParamSpec *pspec, + const GValue *value1, + const GValue *value2); +} ParamSpecClassInfo; + +static void +param_spec_generic_class_init (gpointer g_class, + gpointer class_data) +{ + GParamSpecClass *class = g_class; + ParamSpecClassInfo *info = class_data; + + class->value_type = info->value_type; + if (info->finalize) + class->finalize = info->finalize; /* optional */ + class->value_set_default = info->value_set_default; + if (info->value_validate) + class->value_validate = info->value_validate; /* optional */ + class->values_cmp = info->values_cmp; + g_free (class_data); +} + +static void +default_value_set_default (GParamSpec *pspec, + GValue *value) +{ + /* value is already zero initialized */ +} + +static gint +default_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + return memcmp (&value1->data, &value2->data, sizeof (value1->data)); +} + +/** + * g_param_type_register_static: + * @name: 0-terminated string used as the name of the new #GParamSpec type. + * @pspec_info: The #GParamSpecTypeInfo for this #GParamSpec type. + * + * Registers @name as the name of a new static type derived from + * #G_TYPE_PARAM. The type system uses the information contained in + * the #GParamSpecTypeInfo structure pointed to by @info to manage the + * #GParamSpec type and its instances. + * + * Returns: The new type identifier. + */ +GType +g_param_type_register_static (const gchar *name, + const GParamSpecTypeInfo *pspec_info) +{ + GTypeInfo info = { + sizeof (GParamSpecClass), /* class_size */ + NULL, /* base_init */ + NULL, /* base_destroy */ + param_spec_generic_class_init, /* class_init */ + NULL, /* class_destroy */ + NULL, /* class_data */ + 0, /* instance_size */ + 16, /* n_preallocs */ + NULL, /* instance_init */ + }; + ParamSpecClassInfo *cinfo; + + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (pspec_info != NULL, 0); + g_return_val_if_fail (g_type_from_name (name) == 0, 0); + g_return_val_if_fail (pspec_info->instance_size >= sizeof (GParamSpec), 0); + g_return_val_if_fail (g_type_name (pspec_info->value_type) != NULL, 0); + /* default: g_return_val_if_fail (pspec_info->value_set_default != NULL, 0); */ + /* optional: g_return_val_if_fail (pspec_info->value_validate != NULL, 0); */ + /* default: g_return_val_if_fail (pspec_info->values_cmp != NULL, 0); */ + + info.instance_size = pspec_info->instance_size; + info.n_preallocs = pspec_info->n_preallocs; + info.instance_init = (GInstanceInitFunc) pspec_info->instance_init; + cinfo = g_new (ParamSpecClassInfo, 1); + cinfo->value_type = pspec_info->value_type; + cinfo->finalize = pspec_info->finalize; + cinfo->value_set_default = pspec_info->value_set_default ? pspec_info->value_set_default : default_value_set_default; + cinfo->value_validate = pspec_info->value_validate; + cinfo->values_cmp = pspec_info->values_cmp ? pspec_info->values_cmp : default_values_cmp; + info.class_data = cinfo; + + return g_type_register_static (G_TYPE_PARAM, name, &info, 0); +} + +/** + * g_value_set_param: + * @value: a valid #GValue of type %G_TYPE_PARAM + * @param: the #GParamSpec to be set + * + * Set the contents of a %G_TYPE_PARAM #GValue to @param. + */ +void +g_value_set_param (GValue *value, + GParamSpec *param) +{ + g_return_if_fail (G_VALUE_HOLDS_PARAM (value)); + if (param) + g_return_if_fail (G_IS_PARAM_SPEC (param)); + + if (value->data[0].v_pointer) + g_param_spec_unref (value->data[0].v_pointer); + value->data[0].v_pointer = param; + if (value->data[0].v_pointer) + g_param_spec_ref (value->data[0].v_pointer); +} + +/** + * g_value_set_param_take_ownership: + * @value: a valid #GValue of type %G_TYPE_PARAM + * @param: the #GParamSpec to be set + * + * This is an internal function introduced mainly for C marshallers. + * + * Deprecated: 2.4: Use g_value_take_param() instead. + */ +void +g_value_set_param_take_ownership (GValue *value, + GParamSpec *param) +{ + g_value_take_param (value, param); +} + +/** + * g_value_take_param: + * @value: a valid #GValue of type %G_TYPE_PARAM + * @param: the #GParamSpec to be set + * + * Sets the contents of a %G_TYPE_PARAM #GValue to @param and takes + * over the ownership of the callers reference to @param; the caller + * doesn't have to unref it any more. + * + * Since: 2.4 + */ +void +g_value_take_param (GValue *value, + GParamSpec *param) +{ + g_return_if_fail (G_VALUE_HOLDS_PARAM (value)); + if (param) + g_return_if_fail (G_IS_PARAM_SPEC (param)); + + if (value->data[0].v_pointer) + g_param_spec_unref (value->data[0].v_pointer); + value->data[0].v_pointer = param; /* we take over the reference count */ +} + +/** + * g_value_get_param: + * @value: a valid #GValue whose type is derived from %G_TYPE_PARAM + * + * Get the contents of a %G_TYPE_PARAM #GValue. + * + * Returns: #GParamSpec content of @value + */ +GParamSpec* +g_value_get_param (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_PARAM (value), NULL); + + return value->data[0].v_pointer; +} + +/** + * g_value_dup_param: + * @value: a valid #GValue whose type is derived from %G_TYPE_PARAM + * + * Get the contents of a %G_TYPE_PARAM #GValue, increasing its + * reference count. + * + * Returns: #GParamSpec content of @value, should be unreferenced when + * no longer needed. + */ +GParamSpec* +g_value_dup_param (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_PARAM (value), NULL); + + return value->data[0].v_pointer ? g_param_spec_ref (value->data[0].v_pointer) : NULL; +} + +#define __G_PARAM_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gparam.h b/gobject/gparam.h new file mode 100644 index 0000000..d377876 --- /dev/null +++ b/gobject/gparam.h @@ -0,0 +1,410 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gparam.h: GParamSpec base class implementation + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_PARAM_H__ +#define __G_PARAM_H__ + +#include + +G_BEGIN_DECLS + +/* --- standard type macros --- */ +/** + * G_TYPE_IS_PARAM: + * @type: a #GType ID + * + * Checks whether @type "is a" %G_TYPE_PARAM. + */ +#define G_TYPE_IS_PARAM(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_PARAM) +/** + * G_PARAM_SPEC: + * @pspec: a valid #GParamSpec + * + * Casts a derived #GParamSpec object (e.g. of type #GParamSpecInt) into + * a #GParamSpec object. + */ +#define G_PARAM_SPEC(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM, GParamSpec)) +/** + * G_IS_PARAM_SPEC: + * @pspec: a #GParamSpec + * + * Checks whether @pspec "is a" valid #GParamSpec structure of type %G_TYPE_PARAM + * or derived. + */ +#define G_IS_PARAM_SPEC(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM)) +/** + * G_PARAM_SPEC_CLASS: + * @pclass: a valid #GParamSpecClass + * + * Casts a derived #GParamSpecClass structure into a #GParamSpecClass structure. + */ +#define G_PARAM_SPEC_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), G_TYPE_PARAM, GParamSpecClass)) +/** + * G_IS_PARAM_SPEC_CLASS: + * @pclass: a #GParamSpecClass + * + * Checks whether @pclass "is a" valid #GParamSpecClass structure of type + * %G_TYPE_PARAM or derived. + */ +#define G_IS_PARAM_SPEC_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), G_TYPE_PARAM)) +/** + * G_PARAM_SPEC_GET_CLASS: + * @pspec: a valid #GParamSpec + * + * Retrieves the #GParamSpecClass of a #GParamSpec. + */ +#define G_PARAM_SPEC_GET_CLASS(pspec) (G_TYPE_INSTANCE_GET_CLASS ((pspec), G_TYPE_PARAM, GParamSpecClass)) + + +/* --- convenience macros --- */ +/** + * G_PARAM_SPEC_TYPE: + * @pspec: a valid #GParamSpec + * + * Retrieves the #GType of this @pspec. + */ +#define G_PARAM_SPEC_TYPE(pspec) (G_TYPE_FROM_INSTANCE (pspec)) +/** + * G_PARAM_SPEC_TYPE_NAME: + * @pspec: a valid #GParamSpec + * + * Retrieves the #GType name of this @pspec. + */ +#define G_PARAM_SPEC_TYPE_NAME(pspec) (g_type_name (G_PARAM_SPEC_TYPE (pspec))) +/** + * G_PARAM_SPEC_VALUE_TYPE: + * @pspec: a valid #GParamSpec + * + * Retrieves the #GType to initialize a #GValue for this parameter. + */ +#define G_PARAM_SPEC_VALUE_TYPE(pspec) (G_PARAM_SPEC (pspec)->value_type) +/** + * G_VALUE_HOLDS_PARAM: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values derived from type %G_TYPE_PARAM. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_PARAM(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_PARAM)) + + +/* --- flags --- */ +/** + * GParamFlags: + * @G_PARAM_READABLE: the parameter is readable + * @G_PARAM_WRITABLE: the parameter is writable + * @G_PARAM_CONSTRUCT: the parameter will be set upon object construction + * @G_PARAM_CONSTRUCT_ONLY: the parameter will only be set upon object construction + * @G_PARAM_LAX_VALIDATION: upon parameter conversion (see g_param_value_convert()) + * strict validation is not required + * @G_PARAM_STATIC_NAME: the string used as name when constructing the + * parameter is guaranteed to remain valid and + * unmodified for the lifetime of the parameter. + * Since 2.8 + * @G_PARAM_STATIC_NICK: the string used as nick when constructing the + * parameter is guaranteed to remain valid and + * unmmodified for the lifetime of the parameter. + * Since 2.8 + * @G_PARAM_STATIC_BLURB: the string used as blurb when constructing the + * parameter is guaranteed to remain valid and + * unmodified for the lifetime of the parameter. + * Since 2.8 + * @G_PARAM_PRIVATE: internal + * + * Through the #GParamFlags flag values, certain aspects of parameters + * can be configured. + */ +typedef enum +{ + G_PARAM_READABLE = 1 << 0, + G_PARAM_WRITABLE = 1 << 1, + G_PARAM_CONSTRUCT = 1 << 2, + G_PARAM_CONSTRUCT_ONLY = 1 << 3, + G_PARAM_LAX_VALIDATION = 1 << 4, + G_PARAM_STATIC_NAME = 1 << 5, +#ifndef G_DISABLE_DEPRECATED + G_PARAM_PRIVATE = G_PARAM_STATIC_NAME, +#endif + G_PARAM_STATIC_NICK = 1 << 6, + G_PARAM_STATIC_BLURB = 1 << 7 +} GParamFlags; +/** + * G_PARAM_READWRITE: + * + * #GParamFlags value alias for %G_PARAM_READABLE | %G_PARAM_WRITABLE. + */ +#define G_PARAM_READWRITE (G_PARAM_READABLE | G_PARAM_WRITABLE) +/** + * G_PARAM_STATIC_STRINGS: + * + * #GParamFlags value alias for %G_PARAM_STATIC_NAME | %G_PARAM_STATIC_NICK | %G_PARAM_STATIC_BLURB. + * + * Since 2.13.0 + */ +#define G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB) +/* bits in the range 0xffffff00 are reserved for 3rd party usage */ +/** + * G_PARAM_MASK: + * + * Mask containing the bits of #GParamSpec.flags which are reserved for GLib. + */ +#define G_PARAM_MASK (0x000000ff) +/** + * G_PARAM_USER_SHIFT: + * + * Minimum shift count to be used for user defined flags, to be stored in + * #GParamSpec.flags. + */ +#define G_PARAM_USER_SHIFT (8) + + +/* --- typedefs & structures --- */ +typedef struct _GParamSpec GParamSpec; +typedef struct _GParamSpecClass GParamSpecClass; +typedef struct _GParameter GParameter; +typedef struct _GParamSpecPool GParamSpecPool; +/** + * GParamSpec: + * @g_type_instance: private #GTypeInstance portion + * @name: name of this parameter + * @flags: #GParamFlags flags for this parameter + * @value_type: the #GValue type for this parameter + * @owner_type: #GType type that uses (introduces) this paremeter + * + * All other fields of the GParamSpec struct are private and + * should not be used directly. + */ +struct _GParamSpec +{ + GTypeInstance g_type_instance; + + gchar *name; + GParamFlags flags; + GType value_type; + GType owner_type; /* class or interface using this property */ + + /*< private >*/ + gchar *_nick; + gchar *_blurb; + GData *qdata; + guint ref_count; + guint param_id; /* sort-criteria */ +}; +/** + * GParamSpecClass: + * @g_type_class: the parent class + * @value_type: the #GValue type for this parameter + * @finalize: The instance finalization function (optional), should chain + * up to the finalize method of the parent class. + * @value_set_default: Resets a @value to the default value for this type + * (recommended, the default is g_value_reset()), see + * g_param_value_set_default(). + * @value_validate: Ensures that the contents of @value comply with the + * specifications set out by this type (optional), see + * g_param_value_set_validate(). + * @values_cmp: Compares @value1 with @value2 according to this type + * (recommended, the default is memcmp()), see g_param_values_cmp(). + * + * The class structure for the GParamSpec type. + * Normally, GParamSpec classes are filled by + * g_param_type_register_static(). + */ +struct _GParamSpecClass +{ + GTypeClass g_type_class; + + GType value_type; + + void (*finalize) (GParamSpec *pspec); + + /* GParam methods */ + void (*value_set_default) (GParamSpec *pspec, + GValue *value); + gboolean (*value_validate) (GParamSpec *pspec, + GValue *value); + gint (*values_cmp) (GParamSpec *pspec, + const GValue *value1, + const GValue *value2); + /*< private >*/ + gpointer dummy[4]; +}; +/** + * GParameter: + * @name: the parameter name + * @value: the parameter value + * + * The GParameter struct is an auxiliary structure used + * to hand parameter name/value pairs to g_object_newv(). + */ +struct _GParameter /* auxillary structure for _setv() variants */ +{ + const gchar *name; + GValue value; +}; + + +/* --- prototypes --- */ +GParamSpec* g_param_spec_ref (GParamSpec *pspec); +void g_param_spec_unref (GParamSpec *pspec); +void g_param_spec_sink (GParamSpec *pspec); +GParamSpec* g_param_spec_ref_sink (GParamSpec *pspec); +gpointer g_param_spec_get_qdata (GParamSpec *pspec, + GQuark quark); +void g_param_spec_set_qdata (GParamSpec *pspec, + GQuark quark, + gpointer data); +void g_param_spec_set_qdata_full (GParamSpec *pspec, + GQuark quark, + gpointer data, + GDestroyNotify destroy); +gpointer g_param_spec_steal_qdata (GParamSpec *pspec, + GQuark quark); +GParamSpec* g_param_spec_get_redirect_target (GParamSpec *pspec); + +void g_param_value_set_default (GParamSpec *pspec, + GValue *value); +gboolean g_param_value_defaults (GParamSpec *pspec, + GValue *value); +gboolean g_param_value_validate (GParamSpec *pspec, + GValue *value); +gboolean g_param_value_convert (GParamSpec *pspec, + const GValue *src_value, + GValue *dest_value, + gboolean strict_validation); +gint g_param_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2); +G_CONST_RETURN gchar* g_param_spec_get_name (GParamSpec *pspec); +G_CONST_RETURN gchar* g_param_spec_get_nick (GParamSpec *pspec); +G_CONST_RETURN gchar* g_param_spec_get_blurb (GParamSpec *pspec); +void g_value_set_param (GValue *value, + GParamSpec *param); +GParamSpec* g_value_get_param (const GValue *value); +GParamSpec* g_value_dup_param (const GValue *value); + + +void g_value_take_param (GValue *value, + GParamSpec *param); +#ifndef G_DISABLE_DEPRECATED +void g_value_set_param_take_ownership (GValue *value, + GParamSpec *param); +#endif + +/* --- convenience functions --- */ +typedef struct _GParamSpecTypeInfo GParamSpecTypeInfo; +/** + * GParamSpecTypeInfo: + * @instance_size: Size of the instance (object) structure. + * @n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the slice allocator now. + * @instance_init: Location of the instance initialization function (optional). + * @value_type: The #GType of values conforming to this #GParamSpec + * @finalize: The instance finalization function (optional). + * @value_set_default: Resets a @value to the default value for @pspec + * (recommended, the default is g_value_reset()), see + * g_param_value_set_default(). + * @value_validate: Ensures that the contents of @value comply with the + * specifications set out by @pspec (optional), see + * g_param_value_set_validate(). + * @values_cmp: Compares @value1 with @value2 according to @pspec + * (recommended, the default is memcmp()), see g_param_values_cmp(). + * + * This structure is used to provide the type system with the information + * required to initialize and destruct (finalize) a parameter's class and + * instances thereof. + * The initialized structure is passed to the g_param_type_register_static() + * The type system will perform a deep copy of this structure, so its memory + * does not need to be persistent across invocation of + * g_param_type_register_static(). + */ +struct _GParamSpecTypeInfo +{ + /* type system portion */ + guint16 instance_size; /* obligatory */ + guint16 n_preallocs; /* optional */ + void (*instance_init) (GParamSpec *pspec); /* optional */ + + /* class portion */ + GType value_type; /* obligatory */ + void (*finalize) (GParamSpec *pspec); /* optional */ + void (*value_set_default) (GParamSpec *pspec, /* recommended */ + GValue *value); + gboolean (*value_validate) (GParamSpec *pspec, /* optional */ + GValue *value); + gint (*values_cmp) (GParamSpec *pspec, /* recommended */ + const GValue *value1, + const GValue *value2); +}; +GType g_param_type_register_static (const gchar *name, + const GParamSpecTypeInfo *pspec_info); + +/* For registering builting types */ +GType _g_param_type_register_static_constant (const gchar *name, + const GParamSpecTypeInfo *pspec_info, + GType opt_type); + + +/* --- protected --- */ +gpointer g_param_spec_internal (GType param_type, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamFlags flags); +GParamSpecPool* g_param_spec_pool_new (gboolean type_prefixing); +void g_param_spec_pool_insert (GParamSpecPool *pool, + GParamSpec *pspec, + GType owner_type); +void g_param_spec_pool_remove (GParamSpecPool *pool, + GParamSpec *pspec); +GParamSpec* g_param_spec_pool_lookup (GParamSpecPool *pool, + const gchar *param_name, + GType owner_type, + gboolean walk_ancestors); +GList* g_param_spec_pool_list_owned (GParamSpecPool *pool, + GType owner_type); +GParamSpec** g_param_spec_pool_list (GParamSpecPool *pool, + GType owner_type, + guint *n_pspecs_p); + + + +/* contracts: + * + * gboolean value_validate (GParamSpec *pspec, + * GValue *value): + * modify value contents in the least destructive way, so + * that it complies with pspec's requirements (i.e. + * according to minimum/maximum ranges etc...). return + * whether modification was necessary. + * + * gint values_cmp (GParamSpec *pspec, + * const GValue *value1, + * const GValue *value2): + * return value1 - value2, i.e. (-1) if value1 < value2, + * (+1) if value1 > value2, and (0) otherwise (equality) + */ + +G_END_DECLS + +#endif /* __G_PARAM_H__ */ diff --git a/gobject/gparamspecs.c b/gobject/gparamspecs.c new file mode 100644 index 0000000..2f49824 --- /dev/null +++ b/gobject/gparamspecs.c @@ -0,0 +1,2397 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include + +#include "gparamspecs.h" +#include "gvaluecollector.h" +#include "gvaluearray.h" +#include "gobjectalias.h" + + +/** + * SECTION:param_value_types + * @short_description: Standard Parameter and Value Types + * @see_also: #GParamSpec, #GValue, g_object_class_install_property(). + * @title: Parameters and Values + * + * #GValue provides an abstract container structure which can be + * copied, transformed and compared while holding a value of any + * (derived) type, which is registered as a #GType with a + * #GTypeValueTable in its #GTypeInfo structure. Parameter + * specifications for most value types can be created as #GParamSpec + * derived instances, to implement e.g. #GObject properties which + * operate on #GValue containers. + * + * Parameter names need to start with a letter (a-z or A-Z). Subsequent + * characters can be letters, numbers or a '-'. + * All other characters are replaced by a '-' during construction. + */ + + +#define G_FLOAT_EPSILON (1e-30) +#define G_DOUBLE_EPSILON (1e-90) + + +/* --- param spec functions --- */ +static void +param_char_init (GParamSpec *pspec) +{ + GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec); + + cspec->minimum = 0x7f; + cspec->maximum = 0x80; + cspec->default_value = 0; +} + +static void +param_char_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_int = G_PARAM_SPEC_CHAR (pspec)->default_value; +} + +static gboolean +param_char_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec); + gint oval = value->data[0].v_int; + + value->data[0].v_int = CLAMP (value->data[0].v_int, cspec->minimum, cspec->maximum); + + return value->data[0].v_int != oval; +} + +static void +param_uchar_init (GParamSpec *pspec) +{ + GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec); + + uspec->minimum = 0; + uspec->maximum = 0xff; + uspec->default_value = 0; +} + +static void +param_uchar_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_uint = G_PARAM_SPEC_UCHAR (pspec)->default_value; +} + +static gboolean +param_uchar_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec); + guint oval = value->data[0].v_uint; + + value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum); + + return value->data[0].v_uint != oval; +} + +static void +param_boolean_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_int = G_PARAM_SPEC_BOOLEAN (pspec)->default_value; +} + +static gboolean +param_boolean_validate (GParamSpec *pspec, + GValue *value) +{ + gint oval = value->data[0].v_int; + + value->data[0].v_int = value->data[0].v_int != FALSE; + + return value->data[0].v_int != oval; +} + +static void +param_int_init (GParamSpec *pspec) +{ + GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec); + + ispec->minimum = 0x7fffffff; + ispec->maximum = 0x80000000; + ispec->default_value = 0; +} + +static void +param_int_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_int = G_PARAM_SPEC_INT (pspec)->default_value; +} + +static gboolean +param_int_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec); + gint oval = value->data[0].v_int; + + value->data[0].v_int = CLAMP (value->data[0].v_int, ispec->minimum, ispec->maximum); + + return value->data[0].v_int != oval; +} + +static gint +param_int_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_int < value2->data[0].v_int) + return -1; + else + return value1->data[0].v_int > value2->data[0].v_int; +} + +static void +param_uint_init (GParamSpec *pspec) +{ + GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec); + + uspec->minimum = 0; + uspec->maximum = 0xffffffff; + uspec->default_value = 0; +} + +static void +param_uint_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_uint = G_PARAM_SPEC_UINT (pspec)->default_value; +} + +static gboolean +param_uint_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec); + guint oval = value->data[0].v_uint; + + value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum); + + return value->data[0].v_uint != oval; +} + +static gint +param_uint_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_uint < value2->data[0].v_uint) + return -1; + else + return value1->data[0].v_uint > value2->data[0].v_uint; +} + +static void +param_long_init (GParamSpec *pspec) +{ + GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec); + +#if SIZEOF_LONG == 4 + lspec->minimum = 0x7fffffff; + lspec->maximum = 0x80000000; +#else /* SIZEOF_LONG != 4 (8) */ + lspec->minimum = 0x7fffffffffffffff; + lspec->maximum = 0x8000000000000000; +#endif + lspec->default_value = 0; +} + +static void +param_long_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_long = G_PARAM_SPEC_LONG (pspec)->default_value; +} + +static gboolean +param_long_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec); + glong oval = value->data[0].v_long; + + value->data[0].v_long = CLAMP (value->data[0].v_long, lspec->minimum, lspec->maximum); + + return value->data[0].v_long != oval; +} + +static gint +param_long_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_long < value2->data[0].v_long) + return -1; + else + return value1->data[0].v_long > value2->data[0].v_long; +} + +static void +param_ulong_init (GParamSpec *pspec) +{ + GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec); + + uspec->minimum = 0; +#if SIZEOF_LONG == 4 + uspec->maximum = 0xffffffff; +#else /* SIZEOF_LONG != 4 (8) */ + uspec->maximum = 0xffffffffffffffff; +#endif + uspec->default_value = 0; +} + +static void +param_ulong_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_ulong = G_PARAM_SPEC_ULONG (pspec)->default_value; +} + +static gboolean +param_ulong_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec); + gulong oval = value->data[0].v_ulong; + + value->data[0].v_ulong = CLAMP (value->data[0].v_ulong, uspec->minimum, uspec->maximum); + + return value->data[0].v_ulong != oval; +} + +static gint +param_ulong_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_ulong < value2->data[0].v_ulong) + return -1; + else + return value1->data[0].v_ulong > value2->data[0].v_ulong; +} + +static void +param_int64_init (GParamSpec *pspec) +{ + GParamSpecInt64 *lspec = G_PARAM_SPEC_INT64 (pspec); + + lspec->minimum = G_MININT64; + lspec->maximum = G_MAXINT64; + lspec->default_value = 0; +} + +static void +param_int64_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_int64 = G_PARAM_SPEC_INT64 (pspec)->default_value; +} + +static gboolean +param_int64_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecInt64 *lspec = G_PARAM_SPEC_INT64 (pspec); + gint64 oval = value->data[0].v_int64; + + value->data[0].v_int64 = CLAMP (value->data[0].v_int64, lspec->minimum, lspec->maximum); + + return value->data[0].v_int64 != oval; +} + +static gint +param_int64_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_int64 < value2->data[0].v_int64) + return -1; + else + return value1->data[0].v_int64 > value2->data[0].v_int64; +} + +static void +param_uint64_init (GParamSpec *pspec) +{ + GParamSpecUInt64 *uspec = G_PARAM_SPEC_UINT64 (pspec); + + uspec->minimum = 0; + uspec->maximum = G_MAXUINT64; + uspec->default_value = 0; +} + +static void +param_uint64_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_uint64 = G_PARAM_SPEC_UINT64 (pspec)->default_value; +} + +static gboolean +param_uint64_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecUInt64 *uspec = G_PARAM_SPEC_UINT64 (pspec); + guint64 oval = value->data[0].v_uint64; + + value->data[0].v_uint64 = CLAMP (value->data[0].v_uint64, uspec->minimum, uspec->maximum); + + return value->data[0].v_uint64 != oval; +} + +static gint +param_uint64_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_uint64 < value2->data[0].v_uint64) + return -1; + else + return value1->data[0].v_uint64 > value2->data[0].v_uint64; +} + +static void +param_unichar_init (GParamSpec *pspec) +{ + GParamSpecUnichar *uspec = G_PARAM_SPEC_UNICHAR (pspec); + + uspec->default_value = 0; +} + +static void +param_unichar_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_uint = G_PARAM_SPEC_UNICHAR (pspec)->default_value; +} + +static gboolean +param_unichar_validate (GParamSpec *pspec, + GValue *value) +{ + gunichar oval = value->data[0].v_uint; + gboolean changed = FALSE; + + if (!g_unichar_validate (oval)) + { + value->data[0].v_uint = 0; + changed = TRUE; + } + + return changed; +} + +static gint +param_unichar_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (value1->data[0].v_uint < value2->data[0].v_uint) + return -1; + else + return value1->data[0].v_uint > value2->data[0].v_uint; +} + +static void +param_enum_init (GParamSpec *pspec) +{ + GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec); + + espec->enum_class = NULL; + espec->default_value = 0; +} + +static void +param_enum_finalize (GParamSpec *pspec) +{ + GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec); + GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_ENUM)); + + if (espec->enum_class) + { + g_type_class_unref (espec->enum_class); + espec->enum_class = NULL; + } + + parent_class->finalize (pspec); +} + +static void +param_enum_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_long = G_PARAM_SPEC_ENUM (pspec)->default_value; +} + +static gboolean +param_enum_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec); + glong oval = value->data[0].v_long; + + if (!espec->enum_class || + !g_enum_get_value (espec->enum_class, value->data[0].v_long)) + value->data[0].v_long = espec->default_value; + + return value->data[0].v_long != oval; +} + +static void +param_flags_init (GParamSpec *pspec) +{ + GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec); + + fspec->flags_class = NULL; + fspec->default_value = 0; +} + +static void +param_flags_finalize (GParamSpec *pspec) +{ + GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec); + GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_FLAGS)); + + if (fspec->flags_class) + { + g_type_class_unref (fspec->flags_class); + fspec->flags_class = NULL; + } + + parent_class->finalize (pspec); +} + +static void +param_flags_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_ulong = G_PARAM_SPEC_FLAGS (pspec)->default_value; +} + +static gboolean +param_flags_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec); + gulong oval = value->data[0].v_ulong; + + if (fspec->flags_class) + value->data[0].v_ulong &= fspec->flags_class->mask; + else + value->data[0].v_ulong = fspec->default_value; + + return value->data[0].v_ulong != oval; +} + +static void +param_float_init (GParamSpec *pspec) +{ + GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec); + + fspec->minimum = -G_MAXFLOAT; + fspec->maximum = G_MAXFLOAT; + fspec->default_value = 0; + fspec->epsilon = G_FLOAT_EPSILON; +} + +static void +param_float_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_float = G_PARAM_SPEC_FLOAT (pspec)->default_value; +} + +static gboolean +param_float_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec); + gfloat oval = value->data[0].v_float; + + value->data[0].v_float = CLAMP (value->data[0].v_float, fspec->minimum, fspec->maximum); + + return value->data[0].v_float != oval; +} + +static gint +param_float_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + gfloat epsilon = G_PARAM_SPEC_FLOAT (pspec)->epsilon; + + if (value1->data[0].v_float < value2->data[0].v_float) + return - (value2->data[0].v_float - value1->data[0].v_float > epsilon); + else + return value1->data[0].v_float - value2->data[0].v_float > epsilon; +} + +static void +param_double_init (GParamSpec *pspec) +{ + GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec); + + dspec->minimum = -G_MAXDOUBLE; + dspec->maximum = G_MAXDOUBLE; + dspec->default_value = 0; + dspec->epsilon = G_DOUBLE_EPSILON; +} + +static void +param_double_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_double = G_PARAM_SPEC_DOUBLE (pspec)->default_value; +} + +static gboolean +param_double_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec); + gdouble oval = value->data[0].v_double; + + value->data[0].v_double = CLAMP (value->data[0].v_double, dspec->minimum, dspec->maximum); + + return value->data[0].v_double != oval; +} + +static gint +param_double_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + gdouble epsilon = G_PARAM_SPEC_DOUBLE (pspec)->epsilon; + + if (value1->data[0].v_double < value2->data[0].v_double) + return - (value2->data[0].v_double - value1->data[0].v_double > epsilon); + else + return value1->data[0].v_double - value2->data[0].v_double > epsilon; +} + +static void +param_string_init (GParamSpec *pspec) +{ + GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec); + + sspec->default_value = NULL; + sspec->cset_first = NULL; + sspec->cset_nth = NULL; + sspec->substitutor = '_'; + sspec->null_fold_if_empty = FALSE; + sspec->ensure_non_null = FALSE; +} + +static void +param_string_finalize (GParamSpec *pspec) +{ + GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec); + GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_STRING)); + + g_free (sspec->default_value); + g_free (sspec->cset_first); + g_free (sspec->cset_nth); + sspec->default_value = NULL; + sspec->cset_first = NULL; + sspec->cset_nth = NULL; + + parent_class->finalize (pspec); +} + +static void +param_string_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_pointer = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value); +} + +static gboolean +param_string_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec); + gchar *string = value->data[0].v_pointer; + guint changed = 0; + + if (string && string[0]) + { + gchar *s; + + if (sspec->cset_first && !strchr (sspec->cset_first, string[0])) + { + if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + { + value->data[0].v_pointer = g_strdup (string); + string = value->data[0].v_pointer; + value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS; + } + string[0] = sspec->substitutor; + changed++; + } + if (sspec->cset_nth) + for (s = string + 1; *s; s++) + if (!strchr (sspec->cset_nth, *s)) + { + if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + { + value->data[0].v_pointer = g_strdup (string); + s = (gchar*) value->data[0].v_pointer + (s - string); + string = value->data[0].v_pointer; + value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS; + } + *s = sspec->substitutor; + changed++; + } + } + if (sspec->null_fold_if_empty && string && string[0] == 0) + { + if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) + g_free (value->data[0].v_pointer); + else + value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS; + value->data[0].v_pointer = NULL; + changed++; + string = value->data[0].v_pointer; + } + if (sspec->ensure_non_null && !string) + { + value->data[1].v_uint &= ~G_VALUE_NOCOPY_CONTENTS; + value->data[0].v_pointer = g_strdup (""); + changed++; + string = value->data[0].v_pointer; + } + + return changed; +} + +static gint +param_string_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + if (!value1->data[0].v_pointer) + return value2->data[0].v_pointer != NULL ? -1 : 0; + else if (!value2->data[0].v_pointer) + return value1->data[0].v_pointer != NULL; + else + return strcmp (value1->data[0].v_pointer, value2->data[0].v_pointer); +} + +static void +param_param_init (GParamSpec *pspec) +{ + /* GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec); */ +} + +static void +param_param_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static gboolean +param_param_validate (GParamSpec *pspec, + GValue *value) +{ + /* GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec); */ + GParamSpec *param = value->data[0].v_pointer; + guint changed = 0; + + if (param && !g_value_type_compatible (G_PARAM_SPEC_TYPE (param), G_PARAM_SPEC_VALUE_TYPE (pspec))) + { + g_param_spec_unref (param); + value->data[0].v_pointer = NULL; + changed++; + } + + return changed; +} + +static void +param_boxed_init (GParamSpec *pspec) +{ + /* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */ +} + +static void +param_boxed_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static gboolean +param_boxed_validate (GParamSpec *pspec, + GValue *value) +{ + /* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */ + guint changed = 0; + + /* can't do a whole lot here since we haven't even G_BOXED_TYPE() */ + + return changed; +} + +static gint +param_boxed_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + guint8 *p1 = value1->data[0].v_pointer; + guint8 *p2 = value2->data[0].v_pointer; + + /* not much to compare here, try to at least provide stable lesser/greater result */ + + return p1 < p2 ? -1 : p1 > p2; +} + +static void +param_pointer_init (GParamSpec *pspec) +{ + /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */ +} + +static void +param_pointer_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static gboolean +param_pointer_validate (GParamSpec *pspec, + GValue *value) +{ + /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */ + guint changed = 0; + + return changed; +} + +static gint +param_pointer_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + guint8 *p1 = value1->data[0].v_pointer; + guint8 *p2 = value2->data[0].v_pointer; + + /* not much to compare here, try to at least provide stable lesser/greater result */ + + return p1 < p2 ? -1 : p1 > p2; +} + +static void +param_value_array_init (GParamSpec *pspec) +{ + GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec); + + aspec->element_spec = NULL; + aspec->fixed_n_elements = 0; /* disable */ +} + +static inline guint +value_array_ensure_size (GValueArray *value_array, + guint fixed_n_elements) +{ + guint changed = 0; + + if (fixed_n_elements) + { + while (value_array->n_values < fixed_n_elements) + { + g_value_array_append (value_array, NULL); + changed++; + } + while (value_array->n_values > fixed_n_elements) + { + g_value_array_remove (value_array, value_array->n_values - 1); + changed++; + } + } + return changed; +} + +static void +param_value_array_finalize (GParamSpec *pspec) +{ + GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec); + GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_VALUE_ARRAY)); + + if (aspec->element_spec) + { + g_param_spec_unref (aspec->element_spec); + aspec->element_spec = NULL; + } + + parent_class->finalize (pspec); +} + +static void +param_value_array_set_default (GParamSpec *pspec, + GValue *value) +{ + GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec); + + if (!value->data[0].v_pointer && aspec->fixed_n_elements) + value->data[0].v_pointer = g_value_array_new (aspec->fixed_n_elements); + + if (value->data[0].v_pointer) + { + /* g_value_reset (value); already done */ + value_array_ensure_size (value->data[0].v_pointer, aspec->fixed_n_elements); + } +} + +static gboolean +param_value_array_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec); + GValueArray *value_array = value->data[0].v_pointer; + guint changed = 0; + + if (!value->data[0].v_pointer && aspec->fixed_n_elements) + value->data[0].v_pointer = g_value_array_new (aspec->fixed_n_elements); + + if (value->data[0].v_pointer) + { + /* ensure array size validity */ + changed += value_array_ensure_size (value_array, aspec->fixed_n_elements); + + /* ensure array values validity against a present element spec */ + if (aspec->element_spec) + { + GParamSpec *element_spec = aspec->element_spec; + guint i; + + for (i = 0; i < value_array->n_values; i++) + { + GValue *element = value_array->values + i; + + /* need to fixup value type, or ensure that the array value is initialized at all */ + if (!g_value_type_compatible (G_VALUE_TYPE (element), G_PARAM_SPEC_VALUE_TYPE (element_spec))) + { + if (G_VALUE_TYPE (element) != 0) + g_value_unset (element); + g_value_init (element, G_PARAM_SPEC_VALUE_TYPE (element_spec)); + g_param_value_set_default (element_spec, element); + changed++; + } + /* validate array value against element_spec */ + changed += g_param_value_validate (element_spec, element); + } + } + } + + return changed; +} + +static gint +param_value_array_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + GParamSpecValueArray *aspec = G_PARAM_SPEC_VALUE_ARRAY (pspec); + GValueArray *value_array1 = value1->data[0].v_pointer; + GValueArray *value_array2 = value2->data[0].v_pointer; + + if (!value_array1 || !value_array2) + return value_array2 ? -1 : value_array1 != value_array2; + + if (value_array1->n_values != value_array2->n_values) + return value_array1->n_values < value_array2->n_values ? -1 : 1; + else if (!aspec->element_spec) + { + /* we need an element specification for comparisons, so there's not much + * to compare here, try to at least provide stable lesser/greater result + */ + return value_array1->n_values < value_array2->n_values ? -1 : value_array1->n_values > value_array2->n_values; + } + else /* value_array1->n_values == value_array2->n_values */ + { + guint i; + + for (i = 0; i < value_array1->n_values; i++) + { + GValue *element1 = value_array1->values + i; + GValue *element2 = value_array2->values + i; + gint cmp; + + /* need corresponding element types, provide stable result otherwise */ + if (G_VALUE_TYPE (element1) != G_VALUE_TYPE (element2)) + return G_VALUE_TYPE (element1) < G_VALUE_TYPE (element2) ? -1 : 1; + cmp = g_param_values_cmp (aspec->element_spec, element1, element2); + if (cmp) + return cmp; + } + return 0; + } +} + +static void +param_object_init (GParamSpec *pspec) +{ + /* GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec); */ +} + +static void +param_object_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static gboolean +param_object_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec); + GObject *object = value->data[0].v_pointer; + guint changed = 0; + + if (object && !g_value_type_compatible (G_OBJECT_TYPE (object), G_PARAM_SPEC_VALUE_TYPE (ospec))) + { + g_object_unref (object); + value->data[0].v_pointer = NULL; + changed++; + } + + return changed; +} + +static gint +param_object_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + guint8 *p1 = value1->data[0].v_pointer; + guint8 *p2 = value2->data[0].v_pointer; + + /* not much to compare here, try to at least provide stable lesser/greater result */ + + return p1 < p2 ? -1 : p1 > p2; +} + +static void +param_override_init (GParamSpec *pspec) +{ + /* GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); */ +} + +static void +param_override_finalize (GParamSpec *pspec) +{ + GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); + GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_OVERRIDE)); + + if (ospec->overridden) + { + g_param_spec_unref (ospec->overridden); + ospec->overridden = NULL; + } + + parent_class->finalize (pspec); +} + +static void +param_override_set_default (GParamSpec *pspec, + GValue *value) +{ + GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); + + g_param_value_set_default (ospec->overridden, value); +} + +static gboolean +param_override_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); + + return g_param_value_validate (ospec->overridden, value); +} + +static gint +param_override_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + GParamSpecOverride *ospec = G_PARAM_SPEC_OVERRIDE (pspec); + + return g_param_values_cmp (ospec->overridden, value1, value2); +} + +static void +param_gtype_init (GParamSpec *pspec) +{ +} + +static void +param_gtype_set_default (GParamSpec *pspec, + GValue *value) +{ + GParamSpecGType *tspec = G_PARAM_SPEC_GTYPE (pspec); + + value->data[0].v_long = tspec->is_a_type; +} + +static gboolean +param_gtype_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecGType *tspec = G_PARAM_SPEC_GTYPE (pspec); + GType gtype = value->data[0].v_long; + guint changed = 0; + + if (tspec->is_a_type != G_TYPE_NONE && !g_type_is_a (gtype, tspec->is_a_type)) + { + value->data[0].v_long = tspec->is_a_type; + changed++; + } + + return changed; +} + +static gint +param_gtype_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + GType p1 = value1->data[0].v_long; + GType p2 = value2->data[0].v_long; + + /* not much to compare here, try to at least provide stable lesser/greater result */ + + return p1 < p2 ? -1 : p1 > p2; +} + +/* --- type initialization --- */ +GType *g_param_spec_types = NULL; + +void +g_param_spec_types_init (void) +{ + const guint n_types = 22; + GType type, *spec_types, *spec_types_bound; + + g_param_spec_types = g_new0 (GType, n_types); + spec_types = g_param_spec_types; + spec_types_bound = g_param_spec_types + n_types; + + /* G_TYPE_PARAM_CHAR + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecChar), /* instance_size */ + 16, /* n_preallocs */ + param_char_init, /* instance_init */ + G_TYPE_CHAR, /* value_type */ + NULL, /* finalize */ + param_char_set_default, /* value_set_default */ + param_char_validate, /* value_validate */ + param_int_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamChar"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_CHAR); + } + + /* G_TYPE_PARAM_UCHAR + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecUChar), /* instance_size */ + 16, /* n_preallocs */ + param_uchar_init, /* instance_init */ + G_TYPE_UCHAR, /* value_type */ + NULL, /* finalize */ + param_uchar_set_default, /* value_set_default */ + param_uchar_validate, /* value_validate */ + param_uint_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamUChar"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_UCHAR); + } + + /* G_TYPE_PARAM_BOOLEAN + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecBoolean), /* instance_size */ + 16, /* n_preallocs */ + NULL, /* instance_init */ + G_TYPE_BOOLEAN, /* value_type */ + NULL, /* finalize */ + param_boolean_set_default, /* value_set_default */ + param_boolean_validate, /* value_validate */ + param_int_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamBoolean"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_BOOLEAN); + } + + /* G_TYPE_PARAM_INT + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecInt), /* instance_size */ + 16, /* n_preallocs */ + param_int_init, /* instance_init */ + G_TYPE_INT, /* value_type */ + NULL, /* finalize */ + param_int_set_default, /* value_set_default */ + param_int_validate, /* value_validate */ + param_int_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamInt"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_INT); + } + + /* G_TYPE_PARAM_UINT + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecUInt), /* instance_size */ + 16, /* n_preallocs */ + param_uint_init, /* instance_init */ + G_TYPE_UINT, /* value_type */ + NULL, /* finalize */ + param_uint_set_default, /* value_set_default */ + param_uint_validate, /* value_validate */ + param_uint_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamUInt"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_UINT); + } + + /* G_TYPE_PARAM_LONG + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecLong), /* instance_size */ + 16, /* n_preallocs */ + param_long_init, /* instance_init */ + G_TYPE_LONG, /* value_type */ + NULL, /* finalize */ + param_long_set_default, /* value_set_default */ + param_long_validate, /* value_validate */ + param_long_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamLong"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_LONG); + } + + /* G_TYPE_PARAM_ULONG + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecULong), /* instance_size */ + 16, /* n_preallocs */ + param_ulong_init, /* instance_init */ + G_TYPE_ULONG, /* value_type */ + NULL, /* finalize */ + param_ulong_set_default, /* value_set_default */ + param_ulong_validate, /* value_validate */ + param_ulong_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamULong"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_ULONG); + } + + /* G_TYPE_PARAM_INT64 + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecInt64), /* instance_size */ + 16, /* n_preallocs */ + param_int64_init, /* instance_init */ + G_TYPE_INT64, /* value_type */ + NULL, /* finalize */ + param_int64_set_default, /* value_set_default */ + param_int64_validate, /* value_validate */ + param_int64_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamInt64"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_INT64); + } + + /* G_TYPE_PARAM_UINT64 + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecUInt64), /* instance_size */ + 16, /* n_preallocs */ + param_uint64_init, /* instance_init */ + G_TYPE_UINT64, /* value_type */ + NULL, /* finalize */ + param_uint64_set_default, /* value_set_default */ + param_uint64_validate, /* value_validate */ + param_uint64_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamUInt64"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_UINT64); + } + + /* G_TYPE_PARAM_UNICHAR + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecUnichar), /* instance_size */ + 16, /* n_preallocs */ + param_unichar_init, /* instance_init */ + G_TYPE_UINT, /* value_type */ + NULL, /* finalize */ + param_unichar_set_default, /* value_set_default */ + param_unichar_validate, /* value_validate */ + param_unichar_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamUnichar"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_UNICHAR); + } + + /* G_TYPE_PARAM_ENUM + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecEnum), /* instance_size */ + 16, /* n_preallocs */ + param_enum_init, /* instance_init */ + G_TYPE_ENUM, /* value_type */ + param_enum_finalize, /* finalize */ + param_enum_set_default, /* value_set_default */ + param_enum_validate, /* value_validate */ + param_long_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamEnum"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_ENUM); + } + + /* G_TYPE_PARAM_FLAGS + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecFlags), /* instance_size */ + 16, /* n_preallocs */ + param_flags_init, /* instance_init */ + G_TYPE_FLAGS, /* value_type */ + param_flags_finalize, /* finalize */ + param_flags_set_default, /* value_set_default */ + param_flags_validate, /* value_validate */ + param_ulong_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamFlags"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_FLAGS); + } + + /* G_TYPE_PARAM_FLOAT + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecFloat), /* instance_size */ + 16, /* n_preallocs */ + param_float_init, /* instance_init */ + G_TYPE_FLOAT, /* value_type */ + NULL, /* finalize */ + param_float_set_default, /* value_set_default */ + param_float_validate, /* value_validate */ + param_float_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamFloat"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_FLOAT); + } + + /* G_TYPE_PARAM_DOUBLE + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecDouble), /* instance_size */ + 16, /* n_preallocs */ + param_double_init, /* instance_init */ + G_TYPE_DOUBLE, /* value_type */ + NULL, /* finalize */ + param_double_set_default, /* value_set_default */ + param_double_validate, /* value_validate */ + param_double_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamDouble"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_DOUBLE); + } + + /* G_TYPE_PARAM_STRING + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecString), /* instance_size */ + 16, /* n_preallocs */ + param_string_init, /* instance_init */ + G_TYPE_STRING, /* value_type */ + param_string_finalize, /* finalize */ + param_string_set_default, /* value_set_default */ + param_string_validate, /* value_validate */ + param_string_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamString"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_STRING); + } + + /* G_TYPE_PARAM_PARAM + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecParam), /* instance_size */ + 16, /* n_preallocs */ + param_param_init, /* instance_init */ + G_TYPE_PARAM, /* value_type */ + NULL, /* finalize */ + param_param_set_default, /* value_set_default */ + param_param_validate, /* value_validate */ + param_pointer_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamParam"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_PARAM); + } + + /* G_TYPE_PARAM_BOXED + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecBoxed), /* instance_size */ + 4, /* n_preallocs */ + param_boxed_init, /* instance_init */ + G_TYPE_BOXED, /* value_type */ + NULL, /* finalize */ + param_boxed_set_default, /* value_set_default */ + param_boxed_validate, /* value_validate */ + param_boxed_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamBoxed"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_BOXED); + } + + /* G_TYPE_PARAM_POINTER + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecPointer), /* instance_size */ + 0, /* n_preallocs */ + param_pointer_init, /* instance_init */ + G_TYPE_POINTER, /* value_type */ + NULL, /* finalize */ + param_pointer_set_default, /* value_set_default */ + param_pointer_validate, /* value_validate */ + param_pointer_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamPointer"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_POINTER); + } + + /* G_TYPE_PARAM_VALUE_ARRAY + */ + { + static /* const */ GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecValueArray), /* instance_size */ + 0, /* n_preallocs */ + param_value_array_init, /* instance_init */ + 0xdeadbeef, /* value_type, assigned further down */ + param_value_array_finalize, /* finalize */ + param_value_array_set_default, /* value_set_default */ + param_value_array_validate, /* value_validate */ + param_value_array_values_cmp, /* values_cmp */ + }; + pspec_info.value_type = G_TYPE_VALUE_ARRAY; + type = g_param_type_register_static (g_intern_static_string ("GParamValueArray"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_VALUE_ARRAY); + } + + /* G_TYPE_PARAM_OBJECT + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecObject), /* instance_size */ + 16, /* n_preallocs */ + param_object_init, /* instance_init */ + G_TYPE_OBJECT, /* value_type */ + NULL, /* finalize */ + param_object_set_default, /* value_set_default */ + param_object_validate, /* value_validate */ + param_object_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamObject"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_OBJECT); + } + + /* G_TYPE_PARAM_OVERRIDE + */ + { + static const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecOverride), /* instance_size */ + 16, /* n_preallocs */ + param_override_init, /* instance_init */ + G_TYPE_NONE, /* value_type */ + param_override_finalize, /* finalize */ + param_override_set_default, /* value_set_default */ + param_override_validate, /* value_validate */ + param_override_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamOverride"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_OVERRIDE); + } + + /* G_TYPE_PARAM_GTYPE + */ + { + GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecGType), /* instance_size */ + 0, /* n_preallocs */ + param_gtype_init, /* instance_init */ + 0xdeadbeef, /* value_type, assigned further down */ + NULL, /* finalize */ + param_gtype_set_default, /* value_set_default */ + param_gtype_validate, /* value_validate */ + param_gtype_values_cmp, /* values_cmp */ + }; + pspec_info.value_type = G_TYPE_GTYPE; + type = g_param_type_register_static (g_intern_static_string ("GParamGType"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_GTYPE); + } + + g_assert (spec_types == spec_types_bound); +} + +/* --- GParamSpec initialization --- */ + +/** + * g_param_spec_char: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecChar instance specifying a %G_TYPE_CHAR property. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_char (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint8 minimum, + gint8 maximum, + gint8 default_value, + GParamFlags flags) +{ + GParamSpecChar *cspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + cspec = g_param_spec_internal (G_TYPE_PARAM_CHAR, + name, + nick, + blurb, + flags); + + cspec->minimum = minimum; + cspec->maximum = maximum; + cspec->default_value = default_value; + + return G_PARAM_SPEC (cspec); +} + +/** + * g_param_spec_uchar: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecUChar instance specifying a %G_TYPE_UCHAR property. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_uchar (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint8 minimum, + guint8 maximum, + guint8 default_value, + GParamFlags flags) +{ + GParamSpecUChar *uspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + uspec = g_param_spec_internal (G_TYPE_PARAM_UCHAR, + name, + nick, + blurb, + flags); + + uspec->minimum = minimum; + uspec->maximum = maximum; + uspec->default_value = default_value; + + return G_PARAM_SPEC (uspec); +} + +/** + * g_param_spec_boolean: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecBoolean instance specifying a %G_TYPE_BOOLEAN + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_boolean (const gchar *name, + const gchar *nick, + const gchar *blurb, + gboolean default_value, + GParamFlags flags) +{ + GParamSpecBoolean *bspec; + + g_return_val_if_fail (default_value == TRUE || default_value == FALSE, NULL); + + bspec = g_param_spec_internal (G_TYPE_PARAM_BOOLEAN, + name, + nick, + blurb, + flags); + + bspec->default_value = default_value; + + return G_PARAM_SPEC (bspec); +} + +/** + * g_param_spec_int: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecInt instance specifying a %G_TYPE_INT property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_int (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint minimum, + gint maximum, + gint default_value, + GParamFlags flags) +{ + GParamSpecInt *ispec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + ispec = g_param_spec_internal (G_TYPE_PARAM_INT, + name, + nick, + blurb, + flags); + + ispec->minimum = minimum; + ispec->maximum = maximum; + ispec->default_value = default_value; + + return G_PARAM_SPEC (ispec); +} + +/** + * g_param_spec_uint: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecUInt instance specifying a %G_TYPE_UINT property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_uint (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint minimum, + guint maximum, + guint default_value, + GParamFlags flags) +{ + GParamSpecUInt *uspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + uspec = g_param_spec_internal (G_TYPE_PARAM_UINT, + name, + nick, + blurb, + flags); + + uspec->minimum = minimum; + uspec->maximum = maximum; + uspec->default_value = default_value; + + return G_PARAM_SPEC (uspec); +} + +/** + * g_param_spec_long: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecLong instance specifying a %G_TYPE_LONG property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_long (const gchar *name, + const gchar *nick, + const gchar *blurb, + glong minimum, + glong maximum, + glong default_value, + GParamFlags flags) +{ + GParamSpecLong *lspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + lspec = g_param_spec_internal (G_TYPE_PARAM_LONG, + name, + nick, + blurb, + flags); + + lspec->minimum = minimum; + lspec->maximum = maximum; + lspec->default_value = default_value; + + return G_PARAM_SPEC (lspec); +} + +/** + * g_param_spec_ulong: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecULong instance specifying a %G_TYPE_ULONG + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_ulong (const gchar *name, + const gchar *nick, + const gchar *blurb, + gulong minimum, + gulong maximum, + gulong default_value, + GParamFlags flags) +{ + GParamSpecULong *uspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + uspec = g_param_spec_internal (G_TYPE_PARAM_ULONG, + name, + nick, + blurb, + flags); + + uspec->minimum = minimum; + uspec->maximum = maximum; + uspec->default_value = default_value; + + return G_PARAM_SPEC (uspec); +} + +/** + * g_param_spec_int64: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecInt64 instance specifying a %G_TYPE_INT64 property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_int64 (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint64 minimum, + gint64 maximum, + gint64 default_value, + GParamFlags flags) +{ + GParamSpecInt64 *lspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + lspec = g_param_spec_internal (G_TYPE_PARAM_INT64, + name, + nick, + blurb, + flags); + + lspec->minimum = minimum; + lspec->maximum = maximum; + lspec->default_value = default_value; + + return G_PARAM_SPEC (lspec); +} + +/** + * g_param_spec_uint64: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecUInt64 instance specifying a %G_TYPE_UINT64 + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_uint64 (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint64 minimum, + guint64 maximum, + guint64 default_value, + GParamFlags flags) +{ + GParamSpecUInt64 *uspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + uspec = g_param_spec_internal (G_TYPE_PARAM_UINT64, + name, + nick, + blurb, + flags); + + uspec->minimum = minimum; + uspec->maximum = maximum; + uspec->default_value = default_value; + + return G_PARAM_SPEC (uspec); +} + +/** + * g_param_spec_unichar: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecUnichar instance specifying a %G_TYPE_UINT + * property. #GValue structures for this property can be accessed with + * g_value_set_uint() and g_value_get_uint(). + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_unichar (const gchar *name, + const gchar *nick, + const gchar *blurb, + gunichar default_value, + GParamFlags flags) +{ + GParamSpecUnichar *uspec; + + uspec = g_param_spec_internal (G_TYPE_PARAM_UNICHAR, + name, + nick, + blurb, + flags); + + uspec->default_value = default_value; + + return G_PARAM_SPEC (uspec); +} + +/** + * g_param_spec_enum: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @enum_type: a #GType derived from %G_TYPE_ENUM + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecEnum instance specifying a %G_TYPE_ENUM + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_enum (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType enum_type, + gint default_value, + GParamFlags flags) +{ + GParamSpecEnum *espec; + GEnumClass *enum_class; + + g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL); + + enum_class = g_type_class_ref (enum_type); + + g_return_val_if_fail (g_enum_get_value (enum_class, default_value) != NULL, NULL); + + espec = g_param_spec_internal (G_TYPE_PARAM_ENUM, + name, + nick, + blurb, + flags); + + espec->enum_class = enum_class; + espec->default_value = default_value; + G_PARAM_SPEC (espec)->value_type = enum_type; + + return G_PARAM_SPEC (espec); +} + +/** + * g_param_spec_flags: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @flags_type: a #GType derived from %G_TYPE_FLAGS + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecFlags instance specifying a %G_TYPE_FLAGS + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_flags (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType flags_type, + guint default_value, + GParamFlags flags) +{ + GParamSpecFlags *fspec; + GFlagsClass *flags_class; + + g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL); + + flags_class = g_type_class_ref (flags_type); + + g_return_val_if_fail ((default_value & flags_class->mask) == default_value, NULL); + + fspec = g_param_spec_internal (G_TYPE_PARAM_FLAGS, + name, + nick, + blurb, + flags); + + fspec->flags_class = flags_class; + fspec->default_value = default_value; + G_PARAM_SPEC (fspec)->value_type = flags_type; + + return G_PARAM_SPEC (fspec); +} + +/** + * g_param_spec_float: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecFloat instance specifying a %G_TYPE_FLOAT property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_float (const gchar *name, + const gchar *nick, + const gchar *blurb, + gfloat minimum, + gfloat maximum, + gfloat default_value, + GParamFlags flags) +{ + GParamSpecFloat *fspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + fspec = g_param_spec_internal (G_TYPE_PARAM_FLOAT, + name, + nick, + blurb, + flags); + + fspec->minimum = minimum; + fspec->maximum = maximum; + fspec->default_value = default_value; + + return G_PARAM_SPEC (fspec); +} + +/** + * g_param_spec_double: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecDouble instance specifying a %G_TYPE_DOUBLE + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_double (const gchar *name, + const gchar *nick, + const gchar *blurb, + gdouble minimum, + gdouble maximum, + gdouble default_value, + GParamFlags flags) +{ + GParamSpecDouble *dspec; + + g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL); + + dspec = g_param_spec_internal (G_TYPE_PARAM_DOUBLE, + name, + nick, + blurb, + flags); + + dspec->minimum = minimum; + dspec->maximum = maximum; + dspec->default_value = default_value; + + return G_PARAM_SPEC (dspec); +} + +/** + * g_param_spec_string: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @default_value: default value for the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecString instance. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_string (const gchar *name, + const gchar *nick, + const gchar *blurb, + const gchar *default_value, + GParamFlags flags) +{ + GParamSpecString *sspec = g_param_spec_internal (G_TYPE_PARAM_STRING, + name, + nick, + blurb, + flags); + g_free (sspec->default_value); + sspec->default_value = g_strdup (default_value); + + return G_PARAM_SPEC (sspec); +} + +/** + * g_param_spec_param: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @param_type: a #GType derived from %G_TYPE_PARAM + * @flags: flags for the property specified + * + * Creates a new #GParamSpecParam instance specifying a %G_TYPE_PARAM + * property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_param (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType param_type, + GParamFlags flags) +{ + GParamSpecParam *pspec; + + g_return_val_if_fail (G_TYPE_IS_PARAM (param_type), NULL); + + pspec = g_param_spec_internal (G_TYPE_PARAM_PARAM, + name, + nick, + blurb, + flags); + G_PARAM_SPEC (pspec)->value_type = param_type; + + return G_PARAM_SPEC (pspec); +} + +/** + * g_param_spec_boxed: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @boxed_type: %G_TYPE_BOXED derived type of this property + * @flags: flags for the property specified + * + * Creates a new #GParamSpecBoxed instance specifying a %G_TYPE_BOXED + * derived property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_boxed (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType boxed_type, + GParamFlags flags) +{ + GParamSpecBoxed *bspec; + + g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL); + g_return_val_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type), NULL); + + bspec = g_param_spec_internal (G_TYPE_PARAM_BOXED, + name, + nick, + blurb, + flags); + G_PARAM_SPEC (bspec)->value_type = boxed_type; + + return G_PARAM_SPEC (bspec); +} + +/** + * g_param_spec_pointer: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @flags: flags for the property specified + * + * Creates a new #GParamSpecPoiner instance specifying a pointer property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_pointer (const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamFlags flags) +{ + GParamSpecPointer *pspec; + + pspec = g_param_spec_internal (G_TYPE_PARAM_POINTER, + name, + nick, + blurb, + flags); + return G_PARAM_SPEC (pspec); +} + +/** + * g_param_spec_gtype: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @is_a_type: a #GType whose subtypes are allowed as values + * of the property (use %G_TYPE_NONE for any type) + * @flags: flags for the property specified + * + * Creates a new #GParamSpecGType instance specifying a + * %G_TYPE_GTYPE property. + * + * See g_param_spec_internal() for details on property names. + * + * Since: 2.10 + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_gtype (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType is_a_type, + GParamFlags flags) +{ + GParamSpecGType *tspec; + + tspec = g_param_spec_internal (G_TYPE_PARAM_GTYPE, + name, + nick, + blurb, + flags); + + tspec->is_a_type = is_a_type; + + return G_PARAM_SPEC (tspec); +} + +/** + * g_param_spec_value_array: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @element_spec: a #GParamSpec describing the elements contained in + * arrays of this property, may be %NULL + * @flags: flags for the property specified + * + * Creates a new #GParamSpecValueArray instance specifying a + * %G_TYPE_VALUE_ARRAY property. %G_TYPE_VALUE_ARRAY is a + * %G_TYPE_BOXED type, as such, #GValue structures for this property + * can be accessed with g_value_set_boxed() and g_value_get_boxed(). + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_value_array (const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamSpec *element_spec, + GParamFlags flags) +{ + GParamSpecValueArray *aspec; + + if (element_spec) + g_return_val_if_fail (G_IS_PARAM_SPEC (element_spec), NULL); + + aspec = g_param_spec_internal (G_TYPE_PARAM_VALUE_ARRAY, + name, + nick, + blurb, + flags); + if (element_spec) + { + aspec->element_spec = g_param_spec_ref (element_spec); + g_param_spec_sink (element_spec); + } + + return G_PARAM_SPEC (aspec); +} + +/** + * g_param_spec_object: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @object_type: %G_TYPE_OBJECT derived type of this property + * @flags: flags for the property specified + * + * Creates a new #GParamSpecBoxed instance specifying a %G_TYPE_OBJECT + * derived property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: a newly created parameter specification + */ +GParamSpec* +g_param_spec_object (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags) +{ + GParamSpecObject *ospec; + + g_return_val_if_fail (g_type_is_a (object_type, G_TYPE_OBJECT), NULL); + + ospec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, + name, + nick, + blurb, + flags); + G_PARAM_SPEC (ospec)->value_type = object_type; + + return G_PARAM_SPEC (ospec); +} + +/** + * g_param_spec_override: + * @name: the name of the property. + * @overridden: The property that is being overridden + * + * Creates a new property of type #GParamSpecOverride. This is used + * to direct operations to another paramspec, and will not be directly + * useful unless you are implementing a new base type similar to GObject. + * + * Since: 2.4 + * + * Returns: the newly created #GParamSpec + */ +GParamSpec* +g_param_spec_override (const gchar *name, + GParamSpec *overridden) +{ + GParamSpec *pspec; + + g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail (G_IS_PARAM_SPEC (overridden), NULL); + + /* Dereference further redirections for property that was passed in + */ + while (TRUE) + { + GParamSpec *indirect = g_param_spec_get_redirect_target (overridden); + if (indirect) + overridden = indirect; + else + break; + } + + pspec = g_param_spec_internal (G_TYPE_PARAM_OVERRIDE, + name, NULL, NULL, + overridden->flags); + + pspec->value_type = G_PARAM_SPEC_VALUE_TYPE (overridden); + G_PARAM_SPEC_OVERRIDE (pspec)->overridden = g_param_spec_ref (overridden); + + return pspec; +} + +#define __G_PARAMSPECS_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gparamspecs.h b/gobject/gparamspecs.h new file mode 100644 index 0000000..345db03 --- /dev/null +++ b/gobject/gparamspecs.h @@ -0,0 +1,1083 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gparamspecs.h: GLib default param specs + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_PARAMSPECS_H__ +#define __G_PARAMSPECS_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +/** + * G_TYPE_PARAM_CHAR: + * + * The #GType of #GParamSpecChar. + */ +#define G_TYPE_PARAM_CHAR (g_param_spec_types[0]) +/** + * G_IS_PARAM_SPEC_CHAR: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_CHAR. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_CHAR)) +/** + * G_PARAM_SPEC_CHAR: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecChar. + */ +#define G_PARAM_SPEC_CHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_CHAR, GParamSpecChar)) + +/** + * G_TYPE_PARAM_UCHAR: + * + * The #GType of #GParamSpecUChar. + */ +#define G_TYPE_PARAM_UCHAR (g_param_spec_types[1]) +/** + * G_IS_PARAM_SPEC_UCHAR: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UCHAR. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UCHAR)) +/** + * G_PARAM_SPEC_UCHAR: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecUChar. + */ +#define G_PARAM_SPEC_UCHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UCHAR, GParamSpecUChar)) + +/** + * G_TYPE_PARAM_BOOLEAN: + * + * The #GType of #GParamSpecBoolean. + */ +#define G_TYPE_PARAM_BOOLEAN (g_param_spec_types[2]) +/** + * G_IS_PARAM_SPEC_BOOLEAN: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_BOOLEAN. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOOLEAN)) +/** + * G_PARAM_SPEC_BOOLEAN: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecBoolean. + */ +#define G_PARAM_SPEC_BOOLEAN(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOOLEAN, GParamSpecBoolean)) + +/** + * G_TYPE_PARAM_INT: + * + * The #GType of #GParamSpecInt. + */ +#define G_TYPE_PARAM_INT (g_param_spec_types[3]) +/** + * G_IS_PARAM_SPEC_INT: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_INT. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT)) +/** + * G_PARAM_SPEC_INT: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecInt. + */ +#define G_PARAM_SPEC_INT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT, GParamSpecInt)) + +/** + * G_TYPE_PARAM_UINT: + * + * The #GType of #GParamSpecUInt. + */ +#define G_TYPE_PARAM_UINT (g_param_spec_types[4]) +/** + * G_IS_PARAM_SPEC_UINT: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UINT. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT)) +/** + * G_PARAM_SPEC_UINT: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecUInt. + */ +#define G_PARAM_SPEC_UINT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT, GParamSpecUInt)) + +/** + * G_TYPE_PARAM_LONG: + * + * The #GType of #GParamSpecLong. + */ +#define G_TYPE_PARAM_LONG (g_param_spec_types[5]) +/** + * G_IS_PARAM_SPEC_LONG: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_LONG. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_LONG)) +/** + * G_PARAM_SPEC_LONG: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecLong. + */ +#define G_PARAM_SPEC_LONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong)) + +/** + * G_TYPE_PARAM_ULONG: + * + * The #GType of #GParamSpecULong. + */ +#define G_TYPE_PARAM_ULONG (g_param_spec_types[6]) +/** + * G_IS_PARAM_SPEC_ULONG: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_ULONG. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG)) +/** + * G_PARAM_SPEC_ULONG: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecULong. + */ +#define G_PARAM_SPEC_ULONG(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong)) + +/** + * G_TYPE_PARAM_INT64: + * + * The #GType of #GParamSpecInt64. + */ +#define G_TYPE_PARAM_INT64 (g_param_spec_types[7]) +/** + * G_IS_PARAM_SPEC_INT64: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_INT64. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_INT64(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT64)) +/** + * G_PARAM_SPEC_INT64: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecInt64. + */ +#define G_PARAM_SPEC_INT64(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT64, GParamSpecInt64)) + +/** + * G_TYPE_PARAM_UINT64: + * + * The #GType of #GParamSpecUInt64. + */ +#define G_TYPE_PARAM_UINT64 (g_param_spec_types[8]) +/** + * G_IS_PARAM_SPEC_UINT64: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UINT64. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_UINT64(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64)) +/** + * G_PARAM_SPEC_UINT64: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecUInt64. + */ +#define G_PARAM_SPEC_UINT64(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT64, GParamSpecUInt64)) + +/** + * G_TYPE_PARAM_UNICHAR: + * + * The #GType of #GParamSpecUnichar. + */ +#define G_TYPE_PARAM_UNICHAR (g_param_spec_types[9]) +/** + * G_PARAM_SPEC_UNICHAR: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecUnichar. + */ +#define G_PARAM_SPEC_UNICHAR(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UNICHAR, GParamSpecUnichar)) +/** + * G_IS_PARAM_SPEC_UNICHAR: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_UNICHAR. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_UNICHAR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UNICHAR)) + +/** + * G_TYPE_PARAM_ENUM: + * + * The #GType of #GParamSpecEnum. + */ +#define G_TYPE_PARAM_ENUM (g_param_spec_types[10]) +/** + * G_IS_PARAM_SPEC_ENUM: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_ENUM. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM)) +/** + * G_PARAM_SPEC_ENUM: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecEnum. + */ +#define G_PARAM_SPEC_ENUM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ENUM, GParamSpecEnum)) + +/** + * G_TYPE_PARAM_FLAGS: + * + * The #GType of #GParamSpecFlags. + */ +#define G_TYPE_PARAM_FLAGS (g_param_spec_types[11]) +/** + * G_IS_PARAM_SPEC_FLAGS: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_FLAGS. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLAGS)) +/** + * G_PARAM_SPEC_FLAGS: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecFlags. + */ +#define G_PARAM_SPEC_FLAGS(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLAGS, GParamSpecFlags)) + +/** + * G_TYPE_PARAM_FLOAT: + * + * The #GType of #GParamSpecFloat. + */ +#define G_TYPE_PARAM_FLOAT (g_param_spec_types[12]) +/** + * G_IS_PARAM_SPEC_FLOAT: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_FLOAT. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_FLOAT)) +/** + * G_PARAM_SPEC_FLOAT: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecFloat. + */ +#define G_PARAM_SPEC_FLOAT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_FLOAT, GParamSpecFloat)) + +/** + * G_TYPE_PARAM_DOUBLE: + * + * The #GType of #GParamSpecDouble. + */ +#define G_TYPE_PARAM_DOUBLE (g_param_spec_types[13]) +/** + * G_IS_PARAM_SPEC_DOUBLE: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_DOUBLE. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_DOUBLE)) +/** + * G_PARAM_SPEC_DOUBLE: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecDouble. + */ +#define G_PARAM_SPEC_DOUBLE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_DOUBLE, GParamSpecDouble)) + +/** + * G_TYPE_PARAM_STRING: + * + * The #GType of #GParamSpecString. + */ +#define G_TYPE_PARAM_STRING (g_param_spec_types[14]) +/** + * G_IS_PARAM_SPEC_STRING: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_STRING. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_STRING)) +/** + * G_PARAM_SPEC_STRING: + * @pspec: a valid #GParamSpec instance + * + * Casts a #GParamSpec instance into a #GParamSpecString. + */ +#define G_PARAM_SPEC_STRING(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_STRING, GParamSpecString)) + +/** + * G_TYPE_PARAM_PARAM: + * + * The #GType of #GParamSpecParam. + */ +#define G_TYPE_PARAM_PARAM (g_param_spec_types[15]) +/** + * G_IS_PARAM_SPEC_PARAM: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_PARAM. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_PARAM)) +/** + * G_PARAM_SPEC_PARAM: + * @pspec: a valid #GParamSpec instance + * + * Casts a #GParamSpec instance into a #GParamSpecParam. + */ +#define G_PARAM_SPEC_PARAM(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_PARAM, GParamSpecParam)) + +/** + * G_TYPE_PARAM_BOXED: + * + * The #GType of #GParamSpecBoxed. + */ +#define G_TYPE_PARAM_BOXED (g_param_spec_types[16]) +/** + * G_IS_PARAM_SPEC_BOXED: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_BOXED. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_BOXED)) +/** + * G_PARAM_SPEC_BOXED: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecBoxed. + */ +#define G_PARAM_SPEC_BOXED(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_BOXED, GParamSpecBoxed)) + +/** + * G_TYPE_PARAM_POINTER: + * + * The #GType of #GParamSpecPointer. + */ +#define G_TYPE_PARAM_POINTER (g_param_spec_types[17]) +/** + * G_IS_PARAM_SPEC_POINTER: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_POINTER. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_POINTER)) +/** + * G_PARAM_SPEC_POINTER: + * @pspec: a valid #GParamSpec instance + * + * Casts a #GParamSpec instance into a #GParamSpecPointer. + */ +#define G_PARAM_SPEC_POINTER(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_POINTER, GParamSpecPointer)) + +/** + * G_TYPE_PARAM_VALUE_ARRAY: + * + * The #GType of #GParamSpecValueArray. + */ +#define G_TYPE_PARAM_VALUE_ARRAY (g_param_spec_types[18]) +/** + * G_IS_PARAM_SPEC_VALUE_ARRAY: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_VALUE_ARRAY. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VALUE_ARRAY)) +/** + * G_PARAM_SPEC_VALUE_ARRAY: + * @pspec: a valid #GParamSpec instance + * + * Cast a #GParamSpec instance into a #GParamSpecValueArray. + */ +#define G_PARAM_SPEC_VALUE_ARRAY(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VALUE_ARRAY, GParamSpecValueArray)) + +/** + * G_TYPE_PARAM_OBJECT: + * + * The #GType of #GParamSpecObject. + */ +#define G_TYPE_PARAM_OBJECT (g_param_spec_types[19]) +/** + * G_IS_PARAM_SPEC_OBJECT: + * @pspec: a valid #GParamSpec instance + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_OBJECT. + * + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OBJECT)) +/** + * G_PARAM_SPEC_OBJECT: + * @pspec: a valid #GParamSpec instance + * + * Casts a #GParamSpec instance into a #GParamSpecObject. + */ +#define G_PARAM_SPEC_OBJECT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OBJECT, GParamSpecObject)) + +/** + * G_TYPE_PARAM_OVERRIDE: + * + * The #GType of #GParamSpecOverride. + * + * Since: 2.4 + */ +#define G_TYPE_PARAM_OVERRIDE (g_param_spec_types[20]) +/** + * G_IS_PARAM_SPEC_OVERRIDE: + * @pspec: a #GParamSpec + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_OVERRIDE. + * + * Since: 2.4 + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_OVERRIDE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_OVERRIDE)) +/** + * G_PARAM_SPEC_OVERRIDE: + * @pspec: a #GParamSpec + * + * Casts a #GParamSpec into a #GParamSpecOverride. + * + * Since: 2.4 + */ +#define G_PARAM_SPEC_OVERRIDE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_OVERRIDE, GParamSpecOverride)) + +/** + * G_TYPE_PARAM_GTYPE: + * + * The #GType of #GParamSpecGType. + * + * Since: 2.10 + */ +#define G_TYPE_PARAM_GTYPE (g_param_spec_types[21]) +/** + * G_IS_PARAM_SPEC_GTYPE: + * @pspec: a #GParamSpec + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_GTYPE. + * + * Since: 2.10 + * Returns: %TRUE on success. + */ +#define G_IS_PARAM_SPEC_GTYPE(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_GTYPE)) +/** + * G_PARAM_SPEC_GTYPE: + * @pspec: a #GParamSpec + * + * Casts a #GParamSpec into a #GParamSpecGType. + * + * Since: 2.10 + */ +#define G_PARAM_SPEC_GTYPE(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_GTYPE, GParamSpecGType)) + + +/* --- typedefs & structures --- */ +typedef struct _GParamSpecChar GParamSpecChar; +typedef struct _GParamSpecUChar GParamSpecUChar; +typedef struct _GParamSpecBoolean GParamSpecBoolean; +typedef struct _GParamSpecInt GParamSpecInt; +typedef struct _GParamSpecUInt GParamSpecUInt; +typedef struct _GParamSpecLong GParamSpecLong; +typedef struct _GParamSpecULong GParamSpecULong; +typedef struct _GParamSpecInt64 GParamSpecInt64; +typedef struct _GParamSpecUInt64 GParamSpecUInt64; +typedef struct _GParamSpecUnichar GParamSpecUnichar; +typedef struct _GParamSpecEnum GParamSpecEnum; +typedef struct _GParamSpecFlags GParamSpecFlags; +typedef struct _GParamSpecFloat GParamSpecFloat; +typedef struct _GParamSpecDouble GParamSpecDouble; +typedef struct _GParamSpecString GParamSpecString; +typedef struct _GParamSpecParam GParamSpecParam; +typedef struct _GParamSpecBoxed GParamSpecBoxed; +typedef struct _GParamSpecPointer GParamSpecPointer; +typedef struct _GParamSpecValueArray GParamSpecValueArray; +typedef struct _GParamSpecObject GParamSpecObject; +typedef struct _GParamSpecOverride GParamSpecOverride; +typedef struct _GParamSpecGType GParamSpecGType; + +/** + * GParamSpecChar: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for character properties. + */ +struct _GParamSpecChar +{ + GParamSpec parent_instance; + + gint8 minimum; + gint8 maximum; + gint8 default_value; +}; +/** + * GParamSpecUChar: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for unsigned character properties. + */ +struct _GParamSpecUChar +{ + GParamSpec parent_instance; + + guint8 minimum; + guint8 maximum; + guint8 default_value; +}; +/** + * GParamSpecBoolean: + * @parent_instance: private #GParamSpec portion + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for boolean properties. + */ +struct _GParamSpecBoolean +{ + GParamSpec parent_instance; + + gboolean default_value; +}; +/** + * GParamSpecInt: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for integer properties. + */ +struct _GParamSpecInt +{ + GParamSpec parent_instance; + + gint minimum; + gint maximum; + gint default_value; +}; +/** + * GParamSpecUInt: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for unsigned integer properties. + */ +struct _GParamSpecUInt +{ + GParamSpec parent_instance; + + guint minimum; + guint maximum; + guint default_value; +}; +/** + * GParamSpecLong: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for long integer properties. + */ +struct _GParamSpecLong +{ + GParamSpec parent_instance; + + glong minimum; + glong maximum; + glong default_value; +}; +/** + * GParamSpecULong: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for unsigned long integer properties. + */ +struct _GParamSpecULong +{ + GParamSpec parent_instance; + + gulong minimum; + gulong maximum; + gulong default_value; +}; +/** + * GParamSpecInt64: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for 64bit integer properties. + */ +struct _GParamSpecInt64 +{ + GParamSpec parent_instance; + + gint64 minimum; + gint64 maximum; + gint64 default_value; +}; +/** + * GParamSpecUInt64: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for unsigned 64bit integer properties. + */ +struct _GParamSpecUInt64 +{ + GParamSpec parent_instance; + + guint64 minimum; + guint64 maximum; + guint64 default_value; +}; +/** + * GParamSpecUnichar: + * @parent_instance: private #GParamSpec portion + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for unichar (unsigned integer) properties. + */ +struct _GParamSpecUnichar +{ + GParamSpec parent_instance; + + gunichar default_value; +}; +/** + * GParamSpecEnum: + * @parent_instance: private #GParamSpec portion + * @enum_class: the #GEnumClass for the enum + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for enum + * properties. + */ +struct _GParamSpecEnum +{ + GParamSpec parent_instance; + + GEnumClass *enum_class; + gint default_value; +}; +/** + * GParamSpecFlags: + * @parent_instance: private #GParamSpec portion + * @flags_class: the #GFlagsClass for the flags + * @default_value: default value for the property specified + * + * A #GParamSpec derived structure that contains the meta data for flags + * properties. + */ +struct _GParamSpecFlags +{ + GParamSpec parent_instance; + + GFlagsClass *flags_class; + guint default_value; +}; +/** + * GParamSpecFloat: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @epsilon: values closer than @epsilon will be considered identical + * by g_param_values_cmp(); the default value is 1e-30. + * + * A #GParamSpec derived structure that contains the meta data for float properties. + */ +struct _GParamSpecFloat +{ + GParamSpec parent_instance; + + gfloat minimum; + gfloat maximum; + gfloat default_value; + gfloat epsilon; +}; +/** + * GParamSpecDouble: + * @parent_instance: private #GParamSpec portion + * @minimum: minimum value for the property specified + * @maximum: maximum value for the property specified + * @default_value: default value for the property specified + * @epsilon: values closer than @epsilon will be considered identical + * by g_param_values_cmp(); the default value is 1e-90. + * + * A #GParamSpec derived structure that contains the meta data for double properties. + */ +struct _GParamSpecDouble +{ + GParamSpec parent_instance; + + gdouble minimum; + gdouble maximum; + gdouble default_value; + gdouble epsilon; +}; +/** + * GParamSpecString: + * @parent_instance: private #GParamSpec portion + * @default_value: default value for the property specified + * @cset_first: a string containing the allowed values for the first byte + * @cset_nth: a string containing the allowed values for the subsequent bytes + * @substitutor: the replacement byte for bytes which don't match @cset_first or @cset_nth. + * @null_fold_if_empty: replace empty string by %NULL + * @ensure_non_null: replace %NULL strings by an empty string + * + * A #GParamSpec derived structure that contains the meta data for string + * properties. + */ +struct _GParamSpecString +{ + GParamSpec parent_instance; + + gchar *default_value; + gchar *cset_first; + gchar *cset_nth; + gchar substitutor; + guint null_fold_if_empty : 1; + guint ensure_non_null : 1; +}; +/** + * GParamSpecParam: + * @parent_instance: private #GParamSpec portion + * + * A #GParamSpec derived structure that contains the meta data for %G_TYPE_PARAM + * properties. + */ +struct _GParamSpecParam +{ + GParamSpec parent_instance; +}; +/** + * GParamSpecBoxed: + * @parent_instance: private #GParamSpec portion + * + * A #GParamSpec derived structure that contains the meta data for boxed properties. + */ +struct _GParamSpecBoxed +{ + GParamSpec parent_instance; +}; +/** + * GParamSpecPointer: + * @parent_instance: private #GParamSpec portion + * + * A #GParamSpec derived structure that contains the meta data for pointer properties. + */ +struct _GParamSpecPointer +{ + GParamSpec parent_instance; +}; +/** + * GParamSpecValueArray: + * @parent_instance: private #GParamSpec portion + * @element_spec: a #GParamSpec describing the elements contained in arrays of this property, may be %NULL + * @fixed_n_elements: if greater than 0, arrays of this property will always have this many elements + * + * A #GParamSpec derived structure that contains the meta data for #GValueArray properties. + */ +struct _GParamSpecValueArray +{ + GParamSpec parent_instance; + GParamSpec *element_spec; + guint fixed_n_elements; +}; +/** + * GParamSpecObject: + * @parent_instance: private #GParamSpec portion + * + * A #GParamSpec derived structure that contains the meta data for object properties. + */ +struct _GParamSpecObject +{ + GParamSpec parent_instance; +}; +/** + * GParamSpecOverride: + * + * This is a type of #GParamSpec type that simply redirects operations to + * another paramspec. All operations other than getting or + * setting the value are redirected, including accessing the nick and + * blurb, validating a value, and so forth. See + * g_param_spec_get_redirect_target() for retrieving the overidden + * property. #GParamSpecOverride is used in implementing + * g_object_class_override_property(), and will not be directly useful + * unless you are implementing a new base type similar to GObject. + * + * Since: 2.4 + */ +struct _GParamSpecOverride +{ + /*< private >*/ + GParamSpec parent_instance; + GParamSpec *overridden; +}; +/** + * GParamSpecGType: + * @parent_instance: private #GParamSpec portion + * @is_a_type: a #GType whose subtypes can occur as values + * + * A #GParamSpec derived structure that contains the meta data for #GType properties. + * + * Since: 2.10 + */ +struct _GParamSpecGType +{ + GParamSpec parent_instance; + GType is_a_type; +}; + +/* --- GParamSpec prototypes --- */ +GParamSpec* g_param_spec_char (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint8 minimum, + gint8 maximum, + gint8 default_value, + GParamFlags flags); +GParamSpec* g_param_spec_uchar (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint8 minimum, + guint8 maximum, + guint8 default_value, + GParamFlags flags); +GParamSpec* g_param_spec_boolean (const gchar *name, + const gchar *nick, + const gchar *blurb, + gboolean default_value, + GParamFlags flags); +GParamSpec* g_param_spec_int (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint minimum, + gint maximum, + gint default_value, + GParamFlags flags); +GParamSpec* g_param_spec_uint (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint minimum, + guint maximum, + guint default_value, + GParamFlags flags); +GParamSpec* g_param_spec_long (const gchar *name, + const gchar *nick, + const gchar *blurb, + glong minimum, + glong maximum, + glong default_value, + GParamFlags flags); +GParamSpec* g_param_spec_ulong (const gchar *name, + const gchar *nick, + const gchar *blurb, + gulong minimum, + gulong maximum, + gulong default_value, + GParamFlags flags); +GParamSpec* g_param_spec_int64 (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint64 minimum, + gint64 maximum, + gint64 default_value, + GParamFlags flags); +GParamSpec* g_param_spec_uint64 (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint64 minimum, + guint64 maximum, + guint64 default_value, + GParamFlags flags); +GParamSpec* g_param_spec_unichar (const gchar *name, + const gchar *nick, + const gchar *blurb, + gunichar default_value, + GParamFlags flags); +GParamSpec* g_param_spec_enum (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType enum_type, + gint default_value, + GParamFlags flags); +GParamSpec* g_param_spec_flags (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType flags_type, + guint default_value, + GParamFlags flags); +GParamSpec* g_param_spec_float (const gchar *name, + const gchar *nick, + const gchar *blurb, + gfloat minimum, + gfloat maximum, + gfloat default_value, + GParamFlags flags); +GParamSpec* g_param_spec_double (const gchar *name, + const gchar *nick, + const gchar *blurb, + gdouble minimum, + gdouble maximum, + gdouble default_value, + GParamFlags flags); +GParamSpec* g_param_spec_string (const gchar *name, + const gchar *nick, + const gchar *blurb, + const gchar *default_value, + GParamFlags flags); +GParamSpec* g_param_spec_param (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType param_type, + GParamFlags flags); +GParamSpec* g_param_spec_boxed (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType boxed_type, + GParamFlags flags); +GParamSpec* g_param_spec_pointer (const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamFlags flags); +GParamSpec* g_param_spec_value_array (const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamSpec *element_spec, + GParamFlags flags); +GParamSpec* g_param_spec_object (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags); +GParamSpec* g_param_spec_override (const gchar *name, + GParamSpec *overridden); +GParamSpec* g_param_spec_gtype (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType is_a_type, + GParamFlags flags); + +/* --- internal --- */ +/* We prefix variable declarations so they can + * properly get exported in windows dlls. + */ +#ifndef GOBJECT_VAR +# ifdef G_PLATFORM_WIN32 +# ifdef GOBJECT_STATIC_COMPILATION +# define GOBJECT_VAR extern +# else /* !GOBJECT_STATIC_COMPILATION */ +# ifdef GOBJECT_COMPILATION +# ifdef DLL_EXPORT +# define GOBJECT_VAR __declspec(dllexport) +# else /* !DLL_EXPORT */ +# define GOBJECT_VAR extern +# endif /* !DLL_EXPORT */ +# else /* !GOBJECT_COMPILATION */ +# define GOBJECT_VAR extern __declspec(dllimport) +# endif /* !GOBJECT_COMPILATION */ +# endif /* !GOBJECT_STATIC_COMPILATION */ +# else /* !G_PLATFORM_WIN32 */ +# define GOBJECT_VAR extern +# endif /* !G_PLATFORM_WIN32 */ +#endif /* GOBJECT_VAR */ + +GOBJECT_VAR GType *g_param_spec_types; + +G_END_DECLS + +#endif /* __G_PARAMSPECS_H__ */ diff --git a/gobject/gsignal.c b/gobject/gsignal.c new file mode 100644 index 0000000..a5d35eb --- /dev/null +++ b/gobject/gsignal.c @@ -0,0 +1,3440 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000-2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * this code is based on the original GtkSignal implementation + * for the Gtk+ library by Peter Mattis + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include + +#include "gsignal.h" +#include "gbsearcharray.h" +#include "gvaluecollector.h" +#include "gvaluetypes.h" +#include "gboxed.h" +#include "gobject.h" +#include "genums.h" +#include "gobjectalias.h" + + +/** + * SECTION:signals + * @short_description: A means for customization of object behaviour + * and a general purpose notification mechanism + * @title: Signals + * + * The basic concept of the signal system is that of the + * emission of a signal. Signals are introduced + * per-type and are identified through strings. Signals introduced + * for a parent type are available in derived types as well, so + * basically they are a per-type facility that is inherited. A signal + * emission mainly involves invocation of a certain set of callbacks + * in precisely defined manner. There are two main categories of such + * callbacks, per-object + * Although signals can deal with any kind of instantiatable + * type, i'm referring to those types as "object types" in the following, + * simply because that is the context most users will encounter signals in. + * + * ones and user provided ones. + * The per-object callbacks are most often referred to as "object method + * handler" or "default (signal) handler", while user provided callbacks are + * usually just called "signal handler". + * The object method handler is provided at signal creation time (this most + * frequently happens at the end of an object class' creation), while user + * provided handlers are frequently connected and disconnected to/from a certain + * signal on certain object instances. + * + * A signal emission consists of five stages, unless prematurely stopped: + * + * + * 1 - Invocation of the object method handler for %G_SIGNAL_RUN_FIRST signals + * + * + * 2 - Invocation of normal user-provided signal handlers (after flag %FALSE) + * + * + * 3 - Invocation of the object method handler for %G_SIGNAL_RUN_LAST signals + * + * + * 4 - Invocation of user provided signal handlers, connected with an after flag of %TRUE + * + * + * 5 - Invocation of the object method handler for %G_SIGNAL_RUN_CLEANUP signals + * + * + * The user-provided signal handlers are called in the order they were + * connected in. + * All handlers may prematurely stop a signal emission, and any number of + * handlers may be connected, disconnected, blocked or unblocked during + * a signal emission. + * There are certain criteria for skipping user handlers in stages 2 and 4 + * of a signal emission. + * First, user handlers may be blocked, blocked handlers are omitted + * during callback invocation, to return from the "blocked" state, a + * handler has to get unblocked exactly the same amount of times + * it has been blocked before. + * Second, upon emission of a %G_SIGNAL_DETAILED signal, an additional + * "detail" argument passed in to g_signal_emit() has to match the detail + * argument of the signal handler currently subject to invocation. + * Specification of no detail argument for signal handlers (omission of the + * detail part of the signal specification upon connection) serves as a + * wildcard and matches any detail argument passed in to emission. + */ + + +#define REPORT_BUG "please report occurrence circumstances to gtk-devel-list@gnome.org" +#ifdef G_ENABLE_DEBUG +#define IF_DEBUG(debug_type, cond) if ((_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) || cond) +static volatile gpointer g_trace_instance_signals = NULL; +static volatile gpointer g_trap_instance_signals = NULL; +#endif /* G_ENABLE_DEBUG */ + + +/* --- typedefs --- */ +typedef struct _SignalNode SignalNode; +typedef struct _SignalKey SignalKey; +typedef struct _Emission Emission; +typedef struct _Handler Handler; +typedef struct _HandlerList HandlerList; +typedef struct _HandlerMatch HandlerMatch; +typedef enum +{ + EMISSION_STOP, + EMISSION_RUN, + EMISSION_HOOK, + EMISSION_RESTART +} EmissionState; + + +/* --- prototypes --- */ +static inline guint signal_id_lookup (GQuark quark, + GType itype); +static void signal_destroy_R (SignalNode *signal_node); +static inline HandlerList* handler_list_ensure (guint signal_id, + gpointer instance); +static inline HandlerList* handler_list_lookup (guint signal_id, + gpointer instance); +static inline Handler* handler_new (gboolean after); +static void handler_insert (guint signal_id, + gpointer instance, + Handler *handler); +static Handler* handler_lookup (gpointer instance, + gulong handler_id, + guint *signal_id_p); +static inline HandlerMatch* handler_match_prepend (HandlerMatch *list, + Handler *handler, + guint signal_id); +static inline HandlerMatch* handler_match_free1_R (HandlerMatch *node, + gpointer instance); +static HandlerMatch* handlers_find (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data, + gboolean one_and_only); +static inline void handler_ref (Handler *handler); +static inline void handler_unref_R (guint signal_id, + gpointer instance, + Handler *handler); +static gint handler_lists_cmp (gconstpointer node1, + gconstpointer node2); +static inline void emission_push (Emission **emission_list_p, + Emission *emission); +static inline void emission_pop (Emission **emission_list_p, + Emission *emission); +static inline Emission* emission_find (Emission *emission_list, + guint signal_id, + GQuark detail, + gpointer instance); +static gint class_closures_cmp (gconstpointer node1, + gconstpointer node2); +static gint signal_key_cmp (gconstpointer node1, + gconstpointer node2); +static gboolean signal_emit_unlocked_R (SignalNode *node, + GQuark detail, + gpointer instance, + GValue *return_value, + const GValue *instance_and_params); +static const gchar * type_debug_name (GType type); + + +/* --- structures --- */ +typedef struct +{ + GSignalAccumulator func; + gpointer data; +} SignalAccumulator; +typedef struct +{ + GHook hook; + GQuark detail; +} SignalHook; +#define SIGNAL_HOOK(hook) ((SignalHook*) (hook)) + +struct _SignalNode +{ + /* permanent portion */ + guint signal_id; + GType itype; + const gchar *name; + guint destroyed : 1; + + /* reinitializable portion */ + guint test_class_offset : 12; + guint flags : 8; + guint n_params : 8; + GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */ + GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */ + GBSearchArray *class_closure_bsa; + SignalAccumulator *accumulator; + GSignalCMarshaller c_marshaller; + GHookList *emission_hooks; +}; +#define MAX_TEST_CLASS_OFFSET (4096) /* 2^12, 12 bits for test_class_offset */ +#define TEST_CLASS_MAGIC (1) /* indicates NULL class closure, candidate for NOP optimization */ + +struct _SignalKey +{ + GType itype; + GQuark quark; + guint signal_id; +}; + +struct _Emission +{ + Emission *next; + gpointer instance; + GSignalInvocationHint ihint; + EmissionState state; + GType chain_type; +}; + +struct _HandlerList +{ + guint signal_id; + Handler *handlers; + Handler *tail_before; /* normal signal handlers are appended here */ + Handler *tail_after; /* CONNECT_AFTER handlers are appended here */ +}; + +struct _Handler +{ + gulong sequential_number; + Handler *next; + Handler *prev; + GQuark detail; + guint ref_count; + guint block_count : 16; +#define HANDLER_MAX_BLOCK_COUNT (1 << 16) + guint after : 1; + GClosure *closure; +}; +struct _HandlerMatch +{ + Handler *handler; + HandlerMatch *next; + guint signal_id; +}; + +typedef struct +{ + GType instance_type; /* 0 for default closure */ + GClosure *closure; +} ClassClosure; + + +/* --- variables --- */ +static GBSearchArray *g_signal_key_bsa = NULL; +static const GBSearchConfig g_signal_key_bconfig = { + sizeof (SignalKey), + signal_key_cmp, + G_BSEARCH_ARRAY_ALIGN_POWER2, +}; +static GBSearchConfig g_signal_hlbsa_bconfig = { + sizeof (HandlerList), + handler_lists_cmp, + 0, +}; +static GBSearchConfig g_class_closure_bconfig = { + sizeof (ClassClosure), + class_closures_cmp, + 0, +}; +static GHashTable *g_handler_list_bsa_ht = NULL; +static Emission *g_recursive_emissions = NULL; +static Emission *g_restart_emissions = NULL; +static gulong g_handler_sequential_number = 1; +G_LOCK_DEFINE_STATIC (g_signal_mutex); +#define SIGNAL_LOCK() G_LOCK (g_signal_mutex) +#define SIGNAL_UNLOCK() G_UNLOCK (g_signal_mutex) + + +/* --- signal nodes --- */ +static guint g_n_signal_nodes = 0; +static SignalNode **g_signal_nodes = NULL; + +static inline SignalNode* +LOOKUP_SIGNAL_NODE (register guint signal_id) +{ + if (signal_id < g_n_signal_nodes) + return g_signal_nodes[signal_id]; + else + return NULL; +} + + +/* --- functions --- */ +static inline guint +signal_id_lookup (GQuark quark, + GType itype) +{ + GType *ifaces, type = itype; + SignalKey key; + guint n_ifaces; + + key.quark = quark; + + /* try looking up signals for this type and its ancestors */ + do + { + SignalKey *signal_key; + + key.itype = type; + signal_key = g_bsearch_array_lookup (g_signal_key_bsa, &g_signal_key_bconfig, &key); + + if (signal_key) + return signal_key->signal_id; + + type = g_type_parent (type); + } + while (type); + + /* no luck, try interfaces it exports */ + ifaces = g_type_interfaces (itype, &n_ifaces); + while (n_ifaces--) + { + SignalKey *signal_key; + + key.itype = ifaces[n_ifaces]; + signal_key = g_bsearch_array_lookup (g_signal_key_bsa, &g_signal_key_bconfig, &key); + + if (signal_key) + { + g_free (ifaces); + return signal_key->signal_id; + } + } + g_free (ifaces); + + return 0; +} + +static gint +class_closures_cmp (gconstpointer node1, + gconstpointer node2) +{ + const ClassClosure *c1 = node1, *c2 = node2; + + return G_BSEARCH_ARRAY_CMP (c1->instance_type, c2->instance_type); +} + +static gint +handler_lists_cmp (gconstpointer node1, + gconstpointer node2) +{ + const HandlerList *hlist1 = node1, *hlist2 = node2; + + return G_BSEARCH_ARRAY_CMP (hlist1->signal_id, hlist2->signal_id); +} + +static inline HandlerList* +handler_list_ensure (guint signal_id, + gpointer instance) +{ + GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance); + HandlerList key; + + key.signal_id = signal_id; + key.handlers = NULL; + key.tail_before = NULL; + key.tail_after = NULL; + if (!hlbsa) + { + hlbsa = g_bsearch_array_create (&g_signal_hlbsa_bconfig); + hlbsa = g_bsearch_array_insert (hlbsa, &g_signal_hlbsa_bconfig, &key); + g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa); + } + else + { + GBSearchArray *o = hlbsa; + + hlbsa = g_bsearch_array_insert (o, &g_signal_hlbsa_bconfig, &key); + if (hlbsa != o) + g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa); + } + return g_bsearch_array_lookup (hlbsa, &g_signal_hlbsa_bconfig, &key); +} + +static inline HandlerList* +handler_list_lookup (guint signal_id, + gpointer instance) +{ + GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance); + HandlerList key; + + key.signal_id = signal_id; + + return hlbsa ? g_bsearch_array_lookup (hlbsa, &g_signal_hlbsa_bconfig, &key) : NULL; +} + +static Handler* +handler_lookup (gpointer instance, + gulong handler_id, + guint *signal_id_p) +{ + GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance); + + if (hlbsa) + { + guint i; + + for (i = 0; i < hlbsa->n_nodes; i++) + { + HandlerList *hlist = g_bsearch_array_get_nth (hlbsa, &g_signal_hlbsa_bconfig, i); + Handler *handler; + + for (handler = hlist->handlers; handler; handler = handler->next) + if (handler->sequential_number == handler_id) + { + if (signal_id_p) + *signal_id_p = hlist->signal_id; + + return handler; + } + } + } + + return NULL; +} + +static inline HandlerMatch* +handler_match_prepend (HandlerMatch *list, + Handler *handler, + guint signal_id) +{ + HandlerMatch *node; + + node = g_slice_new (HandlerMatch); + node->handler = handler; + node->next = list; + node->signal_id = signal_id; + handler_ref (handler); + + return node; +} +static inline HandlerMatch* +handler_match_free1_R (HandlerMatch *node, + gpointer instance) +{ + HandlerMatch *next = node->next; + + handler_unref_R (node->signal_id, instance, node->handler); + g_slice_free (HandlerMatch, node); + + return next; +} + +static HandlerMatch* +handlers_find (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data, + gboolean one_and_only) +{ + HandlerMatch *mlist = NULL; + + if (mask & G_SIGNAL_MATCH_ID) + { + HandlerList *hlist = handler_list_lookup (signal_id, instance); + Handler *handler; + SignalNode *node = NULL; + + if (mask & G_SIGNAL_MATCH_FUNC) + { + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!node || !node->c_marshaller) + return NULL; + } + + mask = ~mask; + for (handler = hlist ? hlist->handlers : NULL; handler; handler = handler->next) + if (handler->sequential_number && + ((mask & G_SIGNAL_MATCH_DETAIL) || handler->detail == detail) && + ((mask & G_SIGNAL_MATCH_CLOSURE) || handler->closure == closure) && + ((mask & G_SIGNAL_MATCH_DATA) || handler->closure->data == data) && + ((mask & G_SIGNAL_MATCH_UNBLOCKED) || handler->block_count == 0) && + ((mask & G_SIGNAL_MATCH_FUNC) || (handler->closure->marshal == node->c_marshaller && + handler->closure->meta_marshal == 0 && + ((GCClosure*) handler->closure)->callback == func))) + { + mlist = handler_match_prepend (mlist, handler, signal_id); + if (one_and_only) + return mlist; + } + } + else + { + GBSearchArray *hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance); + + mask = ~mask; + if (hlbsa) + { + guint i; + + for (i = 0; i < hlbsa->n_nodes; i++) + { + HandlerList *hlist = g_bsearch_array_get_nth (hlbsa, &g_signal_hlbsa_bconfig, i); + SignalNode *node = NULL; + Handler *handler; + + if (!(mask & G_SIGNAL_MATCH_FUNC)) + { + node = LOOKUP_SIGNAL_NODE (hlist->signal_id); + if (!node->c_marshaller) + continue; + } + + for (handler = hlist->handlers; handler; handler = handler->next) + if (handler->sequential_number && + ((mask & G_SIGNAL_MATCH_DETAIL) || handler->detail == detail) && + ((mask & G_SIGNAL_MATCH_CLOSURE) || handler->closure == closure) && + ((mask & G_SIGNAL_MATCH_DATA) || handler->closure->data == data) && + ((mask & G_SIGNAL_MATCH_UNBLOCKED) || handler->block_count == 0) && + ((mask & G_SIGNAL_MATCH_FUNC) || (handler->closure->marshal == node->c_marshaller && + handler->closure->meta_marshal == 0 && + ((GCClosure*) handler->closure)->callback == func))) + { + mlist = handler_match_prepend (mlist, handler, hlist->signal_id); + if (one_and_only) + return mlist; + } + } + } + } + + return mlist; +} + +static inline Handler* +handler_new (gboolean after) +{ + Handler *handler = g_slice_new (Handler); +#ifndef G_DISABLE_CHECKS + if (g_handler_sequential_number < 1) + g_error (G_STRLOC ": handler id overflow, %s", REPORT_BUG); +#endif + + handler->sequential_number = g_handler_sequential_number++; + handler->prev = NULL; + handler->next = NULL; + handler->detail = 0; + handler->ref_count = 1; + handler->block_count = 0; + handler->after = after != FALSE; + handler->closure = NULL; + + return handler; +} + +static inline void +handler_ref (Handler *handler) +{ + g_return_if_fail (handler->ref_count > 0); + + g_atomic_int_inc ((int *)&handler->ref_count); +} + +static inline void +handler_unref_R (guint signal_id, + gpointer instance, + Handler *handler) +{ + gboolean is_zero; + + g_return_if_fail (handler->ref_count > 0); + + is_zero = g_atomic_int_dec_and_test ((int *)&handler->ref_count); + + if (G_UNLIKELY (is_zero)) + { + HandlerList *hlist = NULL; + + if (handler->next) + handler->next->prev = handler->prev; + if (handler->prev) /* watch out for g_signal_handlers_destroy()! */ + handler->prev->next = handler->next; + else + { + hlist = handler_list_lookup (signal_id, instance); + hlist->handlers = handler->next; + } + + if (instance) + { + /* check if we are removing the handler pointed to by tail_before */ + if (!handler->after && (!handler->next || handler->next->after)) + { + if (!hlist) + hlist = handler_list_lookup (signal_id, instance); + if (hlist) + { + g_assert (hlist->tail_before == handler); /* paranoid */ + hlist->tail_before = handler->prev; + } + } + + /* check if we are removing the handler pointed to by tail_after */ + if (!handler->next) + { + if (!hlist) + hlist = handler_list_lookup (signal_id, instance); + if (hlist) + { + g_assert (hlist->tail_after == handler); /* paranoid */ + hlist->tail_after = handler->prev; + } + } + } + + SIGNAL_UNLOCK (); + g_closure_unref (handler->closure); + SIGNAL_LOCK (); + g_slice_free (Handler, handler); + } +} + +static void +handler_insert (guint signal_id, + gpointer instance, + Handler *handler) +{ + HandlerList *hlist; + + g_assert (handler->prev == NULL && handler->next == NULL); /* paranoid */ + + hlist = handler_list_ensure (signal_id, instance); + if (!hlist->handlers) + { + hlist->handlers = handler; + if (!handler->after) + hlist->tail_before = handler; + } + else if (handler->after) + { + handler->prev = hlist->tail_after; + hlist->tail_after->next = handler; + } + else + { + if (hlist->tail_before) + { + handler->next = hlist->tail_before->next; + if (handler->next) + handler->next->prev = handler; + handler->prev = hlist->tail_before; + hlist->tail_before->next = handler; + } + else /* insert !after handler into a list of only after handlers */ + { + handler->next = hlist->handlers; + if (handler->next) + handler->next->prev = handler; + hlist->handlers = handler; + } + hlist->tail_before = handler; + } + + if (!handler->next) + hlist->tail_after = handler; +} + +static inline void +emission_push (Emission **emission_list_p, + Emission *emission) +{ + emission->next = *emission_list_p; + *emission_list_p = emission; +} + +static inline void +emission_pop (Emission **emission_list_p, + Emission *emission) +{ + Emission *node, *last = NULL; + + for (node = *emission_list_p; node; last = node, node = last->next) + if (node == emission) + { + if (last) + last->next = node->next; + else + *emission_list_p = node->next; + return; + } + g_assert_not_reached (); +} + +static inline Emission* +emission_find (Emission *emission_list, + guint signal_id, + GQuark detail, + gpointer instance) +{ + Emission *emission; + + for (emission = emission_list; emission; emission = emission->next) + if (emission->instance == instance && + emission->ihint.signal_id == signal_id && + emission->ihint.detail == detail) + return emission; + return NULL; +} + +static inline Emission* +emission_find_innermost (gpointer instance) +{ + Emission *emission, *s = NULL, *c = NULL; + + for (emission = g_restart_emissions; emission; emission = emission->next) + if (emission->instance == instance) + { + s = emission; + break; + } + for (emission = g_recursive_emissions; emission; emission = emission->next) + if (emission->instance == instance) + { + c = emission; + break; + } + if (!s) + return c; + else if (!c) + return s; + else + return G_HAVE_GROWING_STACK ? MAX (c, s) : MIN (c, s); +} + +static gint +signal_key_cmp (gconstpointer node1, + gconstpointer node2) +{ + const SignalKey *key1 = node1, *key2 = node2; + + if (key1->itype == key2->itype) + return G_BSEARCH_ARRAY_CMP (key1->quark, key2->quark); + else + return G_BSEARCH_ARRAY_CMP (key1->itype, key2->itype); +} + +void +g_signal_init (void) +{ + SIGNAL_LOCK (); + if (!g_n_signal_nodes) + { + /* setup handler list binary searchable array hash table (in german, that'd be one word ;) */ + g_handler_list_bsa_ht = g_hash_table_new (g_direct_hash, NULL); + g_signal_key_bsa = g_bsearch_array_create (&g_signal_key_bconfig); + + /* invalid (0) signal_id */ + g_n_signal_nodes = 1; + g_signal_nodes = g_renew (SignalNode*, g_signal_nodes, g_n_signal_nodes); + g_signal_nodes[0] = NULL; + } + SIGNAL_UNLOCK (); +} + +void +_g_signals_destroy (GType itype) +{ + guint i; + + SIGNAL_LOCK (); + for (i = 1; i < g_n_signal_nodes; i++) + { + SignalNode *node = g_signal_nodes[i]; + + if (node->itype == itype) + { + if (node->destroyed) + g_warning (G_STRLOC ": signal \"%s\" of type `%s' already destroyed", + node->name, + type_debug_name (node->itype)); + else + signal_destroy_R (node); + } + } + SIGNAL_UNLOCK (); +} + +/** + * g_signal_stop_emission: + * @instance: the object whose signal handlers you wish to stop. + * @signal_id: the signal identifier, as returned by g_signal_lookup(). + * @detail: the detail which the signal was emitted with. + * + * Stops a signal's current emission. + * + * This will prevent the default method from running, if the signal was + * %G_SIGNAL_RUN_LAST and you connected normally (i.e. without the "after" + * flag). + * + * Prints a warning if used on a signal which isn't being emitted. + */ +void +g_signal_stop_emission (gpointer instance, + guint signal_id, + GQuark detail) +{ + SignalNode *node; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (signal_id > 0); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (node && detail && !(node->flags & G_SIGNAL_DETAILED)) + { + g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail); + SIGNAL_UNLOCK (); + return; + } + if (node && g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype)) + { + Emission *emission_list = node->flags & G_SIGNAL_NO_RECURSE ? g_restart_emissions : g_recursive_emissions; + Emission *emission = emission_find (emission_list, signal_id, detail, instance); + + if (emission) + { + if (emission->state == EMISSION_HOOK) + g_warning (G_STRLOC ": emission of signal \"%s\" for instance `%p' cannot be stopped from emission hook", + node->name, instance); + else if (emission->state == EMISSION_RUN) + emission->state = EMISSION_STOP; + } + else + g_warning (G_STRLOC ": no emission of signal \"%s\" to stop for instance `%p'", + node->name, instance); + } + else + g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance); + SIGNAL_UNLOCK (); +} + +static void +signal_finalize_hook (GHookList *hook_list, + GHook *hook) +{ + GDestroyNotify destroy = hook->destroy; + + if (destroy) + { + hook->destroy = NULL; + SIGNAL_UNLOCK (); + destroy (hook->data); + SIGNAL_LOCK (); + } +} + +/** + * g_signal_add_emission_hook: + * @signal_id: the signal identifier, as returned by g_signal_lookup(). + * @detail: the detail on which to call the hook. + * @hook_func: a #GSignalEmissionHook function. + * @hook_data: user data for @hook_func. + * @data_destroy: a #GDestroyNotify for @hook_data. + * + * Adds an emission hook for a signal, which will get called for any emission + * of that signal, independent of the instance. This is possible only + * for signals which don't have #G_SIGNAL_NO_HOOKS flag set. + * + * Returns: the hook id, for later use with g_signal_remove_emission_hook(). + */ +gulong +g_signal_add_emission_hook (guint signal_id, + GQuark detail, + GSignalEmissionHook hook_func, + gpointer hook_data, + GDestroyNotify data_destroy) +{ + static gulong seq_hook_id = 1; + SignalNode *node; + GHook *hook; + SignalHook *signal_hook; + + g_return_val_if_fail (signal_id > 0, 0); + g_return_val_if_fail (hook_func != NULL, 0); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!node || node->destroyed) + { + g_warning ("%s: invalid signal id `%u'", G_STRLOC, signal_id); + SIGNAL_UNLOCK (); + return 0; + } + if (node->flags & G_SIGNAL_NO_HOOKS) + { + g_warning ("%s: signal id `%u' does not support emission hooks (G_SIGNAL_NO_HOOKS flag set)", G_STRLOC, signal_id); + SIGNAL_UNLOCK (); + return 0; + } + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + { + g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail); + SIGNAL_UNLOCK (); + return 0; + } + if (!node->emission_hooks) + { + node->emission_hooks = g_new (GHookList, 1); + g_hook_list_init (node->emission_hooks, sizeof (SignalHook)); + node->emission_hooks->finalize_hook = signal_finalize_hook; + } + hook = g_hook_alloc (node->emission_hooks); + hook->data = hook_data; + hook->func = (gpointer) hook_func; + hook->destroy = data_destroy; + signal_hook = SIGNAL_HOOK (hook); + signal_hook->detail = detail; + node->emission_hooks->seq_id = seq_hook_id; + g_hook_append (node->emission_hooks, hook); + seq_hook_id = node->emission_hooks->seq_id; + SIGNAL_UNLOCK (); + + return hook->hook_id; +} + +/** + * g_signal_remove_emission_hook: + * @signal_id: the id of the signal + * @hook_id: the id of the emission hook, as returned by + * g_signal_add_emission_hook() + * + * Deletes an emission hook. + */ +void +g_signal_remove_emission_hook (guint signal_id, + gulong hook_id) +{ + SignalNode *node; + + g_return_if_fail (signal_id > 0); + g_return_if_fail (hook_id > 0); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!node || node->destroyed) + g_warning ("%s: invalid signal id `%u'", G_STRLOC, signal_id); + else if (!node->emission_hooks || !g_hook_destroy (node->emission_hooks, hook_id)) + g_warning ("%s: signal \"%s\" had no hook (%lu) to remove", G_STRLOC, node->name, hook_id); + SIGNAL_UNLOCK (); +} + +static inline guint +signal_parse_name (const gchar *name, + GType itype, + GQuark *detail_p, + gboolean force_quark) +{ + const gchar *colon = strchr (name, ':'); + guint signal_id; + + if (!colon) + { + signal_id = signal_id_lookup (g_quark_try_string (name), itype); + if (signal_id && detail_p) + *detail_p = 0; + } + else if (colon[1] == ':') + { + gchar buffer[32]; + guint l = colon - name; + + if (l < 32) + { + memcpy (buffer, name, l); + buffer[l] = 0; + signal_id = signal_id_lookup (g_quark_try_string (buffer), itype); + } + else + { + gchar *signal = g_new (gchar, l + 1); + + memcpy (signal, name, l); + signal[l] = 0; + signal_id = signal_id_lookup (g_quark_try_string (signal), itype); + g_free (signal); + } + + if (signal_id && detail_p) + *detail_p = colon[2] ? (force_quark ? g_quark_from_string : g_quark_try_string) (colon + 2) : 0; + } + else + signal_id = 0; + return signal_id; +} + +/** + * g_signal_parse_name: + * @detailed_signal: a string of the form "signal-name::detail". + * @itype: The interface/instance type that introduced "signal-name". + * @signal_id_p: Location to store the signal id. + * @detail_p: Location to store the detail quark. + * @force_detail_quark: %TRUE forces creation of a #GQuark for the detail. + * + * Internal function to parse a signal name into its @signal_id + * and @detail quark. + * + * Returns: Whether the signal name could successfully be parsed and @signal_id_p and @detail_p contain valid return values. + */ +gboolean +g_signal_parse_name (const gchar *detailed_signal, + GType itype, + guint *signal_id_p, + GQuark *detail_p, + gboolean force_detail_quark) +{ + SignalNode *node; + GQuark detail = 0; + guint signal_id; + + g_return_val_if_fail (detailed_signal != NULL, FALSE); + g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), FALSE); + + SIGNAL_LOCK (); + signal_id = signal_parse_name (detailed_signal, itype, &detail, force_detail_quark); + SIGNAL_UNLOCK (); + + node = signal_id ? LOOKUP_SIGNAL_NODE (signal_id) : NULL; + if (!node || node->destroyed || + (detail && !(node->flags & G_SIGNAL_DETAILED))) + return FALSE; + + if (signal_id_p) + *signal_id_p = signal_id; + if (detail_p) + *detail_p = detail; + + return TRUE; +} + +/** + * g_signal_stop_emission_by_name: + * @instance: the object whose signal handlers you wish to stop. + * @detailed_signal: a string of the form "signal-name::detail". + * + * Stops a signal's current emission. + * + * This is just like g_signal_stop_emission() except it will look up the + * signal id for you. + */ +void +g_signal_stop_emission_by_name (gpointer instance, + const gchar *detailed_signal) +{ + guint signal_id; + GQuark detail = 0; + GType itype; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (detailed_signal != NULL); + + SIGNAL_LOCK (); + itype = G_TYPE_FROM_INSTANCE (instance); + signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE); + if (signal_id) + { + SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id); + + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal); + else if (!g_type_is_a (itype, node->itype)) + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + else + { + Emission *emission_list = node->flags & G_SIGNAL_NO_RECURSE ? g_restart_emissions : g_recursive_emissions; + Emission *emission = emission_find (emission_list, signal_id, detail, instance); + + if (emission) + { + if (emission->state == EMISSION_HOOK) + g_warning (G_STRLOC ": emission of signal \"%s\" for instance `%p' cannot be stopped from emission hook", + node->name, instance); + else if (emission->state == EMISSION_RUN) + emission->state = EMISSION_STOP; + } + else + g_warning (G_STRLOC ": no emission of signal \"%s\" to stop for instance `%p'", + node->name, instance); + } + } + else + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + SIGNAL_UNLOCK (); +} + +/** + * g_signal_lookup: + * @name: the signal's name. + * @itype: the type that the signal operates on. + * + * Given the name of the signal and the type of object it connects to, gets + * the signal's identifying integer. Emitting the signal by number is + * somewhat faster than using the name each time. + * + * Also tries the ancestors of the given type. + * + * See g_signal_new() for details on allowed signal names. + * + * Returns: the signal's identifying number, or 0 if no signal was found. + */ +guint +g_signal_lookup (const gchar *name, + GType itype) +{ + guint signal_id; + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), 0); + + SIGNAL_LOCK (); + signal_id = signal_id_lookup (g_quark_try_string (name), itype); + SIGNAL_UNLOCK (); + if (!signal_id) + { + /* give elaborate warnings */ + if (!g_type_name (itype)) + g_warning (G_STRLOC ": unable to lookup signal \"%s\" for invalid type id `%"G_GSIZE_FORMAT"'", + name, itype); + else if (!G_TYPE_IS_INSTANTIATABLE (itype)) + g_warning (G_STRLOC ": unable to lookup signal \"%s\" for non instantiatable type `%s'", + name, g_type_name (itype)); + else if (!g_type_class_peek (itype)) + g_warning (G_STRLOC ": unable to lookup signal \"%s\" of unloaded type `%s'", + name, g_type_name (itype)); + } + + return signal_id; +} + +/** + * g_signal_list_ids: + * @itype: Instance or interface type. + * @n_ids: Location to store the number of signal ids for @itype. + * + * Lists the signals by id that a certain instance or interface type + * created. Further information about the signals can be acquired through + * g_signal_query(). + * + * Returns: Newly allocated array of signal IDs. + */ +guint* +g_signal_list_ids (GType itype, + guint *n_ids) +{ + SignalKey *keys; + GArray *result; + guint n_nodes; + guint i; + + g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), NULL); + g_return_val_if_fail (n_ids != NULL, NULL); + + SIGNAL_LOCK (); + keys = g_bsearch_array_get_nth (g_signal_key_bsa, &g_signal_key_bconfig, 0); + n_nodes = g_bsearch_array_get_n_nodes (g_signal_key_bsa); + result = g_array_new (FALSE, FALSE, sizeof (guint)); + + for (i = 0; i < n_nodes; i++) + if (keys[i].itype == itype) + { + const gchar *name = g_quark_to_string (keys[i].quark); + + /* Signal names with "_" in them are aliases to the same + * name with "-" instead of "_". + */ + if (!strchr (name, '_')) + g_array_append_val (result, keys[i].signal_id); + } + *n_ids = result->len; + SIGNAL_UNLOCK (); + if (!n_nodes) + { + /* give elaborate warnings */ + if (!g_type_name (itype)) + g_warning (G_STRLOC ": unable to list signals for invalid type id `%"G_GSIZE_FORMAT"'", + itype); + else if (!G_TYPE_IS_INSTANTIATABLE (itype) && !G_TYPE_IS_INTERFACE (itype)) + g_warning (G_STRLOC ": unable to list signals of non instantiatable type `%s'", + g_type_name (itype)); + else if (!g_type_class_peek (itype) && !G_TYPE_IS_INTERFACE (itype)) + g_warning (G_STRLOC ": unable to list signals of unloaded type `%s'", + g_type_name (itype)); + } + + return (guint*) g_array_free (result, FALSE); +} + +/** + * g_signal_name: + * @signal_id: the signal's identifying number. + * + * Given the signal's identifier, finds its name. + * + * Two different signals may have the same name, if they have differing types. + * + * Returns: the signal name, or %NULL if the signal number was invalid. + */ +G_CONST_RETURN gchar* +g_signal_name (guint signal_id) +{ + SignalNode *node; + const gchar *name; + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + name = node ? node->name : NULL; + SIGNAL_UNLOCK (); + + return (char*) name; +} + +/** + * g_signal_query: + * @signal_id: The signal id of the signal to query information for. + * @query: A user provided structure that is filled in with constant + * values upon success. + * + * Queries the signal system for in-depth information about a + * specific signal. This function will fill in a user-provided + * structure to hold signal-specific information. If an invalid + * signal id is passed in, the @signal_id member of the #GSignalQuery + * is 0. All members filled into the #GSignalQuery structure should + * be considered constant and have to be left untouched. + */ +void +g_signal_query (guint signal_id, + GSignalQuery *query) +{ + SignalNode *node; + + g_return_if_fail (query != NULL); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!node || node->destroyed) + query->signal_id = 0; + else + { + query->signal_id = node->signal_id; + query->signal_name = node->name; + query->itype = node->itype; + query->signal_flags = node->flags; + query->return_type = node->return_type; + query->n_params = node->n_params; + query->param_types = node->param_types; + } + SIGNAL_UNLOCK (); +} + +/** + * g_signal_new: + * @signal_name: the name for the signal + * @itype: the type this signal pertains to. It will also pertain to + * types which are derived from this type. + * @signal_flags: a combination of #GSignalFlags specifying detail of when + * the default handler is to be invoked. You should at least specify + * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST. + * @class_offset: The offset of the function pointer in the class structure + * for this type. Used to invoke a class method generically. Pass 0 to + * not associate a class method slot with this signal. + * @accumulator: the accumulator for this signal; may be %NULL. + * @accu_data: user data for the @accumulator. + * @c_marshaller: the function to translate arrays of parameter values to + * signal emissions into C language callback invocations. + * @return_type: the type of return value, or #G_TYPE_NONE for a signal + * without a return value. + * @n_params: the number of parameter types to follow. + * @...: a list of types, one for each parameter. + * + * Creates a new signal. (This is usually done in the class initializer.) + * + * A signal name consists of segments consisting of ASCII letters and + * digits, separated by either the '-' or '_' character. The first + * character of a signal name must be a letter. Names which violate these + * rules lead to undefined behaviour of the GSignal system. + * + * When registering a signal and looking up a signal, either separator can + * be used, but they cannot be mixed. + * + * If 0 is used for @class_offset subclasses cannot override the class handler + * in their class_init method by doing + * super_class->signal_handler = my_signal_handler. Instead they + * will have to use g_signal_override_class_handler(). + * + * Returns: the signal id + */ +guint +g_signal_new (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + guint class_offset, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + ...) +{ + va_list args; + guint signal_id; + + g_return_val_if_fail (signal_name != NULL, 0); + + va_start (args, n_params); + + signal_id = g_signal_new_valist (signal_name, itype, signal_flags, + class_offset ? g_signal_type_cclosure_new (itype, class_offset) : NULL, + accumulator, accu_data, c_marshaller, + return_type, n_params, args); + + va_end (args); + + /* optimize NOP emissions with NULL class handlers */ + if (signal_id && G_TYPE_IS_INSTANTIATABLE (itype) && return_type == G_TYPE_NONE && + class_offset && class_offset < MAX_TEST_CLASS_OFFSET) + { + SignalNode *node; + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + node->test_class_offset = class_offset; + SIGNAL_UNLOCK (); + } + + return signal_id; +} + +/** + * g_signal_new_class_handler: + * @signal_name: the name for the signal + * @itype: the type this signal pertains to. It will also pertain to + * types which are derived from this type. + * @signal_flags: a combination of #GSignalFlags specifying detail of when + * the default handler is to be invoked. You should at least specify + * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST. + * @class_handler: a #GCallback which acts as class implementation of + * this signal. Used to invoke a class method generically. Pass %NULL to + * not associate a class method with this signal. + * @accumulator: the accumulator for this signal; may be %NULL. + * @accu_data: user data for the @accumulator. + * @c_marshaller: the function to translate arrays of parameter values to + * signal emissions into C language callback invocations. + * @return_type: the type of return value, or #G_TYPE_NONE for a signal + * without a return value. + * @n_params: the number of parameter types to follow. + * @...: a list of types, one for each parameter. + * + * Creates a new signal. (This is usually done in the class initializer.) + * + * This is a variant of g_signal_new() that takes a C callback instead + * off a class offset for the signal's class handler. This function + * doesn't need a function pointer exposed in the class structure of + * an object definition, instead the function pointer is passed + * directly and can be overriden by derived classes with + * g_signal_override_class_closure() or + * g_signal_override_class_handler()and chained to with + * g_signal_chain_from_overridden() or + * g_signal_chain_from_overridden_handler(). + * + * See g_signal_new() for information about signal names. + * + * Returns: the signal id + * + * Since: 2.18 + */ +guint +g_signal_new_class_handler (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GCallback class_handler, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + ...) +{ + va_list args; + guint signal_id; + + g_return_val_if_fail (signal_name != NULL, 0); + + va_start (args, n_params); + + signal_id = g_signal_new_valist (signal_name, itype, signal_flags, + class_handler ? g_cclosure_new (class_handler, NULL, NULL) : NULL, + accumulator, accu_data, c_marshaller, + return_type, n_params, args); + + va_end (args); + + return signal_id; +} + +static inline ClassClosure* +signal_find_class_closure (SignalNode *node, + GType itype) +{ + GBSearchArray *bsa = node->class_closure_bsa; + ClassClosure *cc; + + if (bsa) + { + ClassClosure key; + + /* cc->instance_type is 0 for default closure */ + + key.instance_type = itype; + cc = g_bsearch_array_lookup (bsa, &g_class_closure_bconfig, &key); + while (!cc && key.instance_type) + { + key.instance_type = g_type_parent (key.instance_type); + cc = g_bsearch_array_lookup (bsa, &g_class_closure_bconfig, &key); + } + } + else + cc = NULL; + return cc; +} + +static inline GClosure* +signal_lookup_closure (SignalNode *node, + GTypeInstance *instance) +{ + ClassClosure *cc; + + if (node->class_closure_bsa && g_bsearch_array_get_n_nodes (node->class_closure_bsa) == 1) + { + cc = g_bsearch_array_get_nth (node->class_closure_bsa, &g_class_closure_bconfig, 0); + if (cc && cc->instance_type == 0) /* check for default closure */ + return cc->closure; + } + cc = signal_find_class_closure (node, G_TYPE_FROM_INSTANCE (instance)); + return cc ? cc->closure : NULL; +} + +static void +signal_add_class_closure (SignalNode *node, + GType itype, + GClosure *closure) +{ + ClassClosure key; + + /* can't optimize NOP emissions with overridden class closures */ + node->test_class_offset = 0; + + if (!node->class_closure_bsa) + node->class_closure_bsa = g_bsearch_array_create (&g_class_closure_bconfig); + key.instance_type = itype; + key.closure = g_closure_ref (closure); + node->class_closure_bsa = g_bsearch_array_insert (node->class_closure_bsa, + &g_class_closure_bconfig, + &key); + g_closure_sink (closure); + if (node->c_marshaller && closure && G_CLOSURE_NEEDS_MARSHAL (closure)) + g_closure_set_marshal (closure, node->c_marshaller); +} + +/** + * g_signal_newv: + * @signal_name: the name for the signal + * @itype: the type this signal pertains to. It will also pertain to + * types which are derived from this type + * @signal_flags: a combination of #GSignalFlags specifying detail of when + * the default handler is to be invoked. You should at least specify + * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST + * @class_closure: The closure to invoke on signal emission; may be %NULL + * @accumulator: the accumulator for this signal; may be %NULL + * @accu_data: user data for the @accumulator + * @c_marshaller: the function to translate arrays of parameter values to + * signal emissions into C language callback invocations + * @return_type: the type of return value, or #G_TYPE_NONE for a signal + * without a return value + * @n_params: the length of @param_types + * @param_types: an array of types, one for each parameter + * + * Creates a new signal. (This is usually done in the class initializer.) + * + * See g_signal_new() for details on allowed signal names. + * + * Returns: the signal id + */ +guint +g_signal_newv (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GClosure *class_closure, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + GType *param_types) +{ + gchar *name; + guint signal_id, i; + SignalNode *node; + + g_return_val_if_fail (signal_name != NULL, 0); + g_return_val_if_fail (G_TYPE_IS_INSTANTIATABLE (itype) || G_TYPE_IS_INTERFACE (itype), 0); + if (n_params) + g_return_val_if_fail (param_types != NULL, 0); + g_return_val_if_fail ((return_type & G_SIGNAL_TYPE_STATIC_SCOPE) == 0, 0); + if (return_type == (G_TYPE_NONE & ~G_SIGNAL_TYPE_STATIC_SCOPE)) + g_return_val_if_fail (accumulator == NULL, 0); + if (!accumulator) + g_return_val_if_fail (accu_data == NULL, 0); + + name = g_strdup (signal_name); + g_strdelimit (name, G_STR_DELIMITERS ":^", '_'); /* FIXME do character checks like for types */ + + SIGNAL_LOCK (); + + signal_id = signal_id_lookup (g_quark_try_string (name), itype); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (node && !node->destroyed) + { + g_warning (G_STRLOC ": signal \"%s\" already exists in the `%s' %s", + name, + type_debug_name (node->itype), + G_TYPE_IS_INTERFACE (node->itype) ? "interface" : "class ancestry"); + g_free (name); + SIGNAL_UNLOCK (); + return 0; + } + if (node && node->itype != itype) + { + g_warning (G_STRLOC ": signal \"%s\" for type `%s' was previously created for type `%s'", + name, + type_debug_name (itype), + type_debug_name (node->itype)); + g_free (name); + SIGNAL_UNLOCK (); + return 0; + } + for (i = 0; i < n_params; i++) + if (!G_TYPE_IS_VALUE (param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE)) + { + g_warning (G_STRLOC ": parameter %d of type `%s' for signal \"%s::%s\" is not a value type", + i + 1, type_debug_name (param_types[i]), type_debug_name (itype), name); + g_free (name); + SIGNAL_UNLOCK (); + return 0; + } + if (return_type != G_TYPE_NONE && !G_TYPE_IS_VALUE (return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE)) + { + g_warning (G_STRLOC ": return value of type `%s' for signal \"%s::%s\" is not a value type", + type_debug_name (return_type), type_debug_name (itype), name); + g_free (name); + SIGNAL_UNLOCK (); + return 0; + } + if (return_type != G_TYPE_NONE && + (signal_flags & (G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP)) == G_SIGNAL_RUN_FIRST) + { + g_warning (G_STRLOC ": signal \"%s::%s\" has return type `%s' and is only G_SIGNAL_RUN_FIRST", + type_debug_name (itype), name, type_debug_name (return_type)); + g_free (name); + SIGNAL_UNLOCK (); + return 0; + } + + /* setup permanent portion of signal node */ + if (!node) + { + SignalKey key; + + signal_id = g_n_signal_nodes++; + node = g_new (SignalNode, 1); + node->signal_id = signal_id; + g_signal_nodes = g_renew (SignalNode*, g_signal_nodes, g_n_signal_nodes); + g_signal_nodes[signal_id] = node; + node->itype = itype; + node->name = name; + key.itype = itype; + key.quark = g_quark_from_string (node->name); + key.signal_id = signal_id; + g_signal_key_bsa = g_bsearch_array_insert (g_signal_key_bsa, &g_signal_key_bconfig, &key); + g_strdelimit (name, "_", '-'); + node->name = g_intern_string (name); + key.quark = g_quark_from_string (name); + g_signal_key_bsa = g_bsearch_array_insert (g_signal_key_bsa, &g_signal_key_bconfig, &key); + } + node->destroyed = FALSE; + node->test_class_offset = 0; + + /* setup reinitializable portion */ + node->flags = signal_flags & G_SIGNAL_FLAGS_MASK; + node->n_params = n_params; + node->param_types = g_memdup (param_types, sizeof (GType) * n_params); + node->return_type = return_type; + node->class_closure_bsa = NULL; + if (accumulator) + { + node->accumulator = g_new (SignalAccumulator, 1); + node->accumulator->func = accumulator; + node->accumulator->data = accu_data; + } + else + node->accumulator = NULL; + node->c_marshaller = c_marshaller; + node->emission_hooks = NULL; + if (class_closure) + signal_add_class_closure (node, 0, class_closure); + else if (G_TYPE_IS_INSTANTIATABLE (itype) && return_type == G_TYPE_NONE) + { + /* optimize NOP emissions */ + node->test_class_offset = TEST_CLASS_MAGIC; + } + SIGNAL_UNLOCK (); + + g_free (name); + + return signal_id; +} + +/** + * g_signal_new_valist: + * @signal_name: the name for the signal + * @itype: the type this signal pertains to. It will also pertain to + * types which are derived from this type. + * @signal_flags: a combination of #GSignalFlags specifying detail of when + * the default handler is to be invoked. You should at least specify + * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST. + * @class_closure: The closure to invoke on signal emission; may be %NULL. + * @accumulator: the accumulator for this signal; may be %NULL. + * @accu_data: user data for the @accumulator. + * @c_marshaller: the function to translate arrays of parameter values to + * signal emissions into C language callback invocations. + * @return_type: the type of return value, or #G_TYPE_NONE for a signal + * without a return value. + * @n_params: the number of parameter types in @args. + * @args: va_list of #GType, one for each parameter. + * + * Creates a new signal. (This is usually done in the class initializer.) + * + * See g_signal_new() for details on allowed signal names. + * + * Returns: the signal id + */ +guint +g_signal_new_valist (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GClosure *class_closure, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + va_list args) +{ + GType *param_types; + guint i; + guint signal_id; + + if (n_params > 0) + { + param_types = g_new (GType, n_params); + + for (i = 0; i < n_params; i++) + param_types[i] = va_arg (args, GType); + } + else + param_types = NULL; + + signal_id = g_signal_newv (signal_name, itype, signal_flags, + class_closure, accumulator, accu_data, c_marshaller, + return_type, n_params, param_types); + g_free (param_types); + + return signal_id; +} + +static void +signal_destroy_R (SignalNode *signal_node) +{ + SignalNode node = *signal_node; + + signal_node->destroyed = TRUE; + + /* reentrancy caution, zero out real contents first */ + signal_node->test_class_offset = 0; + signal_node->n_params = 0; + signal_node->param_types = NULL; + signal_node->return_type = 0; + signal_node->class_closure_bsa = NULL; + signal_node->accumulator = NULL; + signal_node->c_marshaller = NULL; + signal_node->emission_hooks = NULL; + +#ifdef G_ENABLE_DEBUG + /* check current emissions */ + { + Emission *emission; + + for (emission = (node.flags & G_SIGNAL_NO_RECURSE) ? g_restart_emissions : g_recursive_emissions; + emission; emission = emission->next) + if (emission->ihint.signal_id == node.signal_id) + g_critical (G_STRLOC ": signal \"%s\" being destroyed is currently in emission (instance `%p')", + node.name, emission->instance); + } +#endif + + /* free contents that need to + */ + SIGNAL_UNLOCK (); + g_free (node.param_types); + if (node.class_closure_bsa) + { + guint i; + + for (i = 0; i < node.class_closure_bsa->n_nodes; i++) + { + ClassClosure *cc = g_bsearch_array_get_nth (node.class_closure_bsa, &g_class_closure_bconfig, i); + + g_closure_unref (cc->closure); + } + g_bsearch_array_free (node.class_closure_bsa, &g_class_closure_bconfig); + } + g_free (node.accumulator); + if (node.emission_hooks) + { + g_hook_list_clear (node.emission_hooks); + g_free (node.emission_hooks); + } + SIGNAL_LOCK (); +} + +/** + * g_signal_override_class_closure: + * @signal_id: the signal id + * @instance_type: the instance type on which to override the class closure + * for the signal. + * @class_closure: the closure. + * + * Overrides the class closure (i.e. the default handler) for the given signal + * for emissions on instances of @instance_type. @instance_type must be derived + * from the type to which the signal belongs. + * + * See g_signal_chain_from_overridden() and + * g_signal_chain_from_overridden_handler() for how to chain up to the + * parent class closure from inside the overridden one. + */ +void +g_signal_override_class_closure (guint signal_id, + GType instance_type, + GClosure *class_closure) +{ + SignalNode *node; + + g_return_if_fail (signal_id > 0); + g_return_if_fail (class_closure != NULL); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!g_type_is_a (instance_type, node->itype)) + g_warning ("%s: type `%s' cannot be overridden for signal id `%u'", G_STRLOC, type_debug_name (instance_type), signal_id); + else + { + ClassClosure *cc = signal_find_class_closure (node, instance_type); + + if (cc && cc->instance_type == instance_type) + g_warning ("%s: type `%s' is already overridden for signal id `%u'", G_STRLOC, type_debug_name (instance_type), signal_id); + else + signal_add_class_closure (node, instance_type, class_closure); + } + SIGNAL_UNLOCK (); +} + +/** + * g_signal_override_class_handler: + * @signal_name: the name for the signal + * @instance_type: the instance type on which to override the class handler + * for the signal. + * @class_handler: the handler. + * + * Overrides the class closure (i.e. the default handler) for the + * given signal for emissions on instances of @instance_type with + * callabck @class_handler. @instance_type must be derived from the + * type to which the signal belongs. + * + * See g_signal_chain_from_overridden() and + * g_signal_chain_from_overridden_handler() for how to chain up to the + * parent class closure from inside the overridden one. + * + * Since: 2.18 + */ +void +g_signal_override_class_handler (const gchar *signal_name, + GType instance_type, + GCallback class_handler) +{ + guint signal_id; + + g_return_if_fail (signal_name != NULL); + g_return_if_fail (instance_type != G_TYPE_NONE); + g_return_if_fail (class_handler != NULL); + + signal_id = g_signal_lookup (signal_name, instance_type); + + if (signal_id) + g_signal_override_class_closure (signal_id, instance_type, + g_cclosure_new (class_handler, NULL, NULL)); + else + g_warning ("%s: signal name '%s' is invalid for type id '%"G_GSIZE_FORMAT"'", + G_STRLOC, signal_name, instance_type); + +} + +/** + * g_signal_chain_from_overridden: + * @instance_and_params: the argument list of the signal emission. The first + * element in the array is a #GValue for the instance the signal is being + * emitted on. The rest are any arguments to be passed to the signal. + * @return_value: Location for the return value. + * + * Calls the original class closure of a signal. This function should only + * be called from an overridden class closure; see + * g_signal_override_class_closure() and + * g_signal_override_class_handler(). + */ +void +g_signal_chain_from_overridden (const GValue *instance_and_params, + GValue *return_value) +{ + GType chain_type = 0, restore_type = 0; + Emission *emission = NULL; + GClosure *closure = NULL; + guint n_params = 0; + gpointer instance; + + g_return_if_fail (instance_and_params != NULL); + instance = g_value_peek_pointer (instance_and_params); + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + + SIGNAL_LOCK (); + emission = emission_find_innermost (instance); + if (emission) + { + SignalNode *node = LOOKUP_SIGNAL_NODE (emission->ihint.signal_id); + + g_assert (node != NULL); /* paranoid */ + + /* we should probably do the same parameter checks as g_signal_emit() here. + */ + if (emission->chain_type != G_TYPE_NONE) + { + ClassClosure *cc = signal_find_class_closure (node, emission->chain_type); + + g_assert (cc != NULL); /* closure currently in call stack */ + + n_params = node->n_params; + restore_type = cc->instance_type; + cc = signal_find_class_closure (node, g_type_parent (cc->instance_type)); + if (cc && cc->instance_type != restore_type) + { + closure = cc->closure; + chain_type = cc->instance_type; + } + } + else + g_warning ("%s: signal id `%u' cannot be chained from current emission stage for instance `%p'", G_STRLOC, node->signal_id, instance); + } + else + g_warning ("%s: no signal is currently being emitted for instance `%p'", G_STRLOC, instance); + + if (closure) + { + emission->chain_type = chain_type; + SIGNAL_UNLOCK (); + g_closure_invoke (closure, + return_value, + n_params + 1, + instance_and_params, + &emission->ihint); + SIGNAL_LOCK (); + emission->chain_type = restore_type; + } + SIGNAL_UNLOCK (); +} + +/** + * g_signal_chain_from_overridden_handler: + * @instance: the instance the signal is being emitted on. + * @...: parameters to be passed to the parent class closure, followed by a + * location for the return value. If the return type of the signal + * is #G_TYPE_NONE, the return value location can be omitted. + * + * Calls the original class closure of a signal. This function should + * only be called from an overridden class closure; see + * g_signal_override_class_closure() and + * g_signal_override_class_handler(). + * + * Since: 2.18 + */ +void +g_signal_chain_from_overridden_handler (gpointer instance, + ...) +{ + GType chain_type = 0, restore_type = 0; + Emission *emission = NULL; + GClosure *closure = NULL; + SignalNode *node; + guint n_params = 0; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + + SIGNAL_LOCK (); + emission = emission_find_innermost (instance); + if (emission) + { + node = LOOKUP_SIGNAL_NODE (emission->ihint.signal_id); + + g_assert (node != NULL); /* paranoid */ + + /* we should probably do the same parameter checks as g_signal_emit() here. + */ + if (emission->chain_type != G_TYPE_NONE) + { + ClassClosure *cc = signal_find_class_closure (node, emission->chain_type); + + g_assert (cc != NULL); /* closure currently in call stack */ + + n_params = node->n_params; + restore_type = cc->instance_type; + cc = signal_find_class_closure (node, g_type_parent (cc->instance_type)); + if (cc && cc->instance_type != restore_type) + { + closure = cc->closure; + chain_type = cc->instance_type; + } + } + else + g_warning ("%s: signal id `%u' cannot be chained from current emission stage for instance `%p'", G_STRLOC, node->signal_id, instance); + } + else + g_warning ("%s: no signal is currently being emitted for instance `%p'", G_STRLOC, instance); + + if (closure) + { + GValue *instance_and_params; + GType signal_return_type; + GValue *param_values; + va_list var_args; + guint i; + + va_start (var_args, instance); + + signal_return_type = node->return_type; + instance_and_params = g_slice_alloc0 (sizeof (GValue) * (n_params + 1)); + param_values = instance_and_params + 1; + + for (i = 0; i < node->n_params; i++) + { + gchar *error; + GType ptype = node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE; + gboolean static_scope = node->param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE; + + SIGNAL_UNLOCK (); + G_VALUE_COLLECT_INIT (param_values + i, ptype, + var_args, + static_scope ? G_VALUE_NOCOPY_CONTENTS : 0, + &error); + if (error) + { + g_warning ("%s: %s", G_STRLOC, error); + g_free (error); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occoured + */ + while (i--) + g_value_unset (param_values + i); + + g_slice_free1 (sizeof (GValue) * (n_params + 1), instance_and_params); + va_end (var_args); + return; + } + SIGNAL_LOCK (); + } + + SIGNAL_UNLOCK (); + instance_and_params->g_type = 0; + g_value_init (instance_and_params, G_TYPE_FROM_INSTANCE (instance)); + g_value_set_instance (instance_and_params, instance); + SIGNAL_LOCK (); + + emission->chain_type = chain_type; + SIGNAL_UNLOCK (); + + if (signal_return_type == G_TYPE_NONE) + { + g_closure_invoke (closure, + NULL, + n_params + 1, + instance_and_params, + &emission->ihint); + } + else + { + GValue return_value = { 0, }; + gchar *error = NULL; + GType rtype = signal_return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE; + gboolean static_scope = signal_return_type & G_SIGNAL_TYPE_STATIC_SCOPE; + + g_value_init (&return_value, rtype); + + g_closure_invoke (closure, + &return_value, + n_params + 1, + instance_and_params, + &emission->ihint); + + G_VALUE_LCOPY (&return_value, + var_args, + static_scope ? G_VALUE_NOCOPY_CONTENTS : 0, + &error); + if (!error) + { + g_value_unset (&return_value); + } + else + { + g_warning ("%s: %s", G_STRLOC, error); + g_free (error); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occured + */ + } + } + + for (i = 0; i < n_params; i++) + g_value_unset (param_values + i); + g_value_unset (instance_and_params); + g_slice_free1 (sizeof (GValue) * (n_params + 1), instance_and_params); + + va_end (var_args); + + SIGNAL_LOCK (); + emission->chain_type = restore_type; + } + SIGNAL_UNLOCK (); +} + +/** + * g_signal_get_invocation_hint: + * @instance: the instance to query + * + * Returns the invocation hint of the innermost signal emission of instance. + * + * Returns: the invocation hint of the innermost signal emission. + */ +GSignalInvocationHint* +g_signal_get_invocation_hint (gpointer instance) +{ + Emission *emission = NULL; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), NULL); + + SIGNAL_LOCK (); + emission = emission_find_innermost (instance); + SIGNAL_UNLOCK (); + + return emission ? &emission->ihint : NULL; +} + +/** + * g_signal_connect_closure_by_id: + * @instance: the instance to connect to. + * @signal_id: the id of the signal. + * @detail: the detail. + * @closure: the closure to connect. + * @after: whether the handler should be called before or after the + * default handler of the signal. + * + * Connects a closure to a signal for a particular object. + * + * Returns: the handler id + */ +gulong +g_signal_connect_closure_by_id (gpointer instance, + guint signal_id, + GQuark detail, + GClosure *closure, + gboolean after) +{ + SignalNode *node; + gulong handler_seq_no = 0; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail (signal_id > 0, 0); + g_return_val_if_fail (closure != NULL, 0); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (node) + { + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail); + else if (!g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype)) + g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance); + else + { + Handler *handler = handler_new (after); + + handler_seq_no = handler->sequential_number; + handler->detail = detail; + handler->closure = g_closure_ref (closure); + g_closure_sink (closure); + handler_insert (signal_id, instance, handler); + if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (closure)) + g_closure_set_marshal (closure, node->c_marshaller); + } + } + else + g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance); + SIGNAL_UNLOCK (); + + return handler_seq_no; +} + +/** + * g_signal_connect_closure: + * @instance: the instance to connect to. + * @detailed_signal: a string of the form "signal-name::detail". + * @closure: the closure to connect. + * @after: whether the handler should be called before or after the + * default handler of the signal. + * + * Connects a closure to a signal for a particular object. + * + * Returns: the handler id + */ +gulong +g_signal_connect_closure (gpointer instance, + const gchar *detailed_signal, + GClosure *closure, + gboolean after) +{ + guint signal_id; + gulong handler_seq_no = 0; + GQuark detail = 0; + GType itype; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail (detailed_signal != NULL, 0); + g_return_val_if_fail (closure != NULL, 0); + + SIGNAL_LOCK (); + itype = G_TYPE_FROM_INSTANCE (instance); + signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE); + if (signal_id) + { + SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id); + + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal); + else if (!g_type_is_a (itype, node->itype)) + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + else + { + Handler *handler = handler_new (after); + + handler_seq_no = handler->sequential_number; + handler->detail = detail; + handler->closure = g_closure_ref (closure); + g_closure_sink (closure); + handler_insert (signal_id, instance, handler); + if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (handler->closure)) + g_closure_set_marshal (handler->closure, node->c_marshaller); + } + } + else + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + SIGNAL_UNLOCK (); + + return handler_seq_no; +} + +/** + * g_signal_connect_data: + * @instance: the instance to connect to. + * @detailed_signal: a string of the form "signal-name::detail". + * @c_handler: the #GCallback to connect. + * @data: data to pass to @c_handler calls. + * @destroy_data: a #GClosureNotify for @data. + * @connect_flags: a combination of #GConnectFlags. + * + * Connects a #GCallback function to a signal for a particular object. Similar + * to g_signal_connect(), but allows to provide a #GClosureNotify for the data + * which will be called when the signal handler is disconnected and no longer + * used. Specify @connect_flags if you need ..._after() or + * ..._swapped() variants of this function. + * + * Returns: the handler id + */ +gulong +g_signal_connect_data (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer data, + GClosureNotify destroy_data, + GConnectFlags connect_flags) +{ + guint signal_id; + gulong handler_seq_no = 0; + GQuark detail = 0; + GType itype; + gboolean swapped, after; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail (detailed_signal != NULL, 0); + g_return_val_if_fail (c_handler != NULL, 0); + + swapped = (connect_flags & G_CONNECT_SWAPPED) != FALSE; + after = (connect_flags & G_CONNECT_AFTER) != FALSE; + + SIGNAL_LOCK (); + itype = G_TYPE_FROM_INSTANCE (instance); + signal_id = signal_parse_name (detailed_signal, itype, &detail, TRUE); + if (signal_id) + { + SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id); + + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + g_warning ("%s: signal `%s' does not support details", G_STRLOC, detailed_signal); + else if (!g_type_is_a (itype, node->itype)) + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + else + { + Handler *handler = handler_new (after); + + handler_seq_no = handler->sequential_number; + handler->detail = detail; + handler->closure = g_closure_ref ((swapped ? g_cclosure_new_swap : g_cclosure_new) (c_handler, data, destroy_data)); + g_closure_sink (handler->closure); + handler_insert (signal_id, instance, handler); + if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (handler->closure)) + g_closure_set_marshal (handler->closure, node->c_marshaller); + } + } + else + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + SIGNAL_UNLOCK (); + + return handler_seq_no; +} + +/** + * g_signal_handler_block: + * @instance: The instance to block the signal handler of. + * @handler_id: Handler id of the handler to be blocked. + * + * Blocks a handler of an instance so it will not be called during any + * signal emissions unless it is unblocked again. Thus "blocking" a + * signal handler means to temporarily deactive it, a signal handler + * has to be unblocked exactly the same amount of times it has been + * blocked before to become active again. + * + * The @handler_id has to be a valid signal handler id, connected to a + * signal of @instance. + */ +void +g_signal_handler_block (gpointer instance, + gulong handler_id) +{ + Handler *handler; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (handler_id > 0); + + SIGNAL_LOCK (); + handler = handler_lookup (instance, handler_id, NULL); + if (handler) + { +#ifndef G_DISABLE_CHECKS + if (handler->block_count >= HANDLER_MAX_BLOCK_COUNT - 1) + g_error (G_STRLOC ": handler block_count overflow, %s", REPORT_BUG); +#endif + handler->block_count += 1; + } + else + g_warning ("%s: instance `%p' has no handler with id `%lu'", G_STRLOC, instance, handler_id); + SIGNAL_UNLOCK (); +} + +/** + * g_signal_handler_unblock: + * @instance: The instance to unblock the signal handler of. + * @handler_id: Handler id of the handler to be unblocked. + * + * Undoes the effect of a previous g_signal_handler_block() call. A + * blocked handler is skipped during signal emissions and will not be + * invoked, unblocking it (for exactly the amount of times it has been + * blocked before) reverts its "blocked" state, so the handler will be + * recognized by the signal system and is called upon future or + * currently ongoing signal emissions (since the order in which + * handlers are called during signal emissions is deterministic, + * whether the unblocked handler in question is called as part of a + * currently ongoing emission depends on how far that emission has + * proceeded yet). + * + * The @handler_id has to be a valid id of a signal handler that is + * connected to a signal of @instance and is currently blocked. + */ +void +g_signal_handler_unblock (gpointer instance, + gulong handler_id) +{ + Handler *handler; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (handler_id > 0); + + SIGNAL_LOCK (); + handler = handler_lookup (instance, handler_id, NULL); + if (handler) + { + if (handler->block_count) + handler->block_count -= 1; + else + g_warning (G_STRLOC ": handler `%lu' of instance `%p' is not blocked", handler_id, instance); + } + else + g_warning ("%s: instance `%p' has no handler with id `%lu'", G_STRLOC, instance, handler_id); + SIGNAL_UNLOCK (); +} + +/** + * g_signal_handler_disconnect: + * @instance: The instance to remove the signal handler from. + * @handler_id: Handler id of the handler to be disconnected. + * + * Disconnects a handler from an instance so it will not be called during + * any future or currently ongoing emissions of the signal it has been + * connected to. The @handler_id becomes invalid and may be reused. + * + * The @handler_id has to be a valid signal handler id, connected to a + * signal of @instance. + */ +void +g_signal_handler_disconnect (gpointer instance, + gulong handler_id) +{ + Handler *handler; + guint signal_id; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (handler_id > 0); + + SIGNAL_LOCK (); + handler = handler_lookup (instance, handler_id, &signal_id); + if (handler) + { + handler->sequential_number = 0; + handler->block_count = 1; + handler_unref_R (signal_id, instance, handler); + } + else + g_warning ("%s: instance `%p' has no handler with id `%lu'", G_STRLOC, instance, handler_id); + SIGNAL_UNLOCK (); +} + +/** + * g_signal_handler_is_connected: + * @instance: The instance where a signal handler is sought. + * @handler_id: the handler id. + * + * Returns whether @handler_id is the id of a handler connected to @instance. + * + * Returns: whether @handler_id identifies a handler connected to @instance. + */ +gboolean +g_signal_handler_is_connected (gpointer instance, + gulong handler_id) +{ + Handler *handler; + gboolean connected; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), FALSE); + + SIGNAL_LOCK (); + handler = handler_lookup (instance, handler_id, NULL); + connected = handler != NULL; + SIGNAL_UNLOCK (); + + return connected; +} + +void +g_signal_handlers_destroy (gpointer instance) +{ + GBSearchArray *hlbsa; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + + SIGNAL_LOCK (); + hlbsa = g_hash_table_lookup (g_handler_list_bsa_ht, instance); + if (hlbsa) + { + guint i; + + /* reentrancy caution, delete instance trace first */ + g_hash_table_remove (g_handler_list_bsa_ht, instance); + + for (i = 0; i < hlbsa->n_nodes; i++) + { + HandlerList *hlist = g_bsearch_array_get_nth (hlbsa, &g_signal_hlbsa_bconfig, i); + Handler *handler = hlist->handlers; + + while (handler) + { + Handler *tmp = handler; + + handler = tmp->next; + tmp->block_count = 1; + /* cruel unlink, this works because _all_ handlers vanish */ + tmp->next = NULL; + tmp->prev = tmp; + if (tmp->sequential_number) + { + tmp->sequential_number = 0; + handler_unref_R (0, NULL, tmp); + } + } + } + g_bsearch_array_free (hlbsa, &g_signal_hlbsa_bconfig); + } + SIGNAL_UNLOCK (); +} + +/** + * g_signal_handler_find: + * @instance: The instance owning the signal handler to be found. + * @mask: Mask indicating which of @signal_id, @detail, @closure, @func + * and/or @data the handler has to match. + * @signal_id: Signal the handler has to be connected to. + * @detail: Signal detail the handler has to be connected to. + * @closure: The closure the handler will invoke. + * @func: The C closure callback of the handler (useless for non-C closures). + * @data: The closure data of the handler's closure. + * + * Finds the first signal handler that matches certain selection criteria. + * The criteria mask is passed as an OR-ed combination of #GSignalMatchType + * flags, and the criteria values are passed as arguments. + * The match @mask has to be non-0 for successful matches. + * If no handler was found, 0 is returned. + * + * Returns: A valid non-0 signal handler id for a successful match. + */ +gulong +g_signal_handler_find (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data) +{ + gulong handler_seq_no = 0; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0); + + if (mask & G_SIGNAL_MATCH_MASK) + { + HandlerMatch *mlist; + + SIGNAL_LOCK (); + mlist = handlers_find (instance, mask, signal_id, detail, closure, func, data, TRUE); + if (mlist) + { + handler_seq_no = mlist->handler->sequential_number; + handler_match_free1_R (mlist, instance); + } + SIGNAL_UNLOCK (); + } + + return handler_seq_no; +} + +static guint +signal_handlers_foreach_matched_R (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data, + void (*callback) (gpointer instance, + gulong handler_seq_no)) +{ + HandlerMatch *mlist; + guint n_handlers = 0; + + mlist = handlers_find (instance, mask, signal_id, detail, closure, func, data, FALSE); + while (mlist) + { + n_handlers++; + if (mlist->handler->sequential_number) + { + SIGNAL_UNLOCK (); + callback (instance, mlist->handler->sequential_number); + SIGNAL_LOCK (); + } + mlist = handler_match_free1_R (mlist, instance); + } + + return n_handlers; +} + +/** + * g_signal_handlers_block_matched: + * @instance: The instance to block handlers from. + * @mask: Mask indicating which of @signal_id, @detail, @closure, @func + * and/or @data the handlers have to match. + * @signal_id: Signal the handlers have to be connected to. + * @detail: Signal detail the handlers have to be connected to. + * @closure: The closure the handlers will invoke. + * @func: The C closure callback of the handlers (useless for non-C closures). + * @data: The closure data of the handlers' closures. + * + * Blocks all handlers on an instance that match a certain selection criteria. + * The criteria mask is passed as an OR-ed combination of #GSignalMatchType + * flags, and the criteria values are passed as arguments. + * Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC + * or %G_SIGNAL_MATCH_DATA match flags is required for successful matches. + * If no handlers were found, 0 is returned, the number of blocked handlers + * otherwise. + * + * Returns: The number of handlers that matched. + */ +guint +g_signal_handlers_block_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data) +{ + guint n_handlers = 0; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0); + + if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA)) + { + SIGNAL_LOCK (); + n_handlers = signal_handlers_foreach_matched_R (instance, mask, signal_id, detail, + closure, func, data, + g_signal_handler_block); + SIGNAL_UNLOCK (); + } + + return n_handlers; +} + +/** + * g_signal_handlers_unblock_matched: + * @instance: The instance to unblock handlers from. + * @mask: Mask indicating which of @signal_id, @detail, @closure, @func + * and/or @data the handlers have to match. + * @signal_id: Signal the handlers have to be connected to. + * @detail: Signal detail the handlers have to be connected to. + * @closure: The closure the handlers will invoke. + * @func: The C closure callback of the handlers (useless for non-C closures). + * @data: The closure data of the handlers' closures. + * + * Unblocks all handlers on an instance that match a certain selection + * criteria. The criteria mask is passed as an OR-ed combination of + * #GSignalMatchType flags, and the criteria values are passed as arguments. + * Passing at least one of the %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC + * or %G_SIGNAL_MATCH_DATA match flags is required for successful matches. + * If no handlers were found, 0 is returned, the number of unblocked handlers + * otherwise. The match criteria should not apply to any handlers that are + * not currently blocked. + * + * Returns: The number of handlers that matched. + */ +guint +g_signal_handlers_unblock_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data) +{ + guint n_handlers = 0; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0); + + if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA)) + { + SIGNAL_LOCK (); + n_handlers = signal_handlers_foreach_matched_R (instance, mask, signal_id, detail, + closure, func, data, + g_signal_handler_unblock); + SIGNAL_UNLOCK (); + } + + return n_handlers; +} + +/** + * g_signal_handlers_disconnect_matched: + * @instance: The instance to remove handlers from. + * @mask: Mask indicating which of @signal_id, @detail, @closure, @func + * and/or @data the handlers have to match. + * @signal_id: Signal the handlers have to be connected to. + * @detail: Signal detail the handlers have to be connected to. + * @closure: The closure the handlers will invoke. + * @func: The C closure callback of the handlers (useless for non-C closures). + * @data: The closure data of the handlers' closures. + * + * Disconnects all handlers on an instance that match a certain + * selection criteria. The criteria mask is passed as an OR-ed + * combination of #GSignalMatchType flags, and the criteria values are + * passed as arguments. Passing at least one of the + * %G_SIGNAL_MATCH_CLOSURE, %G_SIGNAL_MATCH_FUNC or + * %G_SIGNAL_MATCH_DATA match flags is required for successful + * matches. If no handlers were found, 0 is returned, the number of + * disconnected handlers otherwise. + * + * Returns: The number of handlers that matched. + */ +guint +g_signal_handlers_disconnect_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data) +{ + guint n_handlers = 0; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), 0); + g_return_val_if_fail ((mask & ~G_SIGNAL_MATCH_MASK) == 0, 0); + + if (mask & (G_SIGNAL_MATCH_CLOSURE | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA)) + { + SIGNAL_LOCK (); + n_handlers = signal_handlers_foreach_matched_R (instance, mask, signal_id, detail, + closure, func, data, + g_signal_handler_disconnect); + SIGNAL_UNLOCK (); + } + + return n_handlers; +} + +/** + * g_signal_has_handler_pending: + * @instance: the object whose signal handlers are sought. + * @signal_id: the signal id. + * @detail: the detail. + * @may_be_blocked: whether blocked handlers should count as match. + * + * Returns whether there are any handlers connected to @instance for the + * given signal id and detail. + * + * One example of when you might use this is when the arguments to the + * signal are difficult to compute. A class implementor may opt to not + * emit the signal if no one is attached anyway, thus saving the cost + * of building the arguments. + * + * Returns: %TRUE if a handler is connected to the signal, %FALSE + * otherwise. + */ +gboolean +g_signal_has_handler_pending (gpointer instance, + guint signal_id, + GQuark detail, + gboolean may_be_blocked) +{ + HandlerMatch *mlist; + gboolean has_pending; + + g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (instance), FALSE); + g_return_val_if_fail (signal_id > 0, FALSE); + + SIGNAL_LOCK (); + if (detail) + { + SignalNode *node = LOOKUP_SIGNAL_NODE (signal_id); + + if (!(node->flags & G_SIGNAL_DETAILED)) + { + g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail); + SIGNAL_UNLOCK (); + return FALSE; + } + } + mlist = handlers_find (instance, + (G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | (may_be_blocked ? 0 : G_SIGNAL_MATCH_UNBLOCKED)), + signal_id, detail, NULL, NULL, NULL, TRUE); + if (mlist) + { + has_pending = TRUE; + handler_match_free1_R (mlist, instance); + } + else + has_pending = FALSE; + SIGNAL_UNLOCK (); + + return has_pending; +} + +static inline gboolean +signal_check_skip_emission (SignalNode *node, + gpointer instance, + GQuark detail) +{ + HandlerList *hlist; + + /* are we able to check for NULL class handlers? */ + if (!node->test_class_offset) + return FALSE; + + /* are there emission hooks pending? */ + if (node->emission_hooks && node->emission_hooks->hooks) + return FALSE; + + /* is there a non-NULL class handler? */ + if (node->test_class_offset != TEST_CLASS_MAGIC) + { + GTypeClass *class = G_TYPE_INSTANCE_GET_CLASS (instance, G_TYPE_FROM_INSTANCE (instance), GTypeClass); + + if (G_STRUCT_MEMBER (gpointer, class, node->test_class_offset)) + return FALSE; + } + + /* are signals being debugged? */ +#ifdef G_ENABLE_DEBUG + IF_DEBUG (SIGNALS, g_trace_instance_signals || g_trap_instance_signals) + return FALSE; +#endif /* G_ENABLE_DEBUG */ + + /* is this a no-recurse signal already in emission? */ + if (node->flags & G_SIGNAL_NO_RECURSE && + emission_find (g_restart_emissions, node->signal_id, detail, instance)) + return FALSE; + + /* do we have pending handlers? */ + hlist = handler_list_lookup (node->signal_id, instance); + if (hlist && hlist->handlers) + return FALSE; + + /* none of the above, no emission required */ + return TRUE; +} + +/** + * g_signal_emitv: + * @instance_and_params: argument list for the signal emission. The first + * element in the array is a #GValue for the instance the signal is + * being emitted on. The rest are any arguments to be passed to the + * signal. + * @signal_id: the signal id + * @detail: the detail + * @return_value: Location to store the return value of the signal emission. + * + * Emits a signal. + * + * Note that g_signal_emitv() doesn't change @return_value if no handlers are + * connected, in contrast to g_signal_emit() and g_signal_emit_valist(). + */ +void +g_signal_emitv (const GValue *instance_and_params, + guint signal_id, + GQuark detail, + GValue *return_value) +{ + gpointer instance; + SignalNode *node; +#ifdef G_ENABLE_DEBUG + const GValue *param_values; + guint i; +#endif + + g_return_if_fail (instance_and_params != NULL); + instance = g_value_peek_pointer (instance_and_params); + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (signal_id > 0); + +#ifdef G_ENABLE_DEBUG + param_values = instance_and_params + 1; +#endif + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!node || !g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype)) + { + g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance); + SIGNAL_UNLOCK (); + return; + } +#ifdef G_ENABLE_DEBUG + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + { + g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail); + SIGNAL_UNLOCK (); + return; + } + for (i = 0; i < node->n_params; i++) + if (!G_TYPE_CHECK_VALUE_TYPE (param_values + i, node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE)) + { + g_critical ("%s: value for `%s' parameter %u for signal \"%s\" is of type `%s'", + G_STRLOC, + type_debug_name (node->param_types[i]), + i, + node->name, + G_VALUE_TYPE_NAME (param_values + i)); + SIGNAL_UNLOCK (); + return; + } + if (node->return_type != G_TYPE_NONE) + { + if (!return_value) + { + g_critical ("%s: return value `%s' for signal \"%s\" is (NULL)", + G_STRLOC, + type_debug_name (node->return_type), + node->name); + SIGNAL_UNLOCK (); + return; + } + else if (!node->accumulator && !G_TYPE_CHECK_VALUE_TYPE (return_value, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE)) + { + g_critical ("%s: return value `%s' for signal \"%s\" is of type `%s'", + G_STRLOC, + type_debug_name (node->return_type), + node->name, + G_VALUE_TYPE_NAME (return_value)); + SIGNAL_UNLOCK (); + return; + } + } + else + return_value = NULL; +#endif /* G_ENABLE_DEBUG */ + + /* optimize NOP emissions */ + if (signal_check_skip_emission (node, instance, detail)) + { + /* nothing to do to emit this signal */ + SIGNAL_UNLOCK (); + /* g_printerr ("omitting emission of \"%s\"\n", node->name); */ + return; + } + + SIGNAL_UNLOCK (); + signal_emit_unlocked_R (node, detail, instance, return_value, instance_and_params); +} + +/** + * g_signal_emit_valist: + * @instance: the instance the signal is being emitted on. + * @signal_id: the signal id + * @detail: the detail + * @var_args: a list of parameters to be passed to the signal, followed by a + * location for the return value. If the return type of the signal + * is #G_TYPE_NONE, the return value location can be omitted. + * + * Emits a signal. + * + * Note that g_signal_emit_valist() resets the return value to the default + * if no handlers are connected, in contrast to g_signal_emitv(). + */ +void +g_signal_emit_valist (gpointer instance, + guint signal_id, + GQuark detail, + va_list var_args) +{ + GValue *instance_and_params; + GType signal_return_type; + GValue *param_values; + SignalNode *node; + guint i, n_params; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (signal_id > 0); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (!node || !g_type_is_a (G_TYPE_FROM_INSTANCE (instance), node->itype)) + { + g_warning ("%s: signal id `%u' is invalid for instance `%p'", G_STRLOC, signal_id, instance); + SIGNAL_UNLOCK (); + return; + } +#ifndef G_DISABLE_CHECKS + if (detail && !(node->flags & G_SIGNAL_DETAILED)) + { + g_warning ("%s: signal id `%u' does not support detail (%u)", G_STRLOC, signal_id, detail); + SIGNAL_UNLOCK (); + return; + } +#endif /* !G_DISABLE_CHECKS */ + + /* optimize NOP emissions */ + if (signal_check_skip_emission (node, instance, detail)) + { + /* nothing to do to emit this signal */ + SIGNAL_UNLOCK (); + /* g_printerr ("omitting emission of \"%s\"\n", node->name); */ + return; + } + + n_params = node->n_params; + signal_return_type = node->return_type; + instance_and_params = g_slice_alloc0 (sizeof (GValue) * (n_params + 1)); + param_values = instance_and_params + 1; + + for (i = 0; i < node->n_params; i++) + { + gchar *error; + GType ptype = node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE; + gboolean static_scope = node->param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE; + + SIGNAL_UNLOCK (); + G_VALUE_COLLECT_INIT (param_values + i, ptype, + var_args, + static_scope ? G_VALUE_NOCOPY_CONTENTS : 0, + &error); + if (error) + { + g_warning ("%s: %s", G_STRLOC, error); + g_free (error); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occoured + */ + while (i--) + g_value_unset (param_values + i); + + g_slice_free1 (sizeof (GValue) * (n_params + 1), instance_and_params); + return; + } + SIGNAL_LOCK (); + } + SIGNAL_UNLOCK (); + instance_and_params->g_type = 0; + g_value_init (instance_and_params, G_TYPE_FROM_INSTANCE (instance)); + g_value_set_instance (instance_and_params, instance); + if (signal_return_type == G_TYPE_NONE) + signal_emit_unlocked_R (node, detail, instance, NULL, instance_and_params); + else + { + GValue return_value = { 0, }; + gchar *error = NULL; + GType rtype = signal_return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE; + gboolean static_scope = signal_return_type & G_SIGNAL_TYPE_STATIC_SCOPE; + + g_value_init (&return_value, rtype); + + signal_emit_unlocked_R (node, detail, instance, &return_value, instance_and_params); + + G_VALUE_LCOPY (&return_value, + var_args, + static_scope ? G_VALUE_NOCOPY_CONTENTS : 0, + &error); + if (!error) + g_value_unset (&return_value); + else + { + g_warning ("%s: %s", G_STRLOC, error); + g_free (error); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occured + */ + } + } + for (i = 0; i < n_params; i++) + g_value_unset (param_values + i); + g_value_unset (instance_and_params); + g_slice_free1 (sizeof (GValue) * (n_params + 1), instance_and_params); +} + +/** + * g_signal_emit: + * @instance: the instance the signal is being emitted on. + * @signal_id: the signal id + * @detail: the detail + * @...: parameters to be passed to the signal, followed by a + * location for the return value. If the return type of the signal + * is #G_TYPE_NONE, the return value location can be omitted. + * + * Emits a signal. + * + * Note that g_signal_emit() resets the return value to the default + * if no handlers are connected, in contrast to g_signal_emitv(). + */ +void +g_signal_emit (gpointer instance, + guint signal_id, + GQuark detail, + ...) +{ + va_list var_args; + + va_start (var_args, detail); + g_signal_emit_valist (instance, signal_id, detail, var_args); + va_end (var_args); +} + +/** + * g_signal_emit_by_name: + * @instance: the instance the signal is being emitted on. + * @detailed_signal: a string of the form "signal-name::detail". + * @...: parameters to be passed to the signal, followed by a + * location for the return value. If the return type of the signal + * is #G_TYPE_NONE, the return value location can be omitted. + * + * Emits a signal. + * + * Note that g_signal_emit_by_name() resets the return value to the default + * if no handlers are connected, in contrast to g_signal_emitv(). + */ +void +g_signal_emit_by_name (gpointer instance, + const gchar *detailed_signal, + ...) +{ + GQuark detail = 0; + guint signal_id; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (detailed_signal != NULL); + + SIGNAL_LOCK (); + signal_id = signal_parse_name (detailed_signal, G_TYPE_FROM_INSTANCE (instance), &detail, TRUE); + SIGNAL_UNLOCK (); + + if (signal_id) + { + va_list var_args; + + va_start (var_args, detailed_signal); + g_signal_emit_valist (instance, signal_id, detail, var_args); + va_end (var_args); + } + else + g_warning ("%s: signal name `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); +} + +static inline gboolean +accumulate (GSignalInvocationHint *ihint, + GValue *return_accu, + GValue *handler_return, + SignalAccumulator *accumulator) +{ + gboolean continue_emission; + + if (!accumulator) + return TRUE; + + continue_emission = accumulator->func (ihint, return_accu, handler_return, accumulator->data); + g_value_reset (handler_return); + + return continue_emission; +} + +static gboolean +signal_emit_unlocked_R (SignalNode *node, + GQuark detail, + gpointer instance, + GValue *emission_return, + const GValue *instance_and_params) +{ + SignalAccumulator *accumulator; + Emission emission; + GClosure *class_closure; + HandlerList *hlist; + Handler *handler_list = NULL; + GValue *return_accu, accu = { 0, }; + guint signal_id; + gulong max_sequential_handler_number; + gboolean return_value_altered = FALSE; + +#ifdef G_ENABLE_DEBUG + IF_DEBUG (SIGNALS, g_trace_instance_signals == instance || g_trap_instance_signals == instance) + { + g_message ("%s::%s(%u) emitted (instance=%p, signal-node=%p)", + g_type_name (G_TYPE_FROM_INSTANCE (instance)), + node->name, detail, + instance, node); + if (g_trap_instance_signals == instance) + G_BREAKPOINT (); + } +#endif /* G_ENABLE_DEBUG */ + + SIGNAL_LOCK (); + signal_id = node->signal_id; + if (node->flags & G_SIGNAL_NO_RECURSE) + { + Emission *node = emission_find (g_restart_emissions, signal_id, detail, instance); + + if (node) + { + node->state = EMISSION_RESTART; + SIGNAL_UNLOCK (); + return return_value_altered; + } + } + accumulator = node->accumulator; + if (accumulator) + { + SIGNAL_UNLOCK (); + g_value_init (&accu, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE); + return_accu = &accu; + SIGNAL_LOCK (); + } + else + return_accu = emission_return; + emission.instance = instance; + emission.ihint.signal_id = node->signal_id; + emission.ihint.detail = detail; + emission.ihint.run_type = 0; + emission.state = 0; + emission.chain_type = G_TYPE_NONE; + emission_push ((node->flags & G_SIGNAL_NO_RECURSE) ? &g_restart_emissions : &g_recursive_emissions, &emission); + class_closure = signal_lookup_closure (node, instance); + + EMIT_RESTART: + + if (handler_list) + handler_unref_R (signal_id, instance, handler_list); + max_sequential_handler_number = g_handler_sequential_number; + hlist = handler_list_lookup (signal_id, instance); + handler_list = hlist ? hlist->handlers : NULL; + if (handler_list) + handler_ref (handler_list); + + emission.ihint.run_type = G_SIGNAL_RUN_FIRST; + + if ((node->flags & G_SIGNAL_RUN_FIRST) && class_closure) + { + emission.state = EMISSION_RUN; + + emission.chain_type = G_TYPE_FROM_INSTANCE (instance); + SIGNAL_UNLOCK (); + g_closure_invoke (class_closure, + return_accu, + node->n_params + 1, + instance_and_params, + &emission.ihint); + if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) && + emission.state == EMISSION_RUN) + emission.state = EMISSION_STOP; + SIGNAL_LOCK (); + emission.chain_type = G_TYPE_NONE; + return_value_altered = TRUE; + + if (emission.state == EMISSION_STOP) + goto EMIT_CLEANUP; + else if (emission.state == EMISSION_RESTART) + goto EMIT_RESTART; + } + + if (node->emission_hooks) + { + gboolean need_destroy, was_in_call, may_recurse = TRUE; + GHook *hook; + + emission.state = EMISSION_HOOK; + hook = g_hook_first_valid (node->emission_hooks, may_recurse); + while (hook) + { + SignalHook *signal_hook = SIGNAL_HOOK (hook); + + if (!signal_hook->detail || signal_hook->detail == detail) + { + GSignalEmissionHook hook_func = (GSignalEmissionHook) hook->func; + + was_in_call = G_HOOK_IN_CALL (hook); + hook->flags |= G_HOOK_FLAG_IN_CALL; + SIGNAL_UNLOCK (); + need_destroy = !hook_func (&emission.ihint, node->n_params + 1, instance_and_params, hook->data); + SIGNAL_LOCK (); + if (!was_in_call) + hook->flags &= ~G_HOOK_FLAG_IN_CALL; + if (need_destroy) + g_hook_destroy_link (node->emission_hooks, hook); + } + hook = g_hook_next_valid (node->emission_hooks, hook, may_recurse); + } + + if (emission.state == EMISSION_RESTART) + goto EMIT_RESTART; + } + + if (handler_list) + { + Handler *handler = handler_list; + + emission.state = EMISSION_RUN; + handler_ref (handler); + do + { + Handler *tmp; + + if (handler->after) + { + handler_unref_R (signal_id, instance, handler_list); + handler_list = handler; + break; + } + else if (!handler->block_count && (!handler->detail || handler->detail == detail) && + handler->sequential_number < max_sequential_handler_number) + { + SIGNAL_UNLOCK (); + g_closure_invoke (handler->closure, + return_accu, + node->n_params + 1, + instance_and_params, + &emission.ihint); + if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) && + emission.state == EMISSION_RUN) + emission.state = EMISSION_STOP; + SIGNAL_LOCK (); + return_value_altered = TRUE; + + tmp = emission.state == EMISSION_RUN ? handler->next : NULL; + } + else + tmp = handler->next; + + if (tmp) + handler_ref (tmp); + handler_unref_R (signal_id, instance, handler_list); + handler_list = handler; + handler = tmp; + } + while (handler); + + if (emission.state == EMISSION_STOP) + goto EMIT_CLEANUP; + else if (emission.state == EMISSION_RESTART) + goto EMIT_RESTART; + } + + emission.ihint.run_type = G_SIGNAL_RUN_LAST; + + if ((node->flags & G_SIGNAL_RUN_LAST) && class_closure) + { + emission.state = EMISSION_RUN; + + emission.chain_type = G_TYPE_FROM_INSTANCE (instance); + SIGNAL_UNLOCK (); + g_closure_invoke (class_closure, + return_accu, + node->n_params + 1, + instance_and_params, + &emission.ihint); + if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) && + emission.state == EMISSION_RUN) + emission.state = EMISSION_STOP; + SIGNAL_LOCK (); + emission.chain_type = G_TYPE_NONE; + return_value_altered = TRUE; + + if (emission.state == EMISSION_STOP) + goto EMIT_CLEANUP; + else if (emission.state == EMISSION_RESTART) + goto EMIT_RESTART; + } + + if (handler_list) + { + Handler *handler = handler_list; + + emission.state = EMISSION_RUN; + handler_ref (handler); + do + { + Handler *tmp; + + if (handler->after && !handler->block_count && (!handler->detail || handler->detail == detail) && + handler->sequential_number < max_sequential_handler_number) + { + SIGNAL_UNLOCK (); + g_closure_invoke (handler->closure, + return_accu, + node->n_params + 1, + instance_and_params, + &emission.ihint); + if (!accumulate (&emission.ihint, emission_return, &accu, accumulator) && + emission.state == EMISSION_RUN) + emission.state = EMISSION_STOP; + SIGNAL_LOCK (); + return_value_altered = TRUE; + + tmp = emission.state == EMISSION_RUN ? handler->next : NULL; + } + else + tmp = handler->next; + + if (tmp) + handler_ref (tmp); + handler_unref_R (signal_id, instance, handler); + handler = tmp; + } + while (handler); + + if (emission.state == EMISSION_STOP) + goto EMIT_CLEANUP; + else if (emission.state == EMISSION_RESTART) + goto EMIT_RESTART; + } + + EMIT_CLEANUP: + + emission.ihint.run_type = G_SIGNAL_RUN_CLEANUP; + + if ((node->flags & G_SIGNAL_RUN_CLEANUP) && class_closure) + { + gboolean need_unset = FALSE; + + emission.state = EMISSION_STOP; + + emission.chain_type = G_TYPE_FROM_INSTANCE (instance); + SIGNAL_UNLOCK (); + if (node->return_type != G_TYPE_NONE && !accumulator) + { + g_value_init (&accu, node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE); + need_unset = TRUE; + } + g_closure_invoke (class_closure, + node->return_type != G_TYPE_NONE ? &accu : NULL, + node->n_params + 1, + instance_and_params, + &emission.ihint); + if (need_unset) + g_value_unset (&accu); + SIGNAL_LOCK (); + emission.chain_type = G_TYPE_NONE; + + if (emission.state == EMISSION_RESTART) + goto EMIT_RESTART; + } + + if (handler_list) + handler_unref_R (signal_id, instance, handler_list); + + emission_pop ((node->flags & G_SIGNAL_NO_RECURSE) ? &g_restart_emissions : &g_recursive_emissions, &emission); + SIGNAL_UNLOCK (); + if (accumulator) + g_value_unset (&accu); + + return return_value_altered; +} + +static const gchar* +type_debug_name (GType type) +{ + if (type) + { + const char *name = g_type_name (type & ~G_SIGNAL_TYPE_STATIC_SCOPE); + return name ? name : ""; + } + else + return ""; +} + +/** + * g_signal_accumulator_true_handled: + * @ihint: standard #GSignalAccumulator parameter + * @return_accu: standard #GSignalAccumulator parameter + * @handler_return: standard #GSignalAccumulator parameter + * @dummy: standard #GSignalAccumulator parameter + * + * A predefined #GSignalAccumulator for signals that return a + * boolean values. The behavior that this accumulator gives is + * that a return of %TRUE stops the signal emission: no further + * callbacks will be invoked, while a return of %FALSE allows + * the emission to coninue. The idea here is that a %TRUE return + * indicates that the callback handled the signal, + * and no further handling is needed. + * + * Since: 2.4 + * + * Returns: standard #GSignalAccumulator result + */ +gboolean +g_signal_accumulator_true_handled (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy) +{ + gboolean continue_emission; + gboolean signal_handled; + + signal_handled = g_value_get_boolean (handler_return); + g_value_set_boolean (return_accu, signal_handled); + continue_emission = !signal_handled; + + return continue_emission; +} + +/* --- compile standard marshallers --- */ +#include "gmarshal.c" + +#define __G_SIGNAL_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gsignal.h b/gobject/gsignal.h new file mode 100644 index 0000000..d612901 --- /dev/null +++ b/gobject/gsignal.h @@ -0,0 +1,509 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000-2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SIGNAL_H__ +#define __G_SIGNAL_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +/* --- typedefs --- */ +typedef struct _GSignalQuery GSignalQuery; +typedef struct _GSignalInvocationHint GSignalInvocationHint; +/** + * GSignalCMarshaller: + * + * This is the signature of marshaller functions, required to marshall + * arrays of parameter values to signal emissions into C language callback + * invocations. It is merely an alias to #GClosureMarshal since the #GClosure + * mechanism takes over responsibility of actual function invocation for the + * signal system. + */ +typedef GClosureMarshal GSignalCMarshaller; +/** + * GSignalEmissionHook: + * @ihint: Signal invocation hint, see #GSignalInvocationHint. + * @n_param_values: the number of parameters to the function, including + * the instance on which the signal was emitted. + * @param_values: the instance on which the signal was emitted, followed by the + * parameters of the emission. + * @data: user data associated with the hook. + * + * A simple function pointer to get invoked when the signal is emitted. This + * allows you to tie a hook to the signal type, so that it will trap all + * emissions of that signal, from any object. + * + * You may not attach these to signals created with the #G_SIGNAL_NO_HOOKS flag. + * + * Returns: whether it wants to stay connected. If it returns %FALSE, the signal + * hook is disconnected (and destroyed). + */ +typedef gboolean (*GSignalEmissionHook) (GSignalInvocationHint *ihint, + guint n_param_values, + const GValue *param_values, + gpointer data); +/** + * GSignalAccumulator: + * @ihint: Signal invocation hint, see #GSignalInvocationHint. + * @return_accu: Accumulator to collect callback return values in, this + * is the return value of the current signal emission. + * @handler_return: A #GValue holding the return value of the signal handler. + * @data: Callback data that was specified when creating the signal. + * + * The signal accumulator is a special callback function that can be used + * to collect return values of the various callbacks that are called + * during a signal emission. The signal accumulator is specified at signal + * creation time, if it is left %NULL, no accumulation of callback return + * values is performed. The return value of signal emissions is then the + * value returned by the last callback. + * + * Returns: The accumulator function returns whether the signal emission + * should be aborted. Returning %FALSE means to abort the + * current emission and %TRUE is returned for continuation. + */ +typedef gboolean (*GSignalAccumulator) (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer data); + + +/* --- run, match and connect types --- */ +/** + * GSignalFlags: + * @G_SIGNAL_RUN_FIRST: Invoke the object method handler in the first emission stage. + * @G_SIGNAL_RUN_LAST: Invoke the object method handler in the third emission stage. + * @G_SIGNAL_RUN_CLEANUP: Invoke the object method handler in the last emission stage. + * @G_SIGNAL_NO_RECURSE: Signals being emitted for an object while currently being in + * emission for this very object will not be emitted recursively, + * but instead cause the first emission to be restarted. + * @G_SIGNAL_DETAILED: This signal supports "::detail" appendices to the signal name + * upon handler connections and emissions. + * @G_SIGNAL_ACTION: Action signals are signals that may freely be emitted on alive + * objects from user code via g_signal_emit() and friends, without + * the need of being embedded into extra code that performs pre or + * post emission adjustments on the object. They can also be thought + * of as object methods which can be called generically by + * third-party code. + * @G_SIGNAL_NO_HOOKS: No emissions hooks are supported for this signal. + * + * The signal flags are used to specify a signal's behaviour, the overall + * signal description outlines how especially the RUN flags control the + * stages of a signal emission. + */ +typedef enum +{ + G_SIGNAL_RUN_FIRST = 1 << 0, + G_SIGNAL_RUN_LAST = 1 << 1, + G_SIGNAL_RUN_CLEANUP = 1 << 2, + G_SIGNAL_NO_RECURSE = 1 << 3, + G_SIGNAL_DETAILED = 1 << 4, + G_SIGNAL_ACTION = 1 << 5, + G_SIGNAL_NO_HOOKS = 1 << 6 +} GSignalFlags; +/** + * G_SIGNAL_FLAGS_MASK: + * + * A mask for all #GSignalFlags bits. + */ +#define G_SIGNAL_FLAGS_MASK 0x7f +/** + * GConnectFlags: + * @G_CONNECT_AFTER: whether the handler should be called before or after the + * default handler of the signal. + * @G_CONNECT_SWAPPED: whether the instance and data should be swapped when + * calling the handler. + * + * The connection flags are used to specify the behaviour of a signal's + * connection. + */ +typedef enum +{ + G_CONNECT_AFTER = 1 << 0, + G_CONNECT_SWAPPED = 1 << 1 +} GConnectFlags; +/** + * GSignalMatchType: + * @G_SIGNAL_MATCH_ID: The signal id must be equal. + * @G_SIGNAL_MATCH_DETAIL: The signal detail be equal. + * @G_SIGNAL_MATCH_CLOSURE: The closure must be the same. + * @G_SIGNAL_MATCH_FUNC: The C closure callback must be the same. + * @G_SIGNAL_MATCH_DATA: The closure data must be the same. + * @G_SIGNAL_MATCH_UNBLOCKED: Only unblocked signals may matched. + * + * The match types specify what g_signal_handlers_block_matched(), + * g_signal_handlers_unblock_matched() and g_signal_handlers_disconnect_matched() + * match signals by. + */ +typedef enum +{ + G_SIGNAL_MATCH_ID = 1 << 0, + G_SIGNAL_MATCH_DETAIL = 1 << 1, + G_SIGNAL_MATCH_CLOSURE = 1 << 2, + G_SIGNAL_MATCH_FUNC = 1 << 3, + G_SIGNAL_MATCH_DATA = 1 << 4, + G_SIGNAL_MATCH_UNBLOCKED = 1 << 5 +} GSignalMatchType; +/** + * G_SIGNAL_MATCH_MASK: + * + * A mask for all #GSignalMatchType bits. + */ +#define G_SIGNAL_MATCH_MASK 0x3f +/** + * G_SIGNAL_TYPE_STATIC_SCOPE: + * + * This macro flags signal argument types for which the signal system may + * assume that instances thereof remain persistent across all signal emissions + * they are used in. This is only useful for non ref-counted, value-copy types. + * + * To flag a signal argument in this way, add + * | G_SIGNAL_TYPE_STATIC_SCOPE to the corresponding argument + * of g_signal_new(). + * |[ + * g_signal_new ("size_request", + * G_TYPE_FROM_CLASS (gobject_class), + * G_SIGNAL_RUN_FIRST, + * G_STRUCT_OFFSET (GtkWidgetClass, size_request), + * NULL, NULL, + * _gtk_marshal_VOID__BOXED, + * G_TYPE_NONE, 1, + * GTK_TYPE_REQUISITION | G_SIGNAL_TYPE_STATIC_SCOPE); + * ]| + */ +#define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT) + + +/* --- signal information --- */ +/** + * GSignalInvocationHint: + * @signal_id: The signal id of the signal invoking the callback + * @detail: The detail passed on for this emission + * @run_type: The stage the signal emission is currently in, this + * field will contain one of %G_SIGNAL_RUN_FIRST, + * %G_SIGNAL_RUN_LAST or %G_SIGNAL_RUN_CLEANUP. + * + * The #GSignalInvocationHint structure is used to pass on additional information + * to callbacks during a signal emission. + */ +struct _GSignalInvocationHint +{ + guint signal_id; + GQuark detail; + GSignalFlags run_type; +}; +/** + * GSignalQuery: + * @signal_id: The signal id of the signal being queried, or 0 if the + * signal to be queried was unknown. + * @signal_name: The signal name. + * @itype: The interface/instance type that this signal can be emitted for. + * @signal_flags: The signal flags as passed in to g_signal_new(). + * @return_type: The return type for user callbacks. + * @n_params: The number of parameters that user callbacks take. + * @param_types: The individual parameter types for user callbacks, note that the + * effective callback signature is: + * + * @return_type callback (#gpointer data1, + * [#param_types param_names,] + * #gpointer data2); + * + * + * A structure holding in-depth information for a specific signal. It is + * filled in by the g_signal_query() function. + */ +struct _GSignalQuery +{ + guint signal_id; + const gchar *signal_name; + GType itype; + GSignalFlags signal_flags; + GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */ + guint n_params; + const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */ +}; + + +/* --- signals --- */ +guint g_signal_newv (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GClosure *class_closure, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + GType *param_types); +guint g_signal_new_valist (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GClosure *class_closure, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + va_list args); +guint g_signal_new (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + guint class_offset, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + ...); +guint g_signal_new_class_handler (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GCallback class_handler, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + ...); + +void g_signal_emitv (const GValue *instance_and_params, + guint signal_id, + GQuark detail, + GValue *return_value); +void g_signal_emit_valist (gpointer instance, + guint signal_id, + GQuark detail, + va_list var_args); +void g_signal_emit (gpointer instance, + guint signal_id, + GQuark detail, + ...); +void g_signal_emit_by_name (gpointer instance, + const gchar *detailed_signal, + ...); +guint g_signal_lookup (const gchar *name, + GType itype); +G_CONST_RETURN gchar* g_signal_name (guint signal_id); +void g_signal_query (guint signal_id, + GSignalQuery *query); +guint* g_signal_list_ids (GType itype, + guint *n_ids); +gboolean g_signal_parse_name (const gchar *detailed_signal, + GType itype, + guint *signal_id_p, + GQuark *detail_p, + gboolean force_detail_quark); +GSignalInvocationHint* g_signal_get_invocation_hint (gpointer instance); + + +/* --- signal emissions --- */ +void g_signal_stop_emission (gpointer instance, + guint signal_id, + GQuark detail); +void g_signal_stop_emission_by_name (gpointer instance, + const gchar *detailed_signal); +gulong g_signal_add_emission_hook (guint signal_id, + GQuark detail, + GSignalEmissionHook hook_func, + gpointer hook_data, + GDestroyNotify data_destroy); +void g_signal_remove_emission_hook (guint signal_id, + gulong hook_id); + + +/* --- signal handlers --- */ +gboolean g_signal_has_handler_pending (gpointer instance, + guint signal_id, + GQuark detail, + gboolean may_be_blocked); +gulong g_signal_connect_closure_by_id (gpointer instance, + guint signal_id, + GQuark detail, + GClosure *closure, + gboolean after); +gulong g_signal_connect_closure (gpointer instance, + const gchar *detailed_signal, + GClosure *closure, + gboolean after); +gulong g_signal_connect_data (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer data, + GClosureNotify destroy_data, + GConnectFlags connect_flags); +void g_signal_handler_block (gpointer instance, + gulong handler_id); +void g_signal_handler_unblock (gpointer instance, + gulong handler_id); +void g_signal_handler_disconnect (gpointer instance, + gulong handler_id); +gboolean g_signal_handler_is_connected (gpointer instance, + gulong handler_id); +gulong g_signal_handler_find (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); +guint g_signal_handlers_block_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); +guint g_signal_handlers_unblock_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); +guint g_signal_handlers_disconnect_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); + + +/* --- overriding and chaining --- */ +void g_signal_override_class_closure (guint signal_id, + GType instance_type, + GClosure *class_closure); +void g_signal_override_class_handler (const gchar *signal_name, + GType instance_type, + GCallback class_handler); +void g_signal_chain_from_overridden (const GValue *instance_and_params, + GValue *return_value); +void g_signal_chain_from_overridden_handler (gpointer instance, + ...); + + +/* --- convenience --- */ +/** + * g_signal_connect: + * @instance: the instance to connect to. + * @detailed_signal: a string of the form "signal-name::detail". + * @c_handler: the #GCallback to connect. + * @data: data to pass to @c_handler calls. + * + * Connects a #GCallback function to a signal for a particular object. + * + * The handler will be called before the default handler of the signal. + * + * Returns: the handler id + */ +#define g_signal_connect(instance, detailed_signal, c_handler, data) \ + g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0) +/** + * g_signal_connect_after: + * @instance: the instance to connect to. + * @detailed_signal: a string of the form "signal-name::detail". + * @c_handler: the #GCallback to connect. + * @data: data to pass to @c_handler calls. + * + * Connects a #GCallback function to a signal for a particular object. + * + * The handler will be called after the default handler of the signal. + * + * Returns: the handler id + */ +#define g_signal_connect_after(instance, detailed_signal, c_handler, data) \ + g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER) +/** + * g_signal_connect_swapped: + * @instance: the instance to connect to. + * @detailed_signal: a string of the form "signal-name::detail". + * @c_handler: the #GCallback to connect. + * @data: data to pass to @c_handler calls. + * + * Connects a #GCallback function to a signal for a particular object. + * + * The instance on which the signal is emitted and @data will be swapped when + * calling the handler. + * + * Returns: the handler id + */ +#define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \ + g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED) +/** + * g_signal_handlers_disconnect_by_func: + * @instance: The instance to remove handlers from. + * @func: The C closure callback of the handlers (useless for non-C closures). + * @data: The closure data of the handlers' closures. + * + * Disconnects all handlers on an instance that match @func and @data. + * + * Returns: The number of handlers that matched. + */ +#define g_signal_handlers_disconnect_by_func(instance, func, data) \ + g_signal_handlers_disconnect_matched ((instance), \ + (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \ + 0, 0, NULL, (func), (data)) +/** + * g_signal_handlers_block_by_func: + * @instance: The instance to block handlers from. + * @func: The C closure callback of the handlers (useless for non-C closures). + * @data: The closure data of the handlers' closures. + * + * Blocks all handlers on an instance that match @func and @data. + * + * Returns: The number of handlers that matched. + */ +#define g_signal_handlers_block_by_func(instance, func, data) \ + g_signal_handlers_block_matched ((instance), \ + (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \ + 0, 0, NULL, (func), (data)) +/** + * g_signal_handlers_unblock_by_func: + * @instance: The instance to unblock handlers from. + * @func: The C closure callback of the handlers (useless for non-C closures). + * @data: The closure data of the handlers' closures. + * + * Unblocks all handlers on an instance that match @func and @data. + * + * Returns: The number of handlers that matched. + */ +#define g_signal_handlers_unblock_by_func(instance, func, data) \ + g_signal_handlers_unblock_matched ((instance), \ + (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \ + 0, 0, NULL, (func), (data)) + + +gboolean g_signal_accumulator_true_handled (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy); + +/*< private >*/ +void g_signal_handlers_destroy (gpointer instance); +void _g_signals_destroy (GType itype); + +G_END_DECLS + +#endif /* __G_SIGNAL_H__ */ diff --git a/gobject/gsourceclosure.c b/gobject/gsourceclosure.c new file mode 100644 index 0000000..508961c --- /dev/null +++ b/gobject/gsourceclosure.c @@ -0,0 +1,209 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "gsourceclosure.h" +#include "gboxed.h" +#include "genums.h" +#include "gmarshal.h" +#include "gvalue.h" +#include "gvaluetypes.h" +#include "gobjectalias.h" + + +GType +g_io_channel_get_type (void) +{ + static GType our_type = 0; + + if (our_type == 0) + our_type = g_boxed_type_register_static ("GIOChannel", + (GBoxedCopyFunc) g_io_channel_ref, + (GBoxedFreeFunc) g_io_channel_unref); + + return our_type; +} + +GType +g_io_condition_get_type (void) +{ + static GType etype = 0; + if (etype == 0) + { + static const GFlagsValue values[] = { + { G_IO_IN, "G_IO_IN", "in" }, + { G_IO_OUT, "G_IO_OUT", "out" }, + { G_IO_PRI, "G_IO_PRI", "pri" }, + { G_IO_ERR, "G_IO_ERR", "err" }, + { G_IO_HUP, "G_IO_HUP", "hup" }, + { G_IO_NVAL, "G_IO_NVAL", "nval" }, + { 0, NULL, NULL } + }; + etype = g_flags_register_static ("GIOCondition", values); + } + return etype; +} + +/* We need to hand-write this marshaler, since it doesn't have an + * instance object. + */ +static void +source_closure_marshal_BOOLEAN__VOID (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + GSourceFunc callback; + GCClosure *cc = (GCClosure*) closure; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 0); + + callback = (GSourceFunc) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (closure->data); + + g_value_set_boolean (return_value, v_return); +} + +static gboolean +io_watch_closure_callback (GIOChannel *channel, + GIOCondition condition, + gpointer data) +{ + GClosure *closure = data; + + GValue params[2] = { { 0, }, { 0, } }; + GValue result_value = { 0, }; + gboolean result; + + g_value_init (&result_value, G_TYPE_BOOLEAN); + g_value_init (¶ms[0], G_TYPE_IO_CHANNEL); + g_value_set_boxed (¶ms[0], channel); + + g_value_init (¶ms[1], G_TYPE_IO_CONDITION); + g_value_set_flags (¶ms[1], condition); + + g_closure_invoke (closure, &result_value, 2, params, NULL); + + result = g_value_get_boolean (&result_value); + g_value_unset (&result_value); + g_value_unset (¶ms[0]); + g_value_unset (¶ms[1]); + + return result; +} + +static gboolean +source_closure_callback (gpointer data) +{ + GClosure *closure = data; + GValue result_value = { 0, }; + gboolean result; + + g_value_init (&result_value, G_TYPE_BOOLEAN); + + g_closure_invoke (closure, &result_value, 0, NULL, NULL); + + result = g_value_get_boolean (&result_value); + g_value_unset (&result_value); + + return result; +} + +static void +closure_callback_get (gpointer cb_data, + GSource *source, + GSourceFunc *func, + gpointer *data) +{ + GSourceFunc closure_callback = source->source_funcs->closure_callback; + + if (!closure_callback) + { + if (source->source_funcs == &g_io_watch_funcs) + closure_callback = (GSourceFunc)io_watch_closure_callback; + else if (source->source_funcs == &g_timeout_funcs || + source->source_funcs == &g_idle_funcs) + closure_callback = source_closure_callback; + } + + *func = closure_callback; + *data = cb_data; +} + +static GSourceCallbackFuncs closure_callback_funcs = { + (void (*) (gpointer)) g_closure_ref, + (void (*) (gpointer)) g_closure_unref, + closure_callback_get +}; + +/** + * g_source_set_closure: + * @source: the source + * @closure: a #GClosure + * + * Set the callback for a source as a #GClosure. + * + * If the source is not one of the standard GLib types, the @closure_callback + * and @closure_marshal fields of the #GSourceFuncs structure must have been + * filled in with pointers to appropriate functions. + */ +void +g_source_set_closure (GSource *source, + GClosure *closure) +{ + g_return_if_fail (source != NULL); + g_return_if_fail (closure != NULL); + + if (!source->source_funcs->closure_callback && + source->source_funcs != &g_io_watch_funcs && + source->source_funcs != &g_timeout_funcs && + source->source_funcs != &g_idle_funcs) + { + g_critical (G_STRLOC "closure can not be set on closure without GSourceFuncs::closure_callback\n"); + return; + } + + g_closure_ref (closure); + g_closure_sink (closure); + g_source_set_callback_indirect (source, closure, &closure_callback_funcs); + + if (G_CLOSURE_NEEDS_MARSHAL (closure)) + { + GClosureMarshal marshal = (GClosureMarshal)source->source_funcs->closure_marshal; + if (!marshal) + { + if (source->source_funcs == &g_idle_funcs || + source->source_funcs == &g_timeout_funcs) + marshal = source_closure_marshal_BOOLEAN__VOID; + else if (source->source_funcs == &g_io_watch_funcs) + marshal = g_cclosure_marshal_BOOLEAN__FLAGS; + } + if (marshal) + g_closure_set_marshal (closure, marshal); + } +} + +#define __G_SOURCECLOSURE_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gsourceclosure.h b/gobject/gsourceclosure.h new file mode 100644 index 0000000..e7f5594 --- /dev/null +++ b/gobject/gsourceclosure.h @@ -0,0 +1,51 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_SOURCECLOSURE_H__ +#define __G_SOURCECLOSURE_H__ + +#include + +G_BEGIN_DECLS + +void g_source_set_closure (GSource *source, + GClosure *closure); + +GType g_io_channel_get_type (void); +GType g_io_condition_get_type (void); + +/** + * G_TYPE_IO_CHANNEL: + * + * The #GType for #GIOChannel. + */ +#define G_TYPE_IO_CHANNEL (g_io_channel_get_type ()) +/** + * G_TYPE_IO_CONDITION: + * + * The #GType for #GIOCondition. + */ +#define G_TYPE_IO_CONDITION (g_io_condition_get_type ()) + +G_END_DECLS + +#endif /* __G_SOURCECLOSURE_H__ */ diff --git a/gobject/gtype-private.h b/gobject/gtype-private.h new file mode 100644 index 0000000..664eb55 --- /dev/null +++ b/gobject/gtype-private.h @@ -0,0 +1,41 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TYPE_PRIVATE_H__ +#define __G_TYPE_PRIVATE_H__ + +#include "gboxed.h" + +G_BEGIN_DECLS + +/* for gboxed.c */ +gpointer _g_type_boxed_copy (GType type, + gpointer value); +void _g_type_boxed_free (GType type, + gpointer value); +void _g_type_boxed_init (GType type, + GBoxedCopyFunc copy_func, + GBoxedFreeFunc free_func); + +G_END_DECLS + +#endif /* __G_TYPE_PRIVATE_H__ */ diff --git a/gobject/gtype.c b/gobject/gtype.c new file mode 100644 index 0000000..66ff177 --- /dev/null +++ b/gobject/gtype.c @@ -0,0 +1,4576 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include + +#include "gtype.h" +#include "gtype-private.h" +#include "gtypeplugin.h" +#include "gvaluecollector.h" +#include "gbsearcharray.h" +#include "gobjectalias.h" +#include "gatomicarray.h" + + +/** + * SECTION:gtype + * @short_description: The GLib Runtime type identification and + * management system + * @title:Type Information + * + * The GType API is the foundation of the GObject system. It provides the + * facilities for registering and managing all fundamental data types, + * user-defined object and interface types. Before using any GType + * or GObject functions, g_type_init() must be called to initialize the + * type system. + * + * For type creation and registration purposes, all types fall into one of + * two categories: static or dynamic. Static types are never loaded or + * unloaded at run-time as dynamic types may be. Static types are created + * with g_type_register_static() that gets type specific information passed + * in via a #GTypeInfo structure. + * Dynamic types are created with g_type_register_dynamic() which takes a + * #GTypePlugin structure instead. The remaining type information (the + * #GTypeInfo structure) is retrieved during runtime through #GTypePlugin + * and the g_type_plugin_*() API. + * These registration functions are usually called only once from a + * function whose only purpose is to return the type identifier for a + * specific class. Once the type (or class or interface) is registered, + * it may be instantiated, inherited, or implemented depending on exactly + * what sort of type it is. + * There is also a third registration function for registering fundamental + * types called g_type_register_fundamental() which requires both a #GTypeInfo + * structure and a #GTypeFundamentalInfo structure but it is seldom used + * since most fundamental types are predefined rather than user-defined. + * + * A final word about type names. + * Such an identifier needs to be at least three characters long. There is no + * upper length limit. The first character needs to be a letter (a-z or A-Z) + * or an underscore '_'. Subsequent characters can be letters, numbers or + * any of '-_+'. + */ + + +/* NOTE: some functions (some internal variants and exported ones) + * invalidate data portions of the TypeNodes. if external functions/callbacks + * are called, pointers to memory maintained by TypeNodes have to be looked up + * again. this affects most of the struct TypeNode fields, e.g. ->children or + * CLASSED_NODE_IFACES_ENTRIES() respectively IFACE_NODE_PREREQUISITES() (but + * not ->supers[]), as all those memory portions can get realloc()ed during + * callback invocation. + * + * TODO: + * - g_type_from_name() should do an ordered array lookup after fetching the + * the quark, instead of a second hashtable lookup. + * + * LOCKING: + * lock handling issues when calling static functions are indicated by + * uppercase letter postfixes, all static functions have to have + * one of the below postfixes: + * - _I: [Indifferent about locking] + * function doesn't care about locks at all + * - _U: [Unlocked invocation] + * no read or write lock has to be held across function invocation + * (locks may be acquired and released during invocation though) + * - _L: [Locked invocation] + * a write lock or more than 0 read locks have to be held across + * function invocation + * - _W: [Write-locked invocation] + * a write lock has to be held across function invocation + * - _Wm: [Write-locked invocation, mutatable] + * like _W, but the write lock might be released and reacquired + * during invocation, watch your pointers + * - _WmREC: [Write-locked invocation, mutatable, recursive] + * like _Wm, but also acquires recursive mutex class_init_rec_mutex + */ + +#ifdef LOCK_DEBUG +#define G_READ_LOCK(rw_lock) do { g_printerr (G_STRLOC ": readL++\n"); g_static_rw_lock_reader_lock (rw_lock); } while (0) +#define G_READ_UNLOCK(rw_lock) do { g_printerr (G_STRLOC ": readL--\n"); g_static_rw_lock_reader_unlock (rw_lock); } while (0) +#define G_WRITE_LOCK(rw_lock) do { g_printerr (G_STRLOC ": writeL++\n"); g_static_rw_lock_writer_lock (rw_lock); } while (0) +#define G_WRITE_UNLOCK(rw_lock) do { g_printerr (G_STRLOC ": writeL--\n"); g_static_rw_lock_writer_unlock (rw_lock); } while (0) +#else +#define G_READ_LOCK(rw_lock) g_static_rw_lock_reader_lock (rw_lock) +#define G_READ_UNLOCK(rw_lock) g_static_rw_lock_reader_unlock (rw_lock) +#define G_WRITE_LOCK(rw_lock) g_static_rw_lock_writer_lock (rw_lock) +#define G_WRITE_UNLOCK(rw_lock) g_static_rw_lock_writer_unlock (rw_lock) +#endif +#define INVALID_RECURSION(func, arg, type_name) G_STMT_START{ \ + static const gchar _action[] = " invalidly modified type "; \ + gpointer _arg = (gpointer) (arg); const gchar *_tname = (type_name), *_fname = (func); \ + if (_arg) \ + g_error ("%s(%p)%s`%s'", _fname, _arg, _action, _tname); \ + else \ + g_error ("%s()%s`%s'", _fname, _action, _tname); \ +}G_STMT_END +#define g_return_val_if_type_system_uninitialized(return_value) G_STMT_START{ \ + if (G_UNLIKELY (!static_quark_type_flags)) \ + { \ + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \ + "%s: You forgot to call g_type_init()", \ + G_STRLOC); \ + return (return_value); \ + } \ +}G_STMT_END + +#ifdef G_ENABLE_DEBUG +#define DEBUG_CODE(debug_type, code_block) G_STMT_START { \ + if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) \ + { code_block; } \ +} G_STMT_END +#else /* !G_ENABLE_DEBUG */ +#define DEBUG_CODE(debug_type, code_block) /* code_block */ +#endif /* G_ENABLE_DEBUG */ + +#define TYPE_FUNDAMENTAL_FLAG_MASK (G_TYPE_FLAG_CLASSED | \ + G_TYPE_FLAG_INSTANTIATABLE | \ + G_TYPE_FLAG_DERIVABLE | \ + G_TYPE_FLAG_DEEP_DERIVABLE) +#define TYPE_FLAG_MASK (G_TYPE_FLAG_ABSTRACT | G_TYPE_FLAG_VALUE_ABSTRACT) +#define SIZEOF_FUNDAMENTAL_INFO ((gssize) MAX (MAX (sizeof (GTypeFundamentalInfo), \ + sizeof (gpointer)), \ + sizeof (glong))) + +/* The 2*sizeof(size_t) alignment here is borrowed from + * GNU libc, so it should be good most everywhere. + * It is more conservative than is needed on some 64-bit + * platforms, but ia64 does require a 16-byte alignment. + * The SIMD extensions for x86 and ppc32 would want a + * larger alignment than this, but we don't need to + * do better than malloc. + */ +#define STRUCT_ALIGNMENT (2 * sizeof (gsize)) +#define ALIGN_STRUCT(offset) \ + ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT) + + +/* --- typedefs --- */ +typedef struct _TypeNode TypeNode; +typedef struct _CommonData CommonData; +typedef struct _BoxedData BoxedData; +typedef struct _IFaceData IFaceData; +typedef struct _ClassData ClassData; +typedef struct _InstanceData InstanceData; +typedef union _TypeData TypeData; +typedef struct _IFaceEntries IFaceEntries; +typedef struct _IFaceEntry IFaceEntry; +typedef struct _IFaceHolder IFaceHolder; + + +/* --- prototypes --- */ +static inline GTypeFundamentalInfo* type_node_fundamental_info_I (TypeNode *node); +static void type_add_flags_W (TypeNode *node, + GTypeFlags flags); +static void type_data_make_W (TypeNode *node, + const GTypeInfo *info, + const GTypeValueTable *value_table); +static inline void type_data_ref_Wm (TypeNode *node); +static inline void type_data_unref_U (TypeNode *node, + gboolean uncached); +static void type_data_last_unref_Wm (TypeNode * node, + gboolean uncached); +static inline gpointer type_get_qdata_L (TypeNode *node, + GQuark quark); +static inline void type_set_qdata_W (TypeNode *node, + GQuark quark, + gpointer data); +static IFaceHolder* type_iface_peek_holder_L (TypeNode *iface, + GType instance_type); +static gboolean type_iface_vtable_base_init_Wm (TypeNode *iface, + TypeNode *node); +static void type_iface_vtable_iface_init_Wm (TypeNode *iface, + TypeNode *node); +static gboolean type_node_is_a_L (TypeNode *node, + TypeNode *iface_node); + + +/* --- enumeration --- */ + +/* The InitState enumeration is used to track the progress of initializing + * both classes and interface vtables. Keeping the state of initialization + * is necessary to handle new interfaces being added while we are initializing + * the class or other interfaces. + */ +typedef enum +{ + UNINITIALIZED, + BASE_CLASS_INIT, + BASE_IFACE_INIT, + CLASS_INIT, + IFACE_INIT, + INITIALIZED +} InitState; + +/* --- structures --- */ +struct _TypeNode +{ + guint volatile ref_count; + GTypePlugin *plugin; + guint n_children; /* writable with lock */ + guint n_supers : 8; + guint n_prerequisites : 9; + guint is_classed : 1; + guint is_instantiatable : 1; + guint mutatable_check_cache : 1; /* combines some common path checks */ + GType *children; /* writable with lock */ + TypeData * volatile data; + GQuark qname; + GData *global_gdata; + union { + GAtomicArray iface_entries; /* for !iface types */ + GAtomicArray offsets; + } _prot; + GType *prerequisites; + GType supers[1]; /* flexible array */ +}; + +#define SIZEOF_BASE_TYPE_NODE() (G_STRUCT_OFFSET (TypeNode, supers)) +#define MAX_N_SUPERS (255) +#define MAX_N_CHILDREN (4095) +#define MAX_N_INTERFACES (255) /* Limited by offsets being 8 bits */ +#define MAX_N_PREREQUISITES (511) +#define NODE_TYPE(node) (node->supers[0]) +#define NODE_PARENT_TYPE(node) (node->supers[1]) +#define NODE_FUNDAMENTAL_TYPE(node) (node->supers[node->n_supers]) +#define NODE_NAME(node) (g_quark_to_string (node->qname)) +#define NODE_REFCOUNT(node) ((guint) g_atomic_int_get ((int *) &(node)->ref_count)) +#define NODE_IS_BOXED(node) (NODE_FUNDAMENTAL_TYPE (node) == G_TYPE_BOXED) +#define NODE_IS_IFACE(node) (NODE_FUNDAMENTAL_TYPE (node) == G_TYPE_INTERFACE) +#define CLASSED_NODE_IFACES_ENTRIES(node) (&(node)->_prot.iface_entries) +#define CLASSED_NODE_IFACES_ENTRIES_LOCKED(node)(G_ATOMIC_ARRAY_GET_LOCKED(CLASSED_NODE_IFACES_ENTRIES((node)), IFaceEntries)) +#define IFACE_NODE_N_PREREQUISITES(node) ((node)->n_prerequisites) +#define IFACE_NODE_PREREQUISITES(node) ((node)->prerequisites) +#define iface_node_get_holders_L(node) ((IFaceHolder*) type_get_qdata_L ((node), static_quark_iface_holder)) +#define iface_node_set_holders_W(node, holders) (type_set_qdata_W ((node), static_quark_iface_holder, (holders))) +#define iface_node_get_dependants_array_L(n) ((GType*) type_get_qdata_L ((n), static_quark_dependants_array)) +#define iface_node_set_dependants_array_W(n,d) (type_set_qdata_W ((n), static_quark_dependants_array, (d))) +#define TYPE_ID_MASK ((GType) ((1 << G_TYPE_FUNDAMENTAL_SHIFT) - 1)) + +#define NODE_IS_ANCESTOR(ancestor, node) \ + ((ancestor)->n_supers <= (node)->n_supers && \ + (node)->supers[(node)->n_supers - (ancestor)->n_supers] == NODE_TYPE (ancestor)) + +struct _IFaceHolder +{ + GType instance_type; + GInterfaceInfo *info; + GTypePlugin *plugin; + IFaceHolder *next; +}; + +struct _IFaceEntry +{ + GType iface_type; + GTypeInterface *vtable; + InitState init_state; +}; + +struct _IFaceEntries { + guint offset_index; + IFaceEntry entry[1]; +}; + +#define IFACE_ENTRIES_HEADER_SIZE (sizeof(IFaceEntries) - sizeof(IFaceEntry)) +#define IFACE_ENTRIES_N_ENTRIES(_entries) ( (G_ATOMIC_ARRAY_DATA_SIZE((_entries)) - IFACE_ENTRIES_HEADER_SIZE) / sizeof(IFaceEntry) ) + +struct _CommonData +{ + GTypeValueTable *value_table; +}; + +struct _BoxedData +{ + CommonData data; + GBoxedCopyFunc copy_func; + GBoxedFreeFunc free_func; +}; + +struct _IFaceData +{ + CommonData common; + guint16 vtable_size; + GBaseInitFunc vtable_init_base; + GBaseFinalizeFunc vtable_finalize_base; + GClassInitFunc dflt_init; + GClassFinalizeFunc dflt_finalize; + gconstpointer dflt_data; + gpointer dflt_vtable; +}; + +struct _ClassData +{ + CommonData common; + guint16 class_size; + guint16 class_private_size; + int volatile init_state; /* atomic - g_type_class_ref reads it unlocked */ + GBaseInitFunc class_init_base; + GBaseFinalizeFunc class_finalize_base; + GClassInitFunc class_init; + GClassFinalizeFunc class_finalize; + gconstpointer class_data; + gpointer class; +}; + +struct _InstanceData +{ + CommonData common; + guint16 class_size; + guint16 class_private_size; + int volatile init_state; /* atomic - g_type_class_ref reads it unlocked */ + GBaseInitFunc class_init_base; + GBaseFinalizeFunc class_finalize_base; + GClassInitFunc class_init; + GClassFinalizeFunc class_finalize; + gconstpointer class_data; + gpointer class; + guint16 instance_size; + guint16 private_size; + guint16 n_preallocs; + GInstanceInitFunc instance_init; +}; + +union _TypeData +{ + CommonData common; + BoxedData boxed; + IFaceData iface; + ClassData class; + InstanceData instance; +}; + +typedef struct { + gpointer cache_data; + GTypeClassCacheFunc cache_func; +} ClassCacheFunc; + +typedef struct { + gpointer check_data; + GTypeInterfaceCheckFunc check_func; +} IFaceCheckFunc; + + +/* --- variables --- */ +static GStaticRWLock type_rw_lock = G_STATIC_RW_LOCK_INIT; +static GStaticRecMutex class_init_rec_mutex = G_STATIC_REC_MUTEX_INIT; +static guint static_n_class_cache_funcs = 0; +static ClassCacheFunc *static_class_cache_funcs = NULL; +static guint static_n_iface_check_funcs = 0; +static IFaceCheckFunc *static_iface_check_funcs = NULL; +static GQuark static_quark_type_flags = 0; +static GQuark static_quark_iface_holder = 0; +static GQuark static_quark_dependants_array = 0; +GTypeDebugFlags _g_type_debug_flags = 0; + +/* --- type nodes --- */ +static GHashTable *static_type_nodes_ht = NULL; +static TypeNode *static_fundamental_type_nodes[(G_TYPE_FUNDAMENTAL_MAX >> G_TYPE_FUNDAMENTAL_SHIFT) + 1] = { NULL, }; +static GType static_fundamental_next = G_TYPE_RESERVED_USER_FIRST; + +static inline TypeNode* +lookup_type_node_I (register GType utype) +{ + if (utype > G_TYPE_FUNDAMENTAL_MAX) + return (TypeNode*) (utype & ~TYPE_ID_MASK); + else + return static_fundamental_type_nodes[utype >> G_TYPE_FUNDAMENTAL_SHIFT]; +} + +static TypeNode* +type_node_any_new_W (TypeNode *pnode, + GType ftype, + const gchar *name, + GTypePlugin *plugin, + GTypeFundamentalFlags type_flags) +{ + guint n_supers; + GType type; + TypeNode *node; + guint i, node_size = 0; + + n_supers = pnode ? pnode->n_supers + 1 : 0; + + if (!pnode) + node_size += SIZEOF_FUNDAMENTAL_INFO; /* fundamental type info */ + node_size += SIZEOF_BASE_TYPE_NODE (); /* TypeNode structure */ + node_size += (sizeof (GType) * (1 + n_supers + 1)); /* self + ancestors + (0) for ->supers[] */ + node = g_malloc0 (node_size); + if (!pnode) /* offset fundamental types */ + { + node = G_STRUCT_MEMBER_P (node, SIZEOF_FUNDAMENTAL_INFO); + static_fundamental_type_nodes[ftype >> G_TYPE_FUNDAMENTAL_SHIFT] = node; + type = ftype; + } + else + type = (GType) node; + + g_assert ((type & TYPE_ID_MASK) == 0); + + node->n_supers = n_supers; + if (!pnode) + { + node->supers[0] = type; + node->supers[1] = 0; + + node->is_classed = (type_flags & G_TYPE_FLAG_CLASSED) != 0; + node->is_instantiatable = (type_flags & G_TYPE_FLAG_INSTANTIATABLE) != 0; + + if (NODE_IS_IFACE (node)) + { + IFACE_NODE_N_PREREQUISITES (node) = 0; + IFACE_NODE_PREREQUISITES (node) = NULL; + } + else + _g_atomic_array_init (CLASSED_NODE_IFACES_ENTRIES (node)); + } + else + { + node->supers[0] = type; + memcpy (node->supers + 1, pnode->supers, sizeof (GType) * (1 + pnode->n_supers + 1)); + + node->is_classed = pnode->is_classed; + node->is_instantiatable = pnode->is_instantiatable; + + if (NODE_IS_IFACE (node)) + { + IFACE_NODE_N_PREREQUISITES (node) = 0; + IFACE_NODE_PREREQUISITES (node) = NULL; + } + else + { + guint j; + IFaceEntries *entries; + + entries = _g_atomic_array_copy (CLASSED_NODE_IFACES_ENTRIES (pnode), + IFACE_ENTRIES_HEADER_SIZE, + 0); + if (entries) + { + for (j = 0; j < IFACE_ENTRIES_N_ENTRIES (entries); j++) + { + entries->entry[j].vtable = NULL; + entries->entry[j].init_state = UNINITIALIZED; + } + _g_atomic_array_update (CLASSED_NODE_IFACES_ENTRIES (node), + entries); + } + } + + i = pnode->n_children++; + pnode->children = g_renew (GType, pnode->children, pnode->n_children); + pnode->children[i] = type; + } + + node->plugin = plugin; + node->n_children = 0; + node->children = NULL; + node->data = NULL; + node->qname = g_quark_from_string (name); + node->global_gdata = NULL; + + g_hash_table_insert (static_type_nodes_ht, + GUINT_TO_POINTER (node->qname), + (gpointer) type); + return node; +} + +static inline GTypeFundamentalInfo* +type_node_fundamental_info_I (TypeNode *node) +{ + GType ftype = NODE_FUNDAMENTAL_TYPE (node); + + if (ftype != NODE_TYPE (node)) + node = lookup_type_node_I (ftype); + + return node ? G_STRUCT_MEMBER_P (node, -SIZEOF_FUNDAMENTAL_INFO) : NULL; +} + +static TypeNode* +type_node_fundamental_new_W (GType ftype, + const gchar *name, + GTypeFundamentalFlags type_flags) +{ + GTypeFundamentalInfo *finfo; + TypeNode *node; + + g_assert ((ftype & TYPE_ID_MASK) == 0); + g_assert (ftype <= G_TYPE_FUNDAMENTAL_MAX); + + if (ftype >> G_TYPE_FUNDAMENTAL_SHIFT == static_fundamental_next) + static_fundamental_next++; + + type_flags &= TYPE_FUNDAMENTAL_FLAG_MASK; + + node = type_node_any_new_W (NULL, ftype, name, NULL, type_flags); + + finfo = type_node_fundamental_info_I (node); + finfo->type_flags = type_flags; + + return node; +} + +static TypeNode* +type_node_new_W (TypeNode *pnode, + const gchar *name, + GTypePlugin *plugin) + +{ + g_assert (pnode); + g_assert (pnode->n_supers < MAX_N_SUPERS); + g_assert (pnode->n_children < MAX_N_CHILDREN); + + return type_node_any_new_W (pnode, NODE_FUNDAMENTAL_TYPE (pnode), name, plugin, 0); +} + +static inline IFaceEntry* +lookup_iface_entry_I (volatile IFaceEntries *entries, + TypeNode *iface_node) +{ + guint8 *offsets; + guint offset_index; + IFaceEntry *check; + int index; + IFaceEntry *entry; + + if (entries == NULL) + return NULL; + + G_ATOMIC_ARRAY_DO_TRANSACTION + (&iface_node->_prot.offsets, guint8, + + entry = NULL; + offsets = transaction_data; + offset_index = entries->offset_index; + if (offsets != NULL && + offset_index < G_ATOMIC_ARRAY_DATA_SIZE(offsets)) + { + index = offsets[offset_index]; + if (index > 0) + { + /* zero means unset, subtract one to get real index */ + index -= 1; + + if (index < IFACE_ENTRIES_N_ENTRIES (entries)) + { + check = (IFaceEntry *)&entries->entry[index]; + if (check->iface_type == NODE_TYPE (iface_node)) + entry = check; + } + } + } + ); + + return entry; +} + +static inline IFaceEntry* +type_lookup_iface_entry_L (TypeNode *node, + TypeNode *iface_node) +{ + if (!NODE_IS_IFACE (iface_node)) + return NULL; + + return lookup_iface_entry_I (CLASSED_NODE_IFACES_ENTRIES_LOCKED (node), + iface_node); +} + + +static inline gboolean +type_lookup_iface_vtable_I (TypeNode *node, + TypeNode *iface_node, + gpointer *vtable_ptr) +{ + IFaceEntry *entry; + gboolean res; + + if (!NODE_IS_IFACE (iface_node)) + { + if (vtable_ptr) + *vtable_ptr = NULL; + return FALSE; + } + + G_ATOMIC_ARRAY_DO_TRANSACTION + (CLASSED_NODE_IFACES_ENTRIES (node), IFaceEntries, + + entry = lookup_iface_entry_I (transaction_data, iface_node); + res = entry != NULL; + if (vtable_ptr) + { + if (entry) + *vtable_ptr = entry->vtable; + else + *vtable_ptr = NULL; + } + ); + + return res; +} + +static inline gboolean +type_lookup_prerequisite_L (TypeNode *iface, + GType prerequisite_type) +{ + if (NODE_IS_IFACE (iface) && IFACE_NODE_N_PREREQUISITES (iface)) + { + GType *prerequisites = IFACE_NODE_PREREQUISITES (iface) - 1; + guint n_prerequisites = IFACE_NODE_N_PREREQUISITES (iface); + + do + { + guint i; + GType *check; + + i = (n_prerequisites + 1) >> 1; + check = prerequisites + i; + if (prerequisite_type == *check) + return TRUE; + else if (prerequisite_type > *check) + { + n_prerequisites -= i; + prerequisites = check; + } + else /* if (prerequisite_type < *check) */ + n_prerequisites = i - 1; + } + while (n_prerequisites); + } + return FALSE; +} + +static const gchar* +type_descriptive_name_I (GType type) +{ + if (type) + { + TypeNode *node = lookup_type_node_I (type); + + return node ? NODE_NAME (node) : ""; + } + else + return ""; +} + + +/* --- type consistency checks --- */ +static gboolean +check_plugin_U (GTypePlugin *plugin, + gboolean need_complete_type_info, + gboolean need_complete_interface_info, + const gchar *type_name) +{ + /* G_IS_TYPE_PLUGIN() and G_TYPE_PLUGIN_GET_CLASS() are external calls: _U + */ + if (!plugin) + { + g_warning ("plugin handle for type `%s' is NULL", + type_name); + return FALSE; + } + if (!G_IS_TYPE_PLUGIN (plugin)) + { + g_warning ("plugin pointer (%p) for type `%s' is invalid", + plugin, type_name); + return FALSE; + } + if (need_complete_type_info && !G_TYPE_PLUGIN_GET_CLASS (plugin)->complete_type_info) + { + g_warning ("plugin for type `%s' has no complete_type_info() implementation", + type_name); + return FALSE; + } + if (need_complete_interface_info && !G_TYPE_PLUGIN_GET_CLASS (plugin)->complete_interface_info) + { + g_warning ("plugin for type `%s' has no complete_interface_info() implementation", + type_name); + return FALSE; + } + return TRUE; +} + +static gboolean +check_type_name_I (const gchar *type_name) +{ + static const gchar extra_chars[] = "-_+"; + const gchar *p = type_name; + gboolean name_valid; + + if (!type_name[0] || !type_name[1] || !type_name[2]) + { + g_warning ("type name `%s' is too short", type_name); + return FALSE; + } + /* check the first letter */ + name_valid = (p[0] >= 'A' && p[0] <= 'Z') || (p[0] >= 'a' && p[0] <= 'z') || p[0] == '_'; + for (p = type_name + 1; *p; p++) + name_valid &= ((p[0] >= 'A' && p[0] <= 'Z') || + (p[0] >= 'a' && p[0] <= 'z') || + (p[0] >= '0' && p[0] <= '9') || + strchr (extra_chars, p[0])); + if (!name_valid) + { + g_warning ("type name `%s' contains invalid characters", type_name); + return FALSE; + } + if (g_type_from_name (type_name)) + { + g_warning ("cannot register existing type `%s'", type_name); + return FALSE; + } + + return TRUE; +} + +static gboolean +check_derivation_I (GType parent_type, + const gchar *type_name) +{ + TypeNode *pnode; + GTypeFundamentalInfo* finfo; + + pnode = lookup_type_node_I (parent_type); + if (!pnode) + { + g_warning ("cannot derive type `%s' from invalid parent type `%s'", + type_name, + type_descriptive_name_I (parent_type)); + return FALSE; + } + finfo = type_node_fundamental_info_I (pnode); + /* ensure flat derivability */ + if (!(finfo->type_flags & G_TYPE_FLAG_DERIVABLE)) + { + g_warning ("cannot derive `%s' from non-derivable parent type `%s'", + type_name, + NODE_NAME (pnode)); + return FALSE; + } + /* ensure deep derivability */ + if (parent_type != NODE_FUNDAMENTAL_TYPE (pnode) && + !(finfo->type_flags & G_TYPE_FLAG_DEEP_DERIVABLE)) + { + g_warning ("cannot derive `%s' from non-fundamental parent type `%s'", + type_name, + NODE_NAME (pnode)); + return FALSE; + } + + return TRUE; +} + +static gboolean +check_collect_format_I (const gchar *collect_format) +{ + const gchar *p = collect_format; + gchar valid_format[] = { G_VALUE_COLLECT_INT, G_VALUE_COLLECT_LONG, + G_VALUE_COLLECT_INT64, G_VALUE_COLLECT_DOUBLE, + G_VALUE_COLLECT_POINTER, 0 }; + + while (*p) + if (!strchr (valid_format, *p++)) + return FALSE; + return p - collect_format <= G_VALUE_COLLECT_FORMAT_MAX_LENGTH; +} + +static gboolean +check_value_table_I (const gchar *type_name, + const GTypeValueTable *value_table) +{ + if (!value_table) + return FALSE; + else if (value_table->value_init == NULL) + { + if (value_table->value_free || value_table->value_copy || + value_table->value_peek_pointer || + value_table->collect_format || value_table->collect_value || + value_table->lcopy_format || value_table->lcopy_value) + g_warning ("cannot handle uninitializable values of type `%s'", + type_name); + return FALSE; + } + else /* value_table->value_init != NULL */ + { + if (!value_table->value_free) + { + /* +++ optional +++ + * g_warning ("missing `value_free()' for type `%s'", type_name); + * return FALSE; + */ + } + if (!value_table->value_copy) + { + g_warning ("missing `value_copy()' for type `%s'", type_name); + return FALSE; + } + if ((value_table->collect_format || value_table->collect_value) && + (!value_table->collect_format || !value_table->collect_value)) + { + g_warning ("one of `collect_format' and `collect_value()' is unspecified for type `%s'", + type_name); + return FALSE; + } + if (value_table->collect_format && !check_collect_format_I (value_table->collect_format)) + { + g_warning ("the `%s' specification for type `%s' is too long or invalid", + "collect_format", + type_name); + return FALSE; + } + if ((value_table->lcopy_format || value_table->lcopy_value) && + (!value_table->lcopy_format || !value_table->lcopy_value)) + { + g_warning ("one of `lcopy_format' and `lcopy_value()' is unspecified for type `%s'", + type_name); + return FALSE; + } + if (value_table->lcopy_format && !check_collect_format_I (value_table->lcopy_format)) + { + g_warning ("the `%s' specification for type `%s' is too long or invalid", + "lcopy_format", + type_name); + return FALSE; + } + } + return TRUE; +} + +static gboolean +check_type_info_I (TypeNode *pnode, + GType ftype, + const gchar *type_name, + const GTypeInfo *info) +{ + GTypeFundamentalInfo *finfo = type_node_fundamental_info_I (lookup_type_node_I (ftype)); + gboolean is_interface = ftype == G_TYPE_INTERFACE; + + g_assert (ftype <= G_TYPE_FUNDAMENTAL_MAX && !(ftype & TYPE_ID_MASK)); + + /* check instance members */ + if (!(finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE) && + (info->instance_size || info->n_preallocs || info->instance_init)) + { + if (pnode) + g_warning ("cannot instantiate `%s', derived from non-instantiatable parent type `%s'", + type_name, + NODE_NAME (pnode)); + else + g_warning ("cannot instantiate `%s' as non-instantiatable fundamental", + type_name); + return FALSE; + } + /* check class & interface members */ + if (!((finfo->type_flags & G_TYPE_FLAG_CLASSED) || is_interface) && + (info->class_init || info->class_finalize || info->class_data || + info->class_size || info->base_init || info->base_finalize)) + { + if (pnode) + g_warning ("cannot create class for `%s', derived from non-classed parent type `%s'", + type_name, + NODE_NAME (pnode)); + else + g_warning ("cannot create class for `%s' as non-classed fundamental", + type_name); + return FALSE; + } + /* check interface size */ + if (is_interface && info->class_size < sizeof (GTypeInterface)) + { + g_warning ("specified interface size for type `%s' is smaller than `GTypeInterface' size", + type_name); + return FALSE; + } + /* check class size */ + if (finfo->type_flags & G_TYPE_FLAG_CLASSED) + { + if (info->class_size < sizeof (GTypeClass)) + { + g_warning ("specified class size for type `%s' is smaller than `GTypeClass' size", + type_name); + return FALSE; + } + if (pnode && info->class_size < pnode->data->class.class_size) + { + g_warning ("specified class size for type `%s' is smaller " + "than the parent type's `%s' class size", + type_name, + NODE_NAME (pnode)); + return FALSE; + } + } + /* check instance size */ + if (finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE) + { + if (info->instance_size < sizeof (GTypeInstance)) + { + g_warning ("specified instance size for type `%s' is smaller than `GTypeInstance' size", + type_name); + return FALSE; + } + if (pnode && info->instance_size < pnode->data->instance.instance_size) + { + g_warning ("specified instance size for type `%s' is smaller " + "than the parent type's `%s' instance size", + type_name, + NODE_NAME (pnode)); + return FALSE; + } + } + + return TRUE; +} + +static TypeNode* +find_conforming_child_type_L (TypeNode *pnode, + TypeNode *iface) +{ + TypeNode *node = NULL; + guint i; + + if (type_lookup_iface_entry_L (pnode, iface)) + return pnode; + + for (i = 0; i < pnode->n_children && !node; i++) + node = find_conforming_child_type_L (lookup_type_node_I (pnode->children[i]), iface); + + return node; +} + +static gboolean +check_add_interface_L (GType instance_type, + GType iface_type) +{ + TypeNode *node = lookup_type_node_I (instance_type); + TypeNode *iface = lookup_type_node_I (iface_type); + IFaceEntry *entry; + TypeNode *tnode; + GType *prerequisites; + guint i; + + + if (!node || !node->is_instantiatable) + { + g_warning ("cannot add interfaces to invalid (non-instantiatable) type `%s'", + type_descriptive_name_I (instance_type)); + return FALSE; + } + if (!iface || !NODE_IS_IFACE (iface)) + { + g_warning ("cannot add invalid (non-interface) type `%s' to type `%s'", + type_descriptive_name_I (iface_type), + NODE_NAME (node)); + return FALSE; + } + tnode = lookup_type_node_I (NODE_PARENT_TYPE (iface)); + if (NODE_PARENT_TYPE (tnode) && !type_lookup_iface_entry_L (node, tnode)) + { + /* 2001/7/31:timj: erk, i guess this warning is junk as interface derivation is flat */ + g_warning ("cannot add sub-interface `%s' to type `%s' which does not conform to super-interface `%s'", + NODE_NAME (iface), + NODE_NAME (node), + NODE_NAME (tnode)); + return FALSE; + } + /* allow overriding of interface type introduced for parent type */ + entry = type_lookup_iface_entry_L (node, iface); + if (entry && entry->vtable == NULL && !type_iface_peek_holder_L (iface, NODE_TYPE (node))) + { + /* ok, we do conform to this interface already, but the interface vtable was not + * yet intialized, and we just conform to the interface because it got added to + * one of our parents. so we allow overriding of holder info here. + */ + return TRUE; + } + /* check whether one of our children already conforms (or whether the interface + * got added to this node already) + */ + tnode = find_conforming_child_type_L (node, iface); /* tnode is_a node */ + if (tnode) + { + g_warning ("cannot add interface type `%s' to type `%s', since type `%s' already conforms to interface", + NODE_NAME (iface), + NODE_NAME (node), + NODE_NAME (tnode)); + return FALSE; + } + prerequisites = IFACE_NODE_PREREQUISITES (iface); + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++) + { + tnode = lookup_type_node_I (prerequisites[i]); + if (!type_node_is_a_L (node, tnode)) + { + g_warning ("cannot add interface type `%s' to type `%s' which does not conform to prerequisite `%s'", + NODE_NAME (iface), + NODE_NAME (node), + NODE_NAME (tnode)); + return FALSE; + } + } + return TRUE; +} + +static gboolean +check_interface_info_I (TypeNode *iface, + GType instance_type, + const GInterfaceInfo *info) +{ + if ((info->interface_finalize || info->interface_data) && !info->interface_init) + { + g_warning ("interface type `%s' for type `%s' comes without initializer", + NODE_NAME (iface), + type_descriptive_name_I (instance_type)); + return FALSE; + } + + return TRUE; +} + +/* --- type info (type node data) --- */ +static void +type_data_make_W (TypeNode *node, + const GTypeInfo *info, + const GTypeValueTable *value_table) +{ + TypeData *data; + GTypeValueTable *vtable = NULL; + guint vtable_size = 0; + + g_assert (node->data == NULL && info != NULL); + + if (!value_table) + { + TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + + if (pnode) + vtable = pnode->data->common.value_table; + else + { + static const GTypeValueTable zero_vtable = { NULL, }; + + value_table = &zero_vtable; + } + } + if (value_table) + { + /* need to setup vtable_size since we have to allocate it with data in one chunk */ + vtable_size = sizeof (GTypeValueTable); + if (value_table->collect_format) + vtable_size += strlen (value_table->collect_format); + if (value_table->lcopy_format) + vtable_size += strlen (value_table->lcopy_format); + vtable_size += 2; + } + + if (node->is_instantiatable) /* carefull, is_instantiatable is also is_classed */ + { + TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + + data = g_malloc0 (sizeof (InstanceData) + vtable_size); + if (vtable_size) + vtable = G_STRUCT_MEMBER_P (data, sizeof (InstanceData)); + data->instance.class_size = info->class_size; + data->instance.class_init_base = info->base_init; + data->instance.class_finalize_base = info->base_finalize; + data->instance.class_init = info->class_init; + data->instance.class_finalize = info->class_finalize; + data->instance.class_data = info->class_data; + data->instance.class = NULL; + data->instance.init_state = UNINITIALIZED; + data->instance.instance_size = info->instance_size; + /* We'll set the final value for data->instance.private size + * after the parent class has been initialized + */ + data->instance.private_size = 0; + data->instance.class_private_size = 0; + if (pnode) + data->instance.class_private_size = pnode->data->instance.class_private_size; +#ifdef DISABLE_MEM_POOLS + data->instance.n_preallocs = 0; +#else /* !DISABLE_MEM_POOLS */ + data->instance.n_preallocs = MIN (info->n_preallocs, 1024); +#endif /* !DISABLE_MEM_POOLS */ + data->instance.instance_init = info->instance_init; + } + else if (node->is_classed) /* only classed */ + { + TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + + data = g_malloc0 (sizeof (ClassData) + vtable_size); + if (vtable_size) + vtable = G_STRUCT_MEMBER_P (data, sizeof (ClassData)); + data->class.class_size = info->class_size; + data->class.class_init_base = info->base_init; + data->class.class_finalize_base = info->base_finalize; + data->class.class_init = info->class_init; + data->class.class_finalize = info->class_finalize; + data->class.class_data = info->class_data; + data->class.class = NULL; + data->class.class_private_size = 0; + if (pnode) + data->class.class_private_size = pnode->data->class.class_private_size; + data->class.init_state = UNINITIALIZED; + } + else if (NODE_IS_IFACE (node)) + { + data = g_malloc0 (sizeof (IFaceData) + vtable_size); + if (vtable_size) + vtable = G_STRUCT_MEMBER_P (data, sizeof (IFaceData)); + data->iface.vtable_size = info->class_size; + data->iface.vtable_init_base = info->base_init; + data->iface.vtable_finalize_base = info->base_finalize; + data->iface.dflt_init = info->class_init; + data->iface.dflt_finalize = info->class_finalize; + data->iface.dflt_data = info->class_data; + data->iface.dflt_vtable = NULL; + } + else if (NODE_IS_BOXED (node)) + { + data = g_malloc0 (sizeof (BoxedData) + vtable_size); + if (vtable_size) + vtable = G_STRUCT_MEMBER_P (data, sizeof (BoxedData)); + } + else + { + data = g_malloc0 (sizeof (CommonData) + vtable_size); + if (vtable_size) + vtable = G_STRUCT_MEMBER_P (data, sizeof (CommonData)); + } + + node->data = data; + + if (vtable_size) + { + gchar *p; + + /* we allocate the vtable and its strings together with the type data, so + * children can take over their parent's vtable pointer, and we don't + * need to worry freeing it or not when the child data is destroyed + */ + *vtable = *value_table; + p = G_STRUCT_MEMBER_P (vtable, sizeof (*vtable)); + p[0] = 0; + vtable->collect_format = p; + if (value_table->collect_format) + { + strcat (p, value_table->collect_format); + p += strlen (value_table->collect_format); + } + p++; + p[0] = 0; + vtable->lcopy_format = p; + if (value_table->lcopy_format) + strcat (p, value_table->lcopy_format); + } + node->data->common.value_table = vtable; + node->mutatable_check_cache = (node->data->common.value_table->value_init != NULL && + !((G_TYPE_FLAG_VALUE_ABSTRACT | G_TYPE_FLAG_ABSTRACT) & + GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags)))); + + g_assert (node->data->common.value_table != NULL); /* paranoid */ + + g_atomic_int_set ((int *) &node->ref_count, 1); +} + +static inline void +type_data_ref_Wm (TypeNode *node) +{ + if (!node->data) + { + TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + GTypeInfo tmp_info; + GTypeValueTable tmp_value_table; + + g_assert (node->plugin != NULL); + + if (pnode) + { + type_data_ref_Wm (pnode); + if (node->data) + INVALID_RECURSION ("g_type_plugin_*", node->plugin, NODE_NAME (node)); + } + + memset (&tmp_info, 0, sizeof (tmp_info)); + memset (&tmp_value_table, 0, sizeof (tmp_value_table)); + + G_WRITE_UNLOCK (&type_rw_lock); + g_type_plugin_use (node->plugin); + g_type_plugin_complete_type_info (node->plugin, NODE_TYPE (node), &tmp_info, &tmp_value_table); + G_WRITE_LOCK (&type_rw_lock); + if (node->data) + INVALID_RECURSION ("g_type_plugin_*", node->plugin, NODE_NAME (node)); + + check_type_info_I (pnode, NODE_FUNDAMENTAL_TYPE (node), NODE_NAME (node), &tmp_info); + type_data_make_W (node, &tmp_info, + check_value_table_I (NODE_NAME (node), + &tmp_value_table) ? &tmp_value_table : NULL); + } + else + { + g_assert (NODE_REFCOUNT (node) > 0); + + g_atomic_int_inc ((int *) &node->ref_count); + } +} + +static inline gboolean +type_data_ref_U (TypeNode *node) +{ + guint current; + + do { + current = NODE_REFCOUNT (node); + + if (current < 1) + return FALSE; + } while (!g_atomic_int_compare_and_exchange ((int *) &node->ref_count, current, current + 1)); + + return TRUE; +} + +static gboolean +iface_node_has_available_offset_L (TypeNode *iface_node, + int offset, + int for_index) +{ + guint8 *offsets; + + offsets = G_ATOMIC_ARRAY_GET_LOCKED (&iface_node->_prot.offsets, guint8); + if (offsets == NULL) + return TRUE; + + if (G_ATOMIC_ARRAY_DATA_SIZE (offsets) <= offset) + return TRUE; + + if (offsets[offset] == 0 || + offsets[offset] == for_index+1) + return TRUE; + + return FALSE; +} + +static int +find_free_iface_offset_L (IFaceEntries *entries) +{ + IFaceEntry *entry; + TypeNode *iface_node; + int offset; + int i; + int n_entries; + + n_entries = IFACE_ENTRIES_N_ENTRIES (entries); + offset = -1; + do + { + offset++; + for (i = 0; i < n_entries; i++) + { + entry = &entries->entry[i]; + iface_node = lookup_type_node_I (entry->iface_type); + + if (!iface_node_has_available_offset_L (iface_node, offset, i)) + break; + } + } + while (i != n_entries); + + return offset; +} + +static void +iface_node_set_offset_L (TypeNode *iface_node, + int offset, + int index) +{ + guint8 *offsets, *old_offsets; + int new_size, old_size; + int i; + + old_offsets = G_ATOMIC_ARRAY_GET_LOCKED (&iface_node->_prot.offsets, guint8); + if (old_offsets == NULL) + old_size = 0; + else + { + old_size = G_ATOMIC_ARRAY_DATA_SIZE (old_offsets); + if (offset < old_size && + old_offsets[offset] == index + 1) + return; /* Already set to this index, return */ + } + new_size = MAX (old_size, offset + 1); + + offsets = _g_atomic_array_copy (&iface_node->_prot.offsets, + 0, new_size - old_size); + + /* Mark new area as unused */ + for (i = old_size; i < new_size; i++) + offsets[i] = 0; + + offsets[offset] = index + 1; + + _g_atomic_array_update (&iface_node->_prot.offsets, offsets); +} + +static void +type_node_add_iface_entry_W (TypeNode *node, + GType iface_type, + IFaceEntry *parent_entry) +{ + IFaceEntries *entries; + IFaceEntry *entry; + TypeNode *iface_node; + guint i, j; + int num_entries; + + g_assert (node->is_instantiatable); + + entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node); + if (entries != NULL) + { + num_entries = IFACE_ENTRIES_N_ENTRIES (entries); + + g_assert (num_entries < MAX_N_INTERFACES); + + for (i = 0; i < num_entries; i++) + { + entry = &entries->entry[i]; + if (entry->iface_type == iface_type) + { + /* this can happen in two cases: + * - our parent type already conformed to iface_type and node + * got its own holder info. here, our children already have + * entries and NULL vtables, since this will only work for + * uninitialized classes. + * - an interface type is added to an ancestor after it was + * added to a child type. + */ + if (!parent_entry) + g_assert (entry->vtable == NULL && entry->init_state == UNINITIALIZED); + else + { + /* sick, interface is added to ancestor *after* child type; + * nothing todo, the entry and our children were already setup correctly + */ + } + return; + } + } + } + + entries = _g_atomic_array_copy (CLASSED_NODE_IFACES_ENTRIES (node), + IFACE_ENTRIES_HEADER_SIZE, + sizeof (IFaceEntry)); + num_entries = IFACE_ENTRIES_N_ENTRIES (entries); + i = num_entries - 1; + if (i == 0) + entries->offset_index = 0; + entries->entry[i].iface_type = iface_type; + entries->entry[i].vtable = NULL; + entries->entry[i].init_state = UNINITIALIZED; + + if (parent_entry) + { + if (node->data && node->data->class.init_state >= BASE_IFACE_INIT) + { + entries->entry[i].init_state = INITIALIZED; + entries->entry[i].vtable = parent_entry->vtable; + } + } + + /* Update offsets in iface */ + iface_node = lookup_type_node_I (iface_type); + + if (iface_node_has_available_offset_L (iface_node, + entries->offset_index, + i)) + { + iface_node_set_offset_L (iface_node, + entries->offset_index, i); + } + else + { + entries->offset_index = + find_free_iface_offset_L (entries); + for (j = 0; j < IFACE_ENTRIES_N_ENTRIES (entries); j++) + { + entry = &entries->entry[j]; + iface_node = + lookup_type_node_I (entry->iface_type); + iface_node_set_offset_L (iface_node, + entries->offset_index, j); + } + } + + _g_atomic_array_update (CLASSED_NODE_IFACES_ENTRIES (node), entries); + + if (parent_entry) + { + for (i = 0; i < node->n_children; i++) + type_node_add_iface_entry_W (lookup_type_node_I (node->children[i]), iface_type, &entries->entry[i]); + } +} + +static void +type_add_interface_Wm (TypeNode *node, + TypeNode *iface, + const GInterfaceInfo *info, + GTypePlugin *plugin) +{ + IFaceHolder *iholder = g_new0 (IFaceHolder, 1); + IFaceEntry *entry; + guint i; + + g_assert (node->is_instantiatable && NODE_IS_IFACE (iface) && ((info && !plugin) || (!info && plugin))); + + iholder->next = iface_node_get_holders_L (iface); + iface_node_set_holders_W (iface, iholder); + iholder->instance_type = NODE_TYPE (node); + iholder->info = info ? g_memdup (info, sizeof (*info)) : NULL; + iholder->plugin = plugin; + + /* create an iface entry for this type */ + type_node_add_iface_entry_W (node, NODE_TYPE (iface), NULL); + + /* if the class is already (partly) initialized, we may need to base + * initalize and/or initialize the new interface. + */ + if (node->data) + { + InitState class_state = node->data->class.init_state; + + if (class_state >= BASE_IFACE_INIT) + type_iface_vtable_base_init_Wm (iface, node); + + if (class_state >= IFACE_INIT) + type_iface_vtable_iface_init_Wm (iface, node); + } + + /* create iface entries for children of this type */ + entry = type_lookup_iface_entry_L (node, iface); + for (i = 0; i < node->n_children; i++) + type_node_add_iface_entry_W (lookup_type_node_I (node->children[i]), NODE_TYPE (iface), entry); +} + +static void +type_iface_add_prerequisite_W (TypeNode *iface, + TypeNode *prerequisite_node) +{ + GType prerequisite_type = NODE_TYPE (prerequisite_node); + GType *prerequisites, *dependants; + guint n_dependants, i; + + g_assert (NODE_IS_IFACE (iface) && + IFACE_NODE_N_PREREQUISITES (iface) < MAX_N_PREREQUISITES && + (prerequisite_node->is_instantiatable || NODE_IS_IFACE (prerequisite_node))); + + prerequisites = IFACE_NODE_PREREQUISITES (iface); + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++) + if (prerequisites[i] == prerequisite_type) + return; /* we already have that prerequisiste */ + else if (prerequisites[i] > prerequisite_type) + break; + IFACE_NODE_N_PREREQUISITES (iface) += 1; + IFACE_NODE_PREREQUISITES (iface) = g_renew (GType, + IFACE_NODE_PREREQUISITES (iface), + IFACE_NODE_N_PREREQUISITES (iface)); + prerequisites = IFACE_NODE_PREREQUISITES (iface); + g_memmove (prerequisites + i + 1, prerequisites + i, + sizeof (prerequisites[0]) * (IFACE_NODE_N_PREREQUISITES (iface) - i - 1)); + prerequisites[i] = prerequisite_type; + + /* we want to get notified when prerequisites get added to prerequisite_node */ + if (NODE_IS_IFACE (prerequisite_node)) + { + dependants = iface_node_get_dependants_array_L (prerequisite_node); + n_dependants = dependants ? dependants[0] : 0; + n_dependants += 1; + dependants = g_renew (GType, dependants, n_dependants + 1); + dependants[n_dependants] = NODE_TYPE (iface); + dependants[0] = n_dependants; + iface_node_set_dependants_array_W (prerequisite_node, dependants); + } + + /* we need to notify all dependants */ + dependants = iface_node_get_dependants_array_L (iface); + n_dependants = dependants ? dependants[0] : 0; + for (i = 1; i <= n_dependants; i++) + type_iface_add_prerequisite_W (lookup_type_node_I (dependants[i]), prerequisite_node); +} + +/** + * g_type_interface_add_prerequisite: + * @interface_type: #GType value of an interface type. + * @prerequisite_type: #GType value of an interface or instantiatable type. + * + * Adds @prerequisite_type to the list of prerequisites of @interface_type. + * This means that any type implementing @interface_type must also implement + * @prerequisite_type. Prerequisites can be thought of as an alternative to + * interface derivation (which GType doesn't support). An interface can have + * at most one instantiatable prerequisite type. + */ +void +g_type_interface_add_prerequisite (GType interface_type, + GType prerequisite_type) +{ + TypeNode *iface, *prerequisite_node; + IFaceHolder *holders; + + g_return_if_fail (G_TYPE_IS_INTERFACE (interface_type)); /* G_TYPE_IS_INTERFACE() is an external call: _U */ + g_return_if_fail (!g_type_is_a (interface_type, prerequisite_type)); + g_return_if_fail (!g_type_is_a (prerequisite_type, interface_type)); + + iface = lookup_type_node_I (interface_type); + prerequisite_node = lookup_type_node_I (prerequisite_type); + if (!iface || !prerequisite_node || !NODE_IS_IFACE (iface)) + { + g_warning ("interface type `%s' or prerequisite type `%s' invalid", + type_descriptive_name_I (interface_type), + type_descriptive_name_I (prerequisite_type)); + return; + } + G_WRITE_LOCK (&type_rw_lock); + holders = iface_node_get_holders_L (iface); + if (holders) + { + G_WRITE_UNLOCK (&type_rw_lock); + g_warning ("unable to add prerequisite `%s' to interface `%s' which is already in use for `%s'", + type_descriptive_name_I (prerequisite_type), + type_descriptive_name_I (interface_type), + type_descriptive_name_I (holders->instance_type)); + return; + } + if (prerequisite_node->is_instantiatable) + { + guint i; + + /* can have at most one publically installable instantiatable prerequisite */ + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++) + { + TypeNode *prnode = lookup_type_node_I (IFACE_NODE_PREREQUISITES (iface)[i]); + + if (prnode->is_instantiatable) + { + G_WRITE_UNLOCK (&type_rw_lock); + g_warning ("adding prerequisite `%s' to interface `%s' conflicts with existing prerequisite `%s'", + type_descriptive_name_I (prerequisite_type), + type_descriptive_name_I (interface_type), + type_descriptive_name_I (NODE_TYPE (prnode))); + return; + } + } + + for (i = 0; i < prerequisite_node->n_supers + 1; i++) + type_iface_add_prerequisite_W (iface, lookup_type_node_I (prerequisite_node->supers[i])); + G_WRITE_UNLOCK (&type_rw_lock); + } + else if (NODE_IS_IFACE (prerequisite_node)) + { + GType *prerequisites; + guint i; + + prerequisites = IFACE_NODE_PREREQUISITES (prerequisite_node); + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (prerequisite_node); i++) + type_iface_add_prerequisite_W (iface, lookup_type_node_I (prerequisites[i])); + type_iface_add_prerequisite_W (iface, prerequisite_node); + G_WRITE_UNLOCK (&type_rw_lock); + } + else + { + G_WRITE_UNLOCK (&type_rw_lock); + g_warning ("prerequisite `%s' for interface `%s' is neither instantiatable nor interface", + type_descriptive_name_I (prerequisite_type), + type_descriptive_name_I (interface_type)); + } +} + +/** + * g_type_interface_prerequisites: + * @interface_type: an interface type + * @n_prerequisites: location to return the number of prerequisites, or %NULL + * + * Returns the prerequisites of an interfaces type. + * + * Since: 2.2 + * + * Returns: a newly-allocated zero-terminated array of #GType containing + * the prerequisites of @interface_type + */ +GType* +g_type_interface_prerequisites (GType interface_type, + guint *n_prerequisites) +{ + TypeNode *iface; + + g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface_type), NULL); + + iface = lookup_type_node_I (interface_type); + if (iface) + { + GType *types; + TypeNode *inode = NULL; + guint i, n = 0; + + G_READ_LOCK (&type_rw_lock); + types = g_new0 (GType, IFACE_NODE_N_PREREQUISITES (iface) + 1); + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (iface); i++) + { + GType prerequisite = IFACE_NODE_PREREQUISITES (iface)[i]; + TypeNode *node = lookup_type_node_I (prerequisite); + if (node->is_instantiatable) + { + if (!inode || type_node_is_a_L (node, inode)) + inode = node; + } + else + types[n++] = NODE_TYPE (node); + } + if (inode) + types[n++] = NODE_TYPE (inode); + + if (n_prerequisites) + *n_prerequisites = n; + G_READ_UNLOCK (&type_rw_lock); + + return types; + } + else + { + if (n_prerequisites) + *n_prerequisites = 0; + + return NULL; + } +} + + +static IFaceHolder* +type_iface_peek_holder_L (TypeNode *iface, + GType instance_type) +{ + IFaceHolder *iholder; + + g_assert (NODE_IS_IFACE (iface)); + + iholder = iface_node_get_holders_L (iface); + while (iholder && iholder->instance_type != instance_type) + iholder = iholder->next; + return iholder; +} + +static IFaceHolder* +type_iface_retrieve_holder_info_Wm (TypeNode *iface, + GType instance_type, + gboolean need_info) +{ + IFaceHolder *iholder = type_iface_peek_holder_L (iface, instance_type); + + if (iholder && !iholder->info && need_info) + { + GInterfaceInfo tmp_info; + + g_assert (iholder->plugin != NULL); + + type_data_ref_Wm (iface); + if (iholder->info) + INVALID_RECURSION ("g_type_plugin_*", iface->plugin, NODE_NAME (iface)); + + memset (&tmp_info, 0, sizeof (tmp_info)); + + G_WRITE_UNLOCK (&type_rw_lock); + g_type_plugin_use (iholder->plugin); + g_type_plugin_complete_interface_info (iholder->plugin, instance_type, NODE_TYPE (iface), &tmp_info); + G_WRITE_LOCK (&type_rw_lock); + if (iholder->info) + INVALID_RECURSION ("g_type_plugin_*", iholder->plugin, NODE_NAME (iface)); + + check_interface_info_I (iface, instance_type, &tmp_info); + iholder->info = g_memdup (&tmp_info, sizeof (tmp_info)); + } + + return iholder; /* we don't modify write lock upon returning NULL */ +} + +static void +type_iface_blow_holder_info_Wm (TypeNode *iface, + GType instance_type) +{ + IFaceHolder *iholder = iface_node_get_holders_L (iface); + + g_assert (NODE_IS_IFACE (iface)); + + while (iholder->instance_type != instance_type) + iholder = iholder->next; + + if (iholder->info && iholder->plugin) + { + g_free (iholder->info); + iholder->info = NULL; + + G_WRITE_UNLOCK (&type_rw_lock); + g_type_plugin_unuse (iholder->plugin); + type_data_unref_U (iface, FALSE); + G_WRITE_LOCK (&type_rw_lock); + } +} + +/* Assumes type's class already exists + */ +static inline size_t +type_total_instance_size_I (TypeNode *node) +{ + gsize total_instance_size; + + total_instance_size = node->data->instance.instance_size; + if (node->data->instance.private_size != 0) + total_instance_size = ALIGN_STRUCT (total_instance_size) + node->data->instance.private_size; + + return total_instance_size; +} + +/* --- type structure creation/destruction --- */ +typedef struct { + gpointer instance; + gpointer class; +} InstanceRealClass; + +static gint +instance_real_class_cmp (gconstpointer p1, + gconstpointer p2) +{ + const InstanceRealClass *irc1 = p1; + const InstanceRealClass *irc2 = p2; + guint8 *i1 = irc1->instance; + guint8 *i2 = irc2->instance; + return G_BSEARCH_ARRAY_CMP (i1, i2); +} + +G_LOCK_DEFINE_STATIC (instance_real_class); +static GBSearchArray *instance_real_class_bsa = NULL; +static GBSearchConfig instance_real_class_bconfig = { + sizeof (InstanceRealClass), + instance_real_class_cmp, + 0, +}; + +static inline void +instance_real_class_set (gpointer instance, + GTypeClass *class) +{ + InstanceRealClass key; + key.instance = instance; + key.class = class; + G_LOCK (instance_real_class); + if (!instance_real_class_bsa) + instance_real_class_bsa = g_bsearch_array_create (&instance_real_class_bconfig); + instance_real_class_bsa = g_bsearch_array_replace (instance_real_class_bsa, &instance_real_class_bconfig, &key); + G_UNLOCK (instance_real_class); +} + +static inline void +instance_real_class_remove (gpointer instance) +{ + InstanceRealClass key, *node; + guint index; + key.instance = instance; + G_LOCK (instance_real_class); + node = g_bsearch_array_lookup (instance_real_class_bsa, &instance_real_class_bconfig, &key); + index = g_bsearch_array_get_index (instance_real_class_bsa, &instance_real_class_bconfig, node); + instance_real_class_bsa = g_bsearch_array_remove (instance_real_class_bsa, &instance_real_class_bconfig, index); + if (!g_bsearch_array_get_n_nodes (instance_real_class_bsa)) + { + g_bsearch_array_free (instance_real_class_bsa, &instance_real_class_bconfig); + instance_real_class_bsa = NULL; + } + G_UNLOCK (instance_real_class); +} + +static inline GTypeClass* +instance_real_class_get (gpointer instance) +{ + InstanceRealClass key, *node; + GTypeClass *class; + key.instance = instance; + G_LOCK (instance_real_class); + node = instance_real_class_bsa ? g_bsearch_array_lookup (instance_real_class_bsa, &instance_real_class_bconfig, &key) : NULL; + class = node ? node->class : NULL; + G_UNLOCK (instance_real_class); + return class; +} + +/** + * g_type_create_instance: + * @type: An instantiatable type to create an instance for. + * + * Creates and initializes an instance of @type if @type is valid and + * can be instantiated. The type system only performs basic allocation + * and structure setups for instances: actual instance creation should + * happen through functions supplied by the type's fundamental type + * implementation. So use of g_type_create_instance() is reserved for + * implementators of fundamental types only. E.g. instances of the + * #GObject hierarchy should be created via g_object_new() and + * never directly through + * g_type_create_instance() which doesn't handle things like singleton + * objects or object construction. Note: Do not + * use this function, unless you're implementing a fundamental + * type. Also language bindings should not use + * this function but g_object_new() instead. + * + * Returns: An allocated and initialized instance, subject to further + * treatment by the fundamental type implementation. + */ +GTypeInstance* +g_type_create_instance (GType type) +{ + TypeNode *node; + GTypeInstance *instance; + GTypeClass *class; + guint i, total_size; + + node = lookup_type_node_I (type); + if (!node || !node->is_instantiatable) + { + g_warning ("cannot create new instance of invalid (non-instantiatable) type `%s'", + type_descriptive_name_I (type)); + return NULL; + } + /* G_TYPE_IS_ABSTRACT() is an external call: _U */ + if (!node->mutatable_check_cache && G_TYPE_IS_ABSTRACT (type)) + { + g_warning ("cannot create instance of abstract (non-instantiatable) type `%s'", + type_descriptive_name_I (type)); + return NULL; + } + + class = g_type_class_ref (type); + total_size = type_total_instance_size_I (node); + + instance = g_slice_alloc0 (total_size); + + if (node->data->instance.private_size) + instance_real_class_set (instance, class); + for (i = node->n_supers; i > 0; i--) + { + TypeNode *pnode; + + pnode = lookup_type_node_I (node->supers[i]); + if (pnode->data->instance.instance_init) + { + instance->g_class = pnode->data->instance.class; + pnode->data->instance.instance_init (instance, class); + } + } + if (node->data->instance.private_size) + instance_real_class_remove (instance); + + instance->g_class = class; + if (node->data->instance.instance_init) + node->data->instance.instance_init (instance, class); + + return instance; +} + +/** + * g_type_free_instance: + * @instance: an instance of a type. + * + * Frees an instance of a type, returning it to the instance pool for + * the type, if there is one. + * + * Like g_type_create_instance(), this function is reserved for + * implementors of fundamental types. + */ +void +g_type_free_instance (GTypeInstance *instance) +{ + TypeNode *node; + GTypeClass *class; + + g_return_if_fail (instance != NULL && instance->g_class != NULL); + + class = instance->g_class; + node = lookup_type_node_I (class->g_type); + if (!node || !node->is_instantiatable || !node->data || node->data->class.class != (gpointer) class) + { + g_warning ("cannot free instance of invalid (non-instantiatable) type `%s'", + type_descriptive_name_I (class->g_type)); + return; + } + /* G_TYPE_IS_ABSTRACT() is an external call: _U */ + if (!node->mutatable_check_cache && G_TYPE_IS_ABSTRACT (NODE_TYPE (node))) + { + g_warning ("cannot free instance of abstract (non-instantiatable) type `%s'", + NODE_NAME (node)); + return; + } + + instance->g_class = NULL; +#ifdef G_ENABLE_DEBUG + memset (instance, 0xaa, type_total_instance_size_I (node)); +#endif + g_slice_free1 (type_total_instance_size_I (node), instance); + + g_type_class_unref (class); +} + +static void +type_iface_ensure_dflt_vtable_Wm (TypeNode *iface) +{ + g_assert (iface->data); + + if (!iface->data->iface.dflt_vtable) + { + GTypeInterface *vtable = g_malloc0 (iface->data->iface.vtable_size); + iface->data->iface.dflt_vtable = vtable; + vtable->g_type = NODE_TYPE (iface); + vtable->g_instance_type = 0; + if (iface->data->iface.vtable_init_base || + iface->data->iface.dflt_init) + { + G_WRITE_UNLOCK (&type_rw_lock); + if (iface->data->iface.vtable_init_base) + iface->data->iface.vtable_init_base (vtable); + if (iface->data->iface.dflt_init) + iface->data->iface.dflt_init (vtable, (gpointer) iface->data->iface.dflt_data); + G_WRITE_LOCK (&type_rw_lock); + } + } +} + + +/* This is called to allocate and do the first part of initializing + * the interface vtable; type_iface_vtable_iface_init_Wm() does the remainder. + * + * A FALSE return indicates that we didn't find an init function for + * this type/iface pair, so the vtable from the parent type should + * be used. Note that the write lock is not modified upon a FALSE + * return. + */ +static gboolean +type_iface_vtable_base_init_Wm (TypeNode *iface, + TypeNode *node) +{ + IFaceEntry *entry; + IFaceHolder *iholder; + GTypeInterface *vtable = NULL; + TypeNode *pnode; + + /* type_iface_retrieve_holder_info_Wm() doesn't modify write lock for returning NULL */ + iholder = type_iface_retrieve_holder_info_Wm (iface, NODE_TYPE (node), TRUE); + if (!iholder) + return FALSE; /* we don't modify write lock upon FALSE */ + + type_iface_ensure_dflt_vtable_Wm (iface); + + entry = type_lookup_iface_entry_L (node, iface); + + g_assert (iface->data && entry && entry->vtable == NULL && iholder && iholder->info); + + entry->init_state = IFACE_INIT; + + pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + if (pnode) /* want to copy over parent iface contents */ + { + IFaceEntry *pentry = type_lookup_iface_entry_L (pnode, iface); + + if (pentry) + vtable = g_memdup (pentry->vtable, iface->data->iface.vtable_size); + } + if (!vtable) + vtable = g_memdup (iface->data->iface.dflt_vtable, iface->data->iface.vtable_size); + entry->vtable = vtable; + vtable->g_type = NODE_TYPE (iface); + vtable->g_instance_type = NODE_TYPE (node); + + if (iface->data->iface.vtable_init_base) + { + G_WRITE_UNLOCK (&type_rw_lock); + iface->data->iface.vtable_init_base (vtable); + G_WRITE_LOCK (&type_rw_lock); + } + return TRUE; /* initialized the vtable */ +} + +/* Finishes what type_iface_vtable_base_init_Wm started by + * calling the interface init function. + * this function may only be called for types with their + * own interface holder info, i.e. types for which + * g_type_add_interface*() was called and not children thereof. + */ +static void +type_iface_vtable_iface_init_Wm (TypeNode *iface, + TypeNode *node) +{ + IFaceEntry *entry = type_lookup_iface_entry_L (node, iface); + IFaceHolder *iholder = type_iface_peek_holder_L (iface, NODE_TYPE (node)); + GTypeInterface *vtable = NULL; + guint i; + + /* iholder->info should have been filled in by type_iface_vtable_base_init_Wm() */ + g_assert (iface->data && entry && iholder && iholder->info); + g_assert (entry->init_state == IFACE_INIT); /* assert prior base_init() */ + + entry->init_state = INITIALIZED; + + vtable = entry->vtable; + + if (iholder->info->interface_init) + { + G_WRITE_UNLOCK (&type_rw_lock); + if (iholder->info->interface_init) + iholder->info->interface_init (vtable, iholder->info->interface_data); + G_WRITE_LOCK (&type_rw_lock); + } + + for (i = 0; i < static_n_iface_check_funcs; i++) + { + GTypeInterfaceCheckFunc check_func = static_iface_check_funcs[i].check_func; + gpointer check_data = static_iface_check_funcs[i].check_data; + + G_WRITE_UNLOCK (&type_rw_lock); + check_func (check_data, (gpointer)vtable); + G_WRITE_LOCK (&type_rw_lock); + } +} + +static gboolean +type_iface_vtable_finalize_Wm (TypeNode *iface, + TypeNode *node, + GTypeInterface *vtable) +{ + IFaceEntry *entry = type_lookup_iface_entry_L (node, iface); + IFaceHolder *iholder; + + /* type_iface_retrieve_holder_info_Wm() doesn't modify write lock for returning NULL */ + iholder = type_iface_retrieve_holder_info_Wm (iface, NODE_TYPE (node), FALSE); + if (!iholder) + return FALSE; /* we don't modify write lock upon FALSE */ + + g_assert (entry && entry->vtable == vtable && iholder->info); + + entry->vtable = NULL; + entry->init_state = UNINITIALIZED; + if (iholder->info->interface_finalize || iface->data->iface.vtable_finalize_base) + { + G_WRITE_UNLOCK (&type_rw_lock); + if (iholder->info->interface_finalize) + iholder->info->interface_finalize (vtable, iholder->info->interface_data); + if (iface->data->iface.vtable_finalize_base) + iface->data->iface.vtable_finalize_base (vtable); + G_WRITE_LOCK (&type_rw_lock); + } + vtable->g_type = 0; + vtable->g_instance_type = 0; + g_free (vtable); + + type_iface_blow_holder_info_Wm (iface, NODE_TYPE (node)); + + return TRUE; /* write lock modified */ +} + +static void +type_class_init_Wm (TypeNode *node, + GTypeClass *pclass) +{ + GSList *slist, *init_slist = NULL; + GTypeClass *class; + IFaceEntries *entries; + IFaceEntry *entry; + TypeNode *bnode, *pnode; + guint i; + + /* Accessing data->class will work for instantiable types + * too because ClassData is a subset of InstanceData + */ + g_assert (node->is_classed && node->data && + node->data->class.class_size && + !node->data->class.class && + node->data->class.init_state == UNINITIALIZED); + if (node->data->class.class_private_size) + class = g_malloc0 (ALIGN_STRUCT (node->data->class.class_size) + node->data->class.class_private_size); + else + class = g_malloc0 (node->data->class.class_size); + node->data->class.class = class; + g_atomic_int_set (&node->data->class.init_state, BASE_CLASS_INIT); + + if (pclass) + { + TypeNode *pnode = lookup_type_node_I (pclass->g_type); + + memcpy (class, pclass, pnode->data->class.class_size); + memcpy (G_STRUCT_MEMBER_P (class, ALIGN_STRUCT (node->data->class.class_size)), G_STRUCT_MEMBER_P (pclass, ALIGN_STRUCT (pnode->data->class.class_size)), pnode->data->class.class_private_size); + + if (node->is_instantiatable) + { + /* We need to initialize the private_size here rather than in + * type_data_make_W() since the class init for the parent + * class may have changed pnode->data->instance.private_size. + */ + node->data->instance.private_size = pnode->data->instance.private_size; + } + } + class->g_type = NODE_TYPE (node); + + G_WRITE_UNLOCK (&type_rw_lock); + + /* stack all base class initialization functions, so we + * call them in ascending order. + */ + for (bnode = node; bnode; bnode = lookup_type_node_I (NODE_PARENT_TYPE (bnode))) + if (bnode->data->class.class_init_base) + init_slist = g_slist_prepend (init_slist, (gpointer) bnode->data->class.class_init_base); + for (slist = init_slist; slist; slist = slist->next) + { + GBaseInitFunc class_init_base = (GBaseInitFunc) slist->data; + + class_init_base (class); + } + g_slist_free (init_slist); + + G_WRITE_LOCK (&type_rw_lock); + + g_atomic_int_set (&node->data->class.init_state, BASE_IFACE_INIT); + + /* Before we initialize the class, base initialize all interfaces, either + * from parent, or through our holder info + */ + pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + + i = 0; + while ((entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node)) != NULL && + i < IFACE_ENTRIES_N_ENTRIES (entries)) + { + entry = &entries->entry[i]; + while (i < IFACE_ENTRIES_N_ENTRIES (entries) && + entry->init_state == IFACE_INIT) + { + entry++; + i++; + } + + if (i == IFACE_ENTRIES_N_ENTRIES (entries)) + break; + + if (!type_iface_vtable_base_init_Wm (lookup_type_node_I (entry->iface_type), node)) + { + guint j; + IFaceEntries *pentries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (pnode); + + /* need to get this interface from parent, type_iface_vtable_base_init_Wm() + * doesn't modify write lock upon FALSE, so entry is still valid; + */ + g_assert (pnode != NULL); + + if (pentries) + for (j = 0; j < IFACE_ENTRIES_N_ENTRIES (pentries); j++) + { + IFaceEntry *pentry = &pentries->entry[j]; + + if (pentry->iface_type == entry->iface_type) + { + entry->vtable = pentry->vtable; + entry->init_state = INITIALIZED; + break; + } + } + g_assert (entry->vtable != NULL); + } + + /* If the write lock was released, additional interface entries might + * have been inserted into CLASSED_NODE_IFACES_ENTRIES (node); they'll + * be base-initialized when inserted, so we don't have to worry that + * we might miss them. Uninitialized entries can only be moved higher + * when new ones are inserted. + */ + i++; + } + + g_atomic_int_set (&node->data->class.init_state, CLASS_INIT); + + G_WRITE_UNLOCK (&type_rw_lock); + + if (node->data->class.class_init) + node->data->class.class_init (class, (gpointer) node->data->class.class_data); + + G_WRITE_LOCK (&type_rw_lock); + + g_atomic_int_set (&node->data->class.init_state, IFACE_INIT); + + /* finish initializing the interfaces through our holder info. + * inherited interfaces are already init_state == INITIALIZED, because + * they either got setup in the above base_init loop, or during + * class_init from within type_add_interface_Wm() for this or + * an anchestor type. + */ + i = 0; + while ((entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node)) != NULL) + { + entry = &entries->entry[i]; + while (i < IFACE_ENTRIES_N_ENTRIES (entries) && + entry->init_state == INITIALIZED) + { + entry++; + i++; + } + + if (i == IFACE_ENTRIES_N_ENTRIES (entries)) + break; + + type_iface_vtable_iface_init_Wm (lookup_type_node_I (entry->iface_type), node); + + /* As in the loop above, additional initialized entries might be inserted + * if the write lock is released, but that's harmless because the entries + * we need to initialize only move higher in the list. + */ + i++; + } + + g_atomic_int_set (&node->data->class.init_state, INITIALIZED); +} + +static void +type_data_finalize_class_ifaces_Wm (TypeNode *node) +{ + guint i; + IFaceEntries *entries; + + g_assert (node->is_instantiatable && node->data && node->data->class.class && NODE_REFCOUNT (node) == 0); + + reiterate: + entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node); + for (i = 0; entries != NULL && i < IFACE_ENTRIES_N_ENTRIES (entries); i++) + { + IFaceEntry *entry = &entries->entry[i]; + if (entry->vtable) + { + if (type_iface_vtable_finalize_Wm (lookup_type_node_I (entry->iface_type), node, entry->vtable)) + { + /* refetch entries, IFACES_ENTRIES might be modified */ + goto reiterate; + } + else + { + /* type_iface_vtable_finalize_Wm() doesn't modify write lock upon FALSE, + * iface vtable came from parent + */ + entry->vtable = NULL; + entry->init_state = UNINITIALIZED; + } + } + } +} + +static void +type_data_finalize_class_U (TypeNode *node, + ClassData *cdata) +{ + GTypeClass *class = cdata->class; + TypeNode *bnode; + + g_assert (cdata->class && NODE_REFCOUNT (node) == 0); + + if (cdata->class_finalize) + cdata->class_finalize (class, (gpointer) cdata->class_data); + + /* call all base class destruction functions in descending order + */ + if (cdata->class_finalize_base) + cdata->class_finalize_base (class); + for (bnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); bnode; bnode = lookup_type_node_I (NODE_PARENT_TYPE (bnode))) + if (bnode->data->class.class_finalize_base) + bnode->data->class.class_finalize_base (class); + + g_free (cdata->class); +} + +static void +type_data_last_unref_Wm (TypeNode *node, + gboolean uncached) +{ + g_return_if_fail (node != NULL && node->plugin != NULL); + + if (!node->data || NODE_REFCOUNT (node) == 0) + { + g_warning ("cannot drop last reference to unreferenced type `%s'", + NODE_NAME (node)); + return; + } + + /* call class cache hooks */ + if (node->is_classed && node->data && node->data->class.class && static_n_class_cache_funcs && !uncached) + { + guint i; + + G_WRITE_UNLOCK (&type_rw_lock); + G_READ_LOCK (&type_rw_lock); + for (i = 0; i < static_n_class_cache_funcs; i++) + { + GTypeClassCacheFunc cache_func = static_class_cache_funcs[i].cache_func; + gpointer cache_data = static_class_cache_funcs[i].cache_data; + gboolean need_break; + + G_READ_UNLOCK (&type_rw_lock); + need_break = cache_func (cache_data, node->data->class.class); + G_READ_LOCK (&type_rw_lock); + if (!node->data || NODE_REFCOUNT (node) == 0) + INVALID_RECURSION ("GType class cache function ", cache_func, NODE_NAME (node)); + if (need_break) + break; + } + G_READ_UNLOCK (&type_rw_lock); + G_WRITE_LOCK (&type_rw_lock); + } + + /* may have been re-referenced meanwhile */ + if (g_atomic_int_dec_and_test ((int *) &node->ref_count)) + { + GType ptype = NODE_PARENT_TYPE (node); + TypeData *tdata; + + if (node->is_instantiatable) + { + /* destroy node->data->instance.mem_chunk */ + } + + tdata = node->data; + if (node->is_classed && tdata->class.class) + { + if (CLASSED_NODE_IFACES_ENTRIES_LOCKED (node) != NULL) + type_data_finalize_class_ifaces_Wm (node); + node->mutatable_check_cache = FALSE; + node->data = NULL; + G_WRITE_UNLOCK (&type_rw_lock); + type_data_finalize_class_U (node, &tdata->class); + G_WRITE_LOCK (&type_rw_lock); + } + else if (NODE_IS_IFACE (node) && tdata->iface.dflt_vtable) + { + node->mutatable_check_cache = FALSE; + node->data = NULL; + if (tdata->iface.dflt_finalize || tdata->iface.vtable_finalize_base) + { + G_WRITE_UNLOCK (&type_rw_lock); + if (tdata->iface.dflt_finalize) + tdata->iface.dflt_finalize (tdata->iface.dflt_vtable, (gpointer) tdata->iface.dflt_data); + if (tdata->iface.vtable_finalize_base) + tdata->iface.vtable_finalize_base (tdata->iface.dflt_vtable); + G_WRITE_LOCK (&type_rw_lock); + } + g_free (tdata->iface.dflt_vtable); + } + else + { + node->mutatable_check_cache = FALSE; + node->data = NULL; + } + + /* freeing tdata->common.value_table and its contents is taken care of + * by allocating it in one chunk with tdata + */ + g_free (tdata); + + G_WRITE_UNLOCK (&type_rw_lock); + g_type_plugin_unuse (node->plugin); + if (ptype) + type_data_unref_U (lookup_type_node_I (ptype), FALSE); + G_WRITE_LOCK (&type_rw_lock); + } +} + +static inline void +type_data_unref_U (TypeNode *node, + gboolean uncached) +{ + guint current; + + do { + current = NODE_REFCOUNT (node); + + if (current <= 1) + { + if (!node->plugin) + { + g_warning ("static type `%s' unreferenced too often", + NODE_NAME (node)); + return; + } + + g_assert (current > 0); + + g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */ + G_WRITE_LOCK (&type_rw_lock); + type_data_last_unref_Wm (node, uncached); + G_WRITE_UNLOCK (&type_rw_lock); + g_static_rec_mutex_unlock (&class_init_rec_mutex); + return; + } + } while (!g_atomic_int_compare_and_exchange ((int *) &node->ref_count, current, current - 1)); +} + +/** + * g_type_add_class_cache_func: + * @cache_data: data to be passed to @cache_func + * @cache_func: a #GTypeClassCacheFunc + * + * Adds a #GTypeClassCacheFunc to be called before the reference count of a + * class goes from one to zero. This can be used to prevent premature class + * destruction. All installed #GTypeClassCacheFunc functions will be chained + * until one of them returns %TRUE. The functions have to check the class id + * passed in to figure whether they actually want to cache the class of this + * type, since all classes are routed through the same #GTypeClassCacheFunc + * chain. + */ +void +g_type_add_class_cache_func (gpointer cache_data, + GTypeClassCacheFunc cache_func) +{ + guint i; + + g_return_if_fail (cache_func != NULL); + + G_WRITE_LOCK (&type_rw_lock); + i = static_n_class_cache_funcs++; + static_class_cache_funcs = g_renew (ClassCacheFunc, static_class_cache_funcs, static_n_class_cache_funcs); + static_class_cache_funcs[i].cache_data = cache_data; + static_class_cache_funcs[i].cache_func = cache_func; + G_WRITE_UNLOCK (&type_rw_lock); +} + +/** + * g_type_remove_class_cache_func: + * @cache_data: data that was given when adding @cache_func + * @cache_func: a #GTypeClassCacheFunc + * + * Removes a previously installed #GTypeClassCacheFunc. The cache + * maintained by @cache_func has to be empty when calling + * g_type_remove_class_cache_func() to avoid leaks. + */ +void +g_type_remove_class_cache_func (gpointer cache_data, + GTypeClassCacheFunc cache_func) +{ + gboolean found_it = FALSE; + guint i; + + g_return_if_fail (cache_func != NULL); + + G_WRITE_LOCK (&type_rw_lock); + for (i = 0; i < static_n_class_cache_funcs; i++) + if (static_class_cache_funcs[i].cache_data == cache_data && + static_class_cache_funcs[i].cache_func == cache_func) + { + static_n_class_cache_funcs--; + g_memmove (static_class_cache_funcs + i, + static_class_cache_funcs + i + 1, + sizeof (static_class_cache_funcs[0]) * (static_n_class_cache_funcs - i)); + static_class_cache_funcs = g_renew (ClassCacheFunc, static_class_cache_funcs, static_n_class_cache_funcs); + found_it = TRUE; + break; + } + G_WRITE_UNLOCK (&type_rw_lock); + + if (!found_it) + g_warning (G_STRLOC ": cannot remove unregistered class cache func %p with data %p", + cache_func, cache_data); +} + + +/** + * g_type_add_interface_check: + * @check_data: data to pass to @check_func + * @check_func: function to be called after each interface + * is initialized. + * + * Adds a function to be called after an interface vtable is + * initialized for any class (i.e. after the @interface_init member of + * #GInterfaceInfo has been called). + * + * This function is useful when you want to check an invariant that + * depends on the interfaces of a class. For instance, the + * implementation of #GObject uses this facility to check that an + * object implements all of the properties that are defined on its + * interfaces. + * + * Since: 2.4 + */ +void +g_type_add_interface_check (gpointer check_data, + GTypeInterfaceCheckFunc check_func) +{ + guint i; + + g_return_if_fail (check_func != NULL); + + G_WRITE_LOCK (&type_rw_lock); + i = static_n_iface_check_funcs++; + static_iface_check_funcs = g_renew (IFaceCheckFunc, static_iface_check_funcs, static_n_iface_check_funcs); + static_iface_check_funcs[i].check_data = check_data; + static_iface_check_funcs[i].check_func = check_func; + G_WRITE_UNLOCK (&type_rw_lock); +} + +/** + * g_type_remove_interface_check: + * @check_data: callback data passed to g_type_add_interface_check() + * @check_func: callback function passed to g_type_add_interface_check() + * + * Removes an interface check function added with + * g_type_add_interface_check(). + * + * Since: 2.4 + */ +void +g_type_remove_interface_check (gpointer check_data, + GTypeInterfaceCheckFunc check_func) +{ + gboolean found_it = FALSE; + guint i; + + g_return_if_fail (check_func != NULL); + + G_WRITE_LOCK (&type_rw_lock); + for (i = 0; i < static_n_iface_check_funcs; i++) + if (static_iface_check_funcs[i].check_data == check_data && + static_iface_check_funcs[i].check_func == check_func) + { + static_n_iface_check_funcs--; + g_memmove (static_iface_check_funcs + i, + static_iface_check_funcs + i + 1, + sizeof (static_iface_check_funcs[0]) * (static_n_iface_check_funcs - i)); + static_iface_check_funcs = g_renew (IFaceCheckFunc, static_iface_check_funcs, static_n_iface_check_funcs); + found_it = TRUE; + break; + } + G_WRITE_UNLOCK (&type_rw_lock); + + if (!found_it) + g_warning (G_STRLOC ": cannot remove unregistered class check func %p with data %p", + check_func, check_data); +} + +/* --- type registration --- */ +/** + * g_type_register_fundamental: + * @type_id: A predefined type identifier. + * @type_name: 0-terminated string used as the name of the new type. + * @info: The #GTypeInfo structure for this type. + * @finfo: The #GTypeFundamentalInfo structure for this type. + * @flags: Bitwise combination of #GTypeFlags values. + * + * Registers @type_id as the predefined identifier and @type_name as the + * name of a fundamental type. The type system uses the information + * contained in the #GTypeInfo structure pointed to by @info and the + * #GTypeFundamentalInfo structure pointed to by @finfo to manage the + * type and its instances. The value of @flags determines additional + * characteristics of the fundamental type. + * + * Returns: The predefined type identifier. + */ +GType +g_type_register_fundamental (GType type_id, + const gchar *type_name, + const GTypeInfo *info, + const GTypeFundamentalInfo *finfo, + GTypeFlags flags) +{ + TypeNode *node; + + g_return_val_if_type_system_uninitialized (0); + g_return_val_if_fail (type_id > 0, 0); + g_return_val_if_fail (type_name != NULL, 0); + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (finfo != NULL, 0); + + if (!check_type_name_I (type_name)) + return 0; + if ((type_id & TYPE_ID_MASK) || + type_id > G_TYPE_FUNDAMENTAL_MAX) + { + g_warning ("attempt to register fundamental type `%s' with invalid type id (%" G_GSIZE_FORMAT ")", + type_name, + type_id); + return 0; + } + if ((finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE) && + !(finfo->type_flags & G_TYPE_FLAG_CLASSED)) + { + g_warning ("cannot register instantiatable fundamental type `%s' as non-classed", + type_name); + return 0; + } + if (lookup_type_node_I (type_id)) + { + g_warning ("cannot register existing fundamental type `%s' (as `%s')", + type_descriptive_name_I (type_id), + type_name); + return 0; + } + + G_WRITE_LOCK (&type_rw_lock); + node = type_node_fundamental_new_W (type_id, type_name, finfo->type_flags); + type_add_flags_W (node, flags); + + if (check_type_info_I (NULL, NODE_FUNDAMENTAL_TYPE (node), type_name, info)) + type_data_make_W (node, info, + check_value_table_I (type_name, info->value_table) ? info->value_table : NULL); + G_WRITE_UNLOCK (&type_rw_lock); + + return NODE_TYPE (node); +} + +/** + * g_type_register_static_simple: + * @parent_type: Type from which this type will be derived. + * @type_name: 0-terminated string used as the name of the new type. + * @class_size: Size of the class structure (see #GTypeInfo) + * @class_init: Location of the class initialization function (see #GTypeInfo) + * @instance_size: Size of the instance structure (see #GTypeInfo) + * @instance_init: Location of the instance initialization function (see #GTypeInfo) + * @flags: Bitwise combination of #GTypeFlags values. + * + * Registers @type_name as the name of a new static type derived from + * @parent_type. The value of @flags determines the nature (e.g. + * abstract or not) of the type. It works by filling a #GTypeInfo + * struct and calling g_type_register_static(). + * + * Since: 2.12 + * + * Returns: The new type identifier. + */ +GType +g_type_register_static_simple (GType parent_type, + const gchar *type_name, + guint class_size, + GClassInitFunc class_init, + guint instance_size, + GInstanceInitFunc instance_init, + GTypeFlags flags) +{ + GTypeInfo info; + + info.class_size = class_size; + info.base_init = NULL; + info.base_finalize = NULL; + info.class_init = class_init; + info.class_finalize = NULL; + info.class_data = NULL; + info.instance_size = instance_size; + info.n_preallocs = 0; + info.instance_init = instance_init; + info.value_table = NULL; + + return g_type_register_static (parent_type, type_name, &info, flags); +} + +/** + * g_type_register_static: + * @parent_type: Type from which this type will be derived. + * @type_name: 0-terminated string used as the name of the new type. + * @info: The #GTypeInfo structure for this type. + * @flags: Bitwise combination of #GTypeFlags values. + * + * Registers @type_name as the name of a new static type derived from + * @parent_type. The type system uses the information contained in the + * #GTypeInfo structure pointed to by @info to manage the type and its + * instances (if not abstract). The value of @flags determines the nature + * (e.g. abstract or not) of the type. + * + * Returns: The new type identifier. + */ +GType +g_type_register_static (GType parent_type, + const gchar *type_name, + const GTypeInfo *info, + GTypeFlags flags) +{ + TypeNode *pnode, *node; + GType type = 0; + + g_return_val_if_type_system_uninitialized (0); + g_return_val_if_fail (parent_type > 0, 0); + g_return_val_if_fail (type_name != NULL, 0); + g_return_val_if_fail (info != NULL, 0); + + if (!check_type_name_I (type_name) || + !check_derivation_I (parent_type, type_name)) + return 0; + if (info->class_finalize) + { + g_warning ("class finalizer specified for static type `%s'", + type_name); + return 0; + } + + pnode = lookup_type_node_I (parent_type); + G_WRITE_LOCK (&type_rw_lock); + type_data_ref_Wm (pnode); + if (check_type_info_I (pnode, NODE_FUNDAMENTAL_TYPE (pnode), type_name, info)) + { + node = type_node_new_W (pnode, type_name, NULL); + type_add_flags_W (node, flags); + type = NODE_TYPE (node); + type_data_make_W (node, info, + check_value_table_I (type_name, info->value_table) ? info->value_table : NULL); + } + G_WRITE_UNLOCK (&type_rw_lock); + + return type; +} + +/** + * g_type_register_dynamic: + * @parent_type: Type from which this type will be derived. + * @type_name: 0-terminated string used as the name of the new type. + * @plugin: The #GTypePlugin structure to retrieve the #GTypeInfo from. + * @flags: Bitwise combination of #GTypeFlags values. + * + * Registers @type_name as the name of a new dynamic type derived from + * @parent_type. The type system uses the information contained in the + * #GTypePlugin structure pointed to by @plugin to manage the type and its + * instances (if not abstract). The value of @flags determines the nature + * (e.g. abstract or not) of the type. + * + * Returns: The new type identifier or #G_TYPE_INVALID if registration failed. + */ +GType +g_type_register_dynamic (GType parent_type, + const gchar *type_name, + GTypePlugin *plugin, + GTypeFlags flags) +{ + TypeNode *pnode, *node; + GType type; + + g_return_val_if_type_system_uninitialized (0); + g_return_val_if_fail (parent_type > 0, 0); + g_return_val_if_fail (type_name != NULL, 0); + g_return_val_if_fail (plugin != NULL, 0); + + if (!check_type_name_I (type_name) || + !check_derivation_I (parent_type, type_name) || + !check_plugin_U (plugin, TRUE, FALSE, type_name)) + return 0; + + G_WRITE_LOCK (&type_rw_lock); + pnode = lookup_type_node_I (parent_type); + node = type_node_new_W (pnode, type_name, plugin); + type_add_flags_W (node, flags); + type = NODE_TYPE (node); + G_WRITE_UNLOCK (&type_rw_lock); + + return type; +} + +/** + * g_type_add_interface_static: + * @instance_type: #GType value of an instantiable type. + * @interface_type: #GType value of an interface type. + * @info: The #GInterfaceInfo structure for this + * (@instance_type, @interface_type) combination. + * + * Adds the static @interface_type to @instantiable_type. The information + * contained in the #GTypeInterfaceInfo structure pointed to by @info + * is used to manage the relationship. + */ +void +g_type_add_interface_static (GType instance_type, + GType interface_type, + const GInterfaceInfo *info) +{ + /* G_TYPE_IS_INSTANTIATABLE() is an external call: _U */ + g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (instance_type)); + g_return_if_fail (g_type_parent (interface_type) == G_TYPE_INTERFACE); + + /* we only need to lock class_init_rec_mutex if instance_type already has its + * class initialized, however this function is rarely enough called to take + * the simple route and always acquire class_init_rec_mutex. + */ + g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */ + G_WRITE_LOCK (&type_rw_lock); + if (check_add_interface_L (instance_type, interface_type)) + { + TypeNode *node = lookup_type_node_I (instance_type); + TypeNode *iface = lookup_type_node_I (interface_type); + if (check_interface_info_I (iface, NODE_TYPE (node), info)) + type_add_interface_Wm (node, iface, info, NULL); + } + G_WRITE_UNLOCK (&type_rw_lock); + g_static_rec_mutex_unlock (&class_init_rec_mutex); +} + +/** + * g_type_add_interface_dynamic: + * @instance_type: the #GType value of an instantiable type. + * @interface_type: the #GType value of an interface type. + * @plugin: the #GTypePlugin structure to retrieve the #GInterfaceInfo from. + * + * Adds the dynamic @interface_type to @instantiable_type. The information + * contained in the #GTypePlugin structure pointed to by @plugin + * is used to manage the relationship. + */ +void +g_type_add_interface_dynamic (GType instance_type, + GType interface_type, + GTypePlugin *plugin) +{ + TypeNode *node; + /* G_TYPE_IS_INSTANTIATABLE() is an external call: _U */ + g_return_if_fail (G_TYPE_IS_INSTANTIATABLE (instance_type)); + g_return_if_fail (g_type_parent (interface_type) == G_TYPE_INTERFACE); + + node = lookup_type_node_I (instance_type); + if (!check_plugin_U (plugin, FALSE, TRUE, NODE_NAME (node))) + return; + + /* see comment in g_type_add_interface_static() about class_init_rec_mutex */ + g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */ + G_WRITE_LOCK (&type_rw_lock); + if (check_add_interface_L (instance_type, interface_type)) + { + TypeNode *iface = lookup_type_node_I (interface_type); + type_add_interface_Wm (node, iface, NULL, plugin); + } + G_WRITE_UNLOCK (&type_rw_lock); + g_static_rec_mutex_unlock (&class_init_rec_mutex); +} + + +/* --- public API functions --- */ +/** + * g_type_class_ref: + * @type: Type ID of a classed type. + * + * Increments the reference count of the class structure belonging to + * @type. This function will demand-create the class if it doesn't + * exist already. + * + * Returns: The #GTypeClass structure for the given type ID. + */ +gpointer +g_type_class_ref (GType type) +{ + TypeNode *node; + GType ptype; + gboolean holds_ref; + GTypeClass *pclass; + + /* optimize for common code path */ + node = lookup_type_node_I (type); + if (!node || !node->is_classed) + { + g_warning ("cannot retrieve class for invalid (unclassed) type `%s'", + type_descriptive_name_I (type)); + return NULL; + } + + if (G_LIKELY (type_data_ref_U (node))) + { + if (G_LIKELY (g_atomic_int_get (&node->data->class.init_state) == INITIALIZED)) + return node->data->class.class; + holds_ref = TRUE; + } + else + holds_ref = FALSE; + + /* here, we either have node->data->class.class == NULL, or a recursive + * call to g_type_class_ref() with a partly initialized class, or + * node->data->class.init_state == INITIALIZED, because any + * concurrently running initialization was guarded by class_init_rec_mutex. + */ + g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */ + + /* we need an initialized parent class for initializing derived classes */ + ptype = NODE_PARENT_TYPE (node); + pclass = ptype ? g_type_class_ref (ptype) : NULL; + + G_WRITE_LOCK (&type_rw_lock); + + if (!holds_ref) + type_data_ref_Wm (node); + + if (!node->data->class.class) /* class uninitialized */ + type_class_init_Wm (node, pclass); + + G_WRITE_UNLOCK (&type_rw_lock); + + if (pclass) + g_type_class_unref (pclass); + + g_static_rec_mutex_unlock (&class_init_rec_mutex); + + return node->data->class.class; +} + +/** + * g_type_class_unref: + * @g_class: The #GTypeClass structure to unreference. + * + * Decrements the reference count of the class structure being passed in. + * Once the last reference count of a class has been released, classes + * may be finalized by the type system, so further dereferencing of a + * class pointer after g_type_class_unref() are invalid. + */ +void +g_type_class_unref (gpointer g_class) +{ + TypeNode *node; + GTypeClass *class = g_class; + + g_return_if_fail (g_class != NULL); + + node = lookup_type_node_I (class->g_type); + if (node && node->is_classed && NODE_REFCOUNT (node)) + type_data_unref_U (node, FALSE); + else + g_warning ("cannot unreference class of invalid (unclassed) type `%s'", + type_descriptive_name_I (class->g_type)); +} + +/** + * g_type_class_unref_uncached: + * @g_class: The #GTypeClass structure to unreference. + * + * A variant of g_type_class_unref() for use in #GTypeClassCacheFunc + * implementations. It unreferences a class without consulting the chain + * of #GTypeClassCacheFuncs, avoiding the recursion which would occur + * otherwise. + */ +void +g_type_class_unref_uncached (gpointer g_class) +{ + TypeNode *node; + GTypeClass *class = g_class; + + g_return_if_fail (g_class != NULL); + + node = lookup_type_node_I (class->g_type); + if (node && node->is_classed && NODE_REFCOUNT (node)) + type_data_unref_U (node, TRUE); + else + g_warning ("cannot unreference class of invalid (unclassed) type `%s'", + type_descriptive_name_I (class->g_type)); +} + +/** + * g_type_class_peek: + * @type: Type ID of a classed type. + * + * This function is essentially the same as g_type_class_ref(), except that + * the classes reference count isn't incremented. As a consequence, this function + * may return %NULL if the class of the type passed in does not currently + * exist (hasn't been referenced before). + * + * Returns: The #GTypeClass structure for the given type ID or %NULL + * if the class does not currently exist. + */ +gpointer +g_type_class_peek (GType type) +{ + TypeNode *node; + gpointer class; + + node = lookup_type_node_I (type); + if (node && node->is_classed && NODE_REFCOUNT (node) && + g_atomic_int_get (&node->data->class.init_state) == INITIALIZED) + /* ref_count _may_ be 0 */ + class = node->data->class.class; + else + class = NULL; + + return class; +} + +/** + * g_type_class_peek_static: + * @type: Type ID of a classed type. + * + * A more efficient version of g_type_class_peek() which works only for + * static types. + * + * Since: 2.4 + * Returns: The #GTypeClass structure for the given type ID or %NULL + * if the class does not currently exist or is dynamically loaded. + */ +gpointer +g_type_class_peek_static (GType type) +{ + TypeNode *node; + gpointer class; + + node = lookup_type_node_I (type); + if (node && node->is_classed && NODE_REFCOUNT (node) && + /* peek only static types: */ node->plugin == NULL && + g_atomic_int_get (&node->data->class.init_state) == INITIALIZED) + /* ref_count _may_ be 0 */ + class = node->data->class.class; + else + class = NULL; + + return class; +} + +/** + * g_type_class_peek_parent: + * @g_class: The #GTypeClass structure to retrieve the parent class for. + * + * This is a convenience function often needed in class initializers. + * It returns the class structure of the immediate parent type of the + * class passed in. Since derived classes hold a reference count on + * their parent classes as long as they are instantiated, the returned + * class will always exist. This function is essentially equivalent + * to: + * + * + * g_type_class_peek (g_type_parent (G_TYPE_FROM_CLASS (g_class))); + * + * + * Returns: The parent class of @g_class. + */ +gpointer +g_type_class_peek_parent (gpointer g_class) +{ + TypeNode *node; + gpointer class = NULL; + + g_return_val_if_fail (g_class != NULL, NULL); + + node = lookup_type_node_I (G_TYPE_FROM_CLASS (g_class)); + /* We used to acquire a read lock here. That is not necessary, since + * parent->data->class.class is constant as long as the derived class + * exists. + */ + if (node && node->is_classed && node->data && NODE_PARENT_TYPE (node)) + { + node = lookup_type_node_I (NODE_PARENT_TYPE (node)); + class = node->data->class.class; + } + else if (NODE_PARENT_TYPE (node)) + g_warning (G_STRLOC ": invalid class pointer `%p'", g_class); + + return class; +} + +/** + * g_type_interface_peek: + * @instance_class: A #GTypeClass structure. + * @iface_type: An interface ID which this class conforms to. + * + * Returns the #GTypeInterface structure of an interface to which the + * passed in class conforms. + * + * Returns: The GTypeInterface structure of iface_type if implemented + * by @instance_class, %NULL otherwise + */ +gpointer +g_type_interface_peek (gpointer instance_class, + GType iface_type) +{ + TypeNode *node; + TypeNode *iface; + gpointer vtable = NULL; + GTypeClass *class = instance_class; + + g_return_val_if_fail (instance_class != NULL, NULL); + + node = lookup_type_node_I (class->g_type); + iface = lookup_type_node_I (iface_type); + if (node && node->is_instantiatable && iface) + type_lookup_iface_vtable_I (node, iface, &vtable); + else + g_warning (G_STRLOC ": invalid class pointer `%p'", class); + + return vtable; +} + +/** + * g_type_interface_peek_parent: + * @g_iface: A #GTypeInterface structure. + * + * Returns the corresponding #GTypeInterface structure of the parent type + * of the instance type to which @g_iface belongs. This is useful when + * deriving the implementation of an interface from the parent type and + * then possibly overriding some methods. + * + * Returns: The corresponding #GTypeInterface structure of the parent + * type of the instance type to which @g_iface belongs, or + * %NULL if the parent type doesn't conform to the interface. + */ +gpointer +g_type_interface_peek_parent (gpointer g_iface) +{ + TypeNode *node; + TypeNode *iface; + gpointer vtable = NULL; + GTypeInterface *iface_class = g_iface; + + g_return_val_if_fail (g_iface != NULL, NULL); + + iface = lookup_type_node_I (iface_class->g_type); + node = lookup_type_node_I (iface_class->g_instance_type); + if (node) + node = lookup_type_node_I (NODE_PARENT_TYPE (node)); + if (node && node->is_instantiatable && iface) + type_lookup_iface_vtable_I (node, iface, &vtable); + else if (node) + g_warning (G_STRLOC ": invalid interface pointer `%p'", g_iface); + + return vtable; +} + +/** + * g_type_default_interface_ref: + * @g_type: an interface type + * + * Increments the reference count for the interface type @g_type, + * and returns the default interface vtable for the type. + * + * If the type is not currently in use, then the default vtable + * for the type will be created and initalized by calling + * the base interface init and default vtable init functions for + * the type (the @base_init + * and class_init members of #GTypeInfo). + * Calling g_type_default_interface_ref() is useful when you + * want to make sure that signals and properties for an interface + * have been installed. + * + * Since: 2.4 + * + * Returns: the default vtable for the interface; call + * g_type_default_interface_unref() when you are done using + * the interface. + */ +gpointer +g_type_default_interface_ref (GType g_type) +{ + TypeNode *node; + gpointer dflt_vtable; + + G_WRITE_LOCK (&type_rw_lock); + + node = lookup_type_node_I (g_type); + if (!node || !NODE_IS_IFACE (node) || + (node->data && NODE_REFCOUNT (node) == 0)) + { + G_WRITE_UNLOCK (&type_rw_lock); + g_warning ("cannot retrieve default vtable for invalid or non-interface type '%s'", + type_descriptive_name_I (g_type)); + return NULL; + } + + if (!node->data || !node->data->iface.dflt_vtable) + { + G_WRITE_UNLOCK (&type_rw_lock); + g_static_rec_mutex_lock (&class_init_rec_mutex); /* required locking order: 1) class_init_rec_mutex, 2) type_rw_lock */ + G_WRITE_LOCK (&type_rw_lock); + node = lookup_type_node_I (g_type); + type_data_ref_Wm (node); + type_iface_ensure_dflt_vtable_Wm (node); + g_static_rec_mutex_unlock (&class_init_rec_mutex); + } + else + type_data_ref_Wm (node); /* ref_count >= 1 already */ + + dflt_vtable = node->data->iface.dflt_vtable; + G_WRITE_UNLOCK (&type_rw_lock); + + return dflt_vtable; +} + +/** + * g_type_default_interface_peek: + * @g_type: an interface type + * + * If the interface type @g_type is currently in use, returns its + * default interface vtable. + * + * Since: 2.4 + * + * Returns: the default vtable for the interface, or %NULL + * if the type is not currently in use. + */ +gpointer +g_type_default_interface_peek (GType g_type) +{ + TypeNode *node; + gpointer vtable; + + node = lookup_type_node_I (g_type); + if (node && NODE_IS_IFACE (node) && NODE_REFCOUNT (node)) + vtable = node->data->iface.dflt_vtable; + else + vtable = NULL; + + return vtable; +} + +/** + * g_type_default_interface_unref: + * @g_iface: the default vtable structure for a interface, as + * returned by g_type_default_interface_ref() + * + * Decrements the reference count for the type corresponding to the + * interface default vtable @g_iface. If the type is dynamic, then + * when no one is using the interface and all references have + * been released, the finalize function for the interface's default + * vtable (the class_finalize member of + * #GTypeInfo) will be called. + * + * Since: 2.4 + */ +void +g_type_default_interface_unref (gpointer g_iface) +{ + TypeNode *node; + GTypeInterface *vtable = g_iface; + + g_return_if_fail (g_iface != NULL); + + node = lookup_type_node_I (vtable->g_type); + if (node && NODE_IS_IFACE (node)) + type_data_unref_U (node, FALSE); + else + g_warning ("cannot unreference invalid interface default vtable for '%s'", + type_descriptive_name_I (vtable->g_type)); +} + +/** + * g_type_name: + * @type: Type to return name for. + * + * Get the unique name that is assigned to a type ID. Note that this + * function (like all other GType API) cannot cope with invalid type + * IDs. %G_TYPE_INVALID may be passed to this function, as may be any + * other validly registered type ID, but randomized type IDs should + * not be passed in and will most likely lead to a crash. + * + * Returns: Static type name or %NULL. + */ +G_CONST_RETURN gchar* +g_type_name (GType type) +{ + TypeNode *node; + + g_return_val_if_type_system_uninitialized (NULL); + + node = lookup_type_node_I (type); + + return node ? NODE_NAME (node) : NULL; +} + +/** + * g_type_qname: + * @type: Type to return quark of type name for. + * + * Get the corresponding quark of the type IDs name. + * + * Returns: The type names quark or 0. + */ +GQuark +g_type_qname (GType type) +{ + TypeNode *node; + + node = lookup_type_node_I (type); + + return node ? node->qname : 0; +} + +/** + * g_type_from_name: + * @name: Type name to lookup. + * + * Lookup the type ID from a given type name, returning 0 if no type + * has been registered under this name (this is the preferred method + * to find out by name whether a specific type has been registered + * yet). + * + * Returns: Corresponding type ID or 0. + */ +GType +g_type_from_name (const gchar *name) +{ + GType type = 0; + GQuark quark; + + g_return_val_if_fail (name != NULL, 0); + + quark = g_quark_try_string (name); + if (quark) + { + G_READ_LOCK (&type_rw_lock); + type = (GType) g_hash_table_lookup (static_type_nodes_ht, GUINT_TO_POINTER (quark)); + G_READ_UNLOCK (&type_rw_lock); + } + + return type; +} + +/** + * g_type_parent: + * @type: The derived type. + * + * Return the direct parent type of the passed in type. If the passed + * in type has no parent, i.e. is a fundamental type, 0 is returned. + * + * Returns: The parent type. + */ +GType +g_type_parent (GType type) +{ + TypeNode *node; + + node = lookup_type_node_I (type); + + return node ? NODE_PARENT_TYPE (node) : 0; +} + +/** + * g_type_depth: + * @type: A #GType value. + * + * Returns the length of the ancestry of the passed in type. This + * includes the type itself, so that e.g. a fundamental type has depth 1. + * + * Returns: The depth of @type. + */ +guint +g_type_depth (GType type) +{ + TypeNode *node; + + node = lookup_type_node_I (type); + + return node ? node->n_supers + 1 : 0; +} + +/** + * g_type_next_base: + * @leaf_type: Descendant of @root_type and the type to be returned. + * @root_type: Immediate parent of the returned type. + * + * Given a @leaf_type and a @root_type which is contained in its + * anchestry, return the type that @root_type is the immediate parent + * of. In other words, this function determines the type that is + * derived directly from @root_type which is also a base class of + * @leaf_type. Given a root type and a leaf type, this function can + * be used to determine the types and order in which the leaf type is + * descended from the root type. + * + * Returns: Immediate child of @root_type and anchestor of @leaf_type. + */ +GType +g_type_next_base (GType type, + GType base_type) +{ + GType atype = 0; + TypeNode *node; + + node = lookup_type_node_I (type); + if (node) + { + TypeNode *base_node = lookup_type_node_I (base_type); + + if (base_node && base_node->n_supers < node->n_supers) + { + guint n = node->n_supers - base_node->n_supers; + + if (node->supers[n] == base_type) + atype = node->supers[n - 1]; + } + } + + return atype; +} + +static inline gboolean +type_node_check_conformities_UorL (TypeNode *node, + TypeNode *iface_node, + /* support_inheritance */ + gboolean support_interfaces, + gboolean support_prerequisites, + gboolean have_lock) +{ + gboolean match; + + if (/* support_inheritance && */ + NODE_IS_ANCESTOR (iface_node, node)) + return TRUE; + + support_interfaces = support_interfaces && node->is_instantiatable && NODE_IS_IFACE (iface_node); + support_prerequisites = support_prerequisites && NODE_IS_IFACE (node); + match = FALSE; + if (support_interfaces) + { + if (have_lock) + { + if (type_lookup_iface_entry_L (node, iface_node)) + match = TRUE; + } + else + { + if (type_lookup_iface_vtable_I (node, iface_node, NULL)) + match = TRUE; + } + } + if (!match && + support_prerequisites) + { + if (!have_lock) + G_READ_LOCK (&type_rw_lock); + if (support_prerequisites && type_lookup_prerequisite_L (node, NODE_TYPE (iface_node))) + match = TRUE; + if (!have_lock) + G_READ_UNLOCK (&type_rw_lock); + } + return match; +} + +static gboolean +type_node_is_a_L (TypeNode *node, + TypeNode *iface_node) +{ + return type_node_check_conformities_UorL (node, iface_node, TRUE, TRUE, TRUE); +} + +static inline gboolean +type_node_conforms_to_U (TypeNode *node, + TypeNode *iface_node, + gboolean support_interfaces, + gboolean support_prerequisites) +{ + return type_node_check_conformities_UorL (node, iface_node, support_interfaces, support_prerequisites, FALSE); +} + +/** + * g_type_is_a: + * @type: Type to check anchestry for. + * @is_a_type: Possible anchestor of @type or interface @type could conform to. + * + * If @is_a_type is a derivable type, check whether @type is a + * descendant of @is_a_type. If @is_a_type is an interface, check + * whether @type conforms to it. + * + * Returns: %TRUE if @type is_a @is_a_type holds true. + */ +gboolean +g_type_is_a (GType type, + GType iface_type) +{ + TypeNode *node, *iface_node; + gboolean is_a; + + node = lookup_type_node_I (type); + iface_node = lookup_type_node_I (iface_type); + is_a = node && iface_node && type_node_conforms_to_U (node, iface_node, TRUE, TRUE); + + return is_a; +} + +/** + * g_type_children: + * @type: The parent type. + * @n_children: Optional #guint pointer to contain the number of child types. + * + * Return a newly allocated and 0-terminated array of type IDs, listing the + * child types of @type. The return value has to be g_free()ed after use. + * + * Returns: Newly allocated and 0-terminated array of child types. + */ +GType* +g_type_children (GType type, + guint *n_children) +{ + TypeNode *node; + + node = lookup_type_node_I (type); + if (node) + { + GType *children; + + G_READ_LOCK (&type_rw_lock); /* ->children is relocatable */ + children = g_new (GType, node->n_children + 1); + memcpy (children, node->children, sizeof (GType) * node->n_children); + children[node->n_children] = 0; + + if (n_children) + *n_children = node->n_children; + G_READ_UNLOCK (&type_rw_lock); + + return children; + } + else + { + if (n_children) + *n_children = 0; + + return NULL; + } +} + +/** + * g_type_interfaces: + * @type: The type to list interface types for. + * @n_interfaces: Optional #guint pointer to contain the number of + * interface types. + * + * Return a newly allocated and 0-terminated array of type IDs, listing the + * interface types that @type conforms to. The return value has to be + * g_free()ed after use. + * + * Returns: Newly allocated and 0-terminated array of interface types. + */ +GType* +g_type_interfaces (GType type, + guint *n_interfaces) +{ + TypeNode *node; + + node = lookup_type_node_I (type); + if (node && node->is_instantiatable) + { + IFaceEntries *entries; + GType *ifaces; + guint i; + + G_READ_LOCK (&type_rw_lock); + entries = CLASSED_NODE_IFACES_ENTRIES_LOCKED (node); + if (entries) + { + ifaces = g_new (GType, IFACE_ENTRIES_N_ENTRIES (entries) + 1); + for (i = 0; i < IFACE_ENTRIES_N_ENTRIES (entries); i++) + ifaces[i] = entries->entry[i].iface_type; + } + else + { + ifaces = g_new (GType, 1); + i = 0; + } + ifaces[i] = 0; + + if (n_interfaces) + *n_interfaces = i; + G_READ_UNLOCK (&type_rw_lock); + + return ifaces; + } + else + { + if (n_interfaces) + *n_interfaces = 0; + + return NULL; + } +} + +typedef struct _QData QData; +struct _GData +{ + guint n_qdatas; + QData *qdatas; +}; +struct _QData +{ + GQuark quark; + gpointer data; +}; + +static inline gpointer +type_get_qdata_L (TypeNode *node, + GQuark quark) +{ + GData *gdata = node->global_gdata; + + if (quark && gdata && gdata->n_qdatas) + { + QData *qdatas = gdata->qdatas - 1; + guint n_qdatas = gdata->n_qdatas; + + do + { + guint i; + QData *check; + + i = (n_qdatas + 1) / 2; + check = qdatas + i; + if (quark == check->quark) + return check->data; + else if (quark > check->quark) + { + n_qdatas -= i; + qdatas = check; + } + else /* if (quark < check->quark) */ + n_qdatas = i - 1; + } + while (n_qdatas); + } + return NULL; +} + +/** + * g_type_get_qdata: + * @type: a #GType + * @quark: a #GQuark id to identify the data + * + * Obtains data which has previously been attached to @type + * with g_type_set_qdata(). + * + * Returns: the data, or %NULL if no data was found + */ +gpointer +g_type_get_qdata (GType type, + GQuark quark) +{ + TypeNode *node; + gpointer data; + + node = lookup_type_node_I (type); + if (node) + { + G_READ_LOCK (&type_rw_lock); + data = type_get_qdata_L (node, quark); + G_READ_UNLOCK (&type_rw_lock); + } + else + { + g_return_val_if_fail (node != NULL, NULL); + data = NULL; + } + return data; +} + +static inline void +type_set_qdata_W (TypeNode *node, + GQuark quark, + gpointer data) +{ + GData *gdata; + QData *qdata; + guint i; + + /* setup qdata list if necessary */ + if (!node->global_gdata) + node->global_gdata = g_new0 (GData, 1); + gdata = node->global_gdata; + + /* try resetting old data */ + qdata = gdata->qdatas; + for (i = 0; i < gdata->n_qdatas; i++) + if (qdata[i].quark == quark) + { + qdata[i].data = data; + return; + } + + /* add new entry */ + gdata->n_qdatas++; + gdata->qdatas = g_renew (QData, gdata->qdatas, gdata->n_qdatas); + qdata = gdata->qdatas; + for (i = 0; i < gdata->n_qdatas - 1; i++) + if (qdata[i].quark > quark) + break; + g_memmove (qdata + i + 1, qdata + i, sizeof (qdata[0]) * (gdata->n_qdatas - i - 1)); + qdata[i].quark = quark; + qdata[i].data = data; +} + +/** + * g_type_set_qdata: + * @type: a #GType + * @quark: a #GQuark id to identify the data + * @data: the data + * + * Attaches arbitrary data to a type. + */ +void +g_type_set_qdata (GType type, + GQuark quark, + gpointer data) +{ + TypeNode *node; + + g_return_if_fail (quark != 0); + + node = lookup_type_node_I (type); + if (node) + { + G_WRITE_LOCK (&type_rw_lock); + type_set_qdata_W (node, quark, data); + G_WRITE_UNLOCK (&type_rw_lock); + } + else + g_return_if_fail (node != NULL); +} + +static void +type_add_flags_W (TypeNode *node, + GTypeFlags flags) +{ + guint dflags; + + g_return_if_fail ((flags & ~TYPE_FLAG_MASK) == 0); + g_return_if_fail (node != NULL); + + if ((flags & TYPE_FLAG_MASK) && node->is_classed && node->data && node->data->class.class) + g_warning ("tagging type `%s' as abstract after class initialization", NODE_NAME (node)); + dflags = GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags)); + dflags |= flags; + type_set_qdata_W (node, static_quark_type_flags, GUINT_TO_POINTER (dflags)); +} + +/** + * g_type_query: + * @type: the #GType value of a static, classed type. + * @query: A user provided structure that is filled in with constant values + * upon success. + * + * Queries the type system for information about a specific type. + * This function will fill in a user-provided structure to hold + * type-specific information. If an invalid #GType is passed in, the + * @type member of the #GTypeQuery is 0. All members filled into the + * #GTypeQuery structure should be considered constant and have to be + * left untouched. + */ +void +g_type_query (GType type, + GTypeQuery *query) +{ + TypeNode *node; + + g_return_if_fail (query != NULL); + + /* if node is not static and classed, we won't allow query */ + query->type = 0; + node = lookup_type_node_I (type); + if (node && node->is_classed && !node->plugin) + { + /* type is classed and probably even instantiatable */ + G_READ_LOCK (&type_rw_lock); + if (node->data) /* type is static or referenced */ + { + query->type = NODE_TYPE (node); + query->type_name = NODE_NAME (node); + query->class_size = node->data->class.class_size; + query->instance_size = node->is_instantiatable ? node->data->instance.instance_size : 0; + } + G_READ_UNLOCK (&type_rw_lock); + } +} + + +/* --- implementation details --- */ +gboolean +g_type_test_flags (GType type, + guint flags) +{ + TypeNode *node; + gboolean result = FALSE; + + node = lookup_type_node_I (type); + if (node) + { + guint fflags = flags & TYPE_FUNDAMENTAL_FLAG_MASK; + guint tflags = flags & TYPE_FLAG_MASK; + + if (fflags) + { + GTypeFundamentalInfo *finfo = type_node_fundamental_info_I (node); + + fflags = (finfo->type_flags & fflags) == fflags; + } + else + fflags = TRUE; + + if (tflags) + { + G_READ_LOCK (&type_rw_lock); + tflags = (tflags & GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags))) == tflags; + G_READ_UNLOCK (&type_rw_lock); + } + else + tflags = TRUE; + + result = tflags && fflags; + } + + return result; +} + +/** + * g_type_get_plugin: + * @type: The #GType to retrieve the plugin for. + * + * Returns the #GTypePlugin structure for @type or + * %NULL if @type does not have a #GTypePlugin structure. + * + * Returns: The corresponding plugin if @type is a dynamic type, + * %NULL otherwise. + */ +GTypePlugin* +g_type_get_plugin (GType type) +{ + TypeNode *node; + + node = lookup_type_node_I (type); + + return node ? node->plugin : NULL; +} + +/** + * g_type_interface_get_plugin: + * @instance_type: the #GType value of an instantiatable type. + * @interface_type: the #GType value of an interface type. + * + * Returns the #GTypePlugin structure for the dynamic interface + * @interface_type which has been added to @instance_type, or %NULL if + * @interface_type has not been added to @instance_type or does not + * have a #GTypePlugin structure. See g_type_add_interface_dynamic(). + * + * Returns: the #GTypePlugin for the dynamic interface @interface_type + * of @instance_type. + */ +GTypePlugin* +g_type_interface_get_plugin (GType instance_type, + GType interface_type) +{ + TypeNode *node; + TypeNode *iface; + + g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface_type), NULL); /* G_TYPE_IS_INTERFACE() is an external call: _U */ + + node = lookup_type_node_I (instance_type); + iface = lookup_type_node_I (interface_type); + if (node && iface) + { + IFaceHolder *iholder; + GTypePlugin *plugin; + + G_READ_LOCK (&type_rw_lock); + + iholder = iface_node_get_holders_L (iface); + while (iholder && iholder->instance_type != instance_type) + iholder = iholder->next; + plugin = iholder ? iholder->plugin : NULL; + + G_READ_UNLOCK (&type_rw_lock); + + return plugin; + } + + g_return_val_if_fail (node == NULL, NULL); + g_return_val_if_fail (iface == NULL, NULL); + + g_warning (G_STRLOC ": attempt to look up plugin for invalid instance/interface type pair."); + + return NULL; +} + +/** + * g_type_fundamental_next: + * + * Returns the next free fundamental type id which can be used to + * register a new fundamental type with g_type_register_fundamental(). + * The returned type ID represents the highest currently registered + * fundamental type identifier. + * + * Returns: The nextmost fundamental type ID to be registered, + * or 0 if the type system ran out of fundamental type IDs. + */ +GType +g_type_fundamental_next (void) +{ + GType type; + + G_READ_LOCK (&type_rw_lock); + type = static_fundamental_next; + G_READ_UNLOCK (&type_rw_lock); + type = G_TYPE_MAKE_FUNDAMENTAL (type); + return type <= G_TYPE_FUNDAMENTAL_MAX ? type : 0; +} + +/** + * g_type_fundamental: + * @type_id: valid type ID + * + * Internal function, used to extract the fundamental type ID portion. + * use G_TYPE_FUNDAMENTAL() instead. + * + * Returns: fundamental type ID + */ +GType +g_type_fundamental (GType type_id) +{ + TypeNode *node = lookup_type_node_I (type_id); + + return node ? NODE_FUNDAMENTAL_TYPE (node) : 0; +} + +gboolean +g_type_check_instance_is_a (GTypeInstance *type_instance, + GType iface_type) +{ + TypeNode *node, *iface; + gboolean check; + + if (!type_instance || !type_instance->g_class) + return FALSE; + + node = lookup_type_node_I (type_instance->g_class->g_type); + iface = lookup_type_node_I (iface_type); + check = node && node->is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE); + + return check; +} + +gboolean +g_type_check_class_is_a (GTypeClass *type_class, + GType is_a_type) +{ + TypeNode *node, *iface; + gboolean check; + + if (!type_class) + return FALSE; + + node = lookup_type_node_I (type_class->g_type); + iface = lookup_type_node_I (is_a_type); + check = node && node->is_classed && iface && type_node_conforms_to_U (node, iface, FALSE, FALSE); + + return check; +} + +GTypeInstance* +g_type_check_instance_cast (GTypeInstance *type_instance, + GType iface_type) +{ + if (type_instance) + { + if (type_instance->g_class) + { + TypeNode *node, *iface; + gboolean is_instantiatable, check; + + node = lookup_type_node_I (type_instance->g_class->g_type); + is_instantiatable = node && node->is_instantiatable; + iface = lookup_type_node_I (iface_type); + check = is_instantiatable && iface && type_node_conforms_to_U (node, iface, TRUE, FALSE); + if (check) + return type_instance; + + if (is_instantiatable) + g_warning ("invalid cast from `%s' to `%s'", + type_descriptive_name_I (type_instance->g_class->g_type), + type_descriptive_name_I (iface_type)); + else + g_warning ("invalid uninstantiatable type `%s' in cast to `%s'", + type_descriptive_name_I (type_instance->g_class->g_type), + type_descriptive_name_I (iface_type)); + } + else + g_warning ("invalid unclassed pointer in cast to `%s'", + type_descriptive_name_I (iface_type)); + } + + return type_instance; +} + +GTypeClass* +g_type_check_class_cast (GTypeClass *type_class, + GType is_a_type) +{ + if (type_class) + { + TypeNode *node, *iface; + gboolean is_classed, check; + + node = lookup_type_node_I (type_class->g_type); + is_classed = node && node->is_classed; + iface = lookup_type_node_I (is_a_type); + check = is_classed && iface && type_node_conforms_to_U (node, iface, FALSE, FALSE); + if (check) + return type_class; + + if (is_classed) + g_warning ("invalid class cast from `%s' to `%s'", + type_descriptive_name_I (type_class->g_type), + type_descriptive_name_I (is_a_type)); + else + g_warning ("invalid unclassed type `%s' in class cast to `%s'", + type_descriptive_name_I (type_class->g_type), + type_descriptive_name_I (is_a_type)); + } + else + g_warning ("invalid class cast from (NULL) pointer to `%s'", + type_descriptive_name_I (is_a_type)); + return type_class; +} + +/** + * g_type_check_instance: + * @instance: A valid #GTypeInstance structure. + * + * Private helper function to aid implementation of the G_TYPE_CHECK_INSTANCE() + * macro. + * + * @Returns: #TRUE if @instance is valid, #FALSE otherwise. + */ +gboolean +g_type_check_instance (GTypeInstance *type_instance) +{ + /* this function is just here to make the signal system + * conveniently elaborated on instance checks + */ + if (type_instance) + { + if (type_instance->g_class) + { + TypeNode *node = lookup_type_node_I (type_instance->g_class->g_type); + + if (node && node->is_instantiatable) + return TRUE; + + g_warning ("instance of invalid non-instantiatable type `%s'", + type_descriptive_name_I (type_instance->g_class->g_type)); + } + else + g_warning ("instance with invalid (NULL) class pointer"); + } + else + g_warning ("invalid (NULL) pointer instance"); + + return FALSE; +} + +static inline gboolean +type_check_is_value_type_U (GType type) +{ + GTypeFlags tflags = G_TYPE_FLAG_VALUE_ABSTRACT; + TypeNode *node; + + /* common path speed up */ + node = lookup_type_node_I (type); + if (node && node->mutatable_check_cache) + return TRUE; + + G_READ_LOCK (&type_rw_lock); + restart_check: + if (node) + { + if (node->data && NODE_REFCOUNT (node) > 0 && + node->data->common.value_table->value_init) + tflags = GPOINTER_TO_UINT (type_get_qdata_L (node, static_quark_type_flags)); + else if (NODE_IS_IFACE (node)) + { + guint i; + + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (node); i++) + { + GType prtype = IFACE_NODE_PREREQUISITES (node)[i]; + TypeNode *prnode = lookup_type_node_I (prtype); + + if (prnode->is_instantiatable) + { + type = prtype; + node = lookup_type_node_I (type); + goto restart_check; + } + } + } + } + G_READ_UNLOCK (&type_rw_lock); + + return !(tflags & G_TYPE_FLAG_VALUE_ABSTRACT); +} + +gboolean +g_type_check_is_value_type (GType type) +{ + return type_check_is_value_type_U (type); +} + +gboolean +g_type_check_value (GValue *value) +{ + return value && type_check_is_value_type_U (value->g_type); +} + +gboolean +g_type_check_value_holds (GValue *value, + GType type) +{ + return value && type_check_is_value_type_U (value->g_type) && g_type_is_a (value->g_type, type); +} + +/** + * g_type_value_table_peek: + * @type: A #GType value. + * + * Returns the location of the #GTypeValueTable associated with @type. + * Note that this function should only be used from source code + * that implements or has internal knowledge of the implementation of + * @type. + * + * Returns: Location of the #GTypeValueTable associated with @type or + * %NULL if there is no #GTypeValueTable associated with @type. + */ +GTypeValueTable* +g_type_value_table_peek (GType type) +{ + GTypeValueTable *vtable = NULL; + TypeNode *node = lookup_type_node_I (type); + gboolean has_refed_data, has_table; + + if (node && NODE_REFCOUNT (node) && node->mutatable_check_cache) + return node->data->common.value_table; + + G_READ_LOCK (&type_rw_lock); + + restart_table_peek: + has_refed_data = node && node->data && NODE_REFCOUNT (node) > 0; + has_table = has_refed_data && node->data->common.value_table->value_init; + if (has_refed_data) + { + if (has_table) + vtable = node->data->common.value_table; + else if (NODE_IS_IFACE (node)) + { + guint i; + + for (i = 0; i < IFACE_NODE_N_PREREQUISITES (node); i++) + { + GType prtype = IFACE_NODE_PREREQUISITES (node)[i]; + TypeNode *prnode = lookup_type_node_I (prtype); + + if (prnode->is_instantiatable) + { + type = prtype; + node = lookup_type_node_I (type); + goto restart_table_peek; + } + } + } + } + + G_READ_UNLOCK (&type_rw_lock); + + if (vtable) + return vtable; + + if (!node) + g_warning (G_STRLOC ": type id `%" G_GSIZE_FORMAT "' is invalid", type); + if (!has_refed_data) + g_warning ("can't peek value table for type `%s' which is not currently referenced", + type_descriptive_name_I (type)); + + return NULL; +} + +G_CONST_RETURN gchar* +g_type_name_from_instance (GTypeInstance *instance) +{ + if (!instance) + return ""; + else + return g_type_name_from_class (instance->g_class); +} + +G_CONST_RETURN gchar* +g_type_name_from_class (GTypeClass *g_class) +{ + if (!g_class) + return ""; + else + return g_type_name (g_class->g_type); +} + + +/* --- private api for gboxed.c --- */ +gpointer +_g_type_boxed_copy (GType type, gpointer value) +{ + TypeNode *node = lookup_type_node_I (type); + + return node->data->boxed.copy_func (value); +} + +void +_g_type_boxed_free (GType type, gpointer value) +{ + TypeNode *node = lookup_type_node_I (type); + + node->data->boxed.free_func (value); +} + +void +_g_type_boxed_init (GType type, + GBoxedCopyFunc copy_func, + GBoxedFreeFunc free_func) +{ + TypeNode *node = lookup_type_node_I (type); + + node->data->boxed.copy_func = copy_func; + node->data->boxed.free_func = free_func; +} + +/* --- initialization --- */ +/** + * g_type_init_with_debug_flags: + * @debug_flags: Bitwise combination of #GTypeDebugFlags values for + * debugging purposes. + * + * Similar to g_type_init(), but additionally sets debug flags. + */ +void +g_type_init_with_debug_flags (GTypeDebugFlags debug_flags) +{ + G_LOCK_DEFINE_STATIC (type_init_lock); + const gchar *env_string; + GTypeInfo info; + TypeNode *node; + volatile GType votype; + +#ifdef G_THREADS_ENABLED + if (!g_thread_get_initialized()) + g_thread_init (NULL); +#endif + + G_LOCK (type_init_lock); + + G_WRITE_LOCK (&type_rw_lock); + + if (static_quark_type_flags) + { + G_WRITE_UNLOCK (&type_rw_lock); + G_UNLOCK (type_init_lock); + return; + } + + /* setup GObject library wide debugging flags */ + _g_type_debug_flags = debug_flags & G_TYPE_DEBUG_MASK; + env_string = g_getenv ("GOBJECT_DEBUG"); + if (env_string != NULL) + { + static GDebugKey debug_keys[] = { + { "objects", G_TYPE_DEBUG_OBJECTS }, + { "signals", G_TYPE_DEBUG_SIGNALS }, + }; + + _g_type_debug_flags |= g_parse_debug_string (env_string, + debug_keys, + sizeof (debug_keys) / sizeof (debug_keys[0])); + env_string = NULL; + } + + /* quarks */ + static_quark_type_flags = g_quark_from_static_string ("-g-type-private--GTypeFlags"); + static_quark_iface_holder = g_quark_from_static_string ("-g-type-private--IFaceHolder"); + static_quark_dependants_array = g_quark_from_static_string ("-g-type-private--dependants-array"); + + /* type qname hash table */ + static_type_nodes_ht = g_hash_table_new (g_direct_hash, g_direct_equal); + + /* invalid type G_TYPE_INVALID (0) + */ + static_fundamental_type_nodes[0] = NULL; + + /* void type G_TYPE_NONE + */ + node = type_node_fundamental_new_W (G_TYPE_NONE, g_intern_static_string ("void"), 0); + votype = NODE_TYPE (node); + g_assert (votype == G_TYPE_NONE); + + /* interface fundamental type G_TYPE_INTERFACE (!classed) + */ + memset (&info, 0, sizeof (info)); + node = type_node_fundamental_new_W (G_TYPE_INTERFACE, g_intern_static_string ("GInterface"), G_TYPE_FLAG_DERIVABLE); + votype = NODE_TYPE (node); + type_data_make_W (node, &info, NULL); + g_assert (votype == G_TYPE_INTERFACE); + + G_WRITE_UNLOCK (&type_rw_lock); + + g_value_c_init (); + + /* G_TYPE_TYPE_PLUGIN + */ + votype = g_type_plugin_get_type (); + + /* G_TYPE_* value types + */ + g_value_types_init (); + + /* G_TYPE_ENUM & G_TYPE_FLAGS + */ + g_enum_types_init (); + + /* G_TYPE_BOXED + */ + g_boxed_type_init (); + + /* G_TYPE_PARAM + */ + g_param_type_init (); + + /* G_TYPE_OBJECT + */ + g_object_type_init (); + + /* G_TYPE_PARAM_* pspec types + */ + g_param_spec_types_init (); + + /* Value Transformations + */ + g_value_transforms_init (); + + /* Signal system + */ + g_signal_init (); + + G_UNLOCK (type_init_lock); +} + +/** + * g_type_init: + * + * Prior to any use of the type system, g_type_init() has to be called + * to initialize the type system and assorted other code portions + * (such as the various fundamental type implementations or the signal + * system). + * + * Since version 2.24 this also initializes the thread system + */ +void +g_type_init (void) +{ + g_type_init_with_debug_flags (0); +} + +/** + * g_type_class_add_private: + * @g_class: class structure for an instantiatable type + * @private_size: size of private structure. + * + * Registers a private structure for an instantiatable type; + * when an object is allocated, the private structures for + * the type and all of its parent types are allocated + * sequentially in the same memory block as the public + * structures. This function should be called in the + * type's class_init() function. + * + * The private structure can be retrieved using the + * G_TYPE_CLASS_GET_PRIVATE() macro. + + * Since: 2.24 + */ +void +g_type_class_add_private (gpointer g_class, + gsize private_size) +{ + GType instance_type = ((GTypeClass *)g_class)->g_type; + TypeNode *node = lookup_type_node_I (instance_type); + gsize offset; + + g_return_if_fail (private_size > 0); + + if (!node || !node->is_instantiatable || !node->data || node->data->class.class != g_class) + { + g_warning ("cannot add private field to invalid (non-instantiatable) type '%s'", + type_descriptive_name_I (instance_type)); + return; + } + + if (NODE_PARENT_TYPE (node)) + { + TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + if (node->data->instance.private_size != pnode->data->instance.private_size) + { + g_warning ("g_type_add_private() called multiple times for the same type"); + return; + } + } + + G_WRITE_LOCK (&type_rw_lock); + + offset = ALIGN_STRUCT (node->data->instance.private_size); + node->data->instance.private_size = offset + private_size; + + G_WRITE_UNLOCK (&type_rw_lock); +} + +gpointer +g_type_instance_get_private (GTypeInstance *instance, + GType private_type) +{ + TypeNode *instance_node; + TypeNode *private_node; + TypeNode *parent_node; + GTypeClass *class; + gsize offset; + + g_return_val_if_fail (instance != NULL && instance->g_class != NULL, NULL); + + /* while instances are initialized, their class pointers change, + * so figure the instances real class first + */ + class = instance_real_class_get (instance); + if (!class) + class = instance->g_class; + + instance_node = lookup_type_node_I (class->g_type); + if (G_UNLIKELY (!instance_node || !instance_node->is_instantiatable)) + { + g_warning ("instance of invalid non-instantiatable type `%s'", + type_descriptive_name_I (instance->g_class->g_type)); + return NULL; + } + + private_node = lookup_type_node_I (private_type); + if (G_UNLIKELY (!private_node || !NODE_IS_ANCESTOR (private_node, instance_node))) + { + g_warning ("attempt to retrieve private data for invalid type '%s'", + type_descriptive_name_I (private_type)); + return NULL; + } + + /* Note that we don't need a read lock, since instance existing + * means that the instance class and all parent classes + * exist, so the node->data, node->data->instance.instance_size, + * and node->data->instance.private_size are not going to be changed. + * for any of the relevant types. + */ + + offset = ALIGN_STRUCT (instance_node->data->instance.instance_size); + + if (NODE_PARENT_TYPE (private_node)) + { + parent_node = lookup_type_node_I (NODE_PARENT_TYPE (private_node)); + g_assert (parent_node->data && NODE_REFCOUNT (parent_node) > 0); + + if (G_UNLIKELY (private_node->data->instance.private_size == parent_node->data->instance.private_size)) + { + g_warning ("g_type_instance_get_private() requires a prior call to g_type_class_add_private()"); + return NULL; + } + + offset += ALIGN_STRUCT (parent_node->data->instance.private_size); + } + + return G_STRUCT_MEMBER_P (instance, offset); +} + +/** + * g_type_add_class_private: + * @class_type: GType of an classed type. + * @private_size: size of private structure. + * + * Registers a private class structure for a classed type; + * when the class is allocated, the private structures for + * the class and all of its parent types are allocated + * sequentially in the same memory block as the public + * structures. This function should be called in the + * type's get_type() function after the type is registered. + * The private structure can be retrieved using the + * G_TYPE_CLASS_GET_PRIVATE() macro. + * + * Since: 2.24 + */ +void +g_type_add_class_private (GType class_type, + gsize private_size) +{ + TypeNode *node = lookup_type_node_I (class_type); + gsize offset; + + g_return_if_fail (private_size > 0); + + if (!node || !node->is_classed || !node->data) + { + g_warning ("cannot add class private field to invalid type '%s'", + type_descriptive_name_I (class_type)); + return; + } + + if (NODE_PARENT_TYPE (node)) + { + TypeNode *pnode = lookup_type_node_I (NODE_PARENT_TYPE (node)); + if (node->data->class.class_private_size != pnode->data->class.class_private_size) + { + g_warning ("g_type_add_class_private() called multiple times for the same type"); + return; + } + } + + G_WRITE_LOCK (&type_rw_lock); + + offset = ALIGN_STRUCT (node->data->class.class_private_size); + node->data->class.class_private_size = offset + private_size; + + G_WRITE_UNLOCK (&type_rw_lock); +} + +gpointer +g_type_class_get_private (GTypeClass *klass, + GType private_type) +{ + TypeNode *class_node; + TypeNode *private_node; + TypeNode *parent_node; + gsize offset; + + g_return_val_if_fail (klass != NULL, NULL); + + class_node = lookup_type_node_I (klass->g_type); + if (G_UNLIKELY (!class_node || !class_node->is_classed)) + { + g_warning ("class of invalid type `%s'", + type_descriptive_name_I (klass->g_type)); + return NULL; + } + + private_node = lookup_type_node_I (private_type); + if (G_UNLIKELY (!private_node || !NODE_IS_ANCESTOR (private_node, class_node))) + { + g_warning ("attempt to retrieve private data for invalid type '%s'", + type_descriptive_name_I (private_type)); + return NULL; + } + + offset = ALIGN_STRUCT (class_node->data->class.class_size); + + if (NODE_PARENT_TYPE (private_node)) + { + parent_node = lookup_type_node_I (NODE_PARENT_TYPE (private_node)); + g_assert (parent_node->data && NODE_REFCOUNT (parent_node) > 0); + + if (G_UNLIKELY (private_node->data->class.class_private_size == parent_node->data->class.class_private_size)) + { + g_warning ("g_type_instance_get_class_private() requires a prior call to g_type_class_add_class_private()"); + return NULL; + } + + offset += ALIGN_STRUCT (parent_node->data->class.class_private_size); + } + + return G_STRUCT_MEMBER_P (klass, offset); +} + +#define __G_TYPE_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gtype.h b/gobject/gtype.h new file mode 100644 index 0000000..33a4a8b --- /dev/null +++ b/gobject/gtype.h @@ -0,0 +1,1608 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TYPE_H__ +#define __G_TYPE_H__ + +#include + +G_BEGIN_DECLS + +/* Basic Type Macros + */ +/** + * G_TYPE_FUNDAMENTAL: + * @type: A #GType value. + * + * The fundamental type which is the ancestor of @type. + * Fundamental types are types that serve as ultimate bases for the derived types, + * thus they are the roots of distinct inheritance hierarchies. + */ +#define G_TYPE_FUNDAMENTAL(type) (g_type_fundamental (type)) +/** + * G_TYPE_FUNDAMENTAL_MAX: + * + * An integer constant that represents the number of identifiers reserved + * for types that are assigned at compile-time. + */ +#define G_TYPE_FUNDAMENTAL_MAX (255 << G_TYPE_FUNDAMENTAL_SHIFT) + +/* Constant fundamental types, + * introduced by g_type_init(). + */ +/** + * G_TYPE_INVALID: + * + * An invalid #GType used as error return value in some functions which return + * a #GType. + */ +#define G_TYPE_INVALID G_TYPE_MAKE_FUNDAMENTAL (0) +/** + * G_TYPE_NONE: + * + * A fundamental type which is used as a replacement for the C + * void return type. + */ +#define G_TYPE_NONE G_TYPE_MAKE_FUNDAMENTAL (1) +/** + * G_TYPE_INTERFACE: + * + * The fundamental type from which all interfaces are derived. + */ +#define G_TYPE_INTERFACE G_TYPE_MAKE_FUNDAMENTAL (2) +/** + * G_TYPE_CHAR: + * + * The fundamental type corresponding to #gchar. + * The type designated by G_TYPE_CHAR is unconditionally an 8-bit signed integer. + * This may or may not be the same type a the C type "gchar". + */ +#define G_TYPE_CHAR G_TYPE_MAKE_FUNDAMENTAL (3) +/** + * G_TYPE_UCHAR: + * + * The fundamental type corresponding to #guchar. + */ +#define G_TYPE_UCHAR G_TYPE_MAKE_FUNDAMENTAL (4) +/** + * G_TYPE_BOOLEAN: + * + * The fundamental type corresponding to #gboolean. + */ +#define G_TYPE_BOOLEAN G_TYPE_MAKE_FUNDAMENTAL (5) +/** + * G_TYPE_INT: + * + * The fundamental type corresponding to #gint. + */ +#define G_TYPE_INT G_TYPE_MAKE_FUNDAMENTAL (6) +/** + * G_TYPE_UINT: + * + * The fundamental type corresponding to #guint. + */ +#define G_TYPE_UINT G_TYPE_MAKE_FUNDAMENTAL (7) +/** + * G_TYPE_LONG: + * + * The fundamental type corresponding to #glong. + */ +#define G_TYPE_LONG G_TYPE_MAKE_FUNDAMENTAL (8) +/** + * G_TYPE_ULONG: + * + * The fundamental type corresponding to #gulong. + */ +#define G_TYPE_ULONG G_TYPE_MAKE_FUNDAMENTAL (9) +/** + * G_TYPE_INT64: + * + * The fundamental type corresponding to #gint64. + */ +#define G_TYPE_INT64 G_TYPE_MAKE_FUNDAMENTAL (10) +/** + * G_TYPE_UINT64: + * + * The fundamental type corresponding to #guint64. + */ +#define G_TYPE_UINT64 G_TYPE_MAKE_FUNDAMENTAL (11) +/** + * G_TYPE_ENUM: + * + * The fundamental type from which all enumeration types are derived. + */ +#define G_TYPE_ENUM G_TYPE_MAKE_FUNDAMENTAL (12) +/** + * G_TYPE_FLAGS: + * + * The fundamental type from which all flags types are derived. + */ +#define G_TYPE_FLAGS G_TYPE_MAKE_FUNDAMENTAL (13) +/** + * G_TYPE_FLOAT: + * + * The fundamental type corresponding to #gfloat. + */ +#define G_TYPE_FLOAT G_TYPE_MAKE_FUNDAMENTAL (14) +/** + * G_TYPE_DOUBLE: + * + * The fundamental type corresponding to #gdouble. + */ +#define G_TYPE_DOUBLE G_TYPE_MAKE_FUNDAMENTAL (15) +/** + * G_TYPE_STRING: + * + * The fundamental type corresponding to nul-terminated C strings. + */ +#define G_TYPE_STRING G_TYPE_MAKE_FUNDAMENTAL (16) +/** + * G_TYPE_POINTER: + * + * The fundamental type corresponding to #gpointer. + */ +#define G_TYPE_POINTER G_TYPE_MAKE_FUNDAMENTAL (17) +/** + * G_TYPE_BOXED: + * + * The fundamental type from which all boxed types are derived. + */ +#define G_TYPE_BOXED G_TYPE_MAKE_FUNDAMENTAL (18) +/** + * G_TYPE_PARAM: + * + * The fundamental type from which all #GParamSpec types are derived. + */ +#define G_TYPE_PARAM G_TYPE_MAKE_FUNDAMENTAL (19) +/** + * G_TYPE_OBJECT: + * + * The fundamental type for #GObject. + */ +#define G_TYPE_OBJECT G_TYPE_MAKE_FUNDAMENTAL (20) + + +/* Reserved fundamental type numbers to create new fundamental + * type IDs with G_TYPE_MAKE_FUNDAMENTAL(). + * Send email to gtk-devel-list@gnome.org for reservations. + */ +/** + * G_TYPE_FUNDAMENTAL_SHIFT: + * + * Shift value used in converting numbers to type IDs. + */ +#define G_TYPE_FUNDAMENTAL_SHIFT (2) +/** + * G_TYPE_MAKE_FUNDAMENTAL: + * @x: the fundamental type number. + * + * Get the type ID for the fundamental type number @x. + * Use g_type_fundamental_next() instead of this macro to create new fundamental + * types. + * + * Returns: the GType + */ +#define G_TYPE_MAKE_FUNDAMENTAL(x) ((GType) ((x) << G_TYPE_FUNDAMENTAL_SHIFT)) +/** + * G_TYPE_RESERVED_GLIB_FIRST: + * + * First fundamental type number to create a new fundamental type id with + * G_TYPE_MAKE_FUNDAMENTAL() reserved for GLib. + */ +#define G_TYPE_RESERVED_GLIB_FIRST (21) +/** + * G_TYPE_RESERVED_GLIB_LAST: + * + * Last fundamental type number reserved for GLib. + */ +#define G_TYPE_RESERVED_GLIB_LAST (31) +/** + * G_TYPE_RESERVED_BSE_FIRST: + * + * First fundamental type number to create a new fundamental type id with + * G_TYPE_MAKE_FUNDAMENTAL() reserved for BSE. + */ +#define G_TYPE_RESERVED_BSE_FIRST (32) +/** + * G_TYPE_RESERVED_BSE_LAST: + * + * Last fundamental type number reserved for BSE. + */ +#define G_TYPE_RESERVED_BSE_LAST (48) +/** + * G_TYPE_RESERVED_USER_FIRST: + * + * First available fundamental type number to create new fundamental + * type id with G_TYPE_MAKE_FUNDAMENTAL(). + */ +#define G_TYPE_RESERVED_USER_FIRST (49) + + +/* Type Checking Macros + */ +/** + * G_TYPE_IS_FUNDAMENTAL: + * @type: A #GType value. + * + * Checks if @type is a fundamental type. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_FUNDAMENTAL(type) ((type) <= G_TYPE_FUNDAMENTAL_MAX) +/** + * G_TYPE_IS_DERIVED: + * @type: A #GType value. + * + * Checks if @type is derived (or in object-oriented terminology: + * inherited) from another type (this holds true for all non-fundamental + * types). + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_DERIVED(type) ((type) > G_TYPE_FUNDAMENTAL_MAX) +/** + * G_TYPE_IS_INTERFACE: + * @type: A #GType value. + * + * Checks if @type is an interface type. + * An interface type provides a pure API, the implementation + * of which is provided by another type (which is then said to conform + * to the interface). GLib interfaces are somewhat analogous to Java + * interfaces and C++ classes containing only pure virtual functions, + * with the difference that GType interfaces are not derivable (but see + * g_type_interface_add_prerequisite() for an alternative). + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_INTERFACE(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_INTERFACE) +/** + * G_TYPE_IS_CLASSED: + * @type: A #GType value. + * + * Checks if @type is a classed type. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_CLASSED(type) (g_type_test_flags ((type), G_TYPE_FLAG_CLASSED)) +/** + * G_TYPE_IS_INSTANTIATABLE: + * @type: A #GType value. + * + * Checks if @type can be instantiated. Instantiation is the + * process of creating an instance (object) of this type. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_INSTANTIATABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_INSTANTIATABLE)) +/** + * G_TYPE_IS_DERIVABLE: + * @type: A #GType value. + * + * Checks if @type is a derivable type. A derivable type can + * be used as the base class of a flat (single-level) class hierarchy. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DERIVABLE)) +/** + * G_TYPE_IS_DEEP_DERIVABLE: + * @type: A #GType value. + * + * Checks if @type is a deep derivable type. A deep derivable type + * can be used as the base class of a deep (multi-level) class hierarchy. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_DEEP_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE)) +/** + * G_TYPE_IS_ABSTRACT: + * @type: A #GType value. + * + * Checks if @type is an abstract type. An abstract type can not be + * instantiated and is normally used as an abstract base class for + * derived classes. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT)) +/** + * G_TYPE_IS_VALUE_ABSTRACT: + * @type: A #GType value. + * + * Checks if @type is an abstract value type. An abstract value type introduces + * a value table, but can't be used for g_value_init() and is normally used as + * an abstract base type for derived value types. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_VALUE_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT)) +/** + * G_TYPE_IS_VALUE_TYPE: + * @type: A #GType value. + * + * Checks if @type is a value type and can be used with g_value_init(). + * + * Returns: %TRUE on success. + */ +#define G_TYPE_IS_VALUE_TYPE(type) (g_type_check_is_value_type (type)) +/** + * G_TYPE_HAS_VALUE_TABLE: + * @type: A #GType value. + * + * Checks if @type has a #GTypeValueTable. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_HAS_VALUE_TABLE(type) (g_type_value_table_peek (type) != NULL) + + +/* Typedefs + */ +/** + * GType: + * + * A numerical value which represents the unique identifier of a registered + * type. + */ +#if GLIB_SIZEOF_SIZE_T != GLIB_SIZEOF_LONG || !defined __cplusplus +typedef gsize GType; +#else /* for historic reasons, C++ links against gulong GTypes */ +typedef gulong GType; +#endif +typedef struct _GValue GValue; +typedef union _GTypeCValue GTypeCValue; +typedef struct _GTypePlugin GTypePlugin; +typedef struct _GTypeClass GTypeClass; +typedef struct _GTypeInterface GTypeInterface; +typedef struct _GTypeInstance GTypeInstance; +typedef struct _GTypeInfo GTypeInfo; +typedef struct _GTypeFundamentalInfo GTypeFundamentalInfo; +typedef struct _GInterfaceInfo GInterfaceInfo; +typedef struct _GTypeValueTable GTypeValueTable; +typedef struct _GTypeQuery GTypeQuery; + + +/* Basic Type Structures + */ +/** + * GTypeClass: + * + * An opaque structure used as the base of all classes. + */ +struct _GTypeClass +{ + /*< private >*/ + GType g_type; +}; +/** + * GTypeInstance: + * + * An opaque structure used as the base of all type instances. + */ +struct _GTypeInstance +{ + /*< private >*/ + GTypeClass *g_class; +}; +/** + * GTypeInterface: + * + * An opaque structure used as the base of all interface types. + */ +struct _GTypeInterface +{ + /*< private >*/ + GType g_type; /* iface type */ + GType g_instance_type; +}; +/** + * GTypeQuery: + * @type: the #GType value of the type. + * @type_name: the name of the type. + * @class_size: the size of the class structure. + * @instance_size: the size of the instance structure. + * + * A structure holding information for a specific type. It is + * filled in by the g_type_query() function. + */ +struct _GTypeQuery +{ + GType type; + const gchar *type_name; + guint class_size; + guint instance_size; +}; + + +/* Casts, checks and accessors for structured types + * usage of these macros is reserved to type implementations only + */ +/*< protected >*/ +/** + * G_TYPE_CHECK_INSTANCE: + * @instance: Location of a #GTypeInstance structure. + * + * Checks if @instance is a valid #GTypeInstance structure, + * otherwise issues a warning and returns %FALSE. + * + * This macro should only be used in type implementations. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_CHECK_INSTANCE(instance) (_G_TYPE_CHI ((GTypeInstance*) (instance))) +/** + * G_TYPE_CHECK_INSTANCE_CAST: + * @instance: Location of a #GTypeInstance structure. + * @g_type: The type to be returned. + * @c_type: The corresponding C type of @g_type. + * + * Checks that @instance is an instance of the type identified by @g_type + * and issues a warning if this is not the case. Returns @instance casted + * to a pointer to @c_type. + * + * This macro should only be used in type implementations. + */ +#define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type) (_G_TYPE_CIC ((instance), (g_type), c_type)) +/** + * G_TYPE_CHECK_INSTANCE_TYPE: + * @instance: Location of a #GTypeInstance structure. + * @g_type: The type to be checked + * + * Checks if @instance is an instance of the type identified by @g_type. + * + * This macro should only be used in type implementations. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type) (_G_TYPE_CIT ((instance), (g_type))) +/** + * G_TYPE_INSTANCE_GET_CLASS: + * @instance: Location of the #GTypeInstance structure. + * @g_type: The #GType of the class to be returned. + * @c_type: The C type of the class structure. + * + * Get the class structure of a given @instance, casted + * to a specified ancestor type @g_type of the instance. + * + * Note that while calling a GInstanceInitFunc(), the class pointer gets + * modified, so it might not always return the expected pointer. + * + * This macro should only be used in type implementations. + * + * Returns: a pointer to the class structure + */ +#define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type) (_G_TYPE_IGC ((instance), (g_type), c_type)) +/** + * G_TYPE_INSTANCE_GET_INTERFACE: + * @instance: Location of the #GTypeInstance structure. + * @g_type: The #GType of the interface to be returned. + * @c_type: The C type of the interface structure. + * + * Get the interface structure for interface @g_type of a given @instance. + * + * This macro should only be used in type implementations. + * + * Returns: a pointer to the interface structure + */ +#define G_TYPE_INSTANCE_GET_INTERFACE(instance, g_type, c_type) (_G_TYPE_IGI ((instance), (g_type), c_type)) +/** + * G_TYPE_CHECK_CLASS_CAST: + * @g_class: Location of a #GTypeClass structure. + * @g_type: The type to be returned. + * @c_type: The corresponding C type of class structure of @g_type. + * + * Checks that @g_class is a class structure of the type identified by @g_type + * and issues a warning if this is not the case. Returns @g_class casted + * to a pointer to @c_type. + * + * This macro should only be used in type implementations. + */ +#define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type) (_G_TYPE_CCC ((g_class), (g_type), c_type)) +/** + * G_TYPE_CHECK_CLASS_TYPE: + * @g_class: Location of a #GTypeClass structure. + * @g_type: The type to be checked. + * + * Checks if @g_class is a class structure of the type identified by + * @g_type. + * + * This macro should only be used in type implementations. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type) (_G_TYPE_CCT ((g_class), (g_type))) +/** + * G_TYPE_CHECK_VALUE: + * @value: a #GValue + * + * Checks if @value has been initialized to hold values + * of a value type. + * + * This macro should only be used in type implementations. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_CHECK_VALUE(value) (_G_TYPE_CHV ((value))) +/** + * G_TYPE_CHECK_VALUE_TYPE: + * @value: a #GValue + * @g_type: The type to be checked. + * + * Checks if @value has been initialized to hold values + * of type @g_type. + * + * This macro should only be used in type implementations. + * + * Returns: %TRUE on success. + */ +#define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVH ((value), (g_type))) +/** + * G_TYPE_FROM_INSTANCE: + * @instance: Location of a valid #GTypeInstance structure. + * + * Get the type identifier from a given @instance structure. + * + * This macro should only be used in type implementations. + * + * Returns: the #GType + */ +#define G_TYPE_FROM_INSTANCE(instance) (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class)) +/** + * G_TYPE_FROM_CLASS: + * @g_class: Location of a valid #GTypeClass structure. + * + * Get the type identifier from a given @class structure. + * + * This macro should only be used in type implementations. + * + * Returns: the #GType + */ +#define G_TYPE_FROM_CLASS(g_class) (((GTypeClass*) (g_class))->g_type) +/** + * G_TYPE_FROM_INTERFACE: + * @g_iface: Location of a valid #GTypeInterface structure. + * + * Get the type identifier from a given @interface structure. + * + * This macro should only be used in type implementations. + * + * Returns: the #GType + */ +#define G_TYPE_FROM_INTERFACE(g_iface) (((GTypeInterface*) (g_iface))->g_type) + +/** + * G_TYPE_INSTANCE_GET_PRIVATE: + * @instance: the instance of a type deriving from @private_type. + * @g_type: the type identifying which private data to retrieve. + * @c_type: The C type for the private structure. + * + * Gets the private structure for a particular type. + * The private structure must have been registered in the + * class_init function with g_type_class_add_private(). + * + * This macro should only be used in type implementations. + * + * Since: 2.4 + * Returns: a pointer to the private data structure. + */ +#define G_TYPE_INSTANCE_GET_PRIVATE(instance, g_type, c_type) ((c_type*) g_type_instance_get_private ((GTypeInstance*) (instance), (g_type))) + +/** + * G_TYPE_CLASS_GET_PRIVATE: + * @klass: the class of a type deriving from @private_type. + * @g_type: the type identifying which private data to retrieve. + * @c_type: The C type for the private structure. + * + * Gets the private class structure for a particular type. + * The private structure must have been registered in the + * get_type() function with g_type_add_class_private(). + * + * This macro should only be used in type implementations. + * + * Since: 2.24 + * Returns: a pointer to the private data structure. + */ +#define G_TYPE_CLASS_GET_PRIVATE(klass, g_type, c_type) ((c_type*) g_type_class_get_private ((GTypeClass*) (klass), (g_type))) + +/** + * GTypeDebugFlags: + * @G_TYPE_DEBUG_NONE: Print no messages. + * @G_TYPE_DEBUG_OBJECTS: Print messages about object bookkeeping. + * @G_TYPE_DEBUG_SIGNALS: Print messages about signal emissions. + * @G_TYPE_DEBUG_MASK: Mask covering all debug flags. + * + * The GTypeDebugFlags enumeration values can be passed to + * g_type_init_with_debug_flags() to trigger debugging messages during runtime. + * Note that the messages can also be triggered by setting the + * GOBJECT_DEBUG environment variable to a ':'-separated list of + * "objects" and "signals". + */ +typedef enum /*< skip >*/ +{ + G_TYPE_DEBUG_NONE = 0, + G_TYPE_DEBUG_OBJECTS = 1 << 0, + G_TYPE_DEBUG_SIGNALS = 1 << 1, + G_TYPE_DEBUG_MASK = 0x03 +} GTypeDebugFlags; + + +/* --- prototypes --- */ +void g_type_init (void); +void g_type_init_with_debug_flags (GTypeDebugFlags debug_flags); +G_CONST_RETURN gchar* g_type_name (GType type); +GQuark g_type_qname (GType type); +GType g_type_from_name (const gchar *name); +GType g_type_parent (GType type); +guint g_type_depth (GType type); +GType g_type_next_base (GType leaf_type, + GType root_type); +gboolean g_type_is_a (GType type, + GType is_a_type); +gpointer g_type_class_ref (GType type); +gpointer g_type_class_peek (GType type); +gpointer g_type_class_peek_static (GType type); +void g_type_class_unref (gpointer g_class); +gpointer g_type_class_peek_parent (gpointer g_class); +gpointer g_type_interface_peek (gpointer instance_class, + GType iface_type); +gpointer g_type_interface_peek_parent (gpointer g_iface); + +gpointer g_type_default_interface_ref (GType g_type); +gpointer g_type_default_interface_peek (GType g_type); +void g_type_default_interface_unref (gpointer g_iface); + +/* g_free() the returned arrays */ +GType* g_type_children (GType type, + guint *n_children); +GType* g_type_interfaces (GType type, + guint *n_interfaces); + +/* per-type _static_ data */ +void g_type_set_qdata (GType type, + GQuark quark, + gpointer data); +gpointer g_type_get_qdata (GType type, + GQuark quark); +void g_type_query (GType type, + GTypeQuery *query); + + +/* --- type registration --- */ +/** + * GBaseInitFunc: + * @g_class: The #GTypeClass structure to initialize. + * + * A callback function used by the type system to do base initialization + * of the class structures of derived types. It is called as part of the + * initialization process of all derived classes and should reallocate + * or reset all dynamic class members copied over from the parent class. + * For example, class members (such as strings) that are not sufficiently + * handled by a plain memory copy of the parent class into the derived class + * have to be altered. See GClassInitFunc() for a discussion of the class + * intialization process. + */ +typedef void (*GBaseInitFunc) (gpointer g_class); +/** + * GBaseFinalizeFunc: + * @g_class: The #GTypeClass structure to finalize. + * + * A callback function used by the type system to finalize those portions + * of a derived types class structure that were setup from the corresponding + * GBaseInitFunc() function. Class finalization basically works the inverse + * way in which class intialization is performed. + * See GClassInitFunc() for a discussion of the class intialization process. + */ +typedef void (*GBaseFinalizeFunc) (gpointer g_class); +/** + * GClassInitFunc: + * @g_class: The #GTypeClass structure to initialize. + * @class_data: The @class_data member supplied via the #GTypeInfo structure. + * + * A callback function used by the type system to initialize the class + * of a specific type. This function should initialize all static class + * members. + * The initialization process of a class involves: + * + * + * 1 - Copying common members from the parent class over to the + * derived class structure. + * + * + * 2 - Zero initialization of the remaining members not copied + * over from the parent class. + * + * + * 3 - Invocation of the GBaseInitFunc() initializers of all parent + * types and the class' type. + * + * + * 4 - Invocation of the class' GClassInitFunc() initializer. + * + * + * Since derived classes are partially initialized through a memory copy + * of the parent class, the general rule is that GBaseInitFunc() and + * GBaseFinalizeFunc() should take care of necessary reinitialization + * and release of those class members that were introduced by the type + * that specified these GBaseInitFunc()/GBaseFinalizeFunc(). + * GClassInitFunc() should only care about initializing static + * class members, while dynamic class members (such as allocated strings + * or reference counted resources) are better handled by a GBaseInitFunc() + * for this type, so proper initialization of the dynamic class members + * is performed for class initialization of derived types as well. + * An example may help to correspond the intend of the different class + * initializers: + * + * |[ + * typedef struct { + * GObjectClass parent_class; + * gint static_integer; + * gchar *dynamic_string; + * } TypeAClass; + * static void + * type_a_base_class_init (TypeAClass *class) + * { + * class->dynamic_string = g_strdup ("some string"); + * } + * static void + * type_a_base_class_finalize (TypeAClass *class) + * { + * g_free (class->dynamic_string); + * } + * static void + * type_a_class_init (TypeAClass *class) + * { + * class->static_integer = 42; + * } + * + * typedef struct { + * TypeAClass parent_class; + * gfloat static_float; + * GString *dynamic_gstring; + * } TypeBClass; + * static void + * type_b_base_class_init (TypeBClass *class) + * { + * class->dynamic_gstring = g_string_new ("some other string"); + * } + * static void + * type_b_base_class_finalize (TypeBClass *class) + * { + * g_string_free (class->dynamic_gstring); + * } + * static void + * type_b_class_init (TypeBClass *class) + * { + * class->static_float = 3.14159265358979323846; + * } + * ]| + * Initialization of TypeBClass will first cause initialization of + * TypeAClass (derived classes reference their parent classes, see + * g_type_class_ref() on this). + * Initialization of TypeAClass roughly involves zero-initializing its fields, + * then calling its GBaseInitFunc() type_a_base_class_init() to allocate + * its dynamic members (dynamic_string), and finally calling its GClassInitFunc() + * type_a_class_init() to initialize its static members (static_integer). + * The first step in the initialization process of TypeBClass is then + * a plain memory copy of the contents of TypeAClass into TypeBClass and + * zero-initialization of the remaining fields in TypeBClass. + * The dynamic members of TypeAClass within TypeBClass now need + * reinitialization which is performed by calling type_a_base_class_init() + * with an argument of TypeBClass. + * After that, the GBaseInitFunc() of TypeBClass, type_b_base_class_init() + * is called to allocate the dynamic members of TypeBClass (dynamic_gstring), + * and finally the GClassInitFunc() of TypeBClass, type_b_class_init(), + * is called to complete the initialization process with the static members + * (static_float). + * Corresponding finalization counter parts to the GBaseInitFunc() functions + * have to be provided to release allocated resources at class finalization + * time. + */ +typedef void (*GClassInitFunc) (gpointer g_class, + gpointer class_data); +/** + * GClassFinalizeFunc: + * @g_class: The #GTypeClass structure to finalize. + * @class_data: The @class_data member supplied via the #GTypeInfo structure. + * + * A callback function used by the type system to finalize a class. + * This function is rarely needed, as dynamically allocated class resources + * should be handled by GBaseInitFunc() and GBaseFinalizeFunc(). + * Also, specification of a GClassFinalizeFunc() in the #GTypeInfo + * structure of a static type is invalid, because classes of static types + * will never be finalized (they are artificially kept alive when their + * reference count drops to zero). + */ +typedef void (*GClassFinalizeFunc) (gpointer g_class, + gpointer class_data); +/** + * GInstanceInitFunc: + * @instance: The instance to initialize. + * @g_class: The class of the type the instance is created for. + * + * A callback function used by the type system to initialize a new + * instance of a type. This function initializes all instance members and + * allocates any resources required by it. + * Initialization of a derived instance involves calling all its parent + * types instance initializers, so the class member of the instance + * is altered during its initialization to always point to the class that + * belongs to the type the current initializer was introduced for. + */ +typedef void (*GInstanceInitFunc) (GTypeInstance *instance, + gpointer g_class); +/** + * GInterfaceInitFunc: + * @g_iface: The interface structure to initialize. + * @iface_data: The @interface_data supplied via the #GInterfaceInfo structure. + * + * A callback function used by the type system to initialize a new + * interface. This function should initialize all internal data and + * allocate any resources required by the interface. + */ +typedef void (*GInterfaceInitFunc) (gpointer g_iface, + gpointer iface_data); +/** + * GInterfaceFinalizeFunc: + * @g_iface: The interface structure to finalize. + * @iface_data: The @interface_data supplied via the #GInterfaceInfo structure. + * + * A callback function used by the type system to finalize an interface. + * This function should destroy any internal data and release any resources + * allocated by the corresponding GInterfaceInitFunc() function. + */ +typedef void (*GInterfaceFinalizeFunc) (gpointer g_iface, + gpointer iface_data); +/** + * GTypeClassCacheFunc: + * @cache_data: data that was given to the g_type_add_class_cache_func() call + * @g_class: The #GTypeClass structure which is unreferenced + * + * A callback function which is called when the reference count of a class + * drops to zero. It may use g_type_class_ref() to prevent the class from + * being freed. You should not call g_type_class_unref() from a + * #GTypeClassCacheFunc function to prevent infinite recursion, use + * g_type_class_unref_uncached() instead. + * + * The functions have to check the class id passed in to figure + * whether they actually want to cache the class of this type, since all + * classes are routed through the same #GTypeClassCacheFunc chain. + * + * Returns: %TRUE to stop further #GTypeClassCacheFuncs from being + * called, %FALSE to continue. + */ +typedef gboolean (*GTypeClassCacheFunc) (gpointer cache_data, + GTypeClass *g_class); +/** + * GTypeInterfaceCheckFunc: + * @check_data: data passed to g_type_add_interface_check(). + * @g_iface: the interface that has been initialized + * + * A callback called after an interface vtable is initialized. + * See g_type_add_interface_check(). + * + * Since: 2.4 + */ +typedef void (*GTypeInterfaceCheckFunc) (gpointer check_data, + gpointer g_iface); +/** + * GTypeFundamentalFlags: + * @G_TYPE_FLAG_CLASSED: Indicates a classed type. + * @G_TYPE_FLAG_INSTANTIATABLE: Indicates an instantiable type (implies classed). + * @G_TYPE_FLAG_DERIVABLE: Indicates a flat derivable type. + * @G_TYPE_FLAG_DEEP_DERIVABLE: Indicates a deep derivable type (implies derivable). + * + * Bit masks used to check or determine specific characteristics of a + * fundamental type. + */ +typedef enum /*< skip >*/ +{ + G_TYPE_FLAG_CLASSED = (1 << 0), + G_TYPE_FLAG_INSTANTIATABLE = (1 << 1), + G_TYPE_FLAG_DERIVABLE = (1 << 2), + G_TYPE_FLAG_DEEP_DERIVABLE = (1 << 3) +} GTypeFundamentalFlags; +/** + * GTypeFlags: + * @G_TYPE_FLAG_ABSTRACT: Indicates an abstract type. No instances can be + * created for an abstract type. + * @G_TYPE_FLAG_VALUE_ABSTRACT: Indicates an abstract value type, i.e. a type + * that introduces a value table, but can't be used for + * g_value_init(). + * + * Bit masks used to check or determine characteristics of a type. + */ +typedef enum /*< skip >*/ +{ + G_TYPE_FLAG_ABSTRACT = (1 << 4), + G_TYPE_FLAG_VALUE_ABSTRACT = (1 << 5) +} GTypeFlags; +/** + * GTypeInfo: + * @class_size: Size of the class structure (required for interface, classed and instantiatable types). + * @base_init: Location of the base initialization function (optional). + * @base_finalize: Location of the base finalization function (optional). + * @class_init: Location of the class initialization function for + * classed and instantiatable types. Location of the default vtable + * inititalization function for interface types. (optional) This function + * is used both to fill in virtual functions in the class or default vtable, + * and to do type-specific setup such as registering signals and object + * properties. + * @class_finalize: Location of the class finalization function for + * classed and instantiatable types. Location fo the default vtable + * finalization function for interface types. (optional) + * @class_data: User-supplied data passed to the class init/finalize functions. + * @instance_size: Size of the instance (object) structure (required for instantiatable types only). + * @n_preallocs: Prior to GLib 2.10, it specified the number of pre-allocated (cached) instances to reserve memory for (0 indicates no caching). Since GLib 2.10, it is ignored, since instances are allocated with the slice allocator now. + * @instance_init: Location of the instance initialization function (optional, for instantiatable types only). + * @value_table: A #GTypeValueTable function table for generic handling of GValues of this type (usually only + * useful for fundamental types). + * + * This structure is used to provide the type system with the information + * required to initialize and destruct (finalize) a type's class and + * its instances. + * The initialized structure is passed to the g_type_register_static() function + * (or is copied into the provided #GTypeInfo structure in the + * g_type_plugin_complete_type_info()). The type system will perform a deep + * copy of this structure, so its memory does not need to be persistent + * across invocation of g_type_register_static(). + */ +struct _GTypeInfo +{ + /* interface types, classed types, instantiated types */ + guint16 class_size; + + GBaseInitFunc base_init; + GBaseFinalizeFunc base_finalize; + + /* interface types, classed types, instantiated types */ + GClassInitFunc class_init; + GClassFinalizeFunc class_finalize; + gconstpointer class_data; + + /* instantiated types */ + guint16 instance_size; + guint16 n_preallocs; + GInstanceInitFunc instance_init; + + /* value handling */ + const GTypeValueTable *value_table; +}; +/** + * GTypeFundamentalInfo: + * @type_flags: #GTypeFundamentalFlags describing the characteristics of the fundamental type + * + * A structure that provides information to the type system which is + * used specifically for managing fundamental types. + */ +struct _GTypeFundamentalInfo +{ + GTypeFundamentalFlags type_flags; +}; +/** + * GInterfaceInfo: + * @interface_init: location of the interface initialization function + * @interface_finalize: location of the interface finalization function + * @interface_data: user-supplied data passed to the interface init/finalize functions + * + * A structure that provides information to the type system which is + * used specifically for managing interface types. + */ +struct _GInterfaceInfo +{ + GInterfaceInitFunc interface_init; + GInterfaceFinalizeFunc interface_finalize; + gpointer interface_data; +}; +/** + * GTypeValueTable: + * @value_init: Default initialize @values contents by poking values + * directly into the value->data array. The data array of + * the #GValue passed into this function was zero-filled + * with memset(), so no care has to + * be taken to free any + * old contents. E.g. for the implementation of a string + * value that may never be %NULL, the implementation might + * look like: + * |[ + * value->data[0].v_pointer = g_strdup (""); + * ]| + * @value_free: Free any old contents that might be left in the + * data array of the passed in @value. No resources may + * remain allocated through the #GValue contents after + * this function returns. E.g. for our above string type: + * |[ + * // only free strings without a specific flag for static storage + * if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) + * g_free (value->data[0].v_pointer); + * ]| + * @value_copy: @dest_value is a #GValue with zero-filled data section + * and @src_value is a properly setup #GValue of same or + * derived type. + * The purpose of this function is to copy the contents of + * @src_value into @dest_value in a way, that even after + * @src_value has been freed, the contents of @dest_value + * remain valid. String type example: + * |[ + * dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer); + * ]| + * @value_peek_pointer: If the value contents fit into a pointer, such as objects + * or strings, return this pointer, so the caller can peek at + * the current contents. To extend on our above string example: + * |[ + * return value->data[0].v_pointer; + * ]| + * @collect_format: A string format describing how to collect the contents of + * this value bit-by-bit. Each character in the format represents + * an argument to be collected, and the characters themselves indicate + * the type of the argument. Currently supported arguments are: + * + * + * 'i' - Integers. passed as collect_values[].v_int. + * + * + * 'l' - Longs. passed as collect_values[].v_long. + * + * + * 'd' - Doubles. passed as collect_values[].v_double. + * + * + * 'p' - Pointers. passed as collect_values[].v_pointer. + * + * + * It should be noted that for variable argument list construction, + * ANSI C promotes every type smaller than an integer to an int, and + * floats to doubles. So for collection of short int or char, 'i' + * needs to be used, and for collection of floats 'd'. + * @collect_value: The collect_value() function is responsible for converting the + * values collected from a variable argument list into contents + * suitable for storage in a GValue. This function should setup + * @value similar to value_init(); e.g. for a string value that + * does not allow %NULL pointers, it needs to either spew an error, + * or do an implicit conversion by storing an empty string. + * The @value passed in to this function has a zero-filled data + * array, so just like for value_init() it is guaranteed to not + * contain any old contents that might need freeing. + * @n_collect_values is exactly the string length of @collect_format, + * and @collect_values is an array of unions #GTypeCValue with + * length @n_collect_values, containing the collected values + * according to @collect_format. + * @collect_flags is an argument provided as a hint by the caller. + * It may contain the flag %G_VALUE_NOCOPY_CONTENTS indicating, + * that the collected value contents may be considered "static" + * for the duration of the @value lifetime. + * Thus an extra copy of the contents stored in @collect_values is + * not required for assignment to @value. + * For our above string example, we continue with: + * |[ + * if (!collect_values[0].v_pointer) + * value->data[0].v_pointer = g_strdup (""); + * else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + * { + * value->data[0].v_pointer = collect_values[0].v_pointer; + * // keep a flag for the value_free() implementation to not free this string + * value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; + * } + * else + * value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer); + * return NULL; + * ]| + * It should be noted, that it is generally a bad idea to follow the + * #G_VALUE_NOCOPY_CONTENTS hint for reference counted types. Due to + * reentrancy requirements and reference count assertions performed + * by the #GSignal code, reference counts should always be incremented + * for reference counted contents stored in the value->data array. + * To deviate from our string example for a moment, and taking a look + * at an exemplary implementation for collect_value() of #GObject: + * |[ + * if (collect_values[0].v_pointer) + * { + * GObject *object = G_OBJECT (collect_values[0].v_pointer); + * // never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types + * value->data[0].v_pointer = g_object_ref (object); + * return NULL; + * } + * else + * return g_strdup_printf ("Object passed as invalid NULL pointer"); + * } + * ]| + * The reference count for valid objects is always incremented, + * regardless of @collect_flags. For invalid objects, the example + * returns a newly allocated string without altering @value. + * Upon success, collect_value() needs to return %NULL. If, however, + * an error condition occurred, collect_value() may spew an + * error by returning a newly allocated non-%NULL string, giving + * a suitable description of the error condition. + * The calling code makes no assumptions about the @value + * contents being valid upon error returns, @value + * is simply thrown away without further freeing. As such, it is + * a good idea to not allocate #GValue contents, prior to returning + * an error, however, collect_values() is not obliged to return + * a correctly setup @value for error returns, simply because + * any non-%NULL return is considered a fatal condition so further + * program behaviour is undefined. + * @lcopy_format: Format description of the arguments to collect for @lcopy_value, + * analogous to @collect_format. Usually, @lcopy_format string consists + * only of 'p's to provide lcopy_value() with pointers to storage locations. + * @lcopy_value: This function is responsible for storing the @value contents into + * arguments passed through a variable argument list which got + * collected into @collect_values according to @lcopy_format. + * @n_collect_values equals the string length of @lcopy_format, + * and @collect_flags may contain %G_VALUE_NOCOPY_CONTENTS. + * In contrast to collect_value(), lcopy_value() is obliged to + * always properly support %G_VALUE_NOCOPY_CONTENTS. + * Similar to collect_value() the function may prematurely abort + * by returning a newly allocated string describing an error condition. + * To complete the string example: + * |[ + * gchar **string_p = collect_values[0].v_pointer; + * if (!string_p) + * return g_strdup_printf ("string location passed as NULL"); + * if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + * *string_p = value->data[0].v_pointer; + * else + * *string_p = g_strdup (value->data[0].v_pointer); + * ]| + * And an illustrative version of lcopy_value() for + * reference-counted types: + * |[ + * GObject **object_p = collect_values[0].v_pointer; + * if (!object_p) + * return g_strdup_printf ("object location passed as NULL"); + * if (!value->data[0].v_pointer) + * *object_p = NULL; + * else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) // always honour + * *object_p = value->data[0].v_pointer; + * else + * *object_p = g_object_ref (value->data[0].v_pointer); + * return NULL; + * ]| + * + * The #GTypeValueTable provides the functions required by the #GValue implementation, + * to serve as a container for values of a type. + */ + +struct _GTypeValueTable +{ + void (*value_init) (GValue *value); + void (*value_free) (GValue *value); + void (*value_copy) (const GValue *src_value, + GValue *dest_value); + /* varargs functionality (optional) */ + gpointer (*value_peek_pointer) (const GValue *value); + gchar *collect_format; + gchar* (*collect_value) (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); + gchar *lcopy_format; + gchar* (*lcopy_value) (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +}; +GType g_type_register_static (GType parent_type, + const gchar *type_name, + const GTypeInfo *info, + GTypeFlags flags); +GType g_type_register_static_simple (GType parent_type, + const gchar *type_name, + guint class_size, + GClassInitFunc class_init, + guint instance_size, + GInstanceInitFunc instance_init, + GTypeFlags flags); + +GType g_type_register_dynamic (GType parent_type, + const gchar *type_name, + GTypePlugin *plugin, + GTypeFlags flags); +GType g_type_register_fundamental (GType type_id, + const gchar *type_name, + const GTypeInfo *info, + const GTypeFundamentalInfo *finfo, + GTypeFlags flags); +void g_type_add_interface_static (GType instance_type, + GType interface_type, + const GInterfaceInfo *info); +void g_type_add_interface_dynamic (GType instance_type, + GType interface_type, + GTypePlugin *plugin); +void g_type_interface_add_prerequisite (GType interface_type, + GType prerequisite_type); +GType*g_type_interface_prerequisites (GType interface_type, + guint *n_prerequisites); +void g_type_class_add_private (gpointer g_class, + gsize private_size); +gpointer g_type_instance_get_private (GTypeInstance *instance, + GType private_type); + +void g_type_add_class_private (GType class_type, + gsize private_size); +gpointer g_type_class_get_private (GTypeClass *klass, + GType private_type); + + +/* --- GType boilerplate --- */ +/** + * G_DEFINE_TYPE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words + * separated by '_'. + * @T_P: The #GType of the parent type. + * + * A convenience macro for type implementations, which declares a + * class initialization function, an instance initialization function (see #GTypeInfo for information about + * these) and a static variable named @t_n_parent_class pointing to the parent class. Furthermore, it defines + * a *_get_type() function. See G_DEFINE_TYPE_EXTENDED() for an example. + * + * Since: 2.4 + */ +#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {}) +/** + * G_DEFINE_TYPE_WITH_CODE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type in lowercase, with words separated by '_'. + * @T_P: The #GType of the parent type. + * @_C_: Custom code that gets inserted in the *_get_type() function. + * + * A convenience macro for type implementations. + * Similar to G_DEFINE_TYPE(), but allows you to insert custom code into the + * *_get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE(). + * See G_DEFINE_TYPE_EXTENDED() for an example. + * + * Since: 2.4 + */ +#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() +/** + * G_DEFINE_ABSTRACT_TYPE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words + * separated by '_'. + * @T_P: The #GType of the parent type. + * + * A convenience macro for type implementations. + * Similar to G_DEFINE_TYPE(), but defines an abstract type. + * See G_DEFINE_TYPE_EXTENDED() for an example. + * + * Since: 2.4 + */ +#define G_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {}) +/** + * G_DEFINE_ABSTRACT_TYPE_WITH_CODE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words + * separated by '_'. + * @T_P: The #GType of the parent type. + * @_C_: Custom code that gets inserted in the @type_name_get_type() function. + * + * A convenience macro for type implementations. + * Similar to G_DEFINE_TYPE_WITH_CODE(), but defines an abstract type and allows you to + * insert custom code into the *_get_type() function, e.g. interface implementations + * via G_IMPLEMENT_INTERFACE(). See G_DEFINE_TYPE_EXTENDED() for an example. + * + * Since: 2.4 + */ +#define G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() +/** + * G_DEFINE_TYPE_EXTENDED: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words + * separated by '_'. + * @T_P: The #GType of the parent type. + * @_f_: #GTypeFlags to pass to g_type_register_static() + * @_C_: Custom code that gets inserted in the *_get_type() function. + * + * The most general convenience macro for type implementations, on which + * G_DEFINE_TYPE(), etc are based. + * + * |[ + * G_DEFINE_TYPE_EXTENDED (GtkGadget, + * gtk_gadget, + * GTK_TYPE_WIDGET, + * 0, + * G_IMPLEMENT_INTERFACE (TYPE_GIZMO, + * gtk_gadget_gizmo_init)); + * ]| + * expands to + * |[ + * static void gtk_gadget_init (GtkGadget *self); + * static void gtk_gadget_class_init (GtkGadgetClass *klass); + * static gpointer gtk_gadget_parent_class = NULL; + * static void gtk_gadget_class_intern_init (gpointer klass) + * { + * gtk_gadget_parent_class = g_type_class_peek_parent (klass); + * gtk_gadget_class_init ((GtkGadgetClass*) klass); + * } + * + * GType + * gtk_gadget_get_type (void) + * { + * static volatile gsize g_define_type_id__volatile = 0; + * if (g_once_init_enter (&g_define_type_id__volatile)) + * { + * GType g_define_type_id = + * g_type_register_static_simple (GTK_TYPE_WIDGET, + * g_intern_static_string ("GtkGadget"), + * sizeof (GtkGadgetClass), + * (GClassInitFunc) gtk_gadget_class_intern_init, + * sizeof (GtkGadget), + * (GInstanceInitFunc) gtk_gadget_init, + * (GTypeFlags) flags); + * { + * static const GInterfaceInfo g_implement_interface_info = { + * (GInterfaceInitFunc) gtk_gadget_gizmo_init + * }; + * g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info); + * } + * g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + * } + * return g_define_type_id__volatile; + * } + * ]| + * The only pieces which have to be manually provided are the definitions of + * the instance and class structure and the definitions of the instance and + * class init functions. + * + * Since: 2.4 + */ +#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() + +/** + * G_DEFINE_INTERFACE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the prerequisite type for the interface, or 0 + * (%G_TYPE_INVALID) for no prerequisite type. + * + * A convenience macro for #GTypeInterface definitions, which declares + * a default vtable initialization function and defines a *_get_type() + * function. + * + * The macro expects the interface initialization function to have the + * name t_n ## _default_init, and the interface + * structure to have the name TN ## Interface. + * + * Since: 2.24 + */ +#define G_DEFINE_INTERFACE(TN, t_n, T_P) G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, ;) + +/** + * G_DEFINE_INTERFACE_WITH_CODE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words separated by '_'. + * @T_P: The #GType of the prerequisite type for the interface, or 0 + * (%G_TYPE_INVALID) for no prerequisite type. + * @_C_: Custom code that gets inserted in the *_get_type() function. + * + * A convenience macro for #GTypeInterface definitions. Similar to + * G_DEFINE_INTERFACE(), but allows you to insert custom code into the + * *_get_type() function, e.g. additional interface implementations + * via G_IMPLEMENT_INTERFACE(), or additional prerequisite types. See + * G_DEFINE_TYPE_EXTENDED() for a similar example using + * G_DEFINE_TYPE_WITH_CODE(). + * + * Since: 2.24 + */ +#define G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TN, t_n, T_P) {_C_;} _G_DEFINE_INTERFACE_EXTENDED_END() + +/** + * G_IMPLEMENT_INTERFACE: + * @TYPE_IFACE: The #GType of the interface to add + * @iface_init: The interface init function + * + * A convenience macro to ease interface addition in the @_C_ section + * of G_DEFINE_TYPE_WITH_CODE() or G_DEFINE_ABSTRACT_TYPE_WITH_CODE(). + * See G_DEFINE_TYPE_EXTENDED() for an example. + * + * Note that this macro can only be used together with the G_DEFINE_TYPE_* + * macros, since it depends on variable names from those macros. + * + * Since: 2.4 + */ +#define G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \ + const GInterfaceInfo g_implement_interface_info = { \ + (GInterfaceInitFunc) iface_init, NULL, NULL \ + }; \ + g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \ +} + +#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \ +\ +static void type_name##_init (TypeName *self); \ +static void type_name##_class_init (TypeName##Class *klass); \ +static gpointer type_name##_parent_class = NULL; \ +static void type_name##_class_intern_init (gpointer klass) \ +{ \ + type_name##_parent_class = g_type_class_peek_parent (klass); \ + type_name##_class_init ((TypeName##Class*) klass); \ +} \ +\ +GType \ +type_name##_get_type (void) \ +{ \ + static volatile gsize g_define_type_id__volatile = 0; \ + if (g_once_init_enter (&g_define_type_id__volatile)) \ + { \ + GType g_define_type_id = \ + g_type_register_static_simple (TYPE_PARENT, \ + g_intern_static_string (#TypeName), \ + sizeof (TypeName##Class), \ + (GClassInitFunc) type_name##_class_intern_init, \ + sizeof (TypeName), \ + (GInstanceInitFunc) type_name##_init, \ + (GTypeFlags) flags); \ + { /* custom code follows */ +#define _G_DEFINE_TYPE_EXTENDED_END() \ + /* following custom code */ \ + } \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} /* closes type_name##_get_type() */ + +#define _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PREREQ) \ +\ +static void type_name##_default_init (TypeName##Interface *klass); \ +\ +GType \ +type_name##_get_type (void) \ +{ \ + static volatile gsize g_define_type_id__volatile = 0; \ + if (g_once_init_enter (&g_define_type_id__volatile)) \ + { \ + GType g_define_type_id = \ + g_type_register_static_simple (G_TYPE_INTERFACE, \ + g_intern_static_string (#TypeName), \ + sizeof (TypeName##Interface), \ + (GClassInitFunc)type_name##_default_init, \ + 0, \ + (GInstanceInitFunc)NULL, \ + (GTypeFlags) 0); \ + if (TYPE_PREREQ) \ + g_type_interface_add_prerequisite (g_define_type_id, TYPE_PREREQ); \ + { /* custom code follows */ +#define _G_DEFINE_INTERFACE_EXTENDED_END() \ + /* following custom code */ \ + } \ + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ + } \ + return g_define_type_id__volatile; \ +} /* closes type_name##_get_type() */ + +/* --- protected (for fundamental type implementations) --- */ +GTypePlugin* g_type_get_plugin (GType type); +GTypePlugin* g_type_interface_get_plugin (GType instance_type, + GType interface_type); +GType g_type_fundamental_next (void); +GType g_type_fundamental (GType type_id); +GTypeInstance* g_type_create_instance (GType type); +void g_type_free_instance (GTypeInstance *instance); + +void g_type_add_class_cache_func (gpointer cache_data, + GTypeClassCacheFunc cache_func); +void g_type_remove_class_cache_func (gpointer cache_data, + GTypeClassCacheFunc cache_func); +void g_type_class_unref_uncached (gpointer g_class); + +void g_type_add_interface_check (gpointer check_data, + GTypeInterfaceCheckFunc check_func); +void g_type_remove_interface_check (gpointer check_data, + GTypeInterfaceCheckFunc check_func); + +GTypeValueTable* g_type_value_table_peek (GType type); + + +/*< private >*/ +gboolean g_type_check_instance (GTypeInstance *instance) G_GNUC_PURE; +GTypeInstance* g_type_check_instance_cast (GTypeInstance *instance, + GType iface_type); +gboolean g_type_check_instance_is_a (GTypeInstance *instance, + GType iface_type) G_GNUC_PURE; +GTypeClass* g_type_check_class_cast (GTypeClass *g_class, + GType is_a_type); +gboolean g_type_check_class_is_a (GTypeClass *g_class, + GType is_a_type) G_GNUC_PURE; +gboolean g_type_check_is_value_type (GType type) G_GNUC_CONST; +gboolean g_type_check_value (GValue *value) G_GNUC_PURE; +gboolean g_type_check_value_holds (GValue *value, + GType type) G_GNUC_PURE; +gboolean g_type_test_flags (GType type, + guint flags) G_GNUC_CONST; + + +/* --- debugging functions --- */ +G_CONST_RETURN gchar* g_type_name_from_instance (GTypeInstance *instance); +G_CONST_RETURN gchar* g_type_name_from_class (GTypeClass *g_class); + + +/* --- internal functions --- */ +G_GNUC_INTERNAL void g_value_c_init (void); /* sync with gvalue.c */ +G_GNUC_INTERNAL void g_value_types_init (void); /* sync with gvaluetypes.c */ +G_GNUC_INTERNAL void g_enum_types_init (void); /* sync with genums.c */ +G_GNUC_INTERNAL void g_param_type_init (void); /* sync with gparam.c */ +G_GNUC_INTERNAL void g_boxed_type_init (void); /* sync with gboxed.c */ +G_GNUC_INTERNAL void g_object_type_init (void); /* sync with gobject.c */ +G_GNUC_INTERNAL void g_param_spec_types_init (void); /* sync with gparamspecs.c */ +G_GNUC_INTERNAL void g_value_transforms_init (void); /* sync with gvaluetransform.c */ +G_GNUC_INTERNAL void g_signal_init (void); /* sync with gsignal.c */ + + +/* --- implementation bits --- */ +#ifndef G_DISABLE_CAST_CHECKS +# define _G_TYPE_CIC(ip, gt, ct) \ + ((ct*) g_type_check_instance_cast ((GTypeInstance*) ip, gt)) +# define _G_TYPE_CCC(cp, gt, ct) \ + ((ct*) g_type_check_class_cast ((GTypeClass*) cp, gt)) +#else /* G_DISABLE_CAST_CHECKS */ +# define _G_TYPE_CIC(ip, gt, ct) ((ct*) ip) +# define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp) +#endif /* G_DISABLE_CAST_CHECKS */ +#define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip)) +#define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl)) +#define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class)) +#define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt)) +#ifdef __GNUC__ +# define _G_TYPE_CIT(ip, gt) (G_GNUC_EXTENSION ({ \ + GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \ + if (!__inst) \ + __r = FALSE; \ + else if (__inst->g_class && __inst->g_class->g_type == __t) \ + __r = TRUE; \ + else \ + __r = g_type_check_instance_is_a (__inst, __t); \ + __r; \ +})) +# define _G_TYPE_CCT(cp, gt) (G_GNUC_EXTENSION ({ \ + GTypeClass *__class = (GTypeClass*) cp; GType __t = gt; gboolean __r; \ + if (!__class) \ + __r = FALSE; \ + else if (__class->g_type == __t) \ + __r = TRUE; \ + else \ + __r = g_type_check_class_is_a (__class, __t); \ + __r; \ +})) +# define _G_TYPE_CVH(vl, gt) (G_GNUC_EXTENSION ({ \ + GValue *__val = (GValue*) vl; GType __t = gt; gboolean __r; \ + if (!__val) \ + __r = FALSE; \ + else if (__val->g_type == __t) \ + __r = TRUE; \ + else \ + __r = g_type_check_value_holds (__val, __t); \ + __r; \ +})) +#else /* !__GNUC__ */ +# define _G_TYPE_CIT(ip, gt) (g_type_check_instance_is_a ((GTypeInstance*) ip, gt)) +# define _G_TYPE_CCT(cp, gt) (g_type_check_class_is_a ((GTypeClass*) cp, gt)) +# define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt)) +#endif /* !__GNUC__ */ +/** + * G_TYPE_FLAG_RESERVED_ID_BIT: + * + * A bit in the type number that's supposed to be left untouched. + */ +#define G_TYPE_FLAG_RESERVED_ID_BIT ((GType) (1 << 0)) +extern GTypeDebugFlags _g_type_debug_flags; + +G_END_DECLS + +#endif /* __G_TYPE_H__ */ diff --git a/gobject/gtypemodule.c b/gobject/gtypemodule.c new file mode 100644 index 0000000..1ba64ad --- /dev/null +++ b/gobject/gtypemodule.c @@ -0,0 +1,586 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "gtypeplugin.h" +#include "gtypemodule.h" +#include "gobjectalias.h" + + +/** + * SECTION:gtypemodule + * @short_description: Type loading modules + * @see_also: + * + * #GTypePlugin + * The abstract type loader interface. + * + * + * #GModule + * Portable mechanism for dynamically loaded modules. + * + * + * @title: GTypeModule + * + * #GTypeModule provides a simple implementation of the #GTypePlugin + * interface. The model of #GTypeModule is a dynamically loaded module + * which implements some number of types and interface + * implementations. When the module is loaded, it registers its types + * and interfaces using g_type_module_register_type() and + * g_type_module_add_interface(). As long as any instances of these + * types and interface implementations are in use, the module is kept + * loaded. When the types and interfaces are gone, the module may be + * unloaded. If the types and interfaces become used again, the module + * will be reloaded. Note that the last unref can not happen in module + * code, since that would lead to the caller's code being unloaded before + * g_object_unref() returns to it. + * + * Keeping track of whether the module should be loaded or not is done by + * using a use count - it starts at zero, and whenever it is greater than + * zero, the module is loaded. The use count is maintained internally by + * the type system, but also can be explicitly controlled by + * g_type_module_use() and g_type_module_unuse(). Typically, when loading + * a module for the first type, g_type_module_use() will be used to load + * it so that it can initialize its types. At some later point, when the + * module no longer needs to be loaded except for the type + * implementations it contains, g_type_module_unuse() is called. + * + * #GTypeModule does not actually provide any implementation of module + * loading and unloading. To create a particular module type you must + * derive from #GTypeModule and implement the load and unload functions + * in #GTypeModuleClass. + */ + + +typedef struct _ModuleTypeInfo ModuleTypeInfo; +typedef struct _ModuleInterfaceInfo ModuleInterfaceInfo; + +struct _ModuleTypeInfo +{ + gboolean loaded; + GType type; + GType parent_type; + GTypeInfo info; +}; + +struct _ModuleInterfaceInfo +{ + gboolean loaded; + GType instance_type; + GType interface_type; + GInterfaceInfo info; +}; + +static void g_type_module_use_plugin (GTypePlugin *plugin); +static void g_type_module_complete_type_info (GTypePlugin *plugin, + GType g_type, + GTypeInfo *info, + GTypeValueTable *value_table); +static void g_type_module_complete_interface_info (GTypePlugin *plugin, + GType instance_type, + GType interface_type, + GInterfaceInfo *info); + +static gpointer parent_class = NULL; + +static void +g_type_module_dispose (GObject *object) +{ + GTypeModule *module = G_TYPE_MODULE (object); + + if (module->type_infos || module->interface_infos) + { + g_warning (G_STRLOC ": unsolicitated invocation of g_object_dispose() on GTypeModule"); + + g_object_ref (object); + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +g_type_module_finalize (GObject *object) +{ + GTypeModule *module = G_TYPE_MODULE (object); + + g_free (module->name); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +g_type_module_class_init (GTypeModuleClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (class)); + + gobject_class->dispose = g_type_module_dispose; + gobject_class->finalize = g_type_module_finalize; +} + +static void +g_type_module_iface_init (GTypePluginClass *iface) +{ + iface->use_plugin = g_type_module_use_plugin; + iface->unuse_plugin = (void (*) (GTypePlugin *))g_type_module_unuse; + iface->complete_type_info = g_type_module_complete_type_info; + iface->complete_interface_info = g_type_module_complete_interface_info; +} + +GType +g_type_module_get_type (void) +{ + static GType type_module_type = 0; + + if (!type_module_type) + { + static const GTypeInfo type_module_info = { + sizeof (GTypeModuleClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) g_type_module_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GTypeModule), + 0, /* n_preallocs */ + NULL, /* instance_init */ + }; + static const GInterfaceInfo iface_info = { + (GInterfaceInitFunc) g_type_module_iface_init, + NULL, /* interface_finalize */ + NULL, /* interface_data */ + }; + + type_module_type = g_type_register_static (G_TYPE_OBJECT, g_intern_static_string ("GTypeModule"), &type_module_info, G_TYPE_FLAG_ABSTRACT); + + g_type_add_interface_static (type_module_type, G_TYPE_TYPE_PLUGIN, &iface_info); + } + + return type_module_type; +} + +/** + * g_type_module_set_name: + * @module: a #GTypeModule. + * @name: a human-readable name to use in error messages. + * + * Sets the name for a #GTypeModule + */ +void +g_type_module_set_name (GTypeModule *module, + const gchar *name) +{ + g_return_if_fail (G_IS_TYPE_MODULE (module)); + + g_free (module->name); + module->name = g_strdup (name); +} + +static ModuleTypeInfo * +g_type_module_find_type_info (GTypeModule *module, + GType type) +{ + GSList *tmp_list = module->type_infos; + while (tmp_list) + { + ModuleTypeInfo *type_info = tmp_list->data; + if (type_info->type == type) + return type_info; + + tmp_list = tmp_list->next; + } + + return NULL; +} + +static ModuleInterfaceInfo * +g_type_module_find_interface_info (GTypeModule *module, + GType instance_type, + GType interface_type) +{ + GSList *tmp_list = module->interface_infos; + while (tmp_list) + { + ModuleInterfaceInfo *interface_info = tmp_list->data; + if (interface_info->instance_type == instance_type && + interface_info->interface_type == interface_type) + return interface_info; + + tmp_list = tmp_list->next; + } + + return NULL; +} + +/** + * g_type_module_use: + * @module: a #GTypeModule + * + * Increases the use count of a #GTypeModule by one. If the + * use count was zero before, the plugin will be loaded. + * If loading the plugin fails, the use count is reset to + * its prior value. + * + * Returns: %FALSE if the plugin needed to be loaded and + * loading the plugin failed. + */ +gboolean +g_type_module_use (GTypeModule *module) +{ + g_return_val_if_fail (G_IS_TYPE_MODULE (module), FALSE); + + module->use_count++; + if (module->use_count == 1) + { + GSList *tmp_list; + + if (!G_TYPE_MODULE_GET_CLASS (module)->load (module)) + { + module->use_count--; + return FALSE; + } + + tmp_list = module->type_infos; + while (tmp_list) + { + ModuleTypeInfo *type_info = tmp_list->data; + if (!type_info->loaded) + { + g_warning ("plugin '%s' failed to register type '%s'\n", + module->name ? module->name : "(unknown)", + g_type_name (type_info->type)); + module->use_count--; + return FALSE; + } + + tmp_list = tmp_list->next; + } + } + + return TRUE; +} + +/** + * g_type_module_unuse: + * @module: a #GTypeModule + * + * Decreases the use count of a #GTypeModule by one. If the + * result is zero, the module will be unloaded. (However, the + * #GTypeModule will not be freed, and types associated with the + * #GTypeModule are not unregistered. Once a #GTypeModule is + * initialized, it must exist forever.) + */ +void +g_type_module_unuse (GTypeModule *module) +{ + g_return_if_fail (G_IS_TYPE_MODULE (module)); + g_return_if_fail (module->use_count > 0); + + module->use_count--; + + if (module->use_count == 0) + { + GSList *tmp_list; + + G_TYPE_MODULE_GET_CLASS (module)->unload (module); + + tmp_list = module->type_infos; + while (tmp_list) + { + ModuleTypeInfo *type_info = tmp_list->data; + type_info->loaded = FALSE; + + tmp_list = tmp_list->next; + } + } +} + +static void +g_type_module_use_plugin (GTypePlugin *plugin) +{ + GTypeModule *module = G_TYPE_MODULE (plugin); + + if (!g_type_module_use (module)) + { + g_warning ("Fatal error - Could not reload previously loaded plugin '%s'\n", + module->name ? module->name : "(unknown)"); + exit (1); + } +} + +static void +g_type_module_complete_type_info (GTypePlugin *plugin, + GType g_type, + GTypeInfo *info, + GTypeValueTable *value_table) +{ + GTypeModule *module = G_TYPE_MODULE (plugin); + ModuleTypeInfo *module_type_info = g_type_module_find_type_info (module, g_type); + + *info = module_type_info->info; + + if (module_type_info->info.value_table) + *value_table = *module_type_info->info.value_table; +} + +static void +g_type_module_complete_interface_info (GTypePlugin *plugin, + GType instance_type, + GType interface_type, + GInterfaceInfo *info) +{ + GTypeModule *module = G_TYPE_MODULE (plugin); + ModuleInterfaceInfo *module_interface_info = g_type_module_find_interface_info (module, instance_type, interface_type); + + *info = module_interface_info->info; +} + +/** + * g_type_module_register_type: + * @module: a #GTypeModule + * @parent_type: the type for the parent class + * @type_name: name for the type + * @type_info: type information structure + * @flags: flags field providing details about the type + * + * Looks up or registers a type that is implemented with a particular + * type plugin. If a type with name @type_name was previously registered, + * the #GType identifier for the type is returned, otherwise the type + * is newly registered, and the resulting #GType identifier returned. + * + * When reregistering a type (typically because a module is unloaded + * then reloaded, and reinitialized), @module and @parent_type must + * be the same as they were previously. + * + * As long as any instances of the type exist, the type plugin will + * not be unloaded. + * + * Returns: the new or existing type ID + */ +GType +g_type_module_register_type (GTypeModule *module, + GType parent_type, + const gchar *type_name, + const GTypeInfo *type_info, + GTypeFlags flags) +{ + ModuleTypeInfo *module_type_info = NULL; + GType type; + + g_return_val_if_fail (module != NULL, 0); + g_return_val_if_fail (type_name != NULL, 0); + g_return_val_if_fail (type_info != NULL, 0); + + type = g_type_from_name (type_name); + if (type) + { + GTypePlugin *old_plugin = g_type_get_plugin (type); + + if (old_plugin != G_TYPE_PLUGIN (module)) + { + g_warning ("Two different plugins tried to register '%s'.", type_name); + return 0; + } + } + + if (type) + { + module_type_info = g_type_module_find_type_info (module, type); + + if (module_type_info->parent_type != parent_type) + { + const gchar *parent_type_name = g_type_name (parent_type); + + g_warning ("Type '%s' recreated with different parent type.\n" + "(was '%s', now '%s')", type_name, + g_type_name (module_type_info->parent_type), + parent_type_name ? parent_type_name : "(unknown)"); + return 0; + } + + if (module_type_info->info.value_table) + g_free ((GTypeValueTable *) module_type_info->info.value_table); + } + else + { + module_type_info = g_new (ModuleTypeInfo, 1); + + module_type_info->parent_type = parent_type; + module_type_info->type = g_type_register_dynamic (parent_type, type_name, G_TYPE_PLUGIN (module), flags); + + module->type_infos = g_slist_prepend (module->type_infos, module_type_info); + } + + module_type_info->loaded = TRUE; + module_type_info->info = *type_info; + if (type_info->value_table) + module_type_info->info.value_table = g_memdup (type_info->value_table, + sizeof (GTypeValueTable)); + + return module_type_info->type; +} + +/** + * g_type_module_add_interface: + * @module: a #GTypeModule + * @instance_type: type to which to add the interface. + * @interface_type: interface type to add + * @interface_info: type information structure + * + * Registers an additional interface for a type, whose interface lives + * in the given type plugin. If the interface was already registered + * for the type in this plugin, nothing will be done. + * + * As long as any instances of the type exist, the type plugin will + * not be unloaded. + */ +void +g_type_module_add_interface (GTypeModule *module, + GType instance_type, + GType interface_type, + const GInterfaceInfo *interface_info) +{ + ModuleInterfaceInfo *module_interface_info = NULL; + + g_return_if_fail (module != NULL); + g_return_if_fail (interface_info != NULL); + + if (g_type_is_a (instance_type, interface_type)) + { + GTypePlugin *old_plugin = g_type_interface_get_plugin (instance_type, + interface_type); + + if (!old_plugin) + { + g_warning ("Interface '%s' for '%s' was previously registered statically or for a parent type.", + g_type_name (interface_type), g_type_name (instance_type)); + return; + } + else if (old_plugin != G_TYPE_PLUGIN (module)) + { + g_warning ("Two different plugins tried to register interface '%s' for '%s'.", + g_type_name (interface_type), g_type_name (instance_type)); + return; + } + + module_interface_info = g_type_module_find_interface_info (module, instance_type, interface_type); + + g_assert (module_interface_info); + } + else + { + module_interface_info = g_new (ModuleInterfaceInfo, 1); + + module_interface_info->instance_type = instance_type; + module_interface_info->interface_type = interface_type; + + g_type_add_interface_dynamic (instance_type, interface_type, G_TYPE_PLUGIN (module)); + + module->interface_infos = g_slist_prepend (module->interface_infos, module_interface_info); + } + + module_interface_info->loaded = TRUE; + module_interface_info->info = *interface_info; +} + +/** + * g_type_module_register_enum: + * @module: a #GTypeModule + * @name: name for the type + * @const_static_values: an array of #GEnumValue structs for the + * possible enumeration values. The array is + * terminated by a struct with all members being + * 0. + * + * Looks up or registers an enumeration that is implemented with a particular + * type plugin. If a type with name @type_name was previously registered, + * the #GType identifier for the type is returned, otherwise the type + * is newly registered, and the resulting #GType identifier returned. + * + * As long as any instances of the type exist, the type plugin will + * not be unloaded. + * + * Since: 2.6 + * + * Returns: the new or existing type ID + */ +GType +g_type_module_register_enum (GTypeModule *module, + const gchar *name, + const GEnumValue *const_static_values) +{ + GTypeInfo enum_type_info = { 0, }; + + g_return_val_if_fail (G_IS_TYPE_MODULE (module), 0); + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (const_static_values != NULL, 0); + + g_enum_complete_type_info (G_TYPE_ENUM, + &enum_type_info, const_static_values); + + return g_type_module_register_type (G_TYPE_MODULE (module), + G_TYPE_ENUM, name, &enum_type_info, 0); +} + +/** + * g_type_module_register_flags: + * @module: a #GTypeModule + * @name: name for the type + * @const_static_values: an array of #GFlagsValue structs for the + * possible flags values. The array is + * terminated by a struct with all members being + * 0. + * + * Looks up or registers a flags type that is implemented with a particular + * type plugin. If a type with name @type_name was previously registered, + * the #GType identifier for the type is returned, otherwise the type + * is newly registered, and the resulting #GType identifier returned. + * + * As long as any instances of the type exist, the type plugin will + * not be unloaded. + * + * Since: 2.6 + * + * Returns: the new or existing type ID + */ +GType +g_type_module_register_flags (GTypeModule *module, + const gchar *name, + const GFlagsValue *const_static_values) +{ + GTypeInfo flags_type_info = { 0, }; + + g_return_val_if_fail (G_IS_TYPE_MODULE (module), 0); + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (const_static_values != NULL, 0); + + g_flags_complete_type_info (G_TYPE_FLAGS, + &flags_type_info, const_static_values); + + return g_type_module_register_type (G_TYPE_MODULE (module), + G_TYPE_FLAGS, name, &flags_type_info, 0); +} + + +#define __G_TYPE_MODULE_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gtypemodule.h b/gobject/gtypemodule.h new file mode 100644 index 0000000..464531c --- /dev/null +++ b/gobject/gtypemodule.h @@ -0,0 +1,263 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TYPE_MODULE_H__ +#define __G_TYPE_MODULE_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GTypeModule GTypeModule; +typedef struct _GTypeModuleClass GTypeModuleClass; + +#define G_TYPE_TYPE_MODULE (g_type_module_get_type ()) +#define G_TYPE_MODULE(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), G_TYPE_TYPE_MODULE, GTypeModule)) +#define G_TYPE_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_TYPE_MODULE, GTypeModuleClass)) +#define G_IS_TYPE_MODULE(module) (G_TYPE_CHECK_INSTANCE_TYPE ((module), G_TYPE_TYPE_MODULE)) +#define G_IS_TYPE_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_TYPE_MODULE)) +#define G_TYPE_MODULE_GET_CLASS(module) (G_TYPE_INSTANCE_GET_CLASS ((module), G_TYPE_TYPE_MODULE, GTypeModuleClass)) + +/** + * GTypeModule: + * @name: the name of the module + * + * The members of the GTypeModule structure should not + * be accessed directly, except for the @name field. + */ +struct _GTypeModule +{ + GObject parent_instance; + + guint use_count; + GSList *type_infos; + GSList *interface_infos; + + /*< public >*/ + gchar *name; +}; + +/** + * GTypeModuleClass: + * @parent_class: the parent class + * @load: loads the module and registers one or more types using + * g_type_module_register_type(). + * @unload: unloads the module + * + * In order to implement dynamic loading of types based on #GTypeModule, + * the @load and @unload functions in #GTypeModuleClass must be implemented. + */ +struct _GTypeModuleClass +{ + GObjectClass parent_class; + + /*< public >*/ + gboolean (* load) (GTypeModule *module); + void (* unload) (GTypeModule *module); + + /*< private >*/ + /* Padding for future expansion */ + void (*reserved1) (void); + void (*reserved2) (void); + void (*reserved3) (void); + void (*reserved4) (void); +}; + +/** + * G_DEFINE_DYNAMIC_TYPE: + * @TN: The name of the new type, in Camel case. + * @t_n: The name of the new type, in lowercase, with words + * separated by '_'. + * @T_P: The #GType of the parent type. + * + * A convenience macro for dynamic type implementations, which declares a + * class initialization function, an instance initialization function (see + * #GTypeInfo for information about these) and a static variable named + * @t_n_parent_class pointing to the parent class. Furthermore, + * it defines a *_get_type() and a static + * *_register_type() function for use in your + * module_init(). + * See G_DEFINE_DYNAMIC_TYPE_EXTENDED() for an example. + * + * Since: 2.14 + */ +#define G_DEFINE_DYNAMIC_TYPE(TN, t_n, T_P) G_DEFINE_DYNAMIC_TYPE_EXTENDED (TN, t_n, T_P, 0, {}) +/** + * G_DEFINE_DYNAMIC_TYPE_EXTENDED: + * @TypeName: The name of the new type, in Camel case. + * @type_name: The name of the new type, in lowercase, with words + * separated by '_'. + * @TYPE_PARENT: The #GType of the parent type. + * @flags: #GTypeFlags to pass to g_type_module_register_type() + * @CODE: Custom code that gets inserted in the *_get_type() function. + * + * A more general version of G_DEFINE_DYNAMIC_TYPE() which + * allows to specify #GTypeFlags and custom code. + * + * |[ + * G_DEFINE_DYNAMIC_TYPE_EXTENDED (GtkGadget, + * gtk_gadget, + * GTK_TYPE_THING, + * 0, + * G_IMPLEMENT_INTERFACE_DYNAMIC (TYPE_GIZMO, + * gtk_gadget_gizmo_init)); + * ]| + * expands to + * |[ + * static void gtk_gadget_init (GtkGadget *self); + * static void gtk_gadget_class_init (GtkGadgetClass *klass); + * static void gtk_gadget_class_finalize (GtkGadgetClass *klass); + * + * static gpointer gtk_gadget_parent_class = NULL; + * static GType gtk_gadget_type_id = 0; + * + * static void gtk_gadget_class_intern_init (gpointer klass) + * { + * gtk_gadget_parent_class = g_type_class_peek_parent (klass); + * gtk_gadget_class_init ((GtkGadgetClass*) klass); + * } + * + * GType + * gtk_gadget_get_type (void) + * { + * return gtk_gadget_type_id; + * } + * + * static void + * gtk_gadget_register_type (GTypeModule *type_module) + * { + * const GTypeInfo g_define_type_info = { + * sizeof (GtkGadgetClass), + * (GBaseInitFunc) NULL, + * (GBaseFinalizeFunc) NULL, + * (GClassInitFunc) gtk_gadget_class_intern_init, + * (GClassFinalizeFunc) gtk_gadget_class_finalize, + * NULL, // class_data + * sizeof (GtkGadget), + * 0, // n_preallocs + * (GInstanceInitFunc) gtk_gadget_init, + * NULL // value_table + * }; + * gtk_gadget_type_id = g_type_module_register_type (type_module, + * GTK_TYPE_THING, + * GtkGadget, + * &g_define_type_info, + * (GTypeFlags) flags); + * { + * const GInterfaceInfo g_implement_interface_info = { + * (GInterfaceInitFunc) gtk_gadget_gizmo_init + * }; + * g_type_module_add_interface (type_module, g_define_type_id, TYPE_GIZMO, &g_implement_interface_info); + * } + * } + * ]| + * + * Since: 2.14 + */ +#define G_DEFINE_DYNAMIC_TYPE_EXTENDED(TypeName, type_name, TYPE_PARENT, flags, CODE) \ +static void type_name##_init (TypeName *self); \ +static void type_name##_class_init (TypeName##Class *klass); \ +static void type_name##_class_finalize (TypeName##Class *klass); \ +static gpointer type_name##_parent_class = NULL; \ +static GType type_name##_type_id = 0; \ +static void type_name##_class_intern_init (gpointer klass) \ +{ \ + type_name##_parent_class = g_type_class_peek_parent (klass); \ + type_name##_class_init ((TypeName##Class*) klass); \ +} \ +GType \ +type_name##_get_type (void) \ +{ \ + return type_name##_type_id; \ +} \ +static void \ +type_name##_register_type (GTypeModule *type_module) \ +{ \ + GType g_define_type_id; \ + const GTypeInfo g_define_type_info = { \ + sizeof (TypeName##Class), \ + (GBaseInitFunc) NULL, \ + (GBaseFinalizeFunc) NULL, \ + (GClassInitFunc) type_name##_class_intern_init, \ + (GClassFinalizeFunc) type_name##_class_finalize, \ + NULL, /* class_data */ \ + sizeof (TypeName), \ + 0, /* n_preallocs */ \ + (GInstanceInitFunc) type_name##_init, \ + NULL /* value_table */ \ + }; \ + type_name##_type_id = g_type_module_register_type (type_module, \ + TYPE_PARENT, \ + #TypeName, \ + &g_define_type_info, \ + (GTypeFlags) flags); \ + g_define_type_id = type_name##_type_id; \ + { CODE ; } \ +} + +/** + * G_IMPLEMENT_INTERFACE_DYNAMIC: + * @TYPE_IFACE: The #GType of the interface to add + * @iface_init: The interface init function + * + * A convenience macro to ease interface addition in the @_C_ section + * of G_DEFINE_DYNAMIC_TYPE_EXTENDED(). See G_DEFINE_DYNAMIC_TYPE_EXTENDED() + * for an example. + * + * Note that this macro can only be used together with the + * G_DEFINE_DYNAMIC_TYPE_EXTENDED macros, since it depends on variable + * names from that macro. + * + * Since: 2.24 + */ +#define G_IMPLEMENT_INTERFACE_DYNAMIC(TYPE_IFACE, iface_init) { \ + const GInterfaceInfo g_implement_interface_info = { \ + (GInterfaceInitFunc) iface_init, NULL, NULL \ + }; \ + g_type_module_add_interface (type_module, g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \ +} + +GType g_type_module_get_type (void) G_GNUC_CONST; +gboolean g_type_module_use (GTypeModule *module); +void g_type_module_unuse (GTypeModule *module); +void g_type_module_set_name (GTypeModule *module, + const gchar *name); +GType g_type_module_register_type (GTypeModule *module, + GType parent_type, + const gchar *type_name, + const GTypeInfo *type_info, + GTypeFlags flags); +void g_type_module_add_interface (GTypeModule *module, + GType instance_type, + GType interface_type, + const GInterfaceInfo *interface_info); +GType g_type_module_register_enum (GTypeModule *module, + const gchar *name, + const GEnumValue *const_static_values); +GType g_type_module_register_flags (GTypeModule *module, + const gchar *name, + const GFlagsValue *const_static_values); + +G_END_DECLS + +#endif /* __G_TYPE_MODULE_H__ */ diff --git a/gobject/gtypeplugin.c b/gobject/gtypeplugin.c new file mode 100644 index 0000000..3dbd13e --- /dev/null +++ b/gobject/gtypeplugin.c @@ -0,0 +1,210 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "gtypeplugin.h" +#include "gobjectalias.h" + + +/** + * SECTION:gtypeplugin + * @short_description: An interface for dynamically loadable types + * @see_also: #GTypeModule and g_type_register_dynamic(). + * @title: GTypePlugin + * + * The GObject type system supports dynamic loading of types. The + * #GTypePlugin interface is used to handle the lifecycle of + * dynamically loaded types. It goes as follows: + * + * + * + * The type is initially introduced (usually upon loading the module + * the first time, or by your main application that knows what modules + * introduces what types), like this: + * |[ + * new_type_id = g_type_register_dynamic (parent_type_id, + * "TypeName", + * new_type_plugin, + * type_flags); + * ]| + * where new_type_plugin is an implementation of the + * #GTypePlugin interface. + * + * + * The type's implementation is referenced, e.g. through + * g_type_class_ref() or through g_type_create_instance() (this is + * being called by g_object_new()) or through one of the above done on + * a type derived from new_type_id. + * + * + * This causes the type system to load the type's implementation by calling + * g_type_plugin_use() and g_type_plugin_complete_type_info() on + * new_type_plugin. + * + * + * At some point the type's implementation isn't required anymore, e.g. after + * g_type_class_unref() or g_type_free_instance() (called when the reference + * count of an instance drops to zero). + * + * + * This causes the type system to throw away the information retrieved from + * g_type_plugin_complete_type_info() and then it calls + * g_type_plugin_unuse() on new_type_plugin. + * + * + * Things may repeat from the second step. + * + * + * + * So basically, you need to implement a #GTypePlugin type that + * carries a use_count, once use_count goes from zero to one, you need + * to load the implementation to successfully handle the upcoming + * g_type_plugin_complete_type_info() call. Later, maybe after + * succeeding use/unuse calls, once use_count drops to zero, you can + * unload the implementation again. The type system makes sure to call + * g_type_plugin_use() and g_type_plugin_complete_type_info() again + * when the type is needed again. + * + * #GTypeModule is an implementation of #GTypePlugin that already + * implements most of this except for the actual module loading and + * unloading. It even handles multiple registered types per module. + */ + + +/* --- functions --- */ +GType +g_type_plugin_get_type (void) +{ + static GType type_plugin_type = 0; + + if (!type_plugin_type) + { + static const GTypeInfo type_plugin_info = { + sizeof (GTypePluginClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + }; + + type_plugin_type = g_type_register_static (G_TYPE_INTERFACE, g_intern_static_string ("GTypePlugin"), &type_plugin_info, 0); + } + + return type_plugin_type; +} + +/** + * g_type_plugin_use: + * @plugin: a #GTypePlugin + * + * Calls the @use_plugin function from the #GTypePluginClass of + * @plugin. There should be no need to use this function outside of + * the GObject type system itself. + */ +void +g_type_plugin_use (GTypePlugin *plugin) +{ + GTypePluginClass *iface; + + g_return_if_fail (G_IS_TYPE_PLUGIN (plugin)); + + iface = G_TYPE_PLUGIN_GET_CLASS (plugin); + iface->use_plugin (plugin); +} + +/** + * g_type_plugin_unuse: + * @plugin: a #GTypePlugin + * + * Calls the @unuse_plugin function from the #GTypePluginClass of + * @plugin. There should be no need to use this function outside of + * the GObject type system itself. + */ +void +g_type_plugin_unuse (GTypePlugin *plugin) +{ + GTypePluginClass *iface; + + g_return_if_fail (G_IS_TYPE_PLUGIN (plugin)); + + iface = G_TYPE_PLUGIN_GET_CLASS (plugin); + iface->unuse_plugin (plugin); +} + +/** + * g_type_plugin_complete_type_info: + * @plugin: a #GTypePlugin + * @g_type: the #GType whose info is completed + * @info: the #GTypeInfo struct to fill in + * @value_table: the #GTypeValueTable to fill in + * + * Calls the @complete_type_info function from the #GTypePluginClass of @plugin. + * There should be no need to use this function outside of the GObject + * type system itself. + */ +void +g_type_plugin_complete_type_info (GTypePlugin *plugin, + GType g_type, + GTypeInfo *info, + GTypeValueTable *value_table) +{ + GTypePluginClass *iface; + + g_return_if_fail (G_IS_TYPE_PLUGIN (plugin)); + g_return_if_fail (info != NULL); + g_return_if_fail (value_table != NULL); + + iface = G_TYPE_PLUGIN_GET_CLASS (plugin); + iface->complete_type_info (plugin, + g_type, + info, + value_table); +} + +/** + * g_type_plugin_complete_interface_info: + * @plugin: the #GTypePlugin + * @instance_type: the #GType of an instantiable type to which the interface + * is added + * @interface_type: the #GType of the interface whose info is completed + * @info: the #GInterfaceInfo to fill in + * + * Calls the @complete_interface_info function from the + * #GTypePluginClass of @plugin. There should be no need to use this + * function outside of the GObject type system itself. + */ +void +g_type_plugin_complete_interface_info (GTypePlugin *plugin, + GType instance_type, + GType interface_type, + GInterfaceInfo *info) +{ + GTypePluginClass *iface; + + g_return_if_fail (G_IS_TYPE_PLUGIN (plugin)); + g_return_if_fail (info != NULL); + + iface = G_TYPE_PLUGIN_GET_CLASS (plugin); + iface->complete_interface_info (plugin, + instance_type, + interface_type, + info); +} + +#define __G_TYPE_PLUGIN_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gtypeplugin.h b/gobject/gtypeplugin.h new file mode 100644 index 0000000..ff87a70 --- /dev/null +++ b/gobject/gtypeplugin.h @@ -0,0 +1,134 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_TYPE_PLUGIN_H__ +#define __G_TYPE_PLUGIN_H__ + +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +#define G_TYPE_TYPE_PLUGIN (g_type_plugin_get_type ()) +#define G_TYPE_PLUGIN(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TYPE_PLUGIN, GTypePlugin)) +#define G_TYPE_PLUGIN_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), G_TYPE_TYPE_PLUGIN, GTypePluginClass)) +#define G_IS_TYPE_PLUGIN(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TYPE_PLUGIN)) +#define G_IS_TYPE_PLUGIN_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), G_TYPE_TYPE_PLUGIN)) +#define G_TYPE_PLUGIN_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TYPE_PLUGIN, GTypePluginClass)) + + +/* --- typedefs & structures --- */ +typedef struct _GTypePluginClass GTypePluginClass; +/** + * GTypePluginUse: + * @plugin: the #GTypePlugin whose use count should be increased + * + * The type of the @use_plugin function of #GTypePluginClass, which gets called + * to increase the use count of @plugin. + */ +typedef void (*GTypePluginUse) (GTypePlugin *plugin); +/** + * GTypePluginUnuse: + * @plugin: the #GTypePlugin whose use count should be decreased + * + * The type of the @unuse_plugin function of #GTypePluginClass. + */ +typedef void (*GTypePluginUnuse) (GTypePlugin *plugin); +/** + * GTypePluginCompleteTypeInfo: + * @plugin: the #GTypePlugin + * @g_type: the #GType whose info is completed + * @info: the #GTypeInfo struct to fill in + * @value_table: the #GTypeValueTable to fill in + * + * The type of the @complete_type_info function of #GTypePluginClass. + */ +typedef void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin, + GType g_type, + GTypeInfo *info, + GTypeValueTable *value_table); +/** + * GTypePluginCompleteInterfaceInfo: + * @plugin: the #GTypePlugin + * @instance_type: the #GType of an instantiable type to which the interface + * is added + * @interface_type: the #GType of the interface whose info is completed + * @info: the #GInterfaceInfo to fill in + * + * The type of the @complete_interface_info function of #GTypePluginClass. + */ +typedef void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin, + GType instance_type, + GType interface_type, + GInterfaceInfo *info); +/** + * GTypePlugin: + * + * The GTypePlugin typedef is used as a placeholder + * for objects that implement the GTypePlugin + * interface. + */ +/** + * GTypePluginClass: + * @use_plugin: Increases the use count of the plugin. + * @unuse_plugin: Decreases the use count of the plugin. + * @complete_type_info: Fills in the #GTypeInfo and + * #GTypeValueTable structs for the type. The structs are initialized + * with memset(s, 0, sizeof (s)) before calling + * this function. + * @complete_interface_info: Fills in missing parts of the #GInterfaceInfo + * for the interface. The structs is initialized with + * memset(s, 0, sizeof (s)) before calling + * this function. + * + * The #GTypePlugin interface is used by the type system in order to handle + * the lifecycle of dynamically loaded types. + */ +struct _GTypePluginClass +{ + /*< private >*/ + GTypeInterface base_iface; + + /*< public >*/ + GTypePluginUse use_plugin; + GTypePluginUnuse unuse_plugin; + GTypePluginCompleteTypeInfo complete_type_info; + GTypePluginCompleteInterfaceInfo complete_interface_info; +}; + + +/* --- prototypes --- */ +GType g_type_plugin_get_type (void) G_GNUC_CONST; +void g_type_plugin_use (GTypePlugin *plugin); +void g_type_plugin_unuse (GTypePlugin *plugin); +void g_type_plugin_complete_type_info (GTypePlugin *plugin, + GType g_type, + GTypeInfo *info, + GTypeValueTable *value_table); +void g_type_plugin_complete_interface_info (GTypePlugin *plugin, + GType instance_type, + GType interface_type, + GInterfaceInfo *info); + +G_END_DECLS + +#endif /* __G_TYPE_PLUGIN_H__ */ diff --git a/gobject/gvalue.c b/gobject/gvalue.c new file mode 100644 index 0000000..7be9f71 --- /dev/null +++ b/gobject/gvalue.c @@ -0,0 +1,559 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * FIXME: MT-safety + */ + +#include "config.h" + +#include + +#include "gvalue.h" +#include "gvaluecollector.h" +#include "gbsearcharray.h" +#include "gobjectalias.h" + + +/** + * SECTION:generic_values + * @short_description: A polymorphic type that can hold values of any + * other type + * @see_also: The fundamental types which all support #GValue + * operations and thus can be used as a type initializer for + * g_value_init() are defined by a separate interface. See the Standard + * Values API for details. + * @title: Generic values + * + * The #GValue structure is basically a variable container that consists + * of a type identifier and a specific value of that type. + * The type identifier within a #GValue structure always determines the + * type of the associated value. + * To create a undefined #GValue structure, simply create a zero-filled + * #GValue structure. To initialize the #GValue, use the g_value_init() + * function. A #GValue cannot be used until it is initialized. + * The basic type operations (such as freeing and copying) are determined + * by the #GTypeValueTable associated with the type ID stored in the #GValue. + * Other #GValue operations (such as converting values between types) are + * provided by this interface. + * + * The code in the example program below demonstrates #GValue's + * features. + * + * |[ + * #include <glib-object.h> + * + * static void + * int2string (const GValue *src_value, + * GValue *dest_value) + * { + * if (g_value_get_int (src_value) == 42) + * g_value_set_static_string (dest_value, "An important number"); + * else + * g_value_set_static_string (dest_value, "What's that?"); + * } + * + * int + * main (int argc, + * char *argv[]) + * { + * /* GValues must start zero-filled */ + * GValue a = {0}; + * GValue b = {0}; + * const gchar *message; + * + * g_type_init (); + * + * /* The GValue starts empty */ + * g_assert (!G_VALUE_HOLDS_STRING (&a)); + * + * /* Put a string in it */ + * g_value_init (&a, G_TYPE_STRING); + * g_assert (G_VALUE_HOLDS_STRING (&a)); + * g_value_set_static_string (&a, "Hello, world!"); + * g_printf ("%s\n", g_value_get_string (&a)); + * + * /* Reset it to its pristine state */ + * g_value_unset (&a); + * + * /* It can then be reused for another type */ + * g_value_init (&a, G_TYPE_INT); + * g_value_set_int (&a, 42); + * + * /* Attempt to transform it into a GValue of type STRING */ + * g_value_init (&b, G_TYPE_STRING); + * + * /* An INT is transformable to a STRING */ + * g_assert (g_value_type_transformable (G_TYPE_INT, G_TYPE_STRING)); + * + * g_value_transform (&a, &b); + * g_printf ("%s\n", g_value_get_string (&b)); + * + * /* Attempt to transform it again using a custom transform function */ + * g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, int2string); + * g_value_transform (&a, &b); + * g_printf ("%s\n", g_value_get_string (&b)); + * return 0; + * } + * ]| + */ + + +/* --- typedefs & structures --- */ +typedef struct { + GType src_type; + GType dest_type; + GValueTransform func; +} TransformEntry; + + +/* --- prototypes --- */ +static gint transform_entries_cmp (gconstpointer bsearch_node1, + gconstpointer bsearch_node2); + + +/* --- variables --- */ +static GBSearchArray *transform_array = NULL; +static GBSearchConfig transform_bconfig = { + sizeof (TransformEntry), + transform_entries_cmp, + G_BSEARCH_ARRAY_ALIGN_POWER2, +}; + + +/* --- functions --- */ +void +g_value_c_init (void) +{ + transform_array = g_bsearch_array_create (&transform_bconfig); +} + +static inline void /* keep this function in sync with gvaluecollector.h and gboxed.c */ +value_meminit (GValue *value, + GType value_type) +{ + value->g_type = value_type; + memset (value->data, 0, sizeof (value->data)); +} + +/** + * g_value_init: + * @value: A zero-filled (uninitialized) #GValue structure. + * @g_type: Type the #GValue should hold values of. + * + * Initializes @value with the default value of @type. + * + * Returns: the #GValue structure that has been passed in + */ +GValue* +g_value_init (GValue *value, + GType g_type) +{ + /* g_return_val_if_fail (G_TYPE_IS_VALUE (g_type), NULL); be more elaborate below */ + g_return_val_if_fail (value != NULL, NULL); + /* g_return_val_if_fail (G_VALUE_TYPE (value) == 0, NULL); be more elaborate below */ + + if (G_TYPE_IS_VALUE (g_type) && G_VALUE_TYPE (value) == 0) + { + GTypeValueTable *value_table = g_type_value_table_peek (g_type); + + /* setup and init */ + value_meminit (value, g_type); + value_table->value_init (value); + } + else if (G_VALUE_TYPE (value)) + g_warning ("%s: cannot initialize GValue with type `%s', the value has already been initialized as `%s'", + G_STRLOC, + g_type_name (g_type), + g_type_name (G_VALUE_TYPE (value))); + else /* !G_TYPE_IS_VALUE (g_type) */ + g_warning ("%s: cannot initialize GValue with type `%s', %s", + G_STRLOC, + g_type_name (g_type), + g_type_value_table_peek (g_type) ? + "this type is abstract with regards to GValue use, use a more specific (derived) type" : + "this type has no GTypeValueTable implementation"); + return value; +} + +/** + * g_value_copy: + * @src_value: An initialized #GValue structure. + * @dest_value: An initialized #GValue structure of the same type as @src_value. + * + * Copies the value of @src_value into @dest_value. + */ +void +g_value_copy (const GValue *src_value, + GValue *dest_value) +{ + g_return_if_fail (G_IS_VALUE (src_value)); + g_return_if_fail (G_IS_VALUE (dest_value)); + g_return_if_fail (g_value_type_compatible (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value))); + + if (src_value != dest_value) + { + GType dest_type = G_VALUE_TYPE (dest_value); + GTypeValueTable *value_table = g_type_value_table_peek (dest_type); + + /* make sure dest_value's value is free()d */ + if (value_table->value_free) + value_table->value_free (dest_value); + + /* setup and copy */ + value_meminit (dest_value, dest_type); + value_table->value_copy (src_value, dest_value); + } +} + +/** + * g_value_reset: + * @value: An initialized #GValue structure. + * + * Clears the current value in @value and resets it to the default value + * (as if the value had just been initialized). + * + * Returns: the #GValue structure that has been passed in + */ +GValue* +g_value_reset (GValue *value) +{ + GTypeValueTable *value_table; + GType g_type; + + g_return_val_if_fail (G_IS_VALUE (value), NULL); + + g_type = G_VALUE_TYPE (value); + value_table = g_type_value_table_peek (g_type); + + /* make sure value's value is free()d */ + if (value_table->value_free) + value_table->value_free (value); + + /* setup and init */ + value_meminit (value, g_type); + value_table->value_init (value); + + return value; +} + +/** + * g_value_unset: + * @value: An initialized #GValue structure. + * + * Clears the current value in @value and "unsets" the type, + * this releases all resources associated with this GValue. + * An unset value is the same as an uninitialized (zero-filled) + * #GValue structure. + */ +void +g_value_unset (GValue *value) +{ + GTypeValueTable *value_table; + + g_return_if_fail (G_IS_VALUE (value)); + + value_table = g_type_value_table_peek (G_VALUE_TYPE (value)); + + if (value_table->value_free) + value_table->value_free (value); + memset (value, 0, sizeof (*value)); +} + +/** + * g_value_fits_pointer: + * @value: An initialized #GValue structure. + * + * Determines if @value will fit inside the size of a pointer value. + * This is an internal function introduced mainly for C marshallers. + * + * Returns: %TRUE if @value will fit inside a pointer value. + */ +gboolean +g_value_fits_pointer (const GValue *value) +{ + GTypeValueTable *value_table; + + g_return_val_if_fail (G_IS_VALUE (value), FALSE); + + value_table = g_type_value_table_peek (G_VALUE_TYPE (value)); + + return value_table->value_peek_pointer != NULL; +} + +/** + * g_value_peek_pointer: + * @value: An initialized #GValue structure. + * + * Return the value contents as pointer. This function asserts that + * g_value_fits_pointer() returned %TRUE for the passed in value. + * This is an internal function introduced mainly for C marshallers. + * + * Returns: %TRUE if @value will fit inside a pointer value. + */ +gpointer +g_value_peek_pointer (const GValue *value) +{ + GTypeValueTable *value_table; + + g_return_val_if_fail (G_IS_VALUE (value), NULL); + + value_table = g_type_value_table_peek (G_VALUE_TYPE (value)); + if (!value_table->value_peek_pointer) + { + g_return_val_if_fail (g_value_fits_pointer (value) == TRUE, NULL); + return NULL; + } + + return value_table->value_peek_pointer (value); +} + +/** + * g_value_set_instance: + * @value: An initialized #GValue structure. + * @instance: the instance + * + * Sets @value from an instantiatable type via the + * value_table's collect_value() function. + */ +void +g_value_set_instance (GValue *value, + gpointer instance) +{ + GType g_type; + GTypeValueTable *value_table; + GTypeCValue cvalue; + gchar *error_msg; + + g_return_if_fail (G_IS_VALUE (value)); + if (instance) + { + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (instance), G_VALUE_TYPE (value))); + } + + g_type = G_VALUE_TYPE (value); + value_table = g_type_value_table_peek (g_type); + + g_return_if_fail (strcmp (value_table->collect_format, "p") == 0); + + memset (&cvalue, 0, sizeof (cvalue)); + cvalue.v_pointer = instance; + + /* make sure value's value is free()d */ + if (value_table->value_free) + value_table->value_free (value); + + /* setup and collect */ + value_meminit (value, g_type); + error_msg = value_table->collect_value (value, 1, &cvalue, 0); + if (error_msg) + { + g_warning ("%s: %s", G_STRLOC, error_msg); + g_free (error_msg); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occoured + */ + value_meminit (value, g_type); + value_table->value_init (value); + } +} + +static GValueTransform +transform_func_lookup (GType src_type, + GType dest_type) +{ + TransformEntry entry; + + entry.src_type = src_type; + do + { + entry.dest_type = dest_type; + do + { + TransformEntry *e; + + e = g_bsearch_array_lookup (transform_array, &transform_bconfig, &entry); + if (e) + { + /* need to check that there hasn't been a change in value handling */ + if (g_type_value_table_peek (entry.dest_type) == g_type_value_table_peek (dest_type) && + g_type_value_table_peek (entry.src_type) == g_type_value_table_peek (src_type)) + return e->func; + } + entry.dest_type = g_type_parent (entry.dest_type); + } + while (entry.dest_type); + + entry.src_type = g_type_parent (entry.src_type); + } + while (entry.src_type); + + return NULL; +} + +static gint +transform_entries_cmp (gconstpointer bsearch_node1, + gconstpointer bsearch_node2) +{ + const TransformEntry *e1 = bsearch_node1; + const TransformEntry *e2 = bsearch_node2; + gint cmp = G_BSEARCH_ARRAY_CMP (e1->src_type, e2->src_type); + + if (cmp) + return cmp; + else + return G_BSEARCH_ARRAY_CMP (e1->dest_type, e2->dest_type); +} + +/** + * g_value_register_transform_func: + * @src_type: Source type. + * @dest_type: Target type. + * @transform_func: a function which transforms values of type @src_type + * into value of type @dest_type + * + * Registers a value transformation function for use in g_value_transform(). + * A previously registered transformation function for @src_type and @dest_type + * will be replaced. + */ +void +g_value_register_transform_func (GType src_type, + GType dest_type, + GValueTransform transform_func) +{ + TransformEntry entry; + + /* these checks won't pass for dynamic types. + * g_return_if_fail (G_TYPE_HAS_VALUE_TABLE (src_type)); + * g_return_if_fail (G_TYPE_HAS_VALUE_TABLE (dest_type)); + */ + g_return_if_fail (transform_func != NULL); + + entry.src_type = src_type; + entry.dest_type = dest_type; + +#if 0 /* let transform function replacement be a valid operation */ + if (g_bsearch_array_lookup (transform_array, &transform_bconfig, &entry)) + g_warning ("reregistering value transformation function (%p) for `%s' to `%s'", + transform_func, + g_type_name (src_type), + g_type_name (dest_type)); +#endif + + entry.func = transform_func; + transform_array = g_bsearch_array_replace (transform_array, &transform_bconfig, &entry); +} + +/** + * g_value_type_transformable: + * @src_type: Source type. + * @dest_type: Target type. + * + * Check whether g_value_transform() is able to transform values + * of type @src_type into values of type @dest_type. + * + * Returns: %TRUE if the transformation is possible, %FALSE otherwise. + */ +gboolean +g_value_type_transformable (GType src_type, + GType dest_type) +{ + g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE); + g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE); + + return (g_value_type_compatible (src_type, dest_type) || + transform_func_lookup (src_type, dest_type) != NULL); +} + +/** + * g_value_type_compatible: + * @src_type: source type to be copied. + * @dest_type: destination type for copying. + * + * Returns whether a #GValue of type @src_type can be copied into + * a #GValue of type @dest_type. + * + * Returns: %TRUE if g_value_copy() is possible with @src_type and @dest_type. + */ +gboolean +g_value_type_compatible (GType src_type, + GType dest_type) +{ + g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE); + g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE); + + return (g_type_is_a (src_type, dest_type) && + g_type_value_table_peek (dest_type) == g_type_value_table_peek (src_type)); +} + +/** + * g_value_transform: + * @src_value: Source value. + * @dest_value: Target value. + * + * Tries to cast the contents of @src_value into a type appropriate + * to store in @dest_value, e.g. to transform a %G_TYPE_INT value + * into a %G_TYPE_FLOAT value. Performing transformations between + * value types might incur precision lossage. Especially + * transformations into strings might reveal seemingly arbitrary + * results and shouldn't be relied upon for production code (such + * as rcfile value or object property serialization). + * + * Returns: Whether a transformation rule was found and could be applied. + * Upon failing transformations, @dest_value is left untouched. + */ +gboolean +g_value_transform (const GValue *src_value, + GValue *dest_value) +{ + GType dest_type; + + g_return_val_if_fail (G_IS_VALUE (src_value), FALSE); + g_return_val_if_fail (G_IS_VALUE (dest_value), FALSE); + + dest_type = G_VALUE_TYPE (dest_value); + if (g_value_type_compatible (G_VALUE_TYPE (src_value), dest_type)) + { + g_value_copy (src_value, dest_value); + + return TRUE; + } + else + { + GValueTransform transform = transform_func_lookup (G_VALUE_TYPE (src_value), dest_type); + + if (transform) + { + g_value_unset (dest_value); + + /* setup and transform */ + value_meminit (dest_value, dest_type); + transform (src_value, dest_value); + + return TRUE; + } + } + return FALSE; +} + +#define __G_VALUE_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gvalue.h b/gobject/gvalue.h new file mode 100644 index 0000000..b3f2872 --- /dev/null +++ b/gobject/gvalue.h @@ -0,0 +1,159 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gvalue.h: generic GValue functions + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_VALUE_H__ +#define __G_VALUE_H__ + +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +/** + * G_TYPE_IS_VALUE: + * @type: A #GType value. + * + * Checks whether the passed in type ID can be used for g_value_init(). + * That is, this macro checks whether this type provides an implementation + * of the #GTypeValueTable functions required for a type to create a #GValue of. + * + * Returns: Whether @type is suitable as a #GValue type. + */ +#define G_TYPE_IS_VALUE(type) (g_type_check_is_value_type (type)) +/** + * G_IS_VALUE: + * @value: A #GValue structure. + * + * Checks if @value is a valid and initialized #GValue structure. + * + * Returns: %TRUE on success. + */ +#define G_IS_VALUE(value) (G_TYPE_CHECK_VALUE (value)) +/** + * G_VALUE_TYPE: + * @value: A #GValue structure. + * + * Get the type identifier of @value. + * + * Returns: the #GType. + */ +#define G_VALUE_TYPE(value) (((GValue*) (value))->g_type) +/** + * G_VALUE_TYPE_NAME: + * @value: A #GValue structure. + * + * Gets the the type name of @value. + * + * Returns: the type name. + */ +#define G_VALUE_TYPE_NAME(value) (g_type_name (G_VALUE_TYPE (value))) +/** + * G_VALUE_HOLDS: + * @value: A #GValue structure. + * @type: A #GType value. + * + * Checks if @value holds (or contains) a value of @type. + * This macro will also check for @value != %NULL and issue a + * warning if the check fails. + * + * Returns: %TRUE if @value holds the @type. + */ +#define G_VALUE_HOLDS(value,type) (G_TYPE_CHECK_VALUE_TYPE ((value), (type))) + + +/* --- typedefs & structures --- */ +/** + * GValueTransform: + * @src_value: Source value. + * @dest_value: Target value. + * + * The type of value transformation functions which can be registered with + * g_value_register_transform_func(). + */ +typedef void (*GValueTransform) (const GValue *src_value, + GValue *dest_value); +/** + * GValue: + * + * An opaque structure used to hold different types of values. + * The data within the structure has protected scope: it is accessible only + * to functions within a #GTypeValueTable structure, or implementations of + * the g_value_*() API. That is, code portions which implement new fundamental + * types. + * #GValue users can not make any assumptions about how data is stored + * within the 2 element @data union, and the @g_type member should + * only be accessed through the G_VALUE_TYPE() macro. + */ +struct _GValue +{ + /*< private >*/ + GType g_type; + + /* public for GTypeValueTable methods */ + union { + gint v_int; + guint v_uint; + glong v_long; + gulong v_ulong; + gint64 v_int64; + guint64 v_uint64; + gfloat v_float; + gdouble v_double; + gpointer v_pointer; + } data[2]; +}; + + +/* --- prototypes --- */ +GValue* g_value_init (GValue *value, + GType g_type); +void g_value_copy (const GValue *src_value, + GValue *dest_value); +GValue* g_value_reset (GValue *value); +void g_value_unset (GValue *value); +void g_value_set_instance (GValue *value, + gpointer instance); + + +/* --- private --- */ +gboolean g_value_fits_pointer (const GValue *value); +gpointer g_value_peek_pointer (const GValue *value); + + +/* --- implementation details --- */ +gboolean g_value_type_compatible (GType src_type, + GType dest_type); +gboolean g_value_type_transformable (GType src_type, + GType dest_type); +gboolean g_value_transform (const GValue *src_value, + GValue *dest_value); +void g_value_register_transform_func (GType src_type, + GType dest_type, + GValueTransform transform_func); +#define G_VALUE_NOCOPY_CONTENTS (1 << 27) + + +G_END_DECLS + +#endif /* __G_VALUE_H__ */ diff --git a/gobject/gvaluearray.c b/gobject/gvaluearray.c new file mode 100644 index 0000000..889a7f5 --- /dev/null +++ b/gobject/gvaluearray.c @@ -0,0 +1,345 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include /* qsort() */ + +#include "gvaluearray.h" +#include "gobjectalias.h" + + +/** + * SECTION:value_arrays + * @short_description: A container structure to maintain an array of + * generic values + * @see_also: #GValue, #GParamSpecValueArray, g_param_spec_value_array() + * @title: Value arrays + * + * The prime purpose of a #GValueArray is for it to be used as an + * object property that holds an array of values. A #GValueArray wraps + * an array of #GValue elements in order for it to be used as a boxed + * type through %G_TYPE_VALUE_ARRAY. + */ + + +#ifdef DISABLE_MEM_POOLS +# define GROUP_N_VALUES (1) /* power of 2 !! */ +#else +# define GROUP_N_VALUES (8) /* power of 2 !! */ +#endif + + +/* --- functions --- */ +/** + * g_value_array_get_nth: + * @value_array: #GValueArray to get a value from + * @index_: index of the value of interest + * + * Return a pointer to the value at @index_ containd in @value_array. + * + * Returns: pointer to a value at @index_ in @value_array + */ +GValue* +g_value_array_get_nth (GValueArray *value_array, + guint index) +{ + g_return_val_if_fail (value_array != NULL, NULL); + g_return_val_if_fail (index < value_array->n_values, NULL); + + return value_array->values + index; +} + +static inline void +value_array_grow (GValueArray *value_array, + guint n_values, + gboolean zero_init) +{ + g_return_if_fail (n_values >= value_array->n_values); + + value_array->n_values = n_values; + if (value_array->n_values > value_array->n_prealloced) + { + guint i = value_array->n_prealloced; + + value_array->n_prealloced = (value_array->n_values + GROUP_N_VALUES - 1) & ~(GROUP_N_VALUES - 1); + value_array->values = g_renew (GValue, value_array->values, value_array->n_prealloced); + if (!zero_init) + i = value_array->n_values; + memset (value_array->values + i, 0, + (value_array->n_prealloced - i) * sizeof (value_array->values[0])); + } +} + +static inline void +value_array_shrink (GValueArray *value_array) +{ +#ifdef DISABLE_MEM_POOLS + if (value_array->n_prealloced >= value_array->n_values + GROUP_N_VALUES) + { + value_array->n_prealloced = (value_array->n_values + GROUP_N_VALUES - 1) & ~(GROUP_N_VALUES - 1); + value_array->values = g_renew (GValue, value_array->values, value_array->n_prealloced); + } +#endif +} + +/** + * g_value_array_new: + * @n_prealloced: number of values to preallocate space for + * + * Allocate and initialize a new #GValueArray, optionally preserve space + * for @n_prealloced elements. New arrays always contain 0 elements, + * regardless of the value of @n_prealloced. + * + * Returns: a newly allocated #GValueArray with 0 values + */ +GValueArray* +g_value_array_new (guint n_prealloced) +{ + GValueArray *value_array = g_slice_new (GValueArray); + + value_array->n_values = 0; + value_array->n_prealloced = 0; + value_array->values = NULL; + value_array_grow (value_array, n_prealloced, TRUE); + value_array->n_values = 0; + + return value_array; +} + +/** + * g_value_array_free: + * @value_array: #GValueArray to free + * + * Free a #GValueArray including its contents. + */ +void +g_value_array_free (GValueArray *value_array) +{ + guint i; + + g_return_if_fail (value_array != NULL); + + for (i = 0; i < value_array->n_values; i++) + { + GValue *value = value_array->values + i; + + if (G_VALUE_TYPE (value) != 0) /* we allow unset values in the array */ + g_value_unset (value); + } + g_free (value_array->values); + g_slice_free (GValueArray, value_array); +} + +/** + * g_value_array_copy: + * @value_array: #GValueArray to copy + * + * Construct an exact copy of a #GValueArray by duplicating all its + * contents. + * + * Returns: Newly allocated copy of #GValueArray + */ +GValueArray* +g_value_array_copy (const GValueArray *value_array) +{ + GValueArray *new_array; + guint i; + + g_return_val_if_fail (value_array != NULL, NULL); + + new_array = g_slice_new (GValueArray); + new_array->n_values = 0; + new_array->values = NULL; + new_array->n_prealloced = 0; + value_array_grow (new_array, value_array->n_values, TRUE); + for (i = 0; i < new_array->n_values; i++) + if (G_VALUE_TYPE (value_array->values + i) != 0) + { + GValue *value = new_array->values + i; + + g_value_init (value, G_VALUE_TYPE (value_array->values + i)); + g_value_copy (value_array->values + i, value); + } + return new_array; +} + +/** + * g_value_array_prepend: + * @value_array: #GValueArray to add an element to + * @value: #GValue to copy into #GValueArray + * + * Insert a copy of @value as first element of @value_array. + * + * Returns: the #GValueArray passed in as @value_array + */ +GValueArray* +g_value_array_prepend (GValueArray *value_array, + const GValue *value) +{ + g_return_val_if_fail (value_array != NULL, NULL); + + return g_value_array_insert (value_array, 0, value); +} + +/** + * g_value_array_append: + * @value_array: #GValueArray to add an element to + * @value: #GValue to copy into #GValueArray + * + * Insert a copy of @value as last element of @value_array. + * + * Returns: the #GValueArray passed in as @value_array + */ +GValueArray* +g_value_array_append (GValueArray *value_array, + const GValue *value) +{ + g_return_val_if_fail (value_array != NULL, NULL); + + return g_value_array_insert (value_array, value_array->n_values, value); +} + +/** + * g_value_array_insert: + * @value_array: #GValueArray to add an element to + * @index_: insertion position, must be <= value_array->n_values + * @value: #GValue to copy into #GValueArray + * + * Insert a copy of @value at specified position into @value_array. + * + * Returns: the #GValueArray passed in as @value_array + */ +GValueArray* +g_value_array_insert (GValueArray *value_array, + guint index, + const GValue *value) +{ + guint i; + + g_return_val_if_fail (value_array != NULL, NULL); + g_return_val_if_fail (index <= value_array->n_values, value_array); + + /* we support NULL for "value" as a shortcut for an unset value */ + + i = value_array->n_values; + value_array_grow (value_array, value_array->n_values + 1, FALSE); + if (index + 1 < value_array->n_values) + g_memmove (value_array->values + index + 1, value_array->values + index, + (i - index) * sizeof (value_array->values[0])); + memset (value_array->values + index, 0, sizeof (value_array->values[0])); + if (value) + { + g_value_init (value_array->values + index, G_VALUE_TYPE (value)); + g_value_copy (value, value_array->values + index); + } + return value_array; +} + +/** + * g_value_array_remove: + * @value_array: #GValueArray to remove an element from + * @index_: position of value to remove, must be < value_array->n_values + * + * Remove the value at position @index_ from @value_array. + * + * Returns: the #GValueArray passed in as @value_array + */ +GValueArray* +g_value_array_remove (GValueArray *value_array, + guint index) +{ + g_return_val_if_fail (value_array != NULL, NULL); + g_return_val_if_fail (index < value_array->n_values, value_array); + + if (G_VALUE_TYPE (value_array->values + index) != 0) + g_value_unset (value_array->values + index); + value_array->n_values--; + if (index < value_array->n_values) + g_memmove (value_array->values + index, value_array->values + index + 1, + (value_array->n_values - index) * sizeof (value_array->values[0])); + value_array_shrink (value_array); + if (value_array->n_prealloced > value_array->n_values) + memset (value_array->values + value_array->n_values, 0, sizeof (value_array->values[0])); + + return value_array; +} + +/** + * g_value_array_sort: + * @value_array: #GValueArray to sort + * @compare_func: function to compare elements + * + * Sort @value_array using @compare_func to compare the elements accoring to + * the semantics of #GCompareFunc. + * + * The current implementation uses Quick-Sort as sorting algorithm. + * + * Returns: the #GValueArray passed in as @value_array + */ +GValueArray* +g_value_array_sort (GValueArray *value_array, + GCompareFunc compare_func) +{ + g_return_val_if_fail (compare_func != NULL, NULL); + + if (value_array->n_values) + qsort (value_array->values, + value_array->n_values, + sizeof (value_array->values[0]), + compare_func); + return value_array; +} + +/** + * g_value_array_sort_with_data: + * @value_array: #GValueArray to sort + * @compare_func: function to compare elements + * @user_data: extra data argument provided for @compare_func + * + * Sort @value_array using @compare_func to compare the elements accoring + * to the semantics of #GCompareDataFunc. + * + * The current implementation uses Quick-Sort as sorting algorithm. + * + * Returns: the #GValueArray passed in as @value_array + */ +GValueArray* +g_value_array_sort_with_data (GValueArray *value_array, + GCompareDataFunc compare_func, + gpointer user_data) +{ + g_return_val_if_fail (value_array != NULL, NULL); + g_return_val_if_fail (compare_func != NULL, NULL); + + if (value_array->n_values) + g_qsort_with_data (value_array->values, + value_array->n_values, + sizeof (value_array->values[0]), + compare_func, user_data); + return value_array; +} + +#define __G_VALUE_ARRAY_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gvaluearray.h b/gobject/gvaluearray.h new file mode 100644 index 0000000..524dc9f --- /dev/null +++ b/gobject/gvaluearray.h @@ -0,0 +1,77 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gvaluearray.h: GLib array type holding GValues + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_VALUE_ARRAY_H__ +#define __G_VALUE_ARRAY_H__ + +#include + + +G_BEGIN_DECLS + + +/* --- typedefs & structs --- */ +typedef struct _GValueArray GValueArray; +/** + * GValueArray: + * @n_values: number of values contained in the array + * @values: array of values + * + * A #GValueArray contains an array of #GValue elements. + */ +struct _GValueArray +{ + guint n_values; + GValue *values; + + /*< private >*/ + guint n_prealloced; +}; + + +/* --- prototypes --- */ +GValue* g_value_array_get_nth (GValueArray *value_array, + guint index_); +GValueArray* g_value_array_new (guint n_prealloced); +void g_value_array_free (GValueArray *value_array); +GValueArray* g_value_array_copy (const GValueArray *value_array); +GValueArray* g_value_array_prepend (GValueArray *value_array, + const GValue *value); +GValueArray* g_value_array_append (GValueArray *value_array, + const GValue *value); +GValueArray* g_value_array_insert (GValueArray *value_array, + guint index_, + const GValue *value); +GValueArray* g_value_array_remove (GValueArray *value_array, + guint index_); +GValueArray* g_value_array_sort (GValueArray *value_array, + GCompareFunc compare_func); +GValueArray* g_value_array_sort_with_data (GValueArray *value_array, + GCompareDataFunc compare_func, + gpointer user_data); + + +G_END_DECLS + +#endif /* __G_VALUE_ARRAY_H__ */ diff --git a/gobject/gvaluecollector.h b/gobject/gvaluecollector.h new file mode 100644 index 0000000..163e7c7 --- /dev/null +++ b/gobject/gvaluecollector.h @@ -0,0 +1,222 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gvaluecollector.h: GValue varargs stubs + */ +/** + * SECTION:value_collection + * @Short_description: Converting varargs to generic values + * @See_also:#GValueTable + * @Title: Varargs Value Collection + * + * The macros in this section provide the varargs parsing support needed + * in variadic GObject functions such as g_object_new() or g_object_set(). + * They currently support the collection of integral types, floating point + * types and pointers. + */ +#ifndef __G_VALUE_COLLECTOR_H__ +#define __G_VALUE_COLLECTOR_H__ + +#include + +G_BEGIN_DECLS + +/* we may want to add aggregate types here some day, if requested + * by users. the basic C types are covered already, everything + * smaller than an int is promoted to an integer and floats are + * always promoted to doubles for varargs call constructions. + */ +enum /*< skip >*/ +{ + G_VALUE_COLLECT_INT = 'i', + G_VALUE_COLLECT_LONG = 'l', + G_VALUE_COLLECT_INT64 = 'q', + G_VALUE_COLLECT_DOUBLE = 'd', + G_VALUE_COLLECT_POINTER = 'p' +}; + + +/* vararg union holding actuall values collected + */ +/** + * GTypeCValue: + * + * A union holding one collected value. + */ +union _GTypeCValue +{ + gint v_int; + glong v_long; + gint64 v_int64; + gdouble v_double; + gpointer v_pointer; +}; + +/** + * G_VALUE_COLLECT_INIT: + * @value: a #GValue return location. @value must contain only 0 bytes. + * @_value_type: the #GType to use for @value. + * @var_args: the va_list variable; it may be evaluated multiple times + * @flags: flags which are passed on to the collect_value() function of + * the #GTypeValueTable of @value. + * @__error: a #gchar** variable that will be modified to hold a g_new() + * allocated error messages if something fails + * + * Collects a variable argument value from a va_list. We have to + * implement the varargs collection as a macro, because on some systems + * va_list variables cannot be passed by reference. + * + * Since: 2.24 + */ +#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error) \ +G_STMT_START { \ + GValue *_val = (value); \ + guint _flags = (flags); \ + GTypeValueTable *_vtab = g_type_value_table_peek (_value_type); \ + gchar *_collect_format = _vtab->collect_format; \ + GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \ + guint _n_values = 0; \ + \ + _val->g_type = _value_type; /* value_meminit() from gvalue.c */ \ + while (*_collect_format) \ + { \ + GTypeCValue *_cvalue = _cvalues + _n_values++; \ + \ + switch (*_collect_format++) \ + { \ + case G_VALUE_COLLECT_INT: \ + _cvalue->v_int = va_arg ((var_args), gint); \ + break; \ + case G_VALUE_COLLECT_LONG: \ + _cvalue->v_long = va_arg ((var_args), glong); \ + break; \ + case G_VALUE_COLLECT_INT64: \ + _cvalue->v_int64 = va_arg ((var_args), gint64); \ + break; \ + case G_VALUE_COLLECT_DOUBLE: \ + _cvalue->v_double = va_arg ((var_args), gdouble); \ + break; \ + case G_VALUE_COLLECT_POINTER: \ + _cvalue->v_pointer = va_arg ((var_args), gpointer); \ + break; \ + default: \ + g_assert_not_reached (); \ + } \ + } \ + *(__error) = _vtab->collect_value (_val, \ + _n_values, \ + _cvalues, \ + _flags); \ +} G_STMT_END + +/** + * G_VALUE_COLLECT: + * @value: a #GValue return location. @value is supposed to be initialized + * according to the value type to be collected + * @var_args: the va_list variable; it may be evaluated multiple times + * @flags: flags which are passed on to the collect_value() function of + * the #GTypeValueTable of @value. + * @__error: a #gchar** variable that will be modified to hold a g_new() + * allocated error messages if something fails + * + * Collects a variable argument value from a va_list. We have to + * implement the varargs collection as a macro, because on some systems + * va_list variables cannot be passed by reference. + * + * Note: If you are creating the @value argument just before calling this macro, + * you should use the #G_VALUE_COLLECT_INIT variant and pass the unitialized + * #GValue. That variant is faster than #G_VALUE_COLLECT. + */ +#define G_VALUE_COLLECT(value, var_args, flags, __error) G_STMT_START { \ + GValue *_value = (value); \ + GType _value_type = G_VALUE_TYPE (_value); \ + GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \ + \ + if (_vtable->value_free) \ + _vtable->value_free (_value); \ + memset (_value->data, 0, sizeof (_value->data)); \ + \ + G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error); \ +} G_STMT_END + +/** + * G_VALUE_LCOPY: + * @value: a #GValue return location. @value is supposed to be initialized + * according to the value type to be collected + * @var_args: the va_list variable; it may be evaluated multiple times + * @flags: flags which are passed on to the lcopy_value() function of + * the #GTypeValueTable of @value. + * @__error: a #gchar** variable that will be modified to hold a g_new() + * allocated error messages if something fails + * + * Collects a value's variable argument locations from a va_list. Usage is + * analogous to G_VALUE_COLLECT(). + */ +#define G_VALUE_LCOPY(value, var_args, flags, __error) \ +G_STMT_START { \ + const GValue *_value = (value); \ + guint _flags = (flags); \ + GType _value_type = G_VALUE_TYPE (_value); \ + GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \ + gchar *_lcopy_format = _vtable->lcopy_format; \ + GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \ + guint _n_values = 0; \ + \ + while (*_lcopy_format) \ + { \ + GTypeCValue *_cvalue = _cvalues + _n_values++; \ + \ + switch (*_lcopy_format++) \ + { \ + case G_VALUE_COLLECT_INT: \ + _cvalue->v_int = va_arg ((var_args), gint); \ + break; \ + case G_VALUE_COLLECT_LONG: \ + _cvalue->v_long = va_arg ((var_args), glong); \ + break; \ + case G_VALUE_COLLECT_INT64: \ + _cvalue->v_int64 = va_arg ((var_args), gint64); \ + break; \ + case G_VALUE_COLLECT_DOUBLE: \ + _cvalue->v_double = va_arg ((var_args), gdouble); \ + break; \ + case G_VALUE_COLLECT_POINTER: \ + _cvalue->v_pointer = va_arg ((var_args), gpointer); \ + break; \ + default: \ + g_assert_not_reached (); \ + } \ + } \ + *(__error) = _vtable->lcopy_value (_value, \ + _n_values, \ + _cvalues, \ + _flags); \ +} G_STMT_END + + +/** + * G_VALUE_COLLECT_FORMAT_MAX_LENGTH: + * + * The maximal number of #GTypeCValues which can be collected for a + * single #GValue. + */ +#define G_VALUE_COLLECT_FORMAT_MAX_LENGTH (8) + +G_END_DECLS + +#endif /* __G_VALUE_COLLECTOR_H__ */ diff --git a/gobject/gvaluetransform.c b/gobject/gvaluetransform.c new file mode 100644 index 0000000..e1c3bba --- /dev/null +++ b/gobject/gvaluetransform.c @@ -0,0 +1,443 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "gvalue.h" +#include "genums.h" +#include "gobjectalias.h" + + +/* same type transforms + */ +static void +value_transform_memcpy_data0 (const GValue *src_value, + GValue *dest_value) +{ + memcpy (&dest_value->data[0], &src_value->data[0], sizeof (src_value->data[0])); +} +#define value_transform_int_int value_transform_memcpy_data0 +#define value_transform_uint_uint value_transform_memcpy_data0 +#define value_transform_long_long value_transform_memcpy_data0 +#define value_transform_ulong_ulong value_transform_memcpy_data0 +#define value_transform_int64_int64 value_transform_memcpy_data0 +#define value_transform_uint64_uint64 value_transform_memcpy_data0 +#define value_transform_float_float value_transform_memcpy_data0 +#define value_transform_double_double value_transform_memcpy_data0 + + +/* numeric casts + */ +#define DEFINE_CAST(func_name, from_member, ctype, to_member) \ +static void \ +value_transform_##func_name (const GValue *src_value, \ + GValue *dest_value) \ +{ \ + ctype c_value = src_value->data[0].from_member; \ + dest_value->data[0].to_member = c_value; \ +} extern void glib_dummy_decl (void) +DEFINE_CAST (int_s8, v_int, gint8, v_int); +DEFINE_CAST (int_u8, v_int, guint8, v_uint); +DEFINE_CAST (int_uint, v_int, guint, v_uint); +DEFINE_CAST (int_long, v_int, glong, v_long); +DEFINE_CAST (int_ulong, v_int, gulong, v_ulong); +DEFINE_CAST (int_int64, v_int, gint64, v_int64); +DEFINE_CAST (int_uint64, v_int, guint64, v_uint64); +DEFINE_CAST (int_float, v_int, gfloat, v_float); +DEFINE_CAST (int_double, v_int, gdouble, v_double); +DEFINE_CAST (uint_s8, v_uint, gint8, v_int); +DEFINE_CAST (uint_u8, v_uint, guint8, v_uint); +DEFINE_CAST (uint_int, v_uint, gint, v_int); +DEFINE_CAST (uint_long, v_uint, glong, v_long); +DEFINE_CAST (uint_ulong, v_uint, gulong, v_ulong); +DEFINE_CAST (uint_int64, v_uint, gint64, v_int64); +DEFINE_CAST (uint_uint64, v_uint, guint64, v_uint64); +DEFINE_CAST (uint_float, v_uint, gfloat, v_float); +DEFINE_CAST (uint_double, v_uint, gdouble, v_double); +DEFINE_CAST (long_s8, v_long, gint8, v_int); +DEFINE_CAST (long_u8, v_long, guint8, v_uint); +DEFINE_CAST (long_int, v_long, gint, v_int); +DEFINE_CAST (long_uint, v_long, guint, v_uint); +DEFINE_CAST (long_ulong, v_long, gulong, v_ulong); +DEFINE_CAST (long_int64, v_long, gint64, v_int64); +DEFINE_CAST (long_uint64, v_long, guint64, v_uint64); +DEFINE_CAST (long_float, v_long, gfloat, v_float); +DEFINE_CAST (long_double, v_long, gdouble, v_double); +DEFINE_CAST (ulong_s8, v_ulong, gint8, v_int); +DEFINE_CAST (ulong_u8, v_ulong, guint8, v_uint); +DEFINE_CAST (ulong_int, v_ulong, gint, v_int); +DEFINE_CAST (ulong_uint, v_ulong, guint, v_uint); +DEFINE_CAST (ulong_int64, v_ulong, gint64, v_int64); +DEFINE_CAST (ulong_uint64, v_ulong, guint64, v_uint64); +DEFINE_CAST (ulong_long, v_ulong, glong, v_long); +DEFINE_CAST (ulong_float, v_ulong, gfloat, v_float); +DEFINE_CAST (ulong_double, v_ulong, gdouble, v_double); +DEFINE_CAST (int64_s8, v_int64, gint8, v_int); +DEFINE_CAST (int64_u8, v_int64, guint8, v_uint); +DEFINE_CAST (int64_int, v_int64, gint, v_int); +DEFINE_CAST (int64_uint, v_int64, guint, v_uint); +DEFINE_CAST (int64_long, v_int64, glong, v_long); +DEFINE_CAST (int64_uint64, v_int64, guint64, v_uint64); +DEFINE_CAST (int64_ulong, v_int64, gulong, v_ulong); +DEFINE_CAST (int64_float, v_int64, gfloat, v_float); +DEFINE_CAST (int64_double, v_int64, gdouble, v_double); +DEFINE_CAST (uint64_s8, v_uint64, gint8, v_int); +DEFINE_CAST (uint64_u8, v_uint64, guint8, v_uint); +DEFINE_CAST (uint64_int, v_uint64, gint, v_int); +DEFINE_CAST (uint64_uint, v_uint64, guint, v_uint); +DEFINE_CAST (uint64_long, v_uint64, glong, v_long); +DEFINE_CAST (uint64_ulong, v_uint64, gulong, v_ulong); +DEFINE_CAST (uint64_int64, v_uint64, gint64, v_int64); +#ifdef _MSC_VER +/* work around error C2520: conversion from unsigned __int64 to double + * not implemented, use signed __int64 + * If it is supported don't miss to g_value_register_transform_func() below + */ +#pragma message ("Check if cast from uint64 to double is supported with msvc 6.0") +#else +DEFINE_CAST (uint64_float, v_uint64, gfloat, v_float); +DEFINE_CAST (uint64_double, v_uint64, gdouble, v_double); +#endif +DEFINE_CAST (float_s8, v_float, gint8, v_int); +DEFINE_CAST (float_u8, v_float, guint8, v_uint); +DEFINE_CAST (float_int, v_float, gint, v_int); +DEFINE_CAST (float_uint, v_float, guint, v_uint); +DEFINE_CAST (float_long, v_float, glong, v_long); +DEFINE_CAST (float_ulong, v_float, gulong, v_ulong); +DEFINE_CAST (float_int64, v_float, gint64, v_int64); +DEFINE_CAST (float_uint64, v_float, guint64, v_uint64); +DEFINE_CAST (float_double, v_float, gdouble, v_double); +DEFINE_CAST (double_s8, v_double, gint8, v_int); +DEFINE_CAST (double_u8, v_double, guint8, v_uint); +DEFINE_CAST (double_int, v_double, gint, v_int); +DEFINE_CAST (double_uint, v_double, guint, v_uint); +DEFINE_CAST (double_long, v_double, glong, v_long); +DEFINE_CAST (double_ulong, v_double, gulong, v_ulong); +DEFINE_CAST (double_int64, v_double, gint64, v_int64); +DEFINE_CAST (double_uint64, v_double, guint64, v_uint64); +DEFINE_CAST (double_float, v_double, gfloat, v_float); + + +/* boolean assignments + */ +#define DEFINE_BOOL_CHECK(func_name, from_member) \ +static void \ +value_transform_##func_name (const GValue *src_value, \ + GValue *dest_value) \ +{ \ + dest_value->data[0].v_int = src_value->data[0].from_member != 0; \ +} extern void glib_dummy_decl (void) +DEFINE_BOOL_CHECK (int_bool, v_int); +DEFINE_BOOL_CHECK (uint_bool, v_uint); +DEFINE_BOOL_CHECK (long_bool, v_long); +DEFINE_BOOL_CHECK (ulong_bool, v_uint); +DEFINE_BOOL_CHECK (int64_bool, v_int64); +DEFINE_BOOL_CHECK (uint64_bool, v_uint64); + + +/* string printouts + */ +#define DEFINE_SPRINTF(func_name, from_member, format) \ +static void \ +value_transform_##func_name (const GValue *src_value, \ + GValue *dest_value) \ +{ \ + dest_value->data[0].v_pointer = g_strdup_printf ((format), \ + src_value->data[0].from_member); \ +} extern void glib_dummy_decl (void) +DEFINE_SPRINTF (int_string, v_int, "%d"); +DEFINE_SPRINTF (uint_string, v_uint, "%u"); +DEFINE_SPRINTF (long_string, v_long, "%ld"); +DEFINE_SPRINTF (ulong_string, v_ulong, "%lu"); +DEFINE_SPRINTF (int64_string, v_int64, "%" G_GINT64_FORMAT); +DEFINE_SPRINTF (uint64_string, v_uint64, "%" G_GUINT64_FORMAT); +DEFINE_SPRINTF (float_string, v_float, "%f"); +DEFINE_SPRINTF (double_string, v_double, "%f"); + + +/* special cases + */ +static void +value_transform_bool_string (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_pointer = g_strdup_printf ("%s", + src_value->data[0].v_int ? + "TRUE" : "FALSE"); +} +static void +value_transform_string_string (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer); +} +static void +value_transform_enum_string (const GValue *src_value, + GValue *dest_value) +{ + GEnumClass *class = g_type_class_ref (G_VALUE_TYPE (src_value)); + GEnumValue *enum_value = g_enum_get_value (class, src_value->data[0].v_long); + + if (enum_value) + dest_value->data[0].v_pointer = g_strdup (enum_value->value_name); + else + dest_value->data[0].v_pointer = g_strdup_printf ("%ld", src_value->data[0].v_long); + + g_type_class_unref (class); +} +static void +value_transform_flags_string (const GValue *src_value, + GValue *dest_value) +{ + GFlagsClass *class = g_type_class_ref (G_VALUE_TYPE (src_value)); + GFlagsValue *flags_value = g_flags_get_first_value (class, src_value->data[0].v_ulong); + + if (flags_value) + { + GString *gstring = g_string_new (NULL); + guint v_flags = src_value->data[0].v_ulong; + + do + { + v_flags &= ~flags_value->value; + + if (gstring->str[0]) + g_string_append (gstring, " | "); + g_string_append (gstring, flags_value->value_name); + flags_value = g_flags_get_first_value (class, v_flags); + } + while (flags_value); + + if (v_flags) + dest_value->data[0].v_pointer = g_strdup_printf ("%s | %u", + gstring->str, + v_flags); + else + dest_value->data[0].v_pointer = g_strdup (gstring->str); + g_string_free (gstring, TRUE); + } + else + dest_value->data[0].v_pointer = g_strdup_printf ("%lu", src_value->data[0].v_ulong); + + g_type_class_unref (class); +} + + +/* registration + */ +void +g_value_transforms_init (void) +{ + /* some transformations are a bit questionable, + * we currently skip those + */ +#define SKIP____register_transform_func(type1,type2,transform_func) /* skip questionable transforms */ \ + (void)0 + + /* numeric types (plus to string) */ + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_CHAR, value_transform_int_int); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UCHAR, value_transform_int_u8); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_BOOLEAN, value_transform_int_bool); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_INT, value_transform_int_int); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UINT, value_transform_int_uint); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_LONG, value_transform_int_long); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_ULONG, value_transform_int_ulong); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_INT64, value_transform_int_int64); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_UINT64, value_transform_int_uint64); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_ENUM, value_transform_int_long); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_FLAGS, value_transform_int_ulong); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_FLOAT, value_transform_int_float); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_DOUBLE, value_transform_int_double); + g_value_register_transform_func (G_TYPE_CHAR, G_TYPE_STRING, value_transform_int_string); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_CHAR, value_transform_uint_s8); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UCHAR, value_transform_uint_uint); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_BOOLEAN, value_transform_uint_bool); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_INT, value_transform_uint_int); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UINT, value_transform_uint_uint); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_LONG, value_transform_uint_long); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_ULONG, value_transform_uint_ulong); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_INT64, value_transform_uint_int64); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_UINT64, value_transform_uint_uint64); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_ENUM, value_transform_uint_long); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_FLAGS, value_transform_uint_ulong); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_FLOAT, value_transform_uint_float); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_DOUBLE, value_transform_uint_double); + g_value_register_transform_func (G_TYPE_UCHAR, G_TYPE_STRING, value_transform_uint_string); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_CHAR, value_transform_int_s8); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UCHAR, value_transform_int_u8); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, value_transform_int_int); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_INT, value_transform_int_int); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UINT, value_transform_int_uint); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_LONG, value_transform_int_long); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_ULONG, value_transform_int_ulong); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_INT64, value_transform_int_int64); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_UINT64, value_transform_int_uint64); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_ENUM, value_transform_int_long); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_FLAGS, value_transform_int_ulong); + SKIP____register_transform_func (G_TYPE_BOOLEAN, G_TYPE_FLOAT, value_transform_int_float); + SKIP____register_transform_func (G_TYPE_BOOLEAN, G_TYPE_DOUBLE, value_transform_int_double); + g_value_register_transform_func (G_TYPE_BOOLEAN, G_TYPE_STRING, value_transform_bool_string); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_CHAR, value_transform_int_s8); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_UCHAR, value_transform_int_u8); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_BOOLEAN, value_transform_int_bool); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_INT, value_transform_int_int); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_UINT, value_transform_int_uint); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_LONG, value_transform_int_long); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_ULONG, value_transform_int_ulong); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_INT64, value_transform_int_int64); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_UINT64, value_transform_int_uint64); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_ENUM, value_transform_int_long); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_FLAGS, value_transform_int_ulong); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_FLOAT, value_transform_int_float); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_DOUBLE, value_transform_int_double); + g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, value_transform_int_string); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_CHAR, value_transform_uint_s8); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UCHAR, value_transform_uint_u8); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_BOOLEAN, value_transform_uint_bool); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_INT, value_transform_uint_int); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UINT, value_transform_uint_uint); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_LONG, value_transform_uint_long); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_ULONG, value_transform_uint_ulong); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_INT64, value_transform_uint_int64); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_UINT64, value_transform_uint_uint64); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_ENUM, value_transform_uint_long); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_FLAGS, value_transform_uint_ulong); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_FLOAT, value_transform_uint_float); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_DOUBLE, value_transform_uint_double); + g_value_register_transform_func (G_TYPE_UINT, G_TYPE_STRING, value_transform_uint_string); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_CHAR, value_transform_long_s8); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UCHAR, value_transform_long_u8); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_BOOLEAN, value_transform_long_bool); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_INT, value_transform_long_int); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UINT, value_transform_long_uint); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_LONG, value_transform_long_long); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_ULONG, value_transform_long_ulong); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_INT64, value_transform_long_int64); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_UINT64, value_transform_long_uint64); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_ENUM, value_transform_long_long); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_FLAGS, value_transform_long_ulong); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_FLOAT, value_transform_long_float); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_DOUBLE, value_transform_long_double); + g_value_register_transform_func (G_TYPE_LONG, G_TYPE_STRING, value_transform_long_string); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_CHAR, value_transform_ulong_s8); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UCHAR, value_transform_ulong_u8); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_BOOLEAN, value_transform_ulong_bool); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_INT, value_transform_ulong_int); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UINT, value_transform_ulong_uint); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_LONG, value_transform_ulong_long); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_ULONG, value_transform_ulong_ulong); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_INT64, value_transform_ulong_int64); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_UINT64, value_transform_ulong_uint64); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_ENUM, value_transform_ulong_long); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_FLAGS, value_transform_ulong_ulong); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_FLOAT, value_transform_ulong_float); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_DOUBLE, value_transform_ulong_double); + g_value_register_transform_func (G_TYPE_ULONG, G_TYPE_STRING, value_transform_ulong_string); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_CHAR, value_transform_int64_s8); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_UCHAR, value_transform_int64_u8); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_BOOLEAN, value_transform_int64_bool); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_INT, value_transform_int64_int); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_UINT, value_transform_int64_uint); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_LONG, value_transform_int64_long); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_ULONG, value_transform_int64_ulong); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_INT64, value_transform_int64_int64); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_UINT64, value_transform_int64_uint64); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_ENUM, value_transform_int64_long); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_FLAGS, value_transform_int64_ulong); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_FLOAT, value_transform_int64_float); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_DOUBLE, value_transform_int64_double); + g_value_register_transform_func (G_TYPE_INT64, G_TYPE_STRING, value_transform_int64_string); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_CHAR, value_transform_uint64_s8); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_UCHAR, value_transform_uint64_u8); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_BOOLEAN, value_transform_uint64_bool); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_INT, value_transform_uint64_int); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_UINT, value_transform_uint64_uint); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_LONG, value_transform_uint64_long); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_ULONG, value_transform_uint64_ulong); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_INT64, value_transform_uint64_int64); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_UINT64, value_transform_uint64_uint64); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_ENUM, value_transform_uint64_long); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_FLAGS, value_transform_uint64_ulong); +#ifndef _MSC_VER + /* required casts unsupported with msvc 5.0 */ + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_FLOAT, value_transform_uint64_float); + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_DOUBLE, value_transform_uint64_double); +#endif + g_value_register_transform_func (G_TYPE_UINT64, G_TYPE_STRING, value_transform_uint64_string); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_CHAR, value_transform_long_s8); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UCHAR, value_transform_long_u8); + SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_BOOLEAN, value_transform_long_bool); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_INT, value_transform_long_int); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UINT, value_transform_long_uint); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_LONG, value_transform_long_long); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_ULONG, value_transform_long_ulong); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_INT64, value_transform_long_int64); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_UINT64, value_transform_long_uint64); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_ENUM, value_transform_long_long); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_FLAGS, value_transform_long_ulong); + SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_FLOAT, value_transform_long_float); + SKIP____register_transform_func (G_TYPE_ENUM, G_TYPE_DOUBLE, value_transform_long_double); + g_value_register_transform_func (G_TYPE_ENUM, G_TYPE_STRING, value_transform_enum_string); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_CHAR, value_transform_ulong_s8); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UCHAR, value_transform_ulong_u8); + SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_BOOLEAN, value_transform_ulong_bool); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_INT, value_transform_ulong_int); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UINT, value_transform_ulong_uint); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_LONG, value_transform_ulong_long); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_ULONG, value_transform_ulong_ulong); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_INT64, value_transform_ulong_int64); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_UINT64, value_transform_ulong_uint64); + SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_ENUM, value_transform_ulong_long); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_FLAGS, value_transform_ulong_ulong); + SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_FLOAT, value_transform_ulong_float); + SKIP____register_transform_func (G_TYPE_FLAGS, G_TYPE_DOUBLE, value_transform_ulong_double); + g_value_register_transform_func (G_TYPE_FLAGS, G_TYPE_STRING, value_transform_flags_string); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_CHAR, value_transform_float_s8); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UCHAR, value_transform_float_u8); + SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_BOOLEAN, value_transform_float_bool); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_INT, value_transform_float_int); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UINT, value_transform_float_uint); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_LONG, value_transform_float_long); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_ULONG, value_transform_float_ulong); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_INT64, value_transform_float_int64); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_UINT64, value_transform_float_uint64); + SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_ENUM, value_transform_float_long); + SKIP____register_transform_func (G_TYPE_FLOAT, G_TYPE_FLAGS, value_transform_float_ulong); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_FLOAT, value_transform_float_float); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_DOUBLE, value_transform_float_double); + g_value_register_transform_func (G_TYPE_FLOAT, G_TYPE_STRING, value_transform_float_string); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_CHAR, value_transform_double_s8); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UCHAR, value_transform_double_u8); + SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_BOOLEAN, value_transform_double_bool); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_INT, value_transform_double_int); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UINT, value_transform_double_uint); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_LONG, value_transform_double_long); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_ULONG, value_transform_double_ulong); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_INT64, value_transform_double_int64); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_UINT64, value_transform_double_uint64); + SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_ENUM, value_transform_double_long); + SKIP____register_transform_func (G_TYPE_DOUBLE, G_TYPE_FLAGS, value_transform_double_ulong); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_FLOAT, value_transform_double_float); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_DOUBLE, value_transform_double_double); + g_value_register_transform_func (G_TYPE_DOUBLE, G_TYPE_STRING, value_transform_double_string); + /* string types */ + g_value_register_transform_func (G_TYPE_STRING, G_TYPE_STRING, value_transform_string_string); +} diff --git a/gobject/gvaluetypes.c b/gobject/gvaluetypes.c new file mode 100644 index 0000000..5713e48 --- /dev/null +++ b/gobject/gvaluetypes.c @@ -0,0 +1,1212 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include /* qsort() */ + +#include "gvaluetypes.h" +#include "gvaluecollector.h" +#include "gobject.h" +#include "gparam.h" +#include "gboxed.h" +#include "genums.h" +#include "gobjectalias.h" + + +/* --- value functions --- */ +static void +value_init_long0 (GValue *value) +{ + value->data[0].v_long = 0; +} + +static void +value_copy_long0 (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_long = src_value->data[0].v_long; +} + +static gchar* +value_lcopy_char (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gint8 *int8_p = collect_values[0].v_pointer; + + if (!int8_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *int8_p = value->data[0].v_int; + + return NULL; +} + +static gchar* +value_lcopy_boolean (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gboolean *bool_p = collect_values[0].v_pointer; + + if (!bool_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *bool_p = value->data[0].v_int; + + return NULL; +} + +static gchar* +value_collect_int (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_int = collect_values[0].v_int; + + return NULL; +} + +static gchar* +value_lcopy_int (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gint *int_p = collect_values[0].v_pointer; + + if (!int_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *int_p = value->data[0].v_int; + + return NULL; +} + +static gchar* +value_collect_long (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_long = collect_values[0].v_long; + + return NULL; +} + +static gchar* +value_lcopy_long (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + glong *long_p = collect_values[0].v_pointer; + + if (!long_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *long_p = value->data[0].v_long; + + return NULL; +} + +static void +value_init_int64 (GValue *value) +{ + value->data[0].v_int64 = 0; +} + +static void +value_copy_int64 (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_int64 = src_value->data[0].v_int64; +} + +static gchar* +value_collect_int64 (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_int64 = collect_values[0].v_int64; + + return NULL; +} + +static gchar* +value_lcopy_int64 (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gint64 *int64_p = collect_values[0].v_pointer; + + if (!int64_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *int64_p = value->data[0].v_int64; + + return NULL; +} + +static void +value_init_float (GValue *value) +{ + value->data[0].v_float = 0.0; +} + +static void +value_copy_float (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_float = src_value->data[0].v_float; +} + +static gchar* +value_collect_float (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_float = collect_values[0].v_double; + + return NULL; +} + +static gchar* +value_lcopy_float (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gfloat *float_p = collect_values[0].v_pointer; + + if (!float_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *float_p = value->data[0].v_float; + + return NULL; +} + +static void +value_init_double (GValue *value) +{ + value->data[0].v_double = 0.0; +} + +static void +value_copy_double (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_double = src_value->data[0].v_double; +} + +static gchar* +value_collect_double (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_double = collect_values[0].v_double; + + return NULL; +} + +static gchar* +value_lcopy_double (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gdouble *double_p = collect_values[0].v_pointer; + + if (!double_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *double_p = value->data[0].v_double; + + return NULL; +} + +static void +value_init_string (GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static void +value_free_string (GValue *value) +{ + if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) + g_free (value->data[0].v_pointer); +} + +static void +value_copy_string (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer); +} + +static gchar* +value_collect_string (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + if (!collect_values[0].v_pointer) + value->data[0].v_pointer = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + { + value->data[0].v_pointer = collect_values[0].v_pointer; + value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; + } + else + value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer); + + return NULL; +} + +static gchar* +value_lcopy_string (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gchar **string_p = collect_values[0].v_pointer; + + if (!string_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + if (!value->data[0].v_pointer) + *string_p = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + *string_p = value->data[0].v_pointer; + else + *string_p = g_strdup (value->data[0].v_pointer); + + return NULL; +} + +static void +value_init_pointer (GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static void +value_copy_pointer (const GValue *src_value, + GValue *dest_value) +{ + dest_value->data[0].v_pointer = src_value->data[0].v_pointer; +} + +static gpointer +value_peek_pointer0 (const GValue *value) +{ + return value->data[0].v_pointer; +} + +static gchar* +value_collect_pointer (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + value->data[0].v_pointer = collect_values[0].v_pointer; + + return NULL; +} + +static gchar* +value_lcopy_pointer (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + gpointer *pointer_p = collect_values[0].v_pointer; + + if (!pointer_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + *pointer_p = value->data[0].v_pointer; + + return NULL; +} + + +/* --- type initialization --- */ +void +g_value_types_init (void) +{ + GTypeInfo info = { + 0, /* class_size */ + NULL, /* base_init */ + NULL, /* base_destroy */ + NULL, /* class_init */ + NULL, /* class_destroy */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + NULL, /* value_table */ + }; + const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, }; + GType type; + + /* G_TYPE_CHAR / G_TYPE_UCHAR + */ + { + static const GTypeValueTable value_table = { + value_init_long0, /* value_init */ + NULL, /* value_free */ + value_copy_long0, /* value_copy */ + NULL, /* value_peek_pointer */ + "i", /* collect_format */ + value_collect_int, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_char, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_CHAR, g_intern_static_string ("gchar"), &info, &finfo, 0); + g_assert (type == G_TYPE_CHAR); + type = g_type_register_fundamental (G_TYPE_UCHAR, g_intern_static_string ("guchar"), &info, &finfo, 0); + g_assert (type == G_TYPE_UCHAR); + } + + /* G_TYPE_BOOLEAN + */ + { + static const GTypeValueTable value_table = { + value_init_long0, /* value_init */ + NULL, /* value_free */ + value_copy_long0, /* value_copy */ + NULL, /* value_peek_pointer */ + "i", /* collect_format */ + value_collect_int, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_boolean, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_BOOLEAN, g_intern_static_string ("gboolean"), &info, &finfo, 0); + g_assert (type == G_TYPE_BOOLEAN); + } + + /* G_TYPE_INT / G_TYPE_UINT + */ + { + static const GTypeValueTable value_table = { + value_init_long0, /* value_init */ + NULL, /* value_free */ + value_copy_long0, /* value_copy */ + NULL, /* value_peek_pointer */ + "i", /* collect_format */ + value_collect_int, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_int, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_INT, g_intern_static_string ("gint"), &info, &finfo, 0); + g_assert (type == G_TYPE_INT); + type = g_type_register_fundamental (G_TYPE_UINT, g_intern_static_string ("guint"), &info, &finfo, 0); + g_assert (type == G_TYPE_UINT); + } + + /* G_TYPE_LONG / G_TYPE_ULONG + */ + { + static const GTypeValueTable value_table = { + value_init_long0, /* value_init */ + NULL, /* value_free */ + value_copy_long0, /* value_copy */ + NULL, /* value_peek_pointer */ + "l", /* collect_format */ + value_collect_long, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_long, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_LONG, g_intern_static_string ("glong"), &info, &finfo, 0); + g_assert (type == G_TYPE_LONG); + type = g_type_register_fundamental (G_TYPE_ULONG, g_intern_static_string ("gulong"), &info, &finfo, 0); + g_assert (type == G_TYPE_ULONG); + } + + /* G_TYPE_INT64 / G_TYPE_UINT64 + */ + { + static const GTypeValueTable value_table = { + value_init_int64, /* value_init */ + NULL, /* value_free */ + value_copy_int64, /* value_copy */ + NULL, /* value_peek_pointer */ + "q", /* collect_format */ + value_collect_int64, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_int64, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_INT64, g_intern_static_string ("gint64"), &info, &finfo, 0); + g_assert (type == G_TYPE_INT64); + type = g_type_register_fundamental (G_TYPE_UINT64, g_intern_static_string ("guint64"), &info, &finfo, 0); + g_assert (type == G_TYPE_UINT64); + } + + /* G_TYPE_FLOAT + */ + { + static const GTypeValueTable value_table = { + value_init_float, /* value_init */ + NULL, /* value_free */ + value_copy_float, /* value_copy */ + NULL, /* value_peek_pointer */ + "d", /* collect_format */ + value_collect_float, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_float, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_FLOAT, g_intern_static_string ("gfloat"), &info, &finfo, 0); + g_assert (type == G_TYPE_FLOAT); + } + + /* G_TYPE_DOUBLE + */ + { + static const GTypeValueTable value_table = { + value_init_double, /* value_init */ + NULL, /* value_free */ + value_copy_double, /* value_copy */ + NULL, /* value_peek_pointer */ + "d", /* collect_format */ + value_collect_double, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_double, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_DOUBLE, g_intern_static_string ("gdouble"), &info, &finfo, 0); + g_assert (type == G_TYPE_DOUBLE); + } + + /* G_TYPE_STRING + */ + { + static const GTypeValueTable value_table = { + value_init_string, /* value_init */ + value_free_string, /* value_free */ + value_copy_string, /* value_copy */ + value_peek_pointer0, /* value_peek_pointer */ + "p", /* collect_format */ + value_collect_string, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_string, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_STRING, g_intern_static_string ("gchararray"), &info, &finfo, 0); + g_assert (type == G_TYPE_STRING); + } + + /* G_TYPE_POINTER + */ + { + static const GTypeValueTable value_table = { + value_init_pointer, /* value_init */ + NULL, /* value_free */ + value_copy_pointer, /* value_copy */ + value_peek_pointer0, /* value_peek_pointer */ + "p", /* collect_format */ + value_collect_pointer, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_pointer, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_POINTER, g_intern_static_string ("gpointer"), &info, &finfo, 0); + g_assert (type == G_TYPE_POINTER); + } +} + + +/* --- GValue functions --- */ +/** + * g_value_set_char: + * @value: a valid #GValue of type %G_TYPE_CHAR + * @v_char: character value to be set + * + * Set the contents of a %G_TYPE_CHAR #GValue to @v_char. + */ +void +g_value_set_char (GValue *value, + gchar v_char) +{ + g_return_if_fail (G_VALUE_HOLDS_CHAR (value)); + + value->data[0].v_int = v_char; +} + +/** + * g_value_get_char: + * @value: a valid #GValue of type %G_TYPE_CHAR + * + * Get the contents of a %G_TYPE_CHAR #GValue. + * + * Returns: character contents of @value + */ +gchar +g_value_get_char (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_CHAR (value), 0); + + return value->data[0].v_int; +} + +/** + * g_value_set_uchar: + * @value: a valid #GValue of type %G_TYPE_UCHAR + * @v_uchar: unsigned character value to be set + * + * Set the contents of a %G_TYPE_UCHAR #GValue to @v_uchar. + */ +void +g_value_set_uchar (GValue *value, + guchar v_uchar) +{ + g_return_if_fail (G_VALUE_HOLDS_UCHAR (value)); + + value->data[0].v_uint = v_uchar; +} + +/** + * g_value_get_uchar: + * @value: a valid #GValue of type %G_TYPE_UCHAR + * + * Get the contents of a %G_TYPE_UCHAR #GValue. + * + * Returns: unsigned character contents of @value + */ +guchar +g_value_get_uchar (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_UCHAR (value), 0); + + return value->data[0].v_uint; +} + +/** + * g_value_set_boolean: + * @value: a valid #GValue of type %G_TYPE_BOOLEAN + * @v_boolean: boolean value to be set + * + * Set the contents of a %G_TYPE_BOOLEAN #GValue to @v_boolean. + */ +void +g_value_set_boolean (GValue *value, + gboolean v_boolean) +{ + g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value)); + + value->data[0].v_int = v_boolean != FALSE; +} + +/** + * g_value_get_boolean: + * @value: a valid #GValue of type %G_TYPE_BOOLEAN + * + * Get the contents of a %G_TYPE_BOOLEAN #GValue. + * + * Returns: boolean contents of @value + */ +gboolean +g_value_get_boolean (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (value), 0); + + return value->data[0].v_int; +} + +/** + * g_value_set_int: + * @value: a valid #GValue of type %G_TYPE_INT + * @v_int: integer value to be set + * + * Set the contents of a %G_TYPE_INT #GValue to @v_int. + */ +void +g_value_set_int (GValue *value, + gint v_int) +{ + g_return_if_fail (G_VALUE_HOLDS_INT (value)); + + value->data[0].v_int = v_int; +} + +/** + * g_value_get_int: + * @value: a valid #GValue of type %G_TYPE_INT + * + * Get the contents of a %G_TYPE_INT #GValue. + * + * Returns: integer contents of @value + */ +gint +g_value_get_int (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_INT (value), 0); + + return value->data[0].v_int; +} + +/** + * g_value_set_uint: + * @value: a valid #GValue of type %G_TYPE_UINT + * @v_uint: unsigned integer value to be set + * + * Set the contents of a %G_TYPE_UINT #GValue to @v_uint. + */ +void +g_value_set_uint (GValue *value, + guint v_uint) +{ + g_return_if_fail (G_VALUE_HOLDS_UINT (value)); + + value->data[0].v_uint = v_uint; +} + +/** + * g_value_get_uint: + * @value: a valid #GValue of type %G_TYPE_UINT + * + * Get the contents of a %G_TYPE_UINT #GValue. + * + * Returns: unsigned integer contents of @value + */ +guint +g_value_get_uint (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_UINT (value), 0); + + return value->data[0].v_uint; +} + +/** + * g_value_set_long: + * @value: a valid #GValue of type %G_TYPE_LONG + * @v_long: long integer value to be set + * + * Set the contents of a %G_TYPE_LONG #GValue to @v_long. + */ +void +g_value_set_long (GValue *value, + glong v_long) +{ + g_return_if_fail (G_VALUE_HOLDS_LONG (value)); + + value->data[0].v_long = v_long; +} + +/** + * g_value_get_long: + * @value: a valid #GValue of type %G_TYPE_LONG + * + * Get the contents of a %G_TYPE_LONG #GValue. + * + * Returns: long integer contents of @value + */ +glong +g_value_get_long (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0); + + return value->data[0].v_long; +} + +/** + * g_value_set_ulong: + * @value: a valid #GValue of type %G_TYPE_ULONG + * @v_ulong: unsigned long integer value to be set + * + * Set the contents of a %G_TYPE_ULONG #GValue to @v_ulong. + */ +void +g_value_set_ulong (GValue *value, + gulong v_ulong) +{ + g_return_if_fail (G_VALUE_HOLDS_ULONG (value)); + + value->data[0].v_ulong = v_ulong; +} + +/** + * g_value_get_ulong: + * @value: a valid #GValue of type %G_TYPE_ULONG + * + * Get the contents of a %G_TYPE_ULONG #GValue. + * + * Returns: unsigned long integer contents of @value + */ +gulong +g_value_get_ulong (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_ULONG (value), 0); + + return value->data[0].v_ulong; +} + +/** + * g_value_get_int64: + * @value: a valid #GValue of type %G_TYPE_INT64 + * + * Get the contents of a %G_TYPE_INT64 #GValue. + * + * Returns: 64bit integer contents of @value + */ +void +g_value_set_int64 (GValue *value, + gint64 v_int64) +{ + g_return_if_fail (G_VALUE_HOLDS_INT64 (value)); + + value->data[0].v_int64 = v_int64; +} + +/** + * g_value_set_int64: + * @value: a valid #GValue of type %G_TYPE_INT64 + * @v_int64: 64bit integer value to be set + * + * Set the contents of a %G_TYPE_INT64 #GValue to @v_int64. + */ +gint64 +g_value_get_int64 (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_INT64 (value), 0); + + return value->data[0].v_int64; +} + +/** + * g_value_set_uint64: + * @value: a valid #GValue of type %G_TYPE_UINT64 + * @v_uint64: unsigned 64bit integer value to be set + * + * Set the contents of a %G_TYPE_UINT64 #GValue to @v_uint64. + */ +void +g_value_set_uint64 (GValue *value, + guint64 v_uint64) +{ + g_return_if_fail (G_VALUE_HOLDS_UINT64 (value)); + + value->data[0].v_uint64 = v_uint64; +} + +/** + * g_value_get_uint64: + * @value: a valid #GValue of type %G_TYPE_UINT64 + * + * Get the contents of a %G_TYPE_UINT64 #GValue. + * + * Returns: unsigned 64bit integer contents of @value + */ +guint64 +g_value_get_uint64 (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_UINT64 (value), 0); + + return value->data[0].v_uint64; +} + +/** + * g_value_set_float: + * @value: a valid #GValue of type %G_TYPE_FLOAT + * @v_float: float value to be set + * + * Set the contents of a %G_TYPE_FLOAT #GValue to @v_float. + */ +void +g_value_set_float (GValue *value, + gfloat v_float) +{ + g_return_if_fail (G_VALUE_HOLDS_FLOAT (value)); + + value->data[0].v_float = v_float; +} + +/** + * g_value_get_float: + * @value: a valid #GValue of type %G_TYPE_FLOAT + * + * Get the contents of a %G_TYPE_FLOAT #GValue. + * + * Returns: float contents of @value + */ +gfloat +g_value_get_float (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (value), 0); + + return value->data[0].v_float; +} + +/** + * g_value_set_double: + * @value: a valid #GValue of type %G_TYPE_DOUBLE + * @v_double: double value to be set + * + * Set the contents of a %G_TYPE_DOUBLE #GValue to @v_double. + */ +void +g_value_set_double (GValue *value, + gdouble v_double) +{ + g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value)); + + value->data[0].v_double = v_double; +} + +/** + * g_value_get_double: + * @value: a valid #GValue of type %G_TYPE_DOUBLE + * + * Get the contents of a %G_TYPE_DOUBLE #GValue. + * + * Returns: double contents of @value + */ +gdouble +g_value_get_double (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (value), 0); + + return value->data[0].v_double; +} + +/** + * g_value_set_string: + * @value: a valid #GValue of type %G_TYPE_STRING + * @v_string: caller-owned string to be duplicated for the #GValue + * + * Set the contents of a %G_TYPE_STRING #GValue to @v_string. + */ +void +g_value_set_string (GValue *value, + const gchar *v_string) +{ + gchar *new_val; + + g_return_if_fail (G_VALUE_HOLDS_STRING (value)); + + new_val = g_strdup (v_string); + + if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + value->data[1].v_uint = 0; + else + g_free (value->data[0].v_pointer); + + value->data[0].v_pointer = new_val; +} + +/** + * g_value_set_static_string: + * @value: a valid #GValue of type %G_TYPE_STRING + * @v_string: static string to be set + * + * Set the contents of a %G_TYPE_STRING #GValue to @v_string. + * The string is assumed to be static, and is thus not duplicated + * when setting the #GValue. + */ +void +g_value_set_static_string (GValue *value, + const gchar *v_string) +{ + g_return_if_fail (G_VALUE_HOLDS_STRING (value)); + + if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)) + g_free (value->data[0].v_pointer); + value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; + value->data[0].v_pointer = (gchar*) v_string; +} + +/** + * g_value_set_string_take_ownership: + * @value: a valid #GValue of type %G_TYPE_STRING + * @v_string: duplicated unowned string to be set + * + * This is an internal function introduced mainly for C marshallers. + * + * Deprecated: 2.4: Use g_value_take_string() instead. + */ +void +g_value_set_string_take_ownership (GValue *value, + gchar *v_string) +{ + g_value_take_string (value, v_string); +} + +/** + * g_value_take_string: + * @value: a valid #GValue of type %G_TYPE_STRING + * @v_string: string to take ownership of + * + * Sets the contents of a %G_TYPE_STRING #GValue to @v_string. + * + * Since: 2.4 + */ +void +g_value_take_string (GValue *value, + gchar *v_string) +{ + g_return_if_fail (G_VALUE_HOLDS_STRING (value)); + + if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + value->data[1].v_uint = 0; + else + g_free (value->data[0].v_pointer); + value->data[0].v_pointer = v_string; +} + +/** + * g_value_get_string: + * @value: a valid #GValue of type %G_TYPE_STRING + * + * Get the contents of a %G_TYPE_STRING #GValue. + * + * Returns: string content of @value + */ +G_CONST_RETURN gchar* +g_value_get_string (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); + + return value->data[0].v_pointer; +} + +/** + * g_value_dup_string: + * @value: a valid #GValue of type %G_TYPE_STRING + * + * Get a copy the contents of a %G_TYPE_STRING #GValue. + * + * Returns: a newly allocated copy of the string content of @value + */ +gchar* +g_value_dup_string (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); + + return g_strdup (value->data[0].v_pointer); +} + +/** + * g_value_set_pointer: + * @value: a valid #GValue of %G_TYPE_POINTER + * @v_pointer: pointer value to be set + * + * Set the contents of a pointer #GValue to @v_pointer. + */ +void +g_value_set_pointer (GValue *value, + gpointer v_pointer) +{ + g_return_if_fail (G_VALUE_HOLDS_POINTER (value)); + + value->data[0].v_pointer = v_pointer; +} + +/** + * g_value_get_pointer: + * @value: a valid #GValue of %G_TYPE_POINTER + * + * Get the contents of a pointer #GValue. + * + * Returns: pointer contents of @value + */ +gpointer +g_value_get_pointer (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value), NULL); + + return value->data[0].v_pointer; +} + +GType +g_gtype_get_type (void) +{ + static const GTypeInfo type_info = { 0, }; + static GType type; + if (!type) + type = g_type_register_static (G_TYPE_POINTER, g_intern_static_string ("GType"), &type_info, 0); + return type; +} + +/** + * g_value_set_gtype: + * @value: a valid #GValue of type %G_TYPE_GTYPE + * @v_gtype: #GType to be set + * + * Set the contents of a %G_TYPE_GTYPE #GValue to @v_gtype. + * + * Since: 2.12 + */ +void +g_value_set_gtype (GValue *value, + GType v_gtype) +{ + g_return_if_fail (G_VALUE_HOLDS_GTYPE (value)); + + value->data[0].v_long = v_gtype; + +} + +/** + * g_value_get_gtype: + * @value: a valid #GValue of type %G_TYPE_GTYPE + * + * Get the contents of a %G_TYPE_GTYPE #GValue. + * + * Since: 2.12 + * + * Returns: the #GType stored in @value + */ +GType +g_value_get_gtype (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_GTYPE (value), 0); + + return value->data[0].v_long; +} + +/** + * g_strdup_value_contents: + * @value: #GValue which contents are to be described. + * + * Return a newly allocated string, which describes the contents of a + * #GValue. The main purpose of this function is to describe #GValue + * contents for debugging output, the way in which the contents are + * described may change between different GLib versions. + * + * Returns: Newly allocated string. + */ +gchar* +g_strdup_value_contents (const GValue *value) +{ + const gchar *src; + gchar *contents; + + g_return_val_if_fail (G_IS_VALUE (value), NULL); + + if (G_VALUE_HOLDS_STRING (value)) + { + src = g_value_get_string (value); + + if (!src) + contents = g_strdup ("NULL"); + else + { + gchar *s = g_strescape (src, NULL); + + contents = g_strdup_printf ("\"%s\"", s); + g_free (s); + } + } + else if (g_value_type_transformable (G_VALUE_TYPE (value), G_TYPE_STRING)) + { + GValue tmp_value = { 0, }; + gchar *s; + + g_value_init (&tmp_value, G_TYPE_STRING); + g_value_transform (value, &tmp_value); + s = g_strescape (g_value_get_string (&tmp_value), NULL); + g_value_unset (&tmp_value); + if (G_VALUE_HOLDS_ENUM (value) || G_VALUE_HOLDS_FLAGS (value)) + contents = g_strdup_printf ("((%s) %s)", + g_type_name (G_VALUE_TYPE (value)), + s); + else + contents = g_strdup (s ? s : "NULL"); + g_free (s); + } + else if (g_value_fits_pointer (value)) + { + gpointer p = g_value_peek_pointer (value); + + if (!p) + contents = g_strdup ("NULL"); + else if (G_VALUE_HOLDS_OBJECT (value)) + contents = g_strdup_printf ("((%s*) %p)", G_OBJECT_TYPE_NAME (p), p); + else if (G_VALUE_HOLDS_PARAM (value)) + contents = g_strdup_printf ("((%s*) %p)", G_PARAM_SPEC_TYPE_NAME (p), p); + else if (G_VALUE_HOLDS_BOXED (value)) + contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p); + else if (G_VALUE_HOLDS_POINTER (value)) + contents = g_strdup_printf ("((gpointer) %p)", p); + else + contents = g_strdup ("???"); + } + else + contents = g_strdup ("???"); + + return contents; +} + +/** + * g_pointer_type_register_static: + * @name: the name of the new pointer type. + * + * Creates a new %G_TYPE_POINTER derived type id for a new + * pointer type with name @name. + * + * Returns: a new %G_TYPE_POINTER derived type id for @name. + */ +GType +g_pointer_type_register_static (const gchar *name) +{ + static const GTypeInfo type_info = { + 0, /* class_size */ + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL, /* instance_init */ + NULL /* value_table */ + }; + GType type; + + g_return_val_if_fail (name != NULL, 0); + g_return_val_if_fail (g_type_from_name (name) == 0, 0); + + type = g_type_register_static (G_TYPE_POINTER, name, &type_info, 0); + + return type; +} + +#define __G_VALUETYPES_C__ +#include "gobjectaliasdef.c" diff --git a/gobject/gvaluetypes.h b/gobject/gvaluetypes.h new file mode 100644 index 0000000..6385783 --- /dev/null +++ b/gobject/gvaluetypes.h @@ -0,0 +1,243 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gvaluetypes.h: GLib default values + */ +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_VALUETYPES_H__ +#define __G_VALUETYPES_H__ + +#include + +G_BEGIN_DECLS + +/* --- type macros --- */ +/** + * G_VALUE_HOLDS_CHAR: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_CHAR. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_CHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_CHAR)) +/** + * G_VALUE_HOLDS_UCHAR: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_UCHAR. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_UCHAR(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UCHAR)) +/** + * G_VALUE_HOLDS_BOOLEAN: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_BOOLEAN. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_BOOLEAN(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_BOOLEAN)) +/** + * G_VALUE_HOLDS_INT: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_INT. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_INT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT)) +/** + * G_VALUE_HOLDS_UINT: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_UINT. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_UINT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT)) +/** + * G_VALUE_HOLDS_LONG: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_LONG. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_LONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG)) +/** + * G_VALUE_HOLDS_ULONG: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_ULONG. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_ULONG(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG)) +/** + * G_VALUE_HOLDS_INT64: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_INT64. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_INT64(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT64)) +/** + * G_VALUE_HOLDS_UINT64: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_UINT64. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_UINT64(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT64)) +/** + * G_VALUE_HOLDS_FLOAT: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_FLOAT. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_FLOAT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT)) +/** + * G_VALUE_HOLDS_DOUBLE: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_DOUBLE. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_DOUBLE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE)) +/** + * G_VALUE_HOLDS_STRING: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_STRING. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_STRING(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING)) +/** + * G_VALUE_HOLDS_POINTER: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_POINTER. + * + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_POINTER(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER)) +/** + * G_TYPE_GTYPE: + * + * The type for #GType. + */ +#define G_TYPE_GTYPE (g_gtype_get_type()) +/** + * G_VALUE_HOLDS_GTYPE: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_GTYPE. + * + * Since: 2.12 + * Returns: %TRUE on success. + */ +#define G_VALUE_HOLDS_GTYPE(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_GTYPE)) + + +/* --- prototypes --- */ +void g_value_set_char (GValue *value, + gchar v_char); +gchar g_value_get_char (const GValue *value); +void g_value_set_uchar (GValue *value, + guchar v_uchar); +guchar g_value_get_uchar (const GValue *value); +void g_value_set_boolean (GValue *value, + gboolean v_boolean); +gboolean g_value_get_boolean (const GValue *value); +void g_value_set_int (GValue *value, + gint v_int); +gint g_value_get_int (const GValue *value); +void g_value_set_uint (GValue *value, + guint v_uint); +guint g_value_get_uint (const GValue *value); +void g_value_set_long (GValue *value, + glong v_long); +glong g_value_get_long (const GValue *value); +void g_value_set_ulong (GValue *value, + gulong v_ulong); +gulong g_value_get_ulong (const GValue *value); +void g_value_set_int64 (GValue *value, + gint64 v_int64); +gint64 g_value_get_int64 (const GValue *value); +void g_value_set_uint64 (GValue *value, + guint64 v_uint64); +guint64 g_value_get_uint64 (const GValue *value); +void g_value_set_float (GValue *value, + gfloat v_float); +gfloat g_value_get_float (const GValue *value); +void g_value_set_double (GValue *value, + gdouble v_double); +gdouble g_value_get_double (const GValue *value); +void g_value_set_string (GValue *value, + const gchar *v_string); +void g_value_set_static_string (GValue *value, + const gchar *v_string); +G_CONST_RETURN gchar* g_value_get_string (const GValue *value); +gchar* g_value_dup_string (const GValue *value); +void g_value_set_pointer (GValue *value, + gpointer v_pointer); +gpointer g_value_get_pointer (const GValue *value); +GType g_gtype_get_type (void); +void g_value_set_gtype (GValue *value, + GType v_gtype); +GType g_value_get_gtype (const GValue *value); + + +/* Convenience for registering new pointer types */ +GType g_pointer_type_register_static (const gchar *name); + +/* debugging aid, describe value contents as string */ +gchar* g_strdup_value_contents (const GValue *value); + + +void g_value_take_string (GValue *value, + gchar *v_string); +#ifndef G_DISABLE_DEPRECATED +void g_value_set_string_take_ownership (GValue *value, + gchar *v_string); +#endif + + +/* humpf, need a C representable type name for G_TYPE_STRING */ +/** + * gchararray: + * + * A C representable type name for #G_TYPE_STRING. + */ +typedef gchar* gchararray; + + +G_END_DECLS + +#endif /* __G_VALUETYPES_H__ */ diff --git a/gobject/libgobject-gdb.py.in b/gobject/libgobject-gdb.py.in new file mode 100644 index 0000000..6ebd0dc --- /dev/null +++ b/gobject/libgobject-gdb.py.in @@ -0,0 +1,10 @@ +import sys +import gdb + +# Update module path. +dir = '@datadir@/glib-2.0/gdb' +if not dir in sys.path: + sys.path.insert(0, dir) + +from gobject import register +register (gdb.current_objfile ()) diff --git a/gobject/makefile.msc.in b/gobject/makefile.msc.in new file mode 100644 index 0000000..f518232 --- /dev/null +++ b/gobject/makefile.msc.in @@ -0,0 +1,91 @@ +## Makefile for building the gobject dll with Microsoft C +## Use: nmake -f makefile.msc install + +TOP = ..\.. + +!INCLUDE ..\build\win32\make.msc + +################################################################ + +INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I . -I ..\glib +DEFINES = -DHAVE_CONFIG_H -DGOBJECT_COMPILATION -DG_LOG_DOMAIN=\"GLib-GObject\" \ + -DG_ENABLE_DEBUG +# -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS +# -DG_DISABLE_CAST_CHECKS + +all : \ + glib-genmarshal.exe \ + gmarshal.h \ + gmarshal.c \ + gobjectalias.h \ + gobjectaliasdef.c \ + gmarshal.strings \ + gobject-query.exe \ + libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll \ + gobject-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib \ + testgobject.exe + +gobject_OBJECTS = \ + gboxed.obj \ + gclosure.obj \ + genums.obj \ + gobject.obj \ + gparam.obj \ + gparamspecs.obj \ + gsignal.obj \ + gsourceclosure.obj \ + gtype.obj \ + gtypemodule.obj \ + gtypeplugin.obj \ + gvalue.obj \ + gvaluearray.obj \ + gvaluetypes.obj \ + gvaluetransform.obj + +gobjectalias.h: gobject.symbols + perl makegobjectalias.pl < gobject.symbols > gobjectalias.h + +gobjectaliasdef.c: gobject.symbols + perl makegobjectalias.pl -def < gobject.symbols > gobjectaliasdef.c + +gobject.def: gobject.symbols + echo EXPORTS > gobject.def + cl /EP -DINCLUDE_VARIABLES -DG_OS_WIN32 -DALL_FILES \ + -DG_GNUC_MALLOC= -DG_GNUC_CONST= -DG_GNUC_NULL_TERMINATED= -DG_GNUC_NORETURN= \ + -DG_GNUC_PRINTF=;G_GNUC_PRINTF gobject.symbols >> gobject.def + +gobject.res : gobject.rc + rc -DBUILDNUMBER=0 -r -fo gobject.res gobject.rc + +gmarshal.h : gmarshal.list glib-genmarshal.exe + echo #ifndef __G_MARSHAL_H__ > xgen-gmh + echo #define __G_MARSHAL_H__ >> xgen-gmh + glib-genmarshal --nostdinc --prefix=g_cclosure_marshal gmarshal.list --header >> xgen-gmh + echo #endif /* __G_MARSHAL_H__ */ >> xgen-gmh + copy xgen-gmh gmarshal.h + +gmarshal.c: gmarshal.list gmarshal.h glib-genmarshal.exe + glib-genmarshal --nostdinc --prefix=g_cclosure_marshal gmarshal.list --body > gmarshal.c + +libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(gobject_OBJECTS) gobject.def gobject.res + $(CC) $(CFLAGS) -Fm -LD -Fe$@ $(gobject_OBJECTS) gobject.res \ + ..\glib\glib-2.0.lib $(LDFLAGS) /implib:gobject-2.0.lib /def:gobject.def || del $@ + +gobject-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib : $(gobject_OBJECTS) + lib /out:$@ $(gobject_OBJECTS) + +# link glib's static version to avoid installing +glib-genmarshal.exe : glib-genmarshal.c gmarshal.strings + $(CC) -Fe$@ $(CFLAGS) -UGOBJECT_COMPILATION glib-genmarshal.c \ + ..\glib\glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib user32.lib advapi32.lib ole32.lib shell32.lib $(INTL_LIBS) + +gobject-query.exe : gobject-query.c libgobject-2.0-@LT_CURRENT_MINUS_AGE@.dll + $(CC) -Fe$@ $(CFLAGS) -UGOBJECT_COMPILATION gobject-query.c \ + ..\glib\glib-2.0.lib gobject-2.0.lib user32.lib advapi32.lib $(INTL_LIBS) + +gmarshal.strings : gmarshal.list + perl marshal-genstrings.pl > gmarshal.strings + +.c.exe : + $(CC) $(CFLAGS) -c $< + $(CC) $(CFLAGS) -Fe$@ $< gobject-2.0.lib ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib $(LDFLAGS) user32.lib /subsystem:console diff --git a/gobject/makegobjectalias.pl b/gobject/makegobjectalias.pl new file mode 100755 index 0000000..9094222 --- /dev/null +++ b/gobject/makegobjectalias.pl @@ -0,0 +1,137 @@ +#!/usr/bin/perl -w + +my $do_def = 0; + +if (($#ARGV >= 0) && ($ARGV[0] eq "-def")) { + shift; + $do_def = 1; +} + +print <) { + + # ignore empty lines + next if /^\s*$/; + + # skip comments + if ($_ =~ /^\s*\/\*/) + { + $in_comment = 1; + } + + if ($in_comment) + { + if ($_ =~ /\*\/\s$/) + { + $in_comment = 0; + } + + next; + } + + # handle ifdefs + if ($_ =~ /^\#endif/) + { + if (!$in_skipped_section) + { + print $_; + } + + $in_skipped_section = 0; + + next; + } + + if ($_ =~ /^\#ifdef\s+(INCLUDE_VARIABLES|INCLUDE_INTERNAL_SYMBOLS|ALL_FILES)/) + { + $in_skipped_section = 1; + } + + if ($in_skipped_section) + { + next; + } + + if ($_ =~ /^\#ifn?def\s+G/) + { + print $_; + + next; + } + + if ($_ =~ /^\#if.*(IN_FILE|IN_HEADER)/) + { + print $_; + + next; + } + + chop; + my $str = $_; + my @words; + my $attributes = ""; + + @words = split(/ /, $str); + $str = shift(@words); + chomp($str); + my $alias = "IA__".$str; + + # Drop any Win32 specific .def file syntax, but keep attributes + foreach $word (@words) { + $attributes = "$attributes $word" unless $word eq "PRIVATE"; + } + + if (!$do_def) { + print <) { + next unless /^[A-Z]/; + s/^/"g_cclosure_marshal_/; s/:/__/; s/,/_/g; s/$/",/; + print; +} diff --git a/gobject/pltcheck.sh b/gobject/pltcheck.sh new file mode 100755 index 0000000..00d9e9d --- /dev/null +++ b/gobject/pltcheck.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +LANG=C + +status=0 + +if ! which readelf 2>/dev/null >/dev/null; then + echo "'readelf' not found; skipping test" + exit 0 +fi + +for so in .libs/lib*.so; do + echo Checking $so for local PLT entries + readelf -r $so | grep 'JU\?MP_SLOT\?' | grep '\ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestObject" +#include + +/* --- TestIface --- */ +#define TEST_TYPE_IFACE (test_iface_get_type ()) +#define TEST_IFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_IFACE, TestIface)) +#define TEST_IS_IFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_IFACE)) +#define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass)) +typedef struct _TestIface TestIface; +typedef struct _TestIfaceClass TestIfaceClass; +struct _TestIfaceClass +{ + GTypeInterface base_iface; + void (*print_string) (TestIface *tiobj, + const gchar *string); +}; +static void iface_base_init (TestIfaceClass *iface); +static void iface_base_finalize (TestIfaceClass *iface); +static void print_foo (TestIface *tiobj, + const gchar *string); +static GType +test_iface_get_type (void) +{ + static GType test_iface_type = 0; + + if (!test_iface_type) + { + static const GTypeInfo test_iface_info = + { + sizeof (TestIfaceClass), + (GBaseInitFunc) iface_base_init, /* base_init */ + (GBaseFinalizeFunc) iface_base_finalize, /* base_finalize */ + }; + + test_iface_type = g_type_register_static (G_TYPE_INTERFACE, "TestIface", &test_iface_info, 0); + g_type_interface_add_prerequisite (test_iface_type, G_TYPE_OBJECT); + } + + return test_iface_type; +} +static guint iface_base_init_count = 0; +static void +iface_base_init (TestIfaceClass *iface) +{ + iface_base_init_count++; + if (iface_base_init_count == 1) + { + /* add signals here */ + } +} +static void +iface_base_finalize (TestIfaceClass *iface) +{ + iface_base_init_count--; + if (iface_base_init_count == 0) + { + /* destroy signals here */ + } +} +static void +print_foo (TestIface *tiobj, + const gchar *string) +{ + if (!string) + string = ""; + g_print ("Iface-FOO: \"%s\" from %p\n", string, tiobj); +} +static void +test_object_test_iface_init (gpointer giface, + gpointer iface_data) +{ + TestIfaceClass *iface = giface; + + g_assert (iface_data == GUINT_TO_POINTER (42)); + + g_assert (G_TYPE_FROM_INTERFACE (iface) == TEST_TYPE_IFACE); + + /* assert iface_base_init() was already called */ + g_assert (iface_base_init_count > 0); + + /* initialize stuff */ + iface->print_string = print_foo; +} +static void +iface_print_string (TestIface *tiobj, + const gchar *string) +{ + TestIfaceClass *iface; + + g_return_if_fail (TEST_IS_IFACE (tiobj)); + g_return_if_fail (G_IS_OBJECT (tiobj)); /* ensured through prerequisite */ + + iface = TEST_IFACE_GET_CLASS (tiobj); + g_object_ref (tiobj); + iface->print_string (tiobj, string); + g_object_unref (tiobj); +} + + +/* --- TestObject --- */ +#define TEST_TYPE_OBJECT (test_object_get_type ()) +#define TEST_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), TEST_TYPE_OBJECT, TestObject)) +#define TEST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_OBJECT, TestObjectClass)) +#define TEST_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), TEST_TYPE_OBJECT)) +#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT)) +#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass)) +#define TEST_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TEST_TYPE_OBJECT, TestObjectPrivate)) +typedef struct _TestObject TestObject; +typedef struct _TestObjectClass TestObjectClass; +typedef struct _TestObjectPrivate TestObjectPrivate; +struct _TestObject +{ + GObject parent_instance; +}; +struct _TestObjectClass +{ + GObjectClass parent_class; + + gchar* (*test_signal) (TestObject *tobject, + TestIface *iface_object, + gpointer tdata); +}; +struct _TestObjectPrivate +{ + int dummy1; + gdouble dummy2; +}; +static void test_object_class_init (TestObjectClass *class); +static void test_object_init (TestObject *tobject); +static gboolean test_signal_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer data); +static gchar* test_object_test_signal (TestObject *tobject, + TestIface *iface_object, + gpointer tdata); +static GType +test_object_get_type (void) +{ + static GType test_object_type = 0; + + if (!test_object_type) + { + static const GTypeInfo test_object_info = + { + sizeof (TestObjectClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) test_object_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (TestObject), + 5, /* n_preallocs */ + (GInstanceInitFunc) test_object_init, + }; + GInterfaceInfo iface_info = { test_object_test_iface_init, NULL, GUINT_TO_POINTER (42) }; + + test_object_type = g_type_register_static (G_TYPE_OBJECT, "TestObject", &test_object_info, 0); + g_type_add_interface_static (test_object_type, TEST_TYPE_IFACE, &iface_info); + } + + return test_object_type; +} +static void +test_object_class_init (TestObjectClass *class) +{ + /* GObjectClass *gobject_class = G_OBJECT_CLASS (class); */ + + class->test_signal = test_object_test_signal; + + g_signal_new ("test-signal", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP, + G_STRUCT_OFFSET (TestObjectClass, test_signal), + test_signal_accumulator, NULL, + g_cclosure_marshal_STRING__OBJECT_POINTER, + G_TYPE_STRING, 2, TEST_TYPE_IFACE, G_TYPE_POINTER); + + g_type_class_add_private (class, sizeof (TestObjectPrivate)); +} +static void +test_object_init (TestObject *tobject) +{ + TestObjectPrivate *priv; + + priv = TEST_OBJECT_GET_PRIVATE (tobject); + + g_assert (priv); + g_assert ((gchar *)priv >= (gchar *)tobject + sizeof (TestObject)); + + priv->dummy1 = 54321; +} +/* Check to see if private data initialization in the + * instance init function works. + */ +static void +test_object_check_private_init (TestObject *tobject) +{ + TestObjectPrivate *priv; + + priv = TEST_OBJECT_GET_PRIVATE (tobject); + + g_print ("private data during initialization: %u == %u\n", priv->dummy1, 54321); + g_assert (priv->dummy1 == 54321); +} +static gboolean +test_signal_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer data) +{ + gchar *accu_string = g_value_get_string (return_accu); + gchar *new_string = g_value_get_string (handler_return); + gchar *result_string; + + if (accu_string) + result_string = g_strconcat (accu_string, new_string, NULL); + else if (new_string) + result_string = g_strdup (new_string); + else + result_string = NULL; + + g_value_take_string (return_accu, result_string); + + return TRUE; +} +static gchar* +test_object_test_signal (TestObject *tobject, + TestIface *iface_object, + gpointer tdata) +{ + g_message ("::test_signal default_handler called"); + + g_return_val_if_fail (TEST_IS_IFACE (iface_object), NULL); + + return g_strdup (""); +} + + +/* --- TestIface for DerivedObject --- */ +static void +print_bar (TestIface *tiobj, + const gchar *string) +{ + TestIfaceClass *parent_iface; + + g_return_if_fail (TEST_IS_IFACE (tiobj)); + + if (!string) + string = ""; + g_print ("Iface-BAR: \"%s\" from %p\n", string, tiobj); + + g_print ("chaining: "); + parent_iface = g_type_interface_peek_parent (TEST_IFACE_GET_CLASS (tiobj)); + parent_iface->print_string (tiobj, string); + + g_assert (g_type_interface_peek_parent (parent_iface) == NULL); +} + +static void +derived_object_test_iface_init (gpointer giface, + gpointer iface_data) +{ + TestIfaceClass *iface = giface; + + g_assert (iface_data == GUINT_TO_POINTER (87)); + + g_assert (G_TYPE_FROM_INTERFACE (iface) == TEST_TYPE_IFACE); + + /* assert test_object_test_iface_init() was already called */ + g_assert (iface->print_string == print_foo); + + /* override stuff */ + iface->print_string = print_bar; +} + + +/* --- DerivedObject --- */ +#define DERIVED_TYPE_OBJECT (derived_object_get_type ()) +#define DERIVED_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), DERIVED_TYPE_OBJECT, DerivedObject)) +#define DERIVED_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DERIVED_TYPE_OBJECT, DerivedObjectClass)) +#define DERIVED_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), DERIVED_TYPE_OBJECT)) +#define DERIVED_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DERIVED_TYPE_OBJECT)) +#define DERIVED_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DERIVED_TYPE_OBJECT, DerivedObjectClass)) +#define DERIVED_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DERIVED_TYPE_OBJECT, DerivedObjectPrivate)) +typedef struct _DerivedObject DerivedObject; +typedef struct _TestObjectClass DerivedObjectClass; +typedef struct _DerivedObjectPrivate DerivedObjectPrivate; +struct _DerivedObject +{ + TestObject parent_instance; + int dummy1; + int dummy2; +}; +struct _DerivedObjectPrivate +{ + char dummy; +}; +static void derived_object_class_init (DerivedObjectClass *class); +static void derived_object_init (DerivedObject *dobject); +GType +derived_object_get_type (void) +{ + static GType derived_object_type = 0; + + if (!derived_object_type) + { + static const GTypeInfo derived_object_info = + { + sizeof (DerivedObjectClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) derived_object_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (DerivedObject), + 5, /* n_preallocs */ + (GInstanceInitFunc) derived_object_init, + }; + GInterfaceInfo iface_info = { derived_object_test_iface_init, NULL, GUINT_TO_POINTER (87) }; + + derived_object_type = g_type_register_static (TEST_TYPE_OBJECT, "DerivedObject", &derived_object_info, 0); + g_type_add_interface_static (derived_object_type, TEST_TYPE_IFACE, &iface_info); + } + + return derived_object_type; +} +static void +derived_object_class_init (DerivedObjectClass *class) +{ + g_type_class_add_private (class, sizeof (DerivedObjectPrivate)); +} +static void +derived_object_init (DerivedObject *dobject) +{ + TestObjectPrivate *test_priv; + DerivedObjectPrivate *derived_priv; + + derived_priv = DERIVED_OBJECT_GET_PRIVATE (dobject); + + g_assert (derived_priv); + g_assert ((gchar *)derived_priv >= (gchar *)TEST_OBJECT_GET_PRIVATE (dobject) + sizeof (TestObjectPrivate)); + + test_priv = TEST_OBJECT_GET_PRIVATE (dobject); + + g_assert (test_priv); + g_assert ((gchar *)test_priv >= (gchar *)dobject + sizeof (TestObject)); + +} + +/* --- main --- */ +int +main (int argc, + char *argv[]) +{ + GTypeInfo info = { 0, }; + GTypeFundamentalInfo finfo = { 0, }; + GType type; + TestObject *sigarg; + DerivedObject *dobject; + TestObjectPrivate *priv; + gchar *string = NULL; + + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init_with_debug_flags (G_TYPE_DEBUG_OBJECTS | G_TYPE_DEBUG_SIGNALS); + + /* test new fundamentals */ + g_assert (G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST) == g_type_fundamental_next ()); + type = g_type_register_fundamental (g_type_fundamental_next (), "FooShadow1", &info, &finfo, 0); + g_assert (G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 1) == g_type_fundamental_next ()); + type = g_type_register_fundamental (g_type_fundamental_next (), "FooShadow2", &info, &finfo, 0); + g_assert (G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 2) == g_type_fundamental_next ()); + g_assert (g_type_from_name ("FooShadow1") == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST)); + g_assert (g_type_from_name ("FooShadow2") == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 1)); + + /* to test past class initialization interface setups, create the class here */ + g_type_class_ref (TEST_TYPE_OBJECT); + + dobject = g_object_new (DERIVED_TYPE_OBJECT, NULL); + test_object_check_private_init (TEST_OBJECT (dobject)); + + sigarg = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_print ("MAIN: emit test-signal:\n"); + g_signal_emit_by_name (dobject, "test-signal", sigarg, NULL, &string); + g_message ("signal return: \"%s\"", string); + g_assert (strcmp (string, "") == 0); + g_free (string); + + g_print ("MAIN: call iface print-string on test and derived object:\n"); + iface_print_string (TEST_IFACE (sigarg), "iface-string-from-test-type"); + iface_print_string (TEST_IFACE (dobject), "iface-string-from-derived-type"); + + priv = TEST_OBJECT_GET_PRIVATE (dobject); + g_print ("private data after initialization: %u == %u\n", priv->dummy1, 54321); + g_assert (priv->dummy1 == 54321); + + g_object_unref (sigarg); + g_object_unref (dobject); + + g_message ("%s done", argv[0]); + + return 0; +} diff --git a/gobject/tests/Makefile.am b/gobject/tests/Makefile.am new file mode 100644 index 0000000..33b3e0b --- /dev/null +++ b/gobject/tests/Makefile.am @@ -0,0 +1,12 @@ +include $(top_srcdir)/Makefile.decl + +INCLUDES = -g -I$(top_srcdir) -I$(top_srcdir)/glib $(GLIB_DEBUG_FLAGS) + +noinst_PROGRAMS = $(TEST_PROGS) +libgobject_LDADD = ../libgobject-2.0.la $(top_builddir)/gthread/libgthread-2.0.la $(top_builddir)/glib/libglib-2.0.la + +TEST_PROGS += threadtests dynamictests +threadtests_SOURCES = threadtests.c +threadtests_LDADD = $(libgobject_LDADD) +dynamictests_SOURCES = dynamictests.c +dynamictests_LDADD = $(libgobject_LDADD) diff --git a/gobject/tests/Makefile.in b/gobject/tests/Makefile.in new file mode 100644 index 0000000..bdb7b3c --- /dev/null +++ b/gobject/tests/Makefile.in @@ -0,0 +1,665 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +noinst_PROGRAMS = $(am__EXEEXT_1) +subdir = gobject/tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = threadtests$(EXEEXT) dynamictests$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am_dynamictests_OBJECTS = dynamictests.$(OBJEXT) +dynamictests_OBJECTS = $(am_dynamictests_OBJECTS) +dynamictests_DEPENDENCIES = $(libgobject_LDADD) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am_threadtests_OBJECTS = threadtests.$(OBJEXT) +threadtests_OBJECTS = $(am_threadtests_OBJECTS) +threadtests_DEPENDENCIES = $(libgobject_LDADD) +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(dynamictests_SOURCES) $(threadtests_SOURCES) +DIST_SOURCES = $(dynamictests_SOURCES) $(threadtests_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = threadtests dynamictests +INCLUDES = -g -I$(top_srcdir) -I$(top_srcdir)/glib $(GLIB_DEBUG_FLAGS) +libgobject_LDADD = ../libgobject-2.0.la $(top_builddir)/gthread/libgthread-2.0.la $(top_builddir)/glib/libglib-2.0.la +threadtests_SOURCES = threadtests.c +threadtests_LDADD = $(libgobject_LDADD) +dynamictests_SOURCES = dynamictests.c +dynamictests_LDADD = $(libgobject_LDADD) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gobject/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gobject/tests/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-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 +dynamictests$(EXEEXT): $(dynamictests_OBJECTS) $(dynamictests_DEPENDENCIES) + @rm -f dynamictests$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dynamictests_OBJECTS) $(dynamictests_LDADD) $(LIBS) +threadtests$(EXEEXT): $(threadtests_OBJECTS) $(threadtests_DEPENDENCIES) + @rm -f threadtests$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(threadtests_OBJECTS) $(threadtests_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynamictests.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadtests.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstPROGRAMS ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gobject/tests/dynamictests.c b/gobject/tests/dynamictests.c new file mode 100644 index 0000000..1f2a5b7 --- /dev/null +++ b/gobject/tests/dynamictests.c @@ -0,0 +1,235 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Imendio AB + * Authors: Tim Janik + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#include +#include + +/* This test tests the macros for defining dynamic types. + */ + +static GMutex *sync_mutex = NULL; +static gboolean loaded = FALSE; + +/* MODULE */ +typedef struct _TestModule TestModule; +typedef struct _TestModuleClass TestModuleClass; + +#define TEST_TYPE_MODULE (test_module_get_type ()) +#define TEST_MODULE(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TEST_TYPE_MODULE, TestModule)) +#define TEST_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), TEST_TYPE_MODULE, TestModuleClass)) +#define TEST_IS_MODULE(module) (G_TYPE_CHECK_INSTANCE_TYPE ((module), TEST_TYPE_MODULE)) +#define TEST_IS_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), TEST_TYPE_MODULE)) +#define TEST_MODULE_GET_CLASS(module) (G_TYPE_INSTANCE_GET_CLASS ((module), TEST_TYPE_MODULE, TestModuleClass)) +typedef void (*TestModuleRegisterFunc) (GTypeModule *module); + +struct _TestModule +{ + GTypeModule parent_instance; + + TestModuleRegisterFunc register_func; +}; + +struct _TestModuleClass +{ + GTypeModuleClass parent_class; +}; + +static GType test_module_get_type (void); + +static gboolean +test_module_load (GTypeModule *module) +{ + TestModule *test_module = TEST_MODULE (module); + + test_module->register_func (module); + + return TRUE; +} + +static void +test_module_unload (GTypeModule *module) +{ +} + +static void +test_module_class_init (TestModuleClass *class) +{ + GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class); + + module_class->load = test_module_load; + module_class->unload = test_module_unload; +} + +static GType test_module_get_type (void) +{ + static GType object_type = 0; + + if (!object_type) { + static const GTypeInfo object_info = + { + sizeof (TestModuleClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) test_module_class_init, + (GClassFinalizeFunc) NULL, + NULL, + sizeof (TestModule), + 0, + (GInstanceInitFunc)NULL + }; + object_type = g_type_register_static (G_TYPE_TYPE_MODULE, "TestModule", &object_info, 0); + } + return object_type; +} + + +GTypeModule * +test_module_new (TestModuleRegisterFunc register_func) +{ + TestModule *test_module = g_object_new (TEST_TYPE_MODULE, NULL); + GTypeModule *module = G_TYPE_MODULE (test_module); + + test_module->register_func = register_func; + + /* Register the types initially */ + g_type_module_use (module); + g_type_module_unuse (module); + + return G_TYPE_MODULE (module); +} + + + +#define DYNAMIC_OBJECT_TYPE (dynamic_object_get_type ()) + +typedef GObject DynamicObject; +typedef struct _DynamicObjectClass DynamicObjectClass; + +struct _DynamicObjectClass +{ + GObjectClass parent_class; + guint val; +}; + +G_DEFINE_DYNAMIC_TYPE(DynamicObject, dynamic_object, G_TYPE_OBJECT); + +static void +dynamic_object_class_init (DynamicObjectClass *class) +{ + class->val = 42; + g_assert (loaded == FALSE); + loaded = TRUE; +} + +static void +dynamic_object_class_finalize (DynamicObjectClass *class) +{ + g_assert (loaded == TRUE); + loaded = FALSE; +} + +static void +dynamic_object_init (DynamicObject *dynamic_object) +{ +} + + +static void +module_register (GTypeModule *module) +{ + dynamic_object_register_type (module); +} + +#define N_THREADS 100 +#define N_REFS 10000 + +static gpointer +ref_unref_thread (gpointer data) +{ + gint i; + /* first, syncronize with other threads, + */ + if (g_test_verbose()) + g_print ("WAITING!\n"); + g_mutex_lock (sync_mutex); + g_mutex_unlock (sync_mutex); + if (g_test_verbose ()) + g_print ("STARTING\n"); + + /* ref/unref the klass 10000000 times */ + for (i = N_REFS; i; i--) { + if (g_test_verbose ()) + if (i % 10) + g_print ("%d\n", i); + g_type_class_unref (g_type_class_ref ((GType) data)); + } + + if (g_test_verbose()) + g_print ("DONE !\n"); + + return NULL; +} + +static void +test_multithreaded_dynamic_type_init (void) +{ + GTypeModule *module; + DynamicObjectClass *class; + /* Create N_THREADS threads that are going to just ref/unref a class */ + GThread *threads[N_THREADS]; + guint i; + + module = test_module_new (module_register); + /* Not loaded until we call ref for the first time */ + class = g_type_class_peek (DYNAMIC_OBJECT_TYPE); + g_assert (class == NULL); + g_assert (!loaded); + + /* pause newly created threads */ + g_mutex_lock (sync_mutex); + + /* create threads */ + for (i = 0; i < N_THREADS; i++) { + threads[i] = g_thread_create (ref_unref_thread, (gpointer) DYNAMIC_OBJECT_TYPE, TRUE, NULL); + } + + /* execute threads */ + g_mutex_unlock (sync_mutex); + + for (i = 0; i < N_THREADS; i++) { + g_thread_join (threads[i]); + } +} + +int +main (int argc, + char *argv[]) +{ + g_thread_init (NULL); + g_test_init (&argc, &argv, NULL); + g_type_init (); + + sync_mutex = g_mutex_new(); + + g_test_add_func ("/GObject/threaded-dynamic-ref-unref-init", test_multithreaded_dynamic_type_init); + + return g_test_run(); +} diff --git a/gobject/tests/threadtests.c b/gobject/tests/threadtests.c new file mode 100644 index 0000000..c3b0171 --- /dev/null +++ b/gobject/tests/threadtests.c @@ -0,0 +1,215 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Imendio AB + * Authors: Tim Janik + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#include +#include + +static volatile int mtsafe_call_counter = 0; /* multi thread safe call counter */ +static int unsafe_call_counter = 0; /* single-threaded call counter */ + +#define NUM_COUNTER_INCREMENTS 100000 + +static void +call_counter_init (gpointer tclass) +{ + int i; + for (i = 0; i < NUM_COUNTER_INCREMENTS; i++) + { + int saved_unsafe_call_counter = unsafe_call_counter; + g_atomic_int_add (&mtsafe_call_counter, 1); /* real call count update */ + g_thread_yield(); /* let concurrent threads corrupt the unsafe_call_counter state */ + unsafe_call_counter = 1 + saved_unsafe_call_counter; /* non-atomic counter update */ + } +} + +static void interface_per_class_init () { call_counter_init (NULL); } + +/* define 3 test interfaces */ +typedef GTypeInterface MyFace0Interface; +G_DEFINE_INTERFACE (MyFace0, my_face0, G_TYPE_OBJECT); +static void my_face0_default_init (MyFace0Interface *iface) { call_counter_init (iface); } +typedef GTypeInterface MyFace1Interface; +G_DEFINE_INTERFACE (MyFace1, my_face1, G_TYPE_OBJECT); +static void my_face1_default_init (MyFace1Interface *iface) { call_counter_init (iface); } +typedef GTypeInterface MyFace2Interface; +G_DEFINE_INTERFACE (MyFace2, my_face2, G_TYPE_OBJECT); +static void my_face2_default_init (MyFace2Interface *iface) { call_counter_init (iface); } + +/* define 3 test objects, adding interfaces 0 & 1, and adding interface 2 after class initialization */ +typedef GObject MyTester0; +typedef GObjectClass MyTester0Class; +G_DEFINE_TYPE_WITH_CODE (MyTester0, my_tester0, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (my_face0_get_type(), interface_per_class_init); + G_IMPLEMENT_INTERFACE (my_face1_get_type(), interface_per_class_init); + ); +static void my_tester0_init (MyTester0*t) {} +static void my_tester0_class_init (MyTester0Class*c) { call_counter_init (c); } +typedef GObject MyTester1; +typedef GObjectClass MyTester1Class; +G_DEFINE_TYPE_WITH_CODE (MyTester1, my_tester1, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (my_face0_get_type(), interface_per_class_init); + G_IMPLEMENT_INTERFACE (my_face1_get_type(), interface_per_class_init); + ); +static void my_tester1_init (MyTester1*t) {} +static void my_tester1_class_init (MyTester1Class*c) { call_counter_init (c); } +typedef GObject MyTester2; +typedef GObjectClass MyTester2Class; +G_DEFINE_TYPE_WITH_CODE (MyTester2, my_tester2, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (my_face0_get_type(), interface_per_class_init); + G_IMPLEMENT_INTERFACE (my_face1_get_type(), interface_per_class_init); + ); +static void my_tester2_init (MyTester2*t) {} +static void my_tester2_class_init (MyTester2Class*c) { call_counter_init (c); } + +static GCond *sync_cond = NULL; +static GMutex *sync_mutex = NULL; + +static gpointer +tester_init_thread (gpointer data) +{ + const GInterfaceInfo face2_interface_info = { (GInterfaceInitFunc) interface_per_class_init, NULL, NULL }; + gpointer klass; + /* first, syncronize with other threads, + * then run interface and class initializers, + * using unsafe_call_counter concurrently + */ + g_mutex_lock (sync_mutex); + g_mutex_unlock (sync_mutex); + /* test default interface initialization for face0 */ + g_type_default_interface_unref (g_type_default_interface_ref (my_face0_get_type())); + /* test class initialization, face0 per-class initializer, face1 default and per-class initializer */ + klass = g_type_class_ref ((GType) data); + /* test face2 default and per-class initializer, after class_init */ + g_type_add_interface_static (G_TYPE_FROM_CLASS (klass), my_face2_get_type(), &face2_interface_info); + /* cleanups */ + g_type_class_unref (klass); + return NULL; +} + +static void +test_threaded_class_init (void) +{ + GThread *threads[3] = { NULL, }; + /* pause newly created threads */ + g_mutex_lock (sync_mutex); + /* create threads */ + threads[0] = g_thread_create (tester_init_thread, (gpointer) my_tester0_get_type(), TRUE, NULL); + threads[1] = g_thread_create (tester_init_thread, (gpointer) my_tester1_get_type(), TRUE, NULL); + threads[2] = g_thread_create (tester_init_thread, (gpointer) my_tester2_get_type(), TRUE, NULL); + /* execute threads */ + g_mutex_unlock (sync_mutex); + while (g_atomic_int_get (&mtsafe_call_counter) < (3 + 3 + 3 * 3) * NUM_COUNTER_INCREMENTS) + { + if (g_test_verbose()) + g_print ("Initializers counted: %u\n", g_atomic_int_get (&mtsafe_call_counter)); + g_usleep (50 * 1000); /* wait for threads to complete */ + } + if (g_test_verbose()) + g_print ("Total initializers: %u\n", g_atomic_int_get (&mtsafe_call_counter)); + /* ensure non-corrupted counter updates */ + g_assert_cmpint (g_atomic_int_get (&mtsafe_call_counter), ==, unsafe_call_counter); +} + +typedef struct { + GObject parent; + char *name; +} PropTester; +typedef GObjectClass PropTesterClass; +G_DEFINE_TYPE (PropTester, prop_tester, G_TYPE_OBJECT); +#define PROP_NAME 1 +static void +prop_tester_init (PropTester* t) +{ + if (t->name == NULL) + ; /* neds unit test framework initialization: g_test_bug ("race initializing properties"); */ +} +static void +prop_tester_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{} +static void +prop_tester_class_init (PropTesterClass *c) +{ + int i; + GParamSpec *param; + GObjectClass *gobject_class = G_OBJECT_CLASS (c); + + gobject_class->set_property = prop_tester_set_property; /* silence GObject checks */ + + g_mutex_lock (sync_mutex); + g_cond_signal (sync_cond); + g_mutex_unlock (sync_mutex); + + for (i = 0; i < 100; i++) /* wait a bit. */ + g_thread_yield(); + + call_counter_init (c); + param = g_param_spec_string ("name", "name_i18n", + "yet-more-wasteful-i18n", + NULL, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK); + g_object_class_install_property (gobject_class, PROP_NAME, param); +} + +static gpointer +object_create (gpointer data) +{ + GObject *obj = g_object_new (prop_tester_get_type(), "name", "fish", NULL); + g_object_unref (obj); + return NULL; +} + +static void +test_threaded_object_init (void) +{ + GThread *creator; + g_mutex_lock (sync_mutex); + + creator = g_thread_create (object_create, NULL, TRUE, NULL); + /* really provoke the race */ + g_cond_wait (sync_cond, sync_mutex); + + object_create (NULL); + g_mutex_unlock (sync_mutex); + + g_thread_join (creator); +} + +int +main (int argc, + char *argv[]) +{ + g_thread_init (NULL); + g_test_init (&argc, &argv, NULL); + g_type_init (); + + sync_cond = g_cond_new(); + sync_mutex = g_mutex_new(); + + g_test_add_func ("/GObject/threaded-class-init", test_threaded_class_init); + g_test_add_func ("/GObject/threaded-object-init", test_threaded_object_init); + + return g_test_run(); +} diff --git a/gthread-2.0-uninstalled.pc.in b/gthread-2.0-uninstalled.pc.in new file mode 100644 index 0000000..a7285da --- /dev/null +++ b/gthread-2.0-uninstalled.pc.in @@ -0,0 +1,6 @@ +Name: GThread Uninstalled +Description: Thread support for GLib, Not Installed +Requires: glib-2.0-uninstalled +Version: @VERSION@ +Libs: ${pc_top_builddir}/${pcfiledir}/gthread/libgthread-2.0.la @G_THREAD_LIBS@ +Cflags: -I${pc_top_builddir}/${pcfiledir}/@srcdir@ @G_THREAD_CFLAGS@ diff --git a/gthread-2.0.pc.in b/gthread-2.0.pc.in new file mode 100644 index 0000000..419df1f --- /dev/null +++ b/gthread-2.0.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: GThread +Description: Thread support for GLib +Requires: glib-2.0 +Version: @VERSION@ +Libs: -L${libdir} -lgthread-2.0 @G_THREAD_LIBS@ +Cflags: @G_THREAD_CFLAGS@ diff --git a/gthread/ChangeLog b/gthread/ChangeLog new file mode 100644 index 0000000..b833c1e --- /dev/null +++ b/gthread/ChangeLog @@ -0,0 +1,837 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + +2008-12-15 Matthias Clasen + + * === Released 2.19.3 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + +2008-10-16 Matthias Clasen + + * === Released 2.19.0 === + +2008-09-17 Matthias Clasen + + * === Released 2.18.1 === + +2008-09-02 Matthias Clasen + + * === Released 2.18.0 === + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +2008-08-04 Matthias Clasen + + Bug 460920 – build fix for --disable-threads + + * gthread-impl.c: Implement g_thread_init_with_errorcheck_mutexes + in the !G_THREAD_ENABLED case. Pointed out by Jan Nieuwenhuizen + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.5 === + +2008-07-27 Tor Lillqvist + + * Makefile.am (gthread-2.0.lib): Pass appropriate -machine flag to lib.exe. + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.2 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.1 === + +2008-05-28 Michael Natterer + + * Makefile.am: don't define G_DISABLE_SINGLE_INCLUDES, it's in + the global CPPFLAGS now. + +2008-05-27 Matthias Clasen + + * === Released 2.17.0 === + +2008-05-05 Michael Natterer + + * Makefile.am. build with G_DISABLE_SINGLE_INCLUDES to prevent + code from being checked in that breaks the build of applications + which use G_DISABLE_SINGLE_INCLUDES. + +2008-03-16 Tor Lillqvist + + * Makefile.am: Define gthread_def locally here instead of using an + Autoconf variable. + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + +2008-02-25 Matthias Clasen + + * === Released 2.15.6 === + +2008-02-11 Matthias Clasen + + * === Released 2.15.5 === + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + +2008-01-27 Matthias Clasen + + * gthread-posix.c: + * gthread-win32.c: Replace uses of G_GNUC_PRETTY_FUNCTION + by __FUNCTION__. + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + +2008-01-14 Matthias Clasen + + * === Released 2.15.2 === + +008-01-07 Matthias Clasen + + * === Released 2.15.1 === + +2007-12-20 Matthias Clasen + + * === Released 2.15.0 === + +2007-11-07 Matthias Clasen + + * === Released 2.14.3 === + +2007-10-16 Matthias Clasen + + * === Released 2.14.2 === + +2007-09-19 Matthias Clasen + + * === Released 2.14.1 === + +2007-08-03 Matthias Clasen + + * === Released 2.14.0 === + +2007-07-12 Matthias Clasen + + * === Released 2.13.7 === + +Fri Jun 29 2007 Matthias Clasen + + * === Released 2.13.6 === + +2007-06-18 Matthias Clasen + + * === Released 2.13.5 === + +2007-06-05 Matthias Clasen + + * === Released 2.13.4 === + +2007-06-04 Matthias Clasen + + * === Released 2.13.3 === + +2007-05-22 Matthias Clasen + + * === Released 2.13.2 === + +2007-05-03 Matthias Clasen + + * === Released 2.13.1 === + +2007-03-16 Matthias Clasen + + * === Released 2.13.0 === + +2007-01-19 Tor Lillqvist + + * Makefile.am (gthread-2.0.lib): Use $(srcdir) for builds outside + srcdir. + +2007-01-16 Tor Lillqvist + + * gthread-win32.c (g_gettime_win32_impl): + GetSystemTimeAsFileTime() returns 100s of nanoseconds since 1601, + so offset to Unix epoch (1970) and multiply by 100 to get + nanoseconds which is what we want. + +2006-12-28 Tor Lillqvist + + * gthread-win32.c (g_thread_impl_init): Correct link to discussion + about CRITICAL_SECTIONs vs. mutexes. Thanks to Felix Kater for + pointing this out. + +2006-08-15 Matthias Clasen + + * === Released 2.12.2 === + +2006-07-22 Matthias Clasen + + * === Released 2.12.1 === + +2006-07-02 Matthias Clasen + + * === Released 2.12.0 === + +2006-06-20 Matthias Clasen + + * === Released 2.11.4 === + +2006-06-12 Matthias Clasen + + * === Released 2.11.3 === + +2006-06-05 Matthias Clasen + + * === Released 2.11.2 === + +2006-05-15 Matthias Clasen + + * === Released 2.11.1 === + +2006-05-03 Tor Lillqvist + + * gthread-win32.c (g_thread_exit_win32_impl): Free with free() and + not g_free() what has been allocated with calloc(). (#340530, Jake + Goulding) + +2006-05-02 Matthias Clasen + + * === Released 2.11.0 === + +2006-03-11 Tor Lillqvist + + * gthread-win32.c: #define _WIN32_WINDOWS as 0x0401 to get + declaration for IsDebuggerPresent() when using MSVC6. (#333879, + Kazuki Iwamoto) + +2006-03-07 Matthias Clasen + + * === Released 2.10.1 === + +2006-03-02 Tor Lillqvist + + * gthread-win32.c (G_PRIVATE_MAX): Increase to 100. 16 was rather + low. + (g_private_new_win32_impl): Can't use g_error() here as + g_private_new() is called a few times by GLib internally before + the messaging system that g_error() requires is ready. Thanks to + Tim Janik for noticing. Just display a MessageBox() and abort() + instead. + +2006-02-24 Matthias Clasen + + * === Released 2.10.0 === + +2006-02-20 Tor Lillqvist + + * gthread-win32.c (g_thread_exit_win32_impl): Make the + implementation of GPrivate behave more closely as in POSIX + threads: The value associacted with a GPrivate must be set to NULL + before calling the destructor. (The destructor gets the original + value as argument.) A destructor might re-associate a non-NULL + value with some GPrivate. To deal with this, if after all + destructors have been called, there still are some non-NULL + values, the process is repeated. (#331367) + +2006-02-10 Matthias Clasen + + * === Released 2.9.6 === + +2006-01-27 Matthias Clasen + + * === Released 2.9.5 === + +2006-01-18 Matthias Clasen + + * === Released 2.9.4 === + +2006-01-16 Matthias Clasen + + * === Released 2.9.3 === + +2006-01-05 Matthias Clasen + + * === Released 2.9.2 === + +2005-12-09 Matthias Clasen + + * === Released 2.9.1 === + +2005-12-02 Matthias Clasen + + * Makefile.am: Remove gthread-solaris.c + +2005-11-17 Matthias Clasen + + * === Released 2.9.0 === + +2005-08-23 Matthias Clasen + + * === Released 2.8.1 === + +2005-08-12 Matthias Clasen + + * === Released 2.8.0 === + +2005-08-05 Matthias Clasen + + * === Released 2.7.7 === + +2005-08-03 Matthias Clasen + + * === Released 2.7.6 === + +2005-08-02 Matthias Clasen + + * === Released 2.7.5 === + +2005-07-21 Matthias Clasen + + * === Released 2.7.4 === + +2005-07-15 Matthias Clasen + + * === Released 2.7.3 === + +2005-07-09 Tor Lillqvist + + * Makefile.am: Don't use the scripts in build/win32 to compile + gthread.rc into a resource object file. (This means we lose the + build number increment magic, but I doubt it was that useful + anyway.) Instead use windres directly. To pass the normal .o file + produced by windres through libtool, which wants .lo files, pass + it directly to the linker using a -Wl option. + + * gthread.rc.in: Thus replace BUILDNUMBER with 0. + +2005-07-08 Matthias Clasen + + * === Released 2.7.2 === + +2005-06-30 Matthias Clasen + + * === Released 2.7.1 === + +2005-06-26 Tor Lillqvist + + * Makefile.am: libtool installs/uninstalls the import library, no + need to do it ourselves. Do still install/uninstall the .def file, + though. + +2005-06-10 Matthias Clasen + + * === Released 2.7.0 === + +2005-06-09 Matthias Clasen + + * gthread-posix.c (g_thread_create_posix_impl): Allow + setstacksize to fail. (#304790, Michael Banck) + +2005-01-07 Matthias Clasen + + * === Released 2.6.1 === + +2004-12-16 Matthias Clasen + + * === Released 2.6.0 === + +2004-12-02 Matthias Clasen + + * === Released 2.5.7 === + +2004-11-12 Matthias Clasen + + * === Released 2.5.6 === + +2004-11-02 Matthias Clasen + + * === Released 2.5.5 === + +2004-10-27 Matthias Clasen + + * === Released 2.5.4 === + +2004-09-18 Matthias Clasen + + * === Released 2.5.3 === + +2004-08-25 Matthias Clasen + + * === Released 2.5.2 === + +2004-08-01 Matthias Clasen + + * === Released 2.5.1 === + +Sun Jul 18 18:03:08 2004 Soeren Sandmann + + * === Released 2.5.0 === + +2002-11-23 Tor Lillqvist + + * gthread-win32.c (g_cond_timed_wait_win32_impl): Fix two bugs: 1) + If abs_time is NULL, should use infinite time. 2) Check for + current time already being past abs_time. (#99294, Christopher + R. Palmer, fix by Sebastian Wilhelmi) + +Mon Nov 4 14:45:24 2002 Owen Taylor + + * gthread-posix.c gthread-solaris.c: Include + +2002-03-10 Sebastian Wilhelmi + + * gthread-posix.c (g_thread_create_posix_impl): Do a comparison, + not an assignment, stupid! Spotted by Daniel Elstner + . + +2002-02-09 Sebastian Wilhelmi + + * gthread-impl.c: Only compile most of this file, if + G_THREADS_ENABLED is set. + + * Fixed typo in G_THREADS_ENABLED. + +2002-01-16 Sebastian Wilhelmi + + * gthread-solaris.c: Use g_free instead of free. Pointed out by + Sam O'Connor . + +2001-10-23 Tor Lillqvist + + * Makefile.am: (Win32): If we have built the MSVC import library, + install it. Install the gcc import library. Also support + uninstall. + +2001-09-28 Tor Lillqvist + + * gthread-win32.c: Use an extra level of indirection for GMutex. + It is now a pointer either to a pointer to a CRITICAL_SECTION + struct, or to a mutex HANDLE. This is needed in case the user + defines G_ERRORCHECK_MUTEXES. G_MUTEX_SIZE must correctly reflect + the size of *GMutex, but this used to vary depending on whether we + at run-time chose to use CRITICAL_SECTIONs or mutexes. + (g_mutex_free_win32_cs_impl, g_cond_free_win32_impl): Call + DeleteCriticalSection() when done with it. + + * gthread-impl.c (g_thread_init_with_errorcheck_mutexes): Call + g_thread_impl_init() before accessing + g_thread_functions_for_glib_use_default, as the + g_thread_impl_init() function might modify it. + +2001-09-26 Tor Lillqvist + + * makefile.mingw.in: Fix couple of typos. + + * gthread.def: Add g_thread_init_with_errorcheck_mutexes. + +2001-09-25 Sebastian Wilhelmi + + * gthread-impl.c: Corrected the array size (cough, cough). Pointed + out by gpablo@intersystems.com.ar. Fixes #61065. + +2001-09-25 Tor Lillqvist + + * Makefile.am: Use new macros for .def file, and check for + MS_LIB_AVAILABLE, new rule to build MS import library. + + * makefile.msc.in: Use same DLL and import library names as + libtool. + +2001-09-19 Sebastian Wilhelmi + + * gthread-posix.c: Add g_thread_equal_posix_impl and add to the + function vector g_thread_functions_for_glib_use_default. + + * gthread-solaris.c, gthread-win32.c: Add NULL as equal function, + as on those two platforms you don't need an equal function. + +2001-09-19 Tor Lillqvist + + * gthread.rc.in: Correct InternalName and OriginalFilename to + match what we actually produce. + +2001-07-20 Hans Breuer + + * makefile.msc.in : reflect glib move + +2001-06-07 Sebastian Wilhelmi + + * gthread-win32.c: Use g_win32_error_message to beautify error + messages. + +2001-05-24 Hans Breuer + + * makefile.msc.in : pthread isn't required anymore + +2001-05-22 Sebastian Wilhelmi + + * gthread-win32.c (g_cond_wait_internal): Also return TRUE for + late arrived signals. Thanks to Steven Brooks + for pointing out. + + * gthread-impl.c (g_thread_init): Move the thread implementation + initialization to before assigning GThreadFuncs, which now is just + struct assigned and not memcpy'ed. Completed check for zero + members of GThreadFuncs. + + * makefile.mingw: Don't link to pthread anymore. + + * gthread-win32.c: New file for native thread support for + win32. Thanks to Hans Breuer to got me + kickstarted. + + * Makefile.am: Also distribute gthread-win32.c. + +Fri May 4 04:14:45 2001 Tim Janik + + * gthread-posix.c (g_cond_timed_wait_posix_impl): don't g_assert() + the user specified time, but g_return_val_if_fail() here. + +2001-04-03 Sebastian Wilhelmi + + * gthread-posix.c: Added special case for priorities on + FreeBSD. Thanks to David Reid for the info. + + * gthread-impl.c: Made two macros safe with (). + +2001-03-10 Tor Lillqvist + + * Makefile.am: Use the _LIBADD dependency on libglib only on + Win32. + +2001-02-21 Tor Lillqvist + + * Makefile.am: Use libglib-1.3.la from top_builddir. Invoke + libtool with -no-undefined for Win32 and Cygwin. + + * gthread-impl.c (g_thread_init): Win32 code snippet used also on + Cygwin. + +2001-02-15 Sebastian Wilhelmi + + * gthread-posix.c: Removed the G_THREAD_USE_PID_SURROGATE + implementation, which is now in gthread.c. + +2001-01-30 Sebastian Wilhelmi + + * gthread-impl.c (g_thread_init_with_errorcheck_mutexes): Call + g_thread_impl_init(), as g_thread_init won't call it. + + * gthread-impl.c (g_mutex_free_errorcheck_impl): Fixed it for + real. Sorry for this mess. It looked like a real obvious fix, so I + didn't check. Bad boy. Added some casts to quiet the compiler. + +2001-01-29 Havoc Pennington + + * gthread-impl.c (g_mutex_free_errorcheck_impl): hack this so it + compiles, needs fixing for real. + +2001-01-29 Sebastian Wilhelmi + + * gthread-impl.c (g_mutex_free_errorcheck_impl): Add new check to + errorcheck mutexes to abort, if a locked mutex is freed. + +2001-01-03 Sebastian Wilhelmi + + * gthread-solaris.c, gthread-posix.c: Made g_thread_min_stack_size + static. + +2000-11-28 Sebastian Wilhelmi + + * gthread-impl.c: Revamped errorcheck mutexes and added errorcheck + cond_wait() and cond_timed_wait() funtions. This makes he whole + thing work. Now we only show the location of the locking/unlocking + for -DG_ERRORCHECK_MUTEXES and not the name of the mutex. + +2000-11-21 Sebastian Wilhelmi + + * gthread-impl.c, gthread-posix.c, gthread-solaris.c: Removed + g_thread_map_priority function in favour of the + g_thread_priority_map array. Initialize the array with + PRIORITY_{...}_VALUE, if available and interpolate beetween the + bounds if .._NORMAL_.. and .._HIGH_.. are not available. + + * gthread-posix.c: If we should use the PID niceness as a + surrogate for thread priorities (G_THREAD_USE_PID_SURROGATE is + defined), then disable normal priority handling and use PIDs and + setpriority() instead. Depends on the thread to write its PID into + the place after the thread id right after thread creation. + +2000-11-15 Sebastian Wilhelmi + + * gthread-posix.c: Include if available. + +2000-11-02 Sebastian Wilhelmi + + * gthread-none.c: Add G_MUTEX_SIZE as needed for gthread-impl.c + +2000-10-25 Sebastian Wilhelmi + + * Makefile.am : Add @GLIB_DEBUG_FLAGS@ to INCLUDES for accessing + -DG_ENABLE_DEBUG as needed in gthread-posix.c. + + * gthread-posix.c: Revamped error handling for native thread + function calls. Now EPERM errors are ignored for some commands and + only a warning message is output once (at first occurrence). + +2000-10-15 Raja R Harinath + + * Makefile.am (BUILT_EXTRA_DIST): New variable. + (dist-hook): Handle $(BUILT_EXTRA_DIST). + +2000-09-29 Sebastian Wilhelmi + + * gthread-impl.c: Added errorcheck mutexes. New exported function + g_thread_init_with_errorcheck_mutexes, which is called instead of + g_thread_init, when compiled with -DG_ERRORCHECK_MUTEXES. New + static functions + g_mutex_(new|lock|trylock|unlock|free)_errorcheck_impl to + implement errorcheck mutexes. + + * gthread-posix.impl.c, gthread-solaris-impl.c: Define the size of + a mutex. + +2000-09-21 Tor Lillqvist + + * makefile.mingw.in: Use pthreads macros from ../build. + +2000-09-06 Sebastian Wilhelmi + + * gthread-posix.c, gthread-solaris.c: + s/G_MICROSEC/G_USEC_PER_SEC/ and s/G_NANOSEC/G_NSEC_PER_SEC/ + +2000-09-01 Sebastian Wilhelmi + + * gthread-posix.c (g_thread_create_posix_impl): Use GError to + report errors. + + * gthread-solaris.c (g_thread_create_solaris_impl): Use GError to + report errors as well. + +2000-05-13 Tor Lillqvist + + * makefile.mingw.in: New file, with gthread stuff moved from + ../makefile.mingw.in. + + * Makefile.am: Add to EXTRA_DIST, add rule to build makefile.mingw. + +2000-04-25 Sebastian Wilhelmi + + * gthread-solaris.c (g_mutex_new_solaris_impl): Changed the scope + of the initialized mutex to USYNC_THREAD. Thanks to Soeren + Sandmann for pointing that out. + +2000-03-20 Sebastian Wilhelmi + + * gthread-posix.c (posix_check_for_error): Forgot a '}' in a macro + for DCE-threads. Thanks to Karl Nelson + for pointing that out. + +2000-03-17 Sebastian Wilhelmi + + * gthread-posix.c: Don't use priorities for threads, when the + minimal/maximal priorities couldn't be determined at configure + time. + + * gthread-posix.c: Don't check for errors, when setting the scope + of a tread to system, as some posix implementations can't do that + and we don't want the thing to fail because of that. + +2000-02-22 Sebastian Wilhelmi + + * gthread-posix.c, gthread-solaris.c: check for sysconf + (_SC_THREAD_STACK_MIN), which returns the minimal stack size for + new threads. Patch from Soeren Sandmann . + +1999-11-16 Sebastian Wilhelmi + + * gthread-posix.c, gthread-solaris.c: Changed the prototype of + thread_create and thread_self to return the system thread into + provided memory instead of a return value. This is necessary, as + HPUX has a pthread_t, that is bigger than the biggest integral + type there. Made some more functions static. + + * gthread-posix.c: Small fixes for DCE threads: Detaching has to + be done after thread creation for DCE. + +1999-06-21 Tor Lillqvist + + * gthread-posix.c: Guard pthread_attr_setscope call with test + for _POSIX_THREAD_PRIORITY_SCHEDULING, which should be defined + in a that supports that feature. + +1999-06-17 Sebastian Wilhelmi + + * gthread-posix.c, gthread-solaris.c: Added the native + implementations for the GLib's extended thread support. + + * gthread-nspr.c: Removed for good. NSPR is nothing we would want + to build upon. + + * gthread.c: Renamed to gthread-impl.c to avoid confusion with + ../gthread.c (Formerly known as the file called gmutex.c) + + * testgthread.c: Removed. The new and much extended tests are in + ../tests/thread-test.c. + + * Makefile.am: Changed to reflect the changes above. + +1999-03-31 Sebastian Wilhelmi + + * gthread-posix.c: Use the right default arguments for the + construction of mutexes and conds for dce threads, these are + &pthread_(cond|mutex)attr_default instead of NULL. Hint from + D. Emilio Grimaldo Tunon . + +1999-03-18 Sebastian Wilhelmi + + * Makefile.am (INCLUDES): Added @GTHREAD_COMPILE_IMPL_DEFINES@. + +1999-03-12 Sebastian Wilhelmi + + * gthread-posix.c (g_private_get_posix_impl): Fixed typo for DCE + implementation. + +1999-03-11 Sebastian Wilhelmi + + * gthread-posix.c: Now handle both dce and posix threads. They are + sufficently equal. Please do not commit my change to + glib-1-2/gthread/gthread-posix.c from 1999-03-03, as the current + change will take care of that too. + +1999-03-03 Sebastian Wilhelmi + + * gthread-posix.c: Fixed broken mutex_trylock and slightly broken + cond_timed_wait functions. + +1999-02-15 Sebastian Wilhelmi + + * testgthread.c (test_mutexes): Use new signature of + g_static_mutex* functions. + +1999-02-08 Sebastian Wilhelmi + + * gthread-posix.c (g_private_get_posix_impl): Use the + HAVE_PTHREAD_GETSPECIFIC_POSIX macro to determine, which signature + to use for pthread_getspecific. + +Tue Jan 19 20:56:02 1999 Tor Lillqvist + + * Makefile.am (EXTRA_DIST): Added gthread.def. + +Sun Jan 17 10:58:19 1999 Tor Lillqvist + + * gthread.def: New file. + +1999-01-16 1999 Tor Lillqvist + + * gthread-posix.c: Conditionalize inclusion. + +1999-01-07 Sebastian Wilhelmi + + * testgthread.c: conditionally compile according to the + G_THREADS_IMPL_??? macros. + (test_private_func): use rand_r instead of rand to make it + thread safe. + +1998-12-18 Sebastian Wilhelmi + + * testgthread.c (new_thread): As a joinable thread seems to be the + default on posix, leave the explicit setting out, as it causes + problems on some older platforms. + +Wed Dec 16 22:21:33 CST 1998 Shawn T. Amundson + + * gthread-posix.c: use g_free in mutex_free (from Tim Janik) + +Thu Dec 17 03:38:57 1998 Tim Janik + + * Makefile.am: -DG_LOG_DOMAIN="GThread", we don't need an extern + variable for that (noticed by Joel Becker ) + +Wed Dec 16 03:16:16 1998 Tim Janik + + * testgthread.c: s/g_thread_supported/g_thread_supported ()/ + * gthread.c: s/g_thread_supported/g_threads_got_initialized/ + (g_thread_init): bail out if G_THREADS_ENABLED is not defined. + +1998-12-15 Sebastian Wilhelmi + + * Makefile.am (EXTRA_DIST): updated. + + * testgthread.c, gthread-*.c: Changed private to private_key to + avoid problems when compiling with under C++. + + * gthread-none.c: + s/g_mutex_functions_for_glib_use/g_thread_functions_for_glib_use/ + + * ChangeLog: from now on there is an extra ChangeLog for gthread + + diff --git a/gthread/Makefile.am b/gthread/Makefile.am new file mode 100644 index 0000000..8252260 --- /dev/null +++ b/gthread/Makefile.am @@ -0,0 +1,105 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +SUBDIRS = . tests +DIST_SUBDIRS = tests + +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gthread \ + -DG_LOG_DOMAIN=\"GThread\" \ + @GTHREAD_COMPILE_IMPL_DEFINES@ \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED + +EXTRA_DIST += \ + makefile.msc.in \ + gthread-posix.c \ + gthread-win32.c \ + gthread-none.c \ + gthread.def \ + gthread.rc.in + +BUILT_EXTRA_DIST = \ + makefile.msc \ + gthread.rc + +libglib = $(top_builddir)/glib/libglib-2.0.la + +top_builddir_full=`cd \$(top_builddir); pwd` + +lib_LTLIBRARIES = libgthread-2.0.la + +if OS_WIN32_AND_DLL_COMPILATION +if MS_LIB_AVAILABLE +noinst_DATA = gthread-2.0.lib + +install_ms_lib_cmd = $(INSTALL) gthread-2.0.lib $(DESTDIR)$(libdir) +uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gthread-2.0.lib +endif +endif + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +export_symbols = -export-symbols $(srcdir)/gthread.def +gthread_def = gthread.def + +install-def-file: + $(INSTALL) $(srcdir)/gthread.def $(DESTDIR)$(libdir)/gthread-2.0.def + +uninstall-def-file: + -rm $(DESTDIR)$(libdir)/gthread-2.0.def +else +install-def-file: +uninstall-def-file: +endif + +if OS_WIN32_AND_DLL_COMPILATION +gthread_win32_res = gthread-win32-res.o +gthread_win32_res_ldflag = -Wl,$(gthread_win32_res) +endif + +libgthread_2_0_la_SOURCES = gthread-impl.c +libgthread_2_0_la_LDFLAGS = \ + $(gthread_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgthread_2_0_la_LIBADD = $(G_THREAD_LIBS_EXTRA) $(G_THREAD_LIBS_FOR_GTHREAD) $(libglib) + +libgthread_2_0_la_DEPENDENCIES = $(gthread_win32_res) $(gthread_def) + +gthread-win32-res.o: gthread.rc + $(WINDRES) gthread.rc $@ + +gthread-2.0.lib: libgthread-2.0.la gthread.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgthread-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(srcdir)/gthread.def -out:$@ + +dist-hook: $(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 + +install-data-local: install-ms-lib install-def-file + +uninstall-local: uninstall-ms-lib uninstall-def-file + +if HAVE_GLIB_RUNTIME_LIBDIR +install-data-hook: + mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgthread-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + mv $(DESTDIR)$(libdir)/libgthread-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) + rm -f $(DESTDIR)$(libdir)/libgthread-2.0.so + ln -s $(GLIB_RUNTIME_LIBDIR)/libgthread-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgthread-2.0.so +endif diff --git a/gthread/Makefile.in b/gthread/Makefile.in new file mode 100644 index 0000000..e97969b --- /dev/null +++ b/gthread/Makefile.in @@ -0,0 +1,938 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/gthread.rc.in $(srcdir)/makefile.msc.in \ + $(top_srcdir)/Makefile.decl ChangeLog +subdir = gthread +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = makefile.msc gthread.rc +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__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +am_libgthread_2_0_la_OBJECTS = gthread-impl.lo +libgthread_2_0_la_OBJECTS = $(am_libgthread_2_0_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgthread_2_0_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libgthread_2_0_la_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgthread_2_0_la_SOURCES) +DIST_SOURCES = $(libgthread_2_0_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 +DATA = $(noinst_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 +ETAGS = etags +CTAGS = ctags +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = makefile.msc.in gthread-posix.c gthread-win32.c \ + gthread-none.c gthread.def gthread.rc.in +TEST_PROGS = +SUBDIRS = . tests +DIST_SUBDIRS = tests +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gthread \ + -DG_LOG_DOMAIN=\"GThread\" \ + @GTHREAD_COMPILE_IMPL_DEFINES@ \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED + +BUILT_EXTRA_DIST = \ + makefile.msc \ + gthread.rc + +libglib = $(top_builddir)/glib/libglib-2.0.la +top_builddir_full = `cd \$(top_builddir); pwd` +lib_LTLIBRARIES = libgthread-2.0.la +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@noinst_DATA = gthread-2.0.lib +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@install_ms_lib_cmd = $(INSTALL) gthread-2.0.lib $(DESTDIR)$(libdir) +@MS_LIB_AVAILABLE_TRUE@@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall_ms_lib_cmd = -rm $(DESTDIR)$(libdir)/gthread-2.0.lib +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +@OS_WIN32_AND_DLL_COMPILATION_TRUE@export_symbols = -export-symbols $(srcdir)/gthread.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gthread_def = gthread.def +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gthread_win32_res = gthread-win32-res.o +@OS_WIN32_AND_DLL_COMPILATION_TRUE@gthread_win32_res_ldflag = -Wl,$(gthread_win32_res) +libgthread_2_0_la_SOURCES = gthread-impl.c +libgthread_2_0_la_LDFLAGS = \ + $(gthread_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) $(export_symbols) + +libgthread_2_0_la_LIBADD = $(G_THREAD_LIBS_EXTRA) $(G_THREAD_LIBS_FOR_GTHREAD) $(libglib) +libgthread_2_0_la_DEPENDENCIES = $(gthread_win32_res) $(gthread_def) +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gthread/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gthread/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): +makefile.msc: $(top_builddir)/config.status $(srcdir)/makefile.msc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +gthread.rc: $(top_builddir)/config.status $(srcdir)/gthread.rc.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 +libgthread-2.0.la: $(libgthread_2_0_la_OBJECTS) $(libgthread_2_0_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgthread_2_0_la_LINK) -rpath $(libdir) $(libgthread_2_0_la_OBJECTS) $(libgthread_2_0_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gthread-impl.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(DATA) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)"; 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." +@HAVE_GLIB_RUNTIME_LIBDIR_FALSE@install-data-hook: +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + 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 + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +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-libLTLIBRARIES uninstall-local + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ + ctags-recursive install-am install-data-am install-strip \ + tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am check-local clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ + dist-hook 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-hook install-data-local \ + install-dvi install-dvi-am install-exec install-exec-am \ + 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-libLTLIBRARIES uninstall-local + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +install-ms-lib: + $(install_ms_lib_cmd) + +uninstall-ms-lib: + $(uninstall_ms_lib_cmd) + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ $(INSTALL) $(srcdir)/gthread.def $(DESTDIR)$(libdir)/gthread-2.0.def + +@OS_WIN32_AND_DLL_COMPILATION_TRUE@uninstall-def-file: +@OS_WIN32_AND_DLL_COMPILATION_TRUE@ -rm $(DESTDIR)$(libdir)/gthread-2.0.def +@OS_WIN32_AND_DLL_COMPILATION_FALSE@install-def-file: +@OS_WIN32_AND_DLL_COMPILATION_FALSE@uninstall-def-file: + +gthread-win32-res.o: gthread.rc + $(WINDRES) gthread.rc $@ + +gthread-2.0.lib: libgthread-2.0.la gthread.def + lib -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgthread-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(srcdir)/gthread.def -out:$@ + +dist-hook: $(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 + +install-data-local: install-ms-lib install-def-file + +uninstall-local: uninstall-ms-lib uninstall-def-file + +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@install-data-hook: +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mkdir -p $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgthread-2.0.so.0 $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ mv $(DESTDIR)$(libdir)/libgthread-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/$(GLIB_RUNTIME_LIBDIR) +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ rm -f $(DESTDIR)$(libdir)/libgthread-2.0.so +@HAVE_GLIB_RUNTIME_LIBDIR_TRUE@ ln -s $(GLIB_RUNTIME_LIBDIR)/libgthread-2.0.so.0.$(LT_CURRENT).$(LT_REVISION) $(DESTDIR)$(libdir)/libgthread-2.0.so + +# 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/gthread/gthread-impl.c b/gthread/gthread-impl.c new file mode 100644 index 0000000..f0f2be0 --- /dev/null +++ b/gthread/gthread-impl.c @@ -0,0 +1,377 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gthread.c: thread related functions + * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" +#include "gthreadprivate.h" + +#ifdef G_THREADS_ENABLED + +static GSystemThread zero_thread; /* This is initialized to all zero */ +static gboolean thread_system_already_initialized = FALSE; +static gint g_thread_priority_map [G_THREAD_PRIORITY_URGENT + 1]; + +#include G_THREAD_SOURCE + +#ifndef PRIORITY_LOW_VALUE +# define PRIORITY_LOW_VALUE 0 +#endif + +#ifndef PRIORITY_URGENT_VALUE +# define PRIORITY_URGENT_VALUE 0 +#endif + +#ifndef PRIORITY_NORMAL_VALUE +# define PRIORITY_NORMAL_VALUE \ + ((PRIORITY_LOW_VALUE * 6 + PRIORITY_URGENT_VALUE * 4) / 10) +#endif /* PRIORITY_NORMAL_VALUE */ + +#ifndef PRIORITY_HIGH_VALUE +# define PRIORITY_HIGH_VALUE \ + ((PRIORITY_NORMAL_VALUE + PRIORITY_URGENT_VALUE * 2) / 3) +#endif /* PRIORITY_HIGH_VALUE */ + +void g_mutex_init (void); +void g_mem_init (void); +void g_messages_init (void); +void g_convert_init (void); +void g_rand_init (void); +void g_main_thread_init (void); + +typedef struct _GMutexDebugInfo GMutexDebugInfo; +struct _GMutexDebugInfo +{ + gchar *location; + GSystemThread owner; +}; + +#define G_MUTEX_DEBUG_INFO(mutex) \ + (((GMutexDebugInfo*)(((char*)mutex)+G_MUTEX_SIZE))) + +static GMutex * +g_mutex_new_errorcheck_impl (void) +{ + GMutex *retval = g_thread_functions_for_glib_use_default.mutex_new (); + GMutexDebugInfo *info; + retval = g_realloc (retval, G_MUTEX_SIZE + sizeof (GMutexDebugInfo)); + + info = G_MUTEX_DEBUG_INFO (retval); + g_system_thread_assign (info->owner, zero_thread); + info->location = "invalid"; + + return retval; +} + +static void +g_mutex_lock_errorcheck_impl (GMutex *mutex, + const gulong magic, + gchar * const location) +{ + GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex); + gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown"; + + GSystemThread self; + g_thread_functions_for_glib_use.thread_self (&self); + + if (g_system_thread_equal (info->owner, self)) + g_error ("Trying to recursivly lock a mutex at '%s', " + "previously locked at '%s'", + loc, info->location); + + g_thread_functions_for_glib_use_default.mutex_lock (mutex); + + g_system_thread_assign (info->owner, self); + info->location = loc; +} + +static gboolean +g_mutex_trylock_errorcheck_impl (GMutex *mutex, + const gulong magic, + gchar * const location) +{ + GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex); + gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown"; + + GSystemThread self; + g_thread_functions_for_glib_use.thread_self (&self); + + if (g_system_thread_equal (info->owner, self)) + g_error ("Trying to recursivly lock a mutex at '%s', " + "previously locked at '%s'", + loc, info->location); + + if (!g_thread_functions_for_glib_use_default.mutex_trylock (mutex)) + return FALSE; + + g_system_thread_assign (info->owner, self); + info->location = loc; + + return TRUE; +} + +static void +g_mutex_unlock_errorcheck_impl (GMutex *mutex, + const gulong magic, + gchar * const location) +{ + GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex); + gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown"; + + GSystemThread self; + g_thread_functions_for_glib_use.thread_self (&self); + + if (g_system_thread_equal (info->owner, zero_thread)) + g_error ("Trying to unlock an unlocked mutex at '%s'", loc); + + if (!g_system_thread_equal (info->owner, self)) + g_warning ("Trying to unlock a mutex at '%s', " + "previously locked by a different thread at '%s'", + loc, info->location); + + g_system_thread_assign (info->owner, zero_thread); + info->location = NULL; + + g_thread_functions_for_glib_use_default.mutex_unlock (mutex); +} + +static void +g_mutex_free_errorcheck_impl (GMutex *mutex, + const gulong magic, + gchar * const location) +{ + GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex); + gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown"; + + if (info && !g_system_thread_equal (info->owner, zero_thread)) + g_error ("Trying to free a locked mutex at '%s', " + "which was previously locked at '%s'", + loc, info->location); + + g_thread_functions_for_glib_use_default.mutex_free (mutex); +} + +static void +g_cond_wait_errorcheck_impl (GCond *cond, + GMutex *mutex, + const gulong magic, + gchar * const location) +{ + GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex); + gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown"; + + GSystemThread self; + g_thread_functions_for_glib_use.thread_self (&self); + + if (g_system_thread_equal (info->owner, zero_thread)) + g_error ("Trying to use an unlocked mutex in g_cond_wait() at '%s'", loc); + + if (!g_system_thread_equal (info->owner, self)) + g_error ("Trying to use a mutex locked by another thread in " + "g_cond_wait() at '%s'", loc); + + g_system_thread_assign (info->owner, zero_thread); + loc = info->location; + + g_thread_functions_for_glib_use_default.cond_wait (cond, mutex); + + g_system_thread_assign (info->owner, self); + info->location = loc; +} + + +static gboolean +g_cond_timed_wait_errorcheck_impl (GCond *cond, + GMutex *mutex, + GTimeVal *end_time, + const gulong magic, + gchar * const location) +{ + GMutexDebugInfo *info = G_MUTEX_DEBUG_INFO (mutex); + gchar *loc = (magic == G_MUTEX_DEBUG_MAGIC) ? location : "unknown"; + gboolean retval; + + GSystemThread self; + g_thread_functions_for_glib_use.thread_self (&self); + + if (g_system_thread_equal (info->owner, zero_thread)) + g_error ("Trying to use an unlocked mutex in g_cond_timed_wait() at '%s'", + loc); + + if (!g_system_thread_equal (info->owner, self)) + g_error ("Trying to use a mutex locked by another thread in " + "g_cond_timed_wait() at '%s'", loc); + + g_system_thread_assign (info->owner, zero_thread); + loc = info->location; + + retval = g_thread_functions_for_glib_use_default.cond_timed_wait (cond, + mutex, + end_time); + + g_system_thread_assign (info->owner, self); + info->location = loc; + + return retval; +} + + +/* unshadow function declaration. See gthread.h */ +#undef g_thread_init + +void +g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init) +{ + GThreadFunctions errorcheck_functions; + if (init) + g_error ("Errorcheck mutexes can only be used for native " + "thread implementations. Sorry." ); + +#ifdef HAVE_G_THREAD_IMPL_INIT + /* This isn't called in g_thread_init, as it doesn't think to get + * the default implementation, so we have to call it on our own. + * + * We must call this before copying + * g_thread_functions_for_glib_use_default as the + * implementation-specific init function might modify the contents + * of g_thread_functions_for_glib_use_default based on operating + * system version, C library version, or whatever. */ + g_thread_impl_init(); +#endif /* HAVE_G_THREAD_IMPL_INIT */ + + errorcheck_functions = g_thread_functions_for_glib_use_default; + errorcheck_functions.mutex_new = g_mutex_new_errorcheck_impl; + errorcheck_functions.mutex_lock = + (void (*)(GMutex *)) g_mutex_lock_errorcheck_impl; + errorcheck_functions.mutex_trylock = + (gboolean (*)(GMutex *)) g_mutex_trylock_errorcheck_impl; + errorcheck_functions.mutex_unlock = + (void (*)(GMutex *)) g_mutex_unlock_errorcheck_impl; + errorcheck_functions.mutex_free = + (void (*)(GMutex *)) g_mutex_free_errorcheck_impl; + errorcheck_functions.cond_wait = + (void (*)(GCond *, GMutex *)) g_cond_wait_errorcheck_impl; + errorcheck_functions.cond_timed_wait = + (gboolean (*)(GCond *, GMutex *, GTimeVal *)) + g_cond_timed_wait_errorcheck_impl; + + g_thread_init (&errorcheck_functions); +} + +void +g_thread_init (GThreadFunctions* init) +{ + gboolean supported; + + if (thread_system_already_initialized) + { + if (init != NULL) + g_warning ("GThread system already initialized, ignoring custom thread implementation."); + + return; + } + + thread_system_already_initialized = TRUE; + + if (init == NULL) + { +#ifdef HAVE_G_THREAD_IMPL_INIT + /* now do any initialization stuff required by the + * implementation, but only if called with a NULL argument, of + * course. Otherwise it's up to the user to do so. */ + g_thread_impl_init(); +#endif /* HAVE_G_THREAD_IMPL_INIT */ + init = &g_thread_functions_for_glib_use_default; + } + else + g_thread_use_default_impl = FALSE; + + g_thread_functions_for_glib_use = *init; + if (g_thread_gettime_impl) + g_thread_gettime = g_thread_gettime_impl; + + supported = (init->mutex_new && + init->mutex_lock && + init->mutex_trylock && + init->mutex_unlock && + init->mutex_free && + init->cond_new && + init->cond_signal && + init->cond_broadcast && + init->cond_wait && + init->cond_timed_wait && + init->cond_free && + init->private_new && + init->private_get && + init->private_set && + init->thread_create && + init->thread_yield && + init->thread_join && + init->thread_exit && + init->thread_set_priority && + init->thread_self); + + /* if somebody is calling g_thread_init (), it means that he wants to + * have thread support, so check this + */ + if (!supported) + { + if (g_thread_use_default_impl) + g_error ("Threads are not supported on this platform."); + else + g_error ("The supplied thread function vector is invalid."); + } + + g_thread_priority_map [G_THREAD_PRIORITY_LOW] = PRIORITY_LOW_VALUE; + g_thread_priority_map [G_THREAD_PRIORITY_NORMAL] = PRIORITY_NORMAL_VALUE; + g_thread_priority_map [G_THREAD_PRIORITY_HIGH] = PRIORITY_HIGH_VALUE; + g_thread_priority_map [G_THREAD_PRIORITY_URGENT] = PRIORITY_URGENT_VALUE; + + g_thread_init_glib (); +} + +#else /* !G_THREADS_ENABLED */ + +void +g_thread_init (GThreadFunctions* init) +{ + g_error ("GLib thread support is disabled."); +} + +void +g_thread_init_with_errorcheck_mutexes (GThreadFunctions* init) +{ + g_error ("GLib thread support is disabled."); +} + +#endif /* !G_THREADS_ENABLED */ diff --git a/gthread/gthread-none.c b/gthread/gthread-none.c new file mode 100644 index 0000000..6fbeff1 --- /dev/null +++ b/gthread/gthread-none.c @@ -0,0 +1,39 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gthread.c: fallback thread system implementation + * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +static GThreadFunctions +g_thread_functions_for_glib_use_default; /* is NULLified */ + +static guint64 (*g_thread_gettime_impl) (void) = NULL; + +#define G_MUTEX_SIZE 0 diff --git a/gthread/gthread-posix.c b/gthread/gthread-posix.c new file mode 100644 index 0000000..9188f84 --- /dev/null +++ b/gthread/gthread-posix.c @@ -0,0 +1,467 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gthread.c: posix thread system implementation + * Copyright 1998 Sebastian Wilhelmi; University of Karlsruhe + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_SCHED_H +#include +#endif + +#define posix_check_err(err, name) G_STMT_START{ \ + int error = (err); \ + if (error) \ + g_error ("file %s: line %d (%s): error '%s' during '%s'", \ + __FILE__, __LINE__, G_STRFUNC, \ + g_strerror (error), name); \ + }G_STMT_END + +#define posix_check_cmd(cmd) posix_check_err (posix_error (cmd), #cmd) + +#ifdef G_ENABLE_DEBUG +static gboolean posix_check_cmd_prio_warned = FALSE; +# define posix_check_cmd_prio(cmd) G_STMT_START{ \ + int err = posix_error (cmd); \ + if (err == EPERM) \ + { \ + if (!posix_check_cmd_prio_warned) \ + { \ + posix_check_cmd_prio_warned = TRUE; \ + g_warning ("Priorities can only be changed " \ + "(resp. increased) by root."); \ + } \ + } \ + else \ + posix_check_err (err, #cmd); \ + }G_STMT_END +#else /* G_ENABLE_DEBUG */ +# define posix_check_cmd_prio(cmd) G_STMT_START{ \ + int err = posix_error (cmd); \ + if (err != EPERM) \ + posix_check_err (err, #cmd); \ + }G_STMT_END +#endif /* G_ENABLE_DEBUG */ + +#if defined(G_THREADS_IMPL_POSIX) +# define posix_error(what) (what) +# define mutexattr_default NULL +# define condattr_default NULL +#elif defined(G_THREADS_IMPL_DCE) +# define posix_error(what) ((what) == -1 ? errno : 0) +# define pthread_key_create(a, b) pthread_keycreate (a, b) +# define pthread_attr_init(a) pthread_attr_create (a) +# define pthread_attr_destroy(a) pthread_attr_delete (a) +# define pthread_create(a, b, c, d) pthread_create (a, *b, c, d) +# define mutexattr_default (pthread_mutexattr_default) +# define condattr_default (pthread_condattr_default) +#else /* neither G_THREADS_IMPL_POSIX nor G_THREADS_IMPL_DCE are defined */ +# error This should not happen. Contact the GLib team. +#endif + +#if defined (POSIX_MIN_PRIORITY) && defined (POSIX_MAX_PRIORITY) +# define HAVE_PRIORITIES 1 +static gint priority_normal_value; +# ifdef __FreeBSD__ + /* FreeBSD threads use different priority values from the POSIX_ + * defines so we just set them here. The corresponding macros + * PTHREAD_MIN_PRIORITY and PTHREAD_MAX_PRIORITY are implied to be + * exported by the docs, but they aren't. + */ +# define PRIORITY_LOW_VALUE 0 +# define PRIORITY_URGENT_VALUE 31 +# else /* !__FreeBSD__ */ +# define PRIORITY_LOW_VALUE POSIX_MIN_PRIORITY +# define PRIORITY_URGENT_VALUE POSIX_MAX_PRIORITY +# endif /* !__FreeBSD__ */ +# define PRIORITY_NORMAL_VALUE priority_normal_value +#endif /* POSIX_MIN_PRIORITY && POSIX_MAX_PRIORITY */ + +static gulong g_thread_min_stack_size = 0; + +#define G_MUTEX_SIZE (sizeof (pthread_mutex_t)) + +#if defined(HAVE_CLOCK_GETTIME) && defined(HAVE_MONOTONIC_CLOCK) +#define USE_CLOCK_GETTIME 1 +static gint posix_clock = 0; +#endif + +#if defined(_SC_THREAD_STACK_MIN) || defined (HAVE_PRIORITIES) || defined (USE_CLOCK_GETTIME) +#define HAVE_G_THREAD_IMPL_INIT +static void +g_thread_impl_init(void) +{ +#ifdef _SC_THREAD_STACK_MIN + g_thread_min_stack_size = MAX (sysconf (_SC_THREAD_STACK_MIN), 0); +#endif /* _SC_THREAD_STACK_MIN */ +#ifdef HAVE_PRIORITIES +# ifdef G_THREADS_IMPL_POSIX + { + struct sched_param sched; + int policy; + posix_check_cmd (pthread_getschedparam (pthread_self(), &policy, &sched)); + priority_normal_value = sched.sched_priority; + } +# else /* G_THREADS_IMPL_DCE */ + posix_check_cmd (priority_normal_value = + pthread_getprio (*(pthread_t*)thread, + g_thread_priority_map [priority])); +# endif +#endif /* HAVE_PRIORITIES */ + +#ifdef USE_CLOCK_GETTIME + if (sysconf (_SC_MONOTONIC_CLOCK) >= 0) + posix_clock = CLOCK_MONOTONIC; + else + posix_clock = CLOCK_REALTIME; +#endif +} +#endif /* _SC_THREAD_STACK_MIN || HAVE_PRIORITIES */ + +static GMutex * +g_mutex_new_posix_impl (void) +{ + GMutex *result = (GMutex *) g_new (pthread_mutex_t, 1); + posix_check_cmd (pthread_mutex_init ((pthread_mutex_t *) result, + mutexattr_default)); + return result; +} + +static void +g_mutex_free_posix_impl (GMutex * mutex) +{ + posix_check_cmd (pthread_mutex_destroy ((pthread_mutex_t *) mutex)); + g_free (mutex); +} + +/* NOTE: the functions g_mutex_lock and g_mutex_unlock may not use + functions from gmem.c and gmessages.c; */ + +/* pthread_mutex_lock, pthread_mutex_unlock can be taken directly, as + signature and semantic are right, but without error check then!!!!, + we might want to change this therefore. */ + +static gboolean +g_mutex_trylock_posix_impl (GMutex * mutex) +{ + int result; + + result = pthread_mutex_trylock ((pthread_mutex_t *) mutex); + +#ifdef G_THREADS_IMPL_POSIX + if (result == EBUSY) + return FALSE; +#else /* G_THREADS_IMPL_DCE */ + if (result == 0) + return FALSE; +#endif + + posix_check_err (posix_error (result), "pthread_mutex_trylock"); + return TRUE; +} + +static GCond * +g_cond_new_posix_impl (void) +{ + GCond *result = (GCond *) g_new (pthread_cond_t, 1); + posix_check_cmd (pthread_cond_init ((pthread_cond_t *) result, + condattr_default)); + return result; +} + +/* pthread_cond_signal, pthread_cond_broadcast and pthread_cond_wait + can be taken directly, as signature and semantic are right, but + without error check then!!!!, we might want to change this + therefore. */ + +#define G_NSEC_PER_SEC 1000000000 + +static gboolean +g_cond_timed_wait_posix_impl (GCond * cond, + GMutex * entered_mutex, + GTimeVal * abs_time) +{ + int result; + struct timespec end_time; + gboolean timed_out; + + g_return_val_if_fail (cond != NULL, FALSE); + g_return_val_if_fail (entered_mutex != NULL, FALSE); + + if (!abs_time) + { + result = pthread_cond_wait ((pthread_cond_t *)cond, + (pthread_mutex_t *) entered_mutex); + timed_out = FALSE; + } + else + { + end_time.tv_sec = abs_time->tv_sec; + end_time.tv_nsec = abs_time->tv_usec * (G_NSEC_PER_SEC / G_USEC_PER_SEC); + + g_return_val_if_fail (end_time.tv_nsec < G_NSEC_PER_SEC, TRUE); + + result = pthread_cond_timedwait ((pthread_cond_t *) cond, + (pthread_mutex_t *) entered_mutex, + &end_time); +#ifdef G_THREADS_IMPL_POSIX + timed_out = (result == ETIMEDOUT); +#else /* G_THREADS_IMPL_DCE */ + timed_out = (result == -1) && (errno == EAGAIN); +#endif + } + + if (!timed_out) + posix_check_err (posix_error (result), "pthread_cond_timedwait"); + + return !timed_out; +} + +static void +g_cond_free_posix_impl (GCond * cond) +{ + posix_check_cmd (pthread_cond_destroy ((pthread_cond_t *) cond)); + g_free (cond); +} + +static GPrivate * +g_private_new_posix_impl (GDestroyNotify destructor) +{ + GPrivate *result = (GPrivate *) g_new (pthread_key_t, 1); + posix_check_cmd (pthread_key_create ((pthread_key_t *) result, destructor)); + return result; +} + +/* NOTE: the functions g_private_get and g_private_set may not use + functions from gmem.c and gmessages.c */ + +static void +g_private_set_posix_impl (GPrivate * private_key, gpointer value) +{ + if (!private_key) + return; + pthread_setspecific (*(pthread_key_t *) private_key, value); +} + +static gpointer +g_private_get_posix_impl (GPrivate * private_key) +{ + if (!private_key) + return NULL; +#ifdef G_THREADS_IMPL_POSIX + return pthread_getspecific (*(pthread_key_t *) private_key); +#else /* G_THREADS_IMPL_DCE */ + { + void* data; + posix_check_cmd (pthread_getspecific (*(pthread_key_t *) private_key, + &data)); + return data; + } +#endif +} + +static void +g_thread_create_posix_impl (GThreadFunc thread_func, + gpointer arg, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + gpointer thread, + GError **error) +{ + pthread_attr_t attr; + gint ret; + + g_return_if_fail (thread_func); + g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW); + g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT); + + posix_check_cmd (pthread_attr_init (&attr)); + +#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE + if (stack_size) + { + stack_size = MAX (g_thread_min_stack_size, stack_size); + /* No error check here, because some systems can't do it and + * we simply don't want threads to fail because of that. */ + pthread_attr_setstacksize (&attr, stack_size); + } +#endif /* HAVE_PTHREAD_ATTR_SETSTACKSIZE */ + +#ifdef PTHREAD_SCOPE_SYSTEM + if (bound) + /* No error check here, because some systems can't do it and we + * simply don't want threads to fail because of that. */ + pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); +#endif /* PTHREAD_SCOPE_SYSTEM */ + +#ifdef G_THREADS_IMPL_POSIX + posix_check_cmd (pthread_attr_setdetachstate (&attr, + joinable ? PTHREAD_CREATE_JOINABLE : PTHREAD_CREATE_DETACHED)); +#endif /* G_THREADS_IMPL_POSIX */ + +#ifdef HAVE_PRIORITIES +# ifdef G_THREADS_IMPL_POSIX + { + struct sched_param sched; + posix_check_cmd (pthread_attr_getschedparam (&attr, &sched)); + sched.sched_priority = g_thread_priority_map [priority]; + posix_check_cmd_prio (pthread_attr_setschedparam (&attr, &sched)); + } +# else /* G_THREADS_IMPL_DCE */ + posix_check_cmd_prio + (pthread_attr_setprio (&attr, g_thread_priority_map [priority])); +# endif /* G_THREADS_IMPL_DCE */ +#endif /* HAVE_PRIORITIES */ + ret = posix_error (pthread_create (thread, &attr, + (void* (*)(void*))thread_func, arg)); + + posix_check_cmd (pthread_attr_destroy (&attr)); + + if (ret == EAGAIN) + { + g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN, + "Error creating thread: %s", g_strerror (ret)); + return; + } + + posix_check_err (ret, "pthread_create"); + +#ifdef G_THREADS_IMPL_DCE + if (!joinable) + posix_check_cmd (pthread_detach (thread)); +#endif /* G_THREADS_IMPL_DCE */ +} + +static void +g_thread_yield_posix_impl (void) +{ + POSIX_YIELD_FUNC; +} + +static void +g_thread_join_posix_impl (gpointer thread) +{ + gpointer ignore; + posix_check_cmd (pthread_join (*(pthread_t*)thread, &ignore)); +} + +static void +g_thread_exit_posix_impl (void) +{ + pthread_exit (NULL); +} + +static void +g_thread_set_priority_posix_impl (gpointer thread, GThreadPriority priority) +{ + g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW); + g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT); +#ifdef HAVE_PRIORITIES +# ifdef G_THREADS_IMPL_POSIX + { + struct sched_param sched; + int policy; + posix_check_cmd (pthread_getschedparam (*(pthread_t*)thread, &policy, + &sched)); + sched.sched_priority = g_thread_priority_map [priority]; + posix_check_cmd_prio (pthread_setschedparam (*(pthread_t*)thread, policy, + &sched)); + } +# else /* G_THREADS_IMPL_DCE */ + posix_check_cmd_prio (pthread_setprio (*(pthread_t*)thread, + g_thread_priority_map [priority])); +# endif +#endif /* HAVE_PRIORITIES */ +} + +static void +g_thread_self_posix_impl (gpointer thread) +{ + *(pthread_t*)thread = pthread_self(); +} + +static gboolean +g_thread_equal_posix_impl (gpointer thread1, gpointer thread2) +{ + return (pthread_equal (*(pthread_t*)thread1, *(pthread_t*)thread2) != 0); +} + +#ifdef USE_CLOCK_GETTIME +static guint64 +gettime (void) +{ + struct timespec tv; + + clock_gettime (posix_clock, &tv); + + return (guint64) tv.tv_sec * G_NSEC_PER_SEC + tv.tv_nsec; +} +static guint64 (*g_thread_gettime_impl)(void) = gettime; +#else +static guint64 (*g_thread_gettime_impl)(void) = 0; +#endif + +static GThreadFunctions g_thread_functions_for_glib_use_default = +{ + g_mutex_new_posix_impl, + (void (*)(GMutex *)) pthread_mutex_lock, + g_mutex_trylock_posix_impl, + (void (*)(GMutex *)) pthread_mutex_unlock, + g_mutex_free_posix_impl, + g_cond_new_posix_impl, + (void (*)(GCond *)) pthread_cond_signal, + (void (*)(GCond *)) pthread_cond_broadcast, + (void (*)(GCond *, GMutex *)) pthread_cond_wait, + g_cond_timed_wait_posix_impl, + g_cond_free_posix_impl, + g_private_new_posix_impl, + g_private_get_posix_impl, + g_private_set_posix_impl, + g_thread_create_posix_impl, + g_thread_yield_posix_impl, + g_thread_join_posix_impl, + g_thread_exit_posix_impl, + g_thread_set_priority_posix_impl, + g_thread_self_posix_impl, + g_thread_equal_posix_impl +}; diff --git a/gthread/gthread-win32.c b/gthread/gthread-win32.c new file mode 100644 index 0000000..465b205 --- /dev/null +++ b/gthread/gthread-win32.c @@ -0,0 +1,639 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * gthread.c: solaris thread system implementation + * Copyright 1998-2001 Sebastian Wilhelmi; University of Karlsruhe + * Copyright 2001 Hans Breuer + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include "glib.h" + +#define STRICT +#define _WIN32_WINDOWS 0x0401 /* to get IsDebuggerPresent */ +#include +#undef STRICT + +#include +#include +#include + +#define win32_check_for_error(what) G_STMT_START{ \ + if (!(what)) \ + g_error ("file %s: line %d (%s): error %s during %s", \ + __FILE__, __LINE__, G_STRFUNC, \ + g_win32_error_message (GetLastError ()), #what); \ + }G_STMT_END + +#define G_MUTEX_SIZE (sizeof (gpointer)) + +#define PRIORITY_LOW_VALUE THREAD_PRIORITY_BELOW_NORMAL +#define PRIORITY_NORMAL_VALUE THREAD_PRIORITY_NORMAL +#define PRIORITY_HIGH_VALUE THREAD_PRIORITY_ABOVE_NORMAL +#define PRIORITY_URGENT_VALUE THREAD_PRIORITY_HIGHEST + +static DWORD g_thread_self_tls; +static DWORD g_private_tls; +static DWORD g_cond_event_tls; +static CRITICAL_SECTION g_thread_global_spinlock; + +typedef BOOL (__stdcall *GTryEnterCriticalSectionFunc) (CRITICAL_SECTION *); + +static GTryEnterCriticalSectionFunc try_enter_critical_section = NULL; + +/* As noted in the docs, GPrivate is a limited resource, here we take + * a rather low maximum to save memory, use GStaticPrivate instead. */ +#define G_PRIVATE_MAX 100 + +static GDestroyNotify g_private_destructors[G_PRIVATE_MAX]; + +static guint g_private_next = 0; + +/* A "forward" declaration of this structure */ +static GThreadFunctions g_thread_functions_for_glib_use_default; + +typedef struct _GThreadData GThreadData; +struct _GThreadData +{ + GThreadFunc func; + gpointer data; + HANDLE thread; + gboolean joinable; +}; + +struct _GCond +{ + GPtrArray *array; + CRITICAL_SECTION lock; +}; + +static GMutex * +g_mutex_new_win32_cs_impl (void) +{ + CRITICAL_SECTION *cs = g_new (CRITICAL_SECTION, 1); + gpointer *retval = g_new (gpointer, 1); + + InitializeCriticalSection (cs); + *retval = cs; + return (GMutex *) retval; +} + +static void +g_mutex_free_win32_cs_impl (GMutex *mutex) +{ + gpointer *ptr = (gpointer *) mutex; + CRITICAL_SECTION *cs = (CRITICAL_SECTION *) *ptr; + + DeleteCriticalSection (cs); + g_free (cs); + g_free (mutex); +} + +/* NOTE: the functions g_mutex_lock and g_mutex_unlock may not use + functions from gmem.c and gmessages.c; */ + +static void +g_mutex_lock_win32_cs_impl (GMutex *mutex) +{ + EnterCriticalSection (*(CRITICAL_SECTION **)mutex); +} + +static gboolean +g_mutex_trylock_win32_cs_impl (GMutex * mutex) +{ + return try_enter_critical_section (*(CRITICAL_SECTION **)mutex); +} + +static void +g_mutex_unlock_win32_cs_impl (GMutex *mutex) +{ + LeaveCriticalSection (*(CRITICAL_SECTION **)mutex); +} + +static GMutex * +g_mutex_new_win32_impl (void) +{ + HANDLE handle; + HANDLE *retval; + win32_check_for_error (handle = CreateMutex (NULL, FALSE, NULL)); + retval = g_new (HANDLE, 1); + *retval = handle; + return (GMutex *) retval; +} + +static void +g_mutex_free_win32_impl (GMutex *mutex) +{ + win32_check_for_error (CloseHandle (*(HANDLE *) mutex)); + g_free (mutex); +} + +/* NOTE: the functions g_mutex_lock and g_mutex_unlock may not use + functions from gmem.c and gmessages.c; */ + +static void +g_mutex_lock_win32_impl (GMutex *mutex) +{ + WaitForSingleObject (*(HANDLE *) mutex, INFINITE); +} + +static gboolean +g_mutex_trylock_win32_impl (GMutex * mutex) +{ + DWORD result; + win32_check_for_error (WAIT_FAILED != + (result = WaitForSingleObject (*(HANDLE *)mutex, 0))); + return result != WAIT_TIMEOUT; +} + +static void +g_mutex_unlock_win32_impl (GMutex *mutex) +{ + ReleaseMutex (*(HANDLE *) mutex); +} + +static GCond * +g_cond_new_win32_impl (void) +{ + GCond *retval = g_new (GCond, 1); + + retval->array = g_ptr_array_new (); + InitializeCriticalSection (&retval->lock); + + return retval; +} + +static void +g_cond_signal_win32_impl (GCond * cond) +{ + EnterCriticalSection (&cond->lock); + + if (cond->array->len > 0) + { + SetEvent (g_ptr_array_index (cond->array, 0)); + g_ptr_array_remove_index (cond->array, 0); + } + + LeaveCriticalSection (&cond->lock); +} + +static void +g_cond_broadcast_win32_impl (GCond * cond) +{ + guint i; + EnterCriticalSection (&cond->lock); + + for (i = 0; i < cond->array->len; i++) + SetEvent (g_ptr_array_index (cond->array, i)); + + g_ptr_array_set_size (cond->array, 0); + LeaveCriticalSection (&cond->lock); +} + +static gboolean +g_cond_wait_internal (GCond *cond, + GMutex *entered_mutex, + gulong milliseconds) +{ + gulong retval; + HANDLE event = TlsGetValue (g_cond_event_tls); + + if (!event) + { + win32_check_for_error (event = CreateEvent (0, FALSE, FALSE, NULL)); + TlsSetValue (g_cond_event_tls, event); + } + + EnterCriticalSection (&cond->lock); + + /* The event must not be signaled. Check this */ + g_assert (WaitForSingleObject (event, 0) == WAIT_TIMEOUT); + + g_ptr_array_add (cond->array, event); + LeaveCriticalSection (&cond->lock); + + g_thread_functions_for_glib_use_default.mutex_unlock (entered_mutex); + + win32_check_for_error (WAIT_FAILED != + (retval = WaitForSingleObject (event, milliseconds))); + + g_thread_functions_for_glib_use_default.mutex_lock (entered_mutex); + + if (retval == WAIT_TIMEOUT) + { + EnterCriticalSection (&cond->lock); + g_ptr_array_remove (cond->array, event); + + /* In the meantime we could have been signaled, so we must again + * wait for the signal, this time with no timeout, to reset + * it. retval is set again to honour the late arrival of the + * signal */ + win32_check_for_error (WAIT_FAILED != + (retval = WaitForSingleObject (event, 0))); + + LeaveCriticalSection (&cond->lock); + } + +#ifndef G_DISABLE_ASSERT + EnterCriticalSection (&cond->lock); + + /* Now event must not be inside the array, check this */ + g_assert (g_ptr_array_remove (cond->array, event) == FALSE); + + LeaveCriticalSection (&cond->lock); +#endif /* !G_DISABLE_ASSERT */ + + return retval != WAIT_TIMEOUT; +} + +static void +g_cond_wait_win32_impl (GCond *cond, + GMutex *entered_mutex) +{ + g_return_if_fail (cond != NULL); + g_return_if_fail (entered_mutex != NULL); + + g_cond_wait_internal (cond, entered_mutex, INFINITE); +} + +static gboolean +g_cond_timed_wait_win32_impl (GCond *cond, + GMutex *entered_mutex, + GTimeVal *abs_time) +{ + GTimeVal current_time; + gulong to_wait; + + g_return_val_if_fail (cond != NULL, FALSE); + g_return_val_if_fail (entered_mutex != NULL, FALSE); + + if (!abs_time) + to_wait = INFINITE; + else + { + g_get_current_time (¤t_time); + if (abs_time->tv_sec < current_time.tv_sec || + (abs_time->tv_sec == current_time.tv_sec && + abs_time->tv_usec <= current_time.tv_usec)) + to_wait = 0; + else + to_wait = (abs_time->tv_sec - current_time.tv_sec) * 1000 + + (abs_time->tv_usec - current_time.tv_usec) / 1000; + } + + return g_cond_wait_internal (cond, entered_mutex, to_wait); +} + +static void +g_cond_free_win32_impl (GCond * cond) +{ + DeleteCriticalSection (&cond->lock); + g_ptr_array_free (cond->array, TRUE); + g_free (cond); +} + +static GPrivate * +g_private_new_win32_impl (GDestroyNotify destructor) +{ + GPrivate *result; + EnterCriticalSection (&g_thread_global_spinlock); + if (g_private_next >= G_PRIVATE_MAX) + { + char buf[100]; + sprintf (buf, + "Too many GPrivate allocated. Their number is limited to %d.", + G_PRIVATE_MAX); + MessageBox (NULL, buf, NULL, MB_ICONERROR|MB_SETFOREGROUND); + if (IsDebuggerPresent ()) + G_BREAKPOINT (); + abort (); + } + g_private_destructors[g_private_next] = destructor; + result = GUINT_TO_POINTER (g_private_next); + g_private_next++; + LeaveCriticalSection (&g_thread_global_spinlock); + + return result; +} + +/* NOTE: the functions g_private_get and g_private_set may not use + functions from gmem.c and gmessages.c */ + +static void +g_private_set_win32_impl (GPrivate * private_key, gpointer value) +{ + gpointer* array = TlsGetValue (g_private_tls); + guint index = GPOINTER_TO_UINT (private_key); + + if (index >= G_PRIVATE_MAX) + return; + + if (!array) + { + array = (gpointer*) calloc (G_PRIVATE_MAX, sizeof (gpointer)); + TlsSetValue (g_private_tls, array); + } + + array[index] = value; +} + +static gpointer +g_private_get_win32_impl (GPrivate * private_key) +{ + gpointer* array = TlsGetValue (g_private_tls); + guint index = GPOINTER_TO_UINT (private_key); + + if (index >= G_PRIVATE_MAX || !array) + return NULL; + + return array[index]; +} + +static void +g_thread_set_priority_win32_impl (gpointer thread, GThreadPriority priority) +{ + GThreadData *target = *(GThreadData **)thread; + + g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW); + g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT); + + win32_check_for_error (SetThreadPriority (target->thread, + g_thread_priority_map [priority])); +} + +static void +g_thread_self_win32_impl (gpointer thread) +{ + GThreadData *self = TlsGetValue (g_thread_self_tls); + + if (!self) + { + /* This should only happen for the main thread! */ + HANDLE handle = GetCurrentThread (); + HANDLE process = GetCurrentProcess (); + self = g_new (GThreadData, 1); + win32_check_for_error (DuplicateHandle (process, handle, process, + &self->thread, 0, FALSE, + DUPLICATE_SAME_ACCESS)); + win32_check_for_error (TlsSetValue (g_thread_self_tls, self)); + self->func = NULL; + self->data = NULL; + self->joinable = FALSE; + } + + *(GThreadData **)thread = self; +} + +static void +g_thread_exit_win32_impl (void) +{ + GThreadData *self = TlsGetValue (g_thread_self_tls); + guint i, private_max; + gpointer *array = TlsGetValue (g_private_tls); + HANDLE event = TlsGetValue (g_cond_event_tls); + + EnterCriticalSection (&g_thread_global_spinlock); + private_max = g_private_next; + LeaveCriticalSection (&g_thread_global_spinlock); + + if (array) + { + gboolean some_data_non_null; + + do { + some_data_non_null = FALSE; + for (i = 0; i < private_max; i++) + { + GDestroyNotify destructor = g_private_destructors[i]; + GDestroyNotify data = array[i]; + + if (data) + some_data_non_null = TRUE; + + array[i] = NULL; + + if (destructor && data) + destructor (data); + } + } while (some_data_non_null); + + free (array); + + win32_check_for_error (TlsSetValue (g_private_tls, NULL)); + } + + if (self) + { + if (!self->joinable) + { + win32_check_for_error (CloseHandle (self->thread)); + g_free (self); + } + win32_check_for_error (TlsSetValue (g_thread_self_tls, NULL)); + } + + if (event) + { + CloseHandle (event); + win32_check_for_error (TlsSetValue (g_cond_event_tls, NULL)); + } + + _endthreadex (0); +} + +static guint __stdcall +g_thread_proxy (gpointer data) +{ + GThreadData *self = (GThreadData*) data; + + win32_check_for_error (TlsSetValue (g_thread_self_tls, self)); + + self->func (self->data); + + g_thread_exit_win32_impl (); + + g_assert_not_reached (); + + return 0; +} + +static void +g_thread_create_win32_impl (GThreadFunc func, + gpointer data, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + gpointer thread, + GError **error) +{ + guint ignore; + GThreadData *retval; + + g_return_if_fail (func); + g_return_if_fail (priority >= G_THREAD_PRIORITY_LOW); + g_return_if_fail (priority <= G_THREAD_PRIORITY_URGENT); + + retval = g_new(GThreadData, 1); + retval->func = func; + retval->data = data; + + retval->joinable = joinable; + + retval->thread = (HANDLE) _beginthreadex (NULL, stack_size, g_thread_proxy, + retval, 0, &ignore); + + if (retval->thread == NULL) + { + gchar *win_error = g_win32_error_message (GetLastError ()); + g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN, + "Error creating thread: %s", win_error); + g_free (retval); + g_free (win_error); + return; + } + + *(GThreadData **)thread = retval; + + g_thread_set_priority_win32_impl (thread, priority); +} + +static void +g_thread_yield_win32_impl (void) +{ + Sleep(0); +} + +static void +g_thread_join_win32_impl (gpointer thread) +{ + GThreadData *target = *(GThreadData **)thread; + + g_return_if_fail (target->joinable); + + win32_check_for_error (WAIT_FAILED != + WaitForSingleObject (target->thread, INFINITE)); + + win32_check_for_error (CloseHandle (target->thread)); + g_free (target); +} + +static guint64 +g_thread_gettime_impl (void) +{ + guint64 v; + + /* Returns 100s of nanoseconds since start of 1601 */ + GetSystemTimeAsFileTime ((FILETIME *)&v); + + /* Offset to Unix epoch */ + v -= G_GINT64_CONSTANT (116444736000000000); + /* Convert to nanoseconds */ + v *= 100; + + return v; +} + +static GThreadFunctions g_thread_functions_for_glib_use_default = +{ + g_mutex_new_win32_impl, /* mutex */ + g_mutex_lock_win32_impl, + g_mutex_trylock_win32_impl, + g_mutex_unlock_win32_impl, + g_mutex_free_win32_impl, + g_cond_new_win32_impl, /* condition */ + g_cond_signal_win32_impl, + g_cond_broadcast_win32_impl, + g_cond_wait_win32_impl, + g_cond_timed_wait_win32_impl, + g_cond_free_win32_impl, + g_private_new_win32_impl, /* private thread data */ + g_private_get_win32_impl, + g_private_set_win32_impl, + g_thread_create_win32_impl, /* thread */ + g_thread_yield_win32_impl, + g_thread_join_win32_impl, + g_thread_exit_win32_impl, + g_thread_set_priority_win32_impl, + g_thread_self_win32_impl, + NULL /* no equal function necessary */ +}; + +#define HAVE_G_THREAD_IMPL_INIT +static void +g_thread_impl_init () +{ + static gboolean beenhere = FALSE; + HMODULE kernel32; + + if (beenhere) + return; + + beenhere = TRUE; + + win32_check_for_error (TLS_OUT_OF_INDEXES != + (g_thread_self_tls = TlsAlloc ())); + win32_check_for_error (TLS_OUT_OF_INDEXES != + (g_private_tls = TlsAlloc ())); + win32_check_for_error (TLS_OUT_OF_INDEXES != + (g_cond_event_tls = TlsAlloc ())); + InitializeCriticalSection (&g_thread_global_spinlock); + + /* Here we are looking for TryEnterCriticalSection in KERNEL32.DLL, + * if it is found, we can use the in general faster critical + * sections instead of mutexes. See + * http://world.std.com/~jmhart/csmutx.htm for some discussion. + */ + kernel32 = GetModuleHandle ("KERNEL32.DLL"); + if (kernel32) + { + try_enter_critical_section = (GTryEnterCriticalSectionFunc) + GetProcAddress(kernel32, "TryEnterCriticalSection"); + + /* Even if TryEnterCriticalSection is found, it is not + * necessarily working..., we have to check it */ + if (try_enter_critical_section && + try_enter_critical_section (&g_thread_global_spinlock)) + { + LeaveCriticalSection (&g_thread_global_spinlock); + + g_thread_functions_for_glib_use_default.mutex_new = + g_mutex_new_win32_cs_impl; + g_thread_functions_for_glib_use_default.mutex_lock = + g_mutex_lock_win32_cs_impl; + g_thread_functions_for_glib_use_default.mutex_trylock = + g_mutex_trylock_win32_cs_impl; + g_thread_functions_for_glib_use_default.mutex_unlock = + g_mutex_unlock_win32_cs_impl; + g_thread_functions_for_glib_use_default.mutex_free = + g_mutex_free_win32_cs_impl; + } + } +} diff --git a/gthread/gthread.def b/gthread/gthread.def new file mode 100644 index 0000000..200b043 --- /dev/null +++ b/gthread/gthread.def @@ -0,0 +1,3 @@ +EXPORTS + g_thread_init + g_thread_init_with_errorcheck_mutexes diff --git a/gthread/gthread.rc.in b/gthread/gthread.rc.in new file mode 100644 index 0000000..67a2a46 --- /dev/null +++ b/gthread/gthread.rc.in @@ -0,0 +1,30 @@ +#include + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + PRODUCTVERSION @GLIB_MAJOR_VERSION@,@GLIB_MINOR_VERSION@,@GLIB_MICRO_VERSION@,0 + FILEFLAGSMASK 0 + FILEFLAGS 0 + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "The GLib developer community" + VALUE "FileDescription", "GThread" + VALUE "FileVersion", "@GLIB_VERSION@.0" + VALUE "InternalName", "libgthread-2.0-@LT_CURRENT_MINUS_AGE@" + VALUE "LegalCopyright", "Copyright © 1995-2010 Peter Mattis, Spencer Kimball, Josh MacDonald, Sebastian Wilhelmi and others." + VALUE "OriginalFilename", "libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll" + VALUE "ProductName", "GLib" + VALUE "ProductVersion", "@GLIB_VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + END diff --git a/gthread/makefile.msc.in b/gthread/makefile.msc.in new file mode 100644 index 0000000..226bf9c --- /dev/null +++ b/gthread/makefile.msc.in @@ -0,0 +1,26 @@ +## Makefile for building the gthread dll with Microsoft C +## Use: nmake -f makefile.msc install + +TOP = ..\.. + +!INCLUDE ..\build\win32\make.msc + +################################################################ + +INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I . -I ..\glib +DEFINES = -DHAVE_CONFIG_H -DG_LOG_DOMAIN=\"GThread\" +all : \ + libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll + +gthread_OBJECTS = \ + gthread-impl.obj + +gthread-impl.obj : gthread-impl.c gthread-win32.c + $(CC) -c $(CFLAGS) gthread-impl.c + +gthread.res : gthread.rc + rc -DBUILDNUMBER=0 -r -fo gthread.res gthread.rc + +libgthread-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(gthread_OBJECTS) gthread.def gthread.res + $(CC) $(CFLAGS) -LD -Fe$@ $(gthread_OBJECTS) gthread.res \ + ..\glib\glib-2.0.lib $(DEPCLIBS) user32.lib $(LDFLAGS) /implib:gthread-2.0.lib /def:gthread.def diff --git a/gthread/tests/1bit-mutex.c b/gthread/tests/1bit-mutex.c new file mode 100644 index 0000000..dff095c --- /dev/null +++ b/gthread/tests/1bit-mutex.c @@ -0,0 +1,127 @@ +/* + * Copyright © 2008 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * This program 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 of the + * License, or (at your option) any later version. + * + * See the included COPYING file for more information. + */ + +/* LOCKS should be more than the number of contention + * counters in gthread.c in order to ensure we exercise + * the case where they overlap. + */ +#define LOCKS 48 +#define ITERATIONS 10000 +#define THREADS 100 + + +#if TEST_EMULATED_FUTEX + /* this is defined for the 1bit-mutex-emufutex test. + * + * we want to test the emulated futex even if futex(2) is available. + */ + + /* side-step some glib build stuff */ + #define DISABLE_VISIBILITY + #define GLIB_COMPILATION + + /* rebuild gbitlock.c without futex support, + defining our own version of the g_bit_*lock symbols + */ + #define g_bit_lock _emufutex_g_bit_lock + #define g_bit_trylock _emufutex_g_bit_trylock + #define g_bit_unlock _emufutex_g_bit_unlock + #define _g_futex_thread_init _emufutex_g_futex_thread_init + + #define G_BIT_LOCK_FORCE_FUTEX_EMULATION + + #include +#endif + +#include + +volatile GThread *owners[LOCKS]; +volatile gint locks[LOCKS]; +volatile gint bits[LOCKS]; + +static void +acquire (int nr) +{ + GThread *self; + + self = g_thread_self (); + + g_bit_lock (&locks[nr], bits[nr]); + g_assert (owners[nr] == NULL); /* hopefully nobody else is here */ + owners[nr] = self; + + /* let some other threads try to ruin our day */ + g_thread_yield (); + g_thread_yield (); + g_thread_yield (); + + g_assert (owners[nr] == self); /* hopefully this is still us... */ + owners[nr] = NULL; /* make way for the next guy */ + g_bit_unlock (&locks[nr], bits[nr]); +} + +static gpointer +thread_func (gpointer data) +{ + gint i; + + for (i = 0; i < ITERATIONS; i++) + acquire (g_random_int () % LOCKS); + + return NULL; +} + +static void +testcase (void) +{ + GThread *threads[THREADS]; + int i; + + g_thread_init (NULL); + +#ifdef TEST_EMULATED_FUTEX + _g_futex_thread_init (); + #define SUFFIX "-emufutex" + + /* ensure that we are using the emulated futex by checking + * (at compile-time) for the existance of 'g_futex_mutex' + */ + g_assert (g_futex_mutex != NULL); +#else + #define SUFFIX "" +#endif + + for (i = 0; i < LOCKS; i++) + bits[i] = g_random_int () % 32; + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_create (thread_func, NULL, TRUE, NULL); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + for (i = 0; i < LOCKS; i++) + { + g_assert (owners[i] == NULL); + g_assert (locks[i] == 0); + } +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/glib/1bit-mutex" SUFFIX, testcase); + + return g_test_run (); +} diff --git a/gthread/tests/Makefile.am b/gthread/tests/Makefile.am new file mode 100644 index 0000000..c5fb653 --- /dev/null +++ b/gthread/tests/Makefile.am @@ -0,0 +1,15 @@ +include $(top_srcdir)/Makefile.decl + +INCLUDES = -g -I$(top_srcdir) -I$(top_srcdir)/glib $(GLIB_DEBUG_FLAGS) + +noinst_PROGRAMS = $(TEST_PROGS) +progs_ldadd = $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gthread/libgthread-2.0.la + +TEST_PROGS += 1bit-mutex +1bit_mutex_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la + +TEST_PROGS += 1bit-emufutex +1bit_emufutex_SOURCES = 1bit-mutex.c +1bit_emufutex_CFLAGS = -DTEST_EMULATED_FUTEX +1bit_emufutex_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la diff --git a/gthread/tests/Makefile.in b/gthread/tests/Makefile.in new file mode 100644 index 0000000..7b11399 --- /dev/null +++ b/gthread/tests/Makefile.in @@ -0,0 +1,688 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +noinst_PROGRAMS = $(am__EXEEXT_1) +subdir = gthread/tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = 1bit-mutex$(EXEEXT) 1bit-emufutex$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +am_1bit_emufutex_OBJECTS = 1bit_emufutex-1bit-mutex.$(OBJEXT) +1bit_emufutex_OBJECTS = $(am_1bit_emufutex_OBJECTS) +1bit_emufutex_DEPENDENCIES = $(progs_ldadd) \ + $(top_builddir)/gthread/libgthread-2.0.la +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +1bit_emufutex_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(1bit_emufutex_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +1bit_mutex_SOURCES = 1bit-mutex.c +1bit_mutex_OBJECTS = 1bit-mutex.$(OBJEXT) +1bit_mutex_DEPENDENCIES = $(progs_ldadd) \ + $(top_builddir)/gthread/libgthread-2.0.la +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(1bit_emufutex_SOURCES) 1bit-mutex.c +DIST_SOURCES = $(1bit_emufutex_SOURCES) 1bit-mutex.c +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = 1bit-mutex 1bit-emufutex +INCLUDES = -g -I$(top_srcdir) -I$(top_srcdir)/glib $(GLIB_DEBUG_FLAGS) +progs_ldadd = $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gthread/libgthread-2.0.la + +1bit_mutex_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la +1bit_emufutex_SOURCES = 1bit-mutex.c +1bit_emufutex_CFLAGS = -DTEST_EMULATED_FUTEX +1bit_emufutex_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu gthread/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gthread/tests/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-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 +1bit-emufutex$(EXEEXT): $(1bit_emufutex_OBJECTS) $(1bit_emufutex_DEPENDENCIES) + @rm -f 1bit-emufutex$(EXEEXT) + $(AM_V_CCLD)$(1bit_emufutex_LINK) $(1bit_emufutex_OBJECTS) $(1bit_emufutex_LDADD) $(LIBS) +1bit-mutex$(EXEEXT): $(1bit_mutex_OBJECTS) $(1bit_mutex_DEPENDENCIES) + @rm -f 1bit-mutex$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(1bit_mutex_OBJECTS) $(1bit_mutex_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/1bit-mutex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/1bit_emufutex-1bit-mutex.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 $@ $< + +1bit_emufutex-1bit-mutex.o: 1bit-mutex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(1bit_emufutex_CFLAGS) $(CFLAGS) -MT 1bit_emufutex-1bit-mutex.o -MD -MP -MF $(DEPDIR)/1bit_emufutex-1bit-mutex.Tpo -c -o 1bit_emufutex-1bit-mutex.o `test -f '1bit-mutex.c' || echo '$(srcdir)/'`1bit-mutex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/1bit_emufutex-1bit-mutex.Tpo $(DEPDIR)/1bit_emufutex-1bit-mutex.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='1bit-mutex.c' object='1bit_emufutex-1bit-mutex.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(1bit_emufutex_CFLAGS) $(CFLAGS) -c -o 1bit_emufutex-1bit-mutex.o `test -f '1bit-mutex.c' || echo '$(srcdir)/'`1bit-mutex.c + +1bit_emufutex-1bit-mutex.obj: 1bit-mutex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(1bit_emufutex_CFLAGS) $(CFLAGS) -MT 1bit_emufutex-1bit-mutex.obj -MD -MP -MF $(DEPDIR)/1bit_emufutex-1bit-mutex.Tpo -c -o 1bit_emufutex-1bit-mutex.obj `if test -f '1bit-mutex.c'; then $(CYGPATH_W) '1bit-mutex.c'; else $(CYGPATH_W) '$(srcdir)/1bit-mutex.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/1bit_emufutex-1bit-mutex.Tpo $(DEPDIR)/1bit_emufutex-1bit-mutex.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='1bit-mutex.c' object='1bit_emufutex-1bit-mutex.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(1bit_emufutex_CFLAGS) $(CFLAGS) -c -o 1bit_emufutex-1bit-mutex.obj `if test -f '1bit-mutex.c'; then $(CYGPATH_W) '1bit-mutex.c'; else $(CYGPATH_W) '$(srcdir)/1bit-mutex.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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 clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstPROGRAMS ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/gtk-doc.make b/gtk-doc.make new file mode 100644 index 0000000..63adaed --- /dev/null +++ b/gtk-doc.make @@ -0,0 +1,224 @@ +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = $(LIBTOOL) --mode=execute +else +GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(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) + +EXTRA_DIST = \ + $(content_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \ + pdf-build.stamp \ + $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \ + $(srcdir)/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 + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo 'gtk-doc: Scanning header files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-scan --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --ignore-headers="$(IGNORE_HFILES)" $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \ + else \ + cd $(srcdir) ; \ + 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: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo 'gtk-doc: Rebuilding template files' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + @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 'gtk-doc: Building XML' + @-chmod -R u+w $(srcdir) + @cd $(srcdir) && \ + gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $(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 'gtk-doc: Building HTML' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/html + @mkdir $(srcdir)/html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options=--path="$(srcdir)"; \ + fi; \ + cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html ) + @echo 'gtk-doc: Fixing cross-references' + @cd $(srcdir) && 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 'gtk-doc: Building PDF' + @-chmod -R u+w $(srcdir) + @rm -rf $(srcdir)/$(DOC_MODULE).pdf + @mkpdf_imgdirs=""; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + rm -f *~ *.bak + rm -rf .libs + +distclean-local: + cd $(srcdir) && \ + rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html + +install-data-local: + @installfiles=`echo $(srcdir)/html/*`; \ + if test "$$installfiles" = '$(srcdir)/html/*'; \ + then echo '-- 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 '-- Installing '$$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; \ + mv -f $${installdir}/$(DOC_MODULE).devhelp \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \ + 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 $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + cp $(srcdir)/html/* $(distdir)/html + -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/ + -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/ + -cp $(srcdir)/$(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/install-sh b/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.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 + 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 + 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 + trap '(exit $?); exit' 1 2 13 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 starting with `-'. + 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 + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # 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 -z "$d" && 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 100755 index 0000000..a72f2fd --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,8406 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6b +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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 +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long 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. +# 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.2.6b +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=2.2.6b +TIMESTAMP="" +package_revision=1.3017 + +# 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 + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +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 + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${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_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 "X${1}" | $Xsed -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 "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# 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" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# 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=: + 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' + +# 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${mode+: }$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_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$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 "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e '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 "X$my_tmpdir" | $Xsed +} + + +# 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 "X$1" | $Xsed -e "$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 "X$1" | $Xsed \ + -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_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$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 () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + 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 --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </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 +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # 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 + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 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 + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + 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_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# 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 +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$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 + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$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=$mode' for more information." +} + + +# 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_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# 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_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_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + 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 "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # 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_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # 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 <?"'"'"' &()|`$[]' \ + && 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e '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 + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + 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 + command="$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 + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$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 "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $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 building PIC objects only + -prefer-non-pic try to building 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 + +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 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 + -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 + +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 \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# 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 $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # 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 + dir="$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 + -*) ;; + *) + # 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_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + 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 "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + 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" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $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 "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$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. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; 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" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_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 -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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # 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 "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -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 "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "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_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" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + 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 "X$lib" | $Xsed -e '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 "X$relink_command" | $Xsed -e '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 "X$file$stripped_ext" | $Xsed -e "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_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $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 "$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 + +/* 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 "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $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" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + 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; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +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) ;; + *) symtab_cflags="$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 "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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. +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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $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_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + 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 | $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 | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $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. +Xsed='${SED} -e 1s/^X//' +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 + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_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 \"X\$thisdir\" | \$Xsed -e '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" + + # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# 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=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# 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. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # 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_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# 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 +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#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 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#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) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +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_fatal (const char *message, ...); +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_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 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; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + 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; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + 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 ("getcwd failed"); + 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 ("getcwd failed"); + 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) + { + LTWRAPPER_DEBUGPRINTF (("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 + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("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; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? 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; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? 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) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? 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 +} +# end: func_emit_cwrapperexe_src + +# 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 + 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 + 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 + dlfiles="$dlfiles $arg" + else + dlprefiles="$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 "*) ;; + *) deplibs="$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 +# moreargs="$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 + dlfiles="$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. + dlprefiles="$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 "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$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 + ;; + + -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" + dir=$func_stripname_result + if test -z "$dir"; 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 + # 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 "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$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*) + # 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 + deplibs="$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 + deplibs="$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) + compiler_flags="$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) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$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_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$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" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$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" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$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" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$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 + dlfiles="$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. + dlprefiles="$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. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + 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 \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # 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_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$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 "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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% $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= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$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) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$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 "*) ;; + * ) new_inherited_linker_flags="$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" + newlib_search_path="$newlib_search_path $func_stripname_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" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # 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 \"X$deplib\"" 2>/dev/null | $Xsed -e 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. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$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 "X$inherited_linker_flags" | $Xsed -e '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 "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e '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" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + 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 "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$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 + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$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 + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_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_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$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:"*) ;; + *) temp_rpath="$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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + 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 + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + 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 "$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$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$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:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + 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:"*) ;; + *) finalize_shlibpath="$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 + [\\/]*) + add_dir="$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 "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + 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 + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$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 "X $new_inherited_linker_flags" | $Xsed -e '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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # 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 "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$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 + tmp_libs="$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" + objs="$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!" + libobjs="$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 + 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|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 + ;; + 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) + 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. + verstring="$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" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$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 + removelist="$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 + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$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 + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the 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` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$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. + newdeplibs="$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 "*) + newdeplibs="$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 \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$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. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e '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 "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e '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 "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e '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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$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 + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$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" + delfiles="$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 cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + 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 "X$include_expsyms" | $Xsed | $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 + delfiles="$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 "*) ;; + *) + tmp_deplibs="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$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\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$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 + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # 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 + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + 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 + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + 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. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$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 "$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 "X$include_expsyms" | $Xsed | $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 + delfiles="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$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 "$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 "$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 "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + 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 "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + 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 + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + 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 "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # 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 + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + 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 "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if 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 + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$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" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$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" + generated="$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" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + 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 + 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 "X$relink_command" | $Xsed -e "$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" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$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" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$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" + newdlprefiles="$newdlprefiles $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 + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + 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 "$mode" = link || test "$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) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${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 + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$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 + rmfiles="$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 + rmfiles="$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 + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # 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 "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$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/m4macros/Makefile.am b/m4macros/Makefile.am new file mode 100644 index 0000000..0284b4e --- /dev/null +++ b/m4macros/Makefile.am @@ -0,0 +1,8 @@ +include $(top_srcdir)/Makefile.decl + +installed_m4= glib-2.0.m4 glib-gettext.m4 + +EXTRA_DIST+=$(installed_m4) + +m4datadir = $(datadir)/aclocal +m4data_DATA = $(installed_m4) diff --git a/m4macros/Makefile.in b/m4macros/Makefile.in new file mode 100644 index 0000000..606a73f --- /dev/null +++ b/m4macros/Makefile.in @@ -0,0 +1,573 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +subdir = m4macros +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +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__installdirs = "$(DESTDIR)$(m4datadir)" +DATA = $(m4data_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = $(installed_m4) +TEST_PROGS = +installed_m4 = glib-2.0.m4 glib-gettext.m4 +m4datadir = $(datadir)/aclocal +m4data_DATA = $(installed_m4) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu m4macros/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu m4macros/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 +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)" + @list='$(m4data_DATA)'; test -n "$(m4datadir)" || 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)$(m4datadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + @list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(m4datadir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(m4datadir)" && rm -f $$files +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 + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(m4datadir)"; 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: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-m4dataDATA + +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-m4dataDATA + +.MAKE: check-am install-am install-strip + +.PHONY: all all-am check check-am check-local 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-m4dataDATA 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 \ + uninstall-m4dataDATA + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +# 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/m4macros/glib-2.0.m4 b/m4macros/glib-2.0.m4 new file mode 100644 index 0000000..a13eeec --- /dev/null +++ b/m4macros/glib-2.0.m4 @@ -0,0 +1,211 @@ +# 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_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 () +{ + 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, "%d.%d.%d", &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 (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. 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="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + AC_SUBST(GLIB_GENMARSHAL) + AC_SUBST(GOBJECT_QUERY) + AC_SUBST(GLIB_MKENUMS) + rm -f conf.glibtest +]) diff --git a/m4macros/glib-gettext.m4 b/m4macros/glib-gettext.m4 new file mode 100644 index 0000000..68b08b3 --- /dev/null +++ b/m4macros/glib-gettext.m4 @@ -0,0 +1,432 @@ +# Copyright (C) 1995-2002 Free Software Foundation, Inc. +# Copyright (C) 2001-2003,2004 Red Hat, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995, 1996 +# +# Modified to never use included libintl. +# Owen Taylor , 12/15/1998 +# +# Major rework to remove unused code +# Owen Taylor , 12/11/2002 +# +# Added better handling of ALL_LINGUAS from GNU gettext version +# written by Bruno Haible, Owen Taylor 5/30/3002 +# +# Modified to require ngettext +# Matthias Clasen 08/06/2004 +# +# We need this here as well, since someone might use autoconf-2.5x +# to configure GLib then an older version to configure a package +# using AM_GLIB_GNU_GETTEXT +AC_PREREQ(2.53) + +dnl +dnl We go to great lengths to make sure that aclocal won't +dnl try to pull in the installed version of these macros +dnl when running aclocal in the glib directory. +dnl +m4_copy([AC_DEFUN],[glib_DEFUN]) +m4_copy([AC_REQUIRE],[glib_REQUIRE]) +dnl +dnl At the end, if we're not within glib, we'll define the public +dnl definitions in terms of our private definitions. +dnl + +# GLIB_LC_MESSAGES +#-------------------- +glib_DEFUN([GLIB_LC_MESSAGES], + [AC_CHECK_HEADERS([locale.h]) + if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + +# GLIB_PATH_PROG_WITH_TEST +#---------------------------- +dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# GLIB_WITH_NLS +#----------------- +glib_DEFUN([GLIB_WITH_NLS], + dnl NLS is obligatory + [USE_NLS=yes + AC_SUBST(USE_NLS) + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + AC_CHECK_HEADER(libintl.h, + [gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, + [AC_TRY_LINK([ +#include +], + [return !ngettext ("","", 1)], + gt_cv_func_ngettext_libc=yes, + gt_cv_func_ngettext_libc=no) + ]) + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, + [AC_TRY_LINK([ +#include +], + [return !dgettext ("","")], + gt_cv_func_dgettext_libc=yes, + gt_cv_func_dgettext_libc=no) + ]) + fi + + if test "$gt_cv_func_ngettext_libc" = "yes" ; then + AC_CHECK_FUNCS(bind_textdomain_codeset) + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$gt_cv_func_ngettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dgettext, + gt_cv_func_dgettext_libintl=yes)])]) + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + AC_MSG_CHECKING([if -liconv is needed to use gettext]) + AC_MSG_RESULT([]) + AC_CHECK_LIB(intl, ngettext, + [AC_CHECK_LIB(intl, dcgettext, + [gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv], + :,-liconv)], + :,-liconv) + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext and ngettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + AC_CHECK_FUNCS(bind_textdomain_codeset) + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes" \ + && test "$gt_cv_func_ngettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + AC_DEFINE(HAVE_GETTEXT,1, + [Define if the GNU gettext() function is already present or preinstalled.]) + GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + AC_CHECK_FUNCS(dcgettext) + MSGFMT_OPTS= + AC_MSG_CHECKING([if msgfmt accepts -c]) + GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: test 1.0\n" +"PO-Revision-Date: 2007-02-15 12:01+0100\n" +"Last-Translator: test \n" +"Language-Team: C \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) + AC_SUBST(MSGFMT_OPTS) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [case $host in + *-*-solaris*) + dnl On Solaris, if bind_textdomain_codeset is in libc, + dnl GNU format message catalog is always supported, + dnl since both are added to the libc all together. + dnl Hence, we'd like to go with DATADIRNAME=share and + dnl and CATOBJEXT=.gmo in this case. + AC_CHECK_FUNC(bind_textdomain_codeset, + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac]) + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + ]) + + if test "$gt_cv_have_gettext" = "yes" ; then + AC_DEFINE(ENABLE_NLS, 1, + [always defined to indicate that i18n is enabled]) + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is not GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLLIBS) + AC_SUBST(PO_IN_DATADIR_TRUE) + AC_SUBST(PO_IN_DATADIR_FALSE) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +# AM_GLIB_GNU_GETTEXT +# ------------------- +# Do checks necessary for use of gettext. If a suitable implementation +# of gettext is found in either in libintl or in the C library, +# it will set INTLLIBS to the libraries needed for use of gettext +# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable +# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() +# on various variables needed by the Makefile.in.in installed by +# glib-gettextize. +dnl +glib_DEFUN([GLIB_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + + GLIB_LC_MESSAGES + GLIB_WITH_NLS + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ]) + +# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) +# ------------------------------- +# Define VARIABLE to the location where catalog files will +# be installed by po/Makefile. +glib_DEFUN([GLIB_DEFINE_LOCALEDIR], +[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +glib_save_datarootdir="$datarootdir" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +datarootdir=`eval echo "${datarootdir}"` +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +datarootdir="$glib_save_datarootdir" +AC_DEFINE_UNQUOTED($1, "$localedir", + [Define the location where the catalogs will be installed]) +]) + +dnl +dnl Now the definitions that aclocal will find +dnl +ifdef(glib_configure_in,[],[ +AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) +AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) +])dnl + +# GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) +# +# Create a temporary file with TEST-FILE as its contents and pass the +# file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with +# 0 and perform ACTION-IF-FAIL for any other exit status. +AC_DEFUN([GLIB_RUN_PROG], +[cat >conftest.foo <<_ACEOF +$2 +_ACEOF +if AC_RUN_LOG([$1 conftest.foo]); then + m4_ifval([$3], [$3], [:]) +m4_ifvaln([$4], [else $4])dnl +echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD +sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD +fi]) + diff --git a/makefile.msc b/makefile.msc new file mode 100644 index 0000000..52e07f6 --- /dev/null +++ b/makefile.msc @@ -0,0 +1,28 @@ +## Makefile for building the GLib dlls with Microsoft C +## Use: nmake -f makefile.msc + +PARTS = glib gmodule gthread gobject gio tests + +all : \ + config.h \ + glibconfig.h \ + sub-all + +sub-all: + for %d in ($(PARTS)) do nmake -nologo -f makefile.msc sub-one THIS=%d TARGET=all + +clean : sub-clean + +sub-clean: + for %d in ($(PARTS)) do nmake -nologo -f makefile.msc sub-one THIS=%d TARGET=clean + +sub-one: + @cd $(THIS) + @nmake -nologo -f makefile.msc $(TARGET) + @cd .. + +config.h: config.h.win32 + copy config.h.win32 config.h + +glibconfig.h: glibconfig.h.win32 + copy glibconfig.h.win32 glibconfig.h diff --git a/missing b/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 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 + tar try tar, gnutar, gtar, then tar without non-portable flags + 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. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + 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 + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and 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/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..d2d5f21 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,111 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" 1>&2 + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +case $dirmode in + '') + if mkdir -p -- . 2>/dev/null; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + fi + ;; + *) + if mkdir -m "$dirmode" -p -- . 2>/dev/null; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# End: +# mkinstalldirs ends here diff --git a/msvc_recommended_pragmas.h b/msvc_recommended_pragmas.h new file mode 100644 index 0000000..cb9370c --- /dev/null +++ b/msvc_recommended_pragmas.h @@ -0,0 +1,31 @@ +#ifndef _MSC_VER +#pragma error "This header is for Microsoft VC only." +#endif /* _MSC_VER */ + +/* Make MSVC more pedantic, this is a recommended pragma list + * from _Win32_Programming_ by Rector and Newcomer. + */ +#pragma warning(error:4002) /* too many actual parameters for macro */ +#pragma warning(error:4003) /* not enough actual parameters for macro */ +#pragma warning(1:4010) /* single-line comment contains line-continuation character */ +#pragma warning(error:4013) /* 'function' undefined; assuming extern returning int */ +#pragma warning(1:4016) /* no function return type; using int as default */ +#pragma warning(error:4020) /* too many actual parameters */ +#pragma warning(error:4021) /* too few actual parameters */ +#pragma warning(error:4027) /* function declared without formal parameter list */ +#pragma warning(error:4029) /* declared formal parameter list different from definition */ +#pragma warning(error:4033) /* 'function' must return a value */ +#pragma warning(error:4035) /* 'function' : no return value */ +#pragma warning(error:4045) /* array bounds overflow */ +#pragma warning(error:4047) /* different levels of indirection */ +#pragma warning(error:4049) /* terminating line number emission */ +#pragma warning(error:4053) /* An expression of type void was used as an operand */ +#pragma warning(error:4071) /* no function prototype given */ +#pragma warning(disable:4101) /* unreferenced local variable */ +#pragma warning(error:4150) + +#pragma warning(disable:4244) /* No possible loss of data warnings */ +#pragma warning(disable:4305) /* No truncation from int to char warnings */ + +/* work around Microsoft's premature attempt to deprecate the C-Library */ +#pragma warning(disable:4996) /* This function or variable may be unsafe. */ diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..408bee6 --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,4771 @@ +=== ChangeLog discontinued === + + With the move to git, GLib is switching from a ChangeLog file + to relying on commit messages to provide change history. Please + see README.commits for guidance on the expected message format. + +2009-03-30 Manoj Kumar Giri + + * or.po: Updated Oriya Translation. + +2009-03-26 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2009-03-26 Shankar Prasad + + * kn.po: Updated Kannada translations. + +2009-03-21 Nickolay V. Shmyrev + + * ru.po: Updated Russian translation. + +2009-03-18 Kostas Papadimas + + * el.po: Updated Greek Translation by Fotis Tsamis. + +2009-03-18 Djihed Afifi + + * ar.po: Updated Arabic translation by Anas Afif Emad. + +2009-03-18 Amitakhya Phukan + + * as.po: Updated Assamese translations. + +2009-03-18 Gabor Kelemen + + * hu.po: Translation updated. + +2009-03-17 Tomasz Dominikowski + + * pl.po: Updated Polish translation + +2009-03-17 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2009-03-17 Ani Peter + + * ml.po: Updated Malayalam Translations + +2009-03-17 Ignacio Casal Quinteiro + + * gl.po: Updated Galician translation + +2009-03-17 Gil Forcada + + * ca.po: Updated Catalan translation. + +2009-03-17 Takeshi AIHANA + + * ja.po: Update Japanese translation. + +2009-03-17 Hendrik Richter + + * de.po: Updated German translation. + +2009-03-17 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2009-03-17 Claude Paroz + + * fr.po: Updated French translation. + +2009-03-17 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2009-03-16 Jorge Gonzalez + + * es.po: Updated Spanish translation. + +2009-03-16 Milo Casagrande + + * it.po: Updated Italian translation. + +2009-03-16 Og Maciel + + * pt_BR.po: Updated Brazilian Portuguese translation by + Vladimir Melo. + +2009-03-16 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2009-03-16 Philip Withnall + + * en_GB.po: Updated British English translation. + +2009-03-14 Kostas Papadimas + + * el.po: Updated Greek Translation by Fotis Tsamis. + +2009-03-16 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2009-03-16 Shankar Prasad + + * kn.po: Updated Kannada translations. + +2009-03-15 Hendrik Richter + + * de.po: Updated German translation. + +2009-03-15 felix@redhat.com> + + * ta.po: Tamil Translation updated + +2009-03-14 Nickolay V. Shmyrev + + * ru.po: Updated Russian translation by Yuriy Penkin. + +2009-03-14 Kostas Papadimas + + * el.po: Updated Greek Translation by Jennie Petoumenou. + +2009-03-14 Kenneth Nielsen + + * da.po: Updated Danish translation by Ask H. Larsen + +2009-03-13 Ignacio Casal Quinteiro + + * gl.po: Updated Galician translation + +2009-03-13 Matthias Clasen + + * === Released 2.20.0 === + +2009-03-11 Ani Peter + + * ml.po: Updated Malayalam Translations + +2009-03-10 Amitakhya Phukan + + * as.po: Updated Assamese translations. + +2009-03-09 Sandeep Shedmake + + * mr.po: Updated Marathi Translations. + +2009-03-09 Sandeep Shedmake + + * mr.po: Updated Marathi Translations. + +2009-03-09 Runa Bhattacharjee + + * bn_IN.po: Updated Bengali India Translation + +2009-03-08 Petr Kovar + + * cs.po: Updated Czech translation. + +2009-03-05 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2009-03-05 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2009-03-04 Wadim Dziedzic + + * pl.po: Updated Polish translation + +2009-03-04 Mișu Moldovan + + * ro.po: Updated Romanian Translation. + +2009-03-04 Manoj Kumar Giri + + * or.po: Updated Oriya Translation. + +2009-03-03 Krishnababu K + + * te.po: Updated Telugu Translation + +2009-03-02 Milo Casagrande + + * it.po: Updated Italian translation by Luca Ferretti + +2009-03-03 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2009-03-02 Matthias Clasen + + * === Released 2.19.10 === + +2009-03-02 Matthias Clasen + + * === Released 2.19.9 === + +2009-03-01 Matthias Clasen + + * Makefile.in.in: Don't use obsolete calling convention for + config.status. + +2009-03-01 Matthias Clasen + + Bug 573527 – Wrong shell to run config.status in Makefile.in.in + + * Makefile.in.in: Don't hardcode /bin/sh as shell. + Reported by Loïc Minier + +2009-02-28 Gabor Kelemen + + * hu.po: Translation updated. + +2009-02-28 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2009-02-27 Claude Paroz + + * fr.po: Updated French translation. + +2009-02-27 Rajesh Ranjan + + * mai.po: updated for maithili Translation. + +2009-02-26 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2009-02-26 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2009-02-25 Chao-Hsiung Liao + + * zh_HK.po: Updated Traditional Chinese translation(Hong Kong). + * zh_TW.po: Updated Traditional Chinese translation(Taiwan). + +2009-02-25 Sweta Kothari + + * gu.po: Committed Gujarati Translation. + +2009-02-25 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2009-02-24 Jorge Gonzalez + + * es.po: Updated Spanish translation. + +2009-02-23 Philip Withnall + + * en_GB.po: Updated British English translation. + +2009-02-23 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2009-02-23 Wouter Bolsterlee + + * nl.po: Updated Dutch translation by Wouter Bolsterlee. + +2009-02-20 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2009-02-19 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2009-02-19 Gil Forcada + + * ca.po: Updated Catalan translation. + +2009-02-19 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2009-02-19 Gil Forcada + + * ca.po: Updated Catalan translation. + +2009-02-19 Gabor Kelemen + + * hu.po: Translation updated. + +2009-02-19 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2009-02-18 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2009-02-17 Matthias Clasen + + * === Released 2.19.8 === + +2009-02-17 Takeshi AIHANA + + * ja.po: Fixed wrong translations. + +2009-02-16 Matthias Clasen + + * === Released 2.19.7 === + +2009-02-14 Luca Ferretti + + * it.po: Updated Italian translation. + +2009-02-13 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2009-02-10 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2009-02-07 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2009-02-06 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2009-02-06 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2009-02-05 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2009-02-04 Wouter Bolsterlee + + * nl.po: Dutch translation updated by Wouter Bolsterlee. + +2009-02-04 Sweta Kothari + + * gu.po: Committed Gujarati Translation. + +2009-02-03 Sweta Kothari + + * gu.po: Committed Gujarati Translation. + +2009-02-02 Matthias Clasen + + * === Released 2.19.6 === + +2009-02-01 Gabor Kelemen + + * hu.po: Translation updated. + +2009-01-30 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2009-01-30 Chao-Hsiung Liao + + * zh_HK.po: Updated Traditional Chinese translation(Hong Kong). + * zh_TW.po: Updated Traditional Chinese translation(Taiwan). + +2009-01-28 Manoj Kumar Giri + + * or.po: Updated Oriya Translation + +2009-01-27 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2009-01-26 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2009-01-19 Matthias Clasen + + * === Released 2.19.5 === + +2009-01-17 Jorge Gonzalez + + * es.po: Updated Spanish translation. + +2009-01-16 Gil Forcada + + * ca.po: Updated Catalan translation. + +2009-01-14 Luca Ferretti + + * POTFILES.in: Added missing gio/gemblemedicon.c + +2009-01-08 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2009-01-06 Luca Ferretti + + * it.po: Updated Italian translation. + +2009-01-05 Matthias Clasen + + * === Released 2.19.4 === + +2009-01-05 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2009-01-04 Leonardo Ferreira Fontenelle + + * pt_BR.po: Updated Brazilian Portuguese translation. + +2009-01-04 甘露(Gan Lu) + + * zh_CN.po: Updated Chinese Simplified translation by + Deng Xiyue . + +2008-12-15 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-12-15 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-12-15 Matthias Clasen + + * === Released 2.19.3 === + +2008-12-10 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-12-09 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-12-08 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-12-06 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2008-12-01 Matthias Clasen + + * === Released 2.19.2 === + +2008-12-01 Matthias Clasen + + * === Released 2.19.1 === + +2008-11-13 Maxim Dziumanenko + + * uk.po: Update Ukrainian translation. + +2008-11-08 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-10-16 Matthias Clasen + + * === Released 2.19.0 === + +2008-10-04 Og Maciel + + * pt_BR.po: Updated Brazilian Portuguese translation by Vladimir Melo. + +2008-09-22 Kenneth Nielsen + + * da.po: Updated Danish translation by Kenneth Nielsen + +2008-09-22 Kenneth Nielsen + + * da.po: Updated Danish translation by Kenneth Nielsen + +2008-09-21 Nickolay V. Shmyrev + + * ru.po: Updated Russian translation. + +2008-09-21 Wadim Dziedzic + + * pl.po: Updated Polish translation + +2008-09-19 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2008-09-18 Djihed Afifi + + * ar.po: Updated Arabic Translation by Anas Afif Emad. + +2008-09-17 Matthias Clasen + + * === Released 2.18.1 === + +2008-09-17 Krishnababu K + + * te.po: Updated Telugu Translation. + +2008-09-15 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-09-13 Baris Cicek + + * tr.po: Updated Turkish Translation. + +2008-09-11 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2008-09-09 Manoj Kumar Giri + + * or.po: Updated Oriya Translation + +2008-09-09 Runa Bhattacharjee + + * bn_IN.po: Updated Bengali India Translation + +2008-09-08 Robert Sedak + + * hr.po: Updated Croatian translation. + +2008-09-04 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2008-09-03 Philip Withnall + + * en_GB.po: Updated British English translation. + +2008-09-02 Matthias Clasen + + * === Released 2.18.0 === + +2008-09-02 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2008-09-02 Wouter Bolsterlee + + * nl.po: Updated Dutch translation by Tino Meinen. + +2008-08-30 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2008-08-28 Gabor Kelemen + + * hu.po: Translation updated. + +2008-08-28 Hendrik Richter + + * de.po: Updated German translation. + +2008-08-28 Rajesh Ranjan + + * mai.po: Added Maithili translation. + +2008-08-27 Petr Kovar + + * cs.po: Updated Czech translation. + +2008-08-25 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-08-25 Goran Rakic + + * LINGUAS, sr@latin.po, sr@Latn.po: Conversion from sr@Latn to sr@latin. + +2008-08-24 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2008-08-24 Maxim Dziumanenko + + * uk.po: Update Ukrainian translation. + +2008-08-23 Priit Laes + + * et.po: Translation updated by Ivar Smolin + +2008-08-23 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-08-23 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2008-08-22 Nguyễn Thái Ngọc Duy + + * vi.po: Updated Vietnamese translation + +2008-08-21 Robert-André Mauchin + + * fr.po: Updated French translation. + +2008-08-19 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-08-18 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-08-18 Matthias Clasen + + * === Released 2.17.7 === + +======= +2008-08-18 Laurent Dhima + + * sq.po: Updated Albanian Translation. + +2008-08-15 Kjartan Maraas + + * POTFILES.in: Add missing file. + * nb.po: Update. + +2008-08-15 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-08-14 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2008-08-13 Leonardo Ferreira Fontenelle + + * pt_BR.po: Brazilian Portuguese translation updated by Henrique P. + Machado and Leonardo F. Fontenelle. + +2008-08-13 Sandeep Shedmake + + * mr.po: Updated Marathi translations + +2008-08-12 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-08-12 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-08-12 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2008-08-10 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-08-10 Gil Forcada + + * ca.po: Updated Catalan translation. + +2008-08-09 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2008-08-08 Ignacio Casal Quinteiro + + * gl.po: Updated Galician translation + +2008-08-6 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-08-05 Gil Forcada + + * ca.po: Updated Catalan translation. + * POTFILES.in: Added missing file. + +2008-08-05 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-08-05 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-08-04 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-08-04 Matthias Clasen + + * === Released 2.17.6 === + +2008-08-04 Matthias Clasen + + * === Released 2.17.5 === + +2008-08-04 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2008-07-31 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2008-07-29 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2008-07-29 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-07-28 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-07-26 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2008-07-23 Gil Forcada + + * ps.po: Minor update to Pashto by Zabeeh Khan. + +2008-07-23 Luca Ferretti + + * it.po: Updated Italian translation. + +wpV862008-07-22 Priit Laes + + * et.po: Translation updated by Ivar Smolin + +2008-07-21 Matthias Clasen + + * === Released 2.17.4 === + +2008-07-20 Leonardo Ferreira Fontenelle + + * pt_BR.po: Brazilian Portuguese translation improvements. + +2008-07-20 Andre Klapper + + * de.po: Updated German translation + +2008-07-16 Laurent Dhima + + * sq.po: Updated Albanian Translation. + +2008-07-15 Runa Bhattacharjee + + * ps.po: Added Pashto (ps) Translations by Zabeeh Khan. + * LINGUAS: Added Pashto (ps) to the List of Languages + +2008-07-14 Chao-Hsiung Liao + + * zh_HK.po: Updated Traditional Chinese translation(Hong Kong). + * zh_TW.po: Updated Traditional Chinese translation(Taiwan). + +2008-07-13 Chao-Hsiung Liao + + * zh_HK.po: Updated Traditional Chinese translation(Hong Kong). + * zh_TW.po: Updated Traditional Chinese translation(Taiwan). + +2008-07-10 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-07-04 Priit Laes + + * et.po: Translation updated by Ivar Smolin + +2008-07-03 Hendrik Richter + + * de.po: Updated German translation, fix #540762. + +2008-07-02 Matthias Clasen + + * === Released 2.17.3 === + +2008-07-02 Yannig Marchegay + + * oc.po: Updated Occitan translation. + +2008-06-23 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2008-06-12 Matthias Clasen + + * === Released 2.17.2 === + +2008-06-12 Matthias Clasen + + * === Released 2.17.1 === + +2008-06-11 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-06-10 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-06-07 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-05-31 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-05-31 Philipp Kerling + + * de.po: Updated German translation. + +2008-05-27 Matthias Clasen + + * === Released 2.17.0 === + +2008-05-22 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-05-08 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2008-04-23 Yannig Marchegay + + * oc.po: Updated Occitan translation. + +2008-04-22 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2008-04-20 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-04-19 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-04-15 Philip Withnall + + * en_GB.po: Fixed British English translation. + +2008-04-02 Petr Kovar + + * cs.po: Updated Czech translation. + +2008-03-23 Nguyễn Thái Ngọc Duy + + * vi.po: Update Vietnamese translation + +2008-03-20 Priit Laes + + * et.po: Translation updated by Ivar Smolin + +2008-03-18 Laurent Dhima + + * sq.po: Updated Albanian Translation. + +2008-03-18 Simos Xenitellis + + * el.po: Updated Greek translation by Giannis Katsampiris. + +2008-03-18 Laurent Dhima + + * sq.po: Updated Albanian Translation. + +2008-03-16 Gabor Kelemen + + * hu.po: Translation updated + +2008-03-15 Yuri Kozlov + + * ru.po: Updated Russian translation. + +2008-03-15 Marcel Telka + + * sk.po: Updated Slovak translation. + +2008-03-12 Wouter Bolsterlee + + * nl.po: Updated Dutch translation by Wouter Bolsterlee. + +2008-03-12 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2008-03-11 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-03-11 Gil Forcada + + * ca.po: Updated Catalan translation. + +2008-03-11 Philip Withnall + + * en_GB.po: Updated British English translation. + +2008-03-11 Baris Cicek + + * tr.po: Updated Turkish translation + +2008-03-11 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2008-03-11 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2008-03-11 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2008-03-11 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2008-03-11 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-03-10 Matthias Clasen + + * === Released 2.16.1 === + +2008-03-10 Kenneth Nielsen + + * da.po: Updated Danish translation + +2008-03-10 Matthias Clasen + + * === Released 2.16.0 === + +2008-03-10 Matthias Clasen + + * uk.po: Mark a string as fuzzy to fix the build + +2008-03-10 Runa Bhattacharjee + + * bn_IN.po: Updated Bengali India Translation + +2008-03-09 Marcel Telka + + * sk.po: Updated Slovak translation. + +2008-03-09 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-03-09 Yuri Kozlov + + * ru.po: Updated Russian translation. + +2008-03-07 Mugurel Tudor + + * ro.po: Updated Romanian translation + +2008-03-07 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2008-03-05 Rahul Bhalerao + + * mr.po: Updated Marathi Translations by Sandeep Shedmake. + +2008-03-05 Priit Laes + + * et.po: Translation updated by Ivar Smolin + +2008-03-05 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2008-03-04 Hendrik Richter + + * de.po: Updated German translation. + +2008-03-04 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-03-03 Petr Kovar + + * cs.po: Updated Czech translation. + +2008-03-03 Ani Peter + + * ml.po: Updated Malayalam Translation + +2008-03-03 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2008-03-02 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-03-02 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-02-29 Priit Laes + + * et.po: Estonian translation update by Ivar Smolin. + +2008-02-28 Stéphane Raimbault + + * fr.po: Updated French translation by Claude Paroz. + +2008-02-28 Amitakhya Phukan + + * as.po: Updated Assamese translations. + +2008-02-26 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-02-25 Matthias Clasen + + * === Released 2.15.6 === + +2008-02-25 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2008-02-25 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-02-24 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2008-02-24 Theppitak Karoonboonyanan + + * th.po: Fix typo reported by Akom C. + +2008-02-23 Gabor Kelemen + + * hu.po: Translation updated + +2008-02-23 Priit Laes + + * et.po: Estonian translation update by Ivar Smolin. + +2008-02-22 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-02-22 Jonh Wendell + + * pt_BR.po: Brazilian Portuguese translation updated by Og Maciel. + +2008-02-22 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2008-02-19 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2008-02-18 Nguyễn Thái Ngọc Duy + + * vi.po: Updated Vietnamese translation + +2008-02-18 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2008-02-17 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-02-17 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-02-17 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2008-02-17 David Lodge + + * en_GB.po: Updated British English translation + +2008-02-16 Ihar Hrachyshka + + * be@latin.po: Updated Belarusian Latin translation. + +2008-02-14 Runa Bhattacharjee + + * kn.po: Updated Kannada Translations by Shankar Prasad. + +2008-02-14 Gil Forcada + + * ca.po: Updated Catalan translation. + +2008-02-14 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2008-02-13 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2008-02-11 Matthias Clasen + + * === Released 2.15.5 === + +2008-02-08 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2008-02-07 Gil Forcada + + * ca.po: Updated Catalan translation. + +2008-02-07 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2008-02-6 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-02-06 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-02-04 Jovan Naumovski + + * mk.po: Updated Macedonian translation. + +2008-02-03 Leonardo Ferreira Fontenelle + + * pt_BR.po: Brazilian Portuguese translation updated by Vladimir Melo + and Luiz Armesto. + +2008-02-01 Yannig Marchegay + + * oc.po: Updated Occitan translation. + +2008-02-01 Runa Bhattacharjee + + * kn.po: Updated Kannada Translations by Shankar Prasad. + +2008-02-01 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-01-31 Djihed Afifi + + * ar.po: Updated Arabic Translation by Abou Manal. + +2008-01-30 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2008-01-30 Yannig Marchegay + + * oc.po: Updated Occitan translation. + +2008-01-30 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2008-01-29 Yannig Marchegay + + * oc.po: Updated Occitan translation. + +2008-01-29 Djihed Afifi + + * ar.po: Updated Arabic Translation by Abou Manal. + +2008-01-29 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-01-29 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-01-28 Matthias Clasen + + * === Released 2.15.4 === + +2008-01-28 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-01-27 Djihed Afifi + + * ar.po: Updated Arabic Translation by Khaled Hosny. + +2008-01-26 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-01-26 Ihar Hrachyshka + + * be.po: Updated Belarusian translation. + +2008-01-25 Petr Kovar + + * cs.po: Updated Czech translation. + +2008-01-25 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-01-25 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2008-01-24 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2008-01-24 Vasiliy Faronov + + * ru.po: Updated Russian translation. + +2008-01-23 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2008-01-21 Stéphane Raimbault + + * fr.po: Updated French translation by Claude Paroz. + +2008-01-21 Matthias Clasen + + * === Released 2.15.3 === + +2008-01-21 Tor Lillqvist + + * el.po: Fix syntax error. + +2007-01-21 Kostas Papadimas + + * el.po: Updated Greek translation. + +2008-01-17 Maxim Dziumanenko + + * uk.po: Update Ukrainian translation. + +2008-01-16 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2008-01-16 Rahul Bhalerao + + * mr.po: Updated Marathi translations given by Sandeep Shedmake. + +2008-01-15 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2008-01-14 Matthias Clasen + + * === Released 2.15.2 === + +2008-01-14 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2008-01-13 Luca Ferretti + + * it.po: Updated Italian translation. + +2008-01-12 Djihed Afifi + + * ar.po: Updated Arabic Translation by Djihed Afifi. + +2008-01-12 Baris Cicek + + * tr.po: Updated Turkish translation + +2008-01-12 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2008-01-09 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-01-09 Jorge Gonzalez + + * es.po: Updated Spanish translation. + +008-01-07 Matthias Clasen + + * === Released 2.15.1 === + +2008-01-07 Luca Ferretti + + * POTFILES.in: remove deleted file gio/gdirectorymonitor.c + + * it.po: Updated Italian translation. + +2008-01-07 Priit Laes + + * et.po: Translation updated by Ivar Smolin + +2008-01-06 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2008-01-06 Ihar Hrachyshka + + * be@latin.po: Updated Belarusian Latin translation. + +2008-01-04 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2008-01-02 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2007-12-31 Yannig Marchegay + + * oc.po: Updated Occitan translation. + +2007-12-27 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2007-12-23 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-23 Djihed Afifi + + * ar.po: Updated Arabic Translation by Djihed Afifi. + +2007-12-20 Seán de Búrca + + * ga.po: Updated Irish translation. + +2007-12-20 Matthias Clasen + + * === Released 2.15.0 === + +2007-12-19 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-12-17 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-15 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-15 Kjartan Maraas + + * POTFILES.in: Add gio-ls.c + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-12-14 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-14 Stéphane Raimbault + + * POTFILES.in: Updated file list (gio). + * fr.po: Updated French translation by Robert-André Mauchin and + Stéphane Raimbault. + +2007-12-13 Matej Urbančič + + * sl.po: Updated Slovenian Translation. + +2007-12-13 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-11 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-11 Rahul Bhalerao + + * mr.po: Added Marathi translations + +2007-12-09 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-09 Espen Stefansen + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-12-08 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-12-08 Kjartan Maraas + + * POTFILES.in: Add missing file. + +2007-12-08 Jakub Friedl + + * cs.po: Czech Translation updated by Petr Kovar. + +2007-12-07 Leonardo Ferreira Fontenelle + + * pt_BR.po: Brazilian Portuguese translation updated by Vladimir Melo. + +2007-12-08 Ihar Hrachyshka + + * be@latin.po: Updated Belarusian Latin translation. + +2007-12-06 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-12-04 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2007-12-03 Andre Klapper + + * de.po: Updated German translation + +2007-12-01 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-12-01 Ihar Hrachyshka + + * be@latin.po: Updated Belarusian Latin translation. + +2007-11-29 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-11-28 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-11-27 Andre Klapper + + * POTFILES.in: Updated gio sources. + +2007-11-26 Alexander Larsson + + * POTFILES.in: + Added gio sources + +2007-11-24 Claude Paroz + + * fr.po: Updated French translation. + +2007-11-23 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2007-11-19 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2007-11-18 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-11-13 Matej Urbančič + + * sl.po: Updated Slovenian Translation. + +2007-11-07 Matthias Clasen + + * === Released 2.14.3 === + +2007-10-29 Priit Laes + + * et.po: Translation updated by Priit Laes. + +2007-10-21 Matej Urbančič + + * sl.po: Updated Slovenian translation. + +2007-10-23 Djihed Afifi + + * ar.po: Updated Arabic Translation by Djihed Afifi. + +2007-10-21 Seán de Búrca + + * ga.po: Updated Irish translation. + +2007-10-21 Djihed Afifi + + * ar.po: Updated Arabic Translation by Djihed Afifi. + +2007-10-19 Ihar Hrachyshka + + * be@latin.po: Updated Belarusian Latin translation. + +2007-10-16 Matthias Clasen + + * === Released 2.14.2 === + +2007-10-15 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2007-09-30 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2007-09-29 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2007-09-17 Djihed Afifi + + * ar.po: Updated Arabic Translation by Djihed Afifi. + +2007-09-19 Matthias Clasen + + * === Released 2.14.1 === + +2007-09-16 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2007-09-16 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2007-09-15 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2007-09-14 Vladimer Sichinava + + * ka.po: Updated Georgian translation. + +2007-09-14 Gabor Kelemen + + * hu.po: Translation updated. + +2007-09-14 David Lodge + + * en_GB.po: Updated British English translation + +2007-09-13 Mugurel Tudor + + * ro.po: Updated Romanian translation + by Mişu Moldovan + +2007-09-12 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2007-09-10 Luca Ferretti + + * it.po: Updated Italian translation. + +2007-09-07 Maxim Dziumanenko + + * Update Ukrainian translation. + +2007-09-07 Nickolay V. Shmyrev + + * ru.po: Updated Russian translation + +2007-09-06 Goran Rakić + + * sr.po, sr@Latn.po: Updated Serbian translation. + +2007-09-05 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2007-09-04 Kenneth Nielsen + + * da.po: Updated Danish translation + +2007-09-03 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2007-09-03 Stéphane Raimbault + + * fr.po: Fixed French translation. + +2007-08-31 Luca Ferretti + + * it.po: Updated Italian translation. + +2007-08-31 Pramod Raghavendra + + * kn.po: Updated Kannada translation by Shankar Prasad. + +2007-08-30 Stéphane Raimbault + + * fr.po: Updated French translation by Stéphane Raimbault and + Claude Paroz. + +2007-08-26 Josep Puigdemont i Casamajó + + * ca.po: Updated Catalan translation. + +2007-08-26 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2007-08-26 Raphael Higino + + * pt_BR.po: Updated Brazilian Portuguese translation + by Vladimir Melo . + +2007-08-20 Claude Paroz + + * kn.po: Make 2 strings fuzzy to make msgfmt pass (and glib compile again!) + +2007-08-20 Pramod Raghavendra + + * kn.po: Updated Kannada translation by Shankar Prasad. + +2007-08-19 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2007-08-16 Priit Laes + + * et.po: Estonian translation update by Ivar Smolin. + +2007-08-15 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2007-08-14 Hendrik Richter + + * de.po: Updated German translation. + +2007-08-14 Hendrik Richter + + * de.po: Updated German translation. + +2007-08-13 Žygimantas Beručka + + * lt.po: Updated Lithuanian translation. + +2007-08-13 I. Felix + + * ta.po: Tamil Translation updated by Tirumurthi Vasudevan + +2007-08-12 Jovan Naumovski + + * mk.po: Updated Macedonian translation. + +2007-08-11 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2007-08-10 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-08-10 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2007-08-10 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2007-08-09 Kjartan Maraas + + * nb.po: Updated translation. + +2007-08-09 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2007-08-06 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2007-08-05 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2007-08-03 Matthias Clasen + + * === Released 2.14.0 === + +2007-08-03 Baris Cicek + + * tr.po: Updated Turkish translation + +2007-08-03 Ani Peter + + * ml.po: Updated Malayalam Translation + +2007-08-02 Wadim Dziedzic + + * pl.po: Updated polish translation + +2007-07-25 Inaki Larranaga Murgoitio + + * eu.po: Updated Basque translation. + +2007-07-25 Amitakhya Phukan + + * as.po: Updated Assamese Translation. + +2007-07-21 Leonardo Ferreira Fontenelle + + * pt_BR.po: Brazilian Portuguese translation updated. + +2007-07-18 Vincent van Adrighem + + * nl.po: Translation updated. + +2007-07-12 Matthias Clasen + + * === Released 2.13.7 === + +2007-07-11 Luca Ferretti + + * it.po: Updated Italian translation + +2007-07-10 Luca Ferretti + + * it.po: Updated Italian translation + +2007-07-10 Gabor Kelemen + + * hu.po: Translation updated. + +2007-07-10 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2007-07-10 Runa Bhattacharjee + + * bn _IN.po: Updated Bengali India Translation. + +2007-07-06 Amitakhya Phukan + + * as.po: Updated Assamese Translation. + * LINGUAS: Added Assamese (as) to the list of languages. + +2007-07-05 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2007-07-04 Changwoo Ryu + + * ko.po: Updated Korean translation by Eunju Kim. + +2007-07-03 Jovan Naumovski + + * mk.po: Updated Macedonian translation. + +2007-06-30 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2007-06-29 Jorge Gonzalez + + * es.po: Updated Spanish translation + * Added missing files to POTFILES.in + +Fri Jun 29 2007 Matthias Clasen + + * === Released 2.13.6 === + +2007-06-23 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-06-22 I. Felix + + * si.po: Sinhala Translation updated by Danishka Navin + * LINGUAS: Added Sinhala (si) to The List of Languages. + +2007-06-18 Matthias Clasen + + * === Released 2.13.5 === + +2007-06-17 Priit Laes + + * et.po: Estonian translation update by Ivar Smolin. + +2007-06-15 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-06-13 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2007-06-11 Subhransu Behera + + * or.po: Updated Oriya Translation. + +2007-06-10 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2007-06-05 Matthias Clasen + + * === Released 2.13.4 === + +2007-06-04 Matthias Clasen + + * === Released 2.13.3 === + +2007-06-04 Matthias Clasen + + * nb.po: Comment out one translation that breaks the build + +2007-06-04 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-05-24 Priit Laes + + * et.po: Updated Estonian translation by Ivar Smolin . + +2007-05-22 Matthias Clasen + + * === Released 2.13.2 === + +2007-05-22 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-05-21 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2007-05-19 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2007-05-17 Matthias Clasen + + * POTFILES.in: Add gregex.c (#436955, Philip Withnall) + +2007-05-17 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2007-05-15 David Lodge + + * en_GB.po: Updated British English translation + +2007-05-15 Subhransu Behera + + * or.po: Updated Oriya Translation. + +2007-05-06 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-05-06 Ihar Hrachyshka + + * be@latin.po: Updated Belarusian Latin translation. + +2007-05-03 Jorge Gonzalez + + * es.po: Updated Spanish translation + +2007-05-03 Matthias Clasen + + * === Released 2.13.1 === + +2007-05-2 Djihed Afifi + + * ar.po: Updated Arabic Translation by Djihed Afifi. + +2007-04-15 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation from Yang Zhang. + +2007-03-16 Matthias Clasen + + * === Released 2.13.0 === + +2007-03-11 Goran Rakić + + * sr.po, sr@Latn.po: Updated Serbian translation. + +2007-03-11 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2007-03-08 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2007-03-06 Jovan Naumovski + + * mk.po: Updated Macedonian translation. + +2007-03-03 Thierry Randrianiriana + + * mg.po: Added Malagasy translation. + +2007-03-01 Ihar Hrachyshka + * be.po: Added new Belarusian Latin translation. + +2007-02-27 Abel Cheung + + * zh_HK.po, zh_TW.po: Updated traditional Chinese translation by + Woodman Tuen . + +2007-02-27 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2007-02-22 Gintautas Miliauskas + + * lt.po: Updated Lithuanian translation. + +2007-02-17 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2007-01-19 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation. + +2007-01-10 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2007-01-10 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2007-01-09 David Lodge + + * en_GB.po: Updated English (British) translation + +2007-01-08 Luca Ferretti + + * it.po: Updated Italian translation. + +2007-01-07 Priit Laes + + * et.po: Estonian translation update by Ivar Smolin. + +2007-01-05 Jakub Friedl + + * cs.po: Updated Czech translation. + +2007-01-05 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2007-01-04 Hendrik Richter + + * de.po: Updated German translation. + +2007-01-04 Hendrik Richter + + * de.po: Updated German translation. + +2006-12-28 David Lodge + + * en_GB.po: Updated English (British) translation + +2006-12-17 Matthias Clasen + + * Makefile.in.in: Define datarootdir, to silence autoconf 2.60 + +2006-12-07 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2006-10-31 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2006-10-04 Jakub Friedl + + * cs.po: Updated Czech translation. + +2006-09-09 David Lodge + + * en_GB.po: Updated British English translation. + +2006-09-05 Pawan Chitrakar + + * ne.po: Updated Nepali Translation + +2006-09-04 Roozbeh Pournader + + * fa.po: Updated Persian translation by Meelad Zakaria. + +2006-09-04 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2006-09-03 Lucas Rocha + + * pt_BR.po: Updated Brazilian Portuguese translation + by Leonardo Ferreira Fontenelle + +2006-09-02 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2006-08-31 Khandakar Mujahidul Islam + + * bn.po: Updated Bengali translation + +2006-08-30 I. Felix + + * ta.po: Translation updated. + +2006-08-26 Žygimantas Beručka + + * lt.po: Updated Lithuanian translation. + +2006-08-26 Christophe Merlet + + * fr.po: Updated French translation from + Robert-André Mauchin . + +2006-08-26 Gabor Kelemen + + * hu.po: Translation updated. + +2006-08-24 Josep Puigdemont i Casamajó + + * ca.po: Updated Catalan translation (rebased from 2-12 branch). + +2006-08-23 Khandakar Mujahdul Islam + + * bn.po: Updated Bengali translation + +2006-08-20 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2006-08-20 Ani Peter + + * ml.po: Updated Malayalam translation + +2006-08-18 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2006-08-18 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2006-08-17 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2006-08-16 Satoru SATOH + + * ja.po: Updated Japanese translation. + +2006-08-16 Erdal Ronahi + + * ku.po: Updated Kurdish translation. + +2006-08-16 Daniel Nylander + + * sv.po: Updated Swedish translation. + +2006-08-16 Gabor Kelemen + + * hu.po: Translation updated. + +2006-08-15 Matthias Clasen + + * === Released 2.12.2 === + +2006-08-16 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2006-08-16 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2006-08-15 Hendrik Richter + + * de.po: Updated German translation. + +2006-08-11 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2006-08-10 Josep Puigdemont i Casamajó + + * ca.po: Updated Catalan translation. + +2006-08-10 Guntupalli Karunakar + + * dz.po: Updated Dzongkha translation by + Dzongkhalinux team, DIT + +2006-08-09 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2006-08-09 Baris Cicek + + * tr.po: Updated Turkish Translation from Onur Can Cakmak + +2006-08-09 Wouter Bolsterlee + + * nl.po: Translation updated by Wouter Bolsterlee. + +2006-08-08 Inaki Larranaga + + * eu.po: Updated Basque translation. + +2006-08-07 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2006-08-06 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2006-08-06 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2006-08-05 Chao-Hsiung Liao + + * zh_HK.po: Updated Traditional Chinese translation(Hong Kong). + * zh_TW.po: Updated Traditional Chinese translation(Taiwan). + +2006-08-03 Jakub Friedl + + * cs.po: Updated Czech translation. + +2006-07-31 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation. + +2006-07-22 Matthias Clasen + + * === Released 2.12.1 === + +2006-07-22 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2006-07-21 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2006-07-21 Christophe Merlet + + * fr.po: Updated French translation from + Jonathan Ernst . + +2006-07-21 Josep Puigdemont i Casamajó + + * ca.po: Updated Catalan translation. + +2006-07-18 Guntupalli Karunakar + + * dz.po: Updated Dzongkha translation by + Dzongkhalinux team, DIT + +2006-07-17 Runa Bhattacharjee + + * bn_IN.po:Updated Bengali India Translation. + +2006-07-11 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2006-07-08 Luca Ferretti + + * it.po: Fixed a typo. + +2006-07-07 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2006-07-06 Luca Ferretti + + * it.po: Updated Italian translation. + +2006-07-05 Inaki Larranaga + + * eu.po: Updated Basque translation. + +2006-07-05 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2006-07-05 Jovan Naumovski + + * mk.po: Updated Macedonian translation. + +2006-07-03 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2006-07-03 Subhransu Behera + + * or.po: Updated Oriya Translation + +2006-07-03 Runa Bhattacharjee + + * bn_IN.po: Added Bengali India Translation. + +2006-07-02 Matthias Clasen + + * === Released 2.12.0 === + +2006-06-29 Rhys Jones + + * cy.po: Updated Welsh translation. + +2006-06-26 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2006-06-25 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2006-06-20 Matthias Clasen + + * === Released 2.11.4 === + +2006-06-20 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2006-06-19 Hendrik Richter + + * de.po: Updated German translation. + +2006-06-19 Benoît Dejean + + * fr.po: Updated French translation. + +2006-06-19 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2006-06-19 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2006-06-17 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2006-06-17 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2006-06-12 Matthias Clasen + + * === Released 2.11.3 === + +2006-06-06 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2006-06-05 Matthias Clasen + + * === Released 2.11.2 === + +2006-06-06 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2006-05-28 Pema Geyleg + + * dz.po: Updated Dzongkha translation. + +2006-05-25 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2006-05-25 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2006-05-24 Inaki Larranaga + + * eu.po: Updated Basque translation. + +2006-05-23 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2006-05-21 Alexander Shopov + + * bg.po: Updated Bulgarian translation + by Alexander Shopov + +2006-05-17 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2006-05-16 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2006-05-15 Matthias Clasen + + * === Released 2.11.1 === + +2006-05-06 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2006-05-02 Matthias Clasen + + * === Released 2.11.0 === + +2006-05-02 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2006-05-02 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2006-04-30 Kjartan Maraas + + * POTFILES.in: Add gbookmarkfile.c + * nb.po: Adjust accordingly. + +2006-04-30 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + +2006-04-23 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2006-04-23 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2006-04-21 David Lodge + + * en_GB.po: Translation updated by David Lodge. + +2006-04-21 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2006-04-21 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2006-04-19 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2006-04-18 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2006-04-18 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2006-04-17 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2006-04-11 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2006-04-10 Vladimer Sichinava + + * ka.po: Updated Georgian translation. + +2006-04-07 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2006-04-07 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2006-04-02 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2006-03-27 Yair Hershkovitz + + * he.po: Updated Hebrew translation. + +2006-03-13 Baris Cicek + + * tr.po: Updated Turkish Translation + +2006-03-13 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2006-03-10 Guilherme de S. Pastore + + * pt_BR.po: Updated Brazilian Portuguese translation from Leandro + A. F. Pereira . + +2006-03-06 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2006-03-06 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2006-03-06 Rajesh Ranjan + + * hi.po: Updated Hindi Translation. + +2006-03-10 Subhransu Behera + + * or.po: Updated Oriya translation + +2006-03-07 Matthias Clasen + + * === Released 2.10.1 === + +2006-03-07 Daniel Nylander + + * sv.po: Swedish translation updated. + +2006-03-03 Gabor Kelemen + + * hu.po: Hungarian translation updated. + +2006-02-25 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2006-02-25 Benoît Dejean + + * fr.po: Updated French translation. + +2006-02-25 Žygimantas Beručka + + * lt.po: Updated Lithuanian translation. + +2006-02-24 Matthias Clasen + + * === Released 2.10.0 === + +2006-02-23 Clytie Siddall + + * ka.po: Added Georgian translation by Gia Shervashidze . + +2006-02-21 Inaki Larranaga + + * eu.po: Updated Basque translation. + +2006-02-20 Kostas Papadimas + + * el.po: Updated Greek translation. + +2006-02-16 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation + +2006-02-10 Matthias Clasen + + * === Released 2.9.6 === + +2006-02-08 Luca Ferretti + + * it.po: Updated Italian translation. + +2006-02-07 Lukas Novotny + + * cs.po: Updated Czech translation. + +2006-02-04 Rhys Jones + + * cy.po: Updated Welsh translation. + +2006-02-03 Rhys Jones + + * cy.po: Updated Welsh translation. + +2006-02-01 Leonid Kanter + + * ru.po: Updated Russian translation + +2006-01-31 Slobodan D, Sredojevic + + * sr.po, sr@Latn.po: Updated Serbian translation + +2006-01-30 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2006-01-28 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2006-01-28 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2006-01-27 Matthias Clasen + + * === Released 2.9.5 === + +2006-01-24 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2006-01-21 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2006-01-18 Ole Laursen + + * da.po: Updated Danish translation. + +2006-01-18 Matthias Clasen + + * === Released 2.9.4 === + +2006-01-16 Matthias Clasen + + * === Released 2.9.3 === + +2006-01-16 Hendrik Richter + + * de.po: Updated German translation. + +2006-01-16 Hendrik Brandt + + * de.po: Updated translation, Bugfixes, closed Bug #327196 + +2006-01-12 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2006-01-09 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2005-01-09 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2006-01-08 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2006-01-07 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2006-01-07 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2006-01-06 Josep Puigdemont i Casamajó + + * ca.po: Updated Catalan translation. + +2006-01-07 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2006-01-07 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2006-01-05 Matthias Clasen + + * === Released 2.9.2 === + +2006-01-04 Abel Cheung + + * zh_HK.po: New Chinese (Hong Kong) translation + * zh_TW.po: Updated Chinese (Taiwan) translation + +2006-01-02 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + * no.po: Same + +2005-12-26 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2005-12-25 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-12-19 Christophe Merlet + + * fr.po: Updated French translation. + +2005-12-18 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2005-12-09 Matthias Clasen + + * === Released 2.9.1 === + +2005-12-01 Christian Rose + + * tl.po: Updated Tagalog translation by + Eric Pareja . + +2005-11-17 Matthias Clasen + + * === Released 2.9.0 === + +2005-11-16 Ales Nyakhaychyk + + * be.po: Updated Belarusian translation by Vital Khilko + +2005-11-10 Simos Xenitellis + + * tt.po: Added Tatar translation by Albert Fazlí. + +2005-11-02 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2005-11-01 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2005-10-27 Erdal Ronahi + + * ku.po: Added Kurdish translation. + +2005-10-26 Takeshi AIHANA + + * ja.po: Updated Japanese translation and + Fixed typos reported by kano@na.rim.or.jp. + +2005-10-25 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2005-10-20 Runa Bhattacharjee + + * bn.po: Updated Bengali(bn) Translation + by Mahay Alam Khan + +2005-10-20 Ignacio Casal Quinteiro + + * gl.po: Updated Galician Translation. + +2005-10-17 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2005-10-17 Chao-Hsiung Liao + + * zh_TW.po: Updated Traditional Chinese translation. + +2005-10-16 Marcel Telka + + * sk.po: Updated Slovak translation. + +2005-09-30 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-09-26 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2005-09-25 Christian Rose + + * sv.po: Updated Swedish translation. + +2005-09-06 Matthias Clasen + + * Makefile.in.in: Tell xgettext about all the + printf-like functions we use. + +2005-09-05 Iñaki Larrañaga + + * eu.po: Updated Basque translation. + +2005-09-04 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2005-09-03 Chao-Hsiung Liao + + * zh_TW.po: Updated Traditional Chinese translation. + +2005-09-02 Christophe Merlet + + * fr.po: Updated French translation. + +2005-09-01 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2005-09-01 Raphael Higino + + * pt_BR.po: Updated Brazilian Portuguese translation. + +2005-09-01 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2005-08-31 Mugurel Tudor + + * ro.po: Updated Romanian translation + for Mişu Moldovan + +2005-08-30 Mohammad DAMT + + * id.po: Updated Indonesian translation. + +2005-08-29 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2005-08-28 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-08-28 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation + +2008-08-28 Josep Puigdemont + + * ca.po: Updated Catalan translation. + +2005-08-28 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2005-08-27 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-08-27 Terance Sola + + * nb.po: Updated Norwegian bokmÃ¥l translation. + * no.po: Same. + +2005-08-27 Clytie Siddall + + * vi.po: Updated Vietnamese translation. + +2005-08-27 Christophe Merlet + + * fr.po: Updated French translation. + +2005-08-27 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2005-08-27 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2005-08-27 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-08-26 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2005-08-26 Jordi Mallach + + * ca.po: Updated Catalan translation. + +2005-08-26 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +======= +2005-09-01 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2005-09-01 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-08-31 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-09-01 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2005-08-31 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2005-08-31 Kostas Papadimas + + * el.po: Updated the Greek translation> + +2005-08-31 Kjartan Maraas + + * nb.po: Updated Norwegian bokmÃ¥l translation. + * no.po: Same + +2005-08-31 Gabor Kelemen + + * hu.po: Hungarian translation updated. + +2005-08-30 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2005-08-30 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2005-08-30 Leonid Kanter + + * ru.po: Updated Russian translation + +2005-08-30 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2005-08-30 Jordi Mallach + +* ca.po: Updated Catalan translation. + +2005-08-30 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2005-08-29 Alessio Frusciante + + * it.po: Updated Italian translation by + Luca Ferretti . + +2005-08-28 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-08-27 Christophe Merlet + + * fr.po: Updated French translation. + +2005-08-23 Matthias Clasen + + * === Released 2.8.1 === + +2005-08-22 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2005-08-18 Rhys Jones + + * cy.po: Updated Welsh translation. + +2005-08-15 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation + +2005-08-15 Jordi Mallach + + * ca.po: Updated Catalan translation. + +2005-08-15 Mugurel Tudor + + * ro.po: Updated Romanian translation + by Mişu Moldovan + +2005-08-12 Matthias Clasen + + * === Released 2.8.0 === + +2005-08-12 Kostas Papadimas + + * el.po: Updated the Greek translation> + +2005-08-08 Sunil Mohan Adapa + + * te.po: Added Telugu translation done by + Vikram Phaneendra + Dandu Prasad + Ramana Sai + +2005-08-05 Matthias Clasen + + * === Released 2.7.7 === + +2005-08-03 Matthias Clasen + + * === Released 2.7.6 === + +2005-08-02 Matthias Clasen + + * === Released 2.7.5 === + +2005-07-25 Matthias Clasen + + * Makefile.in.in: Call msgfmt with -c to catch + format errors. + +2005-07-28 Ilkka Tuohela + + * fi.po: Updated Finnish translation. + +2005-07-27 Christian Neumair + + * de.po: Fixed format specifiers. Thanks to Murray Cumming for + pointing this out. + +2005-07-26 Hendrik Brandt + + * de.po: Updated German translation. + +2005-07-26 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2005-07-25 Ankit Patel + + * gu.po: Updated Gujarati Translation. + +2005-07-24 Baris Cicek + + * tr.po: Updated Turkish Translation from Onur Can Cakmak + +2005-07-22 Chao-Hsiung Liao + + * zh_TW.po Updated Traditional Chinese translation. + +2005-07-22 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2005-07-21 Matthias Clasen + + * === Released 2.7.4 === + +2005-07-18 Matthias Clasen + + * de.po: Fix some printf formatting in the German + translation. (#310731, Max Horn) + +2005-07-18 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2005-07-17 Žygimantas Beručka + + * lt.po: Updated Lithuanian translation. + +2005-07-16 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2005-07-15 Matthias Clasen + + * === Released 2.7.3 === + +2005-07-13 Kjartan Maraas + + * nb.po: Update some + * no.po: Update + +2005-07-12 Gabor Kelemen + + * hu.po: Hungarian translation updated. + +2005-07-10 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2005-07-09 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2005-07-09 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2005-07-08 Matthias Clasen + + * === Released 2.7.2 === + +2005-07-08 Danilo Å egan + + * sr.po, sr@Latn.po: Updated Serbian translation. + +2005-07-06 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-07-03 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-07-02 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2005-07-02 Priit Laes + + * et.po: Translation updated. + +2005-07-01 Chao-Hsiung Liao + + * zh_TW.po: Updated Traditional Chinese translation. + +2005-06-30 Matthias Clasen + + * === Released 2.7.1 === + +2005-06-28 Theppitak Karoonboonyanan + + * th.po: Updated Thai translation. + +2005-06-25 Marcel Telka + + * sk.po: Updated Slovak translation. + +2005-06-24 Matthias Clasen + + * POTFILES.in: Add gmappedfile.c + +2005-06-22 Abel Cheung + + * zh_TW.po: Fix language team reference. + +2005-06-21 Priit Laes + + * et.po: Translation updated. + +2005-06-17 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-06-16 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2005-06-15 Marcel Telka + + * sk.po: Updated Slovak translation. + +2005-06-14 Theppitak Karoonboonyanan + + * th.po: Added Thai translation. + +2005-06-13 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-06-13 Alexander Shopov + + * bg.po: Updated Bulgarian translation by + Alexander Shopov + +2005-06-13 Terance Sola + + * nb.po: Updated Norwegian translation. + * no.po: Same as above. + +2005-06-12 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2005-06-11 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2005-06-10 Priit Laes + + * et.po: Translation updated. + +2005-06-10 Matthias Clasen + + * === Released 2.7.0 === + +2005-06-08 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2005-06-06 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2005-06-05 Ignacio Casal Quinteiro + + * gl.po: Updated Galician translation. + +2005-05-30 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2005-05-30 Sanlig Badral + + * mn.po: Updated Mongolian translation. + +2005-05-29 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2005-05-28 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-05-21 Pawan Chitrakar + + * ne.po: Updated Translation + +2005-05-15 Pawan Chitrakar + + * ne.po: Updated Translation + +2005-05-14 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2005-05-14 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2005-05-02 Priit Laes + + * et.po: Translation updated by Ivar Smolin. + +2005-04-30 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2005-04-27 Gabor Kelemen + + * hu.po: Hungarian translation added. + +2005-04-23 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-04-18 David Lodge + + * en_GB.po: Updated British English translation. + +2005-04-17 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-04-12 Iaki Larraaga + + * eu.po: Updated Basque translation. + +2005-04-12 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2005-04-07 Gareth Owen + + * en_GB.po: Updated British English translation + +2005-03-31 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2005-03-30 Steve Murphy + + * rw.po: Added Kinyarwanda translation. + +2005-03-30 Estêvão Samuel Procópio + + * pt_BR.po: Updated Brazilian Portuguese Translation. + +2005-03-15 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2005-03-13 Roozbeh Pournader + + * fa.po: Updated Persian translation by + Hamed Malek . + +2005-03-09 Ahmad Riza H Nst + + * id.po: Updated Indonesian Translation + +2005-03-05 Dan Damian + + * ro.po: Updated Romanian translation by + Mişu Moldovan . + +2005-02-28 Kostas Papadimas + + * el.po: Updated the Greek translation> + +2005-02-20 Christophe Merlet + + * fr.po: Updated French translation. + +2005-02-16 Adi Attar + + * xh.po: Added Xhosa translation + +2005-02-15 Baris Cicek + + * tr.po: Updated Turkish Translation by Onur Can Cakmak + +2005-02-13 Benoît Dejean + + * fr.po: Updated French translation. + +2005-02-11 Danilo Å egan + + * sr.po, sr@Latn.po: Updated Serbian translation. + +2005-02-09 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2005-02-09 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation + +2005-02-06 Kostas Papadimas + + * el.po: Updated Greek translation. + +2005-02-01 Raphael Higino + + * pt_BR.po: Updated Brazilian Portuguese translation. + +2005-01-31 Žygimantas Beručka + + * lt.po: Updated Lithuanian translation. + +2005-01-30 Alessio Frusciante + + * it.po: Updated Italian translation by + Luca Ferretti . + +2005-01-28 Christian Rose + + * tl.po: Added Tagalog translation by + Eric Pareja . + +2005-01-14 Jordi Mallach + + * ca.po: Updated Catalan translation. + +2005-01-14 Marcel Telka + + * sk.po: Updated Slovak translation. + +2005-01-10 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2005-01-10 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2005-01-09 Alessio Frusciante + + * it.po: Updated Italian translation by + Luca Ferretti . + +2005-01-07 Matthias Clasen + + * === Released 2.6.1 === + +2005-01-06 Rhys Jones + + * cy.po: Updated Welsh translation. + +2004-12-18 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2004-12-18 Christian Rose + + * sv.po: Updated Swedish translation. + +2004-12-18 Hendrik Brandt + + * de.po: Updated German translation. + +2004-12-17 Leonid Kanter + + * ru.po: Updated Russian translation + +2004-12-17 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-12-16 Matthias Clasen + + * === Released 2.6.0 === + +2004-12-13 David Lodge + + * en_GB.po: Updated British translation. + +2004-12-12 Alexander Shopov + + * bg.po: Updated Bulgarian translation + +2004-12-07 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2004-12-04 Žygimantas Beručka + + * lt.po: Updated Lithuanian translation. + +2004-12-04 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2004-12-04 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2004-12-03 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2004-12-02 Matthias Clasen + + * === Released 2.5.7 === + +2004-12-01 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2004-11-30 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2004-11-29 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2004-11-29 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2004-11-24 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2004-11-22 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2004-11-22 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2004-11-21 David Lodge + + * en_GB.po: Updated British translation. + +2004-11-20 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-11-18 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2004-11-18 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2004-11-17 Matthias Clasen + + * POTFILES.in: Add gkeyfile.c + +2004-11-15 Hendrik Richter + + * de.po: Updated German translation. + +2004-11-12 Matthias Clasen + + * === Released 2.5.6 === + +2004-11-09 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2004-11-08 Baris Cicek + + * tr.po: Updated Turkish Translation by Onur Can Cakmak + +2004-11-04 Martin Willemoes Hansen + + * da.po: Updated Danish translation. + +2004-11-03 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2004-11-02 Matthias Clasen + + * === Released 2.5.5 === + +2004-10-27 Matthias Clasen + + * === Released 2.5.4 === + +2004-10-27 Kjartan Maraas + + * nb.po: Update Norwegian bokmÃ¥l translation. + +2004-10-26 Gora Mohanty + + * or.po: Updated Oriya translation. + +2004-10-25 Kjartan Maraas + + * nb.po: Update. + +2004-10-19 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-10-15 Danilo Å egan + + * sr.po, sr@Latn.po: Updated Serbian translation. + +2004-10-04 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2004-10-03 David Lodge + + * en_GB.po: Updated British English translation. + +2004-10-03 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2004-10-03 Ryoichi INAGAKI + + * ja.po: Updated Japanese translation. + +2004-09-24 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2004-09-18 Matthias Clasen + + * === Released 2.5.3 === + +2004-09-06 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2004-09-05 Marius Andreiana + + * ro.po: updated by Misu Moldovan + +2004-08-31 Francisco Javier F. Serrador + + * es.po: Updated Spanih translation. + +2004-08-25 Matthias Clasen + + * === Released 2.5.2 === + +2004-08-24 Pawan Chitrakar + + * ne.po: Update Nepali Translation + +2004-08-23 Iñaki Larrañaga + + * eu.po: Updated Basque translation. +º +2004-08-16 Christian Rose + + * bs.po: Added Bosnian translation by + Kenan Hadžiavdić . + +2004-08-13 Tommi Vainikainen + + * fi.po: Unified some fields in po headers for Finnish team. + +2004-08-09 Ankit Patel + + * gu.po: Updated Gujarati translation. + +2004-08-09 Amanpreet Singh Alam + + * pa.po: Updated Panjabi translation. + +2004-08-01 Matthias Clasen + + * === Released 2.5.1 === + +2004-07-29 Iñaki Larrañaga + + * eu.po: Updated Basque translation. + +2004-07-21 Guntupalli Karunakar + + * hi.po: Updated Hindi translation. + +Sun Jul 18 18:03:08 2004 Soeren Sandmann + + * === Released 2.5.0 === + +2004-06-09 Pawan Chitrakar + + * ne.po: Updated Translation + +2004-06-06 Pawan Chitrakar + + * ne.po: Added "ne.po" Nepali translation. + + +2004-05-04 Kjartan Maraas + + * no.po: Updated Norwegian translation. + +2004-05-03 Pablo Saratxaga + + * wa.po: Added Walloon file + +2004-05-01 Takeshi AIHANA + + * ja.po: Updated Japanese translation. + +2004-04-30 Matthias Clasen + + * === Released 2.4.1 === + +2004-04-30 Telsa Gwynne + + * cy.po: Updated Welsh translation from Rhys Jones. + +2004-04-30 Yuriy Syrota + + * uk.po: Updated Ukrainian translation. + +2004-04-29 Dmitry G. Mastrukov + + * ru.po: Updated Russian translation + from Russian team . + +2004-04-29 Danilo Å egan + + * sr.po, sr@Latn.po, sr@ije.po: Updated Serbian translation. + +2004-04-27 Jordi Mallach + + * ca.po: Updated Catalan translation. + +2004-04-27 Vincent van Adrighem + + * nl.po: Translation updated by Tino Meinen. + +2004-04-26 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2004-04-25 Gareth Owen + + * en_GB.po: Updated British English translation + +2004-04-25 Kostas Papadimas + + * el.po: Updated Greek translation. + +2004-04-25 Sami Pesonen + + * fi.po: Updated Finnish translation. + +2004-04-24 Artur Flinta + + * pl.po: Updated Polish translation by GNOME PL Team. + +2004-04-24 Christophe Merlet + + * fr.po: Updated French translation. + +2004-04-24 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2004-04-24 Francisco Javier F. Serrador + + * es.po: Updated Spanih translation. + +2004-04-24 Adam Weinberger + + * en_CA.po: Updated Canadian English translation. + +2004-04-23 Christian Rose + + * sv.po: Updated Swedish translation. + +2004-04-08 Guntupalli Karunakar + + * gu.po: Added Gujurati translation by + Gujarati Team . + +2004-04-07 Iñaki Larrañaga + + * eu.po: Updated Basque translation. + +2004-03-31 Mohammad DAMT + + * id.po: Updated Indonesian translation + +2004-03-30 Adam Weinberger + + * en_CA.po: Added Canadian English translation. + +2004-03-25 Gil Osher + + * he.po: Updated Hebrew translation. + +2004-03-18 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2004-03-16 Gareth Owen + + * en_GB.po: Added British translation + +Tue Mar 16 11:53:29 2004 Owen Taylor + + * === Released 2.4.0 === + +2004-03-15 Mugurel Tudor + + * ro.po: Updated Romanian translation by + Mişu Moldovan + +2004-03-14 Robert Sedak + + * hr.po: Updated Croatian translation. + +Tue Mar 9 09:22:02 2004 Owen Taylor + + * === Released 2.3.6 === + +2004-03-08 Alastair McKinstry + + * ga.po: Updated Irish translation. + +2004-03-08 Ales Nyakhaychyk + + * be.po: Updated Belarusian translation. + +2004-03-07 Danilo Å egan + + * sr@ije.po: Added Serbian Jekavian translation by Bojan Suzić + . + +2004-03-06 Francisco Javier F. Serrador + + * es.po: Updated Spanish translation. + +2004-03-04 Guntupalli Karunakar + + * pa.po: Added Punjabi translation by + Amanpreet Singh Alam . + +2004-03-04 Funda Wang + + * zh_CN.po: Updated Simplified Chinese translation. + +2004-03-03 Pauli Virtanen + + * fi.po: Updated Finnish translation. + +Mon Mar 1 16:49:51 2004 Owen Taylor + + * === Released 2.3.5 === + +2004-03-01 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-02-27 Priit Laes + + * et.po: Translation updated by Allan Sims. + +2004-02-24 Alastair McKinstry + + * ga.po: Corrections. + +2004-02-24 Dafydd Harries + + * cy.po: Updated Welsh translation by Rhys Jones and myself. + +2004-02-23 Kostas Papadimas + + * el.po: Updated Greek translation. + +2004-02-23 Guntupalli Karunakar + + * ta.po: Updated Tamil translation by + Dinesh Nadarajah + +2004-02-20 Laurent Dhima + + * sq.po: Fixed Albanian translation. + +2004-02-12 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-02-12 Danilo Å egan + + * sr.po, sr@Latn.po: Reviewed by myself. + +2004-02-09 Maxim Dziumanenko + + * uk.po: Updated Ukrainian translation + +2004-02-05 Robert Sedak + + * hr.po: Updated Croatian translation. + +2004-02-05 Mətin Əmirov + + * az.po: Translation updated. + +2004-02-01 Hasbullah Bin Pit + + * ms.po: Updated Malay translation. + +2004-01-31 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-01-30 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2004-01-29 Alessio Frusciante + + * it.po: Updated Italian translation. + +2004-01-28 Miloslav Trmac + + * cs.po: Fixed Czech translation. + +2004-01-27 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2004-01-16 Alastair McKinstry + + * ga.po: Updated Irish translation. + +2004-01-16 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2004-01-13 Alastair McKinstry + + * ga.po: Irish translation. + +2004-01-13 Kjartan Maraas + + * no.po: Updated Norwegian translation. + +2004-01-07 Sanlig Badral + + * mn.po; Updated Mongolian translation. + +2004-01-06 Christian Neumair + + * de.po: Updated German translation. + +2004-01-01 Roozbeh Pournader + + * fa.po: Updated Persian translation. + +2004-01-01 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2003-12-27 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2003-12-20 Arafat Medini + + * ar.po: Updated Arabic translation. + +2003-12-03 Dmitry G. Mastrukov + + * ru.po: Updated Russian translation + from Russian team . + +2003-12-03 Duarte Loreto + + * pt.po: Updated and revised Portuguese translation. + +2003-11-22 Christophe Merlet + + * fr.po: Updated French translation. + +2003-11-20 Ole Laursen + + * da.po: Updated Danish translation. + +2003-11-19 Åsmund Skjæveland + + * nn.po: Updated Norwegian Nynorsk translation. + +2003-11-18 Miloslav Trmac + + * cs.po: Updated Czech translation. + +2003-11-13 Jordi Mallach + + * ca.po: Updated Catalan translation. + +2003-11-10 Pablo Gonzalo del Campo + + * es.po: Updated Spanish translation by + Francisco Javier F. Serrador . + +2003-10-31 Kjartan Maraas + + * no.po: Updated Norwegian translation. + +2003-10-28 KAMAGASAKO Masatoshi + + * ja.po: Updated Japanese translation. + +2003-10-19 Vincent van Adrighem + + * nl.po: Dutch translation updated by Tino Meinen. + +2003-10-08 Artur Flinta + + * pl.po: Updated Polish translation. + +2003-10-04 Christian Rose + + * sv.po: Updated Swedish translation. + +2003-09-29 Gustavo Maciel Dias Vieira + + * pt_BR.po: Applied revision by Augusta Marques da Silva + . + +2003-09-28 Gediminas Paulauskas + + * lt.po: Added Lithuanian translation by Tomas Kuliavas. + +2003-08-20 Richard Allen + + * is.po: Added Icelandic translation. + +2003-08-18 Kjartan Maraas + + * no.po: Update Norwegian translation. + +2003-08-18 Metin Amiroff + + * az.po: Updated Azerbaijani translation. + +2003-08-16 Danilo Å egan + + * sr.po, sr@Latn.po: Updated Serbian translation. + +2003-07-10 Joel Brich + + * eo.po: Added Esperanto translation + from Charles Voelger + +2003-06-22 Metin Amiroff + + * az.po: Updated Azerbaijani translation. + +2003-06-04 Abel Cheung + + * ta.po: Fix broken encoding. + +2003-05-27 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation. + +2003-05-19 Arafat Medini + + * ar.po: Added Arabic translation from + Arabeyes team + + +2003-05-17 Telsa Gwynne + + * cy.po: Added Welsh translation from + Dafydd Harries + +2003-05-08 Christophe Merlet + + * fr.po: Updated French translation. + +2003-05-05 Christian Rose + + * sr.po, sr@Latn.po: Added Serbian translation by + Danilo Å egan . + +2003-03-26 Christian Rose + + * yi.po: Added Yiddish translation by + Raphael Finkel . + +2003-02-27 James Henstridge + + * Makefile.in.in (uninstall): fix uninstall target so that it + correctly removes the installed Makefile.in.in if PACKAGE==glib. + (update-po): update to use logic more similar to new gettexts, + which should pass readonly srcdir distcheck. + +2003-02-24 Roozbeh Pournader + + * fa.po: Updated Persian translation. + +2003-02-21 Metin Amiroff + + * az.po: some fixes in Azerbaijani translation. + +2003-02-11 Fatih Demir + + * tr.po: Take over from stable branch. + +2003-02-10 Mohammad DAMT + + * id.po: Added Indonesian translation + +2003-01-29 Tõivo Leedjärv + + * et.po: Fixed a small bug in Estonian translation. + +2003-01-22 Paisa Seeluangsawat + + * th.po: Added Thai file + +2003-01-22 Pablo Saratxaga + + * bn.po: Added Bengali file + +2003-01-22 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation. + +2003-01-21 Christian Rose + + * mn.po: Added Mongolian translation by + Sanlig Badral . + +2003-01-20 Christian Neumair + + * de.po: Updated German translation. + +2003-01-20 Pablo Saratxaga + + * vi.po: Updated Vietnamese file + +2003-01-20 Christian Neumair + + * de.po: Updated German translation. + +2003-01-16 Daniel Yacob + + * am.po: Added Amharic translation. + +2003-01-15 Dmitry G. Mastrukov + + * ru.po: updated Russian translation + from Russian team . + +2003-01-14 Yanko Kaneti + + * bg.po: Updated Bulgarian translation (style) by + Alexander Shopov . + +2003-01-06 Dmitry G. Mastrukov + + * ru.po: updated Russian translation + from Russian team . + +2003-01-05 Pauli Virtanen + + * fi.po: Updated Finnish translation from Lauri Nurmi. + +2003-01-02 Zbigniew Chyla + + * pl.po: Updated Polish translation by + GNOME PL Team . + +2003-01-02 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation. + +2002-12-28 Vincent van Adrighem + + * nl.po: Dutch translation updated by Tino Meinen. + +2002-12-28 Tõivo Leedjärv + + * et.po: Added Estonian translation + by Allan Sims . + +2002-12-27 Vincent van Adrighem + + * nl.po: Dutch translation updated by Tino Meinen. + +2002-12-19 Jordi Mallach + + * ca.po: Updated Catalan translation. + +2002-12-19 Yanko Kaneti + + * bg.po: Updated Bulgarian translation (style) by + Alexander Shopov . + +2002-12-18 Artis Trops + + * lv.po: Updated Latvian translation. + +2002-12-18 Ole Laursen + + * da.po: Updated Danish translation. + +2002-12-18 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2002-12-18 Dmitry G. Mastrukov + + * ru.po: updated Russian translation + * from Russian team . + +2002-12-17 German Poo-Caaman~o + + * es.po: Updated Spanish translation + +2002-12-16 Tor Lillqvist + + * fi.po: In the admittedly strangely worded "Channel set flags + unsupported" message, "set" is a verb. + +2002-12-15 Christian neumair + + * de.po: Updated German translation. + +2002-12-15 Christophe Merlet + + * fr.po: Updated French translation. + +2002-12-12 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2002-12-12 Yanko Kaneti + + * bg.po: Updated Bulgarian translation. + +2002-12-11 Pauli Virtanen + + * fi.po: Added Finnish translation from Lauri Nurmi. + +Wed Dec 11 14:06:50 2002 Owen Taylor + + * po/Makefile.in.in: Fix problem from recent commit where + non GNU-format message catalogs would be installed in + datadir. Remove some leftover setting of PATH=../src:$PATH. + +2002-12-11 Gil Osher + + * he.po: Added Hebrew translation. + +2002-12-09 Kjartan Maraas + + * no.po: Updated Norwegian (bokmal) translation. + * nn.po: Updated Norwegian (nynorsk) translation from Gaute + Hope + +2002-12-09 Artis Trops + + * lv.po: sync with gnome-2-0 branch. + +2002-12-05 Takayuki KUSANO + + * ja.po: Updated Japanese translation. + +Tue Dec 3 20:40:56 2002 Owen Taylor + + * Makefile.in.in: Use datadir, not $(prefix)/share. (#89339) + +2002-12-03 Kostas Papadimas + + * el.po: updated Greek translation + +2002-12-03 Miloslav Trmac + + * cs.po: Merged Czech translation from gnome-2-0. + +2002-12-03 Dmitry G. Mastrukov + + * ru.po: updated Russian translation + * from Russian team . + +2002-11-30 Ole Laursen + + * da.po: Updated Danish translation. + +2002-11-26 Christian Rose + + * sv.po: Updated Swedish translation. + +2002-11-25 Vincent van Adrighem + + * nl.po: Massive copy-paste from stable branch. + +2002-11-25 Hasbullah Bin Pit + + * ms.po: Updated Malay Translation. + +2002-11-22 Kjartan Maraas + + * no.po: Updated Norwegian (bokmal) translation. + +2002-11-22 Dmitry G. Mastrukov + + * be.po: Updated Belarusian translation + * from Belarusian team . + +2002-11-13 Laurent Dhima + + * sq.po: Updated Albanian translation. + +2002-11-04 Hasbullah Bin Pit + + * ms.po: Updated Malay Translation. + +2002-11-03 Dmitry G. Mastrukov + + * be.po: Added Belarusian translation + * from Belarusian team . + +2002-10-13 Laurent Dhima + + * sq.po: added albanian translation + +2002-10-04 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2002-09-22 Christopher R. Gabriel + + * it.po: added italian translation + +2002-08-24 Fatih Demir + + * ta.po: Committed. + +2002-08-23 Roozbeh Pournader + + * fa.po: Updated Persian translation. + +2002-08-20 Roozbeh Pournader + + * fa.po: Update Persian translation. + +2002-08-20 Roozbeh Pournader + + * fa.po: Added Persian translation. + +2002-08-10 Gustavo Noronha Silva + + * pt_BR: new translation + +2002-06-26 Yanko Kaneti + + * bg.po (added): Bulgarian translation by + Borislav Aleksandrov . + +2002-06-05 Christophe Merlet + + * fr.po: Updated French translation. + +2002-06-04 Jordi Mallach + + * ca.po: Updated Catalan translation. + +Wed May 22 15:24:04 2002 Owen Taylor + + * README.translators: Add from GTK+. + + * *.po: Convert all po files to UTF-8. + +2002-05-18 Christian Rose + + * sv.po: Updated Swedish translation. + +2002-05-16 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2002-05-12 Christophe Merlet + + * fr.po: Updated French translation. + +2002-05-10 Naba Kumar + + * hi.po: New Hindi translation added. + +2002-05-06 Pablo Saratxaga + + * vi.po: Updated Vietnamese file + +2002-04-30 Duarte Loreto + + * pt.po: Converted Portuguese translation to UTF-8. + +2002-04-29 Pablo Saratxaga + + * vi.po: Added Vietnamese file + * az.po,cs.po,ko.po,lv.po,nn.po: fixed syntax errors + +2002-04-28 Christophe Merlet + + * fr.po: Updated French translation. + +2002-04-18 Vincent van Adrighem + + * nl.po: Updated Dutch translation by Ronald Hummelink. + +2002-04-07 Stanislav Brabec + + * cs.po: Added Czech translation from Petr Pytelka + . + +2002-03-31 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation, and removed + all positional parameters :( + +2002-03-28 Valek Filippov + + * ru.po: Updated russian translation. + +2002-03-17 Valek Filippov + + * ru.po: Updated russian translation. + +2002-03-17 Wang Jian + + * zh_CN.po: Updated Simplified Chinese translation. + +2002-03-16 Christian Meyer + + * de.po: Updated German translation. + +2002-03-15 Christophe Merlet + + * fr.po: Updated French translation. + +2002-03-10 Valek Filippov + + * ru.po: Updated russian translation. + +2002-03-06 Germ� Poo-Caamao + + * es.po: Updated spanish translation. + +2002-03-04 Duarte Loreto + + * pt.po: Updated Portuguese translation. + +2002-03-03 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2002-03-02 Hasbullah Bin Pit + + * ms.po: Updated Malay Translation. + +2002-03-02 Changwoo Ryu + + * ko.po: Updated Korean translation. + +2002-03-01 Sven Neumann + + * de.po: fixed typo in german translation. + +2002-02-28 Ole Laursen + + * da.po: Updated Danish translation. + +2002-02-28 Zbigniew Chyla + + * pl.po: Updated Polish translation by + GNOME PL Team . + +2002-02-28 Christian Meyer + + * de.po: Updated German translation. + +2002-02-27 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2002-02-26 Christophe Merlet + + * fr.po: Updated French translation and + converted to UTF-8. + +2002-02-27 Takayuki KUSANO + + * ja.po: Updated Japanese translation. + +2002-02-26 Christian Rose + + * sv.po: Updated Swedish translation. + +2002-02-25 Christian Rose + + * sv.po: Fixed Swedish translation. + +2002-02-25 Hasbullah Bin Pit + + * ms.po: Updated Malay Translation. + +2002-02-25 Valek Filippov + + * ru.po: Updated russian translation. + +2002-02-25 Christian Rose + + * sv.po: Updated Swedish translation. + +2002-02-23 Ole Laursen + + * da.po: Updated Danish translation. + +2002-02-20 Simos Xenitellis + + * el.po: Added Greek translation. + +2002-02-19 Takayuki KUSANO + + * ja.po: Updated Japanese translation. + +2002-02-17 Wang Jian + + * zh_CN.po: Updated Simplified Chinese translation by + Wang Jian. + +2002-02-12 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2002-02-10 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2002-02-07 Changwoo Ryu + + * ko.po: Added Korean translation. + +2002-02-07 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation. + +2002-02-05 Takayuki KUSANO + + * ja.po: Converted to UTF-8. + +2002-01-31 jacob berkman + + * Makefile.in.in: remove cat-id-tbl.c references (this really + fixes this build) + + * Makefile.in.in (DISTFILES): remove stamp-cat-id + + * Makefile.in.in: remove references to po2tbl.sed.in + +2002-01-31 Roy-Magne Mo + + * nn.po: Update Norwegian (nynorsk) translation. + +2002-01-29 Zbigniew Chyla + + * pl.po: Updated Polish translation by + GNOME PL Team . + +2002-01-28 Zbigniew Chyla + + * pl.po: Updated Polish translation by + GNOME PL Team . + +2002-01-28 Roy-Magne Mo + + * nn.po: Updated Norwegian (nynorsk) translation and + switched to UTF-8. + +2002-01-28 Christian Rose + + * sv.po: Updated and converted to UTF-8. + +2002-01-27 Dirk-Jan Binnema + + * nl.po: Updated dutch translation + +2002-01-25 Ole Laursen + + * da.po: Updated Danish translation and switched to UTF-8. + +2002-01-23 ERDI Gergo + + * Makefile.in.in (POTFILES): Remove inlttool [] tags from + POTFILE.in + +2002-01-21 Zbigniew Chyla + + * pl.po: Updated Polish translation by + GNOME PL Team . + +2002-01-15 Peteris Krisjanis + + * lv.po: Added Latvian translation. + +2002-01-13 Hasbullah Bin Pit + + * ms.po: Added Malay (Bahasa Melayu) translation. + +2002-01-11 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2002-01-09 Takayuki KUSANO + + * ja.po: Remove %m$ notation that can't be used with + g_set_error(). + +2002-01-07 Zbigniew Chyla + + * pl.po: Updated Polish translation by + GNOME PL Team . + +2002-01-04 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2001-12-27 Duarte Loreto + + * pt.po: Added portuguese translation + +2001-12-27 Jesus Bravo Alvarez + + * gl.po: Updated Galician translation from + Manuel A. Fernandez Montecelo + +2001-12-24 Vasif Ismailogu MD + + * az:po updating Azerbaijani translation file + +2001-12-21 Takayuki KUSANO + + * ja.po: Updated Japanese translation. + +2001-12-19 Christian Rose + + * sv.po: Updated Swedish translation. + +2001-12-18 Takayuki KUSANO + + * ja.po: Updated Japanese translation. + +2001-12-15 Valek Filippov + + * ru.po: Updated russian translation. + +2001-12-15 Christian Rose + + * sv.po: Updated Swedish translation. + +2001-12-13 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2001-12-11 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2001-12-11 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation. + +2001-12-10 Takayuki KUSANO + + * ja.po: Updated Japanese translation. + +2001-12-08 Christian Rose + + * sv.po: Updated Swedish translation. + +2001-12-04 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + * POTFILES.in: Added glib/gdir.c. + +2001-12-03 Christian Rose + + * sv.po: Updated Swedish translation. + +2001-11-26 Jesus Bravo Alvarez + + * gl.po: Added Galician translation from + Manuel A. Fern�dez Montecelo + +2001-11-23 Dirk-Jan C. Binnema + + * nl.po: Added Dutch translation. + +2001-11-20 Abel Cheung + + * zh_TW.po: Updated traditional Chinese translation. + +2001-11-15 Takayuki KUSANO + + * ja.po: Added Japanese translation. + +2001-11-14 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2001-11-07 Wang Jian + + * zh_CN.po: Updated Simplified Chinese translation by + Wang Jian. + +2001-11-06 Wang Jian + + * zh_CN.po: Added Simplified Chinese translation by + He Qiangqiang . + +2001-11-01 Marius Andreiana + + * ro.po: added + +2001-10-28 jacob berkman + + * Makefile.in.in: install Makefile.in.in and po2tbl.sed.in for use + with glib-gettextize by other packages + +2001-10-13 Stanislav Visnovsky + + * sk.po: More updates. + +2001-10-13 Valek Filippov + + * ru.po: Added russian translation. + +2001-10-12 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2001-10-08 Pablo Saratxaga + + * ca.po: Updated Catalan file + +2001-10-05 Pablo Saratxaga + + * az.po: Updated Azeri file + * eu.po: Updated Basque file + +2001-09-29 Fatih Demir + + * ta.po: Committed updated Tamil translation by Dinesh. + +2001-09-28 Stanislav Visnovsky + + * sk.po: Updated Slovak translation. + +2001-09-28 Tor Lillqvist + + * POTFILES.in: Add iochannel.c and giowin32.c. + + * sv.po: Remove a bogus fuzziness indicator. + +2001-09-25 Pablo Saratxaga + + * ca.po: Updated Catalan file + +2001-09-24 Stanislav Visnovsky + + * sk.po: Added Slovak translation. + +2001-09-23 Fatih Demir + + * ta.po: Committed updated Tamil translation by Dinesh. + +2001-09-23 Pablo Saratxaga + + * az.po: Updated Azeri file + +2001-09-19 Kjartan Maraas + + * no.po: Updated Norwegian (bokm�) translation. + +2001-09-11 Christian Rose + + * sv.po: Updated Swedish translation. + +2001-09-06 Roy-Magne Mo + + * nn.po: Updated Norwegian nynorsk translation + +2001-09-05 Ross Golder + + * Makefile.in.in (install-data-yes): Take DESTDIR into account + +Wed Sep 5 09:27:34 2001 Owen Taylor + + * Revert last change to Makefile.in.in - no this + is not the Makefile.in.in from gettext. + +2001-09-05 Ross Golder + + * Makefile.in.in: Updated from more recent gettext to fix + problem with DESTDIR. + +2001-09-02 Carlos Perell Mar� + + * es.po: Added Spanish translation by jos�antonio salgueiro + + +2001-08-21 Abel Cheung + + * zh_TW.po: Preliminary traditional Chinese translation. + +2001-08-19 Fatih Demir + + * ta.po: Added Tamil translation by. + +2001-07-29 Christian Meyer + + * de.po: Removed one fuzzy. + +2001-07-17 Kjartan Maraas + + * nn.po: Added Norwegian (nynorsk) translation. + +2001-07-06 Christian Rose + + * sv.po: Updated Swedish translation. + +2001-07-06 Pablo Saratxaga + + * eu.po: Added Basque file + +2001-06-27 Kjartan Maraas + + * no.po: Completed Norwegian translation. + * POTFILES.in: Adjusted to fit the move of the .c files. + +2001-06-08 Pablo Saratxaga + + * az.po: Added Azeri file + +2001-05-15 Matthias Warkus + + * de.po: Brought this up to date. + +2001-04-30 Pablo Saratxaga + + * ca.po: Added Catalan file + +2001-04-05 Christian Rose + + * sv.po: And other fixes. Thanks to Gran Uddeborg + . + +2001-04-05 Christian Rose + + * sv.po: Fixed another message in the Swedish translation. Thanks to + Jrgen Tegn� . + +2001-04-05 Christian Rose + + * sv.po: Fixed Swedish translation, thanks to Veronica Loell + and Martin Norb�k . + +2001-04-05 Christian Rose + + * sv.po: Added Swedish translation. + +2001-30-03 Christian Meyer + + * de.po: Updated German translation. + +2001-07-03 Christian Meyer + + * de.po: Added German translation. + +2001-03-02 Christophe Merlet + + * fr.po: Added French translation. + +2001-02-19 Valek Filippov + + * ru.po: Added russian translation. + +2001-02-08 Fatih Demir + + * tr.po: Added the Turkish translation by + Kemal Yilmaz. + +2001-01-18 Kjartan Maraas + + * no.po: Added Norwegian translation. diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..06eeef8 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,94 @@ +# please keep this list sorted alphabetically +# +af +am +ar +as +ast +az +be +be@latin +bg +bn +bn_IN +bs +ca +ca@valencia +cs +cy +da +de +dz +el +en_CA +en_GB +en@shaw +eo +es +et +eu +fa +fi +fr +ga +gl +gu +he +hi +hr +hu +hy +id +is +it +ja +ka +kn +ko +ku +lt +lv +mai +mg +mk +ml +mn +mr +ms +nb +nds +ne +nl +nn +oc +or +pa +pl +ps +pt +pt_BR +ro +ru +rw +si +sk +sl +sq +sr +sr@latin +sr@ije +sv +ta +te +th +tl +tr +tt +uk +vi +wa +xh +yi +zh_CN +zh_HK +zh_TW diff --git a/po/Makefile.in.in b/po/Makefile.in.in new file mode 100644 index 0000000..d1c93ba --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,277 @@ +# Makefile for program source directory in GNU NLS utilities package. +# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper +# +# This file file be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# Please note that the actual code is *not* freely available. +# +# - Modified by Owen Taylor to use GETTEXT_PACKAGE +# instead of PACKAGE and to look for po2tbl in ./ not in intl/ +# +# - Modified by jacob berkman to install +# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize + +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = @SHELL@ +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +libdir = @libdir@ +localedir = $(libdir)/locale +gnulocaledir = $(datadir)/locale +gettextsrcdir = $(datadir)/glib-2.0/gettext/po +subdir = po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ + +CC = @CC@ +GENCAT = @GENCAT@ +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge + +DEFS = @DEFS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ + +INCLUDES = -I.. -I$(top_srcdir)/intl + +COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) + +SOURCES = +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +DISTFILES = LINGUAS ChangeLog Makefile.in.in POTFILES.in $(GETTEXT_PACKAGE).pot \ +$(POFILES) $(GMOFILES) $(SOURCES) + +POTFILES = \ + +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +INSTOBJEXT = @INSTOBJEXT@ + +.SUFFIXES: +.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat + +.c.o: + $(COMPILE) $< + +.po.pox: + $(MAKE) $(GETTEXT_PACKAGE).pot + $(MSGMERGE) $< $(srcdir)/$(GETTEXT_PACKAGE).pot -o $*.pox + +.po.mo: + $(MSGFMT) -o $@ $< + +.po.gmo: + file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ + && rm -f $$file && $(GMSGFMT) $(MSGFMT_OPTS) -o $$file $< + +.po.cat: + sed -f ../intl/po2msg.sed < $< > $*.msg \ + && rm -f $@ && $(GENCAT) $@ $*.msg + + +all: all-@USE_NLS@ + +all-yes: $(CATALOGS) +all-no: + +$(srcdir)/$(GETTEXT_PACKAGE).pot: $(POTFILES) + $(XGETTEXT) --default-domain=$(GETTEXT_PACKAGE) --directory=$(top_srcdir) \ + --add-comments --keyword=_ --keyword=N_ \ + --keyword=C_:1c,2 \ + --keyword=NC_:1c,2 \ + --keyword=g_dngettext:2,3 \ + --flag=N_:1:pass-c-format \ + --flag=C_:2:pass-c-format \ + --flag=NC_:2:pass-c-format \ + --flag=g_dngettext:2:pass-c-format \ + --flag=g_strdup_printf:1:c-format \ + --flag=g_string_printf:2:c-format \ + --flag=g_string_append_printf:2:c-format \ + --flag=g_error_new:3:c-format \ + --flag=g_set_error:4:c-format \ + --flag=g_markup_printf_escaped:1:c-format \ + --flag=g_log:3:c-format \ + --flag=g_print:1:c-format \ + --flag=g_printerr:1:c-format \ + --flag=g_printf:1:c-format \ + --flag=g_fprintf:2:c-format \ + --flag=g_sprintf:2:c-format \ + --flag=g_snprintf:3:c-format \ + --flag=g_scanner_error:2:c-format \ + --flag=g_scanner_warn:2:c-format \ + --files-from=$(srcdir)/POTFILES.in \ + && test ! -f $(GETTEXT_PACKAGE).po \ + || ( rm -f $(srcdir)/$(GETTEXT_PACKAGE).pot \ + && mv $(GETTEXT_PACKAGE).po $(srcdir)/$(GETTEXT_PACKAGE).pot ) + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ +install-data-no: all +install-data-yes: all + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \ + fi + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + case "$$cat" in \ + *.gmo) destdir=$(gnulocaledir);; \ + *) destdir=$(localedir);; \ + esac; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $$dir; \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ + fi; \ + if test -r $$cat; then \ + $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ + echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ + else \ + $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ + fi; \ + if test -r $$cat.m; then \ + $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ + else \ + if test -r $(srcdir)/$$cat.m ; then \ + $(INSTALL_DATA) $(srcdir)/$$cat.m \ + $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ + echo "installing $(srcdir)/$$cat as" \ + "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ + else \ + true; \ + fi; \ + fi; \ + done + if test "$(PACKAGE)" = "glib"; then \ + if test -r "$(MKINSTALLDIRS)"; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ + else \ + $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \ + fi; \ + $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ + $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ + else \ + : ; \ + fi + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ + rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ + rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ + rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ + done + if test "$(PACKAGE)" = "glib"; then \ + rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ + fi + +check: all + +dvi info tags TAGS ID: + +mostlyclean: + rm -f core core.* *.pox $(GETTEXT_PACKAGE).po *.old.po cat-id-tbl.tmp + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f $(GMOFILES) + +distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir) +dist distdir: update-po $(DISTFILES) + dists="$(DISTFILES)"; \ + for file in $$dists; do \ + ln $(srcdir)/$$file $(distdir) 2> /dev/null \ + || cp -p $(srcdir)/$$file $(distdir); \ + done + +update-po: Makefile + $(MAKE) $(GETTEXT_PACKAGE).pot + tmpdir=`pwd`; \ + cd $(srcdir); \ + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ + echo "$$lang:"; \ + if $(MSGMERGE) $$lang.po $(GETTEXT_PACKAGE).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$cat failed!"; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi; \ + done + +# POTFILES is created from POTFILES.in by stripping comments, empty lines +# and Intltool tags (enclosed in square brackets), and appending a full +# relative path to them +POTFILES: POTFILES.in + ( if test 'x$(srcdir)' != 'x.'; then \ + posrcprefix='$(top_srcdir)/'; \ + else \ + posrcprefix="../"; \ + fi; \ + rm -f $@-t $@ \ + && (sed -e '/^#/d' \ + -e "s/^\[.*\] +//" \ + -e '/^[ ]*$$/d' \ + -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ + | sed -e '$$s/\\$$//') > $@-t \ + && chmod a-w $@-t \ + && mv $@-t $@ ) + +Makefile: Makefile.in.in ../config.status POTFILES + cd .. \ + && $(SHELL) ./config.status $(subdir)/$@.in + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..e7ae51b --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,105 @@ +glib/gatomic.c +glib/gbookmarkfile.c +glib/gconvert.c +glib/gdir.c +glib/gfileutils.c +glib/giochannel.c +glib/giowin32.c +glib/glib.py +glib/gmappedfile.c +glib/gmarkup.c +glib/gregex.c +glib/gshell.c +glib/gspawn-win32.c +glib/gspawn.c +glib/gutf8.c +glib/goption.c +glib/gkeyfile.c +gio/gappinfo.c +gio/gasynchelper.c +gio/gasyncinitable.c +gio/gasyncresult.c +gio/gbufferedinputstream.c +gio/gbufferedoutputstream.c +gio/gcancellable.c +gio/gcharsetconverter.c +gio/gcontenttype.c +gio/gconverter.c +gio/gconverterinputstream.c +gio/gconverteroutputstream.c +gio/gdatainputstream.c +gio/gdataoutputstream.c +gio/gdesktopappinfo.c +gio/gdrive.c +gio/gdummyfile.c +gio/gemblem.c +gio/gemblemedicon.c +gio/gfileattribute.c +gio/gfile.c +gio/gfileenumerator.c +gio/gfileicon.c +gio/gfileinfo.c +gio/gfileinputstream.c +gio/gfileiostream.c +gio/gfilemonitor.c +gio/gfilenamecompleter.c +gio/gfileoutputstream.c +gio/gfilterinputstream.c +gio/gfilteroutputstream.c +gio/gicon.c +gio/ginputstream.c +gio/ginetaddress.c +gio/ginetsocketaddress.c +gio/ginitable.c +gio/gioerror.c +gio/giomodule.c +gio/gioscheduler.c +gio/giostream.c +gio/gloadableicon.c +gio/glocaldirectorymonitor.c +gio/glocalfile.c +gio/glocalfileenumerator.c +gio/glocalfileinfo.c +gio/glocalfileinputstream.c +gio/glocalfilemonitor.c +gio/glocalfileoutputstream.c +gio/glocalvfs.c +gio/gmemoryinputstream.c +gio/gmemoryoutputstream.c +gio/gmount.c +gio/gmountoperation.c +gio/gnativevolumemonitor.c +gio/gnetworkaddress.c +gio/gnetworkservice.c +gio/goutputstream.c +gio/gpollfilemonitor.c +gio/gresolver.c +gio/gseekable.c +gio/gsimpleasyncresult.c +gio/gsocket.c +gio/gsocketaddress.c +gio/gsocketclient.c +gio/gsocketconnectable.c +gio/gsocketconnection.c +gio/gsocketinputstream.c +gio/gsocketlistener.c +gio/gsocketoutputstream.c +gio/gtcpconnection.c +gio/gthemedicon.c +gio/gthreadedsocketservice.c +gio/gunionvolumemonitor.c +gio/gunixconnection.c +gio/gunixinputstream.c +gio/gunixmount.c +gio/gunixmounts.c +gio/gunixoutputstream.c +gio/gunixsocketaddress.c +gio/gunixvolume.c +gio/gunixvolumemonitor.c +gio/gvfs.c +gio/gvolume.c +gio/gvolumemonitor.c +gio/gwin32appinfo.c +gio/gzlibcompressor.c +gio/gzlibdecompressor.c +gio/win32/gwinhttpfile.c diff --git a/po/af.gmo b/po/af.gmo new file mode 100644 index 0000000000000000000000000000000000000000..5eeef94239935c51f0cf1e9e621f86df59bc9f97 GIT binary patch literal 4896 zcma);O>87b6~~Jtd<_PYuuBM^wM&fG+3m^LyIIU^yqm0JdyUs?6OR)_6r}R>o0-n^ zbhWCw?Mx679N@N!ga8SFkd_>fxFNKMC?pcfkqc3Bi^PXOTtFximmCto|5aD_%y=h+ zmdn5Cs#jI-t6udV@4n+l0?$RX&!WxTCd4lI_U-tG=gRwq_yo8Ceh_@hlRO8Wx#zb% zzXyH<^4I-5P#wy{{1ab;+>8B5^w@!y{~{Amv4Y`;1J|| zxB;F7e+SNje*@XR+Q*8137*CK3dr*hJ%0?coi{;V?++mR;VqE;aQx%N{-;3BqivAq zTTp^O06z!*2IP6Kf~?2CK$g1;LE$(wK-Tjr$m21{dOio925*9_$6r9GF5U(uScB0V zztbT5`I{hy#M2<3t8anq@8`fX;4i^T;OoBs7>r;$&fp)*Ujkv8*ahzg_d(9<>mcXN zFF^M93n1I`XOQLJ0g;Mg28$rX;y8$Ki!Y-sqj9YHnMdP!?2`x4*tP{Uw)H$(`9M7v zZ|OS%5H52zEP@<6whPDFJx%<-fVPANRh&-jSGK8vhO$#VoR@sY?n8T^>P7DR-|WZo zVO!Y`?DKQJ^CDRHzd0rkp|Ni`ZX8qg*H_Ruo}WVFhke5j=TP~azz@zDe$JxZj)r6C z;s>~geR+z1$x~5spyDW$l(cmiCEa;3TVLqN)yoCfJvTkKJa;@>pp~5{rfirJ|8|_4 zwR1AEGSQh-ve+R}1Crw1Mw)VNwmm1sBWW5(ZIwkjk=rT5HpOMt?&qo7Mz#$VqaB4^ zL$RWgxlFcoI+S5#sGVsul=^_o=yhD?-A8On?MTIL7e8YF>CrONSJf#cBN;ytdgR7N z2NVyFs8$I$cd+BmxEx$a7>gfXW42OgwW1S5nwC-*Vxz;w!hr} z=#*;A=)qBw4Ix(L#EJEMf2K^AvRkLY?^C87nkeJ$Opj))xqRa;mxAO*Mmmm$T}DjW zJQ`#pWT&)X+H@z8^=L9gW0LI6le6|DAFxbo8MA3(jl0o9gESi!Z=6$BwpGH%u&t9! zMG4kv&$(ecv>6R#s3F4wHcwM+!12tm;tIv-=p=3=8JPs9gg616qc?m7VT*Z3QFe5V z#-Zh|2|29KImcBYC)vdzNyIfR)!4y@8HTzz17s+a%F3QfLQFzHdKlxKFojDC#B$g_ z>Y_yF-JTpEAIwnf_Vl4taV&dmg)Ztz(L32QVe_~YIFvU4iyz} zLd_Op>(b*8meDhXLs2LOD8QWv8}23jL?0$aDc!TGOHJ|Q_D*YK`&zwTe@g5a{WJ<) zun`826UvNEnz9>5`*NVzWwpnM0~u`DZWIQW^R5kAx+!Zr+pS;)*~LXQcvNKw%VJ}p z5j4&Qi|6ISLi5~G&^Xsmd%>R=+( z6Uu5^8(XU*dl%}B+6q#d5~zTy2TQ?~52P`2{DN%vl(Cd8@3q!~rI8$K(;*YA`pd2< zm-eHq(y1v`r?wO4M#aIJHUry~N$Oth^5O+q{9Hbj$P>$QVg5qx>%lrDWD46Kk4&a; zFdFp->x(tqtUBpZ97bKj-P+e78RTzyyRQ4&)pOHx%X7!G1==8fMZlcoj3IxN}Js`%GJ+Tz-5h+s~uU#72cSd=-yx?|KdO`7Wl8 zoVI+iaSugJqZqR3L7|Lu<~~^jH9?u7&{ozT;&f5$79X1^)^whs@MI{;G*F5w9Ij0c zo~wV=u=6I5@d}ee)ifKq>zORBfxhZfJSkT=V9NSBmGLks@9Anwtp9tJ`|2 zSmBueLuOL5m~fp`ijCb`rE^LF)tT-aqtem*$+d029Ly-{Q<0pLB4s=(4JL=N!Vrn0 z#Xy(JV$Lt6?4yWLp-^?vBWU~$D6Vos z@kNgb-QvxqYQH?1{29GZ2P$(%!HMH2$ChHL6OJo`{!r{fq@db%3?Be?8uK=7r zBk|4Gi^y>H7M{t7KMS(5O2ZR=2D+8b*}P, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-08 11:23+0100\n" +"Last-Translator: F Wolff \n" +"Language-Team: translate-discuss-af@lists.sourceforge.net\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: af\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.5.2\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fout met oopmaak van die gids '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fout met lees van lêer '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Die lêer \"%s\" is te groot" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Kon nie lees vanaf lêer '%s' nie: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Kon nie lêer '%s' oopmaak nie: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Kon nie lêer '%s' skep nie: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KG" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MG" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GG" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TG" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PG" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EG" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Kon nie simboliese skakel '%s' lees nie: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Simboliese skakels word nie ondersteun nie" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is nie 'n geldige naam nie " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is nie 'n geldige naam nie: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fout op lyn %d: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "Kon nie '%-.*s' ontleed nie. Dit moes 'n getal in 'n karakter" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Gebruik:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[KEUSE...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Hulpkeuses:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Wys hulpkeuses" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Wys alle hulpkeuses" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Toepassingkeuses:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nie 'n gewone lêer nie" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Lêer is leeg" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ongeldige groepnaam: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Onbekende tipe" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s-lêertipe" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s-tipe" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kan nie oor 'n gids kopieer nie" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kan nie 'n gids oor 'n gids kopieer nie" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Teiken lêer bestaan" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kan nie gids rekursief kopieer nie" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Kan nie spesiale lêer kopieer nie" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ongeldige waarde vir simboliese skakel gegee" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Lêernaam kan nie '%c' bevat nie" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Geen toepassing is geregistreer om hierdie lêer te hanteer nie" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kan nie wortelgids hernoem nie" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fout met hernoem van lêer: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Kan nie lêer hernoem nie - lêernaam bestaan reeds" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ongeldige lêernaam" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Fout met oopmaak van lêer: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kan nie gids open nie" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Fout met skrap van lêer: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fout met skep van gids: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Lêerstelsel ondersteun nie simboliese skakels nie" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fout met maak van simboliese skakel: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Fout met skuif van lêer: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kan nie 'n gids oor 'n gids skuif nie" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Kon nie rugsteunlêer skep nie" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fout met skrap van teikenlêer: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ongeldige enkodering)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fout met lees vanaf lêer: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Fout met toemaak van lêer: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fout met skryf na lêer: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fout met oopmaak van lêer '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Teikenlêer is 'n gids" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Teikenlêer is nie 'n gewone lêer nie" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Die lêer is ekstern gewysig" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Onvoldoende geheue" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Interne fout: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "" diff --git a/po/am.gmo b/po/am.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7b8467ff6e89863a59bf301b5812253153ba75fa GIT binary patch literal 653 zcmZvZ&ubGw6vwApFF6%29`x`oB?p6<3lPN-V*;XT1 zwydd6L@K+`*VZX9Ko<8AUbdU10;B~w7qCO4Ut`DdW|tqKu~MrDl2jhUQKS8$dGNf_ z#-TQjw`?N2d}owc9_t7yhX*m=C2vO^d`~!xU^NH>9@O~iI)q`gR_DQ55Rj0!@kADr zuXH2|LLRO|P>*U4?>F}1$}?ddkBv|^6;7K7o?sPEVc%%wBpTS)Bh@Y4U^CSnk)nN+ zAfB#hlWbGBN=70<9-|mU@OaP{Mt1(EY&Bbr>yw5nL1mX5P?7n&AsxcuTlZj?3aK`r zLsKlet&!{T`n9h3$sQWsP#s-deFXJm=_<@mCw}tNXVdbM{rC)gmig>6t$cp&^BL_g zeD=ZTzkGfHetcfkr{9bB@{=EaJS&tRr+)GqO3izpf1`=>wl7!TW, 2002. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2003-01-16 08:39+EDT\n" +"Last-Translator: Ge'ez Frontier Foundation \n" +"Language-Team: Amharic \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s'ን ተቀብሏል" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "የማይሰራ የUTF-8 ጽሑፍ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "የማይሰራ የUTF-8 ጽሑፍ" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "የማይሰራ የUTF-8 ጽሑፍ" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#~ msgid "Socket error" +#~ msgstr "የሶከት ስህተት" diff --git a/po/ar.gmo b/po/ar.gmo new file mode 100644 index 0000000000000000000000000000000000000000..d95d62452e176ec1c573db82cd244b8f5a96d72b GIT binary patch literal 40092 zcmd6w37p+kdH4T_N&!)15e3x0V8{eAAt4AM3nV~*um(r~YcRbtb7yj8=HB7n8A6~4 z*%vDqajjB|5fZ`@LI?;}>)u*@tzD@1*48SezP?DS*6Q2M+VAgq&VRdeCmE>k=kt!9 z{Qk>Xp7U(yIm`d@-6LN9!2_ZLqPYh|(ex;a4nHJ{c60rcBO{(h(c{NP(ZS#!fZrqO zZ|d<;#OtUVJQQ329t2(nz8zc&E(dpkCGa(GjG`&vjiAbX3_MBi!K1*x0#5;d1a^VP zyeW!ea6Wh(SOQN3Zv)=|-V2@veg-@X{3q}&VAq?Y=ydR6@Ko@2@O9uWQ02c0s=epI z82l9|x?*nB&c)zVupgWR-VKV*r@#}y?}5sHAdT_=sGEOy6kP!>0EfZf10MsaI=YfV zbHE$Hlfj33IyQolC$HSO+fv{}NPxj(e;3cQH7d`?a9j`y4nQ6tQY& z0eCHVTfk?)8QgbMx%jahi<4a1nUQZYHR9F9D?&L*afSNY>~9Q2G7>M75$Hfy#F<$|gCV2#TJ?pz0X}mH$pq z`R)fLug`OU5RpXy9JyDBFgAXpq@Vu&IDfv@u*UC zF{t{hp!oAXa2EJ9sP=vaimq;yhN`2hLCI+isQe!VRsKuhVcgUhE*MLW0lzM&w zsP?9VqGt&xy|@*W3;7r*`kw$%k?6UAhe53F&j8ila!}F$@>ma`tWfO(xazA_4fsE33wbvaRE3C&I6wWF9m-N zim&IM5%>s-zW0IZ&!eE)`!1+{9C)Vd?Nm^DbpOL-2C&ZDe{BTnFBwdz{2E;G+Tm7?fPU2T~+@Cn!FD6cpe72vk4+9fZ{Ah;zKX z%R$*=4OIRQgW}&;K+*kU@JR58`QF}1V9fm`py(O|MbGV^>bVz0wW6E}J5 z=-2~J0{<42UL3f{?P~@oe%}B}9=CzYcMlkYUjo(N=Rmdh&!F`0)faod1)$m+08avM z2SxY&p!)T7a5DHqP=4}om@YZRp!8)4h^j|J;3?pPU>EppP;|-I#m^%^<)03Uo<*SA zy%tn^HBj__0F1%M13nY*7ohavl zI0#Nz97QAGhd|lqp;x**F95}#5~%)v0GtKx2IXg-2T|21zRJt>fv0l+iGY6!LPGQ_ z@VCIru6DjY0>b*}8BqH9W}LOk^#%L@cp~>-21U;g!DZlyOYzy@9Uv@?z69bjqSsvG zan$9Y`29Xm`u!9rJ$fFD!B<@yMUWD8gU^9?fK$Nob^iP=Q0+YnE&$*7cGr{Tp!#_$ zD0=@8yc2x+ZxTC!cY~tmm!SH)=p7!veHbir|6`CM(Na1ADbX%)6Zp#O@ipLG;C%3P z@5DEN*MjQT-f;gfp!jvwa;Gc2-vfpz0{t^_weiHDglJjX6*v<1>LFv^4ASNGu z6Fdbxs>jEx`QQoM-v-VAe;<@S{W++5e--Xe>~%RU22bbt9iaHU7d#RC0SF7CL;C!A z89a^q4}tT+uYuzCAu#1+@O1E8a5;Da_(@Q9_Z4t1_yQ=tP3iY`*MjnodqC;ov!Lia zZouWUEuQ|CLJA#FlU4B1V#5pL6!eTzysgq z@ycva@2>#O1Z6*oA)F9elu5EP$20qzCA1ug_PV0;&Y-vFgI#|*iDE`u|< zzc<`J14{p2TlMj$3ab3)z1^2grYVS`1{zl!$^$S4h!+XIuf?ot<@O$87@PLNn6mSyv zSBCqQpz?nLJQMsZcpCU~a1q!w;(ApFmvH|fa54BJ@OQwuqr@KI*Fabw&AExO0=yqo z`Kc>izitBObN>{0E%@)C+PUgxzh4ik{=WrZ51zKl-(Lc%zwZVm-#-A)0sjL$8Ju&A z>qkF$9{2Zvmw?{~W3c*v5(+-Aa=#VS^RIxS>)_j+o(sY0+;0TW1V0T*-aiS?&$`3y{axTmJpT}QD)?DY^7u#a zMDWPfu19BrGq}GN>;^Z3djBMN7Wf@d<&R$D{apyEpIgCm!RNtC!S1!L-?xBo;r=V& z)!_dIPXXtw^KoPVyqx=c!u<;YPe7P&<@t5s1>kMq>EM^c^M3>9bN{9dUe9t6R~vm0 zd^`A4@Eq`xjqbPK14=&M0@aV>H#uLg0q1kS1(Y6r9Yh7AGd8<_*$Jw@-v;M{2W@eC zxCne5_a6aY3+@6j)#wZ1{?zxl{Vf31zonq)`4lMmJqM~kC!oxSg4cq_gT0{g-2ukn z=fnN?LGj})?{$B70eB7fYeDh#uR-bev^$;74d5}{{}FgG_;;Y_JozrixuEpsa&QiK zJNPE>GvEo}UxTNBzXT<}DerSTz64Y~4X_Jb4=w;70Y(2$0v@*2pPvj)@%mE=fKy3&w-P{Uw~(VZ~BPy_Zm?7R|UKW6raBUD*xXHJoKZ)(A>`i_54%d z0igbVL3%ambEK0U&=~>8l6W2$O{ugNhDfv5=i{B&FNUslh&*1t=(gERq z7Px}@HKf;&lE0sD@eiciN#~KiPr8w$zvZO2hVnnRC(J_weiK|xq8s)%lYFn@>JHKy z>p}(ssK-@5w)jv@zTZ9tzje?O&2cNYlu3D(O>Pf1dP4Qj>Ht&o+UBB>i=9-|Lqa z3p~iRe4PGPkzT?3e*)hI>hD6*JMGG2gntd!y94e3tE8WijtXVMEAuT4Zl>`3a3Sen z(qE9SA>BpN-`h$5Y*+rzv%u>~w}ofF(N=GX=TDHn7v4V(P9wd8G>dc)>1CwfBpprJ zlR^D0CH<#e`S|j3-YpLIbHLvqX&+!J`0wGl;E~+5Eio|udAyhOHPT_UIhmxtFOd%A`bg3@xc(#3w@9BQ>F*1qKOx?+(UYX zbWo^gUU>I60cV8g-Qd^5vp0rkk8yuKX(j0`;aSLH@BppHii@^Uwx{`D@Nq>Lp5d8=|kUW159t&;-|Csbj zu8$)<%5{Y_mvkU$3rTH&ZANvDMOpXT~L zQu6ohaPcm1S@Mv)lej($d==?sTz})E(2HOWCmm1fBArf}Pr8(J9jT8rOj<|!2!Z1*xaFD7_0i#aA=h)l^&MQ# z4%bg}Et^uEKj8WpuJzYV(zBC4mW|8u6M8nM!?Q~}JiDG}@)i1fwS&n~b!^PNdlm2W z>_MJMNA)Kg)U*H0Jv$^kyYl0%8_IWZcoxN7mFi8U!Af6TuJ+dYD%F80(WFM)Ul}Zq ztQs!s+Hmru#^kuth^w`cxDKsduDYkNazbgSC|u=H2AEljHQwoVYR)50zF~ zxt{Vsr5cy2ae1&jRIZN1)zVNonrO`PdRXgQa!8UDbbX8Wo2YV zZFD5A4VSCpS68$k?y1#o7%J6oAagxldetKDRcWwZF7>U7%QsgVBaLXm@bF-zw=`0z zRpTp$1&!I!f<~j(Tk(gzWVg2xQDby?xKwDp3#xAS6}N-`)N#6 zss7q%wJ(Z{_~P3TB^o6pnvje1g!M;ny7Y|&*4sjk{z85pg5|4_C*-b`xDCMA{Sij;Dk zdT}ND%8eUFYN2Oo-F-E*x?WltOCB*AJg~e{TaJoXtL4GvdboVBQY|lUz~AaXAZP-G zMrzB;u-iG-U#a%RIm*N1AsCc#t}`R0N?D#z5Y~^@8Q7Qw25iY8Ob@ZSYu3RHEUck-rh~29qWgafoF|WSbXwP6-J_O}5-ILxs zyR%%C>PUG2F^`*Vq&`~39?J2Bmz9UmvPIS5(UGf1kjGGTo(m_&Hw{&)WNJumB@r-E zDGg>OtenAznN{{9=<0yX7E4@mLHCR^_LpN;EzpE(VRHp)Yl-r8WTIwu~g;a&zSH%PpzYNN6h)Q2t(QGcU^ zE~T}nE=L@#%EQNqr!fL6%okTjDkH1n?zr6OEe%6qT0^N3pTymq=)78Wq*O6?HH3#i z3({W6H|ae((2!^9uh)ihO(zPV7V~~Sbx)KX9rTWx8V7Yk?pBkP31weIR(A||V2J4} zV_Fq+j6u!LUwFZy%NNE2^%_o$2GutlcCB8<&BMc5wH)`L2E8ky^Yab?iO9D#hReN` z{#Eh9o6EfzPI<5|I=|LCY6BYlMGm9Y^37yI#z?2suK`lyNBPFl(qJQQR0iNvHee#O z)HBNl=OFgnBh&wVwgB~&KB-o3ZOEuVcZch>-g2WMVe=YO=@kbiR82cQ6D(91)Az-Y zgxoX?=uXDMksfQ{6YFjGw$m%i+?hIeULc9BTZ@|@T^-UxyB-XM21ci$DP zT){9Wo*K*ZyxPB@H1;QhE_yIh860#Hy4^TdVsYx*U{?>{v>?9Cozyt>?5y4puqZ+^I&)!KS9#jNw0N$~GZ`OS#=Rm-i->t%!GV|R<=O5F&dz9Iy)I$FTe${B`Q|H&k4LMOoAZwqTPeH7cXOG; zt2(_-V}snwzEQ=(OA_ODGy;+{k2?@ZBlYgfpW!?3@W#;cex@8Y}8cE0&~SO&QS%22?_00 zrSCLkw$WI4*CviS(N3p+rOyeE6H&D>B+bI$5BJBm%J`Fzo9i8R=g$!lvx*WCeH*=4 zjY$IMG3Jd6`Raw2R;r^no1ZA(Jd&%O7{Szlr#^gU!=Ws@L(baDYPsIwxrJ5?dYT$# zGDzx2OWN2m=8Z`_o#ciBL6ihcskXL@vha?ux3^vy#_n=NjMPgFQ{*=Ggdny9(|w>B zDvh`S)XM{-gQdD$eO&`Pu~wJ>xu$t`>EBT07FD<30(E>F`G~ICXj+-Q$y85)UP7gH zA4w*W8`E6Vta9IM=0>AcvAJssQvwW#M_9uJcB!@qOBG*pRkXjjYf@uMKA#O>CJ@(x ze)C}CRx2OnvzbgdxmNx4aD@O@QJ^9v`ljhLEU@toHe)v-Zfd8dOsuDwb1~BilNu*X zEN5HilIm8J2hmwII#4eSjjd`}fxI%yvxT{m5t}R$iAdeUGpH}Aw2f6cM<7q*8alvIjpkS5 z=^Adeato_nwwRE#%hXBh37IF6;^wMH>+DHerHUNPJ205!q^if|EG%0=m`ne#GM|>C zlD@WR<>` zxpaJ>p)=u&FIOm=8CCLl1q(rivNx1jY;Vt%j4)$fC~#x&rW35=By~0>(y72{`dzNx zRH@ghQkDW~A$|%gcmu3OR?{X{GFnNZX%Ju~FM)RR9YK3hZ(o$k7PCrPN@G>K--g6! zY>7&;o#7?ZzQ_r5$S!v26(S2OLU!jaUk2*yk1Pza*6F52xPwlV>jYvf@l4xSrN6Ff zv~b{rKW~4tv2$dWmg*wN~}{ymsNZnje*%0`NA^dWm=l=DUYmFEMV)RzS5gAD!RPp z+ZWnE^L0q5fB=nv9rt`xA~)03yqz$f$eUGVmUkNjAJsnOO4PoBcQTdsBE|-pxodU4 zc(F|r4ejL!Ve`l0lr*~JwaJmiD&j;a&t=YbszkzYy>gQU;Df9z$!vPW6Tvl(f%qs zJGZH+m_klSa7}CXVq`4YkS^Y|cPY9e346@& zGV{rv+j<}i^5sEoF<#*z;kW^d1!R0-bJaq|2-bC3uE1EB@(rU~zL}z+1iv{;Q!iS# zMZVDR1Pi9Quef^AbyPk$=yS=S3ASd~)}O_eRkn%Vvc}u+mBqqdt(H!4_7aiji59nS zSz(JI=E%lEi;bfzB_7n0cq5JDe9t{NN68N|Sv!ynqqa4fu^YWfhA?yxq~H*3OWFL7 zhm?_Gxnftf>Fna+rLXQ}Ixwl-Oap1dsQ%l1)JHJQ_lyKEuGI%P^#*fyXc+D=BIq%YdW zwE=^?9vbF`fJU(hY!8{oJU5X~!q zO)uK5VX1iuwQOfYP#|laQ9N0(?3_bmhOE@sW7B~wpPh~%nkbD9vh8h5OlJL6p~ZQ%1M0<2;eLzz(ov^6R+cIw!<9ZNvDKwqmL#@9 zNo@1Az1PY6skXbRx9OxEYHz5rYY;oBzWl2G75Zc=Hfh#uD<>%&^vk>^0xu4xP=)=m z3QAmPGcV**!xhx=$b>E3=3;$prU?rIqNR<}KzVj_jcqn+x?}oTSXWOY;RZrw5z=B| z3M40II!;M7Qz$7`A1s%u(^UTiviA?xh$mQ_>M7SJS|-W;jw==~S#-ta)22<}YQe$nbo!#+Qls2$J0((5ALtr!*RsK> z@v=)vqok!%(uNq1>|i3=R*teb-v&5zTE`;0QyrRY@JxvV&!4z{)7?2fl6G z6EY(!nK#-AnR0^?_4??r0?%5{yRiSr*RvD%5cM%N)S)krVzPC`vS%LWtsId$FV+z- zS4vTTx`(7q3ty&H3&2y)xn9s7!^Cf}Cx3Y@3fADIM*;3m+HQRvrHv)&B&;^nqw{DA!Lg5Od8PS^erC<87KyR`o{E4I zrCrmfq|d`zSQ`Gz44}6EHl^d!>rM9UJxuCN%0rt780`tZ z#%HtHF}31aHmo&?+KS8oi=GPlqVaM!R&n}(mCf3y*>{JMn7Qrh671B=!vqddV42LT zr=ox+zV$YSiW0{|h!*SNy{-F818Q|0WgU~N);oe;1_N$jh>A&ciVQcmZ04C~MqyPw zSb>(hFh?{;b6lB?)>r-b4XczlRp`OsDm+S=GfsVw8jdOU6&Q!h@&mwr1Tr*{QrIqu zaKaQ#E;_ID^=p*HG!^%FyUg%-%rSVK%0dwd~|rcX}3D z(SD+O(ykKG31{BRL+yh{$1y;iA!P6s`@A&p_6a33rca$d9XBASYjH!4L0S>Sxr&H} z*8KE78qGqppp>H=pRQI2L}((J$fo=!zXwOYK4Fd|sVEmUrPM=Vy%zgiaEO7({^I`;(ASEU-zQE?rZ$qEaxUzs+xAu!Ug9aa#dL;_q#7^3{?8M z&mA3TbT8pd)FF$nSkir-`~YJ|_xZSk+3{)9XH4&&KC}C@GvXODW}iN*d;00qr<1Y! zDokESMACfId3RR#j5FiuZ<{^+j8mr1B;Tc+GVET0tv6U}&|#GYRpOWh{gwWB;Sih7 zb4%P$E6+M}{=g7J?=+mt*%Yb{j1skWFJZHgBK1-a=dR}V)q3Z1j=HD3s@#}Xs}G!g zh|cY2y_+#@`XT4J@9kc~YWQqhRXCMZjtZykWN0if&$FG3ET2fjQFSj2AEwNXXZ2J@ z4!N%TLQX{5!M54)CFj!UU_4{mj2Y8TKV|b9 z+nht9IPPlhZ0>HYZ*6Hl7B`;;cE`;((Z^_3RxxvrliHz2l)g0j&)g0qu=V zuqC)gKU!;`+=&$>fnZyKqR(xeGM>;exGR!d8|i#&lYN;(5A|_Q+}y^4@PQ6DbY=~e ztQWNpHFxOshPb(t|G{Ufi0xAysxp?Yq2fJpYc&+@q=l}ixsxXkNgg|ll+_TpPHYwB z>zfZC3a5z@yM6Jk`3OyMr#g&&s(O+JwzSsFj+*x&kjHs-Z}Lj{b~K+%^ngltQT-+t z-n!Oi7K!yqk6Lf;g|Y{%6>GP^tgHf2Oxo3aAZo3VK2pYtKSEP`Ax>0FVNjohAFZ`C z31eK5VekfNp^8Sd`MCO=QO;}B+Ug|Vp5`M-1KZK*o!0v&)lB3}g#xPI&{`XN?wE>Y zC(g&#=JdWpemX$53FR+R2n*H)GlHazkaIs&+9yV=N~coW3GsB(R$!Vt>GPwlt+M2N zXFFGwaa4>Df-W7IeJWOB4Ew5hB_q%d=W{wYIvV zLp1gQUQWd z6&yhay2h*zUVD9b2*W7WLRSdBS8WRyIWQjEdjYA{Cm+%a_p zE0cER9Rc+`203zUsW;IO)lP~RFBFwmNX%+4)NVmm?(WxRHAp#jwC+SJ-Vbeeb^2$^eu|vdLTe+r{hKgj*CutqI470!X41hT*hZwBRFEjKI!llDt+a7a zZquT4{GkIj2wR*LYRD^aOKG=;7g-c{os9_M&1!Yy5hAI*@-FYQ zcrM?sFeg>t(Q1=H@Q&MBYnu;Z5YCI$h>oyu6EZ}5BOcm7x(5-s&*RBji9pR*%tE%r z-X3;8>i%|v+&|LaBBr}3xi6NALW3#C4o2>^5?dlEBW{faKCeMTnR)_^M~m`_+}5wls9dD z5>H^^k4>#|Szi(%iZ|pkuu6IR-OW#7*9;Us74ex}#!IseL?h=-Wc$ibY^H*A zs>8L<5|zE^8xo;+`R9Hzt_Q`1De6Z)Z|FE2(a`g>h7s9j@|YOFdO+m0nr<+aao=aH z$2Vt20vQ(?porIGixhK0mZL)2OsT+L$DI@VC%p>J3#}X4@D% z-nWQ^kGWVi8Skm!|4ICD(u)f>T0S628|awXD;%3xxS{b~6Hvx?4+l-Mkwr1vob!xc z_RwVPBdHJCigeoZz)|8PGIEMUqKo4BS z6ve~M$1s=&3Wcp93u`?<>>!J*epz2OzcU7z;iVy0L3+8|UTZ!t%D?Z-1u8QVjO*UA z^(w5_*!-nfVQ$VXo$zQ)ZlayqT;KHUDe?F`*-w$s`R1qK zv?+b23OPyaw5T3>+#FZ06JsGB&=jRmJ=DoKH%g!O#jbQsqRn_R z?Fp^ONp5fM(3DsUE;1pt$)$pe-4Oi%-eO!Wd06@+Etz;>7mVoydO+K>5W3Z-x6PdV zi}{=PQDSpU)A^xJEYUMtgH?P|bRJ2^lI1NlbB}sXA*u0fErx6PH~ZMvbT&K{SD;tp zi*0~71@<&qvsEoJCp+Wi#fWpgzwP69vB~5!;6j6K!!*J{XYvM@Q09xB1gab8&Zef# zs7*VF_Muu+6cKOPAl@a6ui9bK%~5MwDteoby4{ac#6AKnc66de_tn}C(>KLWX&j6J z*zCQn7&`|LiNn=$!fwtz@iDP+-@9s(MSJa8l(0$R0Zs(|6l+T#PmoKgOt;||VU%WO ziu+YuCKRNU>QldeaGaN|=|r$G?Z>1>mlU>9H++5U^cRaalgJ|1pj(mFRLrQd_QS`> z`>(-T)v~-B0??tEmr!q7gwGQAD!NDrA)lIoZ;Hgi8l|Q+xJj8D@0015lv+DEbeh#R zTRq~vmhXa!XM14D99rR|FNJd93$4k=%fx<61J#JWT_%_BI9jW0rDMq0T7`t5*TL?X7fhVgWY&I22wwKw}+8n_Froua+ z!sab;_RYC8ON(`3Q6)KrVFcyk_hPQNOCq3$Xyy}?Mx-oj`KtML>f6bg0d2MDiMX@h ziZo>GZa(26qw2K?Ogkf9Eew5$^@T6n{|BY{+@0kVhwX`rNRZTV<5|+EU=2+xb6y{1vpTG-_ky=?!8uF!+9$gUR_&dRSU4%~00d9Ef^Cf!I5J84jwaD_CSbV21( z1{ZYB-sEC49YEO9QV^Cho}OS@)Mo3_JE>Hw4!f0U+Dj!Si3cCWEUDkxoM?-gI6AWy z0c$$h#&C5s*2;vxNVLiyOIjA1q9QUf+nU$L`vgVj6BnxsRZwl-G1V5c@<z(An z;KfUg!#eLD41-}+eA*oiekIO zL1|Nnqa8tsEU>eqO^G8|t&Qyo$AF0!Vm!s4dX$m{m8QXJoUsC3RAj7vF?>i7*s?;e zc14y;XEU@kfSrbATlbWxS=vUb49Gy!p)FLnyR{YH6k-B9Wae%H6;NaHr1XpnMOeuU zJe1x8D`|5Zdf7}@=VQEtQ_5a9rrpY)@su^Cjdw2I6vJuTMm;kqsbioe6SV9BIS|`s zZ>hZ#rO+16B8XCmOB6u7Y42@lA!84YTjoG?V39zkfoa25O^2pE+;l1vbxepgv4r6? zRJqLtsI7tHdDRrhY!TDE5!J#Swp@9}L`nZjHW4P!%LL9&1e9dX={LVaeG+F6F>K6FR7`HV{>~*cBw`uF`Jri%t&88Uf*;MF*X-g#?Sf?9`j=vHDb@A@fTl5 zC@8M^feP!8<~>q}9kG9M(wPmYiS_|jCz)JNecp@C=XfTaupJb_{%BYN<&_GeMBC>=77hVA8 ztqGn5c)4vQHwR|i5lcPE4{k_966Lh&-BWIkTRE2>X7N#?Qb`B)@Bmen>J;V}^x-a3 zG$WO2Tbn(X52rQfQWuCu2f};#`%wg#pqt(6^53;=b$<{u; zL-m~~;x3!8zBtAmH6=_8Hd65q9+opX4*P+h*xuUdwug!)b>M9&Ylu^-T#bmsa znK0Noi%?M+8Y0)eoQ$n?$E04qs}U=$oS(N+y;H=FF%_fpJ`PhL8UFa{Z@emSgH+;; zTm8wAr0tZ@C>An6W?R=7H?&UnG=m+)ZfQPY^r+D+o|B(wFP8H}?NiYZwP48VT3b~? z!|)#(K4g6DIrPH3hEpInwZ6$}gValoit(;#A0SXPj1W4&`Xrm({+lOw0JL*!OfGmx zD<+^+hZUuzTYuA)lQA^4Q=PYmgj1m>wy}{!OXg$AZ1Z9*YL4ZkekMhI z%KDOL{8(N{(pV#;19xG&I!DAvlpDj>nj~33)+oV2Bk}D%7`WM&mBjGYMz2JpbEn}O z4w&vH=iIYQ5Q^2?Olf1{&uPS6mw3>;59a}sTkA}?<5Uwy=T81R$9)(x4uO*GK0avC zI+Blsg}&x?w#TUe<}kP#2^jH4mg$Yz$pNHXsm$iX7@7RtZ%$ZijB&&Tbo*8MBf&ix%ikDW4<80^q8U83$HF<%fS zdsv&Pvzl9jiRinNaf01^Xq75@YBc!@FpT1JtCsx;yc0oI`#YZnjQ{&Jxa9NPFEJ(zNouF4*xK7~rGcRB$`7;Z5c-V6R665;w7s zyK3hjne1T%m73Y^!hkiAgsVH*5VcX?gGc?u3D2mXzM)8>&c_=L22!%a$eIl3*@wBb zq7f?jwu~DtsgJ=mC0t{<%@yL-S_y|p3?`_tpyA$j`n}sG;+DNFzHZV756Z~uo2v}5 z6g^493-wB!H+5B$>Vjf7*kmQS5Ow#;Ds5Wh-70pPE+n(&F+V<(bt2!ejAWyHU?e@I ze9|3XX8bbrdJm;>~BsI3+ z7ebKK;d?8H+Yr&LERzPXTxw;>ARK35Cz2Xi-IKCt{co+aa9eQt`sB+U0`4!{@8%fY zL<>9w4~VqYEQ%^RFdgc$&#HIw6#jXe*{OzSJ-TwX3s zDN#N+XN-2u#5^A6$-}A3Hswfu1}R8B$%Kg0!7~g%TBi?#NBTtC=(DLdj;rVNm-ZQ1 zitUTZ9?GPOjxZHt28w3qcCPclslF>RZZNT!(RZM?@*C#q$NP-cB}cX#Oe}GFu`_q;EEaTZGC^dvPB>JAnJ?}TM;x70xZ^|EB2F7yunjRi`8+> z0F%Q~iLIu3DkmYAWNYHeZ9%M&i(vGiO=O#`Qc5wVkYk5ez<4W}wX1>5&c51;Y1md2 zI(9h6eW@Elek?+?FKPfZ5mS;OySdxx-_-mxYD3@`8ih|92#Je$#GBlb1BEoJqE~U# zR{^+2l;-)<&?jo%XY)V}UNV}5KdCx*;y{v1Qle!Vu=NI8s-wQ3P-0^?&L!UyC;XHd z(Km#IwnL{TzK~#qHSf3nu<%8%_h)bT{~Q&~?U7Z5h<)7!eYKNGt6Ljk6)_cDRX1tF z+;ZktRf}^u92bS5!6I=7VKB}%1B{VPAFhd_gFwa!eKyiZ6qahR7M4znB*Q86+`G!Z z_XZ**`mx$7Nq5-`4d;7Xo8#m+wpvLmi5SU6wW%oWmfkbNmm+zLbx%RldN6mOd!kL3FKM4-#p9c1X5L0tWT9C3E}`B7xdyj zIwzZcDCBEt$CT*PbDGqAx{6@fTY%|YOw_L^_8jXQ#RWC3NJ9b)${YfB^i6Nk7P-5p z^P1pnWwfMPI1V9%2de2wF4skia{tv^{miHR2ahKWj`AC*`i~mh?+)@?UG~GVI;t8? znl_`KU&V5~EZ~LbhX072{a7FWC9z5VBW&R8c+4w1u9g3<%4I(**x~p1SToXp8ik+m zvf7x?=Zhx)VMKn2Zjj$=wf~@y{h+v=t4#|Ij#{IO!Y^R@@2Tl$5!3(Z#!dD+%xX$B z>ocs}qMuxdba`(q)|e=^@Lm%&b5&9X{nC#K!RPB4vs!DXB_*6|t@UjWnh#|UP%W)U zrNcS8pzkVRs7cL@#MnA+PCL^5>>YQi6Cp|t+sZr5+iy`cBe$Phh?TodJ~5IfO=i$& zjh{|PxKgMPFQ%^R5Dg`KCll*nP@~5, 2001,2002. +# Arafat Medini , 2003. +# Djihed Afifi , 2006, 2007. +# Khaled Hosny , 2006, 2007, 2008. +# Anas Afif Emad , 2008. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-09-17 05:06+0300\n" +"Last-Translator: Anas Afif Emad \n" +"Language-Team: Arabic \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "صفة غير متوقّعة '%s' للعنصر '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "الصفة '%s' للعنصر '%s' غير موجودة" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "وسْم غير متوقع '%s'، توقّعت الوسْم '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "وسْم غير متوقّع '%s' داخل '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "لا يوجد ملف علامات سليم في أدلّة البيانات" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "توجد بالفعل علامة للمسار '%s'" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "لا توجد علامة للمسار '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "لم يعرّف نوع MIME في علامة المسار '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "لم يعرف علم خاص في العلامات للمسار '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "لم تحدد أي مجموعات في علامة '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "لم يسجل أي تطبيق بالاسم '%s' علامة '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "فشل تمديد سطر exec '%s' بالمسار '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "التحويل من مجموعة المحارف '%s' إلى '%s' غير مدعوم" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "تعذّر فتح المُحوِّل من '%s' إلى '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "سلسلة بايتات غير سليمة في دخْل التحويل" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "خطأ أثناء التحويل: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "تتابع محارف جزئي عند نهاية الدخْل" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "تعذّر تحويل fallback '%s' إلى مجموعة المحارف '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "المسار '%s' ليس مسارا مطلقا باستخدام المخطط \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ملف المسار المحلي '%s' لا يمكن أن يحتوي على '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "المسار '%s' غير سليم" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "اسم مستضيف المسار '%s' غير سليم" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "المسار '%s' يحتوي على محارف خلوص غير سليمة " + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "اسم المسار '%s' ليس مسارا كاملا" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "اسم المستضيف غير سليم" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "خطأ أثناء فتح الدليل '%s'‏: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "تعذّر تحصيص %Ilu بايتات لقرائة الملف \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "خطأ عند قراءة الملف '%s'‏: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "الملف \"%s\" كبير جدا" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "فشلت القراءة من الملف '%s'‏: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "فشل فتح الملف '%s'‏: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "فشلت في أخذ صفات الملف '%s': فشل fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "فشل فتح الملف '%s': فشل fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "فشل إعادة تسمية الملف '%s' إلى '%s': فشل g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "فشل إنشاء الملف '%s'‏: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "فشل فتح الملف '%s' للكتابة: فشل fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "فشلت في كتابة الملف '%s': فشل fwrite(): %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "فشلت في كتابة الملف '%s': فشل fwrite(): %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "فشلت في كتابة الملف '%s': فشل fwrite(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "فشلت في غلق الملف '%s': فشل fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "لا يمكن حذف الملف الموجود مسبقا '%s': فشل g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "القالب '%s' غير سليم، لا يجب أن يحتوي على '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "لا يحتوي القالب '%s' على XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%I.1f ك.بايت" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%I.1f م.بايت" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%I.1f ج.بايت" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%I.1f ك.بايت" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%I.1f ك.بايت" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%I.1f ك.بايت" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "فشلت قراءة الوصلة الرمزية '%s'‏: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "الوصلات الرمزية غير مدعومة" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "تعذّر فتح المُحوِّل من '%s' إلى '%s'‏: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "لا يمكن عمل قراءة خام في g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "بيانات غير مُحوّلة باقية في حاجز القراءة الخلفي" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "تنتهي القناة عند محرف جزئي" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "لا يمكن عمل قراءة خام في g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "فشل فتح الملف '%s': فشل open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "فشل في مقابلة الملف '%s'‏: mmap() فشل: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "خطأ في السطر %Id الرمز %Id: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "نص مرمّز بـ UTF-8 غير سليم - غير سليم '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "خطأ في السطر %Id‏: ‎%s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"فشل في تحليل '%-.*s'، والتي كان لابد من كتبتها بالأرقام داخل مرجع محرف " +"(ê كمثال) - ربما الرقم كبير جدًا" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"مرجع المحرف لم ينته بفاصلة منقوطة؛ الأرجح أنك استخدمت علامة امبارساند دون أن " +"تنوي بدء كيان - تخطا العلامت عن طريق اعتبارها &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "مرجع المحرف '%-.*s' لا يقوم بترميز محرف مسموح به" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "رُؤي كيان فارغ '&;'، الكيانات السليمة هي:& " < > ' " + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "اسم الكيان '%s' غير معروف" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"اسم الكيان لم ينته بفاصلة منقوطة؛ الأرجح أنك استخدمت علامة & دون أن تنوي بدء " +"كيان - تخطى العلامة عن طريق اعتبارها &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "يجب أن يبدأ المستند بعنصر ( مثلا)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' محرف غير سليم بعد المحرف '<'؛ ربما لا يبدأ هذا المحرف اسم عنصر" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "محرف غريب '%s'، توقعت محرف '>' لإنهاء بداية وسم العنصر '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "محرف غريب '%s'، توقعت '=' بعد اسم الصفة '%s' للعنصر '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"محرف غريب '%s'، توقعت المحرف '>' أو '/' لإنهاء علامة البداية للعنصر '%s'، أو " +"بشكل اختياري صفة؛ ربما استخدمت محرفًا غير صالح في اسم صفة" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"محرف غريب '%s'، توقعت علامة اقتباس مفتوحة بعد علامة التساوي عند إعطاء قيمة " +"من الصفة '%s' للعنصر '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' محرف غير صالح بعد اغلاق اسم العنصر '%s'؛ المحرف المسموح به هو '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "العنصر '%s' كان مغلقا، لا عنصر مفتوح حاليا" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "العنصر '%s' كان مغلقا، لكن العنصر المفتوح حاليا هو '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "المستند كان فارغا أو كان يحتوي فقط على مساحات فارغة" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "انتهى المستند بشكل غير متوقع بعد قوس بزاوية ‪'<'‬" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"انتهى المستند بشكل غير متوقع مع عناصر لا زالت مفتوحة - '%s' كان آخر عنصر " +"مفتوح" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"انتهى المستند بشكل غير متوقع، توقعت رؤية قوس ذا زاوية لينهي العلامة‪<%s/>‬" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "انتهى المستند بشكل غير متوقع داخل اسم عنصر" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "انتهى المستند بشكل غير متوقع داخل اسم صفة" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "انتهى المستند بشكل غير متوقع بعد علامة فتح عنصر." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"انتهى المستند بشكل غير متوقع بعد علامة التساوي اثر اسم صفة؛ لا توجد قيمة " +"للصفة" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "انتهى المستند بشكل غير متوقع وهو داخلَ قيمة صفة" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "انتهى المستند بشكل غير متوقع داخل علامة انهاء للعنصر '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "انتهى المستند بشكل غير متوقع داخل تعليق أو تعليمات معالجة" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "كائن تالف" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "خطأ داخلي أو كائن تالف" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "نفذت الذّاكرة" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "وُصِلَ للحد المسموح به من أمكنة الرجوع للوراء" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "المثال يحتوي على عناصر لا تحتمل التطابق الجزئي" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "خطأ داخلي" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "المراجع الرجعية غير مدعومة كشرط للتطابق الجزئي" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "وُصِلَ للحد المسموح به من التواتر" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "وُصِلَ للحد المسموح به لمساحة العمل بالسلاسل الجزئية الفارغة" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ائتلاف غير صحيح لأعلمة السطر الجديد" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "خطأ مجهول" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ في نهاية النمط" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "‏\\c في نهاية النمط" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "رمز غير معروف بعد \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "خلوصات تغيير المحارف (\\l, \\L, \\u, \\U) غير مسموح بها هنا" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "الأعداد خارج التغطية في المكمم {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "العدد كبير جدا في المكمم {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "الرمز ] غير موجود" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "سلسلة غير سليمة" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "مجال خارج التغطية في نوع الرموز" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "لا شيئ للإعادة" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "رمز غير معروف بعد (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "رمز غير معروف بعد (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "رمز غير معروف بعد (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "أصناف POSIX المسماة مدعومة فقط داخل صنف" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "القوس الغالق غير موجود )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") بلا قوس فاتح (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "‏(?R أو (?[+-] أرقام يجب أن تتبع ب )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "إشارة لقالب داخلي غير موجود" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "الرمز ) غير موجود بعد التعليق" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "قالب كبير جدًّا" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "فشل تلقي الذاكرة" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "مصادقة العثور الخلفي ليست بحجم واحد" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "اسم أو عدد غير صحيح بعد (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "المجموعة الشرطية تحتوي على أكثر من فرعين" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "مصادقة منتظرة بعد (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "اسم نوع POSIX غير معروف" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "عناصر الترتيب POSIX غير مدعومة" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "قيمة الرمز في سلسلة \\x{...} كبيرة جدًا" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "شرط غير صحيح (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "‏\\C غير مسموحة له عند العثور الخلفي" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "الوظيفة التكرارية يمكن أن تستمر إلى ما لا نهاية" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "منهي غير موجود في اسم القالب الداخلي" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "هناك قالبان داخليان لهما نفس الاسم" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "سلسلة \\P أو \\p سيئة التركيب" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "اسم خاصية غير معروفة بعد \\P أو \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "اسم القالب الداخلي كبير جدا" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "هناك عدد كبير جدا من اسماء القوالب الداخلية (الأقصى 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "القيمة الثمانية أكبر من \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "مجموعة DEFINE تحتوي على أكثر من فرع واحد" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "إعادة مجموعة DEFINE غير مسموحة" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "خيارات NEWLINE غير صحيحة " + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "‏\\g غير متبوعة باسم قوس أو عدد بقوس" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "إعادة غير متوقعة" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "فيضان الرموز" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "خطأ تركيب مساحة العمل" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "القالب الداخلى المراقب مسبقا غير موجود" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "خطأ عند تطابق جملة المقارنة %s: ‏%s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "تم تجميع مكتبة PCRE من دون دعم UTF8 " + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "تم تجميع مكتبة PCRE من دون دعم خصائص UTF8 " + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "خطأ عند تجميع جملة المقارنة %s عند المحرف %Id: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "خطأ عند تحسين جملة المقارنة %s: ‏%s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "رقم من نظام 16 أو '}' متوقع" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "رقم من نظام 16 متوقع" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "'<' غير موجود في المرجع الرمزي" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "مرجع كيان غير مكتمل" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "مرجع رمزي معدوم الطول" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "رقم متوقع" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "مرجع كيان غير صحيح" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "نتيجة نهائية '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "سلسلة خروج غير معروفة" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "خطأ عند قراءة نص الإستبدال \"%s\" عند المحرف %Ilu: ‏%s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "النص المقتبس لا يبدأ بعلامة اقتباس" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "علامة اقتباس غير مطابقة في سطر الأوامر أو نص منقول من الصدفة" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "انتهى النص بعد المحرف '\\' (النص كان '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "انتهى النص قبل ايجاد المُقتَبَس لـ%c (النص كان '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "كان النص فارغا (أو كان يحتوي على فراغ أبيض)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "فشلت قراءة البيانات من العملية الإبنة" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "فشل عمل أنبوب للاتصال بالعملية الإبنة (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "فشلت القراءة من الأنبوب الإبن (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "فشل التغيير إلى الدليل '%s' ‏(%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "فشل تنفيذ العملية الإبنة (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "اسم برنامج غير صحيح: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "سلسلة غير صالحة في متجه الأحجية عند %Id: ‏%s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "سلسلة غير صالحة في البيئة: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "دليل عمل غير سليم: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "فشل تنفيذ البرنامج المساعد (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "خطأ غير متوقع في g_io_channel_win32_poll() أثناء القراءة من عملية ابنة" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "فشلت قراءة البيانات من العملية الإبنة (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "خطأ غير متوقع في select() أثناء قراءة البيانات من العملية الإبنة (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "خطأ غير متوقع في waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "فشل تشعيب (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "فشل تنفيذ العملية الإبنة \"%s\" ‏(%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "فشل اعادة توجيه الخرْج أو الدخْل للعملية الإبنة (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "فشل تشعيب العملية الإبنة (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "خطأ غير معروف أثناء تنفيذ العملية الإبنة \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "فشلت قراءة بيانات كافية من أنبوب child pid ‏(%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "محرف خارج حدود UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "تتابع غير سليم في دخْل التحويل" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "محرف خارج حدود UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "الاستخدام:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "خيارات المساعدة:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "اعرض خيارات المساعدة" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "اعرض كل خيارات المساعدة" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "خيارات التطبيق:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "تعذّر تحليل قيمة العدد الصحيح '%s' ل %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "قيمة الرقم الصحيح '%s' ل %s خارج المجال" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "تعذّر تحليل القيمة المزدوجة '%s' ل %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "القيمة المزدوجة '%s' ل %s خارج المجال" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "خطأ أثناء تحليل الخيار %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "معامل %s مفقود" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "خيار مجهول %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "لا يمكن إيجاد ملف مفتاح صحيح في دلائل البحث" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ليس ملفا اعتياديا" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "الملف فارغ" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ملف المفتاح يحتوي على سطر '%s' والذي ليس زوج قيمة مفاتيح ، مجموعة ، أو تعليق" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "اسم مجموعة غير صحيح: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "لا يبدأ ملف المفتاح بمجموعة" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "اسم مفتاح غير صحيح: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "يحتوي ملف المفتاع على ترميز غير مدعوم '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "لا يحتوي ملف المفتاح على المجموعة '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "لا يحتوي ملف المفتاح على المفتاح '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "يحتوي ملف المفتاح على المفتاح '%s' ذو القيمة '%s' التي ليست UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "ملف المفتاح يحتوي على مفتاح '%s' والذي لديه قيمة لايمكن تفسيرها." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ملف المفتاح يحتوي على مفتاح '%s' والذي لديه قيمة لايمكن تفسيرها." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"ملف المفتاح يحتوي على مفتاح '%s'في المجموعة '%s'والتي لديها قيمة لايمكن " +"تفسيرها." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "لا يحتوي ملف المفتاح على مفتاح '%s' في المجموعة '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "ملف المفتاح يحتوي على محرف الخلوص في آخر السطر" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ملف المفتاح يحتوي على تتابع خلوص غير صالح '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "لا يمكن تفسير القيمة '%s' كعدد." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "قيمة عدد صحيح '%s' خارج المدى" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "لا يمكن تفسير القيمة '%s' كعدد عشري." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "لا يمكن تفسير القيمة '%s' كعدد منطقي." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "مُرِّرت قيمة كبيرة جدّا إلى %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "سبق إغلاق الدَفق " + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "أُلغيت العملية " + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "سلسلة بايتات غير سليمة في دخْل التحويل" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "عمليّة غير مدعومة" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "نوع مجهول" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "نوع ملفّ %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "نوع %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "نهاية دَفق غير متوقّعة وغير متوقعة " + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "غير مسمّى" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ملف سطح المكتب لم يحدد الحقل التنفيدي" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "تعذّر إيجاد الطرفية المطلوبة للتطبيق" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "تعذّر إنشاء مجلد التهيئة الخاص بتطبيق المستخدم %s: ‏%s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "لا يمكن إنشاء مجلد التهيئة MIME %s للمستخدم: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "لا يمكن إنشاء الملف %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "تعريف مخصص لِ %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "محرك الأقراص لا ينفذ القذف" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "محرك الأقراص لا ينفذ القذف" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "محرك الأقراص لا ينفذ جسّ الوسائط" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "محرك الأقراص لا ينفذ القذف" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "محرك الأقراص لا ينفذ القذف" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "عمليّة غير مدعومة" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "الوصل الحاوي غير موجود" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "لا يمكنك نقل دليل على دليل" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "لا يمكنك نسخ دليل على دليل" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "الملف الهدف موجود مسبّقا" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr " لا يمكنك النسخ التكراري للدليل " + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "الوصلات الرمزية غير مدعومة" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "خطأ عند فتح الملف: %s" + +#: gio/gfile.c:2906 +#, fuzzy +msgid "Can't copy special file" +msgstr "لا يمكنك نقل دليل على دليل" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr " قيمة الوصلة الرمزية المُعطاة غير سليمة" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "المهملات غير مدعومة" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "لا يمكن لأسماء الملفات أن تحتوي على '%c' " + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "الجهاز لا ينفذ الوَصل" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "لم يسجل أي تطبيق كمعالج لهذا الملف" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "المُعدِّد مغلق" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "مُعدد الملف له عملية عالقة" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "مُعدد الملف سبق إغلاقه" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "الدَفق لا يدعم query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "عملية السعي البحث غير مُدعمة على الدَفق" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "البَتْرُ غير مسموح به على دَفق الإدخال" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "البَتْرُ غير مدعم على الدَفق" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "دَفق الإدخال لا يُنَفذ القراءة" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr " للدَفق عملية عالقة" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "تعذّر ايجاد نوع المراقبة للدليل المحلي الافتراضي " + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "اسم ملف غير صالح %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "خطأ أثناء تلقي معلومات نظام الملفات: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr " لا يمكنك إعادة تسمية الدليل الجذري " + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "خطأ عند إعادة تسمية الملف: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "لا يمكنك إعادة تسمية الملف، اسم الملف موجود بالفعل" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "اسم ملف غير صالح" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "خطأ عند فتح الملف: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "لا يمكن فتح الدّليل" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "خطأ عند حذف الملف: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "خطأ عند ارسال الملف للمهملات: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "تعذّر إنشاء مجلد سلة المهملات %s: ‏%s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "تعذّر إيجاد دليل المستوى الأعلى للمهملات" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "تعذّر ايجاد أو إنشاء دليل المهملات" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "تعذّر إنشاء ملف المُهْملات: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "تعذّر نقل الملف: %s إلى المهملات " + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "خطأ أثناء إنشاء الدليل: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "فشلت قراءة الوصلة الرمزية '%s'‏: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "خطأ أثناء تشكيل الوصلة الرمزية: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "خطأ عندنقل الملف: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "لا يمكنك نقل دليل على دليل" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "فشل إنشاء ملف النسخة الاحتياطية" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "خطأ في إزالة الملف الهدف: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "النقل بين الوصلات غير مدعوم" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "قيمة الخاصية لا بد أن تكون غير منعدمة" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "نوع الخاصية غير سليم ( يُفترض أن يكون مقطعا )" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "اسم غير سليم للخاصية الممتدة" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "خطأ عند تعيين الخاصية الممتدة '%s'‏: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "خطأ عند تناول الملف '%s'‏: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ترميز غير سليم)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "خطأ فى تناول واصف الملف: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "نوع الخاصية غير سليم ( يُفترض uint32 )" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "نوع الخاصية غير سليم ( يُفترض uint64 )" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "نوع الخاصية غير سليم ( يُنتضر مقطع بايت )" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "خطأ تعيين الأذونات: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "خطأ تعيين الأذونات: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "خطأ تعيين المالك: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "يجب أن يكون فهرس القائمة غير سلبي" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "خطأ أثناء تعيين الوصلة الرمزية: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "خطأ في تعيين الوصلة الرمزية: الملف ليس وصلة رمزية" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "خطأ تعيين الأذونات: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "يجب ألا يكون سياق SELinux صفرا" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "خطأ في ضبط سياق SELinux: ‏%s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "‏SELinux ليس مفعلا على هذا النظام" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "تعيين الصفة %s غير مُدَعَّم" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "خطأ أثناء القراءة من الملف: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "خطأ أثناء تصفح الملف: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "خطأ عند غلق الملف: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "تعذّر إيجاد نوع المراقبة للملف المحلي الافتراضي " + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "خطأ في الكتابة للملف: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "خطأ أثناء إزالة وصلة النسخة الاحتياطية القديمة: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "خطأ أثناء إنشاء النسخة الاحتياطية: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "خطأ عند إعادة تسمية الملف المؤقت: %s " + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "خطأ أثناء بَتْر الملف: %s " + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "خطأ عند فتح الملف '%s'‏: %s " + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "الملف الهدف هو دليل" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "الملف الهدف هو ليس ملفًا عاديًا" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "تمّ تعديل الملف خارجيّا" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "خطأ عند حذف الملف: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "تم تقديم GSeekType غير سليم" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "طلب بحث غير سليم" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "تعذر بَتْرُ GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "دَفْقُ الاخراج للذاكرة غير قابل لتغيير القياس" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "فشل تغيير قياس دَفْقُ الاخراج للذاكرة" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "نقطة الوصل لا تدعم الفصل" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "نقطو الوصْل لا يتدعم الإخراج" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "نقطة الوصل لا تدعم الفصل" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "نقطو الوصْل لا يتدعم الإخراج" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "نقطة الوصل لا تدعم إعادة الوصل" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "نقطة الوصل لا تدعم تخمين نوع المحتوى" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "نقطة الوصل لا تدعم التخمين المتزامن لنوع المحتوى" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "دَفْقُ الاخراج لا يدعم الكتابة" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "دَفْقُ المَصدر سبق إغلاقه" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "خطأ عند قراءة الملف '%s'‏: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "خطأ عند قراءة الملف '%s'‏: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "خطأ عند حذف الملف: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "دَفْقُ المَصدر سبق إغلاقه" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "خطأ أثناء القراءة من الملف: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "تعذّر إنشاء مجلد سلة المهملات %s: ‏%s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "خطأ في الكتابة للملف: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "خطأ أثناء التحويل: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "خطأ أثناء بَتْر الملف: %s " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "خطأ عند فتح الملف: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "تعذّر نقل الملف: %s إلى المهملات " + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "خطأ عند حذف الملف: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "خطأ عند فتح الملف: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "خطأ عند غلق الملف: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "خطأ عند فتح الملف: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "تغيير الترابطات غير مدعوم على win32" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "خطأ عند حذف الملف: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "خطأ مجهول" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "سبق إغلاق الدَفق " + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "نهاية دَفق غير متوقّعة وغير متوقعة " + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "خطأ عند القراءة من يونكس: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "خطأ عند غلق يونكس: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "جذر نظام الملفّات" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "خطأ أثناء الكتابة إلى يونكس: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "الجزء لا يدعم الإخراج" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "الجزء لا يدعم الإخراج" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "تعذّر العثور على التّطبيق" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "خطأ عند تشغيل التطبيق: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "المسارات غير مدعومة" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "تغيير الترابطات غير مدعوم على win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "إنشاء الترابط غير مدعوم على win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "نفذت الذّاكرة" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "خطأ داخلي" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "اسم المستضيف غير سليم" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "تتابع غير سليم في دخْل التحويل" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "تَمَّ بُلوغ أقصى حد لمصفوفة المعطيات" + +#~ msgid "do not hide entries" +#~ msgstr "لا تخفِ العناصر" + +#~ msgid "use a long listing format" +#~ msgstr "استخدم تهيئة العرض المسترسل" + +#~ msgid "[FILE...]" +#~ msgstr "[ملف...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "المحرف '%s' غير سليم عند بداية اسم الكيان؛ المحرف & يبدأ كيانا، ان كان " +#~ "علامة اﻻمبارساند هذه غير موضوعة على انها كيان، تخطاها باعتبارها &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "المحرف '%s' غير موجود داخل اسم أي كيان" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "مرجع محرف فارغ؛ يجب أن يتضمن رقما مثل dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "مرجع كيان غير مكتمل" + +#~ msgid "Unfinished character reference" +#~ msgstr "مرجع محرف غير مكتمل" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "نص مرمّز بـ UTF-8 غير سليم - سلسة طويلة جدا" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "نص مرمّز بـ UTF-8 غير سليم - ليس محرف بداية" + +#~ msgid "file" +#~ msgstr "ملف" + +#~ msgid "The file containing the icon" +#~ msgstr "الملف الذي يحتوي على الأيقونة" + +#~ msgid "name" +#~ msgstr "اسم" + +#~ msgid "The name of the icon" +#~ msgstr "اسم الأيقونة" + +#~ msgid "names" +#~ msgstr "أسماء" + +#~ msgid "An array containing the icon names" +#~ msgstr "مصفوفة تحتوي أسماء الأيقونات" + +#~ msgid "use default fallbacks" +#~ msgstr "استخدم الاحتياط المبدئي" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "ما إذا سيستخدم الاحتياط المبدئي الموجود بقص الأسماء عند محارف '-'. تجاهل " +#~ "الأسماء بعد الأول إذا خدد أكثر من اسم." + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "خطأ فى تناول واصف الملف: %s" diff --git a/po/as.gmo b/po/as.gmo new file mode 100644 index 0000000000000000000000000000000000000000..0f80a30a96c7b9ab490a0d076c4dac645344fb5c GIT binary patch literal 62489 zcmeI5d7PbPdG{Z*RU1(eajEMO4U<47Bw-N~wh+Q1Aw&p^5{zeN&P|zTd3boq0*R54ct)zC*uD-PItF~7Aet*|>KkGba76^X&N9U6# zzh}9Z>%R8;zMpf>_YeNHoe_W69uP$@1v>{u(aW9^MPGT5?ncqcuZ*JSfy=?CgXagl zBw!7ECih3e^;Ym8uCD^$0RAqx9{gvp3a&adihdKk3w#Cm1#mw2BT)Su{HiEA3_J`x z1w0#k0r(#95O4xK0{j#>5Bw2W0iXNoD0&IF1msq<8dN_m@P**J!6o1x@U`G~KuC(7 zJ2#4s29E-d1UG={?*rgb;N775`x|gE_#BAq1($;=-vrg)Zcy}n7Oa5Z1vRe!07ciU zdYs;qzy(}y0BJJX2~s3_5QGKM4+8!=gH!!^py)gotbiSGIk*$t1%3wt_jIQSy|)Ab5aqHTe?e=Yy1|NFoy_*dX*;7JTxe7Ob`-yQ^)g8vGt|M?8! zWN;&>{_X%T1b-CpWSAs=eE<}nz65H#{|TN1Rv_jW@Xg?v;0@q=!F^x_Y*9)4ydHcx zcq=IV{5+`f{w=6+{5)JAvIyPb`Up_~ zqF)Ri3aXtGzzTRSsQPVC{a*)4ug1guhXOtl@F$??I~eAv-Vvb6pAJgS>%;x4LG`~Y zJpVK(`u-eL|33xQ&VeXn1)K{?uTKL-$D70TW>EFs3nKF9;~=b#{t8sT&paBt244lL z{&EmeMHhpjZwILQdq9={6Hw*84@&Mo0})Mh6heblQ6DHfx*k-yuLk@fcp}#a92-TL zSadQd`>28H|D7Nz9!-F1?`xpO|4UGM@v_%A{g;5Mza5m`+yQDl-vplrM#nk5hk&Bv zSWx;r8m>PCO74FSs@}hWsBToD@VmfOp!EJbpzi+?gjLbu3|92M2^2rB2F1@kAWcMn z3Q{zB`ZA|$IjC_Af$HamaQ!*(1zi6-sQPn`_x6qkpT+eBpvFA_J_mdosCKRo&;JM% zeP0Jf&riekOHOdTJq3I*_xnK6eFdogKL+9wqDKQh17YZTF(^9T2uknY4ju&V0maWh z07dT?!~K2WAzVKOz6g98!qN3BK*{B3P@K=JW5P<;C~_!97E;LE^6PIiB= z1k^YOz_sA@;2GeLK>3};%dt6d3%Clr4^+EPB^apPBf(dIuLm{WOF_}I8`L;I2Z}HM z0v-xJV}h3rg?) z0n~U8g;~<`H6W%IT^_DK2I2~%?}3u%foHnEsDNr`IjC_Dfg1PQ!RLb$;B&!GgOc;t zK=JoSp!o5O*LgdKgL-}zsCEWGjqfT@<9{Eh@^^!;2EPGHKYjwLzn-&PzOMt9a{XRV zG!i?zUZC{NFir!tI>U{>39{n|_{-5!BuYWkG_Ra?-mj zW)RUtW1!^z8BpW=K8Wf^zkv~}|J9)6RtFb>d%)!{}?$$^ zQ{Z#KpMaA4Gv46k=7ANiSA*hH6I6d!fJ?v|LACc4Q2qTID7nmeqtm?@)VMAHrMGSH zIpBxDqrlt27lDt0@~1xorMJgk?BnYLMc1{U`1}!2bJ|4Z;>aNeljuY(V9{ZVii^4V~y$E~Ngoj*r_ zbQx_1AtCx(kfx(G5ZMAB23Lbi#(ds)6-XD+UxIUK@2pMaPF!EQ+4*zw7N_s);9l-u zh_H5nzW~1le)uvkH_Bi%-srdRQMB_N@NHZ^c7^k8>`Ld$qu`C)Kjp1abTjxp@VCJ$ zw-IZoci>eXcXnOvdi@vR$vl4yJOf-pqvFfu;8O4l;4<*3Z+AU834ATrBcS*&0pg0H zL*C)@q_=?AbG;kX{i9&M`1DTjP2m3nd%?8`zXDzjo(SFoo(}#1JOw;_hv!8jp!)wK zP;~tgJRUsjo!-t4@F=eD16P9o2)-Fy^e*rJy`bd&!*G4_wXPR8fD5^Q@VmYL<=~lI zZv#cgmq7J%Fw7I40}g=i22siAF%Z^A>wd@e?GaGp?Y++R;ccMo^WQ+Vd)s@QU;h_G zq*3*~&iC(uRE=KtyH3{~AS{UH!Nm82_kd@BXS~nt=Di?8jJ^a)&)4om7T^S^aX$YB zr?UaB%m1d_A&5kunHdi0jK8%@C{r)6{YD1F9DAPKLbi$kAW(`=7T=3y%&_8 z&-sw^?Fvxi{uFotc<_hup9i3mV1w(cKY~vN9|NxfYrDLiAA)CbebR2Xmutast{(wW zo#?8Y$j!i~-|XXjH>hzu8m<@rp3Cp;;3eGuIJg*m?k(;wSAcKix(+S@KL?%${uGpc zow&#ObrmQ+Jpy9#(QEelIBo@x=lZ`vJwG1e2EiLawHr-1T^9$u3)FZHxYhOWY*2i> z9+ZB57JN1MQ}77zr62V;dj|MguG`=|@J>*C`Zl-`yy!M>_j91+e9-MKuPZ^(@m=s_ z@Tfa{-Jk<*=K5)OVuRq7AR>%jewX7XKvX+A_ioR-9|hmQ^?UB|@%!1e1<7LEHp z@N)2Z_qx7Z2Oh)qe}SihOFr)QvKc&^>xaQ(!Ds!x%kNZBeE1@`1^f^2IsC`z6E^n(@ytc54$|pfi=p#2ShcapMY0_@B2g7kLP^`-_P|0p!EA;@U7tU=|pne z2`&de2}&>i3p^d{|E%l9?ci^5{Y!8dy!>-c?~lM!xPHkWJHOrp%1-V8#n+eoiOc)- z;2B(hB;enJ7ju2&=UvaQ1*P|&2G^?I7u?^Bf*;^|-WOdzJ_Aa=Fa46|X`4Xl`MW{s z(=Wi|z>QyaI`@Do|J<)QeH%g1^#HgE{4sbuc>GtLKU={Ix&8qtxi9@wkC&H%D!&uF zRL?>2d+pcovEU~IF8jLc$)`Z+?ecH<^9R7wxL*2A&l|1+Mb|gLi@+nk#T*oTJBVna zrGMu9|1WS2*Qfruk8>v|`kwY}m*1N}jraTDJn)6z@qFfFP}etsZv(#wz6d<~yFUIw z@CdFy3~D@I0M~;{|H9+$2f+!1NL(LWl-(@ z2PpkI;%|K%9|pzOXa1eX!K1;`xxNzA`2PgF41CJpyS`olp2zif!Nb7?KlHeCAt*h3 z5Nv^uf$s$ee&liLC*bS2KK~y)F5Lt!;rdZfc6#tX`n+N-DEdahi^0DJ_56f?@;vRW zp!)wY_(pKWKfB)T0@eS|K-F9LFK(yr0zb?3x510R5B{r<@87`{Trc~vxA#`?IIh11 z&IJ$rKTh8g@N}+gpxV6?TnGNfV~&I1SzLcMTtDaE+>Z`}=Wze;z%lTce|LMn9Xx<* z+-&lI*1;48xUA8>sE=kK;B=ypKC-5eUvXLP~e zVvgriw%@LN4t*xq+qwQE$HzI=a^1_JKiFu0s7rJT_pSop3ciu!yZ$Ibr6bhG=4Vd< zU(K_3hG*jWD>>$H578UXF6I0{&VLL1zo7n(bTFof&xi5sL*TD-d@MXW13WjJ?*e}- zoC^-;SkJMCFb86dUJ7mi_4f>p z-{V-yy%u;O_(Kr)Wq;T3|3%?k@B)sXa9pVi{O*rR@>9`zgLITcYv30Je4vhap1DdN9*wmxPCVH z-yBtr<2kZ_Cv)*T9IGj}IXoBve}n6J;26i{oUa09hl@FXAt;@H7w3Z<@!ubDa$@FM z_mARu4fi&3oX7cFbd$fm9M9!m)2>*b0yl9j-+2?q7dZ6y1CCMdAH}hdbNQ(IIW+gu z-!lU4@XP4O;Ck*I5w2ecuHpLTa4k3_)Y%Mf;(Bd(_8hMNDxB{Q__LcGjmVRuH|@;qr>sn9P!_mIk}JHQykys_)U(N zQ+EjmuFd`ygtl;*(JIdW6MO~7k>UOe!54E}%<+zJ??Rp*#Bl+K{@!f=yDz>WoGb49 zMmQJrg}Oc9RUF50youwr9KXh)zm?z-9AETHTjP8$=dTaX+aRtn`8y;zb3YzmRwzfP ziN3>eBgflA{bz$axjvOce>=Dy_tWT4z$Vwna~#a^cU)fq>TfB>qjtueFJJ?FnB!>5 z+zzhfsB^rXV~}G3hyLEf@w*)Vs*CW~23K&LO5M4kk0o5ciu2PshC;a$1760xE5f

n%f2y1OeT1W;6aF@G^z&SQ+w6b*6nIxSKMTB=Lvz(PfhUBr2Xj8ap|!ac z9PbSG7jf^EoUaSl@8kOG9P!@-Cv(HaAA@h>xQMd7;htb0$1unB9P!^zIe9~9^O>Cg zdN|kfr*nLc;~zLqSGSskbYQW~WlEc+>qG zs;z2&r`D16wP#E%kP%9WC!`cO<9ESfjqBGSD2UB87Id ze`5_%4h*zv?RL!t+a4PoZMHh}*=#UmhS%QO?$k!2;2VE zo#N+=3ffDfm_HP^;HASu@y$)8<>w#!Rwb9e5^fyPhRtD;=T7Re6+FEID zLT{7HY?c)P~UiuEo^&XstC;Z%a+u@;mLVBdF*`vlg|~ zX^l1TF}2F+XV*rs+%p@aW1aIl=<-Ok!WFwh3>v97DAbnDSJk@)ow{n346(|5=paVY z7?P94Z>~M9ck!{)l{hX_pj8{JwFsvHvU|8D105Mv_ z#JtSKQ?*?i!B&Qwjb)XQCc$91zEP^OwK*m~gXuBE5xCaI;L_HU03oI~6!I%bu-$ik1vk z0Y=Yb`yFgGM=}(}sv|;7M?wOTL;~uL4g2^NT}{k$heOVxTIR-N2bDwTwhzq|H^T~g zi-K9l)*$&!?_D?ab9HD?_a&;e`&x3W9XAB~OPWnvGhe z4`u4#5S^NJ$;eev$3n*7*2>B)wSG*wHarlW+Uy^*^am*+&9O#p3vmTaLB`cVrBm{j zwM)mU!vx^^kVr|=D@31!LV1N{C{N~=8QPRRKz)5c3fkWsF)FYCMBR_1C1D<8aHa$^ zYNklf3@ha_z^ND#lba-sy>b52sSYiiNpE7NchiMLa*D>X6#mD8?HiRJS5Rb#xupB z7LXRYx|w^ZnJQS?n;%;2Lg+z!JAQ8a$P?3cLz1d|-ssFE_48^AhZa_jS896V{IrJ1 zt&NQ0f>5|%M`(Yuf!4z&T=!_Tzef4;xKhcw?Pz6~K$yj=Wlu;KRLCWbDFj#?bceQ0 zYB771uq%{xt&cHf%H~^%RvP&lxbqyztEN!C2{W@Ww+Nv#ek6JnG(y?Y| zS>>={{Wqlls-w;JvS_8Z@juA-2Z}7wh=W@2)*Bnm%?(J#X_3_;y>tSwven|c+TULz z`^S4A*APL>srutS(!~&s!gM3^P=eD#`S_CCKIJHRpt(%;cIdbSj%r8(x%N4J(ePI9Tt!+|m7%o<||cbR8HwT?BbVfdU0s~>D;N(@&?V>YOPOy-<< zK2qJNhh#r}O(s=ZJTr%q0v2**DqWss zZY$FhX-%5|rmR-zj!7UrH1cv5S#`%bYk2^ zP0l@Ivee(IkK!XUU9tAkHoGryKg?@NRK&9e^0U!8`Zz=qJTx|3Z7FaoAy;xbmoUS; zjY*B!eB$4{>PWTYuBNnRhBhxQ%N?m-*0rli6=IWb)kcR2+LlIk5VFgbZ#T4ltRbVFH=o%nGUS$+5vMrSWHCYM zd{|iU>3k@pP8ORcx0=J1pz{kVLrlr$4rIzG&mSD{48tGJiB7W~H6$dV=_F@)*IJo3 zw>>{w&N3}iHn)dC%Utr*XPQ;GqF*UzVn34}kJg#bX?#lQVWC#!7?mYv=mFj>B=|*Y zYD`MB_?9oEnbyoo76unLx1lzSJ^BQ)Ix@MbQO#Rb*n^h_=ETM;m>GsKtc}GM>|UPc z0wwatiRWQeVKB?WLD_6Kj*nEslA5!7gzIiaEwfBSV*&`OycA8*)0x#YjZKA`Z+5m# zP1UWh$%O1~fwJ!Y4V5;F%4o=jDvMctq_fNnZ6P|DwPfb=>AJ_f!(O%IsH2zpbZQH$ z2g9}btSun+4b@SfmxNZhXf~Oo5F;~URgkYJ?)c0-C(IcZD{6%`S!*=MhBi!Ynf%K+u&E11$Gpu51Dpc2UmNYcSgULi#W}Z+W zPvaUo#Hy~Ib<;H>M*T7t%x&!~?w2{fmd{e9lj7$5%;4bgSbIaaMkg0a#;H!EKv{`jt4x>@ise z)#?t6?eDS2A(PkYYIOQ}wqvq_6(9n|*`8(E%3ZRWrPWLJH3pizj(!F{Fx?Y5gJnDu zp!qsx5Wb4kb8(N&ShfDwb4gEROPfsfB^+C2(+W~u#$_Q^dPbQpORD)9a!Ik=4EoHl zJ$U+gq=#$S`m^mBt=ZFqPiVC+dYmu9Gf}tr4s&c6y*6+!rXeMD5~pk1h?RNTMAU#3 zkK%QQ`CUuTxZoIToJTF0L5nJQ?9n9!oiG;JY#EnvrPDe$$%M#~R8~Alp35dnZzvIo zdFjiCDrUYTzP%ynMN)2KjjhsRDO-s}BPKmiYELS}AXtWt+icHdP(H6-z)*9$1B0H> z46wu2@yTn_s%ifMlY3GrqbxymFcMGi%bS~Qr%magrllEXq-AT3P4!l@A??nW@I8RA zZ!pAGNh2BGW-F6Qf7V zk={aPn0Qk;FLMM?RcTyjo$Hz24YpwcaA#*7EuSUmCP!>5|6A8mXs^-)gYN z)3V9Vgrzg7P`Z_fxjo%;q?QqJNonE{+bq5m>LsI9wZV>UCA041`)hbnOL=I_Qii^< zLH3cNRZMkQwY7D%Lc}_|I!v<5{-gV(kk@D?qiCm1%qT5FknE!s^t;pCSYwl7-rRxt zqI}YR>dfmDcRtga@s^MGYBuQmbNL*@)WdQR?M6mtYoib2O`L?LEx3lWwU^pg>ugpA zYP(E@Hxi=NP2XSF>nXlXV_dP--qP0~R3o$0rpZ0iVey(Qtb%#kezl0PHyz|Wid9UW z^180W+3NXMFU&*GUxpCgTCnUmnbYvt6q2=kW+#XxQ#gHjLnMs0>YHrZH_XDj97&(J zVp~%_=B_n)3t>~8ZAq5Hnl0}?Ce8RJZuhfc0CP1e7*BWDA?b12rt&Cz>q11D!s2RG zk~x)FXloIHU2>_Gaog&>4cJ3V{ANjX&OmmLQq*L2Ab4Bogr0bZCAY8T97mVq<#-#% zbd8;udG$ysvi!YmrfKEAH*QM%88dAThV>lTrBye2wN{|h9GS0&vaQLkUS^kUSu#n= z?&rp#CyiF{K3mNMHVrew7M1oKNciUW&kJq}RHX`{##mFJSoO@Vv0to9YFNjtcgv?9bcK+^pB)Dq8Ug8vyOd?&k0K z%VrQ$h;QdL$6C0npd=;F^V$=7uE5#W*7e$8iO%y9-KT}2KuO!#otEOr)~0LvOdbdt z?I?Rot)&TQ@sXHR@RVzrbE118ki=pSxoYJi`-}30f=gHsuh6K~xB`Atvo2N87D63` z95WHi>G@88cSRAFWqm2WuZEe+F@(io_Y<;O_x2Ww`xjQ`t<|2d>gky}nxAbZyD47j zS(ovRQ&d$;Htnv=QwZ`2uqmW$DcSy|Bl?a*W?W7$^_c2Y*0cIdNI@{!Do7?2o^;>D zg30!=lcH5mbu(t!h(g4nifD&c+WmUp%j)Weu|PAxR>M5G?^fX6)M-3>vy^KJBJ^U5 zzciQ*Eq-UU-sm45v-dH2UWGtuWwhGakmekWr%1O7L~G+kHJGG#a@>!P%3tAInhNb} zwee7}*tPM?RMu#Cp%qW#t59x-R19xisZe6=8P{Oz1$cub-A>miw3xQu^H0`yXj!~H z-Cnn|na`j$`KPEqRq?>1IEvCHMEh&3#dc9ty$Cmq z6S#DYcU?UP%%s7SDl}PL;!VWVn^_WP-DJvYL7fF{+t96PL$bgyCrjf958}n1Vp<_5 z6X#*(!_H4$f2!1~Em?SDptm{L8+0-I*fv55y192+?M34Cql9+!P17pL%d%Em*Cjw_ zcR(0YLYa*N(GseM;pR-L`?73V8=I^3&S-srMr`>wQzXtd>B-)_DvmmSzQEqI(bHtP zDod^9@8p>zSiA|ObV-AxguR|o@xk~Gj5v@RwZA-NH84 z%nkahY+50V9|z60h=Qu+6Blt-8&cZrv2_3>-^9FI1T<2_UJE~-2hpGqnTh;v!CHwwXsm`&!G6=aFevo zr@k|-6PLaaO_79T31N%~Vt|{?h8fR=tcVST#tXA~zTj!i+B45ty>Q{eOQLm|6)j?d zVpOzlg@=pa*%84o?_u@T$W=AxWqzn`qILacb@6lVQ2l*FB+5q*;0-Ukac(gQnwgbk zrZ(|I-owAF)@lZ_qok`um&06S-bwTHF#UvpZJZYTcvwj10|NFoapKH&Y2vS~P*cPEo|NP?NwdCVt!(nz-uXgR- zCgxK-ZH`7^rJGDitn=NmXhUsFb%2j}j3AQ2Kqo(f{GKZ^z8bGw8=_*e37DvDM3TqL z?Z)9wW%bGnSLuynH=;HVJ-c)lUbyrX(Sq2M#e(Jt@7DQLk;u@fZ8kqU$g+`|MJrj? zNz{x_8O>WXKe->4$CGKQymj)9yro!Cnd?YgM12c-$j-+Q$te87@HAsyw?-7N8%-=A z^DJJUY`H7(wF&tHd;1@K(ebps>>pj08Cwqko-|8A-6GoGXs9S06kZ!=WH^qk(0bFVLFa#eE%P@|qgMW0( zKWGuUNGL2yf)z`BCWfpe@1VndoD6d)KG0z=E1;O83^Tl}&u1f|gb2-j^r0}Dv`aWC zO%$5+9#!g`d6x;c$iGx8xp)3UObo6+A}{6Rj3oZBl-X~Tw(n{kdwj+4c_Y;=^^viW z3VW5wfO#J%yk0hW*+#RUSoM-%k~oYO5p69G>v=SmCd|$v?&vcTByn^Ruc0LT=cy;8zK)hIHYX1(Q%$e(du_@6 zu;k}s305CF7Yb>Cd#J&S4VjgIB*U2Q`SH^gSktY5Cr0hcx@Z$?2(YMITr^}2&Dlhc}3Q!%>t%z@qu{6l(6$*$&{Thk{% zd(UnU)dzY{85?T%u4N;5&YE-9_O6iMz(RXZ#eFQTELpU8QSYLodY2qqS-g1Z(Z}^J zI(pF}3ih6hi;yKJHB&=#~BxLfk%%X)$=Byd!Gn~V{rxDj!9cYZ& zW&4CBtl!(|3G*7SJYn(tIegT5-}pQBO?+(M#EyOA6P11A*Xb>H~TeG}L28^3wq z_{00gub%S5*H(P56})ZV_?~?ezrAnb9{$nPgwDoqjaX~RT$Fw`+xp$TZ~P%j-jUF9 z&A#y)yeUX}VBf@U3$pvh!+n25uMqhm`d&um?UbS!e>5&?XwR;_aY~PeYdzbWH2=`P z@w=#h4L3Nmig$8-YY#nh(8%>%QeAEDo7f)Nq)f~cvuNsmyRUIG0Iu&ASE1U8(FeXO z-dRepmko>$Lkyn^7nzfYcd6WpY@C!?jfBdKObn(cMtisYf5$AxkrhuO6wUgLMNYHS zXi7d8`5?i;M+SD4@gCJxfH#!9E^pkM*-H!Hiv7nQmhDzpSGQv*Hlh~wS}^x94W(nkw#t>`-pLb>28@3kis z7MG<^NU7J<<2DsEQ9xd*V}AGHSW@2dE!>5r7zt$=Km6Olt;CvwR3mF>mofLlF|UL8 zuh%oRAWqO-u@rZq293FwGw-Y5A}4mwto?-9Q#Cez2aUNtVC`__ekTCUEMZ5kC9%K? z$C7czSbI{dT)YWm(R~c{p^AOEL)^1#wEKUV)a~XZTsbi>@!OxNBNf}_d2|1f7@`ew#NkdQx+=dg|?+#hUvxAmB2oi2XM118|G ztkRuq%y(J!Endn^oS_qV@kn?dHJ!Q+F6bnVo90lW;(KKl$>$D~cf;K$&`04tv?ryf z)7ZVreJ{w9(#zV(-zV~9^i%4pUDPvh=&m5xqJmTS-#wvulu|Emj=4NOFa;qkMW))!jj18Z1Hg_;Z5|E&YTJ& zKxz(?qT2%MP@7zjQL0>M%G*uzz{7 z$(QaVOZL%d<`|jmPzcXk(`YZDQp~v~<`iduQzupVFP*{Xu*jEw>kQ4M>LRa%K5%bp z$K(@BQ`LA5sH8d0+brp}v`fJyj*;95%9Ugn#C|$gj)9-d^_oyc70(>vOe#!j;l|am z_K>){-^C8BuqOylDj8vkQR@a$6#DlB0Hu=rxFt@;6ix(-D~!@g6`j7n+w6w1`PTqH;O5@eBorX(9QfpbtVL3M$Dx`h%mrAAOGh^S$Z8!wwH(E*Pg>`O*dghK5_kbk^V<~lE!D%3P6OqjFAgD>67t+dsmuQ19q5YN=@%m!w8i8O&{ zT1TS4pvZ~x1b@Yl7`|LFg>#+Jt*=W#lF?&R?O3bEDI3_qSz_2}=FQ!NJaK~$JlasE zYLhDAyFh~8g#-%<#kH&vzTdc;#+jW_>^GR0gh@7BkhG}@rD2^QHC_{pGkP0EJb>5= zfNWqlx5~o^RG?g%Xom5-wcs!5mL)@5oiYV?y^=QDf>qEqBv5qCqJsWhHo-SCTyDjk zrQh>pb}8kQicEGvai3J}3DanA2GgPzvJ9&%{_#PR{zvRloNGjnYXo$1x5yRmLJyLr zd89O*F;WUXa({JK(pL#HY^qou$vj_x4Ou-)^hItoR&yyp8lIxC17?k^EVbwM^{L(x9j& zO2`uIf2>L>>iVb^E-u`OYAKwH@`0F2Ys6CK+%jcJ6O1~9g3zVa!gnD@Td;G@3QNgO zqnW`3YowHsk4QSSIz|~IV@R@pIatIn)c`{tNkR9~=q|&|rIL|x7-QEQkAhT*^*+`R z>t|dMDk0s3;x2h&w<&?U$1tUYu}OkK8iwQ;pZNNuGbNgqC$Z3fW%R)D@ep*Rf%#pN zUmaV@$w(yXLDA#cor#%aE(nkC^s5nGh%M!$x(b^|mOX2__A4gO{3ND=Ta-1JbCpPO zi`dMz*a-ylF6ZbZx1m>GlErt<7(Am3e&~OIy#ycft5Sgik0+^ueBuMJ=}G4dDP9+K zq<37XXEx}-eP$zCizbSu+7UZyNmGme_#I^}6x)w6V1a)-AB_f6;H(%l+!ylzT8UkR z426~)twl}d`6NA!V@S>b84A$~4k&__1Wg}s;$$qB%168?6IDE3hJa6l>0Duw8d!%& zf#^r08c=aMVVf!3m$8})Lk@Rn$DZJiPs3ohCtp?Aod%C_AqkNa6cYgku9=YLi)OD* zvs;^{eblG&2zz8o9$F`ZTPtZ7}Ws>v+De-((Einf|7JEV$@*}yh;}yKq z2`=o#g&ehew3-DyuGvhnV$+9H-Ay5KGPE2w69q|Y#@vf0^S-2X7hWljGQwVSZ`#7lL^+H3 zF(Vc7VQexXa<7^Qc1D9j9zM%Xx9DfnDzp+HH0!mKy+PcJY|6!(-Dm;b#O%^13vDPx z9m$M6eN%;sE(%!c>a2ih{i{*J3o{{6#YMt8irBgJJ9AlJY_x2%TkmUvbO?jd%PGaY zVCJntKJ=6?y!y~mo1L+MyNIIP@^ZO^Q4<)5BpKRFhhiJE%)o6%LIOc$yG2|kHj=<( zr5qJY=blOj(p;cKC*xq--MmXxC{8e_F30vn+|?|aus00w3-}dV*OorYl>OFyrk|da z&SD#A%JHGyA2HSJ=F3YI!G%ptEw{O~B?wAClt!Tuo|9XHPy z7AEBe_fNwmt+)p90C{xZ=5{~Oh0D0uj5m^h)jq@H?u)uJ^y^V* zeeQTeIA+BrGGb(}R;TW+RICAPI_i3npu$~$7&Io~O@hS1}@tO?GA*&3VqWghRP53f{i`~M7GzeYu zEEz9+4_~3vt+OudF6oS(h>8&BhK-k{kSt~2gxp%j^M?nID-SK_m^DwoSCw-tH~SEM z%(~nkV88MbRAWuVm;<57Ttel@d2c0SUEt|1=Iy2K*Er3wkoCE9^jw81@(m?&D`(~7 zBS(vd^n%4ANc9I{K7FAVXRH~LSS|1OB=n6yUDAl00B43G|Dog{QPK4EhpFgD7;gS2 zuPbns@o2DUD$GrUwA(i9kqf{0WaBRiX6o=gBX3)x=7~b1I`E#=JN}=>ZHLu}UA;ddN za*YNvWq9ewC*qGz#N-VQI0HOSC~d^J3Xus-SGoC5Zg)WWf1qR2juFs6(_+24JX%QqpjVKr4EPKcp52hgdV1zT)7xVc3 z*+;5sCV~!{!b@(%K39H3BzHZVVc0J(m=T-plY~k)we53vj~JYOq%GdF@hu^QO%xLA zu{bnJ>e)qCBR-kDF?noe6K4_og|)M7zPs^xVDeN#Qw!I?++-+g8S!sN%*F!slM;bb z-Ayk1(8O%oHO+;$aR4*xawiLuWlk)Dp)0Q6lblKX3l+2LGHxQeo zHe-Jfm6aRcE~8)LC}}p{s`1j@R{KinHIu;yx^&?*K3s245v^epj!QWY?#>-3|KpnU zfV+3fb;^!HsW`Hk)w6R!G3-o%k-}x0*kL!h!Vhumo1ov1?whzxdyjIYM#y&k9*6dZ z<$35xgb|8!ZCggB2k48ay4k!n6QFyd+4(xJ?m^(={1>W@bOO z82=Q_q$cgRXiTCd<1TZUWgJR>xdydV2xgY=GkF+>;-HsF8l?;AcF7x5Q8^uH>tQ~J z*up%bOAR-XM1{&rx&9=oya#>n?}4zyYo}`h+zlxpXI{f+b9Z!UI>}<09?DeEw{7Zg zir?6g?(%)x_PaXtB7XUt(mjGpM|bHztjX~_NuAMsxe9I(`^M9+LBLF7*1@PQaO!bs>+PckjpR|0VhhVZ;Rpt(bX!4F&dl&LMJ6~(KLVQqtN z?vPf{CVVq$xiV^Y>m@@oaFr-oqTstV`7%c12V&YSVW}jex_Um{;3v{1!}P=j=Y8Iy z_FXk|b!l;`Ue$C-YmaXP{wqxTy~$&bR+9(`S-{MYUc;N9i@N8EYLnQ4kONy2L%*xY zOd5_?djro+9|H5$T8=^VCS{@(&We%1B@&8IGnLv*%g1USwx)=~_#oxt*+vV6GDmz-z=Rfm5CK-0?qQZhM5!O+nUxD%&_+0teW8^H=V`qOV3bzO@SC~2qJzl z^$JlC8k};glEm=wd#yQwPeC8(*fod$;YTVVs--WdX(~s)h)WGh7CT-Xs5!)IM0`*j z?RYxD(nBs7O75Exf-tA(tGqdz>?Lhk!&1KO{x*&eR6K-lO6Tyxo)4tR;XHL?Z)3C8(n8@T=Ay>ToBCZ z-9bYYOw^Jl8sXx)-)s5c;tWH~kOaxhLnNCSMLC|9^qLv~jZfL7}L^JzT%*X`KlfKyD8W`qy*nrnTrhE0F?OdNz(N`!s_2A=P ze~77?$P~xPl1+=`%4RRXqP@{pOj77P zD`b30pwKOh*ROHSN*?6mi~8skOUtMf2c+O>!n;`Vicz))3U|>svv2Ey4&|)&ntzi? zUuTuDeFEXlcK7Pp*qXTwsw&XXTFEf*EIhQ}&Est6A#a_D$rQTDRVgqg4c{kiTVprrr9@!x3`VbP9L@Uy?g&L{XH~C40khppvcqm?5r)2;15Vp&(P*>WC zDEUFaFq+QKW=Bz zmo`1V)+YCtgjMWXOKe3dLKfr2er1bi#@l=%7$vi7<+&z0C2n1fHHy6#D(RAyE}_42 zU{;Z-Kx*HZ9@3PGBqr~-?0+drKE1YrsIHzM!|a#)q?>*wVVtfht2)LFpfLDBY6S&A z@#sQ2(UVfhT_|y@ zC~${D)}T=YPuX&&9RH)s_r-MzW5|hz;*wjK2zmczJ>mpSO&BeKFbfsInfW+ib(r16 z9GaqaanoyCrEWa7thQV@(8q}5j8`i-NIA{P!k1WvyP{btdq(O- zzl~utFGa0=UMgiocWt=RKfRR^OERc*D8jsTn=?76V!G0onr2!xjRGdyM2Tc~MpG$g zc3=TszFZ*_0!nNaac0auQ6TddI2SBSLv{xboh2=B*Gw)uk%yX_%qAh)Mi&e)ZVdKO zgw%AeF)|I%aq2bz=q%Y2B-WDyoNRoCEIhe1=tNMaiM^c3kO59z;!#t1fA)j=@^Q+WvBy8*& z^^I|2rq;hpoOx&9gZB!3ZCqG!3cBwI*{YH4#U%K$$3I z#IO~H>~^*zJCA1D{WpEB1w?}5FkMp}BA^_ORvCPeLE7fdw#0A>!EFQSTTZv#a{&C?xAo`opo7K}?k zc)MvealonJc@f%5Eh)B5IruW$q2YfQ&NaG*$P2WY6V&q#KsJyD5YK~7T` z&wr=?v{d-2_xPnQQ_VQRLn#?1o<_Qvb+t(tz%mk_z}_yG#LsQwXwtLT3ia-J@Qe8= zWI7saQ*xE@(%&Se*v~`9QtIYT?9;QU*QTB6{4zz#l_yIYEDufs5y}#&f{2rG$!VLz z6Xn(%|I5wj8o?raY}=Q0a-Yj*ls**vhg?G{=U8`XZ8n`hvCh&hC}_dwNnwqJsJPs@ zyD9qc(Xxq#6-@k&#%x(aQHV2ZqF8H^=+j@=hOFtO<;oVKK$!7DJEPtS)afuF_pnN$WALTksl7(69H|}e9p6E zOxuNqVZp)OGB^M6a&L#GlNnQa4a%kYWo~-p-zW+tG=k}31$QKk!YA(HWs=szGMedv z$hU+-j_^(^ith|AbSAq>(cJ!I*;HCsqPKKJORgwk_Foc>AUKx>at*)I7y(lm$K6h@ zwnF?Z4hvo;RL`F1A1dUxorx}5I@c|^DSo{NcFm9U^XnFt65-?9WPfN04Akteyb;rI z(URI=n(plf!pbODq=hIa)kdxW9Md1C8aR2942BPvGSZcnLi7XkGrzcFgG;rkAbUbN z5(~Z2vvDOOi+CoSx|Vd6D5IlM_+fY}MuW%~Qq)>DK6}6jp3ieteqBD;PHMcyb`1`; zXA&NDY|Vx|gAPh8(zyZ8h!JrnMOzAI{DW^aDy0XU(-7#PP8E0nFL+Q$YtuoS;$UM; zX&6q-dsT6@m2XbD9i>I2N8$-RP^5%-`ptf-L^>JsgkQbqYO>YGg0dkbR*zcmRbyF_ z;+9N5;$%L{U2$Y`HOMq>TmGUo2pWaA+(XEs@Mg2s8`T}ZI>|3dW-}XRrOK=(anrOU z;d}T5Ej3;6E)5s0x`=78GuS7uN{bBRSg<1DSDEsGE|6Y`dh#{FcBlzcx*+obDGLvj2?N^is+tYo_rM5$5bE z?=49`CQDn{;+C;H*b`1I{+ccPPf<}^wj~kX)^6R#9(RxYZfVgs@a1emcQwid;#x&t`V+u_q0j@j@rm(iJ`&%CDw5mPYZGPQ8yjHqRpO zf*P0T1kL0umg^ail$u2>2?p*|i;#5B0LegN*PoRO*+fBlQ7|gmhs6qejtNZD8Ddfz zYnw!pHDjTYa}5p5yk#Y!J2NShv}(F)W{=oiSNw6vFpzCqYriVRC2$l zWxwdRUO)0~kw#`P{V>8*%Q#1q4@Z`uDU>~VRJUux{BW)j$ymBBO3a>k|M1r4YQ4kf z(4GJj;t!WiPeFdNqI5N0h&NH)Y32iu5vsP4o=Ag}CPru=x-Z3ZBhne!*AAPuJdF70 zklb#U>7Em6(?C-?%BC9TdNn<9A+MobnwznX#Ge#TRG-8MRZ|Emv3{sXH-Dw$LE%yR z*yicq^(IM>g09b?VoCGGV4FnYVskLu#vOYQcszlCp)ea~xMhxCj#G3^77mkeQ-xyt z34^FY;-IvYg7nJj66UCV4hh`CfWG)B1UU~oibUq0jk=PlwNu0Rop&>zgF}M{60!;B z6_I5m^64Ax7YO@+H#rRO?I1fM(t25i5RvA7TA@Hp0pF)!ewsL$B5{`!!TsK zcQpp<{GQ4{y`|h#Y^F^#e}XgDO;O4PJvvbY$>8g_OJAAP$NGx{aF}v>LMk1lVFf-7 z0kyTzs5wM-!stb2_U>(={lVd;eeaM9g`H(fL&mY?{nmx4AfXM8m41f#@pn`Zv(0T$ zFO31Fhj4}1-5zW{l!<^AJ7pdezn?2htX{Zq;U$rJO#+P> zmb6FaBze;Lp2|8dOI91B;bwDVUyZzffM0iS*IN1kcZyPB#Z0D>)A!rorQ>x&p?#Xb zm4u}z96G-9p-Nw?+Rt28d=`T_3pUDG@C$L#*ft8&iJc{Fzz=0mu7%d7aw5z z8hYLy%{yt{WRkN?OHAA>(U1Vy7fc>L zPyJ0&rZwL1ZmMAT=ns`;L!8|nbltp!aq$z=64F=g-^kRme`CE7OB@qI3>tfe(?yrv4+Ld|hh8I-Ut>PHtIG-nT@)5u6g!EUZJ zH`Q9W!p%{CvoTPYja7#!Yn;x^puK&^r3!HXGzOTfU>vvgxQnq4;}UU*6c@-tT=|GfZgdh*Y;-f_ z^EJkCU(8KDZMWZ<%*aAY28pv}p&J$?hE&)5hz~t@nndGJDLXfpJ(8zdl`)oEg{4Fj*p?Dgl$(*@ z`JjVQU<>Yxri>qv4V2-!Nm|;zdgX|2`BqSJp;M}d@P+3!`KmkeqHS*InHD{oLYUQ* zCfwC6XN2k0cPAmAhJV~)9ns?ltY0RyiVuuAI6KoS(c%FQuAp#fu&=CJLvfSFx>3$D zG?XS|K~1M1qjL>?)Ao}^ky(e_iqmfWS#%Ng=A&%fQs;yg`~g-)lBh4vEtvpv z*M+b>y8MdDrDN4br#@J(wL+rhW6W6#%*+OZ3F|-;3_K3~;{Wd{Hf4dWq^Z=NT?1lD zOk%EwyRA{pT4LF)JL)yB3DiMK=st=qX{vy0ZY|7+f(OkEUpacK+F&zxWVAl4*~(_V zq_928M3mOav=y6Nz&I(7II*putOb>FCycsMP`btQy(&ViJaqDVB z3XRR>owePiV3JdcPl+2=TFSMn13UIM+ZvaXq0{NrC~b#Ea&9@&s6t@2+*czc(x7Ob zjHRL=!vY_{td~b(KQ`sM3yed}&?$B9;uE*WHI@luUn&n) zDNLWy`XaxHUgHZm{GS-jDXj(pOxv&v*R@$eDO8}H=~Tuvik{%BLZm55F3ixz6haSn zRlZh4-&FO9TfwJ@uKbpPzmML{@8t%RuNXR^E9sK-#fM!i1$VrN>uqpBX7Z%D`Q$TL zuAEL-tDHn{>`X|cWmqwR^G@O-m#_KrOh#uyDN;xKuEk2%X`&>0vnF}`liB#1C$Di9 zq-Vs^nQ(!)6T1wU, 2007, 2008. +# Amitakhya Phukan , 2009. +msgid "" +msgstr "" +"Project-Id-Version: as\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-15 12:48+0530\n" +"Last-Translator: \n" +"Language-Team: Assamese <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.2\n" +"Plural-Forms: nplurals=2; plural=(n!=1)\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "অপ্ৰত্যাশিত গুণ '%s' পদাৰ্থ '%s' ৰ বাবে" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' গুণ '%s' পদাৰ্থৰ পোৱা ন'গ'ল" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "অপ্ৰত্যাশিত চিহ্ন '%s', '%s' চিহ্ন আশা কৰা হৈছিল" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "অপ্ৰত্যাশিত চিহ্ন '%s', '%s' ৰ ভিতৰত" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "তথ্য পঞ্জিকাত কোনো বৈধ পত্ৰচিহ্নৰ নথিপত্ৰ পোৱা ন'গ'ল" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' ৰ বাবে পত্ৰচিহ্ন ইতিমধ্যে আছে" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' ৰ বাবে পত্ৰচিহ্ন পোৱা ন'গ'ল" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' ৰ পত্ৰচিহ্নৰ বাবে কোনো MIME ৰ ধৰণ সংজ্ঞা দিয়া হোৱা নাই" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' ৰ পত্ৰচিহ্নত কোনো ব্যক্তিগত চিহ্নৰ সংজ্ঞা দিয়া হোৱা নাই" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' ৰ পত্ৰচিহ্নৰ বাবে কোনো সমষ্টি প্ৰতিষ্ঠা কৰা হোৱা নাই" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' নামৰ কোনো অনুপ্ৰয়োগে '%s' ৰ বাবে কোনো পত্ৰচিহ্ন পঞ্জীভূক্ত কৰা নাই" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec শাৰী '%s', য'ত URI '%s' আছে, বিস্তৃত কৰাত বিফল" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "আখৰৰ গোট '%s' ৰ পৰা '%s' লৈ সলনি কৰাৰ সমৰ্থন নাই" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' ৰ পৰা '%s' লৈ সলনি কৰা যন্ত্ৰক খুলিব নোৱাৰি" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "সলনি কৰাৰ নিবেশত অৱৈধ byte ক্ৰম" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "সলনি কৰাৰ সময়ত ভুল: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "নিবেশৰ অন্তত অসম্পূৰ্ণ আখৰৰ গোট" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "fallback '%s' ক codeset '%s' লৈ সলনি কৰিব নোৱাৰি" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"file\" আঁচনি ব্যৱহাৰ কৰি URI '%s' এটা সম্পূৰ্ণ URI নহয়" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "স্থানিক নথিপত্ৰৰ URI '%s' ত এটা '#' থাকিব নোৱাৰে" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' অৱৈধ" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' ৰ গৃহস্থৰনাম অৱৈধ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' ত অৱৈধভাবে মুক্তি পোৱা আখৰ আছে" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' পথৰ নাম এটা সম্পূৰ্ণ পথৰ নাম নহয়" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "অৱৈধ গৃহস্থৰনাম" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' পঞ্জিকা খোলোঁতে ভুল: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu bytes বিতৰণ কৰিব পৰা ন'গ'ল নথিপত্ৰ \"%s\" পঢ়িবলৈ " + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "নথিপত্ৰ '%s' পঢ়োঁতে ভুল: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" নথিপত্ৰ বৰ ডাঙৰ" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' নথিপত্ৰৰ পৰা পঢ়োঁতে বিফল: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' নথিপত্ৰ খোলোঁতে ভুল: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' নথিপত্ৰৰ গুণ পাওঁতে বিফল: fstat() বিফল: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' নথিপত্ৰ খোলোঁতে ভুল: fdopen() বিফল: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' নথিপত্ৰক '%s' লৈ পুনঃনামকৰণ কৰোঁতে বিফল: g_rename() বিফল: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' নথিপত্ৰ সৃষ্টি কৰোঁতে বিফল: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' নথিপত্ৰ লিখিবৰ বাবে খোলাত বিফল: fdopen() বিফল: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' নথিপত্ৰ লিখাত বিফল: fwrite() বিফল: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' নথিপত্ৰ লিখাত বিফল: fflush() বিফল: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' নথিপত্ৰ লিখাত বিফল: fsync() বিফল: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' নথিপত্ৰ বন্ধ কৰাত বিফল: fclose() বিফল: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "বৰ্ত্তমানে থকা নথিপত্ৰ '%s' আঁতৰাব পৰা ন'গ'ল: g_unlink() বিফল: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' টেমপ্লেট অৱৈধ, এটা '%s' থাকিব নালাগে" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' টেমপ্লেটত XXXXXX নাই" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "সাঙ্কেতিক সংযোগ পঢ়াত বিফল '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "সাঙ্কেতিক সংযোগ সমৰ্থিত নহয়" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' ৰ পৰা '%s' লৈ সলনি কৰা যন্ত্ৰ খুলিব পৰা ন'গ'ল: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ত raw read কৰিব নোৱাৰি" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "read প্ৰশমকত অৱশিষ্ট অপৰিবৰ্ত্তিত তথ্য আছে" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "ছেনেল অসম্পূৰ্ণ আখৰত অন্ত হয়" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end ত এটা raw read কৰিব নোৱাৰি" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' নথিপত্ৰ খোলোঁতে বিফল: open() বিফল: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' নথিপত্ৰ map কৰোঁতে বিফল: mmap() বিফল: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d শাৰীৰ %d আখৰত ভুল:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "নামত অৱৈধ UTF-8 সাঙ্কেতিক লিপি - অৱৈধ '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' এটা বৈধ নাম নহয়" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' এটা বৈধ নাম নহয়: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d শাৰীত ভুল: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' বিশ্লেষণ কৰোঁতে ভুল, যি কোনো আখৰৰ উল্লেখৰ ভিতৰৰ এটা সংখ্যা হ'ব লাগিছিল " +"(&#২৩৪; যেনে) - হয়তো সংখ্যাটো বৰ ডাঙৰ" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"আখৰৰ উল্লেখ এটা ছেমিকলনেৰে অন্ত ন'হ'ল; পদাৰ্থ এটা আৰম্ভ কৰিব নিবিচাৰিও অতি সম্ভৱ " +"আপুনি এটা এম্পাৰছেন্দ আখৰ ব্যৱহাৰ কৰিছে - এম্পাৰছেন্দক & হিচাপে নিৰ্গমন কৰক" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"আখৰৰ উল্লেখ থকা '%-.*s' এ এটা আজ্ঞা থকা আখৰক সাঙ্কেতিক লিপিলৈ পৰিবৰ্তিত নকৰে" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ৰিক্ত পদাৰ্থ '&;' দেখা গ'ল; বৈধ পদাৰ্থসমূহ হ'ল: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "পদাৰ্থৰ নাম '%-.*s' অজ্ঞাত" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"পদাৰ্থ এটা ছেমিকলনেৰে অন্ত ন'হ'ল; পদাৰ্থ এটা আৰম্ভ কৰিব নিবিচাৰিও অতি সম্ভৱ আপুনি " +"এটা এম্পাৰছেন্দ আখৰ ব্যৱহাৰ কৰিছে - এম্পাৰছেন্দক & হিচাপে নিৰ্গমন কৰক" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "প্ৰলেক্ষ এটা পদাৰ্থৰ সৈতে আৰম্ভ হ'ব লাগিব (যেনে )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' এটা বৈধ আখৰ নহয় '<' আখৰৰ পিছত; ইয়াৰ দ্বাৰা পদাৰ্থৰ নাম আৰম্ভ ন'হ'বও পাৰে" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "ভুল আখৰ '%s', এটা '>' আখৰ প্ৰত্যাশিত ৰিক্ত পদাৰ্থৰ টেগ '%s' শেষ কৰিবলৈ" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%s' অক্ষৰ প্ৰত্যাশিত নহয়, এটা '=' চিহ্ন প্ৰত্যাশিত গুণৰ নাম '%s', পদাৰ্থ '%s' ৰ, " +"পিছত" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' অক্ষৰ প্ৰত্যাশিত নহয়, '%s' পদাৰ্থৰ প্ৰাৰম্ভিক টেগ সমাপ্ত কৰাৰ উদ্দেশ্যে '>' বা " +"'/' চিহ্ন বা কোনো বৈশিষ্ট্যৰ উপস্থিতি কাম্য; সম্ভৱতঃ কোনো বৈশিষ্ট্যৰ নামত অৱৈধ অক্ষৰ " +"ব্যৱহৃত হৈছে" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"'%s' অক্ষৰ অপ্ৰত্যাশিত, '%s' গুণৰ, পদাৰ্থ '%s' ৰ, মান নিৰ্ধাৰণৰ উদ্দেশ্যে সমান চিহ্নৰ " +"পিছত এটা উদ্ধৃতি চিহ্নৰ প্ৰাৰম্ভিক অংশ উপস্থিতি প্ৰত্যাশিত" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' অক্ষৰৰ ব্যৱহাৰ বৈধ নহয় '%s' বদ্ধ পদাৰ্থৰ নামৰ পিছত; অনুমোদিত অক্ষৰ হ'ল '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' পদাৰ্থ বদ্ধ অৱস্থাত, বৰ্তমানে কোনো পদাৰ্থ খোলা অৱস্থাত নাই" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' পদাৰ্থ বদ্ধ অৱস্থাত, বৰ্তমানে '%s' পদাৰ্থ খোলা অৱস্থাত আছে" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "প্ৰলেক্ষ ৰিক্ত বা অকল ৰিক্ত স্থান আছিলে" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "খোলা বন্ধনীৰ প্ৰাৰম্ভিক চিহ্নৰ '<' ঠিক পিছত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"খোলা পদাৰ্থসহ আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে - '%s' পদাৰ্থ সৰ্বশেষ খোলা হৈছিল" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"নথি অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে, <%s/> টেগ সমাপ্তিৰ বাবে খোলা বন্ধনী চিহ্নৰ অন্তিম " +"অংশৰ উপস্থিতি প্ৰত্যাশিত" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "পদাৰ্থৰ নামত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "বৈশিষ্ট্যৰ নামত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "পদাৰ্থৰ প্ৰাৰম্ভিক টেগত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"বৈশিষ্ট্যৰ নামৰ পিছত উপস্থিত সমান চিহ্নৰ পিছত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে; " +"বৈশিষ্ট্যৰ মান অনুপস্থিত" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "বৈশিষ্ট্যৰ মানত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' পদাৰ্থৰ অন্তিম টেগত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "কোনো মন্তব্য বা প্ৰক্ৰিয়াকৰণৰ নিৰ্দেশত আলেখ্যন অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ক্ষতিগ্ৰস্ত অৱজেক্ট" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "অভ্যন্তৰীণ সমস্যা বা ক্ষতিগ্ৰস্ত অৱজেক্ট" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "স্মৃতিশক্তি অৱশিষ্ট নাই" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "backtracking ৰ সুনিৰ্দিষ্ট সীমা পূৰ্ণ" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "উল্লিখিত বিন্যাসত অন্তৰ্ভুক্ত সামগ্ৰী, আংশিক মিল অনুসন্ধানত সমৰ্থিত নহয়" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "অভ্যন্তৰীণ সমস্যা" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "আংশিক মিল অনুসন্ধানৰ সময় বেক ৰেফাৰেন্স সমৰ্থিত নহয়" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "পুনৰাবৃত্তিৰ সীমা পূৰ্ণ" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ৰিক্ত চাব-স্ট্ৰিং ৰ কৰ্মক্ষেত্ৰৰ সীমা পূৰ্ণ" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "নতুন পংক্তি চিহ্নকাৰী ফ্লেগৰ অৱৈধ সমষ্টি" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "অজ্ঞাত সমস্যা" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "পংক্তিৰ শেষত \\ উপস্থিত" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "পংক্তিৰ শেষত \\c উপস্থিত" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\ ৰ পিছত অজ্ঞাত অক্ষৰ উপস্থিত" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "কেছ সলনি কৰা escapes (\\l, \\L, \\u, \\U) ৰ ইয়াত অনুমতি নাই" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} quantifier ত সংখ্যা ক্ৰমত নাই" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} quantifier ৰ সংখ্যা অত্যাধিক ডাঙৰ" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "অক্ষৰৰ শ্ৰেণীৰ শেষত ] চিহ্ন অনুপস্থিত" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "অক্ষৰৰ শ্ৰেণীত অৱৈধ escape ক্ৰম" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "অক্ষৰৰ শ্ৰেণীৰ অঞ্চল সীমাৰ বাহিৰত" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "পুনৰাবৃত্তিৰ বাবে কিছু উপস্থিত নাই" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? চিহ্নৰ পিছত অজ্ঞাত অক্ষৰ উপস্থিত" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< চিহ্নৰ পিছত অজ্ঞাত অক্ষৰ উপস্থিত" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P চিহ্নৰ পিছত অজ্ঞাত অক্ষৰ উপস্থিত" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named শ্ৰেণীসমূহ অকল শ্ৰেণীত সমৰ্থিত হ'ব" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "শেষত ) অনুপস্থিত" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "( চিহ্ন নোহোৱাকে ) চিহ্ন প্ৰয়োগ কৰা হৈছে" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R বা (?[+-]সংখ্যা ৰ পিছত ) চিহ্ন ব্যৱহাৰ কৰা আৱশ্যক" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "অনুপস্থিত subpattern নিৰ্দেশ কৰা হৈছে" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "বক্তব্যৰ পিছত ) চিহ্ন অনুপস্থিত" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "ৰেগুলাৰ এক্সপ্ৰেছন অত্যাধিক দীঘল" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "স্মৃতিশক্তি প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion সীমিত দৈৰ্ঘ্যৰ নহয়" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( ৰ পিছত ত্ৰুটিপূৰ্ণ সংখ্যা বা নাম উপস্থিত আছে" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "conditional সমষ্টিত দুটাতকৈ অধিক branche আছে" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( ৰ পিছত assertion প্ৰত্যাশিত" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "অজ্ঞাত POSIX শ্ৰেণীৰ নাম" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating পদাৰ্থ সমৰ্থিত নহয়" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} শাৰীত আখৰৰ মান বৰ ডাঙৰ" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "অৱৈধ কন্ডিছন (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "lookbehind assertion ত \\C ৰ অনুমতি নাই" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "ৰিকাৰ্ছিভ কল অনিশ্চিত কাললৈ লুপ কৰিব পাৰে" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "subpattern নামত হেৰুৱা terminator" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "দুটা নাম দিয়া subpatterns ৰ একে নাম" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ত্ৰুটিপূৰ্ণ \\P বা \\p ক্ৰম" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P বা \\p ৰ পিছত অজ্ঞাত গুণৰ নাম" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern নাম বৰ দীঘল (সৰ্বাধিক ৩২ টা আখৰ)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "বহুত নাম দিয়া subpatterns (সৰবাধিক ১০,০০০)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "অক্টাল মান \\377 ৰ অধিক" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE দলত একাধিক ব্ৰাঞ্চ উপস্থিত আছে" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "কোনো DEFINE দলৰ পুনৰাবৃত্তি কৰা নাযাব" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "বিসংগত NEWLINE বিকল্প" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g ৰ পিছত এটা brace থকা নাম বা এটা বৈকল্পিক brace থকা শুণ্য নোহোৱা সংখ্যা নাই" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "অপ্ৰত্যাশিত পুনৰাবৃত্তি" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "কোড overflow" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "আগতে পৰীক্ষা কৰা সন্দৰ্ভ থকা subpattern পোৱা ন'গ'ল" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "ৰেগুলাৰ এক্সপ্ৰেশন %s ৰ মিল অনুসন্ধানত সমস্যা: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE লাইব্ৰেৰি UTF8 সমৰ্থন নোহোৱাকে কম্পাইল কৰা হৈছে" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE লাইব্ৰেৰি UTF8 বৈশিষ্ট্যৰ সমৰ্থন নোহোৱাকে কম্পাইল কৰা হৈছে" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ৰেগুলাৰ এক্সপ্ৰেশন %s, %d অক্ষৰত কম্পাইল কৰিবলৈ সমস্যা: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "ৰেগুলাৰ এক্সপ্ৰেশন %s ৰ সৰ্বোত্তম ব্যৱহাৰত সমস্যা: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal সংখ্যা বা '}' প্ৰত্যাশিত" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimal সংখ্যা প্ৰত্যাশিত" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "সাঙ্কেতিক ৰেফাৰেন্সত '<' অনুপস্থিত" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "সাঙ্কেতিক ৰেফাৰেন্স অসম্পূৰ্ণ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "সাঙ্কেতিক ৰেফাৰেন্সত অক্ষৰ সংখ্যা শূণ্য" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "সংখ্যা প্ৰত্যাশিত" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "অৱৈধ সাঙ্কেতিক ৰেফাৰেন্স" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "অন্তত অপ্ৰত্যাশিত '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "অজ্ঞাত এস্কেপ ক্ৰম" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "প্ৰতিস্থাপনৰ টেক্সট \"%s\", %lu অক্ষৰত বিশ্লেষণ কৰিবলৈ সমস্যা: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "উদ্ধৃতিৰ অংশ উদ্ধিতি চিহ্ন দ্বাৰা আৰম্ভ কৰা নহয়" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "আদেশ শাৰী বা শ্বেল ৰ উদ্ধৃতিত অসংগত উদ্ধৃতি চিহ্ন" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' অক্ষৰৰ পিছত টেক্সট সমাপ্ত হৈছে । (সংশ্লিষ্ট টেক্সট হ'ল '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c ৰ ক্ষেত্ৰত সুসংগত উদ্ধৃতি চিহ্ন পোৱা নাযায় । (সংশ্লিষ্ট টেক্সট হ'ল '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "টেক্সট ৰিক্ত (বা অকল শূণ্যস্থানসহ)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পঢ়িবলৈ ব্যৰ্থ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ সৈতে যোগাযোগৰ উদ্দেশ্যে পাইপ নিৰ্মাণত ব্যৰ্থ (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "চাইল্ড পাইপৰ পৰা পঢ়িবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' পঞ্জিকালৈ পৰিবৰ্তন কৰিবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়া প্ৰণয়ন কৰিবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "অনুপ্ৰয়োগৰ নাম অৱৈধ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d ত তৰ্ক ভেক্টৰত উল্লিখিত পংক্তি বৈধ নহয়: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "পৰিবেশত উল্লিখিত পংক্তি বৈধ নহয়: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "সক্ৰিয় পঞ্জিকা বৈধ নহয়: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "সহায়ক প্ৰোগ্ৰাম চলাওঁতে ব্যৰ্থ (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পড়াৰ সময়ত g_io_channel_win32_poll() ত অপ্ৰত্যাশিত ত্ৰুটি" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পঢ়িবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পড়াৰ সময়ত select() সংক্ৰান্ত অপ্ৰত্যাশিত ত্ৰুটি (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() ত অপ্ৰত্যাশিত ত্ৰুটি (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork কৰিবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়া \"%s\" চলাওঁতে ব্যৰ্থ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ নিৰ্গম বা নিবেশ ৰি-ডাইৰেক্ট কৰিবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়া fork কৰিবলৈ ব্যৰ্থ (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "চাইল্ড প্ৰক্ৰিয়া \"%s\" প্ৰণয়ন কৰিবলৈ অজ্ঞাত সমস্যা" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "চাইল্ড pid পাইপৰ পৰা পৰ্যাপ্ত তথ্য পঢ়িবলৈ ব্যৰ্থ (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "অক্ষৰ UTF-8 ৰ আয়ত্বৰ বাহিৰত" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "ৰূপান্তৰ কৰাৰ উদ্দেশ্যে প্ৰদত্ত তথ্যত অৱৈধ ধাৰা" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "অক্ষৰ UTF-16 ৰ আয়ত্বৰ বাহিৰত" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ব্যৱহাৰপ্ৰণালী:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "সহায়তা সংক্ৰান্ত বিকল্প:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "সহায়তা সংক্ৰান্ত বিকল্প প্ৰদৰ্শন কৰা হ'ব" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "সহায়তা সংক্ৰান্ত সমস্ত বিকল্প প্ৰদৰ্শন কৰা হ'ব" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "অনুপ্ৰয়োগ সংক্ৰান্ত বিকল্প:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "'%s' পূৰ্ণসংখ্যাৰ মান %s ৰ বাবে বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' পূৰ্ণসংখ্যাৰ মান %s ৰ বাবে সীমাৰ বহিৰ্ভূত" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' ৰ দ্বীগুণ মান %s ৰ বাবে বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' ৰ দ্বীগুণ মান %s ৰ বাবে সীমা বহিৰ্ভূত" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s বিকল্প বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ৰ তৰ্ক অনুপস্থিত" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "অজ্ঞাত বিকল্প %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "অনুসন্ধানৰ dirs ত বৈধ চাবি নথিপত্ৰ পোৱা নাযায়" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "সাধাৰণ নথিপত্ৰ নহয়" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "নথিপত্ৰ ৰিক্ত" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "চাবি নথিপত্ৰত '%s' পংক্তি আছে যি চাবি-মানৰ জোৰা, সমষ্টি বা মন্তব্য নহয়" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "দলৰ নাম অৱৈধ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "চাবি-নথিপত্ৰৰ আৰম্ভত কোনো সমষ্টি উল্লিখিত নাই" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "চাবিৰ নাম অৱৈধ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "চাবি নথিপত্ৰত অসমৰ্থিত এনকোডিং '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "চাবি নথিপত্ৰত কোনো সমষ্টি অনুপস্থিত '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "চাবি নথিপত্ৰত কোনো চাবি উপস্থিত নাই '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "চাবি নথিপত্ৰত '%s' চাবি আছে '%s' মান সহ যি UTF-8 বিন্যাসত নাই ।" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "চাবি নথিপত্ৰত '%s' চাবি উপস্থিত আছে যাৰ মান বুজিব পৰা নাযায় ।" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "চাবি নথিপত্ৰত '%s' চাবি উপস্থিত আছে যাৰ মান বুজিব পৰা নাযায় ।" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "চাবি নথিপত্ৰত '%s' চাবি আছে '%s' সমষ্টিত যাৰ মান বুজিব পৰা নাযায় ।" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "চাবি নথিপত্ৰত '%s' চাবি '%s' সমষ্টিত নাই" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "চাবি নথিপত্ৰত পংক্তিৰ অৱশেষত এস্কেপ অক্ষৰ উপস্থিত আছে" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "চাবি নথিপত্ৰত অৱৈধ এস্কেপ ধাৰা উপস্থিত আছে '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' মান কোনো সংখ্যাৰূপে বুজিব পৰা নাযায় ।" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' পূৰ্ণসংখ্যা মান সীমা বহিৰ্ভূত" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' মান float সংখ্যা ৰূপে বুজিব পৰা নাযায় ।" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' মান বুলিয়েন ৰূপে বুজিব পৰা নাযায় ।" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s লৈ বহুত ডাঙৰ count মান দিয়া হৈছে" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "স্ৰোত ইতিমধ্যে বন্ধ" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "কৰ্ম বাতিল কৰা হৈছে" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "অবৈধ ছকেট, আৰম্ভ কৰা হোৱা নাই" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "সলনি কৰাৰ নিবেশত অৱৈধ byte ক্ৰম" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "ছকেট ঠিকনাৰ কাৰণে যথেষ্ট স্থান নাই" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "বাতিল কৰিব পৰা আৰম্ভ সমৰ্থিত নহয়" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "অজ্ঞাত প্ৰকৃতি" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s নথিপত্ৰৰ ধৰন" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s ধৰন" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "স্ৰোতৰ অপ্ৰত্যাশিত আগতীয়া অন্ত ।" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "নামবিহীন" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ডেস্কটপ নথিপত্ৰত Exec ক্ষেত্ৰ নিৰ্ধাৰিত নহয়" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "অনুপ্ৰয়োগৰ বাবে আৱশ্যক টাৰ্মিনেল পোৱা নাযায়" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ব্যৱহাৰকৰ্তা অনুপ্ৰয়োগৰ বিন্যাস ফোল্ডাৰ %s নিৰ্মাণ কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ব্যৱহাৰকৰ্তা MIME বিন্যাস ফোল্ডাৰ %s নিৰ্মাণ কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ব্যৱহাৰকৰ্তা ডেস্কটপ নথিপত্ৰ %s নিৰ্মাণ কৰিবলৈ ব্যৰ্থ" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ৰ বাবে স্বনিৰ্ধাৰত ব্যাখ্যা" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ড্ৰাইভ দ্বাৰা ইজেক্ট কৰ্ম সঞ্চালিত নহয়" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ড্ৰাইভ দ্বাৰা ইজেক্ট বা eject_with_operation কৰ্ম সঞ্চালিত নহয়" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ড্ৰাইভত মিডিয়াৰ বাবে প'ল কৰাৰ কাৰ্যক্ষমতা নাই" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ড্ৰাইভ দ্বাৰা আৰম্ভ কৰ্ম সঞ্চালিত নহয়" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ড্ৰাইভ দ্বাৰা বন্ধ কৰ্ম সঞ্চালিত নহয়" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem encoding ৰ %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem encoding ত ট'কেনৰ ভুল সংখ্যা (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon encoding ৰ %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon encoding ত ট'কেনৰ ভুল সংখ্যা (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ৰ কাৰণে এটা GEmblem প্ৰত্যাশিত" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "কাৰ্য্য সমৰ্থিত নহয়" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ধাৰণকাৰী মাউন্ট উপস্থিত নাই" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "পঞ্জিকাৰ ওপৰতত নকল কৰা নাযাব" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "পঞ্জিকাৰ ওপৰত পঞ্জিকা নকল কৰা নাযায়" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "লক্ষ্য নথিপত্ৰ উপস্থিত আছে" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ৰিকাৰ্ছিভ ভাবে পঞ্জিকা নকল কৰা নাযাব" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "সাঙ্কেতিক সংযোগ সমৰ্থিত নহয়" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "নথিপত্ৰ খুলিবলৈ সমস্যা: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "বিশেষ নথিপত্ৰ নকল কৰিব নোৱাৰি" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "অৱৈধ সিম-সংযোগ মান উপলব্ধ কৰা হৈছে" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "আবৰ্জনা সমৰ্থিত নহয়" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "নথিপত্ৰৰ নামত '%c' ব্যৱহাৰ কৰা নাযাব" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ভলিউম দ্বাৰা mount প্ৰয়োগ কৰা নহয়" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "চিহ্নিত নথিপত্ৰ ব্যৱস্থাপনাৰ উদ্দেশ্যে কোনো অনুপ্ৰয়োগ নিবন্ধিত নহয়" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator বন্ধ" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "নথিপত্ৰ enumerator-ত অসমাপ্ত কৰ্ম উপস্থিত" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "নথিপত্ৰ enumerator ৰ বন্ধ" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon encoding ৰ %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon ৰ কাৰণে ভুল নিবেশ তথ্য" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "স্ৰোত দ্বাৰা query_info সমৰ্থিত নহয়" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "স্ৰোত দ্বাৰা Seek সমৰ্থিত নহয়" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "নিবেশ স্ৰোতত Truncate ৰ অনুমতি নাই" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "স্ৰোতত Truncate ৰ সমৰ্থন নাই" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ট'কেনৰ ভুল সংখ্যা (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "শ্ৰেণীৰ নাম %s ৰ ধৰণ নাই" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s ধৰনে GIcon সংযোগমাধ্যম প্ৰণয়ন নকৰে" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s ধৰণক class কৰা হোৱা নাই" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "ভুল সংস্কৰণ সংখ্যা: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s ধৰণে from_tokens() প্ৰণয়ন নকৰে GIcon সংযোগমাধ্যমত" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "আইকন এন্‌কোডিংৰ দিয়া সংস্কৰণৰ পৰিচালন কৰিব নোৱাৰি" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "নিবেশ স্ৰোতে পঢ়া কাৰ্য ৰূপায়ন নকৰে" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "স্ৰোতৰ ক্ষেত্ৰত অসমাপ্ত কৰ্ম উপস্থিত আছে" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "ছকেট ঠিকনাৰ কাৰণে যথেষ্ট স্থান নাই" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "অসমৰ্থিত ছকেট ঠিকনা" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "অবিকল্পিত স্থানীয় পঞ্জিকাৰ মনিটৰৰ ধৰন পোৱা ন'গ'ল" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "নথিপত্ৰৰ নাম অৱৈধ: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "নথিপত্ৰপ্ৰণালী সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "root পঞ্জিকাৰ নাম পৰিবৰ্তন কৰা সম্ভৱ নহয়" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "নথিপত্ৰৰ নাম পৰিবৰ্তনত সমস্যা: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" +"নথিপত্ৰৰ নাম পৰিবৰ্তন কৰা নাযায়, নতুন নামৰ এটা নথিপত্ৰৰ নাম বৰ্তমানে উপস্থিত আছে" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "নথিপত্ৰৰ নাম অবৈধ" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "নথিপত্ৰ খুলিবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "পঞ্জিকা খুলিবলৈ সমস্যা" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "নথিপত্ৰ আঁতৰাবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "নথিপত্ৰ আবৰ্জনালৈ স্থানান্তৰ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "আবৰ্জনাৰ পঞ্জিকা %s নিৰ্মাণ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "আবৰ্জনাৰ ঊৰ্ধ্বতন পঞ্জিকা সনাক্ত কৰিবলৈ ব্যৰ্থ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "আবৰ্জনাৰ পঞ্জিকা সনাক্ত বা নিৰ্মাণ কৰিবলৈ ব্যৰ্থ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "trashing তথ্যৰ নথিপত্ৰ সৃষ্টি কৰিব নোৱাৰি: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "নথিপত্ৰ বৰ্জন কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "পঞ্জিকা নিৰ্মাণ কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "সাঙ্কেতিক সংযোগ পঢ়াত বিফল '%s': %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "সাঙ্কেতিক সংযোগ নিৰ্মাণ কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "নথিপত্ৰ স্থানান্তৰ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "পঞ্জিকাৰ ওপৰত পঞ্জিকা স্থানান্তৰ কৰা নাযাব" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "বেক-আপ নথিপত্ৰ নিৰ্মাণ কৰিবলৈ ব্যৰ্থ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "লক্ষ্য নথিপত্ৰ আঁতৰাবলৈ সমস্যা: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "মাউন্ট কৰা অৱস্থানত স্থানান্তৰ কৰা সম্ভৱ নহয়" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "গুণৰ মান NULL ন'হ'বলাগে" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "অবৈধ গুণৰ ধৰণ (স্ট্ৰিং প্ৰত্যাশিত)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "অবৈধ সম্প্ৰসাৰিত গুণৰ নাম" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "সম্প্ৰসাৰিত গুণ নিৰ্ধাৰণ কৰোঁতে ভুল '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "নথিপত্ৰ '%s' stat কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (অৱৈধ এনকোডিং)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "নথিপত্ৰৰ দেস্ক্ৰিপ্টৰ stat কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "গুণৰ ধৰন বৈধ নহয় (প্ৰত্যাশিত uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "গুণৰ ধৰন বৈধ নহয় (প্ৰত্যাশিত uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "গুণৰ ধৰন বৈধ নহয় (প্ৰত্যাশিত byte স্ট্ৰিং)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "symlinks ত সন্মতি নিৰ্ধাৰণ কৰিব নোৱাৰি" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "অনুমতি নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "গৰাকী নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "সাঙ্কেতিক সংযোগ NULL হ'ব নোৱাৰে" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "সাঙ্কেতিক সংযোগ নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "সাঙ্কেতিক সংযোগ নিৰ্ধাৰণ কৰিবলৈ ত্ৰুটি: নথিপত্ৰ সাঙ্কেতিক সংযোগ নহয়" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "সাল সলনি বা অভিগমৰ সময় নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ৰ সন্দৰ্ভ NULL হ'ব নোৱাৰে" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ৰ সন্দৰ্ভ নিৰ্ধাৰণ কৰিবলৈ ব্যৰ্থ: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "এই ব্যৱস্থাপ্ৰণালীত SELinux সক্ৰিয় কৰা নহয়" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s গুণৰ মান নিৰ্ধাৰণ সমৰ্থিত নহয়" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "নথিপত্ৰৰ পৰা পঢ়িবলৈ সমস্যা: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "নথিপত্ৰত seek কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "নথিপত্ৰ বন্ধ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "অবিকল্পিত স্থানীয় নথিপত্ৰৰ মনিটৰৰ ধৰন পোৱা ন'গ'ল" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "নথিপত্ৰলৈ লিখিবলৈ সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "পুৰনি বেক-আপ সংযোগ আঁতৰাবলৈ সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "বেক-আপ প্ৰতিলিপি নিৰ্মাণ কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "অস্থায়ী নথিপত্ৰৰ নাম পৰিবৰ্তন কৰিবলৈ সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "নথিপত্ৰ সৰু কৰিবলৈ ভুল: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "নথিপত্ৰ '%s' খুলিবলৈ সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "লক্ষ্য নথিপত্ৰ এটা পঞ্জিকা" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "লক্ষ্য নথিপত্ৰ সাধাৰণ নথিপত্ৰ নহয়" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "নথিপত্ৰ স্বতন্ত্ৰৰূপে পৰিবৰ্তন কৰা হৈছে" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "পুৰনি নথিপত্ৰ আঁতৰাবলৈ সমস্যা: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "অৱৈধ GSeekType উল্লিখিত হৈছে" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "অৱৈধ seek ৰ অনুৰোধ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ক truncate কৰিব নোৱাৰি" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "স্মৃতিশক্তিৰ নিৰ্গমৰ স্ৰোতক পুনঃ আকাৰ দিব নোৱাৰি" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "স্মৃতিশক্তিৰ নিৰ্গমৰ স্ৰোতক পুনঃ আকাৰ দিবলৈ বিফল" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount ৰ দ্বাৰা unmount প্ৰয়োগ কৰা নহয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount ৰ দ্বাৰা ইজেক্ট কৰ্ম সঞ্চালিত নহয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount ৰ দ্বাৰা unmount বা unmount_with_operation প্ৰয়োগ কৰা নহয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount ৰ দ্বাৰা ইজেক্ট বা eject_with_operation কৰ্ম সঞ্চালিত নহয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount ৰ দ্বাৰা remount প্ৰয়োগ কৰা নহয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount দ্বাৰা সামগ্ৰীৰ ধৰন অনুমান কৰা সম্ভৱ নহয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount দ্বাৰা সুসংগতভাবে সামগ্ৰীৰ ধৰন অনুমান কৰা সম্ভৱ নহয়" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "গৃহস্থৰনাম '%s' ত '[' আছে কিন্তু ']' নাই" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "নিৰ্গমৰ স্ৰোতে লিখা কাৰ্য ৰূপায়ন নকৰে" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "উৎসৰ স্ৰোত ইতিমধ্যে বন্ধ" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' বিশ্লেষণ কৰোঁতে ভুল: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ক ওলোটা ভাবে বুজিবলৈ ভুল: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' ৰ কাৰণে সেৱাৰ ৰেকৰ্ড নাই" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ক অস্থায়ীভাবে বুজিব পৰা নাযায়" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' বুজিব লওঁতে ভুল" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "অবৈধ ছকেট, আৰম্ভ কৰা হোৱা নাই" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "অবৈধ ছকেট, ইয়াৰ কাৰণে আৰম্ভ কৰিব নোৱাৰি: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "ছকেট ইতিমধ্যে বন্ধ" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ৰ পৰা GSocket সৃষ্টি কৰা হৈছে: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ছকেট নিৰ্মাণ কৰিবলৈ সমস্যা: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "অজ্ঞাত আচাৰ বিধি নিৰ্ধাৰিত কৰা হৈছে" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "স্থানীয় ঠিকনা পোৱা নাযায়: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "দূৰৰ ঠিকনা পোৱা নাযায়: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "শুনিব পৰা ন'গ'ল: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "ঠিকনালৈ বান্ধিবলৈ সমস্যা: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "সংযোগ গ্ৰহণ কৰোঁতে ভুল: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "সংযোগ কৰিবলৈ ভুল:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "সংযোগ চলি আছে" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "সংযোগ কৰিবলৈ সমস্যা: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "পেন্ডিং ভুল পাবলৈ ব্যৰ্থ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "তথ্য পাওঁতে ভুল: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "তথ্য পঠিয়াবলৈ সমস্যা: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "ছকেট বন্ধ কৰোঁতে ভুল: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ছকেট অৱস্থাৰ কাৰণে প্ৰতীক্ষা কৰা হৈছে: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "সম্বাদ পঠিয়াওঁতে ভুল: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ক windows ত সমৰ্থিত নহয়" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "সম্বাদ পাওঁতে ভুল: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "সংযোগত অজ্ঞাত সমস্যা" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "স্ৰোত ইতিমধ্যে বন্ধ" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "যোগ কৰা ছকেট বন্ধ" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon encoding ৰ %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "১ নিয়ন্ত্ৰণৰ সম্বাদ প্ৰত্যাশিত, %d পোৱা গ'ল" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "এঞ্চিলাৰি তথ্যৰ অপ্ৰত্যাশিত ধৰণ" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "এটা fd প্ৰত্যাশিত, কিন্তু %d পোৱা গ'ল\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "অবৈধ fd পোৱা গ'ল" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix ৰ পৰা পঢ়িবলৈ সমস্যা: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix বন্ধ কৰিবলৈ সমস্যা: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "নথিপত্ৰপ্ৰণালীৰ root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix লৈ লিখিবলৈ সমস্যা: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "এই প্ৰণালীত এবস্ট্ৰেক্ট ইউনিক্স ডমেইন ছকেট ঠিকনাৰ সমৰ্থন নাই" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ভলিউম দ্বাৰা ইজেক্ট প্ৰয়োগ কৰা নহয়" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ভলিউম দ্বাৰা ইজেক্ট বা eject_with_operation প্ৰয়োগ কৰা নহয়" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "অনুপ্ৰয়োগ পোৱা নাযায়" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "অনুপ্ৰয়োগ আৰম্ভ কৰিবলৈ সমস্যা: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI সমৰ্থিত নহয়" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 ত অনুপ্ৰয়োগৰ সম্বন্ধৰ সলনি সমৰ্থিত নহয়" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 ত অনুপ্ৰয়োগৰ সম্বন্ধৰ সৃষ্টি সমৰ্থিত নহয়" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "স্মৃতিশক্তি অৱশিষ্ট নাই" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "অভ্যন্তৰীণ সমস্যা" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "অৱৈধ গৃহস্থৰনাম" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "ৰূপান্তৰ কৰাৰ উদ্দেশ্যে প্ৰদত্ত তথ্যত অৱৈধ ধাৰা" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "সৰ্বাধিক তথ্য শাৰীৰ সীমা পোৱা গ'ল" + +#~ msgid "do not hide entries" +#~ msgstr "নিবেশ লুকুৱা কৰা ন'হ'ব" + +#~ msgid "use a long listing format" +#~ msgstr "দীঘল তালিকাৰ আকৃতি ব্যৱহাৰ কৰক" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "'%s' আখৰ পদাৰ্থৰ নামৰ আৰম্ভনিৰ বাবে বৈধ নহয়; & আখৰে এটা পদাৰ্থ আৰম্ভ কৰে; যদি " +#~ "এই এম্পাৰছেন্দ এটা পদাৰ্থ ন'হ'বলাগে, তাক & হিচাপে নিৰ্গমন কৰক" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "'%s' আখৰ পদাৰ্থৰ নামৰ ভিতৰত বৈধ নহয়" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "ৰিক্ত আখৰৰ সঙ্কেত; এটা সংখ্যা থাকিব লাগে যেনে &#৪৫৪;" + +#~ msgid "Unfinished entity reference" +#~ msgstr "অসম্পূৰ্ণ পদাৰ্থৰ উল্লেখ" + +#~ msgid "Unfinished character reference" +#~ msgstr "অসম্পূৰ্ণ আখৰৰ উল্লেখ" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "অৱৈধ UTF-8 সাঙ্কেতিক লিপি - overlong ক্ৰম" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "অৱৈধ UTF-8 সাঙ্কেতিক লিপি - এটা আৰম্ভৰ আখৰ নহয়" + +#~ msgid "file" +#~ msgstr "নথিপত্ৰ" + +#~ msgid "The file containing the icon" +#~ msgstr "আইকন ধাৰণকাৰী নথিপত্ৰ" + +#~ msgid "name" +#~ msgstr "নাম" + +#~ msgid "The name of the icon" +#~ msgstr "আইকনৰ নাম" + +#~ msgid "names" +#~ msgstr "নাম" + +#~ msgid "An array containing the icon names" +#~ msgstr "আইকনৰ নাম ধাৰণকাৰী এটা শাৰী" + +#~ msgid "use default fallbacks" +#~ msgstr "অবিকল্পিত fallbacks ব্যৱহাৰ কৰক" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "'-' আখৰত নাম সৰু কৰি পোৱা অবিকল্পিত fallbacks ব্যৱহাৰ কৰা হ'ব নে নহয় । বহুত " +#~ "নাম দিলে প্ৰথম নামৰ পিছৰ নাম আওকাণ কৰা হয় ।" + +#~ msgid "File descriptor" +#~ msgstr "নথিপত্ৰৰ দেস্ক্ৰিপ্টৰ" + +#~ msgid "The file descriptor to read from" +#~ msgstr "পঢ়িব লগা নথিপত্ৰৰ দেস্ক্ৰিপ্টৰ" + +#~ msgid "Close file descriptor" +#~ msgstr "নথিপত্ৰৰ দেস্ক্ৰিপ্টৰ নিৰ্ব্বাচন কৰক" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "স্ৰোত বন্ধ কৰিলে নথিপত্ৰৰ দেস্ক্ৰিপ্টৰ বন্ধ কৰা হ'ব নে নহয়" + +#~ msgid "The file descriptor to write to" +#~ msgstr "নথিপত্ৰ দেস্ক্ৰিপ্টৰ য'ত লিখিব লাগে" diff --git a/po/ast.gmo b/po/ast.gmo new file mode 100644 index 0000000000000000000000000000000000000000..36381290714c6b5e86c75823ee3e42f738ba1098 GIT binary patch literal 44970 zcmd6w3!Gh5eebugsu3z6@8>3v%mgwaFCgRvAtWJ^7bJj4FrGQ*%;bHc`mg_Mt-bQ?W1jxDh`+m@5=EzipE@FnPJ3z;?LJ9Qqv)$=M$z-YzXYEN zJ{s^x0iOu?%Ye_A>*sI3N59cq#Y?k@G+zy@#mcT*q4lo8k37!J}JxG@5r=aRNd0rHq04@iY zf?L3gz*|AO5`7X}4n6{&2OdS`s_znT8F($I`d$w%0Y3o_fj%cYOyTMyQ zwfFRMoSx@{tGK@!Tm;?;@?Z3saQ{Q_MD9iU z29@q@;Bnx`!IQx+f-2`xFb01PD*q`EL-k(>im$eTdOi~Hwt(*j)xHPA{ntUI{})i> z{7jfj`OX1V|3*;n%b?nK3#j_v1FD>lgE9DJP<;J3sCGPyLDKyhpz>V=!V=N-AVUzn z3RJldfTw|90+s#;AVU~EjX_X57K6&a1yuSPsC2IeHSX^P8M5dR5Ryi7F7SD@3RJpw zz&C?yxxWWw3Pz8CnvX|b==CoFnF7&vP~{x})&CEI;)~CLYX37eQ1@y#w!{W%Ce z5Bxn)?fn#Z5%_IT{Cpxex?j)#H14;6%J)tXmX5vvz7G5eD89dy&guCFK}Z^X4ODx7 zW0jYG4yg8Q0jVO|50W*yA5^=30IDC)UG4R(1$AEqj|blcD*wkowfCFgk>IaD_4|l5 z-tKe3=W>4ysQe?K(!C8-JKqPYU0)3MkAvdh;~@6Q;Q651zXMc%UkM^IqK^f9B;eB_ zvf48QD*v_MQQ!ekbbT$TcK=Rz{s4F^_n!q%1phAF{~M_BedZ<34-3IFxW54uJ#PWk z-+RDQz%PNPf!_z2O3^dcc|R`%cX2-gUJgD4O8z_@;ZGN%E5I$_?V!s226!g;)b(E9 z*`WG+8L0L&K=u0_py=`$a4z@=DEj;g)c7sE%=x1V>izBD3E=O8D*v;f+W9?@DI1-* zA&MBX=nC+3@U@`EstNf{4)Qeo*824`2-b7*sjOKHvMj z5>&sh1&;#{f=7dQfEwq!L5=4_py=@k7=ynI?@zzN%efF#|8{}u|0t;Rw}EGa?*}C> z{v1?&KL_b@bQ(lh36?FvD<6n*ak=Yt;yMYl&l<^Lt9@&>Q+ zaajkdyq(|?U;|Wnw}Q_Er$EvFOW<#S-vbweKLXYM(|3A*wt}MH%fT4DA5{Op3O)z? zXYhI8&p@^72qvfI|1yxFi!KLG1@8jY&X0mjk?5PC>Ob>pAGg(@>Yo6Q1n&WtfS&-5 z0)GIi|33#~@Z@W}o>idA-vRz6I0i~?yaYTSd?%=J|7v*tb5Q9|yw>xd52_u{2Sv|v zxPJ|(ba#U)_fJ9b%~wG2%fEsrfXBbU`?UzvcwYyKKDU8N|87v_{u!wB-vy5Ye*vmp zM_=djY!#^f6~K$YmxIdpP{412l5hVBYCP7w(9`V$kLLaZpz?nL)V%#0Fb01Kik_!m z@9kO$F6I7mQ0Z<4)viOJ#_yA$`uC5Z`u~jG&fjyv=W_pia2fbQ@I>%UpxX5zQ2hNU zC^{T{gSTrXcpCRxK&8JCRC`_ls@^+6)prl5_J0M8!N&tW_eFlc7!*HW30?q>hx-qK z3%UP%xc@Qu-KQ{D_jvn%`eNtz=M|8(q&p?x*#U<@&4&vDt_8)<8^ik-g5tj-xEE}J zZSY%Q1Kc_6?fN_@`aKGYzDE>&oG%7N=c_?PVRSQiI{10;WbjdNIT)2Z-}#`@?*&EA zH-Q@O2f?$!#{wQ%_W8UNWa>xzL6!3ba4Yyr@N)2q5vS{2pzc2ouF-pNJ-BMr<=w5| zI`01zRQsPoXHNr{gR1{3@I3Hk;5_gnp!oM2;07?NxZKzXDqR~?IUfL({%^svz+Z*; zb8qzYSAm!F{N>;Wz%PR0=ka~cN4J6M&%NME@ZUknr{z^IzX*zN-VP3ee*}sS{{XhY zW5?XjxE)-}{dWS!HJ7t{Ktxw`KX?)Nw0iKDKu8qb3NnSF?}g{<#$B(!0vzJ`XTYuC z>YKd0Tfuj5|8?*ja39Pfet$c7D)uMQE(af1yKC-AE45m2~)@5#o%J_ z#h}`CCwLP05m5a4Mer2xQBdVRWxvz=Y*78YF5oLcjm!O@+Wi-x%KI6pd?y_6^eaK7 zD}$=%RiNs54>$lm2%ZQ26Sx#SX2SDt07b{WpwhhxyaK!r)Hwe;xEWkA>Gj+Os-FA6 zi@`60OTZ%!difWFmvLVQ&jddXs{C(&o4_A~>c^^^ecVf+`1&p21>hfp8vlO*MZcvl zalR{p7jgd(sP;brUI-4};{5z#P;_}0sP;SvUJ3p)cnP@nr9p3lDt8LhJpBo%eq3-X zeFFD`E5Wm0=K1!3JGg%@xElOda0R&N<=&oAQ1m(kN)G%8)cYm3`TH9|-M=3cUA_g1 zzvjNepKk=kXSagl(+`3gr%!^S#}B}h!1$Hkua)3Y+*d*M{}xd5=MO>6=kJ1|?=i3P z@mvLp?nO}ayBAyzJ_?EsC%@Y93h)x{Ujm8`{scS)d=xw#e9CK_zhiJ7_iI5tFM%=m zig5paP~}g7qT|oNv%qDqbvxo(a4z?61T~Hy0af02LGjtMZ+AO&CkTs2?*wlEkA5Az z4c5UIf`1K;fQw)6bbkjZIy?euUOxK`PVY6K=J#!&=ygAMD)@bH5PbR@eO!mYOS!)h zJR7_ZRQj)hCxUa{LN z!^iaoP;@u|j)5Nr_kt(hNvsEaId~Vi^DQp-9s|V>(ObRTlfez#ZU#m7H-n48&w^^- z6QKBeIfZCETHtZu{h<2)IdDGsICutl+}nIS&Id)O>%rr}2~hRE8PvGn6YvY5%K1Kc z9C*~*ecsOpmH%>3<6j0f4!47%(;tDGz;A<+ck|!jaj+{vJ%0cc{eJ~d-OZqUS0tXao++@0`CTo20sO= z{a*pq?jM4yz!Tr)a%C5|jr$LRYTpx}+I#NrIR6$w(dEOS@_!u^A4I?F&(8y2#O({f z9pEQGy?@rbJ^h8?MckJ_@#DL}OTa1cH1O%~@o||8sy`QjYWIu5tHB012mAskI(;2{ zI`{-AdG&K}1-S9OKJRV?b^qs}%6sY|r`rPX2=2Fl$Ai~_;@5HT1n_;}4d6qd`gzjb z&W9VpE4jZJ6dk?{?gW1dt^uF_KBxCV<&IQLomH$>ybo?}U2KY_zNbo&T759GtD*yikRqwMt2|DT}fx%fUGkDZ|IZv;iZH-h5F z-w*en2A6REEpPyQ?jLx$7Y2MWsQPaY_!00@?*9fjm5|31$4Rkna27MxMPAd@cAQu5X5S{{%k9bu8CYxdwUn22g+h zjZ5S9n>_nxa1Yl(em@s{75Fnyf0~o}dpgga51s=eDl8`PhkC)^66YgVhAE>|Qa51H# zwR#U;5B?DRTQ2?G&UL;0^8cL#{G99M;n_36k8{l@pZ=}`Zw80L{r|S7!FLM3HD8Vn z@Bf3}ujlty!OwEl`MnU_8{Xdz&f(h6C3%(q8wfYA1z*hdOwz39`bU26=F;EE+>6hj z29`k0x%}UHZtmo|iuVV@i*fKs?#~4$xL(Qc?cfbu=kxny@G7pi^7~m}^7nauT*|Zj zpLE|Up0&8H;rCd0`Fr4TJZpgC;J<*kf-6BpYxLi_^!GikNuFQGrTKXa*F#*Vaj(B4 z0>0jFqaTAso-GRZTftr2zdzgyP7HaP;3W6ga=nb-&*S=z67YAoL-bDY89d*~_3iNN zTi}^od%5Ou{RZzY0Z-(*h~L||lD|8`@8{;8>D`;S{*>zg*P~p?-(T?KL9Wkm{XN&I zTyx2L0oT9sTYrl~S&#F32fu#>&gEJbo}U7q&b5c@P2t%KdH+1F>$vn+z}hWy8Xzs3C~F8$rfJ*vk3zR3S4xW9z!c&;CC|7uWw(pBHJU+y>Q z=S^HwTq{U}*tU2?6?_d>h3h;n{k@gzZCwARoA9?E+{kq~c^8B_&gXuB-&b(m7}Bi^ z_zIrAEc_Nc%(a^9G_EaN`uhgg8C;ify^(7NSCi{l^4<&T@7Y{c?)7&wcrDj+!o5F* z*Ta2_2e0D#A6&b*ZsXElnd>O7uWf6KZ5 zD0n2-ySTo@_19ebEA#Fjzy|mP_%%J`@4Z}S=?8x`u2J6W?-dSa=Y1^v-Uhyi>r~Pd zz;z+*ar_?T+QR)NuD68e%Xl`A-!BgL@8JHgxRSpQ^J6gF{5kk)uHB?v9G(fD##QHf zJJ(n!=NJ6GA^iSLem^_>=BL}K;E%XAbNw!t{yxZchklUuEx_|bo_zt|qj&tBzF*BkNR#n+!ZbVI2!T4^=ov39c+50?W?sc(2PUJxya z4^&!v>+M!tA1~KL>A`4SJY28u8!I&Sk+>0Gebr`bEe&my3#G}pJW*-3n$f!9W=rD~ zw`-M&xKtl2Fbd6jabKCCER`DNX0z-A+iZ`I*BdSBtk>u=-D^%ZTjjB6U8%&wkcY=b z(Ww-z8y~M$iiK8%;3?dmOCqDu?KeeH2$W#^`z8}6#Z}VyTziEz_=~>lkNph%%<+$CXw5^-BZlIdlNM*F$@P0EfO1zoZ zT*=iVOCd+WCzrESZtiQS(q6nAL;ROnzTraJQ^$>za% zBk`sUW5Y;@CzG~Z+C1yhH^LONPrYj|vZ`n4V=zj_LA@DDlQl~dIt>f9AZ8&PdfY-~ zsK7CVF^raWRtiS%lleQ+sE_4Zl(3E(VmuNIh*T4hw_WxAOS{@I&#MNTL%B?hX&%IL z=QZc%lH0@zd<%nF#a2bA>PaMZ(Tvum?WHopjR^xE27bP5!^X|qHpHWiI_iZAMGBO3 zy&*}*NYrcPco=3X?u{qFiJum#d}dvU;&?<`1L9XtrzR3G@n_ z!Wb7uWKKz1mTzhoswm*fsG5?RR}6is3MCa*!92M~HqmCRf!0?_V$foJ%v!+=V5p0X zv__cMOgLkLSryaWo>^wk(Mk+YQT&PxS3Dbx-&N6z+SO#)`x8D4nI(`_Y!jmK4?{{Rd2$O&!q#*TlKA4 zppi+J)J80x89KEPv(VYi#6#Iw!OY&yt|cOb8br6%^P1@j|go`rdja&Wr76LvSE$#;asENEgP~ zl13C1ECRYk**0nkd1SClmG#ZfWXh%OEG61t&8Jui(t-J_29VTcgfwGm4j9iXsDVPG zywW9VJpZP4y|pTyU)BFc^}oV+y}2sd;AQ-OB>O{)%+N@bT9DTJYV`v(nvBrGs%7*t z2Vg^^!F{1vEMxs6Js8)ZK}@Ln>tW2rppAmNk$b6u(@V+t9*^DS=WQyDzpl@Mr1F> zP-KPCJTEmc8+#EieU6V72Y%?HdPkCJ?F_|YVKMyEyTM#a`rpyg@EpGyXS;waI<4Sl zy=o11S!Ht!ODy-WqdakAd8ls!WR!6hqPnZ1W{~k+v`ijPrzG~Aarw>-TPn5ogo*L; zL@U>tBn401y2&(N7dIs-$B0^uBte8AOqyu6%2<93lhjC}a-&CmIUl0O+u%~n^hTt~ z;#(m@5E|If>E!O_(Hv$=Tm^z-HZjXcyU{)EnkMbw0=!qo zkVhg$V&W9iV1mr~5Lj?`J|t2lON^5n^=ce=eqlU{OE#~ROCvjfq~sQcznsH%Qq`y~ zF%oho`PC^}ApyrL*<9Vx_LASIn8tpJ}hhEBJHjpGVMoDv1!Iups$nqA7S&Lzd|EmxV3?m!mCrWZ9Xzg3A{d8uRG*d&6P zBN*M<*Ij}=>uhsZOC*m|$wO3OBu~N-&DnkwA1j2Anv;8s`+iByvP_4@1|YEVN;pMt zXP47BHXGE=VxMeLGga#`nPA;5l+|6_8#f6m!y$VM1ha-QXYmXz5S@B0Ie$KjdkoG$ zYw5D(tK6NMAbLEhE+;FmfmsCy<;$EnXH>DtjKb$ z-X7gMy=3fjnl_FQH!+7g8VH;%^5AtS+V#yV%D4Zn@ z?V!Q*Mwn%uwm_1`Idqh$uHNUW|X-eVdDRdff!76MCowC&pQVa5>fiDF* zSpq554>Y685trHW$>l`+Y^+Tz;%s=pY2f++b8ZzX9Jpa1vM4A~0ga;t

bGXdaq2 z7E6+*PxQ6ZneLIS!`a>(Rv0(!#FE^_Dxt09D7;S%?)xf)y29i2(uXnyprdtT$U5%H z)TJ~}DxYn|F&@-3tE%0pENBZyOnV_O0IP{k5V1|l zY|f@r?t(9*s~rmoBX0YYSd44ApPQCy+`rJqJ5~bjg(EYY3C(BVDY>pUN z+H!4wrBSbmyE{|(azR*P7-dzZmiF%e#)H@?waF~!6%ft@X*#(=NIVVHt0A~AlFHbY z%9%sHvxnwvgY!xY)beRdud~n7y-1qnOjd`yR-1#ql-FsF7<-txqJ_(7tJVaWys40o zhl6O?s%6*Va_fMMRa=ni+Pn~LtNT*CcCz@2j#0$|!##IQC`T?Tr#JwfvuKUM7Bf9< zXi+QBSctGcjts++OPuZVP!q-* zmHp-+R*BI|kPM3|wuD|v81yy zWpddD4K>mj7E!B|xL+cng)IWPBvQ>dw?Myj*i}oi2_@QI$}eZCHMzwKHWsZJNETx{ zmcX3i@NyElw|*S1u(i2eO0uRU?`_>pLH?nnC@p==wm1kja9*EMebTG6u6CLr^Ux_P zpez997SvXy{#1VHH&H#Awu1KgY&KwrA!b<3(((kpfp!q}UU@vQ7j{CaiuYXzi!U$!$ibk~sI=mTXuvWs?Gi!FG3s(Dl8IS@Ra69qX^!fI4RBjgTob)Z=4t zxu%{BRy4~B1s$l})?q@$v&@*L-oA753n-lJ6Bb1YoM6j3UH#c%Ni{v-TTK;T{OQ=} zq}46jry=q*(T?uD2~6@}TV`g5d4CeDP$FuKaZ<2Lbq zrjC@Nu2}8#ol{AIpl~rzk-pP*fXVjn?7r>Qa6fWqhznLq|8X8r8qFyGNTp>4X!k1-sY_Ds!aaref+9(VJ=m)83+ylIOcX@I!X%iZQj-kG zO?h3)pw)&74B56JmeBJ>1FwoCxNRP_A1*V^B^W{++2w?0txJ1T#l=PO;4Uo>E1%w} zq6PV4^6TgE!0w!EoFS`9G7mi-lnQbO*ceiCDP1Y1BI-_5W|B_(e~k4>>sEbEr7$r0 zER0M@Jngv+3sZKOMHdA~RZZKh5vho|(r9zzW>H(iEUz9I3FHAbY9`5jVFU4|N)zwR zOs*Lkp*=9ZzcA}svc0uZD^}aKbz|Tx29#393$4AG%|U;<+pPrAt|a~jk+gls<@mVd zmBp@6?Yp!_(KTatCHtBF3+K+FqSb0^2T%WHHHO*6Fl&wuYlwj2$#X z3Ta7+nrww5E6FxZVwe@$Rd#gQFsE)QW-QJ%+%C&2nlX=Y+DyqcXV9ZCZQ5wx@!DN3 zjH*3zRfNDzZMMa_4VW{7r)8)UU1HN>Ce6%82VyGL+)m2sd@X^mG(6k?I)T$04vq$b;>)!pml{X*N4 zqqk|eD&JbO-?1|>u-G&tb4i^fh3({sy)(X8BMNl%+V|OYCS__OhPAOHEhAg(Pm*GI zwd$BnCI)@in<9kC>%iHjQDC)B!$p+U+LhLYEDpfP*O}f86dEStkf|THgDB7pE-(`} zU4F#XwgDiz#+()T?KWvT)(=ysr3ojo3Sw>x8Hk-2S$hUy$mUNwR!utMT-{Q5be%I zw9pCCQPJ-8t}cRPX9%in*%~fmtIFraKU6i*?qaXJ$T=6NzBQ2%F?6gD1XR(&hE-O@TM`r~`VwaavCG2Nc{L<%To5?fU0oRO-on-9 zx_Uuck@mCdYZ17(9A&=9bL(hoITAhc;f@j&j)NK$P|aY3;Eko^)?S zZ5<$}U>i}(O>#6E?QuB|_2C;eaWn3he0Kel-;LGzUd!ufklqQZ7KAeX^DiwRM_BUk z)w~gp;raq#B15ARp$hFAcQ+<81IpIE8Q&_{XUX=+@7a^B`Si;r8J|oXyt7K7Z|&xo z&+xWB9)(CZ=CVlV3u)2b@lb3E?x(M&O^@wQKu&2R-`WV~r+*L#~)XE1;&W;c^Qn7F)ah;US z_#kO;@q+Yu2#=?3s-$(go!(5WsF&zSMMPx+K4j%%6k`;6G4bRv@7|#n?;cNQK<-@< zpKQ1&@z{jqfqf_dzv&}0n$d%RNeX77?WLApVa*`T8O$D&s|$KQy}{&dcMp?tll-(@ z4QLMsdFoM@Y=eB~dfZ%N-?`CY-isohw2RYc$f>!CSwBOHc5SvPtp1RE)-8}Mg2KLx zH_8H&9HqWJ)k5)J)K?c}o=w1wSVMl@ER24Qh^DxdHi0g8Xf zcP+MOgGo0|H^Vmzd?FI1jgWJ%Z{sW=p~1=8M51Zi$uh;mmM+L5*;$A?K79!KKB%<_ zo13pXacUqbo_&;+?^8C>X0lHP#|jgbvG!QZI&9iuwnc?qcGE*r^6Zjnm1;URD2#P0 z|DHNroxzm!)zSQDpskaZELps8@nS@rl%@ypvJNQR524kFrb6F(AGI@Qz)8dteJX;1 zN)<_bD5XDd-PraRVHQYFUzio1-F2=brq4q-)B6%6S|T_}q~QH%jr|?DC`W2N9q#?= z!zI|!FM%6<&3JdTpZEwQ>ZjFbel2O!Q?2*SW^yb_=V6#6;sTEtF^DiG+^Yo~H``=t z4!QE_HBLJkb=e<7n@dC2__vDeDJ06g=<*HgE}L^zS>MABZEcQLN<){nN1H>tSnHm% zWBab5^%5UU)S=6eA}iyii_qUB`cS&7+So1@nRAVU4^93gziYUgxB$s zi&ieZ@LcjOp0kB-IEHp1BAP`0eWYc%7u6f1YvB$-i7y&;w&pI zly@G{#|mFHXr{9Kw8j=}vvg`Cl5S{2_}+YFykfZ0nzN(IC$H6^jp%kFB(-t7ZLV3$ z8ixH`Q;W}B6E9gc=LJJs3fc)jUMLN1m@x9@Dd?10v2w}MbD5xvNxn%7o=%lCC%Z-3 z+OHM7%LOFcQOC|}QMgkkkPxEG;Ujr{8m~>p#mdwJ>`Ots?w>k@$y4b5TD}rKi@zfI zu{HUT`(R$*EECh!ekr7Xqpig;f5wmS#e9Oz=;3?kH6MNmZ>JVd@}V#arO=oR?6%)^qT~rtWKte)`^i8bys52{C7W zy;5})84v&V-iT0|x^IG6hI+8?@M+I5WJ7mT`^s$@|RkWpoOF;1#|sn2*2 zFHHiH_LGnHnbvLiy)v|8jkgrfr7ZZ-D-#NF)mFpFvQAgpwL*+1T10u+ za1S>$#)BLmut1~V5j#cObsim%b?VnGEu1Nk6(r^{66cvV*KCYBylx)@+fyQ8E(@vN z5XXyYMLY(mL)@1J_?o(wXQ7@2&11_=kKAEL%;B0bbMElPLDp5AwnDADEB(sYNUYp8 z@MQU)R1bEgM;PRLfq!E>kefGQA~Dr^&LyN>rCC1wB+4=~fBmQf1QkwVu6i~ta}bG@ z7Ump#J%VzWgd0s#_D-KKzA$y)!DyYSMICYAvydHMh2i>y9e*HU(-enDrsc|mBVeJH z_a{B~AjmQ#H}5C#s!cZ+ryd~0gBA#)JR1haP}N#Dg21!SS3^1D1=}~1imvI&MHLK) z-sxF@lq_bHOa(S+L2aO1Bc#vtMVE{XPd&h=f^|0Bq*eG=MP%u5T7sm%nqY35>7bmF zMQw3nf+TnL(4_ex3L9Y+U6YH&BH35yHtn|1sR>Ui{ff@yOt-{gsuV;6ouwdCi7`v2 zaHqkPngTNwRD&3DOf`n+3=N{r*%&Kei#F=RVhiI&R&+6qyG*i&@10KzT+Q3oOWbP( zvfc2K#AL`SB@|^iNuj`e$S5{<{#;d6&rVb*Pe@83PBjtQYPUCu&a;fyDojYDDS#pa zM@tC{?MXa!k6B_enngVTi=DY7OHjtU$eI|pslkLLYX)PG4e9gQREo*Z=L2rz z!&2PIpoq2SPp37oR#rC+9!_j9@;%vdgBOulXuoFm#1wpz*_leM3gnX|g~mr3%MM}S ze15jg&^_GHBvdlZot78e2??yEv_yCxez+%e6i9B+?G zObLO62z(~@)JN-bIfERWUK*niTZxBQ`^!YPWcBFOgE>kh1A|P5Sf)Mf_y{W8Unnxf zt5_aUKY3T+hr6=U@mlA#!+H81C6Oz$L-8>Zhu3|^L`gJ4y355Cg<+scpsD$X_}E3f zI%7xDn>ID2A?J~oOf;6v*k=qUqr;FN?oZS3&SWZ-E|gOh(fQiEXMgW2?VYbf?)3X) zuU!rDwsGvj^hfjfG%RVQ+-@hJ`LFOu>f3hKlTX9 zwNAJtq5JefqFsFqtIiTVkrY;FRnOOGlW^=wN?AOt$}n~rTYS35FL{MNX%_snlr$UD zFEMKS)tO6@j&F`_k&!Lzp00t;Wy;EZGD#_bSYOxVb#Ji`13}{H?+InwhSzG2jxrN< zj7B@iwN$jHT-Nh-{}Na@*C}k8%)NLBqfkLaPG0OisBJ!J<9&~j3vYT2oVkQX38W8^ zLcE)>gFDww%?7!SHg%KW9cghQ#QjX!c^4R z5b;XcEF?kOvVPvppJ@{hBRpnGm(kWVut(UZm6yrk0w?N07VXmP5QZU+nwx;VspQ#v ziPKyO@GxRr=YYT(eFonpqN%KLjNdBi4{h9Y^1DyppZoC+I4MMfZAKGJYz_))3UYO)B{aioYM)Yg{`9Ts!)og5Bo_~{|O z8|wu6;r6LRW?L^|yO3nBB!s3bpM&$k&v0w%!TmaDcpe9gmBrX}!Wh9VXj?CP|H^z4+h0FlT0*vAGF zC)gxbD4^r$le7#cgvCCB9V}&+gr;W2kTYe-9o*7YW#06jsRVW>`oS-0{&jd1EKYY9 zkl2v$s{2G10WT`3Bt_kj>yO-U1D;vq%akbNB+8)JLMGKsqWT`BN@37eEQ9kM`(Z6Q zpru(>#05o@6o$eqyDlWgCYJ3jYur2)*O;|JyGSZmBtPqVWHrk@tT2%wmzg%?^Ug5I z%@s9U#v+u>HiIk@lsg(DS2htVhmjhIt(`_xJA_ep<~*x)cE|J2mgNEor+Z52gh40w zoaT0F42Q#;f^TZ8W`TH#G&LHGn;Ka%;O*+ld!F{9;pa;@>#-&P196^`;1j1 zq|CI?=F`2}p75;;-XeyVCfVjW_S8f%zIsM!j%h;24GnSDZ zLzB+coVgH4G<}A2#4GZ$(*j~zBd{IHF6qk?9FA$rlhw{ZM?NDfUb(nOt_?g@cr4n& z%u_hUV$cZ{74HcVeUF-E~1dwmkU}JF*Hjf0D?0jySCI+t#RrgIQF|jn1@pY0b8a zD|zk9O}UKj0^}IDz`hS0YsE(yv|P%xdiH#>!k&BO=anW^p#0o|%;mLOb`Ww;0~8iQ z$d{olJQ)QcR*pjX36f`~LbNk{Rn49~wpp>uV_^{TEGT;zC|fj^uY7@cscj}25f>4(({4zKj@L;B=m^y`h9hZ@q^sWPT{^%ybCudaD> z8S!8J3m+_%!9R$L;lgAG4Z{R0!JH z3R{oXC*qja8)*^|)xUfsqVLX1i!U_#m7c8Ls`Tld>Qe_S=M`uNSz5^qedtq5(iJ(G zt|tQRU@$Yi13Q_(KK!Tz-!4c0kRKM}<1(*eDA!G$U!w?m05QPM&Ej+NTiuBU<23Ln`T3Yb^hu!UTI|AE?1y z?m4LAq|nYC+mZgVcO87+r|D1nUmdOxgruJ$o5iiEu5bUvY8C=L_Frrcb%?; zeGXBebaK3sZR(llTZy1|uo68=nc9L3k|w$>Pa_4x1{TJNUEliIXH}q?|8%W&_3EAv(k$5*~CFLnE+u@ z`cX` z>Lk*%0umCb%0L!lOFzU3RR@8R?r1KV?JrXMi11cZnnhAg6C+L-X^Va)`z|#Isv)Nl z5_)0C1jCf6Y8PL|3lbEC~z01BpiG@4gQRj2IXlz`z4IZTd?28po zx)jT#AY5Q8e);!hn7mApYJmr)@}~|Z211=fme?iAKLjN=on~RX(iX`AL6DV6Ii*}^ z(FI1ihu?-_WB&{uGoSg8d_N)?mbZ`LHpy;L)|Y(rfOcxYP3B2Zbtruwc9m+03ekuT zGfd=;t!Cr+sX*H8WhRGLnUO=zj_(VSmqrqF3;(K-OIyr?>|+d*PO@L^Gm~|~`o(K=rlY;iaQAEI`~K9ZN+kLihTHi@SWSp+CGQh1ZZJaA>$ zBRV}oWZarrg4)59oOG4uK3qU5O-S*OKubeYe7(^lG-N)D8wIeG@`Z1o!g{?L7Xoj;IWH{qaZ94>5^-tdi~MbeR26EdHfcXUz`-TD+qai7Mbw-5qryhWxwIj!LqRMu&LK@2SuX8obix1u$*Vz;% zku?eD730CQtVu#Up)Cut>7%(7_u8A7=_EeHCDwR2wgAJarcVCnOoSVzQvWTCrxOHYw+;BI>#jh1OxZk z8mNhLrnFApve6OITu+tJ7g?kR0Rac)y3^6H4zA?%4mg8NiTUI<=@~SXm>tG7Nl4z< z<}7bjsM7|U-Hi7o9A#YRyiJ4kJoGZZqfufH=8?K+N0&b)~kO=c$+>=sVyN?;4(fmC~?ZO&f}6QNt-^~ z5))B6%i@SV*lxtmw)o^oC=+c)+BGq8*jA~}vTVu6n@IodAaNEbVOH%J$+=(C8sABH zDyiuoKIJ?D^lgO=G8nbJcz83G+Bh2uO9ROkMlqx9d$hyFBsn|DZ+oUtVjXjV+Vf+z zE?BLMu6YrfXD-QU$8>9bV-oIjUEKX$0K>+?LG1>gTu$4ZnX3SK(eWu=$1!Bo8kQp= zvlPed)>S);PfsONQTi_6$*;3^7T9$}*@nck3AD-x0W&ia`b;75x1;`vJA542CiPpq z*l3r95Aua4ai3(DMY-1ssdihjlbC(fwjcN~dqToiu&zuLpq;!8TeVV9KYMTAaBaZn z3}27HViGOkxHI`+Y4xE8*%Mm_wK$782WG$^B9k2&VzWHQ!r0Wb=~)vj{fEfe1&%fC)ZWVGOc<_IK(%4}@6 zMH~s{y!Oad-FZZMvVx-X)z)vGdTV;Xnk0>{4zL(sXen+Pi84?kaV}x>5{!>exz21Rxw~CQe~7Qf`*EtNCMl-B-;-mk4t%pdLt z_D?VS;4M9jI3&a{X8`dJ1R_0saO@k?w#xOGVoC(KA$4^8gEyoilxO=HM5s@cZMoUb z{c0P-nbqT3lm60jP2#}jZXuZB^jXV9=#$jWfb%s=8@muw58EMSa%mQA3JxstqcmdW z2F03uTNE}LMYMwre)@2-%YftsS=v?Gw3<%_A9sgel4NjsmPgAg`d5J&a82c;2>yYo z&YEBozNaafh0Q*d5}y_&Y1OLE>Nw=5QDtl3g&pX~CI* z>EUtF;gitWhwr@wK2GNhOqP87i=hhla+q9{1{ac3<8V>ZqvYTeH=fMi=41GdJ8J0S zBj%ybi%Vo9|2!sy(-e^b*Dmi*by(u_Q9Wltu1}`qrv)V-!&)cOnfBrFv~P_&r-Z7=CQ>~3@V#~()58y$fSaDVbB^@Q z9M3dA(^|R?nCn|9Y?6}$5=%APZlGK zTd!}Won1#`Hxv|4XQjBtH~WO(fj%Oa3Yk7~zfMVUlTbyGv-+4Y1^Yr$N1wG2iRt`F zf)l=X)Hsnuml#6r6PUZn#~<4JRPMK5|xEauUc^aC2SI z?Di-u&6oUyAV_VqaFfqLxcel(HnK1(a@CeDVe#h`9Xq1 zm`M6(y|w#Ej+-dSB$DP4drHRpIu6`SW6YHe8an?Z(`l&=&0aH%p}erp1P5hrJJniH ziBYOm=!zDWle)>6xA\n" +"Language-Team: Asturian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Launchpad-Export-Date: 2010-01-04 18:12+0000\n" +"X-Generator: Launchpad (build Unknown)\n" +"X-Poedit-Language: asturian\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributu inesperáu «%s» pal elementu «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "L'atributu «%s» del elementu «%s» nun s'atopó" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta «%s» inesperada, esperabase la etiqueta «%s»" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta «%s» inesperada dientro de «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Nun pudo atopase dengún ficheru de marcadores válidu nos direutorios de datos" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Yá esiste un marcador pal URI «%s»" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nun s'atopó un marcador pal URI «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Denguna triba MIME definida nel marcador pa la URI «%s»" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nun se definió dengún flag priváu nel marcador pal URI «%s»" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nun s'afitó dengún grupu nel marcador pal URI «%s»" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Denguna aplicación con nome «%s» registró un marcador pa «%s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Fallu al espander la llinia d'execución '%s' con URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "La conversión dende'l conxuntu de carauteres «%s» a «%s» nun ye sofitada" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nun pudo abrir el conversor de «%s» a «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Hai una secuencia de bytes nun válida na entrada de conversión" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Ocurrió un fallu durante la conversión: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Hai una secuencia parcial de carauteres nel final de la entrada" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nun puede convertise'l fallback «%s» al conxuntu de códigos «%s»" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "La URI «%s» nun ye una URI absoluta usando l'esquema «file»" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "El ficheru llocal na URI «%s» nun tien d'incluyir un «#»" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "La URI «%s» ye non válida" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "El nome del anfitrión de la URI «%s» ye non válidu" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "La URI «%s» caltién carauteres d'escape inválidos" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "El nome de la camín «%s» nun ye un camín absolutu" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "El nome del anfitrión ye non válidu" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Ocurrió un fallu al abrir el direutoriu «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nun se pueden asignar %lu bytes pa lleer el ficheru «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El ficheru «%s» ye enforma grande" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ocurrido un fallu na llectura dende'l ficheru «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Ocurrido un fallu al abrir el ficheru «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Ocurrió un fallu al algamar los atributos del ficheru «%s»: fstat() falló: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Ocurrió un fallu al abrir el ficheru «%s»: fdopen() falló: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Falló al renomar el ficheru «%s» a «%s»: g_rename() falló: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ocurrió un fallu al criar el ficheru «%s»: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Falló al abrir el ficheru «%s» pa escritura: fdopen() falló: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Ocurrió un fallu al escribir el ficheru «%s»: fwrite() falló: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falló al escribir el ficheru «%s»: falló fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falló al escribir el ficheru «%s»: falló fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Ocurrió un fallu al zarrar el ficheru «%s»: fclose() falló: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "El ficheru esistente «%s» nun pudo desaniciase: g_unlink() falló: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "La plantilla «%s» ye non válida, nun tendría que caltener un «%s»" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» nun caltién XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KiB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MiB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GiB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Ocurrió un fallu al lleer l'enllaz simbólicu «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Enllaces simbólicos non sofitaos" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nun pudo abrise'l conversor de «%s» a «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Nun puede facese una llectura en brutu (raw) en g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Dexarónse datos non convertíos nel búfer de llectura" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "La canal fina nun caráuter parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Nun puede facese una llectura en brutu (raw) en g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Ocurrió un fallu al abrir el ficheru «%s»: open() falló: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Ocurrió un fallu al mapear el ficheru «%s»: mmap() falló: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fallu na llinia %d, caráuter %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Testu codificáu como UTF-8 nel nome non válidu; «%s» nun ye válidu" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» nun ye un nome válidu " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» nun ye un nome válidu: «%c» " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fallu na llinia %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Asocedió un fallu al analizar «%-.*s», el cual tendría de tener un díxitu " +"dientro d'un caráuter de referencia( por exemplu ê) - seique'l díxitu " +"ye enforma grande" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"El caráuter de referencia nun fina con puntu y coma; probablemente usaste un " +"caráuter «&» ensin pretender aniciar una entidá - escapa'l caráuter \"&\" " +"como &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "El caráuter de referencia «%-.*s» non codifica un caráuter permitíu" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"La entidá '&;' ta vacía; les entidaes válides son: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "El nome de la entidá «%-.*s» desconozse" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"La entidá nun fina con un puntu y coma; probablemente usaste'l caráuter \"&" +"\" ensin la intención d'indicar una entidá - escapa'l signu \"&\" como &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "El documentu tien d'entamar con un elementu (por exemplu: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"«%s» nun ye un caráuter válidu de siguio del caráuter '<': nun tien d'aniciar " +"el nome d'un elementu" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Caráuter «%s» impropiu, esperabase un caráuter «>» pa finar la etiqueta vacía " +"del elementu «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Caráuter impropiu «%s», esperabase'l caráuter '=' dempués del nome d'atributu " +"«%s» del elementu «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Caráuter impropiu «%s», esperabase un caráuter '>' o '/' pa finar l'aniciu de " +"la etiqueta del elementu «%s» o opcionalmente un atributu; tal vez usaste un " +"caráuter que nun ye válidu nun nome d'atributu" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Caráuter impropiu «%s», esperabase una marca d'apertura de comilles dempués " +"del signu igual al da-y valor al atributu «%s» del elementu «%s»" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"«%s» nun ye un caráuter válidu de siguio del nome del elementu de cierre «%s»; " +"el caráuter permitíu ye '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "L'elementu «%s» foi zarráu, nun esiste dengún elementu abiertu" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "L'elementu «%s» zarróse, pero l'elemento que ta abiertu anguaño ye «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "El documentu taba ermu o namái caltenía espacios en blancu" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "El documentu fina inesperadamente xusto dempués d'un '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"El documentu fina inesperadamente con ementos todavía abiertos - «%s» foi'l " +"caberu elementu abiertu" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"El documentu fina inesperadamente, esperabase un caráuter '>' finanando la " +"etiqueta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "El documentu fina inesperadamente dientro d'un nome d'elementu" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "El documentu fina inesperadamente dientro d'un nome d'atributu" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"El documentu fina inesperadamente dientro d'una etiqueta d'apertura " +"d'elementu." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"El documentu fina inesperadamente dempués de los signos igual que siguen al " +"nome d'atributu; ensin valor d'atributu" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "El documentu fina inesperadamente dientro del valor d'un atributu" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"El documentu fina inesperadamente dientro de la etiqueta cierre del elementu " +"«%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"El documentu fina inesperadamente dientro d'un comentariu o procesando una " +"instrucción" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "oxetu corruptu" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "fallu internu o oxetu corruptu" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ensin memoria" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "algamóse'l llímite de «backtracking»" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "el patrón caltién elementos non sofitaos pa una coincidencia parcial" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "fallu internu" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"nun se sofiten referencies anteriores como condiciones pa coincidencies " +"parciales" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "algamóse'l llímite de recursividá" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "llímite del espaciu de trabayu cuando s'alcancen subcadenes vacíes" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinación de banderes de nueva llinia inválides" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "fallu desconocíu" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ al final del patrón" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c al final del patrón" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "caráuter non reconocíu dempués de \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"equí nun se permite escapar les lletres (\\l, \\L, \\u, \\U) (mayúscula y " +"minúscula)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "númberos fuera de rangu nel cuantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "númberu enforma grande nel cuantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "falta la terminación ] pa la clas de caráuter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "secuencia d'escape non válida na clas de caráuter" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "rangu fuera d'orde na clas de caráuter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "na que repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "caráuter non reconocíu dempués de (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "caráuter non reconocíu dempués de (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "caráuter non reconocíu dempués de (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Sólo sofitense les clases con nomes POSIX dientro d'una clase" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "falta'l ) de terminación" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ensin ( que lu abra" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R o los díxitos (?[+-] deben tar seguíos por )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referencia a un subpatrón non esistente" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "falta ) dempués del comentariu" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "la espresión regular ye enforma llarga" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "falló al obtener memoria" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "la comprobación «lookbehind» nun tien una llonxitú fixa" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "númberu o nome mal formáu dempués de (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "el grupu condicional caltién más de dos rames" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "esperabase una comprobación dempués de (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nome de clas POSIX desconocíu" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "los elementos POSIX recopilaos nun tán sofitaos" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "el valor del caráuter na secuencia \\x{…} ye enforma llargu" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condición nun válida (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "nun se permite \\C en comprobaciones «lookbehind»" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "una llamada recursiva podrá criar un bucle infinitu" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "falta'l terminador nel nome del subpatrón" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dos subpatrones tien el mesmu nome" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "secuencia \\P o \\p mal formada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propiedá desconocíu dempués de \\P o \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "el nome del subpatrón ye enforma llargu (máximu 32 caracteres)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpatrones con nome (máximu 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "el valor octal ye mayor que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "el grupu DEFINE caltién más d'una rama" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "nun se permite repetir un grupu DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opciones NEWLINE inconsistentes" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g nun tá seguíu por un nome de llave o un númberu distintu de cero con una " +"llave opcional" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetición inesperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "desbordamientu de códigu" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "desbordóse l'espaciu de trabayu de compilación" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "nun s'atopó'l subpatrón referenciáu anteriormente comprobáu" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fallu al coincidir cola espresión regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE ta compilada ensin sofitu pa UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "La biblioteca PCRE ta compilada ensin sofitu pa les propiedaes d'UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Fallu al compilar la espresión regular %s nel caráuter %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fallu al optimizar la espresión regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "esperábase un díxitu hexadecimal o «}»" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "esperábase un díxitu hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "falta «<» na referencia simbólica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "referencia de símbolu ensin finar" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referencia simbólica de llonxitú cero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "esperábase un díxitu" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referencia simbólica illegal" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "final '\\' perdiu" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "secuencia d'escape desconocía" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Fallu al analizar el testu de reemplazu «%s» nel caráuter %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El testu entrecomilláu non entama con un signu de comilla" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Falta una comilla na llinia de comandos o n'otru testu con comilles de la " +"triba shell" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "El testu fina xusto dempués d'un caráuter '\\'. (El testu yera «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"El testu finó enantes de que s'atopará la comilla correspondiente con %c (El " +"testu yera «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "El testu ta ermu (o namái caltién espacios en blancu)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Ocurrió un fallu al lleer los datos dende un procesu fíu" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Ocurrió un fallu na creación d'un conductu (pipe) pa comunicase col procesu " +"fíu (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ocurrió un fallu al lleer dende'l conductu (pipe) fíu (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Ocurrió un fallu al camudar al direutoriu «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ocurrió un fallu al executar el procesu fíu (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de programa non válidu: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Cadena non válida nel vector del argumentu en %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena non válida nel entornu: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directoriu de trabayu non válidu: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Ocurrió un fallu al executar el programa auxiliar (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ocurrió un fallu inesperáu en g_io_channel_win32_poll() al lleer datos dende " +"un procesu fíu" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ocurrió un fallu na llectura de datos dende'l procesu fíu (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ocurrió un fallu inesperáu en select() lleendo datos dende'l procesu fíu (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ocurrió un fallu inesperáu en waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falló al bifurcar (fork) (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ocurrió un fallu al executar el procesu fíu «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Ocurrió un fallu al redirigir la salida o la entrada del procesu fíu (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ocurrió un fallu al llanzar el procesu fíu (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ocurrió un fallu desconocíu al executar el procesu fíu «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Ocurrió un fallu al intentar lleer suficientes datos dende'l conductu fíu (%" +"s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "El caráuter atopáse fuera del rangu pa UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "La secuencia na conversión d'entrada nun ye válida" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "El caráuter atopáse fuera del rangu pa UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Usu:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCIÓN...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opciones d'aida:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Amosar opciones d'aida" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Amosar toles opciones d'aida" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opciones de l'aplicación:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nun puede analizase'l valor enteru «%s» pa %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "El valor enteru «%s» pa %s ta fuera de rangu" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nun puede analizase'l valor duble «%s» pa %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "El valor duble «%s» pa %s ta fuera de rangu" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Fallu al analizar la opción: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Falta un argumentu pa %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opción desconocía %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Nun pudo atopase la contraseña de ficheru válida nos direutorios de gueta" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nun ye un ficheru regular" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "El ficheru ta ermu" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"El ficheru de claves caltién la llinia «%s» que nun ye un par valor-" +"contraseña, grupu o comentariu" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupu non válidu: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "El ficheru de claves non entama con un grupu" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de claves non válida: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El ficheru de claves caltién una codificación non sofitada «%s»" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El ficheru de claves nun tien el grupu «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El ficheru de claves nun tien la contraseña «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"El ficheru de claves caltién la contraseña «%s» col valor «%s» el cual nun ye " +"UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"El ficheru de claves caltién la contraseña «%s» que tien un valor que non " +"puede ser interpretáu." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"El ficheru de claves contién la clave «%s» que tien un valor que nun se puede " +"interpretar." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"El ficheru de claves caltién la contraseña «%s» nel grupu «%s» que tien un " +"valor que nun puede ser interpretáu." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "El ficheru de claves nun tien la contraseña «%s» nel grupu «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" +"El ficheru de claves caltién un caráuter d'escape al final de la llinia" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El ficheru de claves caltién la secuencia d'escape non válida «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "El valor «%s» nun puede interpretase como un númberu." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor enteru «%s» ta fuera de rangu" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "El valor «%s» nun puede interpretase como un númberu de coma flotante." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» nun puede interpretase como un booleanu." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de conteu pasáu a %s ye enforma llargu" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "El fluxu ya se zarró" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Encaboxóse la operación" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "Socket incorreutu, non anicializáu" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Hai una secuencia de bytes nun válida na entrada de conversión" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "Nun hai abondu espaciu pa la direición del socket" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Anicialización encaboxable non soportada" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Triba desconocía" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "triba de ficheru %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "triba %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final de fluxu inesperadamente prematuru" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Ensin nome" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "El ficheru d'escritoriu nun especificó'l campu Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Imposible atopar el terminal requeríu pola aplicación" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Nun puede criase la carpeta de configuración de l'aplicación %s del usuariu: " +"%s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nun puede criase la carpeta de configuración MIME %s d'usuariu: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nun puede criase'l ficheru d'escritoriu %s d'usuariu" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definición personalizada pa %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "la unidá non implementa la espulsión" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "la unidá nun implementa la espulsión o espulsión-con-operación" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "la unidad non implementa'l sondeu pa medios" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "la unidá nun implementa reproducir" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "la unidá nun implementa detener" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nun puede manexase la versión %d de la codificación GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Númberu de tokens (%d) mal formaos na codificación GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nun puede manexase la versión %d de la codificación GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Númberu de tokens (%d) mal formaos na codificación GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperabase un GEmblem pa GEmblemedIconjo" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operación non sofitada" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "El puntu de montaxe conteníu nun esiste" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Nun puede copiase sobro'l direutoriu" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Nun puede copiase direutoriu sobro direutoriu" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "El ficheru destín ya esiste" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Nun puede copiase'l direutoriu recursivamente" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Enllaces simbólicos non sofitaos" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Fallu al abrir el ficheru: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Nun puede copiase'l ficheru especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "El valor del enllaz simbólicu dáu nun ye válidu" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Nun ta sofitao mover a la papelera" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Los nomes de ficheru nun pueden caltener «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "el volume nun implementa'l montáu" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nun hai denguna aplicación rexistrada pa manexar esti ficheru" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "L'enumerador ta zarráu" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "L'enumerador del ficheru tien una operación excepcional" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "L'enumerador del ficheru ya ta zarráu" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nun puede remanase la versión %d de la codificación GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Datos d'entrada mal formaos pa GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "El fluxu non sofita query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Nun se permite guetar nel fluxu" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Nun se permite truncar nel fluxu d'entrada" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Nun se sofita'l truncamiento nel fluxu" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Númberu de tokens (%d) incorreutu" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Non esiste la triba pa la clas de nome %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "La triba %s non implementa la interface GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "La triba %s nun tien clas" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Númberu de versión mal formáu: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "La triba %s non implementa from_tokens() na interface GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Nun puede manexase la versión proporcionada de la codificación d'iconu" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "El fluxu d'entrada non implementa la llectura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "El fluxu tien una operación excepcional" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Nun hai abondu espaciu pa la direición del socket" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Direición de socket non sofitada" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Nun pudo atopase la triba de monitorización del direutoriu llocal " +"predetermináu" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome de ficheru nun válidu %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fallu al obtener la información del sistema de ficheros: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Nun puede renomase'l direutoriu raíz" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fallu al renomar el ficheru: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Nun puede renomase'l ficheru, el nome ya esiste" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nome de ficheru non válidu" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Fallu al abrir el ficheru: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Nun puede abrise'l direutoriu" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Fallu al desaniciar el ficheru: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fallu al mover a la papelera'l ficheru: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nun pudo criase'l direutoriu papelera %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Nun pudo atopase'l direutoriu de nivel superior pa mover a la papelera" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Nun pudo atopase o criar el direutoriu de la papelera" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nun pudo criase la información de papelera pal ficheru: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nun pudo unviase a la papelera'l ficheru: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fallu al criar el direutoriu: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de ficheros nun sofita enllaces simbólicos" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fallu al criar l'enllaz simbólicu: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Fallu al mover el ficheru: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Nun puede movese un direutoriu sobro un direutoriu" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Falló la criación del ficheru de respaldu" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fallu al desaniciar el ficheru destín: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Nun se sofita mover ficheros ente puntos de montaxe" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "El valor del atributu de ser non nulu" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Triba d'atributu non válidu (esperabase una cadena)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nome extendíu del atributu non válidu" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fallu al afitar l'atributu estendíu «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Fallu al amosar información del estáu del ficheru «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codificación non válida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" +"Fallu al amosar la información del estáu del descriptor del ficheru: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Triba d'atributu non válida (esperabase uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Triba d'atributu nun válida (esperabase uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Triba d'atributu non válida (esperabase una cadena byte)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Nun pueden afitase permisos n'enllaces simbólicos" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fallu al afitar permisos: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fallu al afitar el propietariu: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "l'enllaz simbólicu tien de ser non nulu" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fallu al afitar l'enllaz simbólicu: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Fallu al afitar l'enllaz simbólicu: el ficheru nun ye un enllaz simbólicu" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fallu al afitar o modificar el tiempu d'accesu: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "El contestu SELinux tien de ser non nulu" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fallu al afitar el contestu SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nun ta activáu n'esti sistema" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Afitar l'atributu %s nun tá sofitáu" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fallu al lleer del ficheru: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fallu al guetar nel ficheru: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Fallu al zarrar el ficheru: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" +"Nun pudo atopase la triba de monitorización del ficheru llocal predetermináu" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fallu al escribir nel ficheru: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fallu al desaniciar l'enllaz de respaldu antiguu: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fallu al criar una copia de respaldu: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fallu al renomar el ficheru temporal: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fallu al truncar el ficheru: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fallu al abrir el ficheru «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "El ficheru destín ye un direutoriu" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "El ficheru destín nun ye un ficheru regular" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "El ficheru camudóse esternamente" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fallu al desaniciar el ficheru antiguu: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Proporcionóse un GSeekType non válidu" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Petición de gueta non válida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nun puede truncase GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "El fluxu de salida de la memoria nun ye redimensionable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Falló al redimensionar el fluxu de salida de la memoria" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "el puntu de montaxe non implementa'l desmontáu («unmount»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "el puntu de montaxe non implementa la espulsión («eject»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"el puntu de montaxe nun implementa desmontáu («unmount») o desmontáu-con-" +"operación («unmount_with_operation»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"el puntu de montaxe nun implementa la espulsión («eject») o espulsión-con-" +"operación («eject_with_operation»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "el puntu de montaxe non implementa remontáu («eject_with_operation»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" +"el puntu de montaxe non implementa averiguación de la triba de conteníu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"el puntu de montaxe non implementa averiguación de la triba de conteníu " +"síncrona" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "El nome del equipu «%s» contién «[» pero non «]»" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "El fluxu de salida non implementa la escritura" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "El fluxu d'orixe ya ta zarráu" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fallu na resolución de «%s»: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fallu na resolución inversa de «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nun hai dengún rexistru de serviciu pa «%s»" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Nun ye dable resolver temporalmente «%s»" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fallu na resolución de «%s»" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Socket incorreutu, non anicializáu" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket incorreutu, falló n'anicialización darréu de: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "El socket áa ta peslláu" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creando Gsocket de df: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nun pudo crease'l socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Especificóse un protocolu desconocíu" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "nun pudo obtenese la direición llocal: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "nun pudo obtenese la direición remota: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "nun s'escuchó: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fallu al vinculase a la direición: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fallu aceutando conexón: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Fallu coneutando: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Conexón en cursu" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Fallu coneutando: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Incapaz d'obtener el fallu pendiente: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fallu al recibir datos: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Fallu al unviar datos: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fallu al pesllar el socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Esperando la condición del socket: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Fallu al unviar mensax: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage non sofitáu sobro ventanes" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fallu al recibir mensax: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Fallu desconocíu al coneutar" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "L'escuchador yá ta peslláu" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "El socket amestáu ta peslláu" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nun puede manexase la versión %d de la codificación GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Esperábase 1 mensax de control, obtúvose %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Triba inesperada de datos auxiliares" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Esperábase un fd, pero obtúvose %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "fd inválidu recibíu" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Fallu al lleer d'unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Fallu al zarrar unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Sistema de ficheros raíz" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Fallu al escribir n'unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Esti sistema nun almite direiciones abstrautes de sockets de dominiu Unix." + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "el volume non implementa la espulsión" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "el volume nun implementa la espulsión o espulsión-con-operación" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nun puede atopase l'aplicación" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Fallu al analizar l'aplicación: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Nun se sofita URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "los cambeos d'asociación nun tán sofitaos en win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "La criación d'asociación nun tá sofitada en win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "ensin memoria" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "fallu internu" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "El nome del anfitrión ye non válidu" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "La secuencia na conversión d'entrada nun ye válida" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Algamóse'l llímite máximu del array de datos" diff --git a/po/az.gmo b/po/az.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b3386ce70f7496cb7d878395978ee8dff5f4a019 GIT binary patch literal 10930 zcmd6tTZ|;vS;vpV;>5cNPMqLy3FKgVwr9xn?9A-O-puT-y_Z>gZEtL^XN@h8#?{@` zJ;z;L)m@jF?cpg;2#{h$5l90{7V@$W2;@a#9?(cg^f<6m!~^iaMdSg&OI{H0gcJ#W z-#Jy?)jgLT145Lx`rlo3&Ue21_nkBQ{U=WRhT?je`wQH`$CUEH-4lFpz5b|D?|^TB zYvAvJ9(d~GN}U5c;2H2c;4Ju;;0*Ym;Lm|GpHNDJuYlhM18^BU^_Ws~;ESNp+W@bF ze*+5LFP>Ct5nKhAz+V9`gMSLX0G>GI=&XRh!0)f+__yE!zZX8~_^N}?^ZT3Nm%+aR zZ-9?|N~v#vZ-PG!{xkSF@R1*L{5}cF^XI^dj01lb{AEz+{T4U_{vG%Xc;a!TJ`2u( zBKJk`E8rR^dff)A;0|~i{3q~B;Hgh5bryUMd>U+nGXH&0=-&s=gMXj@{@iDj;;Xs@ z%DS(C(_jj|3VsXx0Q>>C1^)IEO8q?eB+Q)wFN4BQ51a?T4vOCY1Qb0#iV}p+%b@5# z0zVIa2NXU0asK`vLE-PyKMoJz5_lE-HSj6$FF;xMU-Rc*cv7k6BTBssdOZI#h;D*2 zKcUn*_`Bda@Z?WAKA#6K@jC*42KT0LnTa;UxUKOzk#C9=TV;6)qt2#eI1+ve+PUS{4OYd z`5Bx=>{QM17eTStuY%XWT~Ovd0x|L13MhKJ4&DG`P{!|qm_+>xDE{y$lb!{i18;*N zxC`!qqSvp%y!hK^aR#y11(2z#2Ywm+O;Gs!9w_$vJcDK2Ti^xo*FjuI{W-V*{sSm- zJdW_c0N({40cDI_gtetBwB)+X4GZ@A6rV5U-$fS} zxj(^;YuZ=>)MMOYXVLiyZn;DrxrEP;*>6raFYtYt`?>s?$p0hUxPsE$H@M}(q?Tv# z7qPiqsL|>{zKebkZ|o8qUEvlR6OuO9%z_{1mP>3#%CS0;-*T;Ri|$Tw6GrwDACyac z{wnw5+~R*Hxvz2mD7V;ME?mW4691^x#`_cQk^MZ&=cC->&tl7$xd}IW5k~gHjP9yT zB^7NF9Y(44^oAFhhOV!Bu~$$1ST~~}h&D~w;$7uJW%OoQn^bqazMWU|TPDk?Z2EjW}N#5c^F(_QSfb8@PwC3+H;%r0cAm_#IP^f+$?pohV6lVA_7r*ZnBdS%O;e z3$N4lCv~rjjfNDwM4#r@vbt(DmY68i z%{c0mNEhl7ie)cMvTiquQy-;AS>OZ_x)L2Wlh~Qfv=yMN}f{JqIzZ> z8%~iZ3;jD?p8#nfr`MD~5kK;KnHMBFF)cV61rFk;xJE5w5ebZC6j*vh$YuVKE0{1b z4OD<-gGHR}4IHL%y3JI-o0 zBiM*dy_R*^VsWwNkrdv`@IYr0{7x3en_AehMl`e~jHrM|alg4PRv*bQvfaZCWdkB- z6+cK#5I7d9&J8#5U6C#DV6qTNc*G-*;AvJD?q);8x2|B-GcH;YMyw!uyD*iUxiq5N z5zV+v?E-gbA3g2QwdVANS`@V}&5ULUyMCuj7~*i`r_>|OHFOl>^{9zZ>3Vfvt>j7H zMw-m23vZ2CjmKMY>sd_lNSS5rQ3x(cR?Ki9^%(fE8XuOe0J;@7$q`4(Ml_>X) zoF_F$Pc_O9^Dt|enB)}2=mq_j21r&Dk~Xmo-(C0c_=dQa)HG@Y-^NMk>8WH!mBvAc zWOgVS_quDy+fr{NZDpY$%gW-``RYVjqex8#%!(EVL&l+GpeR zCuX(C6~ow1q=1&hZBnPw=^2W(sLpD5q#f(zrNJ2O@R!Yo3_pyNEkg}2^@<8t(prh= zQNt!Bw`2V<%3AAsA7zTWwc3O(?3}#DS`NgrhmJW+bW26jU()Z?qQKO}gVDp(5iVADtYM|9Wlb6+^;)Cc;7EX#Qa26s#Y$0{#u@@w9PqFr+u5}EFk+V~ zqL<2* zk$*=zdq0s5zg!iya7d;i!wQ$`&9bw)ZPKWXT%|k)k_yFQEMWa`Rwp#Jd3%|cO`11r z)Kyv5HIX%+BqXXx$wLV1G$Zx18D$tzGUrr%PEW5&J(qd%PN>YN5}9(tqbt8u@`fX( zjw<^!s~lR|S%|f7-@4)C%g4!`v0+V#?PiRRo2`Cb-y_d)$XHfvv%^|FT_!BmmSO z9j(CB=3ZL4d~MF#I(f^NEmZYp(lU+em8_LiSED6;^7YqNt5=a)0;hV7kXX`-^9%FU z`LorQ zC|=SxA8gY<=$n^FLZon!QZTYg;g%zIvF z^lBEjO|q^pw8E(4zu;||GVtUAl0IKE>B+aNFVfn_j{R4zcr`!J(4Sj8spKr>4jc3~dq)#C z9&Cp?iNe^^tq0qI{IUsUeX!H+1cO~&Gx2b^Zuor@EZb*A!SEV;_jMEyA|B5n5VHc6 zp;$tm7_^W+*zTE{_U(cXTY?&#pTo%VV@t^ry5@a&H}E=p_i0rhZ1*2*CorzAczbsP zxGBclRgNX#I!rd5barVP#x0hi@XB(bcJB?V{NEkUjGxBj93m--OpG%U>@)^D;b8Z} zyN$taJlM6mF#&F>Uh$~0x@VG(Dcb@YrMz|LFnX{%xHs4>+ z$DcpmaP@ZXTx249bVE`c?DSweFrv{GY-(%8UKZ0Sh!t_E!A^g$+t&ViYC1FrUg_AS za3xb%cH{wGZ^)FvC5Y3G6JU$;o6*5dUtFD8a(biPK>Q;2S57j_mU>sp=!BMCbR76* zLiMaFo+!p?i^qrso|;;GhJ8cR>*JK6M9H13Q(|~(;Tbvi@%nW8{dn&_G7~^D^Gzrq zhQ2e{O|r!Fad5^EXhLNykZPFBlMjp}f_bq`Rb{6i>}&}~P=2tz#R{?h@Ge}^OvAG? z0hE`<7wefm!&5^uc8AU2kfUOHyskHxPRzGxm{~W~t-+3nAM?v-Gq`7cN1L|95APnz z1a2_4%s$~qM2|xbna0TFNdeCu^7cO{xo2U9?*ke+GWA+&O$55HaH*}eBZWSCfHWGb&(YY8= zKpyEG%XOegxFcGTAe_>v^<7DUi!m ztX#l^4$Q}TnrKTn2Wy+ut8oxkWPn;kYR}>#*d)EwQIR|jvfePU8=A#CCV*?`vG4v6?uVNB*eI>L#UFG71rD3T>Bb=HWBf{lPt(LW<$JifvyYYhHn|krCu*EcLnp zA};G;M^Uo*f#+kr()n2NN1gvp0THE-N`TAysT4Pt1q%^eFA?tD-Me3xB%P;W+g22n zv8a8>&SqK%>GS>{Bq}2HRsd z6noIS;i+4h(te2>BpNhZ39v7xP}a=(4E2#lJE=!g*x$K>Hd&!<=uRXRkPnbNK5WVT zM7n-e2#hf{Qtz>FW^x<9J3Ij3OWQ{dPt{ z=g%EI4{fCwlALCJecbBhHre{KCF6q5CMGx_El4lc{v?OvfCh4(0AUcxV@Z-Z9Dq#t~sx3 zQlG<=j0rogwH^~$y_ma^Qx8J%$MC^D+Z{N83TG+^N#7uj$_dea(&f&;cEb}0Qft7{{3i?Q^i+MAv9tc(-7J)1QLrQ>g0jtyq~qmz z2!@AS1rGOaS`lQ$8I^zM_;0vRbNePVz3mx;+3Dm$zwsake*{Iq^{3y&UoflUMKfF&kRh z-RaB`vxMJ$x>7V_67I62W8YP9Oot(j291gItewHGq^zDEJ{~qwhaV57`$}kTqjIgl z6-Tit47eUa9cwZt*zPQ`A`)=C>FSUp;gbCDr10<|ht_-chvFcUgcZkY91G%EMK_eY aLc`DpO&l1)Qfi4f?@h9;q4$nrRs9z_kl7Fb literal 0 HcmV?d00001 diff --git a/po/az.po b/po/az.po new file mode 100644 index 0000000..0ff0b2d --- /dev/null +++ b/po/az.po @@ -0,0 +1,2125 @@ +# translation of glib.HEAD.az.po to Azerbaijani Turkish +# Copyright (C) 2001, 2004 Free Software Foundation, Inc. +# KEMAL YILMAZ , 2001. +# Mətin Əmirov , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD.az\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2004-02-02 12:12+0200\n" +"Last-Translator: Mətin Əmirov \n" +"Language-Team: Azerbaijani Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Tək hərf '%s', xüsusiyyət adı '%s' olan element '%s' dən sonra '=' gözlənilir" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "`%s' hərf dəstəsindən `%s' hərf dəstəsinə dönüşdürmə dəstəklənmir" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "`%s' dən `%s' ə dönüşdürücü açıla bilmir: %s" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "dönüşdürmə girişində hökmsüz bayt qatarı" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Girişin sonunda parçalı hərf qatarı" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "fallback '%s' hərf dəstəsi '%s' ə dönüşdürülə bilmir" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "`%s' URI-si fayl sxemini işlədən mütləq URI deyildir" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Yerli fayl uRI-si `%s' `#' daxil edə bilməz" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "`%s' URI-si səhvdir" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "`%s' URI-sinin qovşaq adı səhv qaçırılmış" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "`%s'in URÄ°-si səhv qaçırılmış xarakterlər daxil edir" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "`%s'in cığır adı mütləq cığır deyildir" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Hökmsüz qovşaq adı" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "\"%2$s\" faylını oxumaq üçün %1$lu bayt ayrıla bilmir" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Fayldan oxuma iflası '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Fayl açma iflası '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Faylın xüsusiyyətlərini əldə etmə iflası '%s': fstat() iflası: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Nümunə '%s' hökmsüzdür, '%s' daxil etməməlidir" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Şablon '%s' XXXXXX ilə qurtarmır" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "`%s' dən `%s' ə dönüşdürücü açıla bilmir: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Can't do a raw read in g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Oxuna buferdə dönüşdürülməmiş verilənlər var" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal qismi xarakterlə bitir" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Can't do a raw read in g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d. sətir %d. xarakterində xəta: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Hökmsüz UTF-8 kodlanmış mətn" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d sətirində xəta : %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%s' i şərhləndirmə xətası, hərf içində bir rəqəm olmalıdır referens (məs; " +"ê) - belki rəqəm çok böyükdür" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Xarakter referens nöqtəli vergül ilə qurtarmır; böyük ehtimalla ampersand " +"xarakteri elementə başlamaq üçün işlətmədiniz - ampersand yerinə & işlədə " +"bilərsiniz" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Xarakter referens '%s' icazə verilən xarakteri kodlaya bilmir" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Boş element '&;' tapldı; hökmlü elementlər: & " < &qt; '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Element adı '%s' bilinmir" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Element nöqtəli vergül ilə qurtarmır; böyük ehtimalla bir ampersand " +"işlətdiniz bir element başlanğıcı ola bilməyən hərf üçün ampersandı & " +"olaraq işlədin" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Sənəd bir element ilə başlamalıdır (məs. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' xarakterindən sonra gələn '%s' hökmlü bir xarakter deyil; bir element " +"adı olmaya bilər" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Tək hərf '%s', Elementın başlanğıç etiketinin sonuna '>' xarakteri " +"gözlənilir '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Tək hərf '%s', xüsusiyyət adı '%s' olan element '%s' dən sonra '=' gözlənilir" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Tək hərf '%s', '%s' elementin başlanğıç etiketinin sonuna '>' və ya '/' " +"gözlənilir, və ya bir xüsusiyyət; xüsusiyyət adında hökmsüz bir hərf " +"işlədilmiş ola bilərsiniz" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Tək hərf '%s',element '%s'in xüsusiyyəti '%s''ə qiymət verilirkən bərabərdir " +"işarətindən sonra açıq alıntı işarəti gözlənilir" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Bağlı element '%s' dən sonra gələn '%s' hökmlü bir hərf deyildir; icazə " +"verilən hərf isə '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' bağlanıb, heç bir element açıq deyildir" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' bağlanıb, fəqət indi açıq element '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Sənəd boşdur və ya təkcə boşluq xarakteri daxil etməkdədir" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Sənəd açıq üçbucaq mötərizə '<'den sonra gözlənilməz bir şəkildə qurtardı" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Sənəd elementləri hələ açıq olaraq gözlənilməz bir şəkildə qurtardı - son " +"element '%s' açıq idi" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Sənəd gözlənilməz bir şəkildə qurtardı, etiket <%s/> ilə qurtaran qapalı " +"üçbucaq mötərizə gözlənilir" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Sənəd bir elementin içində gözlənilməz bir şəkildə qurtardı" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Sənəd bir xüsusiyyət adı içində gözlənilməz bir şəkildə qurtardı" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Sənəd bir element-açma etiketi içində gözlənilməz bir şəkildə qurtardı" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Sənəd xüsusiyyət adını təqib edən bərabərdir işarətindən sonra gözlənilməz " +"bir şəkildə qurtardı: xüsusiyyət qiyməti yoxdur" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Sənəd bir xüsusiyyət qiyməti içində ikən gözlənilməz bir şəkildə qurtardı" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Sənəd bağlı etiket '%s' içində gözlənilməz bir şəkildə qurtardı" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Sənəd bir şərh və ya gedişat göstərişi içində ikən gözlənilməz bir şəkildə " +"qurtarır" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanal qismi xarakterlə bitir" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "dönüşdürmə girişində hökmsüz bayt qatarı" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Bitirilməmiş xarakter mə'lumatı" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Bitirilməmiş xarakter mə'lumatı" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Bitirilməmiş xarakter mə'lumatı" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%d. sətir %d. xarakterində xəta: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Bitirilməmiş varlıq mə'lumatı" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "alıntılı mətn alıntı işarəti ilə başlamır" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Əmr sətirində və ya digər shell-quoted mətndə uyğunsuz alıntı işarəti" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Mətn '\\' xarakterindən həmən sonra qurtardı. (Mətn '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c üçün uyğunluq alıntısı tapılmadan mətn qurtardı. (Mətn '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Mətn boş idi (və ya təkcə boşluq daxil edirdi)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Törəmə gedişatdan mə'lumat oxuma iflası" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Törəmə gedişatların xəbərləşməyi üçün pipe yaratma iflası (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Törəmə pipe-dan oxuma iflası (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Qovluq dəyişdirmə iflası '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Törəmə gedişat icra iflası (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Hökmsüz qovşaq adı" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "dönüşdürmə girişi içində hökmsüz qatar" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Yardımcı proqram icra edilə bilmədi" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"g_io_channel_win32_poll() törəmə gedişatdan mə'lumat oxumada gözlənilməz xəta" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Törəmə gedişatdan mə'lumat oxuma iflası (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "törəmə gedişatdan mə'lumat oxuma select()'də namə'lum xəta (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()'də namə'lum xəta (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork iflası (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\" törəmə gedişat icra iflası (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Törəmə gedişat giriş və ya yekun istiqamətləndirmə xətası (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Törəmə gedişat fork xətası (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "\"%s\" törəmə gedişat işində namə'lum xəta" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Törəmə pid pipe dan kifayət qədər mə'lumat oxuma iflası (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 üçün hərf sərhədinin xaricində" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "dönüşdürmə girişi içində hökmsüz qatar" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 üçün hərf sərhədinin xaricindədir" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Hökmsüz qovşaq adı" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Hökmsüz qovşaq adı" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "`%s'in URÄ°-si səhv qaçırılmış xarakterlər daxil edir" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "dönüşdürmə girişində hökmsüz bayt qatarı" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Hökmsüz qovşaq adı" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Hökmsüz qovşaq adı" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Sənəd bir xüsusiyyət adı içində gözlənilməz bir şəkildə qurtardı" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d sətirində xəta : %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Hökmsüz qovşaq adı" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "\"%2$s\" faylını oxumaq üçün %1$lu bayt ayrıla bilmir" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d sətirində xəta : %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Hökmsüz qovşaq adı" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "dönüşdürmə girişi içində hökmsüz qatar" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Element adının başındakı hərf '%s' hökmlü deyil; & hərf bir elementlə " +#~ "başlayar; əgər bu ampersand bir element olaraq var sayılmazsa, & " +#~ "olaraq işlədə bilərsiniz" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Xarakter '%s' bir element adının içində hökmlü deyildir" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Boş hərf referens; dž kimi bir rəqəm daxil etməlidir;" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Bitirilməmiş varlıq mə'lumatı" + +#~ msgid "Unfinished character reference" +#~ msgstr "Bitirilməmiş xarakter mə'lumatı" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Hökmsüz UTF-8 kodlanmış mətn" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Hökmsüz UTF-8 kodlanmış mətn" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "`%s' URI-sinin qovşaq adı səhv qaçırılmış" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "`%s' URI-sinin qovşaq adı səhv qaçırılmış" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Fayl oxuma xətası: '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "`%s' hərf dəstəsindən `%s' hərf dəstəsinə dönüşdürmə dəstəklənmir" diff --git a/po/be.gmo b/po/be.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7ea482842f6389a983165b9c5bd3008602cf3aeb GIT binary patch literal 19914 zcmd6tYmgjQb;sM`EdwToV4H{2tRk&sYgP~2An!`Twk+EUwq=`@2^b^K?)J`(H9NDK zhaQlmEHBtf^ujTgixA5J93T~_NS1}l(n_Kd3M%2tOh_szSJ_3r!6zyOc>$^9_doY` zPxs91Y9$N8)b{?Tdv2e5?s=cv{mSL9eJbG7;CK(mw_g(k&w!;j@Q=?A-V_8M1^*S? z0uC(*f;{*I@Ezd)fY*bUUm669Bhki2%HiFy0C%{wSyTQ9Ick3>KA?JSx>iV}s0Q=q^1XqLif}%eKN*+hR-vM6&7lHo^@)s;ZsP6-B1aAZ%040Z~{Q0*)>FH-+ z4!q*Gg5X+k1Ng__Hc)c^g}=V=ok4IN=bONV;4~=uUj@a--+`;apMaWg*%glOaS%}l zPkH<@D7r_%-v<8$)cyYjBC??G${^q`xQ>5X*PWpF+6HRAXTbM@XTg==%b?_Q*;PR> z46XyE*C)ZX;7j10;Fa%kbRtl6o&YufF;MIOKB)OFK?zI1#ULyNn?O_$6hP7WBzOe; zF8E1sCqk55e*#MXSHm143+@I{bub1>&fCEi;FF;E`!+ZTUW!sR|83wZunub8uYyD1 zSx|QHb5P?J!nEXdFSrT(6u2Jz9@qz77CL@bftvq8P`_8e*MrAE$?GI2dOrejrQiyL za^oe?2fxetgAh9bE<)Mg0bd4n-*X7*_rdRj+rfJ@?1jZno0c+s9mN`BS zfExEY78QYY@EG_K_($LYn12Yo5+(f}xXa@|fS=<0T9h*eeii&F_-2et^1lS7u=HRp zcsrN}wVuBO#plbQ^m-!~Zw4O*WtU$EwZ2zC-M0~8+yXuU-U|LB$X{^P4MFf>@NV#a z@Jrx&@V~*$;M(^)yLuAT{eKJI1its8&{(Xa2S+b{snk97~bgktAL{a z=ipZGKS9kqiV>~>Pk?U+e+r`7;EgO^eB?le2HU_-fqw z>+X91T*vvd;12K=@DcESE`AOCXYeWTkq>m;fIHwchW5`~|Q3T}O8l_<7Fvfqwul zW)kuL9QXkE18@nrhTu{MBk2^hbJlFUOlWMmb>3Y)W?5$Dwt} z2DWlY2G?-t!_qA#O0L&($j>FSO&sxO8DCIM@LG;{amWVsk*&p__wi-1KWTunZ`6={ zmh$aA9MW6FQR6`U_L0u?8RuBYf!kO-1T0PpWpACIPjKO*90ME$jyG`hbLdmyn6hs! zro4vl(%q#TSNrR-$@ueTzR2ffw^wk49Jg}3k>i~l@8EbVhdv`5Z{ffltzKCR$`15d z>A?O^^8anAbHYRL5C>)(6gghUfoWST!PLywt_1awz1_kgJC=>>Q{uReqsoD)nQz8DzzxXp3N{6YVy3+7^Rnu zJo?x52RBbmm5QVJda+UtH%$p@gTeZIxxXHcRgg$Ezay+h`LU4I7q%2DTM%5i9F?}{ z;+9ge9Brx9t4MGDH`Oa!qVkx=OCh6`^7g1&5659~BtN>RHss-yEb0K=2ESB^2s3yMiA@|jb`BGa48tL_4Y1G5YI14Qo zB8;ILZXUiZxAOhx8nHSxpc;)w)u=owW^x19U~OX+rq=Sf$~we?SgP04I_ODZ4C8b+ zj)gml^$BjRMU%zRN~uyF3MVVIdRQuMjY_-1U6n@Is6h~`%uhnUmM^C@th=>1iK{#& z14pX0I-)Q;F4v3oU12VaYNPonI7}$yYvE$fhJy8`nwm^wyjq!TOAn5mUPLkNUA4y4 zRHe!yxwlbr3z6wzU{ScJ)Cfm*NhjQ8HZ@)>MPc8fT3>2-WhyGiMj`Li#5RSW>O6)H z$|P>Bj5f?+kpZ%5l%t(f5sp8G1oPtx0P>G$TO(hpg|%XVwYCESf~{lSBMsP>!w;dF z)Fm^(IcF%AYeiH4Xl2s4z`mxcmC>kHlS25pUTuuZ?dC@-P`MNjzffb4YYq7@M0pU!+JdYU0T*Ep||5 zklfZRsx4pFraLLgxD4b%LZY8=NiJbx8IF%obf(<^InS<#b<85qNh{fA-M;lcFTb;X1AMwJKJfzN9@5fD2W3yC(4aOK` z6@dB|5A_pIB7&RC%yzvWR4XJ z)Z%euPZc8V%4^Bug{!W+e#oVqozyR-XereVik!$#x!CQgsQ#!B$g71YWs6pjjOFY3 zxYkM8-8_eNT7{8}%9Tc8BJ83}nP+z2VJCKvueOW>`Nphc5?yy_%%~_`)pkveR4DKj za$ITMHPShJNToQXO1O%c?aO$FTXiv^f~akoiXAR473dB0+ibQblT6)+J=v9x;g-sM z5)1CYBirrC#@XtBEh4GqgC4^=es>8+H7OZrTf-`N`UTgLSlw%~fRYs6{*`T`V%SQ^pFs=CQD zqFqi$z6d~~uHGl&`v!=~C_f}O<)xtej-p?_zcX2zl>pttw=$)E60?PBr7`8soO4f5 zWLPyudBMb^t_dVnsY|I&RU<0%fgU_0L@yQ@wN{Q1QKf@&{-IXZq8e(pcr(%%rwtD7D!Se#v1#9%-)*}u)u_-Q^qNfuo5s@p zs@9&Wm)VV3+aLD>nJ&!P6ZRUHm?pJz5nIZVFXJ(KXnX zlDnF{lFm$SuO#t@V3^*eq{`8p&C7FHTp9RnBlR@Y2B!RBvFAGckq7}uWOWKMgyJNq z=4QOoK-p%FqXXfRVKrO2Prr%EQszy_q`T3u|KlmEnd8=W+qJ~X*;)E7CSvZ*_ic3R zOG2|>C`RT&ZOS`p*;@!yesI@yNk_&uQmd3y9BZ0}?Ka5F`&2UYg|*QMwlVGAIH}3* zH6mfFV-D@&lw2-JhQzy<#qwyWVf!5Y3;T`gRK7l81%lI{-+WE6r2)a_WH%;^tZ`Dx zNbfSTFMHjpEmQ2sP#!4CScXfgG@9vjf6$X&jVLjy>iV3wyE>~EPdoC(`c!cYB31=$ zE^jSYc94pVXV*4}u?#bAV=Er&96=jWo6BaJ_*B+&6qMBfX%o*94Hi^EAyv#iDwT3( z$IcOh&9!_X8Vv4lZ-Dkpq#=f#57`?iMfvi;JcpMXlOs`eAb4QYJ;NI}-90cc@L+IH zwem1R%xxUY-OoOwHME6NaU{HB!_BuYxG&PCU+%72p*WVirBSHmhAV^Nf_pX%=hh>1 zMS$F`c=KSmYQ@SGxfR#tR=q!5xpMIO)wvbduUNsr+@-y z`N_fXmWaHABj6iriYr%_Z=yBM4^*m!bqns=c-MyZ!d4EfSg@Wg6AG-{@UAJ?R+Lyy zKq|6Hp`gz8=US@~+T+9(*)O+2`@Pu0V7PjuSYHrWGuk}eJRUYrwDz?QwhlK>wGK9q zw;pRf);tn6UuYg_o^4IH_Ou@7+o{&R=IPen=1kbyEodIq#pdzm%(9TXPPPt(twY>% z!su~-=diGEP2W)1Jl5LZdbG7S^K)xo2OO8Zu$$HFhnyC2Jk$-M>Zs|$;js1T)-*q#Wa7O{oe9wjtC$ZO0d zj2x1b`{2?@(efZd#`~28ntv(@bDYv_8H<9Bg$8~#k3~mk2pipTp>-%|ez6@U-=w89W=i{kW#QfjArtku_b=;Ws5ai^D=+~Y*8*iXn_@l zGuF~^f5!w2&ki`CNugr~Y_T#4p*SOC&)QEfB25iCgB~^XMZE8XP40&iNB3Y1XR_4y zg^R=HQ6zRaaT9sCb1&nTe}oXHJ}*`D)7G$lwRpVx3nC7cS#V(suTot==uIc8B z=o$Aq*gPhF2=D&6Tl3jYvrXBN)+f7(4V2~Slo?^(qNTT5FECla3xse5tQoBDkVOhF z4Ie0A+5fI=BYqEt&cHF=8DmDmln2Rs^dQeN(~GQ6(|WmNBZp{wn!8?P(v%;C+|fOo zm~>IqW@ zoAAsO(7JhhtRbWzOKsuGCSwcZsl49WqaQ6CI2FrZkY8J3M`cm1>A{q0+fF7{+*EC= zl*h#4_BRI?v>-8UlVe8C3B5QVuP}+$tTZ{z@}=GBI9FVZ>15w3OPKkWu$VS=6l}GY zQ#3`-1&NA$nUYl}&A5zXN#5X{KZb~HfAiSDh0Qtll+IUN`G_Dh$;QunVbf|6K2DHA z75);Nr-&r1DH|&0W5X|S;hR{63OnkV3-PMVDmzVG0r+BA$1-Q$1j^1L81o}VD1@R! z73{73Oc|>Y{gH5a;@~P)pG+w3aq2x7#373M>}XZ_8H?lRnG2E(K}6ky0#cF{(+W5u z;dlioU||Z#ifg@%!9RZP*3k?hV0Y_K9HP_RgH-e2sm5(L zO~|sfyF*z<9T$*Yb_k!#sPUL>pO5$*BnJRYrEg#=AwiPs=O{8LaJBuQA zhkc8O`ixZ!lAvq%@13pXXdOJ)1NG+9P;it{-2ZF6rP=3QZz%=6ntBV*lWR+WvIV&l zX&nx_3K7&8w^>%lKa0S!_sS9#+o$7aIMj2UV-osp9aC9h?Kq`;Q~lSe))TT0vpiRd zbkNB(YTVgTZn=A&k*8ba!~}gk=9>{yaIza9-?QFGeWJ>BU#L@USUW@zZ@)$0Xg{qg zRKcCrT6Ln?d6s|VX#vsp&9JWc2IyN8ttoBUF>ex^-h45G6q2kj zBeZzVo_9EpvBj!qLgq>%aOqZ~#?S{BnB1@CusM^n`ps?Fpl4lj+k)-orCROSS~6r> z(_KV*is?e=bVz!35*U|E730;)m8m#EpT`KOSt2gS`|x_mBDyM5?+2l_)b(b`dEMmi zago~zx0h71H02pS6SSvKE?R}l8UCAXJkr+WUbV;?6U%nXPp>LP!~7*h#Jz*jL8IG~ zV+#0y9*4%}r3_>t)++hfx8nCR=1sMykwZGwM|C=uJTbM53!gG^PWN(0mS=A*af8}t zuf+C|YW==triw_Sjv8Xr(0YW-h-LYdAL5azeFw}m+qfSHkPgAVVeCWM6B(F zhxRmqm-+AaP%70wvcX_1Z< z%MLv(p<~V2Oqpsuv+Fj|bw-``do@{qGehk%bhX>%T;ildSrrz@lvN~+jL=2cB5rq z$Bq@ESEG(rTc084`Oq{+wdc%m*15eZ^lH|6@s_8~#Z|Ot zv^|c&KaT~Rw4FcO4AQPTWh$CgA;$KU3TXdwtGR9unROGDiynlMse)<}g|rUMDF>A; z-uIlYbsk~Uycnl;(yQ!ZKiWlKdNL_Va>!?n4_q*#zn)zA=SQp!Q}eBf@>f=r zCMhXTwj<@ce6!ac(X8$*l3qrea!q@{q^%w8hdBDZ9ylvV%Ae`lyx#S|sDoV!rPu}- z$@Y>xa1^hpZC{Qt|{Klt^ zzvpT))YGFa7{+39t}+J!$(_w`2--oU(;0Y4;f>wg<)%cz4*w4&#TDjKt4-nUC$m+iv5FnnQb-zI1Ws z@Hxe85^MJpK5KB>JC(#>d(4!2&w(ngZ!No7sXVR)_TK!*Al$xoW?K!l>#BB9=gCJR zO4v!>xWI*Y>h8?GZ#gXaodNS$DF>7EyEUd)q^XB~XUvV+h4j1Xa6<@4JyS@SjvwI5 z_uIEhE6)0@m1P@GAvbx1k5~E)Qs2}YCr+c1w;4mPOoA$igSyp zyE9Z%URkIPnqPyfqqx=+&C||JXSYo?M(0iILNOs*Si7R*X4i};p8=+C}4(Dy+ zv(Zry$d1b7l-O9LrK7g9s`8u{CM>InbbW;smEGJMChZPP z0p_s1&uT)LC!aIa_`4}MQo+34oWmVSH{LTRboqk7`)c1pQqR|9QUroz(#*2k(X7X^ zUB~FO_yP_@$-t`Q^RB(sg2^WesnY!%Z)Ig(ob6FcNbl#jqeV^N`Ymi`ZqBB8o7}&1 z+g-z)@5FusW&X1t=6&wW+q%|-YNL-m0aVvRma(Bp(y>(VWqAOe$F_g3jUB1i>8pcw zXQ1YV8NZ3u6^^o55|vu=Q_?>Tx6TvH58Za03j=DW_L!3pe_a+Lby^;mVz7@h+-^IX zf7085n#bA5dD`qM)uXr$g{w)j!IkFM#JRVZ7(8v&4ylW_?w2ruT7r|jn#}8vhnt5` T>}Q)_Y<|7@mFCy&HRb;UfMrBo literal 0 HcmV?d00001 diff --git a/po/be.po b/po/be.po new file mode 100644 index 0000000..d22d219 --- /dev/null +++ b/po/be.po @@ -0,0 +1,2357 @@ +# Беларускі пераклад glib.HEAD. +# Copyright (C) 2002, 2004 Free Software Foundation, Inc. +# Vital Khilko , 2002, 2005. +# Ales Nyakhaychyk , 2004. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-11-16 11:21+0200\n" +"Last-Translator: Vital Khilko \n" +"Language-Team: Belarusian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# glib/gmarkup.c:1120 +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Дзіўны сымбаль \"%s\", чакаўся сымбаль \"=\" пасьля назвы атрыбута \"%s\" " +"элемэнту \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Дапушчальны файл ключу не адшуканы ў каталёгу даньняў" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +# glib/gfileutils.c:745 +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Немагчыма прачытаць сымбалічную спасылку \"%s\": %s" + +# glib/gconvert.c:390 +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Пераўтварэньне з набору знакаў \"%s\" у \"%s\" не падтрымліваецца" + +# glib/gconvert.c:394 +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не атрымалася адкрыць пераўтваральнік з \"%s\" у \"%s\"" + +# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282 +# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875 +# glib/gutf8.c:1320 +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Недапушчальная пасьлядоўнасьць байтаў на ўваходзе пераўтварэньня" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gconvert.c:615 glib/gutf8.c:871 glib/gutf8.c:1071 glib/gutf8.c:1212 +# glib/gutf8.c:1316 +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Няпоўны сымбаль у канцы ўваходнага радку" + +# glib/gconvert.c:788 +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Немагчыма пераўтвараць знак \"%s\" у знак са збору \"%s\"" + +# glib/gconvert.c:1593 +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI \"%s\" не зьяўляюцца абсалютным URI выкарыстаньня схемы \"file\"" + +# glib/gconvert.c:1603 +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI \"%s\" мясцовага файлу ня можа ўключаць \"#\"" + +# glib/gconvert.c:1620 +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI \"%s\" недапушчальная" + +# glib/gconvert.c:1632 +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Назва вузлу ў URI \"%s\" недапушчальная" + +# glib/gconvert.c:1648 +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI \"%s\" утрымлівае недапушчальны кіравальны сымбаль" + +# glib/gconvert.c:1719 +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Шлях \"%s\" не зьяўляецца абсалютным" + +# glib/gconvert.c:1729 +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Недапушчальная назва вузла" + +# glib/gdir.c:79 +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Памылка ў часе адкрыцьця каталёгу \"%s\": %s" + +# glib/gfileutils.c:337 glib/gfileutils.c:402 +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не атрымалася разьмеркаваць %lu байтаў для чытаньня файлу \"%s\"" + +# glib/gfileutils.c:348 +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +# glib/gfileutils.c:426 +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Збой чытаньня з файлу \"%s\": %s" + +# glib/gfileutils.c:465 glib/gfileutils.c:533 +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Збой адкрыцьця файлу \"%s\": %s" + +# glib/gfileutils.c:479 +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Збой атрыманьня атрыбутаў файлу \"%s\": збой fstat(): %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Збой адкрыцьця файлу \"%s\": збой fdopen(): %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Збой зьмены назвы файлу \"%s\" на '%s': збой g_rename(): %s" + +# glib/gfileutils.c:745 +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Збой стварэньня файлу \"%s\": %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Збой адкрыцьця файла %s' для запісу: збой fdopen(): %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Збой запісу файлу '%s': збой fwrite(): %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Збой запісу файлу '%s': збой fwrite(): %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Збой запісу файлу '%s': збой fwrite(): %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Збой закрыцьця файлу %s': збой fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Наяўны файл '%s' не можа быць выдалены: збой g_unlink(): %s" + +# glib/gfileutils.c:712 +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблён \"%s\" недапушчальны, не павінны ўтрымліваць \"%s\"" + +# glib/gfileutils.c:724 +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблён \"%s\" канчацца не на XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +# glib/gfileutils.c:745 +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Немагчыма прачытаць сымбалічную спасылку \"%s\": %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +# glib/giochannel.c:1114 +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не атрымалася адкрыць пераўтваральнік з \"%s\" у \"%s\": %s" + +# glib/giochannel.c:1460 +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Не магчыма выканаць непасрэднае чытаньне ў функцыі " +"g_io_channel_read_line_string" + +# glib/giochannel.c:1507 glib/giochannel.c:1761 glib/giochannel.c:1847 +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "У буфэры чытаньня засталіся непераўтвораныя даньні" + +# glib/giochannel.c:1587 glib/giochannel.c:1661 +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Канал закрываецца на няпоўным сымбалі" + +# glib/giochannel.c:1647 +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Немагчыма выканаць непасрэднае чытаньне ў функцыі g_io_channel_read_to_end" + +# glib/gfileutils.c:505 +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Збой адкрыцьця файлу \"%s\": збой open(): %s" + +# glib/gfileutils.c:505 +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Збой мапаваньня файлу '%s': збой mmap(): %s" + +# glib/gmarkup.c:219 +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Памылка ў радку %d сымбаль %d: %s" + +# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896 +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Недапушчальна закадаваны тэкст UTF-8" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +# glib/gmarkup.c:303 +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Памылка ў радку %d: %s" + +# glib/gmarkup.c:528 +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Збой разбору \"%-.*s\", дзе мусіць быць нумар унутры лучыва да сымбалю " +"(ê напрыклад) - мажліва, нумар завялікі" + +# glib/gmarkup.c:580 +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Лучыва да сымбалю не канчаецца кропкай з коскай; здаецца, што сымбаль & быў " +"выкарыстаны ня для пазначэньня пачатка сутнасьці - экрануйце яго як &" + +# glib/gmarkup.c:553 +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Лучыва на сымбаль '%-.*s' не вызначае дазволены сымбаль" + +# glib/gmarkup.c:382 +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Пусты запіс \"&;\" адшуканы; дапушчальныя: & " < > '" + +# glib/gmarkup.c:472 +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Невядомая назва сутнасьці \"%s\"" + +# glib/gmarkup.c:482 +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Запіс не канчаецца кропкай з коскай; здаецца, што сымбаль & быў выкарыстаны " +"не для пазначэньня пачатку сутнасьці - экрануйце яго як &" + +# glib/gmarkup.c:932 +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Дакумэнт мусіць пачынацца з элемэнту (напрыклад )" + +# glib/gmarkup.c:970 +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"\"%s\" не зьяўляецца дапушчальным сымбалем, які ідзе за сымбалем \"<\"; гэты " +"сымбаль ня можа пачынаць назву элемэнту" + +# glib/gmarkup.c:1033 +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Дзіўны сымбаль \"%s\", чакаецца сымбаль \">\" для закрыцьця тэга элемэнту\"%s" +"\"" + +# glib/gmarkup.c:1120 +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Дзіўны сымбаль \"%s\", чакаўся сымбаль \"=\" пасьля назвы атрыбута \"%s\" " +"элемэнту \"%s\"" + +# glib/gmarkup.c:1161 +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Дзіўны сымбаль \"%s\", чакаліся сымбалі \">\" ці \"/\" для закрыцьця " +"пачатковага тэгу элемэнта \"%s\" ці дадаткова атрыбут; магчыма, быў " +"выкарыстаны недапушчальны сымбаль у назве атрыбуту" + +# glib/gmarkup.c:1244 +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Дзіўны сымбаль \"%s\", чакалася падвойная дужка пасьля знаку роўнасьці, калі " +"надаецца значэньне атрыбуту \"%s\" элемэнту \"%s\"" + +# glib/gmarkup.c:1384 +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"\"%s\" ня зьяўляецца дапушчальным сымбалем, які закрывае назву элемэнту \"%s" +"\"; дапушчальным сымбалем зьяўляецца \">\"" + +# glib/gmarkup.c:1433 +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" +"Элемэнт \"%s\" быў закрыты, аніводны элемэнт у бягучы момант не адкрыты" + +# glib/gmarkup.c:1442 +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Элемэнт \"%s\" быў закрыты, але ў гэты час адкрыты \"%s\"" + +# glib/gmarkup.c:1574 +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Дакумэнт быў пусты ці утрымліваў толькі прагалы" + +# glib/gmarkup.c:1588 +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Дакумэнт нечакана скончыўся адразу пасьля вуглавой дужкі \"<\"" + +# glib/gmarkup.c:1596 glib/gmarkup.c:1640 +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Дакумэнт нечакана скончыўся, калі элемэнты былі яшчэ адкрытыя - \"%s\" быў " +"апошнім адкрытым элемэнтам" + +# glib/gmarkup.c:1604 +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Дакумэнт нечакана скончыўся, чакаецца вуглавая дужка якая закрывае тэг <%s/>" + +# glib/gmarkup.c:1610 +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Дакумэнт нечакана скончыўся ўнутры назвы элемэнту" + +# glib/gmarkup.c:1615 +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Дакумэнт нечакана скончыўся ўнутры назвы атрыбуту" + +# glib/gmarkup.c:1620 +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Дакумэнт нечакана скончыўся ўнутры элемэнту які адкрывае тэг." + +# glib/gmarkup.c:1626 +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Дакумэнт нечакана скончыўся пасьля знаку роўнасьці, які ішоў за назвай " +"атрыбуту: не пазначана значэньне атрыбуту" + +# glib/gmarkup.c:1633 +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Дакумэнт нечакана скончыўся ўнутры значэньня атрыбуту" + +# glib/gmarkup.c:1648 +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Дакумэнт нечакана скончыўся ўнутры элемэнту \"%s\" які закрывае тэг" + +# glib/gmarkup.c:1654 +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Дакумэнт нечакана скончыўся ўнутры камэнтару ці інструкцыі" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +# glib/giochannel.c:1587 glib/giochannel.c:1661 +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Канал закрываецца на няпоўным сымбалі" + +# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282 +# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875 +# glib/gutf8.c:1320 +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Недапушчальная пасьлядоўнасьць байтаў на ўваходзе пераўтварэньня" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Незавершанае лучыва сымбалю" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Незавершанае лучыва сымбалю" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Незавершанае лучыва сымбалю" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +# glib/gmarkup.c:219 +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Памылка ў радку %d сымбаль %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Незавершанае лучыва сутнасьці" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +# glib/gshell.c:71 +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Тэкст у дужках не пачынаецца з сымбалю дужкі" + +# glib/gshell.c:161 +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Неадпаведная дужка ў камандным радку ці іншым тэксьце абалонкі" + +# glib/gshell.c:529 +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Тэкст скончыўся адразу пасьля сымбалю \"\\\". (Тэкст быў \"%s\")" + +# glib/gshell.c:536 +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Тэкст скончыўся перад адпаведнай дужкай для %c. (Тэкст быў \"%s\")" + +# glib/gshell.c:548 +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Тэкст быў пусты (ці утрымліваў толькі прагалы)" + +# glib/gspawn-win32.c:214 +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Збой чытаньня даньняў з працэсу-нашчадка" + +# glib/gspawn-win32.c:981 glib/gspawn.c:1228 +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Збой стварэньня канала для абмену з працэсам-нашчадкам (%s)" + +# glib/gspawn-win32.c:843 glib/gspawn.c:914 +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Збой чытаньня даньняў з каналу нашчадка (%s)" + +# glib/gspawn-win32.c:931 glib/gspawn.c:1119 +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Збой зьмены каталёга \"%s\" (%s)" + +# glib/gspawn-win32.c:940 +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Збой выкананьня працэсу-нашчадка (%s)" + +# glib/gconvert.c:1729 +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Недапушчальная назва праграмы: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Недапушчальны радок у вэктары аргумэнту ў %d: %s" + +# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189 +# glib/gutf8.c:1330 glib/gutf8.c:1426 +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Недапушчальны радок у асяродзьдзі: %s" + +# glib/gdir.c:79 +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Недапушчальны працоўны каталёг: %s" + +# glib/gspawn-win32.c:940 +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Збой выкананьня праграмы дапамогі (%s)" + +# glib/gspawn-win32.c:365 +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Непрадбачаная памылка ў функцыі g_io_channel_win32_poll() чытаньня даньняў " +"з працэсу-нашчадка" + +# glib/gspawn.c:161 +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Збой чытаньня даньняў з працэсу-нашчадка (%s)" + +# glib/gspawn.c:293 +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Непрадбачаная памылка у select() чытаньня даньняў з працэсу-нашчадка (%s)" + +# glib/gspawn.c:376 +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Непрадбачаная памылка ў waitpid() (%s)" + +# glib/gspawn.c:979 +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Збой разгалінаваньня fork() (%s)" + +# glib/gspawn.c:1129 +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Збой выкананьня працэсу-нашчадка \"%s\" (%s)" + +# glib/gspawn.c:1139 +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Збой перанакіраваньня вываду ці ўводу працэсу-нашчадка (%s)" + +# glib/gspawn.c:1148 +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Збой разгалінаваньня fork() працэсу-нашчадка (%s)" + +# glib/gspawn.c:1156 +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Невядомая памылка выкананьня працэсу-нашчадка \"%s\"" + +# glib/gspawn.c:1178 +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Збой чытаньня патрэбнае колькасьці даньняў з pid канала нашчадку (%s)" + +# glib/gutf8.c:950 +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Сымбаль па-за дыяпазонам UTF-8" + +# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189 +# glib/gutf8.c:1330 glib/gutf8.c:1426 +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Недапушчальная пасьлядоўнасьць на ўваходзе пераўтварэньня" + +# glib/gutf8.c:1341 glib/gutf8.c:1437 +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Сымбаль па-за дыяпазонам UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Выкарыстаньне:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[МОЖНАСЬЦЬ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Можнасьці дапамогі:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Адлюстраваць можнасьці дапамогі" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Адлюстраваць усе можнасьці дапамогі" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Можнасьці дастасаваньня:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Немагчыма разабраць цэлае значэньне '%s' для %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Цэлае значэньне '%s' для %s па-за межамі" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Немагчыма разабраць цэлае значэньне '%s' для %s" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Цэлае значэньне '%s' для %s па-за межамі" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Нестае аргумэнту для %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Невядомая можнасьць %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Дапушчальны файл ключу не адшуканы ў каталёгу даньняў" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Не зьяўляецца звычайным файлам" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Файл пусты" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Файл ключу ўтрымлівае радок '%s' які не зьяўляецца парай ключ-значэньне, " +"групай, ці камэнтарам" + +# glib/gconvert.c:1729 +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Недапушчальная назва праграмы: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Файл ключу не пачынаецца з групы" + +# glib/gconvert.c:1729 +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Недапушчальная назва праграмы: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Файл ключу ўтрымлівае кадаваньне якое не падтрымліваецца '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Файл ключу не мае групу '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Файл ключу не мае ключ '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Файл ключу утрымлівае ключ '%s' са значэньнем '%s' які не закадаваны UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Файл ключу утрымлівае ключ '%s' які мае значэньне што не можа быць " +"інтэрпрэтаванае." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Файл ключу утрымлівае ключ '%s' які мае значэньне што не можа быць " +"інтэрпрэтаванае." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Файл ключу утрымлівае ключ '%s' у групе '%s' які мае значэньне што не можа " +"быць інтэрпрэтаванае." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Файл ключу не мае ключ '%s' у групе '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Файл ключу ўтрымлівае пасьлядоўнасьць завяршэньня ў канцы радку" + +# glib/gconvert.c:1648 +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Файл ключу утрымлівае недапушчальную пасьлядоўнасьць завяршэньня '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Значэньне '%s' не можа быць інтэрпрэтаванае як лік." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Цэлае значэньне '%s' па-за межамі" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Значэньне '%s' не можа быць інтэрпрэтаванае як лік." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Значэньне '%s' не можа быць інтэрпрэтаванае як булева." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282 +# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875 +# glib/gutf8.c:1320 +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Недапушчальная пасьлядоўнасьць байтаў на ўваходзе пераўтварэньня" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Невядомая можнасьць %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +# glib/gfileutils.c:348 +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +# glib/gconvert.c:1729 +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Недапушчальная назва праграмы: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +# glib/gconvert.c:1729 +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Недапушчальная назва вузла" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Збой стварэньня файлу \"%s\": %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Збой стварэньня файлу \"%s\": %s" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Збой стварэньня файлу \"%s\": %s" + +# glib/gdir.c:79 +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Памылка ў часе адкрыцьця каталёгу \"%s\": %s" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Немагчыма прачытаць сымбалічную спасылку \"%s\": %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +# glib/gmarkup.c:1615 +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Дакумэнт нечакана скончыўся ўнутры назвы атрыбуту" + +# glib/gdir.c:79 +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Памылка ў часе адкрыцьця каталёгу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +# glib/gmarkup.c:303 +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Памылка ў радку %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +# glib/gfileutils.c:348 +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Не зьяўляецца звычайным файлам" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +# glib/gconvert.c:1729 +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Недапушчальная назва праграмы: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:745 +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Збой стварэньня файлу \"%s\": %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +# glib/gfileutils.c:337 glib/gfileutils.c:402 +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Немагчыма зьмяніць рэжым файлу: збой waitpid(): %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:745 +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Збой стварэньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gmarkup.c:303 +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Памылка ў радку %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Памылка ў часе пераўтварэньня: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Сымбалічныя спасылкі не падтрымліваюцца" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +# glib/gconvert.c:1729 +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Недапушчальная назва вузла" + +# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189 +# glib/gutf8.c:1330 glib/gutf8.c:1426 +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Недапушчальная пасьлядоўнасьць на ўваходзе пераўтварэньня" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[МОЖНАСЬЦЬ...]" + +# glib/gmarkup.c:392 +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Сымбаль \"%s\" ня зьяўляецца дапушчальным напачатку назвы сутнасьці; " +#~ "сымбаль & пачынае пасьлядоўнасьць; калі гэты сымбаль ня мусіць быць " +#~ "часткай запісу, тады экрануйце яго запісам &" + +# glib/gmarkup.c:428 +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Сымбаль \"%s\" недапушчальны ўнутры назвы сутнасьці" + +# glib/gmarkup.c:570 +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Пустое лучыва да сымбалю: мусіць уключаць нумар, напрыклад dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Незавершанае лучыва сутнасьці" + +#~ msgid "Unfinished character reference" +#~ msgstr "Незавершанае лучыва сымбалю" + +# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896 +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Недапушчальна закадаваны тэкст UTF-8" + +# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896 +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Недапушчальна закадаваны тэкст UTF-8" + +# glib/gconvert.c:1632 +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Назва вузлу ў URI \"%s\" недапушчальная" + +# glib/gconvert.c:1632 +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Назва вузлу ў URI \"%s\" недапушчальная" + +# glib/gfileutils.c:348 +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Памылка чытаньня файлу \"%s\": %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Памылка ў часе пераўтварэньня: %s" + +# glib/gfileutils.c:505 +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Не магчыма зьмяніць рэжым файлу: збой fork(): %s" + +# glib/gfileutils.c:505 +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Не магчыма зьмяніць рэжым файлу: збой chmod(): %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Не магчыма зьмяніць рэжым файлу: Нашчадак забіты сыгналам: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Не магчыма зьмяніць рэжым файлу: Нашчадак ненармальна завяршыўся " + +# glib/giochannel.c:1110 +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Пераўтварэньне з набору сымбаляў \"%s\" у \"%s\" не падтрымліваецца" + +# glib/giowin32.c:704 glib/giowin32.c:733 +#~ msgid "Incorrect message size" +#~ msgstr "Памылковы памер паведамленьня" + +# glib/giowin32.c:1037 glib/giowin32.c:1090 +#~ msgid "Socket error" +#~ msgstr "Памылка сокету" + +# glib/giowin32.c:1290 +#~ msgid "Channel set flags unsupported" +#~ msgstr "Набор сьцягоў каналу ня падтрымліваецца" diff --git a/po/be@latin.gmo b/po/be@latin.gmo new file mode 100644 index 0000000000000000000000000000000000000000..792dfd3ec74c617ea02d0443b15adcbbc1209292 GIT binary patch literal 35728 zcmd6wd7Nccb?=Xgpp6Jd5fFq!Lw8j{SJRWw^Z+zX11}>D7wA?s-7Q$tH86*i=q|a^`Pjify==ML8X5fRDE9sWAFt2*#@ov-w95E ze2Pva(PnTZxEh=QF9P4>pFawo$@4e-`xB@{^<4rc;4R>_;KQJ`3sk!|(3nl&6u1ri zMer){YoO{|abXnQ3ML*u46fz*IW$Uq*$%3GE&jO@d^`9e@Xx`W;HePtCh%pT`1K7? ze2hjMo&mzDXf-Il?E+~+l!0pZ8~pcQ2T$ku_drA=`Uz7NLWX>_*ouLV{9F7OPn z?BCzx@ogSI=)Zp+gcZ?WgQDYPIz{;|0!7EwpyZ?s@?Z2y{?Yee0}+krgZSf^B;n!N^~-na2t(+ zR2kg@z8<^}qzj`{=zP830Imn`1QD6&0Z`>X42qt=05^gs&`8y{6%<_uL5hlg9#p!| zfXeqh@D%V&giP&Q37!h>0QG)9sCr7E=y)9{Ie8x_x%ez7y8i~GOQSOoa^Y1TGf?%t z8C1THf~SFB1jV1f2PHpGp;3B&CMY=@1EpVA_~%11Nf~1Aha20GtPR zkoXMn;~xJERDXU8BuVsqgj;m(0VP-Wf{-5lnty&AL?ohTZgz5ZIVk#X0Z#|J;B&w? zf@=3+Q0@5y7=urMXM!it7|H1iLD9Pjd;z!%RQhR9{quSdk&50Air-%WAt4%p>7sK2 z6n}mORJ(o$q>AV-!5BOP<&)lR1eN|yP<;AnP;@^GJ{SB;Q1yKijKSw!>F9b9D0;33 zRn82ENJMW2B@e#~svo}#iq3Pda{a#tR6Fkm#m5K0bHU#N_kfRs+rib_934&YJf0r} z)vq4{mG6t7_<7RRjLqO#pz^H*PXcGa6Tv2^`n#a$dM_wC{~T1iPa)IE;AT+my$)18 zw}a0E?*nfDe-=Ckd;(Pc(KYs8bTO#@X@KJI8$i|fN$?c#pFzp%i94L$Z3Lgq^G@)E z;7dXAeGXK8?*dichrsi}&->@^fU5r#I$QZK0+)lAgBOAaK=t!$K+*ShQ2c)kJRAIb zQ0bp}ohx@0sPwx*$>$^}I_?2ifWHcgzn=lc|Hu9NAAm8>7hdn$w*yr9H-nP5I;i}= z2&()~fh)nUfTHuHovt0Lz!9Ezg0h2mf$EpnfRc|7frx7KSx|Q4Sub|&*$9fR1Qh>T zpwhny6u;jKs@{h|)%ST&^nVwO!PDtX;iVpL1tounJpL@m&=UQoe|`e|?WaW1Q!yIi z|H3XOUtjh3w;sO(svZ9do(L}6?fCK>aE9k`FazHPcEG11?5gJwsDA$yQ2p}=cpCU6 za3lB+;21cv*YWEmpq{&+zW)+93VsoU#nIDWf~^2|gR)OQ2i^ky5y*eh*iDWfcY~O= z=pj&i`~r9}_>Ul}9-VhHwi0{=i0DLb0k?sF0m{ytv(MFgD+p_&SA#0&_d)ULZ$Lyg zI&ps#{W5qXsQ&&oC_Om~qD1e0@DlKy;5hhMQ2p_5;A-&fTV1{vgH4{BAgUXE9lQ)2 zeW}AcLAok>8%S40Ujx;?wJ&q^&4RDu`Q2awj@;(H|0F0r{SJtzMgQX8Z@=BylY2qE z{{;9`;K>JEf4vPnpXVc>w+V@RR^q=u^*FTqnlEXTv{(b;_A@~XK0`SY=nc&l2 z;rM?JD1EseRQYvKa`7fmdi6p7{1;%%^S^_t|J*yA{#^k|9_|A5{T<*%;77o7z`p`F zfKR*A(Yp~;`FDci_m6_GF8TndemOaD{k<7f|IC5sfxiq&E*=Bb&nHiyQ{YR$E5M%s zRo^GUv%#-{hz<^pqh}we{(lvC0r)9U<^3I~de@g7KT4qLeIvLL{1_O6-}B$kNS$17 z2UYKbAR-+733wqmGU@v7MiA2#y%qdP@NsY*I6dX$=OGZ$jQ$u@ePh#(-?xI|*S(;qJIT9f%`JojyHm9dHyqSIk*g^KN%bc#sAAe^>Z0K6}%Tz{`*1E{V7oLeA29I z-<9Bcp6>)z{{x`p=hGg)2VTkZ1r^udCGZ72{}d?sdbh^~k57Q-^8P7RSAGnR@VpIN z1!n&Ft)Te!C@6kE0jj^xsX6+#fY$4Ufs>7>L8>=p9HT5*EigFcn>K4 z904x@zYMMfPrb|eZ_gWm?%fh*=*`(Fx<@%%I3 z8t@TNbbJF`4L;|fll!Z{=kxq>Q2cCzlJmFw=Z}G+@2jB7`#$(waK#~){&MgPo?ii~ zKj%P`15oY%G^qBT-gWfd42s?#2cHK%0^SII4wN3AGw=9)IjD4Zf){}gfNIBYf$HaP zfokt*cRT&t4(fd!RQuitz6g92RDb*vxDDKRkL#~_@N%9%1a1bu30@3de6MTgt>BqF zzXoi9?*Lx`KKqqU9;=}E^&of|_z0--z5|M%t6t^&pY0&37Tp9c13wC$3Vsq4U4IJh z2G4#qeE`mY;@_vhlfi!ne*}EyYaCtYfa3qP;O*dT;5p!Lg39;D;9l?<_c{CUGVsMb zzYg34{t+npPWe&S-V4Fgc-{-Do&;1mZBTr952*6L4qgC0^|g+UmEdxo_kw4EEl_mb z4@zGTgDU6K;0wSXfE&THe$3T-6FAEAE5QrFcY`YbGob4G7I->%%8$GLzW|i}>;^^u z-QfA)n?cq0K~VDfMeupxiLZ0=b2g}U?*S!8uLni%hd{~4=fLy8r~ia|zXDXduJq3n zpwis~s{9Xt`@t`QlFxNN>FmTLDE_?_TmilZJQw^NsCN7VI0~NddMC%@py+r7DE=Js z_!jVmJiiZ=J^2hMx&HxpIe5t%oPK2BQ+U?zIb7n&S-emmgkQ|_CwbV#^}>*tdq_7~ z2ckdJKm1Pj-#^0r_w5aHGmnA}*VFv-`QU%!qDl7qF8_Xr>&0AZ(`UFgQQnI{{rdd^Ze&r(jEPNo$DXDR`IR)`-Xq`x5CSF zNb@Y7-^QiB(eF_Q5$4H$lJ(#8_p%?iab3wJ-F$>gzZ1Bw;8K5NT;WI86UPVkSo9^<-(>sh>e3-||I`h9^*au$9s;=A*<^&HE|tU+15{3SP~13Gd(N-+kSq^!lm1|5^VmkgfZ?e=dQ)>hJe?3~&lJhyBCT z!T%dRfKQ>!^<3dM$<3>{Mz{`ym*CI)`*(pq!*wB-;^i~orQkdmemD6W>FQr`J(uq% za=oAXZCt;^^*^|_a9z&(9bnA$Q(RBy`M-nD22TX_`$Y#f21?JD@og3OQm%jII*I3Z zgZiP;=EL6tR=9qd>swqGljc2On`@5iDlYxb=e=xy|YYX4?`%A8O za-GL@7uRdK4s!h+*N3_EdoS0oas4#co4LNmrQbKXF49F=Uj+Y^OTU#oC*YW`?K0ywRA;KxDzp3nUQ?l!7}|C{TTTpPLmC)b~FT}YZ= z0mE-C&u{19bNj>BHa{Ufh`28_Am-&Y`fxp4^5Z66i zO)mX@jO!D2ho1y4aE)>O3)h)kU9J|FexK#~Tf1}P#*cFUb6o47OTQ0rt>OOvfU|nR zZ#~yDcvl1Wa&6}Rufbp7(r-D>=W*%x1lR3c8+ab~@4llC{O;qr*6#4}_%_1z4F4?n zGS|Ia7x;Xi(#!CRN3+^oQpw73S}WDdS#4@8TCsZVWPIJ#4sY#Lc zcH)U{n`eiuXkp$6sE~rm}V`u6A1Ocp~+jA=gAV9*f4}gIRmJ-f746 zMp_fUMx$-+UZ)ARGMj0?#Ah%tkrHs+Zv5ZR!Z7gy%z6j2wIz> zZLL7ZTFV zoiuMstzH}7z5m7=qpOqBY^PyD6X&%~Cdg1Z+Md)#+HtAg=*H!&nU>o1W;d?SAtU)? zG0pHVYDpS*TIAZbbJq@vt4(H8ou+Fa!dB+XiqLQsC5+%UMoav+cTXSzdOz zj#M|3gR%M}MuMmA$m(|>;qLnR45o7t z9kgQtxp2bOuJZwIrfqvxK}y_6ny6Q~-kGSRvLOhU$)4oivAdTltF_Z9x_QZD?PjNj zKBVz=yV5FBwzJmgv~Ozo+dRLyE6YN_865zx+(N>7EA(%Uf8%1Ju9HYK%1 z6Zc&^zV^~%rPx?V&`c-OCI(l{8ee@87PDNZYBkEtFg7G^h@`eOGdGe$ODJQzUBb1>rwT^kIWV7ntZoMO2L40UpmGWB&vXqyen;dbprlBCFds=N+VYax| z&f490JWgAsqydF_2}vtn$p(-PfY z8+v_r?2eMF5XNZapq*7Jj)ZZiO9xR=`&>5WtuWmG5J+(UCBCqC(v0e_5n^qgx8U)Vkk@+V`J#4~8 zH(skb-BD=YeEO8+E{dTVpE! zk&)j~!zSTj(K#^5u`}AyY^t;1txSW=u-VG~*PU8+sQ4O_-BxnB17gV)Z&PX8a;l=ufMFg0EEgUQK58vDK|k)Nz*?B5Sk7&-FQd z9%u;TmK?Zvg&Q@&O|fr!?^B_aV1ROG$Yg3r0vop^Z%ceDyq0Su((2~g%Nue`*7z4l z9;_z+ra^b0O?}@6dZ>xNG>i}VdmQZ0djky2li)tkTZ?ODNDAZ@T8ApS_jD=ql7uPw>!&hWxps|a- zSbye|V4uNv6b@A`yMrCo_YJqW)XW+vT7igmGijMv4>aC8xkFg$Mi$2KMh4kaI7(BU zO45{ZZ)zw9)0jqx0_65L7V-X^Rm$~<*Pr>4Fg9b=w? zZQ&KnxYlk}7c7#~&t1Pt$D=D+W5skfOqvup(VH|oxn!}jgl>w}lZZmC?sFr<>z1!6 ze~h+ijt>iLRHcJZMem&rQj_9QYC7MaNN)1+r5tEnC~i8fpeU+zs+m+57uC@0LW!Nx z6eAq5A#zb*7|og;EWzIO(>y?l3`?%$t(Ztfk>ygRr8r(q{N&wrPnGATlA2qPmuns1 zWo%PCS=QI%%Q+xQ{lz}nqK;Orn>_o8B6j)#e{FLbL0m$;m?lQ7>aNa=AV z8kfi!8!G(?DeiAs3sh9LuJJJeR*e7Lj8lO!cem4gPcA_X&ONk zDU{hdo<@02E2!6;a>0~23pUHKkpEtwy_Ytv&1KDcO@h^*!nuAv);LAfw3d@|kReRH zpL+(D^9I^!2E|J{s^G$By|5dE;IGOy;CiId;v896p>a9$cFQshNiNpfU`wN2ci58~ z2c*m{Qc6q;pUaNMW5?9$d`VzO3+G+B|$|!)A|{OQi^$Kh}4cUFex1sj;;L zU0uAyrHpP&C)>6N!o1dn(wX7d&`M!8G);6Si7H1f$lX5#Sb*4uh=hoGv@3HVyj&%G z1ap@b5hl|1K{*H(!F4g|oKey4x?5<`+Mf%7LInh9SRA@Kr5uGBxIzX@BXGxwe=|dC z;gQtJHZN&U^G&KUn8ny2li<3(n7zMF(+BD+5W+H*IWM`($!F_F;$%3FP+myfTT>GW zjb=7yUU`L}megiKT(PjPYx9yhU6iNyS)-(_n5jPNGHgVPICRNt*J>_CNUhOFa z;aD-#STi`u9!9J|2I2nG9RzZh{zzBpm6HNXz5E z&~4NNirOt8=qo`7GE4_&t6L^nL*Hq2e(`lvTqq!VOHo< z7r8Xi-oe!{l*c<1y}`>o+~_6h9t249cbQK)X>K{+TQl_^WD<2yA4c-9`f1ccwBsuu zU7V)Zc|M=%i~sQnrVsUHSf;|Cob8nnaQlO(}pF!vLy(< zvFxmh$mt#+LaUw?=S=2F!j6`#R;qMtv2Nr7dW%vTNqf3CHc-?c-AWMc3zK%3qy^jH zL}3_E;<~)!eTp~^Xx+ZBq;7@!?Jnr8o8>wsBcoq;SE5{F3+hcP2DM>-O%94`w*4a9 zS?!FMkYWz?@Dwuk(o$p3Kswto!ML4tDlCN?6LTLOFNZ~3WXU!&^~xTS$NKST$t95t z2Z%&YwA1OInnn&McQ58a+c`PK{MlNb9NB04zw zNkzlrm8tjsd}TRKlcw~eRvxcUj{BZ0ezt`k#)iJVEw*v!js_zTp#(XjHWA9>K8z#9 z_#`Cfl%=7(76g?PuRCUT7r7Z$#=#_OH?lH?Sa7G1L~e`?{CTq|M{a6H?#4XYan9dv>p0z53%Li0 zUR54s@eb(dm81ID+h1pk1Ot{$X3uS}v&~O=h!tkbFC?<2R`A5o+HWtVtb}xJJ5m^Q zBNc+Wmn`B?VZEg-y@?&t)+c7r|Hy@tbKNU53DZU}=ScRVeW^>l#8(+2HD0X4)6J4-GGD^cnt_XwM$_q` zq|Bz9D&!8-yZ94Djodqu_kF}Bi*$;Nc`!Kd(ul#BuGAct5q0;DTW{31ASYlgJ~}VJ znUjG>7qJ*%Nj`h3S0}VbO};a(LM=ULwqla`sfwk?2!H2Yz%J9#HDmdEA9c$8c3GT! zN1M$AqG4*4t50@_J|g}%h0_4P;H;()2lk5M1C3ld3g4W5>$|C$o2*G!sy_Ol{lAbg zgn=OiQfj-LWESaCvFl4L-S zd{ZR$6PX;1`0jf#;R$;)@Zy^OyG6;>Gxesnoi0jMFSU^uuUIVrEkO4SisQJH zH;MZ;)CCXLnX3rTgw5i(X|R;pL)0tZiCeHzbxInoCWo?Wry3JU&l}8otzVa4yl+`v zco2!)g0XT^9W?4gZL=D~Q10T}#ooXQ2TIniS+!;j>M3Jr<9UHWiiu(LL_|wbFMW?X zJ(tM~WrwZKwG0P=D#8Ra=RfJ4)8Z!lrr@EVf;W>V8!!*~dmo!{ZSmR|l%7P0MSZHq z!c$=;m5++Y`o85@3HC0PzzycD_&_wr91IpMH9#!+*@Bx$?%6lKU3LJQK7I}6U{kzq&Du5NYu1miyEI?p}Z(6_p;x+3?cOzT;#`mG?En)!LII>flI*F)~+>xi;0os~q1)P-|0sb;@!sGh1xXjS4K0ckRa7Rcr}LR@a+TS1i+(`(9($ zu3ocjJG)-d_HnJ5ZL-P#B?KcfcD_mPh`4UG(0(tSD8+7#@9>9DHpLq!vi7pQ754B~ z#;;|RVb)h`*kfz!dcuo#yLGg-V(pr(Ti3=bSH`+sbN<$~YvU{9H8II~zGCaT@M+7| z4Z5`)YqqRi6W?=>%R-tpW8_&&o^@lJmqnz>l14L`%PO^GCXHv4ax#}JytbC5OCO5C zv1hNy%)))i!VyiE^$h4dOfu6B*bO(Nifnp8q4B~aGdx$Qt5hP&lQcRDhabB?snojF zc)pg*Ce>Bgp@oMki9L3-i*z%d8k-9BIfh&&unUiBzxreMcWcRGuS3b_=Wub$Y`~e# zo=jE6nxLw9Zf1#k>T{hijqHS)lH+JpJWtbVkKLb&wTY+L&qrw^k)q8*nK4jwI8jr| z{E3=M_SpTn_v|>$V1%z^E)j2Qi5;q$$dY;ERnneCjAuAib6YY?-<45~GHlKRE1iW$ z>o`BP&P+;hxYW&9#b6tK!rdl9fphrjCK$NyyqmELrm0sONx9wBLLn8nj-}vmw5HkB z##1-JbSu}c#nzYewfYPlm)5$>yP9o!o^~V@MxIV+*F;ynoF(pv&F+l8Dkn4nfo&D& znok-@t5%<8>xHDV6Yb8@YBG(OR5>6pn>4Z+gqxyfnWk6j)9|axo>Z-gEF4bA=HD-! zF=QB?P^5@bdU`UOMxEgjV`8Yyj_VN371L))$%!G+VM$Q21a`2v-L5kna=7E(ZUh*Y=~_2 zrCoTW%8;UxWU4yGc_*R@zRYG$UgM$y7MnOMI|4w7DD+ZdYwe~FajDx*>RU*p7Qkgk zg9ge>OyB~T>6HakAEGeCgo;2FDV>yj%l~Fs8*7G)ez~9H(lPQm+R^oS(8=q47PVBVSs2b&N0AY zHW+eRZSoo~qT4jGG?MXoEFy-jk<8ceK($n*LrzEex-q&L<>)Tlhb=`8R2q$O$D5G3 z0qc!@%5ZNn^z(RWY%GDvj)29bC^rp*PG?YOSuvv(@q9d6N8DyO<`gWO)w(j4YMD`y z8%}O@1ua2|!>FSXlTn}(hRXP>uYMrzm;_eIP6zW%s)1ycC}Ad2r4JLFgjI9$c%7iaAz9L=Xll8Z942~NTJ+uB*87cfQj+{yQ)8?!b zLOcJ2lcCboK+{oYk%HBCVMz+g8B|nc(}xs+k3AKBwTJYQ`Qb?&y)LC$>uoJ!_BPnX z1r9r&BmUPD;K}E5roF~Cc*f5Ag~RZeifSDuJ%lqlY*u5m3Wiy1NoE;pAMzCt*-7k# zRCEn`Ya72vLr+TXF+FvJq`PoL%<6NTnqC7+nQ1^4XA6gUrOIW6kfkup;y-2yLu5}O z!uw^UpQRLs)aPwP)brgChebIbCynd*`o0PHRYm18qzr zB)$trf;&qC+w}@VGy~xTUc`M}wg%WhC>ry@ELR@JD%Ynr5YpK;s1&C;S&Thn0#nWU zPg)rbzLoHK6_j95aE)hBb8nY;?__C5@r>7^oFSJ}>t0?KM7&61Kcl_YUK^C$fvu#x zaJYk2>Gsb>X7Et$u^EJdM$)x;}3FWI;FvX z=(sgFPQfI1BKJm|ldc?VRMA96bBn!brH#_zol{WfgqcZSB1L|nBLCi-aY)&1#xcX7 z+{m*2av0l?Y`N<0G}pjqnOH_Sn+`5KGN*Y6Y)B^j%v$!@Z4A!b(q>-&!jaiZCm+*; z*E>*pkw}Hgm}#g$@2m_Yb}n+g)$#MD{&t`ND~Pq4bASdpkHwt>E70T<`0b_n2W1HI zr?$ckn|e9_v%jKZx_mH~G95cve~Q5Q-1B7ELxUNZbGodq0l#61szR#yq1@>!Xg*#n zE_2;7ioCSA6~Ai_WE~$bNYxVkRm@UN<%8k53=`!(;)W$K-^#+a^Ih|a-GpLT(s>R( zPj|44s>v_6_t@zi7T-+Vki%W3Cn76&5@xpgyUBYwKGVVx3_q;OXT(btPOyspJX%r5 z6!`v{hbA``m`Ur8SS?PR%oN0`pwx7x*7oJ4I(`mg!BNt?Zq=XNXm%U&tooabyPpvR zarWa#yzmgCN*lj@xDqE5CDsj=mcpPixN)4BqiUD5nNI8Aob}`!U5fic;Go|M6xAve zBbT6K6Aewdh#e5-Kyt*3p+)vLEtHaQAev)!3P3%XY>>&6mU&G&+aiW!bA4po4u2I$ z_lN6pF+=MzOrR6+h5PzR>V3>Lyg0)!jdb&Sg*U0q$&WKBE=+>EP&jKh*M%=gJcFB! zOzxy#vCQ7AKSV9U%*l3o6qEWvjiJ(2Yc?~lH9v@V>^g1OPzb9?J{?SDnjPhz8~8!B zj6eqN34Myxz!r-X;&LfukTTC5N8k=K1QKZUN97#Na|*}hfgqQJ_7>BNP#7qCz3J`Bu{(2~6Mks&KyT&+`2&EV9FzAV@qRew z4|CY`R8x29uhRsMQCaK{q0SEkhLV;RXD}cg%3iCR3s9tNerlCKISq?0qKblQ=)1 z!$9vcx`_$u)+q?re(v`Ui-L-ZTUxl{M`sZle5as515##vI-B84NI^O*nM~K&Tcye0T-O51 zM5j!xi=18DAaA8h7E=jhuhAI-T?JJsoM>E9>KK5uw!vSO(7IBH8)Lf&g2j$$fkF}- zk+Nk;DeLQV)6pdrKR*CDoQC~Q;b9CGUlMJTsU)7M+u96vl4&`5&mTmBKg0uE{3>Ay zE>G=3*^YBPxRvnQAEKe3I{4$zu2;FFEDSb#U=p~WY>YRsQHAs&>ZErs3pCzcyci`p$VAQf&v?RWw=jn zp0`dW(zp-pH`h(b+D41x~9~#B}jIoFl5UVR;L> zw4R#U57NVVq0}C~ZKX^+M z56y?V7k3l*a@bc8qxQ9u*4Eq~;PbY~7vf#TKtg6T*f(dy3DP4D&?Q&i$Eb{8>dViM zLU6@K$DAvxpIj}Bpo_{QUXzD&J5RE_`9fAtxig1afKnt#t2*w;X`w45bHM`BB~B~~ z?N$-}vtfxN!7s(5IE?C70#_N!k{LxX8BS3cTN$Y9RK6BEa?Tg(D(pMyahlylX2m&o zf-g1AtY6`I;)neO8CfnU*58e$$X48OX7H4$$%8qFN~-We3KXUw8iVPzwuRKgYugXO z--Iw~qW%08E_VMY+R}4xSc}Bl(}+)7%mmO8bBui!ZqHpk)XJt|-YsyU(PQ}q+sds@ z8!b>*DOkiG8^w#q8`^6N<8`L!x^@uAZE$-^%%W(7CLqARVL4*>AN)-(dIy7} zZADA-!Yx7}Q`+euX?2TGfh#Jn6Bid&ZSAZEl}^pADPfnCuWcCfwgunWx@wVr^*$#x z;%`nfqFda&M4Pyd;pF;g)uL4 z%;GVd|zw_I?+`h$z@19}UxeYlxf`{+zq~1a>{uW;>>+eqe(nH>=ZuV4L#f?dcIj ze4|w=E=;M<{U+exz7sIeDd2^7FvU@PLK0xz-7jCEC9K(8>-R2dJ;Qq2&2+TwzswNo z;%`|mq(Rw!g=Mi*r2V#LBzneXrf4wo4PW$4ZzYDm=XwmgQcSDeBUnT6XV9EDvpFm< z9aawV)uArtXi=m$k7FwtUS)}Wg+XWYDBq%7$ddC?=Gl*Zgz?;af@}-Z@nXhKT35ly zvGmL+?@3Yj_af*|vJ8{7B}%|s$lDQ`t+^{iSnJL47+$$Q8^s($8xwHD@I;|l^apQM zQ`#Y9!-Bc)!r^p=m_%q{SQJ^JR!=N(a#c2U-u56O{p`zpj9 zM|Sb8{M}G?e%P5YNmR#$2~aL%!{`euCBus!IRBiJVP1f_m5zNrCT|9RsYLuW2#A}{ zG@ZBE7~<(Y(~xg*%gr1T#I}W4O6ecD%!XDyuR-T$X6Lz@c=W8mdmeh#6$na{1jVr+DRBxHx z)vo)nZPeVBO~d7U@kAt_#0Rn0G{i6ahLGxz{lT?@78S!M=!05SNv7rA^krP#N76th z>ml!OtB+hMl(A@gvJ0_HX0t8lPy2neR=U{tcn8RI z&l@xu<=m9pi|qYSe1tr+Y=A$J5;kU|MM!bvj$uN);z_1fqs6n|Y^hM7a+*apdAoLu z4;`RF?Klpxkr|m-7g`|XF?bXlmElMVTybE&jZyL=*N;%%rnz-&M}& zYGq|2i3lnvy5eW}ixxNLx-IGpbF5K2F+O&zOo}^uKG&G|%TQ&JUt{=m8NG!XiHb(f8Y2f4XdzZVUW^AK*B$huwD9a>C3Y*q?LX|*` zpW>0g&5Zm}b52dNcH{y``H(c^o%Cf9pL<@gDrV}ZBj;wK-SqcSrhzO|IYp9T=Fv#$ zIk5{zbVSgfKkqNEUwjZsf9{kbgS^=kHcO-2LO@2(L?EV$55mtGq?O6}qs#%-F-?uQ z%&A26qFOkyDp73|6Ka8uaR8H{DRxouDNXy&aZi_TS&q!-+z%RE>Z%~0W-Me4pcPRlWm zy$%V&XwXD??HVENxOx|pPoNB!=*SsawIrea#sVkR89CYU_wf~Ao zO#~&`wokkY^NDR&qhRngHt93sSR|ZM-3Bt1$utm3az2X$YvQ5v@4oGJ_}y)UEpW4M{{{_kM-08B z^-ZcnC@UXoMC_9q*ydTft@luenIqp}h2-oI;P`MJ zWP}sug%r(}tIvC{{`=^aJxT_@Y+3r#USuggz=VrGWXSQ>I48uF5mnIx*&1m||EQ_} z^RPknXgQbxYYo%;E_UvIENGrBhGNOlbN-)7SS2}97VL52;K!GuX6DAYD7Mb!D~<^N E0n)HcLI3~& literal 0 HcmV?d00001 diff --git a/po/be@latin.po b/po/be@latin.po new file mode 100644 index 0000000..4a2eb84 --- /dev/null +++ b/po/be@latin.po @@ -0,0 +1,2386 @@ +# Pierakład glib.HEAD. +# Copyright (C) 2007 THE glib.HEAD'S COPYRIGHT HOLDER +# Alaksandar Navicki , 2007. www.lacinka.org +# www.lacinka.org +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-02-16 23:33+0200\n" +"Last-Translator: Ihar Hrachyshka \n" +"Language-Team: Belarusian Latin \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +# glib/gmarkup.c:1120 +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Niečakany atrybut '%s' dla elementu '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atrybut '%s' elementu '%s' nia znojdzieny" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Niečakany značnik '%s', spadziavalisia značnika '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Niečakany značnik '%s' unutry '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Niemahčyma znajści pravilnaha fajłu zakładak u katalohach źviestak" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Zakładka dla URI '%s' užo isnuje" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Dla URI '%s' nia znojdziena zakładak" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Nie akreśleny typ MIME Å­ zakładcy dla URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nie akreślili pryvatnaha ściažka Å­ zakładcy dla URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nie akreślili hrup u zakładcy dla URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Nivodnaja aplikacyja pad nazvaj '%s' nie zarehistravała zakładki dla '%s'" + +# glib/gfileutils.c:745 +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Prablema z razhortvańniem radka zapusku '%s' z URI '%s'" + +# glib/gconvert.c:390 +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Kanversija naboru znakaÅ­ '%s' na '%s' nie padtrymlivajecca" + +# glib/gconvert.c:394 +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Niemahčyma adčynić kanverter z '%s' na '%s'" + +# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282 +# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875 +# glib/gutf8.c:1320 +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Niapravilnaja paśladoÅ­naść bajtaÅ­ na Å­vachodzie kanversii" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Pamyłka padčas kanversii: %s" + +# glib/gconvert.c:615 glib/gutf8.c:871 glib/gutf8.c:1071 glib/gutf8.c:1212 +# glib/gutf8.c:1316 +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "NiapoÅ­ny znak u kancy Å­vachodnaha radka" + +# glib/gconvert.c:788 +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Niemahčyma pierakanvertavać surahat znaku '%s' na nabor znakaÅ­ '%s'" + +# glib/gconvert.c:1593 +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI '%s' nie źjaÅ­lajucca absalutnym URI vykarystańnia \"fajłavaj\" schiemy" + +# glib/gconvert.c:1603 +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI '%s' miascovaha fajłu nia moža Å­klučać '#'" + +# glib/gconvert.c:1620 +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' niapravilny" + +# glib/gconvert.c:1632 +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Niapravilnaja nazva hostu Å­ URI '%s' " + +# glib/gconvert.c:1648 +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' utrymlivaje nieadpaviedna cytavanyja znaki" + +# glib/gconvert.c:1719 +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ściežka '%s nie źjaÅ­lajecca absalutnaj" + +# glib/gconvert.c:1729 +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Niapravilnaja nazva kamputara" + +# glib/gdir.c:79 +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Pamyłka pry adčynieńni katalohu '%s': %s" + +# glib/gfileutils.c:337 glib/gfileutils.c:402 +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nie atrymałasia raźmierkavać %lu bajtaÅ­ dla adčytańnia fajłu \"%s\"" + +# glib/gfileutils.c:348 +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +# glib/gfileutils.c:426 +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Pamyłka čytańnia z fajłu '%s': %s" + +# glib/gfileutils.c:465 glib/gfileutils.c:533 +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Niemahčyma adčynić fajł '%s': %s" + +# glib/gfileutils.c:479 +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Niemahčyma atrymać atrybuty fajłu '%s': funkcyja fstat() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Niemahčyma adčynić fajł '%s': funkcyja fdopen() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Niemahčyma źmianic nazvu fajłu '%s' na '%s': funkcyja g_rename() vyvieła " +"pamyłku: %s" + +# glib/gfileutils.c:745 +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Niemahčyma stvaryć fajł '%s': %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Niemahčyma adčynic fajł %s' dla zapisu: funkcyja fdopen() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Niemahčyma zapisać fajł '%s': funkcyja fwrite() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Niemahčyma zapisać fajł '%s': funkcyja fwrite() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Niemahčyma zapisać fajł '%s': funkcyja fwrite() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Niemahčyma začynić fajł %s': funkcyja fclose() vyvieła pamyłku: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Niemahčyma vydalić najaÅ­ny fajł '%s': funkcyja g_unlink() vyvieła pamyłku: %s" + +# glib/gfileutils.c:712 +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablon '%s' niapravilny, u im nie pavinna być '%s'" + +# glib/gfileutils.c:724 +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "U Å¡ablonie '%s' niama XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtaÅ­" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +# glib/gfileutils.c:745 +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Niemahčyma pračytać symbalnuju spasyłku '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbalnyja spasyłki nie padtrymlivajucca" + +# glib/giochannel.c:1114 +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nielha adčynić kanverter z '%s' na '%s': %s" + +# glib/giochannel.c:1460 +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Niemahčyma vykanać niepasrednaje čytańnie Å­ funkcyi " +"g_io_channel_read_line_string" + +# glib/giochannel.c:1507 glib/giochannel.c:1761 glib/giochannel.c:1847 +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "U bufery čytańnia zastalisia niepieraÅ­tvoranyja źviestki" + +# glib/giochannel.c:1587 glib/giochannel.c:1661 +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Na kancy kanału isnuje paśladoÅ­naść, jakaja adpaviadaje častcy znaku" + +# glib/giochannel.c:1647 +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Niemahčyma vykanać niepasrednaje čytańnie Å­ funkcyi g_io_channel_read_to_end" + +# glib/gfileutils.c:505 +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Niemahčyma adčynić fajł '%s': funkcyja open() vyvieła pamyłku: %s" + +# glib/gfileutils.c:505 +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Niemahčyma zmapavać fajł '%s': funkcyja mmap() vyvieła: %s" + +# glib/gmarkup.c:219 +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Pamyłka Å­ %d radku pry znaku %d: " + +# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896 +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Niapravilna kadavany tekst UTF-8 - niapravilny \"%s\"" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +# glib/gmarkup.c:303 +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Pamyłka Å­ radku %d: %s" + +# glib/gmarkup.c:528 +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Niemahčyma pierapracavać '%-.*s', dzie musić być ličba unutry łučyva da " +"znaku (naprykład ê) — mahčyma, ličba zavialikaja" + +# glib/gmarkup.c:580 +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Spasyłka na znak nie kančajecca kropkaj z koskaj; mahčyma znak & vykarystany " +"nie dla paznačeńnia pačatku adzinki — u takim vypadku zamianicie jaho jak " +"&" + +# glib/gmarkup.c:553 +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Spasyłka na znak '%-.*s' nie źjaÅ­lajecca zapisam dazvolenaha znaku" + +# glib/gmarkup.c:382 +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Pusty zapis '&;' adÅ¡ukany; dapuščalnyja: & " < > '" + +# glib/gmarkup.c:472 +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nieviadomaja nazva adzinki '%s'" + +# glib/gmarkup.c:482 +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Zapis nie kančajecca kropkaj z koskaj; zdajecca, vykarystali znak &, jaki " +"nia mieÅ­ aznačać pačatku adzinki — zamianicie jaho na &" + +# glib/gmarkup.c:932 +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dakument musić pačynacca z elementu (naprykład )" + +# glib/gmarkup.c:970 +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' nie źjaÅ­lajecca dapuščalnym znakam, paśla znaku '<'; hety znak nia moža " +"pačynać nazvy adzinki" + +# glib/gmarkup.c:1033 +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"DziÅ­ny znak '%s', čakaÅ­sia znak '>' dla zakančeńnia značnika elementu '%s'" + +# glib/gmarkup.c:1120 +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"DziÅ­ny znak '%s', čakaÅ­sia znak '=' paśla nazvy atrybutu '%s' elementu '%s'" + +# glib/gmarkup.c:1161 +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"DziÅ­ny znak '%s', čakali znaku '>' albo '/' dla zakryćcia pačatkovaha " +"značnika elementu '%s' ci dadatkova atrybutu; mahčyma, byÅ­ vykarystany " +"niedapuščalny znak u nazovie atrybutu" + +# glib/gmarkup.c:1244 +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"DziÅ­ny znak '%s', čakałasia padvojnaja dužka paśla znaku roÅ­naści, kali " +"nadajecca značeńnie atrybutu '%s' elementu '%s'" + +# glib/gmarkup.c:1384 +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' nia źjaÅ­lajecca dapuščalnym znakam zakančeńnia nazvy elementu '%s'; " +"dapuščalnym znakam źjaÅ­lajecca '>'" + +# glib/gmarkup.c:1433 +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' byÅ­ začynieny, dziejna niama adčynienych elementaÅ­" + +# glib/gmarkup.c:1442 +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' byÅ­ začynieny, ale dziejna adčynieny '%s'" + +# glib/gmarkup.c:1574 +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dakument byÅ­ pusty albo Å­trymlivaÅ­ tolki prabieły" + +# glib/gmarkup.c:1588 +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Adrazu paśla znaku '%s' dakument niečakana skončyÅ­sia" + +# glib/gmarkup.c:1596 glib/gmarkup.c:1640 +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dakument niečakana skončyÅ­sia, kali peÅ­nyja elementy byli jašče adčynienyja " +"— '%s' byÅ­ apoÅ¡nim adčynienym elementam" + +# glib/gmarkup.c:1604 +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dakument niečakana skončyÅ­sia, čakałasia vuhłavaja dužka, jakaja začyniaje " +"značnik <%s/>" + +# glib/gmarkup.c:1610 +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dakument niečakana skončyÅ­sia Å­nutry nazvy elementu" + +# glib/gmarkup.c:1615 +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dakument niečakana skončyÅ­sia Å­nutry nazvy atrybutu" + +# glib/gmarkup.c:1620 +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dakument niečakana skončyÅ­sia Å­nutry elementu, jaki adkryvaje značnik." + +# glib/gmarkup.c:1626 +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dakument niečakana skončyÅ­sia paśla znaku roÅ­naści, jaki iÅ¡oÅ­ za nazvaj " +"atrybutu: niama vartaści atrybutu" + +# glib/gmarkup.c:1633 +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dakument niečakana skončyÅ­sia Å­nutry vartaści atrybutu" + +# glib/gmarkup.c:1648 +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dakument niečakana skončyÅ­sia Å­nutry značnika zamykańnia elementu '%s'" + +# glib/gmarkup.c:1654 +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dakument niečakana skončyÅ­sia Å­nutry kamentara albo instrukcyi" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "sapsavany abjekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "unutranaja pamyłka ci sapsavany abjekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "nie chapiła pamiaci" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "limit viartańnia (backtracking) dasiahnutaja" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"Å¡ablon utrymlivaje elementy, jakija nie padtrymvajucca dla častkovaj " +"adpaviadnaści" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "unutranaja pamyłka" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"advarotnyja spasyłki jak umovy nie padtrymvajucca dla častkovaj adpaviadnaści" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "limit rekursii dasiahnuty" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "limit rabočaj prastory dla pustych padradkoÅ­ dasiahnuty" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "niapravilnaja kambinacyja ściažkoÅ­ novych radkoÅ­" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "nieviadomaja pamyłka" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ u kancy Å¡ablonu" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c u kancy Å¡ablonu" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "za \\ śleduje nieviadomy znak" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"escapy, jakija źmianiajuć rehistar (\\l, \\L, \\u, \\U), tut nie dazvolenyja" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "niečarhovyja liki Å­ quantyfikatary {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "zavialiki lik u quantyfikatary {}" + +# glib/giochannel.c:1587 glib/giochannel.c:1661 +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "nie staje kancavoj [ dziela znakavaj klasy" + +# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282 +# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875 +# glib/gutf8.c:1320 +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "niapravilnaja paśladoÅ­naść escape Å­ znakavaj klasie" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "dyjapazon nie Å­ paradku Å­ klasie znakaÅ­" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "niama čaho paÅ­tarać" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "nieviadomy znak paśla (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "nieviadomy znak paśla (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "nieviadomy znak paśla (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Nazvanyja klasy POSIX padtrymlivajucca tolki Å­ klasach" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "nie staje kancavoha )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") biaz pačatkovaj (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ci (?[+-]ličby musić zakančvacca na )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "spasyłka na niaisny padÅ¡ablon" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "nie staje ) paśla kamentara" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "rehularny vyraz zavialiki" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "niemahčyma atrymać pamiaci" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "assertacyja lookbehind niastałaj daŭžyni" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "nierečaisny lik ci nazva paśla (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "umoÅ­naja hrupa maje bolej za dźvie haliny" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "čakaÅ­sia assert paśla (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nieviadomaja nazva klasy POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "elementy paradkavańnia POSIX nie padtrymlivajucca" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "znakavaja vartaść u paśladoÅ­naści \\x{...} zavialikaja" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "niapravilnaja Å­mova (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nie dazvoleny Å­ assertacyi lookbehind" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursiÅ­ny vyklik moža zacyklicca niapeÅ­nym čynam" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "nie staje terminatara Å­ naźvie padÅ¡ablonu" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dva nazvanyja padÅ¡ablony adnolkava nazyvajucca" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "nierečaisnaja paśladoÅ­naść \\P ci \\p" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nazva nieviadomaj ułaścivaści paśla \\P ci \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nazva padÅ¡ablonu zavialikaja (maksymalna 32 znakaÅ­)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "zaÅ¡mat nazvanych padÅ¡ablonaÅ­ (maksymalna 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "vaśmiarkovaja vartaść bolÅ¡aja za \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "Hrupa DEFINE źmiaščaje bolÅ¡ za adnu halinu" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "paÅ­tor hrupy DEFINE nie dazvoleny" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "niapoÅ­nyja opcyi NEWLINE" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"paśla \\g nie padadziena nazvy Å­ dužkach ci nienulavoha liku Å­ " +"nieabaviazkovych dužkach" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "niečakany paÅ­tor" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "pierapaÅ­nieńnie kodu" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "rabočy abÅ¡ar dla kampilavańnia pierapaÅ­nieńnia" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "raniej pravierany padÅ¡ablon sa spasyłkami nia znojdzieny" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Pamyłka padčas poÅ¡uku adpaviednikaÅ­ dla rehularnaha vyrazu %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblijateka PCRE skampilavanaja biez padtrymki UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Biblijateka PCRE skampilavanaja biez padtrymki ŭłaścivaściaÅ­ UTF8" + +# glib/gmarkup.c:219 +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Pamyłka padčas kampilavańnia rehularnaha vyrazu %s pry znaku %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Pamyłka padčas aptymizacyi rehularnaha vyrazu %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "Å¡asnaccatkovaja ličba ci \"}\" čakalisia" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "Å¡asnaccatkovaja ličba čakałasia" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "nie staje \"<\" u symbalnaj spasyłcy" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "niezavierÅ¡anaja symbalnaja spasyłka" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "symbalnaja spasyłka nulavoj daŭžyni" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "čakałasia ličba" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "zabaronienaja symbalnaja spasyłka" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "zabłukaÅ­Å¡y kancavy \"\\\"" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "nieviadomaja cytavanaja paśladoÅ­naść" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Pamyłka padčas razboru tekstu zamieny \"%s\" pry znaku %lu: %s" + +# glib/gshell.c:71 +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Cytavany znak nie pačynajecca znakam dvukośsia" + +# glib/gshell.c:161 +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"U zahadnym radku albo inÅ¡ym cytavanym, jak u abałoncy, tekście pajaviÅ­sia " +"adzinočny znak cytavańnia" + +# glib/gshell.c:529 +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst skončyÅ­sia adrazu paśla znaku '\\'. (Tekst byÅ­ '%s')" + +# glib/gshell.c:536 +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Tekst skončyÅ­sia pierad adpaviednym dvukośsiem dla %c. (Tekst byÅ­ '%s')" + +# glib/gshell.c:548 +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst byÅ­ pusty (albo Å­ im byli tolki prabieły)" + +# glib/gspawn-win32.c:214 +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Niemahčyma adčytać źviestki pracesu-naščadka" + +# glib/gspawn-win32.c:981 glib/gspawn.c:1228 +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nielha stvaryć płyniu dziela kamunikacyi z pracesam-naščadkam (%s)" + +# glib/gspawn-win32.c:843 glib/gspawn.c:914 +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Niemahčyma adčytać płyniu naščadka (%s)" + +# glib/gspawn-win32.c:931 glib/gspawn.c:1119 +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Niemahčyma źmianić kataloh na '%s' (%s)" + +# glib/gspawn-win32.c:940 +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Niemahčyma vykanać praces-naščadka (%s)" + +# glib/gconvert.c:1729 +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Niapravilnaja nazva prahramy: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Niapravilny paradak u arhumencie %d: %s" + +# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189 +# glib/gutf8.c:1330 glib/gutf8.c:1426 +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Niapravilny radok u asiarodździ: %s" + +# glib/gdir.c:79 +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Niapravilny rabočy kataloh: %s" + +# glib/gspawn-win32.c:940 +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Niemahčyma Å­klučyć prahramu dapamohi (%s)" + +# glib/gspawn-win32.c:365 +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Pry adčytvańni źviestak pracesu-naščadka Å­ funkcyi g_io_channel_win32_poll() " +"adbyłasia nieviadomaja pamyłka" + +# glib/gspawn.c:161 +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Niemahčyma adčytać źviestki pracesu-naščadka (%s)" + +# glib/gspawn.c:293 +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Niečakanaja pamyłka Å­ funkcyi select() padčas čytańnia źviestak pracesu-" +"naščadka (%s)" + +# glib/gspawn.c:376 +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Niečakanaja pamyłka Å­ waitpid() (%s)" + +# glib/gspawn.c:979 +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Niemahčyma stvaryć praces (%s)" + +# glib/gspawn.c:1129 +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Niemahvyma vykanać praces-naščadka \"%s\" (%s)" + +# glib/gspawn.c:1139 +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Niemahčyma pierakiravać uvachod albo vyjście pracesu-naščadka (%s)" + +# glib/gspawn.c:1148 +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Niemahčyma stvaryć praces-naščadka (%s)" + +# glib/gspawn.c:1156 +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nieviadomaja pamyłka vykanańnia pracesu-naščadka \"%s\"" + +# glib/gspawn.c:1178 +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Niemahčyma adčytać adpaviednuju kolkaść źviestak ź PID kanału naščadka (%s)" + +# glib/gutf8.c:950 +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak pa-za dyjapazonam UTF-8" + +# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189 +# glib/gutf8.c:1330 glib/gutf8.c:1426 +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Niapravilny paradak na Å­vachodzie kanversii" + +# glib/gutf8.c:1341 glib/gutf8.c:1437 +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak pa-za dyjapazonam UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Vykarystańnie:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCYJA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcyi dapamohi:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Pakažy opcyi dapamohi" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Pakažy Å­sie opcyi dapamohi" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcyi aplikacyi:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Niemahčyma pierapracavać ličbavaj vartaści '%s' dla %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Ličbavaja vartaść '%s' dla %s pa-za dapuščalnymi miežami" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nielha pierapracavać padvojnuju ličbavuju vartaść '%s' dla %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Padvojnaja ličbavaja vartaść '%s' dla %s pa-za dapuščalnymi miežami" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Pamyłka padčas pierapracoÅ­ki %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Adsutny parametar dla %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Nieviadomaja opcyja %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Niemahčyma znajści pravilnaha fajłu kluča Å­ katalohach poÅ¡uku" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Heta nie zvyčajny fajł" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Fajł pusty" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Fajł kluču Å­trymlivaje radok '%s', jaki nie źjaÅ­lajecca paraj kluč-vartaść, " +"hrupaj, albo kamentarom" + +# glib/gconvert.c:1729 +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Niapravilnaja nazva hrupy: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Fajł kluča nie pačynajecca ad hrupy" + +# glib/gconvert.c:1729 +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Niapravilnaja nazva kluča: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Fajł kluča Å­trymlivaje kadavańnie '%s', jakoje nie absłuhoÅ­vajecca" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Fajł kluča nie Å­klučaje Å­ siabie hrupy '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Fajł kluča nie Å­klučaje Å­ siabie kluča '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Fajł kluča Å­klučaje Å­ siabie kluč '%s' z vartaściu '%s', nie zapisanaj jak " +"UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Fajł kluča Å­klučaje Å­ siabie kluč '%s' ź nieinterpretavalnaj vartaściu." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Fajł kluča Å­klučaje Å­ siabie kluč '%s' ź nieinterpretavalnaj vartaściu." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Fajł kluča Å­klučaje Å­ siabie kluč '%s' u hrupie '%s', jaki maje " +"nieinterpretavalnuju vartaść." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Fajł kluča nia maje kluča '%s' u hrupie '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Fajł kluča maje Å­ sabie cytavany znak na kancy radka" + +# glib/gconvert.c:1648 +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Fajł kluča maje Å­ sabie niedapuščalny cytavalny łancužok '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nielha interpretavać '%s' jak ličbavuju vartaść." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Ličbavaja vartaść '%s' pa-za dapuščalnymi miežami" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"Niemahčyma interpretavać značeńnie '%s' jak ličbavuju vartaść ź " +"niefiksavanaj koskaj." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ličbavuju vartaść '%s' niemahčyma interpretavać jak lahičnuju vartaść." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Funkcyi %s pieradadzieny nadta vialiki ličylnik" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Płyń užo začynienaja" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Aperacyja anulavanaja" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +# glib/gconvert.c:592 glib/gconvert.c:882 glib/giochannel.c:1282 +# glib/giochannel.c:1324 glib/giochannel.c:2163 glib/gutf8.c:875 +# glib/gutf8.c:1320 +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Niapravilnaja paśladoÅ­naść bajtaÅ­ na Å­vachodzie kanversii" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Aperacyja nie padtrymlivajecca" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Nieviadomy typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "typ fajłaÅ­ %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Zaŭčasny kaniec płyni" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Nienazvany" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Fajł stała nie akreślivaje pola Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Niemahčyma znajści terminału, vymahanaha dla aplikacyi" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Niemahčyma stvaryć kanfihuracyjny kataloh %s karystalnika dla aplikacyi: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Niemahčyma stvaryć kanfihuracyjny kataloh MIME %s dla karystalnika: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Niemahčyma stvaryć fajł stała %s dla karystalnika" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Asablivaje aznačeńnie dla %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "pryłada nie zaimplementavała vysoÅ­vańnia (eject)" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "pryłada nie zaimplementavała vysoÅ­vańnia (eject)" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "pryłada nie zaimplementavała apytańnia nośbitaÅ­ (poll)" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "pryłada nie zaimplementavała vysoÅ­vańnia (eject)" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "pryłada nie zaimplementavała vysoÅ­vańnia (eject)" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Aperacyja nie padtrymlivajecca" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Źmiaščalnaje mantavańnie nie isnuje" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Niemahčyma skapijavać zamiest katalohu" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Niemahčyma skapijavać kataloh zamiest inÅ¡aha katalohu" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Metavy fajł isnuje" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Niemahčyma rekursiÅ­na skapijavać kataloh" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbalnyja spasyłki nie padtrymlivajucca" + +# glib/gfileutils.c:348 +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: gio/gfile.c:2906 +#, fuzzy +msgid "Can't copy special file" +msgstr "Niemahčyma skapijavać zamiest katalohu" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Padadzienaja niapravilnaja vartaść symbalnaj spasyłki" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Śmietnica nie padtrymlivajacca" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nazvy fajłaÅ­ nia mohuć utrymlivać \"%c\"" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "masiÅ­ nie zaimplementavaÅ­ mantavańnia (mount)" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nivodnaja aplikacyja nie zarehistravanaja dla pracy z hetym fajłam" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Ličylnik začynieny" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "U fajłavaha ličylnika jość važkaja aperacyja" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Fajłavy ličylnik užo začynieny" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Płyń nie padtrymlivaje query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Dla płyni nie padtrymlivajecca zruch" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Dla Å­vachodnaj płyni nie dazvolenaje abcinańnie" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Dla płyni nie padtrymlivajecca abcinańnie" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Uvachodnaja płyń nie zaimplementavała čytańnia (read)" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Dla płyni jość važkaja aperacyja" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Niemahčyma znajści zmoŭčany typ manitora dla lakalnaha katalohu" + +# glib/gconvert.c:1729 +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Niapravilnaja nazva fajłu %s" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Pamyłka atrymańnia źviestak ab fajłavaj systemie: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Niemahčyma źmianić nazvu dla karaniovaha katalohu" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Pamyłka adčytańnia fajłu: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Niemahčyma źmianić nazvu dla fajłu, taki fajł užo isnuje" + +# glib/gconvert.c:1729 +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Niapravilnaja nazva fajłu" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Niemahčyma adčynić kataloh" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Pamyłka vykidańnia Å­ śmietnicu fajłu: %s" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Niemahčyma stvaryć kataloh śmietnicy %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Niemahčyma znajści najvyÅ¡ejÅ¡y kataloh dziela śmiećcia" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Niemahčyma znajści ci stvaryć kataloh dziela śmiećcia" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Niemahčyma stvaryć śmiaćciovy fajł źviestak: %s" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Niemahčyma vykinuć u śmietnicu fajł: %s" + +# glib/gdir.c:79 +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Pamyłka pry adčynieńni katalohu '%s': %s" + +# glib/gfileutils.c:745 +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Niemahčyma pračytać symbalnuju spasyłku '%s': %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Pamyłka stvareńnia symbalnaj spasyłki: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Pamyłka pieranosu fajłu: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Niemahčyma pieranieści kataloh zamiest inÅ¡aha katalohu" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "NiaÅ­dałaje stvareńnie zapasnoha fajłu" + +# glib/gfileutils.c:348 +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Pamyłka vydaleńnia metavaha fajłu: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Pieranos pamiž punktami mantavańnia nie padtrymlivajecca" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Vartaść atrybutu musić być nia-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia tekstavy radok)" + +# glib/gmarkup.c:1615 +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Niapravilnaja nazva paÅ¡yranaha atrybutu" + +# glib/gdir.c:79 +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Pamyłka akreśleńnia paÅ¡yranaha atrybutu '%s': %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Pamyłka atrymańnia stat() dla fajłu '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (niapravilnaje kadavańnie)" + +# glib/gfileutils.c:348 +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Pamyłka atrymańnia stat() dla fajłavaha deskryptara: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia bajtavy radok)" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Pamyłka akreśleńnia pravoÅ­: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Pamyłka akreśleńnia pravoÅ­: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Pamyłka akreśleńnia ŭładalnika: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbalnaja spasyłka musić być nia-NULL" + +# glib/gmarkup.c:303 +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Pamyłka akreśleńnia symbalnaj spasyłki: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Pamyłka akreśleńnia symbalnaj spasyłki: fajł nie źjaÅ­lajecca symbalnaj " +"spasyłkaj" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Pamyłka akreśleńnia pravoÅ­: %s" + +#: gio/glocalfileinfo.c:2149 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "symbalnaja spasyłka musić być nia-NULL" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Pamyłka akreśleńnia ŭładalnika: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Akreśleńnie atrybutu %s nie padtrymlivajecca" + +# glib/gfileutils.c:348 +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Pamyłka adčytańnia z fajłu: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Pamyłka zruchu Å­ fajle: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Pamyłka začynieńnia fajłu: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Niemahčyma znajści zmoŭčany typ manitora dla lakalnaha fajłu" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Pamyłka zapisu Å­ fajł: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Pamyłka vydaleńnia staroj zapasnoj spasyłki: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Pamyłka stvareńnia zapasnoj kopii: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Pamyłka źmieny nazy časovaha fajłu: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Pamyłka abcinańnia fajłu: %s" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Pamyłka adčynieńnia fajłu '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Metavy fajł źjaÅ­lajecca kataloham" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Metavy fajł nia prosty" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Fajł byÅ­ źmienieny zvonku" + +# glib/gfileutils.c:348 +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Akreśleny niapravilny GSeekType" + +# glib/gconvert.c:1729 +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Niapravilnaja zapyt pieraskoku Å­ fajle" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Niemahčyma padrezać GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Nielha źmianiać pamier płyni vyjścia Å­ pamiaci" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Nie Å­dałosia źmianić pamier płyni vyjścia Å­ pamiaci" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mantavańnie nie zaimplementavała admantavańnia (unmount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mantavańnie nie zaimplementavała vysoÅ­vańnia (eject)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mantavańnie nie zaimplementavała admantavańnia (unmount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mantavańnie nie zaimplementavała vysoÅ­vańnia (eject)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mantavańnie nie zaimplementavała pieramantavańnia (remount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +#, fuzzy +msgid "mount doesn't implement content type guessing" +msgstr "mantavańnie nie zaimplementavała admantavańnia (unmount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mantavańnie nie zaimplementavała admantavańnia (unmount)" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Vyjściovaja płyń nie zaimplementavała zapisu (write)" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Kryničnaja płyń užo začynienaja" + +# glib/gfileutils.c:348 +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Kryničnaja płyń užo začynienaja" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Pamyłka adčytańnia z fajłu: %s" + +# glib/gfileutils.c:745 +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Niemahčyma stvaryć kataloh śmietnicy %s: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Pamyłka zapisu Å­ fajł: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Pamyłka padčas kanversii: %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Pamyłka abcinańnia fajłu: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +# glib/gfileutils.c:745 +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Niemahčyma vykinuć u śmietnicu fajł: %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Pamyłka začynieńnia fajłu: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "źmieny asacyjacyjaÅ­ nie padtrymlivajucca dla win32" + +# glib/gfileutils.c:348 +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "nieviadomaja pamyłka" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Płyń užo začynienaja" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Zaŭčasny kaniec płyni" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +# glib/gfileutils.c:348 +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Pamyłka adčytańnia z unix: %s" + +# glib/gmarkup.c:303 +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Pamyłka začynieńnia unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Korań fajłavaj systemy" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Pamyłka zapisu Å­ unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "masiÅ­ nie zaimplementavaÅ­ vysoÅ­vańnia (eject)" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "masiÅ­ nie zaimplementavaÅ­ vysoÅ­vańnia (eject)" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Niemahčyma znajści aplikacyju" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Pamyłka Å­klučeńnia aplikacyi: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Adrasy URI nie padtrymlivajucca" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "źmieny asacyjacyjaÅ­ nie padtrymlivajucca dla win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Stvareńnie asacyjacyjaÅ­ nie padtrymlivajecca dla win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "nie chapiła pamiaci" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "unutranaja pamyłka" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +# glib/gconvert.c:1729 +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Niapravilnaja nazva kamputara" + +# glib/gutf8.c:1039 glib/gutf8.c:1048 glib/gutf8.c:1180 glib/gutf8.c:1189 +# glib/gutf8.c:1330 glib/gutf8.c:1426 +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Niapravilny paradak na Å­vachodzie kanversii" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Dasiahnuta maksymalnaje abmiežavańnie masiva źviestak" + +#~ msgid "do not hide entries" +#~ msgstr "nie chavaj elementaÅ­" + +#~ msgid "use a long listing format" +#~ msgstr "užyj daÅ­hi śpiskavy farmat" + +#~ msgid "[FILE...]" +#~ msgstr "[FAJŁ...]" + +# glib/gmarkup.c:392 +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Znak '%s' niedapuščalny na pačatku nazvy adzinki; znak & pačynaje " +#~ "adzinku; kali hety znak nie pavinien pačynać adzinki, zamianicie jaho na " +#~ "znak &" + +# glib/gmarkup.c:428 +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Znak '%s' niedapuščalny Å­nutry nazvy adzinki" + +# glib/gmarkup.c:570 +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Pustaja spasyłka na znak: u joj pavinien być numar, naprykład dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "NiezavierÅ¡anaja spasyłka na adzinku" + +#~ msgid "Unfinished character reference" +#~ msgstr "NiezavierÅ¡anaja spasyłka na znak" + +# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896 +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Niapravilna kadavany tekst UTF-8 - zadoÅ­haja paśladoÅ­naść" + +# glib/gmarkup.c:837 glib/gmarkup.c:865 glib/gmarkup.c:896 +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Niapravilna kadavany tekst UTF-8 - nie pačatkovy znak" + +# glib/gconvert.c:1632 +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Niapravilnaja nazva hostu Å­ URI '%s' " + +#, fuzzy +#~ msgid "name" +#~ msgstr "Nienazvany" + +# glib/gconvert.c:1632 +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Niapravilnaja nazva hostu Å­ URI '%s' " + +#, fuzzy +#~ msgid "names" +#~ msgstr "Nienazvany" + +# glib/gfileutils.c:348 +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Pamyłka atrymańnia stat() dla fajłavaha deskryptara: %s" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "Niemahčyma zahruzić tolki Å¡to stvorany fajł stała" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#~ msgid "Error creating backup link: %s" +#~ msgstr "Pamyłka stvareńnia zapasnoj spasyłki: %s" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "" +#~ "Funkcyi g_input_stream_read_async pieradadzieny nadta vialiki ličylnik" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "Funkcyi g_input_stream_skip pieradadzieny nadta vialiki ličylnik" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "" +#~ "Funkcyi g_input_stream_skip_async pieradadzieny nadta vialiki ličylnik" + +#~ msgid "Target file already exists" +#~ msgstr "Metavy fajł užo isnuje" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "Funkcyi g_output_stream_write pieradadzieny nadta vialiki ličylnik" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "" +#~ "Funkcyi g_output_stream_write_async pieradadzieny nadta vialiki ličylnik" diff --git a/po/bg.gmo b/po/bg.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f3be356250a9bd2f16948e1586917bd170174cbc GIT binary patch literal 59530 zcmeI537lPJefN*n6-5*fTo4anHqC@2AYc;0nm`~xga9hRaA)Su+)KyZ{P3l|9{SU@0}%JKkw)Bz86k@ z_nh;b=lMVX{aMbP@9zDKcSd~P|FkGN06bvNDC&AT_%dCMqUOO-v=2BAJ{x=@;7He+s?^+zHMGe*nhdUOfDAa6U*=(MnM54TJlG*MSSc z4}h-&zYZP*?lmil4hI*2hk|{e+I<&z82Cw0?R_6y0PabnUEndG$`68S?@mzkeHM(t zZ-DCG{{ltVL7eb4IvSh{_JNQd-2y^N^biP(qkjzeN3ZthXM&=06&Qmf;BnwB;9cO? zLD4%3k>cyyz{TLl!Fk{hL5f8C(WuUk1789TgSvh#sP?yk74YxD<>1kDQhd1r6yF{K z7lA(p)&49hI~J^gYVTvSb*SkRR=}Y{h{{99$20URAlN;3`nhzXeqL*Mril4~6TG1pK>zzXV0!3t^(3n**x+ zGEj0pKV07es{Qwd`wxSn?{C3k~oI@#b(o2I{#RKvXEY7erLi z--BxRxkp6NE5L(5J%0>{sG~Q6x_=cYI`0Bi&(3iDA3&A=B`Ep7;7He_6(FLDHi5FI zkAf=qPXT`qF6DgxqoN2?j?MvPCl`aF<9#3|6+H@~GSL&D_^>aPNk0w))sF_K=kEli zKc55DuYUpe0r!I_(fewUOVLVDdVN(mzZaDJ{|(f0&spsDd<1wM=iQ+6|0m)4zDwNh zj|D~VD5&~x2Sv|L5K^Om2G!mxj&{1v1=WvBK(+IUaQEGxU56s=iaeJ;4F+ zK=2|^biW(i3;aB&`o0FL+#kUd(fOi)M}eYmZ8*Oid?n`}1NR2M489Ef4u~p7zX3(p z++*Djy(!@30Y3qXzORG(gZ~Y_65Rhd_v=T3;`hm*`m-inZ-CO%D?pWhH~13pp>X}H zpyc;MQ2O$GoV&^$4dR-j^TC6_Yr&U;9|vCnei6j9qbES|VgD1NXf?PTJQ=(Ll%M)% z5Ee(TIT6`|HBj|F0IJ@{LACdcW#0c+fv@8HOi=!KBPc$-A3PX*7!<$03rfCw)5rnf zN>KM}p!oB4Q1yQZl)SzGir#O4xRU5OC*gy@#o&S9CU7Qr8>o7Bfok_R;7h@M=#=>1 z1xkMBf-eFu1P=k<3aTIP2i4EdfTx3du85+o;2Q8EouA_LT@&#A;0&(s0HwFz1*Hf3 zpX&Oy48%o5!{PiM5EmVdgOc~tXiWWjG58wrBrpaWpz6I96n}Pt;?Fn17lXeAMgI#= zbA31%6#a`q>C1Vb_%{s3;LV`)=6+E1eFYRBeguk7{{^c2{&ZUMdmSi!dNZhYZvbI^ zbRW0~{7iPa6Wi5C_eugD1QA6 z6kql_%jGp2ls=sWLV7d;Vgk|UK+*dwj6~1P0i|y%K(#*%z8bt4RDF+vF9N>-s=j{# zpASC!Y_D%$@Y$Td0Tll)0G|b342sUnzP;9=n7p!mJtInJLGLG`~1J`cPU+y}fK z6kT_N`+{ErQMKqhpyWR1T&Ht6i0MXe0oDEkpyW0Vs{K9R;C^u_xPbGO;0wV&2G#!? zz!>~AsCJs5>VE=!0r>Pcx}SLw_*%{n1ts@txPAku@}C6t{Fgz|@jX!d{B1Zt;7wlc zNKo~z1|^3cQ2KHexIg%DQ2hThQ1bpMDE{n!o|iuiRK4ebD!&PQF?b^=y6ypGZ%t7B z`!)DFaKAPF+^T>hp#0&jpycsYQ01cYUEYg8J--rEeFI<&-VE*u-VeSU{4BT-{0^vc zFMPApbp$B+oervhW8eYcdqC;;gWz7^_dw~z&%l>}hpctFmVnali$L+=9#DGtH{dJ4 z?}IA;-=OGu$pzl-Oi=AD1z!pFfH8P^zz+rdbMU|j`vi{wpIPzqCE#4n&kN_*fP+tq zq7Q?jg;E~||{lp6J3{ZOhf_3N!cq}OUzYWxLKLk$%53P}7 zf}`Lfa3^>y_$%-N@Q4esDeyK><(|9V?fndJDd)F@^RI%C5bZbM@#Yc`R}_62JRN++ zAUQEO0KOi46kH7MHRSR6RPbWXZv|I^FRZ(NJ|Db}^ACX+frk!95nYQu28yn|`A7PC z1-Jy<1g6lxt-v%BF{tQ(8^HH+p;9cNp;1i(gJM0R7ei)RU z-2om4J{<7(;1Qf3bEVh20hHYD1s8%p0S^b`tGvFm!Q(l<89WO7Iw*d;;A*e;LU0A= zp8%zQzXs0$Uwe(8UkRSf`RBoN!9B0__N$=!^`Z2lzX1K6u-WPS=;fZq8@jJZ=nwD>=U&JRAHrD0$6)pSRxtXK}t0)cwc7)4`+O@A`2yh{&QZfLp+`ApRim zYoPe^Yf$`|^#SMmTR}bly@2yR=;xP!16=12C=l9#eV>$mBDE*m# zAG!rz4XU5N01pRe-tYePJn#_CzZ~$V;7ZQ--sXC=7QBJ;cY*KJbKCLvPeVT7PdK0Z zpv&iFJ3QW>0xsqHMsNgt093!{Jmhk}3Ot|luY;oNu$|7g_kkyK{zLFgaQ?%7emQt7 z=U)LAgL^*WQ%3lkf3Vszl9z5_-r>6og;`}DC3;YWBdhoZP%CFqzdC~2l%6%T3 z2mUuW3!L|u%k3Oc{JIsCoc{t`1HR@nZtvHClFL4yb@^=q)vqRaD7fTv*cvzht^j`v zs{IrH%=P0&Q0@K<6yFd0yvut%xSaEwK-tINfzpq?|J?2RLU1tA$v-wZC}{ApiuKXei(J-P!Fe|`?G0#EphFi!{`#rb!^%fbD>jBLR> zz{9|O{?g@f5_mG_SA$EyCfE<|`4y*s42(JdG`K+b!TrIf|CRISW#FEie*{#$4}dQM z{}mhp{|l^w>;IZu1sn%^z;ph_^xf?okq$>b3XHHF8>wa%Q?RXTnT;-l-}<3b#JE|JcaXX z!2`grfyaSA2QLN>`-ZpkY48NjpY~1Hw`HK@csVG!e-0F1{|l6ym;IgNTftXwem{6D zI1a7?_x_gaT@QEx=eK|tg1-cHf9ht2;rupGdiy(2bRGA&(|-lHg!9jU>%rfH$AYzgVk`)L43r%#_-B{X z?cf~Fp8&Y4d^0He-VMGUd>niYc=!*zKNkeN9z2rkJ3;B|e}IGF%pdys zt>6~UzXTo&uJ{*Z40dxQA5_jh`|452))iIUeK~<@glG8Qi;r-pa8j$9p+`%AwB<;l93K&+&B5aXk^{ntr6u zxDETfKa@Wl{8O&{K3qSU^HajTEdl3q?+lIuIDdX9C%B69UEqBjFXa1`9H(=9M&}%# zSIo8=X z_rvZ^TrdIhbRA&fm(hJX{xigySzb`nZ1ycr(YT9J4roAIHD) z{m(e``GG@pF4v#I_hIlN@J3Ld{lOoB3&Z)*;1Z6F9AD@9_c>1DdlkHk;~b8sao)x8 zpM2M6i0=n+T*LPR!IyC8^D1zTe~mWt{g3$mCme@``)>!E;r=b)*_^Kp_g)uJx5qd> ztS@{vaD6$)Ug7?gTsw;6M9xRTHI-Y%v6SOC99~{xr@Pgzss{RcYre-E$8uCT*XQ3j{+VMD z$7NjW0atM7vx(!299MH(z@g7thv?$)d^k0jojbW9e1Cqa+?Tli3XXN9>!)z-*Bpm( z{Wfrr<9i(X{D*_(KOYU>hrr)*{G8*2P}lhZ@8#O#9HX4SnBx*4$wzCVLQpC>q8%<<M3l)DtXmh+Q1p3U)0&R+&T#L>s` zGS2S+Z|69N@9*H)$@e#KT+DGHhdy_6Jj(HU?!Sp+J>Lg7{x`=ZoX-VUb6mvt{{r=S z7vB%zNIp05<#*xaM(~~7I~+U>djVrM?*|V-PQt273j>LWSfr0u)TIb%ZC9~r6&f>T>8V^=B z+jHI3{@PGn8H%d|)xqk}XgpLItWLS+(RJ0V-UiJaI%{!kWIcuT57Zmg0(sWL;#iGW z)W>RXMuhk=Yw4`EJy6%;j&~MOZO^PYntjZfaeXA7eav~U={mo+)?XWK#Dimv(YU)B zcuITSo8vjroOokxbX|RHG_DUjc_Z|_L8(Wts$8)L)6^^sB9tPjy;y4Tp; z7_AOQ$MyDdF+9WN9`UI+I&QE&h8XL8@nChZKC(F;slH{bHbT+SdOSQ*@1bgA-NupH zXjSYQsEqWZFQe(Ic0E$r zhX86aG6GW zQ4txSL_JVLyI^ud+M$azI+!}Y;xkFH8R&CgeA2Q(bZu}tWvjg_rd<1Slw#_oSFghZ zwyk{-MaeX%y+X+aWMx99QNc0TvY|S#xulh80dq?7^>aed#VF& zv9+PvC^}oasEr}264@B6Lju?uja%;ph5U8pRoR6$ADLh;m!SnXk$K(&(8qHYc z*jx`)rI)G=jaKDFIu=vq!_|?&T0?5mkT+{=9z;dgo3*H>(UGwsd`vYy=`?d)D~5*0 zM$Z~Wmj|O0T(M&!+hA>oLJjGBMXjsTSpZPU5CP3I_hBSM{c_!SIh8;0|NC}2~dt($bR$)u`6Z`EOsSoBTN>oRLn2r!v z)Ymi;@a))t_g^vF#5`jlWHNfn+?ebjK6pms;9PMttf03jm^Exogr=rZ)Lk>N9NK%U zI5!LiJq-GM;XO`s*X|bV#B;RE@h)rk-`tiFucdTorXJWb|#0 zmu;%{V9M2j-sr@7&zL1uNC|0<4OKT0SI`t>T?YyBc6P1+EB8VcnV z7Q@ioB{Q@MTY&mnuN1VWK4?^60U-g9gt?8unG#H?nle38d?*R?>caFM=}NMy(Mtck zsXQuXS{4-Zgh@4N+`QUE(zs9wo{L11mM_O^po|FIk}@*r2}#(vPO6)*JkP7i1*I%9 zNr%vb(b~X(lhEb1v=O^i-v%lWnRH1slJQK?sktPZu5RWYs-_B-Oc%SBxDZ+p-AEAB^aHsCm~^Wbzc9xc!?6;rE{_;L~eC(7#D=X1v^6f>qBTgY{GS0N_k?3 zxDw~xcC;)EOU&X`v!}UpV{%Dj3IP@eJxbjswS+eOj|siw^B7aEY_XPTnUPPma-_3n zE}n&_uHvMTr48%2ULy=tMyiY4qsBAeGFBg59M2rkKmGcrGF)#gj+S{H{}=iGK#?UH zNl**kdi_v+;}9g{w8(0a9@oRLV%f+D=artGD%n5Y1G$C>Voud>catuLXcUGIxtpp; zH|68oT=s!Xn;RM-zc4t;oYyW43lmAlzHrkq)Q z4B;+!ufIBK)v6ml62t2I>bVjF71Ee>svws+=k5x|LjpbsUk7mBpd8LB12Lj0}W zz?PE!7bp$a8LcyfuP_vCskl)eFoNAznT?T&(uDW8eX`^AgX7iHjMAgk-$t( z!~8)>Dq+0SrajLl$lHc%=xIO6asL?8Gz#cS)RnZ(Ap9_%W3XesAoY9x=wM~kT~OO6 zbF_JJS@dA-qK-|qJdn78k?QaO^Fx+ij-m>dyk~?BjOCwX!bvTVx0e{9si<%#a|0T2 z=%UF>DuogzLkOng%wVf{!Tz;lLo(*sa~RbkTP}$iN$OKcCmEFHhY1HC=7&ORWPxe; zNPU1=GxI8Q<9>!OGkSAnl>hhjdgkFb_lTBTi|P`R&@hv4MVA}Tp3#_-FJ~E8+Nnix zpGDXr^|@*l#%Nbco7z>&?co~ZJoQhhJ}lHs9lf%I4L!i?B{P2|YN`xYG$~gsq!Cz| z?)D`+RJX1=fSvllvNG6O)v(61s?md*N!N%?=1X%7qg(6CHQ2Qx%_U0Yr&Eu_Y(rn3 zg?+NwP8=VsgsC=X_aNt;idx2*ipB&GR2i}M>h9E@G>y%KTC8@uRZY~a&((yiZ?3ZO zo^^49DQq-kU4==mZqi&vj5h6^j%IS>{A@mC_RK>T9(MR*A7*W0R$-tzhdBqtzOFLt zTuMu~j9qW+E%XO6W;vk(;h&H8Wi>piv)9Yf|)}vHwJVW%e~9Akp@u!U1B zc*Nmt3bqI(8&jt8@%~Ae%I)BRykbgxoBUe5N$<;I+g?x>lM5z*rjLp8Ee~ouLY{_3GIyMm&TD8#X82^lTv$Y6m@R4a zdA8Ndvf!wXxYJtA-a6A5M2=!Hg!4Js4YoX}TvcP~9J8{r)u9cwk@}DfrC7ojF2Z6* zKkGX~Y5z8ou1LGmEYO}j6~>xxP0cw>&ZkQTB7}jI;sDufHEMmLmh39=1{$c zTsLv`a+l^}+Vn<@b{=_mLh(vWH@m#D;Yw|Uv4GYD=K6f5&84@gY-}i9>~L=;Ehx$+ z4I`FoWkShnE0##OJ=uMvmJ@NC(gaJ^hJ60kOGYcJeWSMi&197?3I@-k$}FGh9_wTA zD_Y4ojHzau3@nAy(<%dG;w+l-jG~OEa~ftT&}!v1%8C%dyQu~J9<8shva&LJM(-Ro z*0KmZ^=Hb5gsm5r%BKS`ZkvL#Ai+=yG35$p`&vZ8@JMZg zjZp_!J&_#tI$luL}&Eo zmu5wOZsCQkS4YoE7M2Rjc`hTYAz6j6o=;ZU(%e2SjQ|ueYz}bb+CBW zp&e>$d#F`Y#(UNPo`o0bKASa@@tt+D16h zsuRv!MnGp7k?CJ-+UNAJ3mL1jXJXS)nkb=lTT==_WQq@_rO!BP#T%%ctspk@6Ewk= zs7n1=WkqFB=&g*)7qYUY`mj<5eG-wEiB^^OS!6?vEOBwy_j-vZWbz4He4AkiK$4%? zj>#}O)28~(Rk&^U^>WR!MlMmIYDKu8Eku!#;@!gS{wcHn7DQ)I461bWU2Gw7MtF=MM}lV%CgS?lT>wSzI%bXizc zY53LR72g*KF{Su>R()&)_Zd{M&3#R0SIey$ztW*#ASZ_3Bb(Q1DJwe5OLQJ+hXQRH z%&%#cySqADJz=CoWNSqEOR6o)n#;Guxsp3y%_tsq5792sw2)xOZ?I2PEEK%Z++@y6 zwI&bXsx`#a16r)9;nv1X?((yw2rSBYQxsvM+ZR28Vy4sW?waH%JS18E&@(Tdy;`g5 zdQSJ$(42fV`RxbstTj1zJi()?$tE)5*@}}sPheVFSZJpq+D_tnQcl~a%-SgHLy=q* zLooSAkW47ta^1v&m*|E)nnzYMW0pe6G!ItTJveUkXlI>0s|&^g4Qn-5K=ZyXghy4Q z$&fU$*p%)P5!yoJ+cUGSC3}u*Lp=jyw)17yAqbROhbyD&vc!n0%5% z>!D*keKGEH-j*XSt=y0utKtEu!Fdin)?Ft0g`ypV{OElCNXlBLpo_bNC z<#=G`Zc0O&vu*!GbdHUvG}&NAQ&?tAM^+6qiNzutTk!xBKE~FzGe;V(Ry0H#s8)vN zss1Sx?;EI-N&0wws?Q{)&qY%tAz4D`BZBDVVtvSr=Uk@o`a|UwTCypK=)5yltzL1) z>GS5zJ3m^Jn}#DMC`LtVPVjIMJUb#7V8>f`mGoExa|W?C4qVgI?pgetJ5=AT($V%;u+FxtYC-VN1~^Kd!jpuVUD~ z?{py#NoiCPn8g`+wgOqEG-4_Xhqlc+NpvDrf`jU@xy}JL4`>>tLZI)BdMa#EvE^`y z#FGnVd)5rhjn}N?7~?p5PTG*R1M3wYw742&!$S|gFni6WixJHw*?0qnW~)Qmw{9Eq zQJ;-b+7G<7Pp@&MypMNuBQqbikGI<3iII`9VU1UOnwtyBCIk6rk3ad%Y{mQ9g+K&p zUtqvy&P@OOMHSc)R)&1hv(G1_4L|W+%}`pgwHj)z&6dVG z)hQpJ7!Cu%TBT$CHWx6#-TH78rsqkQ#kw%XvaY(R(#y*3R!!A5BFW=50^{&#eEPC;S8DIJ8&QLso?W^NFP-`{Zb|Iv{6u|_U5q|DB{B?E zH=3XAV{S{;qLoZOrE11oVzcMZNw0@F{d8tt-a367!BVWKo$E+lL~Rp#$Z}3U$te87 z@H9wYvq}`N8BQ%AcQ2V#9dTFU(;@N)_MQd$rZ@i}qYVR-5?G>bMOR#5p(A}Vq&?E$jCBWp>JvTL`vt{WlY>ot4~{0eFOGQ8lBQ4aq->S6eu5HX zLsKnb?T6x1ra-<34*QyAKdWLID0S?q*3;J!w(4W%pW8f%o3?FbHa;CDm5qWr$USz~ zlw!vhUqT8|VG}ZMB#eanwtlWC$fPT&LrbZ8&nPw*9B>0isw_FYAh_nRBae*2s&BAx zts>w~v5I87n%2O4lQ%0#8*21mU^5Y+%1-)T!bEtbhPj=bQV??d1wemYCp3{#Sk^M8 zjP+&}L9G~k!gU-d<3nBxGH;I24b#o=$_H=QL@5y(-0Rgsn~;!jGMXsVvg^FAbt~Ldk;pbLY>;#VKg|oMF}htx3RW5z)~6 zyzWP1*m466KNh8S7>q<( z;4?-D5yeD%waVman^Mg#4?gYWv}&ZT{G)3{Z`V2gswZ17nb<~yv_`eZnN_`}+;v)` zzt-Dz{8)dZYc)&sd#pNRb=L`UAed^`iTII4@xu8F=6B6MtZU&B@qz`54nL}E{^9fI zQ?Tnye1%N9RBrweJhEuv!q?1SNV%0X*R>ia(O~XRyG)K7Aj816M`GqvhwB^SB}~yA zyS_5mT^V8;uQIPb(!Z3)hWf|YE#9@7ZBL8hFVzHqFT4h z`nX`;{5?)^$K9nlmPIy=cPKNDHC_mjm9jo|w5>2_+BkY4OD6X9=%M(aqvHjO_uw}KnvXWOHy<0{(%jm-ueqc7Fz37C z=FaA>=Cg9*Jig_w8I8xcyfKY+n-8kW=FWKhQYzd| z6FjnnC+5Y?+nbLxw~t?@zNlI5ssz`XkB(nv)y16cYCfRKx2eQ~RP|VM*Z9?Hiz>a% z`-6Z7DCr`)gL#{94$= z=?qE^^m}4TO~t(GDHjwEdP2?obOPUE zQ`a48(tku@{3pk&^N*V%9BFQ)4rfIdG|?auwK^m==-3)aND0sQY)U4_ zwku`YqY0t&BKp5IT;By>c8Zn8Jv|{eXs&@vJLn!PS)?aSd)i2bimr2pO96N&Z(}qA z38*Fw>R%eNHo`1P^G1{C4%l%y-+~PV$7d83To*i&CAeQSHGv)pZKvoSzbtCrEpkoN z-tmmBu-H0hEtzcE7zv%UpTAIdq3BZ7a67(3+-&Wp^NdQRZ`(mrqSVPpxC=Q|GXo>G z;Bu)P;uUHhgLIT3#)jmot{lHy>K`6;&P(i>w|+_=4V^R*nR9qF*8|v4iWJs%ju+ch zBBj>U*rP{D!MH;~DZlO52@4mdR&6>rc>@Yo66khp2+4yFLmHaw4WT>Kp#q75Pp`!! zQpfYygDs5IH7CNF};xo#B#!SpK&+t;3&DwnfRWNU&?O?9iYUqhLw!U-KoCR}+|OY@}q zF40a-C9Tm#-s+yRTBS0iJXSY4l5=aFo^`?HU7J0;6OU?IKy?;GKZNFy4V&Ay?iaN- z$lso|e2MJUlMLCSTtsX3L7qXG`%@Q2G2A@uh#Jdm?NQ69Er(o%0C@ohRfJFTEfRx|FDx=M zNVi|SNt*Q7pixnWnA5K5tEie}1+S}gNn@PEiIu5JyOy8sI{S6cn5kBu$N(Kz|rOh)jPFk=jUFbD)Grqn0tqD81u7@A7sbluaAkX+d~P)-58 zTMR`E>h6U8hq@4)Qn+0*I3BWm&w{WlRI2Keie0MN zd^h34h--0AaMRL?7N-Q?#Y7U+oDsV#%bbVA?EPs;KJKLEB$dB1)hD-fWsNsbeQwC2 z-%CQ4=!7vzstrS}gxrgZG>tFZOo-_0xv~g~>Uh57IhH))7E8*~S`sh)hpp9?OO^e# z&7sY`Z6^gzW0f*NF+%?NehaaLO5;zMm6xb96-k`G&l9MXSh_214yFzpG|GgZ9E>ta z>!{$qJYUnyTPBBNyVMoaZ4ohu9&>5#^Kw;bP*1WUE0cb@&y>J(b3vw|P$t{lX@>1a zPh*-(bET7S^M*{rZG1;hEgzD)Sy{7IW{)hfa2+=P2Y+}f3~ifRG2t8YSDdOxZAdR$ z)RWo3)n_JluM@D*v@ErB>6k_eXde<)QzpWlo_7RJCI*>KNjzB+CgjIcUAcT^I>Y&7 zD|dTsJ1vN|q7jAG;wRf2nrSK(8dTCp6I@E>BHJ~Z`G?)tb~M+max2qI77v2*7Z_l7 z2q~8<;u$GuzPuPt61QceV$C~0IX1`~Fc<6^Cr~m5SOL>pjq1s?D8gZ|rR3h-WQ2p2 z6y)37q3DaNNbFsXLOu=lg=csob>L5eD3XYrLkjV%tR3bnI!HsgtC@4^>C~A_lep_Y zJZAHrW$$8cp)hAGA8V<})pBwWRAP-Spip9bOZE$8ZL5}CmGvo8M28Z0grM_L0}d;l zfxAgrn^;KWf7HC2zT~{5DaI7W8WMJg@rFc)9+2BXiV>!a#%J@CwIzzDwCpkE5ys6& zFjA#oWldGC{?5EBGB2Olsx$HIb1yGP|yk+sP`k-aoxyRsONu$0V_P0+TS z0^`NYZOoABg6X`{>MPL8EmE+2TAc`*Cwao`0M6x>JKK>^31g**@bcoCOB;JiMZCukUCC7Oipca3WIo`4z;J) zoF2(m&O1IdfstsT=~4dM(fMJUY?DEf2jv_!ws4)9D!UC-!9+$%6=9e?RqYHay4<;hccdR<^P;Ze~a+K80UtEGYo*`VJ>M+nR`*F_WF4rHm2vK(s%wyB+17cMIAzs+r zAT{osW))`G#%L;mCOT7CT$*NeN-oGj(p9J_`lq%moTRSAv^^2Gq?!RSozSeQG^c$s zXxSF>Lfk&}?y^a0>)hXt*_Wb&$$)WzbjfBsg2J4c!XU2k8wI6FB z2QghXAP>4*{pidhvBW1T%uFp;^?8)w4(+mxDe*B$+{yDM{9bP{@0DwUFM3w{!I){A zYNW_L62_&aVcwmHv2_8gB_+v8Kn7LX*y*c&X*|!_lc`BkzwebZ-j|kTT#K^b5q2)$ zl`X(%qk!ghwx_>UWzMkpW5Uh04=f1FYL;VZsa7G}tU>NMO&Spb&h=jO_ey=q4BnDT z{SI;a>QQ{QgXgjtS-ZS+i=|K6!XCCt*hUOtFqkB`v0y@r4knse(uFM)LQ> zn=s~<-Dsg&$}4|GHernAHnN(Kcb;&0I%4{eIO2&aOw9YKui0M4Z_lUB*5#em3awm_ zDMOM{NZFZMAHNo!Zk>=^%gf|~I=JR!jlrBhEf!gpazvs?b9kCeZWM(d_SRYmL5{X2 zjOr$#YXUBK*lF_&Dxnl=_p~7M3FYLskd?w7{Qgs9UA*+mZ#Ya~TsFw*Y}N8bauiA< zE;I2ayq>0=`>$~CJ|Ri7!9*>NK^LxOnuH`j>;2?Oc`9m{p05nQNd7q&KlN-+K@=0ry*i?}oNTcp8)W!;xqPm|v&^9Ruvf^rJoL`| zs-XXV`5abIZ#I{l+h3K|NFCH_V+WsUC$Q=zjP!+vqRUA4@D!)C-0H2H!~~lmoX89O zA?lpSt>%gK4hMp5>?ua#u=Ms7tVqZBp%>z{IGbCIoWQ%u@oFWFAVx#H6BHt(4Mj-P z=S->VHr-cpqA49y?WohA3_a2iFoA94*%aJsX+%q(aPPTUx2aTXfl*Q2-$$|KY|fIk z0Oi8|k`7geS%LeqD=w)CSl*ebq2Wnp+tMy%mZ|NM)AX9zPt;Gq;6RX;DrCTl8M5}4 zQJ9hp=K$%lZA7+&S*ok8q~(y)L8s&*lJShV*hUp3hBTF(G!qR!mp@SlpXw(4C-?s+ zTMR$j?@i`6$!7r;%~fK{o&oaNBHecnoRTys#$kwbErvr!t?g_mf0fu2=ut z2vnm^6yh3L!K9TSI94R=;bi0yb~U7rQk(YvdF^5MM|v|5XPH#65ZSibrS_KIFSls! z&srDDY60Swz&C02xChzvSL&%!z#bZWCU30G^6JYz1uwjlpYv? zI5cBImU@@CD6ey#ZHnLlp2}~t#y*J+FIbm*U zS{9iM)g&&Y+_D*>m9t183>SC>!lW#3t8Bv3?lgC8_asin{Cp7m)K-8duPDhXrd~3Q z<^`oOWzQ3c7Bker^G~h3e4Ffaaym3^G5(J6tJ~LW%8M`%3GY(CZS#!gIpjB!S9Rq_ z63(+Ts%!!+y|J0FY;vf5+on^B=E@04E?hxubh1TZOSH6WYx=6!t`^H-Xn~%g9NzOn za!4}@jzuOUvws#6^)$b0(W!UsS}>2*T5XB9N|Ak!qR9s$XvS1@aS$BtfEGzQ-sym%x39@bxH8H{F>S z>SyFdo7Y&S=rXZSqcl@$We&L)W3&mRHI~>|I~@n+n)Ld!ziZU;tc69J$Iv^r8ojU+ ziGNw`XHJs8bR9lybY=I!N4 zw$hN8-V|4MO#7)b_iHej@3(Z^QxFuvruJmEQS%ORmGlM5Qexsf4~w#>mjqcJgj-!c zp<+HpIn4vOM1H77r1(5@i0HcH`}MV#TZ{4Oj|q+6;QZG(!^N*;+h69;xXvb{QvC}f zz1-vhnj|GdD>dsSyGX{7HqB%|EF%Swdl3MRLuAO%=$Q|g(sw3Z&eAvvNX>b0Tbv|9Ttx%K1N+$&?Vl;-+kgTO=JSgb$k>)Q6#9bI1d?o2$Q6sS zREd*EwJx=t+Q#dGNxBt@*}e}9eJPF}5{)o-o)?PqG)b*}m05JBd@u_#SE~V{^hi!d z!;fsUZ6q(jBf<6C;4LgIrQU>k685w$$Oa})6aoYC;-q?5ko%RiX;jAIp>0@}rdVIx z*|`h^K0cTwCsn)ykcgm+fU5-QFqC3OWy?0Ze+#_(NfLr;Pp z^EQ%(mf&s9+j!)IF?Gmx%e8OTq-$)}Xwqljr5Mm`zb5Fh1u1WvE|<^`Y{_jD1*Gb* zmZLBu{}?E4$CaF2bRZB~&7x9iiCT@%)h5L2Cm@kspg|kdjolcY2GTY?fm$a%kjZ_n zKER`@wIDrKkMHD}Hb2rq<%M78pi9`AwBI?O&2gq$C7(5+t~?nn2&!uu00#~(s%W^Y zKFdYo+BHxYQxscC)!~+sm-{VhY2>HgSoq;9_kE#`>l81I2&uEcvx4|c7uzeJURUO~ z5d#Iey|ZC2UO5-&P(IKZ#?%sn1gu4gWM$P%pp@PqDEcSO&X2DY*v(z@wjZLpSNdd; zi`tDdTVwl!Z+h6rCX`koW2p5t{DfsvwSLOv0X-ZPoige$<$ZKyUe{)_|4>ba%GKc@ z)nc#BAnAj>TjdFr)9Sz2Z2A&Br4oW|a0T~idMrkx96p_5`X7RmU4}=*m)NW6)HK(% zeTd+OafGLX8JJZXPZRC6#!PHHX3p2!H=(D$SmRYmB1&_tf+UlZCK#Q$pmvX43lc0W zF_@0HN@Qc8g6nZrm#yiy$&y#}P(TZl?VLdpenq&PTgyI9`zM-dkmo|u)ec(ix+lHOxNv7D6YvNqop5FL zft#yN*|ll7B2mLvhz#XZHPZm=YVKjyZ7kh%5t5|vz8$i2T`iA`>!F=e6}O0+5Tk6$ z6adc-70zJvmy7b?QkW@t#t9xa!))(Gk{{PmRvq51u)aC>Eh>r134E^Y9`-T{QFxe^ z7h6jaz^1h*>8VTj@zPY@;*}`}B`lC-DULjL3w0Cr`)+f1n$og&hSX;ABUL8q4qB)M z8DFanFUjE#6Az$R+OpSug5u6R#V0fAj@3E~;q*jV`bW@SMK@Wqa>jg;s=jDWSJp=C z+M4{S#b)P+Ofg$BADhXewicIAsy}I5%gRzxOOELVK_OJEr4CIiXgsg$$rB+xOsAkF z{4nM;O(Qc&2Hv<2s4 zT(fZye`CVZqUMx@YO8&|J%Hy!cBaZigSK@|8pma$9okCt!f8xX?at-R^`K1lQ{J*- zmOvH72-M~q0-Xhx5jCTodenC5M6mr+o2P(+Q!tR;EBoRT|z;a94I?c{l6 z?!OaHEjr01NTrosWy5;+rNIEH*9K2n=vL>^?n68el3K_$rwSjQ=D8O3d;C-6wdok@ zNw{Pgx09h>r~Au{&*DV3A;pbzl6geZb$^d-3Oj*XXH-nNJulMh;dHnqewe~c?a2=y zRCYGCvPgkFKOiaoWl&cZ#YI$%_`}q@hEH(B{`#lf$`tFR-1I9!e!291f?R-pL7^s1 zc9>mAy6C-9T}=8;z9jE#WgDs$aoW7Zlb`BI*VU)-cru-(90=XA#3I#%R6%#6=EU?d z`nIV`xh>icZ%^KBywNT@MG^aJ0%k3C;WFX~Gb71=|*Ox=A4sGhD@Yr zrZAnyvY@s-j+)aTq1aT?Yv>|Owet$?nnU8HMPn;vHsvzM_!SO9aw7(n`RD33S=V?{ zt5JFbQvsB>15Dy=Tq-4f<4QZq3hc6)m;k~9QMJ-?BQK@4Ev2n0YD4I@Kj9*xNlf$u zT%m5Jx#@@fKJWyp8Il$S1_hnMP$UtQg@;t()#O`Zh`j>8>iYBwy7bfj{>96D3RBTCP`FYe#U`lHx zN*Hoq>f+k)n@|hul6lzV`Qnr}N*IPV$^Et!`C?NlVwox0tYi<}wsgTo;twm;(r8Os zYg$o|x*2Q8$HEj)NP`jq)4vXHSr&;@H1)*QEVfN6_#qnv7(u48PGRZE^fz*B(Ix%e zX<3bF9V4HtsgUH+H)T?!nk`i#7ude7usEtTaPrZG&5_q4C_cFE zQTis-!NUCgfCL(89je9JxOM;Nq*y7FYE zFX@ynjwzkNh(aXXW@f02B^^1r_|ham>)AGMYy_(_O-!eqUKA!kM8ydj+~|w`7}g~8 zs93)hv#Md6>>`=6_CSqRVFbb4sE-Ei$9Z-T1NmbW5M>jf@*pg>Cib1z5e3-?>5i{h zhx%xGzO~$T(QA@cB1lT*jhH2HiBA&}@^A&#>b~=mHu;mZ;*YU1JV*JQ@9>InT}%#} z&$oa4ojCjxO09oGyzmgHczoBn% znJ$|;CybPSQ$(J|N2N9dPu8jtka{3PH21HtB6qBPwc)DuEl;;4JrXjLhB9Z0Z;x=4 zY$tK`gDz_GDB`n>7V~Jp)!yn)+F?~A)#wsOO<2iR63yT7!o9R{0O{E8l&)Ese&etG zg==T?jp>SHhRJ3#tbcCh`H{AH;7pg3qLKoW3o369s?ALoW5SnEwXwUf)q?hs^=EFoJWlo9Ml+0NgFViVqvovisL4-kWKmfb<( zJ@PSKH#a4_6Ze_IRZ*v0Vz$3Ckq&9wxsTkwD4z7BUv)0h9EEg2IV!e;=7sj9rMq8c zI|rt&qUFJ+%ez*TdJ}tXnB=(H(`)9~LTb)e7L(;`h&aB=&1I_F|4UmB4nax!NWe%GN* zRM4=%M2jKX6qJo5P-jif10j#u{U?)nhaZs#vA|+3!Y12gJD3w4QnH%*%eWjE>@idO z`zYrW>j~mTNa^*}d?|!0{+j(qHYl(m6dg5ZE+-#GM-=PT zqL~wZUXBZsv@L3)Ft1`cdRr@O33eW&=iA@gOo!Rla4E!ix`~yhs;zbv*>X;vSZ2vN z*DZ3HgH0C+5^vrnYj6ci!`B1}nf#Z9L{l_RHI3eMyN(#usu?(g@R+FyVY`)liYP*@ zvfz~N8d@{lQPrf_rb79@XMswYkA*SzCvcM_2tCScrp1gF-E4X3)&G!z#zA4ftO)`# z?N6g7!VuSu5*xGNCKR30M@*Sbd&A$I&DSwmNj(flNl9o_uiysL2$R09j9y0SS*p(G zd1RJpHPR6qO)5r)^k!QzaWBtshUl8cUOnmQ^JFmt=@chRr&`rh89a8I2+uw&z)ID8 zm|B?njdr_k#ilZIw(ov*DZkp*n-92c3z${wPLdl~a$Tlxs=`xZ;ps^+XS4|xd57Js z*bMkl{vhfWX_bp)(zcSnsAIXJ{<05pB&Crz2s(V9+#hvfJQL=_`5DSBRxn`);>o(SpEgDS)@y4ScI1(%_f3XcR767Gx_?++N;^`0?#}rEC+MC!mAoh@d2v-e^?`|QrW+np z=O%CJyZA!XwUDCPM4M}uqHtmBeHar@ewpxD`8#rZ4Em^CX0vhTJ(j1Qc9Y{K=w2bKFNm=+4-r9oQ$}OX` z^z)w@FF`A}7|fZh+HfFUGY%3BJu#k}VTL3v*rZ?2MwI^d#Ujge)R6z^sBP<4|H;#` zP$vzxh$+*8VPWJMQL3bKcRG9{jCaUf6VGC0Nnp@{Yp@65u zmQt(p?F?8Koe^gL|N%j+n@LFY9Qk{eS?$HVpiNA1*A)U!Rv%*_bWR)K3M;v?20$XhT!ohlN^(_R?eHYN2WV%COXXrPb=oizBLC&j}qSSl?!2j3&)ZSAUD}6 ZaY*CczqK#F{)fV`C1c5$fqe*h9$J3{~f literal 0 HcmV?d00001 diff --git a/po/bg.po b/po/bg.po new file mode 100644 index 0000000..6325f5a --- /dev/null +++ b/po/bg.po @@ -0,0 +1,2089 @@ +# Bulgarian translation of glib po-file. +# Copyright (C) 2002, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. +# Copyright (C) 2010 Free Software Foundation, Inc. +# Borislav Aleksandrov , 2002. +# Alexander Shopov , 2002, 2005, 2006, 2007, 2008, 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-06 20:22+0200\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочакван атрибут „%s“ на елемента „%s“" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрибутът „%s“ на елемента „%s“ не е открит" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочакван етикет „%s“, очакваше се „%s“" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочакван етикет „%s“ вътре в „%s“" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Не може да се открие валиден файл с отметки в папките с данни" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Вече съществува отметка за адреса „%s“" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Не е открита отметка за адреса „%s“" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Не е указан видът MIME в отметката за адреса „%s“" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Не е зададен флаг за лични данни в отметката за адреса „%s“" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Не са зададени групи в отметката за адреса „%s“" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Никоя програма „%s“ не е регистрирала отметка за „%s“" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Неуспех при дописването на реда за изпълнение „%s“ с адреса „%s“" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Преобразуването от набора знаци „%s“ към „%s“ не се поддържа" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не може да се отвори конвертор от „%s“ към „%s“" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Грешна байтова последователност на входа за преобразуване" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка по време на преобразуване: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Непълна знакова последователност в края на входните данни" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Заместващият знак „%s“ не може да бъде преобразуван към знак от набора „%s“" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Адресът „%s“ не е абсолютен при използване на схемата „file“ (файлова " +"система)" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адресът „%s“ на локален файл не може да включва „#“" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адресът „%s“ е неправилен" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Името на хоста в адреса „%s“ е неправилно" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адресът „%s“ съдържа грешни екраниращи последователности" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Пътят „%s“ не е абсолютен" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Неправилно име на хост" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отваряне на папка „%s“: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Неуспех при заделянето на %lu байта за четене на файла „%s“" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при четене на файл „%s“: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файлът „%s“ е прекалено голям" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Неуспех при четене от файл „%s“: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Неуспех при отваряне на файл „%s“: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Неуспех при получаване на атрибутите на файл „%s“: неуспешно изпълнение на " +"fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" +"Неуспех при отваряне на файл „%s“: неуспешно изпълнение на fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Неуспех при преименуване на файл „%s“ на „%s“: неуспешно изпълнение на " +"g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Неуспех при създаване на файл „%s“: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Неуспех при отваряне на файл „%s“ за писане: неуспешно изпълнение на fdopen" +"(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Неуспех при запис на файл „%s“: неуспешно изпълнение на fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Неуспех при запис на файл „%s“: неуспешно изпълнение на fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Неуспех при запис на файл „%s“: неуспешно изпълнение на fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" +"Неуспех при затваряне на файл „%s“: неуспешно изпълнение на fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Неуспех при изтриването на съществуващия файл „%s“: неуспешно изпълнение на " +"g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблонът „%s“ е неправилен, не трябва да съдържа „%s“" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблонът „%s“ не съдържа XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u B" +msgstr[1] "%u B" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Неуспех при четене на символната връзка „%s“: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Символни връзки не се поддържат" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не може да се отвори конвертор от „%s“ към „%s“: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Не може да се чете от g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "В буфера за четене останаха непреобразувани данни" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Каналът прекъсна на непълен знак" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Не може да се чете от g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Неуспех при отваряне на файл „%s“: неуспешно изпълнение на open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" +"Неуспех при отваряне на файл в паметта „%s“: неуспешно изпълнение на mmap(): " +"%s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка на ред %d, знак %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Неправилно кодиран текст в UTF-8 — „%s“ е грешен" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s“ е неправилно име " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s“ е неправилно име „%c“" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка на ред %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Грешка при анализ на „%-.*s“, което трябва да е число в указател на знак " +"(напр. ê). Вероятно числото е твърде голямо" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Указателят на знак не завършва с „;“. Най-вероятно сте използвали амперсанд, " +"без той да е начало на заместваща последователност. Представете амперсанда " +"чрез „&“" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Указателят на знак „%-.*s“ не представя разрешен знак при декодиране" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Намерена е празна заместваща последователност: „&;“. Валидни " +"последователности са: „&“, „"“, „<“, „>“, „'“" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Името на заместващата последователност „%-.*s“ е неизвестно" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Заместващата последователност не завършва с „;“. Най-вероятно сте използвали " +"амперсанд, без той да е начало на заместваща последователност. Представете " +"амперсанда чрез „&“" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Документът трябва да започва с елемент (напр. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ е неправилен знак след „<“. Името на елемент не може да започне с него" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Неподходящ знак „%s“, очаква се етикетът на празния елемент „%s“ да завърши " +"с „>“" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Неподходящ знак „%s“, очаква се „=“ след името на атрибут „%s“ на елемент „%" +"s“" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Неподходящ знак „%s“, очаква се или отварящият етикет на елемента „%s“ да " +"завърши със знак „>“ или „/“, или евентуално да продължи с атрибут. Най-" +"вероятно използвате неправилен знак в името на атрибут" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Неподходящ знак „%s“, очаква се знакът „\"“ след знака за равенство, когато " +"се присвоява стойност на атрибута „%s“ на елемент „%s“" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ е неправилен знак при завършването на затварящ етикет с име „%s“. " +"Позволен е знакът „>“" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елементът „%s“ е затворен, няма текущо отворен елемент" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елементът „%s“ е затворен, но текущо е отворен елемент „%s“" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Документът е празен или съдържа само празни знаци" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документът завършва неочаквано веднага след отваряща счупена скоба — „<“" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документът завършва неочаквано — има отворени елементи. Последно отворен е „%" +"s“" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документът завършва неочаквано, очаква се затваряща счупена скоба да завърши " +"етикета <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документът завършва неочаквано в името на елемент" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документът завършва неочаквано в името на атрибут" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документът завършва неочаквано в отварящ етикет на елемент " + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документът завършва неочаквано след знака за равенство следващ името на " +"атрибута. Атрибутът няма стойност" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документът завършва неочаквано вътре в стойността на атрибут" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документът завършва неочаквано в затварящия етикет на елемент „%s“" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документът завършва неочаквано в коментар или инструкция за обработка" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "повреден обект" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "вътрешна грешка или повреден обект" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "недостатъчно памет" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "достигната е границата на обратното връщане" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблонът съдържа елементи, които не се поддържат при частично съвпадение" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "вътрешна грешка" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"обратните указатели не се поддържат като условие при частично съвпадение" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "прекалено дълбока рекурсия" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "границата на работното пространство за празни поднизове е достигната" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "неправилна комбинация от флагове за нов ред" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "непозната грешка" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "„\\“ в края на шаблон" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "„\\c“ в края на шаблон" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "след „\\“ следва непознат знак" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"тук не са позволени екранирания за промяна на регистъра („\\l“, „\\L“, " +"„\\u“, „\\U“)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "числата не са в правилен ред в определението за брой с „{}“" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "прекалено голямо число в определението за брой с „{}“" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "липсва завършващ знак „]“ за клас от знаци" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "грешна екранираща последователност в класа от знаци" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "знаците са в неправилен ред в класа от знаци" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "няма какво да се повтори" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "непознат знак след „(?“" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "непознат знак след „(?<“" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "непознат знак след „(?P“" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "именованите класове от POSIX се поддържат само в клас" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "липсва завършваща „)“" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "„)“ без отваряща „(“" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "„(?R“ или „(?[+-]цифри“ трябва да се следват от „)“" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "указател към несъществуващ подшаблон" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "липсваща „)“ след коментар" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "регулярният израз е прекалено голям" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "неуспех при получаването на памет" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "предположението за преглед назад не е с постоянна дължина" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "неправилен номер или име след „(?(“" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "условната група съдържа повече от две разклонения" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "очаква се предположение след „(?(“" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "непознато име на клас по POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "не се поддържат елементи на POSIX за подредба" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "знаковата стойност в последователността „\\x{…}“ е прекалено голяма" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "неправилно условие „(?(0)“" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "предположението за преглед назад не може да съдържа „\\C“" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "рекурсивно извикване може да доведе до безкраен цикъл" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "липсва краен знак в име на подшаблон" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "два именовани подшаблона са с еднакво име" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "неправилни последователности „\\P“ или „\\p“" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "непознато име на свойство след „\\P“ или „\\p“" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "името на подшаблон е прекалено дълго (максимално е 32 знака)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "прекалено много именовани подшаблони (максимумът е 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "осмичната стойност е по-голяма от „\\377“" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "групата DEFINE съдържа повече от едно разклонение" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "не можете да повторите група DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "несъвместими опции за нов ред" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"„\\g“ не е последвано от име във фигурни скоби или число различно от „0“ " +"евентуално във фигурни скоби" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "неочаквано повторение" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "препълване на кода" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "надхвърлено е работното пространство за компилация" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "не е открит указан предварително проверен подшаблон" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Грешка %2$s при напасването на регулярния израз — %1$s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Библиотеката PCRE е компилирана без поддръжка на UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Библиотеката PCRE е компилирана без поддръжка на настройки в UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка при компилирането на регулярния израз %s, знак %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Грешка при оптимизирането на регулярния израз %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "очаква се шестнайсетично число или „}“" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "очаква се шестнайсетично число" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "в символния указател липсва „<“" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "незавършен символен указател" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "символен указател с нулева дължина" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "очаква се цифра" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "неправилен символен указател" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "в края има един знак „\\“ в повече" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "непозната екранираща последователност" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Грешка при анализа на текста за замяна „%s“, знак %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Цитиран текст не започва със знака „\"“" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Липсват затварящи кавички в команден ред или друг текст цитиран за обвивката" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текстът свърши веднага след знака „\\“. (Текстът е „%s“)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текстът свърши преди откриването на затварящи кавички за %c. (Текстът е „%s“)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текстът е празен (или съдържа само празни знаци)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Неуспех при четене на данни от дъщерен процес" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Неуспех при създаването на канал за комуникация с дъщерен процес (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Неуспех при четене от дъщерен канал (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Неуспех при промяна към папка „%s“ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Неуспех при изпълнение на дъщерен процес (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Неправилно име на програма: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Невалиден низ във вектора с аргументи на позиция %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Неправилен низ в средата: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Неправилна работна папка: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Неуспех при изпълнение на програмата за помощта (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочаквана грешка в g_io_channel_win32_poll() при четене на данни от дъщерен " +"процес" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Неуспех при четене на данни от дъщерен процес (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочаквана грешка в select() при четене на данни от дъщерен процес (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочаквана грешка в waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Неуспешно разклоняване (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Неуспех при изпълнение на дъщерен процес „%s“ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Неуспех при пренасочване на изхода или входа на дъщерен процес (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Неуспех при разклоняване на дъщерен процес (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Неизвестна грешка при изпълнение на дъщерен процес „%s“" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Неуспех при четенето на достатъчно данни от канала на дъщерен процес (с " +"идентификатор %s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Знак извън обхвата на UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Неправилна последователност на входа" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Знак извън обхвата на UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Употреба:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ОПЦИЯ…]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Настройки на помощта:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Показване на настройките на помощта" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Показване на всички настройки на помощта" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Настройки на приложението:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не може да се анализира целочислената стойност „%s“ за %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" +"Целочислената стойност „%s“ за %s е извън интервала на допустимите стойности" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" +"Не може да се анализира стойността с повишена точност double „%s“ за %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" +"Стойността с повишена точност — double „%s“ за %s е извън интервала на " +"допустимите стойности" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Грешка при анализа на опцията: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Липсва аргумент за %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Непозната опция %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Не може да се открие валиден файл с ключове в папките с данни" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Не е обикновен файл" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Файлът е празен" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ключовият файл съдържа реда „%s“, който не е нито двойка ключ-стойност, нито " +"група, нито коментар" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Неправилно име на група: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Ключовият файл не започва с група" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Неправилно име на ключ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ключовият файл съдържа неподдържаното кодиране „%s“" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ключовият файл не съдържа групата „%s“" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ключовият файл не съдържа ключа „%s“" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Ключовият файл съдържа ключ „%s“ със стойност „%s“, която не е в UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Ключовият файл съдържа ключа „%s“, чиято стойност не може да бъде " +"анализирана." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ключовият файл съдържа ключа „%s“, чиято стойност не може да бъде " +"анализирана." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ключовият файл съдържа ключа „%s“ в групата „%s“, чиято стойност не може да " +"бъде анализирана." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ключовият файл не съдържа ключа „%s“ в групата „%s“" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Ключовият файл съдържа екранираща последователност в край на ред" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ключовият файл съдържа грешна екранираща последователност — „%s“" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Стойността „%s“ не може да се интерпретира като число." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целочислената стойност „%s“ е извън интервала на допустими стойности" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"Стойността „%s“ не може да се интерпретира като число с плаваща запетая." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Стойността „%s“ не може да се интерпретира като булева." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Подадена е прекалено голяма стойност на %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Потокът вече е затворен" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Действието е прекратено" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Неправилен обект, не е инициализирано" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Непълна байтова последователност на входа" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Няма достатъчно място в целта" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Не се поддържа отменима инициализация" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Непознат вид" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "Вид на файла %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "Вид на %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочаквано ранен край на поток" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Без име" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Във файла .desktop липсва поле за изпълнение" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Не може да се открие терминал за приложението" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не може да се създаде папката с потребителските настройки %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не може да се създаде папката с настройките за MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не може да се създаде файл .desktop — „%s“" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Потребителска дефиниция за %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "устройството не поддържа изваждане" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "устройството не поддържа нито изваждане, нито изваждане с действие" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "устройството не поддържа следене за носител" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "устройството не поддържа стартиране" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "устройството не поддържа спиране" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Версия %d на кодирането GEmblem не се поддържа" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Неправилен брой лексеми (%d) в кодирането GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Версия %d на кодирането GEmblemedIcon не се поддържа" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Неправилен брой лексеми (%d) в кодирането GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Очакваше се GEmblem за GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Действието не се поддържа" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Съдържащият монтиран обект не съществува" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Не може да се копира върху папка" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Папка не може да се копира върху папка" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Целевият файл съществува" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Папката не може да се копира рекурсивно" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Не се поддържа разделяне" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Грешка при разделяне на файл: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Не може да се копира специален файл" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Зададена е неправилна стойност на символна връзка" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Не се поддържа кошче" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Файловите имена не могат да съдържат „%c“" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "томът не поддържа монтиране" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Не е регистрирано приложение за обработка на този вид файлове" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Броячът е затворен" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Файловият брояч все още е е привършил" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Файловият брояч вече е затворен" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Версия %d на кодирането GFileIcon не се поддържа" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Неправилни входни данни за GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Потокът не поддържа запитване за информация" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Търсенето не се поддържа от потока" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Входният поток не може да се съкращава" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Потокът не може да се съкращава" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Неправилен брой лексеми (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Липсва тип за името на клас %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Типът „%s“ не поддържа интерфейса GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Типът „%s“ не е класов" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Неправилен номер на версия: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Типът „%s“ не поддържа from_tokens() от интерфейса GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Подадената версия на кодирането на икони не се поддържа" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Входният поток не поддържа четене" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Действията върху потока не са привършили" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Няма достатъчно място за адреса на гнездо" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Неподдържан адрес на гнездо" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Стандартният датчик за монтиране на локални папки не може да се открие " + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Неправилно име на файл: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка при получаване на информация за файловата система: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Кореновата папка не може да се преименува" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Грешка при преименуване на файл: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Файлът не може да се преименува — съществува друг файл с такова име" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Неправилно име на файл" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Грешка при отваряне на файл: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Папката не може да бъде отворена" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Грешка при изтриване на файл: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Грешка при преместване на файл в кошчето: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Неуспех при създаване на папката за кошче „%s“: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Не може да се открие най-горната папка за кошче" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Не може да се създаде папката за кошче" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Неуспех при създаване на файл с информация за кошчето: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Неуспех при преместване на файл в кошчето: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Грешка при създаване на папка: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файловата система не поддържа символни връзки" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка при създаване на символна връзка: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Грешка при преместване на файл: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Папка не може да бъде преместена върху папка" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Неуспешно създаване на резервен файл" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Грешка при премахване на целевия файл: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Не се поддържа местене между монтирани местоположения" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Стойността на атрибут не трябва да е NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Неправилен вид на атрибут (очакваше се низ)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Неправилно име на допълнителен атрибут" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка при задаване на допълнителен атрибут „%s“: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Грешка при получаване на състоянието на файл „%s“: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (неправилно кодиране)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Грешка при получаване на състоянието на файловия дескриптор: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Неправилен вид на атрибут (очакваше се uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Неправилен вид на атрибут (очакваше се uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Неправилен вид на атрибут (очакваше се низ от байтове)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Грешка при задаване на правата за достъп на символната връзка" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка при задаване на правата за достъп: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Грешка при задаване на собственик: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "символната връзка трябва да не е NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка при задаване на символна връзка: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Грешка при задаване на символна връзка: файлът не е такава" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка при задаване на времето на промяна или достъп: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Контекстът на SELinux трябва да не е NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка при задаване на контекста на SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux не е включен на тази система" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Не се поддържа задаването на атрибута %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Грешка при четене от файл: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка при търсене във файл: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Грешка при затваряне на файл: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Стандартният датчик за локални файлове не може да се открие " + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Грешка при запис във файл: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка при премахване на стара, резервна връзка: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка при създаване на резервно копие: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка при преименуване на временен файл: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при съкращаване на файл: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка при отваряне на файла „%s“: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Целевият файл е папка" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Целевият файл не е обикновен файл" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Файлът бе променен от външно приложение" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Грешка при изтриване на стар файл: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Зададен е неправилен GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Неправилна заявка за търсене" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream не може да се съкрати" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Изходящият поток в паметта не може да бъде преоразмерен" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Неуспех при преоразмеряването на изходящия поток в паметта" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Количеството памет, необходимо за обработката на записа, е по-голямо от " +"наличното адресно пространство." + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Заявеното търсене е преди началото на потока" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Заявеното търсене е след края на потока" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "монтираният обект не поддържа демонтиране" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "монтираният обект не поддържа изваждане" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"монтираният обект не поддържа нито демонтиране, нито демонтиране с действие" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"монтираният обект не поддържа нито изваждане, нито изваждане с действие" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "монтираният обект не поддържа повторно монтиране" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "монтираният обект не поддържа откриване на вида" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "монтираният обект не поддържа синхронно откриване на вида" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Името на хоста „%s“ съдържа „[“, но липсва „]“" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Изходният поток не поддържа запис" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Изходният поток вече е затворен" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка при откриване по адрес на „%s“: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка при обратно откриване по адрес на „%s“: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Няма запис за услугата „%s“" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Временно е невъзможно „%s“ да бъде открит по адрес" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Грешка при откриване по адрес на %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Неправилно гнездо, не е инициализирано" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Неправилно гнездо, неуспешна инициализация понеже: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Гнездото вече е затворено" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "създаване на GSocket от файлов дескриптор: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Неуспех при създаване на гнездо: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Указан е непознат протокол" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "локалният адрес не може да бъде получен :%s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "отдалеченият адрес не може да бъде получен :%s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "не може да се слуша: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Грешка при свързване към адрес: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Грешка при приемане на връзка: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Грешка при свързване: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "В момента се осъществява връзка" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Грешка при свързване: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Неуспех при получаване на текущата грешка: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Грешка при получаване на данни: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Грешка при изпращане на данни: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Грешка при затваряне на гнездо: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Изчакване за състояние на гнездо: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Грешка при изпращане на съобщение: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage не се поддържа под Уиндоус" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при изпращане на съобщение: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Непозната грешка при свързване" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Функцията за слушане вече е затворена" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Добавеното гнездо е затворено" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Версия %d на кодирането GThemedIcon не се поддържа" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Очакваше се 1 контролно съобщение, а бяха получени %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Неочакван вид на помощните данни" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Очакваше се един файлов дескриптор, а бяха получени %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Получен е неправилен файлов дескриптор" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Грешка при четене от ЮНИКС: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Грешка при затваряне на ЮНИКС: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Коренова папка на файловата система" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Грешка при запис към ЮНИКС: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Тази система не поддържа абстрактни адреси на гнезда за домейни в ЮНИКС" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "томът не поддържа изваждане" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "томът не поддържа нито изваждане, нито изваждане с действие" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Приложението не може да бъде открито" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Грешка при стартиране на приложение: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Не се поддържат такива адреси" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "не се поддържа промяна на асоциациите при win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Не се поддържа създаването на асоциации при win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "недостатъчно памет" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Вътрешна грешка: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Необходими са още данни от входа" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Неправилни, компресирани данни" diff --git a/po/bn.gmo b/po/bn.gmo new file mode 100644 index 0000000000000000000000000000000000000000..480bba855d9130d42b7bf9a3b3fcce8aff5cbf4e GIT binary patch literal 69231 zcmeI537lPJdH+uYwFP%kL|HCqm;^E*VK-q55FipDkRYhRaA)Su|E>(+m@txNrXf6w!t?cQ_m+(1D8pU;0j zIr-gl&bvJO^Stjlcjj9!+WE$apPOby(VpO6JtvCxdPWpox`(bt(NFh{q8Ecd1D_2( zb3e!D27F1ty#me-*bDAT`@_Qd67Y4LF9X+rw}EAFr&mUirmBGZfR}@F!OfuN{XDoo z_)YM5aOYP=(M!RT!Lz|Pg1dnq2M+{456%I94wk^ZXGhU1z+*v%h~5BdzRSVg!S{g& zgZF~32EPNsYP2_#9ts`@9t2K+ns+OB2>2OL^ZgWD2=3VvMZMtZpxR#wYQB$vqVI3O z68K$E{5=aIMb`pQ^e*SWdEf*H3DJi@hK@c5BC6;o0bfLC^*@aNMCTf?1YQ9y0Y3!Z z0)7V+y>C9i<@$bbG3TEG=Yzih`4`QG37xM1Uj|+d>iT;@&Htxh8TqZ`!i5{`~j2bd|&WI;E|y8a4M*N=Y#5ZIVe4R0NfXR z0F)j6GpKgI1YZK~0kba$4+1sLYrqn?22}q|pyvAkD7*Stxco~vuGH^G}=YlT-j|u1JfYQ$}D0_GpsPP^JCC|q} z@%y|bZeI()y*OVE;%d{JEg$JQc*Hqsu^4 z8r=i#4gLs}9-afS8t)KL^NoOefLDW(^M}9}fqwkA?{5Ck7^Iw6ozkQcEzpn>nH&=tWX!Nmg{%;^5G}`SouFn%e@o_FF`MnJ+f%k(N z_iLc!@EdSH@a3m^96TC)A?GVW>AeC<-fsf;1#baM;3MJwW1zv3%uT*&#w;0wTyfRfv1!4mjQQ1kpRD7$*`Im8lh0jM}~EO;1r9w@!v5Uzg~RQs=k z>i^%M=y>kAF3&lj&R+wnT?N#*SAx>RyFl5?$HCpfe*(qV&p_#W&)2zpmV#ROS#ouklpycpXP;~tU+zWjE8@+umD0)r;HSa1=^9_Td|6O1Syf@(A2K+zZ-dx{p z4YehB2&nT5zh#8!p2jU{pDQmGY z@Ppum;7(O!2u^^6ifHc(&@EU4amnZ(!4tuG>&Q9ah2U-APe4eFZWwmI`vrIs=f{tD z`)j}(IsX#42^<(D27uoMuLOr{e*P2i3eMM$d7bv(AVWn*K-@oow}X%#T~dce@Y~>e z@O2HxzX3Jg$uO^WUjR=952i7qiQWV*1HTQP0`}5*Gq@gnY!UvvIV z@Gro-Hc{h%b(mMXGhpI};IF_%jPt!WqifFhdke7{{990RX&}T$!D;Z%z}v23EeWo@ zI*R_Be$TkZ*Fm3qo7?*zUh8pqUl5m%D&W!J!vTK-9>)3Nx4Ygh1W)4peh`z3egmEc zmalU@?*<_ydeu8zE_Z^G%TCvO9yuR8hVy&CSA#zRPX_0{)9Zx`!9zH|6I=>@3)K9t zdY9AndQj)@1x3e~z~$ge-tBz#fn%KC2FgBnyTSQd3!cIGqhJku(R)09UkQqy&w^#} z*Wjt(8*g;Kz7sr(^T)vRz`bvBySx-cq|r_{`+EQFpvHe36u$?*7uyG~2N!{_L1scf*Nm+_xm^-KujTu{@CsHauCr+&-j4T@ec4H&i@?5bfTYwXM>FovX%xv4-SK; z-QsrrDR2$v`(Vt+gO`JMgO7shSKs1s;d9_?IiGuL6b*u#z`5Y}K=Jd!4-w12GI&1t zLvS2iew*v-Pe6_LOHle)aXU23!oESx|J|)l&(cYJl=C~mGr|3*oUV(&*K_`9a0~d- zJ6yh>1h3%ym=C)hJp!J?`5t%r`Gw#@&c6T-fxialg9CSYp11*A$N4?r25`@hc%FI> zcq-?Qf|ASgw)r~#Oz;BEzYXH*(di#`x%?$~Ea!V8yo1tq_eKk516^B^oo?|#7X*axYxIRAH$A)=c;<@UJz(=N|D z!9K3P=rf)NCcp{KzXx6pp7&X|k8gr?&U+ss$AeqIE#TsZUH{(zCI6!y@%Zs^P=512 z;G4lK{{-EG&wAARJqn)9dHnd!_+0Gp@xP3s{{nydIbsI*{V%wEU-4J&S9gK($H&2&!88Bb$Nx7_cDm+EF7JE6 z3pro>W%ti*;9;CE_#3zHK~VPdMQ|N>_*cCDhrrix{-2=i<=DSvw-g$rL@#~Ml zHJpDRTmhc)RrmAvfv0f3``)=|>?*YZn9@AboR096tV{X6Oz_)V$pvS#V zxF1x%BfjnNehc_c&L0DB0qfs!dS3Wlx9d-XlK+MO>T>!FDE&PDdoHg_z%kAr2hRjo ze&6e~t)S%k#c;m&zp?h`{6z3&;A7zN;4i@g!J~iRaij{0?_Yrzf*1VI?f)C#rJS$& zclYD3fV*=3;vae3+y~si`5<^Q_$}~GaQ`2>KEDE9$N9cLVT}ad4Xy)^`6;;=yc4_z zEdR{c?LP$H&-wHJ!}WG2*vI+fU$Fh3Dt3;OjX5A$S3}^uL_Hd%#}K{{z&xrT_N2=`8R<&OZ;%0T=&|^F08* zne%UeE5P%A>3Y8x)VN3f%Jcbc-~pWf7dQy+_iNYxHQ*m{{_@{=J+&E>-JJ5jj$Z~p z!ue}|>-6sw%`!PQz*D&Xj9Ig+o;ekK7w30_hk;9;G0XDq2C%{T6nHcEik)WJ_#Xq8 zaK32gS*G7hLGkxLU_ZF-nX{tv!7qavZ^5&?{~$QP`Tv6d0QNt7mgSd4e=tiWK=cXl z1n|s1oMrO35mf(w1@{B@++~*4EyseZIe!!Q2Jq|Q{D@us`g_1rx&AY74S4i(W<^(k z9|T_u?n98g7+eoZ-#-Iqfe&!RKPPkHh;V{>qLrL~20WJoFeh%gTS8!iC)z3>g&fxrQ;6ogrTD|#HneQiJB8Q=ljdwaO|m*A^7Ucfb6(PVQepP$F)t3b@tehva%|-DKY_CCem=h% zJPACPV*>|n80`nj=k@agj;$QWacu%T5Bwqcj~x0@ERa3KKYQ>2S2Eq}+Os)6&M}96 z`gsF*33yOA$8GIrX+XhBju(gfxLb4`pZ^B@GmZ=SJP*7e+`ksY#G;Eh&g6Rbrzf0T z4W7?|Nk>aLrui&e*3X`tzW~H-%ukNBtLcC8jdyXZ;=b%xKVuxv=lnqMB96E6`3&$p zj)VF9a_}sU8~OYPVEpqJd^nM7*`LEXIht$hIpilJ;pQFS?p&*bb&xO|T>&lvZ{zqY z4*mQq$0b}R3|ah>Z+)6$AFk==c>%BWQ>$4jT$>-xPXk}e`R(Cc@bb`S0^G>?IUHB= z`6V2WsR2J9aNQuto_*S^~O>ke1wH&iK2rCx^B-aQ@-&`3vC1oFC8e zG7d_J=xR_uM{|7JK1I>CfER*)%As}tN5NA#hB>a{sB#>{p`RN#Zshn6orItD;7J^> zq3?lVj>9;g%jeTLE(q&q-*o$L1hkpKnV;_zaIj-Ya!J*vvQu^Kn zo(29PI11|LGVpaAq?X*zf^a_0)wghbhhr7Tl^pu1a6F&mOC0xe9K$h4pT7h3b2rDE zIp4%_Ime%H{#)JP=Wx#N1)sz5#~fee_B;NR*ZKU+9nsSo^&a#Xpm zpEo;1JA?Oy&!>ZLxXcyhtGZC{ASL-$`SwE$%i@N zu@tCypA&O+xOyn&Ve|UIQM%@mxNW=98aY`1CoBA8{<>_#lUVCOO{8 z@eJC&8(bdxj0D`wHT~?tc?tY1$2<7^Oz>+QFAD7r4R{l{FGqu89mgwZvojd~>>ob- z5!c=ouFntnChlFM&!sul(e>rw>OiS7+Fu)}jt6#-X) zjnZIsxH7(RtfJ3`J+m7=7M$03WsN0dp*H+ST8%%Rh&*GAG-htx}*BX@^ zc{ao1k|r;U$I3uTgyhk4Oiv*PVy)En&LW2G?Sr47~bwY7=yQf;g&w;Qa^EnLbt+1Yv2uSUS~4~^T$<_)D})#YR+Sta@06h1PO8~X?aF?8B+qA#a7^}e9 zu+0+p5Qml0M1#>zTXxz~rWqZq4o%dZZ`^HwJF^>$I10LyGZNgso&%M}y75}zI2n7O zhF{mq8_;igpoH}dt*O@5;N+vDmEkqIxMsLIT3LggVVQxTE;^0Z)>Ke~OLDL}I#9|` z9xgM<045>_l&XiTSQkQW$U1bf3WG_k%lCXpacs7Fae*Uh5cwFQLj(94fwK=sa&IIuke4bAf{(m0Zah}56L|+}6N(4! zjpnQhY;K1d(pyzW$192=ZJTNEu}XcU+K`zv6wMkNM=;TK<}Dg&ygo5XjH#4PKFvbc zveB`L@s;D)@QA0Lg*6db*cdS$RuCu=Kg_0B(ld^=DJf!T67aniXOSAGL9~flZZ5+XOWayr7hi${dcfl8_7@o^0{R|jOE{k0LJ0uKlUfHcf)9L|iOt6`ey>9SLt=EcJHb?J?( zs`2vB{BF8Rm{tXq=wVuoC%359NgEfaz;l&I(~9Lp4U7?mTTw;@-I0V1Yh}8z$g{GV zSy8GY<8lZ)7_SZwI|;q+OB?W8@ittB$e1P3NX65Esd*HeZf+JHDrO2+Oy^mPLkKfS zZb!{-@MdE&ZYX`VN-#PRPfWs`%KV}ErK42v9y2%XA#y7tV}u|KF8C4FUmL~h5flDy zCFO~2@=7TiwxgwCSz;cqk-f~FSE80Qp^#t+(Bq74T8n8T{+QC+_Q#nrZS$ivf~G4Wp1u(4wkEdt498ily~B=jHzX3e`W+1HFa}VnNk!_fal}Y!sFc znVT9&Hx=UxF8e~J;D%O6*~?+#(V<19$fu2I(Ix7VaFK*!l&Z|JfIhad=yp;|Wo`~k zsAd+AA>C!}4OPZ%Sh3+NF}!}TmT56uri@vu0Wy_y=Ke@|oo-V7^wn5Yk@QE`WpCHk z7l?^8rE%R08B-#)E$%DJWX;> z^+J>CbN8CmOyyjunji+s5UOemhw>6mgVOT0G z)ZfYmz7+GHqcmJ+waya0%u=*v;6`oO2=-WIK1L;$xtJSI)>!Fn+khBlmPM#;ny3+C ze3LBW%dL{6o--?7xpaATbmAfl?L|~a zvO0`g6NxJIg84FQh=RLeNzv(!M3e5Cg$^NTP(vrq-E7IZdn}gv>(w!0WM(RMbQ1@&r>oyiO=JQE>^R6T1aSt_xJu|d< zb9wGa_2RZuwRDJGzFrv{W*^AP$Z=F|MS4ou@I$PEa z$1HlxD-E$snLUtcqdI?Zz$*;Dxl44C%_x@8gqD+h%7@m{oY{@J*>+ZGB}^?U4O%A6 zQ=b`D>56$}oQeOm+#aj4o)dp6=@FrJB zX1KMLVf@h-kmZrqp~kds)rg+FOuI&Gyf2y&7;LR;9>K2VX>OuK@i>V*>?#aqMK~y* zZ71=Oa@bOHagT7`uBla)iE2y%!IV+!fbMqJ(=0YsYJS-59jeo`z9$o^yLqa*``4Bl zY*k|+Ys+kA^-<2UGPLdOWYv;c&!_tybM}Ab!G|2W*q2imv3oFFnakb+YF}F(^L0rW zMa%e_?`@3&#{hOLA##!iLd66+0U9O~S zkF_lJU;-ERMFsZmTkX+FO)VKF-Z2fU6>Gs|TZVdjNsiS_vJI-;9R%CoW4A*kpX_&q zeXG2l8`-AXh>cEOX^(79V6%vva+;@<{Kl6yI(Y;#P}|UmP9a>Tk55iv$IoZyuXxUgMNt-siuldDvL9^Uqds%o)dGbms z$yGdROt$x#!PmapLOs&=>sixVDS#Y}jb3Bin~9~QPZFQ)v1MtF_WZ<MR5J@R z@#VF_E|PZZDm<%gZe^RcSVYSWtpcc;V1ganc+5sOO!*Rg9;{NPr4JGYz4jU4VcfW{ zbCXfc`sbP6lTK_(CHGy&2$F@9?}Vv+&mD z(v|r$jJSU7%rme;nr#PaLz$x9gAqk823e_7^0PHOzkr5h&~zAk-Y<nc3Ym@|7| zt|)JL^xA!&=7*$d&-m$(&uTvCkMiO&D5No&hm|XO)gU@e&je9h5+t<3AvBz($F6;q z@eL|g?SWMDL#5MeC3_UF*J1pLj!DHfh6~@ri0F~omD4@|D`&}CZ%E*t_Gnwg*sB%_ z9?e}$pNhI}!`bfncR$PunJ+^KFF05soh*O2Z3fAecnOLL6p~ zUV)@fQn9C4&U4$Iys)so$`ed>&T4g^KPJuOCTaKcYyshlD+JGU_#u^aI;Ki4dqG1) zn!yrk)sp3xL}=RtJs zNVGUvPh}td#;GUGR>(fv%@j6+FvHUVdZi? z6|7{IBem(k?DiZcq<}6vCaup{x$Im9=k*EOMG2N*k9C^(Sz%4(9@wp1#UK8pkGI3q zE$EYqyiK&C`P~GZJk*wH*fiv^ ztmfmQm4JN}6sQ70F_g!5_E=weK+9KO6}I%)Sc`oF%(rdY32uEaD{c_dIpr_0U61`d zl!mv~w6e$xS1kfPE5ojHYIW>>Dpw>qK3ci9wn1h!W zqE0XjCRlJkzt9RZmk@1z;~G8biB@`x_UqHopkVCmBcEo@R;3RYSelTM8d3I=MoY`v z=35d{QygB!;up&fX(~3VPzjgLwVx>8C^Vm)ie`U z>&OfDQ@-4<)aciXXVzC2OaxkA)<-Q*_+t}-rzVZphOu)dbT<*9H*Eav#gw)9mE7uR z|L}yp7}E1f6w0V$sdQR3~H&|td}M1!PMPj^7HtGC9hTQ-_3-tY>Uz4vG9szJTL+M&Nx z(XM%rg~$AX2yr*N?b(SF*vqIy7K=Pq`?lP(Cq(jMs;mwzl!Fy&Z1LLE&R)r+>?=Ffo4%+fkFm(Q>u!Dthr{e9ZzaWPcAkvB{b2rn92;gG)W z+R~xM-W9JzrqRqwM4KklRy+IbtlN|2ik^%%3Bt(|AK^y4mDF6ch@7~}vlw=E@*Y;H zQm)IxM+bUqgT28Pv$ySuEGa$ra;?45yk?BT0ejP;P5QE$*fy9+|Jg?|u#`|{e4tt~ z^f1!wrn~PC7mcx@Tpb^)4ls!AV`rMgwJbB)D`3rB$M@&i3qQJ>Y=&j2wbcPt0OcF6 zB&iq^leDn+L`u$#KQEF5a$NgceEFuhCSh2wjU;2FuM)&fDeJ~-6lE3${hc~qFHSlH z%eIU{*vXeglB}ML>8X?LGNAby?p-ILQGoVZ`td4@0j-<^({R(YN;%tJFNj`iOCjwF znA7B*P9{sD2A0G#7F!h2ft?u>YvC4;)|q9kt%fV*(fJy`i{^vFHHt=GSa;heZha1x zA`QtC0*@$SfQz+JbDne9ZyO4OTWU%73Zgfhv0~M-GftmBfBt#V>dbx_IYBupT7812 zixAmS!7wj`^;M{ZwW4PAscE9s{Y8C=a~@Fr#YZ&CH!F}0Z{6|PauPJN=E*Fa;+uRS z;NnWX7RZj0sS;ZbE1fyV&e6^Es|xl6w<(S*Z}>MA?6v6R`4^hf0wf5FGfHYDvealK zRGzolTgY*t6KN0vRKIOX4)e@i`yFKx{Xo=T<{b`uiY%3Qaly9C>fw2%)yp|1IL@A% zOr*DE^$i!SxDur+K~KI2d-X+^pqk6lr3C^_AFAlJZhK!H^Vtw3d=RaDAB-!_uepwI zV9UZ@bFDP!QLj&oX=zgHyFiYcTEF76=b!AmUitfacuxi?ZZK?HTxNg%Jr2YX9;o=U z!a?65_Q#8H42=fZ2+>>V&1=Vs(bw^=wi2z`8m+32)Wr&W+)5yeZBZ@rUvNs8j zmrh@L&T_rl>`v6+rdO99!kbQgzqLv2$yP*dgqQq$AxdT#t!%J3JIJP#hQ%t`HA>8k zFHy}|FgLj#Hs6y)u%dPHvc8pA{BEq)(2<0Q>P6Tg&sByfMv)her}g;i6{2|cSmFVh zd-3jP-9w4*d?+5+*ATEbeK8I)3IrIpz!U9FZRHi7NF+T&*<*2aZsFDQEZ#PA7>^tG zhjtM#(HG*W@9Ctk-{&_-_A~R{FPh=LB;rk*EWJZd`6^|7hZYl~-L|m#L-VdFP%J{i z{*Z8p$5&b?wdGWgq1TeOY7-Wp3wjc!?QJYupN>(=M!_5u9{Z{)u}ha+MhQ{o9bI17 zuZR2g*jZVS-BL=2mR7a?aeOWW;0A$IRdV?L-0DM)I3fzqRD*|WyPt51SHy35>0y<> z1I;6!^;I|+-bhBM@S^zuX(D{%gl(LRQIK-{`*HqlmM}#^VY8L7*Q+lck<{|ZCtN3h zvOeTnGxkOZPB#Xd;TsWr0VPU^(BfX-yt54nDJP|gMlCO^rHO|Z#t@5QXStO7VnxXJ zA+1H!+#SEpSKYPt;gKQmBvT(t?1q%pqN}9esm@=S;2?$z5G_KDl94czTw9N|{^_o2AZ6h-h)(q>&yC42|;kNM@HK zsh(!Kf7DD3RE2qJ2i)jQu-v?)yMZM#_^K12? z`F#V&&}DRJg7>F;SMg%WqSEo?RkC;KC~MW*H_$u0aKY$tL$w-TgYjon^9f1FWBV-58S=lV_9U|cn7ibSmpZ?@=_jb9X&BV*n4E!PIMCGdY6W;!!Ifw*;gIk z<=ozr^~lp1IQ95)AA1A~=Pz71|Il4l4D&tP;og%-`D~nwj@fDB=!1E1Vjqv5Gg{jB z=+eTuiy37_jZ$sAH)b&5ExmPuGF_eT1028P^plq_IdSRAQ_`EhLwtghzNqB1^CkZ2 z$+t{Teq?&;>gma;()8r@)01~hPu@5^b?x-zt<#eaPfuR?gud24J$cvkN9fGZZl73ZvDvbc64wg1duX#g2*z z-3bWh(#2GXU|V?XnZ3|Q#Rv=ZUnI3wv6#%^{R(tuhC6Axl>~Fca*ny&m;NS&{7|vZ zCF@w3Sq)_GXMe4N&9c=5^HBH&3)7Pi;5gHhH2UX)?4_d1`OtwXq zof;kHh#k9`FzSuboWemgs7&$+%>gy;34aWg+8b{2z7J?@Bhv{+>Ja!*Gg=tKQEs#w za$`&BmcYbr6ANPo~;eDGaCcl=KE#6N%nx- zoS89%$x9=?WyXh{8<`K&zLR0oDuENGzS^|#FemN>T#^_P>Rer0qqsVem}2oE6=z=DdYsWG zFJlTCa*s)na5`O)h}-sOx^yC^v+a1|K#U-~hoV?L2ngao$>p3Fx*deRaEU|9bW8Ti zm~q4$jEDMf_FFbf@SD3V2)JXwnDw-Btb5tp-lk0r0rBj4ODuLf`qLLft3gXe$U#S0}S-k5)fV${oRpq63>V2Re;|e3I02de%F$SZLc7@=b|$v z(Kd{mxyVx88fA(yNL`_L4e<&SPI5z2EblZh3xF$ZH5T%iR}UV5l*%J>4nj4SuUKre z(ugZsZf>)yA$4?`hwjCBtclh%&m_Uv`PE{V5t8D;DS?0adg_*UvLmO(G$7%}JC;`1c zk(PMSMCn$Y8ze-y6^qlTY0%)={_Dq5dwA=#;sg3+ZbdGi9tUSIop7ncNJnnpK=H47 zX(lb6RQGo7Vyb-P|PY?7>#Fb zOBdapHt2d7S@`(aq2g=vc2R*&oAs6>N1LL#$mY>hOEI@%pWPIfXwZC#eKSm)z9=!I zBd-hbHB=jRVH2SewVgKpN6zs=&?3?G8LRUmI2R$}yRN5O3%D+rm{uN6nGB`KA^A49 z{Z=?`A#7X&LslR}ZTVS)ywmw;;rYg$Pb-9=Ta7%W9agvwf{08i44-cNw9REn7Bjb! zKxJ3R&K)uA^h_lY#O9?f^lzde7QqRkby5`+inAm4k;7F{;f8b=28&V%Xv!aQKCZ?B z(|kS|{;wdC+PK>p4KbFjiI32DbEIE@7pF?-*gVg_79G1Gmy|kDN4j>*q!;U{YAZ3J z+`J}v1sLf#=CFwiIzSj9+6^n^AQh-(V6p`s9whPf3~X!X*~N)9HaqM`%o!6%H?ap9 zOJe(oCrx%ycouEpDvjaIp$)@Ef%IfZhWBk+DbU4ziz)N{%u;Mt$kaEJf}yf?iY{YU zXPQ+R-CUs%F5e!tkTKqFD=A(6SRWez#*l)3pP_rw`=lPfBN zZv2`2mPCI~djRapjYItVo!gV8; zdK8hXiZWSAPH-Q3d79{-=fAQQf^uHxWV_}=@-!<|%E?uc+F>nGsNB-^|BA7 zv!o?T(~_RHa}rD-R4B=>zU@HoT{Z+|km^aMCH}}dyv9IUX*Gde(To)~|GU;)G}0IM z5G&<`)0Y%3P^Y4%K+3tPcH9;fGjDS8m;jL>8`yE**k(lD9xpZ8Du-^apDD&b1e|9W zno^CJN=ZAXq!lU^)ulA`xww?Zv>Dwu=cvUqGA!PMA6UsgQ#{!5EHqW0ZH3nbE0jj? zp{*mN#DdRl29nVfQEHRhjEkJBZe@IU$bZvu#y7El7k8-5(_&kyD;mKp;=Y-FDRN<7 z=3>xLaQg7DftDfLyZ43Op-NHdLJp6mIy#sgB4mE=pgGdyXy|n#*V?QSZ zM7N>TlJdIDZ9V!{hSZ$>MbqZm&iGVh`8KyvL?w)zh{D918MlkWQ}->wawJ=~D%lri z!MV0UIFZrYR%@gipX?KP(0^OYCdbmylE*3cb0EIn!H# zu6^&Y=8Qei=MJx8weQt_&YV1*C~^<%V|~gYInrAvk6M+o{e#SIFibKwb7x*}$rJ?g zcwg&5n~DY0akZ&mCpkjf@Jr?8X$dhSY;0$9(myj;^Js3sD4P^ahlhj4xPbKBOI_Cl zRvD9#qS3>Hsjx3(Vub;$jux=#8#U^2&GgheT;xWT1m9-T)W~{G^zh>X_cRq|gf8a~ z-(aFZosAlYeohkEnz}`>cF4LB8D6W|R;vb$enodjJi! z9U!tE=?HE)q_y0$l){Na71GI=DF?7s1QzB`oQnxjb3w!kgEn_;<4CC$!gg1E?7biY z6xziOuzbkSgMm27={$W6vklpC4VjxBD<*k_9^KHJ+3Ys!ouPLKuG`s56m6fYwb2nW z!^vE444K`asRK7FDz(n$Qh3ap1PW z6xiHn6^=ORIAI%#3nqNhOxO}m21g-_J%(Ly6M|$dIm|@ujCPhtz+;QzGNw*AW zP~@S(M5Nhe(5@YliC&nA7jsX1h61VO!>#>#tR_a==%vZGC8;eYuMmdXGfB%t_wLKx zb&h|HmeGezdAj#>1Cc5kxr%Z5=u<|G_9wWJQ(YU$fkNG#cL8HW;R^O zRnx0!%#@!b8R_teoWcVd>QV(mXi9kCoYLQAira=t9vkUi9&I%2=I`MP`7wnYxoau6 z85MuV;fbIOj}57A?M_^6#^W+dfM1nMsKDt>OQhd}!J9+HB6!ZYq7~F!nwgWS%~7_e z2LyhFgQxY>}I0FBVU zXvmR1<8*XLoX~C3OYY6un$$y#=}D|>vwgTqUy$lJynd;tn3p_QOVbkrk~h(jt)?Wp z#KA%Bthk@um{(Bpy8kny3^Fe5=%Q@ek&bjhwf%%(^^hux@hO}^lO=A3JiV%)GQK(| z+b1N4bb9m*^;nX=s+LfI49TJ0N+1@r1&3VjSM{I>PqvuQ{C8M+4txS#YY z9N!$2soYy=a)tYM(yRSkyTrxctwyYSksBZ~2zqi8vhq$GC6N;5XWV7--(wbv(~MQv zFu}cHFc)Ex3L#N<@^^OH*h10x$l+>dVdn8Il(GShpcL{f0&251k)X$i5GAK=c#aKgRJa>WC%o1FD?$7VvUrMoBBMQRW5W}-KK_sm)I{J=yax>?BEGpgx} zxm`b4yVS>+9km!wfat93ldo%G8OvDimFx*KxK>?V(`|o`$ikM3H5+&4 z?=ZEQw1}&jM+79D?;96dmCaoE_>hyq?6oi9%7L;oe ztF>X&T%WjtJa2e-_s<^M(|}27klP&1WH|Fk>MWQgqsoYwhY*oI%18fr6RGF+E+69i z-?!4=w6ek7Jhw?mwmCrr$jz6q3U?T7ph6UD((tC}2ckG0VVmt!1T*G#8%dI!Ye??k zgXxB4vynd4w$~eDXKW+Jq^S zJM0l8#1wNC$O3U8x40M&%A!+PJwmMv=!p^88pRO=qctysnq4;Ym)6>_RwUu>1`dCd zZHJE=|Mj*u1KS^Q%Pru{3_FHJ5B%ujK7Q?T{D-DxHHmg|u^+3(+kCN@1`{(^saS;{ zj({dz<#>QXf0QFCorl(h^>itL>4aDGGi1emaUJG)C^uHK%_ryioTa}jXLE%}$fRNW zlB@1($vPH_%zorW`MJb7+$6>B%X69dP`I2u)S4@g&e@q+v=9t{l=)8@=bo_rGRn!G~Vh z8wNy?7^v0j42E;8#|CGza>);X0wmmtYvK3q|(ro*@0X!9?GnV{oU-J zN0e>JX)u{=R1Mojb9dB~{>u)bjY6(R6wSRI78v}* z=M6>}#mNu4@HYMzU1`g_tI8#nvd~)IzCLNyp09Z%`6szzL+npCvp|*_DtDsvW(#3UvBK_7{NGKkV77XQuv?Z zQixG}GWm(bkPe9uNjP~J+0w*Q9J^RDj za8;MS+n`orv~n85uV6ri%{3LR7~5lI;H-P9GV&~(e=0V18DJNa+m3N$QdjVqQ7%2I z(s~#>E^MVdj90&lB>Y-WG1KMbzVVe=>~!W$`xgTs#l(f z4P-q%1kRj;Hg61@fu+oSz?Vi)riMAc;2ekDYIIA?baL8lDWr&}{ZScj)V&MZnC1X+ zk}{zvu@aETdjud7cwGIfuHUZFy*or{=evL%?ywYWiE2+~p0M`l=!{G&4Q~f4Pc~L{ zGhcD zi`X=Wx_deCTRjPyQ3SGcy3Dt-gc*C6nx}(W#Frqpr6o_nuj;0Ff?~S4Z@R0xP5O8m zLiMW*+2x9^>`x&iemP~*Rw?GIC?ABY9^`^T<3QDJ-Q_WhdHnSu%|*&4N@Q8a(R`&V z;t*%sm1HiMX7>g>0(-1-K8b57?P*jp6U|#1zg1Xh5nWm)izbB`J8p< ze*2WtbIk8T8oyuMqt~q-!Ad;`6^SF$z>NM{a|bO9-TjMf(!!McQQ}=H8DxTHjA+Z% zdUu=OUXTlG?I(&uV(csNd2^(K2_IyN`8mlsulqR$MI0wKz8OMkWl>V&+0v!0=QCI* z_t|c*pP5&$>eBM2InyQ)p}pZ}oJQm1;z8&>=V-lLR~SSxE=3(Hak*ZLhRH~$*qf0b zYu5XjtF66sl5b?@qmynO2Z?%viU53Pwq++%7r0rEg`b~$VI!QF&?W%+!TgpFs zGYE@$L32w{O02y(#;)Ju7^4V(utj~?pQ?fF#_Q8A`Y-)yt;Bhe#g%oYy zwb6TFViRe&4|-Z=u1;d;maZK<>lrJToolpe9p^jsE;l{XE{>$!Xd)tr*{s0-_MrcH z!#EDa1y^_+!>Pg)`~0LVES&${=fY~q=^-b@{n|yHVlsF?1f^;hD>3Xz`H-@ltN}$} z3EX4ew8FtpyiTCuRkUK^D!(xs(vpSyxuE9lE$3=rOy{G_n1qDXak=N+Q#W)wp0crv ze4F+yrrz$MTH;V*>S0KLFpqIlrTkYsav3}yed8i6-UgW3WVVZ>M7t{rLx)?PBRY6- z!B9YKu+ig%_W=T}-xBPj)FEYgjUc5B|qwQ!hxFmNmsnMxCBq!tPYN*-Qr8^Lmy$ zaERM*;uIkiUrGATQ*bYQ*i8Cq#7@2HxvR&qX8CrSvQ_FQ`+v3K2PR70gbn0wMX;R0FM%PloQ98Z)vqs4EKk z%2d;n?=xrDxs%>T9!c!SQt3q~gCSYQUFJSWLdxxqyDr9(+gcta{2;$@a;wb^g-qv4 z;D+K&lu1tQ2~5U;Q#3S{b^II~mg~dro9hKb@q8Os5h6jhz>Umy?78;CWsl>C2!C;j z@>)icPlKH?g#4Odgo3!q2Y&M$dqoTYiCc_YX-4#DEns&rRftC@N{)!q3+J5assTev zYSwa_b+K#~2I1}|Bc7HxrUb%h9(6*EKy&CP3j~XZX7~46I_T&EST39}9;32-FR~JK zr)2|IbM-#wUPq?eXH1-KIPzFl-(m4#Jw3VgrgrFha;u=7Op|EIAMQkIb0hwsHW$!J z?7QMBs4!io6pX=89`9WJ;wR^0Pnt3rr6|c!?$&7bf@0tt%F#OkKx*n#TXGM{7yo`t z6X1h$3wBNOR&3Lu{;SPL5ELWAzQR53=&=cMA-d>|mBenK*7BA4iJO+F&xtRgg⪼ zKAHbzcCO9+_Z#F7SnbE%m;f2Kuf>9)rW2YeW7^QJ-yY*eiF?t*ttWOGO%mqIhO$hg z(AW%&AA6LI1HQ&igPO`Vz_|p&V z{;~ma!z(3s^_xt6azNq=?^kQmgf~7(+Hm0daq^}-0CEFD^-VOdZ(TvQzdI?5bRYMt z5RMiz(G(pp6XuUMDyRennU1}BCzjHvV^qY&F$tQBPV;qoXfy~;<|W*{gGTFu;k%sb=K4W6c%mnepijjeqY7Jn(j+mEjsJwEBX;8H zh)4UN9*-~rcqD9ZD&jO&JnDrpH<)JEWVp>1O=qxY6y>p7!oXRsHpR%2I%fay%)P*Y zoZwrrMk5V2Je6$@1DmYdPvnNMC0{xV{LVGs1!=|OlW%oMEl@)ws~J1F56Qq z-M|fgCncHC^*{EjH-NMJLYIdq33JMt$i(5vJ8~&RrjEjmVzd4Irtt|VKgdE-aH~*c zC5pkQ{D+hFmXQ<^AwnXh>|#Hz$7OeJ(ONqv3d%jcbIRS-Ff!HDC>Nr9Xrd{DpmeTi z8Pl;Ag^ad>cw0Q8uL)o=lmVTL&8#Iap_!}&392BAh01e8ZDce7nl$XJ+>Cc{PvH5v1B z?s28)*QqcN58Yk)s=hF>^dUTyBNtf%cZ?shUhXdrZ>WwQa`2k5+VJq4xxG~Mw3~q| zo5LeuY*dj|k2{{yMrF9t@4rR^;;FAaYQ&Y31>+|~uz&G=L%BN6_x6o(tWnb2e%|A6 z<BCt6XSe|Ts z#R*p04Joe(3ZWIlVn=Z2HOH-(mp@w~L?}!%%GM;^5|R{LQWGrLohh(QAI3$CqLn@h zI&w9)ri_ePD1$y18qs(Y7rDV$p0$w;6e(P7iREg%Wc2GM0TYNlvouQz1jY_K4H>Iv ziO4u;dD9}MLkMoN%ed);q1W5udvXPiEN{`~Wzm@tp_ZWQhc>B#QS zda_tr%|JLMc9$?Je_ioaVZtMQp2joVmMuAt6a|LPN%EpaMr z4&6=~KN$ygxpqr_e;fK&4?+0#5X60$LjqTo`s(HW$^aLX2e5f3W~(tMCA~9MO^DSw zyGClbRoEq^`8J~*sUm|r(!mSVRv=)bLi)Zcnse-&R$3*eHo~QAVu!_9+DYJlSA6oy zng&FfPBN>Fum@=J5y#x~9$J9dYqlY}l&tHFVmKyoR$9o(4FpTsGDri5xERkb z^0LX-?KORbfZJ@c>109Z1rza!Z;LF!;1RwfC3cc+x=CwH%L1`OfO(SbLSw@2n4b4q z_s-|69-dcPy_{o$<7~Y`MW35&49Su6gk$tuw7G7+Ml3N#ABt9AbP18E>Xw2^8BnBP4OqH6}68S6cQNvL-xb@{kswS$nT^CPpaM++YqT!JxC`Z;!RxW9~jZ4Ms!lG9u zVPTf=?o`|y#tFpAN1S-R&BxH*S}v1i1|Rlfh=B~Go%Zb+8?kLQtA40t z)2-Q19bdbKUqDzdk5_A>Ptok=m^jO=vNH@hwlF+U(K-m*{U@=ioa^m4Nn}(dpSQ?^ zto`>C$U&b9@tep!jf4W7i8cKbn9n1nr6Dub#PYiL)X1KDCeDM6(Kr5M*otZ%N2QzX zH+2?OPjuvrb@p7=!|VxfI44T7d}6WFD@od8E_khk3Z+K58e%){DIF6!VxS?NoJm_r zp1$;)<;zajYpZ?>Yaq5W4cVboL4r}! zeT3%XF^8AJ?kG`=E|}{L6Rw;xcLFi$8wH3XOv)sg*IAk-p%`(&F&ynxz_HM~K+>x+U1OCTcS!SmIuDEe9E!p`qD8%)rySuC#guqh$gb7NlgJk>8HDDWcyvOjf(xRHbV;n!+HxAk9eh<4;~Sxir8G@ z<(NvG8>#tT!|4dD}@50!0BI=`{nvo;>hvwySPo za_pd{HnKD|dm#5Psu<$Eu&3Bg#X0_|IN6DB9|vo2hf+x&vNoU4iF=~QoYbEs(u~z# zRoc&rj{WEpM|SxsWq?+a>3|j%0<;ez|(_sr{=LOtUlz3BYKmaLmCElA~liJXvm<7(A;ETqB3KL zB8#iBY|W_X0udxUWJuqZRg~GCnlNgdurx`i4SW*UsNeSWh^t8wfT!Gs1Mxa3RDub5 zy4{pc5KGUMYHAJ&_Hng?mU9SM7&7r(P@LnO#WpYEMkcG6zl<^YrJ2gf4(gY4OLInX zPT%YYpcYS`ECvvY_OxMPX1^gxro(0hdK)81_a+|q3RH&?az$GO2u;t(HgkcqbeP2S z?5ZL~>Oa#{O445Ssy24PqklyYmnu_Al~IS(Pg}_7LQjN@L@Y#4OikZ|Otsx?Pi`YO zo7h}WiY(Oht~w@ltMGPOK_vX+9>rmSaojKPo`>Lyp(rh|y=zM+E_NCs&gc|EAx8E>K=M^Ay5;b1fq%Hicj5f9o|cK^OP8-<2X~A zp8D|g)E%iAF<|OBTA8`MNrFXx%WemKfvc_0c_?*px~!o`7LRMdKF*j6-5JrR&WH;- zOCg3!blHThmlNJ<8PzqSTtWk;PyqEI8H0(Pjwur$pF_r_txI;Rbqd>XTG<6XSzrBb zV#X@A(JqwVQHKa&avq2OliK(Q&5~3p{win}lOz@v+dw8eIKSqL_HDb=2r+*G6Y4=* zMH~LjUXB<#I)vTs6gc4zW>8S#*q*98?(4Yx=@)0oG<7M`LR99h4gV5tY&gv+Be34m zD^@S&5QJaQ1PS`O2pJO)JMU1muKjUUMv(D)rj-%qY0pSEj_A^lY{5ImbL9hQ5w2Y@Nc)r|5Q;BFK1>NUtt0X$vUIyNiP&}BdP@zTp@bJ zc19U`o#L)Udu4Cp6INR24naA#(R>VZ7f7omh9(##Rjfk6_Q#gQZ, 2002. +# Mahay Alam Khan , 2005. +# Samia Niamatullah , 2005. +# Runa Bhattacharjee , 2007. +# Runa Bhattacharjee , 2008. +# Runa Bhattacharjee , 2008, 2009. +# Saad M Niamatullah, 2009 +# Loba Yeasmeen , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: bn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-01-25 01:38+0700\n" +"Last-Translator: Loba Yeasmeen \n" +"Language-Team: Bengali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Bengali\n" +"X-Poedit-Country: BANGLADESH\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "অপ্রত্যাশিত '%s' বৈশিষ্ট্য '%s' বস্তুর জন্য উল্লিখিত হয়েছে" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' বৈশিষ্ট্য '%s' বস্তুর ক্ষেত্রে পাওয়া যায়নি" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "অপ্রত্যাশিত ট্যাগ '%s', ট্যাগ '%s' প্রত্যাশিত" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "অপ্রত্যাশিত '%s' ট্যাগ '%s'-এর মধ্যে" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "তথ্য ডিরেক্টরির মধ্যে বৈধ বুকমার্ক ফাইল পাওয়া যায়নি" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'-এর জন্য বুকমার্ক বর্তমানে উপস্থিত রয়েছে" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-এর জন্য বুকমার্ক পাওয়া যায়নি" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'-এর বুকমার্কের ক্ষেত্রে MIME-এর ধরন নির্ধারিত নেই" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'-এর বুকমার্কের ক্ষেত্রে ব্যক্তিগত ফ্ল্যাগ চিহ্ন দেওয়া হয়নি" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'-এর বুকমার্কের ক্ষেত্রে গ্রুপ নির্ধারণ করা হয়নি" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' নামক কোনো অ্যাপ্লিকেশনের দ্বারা '%s' বুকমার্ক নিবন্ধিত হয়নি" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec লাইন '%s'-টির URI '%s' সহ প্রসারণ করতে ব্যর্থ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' অক্ষরমালা থেকে '%s'-এ রূপান্তর করা সমর্থিত নয়" + +# sam: রুপান্তরকারক +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' থেকে '%s' রুপান্তরকারক খোলা যায়নি" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "রূপান্তর কর্ম সঞ্চালনকালের উৎপন্ন ত্রুটি: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "প্রদত্ত ইনপুটের অন্তে আংশিক অক্ষর অনুক্রম" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ফলব্যাক '%s' থেকে '%s' কোড-সেটে পরিবর্তন করা যায়নি" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s'-টি \"file\" স্কিম ব্যবহারকারী সুনিশ্চিত URI নয়" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "স্থানীয় ফাইল URI '%s'-এর মধ্যে '#' চিহ্ন অন্তর্ভুক্ত করা যাবে না" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' বৈধ নয়" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'-এর হোস্ট-নেম বৈধ নয়" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'-এর মধ্যে অবৈধরূপে এস্কেপ অক্ষর ব্যবহার করা হয়েছে" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' পাথটি সুনিশ্চিত নয়" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "হোস্ট-নেম বৈধ নয়" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu বাইট, \"%s\" ফাইল পড়ার জন্য বরাদ্দ করা যায়নি" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" ফাইল অত্যাধিক বড়" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ফাইল থেকে পড়তে ব্যর্থ: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ফাইলের বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ: fstat() ব্যর্থ: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: fdopen() ব্যর্থ: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ফাইলের নাম '%s'-এ পরিবর্তন করতে ব্যর্থ: g_rename() ব্যর্থ: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ফাইল তৈরি করতে ব্যর্থ: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "লেখার উদ্দেশ্যে '%s' খুলতে ব্যর্থ: fdopen() ব্যর্থ: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fwrite() ব্যর্থ: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fflush() ব্যর্থ: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fsync() ব্যর্থ: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ফাইল বন্ধ করতে ব্যর্থ: fclose() ব্যর্থ: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "বিদ্যমান ফাইল '%s' অপসারিত করা যায়নি: g_unlink() ব্যর্থ: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "নমুনা '%s' সঠিক নয়, '%s' থাকা উচিত নয়" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' টেমপ্লেটের মধ্যে XXXXXX অন্তর্ভুক্ত নেই" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "সিম্বোলিক লিঙ্ক সমর্থিত নয়" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' থেকে '%s' রুপান্তরকারক খোলা যায়নি: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string-এ raw read করা সম্ভব নয়" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "read বাফারের মধ্যে অরূপান্তরিত তথ্য অবশিষ্ট রয়েছে" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "আংশিক অক্ষর দ্বারা চ্যানেলের সমাপ্তি" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end-এ raw read করা সম্ভব নয়" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' খুলতে ব্যর্থ: open() ব্যর্থ: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ফাইল ম্যাপ করতে ব্যর্থ: mmap() ব্যর্থ: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "রেখা %d অক্ষর %d-তে ত্রুটি: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "নামের মধ্যে অবৈধ UTF-8 এনকোডিং সহ টেক্সট - বৈধ '%s' নয়" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' বৈধ নাম নয়" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' বৈধ নাম নয়: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d রেখার মধ্যে ত্রুটি: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' পার্স করতে ব্যর্থ, এটি কোনো অক্ষরের রেফারেন্সের মধ্যে একটি সংখ্যা হওয়া উচিত " +"(উদাহরণস্বরূপ ê) - সম্ভবত সংখ্যাটি অত্যাধিক বড়" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"অক্ষরের রেফারেন্স সেমি-কোলন চিহ্ন দ্বারা সমাপ্ত হয়নি; সম্ভবত আপনি স্বত্বা হিসাবে " +"ব্যবহারের উদ্দেশ্যে এ্যাম্পার্স্যন্ড চিহ্ন ব্যবহার করেননি - & রূপে এম্পারসেন্ড এস্কেপ " +"করানো যাবে" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' অক্ষরের রেফারেন্সের মধ্যে অনুমোদিত অক্ষর এনকোড করা হয়নি" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"তথ্যবিহীন স্বত্বা '&;' প্রদর্শিত; বৈধ স্বত্বা হল: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "স্বত্ত্বার নাম '%-.*s' অজানা" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"স্বত্বার নাম সেমিকোলোন চিহ্ন দ্বারা সমাপ্ত হয়নি; সম্ভবত আপনি স্বত্বা হিসাবে ব্যবহারের " +"উদ্দেশ্যে এম্পারসেন্ড চিহ্ন ব্যবহার করেননি - & রূপে এম্পারসেন্ড এস্কেপ করানো যাবে" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ডকুমেন্ট কোনো এলিমেন্ট দ্বারা আরম্ভ হওয়া আবশ্যক (উদাহরণস্বরূপ )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' অক্ষরের পরে '%s'-এর ব্যবহার বৈধ নয়; এর দ্বারা এলিমেন্টের নাম আরম্ভ করা যাবে না" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"'%s' অক্ষর প্রত্যাশিত নয়, '%s' ফাঁকা এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে " +"'>' চিহ্ন প্রত্যাশিত" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%1$s' অক্ষর প্রত্যাশিত নয়, '%3$s' এলিমেন্টের '%2$s' নামক বৈশিষ্ট্যের নামের পরে " +"একটি '=' চিহ্ন প্রত্যাশিত" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' অক্ষর প্রত্যাশিত নয়, '%s' এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে '>' " +"অথবা '/' চিহ্ন অথবা কোনো বৈশিষ্ট্যর উপস্থিতি কাম্য; সম্ভবত কোনো বৈশিষ্ট্যের নামের " +"মধ্যে অবৈধ অক্ষর ব্যবহৃত হয়েছে" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"'%1$s' অক্ষর অপ্রত্যাশিত, '%3$s' এলিমেন্টের '%2$s' বৈশিষ্ট্যের মান নির্ধারণের " +"উদ্দেশ্যে সমান চিহ্নের (=) পরে একটি উদ্ধৃতি চিহ্নের প্রারম্ভিক অংশ উপস্থিতি প্রত্যাশিত" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%2$s' বদ্ধ এলিমেন্টের নামের পশ্চাত '%1$s' অক্ষরের ব্যবহার বৈধ নয়; অনুমোদিত অক্ষর " +"হল '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায় ছিলো, তবে বর্তমানে কোনো এলিমেন্ট খোলা অবস্থায় নেই" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"'%s' এলিমেন্ট বদ্ধ অবস্থায় ছিলো, তবে বর্তমানে '%s' এলিমেন্ট খোলা অবস্থায় রয়েছে" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ডকুমেন্ট ফাঁকা ছিলো অথবা শুধুমাত্র শূণ্যস্থান উপস্থিত ছিলো" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"তেরছা বন্ধনীর প্রারম্ভিক চিহ্নের '<' ঠিক পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"খোলা এলিমেন্টসহ ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে - '%s' এলিমেন্ট সর্বশেষ খোলা " +"হয়েছিল" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে, <%s/> ট্যাগ সমাপ্তির জন্য তেরছা বন্ধনী চিহ্নের " +"অন্তিম অংশের উপস্থিতি প্রত্যাশিত" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "এলিমেন্টের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "বৈশিষ্ট্যের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "এলিমেন্টের প্রারম্ভিক ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"বৈশিষ্ট্যের নামের পরে উপস্থিত সমান চিহ্নের পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে; " +"বৈশিষ্ট্যের মান অনুপস্থিত" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "বৈশিষ্ট্যের মানের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' এলিমেন্টের অন্তিম ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"কোনো মন্তব্য অথবা প্রক্রিয়াকরণের নির্দেশের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ক্ষতিগ্রস্ত অবজেক্ট" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "অভ্যন্তরীণ সমস্যা অথবা ক্ষতিগ্রস্ত অবজেক্ট" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ব্যাক-ট্যাক করার সুনির্দিষ্ট সীমা পূর্ণ" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "উল্লিখিত বিন্যাসটির মধ্যে অন্তর্ভুক্ত সামগ্রী, আংশিক মিল অনুসন্ধানে সমর্থিত নয়" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "অভ্যন্তরীণ ত্রুটি" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "আংশিক মিল অনুসন্ধানের সময় ব্যাক রেফারেন্স সমর্থিত নয়" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "পুনরাবৃত্তির সীমা পূর্ণ" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ফাঁকা সাবস্ট্রিং-এর কর্মক্ষেত্রের সীমা পূর্ণ" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "নতুন রেখা চিহ্নকারী ফ্ল্যাগের অবৈধ সমষ্টি" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "অজানা ত্রুটি" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "প্যাটার্নের শেষে \\ উপস্থিত" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "প্যাটার্নের শেষে \\c উপস্থিত" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\-এর পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"হরফের ছাঁদ পরিবর্তনকারী এস্কেপ অক্ষর (\\l, \\L, \\u, \\U) এখানে ব্যবহার করা যায় না" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} কোয়ান্টিফায়ারের মধ্যে উল্লিখিত সংখ্যাগুল ক্রমবিহীন" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} কোয়ান্টিফায়ারের সংখ্যা অত্যাধিক বড়" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "অক্ষরের ক্লাসের শেষে ] চিহ্ন অনুপস্থিত" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে অবৈধ এস্কেপ সিকোয়েন্স" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে উল্লিখিত সীমা ক্রমবহির্ভূত" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "পুনরাবৃত্তির জন্য কিছু নেই" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named ক্লাসগুলি শুধুমাত্র ক্লাসের মধ্যে সমর্থিত হবে" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "শেষে ) অনুপস্থিত" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "( চিহ্ন বিনা ) চিহ্ন ব্যবহার করা হয়েছে" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R অথবা (?[+-]সংখ্যা-এর পরে ) চিহ্ন ব্যবহার করা আবশ্যক" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "অনুপস্থিত সাব-প্যাটার্ন নির্দেশ করা হয়েছে" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "বক্তব্যের পরে ) চিহ্ন অনুপস্থিত" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "রেগুলার এক্সপ্রেশনটি অত্যাধিক লম্বা" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "মেমরি প্রাপ্ত করতে ব্যর্থ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের দৈর্ঘ্য সুনির্দিষ্ট নয়" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?(-এর পরে ত্রুটিপূর্ণ সংখ্যা অথবা নাম উপস্থিত রয়েছে" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "অবস্থাভিত্তিক দলের মধ্যে দুটির বেশি শ্রেণী উপস্থিত রয়েছে" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?(-এর পরে অ্যাসারশন প্রত্যাশিত" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "অজানা POSIX ক্লাসের নাম" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX কোলেটিং এলিমেন্ট সমর্থিত নয়" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} অনুক্রমের মধ্যে উপস্থিত অক্ষরের মান অত্যাধিক বড়" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "অবৈধ কন্ডিশন (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের মধ্যে \\C অনুমোদিত নয়" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "রিকার্সিভ কল-টি সীমাহীন সংখ্যায় লুপ করতে পারবে" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "সাব-প্যাটার্ন নামের মধ্যে সমাপ্তি নির্দেশক অনুপস্থিত" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "দুটি named সাব-প্যাটার্নের ক্ষেত্রে একই নাম ব্যবহার করা হয়েছে" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ত্রুটিপূর্ণ \\P অথবা \\p সিকোয়েন্স" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P অথবা \\p-এর পরে অজানা প্রপার্টির নাম" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "সাব-প্যাটার্নের নাম অত্যাধিক লম্বা (সর্বাধিক ৩২-টি অক্ষর)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "নামসহ অত্যাধিক সাব-প্যাটার্ন (সর্বাধিক ১০,০০০)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "অক্টাল মান \\377-এর অধিক" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE দলের মধ্যে একাধিক ব্রাঞ্চ উপস্থিত রয়েছে" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "কোনো DEFINE দলের পুনরাবৃত্তি করা যাবে না" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "বিসংগত NEWLINE বিকল্প" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g-এর পরে braced নাম অথবা ঐচ্ছিকরূপে শূণ্য ভিন্ন braced সংখ্যা উপস্থিত নেই" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "অপ্রত্যাশিত পুনরাবৃত্তি" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "কোড ওভার-ফ্লো" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "কম্পাইল করার কর্মক্ষেত্র অতিক্রান্ত হয়েছে" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "পূর্বে পরীক্ষিত রেফারেন্স করা সাব-প্যাটার্ন পাওয়া যায়নি" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-এর মিল অনুসন্ধানে সমস্যা: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE লাইব্রেরি UTF8 সমর্থন ছাড়া কম্পাইল করা হয়েছে" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE লাইব্রেরি UTF8 বৈশিষ্ট্যের সমর্থন ছাড়া কম্পাইল করা হয়েছে" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "রেগুলার এক্সপ্রেশন %s, %d অক্ষরে কম্পাইল করতে সমস্যা: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-এর সেরা-অনুকূল করতে সমস্যা: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "হেক্সাডেসিমাল সংখ্যা অথবা '}' প্রত্যাশিত" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "হেক্সাডেসিমাল সংখ্যা প্রত্যাশিত" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে '<' অনুপস্থিত" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "সিম্বলিক রেফারেন্স অসম্পূর্ণ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে অক্ষর সংখ্যা শূণ্য" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "সংখ্যা প্রত্যাশিত" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "অবৈধ সিম্বলিক রেফারেন্স" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "অন্তে অপ্রত্যাশিত '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "অজানা এস্কেপ সিকোয়েন্স" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "প্রতিস্থাপনার টেক্সট \"%s\", %lu অক্ষরে পার্স করতে সমস্যা: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "উদ্ধৃতির অংশ উদ্ধিতি চিহ্ন দ্বারা আরম্ভ করা হয়নি" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "কমান্ড-লাইন অথবা শেল-এর উদ্ধৃতির মধ্যে অসংগত উদ্ধৃতি চিহ্ন" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' অক্ষরের পরে টেক্সট সমাপ্ত হয়েছে। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c-এর ক্ষেত্রে সুসংগত উদ্ধৃতি চিহ্ন পাওয়া যায়নি। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "টেক্সট ফাঁকা (অথবা শুধুমাত্র শূণ্যস্থানসহ)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "চাইল্ড প্রসেসের সাথে যোগাযোগের উদ্দেশ্যে পাইপ তৈরি করতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "চাইল্ড পাইপ থেকে পড়তে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ডিরেক্টরিতে পরিবর্তন করতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "চাইল্ড প্রসেস কার্যকর করতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "প্রোগ্রামের নাম অবৈধ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d-তে আর্গুমেন্ট ভেক্টর-এ উল্লিখিত স্ট্রিংটি বৈধ নয়: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "পরিবেশের মধ্যে উল্লিখিত স্ট্রিং বৈধ নয়: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "সক্রিয় ডিরেক্টরি বৈধ নয়: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "সহায়ক প্রোগ্রাম চালাতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় g_io_channel_win32_poll()-এ অপ্রত্যাশিত ত্রুটি" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় select() সংক্রান্ত অপ্রত্যাশিত ত্রুটি (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()-তে অপ্রত্যাশিত ত্রুটি (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork করতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "চাইল্ড প্রসেস \"%s\" চালাতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "চাইল্ড প্রসেসের আউটপুট অথবা ইনপুট রি-ডাইরেক্ট করতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "চাইল্ড প্রসেস fork করতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "চাইল্ড প্রসেস \"%s\" কার্যকর করতে অজানা সমস্যা" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "চাইল্ড pid পাইপ থেকে পর্যাপ্ত তথ্য পড়তে ব্যর্থ (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "অক্ষরটি UTF-8-এর আয়ত্বের বাইরে" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "অক্ষরটি UTF-16-এর আয়ত্বের বাইরে" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ব্যবহারপ্রণালী:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "সহায়তা সংক্রান্ত বিকল্প:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "সহায়তা সংক্রান্ত বিকল্প প্রদর্শন করা হবে" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "সহায়তা সংক্রান্ত সমস্ত বিকল্প প্রদর্শন করা হবে" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "অ্যাপ্লিকেশন সংক্রান্ত বিকল্প:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s-এর জন্য '%1$s'-এর পূর্ণসংখ্যা মান পার্স করতে ব্যর্থ" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s-এর জন্য '%1$s'-এর পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s-এর জন্য '%1$s'-এর দ্বীগুণ মান পার্স করতে ব্যর্থ" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s-এর জন্য '%1$s'-এর দ্বীগুণ মান সীমা বহির্ভূত" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s বিকল্প পার্স করতে ব্যর্থ" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s-এর আর্গুমেন্ট অনুপস্থিত" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "অজানা বিকল্প %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "অনুসন্ধানের ডিরেক্টরিতে মধ্যে বৈধ কি-ফাইল পাওয়া যায়নি" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "সাধারণ ফাইল নয়" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ফাইল ফাঁকা" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "কি-ফাইলের মধ্যে '%s' রেখাটি রয়েছে, এটি কি-মান জুটি, সংকলন অথবা মন্তব্য নয়" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "দলের নাম অবৈধ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "কি-ফাইলের প্রারম্ভে কোনো সংকলন উল্লিখিত নেই" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "কি-এর নাম অবৈধ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "কি-ফাইলের মধ্যে অসমর্থিত এনকোডিং '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "কি-ফাইলের মধ্যে কোনো সংকলন অনুপস্থিত '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "কি-ফাইলের মধ্যে কোনো '%s' কি উপস্থিত নেই" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"কি-ফাইলের মধ্যে '%2$s' মান সহ '%1$s' কি উপস্থিত রয়েছে যা UTF-8 বিন্যাসে নেই।" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব " +"নয়।" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত নেই" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "কি-ফাইলের মধ্যে রেখার অবশেষে এস্কেপ অক্ষর উপস্থিত রয়েছে" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "কি-ফাইলের মধ্যে অবৈধ এস্কেপ ধারা উপস্থিত রয়েছে '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' মান কোনো সংখ্যারূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' মান float সংখ্যা রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' মান বুলিয়ান রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s-এর জন্য উল্লিখিত গণনার মান অত্যাধিক বড়" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "স্ট্রিম বর্তমান বন্ধ হয়েছে" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "কর্ম বাতিল করা হয়েছে" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "অবৈধ সকেট, আরম্ভ করা হয়নি" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "সকেটের ঠিকানার জন্য পর্যাপ্ত স্থান উপলব্ধ নেই" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "বাতিল করার যোগ্য প্রারম্ভিক কর্ম সমর্থিত নয়" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "অজানা প্রকৃতি" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ফাইলের ধরন" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s ধরন" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "স্ট্রিমের সমাপ্তিস্থল অপ্রত্যাশিতভাবে শীঘ্র পাওয়া গিয়েছে" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "নামবিহীন" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ডেস্কটপ ফাইলের মধ্যে Exec ফিল্ড উল্লেখ করা নেই" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "অ্যাপ্লিকেশনের জন্য আবশ্যক টার্মিনাল পাওয়া যায়নি" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "উইজার অ্যাপ্লিকেশনের কনফিগারেশন ফোল্ডার %s তৈরি করতে ব্যর্থ: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ইউজার MIME কনফিগারেশন ফোল্ডার %s তৈরি করতে ব্যর্থ: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ইউজার ডেস্কটপ ফাইল %s তৈরি করতে ব্যর্থ" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s-এর জন্য স্বনির্ধারত ব্যাখ্যা" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ড্রাইভ দ্বারা eject কর্ম সঞ্চালিত নেই" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ড্রাইভ দ্বারা eject অথবা eject_with_operation কর্ম সঞ্চালিত নেই" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ড্রাইভ দ্বারা মিডিয়া পোল করার ব্যবস্থা সঞ্চালিত নেই" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ড্রাইভ দ্বারা প্রারম্ভের কর্ম সঞ্চালিত নেই" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ড্রাইভ দ্বারা বন্ধ করার কর্ম সঞ্চালিত নেই" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem এনকোডিং-এর মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-এর মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-এর জন্য একটি GEmblem প্রত্যাশিত" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "কর্ম সমর্থিত নয়" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ধারণকারী মাউন্ট উপস্থিত নেই" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ডিরেক্টরির উপরে কপি করা যাবে না" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি কপি করা যায়নি" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "উদ্দিষ্ট ফাইল উপস্থিত রয়েছে" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "রিকার্সিভ ভাবে ডিরেক্টরি কপি করা যাবে না" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "সিম্বোলিক লিঙ্ক সমর্থিত নয়" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "বিশেষ ফাইল কপি করা যাবে না" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "অবৈধ symlink মান উপলব্ধ করা হয়েছে" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "আবর্জনা সমর্থিত নয়" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ফাইলের নামের মধ্যে '%c' ব্যবহার করা যাবে না" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ভলিউম দ্বারা mount ব্যবহার করা হয় না" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "চিহ্নিত ফাইল ব্যবস্থাপনার উদ্দেশ্যে কোনো অ্যাপ্লিকেশন নিবন্ধিত হয়নি" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator বন্ধ" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ফাইল enumerator-এর মধ্যে অসমাপ্ত কর্ম উপস্থিত" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ফাইল enumerator বন্ধ আছে" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon-এর জন্য ক্ষতিগ্রস্ত ইনপুট তথ্য উপস্থিত" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "স্ট্রিম দ্বারা query_info সমর্থিত নয়" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "স্ট্রিম দ্বারা Seek সমর্থিত নয়" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ইনপুট স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের অনুমতি নেই" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের সমর্থন নেই" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "টোকেনের সংখ্যা সঠিক নয় (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "%s ক্লাসের নামের জন্য কোনো ধরন নির্ধারিত হয়নি" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেস বাস্তবায়িত হয় না" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "সংস্করণ সংখ্যা সটিকরূপে গঠিত হয়নি: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেসের মধ্যে from_tokens() বাস্তবায়িত হয় না" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "উপলব্ধ আইকন এনকোডিং-এর সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ইনপুট স্ট্রিম দ্বারা read বাস্তবায়িত হয় না" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "স্ট্রিমের ক্ষেত্রে অসমাপ্ত কর্ম উপস্থিত রয়েছে" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "সকেটের ঠিকানার জন্য পর্যাপ্ত স্থান উপলব্ধ নেই" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "সকেটের ঠিকানা সমর্থিত নয়" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ফাইলের নাম অবৈধ: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ফাইল-সিস্টেম সংক্রান্ত তথ্য প্রাপ্ত করতে সমস্যা: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "root ডিরেক্টরির নাম পরিবর্তন করা সম্ভব নয়" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ফাইলের নাম পরিবর্তনে সমস্যা: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" +"ফাইলের নাম পরিবর্তন করা যায়নি, নতুন নামের একটি ফাইলের নাম বর্তমানে উপস্থিত রয়েছে" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ফাইলের নাম বৈধ নয়" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ডিরেক্টরি খুলতে সমস্যা" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ফাইল মুছে ফেলতে সমস্যা: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ফাইলটি আবর্জনায় স্থানান্তর করতে সমস্যা: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "আবর্জনার ডিরেক্টরি %s তৈরি করতে সমস্যা: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "আবর্জনার ঊর্ধ্বতন ডিরেক্টরি সনাক্ত করতে ব্যর্থ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "আবর্জনার ডিরেক্টরি সনাক্ত অথবা তৈরি করতে ব্যর্থ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "trashing info ফাইল তৈরি করতে ব্যর্থ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ফাইল বর্জন করতে ব্যর্থ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ডিরেক্টরি তৈরি করতে ত্রুটি: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ফাইলসিস্টেম সিম্বোলিঙ্ক লিঙ্ক সমর্থন করে না" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "সিম্‌বলিক লিঙ্ক তৈরি করতে ত্রুটি: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ফাইল স্থানান্তর করতে ত্রুটি: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি স্থানান্তর করা যাবে না" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "ব্যাক-আপ ফাইল তৈরি করতে ব্যর্থ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "উদ্দিষ্ট ফাইল মুছে ফেলতে সমস্যা: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "মাউন্ট করা অবস্থানের মধ্যে স্থানান্তর করা সম্ভব নয়" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "অ্যাট্রিবিউটের ক্ষেত্রে NULL-ব্যতীত অন্য মান নির্ধারণ করা আবশ্যক" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (string প্রত্যাশিত)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "প্রসারিত অ্যাট্রিবিউটের নাম অবৈধ" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "প্রসারিত অ্যাট্রিবিউট '%s'-কে নির্ধারণ করতে ব্যর্থ: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "ফাইল '%s' stat করতে ব্যর্থ: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (অবৈধ এনকোডিং)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ফাইলের বিবরণ stat করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (byte string প্রত্যাশিত)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "সিমলিংকের অনুমতি নির্ধারণ করতে ব্যর্থ" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "অনুমতি নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "মালিকানা নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "সিম্‌-লিঙ্ক NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে ত্রুটি: ফাইলটি সিম্‌-লিঙ্ক নয়" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "পরিবর্তন অথবা ব্যবহারের সময় নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux কনটেক্সটের NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux কনটেক্সট নির্ধারণ করতে ব্যর্থ: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "এই সিস্টেমে SELinux সক্রিয় করা হয়নি" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s অ্যাট্রিবিউটের মান নির্ধারণ সমর্থিত নয়" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ফাইল থেকে পড়তে সমস্যা: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ফাইলের মধ্যে seek করতে সমস্যা: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "পুরোনো ব্যাক-আপের লিংক মুছে ফেলতে ত্রুটি: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ব্যাক-আপ প্রতিলিপি তৈরি করতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "অস্থায়ী ফাইলের নাম পরিবর্তন করতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ফাইল ট্রানকেট (ছাঁটাই) করতে সমস্যা %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "উদ্দিষ্ট ফাইলটি একটি ডিরেক্টরি" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "উদ্দিষ্ট ফাইলটি সাধারণ ফাইল নয়" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ফাইলটি স্বতন্ত্ররূপে পরিবর্তন করা হয়েছে" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "পুরোনো ফাইল মুছে ফেলতে সমস্যা: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "অবৈধ GSeekType উল্লিখিত হয়েছে" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "অবৈধ seek-এর অনুরোধ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ট্রানকেট করতে ব্যর্থ" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তনযোগ্য নয়" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তন করতে ব্যর্থ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"রাইট প্রসেস করার জন্য প্রয়োজনীয় মেমরির পরিমান বিদ্যমান ঠিকানার জন্য ফাঁকা স্থানের " +"অধিক" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "স্ট্রীমের শুরুর পূর্বে অনুরোধকৃত সিক" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "স্ট্রীমের শেষের অতিরিক্ত অনুরোধকৃত সিক" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "মাউন্ট করা বস্তুর ক্ষেত্রে \"unmount\" প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "মাউন্ট করা বস্তুর ক্ষেত্রে \"eject\" প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"মাউন্ট করা বস্তুর ক্ষেত্রে \"unmount\" অথবা \"unmount_with_operation\" প্রয়োগ করা " +"সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"মাউন্ট করা বস্তুর ক্ষেত্রে \"eject\" অথবা \"eject_with_operation\" প্রয়োগ করা সম্ভব " +"নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "মাউন্ট করা বস্তুর ক্ষেত্রে \"remount\" প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount দ্বারা সামগ্রীর ধরন অনুমান করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount দ্বারা সুসংগতভাবে সামগ্রীর ধরন অনুমান করা সম্ভব নয়" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' হোস্ট-নেমের মধ্যে '[' উপস্থিত রয়েছে কিন্তু ']' অনুপস্থিত" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "আউটপুট স্ট্রিম দ্বারা write বাস্তবায়িত হয় না" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "মূল স্ট্রিম বর্তমানে বন্ধ করা হয়েছে" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' মীমাংসা করতে ব্যর্থ: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "বিপরীত দিশায় '%s' মীমাংসা করতে ব্যর্থ: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'-এর পরিসেবার কোনো রেকর্ড অনুপস্থিত" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "সাময়িকভাবে '%s' মীমাংসা করতে ব্যর্থ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' মীমাংসা করতে ত্রুটি" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "অবৈধ সকেট, আরম্ভ করা হয়নি" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "অবৈধ সকেট, চিহ্নিত কারণে আরম্ভ করতে ব্যর্থ: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "সকেট বর্তমানে বন্ধ করা হয়েছে" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd থেকে GSocket তৈরি করা হচ্ছে: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "সকেট তৈরি করতে ব্যর্থ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "অজানা প্রোটোকল নির্ধারণ করা হয়" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "স্থানীয় ঠিকানা প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "দূরবর্তী ঠিকানা প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "অপেক্ষা করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "ঠিকানার সাথে বাইন্ড করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "সংযোগ গ্রহণ করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "সংযোগ স্থাপন করতে ব্যর্থ: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "সংযোগ স্থাপন করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "অপেক্ষারত ত্রুটি প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "তথ্য প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "তথ্য পাঠাতে ব্যর্থ: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "সকেট বন্ধ করতে ব্যর্থ: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "সকেটের অবস্থা প্রাপ্ত করতে অপেক্ষা করা হচ্ছে: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "বার্তা পাঠাতে ব্যর্থ: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "উইন্ডোতে GSocketControlMessage সমর্থিত নয়" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "বার্তা প্রাপ্ত করতে ত্রুটি: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "সংযোগ স্থাপনকালে অজানা সমস্যা" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "লিসেনার বর্তমানে বন্ধ করা আছে" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "যোগ করা সকেট বর্তমান বন্ধ করা আছে" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "১-টি কনট্রোল বার্তা প্রত্যাশিত, %d-টি প্রাপ্ত হয়েছে" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "অপ্রত্যাশিত প্রকৃতির অনুষঅঙ্গিক তথ্য" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "একটি fd প্রত্যাশিত, কিন্তু %d প্রাপ্ত হয়েছে\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "অবৈধ fd প্রাপ্ত হয়েছে" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix থেকে পড়তে সমস্যা: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix বন্ধ করতে সমস্যা: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ফাইল-সিস্টেমের root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix-এ লিখতে সমস্যা: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "এই সিস্টেমের মধ্যে অ্যাবস্ট্র্যাক্ট unix ডোমেইন সকেট ঠিকানা সমর্থিত নয়" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ভলিউম দ্বারা eject ব্যবহার করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ভলিউম দ্বারা eject অথবা eject_with_operation ব্যবহার করা সম্ভব নয়" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "অ্যাপ্লিকেশন পাওয়া যায়নি" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "অ্যাপ্লিকেশন আরম্ভ করতে সমস্যা: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI সমর্থিত নয়" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "সংসর্গ সম্বন্ধীয় পরিবর্তনগুলি win32-এর মধ্যে সমর্থিত নয়" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "সংসর্গ নির্ধারণ win32-এর মধ্যে সমর্থিত নয়" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "অভ্যন্তরীণ ত্রুটি" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "হোস্ট-নেম বৈধ নয়" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ডাটা অ্যারের সর্বাধিক সীমা উপস্থিত হয়েছে" + +#~ msgid "do not hide entries" +#~ msgstr "এন্ট্রি আড়াল করা হবে না" + +#~ msgid "use a long listing format" +#~ msgstr "লং লিস্টিং বিন্যাস ব্যবহার করা হবে" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/bn_IN.gmo b/po/bn_IN.gmo new file mode 100644 index 0000000000000000000000000000000000000000..04656e9988663930e9c75107068d1e6bba94dd7e GIT binary patch literal 67046 zcmeI5dz@Tleg6;sP%Bym#Cq2e2%A7QB-}~31qdNRAV9dNp>cM1b~9vmW|`R~1O)@g zy&_c+0c$|WE&@TM7Nsh9snuU=Yi+9t)po6|m)5pc+G_2^-~03ZKIb}Tb|(-ofBg29 zlh1k1c`o1k^L?IkX6CQ=-1X*&zw392qE~^VFNmU7KP!qp`7&LNqQ$R^q8Ecpz~_Q1 z0LgYN)e3r>Rzz%PL6|6jrVz-R9hMaP2+ z!QTLz;9lU>-~r(6;C%24UuegJ$J6uoCtS@IkOmw~?p zE&{&@?hpPrl=r3}m7W3W`UU)_@oxsJ;3vV8z}LXE`B8rxS@}m~0diMwXL+}{NGa#-Nz4kEoj}t+S zzX8OwqpLyn_W&sVzX{4N{u>niM;-3%he6rR4WRh>2>4>~Z$Q!e6ev1ga)jIS>7dG& zfYSR%LACn|i0MW@1Fr`UppxwVVNln<2_mBCc`z$~J{na2RZ#R?3DPv$4yym}fTF9i z%=tJ8)Hsu&d>8l|l>Z!5`|pG5@5M(&(XWGtg5vuG@I~MND0#HP{X0R?_hC@~o* zfQmc2FGu#^x!|eb&7k`ITkv(@3z-yN3oZu5?;23_Tn38oyTDg~Ujp|AzY9t}yPe>A zI|h6e<%>bxzZrZf_;FDE{~0Jce+1%k(Y_~Qi{QE7Yryw_(#!9HvV$iH2VVeQ2CBasz~_Qr1||Q;!RLTK z0vCh-35x#x&vbs?0QOUU2Ur0=0gC@`fX@ei0?KZ7JfHxwysv<=m+yn3d-pdwUx$LS+cUuzftP>>gV%#E10Mwy zPag*l0AKPZ=WjVEx-I}E=eL5Ye;X)zeiziZp8+-A6QJn-U$6qcW}V})0pASDPA>-! z1Mdjs$H9e^|09(5IiK8Q7jk=0{C)K|ef<9l`118$J{;6|XM?i)N$~UF72uQL$#0IL zKLz)xdc7ZklFyz4@B$tQGDP$+cpbs$|tUk6u%r(BHR(%-G%4=I0nGqwzV`VyD#=v(k5$}fS~KLo!GegnK0 z;i%pvlAAqPNy7~&Q|4-m{%C{m!-Cy~3)@-!<7I+-x zyHVCl!M_Jj0RIP+ewSb4{&9Q2C%{9w{?cn*Z>zzRD8CDo9-aWt22Z+!avA@D@<=`5{Q?kIuP)F~BKsG59@jCHV5+@_D@q%3p5-SAc&CYW%(4;dH$oRQXy^ zbUX^43O@Tr=j%)mRY&gzWuLpg)A>3N)c6m9P4HPa`Mlc#Wmnt5D)5!L-{p2b3c`By6e#}R`fl(4&%t$+_kIsFfNukrf-k-~^b2CD(QTmmd)|A! zpAirfh<*qn@@VuH<}~o%z{9{T@AG`-W1#%yyWp8%4du#DJ`Rq8N8RRj{UK2LeBtdr z?gsDy${z(q@8J8%CBR3(bHG>p4mm4$A-DkiD^T)!_6NNGv%xn~egYKzhu|bffOmna z_YLqkaN!-;J9ah(uBZHoJDr|ae$e^b0-nM3{|1i-PrJ+e{cVsY(GS2a;5+VizklI2 z=kq2|?YlX4Lil}LKN{R0 ztby~un?Tvu!=UJY3dCfhSAE$1=_8>0Wxoeq?;F564mxDJx zL<|FW|6PyAPXxUBqvVWSKlu014fst^{oMMn$HyOo1C-Z)%;W!O!AZ)8eB9&my`c2H z|0C{4mw=dP^ba5=6J7E9uJ;O^Z=$>f6#YK|uLYNW()If}P~)HYDc5`SsO$Mo@GV^b zHxN^Z#vgO~_WHEb(E?@X-vjpp&;E?pe=GPD<)47Rz6*BrS=JEXPd^t$?*o7Id57(5>J}lz$(T{C0WL`DlaE z>lXu#{*~`P?EVdptG9z&xWD%|y}!G_<0!x2ukjUdHTVJWuR+ms>EDo3gMBkTk9-r9 zT;_et^)m@dUf%-8!IS^i_4NoS|9k$oU9L+&mER7Ezk9)#fhYc*$BXm911R4CUJQN- zlwMc-z4P}`a1-VIzT^4E2f*c&U-{jz4-77)TnAO}Zg3g+s_(Jq3!Vp_3P#^|d8`I+ zr1*7kBRKL8>|KF>0bU2*^pC!de#H-%ODG=$N^ehq1K=M2PtH;Z&p!nPEM;_-+1(#611iT2m z9~7VaJmqoic2MO%0Ivj(`ZsJ5{4}WY9{=wB-VB~aIrK5D^0R*G{2T<{LU{_j8a(E|oR80gZ>9X)|8{-8 z9aMk+0lpc0;BjC(0>Lmq5S!u5pTfbqFpSndIA)muij-BiyIAa zZ_0Or$ADh|CD-RXYnSLv;G4m9;3osV{QvA?ap59R*B=8f17Ef4E+(hjLD}QKfR}hc|BmCr!J&Y-qf;q=3|z~B7|iZpuSWbSM}18=|0w0NIlsZ~FlPr8Jiu`{ z$EP{;x0quu>dN-?w+$GWnKR{B9QvEjF&OT@4aAh9QI6GiH~nv)aQb#oHi@Z5$8h`==jVlc zFQNSFoZ}YeKg+`P7>?!S9URIPFA5hGkA97EA2`8r3FoJP@{h%w{|0y($90_7IO4z0 zaB_5}tm_AH9LBW^IL_p}u8aKL&9OVz8dhRH11BjT25#l}Lb(1du*vm*s*zRK}3 zj#txm3C9mO*Pqs%`uje|DV+Z&_!^Ey;refYFXwn8$J@iTbGZK^jPaDulllcs$1mwB0w1v4ry8oS(!o9O@k%a5LB58qNiu z;y8li-h~Cdv~WZ4UkY#34G6@+Uce9>*;lf5`D?9Qu1R z_nrhdfIkHPL>KvcKgVnB%yWr>(C6F2wf_Td59hB3-^lS&>YNWA73%K6`5?zi%ExnD z8?GP7wF>8N3gvfG{xV1WH^s@mq3{Rb6&&YMcVW0D_#2Lm9Pd&g{QU=bUg&c-&UX#x zy8T>^&vAT@V+F^p9Qykp$8T}`7srhpD?*#$fVXo^e|u7X75H(ED>&a3{Bw@yhkE@1 zuLobjF~Tv#@lxvi4@dmBcR0D2dslJjuP@*woL{Q*%KUocqUvaUs8VYTHiznskpv!pf*x(RH}_iZL~I4YfMxc)v;RCYtIuKYH7c1hB>fr zS;ZRf#QsN{?OKjJ8(~>RgIC34Z73x|^5{FJuapC^R_S_YDcuhCRigRFo>^(OD)Wzh z(*gbG57kHN6Ya{_WP74APzy3;yn)S?1<``aruxK&=Hx`BIbLf>((|L`m4Rk+<5;z| zk;<*g*=MdYY9X{$s}60h)Gn^KC)&~Sf%b&-RGDnlFRlzV$Es+d-5lIlLzP2Aty;TX zbH%nN$H$wk3C3(TU>Ww>o7)q$v1s|w5EnxmE)PmhL(%f_@zMHVb)ru7)5itvrP1;> z_3D0c5JK#(%qG`6#&YmM(ejCjR()V{qUMA*hZEVGV%2K6IoV*Oq#~v_Sxbb}Xg2y! zJNwjAqvNZC8z;xjZY#;C!&S_9C_16q=$ohvHpe$thU%@_;6$^vxzfA{yG@GOI^FNI z$7^slYNNz0#9^&6*`~MEt5&aIn8t8@WU}Ra;}}ESnb%&*QPQNEk>HNC9ICZ9PBa6@ zN#8?FJg`;WRFMT#(DTUpdUHMQ*l5&7*X!c?(R!n{9*e++0zo}AnrN=Cp$3=aaJ?~9 z$xt3HGsw_r&0IyQ9<5_C2)QlmkpI+SFo{0-HgUCiSRNs1#n=E5Vn^!MhF105`$-r@ z@3q%%AXb(3K8B&B7F2Ffa@Mp?U>XygL@XE8MmHC%GO1wULqT|<8JiVzZk?~$YT_w5 zV;-!Hj#iN(Hc+3yX6u)fIHEd{k0ClVfUgna25= z-M!JARUydjP+fYhdSjwCg8g@`rq0J}t+9GrX3|#NX>T6GL^qnZsHch6WP=z}tE^mI z8^d!~HO40=&YHlM$D$M5uq(_#WAz4=+OqkoMiTn`qz?*>7m-L>_=%?bV8FTF=+7`DUP?ABbpm@d4efJ9gY!qPO)$D2`|oh8 zIhLU)HXRXSHWCtuWG0~Pnw-sCp1hOT*m8;minn>ZV9f zkBxE};A{ek$xV{R{y6`csE#b^Wi$!X@|6lLOsnzW7S(1O`~sz7t`cclv7D%ZF`{rw zpU8D*C1KMBnQqEMs=K)rrF<_=hp>Z*`sk>W(C@yq3BMI@qg9BESrUz8JhL#hkhIXv z&B8;?Ou^FLJZo_XVFbzTsCn%Jk4gItNviUBqcfA#&#x^SSyVYnsp&Bb(iS4OHa1QO z!r+1*Vg1bpR*#tQ_wnjrjr!&DN+lb%qZMHRVIHrZJt19KA(u3vFu@X_C+OR>7K=v- zyQZ?P?Qy0|-Fz?63L~Fx6-fK`Th>RUt`VfsrLC*DUMFl-TeYPgQ7ijhIN6+7R@rY< z|BdLs>UgugEL!1x{0hbXK#?UH@uU`_^~OeXQv;F-T4c3oFI@nvXtgL;2M23p|3nY; z8fFj+s(yQbbTQ0EVY!jHDaGlgVtmPEUviY(&{`&YISkwwSz3vF*q9bwA}YOROy-=qKUUqS zn`A!&O%_#5`i+g*+s%tg#KbhEbiOjr^8hemKfRUdC61j5d*%)$6>Q3tt8}@SxvWf2 zq%~~;n2K6ccT93|nB<=Fg@WpH_X=tzbFS4*5JT08YKDmP#uyV>btG#`Ez-s^;U(8u zqg8@E6r`T3(m`kFmJAE^cd~&m#r)?e4cA#$v)Hb(6z%A^-5fQ7Jyw~Ik%?t4=K7O0 z*800vAV!&G5vmIVwL^?A$TGg%DM|7JckW+?Vv+UEBK>4$YqiHUgDKz=q}#~w#Wf=4Dtt1V63O30O*&SRQk-NvHE zd_IY9-gK-w;i0CqWrjAdF3%mSU($7`js~&Iw`${~Oxl)4PM~s2(o@1lC$lYE%#JWa zeqIp7ru0tg?pj&IqA{6cZ1GZo%`tP#8qscK{bWNx=8()qBl z;LG_?NrNmgOKvqsE5YU$Rz_Ho%^S+pQJz0Mc!56e>oQeN*+#av9o)dpc=@FrJwNK8rQm2m3{IOV@_7gAZBe%c+amJs7Pm zU~d7nZ>Wy@x+L_XWqgxG3Ug#et(xR3nsOLz)rwYOUDg`S$&n46J(HiCmlW*8 z+JsFD^AmYe*E)%=3mUUtv=qxFZ)FbKs(E7~#;9MyhPmyX#pANZ*Y;UzbTZsroEaV-oosLD)@f(;_U6W5@3pOcp}Jz6 zg&vj{8I#fFTDtbwz+w;K;ljSCz}|hUJvymSlWyW2Q(ql=4KCX<)Ju{atH)#;RJ%I} zcCgQGhfH3(tI^7{?1{+<>;N%QtoAI^cJ7khEbU(MTw|!YsU4k63{0PioXj?!DbQja zD+u33>U&e4tys1H*LQwjWLujo^`#u!Wz!B)UCw1wtn7?BUA9#7E98=DxfS%P@HBAc zS)_++dD3T(XS8R}2)>}zzUUFY3C}{^=68f+Z1fxBUQH||ZIYmCPYo;cwUH-=G#|zL z4hy>0?z!S5dz=R!)I*P|c-SE&6`e3P*=!pZzS3o#yJSLSNh&KDB=_Z$r5BWl#Ip45 zLshfb5ntXA>>{bRvBsm)VlCT=#UeUxD77aQf(f=^<38KHFy-s&g|M1?Ixy@B%@9x6 zCVcUl^lH|>(Da@(${0&f9fBm%`}XEV_M}bepq8Z>VWf3yjf?87W<%DUui?)C!gGTW z9+fl_{x*>j$efZy%UYg-;4C^O&K35#liha_!kR>(mV~hub+)L-Psn|TJQ1W>cxQF# z%KRCoUB6cHX;pE`_V~0*Os4J;hRhX%thLDF+3#IcLPOGN+KoMKmqwmxN6(BNZAW?! z88(Tg3SJf}O1P1rT}IAMs9vqWX1{kfUahxCx3#^#(6`^lNKK^`-C~7GWomt8-FgeU~ zr07(ZI_%oozFJ|%T3sC_+2#48$E1+gXeFcBP7g7ov53yTnpmm!3=7A!kX)->EUgJdtC)d_0JR8C*s5DDY0`bDX@w$C7M^HCsM@Oq$6}(jMf20m2nm2%h2aL(=24Pvuee)`f^PgC*3e zCTl8*(DovNxD-+?P(}0>RrtNB6}~SaQ#`T;kYryd7_R z%+=X3nOBdLA}ik8!!+&O_s3o7c}B0@A+Wv!yY%W#uigrDS|IcNP#$aYR4?v2oo*|D$%#&wJzoUdG_rE3|}0c6*hZQyI|8%lYOfDvo9x3uc6`DEfOce8 z^H=<3Gl(h7Z)Y_pTZF4%BqjIr))PjqAlcUD^?JY(o#i#UFAGD3lD@M~T8f;lP51O! zJTPgrqwFR1mL{OZTM|+sQm$pqiS31nBvyOKRV(M&UzD#DLc+p$heo}|4Tzgsb*X_K zA=EL*NmH?co<9ljp{T;PtZ&5+)NpeJhOjy8aYA0}(cY%w!9|t%YxT@m?Q~BAEy#A0 zeJEb(TbGHAvouvtw(PFV*A(OnU^7VhQu6qhffzfUGUIxBsmDy8x}Mc%rW6#DZGvV( z<&Nv77F>3KCn?(X)G(8ljcAJ4TQl0;mG+?C_p-LSU?R{8u+^|g?oTTSZyGdSy;;gN z3lVy;#a|jsS&QFUtv3coC+&TVzI{+Ay^L2UHl#TR{1oX{g=lTOsfLjBPL9X%am6cQ zOH)((T0M9uclh^_Uyz7>>W@di$xyGPCM?|gBf`-!kVRq zW=Vyb^szPn-J}?Bix8L zdx~j=f=rx;SqwWndHtzUtG49fjiLVLaDTAH>}`7x%A}inr`290UO&#%j=gDFC4E`e zYWuoO(Ag&-u#`|{e4tvU>QSWGOLO0rE$d@bwLURkAEFc6KF(B$vrR^_H?N9Z$M+Z7 zdp5e8Y*%HewfvntlLU)5fs`(ZNov^Z85L*7pTI~0Ij;TXxqMYzlQ68eHIhEkC-`wy z60eCSX_JLPf0a!;gz@cQ**2qKYWc)PlGOt#J?yc405spky<1FZq=@}C{dgWkhn8@G zX}Bq@BhI#``q4SISkb!OoF?~BFj=&;u_PXC*s_HN?46icOE+P(60Bq89_ts5+BOPuq7>hBw(Q9gQrY+C#uqctvg)T5Hpy)tVgF;-NWkfgCrre#K{>f3mMwXb73ZF+H;Ubf+T8T)(nENm=sThXwI`be%`x7s^Q9s)L!-9I z;_NWnM(P%;WM3ySGd^WBfANCkde|OMmZ^%?$vg6vVnt=4BMA}pi?KtVe2kEcA}<_I zE9P};MDe=u!~-(-;{C~%hZ5hLP&}}=|FJiHatty`1Q^%A6YT|Q%_}@JNLq%p$KvXO z(yQlNye)DV_Zzo|b`dZ+5aOxtx}4MvIB4TWvid-9Tt>PFf5r zX-O!v7lmvMH%_`21(7L)4Ahl|R^DS+BZ)sEW%V1S{kvJm z5npro{ITlA^|8sZ3ePGNhIt<-yk6G1ZKKssYicNv zW^;1GGS#${f7X^<4_kiDOYr(QxKK$O+#?NMY{={cBpJqB_m7&Z!kTUsJTYol)&3v=p?mG2#ZDv6wO8hW5iLAhPRZt>^iS_Csho?45$ND`$m+5IutEoA5PU>a-JAEw3C^ZA=bShmKP^(_U0m`rjKW)ye?U^ zc()TgfcI-ZVySI;9mpt7K*L%pH(f} zamw-40oKz?7A;w_=#bskjPg;?(f*T|9@%7Qj9amN^g%oZu+yXGH!80?y0T=!vfcQM z_RQ2(GgJ4^OkX=QHC>sRdgsj4Ju_1`&rIJiGj-?8)MGPKSAg4D zRkG~5vH)7pGfwr0Rk_CmTV~U#xnYP{u-gb--W<&@?L?i*7)!^v*G7W`EFD4JLJ#Qx zkm3$-J0xm9H0yEiSFc8(lZvou`GDCf{ox!p+YR|Gg}dW>G?IH7xaMgt>UrH5$rh`DT+_~=D z-JH^g6UwnQ=TM<3?$kqwL`m1gUqo{6(#SZWKIAz?G6Hy{nwN>sbU{aV>Gi{d59+5t zm7?Hj-%TDNPPy|yBwc^ZhDVtY@nN$ox`cgK^4;dV8pXMwHj3b?Yf(0V^+46TXQsDu zLfO=+f=G|#gVwdx@?qeBffjw0pg-)ulN9GXc+Y+2y6zq@W-To>$*Q+UCD?|S(Euee8F||*_hMt)ZBqjIMG~8r znT19!xnCl8OsHU;`{?0?zh4p!C-DH$o)!O+#`iCt`K8Jr zHnx&rpLe)fDw>tZI^6D?3#bLVMTgf{w|MFSq4NnASY2@aQ8yjm#m4 z+*rFpvyDn6u4pl~-L8h2WVUf=UOufAXicY`BqTe(S_;yGPp9~#Qv&~T?$i}?v1K8* zXbo%d7%~Q!NRwHD0!<0Anr~+vIy+*>Kz#c2xZ?s#(^9DOe8=)g`#zsp6bv^`sfgpO z2R=(fu>~voKq~0xA$kge@c}}TY%2V)4I>kh;n@FSiEVAQmaw*}A(GrKT<9sAA^S#h zN#HdFuoek9=r&U$VfUK&N(jOIHpda4B_|_h$8;ObV?9hKl3ZqOKq6;jT}*zQJ1(tm30@BaGJ7$VxRmaSXBJ$H{w0@ZFt~MwQX$?~Aim;2eiFb{ z77s9TZcF)G!tSZ=q)f*uo;!=}{8lFVO7eN6MZeM}7r8OJz-$JFPG5n@q@a_=NJINe zlw$=23zUFvOQdByF;Kd5Ijqk|xq1d?R1{!fg(|;_N7IuE zT$-huBX*#d_^URGM8#ujs5sF0xrcGWN1zG?7M9mYT;U7vBy*WEt(NVq5XxLN)VdQn z2G8frwiV1CI=GBS?MfHToi^xttlzXp|5%`+X>kLkM4Ls8<;c+nVJ?oLBra(|X3WTp zJ+PvySbbA661I^rZrY;3F!^}ehnG<|>_{d;B}O}K{EwXD<)FnK24e0J8pgNxSG!v$!gAUF45)Nq#F$&~sBO&UqsUWCWMc4RW3 z`*i!G>pbPX61vTOBtFR+Nx8#?{f=q7uN2tEr7rYup(6UHfFNBia{ls}kNZgPny7Ru zHgtpiNQ;HJ0rPq%S7U)`JRb}{SFlJeI+XyIvHC|Neal!p`!W31h5p&o*w?tE*$^$H zi^9yLVJ&?g40h5voI;3VYRp)Hcp7viJZqY%8fd}H;NB!@7*lhP(ls~eZIqn9F=`qd zZ0$U+WJ--K64R0Zj8P(KVk)wuWN?(0&UaCG@@jD_4dcZahs~o~TGA!m`#z?EwX5U< z7PxO?lyZwh?wMRmX_hQ7_M*-OwB43L<>^?VZ!j=}frhXh5gBLK##2~s6D{dR253Qq zQPr(!$lSf0-Xtb=#L&>?{G+u!opwWBO*HU1fH6`JWIBz5QHYQ389w34ZL+~98Q0sm z`)5R_aEu=3;MN0yNKcXuC{4^7+1(u(y;wGsDqzthapYhq-kfNJQOWodHatB*@sCNX z60E!ZU0HE62%KRcNjwjt&udhs@C%U~49_jNqM7{iXvN<=hxCO|u&1nmbN2izOK4&= zkc-6>*Ds#6x<`=x|B_84%!hNx-hB$oR&EPRxW=y*84Fvc|p{K5lZ)QcPA4X}jI{F3ddkUeyBgpa>6bQ+CXSH)E zfgq3F*bRv|QqLi- zGfP=^E^pLc!EDYz{W4RJC(oRt!W11e>f3F(tRZo2NE9@*cl_gtWrr70ayla{vkp_o9$kb@*&Av%jOn#|Q~yR}q? za-a1|?xPHmGD5--L@WjDhdZp7`QQE0EkbJI9?~Rja4M4oMb69Z65;NQ9VLd@;Ze)T*fsYe=7}^S&FOqOH!JCyp6M1>z^H9S zIF~m+16nOL>%lyGpxL9bHgOOK3o}|(f$re|+3z4gttpxkp*Gxpgh+VEBoTNFi zlu_1$>G+|!z9F`>Eo0GX$P2xDNa+g+Dsh$O_lToj>P;l~9u2Lz?BdmyQTNuRV~3Z8y0_{+W=@_?6!Qk`lU2%}a-=7_7w-Gp_}1M{ zrOeeyDFbl3HEA z)qyY9fX_~0MCfupVKSwTUek$yLLzLc__4~7*p`AL`^R4LGD{~KW+?E=7z@vnNVieQLaH|m)cB!j@BXI?qI7O_qI;cut0;% zuu2yY=9SwR?C!cz(xM06IMZx4mmm=~ZJ_1`^Azo5Cbk7NaWJ>e6b;>N zW!)5J9k2_Y-_3E-nJ{irCDN zjEP92Yc6u_FrPd+Grcul#y$NJN~8vlnFq`ERg(oqyXd(vlS)!|n7k0oELmfzFZb3s z{LP!i$Y~&T$A&5`WM_K@#cL8HMq#*;tA>O` z^Zzp^Bkex*5hH_)UAeMsG2wwS%K@WT;Y$(6G={zODvvH2cJue}h3PYd9Qm2{ia+D< zL{Pf7T;Ul~3GpZapHRkx3Y^~ZEUCLmbP>VM>AV;!mLkK9D=HaRCO-FI(_5o#OAiQq z41R*vx!{yoM?S)2290e6^Fe(4Z;n#dR~OM_`idDK;kAzBA+{Zg&6pWx0=U_bnE;j0 zf3jZKk@O{TLbplJy0>b>Q4b$xrm!w#%E>i)Vw#goksA-ahzZ|eeN9UYh?b&@jesP& z#KA%JEWe-EURaXmy8knx3^GpbXrkG4Ryx8Q@U#fQ>P0RNg(@{t;$v_dmgUCO>@)2% z8JmIJ)Udo8EQ50OYSK@PF&C=1QPf3{K`d$u52__e68X>ylcQpg^V<>s^}XUK#oqZq z1g^XAkwu1^HP7xsOUBAAvU_xSuW{HlX;He2PW0AFPxZ}hP@Qkyu}R{QS8K?0{CM_< zF&KedNx?LpE?O0wwa0?jc~s5)az;iIt}9PGazB?5Ov$`gV%Phi<_7NL>C5XGC0RYA z2giU79`sL7(-AZ%tYP-(EOuF0hfEY(Fb34PnA3Z_G)ClW>QcUzc9{%rCShIBrR{3U zKf_B)8M=qH9!*-6_HTqTl=}-+E_e4%T6G_5w>bB^(};CHa_d6|K}jANEV~m&NuY%J zIX9mC+osA^esmKY+$GImkS@ziye`po@*^ZRIy7Kh>`5Q?N&Zy#z-5z_*qu7&1 zRtkFNx!O`qgorb9!~YMd3U#%xq*nYQvYN-|s;-Ke1&b~{Y+X}H?cA}ss?{{MR;0UJ zATCtfLZ6G=_^mPL%qNI0V&0Kn&Ey!{g^ayxhJc0KL{ZdZJOB~E^1kVToJfuy6xv$OrZJQ7@1z|e(?uT=~pylhEAi>oTd`-r3M>m+7qii7?i&ErN{m{ z+{jE)a!1tH+U$-2g%z=zS(Zmc>eifw-7coUkGd$I;>+TCayZWzJnE&-9J=-$ezT^d zYjZn%fjLU1#n|0lCy1iBdsQ^K%&*gQ4A&t|2AsRUE-`2BhRHAPbR%T$F8B&6{bWx` z2mT|!aXfLaoO44?k6oE*@Is&Ld(}d_&<};V%^u z-*p@Rs4mtK6p;(?^o2_W^_T*auJ|71DC!s_T^i&o#;x!Stp3s5 z&7w&s<@}VSpU#4&M9&Nr_8__Hu9PfARZB)9C&`V4EIf`RCTq5>$??I8{TP>VP0{B^ z|89^6o8hqRYgW6RJzpXYn90BV&3iWNXkbwlPM)~P5s$nWzLw6=cJbN2NVns+&Gl@W}YrxdFlRxsvm|IL#QiIzP zgSzGlZ^ywLO7dHCeUh@5ZcU(A=(RIb(^yvgD`}=A&s&n=2EH4P(i8 zaT;j2h)_cO^g?bUE)f@x1zkUK%$(PEHADAq>biYtpd^%d8idj{(O`ymm`(aCCT3{K zz}$pfk0ly=2P`o7iH{qMFpB3Q=u$4>Jf}7DwmMgB_z4X{LW!8ldhMv!C5S_62LX!8 zgn5ZCC9|W$SYC4Q++Iuxj~$KE3w*t9ZDSaXs~-2U8+z62fxTG}VZb9k|0CdsL(G`g zoE+1s=gg@=r7M+$-2C*P3!2ap8-?cg4E1J9*cPMO%gMehMc70bgcsr|5_OZ(N4cPh zoK}`-wbJkPgF4+rA2ep!>oY+7mM?p{l@jeG@@?$ch z999hw(dWrNA}*gR@a`m~K&p>92iML_O>?Fo9t@Rw?o;r`0O*MS%O;a&JW^3oDB%Gt zthikBR8-RiBSIbbUGyS61Srl-grYUfg@lJBmOKV~RPp%@bx|u7+$^#P9(JFZ1&vY< zE*fD`x-K%~Fo=*%JXsC%t*13^j9LIu%c%+9IN)r0t!+@}IS*uexD5RDPFqgSCF4)W zRxeBJVQ_o;6PfH4f98}I$Cr?1-xU+pMndK}z$ni7-Lj77`D87b%X zqf!H5^mIRoCbIdNZT?A63#2_TVr=|>Vy9#&J6E#7L{eu*U5`|rfraRI-1sqJnTA}* z11HfM1HrZAiZVf^EKkPmW+%q(T`{k}S)p(^IQgEDT5_bXSTKqKeC zRzo)Na8)K8_3nt)r@28qXPIb}JP{U{1_?vV=kYQ?3H}cC?#&@e8_p%{aEH|(qRYp& zXEx5P-pGhj@h>`Jg<)qEUXt&4#u0}mv&>lq*>&EHN6oFFJ*fGdS2l}dW!x;u{u9$k zQ!un@a|tt=Tq-=4;%d(5;o7HgxtW=jIHVS)OhpnJdJInBj>rvY=SF@;Cjqj#F8SqI zCL8sWTZbewr*fK1hU+HQu_mE;j-Qh0E=pf4DDjFw1N7%McuM+VsJV$_O2^}kI4iM`GJKJwr#=`ZUvJ*-bEV9Y zkK-BCFNtqaZ0!*1W-dz8+0$LhDc@%E6SaaN6wNGOtJ`wj1ksu76u+*SoC$Iv#GTQ7 z(@jzGij7ya_=1cY*Vs3v28m3Ykd=P<63Tnvs)sZboY!L%KMpLeyF5rSj=zl~?J-jm z7P9;@Z!k=VCCIYtN)p0RBSQ4&o}oAC-t5AIlk-U+OUX~ekQrxz_GG(DBp@+uN$lWA ziCR0hJwxZ^8cF0kJAv`L5M@!aYsUx`cG4%dmLN^zQ_|?pF&KMuT#79&6mr@xP4JpZfgLVe6J!EQHDmTEr=UIdceVCF=SK~EH!5% z@*s0LcNM*k)IDz4XLOuwY?ki4Yx$--LK@qOQ(|iWcq4SBMn0#H+7B7>J9d2@^@YI14uYKPcXGN|w zddKu)W|9?htk?M61w@_8wXBuiG;`&|)#I}BtF;ZoAsPJmG5fvqLg1Z)dU&>lE~e?` z7d9q(VoM$J@oN| z?Z0?w{AzKJUP&|*qU@LEJH?TyU?z};6Lu@{ZM7^z^wJCQe2$eFVHIR=Fk2yECTPiM2a!VY`=+`PK6ca7rd zH;;8U{EXA6pWG}L0!r~q-LTp?h**g9w1t(0#N~P|>n0hPtKkSC@~44gEO1k69edVi9y4TjLzQQ;D(Ro9>IuK zRDLDb2m=B}<(d=DT*0}|^%$YsD10f}OWf>e`G(f?wX@F)9v%~kNZ$<1kQ#>q47)4( z>`ec&iJ@1zcJipFpS9{dqgC0w@4UO*^nkiNpmL)?L=dxO5&rvd{u6YPfu@)^u?i1a zC@Na<(1V!^L+5{Yy|4gsdNS=yH(V_SpK>yI%>$+COJEZFo{}qx5?KR^KttSP+&DLg zGelLPEwxyP%6&|sT7?v28)f*lsaG9iIu9^n5*bqe^|>X4z{_V9t{2xYb? z*nvmgDeqVoqkB-8wyZhi+vT=uE@PtDk(ZOauMqBF$ioit##dRs`x2}Y(|2kxWre70 z7>@mf{&r;eoiH4F#SNuVI&=Dn+d+)70=wb)yE2O`)zfY);Rzi!gP$t0CYF>lf@j)) zd9NL&b>U>KwRwHLG2Apt#7Z(VgzzYf<)&tbsFd2^WwF)kS*AId@nbR}in#7`zHGvg zy1TqK$e_@YlUg}fC9xB(Eqf2(PMN^{dbmHY|aaNsmpM*!0 z`T&J@>l2n+aB76EB&Umda%Tc3KV*o=7DW7PFc(lsOt@GI`b#$rO8THH4}D$c=Vwfr zEK-!@D0fpdV?ir$4&^8vcbAT4%g(rmxZ zb7p*fFNxbCE=6@Wn%Ge^b{K4CD)swJbdcdAZhY4Rtmmi%8v0HpVy2_+v*Ecol}i?g z%O=H`>3(-3B!ZNjt*u=1h#=MqB8e-x=TmJ9BBokOd!^8IUaNik$o`8yhgHSg1s5-d zC=UlRI-&rQwE&`4Oq3xQx#L2Z>1sBq+h}^A6u8fART3pUMRLb}uW3!;gDAqw#TwCN z=I$sVL%yrUX`8kt3YJi*4?TH)i^9;Qjb&Eo9_?458s%ve*(P9&71kkK4jQtaEaO#d zMW+h?aYRu$wi0s})XuVFd6BRcu6 zN4c|&IMJ%MH}DJVm5{t=qFqm&5(n@=x(i|nZ1^bnzBy(bO1twA#*$gZ`Usw#?mK#G z2=pK(H=i~U$ogT<8*)iwa%uKFE4JugZ5p43IRsfq3T`Kgy#zQIm1|Mx!B&cDjnqZZ zG#z_Z;M0g(z1G)BJju;E&VsumcB07xEz?Qj9=Hl5aYc)pS(8-A=qi!x;~ssb0I$j{ z=y5iyGqcHyYA&-uluFiO>GIslc(ExinVc?9=IS_sQY}B1K4u*x_)yLjVaMeq+4k6h zQ|c3Bb{6+-y}RR83c9{l@lqixB>S%Fv;yuW<?`slzov0 z9c_!1uTd~D%8GzCgg#F!YoK8KknrSwZPtFsdi{8FbaeiLKC*r4&B2w8p#ji-FsjJ1 z%$-kZyEa-I^sjG#crtJgA8~eN2Jo~9_K#z4s@5m?H2E`NJpQ2gTp~;N6r>o_$Sr2e z{jM5jlMss$5OO%b)o3y^ zwxF7tBE$4z%HdPKgd&-2%%LI^Y~%tIqq$)#OmowH)tyuFWk9!>@OGP3k;JxH-?$zP zeH`uVaJz>di&cn#1Ppp{@4Q!E+kb(XD58o_5@cZ80CZS1Le5KHP^Hmtdr@g3C*`CA&3#BWIZ2hszZ$Yt|@f$kp7E zGcryggT7p1aJ7Yt+@LR?tUc<9lsjUf(juo^7Ze;IGz|@xl1-8q(6?=xBhl34Swzwg z`q{FSx=6t7m2q82E_com#)B1J0E(BXMaF$fnr2+Yoc{m_*NUOsT%1rY4w4_H3(BE7 zo#8Z=tf-PWFxALSpv~({UO-I!wru%?du6$ zZ@IpHP9vI9v2zGY--%BL-g%ss8W2jx6q0#bl8RkWlJ@hCjE7d-!3uneA)w`jjcKL7 z#~9L~*qhZXHX$PkHKy#krtZKH=sc*2d4pG*-*oz#wX04)ZPB7d=SOBk$qYy2q_*7Q zVIxX=u9bBZ@i%NOVU9}rC=d3HJ?VRoV+V`f-t5C)xRa&$)Pp4;2&^cVBIhlB-3g4A z_zQN1KBtVTjPF6p93&5Rp?Td1#EL(YQFOfw0kM!Vx3f^A=h_*vr}>epD=f3nb<>XqLz&Z-^viEY8~2sPlO`HK`D? zS_okP=!_|nPB^zH89FAD6k(|>WZcr_%+!6sz=C7IoW8_~?z)qc>j-|bnT$FPVUH24 zCy}Sv8nfr7nLZf6L$=s(!Tm7~m&09=O%oWuZ#k*EWFKydLN}R1fH{qAGQU&Yh;yI4 zIyc4VuNz%hS$8VOB*)qMvMbuW*ZPngDJLAG+%R!*b@uQct-JUwgo{h5nE0j#EEq~x zE=5Bqw{dz%f}QJ4!l12m?IUEZc-q7*T|l{ZT4_vBP;hzo%+z)l51LEfFTQ~~i~)N| zyrO3+$`DO@9_G{~`cod}>MfGbJ|gPg>guL4<5N@1Lkf64dT{!+tHz~rcB$f7Mp#=V zygL=Qgnk0C@)ReY&#N(-*OudCnL(AoRqrtB+(;C{Xr9CZxb8CRBsSp28Go7@hRt9l zJHLax#Mw?A1@^j5d5o8{(JX!T7E5N$x$>;$;KrK10XgfDZb!v*wsR8okeHh;6TxN8 z&vyef+wnCtrg7ORn$btpJ9e7wPEK>wGT%~L%`S}l0qe*YCcbkdtt;mSq{OJV!D<(< zN~H+`-DdXwXvHqA-&CL2u%2(bYgH%e%?34+AOaE0#ZHhEYiDLPJ3hSmEIxIoOb{E7 zjSuHkI1gRBYb6Gk^Ga&PGMA6gu=5!nb#_1`X@?#)6`bJNKfbRpCEV%koz4chtvxuAQ0EDk!F0;>4E1#w$076cALB0Yp|2cAZIEK%TbZ+*4PbruRST zgImZktfi^Vc-V`3iffceP4`c4|C0)BzSl#$S5 zF(>9yZaHjBVgO= zz|Cs>UNHrP3{BT=%T%E{u@NJ~ZPRqHvTlttxy@|w(aO4U>)oxflc}-=!CXVcCZC(+ za+U`lXkOD&Z@J5kdtVp*`cL~p3(`VB7_U1N(m+z0ZE;Mu9h@SbJz`t2TzUGMiqhMh zkyDFv(TBKgAJC-Fw8^YCYJ@HO;weo(3Aq`7b(fcAiB1jGruzY>bjt`G^%8 zLsyG}5uXr!f_<+IqKu>1wJ89RdB!I>*@`gCtLctw;!n<@s>fEc?%=}@#{tAHwE{np znF~^&R!D)kNl@^7Jj_QliG^#n<`zbHK!~*MNJGsWMI^n(?k!n_Na_^0qW!j;f$J$w z(oJY#F_(?$7>g{^gVUCD0E=kcz!Mp&Btzj|&QD}`2*jPaJR&%Y>BnTPmaIp5j!cj- ze_>pS*DuXA^Uk7s`MlJY^pz-^odnF#gALgePOBge3v;^@kw5J=E6}^>LAp2bxLcq) zERZYV3&I{kPH?Somv&=$FI_4Cb=d3lR<3%2pzRYEJo*o+vti`-dfzDtXox#EKY7PJ z=&8i*l0hX!t-8!Cf<3v75Mt$09t)^N`s1pD8@CFtr(`SPA7abn0{ysO;62J#>57#W zHhn|o#1$ub8l2k)nL}$i2HZS@=|hYLaIvAPAXdsT)j1N~m3jKUu8&smHkUw6QZi%> z1XrB(#&vj~*UeL6n2F;|WoG(AGt>8^W<-an=O~GFdy@pqer9SXeH5mv&p|BK?g7YU z4L!1WTm$xT#$whSf>p*Du_b3I1aOHiJ8|j>?$tKYx<)jaP=O&7KwX>k!NA`4vPPmnS?UTAv}^E@cJYFs6O}v9!%C9TLqK`W7!AFoTy}GhA#LMo3A*$FrNGex9AL z`T2Feu3Wr3E&@x|-71lg;&jJ~BHp}=eWBEM5_{cFN<=RqtWfH$bJVrXvc|4Eqd%A7 z<7LgPo#!`P-DNFOPbo2gbHcRJKzA1+%RA)WGUO|`DleELn@ud59=2FSSI5wl?m|Sd d_w7h1N%}3Bd~(hK4-A!Cys%W}Qg~h({XdR(w738O literal 0 HcmV?d00001 diff --git a/po/bn_IN.po b/po/bn_IN.po new file mode 100644 index 0000000..a765cdf --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,2085 @@ +# translation of bn_IN.po to Bengali INDIA +# The Bengali India translation for glib. +# Copyright (C) 2002 +# This file is distributed under the same license as the glib package. +# +# Taneem Ahmed , 2002. +# Mahay Alam Khan , 2005. +# Samia Niamatullah , 2005. +# Runa Bhattacharjee , 2007. +# Runa Bhattacharjee , 2008. +# Runa Bhattacharjee , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: bn_IN\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-15 18:31+0530\n" +"Last-Translator: Runa Bhattacharjee \n" +"Language-Team: Bengali INDIA \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "অপ্রত্যাশিত '%s' বৈশিষ্ট্য '%s' বস্তুর জন্য উল্লিখিত হয়েছে" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' বৈশিষ্ট্য '%s' বস্তুর ক্ষেত্রে পাওয়া যায়নি" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "অপ্রত্যাশিত ট্যাগ '%s', ট্যাগ '%s' প্রত্যাশিত" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "অপ্রত্যাশিত '%s' ট্যাগ '%s'-র মধ্যে" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "data dir'র মধ্যে বৈধ বুকমার্ক ফাইল পাওয়া যায়নি" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'-র জন্য বুকমার্ক বর্তমানে উপস্থিত রয়েছে" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-র জন্য বুকমার্ক পাওয়া যায়নি" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে MIME'র ধরন নির্ধারিত হয়নি" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে ব্যক্তিগত ফ্ল্যাগ চিহ্ন দেওয়া হয়নি" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে দল নির্ধারণ করা হয়নি" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' নামক কোনো অ্যাপ্লিকেশনের দ্বারা '%s' বুকমার্ক নিবন্ধিত হয়নি" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec পংক্তি '%s'-টি URI '%s' সহ প্রসারণ করতে ব্যর্থ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' অক্ষরমালা থেকে '%s'-এ রূপান্তর করা যাবে না" + +# sam: রুপান্তরকারক +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' থেকে '%s' রূপান্তর ব্যবস্থা খোলা যায়নি" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "রূপান্তর কর্ম সঞ্চালনকালের উৎপন্ন সমস্যা: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "প্রদত্ত ইনপুটের অন্তে আংশিক অক্ষর অনুক্রম" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ফলব্যাক '%s' থেকে '%s' কোড-সেটে পরিবর্তন করা যায়নি" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s'-টি \"file\" স্কিম প্রয়োগকারী সুনিশ্চিত URI নয়" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "স্থানীয় ফাইল URI '%s'-র মধ্যে '#' চিহ্ন অন্তর্ভুক্ত করা যাবে না" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' বৈধ নয়" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'-র হোস্ট-নেম বৈধ নয়" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'-র মধ্যে অবৈধরূপে এস্কেপ অক্ষর প্রয়োগ করা হয়েছে" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' পাথটি সুনিশ্চিত নয়" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "হোস্ট-নেম বৈধ নয়" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu বাইট, \"%s\" ফাইল পড়ার জন্য বরাদ্দ করা যায়নি" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" ফাইল অত্যাধিক বড়" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ফাইল থেকে পড়তে ব্যর্থ: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ফাইলের বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ: fstat() বিফল: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: fdopen() বিফল: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ফাইলের নাম '%s'-এ পরিবর্তন করতে ব্যর্থ: g_rename() বিফল: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ফাইল নির্মাণ করতে ব্যর্থ: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "লেখার উদ্দেশ্যে '%s' খুলতে ব্যর্থ: fdopen() বিফল: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fwrite() বিফল: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fflush() বিফল: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fsync() বিফল: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ফাইল বন্ধ করতে ব্যর্থ: fclose() বিফল: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "বিদ্যমান ফাইল '%s' অপসারিত করা যায়নি: g_unlink() ব্যর্থ: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "নমুনা '%s' সঠিক নয়, '%s' থাকা উচিত নয়" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' টেমপ্লেটের মধ্যে XXXXXX অন্তর্ভুক্ত নেই" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f কিলোবাইট" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f মেগাবাইট" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f গিগাবাইট" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f কিলোবাইট" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f কিলোবাইট" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f কিলোবাইট" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "সিম্বোলিক লিঙ্ক সমর্থিত হয় না" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' থেকে '%s' পরিবর্তন ব্যবস্থা খোলা সম্ভব হয়নি: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string'র উপর raw read করা সম্ভব নয়" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "read বাফারের মধ্যে অরূপান্তরিত তথ্য অবশিষ্ট রয়েছে" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "আংশিক অক্ষর দ্বারা চ্যানেলের সমাপ্তি" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end'এ raw read করা যায়নি" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' খুলতে ব্যর্থ: open() বিফল: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ফাইল ম্যাপ করতে ব্যর্থ: mmap() বিফল: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "পংক্তি %d অক্ষর %d'এ ত্রুটি: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "নামের মধ্যে অবৈধ UTF-8 এনকোডিং সহ টেক্সট - বৈধ '%s' নয়" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' বৈধ নাম নয়" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' বৈধ নাম নয়: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "পংক্তি %d'এ ত্রুটি: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' পার্স করতে ব্যর্থ, এটি কোনো অক্ষরের রেফারেন্সের মধ্যে একটি সংখ্যা হওয়া উচিত " +"(উদাহরণস্বরূপ ê) - সম্ভবত সংখ্যাটি অত্যাধিক বড়" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"অক্ষরের রেফারেন্স সেমি-কোলন চিহ্ন দ্বারা সমাপ্ত হয়নি; সম্ভবত আপনি স্বত্বা হিসাবে " +"ব্যবহারের উদ্দেশ্যে এম্পারসেন্ড চিহ্ন প্রয়োগ করেননি - & রূপে এম্পারসেন্ড এস্কেপ " +"করানো যাবে" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' অক্ষরের রেফারেন্সের মধ্যে অনুমোদিত অক্ষর এনকোড করা হয়নি" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"তথ্যবিহীন স্বত্বা '&;' প্রদর্শিত; বৈধ স্বত্বা হল: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "স্বত্ত্বার নাম '%-.*s' অজানা" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"স্বত্বার নাম সেমিকোলোন চিহ্ন দ্বারা সমাপ্ত হয়নি; সম্ভবত আপনি স্বত্বা হিসাবে ব্যবহারের " +"উদ্দেশ্যে এম্পারসেন্ড চিহ্ন প্রয়োগ করেননি - & রূপে এম্পারসেন্ড এস্কেপ করানো যাবে" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "নথি কোনো এলিমেন্ট দ্বারা আরম্ভ হওয়া আবশ্যক (উদাহরণস্বরূপ )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' অক্ষরের পরে '%s'-র ব্যবহার বৈধ নয়; এর দ্বারা এলিমেন্টের নাম আরম্ভ করা যাবে না" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"'%s' অক্ষর প্রত্যাশিত নয়, '%s' ফাঁকা এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে " +"'>' চিহ্ন প্রত্যাশিত" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%1$s' অক্ষর প্রত্যাশিত নয়, '%3$s' এলিমেন্টের '%2$s' নামক বৈশিষ্ট্যের নামের পরে " +"একটি '=' চিহ্ন প্রত্যাশিত" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' অক্ষর প্রত্যাশিত নয়, '%s' এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে '>' " +"অথবা '/' চিহ্ন অথবা কোনো বৈশিষ্ট্যর উপস্থিতি কাম্য; সম্ভবত কোনো বৈশিষ্ট্যের নামের " +"মধ্যে অবৈধ অক্ষর ব্যবহৃত হয়েছে" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"'%1$s' অক্ষর অপ্রত্যাশিত, '%3$s' এলিমেন্টের '%2$s' বৈশিষ্ট্যের মান নির্ধারণের " +"উদ্দেশ্যে সমান চিহ্নের (=) পরে একটি উদ্ধৃতি চিহ্নের প্রারম্ভিক অংশ উপস্থিতি প্রত্যাশিত" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%2$s' বদ্ধ এলিমেন্টের নামের পশ্চাত '%1$s' অক্ষরের ব্যবহার বৈধ নয়; অনুমোদিত অক্ষর " +"হল '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায়, বর্তমানে কোনো এলিমেন্ট খোলা অবস্থায় নেই" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায়, বর্তমানে '%s' এলিমেন্ট খোলা অবস্থায় রয়েছে" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ডকুমেন্ট সম্ভবত ফাঁকা অথবা শুধুমাত্র শূণ্যস্থান উপস্থিত" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"তেরছা বন্ধনীর প্রারম্ভিক চিহ্নের '<' ঠিক পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"খোলা এলিমেন্টসহ ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে - '%s' এলিমেন্ট সর্বশেষ খোলা " +"হয়েছিল" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"নথি অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে, <%s/> ট্যাগ সমাপ্তির জন্য তেরছা বন্ধনী চিহ্নের " +"অন্তিম অংশের উপস্থিতি প্রত্যাশিত" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "এলিমেন্টের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "বৈশিষ্ট্যের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "এলিমেন্টের প্রারম্ভিক ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"বৈশিষ্ট্যের নামের পরে উপস্থিত সমান চিহ্নের (=) পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত " +"হয়েছে; বৈশিষ্ট্যের মান অনুপস্থিত" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "বৈশিষ্ট্যের মানের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' এলিমেন্টের অন্তিম ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"কোনো মন্তব্য অথবা প্রক্রিয়াকরণের নির্দেশের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ক্ষতিগ্রস্ত অবজেক্ট" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "অভ্যন্তরীণ সমস্যা অথবা ক্ষতিগ্রস্ত অবজেক্ট" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ব্যাক-ট্যাক করার সুনির্দিষ্ট সীমা পূর্ণ" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "উল্লিখিত বিন্যাসটির মধ্যে অন্তর্ভুক্ত সামগ্রী, আংশিক মিল অনুসন্ধানে সমর্থিত নয়" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "অভ্যন্তরীণ সমস্যা" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "আংশিক মিল অনুসন্ধানের সময় ব্যাক রেফারেন্স সমর্থিত নয়" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "পুনরাবৃত্তির সীমা পূর্ণ" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ফাঁকা সাব-স্ট্রিং-র কর্মক্ষেত্রের সীমা পূর্ণ" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "নতুন পংক্তি চিহ্নকারী ফ্ল্যাগের অবৈধ সমষ্টি" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "অজানা সমস্যা" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "পংক্তির শেষে \\ উপস্থিত" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "পংক্তির শেষে \\c উপস্থিত" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\-র পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"হরফের ছাঁদ পরিবর্তনকারী এস্কেপ অক্ষর (\\l, \\L, \\u, \\U) এখানে ব্যবহার করা সম্ভব " +"নয়" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} সংখ্যা নির্দেশকের মধ্যে উল্লিখিত সংখ্যাগুল ক্রমবিহীন" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} কোয়ান্টিফায়ারের সংখ্যা অত্যাধিক বড়" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "অক্ষরের ক্লাসের শেষে ] চিহ্ন অনুপস্থিত" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে অবৈধ এস্কেপ সিকোয়েন্স" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে উল্লিখিত সীমা ক্রমবহির্ভূত" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "পুনরাবৃত্তির জন্য কিছু উপস্থিত নেই" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named ক্লাসগুলি শুধুমাত্র ক্লাসের মধ্যে সমর্থিত হবে" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "শেষে ) অনুপস্থিত" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "( চিহ্ন বিনা ) চিহ্ন প্রয়োগ করা হয়েছে" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R অথবা (?[+-]সংখ্যা-র পরে ) চিহ্ন ব্যবহার করা আবশ্যক" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "অনুপস্থিত সাব-প্যাটার্ন নির্দেশ করা হয়েছে" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "বক্তব্যের পরে ) চিহ্ন অনুপস্থিত" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "রেগুলার এক্সপ্রেশনটি অত্যাধিক লম্বা" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "মেমরি প্রাপ্ত করতে ব্যর্থ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের দৈর্ঘ্য সুনির্দিষ্ট নয়" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?(-র পরে ত্রুটিপূর্ণ সংখ্যা অথবা নাম উপস্থিত রয়েছে" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "অবস্থাভিত্তিক দলের মধ্যে দুটির বেশি শ্রেণী উপস্থিত রয়েছে" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?(-র পরে অ্যাসারশন প্রত্যাশিত" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "অজানা POSIX ক্লাসের নাম" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX কোলেটিং এলিমেন্ট সমর্থিত নয়" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} অনুক্রমের মধ্যে উপস্থিত অক্ষরের মান অত্যাধিক বড়" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "অবৈধ কন্ডিশন (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের মধ্যে \\C অনুমোদিত নয়" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "রিকার্সিভ কল-টি সীমাহীন সংখ্যায় লুপ করতে পারবে" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "সাব-প্যাটার্ন নামের মধ্যে সমাপ্তি নির্দেশক অনুপস্থিত" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "দুটি named সাব-প্যাটার্নের ক্ষেত্রে একই নাম প্রয়োগ করা হয়েছে" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ত্রুটিপূর্ণ \\P অথবা \\p সিকোয়েন্স" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P অথবা \\p-র পরে অজানা প্রপার্টির নাম" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "সাব-প্যাটার্নের নাম অত্যাধিক লম্বা (সর্বাধিক ৩২-টি অক্ষর)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "নামসহ অত্যাধিক সাব-প্যাটার্ন (সর্বাধিক ১০,০০০)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "অক্টাল মান \\377-র অধিক" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE দলের মধ্যে একাধিক ব্রাঞ্চ উপস্থিত রয়েছে" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "কোনো DEFINE দলের পুনরাবৃত্তি করা যাবে না" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "বিসংগত NEWLINE বিকল্প" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g-র পরে braced নাম অথবা ঐচ্ছিকরূপে শূণ্য ভিন্ন braced সংখ্যা উপস্থিত নেই" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "অপ্রত্যাশিত পুনরাবৃত্তি" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "কোড ওভার-ফ্লো" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "কম্পাইল করার কর্মক্ষেত্র অতিক্রান্ত হয়েছে" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "পূর্বে পরীক্ষিত রেফারেন্স করা সাব-প্যাটার্ন পাওয়া যায়নি" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-র মিল অনুসন্ধানে সমস্যা: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE লাইব্রেরি UTF8 সমর্থন বিনা কম্পাইল করা হয়েছে" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE লাইব্রেরি UTF8 বৈশিষ্ট্যের সমর্থন বিনা কম্পাইল করা হয়েছে" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "রেগুলার এক্সপ্রেশন %s, %d অক্ষরে কম্পাইল করতে সমস্যা: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-র সর্বোত্তম ব্যবহারে সমস্যা: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "হেক্সাডেসিমাল সংখ্যা অথবা '}' প্রত্যাশিত" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "হেক্সাডেসিমাল সংখ্যা প্রত্যাশিত" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে '<' অনুপস্থিত" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "সিম্বলিক রেফারেন্স অসম্পূর্ণ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে অক্ষর সংখ্যা শূণ্য" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "সংখ্যা প্রত্যাশিত" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "অবৈধ সিম্বলিক রেফারেন্স" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "অন্তে অপ্রত্যাশিত '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "অজানা এস্কেপ সিকোয়েন্স" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "প্রতিস্থাপনার টেক্সট \"%s\", %lu অক্ষরে পার্স করতে সমস্যা: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "উদ্ধৃতির অংশ উদ্ধিতি চিহ্ন দ্বারা আরম্ভ করা হয়নি" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "কমান্ড-লাইন অথবা শেল'র উদ্ধৃতির মধ্যে অসংগত উদ্ধৃতি চিহ্ন" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' অক্ষরের পরে টেক্সট সমাপ্ত হয়েছে। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c'র ক্ষেত্রে সুসংগত উদ্ধৃতি চিহ্ন পাওয়া যায়নি। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "টেক্সট ফাঁকা (অথবা শুধুমাত্র শূণ্যস্থানসহ)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "চাইল্ড প্রসেসের সাথে যোগাযোগের উদ্দেশ্যে পাইপ নির্মাণে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "চাইল্ড পাইপ থেকে পড়তে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ডিরেক্টরিতে পরিবর্তন করতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "চাইল্ড প্রসেস কার্যকর করতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "প্রোগ্রামের নাম অবৈধ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d'এ আর্গুমেন্ট ভেক্টর'এ উল্লিখিত পংক্তি বৈধ নয়: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "পরিবেশের মধ্যে উল্লিখিত পংক্তি বৈধ নয়: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "সক্রিয় ডিরেক্টরি বৈধ নয়: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "সহায়ক প্রোগ্রাম চালাতে ব্যর্থ (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় g_io_channel_win32_poll()'এ অপ্রত্যাশিত ত্রুটি" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় select() সংক্রান্ত অপ্রত্যাশিত ত্রুটি (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()'এ অপ্রত্যাশিত ত্রুটি (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork করতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "চাইল্ড প্রসেস \"%s\" চালাতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "চাইল্ড প্রসেসের আউটপুট অথবা ইনপুট রি-ডাইরেক্ট করতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "চাইল্ড প্রসেস fork করতে ব্যর্থ (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "চাইল্ড প্রসেস \"%s\" কার্যকর করতে অজানা সমস্যা" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "চাইল্ড pid পাইপ থেকে পর্যাপ্ত তথ্য পড়তে ব্যর্থ (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "অক্ষরটি UTF-8'র আয়ত্বের বাইরে" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "অক্ষরটি UTF-16'র আয়ত্বের বাইরে" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ব্যবহারপ্রণালী:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "সহায়তা সংক্রান্ত বিকল্প:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "সহায়তা সংক্রান্ত বিকল্প প্রদর্শন করা হবে" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "সহায়তা সংক্রান্ত সমস্ত বিকল্প প্রদর্শন করা হবে" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "অ্যাপ্লিকেশন সংক্রান্ত বিকল্প:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s-র জন্য '%1$s'-র পূর্ণসংখ্যা মান পার্স করতে ব্যর্থ" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s-র জন্য '%1$s'-র পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান পার্স করতে ব্যর্থ" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান সীমা বহির্ভূত" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s বিকল্প পার্স করতে ব্যর্থ" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s'র আর্গুমেন্ট অনুপস্থিত" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "অজানা বিকল্প %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "অনুসন্ধানের dirs-র মধ্যে বৈধ কি-ফাইল পাওয়া যায়নি" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "সাধারণ ফাইল নয়" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ফাইল ফাঁকা" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "কি-ফাইলের মধ্যে '%s' পংক্তিটি রয়েছে, এটি কি-মান জুটি, সংকলন অথবা মন্তব্য নয়" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "দলের নাম অবৈধ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "কি-ফাইলের প্রারম্ভে কোনো সংকলন উল্লিখিত নেই" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "কি-র নাম অবৈধ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "কি-ফাইলের মধ্যে অসমর্থিত এনকোডিং '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "কি-ফাইলের মধ্যে কোনো সংকলন অনুপস্থিত '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "কি-ফাইলের মধ্যে কোনো কি উপস্থিত নেই '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"কি-ফাইলের মধ্যে '%2$s' মান সহ '%1$s' কি উপস্থিত রয়েছে যা UTF-8 বিন্যাসে নেই।" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব " +"নয়।" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত নেই" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "কি-ফাইলের মধ্যে পংক্তির অবশেষে এস্কেপ অক্ষর উপস্থিত রয়েছে" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "কি-ফাইলের মধ্যে অবৈধ এস্কেপ ধারা উপস্থিত রয়েছে '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' মান কোনো সংখ্যারূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' মান float সংখ্যা রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' মান বুলিয়ান রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s-র জন্য উল্লিখিত গণনার মান অত্যাধিক বড়" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "স্ট্রিম বর্তমান বন্ধ হয়েছে" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "কর্ম বাতিল করা হয়েছে" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "অবৈধ সকেট, আরম্ভ করা হয়নি" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "সকেটের ঠিকানার জন্য পর্যাপ্ত স্থান উপলব্ধ নেই" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "বাতিল করার যোগ্য প্রারম্ভিক কর্ম সমর্থিত নয়" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "অজানা প্রকৃতি" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ফাইলের ধরন" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s ধরন" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "স্ট্রিমের সমাপ্তিস্থল অপ্রত্যাশিতভাবে শীঘ্র পাওয়া গিয়েছে" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "নামবিহীন" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ডেস্কটপ ফাইলের মধ্যে Exec ফিল্ড" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "অ্যাপ্লিকেশনের জন্য আবশ্যক টার্মিনাল পাওয়া যায়নি" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "উইজার অ্যাপ্লিকেশনের কনফিগারেশন ফোল্ডার %s নির্মাণ করতে ব্যর্থ: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ইউজার MIME কনফিগারেশন ফোল্ডার %s নির্মাণ করতে ব্যর্থ: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ইউজার ডেস্কটপ ফাইল %s নির্মাণ করতে ব্যর্থ" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s-র জন্য স্বনির্ধারত ব্যাখ্যা" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ড্রাইভ দ্বারা ইজেক্ট কর্ম সঞ্চালিত হয় না" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ড্রাইভ দ্বারা eject অথবা eject_with_operation কার্যকরী করা হয় না" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ড্রাইভ দ্বারা মিডিয়া পোল করার ব্যবস্থা প্রয়োগ করা হয় না" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ড্রাইভ দ্বারা প্রারম্ভের কর্ম সঞ্চালিত হয় না" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ড্রাইভ দ্বারা বন্ধ করার কর্ম সঞ্চালিত হয় না" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem এনকোডিং-র মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-র মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-র জন্য একটি GEmblem প্রত্যাশিত" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "কর্ম সমর্থিত হয় না" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ধারণকারী মাউন্ট উপস্থিত নেই" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ডিরেক্টরির উপরে কপি করা যাবে না" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি কপি করা যায়নি" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "উদ্দিষ্ট ফাইল উপস্থিত রয়েছে" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "রিকার্সিভ ভাবে ডিরেক্টরি কপি করা যাবে না" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "সিম্বোলিক লিঙ্ক সমর্থিত হয় না" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "বিশেষ ফাইল কপি করা যাবে না" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "অবৈধ সিম-লিঙ্ক মান উপলব্ধ করা হয়েছে" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "আবর্জনা সমর্থিত হয় না" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ফাইলের নামের মধ্যে '%c' ব্যবহার করা যাবে না" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ভলিউম দ্বারা mount প্রয়োগ করা হয় না" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "চিহ্নিত ফাইল ব্যবস্থাপনার উদ্দেশ্যে কোনো অ্যাপ্লিকেশন নিবন্ধিত হয়নি" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator বন্ধ" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ফাইল enumerator-র মধ্যে অসমাপ্ত কর্ম উপস্থিত" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ফাইল enumerator-র বন্ধ" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon-র জন্য ক্ষতিগ্রস্ত ইনপুট তথ্য উপস্থিত" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "স্ট্রিম দ্বারা query_info সমর্থিত হয় না" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "স্ট্রিম দ্বারা Seek সমর্থিত হয় না" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ইনপুট স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের অনুমতি নেই" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের সমর্থন নেই" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "টোকেনের সংখ্যা সঠিক নয় (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "%s ক্লাসের নামের জন্য কোনো ধরন নির্ধারিত হয়নি" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেস বাস্তবায়িত হয় না" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "সংস্করণ সংখ্যা সটিকরূপে গঠিত হয়নি: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেসের মধ্যে from_tokens() বাস্তবায়িত হয় না" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "উপলব্ধ আইকন এনকোডিং-র সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ইনপুট স্ট্রিম দ্বারা read বাস্তবায়িত হয় না" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "স্ট্রিমের ক্ষেত্রে অসমাপ্ত কর্ম উপস্থিত রয়েছে" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "সকেটের ঠিকানার জন্য পর্যাপ্ত স্থান উপলব্ধ নেই" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "সকেটের ঠিকানা সমর্থিত নয়" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ফাইলের নাম অবৈধ: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ফাইল-সিস্টেম সংক্রান্ত তথ্য প্রাপ্ত করতে সমস্যা: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "root ডিরেক্টরির নাম পরিবর্তন করা সম্ভব নয়" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ফাইলের নাম পরিবর্তনে সমস্যা: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" +"ফাইলের নাম পরিবর্তন করা যায়নি, নতুন নামের একটি ফাইলের নাম বর্তমানে উপস্থিত রয়েছে" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ফাইলের নাম বৈধ নয়" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ডিরেক্টরি খুলতে সমস্যা" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ফাইল মুছে ফেলতে সমস্যা: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ফাইলটি আবর্জনায় স্থানান্তর করতে সমস্যা: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "আবর্জনার ডিরেক্টরি %s নির্মাণ করতে সমস্যা: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "আবর্জনার ঊর্ধ্বতন ডিরেক্টরি সনাক্ত করতে ব্যর্থ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "আবর্জনার ডিরেক্টরি সনাক্ত অথবা নির্মাণ করতে ব্যর্থ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "trashing info ফাইল নির্মাণ করতে ব্যর্থ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ফাইল বর্জন করতে ব্যর্থ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ডিরেক্টরি নির্মাণ করতে ব্যর্থ: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "সিম্‌বলিক লিঙ্ক নির্মাণ করতে ব্যর্থ: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ফাইল স্থানান্তর করতে সমস্যা: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি স্থানান্তর করা যাবে না" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "ব্যাক-আপ ফাইল নির্মাণ করতে ব্যর্থ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "উদ্দিষ্ট ফাইল মুছে ফেলতে সমস্যা: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "মাউন্ট করা অবস্থানের মধ্যে স্থানান্তর করা সম্ভব নয়" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "অ্যাট্রিবিউটের ক্ষেত্রে NULL-ব্যতীত অন্য মান নির্ধারণ করা আবশ্যক" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (string প্রত্যাশিত)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "প্রসারিত অ্যাট্রিবিউটের নাম অবৈধ" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "প্রসারিত অ্যাট্রিবিউট '%s'-কে নির্ধারণ করতে ব্যর্থ: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "ফাইল '%s' stat করতে ব্যর্থ: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (অবৈধ এনকোডিং)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ফাইলের বিবরণ stat করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (byte string প্রত্যাশিত)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "সিমলিংকের অনুমতি নির্ধারণ করতে ব্যর্থ" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "অনুমতি নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "মালিকানা নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "সিম্‌-লিঙ্ক NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে ত্রুটি: ফাইলটি সিম্‌-লিঙ্ক নয়" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "পরিবর্তন অথবা ব্যবহারের সময় নির্ধারণ করতে সমস্যা: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux কনটেক্সটের NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux কনটেক্সট নির্ধারণ করতে ব্যর্থ: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "এই সিস্টেমে SELinux সক্রিয় করা হয়নি" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s অ্যাট্রিবিউটের মান নির্ধারণ সমর্থিত নয়" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ফাইল থেকে পড়তে সমস্যা: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ফাইলের মধ্যে seek করতে সমস্যা: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "পুরোনো ব্যাক-আপের লিংক মুছে ফেলতে ত্রুটি: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ব্যাক-আপ প্রতিলিপি নির্মাণ করতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "অস্থায়ী ফাইলের নাম পরিবর্তন করতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ফাইল ট্রানকেট (ছাঁটাই) করতে সমস্যা %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "উদ্দিষ্ট ফাইলটি একটি ডিরেক্টরি" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "উদ্দিষ্ট ফাইলটি সাধারণ ফাইল নয়" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ফাইলটি স্বতন্ত্ররূপে পরিবর্তন করা হয়েছে" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "পুরোনো ফাইল মুছে ফেলতে সমস্যা: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "অবৈধ GSeekType উল্লিখিত হয়েছে" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "অবৈধ seek-র অনুরোধ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ট্রানকেট করতে ব্যর্থ" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তনযোগ্য নয়" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তন করতে ব্যর্থ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount করা বস্তুর ক্ষেত্রে unmount প্রয়োগ করা সম্ভব হয়নি" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount করা বস্তুর ক্ষেত্রে eject প্রয়োগ করা সম্ভব হয়নি" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"mount করা বস্তুর ক্ষেত্রে unmount অথবা unmount_with_operation প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"mount করা বস্তুর ক্ষেত্রে eject অথবা eject_with_operation প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount করা বস্তুর ক্ষেত্রে remount প্রয়োগ করা সম্ভব হয়নি" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount দ্বারা সামগ্রীর ধরন অনুমান করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount দ্বারা সুসংগতভাবে সামগ্রীর ধরন অনুমান করা সম্ভব নয়" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' হোস্ট-নেমের মধ্যে '[' উপস্থিত রয়েছে কিন্তু ']' অনুপস্থিত" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "আউটপুট স্ট্রিম দ্বারা write বাস্তবায়িত হয় না" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "মূল স্ট্রিম বর্তমানে বন্ধ করা হয়েছে" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' মীমাংসা করতে ব্যর্থ: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "বিপরীত দিশায় '%s' মীমাংসা করতে ব্যর্থ: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'-র পরিসেবার কোনো রেকর্ড অনুপস্থিত" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "সাময়িকভাবে '%s' মীমাংসা করতে ব্যর্থ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' মীমাংসা করতে ত্রুটি" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "অবৈধ সকেট, আরম্ভ করা হয়নি" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "অবৈধ সকেট, চিহ্নিত কারণে আরম্ভ করতে ব্যর্থ: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "সকেট বর্তমানে বন্ধ করা হয়েছে" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd থেকে GSocket নির্মাণ করা হচ্ছে: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "সকেট নির্মাণ করতে ব্যর্থ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "অজানা প্রোটোকল নির্ধারণ করা হয়" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "স্থানীয় ঠিকানা প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "দূরবর্তী ঠিকানা প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "অপেক্ষা করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "ঠিকানার সাথে বাইন্ড করতে ত্রুটি: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "সংযোগ গ্রহণ করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "সংযোগ স্থাপন করতে ব্যর্থ: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "সংযোগ স্থাপন করতে ত্রুটি: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "অপেক্ষারত ত্রুটি প্রাপ্ত করতে ব্যর্থ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "তথ্য প্রাপ্ত করতে ত্রুটি: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "তথ্য পাঠাতে ত্রুটি: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "সকেট বন্ধ করতে ত্রুটি: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "সকেটের অবস্থা প্রাপ্ত করতে অপেক্ষা করা হচ্ছে: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "বার্তা পাঠাতে ত্রুটি: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "উইন্ডোর GSocketControlMessage মধ্যে সমর্থিত নয়" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "বার্তা প্রাপ্ত করতে ত্রুটি: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "সংযোগ স্থাপনকালে অজানা সমস্যা" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "লিসেনার বর্তমানে বন্ধ করা আছে" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "যোগ করা সকেট বর্তমান বন্ধ করা আছে" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "১-টি কনট্রোল বার্তা প্রত্যাশিত, %d-টি প্রাপ্ত হয়েছে" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "অপ্রত্যাশিত প্রকৃতির অনুষঅঙ্গিক তথ্য" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "একটি fd প্রত্যাশিত, কিন্তু %d প্রাপ্ত হয়েছে\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "অবৈধ fd প্রাপ্ত হয়েছে" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix থেকে পড়তে সমস্যা: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix বন্ধ করতে সমস্যা: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ফাইল-সিস্টেমের root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix-এ লিখতে সমস্যা: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "এই সিস্টেমের মধ্যে অ্যাবস্ট্র্যাক্ট unix ডোমেইন সকেট ঠিকানা সমর্থিত নয়" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ভলিউম দ্বারা eject প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ভলিউম দ্বারা eject অথবা eject_with_operation প্রয়োগ করা সম্ভব নয়" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "অ্যাপ্লিকেশন পাওয়া যায়নি" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "অ্যাপ্লিকেশন আরম্ভ করতে সমস্যা: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI সমর্থিত নয়" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "সংসর্গ সম্বন্ধীয় পরিবর্তনগুলি win32-র মধ্যে সমর্থিত নয়" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "সংসর্গ নির্ধারণ win32-র মধ্যে সমর্থিত নয়" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "অভ্যন্তরীণ সমস্যা" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "হোস্ট-নেম বৈধ নয়" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ডাটা অ্যারের সর্বাধিক সীমা উপস্থিত হয়েছে" + +#~ msgid "do not hide entries" +#~ msgstr "এন্ট্রি আড়াল করা হবে না" + +#~ msgid "use a long listing format" +#~ msgstr "লং লিস্টিং বিন্যাস ব্যবহার করা হবে" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/bs.gmo b/po/bs.gmo new file mode 100644 index 0000000000000000000000000000000000000000..10bf6ce9b088a8cbe8e61648849d5b0a63b68ef7 GIT binary patch literal 10596 zcmd6sTZ|-EdB+RlfISHqjDZ9PI2dMo)@;wt?8U5S*6a1o?%K=xvbJY&Fj2;*yUz4f zcXd^}F1? z03QM02ZrFsz?Z>?z*j+$?~lMX_!IC5_|f+S!6(7X;7Kq8KMsBql=*)S3jH_1GvEi_ z>zQ+&%oSq@D)(_`4+eU{ty(o{}dEC zKZ+29&sRW^{~v)L1pg5fIsCi-{^9pKey)N~^S%UEz+2$`;9VbZ>mCE;{qx|9ZwrF2 zfzR>$Gl+f;y!Ig*tfiHp&fnNn>Uw;M8gZCmtvAY#e_TL9D zfnNi~zWxP71;K|fs#)+PDEj{_DC52eeiQs_FatLkvn6tv!Mwmsdd9$M5k+*84sPE5W~kYv4T?x7bStvQ+Q`P~`ol$2pwjZ9G5D zEf;QXjF1J?e#AHUh%(Cht>a`pzwj)*y}F-3ZM6I-(lal{m4(@@9qAb=;BfC zv)m#-!hz-Q7eK`=G7){sC2|p2iQULv#{aGCxGOgu(!~u$S17T#s>IK3!Tm^9_dx@>fg*x2Tn$24(%2kpUN~^Jsqfm7>bf&w7$<%rp$LWnI>G7>~ zwl(>(tfE2<^`@QIF})~JI#DJzLz5IL(L)m)mU6LSCUkR_Io?`UcJj}Wew^lJiaoo+ zvXaHM?9nv0jXYZCTEU7=T7?QzHlOJmDl85|A*jPo zD$+HRgfd=a-%XRT$qKa&Hyzy_I0+OfA3~Fx!afHpZdHYDhEbvmlM6#yjdWH-I-bZ; zMtU8lWuek_c98T83eD8@)ywV02M-!?rZFHh>n1Zv*QgNl5O(2Q-H3_}*3Qi^>ZWm; zEURIf7b=bhCf-z=X{pK_v0@i`I5JtTnKLmhnJuhENdYl2F*chQY{XhpQbfh3YAcg> z^#~o+6m+hR@U$GPSc&CPnyB?G9X3c;;u4BYE6mH$D9s9k(9<$@8xiGq5u}=pOV!yF zi89NodOeDbx_>smzcD-=nWWN{_=hZPm+(sk7t?NOeSl4|`7$vtj|{#PA`-nWJ|!k+ zUMh8*t32w#{KUtQRDl(BO85~UT1M85S9oV>_FW-L@+d@FusF0_pzcwYc1@m(g!x=# zWw$_Pha$6+pF>WX3IqEIq++*@9Bq-WwFTXqKg?=2cv$BybkACMwYX?yUkd#aV|6OQ zM6F_R5mes6aR%aXXZI&?V?zvNvWJQ84px-)9nUIuP(*R;SZF(Qx`CO?-eL`t)s}=u zjCUW29#fUMS#L7d6s&lrw^n%^D~R0A&gRF@P3R6qGA^h)AFuVJ=FEI=UY+fv>EPVa z$qZrF3`ck@21h6>G!ZdWX@b=wCcJ8-yC%5g^MmymnbQ^C!ea`Hx7+QO8F8jymeohK zaf!#G&OPVjCXKPvRDw&EF~~|pX&qT^5wZ-?$|XDdKEmyFW|mxNQAb`X(_&d2iRDjE z{^(JfF9(+#jsHhM@KTl`@vxNCO~7>v^P{@V!Xcj1}raSIMv;wFc4shV9(B9cz-b>}{yqC{qVmt?iJ7 zo#WH7*Dr!mcFRA;HWz`%{z>BPnz;0%<(Dlc?EIh_xj{)|%h~G1zO$Y%>qSZ(N8a}Z9qwXf#~OB5opPO8 zDtJ0<)x#&ZAqa^m3gQr(b&`?% zxt^9NQ6lGTcV5k{N_ID8&;oBPa((q!S;RScVd%bq&4XsBglkhg%`(y`$YTH%(F(0TkR+F zUKF-3l)b#Ynl7oCYfrDXSJ<|APWvK0v7}BcEH1PcPPR`xs1_HOPMv8loLX35VEb7! zj)ZhQZsAmW;dFcPQ)*#x>EyyE7r17gph#}7a=^{;urymzS4~3Dd0dCL-iY)#jJ7|o z&JN_=#`*Ou%FAqhK1t6pFX@%KXWFYq50})1G*2StosH9hj?c$suM=&|r&;gZ%#&B1 zyfoS6;{3wQ3PmoZV|#UT1pnf6$MNrovQlCnC(wuGn0;n4PS_*zw=at@W)kG3wx^d^$NuGzBgxJ-~8mA76;tbTv& zUD_~D$*y{(+P)b{xaHKGrQ=kU(>^JFG}VZC3)6fnrkXLzOfgQgh_$Q^N-N`Z3}5-6 z9NCw_RZUVv(BtgZ>l#soeG^B+X!~Xo4c+)*@PcS5+8Se2na)R~Q6?zgf7$!vnc!L9 zaACaFF3l_CKUu8M+cyWgy~UYjD;;u_=^JFC3(i3ZZ2<39j&`;>Le|=n#LJ+{G$O=r zH6SM%L)F-Z&raX;5*{Z6Am$i2qRJ7D$WHoZ=o>KCL`+tboPxKkXdJ)RawN@_PJT%Q zolzQQx8Bf68ax%{dMGN@oF4E65gekn4H(_0ezH=s+GaJ0tK{K06b@*DY9I;~c0P7N+vCrr*mnsa$$8`^@q(o+u{bWM&&``)_zl z_0wCg%Rb$5ew#)bkjSC8Mm_i}9o3u@j||Dz-3rF*4rd+Irs@m&5toSFDE;rmv^l zDhw7zMGkbvBUM-zbAhGWds8NR&OSDonwX(AA|V=Wc#(2erG_A6_Q_~0<{7sA80o&z zsF5Cx&wTzh5x6|4OJf5on-gy@DWQFYvr(uSIRB5r=3|+;^*R~5K<~pwY*auQFR24|;flrw-AN64eLm`C5Sj>Q+ zJt6Aix2-Pgv6up?8e{xZ(fM|w49shbmk2i|ucMaKws>ru6T`Hb!EAp8(-3h;vs#Q> z`bf<+Nuw^)%Bqq~?3A?Ur)XQ)-agIdh(glVu9K#hK@5`?P;>DH6&XOq%|>b_B>xE8 zyR4p>aw{6zE+*RCrj;nh|`>j%ETsDStVxnaAdXp1L zPpRdwlWvzyJu{@5i~C|$yRD1fp2!ztbgsjC)DlU}Z zCsKTIpv|ZV%Y>*f`9SdxMJQ3BP{Lxcjp^4iBUKCmJ~8&ajm=gC-H1sY&0)pPsze-Y zf3Xbl5UC1mTxcXW|B|kiluk5oT(RWBhtC#1=O0Xkc9mo;=~wN{k1h#P5BNkmMcU3X zV*)<^Ttka>#U^K>P)}FJjYE~)P$^PO%4*WSn@#jM4XZ< z%)j;{|G#D@cQY9(a;-*1!Ih@BNnfh%bFb{I9_OapP6BeA3OAy#T*{tFRVG5EMRko6 zf}F}kHmHdazA+`Gn)`;j>XK5cp06c#oQ0?QQ?6w2UTm}00l|G&`gOnRt&yvO+^#ft z^sk8G356AlZG>6bqq69V)8Ou$ KSf!_>gZ}}(c_j4! literal 0 HcmV?d00001 diff --git a/po/bs.po b/po/bs.po new file mode 100644 index 0000000..64804fa --- /dev/null +++ b/po/bs.po @@ -0,0 +1,2124 @@ +# translation of glib to Bosnian +# This file is distributed under the same license as the glib package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2004. +# Kenan Hadžiavdić , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.glib-2-4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2004-05-17 01:30+0000\n" +"Last-Translator: Kenan Hadžiavdić \n" +"Language-Team: Bosnian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Čudan znak '%s', očekivan znak '=' nakon osobine '%s' elementa '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "NeuspjeÅ¡no čitanje simboličkog linka '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pretvaranje iz skupa znakova '%s' u '%s' nije podržano" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nisam mogao pokrenuti pretvaranje iz '%s' u '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Djelimičan niz znakova na kraju ulaznih podataka" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne mogu pretvoriti '%s' u znakovni skup '%s'" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' nije apsolutni URI koristeći Å¡emu datoteka" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI lokalne datoteke '%s' ne smije sadržavati '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' je nevažeći" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime računara URI-ja '%s' je nevažeće" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' sadrži nevažeće escape znakove" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Putanja '%s' nije absolutna putanja" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nevažeće ime računara" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nisam mogao dodijeliti %lu bajtova za čitanje datoteke \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "NeuspjeÅ¡no čitanje datoteke '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "NeuspjeÅ¡no preuzimanje osobina datoteke '%s': fstat() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Nevažeći Å¡ablon '%s', ne bi trebao sadržavati '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablon '%s' ne zavrÅ¡ava sa XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "NeuspjeÅ¡no čitanje simboličkog linka '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nisam mogao pokrenuti pretvaranje iz `%s' u `%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ne mogu čitati sirovo u g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Preostali nepretvoreni podaci u baferu za čitanje" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal zavrÅ¡ava djelimičnim znakom" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ne mogu čitati sirovo u g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "GreÅ¡ka u %d. redu, znak %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neispravno UTF-8 kodirani tekst" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"NeuspjeÅ¡no tumačenje '%s', Å¡to je trebalo biti cifra unutar reference znaka " +"(na primjer: ê) - možda je broj prevelik" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Referenca znaka se ne zavrÅ¡ava tačka-zarezom; vjerovatno je koriÅ¡ten znak & " +"bez namjere započinjanja entiteta - izbjegnite koriÅ¡tenje znaka & " +"upisivanjem &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Referenca znaka '%s' ne kodira dopuÅ¡teni znak" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Primijećen prazan entitet '&;'; važeći entiteti su: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nepoznato ime entiteta '%s'" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Znak na kraju entiteta nije tačka-zarez; vjerovatno je koriÅ¡ten znak & bez " +"namjere započinjanja entiteta - izbjegnite koriÅ¡tenje znaka & upisivanjem " +"&" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument mora početi elementom (npr. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' je nevažeći prateći znak nakon znaka '<'; ne može započeti naziv " +"elementa" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Čudan znak '%s', očekivan znak '>' radi okončanja početne oznake elementa '%" +"s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "Čudan znak '%s', očekivan znak '=' nakon osobine '%s' elementa '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Čudan znak '%s', očekivan znak '>' ili '/' radi okončanja početne oznake " +"elementa '%s' ili eventualno osobine; možda je koriÅ¡ten nevažeći znak u " +"imenu osobine" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Čudan znak '%s', očekivan navodni znak nakon znaka jednakosti pri davanju " +"vrijednosti osobini '%s' elementa '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' je nevažeći prateći znak nakon zatvaranja elementa '%s'; dopuÅ¡teni znak " +"je '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' je zatvoren, trenutno nema otvorenih elemenata" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' je zatvoren ali trenutno je otvoren element '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je bio prazan ili je sadržavao samo prazna polja" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Neočekivan kraj dokumenta nakon otvorene zagrade '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Neočekivan kraj dokumenta uz joÅ¡ otvorene elemente - element '%s' je otvoren " +"posljednji" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Neočekivan kraj dokumenta, očekivano zatvaranje zagrade radi okončanja " +"oznake <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Neočekivan kraj dokumenta unutar imena elementa" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Neočekivan kraj dokumenta unutar imena osobine" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Neočekivan kraj dokumenta unutar oznake za otvaranje elementa" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Neočekivan kraj dokumenta nakon pratećeg znaka jednakosti iza naziva " +"osobine; nedostaje vrijednost osobine" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Neočekivan kraj dokumenta unutar vrijednosti atributa" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Neočekivan kraj dokumenta unutar oznake za zatvaranje elementa '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Neočekivan kraj dokumenta unutar komentara ili instrukcije procesiranja" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanal zavrÅ¡ava djelimičnim znakom" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "NedovrÅ¡ena referenca znaka" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "NedovrÅ¡ena referenca znaka" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "NedovrÅ¡ena referenca znaka" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "GreÅ¡ka u %d. redu, znak %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "NedovrÅ¡ena referenca entiteta" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citat ne počinje navodnim znakom" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Neuparen navodni znak u naredbi ili drugom citatu iz shella" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst se zavrÅ¡io nakon znaka '\\'. (Tekst je bio '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Tekst se zavrÅ¡io bez uparenog navodnog znaka %c. (Teskt je bio '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst je bio prazan (ili je sadržavao samo prazna polja)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "NeuspjeÅ¡no čitanje podataka iz podređenog procesa" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"NeuspjeÅ¡no stvaranje cijevi za komuniciranje sa podređenim procesom (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "NeuspjeÅ¡no čitanje iz podređene cijevi (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "NeuspjeÅ¡an prelazak u direktorij '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "NeuspjeÅ¡no pokretanje podređenog procesa (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Nevažeće ime računara" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Nevažeći niz u unosu za pretvaranje" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "NeuspjeÅ¡no pokretanje pomoćnog programa" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Neočekivana greÅ¡ka u g_io_channel_win32_poll() tokom čitanja podataka iz " +"podređenog procesa" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "NeuspjeÅ¡no čitanje podataka iz podređenog procesa (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Neočekivana greÅ¡ka u select() tokom čitanja podataka iz podređenog procesa (%" +"s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekivana greÅ¡ka u waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "NeuspjeÅ¡an fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "NeuspjeÅ¡no izvrÅ¡avanje podređenog procesa \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "NeuspjeÅ¡no preusmjeravanje ulaza ili izlaza podređenog procesa (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "NeuspjeÅ¡no pokretanje fork() za podređeni proces (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nepoznata greÅ¡ka tokom izvrÅ¡enja podređenog procesa \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "NeuspjeÅ¡no čitanje dovoljno podataka iz podređene pid cijevi (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak izvan raspona za UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Nevažeći niz u unosu za pretvaranje" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak izvan raspona za UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Nevažeće ime računara" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Nevažeće ime računara" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' sadrži nevažeće escape znakove" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Simbolički linkovi nisu podržani" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Nevažeće ime računara" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Nevažeće ime računara" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "NeuspjeÅ¡no čitanje simboličkog linka '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Neočekivan kraj dokumenta unutar imena osobine" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Nevažeće ime računara" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Nisam mogao dodijeliti %lu bajtova za čitanje datoteke \"%s\"" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Nevažeće ime računara" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Nevažeći niz u unosu za pretvaranje" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Znak '%s' je nevažeći na početku imena entiteta; znak & započinje " +#~ "entitet; ako znak & ovdje ne označava početak entiteta, koristite &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Znak '%s' je nevažeći u imenu entiteta" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Prazna referenca znaka; trebala bi sadržavati broj kao npr. dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "NedovrÅ¡ena referenca entiteta" + +#~ msgid "Unfinished character reference" +#~ msgstr "NedovrÅ¡ena referenca znaka" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Neispravno UTF-8 kodirani tekst" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Neispravno UTF-8 kodirani tekst" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Ime računara URI-ja '%s' je nevažeće" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Ime računara URI-ja '%s' je nevažeće" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Pretvaranje iz skupa znakova `%s' u `%s' nije podržano" diff --git a/po/ca.gmo b/po/ca.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b16dbd0da137fd2440bb2f97e59f22b9844bedb1 GIT binary patch literal 47620 zcmd6wd7PY8mG>WaMG<5PDBHslx&!GZ3qnXB5JCch1Of@55(w2@)!jv^tBP8(fViQk zD1v|sj$+)!$ha_$3OX~U$I(}3RNP+21xFm6ab|S%bs3%4d40dXbMCWLbyar<=a1A>{!ujacSO9+oJ{!E^geW=&tb+@{J3y8H zAb2A9CGcGE*Wf&G+59NF9J~ZP1bh#8GWZ}k2>uw1!2?Kq1h@#KsAxT?^6KDW;H}^i z@SWfp;5Wcy!2<@O=u~hqcnUZMs@yk%OTqg=mG=X1F}Od44uNNbia!aeytjd>-)F!W z{3fXO{RgOe9m@khqqD$;;222Nqq{(=5`7Yc#L+(le8Ned{zOpq+z7^C16&2(1>OsO z15|xmR8n+(4Y&f_0}g}#1QI2hN1=LN1s)F8LA`%9sPg{|EP&qu*Meu!NYUlxpy>8V za5?yIpvoU0vva^QsPaAlUJ3p<;7W)idc6@8oj%Y1)ZX8MXM;yCilXO&*MRH5yTR9k zkAN{)C$Z@HdhlrQy`cE_v!L4hD5!S)E<7JZB@g0x0jP9mf=YKOsC0Eu{csz2EO;L% zdVLX8ynh7`1^1)VH8f&S`K$nAa3iSn*MlnmHc))^?(qIo0lyXSSD@;5AVgHU1)$=u z0oBh}hxac5RsLJU_lH2$?`z;8;IBdDvmeBY!Q(;k^?9J`aZPw`gGzTh2n$6Y0qLsf zJD|#a+G$aA6nHGC^k;)~b@Y5t-){j`&wD}T^I&-YT~P6V1*-p_dAjq_I*_i4c7hsD z_koJ{!+`$U6@;m~H|9=|ZA9ALT z`*T3mw*@NyH-oCrgCJFn{t;ApN1f&Mx)M}7ZUR-#2gCEX!FfDC4Pq#L3@X11!TrGs zcrh3Ms(#-94+H-I9s?e>%H{g$py+)8sP=3L@0+0b^yQ%9-vb^FelooO zDyaVZCs6$I41~MlodqJAqN~AU!B>MvfP28Bz|VmU?dV6K=y2HTDB29J1up>q1eBcm zM-UQ6C!a^(gJn?p{yC_89|cw36W4hAPXJHg`7%)Qcn2st?FNqn9|A?MM?m%OK@@T% zxE|E^GAR1I7F7Q42Gw7G1FF8?1Q8|CQ_n{Rfh)kH!JXiV;G00@`xl_f{Vn)x@L(Dx z`VWEXzbnCKf!Be@gD(Wtj@_Wz`B&h@;Qs5P=)>R^@CH3!==FP5z}?_{-hToV-#!A0 z4-UJ?`E3n|h=}Up`Mn?_I(isXe?N}G)UHFplfm=B7;J*d_ij-1c@PwR{x^6i_@AKa zf8Yk^hvPuie+4Lhxe65h>R=4s35stX0F~e0f}+DuK+);S;s`qW6_<1*|dVdO3IgfziuP0yT>6U|oJeR>m;GLl8JOzqg z{|<^S2W;~G8U)2pn?R}_H9&?yv=>x;pUfapx&@&4Z5^oc>)=V?ouKmjH25s=o1pUh zXYd)|Q!e-X4gsIS^YcK_|61_L;EkZ_`7&@Ad;nYuJ_?H7^R96EoCm7?CGhFsOTmM| z+d$Rp9pEA0=RsI4`W~o$UvQ<@b1lfwjjjh({-1;Dw}(NMzyI@GF0KR@^SmBB5PT7+ z_TLW1;D)$gV7{&rCD?+2Cs3!v)peNgoL&+vTY z3q0QGpz_@esvkx{@yjjXVc;H6^q&IN-#-IIpTn;5_)9_Mdj+WYJHbQ2J3!Uzy`aY1 zS3tGzH{coIye*z?W55O|d3ZOd{`e}Wc+u6~-^)RzUk@t33K)ZTg8PFHfJcCz0hfT^ z0~PPUYrI~kf$G1DLA9?99tpk$6n}plJOKPYD8Bf2@Nn?>tzNG)LGkwupy=>kP<;4h z@F?&HpyK}lRDBM=*2_H+RCz1GW57``25%1d?tq^KkB%6h;A!BK3jTa1xRB?o!t<-Z z>f@s5ec*F=KX26eeR04u0{ul*~I=YZnVCO81z51t5q13Vf0 zJ$Mp0IO+A+1b&R?w}2X-8zGXum%#JEJ3y89El~8DSM&VWgBqW=fXeqia5?x5@Fn1Z zbQUZTy&hCQ{4(I_*CPvgz7d2qqpyRTz*8I8^x&&NNEdwxq-oLVO>h6ZK=I-CLD6Mi z%j2IP@HX&j-hT~zC%Cxn?f*LXY@UA)E>*hi-i`~wVV++S@I#>TeFPi?57^;!SO%(H zqoBUu3!Vag8N3Mm1E_p2+Ufbe7*s!g3_KP5A-DiMe3$dpxuD+P04m;xK;`#6Q1spZ z2G4IbsPcAziuZm{@xB?}Kl#Qe+Q9SapwhhpJOg|PJRSTscn&!9LNC7xDxWul%fY_^ z7lV(x$?32ZRCy!dS>RpZO7LOuLh!&BdA+X!)!sWm<@49z)!-jMrN8>c@DTVqa5MOQ z@J#U3mw5fJ2QTLN9iaH)=ioWusV{YZM;lZ=Uj|j*=w=sb{_a1N^_$5%|SpQ1$%7+eKD=??Gr^Fi_bb}$A% z44wu)3@!kl`g*7H5^ycgJHTtezW_IZN8RaoJ-C7A&w~1X@Lk@H2B`W!5b(R8`0hz} zdw-q>Uchq=RC%8OMb}3`@y&5>@ceEBPv!aB;9~HAH@d!D1**MUK=I+Np!)qj@IvsH zpz>MyChylbf#SQbfE&SiZ}xF94#qs+4Xy`21|AMR{vP6hM}WiN67U4D05-r|0{#yC z2c9c$VNM8c;D73$pMc_{r@z(fIS8tLSAZJ-yTN7Pcf$Ka7!0TLd=04ndn33I{1kX5 z_!Ch5cjCSNeF8j*=huOv-zUTK55bt{XTII(bP9MF&liG6f+OHT;EO@E=T1=d{Wz$2 ze-Em?zX;#s-OgWYz>|4j29@p&pz8A=cnbJ?@CtC@JDgu`2Gwt00GEP)0G|UceW%Nh zi$S&P^`O3g2|OEo{JXsTb3yg@_24n!yFk%n3Oo+{Ie0F3@Vh^*!Js@XO$H!RUSd{xt9!9(Sn^|=9D3w{_>JO2X|ord=~A6x}Ko#z*Vhk~yH2f=&6dEn>3tHDP=r91P3 z-fv~_QpE!ofIkoKpL4(KpG!dHcNZx7+y@>2ej8N$e*sSd5BXE?_p?Fu?+d^~z_)qu@O&w#_}73dz?;JJ zCqePcx4@IZBR=Be@_bOw?SSt9Men}@p9%glynp;hozI5B#k{{7ycoP4JPUjT6#b8U z!1eAXQ2c!#xCZ<&D0(maGq3k*Q0=IID(@ap-~SR+x^IG_%fTP>axVkLCocuXulIqX z@1vm7@BioieJOY-&sTw~!0SQr-vi)A@SC9OKk#wyr{{z7c)l4_es2La-aZQ+2>vL% z{|%`AJN6S^p8|La&vyj;EARxKe-5g=LqF+sSqAEPJ1F|!1F9Y01s?~F5R$)#!w=Qx zL_Xe4xHP;wjo(X?hyiIz^iKqac62Y_-x=QD%I|~u{Se^{g34RZyO)FiK`0WI@eGUF z-&Oqn8oyS7kAN=%Ur6}2e>VQm&wnO7JG?uW@A^9lRDT@={%>#?+yxfEn4rJ)4$-T5 zz9+of7Eqr~BtYJ%MPL|2m+@-l z?GnO~JZmf_f4A`b7d$XTq67K;3c|&NztS_|GlUg9OCF4X`a2!`s{f3h!tebFxA43i z{0=w@{t)~JLh|=a-hF|GYY5l#`z7H+jo%0G`&uyhD})~}3iw8lp%h(1oWBRxfiDG* zCLF@=UxAkqzD3aAYaF5{^X>Hn{hdHKnBR91Bs;|PcG z{6fOo@LuqK!v7+S@%<+7PQpcm0iNGZ_!oXp5%l+Chv-V)Kat;c@CNV>P=AMkKLMA7 z=d-{w2|Ebi;QbE>=kvP+-b=WG@Hn1_2*2aE{^XB2mhdWm9}ON((BBE*0{@cp&mSHkzZz{`2w8or$oP@mg`_vr_J+j+m1a6tI}3f?UvoX2w`yi>f5gq4Kf z5{3xlgeMX7cL?EZ;vN;^Z{T@x`2AXb?RPe_#EMtglh@<+v*VA7}AGFgTdUx z?cw(`y5fDF_eT*Xy53*NyWbE_;r*MyNy7ID`ujf)rswVpzpLPX5`IBg9rC(5;754( zD51skp@a|eTYm=;o)_ZS3;y?9!jr?poqStJcn#s@gy-}A2*Rhrcfo$)_fz>^Bz%$Q z`QhCWJZ}oW_khnLJf6@D@BSvBV3N4C@cb%%Karrn9}x~Ee3oz=;d=!A4HHf$yfwso zDfnuh&nG;E@Fbp}1AdY)MtBa-e*(Ula0S0#M|hCm&m-JOxQ?K|cMv{JxRmcNAZ+7z zh4B9fH}Sj>+)TKE-@ga-_eOpnPe}e=&yW8b9_|3&z_(Mu4dCJ6$>5s_iwJMy`OgS< z6JE^oWd!|w*CF~4cpLAI3D4gIPa>=)Z07ynffp0>x7+^j{?aXcdw}O73D4#CMndxU z_VD96-u*Sdj{$E6&(iyNuw30A`4KJW{J|n=CZ85xEgxe%U&! zEfsB)3dLPLuXfnI3VMz@vd%3`rmYBo#WvCVe9UTd@{ zvsR_aG_Sd<*(yy&tBOTlhBUk$6`hLFs>xcLZmf;PlcmX8V^`cLUEeM@h}x>f^+s)! ztc`R#8s%0=Q3)O*EJX)*oii@;)v?T)6w$r-wF(0S@mu9_0%PLk% zl0q#k#qB1!ZCJNq4aHQ)%H!>Zx0~Tsa^YmDng zVF&$ND8_Kl_||f5D}%gREmgMa<F5E*8iI3#f#jnR$$+9NH4#1J{oPX zO0YQ}Doc-5uC_{&B7LJN^LnWZ56 z)}|J`JQ=Na#*Wc!ljSOrn&SC_N>`&Z1)!Kg1Da$WV~|wGCAyKuo7WC4K5e!b%W@GK zrLj^2H7>C=G<*{Jwpa^-*_1nS(p%M%gicj#&m4+a1ZpP3%M=Gmo25y{N~Km^5l_}o zF_rQ*vC6JmTXKe>M-wNZT9W~n<({e?5xpt{L$bZuf)u97tF3ZtS3DG#nxlm}HB56T zG~*L_S`n?TAtgplUPDE+!nib!Ubj$0%Fwk))>x@6eNV>kSfe(Xt5L!_s)+FjdPQwb zH34bc6>q=SVFil zVBo{R&*!aKyYAvO@pz+#dZ9p(0@Yt@NYc?0wQ4CIftf}pqVw`1nSPblF_kg4D_*m+ zG|EseRf^Ghwb8a2RrC_Q*{+s$qF3M)`nWJABTdp0{amP^*309nN@}#x^{Fb9R9FE) zbFXZm%~%4pFBiq2qqRw^1tTCB0P0~rGvJH~=9Eo$edd@bQS)lTz9kt-tg2RFe0VNN zMNG4TVp3SICWV_+o2fUhlY!@5qMnv4M{2-~bhsI1SkN<8VaJ46Hz9eRRC#MpFpGx1O|Rxo3_vuTM4p#;(G%=yhz zR%ZDI(^skxM{s|w3fDs>M7Nog=k?Jm zab9dkYr?d|M!a%%Gk0N(EonqS!6Kkroas97QuQgXhYdnwtL9##8$PA4{ zsRe1htyos#dcJU`A@G?xf1y#iZY4FLZT% z$G5I-#&Rx|jS$5`tB|Wi_F)o}r7)i7r3PkWFXE-|nWM#lAG)aC5oKCEL$+90bpP~b zFqV?`choezXSU81zQ9y;TE@*<#VYKw%ElO$Sng#nAmh7e znY^A(N$fe}@=a^jm#giaCdNxUTe;dKF?j3NO=hihaZ?g=5?|O@;zS6-M81gfWWEoR z*hr#MqepqUIYf`IVM;O67m+6OnuP>GXf);J=+Twf*6E<{=J1YhOrk~`p@$X{69)sLN=bkNROg$7IK3K`Qq=>13hhBB*D| zT-`jnM)YL)hQ38jOOS|yMyX!GKV;@*3sx}WJ*!xyoll9wNhM&ncM(FasPH8d1DbK@ zrS+Fs3MNdZ5V+!Oz?P7L<6GNR4d%fG%xdXdUWpiq=~GCZ3^MbB!@;NdA(9GNY#iRG zRq&dbR9P60Gkuv~%*B!YKUQ?h!$0m9t+f)>Bzi*AOn!BW+<0()b3s0ySzu|Smd9hJ zVLNM|%T{WPa>caixSIC4US^)B_Q}+Tg!0tUDl^#N1EgN!`Rl4piOGtba-ESh1M9AL z@0fkEnr8$DptZm&n*t^a;chy94I+aLx8^-b^ z9MhQXNAbx*aJ4zPCwcA{)hy1mYpeqTE7Pq-eVtoMsBfMSo+9k^c|f!$7tPLVOf@{wf6YL^qjHVZIpEJiKPk73>zmJNqys_ zecjb#mW!rn9Y$TR0gEHv9MhWR;N8*`sVp~_IJAQX(<@;Xds+iY8t2e)yuJF?kJr!` z(Y8lh{azL6rTsKx}Hz)dKIz4)GS9Nsmu`PX9bjdgqJxn`tETh+@ zY)&%4B#=fhgnhCBzq<=QTH6(qY!Xjun8jEOUfcB42!$60m{-yv9_ZbU4XdEmQ^mm6KH*HVv$LR zJE8`z8n8*P+-d_?4@B!&T-2yTdQY}1t+LhznWkRfHg_eBFuo$1xXZiSoR{)dm6gzx zwm6qKeVn(QbMYS0I_B#7-l*b?Ey<9zA+j#4gr2_%+jKLlndyQ7h5Bq-PT6I?0)Usm zj0h@k1Q;@sc{C9tO_NG?TN#Z9z3sNrkvcsV^o3U|k< zja-M*a-sD_y2gO(DaqX2$7uO!2{j+VPJ<)y9VfB#9NL!{?hIH6i7*VaC5ykyX%d7+ zd;i;$>wF1O_)dhJ&@{ruA7(WiUuwXJIH`ww)FI6@%f@yd{C8yZ$JIwZRL>#TOhmoJ zrHPmxtr4M}M&6tdy%5vPAESyHrGd5y9tXz&qofxla|Z6#J#2Im(SsIX~^z;jR2 zy862TtjetBVcg z)>Tgvh3*DsHJ8QA+=ADNbPkwb#!i%1rtctQKACm#EW`{eb6RS_=+z#p-m9oPCSX9+ zvPO%GadA>+G>SIeO^Pl_<`JECdhWd~Ke7JHh6~J}OMC(sZqT($m2vCyZ2dSQ;p1UanX0Fx+hrj30ZubVNgKoKN~yNhtXx` z>Nip0V|%Q~JF^;jX-4Eoi4K&lA}P#Lq-{}^-GW%h4I3C=r)pe!QHx;xX zpG|)IK|HV}Cyr-Gs+`P`5f4gFx}U(fv}2*2f+#!D>q$IqpR&Fv$T3)B+#^0z5LwAPs>WY5R11($;6eGypJ!~&e2Z8OjMckM;GLw4RH(Tn`D8^WuA%+yQ zM2*dfyW-iNQ>@1VPOaFxIh{+xD|iIpcA1A!R(g*##%VJ}*O+0R1JkCJHjlur?tEcX zZ8@wU1j0^gvnI0ryweiY@UF4vGm~a!S6VT-xLTrMiNKc5Gmlx;D6f{<5h#>6thy~3 zRVOk1Oom;aZZwNag@#6WwK!B88w$Lb|7=Un==qM_!?tC6YaMF>e$!k~{pFK8E#qSo z2VINWu0YMXBzH%5uRL}X%B_02NG9fx&qYZLTuQP%Zr!a;zAv;LP5PSp z=JK_*Nd~3?HXVDeWTB~%#ITJp?#3jcmdHebj#m3N#m=Y(N&jh+`R6Ri-(7Yua36l z+;Hdw>8NPSYF8IQveN|>cD#+0Fpo7cXA*1kz%8S_(jwd*WPCVRDYScotqqL}$m&5dDkgHz#n4QJ2rRXj>F1_JLF>K#=x{yatX;u=5 z#S?b66j{bJA}R}qw#_;*bRuPffEqPlXNAoJa-$Sb^u=hjz$O)24p*1Bae=pIOJ!la zWj&!yxO_ockhTNs2oGFbin8gUD_@AcW#^4_%}v>S1A=C&L)y1)8}ebF9Z}j2q_w-( zc+mJ5CJ zH($UEUu*R!xaTpKMY`Z(nJDcn6gf;YNtbjrbowW%KX6k{RwI>5<0MR%Ra3T&F!DG? zU=(h}7q7W;z4mVVAZqf_txFf-U61a@?dtZ_KT(@x7o*Qk(G1nn4wJKE__mZST#553 zWiw8R4K7-cz7IbA)H5$>ot{Q86D#T^I#Ll)-U%PFoHLFw3cVP3nxt>ps2Xpnrz0Tu zEpe(gT$H#wMDoDSS-@{P`A0Q+5HN|sNVKi!(km=;~Q_ngeb5HnG*?( z@ZHwWr3G=iVmeHVRU2(F=7IojB1mN=hXaCJmY#lk6jpu12-hkC;*?R5Y**77m~ZlC zC24z^7F2ej5lZZ&FQO*Gks5qEIi^76_yIsat`mw#YuL?YxQunO3Z>Sme8PJKDDy*( z1(`Hw(A8;XIP$>>n<%Y>Cigm8XbuT=PF5!(P1|*sDIRvdK^Do*Lfmn3BNT{5gvO~(%V$!_J} zQ-`ZDn3BHao9_*@byAbXixw_ggou;Ubf00?0If+tXjP&q|Gd6O?QAmOB;t)u+F+nk zMB*Px>Caa;w%sk6dHd53Hl@g(Iu}3F_rZheZ3z-B5u8NQ3d4AnZ7?}6M`}II_WjJ+ zB5dpz!HvFVyd~O>e*_Zs)9N#SmbB@q*83(iIToekFbooLfqRVTL>Lq9)hd&lZ89~7 zT>13sr;Ux8?2n;!#i1+ws3%)5acsv+hL`PkSxIMQ#fz7px@>6Csf!j7ap*Dxg~oGNyhYEAmn>br zG)~$IDWg`hCuL8-X`mEwxsXraInc zpZL&bHasnlS2M$_Ag#`1To%WxwaL;s&DvOt9h1Bst~JJ2?x%&jtdWa{7wxy&CHIh= zEX&Q0cM7h@GABYbOj#g1%a)k4c&Z{|ZfH%o0bqH&Y^2=UZ)1hy!j&OvJc)axTDQmM zSxZwDsOzpM{1-t@U`>Hqeu{hB2dGDSx_dYZn zYeCSwsu&Yf?_+l|k)SfMgNtIHiYRd~F0DZ`ri@eeKC}W%YB^EhtOkDL0YnTZw*Tnj zI_oN`vCnK2!G>z^QitO;=#`WztlLaZy}xPX+Pi1v-iM~QPt6a+o9W|n6)+0%iNqxY z{HXCJ+(R&Rzb+!+olYVa2MSf1+C)F;b^@wE#03;RQRcfSZjVH$+SLiDK@LeZ>+E2* zW(*Sb!h$>DOWZ%ut`?ZWG)nZBQ4(#hCMn-STp5rL*4rMfvSk_0D(VV?g4m=`oW$5y zYHk(~y_!=Wm3M<*Tx&qD#Ft;p(i9$IO&2-*#gVQg4w=Qx0cu{x7MIB73a~fxN1gd=Ry5?bOB0lXwZ2{(r^zB; zS9z*ra(RML*0xGmyW7n+YcGlSc;9ofOtKDiV$Lbkgn$Vb)u={im2#v(w%e$YlT++A zGPS#jtcC$P9H}(D^BRV%AND1Oa3@2S*!W5upS3hsxpD1Is7XS=B(@O-4I%>x<*4^C zsu~6ZFk4>p*`wGigG#cO=a0^yWcM)q5!tN8ZEhQoGNSb)%M4A~oZbha zdgM47;|eF)j3X!)yEf8bIV2xD*DS6onKl|BEoKbTHJQug`vZUL_K?D~YC8ND#@FQ} zdcoy1QSyaNPn)c)AOp}46^}ektcg`@-^1RIbJ|DtNMIJzxs`J3278+?%D0qx!}sn< zuA4xA1qp~yxvn;V3RumM2H1KFU&hzA!($Wwq;ZUBw!i2%7R0MhheK zOI1oaXEfkTXJ4ySVfIqmijLRdWUUFSH7H=2mfTt~=eWx{qe5bvZB4zORgQvap^Gf& ziK^ZDVK!!0?cAi1?#riCwX)ih+S^u`98vPRR!qzE=44?w-Xz82M$<%zyDT`;E+)}+ zN4YHa?m3ZaxRD}{9rY7yQf{@UKGfD=$|~Zyh#hiwTkKR$P+ism zbTz)xmIGNkq_)aJ7|u$OImfm%dFBeIVy%&|AT*HwS3=TH0b7Rbj4Qbjd(0%LcVxo@e=L4BTG zhhZH+wVEga>oHV?YFW^v0lJOjE2mKRchGkt+thur8CseS*un_RQz$59qc-ZW71QxVY@qjP{enPjqbeDfJd zFsf{l;-)eeq$E~XVx#R#1xnRP+-yD(VkQYQVKmg>a#a(9w>_Fj%fw7I7wbMWF;_xI z8y;gVJ&$B2_L%BHueHjk7fx;!2Wo8TH3P_K5b_;<43#s3IL$Xd>w?XD*~)X}kuqLw z)-_r#jWVu)^_o-n>j*v!&CK;N)LHZ2pqU;E^GI+8ib>lbN(wAOLC@xJGO)$(m4T@T zIo`u1Sz*3larU9Q$WBdt$cqsdEJtddwVp|<&5$(Iq=X=M(i46eNEe^bBZ&Dhy$|9) zsoY?FxU`c?L0DEAX_UAYB%fBz8DYxG5P=a@RFJ#yl;&opdq?ojj4Ig-O5dh;9lA1F z-!-2y#jXZx`i}m{z8n3JD=ox?&FfW>Aa=7@LA1&|$mOysONA`UWJuC{@0(4U)8fvO zzDre@T8_*@U9FIxWIaYpP;MN>Fy9Vuno|$3U~P)5@0B9d(Uqc2zsvJ9W=UX;WobsO;PQ|Dt?i76 z=AI#{P0nTIOm`a0R-I|{`k4}Nr3$N1o%YmB@#*N=h)gn@#A>e?GoqkOk=()m1mV1E ze6v~qcKRkBF->mDJWKhSp;ur~n+9Z)fLT(dlf&7022SL^sr###<;+7gV@Whi5!qy|GEl?&HuZpP%>F&t$55W7l#t2?Sz?p!OPaY1 z%ti@S$GSZOnXL}9v7*OD0c)XLlaE=d!$zD2`)lSdhtdQY^Gah+AK+{|YL!R#xp-Vk zmCC-S^8GbszY(N=KlgQT%u-_CbS&4{j_%p2Y+JnX3@4^Q|0;IHoTXxEY#X_3A<=b? zp^#aUj+R)>qT}U|2!d{w6gsggDK|%64AIGbj?9>POGtv6u^sL53xop`v(+x~wPX%) zDSeh2<|JV9g{xCdaVED4nFQhTl>zJn47$12gu2T!T4p-aD9=5SEsmJGXs&6p!I-*} z{-~r>JP2nDQCYA^lxezZ26+noFn`5eNk+3($M(UBxmbhX(5NK#-aYgvyL_2I%X5|{Xa^jdF>mN!saZ0}^fHVQ#y3rZUE~eTFNAir zF5LChzj?MgC(k)lnG<=l1eq4TxWf~ls=Abk!=h%oTDx2eqS=yJ!noO`QGp!k1esx! z97uN0SN0+-O5|qKIV~;@l|N3l8NGWxlMd6KBueh3G6HpGlrHIoF_x3weIi1c zB6rQQTgiCb@2K+Wn0Y}GM=gxOt}WZ{-RclP0MqO=bbGYDUWe_&*!8)N=QCSK6f;@N8Dtlq-BfX>|8JH*@n~%Q% z%5a-mx|hn;=W=Ca4q%OJHgvNUTBADfuxus>xOdN0Od{NHqT+k^Tur;y>t9H?e(Fz+FA$_4mxq)nGr_=(?=KyMM0V6+>7R`kjBIL7%DBRI71P(58HTDQ(tu;M}%gm zq6Di}KrQpmRfpaQREe&5;hZJ8`hhefZgM9YvM|}3!wEQVgf9ssvK~6tMr_&v zSqAB7?nswN7#|5?DSd_*9b=^sgxBer+A*Grn~;(G6)ngYf;b zzAYom(Ug)~za8m3PpPj8dw|$!+iKe$F!NAZ{y4ULgL1SfH)P2qytZ|hWT1-5`JEN2 zK-2e)b`*Xr4g#^&WJE_;I$|YF4f=v;>VIEHH8qsC z4;k(3Z?Ju-;z?~s65(yZLB;jWq)Y5(`Q#cMq)q>965b3#)X5w+kZ7;hLR)ioBbe?NYJO2UD<1gZ%1Bw5lHtxDNkSY5A6-4$yL>)`V4(TtHX42dRo~aOxX0# zK^a%*2D_SFUdN^#?e)@PH(t(}v+vjwst%DZwUnsJ{+&)tk-wDg5wh)kJ-8!8?Cic? zRU%^0dTN-7xqhtFH#zmzp7yXjF6QGO=%eV=%r(|v|2{iJY;1(>yuPsSTBFGXmW2{i z8Lnk8;7iSE#vM)99(djTuB?cvrD-;m=QI#Lf?%rDiJsn)XF^%p$W}R}o@~QDYrP^o zC-{jlsWm2v1%z2y_gaJt^faO+N^^%rWV=o*$Pb%Cx=N(F%b{GZP1U9r+d-peJhli%dspw7&HqBUq>`%Fv zn|oO8@EyGLMYac!TYTB9hpUi{O}?Sc=fFvqDYIjYRaaNyG z6dgHbTewXiYT`LwhLv>p9~T=3{V}d?XRd}Ninw5BiHpU~O69T&az@rhPEvGb-Lt-7 zj8jLO1BW9F+9)@-BO)D*GkH&SCC&A(lRY*Pu|;%Op<=TJzibee_@ihZsA~gCmk^f9 zfy|kJb309PhZ`Pb{8wGVS;vd)-PB3+RCc^1;{kKtFf6e|6F;p@T};9#Gx0PW9P$V& z2wCTvvm_Y4HmEyjhzPUES^G?nGP#b`Zn2pGk80@u1;&qkHRS*fb3r zx<#!OH0m}MQ-QXsGj|R6H^lU$~W=Q3K*;F z_>|WkuNOBg>ZE}VPNhjq$9E|Pa>>jS5js8prD@{`C%ekr&Vh2UTNu+a!?GRrjCd!r z4q+e&pvkzFgHe`PW6K_6PL|Y4#ABm#2FV_HxnkM*=Qfp*n?v|M2*oXS3_7AyB@t8` z+lNkiRn3JFK7Q5}f_(C0(?PyyP%{wi_?O4+n2eEq%E{#HXApcfE}0vo%5F_q{9~p^ zKhO{}9}{Cr4?4aWE3Zd@RISvG=*ND zOJXM(ZZ6o$7eBmJAqQF{ds27s>1%SuBlXK4u$z9sQD*H#VMHewsB)H4a&ln&=;rZAOVoO%-l#l90xsg}pT|;sds14MLNtpu>n9CM4l*$v%;kV{m$y zyCpfIEZbfC8D&ZZeFQ1YjPT{$bf-|JG|fs*cQC05#=z+6a4sSpF{Vgef`!rPwsko5 zi_nPYk8+!2l7;qSdpWj8+p_foJ$4yorqa7ld2i9~aaF{4%3a7m?E*+CkYO=-Z_toCwBjWdIRvz?b9vqmX* z8HMSFM28K<%D5(_IeR_vk~#0|HZvew36?y~xFka9A6o zEU3#ZIZ(t&D`TVMy~3eP4ysSxpX1lS-2OVWUsVkLDa}&3INDA?>6%Mgn)Wv#xNMyolN-S4z6ck?HlOViBNa<E!5Q+cn%pMUZ-s-@1jos8h8~eHin7}=c-O^FuzTY^7l=eHkzw{u(rxr zFER@|XxWuG*>8cxY3n*+y{`ww=dc~k7z8T_sp(bjw4_5_x+hPasgQ7~f7i9LHrp3q zik4eW7`0s|DUxG!8uA@y);li$l;P0O}Hax-B{;)fWRJ2u!sjnNt=r#RE_u$gTk z$EWEVpE%gfBxo&kdFHZ6%vXpi{*rRy?jZU2*4lyiB1hqx%ew|+5JOUjiFBkKTNMct zWeKu$l#5oeEn8)ZFw?HoU1}~rC!`jdsMu|$Q@d?R!qw-jsmv)!8|AsBnN&0$!gmpASs?+thsy-NPN%=H;JXS{a)4FwW_o-weIr1GE-;y%@lNu zU#v>+Xt3q&J?b#RNKQ5eY2sWgD`#`(26odCaj~9kCHI#j8gWhA-Kz3YN688_S6S+c zq$r`K&vr5;ng{^16pV3ai)q)c`nqptREaPg`2LU2i96(Dl3Bq>fw_{~S7p1h4@(O* zS`(eV3D;`T!ChhdT*P?eA6N}ek&G)ek=R*pSF{6RE^!c%d-wFZ(+x)LSA+&PL%qb2 zbFo;H%bt?^o-ke5Sk^bC*}S?R%hvlPD*8vob<1|lVxdoWrC#V>)Zr4}^tRW|!I|tn z%te3%95;pxH+h@0(Zu?5a^;5Iv?TrvGwLYuhwR-GE`5c6^LN2EBe%&+gjYKr1j8<2KlM$D8gEU4e_Aasx@pgSS??ZOzfJ3S)@}CL`f=2*7@<4o5(VXRj#ir zNE@Y>iFK8L{hCU&Ow_6n4LVeCV_d8IW96L%^=G~~hWAG5BQD!gPlvc&DeHafQkJ|X z8T$SnX~I}YJo%~I^d&JykDZg32B56ooy8TvT0XP5B1bMe$qGpst2*!u)7qGOpY1dudtlx1Ddq1HwgF#{!P;nI?rInhJFdSAv z-lX?Z$%(6b_+*mlqyScOdz9Vh$yK{7bVxzM94mbklVDHula-+a!TrT2#RhKC?3=myop@4 zsR;ZwIklVnc^9ab-KWCUiu^hPg}4Qsm`Lf0PtxQbP9?gCb}?w!rBT!}Sk7#8zIPT6 z^wWif$x_gu*Ns-iix&;smAysWZZy=?SVnPt&^|c0%3rrL5Q7fVI5I(Mq=m9l5`D$I z8tbN&d5q0guuYLcr-enSWIoAv*U5|l8mEbHn@6(NjtVH-Qd}XxvrYc7+v?q>`Q!9a+DQLN+*DJG3HyaMdH%# z_Kk_tTWQT9ifR8oHfEm!c%A5!zH-6km9bS2SV3jOWVWZ04%1yHh>ZNm&zW>EX@&c) LZ4;^HbkY9@(ioSO literal 0 HcmV?d00001 diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..cd63484 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,2241 @@ +# glib translation to Catalan. +# Copyright © 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# Softcatalà , 2001. +# Jordi Mallach , 2002, 2003, 2004, 2005, 2006. +# Josep Puigdemont , 2006. +# Gil Forcada , 2008, 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 23:26+0100\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "No s'esperava l'atribut «%s» per a l'element «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "No s'ha trobat l'atribut «%s» de l'element «%s»" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "No s'esperava l'etiqueta «%s» dins «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"No s'ha trobat cap fitxer d'adreces d'interès dins dels directoris de dades" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Ja existeix una adreça d'interès per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No s'ha trobat cap adreça d'interès per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "No hi ha cap tipus MIME definit a l'adreça d'interès per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"No hi ha cap senyalador privat definit a l'adreça d'interès per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No hi ha cap grup establert a l'adreça d'interès per a l'URI «%s»" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"No hi ha cap aplicació amb el nom «%s» que hagi registrat l'adreça d'interès «%" +"s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "No s'ha pogut expandir la línia d'execució «%s» amb URI «%s»" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "No es permet la conversió entre els jocs de caràcters «%s» a «%s»" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "S'ha produït un error durant la conversió: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Seqüència de caràcters parcial al final de l'entrada" + +# FIXME: fallback +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "No es pot convertir el «fallback» «%s» al joc de codis «%s»" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "L'URI «%s» no és un URI absolut que utilitzi l'esquema «file»" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Pot ser que l'URI del fitxer local «%s» no inclogui cap «#»" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI «%s» no és vàlid" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "El nom de l'ordinador de l'URI «%s» no és vàlid" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI «%s» conté caràcters d'escapada invàlids" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "El nom de camí «%s» no és un camí absolut" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "El nom de l'ordinador no és vàlid" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "S'ha produït un error en obrir el directori «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "No s'han pogut assignar %lu bytes per llegir el fitxer «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El fitxer «%s» és massa gran" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "No s'ha pogut llegir del fitxer «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"No s'ha pogut obtenir els atributs del fitxer «%s»: ha fallat la funció fstat" +"(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: ha fallat la funció fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"No s'ha pogut canviar el nom del fitxer «%s» a «%s»: ha fallat la funció " +"g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "No s'ha pogut crear el fitxer «%s»: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"No s'ha pogut obrir el fitxer «%s» per a escriptura: ha fallat la funció " +"fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "No s'ha pogut tancar el fitxer «%s»: ha fallat la funció fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"No s'ha pogut suprimir el fitxer existent «%s»: ha fallat la funció g_unlink" +"(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "La plantilla «%s» no és vàlida, no hauria de tenir cap «%s»" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» no conté XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "No es poden utilitzar els enllaços simbòlics" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "No es pot fer una lectura bàsica a g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "A la memòria intermèdia de lectura hi ha dades sobrants no convertides" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "El canal acaba en un caràcter parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "No es pot fer una lectura bàsica a g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: ha fallat la funció open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "No s'ha pogut mapar el fitxer «%s»: ha fallat la funció mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "S'ha produït un error a la línia %d caràcter %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "El nom conté caràcters UTF-8 no vàlids: «%s»" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» no és un nom vàlid " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» no és un nom vàlid: «%c» " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "S'ha produït un error a la línia %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"No s'ha pogut analitzar «%-.*s», hi hauria d'haver hagut un dígit dins un " +"caràcter de referència (per exemple ê) - potser el dígit és massa llarg" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"La referència del caràcter no acaba amb un punt i coma. Segurament heu " +"utilitzat un caràcter «&» sense intenció d'iniciar una entitat. Substituïu el " +"caràcter «&» per &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "El caràcter de referència «%-.*s» no codifica un caràcter permès" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"S'ha vist una entitat buida «&;». Les entitats vàlides són: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Es desconeix el nom d'entitat «%-.*s»" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"L'entitat no acaba amb un punt i coma. Segurament heu utilitzat un caràcter " +"«&» sense intenció d'iniciar una entitat. Substituïu el caràcter «&» per &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "El document ha de començar amb un element (p.ex. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"«%s» no és un caràcter vàlid després d'un caràcter «<». No pot començar un nom " +"d'element" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperava el caràcter «>» per acabar " +"l'etiqueta d'element buit «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperava un «=» després del nom " +"d'atribut «%s» de l'element «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperava un caràcter «>» o «/» per " +"finalitzar l'etiqueta d'inici de l'element «%s», o opcionalment un atribut. " +"Potser heu utilitzat un caràcter no vàlid en un nom d'atribut" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperaven unes cometes d'obertura " +"després del signe «=» en donar valor a l'atribut «%s» de l'element «%s»" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"«%s» no és un caràcter vàlid després del nom d'element de tancament «%s». El " +"caràcter permès és «>»" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "L'element «%s» estava tancat. Actualment no hi ha cap element obert" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "L'element «%s» estava tancat. L'element obert actualment és «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "El document era buit o només contenia espais en blanc" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"El document ha acabat de manera inesperada immediatament després del símbol " +"«<»" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"El document ha acabat de manera inesperada amb elements encara oberts. «%s» " +"era l'últim element obert" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"El document ha acabat de manera inesperada. S'esperava trobar un símbol «>» " +"que acabés l'etiqueta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "El document ha acabat de manera inesperada enmig d'un nom d'element" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "El document ha acabat de manera inesperada enmig d'un nom d'atribut" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"El document ha acabat de manera inesperada enmig d'una etiqueta d'obertura " +"d'un element." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"El document ha acabat de manera inesperada després d'un signe d'igual " +"després d'un nom d'atribut. No hi ha cap valor d'atribut" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "El document ha acabat de manera inesperada enmig d'un valor d'atribut" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"El document ha acabat de manera inesperada enmig de l'etiqueta de tancament " +"de l'element «%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"El document ha acabat de manera inesperada enmig d'un comentari o una " +"instrucció de processament" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objecte malmès" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "error intern o objecte malmès" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "no hi ha prou memòria" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "s'ha arribat al límit de tornades enrere" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"el patró conté elements que no estan implementats en les concordances " +"parcials" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "error intern" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"no s'ha implementat l'ús de referències anteriors per a coincidències " +"parcials" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "s'ha arribat al límit de recurrències" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "s'ha arribat al límit d'espais de treball per a subcadenes buides" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "la combinació de senyaladors de línia nova no és vàlida" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "error desconegut" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ al final del patró" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c al final del patró" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "caràcter no reconegut després de \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "aquí no es permeten els escapaments (\\l,\\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "nombres fora del rang en el quantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "nombre massa gran en el quantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "falta el «]» per a la classe de caràcter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "la seqüència d'escapada en la classe de caràcter no és vàlida" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "s'ha sortit del rang en la classe de caràcter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "no hi ha res a repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "no es reconeix el caràcter després de «(?»" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "no es reconeix el caràcter després de «(?<»" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "no es reconeix el caràcter després de «(?P»" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" +"només es permeten les classes amb nom de POSIX dins de la pròpia classe" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "falta un «)»" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "hi ha un «)» sense el corresponent «(»" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "«(?R» o «(?[+-]dígits» han d'anar seguits per «)»" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referència a un subpatró que no existeix" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "falta un «)» després del comentari" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "l'expressió regular és massa llarga" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "no s'ha pogut obtenir memòria" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "l'asserció cap enrere no té llargada fixa" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "nombre o nom malformats després de «(?(»" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "el grup condicional conté més de dues branques" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "s'esperava una asserció després de «(?(»" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nom de classe POSIX desconeguda" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "no es poden utilitzar els elements d'ordenació de POSIX" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "el valor del caràcter a la seqüència «\\x{...}» és massa llarg" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condició «(?(0)» no vàlida" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "no es permet \\C en assercions cap enrere" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "la crida recursiva podria entrar en bucle indefinidament" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "falta la finalització en el nom del subpatró" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dos noms de subpatró tenen el mateix nom" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "la seqüència «\\P» o «\\p» és malformada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "es desconeix el nom de la propietat després de «\\P» o «\\p»" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "el nom del subpatró és massa llarg (32 caràcters com a màxim)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "hi ha massa subpatrons amb nom (màxim de 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "el valor octal és més gran que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "el grup «DEFINE» conté més d'una branca" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "no es permet repetir un grup «DEFINE»" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opcions «NEWLINE» inconsistents" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"«\\g» no és seguit per un nom entre claus o un nombre opcional diferent de " +"zero entre claus" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetició no esperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "desbordament del codi" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "s'ha produït un desbordament en compilar l'espai de treball" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "no s'ha trobat el subpatró referenciat comprovat anteriorment" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "S'ha produït un error en fer coincidir l'expressió regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE no està compilada per interpretar UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"La biblioteca PCRE no està compilada per interpretar les propietats UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"S'ha produït un error en compilar l'expressió regular %s al caràcter %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "S'ha produït un error en optimitzar l'expressió regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "s'esperava un dígit hexadecimal o bé «}»" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "s'esperava un dígit hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "falta un «<» en la referència simbòlica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "la referència simbòlica no està acabada" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referència simbòlica de longitud zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "s'esperava un dígit" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "la referència simbòlica no és vàlida" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "«\\» final extraviat" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "no es reconeix la seqüència d'escapament" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"S'ha produït un error en analitzar el text de reemplaçament «%s» al caràcter %" +"lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El text citat no comença amb cometes" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"S'han trobat unes cometes desaparellades en una línia d'ordres o en un altre " +"text entre cometes" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "El text acaba just després d'un caràcter «\\». (El text era «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"El text ha acabat abans de trobar les cometes corresponents a %c. (El text " +"era «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "El text era buit (o només contenia espais en blanc)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "No s'ha pogut llegir dades del procés fill" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"No s'ha pogut crear el conducte per comunicar-se amb el procés fill (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "No s'ha pogut llegir des del conducte fill (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "No s'ha pogut canviar al directori «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "No s'ha pogut executar el procés fill (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "El nom del programa no és vàlid: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "La cadena en el vector d'argument no és vàlida a %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena no vàlida a l'entorn: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "El directori de treball no és vàlid: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "No s'ha pogut executar el programa d'ajuda (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"S'ha produït un error inesperat a g_io_channel_win32_poll() en llegir dades " +"d'un procés fill" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "No s'ha pogut llegir dades des del procés fill (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"S'ha produït un error inesperat a select() en llegir dades des d'un procés " +"fill (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "S'ha produït un error inesperat en waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "No s'ha pogut bifurcar-se (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "No s'ha pogut executar el procés fill «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "No s'ha pogut redirigir l'entrada o la sortida del procés fill (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "No s'ha pogut bifurcar el procés fill (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "S'ha produït un error desconegut en executar el procés fill «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"No s'han pogut llegir prou dades del conducte de l'identificador del procés " +"fill (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "El caràcter és fora del rang per a UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Seqüència no vàlida a l'entrada de la conversió" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "El caràcter és fora del rang per a UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Forma d'ús:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCIÓ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcions d'ajuda:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Mostra les opcions d'ajuda" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Mostra totes les opcions d'ajuda" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcions de l'aplicació:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "No es pot analitzar el valor enter «%s» per a %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "El valor enter «%s» per a %s és fora del rang" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "No es pot analitzar el valor doble «%s» per a %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "El valor doble «%s» per a %s és fora del rang" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "S'ha produït un error en analitzar l'opció %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Manca un argument per a %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Es desconeix l'opció %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "No s'ha pogut trobar cap fitxer de claus vàlid als directoris de cerca" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "No és un fitxer regular" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "El fitxer és buit" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"El fitxer de claus conté la línia «%s» que no és una parella clau-valor, grup " +"o comentari" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "El nom del grup no és vàlid: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "El fitxer de claus no comença amb un grup" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "El nom de la clau no és vàlid: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El fitxer de claus conté la codificació no implementada «%s»" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El fitxer de claus no té el grup «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El fitxer de claus no té la clau «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "El fitxer de claus conté la clau «%s» amb el valor «%s» que no és UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» que té un valor que no és interpretable." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» que té un valor que no és interpretable." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» en el grup «%s», que té un valor no " +"interpretable." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "El fitxer de claus no conté una clau «%s» en el grup «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "El fitxer de claus conté un caràcter d'escapada al final de línia" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El fitxer de claus conté una seqüència d'escapada no vàlida «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "El valor «%s» no es pot interpretar com a un nombre." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor enter «%s» és fora del rang" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "El valor «%s» no es pot interpretar com a un nombre en coma flotant." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» no es pot interpretar com un booleà." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de comptatge passat a %s és massa llarg" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Ja està tancat el flux" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "S'ha cancel·lat l'operació" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "L'objecte no és vàlid, no s'ha inicialitzat" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "La seqüència de múltiples bytes de l'entrada no és completa" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "No hi ha prou espai a la destinació" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "No està implementada la cancel·lació de la inicialització" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipus desconegut" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "tipus de fitxer %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "tipus %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "No s'esperava un final de flux tant aviat" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sense nom" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "El fitxer d'escriptori no especificava el camp d'execució" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "No s'ha pogut trobar el terminal que demanava l'aplicació" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"No s'ha pogut crear el directori de configuració de l'aplicació de l'usuari %" +"s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" +"No s'ha pogut crear el directori de configuració MIME de l'usuari %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "No s'ha pogut crear el fitxer d'escriptori de l'usuari %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definició personalitzada per a %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "la unitat no implementa l'expulsió" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "la unitat no implementa l'expulsió o «eject_with_operation»" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "la unitat no implementa el sondeig per si hi ha un suport" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "la unitat no implementa la inicialització" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "la unitat no implementa l'aturada" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" +"Un nombre de testimonis (%d) de la codificació del GEmblem no són formats " +"correctament" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" +"Un nombre de testimonis (%d) en la codificació del GEmblemedIcon no són " +"formats correctament" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "S'esperava un GEmblem per a un GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "L'operació no està implementada" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "No existeix el punt de muntatge contenidor" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "No es pot copiar al directori" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "No es pot copiar el directori al directori" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Ja existeix el fitxer de destinació" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "No es pot copiar el directori de forma recursiva" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "No es pot empalmar" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "S'ha produït un error en empalmar el fitxer: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "No es pot copiar el fitxer especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "El valor donat per a l'enllaç simbòlic no és vàlid" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "No es pot utilitzar la paperera" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "En els noms de fitxers no pot haver-hi «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "el volum no implementa el muntatge" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" +"No hi ha cap aplicació que s'hagi registrat per a gestionar aquest fitxer" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "L'enumerador està tancat" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "L'enumerador de fitxer té una operació pendent" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Ja està tancat l'enumerador de fitxer" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Les dades d'entrada pel GFileIcon no són formades correctament" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "El flux no implementa «query_info»" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "No està implementada la cerca en el flux" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "No es permet truncar en els fluxos d'entrada" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "No es permet truncar en els fluxos" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nombre de testimonis erroni (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "El nom de classe %s no té tipus" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "El tipus %s no implementa la interfície GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "El tipus %s no té classe" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "El número de versió no és format correctament: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "El tipus %s no implementa «from_tokens()» a la interfície GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" +"No es pot gestionar la versió proporcionada de la codificació de la icona" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "El flux d'entrada no té implementada la lectura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "El flux té una operació pendent" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "No hi ha prou espai per a l'adreça del sòcol" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "L'adreça de sòcol no és compatible" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"No s'ha pogut trobar el tipus de seguiment de directoris locals predeterminat" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "El nom del fitxer no és vàlid: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" +"S'ha produït un error en obtenir la informació del sistema de fitxers: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "No es pot canviar el nom del directori arrel" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "S'ha produït un error en canviar el nom del fitxer: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "No es pot canviar el nom del fitxer, ja existeix aquest nom" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nom de fitxer no vàlid" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "No s'ha pogut obrir el directori" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "S'ha produït un error en enviar el fitxer a la paperera: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "No s'ha pogut crear el directori de la paperera %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "No s'ha pogut trobar el directori superior per a la paperera" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "No s'ha pogut trobar o crear el directori de la paperera" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "No s'ha pogut crear el fitxer d'informació d'enviar a la paperera: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "No s'ha pogut enviar el fitxer a la paperera: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "S'ha produït un error en crear el directori: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de fitxers no implementa enllaços simbòlics" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "S'ha produït un error en fer l'enllaç simbòlic: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "S'ha produït un error en moure el fitxer: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "No s'ha pogut moure el directori al directori" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Ha fallat la creació del fitxer de còpia de seguretat" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "S'ha produït un error en suprimir el fitxer objectiu: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "No està implementat el moure entre muntatges" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "El valor de l'atribut no pot ser nul" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "El nom de l'atribut estès no és vàlid" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "S'ha produït un error en establir l'atribut estès «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" +"S'ha produït un error en executar la funció «stat()» en el fitxer «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codificació no vàlida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" +"S'ha produït un error en executar la funció «stat()» al descriptor de fitxer: " +"%s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena de bytes)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "No es poden establir permisos en els enllaços simbòlics" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "S'ha produït un error en establir els permisos: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "S'ha produït un error en establir el propietari: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "l'enllaç simbòlic no pot ser nul" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "S'ha produït un error en establir l'enllaç simbòlic: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"S'ha produït un error en establir l'enllaç simbòlic: el fitxer no és un " +"enllaç simbòlic" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" +"S'ha produït un error en establir el temps de modificació o d'accés: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "El context del SELinux no pot ser nul" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "S'ha produït un error en establir el context del SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "Aquest sistema no té habilitat el SELinux" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "No està implementat establir l'atribut %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "S'ha produït un error en llegir des del fitxer: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "S'ha produït un error en cercar en el fitxer: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "S'ha produït un error en tancar el fitxer: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" +"No s'ha pogut trobar el tipus de seguiment de fitxer local predeterminat" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "S'ha produït un error en escriure al fitxer: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" +"S'ha produït un error en suprimir l'enllaç de còpia de seguretat antic: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "S'ha produït un error en crear la còpia de seguretat: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "S'ha produït un error en canviar el nom del fitxer temporal: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "S'ha produït un error en truncar el fitxer: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "S'ha produït un error en obrir el fitxer «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "El fitxer objectiu és un directori" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "El fitxer objectiu no és un fitxer regular" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "El fitxer ha estat modificat des d'alguna aplicació externa" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "S'ha produït un error en suprimir el fitxer vell: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "El GSeekType proporcionat no és vàlid" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "La sol·licitud de cerca és invàlida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "No es pot truncar el GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "El flux de sortida de memòria no és modificable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Ha fallat el redimensionament de la memòria del flux de sortida" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"La quantitat de memòria necessària per processar l'escriptura és més gran " +"que l'espai d'adreces disponible" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "S'ha sol·licitat un desplaçament abans de l'inici del flux" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "S'ha sol·licitat un desplaçament més enllà del final del flux" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "el muntatge no implementa el desmuntatge («unmount»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "el muntatge no implementa l'expulsió («eject»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"el muntatge no implementa el desmuntatge («unmount») o " +"l'«unmount_with_operation»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"el muntatge no implementa l'expulsió («eject») o l'«eject_with_operation»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "el muntatge no implementa el tornar-se a muntar («remount»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "el muntatge no implementa l'estimació de tipus de contingut" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "el muntatge no implementa l'estimació de tipus de contingut síncron" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "El nom de l'ordinador «%s» conté «[» però no «]»" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "El flux de sortida no implementa l'escriptura" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "El flux font ja està tancat" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "S'ha produït un error en resoldre «%s»: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "S'ha produït un error en resoldre a la inversa «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "No hi ha cap registre de servei per a «%s»" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "No s'ha pogut resoldre «%s» de forma temporal" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "S'ha produït un error en resoldre «%s»" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "El sòcol no és vàlid, no està inicialitzat" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "El sòcol no és vàlid, ha fallat la inicialització degut a: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "El sòcol ja és tancat" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "s'està creant un GSocket a partir del descriptor de fitxer: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "No s'ha pogut crear el sòcol: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "S'ha especificat un protocol desconegut" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "no s'ha pogut obtenir l'adreça local: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "no s'ha pogut obtenir l'adreça remota: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "no s'ha pogut escoltar: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "S'ha produït un error en vincular-se a l'adreça: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "S'ha produït un error en acceptar la connexió: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "S'ha produït un error en connectar-se: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Connexió en procés" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "S'ha produït un error en connectar-se: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "No s'ha pogut obtenir l'error pendent: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "S'ha produït un error en rebre les dades: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "S'ha produït un error en enviar les dades: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "S'ha produït un error en tancar el sòcol: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "S'està esperant la condició del sòcol: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "S'ha produït un error en enviar el missatge: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "El GSocketControlMessage no està implementat a Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "S'ha produït un error en rebre un missatge: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "S'ha produït un error desconegut en connectar-se" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Ja està tancat el receptor de connexions" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "El sòcol que s'ha afegit és tancat" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "S'esperava un missatge de control però se n'han obtingut %d" + +# FIXME +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tipus de dades extres no esperades" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "S'esperava un descriptor de fitxer però se n'han obtingut %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "S'ha rebut un descriptor de fitxer no vàlid" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "S'ha produït un error en llegir des de UNIX: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "S'ha produït un error en tancar des de UNIX: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Arrel del sistema de fitxers" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "S'ha produït un error en escriure a UNIX: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Aquest sistema no admet adreces de sòcol de domini UNIX abstractes" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "el volum no implementa l'expulsió" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "el volum no implementa l'expulsió o «eject_with_operation»" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "No es pot trobar l'aplicació" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "S'ha produït un error en executar l'aplicació: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "No estan implementats els URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "els canvis associatius no estan implementats a win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "La creació associativa no està implementada a win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "No hi ha prou memòria" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Error intern: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Fan falta més dades d'entrada" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Les dades comprimides no són vàlides" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "La seqüència UTF-8 de l'entrada no és vàlida" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "S'ha arribat al màxim del límit de la matriu de dades" + +#~ msgid "do not hide entries" +#~ msgstr "no amaguis les entrades" + +#~ msgid "use a long listing format" +#~ msgstr "utilitza un format de llistat llarg" + +#~ msgid "[FILE...]" +#~ msgstr "[FITXER...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "El caràcter «%s» no és vàlid a l'inici d'un nom d'entitat. Les entitats " +#~ "comencen amb el caràcter &. Si amb aquest signe no es vol indicar una " +#~ "entitat, substituïu-lo per &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "El caràcter «%s» no és vàlid dins d'un nom d'entitat" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "El caràcter de referència és buit. Hauria d'incloure un dígit com ara " +#~ "dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referència a una entitat no acabada" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referència a un caràcter no acabada" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "" +#~ "El text no està codificat correctament a UTF-8 - la seqüència és massa " +#~ "llarga" + +# FIXME: "caràcter estrella" (josep) +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "" +#~ "El text no està codificat correctament a UTF-8 - no és un caràcter " +#~ "estrella" + +#~ msgid "file" +#~ msgstr "fitxer" + +#~ msgid "The file containing the icon" +#~ msgstr "El fitxer que conté la icona" + +#~ msgid "name" +#~ msgstr "nom" + +#~ msgid "The name of the icon" +#~ msgstr "El nom de la icona" + +#~ msgid "names" +#~ msgstr "noms" + +#~ msgid "An array containing the icon names" +#~ msgstr "Una llista amb els noms de les icones" + +#~ msgid "use default fallbacks" +#~ msgstr "utilitza les alternatives predeterminades" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Si s'han d'utilitzar les alternatives predeterminades que es trobin en " +#~ "escurçar el nom a «-» caràcters. Ignora els noms després del primer si es " +#~ "donen més múltiples noms." + +#~ msgid "File descriptor" +#~ msgstr "Descriptor de fitxer" + +#~ msgid "The file descriptor to read from" +#~ msgstr "El descriptor de fitxer del qual llegir" + +#~ msgid "Close file descriptor" +#~ msgstr "Tanca el descriptor de fitxer" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Si s'ha de tancar el descriptor de fitxer quan es tanqui el flux" + +#~ msgid "The file descriptor to write to" +#~ msgstr "El descriptor de fitxer al qual escriure" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "S'ha produït un error en crear l'enllaç de còpia de seguretat: %s" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "No s'ha pogut canviar el mode del fitxer fork() ha fallat: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "No s'ha pogut canviar el mode del fitxer: chmod() ha fallat: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "No s'ha pogut canviar el mode del fitxer: el fill ha estat finalitzat pel " +#~ "senyal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "" +#~ "No s'ha pogut canviar el mode del fitxer: el fill ha finalitzat " +#~ "anormalment" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "No se es pot fer la conversió del joc de caràcters «%s» a «%s»" + +#~ msgid "Incorrect message size" +#~ msgstr "Mida incorrecta del missatge" + +#~ msgid "Socket error" +#~ msgstr "Error de sòcol" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "No es permet l'ús dels indicadors de definició del canal" diff --git a/po/ca@valencia.gmo b/po/ca@valencia.gmo new file mode 100644 index 0000000000000000000000000000000000000000..50fdf698181b5e7c7893ac9f966c080d193ca5ad GIT binary patch literal 40373 zcmd6wd7NBFb?-067%&(cZ`fd)YuWOQY|Uu#CQGtxS(aqkk}O;D0?3G-?mIJW^>mMW z(PCnD!jiB<2!0N6AOv{A>RCAOQymFFXf$5XjC>UNBC0-`_cPm+tAF85#b_ zd|dkVy|>m=r%s(Zb*lXJ6OVpV#NVxtilQ^X2ak=SzvTBlr|4}IeUX1-}#U z-va&=d;;(PGdw^3%qV&W&rb&TfP29b_&IP1IC7TfcMEu)zJn)&uLmyx-w6(bUjk$B zVeo0-nNN?RbHK~M)4|)or-1vxmEdc@%fQ3n+2F(AMc`R+6fFaHf~SHn1}_Bf236i) zfh)j=z!7jMi535upvrqCsQSGZjKLXD?f838^?K4G(tziKi@{q!wd*dB|DxaLAI1MP zNRsG>U<{r_=IgF_Ep78uBkS0a{2rAx*FbgaloewJBH6Wj&F;Mxw22?(WK*j${Q1QM4svmv6)kp@+o>FsQS-<>X&bUs^=myRs5}>`t1&o zBBM8h8qc2uRlmOlRqoG0NF7~Fr|bDSp!(@iw;t${z<+zgL3ds}F$UqX$5h^RFPR8$I{> zQ2qP#HU51q_!OS^fXa72sCvBxq)VgEfosA40!8;VJcz!}1eM9)z^f%R$w91{D2%2&$duZg6?K7L0j50BStH1yuY$14X~@ zgNwk^uXes$3#z;wU<`IZnjZZYD8Bg{P<;8Ajb7g~z_WQ?1}gs>K=uDYQ1R~r#UBrX zs{dnPHu2RZpxQqMir&u!)!%;rUJrf}q-xPAo4tO|07b`N1J48R0hMkB6rH~ZJ`s$r z@pQ+5kLB?O@EGtJpvr#^sCvB)R6RcdiXJ}!p9U`4;(Eq9P~-4gP~|-v)cAWTcpZ2* zsDAq{sCqp5TKW_m1=W8o5EhPJ4XWI~0FMKI4vOC&PbMdTYrrRgTfsBIXMsz=gP_WL zJE;6V3X0BO3eP_URsIPuz0!|>>c_RC*U2g`5zz>7RgAao0uYU!_H}MXaSC@eo@Vp;X``!+!UY`d=&#!}u z|1hZfoN|Mgdk(1b)_~%x=YTQzf`Gpl@GvO8{C2>jZuI&0Y*6pFgTMQzD4GJ*Psbrt z#dpI2mj_%0p2+(v!N-9+!7*?*I0b$joCZg3a(VPtQ2q8*@M7?&o4p;YKt108iXJZm z)sFkYOTlk~N_W~V-u?~XIXss@ST%YnNKw%jK=tFfx4NG8Y;Y~l_kyC^-+{1L^mFh^ zaPu=jKMAfh~a7!+OBJlo5?0~CKB0>vMH1+E4k z0$%`LyvOy}KLRCZPJ52yZjdHN_kw(ieg^IYpHYe;L|AkmI0^n3+zale6W4&B0WSfM zE_?gefQnxW_(6~=M*ji64ZOMH^VrY8QJzmqJl$2G>e&j zz;}R4zz0Fen`55q^58mr6cgmZ*K39R_qrITo_bTu#@NRGo_{ZV- zr=a@p+cq(|tZ+m?% z1XaJ?pz?VIsPFFsmF`oZ`0mkf@$#<%hj^X_SAo9`o)10%D*eOZ`=Yy@Zr6hAdH)=6 z5%@N62lz>F1$Zihd>P+qVN;#`E(7z7N#6 z`v$1;j{Y6TAyD+Z7F7LT1wIPY->KopllXl-p+q>A@E?TZ`9@bnUnG2+pudX<;?-vm zo=^BZL4PL^SG4~*;j4sUp4Em&6COuc!E^dYw?#Mc{DJV|gW%`F?{|S)`S#iHybpXQ z;ah|U2;!IjOL!4MJgPs@?ri(z^l9^ZZFt@fK15g^p1%WLMgC7GjE8rZfry;!Pkpgw+I%t@Q5>epJK555dQhhT&%RFO7{c z!ru^v3IB`mUPAhJ32}duhg3gKkF?JT@o#q()|^9cIe>kysK^Z(=biQ#<`-v2pxL3pQEqx}91_!7dq z2^GR05z@c!^W$pbToKazGtd7RK3>baKMcPa0@3}1rM&w!a3%P5@P8BjnD9cv3c^;x zdcHjd)ZZq4zaQL9_zl8s1pP5oq8)rY!=C(~zXF!?ZUWTa#Zd(P9T)K8fOqolOu~l< zmxg!0&+o_Z`x-F)yNe&&c~=fEo)_@r;0=WH2&WJZ5*|;yV+g;??^hGjzaQ{pC1EDK zcmi?s_a(w8;kkqpc=r_WT!Q{SMtInM`9CKDPbF*#X=8q$&2P!peEAKw5AY1qod&+1@M6L?p1%v~?^u41gna*==QG1^eftN( zMxNK}fxj#H{p))U8G{mY`R>db-hUQ!dfzm)Y*Sb*$4)Jp0CY)=nd$QjIq{^-3Wk z-P}pCrqmntk?l8a-5On0D(~$~8;`_UspBPBrV?!^)rZ<~xiNh(u2h>zx!q_Uj2rvl zk?gS;XYiNSbVAE&R!W*eEllE0i`=$t*|w2l>f_akPSe{B6IS@LxV4(lCrPP5!6Qpq zNm_f`jnLvO?@9x1ZZcgap4d}u?1A;`^`y2(FZa}{^<+;Ay4NQ{g%*&g-Pn`R z4Nl4NYP}K{Y93xwNTrq-TdJ#TReBmCx5ORd)hZ3lMtXOeG}>Z#gW|K+{g}%8@!6-Qg^=BvzsXR_-G%VPGEc=q$!5*&6B1j4un=Q3}?Xhd{ zb;oQr7%5%Mtf2!%AS^=&DKWPgpVGNzzs_1%KBX^)>NS12J2x?p605Y;+_W7%nt%iu_v)l05fJ z^opW&&44l8(`rKso0ID8YWrY35+|*4X_^{lIh0!Qc|5I&HZC zt?%jJ8gDkH3Pq<3pc0GoT_&bU+o^d&HO*LmF0OT$HPmOMG8v;;IbO85wWtu?xISqS-+9Q=mw}JlAMS3_4tCgr^+9cHx zbz}~TE=99)b~8DU7%Lcgx|^2D3Q7>&)-G->TbJh>^gJoHR?mWVJDiM8jK*uF-K|@a zr%-j1scB>l3>U@`+~26f^^l42K3ys&#P2^l#6|fWZ48>UjdRCJ%gzbw>y_;qg9`5B{7H2TQh`6PLRg*r7bXcUqx({n#pPxo$+~h zbQ~rV%TJ5_v=o* zdZ73kk=<5wsRJf5rw{h~oT(CpkCl#8MsY`&Pzv8BlD1{5TC@(f+9+?;`go%dqgFyA zm{bM@#j)^xsx=51+ZjTF z(9P&-8Rz$QbJsUC?sBs_%@{6JqTMXDY*6%&C+N?8i0+dX>cMoCYEPhpO>}Cdrsj>N zv;_EmF;WiYALZEwM8=VxbgI<$ao9Iyp>7^sY&})Ib6`=k5~SmynM~K1GfazV(}|`d z<`t`TiYc22XBvZg*h7f@`ImewNU=>xV>E|-QcV@}hOv5rD45vOsjF{?m#_q)4|yeG zq%&+OTWCs~42w=*>P4F@zA6MAwdmkix73J-7q^xa_WDZ#JkYA1aV0?5_^oorU87a8qAJM67Zf<`N|N_Qlw=?jb5)3`Ld$)v_;QlS&g z($ws%rnS0JWS7e#gjY7TAQcEkv-bApVDGx?+*1?Dr%V#GWGyI?TqAA}#ivTaSmNC? z#q*%3rj}&+S_cG1Tpf>B^mSn=jo*~w}M(gDY%QC4qIunz#b4IzdQPRUFmL{xtZJcN%4UCiZbx)63F4E(> z^pbu9wwbtikSdI=Lwa;oMh|gl7Y$}t!i+mv4J2utLnpA;>DwS)L*7^K#1v{4mb6?J zh%&O|Oee4vmYc85RK`xc2TtJSBc*#Y5B6`KJiaCklCDY z1JXX*XpqLEWl5p#dEBJFui9+X#aP`jTqh0o)d?)c^{hJknKsq?nKoi6ucMtNLIS5V z6x?K(88TH76luvLbfP4houZm<#(B!D-I7LqqKmXP!P98(4tw&sM}yg{D6+$$jQTJ{ zIfH+aCaNkHwb8jU{Z(ZnJB?SQP&*`r%(pTkuj*3?(Z`$SwFuEmF-;!v%%)4#=2CC= zQn#6yy{=DYoqA?a%{DYF^E_^5vbCu?r{$m+Ddp$;4zUY8(pJ88OM?yZ7bE#*4P>e^PErlQluq}wZBq`f|MUaZ-n>SjlBsb z+Tq2OC92-6t)4vF`O@@m%H%0igSY2kfi?0H1ns%~V>2C(#QhV3?O z^Nc0!{ZgUK#_rscb!)V};ah*&ly)PvQN?UsefLq7qF@Hm+LF~6s~UDF*eYnDv$2(? zQQn^9n+A4o66-VxFlW?a^6tG`8@-fQs0bUXrru>rIiHQ|uwyU_fQp|MH>KK-^`Pcap)3sWs7PG+$=x3N8dv(j-i6FF=OJku)orV;7no z#28vOAXgun%B`oKCT`r=#I6jR5(OjwnoLbE?mMM&J)a7oYcZMoJj~txU}2ZZ6qQqs z0sVJF_D{kO%vfSx7nSPsT#XTJdYcqopQ?H`B=dolzc({7`#4EW8~WF~j?F~cUr941 zG}^J@#*NH%YzJVOVi>v61UA*!ks^ltU!}DyrJHRy6uiKMS?ud~Zn>4rYc*e-2Tm|k zb5DDASX8k-e5+yL2I(%(2wB{zpSsB7L_2ynMj53+&&ua?TWmx(sC!^b*;_QLNOyG) zmmuWTe^e7Ik@_&|F~7}rt4Je+DGUI~z|L-l2nECtt9fvb4AN1EF?g*J zBJ|0-XqoP9z^>eIif(MaF~wKPEmzp0o=>7hk6_!yLI!pU!aeQDpxec_+F#TiDU9-^ z>9SwBrU?**(&2WAE!>zomM|oxUlTCBA-hwjj6hJn<$8~(>W@QCuaehFo^3aZea>&bti%BA@Z#EMstSP zSgTQ!olM1a%#JUSzDTpnqPSI-?}w$;3nPJ6FU`71-YHzx*fg$KgmmR$I!>|PJ(bWt zx;qf%O-p^ns`YZMW81$&=g?c^GF@s<=94^G_10SvqFt#O1|rD?AXQP3FUW$1rrBLG zH1~|UU8$3XWf~mG7`JY>@Igkx;K`v#*@!I+Z(FxAqBA8nUn|S}vd0xZECS>#+HN-2 z8(Rj9Yfo{G^m9cIv~Vd}iRi!HF?o~8Dz)GI!C+&f0lEYPF{QA749#4U6}c%ok7u4w zXgj4&4HpmV%4{8mZisUN94$>Jnlp`Y(_GOtE|}Y3%&gMxw$__3%qSOck_Z3UR$y)iY2kH8%84C*Pa`JiT|=NYriw&2wMrAo>gZvede-$jc5S(S`{?NCZPD(6F$4)Ji5~6V;KDV?LC9FcNn$KP6Vs9m|4wte*`HkBr8ZBWO7u76O$-kiTG3nv3DPME?sk1uG&J- z+*T}yMRTx(JN8FeJCJ*BEeT3Q(eU z_N*uSO^%GS;#aox7+Wq`7vNz&ynIRaK3E;I1&X9m=EZ4~b<}TIWy7a>fIhzmYqJ;!I;xDGkBTey&GkfkQS+<2DY|S z=j5G9q*)#qx!`h&OGuRBE@#y+Uj(rjp&fA`1@#h=vW|-K{GF{+X{h;ac&c=uI@Otq z*|EtQj4wiPOqsoimmZz6UM4Bo6`bmwJo?T7Y7FXx@1qoZ18JYuWX1BO%a=+cmm4;TlJKD!;6cP=Zhz5Q(=@4ZD zDsa2H(-+$G1{?+(%Fyidw{(sXm$dx|zN6XD+&8kNGIFz@;lQ5;W7??x8Cf~9a`~}0 zCOXbDvaK~yt&CjNnP`pd!sGAQ9oO#~*&t!S1Tu0pGGTSRa`}qoBg-!wS$RpkV#Vr< zR*fvbX!&v?j@-z&m(NlbZ~0{-%lUj+ynNN_3s+sRd?oR=;zK*Kivi!lBqH~z4Xi7$ zoNY3J!r_(8sHD|WytZubM-d!Et~9Qkm|{8}Mc}L>kNQLhEq7!W7Q@wydSn;EXf4C8 zGEr|#C0Di@<86OE+GtL!J64Bz@}{pCU4HBa7tAACv930w$TEyHReVe}3bCADZW~H@ zJXM*>jBE_2+g8V`#;WaOchoo?R2$jE+{QYzK5dV!%U5E(wV#*QiD{=N@FbBR*bG#F?!LloSoB&xp6##%GH?cy?dU-9Gcp~bDk_bZ#3cemmWV!G6vx!2CodA_7;O*i$iGSv0?@S(Mb?;nk| zH((YgX3&{;;(A6T=t}IcIy|Bx5}fO)fgR*)#T2pZ@cnDRw33r0oKZ2U4Iwh<`d_-V z?y8DLcp;P#RET;nbu`|{JdqIvlkt>@p>X)ny2JNJhYxY&4iYwa4yW#B?$fb5-f2p# z43+9sw8dhC5DN5ZON^RN%a5;N^z;u zOdz(=fw@rwdRU0bVi9PYm>S!yAX^8_dP`0wzR}vSn0X}nY z?)FfsP*_-4(9^9UYTRx%##pJ5rJvyo#ff;ewA0fnKsyu##F5t_B%mDejE>ILJGJN< zT!xqrm1m)16_`FSEQ!lAADmXlGnYU}wvkb1s1VY?xsQ*sM`YHGDkkFmVRqEHzve~L z5q9)XIauqb8x!mxhzM)CJNYvW&ZAL_t!;V>9=*kTWnqm!XEHcONFq`{77(2qz2k#Ku?6E>PVjI0Mucq||a{%vQRFMe=DvC#c#R08)X}-J`v)$bpZ1^pWZ!btbI6%gWsbW#HQ>J!VBmi=>R*dX^4PNoXhtkuL$muY_AQWzI zl*I;OA_;iSJB1vOFPu}40~$l)2C*jVoFsjZ$cd>32R$vYD~$ewYO2FPo_$v@lJ_lxricC1x|dEGsc(IYe&Gdxc@g zWX;J#*e^eh8RmVAMb6hj;`dFSjan*-2yLsT;`YFb0}5SWD%&r(+D>X3v8h-Kv1`49 zaL$GXgqy%7N1?thrk_N&nRmygSV_w?11f5mxUJs|27~y#EHxOt#X4V@QO0{OauPj&vXiyY2Tv3>n*bry=r6hEHbHz63J*NA*62~FkRL@DZ zq9dt5QlG*c(A9=tDvwmbKLS$cEv47m zRW|7H7q1L8a1t|>!)Orl9eo6qGZi$;x2Vn2^Zm5bh4M%h3n7Nywo9IzD`36W%zZk$ z21BzTdIWXWvMS6akA!(7Bm>3RUT4(6+(ysVXgaXP@3og-}2+XXag5ZUxuq!fgGbxU-%r7h19MiO|;=1O=Xlu_3MhhZqu$G0)75R6g zF^z2_CTzW^iUhHn#|omgCzthkDr8wML(=A3-qB92wy=|EZp)@CwH%qn)U-y+@2#jA zVIsrv)+_gW@omVN&{=UY|L4!~-jf`qJ0ZF$~y(jW{gOxiZ}n;B63 zZV^m(@|nY?C8OkA(HYR18*bXZ<<@x;_{vW+`s@|yf|4RJG8J{M1RT4?FyE~^%oU%u zH^$hqz%-yl@?=2Y4ig7bN_q?WH?4HSxGTh9%J?R=)>}o}fs99k(`fxyqtjT-&%Bc& zr^aSJ$f4eOs+}!8=I=4&82`=OS4Z7sp_D03a(GHu{g(osAD4Vd2d1YJL z%AB1RDy%XB^-Y?QS(B>TjfON!91apx>LxqBE1`=`6bC#F^23LyEnZEiSH+H8m|U7C zLto(p(_lU~%t!LfToXo*iP&jwDr%ye&6Bub-I!nA(_r5>ws{D*4Lj=&QPR!V#kjN- zm+axl)!?zHDXQGSg`$dt*JRZ%&v}|4UkhAfWCwa=8RViIhH2d5%QDzU?q%EI=`@F;nw#)b#?6o62YP192S!DD0LbkE z`HS30+LHPk%{91sQ zZtt+D=o^1p$8t>|1-+|aWl8%$Z7Xa%bysh!I*#{#$%xRWg!HqfD49312KR}ZDY)7v z3}zT9?kTU&)6p(R`}8wc0wlL{-Y~G> zjE^AVud2Yl`EZbiixK+NCYN(?uiJ)~`f@jHm6#HWj9EqWbtQl_u^hT7NYji zZL*;?D~;WNz(un*8DiU(NmbWF#F)uts?hK(QnrgyJp!JnW}oaGh?zlrz|hIBOfW9I zCL3O4r1~+V%H1Tj-l=xDr_FrOoC#D|jk|~tY*yo*uFq!3-bxLqOM1^jpYd?SS@|6d zzlxl~{S21X#vVp6P1VN<6GB}^u-xvF84P0C=w*r0xj8p1Fz&^@=ATe7&zKD$Gu&hu z$Ql;}qXwo-c-*nV&-_W) zA51IDV3vS!Nx@45Sh}I#MGo8ladAL`)Y~L1D7#`ZVs%Ss%3T@R)ImM+q$^!I8qzqn zF*QdFs)5TX&YBX{UGegg#8CJtcDld!mIM>H?$wox#S+yTwZk95aK@&jc_r97-uMqc zY@9g}BnSFE&vAUwn}5ZKNBCX3A58maBonL8*6q|< z_+s&yhrUGz9}zFTqep!{xPyo(QYG2;v-x)PX-J6JP3nGCA|hkU=^w`Ypl%H{Q|!N~V6KA2=)pBk8yD-SNCzHxxAQX%u_Z@%$#!Ss!t|fib|l8W}QH5 zl-3Xa;+mpcL$o2NMM@?*Q$0cIqb8}M8>Q|7)*T{p{4n>A)MvyL@O%T%{c?lnpj~=x z0)1iro|K#CRB#v6=#?=AUn;*Y1kd6ipeNL;=*29Wb%G12+$Q=&c0zW!vUb(T#3}Wap;{;C`<6IgCin&&EY)lx_q$E#@FOL- z7|j(AJD8w*O~jd!2-cC=LZZ;#RInSBxZj&qhYfM@m#uplMf!!G96s-iHu%s6u`*L6 zST5udY@lvV4n=gWnxPSb;b7>jt_^(R9X@n9CS^u_aPNjgtu>jZ75Z2sy=Pba5fw@P z`GVejr=1Dq>Sb%k)LS5P9rs=Sz&mF1Jn~ld7AZGvoXV|eJ9d-Var5HMxm<+rZ8vwY zu=+87Q{VH~_;;t~(RhbjALj5%gExXYkB}p27r7q+O)VFb+IX26E9H(f#cp+%Chu?3 zRBXWe1aG5fen0N5>^P>2K3V}|b&0o1$!pJs6*sk@x*}k-Ng0yZ?AIk+$s?b(MP_$T z#x^D$b*#$B=0Xz$tlj03l^FH{nCE?X=Q<7y1Oc?P(xwqJg6?>E#Ccg_E0tv^3$4t} zP{t)3F8oeFja{8UtEao{v7J(i=vEC>)yMq*NUzGdjKFS*u{4McKh+e5y{0{eqWQUd z+%6p-cFcI0oZZc{TgOdjdC}W;6<9#f6Eq}sw6VhV0J|ub^cTA`hQXO$`9k!fcm76A z4C!*4Z<214r7^i(l6Ri2-?Zn;YhS%U1tQDP(k~`C<$H4JQjcZDHZJzV-KPyV;88^I z;V06Y%{qmH1vOw2>ubRt^*#*!Vl_5^g|Zbo7xDpD*K0Y-#MKSvgx8<99r0a-e9D0jtS$V z^zk6Ure_^o1i_2UolV*WH3Avg}m}Tp}OLikoKAH8NRoX3QsX4Pz*5*|8586@*H`Um(F*rNhywrkG*}B1vokIbERh>B? zv&Is~(1UWW9ef)wwF#}j3YuZK)J9wrBvR49VH04!t)p(vyFFsMvlBehE?rkE?8EpK zDLGH+hMUF&>jmSAbG*KxNRC_0+*jbgz^wi{G+#9g<^|b{xOvSSuBT<&mkPMpt#duL zep)R_mimapXIg(El<8|1LP0{qhq~F(x84SG>57^!B(?TxDHx#~_uAXAq_>ADRE z&4Vdd?patE$7k*>){ox+2E}(TWv%1sf?i$R&V8puPB zV`l1Yud$jPCgXoh*LCTS^d$FLORW}^MPAvK@IrFW?f{yVo5{eQ9DOg!mKJkWn!I}M z1?r{=3T(Q12&6QfF3f-P#O3BTrVD5<<_Jj!)Cf7w?92%mUFViN3(@68GNqYp)D&w8 zIIkjgJoOn2dj(l$Mps;C{a`0Y^kuIJONyk0G1W|VnnWm7Q%L3sAoUlW%-^Go>ST*e z%5LRIHO-xNwiS6FZL&jP6`axeKSp*7l`wuaMWkXSHS~s6lO#YkFx0r%RLgvF2*j^T z0-ESAE)b}U7F~8N(agPOW$iL@4o+ou9%?UB7!)8Q_7`hhs90}5!fZxqdmqc1yqN1% zn6k1&_ZDr~GV_M?-Xe`^w`J4WD9Gr8p~8N~h--|f8uKA8e^_+rLFkxpvjJ0`?k?(+ z{_vsQ6U;|sqbb)9D4UdlN}8KPADXFMr&07$BuH1l^ab8jK~~#UMuiknfvHXF@S4qh zNIaQZ9N<)LY(X2)>}1}KXng5aM;Q36g^;;>DoYO}^VO!Z!aN6?!&%~t++6@xprcHN z!W4;)Ne2fo+m{lj_+qL>ou#8T`CpSttEh?3b@dV1VT)ncM_I82$xTM3GCE7K12i6K zgzJ5p!2C|6!j(ugGSgv-rVta;#eFjR#V}*U%GkX~=xeRW7Z5rORnuCvyR(A#M8s6X|9T{>Aaf!^W1QwXHCa{X zic?of9PbgyTby-IkGtz2O_cVX`$=SeJ*maDZ-ux+D!Wi=-UtY#F?6EChwg&CXi3fw z?DM1xFFW!s5{IQsl&&rh9}4#>(FMipmRgY?G%&eR?|P7FXiQgUS#KtAqcUDSP!a))#lfLFsE=%EyQecQwOgA=Lg%`iAg?L0n5l*gh<+m4$fGRvTKoQ-X3 zjFvcl!;J(m52+nrWa}Ox+AhiZ-4_R%uo#tG$I@y4Qi*lys$OQUfYf1N;TVfx)15l) zYLnO21G!I!2upR-%bwiX=(%@=h`pzS2Sg?VpE3OkD3eY4M@}QA)XL$8yXaNPBTQZGwm|?$fZd0psyy!I%Qnc(#xe>ZbwD- zHr~%z%BV^3!XFE>&xQ7wDV{E($-VCf|v6yj=&4FLp9W<-?% z!5T1YqE{Ee){Ggp4=b`Q7v^f8Pn^R8{p^CnU|k*dx`~NaEFZN?sw&vrXsAivoZ_6= zc6Mi5PzSq-K?i9V+1R(5NjXQZ4U|lw{@BFL808{RMF%k)?7XSM&3B(h7y>j-`h4VF z2q*C@b-i2Qrt;mm87hQ?eh%F`Pf6f?w|^@_LCNZp*1bj1Gg-&>q#M41$+M?sb4J$* z*dvM0EE45~lhO&G1x~RAyTzk+306#;ZaJH&A_JoEIu+6bN4C~qIyWjsFF2t1JOP`S erxhgExl1&s;@B, 2001. +# Jordi Mallach , 2002, 2003, 2004, 2005, 2006. +# Josep Puigdemont , 2006. +# Gil Forcada , 2008. +# Carles Ferrando Garcia , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.glib-2-20\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-08-09 08:38+0200\n" +"Last-Translator: Carles Ferrando Garcia \n" +"Language-Team: catalan \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: KBabel 1.11.4\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "No s'esperava l'atribut «%s» per a l'element «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "No s'ha trobat l'atribut «%s» de l'element «%s»" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "No s'esperava l'etiqueta «%s» dins «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"No s'ha trobat cap fitxer d'adreces d'interés dins dels directoris de dades" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Ja existeix una adreça d'interés per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No s'ha trobat cap adreça d'interés per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "No hi ha cap tipus MIME definit a l'adreça d'interés per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"No hi ha cap senyalador privat definit a l'adreça d'interés per a l'URI «%s»" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No hi ha cap grup establit a l'adreça d'interés per a l'URI «%s»" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"No hi ha cap aplicació amb el nom «%s» que haja registrat l'adreça d'interés «%" +"s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "No s'ha pogut expandir la línia d'execució «%s» amb URI «%s»" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "No es permet la conversió entre els jocs de caràcters «%s» a «%s»" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "S'ha produït un error durant la conversió: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Seqüència de caràcters parcial al final de l'entrada" + +# FIXME: fallback +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "No es pot convertir el «fallback» «%s» al joc de codis «%s»" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "L'URI «%s» no és un URI absolut que utilitze l'esquema «file»" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Pot ser que l'URI del fitxer local «%s» no incloga cap «#»" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI «%s» no és vàlid" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "El nom de l'ordinador de l'URI «%s» no és vàlid" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI «%s» conté caràcters d'escapada invàlids" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "El nom de camí «%s» no és un camí absolut" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "El nom de l'ordinador no és vàlid" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "S'ha produït un error en obrir el directori «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "No s'ha pogut assignar %lu bytes per a llegir el fitxer «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El fitxer «%s» és massa gran" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "No s'ha pogut llegir del fitxer «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"No s'ha pogut obtindre els atributs del fitxer «%s»: ha fallat la funció fstat" +"(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: ha fallat la funció fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"No s'ha pogut canviar el nom del fitxer «%s» a «%s»: ha fallat la funció " +"g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "No s'ha pogut crear el fitxer «%s»: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"No s'ha pogut obrir el fitxer «%s» per a escriptura: ha fallat la funció " +"fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "No s'ha pogut tancar el fitxer «%s»: ha fallat la funció fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"No s'ha pogut suprimir el fitxer existent «%s»: ha fallat la funció g_unlink" +"(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "La plantilla «%s» no és vàlida, no hauria de tindre cap «%s»" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» no conté XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "No es poden utilitzar els enllaços simbòlics" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "No es pot fer una lectura bàsica a g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "A la memòria intermèdia de lectura hi ha dades sobrants no convertides" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "El canal acaba en un caràcter parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "No es pot fer una lectura bàsica a g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: ha fallat la funció open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "No s'ha pogut mapejar el fitxer «%s»: ha fallat la funció mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "S'ha produït un error a la línia %d caràcter %d:" + +# FIXME: això no funcionarà en català (josep) +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "El text no està codificat correctament a UTF-8 - no és un vàlid «%s»" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "S'ha produït un error a la línia %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"No s'ha pogut analitzar «%-.*s», hi hauria d'haver hagut un dígit dins un " +"caràcter de referència (per exemple ê) - potser el dígit és massa llarg" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"La referència del caràcter no acaba amb un punt i coma. Segurament heu " +"utilitzat un caràcter «&» sense intenció d'iniciar una entitat. Substituïu el " +"caràcter «&» per &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "El caràcter de referència «%-.*s» no codifica un caràcter permés" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"S'ha vist una entitat buida «&;». Les entitats vàlides són: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "No es coneix el nom de l'entitat «%s»" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"L'entitat no acaba amb un punt i coma. Segurament heu utilitzat un caràcter " +"«&» sense intenció d'iniciar una entitat. Substituïu el caràcter «&» per &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "El document ha de començar amb un element (p.ex. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"«%s» no és un caràcter vàlid després d'un caràcter «<». No pot començar un nom " +"d'element" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperava el caràcter «>» per acabar " +"l'etiqueta d'element buit «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperava un «=» després del nom " +"d'atribut «%s» de l'element «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperava un caràcter «>» o «/» per " +"finalitzar l'etiqueta d'inici de l'element «%s», o opcionalment un atribut. " +"Potser heu utilitzat un caràcter no vàlid en un nom d'atribut" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"S'ha trobat un caràcter estrany «%s». S'esperaven unes cometes d'obertura " +"després del signe «=» en donar valor a l'atribut «%s» de l'element «%s»" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"«%s» no és un caràcter vàlid després del nom d'element de tancament «%s». El " +"caràcter permés és «>»" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "L'element «%s» estava tancat. Actualment no hi ha cap element obert" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "L'element «%s» estava tancat. L'element obert actualment és «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "El document era buit o només contenia espais en blanc" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"El document ha acabat de manera inesperada immediatament després del símbol " +"«<»" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"El document ha acabat de manera inesperada amb elements encara oberts. «%s» " +"era l'últim element obert" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"El document ha acabat de manera inesperada. S'esperava trobar un símbol «>» " +"que acabés l'etiqueta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "El document ha acabat de manera inesperada enmig d'un nom d'element" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "El document ha acabat de manera inesperada enmig d'un nom d'atribut" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"El document ha acabat de manera inesperada enmig d'una etiqueta d'obertura " +"d'un element." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"El document ha acabat de manera inesperada després d'un signe d'igual " +"després d'un nom d'atribut. No hi ha cap valor d'atribut" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "El document ha acabat de manera inesperada enmig d'un valor d'atribut" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"El document ha acabat de manera inesperada enmig de l'etiqueta de tancament " +"de l'element «%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"El document ha acabat de manera inesperada enmig d'un comentari o una " +"instrucció de processament" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objecte malmés" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "error intern o objecte malmés" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "no hi ha prou memòria" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "s'ha arribat al límit de tornades arrere" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"el patró conté elements que no estan implementats en les concordances " +"parcials" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "error intern" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"no s'ha implementat l'ús de referències anteriors per a coincidències " +"parcials" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "s'ha arribat al límit de recurrències" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "s'ha arribat al límit d'espais de treball per a subcadenes buides" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "la combinació de senyaladors de línia nova no és vàlida" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "error desconegut" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ al final del patró" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c al final del patró" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "caràcter no reconegut després de \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ací no es permeten els escapaments (\\l,\\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "nombres fora del rang en el quantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "nombre massa gran en el quantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "falta el «]» per a la classe de caràcter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "la seqüència d'escapada en la classe de caràcter no és vàlida" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "s'ha eixit del rang en la classe de caràcter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "no hi ha res a repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "no es reconeix el caràcter després de «(?»" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "no es reconeix el caràcter després de «(?<»" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "no es reconeix el caràcter després de «(?P»" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" +"només es permeten les classes amb nom de POSIX dins de la pròpia classe" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "falta un «)»" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "hi ha un «)» sense el corresponent «(»" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "«(?R» o «(?[+-]dígits» han d'anar seguits per «)»" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referència a un subpatró que no existeix" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "falta un «)» després del comentari" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "l'expressió regular és massa llarga" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "no s'ha pogut obtindre memòria" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "l'asserció cap enrera no té llargada fixa" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "nombre o nom malformats després de «(?(»" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "el grup condicional conté més de dues branques" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "s'esperava una asserció després de «(?(»" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nom de classe POSIX desconeguda" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "no es poden utilitzar els elements d'ordenació de POSIX" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "el valor del caràcter a la seqüència «\\x{...}» és massa llarg" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condició «(?(0)» no vàlida" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "no es permet \\C en assercions cap enrera" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "la crida recursiva podria entrar en bucle indefinidament" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "falta la finalització en el nom del subpatró" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dos noms de subpatró tenen el mateix nom" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "la seqüència «\\P» o «\\p» és malformada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "es desconeix el nom de la propietat després de «\\P» o «\\p»" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "el nom del subpatró és massa llarg (32 caràcters com a màxim)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "hi ha massa subpatrons amb nom (màxim de 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "el valor octal és més gran que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "el grup «DEFINE» conté més d'una branca" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "no es permet repetir un grup «DEFINE»" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opcions «NEWLINE» inconsistents" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"«\\g» no és seguit per un nom entre claus o un nombre opcional diferent de " +"zero entre claus" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetició no esperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "desbordament del codi" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "s'ha produït un desbordament en compilar l'espai de treball" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "no s'ha trobat el subpatró referenciat comprovat anteriorment" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "S'ha produït un error en fer coincidir l'expressió regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE no està compilada per a interpretar UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"La biblioteca PCRE no està compilada per a interpretar les propietats UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"S'ha produït un error en compilar l'expressió regular %s al caràcter %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "S'ha produït un error en optimitzar l'expressió regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "s'esperava un dígit hexadecimal o bé «}»" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "s'esperava un dígit hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "falta un «<» en la referència simbòlica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "la referència simbòlica no està acabada" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referència simbòlica de longitud zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "s'esperava un dígit" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "la referència simbòlica no és vàlida" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "«\\» final extraviat" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "no es reconeix la seqüència d'escapament" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"S'ha produït un error en analitzar el text de reemplaçament «%s» al caràcter %" +"lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El text citat no comença amb cometes" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"S'han trobat unes cometes desaparellades en una línia d'ordes o en un altre " +"text entre cometes" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "El text acaba just després d'un caràcter «\\». (El text era «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"El text ha acabat abans de trobar les cometes corresponents a %c. (El text " +"era «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "El text era buit (o només contenia espais en blanc)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "No s'ha pogut llegir dades del procés fill" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"No s'ha pogut crear el conducte per comunicar-se amb el procés fill (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "No s'ha pogut llegir des del conducte fill (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "No s'ha pogut canviar al directori «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "No s'ha pogut executar el procés fill (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "El nom del programa no és vàlid: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "La cadena en el vector d'argument no és vàlida a %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena no vàlida a l'entorn: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "El directori de treball no és vàlid: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "No s'ha pogut executar el programa d'ajuda (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"S'ha produït un error inesperat a g_io_chanel_win32_poll() en llegir dades " +"d'un procés fill" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "No s'ha pogut llegir dades des del procés fill (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"S'ha produït un error inesperat a select() en llegir dades des d'un procés " +"fill (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "S'ha produït un error inesperat en waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "No s'ha pogut bifurcar-se (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "No s'ha pogut executar el procés fill «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "No s'ha pogut redirigir l'entrada o la eixida del procés fill (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "No s'ha pogut bifurcar el procés fill (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "S'ha produït un error desconegut en executar el procés fill «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"No s'han pogut llegir prou dades del conducte de l'identificador del procés " +"fill (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "El caràcter és fora del rang per a UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Seqüència no vàlida a l'entrada de la conversió" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "El caràcter és fora del rang per a UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Forma d'ús:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCIÓ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcions d'ajuda:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Mostra les opcions d'ajuda" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Mostra totes les opcions d'ajuda" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcions de l'aplicació:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "No es pot analitzar el valor enter «%s» per a %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "El valor enter «%s» per a %s és fora del rang" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "No es pot analitzar el valor doble «%s» per a %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "El valor doble «%s» per a %s és fora del rang" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "S'ha produït un error en analitzar l'opció %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Manca un argument per a %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Es desconeix l'opció %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "No s'ha pogut trobar cap fitxer de claus vàlid als directoris de cerca" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "No és un fitxer regular" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "El fitxer és buit" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"El fitxer de claus conté la línia «%s» que no és una parella clau-valor, grup " +"o comentari" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "El nom del grup no és vàlid: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "El fitxer de claus no comença amb un grup" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "El nom de la clau no és vàlid: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El fitxer de claus conté la codificació no implementada «%s»" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El fitxer de claus no té el grup «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El fitxer de claus no té la clau «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "El fitxer de claus conté la clau «%s» amb el valor «%s» que no és UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» que té un valor que no és interpretable." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» que té un valor que no és interpretable." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» en el grup «%s», que té un valor no " +"interpretable." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "El fitxer de claus no conté una clau «%s» en el grup «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "El fitxer de claus conté un caràcter d'escapada al final de línia" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El fitxer de claus conté una seqüència d'escapada no vàlida «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "El valor «%s» no es pot interpretar com a un nombre." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor enter «%s» és fora del rang" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "El valor «%s» no es pot interpretar com a un nombre en coma flotant." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» no es pot interpretar com un booleà." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de comptatge passat a %s és massa llarg" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Ja està tancat el flux" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "S'ha cancel·lat l'operació" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "L'operació no està implementada" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipus desconegut" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "tipus de fitxer %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "tipus %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "No s'esperava un final de flux tant prompte" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sense nom" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "El fitxer d'escriptori no especificava el camp d'execució" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "No s'ha pogut trobar el terminal que demanava l'aplicació" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"No s'ha pogut crear el directori de configuració de l'aplicació de l'usuari %" +"s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" +"No s'ha pogut crear el directori de configuració MIME de l'usuari %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "No s'ha pogut crear el fitxer d'escriptori de l'usuari %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definició personalitzada per a %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "la unitat no implementa l'expulsió" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "la unitat no implementa l'expulsió" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "la unitat no implementa l'enquesta per si hi ha un medi" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "la unitat no implementa l'expulsió" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "la unitat no implementa l'expulsió" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" +"Un nombre de testimonis (%d) de la codificació del GEmblem no són formats " +"correctament" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" +"Un nombre de testimonis (%d) en la codificació del GEmblemedIcon no són " +"formats correctament" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "S'esperava un GEmblem per a un GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "L'operació no està implementada" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "No existeix el punt de muntatge contenidor" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "No es pot copiar al directori" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "No es pot copiar el directori al directori" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Ja existeix el fitxer de destinació" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "No es pot copiar el directori de forma recursiva" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "No es poden utilitzar els enllaços simbòlics" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "No es pot copiar el fitxer especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "El valor donat per a l'enllaç simbòlic no és vàlid" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "No es pot utilitzar la paperera" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "En els noms de fitxers no pot haver-hi «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "el volum no implementa el muntatge" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" +"No hi ha cap aplicació que s'haja registrat per a gestionar este fitxer" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "L'enumerador està tancat" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "L'enumerador de fitxer té una operació pendent" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Ja està tancat l'enumerador de fitxer" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Les dades d'entrada pel GFileIcon no són formades correctament" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "El flux no implementa «query_info»" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "No està implementada la cerca en el flux" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "No es permet truncar en els fluxs d'entrada" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "No es permet trucar en els fluxs" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nombre de testimonis erroni (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "El nom de classe %s no té tipus" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "El tipus %s no implementa la interfície GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "El tipus %s no té classe" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "El número de versió no és format correctament: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "El tipus %s no implementa «from_tokens()» a la interfície GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" +"No es pot gestionar la versió proporcionada de la codificació de la icona" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "El flux d'entrada no té implementada la lectura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "El flux té una operació pendent" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"No s'ha pogut trobar el tipus de seguiment de directoris locals predeterminat" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "El nom del fitxer no és vàlid: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" +"S'ha produït un error en obtindre la informació del sistema de fitxers: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "No es pot canviar el nom del directori arrel" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "S'ha produït un error en canviar el nom del fitxer: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "No es pot canviar el nom del fitxer, ja existeix este nom" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nom de fitxer no vàlid" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "No s'ha pogut obrir el directori" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "S'ha produït un error en enviar el fitxer a la paperera: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "No s'ha pogut crear el directori de la paperera %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "No s'ha pogut trobar el directori superior per a la paperera" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "No s'ha pogut trobar o crear el directori de la paperera" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "No s'ha pogut crear el fitxer d'informació d'enviar a la paperera: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "No s'ha pogut enviar el fitxer a la paperera: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "S'ha produït un error en crear el directori: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "S'ha produït un error en fer l'enllaç simbòlic: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "S'ha produït un error en moure el fitxer: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "No s'ha pogut moure el directori al directori" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Ha fallat la creació del fitxer de còpia de seguretat" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "S'ha produït un error en suprimir el fitxer objectiu: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "No està implementat el moure entre muntatges" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "El valor de l'atribut no pot ser nul" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "El nom de l'atribut estés no és vàlid" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "S'ha produït un error en establir l'atribut estés «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" +"S'ha produït un error en executar la funció «stat()» en el fitxer «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codificació no vàlida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" +"S'ha produït un error en executar la funció «stat()» al descriptor de fitxer: " +"%s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena de bytes)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "S'ha produït un error en establir els permisos: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "S'ha produït un error en establir els permisos: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "S'ha produït un error en establir el propietari: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "l'enllaç simbòlic no pot ser nul" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "S'ha produït un error en establir l'enllaç simbòlic: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"S'ha produït un error en establir l'enllaç simbòlic: el fitxer no és un " +"enllaç simbòlic" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "S'ha produït un error en establir els permisos: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "El context del SELinux no pot ser nul" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "S'ha produït un error en establir el context del SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "Este sistema no té habilitat el SELinux" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "No està implementat establir l'atribut %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "S'ha produït un error en llegir des del fitxer: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "S'ha produït un error en cercar en el fitxer: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "S'ha produït un error en tancar el fitxer: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" +"No s'ha pogut trobar el tipus de monitorització de fitxer local predeterminat" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "S'ha produït un error en escriure al fitxer: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" +"S'ha produït un error en suprimir l'enllaç de còpia de seguretat antic: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "S'ha produït un error en crear la còpia de seguretat: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "S'ha produït un error en canviar el nom del fitxer temporal: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "S'ha produït un error en truncar el fitxer: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "S'ha produït un error en obrir el fitxer «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "El fitxer objectiu és un directori" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "El fitxer objectiu no és un fitxer regular" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "El fitxer ha estat modificat des d'alguna aplicació externa" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "S'ha produït un error en suprimir el fitxer vell: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "El GSeekType proporcionat no és vàlid" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "La sol·licitud de cerca és invàlida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "No es pot truncar el GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "El flux d'eixida de memòria no és modificable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Ha fallat el redimensionament de la memòria del flux d'eixida" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "el muntatge no implementa el desmuntatge" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "el muntatge no implementa l'expulsió" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "el muntatge no implementa el desmuntatge" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "el muntatge no implementa l'expulsió" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "el muntatge no implementa el tornar-se a muntar" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "el muntatge no implementa l'estimació de tipus de contingut" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "el muntatge no implementa l'estimació de tipus de contingut síncron" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "El flux d'eixida no implementa l'escriptura" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "El flux font ja està tancat" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "El flux font ja està tancat" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "S'ha produït un error en llegir des del fitxer: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "No s'ha pogut crear el directori de la paperera %s: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "S'ha produït un error en escriure al fitxer: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "S'ha produït un error durant la conversió: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "S'ha produït un error en truncar el fitxer: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "No s'ha pogut enviar el fitxer a la paperera: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "S'ha produït un error en tancar el fitxer: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "els canvis associatius no estan implementats a win32" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "error desconegut" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Ja està tancat el flux" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "No es pot gestionar la versió %d de la codificació del GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "No s'esperava un final de flux tant prompte" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "S'ha produït un error en llegir des de UNIX: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "S'ha produït un error en tancar des de UNIX: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Arrel del sistema de fitxers" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "S'ha produït un error en escriure a UNIX: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "el volum no implementa l'expulsió" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "el volum no implementa l'expulsió" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "No es pot trobar l'aplicació" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "S'ha produït un error en executar l'aplicació: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "No estan implementats els URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "els canvis associatius no estan implementats a win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "La creació associativa no està implementada a win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "no hi ha prou memòria" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "error intern" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "El nom de l'ordinador no és vàlid" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Seqüència no vàlida a l'entrada de la conversió" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "S'ha arribat al màxim del límit de la matriu de dades" + +#~ msgid "do not hide entries" +#~ msgstr "no amagues les entrades" + +#~ msgid "use a long listing format" +#~ msgstr "utilitza un format de llistat llarg" + +#~ msgid "[FILE...]" +#~ msgstr "[FITXER...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "El caràcter «%s» no és vàlid a l'inici d'un nom d'entitat. Les entitats " +#~ "comencen amb el caràcter &. Si amb este signe no es vol indicar una " +#~ "entitat, substituïu-lo per &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "El caràcter «%s» no és vàlid dins d'un nom d'entitat" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "El caràcter de referència és buit. Hauria d'incloure un dígit com ara " +#~ "dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referència a una entitat no acabada" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referència a un caràcter no acabada" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "" +#~ "El text no està codificat correctament a UTF-8 - la seqüència és massa " +#~ "llarga" + +# FIXME: "caràcter estrella" (josep) +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "" +#~ "El text no està codificat correctament a UTF-8 - no és un caràcter " +#~ "estrella" + +#~ msgid "file" +#~ msgstr "fitxer" + +#~ msgid "The file containing the icon" +#~ msgstr "El fitxer que conté la icona" + +#~ msgid "name" +#~ msgstr "nom" + +#~ msgid "The name of the icon" +#~ msgstr "El nom de la icona" + +#~ msgid "names" +#~ msgstr "noms" + +#~ msgid "An array containing the icon names" +#~ msgstr "Una llista amb els noms de les icones" + +#~ msgid "use default fallbacks" +#~ msgstr "utilitza les alternatives predeterminades" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Si s'han d'utilitzar les alternatives predeterminades que es troben en " +#~ "escurçar el nom a «-» caràcters. Ignora els noms després del primer si es " +#~ "donen més múltiples noms." + +#~ msgid "File descriptor" +#~ msgstr "Descriptor de fitxer" + +#~ msgid "The file descriptor to read from" +#~ msgstr "El descriptor de fitxer del qual llegir" + +#~ msgid "Close file descriptor" +#~ msgstr "Tanca el descriptor de fitxer" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Si s'ha de tancar el descriptor de fitxer quan es tanque el flux" + +#~ msgid "The file descriptor to write to" +#~ msgstr "El descriptor de fitxer al qual escriure" diff --git a/po/cs.gmo b/po/cs.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b821a4599e21a6c38127fa98b21422f4ab794986 GIT binary patch literal 43927 zcmd6w3AkNVdH1&?iX!tQ(d@Ay)!JIoT12f=2W_>j?f3h?Ywh7o$<6cidA{D~ zS^1x}_Zr{zuJ?V{yVhQL{J5vTHQ?{zrv$<2;OR#N!QfND=j&+@d}US;91ngKJOcc_ z$DexqrN`fRe8xF0-BI9kNPnV_pA8;Ed>;5>a4EPAd;lzfzW`4Kx11XUXMr_v9{46u z^*;*E0lx%Z0say^30yKe2sVT3!4tsW2G0i{1qZ+r+KbOKT152Rl`(5xx@JWv=A&%(vHc)i>JpZV_zXC4>&s-P;F92@?*MJXz zZw4O+L$F3>(eusVncxRN@$Ugp{rw)Oe*D_UkE4;t5uXPt-*Qm-t_PK`25KC3foFqz zK+)?@L8bdKcp`WtgRZF&f+}Yj7=jx><-Z+N{kuT%)%*SPPka2P$6tVI-!TwT`R0L2 zzZ%py-|C;g0#yC)^6x(ds(pU}o&f$5R5?dNtPng06klHnsvWoacneg%`#@MI_z1{Q z1>XWy@3Susf-}IgLFK;`WT=A|gL;2AsCK>wR5_3O=YI<-{Vza`|MMHgm1Z@`trPhJuPOyyt;sCjY+sCK*;WJ(45Kv*XDJ}5ezKw;vK3qkdx0V@By zLGjOLLG|m0;PK!|G)nC~59Cp>78GCK?c*N-HU2*amG4>0+|NMmI zZr)!8s=ZB6<-Y?|dmaU8YVZW8`p#J4+I1tSe%uMFo)7!@-+(6(e>TKW{t#4oF9MGO z%ix*d6sUGT2p$dY2UXr*f=c%^h@y5L>v0LF_HFa=yTG%E|1NkO_(kyf;I~0oG58gz zcFn)c$)TG)-sSPbpxXC!@MQ46!Lz`VFL!eN5>WKM22_8x`sWQ$eEMoo=^q470YB-V ze+|_5{QwldJQv}vbSpqaQ*bMIHuyU5H1I><8Q|wYrgrdsP;@wXRS;|fuL7?D9|9$( zo&X_naQ>ByJy-%&?#Dru`#n(gJ$<$7|GD6~#BTs4k9UBg)5G8_@Kd1Z^*E^UJ&sCF z2iJmnUjjv+dqI`|eo*7}C!pH<4G>WhJnL#?5V#CH6Wj^T0pAX)+|Pij_gCPl;PG@y z^dAH@em8>0g4@A!z?XvR$HSod`N!Zo@TfIG@cZCaa7ytPx%S=T@nLW_&p!c*ZyyK6 z2Pa?a_-!?ahzM#v{s9mX9efqkct3^8)UOl4^TDgZ5Nv=d_W@A!c@z|V{t7%1{C808 zKju2e53@kEe;Fu#xdjycYG4T74~lO-2CBS214V})fuhrYf=Yifo!0oh5EMV%2CCls zKu8~a6kH1a8XN>KTJOeV2-LW}6=bRhd%+O=5jYn-a)V317}Pkt1XQ`N2Staypz3`L z48bSCOTi!ZsCh8~s@=Ol@$^E4=W z{Tvisj^60TYXB5KZ3Jn0PzRX;!Dm6W_nAx*<(mhJ-`0StzXqNM-Vdt0ec-X+H$av5 zL-4ua5u06kCxAx~zX=rmUjjZ8yaQA_Uj;4zKL%b1eh(DAPuk+>b0w($N8oe7SAxfb zyFj&TH+Ta0c@S0$z71;J=iTVqc@@ai4Q>Zj|Hna%+gCx=f7DG*F0KR@5nl@)1HKGY z|L+4s@DWh;d<9hb-v^%uKJ~>;&KwKAfcOQV#y#@S?*o;7FR1)q1l5l3fTHKW`}pZM zyL6X;Dt8m8aTo^0FL#3{gC7D#|7lR;{WDPXIr$cs{z6dYZUL2kCwLASMY`4Nn2gM4Ib;Dll|5{MxmBA3aA3O^D7epAWtVM8pQ41eub-(~E9BbQ35# zeH0Xbd>PcZ{IieGk6eG&gNV+c1}gnN5K;tx1D*sf9dYySdhl%GuK?$O?*m28FL?ZC zP;@wL)aj3<;AO;b1Fr<%3tj*|0bT^2Fy`WGK-Dt|YW&^=if;Qs@xwoXn)m0H+&tU} z4iJAecq+ITRC_)LUIP9MoD0s`?#6u`sQESps{g+aYCivie}3Ay>(}+5+TQ?0*ZV;$ zA5{IH1MdU>6+8~SyX^Y;AgFrxf$G;U!SlfLDlXq8 zRQhMt;U#bzsB!%vsBt)wMyY*ggXe%(gW{iYk8cE3{zpLZ@%KQn3LPJX`_RC#XzUjY6gsPXc+p0sL!F<()U>>b(wJPW&!V<^Hk9C%_fN zpLK_mD_4OR5x)}@AAA(lxcvfDzfO9on{QWv>i=s&)%#&k{P;L1dOZ71NB@PO`cnXx zfv*JhejliEp8(aKXTHqUdmeZq@ok{WZ-Gm|cY><_FF=*^w3oYbF9lWqHc;>143Z>x z3{<(7y~2%e5xkiAE>QLE2i1-zLGi&+uXN?U5L`*T1uh2v0Mxks02E!$c$JIa0G>ts z9#G@+JD|$@26#O98y`RRF4wLl;3+&G^YK^u_(wpM|3y&c1h01Ewg42LUk^&oybM&i z9{|q)9|c!|-vloKPk)W$&rP8EbC<_QK+)w};OXFV?soh#0IEGVfTw}upx(dMs>#`LAB?%zz{qDYW$xB&jC+)gPSMILA~DrD*Zb^rF#?< zy?z3o3Z8qfd%hApj(81J`|biok57O~|8?*(@Tgr5*MaKKeW1$yD7YMa0#toxztPck z6?hr(ZQ%34he6fzDezqIOaA%4fa{4r?>^Vx+rWLqKMuCQ=9^spe*iT@Y> z42gdjJQ@6RAOAimK6>T@j&8F&UJ9PX^R1xDZGhstcYWJ!x(HN1ulMmCpy>4g zsP=spd;$0)Q0dNkhwImB@MPizP~$iWD*XfCMc}7E(fc34rQm`G9bHS{BI0iYRqp3O zmHS`dDd4&9bmgo7#lJ;xBX|#ZHTbun(x3Z~GHm3td_B=}MPexHwj3sn1`1eb#6zT2$>w}GPfd%-inFM+3lKLL*cpY!6;$7YxD2K=IA@K+VHnfoFhcywBk> z@O0uY29E|Oz`5Yvpy>U3p!)SVsB!%jsPS9yTdtiqfExFgf+6^OpxXImP~-D6Q2jaL z{Z5}R0!8O>a1HoQP~-3fDE>U_x7~X3I#Br@1Xb@ecr5s9Q2l()2OQro0hMkT6#aIA z*Mbjw{0XRXmweF8&k=AX@jF4yn@@vt!5@Gs=jh*Y{QpAmYU0;}djFu0KL%b&{Mmcl zxUB=#-@81%&*NjD==ohR1pg5n0FV7$N0+6b=)MsYpVh!w;Ju*Adjz};{F09!{ULnM z#20`{*94ye4iS>SulgS+fpd8I0O5N7>|%ajm?ZT0aqtHONFTh1_wV!1U(fI3`TZ%v z3kmA~TAsZc{5L|8u!Q(tP=B}Z`!B%D!NM-oIg{avQtgi(V2 zK0#Q??;F9}2`BM;o`1KP`0o=WQ{F}R89{&d`S<$0i||z9e+K@g9{9goz%TpX5Bu~N zfv|4y8~^+o;xF>=Ug1&ldp+TF;?MQz1a}kv4ERyPG5mfFVIAR*6(>AKSVsIDa0t}j zCE(ZG&)^7tA4RyE_)_p&;4t|2;CBhh-}89(MIyHmZs+$a{EL|1;^mis$zQ?$c$r7k zPwhkqt^7XKr+qP4_P>?>V!{r>UH;iMddT0EgfaVt?)JFTr+K!I zZw66MHsL1xGr?;~cLjJUp~dfp&-X9Hul2v51HP5`{~-+cXAkmQe`gbz-oZ}^7ZCoN zpg%;Gtx5EIBY9>KPUiPZ30LW%|N9;A3xpBg-wEDNxRx-N_?d<@aX^uP5m5=Y;1FX7j#8 zcsrp+{AR*$5%l*H!av$C_PcohC4Ps5%Loy1{r#Bm1Ys%RRXiI8*AVo#lkhphYY8tQ z=x>{Y;0~YPM-2vYk^B7b=XRv~JkO=?$2y+Bh-d#wxPa$x2P=f{5cK!Y4ot7_@xQC! zzZ3q6u*#QptH+PIj=C}TiBi!WE*aQA~0pXcGazF3p6W&00HQ~iPKaKEd z|6XvU|NSi97YTn#e71jf8u5+(_lLk^2~Q<7{IfstD5#J&_VIi8{d9u4;BHTgPPSD?O z!al?|Mu26!G}6=4(4{~TOL(BH%MFSanam3JQl zPba*9-x~tDFM%CfCSgMZB3uZ4^G!m}9!r|2( zul0DH#|<7gfsJsaRF0aHcv<=FuoVtXHimCIc`L4&9fSog{r)uK1Ri?5u(T3m2-RcKwS&_zFA7K!*j!6;L;nyxE>B% zddvBPw-!sIrDh|nv>MHDDDpI=zM;u*UNA4*QEHCGt!5b4qN*r85L_M(#qoHhP#-68 zJ=}c58fz^Ltw)98WEkx%HJXj!@}Wjk;}o{4rJZ3ht`r!BMm#(oF_gt(J!&)}H?WOX ztrpjt)EQUlGTm!THkwf-xV%{8q0htPVbQ4=TwaM=3}ZYJR-#H=pA75K?X6Osq|G?2 z)#G7`Hqz~=mzt5tRW8&=;g{wZTu_)Ol*)ynGL&_#2phG+a1>l#tCdT`g=UFHtgi_g zOM}ZB)LwEAhv}ZZ6*IQA85X>7ad3IFSuYK>sL|Mi<|PbgapfAJ;j}+Z2t&7`l=RiO zI=F80+O@$Ih2im5&8A0~);dD7>HMlfb#5~pj%$-)kv)v#@EM%x8#IGV&3IeHFgQw%l&Zxr*K+@u zN{XI%G8Ih?dnam|cNzY3<9dFoAL zNWh+@S74NkgL*TRL_n6tcN!LKL6(WAJlVmOX#x{UlJ)bA*(};7EZS4nV`fSlGY>~) zH)BiHQWKsnP4$?FDnxS((lG+eH3a7n6Uog+Bm;^nY9M?x8$qFpWK9O%+v)-yAW1{ft>r8a5sn%M} zjZJvD60CBJ9irJPr7DRU;`xGVSEn-tpp;$%nq(efl2k_}x{=14t{Pl)@u5;I$t9>q zBT*eSF0nPZ;5_tgG4_Jllsj_L^{OceovPTLB^0p;L@=h8DGstWq6%}R99Nfxl^7LM zE{%&-CgYam3{#ITR-jsg373_gsvQx%Dg#5Zz0rgerpc?#QgbpK45P+yp+*bS5(!=~dBj^?NHPr;< zZIxaBrL%3AXP3Ptqg*D&G!MdAvm3K=$!%hJzJTRyvS!OE;$ zZ~AJLVC{rFNfQR51)~eXUnM}E~?WF{(t@#uyK{|KNvbjj= z2qDc_+Om%4CDcHn9xZheHJo#MD{d|e=alu&sQxL`;>NOIwJYO)k?i*^GD9O#YF=88 zSK}R3nvBrGs%7+e?w1v->viIV;o%7DAL+rkdJSSi)x93VT=d$=FCTI*Rghjv#`k#a z7BW3vXoZx2>?^L0E)4@$ZPFG!!Y=U-Q7G0@nK>rVYm>cRr?yn?Ww9ljS$*{CF86LU zYFe@ChFgg->qp{TigE!nW=sX-Ea%+&N?}|tv3`bP7F8(y>UjQjJkf(ps41EA;cRCI zfNA%$SGiIW*_n3FrbCYergAk^`n=0MmZhhr#kK&VOx3P#%Qo_0%VkN7NWYNqK2389kfgycT*C3 z&bWNz>b0e6Yp03vXlFCmnj{5JopqC0D;?aFq^#fz8%dl9UYN)iQL5y}FiDLhit0V; z%dH`Ly!A_pgS`=HGOwA>;Dts*UXC6^iEW)u`c4jSd&eSbxL&FuJ9ACI)6+0{&@n20 zz0;#UXH8(Y)k^T`D8}(<3pb4vx(sz0t+P=-tmjzlm@G);p37P(G@S_QnKRcmms~Tt zQkv>pRab^Y6x5?y8UK)(mrYo~jQ6ZzKO`+ub9ED!hc$lxlgQC(srw9MpJyT}a(W;f>L)0qX9c4}!jVj8x+^|@lD z#;8|Jo6f7Q*R>MsJoQheJ|vW}(Q(h97z-Mv%xDQ+w( zGf&;ZvQX(Rs;2dOL8)b?Tzx2S_v>wGod>YFcXe0VHu;KGJO z#tJyOhA?wkF`C;uUCrdy`I$dtV9q& zdRhC+t(GyJ+YU&JhwDblt;SftLc5bUCac3UPi^@-l1s*!=waEBV;Mb;vNg#Vi$FTT z6n2XZ_}#hSgR44HQcU7W^{W_5!DCyVy7ZzPtDMw5Dz6WO9iD5iy@j9p!Ms1KeViNl zq;k*(S8uefoK-lH&?(nBmD27IlLM5kkz%}~5nO|~%(hjo!4qg>ZDNr{h;u~Ey=AT~ zdgWG|d+Xd_4V#Oabx7|@tK2MUZ;)l`?JaXx(h1`$l8L+AaGUc|zN(Tkn$i~MlBSRI zwtX$$BU#&8UGM8voUxG%S(_qj{7&fA8?j9{v74E07*MHOP0J~}#O(m!B`_m`#v1_! zjbtvFh>_+=CA;m6h6Aqew$qV1J?8aI4Kbu06Yog>ge@Gb7cQP*!iz8Jk+5q}vNdHo zKCXWnOxbqOKvFSnd=L9tv`OD<#`b(5D=49{^Jyws+o+6rPD|5`N9+oBrizEQTy*Qr9Fk)xbT}DqwMcg)Bf$iToHGr zR-om)7Q&irO{cSW&Zk=jY6uG{=>e?SDCo{nN=_9xw|+`Un;G57HI^np=(HPui#eSy zAqwA#kYid#IPr&B4aY}y7!fD+f*x&13(bnLlL!A31^vIZM?O?nLav*LdWlODF+F-C zLOU9{?)c<|kZumT!fJ(5owb1W1m-(`ruou)6xOPyn;lM?i3{4tCRHP5Yh{CymDZjj zq4uHPGitdZ?vWa0$=;Cj-@25++GwO{``Gv~C-lA_hlYmg;DgAY*({N0SlBX(8>W*6tFvaU_wndj-;uFY~L z`&6!0n}cpsF)_TnMihIPfuutZ!FAf5WY|(6p*0nv;W}*q4@J!#GLLO*taE#7T?7?u zugIz0b#Z8i1axx8?KK&d%w^s4gh)V+oWD>W3fAtTz0PhhU2W4{jk7}_5+|BeQP^*_FY>irG_dtSWNK~@@ zHP`39IXOx(QDScupI%&d^(Rd;x{3P3?0P_K^@@R@I_4#|d{(B6K07+1Mj8hqdX2oVHppdUeLC_b%#=F&GfFtl8qk zxHu^@8bzDVE(Pn8bwsQ`Zduz3C)lv+hSex^wh?jv zGN+wSk9ncVD(e~Dv_y^)YPUTluS8~;F-^UGc&oTDJ-`SF}!TT~tW*xn&w$e7Kl@M$ki+AV*V<>l--&JY2r|nPNxj-7z zp?^2VtvceUv$AsFH99y$O{effzfwPIdIA}|hih!KFFy{y&B3%JwJ{q|vw>hI3kC_P}&dAxp zMq93p=!EV;@@pviCHJ&&il7)k?#^kuIh_P{+7@wR;>b+uu6MT8rCE%zc90ZO%n~)W zChkaQXHKym3plkxH_Yi;8eYL80JqCL46@pLzFqw2_E z86n_LQkylAo#*Y!5aV6r%x5Oe%&xR*a%r_i!4`pSoo61itW&O8>W8OL;;`zpWYnC* z^fMW@IX!3=Muoa&c(phfj|_TV%)hoRXY_pA>0vvvy{(2d0l#T2sPS@(J8k1*6Xf@l z=u+A;>jy)N+Ac%QnPhj4?p|f=D3qGDQjtQ;A)iZ<7`W7AXWTk_oxGoKCz|v&_08p5 zYl{p_18h3ZT**RHCrM!kVVoP2jM^d-1=@P;jw!Y$WojaZbuK0?BReaRB*oTi##m}5 z2Hl}S&QGTqJZGCmLF}~KN}{Z`__Tdy&I?99W_s6AXjr9#rhc61MS*7Hftk4JSlVp1 z^Ao`qTT#i`V3Ve8n>AfoHQ*#Ri)?L01{^*{)}EdtEmsR#qLrgUb%DyCLGqDuj3w#T z>od)hq`nbO(FkcK_&zcaMIOdgn>;t-#vAp8n`+5i5Wy|$H*8w7e%*ov3vLaz=G<`T z1nHnf)%ykutx%A9x`iZGA0FlP~K>%gtUz49XGoIrIaI~h?v9f39+E9AH7B-+eE zD7TtQUh>7mR8)_BvxBs%l$ZVTXMn3-d6|8SVO!B1a$I`DeTre{zSE67MoOy^Pb^~C z*-~T~(}<{S9NIDK#Lx*;2m)%@e4S+u56F#DK+zY2;R1(LY&%>-;*1NtJzLB3!>wxx zEyCt`X+=5?tWS90;wZ?LhfeuI?5#WRU})~l)*BEs+a1!mbvuv``|JqPeju%#dyOZZ z=Xjet@O;=g-l##2dc9TCdd0c9d5|13kbHLfCx4i&{k={hph0>kD4XZZ_|JW)0y+H7 zklXYeagJxVPnyWkpol+3$L>29l#$%<2Y)LMr6t>@rPj7=Yph?HlJUvJVL@0b^ex|f z0S9>-*8=aJ$6OZayo+Tl+F2;_F-?Ub>F8+pE1Ey|&YY}9Do3MaOt)22whb`y_>90P z+zi*PzHzP2Zo5g;;H9%Joe1xUIyY{|u&4fsxWXw$w>m{LRHGdxXGidDsaUuY=TpjN zd?hxpa9;Y{`}9-KyrgydHG-K~K`+sfiipxq_>k?KQH)XO#l+Jhed`9bcxx@40l9aH zQ?>3yiF1cY9@uvl@SDE;qZvI2n51AP+EH}r6*fB3oZjp)xjL`s(_2m6cJ?qSH_1=i z)qvKJm#5CrlYL*%?lqZZ>^mzs#CuW1CGFt!gXGj)#jHO_idJ=|DXe~>%+tRFa7u-f<@;M1e!de34N1 z?`{8FS`eozrbAb%c(}=&^8&bmAeEKuKM>q{;U$*@e%IH}aP1->PMHeh??-9)Zp96F$F5eeE{e_*YQ=PE$rknT*msc3Z>SreEf3+DCcWq^r?Q|H%hm*aT@Kw7A!&h31gZ;ACwgQP-)vO!08?4YEjf7Q(hKN4&oGYAwL# z=2Kf1D3FwueUO#!rfj0kWSrLJ|(%fRNB!?nt-j1>wTQOBXLW zpL`3CT+7!lgPV{J4V->DUa}!-*28P#2~NN+uZ>rSqRSvhb#lS*)JhUpM_U{YAKb(# zr={Vlsfe}9^3iHs!8C0Q$}+pmVhiH>=*lCtRhM;Z(Sn6Xu5z+^P;Ql_=DE87XJd(P zKr}Jg5?f)L%2_%!48b2d!K+Z^I7F&7i#AqV$S#TfTrp5x zv0~A@@X~N$xHKH7u3WJ=oHHk^E?;qx9xmeH;$=tPGkosWs})**@- zp5Dvo&02l|#i<5981{8r(K9GBhBIjBJ{sWi)5g|#T;0D5_MvzVuh5){mTQic&H#1g z+Kx+e<*Xj9_4#So!Co$<;Ne;BhJpRNO8$xg5u{;$dOo#+QbW`Gj5-Z=9BeQrlSa=A zjK1^O1DT?AWZd11_V0qQV+qLzf}5vzm*WGU884V$)abOmbl@}2@CY)jGQFo7ZeF+MreMQ?2TR3* zhTbo`AyI3pFmd2Pj>K$<_?}gtwblxi{SP%uRMF(c5VYomML1Ps{pi^>oSNQUD>Ygn z`6ozwU^f+4Bidc0fL2X4SUc1pWIdm7)>U~_6F2SO#S)CYj&T;%OM@+wP3C}FpvK#> zm?5ULTo0wp!W;d~1a>ij4SH_;Nsr2ors&5taS>Ci!1CTwiekoiHd3`ZoKvJrR&VU9 zr8^o0H#Ett!Y4LXD96FNsLbpgk7+yfW-eII)MQ$POF{HjtUKW$UQbPw$+z1^%~k4) zn1CcSjYWFvz-Mf?zT6mR%$Wl23IpS!uwk6j3hm^Aci_6l9%cc_U?g7PgA`({BdMcJ zb-U*PspHbu4m`-zj6<6txZ~TMl<1cBD-LFy$zO5c(lf}@d!`rz$3G=sw`WcUhtK%N zC!5t)6MA9kPL=XvHiW^elU;dSy4l6Hr2d@CVI}q-D!8U*ZR%bARk(`n(9O(}Z_=)e z-FLuUBA(@7ZSf|Qj~XqO9=Z>vn|oZWL8A(<`hQpL z?=GkP)dbs(GT3X~Z3Q<=izA3DB_>}zo@x}vbWA~4C-i%@gp(UoFR5xeYL?xWFbk^7 zCPD2mjl2%F1RcpqCS^c=y$lC<4}|&AyzKAn&y}` zoPM-2+2A?>XA5X|maez>9$~6bE5QTgLTO0RmrJ9CW(yk!7u9wK*WZYMc{_w2MKd*O z7`ikdSU*I^TiY={Xct^kaxeDKDO)W{nQjpC#Kn*~)6FXAE;ssJyywRVWdL^}W9%jb z%q+Ak_7i39-^F@gT6e&9iPT7-aMWf1w{z>X_8lPzL9%By9W z=93JfpLvP^jkjyKZ@i9kgDRIpX+lfkN-IzpOtsG~xrj`HF?xPs0ncDtvC zM9zFp9AR3IH(OBB1aL;qT(V$;QP4D<$e5HgKRoc6>D`b!p|KN$6+g?Y#AFA(0Dih)PRGcPsI!yZ5mJ{wf+*}$r#eF$W$#fReo^1{J(b+Kh+H9U ziPL3NS2EL^ak0BM7;(}^jw(8zQm?S040CH`r{NAf(%DSZdbNTk|sGO(Zkp zt*b$5sLXKRBClR^#WK8zjNQd?>`T5(Hq*;)hHyk_d!5T>yyS(m>ug3W6A%YY>zgs- zgt@{n0onfMl#{i99gZflr8GQ_fnCr-Y~NJmnWC2glq<;cCutCV-K1$xp@SWV=FX`$ z1|UmkjqM3okHIbOR*@VR#zpx~4&2j!*c|;klkts)O`kU3L2t(Bsv^nThYp?TQOIRa zjy^ePqF-sH6Jq8mi|EEegB2K@-6t2tAJ}cO&rI7K`P$!fjX(`!laebie!hgxbYrM_ z$J!J9nxGr+po2@*W3b!a_Ze%qHcLht6IN$DTcJNc+}Wu1)U2%J=As{tQi+k%b7Hk; zox-1{eH)pmBDERIFfX36E+NvMbHZEt;g_bZ|^ zo6b&f=z!}Z4^nSuCQ0qdw98aFRxilBrm=1&m`#Wtl4_!{{z8!4NG6V7R<3=hkxS8E zim%pz@?^2@3UVXu99m8QvdC+@FT^`!tyAm$Via)@r=O&?l3(6WmP=G%Zzh(%wdmGK zrV9$_VCfKf#Bs^Y<|~nWv05&3<`qpXv${Ryk$%l?f>*9J2-2aI-7!e-MUszQ$#Q+o z-6fLmnahxQaNBaE&erTb)*J2-9Q3ducZuLsFTwIm46Y7loq`iTuCThXGnuYz{A_#= zg{#!kq$zCd51p)6intOFyJZ7cQzkcvxXMzoNrh(ouy(VnM69}+a$-^I+_-6$G?Tm( z@}lLcqp0L*N7HkO+%VzlbZby;gt$#I6%WaA&gqV8wq_dNjaIJyoFa52>y@?vh22ilgiHWu z7oaRG(m{*Pex~m9oLJDPIPT8fEz)DiWrZ-K7znq|=c{z`pL(?l^m~7P2;`2HIyLdu zF_Dt{MtW3qkX-)Sk;BWB+&+@ewbAWNm=uw-rJc|A`JD^2`#u~H=?#f2#Ub~^B&J_M z?teRSIb7yLt+zI3;m`KD79^oqI*7#JA1FHC=jdt2b4mP^|TQ80* zo!j7)w>@KR&t)aOwoC1{k`2s`blVk`k7s}XL&eFZ)^Kg< zWBnub%w#fZrjDvvw|I{dT7|0*C&F2`YCmQA(Hh$|OlUclb=p8C6veO|${hTvJS|^GDXx)(P45}Ia z1Vnn#3GQ(EB*!nqk-fKXz$V)E1??aS!p`p!__G|M9JEQw)p3k;fiM7t&2x^iV#hO# zD;XB{y4V7mH=}%qncUrlGP9zU_Tr1OwC#hb5f-~9W2&j9O_WyJY>o%$HWap>*c*Tq zkiCWUCEicxNlOiZj`dS_N-t>ozR+$*MrvQY+x~E?`>vNc9`DXMUY_2|0D1MBjG)e! zk87JVl8ZFmn(WRFN6Y4M3%RW38Vaybk@OExkYudL*1Rp%|!%pUNSLQ zp=ER%y?t}L;!LZeFWK$V-WuCpn&$Jvan9G$W2a2gD_A7!-KMhN8eTAy;{P|7#yY}v z1uEuxE)^=#I$_()OZxWGWihkTWhhR>+x3OBqwb)W-Y~Y`x-3*VtO^)0uW>N*&& z?HHZ4vNInF8KLCr=soN%MQ+S{7m-WQ#T4B+{Ekstb&NJ-H#Sj-6O(?~Z|l+I$kmkX zRnbAo*r*7Z6LDIQdgU;q-y~#Ow3{ZfSd}`hKvI~44B6c-E(Lo#Qb!zX*Edy6ce~f6 zUBzAP{+|!?;MlTmraAn&+tsuuT@UE|OCn!&UgdBMQI!R+@kJBIl{rC*?3YE8^Ru&) z=C)e=E($wMUN`4Yk8GKgJeKjnn%+#8Or@dxy%!heOqQa)5Zhw6Y}xLZw7U*n1qb%o ze%bEiIFd{U&5S8N%hF{qX6#6ONtl(j?bpOM)M-AqDD6>zPF`Y%MCqZ)Tv-M7F?~ak zg5KnC9Fy$EC9kvdgh?G7im_=XKcsW;X^(XxDKOXb-sI>-2)Z%OC#Kpkl>IHa9Bj6R zQAu*@LN)NF!g)1Lf(&u|${7SGk?Fl0(~*13rYK~kYUebPKPJ@yZnLViB8(}qe^=8#3bq7CSERTFNH0(61+FnshI3ULa$-qzaq$nfm{ll@8XN!)*$?P(0NPNpq$#8OEGV~Y9be|#)k_lNYOv#YngQjRtot*PX z66Q|mP6qq$)u}W);M{K8YF@YngtOxO(r}Zm*O*AiJ-wR=uLDS0j7pFBVc@EE$@|iF zHUxR^7-bJm*nKE)MFk#1GPx{Ss_+SJkA(1OvoWs0KF|`FzAysg9Am64=e_y27?=a>Sf2p?4Z9 zYqSjb++{WHrKD_fk|gJaaWB)#l7s0R(}R{La6if>gDj z7CK+MF7?zP2Oj2TAzVj^ic4K3{`#8s_tcYc>~2X%IaZnC$eWyN2)DtNFf0472uxSC z^PTPqCngzJ9gnr@0-G?|xjWwJi*!?mIw>h?W7ibDg~)VrQ-}qqW*{?Rw%u%_X*We> z?)a3y*Cs1gd*rl)dEs--+B!?O+Vspu4^u~&zHDKCGbKs>nA5x#zqrF>FuED^xlcYMCKkFHl7(PU6X(V&N&RFO6dzX z1yFA-PHIk!lANbN>zf|U*q1fK>;tOL_RSeVlN7lTKBw&qlw6zHpW%>tpyL&(XNrlM zxXULSF(-vhl10tnW_*b{TB+l#-4a2EhllNXGVNdmGjy{RM=IQI&Zkycy#>-H`=W^I z(wl8GmD?}3nb3J-_7GKyU0I`hZJa^ZmaA_nWig=|H- z123f2bLFF*&p)i(PI}3^rcNbUZEp4LVMk*3Ew|2$BSLJ|!wBh6pYE)*?`}%mI%>qx zS}9*o+IEcrx%obY&P_im6N~QwT%(dbHhI#`?$@P^=4nm5U@B6Cok07HUv0M)PCz%X z$|8jwWJDJaXGb-L_CGWRMcOHow5CV;^!$BNnym#Bb3`-f3M8&OSPoCQ5{wsdK*Z&= z5!OOtUZb_2(M^m&i7GK1-!35F>{O9EPG{3&dkOhiF|{X2S#f6?f-Cs^&aK8MJ~3J0 zKUVE+t3OOceW`%C%|~h3B(}w8W?v@L1wRZs=ziVeEe_`(ih^tM-;%ftZC*n6C4*hK z6HnNeU2dJyS}?<`^+*SNQ3eBc4bQy9(=yZiw)I(#7htq&V}ku*IYU_M>hx9n(a}Es zpWv1a2i~!I!}P9om+!yV-^D`_-ol^aKy}M*;xVO!+eIIA;&(wRq$k3VrFG7@2i(Nd znUjUbR_^~Hv;T~M_Bp44oUv}PBwGPnCDxUSHvA-S*)h3<8X>jXw?%0Bp7{dm;r5OE z`p*vS#N&bUF8BK$QQxim?-7&!_o7}p2Rz}@aV-{55BAXz#B`muG830>YVLWLn|&iH1Jh1&L}WU! zd)zD=b`5OHB|u0N3kYlcBk*OSYZCqHCZ^Lfy;Dw1vHlmk;eF8r@0At@n7LDp;HH|S zTXk}o?oexT@6Qw~O?#clVY90I^a&~~zwlWjv@yHP*Qbrm2`smkAEDkU>~er`AeT@J zDU9cyw+8esqsS+&*-5Sf_QxLG2h=-pZs({^im7z@3H?ob+rcRRG4O%k4%!HSQ6*z% z_i)pFZkG_GEs=lddN%9MSrqIA0k%ljZV_+s5AsQo{}|AnJ@z*R1@40%@tUcs&bX_i zCoee>ZCjMODF|U<%q-@YQ$lKliN(0DF(kI-^$tk-uDE}s%BxX|i{UpgYH>381 z&YHzu@^g2e7b~<=eW*no_}dc}r}vccGpR>fjI`{dU&*}uJk)(c#v5B}v@TmRrKvMF zyOV-WPCCgJAkVYKvp<^YEH#>;Z+l3W?YMAoj5X74nYZdn$W)V|66t}*IYb6gzb zn_!kJ{zyuzZyS>eQM4WlW3w3a2O{Uy~#Hsnt~+5T;n(>GZB_^ zmmAP?`%R(TtHJD1vZ7n@RYJBp*mhwi=zj^a!S_4e{&&X2%y(E=TmOkY8?Xe{hq=9^ zgi_I@JPA5X0QX6D#1%*W(`+S=X}T7U+WL`64HJ$(;7K-9 zjW*bw8aAyDWu?Iyp2aIwHuWH@dCkRVSzi=0X{L=AnT_D0ch?WIe{Dv=?&#j~gfN5 literal 0 HcmV?d00001 diff --git a/po/cs.po b/po/cs.po new file mode 100644 index 0000000..0911ad9 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,2070 @@ +# Czech translation of glib. +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 the author(s) of glib. +# Copyright (C) 2004, 2005 Miloslav Trmac . +# Copyright (C) 2006 Lukas Novotny . +# This file is distributed under the same license as the glib package. +# Petr Pytelka , 2002. +# Miloslav Trmac , 2002, 2004, 2005. +# Lukas Novotny , 2006. +# Jakub Friedl , 2006, 2007. +# Petr Kovar , 2007, 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-15 02:28+0100\n" +"Last-Translator: Petr Kovar \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Lokalize 1.0\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neočekávaný atribut \"%s\" prvku \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atribut \"%s\" prvku \"%s\" nenalezen" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Neočekávaná značka \"%s\", byla očekávána značka \"%s\"" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neočekávaná značka \"%s\" v \"%s\"" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "V datových adresářích nebyl nalezen platný soubor záložek" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Záložka URI \"%s\" již existuje" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nebyla nalezena záložka URI \"%s\"" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "V záložce URI \"%s\" není definován žádný typ MIME" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "V záložce URI \"%s\" definován žádný soukromý příznak" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Žádné skupiny nenastaveny v záložce URI \"%s\"" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Žádná aplikace s názvem \"%s\" nezaregistrovala záložku \"%s\"" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Nelze rozšířit řádek exec \"%s\" pomocí URI \"%s\"" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Převod ze znakové sady \"%s\" do \"%s\" není podporován" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nelze otevřít převaděč z \"%s\" do \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Neplatná posloupnost bajtů na vstupu převodu" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Chyba při převodu: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Částečná posloupnost znaků na konci vstupu" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nelze převést ukončení \"%s\" do znakové sady \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI \"%s\" není absolutní URI používající schéma \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI \"%s\" místního souboru nesmí obsahovat \"#\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI \"%s\" je neplatné" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Název počítače v URI \"%s\" je neplatný" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI \"%s\" obsahuje nesprávně změněné znaky" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "\"%s\" není absolutní cestou" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Neplatný název počítače" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Chyba při otevírání adresáře \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nelze alokovat %lu bajtů k přečtení souboru \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Chyba čtení souboru \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Soubor \"%s\" je příliÅ¡ velký" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Chyba při čtení ze souboru \"%s\": %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nelze otevřít soubor \"%s\": %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Nelze získat atributy souboru \"%s\": fstat() selhalo: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nelze otevřít soubor \"%s\": fdopen() selhalo: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Nelze přejmenovat soubor \"%s\" na \"%s\": g_rename() selhalo: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nelze vytvořit soubor \"%s\": %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Nelze otevřít soubor \"%s\" k zápisu: fdopen() selhalo: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nelze zapisovat do souboru \"%s\": fwrite() selhalo: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nelze zapisovat do souboru \"%s\": fflush() selhalo: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nelze zapisovat do souboru \"%s\": fsync() selhalo: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nelze zavřít soubor \"%s\": fclose() selhalo: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Existující soubor \"%s\" nelze odstranit: g_unlink() selhalo: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablona \"%s\" je neplatná, neměla by obsahovat \"%s\"" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablona \"%s\" neobsahuje XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtů" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nelze přečíst symbolický odkaz \"%s\": %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolické odkazy nejsou podporovány" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nelze otevřít převodník z \"%s\" do \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Nelze přímo číst v g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Ve vstupní vyrovnávací paměti zbyla nepřevedená data" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanál ukončen částí znaku" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nelze přímo číst v g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nelze otevřít soubor \"%s\": open() selhalo: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Nelze otevřít soubor \"%s\": mmap() selhalo: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Chyba na řádku %d, znak %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "V názvu je neplatný text v kódování UTF-8 - není platné \"%s\"" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" není platným názvem " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" není platným názvem: \"%c\" " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Chyba na řádku %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nelze zpracovat \"%-.*s\", což by mělo být číslo v odkazu na znak (například " +"ê) - číslo je možná příliÅ¡ velké" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Odkaz na znak nekončí středníkem; pravděpodobně jste použili znak & bez " +"úmyslu začít entitu - zapiÅ¡te prosím ligaturu et jako &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Odkaz na znak \"%-.*s\" nekóduje povolený znak" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Nalezena prázdná entita \"&;\", platnými entitami jsou: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Název entity \"%-.*s\" není znám" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entita nekončí středníkem; pravděpodobně jste použili znak & bez úmyslu " +"začít entitu - zapiÅ¡te prosím ligaturu et jako &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument musí začínat prvkem (například: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"\"%s\" není platný znak po znaku \"<\"; nesmí s ním začínat název prvku" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Zvláštní znak \"%s\", byl očekáván znak \">\" k ukončení značky empty-" +"element \"%s\"" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Zvláštní znak \"%s\", po názvu atributu \"%s\" prvku \"%s\" bylo očekáváno " +"\"=\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Zvláštní znak \"%s\", bylo očekáváno \">\" nebo \"/\" k ukončení počáteční " +"značky prvku \"%s\", nebo případně atribut; pravděpodobně jste použili " +"neplatný znak v názvu atributu" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Zvláštní znak \"%s\", po znaku rovnítka při udávání hodnoty atributu \"%s\" " +"prvku \"%s\" byly očekávány uvozovky" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"\"%s\" není povoleným znakem po ukončovacím názvu prvku \"%s\"; povoleným " +"znakem je \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Prvek \"%s\" byl uzavřen, žádný prvek není momentálně otevřen" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Byl uzavřen prvek \"%s\", ale aktuálně je otevřen prvek \"%s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prázdný nebo obsahuje pouze mezery" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument neočekávaně skončil ihned po otevírací značce \"<\"" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument neočekávaně skončil, prvky jsou stále otevřeny - poslední otevřený " +"prvek byl \"%s\"" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument neočekávaně skončil, byla očekávána uzavírací závorka značky <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument neočekávaně skončil uvnitř názvu prvku" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument neočekávaně skončil uvnitř názvu atributu" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument neočekávaně skončil ve značce otevírající prvek." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument neočekávaně skončil po znaku přiřazení následujícím za názvem " +"atributu; chybí hodnota atributu" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument neočekávaně skončil uvnitř hodnoty atributu" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument neočekávaně skončil uvnitř uzavírací značky prvku \"%s\"" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokument neočekávaně skončil uvnitř komentáře nebo instrukce pro zpracování" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "poÅ¡kozený objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "vnitřní chyba nebo poÅ¡kozený objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "nedostatek paměti" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "dosažen limit zpětného vyhledávání" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "vzorek obsahuje položky nepodporované u částečného porovnávání" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "vnitřní chyba" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"zpětné odkazy coby podmínky nejsou podporované u částečného porovnávání" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "dosažen limit rekurze" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "dosažen limit pracovního prostoru prázdných dílčích řetězců" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "neplatná kombinace příznaků nového řádku" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "neznámá chyba" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ na konci vzorku" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c na konci vzorku" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "nerozpoznaný znak následuje po \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "změny velikosti písmen (\\l, \\L, \\u, \\U) zde nejsou povoleny" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "čísla v {} quantifier nejsou v pořádku" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "číslo v {} quantifier je příliÅ¡ vysoké" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "schází koncový znak ] znakové třídy" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "neplatná posloupnost pro změnu ve znakové třídě" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "rozsah ve znakové třídě není v pořádku" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nic k opakování" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "nerozpoznaný znak po (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "nerozpoznaný znak před (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "nerozpoznaný znak pře (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "třídy nazvané po POSIX nejsou uvnitř třídy podporovány" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "schází koncový znak )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "znak ) bez počátečního znaku (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R či (?[+-]číslice musí být následovány znakem )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "odkaz na neexistující podřazený vzorek" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "po komentáři schází znak )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regulární výraz je příliÅ¡ dlouhý" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "nelze získat paměť" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "zpětný výrok není pevné délky" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "nesprávně utvořené číslo nebo název po (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "podmínková skupina obsahuje více než dvě větve" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "po (?( očekáván výrok" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "neplatný název třídy POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "Porovnávací prvky POSIX nejsou podporovány" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "znaková hodnota v posloupnosti \\x{...} je příliÅ¡ vysoká" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "neplatná podmínka (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C není dovoleno ve zpětném výroku" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekurzivní volání by se mohlo dostat do nekonečné smyčky" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "schází ukončovací člen v názvu podřazeného vzorku" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dva nazvané podřazené vzorky mají stejný název" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "chybně utvořená posloupnost \\P nebo \\p" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "neznámý název vlastnosti po \\P či \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "název podřazeného vzorku je příliÅ¡ dlouhý (maximem je 32 znaků)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "příliÅ¡ mnoho nazvaných podřazených vzorků (maximem je 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "osmičková hodnota je větší než \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "skupina DEFINE obsahuje více než jednu větev" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "opakování skupiny DEFINE není povoleno" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "neslučitelné volby NEWLINE" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"po \\g nenásleduje název ve složené závorce nebo nenulové číslo volitelně ve " +"složené závorce" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "nepředpokládané opakování" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "přetečení kódu" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "přetečení přijímaných informací překládaného pracovního prostoru" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "v předchozím kroku kontrolovaný odkazovaný podřazený vzorek nenalezen" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Chyba při porovnávání regulárního výrazu %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Knihovna PCRE byla přeložena bez podpory UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Knihovna PCRE byla přeložena bez podpory vlastností UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Chyba při kompilaci regulárního výrazu %s na znaku %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Chyba při optimalizaci regulárního výrazu %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "očekáváno číslo nebo \"}\"" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "očekáváno Å¡estnáctkové číslo" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "v symbolickém odkazu chybí \"<\"" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "neukončený symbolický odkaz" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "symbolický odkaz o nulové délce" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "očekáváno číslo" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "nedovolený symbolický odkaz" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "osamocené koncové \"\\\"" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "neznámá posloupnost pro změnu" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Chyba při analyzování náhradního textu \"%s\" na znaku %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Text v uvozovkách nezačíná uvozovkami" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Nenalezena uzavírací uvozovka v příkazovém řádku nebo jiném uvozeném textu" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Text skončil právě za znakem \"\\\". (Text zněl \"%s\")" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Text skončil před nalezením odpovídajících uvozovek znakem %c. (Text zněl \"%" +"s\")" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text je prázdný (nebo obsahuje pouze mezery)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nelze číst data z procesu potomka" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nelze vytvořit rouru ke komunikaci s procesem potomka (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nelze číst z roury potomka (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nelze přejít do adresáře \"%s\" (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nelze spustit proces potomka (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Neplatný název programu: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Neplatný řetězec v poli argumentů v %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neplatný řetězec v prostředí: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neplatný aktuální adresář: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nelze spustit pomocný program (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Neočekávaná chyba v g_io_channel_win32_poll() při čtení dat z procesu potomka" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nelze číst data z procesu potomka (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Neočekávaná chyba v select() při čtení dat z procesu potomka (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekávaná chyba v waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nelze rozvětvit (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nelze spustit proces potomka \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nelze přesměrovat vstup nebo výstup procesu potomka (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nelze rozvětvit proces potomka (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Neznámá chyba při běhu procesu potomka \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Nelze přečíst dostatek dat z roury pid potomka (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak je mimo rozsah UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Neplatná posloupnost na vstupu převodu" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak je mimo rozsah UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Použití:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[PŘEPÍNAČ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Přepínače nápovědy:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Zobrazí přepínače nápovědy" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Zobrazí vÅ¡echny přepínače nápovědy" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Přepínače aplikace:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nelze zpracovat celočíselnou hodnotu \"%s\" u %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Celočíselná hodnota \"%s\" u %s mimo rozsah" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nelze zpracovat celočíselnou (double) hodnotu \"%s\" u %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Celočíselná (double) hodnota \"%s\" u %s mimo rozsah" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Chyba volby %s při syntaktické analýze" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Chybí parametr %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Neznámý přepínač %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "V adresářích hledání nelze najít platný soubor klíče" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Není obyčejným souborem" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Soubor je prázdný" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Soubor klíče obsahuje \"%s\", což není dvojice klíč-hodnota, skupina ani " +"komentář" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neplatný název skupiny: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Soubor klíče nezačíná skupinou" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neplatný název klíče: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Soubor klíče obsahuje nepodporované kódování \"%s\"" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Soubor klíče nemá skupinu \"%s\"" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Soubor klíče nemá klíč \"%s\"" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Soubor klíče obsahuje klíč \"%s\" s hodnotou \"%s\", která není v UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Soubor klíče obsahuje klíč \"%s\", který má neinterpretovatelnou hodnotu." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Soubor klíče obsahuje klíč \"%s\", který má neinterpretovatelnou hodnotu." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Soubor klíče obsahuje klíč \"%s\" ve skupině \"%s\", který má " +"neinterpretovatelnou hodnotu." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Soubor klíče nemá klíč \"%s\" ve skupině \"%s\"" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Soubor klíče obsahuje na konci řádku znak změny" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Soubor klíče obsahuje neplatnou posloupnost pro změnu \"%s\"" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Hodnotu \"%s\" nelze interpretovat jako číslo." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Celočíselná hodnota \"%s\" mimo rozsah" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Hodnotu \"%s\" nelze interpretovat jako reálné (float) číslo." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Hodnotu \"%s\" nelze interpretovat jako booleovskou hodnotu." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s poskytnut příliÅ¡ vysoký počet" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Proud je již uzavřen" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operace byla zruÅ¡ena" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Neplatný objekt, nebyl spuÅ¡těn" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Neúplná vícebajtová posloupnost na vstupu" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Cíl nemá dostatek místa" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "ZruÅ¡itelné spuÅ¡tění není podporováno" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Neznámý typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "typ souboru %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Neočekávaný časný konec proudu" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Bez názvu" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "V souboru desktop nezadáno pole Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Nelze nalézt terminál vyžadovaný pro aplikaci" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Nelze vytvořit uživatelskou konfigurační složku aplikace %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nelze vytvořit uživatelskou konfigurační složku MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nelze vytvořit uživatelský soubor desktop %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Vlastní definice %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "mechanika neprovádí vysouvání" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "mechanika neprovádí eject (vysouvání) nebo eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "mechanika neprovádí dotazování na média" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "mechanika neprovádí spuÅ¡tění" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "mechanika neprovádí zastavení" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nelze zpracovat verzi %d kódování GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Chybný počet tokenů (%d) v kódování GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nelze zpracovat verzi %d kódování GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Chybný počet tokenů (%d) v kódování GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Očekáváno GEmblem u GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operace není podporována" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Obsahující připojené neexistuje" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Nelze kopírovat nad adresář" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Nelze kopírovat adresář nad adresář" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Cílový soubor existuje" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Adresář nelze kopírovat rekurzivně" + +# For splice(), see http://en.wikipedia.org/w/index.php?title=Splice_(system_call)&oldid=334434835 +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "splice() není podporováno" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Chyba při spojování souboru: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Nelze kopírovat zvláštní soubor" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Zadaný symbolický odkaz je neplatný" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Zahozené není podporováno" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Názvy souborů nemohou obsahovat \"%c\"" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "svazek neprovádí připojení" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Žádná aplikace není zaregistrována k obsluze tohoto souboru" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator je uzavřen" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Souborový enumerator má nevykonanou operaci" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Souborový enumerator je již uzavřen" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nelze zpracovat verzi %d kódování GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Chybná vstupní data u GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Proud nepodporuje query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Hledání není v proudu podporováno" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Zkrácení nepodporováno ve vstupním proudu" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Zkrácení není v proudu podporováno" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Chybný počet tokenů (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Název třídy %s nemá typ" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typ %s neimplementuje rozhraní GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s není mezi třídami" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Chybné číslo verze: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Typ %s neimplementuje from_tokens() v rozhraní GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Nelze zpracovat poskytnutou verzi kódování ikony" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Vstupní proud neprovádí čtení" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Proud má otevřenou operaci" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Adresa socketu nemá dostatek místa" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nepodporovaná adresa socketu" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Nelze nalézt výchozí typ sledování místního adresáře" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Neplatný název souboru %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Chyba při získávání informace o systému souborů: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Nelze přejmenovat kořenový adresář" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Chyba při přejmenovávání souboru: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Soubor nelze přejmenovat, název souboru již existuje" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Neplatný název souboru" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Chyba při otevírání souboru: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Nelze otevřít adresář" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Chyba při odstraňování souboru: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Chyba při zahazování souboru: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nelze vytvořit adresář koÅ¡e %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Ke koÅ¡i nelze nalézt adresář nejvyšší úrovně" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Nelze nalézt nebo vytvořit adresář koÅ¡e" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nelze vytvořit informační soubor o zahozeném: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nelze zahodit soubor: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Chyba při vytváření adresáře: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Systém souborů nepodporuje symbolické odkazy" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Chyba při vytváření symbolického odkazu: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Chyba při přesunování souboru: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Adresář nelze přesunout nad adresář" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Vytvoření záložního souboru selhalo" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Chyba při odstraňování cílového souboru: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Přesunování mezi připojeními není podporováno" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Hodnota atributu nesmí být prázdná" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Neplatný typ atributu (očekáván řetězec)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Neplatný název rozšířeného atributu" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Chyba při nastavování rozšířeného atributu \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Chyba při prohledávání souboru \"%s\" s fstat(): %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (neplatné kódování)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Chyba při prohledávání popisovače souboru s fstat(): %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Neplatný typ atributu (očekáván uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Neplatný typ atributu (očekáván uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Neplatný typ atributu (očekáván bajtový řetězec)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Nelze nastavit oprávnění na symbolických odkazech" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Chyba při nastavování oprávnění: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Chyba při nastavování vlastníka: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolický odkaz nesmí být prázdný" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Chyba při nastavování symbolického odkazu: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Chyba při nastavování symbolického odkazu: soubor není symbolickým odkazem" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Chyba při nastavování změny nebo času přístupu: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Kontext SELinux nesmí být prázdný" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Chyba při nastavování kontextu SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "V tomto systému není SELinux povolen" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Nastavení atributu %s není podporováno" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Chyba při čtení ze souboru: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Chyba při hledání v souboru: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Chyba při zavírání souboru: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Nelze nalézt výchozí typ sledování místního souboru" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Chyba při zápisu do souboru: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Chyba při odstraňování starého záložního odkazu: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Chyba při vytváření záložní kopie: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Chyba při přejmenovávání dočasného souboru: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Chyba při zkracování souboru: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Chyba při otevírání souboru \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Cílový soubor je adresářem" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Cílový soubor není obyčejným souborem" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Soubor byl externě pozměněn" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Chyba při odstraňování starého souboru: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Poskytnut neplatný GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Neplatný požadavek na hledání" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nelze zkrátit GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Nelze měnit velikost výstupního proudu paměti" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Nelze změnit velikost výstupního proudu paměti" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Velikost paměti potřebná ke zpracování zápisu je větší než dostupný adresní " +"prostor" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Požadováno hledání před počátkem proudu" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Požadováno hledání za ukončením proudu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "připojené neprovádí \"unmount\" (odpojení)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "připojené neprovádí \" eject\" (vysouvání)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"připojené neprovádí \"unmount\" (odpojení) nebo \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"připojené neprovádí \"eject\" (vysouvání) nebo \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "připojené neprovádí \"remount\" (opakované připojení)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "připojené neprovádí odhad typu obsahu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "připojené neprovádí synchronní odhad typu obsahu" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Název počítače \"%s\" obsahuje \"[\", ale nikoliv \"]\"" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Výstupní proud neprovádí zápis" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Zdrojový proud je již ukončen" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Chyba při řeÅ¡ení \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Chyba při zpětném řeÅ¡ení \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "U \"%s\" neexistuje záznam služby" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Dočasně není možné vyřeÅ¡it \"%s\"" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Chyba při řeÅ¡ení \"%s\"" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Neplatný socket, nebyl spuÅ¡těn" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neplatný socket, spuÅ¡tění selhalo kvůli: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket je již ukončen" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "vytváří se GSocket z fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nelze vytvořit socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Byl zadán neznámý protokol" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "nezdařilo se získat místní adresu: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "nezdařilo se získat vzdálenou adresu: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "nezdařilo se naslouchání: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Chyba při propojení na adresu: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Chyba při přijímání spojení: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Chyba při spojování: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Probíhá spojení" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Chyba při spojení: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nelze získat nevyřízenou chybu: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Chyba při získávání dat: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Chyba při odesílání dat: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Chyba při zavírání socketu: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čeká se na stav socketu: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Chyba při odesílání zprávy: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage nepodporováno na Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Chyba při získávání zprávy: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Neznámá chyba při spojení" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Naslouchající je již uzavřen" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Přidaný socket je uzavřen" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nelze zpracovat verzi %d kódování GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Očekávána 1 ovládací zpráva, získaných %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Neočekávaný typ pomocných dat" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Očekáváno jedno fd, ale získaných %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Přijato neplatné fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Chyba při čtení z datového proudu Unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Chyba při zavírání datového proudu Unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Kořen systému souborů" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Chyba při zápisu do datového proudu Unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"V tomto systému nejsou podporovány abstraktní adresy socketů domén UNIX" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "svazek neprovádí vysouvání" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "svazek neprovádí eject (vysouvání) nebo eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nelze nalézt aplikaci" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Chyba při spouÅ¡tění aplikace: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI nejsou podporovány" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "změny asociací nepodporovány na Win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Vytváření asociací nepodporováno na Win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Nedostatek paměti" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Vnitřní chyba: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Vyžadováno více na vstupu" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Neplatná komprimovaná data" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Neplatná posloupnost UTF-8 na vstupu" diff --git a/po/cy.gmo b/po/cy.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6406c4be535f5cc91a00f01a16625778e3874425 GIT binary patch literal 25655 zcmd6v3!G$CedjL*gaC>nB7}!mV5Vnas_7Y?=^kc)dB6l_7+`n_INq+hRb5Qgz0Iwv zsVO5qBAXai1vL0bR*bH)%f>9k;I6yzh2SgE^%3H3+!$Sw)de+KcN6o;=M&?8fB$pt zty|UAGflF)pY(^*zrOdL$N&7#|8@T741aq3;SU7-`~~Gy%3F>Mf=dnyg1>vA-Uh+{ zd`S@SU+^P-@hLds1cxv1_)?Fjd0geO0v<#C3;gqC;EQ65I75 z`Z*g6!Oh@W@YUcc;630v@F8#&_=ljz|6A}3Fg(fC-vVl!HW-5Uf|r4hf)9fK3!DS* zhq!6*%i!7I-}&dMpL5SQf)VfE2yO@e3>4jGL(B$nFE|Un9aR5c1}_DVW3lGI-QZ2& zTRi?bxSr>Yr@472pyu%)xEXvByZ}7>bk+i#1@8y%21D>fm=CLhi$GolyFj`O+8{#* z_kgbeAM)S70J0>(_drMwegcZWCxx!R3aECwK=peE2rGj(f_ncRj~@l~{%ijE8UK6) zgK50e_yy~N%^q(7wN4#S?S9k0{}?EKeH|3vU%;ZN-9~T|cq2FkJ^0O}Se-b0M*~a{{5#xt?So7L_7E{$drPgf||!! zbRxQUgNRs=fs(`fK+*RZa1Zz+@JetyOxq6L3tj?#1H2kMfzH%l#4q*tR#5al0&2cr z0X6PVK!y&^KnS${SAiO@3T^}+05$)wgPQk`K=JP+Iyo7<4uq7T1s)H+6TBLH7~BQ^ z7;xspzXq!RuYj@#KLIuV3=h)(D?yetxEoZx4}+T5H$koA;ViP& z@gz|EJQoz-t_3yTYe3QSTOdmiJPBR{{w25t+c8IwqUyn0z?XrKfG-6<4~lQ!0yUo_ zS=ivJ%3CC6U^)&6LN?IiG2Q0*@O#lJ0J2v$Ab?eRn4 zZyW|+LCt%f#TEbddwiY8U-tMmkMH#OAgFO3^3RWf$MO7e@Cxut;LYF(D2K2Oo&tUj z6n~xuMfc%MLhExPsON2<*7+t-^?nIF75pHm_K$;_|F=N?3y#3Z!h&E67=o__j|bli z%Dz1cO0J&*#gF4QJGnj=)VTBh`F>F2JqcnOgYSaUlVdM+{j3Mo&kf+c;C&z>AB2}V z|9L%#$_H=u_)$>$_%v7pkH6gMdmj|tPlBTRc?hqb=RnEvfL|5x6Cfl6-v{g9ISAt` z!MB5maPUJ=ZUAdvY&$DflPgPVltt*bZQD)7?d6Qq{pW~*_&rQKJPk5|IdMI zc)tx4UlK3`-wsL+e;3ra&w#gqtFL!*_$H5E1zD2dv^_5VUH~<(FM#Uzr{D~@<_0(a zTflWZKLDN&eg+g>e*E9bb(eY_e^Z0Aeh85$drRFcp>;jk7Az2y9iW&eeeSCeo*}QJgD*h3KZX_Zg+I<230=> zC10=i_#tqP=RW{N&ylZkda)WrG=g2A#(N+53h>+D>EK~|-TXpuJ=L;0fSQK~yU^A#!#k z0#)y|;ECXyL5=@D@Fn1HgKGCUcq;e}PB$N7i+`-82Pw@0L%G>?hTfw_1|C;iBN=W%M<=<1Dp-8UEKmWx) zd;}Daub_O1GDj)@NWS%R2L-XUpG)`+E6jEr?OvH)y^X*BtAExyNcR$o@gDpr(3)8 z`~15_k7hIY8@FM4{SN>BPVhd;pZez+@I#c;KMUSO`KEvVbMOfYVr%xQ>EC}CyqoeA zQS|d9Mf&>RDXS@)DY9Ss`7GsL$`>jBfij?6 zN_h+AbjrV=+(vmH$B6`jnF>$5QrE{vG9Mihll? zgWzYtZ&7Zdyqoey%73FgO1XjZL&_R~r|G_Sly2;&3IPPY?Wwz$}8R-Ea-)HM6+dO|wCm?q?~B$8w$JzjPMkYBOq?1m!KD6AF4A^%i&b zb<;)r9Iop48nqNT$)bL!8HLD1V{bFvi_j!V+}f*`dt1#U-rHd|Nn_=Wy6N7ym|Pp8 zhqIYHIdOeh#}5QMdReErKW+`iI8;=y)s@n$vzgiB$oh=d%u*OX!dR_DHBDeRD}rFn zN7a39&AKTcU|Za^XLY2?i&2JT*3#a5E0+58{1Qt<9AAgEnn^cq!2D&ab+cZA=)~a_ zJL5Jhzav@fb+7Nj_;#?xtwM-ex0?x-I$EGe1a!5~g=(v&SAP@WIxCtqVkfkFwpZ3) zc&Hi|mnvj&JZ7UWoS*xEF0<WZX&WgwqC1R-X5!! zDUXCOJY!Yoj8b)zYA;=gfema!_@SOd)maJG)@|E&?AjJKvb47-sqIG1qyrzb7`q7P z(j*S&S^Vlkur;mr%(TNU*xF0t0~iQq1GA<!k!Yd}l9eb;3@w0b7QygEc7ZmsDzw zRV=+SaX#n>kkzb7QmSd&s6aUuv$Ps_I$AqEBl%U?$`y4pPR|M(jd-_%F(fCqaEO)M z3v{E#^h!oEpJ+ad7N&Xm;9Bp4_HaiJHE>I!C6pmVeGw*Bvbs;gx$)o~^cN(0!#NDs z?$8S*y~sh|H%X8c~abaC9Bc(TSVsX>6ik>=~U}uFH%d zzHMC9Id{{r-?lj8Vilva6tJv`ryJAZMmgwBYlkgFZronP79en5L6H75LF!=>Hgqwn z#?+r|y~DEo47T~;$TU_xS2cs$x)8r^Ou;*0DZBJ-tCq7z!H5=p+4d+?sqSbm!8RkG zZe`J?R?kggpkk~gYiYqH@0-};D2r#EX$x21*-N`~;p&!tHS{Z5OgnSIHrK~LAtUT5 zGB2Hb7az**OVWN4Y|An&9DJ6UkV!SW=U-!IyLvAlZ3b|0FzIvQ-%B5BJq0il2|T^L zK#|o<^}#xXSr4a5nT4 z9DXYGlAD}@e3POH70lB}!j}0~daYnZq@@;@%7r*q%46juj}KFPlbak{f{Z9-(p-!8 zDUNbU8`e7?tVA2CE;JItsj=EJFa$?I8 zd-@rQ&Ip7G!^vyMkyGUibhU_0=3}T)tc{#C_VyAnX3biHS{T49=-6(5sz<0(gvei` z(iW~+)mdAvXExhd=mf5AHgMT)rJ)3#VtFB;rBU7I#U>$|!es>qy~OrTOw>#~yg`C| zs4z}Ve1HuB{f|~s%(b$bW0T9fTZmf(oEo%|MeXsfAavivccWB{^^Hv#227oh{a=YG zbpqG!ay)EDev{@H*yee;s^)cyevPGGYG%WFOgnLwecGgqd>Z` zY@K4Q$5zaGQJ6O3p(d$d7CVJkq{CKIVNz3jPD$uN1=_52NwsA=oP;*W6Ud`4CuKQhhgRB$Cm zVwm39vE0UfG=iK^Z6w0n;Zue;uuH$#Z?9`?_zy_eCZw zC^{W>V@Y7LQ2*$T{&DnZBk6i5P16VWCf^fgBSt$Ox#{@oQOGnauCv9cnXPmDTjw@) zmQa|`SuZIvHboBJIv>_8GFj$qhKsUXjhx$u`aZhE6KcCmmD|L+$plx&^{!=e$pE_i zBO6t7NXUyB^!Z+$R9vvL>5?Xea`;T+t~A`aW9K$ICLq0AhnJSZl^>XxxDIF$m6Fv) zj#Sny0Rbt|CAmM6aHAcVfYZ3tE2(R9y?IhxeH%YXA`tp8g;M2V?p)Otv*vz_5?k!} zr3dqJ`lSgh+foN2E^s6rK}u4jV;krbS;4^$8_JejeqEFpQ!xjssWX#2@|HaauBnyN zjGAdFcflFTB~y8BW+Wr#ST>f{KV)Z{N(VA>pt3hwF7rT@JSU(`h_U=ow9y^@d+OX} zdUZml-p1%OMRHq05}M=#OZm0AB7`cZWOLIuw3hI-+{_l^5cBuREoCcWj-m*wCnqBN z3&=yGY5PoP1SIjptd`lAu_*=D5c#5|rLs28Y~e++sfz?A~(SHVi#EHujy^ z9k-=J_N5ha(%7tvwI`roOSt$hSJ<$qea-bdZZ_s1W|CT$x)~Dab5jf|j=DO*?(r1= z(9sXQl*Mhqwc@6a8D!pcnp94ig<`j3j94CAzmWEIfEH@k^3Y%NwA73VHS@AaZ%^`50M{ z^!Q!06DBRKQ+KnC)#-4}9;Fo3PT$na+HyDLoNG9BTS5^J?jLct4h1 zWFW@Q4P!nR9p0FgLf>5IQL;Oo(Izn6S6=d7+>zeRchZ)&!WyP$DIVF8Gi1`v2s_mU zj&-eV9>2*1s7687*cdw2aA$|ZD*0({GpV+Emd&3!lf|Hy#i+Y5bR2XwPL?VJdz4+V zPbC472`5A1+c=e|1vey-j?!zzr%M`XP%X_L%XJl;zgiB=m;jcqNQ2g^4nc9Hnw3f8K_@iyX1A zHIa9>5VhETqWI;+2Q(E!7yWe@v8uGeA)C7mF-ui)r-S6#(ard@ z^6%>`QLnE>iXUn%d+Vp}(khzY$ei5SSYCCQkj&rMZHF5Y(`;60)NIL(D_f*PK?@pL zfE0Pouo~F&ikSgt1))ZwiA;5(Mm!tbXrX~3IUoP$XL$tMMTpReql{F91qn3B&vYk- z<*5ZaHn(GbX5Hs0%X*7)QtA91NO0itGP!^UEBWAb;Xy>e!~BP%NQxSTBPYwbL3h_|0{IOuPm&XN z=uH3ZG4DTFPI^OA=2_75=3=+SM#d-?KIR|Xvh@-snKqK1%$z?nL&eH<@&2aH3yOL(KVMnDp|W9p zxc>av3obl|b~8s`&9Q3*Kbmxis?uyW+!1%WgCyLY4Y;7Ou{LOtKTj`hw8`vGBea`n zku-W3zRDi%kj#cR#VvgB#zvC1<4SdKDLLUre~?ULM0*FO)2uPw+qdax?IVXXTt7W? z^cL0`1*q)7U(Z?~buNKjlXFO|1Y5jIY)?O|CmPwUR<`-uZ?oaW^UZES&TLp69KE~M z%c53gdz!Uz>dB%#b}re#p2PmUWKD9(B^%a;o5S_tY&bJ_^v#tkIB6!X*VJ!pX59$g znVG%-0=aM(wHsWtBaKV)q}dv9aPeF(++oZXNJqxamiCeM1nR0?-0T*(i>>9L??PI5 zpQP;5HD1Vr{z!B}&lL%)HihFyBYSLUs|#7wBW~>zE7ap8nAFc$N4lO@qmjE)=Xxv# zUZ&sa|92hN23&J9Utg;=+nTRtV>AZ``Q|Rwai?w}o)6cAQ6tS*rnD7Y-5S(0@sG2y z#sF~%2gBTex}Q&})(qojhph~Iw@!1Az>ez{A}&NEvnXUUt#S3Q=BUy+I-GS68Z2%~ zJ~_Ot1v}&JLJxbj_{1aR99n}0aY9(j(oX)ce2ug=*4&9ml+DLTS|e|m#XT=PXw`f_ zgDOmKGJscoy9?$>X!Mh~r_@fy#xs$;RwWnAb|gYnR5xa0{tFB3h3& zrBY5-qn}01g4=`>{Z111Q6v+(eujEBU}@N-jq*w;ytG4`LeCyf>r$1b#66-d=?@UV(e_$7GI8Ab%qn&_k5h+sUwMA*8RrKL$S)+D=ELiC(z!Y(E>W#) z@O0y(65^b|yj|)qt3V@aAbP3`gM{FnE#7e5r5)VsW2KpwUuhUtEVvPG`W@O0Jj^sf zo`_YN&lC(=ojmHm$Ch12*fxxvd$38)m88o>3{62mv;0 ze^1XoA~V4`Wj<}6nj~XeyTv|Y! zi{o`VcMv;2VrU_#+HWsLy6sLk^pi8lw4Pw05%oxhlT;|abYvQG=7Jb0EYf@iM|=!; z@Xi#o>AtjEh>0BqSM=kSSghNRHME#n>!KewqH(5nU3ux9zR2I|6ECbCGT;KSQPZx8 zxNiUd8+ErlvICBUvR_IT2A%mqhq-INYMvdvbEeuZvW4YOY>R#D=Bg?PkkuWjL;|pv zM-pa|OMTahP-6T`V?d?{i`O3zqeN&4BI9rUncrwez40bCP<7Dhw^|%6SpHj4%Xl>x zaakw&l+%g~C}qX0SFzY!eJ7r=yMT_|^5;^I{EG+gq`A5{^g5*}n)*9eCvh$hY3v<- zU-Bsrn#limns@@@qf*DU+>;)p^U*p>259ujA`uf5%qaJtf7CJ0#0n!J=90cgzPgB> z2z5!d>O!9@dR(4UaJuAc+QFFuXq%(P5)mm+J6lM7)GQrF=-4te z?z7ou9HDoF?ja0<$FcI9J2A4zDKKNO{cV!hX$a zT<%?}IDah$NAO7k#42BBjhdl%C)R{DQ6x=GCWyRfdFzAV3^ zh-i^^BOBDL*Sor<$S#Axiqw-j!Hug62+kH@S=8ss2Yl7^^VPB&42nX^LbkG6qaspt z*ldte=Js#iv(tfGd?$(wrNQmv$6g&0Jp#LR?=pW8zYrEPd=ab&&A(wVm}DTkyazrFaJ+qr9u&$*eu&*<7& z{OgRLnV7QBY_}{7Z-^&@t;*cN1xc#j6VZnLAIwrt|W z90}4p%xl0fA8r%i%4Cf;8>?zb5YFT~UG~U6gB#+Tl>IBx7+x+ISo%H^Xf||0JgGT~*$E$s4&py=>Ud-d8j3+uJ?_$I9=OJAk2< zlpL>321t3!ysq^!q}SIDCz6U=4=&5t+L|x7>=MSo&bWDp*S8F!za4os0VWGybVzss zf$heirSmu!sBS5Rlg@GBKgt9<`N^k3ce#Wp4?$ue;V4l%Jlg=0#Icw*ShkfGiAx;= zA{N@@YvlWJ3H#+6i+s;hTkL@jK;4Siv+dGw&rC#uMxqKAP9_P_VX!QTxIDQmW#gUy z)9uWsRQ)V%=1h%^C`>iAILIXP6>{2QbIc9E{1YE2_*-$EuY-qlYAp7DD>-zK{!PH# z`HNd>7NOxYdX}lwE|>&l5eDQ7I`FEcR%88JI?*}ST=>QoYncX&!{jhP`5?wCWO!sS zcK}n^^}H_C%IOM6Ucm7k&K{4;VNhZx84|8yTj^r>c>-^|d%hbQ(O79NI%g*VTd}-$ zyks{vW#y(!QtLXYO7m=Ux$CP2s>rKv6i`6Q8*T3s%)}mI;$!B0R7uq zR)74c#rQ2kich(q-eRpufM@|Ui=Lt;mV^VnoHXb7{BhkN&llLG&|s_gh^__h z%I%^o84p9mvC*WMT?Z|)v?64f$aBkJYf>CaE#H$Cn*U`*vF#vWh6)L+@@g)7WQieZ z$u25SriUIB7U>QsY_>dj-jn+AaxFP2XhOYdF<<18VID^=+$Wn0WBnfx2pRIEy|`%- z>Fl+6RFk;jte2;)HmDO~K(>N-l8A_iWw-54tz{@OHpJexNq2{xPG)8K$bf&&>-Sy+ z0EFbsT%mOF(xswI2JGO^u6ugDYq$-x>2$uk%DAS%XPr4OES4n844Gv}8#-R{rs#vCT7$t~<{v=5(#LS6K=IX;6v$c2x60$Cq zGQL~7cHFS#D}rrHP-3>`^LYly^CADDypWx|=I?WUa!!_Wk?ApjJKq~Q&LO%VkSWu@ zg&Zc!hGcS;B;%iLV#jhLo!feUKh%x2v|16YBvN?Wh2e1QxW#PS6(c7so*VQHugc~j z=K|>r{HvJR3s+US_i5z#q_k^2y*8NGsTXA~jxN_MPi}iEAOdAJ%~J-)Q*Fs@)|c~# zkp%bEm))?0H&)GfFY$3wgF+&=$O_`dQ-{cTrCoBghHLXgJhAn`Xz zeSflZ=&28UjiKdUhC|rlyE}2T;{eslt#M3l$~auC8J9^5stEQ5^DfURLj0q78i}%O z{P4WcXU^OvhkTbm`RDM#IfY)a<@D*F{J7aS#Ay`UFjUcbKf)I-Y{1*G%EP`~Jq&c5 zVcC>3vXi}RA#T>1%x>rda}PaitBxHfN@>5+bq4X!9ReDUWDbWG+o$7(b>Ps*-GPzY zrDj_5h{XJy9bk;44qUc(q{HHR>1g}$tb@xZOlUuLwR8{OXV||}EobZWcd+!cjx>j- zPtFZm)qE^>fZ)ypay!pzxtvIz39v(7?PAf4$e%eVM%Zo$eyTQUvYg^ROpI; zFAVx@tVk85GF#A>-#fj2$4$k(Q~Z*1OS0Piwp}|N`YQj@ZVVA*+0_MkM_8+fK(mT4 zW4zINFw6pXcI{}UP^oHesl6)=8Wgc~iUTz%rPTEGPpGPDD7 zZQgBh5h&{gUeutP)SK%|nL`-^h#`s&plzfQq#c;}(#2nQO)->2LlVTDkMe`nScVWT zocayE_bImPTI+3$H!9p34{l%bs%&p^%cp3K$+h`^#&IA!yuAZGwo!JsPnlcYUGK0P zr;7QM48$Fcv6aPQ=dBZlflDUz0$oD0>_V&0Yps*N9yA=xRVJ4AOWm3w)*Y2k!Ot#kKD02sFs8nfK_U6SP`rs!SsiM+WD, 2003 2004. +# Rhys Jones , 2003-2006. +# Iestyn Pryce , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-12-21 14:56+0100\n" +"Last-Translator: Iestyn Pryce \n" +"Language-Team: Welsh \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cy\n" +"Plural-Forms: nplurals=2; plural=(n==2) ? 1 : 0;\n" +"X-Generator: Virtaal 0.5.0\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Priodwedd annisgwyl '%s' i'r elfen '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Priodwedd '%s' o elfen '%s' heb ei chanfod" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag annisgwyl '%s'; disgwyliwyd y tag '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag annisgwyl '%s' o fewn '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Ni ddarganfuwyd ffeil llyfrnodau ddilys yn y plygell data" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Llyfrnod ar gyfer yr URI '%s' yn bodoli eisoes" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Dim llyfrnod wedi ei ganfod ar gyfer yr URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Dim math MIME wedi'i ddiffinio yn y llyfrnod ar gyfer yr URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Dim baner breifat wedi'i diffinio yn y llyfrnod ar gyfer yr URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Dim grwpiau wedi'u gosod yn y llyfrnod ar gyfer yr URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Does dim un rhaglen o'r enw '%s' wedi cofrestru llyfrnod ar gyfer '%s'" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Ni chynhelir trawsnewidiad o set nodau '%s' i '%s'" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Methwyd agor trawsnewidydd rhwng '%s' a '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Dilyniant nod rhannol ar ddiwedd y mewnbwn" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Methu trawsnewid '%s' wrth gefn i'r set godau '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Nid yw'r LAU '%s' yn LAU absoliwt yn y cynllun \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Ni chaniateir i'r LAU ffeil lleol '%s' gynnwys '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Mae'r LAU '%s' yn annilys" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Mae'r enw gwesteiwr yn y LAU '%s' yn annilys" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Mae'r LAU '%s' yn cynnwys nodau wedi eu dianc mewn modd annilys" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Nid yw'r llwybr '%s' yn llwybr gosodedig" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Enw gwesteiwr annilys" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gwall y cyfeiriadur '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Methwyd canfod %lu beit er mwyn darllen y ffeil \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Mae'r ffeil \"%s\" yn rhy fawr" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Methwyd darllen o'r ffeil '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Methwyd agor y ffeil '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Methwyd darllen agweddau ffeil '%s': methiant fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Methwyd agor y ffeil '%s': methiant yn fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Methwyd ail-enwi'r ffeil'%s' i '%s': methodd g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Methu agor y ffeil '%s' er mwyn ysgrifennu iddi: methodd fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Methwyd cau'r ffeil '%s': methodd fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Methu tynnu'r ffeil '%s' oedd eisoes yn bodoli: methodd g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Mae'r patrymlun '%s' yn annilys: ni ddylai gynnwys '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Nid yw'r patrymlun '%s' yn cynnwys XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u beit" +msgstr[1] "%u beit" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Methwyd agor trawsnewidydd o '%s' i '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Methu gwneud darlleniad crau yn g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Data dros ben heb ei drawsnewid yn y byffer ddarllen" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Mae'r sianel yn gorffen a nod rhannol" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Methu gwneud darlleniad crai yn g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Methwyd agor y ffeil '%s': methodd open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Methwyd mapio'r ffeil '%s': methodd mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Gwall ar linell %d golofn %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Testun annilys wedi ei amgodio fel UTF-8 yn yr enw - '%s' annilys" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "dydy '%s' ddim yn enw dilys" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "dydy '%s' ddim yn enw dilys: '%c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Gwall ar linell %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Methwyd adnabod '%-.*s', a ddylai fod yn ddigid o fewn cyfeiriant nod " +"(ê er enghraifft) - hwyrach fod y digid yn rhy fawr" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Ni orffennwyd cyfeiriant nod gyda hanner-colon - mwy na thebyg y defnyddiwyd " +"ampersand heb fwriadu dechrau endid - dylid defnyddio & yn lle" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Nid yw'r cyfeiriant nod '%-.*s' yn amgodio nod a ganiateir" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Gwelwyd endid gwag '&;'; mae & " < > a ' yn endidau dilys" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Mae'r enw endid '%-.*s' yn anhysbys" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Ni orffennwyd yr endid gyda hanner-colon - mwy na thebyg y defnyddiwyd " +"ampersand heb fwriadu dechrau endid - dylid defnyddio & yn lle" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Rhaid i'r ddogfen ddechrau gydag elfen (e.e. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Nid yw '%s' yn nod dilys yn dilyn '<'; nid yw'n gallu dechrau enw elfen" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "Nod od '%s', disgwyliwyd nod '>' er mwyn gorffen y tag elfen wag '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Nod od '%s', disgwyliwyd '=' ar ôl yr enw priodoledd '%s' o'r elfen '%s'" + +# c-format +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Nod od '%s', disgwyliwyd '>' neu '/' er mwyn gorffen tag dechrau'r elfen '%" +"s', neu briodoledd ddewisol; efallai defnyddiwyd nod annilys mewn enw " +"priodoledd" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Nod od '%s', disgwyliwyd dyfynnod agored ar ôl y '=' wrth roi gwerth i'r " +"priodoledd '%s' o'r elfen '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Nid yw '%s' yn nod ddilys yn dilyn y nodau '" +msgstr "" +"Gorffennodd y ddogfen yn annisgwyl, disgwyliwyd ongl-fraced caeedig i " +"ddiweddu'r tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw elfen" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw priodoledd" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i dag agor elfen" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Gorffennodd y ddogfen yn annisgwyl ar ôl yr hafalnod yn dilyn enw " +"priodoledd; dim gwerth priodoledd" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i werth priodoledd" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i dag cau'r elfen '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Gorffennodd y ddogfen yn annisgwyl y tu fewn i sylw neu gyfarwyddiad brosesu" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "gwrthrych wedi'i lygru" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "gwall mewnol neu gwrthrych wedi'i lygru" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "allan o gof" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "wedi cyrraedd terfan cilio" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "mae'r patrwm yn cynnwys eitemau na chynhelir ar gyfer cydweddu rhannol" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "gwall mewnol" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"dydy cyfeiriadau yn ôl fel amodau heb cynhaliaeth ar gyfer cydweddu rhannol" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "wedi cyrraedd cyfyngiad ymgylchu" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "gwall anhysbys" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ar diwedd patrwm" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ar ddiwedd patrwm" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "mae nod anhysbys yn dilyn \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "] terfynol ar goll ar gyfer y dosbarth nod" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "dim byd i ailadrodd" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "nod anhysbys ar ôl (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "nod anhysbys ar ôl (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "nod anhysbys ar ôl (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" +"Mae dosbarthiadau POSIX a enwyd yn cael eu cefnogi o fewn dosbarth yn unig" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr ") terfynol ar goll" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") heb ( agoriadol" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr ") ar goll ar ôl sylw" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "mynegiad rheolaidd yn rhy fawr" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "wedi methu cael cof" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "enw dosbarth POSIX anhysbys" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "gall yr alwad aliadroddus ailadrodd heb derfyn" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "gwerth octal yn fwy na \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "mae'r grŵp DEFINE yn cynnwys mwy nag un cangen" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "ni chaniateir ailadrodd grŵp DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ailadroddiad anisgwyl" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "gorlif côd" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Gwall tra'n gweddu y mynegiad cyffredinol %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Mae'r llyfrgell PCRE wedi'i grynhoi heb cymorth UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Mae'r llyfrgell PCRE wedi'i grynhoi heb cymorth rhinweddau UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Gwall tra'n crynhoi'r mynegiad cyffredinol %s ar golofn %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "yn disgwyl digid hex neu '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "yn disgwyl digid hex" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Cyfeiriant endid heb ei orffen" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "disgwyl digid" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Nid yw'r testun dyfynedig yn dechrau gyda dyfynnod" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Dyfynnod heb ei gydweddu mewn llinell orchymyn neu destun arall wedi ei " +"gragen-ddyfynnu" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Gorffennodd y testun ar ôl '\\'. ('%s' oedd y testun.)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Gorffennodd y testun cyn y darganfuwyd dyfynnod i gydweddu %c. ('%s' oedd y " +"testun.)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Roedd y testun yn wag, neu'n cynnwys gofodnodau'n unig" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Methwyd darllen data o broses plentyn" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Methwyd creu pibell er mwyn cyfathrebu â phroses plentyn (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Methwyd darllen o bibell plentyn (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Methwyd newid i'r cyfeiriadur '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Methwyd gweithredu proses plentyn (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Enw rhaglen annilys: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Arg ar goll yn y fector argiau yn %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Llinyn annilys yn yr amgylchedd: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Cyfeiriadur gweithio annilys: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Methwyd gweithredu proses cymorth (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Gwall annisgwyl yn g_io_channel_win32_poll() wrth ddarllen data o broses " +"plentyn" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Methwyd darllen data o broses plentyn (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Gwall annisgwyl yn select() wrth ddarllen o broses plentyn (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Gwall annisgwyl yn waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Methwyd fforcio (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Methwyd gweithredu proses plentyn \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Methwyd ailgyrchu mewnbwn neu allbwn proses blentyn (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Methwyd fforcio proses plentyn (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Gwall anhysbys wrth weithredu proses blentyn \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Methwyd darllen digon o ddata o bibell plentyn (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Nod y tu allan i ystod ddilys UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Dilyniant annilys ym mewnbwn trawsnewidiad" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Nod y tu allan i ystod ddilys UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Defnydd:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPSIWN...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Cymorth Opsiynau:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Dangos opsiynau cymorth" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Dangos bob opsiwn cymorth" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opsiynau Rhaglen:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Methu gramadegu'r gwerth cyfanrif '%s' ar gyfer %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Mae'r gwerth cyfanrif '%s' ar gyfer %s y tu allan i'r cwmpas" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Methu gramadegu'r gwerth dwbl '%s' ar gyfer %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Mae'r gwerth dwbl '%s' ar gyfer %s y tu allan i'r cwmpas" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Arg ar goll ar gyfer %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opsiwn anhysbys %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Ni ddarganfuwyd ffeil allwedd ddilys yn y plygellau data" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ddim yn ffeil cyffredin" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Ffeil yn wag" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ffeil allwedd yn cynnwys y llinell '%s' sydd ddim yn bâr allwedd-gwerth, " +"na'n grŵp, na'n sylw" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Enw grŵp annilys: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Nid yw'r ffeil allwedd yn dechrau gyda grŵp" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Enw allwedd annilys: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ffeil allwedd yn cynnwys yr amgodiad '%s', na gynhelir" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nid oes gan y ffeil allwedd y grŵp '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ffeil allwedd heb fod yn cynnwys yr allwedd '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Ffeil allwedd yn cynnwys yr allwedd '%s' gyda'r gwerth '%s' nad yw'n UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Ffeil allwedd yn cynnwys yr allwedd '%s' sydd â gwerth na ellir ei ddirnad." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ffeil allwedd yn cynnwys yr allwedd '%s' sydd â gwerth na ellir ei ddirnad." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ffeil allwedd yn cynnwys yr allwedd '%s' yng ngrŵp '%s' sydd â gwerth na " +"ellir ei ddirnad." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ffeil allwedd heb fod ganddi'r allwedd '%s' yn y grŵp '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Ffeil allwedd yn cynnwys nod dianc ar ddiwedd llinell" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ffeil allwedd yn cynnwys '%s', sy'n ddilyniant dianc annilys" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Ni ellir darllen y gwerth '%s' fel rhif." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Gwerth cyfanrif '%s' y tu allan i'r ystod" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Ni ellir darllen y gwerth '%s' fel rhif arnawf." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ni ellir darllen '%s' fel gwerth Boole." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Mae'r llif wedi'i gau yn barod" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Diddymwyd y weithred" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Fath anhysbys" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "math ffeil %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "math %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Heb enw" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Methwyd canfod y terfynell angenrheidiol ar gyfer y rhaglen" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Methu creu ffeil penbwrdd defnyddiwr %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Ni chynhelir y weithred" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Methu copïo plygell drosodd" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Methu copïo plygell dros plygell" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Methu copïo plygell yn ailadroddus" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Gwall wrth agor ffeil: %s " + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Methu copïo ffeil arbennig" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Ni chynhelir sbwriel" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dydy enwai ffeiliau ddim yn gallu cynnwys '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "Does dim un rhaglen wedi cofrestru llyfrnod ar gyfer '%s'" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nifer anghywir o docynnau (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Dim fath ar gyfer enw dosbarth %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Dydy %s heb ei ddosbarthu" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Enw ffeil annilys %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Gwall wrth gyrchu gwybodaeth y system ffeiliau: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Methu ailenwi'r plygell gwraidd" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Gwall wrth ailenwi ffeil: %s " + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Methu ailenwi ffeil, mae ffeil gyda'r enw'n bodoli'n barod" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Enw ffeil annilys" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Gwall wrth agor ffeil: %s " + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Methu agor plygell" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Gwall wrth gwaredu ffeil: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Gwall wrth rhoi ffeil yn y sbwriel: %s " + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Methwyd creu'r plygell sbwriel %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Methu canfod na chreu plygell sbwriel" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Methwyd creu ffeil sbwriel: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Gwall wrth creu plygell: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Gwall wrth creu cyswllt symbolaidd: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Gwall wrth symud ffeil: %s " + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Methu symud plygell dros plygell" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw priodoledd" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Gwall y cyfeiriadur '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (amgodiad annilys)" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Gwall wrth drawsnewid: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Gwall wrth osod cyswllt symbolaidd: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Gwall wrth osod cyswllt symbolaidd: dydy'r ffeil ddim yn gyswllt symbolaidd" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Gwall wrth ddarllen ffeil: %s " + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Gwall wrth chwilio ffeil: %s " + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Gwall wrth cau ffeil': %s " + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Gwall wrth ysgrifennu i ffeil: %s " + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Gwall wrth greu copï wrth gefn: %s " + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Gwall wrth ailenwi ffeil dros dro: %s " + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Gwall wrth talfyrru ffeil: %s " + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Gwall wrth agor ffeil '%s': %s " + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Ddim yn ffeil cyffredin" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Gwall wrth gwaredu hen ffeil: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Enw rhaglen annilys: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Methu talfyrru GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Methu newid modd ffeil: methodd waitpid(): %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Gwall ar linell %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "allan o gof" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "gwall mewnol" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Enw gwesteiwr annilys" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Dilyniant annilys ym mewnbwn trawsnewidiad" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPSIWN...]" + +# c-format +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Mae'r nod '%s' yn annilys ar ddechrau endid; mae'r nod & yn dechrau " +#~ "endid; os nad yw'r & yma i fod yn endid, defnyddiwch & yn ei le" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Nid yw'r nod '%s' yn ddilys o fewn enw endid" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Cyfeiriant nod gwag; dylai gynnwys digid megis dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Cyfeiriant endid heb ei orffen" + +#~ msgid "Unfinished character reference" +#~ msgstr "Cyfeiriant nod heb ei orffen" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Testun annilys wedi ei amgodio fel UTF-8" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Testun annilys wedi ei amgodio fel UTF-8" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Mae'r enw gwesteiwr yn y LAU '%s' yn annilys" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Mae'r enw gwesteiwr yn y LAU '%s' yn annilys" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Gwall wrth ramadegu opsiwn %s" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Methu newid modd ffeil: methodd fork(): %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Methu newid modd ffeil: methodd chmod(): %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Methu newid modd ffeil: Plentyn wedi'i derfynu gan signal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Methu newid modd ffeil: Plentyn wedi'i derfynu'n anarferol" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Ni chynhelir trawsnewid o'r set nodau `%s' i `%s'" + +#~ msgid "Incorrect message size" +#~ msgstr "Maint neges anghywir" + +#~ msgid "Socket error" +#~ msgstr "Gwall soced" diff --git a/po/da.gmo b/po/da.gmo new file mode 100644 index 0000000000000000000000000000000000000000..d7abf0f4bf839ae46f76afa69a99f5ee95dba165 GIT binary patch literal 43232 zcmd6w37Di+b@yLHLC1xCk!@ZYhVFr>VTPRFTPcmY!)8 zQ9xAO5SNI%CXlEYF@7527UCrOxn=pHiN=M*XcA3`CQ%dj@Ap6FzDreC^)x2W^L_nr z`Pcj2{oHfUJ?Gr}-udQ{Pkuwh-`fw0qLaX9JTr<4Pl}?SKU;63=;47VItu(CcqsTM z0lygV%K^U;@H+t?2cJ&*ABE?GPK%<$d43vrJ$M4R8*G6^@Jpboyx{aGS_p0f7lTuv z>VGqM2Kc++TJX!@vEcEGqG%_0Hh47n67VeW&EOFDX)p%A51t4fP9ankEdf>EHt;xb z4|ooE2Y4~~VenM&``~%t5rfnLZUj~DG^}YhC{?~&=@MGXc@MJnEx|BfC z?S60t_yth)A4=huftx|qcMo_S`00SBKpfF)8Wf#=hySU+UjZ)#e+ixsu3knNU<-UL z_(?DZw~<-&yahZ3yc-n%J^-q}p90m7uZHJ;2an|WX*5>(P6Cy0IjDTwK#jvBcq;gE zQ1p5qsC1tPj{(02o&aj_RnCcE3@!te|7uY6PlDpByTbdo27Dyomq4}e2jTf?5L4+F zfg0ykpvt=$RQ)dq@oxduz7K&%gI@+!&iB9=JQ$*huTKZnj@99LC#ZaNP<-=RkfDk` z2CClgf+vFqUEui_f(&(ZF{pNog35mfsPw-Ds-BO78uz~f8QSQG3!w#g8K`-53#fGO z3-~ACYMvhhnZnU27y0~H2de%tkSP?s1XOwN2i5(U)VO~LRK7n4nF7%-!F#|nS32K+7}Wc(gA7&l)Jwd* zmw+n&W>D?91EguuL!iq44ybl5T;=`P0IHr=cz!o{EYE)dD*r!$D(^^$^GxtOQ2kyD zs@+BKFz}V2=<-%j={^r?ettEeh$MM42?0!8n`*LZ(U2laj>DE{06Dt!?=9(-|l|7K9*_W@A+ z@+DB|o`P@}y%&L}f>(p$zb1Gx_!^L@9K9bD9UcRBfX`YNMVEskpybm-AS8|c1Ka{G zU+?9<5LCJE1y$b{K=uD$z|+AKHhBLp1x2TEZ~(j$6ulkU28|jCtMwDt;7HIk$uA|64)P=L4YV{5eqL_Aj9L=mZ8* z;h3wO4wr*W?dWDO2Hy$}f}a4D{yU)Pf7CWFcNM7q-wdkW78rx~gO`FI1($+91vS4H zU+wL_3=|)42i5L6sCr%tim(0vRKCZ-A@HPYygwU2(RUgYo!$+KE}sH5E?)yr0T0<8 zMKm>91j6!B8x$S>093xOgW|KFgR1{DCXMoM09D=;cm()zQ02V^dw4jN;88qZ2C7{JpUP}bl(G2?x8pMI2;R# zUoHlZ1D^+~U(=w*`(2>u^EpuC_79-SecFwl{w(kqp4WkD*Y%+0*`1)q_dVdn;AcVQ zJ9wAlB2aR06R7cc38-`*0yW-`gUbIaP~|PW$?3EK6g@}56TudE4tOu9bo)W|2N6zYDva4%dTf*B#)=;Ojx9|2hs$`TO7!o}X3p_?2M&peVWlJd*dH z8+LyGM!@d`d_3Tf0{$Z4Q%0g_0r{Q@YMvYqivMDeBBSLX|3$Cke>=hd1l7N-C70t9 zpxW~qQ2qaSc>Ysx6VE>bH4f{_Za3`)#fN_gir>EkioS=8I$c(P;;Y@@so={%<$rI$ zPlFfn{4H=bc;cAz)eYbpp6>!L0Y42M3m!ZkMHhl6fSPaDfaigCg5rxuK+*S~!5AE< zc>C6YdVVe_{+j_$0Dl|Q_9KB)db z5Bwl_FZeWYZPn+|7EtxnLACe&;2`)dQ0-nY>2z5Is=n(%)pr+o6Zjr*D|l$l^X~+e z?;h|{@Dt!h@E71(aDCnB@KR9n_>&+cjGi^+a%CFSI6VZ4UVjU&1dqGL%iRuc;rVXx z{or4MG5F$!%gc9z13Z5O)cdc3;-jB};`8I1-k%FWjoWrm^Jfou7I-IkD)<3V{O}iG z0el?PJUX%EvP#XS{!>gKEbnQ13^z1(X+(d!oQeDDpR(tRFOJ^ukN1Hz^U=4vp0@@R|K0+M zZ~h2WJ0Azn0greQx&yc#TnpXF8~jHvDdR2)N>0w7JMIg68I@_A@~^h4DeUr zso*p2@O(?b!+9=&YG*qv3!cXN8hAW-AEn-vzGY`D>uYW#KD*9IgUIhZlpVfS&-x7heZ21b+gGUzWeh z>32Ce$n!|RSAg4j{t$RQc<8H9z*4N`}K=Drr6#u^wRKCxGXM#Tg7lWtY=k&c2RK2%@M}cnw#fJ}p z;`2{~>d!xc>gVCF^ZpNls((FrICu+q40s19zIqd=ar-!^dG+^T0X*ULZUNWzXVjfw}5AXqXF*&xA6Q)Q1v|h zH$2_SfIC6)Qyn}Vd_};A!E<>2GPn$U>YJQy7lV2p3D2(wH9tNHs{X$N#m7Gb)$Y^p z_wip3uI2enpyuh}qC_0|-W`EuUs{C>AIPiY(S>Ojj(e+XA>EO4)E5ILs3&2a> z67qvj;dvZ953GR~g1-rhPre3<4h!Du?OOq=o*TetfDQ0S@ODt+bsu;X_$W9DehC!a z*S;;Z6TE@v`$6^hhoJcO=(qcL-3Y4OJ3;mHUhpvR6QJn!#ehEmkLLNPcldY=f#R$6 zpvv6|t^nJh#{c2){#)QFJU{83p6^ufWS&=n;+Gr26Tmw`(eLe`==Uj5{Qak(`1A+h z@!)aq@^s5UjsFgCA^6hp{R--360IRl{P*=F!8umxTYz7rHZzZ>wl z-*mp*0A9@d`@pr}7eMvR zs@^@I=JU;~L?|Od! zAMjG}8{iATTM1uPB!3!j{rw~1+4hUEAzpt&;3eSU;9r4Dz!`8icnU#(TO6X7^86d& zT_vERMAwfHT7>r#wi0(g;i-hD5jOBnf2;Yuj!-7(@AnCp@cTOO7Q)f|9t?5f@edH5 zNkBA2j}!Fwst~W=uOuAA^XI|8)Qj+UBlxG`xAx`qcMb?EMnAVFWC72YhqxC8lzh92 za01WI2!$+{EwW zLfY%VJ>j>~UqIMPcyV}lxnA5%4W;r&kVe!{O57v2e8Lb|o!rGzHG zZwdMSo#)Nr_X6W|EmjwMGa?Ezn@2klZ6OQBe3kVza zGW;PTqW?`O5q}%_TEZ2CMLfTa@Lhg?ilD#mI7B;n|73pGz+1srgZeuL{3mc(cwPyv zAhZcz;{D$eHt@R)zKw7#A>#Qg!hh*Ee^q`jB)pX0CxOQj^fv%5_Mg#Sejm*5+X>4< z{5{~Gh4}lx?L6NU;w}uR=r-X&{ot>~`}Krph4{O8cM)MN&r{)@(rqKGCj2L%Ko}!D zg`mHq39CqZVo1N0=d;7_SMd9f2rnn-?_UW|C!9w77~u_sDV}d2yqloEe@1JBYc{0H{oW2{&qV=Ga-L?G#JV~ygK}TdRMy7 z@cv}NXxIDa@a{*10`K1lP7=OJ(BHo~m_G44;dc%E3E>BXHKD8<13t{VzaunwK8o-@ ze(Uc@!nGldz2JZ66AlRv_Y!v|;pK!o2-ovoy2HmpykJ52eJJt6gwOH3D7NG6X8(8 zlX*S?e1tGcIG*P>gTF!8!S7cR{(#@lB|M+7hoHZA5bZ`Gf;o8=l7|E(y#~FSQdlc*$U##;lAht$4CH zWBG>5W0hK5ti|POd9qw<#kJyOdEO-i`O{zJ2aAj=G`X4O6T5py+nrAhvj8%D2 zeJq!~Whu0&bQz=?AS#L9p_0f2;JXvqd#EtST?Mj2Bt$IAwsE<&zk#29J(khEw)na1| zerb)v1;y!NrCJ=WLRoJ`+?*bjM%BDx0 z);dbF>HNB4ZLk%O)Td_R5`7+Ni2(I!dY3-t)AWyNPL=6d)oMv{sE6ga-K4awo40PD zn%Zb(tljW_Gu=wWENZSG^vF`oQSgc7ER~xRt$OHjT6U?E>~x|xH3&(LP@fIi7}f!b_k2kl#MzwrGuGA%2l7Sm0G0*&sJ{jF%eaW z<`|@71ej|G&S55!&qgEz3st#^@X>5c5>FKyNZwMtEqUOx(I%?|oAaTH^i-8vt1Kzf zH<=2bDmNx8O|eN+(yTc%35!nHY*9(AM!SZLDaV_(n&{eGn`*bVx8UW;Xq_{5%*r-d zsgbBDo-e9)bvj!BlrpSB(*V#Zlv*!jfLeG94N&_xde^!Xt}{MF0oZudM4{_ zsU8HgE$+xk?^R0@I$dIWmQX??P&b)gws4TOS)OFBRO_{s@noGPrdpX0tIX8fk~2&_ zx;P2dnoPK?^mN$~(Q8sLB-@)UNMS2^tyO8w#D%!r94SuG!nA~9Gd_c-mC?F7Qewp9 zHB@9(7}JWQ*DV$z73ix-)>$oEicjY6Xrn%vYf-{FYKZX&>x%lCt_0+5SH1sQvu&6c zRf8s@Tqede58{DE&4FBUn^=KwVKA%Mst8p*fut^)S<7jAsf=)A!oY`tpVx2LxcSNr z@mQnI@eJ)m6)+=LbN~*Lm^yyM4sjw1)=3d!Eo3jR5Unz+} zN9vQ-3T8l105rlxGvSO0=2c90d*+!bS?1M+CzhpvL<;Zf#aRwDw>&w82!i3lJc9e{HMkx!A-YYaT;FG1iSuGR+7QeVoAD~y z)!Zd9x}*_>1r`C_qHG(rq;1F_8}z>UnM}E~ouxz@toalxK{|NG%0VP`86nMBnpwyD z3d=yTQC{H^H9q5(cD=PSKBKDtjp={Isd{r|w86{x|48rioRY(*S-wMkp_3cVz}WI?f(O3g8WJ~h)TI@P6ek)^hDX7w>Fce%K+a?6TUH{23q z){oY6DXK-(m~j=5)0}hhlf?-|qWuilF{)VfYZLkC`g9L6u}n#wj~BTf0H)o~qH?7q zvNP?TO@|%{Y{}JB=@XZGElp2NtD6Csky=Z4(&X-H(m3f0T|?gy*EP&&&gF^`qEu`Z zbB)L%CQ(_6V|iX`pf>g*UiuyzEe`z9MfHv(v)UPoMZ;qFXLp0Sl=Q!&rQto+IwpJ( zQ*>6r&3e@u?6S({7@An_Wk-49#&V%=0%VkN7NWYVqGpisU9?PI&!!~$oN@W~4O=R; z_C6Ei<$bMOYmyYab?qk8R=T(;NjZrxY&3Bq1YsgyL}fBRhDmB9QMu8hzMKuwBQ}^6 zbH#`>nb$022torLI-T6zoZJzIu{6@COd%t4RpHTT+Pv?gez0qLu!w67=x0+E_;Cy+ zc&v>(MhmwTaw(^aSZ1)>Flubhr}E9SP8M4(YI^3(wat@j=1x{_?OWBX49S#ll&7lr zflQ5TG32JCXAP^i^Eq)WsRs1(E<(uV6k@XJF3UnMZCu1UFk50O;BvExSw`B8?QYjJ zX@?eLy)uTp5-}1LrpiaFEyGb?(kf<34H zNu`H`^2pIEQ_SE4q+8uOCIqeRZP&P1}by4&45WuM~4%T?y18<54x*+ossZdHlC zc-iP$V-vqycpjC!#-Y|a=Rpy!b838-sIe{YLSn%?zrXNF_`mA z*3A`GWVu#vkB!eR8U5U5Nf)13p5U~wd7_!rH%&U$T_a|t$Q0{P-g-?~9PZ|TmNkPH zOQujo?ksU=2MuO7!Zh==1(Gz*p<{S;71xi~STQQM;xKo&f2bE5U+%Mv>D=v~77y2r zR@=?-eud6X-khn8%s;i|?@BHiXQBu5BF8d%UCwNeag04W!4!6*0)BT_d$h4DCB-Bj z(_pPw3SOHT>gh!}teMmeD(?=29T~LfpvkBHuHd)o9Oq^}sT{G<2T)?t$?zEQ*JT9(3U zQ)F}4@!Yf>9drk~mg&X-mAcg|=j%o8>Bk#jN(7BJ0u+p7o=n6@^Q4m9c0l7H@4M}2 zq|S}SeN#gWt&WKoq<_LTj?{C{nP&+GKMkgIJ7^%Om^QwL9xd9W z@tUzcUq}l|XzadACF>ZK@xWcSy;v{vRL;DiLjs7K&2*ohlx)^nBtHkzS%Ps4)RGV-8+Zcu%#==x{-|Mt(14>tw z&731vmbP4*t~Ba3O_a_QzCjT-HOAP-sipnfi@GB2O0_`Cc?EQCPc{ZfdwR6Bl%jO}dPju9Xc+R$6C@gxUv+XVh{-+#@xMC3`^br}dQ4 zmhx!J_PKFN`Q~4cJSxoenc?;*n_STr>@Zx)=Je}YPPZ1TXyR;+l1HnIt8+55w9smY zHOi8(f)7&){N1Wgl-WTUT2xxB%4Ti$&OcB0wrrL&*^lyCZ4Ub8VWN126;bSA3X%>t zL|e5B$*`qDLN*nmVXHQJhs&+KQjcv5ta}^l$}&{2Jt1FqudK&*7(gdxuNSJhIvGJ7@cAm~>?>v2CTuFVohH%8fRQc2Z zBib00jR#CAhAEdgJHMhPOf@RgW}{ZwC6Hhl7L{xt&HLOpCr2ixE9{}-yQ??6{-kL} zH&K6t-3^GXUNI0<$Gk+B&&rh2XGcWTNaH|6uTo+FiiGAk3FMN9HS@rgVM`R=*ye+g zz!#t7pv&wus)iL!yUjRaqN_^zEm*Zbx52^@t5t)^22#hiosSW-A=z!Po*$^N)w%Op zvH-MV*j}MFCJISW+OC;zagccM>^`Ns*idO*?KDy7?p}6n*|f}UY^_Xf!2EV~vUp|d z9c0XBvmrhJF~bg=wp37hb(X64Zt31}7?5RIv&F@@I4M&aMVsy}MOP(uM5msfdvDuJ z?DKN40`=!AH{gOCk>Kvstj)rSwynEn0}DFag}8Z{)9%w_UTCsPduDCANRAR}x4omV zh|Du%n)<5ko1aVJ9QiQMPv8XGit6gmHcP4r1>b6N`G!@tB_DR=XrG42(?r|4&r@Wk zMy9y9=(}3O6EyjREPk9YEI=ARn>#j!(KY7MH&Nkpd$hzm(;9hcO5|{v0hF#HDa@9m z9YxSeB9q%K*;zSe>dD*yJJWV~uVO1fz&WtQqBBskBT%?v4_Xx+M1w40bp>ENlr= z1zkFRuKh)wiGsjclDM~2YLWq|ENfC3wEt2;g0*dkB~sA_*k|#oNP_b~zwrk-_| zLXru-`k1OPvNRsrp$&88Q=BSVoG&JSq97jJm6N=4WK~J#vxtYZB)Ut$7_wvUoQkMB zS;CWaIuT_Pi?nWa9RHcdanM}^K-Cd2)sUSabnRP8WMqH_lRNHo#W$-ixlv1aPt?^6; zqNwh6D?zj)@kl}>9gFo}dysN)q=657YXM0XG zm>&dbkShC`J4T+!-L4tu{S%bXqMTi4&Ba?UqjI^d7y>M{89wDyQl5WbQ0JB zS|p1}9@Cy@#o4ZwW-)r%94WL0OVpV8+m+6ak)kLT@n6M0%&FN7uVDPc?a~CJto9yx zjML^yt~rBA1JkCBHsgP$yIdGmrwFSEfp9q56o>4H?yL-T9BCZm%%qvAkXB7Dt#%{W z4Y1wt%sG~I%A2Kr1PUd-scxl3%}KO8lVLm4vtx0&*w75Gl?wIILg2-GwCy6Zq<0($ zwo}-82WyZf|zm9e*2X-!p16k@*j zT#`hWr6xPJ*4^tQeu*7YQf%sm%eU6-3A6yzH;z$B8B-@oVP{+1V@XEshKT|lz4nub zok^LRh+!RdNz2HNKO{*}>sob`G82P-4v-_!X@BVT8F zH(1b6Knu3~xRynMrp|$xxaqQDcG{7M=vp(L~# zNhHg(C~K@*F4mT+{COlFt=3T*-87$Xo+R~kaEeAqGa>Ymfhh5^UbD$_9Ui-}P`E8E znYSUj@v3b*HeYq+(xpppigx8ZZmbDfqoQ5we7Ojcogt`lh;6uxCM+8qd(}+7T_e5n zBIjJ7`e98*l&?Xc4JQTpZEF&3#^%WxPDvymG2B{i)I+nQw5pVsgQYWc>5w9`&ns-# zxl4{~-SDp~>?n7-XU9m%013q636)w4S;jOXDtm->ayn6TA{Byw8ZozKm2(2}m=sy) zOVLP?b0@a*ts!yc0>{p->XLZZ7DAh_b8%XcPWbAp9Jsg~WtN~Xz7TuYzUMPEw`HaU z1kE;rbQImr*uy@1qqHALYxkt_ru%4aYcEa?JDOW=lB3aRPsucKk2Wuo^8}L5zW(IT zr*+2bzyT{r?*vtIk{SQ`wZvp-~CfiB8gY+m2;<+~y_k5i$9HX0i+4?>Gawh2_)i-yO5F1yd0?MTz;F7Pk7o2BV3LBFXs64yuCS+( z<_v0&$<@U@-`-^Mw!4Q(xk-N7t_HM+gFJPgPWH(_r-Nj`*mod0K)fj8NxL|Gj+~mS zsP%KCXxHYO!s-vn=iLIyA}H+JlVfav$x!OsQ*E7(vuxGdCZBucL`>TWGP6&oP-UaQ z4ib;U6{*_i-nPoM3gTZyb(oc^KGI^&1p(YdkV;Dq-~8=5_reRK zu)!N0{EINjF6|!&e-9G!vzbka4fC18g%sQa$ z2MDc3H06p{eALd20Vfe}^zjS|Dpe%@p_Kl_y0Yya$jq^yMwm&FJ$3GLrtgEZ)cX=7 zS|T_}q|Jn}8YfbI)T9W80ob6M}3&E!~= z&ciTC#0Bm#Vh~|WxK|rWuC__lEcoKnYn-+<>e4?7n@fdj{p(FmS>nT9a7|gC92d4W z$10`5+V)tpu!C**1>3ILQCKI*!5l5DM}Vw|&sny7Sz+0^g>x>5moHy&-bICF=Pg@C z!ooEO3C-n>bmtV7pBpc~c*S|=o<+W83%2kcC*sTZQ1^JeMIRs5 z;!BFn3CuWtUN*)@($%Giq}61sjkP)ZUD(0lrWNt}qL?whq(n&*m)ZXdW9WdG;!8^t zs~2d8F6-j*rOOtqbGcoRi)Dp*@y^EaSm6^7O;UEkR@q*1mQIaC$Q3rAqsVq%5nogo zuCx|xtMUPGwXl(O9q&kO${w4m&S7`Ney$p-#iy={moHwqfQtdzV>4AWrg)-Wl56|d zxfh^-L1zZ#qGrLd`&s}yTBSu`VuAxzt=Q{ijVkkj8N0zm@pj;nfr8$wWRt5EPay0q z{q+6^u@-Q?&mdc?8iA?(4=8=`M%0SawP+qSsAzVRspjl~m44cbdMEck(4EXY2|}9U1WJ0kkoc+z>EQ8HHfY3DyFm z?dbkTs$<$}8MPY%a9Y;l{SOR73>rBUZQve(`q(5?h7Ov%xaS5*VkDK%OIcNXxx`oZ zc1yqn)`*Tv7q}*1|ARH$)^wSk*(st1QLOmQ*8WE@ZSm@A(5V~RkS%Or?5I>})*gz) zlvZYxXs28&+DegQY9yJ)+Y{0l8TKU<(1<4*`yZV4zBDH=VZ^iL8rzag#3;Vi8Qw4| z(G|%QQ4Hh5I*WkukHPKd>=btHqEB47VSw43~P%9zVbOJ-W&1?xHdXl3d3~L3#1ewbbuC%x;Uy^na z?w|Bpfge@dH1>EIZOW3X*#A{TZ#!Xx8^OZdsKQHA&s5m#iT=GUuoJaH}Ce@FH-6rj4AC`Y6dz935`V z*lN>50%Xl#3>hXHW~9w9T*xg3l07#2d1WhHbN_?>Cd)`2t$G!?=vNsOQhDG)mlkxf zxTnVbiqX`ZJ2f&7L5#-5_fqN*qEQQ`)O(_kC0R3u`Dol$*B;j!Ks^?a;%JjCH!aYj z5j|^<;<;kw@I{R6MOJWIQAD<6T{q7NrkyV*e#OB&Q(k06rkcB!A>DE?AO(e1*kaNO9Sl0Gp%$MYAmqo0B?~-14Z%of5-fa@TOk(%(uy|L8~QSpvDnQ2 z$8}MQ#0Wb{kXjrWcv(G&u1L7dA{xa`rqVj+{Faa>zx*<1+UylLDP%1&{v2lt*Bn@0 z+9;W6lPRoa`Aj(;AEoY;v-KmN&L?t~TK6J!B{vbjqf)iaPEl4Sn^bq>lSR$QP28X; zn=Ngm5%bY%NEGjXkIow+VYX}a_a#9q0ur{!QVaQ7@dox%3ZqOFJ^-Jv6SurfnWD{+ zS*3Ed)8{;+Vnds%qFfweYkO0Ih1;p5WW?!9pMP_fuE9lr)uLny4E|wh2U61T>BD() zh~k;SK59>xXMe7?rlryBe9Pw7gicL)zV)~!Q%Ds>R}gjUL4TSi?L-CE65RAW^0{=Y zMspTp3R@TpQ&piNC#ujA*&)Eqg#L%EFlP}-OP=7cNmw`|Cz@P?X>B|&8NfCmtkRic zu4b?{)f>idOm4{xlNViG5pjr1B&`XYP?6Iwz5gI1ymb3utt5guG&mj_U0R-K=I%g9 zbEya1Ga_~nABsepUYJ^K&RAB95ZFWuJ<|O;Jr^Y@+9p=fuFP=M0Zn8U!alti!N_H* zubD!e-^b+}7h&`1mS`sjSkhXGGeNQ;d=xS}ug|^iL8-MlNTFMrT=Wi{v2q}G9eZVH zm`H7rRH4sy?V6dnFGb+!IX+}t@BUw`9=>e&8p0X*IhKzN-ZPUb+fKBL73rI2s)$hf2P@U zv2NY<%uEB)Z*J499ZkyG-0^x5pFOEFw$QO1lUi$(*l8|x*4vrVRlzKUmzFMI@Ld)s zvZaQF2v@1PA*=Hx4fZQp#5z;gr~C*jiSq_d|8|?x5@!dBqA@iFUtfqWimP5VKgrW`&pcBI8Vc#@#n7N_ZIad;k%PAbt#uZm|6ePr$ zwAyr}yXe`o_%w}l32Q@V^&RoEnTbPRG7V+O(@!0{=*-?3kMKw3SL!U4GsWm0w&;^$ zXvUoJWAZ4lnM>)lou4TWmVcSDP#EOLfUp|nyad^FS&d1ey(T;*_>jR z!F3%o!Bmj1v=lprf|_-|yJ5K9{iDUSF=+|VKWE8x7QwbkWr~jsOob+)Z+y%lL*|tM zZeT95ZrD1n6>+v`%4RWA&im}yW=jZ5K;wwVXNA_DUQv;Dwq0t%jtOVZ;>KX5hJmqq zGCDXXp<{Djg_};)rGc}3H8XD8rB-8R0@-7$Un(IJS=7agQUUwq@2*t`0kBL$!{(VO z$i$?#a+DTLu%lVRlg4MchK74Aj8>tgiQm(#w=Qysvr@;XB}k>>dX4IY9cI9QLct-c z*M|O=n20WC*f+@CZIN?1It4PF7CI;2P{HKM?{LS(#*nUIR+}arUnFPq6txiXTxU@z z$sSJBWLbE+>q0u?XoX=bao0tnx-=&$qvqMoFIs+ZFSqQN!s8+(OxyIPi&=f?r$-oF zyC%KUzf+5lbq9$jY!c!QmeWL}u(YiFTyE>_%Z=a!j%toBYE8-|)6RyezkUZm*04Uw z=PGu559;4kIcOfU2;{;|+)$ptfdvCMO@jyx&=kmR0yz1-^Q^<{xmQz7WL6KwfZd7m zot)JcE#c_ui8EcdL=$rAMsj6F_t51Ad;&d#a>jJ2W-e#AKx2-KZdPP@Z0OSYle_=o z36x=TB-gm^I)2?!IcKFyJ-S2BlR{E4 zb-KkJH*CNpT-RCE6&qo*j7+x2P=0CtrGr#~c;*$`&s3c!If-OFg=?ZA`_1G#YhB z?5bNcSiFOYTx<-N_sF@-N{l+(8OiHp^D{N1txO_trYNy|gyn3%I`ONJK>M>w;kF`E z&PFioj0Od(7n|T0&gJ6tM7Y;o zT~qu9ZW@So%GpnIQFLV{pkV1%30pLnR25|wbK=D28*Jx_?1B$mwxNs39Mf$h{q`?X zg|mlasb{vN@E++m%Oi#MfJic7yfd6}*pyxcVjFV!;gc9UTA}?b#>myM3I~lCR`cqI z>}CfgIg*d-bl|~n0kIDsKOlxskd}m?^#p%lfrwez09I!m4;|h=-={iR%@7loi z>_Zp&1OMt45UI1;lebX~QE+XSEhNe$ePa#q88GXGjQzBTaQ20a`4M4fC1uDgZ4I*! z6J%Ceot>V*o9O<>YzHqJM>c1CGr2o+EK}3IF>5)p$C#p$UH~vnUlCXG;DlR364pzTPFAXW z_CL~5lW$Gv3uIW=#9a^LEgcn?d}yuA%DUU9R~qpdQ&zB?Y>*A6om_as3@8;XBf<`8 zxb7JB$x51bm_d+cnuRW*xJ{@&xdIcoM$8=dvs3;kl}0;wlpOk-ZVj?4xNSIgY$EPc7H-{5d zWQ04M2*Jx=U}uF>G}>I#A+_MR;5psB>PO4;5QDWYN4k!ssb6j*a(-~eGtodJ z>ybg2r~QI%-e2E&$eB+8s*L}{>&Mq@9vovN!aTK=17g^NQ zan`U;IxU*Hi&8i)uoXSSY(+n}5@Z#Kd;U59<^RYU`!p=8GXQ(zT=Yf$blon}6S3HwhR!r>gKykRh7dKef6 z(SgU%%i8`2_*YyQKszyM0}(2urJ|ShysKNT;Wx88R7l%H_@q~_5N&f-C%|bW zBQvmcd)YME9V;BV9e3eHkOcDX(rqhn}+5(`!2WfkdC)-AN}n51@IP9AGgSz`roU#o)|AhAC0t%-hU< zxt!Ug#@`bbxM+ZWQ@V(Yo|}$DYmDP`A&qscV6Y9S<>xC$+GtTR9uApVj&P$(cQUF8%!!MH;j^@9 zUNyl5cebl)vtLsJRTGO)k{99Zo1)=g6xv}MKIwrIV{I*o9MrL?+&M`))>w`3qLFyW zoE6lrvps5oE_~50Qd+1qs$^AT!Pw=?kuH2ux*j>hDWP~M^*{DLC4_e)_nkmWij+?J z*9kjp#*XwEJ-c70?=@{`dC6Wwel={A3xkJh;c zADUj9Iv9}0qFTPyxmK*F6i!DLHLWVu0;!xo`V97I16*Ll=XT~IGDf1T?xr)XC6(X+ z{)cMsYgjPO#Sn}5XBS6xWVqKfUo&clbETq^7X7Cj#D{ue8geE>a%uB3r>DHxfyc^3 zOM3SU6bp^-xCF*6W1`U5M0mU1g~ORx0?jgVM&zHXusPG4#b&F9uR+cR-7AqOnjKe8 zzA4C^DY_#01R{wm8aTljL+I)qZBT8F@;!!Hy-IeuRfnF z)RXnZGx!Ya)$;C?C}(~4(}IkOmYd-4nw6nGRl^5VY!{poCVq@GSxUAgC_uJg zP#sc-X-Y8d%iDxNm2p3l>C5OjK?CziBElqkM^KJ;hJ+l9&=Tsbnk~Xn60bUCsOSHw z$c~#~jGsFWU-^CrYcgzXvAzk3w=vWi%1m#Ek(!eDpp9~vC$l!Cd_$$Hi0;c_LIpWp zJyn!U{wLXU2|CVz`ulDY$%U+iLjQ1O7z%g5+F?HPV|z#AK3l;M!mAG%vSWRGA-D%u zXLv755t)-3sKE_xg!Ckkk~^U4X%_K)v=gPc$oWtgtzD~9#au)zas10cI)vs-%`=U{ zvsf*7`k)GOQH(2}m>iow>E0m1Dt)<0h;h{qwp zIiNkph)ZNP;71lrGyIdaT}}yvwYiLZlu03v71KYc$}F+W%UT;NQ&XkQ zeveHMKWCg~54X(Z+N3hV$(}fp$X@>daQ4>HMw*qoIOjovRQnw9x^KTT43lF zwI>H*?L4*JM8m3w0{q~pjD{#Id!|Bg#I0RQ1q$XV%q%eqv%8l}b{Or<`MMeOS$EU$ zE;nc`-Axl|$ekBym0e16TOqNwNKZRWn~1bkrEmE-r#Bph?(to%J8zQ#BLiH=l$8Fd zOLg)2MEf6MIWLZ(irRKcgt3<%{!zxT!sSo>&PrmZggOoe=aSeLU&hU0W#dxj?S7A> zZJql<5)L1v!_K8IungRi{QCfzQeq#aA1FS^ot_`C_b;02u`g}=oRa8ZQwTZbND2Q5=%MRJ;p5=F1(2NP$Ipvrkq?_ zgQ}BSne>kx!(@jv|2q(|n?;h!@N6(k(&L6E@9jiZK~`tlrfjx_n`@H%ol^n^7q{YS_3uqG^Yndiq@@kYVF_@14ga>RIl^{LCG#a8FDd2mCebnx!-+`kHNy6M zQ9_G)&@)T2I2cmdo=6twstpDeMRAc$T5SHkUuBc)be1eAcrp|!z7!_1ol7=YF}c7+ zLxv=3`n>HmQL<}o=AAZBrSB~_^C&2HNCRrC!Po%geZ1tKS9lOodaxD%B3!Tf9 z;>q5+ixF*;*gBgq;Vhji@8&$uE3 z0`o7(`1SznnoPe`s+s>pBA|d}ulu;d1|7*8Nh3+kRXVcwp|2hJO$QW} zjV~g4=awx|(h1R!`hrU;F{)&P2W`O`5snaH->dcms4i-sB#rLQNgThquF!(C-K}`} zvZa0%k8a}Wom!?lSMk_gJV>T?(AzQ+N9|ElqmzG8l-{QU8Tl7Vv3sIj_?v(W@6BEb zziDJng-UWJrl%ca3KE%1coOlSBop~V?9in>UvlG)8$BIKxn?K#*4dnk(V|iX9k-?r z#QUo#2TT%L*;`9Va>JcHsz?P@6sB^0lIsp|0_g56bIBMZ`koS#2#cFjMks&283|wc R+?&0^nZ_FyRq5{0{{^bENqPVP literal 0 HcmV?d00001 diff --git a/po/da.po b/po/da.po new file mode 100644 index 0000000..b6bdb56 --- /dev/null +++ b/po/da.po @@ -0,0 +1,2201 @@ +# Danish translation of glib. +# Copyright (C) 2001-2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# +# Keld Simonsen , 2001. +# Kjartan Maraas , 2001. +# Ole Laursen , 2002 - 2003. +# Martin Willemoes Hansen , 2004 - 2005 +# Ask Hjorth Larsen , 2007, 08, 09, 10. +# +# Konventioner: +# +# attribute -> egenskab +# volume -> diskenhed (OBS. Diskuteres nu pÃ¥ listen, skal mÃ¥ske ændres) +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-02-13 19:43+0100\n" +"Last-Translator: Ask Hjorth Larsen \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Uventet egenskab \"%s\" for elementet \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Egenskaben \"%s\" for elementet \"%s\" blev ikke fundet" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Uventet mærke \"%s\", forventede mærket \"%s\"" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Uventet mærke \"%s\" inden i \"%s\"" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Ingen gyldig bogmærkefil blev fundet i datakatalogerne" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Et bogmærke for URI'en \"%s\" findes allerede" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Der blev intet bogmærke fundet for URI'en \"%s\"" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Ingen MIME-type er defineret i bogmærket for URI'en \"%s\"" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Intet privat flag er defineret i bogmærket for URI'en \"%s\"" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Ingen grupper er sat i bogmærket for URI'en \"%s\"" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Intet program med navnet \"%s\" har registreret et bogmærke for \"%s\"" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Kunne ikke udvide eksekveringslinjen \"%s\" med URI'en \"%s\"" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konvertering fra tegnsæt \"%s\" til \"%s\" er ikke understøttet" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Kunne ikke konvertere fra \"%s\" til \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ugyldig bytesekvens i konverteringsinddata" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fejl under konvertering: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Delvis tegnsekvens ved slutningen af inddata" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan ikke konvertere tilbagefaldet \"%s\" til tegnsæt \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI'en \"%s\" er ikke en absolut URI, ved brug af \"fil\"-metoden" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Den lokale fil-URI \"%s\" mÃ¥ ikke indeholde en \"#\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI'en \"%s\" er ugyldig" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Værtsnavnet for URI'en \"%s\" er ugyldig" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI'en \"%s\" indeholder ugyldigt beskyttede tegn" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Stinavnet \"%s\" er ikke en absolut sti" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ugyldigt værtsnavn" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fejl ved Ã¥bning af mappen \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Kunne ikke allokere %lu byte til at læse filen \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fejl ved læsning af filen \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Filen \"%s\" er for stor" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Kunne ikke læse fra filen \"%s\": %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\": %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Kunne ikke læse egenskaber for filen \"%s\": fstat() mislykkedes: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\": fdopen() mislykkedes: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Kunne ikke omdøbe filen \"%s\" til \"%s\": g_rename() mislykkedes: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Fejl under oprettelse af filen \"%s\": %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\" til skrivning: fdopen() mislykkedes: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Kunne ikke skrive filen \"%s\": fwrite() mislykkedes: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Kunne ikke skrive filen \"%s\": fflush() mislykkedes: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Kunne ikke skrive filen \"%s\": fsync() mislykkedes: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Kunne ikke lukke filen \"%s\": fclose() mislykkedes: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Den eksisterende fil \"%s\" kunne ikke fjernes: g_unlink() mislykkedes: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Skabelonen \"%s\" er ugyldig, mÃ¥ ikke indeholde en \"%s\"" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Skabelonen \"%s\" indeholder ikke XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Kunne ikke læse den symbolske henvisning \"%s\": %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolske henvisninger er ikke understøttet" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Kunne ikke Ã¥bne konverterer fra \"%s\" til \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Kan ikke foretage en rÃ¥ læsning i g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Resterende ukonverterede data i læsemellemlager" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal afslutter med et ufuldendt tegn" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Kan ikke foretage en rÃ¥ læsning i g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\": open() mislykkedes: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Kunne ikke kortlægge filen \"%s\": mmap() mislykkedes: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fejl pÃ¥ linje %d tegn %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ugyldig UTF-8-kodet tekst i navnet - ugyldig \"%s\"" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" er ikke et gyldigt navn " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" er ikke et gyldigt navn: \"%c\" " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fejl pÃ¥ linje %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Fejl ved fortolkning af \"%-.*s\" som skulle have været et ciffer i en " +"tegnreference (ê for eksempel) - mÃ¥ske er cifret for stort" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Tegnreferencen sluttede ikke med et semikolon; du har sandsynligvis brugt et " +"og-tegn uden at det var beregnet pÃ¥ at starte en entitet - undgÃ¥ dette ved " +"at bruge & i stedet" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tegnreferencen \"%-.*s\" koder ikke et tilladt tegn" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tom entitet \"&;\" fundet; gyldige entiteter er: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitetsnavnet \"%-.*s\" er ukendt" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiteten sluttede ikke med et semikolon; du har sandsynligvis brugt et og-" +"tegn uden at det var beregnet pÃ¥ at starte en entitet - dette undgÃ¥s ved at " +"bruge & i stedet" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentet skal begynde med et element (f.eks )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"\"%s\" er ikke et gyldigt tegn efter et \"<\"-tegn; det kan ikke være " +"begyndelsen pÃ¥ et elementnavn" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Mærkeligt tegn \"%s\", forventede et \">\"-tegn for at afslutte det tomme " +"elementmærke \"%s\"" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Mærkeligt tegn \"%s\", forventede et \"=\" efter egenskabsnavn \"%s\" for " +"elementet \"%s\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Mærkeligt tegn \"%s\", forventede tegnet \">\" eller \"/\" for at afslutte " +"begyndelsesmærket til elementet \"%s\" eller alternativt en egenskab; mÃ¥ske " +"brugte du et ugyldigt tegn i egenskabsnavnet" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Mærkeligt tegn \"%s\", forventede et Ã¥bningsanførselstegn efter " +"lighedstegnet nÃ¥r værdien for egenskaben \"%s\" for elementet \"%s\" angives" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"\"%s\" er ikke et gyldigt tegn efter det lukkende elementnavn \"%s\"; " +"tilladt tegn er \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element \"%s\" blev lukket, ingen Ã¥bne elementer nu" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element \"%s\" blev lukket, men aktivt Ã¥bent element er \"%s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller indeholdt kun blanke tegn" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentet sluttede uventet lige efter en Ã¥ben vinkelparantes \"<\"" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumentet sluttede uventet med Ã¥bne elementer - \"%s\" var sidste Ã¥bne " +"element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentet sluttede uventet, forventede at se en vinkelparantes for at " +"afslutte det sidste mærke <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet sluttede uventet inden i et elementnavn" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet sluttede uventet inden i et egenskabsnavn" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentet sluttede uventet inden i et element-Ã¥bnende mærke." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentet sluttede uventet efter lighedstegnet efter et egenskabsnavn; " +"ingen egenskabsværdi" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet sluttede uventet inden i en egenskabsværdi" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Dokumentet sluttede uventet inden i lukningsmærket for elementet \"%s\"" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentet sluttede uventet inden i en kommentar eller behandlingsinstruktion" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ødelagt objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "intern fejl eller ødelagt objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "utilstrækkelig hukommelse" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "grænse for bagudlæsning nÃ¥et" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"mønsteret indeholder elementer der ikke understøttes i forbindelse med " +"partiel træfning" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "intern fejl" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"baglæns referencer som betingelser understøttes ikke i forbindelse med " +"partiel træfning" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "rekursionsgrænse nÃ¥et" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "arbejdsomrÃ¥dets grænse for tomme delstrenge er blevet nÃ¥et" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ugyldig kombination af linjeskift-flag" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ukendt fejl" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ sidst i mønster" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c sidst i mønster" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ukendt tegn følger \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"versal-ændrende undvigesekvenser (\\l, \\L, \\u, \\U) er ikke tilladt her" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "tal er ude af rækkefølge i {}-kvantor" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "for stort tal i {}-kvantor" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "manglende afsluttende ] for tegnklasse" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ugyldig undvigesekvens i tegnklasse" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "følgen er ikke ordnet i tegnklassen" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "intet at gentage" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "ukendt tegn efter (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "ukendt tegn efter (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "ukendt tegn efter (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-navngivne klasser understøttes kun inden i en klasse" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "manglende afsluttende )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") uden Ã¥bnende (" + +# Gad vide hvad kommentaren betyder +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]cifre skal efterfølges af )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "reference til ikke-eksisterende undermønster" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "manglende ) efter kommentar" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regulært udtryk for stort" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "kunne ikke hente hukommelse" + +# ??? +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-assert-erklæring har ikke fast længde" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "fejlformet tal eller navn efter (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "betinget gruppe indeholder mere end to grene" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assert-erklæring forventet efter (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ukendt POSIX-klassenavn" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-arrangerende elementer understøttes ikke" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "tegnværdi i \\x{..}-sekvens er for stor" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ugyldig betingelse (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ikke tillad i lookbehind-assert-erklæring" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursive kald kan danne uendelig løkke" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "manglende terminator i undermønsters navn" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "to navngivne undermønstre har samme navn" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "fejlformet \\P- eller \\p-sekvens" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "ukendt egenskabsnavn efter \\P eller \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "undermønsters navn er for langt (maksimal 32 tegn)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "for mange navngivne undermønstre (maksimalt 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "oktal værdi er større end \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-gruppe indeholder mere end én gren" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "gentagelse af en DEFINE-gruppe er ikke tilladt" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistente NEWLINE-indstillinger" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g følges ikke af et navn indeholdt i klammer eller et tal forskelligt fra " +"nul eventuelt indeholdt i klammer" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "uventet gentagelse" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kodeoverløb" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overløb kompileringsarbejdspladsen" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "tidligere kontrolleret, refereret undermønster blev ikke fundet" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fejl under søgning med det regulære udtryk %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteket er kompileret uden UTF8-understøttelse" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteket er kompileret uden understøttelse af UTF8-egenskaber" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Fejl under kompilering af det regulære udtryk %s ved tegn %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fejl under optimering af det regulære udtryk %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimalt ciffer eller \"}\" forventet" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimalt ciffer forventet" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "manglende \"<\" i symbolsk reference" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "ufærdig symbolsk reference" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "symbolsk reference med længde nul" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "ciffer forventet" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ugyldig symbolsk reference" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "løst afsluttende \"\\\"" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ukendt undvigesekvens" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Fejl under fortolkning af erstatningstekst \"%s\" ved tegn %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Anført tekst begynder ikke med anførselstegn" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Uafbalanceret anførselstegn i kommandolinje eller anden skal-anført tekst" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst sluttede lige efter et \"\\\"-tegn. (Teksten var \"%s\")" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Tekst sluttede før tilsvarende anførselstegn blev fundet for %c (teksten var " +"\"%s\")" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst var tom (eller indeholdt kun blanke tegn)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Fejl under læsning af data fra underprocess" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Fejl under oprettelse af kommunikationskanal til underproces (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Fejl under læsning fra barnedatakanal (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Fejl ved skift til mappen \"%s\" (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Fejl under kørsel af underprocess (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ugyldigt programnavn: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ugyldig streng i argumentvektor pÃ¥ %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ugyldig streng i miljø: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ugyldigt arbejdskatalog: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Fejl under kørsel af hjælpeprogram (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Uventet fejl i g_io_channel_win32_poll() under læsning af data fra en " +"underprocess" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Fejl ved læsning af data fra underprocess (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Uventet fejl i select() ved læsning af data fra underprocess (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Uventet fejl i waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Fejl under fraspaltning af proces (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Fejl under kørsel af underprocessen \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Fejl under omdirigering af uddata eller inddata for underprocess (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Fejl ved fraspaltning af underprocess (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ukendt fejl under kørsel af underprocessen \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Kunne ikke læse tilstrækkelig mængde data fra underprocessens pid-kanal (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Tegn uden for gyldigt interval for UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ugyldig sekvens i konverteringsinddata" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Tegn uden for gyldigt interval for UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Brug:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[TILVALG...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Flag for hjælp:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Vis flag for hjælp" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Vis alle flag for hjælp" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Flag for programmet:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan ikke fortolke heltalsværdien \"%s\" for %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Heltalsværdien \"%s\" for %s er ikke i gyldigt interval" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan ikke fortolke double-værdien \"%s\" for %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double-værdien \"%s\" for %s er ikke i gyldigt interval" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Kunne ikke fortolke tilvalg %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Mangler argument for %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Ukendt flag %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Gyldig nøglefil blev ikke fundet i søgekatalogerne" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ikke en almindelig fil" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Filen er tom" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Nøglefilen indeholder linjen \"%s\" hvilken ikke er et nøgle-værdi-par, en " +"gruppe eller en kommentar" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ugyldigt gruppenavn: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Nøglefilen starter ikke med en gruppe" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ugyldigt nøglenavn: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nøglefilen indeholder kodningen \"%s\", der ikke understøttes" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nøglefilen indeholder ikke gruppen \"%s\"" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nøglefilen indeholder ikke nøglen \"%s\"" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Nøglefilen indeholder nøglen \"%s\" med værdien \"%s\" der ikke er UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Nøglefilen indeholder nøglen \"%s\" som har en værdi der ikke kan fortolkes." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Nøglefilen indeholder nøglen \"%s\", som har en værdi, der ikke kan " +"fortolkes." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Nøglefilen indeholder nøglen \"%s\" i gruppen \"%s\" som har en værdi der " +"ikke kan fortolkes." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Nøglefilen har ikke nøglen \"%s\" i gruppen \"%s\"" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Nøglefilen indeholder beskyttede tegn for enden af linjen" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nøglefilen indeholder en ugyldig undvigesekvens \"%s\"" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Værdien \"%s\" kan ikke fortolkes som et nummer." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heltalsværdien \"%s\" er ikke i gyldigt interval" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Værdien \"%s\" kan ikke fortolkes som en float." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Værdien \"%s\" kan ikke fortolkes som en sandhedsværdi." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "For stor talværdi givet til %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Strømmen er allerede lukket" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operationen blev afbrudt" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Ugyldigt objekt, ikke initialiseret" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Ufuldstændig flerbytesekvens i inddata" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Utilstrækkelig plads pÃ¥ destinationen" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Initialisering med mulighed for afbrydelse understøttes ikke" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Ukendt type" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s-filtype" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s-type" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Uventet tidlig strømafslutning" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Unavngivet" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Skrivebordsfil angav intet Exec-felt" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Kan ikke finde terminal krævet af dette program" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan ikke oprette konfigurationsfolder %s for brugerprogram: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan ikke oprette bruger-MIME-konfigurationsfolder %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan ikke oprette brugerskrivebords-fil %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Tilpasset definition for %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "drevet implementerer ikke eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drevet implementerer ikke eject eller eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "drevet implementerer ikke forespørgsel om medier" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "drevet implementerer ikke start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "drevet implementerer ikke stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GEmblem-kodning" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Forkert antal symboler (%d) i GEmblem-kodning" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GEmblemIcon-kodning" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Forkert antal symboler (%d) i GEmblemedIcon-kodning" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Forventede et GEmblem til GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operationen understøttes ikke" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Indeholdende montering findes ikke" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kan ikke kopiere over mappe" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kan ikke kopiere mappe over mappe" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "MÃ¥lfilen findes" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kan ikke kopiere mappe rekursivt" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolske henvisninger er ikke understøttet" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Fejl ved Ã¥bning af fil: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Kan ikke kopiere specialfil" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ugyldig værdi givet for symbolsk henvisning" + +# ved ikke om det er papirkurv eller blot affald, eller om det er et udsagnsord. Vi skriver det sikreste... +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Affald understøttes ikke" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnavne kan ikke indeholder \"%c\"" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "diskenheden implementerer ikke montering" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Intet program er registreret til hÃ¥ndtering af denne fil" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Optæller er lukket" + +# udviklerkommentar ved tilsvarende streng andetsteds i filen forklarer dette +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Filoptæller arbejder stadig" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Filoptæller er allerede lukket" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GFileIcon-kodning" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Fejlformateret inddata til GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Strømmen understøtter ikke query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Søgning understøttes ikke pÃ¥ strømmen" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Afskæring tillades ikke for inputstrømmen" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Afskæring understøttes ikke pÃ¥ strømmen" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Forkert antal tegn (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Ingen type til klassenavn %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typen %s implementerer ikke GIcon-grænsefladen" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Typen %s har ingen klasse" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Fejlformateret versionsnummer %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" +"Typen %s implementerer ikke from_tokens(), som er del af GIcon-grænsefladen" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Kan ikke hÃ¥ndtere den angivne version af ikonkodningen" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Inputstrøm implementerer ikke læsning" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Strøm arbejder stadig" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Utilstrækkelig plads til sokkeladresse" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Sokkeladresse understøttes ikke" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Kan ikke finde standardmonitortype for lokal mappe" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ugyldigt filnavn %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fejl ved læsning af filsysteminformation: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kan ikke omdøbe rodmappen" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fejl ved omdøbning af fil: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Kan ikke omdøbe fil, filnavn findes allerede" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ugyldigt filnavn" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Fejl ved Ã¥bning af fil: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kan ikke Ã¥bne mappe" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Fejl under fjernelse af fil: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fejl ved udsmidning af fil: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kan ikke oprette affaldsmappe %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Kan ikke finde topniveau-mappe til affald" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Kan ikke finde eller oprette affaldsmappe" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kan ikke oprette affalds-infofil: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kan ikke smide fil ud: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fejl ved oprettelse af mappen: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filsystemet understøtter ikke symbolske henvisninger" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fejl under oprettelse af symbolsk henvisning: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Fejl ved flytning af fil: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kan ikke flytte mappe over mappe" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Oprettelse af sikkerhedskopi mislykkedes" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fejl ved fjernelse af mÃ¥lfil: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Flytning mellem monteringer understøttes ikke" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attributværdien mÃ¥ ikke være NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Ugyldig attributtype (streng forventet)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Ugyldigt udvidet attributnavn" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fejl ved instilling af udvidet attribut \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Fejl ved stat for filen \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ugyldig kodning)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Fejl ved stat af fildeskriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ugyldig attributtype (uint32 forventet)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ugyldig attributtype (uint64 forventet)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ugyldig attributtype (byte-streng forventet)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Kan ikke ændre rettigheder pÃ¥ symlænker" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fejl ved ændring af rettigheder: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fejl ved ændring af ejer: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolsk henvisning mÃ¥ ikke være NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fejl ved manipulation af symbolsk henvisning: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Fejl ved manipulation af symbolsk henvisning: filen er ikke en symbolsk " +"henvisning" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fejl ved ændring af tidspunkt for ændring eller tilgang: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-kontekst skal være forskellig fra NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fejl ved ændring af SELinux-kontekst: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux er ikke aktiveret pÃ¥ dette system" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Indstilling af attributten %s understøttes ikke" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fejl ved læsning fra filen: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fejl under søgning i filen: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Fejl ved lukning af filen: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Kan ikke finde standardmonitortype for lokal fil" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fejl under skrivning til filen: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fejl under fjernelse af gammel sikkerhedskopi-henvisning: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fejl under oprettelse af sikkerhedskopi: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fejl under omdøbning af midlertidig fil: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fejl ved beskæring af filen: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fejl ved Ã¥bning af filen \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "MÃ¥lfilen er en mappe" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfilen er ikke en almindelig fil" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Filen blev modificeret eksternt" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fejl under fjernelse af gammel fil: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Ugyldig GSeekType angivet" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ugyldig søgeforespørgsel" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan ikke beskære GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Hukommelses-uddatastrøm kan ikke ændre størrelse" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Kunne ikke ændre størrelse for hukommelses-uddatastrøm" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Mængden af hukommelse, der kræves af skrivningen, er større end det " +"tilgængelige adresserum" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Forespurgte om søgning før begyndelse af strøm" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Forespurgte om søgning efter afslutning af strøm" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "monteringsobjekt implementerer ikke \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "monteringsobjekt implementerer ikke \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"monteringsobjekt implementerer ikke \"unmount\" eller " +"\"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"monteringsobjekt implementerer ikke \"eject\" eller \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "monteringsobjekt implementerer ikke \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "monteringsobjekt implementerer ikke gæt pÃ¥ indholdstype" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "monteringsobjekt implementerer ikke synkrone gæt pÃ¥ indholdstype" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Værtsnavnet \"%s\" indeholder \"[\", men ikke \"]\"" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Uddatastrøm implementerer ikke write" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Kildestrømmen er allerede lukket" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fejl ved opløsning af \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fejl ved baglæns opløsning af \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Ingen tjenestejournal for \"%s\"" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Midlertidigt ude af stand til at opløse \"%s\"" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fejl ved opløsning af \"%s\"" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Ugyldig sokkel, ikke initialiseret" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ugyldig sokkel, initialisering mislykkedes pÃ¥ grund af: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Soklen er allerede lukket" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "opretter GSocket fra fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kan ikke oprette sokkel: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Der blev angivet en ukendt protokol" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "kunne ikke finde lokal adresse: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "kunne ikke finde fjern adresse: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "kunne ikke lytte: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fejl ved binding til adresse: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fejl ved accept af forbindelse: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Fejl ved forbindelse: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Forbinder" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Fejl ved forbindelse: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kan ikke hente verserende fejl: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fejl ved modtagelse af data: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Fejl ved afsendelse af data: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fejl ved lukning af sokkel: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Venter pÃ¥ sokkelbetingelse: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Fejl ved afsendelse af meddelelse: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage understøttes ikke af windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fejl ved modtagelse af meddelelse: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Ukendt forbindelsesfejl" + +# Relateret til ordlistens "(SMTP )listener -> *(SMTP-)modtager" +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Modtager er allerede lukket" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Tilføjede sokkel er lukket" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GThemedIcon-kodningen" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Forventer én kontrolmeddelelse, modtog %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Uventet type af supplerende data" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Forventede én fd, men fik %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Modtog ugyldig fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Fejl ved læsning fra unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Fejl ved lukningaf unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filsystemets rod" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Fejl ved skrivning til unix: %s" + +# "[abstract unix domain]-socket address" eller "abstract [unix domain socket] address", eller en anden kombination? Vi mÃ¥ hellere bibeholde ordenes rækkefølge pÃ¥ bekostning af at ordet bliver meget langt +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstrakte unix-domænesokkeladresser understøttes ikke af dette system" + +# eject og eject_with_operation mÃ¥ være funktionskald, sÃ¥ de bør ikke oversættes (naturligvis er det ikke en særlig brugervenlig fejlmeddelelse, men det er jo udviklerne der bestemmer dette) +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "diskenhed implementerer ikke eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "diskenhed implementerer ikke eject eller eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Kan ikke finde program" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Fejl ved opstart af program: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI'er understøttes ikke" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "associationsændring understøttes ikke af win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Associationsoprettelse understøttes ikke i win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Utilstrækkelig hukommelse" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Intern fejl: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Kræver yderligere input" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Ugyldige komprimerede data" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ugyldig UTF-8-sekvens i inddata" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "NÃ¥ede maksimal data-arraygrænse" + +#~ msgid "do not hide entries" +#~ msgstr "skjul ikke poster" + +#~ msgid "use a long listing format" +#~ msgstr "brug langt listeformat" + +#~ msgid "[FILE...]" +#~ msgstr "[FIL...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Tegnet \"%s\" er ikke gyldigt ved starten af et entitetnavn; &-tegnet " +#~ "starter en entitet; hvis dette og-tegn ikke er beregnet pÃ¥ at være en " +#~ "entitet, sÃ¥ undgÃ¥ dette ved at bruge & i stedet" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Tegnet \"%s\" er ikke gyldigt inde i et entitetsnavn" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Tom tegnreference; skulle indeholde et tal sÃ¥som dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Ufærdig entitetsreference" + +#~ msgid "Unfinished character reference" +#~ msgstr "Ufærdig tegnreference" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Ugyldig UTF-8-kodet tekst - for lang sekvens" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Ugyldig UTF-8-kodet tekst - ikke et starttegn" + +#~ msgid "file" +#~ msgstr "fil" + +#~ msgid "The file containing the icon" +#~ msgstr "Filen som indeholder ikonet" + +#~ msgid "name" +#~ msgstr "navn" + +#~ msgid "The name of the icon" +#~ msgstr "Navnet pÃ¥ ikonet" + +#~ msgid "names" +#~ msgstr "navne" + +#~ msgid "An array containing the icon names" +#~ msgstr "Et array som indeholder ikonnavnene" + +#~ msgid "use default fallbacks" +#~ msgstr "brug forvalgte reserve" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Om der skal bruges de forvalgte reserver som findes ved at afkorte navnet " +#~ "ved \"-\"-tegn. Ignorerer navne efter det første hvis der giver flere." + +#~ msgid "File descriptor" +#~ msgstr "Fildeskriptor" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Fildeskriptoren, hvorfra der skal læses" + +#~ msgid "Close file descriptor" +#~ msgstr "Luk fildeskriptor" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Om fildeskriptoren skal lukkes, nÃ¥r strømmen lukkes" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Fildeskriptoren, der skal skrives til" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Kunne ikke ændre fil-tilstand: fork() mislykkedes: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Kunne ikke ændre fil-tilstand: chmod() mislykkedes: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Kunne ikke ændre fil-tilstand: Barn afsluttede med signal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Kunne ikke ændre fil-tilstand: Barn afsluttede ikke normalt" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Konvertering fra tegnsæt \"%s\" til \"%s\" er ikke understøttet" + +#~ msgid "Incorrect message size" +#~ msgstr "Forkert beskedsstørrelse" + +#~ msgid "Socket error" +#~ msgstr "Sokkelfejl" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "Kanalsætningsflag ikke understøttet" diff --git a/po/de.gmo b/po/de.gmo new file mode 100644 index 0000000000000000000000000000000000000000..280772b24df473116a6e96f6aaf3604e50303cca GIT binary patch literal 46536 zcmds=d7NEUmG6%uiXzGoW;hH*Qji;xfDB0(GE_n&6RCti2!>l#r>ZV>>)y*9Qb`Ho zfH;8zB8rNljo6B`+A0pgR+C2UZeF)TtKD`>ciWCnTUwvk+P2U4{jI&vbcae|`$vCX zeLg$Cd(PS8+H0@9_S$RjJbKtu-yHCF&y#}Sc<}f`f}rqZ@L0VKf-j#E1c!rP0S^Md z=keb>KJM|i9-nrqi+2e4EaD&OpHBv#%X2??6}SZ43Elw~!C!#KfLELr1Sf$tupfK_ zsPaDzo(}#sxB`3}oCBWU7X(|ujo=aBd%-ioPlNNo?}H(DD2a~)7lITOtOHeE4Lk~b z4Y(M54|oCib?{{H(78cy4!8(B3mgSi?w#P--~*t_`xkH#cnF0Sz>7h}p9EFj-Jt6C zc`yXO0jhof0jgdn^T5yGLU2Af3R3mpO(0bXJ_SPJ;GaD{iw%hmH#oY2>t`O8oZE3iY_;U zqT8pyCE!m$l|PrvE&)rR%KHGg4g9{xiy)5Zbtfn~eTje6-d}+igC{Nwg6D%T1lNLh zfNumJ1w*h#V$t)B;ECXUp!oM;Q0@H=sCN9?KOaUV597HXRJvuL(p?TJT@6$}+y5BmVzO;2~_&)L6v_SD89PazkkT%-+BB6sQNt@A}U=! zsQ3e*`uQ6F{w1Kwe~16R7gYVe1|9)E4l196Ayx>U3W~2+fvU#~{c{Ucy4QoSQ1B6u zt_uDERJqSQHwaDuPX?9#Vvw#5t^)P_7EtwkC#ZZr?ce_+sQAAC)&I{q&+*Y(kgf`L zgBnlo2NmyMJ^mKFi07lu4+4gAa0RGw@*+_6co)c!3O)nEGQsyi(cuU(6MviysvQkb z>F)-`Kl?zn>xbas;2bKY`kn#uDp&`KuW#|s9|6_>KL(ZV8B5)GJ{Noq&qJX2|KI%k zBbK>we+j7iHbLe8R#5f%G)Ps0?}94tgbQ80wt;HLjiAc;pnv`rIEUwFLJXx3LFM-X z@DQ*Jo(N8Zs`p*sq2Ql`%I|MM#d``wQ9YmM@qAGA+v%TQ4xYsG2f)L?zXXp3zYW5Q z!LLBoYyKrp4sG}Na*rPbRll!;M}fZsPXdox?&SJ;py+)msP^pe?;D`_^kz`;?*fko zKjq(l6;%KI02IGG8{w{a7lMeU;2Q8`@YUdP;QinU;1@xLcJMt=bU12d5NrWggO`GD z2PLPz3qs=H%vJO~SOS&rgP`*L4yf{;I^f!W8h9Gdn?cFrDNuB}2RsGb3yNNkg6iMH zDCBr>9jNamQ1rPKRQ~sZ>aQ<=s_!>IL`m?BHOL@vDR?5d8$2C+3#fem3{<(l0*?U? zr%|GR0aX8O1D^+82c8Pv0ID7LfNJOGzzyIbYlGm!;0|zF&o6NGdzHs~z&_r85)|J) z3W^Voy3Fz00EmbPYX12?5D^`G1yp}OiNe&bBf&GlHDCxfK;?S}DEfRF6n(x49tr*@ zsQN#5z2k>dK-GUKD1Nyb6#Z&o2;L5gZ$1htzehmP;YXn8^k1OjA4Q|pe;0t_rx$`M z_w^v85B?Nf0{$8-fah#<{V@cp-`)%|)Po1W5d0B17d&{Ai@z9DKU@nc-`9Ym!vmno z{X7_g-v=)S54zm(=NeGsVi%}--v)}G?*Ucshd`C{C@B7V`ev7I2{@1E61Wh&9Tc7S zgQC}Cpy+bwpzE)Bp!jJJr0PK(WC#TNK-Kr@3=*a52gPq|L6u(v&j4=+mEUK;=Yih< zmERA+XM+cAb@?3u9>nvNpy+=s_;m0^pz8TDZ~^#H@NDoqpy)m43P+z+pxPgS&jMcx z9uD3Hs$TB~j{v^}!fL^{LG^q8HdoKpAVW8}9#r`cg6g-gfGYoxE1g`t2wcSTI`FyR zi$S&j^siJQsXg(LFB%=kt8E ze|{Bs?~{VyeW2*QZrJhrh{v+WrpFsR-t6&KP<(v{sBv)*DE@mNcrExz@Oto=5hs^l z3#wjEj~xB_K(&7zco^6Mmw~SWH-QiP?{h}cQFy)>)cAQ1xCDF6?h5HcY?=)-vm|fpMz(B zr`Cc15(FDS(dQGO#?3S7MA2s@sC;h#5p}`m{PUc;i?Q2e*8;p+c7 zQ2o0XTnGLNyaXI*GUmZs!27^&gQtTxw;X@p5BBl=2q=2|96Sv?Vwa0|0eBYA*Mf7v zH-MtY`@s3&=Ru|aDX8&v#FV4&Vo>kL!1KV{{PV+L$n%fEIpDK*d-{Ot#|@zBF$Jog zcX|9AsB!rNQ2l?<9+%G|P~~g}PX%{_>c4k@iuX-$F8HKr*RFn0{jvcJ!JGX1dqB1G zVNm5f?!O=TBA4!5Q2cQAc>GPSJuUG0Jl_W{1^*FLK1aWV zwE(ytEP!tXF9*K>svSqa)TQ49sy;6T*MlDej|HFnGFRRS;AWm*0BW4x4XXU_fD6E- zFL&>+16AJ-fwzIb1eNd2H@osa0dC{@F>n#M<`u4wj!Kb|1 z^~ZT&KhM{I7lE$?75@w1;oy^BfyaS=4;}?R4xR`ea;r-}A3UDt?V!fb6nHxLI`9JUhnWT^?mxA+&Eqas=n8P`hFL<2K)pl zKKUJ31XteSp5F^@;`vA5Fu3H+j&AP+MX%3*1K_v7Bf;=aH_p!m&*1qAP<-@Ka4YzB za3}aP@KNycx9|>J_*OSA9sw2q2Venw(p_%coCT`gH-ZbmPl77<2jG0L@HQ{cL6v(4 zD0+MrlwA55D84v_!j$hCa4y&a75{GVIPgp09Pqo~Dd2BF#XIpGjvrQo^LU;FRgXJC z#d{c3zCQ#H2j|@F`0fnwRGwFYDt`<-7rYf*4DJU-?_YvT!7JbC>kmGk=g)#6_&BJ3 znDZ_t$Hzdm>($`d;HN?H<4-}=_t<+}`71!hyBbt^w}O{|p9NKq;N5OKoCm5M8^J!X z4l3PSLB;zEa6K5j2N@4+0L71YgBqt_2gO&%{*fOSpz41UsC+&So(z5;+z3A7UYFmM zpvt=sR6jlfs^5MMo(P`#UPqS~fc-q*0v-W=*groE9?J7$;AZf5;4{I^_qq1$01x8% zCh$`5m7vDcm%#z>xc9mIi=g`RZt!^U5%AgIk3h+bUxK3VbN<-TbqRPC&x7DG-~-?? z@QeQaQ{V5}`$DkB`>n6T{ZAb@Lk|q@UKAe$B`d${eBs^ ziRazm1>j$RtH7sx*yVRAD0=J!Ro>0uDc}R3>hon#<@`Ii9z5wIF8(AaKDr%T0)7Nk zyq|#T=i~m=(ffQ*`CJEzk6!~8!2RH6@Mqv+aMefMc$fl3*FOQp*Ixuh*B^n0fd_re z(c@T9?LG%Q4!jmrxi@&c3lyCn1Vyi}fa=%ZfMC5Jm{+^GsLU z-_`v78o!oh?_kcw(B4F9DeuvZ|Y-M z$kwp$0Dnr*-|PK%{l1OxWS$=Z|5h*j-__vX_}};V_~(F#q~N#y{iQs=z<+y*$Ax^` zNI0J7XZv`9TX_C65Y`Kx%kNhZHV{6iXTs+ROL?|&4eIYa@T=};a1g%_A>6|A67V0u zVentUea{um9z2t8dVcdSX^`Cz3_Hmx+-){xqrr*5Z<=+Wj$@2>E zVnU1G4WI7+@O+v7{Ved!Jb#uj&%e8i-}*b5fH)8Sjc^v>cLe=0CD|HVzXwTk3gIYz z-#}Qcm;UdM!M`Ak^8H5ecEV+Zxjes%@W1)JpP;|*I|#P%{;B+~fz#j{K>ZyB{s>&` zpDzTL5vB-V=l#DB*6=$5-$}TF@FboKgkSSpe-(b8On4Q)PXv!9==^%KKPwyWM=4BpU z?|(nLE#8-SulZ=a?fnaQ_e;WAynhQgN%$v%{(kPj^pE%Z-xcsb2|pvO^m$$5@guzZ z4x!2Ok%SNOTYrZUuJm#21^+ys@O1xhJKyFLUQ4){a24;5BRu543l8?bpTYML!e8;+ z=ieR2^PvBIKlnVtlL-y~?h76TlfQFn{zYd8cku0_;PHg#^LrB^{(G1I zaUJjeoZlybF9$Ew`*2>Vva47wjf7EUxH?j*jP(b73l@!r11lV^@pzfX^&U5Q+yXYj z(NZ~T?x{uk?XVRN?P>Dtuo2AdYs?Kxjj&Q}hQ-hoIXqsh7l)fsJsho;%hf4L=iA(6 zbHn7z(y-JFCyRS5-B2`Es)WT#7?q>RsL~88#mQ*aIXB0nG~WiroHci8Xw~`y=3lNh zqFnW?gr%VhFRG2vNLmTeW9~(ByS6}03wwT9Lbk(m!(iUUo5N~7oOkinXBMs*DUFqy zjc~HnXof?PrzzzP?FsvX{&1?)9Iv*TVYL=jMCp0K@^GkHotP}vCx~1Rw{Bi*wWXr< zs5r7GjCPkA%|@_%sL@nEg{?|ycQ{g=EYb^&>hMHFSB{L-qedfg9ouNtYSns^GOHDu zO!FFh8qH`jSUxhsOP_|I@5>y*OCjY}QLdElM=@pn5UG*|SoOQgP~^M1-MRQ9}AkwNluyb=|sP zMR9ndRkPs{CZZ5qF_See@lhpV+c;RtOWZi)caU9>KF%*N^crBRD$S=ma7Q>cYe z*lLj5`nBr^D5f%68f(>EyBTgHeCcZ}A#_Pn%uw)&r5uSG6V0k`agz5)m2q7!PSL-` zkr3_~+gYmaWRO=XQF*6c?ktxo(N6db&h!gsX{?t;h-afe=(Xka4z@@e8|eem;WxMpAyUYmR(aifv7v(9}rOfmb|TgH)qU2~s= zQBn@-&QKBoX&m2ZSg-|Ic17hqZCsf|Frg$_Ki`5?IENTWZZskpn5d!#!bhVqj$A9&k-Q_-mgIpOjW$>%*c=}! zOBbtDX-1MFJ){>1OcbtJZ=!2$rPgW=HsR&T zV5MX1keO|=R3TDBJYQ7lYIHgQD5jqQO)`%%NGf9z-ALmts|$>cXM6XD}kZf->A%)H4m1e2ACoF_fW4KtOhDi>^MtC|; zOM{hFq{OhvYpBSqFs2ztubWIn%FxXsX=62Q>3ckWN9)zeOpRjJQALbLm{-)+WF{bO ztL)mZIorCquk1A$r7|(5aS)!;*El5;-3FHDTNum=wjz8{Pavuj&CKQ0eI!D-F<{_B z&(Es{RymWzM70uyLon0uc(5uflId5?IyPmD?gG@cn6H6LZuv73p9$XLOY>3q{-5kd)~+p@mKSr?`G zdev8}1gj_HiK{R#S}?XCTqcG0qW(06svAw#5J51UA4hP1wF1{eCPcTXl&gBoD`8e_ z2LpatVk2HTJ2iKHh%RYFVS+_KH_6+2Ev_5#$2z@ddInP_Za$Y_z^YHS5~OoaUpf~_ z9U-LYOIz0QzQi<8tVc_nL=8{BzEy254NouYpE3PYtW_IJg8`Sv{~+1#Yh;Q>JgIqU zJyEGnRj4vT3$2#k5bC0zjr{T<^HCY;qhx%S z*KQ%x<%3p8+1I|{%Gi=HaK*-T(JS;4|B?yCYAQ9y1bS^xx6g?#mH9Z*lFqC)`spt7 zZ7gb9wrYl3i81O&tC<+(B5KUIGRSDoneUUu34KKS8LG0VV$!cnWItDTbs-bel+^jK z&*=eR(){#OCYM-tCe5?q&?SORxf&`xzGYrZ(^J)|wg5~?t*JY%a(gk!H|Yy)U7!2b z*3D?nQOO7~QfwA8l}JBKqOugnvbglsZ!=n2;o55I$ z+n=kcf6r>2C47;kXh+74YS}96WR;CEG_lOfTz=xlsL(S4GRim$QQcNh!^`+KTE?$C zDTzL3Ts}Cku2gC5HZdOUZf0r|$Kb8gZc=Tfjho__li0#WV(zP6TyLnW>wL zt`R+1n(kRtM}k-s)T3G%`;e)ZO<2K{_q1Z=RyHLDCzXKS-bM(SqWqUs3~0rnm)2im zDVQ)`LSTxs0UIF&$9A?V8qD+hS=G|Fyb>{D)u)&k8KmZWgM(Y<`$#Hek#TsvTE=Q- zQe}QP#`2|aBojya|LBO*Jlw~FgVk1|nnX`%naQub$PMT9HTtvhOan_AwIm$188%=0 zOtzZFC|69IjH`~%wG!(*wNI)(B$TC&R++*EA0YK&%U@e)I*~|N8%DDv9MzcZ zMe)g^H?=u(Px9O=s%e}_*H{O5R;F7=^mTSAjbqbJ&1d^Wvzn<`XRGmA-+XD~!{cEC z6E++&Uc|^Xgqq8W(ahe-Y9_PJPwgS|PCs?=+2<^E%dFj470OXRHV3+WyjXMV6`u|-|Im>A6Twz&8m1=8jyfbI?b{i#ad}3+5F~i1*MpDl>Nnf}1 znB}4+T286!HefNtn_*h39IRVfB9&z35{Kq!&{+x7*pnJa(l`zs!`iEFy?Bioqcn{n z-E9Z>a#{P!td=sJ+YU&whwDbmt;Tq-Ogp1D_Ed&vAKTKmMVE{-(ZjMM!!mjurE8LL z7J)Q^A?y|#@Vhg?2dmp+l1*$$^{W_*!E0Ndy7;0TtDM9@LQn^a?v9wgsDR z#hv78|ldIzy~9ZdBP-s#hx-DESy}>BGWze;M>bTKL#COCdWlOD zF9e&RRfw0`r|c(`@NoGHX?m%?>Bc#0B}jNv09gwbD*W zbIZqwsePdD^jfBiyToR)WN*mXZ(U4|^^G=d{~KeK+Z6PYN12&EGt?So^D9`#It){@ z83Ws<)AhwNnmC)Lq|q$n)HyA)G|_73HAtf{gAb7l{N1chMC`20>l^7;VI7;mvrp5$ zU7Mzi_o-Z|HU{0MVyt-i8By$E3X+^2g7w;+q}vi9p*0nvVZAnhhoa_`)MMKkYv115 z5J3goD{|BBhH7X|0`lB(drd|qGg)`_5D7?;u@}lh!P;H4m+uC{)i&K#IdcM$FlkR> z{VOT#csiRr@0DU)NqL!y;Cf-Ie6j%JvoRdw*XEunai!Q*Vs90jUbXJZkE>>M6ZMDL^?=xF6&*owj7xO+G*2mg<~pKE8V4eJ z6_W*^NN9!=PcDgATOK%N*dqBiwkcsGaFb8$0Mi*q#W1637aBuMuyG{2HLLn(HePVO zx^Qm1v6S1+bA7~Uh<72ZS?0TnSt5OWivCg;k7hb17^3e>34iOe!#5_{v|+AGN%R}i!Ocuue_sitd~^-~wQIKifNKZ|s!kt!}u^j)s*@tS;07UyQ@Cm{8ojUDU5V6&O} zO;otCJvzcW(;9hcO5{*P2TE6w6lN>ZTog2uXvytXvK=Y*RO7J$=Hs?mwL5*x;s{zTN{*YnnW96~otO&|A<`uES!h*(T8vg2D0Xlsp(inaljHO2fU)zj1zn zRHkkI9jvzMh)>UgUB1hl9krKg^h%b3zB(cFuJ75Yt*l_s#pu1z_7S=inBCKAZ|;_K z_k@)aGg~9bzEW+2wIz02vrN51GJ?SA#9kcaA|)aqBQMN2f`~{~0I7{e=EzFvIooCw#7S~)6K7AXH&L?10z(Ink^ zeYR=h*xTR~^^it_ZzCNs!pmyK2G2Ikcw;_un_5y6L~!-SO%bku-O?iGoIrJ+o%AS2N1zREh5WWTi8`|o z%B-g1kDPdzj_Ork?I0;C;bp)4na5SHd`!<`*j99#9M`G}NM?tzgbdxW{-m&{dbj^+FdIN%{yF>C@H-~)KXDUeAfwXq!HQu!Q z@iwQhe3&0^)F4H@-l}Q6;>_Hl9 z;cK-Pc=J5!vPkDmEaTDc;s}RnCh3y4hIW3U`g3p0$ZDi=G)BT?TQy=V^Vycpf;l$oItO_`h>#kQqv;Yy5837c_B zY~I5D*O?osaQcb(UFLV(r);W?VK@`QRv0M(;|JxCe?UHEg1osZ?RFe z?nH?*he#gSIScqrC;zBM7XrpH7>VYJu6c!xjwGd5drYqOcYS+}$=mi8#`(tSskM}V?Evso6bpt@gDO|ik)^Ut?c4qmCST_*iW`k{$1yA zH3n7EZTV(l7;_E_Rbh{h>9 zWEa{Va~e+-M9vik{1pI8!t;kp&4V|UIWJr;tY&7%K2oXKW8=cbY?|253+GkBlP?Sx z^&fm?VN(@_tXYUFz9d{@%}c+m)O1$oRKuEq&FhzMxawf89%xm@_CJI-5U!|~;cp#b zoBF-3AFw{)^h+)1qbCKeaD~5pK-dWO?d@yqyC2=9$#yw&NL+3s+#cap$PP>e#tQkw z0pERlm+ia1;6E&7QNT*OK57YxIN+R-BtO_^Gy^{#6$dN;2gZorCbME|6y-8XN~XB8 zs2jsiM{#^cfA|uqEj+~W=l$=JIk>GMzF1$05m{^NoDCUby%1AK#M`&`qJ8)GY-~N; zAgS7m7Vh&BHF20+LAw`1=edWC7NN2CJ%*`|l;= z!l2m-3vukJ65G7KvpD-24%$@)Ar8yqx(b2u+i328s5#x_gk?QMxtVT_MU**4#x5)4 zw=op$ar~$`zYwgp8bSL(w56ytw2RTsP>0q?JIKHe2=mim%^H9{EhlY}eXPF!LAs5# zH)k(JF0>exG^7QvtFIA()1J#K@Yx6hso~ZaQDq6|1(15IPAcIpbdcq&zNg(y2)wa| zxW#t2rY-mTz@B#6OpZrDBYro58HqMK!axGH=gD{~qD7VDiUc0zbHO-r@pL@`i-ZzK zxRTnbWrHGt1VIDyR#akj2Kne-k_Q{>Bl7K-kl1v&?0-mZ8u9yT4H?3&g)12z>4>R{ zb&n0vr#T0U#b1KIlubI3&({R*W!d`_8g!m2)~C*Cge!0WZ8AeqewH%g7Yc~$XG`r~ z*%<4_`4rNF-}xi<&OP2*{G^zh|yM+U~_SblRC4wn!%HOa{q%&r*PZM3ElM! z?P(GY&DN-$ZT7!|jvb4JaOMg96mE<^Xi8ZjnJ%(Ak=NJDAX{c)npisoDmiLkC=aCNHHmZ((r z({m8(6~&gOw((+l$V*RVMyklJv}Q}Gs$7FH`^e|Vas9GwT3xE^Fwn6kOw05-;B*T$ z9J2+{f>_Gki$NFa46~-n zSdXAVtQ}G96W@*D*&=2mSrw*B8TOt}yZrR(bEM6jOh!#$B18x=%Udn{S7_*e<)*z3N%Y@I zY}4=xKVxU_*%0&fH3DZYDXhWpj&meN7l_HApNz(xHfEhkS4>Yu+^>X*EI;qcVcAw3 z1MJKdR&&t?`zK@EK10uP3&BKsmLnr*oomV(4bp%be&9%0nzGB+ zSUq#A5wE>ldGQzNT{9Jgf07@3YDoi8XO>mgi6OfcbqNYLsfy2}iIf`F%HCCP&oQov z)e(ZuK4o^P_4_0&Buj=$xCNWIF6QV-@%Cyn05gjvC3gZz#P=2R+&NRO$+A+;#G`04 ztioy~v_mG9auHJ3$%N(ROnJ1|EGDSBHky$xl3A51f+;TBSKMSwJg7O8t2S{sXBr-K zG2<4_P%Rus8{t$7CEsMbZ&s#NtQ28YWTA40e(ti4WD$xqjJZ86#TI_4q>bquFSEn; zTRePkYK>Hmprx^FGDs_}ItxM>d|Q)2`#kKMpG?PO(Q77J5X2RUX=cr~S#1 zV4FB*zWzf~(*NvvFP=Fur$|wRsD5@Ap<0!pNV*#`Ps=z=TABMnSV(6Vv~kXVGT_@AhPuz)Nv4>CRsXmW}T@XZWYdSj|e9rbV*d*j&yt^R!P%w zTB~dA(>?Vk}4V z-lGMNZ_`G*0;MCGOl6ry_o|qSR%BzZJ2$7_WlhU)Xh(qqQu6Us#0I6ToU==|s|O}) zqcVqyA2(o+t)uz4!)&=&m8Oh@*}8WYm5XD#aK^HNxQc^A9K5IQIpK+ zsLWQac9B*y*0?Pa+hS}{?7vri*uC`StZuSfJ65;whqgk8d?gxMK?u&6U>2WrQd}{_={B*5(s= z(PAb`cOlKpsk;hoxdw>!*0ZHl?kJEujEC7o;EutJ$m@v3;zyU*c*$vp+GHfqAY9&R zjBo?tM1xsWE^yhYpf5iWyIIN#>X}7H(Gt>=2Q0ZG8Km$wPd8kcrr~R?)ihcdKVDFv22a?<6*B37|>nL%00FPlZ2?IK=q%x4C7YZrFpY*u15j-kX=8nH9s z*swj7DfyjA59UC1ysh9HEGOW+l?;O+wm4jk<8}wVDU?xDy*({+^-ebu_0CGx2K>_E zLXDu?OiE%{Xu>FNRjXw`ckxU(XEF`l%TRW4RG7x|$6T88t(yU`09QrY=CTs&I;NB>2^-P}D zt-YCGEaGCITHJ^wp}!~SiE$G8tQQj;fh@ovAVTjfhOSPlO`v znc#n_8<4tHoqlmkOg8aZ;hV{CJH~iTIeK7ncU#Vh$$8!sOy@2g>bG4^JiXcarc%6w_rJ?16K@2@OtOoU4jG1{Z`?u)6A{ALCuxu5 zsuE|BPvSTl$=e>O(i#iZH%`Y>nFYLUY&ddIzM`4ODPggAF-e%u90P{*R>mq@8QR*7 z<4$8AR+esHXL>VOPTU>?#c${2i*N%1+VxU)x{84=d2F3j|SjM#H=<$ zrHt@(w z?C){Px|lfUqn^yn5YO$7iY2WYE~`e5JDzMm$2ov(W7KiGQ@5>AO}SC(OtKj*29X!r z-n1`-Lg#ix_U*k|Mqg8t+$QV3z1Lve-kLgkt&gvN!mkYP9*IytkfeZ#c}FB&jDvGt zHjZj0If6AEyP2 zl*D;d&NjBYT(>9qy+NYR?o61q`C(_$JUuEYQT#c4lYr1UM$Q#3Te4i(YZiGuu|4JD=BXI7>1 z5-u~*xXCW-p_0#~XoyzGYCiQMAV=A7UGQ?D9T9C8Nq!*NB;tiS+ z7d=Sp(6-yjQn$eD6fskZ_Pfb41AZte3h}%UxVGvcX~Q zyE+=7c}cy5Rmh4l-BFC&W(0ChL3BE90I?;~jk{z!68+zKJ$r`-{=bdb01CGx23l=Q z_s&DJJvYsH;hoP>VK`VV-KyO+xFcPcHpZp-xgc$+Tdc%`nY;SU zgPo~tHo1`;tfNx0!nv#1aEs(n%mlS(a(rUhcU1Z^k!e*)s|S8@md$7AN4|Zg z=e@SSBu%$Uql`}SU#(Z!u> zS-gM{)5R>ORik%wiP><*TygM8)*ABcvz_{aJbjdt7QY(2&Wk0^khS5ogrRq>njwF( z@ZLogt}>MFqTY?`?MyJX(6lot?s?x{ourA^Kjv;IwJTq-nQO%Vo0A&g^8TDKsMp?7 z8dD{8Q@bY~5={=DJ)5`GG+;GK`UH9^ElHU_X`~9{qcfd9JV7yag_reucl!nSBUHmcOD{W4&ZU@i~&?EyN z4eI>D01mkoI7A1%W#-h5oVMheGv=n0ZCU1$>K?g*?|DRW;t-72hU1$z~(hM4K}qa-66mMZ#PI zXgwVX+V<;liR*IYC%v*x_7*!1*KxwCIML)%MD=^@bKrc3y=kb64v_4IHxe;nyR}`S zF4sYyoMDSST}BVA7xZ|&N)kK1+^)MCcX^BRJ*K!h^Hnc(uWfI=ms@q(4>`Wd+)jnY&f4IXUnV1s$ zqU%Y2TV7kFL^^X}p6#_b?Z=ByW#P=M{)HXzfcd?ZPR3p@31LW-7F=uMm2qGrQlnHG zI75+!j2cuk1wz8Pb5uHE-Zz}622S>IL!S7^GQ`u{&%BxI^%$2nzTBj;Z|{!uBK-uGh1vlIAjvv6#uY!1CYTb!xW>Z4>&TMCU9W-BPJflLWmYxV}xU+w*F5>Jz+g zudZ;SflL@|Q0h>l&Mro7;Vh;u#nYT!z^4d)55taJW^8eYA?$y-W1gn*=j&LmP81pU zZSj($w)DoSQXdjlQCDpmEskWBB(+=(ORf=gQG)G$dyXXA_uo5Smfb{tB7Kd}Sj=zY z2Iij9ZO+YmsGy0pTf<}Hyg!($o#@1+#YBkq_cEfOi`bL$ONEl#`XpX`UGn$#iJW!| zpZZ1zd+g|96m)s#)^jS`=RQNZo_6t!8u*@w4-IuAix;^zTwTtx>a}|`7*z}YL>evh z>!02U)-k?^$8jX!szRiNxh-<&Gk18aOF76Ke|Q4|*%`$tJWSxSMl)Vlcqa38$>kU? z6TBi}8kjo@a-iI7Fqk?t!%^ED5xN&_!l8|T{#3F=LwwLQU6CW)w!~KocFz(Qbrxq=W7^lIiDqqkzmD*{?G z3*8!xDo(&s4c(e#>9~@F%EX}OTnl7v>U}Yx`P6AG>9)P4ab@=Fd*zp0OqfZYxX;?c zqutLWzI@Pc0p)7fc|~CwORF|NGp4F-#<4Ud30bC*mu7zFou#r(!qVg1eo=gy(<2CW zZQ^)G{j`eKNER5joPki9Su;f9$p`+IdBw#ywB6#Q zfS+wNK3MUzRTAl@?22Vwz$i_<>$FeS&euq%wU}%CfJ2_r<8G@D+qv#PwCfMG@#L2o zercaKz_zXaap|qMMmf+QuZ`Ul8!t;UMtMy?wv$?NR!|Cs9&UJM>=l~fv;vL$J~y;< z)X?rlWK0o{o-q$dGVI(vz{-4}taOsC$)aqsXg15=GZ*i7)2#-gN_=O7^e3;b7glgJ z3HPZWU36#{x;SUvt;uqps~z;;n`Vru@jZ*-cV2RzU9`wzEne-!bZFRRi)Iz}Q?f{n zycnKf!OQhgB!Ft}Xi1K@pU{;M<}x08I!T_vCJBjob`ye| z15n}6gi2ULZL*}s{9gp}G~|9uqg}o_amI?r-aLB_H!^*ZdJ{U1|uChxe@(N096pYcKd^?mhaF7*p(R^ zbSoD-!U{JQe14`}CjKNV8RZ3QAXlc0296kL@_yqXQL&RlqdF`qaTOmLMbxZ_Xv_Y4 zxph#I#qAdd>+%X~Zgh5;9tXT*ZK~oPFh!fHM5aZV=i;T0GxvKP%o*&+p($OTC<}Tk6Zo^!7}WPw6)`Ank1dvG%|0H zF+35H)`N%=sU6Gq?N!Yh>B)(Dm=JtahwvnG`dwm(!%hxtdRT((2AH zzh_JtUxTUk&X~yt&1MZe5^*RfX>(&-A_Ci(?!QVL6~%Hdy0LJ%zY}v>98>p^m}g7% z3D}~6+hO;J8z;CLlkD6a#@ah~jg(!EY4t!Y>a{bKOlsP%V9C;UKE}J!c=xyllNhtH zxkJ_@aZz68vl&K{qKYanWhTeB`2~0T^4M}?u(mZcH%@}h?#>w`p1WJKO=0k#x%qLq z>CSjo=&BQSFSjjl@dX{hQEf9rGa$BMZY%kw5S~5>xuVlktv~2x+U;(smsZcPa*BVV$oP#EtfAUVej-Yqn7n0MY`Wsd@2{jy zkn+s^Zg!z3^v?BR5~@>Q5~dcGv>b9bczoeUHTx zQYN2{Z_8%-xT*KY9d7F&)`n)BFU$hcHKxVGjTR literal 0 HcmV?d00001 diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..44e25a9 --- /dev/null +++ b/po/de.po @@ -0,0 +1,2243 @@ +# German glib translation. +# Copyright (C) 2001-2004, 2007 Free Software Foundation, Inc. +# Christian Meyer , 2001, 2002. +# Christian Neumair , 2002-2004. +# Hendrik Richter , 2004, 2005, 2006, 2007, 2008, 2009. +# Hendrik Brandt , 2004. +# Andre Klapper , 2007, 2008. +# Philipp Kerling , 2008. +# Mario Blättermann , 2010. +# Christian Kirbach , 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-04 22:01+0100\n" +"Last-Translator: Mario Blättermann \n" +"Language-Team: Deutsch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unerwartetes Attribut »%s« des Elements »%s«" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribut »%s« des Elements »%s« konnte nicht gefunden werden" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unerwarteter Tag »%s«; Tag »%s« wird erwartet" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unerwarteter Tag »%s« innerhalb von »%s«" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Es wurde keine gültige Lesezeichendatei in den Datenordnern gefunden" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Es existiert bereits ein Lesezeichen für die Adresse »%s«" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Es konnte kein Lesezeichen für die Adresse »%s« gefunden werden." + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Es ist kein MIME-Type im Lesezeichen für die Adresse »%s« definiert." + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"Es konnte keine »privat«-Markierung für das Lesezeichen für die Adresse »%s« " +"gefunden werden." + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" +"Es wurden keine Gruppen für das Lesezeichen für die Adresse »%s« festgelegt." + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Es wurde keine Anwendung namens »%s« gefunden, die ein Lesezeichen für »%s« " +"registriert hat." + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Die Befehlzeile »%s« konnte nicht mit der Adresse »%s« verknüpft werden." + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Umwandlung von Zeichensatz »%s« in »%s« wird nicht unterstützt" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Konverter von »%s« in »%s« konnte nicht geöffnet werden" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ungültige Bytefolge in Konvertierungseingabe" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fehler bei der Umwandlung: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Bruchstückhafte Zeichenfolge am Eingabeende" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Notnagel »%s« kann nicht in Kodierung »%s« umgewandelt werden" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Die Adresse »%s« ist keine absolute Adresse, die das »file«-Schema verwendet" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Die lokale Adresse »%s« darf kein »#« enthalten" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Die Adresse »%s« ist ungültig" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Der Rechnername der Adresse »%s« ist ungültig" + +# CHECK +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Die Adresse »%s« enthält ungültige Escape-Zeichen" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Der Pfadname »%s« ist kein absoluter Pfad" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ungültiger Rechnername" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fehler beim Öffnen des Ordners »%s«: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu byte konnten nicht alloziiert werden, um Datei »%s« zu lesen" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fehler beim Lesen der Datei »%s«: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datei »%s« ist zu groß" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Aus der Datei »%s« konnte nicht gelesen werden: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Datei »%s« konnte nicht geöffnet werden: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Attribute der Datei »%s« konnten nicht ermittelt werden: fstat() gescheitert: " +"%s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Datei »%s« konnte nicht geöffnet werden: fdopen() gescheitert: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Datei »%s« konnte nicht in »%s« umbenannt werden: g_rename() ist gescheitert: %" +"s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Datei »%s« konnte nicht angelegt werden: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Datei »%s« konnte nicht im Schreibmodus geöffnet werden: fdopen() ist " +"gescheitert: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" +"Datei »%s« konnte nicht geschrieben werden: fwrite() ist gescheitert: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" +"Datei »%s« konnte nicht geschrieben werden: fflush() ist gescheitert: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Datei »%s« konnte nicht geschrieben werden: fsync() ist gescheitert: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" +"Datei »%s« konnte nicht geschlossen werden: fclose() ist gescheitert: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Die vorhandene Datei »%s« konnte nicht entfernt werden: g_unlink() ist " +"gescheitert: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Vorlage »%s« ungültig, sollte kein »%s« enthalten" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Vorlage »%s« enthält nicht XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u Byte" +msgstr[1] "%u Bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Die symbolische Verknüpfung »%s« konnte nicht gelesen werden: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolische Verknüpfungen nicht unterstützt" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Konverter von »%s« in »%s« konnte nicht geöffnet werden: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Raw-read in g_io_channel_read_line_string nicht möglich" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Nicht konvertierte Daten befinden sich noch im Lesepuffer " + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal endet mit einem Teilzeichen" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Raw-read in g_io_channel_read_to_end nicht möglich" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Datei »%s« konnte nicht geöffnet werden: open() ist gescheitert: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Datei »%s« konnte nicht gemappt werden: mmap() ist gescheitert: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fehler in Zeile %d, Zeichen %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ungültiger UTF-8-kodierter Text im Namen - »%s« ist nicht gültig" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "»%s« ist kein gültiger Name" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "»%s« ist kein gültiger Name: »%c«" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fehler in Zeile %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"»%-.*s«, was eine Zahl in einer Zeichenreferenz (wie ê) sein sollte, " +"konnte nicht analysiert werden - vielleicht ist die Zahl zu groß" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Zeichenangabe endete nicht mit einem Semikolon; wahrscheinlich haben Sie ein " +"&-Zeichen benutzt, ohne eine Entität beginnen zu wollen - umschreiben Sie " +"das »&« als &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Zeichenreferenz »%-.*s« kodiert kein zulässiges Zeichen" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Leere Entität »&;« gefunden; gültige Entitäten sind & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitätenname »%-.*s« ist unbekannt" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entität endete nicht mit einem Semikolon; wahrscheinlich haben Sie ein &-" +"Zeichen benutzt, ohne eine Entität beginnen zu wollen - umschreiben Sie das " +"»&« als &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument muss mit einem Element beginnen (e.g. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"»%s« ist kein gültiges Zeichen nach einem »<«-Zeichen; es darf keinen " +"Elementnamen beginnen" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Seltsames Zeichen »%s«, »>« erwartet um Start-Tag des leeren Elements »%s« " +"abzuschließen" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Seltsames Zeichen »%s«, »=« erwartet nach Attributname »%s« des Elements »%s«" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Seltsames Zeichen »%s«, es wurde entweder ein Attribut oder aber »>« oder »/« " +"erwartet, um das Start-Tag des Elements »%s« abzuschließen; vielleicht haben " +"Sie ein ungültiges Zeichen in einem Attributnamen benutzt" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Seltsames Zeichen »%s«; bei der Wertangabe für das Attribut »%s« des Elements " +"»%s« wurde ein Anführungszeichen nach dem Gleichheitszeichen erwartet" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"»%s« ist kein gültiges Zeichen, wenn es auf den schließenden Elementnamen »%s« " +"folgt; das erlaubte Zeichen ist »>«" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element »%s« wurde geschlossen, kein Element ist derzeit offen" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element »%s« wurde geschlossen, aber das derzeit offene Element ist »%s«" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument ist leer oder enthält nur Leerraum" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument endete unerwartet nach einer offenen spitzen Klammer »<«" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument endete unerwartet mit noch offenen Elementen - »%s« war das letzte " +"offene Element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument endete unerwartet, es wurde eine spitze Klammer »>«, die das Tag <%s/" +"> schließt, erwartet" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument endete unerwartet innerhalb eines Elementnamens" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument endete unerwartet innerhalb eines Attributnamens" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument endete unerwartet innerhalb eines Element-öffnenden Tags." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument endete unerwartet nach dem Gleichheitszeichen, das einem " +"Attributnamen folgt; kein Attributwert" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument endete unerwartet innerhalb eines Attributwertes" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Dokument endete unerwartet innerhalb eines schließenden Tags für das Element " +"»%s«" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokument endete unerwartet innerhalb eines Kommentars oder " +"Verarbeitungsanweisung" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "Beschädigtes Objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "Interner Fehler oder beschädigtes Objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "Nicht genügend freier Speicher" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "Backtracking-Limit wurde erreicht" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"Der Ausdruck enthält Elemente, die teilweise Übereinstimmung nicht " +"unterstützen" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "Interner Fehler" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"Rückreferenzen als Bedingungen werden für teilweise Übereinstimmung nicht " +"unterstützt" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "Rekursionslimit wurde erreicht" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "Arbeitsplatzlimit für leere Teilstrings wurde erreicht" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "Ungültige Kombination von newline-Markierungen" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "Unbekannter Fehler" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ am Ende des Ausdrucks" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c am Ende des Ausdrucks" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "Unbekanntes Zeichen nach \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"Groß- und Kleinschreibung-beeinflussende Escape-Sequenzen (\\l, \\L, \\u, " +"\\U) sind an dieser Stelle nicht erlaubt." + +# CHECK +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "Ziffern wirkungslos in {}-Quantifizierer" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "Ziffer zu groß in {}-Quantifizierer" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "Terminierendes ] für Zeichenklasse fehlt" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "Ungültige Escape-Sequenz in Zeichenklasse" + +# CHECK +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "Bereich wirkungslos in Zeichenklasse" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "Nichts zum Wiederholen" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "Unbekanntes Zeichen nach (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "Unbekanntes Zeichen nach (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "Unbekanntes Zeichen nach (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-benannte Klassen werden nur innerhalb einer Klasse unterstützt" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "Abschließende ) fehlt" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ohne öffnende (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "auf (?R oder (?[+-]Ziffern muss ) folgen" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "Referenz auf nicht existierenden Unterausdruck" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "fehlende ) nach Kommentar" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "Regulärer Ausdruck zu groß" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "Fehler beim Holen von Speicher" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "Rückblickende Annahme hat keine feste Länge" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "Falsch formatierte Zahl oder Name nach (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "Bedingte Gruppe enthält mehr als zwei Verzweigungen" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "Annahme erwartet nach (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "Unbekannter POSIX-Klassenname" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-Elementverknüpfungen nicht unterstützt" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "Wert in \\x{…}-Sequenz ist zu groß" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "Ungültige Bedingung (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nicht erlaubt in rückblickender Annahme" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "Rekursive Aufrufe könnten unendlich oft aufgerufen werden" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "Terminierung im Namen des Unterausdrucks fehlt" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "Zwei benannte Unterausdrücke haben den gleichen Namen" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "Fehlerhafte \\P- oder \\p-Sequenz" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "Unbekannte Eigenschaftsname nach \\P oder \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "Name des Unterausdrucks ist zu lang (maximal 32 Zeichen)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "Zu viele benannte Unterausdrücke (maximal 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "Oktaler Wert ist größer als \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-Gruppe enthält mehr als eine Verzweigung" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "Wiederholen einer DEFINE-Gruppe ist nicht erlaubt" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "Inkonsistente NEWLINE-Optionen" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"Auf \\g folgt kein eingeklammerter Name oder eine optional eingeklammerte " +"Zahl außer Null" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "Unerwartete Wiederholung" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "Code-Überlauf" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "Überlauf beim Kompilieren des Arbeitsbereichs" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" +"Bereits geprüfter, referenzierter Unterausdruck konnte nicht gefunden werden" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fehler beim Anwenden des regulären Ausdrucks %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-Bibliothek wurde ohne UTF8-Unterstützung kompilliert" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"PCRE-Bibliothek wurde ohne Unterstützung für UTF8-Eigenschaften kompilliert" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Fehler beim Kompilieren des regulären Ausdrucks %s an Zeichen %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fehler beim Optimieren des regulären Ausdrucks %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "Hexadezimalzahl oder »}« erwartet" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "Hexadezimalzahl erwartet" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "Fehlendes »<» in symbolischer Referenz" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "Unvollendete symbolische Referenz" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "Symbolische Referenz der Länge 0" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "Ziffer erwartet" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "Illegale symbolische Referenz" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "Verirrtes abschließendes »\\«" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "Unbekannte Escape-Sequenz" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Fehler beim Verarbeiten des Ersetzungstextes »%s« an Zeichen %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Zitierter Text beginnt nicht mit einem Anführungszeichen" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Unbalanciertes Anführungszeichen in Befehlszeile oder anderem Text in " +"Shellquotes" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Text endete nach einem »\\«-Zeichen. (Der Text war »%s«)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Text endete, bevor ein passendes Anführungszeichen für %c gefunden wurde. " +"(Der Text war »%s«)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text war leer (oder enthielt nur Leerraum)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Daten konnten nicht vom Kindprozess gelesen werden" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Weiterleitung für Kommunikation mit Kindprozess (%s) konnte nicht erzeugt " +"werden" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lesen aus Weiterleitung zum Kind (%s) gescheitert" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "In Ordner »%s« (%s) konnte nicht gewechselt werden" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Kindprozess konnte nicht ausgeführt werden (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ungültiger Programmname: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ungültige Zeichenkette im Argumentsvektor bei %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ungültige Zeichenkette in der Umgebung: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ungültiger Arbeitsordner: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Hilfsprogramm (%s) konnte nicht ausgeführt werden" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Unerwarteter Fehler in g_io_channel_win32_poll() beim Lesen aus dem " +"Kindprozess" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Daten vom Kindprozess konnten nicht gelesen werden (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Unerwarteter Fehler in select() beim Lesen von Daten eines Kindprozesses (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unerwarteter Fehler in waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Abspalten gescheitert (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Kindprozess »%s« konnte nicht ausgeführt werden (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Umleiten der Ausgabe oder Eingabe des Kindprozesses (%s) gescheitert" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Abspalten des Kindprozesses gescheitert (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unbekannter Fehler beim Ausführen des Kindprozesses »%s«" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Es konnten nicht genug Daten von Kind-Programmkennungsweiterleitung (%s) " +"gelesen werden" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Zeichen außerhalb des Bereiches für UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ungültige Folge in Umwandlungseingabe" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Zeichen außerhalb des Bereiches für UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Aufruf:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION …]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Hilfeoptionen:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Hilfeoptionen anzeigen" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Alle Hilfeoptionen anzeigen" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Anwendungsoptionen:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "»%s« konnte nicht als ganzzahliger Wert für %s interpretiert werden." + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Ganzzahliger Wert »%s« für %s ist außerhalb des Bereiches." + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "»%s« konnte nicht als »double«-Wert für %s interpretiert werden." + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "»double«-Wert »%s« für %s ist außerhalb des Bereiches." + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Fehler beim Analysieren der Option: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Für %s wird ein Argument benötigt" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Unbekannte Option %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Es wurde keine gültige Schlüsselwertedatei in den Suchordnern gefunden" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Keine reguläre Datei" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Datei ist leer" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Die Schlüsselwertedatei enthält die Zeile »%s«, welche kein zulässiges " +"Schlüssel-Wert-Paar, keine Gruppe und kein Kommentar ist." + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ungültiger Gruppenname: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Die Schlüsselwertedatei beginnt nicht mit einer Gruppe" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ungültiger Schlüsselname: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Die Schlüsselwertedatei enthält die nicht unterstützte Kodierung »%s«" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Die Schlüsselwertedatei enthält nicht die Gruppe »%s«" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Die Schlüsselwertedatei enthält nicht den Schlüssel »%s«" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Die Schlüsselwertedatei enthält den Schlüssel »%s« mit dem Wert »%s«, der " +"nicht in UTF-8 kodiert ist" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Die Schlüsselwertedatei enthält den Schlüssel »%s« mit einem Wert, der nicht " +"interpretiert werden konnte." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Die Schlüsselwertedatei enthält den Schlüssel »%s« mit einem Wert, der nicht " +"interpretiert werden konnte." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Die Schlüsselwertedatei enthält den Schlüssel »%s« in der Gruppe »%s« mit " +"einem Wert, der nicht interpretiert werden konnte." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Die Schlüsselwertedatei hat keinen Schlüssel »%s« in der Gruppe »%s«" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Die Schlüsselwertedatei enthält ein Escape-Zeichen am Zeilenende" + +# CHECK +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Die Schlüsselwertedatei enthält das ungültige Escape-Zeichen »%s«" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Der Wert »%s« konnte nicht als Zahl interpretiert werden." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Ganzzahliger Wert »%s« ist außerhalb des Wertebereiches." + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Der Wert »%s« konnte nicht als Gleitkommazahl interpretiert werden." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" +"Der Wert »%s« konnte nicht als boolescher Ausdruck interpretiert werden." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Zu großer Zählwert an %s übermittelt" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Datenstrom ist bereits geschlossen" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Vorgang wurde abgebrochen" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Ungültiges Objekt, wurde nicht initialisiert" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Ungültige Multibyte-Folge in Eingabe" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Nicht genug Platz im Ziel" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Abbrechbare Initialisierung wird nicht unterstützt" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Unbekannter Typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s-Dateityp" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s-Typ" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unerwartet frühes Datenstromende" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Unbenannt" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop-Datei hat kein Exec-Feld angegeben" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Für die Anwendung benötigtes Terminal konnte nicht gefunden werden" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Konfigurationsordner %s für Benutzeranwendungen konnte nicht erstellt " +"werden: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" +"MIME-Konfigurationsordner %s des Benutzers konnte nicht erstellt werden: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Benutzer-Desktop-Datei %s kann nicht erstellt werden" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Benutzerdefinition für %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "Laufwerk unterstützt Auswerfen nicht" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "Laufwerk unterstützt weder ein Auswerfen noch »eject_with_operation«" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "Laufwerk unterstützt Prüfen auf Datenträger nicht" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "Laufwerk unterstützt keinen Startvorgang" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "Laufwerk unterstützt keinen Stoppvorgang" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Version %d der GEmblem-Kodierung kann nicht verarbeitet werden" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Ungültige Symbolanzahl (%d) in GEmblem-Kodierung" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Version %d der GEmblemedIcon-Kodierung kann nicht verarbeitet werden" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Ungültige Symbolanzahl (%d) in GEmblemedIcon encoding" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Es wurde ein GEmblem für GEmblemedIcon erwartet" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Vorgang nicht unterstützt" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Enthaltender Einhängepunkt existiert nicht" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Es kann nicht über den Ordner kopiert werden" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Ordner kann nicht über Ordner kopiert werden" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Zieldatei existiert" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Ordner kann nicht rekursiv kopiert werden" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Zusammenfügen wird nicht unterstützt" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Fehler beim Zusammenfügen der Datei: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Spezielle Datei kann nicht kopiert werden" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ungültiger Wert für symbolische Verknüpfung angegeben" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Müll nicht unterstützt" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dateinamen dürfen kein »%c« enthalten" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "Datenträger unterstützt Einhängen nicht" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Es wurde keine Anwendung gefunden, die diese Datei verarbeiten kann" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Datei-Enumerator ist geschlossen" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Datei-Enumerator hat noch einen ausstehenden Vorgang" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Datei-Enumerator ist bereits geschlossen" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Version %d der GFileIcon-Kodierung kann nicht verarbeitet werden" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Ungültige Eingangsdaten für GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Datenstrom unterstützt query_info nicht" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Suchen im Datenstrom nicht unterstützt" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Abschneiden des Eingabedatenstroms nicht erlaubt" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Abschneiden wird vom Datenstrom nicht unterstützt" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Ungültige Symbolanzahl (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Kein Typ für Klassenname %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "GIcon-Schnittstelle wird vom Typ %s nicht unterstützt" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s ist keine Klasse" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Ungültige Versionsnummer: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Typ %s implementiert nicht from_tokens() der GIcon-Schnittstelle" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Übergebene Version der Symbol-Kodierung kann nicht verarbeitet werden" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Eingabedatenstrom unterstützt kein Lesen" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Datenstrom hat noch einen ausstehenden Vorgang" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Nicht genug Platz für eine Socket-Adresse" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nicht unterstützte Socket-Adresse" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Vorgegebener Überwachungstyp für lokale Ordner konnte nicht gefunden werden" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ungültiger Dateiname %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fehler beim Einlesen der Dateisystem-Information: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Wurzelordner kann nicht umbenannt werden" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fehler beim Umbenennen der Datei: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Datei kann nicht umbenannt werden, da der Dateiname bereits existiert" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ungültiger Dateiname" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Fehler beim Öffnen der Datei: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Ordner kann nicht geöffnet werden" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Fehler beim Entfernen der Datei: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fehler beim Verschieben der Datei in den Müll: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Müll-Ordner %s konnte nicht angelegt werden: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Elternordner für den Müll konnte nicht gefunden werden" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Müll-Ordner konnte nicht gefunden oder angelegt werden" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Löschprotokoll-Datei konnte nicht angelegt werden: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Datei konnte nicht in den Müll verschoben werden: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fehler beim Erstellen des Ordners: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Das Dateisystem unterstützt keine symbolische Verknüpfungen" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fehler beim Erstellen der symbolischen Verknüpfung: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Fehler beim Verschieben der Datei: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Ordner kann nicht über Ordner verschoben werden" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Erstellen der Sicherungsdatei gescheitert" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fehler beim Entfernen der Zieldatei: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Verschieben zwischen Einhängepunkten nicht unterstützt" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attributwert darf nicht NULL sein" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Ungültiger Attributtyp (»string« erwartet)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Ungültiger erweiterter Attributname" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fehler beim Setzen des erweiterten Attributs »%s«: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Fehler beim Untersuchen der Datei %s mit fstat(): %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ungültige Kodierung)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Fehler beim Untersuchen des Datei-Deskriptors mit fstat(): %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ungültiger Attributtyp (»uint32« erwartet)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ungültiger Attributtyp (»uint64« erwartet)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ungültiger Attributtyp (»byte string« erwartet)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "" +"Zugriffsrechte für symbolische Verknüpfungen können nicht gesetzt werden" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fehler beim Setzen der Zugriffsrechte: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fehler beim Setzen des Besitzers: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "Symbolische Verknüpfung darf nicht NULL sein" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fehler beim Setzen der symbolischen Verknüpfung: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Fehler beim Setzen der symbolischen Verknüpfung: Datei ist keine symbolische " +"Verknüpfung" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fehler beim Setzen der Zugriffsrechte oder der Zugriffszeit: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-Kontext darf nicht NULL sein" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fehler beim Setzen des SELinux-Kontexts: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ist auf diesem System nicht aktiviert" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setzen des Attributs %s nicht unterstützt" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fehler beim Lesen aus Datei: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fehler beim Suchen in Datei: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Fehler beim Schließen der Datei: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" +"Vorgegebener Überwachungstyp für lokale Dateien konnte nicht gefunden werden" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fehler beim Schreiben in Datei: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fehler beim Entfernen der alten Sicherungsverknüpfung: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fehler beim Erzeugen der Sicherungskopie: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fehler beim Umbenennen der temporären Datei: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fehler beim Abschneiden der Datei: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fehler beim Öffnen der Datei »%s«: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Zieldatei ist ein Ordner" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Zieldatei ist keine reguläre Datei" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Die Datei wurde extern verändert" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fehler beim Entfernen der alten Datei: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Ungültiger GSeekType übergeben" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ungültige Suchanfrage" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream konnte nicht abgeschnitten werden" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Größe des Speicherausgabestroms ist nicht änderbar" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Größe des Speicherausgabestroms konnte nicht geändert werden" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Für den Schreibvorgang erforderliche Speichermenge ist größer als der " +"verfügbare Adressbereich" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Angeforderte Suche vor dem Beginn des Datenstroms" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Angeforderte Suche nach dem Ende des Datenstroms" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "Einhängepunkt unterstützt Aushängen nicht" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "Einhängepunkt unterstützt Auswerfen nicht" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"Einhängepunkt unterstützt nicht das Aushängen oder »unmount_with_operation«" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "Einhängepunkt unterstützt Auswerfen oder »eject_with_operation« nicht" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "Einhängepunkt unterstützt erneutes Einhängen nicht" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "Einhängepunkt unterstützt Erraten des Inhaltstyps nicht" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "Einhängepunkt unterstützt synchrones Erraten des Inhaltstyps nicht" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Rechnername »%s« enthält »[«, aber nicht »]«" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Ausgabedatenstrom unterstützt kein Schreiben" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Quelldatenstrom ist bereits geschlossen" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fehler beim Auflösen von »%s«: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fehler beim Rückwärtsauflösen von »%s«: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Kein Diensteintrag für »%s«" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "»%s« kann vorübergehend nicht aufgelöst werden" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fehler beim Auflösen von »%s«" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Ungültiger Socket, wurde nicht initialisiert" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ungültiger Socket, Initialisierung schlug fehl wegen: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Der Socket ist bereits geschlossen" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket wird erstellt von Dateideskriptor: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Socket kann nicht angelegt werden: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Ein unbekanntes Protokoll wurde angegeben" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "Lokale Adresse konnte nicht gelesen werden: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "Entfernte Adresse konnte nicht gelesen werden: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "Es konnte nicht gelauscht werden: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fehler beim Binden an Adresse: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fehler bei Annahme der Verbindung: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Fehler beim Verbinden:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Verbindungsvorgang läuft" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Fehler beim Verbinden: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Fehlermeldung kann nicht gelesen werden: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fehler beim Erhalt von Daten: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Fehler beim Senden von Daten: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fehler beim Schließen des Sockets: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Es wird auf eine Socket-Bedingung gewartet: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Fehler beim Senden der Nachricht: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage wird unter Windows nicht unterstützt" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fehler beim Empfang der Nachricht: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Unbekannter Fehler bei Verbindungsversuch" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Lauscher ist bereits geschlossen" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Der hinzugefügte Socket ist geschlossen" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Version %d der GThemedIcon-Kodierung kann nicht verarbeitet werden" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 Kontrollnachricht wird erwartet, %d wurden erhalten" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Unerwartete Art von Zustzdaten" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Ein Dateideskriptor wird erwartet, aber %d wurden erhalten\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Ungültiger Dateideskriptor wurde erhalten" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Fehler beim Lesen aus Unix-Datenstrom: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Fehler beim Schließen des Unix-Datenstroms: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Wurzelordner des Dateisystems" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Fehler beim Schreiben in Unix-Datenstrom: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Abstrakte Unix Domänen-Socket-Adresse wird auf diesem System nicht " +"unterstützt" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "Datenträger unterstützt Auswerfen nicht" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "Datenträger unterstützt weder Auswerfen noch »eject_with_operation«" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Anwendung kann nicht gefunden werden" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Fehler beim Starten der Anwendung: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Adressen werden nicht unterstützt" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "Änderungen von Assoziationen unter win32 nicht unterstützt" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Erstellen von Assoziationen unter win32 nicht unterstützt" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Nicht genügend freier Speicher" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Interner Fehler: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Weitere Eingaben erforderlich" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Ungültige komprimierte Daten" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ungültige UTF-8-Folge in Eingabe" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Maximales Limit des Daten-Feldes erreicht" + +#~ msgid "do not hide entries" +#~ msgstr "Einträge nicht verbergen" + +#~ msgid "use a long listing format" +#~ msgstr "langes Listenformat verwenden" + +#~ msgid "[FILE...]" +#~ msgstr "[DATEI …]]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Zeichen »%s« ist am Anfang eines Entitätsnamens ungültig; eine Entität " +#~ "beginnt mit dem Zeichen &; wenn das Et keine Entität sein soll, es als " +#~ "& umschreiben" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Zeichen »%s« ist in einem Entitätsnamen ungültig" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Leere Zeichenangabe; sollte eine Zahl wie z.B. dž enthalten" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Unvollendete Entitätsreferenz" + +#~ msgid "Unfinished character reference" +#~ msgstr "Unvollendete Zeichenreferenz" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Ungültiger UTF-8-kodierter Text - überlange Sequenz" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Ungültiger UTF-8-kodierter Text - Kein Anfangszeichen" + +#~ msgid "file" +#~ msgstr "datei" + +#~ msgid "The file containing the icon" +#~ msgstr "Die Datei, die das Symbol enthält" + +#~ msgid "name" +#~ msgstr "Name" + +#~ msgid "The name of the icon" +#~ msgstr "Der Name des Symbols" + +#~ msgid "names" +#~ msgstr "Namen" + +#~ msgid "An array containing the icon names" +#~ msgstr "Ein Datenfeld, das die Symbolnamen enthält" + +#~ msgid "use default fallbacks" +#~ msgstr "Standard-Alternativen benutzen" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Legt fest, ob die Standard-Alternativen benutzt werden sollen, indem der " +#~ "Name bei »-«-Zeichen abgeschnitten wird. Alle Namen nach dem ersten werden " +#~ "ignoriert falls mehrere angegeben sind." + +#~ msgid "File descriptor" +#~ msgstr "Datei-Deskriptor" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Der zu lesende Datei-Deskriptor" + +#~ msgid "Close file descriptor" +#~ msgstr "Datei-Deskriptors schließen" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "" +#~ "Legt fest, ob der Datei-Deskriptor beim Schließen des Datenstroms " +#~ "geschlossen wird" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Der zu schreibende Datei-Deskriptor" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "Erzeugte Desktop-Datei kann nicht geladen werden" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "Fehler beim Erzeugen der Backup-Verknüpfung: %s" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "Zu großer Zählwert an g_input_stream_read_async übermittelt" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "Zu großer Zählwert an g_input_stream_skip übermittelt" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "Zu großer Zählwert an g_input_stream_skip_async übermittelt" + +#~ msgid "Target file already exists" +#~ msgstr "Zieldatei existiert bereits" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "Zu großer Zählwert an g_input_stream_write übermittelt" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "Zu großer Zählwert an g_input_stream_write_async übermittelt" + +#~ msgid "Target stream is already closed" +#~ msgstr "Zieldatenstrom ist bereits geschlossen" + +#~ msgid "Unknown drive" +#~ msgstr "Unbekanntes Laufwerk" + +#~ msgid "%s volume" +#~ msgstr "%s-Datenträger" + +#~ msgid "Unknown volume" +#~ msgstr "Unbekannter Datenträger" diff --git a/po/dz.gmo b/po/dz.gmo new file mode 100644 index 0000000000000000000000000000000000000000..2d7dda2d5f867d33a618a4c0cb81bd37ee4cd513 GIT binary patch literal 32283 zcmds^Xkx*(EFe# zL!X7l(0_(*f*$*_DEbWaLg+B`U!a4~Q(qoMZ-HJ8mFo{fMV`+?FMz)66}J8k=sK=% zgAPGwp~CmSpyxq{jyJv^gua{WuQ>Yh6QXD>*Avjy(EFew_qU+uLVp206T149QFIYB zf!+oEBJ}mpO&CM$aSgv>XdQYY^lqp;{~UB9^qbJ-&|_b1dJIC}#Pu~$S?5DgvCm=X zY0#fSMUEH0CW=@pS_?fHx&?YRbOI`NdC*<|IaK_4EQ=37Pldh}`Yz~g&<{h!567Kk z_g6zt=lUw>sn9#1!v86#$niJO_0a!;%6jWxYjW42xGZ|m(Jw-U?=1Aq(4RnM{xPqM zB1|6*LSYe|3l+WI0~NVG43+gBhrSW|9jN%>XHfC;>oMMT=sTg}=Leu0pg)CP0zD07 zh0k?R;d4J!*8fAO=>LyUS?{GV7o4txVuI)@sI1d~o&)_XRQ&K`sOa%LF3yIofQlX? zP#_R}94hNR0R02#&!IO!?`Ki*!%4B>XEPMnMGffj&|9I15`7vf@_ZG#2Kqy&==Cy$ zAA;_HirjZX*Fm3wioE{;9frQ>6vNLJsEnI}ihQ4j%KCo_-3I-4=w|47IF+~2O;EAR zqfpWBn@}15Z%~o%wFtEt`c~+%&>B?izZ)v}_$*Y``#UHpAbKI7eC&B(5_&!KFig*d zo{5pyLR$!R591zX5wYV2oOC605A=_q--SK~y@Mq2HRyVn-wpjG^nU0qEdEL8X$0fF z(8JLCpgSgoEb&a&~HJvA-e&9V z0n}gMdM(2JHFOU81L&7&}X543H|ij$qmp7MtvS~zTtdi=lV?-SUze(-^cZrp`*~_-w{PuLtD@%p??K! zL2tegn?e5@dM&hZ5w=H;A3;UWpT5)dy!>Jt|11<$qO$?1@NYoxfPNQxGxYsi@g?*p z(958=T}tdg{~lU{Zrw&q!haTe1J}dvilUD|zYP66^sLLtInaNCUIV@OiYOX`J`Vjl z^koF=SE1jAR-qq7X-pCQ5{e6=GXa6vs{*|hdeXbiABUiVzpLM4@i+s0kn0~pZ-aj1 zy|(TWltR>~4*d@F8&L7bfvXq`Jp&`oK~F%qpF)2H{RQ*~?~kGUDq)VZ=+?C z_#HbQfDS+EK2)Bci1Eb#cR`! z&I0alL7%)1%tAj@H+-#a7>+*%{TTO0n&c4Zzd|2`J`Pjid+~032>k~1*U--bGQrsc z*PC5VM2Lf2-wJ&Q`lcI9zCVVZgdWFz(CX3281n$n&xC#f`YiNLX#K;Mw_fnO$j$XT zc&+2bWpoU$b9n(N#o$_K_#^WD4zE}7+Rlqmj94z(#|yZton8yY&U9ep+Q4ZH?zL*)mzXq|tZUV%GDg}m3je+?8^X}*_RFOXmS zyp-4Ld0oltOkSh_t;G=ixscx{@e&-xyuzOo+{J3>vF`obpsRREyu8`nI|T~FwMQbA zY0u;yX}@bCzdMhU0QGo+|Ctc_Yb0xf++MaZ*X9l4>)qmZp-vIX5ShjBkTwRxclpRjfti zU#T^cHt}?Y;aC z*@!kxPglyLrDnNSjkiq;X$(c1n$3E7q}5DpN^RV)uBwT-$7`+XShTrRUEYkxYFM~l z+7k=s7;8@KEZ278h-x*d?39~3E9GjkvjNxYME{eTwVjDAA}fy8s=JdqE2HvAX>^y# z)~xYhENLW7y%y#&c)C=_W@EM1NF@Z!%T%3G)T0cKjKS)q>O^9e-+sZs+Oy^xu|613PsWpaQXLhU2L|5)#>Z+b zEqZYmZAAnTso4xYU&vvMkg$nk@t$&XlBtbksyte&)T+brRISmBE9G5DWpBK<){0vV z7!nJmDfl-^)eu)QTa*)XRmUW(uzjP6DKvVj&2n>ZJP;?1(b6;$dJd&Vyo{^iXtO%7 zAxImq*QPS-A(44cIEFFZXiZPo>L|(FR>c$%z=PK$URr6zBYVXs%u?iymvQzfOB<&I z!)wz?HHD7k1X);@a7!&<=#U`i{Mu+s(*!oaR;_As{d7XQ8N-65aY;K8mC1FjQl$|$ z$`k0Cr6COKBTLfEFs=!1DFAz}P_8!0>i*H%lu7}dr|Y%Rq|p$E@VHrTjY<^v#U?LL zpOe}$WiNxI;`-z|Ans7;lqLrISxxh+=D%iXLc=LtT%6dG!?i82Z7u=PiUVR2gp5!h zb_wFn>CIrzq~IyjA@kk*j?z$bqJo2Fxl%C^1`K_BhzilIQbNd7C6N)V_psv)6(y?)6HbcZsrltvS z07oKjmdNL0ajgpKF%v;JT^daoUz~5_Feye`T%px46wa!_*s7R{qedBR)k%L%c&pb^ z^GIP6r+1xCFa=}VxkOu3eAr5wTE1*}Iawzm1>#Fmq~0%+OG@=*$nsUZ?7CL1IUFym z$gc_cRhq6fhNCUUZ44y+88^wca$gf}Hb**&w%f>(rtOi096eRrogl!(&Q=v^cCA=RF(<}M zrVI3~;95EdiYM>dC5u-qZLExfafdB-baS(lWIVl5*7F$eeO1yUCZPeXD+JwDc&}ZG9PbIT zpU-9uX;%WHj8oH_-E25jnhwWKaougG#;)h9Cf!pn3qXeA@iBSY-%Q10=B9SG3uV=7 zS?d{H%e6}K+UR85py$Eolcn7h4iW|lcdR_Y{voXkK^v3xZ7Y_Yy6*HdhOJ;-Pxn(v zR?-{c$jQ>QWq!v+x|bSdpgxfVSk!iAtkf)}ol=0iK8NK|p)8YXtu-+jcW@>HD(-VQ z(K)VHQwbzCx{mR_&Us9^NU>||of@gJ+mKXb?R&>a3wWs))6z%RF|)oI&xKWo5YkR% z$due+d1-?Ehdk?sHGyO>5j^Rg+;D9KTnUUWBqFoD(nZ~N5A8*-U|3sGyr^o0NIF_7 z({(NF|JiNWwnw{WwMCSUoTPWxy=rRoTwfrB*7MHcr5Nc3jM;RlTwi5sud>cfcMS#1T2;T-vOT6auid16 z530E^vt`DueMD-c`JT6XreL(~F|AWIWui-x@g}`Qo&A@^hirs3tKnwNHzTcaHqp`6 zvh9pKrriO+rL}nLMO(MT&Anu_v1DA^S>{TbDm*udm{AJON>m(8I_iQtr$`MjBirY8 z25Lkm2V6Nh(aMmX$p~+?Cp!fyGhzgTv!fdsHeE08)+VMxTQBe(k(v}J&~>IuFaAtO zQkov($a-ozVzt2}XzQ8m->=PS6sf=MA!_$uU-ZTc64a0ekUaZ#(P@Z+OO$CXy`oV2E&?6@_<+0GKGbUXJ6Eh8)X< zJG@vVv{OEjGP+{2wnxqmV`(p4f8VgX?RUbGZAVZ(QAFF>5>^C_8UpFEF1N?;(VyHP zXY^HRUnNIV=>(u8+q>M=Fj@~+U$K$kr)3$b<@$*C@KPN)F~60J}LA=GG}LYjAjJMN2h1d$_+ zT1B=NvP?^NWD*OfNW*nX+!&qY;9BRVErA4wjPPRR){qmlidAAiBt5S#S4S%?J!4va zD$an*bg4O+Wja@tLa}5(w8Ni-JH||hX8Z3QRSgD0y*;2MiOYsnj%>9tz~(g|P$$rm zN@YMJ$MQq8qfwejhN3I8Q}M#aCnl7%mQ|8cb+FIj_MlEPzFozin+@f-S7o|;?(hM0Kur{~`6{4W=@#YwaJulm zxo4h8huQp_bU?<}c){YZKF~oT;3wv0?^6wUgr=qetE#4lKaLd9!i+mN8(IVb(1dj| zNyL6)UAd1`U9BQcJ!dt)hC}y$D)mM;cVQF!@sKY1P&znONL?4R>i-Y>2|{jEO>yHR zbI)K)!zL~uG|<|RlhZash_~!8oI;B}pbQK|@CJi3x(+N0V&E3NYk}D(;?pq2zZ-e6 z{A0SL;674RNMP&TL+Kk97k#A21=7L^kql+d;c!#_pj&tl(CDK8&qMK1%ND8Km~TOU zNCI63vnH%S)PAJeKljX2fvOC`%4TsMJz?VMO3bnQxJUH4Q6F1QFl)&=rU^@cYIHEr z+PpjUj>sS9(8?rT;z`(kEL{@g!A7jZa4saud57k|rz@K=QBSz@;Gwx^z9L-o!eqDA zGo2U}#%93E8QX^5%o2~-nkq(` zO~OSr2xRVJ2#Sr=^}-J&Sl(di&0JFg>}}3xL_k`< zm?6$$27vucI^5zr^`%>TMny4Dc?+94mf~c|>40w2}Fm_mnH)bP3LrLmH0>( z!hS}~lJ*%|+f342N_8RNjf@l?8Evtr_a9f&z#3Fx1Rwf#hdjca`*jSKVL+A?xe(ZE zv}ba$8Zz5D4pJINAnYDS55#kaADlb<2*Yr_OA?lm47Fg!P!#qN_XHX3#uV;e9z?** zg0ZNF!R8T+4=UykKgOVJT`qnjlBp?j;YA1#*V>n)Ux)FybEeafK}PK8U2Zn?oen<5 zgNDx@ND3RGEapS|?rYB&KEh{$u-ClM+XuZh^$Mbt<|F}^UrI%Axx-+o*0FBE)J!eH zoGdL13z=qV%VX0?%TnfJVBU_qlo?I7^{LFTH<`JZJ)=7L5kUhhi)!9a%b@^QHv~Z` zw_X8(i4R-^R@J* z#Uki^-P!1OoEV2~46$Zw`akDDp83QAS4@H+R<00)X(-(zY%|kYk|R5)*MGe4-k?Yc zW72bY%U73NT=ghh-T+w$V0fEgrbDeeHKH(@>7eM$jEuRY8HiLfKx&RkE315WOP?qo zS8sU#aGH4y0NyT&elZzZ3tKCadPoAF!uG;Mmwi%b47HD*$LKuG&b(vkoHd%S>|?b zYCxSvvtl-Ai^+EGJSy0Oi#UQxa8kkgV zpAs^(h6yEaPuLL4K8Nm8*~Gkv!Mrqi=rx`eQ>mvx7g+L<0-J2An8L6pg9|-?u5GLr z$#&6i06Ys9UF|WC*XNPk+~!YV3T%qMEM1vhftO+Zw?W*_OoLQ3m@~dd^kp~~cm;|E z{g4)mMGL%zxWI20FuON35l28+0A^Ljl-D@Rj!nAhyKrwI!2CI79@VV4Tg|)CRU-*q zG}Fo?@4=p?1vZeqjx-s@6n`k@QtQ!%w`Q=8P9mSn=1-d#t21xTk1@@7$bfgP@*MQo z)koTWx!jmJ{%Dm33u66wd^i6pJpsaW7LlBRZE{&Athxe$uvH-cgBq(q@UWyaqphO| z4KuP4cCo`e-iIxFXFkx>)k}tf;NT+My5I>gmhUn1$T&(PIZsH-TpYOeZDdnARMbbk zHLP4>BEKyboB9z}f)@~pVP*B^2BGGPY^jd?=z-kZYViv7CI+TswA`Ti)_swhC0Qff z7T`mtT?djnLQI1N7EIVLapg>r+g|}dc^dVo>KcDY;T1<-n2I%FkE&)46TsDrwj`_g z!4U>%&xWP6Y8jnE%pqLdUpM z;LL?+$-0uL)M|d6Trwl9B#SZ{cv@DYveCnD@^V0;zKRDckeb{25-lrA3)@I6fJLW7R60?XC zJ3e1pI>r$Bwr;E^Xy*D(E|MBp3ab(r1_KQe*h?O^u{&VO9+}P7#Bx%`g`-7X*sBrNg`Q2`SXtROKd53TJbwR!ZxPo)2Vq?;;JuJ0ds~q4;K0}yD(n9UC|xqIYG(`Frnz6&FpO~tSL^9a z0uDYgJ*mJa6YiTQIt9u~D1h;q$i!z^{t<-OOVgd07|Vifb0%wtnd3&E6#;`cysZqP z?2{*woW(SEe3H|U$WX@uENS999J6dEQ^ujDm*qER2meP?NEMo`Fo7?c&81g4@&%F8 zyn0BDtFV#!5=MJC1_+7d`qjcCUDe?wbD#BQ0u00iWNuwS~IRZGj}_MC38SX41H_%Yv1M;@JHeT+#ZHTjxnQ zffTvb`U>05B3me=|C75Tlrl?;)*JM*Y)|873@pkzpK`|?)xOA&UP$ru>?$Y9_+0(HLSMsf$ zwEzn#uG+epye+f#GJcMYgcpR4vd{4lUAO6!(juI15|E0K@+KMqnbl1P7SMg1~}V z(?xLLU=2+N44dSfSW2ezy^3_Z!Rn~2B;4di+*?fEbgjm@Uydc^H<|%7yX2^2C z_6P3f0se@@|FN%*WUeff+sqn1jUAe@CGJ;nY->$+k7mIC{cxJm!iCbJ(SAtV22*u& zdPwV%VwO=g$k9n8Hngd4vewg-!%AdWdvBG_8mR+OKgXgA{vIH{%M$ux9;*KKNPsA17a>DCcmkq6R$0U5bKkyy!b}7IAswmNM0xPQ8dVA*`Nm3C zZdnHt@?7EQ^wds6?@MGZq+*8BLz*TOnyE^d;60I#Xh zCQMF`0`rC4RyWyt88L0MV7))G{}Uw+c@mMxi&6}*Z>W&<2}(R<^4_o3*{4Yglc9&9 z0Aa*oFzY5(Sf60(%|a#?OJhHF?e<9^8rH_+< z;P1IK4-0JJOySerb0A*v!tEzL6m{z`wSLpi2s%h<($p}2MmwDJqggkUAPGO6l_mv{ zyT4P@mV^?_Ok>OnC~5I@qecdY1lBV-Xp23g6Eb2)4Z&K;$7vpAucfhK#p8oAn=Phe)XDHJ8gs(}3k`;?#!n#wljN^)5nO z@`{CxuR03F;+8ZsuUU^E_g%RqF!K;B(l57*EcIMD z#n!cGLwE_Ec~(={cuy_N5*Y*vQjjwCVdnvkpAEuYO*FsEw0MgETNO!QXn_%8*3P!= zK4BN`#Et~HXoS32%W{hu%jFP_W#Y|4$3yB)llq|QQS|=`Xr{CN!+O7vd)RL{ z7O@<7Zs3JdVQezZ8kB?hyG0Z8!{#1; z1`A6MRczS#*C~r)f%LP1UaO-&l31}NX@)fxZvtz3)CPB?$7kVQn3*YjCD#H-%N?#_ zFd_67YuW*(SfGW1B=)5~PT6Ekx_80XF@IVoAd?AjTE1*ut~FUWRzKz$rm0ffyO6deaR zO*|f3ijb{}*(K+t|1YCj{uT>l&0=OD(wVPTK4riUYgv{y zpg8>Zk|;nChB2m@=hectzY~%X|j0r<43Ta;H?*3vE(_C4|vJm{# zCIW}BriXw4{a6e^Tz}TfAfX<;Jmeu9^Iu%XVc(S+4ebsp`e0+hlV$t;=?8rrX$r(-q&l+{ zHlYZLSK-^QrH}MWUD?U5dRo0}pLY8^0FJ20>37TAe~-GzR?ySMK5f`#uk4zDwO3H!jY*KR$(O1bb`A*rR`UD z$^SFeH+J+3_=@J^!vPGe(bc*XM0`W201sOg3pAm zWr7vWy1PIK3(qhY&&XoE8g!2VR?nTngmy+BP;d4?3jbd96gOr zcf!mH3ho|?)L543T|Tr#jbUA;Kpo3sJV#nf*KQp{)Pp*D%LWXMFsy0a(qo3{V&=}Rkr{D literal 0 HcmV?d00001 diff --git a/po/dz.po b/po/dz.po new file mode 100644 index 0000000..d638912 --- /dev/null +++ b/po/dz.po @@ -0,0 +1,2141 @@ +# Dzongkha translation of glib +# Copyright @ 2006, Free software foundation, Inc. +# Mindu Dorji. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD.dz\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2006-08-09 10:23+0530\n" +"Last-Translator: Mindu Dorji\n" +"Language-Team: DZONGKHA \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Dzongkha\n" +"X-Poedit-Country: BHUTAN\n" +"X-Poedit-SourceCharset: utf-8\n" +"Plural-Forms: nplurals=2;plural=(n!=1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "རེ་བ་མེད་པའི་ཁྱད་ཆོས་ '%s'ཆ་ཤས་'%s'གི་དོན་ལུ།" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ཁྱད་ཆོས་'%s'འཚོལ་མ་ཐོབ་ ཆ་ཤས་'%sགི" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "རེ་བ་མེད་པའི་ངོ་རྟགས་ '%s'། རེ་བ་བསྐྱེད་མི་ངོ་རྟགས་'%s'།" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "རེ་བ་མེད་པའི་ངོ་རྟགས་ '%s' ངོ་རྟགས། '%s'ནང་ན།" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "གནད་སྡུད་སྣོད་ཐོ་ཚུ་ནང་ ནུས་ཅན་དེབ་རྟགས་ཡིག་སྣོད་ འཚོལ་མ་ཐོབ།" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་ དེབ་རྟགས་ཅིག་ཧེ་མ་ལས་རང་འདུག" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་མ་ཐོབ།" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་ནང་ མ་ཡིམ་གྱི་དབྱེ་བ་ངེས་འཛིན་མ་འབད་བས། " + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་ནང་ སྒེར་གྱི་ཟུར་རྟགས་ངེས་འཛིན་མ་འབད་བས།" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%sགི་དོན་ལུ་ དེབ་རྟགས་ནང་ སྡེ་ཚན་གཞི་སྒྲིག་མ་འབད་བས།" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "མིང་'%sའབད་མི་གློག་རིམ་གྱིས་ '%s དོན་ལུ་ དེབ་རྟགས་ཅིག་ཐོ་འགོད་མ་འབད་བས། " + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ཡིག་འབྲུའི་ཆ་ཚན་ ‘%s’ ལས་ ‘%s’ ལུ་གཞི་བསྒྱུར་འབད་ནི་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "‘%s’ ལས་ '%s' ལུ་ སྒྱུར་བྱེད་ཁ་ཕྱེ་མ་ཚུགས།" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "ཨིན་པུཊི་མཇུག་ལུ་ ཡི་གུའི་འབྱུང་རིམ་ཆ་ཤས།" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "གློ་བུར་རྒྱབ་ཐག ’%s’ ལས་ ཀོཌི་སེཊི་ ’%s’ ལུ་ གཞི་བསྒྱུར་འབད་མི་ཚུགས། " + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"ཡུ་ཨར་ཨའི་ ’%s’ འབད་མི་དེ་ \"file\" འཆར་ལས་ལག་ལེན་འཐབ་པའི་ ཡུ་ཨར་ཨའི་ཡང་དག་ཅིག་མེན།" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ཉེ་གནས་་ཀྱི་ཡིག་སྣོད་ ཡུ་ཨར་ཨའི་ ’%s’ འབད་མི་དེ་ནང་ '#' ཅིག་མེདཔ་འོང༌།" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "ཡུ་ཨར་ཨའི་ ’%s’ ནུས་མེད་ཨིན་པས།" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ ཧོསཊི་ནེམ་དེ་ ནུས་མེད་ཨིན་པས།" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ནང་ན་ ནུས་མེད་ཐོག་ལས་ཐར་མི་ ཡིག་འབྲུ་་ཚུ་འདུག" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "འགྲུལ་ལམ་གྱི་མིང་ ’%s’ འབད་མི་དེ་ འགྲུལ་ལམ་ཡང་དག་ཅིག་མེན།" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "ནུས་མེད་ཀྱི་ ཧོསཊི་ནེམ།" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "བཱཡིཊི་ %lu བསྐལ་སྤྲོད་འབད་མ་ཚུགས་ \"%s\" ལྷག་ནི་ལུ།" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ནང་ལས་ ལྷག་མ་ཚུགས།" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ཁ་ཕྱེ་མ་ཚུགས།" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ཡིག་སྣོད་ '%s': fstat() གི་ཁྱད་ཆོས་ཚུ་ ལེན་མ་ཚུགས་ :%sམ་བཏུབ།" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’:fdopen() ཁ་ཕྱེ་མ་ཚུགས། %s་མ་བཏུབ།" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’ལས་'%s' ལུ་ བསྐྱར་མིང་བཏགས་མ་ཚུགས། g_rename() གིས་ %s ལུ་མ་བཏུབ།" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ཡིག་སྣོད་’%s’ འབྲི་ནིའི་དོན་ལུ་ ཁ་ཕྱེ་མ་ཚུགས་: fdopen() མ་བཏུབ་:%s།" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’ཁ་བསྡམས་མ་ཚུགས་: fclose() མ་བཏུབ་:%s།" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ཡོད་བཞིན་པའི་ཡིག་སྣོད་'%s' དེ་ རྩ་བསྐྲད་གཏང་མ་ཚུགས་: g_unlink() མ་བཏུབ་:%s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ཊེམ་པེ་ལེཊི་ '%s' དེ་ནུས་མེད་ཨིན། དེ་ནང་ '%s' འབད་མི་ བཞག་ནི་མི་འོང༌།" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ཊེམ་པེལེཊི་ ’%s’ འབད་མི་དེ་ནང་ XXXXXX མིན་འདུག།" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "‘%s’ ལས་ ‘%s’:%s ལུ་སྒྱུར་བྱེད་ཁ་ཕྱེ་མ་ཚུགས།" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "ཇི་ཨའི་ ཨོ་ རྒྱུ་ལམ་ ལྷག་ གྱལ་རིམ་ ཡིག་རྒྱུན་ཚུ་ནང་ རགས་ལྷག་མི་བཏུབ།" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "ལྷག་ནིའི་གནད་ཁོངས་ནང་ གཞི་བསྒྱུར་མ་འབད་བའི་གནད་སྡུད་ ལྷག་ལུས་འདུག" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "ཡིག་འབྲུ་ནང་ཆ་ཤས་ནང་ལུ་ རྒྱུ་ལམ་རྩ་འགྲོལ་འགྱོཝ་ཨིན།" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "ཇི་ཨའི ཨོ་ རྒྱ་ལམ་ མཇུག་ ཚུན་ ལྷག་ནི་ཚུ་ནང་ རགས་ལྷག་མི་བཏུབ།" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’ ཁ་ཕྱེ་མ་ཚུགས་: open()མ་བཏུབ་:%s།" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ཡིག་སྣོད་’%s’ གི་ས་ཁྲ་འབྲི་མ་ཚུགས་: mmap() མ་བཏུབ་:%s།" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "གྱལ་རིམ་%d ཡིག་འབྲུ་ %d:%s ལུ་འཛོལ་བ།" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ནུས་མེད་ཡུ་ཊི་ཨེཕ་-༨ ཀྱི ཨིན་ཀོ་དེཌི་ཚིག་ཡིག" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s'ལུ་ མིང་དཔྱད་འབད་མ་ཚུགས། འདི་ཡིག་འབྲུ་གཞི་བསྟུན་ (དཔེར་ན་ (ê ) ཅིག་ནང་གི་ ཨང་" +"ཡིག་ཅིག་འོང་དགོཔ་ཨིན་ - ཨང་ཡིག་དེ་ སྦོམ་དྲགསཔ་འོང་ནི་མས།" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"ཡིག་འབྲུ་གཞི་བསྟུན་དེ་ སེ་མི་ཀོ་ལཱོན་ ; གྱིས་ མཇུག་མ་བསྡུ་བས། ཁྱོད་ཀྱིས་ ངོ་བོ་ཅིག་ འགོ་བཙུགས་ནིའི་རེ་འདུན་" +"མེད་པར་ དང་རྟགས་ ཡིག་འབྲུ་ ལག་ལེན་འཐབ་འཐབ་འོང་ནི་མས། དང་རྟགས་དེ་ & བཟུམ་སྦེ་ གྲོས་ཐར་" +"འབད།" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ཡིག་འབྲུ་གཞི་བསྟུན་ '%-.*s' དེ་གིས་ གནང་བ་ཅན་གྱི་ཡིག་འབྲུ་ཅིག་ལུ་ ཨིན་ཀོཌི་མི་འབད་བས།" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ངོ་བོ་སྟོང་པ་ ’&;’ མཐོང་ཅི། ནུས་ཅན་ངོ་བོ་ཚུ་: & " < > ' ཚུ་ཨིན།" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ངོ་བོའི་མིང་ '%s' ཧ་མ་གོ" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"ངོ་བོ་འདི་ སེ་མི་ཀོ་ལཱོན་ ; གིས་འབད་ མཇུག་མ་བསྡུ་བས། ཁྱོད་ཀྱིས་ངོ་བོ་ཅིག་ འགོ་མ་བཙུགས་པར་ དང་རྟགས་" +"ཡིག་འབྲུ་ཅིག་ ལག་ལེན་འཐབ་འཐབ་བཟུམ་ཅིག་འདུག དང་རྟགས་་ & བཟུམ་ཅིག་སྦེ་ གྲོས་ཐར་འབད།" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ཡིག་ཆ་དེ་ (དཔེར་ན་ ) བཟུམ་མའི་ཆ་ཤས་ཅིག་གིས་ འགོ་བཙུགས་དགོ" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"ཡིག་འབྲུ་ ’%s’ དེ་ ཡིག་འབྲུ་’<’ ཅིག་གི་རྗེས་སུ་འོངམ་ད་ ནུས་པ་ཡོད་པའི་ཡིག་འབྲུ་ཅིག་མིན། འདི་གིས་ཆ་ཤས་" +"ཀྱི་མིང་ཅིག་ འགོ་མི་བཙུགསཔ་འོང༌།" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཆ་ཤས་ཀྱི་ འགོ་བཙུགས་ངོ་རྟགས་ %s’ དེ་མཇུག་བསྡུ་ནི་ལུ་ ཡིག་འབྲུ་ ’>’ ཅིག་ " +"ཨིན་པའི་རེ་བ་ཡོད།" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ’=’ ཅིག་ཡོད་པའི་ རེ་བ་ཡོད་ ཁྱད་ཆོས་ཀྱི་མིང་ ’%s’ ཆ་ཤས་ ’%s’ གི་རྗེས་" +"སུ།" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཆ་ཤས་ ’%s’ གི་འགོ་བཙུགས་ངོ་རྟགས་ མཇུག་བསྡུ་ནི་ལུ་ ཡིག་འབྲུ་ ’>’ ཡང་ན་ " +"’/’ གི་རེ་བ་ཡོད།" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཁྱད་ཆོས་’%s’ གི་ ཆ་ཤས’%s’ གི་དོན་ལུ་ བེ་ལུ་བྱིནམ་ད་ མཉམ་རྟགས་ཀྱི་ཤུལ་" +"ལུ་ འགོ་བཙུགས་འདྲེན་རྟགས་ཅིག་ ཚུད་ཡོད་པའི་རེ་བ་ཡོད།" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"’%s’ དེ་ ཡིག་འབྲུ་ནུས་ཅན་ཅིག་མེན། ཁ་བསྡམ་ནིའི་ཆ་ཤས་མིང་ ’%s’; གི་རྟིང་བདའ་འོངམ་ད་ ཆོག་པའི་ཡིག་" +"འབྲུ་དེ་ ’>’ ཨིན།" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ཆ་ཤས་ ’%s’ དེ་ ཁ་བསྡམས་ཏེ་ཡོདཔ་ལས་ ད་ལྟོ་ཆ་ཤས་གཅིག་ཡང་ ཁ་ཕྱེ་ཕྱེཝ་མིན་འདུག" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ཆ་ཤས་ ’%s’ དེ་ ཁ་བསྡམས་ནུག དེ་འབདཝ་ད་ ད་ལྟོ་ཁ་ཕྱེ་སྟེ་ཡོད་མི་ཆ་ཤས་དེ་ ’%s’ ཨིན།" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ཡིག་ཆ་དེ་སྟོང་པའམ་ ཡང་ཅིན་ ནང་ན་ས་སྟོང་དཀརཔོ་མ་གཏོགས་ མེདཔ་འོང་ནི་མས།" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ཡིག་ཆ་དེ་ ཟུར་ཁུག་གུག་ཤད་ ’<’ ཅིག་གི་ཤུལ་ལས་ རེ་བ་མེད་པར་ རྫོགས་སོ་ཡི།" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ཡིག་ཆ་དེ་ རེ་བ་མེད་པར་རྫོགས་སོ་རུང་ ཆ་ཤས་དེ་ ཁ་ཕྱེ་སྟེ་རང་འདུག མཐའ་མཇུག་ཁ་ཕྱེ་མི་ ཆ་ཤས་དེ་ -’%" +"s’ ཨིན་པས།" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ཡིག་ཆ་དེ་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག ངོ་རྟགས་ <%s/> མཇུག་བསྡུ་བའི་ ཁ་བསྡམ་ཟུར་ཁུག་གུག་ཤད་ཅིག་ " +"མཐོང་བའི་རེ་བ་ཡོད།" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ཅིག་གི་ མིང་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ཁ་ཕྱེ་ནིའི་ ངོ་རྟགས་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ཤུལ་ལས་ མཉམ་རྟགས་ཀྱི་རྗེས་སུ་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག ཁྱད་ཆོས་ཀྱི་བེ་" +"ལུ་མིན་འདུག" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་ བེ་ལུ་ཅིག་གི་ནང་ན་སྡོད་པའི་སྐབས་ལུ་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ ’%s’ གི་དོན་ལུ་ ཁ་བསྡམ་ངོ་རྟགས་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ཡིག་ཆ་དེ་ བསམ་བཀོད་ ཡང་ན་ ལས་སྦྱོར་བཀོད་རྒྱ་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "ཡིག་འབྲུ་ནང་ཆ་ཤས་ནང་ལུ་ རྒྱུ་ལམ་རྩ་འགྲོལ་འགྱོཝ་ཨིན།" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "གྱལ་རིམ་%d ཡིག་འབྲུ་ %d:%s ལུ་འཛོལ་བ།" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "མཇུག་མ་བསྡུ་བའི་ ངོ་བོའི་གཞི་བསྟུན།" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ལུང་འདྲེན་ཚིག་ཡིག་ཚུ་ འདྲེན་རྟགས་ཀྱི་ཐོག་ལས་ འགོ་མི་བཙུགས།" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"བཀོད་ལམ་ནང་ ཡང་ན་ གཞན་ ཤལ་གྱི་འདྲེན་རྟགས་ནང་བཙུགས་པའི་ཚིག་ཡིག་ཚུ་ནང་ མི་མཐུན་པའི་འདྲེན་རྟགས་" +"འདུག" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"ཚིག་ཡིག་དེ་ ཡིག་འབྲུ་ ’\\’ ཅིག་གི་ རྟིང་བདའ་སྟེ་རང་ རྫོགས་སོ་ནུག (ཚིག་ཡིག་དེ་ ’%s’ ཨིན་པས།)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"འདྲེན་རྟགས་དང་ མ་མཐུན་པའི་ཧེ་མར་ རྫོགས་སོང་མི་ ཚིག་ཡིག་དེ་ %c ཨིན་མས། (ཚིག་ཡིག་དེ་ ’%s’ ཨིན་པས)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ཚིག་ཡིག་དེ་ སྟོང་པའམ་ (ཡང་ཅིན་ ནང་ན་ས་སྟོང་དཀརཔོ་རྐྱངམ་ཅིག་ འོང་ནི་མས།)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "ཆ་ལག་ལས་སྦྱོར་ནང་ལས་ གནད་སྡུད་ལྷག་མ་ཚུགས། " + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"ཆ་ལག་ལས་སྦྱོར་ (%s) དང་གཅིག་ཁར་ རྒྱུད་འབྲེལ་འཐབ་ནིའི་དོན་ལུ་ རྒྱུད་དུང་གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ཆ་ལག་རྒྱུད་དུང་ (%s) ནང་ལས་ ལྷག་མ་ཚུགས།" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "སྣོད་ཐོ་’%s’ (%s)ལུ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས། " + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) དེ་ ལག་ལེན་འཐབ་མ་ཚུགས།" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d: %s ལུ་ སྒྲུབ་རྟགས་ཝེཀ་ཊོར་ནང་ ནུས་མེད་ཡིག་རྒྱུན།" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "མཐའ་འཁོར་:%sནང་ལུ་ ནུས་མེད་ཡིག་རྒྱུན།" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ནུས་མེད་ལཱ་གཡོག་སྣོད་ཐོ་:%s།" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ལས་རོགས་པའི་ལས་རིམ་ (%s) ལག་ལེན་འཐབ་མ་ཚུགས།" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ཆ་ལག་ལས་སྦྱོར་ནང་ལས་ གནད་སྡུད་ལྷག་ནི་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ་ g_io_channel_win32_poll() " +"ཚུ་འདུག" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) ནང་ལས་ གནད་སྡུད་ལྷག་མ་ཚུགས།" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"སེལ་འཐུ་() ནང་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ་བྱུང་སྟེ་ ཆ་ལག་ལས་སྦྱོར་ (%s) ནང་ལས་ གནད་སྡུད་ལྷག་དོ།" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "ཝེཊི་པིཌི་ () (%s) ནང་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ། " + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) ལུ་ ཁ་སྤེལ་མ་ཚུགས།" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ \"%s\" (%s) ལག་ལེན་འཐབ་མ་ཚུགས།" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) གི་ ཨའུཊི་པུཊི་ ཡང་ཅིན་ ཨིན་པུཊི་ ལོག་གཏང་མ་ཚུགས།" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) ཁ་སྤེལ་མ་ཚུགས།" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "མ་ཤེས་པའི་འཛོལ་བ་ཅིག་གིས ཆ་ལག་ལས་སྦྱོར་ \"%s\" ལག་ལེན་འཐབ་དོ།" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ཆ་ལག་ པིཨའི་ཌི་ རྒྱུད་དུང་ (%s) ནང་ལས་ གནད་སྡུད་ལངམ་ ལྷག་མ་ཚུགས།" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "ཡིག་འབྲུ་ ཡུ་ཊི་ཨེཕ་ - ༨ ཀྱི་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་མས།" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "བསྒྱུར་བཅོས་ཀྱི་ ཨིན་པུཊི་ནང་ལུ་ ནུས་མེད་འབྱུང་རིམ་འདུག" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "ཡིག་འབྲུ་ ཡུ་ཊི་ཨེཕ་- ༡༦ གི་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་མས།" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ལག་ལེན:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ གདམ་ཁ... ] " + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ།" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ་སྟོན།" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ་ ཆ་མཉམ་སྟོན།" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "གློག་རིམ་གྱི་གདམ་ཁ།" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ཧྲིལ་ཨང་བེ་ལུ་ ’%s’དེ་%s གི་དོན་ལུ་ མིང་དཔྱད་འབད་མི་ཚུགས།" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s གི་དོན་ལུ་ ཧྲིལ་ཨང་བེ་ལུ་ ’%s’ དེ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "བེ་ལུ་གཉིས་བལྟབ་%s'མིང་དཔྱད་འབད་མི་ཚུགས། %sགི་དོན་ལུ།" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "བེ་ལུ་གཉིས་བལྟབ་'%s' དེ་%s གི་དོན་ལུ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s གི་དོན་ལུ་ སྒྲུབ་རྟགས་བརླག་སྟོར་ཞུགས་ནུག" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "ཤེས་མ་ཚུགས་པའི་གདམ་ཁ་ %s།" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "གནད་སྡུད་སྣོད་ཐོ་ཚུ་ནང་ ནུས་ཅན་ལྡེ་མིག་ཡིག་སྣོད་ འཚོལ་མ་ཐོབ།" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "དུས་རྒྱུན་གྱི་ཡིག་སྣོད་ཅིག་མེན་པས།" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ཡིག་སྣོད་སྟོངམ་ཨིན་པས།" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ལྡེ་མིག་-བེ་ལུ་དང་ སྡེ་ཚན་ བསམ་བཀོད་མེན་པའི་ གྱལ་རིམ་'%s' ཡོད། " + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་དེ་ སྡེ་ཚན་ཅིག་གི་ཐོག་ལས་ འགོ་མི་བཙུགས།" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ རྒྱབ་སྐྱོར་མེད་པའི་ ཨིན་ཀོ་ཌིང་'%s'ཡོད།" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ སྡེ་ཚན་ '%s' མིན་འདུག།" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ ལྡེ་མིག་'%s'མིན་འདུག" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཡུ་ཊི་ཨེཕ་-༨ མེད་པའི་ ལྡེ་མིག་'%s' བེ་ལུ་'%s' དང་བཅསཔ་སྦེ་འདུག" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ བེ་ལུ་ཡོད་མི་ ལྡེ་མིག་ '%s'འདུག" + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ བེ་ལུ་ཡོད་མི་ ལྡེ་མིག་ '%s'འདུག" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ ལྡེ་མིག་'%s'སྡེ་ཚན་'%s' ནང་འདུག།" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་དེ་ལུ་ ལྡེ་མིག་'%s' སྡེ་ཚན་'%s' ནང་མིན་འདུག" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ གྱལ་རིམ་མཇུག་ལུ་ གྲོས་ཐར་འབད་མི་ཡིག་འབྲུ་འདུག" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ནུས་མེད་གྲོས་ཐར་འབྱུང་རིམ་ '%s' འདུག" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "བེ་ལུ་'%s'དེ་ ཨང་གྲངས་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ཧྲིལ་ཨང་བེ་ལུ་ ’%s’ དེ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "བེ་ལུ་'%s'དེ་ འཕུར་ལྡིང་ཨང་གྲངས་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "བེ་ལུ་'%s'དེ་ བུ་ལིན་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "ཤེས་མ་ཚུགས་པའི་གདམ་ཁ་ %s།" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "མིང་'%sའབད་མི་གློག་རིམ་གྱིས་ '%s དོན་ལུ་ དེབ་རྟགས་ཅིག་ཐོ་འགོད་མ་འབད་བས། " + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "ནུས་མེད་ཀྱི་ ཧོསཊི་ནེམ།" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "དུས་རྒྱུན་གྱི་ཡིག་སྣོད་ཅིག་མེན་པས།" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: waitpid() གིས་%s ལུ་མ་བཏུབ།" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "ནུས་མེད་ཀྱི་ ཧོསཊི་ནེམ།" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "བསྒྱུར་བཅོས་ཀྱི་ ཨིན་པུཊི་ནང་ལུ་ ནུས་མེད་འབྱུང་རིམ་འདུག" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[ གདམ་ཁ... ] " + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "ངོ་བོའི་མིང་ འགོ་བཙུགས་སར ཡིག་འབྲུ་་ ’%s’ ནུས་མེད་ཨིན་པས། ཡིག་འབྲུ་ & འདི་གིས་ངོ་བོ་ཅིག་ འགོ་" +#~ "བཙུགསཔ་ཨིན། གལ་སྲིད་ དང་རྟགས་འདི་ ངོ་བོ་མིནམ་ཅིག་དགོ་པཅིན་ & བཟུམ་ཅིག་སྦེ་ གྲོས་ཐར་འབད།" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "ཡིག་འབྲུ་ ’%s དེ་ ངོ་བོའི་མིང་ཅིག་གི་ ནང་འཁོད་ལུ་ ནུས་མེད་ཨིན། " + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "ཡིག་འབྲུ་སྟོང་པའི་འབྲེལ་བ་འདི་ནང་ dž བཟུམ་མའི་ ཨང་ཡིག་ཅིག་འོང་དགོ" + +#~ msgid "Unfinished entity reference" +#~ msgstr "མཇུག་མ་བསྡུ་བའི་ ངོ་བོའི་གཞི་བསྟུན།" + +#~ msgid "Unfinished character reference" +#~ msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "ནུས་མེད་ཡུ་ཊི་ཨེཕ་-༨ ཀྱི ཨིན་ཀོ་དེཌི་ཚིག་ཡིག" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "ནུས་མེད་ཡུ་ཊི་ཨེཕ་-༨ ཀྱི ཨིན་ཀོ་དེཌི་ཚིག་ཡིག" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ ཧོསཊི་ནེམ་དེ་ ནུས་མེད་ཨིན་པས།" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ ཧོསཊི་ནེམ་དེ་ ནུས་མེད་ཨིན་པས།" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: fork() གིས་ %s ལུ་མ་བཏུབ།" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "ཡིག་སྣོད་ཐབས་བསྒྱུར་བཅོས་འབདམ་ཚུགས་: chmod() མ་བཏུབ་:%s།" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: ཆ་ལག་དེ་ བརྡ་རྟགས་: %s གིས་ རྩ་གྲོལ་བཏང་ནུག" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: ཆ་ལག་དེ་ ཚུལ་མིན་ཐོག་ལས་ རྩ་གྲོལ་སོང་ནུག" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "ཡོག་འབྲུའི་ཆ་ཚན་ ‘%s’ ལས་ ‘%s’ ལུ་ གཞི་བསྒྱུར་འབད་ནི་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" diff --git a/po/el.gmo b/po/el.gmo new file mode 100644 index 0000000000000000000000000000000000000000..66e8a0ce2cbd02b5b105f932f9862241383051df GIT binary patch literal 60368 zcmd6w37lPJefN)bt5`&lMP)k#LlVq{EXb0u7$HDpix3ti7;k3oOs<)kJItLS2}ljQ zC;?Fr#RXKo%`}5p$zq|MIZjbo8`#Di`Ab8-OQPlH0;Hz{sioP}@ie3(W9eg491^{?mAW0iFaNJU@zF3%&(h4&Dad z3Vs)i!4V!7J#PgM20sOgf4>N7ygvjrj$elJz3JrMoX-LE-0`5Edn2glMnKKOX7Et( zUQqP;fa=Fv!udF;=WYREp=c|} zR7HOas@)eI9YqI$hk|o&q(lpMoz3_oGwl?-3xEqBBA9_4VO=E2#PZdr;5)?h=>hqrrD^z6KQkKOL^` zbG*y_>p=B)3{?Fe0M(yIK)M?J2vmCqo#6et5Y#xX1l7)#aQ-*oew@DuV(9r8RDEv% z_XG#QgTc!|_4|Y1Uf>^ts_%b*D)(H7qJF+C;IW|kw>q3(10KTpXTZI|FN3cFzXQUG z(Jw&tYwqh@54}0yH37GP>fblP{lVXWhk*Mpb-jKJD0-g`YCNmL^%f{Ty%tpY4}z}% zcZBQT05yMq2Z~>Q59O|MCxED?=o0Wy@J8?e@U!4S;GcqscJyOVblCsoC|U`g3Z4#r z2$Y`s5eSK+*PO!KgAGviJ`AefAA)M{dCPqKuLfVu`MIF<@p@2nx*MDUJ_?Fn-vu?l zd(+5);F+NAH$c(nCQ$X?18Tnh1XO>&1)@r#-#rZ-1TFy&1~-6*gLiafo}s31K$p69Cw2n=O2M*gL^KIqCW&zftTz24c@i-f@{BkiU`i+1w_+C(a^AM=|z5PsQ1tpIP;}YrJfE-Gp!n%Lkgi9gAR-Vw1**RaR`3Pj6`=ZgH8>A^2wVjI5EQ-lyTIvl3aIhd z!54#9fiDL)gX-7EzT==R)u2sUV^oT?(rGhe6HT*Fm+v=S8j;PXrfm zekS-*@b^KD{}wO?9{|F*~=XRs@|2L=Ajo9zg!RQ4}KOD{l5TezW)&vefGcD%P#^|?**XBZvgiN z-vg>&p8_RsUjsG1e+Q2P_gm%9tq3>@N*~?^YCgUJs$6u5&-Y?b&z}jZzCkbs-wW;u zJ_H^BJ_#-azXPh=OW)%CIvUjcoegSykc1P=jw!5F+I;5`Aq2p$|EpWxBp^J{*7 zJUEy0i^KUl!SkLIMV|&mr(dmcexK9pxFFzh0hb0`9`KEz#{DKx{k#km|6L2-0NxHx zfCu$K1Mq3^Q1Cl-w+p`kQBl$H{XXt@gF3$#yb=5bcoul|KotEA_%%@D|Lj_iuf7IK z{*P!No8aZ3p8s1A6%!rtHut~Y4ld{XQ4kT0p1%&-ffs|2INAxq%F!W%ZeKTon)f#N zG4MG{{fz;>!ZjXcmsF}_%x{TFKi(b;3iQ0|4Z=q!5%7~&-`rxC2!vu_qZ{-%-cN~ zMAW0tgNRD>vh_aRA@H@Fe>I#xcLTD%- z>%e=#4}eF$-N*kW@F~uZhA8)fzXV0+PtaNQ|Ai3m4Dc-=U5!2iGF4H$3Ed373w$Nx z`4y=7+Lulo39begg13Nr{wYxOd&xCU@0FnVdNU}#e*_et{WW+F_$zQRc*eD^C$9(9 zpU;CwgL^R;l{*zwyYB~20KX5;0uR34&rb!VN3I2r0-pdEfd2{}1J1m``T7!2{k{{N z2Yxx=FF}oC_B*5K&EUo0Qt)B$Z15N0vEXSp`n+!f=X2f$)!uKw)4-$N<^6a&sQy13 z@M%!|@#=RwT`v##BT&zseUsDg{opFje+YgOJZZDn^J7r@>cE@b{;dGTpSOV;-;Y5^ z79Dg;6b*nM2OHoX?{Rq@15f7s|A4OnUw^CXfniYn{CDs?u;;xVH(v!F&-qi}Mc{A1 zlfaAK$6SLS051e*-v$qYn?Q~4FTgi~b8dHgas{}O^G|_w@K>PdTYEpc9efPbe9pPU z=Y0TF`6s~Nh2LHd6Zdj{;0IkkH-WHz^fOTX?Y-0aZ9Ayveho6^(YYUjm%+aVF9DDJ zu=n%*p!)Z-aK7XtPM4cO$@4cr&3pV&w<~MFKF;3>s=rTzv%xpt<@|UJID_-Af};OF zgGYhmcRSyF20V%LUxKd%kNcSW%T4eA&ffofR*;H}_Wz~_C| z``HVs-?xII)03dud(IZ8_le+q&OZyj3H&xF{yF+Sw=1`TqQk#{L*SD8oxb;it2zHF zsQK=B!1dZYz)Ly*Id~N~@Q2PnKLcx=AGwve25$vV1z+``)29Y*=KNkz{XOO(*JA^q z#(yJt2KYB1QyCrpIpzTT5_s)%uu0pXG3U{C*AKr2kKpu}&od|B8c^-t2M&No?{Ine zD0ms?KM&`FkN7yg03OEm;~w>SxC9h^wt=G0UXQsvybU~;^PS;*@5g-}2f&3~{|tC6 z_#JQ&xZe}rzc+x#aDFYQ`F;$X4gLbucn{s_{5%St!ucP77l2QLdhV1z^7(r^cpB$F z1MdVEJn8o7E8s<(pZk>e_p{(!&R_5am+wX3Nu1vYo(Db+z7<^h$HbiA$H6t=o?rC& z9|1-G9pLN0=l_YcxC=Z1{3)n$9R8=yXXk*T*G-`6{X4J;p8KU>S3&Xbyg&1K z_yD+`^S!?8dgBIA&;L27ejfhkUhn1L2RPpj-Tk8OW?kopY$!Ki#SL%IP->ioX8| zUI3o`*RDrC3HEUQyuWcfwh+`jH$c(()8Inz2cYWR=WksujsiuG8^OcDpMXb$dw$#J z^%PKacqh0D{33WVIO97`r+)BY&hG?8=N;ex_=4}co*f3S=KL}667Zz&dH+8G-pu*` z2FJin-}mwT98^E9{DJfFJz$;le+I?B7yQum&0XMWoIeR(1HR~gI-NFy$8i1=@Otpz zANf3g5`3+$gL>}3AG^Hvfgj`iUa%KD<0n3!4}kCBeCgkLyHA4iIN#%^PRHZGxttGz z2Y??8*SCSEbN*BCL~y~+Tz`&$CvmJ*a+t9TYuY`S*VRX7D+j zui;4kU{(9ukN*$n=4~8r4A+k4^P=!Mfrt4(_st%Cl=~kKH{QkPm-G2i4)Mq=jx)J- zE%+ZCeH_Pfejlj6i}?(@M@vDbGx~k-?HsU_{k1ZCf z5v+kRhyKJr`n!?y4~A>&0_wW>VmpWEb3ey9-1`v6i#Yb+SjIK|y-uGw1~~Nhd5#nL zd?9!#$9{aC6YfbS{*Yr&jt_JEBZvNO3HSARGso|6{uL1MPX8|E6Y9qP?hfUT0zb)> zUx(|bbN+^KZ&N_&k8?N<+;T z4gVOukk5N^T+jJp5K)eLK|~??K1cHR60UujlechO%I8htMw8Eb@%gP_@>dHVem~&* z!EGFGp$sY~S`J1pZ^U!mjm@=fA0?X0`A?)p}$viyqwSP<9G?58yr`2ye!=R zIiGLlNd89ou!Q5e+`p4UdPFgp{@w%*hR-^e?pn`rO}Hjm)ZZx_YweTkF@4++%DgCC zKOekPpSgZnxF)!P^Vfrt-*G;-!gK%1`5EE!i^1DD-^npMT>BuO^>--8XE>hbIFjQx z9Qykd$5Q)*PUM*x9Q$+rc8*iSb-^ES{250-_pb!s%W($BEY9!ZKxIT<;LzVs9HI-k z{yaX9fR}^s0rj^(i0X+JhVv7^<2lxIe3R=x;5d!Xb?~Dc7jQg>^B#_0@>zewd_I)p zoqRqRd-ap#@qak3&?DdYP1w13*SpioBTnV<~{>ET^Y~x5>pB=~JH576BUV=Nx3ZM5gs)CU^F zacwxR57vk3!(;JqZKyu&n#b1GvwB-JbL6Zgv32WNtbefCsu#LvEi8%Ecuixh_hp?B zJ!YLat8xSyTHN){Vyf+(6-TpAIyY{P#CHou0eQ~bm;WCZ%!6Fhs zP4!>{?t;iIafdE87+|XWiq9m)X2Q??@oCG3;I*M$DO>MbKJD61g(;?AdgWR)U}fz? zFiOTj)eI#Skd+C8h6TqV%VqV!jU}#33z$-puAghnW~T*ZQ7k#yL{bXO+*==XiERuw z#^Bk;>=vJEwcDby0r*VMWOof!a?3>MHdb3Z~dJRsGLHePvZ&w`_;DsgPCz-Ya{ zK8hKa+Ul8i1opPC85FY_cl4x>YD^kBHL;a7^x+X`n247d4jygQhme)Q=J1kusELUg zY^)QjY;2B8&mejXaR{ol5V)-N)a;1p!*VdB+goFh!YujlSYvEs+!NPZy|oc~nAT8h z#fNjYBs#f?mgqHo4HdBp1F|@}Jcc1sg>FT%!OCpuej>m9qs^gQj}q2VM~p|XD;jHR z33zsV(8n*EZPPq+FnBV0%G8+TAf7R^H6vHt1S{|@3}y{m6QQYHDC(*iTTb8m>L@n^ z20je@e9E#@m!G{X9vE$6UT9FH!1OmqrRkW7=5Re;12grmjZVp{Wad>?$4o~5#(3F= zdM~0}AMA@xY4(nrQ^hPXo8!av4cHYpg*mSE%Sn^A#6H&sG3$*1btQG$nEKQdN-HdZ zpt(yXXp^=;?;Cw$(B9^d^#Tb94uEEu+X$R7!L+I=_h*_9C1zej*tJJ`60d5kHZX5G zkBXS)1;spJvzjz+T5Yn~c$*wNpAyZqbU9iBW@N(6DZ_)Fv+dM9GUx z+#&d2tT8y~UFdOHT94dnY=bpAnG8vN#N(M{P;+rMo!v}5)QuI)nJx}3Q6aP-x*b2W zb>xXzy}|WWlwkdYJV_U3*XIq)i;tJXd*Ynz33azVG=d6(;es5&{mo&x9x|c2&80l0 zi(QHHYCBpM!V;5s)$DHW+!$Zdh=PGdL61?l&05ko^p8z?*XI$YT-jnR(K72k)k=}h zI(*42G<6*%&0Jbo$Mptgpf*}x>>4#b{L=B}*pm40LH#$N|7s)6){kM>|*g9S0A>bKY6E(U89!iU^V zRivBJ@fDXnkg2$#2q}L#G(0@8IF7v8q%XRJUlJ~2P^_nNb4;O+Y^=JS`ck=@edF?( zHO64>a`y)6V^*z(;gJ|p-`~uY7_8yOtW^a$&pCI0sJ2cw@qX4c392yq!|U?5o0nCP z2{R>kKA!1*0GJLxyOpaY(Vgk=OdKi-n8}r>bh($iEKg5eYgz!9ky@rZ>2kT5^q%~M z($p93m8Kcbx!y2B^wq{{xlUv^hHzPG19@H=#cix2UV5DvEe`xpqI#i7M?XWgcvwt- z=P;0^Wc-DmhU-M@gzz;&(T<8+%|Yw1>nf8mJh9xxLVe=KdQaB^=qTeXRCTGLR?zV! zS|*n}DTzO4Tz=lNGaJL>8%&MYH;mA{v?SIl!iJMqeHbZS3#9e z=KAKvCDB8T%eyw!@j#*qM(ZPk}-Kg2@T4$4dX^vnFYhAepyH@OTsVCCYsYW8((4Qw^ zzht%>#fNGk)#l_L;=Ef?^ElI~u?YyQ%(V9D?)08Cj?E^uSnaM>HCeNss|jA;TzTWY zYvUFvY&c|XjU?9^+*~3?OM9o$OfJsP@*%SiKWyQmqn3D>wSla{V0{ib2c~^(ZN%f1 zPzxu`re~RR(<L7KxmiPUum_B>3lgLtsbuH9~^J3?N(`L@z%!S-szXN=S#(<<4pAscH~$_m+M(f zvX&r_K_J2&Y{2iHf{#uum86;^lNzEJE5T(8PrbY-N0gJMN0s$~u)VYFcJT1iJXpwQ z73aB?FRBD>blQ2glyfpkBy7rAZc>T~F(p7*8tH4UZ$+o0F0*Bo)5!$dT$@@X2=PSJ ztczz^(5tlCtV?D^%UN8M)S#5tl?=l8ielm}pKeQDDp%FegJ!hF zxs>UWye-D!6~zj%y6%q-lZ>s)ku?!n9#%q6I}hJB)Q|Hbe==I62p@Lb0HCqVYZ~v@7`7)%YtJb zai_JKymjwmm~t445YBV5m)Y{5d{xELIbvmH>%*5dMw`PDlwt{AxCo0K1FY{1r{i0X zyCUvNy+C{N3arz!}0Y|7?C9Pyox@gm1fo0&Vy&8qTTC{a;RQIZkVWgsY_Ea z6{8WMokl*KP`nm1%pR|7q}CWE7SNi&T+e4(F1@0%@!@o_!?l^Xpg1?F88Kfgo0P1! zVu^&>Q{89Qa#LJU8e_@Ykmql`WOQb|f6UguNmluyV9-3O%>0=(Gle4#QF#O|WK_HH1qw&4TS$`#J`wWtdtqm9cfMjd4JK#FCJ zsATJFKIX1ZvX$bp25YP2^qQmIe$q9go2cK*st3f@sF(6_uvA#i^EpBql2r&B`BasinA^vt2tXFY))2K|(UVlAWt{0&2Z?7L*`-!j8>+3; zPg8}S24*#v#mwA-*OD{_%r9dn#w)XTkTL(5P4N`O3@dY5YQgE%9;@nA)b(p&K+LkF z#nretDRUY{oAQvNbCNis=%?qd+wv3Zziha`{W-@2xS&U*xQm{(ML5xllh0j-L1!6} z^e-~)IX&b;!Yc0>+jOiFCA4m9O2LRs^TD+AIp;0Eh|1XtVws=73ARL48qW$VDuIG; zC0xFcl`YkWl{)&TDe^MWit;{-EY!#x7gv36)bs>TJ|T;5GYkeu^JlVSa~Pd#seV%x zF5CTmTr;nci{?bGsWXA{RiuSkinJ{XvLp(*J(BHsVq-Ir4X{|Yl-2IsW0n*M4gn4} z)nXR4> zDPh@KQT~!@%e?0DEm5wd&Q}t}!|uV_C7c!!C=_iZLo6viT1RSQYct1)s>=OVfoNrtri4h^L+hqvL@LsD&*Fcq z)KX4KpjIZ^)~wR7AsI#BK5%jn|9hV0vpTq!l>GEIEWGm zJE_f^$oBJgJkTV&#-7hio0(r}&E(2ziGn2pTRP7&X4#;;TN+28P?E4Jdot=y;`*5m zJ3rlM7T0T|lJMcao@Ref;KlrHTXM$E7j_TZmhIIecoXoOVnNN92X|V=$0x|IDKVt9 zXEqL|7PCDFHK+5qC%UWZSYK<5jWqhG#1itkB8h`bOSZ?YJnH2BT-(v4yJ>DN-&+eZ za1HS3*mEThO@pL_ZG`bOCJ$&W&>Bt`M{#+rC)rUre} zAp57&2LflCMM3QpeI-#=OMF^Bv*ZOc-$cAeF=%+DJ!XE~^`b)a@xV;oltP>HZU01c zfkjkGHki;9mRZxtss$&pSY)vk50LONvQ}n}6t313q7Bw-!}C=CG>Z2RHt{4qUZ3tW zN$CsW6wQz%A&ilU=;LB@*o5ao(s%=*ax*Pi3L?7roE0mVpL6!SdGjubR^`%g*aX?A zXw}JXE`nxf3I^Hnwx*7ItiYTg*5bfby;aYm=Uk!s&Q4~OuZ}<)wiWW(Y!ZDY5XwbU z$xXiTaCv>S8M+;%O{KgX!k^i^>Xn<>cQI@!x}?WtH~gy@w(mP#$YZ7yl>}mOhMz4% zmNAWp%EF;-vrZhHNR^B3($atgUaT_3>qzA*Q4>(9TbU5!?*5Aa~RteUcIgpb}@Q%ie(tCuQxs0Pi{-q!j&YSQa0mT zVzcMZNw0^Tewvw=wobo|U@lfvr8-g-(bxbVvYa!3GYY*BJO$~iR;b6TMp6mL-Aj_H zqpnIk9U^^T-?M<<^vyrIQ9;0@1d?c5(PdXy=t!RoZjb5JIh9v0F@0MeVN!4MJbhOO z#@7UW>WQB0`vt|U$qZxP8POE?MG-Gr;`B+Ll&s>`Pf}uhc)BI5{ZM?`J&-Pf!oFrX zz^a%6rLH5@diq+-R&(6+bH$UWY1>w2@#zSzY!ui*>Tyj&E_QsymADW!HX-wkgwb%{ z*3V@HNxI@Xbd+lLjv;eF0k=@3@{+?B1XnFO=9nm~`UVNtDgx>hsYte~X${Obd9#vq zS%VP_Zp0$g*-77rnFwF0A-9ub3QUfF0nop$6PieSSmrWP#`%Pi7C*HZ+FDhhi3;(*d)4ENoKj%u^|{OT;R*bnLJnDjWYw z8?M3NO8Sy-em1byNlzBcpF4j(Do#ezbB5Ufv?c+e)rpq!^SU36XTgAzh%5T04GtAC~{@itE+tZR+wm-dLAw_mpT>MP0hYYHZC1|unaZ*St3zaeLW^2QO`1tJe>jwBj_24`-(uq7WJTT5a z@t&1zcv>8vHcHlZ53S8*<5)0n{vId0a_&(cWwE8|jwHL-;7cEpMApDguvO%&oH~If z>sf{)q5yeueC(RW*d8ke`9|KZ-X z-r-~y1*RGgq|j7l{Lq!a(;ApMKWTs9Hl~Jd!(k7o&+4#7PsW7N^LTq3!`=b6FmO#+ zj(i<-v%Y71lD>vPgenXw*Qv;|2$f7GzQ~gz_f+z(1~C~v__=ZW{^AQ8=;~GN`{=r+ z#AmC>h~k9D^?1gLdZEL_4HGx=e~{eh+6Nb*ETMnHAuJ( zV(#GTP8-hyCK20J)k9o{A2c6HLOW{TM)}8M#9jg_R@ttWVWXY-o?UO3x6=nnida*l zqT~*qx`8orL6de}tgZ90<|n549h5=fY?SKQj$AjaMRilpx3@;^yFxFrYu=1%HA;H_ z?n8jL!!b0F&2q*;Fv(35S38S`F(KcN(d+y9Uv#jm*O};x@bsH{_}?ZWrI87h*lt_< z2^;A{@TK_EC}{ND21Or&23setN991^Tz@3rJkfp>)kg!Af{R_*h)_^l3DfD1V|&(WOZnqq7r|Q=h9hJPkBxx zxIf_`tKB8QYPWhBXJQ02ep3b}Tims&GfB-&0W6|fkJ`6V{yxfI$FSiVq@{{7R3cGC z(&*k6D5{}o&P80)Pt3hI>(=(?#L%1|ELL6qNn-|SG~L$x-^6IFDlrpEyW`F@YuvrZ z>5O-R0VZ~RvxXPUvF>_DuG7$%4RLxEp(H_~$Ro_58Pu3MWL0@YY$6`@T}NT@#R&GS z)Y{4D$pX)G+b9lLk|S2S-n1<0iQ6Vll9nLtT);I6YBDe3pJUL@1ow*x^b!=P@;FsV zHg1Fz7;cG8VNnA&wD?MtXSe3?-jq&qY(o#pc+#s%jWOv6rBP*uB|nfWNWEQ^3~&=N zN&#)dawW#u+PM!lk&5?bL*Z`DrRvGCsXVsFja?sb?sQXCIR{hs5N^$PWoDn+vOack zb?Hsm6S$kS*^QRNH^e66k>AqDPi4W+wod*(XnSS)3Y-d!gkfdkq<$0$SWqJ7MAbVb zI@GIp6DMloMwdoDKWesSK*J!OLEN? z6kKpoG94A(NaT@&yNxmw@(v2!Dp#mgfzmsQU@v**m5=XC)Gay?gYC9kZtIP()fNUT zbDIFp9akTOOB4b;GI6u+>Eh!&C{Ob-_aG1*x*ekW0m(j>fO zNkPT4UG1^vTx;0!^)x?QDjG>%Y60ODV0G9$LL+&DmUysnm?zQ^;a1czPFInZ2Y z8)guVf{+oCAWI^m&zIQcrg-*}IrHN7-7wGRO<9pf@W2(rPF@HOvRH+_l2Jgyu7L*3 zs_UG?>1-CbLY`Rhjb_Hmh+wgTDVS>qCwe;Ek%Hu&g`7E|?{R*I%&;(ljq|cnAewDu zdR&EUuAov(Pp%FxnreSyLJm7KL6gBNqk<=_b34H8iHSG8l~axs-o#UibMJ$ZP`4T~ z7r7*_Mn$C{sMe;XLkE@FRr-4iJ)w>gUz#9$7$uR(XC%67(<;3!6|n`%`(U%zTUl7< zxgv;>cT$h3At#h~U z4$~8YVy4Fv7nXudH7cBzdYsa|sJ(1@!fHxk`XxQd1*mzAv8u)P%n*)2KAC7T51(qX z#Wo=&ktg*u!;eIRBpT;F24_8yVkc#5q96_pW3(>v5R+-I0gKwEsg=%4vK6@U1zjCj z!;&f*#8r$;G*bZ0Bw7$F2g<#38@B5auAuzFWrV<y9;Py<4&gIzh%f-d&V3U31qbAGv=rQd9_c@+=#NL-P!WIXPKvd{6Jp>Kb(xsSPM;s zd6QkeYa51)@X$n=SC@I zEIBk~!sI%ls+~#V&F;N$aC)PYS(43r$R(Fb%WMx8#jqOpU-JDE&4WO)Iwm7H7 z7!8TxCE>DNN*kE!<$zi$C_aze1*;oGYx>cHRx7nS@!uLglzacI#SM};XKU9+rG}t< zIm}C`o|tJEOOtw+gY-riNYX%-4fWw~m_YqXVpop#njF)54? zZ1OaVRU|abuS>>8#L)R*PNee+Gkrx@fmFqD+Co^KEFHHy30JW+WUjq=d{ZqBRrJ0~ zeL=Rf^`VMK^K%&32b(V~X6dbpC-6rn-sx#8#mHL9-5GKe7XNGFwfqMIhMBO4$kTDK zt~`v2Y8A1U^Q}}HqAMIFEjdn?lnDLwQ{Zip4#6iq81uGR+(D3J&=Y3NX9 z8`Io{({sgbUk!TJH5PJG)f-6xVv}20%XPn!iIp=fJ|ZWPev;EQQQ$-8Imxi};m8w4C@9 zB!_lNbCQU#CG>=)6J_D%xiP(bRQu_-1>> z=&6-@3XG+oKq0VY7hQU-5^5y2$mBEexJtR8Zfa=q{@dJ%F7mv>=0_1!ix&*mLLCN@ z=E@#~r%g{*kBROFyH!moWM7`xPLK69^SfM+<&Uiv(Xg;SG{%`@o6gS(;9QrEcPqn8(sr_O15LZ3}5e!nBA2 zuVSc}R*-vlbR~t$z3LJW7u0UfW_OIL`gyqgMv)crr>Z$5@N>?eEf*s{=KeDQtR75qG*2Sj?BT z?fvM}9%*WlozGp3+K;l$O;?#nexv>^SXJbQg3&U%87;n=ghAkn3^>=6t-GF?!pF^4 z-XuSX3ozLpqd0l}d6-AqVv-RXg?-^GBYGXW7S(N~QQTH&Q+>!;VNEUeVY8`4DrK;? zEwXCLOIetXNYhL>(L|>-R_MY?>(!Cz*}XQpDR9$Y3^r#uG;5-y@1Qes7NY1$##S~& zyzjkl7h1;csis*+yItU(LX3s|Cwt$Kww=Usn>_5C zxH@je6xoL&Ub6Nl~f8XECfA~juJJ1Ps#t#$9H!X zc9Rw~b#uzf+7XM)EOhIW;4Q^l9(VOv>#7s-)0~#X*`g(^?t-tnQ&TdyM zp3Qy9{ZTD084D{HFGXgw-Tih%#$*8gdlb)pokt(lS*LH-4nk2W4?%A;>~vvVhST`N zybBWxtsjtpHy;LR)Ay2-J;A8kf?uhxB6o6^N8^Phh=Tg4y$8Ng9seUZlKn^VwoKPG*MySCd30@~VTmwrhMoE4G3R0_$6 z1qO@IebCJGTov;r@Fd zV)|;yw3ms)*6}MSCJ9FN+-^(@SPCgE-qkxvt(bY~Vr^zs_DFjK=-y*R1G6WHX)6P%N6b zyh@rqQ0Pww$!Re7-hm4g2jYYWm9Q(F>^`p2=kw$>7r_@7$ZBNn_noK(M3zFjmL?D)d^} z2TSx?1#c%EO!x=ApL{cFI;AtqsL{f= zFw5q3Iv0|h{Jd-YoGX&E0F-Lv$fz>r&INs^UXR5)Tm7eSv|m?BMY|Ae2^EKxN)(rM zi9A0f3yeusX38mbYgH#-s_$%|L=~SW>2MnhrzA!TuMu$DcALVALafxWm}yRz zt;9*iq4|su&nPAIA@PNA2jOLvxn`f9_oyVR_KjTeq!`79>h5fAXJ^WT?I)DovvnYN zMpi&3EF`d^_NQgd7{(U8ZYrtLc!k>aJr(=1W^e`=YWhvNEOSxFrzSl%J{6gii?w|` zR32XTgQRpoKs=Wfqg_b2%E`ZzQAmAkDc4Q96Zy}_6mB?zK};pw zJ)W)XLK1~+P88iwJ?`yhA5uyeUc%G$d3h|k0cUG=f#)?TzFkX83_e#(Q=DpZdsUR~ z?DE`XluG!J5i4}FZ$II@Loa>XC#YE3Olc%W$+*ZXsnh&q5DPu~iI;pZ!YIY~gEa78q$Hl1)|{=&%$tea4};yec0z_xv`y zoSKEo*`VV}-SPut)9-({=? zL1fj0nMzMu&+C&)-g*`}JBYulm76egW*rl^K$p2#@0&FZO^B#ajYj;v zliF#-49I))g`ZAy62_#Fl#@{=T0thlTV1hYrnxDtpyfUd$GgL_boJ^$nskwye*?zN zUm@#+sFGgEpVf;$5fK8~H*7>Wf(j3UHC@Vj$r0vv^lXtlpLPur8w_ObyAG~JnJo?1 zq~0~VsbRY&a)pKSU8@(lP%_SHHdUU`Q?Kq&YlWKck*l=H?7S8Wve(+}OuoF3l1;8f zmjzhJkn@Yg5VpeGSx4%+YO)gNLg@spV!2C~n6CV?t(G)oZKtWh+#ku4Tg(xdw1Wh< z>1JL#B+Q;hd@yU| zxusj>T8dRbFNFn@J#trvTgYVRC#SGtZvlhGBmEY1Hcf12SiXPVoUX3fmOCT`9bYX- z*rh^w1bXILGf%sk_6qh8to$z}LXqk1bO>UnnGWO1x0&)_ff!nNMhUpCga=ETfILOD z8LmatPUTMHI-KX+%8~g}o5b9)Fr`L2CMX4@n zQ;y)svU*4u3@NDa`LOGF4;RSEBU*5^7%pjbR*VPOrykDDOU9(bIijOHjm; zB?QQ7Kom6=UV@#ER4M5$bCML3Cv5_hy~8T-?M(fIWxJwX#8S0rcZ+_~vZ@FLs=LN> zw($~rxbdeXUb{J)6~Uc;J>!}8BJC&wYu14A*m%`9-=>4CVM-Gp0^gFEF_$?!5r&s! zVnnR+!?MFUK4J1OaOJ?r7Na~B8Q!jz2u50U1^?%&buv$0n3O;urSTB#W81#vJcwDu zVwhG>W1*6qz2H6qaLOcc?~J^bn7D36nBbh~@hG*}>M`^vtRPFx^V+~L|B6tz`14L; zH6stJWAQub&Ex}2elY<*NPMZnHVV&E$^9wzJ?MkZN=KbxpSD=Saube*7A5P<6?git@hE>hCt47NS zPIula7%A6~7%0##Z{8Ck87t77ctSpgWj^@dv`aCMTwLe5f68VnSr3KFH(-q>rZQb6 zZDRhFw6d^B>24LtYqQ+9bUO%}`z8_*HI9H%{93u)tg+{IOj0QV8h9MpD^5g(P$uiBFH9!6SX0l`ZX3<~;k8O~shQaZ!>whok-B4oiG$w}%APO)57 zNe+}G%G1atC|Eq`6^bbGQ0#22r29xilf_r?7k*b5W_Y}v+Yjp+yRgV%bLB}(TdnB$ z{z0N?bNh~_+p+Wqip%|AkY+oodorCagfE>;M%^6$IHk7pbHIgPJMN&bNxFQ4km*kx z8nP?t>oR>>%QI8?Br!~Zo5X+$6O#P7ttL##C#DBdvujRA?mLa1Mvx&c5Ho6DkA}4` z{YZF3fQ)Z~d}qmL&u69I@)R@LvPZ{E_{1q^lw$`j>I)3J)Fl0p5YulZN{WvfEz_h2 z>Q)PbA+X~KS=rL+dCKBGR!ohhgl}S?dRYi!RcyheEOlkX&YBs$=_ZNOl;QMR%(6?P z!xhMhi8(#YZ%vYHs%1>IC3P?mz7dsLN-?DSn^M^{rdl6R0?e8xGD4S26z#`Ha2}-4 zqy?mUIFy`VAmVxVEW9t)>%vAQ(Fj9g-%ShOEH8N?QCpiFw7$NbU(*RrW~bkt4`oqL zX*`hI7ie0K?pPkUWcYN^1t6D|(}+ksB_4RetMBZA80|5IQVb}0zpe$d=`UYD8?@*j<{k1W=VW<|)Ye#Fsa%zI zJ^9*5+QsmDQ*O^X_W+6Ui|z2^oa^etwtp$Qm|WZ4?GKXlzN`Jd_8sBZx{b?<1}eBE z2~#OclKTyb$aK5uxvHpz-}(+!R{cdW(|2c-4Sg6< ze||j-jV^n-k^W@!250%)vVun@1!`_%yQ$d^!XM2srUT;Z3E3t~2Ur>@>?saHSWbOe z!Y8y?6a(!hN`C2`#*(!g(;cFH*K~${eOSN!PM7GQtP4GiBoFB((InP&W2RZuNHi#$ znj}}7T!3%VU2_;YGao_D}I3}AtTO$<-(*DL-Z(7uvC!9m1S!sSEU#| zi#9YN&c#X8X)7NcW-|#nrml+KVcEr~jGPy`z;oU|W5?-NT-f=VG=H19Acf>YLT=H= zeqb>D(R=j-A0qthy@qDO-VeW)$n3VY^VAuS>U9Grn!B5fkOROe&Io;gjyt z00X&l-ilaQew}GQ8Q6mr<3gV+53ba>r z$Y|Jnrc2!T8H^L2mH2crj?J5tlh3v(0(dRYPtWKvP3^2JNdlXV&2pW5qKhmclo#e? zmDRsso5*?VNh^lRM+B1?4lQlf!5sPujf~jY%Pu@~`Ps`NQzp60xdxI8lBT+EuEDNr zB^zPRla?BCS5Df>wy?V(25%4B#n`kH)J#s!e8>Xjf)LGFsq&N}iI<4`z|V|#77O1H zYSk|tuMhXu=@Ba!>5rqw_JiROG~F3jd2ER|LtWc3tO3b>%M`F!7}K7dR10OqJhG%> z9oQ3I+=NIas+=DaXSP?3Xm-=@@g@8knH}ud=%3U?TAH{3a`CX49DPUBl8G>j%z5&S zb8~?^y((#sbmO^(%I^)RDk)Qj6KI+LR(K~9=Ih`I-Zq!ClT~D)c=~%A8dTPQ?q9Ko{Qe#X z(+MT_pJBMObq(D~e?lnX6MxQ_B;9inj7x>umnC`jYI}x8WH-Bj;&pXZK^08Y?$z#U zy^v1%t<+f{T}7jlTH$9pL@X_<9OmFDGi>Q)W5FbOW2+bLW9DANnmWrB1fQA>r_-qD z&CBo5G}0}$#b=ZB9eS9$Xy5ioJ$~xfu6WzLC!J98n%pKK>r=IYuJw1i z;vmzKeRUzp>ribHV1xmo(r(o(If79Dd;WRws^y6&4douMsm;Z3xOX7%l# zxi@pF@5z3898I;A`?1?d+N!*aB&~*~5B>yCpz$;XmTu2f9arVHCcjl~GpZIW(4lBC7S0~aY{p#0+YXn#!!qSowg%hw6Md6;IXUmNX&sL?2|J^f?nDTi5V=cE6>Xk zBuG(L${H7C9cP}DDAUG7r-FRL4w=))a$AW4QSI4er5J@@U(lrvS;(XGw)Z1};J-3yWU4wr#6F6N4)+Zr6Mz&bblGV-Np0(mC$pAUkD)&Lq{%KB++E z{BB`o?j#w^lbA)>9)Ed4XMbj&bo_4iV#RJfzse*XCn0oMk}bwEuI}c%QzVxL+Wi{j zbJpKh?;TsczA?6THE**Vt&KIB!_TDVsvsf?9iB3)EOj!8Uy-_Xro)iK5Y;E)qQ2DQ a=A2v6lrkh<+U^85x5~oUB#I_i8vS23EuRSh literal 0 HcmV?d00001 diff --git a/po/el.po b/po/el.po new file mode 100644 index 0000000..452a3f6 --- /dev/null +++ b/po/el.po @@ -0,0 +1,2250 @@ +# translation of glib.HEAD.po to Greek +# Greek translation of glib. +# Copyright (C) 2002, 2004, 2006, 2009 Free Software Foundation, Inc. +# +# simos: 25 messages, initial translation +# kostas: 03Dec2002, updated translation for Gnome 2.1x +# +# kostas: 90 messages, 06Nov2002, completed translation. +# Simos Xenitellis , 2002. +# Kostas Papadimas , 2002. +# Kostas Papadimas , 2004, 2006. +# Jennie Petoumenou , 2009. +# Fotis Tsamis , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-18 23:12+0200\n" +"Last-Translator: nikolaosx1 \n" +"Language-Team: Greek\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Μη αναμενόμενο γνώρισμα '%s' για το στοιχείο '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Το γνώρισμα '%s' του στοιχείου '%s' δεν βρέθηκε" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Απρόσμενη ετικέτα '%s', αναμενόταν ετικέτα '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Απρόσμενη ετικέτα '%s' μέσα σε '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Δεν μπορεί να βρεθεί έγκυρο αρχείο σελιδοδεικτών στους καταλόγους δεδομένων" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Υπάρχει ήδη ένας σελιδοδείκτης για το URI '%s'" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Δεν βρέθηκε σελιδοδείκτης για το URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Δεν αναγνωρίστηκε κανένας τύπος MIME στο σελιδοδείκτη για το URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"Καμιά προσωπική σημαία δεν έχει αναγνωριστεί στο σελιδοδείκτη για το URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Δεν καθορίστηκαν ομάδες στο σελιδοδείκτη για το URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Καμιά εφαρμογή με όνομα '%s' δεν έχει καταχωρήσει σελιδοδείκτη για τη '%s'" + +# gconf/gconf-internals.c:2416 +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Αποτυχία ανάπτυξης της γραμμής exec '%s' με URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Η μετατροπή από την ομάδα χαρακτήρων '%s' σε '%s' δεν υποστηρίζεται" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Δεν ήταν δυνατό το άνοιγμα μετατροπέα από '%s' σε '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Μη έγκυρη σειρά στην είσοδο μετατροπής" + +# gconf/gconftool.c:1181 +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Σφάλμα κατά τη μετατροπή: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Ημιτελής σειρά χαρακτήρα στο τέλος της εισόδου" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Αδυναμία μετατροπής fallback '%s' σε codeset '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Το URI '%s' δεν είναι ένα απόλυτο URI με την χρήση του σχήματος \"αρχείου\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Το URI τοπικού αρχείου '%s' μπορεί να μην περιέχει ένα '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Το URI '%s' δεν είναι έγκυρο" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Το όνομα συστήματος του URI '%s' δεν είναι έγκυρο" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Το URI '%s' περιέχει μη έγκυρους χαρακτήρες διαφυγής" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Το όνομα διαδρομής '%s' δεν αντιστοιχεί σε απόλυτη διαδρομή" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ακατάλληλο όνομα συστήματος" + +# +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Σφάλμα ανοίγματος καταλόγου '%s': %s" + +# +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Αδύνατη η διάθεση %lu bytes στην ανάγνωση αρχείου \"%s\"" + +# +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Σφάλμα ανάγνωσης αρχείου '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Το αρχείο \"%s\" είναι υπερβολικά μεγάλο" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Αποτυχία ανάγνωσης από το αρχείο '%s': %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Αποτυχία ανοίγματος αρχείου '%s': %s" + +# gconf/gconfd.c:1701 +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Αποτυχία λήψης ιδιοτήτων του αρχείου '%s': fstat() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Αδυναμία ανοίγματος αρχείου '%s': fdopen() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Αδυναμία μετονομασίας αρχείου '%s' σε '%s': g_rename() failed: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Αποτυχία δημιουργίας αρχείου '%s': %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγραφή: fdopen() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Αδυναμία εγγραφής αρχείου '%s': fwrite() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Αδυναμία εγγραφής αρχείου '%s': fflush() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Αδυναμία εγγραφής αρχείου '%s': fsync() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Αδυναμία κλεισίματος αρχείου '%s': fclose() απέτυχε: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Δεν είναι δυνατή η απομάκρυνση του υπάρχοντος αρχείου '%s': g_unlink() " +"απέτυχε: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Το πρότυπο '%s' δεν είναι έγκυρο, θα πρέπει να περιέχει ένα '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Το πρότυπο '%s' δεν περιέχει XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +# gconf/gconf-internals.c:2416 +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Αποτυχία ανάγνωσης συμβολικού συνδέσμου '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Οι συμβολικοί σύνδεσμοι δεν υποστηρίζονται" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Δεν ήταν δυνατό το άνοιγμα μετατροπέα από '%s' σε '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Δεν είναι δυνατή η raw ανάγνωση σε g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Εναπομείναντα δεδομένα που δεν έχουν μετατραπεί στο read buffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Το κανάλι τερματίζει σε ημιτελή χαρακτήρα" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Δεν είναι δυνατή η raw ανάγνωση σε g_io_channel_read_to_end" + +# gconf/gconf-internals.c:2416 +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Αδυναμία ανοίγματος αρχείου '%s': open() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Αδυναμία χαρτογράφησης αρχείου '%s': mmap() απέτυχε: %s" + +# gconf/gconfd.c:1676 +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Σφάλμα στη γραμμή %d χαρακτήρας %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Μη έγκυρο κωδικοποιημένο κείμενο UTF-8 στο όνομα - μη έγκυρο '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' μη έγκυρο όνομα" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' δεν είναι ένα έγκυρο όνομα: '%c' " + +# +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Σφάλμα στη γραμμή %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Αποτυχία ανάλυσης του '%-.*s', που θα έπρεπε να υπήρχε ένα ψηφίο μέσα στην " +"αναφορά χαρακτήρα (ê για παράδειγμα) - ίσως το ψηφίο να είναι πολύ " +"μεγάλο" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Η αναφορά χαρακτήρα δεν τελειώνει με ερωτηματικό (;). Πιθανόν να " +"χρησιμοποιήσατε το & χωρίς να θέλετε να ξεκινήσετε μια οντότητα - διαφυγή " +"συμπλεκτικού χαρακτήρα ως &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Η αναφορά χαρακτήρα'%-.*s' δεν κωδικοποιεί έναν επιτρεπόμενο χαρακτήρα" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Κενή καταχώρηση '&;'· έγκυρες οντότητες είναι: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Το όνομα οντότητας '%-.*s' δεν είναι γνωστό" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Η οντότητα δεν τελειώνει με ερωτηματικό (;)· πιθανόν να χρησιμοποιήσατε το & " +"χωρίς να θέλετε να ξεκινήσετε οντότητα - διαφυγή συμπλεκτικού χαρακτήρα ως " +"&" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Το έγγραφο πρέπει να ξεκινάει με ένα στοιχείο (π.χ. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Το '%s' δεν είναι έγκυρος χαρακτήρας όταν ακολουθείται από ένα χαρακτήρα '<'." + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Περίεργος χαρακτήρας '%s', αναμενόταν ο χαρακτήρας '>' στο τέλος της " +"ετικέτας του κενού-στοιχείου '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Περίεργος χαρακτήρας '%s', αναμενόταν ένα '=' μετά το όνομα γνωρίσματος '%s' " +"του στοιχείου '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Περίεργος χαρακτήρας '%s', αναμενόταν ένας χαρακτήρας '>' ή '/' στο τέλος " +"της ετικέτας έναρξης του στοιχείου '%s' ή προαιρετικά ένα γνώρισμα· πιθανόν " +"να χρησιμοποιήσατε ένα μη έγκυρο χαρακτήρα σε ένα όνομα γνωρίσματος" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Περίεργος χαρακτήρας '%s', αναμενόταν ένα ανοικτό εισαγωγικό μετά το σημείο " +"ίσον κατά την απόδοση τιμής για το γνώρισμα '%s' του στοιχείου '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Το '%s' δεν είναι ένας έγκυρος χαρακτήρας ακολουθούμενος από το όνομα " +"στοιχείου κλεισίματος '%s'· ο επιτρεπόμενος χαρακτήρας είναι '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Το στοιχείο '%s' έκλεισε, κανένα στοιχείο δεν είναι ανοικτό" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Το στοιχείο '%s' έκλεισε, αλλά το τρέχον ανοικτό στοιχείο είναι '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Το έγγραφο ήταν κενό ή περιέχει μόνο λευκό κενό" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα αμέσως μετά από μια ανοικτή γωνιακή " +"παρένθεση '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα με στοιχεία ακόμα ανοικτά - '%s' ήταν το " +"τελευταίο στοιχείο που ανοίχθηκε" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα, αναμενόταν μια παρένθεση κλεισίματος στο " +"τέλος του tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε όνομα στοιχείου" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε όνομα γνωρίσματος" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε tag ανοίγματος στοιχείου." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα λόγω του ότι μετά του σημείου ίσον " +"ακολουθεί ένα όνομα γνωρίσματος· δεν υπάρχει τιμή γνωρίσματος" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε τιμή γνωρίσματος" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα μέσα σε tag κλεισίματος για στοιχείο '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα μέσα σε σχόλιο ή εντολή σε διεργασία" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "κατεστραμμένο αντικείμενο" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "εσωτερικό σφάλμα ή κατεστραμμένο αντικείμενο" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ανεπάρκεια μνήμης" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "εξαντλήθηκε το όριο της ανίχνευσης προς τα πίσω" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"το υπόδειγμα περιέχει αντικείμενα που δεν υποστηρίζονται για μερικό ταίριασμα" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "εσωτερικό σφάλμα" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"οι αναφορές προς τα πίσω, σαν συνθήκες, δεν υποστηρίζονται για μερικό " +"ταίριασμα" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "εξαντλήθηκε το όριο αναδρομής" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "εξαντλήθηκε το όριο του χώρου εργασίας για κενές συμβολοσειρές" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "μη έγκυρος συνδυασμός για σημαίες αλλαγής γραμμής" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "άγνωστο σφάλμα" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ στο τέλος του υποδείγματος" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c στο τέλος του υποδείγματος" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ημιτελής αναφορά χαρακτήρα μετά \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"δεν επιτρέπονται οι ακολουθίες διαφυγής (\\l, \\L, \\u, \\U) για την " +"εναλλαγή μεταξύ πεζών και κεφαλαίων" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "οι αριθμοί είναι εκτός λειτουργίας στον προσδιοριστή {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "πολύ μεγάλος αριθμός στον προσδιοριστή {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "λείπει η τελική ] για την κλάση χαρακτήρων" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "μη έγκυρη escape sequence σε character class" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "εύρος σε λανθασμένη σειρά στην κλάση χαρακτήρων" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "τίποτα για επανάληψη" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "ημιτελής αναφορά χαρακτήρα μετά (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "μη αναγνωρίσιμος χαρακτήρας μετά το (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "ημιτελής αναφορά χαρακτήρα μετά (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Οι κλάσεις με ονόματα κατά POSIX υποστηρίζονται μόνο εντός κλάσεων" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "λείπει η τελική )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") χωρίς άνοιγμα (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "τα (?R ή (?[+-]digits πρέπει να ακολουθούνται από )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "αναφορά σε ανύπαρκτο υπο-υπόδειγμα" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "λείπει η ) μετά από το σχόλιο" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "πολύ μεγάλη κανονική έκφραση" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "αποτυχία στη λήψη μνήμης" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "το lookbehind assertion δεν έχει σταθερό μήκος" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "λανθασμένη διατύπωση αριθμού ή ονόματος μετά το (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "η ομάδα υποθετικών περιέχει περισσότερους από δύο κλάδους" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "αναμένεται assertion μετά το (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "άγνωστο όνομα κλάσης POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "δεν υποστηρίζονται τα στοιχεία ταξινόμησης POSIX" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "η τιμή του χαρακτήρα στην ακολουθία \\x{...} είναι υπερβολικά μεγάλη" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "μη έγκυρη συνθήκη (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "δεν επιτρέπεται \\C στο lookbehind assertion" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" +"η αναδρομική κλήση μπορεί να οδηγήσει σε επ' άπειρω επανάληψη του βρόγχου" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "λείπει το τελικό τμήμα από το όνομα του υπο-υποδείγματος" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "δύο υπο-υποδείγματα έχουν το ίδιο όνομα" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "κακοδιατυπωμένο \\P ή \\p αλληλουχία" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "άγνωστο όνομα ιδιότητας μετά το \\P ή το \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" +"το όνομα του υπο-υποδείγματος είναι υπερβολικά μεγάλο (επιτρέπονται μέχρι 32 " +"χαρακτήρες)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" +"υπερβολικά μεγάλος αριθμός υπο-υποδειγμάτων (επιτρέπονται μέχρι 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "η οκταδική τιμή είναι μεγαλύτερη από \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "η ομάδα DEFINE περιέχει περισσότερους από έναν κλάδους" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "δεν επιτρέπεται η επανάληψη ομάδας DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "μη συνεκτικές επιλογές NEWLINE" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"το \\g δεν ακολουθείται από όνομα εντός αγκίστρων ή από μη μηδενικό αριθμό " +"προαιρετικά εντός αγκίστρων" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "μη αναμενόμενη επανάληψη" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "overflow κώδικα" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "υπέρβαση μεταγλώττισης χώρου εργασίας" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "δε βρέθηκε το αναφερόμενο υπο-υπόδειγμα που είχε ελεγχθεί προηγουμένως" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Σφάλμα κατά την αντιστοίχιση της κανονικής έκφρασης %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Η βιβλιοθήκη PCRE έχει μεταγλωττιστεί χωρίς υποστήριξη UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"Η βιβλιοθήκη PCRE έχει μεταγλωττιστεί χωρίς υποστήριξη των ιδιοτήτων του UTF8" + +# gconf/gconfd.c:1676 +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Σφάλμα κατά τη μεταγλώττιση της κανονικής έκφρασης %s στον χαρακτήρα %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Σφάλμα κατά τη βελτιστοποίηση της κανονικής έκφρασης %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "αναμένεται δεκαεξαδικό ψηφίο ή '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "αναμένεται δεκαεξαδικό ψηφίο" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "λείπει το '<' από τη συμβολική αναφορά" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "ημιτελής συμβολική αναφορά" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "συμβολική αναφορά μηδενικού μήκους" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "αναμένεται ψηφίο" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "μη επιτρεπτή συμβολική αναφορά" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "τελικό '\\' που δεν αντιστοιχεί πουθενά" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "άγνωστη ακολουθία διαφυγής" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Σφάλμα κατά την ανάλυση του κειμένου αντικατάστασης \"%s\" στον χαρακτήρα %" +"lu: %s" + +# gconf/gconf-internals.c:1577 +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Το παρατιθέμενο αλφαριθμητικό δεν αρχίζει με εισαγωγικό σημείο" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Αταίριαστο ερωτηματικό στη γραμμή εντολών ή άλλο κείμενο που παρατίθεται από " +"κέλυφος" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Το κείμενο τερματίστηκε αμέσως μετά από χαρακτήρα '\\'. (Το κείμενο ήταν '%" +"s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Το κείμενο τερματίστηκε πριν να βρεθεί ταιριαστή παράθεση για %c. (Το " +"κείμενο ήταν '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Το κείμενο ήταν κενό (ή περιέχει μόνο λευκό κενό)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Αποτυχία ανάγνωσης δεδομένων από θυγατρική διεργασία" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Αποτυχία δημιουργίας σωλήνωσης για την επικοινωνία με θυγατρική διεργασία (%" +"s)" + +# gconf/gconftool.c:881 +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Αποτυχία ανάγνωσης από θυγατρική σωλήνωση (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Αποτυχία αλλαγής καταλόγου '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Αποτυχία εκτέλεσης θυγατρικής διεργασίας (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ακατάλληλο όνομα προγράμματος: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Μη έγκυρο όρισμα για %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Μη έγκυρη σειρά στο περιβάλλον: %s" + +# +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Μη έγκυρος κατάλογος εργασίας: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Αποτυχία εκτέλεσης βοηθητικού προγράμματος(%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Απρόσμενο σφάλμα στο g_io_channel_win32_poll() ανάγνωση δεδομένων από μια " +"θυγατρική διεργασία" + +# gconf/gconf-internals.c:2416 +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Αποτυχία ανάγνωσης δεδομένων από θυγατρική διεργασία (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Απρόσμενο σφάλμα στο select() ανάγνωσης δεδομένων από θυγατρική διεργασία (%" +"s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Μη αναμενόμενο σφάλμα στη waitpid() (%s)" + +# gconf/gconf-internals.c:2416 +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Αποτυχία δικράνωσης (%s)" + +# gconf/gconf-internals.c:2416 +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Αποτυχία εκτέλεσης θυγατρικής διεργασίας \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Αποτυχία προώθησης αποτελέσματος ή εισόδου της θυγατρικής διεργασίας (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Αποτυχία δικράνωσης θυγατρικής διεργασίας (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Άγνωστο σφάλμα κατά την εκτέλεση της θυγατρικής διεργασίας \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Αποτυχία ανάγνωσης επαρκών δεδομένων από θυγατρική σωλήνωση pid (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Ο χαρακτήρας είναι έξω από την εμβέλεια για UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Μη έγκυρη σειρά στην είσοδο μετατροπής" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Ο χαρακτήρας είναι έξω από την εμβέλεια για UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Χρήση:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ΕΠΙΛΟΓΗ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Επιλογές βοήθειας:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Εμφάνιση επιλογών βοήθειας" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Εμφάνιση όλων των επιλογών βοήθειας" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Επιλογές εφαρμογής:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Αδυναμία ανάλυσης integer value '%s' για %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' για %s είναι εκτός εύρους" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Αδυναμία ανάλυσης της τιμής του double '%s' για %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Η τιμή του double '%s' για %s είναι εκτός εύρους" + +# gconf/gconftool.c:1181 +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Σφάλμα επιλογής ανάλυσης %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Λείπει όρισμα για %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Άγνωστη επιλογή %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Δεν μπορεί να βρεθεί έγκυρο key file στους καταλόγους αναζήτησης" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Δεν είναι κανονικό αρχείο" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Το αρχείο είναι κενό" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Το key file περιέχει την γραμμή '%s' που δεν είναι key-value pair, group, ή " +"comment" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Μη έγκυρο όνομα ομάδας: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Το key file δεν ξεκινάει με μια ομάδα" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ακατάλληλο όνομα κλειδιού: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Το key file περιέχει μη υποστηριζόμενη κωδικοποίηση '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Το key file δεν έχει ομάδα '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Το key file δεν έχει κλειδί '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Το key file περιέχει ένα κλειδί '%s' με τιμή '%s' που δεν είναι UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Το key file περιέχει key '%s' που η τιμή του δεν μπορεί να ερμηνευθεί." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Το αρχείο-κλειδί περιέχει το κλειδί '%s' που περιέχει μια τιμή που δεν " +"μπορεί να ερμηνευθεί." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Το key file περιέχει key '%s' στην ομάδα '%s' που η τιμή του δεν μπορεί να " +"ερμηνευθεί." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Το key file δεν έχει key '%s' στην ομάδα '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Το key file περιέχει escape character στο τέλος της γραμμής" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "To key file περιέχει χαρακτήρες μη έγκυρα escaped '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως ένας αριθμός." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' είναι εκτός εύρους" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως αριθμός κινητής υποδιαστολής." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Η τιμή που διαβιβάστηκε στο %s είναι υπερβολικά μεγάλη" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Η ροή έχει ήδη κλείσει" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Η λειτουργία ακυρώθηκε" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Μη έγκυρο αντικείμενο, δεν αρχικοποιήθηκε" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Ελλιπής σειρά byte στην είσοδο" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Μη επαρκής χώρος στην περιοχή προορισμού" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Δεν υποστηρίζεται η αρχικοποίηση με δυνατότητα ακύρωσης" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Άγνωστος τύπος" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s τύπος αρχείων" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "τύπος %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Μη αναμενόμενο πρόωρο τέλος ροής" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Ανώνυμο" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Το αρχείο επιφάνειας εργασίας δεν αναφέρει συγκεκριμένο πεδίο Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Αδυναμία εύρεσης του τερματικού που απαιτείται για την εφαρμογή" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Αδυναμία δημιουργίας φακέλου ρυθμίσεων εφαρμογής %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Αδυναμία δημιουργίας φακέλου ρυθμίσεων MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Αδυναμία δημιουργίας αρχείου επιφάνειας εργασίας %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Προσαρμοσμένος ορισμός του %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ο οδηγός δεν υποστηρίζει τη λειτουργία εξαγωγής" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"η μονάδα δίσκου δεν υποστηρίζει την \"εξαγωγή\" ή την \"εξαγωγή_με_λειτουργία" +"\"" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ο οδηγός δεν υποστηρίζει αναζήτηση πολυμέσων" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ο οδηγός δεν υποστηρίζει τη λειτουργία έναρξης" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ο οδηγός δεν υποστηρίζει τη λειτουργία τερματισμού" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Δεν είναι δυνατός ο χειρισμός της έκδοσης %d της κωδικοποίησης GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Λανθασμένος αριθμός token (%d) στην κωδικοποίηση GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" +"Δεν είναι δυνατός ο χειρισμός της έκδοσης %d της κωδικοποίησης GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Λανθασμένος αριθμός token (%d) στην κωδικοποίηση GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Αναμενόταν GEmblem για το GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Δεν υποστηρίζεται η λειτουργία" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Δεν υπάρχει η περιέχουσα προσάρτηση" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Αδύνατη η αντιγραφή επί καταλόγου" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Αδύνατη η αντιγραφή καταλόγου επί καταλόγου" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Το αρχείο προορισμού υπάρχει" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Αδύνατη η αναδρομική αντιγραφή καταλόγου" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Η αρμολόγηση δεν υποστηρίζεται" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Σφάλμα αρμολόγησης αρχείου: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Αδύνατη η αντιγραφή του ειδικού αρχείου" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Μη έγκυρη τιμή συμβολικού συνδέσμου" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Δεν υποστηρίζεται η ύπαρξη απορριμάτων" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Τα ονόματα των αρχείων δεν επιτρέπεται να περιέχουν '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ο τόμος δεν υποστηρίζει την προσάρτηση" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Δεν έχουν οριστεί εφαρμογές για το χειρισμό αυτού του αρχείου" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Ο μετρητής είναι κλειστός" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Εκκρεμεί μία ενέργεια του μετρητή αρχείων" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Ο μετρητής αρχείων έχει ήδη κλείσει" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" +"Δεν είναι δυνατός ο χειρισμός της έκδοσης %d της κωδικοποίησης GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Λανθασμένη μορφή των δεδομένων εισόδου του GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Η ροή δεν υποστηρίζει το query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Δεν υποστηρίζεται η αναζήτηση εντός της ροής" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Δεν επιτρέπεται η κοπή για τη ροή εισόδου" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Δεν υποστηρίζεται η κοπή για τη ροή" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Λανθασμένος αριθμός token (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Δεν υπάρχει τύπος για το όνομα κλάσης %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Ο τύπος %s δεν υποστηρίζει τη διεπαφή GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Ο τύπος %s δεν είναι καταχωρημένος" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Λανθασμένη μορφή του αριθμού έκδοσης: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Ο τύπος %s δεν υποστηρίζει from_tokens() στη διεπαφή GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" +"Δεν είναι δυνατός ο χειρισμός της παρεχόμενης έκδοσης της κωδικοποίησης του " +"εικονιδίου" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Η ροή εισόδου δεν υποστηρίζει την ανάγνωση" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Εκκρεμεί μία ενέργεια για τη ροή" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Μη επαρκής χώρος για την διεύθυνση υποδοχέα" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Μη υποστηριζόμενη διεύθυνση υποδοχέα" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Δε βρέθηκε ο τύπος monitor του προεπιλεγμένου τοπικού καταλόγου" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Μη έγκυρο όνομα αρχείου: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Σφάλμα λήψης πληροφοριών συστήματος αρχείων: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Αδύνατη η μετονομασία του καταλόγου root" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Σφάλμα μετονομασίας αρχείου: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Αδύνατη η μετονομασία του αρχείου, το όνομα αρχείου υπάρχει ήδη" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Μη έγκυρο όνομα αρχείου" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Σφάλμα ανοίγματος αρχείου: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Αδυναμία ανοίγματος καταλόγου" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Σφάλμα αφαίρεσης αρχείου: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Σφάλμα μεταφοράς αρχείου στα απορρίμματα: %s" + +# gconf/gconf-internals.c:2416 +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Αποτυχία δημιουργίας καταλόγου απορριμμάτων %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Αδυναμία εύρεσης καταλόγου ανώτατου επιπέδου για τα απορρίμματα" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Αδύνατη η εύρεση ή δημιουργία του καταλόγου απορριμμάτων" + +# gconf/gconf-internals.c:2416 +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Αποτυχία δημιουργίας αρχείου πληροφοριών απορριμμάτων: %s" + +# gconf/gconf-internals.c:2416 +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Αδύνατη η μεταφορά του αρχείου στα απορρίμματα: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Σφάλμα δημιουργίας καταλόγου: %s" + +# gconf/gconf-internals.c:2416 +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Το σύστημα αρχείων δεν υποστηρίζει συμβολικούς συνδέσμους" + +# gconf/gconftool.c:1181 +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Σφάλμα δημιουργίας συμβολικού συνδέσμου: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Σφάλμα κατά τη μετακίνηση του αρχείου: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Αδυναμία μετακίνησης ενός καταλόγου πάνω σε άλλον κατάλογο" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Απέτυχε η δημιουργία αντιγράφου ασφαλείας" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Σφάλμα αφαίρεσης του αρχείου προορισμού: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Δεν υποστηρίζεται η μετακίνηση μεταξύ προσαρτήσεων" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Η τιμή του γνωρίσματος δεν επιτρέπεται να είναι κενή" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Μη έγκυρος τύπος γνωρίσματος (αναμενόταν αλφαριθμητικό)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Μη έγκυρο εκτεταμένο όνομα γνωρίσματος" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Σφάλμα καθορισμού εκτεταμένου ονόματος γνωρίσματος '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Σφάλμα δήλωσης αρχείου '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (μη έγκυρη κωδικοποίηση)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Σφάλμα δήλωσης περιγραφέα αρχείου: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Μη έγκυρος τύπος γνωρίσματος (αναμένεται uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Μη έγκυρος τύπος γνωρίσματος (αναμένεται uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Μη έγκυρος τύπος γνωρίσματος (αναμένεται byte string)" + +# gconf/gconftool.c:1181 +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Αδυναμία ορισμού δικαιωμάτων των συμβολικών συνδέσμων" + +# gconf/gconftool.c:1181 +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Σφάλμα κατά τη ρύθμιση των δικαιωμάτων: %s" + +# gconf/gconftool.c:1181 +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Σφάλμα κατά τη ρύθμιση του ιδιοκτήτη: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "ο συμβολικός σύνδεσμος δεν επιτρέπεται να είναι κενός" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Σφάλμα κατά τον ορισμό του συμβολικού συνδέσμου: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Σφάλμα κατά τον ορισμό του συμβολικού συνδέσμου: το αρχείο δεν είναι " +"συμβολικός σύνδεσμος" + +# gconf/gconftool.c:1181 +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Σφάλμα κατά τη ρύθμιση τροποποίησης ή χρόνου πρόσβασης: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Το περιεχόμενο SELinux δεν επιτρέπεται να είναι κενό" + +# gconf/gconftool.c:1181 +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Σφάλμα κατά τη ρύθμιση του περιεχομένου SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "Το SELinux δεν έχει ενεργοποιηθεί στο σύστημά σας" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Δεν υποστηρίζεται ο ορισμός του γνωρίσματος %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Σφάλμα ανάγνωσης από το αρχείο: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Σφάλμα αναζήτησης στο αρχείο: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Σφάλμα κατά το κλείσιμο του αρχείου: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Δε βρέθηκε ο τύπος monitor του προεπιλεγμένου τοπικού αρχείου" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Σφάλμα κατά την εγγραφή στο αρχείο: %s" + +# gconf/gconftool.c:1181 +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Σφάλμα αφαίρεσης παλαιού αντιγράφου συνδέσμου: %s" + +# +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Σφάλμα δημιουργίας αντιγράφου ασφαλείας: %s" + +# +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Σφάλμα μετονομασίας προσωρινού αρχείου: %s" + +# +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Σφάλμα κοπής (truncating) αρχείου: %s" + +# +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Σφάλμα ανοίγματος αρχείου '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Το αρχείο προορισμού είναι κατάλογος" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Το αρχείο προορισμού δεν είναι κανονικό αρχείο" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Το αρχείο τροποποιήθηκε εξωτερικά" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Σφάλμα αφαίρεσης παλαιού αρχείου: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Μη έγκυρο GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ακατάλληλη αίτηση seek" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Δεν είναι δυνατή η κοπή του GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Δεν είναι δυνατή η αλλαγή διαστάσεων της ροής εξόδου μνήμης" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Απέτυχε η αλλαγή διαστάσεων της ροής εξόδου μνήμης" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Το ποσό μνήμης που απαιτείται για την επεξεργασία της εγγραφής είναι " +"μεγαλύτερο από το διαθέσιμο διάστημα διευθύνσεων" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Απαίτηση για αναζήτηση πριν την έναρξη της ροής" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Απαίτηση για αναζήτηση πέραν του τέλους της ροής" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "η προσάρτηση δεν υποστηρίζει την \"αποσύνδεση\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "η προσάρτηση δεν υποστηρίζει την \"εξαγωγή\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"η προσάρτηση δεν υποστηρίζει την \"αποσύνδεση\" ή την " +"\"αποσύνδεση_με_λειτουργία\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"η προσάρτηση δεν υποστηρίζει την \"εξαγωγή\" ή την \"εξαγωγή_με_λειτουργία\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "η προσάρτηση δεν υποστηρίζει την \"επαναπροσάρτηση\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "η προσάρτηση δεν υποστηρίζει το μάντεμα του τύπου περιεχομένων" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"η προσάρτηση δεν υποστηρίζει το μάντεμα του τύπου σύγχρονων περιεχομένων" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" +"Το όνομα κεντρικού υπολογιστή '%s' περιέχει το '[' αλλά όχι το αντίστοιχο ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Η ροή εξόδου δεν υποστηρίζει την εγγραφή" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Η ροή πηγής έχει ήδη κλείσει" + +# +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Σφάλμα στην επίλυση του '%s': %s" + +# +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Σφάλμα στην ανάστροφη επίλυση του '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Δεν υπάρχει αρχείο υπηρεσιών για το '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Προσωρινή αδυναμία στην επίλυση του '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Σφάλμα στην επίλυση του '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Μη έγκυρος υποδοχέας, δεν αρχικοποιήθηκε" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Μη έγκυρος υποδοχέα, η αρχικοποίηση απέτυχε λόγο του: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Ο υποδοχέας είναι ήδη κλειστός" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "Δημιουργία υποδοχέα GSocket από fd: %s" + +# gconf/gconf-internals.c:2416 +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Αδυναμία δημιουργίας υποδοχέα: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Προσδιορίστηκε άγνωστο πρωτόκολλο" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "αδυναμία λήψης της τοπικής διεύθυνσης: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "αδυναμία λήψης της απομακρυσμένης διεύθυνσης: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "αδυναμία ακρόασης: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Σφάλμα κατά την σύνδεση στην διεύθυνση: %s" + +# gconf/gconftool.c:1181 +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Σφάλμα αποδοχής σύνδεσης: %s" + +# +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Σφάλμα σύνδεσης:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Σύνδεση σε εξέλιξη" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Σφάλμα σύνδεσης: %s" + +# gconf/gconf-internals.c:2416 +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Αδύνατη λήψης εκκρεμούς σφάλματος: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Σφάλμα λήψης δεδομένων: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Σφάλμα αποστολής δεδομένων: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Σφάλμα τερματισμού υποδοχέα: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Αναμονή για την συνθήκη υποδοχέα: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Σφάλμα αποστολής μηνύματος: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "Το GSocketControlMessage δεν υποστηρίζετε στα windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Σφάλμα λήψης μηνύματος: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Άγνωστο σφάλμα κατά την σύνδεση" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Η ακρόαση έχει ήδη κλείσει" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Ο υποδοχέας που προστέθηκε είναι κλειστός" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" +"Δεν είναι δυνατός ο χειρισμός της έκδοσης %d της κωδικοποίησης GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Αναμονή για 1 μήνυμα έλεγχου, αλλά ελήφθησαν %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Μη αναμενόμενος τύπος βοηθητικών δεδομένων" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Αναμονή για ένα fd, αλλά ελήφθησαν %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Λήψη μη αποδεκτού fd" + +# +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Σφάλμα ανάγνωσης από unix: %s" + +# +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Σφάλμα κλεισίματος unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Root συστήματος αρχείων" + +# gconf/gconftool.c:1181 +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Σφάλμα εγγραφής σε unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Δεν υποστηρίζονται αφηρημένες περιοχές του unix με διευθύνσεις για υποδοχέα" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ο τόμος δεν υποστηρίζει την εξαγωγή" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ο τόμος δεν υποστηρίζει την εξαγωγή ή eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Αδυναμία εύρεσης εφαρμογής" + +# gconf/gconftool.c:1181 +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Σφάλμα εκκίνησης εφαρμογής: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs δεν υποστηρίζονται" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "οι αλλαγές στις συσχετίσεις δεν υποστηρίζονται στα win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Η δημιουργία συσχέτισης δεν υποστηρίζεται σε win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Ανεπάρκεια μνήμης" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Εσωτερικό σφάλμα: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Χρειάζεται εισαγωγή περισσότερων δεδομένων" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Μη αποδεκτά συμπιεσμένα δεδομένα" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Μη έγκυρη σειρά στην είσοδο μετατροπής" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Υπέρβαση του μέγιστου ορίου δεδομένων πίνακα" + +#~ msgid "do not hide entries" +#~ msgstr "να μην αποκρύπτονται οι εγγραφές" + +#~ msgid "use a long listing format" +#~ msgstr "χρήση αναπτυγμένης μορφής λιστών" + +#~ msgid "[FILE...]" +#~ msgstr "[ΑΡΧΕΙΟ...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Ο χαρακτήρας '%s' δεν επιτρέπεται στην αρχή ονόματος οντότητας, ο " +#~ "χαρακτήρας & ξεκινά οντότητα. Αν δεν επιθυμείτε να ξεκινήσετε οντότητα, " +#~ "χρησιμοποιήστε το συνδυασμό διαφυγής & στη θέση του &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Ο χαρακτήρας '%s' δεν επιτρέπεται να περιέχεται σε όνομα οντότητας" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Κενή αναφορά χαρακτήρα· πρέπει να περιέχει ένα ψηφίο όπως dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Ημιτελής αναφορά οντότητας" + +#~ msgid "Unfinished character reference" +#~ msgstr "Ημιτελής αναφορά χαρακτήρα" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Μη έγκυρα κωδικοποιημένο κείμενο UTF-8 - overlong sequence" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Μη έγκυρα κωδικοποιημένο κείμενο UTF-8 - not a start char" + +#~ msgid "file" +#~ msgstr "αρχείο" + +#~ msgid "The file containing the icon" +#~ msgstr "Το αρχείο που περιέχει το εικονίδιο" + +#~ msgid "name" +#~ msgstr "όνομα" + +#~ msgid "The name of the icon" +#~ msgstr "Το όνομα του εικονιδίου" + +#~ msgid "names" +#~ msgstr "ονόματα" + +#~ msgid "An array containing the icon names" +#~ msgstr "Πίνακας που περιέχει τα ονόματα των εικονιδίων" + +#~ msgid "use default fallbacks" +#~ msgstr "χρήση των προεπιλεγμένων εφεδρικών" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Αν θα χρησιμοποιούνται τα προεπιλεγμένα εφεδρικά που προκύπτουν από τη " +#~ "συντόμευση του ονόματος στους χαρακτήρες '-'. Αγνοεί όλα τα ονόματα μετά " +#~ "το πρώτο, αν έχουν δοθεί πολλαπλά ονόματα." + +#~ msgid "File descriptor" +#~ msgstr "Περιγραφέας αρχείου" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Ο περιγραφέας αρχείου από τον οποίο θα γίνει η ανάγνωση" + +#~ msgid "Close file descriptor" +#~ msgstr "Κλείσιμο περιγραφέα αρχείου" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Αν θα κλείσει ο περιγραφέας αρχείου όταν κλείσει η ροή" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Ο περιγραφέας αρχείου στον οποίο θα γίνει η εγγραφή" diff --git a/po/en@shaw.gmo b/po/en@shaw.gmo new file mode 100644 index 0000000000000000000000000000000000000000..206393624528c17a8aca7af0fff82da9c2ef45f6 GIT binary patch literal 63930 zcmds=2b^6;eeVzDL1G{dEfiBO1|b==Lbd@Lxqypogo}g=1}r01yI0bpZQf#820}u0 zAOs6zz}Uu^*bWdt4Fir%3^)ZyLMox8kOFz6kc5;6X)o{l{m+@X_w2oQwQ@`H_M_47 z%$%A3{M-DeoOAE}<3~L3s*1nM?^jh%05?9gsvdIxs=D^EmR8jlT2=K(@QdJs!9S|; z+cka{d^Q2IXwJ{`OcJQ@5Y z@W;RhKeehJ1wILUCU`Ws0^9_)z{|nIzz>7`tA3gP?B_4R$AAxbT2&nd9tJ)SJR5|S z>T>Ye;77n`f!_q}@6cuR0X`kHzn6nYf^P7V7xDxy(NYm<}%agoEfrwhYtj5=Xw!a>f&o6>4@UOv>z=uLiKFg@%>hcG!PWM|i9uLajOY8i_p!MGlYS)|U@-Kk)|E>D|15lRy9R}L} z37~Y&0bAg9P(S`@P(E(1^Pd52_f-(nRsRB_vg)ZA&3<1DJ`o%PZT}V!)mJxw%JpT? z_J0Lh|Dia$^_~W5?-M~(R_z2~wfYd~xcNG0y+=Mf;ShKt`O`s$PW5Kc@$mDY{r@J2 z%U0h7rT1uzul%Qi`ojn)|33@b{x?AV@>4-Xsir~sy%CiD7eM*>E0BNHqv*{3&f-7$dJCu= z9|Ps@59|CPDDB6{KM%D122gsJfe!<(1(o|F;Gy6bLFs(GzW+lECi(j@P<~FR^TVKi zdpY=c@I#<{-wE3P_d$kuwe0wWXVl;1;7NaarlA4UEc z@Uh^Tb-oR1m&-u?;CfJczXht_zXz4`2{^%F;ECW9!Iy)$WOXU1oF4(t1HTTw5L|`v zjW;_$NL0TFo(cXtDBX20NOb4HCzF2%X=avyS1(#z4Hn3#e@dcv5~v+s4L%NhH>jTX zfR6yb0X`M{E~q>YKNX(9SAcuKkAat&Uz_;&dX3)$^{*dBDf->BK;_*A>gVqU84}g! z>iqXXLQ!@2>B*kwfGzS{K21NGmxf%bbn*aCkE#C57~gZkStl&^oE2g>($Q2+dK zP`=*>+RyEv{_-u*c8@(P`PJ#5{yq&p6TAUbPrm`Gx9@__03U>L^^+sP_232&(^nq= z<@Z~l?HQpOg4}8i?yw z>p|`RE>OGe23LcB4L%Hf!ntWYJp=qv@*6?rp8#9n+d=#JI4J!)!5;zt1T=2^9jKo_ zj9_sDcnWCw1Ze%YfsX<|1j@%}K=t{xI{&Yr^&WkGqI(pm9ZmxEmr+o^`zcWU-vF)v ze;w36{u#9X!(Wo-XmU``a2fXE*n7k-T^AtwV-}`D|jgQr{K}x_rS-3%U+h^>4~6z z`x;RBJ_J4-{B2Nu{yAv<`@KBz^LX$vzH%6z!FPgR1%CiKetv6nTBkf}B*ouz!7Y@38AKJ;b4Jtn zeFr#A{+o4v1H?`z{{irg;CH|q!3i3}O7)1X@C?p?xIpz~@HB84OuYjf2e*U&4qgmy z8>21w4R8v4;j5?vei}R(Tt;O`RNKHG2Y(A>NL1^o^cL`E!AbC$5W(ct`@oIhKZ4TP zz|B*^&wx9@`_su8;A_AafnNZ3gO5Z=`MeWE)anqJyAGTJ>9Ts*OyXlFX#P*Zb>LaE zsh{_N%JaZE#u4_t1k^q^%vaSu@ST?=T)Ts@Mg9liZ-BpiDPsk^66Wp%w_Qe@rv1uS z6PLhKUX%2;{s0=QdD&4*jXr--+PqeH_Ge)nne4 z=)4^~nf&db{QM{Q6X1zIo#@>Gs+aGB%D4XQsov|scai@bI19eyXV5YDB@ouDv)_^A z|9$WT@`qfJ?EOOUh2*~mj)70vmE?LG_!9Ep1nuv+IK>OVp8-D%{wBBu+<9f%$NmXu z`;%c}3j8Rz9DKr6?1{irL0qtUcbz{JCsOWV(D?LK(0(5Ep5%Aq;Cc6}s?URylt1R` zB-fikT($aFQ2utjFWK?S;AZlVy{4+@qIxyB6@2)$iLafY_WE=19PpUyQvR*rYVv;! zO83zBr*Zky;4{d758MDg;rbNkCcqK$*Mr`Fzz6UZa1}TWz5{$2Slz&w1zrw19zF!3 zqUt*!Ca7NX!K!*a_|TuNsyXl-H9qi0Vm|qu;CApo!RLV6Z%XUa8$kWy8{qT6$K9O# z>s;_f> zCitA6Cx(EJ{wQl4@DD)iUHdWCfZ!1yPjT;WLG`V2vG1NSGrt_M$`{Ij5P{9jQ28TkZb6#P1fOH>!%lH%|~KFM02 z{07kS-QWwrb)QQ1cq>TgtG)yt2cGund?<7`K|-yr}epH&tCw~Bma+}dV1mKQ+^*P z{|~-1@wWv$iu?z`Gr+HaF9n~1^4Ecvfg|8Af!<$%v9#+Pcp~_F;0ExKzmmr7D5$-E z4b<-s|JCHj*Mo>mz-R6SegV`T7k-ho8~82oXmIjNNq-*%UrGK+zlN`auLJd~Z-Cpu zlYc$+`*Cm$`Tqnbz%{>-?D!#2{XFc;%w^y;p!FW{n`ykA1)f3vb>O++uYtCI@^3LG zgKr1l0Un95E(1RYz8gILcaq=#E~wnE_}ygp-QcC<{|8(t@r*IJe&OY!H0vV zeWR*=5_~E6M(`WpE^yNyqL2KZv~NB-}` z&l|v3lK(I`2OjdBG!MTHd=vRQ!JXi`zfAhM6MQN8ANs4r&oFo@`Oksc=|O*;#^cH0 zIQd&Z{rT{}A;y6p1y_L=emC*^R&bR3Ux4R>XZ$U7!5hGrfWHJ@1s?WyY2Mijo=pBx zf1mv10#Lrc0BXk*zL(^=3Os`R{{gQATmO*e-%o%aCI26wa((0;{Vx4M((Bhi z?e>a)VUGglKl?bLF8Bi1k0)J9x`{Mjmupx5Xc}v$r%+5>Tfjd?&tMlIX z?=}*{Al4V=SCalOX)|dDX`FOc-RA3D`}c6tA(XXAr<2|jrHlg*6PG{N%14oYf~5Z5 z3?5IKAze;hUl=1@LVh{u-{%v=|DWOiM|1B^@ZBVRV;d>|U0+{p1&^hkf4@rlB~D(vNU`G3iv&kCXRrh;$O^ zY|1_e;-2yMM)IHF>h+`-lAc2P5z_NWBi!@vf&`8Ke~5cursNdTX`~6#Q|tO%#$IBQ z{7XqsApIoiLXv-9Bi%tdf%Fy9lk4(d;QADlB_e9Oo`4tS<{t{-3-fA=RD@BWOmm$ZeH|29(Zhsb=C^a8H^dnf7pq{B#)q<Ys_#s z7bBz>N;Nk5$Q}X`1`p8<^R8| zuiVQ%m}~d8hty@)fDa`9aqw{PSHNGd?-AasM^W}L@Z!4chsnQ+^fB_sfqOv0a{N7m z|9`f={txhY(sM}9qTWkLCz95X{5u!iKpL;}@1pD?(kn?1tIKwBeHhoj4?c}F%k`gv z{!J%{^VBoAeqPm2PzSx!ba;R>%t;P!}dpg%ENXzT8+~nI_98KB( zstbM+{7uq1lzkO^9qE0fkC1+pvfl>t-)iy?BJA`iIqba+9>tWIaX^eC~(s7i(h4eDg zGs*jRHEAc;8^C|IfWIT^dvD|VuSmy|zC+qgnkD@XX)Ser8r)8LFDd^$zi#_23f7T+ ztG@9H%3s3um+JgafDfSTk)#)My^FMk>qmn>4*K^j(j((4?Xl0S%g?RLP6yv#Ukh`j z&2^neaeW%sj{(mntsuo;YsJ{)CBx%mqpkMj$kgcAoRqhl^4ioBQ`H9Q>N}y=1fp^wGc4T?0TJijIT2nKv70JI3a=P0i1>rl#AIYI;R=Qfu?n)b@$tne9}bX`O%0 zy5JT@XWGM~J6r8b$7bhdtCKd*&S|IC{N&iBtFKGNIr^NML}bL9-8nngo~TY59i^~tL-B}u8m&&6o*o|?8J-)X`ub^Mc1?BCEcM1x z;RuYxUEQWZ9cMZEsOqG-xtX!e^K&>@|k|w7nht59# z%rmQ#hex*0Plw;OO0QdnapTeIl;O$cbFGo7>7A|7v6=SB+|2VZOL}m8GL7U zx{YMx(MxWjgzeV+EY!|gch*|EncOnAb$%wv&A=Gt&a&Axq&`iCyEJ%kEl1n4+vlcg zi3{z~DMsMT@Q#)q(8A7JH;qkgVmMAtw#PSFxM_TBvb_n9z=vvvme6Q!YEv6CBu#D^ zn;dO*ab6eG$>?}HhKi;hAH!u(@~qzB_!&dM5`CI&av8pfi2^^*4LH!-d!P==)3yllTqn1nB<2x64WvLM1!yvpeoGr4AVco1b zGsQ@0IP*w*e0&%!;saxI`0UtaeFmaL9Al^s3ozCQahn-PX*AAFaRWCaOgI{I<>}!W zV&v%5ywuZZjKOLMN`5HGRBLQx)#r!pU72m!B)0S3tNQ|>KVF(TH4N!kEU6h z=_~ZOY2O3F_f@an3`<2He;=kZPlsWF>iEi)UX~gdCSh$+DqFb zjFtBIXm#q;$b76X2wCWVezJWjfg4jW-iEihUNIcCFPQ;%S2EzE5^I-FohWES$X#72!J)?y0D?3Pv8P+nln z4R2kwl-^WkEC^b(2&?AKBWx_z`Kw&(B$H@qgC)ZfXT;#KK4CGrC<{Bb>AD>mI<`Bo zp%VwP3!5y6Vu1Fo__KC)EqGGe_Q=;czSB~ zxN2>p5%Xq_(RFOxJ~_2xk_vUbR?EZyGB>L(0G zSV*hquA8dKn?}?=#c2iI=Y~u3?&7-R$*pTzRq8hLViD79T}b#2PMx(Qd`|D|ce^YN zx^9lny989mdUENyx3xVNWECTA0T^Rjrn+j34>K!olR(!(u?>bGKe0FLp=ObdGE426fPwol7wz>MRta`yOlm zk(se+Vq{lW93{-gxL=_CdYRtGMbaG2YG`^4f85HFbL;##qnl~c<*!S@WdwD$A$iP~ z_?DVZ49}%d)3;?8Z>hQ?cVg_afnD`9$U}anJw4788H=_#Odd<(4rAl<-7RNW#3Bq+ z`~pSn=-lZHch~V*HEDG*QWoZ%^~Atz6YaKcnxAygt~i3t7&fFxW#k3LaM>HXc&_)! zX?I#zvXdjjlV_&JTeZ)xY;9#DwQRJjj;rb|qiH@*HxH>!iyjpTOSn7Ysu@~aE0)b3 z(OoarHC>LhCDsW|?z_l3UD2=3SsbtD_Vn0v+L*b3Mui?QAyq7c@B^Y-y_{aiO`9!% zXGzUU?rWA-bAfP~+_v^O<1ua5h9`PSO>^#nGqe4`a`j18Fq;qLx)g@lwlAa*Wlf$J zaAG_zk%vw4mTnbpaXb&w_{4C1LX^}!L4HuxSjQF9#5%rqOJho%hCfS1} zwOF_5h@oEHt#pk$vaL1C87UsJZJ4u}%`6_-hsC*S*&{@hNvGDGZTyO-KlP}ipM6}~ zyj;r4a=d*+YsfwPw&Cft3#h5MX`W(Bz#Q3SRwwzE^G@0)H;lQ&Y74z0NVX@Z=C^L^ zrOYvYjFJU@5^d@uf*2=`q=9vctru7JN(tCq^jTvL?GR}YFC@A;Kj@r|pj??M5jX1Mq%lQ24wn0RDtIzJ7 z99eqpXuqJkF)l(6+lwxjvAEsYdu(HCh4L7}X;Xo}r<3FAv;{RGlMevXUM$t1I5vGL zr{>tJl~X;>Qc^0-~EU8I5j&L2GnLT*~FR6@(Y*8{?JpqSxp$a6;JJ zkM^n7*srduA8ws~F3ZF7cyJX@8$5!h2aW<5Fdp+Ao6eNk7RUUKazc!u5Ij{=q|&AY z-FOJrTH&#o0y!V$UH%aRYcILtJm;iGAGHLER($TW`&3MfaikTelE~HB)}>2h>qAX9f-0PAI7cAVX};{Co$Bz z?5KKMjO7Qusbx`QczADhZ587gp_6?hm!?(YRGg@B_~S}FMHp7DIAnWRiYke1sjk@}93o(ZhvFYKl8J61~X0J>K zad8OThuHjNC(`C;@?n5Z-SQkDmNOlr462c}eW3eTt;@uHYBL}4I4B)Frkd56?JaZh zWR!EC^tgy98cQCC#gbw3{1zUIRA;i);fyrS)fUWHXAO_D*yV9rib?gl#+{6_ozLW| zP8BA}%}~L==ccx|c_gr6+2|2+-t%~H>1`H1$m_Js4_H#KF$UA)rsf(W+#}W?K3uEL z^0^g*w*(2dWrT*ad^EVZJ-5RZXgt$d@PNHKdn!FH_T`H7P$aYxXRCdm>f560sLjni z+hKLhDy+rujK{As6A$hU9t)dqomD=!G7; z&ii@!<%H$=c}C+YQqnlSoDaW4jsp=pvFlA5m&nF@7v{0z8_J}7dazV-C~Wz&22f3d zUTO>Yj6jyoLwP{VGqkQ}Qpc4|($1-QUxUCGC((4WLT9!@_ub9HU+?c8Ms$h9UFGrAgU60MNM~WNKJ9Rr>-#Te zV+&AiIOUwROvgOE;vAF_nhw3ti9^o?D>KWno+QxwoR2co z@2Sn%LbEeFH~E02IycoAye+IN^r7ATq-CLG=XK8X**q|5%vRk+QtK>07v6G3v>;NR zM+Cz6>WL(qy zr8RmPOXXoJ9np85GIKrOQHk(~m}yntHKkyf?j~5KuG~`|W?{%~=1GdDo^~@Is}ZM& z!=2F%Z_SSQ`ckyDAXMNEaAqIdy6I4B24%iNqPsaBU*k1b8K>Cd_LZO zSpHND3YF>Mxow>_2l6cB+X~fr`A`id`36jiUV>JX#IXB zV?Lci)g!-AsYLp&&=BVZM1!*2?wnD0n6@dcKRMrtc*BcG@%C8ke75*VeUbK>Vo>#3 z7bz-_R@iUhusy#Ff_SBo$P$q!R;NAp;=zog7-cO|!&%Z$(|K&sp%gFnu`nB+AD?R_ zGnZ{C%UCwoc)KgFYSA{~X^T~N%rKAQw1w&PR^~#wII8b;jS~bep6Augv22KO|W z;&h1@>pIaa7ID!{S6vU(Ina&=x@{jwE>KuvOF8Nr`LJig|mPsg(TXzUmso0}dRg-9G9cU8%&O?ry=oEA!*@2`xvTD)71tGc<3^*ifK7FfJ@ z<8nzMsS&Sdw30CC35*(ONS$6)YgT1w5{7+SqtNI)!OvA$c+E|*Y>F_LUL5m;FyF2{ zJ7yGIt+{Yfvp$gWVNaX`VEHMA_Y4ynOT?j=e$qM!g0bKNJK<)*KH~g%s$ab%HY@Ji zW6(4n3YJaFES|)pjo7x(fU}cOYu`f{cY?$2e#YCwldGh^gz8(yr&!jdt?yFXi%XCtA!2&QaCIQ_^%% zM|Mmw&Rb8L+pJaH^Rhp5VOeb)>DQJxmjY^fyAO-?1ZJg zBh~=%i3Ys5U3KDINo~3eRfnu4x)8BsiI`zyPR`7 zI8=ytIoq?en3B$znccpEH~5YGKKI3*>obh!0dS=NOa}hy0lefW|(a6h&a22VgMPbG*VudepU*hcIp?szJ4VLb{F6J~baPtWQfqS-dC| zd$?(qdsVG6L&)Yam!Yj!zm{osn3pwqb9<(~A5TP`DLC_EdhMw-H8O`^)C zce)AX8;?Hbn5upJBgZY-Z&m5l-BR|^LeK( z#Sxa%Cy~bX`u6VGqUU6XInB9CI2m>sRCXR7h2raPQ-1 zoMO|iaXLIvspmbaPH^U3Ce&hl8E!S+u&?LDI`mhpOZjvj3x8C~?zigDPi~zfzH|7B ziQ!AfCgvwvJgY1M^FC1hdRgzWjk}-hdSy1?$^68^39|1zr!XwH(i6mPYcQi_PL5o? za`kG$fD=nPjKu za2-08ShA*d)aoNw53N3W=&0wmjy!VBvyUBG{p{7NsW@~F@xozU*L&I8lg=4BYyHrv zC$(O=_T^dZkD*2EFmvpBUI*v(^ehg7W~|=U`5e zQh(h1?vUtwE*&Z#BYj*RZ>>L|&Sf6gH*l?>4yI6*p0MAHg*MXt_js{zn1xQfyDvW0 z&cz2w>f!w)wHECikynuNz_7yAeCXYxO#kP}s9ih%wAZ=6TRSJy6n~1OMT`QPG=#9K z8QWh^l728R+KX{RHgln^EwjO{*5@U92TAqY*5c5F)MY-#1{mXBBE}kPh2HGm3u|Y- ztYlelgv)nS$gL#R9<3!K-RMO9g&3CFq+2Gd-<0LD*V4W(Z#E4+mFiY%4F` z$if@2GM~YYd|Bz;Bpaxy>(}JwR#i=zPn(yT3Sh@-W)G?7W@BvRUKi0$I(~tYjHo>+ z%efZTjJwjA8dulZ`QVYCBXWZSeO%AAuqdd1H`M5!s_wA2!GkCFvO9gt0d-|KyWxJW zuaJQK?<3uKK*d>8ZECsTR5eS_o?_rxkWF{9^mG=9XE(KivfWOK3Yt-wVpd(Wc15iN zcX&_J(?9eLjhbC7G*#3#kgx0}sw}jluQ&{DPp|KAr99caC8$?9=f9Vvifo#Djd5Wm zMGO;wx90~oT=!MZB23U^Nn`Q9nn}Gv^=k@w(SO3pbg*IuAM@1}8ZK$;TdWz8Uv+%S zTz1HqQB?cx=Cc&m^v$okph}N|?+)$yTQT~P%`!zq2-c~k6AlcSeI@@{T4Ytosm2c1 zjip9+;FIn?QYgdGcpK>hr0`8Sh$dE12W8UGDl%!IUTH7t^6G=*r?+*E4ms7)AP*HzkyT$M20R8#(SYsvX?Ya_QYGyS9os z=b%)lmKd#U}>c`usa!ZFHqLv`)l$=2{NIO_IpR^Pi}7QGXWJj z8icbVRicF555@B5E)wqu2O)dX;T^Dcq%~wi4aS;0GWw;>tYOU<65!P&^%k2LFY^3R zB#~(yOvZC<9e-E9uh^mdJ)}&eXi*~FOy*%>dFVb=B$F{|XYG00J7ECtW)3q$=B;#l zw}pFd+OljFBcNGjFG)Ub@OCn&CtQ5F5BY%|9Tcr&4@gQz9Dw%k`cI9?)K$1z`m!K0 z4(a`*-mPBG94UK6g%Zqep_U{bGyXv7GQXJ(>07xm#EY#olL9#CT*PK!iZf+0cAnL3 z>#Jo`&hj>>M6SVN%7zig_ImQJg}ml)(co3R%9idNp?aX`veX$^dE?gE>Dh0u0c@d^ zs-ka%^VA`9u2svR$`M7)$&t$0)$+TRxG=o!vw#$XBebIwdq_b{v8-}qdb@=ysr2uw zXL7Y_woF!3UR&Wx(!TVqRdr5RFo?&t-1hchZ|*teJnJQB<~U(RZ-f)&8g^jI z?v69xnLE4MqxecHHwqPVSZoyJ#wIF9vQ`frN^>8n>}6%syLzR>BNPNDQdi4TR;S)o zzX}vWs38q>({WZc_lX0xY0R({P3}WgDS%vN9VDg8vZ~ro(oQ|L3YXIXRDx=`WwCh8&En*$ChNm7%yiG?L4KF2lX>v@jnT zMF^>z#;U*ZkDHQpLW`*`yjG9Z=*0sDb|xncy5#T6$vloKlu+N2-Mr>7uMzdPFmG9v z!~!687uIPE&Lw&;%~Xh?QxCTLn9V|WB?#4DZ&+7abYWvuZj3lxPR<=hl8>pUVg51% z2b-q;(nOj|E*>26<%wJ#aM(3G!VY9m%_>|x|A?ri{(_JC&R#H-lD)!=3XUcc-A9r} zwv;VmpCwCbAPXK2+Zby-rxtdy$bMKs2kRzp2^x}i`-7XbYr?x^N!G%FN>I1NrA@c| zMbyTKkk7%4a8m>GmO&lp2Uk4^o>hD-D+g069dn`JOBX0>w#O;#%$~zbGNv!JB&W?? zVegKGZ?|n#K#bA81h^TI>C*@L0!%9QC7=OhOJ}>O`$QrszP{@KEemuFxI4>f+q@sS zjce&BVr(1=jUMN*xz(dup8iyVOqRjKb;J&vXJ4{{`LY7eTggIBpWH{1HHVH|1euUP zI+p66(z>dr{X%9-`zxs~;TxCUM3HiIv*%q)Y})^Ig1(IxDkeMF)qGbbJr=bn)*^M& zqqauvyhY14Es9XX*=P=pve8ylt#@-@P6yJ{9x685L{`Iz`jWD?4^s`=w_AhM<0cLv zg&FK7P9Hiz(U(J^n3!vACvDM6Dlg6^EY!KI{D~e(4Rk&Ru!bk4g+1G=oQQ;=QmR_% zhhch18APmM%|a%#D1_ zarVHh*tLs8Jyb<@oF%W|8lz(I>I1pXvHdC!JhDXwciTfJyK*C}%1Z>g!G^P)is@Nc zEItedHdDci4}siNlO(g|Z@!>F_9NVa*=Cm6sCS*wONwgJEKRuXmd+_DhKU!_&zg4F zxa3O@PWozBIvt+LD5|{X7^sqS=X<&C1Wz)tf6D8N%y&5;+DDC>mey;mRH=UZ(yHt1 z`ez5l!hOiD+~$)s*pET~rHO^J-mdHHFDveS`*O0{*a-0|!55r$B<)H=(j1q<&6Q!-lDRb()ZaQz(PD&> za7SigirHu;=dnEVrtHgrO0mriaoVKEr%<`FI#f@}x33uz~_9|QrtLgr$-Z@ZYN?JEaPmj$XQyFm0^=OdPD z3~$C!p-PorxS_n;L3RTzA0CjtafDodPP5*vFB`IxRwrC6v4_rA!qev7>t=CZSX2<- z`?Z3qQcE%EbgN50R&_?Wn+~9|Y#mi54cln7a?B_(!&0!MVeD2*?Jl9HW61nn>b{yYD;zU!8hXUZUw1*QtUiMEHLMe=>Pslyxj+G5F%WF_}=*G6MOw1;0FpqK0&f z55PQem!Z;4vi{cngQIAO&{z>NGdCToxg>_95_)SFDdJ$)*X&bt5ON%#*Tt1^z{cfg z1nyy`__7UuoZ#T7s@zy};N$ULUQ9XJ&)*|8S94|l&9CBz*TnqG-Pl3K^E2lLb?*aX zFK|;koVYd$kr_qF)FCB8!G;5IF)xpU^(AI3PB~CXN1s^ZLHy( z9tT=W8}#>acL#`C4H2_}_ao7jYT;mI=1aD0rag3!D-NdfrK$7oleHhIoLZYFa za4vmcHR+ZP8;!3gSr#AI%$eBH)$5=obpe6fNHJ@H;ehcFl#B{>=tf}~CXU6%ofynZ z^TH)s#x8XF=7DXQNAn>{*Y8|VSq?yCx$IiRzh zZd!bBY4%XzLLVqUs6mAWql-@wb~~76{i_@IB+2~K9E;JEq4e6VTGlTQ5cg68>gjqK z+y$t**Bx`ji%6d1Z4mqWkXPzi#) zT$R4L&VeJV%T_U}6yp}st^vPd!Yz3zT}r^lvVJScZq3IeWv$)mtwFvh>krtJ*FzU6fKHKwkyezUA+yaM9SWb_DSkRk*7`ENq0a+*=vd(oux{ zBn@ke7{@lxX4LZ8tl5*JQt^}S4zt#l_)!-*IKUezS(GJGULrM5K=eALvxjT=;PVT%yai;f?}daPqs?)CPVpPpn5 z_12)7J=>|)vSQia*q=8PjRi%0%UoEu+gWTEVaJQixvrHZ$+o#BUY5G2`1!A9q5i=g zDq!Pf2vrOGRc;lXq(` z`@bDG2F9X(TE@iz`|6$=?q;j56HqDj9bN9I@ggE3Y8~HaGF$MjUl1a?Il^M>}l^%FXf5rqHfTi71=1OliXg+eRuP8fXRtgVGb~xss!{n zop8slL*zAT4goP2==$BEJ{GNNfsd}GZ%E}jbJ%yBEZ(`amDZ;FNUmzly96nWENMX5 zkBrz-^?03jj9hec7S>Tb|%l}ZP{fLa#^F{jj?^r&Jyov+UPDYlWk=GS-a6g zUruGc|9q1dE_Z>A)IT!kqQNQqaJ5fgEEhEsm zG;|i7l2PmWLXN3g!!q%jRl3sMmT#~CaZ>g_UW)%=0>nvGljrP-4NK`EF@ie|6uX1F z=o4k=_IK<)z3GLHk8nWWhiWoSflm7i$w`z76JBywz3_~B>ft602CoVhD`7DdxgC{b2WjPSmZVk?(S=Y}H za(_{(vb?{pqj)M7%L8F?*XBtK&r%#mO1cBM8~N zg%q}xt|YXvqf8f%MT)gPX@=y@*m#>MtY%;D368R8%}CrM_Muj|_|$-S3!8);7oxT#l)RF!I;|zk z8Z$U^C`Qd3p@U}%GySkY(i}~z0 zPZ%-~eJv`9N{nrty)_J6Y^1LAJ(&xqvOqDf&sHzNAZ};R)D0Y*4qw@isl;xg&z`o? zA9weY;)%1`)YkSLnzU^!^t@xAs z^;IYj)<`hGe{v@`A$UY%OXO3tDC^BG)CUVu*Gl6tJNvyS(XH_luylG?MAPbu{2np#HSC!V@j80TtlTyoc14! z4^Zuds)BqE^L34A>KK)t&BJ`%hUvr`*;LZfi~g%NA{2vGb$pfMXET~nUTmpeVs#-q zdZdMRW`*!;`-maxMfSd6G9r60!yS7KHBti{&iA58;lZF*yEJ(Dk|Ledu%fY0C z89R)~6f35MJ!$LCxQ|a?lprT($}WX0u3;%S%W`zbDa)?mBLn5fsL9)*juitH?2*Rq z9L+^MC5fYCn?%#}#qC`mCv5{6q6r3VbxviAg#Uw$X*+E z?fy-1?)Bv=FPK8)Pg2Xia!oC(_3W;gJ6pi{U@xgyLJQ`W4Q}s-^8=sZ5!tciP*9cevO`6F&So&8yrb8QBgDT zwpQPIeK}vkx7_*bfJ$zs%B0ei+`Jv#eoryj5d^B;Ze=ewhZaJ)b}R#$!CQOl>o7&% zHPyblrdD(!vBg!PsrNU2FK7_uFwj6(hFI}8E7^;b?8V-~)hy_%J<4M)YjPr;#e1!& zF`!LjB!#B5pS|m-vZt2h`4-ZyPyrY2m~+$%hkbwRaDSZoa9d}g%CaCFQXf^h5jh+7 zQvhYQokqHiBww;qwB<0-b@N=4$;H+xI&i9z*-SNU1hu{0f^gMrpcdV_>qNLns~ zE5*zl+}Q97`P}R6hGugY63EI7A0$RSb$RJW7jSd%uDX3o@QAMuS7E%caeGHrMi!!^G8G z%Y|YG2MsdW9po`|r#r+hAZynS2Jfu98I{)Jy$xhq@k-Cx*OXunDOSOXw2yQJ+Of7S zyPp(;v>}p=ch9pqlI8fjD}IN1)7;ed_T+5(@LK8m{jJmUPl{yu?bvBe&s2wH9db`` z1I@eIZGY$0+B%_*6S}PU*wd0cb6vQWIiHoHujYi#Ae6~4P3r~Zt>o7b@dg)s5_$Oy+^31Z`8B4 zy(zD5s{WKemQ#9r4%E_@*SP5oFKl_mfh~47dCbjYs<~JADT|99zv}A?0~K}`RAC3V zk(4X@LWD+joY~PT&arl^Wx~*^B^bB5u~Gv|!rFUDd5pzNg8L~LJf^aWix6!M@Fp8PIq|jH^v^DjlShvOI)vb}9tT3Tc zb#1l0+*7!i?CuWxv+Z$y9QwZEwtQ0b?y$ULcx;Xj2g7sz%7cTVrrPz+Ys;GuVMvup zQsdW@9q!#A9Q*hFeK}YL4xWQ{c>9p+I0=juztTB?>?0x(sI!DO>TnGY?Cwz4ip8a) zD4g7OnO|vn9pe~OZxLpe=BnlATe4Prdn@ZayUB4Nv#_f#r#bwV6SsPG-qT6<@QI;E z7j`3o-tAepeY{rID@prEvHR+wU+f^8nRnxv=1@Zss_oG^O4)6(m(*dMj4j-q#9>|v zG3H3p^salQG6NYM`E@}x*>UX zFBRL^;pk%CRI{1!5I#DjP)D@Ch+cYA*6SHU8|4?tahu4x@o32SgQ*u?g>S!R;{|I+Gula9`2&s2P=iBeiFAq zSFO9Nji+Q26fe_xG*CGPNKQOHHMM@i@) zoxaMkcg578a;hzIAk^443IUC|N^arp{OJ3NZj!o$t)--h#l0kNVlTW#ntF+=1~Dsy^|2_QLo*Wl$xsKWg@z`Gh%kY!;zE9i@ zBC?<=>@j{ow@5*OT2+vc3XDq9*2&CBK@3l_<{nbasoFuQRPj}M!a{u)T3)D?Tw8Ye z+Mtc&D_a}SB+Zk~Kf+#n6`)od!_Q;a&*Z*kTc)ffb;XIgbaDi6C`8!vq|k>Ry= zB}2+$GlN?(pEs=?7Lj1{=rVV$>xF}QVR!m~7K!1RYh|kaOdg`yn>$LSxP^3u1@e?z z%7H4@wSpxr5~DbOh%6Q$h0#1>9XGboD$3~sd zlJq)L%x2H!yIN?FKf*0l0|lH)+a z5?nksXTiEBJjMU2*?}|V&5D`cT+!CtQeWaLIbW;nQX|+d8Bbm;?PO~br z?{zw30k`_VU)y2_nneL*HfBW&bPEgn&e*}QcLy#Dys0!!jQr=$VO8cGX<9uB?Z_eOQ^0rW8IDo;^oA|m$6IzyYvYFG6C0<+ zfl@C{gqAY3pCnafi-l3Rns-!d>gq7dV4Lh%yR!66CaK}D(NNvBmDTbjNw{Ax19hFn+g_wet|XNqyL4YW=q_)wGkGow zR~4Gl_+ZBhWz2{Q#j061`RpYe(4lDagI`~01Fb84J8UdIEZ9ei5o&PlG#nM#RWgC!EVwqwax zzt(G+G=_ES)rwb=_K{-p=%LMx2sf%TScPEEM)S&$pI%t{kcSNIkC37Rv$*mVht5% zE7{g1tRz1X(alIs3n_-J!Z*O6GQ@?OA{h$7mCqIysDC-Mh3c1lXxfYYq(w)cx{TVA z$vz(^w^?P3W%nlWTSyTDq^^{DWY%cbrl`{dH@e9{wQG~$QBpBTG@JBvKx3Hwgmu77|G<{& z?o>+eB`Jp-mGPr+lFqJVw+(G7L+`0T)}GB&tF`3vYK8f5YmwiFw^r{uLaF3SR|zM| z;@Z((iRxziNGd66`$D85T5~^XQEzp~#0sEv-;hhKUmdSD>NNUc){FHmv&)-WM;|3C z-s|hDlwTh+t~}+I;Q-`a4aMSJaxxquN>9%Bc+qiyv(G>COofZL?^Lq=$+82s5jkw* z4JGtCbgQB)46buwrd~Y9yV7<<=Gw6cywXA$^6t_P+oTb$qJ%neXq1U3$I?9np`gVEc)&A1ar>U^ts4GFn8-gctQ>(Y8ue2y>E|NRDg>F4cDQjQd z8tW8pAIaz$mXI+`Y-KB%x625G&0bbK|K6p3{Jl$l!#zu0FU=09cU<4vXa_Dga`Jj~1N{KI*%NdpGpuWm2rB2d?a7D-U;Dshfxknj*ro-tHa8 tP8m1dA=PVd, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Thomas Thurman \n" +"Language-Team: Shavian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 '%s' 𐑓𐑹 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "𐑩𐑑𐑮𐑦𐑚𐑿𐑑 '%s' 𐑝 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s' 𐑯𐑪𐑑 𐑓𐑬𐑯𐑛" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑𐑨𐑜 '%s', 𐑑𐑨𐑜 '%s' 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑𐑨𐑜 '%s' 𐑦𐑯𐑕𐑲𐑛 '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "𐑯𐑴 𐑝𐑨𐑤𐑦𐑛 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑲𐑤 𐑓𐑬𐑯𐑛 𐑦𐑯 𐑛𐑱𐑑𐑩 𐑛𐑻𐑟" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "𐑩 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 URI '%s' 𐑷𐑤𐑮𐑧𐑛𐑦 𐑧𐑒𐑟𐑦𐑕𐑑𐑕" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "𐑯𐑴 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑬𐑯𐑛 𐑓𐑹 URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "𐑯𐑴 MIME 𐑑𐑲𐑐 𐑛𐑦𐑓𐑲𐑯𐑛 𐑦𐑯 𐑞 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 𐑘𐑻𐑰 '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "𐑯𐑴 𐑐𐑮𐑲𐑝𐑩𐑑 𐑓𐑤𐑨𐑜 𐑣𐑨𐑟 𐑚𐑰𐑯 𐑛𐑦𐑓𐑲𐑯𐑛 𐑦𐑯 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "𐑯𐑴 𐑜𐑮𐑵𐑐𐑕 𐑕𐑧𐑑 𐑦𐑯 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "𐑯𐑴 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑢𐑦𐑞 𐑯𐑱𐑥 '%s' 𐑮𐑧𐑡𐑦𐑕𐑑𐑼𐑛 𐑩 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑐𐑨𐑯𐑛 𐑧𐑜𐑟𐑧𐑒 𐑤𐑲𐑯 '%s' 𐑢𐑦𐑞 URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑓𐑮𐑪𐑥 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑕𐑧𐑑 '%s' 𐑑 '%s' 𐑦𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑴𐑐𐑩𐑯 𐑒𐑩𐑯𐑝𐑻𐑑𐑻 𐑓𐑮𐑪𐑥 '%s' 𐑑 '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑚𐑲𐑑 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑦𐑯𐑐𐑫𐑑" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "𐑻𐑼 𐑛𐑘𐑫𐑼𐑦𐑙 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "𐑐𐑸𐑑𐑦𐑨𐑤 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑦𐑯𐑐𐑫𐑑" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑒𐑩𐑯𐑝𐑻𐑑 𐑓𐑪𐑤𐑚𐑨𐑒 '%s' 𐑑 𐑒𐑴𐑛𐑕𐑧𐑑 '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "𐑞 URI '%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑯 𐑨𐑚𐑕𐑴𐑤𐑵𐑑 URI 𐑿𐑟𐑦𐑙 𐑞 \"file\" 𐑕𐑒𐑰𐑥" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "𐑞 𐑤𐑴𐑒𐑩𐑤 𐑓𐑲𐑤 URI '%s' 𐑥𐑱 𐑯𐑪𐑑 𐑦𐑯𐑒𐑤𐑵𐑛 𐑩 '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "𐑞 URI '%s' 𐑦𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "𐑞 𐑣𐑴𐑕𐑑𐑯𐑱𐑥 𐑝 𐑞 URI '%s' 𐑦𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "𐑞 URI '%s' 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛𐑤𐑦 𐑦𐑕𐑒𐑱𐑐𐑑 𐑒𐑨𐑮𐑩𐑒𐑑𐑼𐑟" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "𐑞 𐑐𐑭𐑔𐑯𐑱𐑥 '%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑯 𐑨𐑚𐑕𐑴𐑤𐑵𐑑 𐑐𐑭𐑔" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑣𐑴𐑕𐑑𐑯𐑱𐑥" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑨𐑤𐑴𐑒𐑱𐑑 %lu 𐑚𐑲𐑑𐑕 𐑑 𐑮𐑰𐑛 𐑓𐑲𐑤 \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "𐑓𐑲𐑤 \"%s\" 𐑦𐑟 𐑑𐑵 𐑤𐑸𐑡" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑓𐑮𐑪𐑥 𐑓𐑲𐑤 '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑜𐑧𐑑 𐑨𐑑𐑮𐑦𐑚𐑿𐑑𐑕 𐑝 𐑓𐑲𐑤 '%s': fstat() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s': fdopen() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑯𐑱𐑥 𐑓𐑲𐑤 '%s' 𐑑 '%s': g_rename() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑓𐑲𐑤 '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s' 𐑓𐑹 𐑮𐑲𐑑𐑦𐑙: fdopen() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑲𐑑 𐑓𐑲𐑤 '%s': fwrite() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑲𐑑 𐑓𐑲𐑤 '%s': fflush() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑲𐑑 𐑓𐑲𐑤 '%s': fsync() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑤𐑴𐑕 𐑓𐑲𐑤 '%s': fclose() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "𐑧𐑒𐑟𐑦𐑕𐑑𐑦𐑙 𐑓𐑲𐑤 '%s' 𐑒𐑫𐑛 𐑯𐑪𐑑 𐑚𐑰 𐑮𐑦𐑥𐑵𐑝𐑛: g_unlink() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "𐑑𐑧𐑥𐑐𐑤𐑱𐑑 '%s' 𐑦𐑯𐑝𐑨𐑤𐑦𐑛, 𐑖𐑫𐑛 𐑯𐑪𐑑 𐑒𐑩𐑯𐑑𐑱𐑯 𐑩 '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "𐑑𐑧𐑥𐑐𐑤𐑱𐑑 '%s' 𐑛𐑳𐑟𐑯𐑑 𐑒𐑩𐑯𐑑𐑱𐑯 XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑞 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒 '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒𐑕 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑴𐑐𐑩𐑯 𐑒𐑩𐑯𐑝𐑻𐑑𐑻 𐑓𐑮𐑪𐑥 '%s' 𐑑 '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "𐑒𐑨𐑯𐑑 𐑛𐑵 𐑩 𐑮𐑷 𐑮𐑧𐑛 𐑦𐑯 g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "𐑤𐑧𐑓𐑑𐑴𐑝𐑻 𐑩𐑯𐑒𐑩𐑯𐑝𐑻𐑑𐑦𐑛 𐑛𐑱𐑑𐑩 𐑦𐑯 𐑮𐑰𐑛 𐑚𐑳𐑓𐑼" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "𐑗𐑨𐑯𐑩𐑤 𐑑𐑻𐑥𐑦𐑯𐑱𐑑𐑕 𐑦𐑯 𐑩 𐑐𐑸𐑑𐑦𐑨𐑤 𐑒𐑨𐑮𐑩𐑒𐑑𐑼" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "𐑒𐑨𐑯𐑑 𐑛𐑵 𐑩 𐑮𐑷 𐑮𐑧𐑛 𐑦𐑯 g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s': open() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑥𐑨𐑐 𐑓𐑲𐑤 '%s': mmap() 𐑓𐑱𐑤𐑛: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "𐑻𐑼 𐑪𐑯 𐑤𐑲𐑯 %d 𐑗𐑸 %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 UTF-8 𐑧𐑯𐑒𐑴𐑛𐑩𐑛 𐑑𐑧𐑒𐑕𐑑 𐑦𐑯 𐑯𐑱𐑥 - 𐑯𐑪𐑑 𐑝𐑨𐑤𐑦𐑛 '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "𐑻𐑼 𐑪𐑯 𐑤𐑲𐑯 %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"𐑓𐑱𐑤𐑛 𐑑 𐑐𐑸𐑕 '%-.*s', 𐑢𐑦𐑗 𐑖𐑫𐑛 𐑣𐑨𐑝 𐑚𐑰𐑯 𐑩 𐑛𐑦𐑡𐑦𐑑 𐑦𐑯𐑕𐑲𐑛 𐑩 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑮𐑧𐑓𐑼𐑩𐑯𐑕 (ê " +"𐑓𐑹 𐑦𐑜𐑟𐑭𐑥𐑐𐑩𐑤) - 𐑐𐑼𐑣𐑨𐑐𐑕 𐑞 𐑛𐑦𐑡𐑦𐑑 𐑦𐑟 𐑑𐑵 𐑤𐑸𐑡" + +#: glib/gmarkup.c:590 +#, fuzzy +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑮𐑧𐑓𐑼𐑩𐑯𐑕 𐑛𐑦𐑛 𐑯𐑪𐑑 𐑧𐑯𐑛 𐑢𐑦𐑞 𐑩 𐑕𐑧𐑥𐑦𐑒𐑴𐑤𐑩𐑯; 𐑥𐑴𐑕𐑑 𐑤𐑲𐑒𐑤𐑦 𐑿 𐑿𐑕𐑑 𐑩𐑯 𐑨𐑥𐑐𐑻𐑕𐑨𐑯𐑛 " +"𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑢𐑦𐑞𐑬𐑑 𐑦𐑯𐑑𐑧𐑯𐑛𐑦𐑙 𐑑 𐑕𐑑𐑸𐑑 𐑩𐑯 𐑧𐑯𐑑𐑦𐑑𐑦 - 𐑦𐑕𐑒𐑱𐑐 𐑨𐑥𐑐𐑻𐑕𐑨𐑯𐑛 𐑨𐑟 &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑮𐑧𐑓𐑼𐑩𐑯𐑕 '%-.*s' 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑧𐑯𐑒𐑴𐑛 𐑩 𐑐𐑼𐑥𐑦𐑑𐑩𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "𐑧𐑥𐑐𐑑𐑦 𐑧𐑯𐑑𐑦𐑑𐑦 '&;' 𐑕𐑰𐑯; 𐑝𐑨𐑤𐑦𐑛 𐑧𐑯𐑑𐑦𐑑𐑦𐑟 𐑸: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "𐑧𐑯𐑑𐑦𐑑𐑦 𐑯𐑱𐑥 '%-.*s' 𐑦𐑟 𐑯𐑪𐑑 𐑯𐑴𐑯" + +#: glib/gmarkup.c:667 +#, fuzzy +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"𐑧𐑯𐑑𐑦𐑑𐑦 𐑛𐑦𐑛 𐑯𐑪𐑑 𐑧𐑯𐑛 𐑢𐑦𐑞 𐑩 𐑕𐑧𐑥𐑦𐑒𐑴𐑤𐑩𐑯; 𐑥𐑴𐑕𐑑 𐑤𐑲𐑒𐑤𐑦 𐑿 𐑿𐑕𐑑 𐑩𐑯 𐑨𐑥𐑐𐑻𐑕𐑨𐑯𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 " +"𐑢𐑦𐑞𐑬𐑑 𐑦𐑯𐑑𐑧𐑯𐑛𐑦𐑙 𐑑 𐑕𐑑𐑸𐑑 𐑩𐑯 𐑧𐑯𐑑𐑦𐑑𐑦 - 𐑦𐑕𐑒𐑱𐑐 𐑨𐑥𐑐𐑻𐑕𐑨𐑯𐑛 𐑨𐑟 &𐑨𐑥𐑐;" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑥𐑳𐑕𐑑 𐑚𐑩𐑜𐑦𐑯 𐑢𐑦𐑞 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 (e.g. <𐑚𐑫𐑒>)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑓𐑪𐑤𐑴𐑦𐑙 𐑩 '<' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼; 𐑦𐑑 𐑥𐑱 𐑯𐑪𐑑 𐑚𐑩𐑜𐑦𐑯 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 " +"𐑯𐑱𐑥" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"𐑪𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 '%s', 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 '>' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑑 𐑧𐑯𐑛 𐑞 𐑧𐑥𐑐𐑑𐑦-𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑑𐑨𐑜 '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "𐑪𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 '%s', 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 '=' 𐑭𐑓𐑑𐑼 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥 '%s' 𐑝 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"𐑪𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 '%s', 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 '>' 𐑹 '/' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑑 𐑧𐑯𐑛 𐑞 𐑕𐑑𐑸𐑑 𐑑𐑨𐑜 𐑝 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%" +"s',𐑹 𐑪𐑐𐑖𐑩𐑯𐑩𐑤𐑦 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑; 𐑐𐑼𐑣𐑨𐑐𐑕 𐑿 𐑿𐑕𐑑 𐑩𐑯 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑦𐑯 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"𐑪𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 '%s', 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩𐑯 𐑴𐑐𐑩𐑯 𐑒𐑢𐑴𐑑 ·𐑥𐑸𐑒 𐑭𐑓𐑑𐑼 𐑞 𐑰𐑒𐑢𐑩𐑤𐑟 𐑕𐑲𐑯 𐑢𐑧𐑯 𐑜𐑦𐑝𐑦𐑙 " +"𐑝𐑨𐑤𐑿 𐑓𐑹 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 '%s' 𐑝 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑓𐑪𐑤𐑴𐑦𐑙 𐑞 𐑒𐑤𐑴𐑕 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑯𐑱𐑥 '%s'; 𐑞 𐑩𐑤𐑬𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 " +"𐑦𐑟 '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s' 𐑢𐑪𐑟 𐑒𐑤𐑴𐑟𐑛, 𐑯𐑴 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑦𐑟 𐑒𐑳𐑮𐑩𐑯𐑑𐑤𐑦 𐑴𐑐𐑩𐑯" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s' 𐑢𐑪𐑟 𐑒𐑤𐑴𐑟𐑛, 𐑚𐑳𐑑 𐑞 𐑒𐑳𐑮𐑩𐑯𐑑𐑤𐑦 𐑴𐑐𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑦𐑟 '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑢𐑪𐑟 𐑧𐑥𐑐𐑑𐑦 𐑹 𐑒𐑩𐑯𐑑𐑱𐑯𐑛 𐑴𐑯𐑤𐑦 𐑢𐑲𐑑𐑕𐑐𐑱𐑕" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑡𐑳𐑕𐑑 𐑭𐑓𐑑𐑼 𐑩𐑯 𐑴𐑐𐑩𐑯 𐑨𐑙𐑜𐑤 𐑚𐑮𐑨𐑒𐑩𐑑 '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑢𐑦𐑞 𐑧𐑤𐑩𐑥𐑩𐑯𐑑𐑕 𐑕𐑑𐑦𐑤 𐑴𐑐𐑩𐑯 - '%s' 𐑢𐑪𐑟 𐑞 𐑤𐑭𐑕𐑑 " +"𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑴𐑐𐑩𐑯𐑛" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰, 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑 𐑕𐑰 𐑩 𐑒𐑤𐑴𐑕 𐑨𐑙𐑜𐑤 𐑚𐑮𐑨𐑒𐑩𐑑 𐑧𐑯𐑛𐑦𐑙 𐑞 𐑑𐑨𐑜 <" +"%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑯𐑱𐑥" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑-𐑴𐑐𐑩𐑯𐑦𐑙 𐑑𐑨𐑜." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑭𐑓𐑑𐑼 𐑞 𐑰𐑒𐑢𐑩𐑤𐑟 𐑕𐑲𐑯 𐑓𐑪𐑤𐑴𐑦𐑙 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥; 𐑯𐑴 " +"𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑝𐑨𐑤𐑿" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑢𐑲𐑤 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑝𐑨𐑤𐑿" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑞 𐑒𐑤𐑴𐑕 𐑑𐑨𐑜 𐑓𐑹 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩 𐑒𐑳𐑥𐑥𐑩𐑯𐑑 𐑹 𐑐𐑮𐑴𐑕𐑧𐑕𐑦𐑙 𐑦𐑯𐑕𐑑𐑮𐑳𐑒𐑖𐑩𐑯" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "𐑒𐑼𐑳𐑐𐑑𐑩𐑛 𐑩𐑚𐑡𐑧𐑒𐑑" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑻𐑼 𐑹 𐑒𐑼𐑳𐑐𐑑𐑩𐑛 𐑩𐑚𐑡𐑧𐑒𐑑" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "𐑬𐑑 𐑝 𐑥𐑧𐑥𐑼𐑦" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "𐑚𐑨𐑒𐑑𐑮𐑨𐑒𐑦𐑙 𐑤𐑦𐑥𐑦𐑑 𐑮𐑰𐑗𐑑" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "𐑞 𐑐𐑨𐑑𐑼𐑯 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑲𐑑𐑩𐑥𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓𐑹 𐑐𐑸𐑑𐑦𐑨𐑤 𐑥𐑨𐑗𐑦𐑙" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑻𐑼" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "𐑚𐑨𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕𐑩𐑟 𐑨𐑟 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯𐑟 𐑸 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓𐑹 𐑐𐑸𐑑𐑦𐑨𐑤 𐑥𐑨𐑗𐑦𐑙" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "𐑮𐑦𐑒𐑻𐑖𐑩𐑯 𐑤𐑦𐑥𐑦𐑑 𐑮𐑰𐑗𐑑" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "𐑢𐑻𐑒𐑕𐑐𐑱𐑕 𐑤𐑦𐑥𐑦𐑑 𐑓𐑹 𐑧𐑥𐑐𐑑𐑦 𐑕𐑳𐑚𐑕𐑑𐑮𐑦𐑙𐑟 𐑮𐑰𐑗𐑑" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑪𐑥𐑚𐑦𐑯𐑱𐑖𐑩𐑯 𐑝 𐑯𐑿𐑤𐑲𐑯 𐑓𐑤𐑨𐑜𐑟" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑐𐑨𐑑𐑼𐑯" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑐𐑨𐑑𐑼𐑯" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑓𐑪𐑤𐑴𐑟 \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "𐑒𐑱𐑕-𐑗𐑱𐑯𐑡𐑦𐑙 𐑦𐑕𐑒𐑱𐑐𐑕 (\\l, \\L, \\u, \\U) 𐑸 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑣𐑽" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "𐑯𐑳𐑥𐑚𐑼𐑟 𐑬𐑑 𐑝 𐑹𐑛𐑼 𐑦𐑯 {} 𐑒𐑢𐑪𐑯𐑑𐑦𐑓𐑲𐑼" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "𐑯𐑳𐑥𐑚𐑼 𐑑𐑵 𐑚𐑦𐑜 𐑦𐑯 {} 𐑒𐑢𐑪𐑯𐑑𐑦𐑓𐑲𐑼" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑦𐑙 ] 𐑓𐑹 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑒𐑤𐑭𐑕" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑦𐑕𐑒𐑱𐑐 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑒𐑤𐑭𐑕" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "𐑮𐑱𐑯𐑡 𐑬𐑑 𐑝 𐑹𐑛𐑼 𐑦𐑯 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑒𐑤𐑭𐑕" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "𐑯𐑳𐑔𐑦𐑙 𐑑 𐑮𐑦𐑐𐑰𐑑" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑭𐑓𐑑𐑼 (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑭𐑓𐑑𐑼 (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑭𐑓𐑑𐑼 (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 𐑯𐑱𐑥𐑛 𐑒𐑤𐑭𐑕𐑩𐑟 𐑸 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑴𐑯𐑤𐑦 𐑢𐑦𐑞𐑦𐑯 𐑩 𐑒𐑤𐑭𐑕" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑦𐑙 )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") 𐑢𐑦𐑞𐑬𐑑 𐑴𐑐𐑩𐑯𐑦𐑙 (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?𐑭𐑮 𐑹 (?[+-]𐑛𐑦𐑡𐑩𐑑𐑕 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑓𐑪𐑤𐑴𐑛 𐑚𐑲 )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "𐑮𐑧𐑓𐑼𐑩𐑯𐑕 𐑑 𐑯𐑪𐑯-𐑧𐑜𐑟𐑦𐑕𐑑𐑩𐑯𐑑 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "𐑥𐑦𐑕𐑦𐑙 ) 𐑭𐑓𐑑𐑼 𐑒𐑳𐑥𐑥𐑩𐑯𐑑" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 𐑑𐑵 𐑤𐑸𐑡" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑜𐑧𐑑 𐑥𐑧𐑥𐑼𐑦" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "𐑤𐑫𐑒𐑚𐑩𐑣𐑦𐑯𐑛 𐑩𐑕𐑻𐑕𐑩𐑯 𐑦𐑟 𐑯𐑪𐑑 𐑓𐑦𐑒𐑕𐑑 𐑤𐑧𐑙𐑔" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑯𐑳𐑥𐑚𐑼 𐑹 𐑯𐑱𐑥 𐑭𐑓𐑑𐑼 (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯𐑩𐑤 𐑜𐑮𐑵𐑐 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑥𐑹 𐑞𐑨𐑯 𐑑𐑵 𐑚𐑮𐑭𐑯𐑗𐑩𐑟" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "𐑩𐑕𐑻𐑕𐑩𐑯 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑭𐑓𐑑𐑼 (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "𐑳𐑯𐑴𐑯 POSIX 𐑒𐑤𐑭𐑕 𐑯𐑱𐑥" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX 𐑒𐑪𐑤𐑱𐑑𐑦𐑙 𐑧𐑤𐑩𐑥𐑩𐑯𐑑𐑕 𐑸 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑝𐑨𐑤𐑿 𐑦𐑯 \\x{...} 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑟 𐑑𐑵 𐑤𐑸𐑡" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯 (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑦𐑯 lookbehind 𐑩𐑕𐑻𐑕𐑩𐑯" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "𐑮𐑦𐑒𐑻𐑕𐑦𐑝 𐑒𐑷𐑤 𐑒𐑫𐑛 𐑤𐑵𐑐 𐑦𐑯𐑛𐑧𐑓𐑩𐑯𐑩𐑑𐑤𐑦" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑻 𐑦𐑯 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯 𐑯𐑱𐑥" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "𐑑𐑵 𐑯𐑱𐑥𐑛 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯𐑟 𐑣𐑨𐑝 𐑞 𐑕𐑱𐑥 𐑯𐑱𐑥" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 \\P 𐑹 \\p 𐑕𐑰𐑒𐑢𐑩𐑯𐑕" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "𐑳𐑯𐑴𐑯 𐑐𐑮𐑪𐑐𐑼𐑑𐑦 𐑯𐑱𐑥 𐑭𐑓𐑑𐑼 \\P 𐑹 \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯 𐑯𐑱𐑥 𐑦𐑟 𐑑𐑵 𐑤𐑪𐑙 (𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 32 𐑒𐑨𐑮𐑩𐑒𐑑𐑼𐑟)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "𐑑𐑵 𐑥𐑧𐑯𐑦 𐑯𐑱𐑥𐑛 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯𐑟 (𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "𐑪𐑒𐑑𐑩𐑤 𐑝𐑨𐑤𐑿 𐑦𐑟 𐑜𐑮𐑱𐑑𐑼 𐑞𐑨𐑯 \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 𐑜𐑮𐑵𐑐 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑥𐑹 𐑞𐑨𐑯 𐑢𐑳𐑯 𐑚𐑮𐑭𐑯𐑗" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "𐑮𐑦𐑐𐑰𐑑𐑦𐑙 𐑩 DEFINE 𐑜𐑮𐑵𐑐 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "𐑦𐑯𐑒𐑩𐑯𐑕𐑦𐑕𐑑𐑩𐑯𐑑 NEWLINE 𐑪𐑐𐑖𐑩𐑯𐑟" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g 𐑦𐑟 𐑯𐑪𐑑 𐑓𐑪𐑤𐑴𐑛 𐑚𐑲 𐑩 𐑚𐑮𐑱𐑕𐑑 𐑯𐑱𐑥 𐑹 𐑩𐑯 𐑪𐑐𐑖𐑩𐑯𐑩𐑤𐑦 𐑚𐑮𐑱𐑕𐑑 𐑯𐑪𐑯-𐑟𐑽𐑴 𐑯𐑳𐑥𐑚𐑼" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑮𐑦𐑐𐑰𐑑" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "𐑒𐑴𐑛 𐑴𐑝𐑼𐑓𐑤𐑴" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "𐑴𐑝𐑻𐑮𐑨𐑯 𐑒𐑩𐑥𐑐𐑲𐑤𐑦𐑙 𐑢𐑻𐑒𐑕𐑐𐑱𐑕" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "𐑐𐑮𐑰𐑝𐑦𐑩𐑕𐑤𐑦-𐑗𐑧𐑒𐑑 𐑮𐑧𐑓𐑼𐑩𐑯𐑕𐑑 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯 𐑯𐑪𐑑 𐑓𐑬𐑯𐑛" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑥𐑨𐑗𐑦𐑙 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 𐑤𐑲𐑚𐑮𐑼𐑦 𐑦𐑟 𐑒𐑩𐑥𐑐𐑲𐑤𐑛 𐑢𐑦𐑞𐑬𐑑 UTF8 𐑕𐑩𐑐𐑹𐑑" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 𐑤𐑲𐑚𐑮𐑼𐑦 𐑦𐑟 𐑒𐑩𐑥𐑐𐑲𐑤𐑛 𐑢𐑦𐑞𐑬𐑑 UTF8 𐑐𐑮𐑪𐑐𐑼𐑑𐑦𐑟 𐑕𐑩𐑐𐑹𐑑" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑒𐑩𐑥𐑐𐑲𐑤𐑦𐑙 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 %s 𐑨𐑑 𐑗𐑸 %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑪𐑐𐑑𐑦𐑥𐑲𐑟𐑦𐑙 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "𐑣𐑧𐑒𐑕𐑩𐑛𐑧𐑕𐑦𐑥𐑩𐑤 𐑛𐑦𐑡𐑦𐑑 𐑹 '}' 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "𐑣𐑧𐑒𐑕𐑩𐑛𐑧𐑕𐑦𐑥𐑩𐑤 𐑛𐑦𐑡𐑦𐑑 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "𐑥𐑦𐑕𐑦𐑙 '<' 𐑦𐑯 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "𐑩𐑯𐑓𐑦𐑯𐑦𐑖𐑑 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "𐑟𐑽𐑴-𐑤𐑧𐑙𐑔 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "𐑛𐑦𐑡𐑦𐑑 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "𐑦𐑤𐑰𐑜𐑩𐑤 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "𐑕𐑑𐑮𐑱 𐑓𐑲𐑯𐑩𐑤 '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "𐑳𐑯𐑴𐑯 𐑦𐑕𐑒𐑱𐑐 𐑕𐑰𐑒𐑢𐑩𐑯𐑕" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑐𐑸𐑕𐑦𐑙 𐑮𐑦𐑐𐑤𐑱𐑕𐑥𐑩𐑯𐑑 𐑑𐑧𐑒𐑕𐑑 \"%s\" 𐑨𐑑 𐑗𐑸 %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "𐑒𐑢𐑴𐑑𐑩𐑛 𐑑𐑧𐑒𐑕𐑑 𐑛𐑳𐑟𐑯𐑑 𐑚𐑩𐑜𐑦𐑯 𐑢𐑦𐑞 𐑩 𐑒𐑢𐑴𐑑𐑱𐑖𐑩𐑯 ·𐑥𐑸𐑒" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "𐑩𐑯𐑥𐑨𐑗𐑑 𐑒𐑢𐑴𐑑𐑱𐑖𐑩𐑯 𐑥𐑸𐑒 𐑦𐑯 𐑒𐑩𐑥𐑭𐑯𐑛 𐑤𐑲𐑯 𐑹 𐑳𐑞𐑼 𐑖𐑧𐑤-𐑒𐑢𐑴𐑑𐑩𐑛 𐑑𐑧𐑒𐑕𐑑" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "𐑑𐑧𐑒𐑕𐑑 𐑧𐑯𐑛𐑩𐑛 𐑡𐑳𐑕𐑑 𐑭𐑓𐑑𐑼 𐑩 '\\' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼. (𐑞 𐑑𐑧𐑒𐑕𐑑 𐑢𐑪𐑟 '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "𐑑𐑧𐑒𐑕𐑑 𐑧𐑯𐑛𐑩𐑛 𐑚𐑦𐑓𐑹 𐑥𐑨𐑗𐑦𐑙 𐑒𐑢𐑴𐑑 𐑢𐑪𐑟 𐑓𐑬𐑯𐑛 𐑓𐑹 %c. (𐑞 𐑑𐑧𐑒𐑕𐑑 𐑢𐑪𐑟 '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "𐑑𐑧𐑒𐑕𐑑 𐑢𐑪𐑟 𐑧𐑥𐑐𐑑𐑦 (𐑹 𐑒𐑩𐑯𐑑𐑱𐑯𐑛 𐑴𐑯𐑤𐑦 𐑢𐑲𐑑𐑕𐑐𐑱𐑕)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑐𐑲𐑐 𐑓𐑹 𐑒𐑩𐑥𐑿𐑯𐑦𐑒𐑱𐑑𐑦𐑙 𐑢𐑦𐑞 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 𐑐𐑲𐑐 (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑗𐑱𐑯𐑡 𐑑 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑧𐑒𐑕𐑩𐑒𐑿𐑑 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑐𐑮𐑴𐑜𐑮𐑨𐑥 𐑯𐑱𐑥: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑑𐑮𐑦𐑙 𐑦𐑯 𐑸𐑜𐑿𐑥𐑩𐑯𐑑 𐑝𐑧𐑒𐑑𐑼 𐑨𐑑 %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑑𐑮𐑦𐑙 𐑦𐑯 𐑧𐑯𐑝𐑲𐑼𐑯𐑥𐑩𐑯𐑑: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑢𐑻𐑒𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑧𐑒𐑕𐑩𐑒𐑿𐑑 𐑣𐑧𐑤𐑐𐑼 𐑐𐑮𐑴𐑜𐑮𐑨𐑥 (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑼 𐑦𐑯 g_io_channel_win32_poll() 𐑮𐑰𐑛𐑦𐑙 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑩 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑼 𐑦𐑯 select() 𐑮𐑰𐑛𐑦𐑙 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑩 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑼 𐑦𐑯 waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑓𐑹𐑒 (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑧𐑒𐑕𐑩𐑒𐑿𐑑 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛𐑻𐑧𐑒𐑑 𐑬𐑑𐑐𐑫𐑑 𐑹 𐑦𐑯𐑐𐑫𐑑 𐑝 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑓𐑹𐑒 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼 𐑧𐑒𐑕𐑩𐑒𐑿𐑑𐑦𐑙 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑦𐑯𐑳𐑓 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 pid 𐑐𐑲𐑐 (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡 𐑓𐑹 UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑦𐑯𐑐𐑫𐑑" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡 𐑓𐑹 UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "𐑿𐑕𐑦𐑡:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[𐑪𐑐𐑖𐑩𐑯...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "𐑣𐑧𐑤𐑐 𐑪𐑐𐑖𐑩𐑯𐑟:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "𐑖𐑴 𐑣𐑧𐑤𐑐 𐑪𐑐𐑖𐑩𐑯𐑟" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "𐑖𐑴 𐑷𐑤 𐑣𐑧𐑤𐑐 𐑪𐑐𐑖𐑩𐑯𐑟" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑪𐑐𐑖𐑩𐑯𐑟:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑐𐑸𐑕 𐑦𐑯𐑑𐑩𐑡𐑼 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "𐑦𐑯𐑑𐑩𐑡𐑼 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑐𐑸𐑕 𐑛𐑳𐑚𐑩𐑤 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "𐑛𐑳𐑚𐑩𐑤 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "𐑻𐑼 𐑐𐑸𐑕𐑦𐑙 𐑪𐑐𐑖𐑩𐑯 %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑸𐑜𐑿𐑥𐑩𐑯𐑑 𐑓𐑹 %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "𐑳𐑯𐑴𐑯 𐑪𐑐𐑖𐑩𐑯 %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "𐑝𐑨𐑤𐑦𐑛 𐑒𐑰 𐑓𐑲𐑤 𐑒𐑫𐑛 𐑯𐑪𐑑 𐑚𐑰 𐑓𐑬𐑯𐑛 𐑦𐑯 𐑕𐑻𐑗 𐑛𐑻𐑟" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "𐑯𐑪𐑑 𐑩 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑓𐑲𐑤" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "𐑓𐑲𐑤 𐑦𐑟 𐑧𐑥𐑐𐑑𐑦" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑤𐑲𐑯 '%s' 𐑢𐑦𐑗 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑒𐑰-𐑝𐑨𐑤𐑿 𐑐𐑺, 𐑜𐑮𐑵𐑐, 𐑹 𐑒𐑳𐑥𐑥𐑩𐑯𐑑" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑜𐑮𐑵𐑐 𐑯𐑱𐑥: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑕𐑑𐑸𐑑 𐑢𐑦𐑞 𐑩 𐑜𐑮𐑵𐑐" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑰 𐑯𐑱𐑥: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑳𐑯𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑧𐑯𐑒𐑴𐑛𐑦𐑙 '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑜𐑮𐑵𐑐 '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑒𐑰 '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑢𐑦𐑞 𐑝𐑨𐑤𐑿 '%s' 𐑢𐑦𐑗 𐑦𐑟 𐑯𐑪𐑑 UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑢𐑦𐑗 𐑣𐑨𐑟 𐑝𐑨𐑤𐑿 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑢𐑦𐑗 𐑣𐑨𐑟 𐑩 𐑝𐑨𐑤𐑿 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑦𐑯 𐑜𐑮𐑵𐑐 '%s' 𐑢𐑦𐑗 𐑣𐑨𐑟 𐑝𐑨𐑤𐑿 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑒𐑰 '%s' 𐑦𐑯 𐑜𐑮𐑵𐑐 '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑦𐑕𐑒𐑱𐑐 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑤𐑲𐑯" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑦𐑕𐑒𐑱𐑐 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "𐑝𐑨𐑤𐑿 '%s' 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛 𐑨𐑟 𐑩 𐑯𐑳𐑥𐑚𐑼." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "𐑦𐑯𐑑𐑩𐑡𐑼 𐑝𐑨𐑤𐑿 '%s' 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "𐑝𐑨𐑤𐑿 '%s' 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛 𐑨𐑟 𐑩 𐑓𐑤𐑴𐑑 𐑯𐑳𐑥𐑚𐑼." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "𐑝𐑨𐑤𐑿 '%s' 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛 𐑨𐑟 𐑩 𐑚𐑵𐑤𐑰𐑩𐑯." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "𐑑𐑵 𐑤𐑸𐑡 𐑒𐑬𐑯𐑑 𐑝𐑨𐑤𐑿 𐑐𐑭𐑕𐑑 𐑑 %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "𐑕𐑑𐑮𐑰𐑥 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑢𐑪𐑟 𐑒𐑨𐑯𐑕𐑩𐑤𐑛" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑪𐑒𐑩𐑑, 𐑯𐑪𐑑 𐑦𐑯𐑦𐑖𐑩𐑤𐑲𐑟𐑛" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑚𐑲𐑑 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑦𐑯𐑐𐑫𐑑" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "𐑯𐑪𐑑 𐑦𐑯𐑳𐑓 𐑕𐑐𐑱𐑕 𐑓𐑹 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "𐑒𐑨𐑯𐑕𐑧𐑤𐑩𐑚𐑩𐑤 𐑦𐑯𐑦𐑑𐑦𐑩𐑤𐑲𐑟𐑨𐑖𐑩𐑯 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "𐑳𐑯𐑴𐑯 𐑑𐑲𐑐" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s 𐑓𐑲𐑤𐑑𐑲𐑐" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s 𐑑𐑲𐑐" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑤𐑰 𐑧𐑯𐑛-𐑝-𐑕𐑑𐑮𐑰𐑥" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "𐑩𐑯𐑯𐑱𐑥𐑛" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑓𐑲𐑤 𐑛𐑦𐑛𐑯𐑑 𐑕𐑐𐑧𐑕𐑦𐑓𐑲 Exec 𐑓𐑰𐑤𐑛" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑑𐑻𐑥𐑦𐑯𐑩𐑤 𐑮𐑦𐑒𐑢𐑲𐑼𐑛 𐑓𐑹 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑮𐑦𐑱𐑑 𐑿𐑟𐑼 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑒𐑩𐑯𐑓𐑦𐑜𐑘𐑼𐑱𐑖𐑩𐑯 𐑓𐑴𐑤𐑛𐑼 %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑮𐑦𐑱𐑑 𐑿𐑟𐑼 MIME 𐑒𐑩𐑯𐑓𐑦𐑜𐑘𐑼𐑱𐑖𐑩𐑯 𐑓𐑴𐑤𐑛𐑼 %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑮𐑦𐑱𐑑 𐑿𐑟𐑼 𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑓𐑲𐑤 %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "𐑒𐑳𐑕𐑑𐑩𐑥 𐑛𐑧𐑓𐑩𐑯𐑦𐑖𐑩𐑯 𐑓𐑹 %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑦𐑡𐑧𐑒𐑑" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 eject 𐑹 eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑐𐑴𐑤𐑦𐑙 𐑓𐑹 𐑥𐑰𐑛𐑦𐑩" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑕𐑑𐑸𐑑" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑕𐑑𐑪𐑐" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GEmblem 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑑𐑴𐑒𐑩𐑯𐑟 (%d) 𐑦𐑯 GEmblem 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GEmblemedIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑑𐑴𐑒𐑩𐑯𐑟 (%d) 𐑦𐑯 GEmblemedIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 GEmblem 𐑓𐑹 GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑥𐑬𐑯𐑑 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑧𐑒𐑟𐑦𐑕𐑑" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑪𐑐𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑪𐑐𐑦 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤 𐑧𐑒𐑟𐑦𐑕𐑑𐑕" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "𐑒𐑨𐑯𐑑 𐑮𐑦𐑒𐑻𐑕𐑦𐑝𐑤𐑦 𐑒𐑪𐑐𐑦 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒𐑕 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑪𐑐𐑦 𐑕𐑐𐑧𐑖𐑩𐑤 𐑓𐑲𐑤" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑦𐑥𐑤𐑦𐑙𐑒 𐑝𐑨𐑤𐑿 𐑜𐑦𐑝𐑩𐑯" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "𐑑𐑮𐑨𐑖 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "𐑓𐑲𐑤 𐑯𐑱𐑥𐑟 𐑒𐑨𐑯𐑪𐑑 𐑒𐑩𐑯𐑑𐑱𐑯 '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "𐑝𐑪𐑤𐑿𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑥𐑬𐑯𐑑" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "𐑯𐑴 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑦𐑟 𐑮𐑧𐑡𐑦𐑕𐑑𐑼𐑛 𐑨𐑟 𐑣𐑨𐑯𐑛𐑤𐑦𐑙 𐑞𐑦𐑕 𐑓𐑲𐑤" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "𐑧𐑯𐑿𐑥𐑻𐑱𐑑𐑼 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "𐑓𐑲𐑤 𐑧𐑯𐑿𐑥𐑻𐑱𐑑𐑼 𐑣𐑨𐑟 𐑶𐑑𐑕𐑑𐑨𐑯𐑛𐑦𐑙 𐑪𐑐𐑼𐑱𐑖𐑩𐑯" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "𐑓𐑲𐑤 𐑧𐑯𐑿𐑥𐑻𐑱𐑑𐑼 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GFileIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑦𐑯𐑐𐑫𐑑 𐑛𐑱𐑑𐑩 𐑓𐑹 GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "𐑕𐑑𐑮𐑰𐑥 𐑛𐑳𐑟𐑯𐑑 𐑕𐑩𐑐𐑹𐑑 query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "𐑕𐑰𐑒 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 𐑕𐑑𐑮𐑰𐑥" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "𐑑𐑮𐑩𐑙𐑒𐑱𐑑 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑪𐑯 𐑦𐑯𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "𐑑𐑮𐑩𐑙𐑒𐑱𐑑 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 𐑕𐑑𐑮𐑰𐑥" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "𐑮𐑪𐑙 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑑𐑴𐑒𐑩𐑯𐑟 (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "𐑯𐑴 𐑑𐑲𐑐 𐑓𐑹 𐑒𐑤𐑭𐑕 𐑯𐑱𐑥 %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "𐑑𐑲𐑐 %s 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑞 GIcon 𐑦𐑯𐑑𐑼𐑓𐑱𐑕" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "𐑑𐑲𐑐 %s 𐑦𐑟 𐑯𐑪𐑑 𐑒𐑤𐑨𐑕𐑑" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑝𐑻𐑠𐑩𐑯 𐑯𐑳𐑥𐑚𐑼: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "𐑑𐑲𐑐 %s 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 from_tokens() 𐑪𐑯 𐑞 GIcon 𐑦𐑯𐑑𐑼𐑓𐑱𐑕" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑞 𐑕𐑩𐑐𐑤𐑲𐑛 𐑝𐑻𐑠𐑩𐑯 𐑞 𐑲𐑒𐑪𐑯 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "𐑦𐑯𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑮𐑧𐑛" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "𐑕𐑑𐑮𐑰𐑥 𐑣𐑨𐑟 𐑶𐑑𐑕𐑑𐑨𐑯𐑛𐑦𐑙 𐑪𐑐𐑼𐑱𐑖𐑩𐑯" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "𐑯𐑪𐑑 𐑦𐑯𐑳𐑓 𐑕𐑐𐑱𐑕 𐑓𐑹 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "𐑳𐑯𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑛𐑦𐑓𐑷𐑤𐑑 𐑤𐑴𐑒𐑩𐑤 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑥𐑪𐑯𐑦𐑑𐑼 𐑑𐑲𐑐" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑓𐑲𐑤𐑯𐑱𐑥 %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "𐑻𐑼 𐑜𐑧𐑑𐑦𐑙 𐑓𐑲𐑤𐑕𐑦𐑕𐑑𐑩𐑥 𐑦𐑯𐑓𐑴: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "𐑒𐑨𐑯𐑑 𐑮𐑰𐑯𐑱𐑥 𐑮𐑵𐑑 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑯𐑱𐑥𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "𐑒𐑨𐑯𐑑 𐑮𐑰𐑯𐑱𐑥 𐑓𐑲𐑤, 𐑓𐑲𐑤𐑯𐑱𐑥 𐑷𐑤𐑮𐑧𐑛𐑦 𐑧𐑒𐑟𐑦𐑕𐑑" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑓𐑲𐑤𐑯𐑱𐑥" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "𐑒𐑨𐑯𐑑 𐑴𐑐𐑩𐑯 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "𐑻𐑼 𐑑𐑮𐑨𐑖𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑑𐑮𐑨𐑖 𐑛𐑻 %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑑𐑪𐑐𐑤𐑧𐑝𐑩𐑤 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑓𐑹 𐑑𐑮𐑨𐑖" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑹 𐑒𐑮𐑦𐑱𐑑 𐑑𐑮𐑨𐑖 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑑𐑮𐑨𐑖𐑦𐑙 𐑦𐑯𐑓𐑴 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑑𐑮𐑨𐑖 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "𐑻𐑼 𐑒𐑮𐑦𐑱𐑑𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑞 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒 '%s': %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "𐑻𐑼 𐑥𐑱𐑒𐑦𐑙 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "𐑻𐑼 𐑥𐑵𐑝𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "𐑒𐑨𐑯𐑑 𐑥𐑵𐑝 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "𐑚𐑨𐑒𐑳𐑐 𐑓𐑲𐑤 𐑒𐑮𐑰𐑱𐑖𐑩𐑯 𐑓𐑱𐑤𐑛" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "𐑥𐑵𐑝 𐑚𐑦𐑑𐑢𐑰𐑯 𐑥𐑶𐑯𐑑𐑕 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑝𐑨𐑤𐑿 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑯𐑪𐑯-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (𐑕𐑑𐑮𐑦𐑙 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑦𐑒𐑕𐑑𐑧𐑯𐑛𐑩𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑦𐑒𐑕𐑑𐑧𐑯𐑛𐑩𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "𐑻𐑼 𐑕𐑑𐑨𐑑𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑧𐑯𐑒𐑴𐑛𐑦𐑙)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "𐑻𐑼 𐑕𐑑𐑱𐑑𐑦𐑙 𐑓𐑲𐑤 𐑛𐑧𐑕𐑒𐑮𐑦𐑐𐑑𐑼: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (uint32 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (uint64 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (𐑚𐑲𐑑 𐑕𐑑𐑮𐑦𐑙 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑕𐑧𐑑 𐑐𐑻𐑥𐑦𐑖𐑪𐑯𐑟 𐑪𐑯 𐑕𐑦𐑥𐑤𐑦𐑙𐑒𐑕" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑐𐑻𐑥𐑦𐑖𐑪𐑯𐑟: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑴𐑯𐑼: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "𐑕𐑦𐑥𐑤𐑦𐑙𐑒 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑯𐑪𐑯-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑕𐑦𐑥𐑤𐑦𐑙𐑒: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑕𐑦𐑥𐑤𐑦𐑙𐑒: 𐑓𐑲𐑤 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑕𐑦𐑥𐑤𐑦𐑙𐑒" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑥𐑪𐑛𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯 𐑹 𐑨𐑒𐑕𐑧𐑕 𐑑𐑲𐑥: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑯𐑪𐑯-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 SELinux 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux 𐑦𐑟 𐑯𐑪𐑑 𐑦𐑯𐑱𐑚𐑩𐑤𐑛 𐑪𐑯 𐑞𐑦𐑕 𐑕𐑦𐑕𐑑𐑩𐑥" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "𐑕𐑧𐑑𐑦𐑙 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 %s 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑮𐑪𐑥 𐑓𐑲𐑤: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "𐑻𐑼 𐑕𐑰𐑒𐑦𐑙 𐑦𐑯 𐑓𐑲𐑤: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑛𐑦𐑓𐑷𐑤𐑑 𐑤𐑴𐑒𐑩𐑤 𐑓𐑲𐑤 𐑥𐑪𐑯𐑦𐑑𐑼 𐑑𐑲𐑐" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 𐑓𐑲𐑤: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑴𐑤𐑛 𐑚𐑨𐑒𐑳𐑐 𐑤𐑦𐑙𐑒: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "𐑻𐑼 𐑒𐑮𐑦𐑱𐑑𐑦𐑙 𐑚𐑨𐑒𐑳𐑐 𐑒𐑪𐑐𐑦: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑯𐑱𐑥𐑦𐑙 𐑑𐑧𐑥𐑐𐑼𐑼𐑦 𐑓𐑲𐑤: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "𐑻𐑼 𐑑𐑮𐑩𐑙𐑒𐑱𐑑𐑦𐑙 𐑓𐑲𐑤: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤 𐑦𐑟 𐑩 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑓𐑲𐑤" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "𐑞 𐑓𐑲𐑤 𐑢𐑪𐑟 𐑦𐑒𐑕𐑑𐑻𐑯𐑩𐑤𐑦 𐑥𐑪𐑛𐑦𐑓𐑲𐑛" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑴𐑤𐑛 𐑓𐑲𐑤: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 GSeekType 𐑕𐑩𐑐𐑤𐑲𐑛" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑰𐑒 𐑮𐑦𐑒𐑢𐑧𐑕𐑑" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑑𐑮𐑩𐑙𐑒𐑱𐑑 GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "𐑥𐑧𐑥𐑼𐑦 𐑬𐑑𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥 𐑯𐑪𐑑 𐑮𐑧𐑕𐑲𐑟𐑩𐑚𐑩𐑤" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑕𐑲𐑟 𐑥𐑧𐑥𐑼𐑦 𐑬𐑑𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑳𐑯𐑥𐑬𐑯𐑑" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑦𐑡𐑧𐑒𐑑" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 unmount 𐑹 unmount_with_operation" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 eject 𐑹 eject_with_operation" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑮𐑰𐑥𐑬𐑯𐑑" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑒𐑪𐑯𐑑𐑧𐑯𐑑 𐑑𐑲𐑐 𐑜𐑧𐑕𐑦𐑙" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑕𐑦𐑯𐑒𐑮𐑩𐑯𐑩𐑕 𐑒𐑪𐑯𐑑𐑧𐑯𐑑 𐑑𐑲𐑐 𐑜𐑧𐑕𐑦𐑙" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "𐑣𐑴𐑕𐑑𐑯𐑱𐑥 '%s' 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 '[' 𐑚𐑳𐑑 𐑯𐑪𐑑 ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "𐑬𐑑𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑮𐑲𐑑" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "𐑕𐑹𐑕 𐑕𐑑𐑮𐑰𐑥 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "𐑻𐑼 𐑮𐑦𐑟𐑪𐑤𐑝𐑦𐑙 '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑝𐑻𐑕-𐑮𐑦𐑟𐑪𐑤𐑝𐑦𐑙 '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "𐑯𐑴 𐑕𐑻𐑝𐑦𐑕 𐑮𐑩𐑒𐑹𐑛 𐑓𐑹 '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "𐑑𐑧𐑥𐑐𐑼𐑼𐑦𐑤𐑦 𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑮𐑦𐑟𐑪𐑤𐑝 '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "𐑻𐑼 𐑮𐑦𐑟𐑪𐑤𐑝𐑦𐑙 '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑪𐑒𐑩𐑑, 𐑯𐑪𐑑 𐑦𐑯𐑦𐑖𐑩𐑤𐑲𐑟𐑛" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑪𐑒𐑩𐑑, 𐑦𐑯𐑦𐑑𐑦𐑩𐑤𐑲𐑟𐑨𐑖𐑩𐑯 𐑓𐑱𐑤𐑛 𐑛𐑿 𐑑: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "𐑕𐑪𐑒𐑩𐑑 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "𐑒𐑮𐑦𐑱𐑑𐑦𐑙 GSocket 𐑓𐑮𐑪𐑥 fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑕𐑪𐑒𐑩𐑑: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "𐑳𐑯𐑴𐑯 𐑐𐑮𐑴𐑑𐑩𐑒𐑪𐑤 𐑢𐑪𐑟 𐑕𐑐𐑧𐑕𐑦𐑓𐑲𐑛" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑜𐑧𐑑 𐑤𐑴𐑒𐑩𐑤 𐑩𐑛𐑮𐑧𐑕: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑜𐑧𐑑 𐑮𐑦𐑥𐑴𐑑 𐑩𐑛𐑮𐑧𐑕: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑤𐑦𐑕𐑩𐑯: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "𐑻𐑼 𐑚𐑲𐑯𐑛𐑦𐑙 𐑑 𐑩𐑛𐑮𐑧𐑕: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "𐑻𐑼 𐑨𐑒𐑕𐑧𐑐𐑑𐑦𐑙 𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "𐑻𐑼 𐑒𐑩𐑯𐑧𐑒𐑑𐑦𐑙: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯 𐑦𐑯 𐑐𐑮𐑴𐑜𐑮𐑧𐑕" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "𐑻𐑼 𐑒𐑩𐑯𐑧𐑒𐑑𐑦𐑙: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑜𐑧𐑑 𐑐𐑧𐑯𐑛𐑦𐑙 𐑻𐑼: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑕𐑰𐑝𐑦𐑙 𐑛𐑱𐑑𐑩: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑯𐑛𐑦𐑙 𐑛𐑱𐑑𐑩: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 𐑕𐑪𐑒𐑩𐑑: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "𐑢𐑱𐑑𐑦𐑙 𐑓𐑹 𐑕𐑪𐑒𐑩𐑑 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑯𐑛𐑦𐑙 𐑥𐑧𐑕𐑦𐑡: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 ·𐑢𐑦𐑯𐑛𐑴𐑟" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑕𐑰𐑝𐑦𐑙 𐑥𐑧𐑕𐑦𐑡: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼 𐑪𐑯 𐑒𐑩𐑯𐑧𐑒𐑑" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "𐑤𐑦𐑕𐑩𐑯𐑻 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "𐑨𐑛𐑩𐑛 𐑕𐑪𐑒𐑩𐑑 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GThemedIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑙 1 𐑒𐑩𐑯𐑑𐑮𐑴𐑤 𐑥𐑧𐑕𐑦𐑡, 𐑜𐑪𐑑 %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑𐑲𐑐 𐑝 𐑨𐑯𐑕𐑩𐑤𐑧𐑮𐑰 𐑛𐑱𐑑𐑩" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑙 𐑢𐑳𐑯 fd, 𐑚𐑳𐑑 𐑜𐑪𐑑 %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "𐑮𐑦𐑕𐑰𐑝𐑛 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑮𐑪𐑥 ·𐑿𐑯𐑦𐑒𐑕: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 ·𐑿𐑯𐑦𐑒𐑕: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "𐑓𐑲𐑤𐑕𐑦𐑕𐑑𐑩𐑥 𐑮𐑵𐑑" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 ·𐑿𐑯𐑦𐑒𐑕: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "𐑨𐑚𐑕𐑑𐑮𐑨𐑒𐑑 ·𐑿𐑯𐑦𐑒𐑕 𐑛𐑴𐑥𐑱𐑯 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕𐑩𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 𐑞𐑦𐑕 𐑕𐑦𐑕𐑑𐑩𐑥" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "𐑝𐑪𐑤𐑿𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑦𐑡𐑧𐑒𐑑" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "𐑝𐑪𐑤𐑿𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑦𐑡𐑧𐑒𐑑 𐑹 eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "𐑒𐑨𐑯𐑑 𐑓𐑲𐑯𐑛 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "𐑻𐑼 𐑤𐑷𐑯𐑗𐑦𐑙 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "𐑩𐑕𐑴𐑕𐑦𐑱𐑖𐑩𐑯 𐑗𐑱𐑯𐑡𐑩𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "𐑩𐑕𐑴𐑕𐑦𐑱𐑖𐑩𐑯 𐑒𐑮𐑰𐑱𐑖𐑩𐑯 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "𐑬𐑑 𐑝 𐑥𐑧𐑥𐑼𐑦" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑻𐑼" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑣𐑴𐑕𐑑𐑯𐑱𐑥" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑦𐑯𐑐𐑫𐑑" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "𐑮𐑰𐑗𐑑 𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 𐑛𐑱𐑑𐑩 𐑼𐑱 𐑤𐑦𐑥𐑦𐑑" diff --git a/po/en_CA.gmo b/po/en_CA.gmo new file mode 100644 index 0000000000000000000000000000000000000000..21969c932369d0d8741ff24f471efe500d00c242 GIT binary patch literal 32443 zcmeI44V;`+eeWM=08I!41@gwr6T)V9LuRv^gb;Q^APJig@+#Q`D4}6?=GoaHGxH4d z%w)5?*kZL*=&gcKO0~YwUTXCgtydARctLB?wt{G{xAh80MXD{=TD;O~^-90LbI$Y3 zGn3sAZSUvf=XU0kv)||Cyr2L1pZ__}IeGSVGw$*Dtvkl^&VVP*^t=yo{o~i`spmbs z!1HwZ33vj0!tpDP&%jwcf5F|q1m|%7LwGfuxzO|W!#vEw&%$1~gv1o@F1SSR;i>Qr zcpiK&?15i^K71Jx)I0r5&sz*v!1-`5Tmh@_Lil@d5qt)&g0H~kaMf9ag?Xs(H$kQM z9_Yi5Lgni#Q0cq^m%)W+dtMj33@V=$cn-V=%KyVq>3swGa0Y+Y!!G!4Sb)6pj>ppw zTmt*xC|nBfboYBWaPL0|Pvid2A)?_u2NmCspbzKJ*a|-Y75{cP7v|mbn;n1K@uTkjQ;@3g zz73U+Su~2mErrU*1}HhnL;iVhk7Q2ujJ{%(S* z?|Y!y@hR93UxAXpeuP*4u6KMhT*v*pAw~6`feLpVi7CIUpz3`$Bx&y*kS6jz1=TL! zfEoB2{;0pKhRWCFQ0bK*NqY~t`!7MdiZ_cyxb%7;NqT$X?eI;ICiG_0_-tD*lI|^7Fso8aRVOD!q%K@-+d8%KKd?e_wzK_fK#(oQII9d`sZTa2V?O9;kG3 zQ2DqGN=_bxl8Yyy^8I&^CiUhb!3h36=j(LAC$aq2%L7kgRy~>2xaZRyYE0gqz?O;YILtI?XmX0u|r; zpyGQ1DxcqlD%Z)YZMqjhm1`7Ae(!*ivj?HVJr0%bw;@IH7F^(YYvFdNdc7U0{{9fE zU7mufmzgxy>)Ct^f{((T z@L9MK_N}-1sKK+jzXz&aKL!=FFXT250$=msrl!f2h~1RsQSGFD!tFa+3*KY@_PKR z?RRV7N!)LNXTqzX>ir;8dhdmb?_+Qge9GN_4=VlHG`7Moh3CKv;kj@hR6E}amB0I- z>i@HFA^Z-M|JQD|@h*e%zXM7>$Ds0YGwgy7K-KRTpz8lw_xvZ&=l7fhL6JiaQ+T!w@kub?!N{V?{Nsf>S;cd99#m= zgL_~PycPQJ15ow-7jQBB7Mu@f?XvaX1yNbvRd5l!3rbIY6!ycvho{4ZZ?NH4K&7`A z`tSf$zJ3ELorj?6*3Sz-SDj4wjDkNhq!+R z_QClhR$ecIx{sjR^M3dIlThjXEzH8%d#t_-;VSMQf-B&QQ2Otzy*Aye;U(O^6Dqx@ z;gxV6f5a+(2H@x6a`-P$9K8Tl zZ!><;)`t%ze;c6QkHXX7t#ARn7b?DwKp%b%D*U&h;-7JimFI;}&sRF`bUXm(^87Za z{{0@PbUx#r{|#Kk{SV=MxNx6suk)e8?T6||6HxE(foks$!G-W?sPI34^1t9(>u&`d zM!4c%GWX1+4L5}rQBcZ?tdMg!To2T!hId8Kh4fsd+$Ohx%w>B^B3VtICs?c zi>+`G_aRh%?u2XLC!xyseW-l(V9_`@d3@Q*)hZ}`u;1O^110Z|LCM)m z@Emwj#rE$3cnbHMp~`(VRCy+$58nyZ4v#>E{|Z!ozX#R+$A#9v50$SCQ0a|B)%Sf+ z{qH%LfeWj)ezriB>t;9v?}k2n3U!EkhrgJJh zmD?e>74Cv+mv=#>{|R_0{3cZU^iJ6Ny%Z|FUxBmXAHxCoD4YXdf+xXa57~Zn3Y2^< zhf42isQ4;S_4`(L|3RqqABPJ6JXHOB52}4mo3!mb2$jDppz8k?sDAqZl>g5_#rp!B z3s1Pw%IDco`8Xd+zV<`a?^~ec^cwUO80c!d>$BC(L;Vd_n(8?ac9P! zx&C#W@~+>PEWFd)`%iNJBlm37Q9um6UvT$};D5or)!n}gKZd&;Hy`%}+#vCt5B2*8 z3-8Yz{|>4z=(ias`CE?rGn{_AalfJqem%sq5J$6kU&WoQhx|T>`#-p4yi5OHbT>av zJv;+H>WjaPlMLwh-z_}E)cl6{`;faM{q@XNT*;x5IV$g_9ACvf_G1$UvjvVYF!{VFb>!AXz( zwSDaM@w~wGZSMXXa06~R&)?>rz2LYQ9?SE4-Mw%v?kRVlgAcgt5yu$nJMVKh$H9M& zU%+FCb0seRjdAhIxNh9O_#ymVcl}=YcHFr*t(RX9S3^`q^1H%asZakc?)AJs9`_-x z*W-Q<_g`^qaToG@82Y&1z#Yf^AH$R2@le0}EsV}s!1YYtErVC#et)2h`R)*-y)u$WiO2meTD0naQ_MSe{pMhuiw{j@5Y^ty8-uR z+yw4_<354Y?*q8^<9-u&7w(%l{l1G^Do0#T!+*i)w}ksF>~(3J#Pu(5eFj{J({G7| z_dD=Z+$p>tfHUB@p25eUey4MNx4ra2_&2yW;@03kj{6_DbMf<^Vf-85{yuKL=pKB^ zalhj)!9jQZTKsO~dX~FC7GA)!@8}uSZ;yrfdl`S9#jU`-);wV?6`qXWd*JtRbGTlB zdzkC3xB&MPTn6_D?vHSf&(aQeLk_i1y5y$b&n*Ngih zZXRwD7vc1K68HD!%8om~%JsW&E6A6AAHnr={VjMv5BROby@qEMxC=ML^|#@BaQdCY z{nCYa(2>$8x0D@il43cK`AH)mAYTamV={? zxjr5=&&5~xVa@Nk_?q)F z*XE0bVmV8-aDypv@Z@oVnh6l>o+5tS*{5@A} zv8BqEYC$$X=?903Q9bh3SF5FBE?X~#6@O<{hz7m&Q55Ei_F)e1=B=72YE-LXtxmdl zr(ssE@YdJswc==_9@yx^v80@)5*2DJY*g|ok2G^5NQzPkE14a8wr%q^WOD}^RUa`mt_>4yiAk>ob*XX-a9N#HjkLT%r&eVFJfW5q(F zX3K}L<$2Q;4dUX+QbDq*n)>NN=7Z=!J#-~Y;?9RibuByLt37-qxUjz%?nlHcm7ug= z5BHafm0*8F{Z?N z8r>@&HbzTS)OXiukFvMX zHja;ODig6(t`yX5>4_toG6Sn$&BvOQhgvWe)KIu8 zR;F($8Z#e~vc#q`pYekzm#vb+B!+C{FX3*; z+Za~r*`iTbWi$j*kd#WgN$-(?NSbM^7M4><#{!@f(<4Zto(S70*@8;Fn)d7}xj{#v zOrO*6k%KAPeQG|V;3_(yZl zY>i5A2v3LvjhP+Oc&gzhxS^3PMSfH)P_51Jl{QWkxw`BSQj&UPy2}w$Aos<*BrzA3 zO)e1iYAwtKQ6$;mH9ae*8aS$G+VgXifm%#}BUMP8-Nb6h#6xF2Tj)EQ)QsU^26jT2 zo*gGHc{ySX*J~8FO`?{TqD4I*j5K)efVA7%BS$bXF41k4q1kq?-cT|X;xQUIs258m zn}v++OA~ZZm93N|lW~!hM~2}e)aWuS3M+0#4+KUOO!c%DE!GvJpn6-|6)j)ajMv#W zGU!Y`Q&wG1&{yd5*UG9{*V_!C>;~m3x(0!B{m9rSNIlhrj;>~N0sf~R9sIO@_J*AW zX?nb3&Zz|XWj+RusT4*(G;y7{O{>M#Ba2OqK5ck9Q_62^EZ(rmKG8~Jb}t#~MkNPm zW7^VK+B`3!@3XaF(5g;<$qkLLKIAVc=}$p_vehse@`i03KSxS_xPnf?!lH4gBwL-{ zaIL1sqHd)cq=t>IY<=9Q6c42zqq6JrE_1-B%<5$7b-p1hNdn-;jMTeAP&Xl!P&66U zgEC!bEKK<*Wf}Cx6+y~YO1&><59nnySso2Bml+}}2hy*@gL>Uo5XLPTaDJB^HQ}J| zir##ciX~P+i7{kkY6=f#+>*Ra^DgyRrjfE18q;3Zkga5me{q)ElS$rb&}}PI%e%G~ zs$nlpRS(H?4D7h|+A1*dg84ve9iA#fQk>mX>FA2~IZevEB+HzjEx&Xm({kvO!`@h- z2oA}7k(rZ>e{EHZwPD03oTvn~RO<0_V|p>lY3kIh;rJ~w(^lBS-kA1GCc!R%YbXq= zM0VR7s^uMKajsUZ($P|xsMoTQ5$m?XJ0o|BDzzgEV|cYlwhI_ag+?h`lX9lzs3#ug)yD>HDG@>!&ni(rK z(jjYTPzr+$*H#e|%{NVHmh~A|jj40gN^DLt_cp>B(3uPS8x^%}PcQQnbPJEDj7{cJ zX;DQo`nhWD(tb}@)SLEahDjp@R`kYZRr|VH#Ojuw(e0_#Vb#Z4z`sPf{CEWw!-jyPQ=Xj;jv&sm&)NUc4^k>_X#%$Htzw{#6R>M!V4C%zFx%>o%{Q zHK#Qs?=loja|zQd+c3LPk<7w^Ce1~Oq!}^PI^LG))`D6m1yguynKW#1OX8b%V{DAD z+-;UgOGV~O@vB7bm}PLkM~mRfoHTMgZR(xY_fdOnuokm&#Zkm4kE>Tr;n8M{H3GBT zgw@nEsI5>YnViCIQd=eO)i0)epfNJ87rXi)Z>IOekH=YtY6*KFV5z^|S3Hy)_CiJ< zqcnwJ6)BE0I+{Ycn%1ITtzZ{Z4w}Vg85XkNQ+aRt4JrqVwXh<=YV~1FKeyIcVAZse zWM_gQOs$_-1}5ZI%4rmelXSX*T|R3ryO9y>Rp|yykH9-TL^1wCV?!q8mS&j3yQIxo6mMbY#`((s9_PZy3}{1NdLW}(VB(LNGf;EWY&V}nkh1& z`msf`xkxN*ikz{LRkOv~GF$9rcKyJtT}=^LqmnExCf~kH{?rksHCA_3dxE0Lp`iL+Z)F)&hm=#>RCY@B2wtq;@GgP(C$$L27t@Qn<3+|~YTK-swhwjQt3|f1TOFi(dFm^y><#H6 zW91kb)QVnP#HL@_<%TiVftf3tiYN&kBUeKvmbbmoME@Ds&z8#9DN0y zdI@}DoMu8bOBY+6An9(7*GAp670KHf+cc)9H08bd+^ik4cpsGX^>U{*>=-eownmIu z#zII^pdEuVq4%u4>$MAnbDtNm*joyQpz&B4o9xZWGoJP45H?^2&K z((LDar_I!UWRq0~wV@{qt2K}M5N+#~mv)_|*?6o}=v!B_fp(9F6Z+upYc}c@#Ujr< zZG93pYJ6^U4MtnE8LGQmThb-qQ_9-peyuHf&d2oDu=6lQ-04Ne_5zGF*T=Bl%oqIh zBgNJg%95`heH$iM?UuAw?t0&hzm&KDr#To}d>B!0$QG41|wb6k7 zq#o#2g=~jZ_pmz7j3v1~zh^`r1Qbs16iaV9n)DYFzk6Rw2^}G*Vlq<+zsIbDm~U)| zTUcrNHb6q89qatKEc&!-R5O095tdT6QEL#Y-FZIjxv6vd#%L6lw5p)|i7#(F#I~{YtfENr-IfV`^(~lKHeM~h^jr`^5BiclXfaeA8cbI3dKMt4rLvWXvMLu*Nw!V)J>#r zy9@o+&T?%hBcS{4E>B61O?7Wd(cT;ORAitiWwT#|E0a3oC0Q{B_0&G3?A1$6^|bjj zJ0=*nvyBp;!c8S6Hab=gA90Z-vze(G_Y`4FJ08iqB$D9(kw`Lax3zd}@gfG=Y)~>Y z8uq?e6D4IO9Tp&Dmdg%}rXny#jY%fu*Cwlcx*CWlqV1!fx@i3I%5?8N$(Ln6$kx<9 zD)~$}mT@haer-PVFgCR8Z7~~%_E#B!SW1vFY9>O-x)0+>dVP{CCpin^_#!ft(|X;j z2Dd9WQ^hfnE!L~WJdv2ios<`uF=pU*Us&5q9lu{@K4BW4aTdw#feK#=e4ACf`l<4@ zl*#Toh`lyH&csigd>O4tgSU=?h%Wt)MMz99GsmHQLR3Kwjf}mKF)G#$s^rFu-rk-l zTL=cdz2=LeCLTsUTb8vGn=_(OSpzgyCjsK!G*eFgWRquQ6_aYF}VIPxDraNQGC`Vd)mL-dOSpN8b$WDycUf9Lna|bWoHVJ&U`$hLj?0L;WBAH#+7@I5EaIiL0<1b|yR|D8 zZB>%Yp2G5|_Nd8r##E>T6Gm5zF+Wwbv>40ZNfWTkw5Pu}dG1!761!a*C)v?vW&+++ z-74um#Y40a>wg7|2I`BN)f8giF6DS%HIa_gJKMkY-gGlNSyNvryVVEn|0Nq!RAB4_ zDK)#Cq#LQrB%~Wa&F8P)DW6_z+P=MnalCPO@}>+lMxCy)(@?sf`NE13!Y4@vbk7w< zVn14xq2b?j3o1Oz-VCg`ntN|n$<;DpP1{Zn^A+am$cyV(5gkOfg0^s>e)g@r-~!LB zK|ATxVh`Pf7LC8$YK776ePNyMU@>e&rAc~vzy_l{S#?_q^DPC!^s<|E?RG_%M3Tey z8gjcqk+4>!lI#*?#gNIC9cB=iD#dg=;n-p5C7F-~r)|JyMx$=ftYkbL_5r%7P;8B> z^Je{)4Rx^vYt@y9Wx{50%rvT$*@M@N--=tTr9xurDQ6EA%Z;+nN_tXYzSp|%@`vwR zmK7e0M54j?a#C(r>Qm}w6^5bQu5YJX11%iqWT1ape?Q$*%FvAGsS47X7)no>h_vdZ z_gWOZh)BfwOQQsk`CphUCn8ymxvP* zh8SwO(vGXL1u|9xPF3N%YN5uY%$9s+uifLyb^_LZW?m6!gMDUuR4C>%8ybZuGr~rt znY(t5WHw3#pw2Uwq6r5575xMKnf{fT6|4P$fx%U4GX1Oi`|+5$g5Iu;8i~LD^E3Tx zGAl0d2UZWRAdLKNV|QO>gl--&{nwt6^?5#&T^STB7-iZZy*A5(iAxHVupIP-wZb}r zR0<8u$jk_sUo%>)&)ijF+kPptiGhWQUZrYoql;FsqG&EJ>Z$mP zF7gL@hh}=6Ln~6LMlaY&jnzv>I&LFvV!p{H6F)O5D|qM73M-UmwE7QsXhk!Pqd0&f zJ2Q1^1Rwc9zi;!eM$K5p6(_XsB@ zm<-t?Gszj0pCL%+*h=Tv%Jj!hI>%Oi#~ZhJGNY9KB(A(7WN=B%L<)iE9R4f zrVy#>VK0L@0GfP;vb7d(@^5|_vCo+S|J#qPw6#!j_M|Nj$@9*!74y}tb8N*_1A7Vi znx|e`51nWNtpg{`10(w1)yxK#c%QFccaE*F%Yg0ZontHJysMF#=JAx4J%g#^ zEZTU^KF`jv74zRuCfnbd+f1iEwqo{RcFwJ&{&SqRtxqi{QU2eYTQP0mK1lhUgDaR) zor5b{4`OFt=io}`;EEXlQ%5}hV;@{$6IXo1CD}Y5pFLq8u{JiE{{=`pYdZ&5bl||8 ybLkvh=^R|?99(fH2fWU~6&-5n99(HT-qJa^VoxG=4z85_&cT(Qi~s*Rxbm;RK +# This file is distributed under the same licence as the glib package. +# Adam Weinberger , 2004, 2005. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-08-27 16:20-0400\n" +"Last-Translator: Adam Weinberger \n" +"Language-Team: Canadian English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unexpected attribute '%s' for element '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribute '%s' of element '%s' not found" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unexpected tag '%s'; tag '%s' expected" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unexpected tag '%s' inside '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "No valid bookmark file found in data dirs" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "A bookmark for URI '%s' already exists" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No bookmark found for URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "No MIME type defined in the bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "No private flag has been defined in bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No groups set in bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "No application with name '%s' registered a bookmark for '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Failed to expand exec line '%s' with URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversion from character set '%s' to '%s' is not supported" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Could not open converter from '%s' to '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Invalid byte sequence in conversion input" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error during conversion: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Partial character sequence at end of input" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Cannot convert fallback '%s' to codeset '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "The URI '%s' is not an absolute URI using the \"file\" scheme" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "The local file URI '%s' may not include a '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "The URI '%s' is invalid" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "The hostname of the URI '%s' is invalid" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "The URI '%s' contains invalidly escaped characters" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "The pathname '%s' is not an absolute path" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Invalid hostname" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error opening directory '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Could not allocate %lu bytes to read file \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error reading file '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Failed to read from file '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Failed to open file '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Failed to get attributes of file '%s': fstat() failed: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Failed to open file '%s': fdopen() failed: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Failed to rename file '%s' to '%s': g_rename() failed: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Failed to create file '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Failed to open file '%s' for writing: fdopen() failed: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Failed to close file '%s': fclose() failed: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Existing file '%s' could not be removed: g_unlink() failed: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' invalid, should not contain a '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' does not contain XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Failed to read the symbolic link '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolic links not supported" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Could not open converter from '%s' to '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Cannot do a raw read in g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Leftover unconverted data in read buffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Channel terminates in a partial character" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Cannot do a raw read in g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Failed to open file '%s': open() failed: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Failed to map file '%s': mmap() failed: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error on line %d char %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Invalid UTF-8 encoded text - not valid '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error on line %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Character reference '%-.*s' does not encode a permitted character" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Empty entity '&;' seen; valid entities are: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity name '%s' is not known" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Document must begin with an element (e.g. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Odd character '%s', expected a '>' character to end the start tag of element " +"'%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' is not a valid character following the close element name '%s'; the " +"allowed character is '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' was closed, no element is currently open" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' was closed, but the currently open element is '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Document was empty or contained only whitespace" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Document ended unexpectedly just after an open angle bracket '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Document ended unexpectedly inside an element name" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Document ended unexpectedly inside an attribute name" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Document ended unexpectedly inside an element-opening tag." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Document ended unexpectedly while inside an attribute value" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Document ended unexpectedly inside the close tag for element '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Document ended unexpectedly inside a comment or processing instruction" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "corrupted object" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "internal error or corrupted object" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "out of memory" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "backtracking limit reached" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "the pattern contains items not supported for partial matching" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "internal error" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "back references as conditions are not supported for partial matching" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "recursion limit reached" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "workspace limit for empty substrings reached" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "invalid combination of newline flags" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "unknown error" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "unrecognized character follows \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numbers out of order in {} quantifier" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "number too big in {} quantifier" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "missing terminating ] for character class" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "invalid escape sequence in character class" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "range out of order in character class" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nothing to repeat" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "unrecognized character after (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "unrecognized character after (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "unrecognized character after (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named classes are supported only within a class" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "missing terminating )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") without opening (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]digits must be followed by )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "reference to non-existent subpattern" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "missing ) after comment" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regular expression too large" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "failed to get memory" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion is not fixed length" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "malformed number or name after (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "conditional group contains more than two branches" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "unknown POSIX class name" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "character value in \\x{...} sequence is too large" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "invalid condition (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "recursive call could loop indefinitely" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "missing terminator in subpattern name" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "two named subpatterns have the same name" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "malformed \\P or \\p sequence" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "unknown property name after \\P or \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern name is too long (maximum 32 characters)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "too many named subpatterns (maximum 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "octal value is greater than \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE group contains more than one branch" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "repeating a DEFINE group is not allowed" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inconsistent NEWLINE options" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g is not followed by a braced name or an optionally braced non-zero number" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "unexpected repeat" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "code overflow" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "previously-checked referenced subpattern not found" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error while matching regular expression %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE library is compiled without UTF8 support" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE library is compiled without UTF8 properties support" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Error while compiling regular expression %s at char %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error while optimizing regular expression %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal digit or '}' expected" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimal digit expected" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "missing '<' in symbolic reference" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "unfinished symbolic reference" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "digit expected" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "illegal symbolic reference" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "unknown escape sequence" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Error while parsing replacement text \"%s\" at char %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Quoted text does not begin with a quotation mark" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Unmatched quotation mark in command line or other shell-quoted text" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Text ended just after a '\\' character. (The text was '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Text ended before matching quote was found for %c. (The text was '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text was empty (or contained only whitespace)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Failed to read data from child process" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Failed to create pipe for communicating with child process (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Failed to read from child pipe (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Failed to change to directory '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Failed to execute child process (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Invalid program name: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Invalid string in argument vector at %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Invalid string in environment: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Invalid working directory: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Failed to execute helper program (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Failed to read data from child process (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Unexpected error in select() reading data from a child process (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unexpected error in waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Failed to fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Failed to execute child process \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Failed to redirect output or input of child process (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Failed to fork child process (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unknown error executing child process \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Failed to read enough data from child pid pipe (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Character out of range for UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Invalid sequence in conversion input" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Character out of range for UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Usage:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Help Options:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Show help options" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Show all help options" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Application Options:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Cannot parse integer value '%s' for %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' for %s out of range" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Cannot parse double value '%s' for %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double value '%s' for %s out of range" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Error parsing option %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Missing argument for %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Unknown option %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Valid key file could not be found in search dirs" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Not a regular file" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "File is empty" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Invalid group name: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Key file does not start with a group" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Invalid key name: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Key file contains unsupported encoding '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Key file does not have group '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Key file does not have key '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Key file contains key '%s' with value '%s' which is not UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Key file contains key '%s' which has value that cannot be interpreted." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Key file contains key '%s' which has value that cannot be interpreted." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Key file does not have key '%s' in group '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Key file contains escape character at end of line" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Key file contains invalid escape sequence '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Value '%s' cannot be interpreted as a number." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' out of range" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Value '%s' cannot be interpreted as a float number." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Value '%s' cannot be interpreted as a boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Stream is already closed" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operation was cancelled" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Invalid byte sequence in conversion input" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Operation not supported" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Unknown type" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s filetype" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s type" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unexpected early end-of-stream" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Unnamed" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop file didn't specify Exec field" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Unable to find terminal required for application" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Can't create user application configuration folder %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Can't create user MIME configuration folder %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Can't create user desktop file %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Custom definition for %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "drive doesn't implement eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drive doesn't implement eject" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "drive doesn't implement polling for media" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "drive doesn't implement eject" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "drive doesn't implement eject" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operation not supported" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Containing mount does not exist" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Can't copy over directory" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Can't copy directory over directory" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Target file exists" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Can't recursively copy directory" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolic links not supported" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error opening file: %s" + +#: gio/gfile.c:2906 +#, fuzzy +msgid "Can't copy special file" +msgstr "Can't copy over directory" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Invalid symlink value given" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Trash not supported" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "File names cannot contain '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volume doesn't implement mount" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "No application is registered as handling this file" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "File enumerator is already closed" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Stream doesn't support query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Seek not supported on stream" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Truncate not allowed on input stream" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Truncate not supported on stream" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Input stream doesn't implement read" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Unable to find default local directory monitor type" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Invalid filename %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error getting filesystem info: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Can't rename root directory" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error renaming file: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Can't rename file: filename already exist" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Invalid filename" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Error opening file: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Can't open directory" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Error removing file: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error trashing file: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Unable to create trash dir %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Unable to find toplevel directory for trash" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Unable to find or create trash directory" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Unable to create trashing info file: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Unable to trash file: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Error opening directory '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Failed to read the symbolic link '%s': %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error making symbolic link: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Error moving file: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Can't move directory over directory" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Backup file creation failed" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error removing target file: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Move between mounts not supported" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attribute value must be non-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Invalid attribute type (string expected)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Invalid extended attribute name" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error setting extended attribute '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Error stating file '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (invalid encoding)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error stating file descriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Invalid attribute type (uint32 expected)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Invalid attribute type (uint64 expected)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Invalid attribute type (byte string expected)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Error setting permissions: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error setting permissions: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error setting owner: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink must be non-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error setting symlink: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Error setting symlink: file is not a symlink" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error setting permissions: %s" + +#: gio/glocalfileinfo.c:2149 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "symlink must be non-NULL" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error setting owner: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setting attribute %s not supported" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error reading from file: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error seeking in file: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Error closing file: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Unable to find default local file monitor type" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error writing to file: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error removing old backup link: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error creating backup copy: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error renaming temporary file: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error truncating file: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error opening file '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Target file is a directory" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Target file is not a regular file" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "The file was externally modified" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Error removing file: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Invalid GSeekType supplied" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Invalid seek request" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Cannot truncate GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Memory output stream not resizable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Failed to resize memory output stream" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount doesn't implement unmount" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount doesn't implement eject" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount doesn't implement unmount" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount doesn't implement eject" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount doesn't implement remount" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +#, fuzzy +msgid "mount doesn't implement content type guessing" +msgstr "mount doesn't implement unmount" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement unmount" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Output stream doesn't implement write" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Source stream is already closed" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Error reading file '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error reading file '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Error removing file: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Source stream is already closed" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Error reading from file: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Unable to create trash dir %s: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Error writing to file: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Error during conversion: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Error truncating file: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Error opening file: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Unable to trash file: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Error removing file: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Error opening file: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Error closing file: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Error opening file: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "association changes not supported on win32" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Error removing file: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "unknown error" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Stream is already closed" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Unexpected early end-of-stream" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Error reading from UNIX: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Error closing UNIX: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filesystem root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Error writing to UNIX: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volume doesn't implement eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume doesn't implement eject" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Can't find application" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Error launching application: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs not supported" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "association changes not supported on win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Association creation not supported on win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "out of memory" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "internal error" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Invalid hostname" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Invalid sequence in conversion input" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Reached maximum data array limit" + +#~ msgid "do not hide entries" +#~ msgstr "do not hide entries" + +#~ msgid "use a long listing format" +#~ msgstr "use a long listing format" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand is not supposed to be an " +#~ "entity, escape it as &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Character '%s' is not valid inside an entity name" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Empty character reference; should include a digit such as dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Unfinished entity reference" + +#~ msgid "Unfinished character reference" +#~ msgstr "Unfinished character reference" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Invalid UTF-8 encoded text - overlong sequence" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Invalid UTF-8 encoded text - not a start char" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "An array containing the icon names" + +#~ msgid "name" +#~ msgstr "name" + +#~ msgid "The name of the icon" +#~ msgstr "The name of the icon" + +#~ msgid "names" +#~ msgstr "names" + +#~ msgid "An array containing the icon names" +#~ msgstr "An array containing the icon names" + +#~ msgid "use default fallbacks" +#~ msgstr "use default fallbacks" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Error stating file descriptor: %s" diff --git a/po/en_GB.gmo b/po/en_GB.gmo new file mode 100644 index 0000000000000000000000000000000000000000..726ebbbf910765c11fd08936de3fd41d6d39aa0b GIT binary patch literal 41565 zcmeI537lO;o$n8zfYAtqkg$Ys5=gomayu&!y0Z|HPH4$S77`#3Z}&ajed)V#mvlOS zq97uO7zn{A0y>J%g>k`g22h{7K6M25aREmZ&~aR!E6Vu3zp6URy?r}`kNSq^>-+gs ze@~rLr`CV{YdzJEPI%sJ9>2Q}^1LZ<%6QL99So1xUC(=Xy5}7YzYGt9k30U<@i&f7 zJ3jwp>ux-JA?}ZH_G$1)>}~Ku*a5f0JunS_4UdBtoZ@*W!4hnPuZIf%0XP$W37!Lg z11G_SGdyoITn8t@x5Lxm1F#i70eyG`FP{MCK!WmCLxop@li>|;9(*f23w|9=gGaP@ z-U2um&W3$Z;qHa=;k{7deIL$+;|VkcmqNMELxuNdsQ7&x`tTc2>H8g2yryB{(pwB? z!9GaTy;~ts@$QFYvG?zehn#BPp9vMu_0Wf9xD4J3?}T56if@%jDqnAeo$%eT9X<(h z;!Pq@*_Xj%VF~K~YoNmaAWXyWz?E<@iB!H^3zcv8!w&eLP~o@W+1W4)72dnx7WjnY z5;8~mwHGR%KF1%W_xErqoI1zzPKTGmZny{ThL1uYmUvnDxf@P}_dv<-r=imO7*sm` z;OrBK}~_)z|ILLaV&djE2$ z@Na^WtGBuPA9nmV$6rIm??^IH@3ld>?}94lOWggdp~AnzJ%11?eqV(X;cuY)8AoRM z@MI{tUI7)4OP#$2_1?`85%S&-DJt(fP~pDd49`0ePJ?=XDWs^q3!$E02Nlmdq5OHk z-Ty9>`(Hzq|BKJGa?}keDsLxLeR?O9yB|0{4VPe_ywLNg%H9P~_2deuc-#f4Qr<@( zBI7*{l@Al~O!6@wDjgN5_umX9Kc9d~*N@=Qa1xPHd{2ek@>WC1^>xnveyH;Q3DkRs zciQ@V2D|}#50w1>)ZL%B$kzL_q2gPG^8XD`@p%9eRquyT;hnhH#%l{yI(z!TuR;fe6GkgDxH4wVm+mwVnO zxDuWV-vp(nehA58@3a+^JQ{hfH6W$Kx??<7+{XIMm z9!;W@|0$^Q+X9b*m%)?al~C!p8!DY2gKOdVZqIuk+y-~a{t_F%>mBcgGr0dRP;&by zlpIVx&&pdDL`8TdXTJxcqP;IemG?mergR+xPlKzV4=Ygq?t#jm2cYujoA4O;6jc0= zTw~>7I#m2Sq2%RasQfEIAKn5bH}^sL_eH3D_%T#I{RztbWD>3NI}1vlE`b*aJ^`1) z!_K$zxeBUY?0|~*O;GZDH&nbo3>D6!Q1W%?2K!zIY{j01bKosd`TR+!{Q5amz8ta9 zmRBp3JZ*$T-77K*jTwupQn9=flUK@_W(+Hh)$?r9Xf#gs*@{!<(Su^%gi0ehwmP z-Xl=u-nPZYb0wtedY40m{~@Sy`!ZDcOcP3PLOW;Yc z7y9rT$G16t8cy}7pYRO${Is<%g0rw+?CjUWy$5;TJD}upNw1an4UQK%_BdYVSa#e6 zCD*TX_SZql-(HAlc<+ED!8<5p`_*Z99QIE_#s3kga(x;q{FcDxYbQJhdk>rh-wvr- z-iM*&a6+HWzZR(c+X#JlB~-b+8J-O9hYIfzD0%uFRCylJZ{^_}I1T%iZ~?p%&W2xw z3ipr!n}5ecmDl-D_3SDrxq2^@`$wR{8=tlDn+tvHE1}ZY4;8Q7uod15RSw^PGvFbY z*>tx-)tmK>71)M-FH}4~27UM#Tm}yrM7P2&sQ5ksm9J03PIzL@>Zc3gso1Y~_WPjZ z>oIr#k8mdTnR#1IYv4-k?}f^j-$LcvX$9M^TnZKbK6p0#4pewkiniRhLR6IZ0jT^M zSF-uE2r9ifxD?(3rFXspyW!!NGp2(ZpbwvbD(}O}R(_{I)w52h^lpVpN731@hZC^h z1@+zspz6VAq27A}svHif*!(;RD!-ONxl2Roo2%jRa4(cU?}tA84AlEiLL(nlD_6%u z-Jj>U*6}i^_+97hcR|VFgHYxCRd@flP~lIg+2?cNH0<4QA{>PB=W6J~eNb}!08~7_ z=IlR#dhhu=tlYG~6!!C>!hJcEez_g${eOb9;6v{DpP8`Nir9$++7b9&%KTxfr{S`o&E5utvt_$6S%()9uIrq>F_G3^xp@i zhraJP?iJQPA1Z#^;AD6mJPFyudmkQ){cNcF7ebX^ z0ZLwOh4S}PQ04GLI1L_ojjKoSMC@y!^hXXVAMS*k;J?Ci;q+^*o*IOUv3~%rhQEOF zck!#Nzgej8ZiGtzyWuJDTTuD%Ur_nfa-FT0=RlQz09C&G;1u{(_xu-7`E&HEt^cRN zBe1W5iti5UTthg-5|(!js`4ud(T9 zflB8pxEAh#?}I;ph`zVy1{=R4ZnSKHGq}GLN^S$Fe7F-z-o6MWAHQ?<6qRB&_N`Fm zeLYmV?trJkFF_wZ1?BGvH`)AI2B%}c6dnU#0Tut-q2%G6Q04FmD7knHs@#7EeR$mK zth)}V{N4za4<)F4x(3SqolxcXF(`R@94g#NH(Pl)3wB_?8m8cbQ04JssB)X~dfQ$t zfIjvTY=OI>+}{t|;FD1P9<|$+&jP4$*Fqmw;8M5;w!^PM)r&)JvGG10o`5|C<$pI+ zeqRnHUw1&g_psxi;T-Jkx7z&P4wYZKq27DH<9DIt>99R^{4*0S$G!t9z7IgX_Xw1{ zJq?v_r`%@!SqW7hm&2pr4N(5w0bc|kg!1om@G$tIy*B?R!b7pohKlDIQ1S1F^Wk2o z{QErg;qRf+f86c1pLjYv8v8P+cx{Fg;g#?_xEre6AAw5mQ*Z^G@dg|IWv~H z@OXGDRDS-Wvp)>w?k75=xk zZ9ZHC6|ZaHiSRZk_xC}?=ZjF`ej6%3e+5s1liyg>^+$9_hol63C`r<9?bdf-WgmgJ;~pPusn%*8|F@)W&pranCJpUO}#rz{?9nao`c>!h|ri**}ovmw3KSsZQ!7Sl= z3%ndNiR(7^OtSMnjLHxZ^?ruY?`HR0*EeAf#{Nb4HQjK(i{V4=`flfb0en06o_6=o z#r_ia>}p5pg>{%I*rm(D-*wnOisb{CBe{MRW-aDpvSU7u>BO#fwg>8WCj5%M^bX^C zJmxy=9q>D_7ybbLJ0|?Sn0uecaw+C=uCI0vid?HsycCANw7Ynj<6ihrm`ic1uevmZxyIc)S2y{szzmox`i_n}otqap`(}uGG!<@#yC=LFcjv&R zm>Sm=_ul`;exAF2A-oOy|HQPqd;7T7ZyM%Zn4e;1WB!cM?;gxDb45Rbccx<|W4{u! z(%l#S2j+ia`gnd7yajU}rUm<5nE&AVlNkM;u<*8U|9M=O;4b)jsNZDxV>r**7sExE zAuH$lxt|XzwH*@74Cg!HE2y(Zg$r%YH;^C?yFrI zXt@6p?)?@soBOxJJmz~C{eER(`X%pl*9G_#=9ie|&aX=x-_O0rFjefwVBW*EeiJZT zof~t5Kc{03b(ULrHVbnj=32~!+&=;HVfS1Z=dKUuc?R@(cG6R>Y|*YAc$VGhPr z+`Z2@3VGZXo&9>QpNG-!am+E8Ph+NI9>M6>jyV%^hjaG|_!{i1Fo$8DkNtRfKc)|J zJoY!iH()N{`gNEGxZaAn0&^KgzqepMf;pe(7hwju&SCxwa~1Yka1&-1*MEZg?dAGp zO!(W)#UGvJ_3$>HEr4s_vG6qb2Fx7Ho3Vcovj_8X>>Dupeb>T!FT9C+Cpr5!;HjA9 zm`&XOSGX3V-`(afeMGp8XZOJ=nA5plj|qQwxr@uV_bIMVg4e*sy6?AU3p>)eY{m}? zy~Rwn(BJ0GXrJ5Xcb#Lo%JDqMHIC~YH^GYEm(2y$;ZmS$%bMRaT*Yo#@mgk7TKsIq zFBGeO+P6XW4y4QJ-fB?x`--_-afr})*0QL@kDhe;*{YvU51aRTg8pp5PZ#_k7vzIN z)i0#;!2$bR9SCB7D+DvUrPDXj`YZaMD^`NK=$Q~YeFdIY8iPz63FSx2l9r|^P}2NS zpLF1DZ;S7>F5Tc4%YN(9i%&~klF9aGs}(m{mmP?O>Bv1IY?)Q{a|OdQmuH)dMZ_wlV2-jclw!PK20f9 zioJsYMVZNzgGwc^1zV|=O2u-OFpC9}O!6wjm1>apmSr;BbnkGxSNW9jmgS2zim}+| z=YxE)JnWZ)%WK&(POC+~R4(@7waL1na<&>MyK?DrKk`x?Knl`3(%D?PCr8fOSooDv zx;OBal}fp6Z@QW#66;DrrGuGSLeJWpy(G^(l`z)D84;X6&s$clma{!ILNww*^g@9% zcD>a{#EF085P_}*QPvlVh1A;3t51OmNl~O>;awe4U4W%&fYZZK3)4isPUBBBbYqRwTJE;6|y>CnwA35=9q{X3zv8OU>=zp5*b ztmU7L+aS|@z`n0UC=T59rU5iyQ{VFlN-ROm1xhL)cH1Q5_@eC;{pkinE7`WNRaufrcum zpnOytL&v3b8O@t1)}#+?Z8Vitip|QQytJ;eg=!!zGO9CqUJAd&{k0`?PHNYyn3V$$VO&E75TSAeXKMG@7}O zN>b>T>P8!HTA7-A#xuECm~c=I`hqgexYSmv{Z!i9OwlQ3)3~E2ZK|r$&`}fH)Q1c` z0wt5`Wf~4%tps`MO0HPw^z%iUm|S*HqB2~pNzYLANMfE`t5D%$-=k(nnO;x_L%O|E zB`ZuzUZ`fP!+y#SD!u6vF^qgjSNxgSI=$sZv_!Ab*W@CtLcdxZ-LBFQ$wS+U#EDh2 zrRQP&?JF1ai5P{Vqlg$8pKwb`baXXIQ@MsFE4rh4E{pHZ2faBeD= zlUoGL1Z;wEK|KqnRyEU>6ZcGja-+f^hfbbXbgk@O+vWF{i!?6;sH~vrFP5e0D2ZYr z@Ou!Z-T`k#QYBNaYIRJL(KqaO?F@RU%0VvUttj@^Os9%cqBLuTU?=Sgl0q4$`_xI3 zwxoSd=V;cm{fbJ|X`|?)rchd;lMGGVG8JvVArSj)MgrPf%$rzH16&6{CCp;b1*KkO*d0O+s@Yu5Mj>VE(h&7lY0IUFWSAtyksi-} z5;cp?rWH4%9s(l@rZZiiv`~c*g7R(AjLPgKvA?eCt5Jf9C)pE5p*3jlZ}%6e!@Hy{ zenZg>@+DLd0_W-x(qAkf^<)#O+jJ>cjMA?7Nww{DxnYT^@$%Vrb7%SVB~7N#z@nh5 z_-#rpj2rsL6#A&|Q<)NO>wWRMO!Vd(Bq zR;+gVGjsaWuRrNhvC`>vSwEgby5GgfbTq<7&1vhwLUE`-lu=srYAHSLyJ1CFxr{yC z+Z)jPM|)7Nt_3kl)jsZ_yXaaYH+)Dult+3f9pB`(9mq6!pb=8?whOq>-{E^U*f1`- zMZd(|q(Lz;RX4{d^wMy%$5CG@@i0?UpIK>i&0XSIe^52vDj9YpMy>BFCS2swbYlkO zL89lJc%DxW>LIL?&HLCn6C)$kSy> z_a|kkOt-OF=0*1zqxnuA8gjkP$%uG5Z|PxC{3DY=T?*4*7gKki(Kqmbh8xpQJHJjp_g$Wh4t#-4Ia4>G+1c3~!IjN&0g}$~Shc&K7DrjT#Sj zRui!aU2xa-ZsOibgEWOM^UQ_yg_8(QnP@H|n@^Tu=o(EFl$(T?7(+C9>V_2id!np~ zXU*ITPH9v$%h9AL>03vYzEQ&Ko-v5(EoV#U&O{WL>8Tif&`>IFywfB++nb=@R>~r$ z{dA7|YfRIqL03mzoz@vNKaA%X>=<1T={@^uK3%mcsOg)DxLN0_(fRDIQG*)sLZ}ML zK`F=lkm+7l5e3tEk0X|=CEsMiNg>d0Z^#HuMY$)j8qkPCH%)m-q!7Yz2*FgGsjvZB zuz!24pvv6Z#;BIE<(4ud?E0jmNd|TE-GqZ3<~v6UWUi6$axurOnb9h<{Ci_p;Y|q0!9OtbxAu36fgoc@1)vH{;bw;Hv>CW`PqC|E0eWr!2kA1>hHDiP;p^fU* zh{vTY<2K$nW))?>RE=TchAjnZq?Z7gf zAL&&|<5~G=8#Pn9CbHptX(Gc&)?lL#=3afA8)70o9cd(H8~T!2*rz%>T8`(_ZmP{@ zcOLs_PEC(9DjHJ&PLwIujGi9Yn?_>eLaq1q*?P6VVC`Iu>-Ei2Z@hQFuP}v;gbbva zk9J#oi$2@@iHhBYyATweWu@TYDt5fn0MS{hN&m2Nu#=n%DSP%j4v9Z z)phEcRahqC&BU}uIm~Wph?Lbdmn5_<4@O49^w^^qNYhve?Ps=E&qk9qT8!*2CerP4 zfD4zgzoyk&MU)(-UD}S-fwU&9cNSz!;XZ==yni~Nd_1M zk_f7>9c&=)b_$*y{q-*KCY(uiqZs3Y+h%xb-7Du9PBlU6t=edoa+WiRM4Ph4HYxQJVwwPDX(Uq|s(9z3F5_jDbD0S=Wo^_VgAh9r z)pBu*8T4vet>uyyubah1)jG6yzLu+IwKm8w_41mTt|Spgu5c#lvc+vCFEv+{)r+Rl zmgM4Ql*!xrv3L__bz^lsFBh1M4b+h}RixXkgs$31-*gkJnbCp)f!fiuCS@1e6#!-l zOeccKn+!;qEVIs(8PPkDW;ZLNeydHpS?P!-J=#WfO=hTd3};71cUWVBb^g2qba=*s zCJsjwN<5~F%EzWpg{i(Bc_6JAMZQV@T6q&aSB-6YL%pCdkL{eMoYj@efRnVy-C)3~ zaHFeY&t*(n&N5{YtuZk56nbu^k7?ycyr}UA{WK(!x#Q4vQbI?~3_BSxi!7pJ7%yq` z+1^%$Wx=W)aYw$I`ZjtTU6CVL4B_mY><+U$sJ^Pk(uvH9-3Emn*>bUw@yUF=z$v_cdAfW^+U5+9TiL?)@*o5UgVH1@{qJosyP^q0j) zbEwvbL^4tJQkO=>G)avz+UAi>j&q*&NoLA=R!V2fj0LnNFw4$onz{5Qp4AG`Vu#gc zl7jlOiJB49*NO`z_O0GUnA^|voKi~^aTC`xmaGlg`CIGKTOIUO&H6W!Rd!L(X&!lI z`ZGPXJ{G^c)r`ZKYBrOB4bADAbdH`li>ADzR>pScG|W;%tCd$Tc0vo@gD=Q;wKy2C zveG&u)26^iECL_+JB`b=@tff~l?~O@LA$6JcD!7RDDf~IByD=|)@XH-VvCf7##E?= zHCh1f393Wt9-F1H#^tTG0l8q-ifpsHw&%hJvxX z@?Lv4sIF$wU6C`JK%`6>Uoqt?Eo@~v`Fj1X6eE>{mxu^kFHBcH8i4WG2q+5@45cWh zgyVQ$i=t2}XLpz}YL3+dDV84Pl38D~X&&`Wwo>fKvbM^cUa@S$52I%CO}XF8st1{^ zR8bHFN4=ykAN#3JpV>O1NE!)5^~xm!KxLtsIC0q}6>EkEwli!TxjSZ2!eoJMe8LSd zBi$$%S~RUfGZEvh%Osa(75~J-3tO)iw}cBzb<26SjHnIaDuhY-GkLZov5!k50JRuq z4N(ggsn9De;~c1WWO2*vQGB&(L%ub{)2Ko_4a{mTi|PA|7hQ z9T%(m&R6lco_v@scAKGVfK+~_?wB(4Hkhe?qbh9O?#pn`^cuNoI*~mA1*pD?v@lDN zW{ZMa5)HZSNOr^ zO^o6Zch}m5lIA+t{#Ntz>K!>PG%K9*lCR+lsA>%{^@0{_vZ%G1DR=2vx(F=F*r0I2 zM7Le^aDo|4w_DXDMPZvH(|_n~_ggnw6^IeNky97v-CeUX(^|nLTw7Str<_< zhGZ0h?Grn7Q0FL80SSF!CPz>a(Fh=(qtW!_cH3!Y#>^-o_Q;uyjb^ykryaWcd0#~_ znsb*Iwjs!PWOrk=-5gZ{v)dMRW7Lu9Qjd6Mmbz4n>8$O?g&Jn58Z#ztaA)?M(tAuZ zspZ>Zj>gi+3Nr#oySj&79D0*?jHK<)x#|q#9E3KCw3!hYZuA#H)t18?O2F-;Hob{> zKktYaip;LD=QGx3reA4-Nx0P#1xo~G={%k>ixXv|rF6I)3MZ@@doqen*!43yY;&~H z%n#CK)$l?lRqRVSSxi1QOU|_Ob-RbnmhJ5&dK1W-#)2v@JGj#_K7E4Zni5HhVrJ4o z(b8<^$jt+J-A;5j^J6HTt(LMGJTVjU2`6C(mypaJx5iY5&u5t(O?n#5%_U=N1{rh> z=+m+1N;rD~#vwJ#>}Bi<_!I;F2yEz(mnYS3;P zWdC&Zf|G31qM&x_`%21LE%9mj%uHTT@b<;4k*=+Vt zco&!vl_ncZrKwwHjYd`#B#Ff$Gq&OdCVWh`Hk~=ra5b$VS}sTz+U5TNIPc39=}Fr0 z`hmU^y554MsDxA#TpB5e3^$7fQ+c*9jo0ryH%&`C1>s%1ZvCe2b!*$(+b{99C8ptM z6Vyg|+m_qr!fAGjAjgiko`CML2IdT6%{XvdZ?kvNb5^0+ot=~@pN^0>Y%Ap2v`NI7 zfly*J6+YyPhh0Ir=%UR5I4-D2mfi5Db!n>}#@}L?rRWAdu6DzIiedJBM+=`*?#2ZE(BVT<_>aZ=FG^S z{ZNJMa4SQ0(X-D^Jll2BP=|UM=2NuozHvYqXc~V1Pc=hnoNd=oYkRyjHkzN(@nOYb zK$uOB>c5!_*w52q$#c{5beENNZi;0f*qP4oF-@K#X-MeEM?}Bns)VjaD+m3&7%i(t zV(Zb#<1+%2!&QH6*Ot}VyKO5`g@?9xX;pZG)lTC!6niv3QOvW8(T+}O84AIW(X)Nb zZOL1tlF6q?%=k*IbxvD!-_7YqGxO5c(bov3i{&*_9g&L2?nDk*&grK!N`6uCG)UjJ zUNPQQifTaOSvaX$wyMNVhe#io?<|lvefdW;nq*+;f|_WyqN`nDp(A?Jb$g6nZEJe> z5~FV$QyBUizE9j0fm)B#r*@(z{=T4o)?~U7-|5~nJXelbrwx+6pEp%k>DKSZMXhk4 zE=>5&`2oj3x`-UMYnJ`2ifN!UYD%@9K0vcotQq~>*YKUXWrq$^#A5w428RqC8mz!em!ddcns!EN);JkxWlzOIIA z6#;chtq8ZPX${P7@@6GzN0t=ihG`K3cG72PCfp}A%dX_jqJi|6}5Eiu+KL({!QC(C5En~UGhzq2Ca1%leu$d&6$IWQ=@6;4C4f7O@fS8 zBr2Mp*K@BH4+d-&aYtX;&_N}LaDFJtf1cXTww;!YXZxcEW=Ij+>K8ww`)&r+rp0Nr zP;uf&D-8Vww!tK3IilXvGd*AQOb*tM=D>FPD*iTa2lFFj(P*vu{vS)*G;P*Lea+}G zFRF*Gl1K{dj1h&1U?RO*WwPBibv0AA@o830>&r#;KT_S9)CKlaPqtn%u{~}>pzo7Y zYbyQOOzNCkehCg?1$AX2aISb~@ z!C`6xNvy!c^dD{8Mm6RUs9XU4izT-w7q0KgV1cr-$GAE6G{G} zlDTnqHRvrcz{&*ey~Xz0;1b>}^w-!ap4!Bgrw;!d?KWi=r;87K#6>~j>|D0JSngjk zPHT2?`sTLJ8MoXj?Ud$MI?NQ_Y-Sy^d<>!*%G%gsv$`C+Qw-5?sV+Jw8aQ|O3wyHF zC=wkE#<#CJXWaT6Uk>L|D{14IDJhhUwX%2~%O~b?acjY!w%DKB);Vr#YLymXZK^NG zmaA!W$(;7n+vklNJ8VE>`*7m#uW*=w*_|6srkLTGhPi(yhYf5VJ8VGWqT#LWYb=YF zWNmLJJm+ETumLj@G$TC7-~i4I&@k!$`e6fZS&wh1$IctjI4bJ>GUr==3P$}Y0xI3V z+Ia&NJ6f)rGzyOppkNpsjGZ^IzY_`mPR<*6?CL#kvTy9ffffxb)p0PBf6K>C95745 zV^3Rvq6Zx4(?+C=99W$K%SA(8(g%c(d@qDfwL16lc zP1ar9ZZa#9e5}JR!cZ^#)sG;Eb;8&Y1d<%LORipJ#~%*6$74qj*j;LI#*7_75Ff`8 z=ZdPW_Kuk@;NRc~0(C>j4k3t7mWrn#;xZUJguwK1`o<0+pclVo>=1&CzQP*q5CSO_ z&28JQUuJ;c?e>Ai-}acD#AC-0G&z?b`DMM`lBqcW(*+H)G5qEu`i5Rxkw>^{b_{_I zJP&u$|<7oF>XvbCbh4I)i1Y^e#j2%Nz_Q#GP7(0d_{$?`# z>`x#3j~zq6PT~LVV+h!`7N4ldKUj(Pr)r8|>=**OLAw4h_pxIL+`?g#uZp~}V+g$P zlmQl(%%|ZacAtd~+`RGFF$7v$ia%=FXwNAicN)({2)CJQlD%OoeBHqUW5*DT9YgT{ z;xPnU;>Dc$k2N`Cg?EU?FSMO|)+B 2004 +# Bruce Cowan , 2009, 2010. +# Philip Withnall , 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-02-24 15:27+0100\n" +"Last-Translator: Philip Withnall \n" +"Language-Team: British English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en_GB\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.5.2\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unexpected attribute '%s' for element '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribute '%s' of element '%s' not found" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unexpected tag '%s', tag '%s' expected" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unexpected tag '%s' inside '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "No valid bookmark file found in data dirs" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "A bookmark for URI '%s' already exists" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No bookmark found for URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "No MIME type defined in the bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "No private flag has been defined in bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No groups set in bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "No application with name '%s' registered a bookmark for '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Failed to expand exec line '%s' with URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversion from character set '%s' to '%s' is not supported" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Could not open converter from '%s' to '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Invalid byte sequence in conversion input" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error during conversion: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Partial character sequence at end of input" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Cannot convert fallback '%s' to codeset '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "The URI '%s' is not an absolute URI using the \"file\" scheme" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "The local file URI '%s' may not include a '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "The URI '%s' is invalid" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "The hostname of the URI '%s' is invalid" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "The URI '%s' contains invalidly escaped characters" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "The pathname '%s' is not an absolute path" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Invalid hostname" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error opening directory '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Could not allocate %lu bytes to read file \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error reading file '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" is too large" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Failed to read from file '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Failed to open file '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Failed to get attributes of file '%s': fstat() failed: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Failed to open file '%s': fdopen() failed: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Failed to rename file '%s' to '%s': g_rename() failed: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Failed to create file '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Failed to open file '%s' for writing: fdopen() failed: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Failed to write file '%s': fflush() failed: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Failed to write file '%s': fsync() failed: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Failed to close file '%s': fclose() failed: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Existing file '%s' could not be removed: g_unlink() failed: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' invalid, should not contain a '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' doesn't contain XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Failed to read the symbolic link '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolic links not supported" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Could not open converter from '%s' to '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Can't do a raw read in g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Leftover unconverted data in read buffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Channel terminates in a partial character" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Can't do a raw read in g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Failed to open file '%s': open() failed: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Failed to map file '%s': mmap() failed: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error on line %d char %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Invalid UTF-8 encoded text in name — not valid '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is not a valid name " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is not a valid name: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error on line %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) — perhaps the digit is too large" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity — escape ampersand " +"as &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Character reference '%-.*s' does not encode a permitted character" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Empty entity '&;' seen; valid entities are: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity name '%-.*s' is not known" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity — escape ampersand as &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Document must begin with an element (e.g. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Odd character '%s': expected a '>' character to end the empty-element tag '%" +"s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' is not a valid character following the close element name '%s'; the " +"allowed character is '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' was closed, no element is currently open" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' was closed, but the currently open element is '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Document was empty or contained only whitespace" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Document ended unexpectedly just after an open angle bracket '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Document ended unexpectedly with elements still open — '%s' was the last " +"element opened" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Document ended unexpectedly inside an element name" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Document ended unexpectedly inside an attribute name" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Document ended unexpectedly inside an element-opening tag." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Document ended unexpectedly while inside an attribute value" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Document ended unexpectedly inside the close tag for element '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Document ended unexpectedly inside a comment or processing instruction" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "corrupted object" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "internal error or corrupted object" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "out of memory" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "backtracking limit reached" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "the pattern contains items not supported for partial matching" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "internal error" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "back references as conditions are not supported for partial matching" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "recursion limit reached" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "workspace limit for empty substrings reached" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "invalid combination of newline flags" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "unknown error" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "unrecognised character following \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numbers out of order in {} quantifier" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "number too big in {} quantifier" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "missing terminating ] for character class" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "invalid escape sequence in character class" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "range out of order in character class" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nothing to repeat" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "unrecognised character after (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "unrecognised character after (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "unrecognised character after (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named classes are supported only within a class" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "missing terminating )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") without opening (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]digits must be followed by )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "reference to non-existent subpattern" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "missing ) after comment" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regular expression too large" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "failed to get memory" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion is not fixed length" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "malformed number or name after (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "conditional group contains more than two branches" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "unknown POSIX class name" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "character value in \\x{…} sequence is too large" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "invalid condition (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "recursive call could loop indefinitely" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "missing terminator in subpattern name" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "two named subpatterns have the same name" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "malformed \\P or \\p sequence" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "unknown property name after \\P or \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern name is too long (maximum 32 characters)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "too many named subpatterns (maximum 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "octal value is greater than \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE group contains more than one branch" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "repeating a DEFINE group is not allowed" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inconsistent NEWLINE options" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g is not followed by a braced name or an optionally braced non-zero number" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "unexpected repeat" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "code overflow" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "previously-checked referenced subpattern not found" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error while matching regular expression %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE library is compiled without UTF8 support" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE library is compiled without UTF8 properties support" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Error while compiling regular expression %s at char %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error while optimising regular expression %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal digit or '}' expected" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimal digit expected" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "missing '<' in symbolic reference" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "unfinished symbolic reference" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "digit expected" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "illegal symbolic reference" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "unknown escape sequence" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Error while parsing replacement text \"%s\" at char %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Quoted text doesn't begin with a quotation mark" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Unmatched quotation mark in command line or other shell-quoted text" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Text ended just after a '\\' character. (The text was '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Text ended before matching quote was found for %c. (The text was '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text was empty (or contained only whitespace)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Failed to read data from child process" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Failed to create pipe for communicating with child process (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Failed to read from child pipe (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Failed to change to directory '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Failed to execute child process (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Invalid program name: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Invalid string in argument vector at %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Invalid string in environment: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Invalid working directory: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Failed to execute helper program (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Failed to read data from child process (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Unexpected error in select() reading data from a child process (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unexpected error in waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Failed to fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Failed to execute child process \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Failed to redirect output or input of child process (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Failed to fork child process (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unknown error executing child process \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Failed to read enough data from child pid pipe (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Character out of range for UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Invalid sequence in conversion input" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Character out of range for UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Usage:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION…]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Help Options:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Show help options" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Show all help options" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Application Options:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Cannot parse integer value '%s' for %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' for %s out of range" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Cannot parse double value '%s' for %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double value '%s' for %s out of range" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Error parsing option %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Missing argument for %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Unknown option %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Valid key file could not be found in search dirs" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Not a regular file" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "File is empty" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Invalid group name: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Key file does not start with a group" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Invalid key name: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Key file contains unsupported encoding '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Key file does not have group '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Key file does not have key '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Key file contains key '%s' with value '%s' which is not UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Key file contains key '%s' which has value that cannot be interpreted." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Key file contains key '%s' which has a value that cannot be interpreted." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Key file does not have key '%s' in group '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Key file contains escape character at end of line" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Key file contains invalid escape sequence '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Value '%s' cannot be interpreted as a number." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' out of range" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Value '%s' cannot be interpreted as a float number." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Value '%s' cannot be interpreted as a boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Stream is already closed" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operation was cancelled" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Invalid object, not initialised" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Incomplete multibyte sequence in input" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Not enough space in destination" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Cancellable initialisation not supported" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Unknown type" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s filetype" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s type" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unexpected early end-of-stream" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Unnamed" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop file didn't specify Exec field" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Unable to find terminal required for application" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Can't create user application configuration folder %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Can't create user MIME configuration folder %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Can't create user desktop file %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Custom definition for %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "drive doesn't implement eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drive doesn't implement eject or eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "drive doesn't implement polling for media" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "drive doesn't implement start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "drive doesn't implement stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Can't handle version %d of GEmblem encoding" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Malformed number of tokens (%d) in GEmblem encoding" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Can't handle version %d of GEmblemedIcon encoding" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Expected a GEmblem for GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operation not supported" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Containing mount does not exist" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Can't copy over directory" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Can't copy directory over directory" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Target file exists" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Can't recursively copy directory" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Splice not supported" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Error splicing file: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Can't copy special file" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Invalid symlink value given" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Wastebasket not supported" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "File names cannot contain '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volume doesn't implement mount" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "No application is registered as handling this file" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "File enumerator is already closed" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Can't handle version %d of GFileIcon encoding" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Malformed input data for GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Stream doesn't support query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Seek not supported on stream" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Truncate not allowed on input stream" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Truncate not supported on stream" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Wrong number of tokens (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "No type for class name %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s does not implement the GIcon interface" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is not classed" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Malformed version number: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Type %s does not implement from_tokens() on the GIcon interface" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Can't handle the supplied version of the icon encoding" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Input stream doesn't implement read" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Not enough space for socket address" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Unsupported socket address" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Unable to find default local directory monitor type" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Invalid filename %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error getting filesystem info: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Can't rename root directory" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error renaming file: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Can't rename file, filename already exist" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Invalid filename" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Error opening file: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Can't open directory" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Error removing file: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error moving file to wastebasket: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Unable to create wastebasket dir %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Unable to find toplevel directory for wastebasket" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Unable to find or create wastebasket directory" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Unable to create wastebasket info file: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Unable to move file to the wastebasket: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error creating directory: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filesystem does not support symbolic links" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error making symbolic link: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Error moving file: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Can't move directory over directory" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Backup file creation failed" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error removing target file: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Move between mounts not supported" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attribute value must be non-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Invalid attribute type (string expected)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Invalid extended attribute name" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error setting extended attribute '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Error stating file '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (invalid encoding)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error stating file descriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Invalid attribute type (uint32 expected)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Invalid attribute type (uint64 expected)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Invalid attribute type (byte string expected)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Cannot set permissions on symlinks" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error setting permissions: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error setting owner: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink must be non-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error setting symlink: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Error setting symlink: file is not a symlink" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error setting modification or access time: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context must be non-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error setting SELinux context: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is not enabled on this system" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setting attribute %s not supported" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error reading from file: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error seeking in file: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Error closing file: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Unable to find default local file monitor type" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error writing to file: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error removing old backup link: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error creating backup copy: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error renaming temporary file: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error truncating file: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error opening file '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Target file is a directory" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Target file is not a regular file" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "The file was externally modified" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error removing old file: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Invalid GSeekType supplied" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Invalid seek request" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Cannot truncate GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Memory output stream not resizable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Failed to resize memory output stream" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Amount of memory required to process the write is larger than available " +"address space" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Requested seek before the beginning of the stream" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Requested seek beyond the end of the stream" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount doesn't implement \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "mount doesn't implement \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount doesn't implement \"eject\" or \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "mount doesn't implement \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount doesn't implement content type guessing" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostname '%s' contains '[' but not ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Output stream doesn't implement write" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Source stream is already closed" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error resolving '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error reverse-resolving '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "No service record for '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporarily unable to resolve '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error resolving '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Invalid socket, not initialised" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Invalid socket, initialisation failed due to: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket is already closed" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creating GSocket from fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Unable to create socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Unknown protocol was specified" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "could not get local address: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "could not get remote address: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "could not listen: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error binding to address: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error accepting connection: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Error connecting: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Connection in progress" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Error connecting: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Unable to get pending error: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error receiving data: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Error sending data: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error closing socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Waiting for socket condition: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Error sending message: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage not supported on Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error receiving message: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Unknown error on connect" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Listener is already closed" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Added socket is closed" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Can't handle version %d of GThemedIcon encoding" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Expecting 1 control message, got %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Unexpected type of ancillary data" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Expecting one fd, but got %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Received invalid fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Error reading from Unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Error closing Unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filesystem root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Error writing to Unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstract Unix domain socket addresses not supported on this system" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volume doesn't implement eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume doesn't implement eject or eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Can't find application" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Error launching application: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs not supported" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "association changes not supported on win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Association creation not supported on win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Not enough memory" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Internal error: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Need more input" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Invalid compressed data" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Invalid UTF-8 sequence in input" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Reached maximum data array limit" + +#~ msgid "do not hide entries" +#~ msgstr "do not hide entries" + +#~ msgid "use a long listing format" +#~ msgstr "use a long listing format" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE…]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Character '%s' is not valid inside an entity name" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Empty character reference; should include a digit such as dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Unfinished entity reference" + +#~ msgid "Unfinished character reference" +#~ msgstr "Unfinished character reference" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Invalid UTF-8 encoded text — overlong sequence" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Invalid UTF-8 encoded text — not a start char" + +#~ msgid "file" +#~ msgstr "file" + +#~ msgid "The file containing the icon" +#~ msgstr "The file containing the icon" + +#~ msgid "name" +#~ msgstr "name" + +#~ msgid "The name of the icon" +#~ msgstr "The name of the icon" + +#~ msgid "names" +#~ msgstr "names" + +#~ msgid "An array containing the icon names" +#~ msgstr "An array containing the icon names" + +#~ msgid "use default fallbacks" +#~ msgstr "use default fallbacks" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." + +#~ msgid "File descriptor" +#~ msgstr "File descriptor" + +#~ msgid "The file descriptor to read from" +#~ msgstr "The file descriptor from which to read" + +#~ msgid "Close file descriptor" +#~ msgstr "Close file descriptor" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Whether to close the file descriptor when the stream is closed" + +#~ msgid "The file descriptor to write to" +#~ msgstr "The file descriptor to which to write" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Error parsing option %s" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Could not change file mode: fork() failed: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Could not change file mode: chmod() failed: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Could not change file mode: Child terminated by signal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Could not change file mode: Child terminated abnormally" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Conversion from character set `%s' to `%s' is not supported" diff --git a/po/eo.gmo b/po/eo.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9b5856646809128c5802af61e3559259074553df GIT binary patch literal 9875 zcmd6sU5q5xRmaPY$tFuez)mm(NN()R&TcY2JG1ML^~~Xf1!AIZk>0JS@ z@cFkv(fwEO9QetTL9hb83O)yZ6?_)_E+{%5`C;yXpRMs5;4+^d_<-l@Jop(t_rWK@ zuYp&=zXiVnKK?;?1HTD=82oF{fd5o~f8s}iV4ly9gC7H51VwKTJOlm?_(|});3MGo zLCO8W4+X(9;8{?5jlmxHOW-N+55Z4^?}F#S6FSx z{|250Kl)=qa1C4s{{Z|lcn5s$;UM@F_{ZQ`@SnjY@KKnQo?if^*Ixz2*I$6r_kVzo zf}chil6xK0{UInmejR)X{4;PJeB>iR@EG_isPpcC`u^+S+58Sp&#HSh`WZ@^pN2R`cUvJFbF zZ`Jshpw9VEa1DG4V?P5{p!D+lURCl1}HsPP<(&6{`^f)dir}%=fCIUUcZ+>eQ!Zn2!0uqfBY6GJAJ$U{IK!o zKLd*HKB#kk1C;*01@agC7jM$r$8e$*@G>a7{UV4df^UHGvp)fK&Od;!fG1(%>tG1p z22ZfafL{c){w>~~2EPTagZ~Xm|IfpW>~R1}pT7&D>fl{a_WXBn0i1&=`Rh$k{`v)Q z4g7OZ@}Gbi(fbrAdRyQFpls2+bRTzcauL2$FWDT|ce3k-WJ5G(t7T9+(2KBkFWe?L z$t9f-vQ9Q&>h&<6KEw4q7vcsFab4p25SMtC{-5I_&HHNnYGMcn_Ce zm${zgy1*qFo7a1re?a-h6)x%K!(6LegnICPE>!7a5^%XlsMq_r6x%<+ra zB}sM=rvvWIU!0%ZSv7HKM&WI@Z`%&y)P$+Ai5=OrG-)`p_f5InwG+Ap$DEyCHIA+S zL;6Wp*eUkh39Ckjhmz5D#YP|VYxBW+n9i3b$`C#e4@_>u$ROxoE6%piQJUIhOJ8m! zacZ}UGDlJOzp2c&Y#M33bl=a?eVdnN2X3~*{?Kcn%(xNR!j|rHu6XLXpBUFGZj2su(aGYm-TNF|ox68chmnh=C z$Q*#?@8>j^5nRNU;lR0UbGWQIlfqtw2YQp>cRCnv z8eqq5qG6~ox;UG_!LF=6kzr!H;|=8kqGlC8DB~pYEcCn^9^ku@EeT<=5lKAakux;9 zU>bLGA!3~?IQ2}6)`Sr!NN*SCinD7Ix+7`EXKEj~t$oaCyEs@h7q_!)xOQf;L+sko zm@vfQ$WLWRnu|=9;`OMBP#K4P8*J1`-$k1C^u=4WVDNY+ZokS&9wob+JsQE4WM$4H z_Y)?awbN9B4aXQ{l_us-tdacUJRdXuQ+dyyOI4f3z z4Nv3$QD)o7b2J`RswZ_}P?}pYb4B3qk@Hk@%v{v{vJSH-&Ph&Lj$Y7jXMwVsNV>$< z-n$aw@sV6hHH{jAB)e&{+o|lG%}D{Oxf}-d4R)+N#o+EUUwv^Yw|cs7Ydn z$=la$U&(TMkrMI!tvtjnEDR5Cbl*+WKeTH=u4rSwPyy|TyF;BSPoJS!OLb1e6YV%B z?<~e>N8j9uwEQSit_($C88#KJqqPpvS<4Pf?$+8gs|LH~F3J>lXSGARaC_<+>o|~Q zk6d$<=(+V?WvKdN^&~lI*8Q_{$kdMX)zpWwYBI6?TIKo=x*gvsxw`N62hGY|x)0ZR zHebx#bWW&UiZ)mA*J-BRW7{gJZ!A;JsVmW|Z}(9zJ9bgKNSq5Ikm$Hi1n7T5Zn zbY$uzJKKC0KbzsY#458|9tQ}td$&UeyAZnT$ZG7EZS1%uKYA0?G`VJH& zco+Dr7(hk#b@l7EP~YCIbw(VLf5@BSGT5Z9CCXtk3N)OnEtrCiwC)S*dPmpg?6xV& zzWdv@WDiMOl0cBh3$MbrlU3MBDQ~X7Xijgc5Nn_AiOLzyZOL>y6*K?&j=^Vaos{I$ zoN{DM<{-|#b@Qs1uU@BT1t%!};oIttV;9p~D9-g__k9yuay$89OZw0{_0oyYl*&ZVFu139Ac-C_5!XSya z&AG+%i%TbOT0Qynt`~zi>OEf#ir!|nVotvN(q?ZRnH3qm%LK%VIk&XD)LS~=JNJ}X zUS4_PLT~Abr6m^jZrc4=blY_-T6(&-v}~52T+yBh+C@bjygfPFG5=*W0{3hIIwoS>igT4^&#?Iq;Gmb}vlUi8GRVZ-b;SKUpysw&U_- z;PLNUMaqj}Z5yDBS3C9g$EZbM=3iH?u^D3eOBz8caRKlJ)==eeR z*7J^b+t5!u;zJ`3^2acX!rb#7yckl@GEzz^RadDSb<}bMpK}J1+ML;78A<(kgV^D@ z9I3OTS6w)?h%rw+=*VPV&Lq9LGplr1W*9o-0V6ha4ez`e?y;o0Bd)@|o^zFy0+pKm zj0s4_gL*$E_|c?>7{hQ}br%kCmwJxzqSpgWH}xHX8qu+%PmHa6MYWB$(+rLH^q=}ggQePQmhx!`#3}gOfZ~M3p?D8X*`v% z{q#cq#O$K|EZycAkBdiAMHx;JgmL)J@9BTqJ)$~9@0wW*`|)x6>$5{(wA3X+2@5Q9XU zs@zf*d@^gu`7W!wbeP+?$#{el7IR15y`&O5trvRRlO7Q$+d9ZojBCn zUyA+6LMu|2Q}1WpU8ERAik76Bb{ZV%<%i})XSd$Et^;>l}dTeGCqlq%_QU~{3 zC>*1;qn5S9i+i8p?1z~#N?2BOMPjm*N&(SY`N&mwYsf7vs-0MF*dZK8{0u^K8_Bvy zY?G3>eQyIhM%$8kgahgKF~)1qAQ{K%lay3#;{NT5=Q+4RVq-^WXfmnJDysAadY*3r zi+mtDRP=hKuaa@%3SRr|jGZs?;|Dd*HvN<;nb(VsL0!x-sMDx>o8ds+)G9g_7=2Xw zp{xGRXP~+>K$+@$JGI}}i^#T_(dEQhWThI7GJHpI7kPeOB#V%Led2Gc2Wp%;!>L%T z*38g_xHLxqxc)1xRY&`!)SldO!FRSh*2xOwIMap86EMnV4c%hQQBdF-;&$CHmHXz^Q;B$yb*5m1Dg+R zt?|5ik6Cb!Bb3mJ+9%2?gN~bE(-Za8LgmZt{q, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.3.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2003-07-01 15:10-0500\n" +"Last-Translator: Charles Voelger \n" +"Language-Team: Esperanto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Malbona signo '%s', unu '>' signo estas atendita post atributnomo '%s' " +"deelemento '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konverto de signaro '%s' el '%s' ne estas subtenata" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ne eblas malfermi konvertilon de '%s' to '%s': %s" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Nevalida bitokosekvenco en konverta enigo" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Eraro dum konverto: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Parta signosekvenco je enigofino" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne povas konverti fallback '%s' al kodaro '%s'" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "La URI '%s' ne estas absolutan URI uzanta la dosiermodelo" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "La loka dosiera URI '%s' eble ne enhavas '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "La URI '%s' estas nevalida" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "La komputilnomo de la URI '%s' ne estas valida" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "La URI '%s' enhavas nevalidajn eskapajn signojn" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "La padnomo '%s' ne estas absolutan padon" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nevalida komputilnomo" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Eraro dum malfermado de dosierujo '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ne eblis akiri %lu bitokojn por lego de dosiero \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Malsukcesis legi de dosieron '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Malsukcesis malfermi dosieron '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Malsukcesis ricevi atributojn de dosiero '%s': fstat() malsukcesis: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Ŝablono '%s' ne estas valida, ĝi devus ne enhavi '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Ŝablono '%s' ne finiĝas je XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, fuzzy, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Ne eblis malfermi konvertilon de '%s al '%s: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ne povas fari krudan legon en g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Kroma nekonvertinta datumo en legbufro" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanalo finas kun parta signo" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ne povas fari krudan legon en g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Eraro ĉe linio %d signo %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Nevalida UTF-8 kodiginta teksto" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Eraro ĉe linio %d: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Analizo de '%s' malsuksesis. Une cifero devus esti en la signoreferenco " +"(ê ekzemple)- eble la cifero estas tro granda" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Signa referenco ne finis kun punktokomo; vi verŝajne uzas kaj-signon sen " +"volikomenci eron - eskapu kaj-signon kiel &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Signorefrenco '%s' ne faras kodigu permesatan signon" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Malplena ero '&;'; validaj eroj estas : & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Eronomo '%s' ne estas konata" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Ero ne finis kun punktokomo; vi eble uzis kaj-signo sen voli komenci eron." +"Eskapu kaj-signon kiel &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumento devas komenci kun elemento (ekz. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' ne estas valida signo post la signo '<'; ĝi ne eblas " +"komcencielementnomon" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Malbona signo '%s', unu '>' signo estas atendita por fini la " +"komencetikedonde elemento '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Malbona signo '%s', unu '>' signo estas atendita post atributnomo '%s' " +"deelemento '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Malbona signo '%s', unu '>' aÅ­ '/' signo estas atendita por fini " +"lakomencetikedon de elemento '%s' aÅ­ unu atributo; eble vi uzas nevalidan " +"signon enunu atributnomo" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Malbona signo '%s', malferma citilo estas atendita post la egalsigno " +"kiamdonita valoro por atributo '%s' de elemento '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' ne estas valida signo post la ferma elementnomo '%s'; la valida signo " +"estas'>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elemento '%s' estis fermita, neniu elemento estas malfermita" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Elemento '%s' estis fermita, sed la momente malfermita elemento estas '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumento estis malpena aÅ­ enhavis nur blankspaco" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumento neatendite finis post malfermi-angulkrampon '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumento neatendite finis kun elementoj ankoraÅ­ malfermi - '%s' estis la " +"lasta elemento malfermita" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumento neatendite finis, atendis vidi etikedon finiĝanta je fermi-" +"angulkrampo <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumento neatendite finis en elementa nomo" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumento neatendite finis en atributa nomo" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumento neatendite finis en elemento-malfermanta etikedo." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumento neatendite finis post le egalsigno sekvita de atributnomo; ne " +"atributvaloro" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumento neatendite finis dum en atributvaloro" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumento neatendite finis en la fermetikedo por elemento '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokumento neatendite finis en komento aÅ­ komputanta instrukcio" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanalo finas kun parta signo" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Nevalida bitokosekvenco en konverta enigo" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Nefinita signorefrenco" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Nefinita signorefrenco" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Nefinita signorefrenco" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Eraro ĉe linio %d signo %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Nefinita erorefrenco" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citita teksto ne komencas je citilo" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Konvenita citilo en komandlinio aÅ­ alia programeto" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teksto finis post '\\' signon. (La teksto estis '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Teksto finis antaÅ­ konvenan citilon por %c. (La teksto estis '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksto estis malplena (aÅ­ enhavis nur blankspacon)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Malsukesis legi datumon de procezido" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Malsukcesis krei dukton por komunikado kun procezido (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Malsukcesis legi de duktido (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Malsukcesis ŝanĝi al dosierujo '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Malsukcesis lanĉi procezidon (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Nevalida komputilnomo" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Nevalida sekvenco en konverta enigo" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Eraro dum malfermado de dosierujo '%s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Malsukcesis lanĉi helpant-programon" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Neatendita eraro dum g_io_channel_win32_poll() legado de datumo de procezido" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Malsukcesis legi datumon de procezido (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Neatendita eraro en select() dum datumlegado de procezido (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neatendita eraro en waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Malsukcesis branĉiĝi (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Malsukcesis lanĉi procezidon \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Malsukcesis alidirekti enigon aÅ­ eligon de procezido (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Malsukcesis branĉiĝi procezidon (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nekonata eraro dum la lanĉando de la procezido \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Malsukcesis legi sufiĉe datumon de ida pid-dukto (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Signo ne estas en la UTF-8 intervalo" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Nevalida sekvenco en konverta enigo" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Signo ne estas en la UTF-16 intervalo" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Eraro dum konverto: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Nevalida komputilnomo" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Nevalida komputilnomo" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "La URI '%s' enhavas nevalidajn eskapajn signojn" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Nevalida bitokosekvenco en konverta enigo" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Nevalida komputilnomo" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Nevalida komputilnomo" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Eraro dum malfermado de dosierujo '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokumento neatendite finis en atributa nomo" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Eraro dum malfermado de dosierujo '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Eraro ĉe linio %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Nevalida komputilnomo" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Ne eblis akiri %lu bitokojn por lego de dosiero \"%s\"" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Eraro dum legado de dosiero '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Eraro ĉe linio %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Eraro dum konverto: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Nevalida komputilnomo" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Nevalida sekvenco en konverta enigo" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Signo '%s' ne estas valida en la komenco de eronomo; la & signo komencas " +#~ "unu ero;se la kaj-signo ne estas ero, eskapu ĝin kiel &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Signo '%s' ne estas valida en unu eronomo" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Malplena signa referenco; devus enhavi ciferon kiel dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Nefinita erorefrenco" + +#~ msgid "Unfinished character reference" +#~ msgstr "Nefinita signorefrenco" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Nevalida UTF-8 kodiginta teksto" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Nevalida UTF-8 kodiginta teksto" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "La komputilnomo de la URI '%s' ne estas valida" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "La komputilnomo de la URI '%s' ne estas valida" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Eraro dum legado de dosiero '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Eraro dum konverto: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Konverto de signaro '%s' al '%s' ne estas subtenata" diff --git a/po/es.gmo b/po/es.gmo new file mode 100644 index 0000000000000000000000000000000000000000..e92e9dabc3ff61ffc65d17047acfa1a982dbb091 GIT binary patch literal 46164 zcmd6w3A|lZeebuk1_wX^nKxj_jpT+Tj3!|Sw$S&gKHvBE|F5-&bI(mK)c5(k`(g7t zd+#;=*MD07wf4%l4}Rop6aL=vup~JOe99A&WccAp^7te4G)X>re3CpFybpW~_|<^_ z6z~TDe;V-qfWHF|ApN6G@O%e>S8{(ixE1Vx74R$I;oxacOOj*3_25FV1*+aVz!Sl{ z!Sld>01pKZo1Y|?fs4VXfG+}10`CBaz)yoI_%rZG@JSRxRmn-9>RS&U2G+r4;Emuj zzz>1PfjFnA1=EBz&)>U$oj_PrHM!4HG# z-#>zCmu~o(90e`{M?jjKv_YDX+zvv@p?xA1Xcg5!3y|M@B;8CIw`u0fuh^(;BxQ_ zpz41#g`W#v1ggH5f>(f_4tO-g5xsh#==3iBr~ZBoJO}(8cp7-tk|bFJcEDGH_kt<7 zp3I`>G6!)zXGa#KM(hhg_uhJG*IKb z5>$CxLDhdj7(?fW436!0HFmGfgT1s@L4#MdW)YR6gOelw_iO;CLE3Xq{nJ_@Sd zAAv`M$?2Z|7?7b(&II+o2C6;RgDU5a@cd(->iY_)@&75v5GO-tKwIz%Q1bK=Q0evr z{1$jN_YZ)Ga&p?4E+@|h)s8;`5vAmfpvwCcC_4Na6n`8{q3Xv*Q2Cz+ihu3|)vwQj zPX_M?)!xU^IDRH4f#U00xPJwx@&7!ieE$j}3dtcWkP&bdDE|K&P|tr2GGxiIE4{s& zK$X7}RD13KX=1V$RDHh%)vnXe@_uXqRnINq{v+U_-2Vtv{@;TtZz05a0(dc~eqRZy z-Mhdifo}&zmwP~^`yQxv{vzOE5J`IHY*5cf!DGRff(L`|29E$g4yr$21J$kr&UHQX zjDVv7ZvoZ54}ph)-v*Bb9{>*o4_)Q-UI3~;D?mNp2#Qa~K&9UWJ{7z@JpTZw@%s!Y ze))G$>5f9li{2~24~ky*f*Rjnf=7WTQJLOf1d2Y} zL6!ePP~-IuQ0@INi0VlG6@)dCBQEsuy#hRu`yHUleG{m9zXl!-{t6WRA5Z5rey4*6 zfonjG^HrewaRaD+z6D$d{seqKxMB@7(LJd4O+3@_25>(2e*%hc?*&DN2f(L;PrKOl z@On`9H-V_;pP(O^&j9#;E7b8f*V1V+W|$NJ3!IrFTg{lcCr9WtckHa~j%B_Qyp|eJhxPp9aqXe+VuH zPrTIS;xbU}Zh+$F8$h-D4WR0|7ZiW}093xiH##3)1TNwJ8c=k88>sRAA}G524Al5M zW|Q;NGLR-Gmx72uawn+v{s2_I$097^w;@pVuLqU?8c^lE5j+U|FnA33S@7}T4?&gp zYw$7P8J9Wz&jBCJ{j))}vjVF9uL4g2?*m1@`@s}E;d1Z)YVZK=p9?-2Y=COl^TDTp z?*d`1_C8Sk`zrVh z@P1J3IeClYrJ(d-2h@0c093kv1~uM?U+wu%0#)9{UfdJYC~!9@{(c?!B=8fU_~MJ;Q^ALC^>!TziodS}MTeU}wd=j$(cmXR zrT;dl_WUQPdLQ*%ukUE^SnkgQQ*bok3j_WscuazPf~SMu5BEn_+}~La>iq=x>W3xC z&7k^w#2CB>o*wX=fENY4G~lxXj)4c0z5z;3ZUDD|F9vslzXErI+p6B)?}MVxBWvzg zF9Hwcz5LmtUxxW<@eZCD!PaNKIdOs69j{6%xwd+n$a{mQTu) zb?^%A{~UY+_{g5O_pPA#@ynpv`%`cM_@o`qw`YKolgmNLNf&%F_;T+l`%5qd zzXPhAhryI9!4p7@^K(I!dlRVg?gr5=_CJ;rZ?1`Msd> zeG`;?-4BW{o&s@G@Ko>=@G?;4zBJ$mLACFjpvL=m;8Ve&YhACb0#D}tIiS+r2C5zJ z2UX7(!IQwBf~SIqU+4U^4irD#45r}S;3Dvg;Ck>kp!C+o&+~Db1fR+MpMfgx*Pz;e z?Dan1JqJ|#Zv@qz4}+4cAAl!-i~h*lwE@)gCa7{g3@YDuLG}BP8~pj%;2GR+14Z|@ zftQ1y0~dqGKHtY@9jJEi0LA}r2af^&9n|>EyV2`g2A;%ilA{(3M4?*)$ozYVIMSkqg%i`K=I21;8t+$ZSJ?-4Gwev%YeuJv5(tYa1qaM12rBW15@yU z@cgh>xE!noRqu;HwdeDo_~&Qf5#an+IvvjiC8s@bC3qWn4)_J|LhyiBIp1soS9AXY z@FMWD-~#Z#S9^QT1l5lksPaAziVwaDNy20rQz zw;xXjQ|>o|qH7Nnz1{{M4t@p{y}lEk{{|F)9s7FcqqD$;+;0I70dEGyH*W-0|0h6| z_f7C5@b}<};7M=r@!SY1|Es|ocrW-&@Ps$IpWFmb=l(t55#V>h^TFSO>c_cna{jD= z%ej9YcnbJsa4GnxH+y@|0M)-MLDhFNxB`4X_;m0mp!$2*TU=h3g2!;b8e9yHf#-s+ z0ylwQ0XKjP-s*C>3tY+l2f?-A&q395)}5Yz0@OIX4wPK}HMkM{6?g$S@;0Z_t)S@i zeo+1S7O3_e_I8)I^T4CI-vu5Dz77;$-3=ZHeic-?KLqE2&-hc9*VW)7xt{>l?gn@! zcrPe^egHfJJm(!gK0CqVxPLSFc<_^;>ib(zbp1Yf7Lz_e*>!gW8UNZxdv3aaqtP?&Eftvp!n!R;E~{uK+)%sclo%i z1T_vjLGjgVL5;&6Q04s_D1M#y=RWT9!IQav7AU@Z3D^cd1&VLZxZC})E~w`p1V_O6 z?{z!B9n|=K3{*LP11<)C3#Q;n@ALWTCEzmdp9P)|-U1GTe+Qlj{tlELc-s5Dy;p)m z+}{X_p6>zG-!Fm6|C8{1$p_pHT@I@Jw}L9~E1<^XzrYi~gFfhda~gOM_g8?TM;#PB zUkWPUy`bpz{eX|Z$Ll{8)ca?H=YcnZD)&?1YVb$l{qTqI1-Y+q#lJ6wAJRkfd8v8P zhVbk(elLp&1AZ9%A=lfv-o*Pm!}FK&`(S>5luNv<_FT-f7lIFPjd7j9Jws=I&*t~v z^XpvjpTO(E>$tw*uZ`dI^Iy518lJ7hluLiNh4=b>E7!xg{{r|GJqUl#2EQ17Yn@Jir+}!Kqzbo2_3x7^ZW5!H*x%j2-KluG}uK0HiKbCVnocDKd zZQ=J*L)vG7+rw|AKaFb#*9*e43-yq{^SLJM7d~ddogvNR!u@9O4zAyG^};j3&7@le zp3T+ecRS?!75C2!zvqFk;rRp%Xo%+FFkLM#?PYmy0#538a^SQq!JX5;$ zTxW6pC)Xmbajr*k>F>#0XOs4*kp2?xmxSN9@cTZlmvZUvXIwY&?rB_;T(9G5@$5>j zw{hw3-?@HnzwrNf|F`@;mg^j@D);*PH?Du-dIr~xJR1cs;?mzvuFr7Y%(azEf6sA9 zt_}Iat-*rA&28cL0e$H{%k!hSCi z>sws<8|FHl>kT2@^TC&Je*xEHxE{&<;o$$^s&O68{p-O$;ku09FX#FQzpvoBmaERC zzqfLIoNEK`ujJas@9kW_<9Z(VCxM%|cJuo;p#EOV@8h}R-z)g>U*YDD!PoHa6z~%8 zF!1T%pKzVb^+xXR;d(XKA8~&vm;S!#kh~YXm1oC<`>%ovxz6L-#Ph!a*K+CaEe;l6 zy^41q3-b^dawAQFi)tcS3S(&OOb1k_$SRLMMo8=TcwjfQ0&e@o@+Ud|a zSDiF`b+tZG?{?CuUZ8l?t~EvJp=4D$+G=f|shPG>!>h83*tKR8$l2xOfuEr_tHS4?5YHO;(D0Et5+iMJEwc4(AIyE2I zPH%d;)$USft4WvXUT1fwTboK&RjWJ`Au*cwl#YE!ND?zCOIrdMy1 zwA)Ij+pRH*Hqz~E*Sj^5t5IoBz%SiNxS+D5Qg2j78&K9;k#?plW3^<}^mL;>R_WGh z#QJGLXL+)!L+y2cI7avEt(dXYW?1l)Wyz{;w_P9YQKPX3&5I0Y_sTU+!)bq(5Qgs6 zGSW9&&Ea*IU2;isUS({1Z`!0G&1xN|*>wK=N^?Os9cxYRPOJ2JtSbVvcF?=*wwPx2 zH=XGkJ!@DkF^76sOM4wkTf1iM2-P&l>l3}U_ZxAm@@9T#IoE(Jl>!AHT+V8(v%T92 zJO1r{s9O zSxpNq509y&3X4bpHPnqd+y#+4;toBm)4@#FmGi`8^Wo?5^um!Tcx~#zq^(ug%(?Un zV2Zh?-aLs099a4kjFNNEV1|+k$kT*Q!-74?vZL16-N%(#0#iy-?Td`r?6#yV$|>6| zB&Ed6W3`4$Y`t0U!n5^j2MD4Hk&Hn)MgUnuagHKLE{$jg>{6|R@{u&g#M6~Fnz!2O zNgud0ny^Z-IUlM>PgQSrYtkaKCR5?lwf0oKBR1(sn{{?i!J^wuT2xZE-D{#_YUzb* zO?9nlPWQT-y72N;a=tTmie;OsH%ZhH&sS8tI-MH;r3@C(H1jw@(wva$MjLOwV0h{2 z`%7_VAwjz~UTb5urM89_KOK8pZ3V?_wj4d_z3NIsXC`)F2~`{bbrbP2!$H9FiYO-*1NmY;k4En zt4!0vtb|G@J(0T=$@wj`#F*)8sEAdVkj2sCE`~@2x)sSgE3>8dQGUnUt*JtbBI~Fj z#v|Aj^)<5ut+?+Bz=zTU}=cHISlDtT( z{STD9$mkBi2irvdrV2#4` zq3}`#>7{i1fX6r zJ^9S)V=#AxcN4X)6{~LeObn?XZxvEBD!4I|Dxlyw7v4`*w(BL{&uEKD6-K|gz4*Gd zV*r^jQ*!6i`R)gRS@-i-g;JvK%(`ddFd%`MT#3po?+TCQ>8WWgn*ipdmg$a7?yn|$ zCx4-D=u7YVh8fSfRyRUaE8R+=5&4TLT$aj2k(b)Ijf04nJ!g)V27c(HdMU|_c7|f{ zuo(WC-9VON|4S_m&zY?=g|9Fbol$V7)vyM;t}+?J6DvF{l_zej4bPeY9c7$_s_v_( z6LfqZE#u>vl*FGiF5fhANxj+IWoo>(t6OMIOukDFr3DMDZ4F^CY9iDD7; zsp1&M)M%nwdq91KImCdsVM?*DHzG|QH47Pn(&#A4F<>b1tuvwT=kU@yCQ)PU`ZT(; z&;%kq9n%MWqY~yj1L|{c0>5p#4xdio98dHJ)5xI9QJ2#?AM?X}j>(Scf=usu)~QO@ zRnWkkg|>NeN%U0x+F7fbks+#rc5S*re8}9(F05eAd)}}{ub7j7lWM?k?<0glQQ=Ll z1~lW)LmMx#6igVW5QO4PU~6c>iLJe+gn4Kovs%WMMBRHTkxnZpJjp!H(pudg*VCMyccl@n4pW>~9wJGY$1vH75ui+!*~?WP<|}EE&Juq@<5eEKdk#n4CzG zW=)fgb>E0tDVm~{oVq~*OCa6?)0*WF-O?1Pt}vH4v_ylMjWCZrYk@S4bLa%oUcH-* z*RUA%YYC+LazLn;xxd0{In()aKvq0lH{R%VCTA;jX7bMN=Gfd*TmHV}(s8DGn06Fc zMvrUxoMe(oAe}&jeX;?+dk8+cpf4rG#7JtG#aId++w|1ai*n3zvhb*)J`i?nfxQkM zeijD{@vQPVcZx|BpiM5^WJ@{c6GXzMtaX!84u~lL%F;-+wX>64gu2X^RW2eDXk%?^ zkx7ULq841Wz$U#4t1Y;CL9&LmL`famd#cyy))h%(ntDyo!j*Kw_=;rWE+1|SUMf~q zS4K11;#|_q61*+X#RnuS&DHh3-6R-WlOt;)vL-BiUbqS0bTf;W*@6L;`fOT3*)x3w zfGB}E5j5TiFl;3AWFkhEC)4b<5Sk8o-)*HM3wkV^H8sSLb&S!G*%S5%u%5DPjtNgc zbwI)ygOblFv+?o%X)xv6K?7;UtnmZ!-2)Z4A51f`t97cRnL#{}y; z&8&YraaY7$nHOj|FNUzDTQhME!TD^-Kn-CcB|CsOTT5o!7_Qljvk2sx=~gsVT?YB;{uh7k!;FCNf_tkAp|+j;PZDCob}9>q|-ghDq_ z^-`CnVg~d^gmxNvcS7Q zU*1|*g9^4*47`LmMA>2MF}H;8=trVW@Z{ygGJLSG=Z38eYLnWtM(Tb zUf6nd)`GaOR9epSF+v*RDunfXe}$c0*vF+AfGmcsA!@;5I2NU4oVgYUi5HwaOR26l zR9as5?wo`H zG0Tz`SL5QO+-VeT`n!~@kMoGKpI&%w%TKKTvf%>vXT4A0f*z6LE_>EC!$~%rzi|YE z&N3q5Uu4>2ddP)@Ro*kU=}ZMmsNL3-f)SZx#w_*vO>3S-;cNx5$WPz|TcYag&jw2> zfr4)(T)vQ%FV%;YI@+fp@-)eY{(TntR3mp>T=iY5;R&96B#Un|32sm~6CA zzo`nB?eQwl%xmPKIgz6^22j3=v@lDNwnagfL{n~`$vET`>@YR}wb783-A z00$fEpe0OKzF`NR<}_vEDn)3|rVv5TxsHgftWD-6B%3B%JGFx`Rk$pys&xEm`HAlf zq%nQ=cT=m^Mtuer9PnP@>{@@VMz3rt7@Ctp@AmGkTFOc`d5YO5+9AP!3X5x6{oUQ1 zubwbd!m@Re;v>jLL6cS49#6-M;7%7&8mEyK0i6aFb;I!`R|fC|XD*aP^LUxv6n&^wB57# zADgw5(d0K`8SiYVOHz!pwvQAt%u+Qr zC+4X+RpfZOFBCVA}x@))P>E4gHbc@9jQHQFKqyZg(9QMKi; zff5Kism+_n_w&xk&?36Vp3hvHnO|wu6w+#mf+Yf5I?p3!d8fQt>PMhZ3|RGhGHOnA z{Y-~lmTfdkYn8SnyjdM?jSmN2EWWlSXY71w_poi*-a3sp0l#T3sPXd2otE+O35sh< zbSZ0@^@E|sY&W3hT(Wzhdr%oWEA{Sly-Fb#kS`>O4lXs>9=HBp$M=hDN0Z)WvAJSv zZIXd&fKSJsD|u+@Bq?kojE6DFs3kH{pww&MrdUpjXrhL-FD5G^-zyQ5;_G!=cxt8w zebXTOr?U)!v(2KQcFMkzD61ttEuUHNf{||_-favTUg@xzA9uYd(0n{FS2ulAo6Btf zL~^;!s1$54p(!o1W;3e}oWx?0&8^5lz{kisFmj~nYDH7DMy=9Ztn%lOe7w=Zll1xe zT=T@#SHLM6AxT2$BLh+8VXJAva|L0%iBPzimOKQJT(y3~<~8frEnd9%>SRkH42MmS zjY_th@8%+Cc7~wAj_TgYRiG%E?j;toGs zhAd|q5tW5Q+h!ddokWG8pvElL*U*Ey<^cZhRs3mR;8|G}q_z4G5aA4r$-IZODgxb|zUr(AFMa<4ONM z-tJB!AGVLT)*(l`-J8~Y#lze@h?@+gpWXfxH?x)BYZn3*WN?CpMb3=>{6iJU5mttL z(R17b&%RC?b!bv0o}z8{{S(TX!tncks|ckf+p4M7)_iGfwlbyTqu?+htXF0&-(ms# zc-xvzLUagmdV<#N|ldkrWlgGj?R2V^A}uS(A8+=+5{Q1Wz~#r6P!FgBQOeg z({&?PT%x_(E<_z(x_9X+yzkb-xP8N(#V1-*>|*rUDVCvG+i7}soY8qHD@JS7^odQ!}a{L28|6C_jk+ra&%Lp0k%PNdo+4zL#C{X5yd=_Nd z9HE=0o8glWzOYHMMrd-cPYW#|p~1=9M4}nH?sCJ!&Ns*+-C0RXUycNOAIw^U&&{W{ zOi&;xGy5bj-$gcBGx;Y&Qn%PCM$}Al_?5FyT|3DkA z&frS=l5cS|u-369OP4HKvIG?;qvRPkQ-ez)8dteQAS(N)<6a zl+mBJ?reKlGLQCWFKkMY-<20Xv*#g#>U{|sEh3`?a*qK(jt;Hq&ECCWk>t#04HPVh~|WxL2!8?zYL*9CqU~ zXq+~*Tk=1K*Hniu_fI|9dP!h=@kJx6R?pj5(?`m~YdaJ5>hO8JiO%q57U<_~SigDr ze5nrvb$B&eWO=%5$GD(09A0wjk|iV@-iW4?3tYVQY_hOM+T!?n(^{IzonIkbS6cXsLGCG*aA4L+=3%W{k7olFR_ z&X*w)R~E|7vZdxcomz^z8y*QC{x46@9IbcfJ!|+vEvb4JEBi~h4IJ5@yFWuV?+G0nIGNyG#glPXqoHPceJ$RW{QsV?DBWpE8H8Z|7$Qw4 z8Qw54=NIQ4U=dpBW$Re9B6h5aWVgk)UNH@lNzlp2)7^V#Iwl9B+Da~g!{p0UwRJS? zXslBu3rHOz_VzU}|Fc65v|FA5(RO@HJS`wPO!L)8d(Jm#v_Or~e$3EHE!62rXPP*p zHUzAn&fDLput2X<5KP#XTWh2|P4puodcbT22lKgtDyo_|*|s)U z+S4^Lj~WyXSnxjBev0{Gr3PyZJqFzOfR*~N|6(Y(Jd!B6Ih0xG03`&zq6vMuOP!h| z$RizBVNy5NMX!qqM%xDrJ1nxK!&QcTD zDK2yC$}tEe+f_0nwi_1J((FERjB?mS&fPog>pk`Sz*8 zQj6dg_^a!^%#Ni9I*>UN@3%2)caysJ9zsaitzdYH<5OXRMg2yspd(v4w<45eW(zN7 z-&sU20?aSKYh5^S^L9h!p}*P8kcN?-9$jqbe%E72;~<==X-GtPIRttlLBF(S`E z)58!kQE?^zinfcovX8kth1%{^=%2Kqrp)Zal4X|v$q^TGO?qZICE^=rW>{0mpffMr z>5FpO*R<%!?5iADAa;$>#M)>$bs)-A1+TW<8Wp1$ucj=tFp5~O5&`zybs~+BlVUql znaC?@5j{w0Rr3j8WS<>ElAKV-pLo2gYUM{?z~RznkeSML@`bq`-Yh7ktTdI6oP~2DMS6!_*Qj zs27`M)u}#FPlVQ)ixBxZR{x+gSm=7S9hBj64aav-{t`3{K$Iz3HbD@*72_bZfvrqz zt)1F?r+I#|fbGguMNAU=AiBA8CL<~ehqbUVMqd==lcJU#rlDNbaFRyONo?IE174A9 zIpm---P`+at4~t_Q4-*QCL~K<9}oC6f-N*u7H1sMg<4_E6$vzlwo`pQG*P)y5w z6ZTP`TJR{YZ4c*C?8bZdOpV*-(xF1JGn@Pn+Ljj*=P3`q5QME;hn()AalB01{2G%2 zli}9l2U{pkK(Wj)ZyMkd&#hqXrO{~Q?7*<-_>MWUQJ{M6X=_*`qs*-k1OOIxa%i!t zTG_GpZe|ao%&Rmd8;+7W?z54-ALaWUG*rwJQ_iV2HZw_-BnzXJvfgB7>5)g|l`oCt z_hyv#V?IhWu^F;4u=`4QaAS6pBq(_}%f;k5U1eUDAdfm9f2di~l=VLLDuo zu(t?6D>dsfgE`v3M=(*C-CC1D$`UGJ*SuZp-+ZT0^J?Ri#C0 zJD6$KV?+w&_E}SgXif$df|PBd%qa|^r82fZ1P!GFJV?gCXB{b8Ra2^IpGAdixn>cI zg&8_j4ekS-)raxS3&t>~Hh`>DNO_B;Y-HjTf5guj!A|I;5n4ilWOS2l_9#oi_TDku z+$~NenK`D`lX5yMx@bRVd+h;=fp7EA(qsG7DAq{`L58yf+*b|H@HDe_YVFr4YBOwO zWJv<^@4mV$Ap@1W*p?tn=sA^y;D^m#sXR`~%0;wB8BLr88(6I$X5k59D3<^rb3N z0#auVPfn{K#^q*Y>7w7^vcB&`eQ)E;f=0K92O%nbjT!8pl}oWS7Pj#)$iTPAUFonJ zI?80OKFaJ!J`KB*T76>{Uo#-6vkrc1x!{_X$K+CyAdq181Yt;}X#<0@Go_2))W@g; z3Y~jG|8}CU#6k1Yaytj5U|M0DbsPOjZL@AW)9X=Y!!F+VVxPGrrY1mWNSmNmi>J^q zFrz&t8_-o&U>4Hy`Jgn|;E~hEg+4BW2Tr!s=b4m`z-#w#D-Ao-%S|`Co28Au3Ud~e zfrU{AF?}Hu%YY#YV|;@1F5g>vg7cm_eM42qN5d2ns^bmDU|gn53du0YYzpY-+(H7% z*^f5aZ{mCmd@fc>^?`5wn8x(VUK z*lbM4TA18A8rPh|*@`LGsx3JjEwhhm%jq*CL^qt}O&!VYtX!LgW?brWhlUArxfr9Z z^ya?gQ}hpMa>bhobC~nXN=m_Xp{%&+$68Rv8hxxF;6lujqq*lK{hlL}j#7zcjNFq*!@ zwve{Qic3*KGDcU3Ztp$WsWsNwLcZw23^2DLmD_c>5t-MC4@*z097aiCT&Hv_^w=MC} zZ*-@5p#O+fAadTiLQFDrNuM})3k!oaS|8`z9+i&{+8%a5=XB0q_jk3}90oe`2eCoX zF31_rnLL_?{7jsThx6(<14lmWfNa_EI0JIc;(PhndhiFAwsgMD+)L?Wyjkjc$c3|Y z(hu($)S~DRLOY+~Fh@eZ6lu~Nx~;jc`{8hQScv6KA)b?KF4JzlBdT5*vK84d$xi)* z9i6IU`?1*FKrOL2n^R2@FqB1tCkcuc*vGuh%<-UZ#VIvaw6)QeiBC-K0vT7RNM~+l z$U}|AJSBFgyH-!9#})(vemcpwFK;H+VmbEm50u;B8t0)@*93z^yx)t?)Djb}oLwyy z70z%f1}C>Oc{u3bEF(d6)|UxhNSGNhU+LO66$bjILFvTcs|*F{h*t7F!?-EYJ{DFp zr2DnJX0pZsJSaH^B(#ZNG|G0}u~9egZf@%ah;>lc;V_@RD(8~Z&-Hl-8N(4jmUE=P zWla0&Ss(wBDjf8qz(7$;c|2KB3ER``mZP?d7=f)u+Sp}> zZY3ygPpItfF-1|MvSD&X3g!MFM2Dn$M~coW-PCT-pvg14a(yK)}J@LZx(B`%Ly{}N^Z=+fY1FXvR?Wx9eQ1NU`WvgqJ-D3gkN4M2*S+l3DMf#mD zhT8_4*gzQ4UB|3=Yr+O1@|hz%y7!|UqSe@+tjtP5Fk{X>Y3!%_CjVYMD}rXZ!IAmU znpB0g>foY|YJJmtGay@kZ_andEwux}g`<>QVf*n)rli9Bah6(%b5!W*ylcM&4r#?Vn4~XT@5M z=aHOu3sXvm#VO5zqDWVglTcJ_P4ofwUy8F?P}itjsNswo9%(5f+QOhz^@wruJzVzT zix$Z>XR?*JeYd()-|U5>z-E;Hhbw(X(GQ~OQ5%Q3l-rC*zu=QY9md_X`u;~Cgry7g z_Uv+=am%cNVI!N4h0?0GSq+$3F|hrVFNGR6Qn&<$dZ;6s_x@G#z_z6Df$w99!8K;7 z;mqO~Ke*IV?{lq=08PDiEnzA=H)v&~QItaeaz>S%WC*a&4QQGh3GIK4F((usb08DB z+-cZzmw!Q5YvZiUaO2#%NN$6dt}o0iU}rm9wHYQqhHBm3kFwt6sv`gNlRcq@Ebify zhbP;Q_TS4NH>BmIL?c;jLNrO4XEn(0m#o9h#mNF81q(_+yap# z?1LPX4z4dZo8;Px8-nsOnsE)-mB66B&r(Q6uULXUF2rBu6s=i^IHMpDG4#?Wh<1<` zrqD>2chYw)Nrr8>?5%4A`h(~Mx@Al<-Ln=zQVW2`1{Q2cBquBwd@v2WMH(`LY>Z^W zE<%&i*wQ~J2+?M}P$%-xK{l_Q`6g@|@XpbEi(WbF30FugQY zq{hPLIS<^&-8a6cfL7rz{Q;`eRuK*q<|Hty(mbFnY9H&QyXM@A=Vnx!_H1=j+rx-r zAha6w;Lh`pHKJ*E5WyO}!7unQWu_v3=A36G&2{*sC5%_a=EZGFOhn};uCiu*M^Im=UM3(#nX zm3Eel@<~FS&&|gwsU0iklVQ!TSk__ApdB5q=F#Y49Cg!pn;8Y&6)Et7&U{E^Sw_iu z+AWnPEQu`z+PI0~xlxi~ARTu&rZ=&S6EAUw%Z3z^~s zRKt=@+E{jGF2@=nrp=?Fh)F?WY`Bg3gR+zuGWH?xh?qrMxwr;Q-}#cN_~l1DwoIM! z{Z9PzUYS)Xe5Df%pe@WIsimcCZ{$d6`8gAS`8J35!lT35O4jOxUnwefy6N8&ErP#6A?Z@nLv}z@B=3S zQp*a|Qn)u~VSg=^bl@h?+_>@~_I`_UCJ%cVhZxgrGoz7`#-Z+g0^@rbtr@x3m{Yx= zpinD)u>oh1Lbl>SsAGj!aopXf4u`J6{%ZebeLb>NIo#x|V>c}V1IPCOb zAQXAy2)1mTGGiMeVYHP2DO6u*S!tr{hos02EG4J4rlANTH~1HboqbO524!_A4KHI?OO4lZx-Z}IBv)8!_g3@8@NjTJPMsjOiX|qh8$2<}EGVox3 zefh^|q_J5FBOK0c!vW3R{6c%2;Rth8Ij7tXXDfWlSen7?r_3l9b1$$!ze0mtR3e#@ zHE6(&z8{TKOkd9nZS{lXYHdv-6)k~yg^6%+s7kacSJ%`(D$Mi=6JDnbBl13YTmv8X z0+0{mrA*o#2K)M!!NQ=1t!cK16FViAFAm|V7^%-b#K@MJ;)q92F^q^?oh4K2`D zg%ap*v4qmfce$9pbLvLobjhs~a*M6dW@qhT$NRJyyT40jPg|ai!Xw$v{g74bM)^!z zhBN$|9*RTCn1@<1Fkz_}%3wxq54L7C``IoNHp}&8q5#|CY+pwErtw&)6tSFT)jOsI zwY}yqLqt38PTh`4TXEGZe-Hy$xeMS5GQ?v|?GqEyEW_BLB|^GuA>SbQ4Sa1O)oZ8W zC7YNJxuHo``$yj1;LP7dJx5QCQ~%iLI9T`~zQ<5$MAR7W|NBCWhM^q%$fg9j-3rV= zl>@@vYJN*R8_vvYS#Z4+%-&DNW*%CkEdEiY24^fI+7GoL@)^^H&qg3I9|nXqqewqj z<$1;BbN$VO(`WshuXp~My{}&Pz30Ev4%ow|4~hT@t8{Urn~6pOhtj?#tfic|$KZ>j z^>Lt9__6OqgR^7za3XZv-k_4UaLk|FWBba^&pC)O>4MW?t9eH8jBrFBv9KnbIQQl> zn;(KJ&B~uoTlff*X1ZY6$2P{Tp_M@zVvtB@gC&|U+rB&T2;76st>;k!Yh`h+tZw@u zeNK?fhUZ^pvX6^lmC}bM#x`MWj7X+>!!}J@%qIW<%Q920b=34qgJ6WduSB~cSsX%P zalk!y70>g7x|M5sd+!z@3!`F=E0#?2JGKOH67I}H{Wv#hH*;Hkm%$gF>^u)Q3ll1g z4qP#^=0ct?o^jeAd~*FDhYs~I%6U-yTbt%`NhA38z$)9Luo)>}4Su^*6u&~0>d@Z3 zPNJj!80m2KUn_E7(MZyMlWFI9^AC*O14(92Y9|8vf@&cxwCm}J7%M|AmgI_N$KwF$ z8~q9A0hU=T?)XY*5))mWeL=wmx02^<=j}CY*Wuh!Nrh%vM5$t2YPNc4E?+8D>mN zrQ-szEwiQO@TYc*ja>EitV!g(F|Xv@Ky9*>4u|}u8TyhIWPojkw~~mq zH+A4ph!IG)P>w>(FFDo>)fQL%J$$Gn7=Ls9jm9A>-7P*%uXe{+R8Y9FOq;B@jS4(+*1E>?HX$4vV@)V%wW)vS)bGYIEaB^{Esg19In zS{n{XoO5P|sgOIIhB&v}eOc|eGIG+_!ke;QQVR#4xHz{evEoD!i)T~C*(UX%h?tJa zknCre=1>ZeqPv@8?9)d|7oqR15t+1U&y2O_kT*_c~sboKp z$aCcaLMP)sX80+3DZUmIl@K)c!z!}==!8f5Zo#7gLP~YB_$kk z{!$oomF(V$9}}7ExoZo0u;9F=(oeRtN(?wq`3&%fIHPgzog5e0veP27H4xJ^19njL zuN8>Z-T7vSgQpZH>=w9+Gb6kv^D0H+qGuT$%Os-$`&?aHnky>l4SmU4x^&56J55rq zSTU{HAd>(-6r)F;j{%a@xDn0fvz6kw!JtUn)M$(E%*ES5l_O}`#z1E(U#o)OX_kM5 z>?XYUB)51J8;orJUc+11%g1gPxnlYIve^qZGs#RbeG+HJ`8WBZiDRNL$7Cz#m~O+I z(rpp9`3aJ?b~39=Ik#l{vQx9yMA^ZHB>8+qLF^g2NV*Zdk|_lC6~RI-H~Pm6IdcHl Vz97@tm&uB|utgy_H=5if{}(#IE8YMA literal 0 HcmV?d00001 diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..83487c6 --- /dev/null +++ b/po/es.po @@ -0,0 +1,2197 @@ +# translation of glib.HEAD.po to Español +# Spanish translation of glib. +# Copyright (C) 2001, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# José Antonio Salgueiro , 2001. +# Germán Poo Caamaño , 2002. +# Francisco Javier F. Serrador , 2004, 2005, 2006. +# Jorge González , 2007, 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-07 11:48+0100\n" +"Last-Translator: Jorge González \n" +"Language-Team: Español \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo inesperado «%s» para el elemento «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "El atributo «%s» del elemento «%s» no se ha encontrado" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta «%s» inesperada, se esperaba la etiqueta «%s»" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta «%s» inesperada dentro de «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"No se pudo encontrar ningún archivo de marcadores válido en los directorios " +"de datos" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Ya existe un marcador para el URI «%s»" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No se encontró un marcador para el URI «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Ningún tipo MIME definido en el marcador para la URI «%s»" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "No se ha definido ningún flag privado en el marcador para el URI «%s»" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No se ha establecido ningún grupo en el marcador para el URI «%s»" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Ninguna aplicación con nombre «%s» registró un marcador para «%s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Falló la expansión de la la linea ejecutable «%s» con el URI «%s»" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" +"La conversión desde el conjunto de caracteres «%s» a «%s» no está soportada" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "No se pudo abrir el conversor de «%s» a «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Hay una secuencia de bytes no válida en la entrada de conversión" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Falló durante la conversión: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Hay una secuencia parcial de caracteres en el final de la entrada" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "No se puede convertir el fallback «%s» al conjunto de códigos «%s»" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "El URI «%s» no es una URI absoluta utilizando el esquema «file»" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "El archivo local en la URI «%s» no debe incluir un «#»" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "El URI «%s» es inválida" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "El nombre del host de la URI «%s» es inválido" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "El URI «%s» contiene caracteres de escape inválidos" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "El nombre de la ruta «%s» no es una ruta absoluta" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "El nombre del host es inválido" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Falló al abrir el directorio «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "No se pueden asignar %lu bytes para leer el archivo «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Falló al leer el archivo «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El archivo «%s» es demasiado grande" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Falló al leer del archivo «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Falló al abrir el archivo «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Falló al obtener los atributos del archivo «%s»: fstat() falló: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Falló al abrir el archivo «%s»: fdopen() falló: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Falló al renombrar el archivo «%s» a «%s»: g_rename() falló: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Falló al crear el archivo «%s»: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Falló al abrir el archivo «%s» para escritura: fdopen() falló: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Falló al cerrar el archivo «%s»: falló fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "El archivo existente «%s» no se pudo eliminar: g_unlink() falló: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "La plantilla «%s» es inválida, no debería contener un «%s»" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» no contiene XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KiB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MiB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GiB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TiB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PiB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EiB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Falló al leer el enlace simbólico «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Enlaces simbólicos no soportados" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "No se pudo abrir el conversor de «%s» a «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"No se puede hacer una lectura en bruto (raw) en g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Se han dejado datos no convertidos en el búfer de lectura" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "El canal termina en un carácter parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"No se puede hacer una lectura en bruto (raw) en g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Falló al abrir el archivo «%s»: open() falló: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Falló al mapear el archivo «%s»: mmap() falló: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error en la línea %d, carácter %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Texto codificado como UTF-8 en el nombre no válido; «%s» no es válido" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» no es un nombre válido " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» no es un nombre válido: «%c» " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error en la línea %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Falló al analizar «%-.*s», el cual debería tener un dígito dentro de un " +"carácter de referencia( por ejemplo ê) - tal vez el dígito es demasiado " +"grande" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"El carácter de referencia no termina con punto y coma; probablemente utilizó " +"un carácter «&» sin pretender iniciar una entidad, escape el carácter \"&\" " +"como &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "El carácter de referencia «%-.*s» no codifica un carácter permitido" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"La entidad '&;' está vacía; las entidades válidas son: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "El nombre de la entidad «%-.*s» es desconocido" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"La entidad no termina con un punto y coma; probablemente utilizó el carácter " +"\"&\" sin la intención de indicar una entidad, escape el signo \"&\" como " +"&" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "El documento debe comenzar con un elemento (por ejemplo: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"«%s» no es un carácter válido a continuación del carácter '<'; no debe " +"iniciar un nombre de elemento" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Carácter «%s» impropio, se esperaba un carácter «>» para terminar la etiqueta " +"vacía del elemento «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Carácter «%s» impropio, se esperaba el carácter '=' después del nombre de " +"atributo «%s» del elemento «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Carácter «%s» impropio, se esperaba un carácter '>' o '/' para finalizar la " +"etiqueta de inicio del elemento «%s» u opcionalmente un atributo; tal vez " +"utilizó un carácter que no es válido en un nombre de atributo" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Carácter «%s» impropio, se esperaba una marca de apertura de comillas después " +"del signo igual al darle valor al atributo «%s» del elemento «%s»" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"«%s» no es un carácter válido a continuación del nombre del elemento de " +"cierre «%s»; el carácter permitido es '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "El elemento «%s» fue cerrado, no existe ningún elemento abierto" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"El elemento «%s» fue cerrado, pero el elemento que está abierto actualmente " +"es «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "El documento estaba vacío o sólo contenía espacios en blanco" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "El documento termina inesperadamente justo después de un '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"El documento termina inesperadamente con elementos todavía abiertos - «%s» " +"fue el último elemento abierto" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"El documento termina inesperadamente, se esperaba un carácter '>' " +"finalizando la etiqueta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "El documento termina inesperadamente dentro de un nombre de elemento" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "El documento termina inesperadamente dentro de un nombre de atributo" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"El documento termina inesperadamente dentro de una etiqueta de apertura de " +"elemento." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"El documento termina inesperadamente después de los signos igual que siguen " +"al nombre de atributo; sin valor de atributo" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "El documento termina inesperadamente dentro del valor de un atributo" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"El documento termina inesperadamente dentro de la etiqueta de cierre del " +"elemento «%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"El documento termina inesperadamente dentro de un comentario o instrucción " +"de proceso" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objeto corrupto" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "error interno u objeto corrupto" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "sin memoria" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "se alcanzó el límite de «backtracking»" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"el patrón contiene elementos no soportados para una coincidencia parcial" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "error interno" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"no se soportan referencias anteriores como condiciones para coincidencias " +"parciales" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "se alcanzó el límite de recursividad" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "límite del espacio de trabajo cuando se alcanzan subcadenas vacías" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinación de banderas de nueva línea inválidas" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "error desconocido" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ al final del patrón" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c al final del patrón" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "carácter no reconocido después de \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"aquí no se permite escapar las letras (\\l, \\L, \\u, \\U) (mayúscula y " +"minúscula)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "números fuera de rango en el cuantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "número demasiado grande en el cuantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "falta la terminación ] para la clase de carácter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "secuencia de escape no válida en la clase de carácter" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "rango fuera de orden en la clase de carácter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nada que repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "carácter no reconocido después de (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "carácter no reconocido después de (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "carácter no reconocido después de (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Sólo se soportan las clases con nombres POSIX dentro de una clase" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "falta el ) de terminación" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") sin ( que lo abriera" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R o los dígitos (?[+-] deben estar seguidos por )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referencia a un subpatrón no existente" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "falta ) después del comentario" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "la expresión regular es demasiado larga" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "falló al obtener memoria" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "la comprobación «lookbehind» no tiene una longitud fija" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "número o nombre mal formado después de (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "el grupo condicional contiene más de dos ramas" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "se esperaba una comprobación después de (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nombre de clase POSIX desconocido" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "los elementos POSIX recopilados no están soportados" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "el valor del carácter en la secuencia \\x{…} es demasiado largo" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condición no válida (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "no se permite \\C en comprobaciones «lookbehind»" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "una llamada recursiva podrá crear un bucle infinito" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "falta el terminador en el nombre del subpatrón" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dos subpatrones tienen el mismo nombre" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "secuencia \\P o \\p mal formada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nombre de propiedad desconocido después de \\P o \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "el nombre del subpatrón es demasiado largo (máximo 32 caracteres)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpatrones con nombre (máximo 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "el valor octal es mayor que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "el grupo DEFINE contiene más de una rama" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "no se permite repetir un grupo DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opciones NEWLINE inconsistentes" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g no está seguido por un nombre de llave o un número distinto de cero con " +"una llave opcional" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetición inesperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "desbordamiento de código" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "se desbordó el espacio de trabajo de compilación" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "no se encontró el subpatrón referenciado anteriormente comprobado" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error al coincidir con la expresión regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE está compilada sin soporte para UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"La biblioteca PCRE está compilada sin soporte para las propiedades de UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Error al compilar la expresión regular %s en el carácter %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error al optimizar la expresión regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "se esperaba un dígito hexadecimal o «}»" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "se esperaba un dígito hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "falta «<» en la referencia simbólica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "referencia de símbolo sin terminar" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referencia simbólica de longitud cero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "se esperaba un dígito" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referencia simbólica ilegal" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "«\\» al final de la cadena" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "secuencia de escape desconocida" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Error al analizar el texto de reemplazo «%s» en el carácter %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El texto entrecomillado no empieza por un signo de comilla" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Falta una comilla en la línea de comandos o en otro texto con comillas tipo " +"shell" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "El texto termina justo después de un carácter '\\'. (El texto era «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"El texto terminó antes de que se encontrase la comilla correspondiente con %" +"c. (El texto era «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "El texto está vacío (o sólo contiene espacios en blanco)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Falló al leer los datos desde un proceso hijo" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Falló en la creación de un conducto (pipe) para comunicarse con el proceso " +"hijo (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Falló al leer desde el conducto hijo (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Falló al cambiar al directorio «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Falló al ejecutar el proceso hijo (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nombre de programa inválido: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Cadena inválida en el vector del argumento en %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena inválida en el entorno: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directorio de trabajo inválido: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Falló al ejecutar el programa auxiliar (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Falló inesperado en g_io_channel_win32_poll() al leer datos desde un proceso " +"hijo" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Falló en la lectura de datos desde el proceso hijo (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Falló inesperado en select() leyendo datos desde el proceso hijo (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Falló inesperado en waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falló al bifurcar (fork) (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Falló al ejecutar el proceso hijo «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Falló al redirigir la salida o la entrada del proceso hijo (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Falló al bifurcar el proceso hijo (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Falló desconocido al ejecutar el proceso hijo «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Falló al leer suficientes datos desde el conducto del pid hijo (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "El carácter se sale del rango para UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Secuencia inválida en la entrada de conversión" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "El carácter se sale del rango para UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Uso:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCIÓN…]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opciones de ayuda:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Mostrar opciones de ayuda" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Muestra todas las opciones de ayuda" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opciones de la aplicación:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "No se puede analizar el valor entero «%s» para %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "El valor entero «%s» para %s está fuera de rango" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "No se puede analizar el valor doble «%s» para %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "El valor doble «%s» para %s está fuera de rango" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Error al analizar la opción: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Falta un argumento para %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opción desconocida %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"No se pudo encontrar la clave de archivo válida en los directorios de " +"búsqueda" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "No es un archivo regular" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "El archivo está vacío" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"El archivo de claves contiene la línea «%s» que no es un par valor-clave, " +"grupo o comentario" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nombre de grupo no válido: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "El archivo de claves no empieza por un grupo" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nombre de clave no válida: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El archivo de claves contiene una codificación «%s» no soportada" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El archivo de claves no tiene el grupo «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El archivo de claves no tiene la clave «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"El archivo de claves contiene la clave «%s» con el valor «%s» el cual no es " +"UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"El archivo de claves contiene la clave «%s» que tiene un valor que no puede " +"interpretarse." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"El archivo de claves contiene la clave «%s» que tiene un valor que no se " +"puede interpretar." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"El archivo de claves contiene la clave «%s» en el grupo «%s» que tiene un " +"valor que no puede interpretarse." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "El archivo de claves no tiene la clave «%s» en el grupo «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" +"El archivo de claves contiene un carácter de escape al final de la línea" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El archivo de claves contiene la secuencia de escape inválida «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "El valor «%s» no puede interpretarse como un número." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor entero «%s» está fuera de rango" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "El valor «%s» no puede interpretarse como un número de coma flotante." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» no puede interpretarse como un booleano." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de conteo pasado a %s es demasiado largo" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "El flujo ya se cerró" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Se canceló la operación" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Objeto no válido, no inicializado" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Secuencia multibyte incompleta en la entrada" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "No hay suficiente espacio en el destino" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "La inicialización cancelable no eestá soportada" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipo desconocido" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "tipo de archivo %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "tipo %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final de flujo inesperadamente prematuro" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sin nombre" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "El archivo de escritorio no especificó el campo Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Imposible encontrar el terminal requerido por la aplicación" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"No se puede crear la carpeta de configuración de la aplicación %s del " +"usuario: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "No se puede crear la carpeta de configuración MIME %s del usuario: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "No se puede crear el archivo de escritorio %s del usuario" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definición personalizada para %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "la unidad no implementa la expulsión" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "la unidad no implementa la expulsión o expulsión con operación" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "la unidad no implementa el sondeo para medios" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "la unidad no implementa reproducir" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "la unidad no implementa detener" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "No se puede manejar la versión %d de la codificación GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Número de tokens (%d) mal formados en la codificación GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "No se puede manejar la versión %d de la codificación GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Número de tokens (%d) mal formados en la codificación GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Se esperaba un GEmblem para GEmblemedIconjo" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operación no soportada" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "El punto de montaje contenido no existe" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "No se puede copiar sobre el directorio" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "No se puede copiar directorio sobre directorio" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "El archivo destino ya existe" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "No se puede copiar el directorio recursivamente" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "La unión no está soportada" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Error al unir el archivo: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "No se puede copiar el archivo especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "El valor del enlace simbólico dado no es válido" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "No se soporta mover a la papelera" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Los nombres de archivo no pueden contener «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "el volumen no implementa el montado" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "No hay ninguna aplicación registrada para manejar este archivo" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "El enumerador está cerrado" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "El enumerador del archivo tiene una operación excepcional" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "El enumerador del archivo ya está cerrado" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "No se puede manejar la versión %d de la codificación GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Datos de entrada mal formados para GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "El flujo no soporta query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "No se permite buscar en el flujo" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "No se permite truncar en el flujo de entrada" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "No se soporta el truncamiento en el flujo" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número de tokens (%d) incorrecto" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "No existe el tipo para la clase de nombre %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "El tipo %s no implementa la interfaz GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "El tipo %s no tiene clase" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versión mal formado: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "El tipo %s no implementa from_tokens() en la interfaz GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" +"No se puede manejar la versión proporcionada de la codificación de icono" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "El flujo de entrada no implementa la lectura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "El flujo tiene una operación excepcional" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "No hay suficiente espacio para la dirección del socket" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Dirección del socket no soportada" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"No se pudo encontrar el tipo de monitorización del directorio local " +"predeterminado" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nombre de archivo no válido %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error al obtener la información del sistema de archivos: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "No se puede renombrar el directorio raíz" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error al renombrar el archivo: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "No se puede renombrar el archivo, el nombre ya existe" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nombre de archivo inválido" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Error al abrir el archivo: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "No se puede abrir el directorio" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Error al eliminar el archivo: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error al mover a la papelera el archivo: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "No se pudo crear el directorio papelera %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" +"No se pudo encontrar el directorio de nivel superior para mover a la papelera" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "No se pudo encontrar o crear el directorio de la papelera" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "No se pudo crear la información de papelera para el archivo: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "No se pudo enviar a la papelera el archivo: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error al crear el directorio: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de archivos no soporta enlaces simbólicos" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error al crear el enlace simbólico: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Error al mover el archivo: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "No se puede mover un directorio sobre un directoro" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Falló la creación del archivo de respaldo" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error al eliminar el archivo destino: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "No se soporta mover archivos entre puntos de montaje" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "El valor del atributo de ser no nulo" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo no válido (se esperaba una cadena)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nombre extendido del atributo no válido" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error al establecer el atributo extendido «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Error al mostrar información del estado del archivo «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codificación no válida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" +"Error al mostrar la información del estado del descriptor del archivo: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo de atributo no válido (se esperaba uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo de atributo no válido (se esperaba uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo de atributo no válido (se esperaba una cadena byte)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "No se pueden establecer permisos en enlaces simbólicos" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error al establecer permisos: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error al establecer el propietario: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "el enlace simbólico debe ser no nulo" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error al establecer el enlace simbólico: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Error al establecer el enlace simbólico: el archivo no es un enlace simbólico" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error al establecer o modificar el tiempo de acceso: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "El contexto SELinux debe ser no nulo" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error al establecer el contexto SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux no está activado en este sistema" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Establecer el atributo %s no está soportado" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error al leer del archivo: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error al buscar en el archivo: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Error al cerrar el archivo: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" +"No se pudo encontrar el tipo de monitorización del archivo local " +"predeterminado" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error al escribir en el archivo: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error al eliminar el enlace de respaldo antiguo: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error al crear una copia de respaldo: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error al renombrar el archivo temporal: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error al truncar el archivo: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error al abrir el archivo «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "El archivo destino es un directorio" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "El archivo destino no es un archivo regular" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "El archivo se modificó externamente" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error al eliminar el archivo antiguo: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Se proporcionó un GSeekType no válido" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Petición de búsqueda no válida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "No se puede truncar GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "El flujo de salida de la memoria no es redimensionable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Falló al redimensionar el flujo de salida de la memoria" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"La cantidad de memoria necesaria para procesar el escrito es mayor que el " +"espacio de direcciones libre disponible" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "La búsqueda solicitada antes del inicio del flujo" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "La búsqueda solicitada después del final del flujo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "el punto de montaje no implementa el desmontado («unmount»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "el punto de montaje no implementa la expulsión («eject»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"el punto de montaje no implementa desmontado («umount») o desmontado con " +"operación («unmount_with_operation»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"el punto de montaje no implementa la expulsión («eject») o expulsión con " +"operación («eject_with_operation»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "el punto de montaje no implementa el remontado («remount»)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "el punto de montaje no implementa averiguación del tipo de contenido" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"el punto de montaje no implementa averiguación del tipo de contenido síncrona" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "El nombre del equipo «%s» contiene «[» pero no «]»" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "El flujo de salida no implementa la escritura" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "El flujo de origen ya está cerrado" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error al resolver «%s»: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error al resolver «%s» de forma invertida: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "No hay registro de servicio para «%s»" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "No se puede resolver «%s» temporalmente" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error al resolver «%s»" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Socket no válido, no inicializado" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket no válido, falló la instalación debido a: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "El socket ya está cerrado" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creando el GSocket desde fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "No se pudo crear el socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Se especificó un protocolo desconocido" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "no se pudo obtener la dirección local: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "no se pudo obtener la dirección remota: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "no se pudo escuchar: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error al vincular con la dirección: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error al aceptar la conexión: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Error al conectar: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Conexión en progreso" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Error al conectar: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "No se pudo obtener el error pendiente: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error al recibir los datos: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Error al enviar los datos: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error al cerrar el socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Esperando la condición del socket: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Error al enviar el mensaje: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage no está soportado en win32" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error al recibir el mensaje: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Error desconocido al conectar" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "El «listener» ya está cerrado" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "El socket añadido está cerrado" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "No se puede manejar la versión %d de la codificación GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Se esperaba un mensaje de control, se obtuvieron %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tipos de datos complementarios inesperados" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Se esperaba un fd pero se obtuvieron %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Se recibió un fd no válido" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Error al leer de unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Error al cerrar unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Sistema de archivos raíz" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Error al escribir en unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Este sistema no soporta direcciones de socket de dominio UNIX abstracto" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "el volumen no implementa la expulsión" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "el volumen no implementa la expulsión o expulsión con operación" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "No se puede encontrar la aplicación" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Error al analizar la aplicación: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "No se soportan URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "los cambios de asociación no están soportados en win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "La creación de asociación no está soportada en win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "No hay suficiente memoria" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Error interno: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Se necesita más entrada" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Datos comprimidos no válidos" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Secuencia inválida en la entrada UTF-8" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Se alcanzó el límite máximo del array de datos" + +#~ msgid "do not hide entries" +#~ msgstr "no ocultar entradas" + +#~ msgid "use a long listing format" +#~ msgstr "usar un formato de listado largo" + +#~ msgid "[FILE...]" +#~ msgstr "[ARCHIVO…]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "El carácter «%s» no es válido al inicio del nombre de una entidad; el " +#~ "carácter «&» inicia una entidad; si el signo et ('&') no debiera ser una " +#~ "entidad, escápela como &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "El carácter «%s» no es válido dentro del nombre de una entidad" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "El carácter de referencia está vacío; debería incluir un dígito tal como " +#~ "dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referencia de entidad sin terminar" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referencia de carácter sin terminar" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Texto codificado como UTF-8 inválido; secuencia demasiado larga" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Texto codificado como UTF-8 inválido; sin carácter de comienzo" + +#~ msgid "file" +#~ msgstr "archivo" + +#~ msgid "The file containing the icon" +#~ msgstr "El archivo que contiene el icono" + +#~ msgid "name" +#~ msgstr "nombre" + +#~ msgid "The name of the icon" +#~ msgstr "El nombre del icono" + +#~ msgid "names" +#~ msgstr "nombres" + +#~ msgid "An array containing the icon names" +#~ msgstr "Un array que contiene los nombres de los iconos" + +#~ msgid "use default fallbacks" +#~ msgstr "usar valores predeterminados de reserva" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Indica si se debe usar los valores de reserva encontrados al acortar el " +#~ "nombre en los caracteres «-». Si se proporcionan varios nombres los ignora " +#~ "después del primero." + +#~ msgid "File descriptor" +#~ msgstr "Descriptor del archivo" + +#~ msgid "The file descriptor to read from" +#~ msgstr "El descriptor del archivo del que leer" + +#~ msgid "Close file descriptor" +#~ msgstr "Elegir el descriptor del archivo" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "" +#~ "Indica si se debe cerrar el descriptor del archivo cuando se cierra el " +#~ "flujo" + +#~ msgid "The file descriptor to write to" +#~ msgstr "El descriptor de archivo en el que escribir" diff --git a/po/et.gmo b/po/et.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7ee95b545e82057dfd2acb9d884ede0cbc9f2d89 GIT binary patch literal 42531 zcmd6wd7PwGb@v~41X1>Vd02+-f$3pp*k{-V=z(!oW|~1^V65(Xy1S;TtD0JRW)Q>; zqezS!3gUu>m<0DkOhUkgaf=#FqDIZ)mZ;IVB?f(cjj!+bcg}s5s;=&7eDlZKA1=Ro zp1YrW?z!ijd!IXBKjg`GMf|<(2~l($c-VnaH1xzMdd4w&8$};IIf@PiKL$Px{Bpp5 z4)~pbKMMF*z+Zz0kp3yBc)o+d=kk0sxC3l~CGd;j(cn3!M$w7jCU7y>09Efj;A!A{ zz{|idfk%KxE{dXSz@^|};7h?Xz;aF9|YCE zzX#PWJ@7L+4qO5bgETp6f;1tz8-$e6M*@BuVF+r0v`g`fXC5E(Pa!2-R=fgf}aId z|5GXaQt&EJ^}PbT7W_oO;~|dd)d5APKjeSv?^nP}z+Z#sfEO)`qP1WPd=2;r7=xS0 zEP76ZCxEwu;@kT{_4i|-`tjB9{2$;UJnu(imG4+k`Idpow+YlZ)WDO#mxH3$1EA7< z20R@6KBy`28&KsO0~5sHnV|A-233Cz6kok0yuUZ#p9TCPsP_FNJnsiFmHt#v<9s2g z@^*l#|M?;QO`zKMC*Wb=mq3;CeJ}=}2+_pXr+{k5Md5h_RK7YWzIipsP(=@cs`uZ( zMQ;XG-p4`F;b)-u;}8l}Kem9%e+wx7c{`|neF{7j zd<;~3pHAcW8Jz)&uaofnYEa|<8BqDY2Qn3+!&fm!z}2Am|8t<;{|scvq7yIl_HG4L z{w`4Mxd)_)(OyvX{Wqv~oqLh@V>_sNUKyVM0z87}e*=~OH=xQ}3~>$w*MaKyb3wIx zH~1{@_d(I+PeG;oHmG*~G~kgCNpk06Q13^<6Tw%2hk$POre*o0@eG(ME z{5z<0$06iJ?+d|`z)A2}@DA{J@SPx2I{G*$I{X|Q0T*44%mHr(C8zd+kTlx=3S=>O z6{vFW0#)wEK-Kpzp!)x$VQ(@O1FhbuNcD zfqK3jL^Mb52Q|OG394WJ1)c$(M&&WM1ys2$Q1rP66n#Df9u9sDRQrDdiXWb^!P|cf zD1KQ9ihi5G7`zEoy4Qj#?_Hqi@M%zV`bSXde-54s9!2NHPZxozw+=$`=r!O<@T=eu zc<3e{kJX^)(gvC0(Vbunei|GAzYi+?!JB;?E&)|;1r#0b1Xb^SU<`f&yafC%xD-6? zYM&R^fNFOQ6hGevs@?a3s^<|<{Pi7B`HtS=e0UYOjOUv`(fJ*q#{2W2=<;Jwpz3|f^Sr*}!4rAD42;3ifG-JnKX^jK`~=Sh|1~@xTXKD8C8+obaQq2T^fFL< z`J++i_a}@wK0V;U0gn!NQozNa_-Hx!bnsG8^YPi>R`5+AtP%YfJQ}>J?Cl-}HJ&d9 z#aHhJMYoTEi1O(Bpwh2MyqxvmAw1s)E&=~E;5R|dqXWl1{n?<#Ya=MSz6d-Cd;q)% z{2X{0xc`LD+YR6_&$ob=f{%it%abO3-8wno4sbQ^-wa+1ejQYK$5*_*>p|sv6{van z9?;T(14_5k+cOMa!gC!|JKqbcoNs~WfhShIf7gPi@chz%e*|iNd=6CkKLK9^#xxeio4Zv^%JE8z3MXH6rE!D(;__$Vm;{|TsaPPxhD*B0#Jt+d!3fA9yhM2&j6$0BRooAUyBi@%k2ldcQhgDZGCXD0;sI zjKN1k{J((e-;-us&YT3Qy;p*&=SEO;*aJ!~+#BA1FyI%!MZEt3I0PQF%lYeKQ2B2H z6@MqFe*6ijbYB2PpI?I-ucLQ+zBQoI?*WznZJ_x1A#fS^OHllC`W_$uZJ^3|6{vnc z0E&-31D*yRa+zzUo8BpVO zH+U@gaZuy=O;CLHwA-B@hQOnE-U5m)RZ#Nt_26^Bhrwrqhri6_#`D1SJU;+l3;qHW ze{A|4ulEH3?*m2uN5NyjpMo0S177a^Jr`8`Mo@fm3n+TN8yp0`4Gw?@yu$OJ1)j(A zMo{#687O+b6+9pOJ8(64z#TrW8$gwR6L>cGHcT0BfKPb6>kFrVG4IRZ z3E=IZ=Ewcv`5{o{d<_&IJ^3zQH;2Hpd7cXR4sb2cUjbKwC%wV>Z98}d&o2$n?*~QK zuY%WrkAcd!?u|a4cY$ihN5Dnk*FmL!^4(6alR%BbX7FIJ3Q8W`3O);b3%CY+5BOB@ zzrZ8FUx5dJhuq_G_5@IL+zyJ*-vC|;eie+tqu=CoTM6#Z^Hxyh-w29t>fk}(UEmJz zouJzJ)O&rNoC03X^VOi*cNeJo9t0)7egYl_9`|N{UJgE!=Nm!MYYJ5V?*WeiKN9dC zK&5*OJPv&FTU`G;2~@rb@L2G5;L+gwz$3xG0ySU01*#nfyw&R;2E~8Zfd_&w0L3SF zf*SAlf`@}&0o9Kmfhy;~w>e$U1C@UxsCt@U4Bipq-vu7e^P}L&;5R|>=acSpeQOXD zJzoJzKD{3t2fqrc9hbb_=RpZPl;_uiD({`3==1S_KLFMKgWlogod9Yc4TtAlpxXIX z@O;)@EX{_g>m{xzW5 z^KMY(Jp`(Mp9M88KLeHSz&~&t40t(s0`G4G)y`W%rTMo1$#kavFt-awe<_icK~U!C8QIXl4g?|I?JtpV=>KS;QNG+za;0$&Io zPdJp{KLf8Oe1)LDI~<~?5cg_={!Sqr!td7-Gt*=+L-5mtg!o&)*AOJ5PUHElgzxkFQG))y;}C7*{ge6K0QZ2u2kP$#@ZZ4Y z;rT*v6=8<(CEkCNu!i4d@GXRE2ogX`2>(mJ`J3W*O!yss9}gZ$(BCPb))M{g=J%7p z7Z6s2_*a5oP$Yk^C5-TVV~9IHpyJvD#Gd_ict1>dW{7_&ZzZoU=lQ1aP6;;=E+YJb zu!Jy9cnU#(T2C$}?QtRfdY+es->>BN#|W<==?Jf8t>CG6q%uR#6X#qW~|>EEmQ@xQ~v?}4u;?ksRUcqDi__(sB+gg5j2r-auL zUcmF!1pWP^L-bzoPTrjmp1%w(CR|3?%KOiO8wmP)n?tl8cs+4{0v<~^o8OxV>EBz! zj|%Vh^7{nv#o&c{9}iaQGo@Ok94Ga$M!8a-SR5@{x_mqyzRdB;fa?No2)H@m2-u3p zE48G(XFAbu!+}Mufwy36?ioJ%h$x^d4)=rx7c%xQp?4mN_1}+?kvzS$Jr5#U| z_E^5rWTH}!OZ7OZB~wYg9oI`!NwmSI#Q8zFiOTs+XX2kKfpXUs~99UF+F!ArKpjb=P}$@OOp-B7MfRNAe0s?%!6qe-AC z^^NX{7e|ZZU6uA^qtlKX(@9;F9*kDUqm4#&s?@BKxEWuwWv#WAhBlK@c~6||uC&^% zX!U5Tt#OJw^~&zJ+?Xmc3a!RiHDM^rDjSj=u7>}otsYY{8+)QrjRGK7hH{$7LV~nDWbi10Bb|P}sO3exQ zr9BB3lx9kmT4}TfWxW+~Yq~U+M60K#Yn8E5yFw#2O$%Bpqtz{HulUO`x@WOs#;!KQ zf@iIWR=3;D%4mlgjXh{y%5e6qT;nvH_GbxU=uVQ6zTT)0ZM`lUB9e2tCfqE;pFh&C)K$w^WYdo{1fm#ttTV zy`I!|=;e-DrJn47&*03^pao=VH+CcpgHv+6QZL7amWS6=Qieq|0X5XM3fu*eTjCDA ztkA(s)^+DelP!Xu$Kxx9r{J}z$CEZGuU&BIYha3nryiL^0`@I^3P#B}s6RtV1mtN# zr(wYkWSL27dwRGsOJG7tqJ4=mn>}_3i|&-o1~a9Lna7fv&)7=6(uQX%H}{!{DnxS( z(lG+eH3a7<6Uk>Il7V$8X(4OG0N$Y~K>fC;;jv)5{hPvbK^b=1Q$mUlmU^SYm3Gs#s-Dqa!)P)T4`2 zP_4y;%S+Fe9TB}QeL}Lm)rJ(dlGodn_MUhsPFiE7XZTqede58{&-wN5T1w}}<_76!A5t%^|9<4EeFnYEm@mlK2=69zsE{Cvgmnzb8; zvO5bvR;``Q!=HEq0g2=NrhDqwD8I%+PpQ;`bt?0 zI@Xx7RxksC0-zBlnh9r2u%Kdk+q1w-=`yb_JiaVLsaDl4O)OnVRuR**pqLyss%hmW z)#e+Gol@|8NHo%t!u_x(rVuWB`q>lhv0*DrB?GM4EbEz z#k^JDY9$((c1dkStQ(Xf~C|B>tuEiy$TUDSfKuGSm7>NFXl zg;vYx@jjRp!_6korLnOD?H}pExP}$PgsMl6qArHjD3}k0NEM_=$@o66-H_=MAq%Pa zI#gVrSQ$rNZQ2&SLN5s~Sx~H{Qgck8Pw(j$o#|4A$Z|(Iv-%j8yF%PV(zasN4Y$OY z_2Z2~idqRZW>N(dH0MJ6RH>>+w4c!iMiq;Gy;_WJ%=94>%aqjlc#-P?VAlOSs!&QQ zJG1WDbm)`7mRwDhIpPYhrRk|@4Ko09Qfui>o7`JX7AJk7XXv})dWIRzIjI;S%B6Ox z(1<)@3YDcaQRJm2YGXg*W$&@k;=m6*RPRbMtDT`(G%SXHb~l(yY5%)g8s1~AW5Sm( zMQ0V^3o;>~0rYlcwOUYd5*J(!)(@$|+o5ZhY>Z_tV|<23r)b&(=vI`Gb+K}=~JI;6XQl;`3{vxh!@rNyKthe3$Q_fM`WKv_Ex?x$GnqAbi z>{*rQi<*tDH8%B^76?YSs=X!HyY4pkv_x_`lSp_Q#)~8z*PNY;;!~yIYIAZ=@jO>j z(>SxCu>lCI%&?XfyRe+bvH75O7yEdNny*^-)da0?iL~*t$+(3J8xEN);p7@c&BbCg zw|8dE6zu%mA2N8_DJ#x8dzG76yYVX2lEwHO81~81wA(A86q)x8_c9lTRf~VD^~f#y zuEAVjvRrrk3qD%Y zlagXmPinAYECsL4JoWUV99B-|9+lSz!j27CbkOiKKUnZ*b&qqam{bnh=*q3Om2){x zB-WG-zNB4fnW$;4eg+~&NLud1SqwrGoUNi&D@w%Zo(ldQ{DSA4UM zGd7VTYg1%x*!aA1E4t|jo0r*!0hPKnEvM}Hz5{@lz?29YZv+@Jl6f)_Bg>OXcH0Pz z2fgpM(~&tn7SEX)VrX?ty(4oc?BHNMYsCT+o_ltmgtG=Ew<)vn@&0KrrQ1ORNyV)3 zee`S5CX3gM?fXJnP)cL>X)0OQs7wY<%hFX7c7=OWHAZ*hv|M6ik?k?ydP)m7_c5#d ztc0_MXQkSFo4bu+$YCr@IQPlU z*!G}wRoT)7V&!R*`b?$SsB5Bhr|^x7u-P%e{!TsX-!9Y@aaX1VTF!M4)?{loor7~e z+cHo?Fr>5&pv@-H>>QQ!5P`e(GeX+Tn4Mf>X%d7^`}o_FulW+9@SO-bDKo;wA8Ium zpEO}aoYYJEv>_`rFUC$D{7)40|JEM)P`!jgHxcy`mnLHR^hShs8hLj@@={DUhrF=q zQl*J4pgn;l?$0z|dY{5N^=z}lrJ1;(du+00#B{BEQ1a5cQ>4`1S3ILu7~(#uSuEKb za{sNTjMgXPZQK9GS>>C8LGq|D(`QCI<7|FK>#@UdHJdZAXF1(as-cOqX-XcgGOo_a z%+f-uo!2N&!U{f0De!l@QBBxc8C+CetjcC>0xvvI?{;mTGu@~1T5S&credmig%wfk zVG5ECJwzL{JISzRLP9nbqG5wJfJc+|E~&@1HP*YmwK0JTwpZlK?#4!JhXiy`$M>3y zO6IcedqN~4N5Nkx4+XZnXs@#yOjp}$_U=W7y-2(}hQBleE*Sybj=Hw{FOohEwe0q(h z*Pk}c=qBoqvFib`)hh;q>X?`4@_Ct3`t0b48fhGe=v7J#K#|ZKCxKiNv1T5)GHi*$ z8{3pH68Pei9)OvhM%A#QX%`wtOth(7+?rMU3mY#Sy}D>1-B{|{&hs&1Hl(`{*7JQ8 zc5&exmn;CS7`BI~4U3_)C~e~`v^YpSaONDPy4X-@J?%76=x$(kbJ@%+Ym6h)X0svQ2QkCWoVHp}dUeLC|1RpTNf?l2S+m8(xHu_S8bzDlE=8MCJEB`p zFTA(yC-#3iaDn=>$ql$5MFe8xi*}bJ~4+%nMCcY0s=p=gUz- z?Y5^B7Lf&J%u;XKy7oB~&QTEa`~*(0EvlaWY__DDQ1GoLmv3a{TlHb5j`nGYJWaH@ z_nbv;YUGNGi@vKhJVBFB$>PTh!vdu7v$4nbyclQzAzb22i?+ zq%d2Nc0@rdiA-*{WM}2r(@5tA*qye=t3CUSS(+dy1Sr_74%)(W;Tuli$)@Qhu2O{d zYz-dtoa^w|YPHFh11GzI%eD#LCu+imy~!t~K{YiE=&S zd;}{Vb`Psv%4tEtj-O+HQFo#sg_fi~FO`~RKvc`bR0eIEKu6&A9MT?8Y6ptUo1KSJYc%G~($s8H+pw>zE z6Bw6vZM0Jnb*Jlknoh^3Y_^fsO_9PX#=sP_Fft+WtoJr7NQqI%BR{gL>6i+osd=)N z-IL?im`>JNUcE39$gGvGfa-l;2#KmnQ>&3MdA2ysTv4mO&(Hm(!8^W@i1%#}RQ!WV*a z1i5>s?KRmXu+z4P8xu#SQqPLBtuD=Cl(l(MXknJ9F`Kw2ot-&Fdo1D9ihYE@z0(*MPg;90nu!ax_C#g-F$j|f6%Fw{O#+lDt znwef{)fCcdi-Iiz+d9uZW_hQ)S?WiiQ0lPi)nwG1RP{3%c1?EBEKW*I&G348s4+ei zc(E95Th6TWU8jfb$o7tDv?&2-)0HxXm_xphBvo*!$>D2SbIT}hPH z7N54y%z44cH<;c{7BsZdAzOZ2^`b!2@xWZ%^q4l+*!hWQn^{zHHrS-;+Gfoxs}`KZ zW|7%eWWeELWbNxYlDS%viB?NW^`$C*0m;W}4Kzu&*B6>6O?@q#q7l+e2z_KA%DimU zZSq`;8*d^MZc9ttW=C0787~L( zXYi6iMdsgP*j99p9M`(xpJLd#?`$KFk&;ysh{Y3nwidFSX+%^u4(*tAs^~;21OYW> zzRntl2joU6vCx;Ju@Z+=Y&%>-;>rcyp6#_I@%HtE4&j=`Sw%VytWS90;v~w=LtlI$ z_V(S+XJ~HC?F|T;?+)qQx*f=eeRf4zKake$UgJ&gIo|dzJRf$BH))Zh+3ZZqUU4@! zFVaH>lFz>W6c4j?$LkaVD@gwYHS?Sq|M`b1kR$92`KIT%JDz=?G?k%I8Gnk7-S--l ziQMq>$I3%#$#%%p+L3RK%~hskd^&M32rH#I%Qs)ZJh6@GD7fcQmqohZVwp^Km&$xh zGsTefbaZwU%^$e6Aghte$pjg*ZPkozBa}QoBQOfLMxhrIPe%Io&1&)X>1+lR;!>w-(?yB9LnIIEI}7+tU;fdIJ_Jlt zFca-4y4DpoIE!xbNE=Oy2hPFfBLDPutai&S;RQ?&!(CFX;A~oNVlSaaQZwsHCIvV=Sk72FEoYKACfP)1(HQj*!L_a*cFqZG-pq>pFYX5)##Xf?voQS zZO6*YKAlFDjRHGJJdReRV#m+F6&0eyA!NQtXoh&(Ki4XV(-qZWR;tEWn>iN*a0@{y zEjfH3xc#j2&WpmXZu7PRFSo?m&&q$@weH0yyhngyAM#m{NpmLMG~EoJeDH-$lr=)ey*@28 zhlBoBLs!Xd@kekxgZ>9opLI!@S6^)CK>*Kly=Xy3a80fc7LHv>MTpe_ruXCpQM1M7+_LHYli6k@|-+`V;HQw!0;BZ+{kHCPn_# zz4@8F4<1zSOOR-(;3ScD7$)i*gDH49GVN(!@fYqZ!REOVxYE~(w?{MhM4+B!)N|0 zUNl&bPr4{xzIfIC+!ZiWnJBR>T}81? zG(x}KT>+ewsI>P!y!YYh2&Yo`wPEl5?3uVZT#2#H;wj!tR7^|Q$xnP1wa#d%-Qk!k zj`w(G?}Lmm$~`)+_7;MhplmX_oV=#cPs;=qUBV{ zt^}ym_))4&bXqj4!|}#JIn|h0PIua}6AD{PcP5jKN_l6=bElUARNHh!$DoI}7J!}9 z3Kng(Rw%K;4vJG;?a&U|P@<r!y68 zDY2bj=6hAKOB;=KWwbTXoeeCzDlj(6n(fKKidMCXiv*i9YwfTdMJv;Rfki7$m8+(L z5?oOS7$u1W?0Djq6UWAozkvm3_TCT6wo#AB&~8kMEU>6u5-_s&K|a->PtA_35(-pX zAX&5y4-XG8y){e2imF|y#??F`DH)SYYXX)_#Vi)nn-Me16Am{kUfY~0)|Fb2pCLDC zgHNT51;e+8NnShCwI_S6)A280vfRy#GFhHy8VwOs^fpkv=r?I%7 z0@2%^eAT`8x476NA#*r>LRFc_?S$J5$XMod*uFFSIg~ky*hdL#aPZ2PKS%C;HDDya zwV+@7=dXOhlc84OrVDXEaWZrd1y_g67tK_b!d{tS61E|AI%n3{^z0d)y${=2AxU>t z%GC%;Wx_fYpeAu!(X%_9WO_!M23uo#%4;Xck$PFP0fxiJSQ<_6^dRq)I$GVF$pn*Mr_jqjOtqb*1`^jk zqJd^3w5L^S&UEB3%Ej6Ob8m!5Gl)pMEcBzNvD1=~tqwwt1&O&L*^bbZmwWal3vggh zb|}@v1FuoXeqn}`+DLGT+-W&?ZGD{}7h8C32bCcXpBVjs`?Dwm@a!$?f8pcJ{@++%-Q#v@uDtM za8YhY=u-g=eb$BJeSBnPMX?R!C>GQx=HfKW;m4W5Je+Vfw-}|@Dxk)5G%B-;xg>`B z4MYxfrDkKY8Z-(fC7LD5bcacRHj=JKnw5c5?LLJeXDPlhulnI#4f1qCm7FBOC#|hQ zSe?yTxuG)+!NfsO)99#1g1$Db+AMt zO`i&uaD4SpMU%qTw_(%PgOn=f?WSV7utuwAn3S0Rp)Znt+^E1cacPtEhFY~zXVP@e zs}wdVYY_14o6Ei_3i(y6>nw9D<$E7Y7y(9@cort*aiQ*+FwfE(ankjG^PCHn^=gHi zztF?41cC}}&d*8?MH@SK(VJzd_&IT+Z7f1D1Lk%Tzw3J+MAX}gQ8V#rDN?fvnas9! zZ>&rAbS5T+d}bhKbF>&EJCbF+U#8F;vx>M&pxDIlZc)qM%8Ft=ny!>GGb(R$u6(5? zRvwqCN4yW&CfDwo|b`n6{QRPFfSoDbaJJwD}hA3bcKFRbAq`p2~)J%y@jK; zNI%wMFoF50??AlA7&88tk|6J;Ne_6vr!22)j>y@`nbKIwt^xKdDOCf~WxPNVr(SM? z6{38!$=fGeN@Y#Qj#b}H>DJx{**!qm%n|P$#L=Kdyr;=CXoqHNOAlq{&z)$#Qd*VC z_I&XkXKT82`kpqF@N3Ycpaad7$_A)b(nR!5_;}BHopYc?O>1RumWvtl6yB~XE`Z)9 z1;)m2(%agU+I^zJ*;7Q5+>cc$tupd^%Ek|=J`|lKER)vQKB-fB`BLIKunLSNr-Gu@ zQvu3c9euQ4-Cafncu|5Yl&%xRZ_zHM~9gjDc#kRVJ^IB}Vcr z4N?fj5r3PXoimZ#FS{+NGxE4K+O1x$>z6_M;`kD0bEqs?79wXeGaSq)^;WrDjAdCs zr&2-CIMJ)QGqDgCgbec8;!vG(@x2f$1BZm>8s}Fq|Xf>^|4V(TmPx?#Q*n zav@t+LjSnBYa#7wba&!;(v4QAe4<&JV!fC<8H=b3r0yhW5-pwC9irWuwm!w>EHIZ0 zt9v}orXY+hcOHq@wbJDtb9d|UE?8tOetT7rFG7PUF?F@(}F|@ zf!P(*xUC|aO1J@=a>2~aYau~iZ!xK{R)5tkv^!nc!pz8uDUNIRG{o*hMh7F%+#r}5 zl4&9}w8ODQiaDi^r&G0VsMfUQ#hEIbdXlf%-4O*A*q{xdysjC}322nG;JCQc&Y6kh zbUX@^s$1%3w@4Ig=!9H z8ywB3684`LmZo7*V+f>z%yGMfEu!H@i6MO$GsAu}6v#Z=tJ#ZYuhN`VzD=i_Cfuv; zieu`b(^V5%`+Vb9mrZPSE)4UW_fyGeslvH%_FUx&hX5vpt05&U!_m*QSAoqnd)?FR z>%zjE6=@zeWwH%FYc6$$p;FbEKfzrbYOuLhXOJ;AyEd1q9jVLtRTM_CR%5g>6K!P3 z=o}@Ioav+;3fq5I4%_9&0gWy$Nk$5~oh@DbPS+9UC2YW+J745TMKNa(bmFoS?c`S$ z+gi7;438_Z*H?-Cs)~hGP|S1g*;yVNP#euu=5*Qb)^;P!G#40(E+$ONX`lLABuJY| zn!ncz6C`&Vq#!drb7WSp8N3kI}GE2h&S-YTkH4G$a_jhb_~l;+8m zmMq&=Mqhp#Hl|%UHa9Y3mFC$8J!r6Rvg11|?kc$$!k<=m<_q1Jl~#_>G|q1&37?*q zIRnhC?@f+}h3hH0lVuy}63CsMtZl9uBf8}WH#5cPNmqk|B%3~IjpnaT)mf*axg|7C z1$RAaoZRi&^eHu5hDF=@B%IOI!4F?*7}0!!^h?LPuodB>?H|Oswyi@A`9z{?h!d}=U%8)p^OyJ?cP>9;7!So zq+7Ks+9F}(ZEucE3Ef$tT^B9&Rqa&T;a(#8mTPMS^FRs1u_HcB?j1qod05Q6aQ8P9 z3oN9tM$KDBAw`i7ddicx+@mK-(Rx32Fx{D)VP>F?u(^ZGO}En20TW6rp6fd7Il33N zYrWPqGAU-uV{oCkB+IX@$V|vE>BRMR7Xx1{%%B}|aYesl1DOz;JAI#%0-kGDo3gVD zt}WaAWOnyg%$z5Y1=@m`i8gEdieozIT{oCnnNiG2B>P(i52r}XHzV)s3{Ei?QQzmc zmDBh#(;l`3Vuszjute~oQ~EEQXrC=T(G)fo{RRwM5i>6l3kS!8G&gNIkl5rThMekl z3dt%>y}sJa6WN<`T_|IE4y35Wde?0xxi_cSkggKgGUz&s1-FKCMqOFv?UK!^uFlLy z0J|Ea)UH*gr&(ffmzYO_W>|AMwpH)6?6q$=jz;VBLB19`#sc-owjoD@Qo%779ObFJ zMuSDz=3NM9+O%(0?2QpQ+AJ{vW3Y$Miluk{Di}tnJ8*2R6KyS?Gz+H`s6x5(q%$SX zulc^yR$R7n4TbUUn`Rrw4w9xTzlao_;#!hz)@Hkt1B=em(J%H;&T>_Awq zOle|Cg}w;4L3g=!?FMXQ#*&fO7cJYbvoitNPTlO{_y>df6xWjuosa7`kXqD#CVh|u zZlhD=Hn;%F|8O}>6lcw&Job53fZnKjkn2G9x`J& ztSz{yvJ@zpq7Dc4e7$v&Trz(LXmz^nJ%J>EiZB@4=H`jRbKdb%yi+Kw^r%oF!*3ML zmKcu7U=B?;dlr_*WL#ti(1+v_=3_XfNC9rsAy8Av-Q4Hqd29|&QoGBSG!3148TG|c=DhKx2@sC<%6#I& zvBz76H(9o`R%MP%Mzgjq+yv}8nVDX#VS=7Tk6YC9Gpy{Q`|;yw8wO-&mZrrrfbO>? zKjDFl^xXye*u7q@V-nd()^JIeXYq3lX%1U)`ToVkeCPll#m+u+u{c)~LbB1|JkSw}U?_1%L8=}F z-vT_By$T}ImgrVhXSm}*zcOQSSbP0mjgC&Llgk}Ka=}45c?7d#c6phZp`1E1sBoP& zZ?um%-UK^hqMiLtsb%_!_BgsU)UD;kvC zR~*H}F=cL>VgY_*h9_%B>nj`)C)y^7%k*&_AP$NtG#%LLd?3IjJ!fhp_9-4`5ZThIEGrbaS!$1?EGqa1Zqtt6udX|uX4KS3J z`i!jqg$7!tv?JOb&1##~L?w0gNv+Lvd1iR#Imtdmp!4u+_=L2UJ8t$_{oaS<A0X z0Z7@{glwCk^z_ZTy4toQ$*5>7roCyjIq3cyBTH{|&!#XnnUS_BoJq_SsBl;+)pdh5 z6{YDAh@7y|bVDsKX_dttHWtuuRfmzl zlClnFTNAxoFupmGm1LRn2A~u7T-y;o>d-2b5{5%`qKSRbkrfnPN{=_iTMG`?8k?xf z$-x<~CT5H~vYjcTk#P9R$FO_*#Qgt72CMZXFCK#`M9HNhujDZL5ueYZV``JAQAH~^ zZ-08;E2}%SWt&8yw&oE*`9dWlmu-E0RV(vBXQ*?YZl^jQm6*;~;r2q-b)8z5GHHGp zJcrpgK%B;wIwwKNr#A9m`@vS6@-E?fSY3w%_zo_c3T8R_mlLSp2wfe`_9dYwXPcvR zEHj?OEfv*VF3Hz5Z_dt6j*Ll&A!2{K66E&a7Or^;Fl!Za3KcRvV&Xg|!f5ce={p{I zY+T{C1MqU*MAvWId)LU?aN~#mg{!8UXPuUA`v~hYm&la(w;MUU!xAU;S~umTYZAA8 zbmwDWp+EI)H!V*l)&vt8+2f~QA-e3gu#q>|YVa@BU~BN@G+viNBJIU;CxdKz^VEdR zQvO-m!PIWc?NV=6J8IeYR@vU1jpE!NTs35d=y0;mk;wOxog#4wr>~m%47nwp0hV+! z=wz2}!Ga;>iOJrgiqK0s#zKd@oYCoe#p}FX$6KUrLy-f;Xx1$t)>J;WV23Vf{+={v zn(P7)*-N%Z!}5i!wtZteCT}c&CC(6;QlGZpJ)oI(RycQFEoJA<*;2D@A>TQO?4XM+ zKIvghu|uk@(l$Dh3VInn`%cv}rK<8vhLs{*1_JMeFXcFP((+D{J2FF`U+*>B|22aimjtQ=3AdB85W$<<*e=!5j#~Y5$d%*K}ipL>c}Yf z=Z0%TeC`G_U$kMBshR95N3c)6k=Xs@mGm%>n?kJp7*dm*s1%f? zdz6W#)I`$dA!Y<|qMY;k-X1^X!Q@DH5i%cA@KEZI6Q93^C#f*Vi5c2ruZx}HgrA(# zqZY@fq&Gxbu!Ah6C5Xw8fb~iXC5lmG-_Oj!{y3rZVfy0UM6;$rNH^DXXg6efOfaQG zi9Ppv%&MSW;x0gZ=u)>iG7_#AnUxIVwp}Tt3%7>MN=JL=N@`8+iL@zPY;*tHNM=<7 zKl7a#|E#$dMwcHw)MeV$tNb$-b@`H&+*F&<56 zt_f(^DkGc$G+&uyfQf{h0nLQ-J%Ommw6;6K2W5TQtkzYgr0d&#B>H63b&kSf7$Pe( zOk`G@R)@PjG$}{5qVK&Qvq-(sKD73<+6(~79zU6^D$OLYoVBKk`&7Z()^pHPq$;e8 zg>SEHko19epn1B|Dz#J;860*uNlpk?Rk9MNSrK(72!8IV68~7O4oGlEiAYrCRD-6i zM1;@KE_a_=i}ycUgl)H@!r4kDjZ@RL5m!b`b2fE^iHIEFBlKM5@Xk$_@E7NVz^IG| z!x)5qnZ`%cmoJO$>XNFQ*=nL`Re2xzH+NtzeTt(N^;Nhi^N**QYog6Ff_!CSA^*QuK>XkU literal 0 HcmV?d00001 diff --git a/po/et.po b/po/et.po new file mode 100644 index 0000000..a36309d --- /dev/null +++ b/po/et.po @@ -0,0 +1,2069 @@ +# GLib'i eesti tõlge. +# Estonian translation of GLib. +# +# Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. +# Copyright (C) 2007-2010 The GNOME Project. +# This file is distributed under the same license as the GLib package. +# +# Allan Sims , 2002. +# Ivar Smolin , 2005-2010. +# Priit Laes , 2005, 2007, 2009 +# Mattias Põldaru , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: GLib MASTER\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 09:47+0200\n" +"Last-Translator: Ivar Smolin \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Ootamatu rekvisiit '%s' elemendile '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Elemendil '%2$s' ei leitud rekvisiiti '%1$s'" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Ootamatu silt '%s', oodati silti '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' on ootamatu silt '%1$s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Andmekataloogidest ei leitud korrektset järjehoidjafaili" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI-le '%s' on juba järjehoidja olemas" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI-le '%s' ei leitud järjehoidjat" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' järjehoidjas pole MIME tüüpe määratud" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' järjehoidjas pole privaatlippu kirjeldatud" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' järjehoidjas pole gruppe määratud" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Rakendus nimega '%s' pole '%s' kohta järjehoidjat registreerinud" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Tõrge rea '%s' käivitamisel koos URI-ga '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Teisendamine koodistikust '%s' koodistikku '%s' ei ole toetatud" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Konverterit '%s'-st '%s'-ks pole võimalik avada" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Vigane baidijada sisendi teisendamisel" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Viga teisendamisel: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Osaline märgijada sisendi lõpus" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Taandresiimi '%s' pole võimalik teisendada kooditabelisse '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' ei ole failiskeemi (\"file\") jaoks absoluutne URI" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Kohaliku faili URI '%s' ei või sisaldada märki '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' on vigane" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' hostinimi on vigane" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' sisaldab vigaseid paomärke" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Rajanimi '%s' ei ole absoluutne rada" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Vigane hostinimi" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Viga kataloogi '%s' avamisel: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ei saa eraldada %lu faili \"%s\" lugemiseks" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Viga failist '%s' lugemisel: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Fail \"%s\" on liiga suur" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Tõrge failist '%s' lugemisel: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Tõrge faili '%s' avamisel: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Tõrge faili '%s' rekvisiitide hankimisel: fstat() nurjus: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Tõrge faili '%s' avamisel: fdopen() nurjus: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Tõrge faili '%s' ümbernimetamisel nimega '%s': g_rename() nurjus: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Tõrge faili '%s' loomisel: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Tõrge faili '%s' avamisel kirjutamiseks: fdopen() nurjus: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Tõrge faili '%s' kirjutamisel: fwrite() nurjus: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Tõrge faili '%s' kirjutamisel: fflush() nurjus: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Tõrge faili '%s' kirjutamisel: fsync() nurjus: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Tõrge faili '%s' sulgemisel: fclose() nurjus: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Olemasolevat faili '%s' pole võimalik eemaldada: g_unlink() nurjus: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Mall '%s' vigane, see ei tohiks sisaldada '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Mall '%s' ei sisalda XXXXXX-i" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Tõrge nimeviida '%s' lugemisel: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Nimeviidad ei ole toetatud" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Konverterit '%s'-st '%s'-ks pole võimalik avada: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ei saa teostada toorest lugemise g_io_channel_read_line_string'i sees" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Lugemispuhvrisse jäi teisendamata andmeid" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanali katkestus poole märgi pealt" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ei saa teostada toorest lugemise g_io_channel_read_to_end'i sees" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Tõrge faili '%s' avamisel: open() nurjus: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Tõrge faili '%s' avamisel: mmap() nurjus: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Viga real %d märgil %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Nimes on vigaselt kodeeritud UTF-8 tekst - vigane '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' pole korrektne nimi " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' pole korrektne nimi: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Viga real %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Viga '%-.*s' parsimisel. See võiks olla märgiviites olev number (näiteks " +"ê) - võibolla on number liiga suur" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Märgiviide ei lõpe semikooloniga. Enamasti kasutatakse ampersand märki ilma " +"kavatsuseta olemit alustada - märgi see kui &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Märgiviide '%-.*s' ei teisendu lubatud märgiks" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Avastati tühi olem '&'; lubatud olemid on: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Olemi nimi '%-.*s' on tundmatu" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Olem ei lõppenud semikooloniga; kõige tõenäolisemalt ei kavatsenud sa " +"ampersandi kasutades olemit alustada - märgi see kui &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument peab algama elemendiga (nt: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Märk '%s' ei ole märgi '<' järel lubatud, see võib mitte olla elemendi nimi" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Veider märk '%s', elemendi '%s' lõpusildi lõpetamiseks oodatakse märki '>'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Veider märk '%1$s', pärast elemendi '%3$s' tunnust nimega '%2$s' oodatakse " +"märki '='" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Veider märk '%s', oodatakse märke '>' või '/', mis tähitaksid elemendi '%s' " +"sildi algust või lõppu, ühe võimalusena ka rekvisiiti. Võib-olla kasutad sa " +"rekvisiidi nimes vigast märki?" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Veider märk '%s', oodatakse võrdusmärgi järel tulevat jutumärki, mis aitaks " +"rekvisiidile '%s' väärtust seada (element '%s')" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Märk '%s' ei ole lubatud märk elemendi '%s' nime sulgemise järel, lubatud " +"märk on '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' on suletud, avatud elemente ei ole" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' on suletud, kuid praegu avatud element on '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument on tühi või sisaldab ainult tühja ruumi" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument lõppes ootamatult ilma avatud nurksulgu '<' sulgemata" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument lõppes ootamatult ilma, et avatud elemente sulgemata - '%s' oli " +"viimane avatud element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument lõppes ootamatult, sildi <%s/> lõpetamiseks loodetakse näha " +"nurksulgu" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument lõppes ootamatult elemendi nime sees" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument lõppes ootamatult rekvisiidi nime sees" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument lõppes ootamatult elemendi avamise sildi sees" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument lõppes ootamatult pärast rekvisiidi nime järel olevat võrdusmärki, " +"rekvisiidi väärtus on puudu" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument lõppes ootamatult keset attribuudi väärtust" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument lõppes ootamatult elementi '%s' sulgemissildi sees" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokument lõppes ootamatult kommentaaride või töötlemis juhiste sees" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "rikutud objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "sisemine viga või rikutud objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "mälu lõppes" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "tagasiviidete limiit saavutatud" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"muster sisaldab kirjeid, mis pole osalise vastavuse otsingu puhul toetatud" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "sisemine viga" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "osaliste vastete otsimisel pole tingimuslikud tagasiviited toetatud" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "suurim rekursioonide arv saavutatud" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "töötsooni suurim tühjade alamstringide arv saavutatud" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "vigane reavahetusmärgiste kombinatsioon" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "tundmatu viga" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ mustri lõpus" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c mustri lõpus" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\ järel on tundmatu märk" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "tõstumuutmise märgid (\\l, \\L, \\u, \\U) pole siin lubatud" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} kvantori numbrid pole järjekorras" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} kvantori number liiga suur" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "märgiklassil puudub sulgev ]" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "märgiklassis on vigane paojada" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "märgiklassi vahemik pole järjekorras" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "pole midagi korrata" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "tundmatu märk pärast (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "tundmatu märk pärast (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "tundmatu märk pärast (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-i nimelised klassid on toetatud ainult klassi sees" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "puudub lõpetav sulg )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ilma algussuluta (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R või (?[+-]digits järel peab olema )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "viide olematule alammustrile" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "kommentaari järel puudub sulg )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regulaaravaldis on liiga suur" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "tõrge mälu hankimisel" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "tagasivaate esitus ei oma kindlat suurust" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "vigane number või nimi pärast (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "tingimusgrupp sisaldab rohkem kui kahte haru" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( järel oodatakse esitust" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "tundmatu POSIX-klassi nimi" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-i koondavad elemendid pole toetatud" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "märgi väärtus \\x{...} jadas on liiga suur" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "vigane tingimus (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ei ole tagasivaate esituses lubatud" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursiivne kutsung võib jääda lõpmatusse tsüklisse" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "alammustri nimes puudub katkestaja" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "kaks nimelist alammustrit on sama nimega" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "vigane \\P või \\p jada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "tundmatu omaduse nimi \\P või \\p järel" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "alammustri nimi on liiga pikk (maksimaalselt 32 märki)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "liiga palju alammustreid (suurim lubatud arv on 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "kaheksandväärtus on suurem kui \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupp sisaldab rohkem kui ühte haru" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE grupi kordused pole lubatud" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "NEWLINE võtmed pole kooskõlalised" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"võtmele \\g ei järgne looksulgudes nimi või (soovi korral looksulgudes) " +"nullist erinev number" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ootamatu kordus" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "koodi ületäitumine" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "kompilaatori tööruumi ületäitumine" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "varem kontrollitud viidatud alammustrid ei leitud" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Viga regulaaravaldise %s vastavuse otsimisel: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE teek on kompileeritud ilma UTF8 toeta" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE teek on kompileeritud ilma UTF8 omaduste toeta" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Viga regulaaravaldise %s kompileerimisel %d. märgi juures: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Viga regulaaravaldise %s optimeerimisel: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "oodati kuueteistkümnendsüsteemi numbrit või '}' märki" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "oodati kuueteistkümnendsüsteemi numbrit" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "puuduv '<' märgiviites" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "lõpetamata märgiviide" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "nullpikkusega märgiviide" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "oodati numbrit" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "keelatud märgiviide" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "liigne lõpp '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "tundmatu paojada" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Viga asendusteksti \"%s\" parsimisel märgi %lu kohal: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tsiteeritav tekst ei alga jutumärgiga" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Vastavuseta jutumärk käsureal või kestprogrammi tsiteeritud tekstis" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst lõppes pärast '\\' märki. (Tekst on '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Tekst lõppes enne kui leiti vastav jutumärk %c jaoks. (Tekst oli '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst puudus (või sisaldas ainult tühja ruumi)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Tõrge andmete lugemisel alamprotsessilt" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Tõrge toru loomisel alamprotsessiga suhtlemiseks (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Tõrge alamprotsessi torust lugemisel (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Tõrge kataloogi '%s' muutmisel (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Tõrge alamprotsessi käivitamisel (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Vigane programmi nimi: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Vigane string argumendivektoris %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Vigane string keskkonnamuutujates: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Vigane töökataloog: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Tõrge abiprogrammi käivitamisel (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ootamatu viga, kui g_io_channel_win32_poll() funktsioon luges " +"lapsprotsessilt andmeid" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Tõrge andmete lugemisel alamprotsessilt (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ootamatu funktsiooni select() viga andmete lugemisel alamprotsessilt (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ootamatu viga funktsioonis waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Viga poolitamisel funktsiooniga fork() (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Tõrge alamprotsessi \"%s\" käivitamisel (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Tõrge alamprotsessi sisendi või väljundi ümbersuunamisel (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Tõrge alamprotsessi poolitamisel funktsiooniga fork() (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Tundmatu viga alamprotsessi \"%s\" käivitamisel" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Tõrge piisavate andmete lugemisel lapsprotsessi torust (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Märk on väljaspool UTF-8 ulatust" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Vigane jada sisendi teisendamisel" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Märk on väljaspool UTF-16 ulatust" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Kasutamine:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[VÕTI...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Abiteabe võtmed:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Abiteabe võtmete näitamine" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Kõikide abiteabe võtmete näitamine" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Rakenduse võtmed:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Täisarvulist väärtust '%s' pole võimalik %s jaoks parsida" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Täisarv '%s' %s jaoks on väljaspool lubatud piire" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Arvväärtust '%s' pole võimalik %s jaoks parsida" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Arv '%s' %s jaoks on väljaspool lubatud piire" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Viga võtme parsimisel: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Puuduv argument %s'i jaoks" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Tundmatu võti %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Sobivat võtmefaili pole võimalik otsingukataloogidest leida" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Pole tavaline fail" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Fail on tühi" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Võtmefail sisaldab rida '%s', mis ei ole võti-väärtus paar, grupp ega ka " +"kommentaar" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Vigane grupi nimi: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Võtmefail ei alga grupiga" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Vigane võtme nimi: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Võtmefail sisaldab toetamata kodeeringut '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Võtmefail ei sisalda gruppi '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Võtmefail ei sisalda võtit '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Võtmefail sisaldab võtit '%s', mille väärtus '%s' pole UTF-8 kodeeringus" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Võtmefail sisaldab võtit '%s', mille väärtus pole võimalik kasutada." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Võtmefail sisaldab võtit '%s', mille väärtust pole võimalik kasutada." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Võtmefail sisaldab võtit '%s' grupis '%s' aga selle väärtust pole võimalik " +"kasutada" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Võtmefail ei sisalda võtit '%s' grupis '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Võtmefail sisaldab rea lõpus paomärki" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Võtmefail sisaldab vigast paojada '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Väärtust '%s' pole võimalik numbrilise väärtusena kasutada." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Täisarvu väärtus '%s' on väljaspool lubatud piire" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Väärtust '%s' pole võimalik ujukomalise väärtusena kasutada." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Väärtust '%s' pole võimalik tõeväärtusena kasutada." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s-le edastati liiga suur loendi väärtus" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Voog on juba suletud" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operatsioon tühistati" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Vigane objekt, lähtestamata" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Sisendis olev mitmebaidine jada on poolik" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Sihtkohas pole piisavalt vaba ruumi" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Tühistatav käivitamine ei ole toetatud" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tundmatu tüüp" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s failitüüp" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s tüüp" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Ootamatult varajane voolõpp" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Nimeta" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Töölauafail ei määra Exec-välja" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" +"Rakenduse käivitamiseks vajalikku terminalprogrammi pole võimalik leida" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kasutaja rakenduse seadistustekataloogi %s pole võimalik luua: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kasutaja MIME-seadistustekataloogi %s pole võimalik luua: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kasutaja töölauafaili %s pole võimalik luua" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s oma definitsioon" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "seade ei toeta väljastamist" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "seade ei toeta ei väljastamist ega väljastamist koos operatsiooniga" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "seade ei toeta meediumi olemasolu pärimist" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "seade ei toeta käivitamist" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "seade ei toeta seiskamist" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem'i kodeeringu versioonid %d pole võimalik käsitseda" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Vigane märgiste arv (%d) GEmblem'i kodeeringus" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon'i kodeeringu versiooni %d pole võimalik käsitseda" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Vigane märgiste arv (%d) GEmblemedIcon'i kodeeringus" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Oodati GEmblem'i GEmblemedIcon'i jaoks" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operatsioon ei ole toetatud" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Sisalduvat haaget pole olemas" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kataloogi peale pole võimalik kopeerida" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kataloogi pole võimalik kataloogi peale kopeerida" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Sihtfail on olemas" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kataloogi pole võimalik rekursiivselt kopeerida" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Ühendamine ei ole toetatud" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Viga faili ühendamisel: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Erifaili pole võimalik kopeerida" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Määrati vigane nimeviida väärtus" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Prügikast pole toetatud" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Failinimed ei tohi sisaldada märki '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "köide ei toeta haakimist" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Selle faili käsitlemiseks pole rakendust registreeritud" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Nummerdaja on suletud" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Failide nummerdajat kasutatakse väljastpoolt" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Failinummerdaja on juba suletud" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon'i kodeeringu versioonid %d pole võimalik käsitseda" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Vigaselt vormindatud andmed GFileIcon'i jaoks" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Voog ei toeta query_info't" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Voogu pole võimalik kerida" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Sisendvoo kärpimine pole lubatud" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Andmevoo kärpimine pole toetatud" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Vale arv märgiseid (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Klassinimel %s puudub tüüp" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tüüp %s ei toeta GIcon liidest" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Liik %s pole klassifitseeritud" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Vigaselt vormindatud versiooninumber: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tüüp %s ei toeta from_tokens() funktsiooni GIcon liidese jaoks" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Antud ikooni kodeerimise versiooni pole võimalik käsitseda" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Sisendvoog ei toeta lugemist" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Voogu juba kasutatakse väljastpoolt" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Sokliaadressi jaoks ei ole piisavalt vaba ruumi" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Toetamata sokliaadress" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Vaikimisi kohaliku kataloogimonitori liiki pole võimalik leida" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Vigane failinimi %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Viga failisüsteemi andmete hankimisel: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Juurkataloogi nime pole võimalik muuta" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Viga faili nime muutmisel: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Faili pole võimalik ümber nimetada, failinimi on juba olemas" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Vigane failinimi" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Viga avamisel: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kataloogi pole võimalik avada" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Viga faili eemaldamisel: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Viga faili prügikasti viskamisel: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Prügikataloogi %s pole võimalik luua: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Prügikasti ülemise taseme kataloogi pole võimalik leida" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Prügikasti kataloogi pole võimalik leida või luua" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Prügiinfo faili pole võimalik luua: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Faili pole võimalik prügikasti visata: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Viga kataloogi loomisel: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Failisüsteem ei toeta nimeviitasid" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Viga nimeviida loomisel: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Viga faili ümbertõstmisel: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kataloogi pole võimalik kataloogi peale liigutada" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Tõrge varufaili loomisel" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Viga sihtfaili eemaldamisel: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Erinevate haakeseadmete vahel liigutamine pole toetatud" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Rekvisiidi väärtus ei tohi olla NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse stringi)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Vigane laiendatud rekvisiidi nimi" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Viga laiendatud rekvisiidi '%s' seadmisel: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Viga faili '%s' kohta andmete hankimisel: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (vigane kodeering)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Viga failideskriptori kohta andmete hankimisel: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse tüüpi uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse tüüpi uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse baitstringi)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Nimeviitadele pole võimalik pääsuõiguseid määrata" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Viga pääsuõiguste määramisel: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Viga omaniku seadmisel: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "nimeviit ei tohi olla NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Viga nimeviida seadmisel: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Viga nimeviida seadmisel: fail pole nimeviide" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Viga muutmise või kasutamise aja määramisel: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinuxi kontekst ei tohi olla NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Viga SELinuxi konteksti seadmisel: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux pole selles süsteemis lubatud" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Rekvisiidi %s seadmine pole toetatud" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Viga failist lugemisel: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Viga faili kerimisel: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Viga faili sulgemisel: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Failimonitori vaikimisi tüüpi pole võimalik leida" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Viga faili kirjutamisel: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Viga vana varuviite eemaldamisel: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Viga varukoopia loomisel: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Viga ajutise faili nime muutmisel: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Viga faili kärpimisel: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Viga faili '%s' avamisel: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Sihtfail on kataloog" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Sihtfail pole tavaline fail" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Faili muudeti väljaspool" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Viga vana faili eemaldamisel: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Pakutud GSeekType pole sobiv" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Sobimatu kerimise päring" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream'i pole võimalik kärpida" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Mäluväljundi voo suurus pole muudetav" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Mäluväljundi voo suuruse muutmine nurjus" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Kirjutamise töötlemiseks vajaminev mäluhulk on suurem kui saadaolev " +"aadressiruum" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Küsitud ümberpositsioneerimine osutab andmevoo algusest ettepoole" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Küsitud ümberpositsioneerimine osutab andmevoo lõpust kaugemale" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "haage ei toeta lahtihaakimist (unmount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "haage ei toeta väljastamist (eject)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"haage ei toeta ei lahtihaakimist (unmount) ega lahtihaakimist koos " +"toiminguga (unmount_with_operation)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"haage ei toeta ei väljastamist (eject) ega väljastamist koos toiminguga " +"(eject_with_operation)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "haage ei toeta taashaakimist (remount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "haage ei toeta sisuliigi arvamist" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "haage ei toeta sünkroonset sisutüübi arvamist" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostinimi '%s' sisaldab '[' aga mitte ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Väljundvoog ei toeta kirjutusoperatsiooni" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Lähtevoog on juba suletud" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Viga '%s' lahendamisel: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Viga '%s' pöördlahendamisel: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' teenuskirje puudub" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ajutiselt ei suudeta '%s' lahendada" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Viga '%s' lahendamisel" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Vigane sokkel, käivitamata" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Vigane sokkel, käivitamine nurjus kuna: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Sokkel on juba suletud" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocketi loomine fd-st: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Soklit pole võimalik luua: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Etteantud protokoll on tundmatu" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "kohalikku aadressi ei suudeta määrata: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "kaugaadressi ei suudeta määrata: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "pole võimalik kuulata: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Viga aadressile sidumisel: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Viga ühendusega nõustumisel: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Viga ühendumisel: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Ühendumise edenemine" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Viga ühendumisel: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Aktiivset viga pole võimalik saada: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Viga andmete vastuvõtmisel: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Viga andmete saatmisel: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Viga sokli sulgemisel: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Sokli ülesseadmise ootamine: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Viga sõnumi saatmisel: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage pole windows-platvormil toetatud" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Viga sõnumi vastuvõtmisel: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Tundmatu viga ühendumisel" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Kuulaja on juba suletud" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Lisatud sokkel on suletud" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon kodeeringu versiooni %d pole võimalik käsitseda" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Eeldati ühte kontrollsõnumit, aga saadi %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Ootamatu kõrvalteabe tüüp" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Eeldati ühte fd-d, aga saadi %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Saadi vigane fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Viga unix'ist lugemisel: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Viga unix'i sulgemisel: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Failisüsteemi juurikas" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Viga unix'isse kirjutamisel: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Abstraktse unix-domeeni sokliaadressid ei ole sellel süsteemil toetatud" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "kõide ei toeta lahtihaakimist" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "köide ei toeta haakimist või haakimist koos tegevusega" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Rakendust pole võimalik leida" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Viga rakenduse käivitamisel: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI-d ei ole toetatud" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "seose muutmine pole win32 keskkonnas toetatud" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Seose loomine pole win32 keskkonnas toetatud" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Pole piisavalt mälu" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Sisemine viga: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Vaja on rohkem sisendit" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Vigaselt pakitud andmed" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Sisendis on vigane UTF-8 jada" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Masiivi suurima suuruse piir ületati" diff --git a/po/eu.gmo b/po/eu.gmo new file mode 100644 index 0000000000000000000000000000000000000000..03891e7fa4afd8188e504cfaec7a9c3d9b76cf55 GIT binary patch literal 44820 zcmd6wcbpwpdG`k=G}(Y{-0N7jw7a&htl}a|a*=G=7LqL4k}$Sq#O&VL-Rpbz-t{e( zw8j_$CKLyZX*RtR;7!1U5_&NuB!Rqd=m{+Z5;`G(Q-OSc&pBsiZdmI-B z@y8y2>G4e~(;3s%5Y;M2ehz;}VC zfj;_-;`B`x2;j z>4u-tN#HVY6G)SzCP)*adq7ATeZ=FpLH>&#dZugV*-ZQ zP2f84IpA{eQy@vAU;6u)%8%oIJE-T=pz41in1JsGF9%PelcLK6D7xJPt_A-JRQ(U5 z@JqleLDlzc@LKSb9#4iiqE`nLo!-p<)ZZ_I7lXe7&jl}B5k;H97We}2LtqSUC$s1| z3!Vbr0g7+m0II(q1J#eO`1_xMM{@rN8moLKg37l7RKD$?#-RqD20jZEz1|8c-Cu%7 zgWm@=C4K{{oD*Pz7(5$P{vDv|uYuyLr~BtG_xN6qp9j^xpZfbpKuo1S1JpRL2UXr) zQ1##H-@go0``!s21%3fkIo}6k@DPY5zCImPJ1+G1yFlfugW{XJK!z%MKd5@Y2c8T@ z=ehi+fDCoC2Gsi$RC{g%RnEQs`3FGN_jyp`|6`CLjz-Uiw&1m(=F_u4rTe(YuYnhF z{{YBTj?P`<=E?P-+VK>SsT92eRC%8OMTeh*;*TRKRQer{i$AZ5E z)!s+aIDSTFf#U1b-`@pl{QnYEzJCUp3enN)m?Pi@Q2hVbpq~F6WXPgZ*Sq%a1Xcb% zQ0=)Fq>0h}pz8Z?Q0+SJLf4Nypz3+9zkeTi4ENsymH#)O${T|?j{>)V>i2b^+Pxoq z4ETCbbonz->AnrBo&VzTScoLKa}lWL8@HB85JP~{jcry4VkSQH~0u&t{0C#~)E=A^mbD-qZ{U9Wb7F~uc2CoEF z?u$W{`!P`U{UfOU|K29oo|T~F@#8_!>2`22_%cxR`Vgq`{TX-?covoE{gt5TQw3H2 z(?N~b8$q@A-5{bP`ezWRp5`ncYy0QLlfPDYTwl39NrEt;r^wd`1V7f=1PTn&B<6#ae)#^C9Xcm2N%Je2zxJ3-}t3#fK{7!*Cf>hJ#xRJvoXcjc}I zH4Ym=@k^f8-6W+;c&tzZN_iY=DvrcYvC2ZwJ-CFM=0< zzXa8uv-dc>8k9V2ff|qdK&AU8sPR7jMwkCAP~~j_WAJ8B^t>B95qu4}3j83bbUy{v zuA`sm#;*jbf4jhwzyqN8`z7FGzz>7si_d|_frspM?K%+@e_scR4tIcR*PntXgC7Nz z{u`j$^KYQ)edv>1eJ6vba=#Ib!EujI_xJ|zl!*BWo(F!%-=CN`duJ`E_fz1D9uh^* z1Xcct6OP|kdtB%7Qjc3a?(}#AsCG~I`wmD^(QV*O;5Wf3@Ns3wH}3>v?mr8PEmaHkx(^gT{3m!Rc+Rx5cE4goiYX2KRrTYqaJa{;r z7Jr`!ZUT3Mqu|Ry&DT$O{3WRTORKKD>%nE*-wB=$zR%x(9n`#7RCE0(fsf;UJNQcQ zWuWH!ni-dFGk6a7HEX=d zEj&ME*6H1wz{|ORFSs83H3%uAbrhoUdOfK6AJ%l`Zv=Fx%$om)!wb3+F1cL zU+)0LKW_w8-j~5K@YkTq8Qt&rYzKHW_s;~ySFZq7{(C^x|20r__%*0{PCDSm^8)ZJ z?#tjR@GemG-w&$2-vm|9uR-zA(mD71W>D?A3%n5gIJg{)Zgq4z8{EL{HK69hi$L-3 zCqRw=zk@M&?vq`8j|Z>hz6pwc9{|;^?|^53hu`MfdoCzGdJ-slycyKI`5agRk9vyB zzY)}Z6+jq3}+Q^EVe)4_iPj|U(AEZ2|IK$UwDcpSLL zKktCzj| z@Lcfu;5zV=pvrj&%p!V^fa=#?Q0=`H)OfuOTnl~*RJjj%zN7nE@J#NX3QF$04ZH;W z7B~W)c9)yao59C%Uj>f^-vg@L&w(ZI``~Hdu`h6Ozze|Zxqm+RLGTA4tRB7jZqGk2 z^!5R$ddETa=cV9s@blmb@Q@cdeqRkrUNk|yeIKR@lIZhl_|F5`I> z6dmpX&j;TRir@Yfyb?U}9w#4e0M);HK+*p*;4$DYz)QeG?{)QU1=a4Gz;nPC`TNg+ zqQlQY^>gvdTzQWJ)sI`j3&GcbO7{&=Zv4&wPvCw%sCHiK@%i9o++c)as03c)cp%V zmG?35MDSbSq2PamM}d!ct)t_~p!nb_a2zay>er`1mH!iP2e|ZgZoKz_*K>a_xDxyY zc!b`+-tom6Q01qfPJxn_ZvoY=FM^`eFF^I9^fpI_8$qSJ4OBgE0X3gK0;+$% z03QdA{vVgF1&V&J1~ncZ0afqcf~w~~z{A1g{>15-G4L$zH-cw^b$@@a$4`QiUqAEj z&-hbkS8NBB?IhKL#HHCS2j~|N0+l{}NulkV`zMzjOJm@{51(=H{QcV5R7l zynn5K`D}ixPw(dvtyJF@o;@9WfNO&5eD3L@{aw%Rzvb5@;Mc+1z+1V#>RwyB_4A*( zj`Pnp@Lqpo;5zUK@JnC`+z&npJe5m-TO35s;{G20>?V(TB|dx)SBnesMOX3eWn7Qo zdL-9nJk#IB`pq@TrN8%bUC8gpgR@*m^Ly046R*CV>o6`vUG!rv{XNgW*Y7*I9>V=! zfuGj{|EGEWIsaShboyHjG8Lo$wma-K?l=2)w|f*nUd44H_lNp)0Y1c!`?wy%yJv81 zA8{?``ZbsS5V_GM`oZ5d9sr*Y>hBovd*DiczaCu2bqm)Qc>XP}%lTaf zU&*zbO9E&a*T3sGe>41!x&DyfCxgdw>F;z19uxF)$C%B8=@a$Q8) zlYIKE+^_JzpUdx$aXp($e?Q^6gLh|eO>@13tHHDDxL(JlzaMh_)PCXb^8T~@K9%cY zt}^%f`vKQKa$UgnG@gxvS90lZAJ?b2p2@YBOMg#v5Y74g{?=fmaPvI>`_P_rpXT{V zTvI*IH}mY5T+4a>60pYg4KDrt%z^3GKlZ<8!2jU-7p{%ItUVsz!LxthYH@!Q*W385 zzazM=^=a$@|2v24VgBX?ygQ5QIb2WYdIHZ+;QD}nFIeP%Kb-dyTz|>^8UEP`++X8= zzZE>3>kzJ{fA&d_f*NV-{{9d7{d-*c`wrJpT%X`Njq7V%`YUmr$Mtfb?y2CjxWAn1 z;atDZ{qf+RbERCzbN@2%rChuD{YPBy7J$0`>P|elO+xEoT;r?na z{r$az=ug2rd3K7w{~|cXwUKKl&;J_S#-+bkJBS_u-oU$ef+upF!|&}};qO)cM}=qi z^ZOL=55V<$9*njdG zf!S2Q4M&!=M&e2$;+oGDYN7lub`FB`;tjwBiIF%Oz4)5A(TqngzTvFWjpfQzrQM2WI<0m*o_d;6-}r%e zEE};dirp`v4F4Mi%fmS=6i8hqWJoI^Z zJRv%jqYX2S4#U`(jAzoBM)N@2OmFT~nj~#E;@M_nf})Ld`|=bBat!xO?X5KSGRf=pw6<3d z_tq-)bT51cXZi*$AXB@sH)R+cB_}KOa$IP+e@rE1SVR+0LtU%DT@bk??$E;u9n551 zcb<@J3H&@6U$JQhUYmI^Y18uN1($v~OtJ9PyQYzV152NQQF0C%%uo^mc^cnoSg-?G zZb@qgdbl!6U_wcveVH+v-F69!?v%|2Go_1}C(@dmv6XtI4bN8Q224a1qB#cX7y;%Q zf^(dSmusJ?dkuFuG-cBV&h9*XI#Pf-2 zSEq9Ypp;$%nq;12lGLXpx{=1aE-$S-?_ep`6cRMk$+U^qme?vSKNEdhZg|0Lx*R#_ zdexSM&Q$Ec63Q3=>L%066bD&b=?rtF)~K(GXBw!OTBRyhInd}x&M@`p;tW)4G2!yk zGqoe4*JV#gwzt}l!ZdlkU1=YPOL5woNM>naRzlK>mvXl*y0n3mm@s(_710V)(l~nD zMiHq%r$zG4N^R+Vn7@?l)C(1g z6sZ12Q<9F6Xw=hq9A=uBjxH;TWX4rm$5h7Tfq2vYbb_gz*2>XkjfsvKRg4m&*{P@d z(JOEYW1LLNNRzZgKPNTRdSyyY$&5CJK2wE~3hN+f;gL3W zY9kiUJe^vGvFX^xPVV8(QJ*MbP42GMQ(lGfQ5<>h+QS6+g(6Y_*6jHb({mdER5 z@Ln{Q=TLLgnOQ^-4Cm(&+~26f^^l4AZYJerL-a~q6x-1z@0Qq%SIN%IT^3_Y8c|TN z25^b{PQ>+B($kKHqNa_?J%~+Zj$MXteD`}={okWe7 z-rQ-l*TqX~`rnlPm&`U=>!MArjQ@{hzi*Kl8bPUfXgNo z+$R$gDb_#IgK_m5#DuDQJ&w8PwUKup3NKZVUP{Ifcr-pv$WLu3Ccmt;jrC+ZWUpHT*xYejxgPp9h zIff-xc-U2*xG^maO@NFt&O%i8RMhe^zK53KaX%%o=ZwpDZrWO@clMhYPxrSAtqCc3 z>a3gGTIu1YkaC95*JKDHcwwSgL}jKph9NbQC~Xd?ui!%rc1mlf=ouC7?+mEVSrgc8vlaMs3gdXHLzqSi zU52`h)+MMP{5hN*lLeXFb6IDSwi7`Ea~9g>l50lKROW_O)t4cNf@V5fBR*v2WgAv7 z<2`R!ty9cNz)3Y=xAzc2p(y_*7X$J*^w7pjECmw=7lKfnP1qDEIJLJ^*JK_Y!>eU% zc_d;4(7t+Z7pDa7e!@XP-U2Zk1 zON@lvOn!BX+<0_JYpj^gEU>IoYvW1Nu-&aM6e~4Gy<*yIUiH16t>EXWe=_wUp(1tk z$_zI60I3%ue?6^9aaI(R>rNyOthe2RQw}L^I;}BJonx8I^cOWNe^wS83wYLO&*4^fwmPk%#5{YQTWRZlEnzO?wK9l%Rn z3(IL7n-6Mtu@APW`KooX8gKP2lQlju9k&Q!!y(fNL9TJkTs%e#duQHE!Ozd*A)`xA zU$y$2buA6?#)l43$6)q63Pg2(2b zy7ZzPUQQMsRn!NiTXg9a+$0Y-nnT zA?+BVBf}GR2(YeRwZMeuoiiX|-=O3^Wi~#pe;Q2LcF;glF>Cw)`&zWg-fPAVd>|_* z(AdQ^m8@%2rah-+>8dHK!o8^)<2MnsTxMgDtuYXK3WZzv7%ktIQT_;a8XQUNIHWFe z=ul#~V8Aj+gkhL3X-qn6tIV=s+j-nssW#t+x6uzdjD-v5VzRf`@}O*0`O*bqU5`<2>@wYpt^Cd*#I}vhPZiEwmnALE6+Jq4aQZFCShOE%M z7~6U9yC~>?*B-@CT?vJ5BI+eBO~ef7jR@^%7v$gU;$xG`_5vYBz_l#O$hzF!bS+X|d;LYE6+etnvjqct)akaQh9%CTDS4!2oH-{qONv%2uTh=^4L(jO z@OQgWO<7qPT~Z!XWqpgl3(wQLT$|?%>r}2*n}cpqF&JK6BZ@uDK+>j%Xq#3i8MaJF z$frUyY|{epc-r14^VpWgdY8AZN}+gS6g&f<7^X%gh_7}8(&Fb$J52^-MdnZE2*#05Vl^JDW5rDyfy}9K>}Bb zVJalf_qC`Av(3sa=A+hFJ&<4-7nN*%&GmU`PPS6qQekbCm|mml>JLpbx{3M|ta?Cf z^@@R@I_4#|d|sxEKHEB?Mj8hqdX*9fP$aa#i6@stthooy7`89(puBQ@2N{dmY={p+ zOusUxr521{?XeoXin?za21G4uwm2~^PRfl&(WbXc(e~g+bld5L=eGRB`Y#(UFn_i? z2hPh83GQyo+B}?S$EDY7LZP#aNcfjI?P7Y&3r$v8&*-K#3Y1X0ttojWvcQa4>g_u> zKY_y83SyBT&k43f)zhCHmQ)i8zSZP%3t9P6yK=mzN2!U{S_ZMG^wtZqdUtW)^ODqDg|n zsU))>CYHyeyR^Ele0ryf#)`!hw;#kKdkW%so~$a#0vYkB^rVXu7?*Y}v{Mmv2fZHB zY5SDTHqts*q@cwZm|_-2#wYH3Zo`6<7>7KHBdeN@nNXUVi=}oK$E^wNth2m&U?h-R zt5^ZmyLBNXswxdGX_&EDyL%d;Ektg6X5O{1=eSazsC8`T%gE^rD5cIO?djYwqNv_> zD?zj?gef7C_Ru=jF)I;iyJxXKc4;Z6XF}}?+t#d5zabex;A~tTc~VF*OVpT8+>_4soMJsD1hrx}%$Y9@uMiP{+hra`dF=!87^lsb zTyq9L2d2#$Z4rS3z2(BF+HzP!2>6}UW=-V#dHXUnh_12cGnZy&S6VfNv|6HIiNKc5 z^N3mADc3CZ!&4{(ta>dOH7A&UCc}1T8_nW0X=;Yo%caI-$@60IwJkZL=eu?f+m`LU zvse@Gn|wiymvip4jE_xFTvMV;S<9>+3@vKA1~nIw-37V_m9a0Wv}Y@23bBBEAxSWB zsmb=Z_4YcvUuHX+^frsl6{CayOT0C z5yRRSla-P0l?X|(_1XPSFTyCip%w5M>@V>Na_SsDLr`PK+jxq3EXN!t*8IRd6NB<1=bS)w zJ3ARsJ{^HJY%Aoq=_J~WBUJFF!b`q*m`j@t-|Q%>D&uAE{)}Ecs+ak<7`7DMBgdsT z+@~0}?>k$_W2EGjcw%vfoh?O{GmVJK!l7-m4u(#oLJ&|B7VE6Bc|c*51VvwtCK5KO z*mAgr#2FVvd-l|p#e24Lb+~qqWff^Vus-2|i_<7~51sOb*n9Th%Fx`F`x_86UmeoE zb=!~+`|OLdeju$~c#S8$`*_>?h({o)GTsl{O3MYfgFBi$SrzKy1=trCk-+*Dicr9w)_iE#G1R^So`$Mm{``xh&H85X*GBKPmGu%?v}*)6xD{G=Jo_f~-a= zr&DCimQ^#hjWF`~jKC<|j<4Eu?N;sGc9W>ZOJ`j=5#Dp_!ni%dp2a5`Gwfn?-YJ@) zp6)X_J4tLy#ln>YpE5S%E3wfPW7%^b)6XLFlGfSR2xekMgG5IrA}aggLzZ)m;uGX@Yaq+ll6R&?nV7CN$=-s~~C zIyUg>jV5n8pg)CGF-?+d!4CX0=I7e@zqFN(ONJ)AyIPR&)!`gu}x z>I+R__50)tZh>SG6n1NtQ>==~Q5xD)t*1|;wi+Fi&jWHIrfpl9`KPm(vXN&8iO2DZ zOzim9+b|&#HX-vxLesyu^>b-Kg07ejeW@A~ZRVU8z%2x+tYrUz;GWgzpC9>EUq8dO zihwv}R)p zdLMOiXTXt&C;HL`1C=U5d?=$oZ=JF2!jgHkKYL*=MSj=4_?bQT5meU~FVTYFB#~Aa zrs`~iDMUFk>*-+c*B>mwj$sL$(btOiM7IzhfkeZ!`uwjYZ3e3Kq1jB1McF*`lSEwL zB1Q}%j0yK@mC2cHGBrz1`3xGT9nFU9kJ9FH>GAGU&$V&dS#(XRuaisLT2qyBX=7)q zRocbM{GuJ(ca<)c++c>5E<=2*jaRK$xuUdUb!pXk@yeBJ&skGian6brBrIKnh|o;# zO}8puxoYj|m1mJ}#iFfz`%>D4Y-kbk)8>-R_ut1p`gm)C?BVBB5^w7?ry4T(ab(Hw2Q4zYvYYci=bz`zS5rSuwAj9^rqJWUf$W2 z%U3MA)JgD?f-P$;o_97O$O>PEXu7gccA+gb=jqg7#9e8V|L}ipyk@-8Ui5_06t*_F+~B@MqI@f<^%HNw>({-y`OQKst{wr2PP6_=zQln9OJmkca>EX0Wo-0TJF@{ z!2;QHTnDWK&86*1b)6+@)1DBT;9Eb+CoDDxspE7`ONH$;i4IzW&J@V%7+8afNJpz< z3#uwB%5_7uBkt^?znqM)A3d3bm9&m^$y(ggH#V);%bj*2vIn|Q2J3U>t}Yp==1Aqb zUF>c5tK#tkDc@~wJf^srN6-q(tscke? zzg%s^^sF1K^)PxRt()P1CYGg^vQ$>CR56qlPpj-NiIF&uAZ6P>wD!(4!G&@Ame7tZ zsJ7K0MzEYH%xXsXOhV|k4)f_dNt{JU6J3FetRIx<$|)sAV3BBZIhhl$vM;m_$B@ML zhf2+^sK9WI*-ohL zovO&96AK!16_=rf*qUSHtsAb*Fs5^nLzn6haMc+K9=Y9ejvYpptkkmv`N>CUYM)Jy zq{GIac83ED{Bv=Pjd2p|-~y5{d@vdxXxF1F*})jw*&Ag|jB!3FZOqbV-z>hu@~IX3 z_J4@k+-k#HzD`Ou?Lluc+ zsD_gdL|oW^Rs*S)`|bX|>3u~cVMMIJ|3yJF$#hb&zQH(@lXb^8!}o%@0l^{I6m}#Q zSd}S~RQX`A5|4BRJkeBL$0dxE*wN)k`ryiNrzemd5txxO?{*xRBn(#tQZ|elL3oSA zsRDeOHVjT1)yU{D(dbB4WY{xP%(aBr(m~Su{W1&Abvc7?>kJFdu`54BVWD|)ZbllU z)y^EtoHlBO7a1=j?E>uzubt={_y+TlGDXJm2KIuVLRr!R=SV^`m0jgJjloZmk`vv7 zBxY!eY*dD;t3}1qqAQb@B(q5z4H9A!dB>BuGlvp%A_Nhh$<9!+X-DO2@+rR*u437u zY)PAb=j7*2)4QBAoWvS!j=@J>Qkf7UVHN9WE+N>6`sR>`dGj<{>W~*-{W%b~C_w3r zITOq5he^>YIJEkvvD%O#$Y|VuoP!fi!WMXmjt|Fb`md=7W>P{ zBh9`%-b^~1B};SSCH`Y%wv8q0qAlp-{SqEd#j;ZgOsSlSt_=tKbuY{Koi2$S8WvYx@tz#F^%Su7C+3C z@zt6hD$a9PVG=)y8R0YepF^@)AeM4%YPeVc`b)c&+AZdtn-fXooq0kah+K9Um9erk z>dwNL!lsd}#o9uL&5Z>$ly@+&&?bH0gnFI9Mwr7|n8%G7I;s~|AUMzNmpZi~I?!XDXCxCdYujuPQe^pU>cTDut+CSV%*n8Hb=icX zMKVG0spry`n|*AE5N8ra!EfwTMYygE2dyS+n55~0%p1(FB2j!p4_a@?E4ITtHm+k* za?lDBv#Sd_V`BcnvDuLoDEepqf-6vu=5LrX*f{gCV69VPU4@Cx2Rg2GzCnJ#6}&xY zn=-n3DQ_Gze;aacW21{c*_T};+K5dtG_n&OI`TM{JDuZGNDg7R=Sj@eJ_zBKp>uk> z3mq7eswM$)h;>j~=%QddefBOagQQ-4BMO!V;tjUf4IQ(Jcbd`i?PTvR;Wyy5&DXWu7$G76cQ@Uqk$ zHA4?XJ!Y*Zt`oocJ7bot5SKkn^pHv|&a&&Iih|NLTSc{e4k0SrEq&S9Pmepl!yTA;su-K^=ydk#BEM()5IS&8wy$uuR21~JxIhJzKT zP)qL8g|W?OfPshFK&Y9$SSWSgTu#o9JLb;H>U!G6%l1aLB%xr;@3}bjdAm~OwPQeV z0%t#A{fMF268yg2iRFfD$jh*s89SrRCyg9gX+bNZbbaNx)_NP1D4W%4PF{andW4^D zc9b+JZRXo)tkq_DXz@46+#OP!bGXd^8q~6W(IMA!K&yH@(XQ%pGJ7Abw^Z>%HmHTv zJRVG|JdH$gI@N$GLuXxgVm>0Ny0b!DfNgN*d{XDRnJKbWSd5rccxqhR>HC^jNUnoM z%!}@kf|5yP#UJ@QlSl?sGQ5PrTs%CzwrYKETFCvNC-0$k--hdSJ#)~ii2w^a~?^aWtm1p8rK59Ni?Z5jM#vl zl^N{IkgT07>i4T<=J`M}vtW@CQ0 z85NesJDr?=Iip!2$CT&^N17P_LLN1lIZ+%DV+`l4x_sKRS!Lm2U=J6ZkS#yzZBin~ zR1-&}x7e;2z7fvqr8BhCEE69&aVs$Di%C>5t?L2ia4Uhm58lvW$u$4F$BepzPY6pI z-!On|-?9@=eyj0g&1ly9&&y(VpW1;azg0<;Vv~?Ynk7ZcvU5^?+XBTUnr%H?(M^@C z`M;a`_y7)($bC3V%Jfh;1(d>7gqhAjx%nIzr?)i0)!~>*AJ((tyscPws4 zv6ov>+A!la#bu-R3!wptvO)&T|L&2_&EBT5MR#A^H0`kwij;6>S&>!+(pd1c!fEW% z@-ljumQDR0uQU~NAi}>8p=ym#kX8Y`W^j0=Q!pafL^D5Mb%`CnRx0Dex68SNW*uN_ zwG}|A6MZ&`Z<41ge>d&I^pu^DpZ_wP#TQysI2&eoNnHYcK%>yG$cpULnBfJPGAQWo zt~qcy>WnGGj4*4B?Q$A27b767)MWaExS&Ew1kNR@=gVc01p;Rl#<_`LF`BB7!At^p zT(9%T7O)`ll8VjPMWDU(6GU#xooc0!D)`=Jt4dV#TC3t)AHXQIGWhJ)MfiY)_??4} zqj8ZOe+EsqGk)F1D4{;kks3WLs+jZj)w87+&x0Km=W7*yUm#RS3(f+jalpfBtDU^JW)aRYk)sA^b*kVeW zMx|`5F>g5~fR6;+ZV*!odF!irzr4q3;!M_Zo~SS{MAqUPRDU+%!xDiXy@c;bwT?5O zKpW=mo|XHuU4d0TG*^*W`fNZOVwNeKX=}V}H^9wxQ+|gx9f#Gw5wFTfg)f+xA_+W^ zL^}u0p8?b@HYbE1^X4G)2Y4p)=P7n!3tU*BHqHpEZOj(7oUtv%kv5!{!A@f%Yi}MG zbdWH0>a|Dz8lkhHR@tHgtna5A8}~Fna}TD_9xG6zRmymP{#K^bmUgDN4Qmq52qtHf z+hQA}u19^jOuAXt!LrMVx53$_#4x^|Q3^uyit*}W!8?-*sA|J<=$r|EG_Jl?(1|;U zx8+0HR46#UBst=hK6;h&z$(G=N^Y4AZ}kVkTX*4LdWbz&b=4 zMeoA)B*d!YKbG%|(PW!=n}%_5y9E5AB+d(72qQvTV*wWspuEDC%zA7G25Hx=>^lFk zf=acl91i5SGwQ9y>iGD{hCdU0TF~=b#cXqh)n!JA`q!18)?iO6;ulIOwnbGaGm>7B z3R*tA-AWs_wawExn_BeWCY5!;b`H_K1!Nk>k(GADh+tlr=h{o3Kw5T6vBR1L3~&Cr z4r=2}HUvnhD!naO1)k`nCM6Q!I^4|`ri$S^QeZ)(3#LKBRznG!@kXw7|@ok)}$mGQ_Kt0a}e zda}`N4BQCN;sT}qQ>P)vF|MOP~vuZyuqR;Srtx?IkyGwBcjdLjSkV- zkSkb?k`2S?qP<`3{XX2))#$#>JlVF7g^Y-nu7Z(d^>50&*D%#Gv6R1(&OP)K)s3KcN9-w`Hq20D-5QjyCPLdsN)SY)| za*m17Rw=Ke+?PTbLj^NH-vNi6=PpT*d~UL99x;Ns$E^8^|0YRb+E$hsla!&{5)8*u z!4A|X(At=2AzKA~Bw)n5{3MGXW@{-@4*s%LFbM(A0!4McQDY~nKy%{xw$_S6=)D1E zk9zC!df!;Jd8W3CwS!QRx`XBMEmWQ`g9oh#R&9?uN?vE1InKm1)sjcpSQCY8fxXy& ztq}>4gRuYK>kDR!c{UPYnIV?3R~@yRO(UbER`YC!YbZV&Ot_a|K3k+hKwiqs0uu2Q zyJrbQuwpkXNi}k@4?aB@WB_eOnfPVptZiKhH9fXANaeMC))z*+D{9dxoS-x~Q8qu# zJkO#_Svg(x`jAqzsn=C<>@Lm?RMqjp{Y&HdrcQNXV3J&4iT{TtvjG{P$xOWvPh+EM ztr0fP%IjDg4qxg?;Ut!mr)3lo1=koyuOJlsa?Iw`aIiU8FPE6Y{&%bOOtxKab}gB3 zJGA`#!tDzRSzd>hU~~?gsTZ3|qkdLev#=d?1d~luow$@qeK)Vs6$&ITAhVPhDb2VW zm2MfbrEJV;2$_Dp{%L_Q+K$CGQEMVe3vV<&;c;L_4p{O5&Bc5QQ^j9a5R<7#^A%a- ze=5Wu&xGK;Jfue|X}`4f(eJh|6mQa^7#isc;n5JuFGR8*JJpf3ge50=WEhaAqqf=a zpn;`5zIcVnO>c%iWDg3>yxt6Z)QB2ldakgR!FNWiB_z%pF!%rZfy?3j=D7}GGBY5n z+ctR{v3#tmr~_fN-V9;R<%-fIne0b5F*|m$Lw;IQA$X}F={knVqVdSVV(#7qMXgH# z5}QhHeZ$t5@{(!mxXNa#KFP{ur+11%Sg7|aov;vF*ic|JH%80lgWIRo{dG@omVAF$ zArjMDACubHqbHnWGc|3u{O)vj$P;a2Db;m1I2dN27Yiw{oo4%kDWkUo#qI_{Vrx8F zdhd1(GG9ugE?u2XH)1(BDz5fR6#1Y7+AVB;8&rHaTZ#f$Ma58pAcaLb6_k}wcgu@~zJx|*r%S0F zwg%}5BQOkYZs2X!N+d}toI~JZNakBP3mDmLzR70FGri9@ zC|JlYybN8tJzJ4O$_o{?wtK#r3Xm%v0-fdRD4Uq-Z~ZI=b;@=WkW_p0i$QeeUu!J}u#e@2X&! z>6<@f4$_|k3OJt{BMFs`-tf0$QGV!ESVM);-d@UWL81ua5Cj`Hfyon@i# z{w;>zECDb1bgmClDgJ9xM=k{b{Lx(e8**-5>YsV&nwJa6AtDVv;VYEdGjA7CNjL(G z4HlKAH9{+D3&|Od28&0Dk6F%k=eNvfVq8#ENx1_)eO??Yt&F$FAxGF`SAP zQD`bY_&_|U>{yzdD1`cgRcFH%-6$9V+19J7jv=f1W60z!*~h%qkdTRHHh1B3x`7#F zLony#IcaMz-gF)rxw{Vkh_>mUI>VR55lH9IjJA1QLPJciO8|pH)|-3klE4InP|xV|6o~ke+^w6XT%ugYeh2) zHn=bv27f`eU`GXsVUL~M3&qEyoOG6v%`6gqurn56gm#@L0E_4h6}f6dfSFTvjfoO%M%BTum#PK92QA|5- z1l`f*K(ySA_9GT)EORHQYd{KeK60xVPJ@Z0R(9^(k&j>i%?|!s_s*5V3;ao>wiadF zidB|HXG?m`CGjBpJ0Fca)#%0fAkmKbldgXdX?H9%tv*%5xKJEXejmCv&&fQGICVmw z)q9m~I%t?pIA2oHVu4oSfMT3l7$9ZEABa6px5s>=1Bf7#KLaK{0+qnE863!up{(&g D@g@f( literal 0 HcmV?d00001 diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..8729f37 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,2102 @@ +# translation of eu.po to Basque +# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# Joseba Bidaurrazaga van Dierdonck , 2001. +# Hizkuntza Politikarako Sailburuordetza , 2004. +# Iñaki Larrañaga Murgoitio , 2004, 2005, 2006, 2008, 2009, 2010. +# Iñaki Larrañaga Murgoitio , 2007. +msgid "" +msgstr "" +"Project-Id-Version: eu\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-22 12:31+0100\n" +"Last-Translator: Iñaki Larrañaga Murgoitio \n" +"Language-Team: Basque \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%2$s' elementuaren ustekabeko '%1$s' atributua" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%2$s' elementuaren '%1$s' atributua ez da aurkitu" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Ustekabeko '%s' etiketa, '%s' espero zen" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' barruan ustekabeko '%1$s' etiketa" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Ezin izan da baliozko laster-marken fitxategia aurkitu datuen direktorioan" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URIaren laster-marka badago lehendik ere" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Ez da '%s' URIaren laster-markarik aurkitu" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Ez dago '%s' URIaren laster-markan MIME motarik definituta" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "'%s' URIaren laster-markan ez dago bandera pribaturik definituta" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' URIaren laster-markan ez dago talderik ezarrita" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' izeneko aplikaziorik ez du erregistratu laster-markarik '%s'(e)n" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Huts egin du '%s' exekuzioko lerroa '%s' URIarekin hedatzean" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' karaktere-multzoa '%s' bihurtzea ez da onartzen" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ezin izan da '%s'(e)tik %s(e)rako bihurtzailea ireki" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Byteen sekuentzia baliogabea bihurketa-sarreran" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Errorea bihurtzean: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Karaktere-sekuentzia partziala sarreraren amaieran" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ezin da '%s' atzerapena '%s' kode-multzo bihurtu" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "'%s' URIa ez da \"fitxategi\"-eskema erabiltzen duen URI absolutua" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Baliteke '%s' URI fitxategi lokalak '#' ez edukitzea" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' URI baliogabea da" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' URIaren ostalari-izena baliogabea da" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' URIak ihes-karaktere baliogabeak ditu" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' bide-izena ez da bide-izen absolutua" + +# +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ostalari-izen baliogabea" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Errorea '%s' direktorioa irekitzean: %s " + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ezin izan dira %lu byte esleitu \"%s\" fitxategia irakurtzeko" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Errorea '%s' fitxategia irakurtzean: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" fitxategia handiegia da" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ezin izan da '%s' fitxategitik irakurri: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Ezin izan da '%s' fitxategia ireki: %s " + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Ezin izan dira '%s' fitxategiko atributuak lortu, fstat() funtzioak huts " +"egin du: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" +"Ezin izan da '%s' fitxategia ireki, fdopen() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Ezin izan da '%s' fitxategia '%s' gisa berrizendatu, g_rename() funtzioak " +"huts egin du: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ezin izan da '%s' fitxategia sortu: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Ezin izan da '%s' fitxategia idazteko ireki, fdopen() funtzioak huts egin " +"du: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" +"Ezin izan da '%s' fitxategia idatzi, fwrite() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" +"Huts egin du '%s' fitxategia idaztean: fflush() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" +"Huts egin du '%s' fitxategia idaztean: fsync() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Ezin izan da '%s' fitxategia itxi, fclose() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"'%s' fitxategia ezin izan da kendu, g_unlik() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' txantiloia baliogabea da, ez luke '%s' eduki behar" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' txantiloiak ez dauka: XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Ezin izan da '%s' esteka sinbolikorik irakurri: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Esteka sinbolikoak ez dira onartzen" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Ezin izan da `%s'(e)tik `%s'(e)rako bihurtzailea ireki: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ezin dira datu gordinak irakurri 'g_io_channel_read_line_string'-en" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Irakurketa-bufferrean geratu diren bihurtu gabeko datuak" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanala karaktere partzial batean bukatzen da" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ezin dira datu gordinak irakurri 'g_io_channel_read_to_end'-etik" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Ezin izan da '%s' fitxategia ireki, open() funtzioak huts egin du: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" +"Ezin izan da '%s' fitxategi-mapa ireki, mmap() funtzioak huts egin du: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Errorea %d lerroko %d karakterean: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "UTF-8 gisa kodetutako testu baliogabea izenean - '%s' ez da baliozkoa" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ez da baliozko izena " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ez da baliozko izena: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Errorea %d lerroan: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Ezin izan da '%-.*s' analizatu, digitu bat izan behar zuen karaktere-" +"erreferentzia baten barruan (ê adibidez); agian digitua handiegia da" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Karaktere-erreferentzia ez da puntu eta komaz bukatzen; ziurrenik & ikurra " +"erabiliko zenuen entitatea hasteko asmorik gabe. Izendatu & karakterea & " +"gisa;" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"'%-.*s' karaktere-erreferentziak ez du baimendutako karaktere bat kodetzen" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"'&;' entitatea hutsik dago; baliozko entitateak hauek dira: & " " +"< > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "'%-.*s' entitate-izena ezezaguna da" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entitatea ez da puntu eta komaz bukatzen; normalean & ikurra erabiltzen da " +"entitatea hasteko asmorik gabe; izendatu & karakterea & gisa;" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentuak elementu batez hasi behar du (adibidez, )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' ez da karaktere balioduna '<' karakterearen atzetik; baliteke elementu " +"baten izena ez hastea" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"'%s' karaktere bitxia, '>' karakterea espero zen '%s' elementuaren etiketa " +"hutsa amaitzeko" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%s' karaktere bitxia, '=' espero zen '$2%s' elementuaren '$1%s' " +"atributuaren ondoren" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' karaktere bitxia, '>' edo '/' karakterea espero zen '%s' elementuaren " +"hasiera-etiketa bukatzeko, edo bestela atributu bat. Agian karaktere " +"baliogabea erabili duzu atributu-izen batean" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"'%s' karaktere bitxia, komatxo irekia espero zen berdin ikurraren ondoren " +"'$2%s' elementuaren '$1%s' atributuari balioa ematean" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' karaktere baliogabea da '%s' itxiera-elementuaren izenaren atzetik; " +"baimendutako karakterea '>' da" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' elementua itxi egin da, unean ez dago elementurik irekita" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' elementua itxi egin da, baina unean '%s' elementua dago irekita" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentua hutsik dago edo zuriuneak bakarrik ditu" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentua ustekabean itxi da angelu-parentesi ireki baten ondoren '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumentua ustekabean amaitu da oraindik irekita zeuden elementuekin. '%s' " +"irekitako azken elementua da" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentua ustekabean amaitu da, angelu-parentesi itxia ikustea espero nuen <" +"%s/> etiketa amaitzen" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentua ustekabean amaitu da elementu-izen baten barruan" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentua ustekabean amaitu da atributu-izen baten barruan" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Dokumentua ustekabean amaitu da elementua irekitzeko etiketa baten barruan." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentua ustekabean amaitu da atributu-izen baten ondorengo berdin " +"ikurraren atzetik; ez dago atributu-baliorik" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentua ustekabean amaitu da atributu-balio baten barruan" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Dokumentua ustekabean amaitu da '%s' elementuaren itxiera-etiketaren barruan" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentua ustekabean amaitu da iruzkin baten barruan edo prozesatzen ari " +"zen instrukzio baten barruan" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "hondatutako objektua" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "barneko errorea edo hondatutako objektua" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "Memoriarik ez" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "atzera-jotzearen mugara gainditua" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"ereduak zenbait elementu ditu bat etortze partzialetan onartzen ez direnak" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "barneko errorea" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"aurreko erreferentziak baldintza gisa ez daude onartuta bat etortze " +"partzialetan" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "errekurtsioaren muga gainditua" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "azpikate hutsen lan arearen muga gainditua" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "lerro-jauzien banderen baliogabeko konbinazioa" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "errore ezezaguna" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ereduaren amaieran" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ereduaren amaieran" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "karaktere ezezagunak jarraitzen dio \\ karaktereari" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"hemen ez dira ihesdun letrak (\\l, \\L, \\u, \\U) erabiltzen uzten " +"(maiuskulaz eta minuskulaz)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "zenbakiak barrutitik kanpo {} kuantifikatzailean" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "zenbaki handiegiak {} kuantifikatzaileak" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "karaktere-klasearen amaierako ] falta da" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "karaktere-klasean baliogabeko ihes sekuentzia" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "karaktere-klaseko barrutia barrutitik kanpo" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ezer ez errepikatzeko" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "karaktere ezezaguna (? karaktereen atzetik" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "karaktere ezezaguna (?< karaktereen atzetik" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "karaktere ezezaguna (?P karaktereen atzetik" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX izeneko klaseak soilik onartzen dira klase baten barruan" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "amaierako ) falta da" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") dago irekierako ( gabe" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R edo (?[+-] digituak )-rekin jarraitu behar dira" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "existitzen ez den azpieredu baten erreferentzia" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "iruzkinaren ondoren ) falta da" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "adierazpen erregularra luzeegia" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "huts egin du memoria lortzean" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "'lookbehind' baieztapenak ez du luzera finkorik" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "gaizki osatutako zenbakia edo izena (?(-ren atzetik" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "baldintza taldeak bi adar baino gehiago ditu" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "baieztapena espero zen (?)-ren atzetik" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "POSIX klasearen izen ezezaguna" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "Tartekatutako POSIX elementuak ez daude onartuta" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} sekuentziako karaktere-balioa luzeegia da" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "baliogabeko (?(0) baldintza" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ez dago baimenduta 'lookbehind' baieztapenean" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "dei errekurtsiboa amaierarik gabeko begiztan sar daiteke" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "amaierako karakterea falta da azpiereduko izenean" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "bi azpiereduk izen berdina dute" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "gaizki osatutako \\P edo \\p sekuentzia" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "propietate-izen ezezaguna \\P edo \\p atzetik" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "azpiereduaren izena luzeegia (32 karaktere gehienez)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "izendun azpieredu gehiegi (10.000 gehienez)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "balio zortzitarra \\377 baino handiagoa" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE taldeak adar bat baino gehiago ditu" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE taldea errepikatzea ez dago onartuta" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "NEWLINE aukera kontraesankorra" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g ez da prestatutako izenarekin edo zero ez den aukerazko prestatutako " +"zenbaki batekin jarraitzen" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ustekabeko begizta" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kodea gainezkatua" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "konpilazioaren laneko area gainezkatua" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "ez da aurrez egiaztatutako erreferentziatutako azpieredua aurkitu" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Errorea %s adierazpen erregularra bilatzean: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE liburutegia UTF8 euskarri gabe konpilatua" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE liburutegia UTF8 propietateen euskarri gabe konpilatua" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Errorea %s adierazpen erregularra %d karakterean konpilatzean: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Errorea %s adierazpen erregularra optimizatzean: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "digitu hamaseitarra edo '}' espero zen" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "digitu hamaseitarra espero zen" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "'<' falta da erreferentzia sinbolikoan" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "amaitu gabeko erreferentzia sinbolikoa" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "zero luzerako erreferentzia sinbolikoa" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "digitua espero zen" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "erreferentzia sinboliko ilegala" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "'\\' katearen amaieran" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ihes-sekuentzi ezezaguna" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Errorea ordezko \"%s\" testua analizatzean %lu karakterean: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Komatxo arteko testua ez da komatxoekin hasten" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Bat ez datozen komatxoak daude komando-lerroan edo shell-ak aipatutako beste " +"testu batean" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Testua '\\' karakterearen atzetik amaitu da (testua '%s' zen)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Testua %c(r)en komatxoak aurkitu baino lehen amaitu da (testua '%s' zen)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Testua hutsik dago (edo zuriuneak bakarrik ditu)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Ezin izan da daturik irakurri prozesu umetik" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Ezin izan da kanalizazioa sortu prozesu umearekin komunikatzeko (%s) " + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ezin izan da kanalizazio umetik irakurri (%s) " + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Ezin izan da '%s' direktoriora aldatu (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ezin izan da prozesu umea exekutatu (%s)" + +# +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Programaren izen baliogabea: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Kate baliogabea %d(e)ko bektorearen argumentuan: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Kate baliogabea ingurunean: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Laneko direktorio baliogabea: %s" + +# +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Ezin izan da laguntza-programa exekutatu (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ustekabeko errorea gertatu da 'g_io_channel_win32_poll()'-en prozesu umetik " +"datuak irakurtzean" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ezin izan da daturik irakurri prozesu umetik (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Ustekabeko errorea select()-en, datuak prozesu umetik irakurtzen (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ustekabeko errorea waitpid()-en (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Ezin da sardetu (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ezin izan da \"%s\" prozesu umea exekutatu (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Ezin izan da prozesu umearen irteera edo sarrera birbideratu (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ezin izan da prozesu umea sardetu (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Errore ezezaguna \"%s\" prozesu umea exekutatzean" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Ezin izan da nahikoa datu irakurri pid kanalizazio umetik (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Karakterea UTF-8 barrutitik kanpo" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Sekuentzia baliogabea bihurketa-sarreran" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Karakterea UTF-16 barrutitik kanpo" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Erabilera:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[AUKERA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Laguntzako aukerak:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Erakutsi laguntzako aukerak" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Erakutsi laguntzako aukera guztiak" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Aplikazio-aukerak:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Ezin da '%2$s'(r)en '%1$s' osoko balioa analizatu" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s(r)en '%1$s' osoko balioa barrutitik kanpo" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Ezin da '%2$s'(r)en '%1$s' balio bikoitza analizatu" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s(r)en '%1$s' balio bikoitza barrutitik kanpo" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Errorea %s aukera analizatzean" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s(e)ko argumentua falta da" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "%s aukera ezezaguna" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Ezin izan da baliozko gakoa datuen direktorioan aurkitu" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ez da fitxategi arrunta" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Fitxategia hutsik dago" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Gako-fitxategiak '%s' lerroa du, gako-balioa bikotea, taldea edo iruzkinik " +"ez daukalarik" + +# +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Taldearen izen baliogabea: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Gako-fitxategiak ez da talde batekin hasten" + +# +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Gakoaren izen baliogabea: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Gako-fitxategiak onartzen ez den '%s' kodeketa du" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Gako-fitxategiak ez dauka '%s' taldea" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Gako-fitxategiak ez dauka '%s' gakoa" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Gako-fitxategiak '%s' gakoa dauka (%s balioduna) baina ez da UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Gako-fitxategiak '%s' gakoa dauka, baina dagokion balioa ezin da " +"interpretatu." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Gako-fitxategiak '%s' gakoa dauka, baina ezin den interpretatu balio bat " +"dauka." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Gako-fitxategiak '%s' gakoa dauka ('%s taldean), baina dagokion balioa ezin " +"da interpretatu." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Gako-fitxategiak ez dauka '%s' gakoa ('%s' taldean)" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Gako-fitxategiak ihes-karakterea dauka lerro amaieran" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Gako-fitxategiak '%s' ihes-sekuentzia baliogabea dauka" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' balioa ezin da zenbaki gisa interpretatu" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' osoko balioa barrutitik kanpo" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' balioa ezin da zenbaki mugikor gisa interpretatu." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' balioa ezin da boolear gisa interpretatu" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Zenbaketaren balio handiegia honi pasatuta: %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Korrontea jadanik itxita dago" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Eragiketa bertan behera utzi da" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Baliogabeko objektua, hasieratu gabe dago" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Byteen sekuentzia baliogabea sarreran" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Ez dago nahikoa lekurik helburuan" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Hasieratzea bertan behera uztea ez dago onartuta" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Mota ezezaguna" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s fitxategi mota" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s mota" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Ustekabeko korronte-amaiera azkarregia" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Izengabea" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Mahaigaineko fitxategiak ez du Exec eremua zehaztu" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Ezin izan da aplikazioak eskatzen duen terminala aurkitu" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Ezin da erabiltzailearen aplikazioaren %s konfigurazio-karpeta sortu: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Ezin da erabiltzailearen MIMEren %s konfigurazio-karpeta sortu: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ezin da erabiltzailearen mahaigaineko %s fitxategia sortu" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s(r)en definizio pertsonalizatua" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "gailuak ez dauka 'egotzi' inplementatuta" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "gailuak ez dauka 'egotzi' edo 'egotzi eragiketarekin' inplementatuta" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "gailuak ez dauka euskarria eskaneatzeko inplementaziorik" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "gailuak ez dauka 'abiatu' inplementatuta" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "gailuak ez dauka 'gelditu' inplementatuta" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Ezin da GEmblem kodeketaren %d bertsioa kudeatu" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Gaizki osatutako token kopurua (%d) GEmblem kodeketan" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Ezin da GEmblemedIcon kodeketaren %d bertsioa kudeatu" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Gaizki osatutako token kopurua (%d) GEmblemedIcon kodeketan" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblen espero zen GEmblemedIcon-entzako" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Eragiketa ez dago onartuta" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Ontziaren muntaia ez da existitzen" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Ezin da direktorioaren gainean kopiatu" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Ezin da direktorioa kopiatu direktorio gainean" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Helburuko fitxategia existitzen da" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Ezin da direktorioa errekurtsiboki kopiatu" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Lotura ez da onartzen" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Errorea fitxategia batzean: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Ezin da fitxategi berezia kopiatu" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Esteka sinbolikoaren baliogabeko balioa eman da" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Zakarrontzira botatzea ez dago onartuta" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Fitxategi-izenek ezin dute '%c' eduki" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "bolumenak ez dauka muntatzea inplementatuta" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Ez da aplikaziorik erregistratu fitxategi hau kudeatzeko" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumeratzailea itxi da" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Fitxategiaren enumeratzaileak eragiketa bat du lanean" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Fitxategiaren enumeratzailea itxita dago jadanik" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Ezin da GFileIcon kodeketaren %d bertsioa kudeatu" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Gaizki osatutako sarrerako datuak GFileIcon-entzako" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Korronteak ez du query_info onartzen" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Ez da bilaketarik onartzen korrontean" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Trunkatzea ez da baimentzen sarrerako korrontean" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Trunkatzea ez da onartzen korrontean" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Okerreko token kopurua (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Ez dago %s klasearen izen motarik" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s motak ez du GIcon interfazea inplementatzen" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s mota ez du klaserik" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Gaizko osatutako bertsio zenbakia: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s motak ez du from_tokens() inplementatzen GIcon interfazean" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Ezin da ikonoaren kodeketaren emandako bertsioa kudeatu" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Sarrerako korronteak ez dauka irakurtzea inplementatuta" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Korronteak eragiketa bat du lanean" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Ez dago nahikoa lekurik socket helbideentzako" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Onartu gabeko socket helbidea" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Ezin da lokaleko direktorio lehenetsiaren monitorizazio mota aurkitu" + +# +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "%s fitxategi-izen baliogabea" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Errorea fitxategi-sistemako informazioa lortzean: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Ezin da erroko direktorioa izenez aldatu" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Errorea fitxategia izenez aldatzean: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Ezin da fitxategia izenez aldatu, fitxategi-izena badago lehendik ere" + +# +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Fitxategi-izen baliogabea" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Errorea fitxategia irekitzean: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Ezin da direktorioa ireki" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Errorea fitxategia kentzean: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Errorea fitxategia zakarrontzira botatzean: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ezin izan da zakarrontziaren '%s' direktorioa sortu: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Ezin da zakarrontziaren goi-mailako direktorioa aurkitu" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Ezin da zakarrontziaren direktorioa aurkitu edo sortu" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ezin da zakarrontziaren informazio-fitxategia sortu: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ezin da fitxategia zakarrontzira bota: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Errorea direktorioa sortzean: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Fitxategi-sistemak ez ditu esteka sinbolikorik onartzen" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Errorea esteka sinbolikoa sortzean: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Errorea fitxategia lekuz aldatzean: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Ezin da direktorioa lekuz aldatu direktorioaren gainera" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Huts egin du babeskopia sortzean" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Errorea helburuko fitxategia kentzean: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Muntaien artean lekuz aldatzea ez dago onartuta" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Atributuaren balioa NULL ezin da izan" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Atributu mota baliogabea (katea espero zen)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Atributu hedatuaren izen baliogabea" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Errorea '%s' atributu hedatua ezartzean: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Errorea '%s' fitxategiaren egoera irakurtzean: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (baliogabeko kodeketa)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Errorea fitxategiaren deskriptorearen egoera irakurtzean: %s " + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Baliogabeko atributu mota (uint32 espero zen)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Baliogabeko atributu mota (uint64 espero zen)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Baliogabeko atributu mota (byte katea espero zen)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Ezin da baimenik ezarri esteka sinbolikoetan" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Errorea baimenak ezartzean: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Errorea jabea ezartzean: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "esteka sinbolikoak NULL-en desberdina izan behar du" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Errorea esteka sinbolikoa ezartzean: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Errorea esteka sinbolikoa ezartzean: fitxategia ez da esteka sinboliko bat" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Errorea eraldaketa edo atzipen ordua ezartzean: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux testuinguruak NULL-en desberdina izan behar du" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Errorea SELinux testuingurua ezartzean: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ez dago gaituta sistema honetan" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s atributuaren ezarpena ez dago onartuta" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Errorea fitxategitik irakurtzean: %s " + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Errorea fitxategian bilatzean: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Errorea fitxategia ixtean: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Ezin da lokaleko fitxategi lehenetsiaren monitorizazio mota aurkitu" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Errorea fitxategian idaztean: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Errorea babeskopiaren esteka zaharra kentzean: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Errorea babeskopiaren kopia sortzean: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Errorea aldi baterako fitxategia izenez aldatzean: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Errorea fitxategia trunkatzean: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Errorea '%s' fitxategia irekitzean: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Helburuko fitxategia direktorio bat da" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Helburuko fitxategia ez da fitxategi arrunta" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Fitxategia kanpotik aldatu da" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Errorea fitxategi zaharra kentzean: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Baliogabeko GSeekType eman da" + +# +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Bilaketa-eskaera baliogabea" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ezin da GMemoryInputStream trunkatu" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Ezin da memoriaren irteeraren korrontea tamainaz aldatu" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Huts egin du memoriaren irteeraren korrontea tamainaz aldatzean" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Idazketa lantzeko behar den memoria kopurua erabilgarri dagoen helbide-" +"espazioa baino handiagoa da" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Bilaketa eskatu da korrontearen hasieraren aurretik" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Bilaketa eskatu da korrontearen amaieraren ondoren" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "muntaiak ez dauka \"unmount\" (desmuntatu) inplementatuta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "muntaiak ez dauka \"eject\" (egotzi) inplementatuta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"muntaiak ez dauka \"unmount\" (desmuntatzea) edo \"unmount_with_operation" +"\" (desmuntatu eragiketarekin) inplementatuta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"muntaiak ez dauka \"eject\" (egotzi) edo \"eject_with_operation\" (egotzi " +"eragiketarekin) inplementatuta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "muntaiak ez dauka \"remount\" (birmuntaketa) inplementatuta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "muntaiak ez dauka eduki mota sinkronoa asmatzea inplementatuta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "muntaiak ez dauka eduki mota sinkronoa asmatzea inplementatuta" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' ostalariak '['baina ez']' dauka" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Irteerako korronteak ez dauka idaztea inplementatuta" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Iturburuko korrontea jadanik itxi da" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Errorea '%s' ebaztean: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Errorea '%s' alderantziz ebaztean: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Ez dago '%s' zerbitzuaren erregistrorik" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ezin da '%s' ebatzi aldi batean" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Errorea '%s' ebaztean" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Baliogabeko socket-a, hasieratu gabe dago" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Baliogabeko socket-a, hasieratzeak huts egin du: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket-a jadanik itxita dago" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket sortzen fd-tik: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ezin da socket-a sortu: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Protokolo ezezaguna zehaztu da" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ezin izan da lokaleko helbidea lortu: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ezin izan da urruneko helbidea lortu: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ezin izan da entzun: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Errorea helbidea lotzean: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Errorea konexioa onartzean: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Errorea konektatzean: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Konexioa lantzen" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Errorea konektatzean: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ezin da falta diren erroreak lortu: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Errorea datuak jasotzean: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Errorea datuak bidaltzean: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Errorea socket-a ixtean: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Socket-aren baldintzen zai: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Errorea mezua bidaltzean: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ez da windows sisteman onartzen" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Errorea mezua jasotzean: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Errore ezezaguna konexioan" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Entzulea jadanik itxita dago" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Gehitutako socket-a itxi da" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ezin da GThemedIcon kodeketaren %d bertsioa kudeatu" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Kontroleko mezu 1 espero zen, %d lortu dira" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Ustekabeko datu-laguntzaile mota" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "fd bat espero zen, baina %d lortuta\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Baliogabeko fd jasota" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Errorea UNIXetik irakurtzean: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Errorea UNIX ixtean: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Fitxategi-sistemaren erroa" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Errorea UNIXen idaztean: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Unix-eko domeinuen socket helbide abstraktuak ez daude sistema honetan " +"onartuta" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "bolumenak ez dauka 'egotzi' inplementatuta" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "bolumenak ez dauka 'egotzi' edo 'egotzi eragiketarekin' inplementatuta" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Ezin da aplikazioa aurkitu" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Errorea aplikazioa abiaraztean: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIak ez daude onartuta" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "asoziazioaren aldaketak ez dira onartzen win32 sisteman" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Asoziazioa sortzea ez da onartzen win32 sisteman" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Ez dago nahikoa memoriarik" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Barneko errorea: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Sarrera gehiago behar dira" + +# +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Konprimitutako datu baliogabeak" diff --git a/po/fa.gmo b/po/fa.gmo new file mode 100644 index 0000000000000000000000000000000000000000..cca8440bb282b6ca03f84b7b773d5ff0d955bf09 GIT binary patch literal 21650 zcmd^{dyE}dea9yy1sVb&5W*WK3G20qcfGcg)Y)|$JAM#Df=#fK@Z8+pJG*=1yZ3JH z!)u4q#I9cuhqh{=Rf{M!sD8y+)^P}iHi$$5gi1weCGK@lt44|{wQ5x))IW-<^z;3l zIWuz~yI$L=RH;{<{oa{5kKgIL9t3hz( z>w@4_;5A^#q0eFPW8mZ9F!;}44*bBCL9hrs4qgNP1Y8Wh1l|O`;q^hV3|tQ`1*>2W z_*GE-z7H+|{|&qjeCr#S6TB5%2Ywv<3ixGk2pqa92;L7)gZw>iT!UHQ>*{UhvwtIQrLs@8NtB)cA)%$>XoV_ksTj zYW{a#8w5-dtOKtDw}ZEW)1c%r8=wCid>7}}GI<}k61)-2fu9E-2POBnz0F;}9bC!z z4)6x>&p?g;JSaL|0#|`oz1_`sCn&k^1yNZr8{>CDjr(Kpz2GlF^}psFL4fFkH6TL; zTR`zO0cxJd!FPi*pyd8zP~*Q0ZUg%fp7i=V;BDZKz`MZL!ld}x4r-h|pyvG=D88Qu zHP0_V+2gfL0_(x;pys&`Tn&B>l>EOBivE|tTfr;2h{}UapyvA+_zmzcz=y&6m`rm2 zDJVPnZxB@lePIw>4Xy{7I@k`1jtV#c{t+mCeh3bNS3$h!{UEpk+y#oxli(2eJScm4 z8C1L8>z!P;gPQ*la0_?>To3*i$iH9>%9K2Ep!nJYs{Jug^!**U9()OWHMj&KCHDbP z_Am@;zCQqQ_27Hpip$Us_&Dbp^f>SZ@U!45h`by8CJ3p)fo1Ryb@*X<9shz1z&?voCZGwo&@_*hV*_8`~cXCP{cS4Q2kDVYr%g3MaPX?6kR27H~2T;$G|&pcXoaRypHqlf}-=EK!9TE15o_`2Z&08C3M0Bg6*K_c?8@J{uKNixELa&ztiA|&N1Fy;A5cZxEv!ubit=V zL=k)m{4n?vkS4)%vm5`B4+g=9IDa0*6oRWb5nmfX$#V)6-!q`(-T?muT!fKHU*7{o=Sprq z08WFFPXn9)uZ9`<$;05s!5@L*vxkd_C>RDMr#}Zj3*NZZ<*DN!CKvo8D0yD{ks#n} zPz2ut{uMY1{v5m(T#N8O3f>pvNf1#4FN0Tso45)40b;Xw_Aq!k$8HWtGTxSf?Vn%g z!kamm#^{~~e~SY#8sBdNCHHX-@wb*ka+419`E8Cd`xXQ{!9fnun~Sdv$0%8dpNBXe z;aI{Uey2E=bD$pk$Yx#}e@CVE!PM;|{k@R`6ApgEuDCx%;58iYim%CT9*DmSu8zNB za>?h4_*-v`*MRTjSjurFhkUZcp-(>tVzxXWThZqY96cPeec3~WB?* z=a7HOw)DAs=hUj`@WA z{ZWo>9RBkuzLYs+>$2C+aOm?oj)>zHox~qp&gQ-s0W77#Dvk{tTRHL^yEyLWp6vN$ zJ_q?OS?c?j)hGV`L%zS6@A}}bc7HKMN!R+whSX;x*SxJsX1W&i_EdYrLNzRvYhfm2j+FES9GWrE%`{uI^3m426YSIGNjR{YIkkLMhCZ!l)QcMx|O< z%1uTK9=SFVrQ=qaW?Ao0Xk@*D;}^@-sD(V6VJOt(Iq?`}*+w3{YkGrq;Yhi>V=`CS zfgmd3_Ioxvx^l%zl*{i9qg{n+ts1PGnkp7XbG1Ub6mFRkR0o4~wOXYxQm;j>OL;7r z-B^>j$IA6mK3JbC_140C83|W%)1gKVk>>btp*)NtN~Nectc%0NLMa-qGHPjj;hk#b z;mA#*8Ar>dol%9EVRwiBso-Z@C_~I(uiUg5Vt7SFcb%Z=F;X3BS=|XLSuGMI=Fj_8_ zOGDvgxmpX0g&k3GceuM;59?J1#20dtj9<-_vUa83Vou^J<>gk$zFI>R<~^lap|(5h z3#002ZVC#M5pvaV5obfedQ)IkmNr%?Po~m?BBwo#nDyyueQK&)fl2z-i;j`NluH;W#s=Ze*^S{R4;G_D}2 z#8nhGhLCmUl3CQeGZaeIg6VU#JZV&5pHr3cXjH9A!rZP^>Z5YY1r5_q&jLHOgueL% z;>k^-WuMexwvZd|U&w40FfE|fa^vP7esU>s-Vq+GW2{akn5fwSPKJMv5b$@%gjUZ# z!1P3c)+rCE?#{0$^PQMf?4VXC799zF&ibY?bMaQpL8NC%G-AB-NOUQ2*qNJoQzX|O zHSx5v<~@!XB)8Q))n#kaaVI4im&lxtC;AB&NB!gd;cDfAHA~VSA~%|x!ecQwB5N&2 zfX;{I5>}6xh;&oA(TMil18A6ya>2$pbDA4!WaA*eG$e(XP)6$&;#rNcO>15}%2ZPN zoc(d8OxxB`f{jK#!z%9dE*k13j6}pVbVjk1_t`ZHp02D5Is9vrOg^P;%Gp;|m zsd9BF*yzUiKNKoARx0QvUst}2gPr201uS>Z`(3_JAzGCyhyYP$8Yly*ciEDTXXJ$UI8%il+6F)itncJ~4{(=Y4E#rzYAJ zjjG&fZFGH4_4*~F@Tw1CSHaZbj zsaMeXL~bWJg4jT8%@@Y0{e23^lptx%wRq7DD^}h#p4p-H=nIRJ7Wim4aKc zSjB6y2z<*4>TX+S`U^fp=%NYM-&oLaZefMINqajBm2yd?WXmwq#2SV7Bq-b64@JA3 z+~W!WDY@!BT}0=!=AbYblj5VGvqvFjKJJ;&Yni>X`3|PkEfG6jDc7gmnRD0)Y6mOD zs2Z4f)UD-6KU#BCrYaF-d4Crgl0jdoVYEVIY z2Aj$iDoY*POI_h*MSqvU>ZN4u&ztu4He&Ue36GhJG{HJ>Xq z9W%jQ(O8Z8pu+OW*}N8}76VbU#gLKu7>nBA?t)v`5HsDXD_)R)xE$WS`RwR023meGo!MTVbR|2k!Wm_Cxt%Q z7BVu8)2$RWo2nFcT47S8Dwp|=D9>aVn5(BYtRS*Z_AnO=w&b&mZBdz78?b?OTd!aH zw5&Lt#kK9woOiG_y)wVvWtmMeg ze1Aj)AfjlOHoc;%HovmVu22-Zy);o7d~~8btsS~hgqu>G`g#18MbPg|o{=u3SC6mOqtk%!rt2W%4$Zp&jNLQ0ZrjlvVjIWcP;XPbQH z8a<=^;o@yteX5`CX_O_*n+%g(o`=1k%$U|ZUDI{wVk_I{Scozab9?_(UKKCejYG`^ zZPmE+lX0PHYZsz%+_>Yqq$7(Qsg{dc1ZbMNt)1ix*Q+$TKCF&Tusv*jee#xbs6|3n z+Z@I6D0_rfStU*Uu5h6=TCCf~Pwx%AHtJNaHj&0JpFA>TsX?$k*`8`QYgxKqESrWi zO(R=QqWqSPS+>Skt{9$TH;al%LD~w0q;O>;BD-YDPMwTbWyVo0IL_PMm7d*bn$8t! zQ-wT(SYeoHq5xz@AJ^;cZ29|3ZBN8n`rQ<$-BBt}QxF;JZb2sgT6hYz!b_T_E9LDa za|T?!)uELNw6xU5sHJ;kUd99}I9gOJ_L=9n_z-Nb=EkGJ;NEoaxobHS;!2jGiczlA zzrf~W#WJC(RG%D)Dhuu7TYqB9)@_@&e7L{A|5L%%O8G(b*S9&}cQ5Gf`?i$_!z;FK+19rneQQ&)Zv%m8FkCUPe4uY&W#5Wh z!sW{cZ(7wiaMQp54g2nib`~^j(r)0EzJXi09WGxrxbl`82Ue~exZ*Ch%=)&mVO}N7 zl`DhcJ>~MlBhf^-wOp^1a(TqNy5cUa9n-GHbTramD2`|qNI6>GKXAo*A_g^a-!|%tK?`Eb2&x6PiBelx{iBUDjhPHJTsrIep3cn4pv{9e&T}V4(lY*t^en9qb(ZOlHD+7M@@yv5ooF6{ zmIHH8Xv7^g@|t@avk)jc&&|N*Yzw7xPc9maSiT^d<^c#b?i0onnzF)6#qQ-B8nskg_$N$> zHv7V-@l>9FJgAofus26rXOPfctbD(zh-iYls|(~?G|-u3ApxW&F6F|(6E5=5`4miJ zn~0Id&V3Zhc;a|b{Z<8TeEyyd(-F*d5*N`!NjaBkGE1G*O3%}x4zI!`P_+*r=Z?ei z%>3iSgZuzBKI6PgoX?(vMaeM{mN|-8Huolm8Y!Heirdf_7v%y@iwx<0fX1>$%*x5i zIm|&?&1go#r0gy>k0Xt5bADQl6{yYivw;=2UKG#X+@qe1>Fm|WHeJrJYnbRnqC_ML zY8d7|=^RV7F;0g>WqU*lb`I(Y2rNW9$1utyYVSejY#Ad-tQ4x^@7Nc!!wLd6mrT^+ zvQChm`>4YV65T#Ogvr|i!twz`@hzE_ zH%ewna$iQcG7jdxm?HWh8=3I)YQNA}k8qS!t#U_=FMBe+- z;UrU2`h{_$VErUww}`>ihZ^66^HZER2wXFk8W9Mr?StF>w1g!>n3SQ2t5Y9K)CU7S zafzhFl5#OD5tmm`W)H9>(N{e#B&6KELbEwRqrYM?fb(+ADf$U9P?&tniOpGszup&c*#$W$ zd@8>BWyfr{2oa|+#yOhI?HFE6gga>|>@ojhfw-S-QqA!NXm@`Vr29mjrE3?+ntPPw zL(85|QMmfIF9i!s|qD9cLtNXWUeTwSJS$$Y_8*zT9h33+i*{Y2v%EXf=rEpL)E z&TvtlW2;#F-Z67RB_AorRf4UIyY*yyKevU5C>d-XW*DktLjV4WMajqLw$T z7g~AFFnZpe`xI9!&iIh6NT*frQNp1>F_CEQrRq*kJGX2fK4$nR%PyAy=I-mG(j^Sh zA-0a`p+DIMQ9xIfs@%*XHw+geTiycdls=-hIB*uODZl2TFwAN_u z#EhMz%Y7D1aA$Y_&e8u4aqh*UdB)C0Qs?V#2ZSoY%1^PTRS)*w+^hKLcHGiMoLpRy zquZ8BTuxcCwKtC-WJyw+SvAtdCD>XZ4`e1Kc4Bi@vBZ^OQtD*mJ4wfOD`L}+?Q-D( zhs=Q$$z7E#E_JjxesmjBNlRO3wpnY=6Gu*N@VICpQL$y%wjnHl%pX)cyI(+%kilmM zXtK%cvZP`H;m|gl&YL*W6i6SftjUF}Kv2OGSQ+PJi$iv4ALO7e3@btZ{xqT`VjOL!HTOf#E@tSAkjFu#!39DXOon+?kQd+3nc9~ zmwoD7*wW&nMo64h3su62UlF;;qJ^&0OIomN9g@+#l@L}z23~^%BG!l+%xl&6_D#5% zP1mhcxFW2Tp4JwwgzZiQQq^{+OM;M)S!x*N>|8_MGj5W!q?OOdPolD&e1V&_6~$iS zox(2tkvbb;q&Tj)hj2>yl0aN&D`r8Df~L%ZTFb4^vO`+X@q=oO$7pn?XR4B9*fv>s zBU#|63Gu$4q+(UdA@eW)97<)e+v7+K(`b^IVBOu?%bA{4!Qh@aOr*=ij6ZbcuY(ff z;F2a~Z|s6+MZ#pg#QD5fGQ`*;T68Q8YyF#Kd&gq^0xP5F7M8LjCq#LEsH>sJ#VKvKWJHna z=js#ZBbVN@tAQ?z5Vx+ey}pE%hJVJQe3*Iu9r&UGM$(|BaGh)wh!XX|K@V`lJ!HnI z(N$8JU{1}w626|V*>cu9Jh6m*Ah-E>L|bU6+ZxFx;)kWS_e2rT4vb~0v+ngoNW)20 zN2d>y#aq1g5`j#{teO0Hf}pD{!#z@1cCRB)N3JP!WuIl3W|e|tm9@<$@Aorira8$) z9(`*27UHqrIK0i%+vsVhSA~i+5L2s+Y5t&TFOGYy;avu5;a)ZiaR^)w$`3W3PM^~x z{IwCEGTuVE^Psuqob?XbgIeO5rV$@YvWdezX|hJDs+=0|CCEzl&Yj*gTIYj)|G>h# zob1oUszZcSI(viS_gGKs}}nW;l^sBC}=fOlfN`S+b}a?-Yd-Dx7LNg!;?; zJT6BQYH)a$!!0uq%WXY_?|Qq(^Ys`k-i1D|7-9baMlOd-6M^Q|xUnF+s#!d=ZzE%B z@k>G6Nw(^f2a#Rmm}!Su>{Su7mw-er7a!~y#IeyCMz$8Q$ds@r*^#Xj$Sj5-KGRt< z-rzv5=oWhp)~=stk$_LL(iBQAb$unZtZS{n(=Xs`$KuC;KM(}jZ$5Pw4S5fEQn?-~Ypo)pMhV75qQR+f>i+j%}=0+((wfo+4vN&afQl9(@%$O|2 z994_O0ZUeBnD;RdqJ`=-wTg94c}A(f7M}?`mIJVvxcpBoPx*_Pp2X&5obH{I% zWL9-^PLWd6&T|Lh*(oI>)@HVolpVtReZ1{&_J0HPS)gn;e@|+>7D>nPnZ<2oBvMG3 zOu{^LbiVPyMW0kj5GF9Z$vu{IHv%o~+>MU+MO;Fe^BrhyDPSW$8MKy@E*L)c7J5$W~2(nc-wycih0h!+&FRWxUYZ77SFia zM9-MWs;=O{lsQwq;6>AXmb+@Bu%mpXNEBEWwv?b-aq-f!>*VEvc|)U@NbGhB=?8I8 zf~MwCnqXGj^-Y)lt`s8DC#@DRCLwXg<%+WkTefgD3Z1K7(wH5jeIm{K_9FV`%>UY< z|Ivp3kR}RyiuF)GsnpMG-H*uZw-olyzWXgZ|C5NlhTr3Ug}yodDPsC_$mC~cJMBmE z{AMDI+jdG;(_#KftoE8r9A2`E%CjIUlvyCI, 2002, 2004, 2006. +# Hamed Malek , 2005. +# Meelad Zakaria , 2006 +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2006-09-04 18:36+0330\n" +"Last-Translator: Roozbeh Pournader \n" +"Language-Team: Persian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "مشخصهٔ غیرمنتظرهٔ «%s» برای عنصر «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "مشخصهٔ «%s» برای عنصر «%s» پیدا نشد" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "برچسب غیرمنتظرهٔ «%s»، برچسب «%s» انتظار می‌رفت" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "برچسب غیرمنتظرهٔ «%s» داخل «%s»" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "پروندهٔ چوب‌الف معتبری در شاخه‌های داده پیدا نمی‌شود" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "چوب‌الفی برای نشانی «‎%s» از قبل موجود است" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "چوب‌الفی برای نشانی «‎%s» پیدا نشد" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "هیچ نوع MIME در چوب‌الف برای نشانی «‎%s» تعریف نشده است" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "پرچم خصوصی‌ای برای چوب‌الف برای نشانی «%s» تعریف نشده است" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "گروهی در چوب‌الف برای نشانی «‎%s» تعیین نشده است" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "برنامه‌ای با نام «%s» چوب‌الفی برای «‎%s» ثبت نکرده است" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "تبدیل از مجموعه‌نویسهٔ «%s» به «%s» پشتیبانی نمی‌شود" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "نمی‌توان مبدل «%s» به «%s» را باز کرد" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "خطا در حین تبدیل: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "دنباله نویسهٔ ناتمام در انتهای ورودی" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "نمی‌توان عقب‌نشینی «%s» را به مجموعه کد «%s» تبدیل کرد" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "نشانی «‎%s» یک نشانی اینترنتی مطلق با شِمای «پرونده» نیست" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "نشانی پروندهٔ محلی «‎%s» نمی‌تواند «#» داشته باشد" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "نشانی اینترنتی «%s» نامعتبر است" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "نام میزبان نشانی اینترنتی «‎%s» نامعتبر است" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "نشانی اینترنتی «‎%s» نویسه‌های گریختهٔ نامعتبر دارد" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "نام مسیر «‎%s» یک مسیر مطلق نیست" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "نام میزبان نامعتبر" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "خطا در باز کردن شاخهٔ «‎%s»‏: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "نمی‌توان %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص داد" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "خواندن از پروندهٔ «‎%s» شکست خورد: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "گرفتن مشخصه‌های پروندهٔ «‎%s» شکست خورد: fstat()‎ شکست خورد: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: fdopen()‎ شکست خورد: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "تغییر دادن نام پروندهٔ «‎%s» به «‎%s» شکست خورد: g_rename()‎ شکست خورد: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "باز کردن پروندهٔ «‎%s» برای نوشتن شکست خورد: fdopen()‎ شکست خورد: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fdwrite()‎ شکست خورد: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fdwrite()‎ شکست خورد: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fdwrite()‎ شکست خورد: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "بستن پروندهٔ «‎%s» شکست خورد: fclose()‎ شکست خورد: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "نمی‌توان پروندهٔ موجود «‎%s» را جذف کرد: g_unlink() شکست خورد: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "قالب «%s» نامعتبر است، نباید «%s» داشته باشد" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "قالب «%s» حاوی XXXXXX نیست" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "نمی‌توان مبدل «%s» به «%s» را باز کرد: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "نمی‌توان در g_io_channel_read_line_string خوانش خام انجام داد" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "دادهٔ تبدیل‌نشده در میان‌گیر خواندن باقی مانده است" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "کانال با یک نویسهٔ ناتمام پایان می‌یابد" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "نمی‌توان در g_io_channel_read_to_end خوانش خام انجام داد" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: open()‎ شکست خورد: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "تهیهٔ نقشه از پروندهٔ «‎%s» شکست خورد: mmap()‎ شکست خورد: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "خطا در سطر %Id نویسهٔ %Id:‏ %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "خطا در سطر %Id:‏ %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"تجزیهٔ «‎%-.*s»، که باید رقمی داخل یک ارجاع نویسه‌ای (مثل ‎ê‎) می‌بود شکست " +"خورد - شاید رقم خیلی بزرگ است" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"ارجاع نویسه‌ای با نقطه‌ویرگول تمام نشده است؛ به احتمال زیاد بدون این که " +"بخواهید نهادی را آغاز کنید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & " +"از ‎&‎ استفاده کنید" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ارجاع نویسه‌ای «‎%-.*s» به نویسهٔ مجاز اشاره نمی‌کند" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"نهاد خالی «‎&;‎» مشاهده شد؛ نهادهای معتبر عبارتند از: ‎& " < > " +"'‎" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "نام نهاد «%s» شناخته نیست" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"نهاد با یک نقطه‌ویرگول لاتین تمام نشده است؛ به احتمال زیاد بدون این که " +"بخواهید نهادی را آغاز کنید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & " +"از ‎&‎ استفاده کنید" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "نوشتار باید با یک عنصر (مثلاً ) شروع شود" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"‏«%s» پس از یک نویسهٔ '‎<‎' نویسهٔ مجازی نیست؛ نمی‌شود ابتدای نام یک عنصر باشد" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب شروع عنصر «%s» انتظار یک نویسهٔ «‎>‎» " +"می‌رفت" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"نویسهٔ غیرعادی «%s»، بعد از نام مشخصهٔ «%s» عنصر «%s» انتظار یک نویسهٔ «=» می‌رفت" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب شروع عنصر «%s»، همین‌طور یک مشخصه، " +"انتظار یک نویسهٔ «‎>‎» یا «/» می‌رفت؛ شاید از یک نویسهٔ نامعتبر در نام مشخصه‌ای " +"استفاده کرده باشید" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"نویسهٔ غیرعادی «%s»، هنگام مقدار دادن به مشخصهٔ «%s» از عنصر «%s» پس از علامت " +"تساوی انتظار یک علامت نقل قول باز می‌رفت" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "‏«%s» نویسهٔ معتبری برای بستن نام عنصر «%s» نیست؛ نویسهٔ مجاز «‎>» است" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "عنصر «%s» بسته بود، در حال حاضر هیچ عنصری باز نیست" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "عنصر «%s» بسته بود، ولی عنصری که در حال حاضر باز است «%s» است" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "نوشتار خالی است یا فقط فاصلهٔ خالی دارد" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "نوشتار به‌طور غیرمنتظره‌ای درست بعد از یک علامت کوچکتر '‎<‎' پایان یافت" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"نوشتار وقتی که هنوز عناصری باز بودند به‌طور غیرمنتظره‌ای پایان یافت ‐ آخرین " +"عنصر باز شده «%s» بود" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"نوشتار به‌طور غیرمنتظره‌ای پایان یافت، یک علامت بزرگتر برای بستن برچسب ‎<%s/>‎ " +"انتظار می‌رفت" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک عنصر به‌پایان رسید" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک برچسب عنصربازکن پایان یافت." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"نوشتار به‌طور غیرمنتظره‌ای بعد از علامت تساوی‌ای که پس از نام مشخصه‌ای آمده بود " +"تمام شد؛ بدون مقدار برای مشخصه" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل مقدار یک مشخصه به‌پایان رسید" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"نوشتار به‌طور غیرمنتظره‌ای داخل یک توضیح یا دستورالعمل پردازشی پایان یافت" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "کانال با یک نویسهٔ ناتمام پایان می‌یابد" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "ارجاع نویسه‌ای ناتمام" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "ارجاع نویسه‌ای ناتمام" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "ارجاع نویسه‌ای ناتمام" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "خطا در سطر %Id نویسهٔ %Id:‏ %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "ارجاع نهادی ناتمام" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "متن نقل شده با علامت نقل قول شروع نمی‌شود" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "علامت نقل قول تکی در سطر دستور یا متون داخل پوستهٔ دیگر" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "متن دقیقاً پس از یک نویسهٔ «\\» پایان یافت. (متن عبارت بود از «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"متن پیش از آن که علامت نقل قول متناظر برای %c پیدا شود پایان یافت. (متن " +"عبارت بود از «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "متن خالی بود (یا فقط فاصلهٔ خالی داشت)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "خواندن داده‌ها از فراروند فرزند شکست خورد" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ایجاد لوله برای ارتباط با فراروند فرزند شکست خورد (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "خواندن از لولهٔ فرزند شکست خورد (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "تغییر به شاخهٔ «%s» شکست خورد (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "اجرای فراروند فرزند شکست خورد (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "نام برنامهٔ نامعتبر: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "رشتهٔ نامعتبر در بردار آرگومان درآیهٔ %Id: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "رشتهٔ نامعتبر در محیط: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "شاخهٔ کاری نامعتبر‏: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "اجرای برنامهٔ راهنما (‎%s) شکست خورد" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"خطای غیرمنتظره در g_io_channel_win32_poll()‎ هنگام خواندن داده‌ها از یک " +"فراروند فرزند" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "خواندن داده‌ها از فراروند فرزند شکست خورد (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"خطای غیرمنتظره در select()‎ هنگام خواندن داده‌ها از یک فراروند فرزند (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "خطای غیرمنتظره در waitpid()‎ ‏(%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "انشعاب شکست خورد (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "اجرای فراروند فرزند «%s» شکست خورد (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "تغییر مسیر خروجی یا ورودی فراروند فرزند شکست خورد (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "انشعاب فراروند فرزند شکست خورد (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "خطای ناشناخته هنگام اجرای فراروند فرزند «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "خواندن دادهٔ کافی از لولهٔ pid فرزند شکست خورد (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "نویسهٔ خارج از محدوده برای UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "دنبالهٔ نامعتبر در ورودی تبدیل" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "نویسهٔ خارج از محدوده برای UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "روش استفاده:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[گزینه...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "گزینه‌های راهنما:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "نمایش گزینه‌های راهنما" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "نمایش همهٔ گزینه‌های راهنما" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "گزینه‌های برنامه:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "نمی‌توان مقدار صحیح «%s» برای %s را تجزیه کرد" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "مقدار صحیح «%s» خارج از محدودهٔ %s است" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "نمی‌توان مقدار صحیح با دقت مضاعف «%s» برای %s را تجزیه کرد" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "مقدار صحیح با دقت مضاعف «%s» خارج از محدودهٔ %s است" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "‏%s یک آرگومان کم دارد" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "گزینهٔ نامعلوم %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "پروندهٔ کلید معتبر در شاخه‌های داده یافت نمی‌شود" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "پرونده متعارف نیست" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "پرونده خالی است" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "پرونده کلید حاوی خط «%s» است که جفت کلید‐مقدار، گروه یا توضیح نیست" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "نام برنامهٔ نامعتبر: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "پروندهٔ کلید با یک گروه آغاز نمی‌شود" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "نام برنامهٔ نامعتبر: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "پروندهٔ کلید حاوی کدگذاری پشتیبانی نشدهٔ «%s» است" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "پروندهٔ کلید گروه «%s» را ندارد" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "پروندهٔ کلید، کلید «%s» را ندارد" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "پروندهٔ کلید حاوی کلید «%s» با مقدار «%s» است که UTF-8 نیست" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "پروندهٔ کلید حاوی کلید «%s» است که مقداری دارد که قابل تفسیر نیست." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "پروندهٔ کلید حاوی کلید «%s» است که مقداری دارد که قابل تفسیر نیست." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"پروندهٔ کلید حاوی کلید «%s» در گروه «%s» است که مقداری دارد که قابل تفسیر نیست" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "پروندهٔ کلید، کلید «%s» در گروه «%s» را ندارد" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "پرونده کلید شامل نویسهٔ گریز در انتهای خط است" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "پروندهٔ کلید حاوی دنبالهٔ گریز نامعتبر «%s» است" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "مقدار «%s» را نمی‌توان به عدد تفسیر کرد" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "مقدار صحیح «%s» خارج از محدوده است" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "مقدار «%s» را نمی‌توان به عدد اعشاری تفسیر کرد" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "مقدار «%s» را نمی‌توان به مقدار بولی تفسیر کرد" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "گزینهٔ نامعلوم %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "برنامه‌ای با نام «%s» چوب‌الفی برای «‎%s» ثبت نکرده است" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "نام برنامهٔ نامعتبر: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "نام میزبان نامعتبر" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "خطا در باز کردن شاخهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "خطا در باز کردن شاخهٔ «‎%s»‏: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "خطا در حین تبدیل: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "خطا در حین تبدیل: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "خطا در حین تبدیل: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "خطا در سطر %Id:‏ %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "خطا در حین تبدیل: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "خطا در حین تبدیل: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "پرونده متعارف نیست" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "نام برنامهٔ نامعتبر: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "نمی‌توان %Ilu بایت برای خواندن پروندهٔ «%s» تخصیص داد" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "خطا در حین تبدیل: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "خطا در سطر %Id:‏ %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "نام میزبان نامعتبر" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "دنبالهٔ نامعتبر در ورودی تبدیل" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[گزینه...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "نویسهٔ «%s» در ابتدای نام نهادها مجاز نیست؛ نویسهٔ & نهاد را آغاز می‌کند؛ اگر " +#~ "این علامت & قرار نیست نهاد شود، به‌جای آن از ‎&‎ استفاده کنید" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "نویسهٔ «%s» داخل نام نهادها مجاز نیست" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "ارجاع نویسه‌ای خالی؛ باید یک رقم داشته باشد، مثل ‎dž‎" + +#~ msgid "Unfinished entity reference" +#~ msgstr "ارجاع نهادی ناتمام" + +#~ msgid "Unfinished character reference" +#~ msgstr "ارجاع نویسه‌ای ناتمام" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "نام میزبان نشانی اینترنتی «‎%s» نامعتبر است" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "نام میزبان نشانی اینترنتی «‎%s» نامعتبر است" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "باز کردن پروندهٔ «%s» شکست خورد: fdopen()‎ شکست خورد: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "باز کردن پروندهٔ «%s» شکست خورد: fdopen()‎ شکست خورد: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "تبدیل از مجموعه‌نویسهٔ «%s» به «%s» پشتیبانی نمی‌شود" + +#~ msgid "Incorrect message size" +#~ msgstr "اندازهٔ پیغام نادرست است" + +#~ msgid "Socket error" +#~ msgstr "خطای سوکت" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "نشان‌های تنظیم‌شده توسط کانال، پشتیبانی نمی‌شوند" diff --git a/po/fi.gmo b/po/fi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..bd6df8d32ce14a8175ae4e1726eab19bd307e892 GIT binary patch literal 44942 zcmd6w37BP7b?=X}v?7B{3c_LN?kecp6I0uB1KrT}C|xul4b82pQ&p$$t$QzbsO|!Z z18STQMNn}h+QEn#V~DNd@S>eWqDh>h@g)%xqQ)sPi5fMU=llKF-eBn2u=e}J30tTj|HEpyFu`Uvx4C1;1|Isf#34@ zFCKs5@xMJj;cS=hXz(fIKha;G2_DP!Ab2gf65I>k1(v}dgU%r?mx)OX8gv7x=czoQsuKWT}{oDzLU=!Q`z8-u# z_!Ut7ZPQ87^;O_1@V($-@Sj1l1Sip`t~Y?EfDKUhUjeH9KLX3(-+`OJH4IX8c?l@G zeH2^?{s2__3#n{97=vo>e(-AW+aA|K9MS6ypy>1v|7g5F1J{A4FAahV!5hHM;9cPB zz=y#QY*1MAd>wc?cpoVK{ZmlmeFW4ve(tZ2r<2EXJqW7YYEb2#3#wcL)I8h{o(aAO z6umwND&P0P6Tx{*x|T)=s-9I~2<`+`{w7fE-wuke4*L5a_xLrBKL*vmV|jo(KK?zXz57$Dro_X%{;_+6*#P!2wX~ z={=zG{gcQ42G??Z@`@l}DF?ejt&>|o_2V5NODgyT2+IWD0!4=ts7(BEKB#fDK$U+R zDE|30sBwJVFfc{yYfM)!>_;+I!X-*RQKVjpJ5O?Yz%l|1EeD*GEANl@CGH_Z;wO zunL|I-VCbW_khQMe*&t$zXp}>aS%oQJkH|^Q2pEMuWtj-;QD^>c<{5}Gr_Neuww8t zQ2ko8-pQfodA!Zz`#|;YE8xlCufQ|FlQ%fIelaL|Ujb@7d;I+tC_a4&sQmYUr+^>z z_rC;c{{9&hzdRM;u6%1iL{o4*cqaG?@Ko@<;IqKbfGq9cTcGH0@})sA1a1Pa0N(;i zPJI)E#KC!&G525$s@_AO>U{)Mdyn7f#(xfY4%b(LlE?c&(dl0BEbwEX==CtD`8}RS zP6M}sdLDzK&#OVze-PAs{TZnKeicNN1W&#k83e8ZPX`Zx3&1yms`rzi+Wi^$4Djg; zO7t&*n!l^TKP<;C^ zC_XrOi{rPAAR;1Y`0M*XM0D^)Q1ks58q>H=1kVF62Scz0s@}Um(dR)>^!Xd`MDV{r z_5avyjvvkf)&EtX_~klK^lN}2cqb^nc>q*>e*uaP-vvddUxLbiGK1FqJsT81-2kfH zJ3vSu{2{m!{5e7gWDL4yv7pLGjlUuXN>Bf&*N~;8O5TP;@>F zie5hiMVDiCx%nCZ#ZS9Hx*jw^mO$`nQ2l)(i$vuHLGjyWQ0+IsbHO`7)%OYTIPj~W z>iZ7(RPaexx%y53pTzYwpy+=i_(bp)Q2l%{xEOo@JRf`n6unQ{?dWqEsPRYOQ@|I2 zPX})Y)vwYS+(AAWJv62~_)sK+W41LA8JMHBK(B1($KX6+9OF zEl}gX0}R0rfNJLppz8k?_%!gb*E%_K9C#tuOF+$g zKKwlREbt#e<^L6^{+x27Yj**t_SS-DfFocC-sbV3$3F#64_KezMc@<4?s_%2i0kY8 z^~=GV9}@)c21D+jHRAaFQjc3a?(%q@#}SVeQ2lO!M}aQ|#ea8zbUnBi+y@4u?z#eo zTz(GJ_kCCw|@s!-wERm z*McF}6CPgyuHgE9a25DZpz1ke!s*lJf|qjrX7G6MVNiVY@1XLX7YD(`;Ps&9^=?q@ z|2ZhW{y(7jb&x?1fa^fDGXX9D5BmF`1J`r?V^HNUtT@~UF5&tepy=~?a6b48P<(u5 z)zN1MsCj)p_-gP0@EPFxN!QNvz)QG(5x5@w6L2H=gqquDYyrh*cY|vG0Z@GY9q<5n zD#YFb-UY4!{{dVHp5Acs{#x(~uI~Z2f{%d8x8x=_-;>}@uD=F~PJ>NH_v=B?;|(C9 zGWZfGdJeRlU2`M&Dy}~S4uTunZXHxW(cvYa`2Kz{1V0O&34R|GzaQOk`ezZS^>ZmG zzSskbk6r+t3ceK-{XPO}UVaEJ1W%fBcE(yThZD0s~15`hQ7h=-_OTo*)+rX>9hd|Nq^cT7N zTS2Xl*MYAC{~FZuu@}33-33Yxd@p{d>wcp*OQ?5|6Sk+_yce;xbr2Bo-Y9P z{LlUM@h^4#+ygG-{;lAt;0M6t!O!{o4|_cJWsYAj0mTP>sp!o2+;A!A- zzwPM17*zji;M2i_;OXE;!1dtY_~)m*+^zfVpvHHb#}9*=m+ynm08f8~o3|C9u17$% zcPscT@Xh}INBs4dK(+U89*=pY%eNR5eYSeM1w51M`$5g`Ux4C^C%wwy`QXW1?*%Ua z_k$YO`@k{q5m0=!`PGizZvn66`di@hz;(Afett7J$n}@N0q~dLYH$si*w}Xd3_2UUJ zo91%~DE=G+Rqnl@=26x8@nz1#8gHK6Xl4AlC+A6x)F0xkrPdV{-O25Q}316~Ba4m=Bd z2wVz&9~Avgd!t+b7lGoB>%f!1X^*c3pUL&RLGk~m!4Q1d&`3QJ1_zO_uKL5>*-VN~CT;J}mKLeh}^*6zd z;IVIUblDARzHbKA{{5il>(k&fz;A$Sz@LNa*Trvj&u;{e;rdqaRPc6iKKLF`^!hv~ z{s`XY`nevobqJoz?GJ-C51`5&^>#P^OF)hDT2TD*8t@wM55TR;_YOCX-JsfeF{pMP z0G|c^2wV*wcdz6B?V#qT25LTE3LXdk9=HX35Ih=u;_tZep8y`k^&(L9Tm)(!T3`u$ zC#e2^0o1sE0jl1U-|6aE2_DP!72qoHT2SrX4NidX21SQs-{tu2GEnn-D|jaO5O@jr zJy7E-9dvZQ0lbjw8mRgYf@gsr0-p(f4b(V)1fB!V`&}n@mw;z*eF?Z890pbHUH<-` zfuh^DLCyc;?{no(1I0fZKs~<&JR7_R)VzNJR6BnOim(0yRQc22?bg*rpvvFiuipe} zeg842{NDpr?@7Ps`h5X7pX)84=z9~m0emYs1U?L|0ndMro9~-I-Txq{dY^c|qt8Vlf+5d$ zgIa(4LDBUCpyc6~z~$hX?|1DFfyZHPi}NproBw3T}=0e?ywC9U9^q1fMb{Qfe(Hh>ROWa`rGOtcm>z@_5p|y`V?su*ILKJp#ClfzvO-fPvZB{q?d8M68t-G1pFuPA4tjH)42Cp zE^Z**#P1jS2X%fQ!|xlxFNA_J?Uxuj!7>j9p|6_gx{|rC4WtRXiYti=Wixm&+ljWyw`$N|6BPl zBJC&L=I>phoBUlyny_E&wLBj1d5-eeSAnQkTX0kUp5V91cL}(T)Zur_m-`XdTm0{* zfOm8KzeofA-aY)*-4*Co==`K`Yizt1GSoZqK|r;zk_4mjw32Gjh09KT;cI^REkHTVVp{Po~f zT<`VIp6yYOJ0#SL{Y`Oy6X_WL{H5GoLAs3VroX3*J4tIvKO>b$;)rNKb%;tv1&sa^RV;=c6FMA!Z2 zaPL1!OSu0=aFX;5lK%d~f$jI+kHcLedlc#hpA`M0yqJC8TS)e=6zY{<&bD|NUg1kCHye^?ZNtRIYdV-|q#FBR!VX z^7sDCqhOM}b$|VGem|b1zi*LFB>gGrEYjCW`ddu8nDkbk??vD%xW1h9B+?VOekS-) z(irKPT)zc;6KOZUUqgD3-`9|CA?+jS?{`R_AU&7o&m&d%T_yb=(yd%C0*6R9^ZS>e z{@%dvvq{O{>-g~tfAL!IZk}BLZUavN&ja5?T1t8w*MCI1i}V7nuO#X3?;Qjm0B`5s z8UFgK;JKtrNkiQKOK>|$fA`wI?AgFQJbM5%(P-8Q z(PQD-g?&e$p@lO(SxL1c3&UVw-IZaz84j$w?!40Vqw#p$ZiSPbRy!PyJWXkDcsd*m z2E+Yvd!pWHhxJBO6Qu`&4dHOTUYRU6D`aklS6#W;dP_%}QF(Maj1I)Db}QI0+-hr{ z!cHwd5RTR-%gjQnK2nL8%F)qg)M`a;Vq2X?quy-OX1&Ic8D49;)s7~E4Wpyn^kuj` zB07x*8z$==rm;R2PDYdU=5*MMZtBEMvbO7CqgfxJY9rnLX55ZMu4=hC4!^V~;DYj0 zIj)w6t5DYUB5XCvBT=xS(Wu5F<#tRbb~FU7mBEG2*b0dV#Y$BVZrm4<1KDC zj?rxfe`&e4 zupN%n8`I$^V;*UX0QD(GmtN-c%>1O)h!|PbT1iT1gi+XOQQNl7+cwfnZ7d$|G~Kva zZlgSz-&#rPQ>2`u;G-)!8nr6zx*u^`_h_AU-7N2Ce#@gF+%vv6uJ2`$*J@F9uWs(G z#$$&8Bcrg07NDlO8pB->xh3w<&6okE!mn5+ z$u=K;9t$tuI0>&!KAODI=;k@sz6qw7d+wnLBw*j#Ct;L~gZeX+L_n6u4;mKiK$fYf zI^D&UX$BKYlJ$#>+3d0)EQ&dsbyiA&nMb0kTd{F1Zo{+j&3zW4D$yE)bj$#24Z%6g zLUOAS$$+AYS_mJl#w2s2+(hz@);p31ZZ+Csm0)vxs488qxYmv&MP|&V${SI0GH!`Y zT9Rh1=}B0$Vyi_pwVRz9GA0Ty-)5p~bFI;7?`p%#lfk8qu|qW5WLzUtOFUmz>l$>X z0F={fK$Fa4ERx!|L^slSXj5s~MMui9BA1~VjYUn=xWraz@ww>R(YhDRrreQ}Zd7ea z=v2k_tzi_4K*MBtnc|>mE1G1jRO_`>;ba{ZQ;jQPmFap%a)zbH5GSEpiv^d}o~j)Y zy(R-gvc1)Y6sE~*?YKQ1mcpntQf|=0w1#pkT)@?;;L%ZGEg6+EF{X78o;AO9 zRxZ0OEYG(vm^Exo_@*93RwtU#<@9|tLb$PD;6u;Pmu=j%dHcq2yje%R(4a_x>aRB? z>6nRnEeeNWrjd!@vb;!UUZr(RWsFUS8xKSyEaj*=8eCQ%>6lT)EHRs%T66%t0;e#? z8x%_zfyp0x}6C&ao5$@8>2@h-3tb_v!`$dhzoAX+@WI9x4*ckN(S zLfwrf8;Bqn&aWf5zg~muArqq8Ov=k<&?{kHYzG_tw!~JvYIbJsq7Ylsh=PJeK)0#e zW-aL(^2a89#_}wtT;5_W!A9#o)k=^qT(D{(k~%_2Gncll<9>`9C^w^(PNIejZtB$A ztHK3U{WGqA%8hz!Rj|?3@&A$R_dPO0BT;HzT32fI{WZFb(88)^_PFo26&ssPuFE4M z5!OG_gL(BD#DuDQJdC;MwUOUGF{hh^vPfI=`hrWwmQij5GX<#svOiR{57CQErd&r40r z#(u<0@3Th>JwJ3&y^y7+pT1fwET+GA7_6ma{Dq$S`|Q@)!k5{K_Eg-eSFOWNR@oZE z63g8z)F*C?N;76aMj2-zs=FF$c^ThD%j9-1C9&s>%Xe+u8rM1pOpHed+PU5&Ik@Yr zo6K72;-)0$B)+h*#EIaAiF^_9WPT2l+(@FR*{8kS9-_}vzonS%iAa-q&3pkbG+Od< z^qER*>vYj~b9mtyo2Zdy+(35bx`3yrW%8hFR{VaaPkYXqz;0{A@aZ_l@puO}jTE{J zbs4SmQ9tbG*zA}rNada@I$3Tz5!AP2u5T{8R`g_i^NdaP6i7rtGip@v51Dz{h84_s z&pKA^D)>h$7YjStoG4XHCwaJSL3a|MY6_6Cc+jjY&c}1jFW2^GnXBsxxLffOm3f_`9lU4 zoW1<~3s$*p)&aZ<)o2i(1JgcHZn*u5uZ4?x-FcaF(<jPm&7TRNP;irBu@6RgEb1R=!4%*=IU3QdnDNZDG$~LD`iViV3 zKsg#2t?zFIS0FC4W0foL1lnAiSY#9898n9eTWFhJxz!e4zcAR$;i6U@(tEN~ZO1wr zWSe?Z$J~_+!uX18;x0Gc=Dd`zDpo;L+TvXD%;3B&?#26LE9}+vyjjB;8_AHhC9>I{ zgkHW2+jNN2%=Ey3M%`{&PT3Xi1OP9A84+~e2v9PTxojdvS|*k3b}||cxUt(wN9yz# zoG~}VkakSGBQt00;9xy}`5ZG|bU~ktJ(H5{Dbx9J;>`dllv z?+sZ&35}gkQ`ri$GT}Kb%~y#y74FVeAKr)4a*@qNdd7h3DXHAt$7uPUg4&N@r@@i< zj+5MZ4xN!0&Ka->5@8r-M;c?!+8X6puuTFEUC)?{nCoV{~CJu*;7*hona zV9iEBZ;3dGDsXQ7l#sSEdb4XTO@c6JH~)6!biRZrd?!LqXdB_gA7(WiA2ne_oYaf^ z^dYS@tHvS^eiIe_&-x=Ds;eP4OhmoJrHPn6qYdY{TVwe+yVNi%Ulac)vIVzyQ`DOqjB90|3L^qg7CO>v*xC`-+A|z2s44X3q?F#yI>6wz3by)ojkdE_J%CT*VUS(3CRLGR~aSHcN_DC$B-4 z1r0t-E%0}{UWqta8JIshsK$B@f#+VP`?xkMnVeI(R&5QsL&e1K@)}X>VFr?d9)fK; zon+clA)!4LqG6j3fQO^@ewoL1G}e8*wLO9gc2?xn?)G|UK>~{0ac50NC39K#jSvYa zk@FYIL&4r%v{&o~%he9u)j10Skud2lV)H90?07m~ycm^YTuFPmju3ibrhK{qjfuYuf{73|l6D#||Zo1Wx%R z0WiIJ)C?L;r_eZJf*qszqgnMockn{!)tZIL!BXKk&&?65AvuMxksqnDwYfMh?Es`P z>b6wV)~Og9kpQeD#oh+DeC?S7!b9r)#AjsI4Lt4MVsy+1v`>`MA1&q-M8Z>&VLEG z!2H?aHgH~!NN^V|Yun)jJ1@O*BMO~kMBKluY3I{pU1+h&dPX;`kfVgw?M%rlkvSGj zbMM%-`5G!G6vR9~o)heds%tzuEvpt3e5=Lf4zjYNdVf+!|1?D|Pq4E)&LZ1tWQL0q zeb3eOcuPJZiwiUK3P|&3Yscm=xYAtxCMw+89vkJJS&iH@BXT%m0%fa63Ud@`AqvtY z+H$*{Y)^^lda^daV%{#Vc5jSXlEE7U7}#hB9br1*>m%^ArzsLwIedS1c@KKVb$D#0 zZBi>C*fmk#uL#Ca?lOO>(sFl;cU)W`o$1oQyXu`L;?uKWpXYLCN8PO&z0$3q?@kE4 zo6~!Blojl9IcDBy`wV>=%%5p>4|ga#Jz=MWW@`ocTdFOyn!6u~a$Vwlh+RDF?zLUQ zY2LsNud%CTZRB-Zk(?G|V)8|p8K1f5zD)~KVi@wskE~`oWqkOPZ|MwBKEwPzaF=&&-CF#2m-9k!r^xUlyLtgi>px+@8n` zBdY4|w=x7niJKB4DTdamj)p{}MbBb?4CyGRYe5YqVQW^Y4@gE3IGfmugF>cM1mxs} zIY$r?=?)bP-sz zE#k(+k(tyz&+Mp6s~BT#mK;*d5;e9b?#gE|r&y0=oLZrq=5#L&uiz1Y+hraGS?hhu z7^lsaU2BGY4osVN+B^c&-Sxt#3OTGI1big5Srb`2Z%=_b-Zf%AGihdar8Sewt0M}I z2<+%Q^O$9Wa^2E6JcSa6RktOh?j)w4$*`-^K(jC^H?_iRqow*-$@60Vu^l<1=L^xp z7P7s!fi(fYX)mbxa+^CH<6{%#&y*Na+A|vmQ;XWJLe04pcaH9Ub?h(4?M6IGCFYRN zWl0QNTCy0o?olVt7ggwF^@$ zW@Tw2h7}i+){(_ZBw4Zb+I1{76N4^jkof7efah$}D2Sb+tt86oh)>67=Dc9$>n!gk z3Jt5YWa`J6UQ}o{9+-)nuC2{g7C#Z}wjGt64Yp_s$E@kjss$%;SY&%E3gGZDvi9{H zX}en17OfhUYl~I?9I}s9>sXR*zdqM8N$#uR6wQ!Uf*&IjG0M$)%@)tqxben)<)&IP z7esK~j-5lBcWht0c=7eYo}3#Fogf_*?77sb3oqH3f+`Vj!x84OHs)+%Z6CO2q+eO& zoD--nvXdF*)e&ezSRubnC(&m%Lb=^k@{l(kZjPFD-|Zl6D&=Lr{Tbj>uRP4&#jvC3 zE;%l};a})BrjA=wv4h}8MIx%ztRf2#TF<)nu-~qW&$|(BL zV5CftiXDe*N}O?lw`WgvQMhL-sYAMIFl|WTz1X0y}Ke#N=Dxse1JNIpCLlMiMq zK35b18l-=Qs(H?g|J;izki(x0xkJw}=XiGKq=^g-M)9X8?7n+L8OaSl`%`%+E!$pg zwf1I5V>8t$8J{d1HiU6`#`?_{Fw4_=Bk=Bd%w>_zyI3Zo1LaX(rkP|)x(3?&i0&`E zH7Bc)%F#Fl(___?Z3B!vUL!CHx5MoluimQIZMTS8JapEj6X9K#&W+nO?WupFK1md# z+nu5rYSDg^vt#(SR4rVI^C@LB-Vz&FI+)(~KK;})FKL~=jbJ8L&`)%vA|gHjA99>C zjxh?oSa{l`@7bvy?`fnfAonbBsy3Y{aqbYw1AET`e$$(ObfXUelN_u>3q_Y+;h-Ze z>CGOKtAl;-UT^ZYdxS~7NqPFN4s?dSJavwq?EQkG*W@f?-?M@vJQqb=)-Fz;rKHv> zX8kNVI<>jxu=aiSIrl)a2nxG1%W+P{v{9OIq&iQZKyB4KCZGG1L`+*)ne9&-n6iOq z2Z_hwSSEIO%dMCYWrC1-BcbV^+xfY)AWm0Ihn`&Zkv4123*Z)lR93QoL2%Fc7hfFs zQ(wQrb&7yEWmP2MYB~dRLEfAsO~s6$I*mq%h@>AyP54)8@a^Q70+r)l0CcbG_$JaG zc5@jnW4&30QY$JSe;)zL{*c##Oq#Rk8Vu9F^1&N6LD~sz?)7S+IV3bWS)a(%6Lps< z9wOf$i)3dxEWA15^}SbX0X8?U+Ok1`r0nd2tbVs-6Ky8@WMHy5hE!vw^lwda`WkqNPg_aZ;MjXP6B@XA%%v zooLBFujfH0+YC4oaYt|3V4%`O;vY)s&r@e?JGW%!?N1-rmLj_<9)70xy$98e#Y?nA zaFR(U4C6JzU~*oL)OtG7^VLVnuydvi&gg4}dx9zaBamn&tv>r>Nt?cEea2!Y$AWYn z`b8oxa2_Kj5ypgjb;{(-Hkq0wr+oU&)6QmH_D5;+Xlb{5)sxUm9NY7*jP!nTXOT)OnUrOU~;mA79?Lr8}fPCtd0456^%aCaHzs_+jk|JCh@sr7Ls zUOX1BC4X(aLwtB?h(M>6;U;;F@!hN*uhl1`(pX%omdowVdKqc0#VzxsLZ9(yaV=`E zou|XQY@o{)FP(R(linpcT2`7bZwcJDW5>){K6MpQSK8>m0kv2hm5FiD zVElIpD!ktmDiXWozDxii8gLwY=6Xxh7-8P?cE;g@ge_8YyTe&WXPzls{2$h*g_Aewo~DKgs?&hH9_~{R#a)lupy_!@Xk~j z1xPpI8nw~_4Kb8fr-NbFh{FoeS}IK#TpJo8QPdUsM>*?uL=DYOhZ7bomTJ{CCxgD- zf)m^Bdj_o-sbFSBhxHyOOz(#1Hqa$;6Bbgn9PE%|Fs2K1FC%cmJ_V|?4yuO_O^;4z zg+>`JW8)Optr25g`^LfUa&wZNR_cwoo~%?X9p9zK;e&XYphPDQwjgB41IxQQtVle{ zwAuqEPPC#YK4*5Ly9BR5#Fe_}>m)-@mBAJf7t%7lwa^44JN-7a(6lA}z=iF*LU%{q zn>&SqEk}JT<;u^!Y6InOAS`0Q}QZR+$?SfYmWmNbkLekGxr_TEal17?3mccDv;bu=YInpLfD=u>P(d@5|p8nTf%CMZ7 zr0xpR1<;Ht+941HzzKId4u-nAV9CkI;5i5xjEv$^>nTs* zRSPd_dzyc%jk+molNIdXn43&g23wrwc0zX_d%V2#aI?tz$8&|qOSJvrLzz0Ff=XSI z2WEwlQZ3~;fYskdjY(Nl>Jvz738ML}U$4+EXR^2CijmK`64@`$Yg)kSWt|TfAW-oi z^?thn7Md7Uwv<6}r;Fg4J4tmDQ78vq;g#rTSQchw8Yw1(EY-74^>%6sn&3kYB{UE{ z3K?s?(Sf`Y$us0$F-zvDSYN^s5%q}&DPKQZX?r#a$ucDz%zEUCku~XmZJGle`VmXX zMSM;}uMD?wP}XXP4^|Eza*XJ76bg1hs-wd)k{8!1B+Be0y*P}bZKK0^ufh}?zg$n; z3US|ZxRx27rj2@=tt=iK&5ssPEx1-coCYj2bsU_vtY?zp8lu-n+u*cXoi80EoQ7?A zFypE8cAfzf3OT(PY&4$5CPKr?CefE2%zE@18;0~NE8}6*nF(6y_`v#r*DlBJbL<5+ zAMH9>@EfVc{IxqK>4{kxW{XT07n0lWmzvWPbn9U#lqmgOe(5AX|Q|@~H&2{llZKXd+@R%doO0u+qU`P(6}@RIII4I&X8B zn%u-X`|{Tr6YG^TDP+FPDC>-qPo+#SAm~D5;AG?!9om?M=w}0cd&GGsh!A#`goBG5 z$?V$`t~u>u5=v;BkYh?Zrp=CSqCJxNH(@uxyH1mQlfqUFAEn4Tq29KqC$L?OW8I=< zcfkkG;9(v}&T5fVBJ%Jx3w`ydWafD~xv)m6O~YyJ0?krM)db3(IZM7-!IY*Y=`cjJ z?am@(q9i?Kt;@_k=7LFTMg1O2OqK;6Osy7KYnba+QDX=GkRP z)ZUC4{C;?rDz4hT`I?n+z5?r&X?$&R_zr~YSodu#KKFo)nC~y@8N1T&EAv%mSrRKZ zHzJB4(rtHwp@Pkpdp1$lGBjc^)^=T90I%wcUVtJIWzN_ZmePk0I%3!TRw-9|)-CTj z#%werRGy7oKJ6NKXCqYnf?&gnYTjPM1b9C>&k9i$cax+Ey~aT&EIqs@N$cQg^4IVXnDc z2FGdD!s98-47Nrlr`m@3yWn`BO={Hnc2 z*R=O7laOZS%BA5^xZcf?>!t1JQo5%(vK``#dDA^)XnPVZ69(L;3F4w~X60D5Q6{dm zn%l&AZtTgJ%9@l9bG_-w4HvNmXh(5t_HtS{If0jSxr>PoA4E&#I^E3!Xs=?1J}jWE zV#)zNz?!WgeXKyK{A?9+;-%k*MM+6$l$thhQa>^jN=|m_l?rBEDKSws&O@4-85^U1 z*nQtD8IpZ&j`oE{XO~k)&YDa>vcdB8>2$*_fP_8FX_eB`K3o#%i)r|^o7^@iOL=rkf-F_p(Gs(zSggq5s8B>`;HLPr3iRea=TrowCOv=A* zwa>Yj^RxI;3=_)8aCJOQbE(R(U4?ble-p(M!nwZFc}ynFhpqWc-l3ODCMT#pMRz2Q zd~Iniaxbqi}bc>nRj-u;LSbnGF15hM$Cb<_?CglqJm=`O=?Uce1T$< z*F4{@>;Bea*^GY@gX!?W-d^-AnwnVCcpq~!?=o+|QRVC{nZa^^%SqXjZC5I0#MZKq z@=T5C@7ym=NXrrEPMb2}%oO7N(1vG@-8OH@Z29|4O{x}fCD}yCWb0-RrW@I=kmUR@ zXPRxk`qGe**ISGKAk17Uadx7r(0&x@qIHhXpKWKcc>1xJ;%(MqpV4Nu{!eoMMw&$5 z=o2?R{n%y>QaQGr6iT*Z4I*;oRltbHaqYI-@RWRP5XtSyu_Z#kjd!1z8B8SudDv9o z*f<7vL>XkM$v|aF+955eODiG>m^=^uIOYz zy4i&nO#~_&kF6sAlWE;CMNObivrlwNT*c7%u=dL zD53NS9ng%)_t(O&>E=&HFxCdHXj1|OlDYx*>1oykQ+&XR z+2+oObp)bbPGR6O^BkG+<~9elIJ)yi`YkZOSo?{r+-Gs}wag?%X0OSAG3S3?QSvdJ z8EeYu*tIOO39$eJRIhv^TA*Zf-sUMBN^Lxoc<0&O_xMmaCQCe9DJ@mld7IK(=9zKp zpx`h!k6WTt6!?&qD7X)_gg9$R0+aBIJ9F4PT*)8`B@h+1@cVy?hw3nwRHZy)?mIkj zD}S<&a?HmDY{n#%*hxK1c21Oc{d)&HL%5EV$SfM->Us^#j5)a4bc(&1M0`!FO!P&% zhGeq_yR@Lhw@z{pqZ4)bDT&FES?=I3o7IA265`M7o9thnB3(|*;-T6u9dTH{>DGkX zPwet`n%zl;m44@^I9iL0a!1MLiL@=BEqJri5!}c%J2XwlRIDJ?@H*#kF-zenZt)tPo~weK?ffR zFBC+wdyAputT&nb*b1Dl!%ka!irQCR=Eve`;5lqxipFbCq%g7_8@b>WqdIx}>e6QnEZ|`Ltel#^%6{0~hFcE>8y~c8qG~Ea}%}%#?vnx&r>KtY6WLGD6GqXrslIpb6QpKR!*+9}#v7ETX_ub7}ZUZ@E zPU{{sf5a-gGxp<*Vk_!Q8S=W$=-e%M4kvL$X<-jwK_JHnY@-??%i}b5VC5b)SE6OVu2>^MZtD^fN1@PEMl6vC4 z)P=Mm?H7(%wmSl>rw0GQBnvY&0Wp&uU9osYSx+*jO>G%Tb}9-I*I-WANyvG(5r+9L zg?8~F&@2#z|2+lrLqR-t{^{Ao$CU7G2t4JSJx~I{2VFcdvBE5^W$B}zSbH~`6Hs@HZK(J~26z%D_ zH9f7!hz7>zMvi*jafLYAPL|SP2U~HsGg(Ftn8QV7nvrdR<@8~Tj~v&QI8Ty93z?wM zsN2(`nyj2uXF*PDU;YzsLMO%ij?c%)1Ut!^i&WOK_UwQ^yTK=06jIFp9Be&tA)+~Ug!P~v^3QU$KMiFtE zwruElzX&x@6fxm%&R5fIta`V79P1NK+7aM{)7d@MB%SOxqCV3Cqv$_8J;Z3c_$OO^ z=BMr-6vcbkI%sld07X(BVHQpA2Sa|FoHCqkFSFZdud^X3IRTvVs@RJQ3!b~%}Gxm6RD+a5v` zDeBz(nVJZ8=Z>UxPym-q@ks?L_d6RqPY8BS6BQ{!@tpaG%2=vxZ>yAf%LB6GuVU?> zfuO31Wz@~=1!W26V(i4END&q5Inos2aQiubr-k(=pOy0R$X0?g>lF=T=Bxy(w)iHO zq~kqz$oC=r$+?FNi{eWJ$XW^fo-pI>T53`_9D3?am4Z(rNS=1x_VTmauGz{F@2K}m zbeTN6>@!n^!$&c+@l0U^791!`DEF}`GVo0ux0OiTOlh2>w^E=%caup}a?THwF)D&R zJK$GQ)R4XGB9UKw;=*0J?)&-at81ivQl+ORGp}`Km6wyxPi-q^rzWr~@gED5)juZ%&64w!lgROm%C|Kz>PV*KP3U^INv1ZQ(?&DSnZF7M6;`&kw zLo5+wzyUhu_>dPqG-XoJ&M>i%%N#CrTVHu^iP$skHq(Q4BSN9e#3>azEvDzFJ-0YBTTvNZKTJXMJ~&}EA08oeY`cZDE_?=yaB97{ID2W6l)SH*=2NGop3qwE zZAa+367FC;PF#86hYjFYn6mq~n9|`pnL(DWH;-)Fl;+Y0z<8mQcYhR*k#Yx3i9T7i z$$U#gxtcL{T#$yGd7Q73llOw|8`7j+r{DMC4$`f*H{bQ&Fq5sk~c69tt{-NQQ4U* z*Oqv;iB^2B4nz~#qMyMA^HL_$=~q(buGC(H4oerXp}={0gzVKA=UBBfr5C`CoZG$0 zY+1!eY%G|1Kg?1zfq7`_e7DxL-tl#lz>jXXSa99$4O=%4?b^Kkkr&>lPj~Uj91hn~ zXEopLLSjkeyR$8*nSFhy^6D25-K4osgPT*|K3fmhQNs95&*|LHKI2*#%+5Lqui0oz# zin{HQy?MtJo0&o|Aphe9Lab~G`AisWaI4IzeB6g#m8Ad&qEke{*MrErCCu%UJ4T=w zug*;}Aa5WOwTK03(MaWhZ`kM+iW=W*mNbk4>snds(_3qr=`_;T7&y(MmrQ#expN-dvuJZ`LVMb*u%13PrdfD;R~G67?!Eq;b>iM5403~=V7tMG z#CW}j#byF68U9={+29=iIYo4zhOlo2 z@V2XM{<4Gd?rUqdhj|Lk@{S;*u`eZ9d>x+{i&=o?aV6ZMkXI|ye{!sN-#&_CCw6{A zCnHxnJLr*kvS;!lMtma~S;3XkMg?)G&i;^nhfl!6n_w01B)O#AGbnz8? z=;p+RjcC-zD{@lG(ceBv*093@tWdv?w=gLm2xc7NGO!mNltT5d8m7L|)FnwL$>D4B z0>+J9lGis<$bEgl?0MNP>8;kfa^jM4T@BbFB`?k9*B88F3k58AJqEIcr}snJ<-wV1 z=*}1pRY_| z4N)aY@YwqGHcff6W)qu0az<~F^6oNPj*h~k-h|L=lMq_YZ43EVy)NFLuX`3Xdg0}3 zD51$rk0cXIFF@hbyjhUe$$|{fci0j-`IiRMMv#9@2s)9SGyRi2z}MIk)nVUa)Bm>F zI%sbsNib+fZ$mdXuSu7JUkamvS6nQd!H)6~Tlr7tq=uDQB{`}X^Eu9BOAmibVzC*a zgGv9fn{r)U#>d+DS{oLFLNR^*X**p_3h1`jl5-VR7n_nzwu+9LK}sz@g^8TjsGV}e z81ipbhITAaGO6o`8RQ9NFUPt)U>(1I6>`5Yrpk_WrW`7#x_m b9xHmsJR7O~t%Ylw5;VGuePiJsqv!tuUL16o literal 0 HcmV?d00001 diff --git a/po/fi.po b/po/fi.po new file mode 100644 index 0000000..a587343 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,2136 @@ +# Finnish messages for glib. +# Copyright © 2009 Free Software Foundation, Inc. +# Lauri Nurmi , 2002-2004, +# Sami Pesonen , 2004-2005. +# Ilkka Tuohela , 2005-2009. +# Timo Jyrinki , 2008. +# Harri Pitkänen , 2009. +# Tommi Vainikainen , 2009-2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-20 00:00+0200\n" +"Last-Translator: Tommi Vainikainen \n" +"Language-Team: Finnish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Odottamaton ominaisuus ”%s” elementille ”%s”" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Ominaisuutta ”%s” elementille ”%s” ei löydy" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Odottamaton merkintä ”%s”, odotettiin merkintää ”%s”" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Odottamaton merkintä ”%s” kohdassa ”%s”" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Kelvollista kirjanmerkkitiedostoa ei löytynyt datahakemistoista" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI:lle ”%s” on jo olemassa kirjanmerkki" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI:lle ”%s” ei löydy kirjanmerkkiä" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI:n ”%s” kirjanmerkissä ei ole määritelty MIME-tyyppiä" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI:n ”%s” kirjanmerkissä ei ole määritelty yksityisyyslippua" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI:n ”%s” kirjanmerkissä ei ole asetettu ryhmiä" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Sovellus nimeltä ”%s” ei rekisteröinyt kirjanmerkkiä kohteelle ”%s”" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Suoritettavaa riviä ”%s” ei voitu laajentaa URI:lla ”%s”" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Muunnos merkistöstä ”%s” merkistöön ”%s” ei ole tuettu" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Muunninta merkistöstä ”%s” merkistöön ”%s” ei voitu avata" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Virheellinen tavusarja muunnettavassa syötteessä" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Virhe muunnoksen aikana: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Osittainen tavusarja syötteen lopussa" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Koodausmerkkijonoa ”%s” ei voi muuntaa merkistöön ”%s”" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI ”%s” ei ole absoluuttinen URI ”file”-muodossa" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Paikallinen tiedosto-URI ”%s” ei saa sisältää merkkiä ”#”" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI ”%s” on virheellinen" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI:n ”%s” isäntänimi on virheellinen" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI ”%s” sisältää virheellisesti suojattuja merkkejä" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Polku ”%s” ei ole absoluuttinen" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Virheellinen isäntänimi" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Virhe hakemiston ”%s” avaamisessa: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ei voitu varata %lu tavua muistia tiedoston ”%s” lukemiseksi" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Virhe tiedoston ”%s” lukemisessa: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Tiedosto ”%s” on liian suuri" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Tiedoston ”%s” lukeminen epäonnistui: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Tiedoston ”%s” avaaminen epäonnistui: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Tiedoston ”%s” ominaisuuksien lukeminen epäonnistui: fstat() epäonnistui: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Tiedoston ”%s” avaaminen epäonnistui: fdopen() epäonnistui: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Tiedoston ”%s” uudelleen nimeäminen nimelle ”%s” epäonnistui: g_rename() " +"epäonnistui: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Tiedoston ”%s” luominen epäonnistui: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Tiedoston ”%s” avaaminen kirjoitettavaksi epäonnistui: fdopen() epäonnistui: " +"%s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Tiedoston ”%s” kirjoittaminen epäonnistui: fwrite() epäonnistui: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Tiedoston ”%s” kirjoittaminen epäonnistui: fflush() epäonnistui: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Tiedoston ”%s” kirjoittaminen epäonnistui: fsync() epäonnistui: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Tiedoston ”%s” sulkeminen epäonnistui: fclose() epäonnistui: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Olemassa olevan tiedoston ”%s” poisto epäonnistui: g_unlink epäonnistui: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Malli ”%s” on virheellinen, se ei saa sisältää merkkijonoa ”%s”" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Malli ”%s” ei sisällä merkkijonoa XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u tavu" +msgstr[1] "%u tavua" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f kt" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Mt" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Gt" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f Tt" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f Pt" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f Et" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Symbolisen linkin ”%s” lukeminen epäonnistui: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolisia linkkejä ei tueta" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Muunninta merkistöstä ”%s” merkistöön ”%s” ei voitu avata: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Funktiossa g_io_channel_read_line_string ei voi suorittaa raakalukemista" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Jäljelle jäänyt muuntamaton data lukupuskurissa" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanava päättyy osittaiseen merkkiin" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Funktiossa g_io_channel_read_to_end ei voi suorittaa raakalukemista" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Tiedoston ”%s” avaaminen epäonnistui: open() epäonnistui: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Tiedoston ”%s” mappaaminen epäonnistui: mmap() epäonnistui: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Virhe rivillä %d merkissä %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Virheellinen UTF-8-koodattu teksti nimessä - epäkelpo ”%s”" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "”%s” ei ole kelvollinen nimi" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "”%s” ei ole kelvollinen nimi: ”%c” " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Virhe rivillä %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Merkkijonon ”%-.*s” piti olla luku merkkiviitteen sisällä (esim. ê), " +"mutta sen jäsentäminen epäonnistui - ehkä luku on liian suuri" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Merkkiviite ei päättynyt puolipisteeseen; todennäköisesti käytit &-merkkiä " +"aikomatta aloittaa entiteettiä - käytä merkintää &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Merkkiviite ”%-.*s” ei ole sallitun merkin koodaus" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Havaittu tyhjä entiteetti ”&;”; kelvolliset ovat: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entiteetin nimi ”%-.*s” on tuntematon" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiteetti ei päättynyt puolipisteeseen; todennäköisesti käytit &-merkkiä " +"aikomatta aloittaa entiteettiä - käytä merkintää &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Asiakirjan on alettava elementillä (esim. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"”%s” ei ole kelvollinen merkki ”<”-merkin jälkeen; se ei voi aloittaa " +"elementin nimeä" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "Pariton merkki ”%s”, odotettiin ”>”-merkkiä päättämään elementin ”%s”" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Pariton merkki ”%1$s”, odotettiin ”=”-merkkiä elementin ”%3$s” ominaisuuden " +"”%2$s” jälkeen" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Pariton merkki ”%s”, odotettiin merkkiä ”>” tai ”/” päättämään elementin ”%" +"s” aloituslippu, tai mahdollista ominaisuutta; käytit ehkä ominaisuuden " +"nimessä siihen kelpaamatonta merkkiä" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Pariton merkki ”%1$s”, odotettiin avaavaa lainausmerkkiä yhtäsuuruusmerkin " +"jälkeen annettaessa elementin ”%3$s” ominaisuuden ”%2$s” arvoa" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"”%s” ei ole kelvollinen merkki sulkuelementin ”%s” jälkeen; sallittu merkki " +"on ”>”" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elementti ”%s” on suljettu, ei avoimia elementtejä" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Elementti ”%s” on suljettu, mutta tällä hetkellä on avoinna elementti ”%s”" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Asiakirja oli tyhjä tai sisälsi vain tyhjiä merkkejä" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Asiakirja loppui odottamattomasti heti avoimen kulmasulkeen ”<” jälkeen" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Asiakirja loppui odottamattomasti elementtien ollessa sulkematta - ”%s” oli " +"viimeinen avattu elementti" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Asiakirja loppui odottamattomasti, odotettiin lipun <%s/> sulkevaa " +"kulmasuljetta" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Asiakirja loppui odottamattomasti elementin nimen kohdalla" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Asiakirja loppui odottamattomasti ominaisuuden nimen kohdalla" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Asiakirja loppui odottamattomasti elementin avauslipun kohdalla" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Asiakirja loppui odottamattomasti ominaisuuden nimen jälkeisen " +"yhtäsuuruusmerkin jälkeen; ominaisuudella ei ole arvoa" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Asiakirja loppui odottamattomasti ominaisuuden arvon kohdalla" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Asiakirja loppui odottamattomasti elementin ”%s” sulkulipun kohdalla" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Asiakirja loppui odottamattomasti kommentin tai käsittelykomennon kohdalla" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "vioittunut kohde" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "sisäinen virhe tai vioittunut kohde" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "muisti loppui" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "taakseviittausten raja saavutettu" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"malli sisältää kohtia, jotka eivät ole tuettu osittaisessa täsmäyksessä" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "sisäinen virhe" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "takaisinviittaukset ehtoina eivät ole tuettu osittaisissa täsmäyksissä" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "rekursion enimmäissyvyys saavutettiin" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "työtilan raja tyhjille alamerkkijonoille saavutettiin" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "virheellinen yhdistelmä rivinvaihtolippuja" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "tuntematon virhe" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ mallin lopussa" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c mallin lopussa" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "Tuntematon merkki \\:n jälkeen" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "merkkikokoa muuttavia ohjaimia (\\l, \\L, \\u, \\U) ei sallita tässä" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numerot epäjärjestyksessä {}-määreessä" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "numerot liian suuria {}-määreessä" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "merkkiluokasta puuttuu päättävä ]" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "virheellinen escape-jono merkkiluokassa" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "alue epäjärjestyksessä merkkijoukolle" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ei mitään toistettavaa" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "tuntematon merkki (? jälkeen" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "tuntematon merkki (?< jälkeen" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "tuntematon merkki (?P jälkeen" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX:in nimetyt luokat on tuettu vain luokan sisällä" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "päättävä ) puuttuu" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ilman aloittavaa (-merkkiä" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R tai (?[+-]numeroita täytyy seurata )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "viittaus olemattomaan alitäsmäykseen" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "puuttuva ) kommentin jälkeen" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "säännöllinen lauseke on liian suuri" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "muistia ei voitu varata" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-tyyppinen assert-makro ei ole kiinteäpituinen" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "virheellinen numero tai nimi (?( jälkeen" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "ehdollisessa ryhmässä on enemmän kuin kaksi haaraa" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assert-makrotoiminto odotettu merkkien (?( jälkeen" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "tuntematon POSIX-luokan nimi" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-vertailuelementtejä ei tueta" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "Merkin arvo sekvenssissä \\x{…} on liian suuri" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "virheellinen ehto (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ei ole sallittu lookbehind-tyyppisissä assert-makroissa" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursiivinen kutsu voisi olla päättymätön" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "alimallin nimestä puuttuu päätösmerkki" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "kahdella nimetyllä alimallilla on sama nimi" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "väärin muotoiltu \\P- tai \\p-sekvenssi" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "tuntematon ominaisuuden nimi \\P- tai \\p-sekvenssin jälkeen" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "alimallin nimi on liian pitkä (enintään 32 merkkiä)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "liian monta nimettyä alimallia (enintään 10000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "oktaaliarvo on suurempi kuin \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-ryhmä sisältää useampia kuin yhden haaran" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE-ryhmän toisto ei ole sallittu" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "epäyhtenäisiä NEWLINE-valitsimia" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g:n jälkeen ei tule nimeä aaltosulkeissa tai nollasta poikkeavaa numeroa " +"valinnaisesti aaltosulkeissa" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "odottamaton toisto" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "koodin ylivuoto" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "käännöksen työalueen koko loppui kesken" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "aiemmin tarkistettua ja viitattua alimallia ei löydy" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Virhe täsmätessä säännöllistä lauseketta %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-kirjasto on käännetty ilman UTF8-tukea" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-kirjasto on käännetty ilman UTF8-ominaisuuksien tukea" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Virhe säännöllisessä lausekkeessa %s kohdassa %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Virhe optimoitaessa säännöllistä lauseketta %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "odotettiin heksadesimaalista numeroa tai merkkiä ”}”" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "odotettiin heksadesimaalista numeroa" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "merkki '<' puuttuu symbolisesta viitteestä" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "päättämätön symbolinen viite" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "nollan mittainen symbolinen viite" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "odotettiin numeroa" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "virheellinen symbolinen viite" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "ylimääräinen päättävä '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "tuntematon escape-jono" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Virhe tulkittaessa korvaavaa tekstiä ”%s” kohdassa %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Lainattu teksti ei ala lainausmerkillä" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Pariton lainausmerkki komentorivillä tai muussa kuorisuojatussa tekstissä" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teksti loppui aivan merkin ”\\” jälkeen. (Teksti oli ”%s”)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teksti loppui ennen kuin löytyi merkkiä %c vastaava lainausmerkki. (Teksti " +"oli ”%s”)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksti oli tyhjä (tai sisälsi vain tyhjiä merkkejä)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Datan lukeminen lapsiprosessilta epäonnistui" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Putken luominen lapsiprosessin kanssa viestintää varten epäonnistui (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lukeminen lapsiprosessin putkesta epäonnistui (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Hakemistoon ”%s” siirtyminen epäonnistui (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Lapsiprosessin käynnistys epäonnistui (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Virheellinen ohjelman nimi: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Virheellinen merkkijono argumenttivektorin kohdassa %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Virheellinen merkkijono ympäristössä: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Virhe työhakemisto: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Apuohjelman suoritus epäonnistui (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Odottamaton virhe funktiossa g_io_channel_win32_poll() luettaessa dataa " +"lapsiprosessilta" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Datan lukeminen lapsiprosessilta epäonnistui (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Odottamaton virhe funktiossa select() lapsiprosessilta dataa luettaessa (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Odottamaton virhe funktiossa waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Haarauttaminen epäonnistui (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Lapsiprosessin ”%s” käynnistäminen epäonnistui (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Lapsiprosessin tulosteen tai syötteen uudelleenohjaus epäonnistui (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Lapsiprosessin haarauttaminen epäonnistui (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Tuntematon virhe käynnistettäessä lapsiprosessia ”%s”" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Lapsiprosessin pid-putkesta ei voitu lukea riittävästi dataa (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Merkki on sallitun UTF-8-välin ulkopuolella" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Virheellinen sarja muunnettavassa syötteessä" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Merkki on sallitun UTF-16-välin ulkopuolella" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Käyttö:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[VALITSIN…]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Ohjevalitsimet:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Näytä ohjevalitsimet" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Näytä kaikki ohjevalitsimet" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Sovelluksen valitsimet:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kokonaislukua ”%s” ei voida tulkita kohteelle %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Kokonaisluku ”%s” kohteelle %s on ylittää sallitun alueen" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kokonaislukua ”%s” ei voida tulkita kohteelle %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double-arvo ”%s” kohteelle %s ylittää sallitun alueen" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Virhe käsiteltäessä valitsinta %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Puuttuva argumentti kohteelle %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Tuntematon valitsin %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Kelvollista avaintiedostoa ei löytynyt haetuista kansioista" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ei tavallinen tiedosto" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Tiedosto on tyhjä" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Avaintiedosto sisältää rivin ”%s”, joka ei ole avain-arvopari, ryhmä tai " +"kommentti" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Virheellinen ryhmän nimi: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Avaintiedosto ei ala ryhmällä" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Virheellinen avaimen nimi: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Avaintiedosto sisältää ei-tuetun koodauksen ”%s”" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Avaintiedostossa ei ole ryhmää ”%s”" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Avaintiedostossa ei ole avainta ”%s”" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Avaintiedosto sisältää avaimen ”%s” arvolla ”%s”, joka ei ole UTF-8-" +"merkkijono" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Avaintiedosto sisältää avaimen ”%s”, jonka arvoa ei voida tulkita." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Avaintiedosto sisältää avaimen ”%s”, jolla on arvo, jota ei voida tulkita." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Avaintiedosto sisältää avaimen ”%s”, jolla on arvo, jota ei voida tulkita, " +"ryhmässä ”%s”." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Avaintiedostossa ei ole avainta ”%s” ryhmässä ”%s”" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Avaintiedosto sisältää escape-jonon rivin lopussa" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Avaintiedostossa on virheellinen escape-jono ”%s”" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Arvoa ”%s” ei voida tulkita numeroksi." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Kokonaisluku ”%s” on sallitun alueen ulkopuolella" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Arvoa ”%s” ei voida tulkita liukuluvuksi." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Arvoa ”%s” ei voida tulkita totuusarvoksi." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Liian suuri laskuriarvo välitetty kohteelle %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Virta on jo suljettu" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Toiminto oli peruttu" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Virheellinen olio, alustamaton" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Virheellinen monitavusarja syötteessä" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Kohteessa ei ole tarpeeksi tilaa" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Keskeytyskelpoinen alustus ei ole tuettu" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tuntematon tyyppi" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s-tiedostotyyppi" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s-tyyppi" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Odottamaton aikainen virran loppu" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Nimeämätön" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Työpöytätiedosto ei määrittele Exec-kenttää" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Sovelluksen vaatimaa päätettä ei löydy" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Käyttäjän sovellusten asetuskansiota %s ei voi luoda: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Käyttäjän MIME-asetusten kansiota %s ei voi luoda: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Käyttäjän työpöytätiedostoa %s ei voi luoda" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Oma määrittely kohteelle %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "asema ei toteuta aseman avausta" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "asema ei toteuta aseman avausta (eject tai eject_with_operation)" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "asema ei toteuta median tarkkailua" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "asema ei toteuta käynnistystä" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "asema ei toteuta pysäytystä" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem-koodauksen versiota %d ei voi käsitellä" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Virheellinen määrä tunnisteita (%d) GEmblem-koodauksessa" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon-koodauksen versiota %d ei voi käsitellä" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Virheellinen määrä tunnisteita (%d) GEmblemedIcon-koodauksessa" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Oletettiin GEmblen kohteelle GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Toiminto ei ole tuettu" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Yllä olevaa liitospistettä ei löydy" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kansion päälle ei voi kopioida" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kansiota ei voi kopioida kansion päälle" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Kohdetiedosto on olemassa" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kansiota ei voi kopioida rekursiivisesti" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Splice-operaatiota ei tueta" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Virhe suoritettaessa splice-operaatiota tiedostolle: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Erikoistiedostoa ei voi kopioida" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Saatiin virheellinen symbolisen linkin arvo" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Roskakori ei ole tuettu" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Tiedostonimi ei voi sisältää merkkiä ”%c”" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "taltio ei toteuta liittämistä" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Tiedoston käsittelyyn ei ole rekisteröity mitään sovellusta" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Numeraattori on suljettu" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Tiedoston numeraattorilla on odottavia toimintoja" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Numeraattori on jo suljettu" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon-koodauksen versiota %d ei voi käsitellä" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Virheellistä syötetietoa GFileIcon-oliolle" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Virta ei tue komentoa query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Virta ei tue siirtymistä" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Syötevirtaa ei voi kutistaa" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Virta ei tue kutistamista" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Väärä määrä tunnisteita (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Luokan nimelle %s ei ole tyyppiä" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tyyppi %s ei toteuta GIcon-määritystä" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Typpi %s ei ole luokkatyyppi" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Virheellinen versionumero: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tyyppi %s ei toteuta GIcon-määrityksen kutsua from_tokens()" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Annettua kuvakkeen koodauksen versiota ei voi käsitellä" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Syötevirta ei toteuta lukua" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Virrassa on toiminto odottamassa" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Pistokeosoitteelle ei ole tarpeeksi tilaa" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Ei-tuettu pistokeosoite" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Paikallista kansiontarkkailun oletustyyppiä ei voi selvittää" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Virheellinen tiedostonimi %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Virhe haettaessa tietoja tiedostojärjestelmästä: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Juurikansiota ei voi nimetä uudestaan" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Virhe nimettäessä tiedostoa uudestaan: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Tiedostoa ei voi nimetä uudestaan, tiedosto on jo olemassa" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Virheellinen tiedostonimi" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Virhe avattaessa tiedostoa: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kansiota ei voi avata" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Virhe poistettaessa tiedostoa: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Virhe siirrettäessä tiedostoa roskakoriin: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Roskakorikansiota %s ei voi luoda: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Päätasoa roskakoria varten ei löydy" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Roskakori kansiota ei löydy tai sitä ei voi luoda" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Roskakorin informaatiotiedostoa ei voi luoda: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Tiedosto ei voi siirtää roskakoriin: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Virhe luotaessa kansiota: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Tiedostojärjestelmä ei tue symbolisia linkkejä" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Virhe luotaessa symbolista linkkiä: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Virhe siirrettäessä tiedostoa: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kansiota ei voi siirtää kansion päälle" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Varmuuskopiotiedoston luonti epäonnistui" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Virhe poistettaessa kohdetiedostoa: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Siirto liitospisteiden välillä ei ole tuettu" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Ominaisuuden arvo ei voi olla NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Virheellinen ominaisuustyyppi (piti olla merkkijono)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Virheellinen laajennetun ominaisuuden nimi" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Virhe asetettaessa laajennettua ominaisuutta ”%s”: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Virhe tarkkailtaessa tiedostoa ”%s”: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (virheellinen merkistökoodaus)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Virhe tarkkailtaessa tiedostokuvaajaa: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Virheellinen ominaisuuden tyyppi (piti olla uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Virheellinen ominaisuuden tyyppi (piti olla uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Virheellinen ominaisuuden tyyppi (piti olla tavujono)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Symbolisille linkeille ei voi asettaa oikeuksia" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Virhe asetettaessa oikeuksia: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Virhe asetettaessa omistajaa: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolinen linkki ei voi olla NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Virhe asetettaessa symbolista linkkiä: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Virhe asetettaessa symbolista linkkiä: tiedosto ei ole symbolinen linkki" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Virhe asetettaessa muokkaus- tai käyttöaikaa: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-konteksti ei voi olla NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Virhe asetettaessa SELinux-kontekstia: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ei ole käytössä tässä tietokoneessa" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Ominaisuuden %s asetus ei ole tuettu" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Virhe luettaessa tiedostosta: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Virhe siirryttäessä tiedostossa: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Virhe suljettaessa tiedostoa: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Paikallisen tiedostomonitoroinnin oletustapaa ei voitu selvittää" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Virhe kirjoitettaessa tiedostoon: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Virhe poistettaessa vanhaa varmuuskopiolinkkiä: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Virhe luotaessa varmuuskopiota: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Virhe nimettäessä uudestaan väliaikaistiedostoa: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Virhe katkaistaessa tiedostoa: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Virhe avattaessa tiedostoa ”%s”: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Kohdetiedosto on kansio" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Kohdetiedosto ei ole tavallinen tiedosto" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Tiedostoa muokattiin muualta" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Virhe poistettaessa vanhaa tiedostoa: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Saatiin virheellinen GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Virheellinen siirtymispyyntö" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream-kohdetta ei voi kutistaa" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Muistin tulostevirran koko ei ole muutettavissa" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Muistin tulostevirran koon muutos epäonnistui" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Kirjoituksen käsittelemiseksi tarvittava muistinmäärä on suurempi kuin " +"käytettävissä oleva osoiteavaruus" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Pyydetty kelausta virtauksen alkua edeltävään kohtaan" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Pyydetty kelausta virtauksen lopun jälkeiseen kohtaan" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "Liitospiste ei toteuta ”unmount”-operaatiota (irrottamista)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "Liitospiste ei toteuta ”eject”-operaatiota (aseman avaamista)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"Liitospiste ei toteuta irrottamista (”unmount” tai ”unmount_with_operation”)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"Liitospiste ei toteuta aseman avaamista (”eject” tai ”eject_with_operation”)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "Liitospiste ei toteuta uudestaanliittämistä (”remount”)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount ei toteuta sisältötyypin arvausta" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount ei toteuta synkronista sisältötyypin arvausta" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Isäntänimi ”%s” sisältää merkin ”[”, mutta ei ”]”" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Tulostevirta ei toteuta kirjoitusta" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Lähdevirta on jo suljettu" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Virhe selvitettäessä osoitetta ”%s”: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Virhe selvitettäessä käänteisosoitetta ”%s”: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Ei palvelutietuetta ”%s”" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Tilapäisesti ei voida selvittää palvelua ”%s”" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Virhe selvitettäessä palvelua ”%s”" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Virheellinen pistoke, alustamaton" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Virheellinen pistoke, alustus epäonnistui: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Pistoke on jo suljettu" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "luodaan GSocket tiedostokahvasta: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Pistoketta ei voi luoda: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Tuntematon protokolla määritetty" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ei saatu paikallista osoitetta: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ei saatu etäosoitetta: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ei voitu kuunnella: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Virhe sidottaessa osoitetta: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Virhe hyväksyttäessä yhteyttä: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Virhe yhteydenotossa: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Yhteydenotto meneillään" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Virhe yhteydenotossa: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ei saatu tulossa olevaa virhettä: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Virhe vastaanotettaessa dataa: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Virhe lähetettäessä dataa: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Virhe suljettaessa pistoketta: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Odotetaan pistoke-ehtoa: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Virhe lähetettäessä viestiä: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ei ole tuettu windowis-alustalla" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Virhe vastaanotettaessa viestiä: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Tuntematon virhe yhteydenotossa" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Kuuntelija on jo suljettu" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Lisätty pistoke on suljettu" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemeIcon-koodauksen versiota %d ei voi käsitellä" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Odotettiin yhtä ohjausviestiä, saatuun %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Odottamaton lisädatan tyyppi" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Odotettiin yhtä tiedostokahvaa, mutta saatiin %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Vastaanotettiin kelvoton tiedostokahva" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Virhe luettaessa UNIX:ilta: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Virhe suljettaessa UNIX:ia: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Tiedostojärjestelmän juuri" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Virhe käsiteltäessä UNIX:iin: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Abstraktit unix-domainin pistokeosoitteet eivät ole tuettuja tässä " +"järjestelmässä" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "taltio ei toteuta aseman avausta" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "taltio ei toteuta aseman avausta (eject tai eject_with_operation)" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Ohjelmaa ei löydy" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Virhe käynnistettäessä ohjelmaa: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI:ja ei tueta" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "assosiaation muutokset eivät ole tuettu win32-alustalla" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Assosiaation luonti ei ole tuettu win32-alustalla" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Muisti loppui" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Sisäinen virhe: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Tarvitaan lisää syötettä" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Virheellinen pakattu data" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Tietotaulukon suurin koko tuli vastaan" + +#~ msgid "do not hide entries" +#~ msgstr "älä piilota kohtia" + +#~ msgid "use a long listing format" +#~ msgstr "käytä pitkää listausmuotoa" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Tyhjä merkkiviite; viitteen tulee sisältää luku, esim dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Päättämätön entiteettiviite" + +#~ msgid "Unfinished character reference" +#~ msgstr "Päättämätön merkkiviite" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Virheellinen UTF-8-koodattu teksti - ylipitkä sekvenssi" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Virheellinen UTF-8-koodattu teksti - ei aloitusmerkki" + +#~ msgid "file" +#~ msgstr "tiedosto" + +#~ msgid "The file containing the icon" +#~ msgstr "Kuvakkeiden sisältävä tiedosto" + +#~ msgid "name" +#~ msgstr "nimi" + +#~ msgid "The name of the icon" +#~ msgstr "Kuvakkeen nimi" + +#~ msgid "names" +#~ msgstr "nimet" + +#~ msgid "An array containing the icon names" +#~ msgstr "Kuvakkeiden nimiä sisältävä jono" + +#~ msgid "use default fallbacks" +#~ msgstr "käytä oletusvarmistuksia" + +#~ msgid "File descriptor" +#~ msgstr "Tiedostokuvaaja" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Tiedostokuvaaja, josta luetaan" + +#~ msgid "Close file descriptor" +#~ msgstr "Sulje tiedostokuvaaja" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Suljetaanko tiedostokuvaaja, kun virta on suljettu" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Tiedostokuvaaja, johon kirjoitetaan" diff --git a/po/fr.gmo b/po/fr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b9b504c841d37346b2179e545e7ff7e0c9571531 GIT binary patch literal 48464 zcmdU&d7LF>b@vNb1QpqLD3+e?W~PUkVV@0#Szu%~W?>y1Z}+Y4zRc}=o4d>cA}Zp7 zNEAds6h;%3!ALY>ViXdfRSYI(aUmvg-!S49112%Xe1GS8YP(B!5Aw(R_J`tktLj){26#8xF3a3RWK7&eQUu(!4fzRd_8y;_yBku z_%rZS@D;s5a5A_YRJ~2`6!0cc^*s#E1)l;3z+w+jrxPlD>-*Fd#P zH~b8a0%w8CL7E)YK$;NT0Yb{)uRMMi42Ila2rdC@;N9Q@pxV2EMvAUi zf(yVK!P(&FL6QVd`}>f}5959c15%fS(3efJf0u(Pan}-R=PAgI@$y|BER6 z9PoTl^}Q9m82p^aqalvy)dWSS5A#3u_X+T9@VDS;;G#J}uoA3;?*tzLLvSsbMbB~Y z81M#AeEUbB`uhl|e*BZa|0Q?;_j}V=W$-xgEuiRiAE`6w*^%F z*ZBAE0oA@g1rGwh0;-%JgCY1lh$g;10aQB{`TLEa@>M|b%{xGbD)=<0dY=T327}XG z{$oIfIye*5`v_Eft_4-jo&Nb}K-KqUP~-nokRcBG&VaVy#h~WXTR^3I)Z@Q`i@ARW zWGV-zo$2PuWuV&eT9By}ycbk?p9MvSUxDI}11MDeSPv@yYe4bO`$6^VG4Md}X;AHb z360}tFcTDCNB;gDpvM1kQ2BlYG8KY@7cfV_C7}5KZ$Lf&708eU$1Zg3-2kfm?V#Fo zCrA^62~hR@52$vXzR2}sGpKsr=I{RkJcRovLFNA)sPg(D&db0HK=u1lQ0?9U?g#!M zD7t(CRJ!kiYUeLJ9tx2pcNT+sJ_sHQz7;$G+zlQ9J_xEmPk?IIzUMeObe6|Kk8cCj zz6ZcV!Eb`cg3o}j01sK>=-msdKMO!TUk{2;hd`y@0Uie4;h%pT)cAcK6uyM{yQl8zm(2t{7wh=2Umg`=gUF$ z<2q3Nya!wZJ_UXZT(APoP~-h2P;~hjsPTF62FFkHK$;v} z2r>nN_k(Kh4?yMHo5>=6>jPE)T2T3~0#)97!TrHcg2#Z5fiDGr2&%kafiDKn*yQMc zHuxg$F9X%i0;u-i0-gds0*Zc5gCTgrMXvwLzK~Uqq z_rj+9L@#BFA;bs zcq1tKe*o+Q{}vQ~JOe8I0hhaSPXm?yV(?(F3Q8{A0BXMd38?;k6+8=k8dQ5u-t6!~ zQ1Y-2YCJv;D&4n0jrZYKxcoCgm3ILcf>(i}=Plro;4W|;_#misKL^#WgJ0#wZva&P zHiAciJ3;aHyTSdyzXZh>Ujh#UpSQ)e>qt=ieJLn9+yJUw_k%}+4}(hoO;GLmHK=-D z_-a?*(crP%p9_ZIpvUVy{t<2 zA%};1Ji+6D$1^-G0S_Sk1)%21tH7(lVeoqJJKzmqRCMzDC*WM}_lq3=E&)|<4b(Wj z8N3qwBq+Ls!?X`v32HnZ0vCf{2hRo%8*%i#1k`-E2|PpTK+VgiL6vjjC^7Wv{x8V8U{F0mR*Mlc;{}{Lk{0Vp}*iWP8gRcTb&pW|0!N2#Wt_;N4&dJ`An_zXLuF&Z#*1 z{{}pX`H2=+G^Yw&(h^gD>cG#=|g(d9;vsUAE8svn1Kb9V9w zct7`#fV07IDmenY2UNd44fcaS0M+jOcDVIm zWN<0>>%o)3cY_+=&x0!WH=xSvgNem&7lNmOW8mrFAA&Q$e+GNOy{>V5+YhRp7lW$r z4WQE95B7jx1=arFfEtgU*Eo8Nf~x;6P;%t&{r%IR`0ykKMfui%nm0SZGr{}75d0n} zIq-tlIy#>SF5`YP_)75opvr#=lpH$lI@ga);N{%k1TF@j1l7;p*Eznt0@Qfj4i12i zgBq{@1eb&7z21%Q+rf?8e-Tu_!#6lOtO76Pemf|-{sXA@{|g=oo^-uy?+Q@ud@ZQ< z{WZ7>{4IDE_)3^c{P0FleEJD+9r%6l2=KHUT>0z3i@3iQTmgQ?-yiuV*N+;wlII@; z&jWuB-UpuXX2&Pr1<&FBn76q3vjtSWp8`eiAAxF5_*P^Hcp11Eyce7gzVJp@|2g0$ z?r-<^KLte0=fgb_S1|J4zfx+7y zKMa5x-z}h?zYA3QN5FpYYoPiY-0bLZKB#fN2Am0g+~YSu_3tHr;N;Cxj}dq{&)*Cl z3%(yb27ClO1pGF56!>fKIPjo%I6NH;xxWNd`*wn>!TZ74;QxTCZ{|B4e?_3$e=FDv zJ`An|p9I%}^KQXr0N((LZ~x2VrdwHSxc@lF)CvxJ7d{~HUEmz>Nl^72ew*W)^Fcko z6I=m44)%fjzuUEAK6pC!qu@gD9`JbZU%}JB-+`jXX}7z1wiX=V{#~HbKkD&!pxV9g z4oBykK#kw0z*mC*37!ltz0=L}I=GSh+rgv3r@({3ect2dNeIs1{t}QW6kG>3!ROtD zOaXU*9|jxmb>nl?`&>B-z_~oX6kHF!4O{|#(_?tIoSw!S{h0&(DA%_&rc`e8Kx&{`uf>+!w*a!8d`* zzY9DR{2X`!_zh6wxYq|9pUeT*aeoD<{@o9bf!_u%1K0ea8^_(?ay^2 z`2Q|Y^Y1ZG{P`PDgb6unN^?drc2JeK=g!4mih@DlLo z``kLS4V=&Yd%<(TC%_rt5g&2wSOO~lYrzA+yTKmtdj2D*dR}zDvwLQM2XQ|SRQt{Y#ouoL*MN6`YR8Yj zmEg<%1f3AP7}U5u4r+cp1ug-Xe9V=1Jt+Fz0lpmk5;zn51~>q|q|`F#Mt>5}o7=HCT8yB>UoYl!O% z?wLCFcNxF`kzeP4-vF-#ui^T-du{#J&mVCe=ASL$z5e>a1>pYR*T4aA2l#66ST6lt z;2?Ml_jmYbS9;Vd@gHnrb{5k%Si`&baP7_Y60T)D)8E7MIhuKC;_4;DcEoeutk`x(55-!J95 zf%~(-e+CD^?}Fd*X#_9h*U z=5sxd_jht_=J#Pf?Iqw=|6A!#HC)T}(EoiH`~p|R``3W)&V zukz27ZY|d$u3vM_;u_|9A(#FRlNjK9=ijt|IsP`!}xdah=8WdY%n}=X2?AJJ;vA-o&+q zOMkC&5M1r^`&)zF%+1aI_r5LZ9^?5@Tq7;dSMuy>uGu_)H(2KSCYSzx>A=>vd;RY* z@V~fz!F8@LYqQ6X@$5TX^1~g(^$~vSZ-1_feHwef|4!w4k-vE-?`Cq{$aOu}B|JZZ zi={C6+sFTUG4F@C9_Ri<|Lh3v*Zbf1fv@0t9#_pj`jm5&4t|O&;yRrB_kg!^ZQ}Rax&DIR7js?B zRpQd$F0Kc;*75#Qt}FSymFu@$ui<_sD7|PWzkdVj?>2rP&lUf@gCGCxZ~g#$7w=91 zSAmCuCxN$foy_%K?mxkGE7xnezmQ9R|Kh-WRyXnN7=Qm&u%GK(t_?i@8*nw3{_b&L zdiCYJ`%~_Zwu!}813dX#IP)vzE`Y!e*tkBP>?O3XDR%Ioz)6mrhE0B^+q%nEGZUw==1P+NOUR&OU9~AhOs&vjzweD+Rm^RUDYhrNZP1| z6gKOWwtD62eeQTrYdz_SA ztTL}_h3$-Qp%}tFBU?(w%w#!}FGp!E0lCk~S)?oObCeV2bId z-Z+W`>{$93jFNItXNHmpNYnUE!-7r7vMnm_Y~jizfe9sv_F2YkcAFCx`INOPGbP8& zLs8ky*ixm`fM-ircbJGOL~{(%F#^mr1m_?V$<0P21M5;$NBC$q#)-!ZH6(Ab+LSzS zv(YB21e@bS73oryDvd}|q-!!2J|5M^N_DYGUDB++a|{;UYO_TpHEPWYGA0VoTWz9i zWo5kC*wBEN$AYDfu|rn2u~LOZb@6;bwX4(V0-%(B1vJS#%p|FdNOU8OH?A0%d-_x< z&demJMZ-~zRa;_fVD?F@x5cU#%(j*zCta@^lF-Q#+p&Zq3V^!F^sE6-hg*WlQhl`8!;zj%8XDvyK{K zJi@x7z9uUHd7EX|f34Xz%su5M3#o>ZTqede55nVn>c?l2+r;vG3xiq3R)w!>50X03 z%vw&{ixI+&2?HN`eqOeG#mY6y!;xB*<%J4G3YPwAO_Gk0s8*tI5M~-04VGm^GUKXM z$CixYo#FBw(GXKPDi?!g)uE;-Rg4m&*{no6SXbZ_#<(ynB~8+j^|?@HSuc&KDT&g? z&?ifwq{0FSnt5asZPFTOeW@r09jcC5E0_UZ0niBZnh9r2Fs))*+cV8f@iMP2>{*t9 zSgUFjMrKbZtB7e@P)H6N)wpt#YLkt|l~VBBkZ7bO%aIx|BLi+q85;DYP1rsv){RM? zrPb5}B`q>mhv0)osa$qV7;tlGJM&h3D;H>F+$FUUjc1Zh%|h99>}KL2GFC8UI^VTe zgiwR%wy>vu^5V2yulmYLuy#V8xCwpH?2*~wLMgn9`_mk1ZZtNI2!i4KJc9eH6}TQU zG2cz4T-Ie>3A185SnkadoAD~yskyU4bV(x$3oHV0fS08B}(r8{nN zYcAY>uIcWgh0r6E{W!T@xUqjI$8c zEfv+hjBlZ3{J5Qx=yS&98=?$Wkwj6gLwy+=qQhHnQcU(nq)EMIK7$t;b$K~D3?;gCGU;16JogSGYN%Ek zM|NhKfTyQ!@}Ol@yuH(*KBrBfw~d$J(-D;8ktS{$E$C9zrL^|2{9w;v?3gS_Vh($py8ZYA?GWD_nE12@0Hmuyt=EUKo8qnKY2q9OL zf0K#Gf$miSr}_CYFzfLN_2~wjjlB|_LpV|Mz^-MmSE5FZEk6ae!In89PTwz5VKQ$ym3Hn3W|iR;?Nuo+8bdSd(r|)8poj{czgA( z8?Uiql&;2+?zRJbz1aS8tEEimwgZyl;kw~+vp(9b(Dvl@ot2^Kr?&hp$tB}V^k8;m zSVoVd)Fv6l2&5BCVP|Z>@6H7utY}F|F|jArTQQb`$7Y_o^r9SAPU0Sw*9XE5_1bH% z;U|7D@6XDQb3L0>4%*2t?Ns+ZFveIvSp0@$rbR(OW$%X-yI%`@^*)!b^ z0A2!9B51r3V8BS`l8G2eo1GUNg4i18G4qjh#Nzb*w>4r{ zxHVOE@JgJPvurGqJqBD)apC4ZW|eQtD0>7w4UWWj9H-85Xjfu5XTU5-gkqR(X$(7U ztH`!s!&%%(sW#ubx6uzdjD-p3e6rhYdr-QnZ0QWK(zH=!Td7v9Xrkm(xQz?H*)hWY zP9^EzcGMMdSE2=4&I=%{$<|~#d*^(zWuS&&NNF8Fn~j3@9Hlsjz`6AkLfXt|Pp+{v z2|}mc_}iUZ^Cd*#I}vhJW`q-esMThi3E(-en+9MyTDmebXRGMYG>rsUBoenk{}n1ZCBhhVjKCmFUxNXVu_G_2MJ@L<%~F7?>9 z##*_aV=`Xc&)U}Y}7Kl z2NEoUqLS^exjuKzNhrm(5__xo^r|&if7~>qo2Wm;t_Q?cuNVlbV_u@mr)5g%v(OPW z(l`*&tCSdkBB41>Jh>!d%{*|*uqE+Kdx+Yw7>J9~HqLa5gT%cjcPZ70 z4VBi?P7{UB4a{yXo0*vnuLX$>nBB&X7q4`^gN)g1HpEj9)9=h_s|BT3F;<;-QMZr6 zfGo?JEl!M!lTxKov}x^9ur{_M@_KsaxotnO|4YCH>d#tdzNdyH9} zz$*kO*sKoP!gRvdN8rh($rD#8e0w%{4|>XVcx<)WBw9kSVYIqk5sabSWqwzs?w;nK zxVS(X)3W|$yrncHf3B@B*D?`Ha$FJChm48nj|RPl4SbB(Cn~pqjuMoPw!Mw zf3}!x_(9maIU|lI$*PjfkrDQ3opgQzzlI~7rPyspRT6h39MjkL}b$*f`wOg0N6 z;}f?%w_!m_3_>3HkyTC8R47f&Fds?`Kpcp{z)@i#bnFJPXi?}gyWGZ#rJKO5gEJj(IB!w1c zi5jzsThdv~DcWNJr&j2OIkBbT6+8lPyVS!Vt-V7Y#$YSm=a zoLKcU8MY}2Gz+6bO*6bw9HDY`CRm{g=}vbN1K4(WD9D%oN=dZd~|~B zo)TS3T4w!VXj!()P;)xjouj)`8QTk`#(1enA?A?JB#9MVYO)x&)?UZ&XIVs(-X^}e zY-`QPKs7+8Bj!pPnmS1e3xsiQOfqVVOccoV+J!0RlQK0C!-|VZ%1C1+;-u($jVhX& zi9r`MNc?n?!E?5)D2ScBt|ZE8i%;8U=Dc9!t4!}23mRJKfGs~x^`b!2@xWBvw3s%V zEPf)m$Sf*38*I|#wpkO)stzZyS!A{q8F2U*Svz`;WUdxuqLrgUWwy$nM)Kiu6;0CF z>(k8>r@k0Y(FkcK_&zcaMIKfwHhC__jW^;8x1}X@K?IktUAJ-N+BLIh&%PqqoN>dk zCTNWcHZOI{g_rCML79lR!3gzOhB-#8*@2sfI^{*qIf3dTI~h?v9f3B474qBGB-)H2 zl(DAbmwfSXbyTbRW(P@C2`_u|r|;}Oy-dHwu&wA8Ij(iXeTrdm-^oTEBPFZE6N@|a zY%OFd(}<{S99o!ltmp(P1OYWk}ThI0{np&@H|Yd-INK7@BKSdjo=|yF-dww}5=uXM2$J18MEtYdmR< z<85rm^I>tkQJoyMT60|XigR=GAPzE+e0J+kHkd8{UQr0FAe|GG&2wh_=RQ<{9DZlW zZF&wn$Ftifjb&(1#Gj(D`&NT8k{f>VxAIV0vMn;TwxnBQ-O7}Vk0%ZWVX4ryeDeiN z^0qo2c=tT&vPkD$EThqmLXnSY#u$>8j<&y|`MuX>WHnMb8X;q{t(vfHfRe{&1V-UT zxMumqs}#HKCQ+T2PP=p>yye!paa)Ex@lRC8h+=fsDJw%I+HP`o7~htPg)4DBC2Yo5 zVtsS^ljq*2pLpgat&^`2OvMU1iH<}>ly<;}Z0C%ij6yFao{aR(>(t`S_Y1vAk?(Y3Cy(UIizYLCg){*F(tFnQbB!?@fyKW$e7 znuA`RI!90XeL>!9a=fwc@xc`DMG=>@h0`a=skw?;KS_#aWx6S>exH2WEs!jN!fwxU zgk3QiN?m)Z{q#|mt!mTcbBCOWX$vbe`*a*tHt_5q@i*I-X3d#{h|{9!e1>TUv?l?f)rh+M^LigNQ)9r9h$s5e1_hNW zV*gM=f8IJ}+qorEZ-4T_Op5d_zxkOw_a0Q&7cbFb!AT= zu&!GIr}Wjs&A~SOBao=usy_K^Nt=$#de>|w$AV-Y`bi=#a2_KD5ypgjwaetxHmRBe zZt>|fPU~t_=^q0tivt(APdy2}#IYTozkJEEebz_%NO@p&eWX+zIJY@cAK1tS{XXl~ zZX8%D@xeqLScVjtAI_UIch10^QwHXp9?qRR|I{-F=A1fb4haX=BPleYThh%rEu1%R z{wZ^3l5fsFtM~+FU?U=;j^|G?CQFI7M+3w?UA;P72>Wn%&b%G+xJR=qQDZS#DkDwe z#0NGK@H9U>Z_V1(%fl7=sBbjXqj2F!r8*W3*Un+47Mnw}tF@8E`)Knn?daUubM{&4 zr1yXvE%VKncQWqB5?_UAsBA zSzyW!bG^xaACeMJUgo9pFI4tNcX7Z#8O;fOMPK(?K~A|CqDqQ{++neIVt09Bw`m;D zrfP+3=`&9?tR7nBC&#sC%cJ^;T^4obId6k?q?~rdD2uZwYBZr%+6qx5Ppm={<}KAH zc4HnjEahS~zUv@}VxIcbNb~5f`L6aM8%}qkLDQdTz`zd=i)O{D;#L~r#C^E?ZBSW? zu=DI-13oxq5nz<6O;&gH2S0*+q9~^o+YVv5SFYK#lg_0NcTMcRa$*%lPy z6Zf*>tm;@~;Yw5pPhe)@*u?H&Rl(~*dQO!*8>sSOrJzy7gE+X<_sKJg1 z-Q*qN=^9a+6$C}15#fM|v}MA3_c|BhD6wMXfTfnN@sRLm$#k$X$GbNhj=*bI;PB~eOOQvT{kr(!#*e#RFq^6>6%;lm( zHMBJHSt{zj0_?oCrAUfgv$f+@t!Tr)(@7f=@#+`qn?G#>fljcjWOJ%>NmC$RrOa6& zu^PtSEu@1dSpluj(uZ~2#^fo^)H=v;4{NsTqz#GSG>Z{KM{k%egYYtsZ@Y4us8o{| zC(R=5mx_t|HeO|M93bEqqd$_$woRTF-d-JULwPY}R_x{`f-M865fZ0p08x!C4z>$e z1tGlLj|?VkY0HWHYEJdlhYWl>PQC$KB2fq^-gJnh1XEM9=XC5)K~jGZesyU()>0MC z_9i=Brv4~Ilfg%CP-F#Z3M6GDlTVl>`eL3=sOvOmul5_~XLzrx4w7T0UO76%N;=I0 z&r!s2S#GV=YQsc|ML}9}K7T5W;#ta;ij6iZj36B$#C^2L-L z6`~Bq_?(csSzgX_>UGpY#R&yDr5R+!z8A)86Ze{s(wQL1gM@(gIIn=jy5^r=wRDsok`7azjJZuai5P&;tkbHmFf`!PMJ$vY!tXtF2Bo}wAP zbp&-PxZ(ztwMa=3t)&@#hCT1`EL&JT1vO%#pc}7bEbUAd)1WK{#a4ktXqdg0Iyd6= zEa_6%C%Y-yksj5O9dS?NZ8|E5nTwE+bR*&s!pp!Fb)1Q73rZ|Ox@kGq$W##sR;3)C zC8R7wErZT7pM@J5=R?+&f@`O#I9pq7-B?)B>0nH^XcK*zagrX|p>%gr3r#XgsG1oI zOy$_tL>riIYL#ES?b8|Pg@y&G^wLh%>Usvus@{0jhq`;Nec;+2oTlP|HMI?s8gkaO z(r7GEKK4-QfIFNBj9YCqPgStQI|!pxnl=pVJFy&?Rcxc=9WKi`n#Z{p?A#dd=rAFr zyr?SGieH9(Qk(p6Vz~rEp!V3*_kN@z#t3Bs}%BN47kt>{a zzO*Bskb-kP(K!-cdC5ITi)ig(&iUhMf_FqKW$H@F*CuM@vNf|7Tt0243$(-=&^}4l z0`091GTY4@l!~G~XB#Kd#(ZkK{k?T&AcA?_hWF=|NsPB~Cbr+@Ivjq9k zr!odhr%b37-sE-lbQx<$q_Sy7Jsj7Nu_bznDmNa9e8PN<#&=Ha$Wa0*vIc1?gz~u( znrD~zq?sA{m(SK-Sw|*LOZR4{My1@FMwq3%7dv>;`OvlUq|^c;&bfusT={l(N*awf zk=z|81{AZ?qMR92WWpnnTG)pk$nZ&}u&p%WCOLzM1rWPeI?}PoLdp6izV5;hehEV_yF>C zn{ouOPU5sCnKBC*YH-Z9=2MFe+jx^4|4_WM9B-krK9x{})vnB`ROxP*Z}6tfH_tLg zoL|S=e0-|m4#kd&wp%baK9Ne}BPmv!cmUq=nPxG*EF%*iZuSu;M8U&^B)jr*ulA8$ z%Kj-wRK-eKXN4xScjuz+aU$ka=a?qhfx)_R+kNU_a-LONzvYjl)YglAW25G|cyfSwmADXTcjS$vbvwS~;gt5qrim#gO;z zP~MniY55$A<#Zd9t4@JsMNC_qZJ!+SZCmhZGi;v!2 zhNONqH1lA}0gMmYN=x-q0B+=5t?|6-labDuMk|LugsZ)nsT6Jb&7rgx2l@QT30?We zV!A1d{k^k1ca;<5tz*VIv?w+c(pR$`i4$AC7-?%Gjsd}whv84)RJ+H`SdzKhWs@d8 z49q#2P)p;(z?zK#CmbzS!W;`KUp^T2pvGM!g(i7od!Vhvx*zl0tc%Ge_V1I|O^2*8 zOgFV_QRn0f)-~v~ z4l+y2P6dXV%7{otR{Sc4f>q{pQX1-8orLtH1x#Z$PbMVdQ_#`^;}%URBql4?pO*F< zml~g{)?RE!R%)GwXhT^~UaCDIU9^3aQON0=-;eB`DYN769fFAcn4|Slu2xnm1uGM= z%qaSoJTUFb;?vA>lY`3m#zNY(y2asNt=UFw3tjtdoj1bQTQGsxxl;+hSH3mnZI}NNbNxQ&nbDB7KC>RZ>EWwS=s`Y{mFk@d#h<)R(`vO8`Qf zTYu6_8r#esfcHyjSG-n{^h_k6CuXYomJ83Sc zKy<%PJat-5l}pm5jKChE+i6d`mtg`iH>`!QZE&6u#w%y@JLemZ-6?bO#ARrs<8l;} zOI7x-G$EFquOltrrAVe|CUf^UUQ$}w$sT%IWcGEhn;hxOxYQvyH&dC=|j(L*<~?L>ZMwpa$5_z zX396=8|mzzR8(sO6=*_7OmHZ;aEj7eJH6Diaa(&e?=e7-7N|Ga4iwdqmHeibfNNhtf)5R+9BwSMO}*&6@Nzy{DGz=-f1WY+9 z&Vue(TBT(Aj1KoRZ-T4YR1l3N(nJY-)K7fpw%CbCAUt_WUQMD?Q?7LaH&!5EUj?(L z&FffZ96JPSw=vUH8Ctlqb8;=LaWE5_fuDGpW_4%gZUwSV+duRtO+yA@LP%^itw&Y~ zst|Hrd+3RArMVZ&Qax8B9m{%yNGTJEv5lyDQ_qb}U_$+!QAyo=ec;0i(q&H@3(ky@ z+Jx5=0qDcj(xVDlrevE!0@fBqQzmJ#Z#b$jZV+rJzeOBC{OqztMf2{hv5j-ijF(h) z-!mq)X2fC_BPX32S=-2h`C8jrEYSL-G;wUUNoh*o6aUg;*x_OyT*db= zXb`CF&O_|e`f2N$yyqQ<35z<;Ut182!8R#FW{f&;D}}yf~7?*>y*z;agHHFq4%c%WW$#S`L`7j9vRkg!CR?fA{s6- zJyIrt3)afSYgVLX%d3(o+9}c9i!^F0eY59Hu&>F?X7f$3QFL*oOc2)EI7kph%A1C1 z;FIUyrD?aO*Kt=Xjw2(GeU3M+Hkd%tzvpG7NgI?>fb%8^F1Amp_}5M27;OCh-d<6N zt9D~D&PI#gb{`rLVhuN?3vovEbS%kR8<}KSra|$MruO*w)(^8O4HW4dnw#MT$znT5 zP?FPqjpNlGFGb=mWtglxUHH5#*&@~QDJgC40HT}C~@$>#JzIq+VPg^o(#(poP=&|>oy_J`L@srRv3J~wtFqz-VAy9Z=ZFM zt_1mc5~e|%C^$K)IYDLSfj{w5PC|uNN-gnToS00M;L@8bO3Q;edEzf!T>+Mx4MO^D z#aag~o!8~OyV@KBCMGi$B#Mwemq4G9FiK_?Ew@eM*nElg6pfAB5FN751>|e65No_Z z>OdUinU-YbmfX3THnM(Su-%`sj(>+u`#G@_HPUfX;*0pJUT$nQI`3-GHN6i*XM<42 zmrqT@rBP;MEvEXYFg|V5Eo|03{#i;bb#0$|>Ig_ejX8;m6)9OOT3IcQ4}iJFUw*0d zdstcN+rxNwDL}L2o^x@h_+~Io?l_)_{h&Vl+DDw-Ni3fN{C|2rDD2vuaTqpJnobiBGQ>Vm^z`=Aa2~y0m=# z;pQWe@cG3{^25(_1R9%nIW@FLhm9sBTAYxJ$9Ic*e=1m7YHN$>Ph^y}b+hFEbc^=Y zS|oMf6hY;*s72#9%Gx+-$w(!fM0?illXqaYm69@v8^iW`(i9Te`kdXJW6HAZzVcH@rwT}VLIW_==K%Y_KY^foe-FV&| zb3s+Dn;~V^FIr-&L;j>y8zNICbi%4TLUoF=obJ&rxrk+=L)rm8YO!3bwxx18D?&tg z*|$cDb{odK2=b;_njs@Z#l7@29UIAmNxxr@Sx)*?HYyzH+9BAjV_~sT$S|5MNgM1$ zRv%B7ZJuLnxr?+~!v-x>n4+k-vC}OEp)@TrP0|W|cB{{1V+)I>=i=VGXU+E8ecS8} z*39_ia;Gu+y@WN2dhrJ=9m$SSBA1TSEYlI!WO7Tb&$T4p?a9cK7v(4`A4XVRYQzP0N_z>ZNgX~JN#tg}M|q&LyiEVADet%HeZAA>Qv2$=sC zp4nY(@UQJPqUWaQ*#UwFXR%2RTa*0Zvwq*Y#a!~jYR%-{`Ib|B-L&_1DMz%HhV2;N zM6FNs3_mV9d`H{m_)tXq^ps9hoH*LIQ-K^PoD?Wm0S;~H>eBKE>epyk6qSD_qQ;N; zhmc()o%y`3Mo+8;(m~T!NL7gEdF(*cxt@xa$$mp1rI=jF*}oK$^Ky{fT=TKbC#}jI zA0&$v5gteMNnmITf~QXVHM#4!iz(vHQfBgWEZ-ZHTE1;S5&!9gO}OPBCxm(l^wk>9Dg?8&kKv0 zF+hvZYAPk9gD#DMrc(knkNPx`?9@Wdq5fx^QBx=>spY8E=@d*r;}FLjB|+yn_c-R* zwa%Y@Je^_~Mj3$|bjsGBbLV}q5c2+W@ zXy+)$3wy_xo?h3gmSog26FnQPfeYIXkBEZUcNL$cYzwnLUOB1pP7DG&(()Xc8DfNvi{=>hq~Ey&S0rVo z21h4abu2X2VANF$pX7L)0k^ce!jME3GS@vD8OM=k+K6< zvU3C@h{2`0pyK*){e%(XgQflU^flM+QQCA>CYF&!&Rj`$pibs^MLTXfk&Brv-Y95W zlMCa7_R7SNhugNJ^vM>Mj@uvBWO1QqTDft!~)__CwzR3=( zq&AaLHboMra^lo*KIHsfg|wha)mS4E?3D758I`apXQs}b^XM*4%ud^E>R+d%3jCY6 zw?|M`&Z4=7^qH@l4Ik;ASE&wd6RG!+V;6rl2~p?lvxCBRg5O5f}IYGD};_ zn(8worDe8lQ+wX6N%5kXU2@bS9k@*;@zT|I_LK=0PMJc-Y-jiaVx{$9P&7DZ8$$Xs zvG;5>dUp9@QQqlnZYRhmD_1&!32Y@zY@>E@WlEehFTZFr>y4c-ixjg?bPYRH^=|Bu MRcJUckt1pU51R_G$^ZZW literal 0 HcmV?d00001 diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..3415a6b --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2142 @@ +# French translation of glib. +# Copyright (C) 2001-2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# +# Christophe Merlet , 2001-2006. +# Benoît Dejean , 2005. +# Jonathan Ernst , 2006. +# Robert-André Mauchin , 2006-2008. +# Stéphane Raimbault , 2007. +# Claude Paroz , 2007-2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 22:31+0100\n" +"Last-Translator: Claude Paroz \n" +"Language-Team: GNOME French Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Attribut « %s » inattendu pour l'élément « %s »" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "L'attribut « %s » de l'élément « %s » est introuvable" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Balise « %s » inattendue. La balise « %s » était attendue" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Balise « %s » inattendue à l'intérieur de « %s »" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Impossible de trouver un fichier de signets valide dans les répertoires de " +"données" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Un signet pour l'URI « %s » existe déjà" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Aucun signet trouvé pour l'URI « %s »" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Aucun type MIME défini dans le signet pour l'URI « %s »" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Aucun indicateur privé n'est défini dans le signet pour l'URI « %s »" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Aucun groupe n'est défini dans le signet pour l'URI « %s »" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Aucune application nommée « %s » n'a enregistré un signet pour « %s »" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "L'expansion de la ligne d'exécution « %s » avec l'URI « %s » a échoué" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" +"La conversion du jeu de caractères « %s » vers « %s » n'est pas prise en charge" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Impossible d'ouvrir le convertisseur de « %s » vers « %s »" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Séquence d'octets non valide en entrée du convertisseur" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erreur lors de la conversion : %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Séquence partielle de caractères à la fin de l'entrée" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Impossible de convertir la valeur de rechange « %s » vers le jeu de codes « %" +"s »" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"L'URI « %s » n'est pas une URI absolue utilisant le schéma de « fichier »" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "L'URI de fichier local « %s » ne peut pas inclure de caractère « # »" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI « %s » n'est pas valide" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Le nom d'hôte de l'URI « %s » n'est pas valide" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI « %s » contient des caractères d'échappements non valides" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Le chemin « %s » n'est pas un chemin absolu" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nom d'hôte non valide" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Erreur à l'ouverture du répertoire « %s » : %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Impossible d'allouer %lu octets pour lire le fichier « %s »" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Erreur de lecture du fichier « %s » : %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Le fichier « %s » est trop grand" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "La lecture depuis le fichier « %s » a échoué : %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "L'ouverture du fichier « %s » a échoué : %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"L'obtention des attributs du fichier « %s » a échoué : fstat() a échoué : %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "L'ouverture du fichier « %s » a échoué : fdopen() a échoué : %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Le renommage du fichier « %s » vers « %s » a échoué : g_rename() a échoué : %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "La création du fichier « %s » a échoué : %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"L'ouverture du fichier « %s » en écriture a échoué : fdopen() a échoué : %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" +"L'ouverture du fichier « %s » en écriture a échoué : fwrite() a échoué : %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" +"L'ouverture du fichier « %s » en écriture a échoué : fflush() a échoué : %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" +"L'ouverture du fichier « %s » en écriture a échoué : fsync() a échoué : %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "La fermeture du fichier « %s » a échoué : fclose() a échoué : %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Le fichier existant « %s » ne peut pas être supprimé : g_unlink() a échoué : %" +"s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Le modèle « %s » n'est pas valide, il ne devrait pas contenir de « %s »" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Le modèle « %s » ne contient pas XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f Kio" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Mio" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Gio" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f Tio" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f Pio" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f Eio" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "La lecture du lien symbolique « %s » a échoué : %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Liens symboliques non pris en charge" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Impossible d'ouvrir le convertisseur de « %s » vers « %s » : %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Impossible de faire une lecture brute dans g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Laisse de côté des données non converties dans le tampon de lecture" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "La canal se termine avec un caractère partiel" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Impossible de faire une lecture brute dans g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "L'ouverture du fichier « %s » a échoué : open() a échoué : %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Le mappage du fichier « %s » a échoué : mmap() a échoué : %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erreur à la ligne %d, caractère %d : " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Texte codé en UTF-8 non valide dans le nom - « %s » est non valide" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "« %s » n'est pas un nom valide " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "« %s » n'est pas un nom valide : « %c » " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erreur à la ligne %d : %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"L'analyse a échoué. « %-.*s » devrait être un nombre à l'intérieur de la " +"référence de caractère (ê par exemple) - peut-être que le nombre est " +"trop grand" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"La référence de caractère ne se termine pas avec un point-virgule ; vous " +"avez vraisemblablement utilisé une esperluette sans intention de commencer " +"une entité - échappez l'esperluette comme &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "La référence de caractère « %-.*s » ne code pas un caractère autorisé" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Entité vide « &; » vue : les entités valides sont : & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Le nom d'entité « %-.*s » n'est pas connu" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"L'entité ne se termine pas avec un point-virgule ; vous avez probablement " +"utilisé une esperluette sans l'avoir marquée comme entité - échappez " +"l'esperluette comme &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Le document doit commencer avec un élément (par ex. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"« %s » n'est pas un caractère valide suivant le caractère « < » ; il ne semble " +"pas commencer un nom d'élément" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Caractère bizarre « %s », un caractère « > » est requis pour terminer la " +"balise d'élément vide « %s »" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Caractère bizarre « %s », un caractère « = » est requis après le nom de " +"l'attribut « %s » de l'élément « %s »" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Caractère bizarre « %s », un caractère « > » ou « / » est requis pour terminer " +"la balise de début de l'élément « %s », ou optionnellement un attribut ; peut-" +"être que vous utilisez un caractère non valide dans un nom d'attribut" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Caractère bizarre « %s », un guillemet d'ouverture après le signe égal est " +"requis quand on donne une valeur pour l'attribut « %s » de l'élément « %s »" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"« %s » n'est pas un caractère valide suivant le nom l'élément de fermeture « %" +"s » ; le caractère autorisé est « > »" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "L'élément « %s » a été fermé, aucun élément est actuellement ouvert" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"L'élément « %s » a été fermé, mais l'élément actuellement ouvert est « %s »" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Le document était vide ou ne contenait que des espaces" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Le document s'est terminé de manière inattendue juste après un crochet " +"ouvrant « < »" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Le document s'est terminé de manière inattendue avec des éléments encore " +"ouverts - « %s » était le dernier élément ouvert" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Le document s'est terminé de manière inattendue, un crochet fermant pour la " +"balise <%s/> est requis" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" +"Le document s'est terminé de manière inattendue à l'intérieur d'un nom " +"d'élément" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" +"Le document s'est terminé de manière inattendue à l'intérieur d'un nom " +"d'attribut" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Le document s'est terminé de manière inattendue à l'intérieur d'une balise " +"d'ouverture d'élément." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Le document s'est terminé de manière inattendue après le signe égal suivant " +"un nom d'attribut ; aucune valeur d'attribut" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Le document s'est terminé de manière inattendue alors qu'il était à " +"l'intérieur d'une valeur d'attribut" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Le document s'est terminé de manière inattendue à l'intérieur de la balise " +"de fermeture pour l'élément « %s »" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Le document s'est terminé de manière inattendue à l'intérieur d'un " +"commentaire ou d'une instruction de traitement" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objet corrompu" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "erreur interne ou objet corrompu" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "mémoire insuffisante" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "limite de suivi arrière atteinte" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"le motif contient des éléments non pris en charge par la correspondance " +"partielle" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "erreur interne" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"les références inverses utilisées comme conditions ne sont pas prises en " +"charge par la correspondance partielle" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "limite de récursivité atteinte" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "limite d'espace de travail atteinte pour les sous-chaînes vides" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinaison de marqueurs de nouvelle ligne non valide" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "erreur inconnue" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ à la fin du motif" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c à la fin du motif" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "un caractère non reconnu suit \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"Les échappements de changement de casse (\\l, \\L, \\u, \\U) ne sont pas " +"autorisés ici" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "nombre trop grand dans le quantificateur {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "nombre trop grand dans le quantificateur {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "caractère terminaison ] manquant pour la classe de caractère" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "séquence d'échappement non valide dans la classe de caractère" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "plage déclassée dans la classe de caractère" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "rien à répéter" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "caractère non reconnu après (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "caractère non reconnu après (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "caractère non reconnu après (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" +"Les classes nommées en suivant POSIX sont uniquement prises en charge depuis " +"une classe" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr ") de terminaison manquante" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") sans ( d'ouverture" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ou (?[+-]chiffres doivent être suivis par )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "référence à un sous-motif non-existant" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr ") manquante après un commentaire" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "expression régulière trop grande" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "l'obtention de la mémoire a échoué" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "l'assertion « lookbehind » n'a pas de longueur fixe" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "nom ou nombre non conforme après (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "un groupe conditionnel contient plus de deux branches" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "une assertion est attendue après (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nom de classe POSIX inconnu" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "les éléments d'interclassement POSIX ne sont pas pris en charge" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "la valeur du caractère dans la séquence \\x{...} est trop grande" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condition (?(0) non valide" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C n'est pas autorisé dans l'assertion « lookbehind »" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "un appel récursif peut effectuer des boucles indéfiniment" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "terminaison manquante dans le nom du sous-motif" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "deux sous-motifs nommés possèdent le même nom" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "séquence \\P ou \\p non conforme" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nom de propriété inconnu après \\P ou \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "le nom du sous-motif est trop long (32 caractères maximum)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "trop de sous-motifs nommés (10 000 maximum)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "la valeur octale est plus grande que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "le groupe DEFINE contient plus d'une branche" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "la répétition d'un groupe DEFINE n'est pas autorisée" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "options NEWLINE inconsistentes" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g n'est pas suivi d'un nom accolé ou d'un nombre accolé différent de zéro" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "répétition inattendue" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "dépassement de code" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "dépassement de capacité en compilant l'espace de travail" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "un sous-motif référencé et précédemment vérifié n'a pas été trouvé" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Erreur lors de la correspondance de l'expression régulière %s : %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La bibliothèque PCRE est compilée sans la prise en charge UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"La bibliothèque PCRE est compilée sans la prise en charge des propriétés UTF-" +"8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Erreur à la compilation de l'expression régulière %s au caractère %d : %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Erreur à l'optimisation de l'expression régulière %s : %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "chiffre hexadécimal ou « } » attendu" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "chiffre hexadécimal attendu" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "« < » manquant dans la référence symbolique" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "référence symbolique non terminée" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "référence symbolique de longueur nulle" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "chiffre attendu" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "référence symbolique illégale" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "terminaison parasite « \\ »" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "séquence d'échappement inconnue" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Erreur lors de l'analyse du texte de substitution « %s » au caractère %lu : %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Le texte cité ne commence pas avec un caractère de citation" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Caractère de citation sans correspondance dans la ligne de commande ou un " +"autre texte shell rapporté" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Le texte s'est terminé juste après un caractère « \\ ». (Le texte était « %s »)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Le texte s'est terminé avant qu'un caractère de citation soit trouvé pour %" +"c. (Le texte était « %s »)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Le texte était vide (ou ne contenait que des espaces)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "La lecture des données depuis le processus fils a échoué" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"La création du tube de communication avec le processus fils a échoué (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "La lecture depuis un tube fils a échoué (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Le changement de répertoire « %s » a échoué (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "L'exécution du processus fils a échoué (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nom du programme non valide : %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Chaîne non valide dans le paramètre vecteur à %d : %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Chaîne non valide dans l'environnement : %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Répertoire de travail non valide : %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "L'exécution du programme d'aide a échoué (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Erreur inattendue dans g_io_channel_win32_poll() lors de la lecture des " +"données depuis un processus fils" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "La lecture des données depuis le processus fils a échoué (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Erreur inattendue dans select() à la lecture des données depuis un processus " +"fils (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erreur inattendue dans waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Le clonage a échoué (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "L'exécution du processus fils « %s » a échoué (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"La redirection de la sortie ou de l'entrée du processus fils a échoué (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Le clonage du processus fils a échoué (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erreur inconnue à l'exécution du processus fils « %s »" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Impossible de lire suffisamment de données depuis le tube du processus fils " +"de pid (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Caractère hors plage pour UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Séquence non valide dans l'entrée du convertisseur" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Caractère hors plage pour UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Utilisation :" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Options de l'aide :" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Affiche les options de l'aide" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Affiche toutes les options de l'aide" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Options de l'application :" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Impossible d'analyser la valeur entière « %s » pour %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "La valeur entière « %s » pour %s est hors plage" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Impossible d'analyser la valeur double « %s » pour %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "La valeur double « %s » pour %s est hors plage" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Erreur lors de l'analyse de l'option %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument manquant pour %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Option inconnue %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Impossible de trouver un fichier de clés valide dans les répertoires de " +"recherche" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "N'est pas un fichier standard" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Le fichier est vide" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Le fichier de clés contient la ligne « %s » qui n'est ni une paire de valeurs " +"de clé, ni un groupe, ni un commentaire" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nom de groupe non valide : %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Le fichier de clés ne débute pas par un groupe" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nom de clé non valide : %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" +"Le fichier de clés contient un codage de caractères non pris en charge « %s »" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Le fichier de clés n'a pas de groupe « %s »" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Le fichier de clés n'a pas de clé « %s »" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Le fichier de clés contient la clé « %s » avec la valeur « %s » qui n'est pas " +"codé en UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Le fichier de clés contient la clé « %s » avec une valeur impossible à " +"interpréter." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Le fichier de clés contient la clé « %s » avec une valeur impossible à " +"interpréter." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Le fichier de clés contient la clé « %s » dans le groupe « %s » qui a une " +"valeur impossible à interpréter." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Le fichier de clés ne contient pas de clé « %s » dans le groupe « %s »" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Le fichier de clés contient un caractère d'échappement en fin de ligne" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" +"Le fichier de clés contient une séquence d'échappement non valide « %s »" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "La valeur « %s » ne peut pas être interprétée comme un nombre." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "La valeur entière « %s » est hors plage" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"La valeur « %s » ne peut pas être interprétée comme un nombre à virgule " +"flottante." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "La valeur « %s » ne peut pas être interprétée comme un booléen." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "La valeur de comptage fournie à %s est trop grande" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Le flux est déjà fermé" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "L'opération a été annulée" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Objet non valide, non initialisé" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Séquence multi-octet incomplète en entrée" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Espace insuffisant dans la destination" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Initialisation annulable non prise en charge" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Type inconnu" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "Type de fichier %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "Type %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Fin précoce de flux inattendue" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sans nom" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Le fichier Bureau n'a pas indiqué de champ Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Impossible de trouver le terminal requis par l'application" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Impossible de créer le dossier de configuration de l'application %s pour " +"l'utilisateur : %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" +"Impossible de créer le dossier de configuration MIME %s pour l'utilisateur : " +"%s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Impossible de créer le fichier bureau %s pour l'utilisateur" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Définition personnalisée pour %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "le lecteur n'implémente pas l'éjection (« eject »)" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"le lecteur n'implémente pas l'éjection (« eject » ou « eject_with_operation »)" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "le lecteur n'implémente pas la scrutation du média (« polling »)" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "le lecteur n'implémente pas le démarrage (« start »)" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "le lecteur n'implémente pas l'arrêt (« stop »)" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Impossible de gérer la version %d du codage GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Nombre de jetons incorrect (%d) dans le codage GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Impossible de gérer la version %d du codage GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Nombre de jetons incorrect (%d) dans le codage GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Un GEmblem est attendu pour le GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Opération non prise en charge" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Le point de montage conteneur n'existe pas" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Impossible de copier par dessus un répertoire" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Impossible de copier un répertoire par dessus un autre" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Le fichier cible existe" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Impossible de copier récursivement un répertoire" + +# http://en.wikipedia.org/wiki/Splice_(system_call) +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "L'opération « splice » n'est pas prise en charge" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Erreur lors de l'opération « slice » sur le fichier : %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Impossible de copier le fichier spécial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Valeur de lien symbolique donnée non valide" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "La corbeille n'est pas prise en charge" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Les noms de fichiers ne peuvent contenir « %c »" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "le volume n'implémente pas « mount »" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Aucune application n'est enregistrée pour gérer ce fichier" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "L'énumérateur est fermé" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "L'énumérateur du fichier a une opération en cours" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "L'énumérateur du fichier est déjà fermé" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Impossible de gérer la version %d du codage GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Données d'entrée incorrectes pour GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Le flux ne prend pas en charge query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "La recherche n'est pas prise en charge sur le flux" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "La troncature n'est pas autorisée sur le flux en entrée" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "La troncature n'est pas prise en charge sur le flux" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nombre de jetons incorrect (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Aucun type pour le nom de classe %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Le type %s n'implémente pas l'interface GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Le type %s n'est pas classé" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Numéro de version incorrect : %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" +"Le type %s n'implémente pas la fonction from_tokens() de l'interface GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Impossible de gérer la version fournie du codage de l'icône" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Le flux en entrée n'implémente pas « read »" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Le flux a une opération en cours" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Espace insuffisant pour l'adresse de connecteur réseau" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Adresse de connecteur réseau non prise en charge" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Impossible de trouver le type de moniteur de répertoire local par défaut" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nom de fichier non valide : %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Impossible d'obtenir les informations du système de fichiers : %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Impossible de renommer le répertoire racine" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Erreur au renommage du fichier : %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Impossible de renommer le fichier car ce nom est déjà utilisé" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nom de fichier non valide" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Erreur à l'ouverture du fichier : %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Impossible d'ouvrir le répertoire" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Erreur à la suppression du fichier : %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Erreur à la mise à la corbeille du fichier : %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Impossible de créer le répertoire de la corbeille %s : %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Impossible de trouver le répertoire racine pour la corbeille" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Impossible de trouver ou créer le répertoire de la corbeille" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" +"Impossible de créer le fichier d'informations de mise à la corbeille : %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Impossible de mettre à la corbeille le fichier : %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Erreur à la création du répertoire : %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Le système de fichiers ne gère pas les liens symboliques" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Erreur lors de la création du lien symbolique : %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Erreur lors du déplacement du fichier : %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Impossible de déplacer un répertoire par dessus un autre" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "La création du fichier de sauvegarde a échoué" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Erreur lors de la suppression du fichier cible : %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Le déplacement entre des points de montage n'est pas pris en charge" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "La valeur d'attribut ne doit pas être « NULL »" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Type d'attribut non valide (une chaîne est attendue)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nom d'attribut étendu non valide" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Erreur lors de la définition de l'attribut étendu « %s » : %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Erreur de l'interrogation du fichier « %s » : %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codage non valide)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Erreur de l'interrogation du descripteur de fichier : %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Type d'attribut non valide (uint32 attendu)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Type d'attribut non valide (uint64 attendu)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Type d'attribut non valide (chaîne octet attendu)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Impossible de définir des permissions sur les liens symboliques" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Erreur lors de la définition des permissions : %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Erreur lors de la définition du propriétaire : %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "un lien symbolique ne doit pas être « NULL »" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Erreur lors de la définition du lien symbolique : %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Erreur lors de la définition du lien symbolique : le fichier n'est pas un " +"lien symbolique" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" +"Erreur lors de la définition de l'heure de modification ou d'accès : %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Le contexte SELinux ne doit pas être « NULL »" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erreur lors de la définition du contexte SELinux : %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux n'est pas activé sur ce système" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "La définition de l'attribut %s n'est pas prise en charge" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Erreur lors de la lecture du fichier : %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Erreur lors de la navigation à travers le fichier : %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Erreur lors de la fermeture du fichier : %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Impossible de trouver le type de moniteur de fichier local par défaut" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Erreur lors de l'écriture du fichier : %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Erreur lors de la suppression de l'ancien lien de sauvegarde : %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Erreur lors de la création de la copie de sauvegarde : %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Erreur lors du renommage du fichier temporaire : %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Erreur lors de la troncature du fichier : %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Erreur lors de l'ouverture du fichier « %s » : %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Le fichier cible est un répertoire" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Le fichier cible n'est pas un fichier standard" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Le fichier a été modifié extérieurement" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Erreur à la suppression de l'ancien fichier : %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Le type GSeekType fourni n'est pas valide" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Requête « seek » non valide" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Impossible de tronquer GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Le flux de sortie mémoire n'est pas redimensionnable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Le redimensionnement du flux de sortie mémoire a échoué" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"La quantité de mémoire nécessaire pour effectuer l'écriture est plus grande " +"que l'espace d'adressage disponible" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Positionnement demandé avant le début du flux" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Positionnement demandé après la fin du flux" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount n'implémente pas le démontage (« unmount »)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "mount n'implémente pas l'éjection (« eject »)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"mount n'implémente pas le démontage (« unmount » ou « unmount_with_operation »)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"mount n'implémente pas l'éjection (« eject » ou « eject_with_operation »)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "mount n'implémente pas le remontage (« remount »)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount n'implémente pas l'estimation du type de contenu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount n'implémente pas l'estimation du type de contenu synchrone" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Le nom d'hôte « %s » contient « [ » mais pas « ] »" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Le flux de sortie n'implémente pas « write »" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Le flux source est déjà fermé" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Erreur de résolution de « %s » : %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Erreur de résolution inverse de « %s » : %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Aucun enregistrement de service pour « %s »" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Impossible temporairement de résoudre « %s »" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Erreur de résolution de « %s »" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Connecteur réseau non valide, non initialisé" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" +"Connecteur réseau non valide, l'initialisation a échoué en raison de : %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Le connecteur réseau est déjà fermé" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "création de GSocket à partir de fd : %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Impossible de créer le connecteur réseau : %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Un protocole inconnu a été indiqué" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "impossible d'obtenir l'adresse locale : %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "impossible d'obtenir l'adresse distante : %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "impossible d'écouter : %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Erreur lors de liaison à l'adresse : %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Erreur d'acceptation de la connexion : %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Erreur de connexion : " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Connexion en cours" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Erreur de connexion : %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Impossible d'obtenir l'erreur actuelle : %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Erreur de réception de données : %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Erreur d'envoi de données : %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Erreur de fermeture du connecteur réseau : %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Attente de la condition du connecteur réseau : %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Erreur d'envoi de message : %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage n'est pas pris en en charge sur windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Erreur de réception de message : %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Erreur inconnue à la connexion" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Le processus d'écoute est déjà fermé" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Le connecteur réseau ajouté est fermé" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Impossible de gérer la version %d du codage GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 message de contrôle attendu, %d reçu(s)" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Type de données auxiliaires inattendu" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Un fd attendu, %d reçu(s)\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Le fd reçu n'est pas valide" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Erreur lors de la lecture depuis unix : %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Erreur lors de la fermeture d'unix : %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Racine du système de fichiers" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Erreur lors de l'écriture vers unix : %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Les adresses abstraites de connecteur réseau de domaine unix ne sont pas " +"prises en charge sur ce système" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "le volume n'implémente pas l'éjection (« eject »)" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"le volume n'implémente pas l'éjection (« eject » ou « eject_with_operation »)" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Impossible de trouver l'application" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Erreur lors du lancement de l'application : %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI non pris en charge" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" +"Les modifications d'association ne sont pas prises en en charge sur win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "La création d'association n'est pas prise en charge sur win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Mémoire insuffisante" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Erreur interne : %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Plus de données en entrée sont nécessaires" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Données compressées non valides" diff --git a/po/ga.gmo b/po/ga.gmo new file mode 100644 index 0000000000000000000000000000000000000000..133c0ad6166326076f1ef04b4f3ab200723aa9e0 GIT binary patch literal 10691 zcmb7|ZLA#ES;r?$h>IJyrlB;Xl$<2B<4dx)_u5Y4T>Cn)9osSW8}@ZbnuKkItbGkFA6f}y=!d8;K~xo$;X`Gp)h0#)EK#H^ANT+PAp}UFrTtI|6okY}ML+QN z`=2?pJG*!9jWfFE{`Z{ooO7P@oagPF@4WxEFL`{cl%Jyf!>yk8JK$F~@sDrEX3x75 zoCDRg?C`L|6X1JjKj-Q`DEb)uaq!dNPk^5Xe;T|BYMnoG?cWFQqW<5m{sAU?KlO(| zjei`}xD`<2a_~do%iz7>*TH+hH$c(-EBFC$%N?F~H+Vm&dG><_JPT@k0gA7e!4HC8 zbM1fP@J)yR1&Y5rx0K@^0!9B6cpvyl*Zx^h>wnete+v|Ue+z2;AA*`^%X>>cwu3)O z{U|6td{}FE~&8UQm3$2yO!}gIez!pw98z;A7ywfj3Y4~nldp!QRMn(wzjt^fC+#&2RV)gJ~Wj~2KE{3Q_9z00oto8T_$Ujt#udlTf( z`xpLcoP@3R4}y~W4*p5*%dY-3DEXZSS=ze{N?*PL!n*ew_!00=LCNu-!3V%wAQJr? zD0%M#wXbJD_5UI$J^XD@>%9(2UT?bk?J%eL?*UOMZxNI|?FVlMkASGIcLEgu&w`Tg ziy%ku{VE76-Yc&Dd!Y311}Hgw8`QdQx%zD||NUFw8I&FTkWQ_4CrTsyki+{y?dw4h z6ZH0jlJ_xC`+pYHIxm4br!Rs#z}G>^=`B#_y_H2o_b8}w9|!63GVmerbD-q(N1y?} z2QGl`LYSIw7pU`p9+ckvI;i=+0cu}=4QigZK+)fYa71^&VF+se%b>=+3L5ZlK=Jtl zQ2KW_hp+x8L9N#THSQHq{oiu+e*zb&Z^bxtt_MM_*967)uYel&2cYKvM^O5I8^r2g z0C$5v_z3t4DEs;gQ1t%+YCm_Gl8?jS!_*53%xOvZZ)zknV|2-vGt`cR}&-zo6{mZYCGs zJ3;w}qoC|917%;I0kzII!COG-ev6_np`4;TsS4j|igZis=sQozC`VOsUj+K@H(Rsc z$M}DQa-yu-^E2+ZKyvO=#Me0rN9hF=$zecgQpD?zP$bK}lv^n=MW6Nu`&OS3u;tNcjbd^g_DxqZFNyz86ZcF+@KvxOxS+DeHef4obgHRvn=1UAmf6ZlnAxMY{A! z$}tK@KKkA>`c?jT!qro73uPrjqUo}oNO(RY!uLXqxCU!SM^JViF~9K|y`;^czgjaw#6g0vMUojGsY z{9@Z2Jy_z$9G(Dk(~i4gaj75bx5YVgF)pHXP?)qICJZ+_yaWAyHxB$FP7`ygFUXg? zLw@o=!T6+Q{Bgf`ILp$^_(2dt$mk$Vk}%MiC9^Ge-AzWRvq+8KYGq-b*E)l4nyXW+ z&1lZk;Cxuj=olpNYQ5PloOG6qTejjwO(R}{EM#Y_*Ytz)gFX!RFU{(1#TolZvwCN1 zkhwix2(x^0kDaiv(`p;}rMw7xCQjOEZR)N+NPD|nP2KPQ{->DadN)i zonBD)l$bao=t8rtWrE1hz|r={UA0-NQyy*4Jg_Z)UKeS&04 z_M^VS&p7_I+erN0j3diJ*N%?#)6CBQ$^XsZM7?Z zkwQGRnGhsd_Q0se{dn(hbZ~&WXNOmMAZTeZ- z$^4$#u`QpQpz8aC2oaZ#Ng8Zpj5&AanB}8J-A=Rf(=*7DMmm$5v^}u{9nE?h==uFR zZIAkTq;i8}S_2=($#TiGTk5^Jky9d^oc5hgwb8QjiAH8>+VYsh5nL8$5TH9Xfm*UU zMcfak1w5vi)cx^MTZ$qICu7k#8q_KAWi_3V+LZyN^9k$c!u8}Ran}YSt9EygM>kKN zUrK_Tr?$&Yk;@?O+m_#FV!Tb78qBd1dPmeu3(mQ?WNR**XK7k^Poe$er0AH-z0R#1 zY3wO8Fqs~{kKk{tXc{I-3sa_O)|*#jBz#eL(+vusRa+-Z$x%dRHLYrn(!7`$dp^9h zmZ~z*HNzDUa6m5&!n_zQbrD;XV;W@!cEyu0?~k07c=pal=|$sryVeu9pr4nm@(rVw z6(rb|N3kxTm4>-8NJR`E;XGqMZv`!@9D}4DmlCz@)h^`&q>Z!aXv?jH^Fg0rT7)g{ zT;ex5LODPbne}Ta!}n=ekK-y<{hKQX+)QXh$96jH@EGN&UG*M~)h#L7Qzz%==U?!G zG|L8k#AMRuizK+-C?7t0)@ItJe`%9OqK2)w6Bi0mP%>Y86k4?B9$8g($&1MVvc&I} z8=9&b9P64T?QNr7jd!8h^agohnjwdoG)|s7e%u?>cki9fQt{h3)@nRmCEuNH+??(DC~b=#H~oVHzqe$LWpN&veH}lHyEJx^0cpWt^@(nr z7x{di4zeI5EOo;9BrNuCK5^{C;qk^7=NC2~QtFk!3)i_N>vKMexy8v|n?aEHEL*QM zrW4QYFl!uk7sVyBrx_QUPj?5I-)$U8vmO?Z^ldd?et54be=aA>%Zui5vtX9Yj%3^7 zf~ueTlqrAioTF>8>e|1&%WU6nyY?-cN7T1deRkab=ceAdu zDVL<-_15r)Nf1=jjF8~)+WNQJfa}ljN*6WjLE4hqR!#hzGaWxMJMad%A9o_}OxlTj z%)=ZB<5tuQqVDiYoGp1Lhu2Jdcr}(MXpg(N+8RIZ12VOa>2&?T zZ$+jX;<#9)6NH?x-?gSQNj<#6sg%8tn> zN(tYFgb5Nq4|Hdo*xjfd5l;35!|O4(=HZQQ!R|GE5M_e`X4ll?1TTWhww%&# zJfc#O3>Rl*Hg<`e&@Vh6c|l!|D6HAkH#cTx2ltGs|I&ceJ9KF>&pr*LRF-PkMb? zt%OIq>Ib>0UMf(HJW7LXra%iTmk346@a5W0nY3;=h|4cR&+P6^GQ4iMjbZM@mJNpu zZ^Q|wkZnvwC~4U^rMcE)dxq~?e~;XpiCv`{@}oM<_3Wi2F9v>0q7sC>Q;i}lEUhh@F=zBD4>$u2{?p zV`r-zU^0G;`QkB$S(>wad*zZQNLHedc!v|O;_*lfk|2qf?XO-|taguvRFQFN2;7ZG zxCKW%)UaI=WglV5ob8*+h@?yQ8YOJAj4VoKan$zw2%goYXgnp1mf=g!8o|_LWxzB} z;q8Nz&6*}QQ$Dgx?uEw``QUm8s5W0dv`mt_pf#~`Wj>Kllu@KCh1})|*GbU5y1e}~ zH$!pLbC!lsF;Tw2OfFCcD2&jBqw5BbAM~S)LOJP23@P7a-pL5}E>jM{6F5V) z&oW53(NoIjamR0y0rp7Gt}4?msk|e&Z8fT8A~hVR`G=fMEqN?@&bxNe zz-J`{wxnlxxfx#TmWI|O0~=oR4yfHOj(4hGPbPavqSkhH2tBAny~FN$_yxII=B@XX z^MyEm`Gb0o9aHjAdW|)m$8fSd6q2pk;LELNVgm1wjl(u6Pvd6Bjk~seJH0MLon&~W zh$M5MqkkwUUzb}6V7R^W| zx?N>gUiH`{i+7?o_)Yih)QoVQ9HYHu6W|Fugbw={<&_?dlXa0S7{t9O3B8dJF{MaP uGU({c#xhk~!;zcE46n5;hY3p1!}mxLr#*3#m`~WY`dYqKjaDB^, 2003. +# Seán de Búrca, , 2007-2009. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-08-08 01:49-0600\n" +"Last-Translator: Seán de Búrca \n" +"Language-Team: Irish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : (n%10==1 || n%10==2) ? 1 : (n%" +"10>=3 && n%10<= 6) ? 2 : ((n%10>=7 && n%10<=9) || n==10) ? 3 : 4;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Theip ar leathnú líne reatha '%s' le URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Earráid le linn cumarsáide: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Is neamhbhailí an URI '%s'" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Is neamhbhailí an t-óstainm an URI '%s'" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Óstainm neamhbhailí" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Earráid agus comhadlann '%s' á oscailt: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Tá comhad \"%s\" ró-mhór" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Theip ar léamh ó chomhad '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Theip ar oscailt comhaid '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Theip ar fháil tréithe comhaid '%s': theip fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Theip ar oscailt comhaid '%s': theip fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Theip ar athainmniú comhaid '%s' go '%s': theip g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Theip ar chruthú comhaid '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Theip ar oscailt comhaid '%s' le haghaidh scríofa: theip fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Theip ar scríobh comhaid '%s': theip fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Theip ar scríobh comhaid '%s': theip fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Theip ar scríobh comhaid '%s': theip fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Theip ar dhúnadh comhaid '%s': theip fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Níl XXXXXX ann sa teimpléad '%s'" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Theip ar léamh nasc siombalach '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Theip ar oscailt comhad '%s': theip open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Theip ar mapáil comhad '%s': theip mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Earraidh ar líne %d carachtar %d:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Téacs UTF-8-ionchódaithe neamhbhailí san ainm - níl '%s' bailí" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Earráid ar líne %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "réad truaillithe" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "earráid inmheánach nó réad truaillithe" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "cuimhne ídithe" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "earráid inmheánach" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "earráid anaithnid" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") gan ( tosaigh" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "theip ar fháil cuimhne" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Earráid agus slonn ionadaíochta %s á thiomsú ag carachtar %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "bhíothas ag súil le digit" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Theip ar léamh sonraí ó mhacphróiseas" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Theip ar léamh ó mhacphíopa (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ainm cláir neamhbhailí: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Comhadlann oibre neamhbhailí: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Theip ar rith cláir cabhrach (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Theip ar dhéanamh forc (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Earráid anaithnid agus macphróiseas \"%s\" á rith" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Úsáid:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ROGHA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Roghanna Cabhrach:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Taispeáin roghanna cabhrach" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Taispeáin gach rogha cabhrach" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Roghanna Feidhmchláir:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Earráid agus rogha %s á pharsáil" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Rogha anaithnid %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ní gnáthchomhad é" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Is folamh é an comhad" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ainm grúpa neamhbhailí: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ainm eocrach neamhbhailí: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Cineál anaithnid" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "cineál comhaid %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "cineál %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Gan ainm" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Ní thaicaítear leis na URIanna" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Earráid agus comhad á oscailt: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ainm comhaid %s neamhbhailí" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Earráid agus eolas chóras comhad á fháil: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Earráid agus comhad á athainmniú: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ainm comhaid neamhbhailí" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Earráid agus comhad á oscailt: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Earráid agus comhad á bhaint: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Earráid agus comhad á chur sa bhruscar: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ní féidir comhadlann bhruscair %s a chruthú: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ní féidir comhad eolas bruscair a chruthú: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ní féidir comhad a chur sa bhruscar: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Earráid agus comhadlann á cruthú: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Theip ar léamh nasc siombalach '%s': %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Earráid agus nasc siombalach á dhéanamh: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Earráid agus comhad á bhogadh: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Earráid agus spriocchomhad á bhaint: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Earráid agus tréith bhreisithe '%s' á shocrú: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Earráid agus staid chomhaid '%s' á fáil: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ionchódú neamhbhailí)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Earráid agus staid tuairisceora comhaid á fáil: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Earráid agus ceadanna á socrú: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Earráid agus ceadanna á socrú: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Earráid agus úinéir á shocrú: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "ní mór an nasc siombalach bheith neamh-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Earráid agus nasc siombalach á shocrú: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Earráid agus am athraithe nó rochtana á shocrú: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Earráid agus comhthéacs SELinux á shocrú: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Earráid agus comhad á léamh: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Earráid agus ag cuardach i gcomhad: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Earráid agus comhad á dhúnadh: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Earráid agus comhad á scríobh: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Earráid agus sean-nasc cúltaca á bhaint: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Earráid agus cóip cúltaca á chruthú: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Earráid agus comhad sealadach á athainmniú: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Earráid agus comhad á theascadh: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Earráid agus comhad '%s' á oscailt: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Earráid agus seanchomhad á bhaint: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Iarratas cuardaigh neamhbhailí" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Earráid agus '%s' á réiteach: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Earráid agus '%s' á réiteach aisiompaithe: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Earráid agus '%s' á réiteach" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket á chruthú ó fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ní féidir soicéad a chruthú: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Earráid agus á cheangal le seoladh: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Earráid agus ag glacadh leis an gceangal: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Earráid agus á nasc: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Earráid agus á nasc: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ní féidir earráid ar feitheamh a fháil: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Earráid agus sonraí á bhfáil: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Earráid agus sonraí á seoladh: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Earráid agus soicéad á dhúnadh: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Earráid agus teachtaireacht á seoladh: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Earráid agus teachtaireacht á fáil: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Earráid anaithnid ag am naisc" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Earráid agus unix á léamh: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Earráid agus unix á dhúnadh: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Fréamh an chóras comhad" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Earráid agus unix á scríobh: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Ní féidir feidhmchlár a aimsiú" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Earráid agus feidhmchlár á thosú: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Ní thaicaítear leis na URIanna" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "cuimhne ídithe" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "earráid inmheánach" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Óstainm neamhbhailí" + +#~ msgid "do not hide entries" +#~ msgstr "ná folaigh iontrálacha" + +#~ msgid "[FILE...]" +#~ msgstr "[COMHAD...]" diff --git a/po/gl.gmo b/po/gl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f0db81ef88ff4676f339b6d775cf6e9809cf14cc GIT binary patch literal 46548 zcmdU&cbsHpmG`e%0a1`3`7$umJ*z;8on80PX@CU;+FxcmjCNnNf5axEY)e)%9J4_pm? z1w0Nser^=)0EfY2z~_StzA z@MqxJ;1dU;=qzv@sCrxAQt)4u-t$>2h89Y~X-I!F_uyFo}9{dvIeg8Uaf>M7pNv%r}9%fVG(9ee}$0Z{GTMk7Vn zYr*BMz_4ljbO7MTcbHEE0MbQSZ0lpl35RAdiWEMTA zz*E6nK=JKcK=t<%p!)H(aQ{p2Xzm|NW0mhDQ27>t%C{NRI8?yX!54y}*E>O_`#g9o z_+wC0;oY*LO_K)o-4YR`?J%DE>z|0t;Xz6@&o{{>`-qrs;_Tkr}{^XY}4(tR@EH^B?J ze+XnMN9Ua9^W+(z+VO0VsT92qRC%8QMTcL3;*X;#RQ=crD*p|j_~%|w{rW8UB=Fau z+WR;f$Ioa1D84R*`LLl&L3!rQwIRQY>B zwdWp?CPves>icg{?K<}Y@5fG1^}IOTe*`>^`yYYI|65Sy&4)OT2QLNH@2fzydms1& z@Q*;z<$h4P5Y~uJyx7P03UD6xdq9=@dQkO#6+8j_S5Wjng3f9D&IOMGH-H-F zt3mbSCQ$u+Be)6tDfnJ+`37jBdr<8gf12Y>;9Txs4T^6c1Vx93z^8y`Ug~mqGpPGp zKtyx&UQqMv+o1aOZ{PxO9+k)7R#4?OK+)$OQ1tl_cr5sJQ0@OYD1La@MsNR#p!j7O zDEe&%WAHjq>Fxwo-n&52;d7wq^bJty9|F$=pG@b)PZxlyw+ce?=;h!t@N3`@_@vD~ z9;-mnr3o^{quaq4{2Vv{{uosHqqg`stOQkV85A9E2UYKzz!>~AxDxyUI1J9a+~>s( zQ0=aO;^&({wfnW8>Uj_pe|;ZRz7w`OA6^13;{G~Nbbd3a@%~Ftbom*m@p;TP=cgqg zO^z-HnF7(hpxXO=Q28FqWD&m&f~tQrsQlM~D(`jRQQ!x`Q^C)IM}R*7Ro<__$AC}W z;q+e#KAQVyfNEy}RQvA)mx7-FMZaHzF?hz)z5i>$!?}MJ_$06bs$I_kj{)Bf!dlVC zK#lujukd!x1(~wZ7Et5=Dp2G0UQqS_6ns2*%9YNa3&1CGe+{VqSHT#338;GB1FHN_ zfk%Sh0VQXC0iFXMd6kd*T2RlcpwizCD*rn`wd2n~(evx!{=Yz_JMI}??ov?Wuo@J< zl)&S`+d$F(&EO#TB~bkF5UBJ=U+v|d11kL$;IUv0lw7z4)O>pnsQ&#ecs}@RQ0+Nu zr{m?I87RK^OYq6y!*_YRP6EZ>SAn9#Euh-fq=MT!%Rs#!2k&}V6x|A{{ilpN zzb^~8I^fd+ZVmX1fFq#z`Py**Y>=v=TfuSghu{Rbx#;x#Q}A@|zXF~OJ_H^OE+{#D zF9f%9Uj)^^kAOAs>!A9-VT`#57Qn^eJ>XpM3!v!v%kcgbDi^=(0L5=NfvAM&oggA4 z`ZsU|crlGbG)K<|F9!bxoClszcKv!0xQ6=|fy)0Sa2D1P}Z zD1KYA+uKzE7jl0$cm?=rQ29=&_`KT=uIBzW@G0Pzz%#*r2M3jI()nsVsQRnm8^8~M zqW`w4(_tK3$^9MRa_~!_==3;4za22?u9z~EoYJxO5`UbcRyrkiDz8O@1KMt-1e*>x?E1FUCOz?T& zZQysn`Cz5xa^@~@nEUqy{5H6N`zO#?rCSba{7YaAz8KUv{0VqA_*dXU@R56+-xq`H zx!(e++*gB2_Zd)h|1VH{H*cTIyY=8=?ym;V0`CBo?m);Dxm0l zC#ZA}fJ*lR@M+*N2fW^0;8VGOC8+mb1kVNk6V&)GzTTfd9hAI(KB)eD5EP$&7gT#5 zcZ1h|HmLD`Cb$`V1Gp6Y8K{2DxzYJzJ9s7cF9TKYk3qdZ{@KpA8$j{#&7kW05U6&4 z58Mb2-{j@o0A9}hpMs+2VbAe)oDVAfD5(Cw8&o-e51tP`=DFU_RiOBOAE^F)6x;^> z6jZv4p67Hr0P6ldp!nyC0df?L2-p6}&W!ByP95fpvC1O731 z`YoRS^WX~ZAAYO%ZzZ^#`#V7K$6tV||9?T%bKVQQ{1<>K_iNx<@WdCoyx0Zm{*S;j zz#oC9Y=eGWRu5P>F)J((HQ?WaN`LC@UjFugF9ucaCqdO8-Qn~-6+E5Wb>NxcIH>ox z2YhG1&w&eg{sS-ukA8{Ix22%w%~nu!e;%lGp9IBUKLb_%=`Z#BHQ+q%_kg17>p|uF zM{pE8?Pcxf!_m_{zc1S8eH%ypI22-^nDYk@%R>~ zde6Me$LSJq2lrE;%KHp>IQVT)_5U>B$*;z?oWuPU;K|?tP~-dRfFA*m5>Rw_C%72=5_l2#TW}kA(VJav zz7mxD{{g6WpZZ76&)0xz*PB80`-|WZ_#faPIPezd&n@6e?(YRp2fqV~evf#o_h$j9 zeilHD=L^A8z>k8*gI@>LuU~>kfhWJs?UP~fvE1JZ&H-NvJ`#LCcsclCQ1pG=+nvwX zf}-mSK-K>VQ0@6Kcm#O(AG;m@WKi`DgW`j$z+K=JsQ&&ncpmtl;8t+yJG}k3f>&~X zA82%cr}Oz5a1qaUf=7aPfTGvyK+)?jK=t=G;F;jD@A7(=fpfXP99#wN1vTCu0j=HP z{o#M&^)CiRhbuv~^LkL@{Z>%?@Ja9p@Vnrt;Lky|>&W{&-AYjWwG-4h+zCDf{4^*& z{spM=2j1=c{WS0d?stPK=N3@uKLo1$?||#U=sn)Pi@`Ivt%8?;cY@2oZ-DE-VrO>mw@WewV>MbC*Z@t0$1|)*Wt&p;9Oq5f@@27b`HOnBnbmj zMDznLreySb-rpOZzlh&Q^ZNlV@v_==DbH>OAL1J2dMfv@i2Xf--~WeS7lHo(-UwdL z^>u%3q$ z23C!pz`N&jZRGlM-E)1MYZ>>Ne+5u~=YoIZKch$U`v|UExIZ8KdvFB&F8Gfjjo|S- z`wQ?It|@-sq=)=f`F$j~3rzl=6@J_p@Kqoz8(l-1uYs3<&jC;2dJ?~X1zyheRWAMA z<`6xKcQ518pXSfe{JxXx@%*0PdM?)!!~1{Z_Z?ix-*x2wnYY*4+!n2F@kiRutihK>o|U2&m~!y{JotY zpW`a={s!>nTu$g?pJ`zx%O~< zh3DVqTF>ty_W%PZRWaw>o;7|8)ICL z;?m!fxGp5^$szq^+%F2hU(D}MaJ`62e?Q~8g?DFiO>o`CRpZ%JTyN&m-#>Hx+^ocy z?vLSm7r*s)6xS6YjXmIhXLCI|+`OE33%G9Mx|!=ro}b9|(ePeySor-I-j8y9p8GSy zvlF@B8h*bMd?MGwx$5EBrvnNqq^*Yg7x4QLT>ASbu4A}9#dSK@H@WmT#C0y$YeTx{ zfG^~JJ=bHn9?AU);Gc4pxK7~yHQ=kccJTWSu8;8h3a$fOWiI`_iR)urTX=sJ*R}lK z&GkQAH*miI+{U$^-~R>b?^XPs!s=_zTptP8@!!or-u8#1?O|E=Gw;dFM=Dn^!G*wv#YP>-TS#eiR)~BZ{|w= z-VlD2c{a`OQ^DtfEA%`bELZmwD&=Bas*cu*x7?hlwVH8ls#F!F2cuQ-NUgSevQXbm;(EMe>jrBr4Xu|7#r<(< zU%An2M5{&`O^s9Bs+RY~#oAput=^>0T9q!-y~h4V zvosm4Di(Pd^6+?6bSg%xCTlH*u{IV@mL_ZU{c*i?U8`ItX|onj)oY^^ZKT^jf zSEW!NhhLf#a6w^Dpn_Rfjh1xa_iMbzyXO zYszLroYp!kW8 z@m=NGE+%=kTB_{Q!(EkfwX_R9gEK>eW|65`+f`y1oRVYZYBA2WJUph7A}pc_sG+Wu z;Vy{W5O?TdnGUA1u02nZY%csf7GJz>5?-4;l(ePdhFO=s9;TRm>g^Lqz@DW~!YCOB z^=2rEfGkbuG%VPHEPG0o{T*DHCNQBS(Z0}_&2HO-MSIG6jhWKM%%i1>&)9Oc+=OS# z2YO6I6{0x?=@}ab7M#y);&;qqQZr zhK8SlzAe^*U^ZQjob+BbC81Ll+p~ls27tQB^fJXk)<$WPxl*ZBm&cPeR7|D3TdcCb z){>lI>e0nXsMcV@Wu>QTM?|m6o{(&BG$Dm)@@li(+#e6crN(GsiWa6N6dLh7?v_Vu zYDkGulh;rYtuQW)qsL7YkqUGzl66*UOYf8UJ65kv=311njv8V-f?iQyQ%ykLR>k`- zoo&NBx6(q9YADHNVodWOo-?;GCzsqNR^VG0%qq4jLRE*5)I~G8oVFKB2sb7Sd>Ht7 z?Yi|FHm!@t>owF16^az7{#spfP(iJi$JLb7Xk+M8RVb;j9D?Q^*+iSM z23lV(ia|$flhz7mKrjF_!n|g}857K^n9lahGE<`F)rCXLGL%?V&BFNbY_f`&W(CFM zuu)AaH>oz$Xk04;&xb@KEm@A#fEgKZGs>`_XKcdW39)WM@;t2$K2WkE6LSbYXqGD# zZ^DqzrM=8s^{rB%kx7@-Ml7BgI<*jE)7j0$L&;ddjOq5SB_f0xM7I@l8)sdZl^aZ7 ztrD!AkSA%vU}<=KI9?%x_rm#E4mGzlIfV#<;lezE`)gIW9x^fC&7@r0N3Xw0%VkN7NWYNqDGMM9kfgycT*C3 z&bWNry35Md);<&CrG3p@YmyW^b?YXxRyw#TNjZt@YbvNP8NJUtDQ2OXml z);m4wb87;-ZK@2Pj$<5;w{X))q03O0(K;9P!+MUzj>&>l?s?Y9LeoW1&z!lod2-F@ z$?}1|Rdr=ZL_xhYRlz@G=4BIBFylRISf!QEiNi@XV7GS=LawOrCKCf%ap<9qmskoW zOqLM1;%vf}kb>j8T2)Qv!TGFe8CxES7>VgqNSzEa^Mk{|m-!))Dp_nCUawW~nweBt z7>~1jnOn@Ik^Mhbbj!nE9u}>)8r3C6Ld#5kwTs+%aBgFMKAl-$X{VOOW2Rx-Tc0ad zYK(ftwCTL+dOcNUou~fE)Q5!f)X^(5*x&=CUgG)dXibU5ikx!oiL?UiYaJ=CIRs@8oq!RlKmYkYJfZs5X( zLnaD1xkfN^SuvX1J6+A>*7=z~WN_XYOO~F!+?QGV@G4YF^YJ+_>=T74U$2Bxw7jpm zmpM1AQvR{@k+10626L9lI=RA%ELCf*@rmw|vDtNxhez4%rY9HrD zKB*kE(Z$@bx7~YR;5{%Cyiz5buDvO(h1`$l8L)~xXpPfUsYKdO=*jBNz=!9 z+rAd>k*sa4uJ`pS&e)O+S(_po!p7&t+ptZyvw4|r7*MINrsb49&vyXu5||M|5^F{JooG#3A+X*TT`av z_Bl8R~Ld)U{aP5NFlw&w#`K?#lBr>SIZqcRaVElsz(#IA5>s@ll4I4u|2 zSfqOlxSo>2&3%lP@5-q42zDAAiSIZ`o#)WL#BgW8LP&&Rm~Cl{xwTbfTd?UX?zB{! zZ~faCh8)IX3Fki9J+?h4TUBf69I>*rrRtt?y;jvkX;0xB7h$twoc*0@+P}S+E8?!y z3bdS;LRgcn>2wax`E<)b4PhZAJ%BY^in?=@lOO_j>!*aYnbDnGV`&nEPW$-Vo$GuF zQTR@ToX|4D#UExh9AB!#h&ZW-d$b`fG%Lm;5B?AZ{eJC{57kS^brVr9acLr^M{h)E zr;&FjBrn8tbI1#uDwON21+*uy(EXX_OYc!wtD0_hxHJU%ILDvSkv~uaaQ@JV30g2%#(PgZ|a5bAVutS}0 zEL5<>*)%1Ow2Yf`T4qVnYUee|lAysyCiAxhQOR7^JtIUSa^(Dl@=&mL7wr|h!F07vcQwv}KqO2$v)K4b3Oi5d zv$sd37*|qXt|5e8m?@twz<6y8%7z3>DTXPRIE!mh6Q=6rJ+?-zuzMiEG9oJ3{+jo> zZ%#rf_LSLM#iv)Rd;Lk%jBcX-D7zjITfJf+sE&DwEuWPsqt8M|)JWq%M6Xh^02B$$ zaT3TS5o^l>H-;@ycw(CpMgmtpNdQcD8dZZv(=IfQ7(SEDZ_TRxxs4Y>uPzu!HkR79 z^L&h$4aqKq_55IkU6_mG(h5Kt!}buhVKI~xrEQ$q76*w3&gxUDiw%|5(M}VE?gnNz zm(9%FhS&0R4Vd4?PLx-s?;vA7n+@?nh#7X~wAF&qs~D@^yQq67U_jKeW{Zn)aZ+Y9 ziZ-2HiZ&GB(tZju8ZCSH*9SWUoMBKm3Y4_lcR*%ZBHpEky&O;Q*Yk3;Ytc86vR9~ffHs?)Gf=gq0GStr6uP zskF>$?tCT6b%^urtm0w!pzRV)3kG(4rTs76Q?pD!jKeh?4r%!%U} zvZ^F=WWv`;Zru-Nb5_HoEBqX@>v*}khtr)4GU6Y1oFs_ ztZG_jLTPHwk=mUTH%1j%XL@?UB@t=Sv)CWowUyH`p|&Ss zYgT9oNJbF2O&r8QTcT714Bgox3ZFi)Tz@lvtHztnEr0#lWTV0yP7;7`6kYbjou{Ci=I*U2QdMx17 zihY>VwKTkfM*wb@c^GB2_sC*W1Hi)hl@)Hj!Jtt~Pz4Y28mxsrvZ zPLjd`Vcd;LMs1Oa0&TtaFva$yOijeF;$qS=vRH{EDYjm-hNWg=(1QkvpH4Fb&NhvL z*lD+wL|JX|Y5UBa7mR$3>0L*mVU-S<`f<~X0?oz)GjY?gwAo?t6VcOcMI~p0O`5iC z)^ugnfRorPvb7Z%aQGNmdwPzvTrFscRw)&#!zzCk$;T=+EJW9h_2qeW&4KBn}&ynuZec%+;Hdw>8NPu8dn!VvNHq~ zBHl(yn8#X}vxv2I;Lg!rd69E2P(8Af5#`enXhT>bzfC96W)?!Z)l~A5FCGq*>b219 zD6J~x<*@u2Tsf$h*|!+B72P4nr8oRj42%0tH}V)Mtx5v1xWmqtBFmUYL}la9!mJZR zCsH8@s8REERtO%D8>N7vFGiyUf>dlfTtni<1>T;Wm4)%n%eY!xJLabqDI8dz@W92T zC|e%7@`czt_g&A>+?cI5AZWHbq_}kp$cKIQMrl8g*6v>8NoO2yb1$9`i{mXd$WgDi zrnFvhH#ZNGAOp!~*FX7Sw)XdmLO_G`PEaw=nem^0r~)~{&X8|<;#94>C~0l(?X zKbp~lfJq8wqJ^SMudvaP<_uCly`Hriy) z1p(YZkjhF99|-PT`qZaJVb?dzaP1->PMH-+xSICBJjk1!q&;PNP}z@0C=p3tL`{TG zYVhskm;#mK9{~F2I-!cRg`Hf6%UEAlq14)yPk4?1WqrtJK_<Tq=iQ_{D5^P_>bPFk{f z(ZWTG5OGqP?la6fpgjo)twuEDpV#}Sl`RIGL_E=#HW;W>k@$yF`t#O}ZFfs%-v0E3 zEh)0Q_RY`qdGMfmUxGwS1Sg5K!!TYY3?}F0NUf)Xyv( zsVAYAIJSo;`6{JUKWuABpD7P*Y>bzSL#tckjiK#q(I2*D^Y)=N5+F>~p|!}7W$}_l zix&+oS~|4k+<5WgWoMr^wCL(_@oH_dbkX?Y#ns_zsd?dH+P2HOxOjNcVQXA&56Q){%)EGK;dm_bJ%}bL+hZ5l z26L89twYESt;0sq+Id-g-blHbHbI0tY)geNhbu$t(eZdns#A8`xL^s}C-(D#!D@W^ z1@Yqf%MZJ9=wfZadUr2fT^PZ&uy}a!;^DIo<7@#{p|I-F^7Q@0%^(r?Oy7%@QaJQO z2Abt5!dDe-im)c~K|5~t47AmrN}qm5+(OtF>eKhyIRjps@-?PvNV8(wTkH>gxW-3@ zGSra+5WTJfM0M2_92d1isGz2JE&s-oy^GwT18F^scib>l>1w1J%qLX{ zJdtBLmnNO^tPe;)-`MRLXo7b=L)1qysP0n z0+c*O$+KNA9Z=1QvroS`q=4b8Q4A**r~-AZp^;5Gj?$r3k|R|4GA(=rs~&rtoj-sgSXGc;4M;Z}us3 z4TA7?T0(cBv|p2uNzyE!3pL8n%1=%3j#-d|xxLvpXtC|$aa~>AI(SKKgQ}WBd5I^w zUy*sbI)l|{1-Udzp^UDc$>lCFHc?=`Hriw`U<14g8hY(L&v+I?XG;#buy960XE}ip zjpP}BceNdpuRLW@5rl3@l}m468sN9oq~pJKmBIr)Qm=ONTF-*!Dt@uE1oj{Nq=(rx zX67<*Q_!5>ucY;O)h#}$lZJ=Xr|s#95#6n^*sA=L3$qX@oXyOxY=~_3PV(8hl5o0- zW_UggBGb>AzyN27*_DO(aMYk>O1NFREBPJoOLW9cIkQ%CqQdlj2P`e(&&9t!E_Us% z11NlMBi)IWn7&uCx0B9{AiSq#C2NoxGmQz$CSiRaOpFe2YoiArDVB~0%KV4y;jury(VA60y+ zmGXGu08>j}_D_yX-!FaBU9o=yM#S7k3(wz>JMv<))FZ1#{1)s=pc?X47fsRuH5}EE z*kNPS_alWMqdC9SdDow^O?Bu+XTn;qgy*3QleHPcAbFkUOFkB^Lc2sl$f(Ftq?W)8 zr6{-eXhg${`GAd%(B$`IVWA>nMnqC$GCXyLE zw<^*zFlzBURRARCU$Eep+@l~FMH8}Cye0IRZNp|^pXn+y=+tI+5F|`rFdIkhPbDZk z%xB5cd_ zt?eK=%vrtGj>d4(GNjmeHm4Bl$wW|WV2iavaC}gIbNU@n(u^{!ZPa4DU>0E716r2T zu13+Y`Gt>$**eO=)a>vKMxq!F&Zvd+UPwWxF6rxqqRTjX8kQTFH&766W_edJQ&85C zRPOYvpY1`SrI8yi7xCI*13MVVm- zRgB^(meMu_+Z3Zz3?v_A&5Th4krPpr^bE4vIarKp_$E*8g!XkkuEHXcP-7>~BE%#v z@Slzjf!j>$2kmR>rgw4}N;HQ%8R_7Wm?61|6j^DecVEpSB}tb57abcsJh^W+~;pEJ|k60Z}*Il~0!io^hvOpKHn%BqdX7#H`j6r9Z5 z4#AnDCMBfx$gbY~NIZOucjjS{AF+3G?*WVGU@V)htW#0^$dBHcbR1vTP+O;~DoIj^ z6=Y_Xre~#Km#6P%AVv2g%!J7-awHTw)bukIoh)cjm+rsnPt6XaQ4(;5l9d{xHEHv~ zQfe}XlX!X$3yaY52&-3OsA@B@NRqA~t=+)Ro}uQFcK2i+&#Iki>KsFvGoo`&5pdIl z;|{H2&*c88-V{jd&ss}Z3Grj*XY4<2J=W(lG_6N!%w&sNuFROtLYUbxan0CMNFN#p zvAJt&_;4f*{B#hO8)>n9Cr{^WxK3YRlK5ck6q2=blSu;^Bf0gt1ffE(YjFtgpMhBI z8I#q6%0m~)lRZ;Mkuu3yH(@SikfGX0atwHb#ByClouhxaJF zIH&Ap=(6h}il~(Lu?CzCPbco4StZ6k=lmaf4kO#aKjyJWq7raW!$R#^uCJcW^E0Kf z!GcZht~LZ@&(de;xWcSBE~tOYX2_fKwE1L|t)t!Oax<)+=jimA_O69|oV6 ze<pU$2(Pg003;CbQ>lk+yj=yh%Zv^j_T04O{3NwFO&97*EA3Y5;KQrMp7rFn+? z2_jpFXwe|CMq)WW^3(Wt&F9m9y~#U@O*U%z*=WHSWqOQv-t5azGj>|gPj0wLipX}0 zw`^EDqcE{9SmS#aG1J`1@@7^+;P)skE@JG-%#X8W}ZcSUv zzjJSCA1*f=XJTLS?z((N?ftez<>Z>-FM_8x+AM=phh;GqX}xltDzr;mf=nl^0698~ z$RCdZ%BNL!+jW&)n?=*~-74M6cpnfm_9}}i`W>=`%Q18)3CN;#$x&Nb3=pfXeXU|) z86~-svt}Qk8p~Q|w4^%bIR=@iZ~5@0dIwC&fn?w}Xb&@JTNh}=Z(VniJJ z5e~EH+ZyBVwssN9B1)KBA~~7J=2W2B-m6R9VB4l2d;2aaFyNoQRIhH$e&LQ~SqAq_Y&&VokwSFPWG`Hnx`_ z6E!DlLjhR>LX5)<`Mo@|M(_cbnY_FykJeIV5{3^odUr1J)}v@5Fe8` zoU%yA=?93fWBO@(57E?_L9;yjDq7MoQR=BAO@lc9U_~XdoS{J4kl0H7+8Gp0YDaag z3XIt3wcI+wLl9SmlOJogR7FlhV55@hHPbQ9Z3+OR8AfA*RTR->MsElUi#D+}P5?$z z@faTR6h^}$wDN%jW@K21vwwRA*%|u2QTUr+lYI7U3zgpJ#2l7qtj!d=Pn;?%Y}Cm zh@O1}ZtiZfriy@K6Ou5)6N|GdR!LQ-v5h$xj5Tb>BP)TBCBE{F6wH{cXcG>=?A5mn zg%Li?4@3cxKe&wxz83 zP}Ek+87Yrc%AA!jT8QmTJUE27FFK|zE{s9V0^RXV&Im!j_E8WbNS-M6I(6Hyv+{nA zqA+dFiDmi6!(r9E?Yu$bmu;vx8%OS3!IU21~0kY{Z^UL2slB8bdoWIsd6; zi7qi=gFCg&j?FlPkx~q|HegblIMF1@0(%rQz+|6M$E*w*nDB$n&VyVb(h3sk`>6K) z%h+~>Qf1HSZVImzIC_TA0)xqBNzUg> z%5}S!5zNiecAuZmP#R_wQ#_>@I#~j?eVJfpQ;zYeBw3cB>0m9sb+6^V6lr_!FI~N5 z+E4w+%J4MmQg1c5SwRyemY61@lukUPrDQnDuR8$+1qth3f^=`gxX+_eqV-5E*uQ{6 zr5iHJb&?DnJ zenwBqHQ_^JjsTp#&y=7J0nEy0*Be!u<1**Q=0 z>q7gzBICvOm0RD;w(8C@^h%vd8CPnXQNs+p8ljJWU1jUr({lI6P02ogF3wingnH>0 zR7sLdYN*u~P!moN?46@CP?cr0f^cj$Lfs&CY_Zr`Kv>!^musmPI2;t1h8ECD_(EuL$ts@R)H}@Qi8AGU6C7(#!+)h6LN=G@d<9vCy-rb6< zhRrNZlPCTV3#)I{YxYmQF-dG^K{Fb|v+aA`w$l#_Fr(ZwGi^_YU6g!*>G6l{`4Rg) zc2;}j?>PE!U9u=@r-b%F-0BQV+aeTB2(`Qujd-i@jqV=pZ3*yuw`;+hSB~Wu|3Z}7D?Wmn=!3a6o?9@ap z=d%_hyFa-nYm%jsB$O@mWZoeb-ERpa>r5dXfrJce$-m%sYGPn(R*rb+(e6Sp6TPd%%ttNq=iIpn zWg}WRfe{CGrwlx3)@tJ7t8i8~v-fu|VmMkgUZ@w%JV5$jixTOV`@SGMO?FeLGh3{P z{5hwjj%r-9Vfq#6S&fqPwwWNA(5%aL*0ASPE{8WVa4g_hYT3uQ*#T^kPHgN^!cGo~ zq!6qw7O3HX4Y_8;hGwO}!0tviF4EJ)eaRXH%8Ey0J_#l|GdI+U6Ctu06+Y*(_i5|I z+kS=$5n&wS1|wLIo)|)=g-&>MXRP&7%}BS>@j<9ve#9djpM~(SxM2V#v|)Q=4HEJV zz0;$eUi3uVqdz zv0%o7DL;|=Ac;{@oDSPNwd5WvV*iJ=WD&?Uh=sS!_ZH2W-6ZOTK?w&-wsTq%n-y8$ zt2tQIqMRv-V%W#Y5OyNO>{3aLW~m(!obMbQ@H%;t^+(@!B~FR{DWnN8 zRE?)26jAQ`vovJNhbD_2>P;QaAx#gg?3k(v0rN>j0FJDTvgw9=OFs9HIc0+5E2Gr2 zkepK~36~sRS!zTjeXwOBxms(xG4k36Bq_%+fptJ-CI%9h9MJKuy=A6u8L1r3#^JbwMfUXkCpcoqO2mF z%GT0xmc9`sL%wb2DoUiOX=t3L{Wq-Igr#rj=)6m$LeJsgfKss>lXE`ol72o8MX{o6 zchVEo>^)tP7r-eUvKHDN#@DzNjKs9PgEks@Q5_jr`1v}Qpe8%}&{US6b=ff&=deDm z7fN+RDywGNhli;nNq)MDrYyR1bCGe+O~x6EnIo}dRp@Zco^{QEU}>7ZEvm(7x?*ik z?=~d`kzl5-v4dRKC;iUoNIF~oio`S!<8$_T*{Z9Ka*(D4Hg=YR6ff9*pbjfUdZyf$ zt?xq=D`PhrPSW%L7Su9hG!Rk(*C^0`_6Geq8#IR7{fE}!v-wFyk zEBOREJ=_Ye@K6k+g}KjN?1?*2y1~wbAM#9=n-S8Wm<>8;gP(Rnr>~JB6G7Ja&>uH` z%_ivPa6I))@h*das2!cmxyM}iQDOkG<*Zp5j;TRks`a+2Wjc%^}D^#t=ZH9nHHt-E`?6|Zh8 zTHM~UKBP@tylB`?^yFNe_N2`cAANHWIh&D8b?Z4pp;_T`FkK54@*|YfcH&;6pY}>2 zx;DHRW#b&*G=Zm+)nmaGUG7OOrzFT1v{5dB2GYxfdBdiV1bI@VEW1=CBx)u~)fPR{ z(K9_$53ZbTx)rlcxMg+;cQW|l7|$8R`>YbVyv?bAc5|#>Jq);HzC>!T8O;i}TlSdu e2R^fCO#a0;I}8HzI5%~3jKOGT=71JP(f, 2001, 2005. +# Ignacio Casal Quinteiro , 2005, 2006. +# Ignacio Casal Quinteiro , 2007. +# Ignacio Casal Quinteiro , 2008. +# Mancomún - Centro de Referencia e Servizos de Software Libre , 2009. +# Suso Baleato ,2009. +# Antón Méixome , 2009. +# Fran Diéguez , 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-09 09:51+0100\n" +"Last-Translator: Fran Diéguez \n" +"Language-Team: Galician \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: gl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: KBabel 1.11.4\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo '%s' inesperado para o elemento '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Non se encontrou o atributo '%s' do elemento '%s'" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta '%s' inesperada, esperábase a etiqueta '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta '%s' inesperada dentro de '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Non foi posíbel localizar un ficheiro de marcadores válido nos directorios " +"de datos" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Xa existe un marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Non se encontrou ningún marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Non hai ningún tipo MIME definido no marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Non se definiu ningún parámetro privado no marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Non existe ningún grupo definido no marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Ningún aplicativo denominado '%s' rexistrou un marcador para '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Produciuse un fallo ao expandir a liña executábel '%s' co URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Non se asiste conversión do conxunto de caracteres '%s' a '%s'" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Non foi posíbel abrir o conversor de '%s' a '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "A secuencia de bytes non é válida na entrada da conversión" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erro durante a conversión: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Hai unha secuencia de carácter parcial ao final da entrada" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Non é posíbel converter o modo de emerxencia '%s' na codificación de " +"caracteres '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "O URI '%s' non é un URI absoluto usando o esquema \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "O URI do ficheiro local '%s' non pode incluír un '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "O URI '%s' non é válido" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "O nome de host do URI '%s' non é válido" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "O URI '%s' contén caracteres de escape non válidos" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "O nome de camiño '%s' non é un camiño absoluto" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "O nome do host non é válido" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Produciuse un erro ao abrir o directorio '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Non foi posíbel asignar %lu bytes para ler o ficheiro \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Produciuse un erro ao ler o ficheiro '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "O ficheiro \"%s\" é demasiado grande" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Produciuse un fallo ao ler desde o ficheiro '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Produciuse un fallo ao abrir o ficheiro '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Produciuse un fallo ao obter os atributos do ficheiro '%s': fstat() fallou: %" +"s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Produciuse un fallo ao abrir o ficheiro '%s': fdopen() fallou: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Produciuse un fallo ao renomear o ficheiro '%s' como '%s': g_rename() " +"fallou: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Produciuse un fallo ao crear o ficheiro '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Produciuse un fallo ao abrir o ficheiro '%s' para escritura: fdopen() " +"fallou: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Produciuse un fallo ao escribir o ficheiro '%s': fwrite() fallou: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Produciuse un fallo ao escribir o ficheiro '%s': fflush() fallou: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Produciuse un fallo ao escribir o ficheiro '%s': fsync() fallou: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Produciuse un fallo ao pechar o ficheiro '%s': fclose() fallou: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Non foi posíbel eliminar o ficheiro existente '%s': g_unlink() fallou: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "O modelo '%s' non é válido, non debería conter '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "O modelo '%s' non contén XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Produciuse un fallo ao ler a ligazón simbólica '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "As ligazóns simbólicas non se admiten" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Non foi posíbel abrir o conversor de '%s' a '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Non é posíbel facer unha lectura en bruto en g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Datos restantes non convertidos no búfer de lectura" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "O canal remata nun carácter parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Non é posíbel facer unha lectura en bruto en g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Produciuse un fallo ao abrir o ficheiro '%s': open() fallou: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Produciuse un fallo ao mapear o ficheiro '%s': mmap() fallou: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erro na liña %d carácter %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "O texto do nome codificado en UTF-8 non é válido - '%s' non válido" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' non é un nome válido" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' non é un nome válido: '%c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erro na liña %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Produciuse un fallo ao analizar '%-.*s', que debería ser un díxito dentro " +"dunha referencia de carácter (por exemplo ê) - pode que o díxito sexa " +"grande de máis" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"A referencia de carácter non remataba con punto e coma, probabelmente " +"utilizou un carácter & sen intención de comezar unha entidade - escape o & " +"como &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "A referencia de carácter '%-.*s' non codifica un carácter permitido" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Detectada unha entidade baleira '&;'; as entidades válidas son: & " " +"< > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Non se coñece o nome de entidade '%-.*s'" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"A entidade non remata cun punto e coma, probabelmente usou o carácter & sen " +"a intención de comezar unha entidade, escriba o & como &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "O documento debe comezar cun elemento (por exemplo )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' non é un carácter válido despois dun carácter '<'; non pode iniciar un " +"nome de elemento" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Carácter estraño '%s', esperábase un carácter '>' para pechar a etiqueta de " +"elemento baleiro '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Carácter estraño '%s', esperábase un '=' despois do nome do atributo '%s' do " +"elemento '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Carácter estraño '%s', esperábase un carácter '>' ou '/' para pechar a " +"etiqueta de comezo do elemento '%s' ou opcionalmente un atributo; quizais " +"usou un carácter non válido no nome dun atributo" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Carácter estraño '%s', esperábase unhas comiñas de apertura despois do signo " +"igual para dar un valor ao atributo '%s' do elemento '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' non é un carácter válido despois do nome de elemento de peche '%s'; o " +"carácter permitido é '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Pechouse o elemento '%s', actualmente non hai ningún elemento aberto" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Pechouse o elemento '%s', mais o elemento aberto actualmente é '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "O documento estaba baleiro ou só contiña espazos en branco" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "O documento terminou inesperadamente despois dun símbolo menor que '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"O documento terminou inesperadamente con elementos aínda abertos - '%s' foi " +"o último elemento aberto" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"O documento terminou inesperadamente, esperábase ver un símbolo maior que " +"'>' que pechase a etiqueta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "O documento terminou inesperadamente dentro dun nome de elemento" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "O documento terminou inesperadamente dentro dun nome de atributo" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"O documento terminou inesperadamente dentro dunha etiqueta de comezo de " +"elemento." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"O documento terminou inesperadamente despois do signo igual que segue a un " +"nome de atributo; non hai valor de atributo" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "O documento terminou inesperadamente dentro dun valor de atributo" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"O documento terminou inesperadamente dentro da etiqueta que pechaba o " +"elemento '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"O documento terminou inesperadamente dentro dun comentario ou instrución de " +"procesamento" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "obxecto danado" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "erro interno ou obxecto danado" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "sen memoria" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "alcanzouse o límite de \"backtracking\"" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "o patrón contén elementos non permitidos na coincidencia parcial" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "erro interno" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"as referencias anteriores como condicións non se permiten na coincidencia " +"parcial" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "atinxiuse o límite de recursividade" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "atinxiuse o límite do espazo de traballo para subcadeas baleiras" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinación non válida de marcas de liña nova" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "erro descoñecido" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ao final do patrón" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ao final do patrón" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "carácter non recoñecido despois de \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"aquí non se permiten as letras con maiúsculas e minúsculas escapadas (\\l, " +"\\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "números fóra do intervalo no cuantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "número demasiado grande no cuantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "falta a terminación ] para a clase de carácter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "secuencia de escape non válida na clase de carácter" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "intervalo fóra de orde na clase de carácter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nada que repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "carácter non recoñecido despois de (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "carácter non recoñecido despois de (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "carácter non recoñecido despois de (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "As clases de nomes POSIX só se permiten dentro dunha clase" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "falta o ) de terminación" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") sen ( que o abra" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ou os díxitos (?[+-] deben estar seguidos por )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referencia a un subpatrón non existente" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "falta un ) despois do comentario" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "a expresión regular é demasiado longa" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "produciuse un fallo ao obter a memoria" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "a aserción lockbehind non ten unha lonxitude fixa" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "número ou nome formado incorrectamente despois de (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "o grupo condicional contén máis de dúas ramas" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "esperábase unha aserción despois de (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nome de clase POSIX descoñecida" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "os elementos de colación POSIX non se admiten" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "o valor do carácter na secuencia \\x{...} é demasiado longo" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condición non válida (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "non se permite \\C en asercións lookbehind" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "unha chamada recursiva pode crear un bucle infinito" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "falta a terminación no nome do subpatrón" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dous subpatróns teñen o mesmo nome" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "secuencia \\P ou \\p formada incorrectamente" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propiedade descoñecido despois de \\P ou \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "o nome do subpatrón é demasiado longo (máximo 32 caracteres)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpatróns con nome (máximo 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "o valor octal é maior que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "o grupo DEFINE contén máis dunha rama" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "non se permite repetir un grupo DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opcións NEWLINE inconsistentes" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g non está seguido por un nome con chaves ou un número distinto de cero " +"cunha chave opcional" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetición inesperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "desbordamento de código" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "desbordouse o espazo de traballo de compilación" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "non se encontrou o subpatrón referenciado comprobado previamente" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" +"Produciuse un erro ao estabelecer a equivalencia da expresión regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "A biblioteca PCRE está compilada sen compatibilidade con UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"A biblioteca PCRE está compilada sen compatibilidade con propiedades UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Produciuse un erro ao compilar a expresión regular %s no carácter %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Produciuse un erro ao optimizar a expresión regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "esperábase un díxito hexadecimal ou '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "esperábase un díxito hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "falta '<' na referencia simbólica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "referencia simbólica sen finalizar" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referencia simbólica de lonxitude cero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "esperábase un díxito" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referencia simbólica ilegal" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "'\\' final perdido" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "secuencia de escape descoñecida" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Produciuse un erro ao analizar o texto de substitución \"%s\" no carácter %" +"lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "O texto citado non comeza con comiñas" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Comiñas non pechadas na liña de ordes ou noutro texto citado nun intérprete " +"de ordes" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "O texto terminou despois dun carácter '\\'. (O texto era '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"O texto terminou antes de encontrar a comiña final para %c. (O texto era '%" +"s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "O texto estaba baleiro (ou só contiña espazos en branco)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Produciuse un fallo ao ler datos desde un proceso fillo" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Produciuse un fallo ao crear a canalización para comunicarse co proceso " +"fillo (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Produciuse un fallo ao ler desde a canalización filla (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Produciuse un fallo ao cambiar ao directorio '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Produciuse un fallo ao executar o proceso fillo (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de programa non válido: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Cadea non válida no vector de argumento en %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadea non válida no contorno: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directorio de traballo non válido: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Produciuse un fallo ao executar o programa asistente (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Erro inesperado en g_io_channel_win32_poll() ao ler datos desde un proceso " +"fillo" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Produciuse un fallo ao ler datos desde un proceso fillo (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Erro inesperado en select() ao ler datos dun proceso fillo (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erro inesperado en waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Produciuse un fallo ao facer fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Produciuse un fallo ao executar o proceso fillo \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Produciuse un fallo ao redireccionar a saída ou entrada do proceso fillo (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Produciuse un fallo ao facer fork ao proceso fillo (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erro descoñecido ao executar o proceso fillo \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Fallo de lectura de suficientes datos desde a canalización filla co PID (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Carácter fóra do intervalo para UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Secuencia non válida na entrada da conversión" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Carácter fóra de intervalo para UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Uso:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCIÓN...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcións de axuda:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Mostrar as opcións de axuda" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Mostrar todas as opcións de axuda" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcións do aplicativo:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Non é posíbel analizar o valor enteiro '%s' para %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "O valor enteiro '%s' para %s está fóra do intervalo" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Non é posíbel analizar o valor \"double\" '%s' para %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "O valor \"double\" '%s' para %s está fóra do intervalo" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Produciuse un erro ao analizar a opción %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argumento que falta para %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opción %s descoñecida" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Non é posíbel encontrar unha chave de ficheiro válida nos directorios de " +"busca" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Non é un ficheiro normal" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "O ficheiro está baleiro" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"O ficheiro chave contén a liña '%s' que non é un par valor-chave, grupo ou " +"comentario" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupo non válido: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "O ficheiro chave non comeza cun grupo" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de chave non válido: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "O ficheiro chave contén unha codificación non permitida '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "O ficheiro chave non ten un grupo '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "O ficheiro chave non ten a chave '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "O ficheiro chave contén a chave '%s' co valor '%s' que non é UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"O ficheiro chave contén a chave '%s' que ten un valor que non pode ser " +"interpretado." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"O ficheiro chave contén a chave '%s' que ten un valor que non pode ser " +"interpretado." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"O ficheiro chave contén a chave '%s' no grupo '%s' que ten un valor que non " +"pode ser interpretado." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "O ficheiro chave non ten a chave '%s' no grupo '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "O ficheiro chave contén un carácter de escape ao final da liña" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "O ficheiro chave contén a secuencia de escape non válida '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Non é posíbel interpretar o valor '%s' como un número." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "O valor enteiro '%s' está fóra do intervalo" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Non é posíbel interpretar o valor '%s' como un número flotante." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Non é posíbel interpretar o valor '%s' como un booleano." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "O valor de conta pasado a %s é demasiado longo" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "O fluxo xa se pechou" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "A operación foi cancelada" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "O socket non é correcto, non se inicialiou" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "A secuencia de bytes non é válida na entrada da conversión" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Non hai espazo abondo para o enderezo do socket" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Non se permite a inicialización cancelábel" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipo descoñecido" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "tipo de ficheiro %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "tipo %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final de fluxo inesperadamente prematuro" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sen nome" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "O ficheiro de escritorio non especificou o campo Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Non é posíbel encontrar o terminal requirido polo aplicativo" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Non é posíbel crear o cartafol de configuración do aplicativo de usuario %s: " +"%s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Non é posíbel crear o cartafol de configuración MIME %s do usuario: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Non é posíbel crear o ficheiro de escritorio %s do usuario" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definición personalizada para %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "a unidade non implementa a expulsión" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "a unidade non implementa a expulsión ou operación_de_expulsión" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "a unidade non implementa a consulta para medios" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "a unidade non implementa o inicio" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "a unidade non implementa a detención" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Non é posíbel manipular a versión %d da codificación de GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" +"Número formado incorrectamente de tokens (%d) na codificación de GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Non é posíbel manipular a versión %d da codificación de GEmblemedicon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" +"Número formado incorrectamente de tokens (%d) na codificación de " +"GEmblemedicon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperábase un GEmblem para o GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operación non permitida" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "O punto de montaxe contido non existe" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Non é posíbel copiar sobre o directorio" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Non é posíbel copiar un directorio sobre o directorio" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "O ficheiro de destino xa existe" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Non é posíbel copiar o directorio recursivamente" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Non se admite a unión" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Produciuse un erro ao empalmar o ficheiro: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Non é posíbel copiar o ficheiro especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "O valor da ligazón simbólica dada non é válido" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Non se asiste o Lixo" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Os nomes de ficheiro non poden conter '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "o volume non implementa o montado" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Non hai ningún aplicativo rexistrado para manexar este ficheiro" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "O enumerador está pechado" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "O enumerador do ficheiro ten unha operación excepcional" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "O enumerador do ficheiro xa está pechado" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Non é posíbel manipular a versión %d da codificación de GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Datos de entrada formados incorrectamente para o GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "O fluxo non permite query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Non se permite buscar no fluxo" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Non se permite truncar no fluxo de entrada" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Non se permite truncar no fluxo" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número incorrecto de tokens (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Non hai un tipo para o nome de clase %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "O tipo %s non implementa unha interface GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "O tipo %s non ten unha clase" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versión formado incorrectamente: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "O tipo %s non implementa from_tokens() na interface do GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Non é posíbel manipular a versión fornecida da codificación da icona" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "O fluxo de entrada non implementa a lectura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "O fluxo ten unha operación excepcional" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Non hai espazo abondo para o enderezo do socket" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Non se admite o enderezo do socket" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Non é posíbel encontrar o tipo de monitorización do directorio local " +"predefinido" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "O nome do ficheiro non é válido %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Produciuse un erro ao obter a información do sistema de ficheiros: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Non é posíbel renomear o directorio raíz" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Produciuse un erro ao renomear o ficheiro: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Non é posíbel renomear o ficheiro; o ficheiro xa existe" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "O nome do ficheiro non é válido" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Produciuse un erro ao abrir o ficheiro: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Non é posíbel abrir o directorio" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Produciuse un erro ao eliminar o ficheiro: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Produciuse un erro ao mover ao lixo o ficheiro: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Non é posíbel crear o directorio do lixo %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Non é posíbel encontrar o directorio de nivel superior para o lixo" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Non é posíbel encontrar ou crear o directorio do lixo" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Non é posíbel crear a información de lixo para o ficheiro: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Non é posíbel mover ao lixo o ficheiro: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Produciuse un erro ao crear o directorio: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "O sistema de ficheiros non é compatíbel coas ligazóns simbólicas" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Produciuse un erro ao crear a ligazón simbolica: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Produciuse un erro ao mover o ficheiro: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Non é posíbel mover o directorio sobre un directorio" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Fallou a creación do ficheiro de seguranza" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Produciuse un erro ao eliminar o ficheiro obxectivo: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Non se permite mover entre puntos de montaxe" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "O valor do atributo debe ser non nulo" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo non válido (esperábase unha cadea)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nome estendido do atributo non válido" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Produciuse un erro ao estabelecer o atributo estendido '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Produciuse un erro ao iniciar o ficheiro '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codificación non válida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Produciuse un erro ao iniciar o descritor de ficheiro: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "O tipo de atributo non é válido (esperábase uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "O tipo de atributo non é válido (esperábase uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "O tipo de atributo non é válido (esperábase unha cadea de bytes)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Non foi posíbel estabelecer os permisos nas ligazóns simbólicas" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Produciuse un erro ao estabelecer os permisos: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Produciuse un erro ao estabelecer o propietario: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "a ligazón simbólica debe ser non nula" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Produciuse un erro ao estabelecer a ligazón simbólica: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Produciuse un erro ao estabelecer a ligazón simbólica: o ficheiro non é unha " +"ligazón" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" +"Produciuse un erro na modificación da configuración ou no tempo de acceso: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "O contexto SELinux debe ser non-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erro a estabelecer o contexto SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "O contexto SELinux non está habilitado neste sistema" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Non se permite estabelecer o atributo %s " + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Produciuse un erro ao ler do ficheiro: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Produciuse un erro ao buscar no ficheiro: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Produciuse un erro ao pechar o ficheiro: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" +"Non é posíbel encontrar o tipo de monitorización do ficheiro local " +"predefinido" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Produciuse un erro ao escribir no ficheiro: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" +"Produciuse un erro ao eliminar a ligazón da copia de seguranza antiga: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Produciuse un erro ao crear a copia de seguranza: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Produciuse un erro ao renomear o ficheiro temporal: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Produciuse un erro ao truncar o ficheiro: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Produciuse un erro ao abrir o ficheiro '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "O ficheiro destino é un directorio" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "O ficheiro destino non é un ficheiro normal" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "O ficheiro foi modificado externamente" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Produciuse un erro ao eliminar o ficheiro antigo: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Proporcionouse un GSeekType non válido" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Petición de busca non válida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Non é posíbel truncar GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "O fluxo de saída da memoria non é redimensionábel" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Produciuse un fallo ao redimensionar o fluxo de saída da memoria" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"A cantidade de memoria requirida para procesar a escrita é máis grande que o " +"espazo de enderezos dispoñíbel" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Solicitouse unha busca antes do inicio do fluxo" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Solicitouse unha busca máis aló do final do fluxo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "montaxe non implementa \"desmontaxe\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "mount non implementa \"extraer\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"a montaxe non implementa o \"desmontado\" ou a \"operación_con_desmontado\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "a montaxe non implementa a expulsión ou a \"operación_con_expulsión\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "a montaxe non implementa a \"remontaxe\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "a montaxe non implementa a averiguación do tipo de contido" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "a montaxe non implementa a averiguación síncrona do tipo de contido" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "O nome do host '%s' contén '[' mais non ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "O fluxo de saída non implementa a escritura" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "O fluxo de orixe xa está pechado" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Produciuse un erro ao ler o ficheiro '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Produciuse un erro ao reverter-resolver '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Non hai rexistro de servizo de '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Foi incapaz de resolver temporalmente '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Produciuse un erro ao resolver: '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "O socket non é correcto, non se inicialiou" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "O socket non é correcto, a inicialización fallou debido a: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "O fluxo de orixe xa está pechado" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creando o GSocket a partir de fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Non é posíbel crear o socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Foi especificado un protocolo descoñecido" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "Non foi posíbel obter un enderezo local: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "non foi posíbel obter un enderezo remoto: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "non foi posíbel escoitar: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Produciuse un erro ao conectar co enderezo: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Produciuse un erro ao aceptar a conexión : %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Produciuse un erro ao conectar: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Conexión en marcha" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Produciuse un erro ao conectar: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Non é posíbel obter o erro pendente: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Produciuse un erro ao recibir datos: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Produciuse un erro ao enviar datos: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Produciuse un erro ao pechar o socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Agardando pola situación do socket: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Produciuse un erro ao enviar a mensaxe: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "O GSocketControlMessage non está permitido en windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Produciuse un erro ao recibir a mensaxe: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Erro descoñecido ao conectar" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "O porto de escoita xa está pechado" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "O socket engadido está pechado" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Non é posíbel manipular a versión %d da codificación de GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Esperando 1 mensaxe de control, obtívose %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tipo de datos subsidiarios inesperados" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Esperando un descritor de ficheiro(fd) pero obtívose %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Recibiuse un descritor de ficheiro (fd) incorrecto" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Produciuse un erro ao ler de unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Produciuse un erro ao pechar unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Raíz do sistema de ficheiros" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Produciuse un erro ao escribir a unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Abstraer os enderezos de socket de dominio unix que non son permitidos neste " +"sistema" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "o volume non implementa a expulsión" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "o volume non implementa a expulsión ou a operación_de_expulsión" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Non é posíbel encontrar o aplicativo" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Produciuse un erro ao iniciar o aplicativo: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Os URI non son compatíbeis" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "os cambios de asociación non son compatíbeis con win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "A creación de asociación non é compatíbel con win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "sen memoria" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Erro interno: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Necesítase máis entrada" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "O nome do host non é válido" diff --git a/po/glib20.pot b/po/glib20.pot new file mode 100644 index 0000000..9e0b60f --- /dev/null +++ b/po/glib20.pot @@ -0,0 +1,2012 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "" diff --git a/po/gu.gmo b/po/gu.gmo new file mode 100644 index 0000000000000000000000000000000000000000..68cc1724329ec06b8608c60f6714ed2f9fc9c160 GIT binary patch literal 62068 zcmeI5d7NBTnfEV>qH#kJccnx^I*<+tI|+*rLWm>~NCK$AP~BbKDbn55bXAiCL<49D zM8z%001^;Fu)`)8z)`_v93A&%6nA?Z*Ku@ooEe>&SAD;~=Q($)zSUhFVBY!T?N4rg zb?-grInREcbMCF~A3kr-tr0(0?-4~W1N)yDMK6C+6n*SPx*A1uUKvIEfOEmUz=Z*q z23!d~gX`yo^D6jS&MyR4gI@s4;KBPx(Tl;igZqIyz?tA@LDBymcp&(cS4GiD;4JV3 zU=4gexCuNMyaDV0KMR(?--0g%pL;+Q@iFQIHO`sf3&FMEq2LwZG2jCrEJeQs4+oz& zJ&Fzi7l9gY9e5b{4p8HL3Y-i62J8e&Fsb&ZgBtHmp!oX$SOOmeCD*q>@%5w`&hIP0 zS)4BdAr&=1nnc%wh#q}1;7>sH-wPqd=UlJ^E(cEp8{kdg1EBa_Nn`1=ADj=q4V(>r z4m=3_Lpa}`6Pff(P}eWuKaIZ?EQ22dPXS+n(9%l}5K#jKr zJO})2!2M8?^tBF@o<0al-tT}XfPVpx08fC)#o!3|F7Oes1fEGJ>2nx-1$ZSWzq}ok zyq^Xo$9Kc|@4@GBK5dTodpW3nhl1*NCMY`$g0BRx2Boh%LACoLxG(rC@Fn0LFt71n z2A06Np!%N$YWzV^e)ZOH{rv$y67ZX#`1@TrpN10E{yo;r=b4_`3%bKi>-H{{_l# zUwNGS>4~8DUIl9WcY>sZ=;44r54bl*5g*5Z>fa6S4PF6CpYH|5?;YX#BjEEn|0?(* z@TcMY&!FtO55|%o91V(I6_g&Y0ww1z@TK6R;LE|^gM>o#+*iAt3&0he4}+(Ip9Ph7 z_C68agXe%tz^$O@{uq2E_-rPH{lGb(x9?1F9_K@#S0j+{cBKs?}-uQpDzT( z_hF#MSqaKtE(K?U9|AkTF;Mb6{S5cVd7$*v3rcUBz=ObTp#0?XApfFY@*l1g9ka~& zy%bcxn?d=}CqRw=b5Q-Cex}nq9F$#_f}*z?d?xrNQ1rHddx2j8rT<64r-J_q&H?`u z6#oaEg5Lxs_s>DK+v~M1ev*%hC+c7RuL{(r!m!A-r?gy4)mY5?$B5K_@I*EpRa@LJCA1smX^Dme!H75IZ82{Vg5uE>JqwDhsZi@dA5D}su zf%3!Umq!sMj@|(t3H~0Go({SKS-?8D0DKr+2tMg8p65;lap7nKD8KqPxCGqqtxl&O zJf8Dg!2`e_hx5Hq!qJ?c0v-mwIh@}Qp2Yb-gA2h!uJrQ}@I1~R0%eyM;0)q>EvWO` z!PkNR4ay#8U*-JV2FhQ41k?I!Rn&VK=l{`_}D(R;w_K*=@h8rMSwlz#35CFgVB>God;ijOaX;^V+~vBm@6 z10Dmu^xdw%m7whVHt-biDGVa}F9Bu8&x6ar!{3Vx;9J4dz+ZvfijLaq{Cxq`cpW%h z7kD{HNJT#dCFhy%qZS57L0F1rU*~@O2#5#(a*mEYTPs4?|J2e;Q5^IaTB>6>;g6Jv$uJEdN(Nkrrqr8@c~fhUjgNphu%W2 z1FK*!_%*Nu9{mCLm)C+FoNoh{gP#L+|7Ex06X0>6-$UKF`S=yuj_RSD1ChjJQaMwhwveAHE8p}eLnuJ;0CTg`F^+WrQj0I z{{-s#Yd-AzB7XyxIe*G7d=l&fH-WzfajB^BfY*o5deHTF9*7G?Uj$E7`-eQ=d=SKS zqhEtF!7C7M6?hl;9&p-U<9pyu;7NPH>ql9KfY*P_>#+}i-1Ee5!L_tI_+fk>d>>c^ zU-F2rN8SQTkKX|Mz#~85^4$b>aQ=!zkpY9 ze(_h`u6usX^G=g;XO0Gk!5v`7H(W1Y1;zi1|K9WdIpCR`ZwDpcAHc)F z@;BX%TfuWVe;Aw&zVKUKR~-kwlJnnzCxZJt>h=0c@Xeg}f^PzU2Hpf#zU_H=&+quW zaw#aieFJ<3_{{HmJ@_JU0p~}7`+=8$zW{Flj{@KFJ?H0R;B}nu`+c8R?gslf-{S`! zM^*5}oPPn7zx@3)4{czUkrAEKLf?*;(ua|1l|IQ&OX2LI9v{{;rx2A1U~tn-H#3c7jym& z@QvWN!7{k=*Y2MWg7Y}v=QpmW(?R8dcY@;Q6X2oX55P0Pz5m7Mf%C!RIDdb@?}4Xt z{^H+yysrUeuP=l0+mnCiarAyr?WX@LJ_6p)5&yiJ3-ST|{2Rv-&L0F)6a^49RYCz`#CY7;0%suhWmfu^JRSg0{94remXe1!~HjdPvPk2 zSZa6E|6Ub7z6D&x@g&+D&q2yEpVaMrIe!-TXO8nZ=5u6!6k~7aSW3H#!i|3LX`Igh z8ypw&`7}^@VGf^P0LsU&;&X)~{`n*yj?0|u`k@?0a_s_+v-n)qMSgDM*qdvEcE)o6 zaD?+C!EGF$4cGqxta1HNj!r&r;CO)JMV#wruYgzjY4jWL4O~+$)Q@t*8Jyp&lkl@o z=yMUM7+xN(Kb!OKhtD?!yjIBd(>cBqt}(^f-b4@hO5Nt(vEcJL4(Ib?j`(L&_&hCh zP4}+m_-l?j#~4Ta^Lak(;`k`XH#uI!@pAgk!et!K;d~kRrqG}aK9l3`I6lOo`EWIDz6|PTC&xO@ z8ys~G{ru4(I)w9&@%iZ-@8kGej<0g)=X~yc7hD7W7W|Sf@^d4{e)h?0&aOc7&EeXU z!Mnoe*MP6%cp+`h1CI@DpUdZNjzyfG#IZSCKZI)~KEFPkzlZa$aKt~i^WlJS@;Bh+ z9Ouw>R=6hk5yx7Nck3kl{0De$pgE1tdxp=ty%)!)Iex*hkmIj7^z#9Zw{iS8$2&L{ zhCaOkZ{V7Kp2zviz=t?4=kuQ6*EyaM+I0rJ8hi;yA4dZlH0RPL|#lq!SWwVvu=-^^(G?76+AMJG9)7H}z8FZEXYD~%096@50G zF}*&cRIQf=YmHL5ODY-MhRBe<7${Va-SEa8y zSSk;eD*cs#%3z~3SRSZE?NV;6sibu440Fhg`6cW8IMVO0)hjvnY=rqG4PKUvm7bId z>0`$6GYTb;Xr-2S=0Uc5Mk(qz;jB_^xYTjN>ksZcucz8qZPZHxBlSk9s}gj|cwHMx zGozWMb=Ah2+DM~R8>$RS(;d-?rLJ0S?Lc{WEscjuE6-YN+`{N^rQEZjR9RoGH|o)e zUG;|SR2mtqt}pe}2Fh5WUh7_4!IV8c!Tpa1JQ{+ zJzNZZxZEv0^+YEQ4fR*M%Z)0{&lnQa=S3&hX;<}&-7sQzU(rZDf#Wd`Z#uUM$a)csXl1|`?!9g3eS z0w&of-zRQ19nT{rEga|~LrkS@rDt*5)K9@F+HbvL4Y{h2`T&lSdQh=LDOl4sL1EF=gl}Q6jA4|e35v9iP$RIhUQd+dMGC<@m9vm8JEN|e;1JMF^>=JX(Ky{Et zb@_Z*qf6*CRjXx~t1O515+s9tO0wk56{mF0J#w-ZM`s!gS9&YM%%e(MowE;OX6&hj z6l$|8bA?OQP%cd-!$Jx@Ovw_H@Uj$7*Lr1uSn00~&Mytrm<;->Yvn2%Y9q=sgdQRe zptU*ymr_qA2q}F~GkggP)*Gn8=G?(XwXvbpS*p~#%R_LOP$<_+2XZz)T2LcPbX&eg zi$lY;KFtlf++fNO!2yynj+O|k2}bwh`0X984P-cqT}OdI8Wx11=@ro zz?TEHXI%d@%6+rj8BNNx zdZk1UvuZrJWwnV0zd)s!n?#mYE+=c?j2PU?Cu-dZSy;D5uA9n`+HP_~sosmrA^f0G z?eBLMIz5)w5x0`9zYLSHNaB%-X9A&SQ5L$pS$e3LD_Gf^7cEX9j3B)oJH39$@hRO< zq^h1bJ~KsqM`d>3?9#C+O^=_M_7J<3fgw^54j1AG@2?Hw^{9z>A1ZfOXkR?9l(K0% zS{N1(7V)C&1?j93wWKM936=!ifVNpJR*wpHO=T_n6HJ-5c`DIDV;{0gq%#hjKZ8tN zAxUFPTUT+tO4=$9SLS&}Egg8_NUbrybYQ>!>(hVbp;~=@w9sk%FUtLaBP%rGNiAgS zwS%>FgRo4}qN>Gu=>lNk@G$4)?(PcJKiLDjh8e_?s^9LSTnw{OSZ-u)%5b`=9A9wR zmmCE*w3f+U4g(MN%_~JdY|M);QI~{^Oen^w${b7RLmP^2C$&`OX3vOfX2}?)yUe}5 zO2f!X3|})5^}V%Bi~cfY%o-8MRL+_E1Ld{4N%hlJV^PJVKe#q~yLM55nwX|k&X=Zp z9RMccr?)ax;@p{tXW>xLz@}Vps)rokq|5m7cui8z znU^nLxTHEbvfk2oWql*VP27U3UfrZKUXwS)EeF_)>Ww!MLNci{vsDMOHjG=7i7LYd z<7L(m1$V=eVxl`zO}f7oI)tP_4V?scvnS{7u~_OJt`3nSGefcWQn$Eo(tcRi6u5|2 z4b*2tRs6A!BDim)zdWpoTLrm_)9FkztlL=BSj;E+&ASei8=h(kduDj^=8D{b>cuUG z8rLBX`Qge?Ka;kVkqu04MS99u|46pyFta1VP@gv`VqJPC4R@_9V%3<=akhA=z~-0* zW`%6mw|ZnyLEABt)hjmSl9UmbIOSwBLFIhdSn%b1Xrw{rnkNs}`b)v*XO;R`l1=Z) zv{9Yk+v636-<%emVk1f6g&BT8b_)f5GdC3$CE9$;H_}S0y_QYF#pKph`iVzhK$Zu_ zlN!>xRgHb}l3>nkyn~rh7-Fq$reN3dJU4Noe4Jz+b`^TFD(qFvw$k`OIc%x9x(7IK z)zm7>#587r;L7vx6y0sFr+I8@)I8a#lA35(-;)W|-7Hnz-D^s9HkI*^HDxxlx+rH^ z8QMm4vTDh!=hJ}$$HzAgz=w2ZH@NMVl5m{pT} zN%M}c+;hfkvstrO7|F_DZKQ9_c*@l079~x7VtvA?sb!nQ)=d^ODq4!=inpSG z9jnq+Rl=P=5#Qg39HN#4wPx!L;Kj()xB1}#*9(Dm<@B=JB!CCyvVqWE?3gE#~K!UD31{KMFsxu zTkX*)O)Vi4@0j}P&|7fXmZ5$o&9Qn+wn4SKgJQd9*zHisYj-tTwA`MUEMNzSiDIc& znYMG6>}F~AlII#dwRQFARB~YYOypFy@yvjh>sUefF4BzG&#)D%_Wx#_HzTsGO_usH zj_tB(2dS#yvME-6Mw=E}s`(XiL9^TndU1FfxM(@$;R>Gg+2a}Q*)xJKXtghTv~R+* zP`CLV<(L?qCb&0~NJ*b0>Dp7nQinG3B#`E#c;8`W%hqi-9AS_1utVFRsD?)#UeM4P zW0TFcagi%s)_F)KOcs=~(m`@xFsK!soeTO_zq?AYawauOs}`}gC%cc;GA1r)&3wdT z7T*f>meG<*Z^IrXv+v{2*T|w)@<7Z=hOUubo+Cv|Sn9BAYx`ZAtD?Fs=nBFr}oR52++J2wrC!cB0_>qr~YBA`~=khg% zxrfytdKwum)q_5QH%Ss&wvZZ@>RD=6rLj&Gs6AzBdLtn^z2?u?^)`w>rZKJ9Zg1gh z5bBZHYSZGL<*;;36;>iV?RmABu{Rx*Jes?hJ(YFchqK-DuU=S&V7v??ytQD}ak8f2 zwmBqw`K(SbOQv!9@`hL#8m?Ys%f5a#-jztYq!oKK2w|-K3jlk)ku=Lfaxb$;6rK_8f)>p}cuOVQ_}8aG2|h zi&bs{K5f29%{?9?69R?bf(M`>S@ha zs`35JxG;Ulez3`6LN<)fvORALe2>)Lo~UU9cKqv5af2}7QlOH3$Gz62+CMM8y@271 z!{uSKH}wlP9W~jfwqL%cwob3bm9*m%9stxMyPCh^FPp(k)BLu)HZn}Q3QkgRKkq$Z zepTz@{Mm@@261B7dZN4QXHD$^btU2+$ zFpFXgjY3M874Oi9YTSXmsa2Oc=n+B{ha52zE9v=@03V7bY|Hvqd{>1q zS7Hd8!=5J;wVv&5D(;?L>R6#?zUrrY8fa#gO!lF8X~wEdZk(X2DA}^R)S)TJ7r^F_ zilyZ7F9R`lJY~l1^iq$xK5f0K&rB&8CffzegvR5pn^_3iE}o=l*HgocST&+4Vt>tO z`Vm02E5PAF%jEvFg7l_A<@O=^lkP(^h-^$^H(MrQ1dJx}B|jdi9Whg8maV54!NI z+!JBH=CECv1cAK+N@lUlW7X-nd-h;PQH-)CXrWnBsV04Fky5fZAt}ttBmKOlWoAy6 zrIfKOuJLwNUeSbo%+n@nu9#sS#c30!{WaERx;Uy{gzF~>TsXqJu3iIX%HVMwYV0oY zCSsb+tcbH=GHtb?&W5%<(5>i!WRt?2Ey)pX#G5_MWrdPVT!&c>TbaE6RH~GR72$(D zoweT1;EUPY_8^o=H}_7fy-2)zh^ZZa)3QqTvZ~egb(x^EPe2eU;mqW~v`p3gXtSN} zzAalsV_mu07^?O_#I}z!P2y^kk?hT@W~t-*v+O+^-A%TuvfNtzPMt}C#hXAXmn0-D z?DdS23*%22XLLoCWy56}%SyYboPBzR_3l3CisH+c{L;>vI>upK2s zCB7WiA{{4m=w|v20ef)Tl*hwHI$sd5w~>>_PFPAygrF?WC};9>l$6S2E_?YmE_93t z398$+4f}c2-B6-nqVI{i%e*>a4{v1>FD}?PS=B$Qv}y^*2*=8q$v}EZRbK(Yiz`vO zR`bahWv^O)38uL;E&fqx`Yc0lQ`>9exX-#Mk%MgQJ5^k1e!H}>j!gx7yR=fL$MEpT zkQNWMt_u{nsrM^C`}~uA#VUVa&&-)YiW~IXCY1S~e|-XVghw9!h_2W7aQ&%XoI|4? zwkq^8xG!VUGN5AoO?X$Eeb#KX);+7!2RW^JDaXfw!|JSBZaKOw%qO^88;ZhCHfD0L($qPiYGQob5w&WqC!}jg?X?lhVFf)&W%iK0!_oAROrI4}3TUa|kiR%ldpbB1)Lh+DBgsvqig%lk!BPaqm&3$(eVV zP>b?Qxs-e7Kg@|C^+(jDe4UZPACj23e;ch0Oib4UZ4SbUQ!6+m0!C|XR^ zwLPr+(MVb_yNbA???_O@F+{wFlIWkiUXc1eTDsYs+^|YDJ;xng#$@-8ovgvKRt>x`s+U$p7qN$cidxNl6W?w*^|kC~NhM0+Fa(Lb zz;{(JB94jo>LG`hHY&$DJwX@QY1wd1b9Cq8p3bxVOM1La$4>0*0lrUA8J^uYGVQF2 zz75*BwBA?k={#wquim+Whr-jAow1^GfpQ4Z+IcdmWM1jeIdkW9&N-~}&?8H8=gvF) z=*~HZ&zVER&a+4tit41@oMSreUuo`<^NyH%@SGzKn=@?*BX+JJPt@5W)6#PJx(aUw zoklujZ>w}{ecf97_-fX(JOiCgVmh8qgMA~s=-au1{pES3MI#sR1+PYRn!bdYN;G%& zoM{U@O?PV7VV-Sl9l~B*l^6FFlRS($&K_T;?ZgQ=t#e`cru4kh(OuQXv~xQb=`o$N zc-l$jE>_KRXV0BG`|xSY`uW0Vf9EMof@~!W4%un_xI@|Ow~xnl48HQXxijZa%l`14 z?6J|ej*Z?kwsXta==;WYzMapdvC)UdMlX-g?;RWc$k^!U*y!zcd&k)5ZDXU4O!(F9 zvC*AlqYsabZXO%GPhCY8GF$E9y%F0s1y^l-G&XvT&B4aiR_pj6eXafI4P!eu@@do9 z=q@p_a|u<`YyNvLU#0+1MyeALgoHZ1isL$N2-| zedlF-+HN%TDNv2t<5}&e!fYvgsXP|tcH`)J#?5i;e27;*VKF`-szhv$Wi9iYNG8&A z1B*-H3G;WFPwe0hcEpR7IR?LScKH5!agSgrXpOVSc=F>KXTJb% z?uL0KQ}`;pT_OnNE~S|^hUpduLuT9sjiUu(K~8fc$4AVuj06|l%V3=E%{%+oj_rgV z0bzYQxJuhcjCqleyxLIojRNyP^t+9#HljTLP8)b@d=IxIu(omoTQNEfq3&*==FXHZ z+~_f6L*&1UKQ?-caeB9P*HCnH(SpW|B88=L$lOncyLbLV4tg(!hZc3?R4a+e8v z8&_l7jE!C;#>FM~X+`LYVWPG5Tt+T!(`$3oNT$nngt<<(LHQvCxKCV8e@u{Mpj+eHq?7xN zBc#E1)Q+LatElpF7|eGv8Fj}jEhWM#=XZ1}w&g_(C+WG9^*l?D8P7A1L8s^gw;iQ* znwOnuMtHG`v5O$}}#HW>hrhHap#DEGXBsY{5MY9$bTQWE8Fekdu3or8o%z zL<8mN=m{XW%Vc1*L^%1FYa%!x>J&#);1Z$|%^cYU@n|%0?6)wOoS4d*Nq^VIk%ZKW zvYj|*?5Jq*UY-GPHRF`2mV&E?=_$C4?Ub0yx8}rD+%j5V`TsqGL?z1ce1c|3cxa`` zS6geQ*?;<0&z%!~*~Du59VFRbHi3ExMAV`9BU>@F%#J?M1f$-cYk-N>bZqqctiN)} z%Y_ib=C!%U0o0{EJb%(}tH{x7G2leQ1g8vM2#2u43bC-3f#ehLq%?0MvbBb(YDPoY<&zenT=A2?ej zPmt3Sh+pZE#L-327EQD_k!%#u5dBJ0gkvPFbvW^L9baS_+X>w} zxe}&VGTFx1(ZVHy8{ea^bi+06a6mR4ENVK}%ZU&cpY2c`*FB!9aWWV0E*#Q-pOD+A z$vBKdZ%71>Dgq%oT7%pG@_3@b+8`PyNO-~gVIC9tX@AXWQz z^MlM7zUvbkVwX)GSWO{HM^X;7^~w3;zOn$!;{_J=fumb|l++5Gqiq>ieL`asuDG)` zwqI~W7s8ZbH=0#Nf~jar6mJ-iYN2;4my@*jKI?+y?wgto!a~^cmDCISr zF)G3;fuka?uNhl0WH;!PQjCofGGl>dnloe2f9Q}>l1fb@u%mD=i%B4F67m{Oghd0# z@!9nw<$ocvdMhequp&DBZhPsNj6>NPteoEOjwiD$d1D=p1I=l^)x>Pb2jXVQF z8}Y*DC_I%iZ>9ZqTH^6yi(s;*7D8Li=+ZVmVAM2{A}!;xX>uGJ^<~9`Ye2=@LVaP| z0tbfJr_jV=%*pS)H%9Ue4EeqBp;k&&v6m_0#8?u}OpU05wyAq?TNwsogxW?6C8ZkD zv!@^b5Hc==>F){%mqJInkj;|NgDQH39qrlBGGuqg53%404J$Atf+;)XvKs_c9x421 zgA>VN@+zGXx44vVhpBU_hHb{T=NT9d)d>S`H}_EIBni2)5FSbIL4DjqEC>^YP=v7{ zx$~83aObl#xAZQ*>vHBv8cLVSfG~;=WnMN5CmY*Qy%#K1L%&EvV#Hd6S_SU)};pczSa(ef}92y^ITvE(O zIEPhSkNCj(LxPwrx~==vf_syv2F43>`$Vx#tLCWAgKOw31zpDv~b?cr@ZQv_%tAuxyYmib}D?B*7QKi97K~{7_q}17@%+{*p@7H zaQr*`TBRhqUTYnKi-~itp;CqnqOlp`)0eV!t~DAU$`Lx$H{53?_9DteRElQTqN-a)%2yc`#X#xijoGU>b z)A5zI!$6(J-GZ2GHsF*8E*deZ3IkWogB0+=Bx$?c_B##7`&G_tyof;L`lYxYnumD4 zPY}$>d2U#LfGP3j`AV$SFGg(Y2c3`{F&o2@c{iFv5dkD=?S$l<9(|-m3${>N4Z>+T zdR^j0aEA!NF^blW9S7>kG4$Mf!+Q|TQ4AU8ZB<*$PB15@%L(r1xSGvj7Hto>0NgfhVV zrrcNkZl2k+PBvPS*h7k#Wyq~Id`K+B7t>A}-#!P)YsSUN*r;zL-WMLMVOEPy2@_Iq zG9El~70&Pth~EM|hJEZ~lB=MLjwEra2%~NJEMbNF&Fm^E<1285CX1&BGyiVuM86xY zfG;$u9FEte4xQ)CrANcruc52P7D20(GWdV#x;<-2WL|1wDBvUK3jZ)Oa%eD-wvEnf=Gg6Z?;P{piS_zt{+b4Y=)SVw< z6Gh#LIjampj+SlULSJy-MAfrw`u-^bHb{TQTAyBcrg z+2Y5klPD2Ad6vOHJq2Es zgj1)b=Ep;XP=#d;7{VUSGoV*;9`h4NKykcpiIbe>h27C{S|-ATuSp*8dLIXWe5l92 zL&K(d8%47@Sy_+3bGA*Mkt(3@)=ATX8_w$nlHe8Cj-Hv|V?7y6?LHZgpxIPS+ZlxU zosjo{*+m~FU21w+i<4w?d6(5s4{(W+0b?oTCljt|#%Y=589P)RyDx=#cSsPFbSyA8 z`f76bNw!fN{qG~*l!)7q0d0k4UmC`-SK&W|Ftdi-A*l#3eSSK~bhM`K|7>hQ8xr&k z6XDc|B_0M1aysDxB|H*-*tx;JX|C}qp6H|OoC2@T9KJJgAE@J?Ooj}odISYn6o>~% zz}T(6trQ}HYd(KM8J0H_UUc!6%_HS%TrYb!*>-_mbj+){Z8l&Io=^pYGv4HJ*fwR7 zCz%cVVgsN1Z-&k65@GVe;)G*G9I@|w-WoqiMu(vSKzqgIuWPbsq$X|J!|GP*OuaVi zNzPESm9mD&*SCo8U5ePrcFRPD?E=X-ng~)h;;3sX%uG)Y#F4a_E||+Jq+oQ(zJ~J@(h@j zaK6CcJYK=rl;UB`TBvAF*GRKG3ScvR9X|@&mAzUP?ml5FN?^d5zpP-OX>nC{i-o#- zy6a<`Ilj1#J$PK&@Hk5KZ@=WD$iz^92PxEjx!K>E3Gw^Au=&`v_e-Ruq&H}k>CBPZwZ zHW_=7-ZL?YCg&)r|J$JJzlUW?0#Ai}Wb%{6_{SD7yoZ@kpDcWsRT8D%9rH1zA?#P= zD+_5l(!?0&5u1%N-&V?53f*8s3K+~J%Zs1MtssYX%S~>E?5r@UdD}9rMo+>Y@{cnQ z<3cDIiww_LNm`_`L3dk2$jHRXdcJK}Gz~OIvv(w>`3)2e{Yv&0F2ZkH?I`_Ou^JfQ&^{yA}6_kCXa8i`;%EX^A`$Qj6Y8OjMX;zZ2Ec}2u;pyk!{-M zb{@ah!~X6=OI5`0cVh1Ls-emBuLqDgu&im1L7R40xlDQ>cax|*G2IngTAMMH2HaCR z_a*%<_dgf%FEh$DB@lEFbuu zD9IF^6VFTTrt}Z{kA9xpQFNWrgnX;dj2e3JsX1u5WOY#6DKH^66&8|C1sp`4|3c#9 zFIA`*N|qRWXcoEo34R+YNQe}TpQt`Ju1#7=zeLz(guU4qsQ92KRkG{3+U(Wqy{_MP*T4*teygyUobXfcxfm67oQ z6!zkLvV^?kaprjuIu)5qUX@VFP@A~aG*3Bo)>1z@g1}{)gi*)M|lEAi2tU_BtsA-_r)vnYf#5^*>@s>=TY)-Cp`1d$ZiEb z=E8bxND_5!ax4i|3{9;PyqY6cpYhBhXpk{_MHgrT&075rOM#Dr*&NevI ztx|v=jOkpdHbL#Qf_V)_4=$xL2H!HV{7pNxr3vj3nG*;l-|)Jo;O#K(!<6~5#7ARF zxp)ty1m|+w;F?n%%f@b|E#}Q*ibkML@-2S$x5W{^doTXGJZ3e-ahH)2@B;Yr*Y@v= zQuAeXH;$nFjvG2-T!{HFxDT>Ij*Tfs#i#INl!wz+utbgNZ(ZlRC|;%Ozd z%($V=tW3}h!FyENQ$nGfFg(UGRd>V{$Y!5Ai7Ki?+F%tQjzyTv!~JB_2~KaDiTt}c z;1fSa_%lV1BiG^Y85L7>4{`6n#@JFmjK=OTjVma#PKe@3je2|PfnbiEoTuMJNQ~qL z2(OgUJVZr-+Ho9=67M|}Ki5k9wb*j$bTjpaDhvzVf#nPe(KlvL1#;gVN|pilUMlW93!1b7SB% z1V9?J5V$7J0PY^ta_lR2#KtZA}%*zfj9*`_-HbF zJY}^#M5y_ppt0j*GHyLpM344#lR$JsiJ=B?!{FVz(`-1aw{rbxWWlW9a^H>PK%t+0 z+b%6gQExC|2#48Gk@E7AJ$$b{r4>iWb zd{QRUhc+an9i|ClH(l*Crxf%<@|dWuok-TGC^+K$8NxIO7n7No`=$UVaRj68W;ZPe zn;1yvmx*b{-OPtlhhk16uWNe3PWfDcHatV4(dHdgJzh4mgvAoRb#I4xshq$Qx%=up zkaiy9K0CvDV!W+TF{uqk;O`DSHc5s1fL(+WIipYL+*ffCHjeoe<_zzY+X*I@8ef*V zS>|k%GZ`Jag+dl~7?u(4vS&SLlT+Wd&=@voh(yc(^vvxs=*d0L0Gp=SOP%!~Lb4OcQDqq03Ak;)cj9`Tz!P*0H5BO&P{6Jr5xGSM*qY++xQKMZJ} zC6907u*RE^AGCsoko(?v@ zspDEJ$QYgQ^ti?gLMRp|*EpeMo-yZKn9`O02L-D_LKIw> zhLHEA0uP6h&s-tz=Qp(Ut1ow&DmSAXPCSDUuV~jF&ng||c#Jtn#*D|{27_54Xh444 zXd2=w6P0+&MPjUsG=VcHL%Ax$zC;_N$ryn~j?rRe!UZfA@P-D1qsEN2vQo-Z%OPMS z{E9e;d2+eD`1hc~PcfBP?OCfQbCo+J*&TQBB@p|LP3CRI{#1s;#W4yp5HE^hQW@4{ z@rT#zm+I|`jZdp$XPe06IdiERh>dUA)M_1{C)_3Eps{VNrN@W=azF8TcfoFCT+nAC zB&FdDq{*KFh-LH$Wtee~mhYM?>sLJGSWX?mFT*z4QC2F}F*kD2Mz8T+Vlu)4@yh*R z(_FWde{^QkkC@eDM)=~~-1kW0e|b-iXY|2*L#t4l;5S~}DPzz$CH~ep9WV!nb+0SL z7MqH=S#jK9AFnhZibslp_?ACLNIEvZ2@-f^U@AMZFZCRMxm12Gr9(@q=R73lc6c(^ zNZFyY*Gcb-S@JQZ8F%mSoZ>o5Q(F6D$K2AueMma6Bw-mU{L*I_N@P=pqidM!n5Cr8 zwi(y2Zf^CjQM^uIrspeuyj#hG!v7cz(eEMH4TFvNT{7*hK0Oytw{2#?W%BAsZfP*mWhC%1TVnR(6SsMag5l@?Xo8E7ead21%IIw7mzKb0fvQi8wDL*e7-+`*q^htOh!-Ke1~19 zO>nGK3s6PH=m*-0PsXDSEwPLf*EEC3>5{?xuU!@%hmq_r<;Hmh8w3>@uQ0AW6mpe& zO*-V*Xu6P3beH+VyCypdLtMgE9_O^txb(?6x{2?{<8oDxe~U*6v58F>FI`myKa~gA*qQ|jVZ2y!tv78t&e7l3; z2uIhBSKRqIbSmUYtORvfjiApKPvMcBmN*Ee--U}u=HgRo57)V(%Jm{^n>PnPnf#3i zS2oTBHObvl`MbXtQcN`cGtP_}@@;B8u5p4;HUb`(WjjjoQ6&rEM8!n8c#W>Dmsp1YT$Q2|$&(hkY zMp?<4oT$Y|EF245E|g=zOHnupgB~=elQKBeoJsM)3E@XPg(-yws=>Hy)>2EfiZ!=K z)4Q8{(!>N6<)Y$>&deMd!`QbNNkfy%n26C}Ev=)Wsj8ft+wG3LNWR~ZZ5?aUE2qn5 zM%kMdUc3dxAN)2ck{qhJk|>3myu_zG4Wz`A4vVLg=ESsy)n7gu$7N7)W_0N_c0_UP zQsF4EKZd`cgiOH%(nxFw6=p<=Gb)a9-J92wVryn(JZM9r&~3=ra3`B{A6M8Y>ORZr zDjq2}K3by zeL;NFnM8nxN-l96QCZ^jMQVie;$BuzK1fLABSFentr6GWu{up#M2t*AYC!iMD~za# zo2$|tSNVkc@^y-HAH``7W1FtUL{l;xx09st5b$>E!o#jt$$7KsgjDsQ1)_E(V)=t3 zqP@%;Biz4+W1Q;D`9nKf1K751$P;We5q5XdPxZYm@a4K}R1liuUsf|(u!nr|FgTa_ zT&3m?c8!|H6BQF1H_11mnNB5RqvMO~rk6oz-*UI%n4DBMqEFlscBkqm!*SR;D zA7FQneYuVeZV7@QhY&``;%@YyH<}=V$Bc8ZJ$d&-<#&NAGU*Xl?z*02%tpAW+3@ik zicA8}3MP*lj|H+mS2ug$?8b0zAXZOlAbGf;cnG5?@4>ojOqGl+X`sKb0K zig?2xl_%X5=|wB7h%Gf?O~ni?#m|k)@E8_7x#xIYBr7o5L~b(`PJ9A@DB?IxJF2@~7A%vdk?YJR$=?XcDUr0Z`%y}%02kzUgJK(@;LH7onGc&qh?&$Ck*G_0JC zd!r@aN@V=t<-q~+Uo3lK8LwCR`FpaDfzQ&qa<##C-M}B zLFq+9sweWlI^MxSW5kku74XRbjK)wtPmEjkM>gh0i*K~ZlT9?b%UJT&Uh$jan!84N=K24rTt`hfm+XPAv3&~nbQKN;li?K6N#`kW*g(W{c) zPNPYPWM^Bu^FT)TrXpKD!nPPfN`12UNxsbE53O--ZecL#)YK*eF`VW*267g*nK+4W z(LzNpWJ98~(Zw;gkP^6wQnXZ<9km$#8roniXu=m{um|Z^K0^oYp;|s&Yd170aOr=N zJ=kY>d_fiG6EtwMH=#wGMtsrip*=%5O?p zT!LG~#}z$7{a(sdGV$k~)rXUQNeY|IaYMefD3M#{3Y(U^g&fjpp^w_qKu-P2<0I-g zp#!qy3rwgG=NYS)nT(`mEo@|`HF-za#PA5wcN!DTbJLgbs9~om%cxB8?*a!u^zoa0 zA5Kv_lQU*O7%AHsx!sgQ7&G~aad#MKLE#E-1y|QvcPtU!Ue0+sW+B@{o`yb!N?b;< zEg{oV7@Nyfm2Os)E5$*{(}n|a&E~N#;Ac=f5_15kl z;tEoJ+g`cRNj7a;=+b!HK3KA+B}cdgI=IkXHUp2ordh!T+;Iv_aTiKixB2d zN(=(Sw<^s`V@<~c?~cUMC<9?{l8(a0_}%Fnk*y`ubk&Ari9XF>Fuf!0CsB4&bsj&c z8jj^ynRp7BG_^b)NJRQNfr;e)$eb_<;P;ygd6W}e8{LA?M5Xc=J~ewJmqNb4o2Nnu zlG}qT&A4>Ngp_I8{LsVartJER6uU7=HZYscTagWe+*vr!uf6O$+-#GZ_E%ZRyGbj{Io-qEZMuONvP zw4m^djGN|G=G7FU)FyMZdk@33C+@<;ghG6(h4a*B3bfxmhr+NEBDC+0S{ISD)6DH& z$V|;3SU|-9`3bF)#gx^&Nhl6z<1v0mY1K0BWVF0$i1WL&w3tXkmBc6R%ie{(gN@{lG)eNy zmXZpTv_}{MnOazr)^5&_IcYhb=6OXlDLLSgc@PDKnoX*T=_x^`eB|VA9s`@x^WG@# z3S~SR-_wdyPLZiX(j29m@$ys(5D6|haUz^^>c!wgt{|M4tGQ@N{J>ktM*eBsG~{af zALETU!ep|)*BrRKN(IDgVtIm@6ZPPCsMkvZ#P=8`gWZt`Dy4AZ;sq~21$aR=*e+2e zOYHj-BX2Adv$mw=xB}I4aJrO_TJ?uH^*7EmlTxYZ#jjk=k~;B&?iOZ7x@ppZRcy=& zJl$4Wb=Xly`9-TFWNvZEyvHOO@@F8|JU6C8Mwb6WMQo*QrW#^Adg7eifcoY*1;K$H zAaI+ju4b}WQu1m#rH4<1WHd3>Y15APa3hnILvC;drW2L1M5j=6reTNJ;Toz8#V}*x zCoLjAHnmqUl0=yq)_0jEontMC>;}OiA54|QNl@S<-UVZc8ldG7sc3dJU=LK5U7W?U zQ){}$3S!Y$`4bs;nJG{-Bc$G@BpXLQ69h59n5oZ_7UbGixbM6&GU@Q4JFo`|bYjYA zxeRA{Lmt{}8TzAn`qPmyLc*aHZnDuF0{tpT3qnQnF?UR%&3~oV1`G{at7J4E$k|RV zuxHYH7zHlFyy-S39L)G}Ucnsf6t2?Kpq%916$Q&lQXzs9OM6zZO9;JI#IR_Q^a*j? zh)z2{IJQ%4=6n(>&SWI_dxplWxIP_FV2Eofq>b&qPCGVwmpOs##yAkfyimJ>^P~c5 ze*=P8hyy|H)3g+pbc%{pqt{txL`MY54jA#9(pgjB<}`~AT4;>qbNeg~|0hL-r8`5m zLDk$q)5SHeOubSTdh*G)M&uG9l2I6UQGBxP5E36yI7HCEmMl*Tl;-bc% z8#;fAiF0(Ph4%)Tur?P!hNU$+@>|^S!8hCfdHW7+>O=qQC1Uvg) zO<{9%A&;{(uqv|DtUPV1h5}I}J>@16pZc^Jq0y~7BM>s}Z%Hr#6pS*(U5P0dR>h-w z!p&8PQx(UZLyH=8MFu14@l@tcr;Ym%{mMpuo|bD|c4uT3a(Ca3w|T?l28|}4hDRTc YG_)cr%pIL(5Y90kBsN2JN-_R_0mq*ucK`qY literal 0 HcmV?d00001 diff --git a/po/gu.po b/po/gu.po new file mode 100644 index 0000000..70892d7 --- /dev/null +++ b/po/gu.po @@ -0,0 +1,2069 @@ +# translation of glib.master.gu.po to Gujarati +# Ankit Patel , 2005, 2006. +# Ankit Patel , 2007, 2008. +# Sweta Kothari , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.gu\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-09 16:51+0530\n" +"Last-Translator: Sweta Kothari \n" +"Language-Team: Gujarati\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "ઘટક '%s' માટે અનિચ્છનીય લક્ષણ '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ઘટક '%s' નું લક્ષણ '%s' મળ્યું નહિં" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "અનિચ્છનીય ટેગ '%s', ટેગ '%s' ઈચ્છિત" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "અનિચ્છનીય ટેગ '%s' એ '%s' માં" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "માહિતી ડિરેક્ટરીઓ માટે કોઈ માન્ય બુકમાર્ક ફાઈલ મળી નહિં" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' માટેની બુકમાર્ક પહેલાથી જ હાજર છે" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' માટે કોઈ બુકમાર્ક મળી નહિં" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ MIME પ્રકાર વ્યાખ્યાયિત નથી" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ ખાનગી ફ્લેગ વ્યાખ્યાયિત થયેલ નથી" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ જૂથો સુયોજિત નથી" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' નામવાળા કોઈ કાર્યક્રમે '%s' માટે બુકમાર્ક રજીસ્ટર કરી નથી" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec લીટી '%s' ને URI '%s' સાથે વિસ્તારવામાં નિષ્ફળ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' અક્ષર સમૂહમાંથી '%s' માં રુપાંતરણ માટે આધાર નથી" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' માંથી '%s' માટેનો પરીવર્તક ખોલી શકતો નથી" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "રુપાંતર ઈનપુટની બાઇડ શ્રેણી અપ્રમાણીત છે" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "રુપાંતર વખતે ભૂલ: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "ઈનપુટ ના છેડા પર અપૂર્ણ અક્ષર શ્રેણી છે" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ફૈલબેક '%s' ને '%s' કોડના સમૂહમાં પરીવર્તિત કરી શકાતું નથી " + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' કે જે \"ફાઈલ\" યોજના વાપરે છે તે ચોક્કસ URI નથી" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "સ્થાનીય ફાઈલ URI '%s' માં કદાય '#' સમાવિષ્ટ નથી" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' URI અયોગ્ય છે" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' URIનું યજમાનનુ નામ અયોગ્ય છે" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' URI અયોગ્ય બહાર નીકળવાના અક્ષરો ધરાવે છે " + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' પથ નામ એ ચોક્કસ પથ નથી" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "અયોગ્ય યજમાન નામ" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ડિરેક્ટરી ખોલતા ભૂલ: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu બાઈટ \"%s\" ફાઈલ વાંચવા માટે આપવામાં આવતા નથી" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ફાઈલ વાંચતી વખતની ભૂલ: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ફાઇલ \"%s\" એ ઘણી વિશાળ છે" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ફાઈલમાંથી વાંચવામા નિષ્ફળતા: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ફાઈલ ખોલવામાં નિષ્ફળતા : %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ફાઈલની લાક્ષણિકતા મેળવતી વખતે નિષ્ફળતા: fstate() નિષ્ફળ: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ફાઈલ ખોલવામાં નિષ્ફળતા: fdopen() નિષ્ફળ: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ફાઈલ '%s' નું નામ '%s' માં બદલવામાં નિષ્ફળ: g_rename() નિષ્ફળ: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ફાઈલ બનાવવામાં નિષ્ફળતા : %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ફાઈલ '%s' ને લખવા માટે ખોલવામાં નિષ્ફળ: fdopen() નિષ્ફળ: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fwrite() નિષ્ફળ: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fflush() નિષ્ફળ: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fsync() નિષ્ફળ: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ફાઈલ '%s' બંધ કરવામાં નિષ્ફળ: fclose() નિષ્ફળ: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "વર્તમાન ફાઈલ '%s' દૂર કરી શકાઈ નહિં: g_unlink() નિષ્ફળ: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr " '%s' ટેમ્પલેટ અયોગ્ય છે, તે '%s' ધરાવતું નથી" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ટેમ્પલેટ '%s' એ XXXXXX સમાવતું નથી" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' સાંકેતિક કડી વાંચવામાં નિષ્ફળતા: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "સાંકેતિક કડી આધાર આપતી નથી" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' માંથી '%s' માટેનું રુપાંતરક ખોલી શકાયું નહિં: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_10_channe_lread_line_string માં આડી હરોળ માં વાંચી શકાતું નથી" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" +"વાંચવા માટેના બફર(થોડા સમય માટેનું સંગ્રહસ્થાન) માં ઢાંકેલી ન હોય તે માહિતી છોડી દીધેલ છે" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "માધ્યમ અપુર્ણ અક્ષરથી અંત પામે છે" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end માં આડી હરોળ વાંચી શકાતી નથી" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ફાઈલ '%s' ખોલવામાં નિષ્ફળ: open() નિષ્ફળ: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ફાઈલ '%s' નો નકશો કરવામાં નિષ્ફળ: mmap() નિષ્ફળ: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d લીટી પર %d અક્ષરમાં ભૂલ: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "નામ માં અયોગ્ય UTF-8 સંગ્રહપદ્ધતિવાળું લખાણ - માન્ય '%s' નથી" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' એ યોગ્ય નામ નથી" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' એ યોગ્ય નામ નથી: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d લીટી પર ભૂલ: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' નું પદચ્છેદન કરવામાં નિષ્ફળ, કે જે અક્ષર સંદર્ભમાં અંક હોવો જોઈએ (ê ઉદાહરણ " +"તરીકે) - કદાચ અંક ખૂબ લાંબો હોય" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"અક્ષર સંદર્ભ અર્ધવિરામ થી અંત થતો નથી; તમે વસ્તુ શરુ કરવા એમપરસંડ અક્ષર ને વાપરો એમપરસંડ " +"ને & તરીકે લો" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "અક્ષર સંદર્ભ '%-.*s' પરવાનગી આપેલ અક્ષરને એનકોડ કરતો નથી" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "'&;' વસ્તુ ખાલી દેખાય છે: યોગ્ય વસ્તુઓ છે:& " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity નામ '%-.*s' જાણીતુ નથી" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"વસ્તુ નો સેમીકોલન સાથે અંત થતો નથી; ઘણી વખતે એમપરસંડ (&) અક્ષર ચિન્હ વગર તમે વસ્તુ વાપરી " +"શકો છો - એમપરસંડ & તરીકે લો" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "દસ્તાવેજ કોઈ વસ્તુ સાથે શરુ થાય તે જરુરી છે(ઉદાહરણ )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' એ '<' અક્ષર પછી આવતો યોગ્ય અક્ષર નથી; તે કોઈ વસ્તુના નામથી શરુ થતુ નથી" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "અસંગત અક્ષર '%s', વસ્તુ ટેગ '%s' નાં ખાલી ઘટક ને સમાપ્ત કરવા '>' અક્ષર ની આશા છે" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "અસંગત અક્ષર '%s', '%s' વસ્તુના '%s' લાક્ષણિકતા નામ પછી '=' જરુરી છે" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"અસંગત અક્ષર '%s': '%s' વસ્તુના અંતમાં '>' અથવા '/' અથવા પરીમાણનો વિકલ્પ જરુરી છે; તમે " +"કદાય અયોગ્ય અક્ષર લાક્ષણિકતાના નામો વાપર્યો છે" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"અસંગત અક્ષર '%s, '%s' વસ્તુ માટે '%s' લાક્ષણિકતાના મુલ્ય આપતી વખતે બરાબરની નિશાની " +"પછી શરુ થતો અવતરણ ચિહ્ન જરુરી છે" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' એ '%s' વસ્તુનામ પછીનો બંધ કરવાનો યોગ્ય અક્ષર નથી; '>' એ યોગ્ય અક્ષર છે. " + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' વસ્તુ બંધ હતી, અત્યારે એક પણ વસ્તુ ખુલ્લી નથી" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' વસ્તુ બંધ હતી, પણ અત્યારે '%s'એ ખુલ્લી વસ્તુ છે" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "દસ્તાવેજ ખાલી છે અથવા ફક્ત ખાલી જ્ગ્યા ધરાવે છે" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "'<' ચિન્હ વાપરતા પછી દસ્તાવેજનો અણધારી રીતે અંત આવે છે" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "વસ્તુ ખુલ્લી હોવા છતાં દસ્તાવેજનો અણધારી રીતે અંત આવે છે- છેલ્લે ખોલેલ વસ્તુ '%s' છે" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"દસ્તાવેજનો અણધારી રીતે અંત થાય છે, તે અંતિમ ટેગ <%s/> માં કૌંસને બંધ કરતુ ખૂણાનુ ચિન્હ " +"જોવા માગે છે" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "વસ્તુ નામની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "લાક્ષણિકતાના નામની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "વસ્તુની શરુઆતની ટેગમા દસ્તાવેજનો અણધારી રીતે અંત થાય છે." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"લાક્ષણિકતા નામ પછીની બરાબરની નિશાની પછી દસ્તાવેજ નો અણધારી રીતે અંત થાય છે. " +"લાક્ષણિકતાના મુલ્ય નથી" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "લાક્ષણિકતા મુલ્ય અંદર હોવા છતાં દસ્તાવેજ નો અણધારી રીતે અંત થાય છે" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' વસ્તુના બંદ ટેગની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ટિપ્પણી અથવા પ્રક્રિયા સુચનાની અંદર અણધારી રીતે દસ્તાવેજનો અંત થાય છે" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ભાંગી પડેલ ઓબ્જેક્ટ" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "આંતરિક ભૂલ અથવા બગડેલ ઓબ્જેક્ટ" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "મેમરી બહાર" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "પાછળ જવાની મર્યાદાએ પહોંચી ગયા" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "ભાત અંશતઃ જોડણી માટે આધારભૂત વસ્તુઓ સમાવતી નથી" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "આંતરિક ભૂલ" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "શરતો તરીકે પાછળના સંદર્ભો અંશતઃ સરખામણી માટે આધારભૂત નથી" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "પુનરાવર્તન મર્યાદાએ પહોંચી ગયું" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ખાલી શબ્દમાળાઓ માટે કાર્યસ્થળ મર્યાદાએ પહોંચી ગયા" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "નવીલીટી ફ્લેગોનું અયોગ્ય જોડકું" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "અજ્ઞાત ભૂલ" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ભાતના અંતે" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ભાતના અંતે" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "નહિં ઓળખાયેલ અક્ષર અનુસરે છે \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "કેસ-બદલતા એસ્કેપો (\\l, \\L, \\u, \\U) અંહિ માન્ય નથી" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} ગણકમાં નંબરો હદ બહાર છે" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} ગણકમાં ખૂબ મોટી સંખ્યા" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "અક્ષર વર્ગ માટે અંત કરતો ] ગુમ છે" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "અક્ષર વર્ગમાં અયોગ્ય એસ્કેપ ક્રમ" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "અક્ષર વર્ગમાં ક્રમ વિસ્તારની બહાર છે" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "પુનરાવર્તન કરવા માટે કંઈ નથી" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? પછી નહિં ઓળખાતો અક્ષર" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< પછી નહિં ઓળખાતો અક્ષર" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P પછી નહિં ઓળખાતો અક્ષર" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named વર્ગો માત્ર વર્ગમાં જ આધારભૂત છે" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "અંત કરતો ) ગુમ છે" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") એ ખૂલતા ( વિના છે" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R અથવા (?[+-]અંકો ) ને અનુસરતા જ હોવા જોઈએ" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "બિન-હયાત ઉપભાતનો સંદર્ભ" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "ટિપ્પણી પછી ગુમ થયેલ )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "નિયમિત સમીકરણ ખૂબ મોટું છે" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "મેમરી મેળવવામાં નિષ્ફળ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind ગોઠવણ એ નિયમિત લંબાઈ નથી" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( પછી મલીન નંબર અથવા નામ" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "શરતી જૂથ બે કરતાં વધુ શાખાઓ સમાવે છે" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( પછી ઉમેરો ઈચ્છિત છે" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "અજ્ઞાત POSIX વર્ગ નામ" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ક્રમાંકિત ઘટકો આધારભૂત નથી" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ક્રમમાંની અક્ષર કિંમત ખૂબ મોટી છે" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "અયોગ્ય શરત (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C lookbehind ગોઠવણીમાં માન્ય નથી" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "પુનરાવર્તી કોલ અવ્યાખ્યાયિત લુપમાં જઈ શકે" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ઉપભાત નામમાં ગુમ થયેલ અંત કરનાર" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "બે નામવાળી ઉપભાતોને એક જ નામ હોય છે" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "મલીન \\P અથવા \\p ક્રમ" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P અથવા \\p પછી અજ્ઞાત ગુણધર્મ નામ" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ઉપભાત નામ ખૂબ લાંબુ છે (મહત્તમ ૩૨ અક્ષરો)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ઘણાબધા નામવાળી ઉપભાતો (મહત્તમ ૧૦,૦૦૦)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "અષ્ટાંક કિંમત \\377 કરતાં મોટી છે" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE જૂથ એક શાખા કરતાં વધુ સમાવે છે" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE જૂથનું પુનરાવર્તન કરવાનું માન્ય નથી" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "વિચલ NEWLINE વિકલ્પો" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g એ કૌંસવાળા નામ દ્વારા અનુસરવામાં આવતું નથી કે વૈકલ્પિક રીતે કૌંસવાળા બિન-શૂન્ય નંબરથી" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "અનિચ્છનિય પુનરાવર્તન" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "કોડ ઉભરાટ" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "વધુ પડતું કમ્પાઈલીંગ કાર્યસ્થળ" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "પહેલાં-ચકાસાયેલ સંદર્ભવાળી ભાત મળી નહિં" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "નિયમિત સમીકરણ %s સરખાવતી વખતે ભૂલ: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE લાઈબ્રેરી UTF8 આધાર વિના કમ્પાઈલ થયેલ છે" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE લાઈબ્રેરી UTF8 ગુણધર્મો આધાર વિના કમ્પાઈલ થયેલ છે" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "નિયમિત સમીકરણ %s ને કમ્પાઈલ કરવામાં અક્ષર %d આગળ ભૂલ: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "નિયમિત સમીકરણ %s શ્રેષ્ઠ બનાવતી વખતે ભૂલ: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "હેક્ઝાડેસીમલ અંક અથવા '}' ઈચ્છિત છે" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "હેક્ઝાડેસીમલ અંક ઈચ્છિત છે" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "સંજ્ઞાકીય સંદર્ભમાં '<' ગુમ થયેલ છે" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "અપૂર્ણ સંજ્ઞાકીય સંદર્ભ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "શૂન્ય-લંબાઈ સંજ્ઞાકીય સંદર્ભ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "અંક ઈચ્છિત" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "અયોગ્ય સંજ્ઞાકીય સંદર્ભ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "સ્ટ્રે અંત '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "અજ્ઞાત એસ્કેપ ક્રમ" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "બદલી લખાણ \"%s\" નું પદચ્છેદન કરતી વખતે અક્ષર %lu આગળ ભૂલ: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "અવતરણ ચિહ્નવાળુ વાક્ય અવતરણ ચિહ્નથી શરુ થતુ નથી" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "આદેશ વાક્યમાં અથવા બીજા શેલ ચિહ્નિત બંધબેસતા ન હોય તેવા અવતરણ ચિહ્ન" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "લખાણનો '\\' અક્ષર પછી તરત જ અંત આવે છે (લખાણનો '%s' હતુ)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c માટે અવતરણ ચિહ્ન મળે તે પહેલા લખાણનો અંત થાય છે(લખાણ '%s' હતુ)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "વાક્ય ખાલી છે (અથવા તેમાં ફક્ત ખાલી જગ્યા છે)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "બાળ-પ્રક્રિયા માંથી માહિતી વાંચવા માં નિષ્ફળ છે" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr " (%s) બાળપ્રક્રિયા સાથે સંપર્ક માટે પાઈપ બનાવવામાં નિષ્ફળ" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "બાળ પાઈપ (%s)માંથી વાંચવામાં નિષ્ફળ" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ડિરેક્ટરી બદલવામાં નિષ્ફળ(%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr " (%s) બાળપ્રક્રિયા ચલાવવામાં નિષ્ફળ" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "અયોગ્ય કાર્યક્રમ નામ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "દલીલ વેક્ટરમાં %d આગળ અયોગ્ય શબ્દમાળા: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "પર્યાવરણમાં અયોગ્ય શબ્દમાળા: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "અયોગ્ય કામ આપતી ડિરેક્ટરી: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "મદદગાર કાર્યક્રમ (%s) ચલાવવામાં નિષ્ફળ" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"બાળ-પ્રક્રિયામાંથી માહિતી વાંચતી વખતે g_io_channel_win32_poll() માં આવતી અણધારી ભૂલ" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) બાળપ્રક્રિયામાંથી માહિતી વાંચવામાં નિષ્ફળ" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "(%s)બાળપ્રક્રિયામાંથી માહિતી વાંચતી વખતે select() માં આવતી અણધારી ભૂલ" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "(%s) waitpid() માં અાવતી અણાધારી ભૂલ" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) બાળપ્રક્રિયા બનાવવામાં નિષ્ફળ" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\"બાળપ્રક્રિયા ચલાવવામાં નિષ્ફળ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "બાળપ્રક્રિયા (%s)ના ઈનપુટ અથવા આઉટપુટને ફરીથી દિશા આપવામાં નિષ્ફળ" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "બાળપ્રક્રિયા (%s)ની બાળપ્રક્રિયા બનાવવામાં નિષ્ફળ" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "\"%s\" બાળપ્રક્રિયા ચલાવતી વખતની અજ્ઞાત ભૂલ" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "(%s)બાળ pid પાઈપમાંથી જરુરી માહિતી વાંચવામાં નિષ્ફળ" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "અક્ષર UTF-à«® ની સીમાની બહાર" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "પરીવર્તિત ઈનપુટની અંદર અયોગ્ય શ્રેણી" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-૧૬ ની સીમાની બહાર નો અક્ષર" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "વપરાશ:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "મદદ વિકલ્પો:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "મદદ વિકલ્પો બતાવો" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "બધા મદદ વિકલ્પો બતાવો" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "કાર્યક્રમ વિકલ્પો:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "પૂર્ણાંક કિંમત '%s' ને %s માટે પદચ્છેદન કરી શકતા નથી" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "પૂર્ણાંક કિંમત '%s' એ %s માટે મર્યાદા બહાર છે" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "બમણી કિંમત '%s' ને %s માટે પદચ્છેદિત કરી શકતા નથી" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "બમણી કિંમત '%s' જે %s માટે છે તે વિસ્તારની બહાર છે" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "ભૂલ પદચ્છેદન વિકલ્પ %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s માટેની દલીલ ગુમ થયેલ છે" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "અજ્ઞાત વિકલ્પ %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "શોધ ડિરેક્ટરીઓમાં માન્ય કી ફાઈલ શોધી શક્યા નહિં" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "નિયમિત ફાઈલ નથી" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ફાઈલ ખાલી છે" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "કી ફાઈલ વાક્ય '%s' સમાવે છે કે જે કી-કિંમત જોડ, જૂથ, અથવા ટિપ્પણી નથી" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "અયોગ્ય જૂથ નામ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "કી ફાઈલ જૂથ સાથે શરૂ થતી નથી" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "અયોગ્ય કી નામ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "કી ફાઈલ બિનઆધારભૂત અક્ષર સંગ્રહપદ્ધતિ '%s' સમાવે છે" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "કી ફાઈલ પાસે જૂથ '%s' નથી" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "કી ફાઈલ પાસે કી '%s' નથી" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "કી ફાઈલ '%s' કીને કિંમત '%s' સાથે સમાવે છે કે જે UTF-8 નથી" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "કી ફાઈલ '%s' કી સમાવે છે કે જેની પાસે કિંમત છે જે ઈન્ટરપ્રીટ કરી શકાતી નથી." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "કી ફાઈલ '%s' કી સમાવે છે કે જેની પાસે કિંમત છે જે ઈન્ટરપ્રીટ કરી શકાતી નથી." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"કી ફાઈલ '%s' કી જૂથ '%s' માં સમાવે છે કે જેની પાસે કિંમત છે કે જે ઈન્ટરપ્રીટ કરી શકાતી " +"નથી." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "કી ફાઈલ પાસે કી '%s' એ જૂથ '%s' માં નથી" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "કી ફાઈલ એસ્કેપ અક્ષર વાક્યના અંતે સમાવે છે" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "કી ફાઈલ અયોગ્ય એસ્કેપ ક્રમ '%s' સમાવે છે" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "કિંમત '%s' નંબર તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "પૂર્ણાંક કિંમત '%s' એ મર્યાદાની બહાર છે" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "કિંમત '%s' એ અપૂર્ણાંક સંખ્યા તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "કિંમત '%s' બુલિયન તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ને ખૂબ મોટી ગણક કિંમત પસાર કરેલ છે" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "સ્ટ્રીમ પહેલાથી જ બંધ થઈ ગયેલ છે" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "પ્રક્રિયા રદ થઈ ગઈ હતી" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "અયોગ્ય સોકેટ, પ્રારંભ થયેલ નથી" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "રુપાંતર ઈનપુટની બાઇડ શ્રેણી અપ્રમાણીત છે" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "સોકેટ સરનામાં માટે પૂરતી જગ્યા નથી" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "રદ કરી શકાય તેવુ પ્રારંભ આધારભૂત નથી" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "અજ્ઞાત પ્રકાર" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ફાઈલપ્રકાર" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s પ્રકાર" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "સ્ટ્રીમનો-અંત અનિચ્છનીય રીતે જલદી" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "શીર્ષકવીહિન" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ડેસ્કટોપ ફાઈલે Exec ક્ષેત્ર સ્પષ્ટ કરેલ નથી" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "કાર્યક્રમ માટે જરૂરી ટર્મિનલ શોધવામાં અસમર્થ" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "વપરાશકર્તા કાર્યક્રમ રૂપરેખાંકન ફોલ્ડર %s બનાવી શક્યા નહિં: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "વપરાશકર્તા MIME રૂપરેખાંકન ફોલ્ડર %s બનાવી શક્યા નહિં: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "વપરાશકર્તા ડેસ્કટોપ ફાઈલ %s બનાવી શકતા નથી" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s માટે વૈવિધ્યપૂર્ણ વ્યાખ્યા" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ડ્રાઈવર બહાર કાઢો અમલમાં મૂકતું નથી" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ડ્રાઇવ એ eject અથવા eject_with_operation નું અમલીકરણ કરતુ નથી" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ડ્રાઈવ મીડિયા માટે પોલીંગને અમલમાં મૂકતું નથી" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ડ્રાઈવ શરૂ કરો નું અમલીકરમ કરતુ નથી" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ડ્રાઇવ એ બંધ કરોનું અમલીકરણ કરતુ નથી" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem એનકોડીંગ ની આવૃત્તિ %d ને સંભાળી શકાતી નથી" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem એનકોડીંગ માં ટોકનો (%d) ની મેલફોર્મ થયેલ નંબર" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon એનકોડીંગ નાં આવૃત્તિ %d ને સંભાળી શકાતી નથી" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon એનકોડીંગ માં ટોકનો (%d) ની મેલફોર્મ થયેલ નંબર" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon માટે GEmblem એ અપેક્ષિત છે" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "પ્રક્રિયા આધારભૂત નથી" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "સમાવનાર માઉન્ટ અસ્તિત્વમાં નથી" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ડિરેક્ટરી ઉપર નકલ કરી શકતા નથી" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ડિરેક્ટરીને ડિરેક્ટરી ઉપર નકલ કરી શકતા નથી" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "લક્ષ્ય ફાઈલ અસ્તિત્વમાં નથી" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "પુનરાવર્તિત રીતે ડિરેક્ટરીની નકલ કરી શકતા નથી" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "સાંકેતિક કડી આધાર આપતી નથી" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ફાઈલ ખોલવામાં ભૂલ: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "વિશિષ્ટ ફાઇલ ની નકલ કરી શકતા નથી" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "અયોગ્ય સાંકેતિક કડી કિંમત અપાયેલ છે" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "કચરાપેટી આધારભૂત નથી" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ફાઈલ નામો '%c' સમાવી શકતા નથી" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "વોલ્યુમ માઉન્ટ અમલમાં મૂકતું નથી" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "આ ફાઈલ સંભાળવા માટે કોઈ કાર્યક્રમ રજીસ્ટર થયેલ નથી" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ઈન્યૂમેરેટર બંધ થયેલ છે" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ફાઈલ ઈન્યૂમેરેટરને ભરપૂર પ્રક્રિયા છે" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ફાઈલ ઈન્યૂમેરેટર પહેલાથી જ બંધ થયેલ છે" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon એનકોડીંગ ની આવૃત્તિ %d ને સંભાળી શકાતી નથી" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon માટે મેલફોર્મ થયેલ ઇનપુટ માહિતી" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "સ્ટ્રીમ query_info ને આધાર આપતું નથી" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "સ્ટ્રીમ પર પહોંચવાનું આધારભૂત નથી" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ઈનપુટ સ્ટ્રીમ પર કાપવાનું માન્ય નથી" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "સ્ટ્રીમ પર કાપવાનું માન્ય નથી" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ટોકનો (%d) નાં ખોટા નંબર" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "વર્ગ નામ %s માટે પ્રકાર નથી" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "પ્રકાર %s એ GIcon ઇન્ટરફેસ ને અમલમાં મૂકતો નથી" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "પ્રકાર %s એ વર્ગ થયેલ નથી" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "મેલફોર્મ થયેલ આવૃત્તિ નંબર: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "પ્રકાર %s એ GIcon ઇન્ટરફેસ પર tokens() માંથી અમલીકરણ થતુ નથી (_t)" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "આઇકોન એનકોડીંગ ની પૂરી પાડેલ આવૃત્તિ ને સંભાળી શકાતી નથી" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ઈનપુટ સ્ટ્રીમ વાંચનને અમલમાં મૂકતું નથી" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "સ્ટ્રીમને ભરપૂર પ્રક્રિયા છે" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "સોકેટ સરનામાં માટે પૂરતી જગ્યા નથી" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "બિનઆધારિત સોકેટ સરનામું" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "મૂળભૂત સ્થાનિક ડિરેક્ટરી મોનીટર પ્રકાર શોધવામાં અસમર્થ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "અયોગ્ય ફાઈલનામ %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ફાઈલસિસ્ટમ જાણકારી મેળવવામાં ભૂલ: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "રુટ ડિરેક્ટરીનું નામ બદલી શકતા નથી" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ફાઈલનું નામ બદલવામાં ભૂલ: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ફાઈલનું નામ બદલી શકતા નથી, ફાઈલનામ પહેલાથી જ હાજર છે" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "અયોગ્ય ફાઈલનામ" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ફાઈલ ખોલવામાં ભૂલ: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ડિરેક્ટરી ખોલી શકતા નથી" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ફાઈલ દૂર કરવામાં ભૂલ: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ફાઈલને કચરાપેટીમાં નાંખવામાં ભૂલ: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "કચરાપેટી ડિરેક્ટરી %s બનાવવામાં અસમર્થ: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "કચરાપેટી માટે ટોચસ્તરની ડિરેક્ટરી શોધવામાં અસમર્થ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "કચરાપેટી ડિરેક્ટરી શોધવામાં કે બનાવવામાં અસમર્થ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "કચરાપેટી જાણકારી ફાઈલ બનાવવામાં અસમર્થ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ફાઈલને કચરાપેટીમાં મોકલવામાં અસમર્થ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ડિરેક્ટરી બનાવવામાં ભૂલ: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' સાંકેતિક કડી વાંચવામાં નિષ્ફળતા: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "સાંકેતિક કડી બનાવવામાં ભૂલ: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ફાઈલ ખસેડવામાં ભૂલ: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ડિરેક્ટરીને ડિરેક્ટરી ઉપર ખસેડી શકતા નથી" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "બેકઅપ ફાઈલ બનાવટ નિષ્ફળ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "લક્ષ્ય ફાઈલ દૂર કરવામાં ભૂલ: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "માઉન્ટો વચ્ચે ખસેડવાનું આધારભૂત નથી" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "લક્ષણ કિંમત બિન-શૂન્ય જ હોવી જોઈએ" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (શબ્દમાળા ઈચ્છિત)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "અયોગ્ય વિસ્તૃત લક્ષણ નામ" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "વિસ્તૃત લક્ષણ '%s' સુયોજીત કરવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "ફાઈલ '%s' કહેવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (અયોગ્ય સંગ્રહપદ્ધતિ)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ફાઈલ વર્ણનકાર કહેવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (uint32 ઈચ્છિત)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (uint64 ઈચ્છિત)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (બાઈટ શબ્દમાળા ઈચ્છિત)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "સંકેત કડીઓ પર પરવાનગીઓને સુયોજિત કરી શકાતી નથી" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "પરવાનગીઓ સુયોજીત કરવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "માલિક સુયોજીત કરવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "સાંકેતિક કડી non-NULL જ હોવી જોઈએ" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "સાંકેતિક કડી સુયોજીત કરવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "સાંકેતિક કડી સુયોજીત કરવામાં ભૂલ: ફાઈલ સાંકેતિક કડી નથી" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "બદલાવ અથવા પ્રવેશ સમય ને સુયોજન કરતી વખતે ભૂલ: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux સંદર્ભ non-NULL જ હોવી જોઈએ" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux સંદર્ભ ને સુયોજન કરવામાં ભૂલ: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux એ આ સિસ્ટમ પર સક્રિય થયેલ નથી" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "લક્ષણ %s સુયોજીત કરવાનું આધારભૂત નથી" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ફાઈલમાંથી વાંચવામાં ભૂલ: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ફાઈલમાં પહોંચવામાં ભૂલ: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ફાઈલ બંધ કરવામાં ભૂલ: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "મૂળભૂત સ્થાનિક ફાઈલ મોનીટર પ્રકાર શોધવામાં અસમર્થ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ફાઈલમાં લખવામાં ભૂલ: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "જૂની બેકઅપ કડી દૂર કરવામાં ભૂલ: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "બેકઅપ નકલ બનાવવામાં ભૂલ: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "કામચલાઉ ફાઈલનું નામ બદલવામાં ભૂલ: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ફાઈલ કાપવામાં ભૂલ: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ફાઈલ '%s' ખોલવામાં ભૂલ: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "લક્ષ્ય ફાઈલ ડિરેક્ટરી છે" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "લક્ષ્ય ફાઈલ નિયમિત ફાઈલ નથી" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ફાઈલ બાહ્ય રીતે સુધારેલ હતી" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "જૂની ફાઇલને દૂર કરવા દરમ્યાન ભૂલ: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "અયોગ્ય GSeekType પૂરું પાડેલ" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "અયોગ્ય પહોંચ અરજી" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream કાપી શકતા નથી" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "મેમરી આઉટપુટ સ્ટ્રીમનું માપ બદલી શકાય તેમ નથી" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "મેમરી આઉટપુટ સ્ટ્રીમનું માપ બદલવામાં નિષ્ફળ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "માઉન્ટ એ અનમાઉન્ટને અમલમાં મૂકતું નથી" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "માઉન્ટ એ બહાર કાઢોને અમલમાં મૂકતું નથી" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "માઉન્ટ એ unmount અથવા unmount_with_operation નું અમલીકરણ કરતુ નથી" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "માઉન્ટ eject અથવા eject_with_operation નું અમલીકરણ કરતુ નથી" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "માઉન્ટ એ પુનઃમાઉન્ટને અમલમાં મૂકતું નથી" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "માઉન્ટ એ સમાવિષ્ટ પ્રકાર અંદાજિત કરવાનું અમલીકરમ કરતુ નથી" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "માઉન્ટ એ સમાવિષ્ટ પ્રકાર અંદાજિત કરવાનું એકી સાથે અમલીકરણ કરતુ નથી" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "યજમાનનામ '%s' સમાવે છે '[' પરંતુ નથી ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "આઉટપુટ સ્ટ્રીમ લેખનને અમલમાં મૂકતું નથી" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "સ્રોત સ્ટ્રીમ પહેલાથી જ બંધ થઈ ગયેલ છે" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ને સુધારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ને વિપરીત-સુધારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' માટે સેવાનો અહેવાલ નથી" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ને સુધારવા માટે થોડા વખત અસમર્થ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ને સુધારી રહ્યા હોય ત્યારે ભૂલ" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "અયોગ્ય સોકેટ, પ્રારંભ થયેલ નથી" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "અયોગ્ય સોકેટ, દરમ્યાન પ્રારંભ નિષ્ફળ: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "સોકેટ પહેલેથી જ બંધ થયેલ છે" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd માંથી GSocket ને બનાવી રહ્યા છે: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "સોકેટ ને બનાવવામાં અસમર્થ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "અજ્ઞાત પ્રોટોકોલ સ્પષ્ટ થયેલ હતુ" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "સ્થાનિય સરનામાંને મેળવી શકાયુ નહિં: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "દૂરસ્થ સરનામાંને મેળવી શકાયુ નહિં: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "સાંભળી શકાયુ નહિં: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "સરનામાંને બાઇન્ડ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "જોડાણને સ્વીકારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "જોડાઇ રહ્યા હોય ત્યારે ભૂલ: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "જોડાણ પ્રગતિમાં છે" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "જોડાઇ રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "પેન્ડિંગ ભૂલ ને મેળવવામાં અસમર્થ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "માહિતી મેળવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "માહિતી મોકલી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "સોકેટને બંધ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "સોકેટ શરત માટે રાહ જોઇ રહ્યા છે: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "સંદેશો મોકલી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage એ વિન્ડો પર આધારભૂત નથી" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "ભૂલ મેળવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "જોડાણ પર અજ્ઞાત ભૂલ" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "સાંભળનાર પહેલાથી જ બંધ થઈ ગયેલ છે" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "ઉમેરાયેલ સોકેટ બંધ થયેલ છે" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon એનકોડીંગ ની આવૃત્તિ %d ને સંભાળી શકાતુ નથી" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "૧ નિયંત્રણ સંદેશાની ઇચ્છા રાખી રહ્યા છે, %d મળ્યુ" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "ગૌણ માહિતીનો અનચ્છિનીય પ્રકાર" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "એક fd ની ઇચ્છા રાખી રહ્યા છે, પરંતુ %d મળ્યુ\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "મેળવેલ અયોગ્ય fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix માંથી વાંચતી વખતે ભૂલ: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix બંધ કરતી વખતે ભૂલ: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ફાઈલસિસ્ટમ રુટ" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix માં લખતી વખતે ભૂલ: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstract unix ડોમેઇન સરનામાંઓ આ સિસ્ટમ પર આધારભૂત નથી" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "વોલ્યુમ બહાર કાઢોને અમલમાં મૂકતું નથી" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "વોલ્યુમ એ eject અથવા eject_with_operation ને અમલીકરણ કરતુ નથી" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "કાર્યક્રમ શોધી શકતા નથી" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "કાર્યક્રમ લાવતી વખતે ભૂલ: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs આધારભૂત નથી" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "સંડોવણી ફેરફારો win32 પર આધારભૂત નથી" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "સંડોવણી બનાવટ win32 પર આધારભૂત નથી" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "મેમરી બહાર" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "આંતરિક ભૂલ" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "અયોગ્ય યજમાન નામ" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "પરીવર્તિત ઈનપુટની અંદર અયોગ્ય શ્રેણી" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "મહત્તમ માહિતી એરે મર્યાદાએ પહોંચ્યા" + +#~ msgid "do not hide entries" +#~ msgstr "પ્રવેશો છુપાવો નહિં" + +#~ msgid "use a long listing format" +#~ msgstr "લાંબી યાદી બંધારણ વાપરો" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/he.gmo b/po/he.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a7b33798fbce6b62337ea09789ea9541e3a08975 GIT binary patch literal 40383 zcmeI5d6-;Png1`!;;`=t0m3CA>28whbQU1#PC`O90@+BK1SAlvt8RA}sV%jn(}9R= zvZxpqaY4`l5nWd!Mh8X)#bpq6a079j8ATBXoX_{1b8p?Mt`6<=-NVpbGgK5|fcS9dO0FQ;=gLv`&02R-KDV{eD&VjSwDmV{b2FZ%|0GtD# zhBM%yM6UQ2!P#&VRD5rNGvWO(0iTC*Kd#Njw*o4CTcHo%1eLG9g-X|BQ0aXRPKSqL zAxdunBq%QhDH`v3$B#hye*!9S+7k0uMA^&+_ zboO7u@z^JjDZQT!75_yr39p9B;d4;s(n(@fZYkIeZ-t8g8*mXkg2GUIy>JuU?f7%3 z@>)b9R8A$R{N4#qhhKxIz}N9{C0qz^gx5kJPUy1b*#jqHUk4?(1*rVK6)GQhIs1d~ zaO_V))x)z;{{9T*Zvu%?J)8zlgd3pbuL|Yv9q=glX*dBs3Kh=JpbuYy@_#Iaq4-aO zlB+dP@B1CEaJ&O5eV=#sC!yT`7OI~2L%8JcWT^O;LwygR(zgpL{`WzJ^J(bAuS3c8 zZ=llgIx0!_6QKOfgNTH80i+7NtD(aE6g(b22Ic;FNELdor4p2mE-3%2pxo!7+`Sp9 z-ro`VAZ^}Y+r-+Le;?R^bi4}T9O z_m`15z5gJjNWE`DrFY*R8~({q=~)Gd!rKn<>U|6g zQ0e_XJP5u5mG1)=*mO^WhhX0b<-Z@w-8-Ptc^6c=9(DHLK*{e>6!rvo3RL>nLFM-< zh|2Ij>G-tc-W0OZlYsKS2_6cEpvv`HsC2*Az5f(E68l%+c=(jF|0h)a?zhOw!*qB8 z_6woPa~D*8?}f+0$KdhsIY?9T_E~K6c^d4+-Ve`&Ux3m-d!zixqIWi21+Rk&_dD=J z_?jg)zLTKxyA&!tC8&JA6RKRk2q(d(p~~kKsQR0=)XGN|>iczY9Q-g;_+Noa=d+L| z>y2OLc~qHqHk=5rg{qf(pu&3`D!$i|_+#K?sB&Ha4~GMAGTaH3pF7|h_)GY4*u8>p zvO}e#pTZE|2&ceXq2%vDsQkVFCGV40T0Oc3%6=6@g?b-@s?UFeKKvb2I7gmk^W6=V z?@jP1xDy@*cSF_loly1p1*r0P8v5{M_kH5oHk{L-^4ANM{{blXSHP3t2cY!DKS9O! z5+uvs@f1QgOhe`8eNg56b*OxMt8KqB9{N~&q4Y)-CgAO`13m^7?h8=)9Z#Vu-s#YX z=fKlp33kFyLdo}!pwj&!lzbkr)~34+DxQ^4^0E!e-`%hsehVr;FT-iDbDb@x*F%-t zPIxlB8A?tbf;jbl01-VeagI&zHmLHw1x|&ZhAOwGq5QuL6<+&#TQ7^D!rK53ge9o( zE`$5QhoQ>$7Iwj3L#2P>2AiMNP~~?y^x?;#^8W-p0R9Rd0bhhl*MT%nwg1_W zs`Ji-$H7~m()kHU6Y;(e75|Cn+IpK075@%+5WE-8g!jWk;qy@We+l|)%z3f{Yy~p$8WO!Pk~CuSy1H}IQunF?(T#N_aC6-=5Z)_`42b_ z9(|t8S0_|`pAS_&S3tSH11j7vLAn14JPQ69DqV-2Z`)Z9RQ{519=sgN-xnNz0Hxpl z0#zRiUT@uPg@<9k8_NIvQ0?}+(1$NWmFL6@Y`UhyS=i5na(4+-y8afb{vLqJ-!oA8 z-)FOx?@90w>}SE*@bz#!ya6g*_dv<_&!EcTunTRvy5aHIS3$YI7%DwiLdAO{RDAbB zrT=m0!{0a_a*?%nLCNzu@KjiI_Iu!T?EmQOzk>sN(N?!ux!m~%EAKZr-s*UV;|Co- z>iAhGxqismABB>?Z$gUR`w1jyZ$Z+Ie{YA!VE+qL`j6?e^*Rr#U8JDObqJmT?|?_c zAHgHxi%{iuP|B9uJm_QZgU7-v;bizesCXWRDz_g%)#D3r9&ArrdFg|5uwMmdzz3k> zdmgIZyuijc2daI&0Vd#0Q0~77C&Pb-O5c(FHa#6s@_H6jx++lhyc??gAAnQfvv4Xr zaKOs{Y{!jI{)gd-@Gj`XN8n=kEW87@58Cv86{%6;E!kKxS&xfJP^QUkk{1ZG5jxX5!o&uGRRn8v3!?9lqW}XIA=~Wt zX^tzP(wB1fOQGDq3r>O`ckiEsO6PCg_k&9|eN&<0KNBjP3!x9UL&^0!q0;dQXa5>h zzJ3fl;NE2`r=3voZidIh3Y7nwpycqwQ2BZa%Kr;c?#ETEyBV+>`%2geuYz6hQ&8>b zr%>TdtXj^63$d?9_`-48P>;zk;gwsXMH{C2$({ZSZ<{JCxkF58L-^;cV=eK&AI%P~krb zm7W*iTzJAx8{c_Q>ADFjAD@Ft-*e7>)FrllmO}Zz04ltz;X&{osCxelRJy+f4}pJy z3h$6ht-FO#>0AYsuClYg6H0y`f)n5mq0;{+sB|QDS$%VX<5i9yflAMJp!|DpwEEhI zM_`=^kA}^V3dUg7MwLDkR4q2%G)P~q)+nJv$$Q2AXCkA)R@JlqXu!jD4b z^BLF+4|$WFpQNGm&qv?__=ibDi=fKoVyO0Z zHB|Y02+o7whsVLAuXK7B%Kb*D@V7yw^JX{;J_6^%7vV&B%2l>rdZEI*1j_$s;4$zC zsB-=VJRBZ*wXMH4sQjD_*T8qdkHhESPTAjV+usq_SWbgec)tWn{xVScy%S1qo`9#o zKRf%(YpuTB3{{_Rg+6>gR5)LP%J*|n<+As6R`0dJ!>})as^_&({XPo2;bCvF`B?>3&O6~a_z~CxAAvsH z>#c5F1(pA^UmZYvJ{93H%;ZdMEC-{uV>E z?<7?G*FyQf52_x%4OK6{feKHZsPLx4{a_KQ{CB{8;mxoMz6W-~$Ds1_5=_9( zn{4@PhRXjgcmRAiR5{)am97V%+W#}~Z1@6Hy)VAmrt>1W6#I2h@jnh#Z_h);Kjjvy z$2P*5*wgS(cq>%7-2;92Rd^))IaK&B!-L_3cUZmA0VU@vpz3{>dw&m<`$wSs{}?JA ze}pQ}!*8|rIZ*D_LWP@!s)tLUrz_F<^{_yv?68UJou-|M0Lr=h~T3i|Lqco2LH zs@|T0v)~I*?%LmD)3pYw{`#Tv_co~fe-cW*{{}6+v zKimuZ=P==K881$AmOsIBus;aT!~6xKdRQw@{JP;}_xu3%*YivhG{3#vds#k(>A^fA z3%@y-WBA^0Y*uHi#*W(Z9>Uy@IS>0x7skIkchAA)yt@is3opWa-+lWr{5eK)`Wj3- z-%wBH_f`H?xgE^AU%@Syojj|Ku7)o{{Z!Zb?ajNh;K}d~s5bu@jDBjT=b9(xsqixQ zEJ)V+F!x|SjQIv8PZ+0TPQ-j1`{9@&o}Yqh3rU{m!KH8`ri%GJb{}qq`W=9|8?#W~ z;RW!Q@Lw_dU5B~AJlTJa0WV=LcklLtpT@+zYgw?*^W7f_wiqwvs??`fY}c>OEAyyycwh41niRk*TOVBT`yxl z>EatP>-oOZy)VLpuup?KFjw)s7G8)sh35%yJ?3VfUkAhAKk{$}@8UnTksjVvFdKQ! zxsM-$NAa!%i}1JbGT068!u&Hvzh^PSygv;yljmKSFJO+xuHS)sP1jl3M z@w^5T{&u_PLt^jr?FP(0V1_V1!-T(o;on@74=`mtqbyPxhaF=XV;s9y1@)hgpDm z9Y(*Ea0ce<)@s&1ZsGY{_x)1%2lq`F7ki!?dp-$wzrg-9=DnD=Isb>lcVSbC&%6Z6EF%yAoh7&8|)ABAUPvY2Zy8O#ifem7&@f%#8a z+;2NvjyV&*9WIVju($DiHs)gIZn5K)ynB;-7QT#`k2xN*3Zvh5FehM^V%~;Xhbd!@ z#P8oh{r(1%#jf8aa1-VLXSZ*Wb!V^e;%dxKF};{8F!}|ULottIK8sn1N#o~9sNcsh zmt%h;W*6p5*k9HMesi#Y0v?394f7c0+Zg=?NK}rU{+yYfw{@OpUt}|Jio!&---QOnDBQW5ADwKPw>r{ z&A9Dy?}XQ43Yc3lITy~KdA`s+AI$ULxMv={{V`v|{2H?ob2~=A4`O!f0k=1Svz(u; zj_=bqe&ewF@b58i<#`|YUCg1*-7Lpj;0c&*m<;Av+`I;czp3uw3f{fly`S#*M!sF6 zXTLp@-=557(teOn71EjfK!-P_b7sH4>%2Wmm)rwyz26>fqySLcyD-^colBKOUF8SxKUujZHLQ6q1J?sZNGG$iM7Wb7a zswcmi&+PEigK&&1FABeE(PUsU@NvSo@R6b=q5!%(qqiRG~QR zr!%D>RVkE){la$SHnPUujQ*uu49Hp5#1i^Y4g4I z2xQ15Xbhezg)ITqU`w(;lTZ7xl)KkNlFkOEsi>;68AOIcE=xMpellb*Qd9MQLT6Ku zyncVhvRoe;;;(TVq*snP^yLV}*j@JyqN|#QoIx=0TDs(t*cDF5)2^!qdHUI#h{eSlqDu* z>7DX$4iVjIT8l!el&X1jOyI9r9pq@aEAz!_WkUs7&Us6$VEgnzxlA5MWyyR}u`AOx zRV|mUuQEEcpGJ}&kdj4j_AXD%JoVLF%#ArH1^q#Z4p(X`(RngGW4ho}sOg63D{QVR z(xp*n*ffMReYdhn^D-(PujL>|TgevkJ$|l0XOPWom8c9Cs?swwJ+hdi)XFrtTIf*+ zp+e7VDBx3rjO44-HL?IveeF#%(&|4Z;$<(WQ9n)p>5Btk@1Sy(wkWG6_3#qCZ{!mNQW;Gw| zpkF~!sN-b6hEvj(!M18LO9z}8P*S4d6;&T~h0+Q=2v6*lX=r6Jy;yCShn$qFc*Dt?pjEqBPzMheOCgC6mqCBqVHG z8lv4QZ`mY?46~#(GUC}orlvD2wBlyeLtsR~414Rd7OD_pP`S;YQl7D}7OoqlYCLb! z85`8M2b}|*{(KEh7k1QqD7itdhzdgBTsuPg3wflTVnTHnlc@mr&HEKUuC~2pZUSLi zyh64E(&;{9NmD3vuqfyXVVhbDi$?=?b!DUar!mFc)`#LPGs!1dDblv7J#A>}03}Ub znh6;1Gjs#VQqXNRsy}sGwNUBtr)Krffc{Aq3*{bfnGNIrA>Hp%WCj{xr{=Wv)_h?o zPm)nujB2U9+5})(sf0b5N(GGm(H_*R>p_fCwV(SKF1p^xO*dj6RdM<#9pB`&opLn! zpt(%^wTn1E(CvFR+AuA8#kj=1q(d<&)iB2>^x|-{&(T;a_Ay=6m|1yr-CgY4Ku|Hk zDjRmrM62&F#9U;P3}XfrKy2h3`<_c~)kj7@eFY{}bo%+N@y~_rO^S(bO2c`7iX8{Q zDEqZfu~0(Y8D-Bjhb9h8m#d~S%D32Sjr5eXf|&r;idtQFnB>N2qHh{6G*o@vw}xtF z>xrvD6<+k7Ihya}p`q04oQz1P3ziWU)ju*Dw52fr zbt!f4nO8H}PBIl85pcPXH3_!5%Cs>?VzHNX;Yk{U#HbF?QAV;*)eRAqosMrP%kcHc zl4Lw*q`J@MoF&w#$+i~$`sL&v8Y&kDVuiRQ2K6O z(?mqRP$=I?H$ZssY70=Fv1~DGFnW~aNaE}*y+4;q)28ONiG$#zLWXs z{s2?5De0ISjr04{c7$O+?(Z!(F)B;cgr<``)vH#&eM-3_?#_&~jIi1E&~HXA^{I~q ztL}<;C7eW1+6Xk9sMPJ9}(@1QsQtN~LYlGTTw02F#jqavv)SVji z%PcA*A%jU4v-%j$GBY#_(b23WHlMGpd$doTJZtux9y^`d!RkRa=wNMuY9CA%?YzW= zf~8Pkl0qLDt5$XLzWNg-$s)) zdW_6Y7R=4sSr{*Kd@Y~VgieB6r)T>6v(@t8Xn~G&ULMY;#_rnqZ*VRhXH*Z)~)L6xg2+@g;;OJ2D7=cgvBEIl+|`XY8LsTg)c31vIUYZ43)hzQJ1ytlQUWI zGj(m$B9jff;M8_Oo0;5dsj%(BHqWervMQi@Gz)TCY|5w|n%-Cv=W36pW_Oj(NjMEcq6IQs3{ zZ&ZfVb%je59izG)v%@OOp|fX=Aw)Smbxsq9HesyCnH691Rht3Y)*B_V$*5Ol5Petk zZTdoEmar`CN~4?^H50xbbaD~7+ZwQ|+UUwG+9DAnK4=!esEJIlVjG589!sX|6nr{a zt=mZGw_~3)n{gF8&y7Mg(m&nQd*mr5EUxM(NIC_(61v@N%4y`N8EmXDYHox4_Drde zmvq;=u-gT0i(!CWm3)-HAqEc;r)W%Oe4b6g8ATd3F1I8eEz~O^Okbpx8CwS4NFSMS z*WE6rM+Iple57;Lm1)mp+SaeJ*&bLb%`69ML773lRYnYQ5y+s#ke{XD&L(My0<8sO zcIH(h|J#86cj?i}r41pLO%$(`mr)f>a-)K_Wn{DCoF{#8%R-D`wZ3 zB_g{OhZZ%XBLXv{i@s_ix#wnn=y4;V7A1O<#6TRTNpc~q|vnWz1eruB7Y(bN?RXe4UPh9n=wkL zw$UrJhIAT5W|vOc0c8U)wxQM&&8Om9zhT!?>#ZpJxHnT_uTq$9H%r?S%nfvcsQJ$0 z&>-SOrz+XEN?3AH8@j1%8nfiB4aelBMMs)A_TFsSuxH941qKFd?PQ3)zWHF*%oexxIq2XWrJovFFlAOhf;+p-?TMuAGoG`CczQE@q#S zEe&tcUW~WFx)^;1=^Qi(JH9E?n6uv6@;{RYI*qayf2GiB1JK4#Dx?NY*~|14*>fF9 zSnY1C>YrzRUcDoy5~hcXISMuOfZo)sOCGe_kU=1;ri!KX?52T@3MZ`K+Ex3$fMzbm z;MS3?o=~f`+TL`qIl6tgB zemSM1VaBgsm?F>&u#`8N+-_{3-V|v#dox3>JtRVBVC?zATGqnjt(kl(TQx^F+9p$> zgi=ga25Vyu^3#}ZIq-VJ^*0Jh$9JqAFG^pbTMFvhd$mW=&|-VTb5|x%clH%cV;8J! zJH(?qoFzw5Ymcc0vtEEUh=$v>H43e}ZL#A|mVyXbWxK+h%ri5eew_!{ga17_cV%I< za@wQ*8k_C8Q6n(NMbRuq^O(`;h;L>ON3EE`+Jg)Al2SFb9gbQ^=FlVqvt%{Pi7r#k z(X^CdER$=bT_Z1VkA94#?a8^?4E-oV8ztJFcx?<9LDiYLEJ|Qom1D7X3>X^*kMK}n zb%{fZHEm`FaVDCWTdlpb_HFil1MOWl6qrqx^5H&&i#?6Q3MrXz9A7e7AC1fc|naKxLOIMwx zG{@rIuHZHcV?~F4UU~y~~Z!=>zYg7Vtxwhx*>YdUwQNude5rt9P><^tX@TwFTHW@W&PrYe{F#PN! z+w>@iTK&L9C9AzF?F*T80BXKK^Dfb$F+@z5?#GUU2+$0;U`^dL%p=Y<2LQZ{X0oDr zyJ<9a`-jn_rHmx83u2}%cwp_s6l>E(7|jHen*C&hWWH13kHL9=w!pB?PJPGfCv?3D zNl^`{CAd6N5oul)@}}`@VnuAg1>P{5_bynwu6O0yHJzQE7kZmxD_Zmk>Z82POKf-H zG&@z0<;YfFz*tptUgn32#@n1~<`+F@6{yMQ8dDnv1SWlZ{Hn!1<7|uOJzHvfKBM`Pjt?6Sv$ITc)Y#3$d=Fm> zMbE8tGg4B~*^M-BFxZhya~mW_l{92@ zEZek7hmUO|D)Z5fF0Bf0u-X;ThH8%%3ko@o;n}GoJwrYiGJ3Y3Wg`WPRI;uUi5VA? z+PgZU_ilMSnx;xyN5|>S5X)<(IwBR3*?}Cg^D)3+l=7nCX~w*Hol?BH7`1@dw{U&3 zWL1e>n~***7X^?vT{0sXO$sn{K}$4esnxHrXAt>x!ycnoJDR?|(CFL79ERbB{z0j~In_q-Al+7>YV>mxpQvebUdqf*iwtEwCk|4NeHjh0{Y!Q+gh+CVmLv5g z_uXs^s~2QFlcB>1SA|rCHs=&@8AYm5vJTtRO>Lfi+G(EK^>i&<3-YK_T19vcOWR5I zlroz#+cV@KJ4}xda1=aEH{tGta8E8K6ikck4K{n<#6=OMuu;lbjn&m4MqKrsk9&^- zWq!!L7IS8UMpq=8?#=>NM7$^wn%C)WoLP`i<_#q0X=WETtEi{r zfI_aZ^KaURD>Dow?e1v2Ht4Oxl+5g!-qnSQQ>SSc@M;;*az6#FM3lAkt?yp7HW{!* z#2Z}|VSq{$;rdWi{(QBAZM#NTTS$*Sm{EAmR=h(_zx_xxGfrfIi6syCy@yr>;!rdyaaU^=t5@iIl$-ZPhkXDS2Vfr%odv2&37Gq>!P|X6Xw*di|Vb5>h_L&>!P}w?LzE~>XKs*irryme7s7euwr#7dPt9jB)A>VKqUnRVi(Joc}z zIBng!sJ_hXd$%sC+rN+&oiVV*65d*^?OogVtm3pTs?!h~ipyLpGY!-o9cx`wZ(URm zPwm*2!)ZLuz122In(Qoa^hL)uTT-6&d{~S-|jhc-0|trxUm%Tyd~rpwzmk?#jD$QJr&A|Dzl4 z_Bhx7^u9Z%N!@`kbLzY9=6UO)dh?6w_77dRZmN&Css82r!>j6FzMmsWU%nq**}AOm z{-*@3%j)(Zp}k(xa0&cXE^F(5GEqA?sReVE&Rdt&Z3)EwOm^$Cy4!kea^1yiT~>G3 z1Y4KY?cb_xT~=>hR=3xQxJlc(tggR@r~}c=a9fwvTbI@KKeu6^)w-w-ny)A|Mq2g p*<8o4T9?)BpSGS9UT1GzR%aQpby>Z2S-o{xoj+Le|HEbV{|3DvU~&Ke literal 0 HcmV?d00001 diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..72d05d8 --- /dev/null +++ b/po/he.po @@ -0,0 +1,2186 @@ +# translation of glib.HEAD.he.po to Hebrew +# translation of glib.HEAD.po to Hebrew +# translation of glib.HEAD.po to +# translation of glib.HEAD.po to +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER. +# Meir Kriheli , 2002. +# Gil 'Dolfin' Osher , 2002. +# Gil Osher , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD.he\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-06 09:32+0200\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unexpected attribute '%s' for element '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribute '%s' of element '%s' not found" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unexpected tag '%s', tag '%s' expected" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unexpected tag '%s' inside '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "No valid bookmark file found in data dirs" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "A bookmark for URI '%s' already exists" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No bookmark found for URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "No MIME type defined in the bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "No private flag has been defined in bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No groups set in bookmark for URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "No application with name '%s' registered a bookmark for '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Failed to expand exec line '%s' with URI '%s'" + +# *** This file should not be translated to hebrew, please only copy the english text *** +# *** Old hebrew ranslation is commented for backup sake *** +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversion from character set '%s' to '%s' is not supported" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Could not open converter from '%s' to '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Invalid byte sequence in conversion input" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error during conversion: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Partial character sequence at end of input" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Cannot convert fallback '%s' to codeset '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "The URI '%s' is not an absolute URI using the \"file\" scheme" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "The local file URI '%s' may not include a '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "The URI '%s' is invalid" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "The hostname of the URI '%s' is invalid" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "The URI '%s' contains invalidly escaped characters" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "The pathname '%s' is not an absolute path" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Invalid hostname" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error opening directory '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Could not allocate %lu bytes to read file \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error reading file '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" is too large" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Failed to read from file '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Failed to open file '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Failed to get attributes of file '%s': fstat() failed: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Failed to open file '%s': fdopen() failed: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Failed to rename file '%s' to '%s': g_rename() failed: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Failed to create file '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Failed to open file '%s' for writing: fdopen() failed: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Failed to write file '%s': fflush() failed: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Failed to write file '%s': fsync() failed: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Failed to close file '%s': fclose() failed: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Existing file '%s' could not be removed: g_unlink() failed: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' invalid, should not contain a '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' doesn't contain XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Failed to read the symbolic link '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolic links not supported" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Could not open converter from '%s' to '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Can't do a raw read in g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Left over unconverted data in read buffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Channel terminates in a partial character" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Can't do a raw read in g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Failed to open file '%s': open() failed: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Failed to map file '%s': mmap() failed: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error on line %d char %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Invalid UTF-8 encoded text in name - not valid '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is not a valid name " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is not a valid name: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error on line %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Character reference '%-.*s' does not encode a permitted character" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Empty entity '&;' seen; valid entities are: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity name '%-.*s' is not known" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Document must begin with an element (e.g. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" + +# c-format +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' is not a valid character following the close element name '%s'; the " +"allowed character is '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' was closed, no element is currently open" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' was closed, but the currently open element is '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Document was empty or contained only whitespace" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Document ended unexpectedly just after an open angle bracket '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Document ended unexpectedly inside an element name" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Document ended unexpectedly inside an attribute name" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Document ended unexpectedly inside an element-opening tag." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Document ended unexpectedly while inside an attribute value" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Document ended unexpectedly inside the close tag for element '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Document ended unexpectedly inside a comment or processing instruction" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "corrupted object" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "internal error or corrupted object" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "out of memory" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "backtracking limit reached" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "the pattern contains items not supported for partial matching" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "internal error" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "back references as conditions are not supported for partial matching" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "recursion limit reached" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "workspace limit for empty substrings reached" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "invalid combination of newline flags" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "unknown error" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "unrecognized character follows \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numbers out of order in {} quantifier" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "number too big in {} quantifier" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "missing terminating ] for character class" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "invalid escape sequence in character class" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "range out of order in character class" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nothing to repeat" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "unrecognized character after (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "unrecognized character after (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "unrecognized character after (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named classes are supported only within a class" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "missing terminating )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") without opening (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]digits must be followed by )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "reference to non-existent subpattern" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "missing ) after comment" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regular expression too large" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "failed to get memory" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion is not fixed length" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "malformed number or name after (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "conditional group contains more than two branches" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "unknown POSIX class name" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "character value in \\x{...} sequence is too large" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "invalid condition (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "recursive call could loop indefinitely" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "missing terminator in subpattern name" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "two named subpatterns have the same name" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "malformed \\P or \\p sequence" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "unknown property name after \\P or \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern name is too long (maximum 32 characters)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "too many named subpatterns (maximum 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "octal value is greater than \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE group contains more than one branch" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "repeating a DEFINE group is not allowed" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inconsistent NEWLINE options" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g is not followed by a braced name or an optionally braced non-zero number" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "unexpected repeat" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "code overflow" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "previously-checked referenced subpattern not found" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error while matching regular expression %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE library is compiled without UTF8 support" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE library is compiled without UTF8 properties support" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Error while compiling regular expression %s at char %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error while optimizing regular expression %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal digit or '}' expected" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimal digit expected" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "missing '<' in symbolic reference" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "unfinished symbolic reference" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "digit expected" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "illegal symbolic reference" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "unknown escape sequence" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Error while parsing replacement text \"%s\" at char %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Quoted text doesn't begin with a quotation mark" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Unmatched quotation mark in command line or other shell-quoted text" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Text ended just after a '\\' character. (The text was '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Text ended before matching quote was found for %c. (The text was '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text was empty (or contained only whitespace)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Failed to read data from child process" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Failed to create pipe for communicating with child process (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Failed to read from child pipe (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Failed to change to directory '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Failed to execute child process (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Invalid program name: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Invalid string in argument vector at %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Invalid string in environment: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Invalid working directory: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Failed to execute helper program (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Failed to read data from child process (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Unexpected error in select() reading data from a child process (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unexpected error in waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Failed to fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Failed to execute child process \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Failed to redirect output or input of child process (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Failed to fork child process (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unknown error executing child process \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Failed to read enough data from child pid pipe (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Character out of range for UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Invalid sequence in conversion input" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Character out of range for UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Usage:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Help Options:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Show help options" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Show all help options" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Application Options:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Cannot parse integer value '%s' for %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' for %s out of range" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Cannot parse double value '%s' for %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double value '%s' for %s out of range" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Error parsing option %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Missing·argument·for·%s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Unknown option %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Valid key file could not be found in search dirs" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Not a regular file" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "File is empty" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Invalid group name: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Key file does not start with a group" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Invalid key name: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Key file contains unsupported encoding '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Key file does not have group '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Key file does not have key '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Key file contains key '%s' with value '%s' which is not UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Key file contains key '%s' which has value that cannot be interpreted." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Key file contains key '%s' which has a value that cannot be interpreted." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Key file does not have key '%s' in group '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Key file contains escape character at end of line" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Key file contains invalid escape sequence '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Value '%s' cannot be interpreted as a number." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' out of range" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Value '%s' cannot be interpreted as a float number." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Value '%s' cannot be interpreted as a boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Stream is already closed" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operation was cancelled" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "Invalid socket, not initialized" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Invalid byte sequence in conversion input" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "Not enough space for socket address" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Cancellable initialization not supported" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Unknown type" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s filetype" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s type" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unexpected early end-of-stream" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Unnamed" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop file didn't specify Exec field" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Unable to find terminal required for application" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Can't create user application configuration folder %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Can't create user MIME configuration folder %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Can't create user desktop file %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Custom definition for %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "drive doesn't implement eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drive doesn't implement eject or eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "drive doesn't implement polling for media" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "drive doesn't implement start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "drive doesn't implement stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Can't handle version %d of GEmblem encoding" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Malformed number of tokens (%d) in GEmblem encoding" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Can't handle version %d of GEmblemedIcon encoding" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Expected a GEmblem for GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operation not supported" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Containing mount does not exist" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Can't copy over directory" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Can't copy directory over directory" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Target file exists" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Can't recursively copy directory" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolic links not supported" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error opening file: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Can't copy special file" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Invalid symlink value given" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Trash not supported" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "File names cannot contain '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volume doesn't implement mount" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "No application is registered as handling this file" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "File enumerator is already closed" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Can't handle version %d of GFileIcon encoding" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Malformed input data for GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Stream doesn't support query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Seek not supported on stream" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Truncate not allowed on input stream" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Truncate not supported on stream" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Wrong number of tokens (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "No type for class name %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s does not implement the GIcon interface" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is not classed" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Malformed version number: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Type %s does not implement from_tokens() on the GIcon interface" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Can't handle the supplied version the icon encoding" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Input stream doesn't implement read" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Not enough space for socket address" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Unsupported socket address" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Unable to find default local directory monitor type" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Invalid filename %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error getting filesystem info: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Can't rename root directory" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error renaming file: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Can't rename file, filename already exist" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Invalid filename" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Error opening file: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Can't open directory" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Error removing file: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error trashing file: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Unable to create trash dir %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Unable to find toplevel directory for trash" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Unable to find or create trash directory" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Unable to create trashing info file: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Unable to trash file: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error creating directory: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filesystem does not support symbolic links" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error making symbolic link: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Error moving file: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Can't move directory over directory" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Backup file creation failed" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error removing target file: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Move between mounts not supported" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attribute value must be non-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Invalid attribute type (string expected)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Invalid extended attribute name" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error setting extended attribute '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Error stating file '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (invalid encoding)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error stating file descriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Invalid attribute type (uint32 expected)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Invalid attribute type (uint64 expected)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Invalid attribute type (byte string expected)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Cannot set permissions on symlinks" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error setting permissions: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error setting owner: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink must be non-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error setting symlink: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Error setting symlink: file is not a symlink" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error setting modification or access time: %s" + +# c-format +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context must be non-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error setting SELinux context: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is not enabled on this system" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setting attribute %s not supported" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error reading from file: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error seeking in file: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Error closing file: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Unable to find default local file monitor type" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error writing to file: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error removing old backup link: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error creating backup copy: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error renaming temporary file: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error truncating file: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error opening file '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Target file is a directory" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Target file is not a regular file" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "The file was externally modified" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error removing old file: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Invalid GSeekType supplied" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Invalid seek request" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Cannot truncate GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Memory output stream not resizable" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Failed to resize memory output stream" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount doesn't implement \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "mount doesn't implement \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount doesn't implement \"eject\" or \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "mount doesn't implement \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount doesn't implement content type guessing" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostname '%s' contains '[' but not ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Output stream doesn't implement write" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Source stream is already closed" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error resolving '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error reverse-resolving '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "No service record for '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporarily unable to resolve '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error resolving '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Invalid socket, not initialized" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Invalid socket, initialization failed due to: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket is already closed" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creating GSocket from fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Unable to create socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Unknown protocol was specified" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "could not get local address: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "could not get remote address: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "could not listen: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error binding to address: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error accepting connection: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Error connecting: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Connection in progress" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Error connecting: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Unable to get pending error: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error receiving data: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Error sending data: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error closing socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Waiting for socket condition: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Error sending message: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage not supported on windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error receiving message: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Unknown error on connect" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Listener is already closed" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Added socket is closed" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Can't handle version %d of GThemedIcon encoding" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Expecting 1 control message, got %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Unexpected type of ancillary data" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Expecting one fd, but got %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Received invalid fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Error reading from unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Error closing unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filesystem root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Error writing to unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstract unix domain socket addresses not supported on this system" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volume doesn't implement eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume doesn't implement eject or eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Can't find application" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Error launching application: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs not supported" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "association changes not supported on win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Association creation not supported on win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "out of memory" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "internal error" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Invalid hostname" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Invalid sequence in conversion input" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Reached maximum data array limit" + +#~ msgid "do not hide entries" +#~ msgstr "do not hide entries" + +#~ msgid "use a long listing format" +#~ msgstr "use a long listing format" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Character '%s' is not valid inside an entity name" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Empty character reference; should include a digit such as dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Unfinished entity reference" + +#~ msgid "Unfinished character reference" +#~ msgstr "Unfinished character reference" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Invalid UTF-8 encoded text - overlong sequence" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Invalid UTF-8 encoded text - not a start char" + +#~ msgid "file" +#~ msgstr "file" + +#~ msgid "The file containing the icon" +#~ msgstr "The file containing the icon" + +#~ msgid "name" +#~ msgstr "name" + +#~ msgid "The name of the icon" +#~ msgstr "The name of the icon" + +#~ msgid "names" +#~ msgstr "names" + +#~ msgid "An array containing the icon names" +#~ msgstr "An array containing the icon names" + +#~ msgid "use default fallbacks" +#~ msgstr "use default fallbacks" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." + +#~ msgid "File descriptor" +#~ msgstr "File descriptor" + +#~ msgid "The file descriptor to read from" +#~ msgstr "The file descriptor to read from" + +#~ msgid "Close file descriptor" +#~ msgstr "Close file descriptor" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Whether to close the file descriptor when the stream is closed" + +#~ msgid "The file descriptor to write to" +#~ msgstr "The file descriptor to write to" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "Can't load just created desktop file" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "Error creating backup link: %s" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "Too large count value passed to g_input_stream_read_async" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "Too large count value passed to g_input_stream_skip" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "Too large count value passed to g_input_stream_skip_async" + +#~ msgid "Target file already exists" +#~ msgstr "Target file already exists" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "Too large count value passed to g_output_stream_write" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "Too large count value passed to g_output_stream_write_async" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Could not change file mode: fork() failed: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Could not change file mode: chmod() failed: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Could not change file mode: Child terminated by signal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Could not change file mode: Child terminated abnormally" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Conversion from character set `%s' to `%s' is not supported" diff --git a/po/hi.gmo b/po/hi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..022eb3de670003c393c3a002a002c1bd3dec4b6d GIT binary patch literal 63720 zcmd6w37lPJdH)ZJT2nW0tqNX&kO^dlgs>*;Ap|f$$O0>lxVeTE0fM5WH z2xznlv`7uhgiyj(G$0nir7c>QYOSKy+UaU-t95Cm?Z37E@9%luv)+4W?vS9)CnvxA zp7WmPefIZx-*fKF_x9cUrih>G_llx7f`c!KqWzv1MUTHuXQOEDo1^HJ;5_g};NpO1 z1zZLGCg(2-+LwT9z%PPj@X!OI=(oW4fo}qLfV07;K+*pRcrf^a1Ec5^a1Qty zum-*gycRqZ{0P_uJ_VM*AA@fI_cf(yYL!5;AQ z;342Mp?v@ine<#x=P%|zjeiqZ1|J7c1NTR0>7@cnZ?}RAz%PRu|2GigB=Ag7)G1u?g57d2!gSzirP<9vw-wa+4N?-SZ>h~q^)!@H?uLt*nd5!-@ zumsKnb^mfu;}3)KtM`QSzZdYafZqVc-%mn&21-=_gF)H(1W@$KpvJ!Nd$!9(dJzkdYO`M&~DQS@SjRXiULihdasKi7cV8r=_y{y&1^tF+MN zI1SV|W1)Q)_!`=O4(k3NfTH)xKgQ_Afx$^_3V)esByZdR0(*d@m?DcY$vJp9c2>e+Ci?(LN`+oQuGfv`4|y!KXmw zomZTU?!oiHrQl7V=>9GEX7FW93U31Ef|7R`D1NR4CHGz6>%lL92Y}xPrJos#+-@g; zZ=}5u)b*Rd*Mgq_MgOay`1~nI$VCU8iZ6oagZqOY24$Czf%1dzfEw>ri#-kw1EuFP zzS0|BKIcdPjh=%UPi4tpQ&GUI~ic4d9EwKLe%zr@de+Wwc?}EPx{wFBE*?Wca^*T`Teg^fs5j z8PRo zPlI!4|2(u0ywKMer-0(;%kOZ%`>%j6UE}RHgOdM9PFh0{5W{fMd$|nHmLF5 zQ+7EY2l*HMH~&d5tJjiK!FPjKgU^5qz{`3)U+w~NspucTQ^19N14H-QIK z$hF{YATAs|141fV+E1+oJ_y#pQwGSb;KSfW;A_@--roS;M*EMz>%elASOk9nz8BnZ zF)^<7eEuMFG`Ix(0Qf}^mZH@|)cW9Oz{|m&VV_6t1>Z?~Cd^0=cY?D2 z-XqTcDc~~NzXzTJ{s_DuJmHck`rckq^sk`&?~8Tk{}6 z9JtS=&ez%CR@xr}4}snyZvHy$;f+x=4xWNCKLUOq{1|x6Wl{7=@Mwhi68KY4{hmaK ze+T=nz#pLVwkxUCXb-*1^>@%_ay;$(z;}Z)uEJ*ER*<2hmt9RQ!+qC*r_-KGC&{%5 zB!r^-z$M@d-{W|8z?;FdIR8EH1aQu^zRp<>O78nW>1{8Jcp7*vxElN&P;~zTJP$l) zi(kJRJc;%X!TDeh#=Zbt3oZtq08awy7F`MsfIkQ2SMT^er~6mn8MOENsJ92e1M#yR zU_a--xQ)FA@bKH2yTFfv=YX^BaDUhUN}o@FJHhTd-Cw^AiofM|xjw%T@Q`tr>jv;h zuKxgB1HNgy%l$6!K-%8~mx2Ecc7boX8(Lrk+z)&Tlt26fC^?Vb;r!kPs^9bPasNCI z6d%`v?*#YyeYfM4p!EBrfJ^W7{C6*SI_F=CFf+mPz}etC!CBzl;KATmz(c_Q0FMGo z_qjahgR5x24=jU!2g(l@-|v3*UhoXse*=ooLvb>VcO{4mL{EXz=b8tpxxlZ0p9g>U zA@|3%f8hSL&%@05oZksv244HI5XT>Py61wTGY+l?U%89927DKIH24#61vvW=*T)s$ z80{Z|^0(ecU2k`RlJoVS@O-csyq)$o5R*qIJw{A{e+z1y8$Jmy;4>hmi>~}b=j))y zJ^mZu7S4YGJQiI3Dff>XL0m5SA^0SC;}hicy@(MSF9HAg)1H@~`HbuTh|l`GbOHE& z`acQ28$A1S)H>kT!7IRH|H$q9D5&742q9Wfg1lA zP%Y!f*IEUjg4v`+#qH`wFn1_SeA2z+;|Qw8^7!}#D85erHn|GC2iyw2 z=sTV_Zvki0{(Ep8IO8w9T?cp4{$23p;NtK4Jh=*dCG9Ps{NOh52JrQN<@5L5;0I}+ z@;&$SzW}9&p1=0Gu@5|)_B+9~;Dg|NaNmh2!iA#Kz|+8&{EgQUE5HY7-v=%RSO2Zo zJ9mQ1Y0v*V=l5Fh67>V$2=4#)z8|>|Jc0HV;6dQy;9T%;z%Fp#fAF|n2wqEjC-^?_ z@PG94p9TkM&;7pVr{4pm-@gFg3LfxJK2KZ@E~Nc&a3=U;Q2FUKKX5%?1oqIrA3P8I zF4zyw|7X|Ft)TqxtKcf|P5*<}~F|_XlPX+%HJPIuR z-1F=C0k?uja{eiBCHTLf;(GZrK7aiw_%7OS{7Q=oe}Mmw=J>R=+_zpuU-`Cv_T@O8_O;++ z91nA>pgo5}KbX~iaOdb`&TR&-1mDK-v|V8j62z@-o%}pdb;Xu&?XzHs`QJ_}}Zyo2K|j(a%1#G#)B z(0L=reSCfy#}J?Y0+f%e=Cf>eB6u#xdJfzzdILBB>W6SM|2>v-m+<*K@E^gibLi(i z9Ov67|L@fRE@HVyXEty=$nj?G)6dF)T>)`R`#CwF;2aLkh5C7h<0?LX5qwf7`03*4 z4cFfVzJOzpLvf$|IWRQd4X);R9(_*WAZ1!^(B)Uteku41j*B>yBeFk=h4*osMZZhK zg+cH)XwL#09GCI=Eui9bE}vfmp3U)IK36#6pU?2&_)J^p59c_Fa~E?g=W|sj`5EVU z1?PsXMO^@n(LM^?#_?1*|2JTb^M`YE^LZ1;BOI@zt)CYKyw01^kHB|u?vT(v13ZWJ z?V&Bux=lZqf@9zcYvDh%nNIBIqXBOga{g?NZ-;Z=0{7$S<9IX2UR*m4d=4HYszt-w@%Oaf3F_xqj_=tg_GSYPflqMEr_a6MsT}J#uHmR~9Lk}etsEcZ_@Nr% zXB0ezV-fcr6vmiG`v5+l#?c@89UpKL=iV7U3qHkh499PAoX(-2uW`JA<0OvvaxCSj zap-4c+M!D{JG4hQaTUkQX>0DhGIS_|FX8wC#~*Mk;8;VSuYmg5 z$+3ZUgQL!&pZ|1-4x{}zpI^*z3&)>ue3e5#7jf-7;5zWf;FoohpW8UzWS@w8aBZOZ zu5j-8;QitAnc&+wUQ3?~!Q(>TefZqVv4r+199zQq!#G#s^97;(A=-b&5&zuHhl4`n zkHD)r&ZqC3a8B^o9P2rLTaEDZbMUQ!<_tdX9X{*wi#R^V@lPC!IewQzKX-E6$npO; z-p{c(+|wWMBb?LEzO>&6euCp_KJN|wImd5?e%%4D2Vc)Iz|qI?TKfDiNBna@_^^>{ z@8QtTtbmvC`3ik5bybHiEe}@vN|oW>T3>Z|V0JXKXI_74$tjL+33wJ*FZEXkD~(Mf z6@50GHM2geRIQhWYmHL5$+RBe=o%A4%I zwUvSDaH%|8sti_!D#MM^aCxW_bxOIhu9DKNGt6PL7MAShJxG7BRouA%xWotL@TwuvH-HZvr19diOWm1(Nfom7aZDsVPAEi+NhU?#_EmI+DgzV z*9iX}C7refFxQOQTcDz3azD%x_D{sQqQ! zxG!2%9-h@G_0~o0H!1`8 zf7@;%K2jMSs@CNub>*GP}At@shL?9-uo&fHv$Gf z4E}uT;?vGJdvR%Cw8r$pfKmmMbZu0b4olRAE2XtKQ}4Ry)ND$|u9|gh%IM!zTD-B+ zODI+ZL?ae9u@4G%G%yfFlGAYsYHv7eaI@2 z&N_JEEHZV4B#kX?UB&q-X{$V1S>PG9bnqo(wZ_8I!Grp5K>w9TYW0QDVyE$Il=}lm zR%pbNTFBPxhie;#VVR^wRg3k~1;FCbQQGC+-U`(}*#o+0^QCQcGnn_Km4# zmW*M#%Um0%G>ojo@HG=r-(So07%Wr9tP_Du<(#=bR9>%(R6lELEUK9Fhu3E>*Dh_L zCZ;Ks^QD7@*nICm!ESva)lU{kI_rOma>X;pe+t!4|rRMncgW0s46LO?(EjR9Kk5 zSqx$+mOsa7IM2G8#devcXcOUjZO|C@TxBsvC6+mvqbF~ybhqt5jxx_8RTl=Tha6wf zWqi6>lhkwOQL5( zac?qFWwgb3nKeXa&q5{y0DpJTNv`9@WIHf?UPvOr{yuZ7gam=9B#9w+@vXo@!d&nc>a5 zD{_abm$e4rGuM=K+POxjjPHZZvr=_zA_W7#`LnH>>^`n;fs4e6CM+_kcZRbx8G z+2W-Fn`0K36|&vHnz3O8ZP#p8uh@`NQbt_jl#|T_mGfa^!I$%)lLnb*o;+F`ECrvR zQyO4NHnT6&M|FOGpH~=uaYl5SjVO_@gqD+h%BR*+*Ub9tY(J~C%-K91`mJ)wbDtrr z>56gXoJssNT^^~jo|Akk=~1C}+zm@^yiU}hACSnG=v>|CDb0w>DHN# zmYS=3h<3ZKR#_&dF#`lwUVx|QYG-$v$EHTjlbtT9$%geknNZ!$QPthMu2g4J84p=k zW;1Ion&eBGcYNiZGiHa~ie6zPE5o(1fpyK4sn0D+3VveugiQ;J6Gc+nK8dXh7BebZ zisg#8RslO&@${h847*rb3RSh8B@fN%pqUA)%o7fjY1~5x*wxjwcD}}pQN4@}bK5(M z$7PML?X%SBDpr*i#?P_ z2>YS}fA_8S=(Ivl$izFQzB=?CoVI1Cx1>2%kI6Quc6U&0?<~6k z05MUVw;OfV%7fNtP5vF zwzbJpU&gUrHtir)6Ej7o!xyg!RrCHiX7}W#jI#vO zp-3{lZ*N{|Puf%tYFV05M%uSBd}(#GHZ1SX_wZ)`;km&8k4lCU`8H4y$eofx%kF#& zinHvP1XtMSPIlkL2x}6hS_;NW)O<%ZenRd$v)hS{l&hnZ+uB~A<6DEaE!~3H*l?O@hh1CSS1Zg|XO#yj zc6t8jIVsdNTFGd((?iTC?ZPCv7Ap96qqe@nLyE4MeY3@R)AQ8M?VgE0L^~R_xJ~%iQ)(-a@#v%412k z!)l{Ge$1NbP1^3|fdR^uR4AU|h(pTbl&0z^d+S0>n!}Q6)sr=qRA_q}BdY;iKITSYQur^dZ=tZr-rzJAq59P5YPxUfS$rdJyr0nzDcO}Z(H6rB?n+7{7CCeEC<=P*17<;?>M zgL8a^!(89Gn6)K9v~1Dx#Z1RMPh%gH2=z@byj-EDf|Z%&80{o5x;Uf!``r{E1HP?Ik_3fb76=AbC^$Ru~HQA@OU$L&XL9fM?wBr*V0MsKpn?K_(o54(Bep^u+8zo%@ zCuwm#?>%AU5}F;|v_=nDq7~kw{jxB0XhA#sq@^g?%5+bk#RHQ@J<6UEwX^^&UXqdu znQ|p-PJAy+B(d2;ty+4k{Y3drAtlU-cW6X4zJa`{RhMqiBZMjrIc6qS((@+)J``Qp zmi4XpwH3l#i6Lwbd!A6#dbYQzxVNX&wNlS~b)T+jpxIe6*@xn#S*tU-agtj_$(G%v zE=@tc05*qIEG3VB8HlmtDKqY;mwL?g>FZT}W=g>@*;}wo=-hPP%tFYn1volvncSaNklr+Cyn3^eYZ4~(VvD~tn2Hv^vsxYQ z9UQawF=iczL7_5IZmdgd4&*8Ftq#%3cvB4}>75+U<0Hyf9%-@yk?3 zG`!GCrtw`Uk3((@Z(ONU678APVEYARgQVO}_b9ZPw#MsE_IIEx-7c}$?QG@KuZR4T z+&@|OpbO8+eG&F6hV7~(2<#nDGK*y%t4^D)*@GEHG0K{xhh|Bon)IC;;4ENZjdB!$r$gtdJUK< zgPU%svAe{Zh-o&nBF=`%^wows8`}0jx1tA<1%)|Vk|SJ*H+za@g_2BMhgl9=mAw8` zs+30+;lq91wf^qli`mQeAe2cr_fD(5NW5l*sU3gQvP$-{s@3*&nV_>zKoBY6%;dnd zOx1&EvyTecOA4drTMq}m4&+dj^8iK|UUvNx}aQpeZl*n2j*nrv5PxwZP8I+Fs6 zH-S_xNl1Fw>lq~%#-G4Q139Vv<+*%ULX$MCw>1(P=@b08D}`61M%iR(&|hWK4q<#b zc(%xfnMR6jb;7Asn} zThQbl3MPw|I-bO%4O_Nw1A8Z?)|Q(vS_zi5`WdX0hkHc7gYNxfj*3<<^64UE zc1$qHdsu5L)T&zZvOd%>(dyn-_mby4q5AuVSd_0Gpc`IxGYnTYSf1@?+el>bO7?XUH{)AI zU2|tA=fn1RvP@OBPTrBX5-VzzI+7Go-H0FZv_YjG#3%w80-HQWg0UKCWO z6tcFeGPHF06-={bULWOM^3ibJo``CuV9$@~wW(LFw}D@VBvmKbsFKuM=A`n~^N&6{ z3Qq<@6ll|$l!NEQFCgiWi@%=BgNsY6NHDmGtXbh5=sr?u_%Z}v5X&fzrGtNU%fDz5 zhDbOpT7n%*eJ6&hB%h$ed6EokD8A5PFDu}fBZwJZ*5|tsQNo1QKKfFaE!t(AlqWhh zy+@TMXWnH(Ey^$DQtqAqFeir8A5oX`bw&z*RLbf%O6j{>#~EL9c-K&QV|8e3sKm3% zL}1 zfVRX@w3w)Cdsx?_v9w@z6>&!2k)ViUh8B&9lS8AmsUrYvWI|*+Rc2EUv4|~wY|-f zN|eN52oiaL@2X%#924)=Lk=%(RE~9ff^KD}WurCC(cNeCb)V;7(&J@1c4B*m_&z~p zbjI?Ez6#oXR(+t_*L}*^K)rh=$y?y=qcn>VjC@5lv59((BABj?YZv6SJuSCS;^?2l<( zxx9RFg?)?V<>8A-LdT6-^QfZ_KWTt3t`7E)l}_NM;ej#U^6g&9=JJBl>3YMwbexLZ zYEQktXSmWhVTQhqnTj^AXYPzep0B&L{jk7xxDI1euF4zy3QnHN9B6o?E#*DXiFVXWlXZJ0ql-II+p4T&PUe6ITmJRaF&%y4~m<`!e7#^`^{rJP# z^|z15cMZS!_<6Gz&dB`m-Rz0+_e_lMn%KT&VthwwVtnhw_&pQb-#0OS)5P{0CdTiW z7=LnN{OXDETf%p?`82V8bI-*1eG}tP^!WF;)p`8M;<*PVwqKW?t3!L|#Q5XfH8FnO z#Q4Ls@3ny*vfDZPP{h7Yi?hdZ5^k=uYvYgDO}84IaZX)3G5#P8UuGHqH*q!y<&J)tV7EHq;x_Q_f<~D2$*Dd)9S}96oI)(r?+no4< zk$f<(5jR=-y?0X%D&Jz=wg(SRP1j`Y*e-A|o!hcsnGfFPUz;~M2@ZLjXadNOyK(Lz z8uw_CY`AiFBoFuuu%T)=5j_&s)+hHU378W6cRN)nB5H+>W+3@K@7L4@<; zMnNpy>zrY6?vvnlWxS*ps=0iJ=~~Ia2PB@}>vBwtZ}Zy~GJHZo55%``H#QaDsSzXN z3B!?;lt;LDOE8BCm?KNP^!5Y*U z?RFOerntc+g=dVT>@uYQApnrq)we6P8sb2K+zN+HnTjD84x2s^#mtfhQRt(dZ@AOB zkVRWLB2Hog%IZ=o7De<{PRIcFO>Ey{+CXLZ(s^egZMPQQbx7ZbA(8EZ3&ZInv5IB3 zpw%gQaT$|fY0VWh(oD-~c^>-aQ}CYPq*KsLN1i_ET_!?MJj1up%XEp_uWg7;>hrE9 zGenE&%T7cmcEjr*;&DMy7dSdHhxo~>!?si=#)%8Wc5lZykY5TxFK%yT5c4;3hSDC_u!UUgZVLgqC=E}F ziLJ;nA#rgVUAQw$5_VHQmpjSUK^(s`)&WN|`<{C~!h2}Ha&AuJ370+0{FQUEGX1?I zziM7AYVkLpig#zKNoSXv&0jreTISVA!LfadM%8RfLfvK@Y{nULfp@b7lBTaX1h=cq z>U647EdV`6A#?4Dg;c;o1c`|-rN*#Ap(jx~&FQi@hlMzY7DHjV#?TMX7>pk-AtZR zlT|39lFl&zx|NLCQqk-OS*ZEKS}OsoEAR4J1NL-Jx}L~6gmh<|ON;qJj0py{d0gIQ zDxj%pCLTUr4c^dZs5X3=Yoy`Y#6x7^hD40ye20-k@t2f6T!-f;O#oN@RHW%@R&D-$ zKwN{oI|j<>hYFzFXm}kxMVTuhl@RAhB9DnIB;Yke@EAJo20iovy%zO{Um(G_ zD()u`{5Kq#Aab1+mP_csaH^QLV<_4nWTj3f^qQR7y&35Xx)SRd4vi&ecZc=0j1}ij zUu%0!r5&aaOE3qs+6drN(WE&}&@z#mv9GqPFb?OL8sq^k=>3dMgVWjy!4Kur_!tf! z@)`n%5)bbpfp|*sjDtuje{+&TL;jFmI)pM12}AuCh6_=Zj$q!Rj3S>geoW_COOej# zr5!W|vg~Wa<%Cc6M)2C}O5OBjh_>9PhD9g@l&%po9zhMI(hme5_uo2Y!%IWfpSy@i z-xLuE_+rH$GDHZyU7t2w+@;}{_ z=;ct@k3l+IS9_+l0MZTwLJo7AcX>bfk+MCubCoj!YJdEQcZk zy>(hfmF+Q@_KxW{&8Z(`E+>yC9uAgxPdDaOAL%B15FkV$QAFFz}T#f|Qr|z21@M=7RAin^@8U!8GK*^>K2Y1fFuL3|36@X{eQwnGAWE#t>P{kJ!E@VzT03?%!JK zvgHqz4L8{4iEVEO@}bV_E*)ocBpfH@%uW32$;sLF8Vw!Fje@!#bS<+|@XC(}mrv4w z885PS(tgC$zsoB!+CCw>QBdHMoI<3SZd^!bc7ROKI2K!1u5xo5mcixkL4jT*NfSPZ zmMUl`ksCERU*;Ae1Ly24QRQ?#fG1mvIV|_!EEm3bmDKCD5f2QXv!=&_msGa=wcpj5i6*ND(bJZR@f}ca>Td&Z@#?95 zk7vt!k<8V&!vr(eiEGx7z0AFI&I6)pO@~ydNx>*nVLwjb-s;D#3L8k%kn{ktE2m?n z2>nnWAXM`@-Ob%@qalgT^r5^c7xx-I?B2%!nl4)?FQJo*@|@W`+i*%*EeU!2@VXB7 z7(S4M1Pr+Q<68u5ezzeQFlx!ChSyRe-QwbP3li%`?R+bv$kiCb)##gi?xYx;^SGSi z5_@4HRXD*rkyci**$w(EnKT7E*SO(kv!Im4*;q4H%%u_FOD=}N4dmJ3u`>1!DLd`z zIRXxLB+igtY(r=Np=iuPi~MP8AkpdT!Ar$u_Fj$Wig*eEF!>Bw0* z-C=09PO5E4x0f|cJyaX!QsWjL&mx$;k_oBHg_}l56g5Omylt8>r9=|)nd`ARPrGmy z`@1`UGX8EeO^9K0vVd>%YM*kqX%-16H9^;B4=tX_daN-zj&55F;8k$B-7KOKbx#ix zQV2#-xdO`=a?0R}qclY2^lmn{Pt%^_&JzVG;s%wGme+mVMCBz{=G2s7R8&k7j?$ld zXSzt}P|o%d%C-sVjK$%Ux(YOkK{`zW@$aEA-H1pFtWKycfUpw_w=pH6#9I*J{gx!)6*xMBLX>?f%pJP?4x<%K@qnrzD^^rr~*NE zxPxLeNXn<&h|^2oE+=v^JZ`0YvPbA9MHS3iaj}Q!BEBn1VmfK$cO9f96&Ev-*kp`u z5GRbZQ%XP4zk90)zAxO4S%lFUMY7W0SuJ^#x$ zgTEPN_t8B*9>Xw&!#e-Vkg3(CnJSt!PORWS%<7#cE3a5lCY~J90M32CHHw0BGI`@k zC9G*oa^#C?ct~O%CvKW-FxxaLuxG`f3&Zq_GN!*CdsagRsgle<8!f;>&?;Kt(^k~R zR3f%q3)53ZvW8RAv7CeUy<#B8N>Wd?x98qj@HZs5qNNT-s`jtXpwbvC(`}KU%%GGof4FHYnF1)zNa|A3`TGv+HAO(q4cYN7&AC$ z`?8t1LU5@&u1Jg40$voc`2o;7%A)7FB!6MiDonfcGuyd;0Z0^(Q{ zN!@JjnJ5$1U4xTMxT!9tHFj`Jdxn(JR44DAr#QBWQ?vX|#J3l(FlAlN+% zJ)1%DaT>G~a*PX{u=!{vapc0L}B3=#>+EdQKn2A`+`1m zFK*CEXQ|p3l)_&(iDN;wXjxUJa;j1)&WVVxh)-vSnD@ zj}R?E=OS(n`UNGeY#($xjc$_?_`cirWb#ea+|YFV!E^S?rN&OX$=#yP{?9? zXspeiA|=0RA~OT#$KyhFw(@+hh~6`d$QU;7HjUbe5}P9n#)6_cu|o(e+!Y_gLGTCo z@!TPQ^iSqFAq^zN!&K*<9$w|0l4XCC!Q8}rg1ewhHfQt%&uW(G_+C&~h$=Kl(4^!z ztft{l9O|8+ET+tJ}4xu*1U+De2bPW!Qc=jwP*fTP*c)1E0UF< zevPFIrI;3a!yNSDwF>^nO*gCXu#}_(LVu5TR0*IvpT5M2GCRrEZn1*^lSM9=Tx;qB*BpS_wHd??s)wwUBBA!)YeK zgdeo34>RM%EXcGbf7bNL4%%>!mj~NbGcXdNo_SNE$ToJj^e~xdX%xgF=nptSoeOZg znK7Ji1t{4A4`r^2*OE~|xponz(nr>aPkURNzW^2c16|0^H!w*vic+`_#^#MD^X*9z zNZDd+t`j8EfV(ryg=&9+U6tlpy?dJE&Q`+Ornc70MviEghsaK);vbj_evrvqt-~4q zZ+CO!zmR2}Aswci(}2?;W0OKjeyGFcZvVBz)-S%H4F)7TQ@qMXA>XM-qbR>*9khvlSn0%Z+ ztYyU*8dai*=XSlBh3+ADdr1{lOd}+*RR2+72zQ?1+9RHXWGiSsRO*U739r&5n74kI zl6`6ov#p1LCd*_;XZEun{Fggk_$y&%G@GqLQ12OO!k-qKn!1vK1wTgen80zAN-+W! z#YmwfY2!Zb`oUsJfq~n&Ob@g+hpSqNE*@S5NNYcV3wkvX$|d8(&x^yg?iK31Ogvfc zMMN@#zK0pcY}JqOCL)5bbSGVl1ET>H2RW8Siq1(W#(^NZ`8|`4Zj*MLghHO7NCXL) z$KY#sP27Q1QAhe_ofd;QgiU7KHIaq@_s5ZNhr^*5U;1&4rWT2AeGC>a^9$xFjL<~K zDnsa?=`gWI`4^9Zf2)v(x4X^j^?jr^p4~bf1ebtW)b0+<=ODtfp;VAkWKj<8g9>F( zKEoqwx+8hfD|Q&k;3-hi!(`39_e6!{%blF|&?dK#g*W>gjGiFw7s4L5562Bb%AynJ zqREC7mzsR>G3T1F4{j(CxPp9KaR%ew%rmZC7t_C$r*4U4hy|OH9Mv+hO4BsL+}bH$ zVP=Abpd3p}4?+kvu#jLxYB*I9oWdu(7sH_#as2FtD{?0)>C=4%iL*@VE)-D=nMO=t z7Zzkb03V|RT%+II)=cW{-kDySL1;8RR_TdEE}xd#Su|*_*xf`i(#~!wf!lL?qPpiq z0;CcL&w(HaDrbF8xZVTow(-r_tFmmH9P}sX^$P@SSI+-fYBn_nO-9r9h!%m~j=3c;R4 zWxT@~!|TZzx5RpHBl+~TnhJ`XyCX`Qxcz02%qgXi;yTbs@Q$1&LR4}tcryu*stO}D zE%-1wCek#)SajHoBcV&mQ%`YPnWfnZI!s)TaxP>vrihkh5(d{q0GY7qKz}&6mUHQb zXB1~<#tlqx9ePu3DI|X=lkP!Q-;&wN2~YWw)o2AyU>jrN{cxd05@isdm?iG8P39+} z^uf3Jt|p8o_f1t{e}&U_%wQZUs{HA$inaCl*urK_(N#dk<8|~q&|(AZ{-~3)7Z(>+ zR~9)AwT<_IqdmW&Xw$C`dq0e#OT1fj-~ z2MjH}!bk0bS1=HUQ|ZV5oTW`lbuwupOEW-ZlrZ-e|C^=eO$)8;jdDOLGTw@IDk1 zcEWrK5x5I6L(g=0E}6)d>+`$d5|(RW(;k{yvYC?P8a`eyAPwU%O|yX?c$EFngHCid znC(30DW%arg_L%ZCV0=D zcivPt?t4-^cIL4meoj5UC2^lleY~CB(~(?8vao{M$%go}Q8l}z!h2?+v&X%BnTx?I zp((FSohuy#Lli?lLp1BjyG+U*(3!$`#Tm(2!AYF8;!=~#skzg!?R3Vq((*t;nP|ih zygx|KVxCCJL>80j-UOWqov@m0(uCbn1K3&!)7R0L$>hE9!4`u2A`o;VHDC|=9fd8fnncQi2kTt!$skq zHav2R5V}TX$fSocu!X6EzPxzQ23qVU*?vB^wLH+V!#iVVLKu{_k%5YR&+XmSMtq4+jw{c8`> zNh_~5Mgrq>xjQ?)wl@NaB!)1D9-~pMJ45v9zeQfSc9%_fWHGS102e2OXF zjuhO7SERoYBTPIko=Cd8yFSPtAz;${!AR|IMhem;K_w=+TXQVNFTO3{*{S%{+qa2u zQY9=2We(M}aKfkz6EdQ)Vt@8JzJ+Nv`}%V z+EK_a+qX=N?3*JM!cR5DBcV7ZYGsxk|UB6$W~b5`0Tb@3?_9wrFXbpZu3lr>P(AqLZfwVfxite8w`J|DMUltR=wCQ6@Tr{7iGy}tV&ON{hK$LE3bD96 z2R>ToR#e(4sk}APKMoIV1eUuLbSLl6S)Fc{p-pKaQd_eXg2Y{0u4emIc3+FBDUjM> zI%Wi)^*a(ww!w#e2K9A?l7N5Wf*J*}CP{kS=857_i@H`7J&ET=TbM&!9us));Lb3& zqft2Utl44-GHrTDhi4Xxs-3~!iA@8zbwSE&Hs<@Pnj1fLu9gk1?b-B=%CX`lVLCyVdyLF~OR5*K<^k;eG>QL@0 zOt|Pi97@($MoY>$H;GC!d+7~_@I;2ZiUz&Wm(K@SKTLUqr)DVl(6o??M|c0*ISr%S zA(i<#W&55|SKL$=iD10WjXjYnZ-sgC|cG}k?_!u$YBF=2_@Zl5G)pVV)NBsaT6 zm9pf)n#gl{a2~lrY{-Y~fAJ%?!yc22i?-9z)IB;te@FWOZuUh8bMZZ{j9?#hf@O0n z6vPg023xptP-Z(>3+X{pA)9OMQ6Cr=qS}Ej|8LMXy zt-1a}%>d_`_e0zmv+~y1a?+VxATj~-OoZSHT5x-5jb%jOPg=qPP-xa^%!O#1t~NVw zMc&(KEcFi4-K+x@3T>_4N?8cb;4zOumZ=P(n;57SJ;c5vc{zf3Jk z2&DWc-vL(F5T}u;KdibuTue5Z2_wQcPA${4Vg!3^bFI<=H=+;zL>(Mb6$J9-fVuDV zioe_#?oYc((@Hy!W}I9;CCBU^tqrYd)Yeyq>-KFQQ{a;D=VkD!#8vSdO~XhW9GVss z*q7*Ft=W3)$%ol}`k9mko0~1(+wS$Z2*2R(llVkrQI;z|@ltuE{ShX0 zdKN4t9?Kj-1SHf?G&>}-RA+f3Os5z#F{3j}9Ks*S@KGc%r~YW*Lo@n6^f^~Pysa+?C`4DgkeGvKzE;BV9HgSgnIaZ43Y;{ z8CL|;w=rm7iaTv3R!~{)5A@j|@LV%e8yvLxEmio`sw-Om*>Il!f*T%9;E7#CH-3sT z1Wo4T+#Q}#6Ll$rZizOOtBsLrAHxQwc84yym|B6p1`h90CB>{6(w%|1;-RQxR}SRn z#EZ_D{NynJr#Ko5RKfyhQUybWkK>{0JA5I}si60%WlG{hcZhu>-=QCeZ&HO@eZ630 za0wFJt|V&dL8>VDwW*wE()9eO-PI~Z!4EgPixJ=SRaKg!7YaCJ?SL4)NVUuZ2&+9S z=Mj3WxFCM7f4Q**tyodoV#8AW4?AS_u-!mt$2E>pmG21!R@1N#MHIKLL!vT$X&j|NHdnVG zad)0TW>*}Ec<$nB2o(GPZ3yJb#Kb2^fv8V8+ii*&kwr?0RUI#p^|dXYa>22_2sXt` znJQwJal3(c(F>gLxoYxpo+6o*Z%rBFpqL=xEPxPVX5IVtTX|0y{A7PtS$XYC0#Q+A!Nul6EBnb3_p*L^Jqz zw0aQ@TnP`vE|km&tI(bT-!C|YVB%Hm#qQrk;UU2czf2* zl@t8Bq6DTnp^foe2r!+=*Ex+_YU?UEE)0`>5H_T0BP^#U@dj-nnFzNYpVE>06_msw zH~1vw=U zgU)DXm`0F~+fKHaBA_50$HE5L$Qw;~;Iw2#IpBr+-%DrTV8~Vy)hIIpKQ+&Frib zOrY&`9F6EgKxSXGCdn`ZR13el!!mNvlsm7&7tX{`%meb`DBS#5WE)kO6*a;8W}ltS z7;arAv_^I=SF~k zg!I(orZ%na0gHQBpj}PZC=Qb;juP9Z0q<^vq92aTnUyikJ)H|*i*p7uk@8gkcI@VO z-*l*%{byY<%Xkd|(mH9LWCZaDvi(Cpk8_si}f{+WGO((f1US7zD;>giB{uIc4 z8HSY>Tq~#`R1e(i(;eh-5k(8VoI9*YGTFx2&U$fUaP>)(q(^xR-jb>v1;nuc&7x9} zGVE=_R_-F6;4-+Ox0^iXC6pm^XVV?=J+?G0B@GRhI!=z{*3@fcbJe27*$lGNDL}Kl zDJNncB=R)5g*MjS4CHcONOx{L1mFf_#aQE|)ywE?YF|CVrxwh$x+`{~n=K-O)dDaw ze%GQvRV`;4$AUNp9Asq~4}Y<)W4DFdp!7+ps#1{;YCt(P!-lU7DlWJfDp80qG@%Uh zp<3ZCt{0c|*td-UKIxU@D3f(64#OBXndjkZPn0gCnRr%{n+2XRIs$EFAQt~}s$^n? z`(R+srl!cbXIu8sle@QN?s?qfSE8vjw3yxH+nAB1rjO2~xC+PMOKBZwAU9Jk4 zuC7dUCPkZ_nS^K}p|qG<((`yO1o35J9omwg#vT4>d`jBbWlGx48iHX4Nc-bSO*9!9 ztSI)5u&znbZKkOM_Xy!;T;b{=URKXP`sgTjAH++i=Abx_P-&HJRNWRH^3*L14iyZK zt_WD69Qw83OOU z#3GyFke(<5-|{$kV23dW4iB} zl65;#rU`{<9zhc46h%vNl89M@3!W&Y5m&m*A1vr5krq+4Y~`Kgb8td;OMUJSk!1=@ z8$9wx+i;ZX={>2gHLO$2847|(1)D^WTOeeI`|a$m*f(6cHs8l0OuE1nNnA$C!Hrz$ zki=k*CX8T8c+pZ4>RLcHWr)DCYgUdz$F_S(HXy1_mjCikPY*agQa-HL)1oQ#L_e7H z8CstTQW{4p8A@Gd;~l0ZH_`*8`G+&)uGqIUK}qei852uF3~`YFZlp*)dxwySXb@dK zLCL(ar%HMmg;6Q|Nt;qC{scY36Ed3WTF-H5u5! zp)K2ZCCd^&@STP$JaJue0jV=PQIE3icAMy;-ZbQ;M+S*ZO~n z>4j1`c!N()%1tepkDs%rJa(N(&sMi4DI`s!iI8_iT_+y*Ebm+PtnLez3<27TCCCyl znY>+E9oZ?k#!K{!DV?{C2l)hfK@*{-Kuhy#V7@e7ZnC71AsZP{T#s{d)%HZ?o_lm( z2KiE9G;vyt;j^lLCl`SZxGcitB`M}Rg>3A3aZZ<`Gls8V3ke5;FyXP~TkeWWQV(aP e98E`-T-wa>Ow^Djzbcwt2->bvC8y3~_5TAmx^Ia9 literal 0 HcmV?d00001 diff --git a/po/hi.po b/po/hi.po new file mode 100644 index 0000000..764cd8f --- /dev/null +++ b/po/hi.po @@ -0,0 +1,2071 @@ +# translation of glib.master.po to Hindi +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# +# Ravishankar Shrivastava , 2004. +# Rajesh Ranjan , 2005, 2006, 2008, 2009. +# Rajesh Ranjan , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-11 15:59+0530\n" +"Last-Translator: Rajesh Ranjan \n" +"Language-Team: Hindi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' अप्रत्याशित गुण '%s' तत्व के लिए" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' तत्व '%s' का गुण नहीं मिला" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s' अप्रत्याशित टैग, '%s' टैग प्रत्याशित" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "अप्रत्याशित टैग '%s' '%s' के अंदर" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "कोई वैध पुस्तचिह्न आँकड़ा निर्देशिका में नहीं मिला" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "यूआरआई '%s' के लिए पुस्तचिह्न पहले से मौजूद है" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "यूआरआई '%s' के लिए कोई पुस्तचिह्न नहीं मिला" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "कोई MIME प्रकार यूआरआई '%s' के लिए पुस्तचिह्न में परिभाषित नहीं है" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "यूआरआई '%s' के लिए पुस्तचिह्न में कोई निजी फ्लैग परिभाषित नहीं है" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "यूआरआई '%s' के लिए पुस्तचिह्न में कोई समूह सेट नहीं है" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' के नाम से कोई अनुप्रयोग ने '%s' के लिए पुस्तचिह्न पंजीकृत नहीं है" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' एक्स पंक्ति यूआरआई '%s' से फैलाने में विफल रहा" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "वर्ण समूह '%s' से '%s' में परिवर्तन समर्थित नहीं है" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' से '%s' परिवर्तक नहीं खोला जा सका" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "परिवर्तन इनपुट में अवैध बाइट अनुक्रम" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "परिवर्तन के दौरान त्रुटि: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "इनपुट के अंत में आंशिक वर्ण अनुक्रम" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फालबैक '%s' को कोड सेट '%s' में परिवर्तित नहीं कर सका" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"file\" योजना का उपयोग करने वाली यूआरआई '%s' एक निरपेक्ष यूआरआई नहीं है" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानीय फ़ाइल यूआरआई '%s' में एक '#' सम्मिलित नहीं है" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "यूआरआई '%s' अवैध है" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "यूआरआई '%s' का मेजबाननाम अवैध है" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "यूआरआई '%s' में अवैध एस्केप्ड वर्ण सम्मिलित हैं" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "पथनाम '%s' एक निरपेक्ष पथ नहीं है" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "अवैध होस्ट-नाम" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "निर्देशिका '%s' को खोलने में त्रुटि: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr " %lu बाइट आबंटित नहीं किया जा सकता फ़ाइल \"%s\" को पढ़ने हेतु" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फ़ाइल को पढ़ने में त्रुटि: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" फ़ाइल काफी बड़ी है" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "फ़ाइल '%s' से पढ़ने में असफल: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' फ़ाइल खोलने में असफल :%s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "फ़ाइल '%s' की विशेषता ज्ञात करने में असफल: fstat() असफल: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "फ़ाइल '%s': fdopen() खोलने में असफल: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फ़ाइल '%s' को '%s' में नाम बदलने में विफल: g_rename() विफल: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "फ़ाइल '%s' बनाने में असफल: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "फ़ाइल '%s' को लिखने के लिए खोलने में विफल: fdopen() विफल: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फ़ाइल को लिखने में विफल: fwrite() विफल: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फ़ाइल में लिखने में विफल: fflush() विफल: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फ़ाइल में लिखने में विफल: fwrite() विफल: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फ़ाइल बंद करने में विफल: fclose() विफल: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' मौजूदा फ़ाइल हटाया नहीं जा सकता: g_unlink() विफल: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "टैम्पलेट '%s' अवैध है, इसमें '%s' शामिल नहीं है" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "टैम्पलेट '%s' में XXXXXX समाहित नहीं है" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f मे.बा." + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f गी.बा." + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "सिंबालिक लिंक '%s' से प्रसंग पढ़ने में असफल %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "सिंबालिक लिंक समर्थित नहीं है" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' से '%s' परिवर्तक नहीं खोला जा सका: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "यहाँ एक रॉ रीड नहीं कर सकता g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "रीड बफ़र में शेष है अपरिवर्तित बचा हुआ डेटा" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "आंशिक वर्ण में चैनल समाप्त होता है" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "यहाँ एक रॉ रीड नहीं कर सकता - g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "फ़ाइल '%s' खोलने में असफल: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' फ़ाइल चित्रित करने में विफल: mmap() विफल: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "पंक्ति %d वर्ण %d पर त्रुटि:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "नाम में अवैध यूटीएफ़-8 एनकोडेड पाठ - वैध '%s' नहीं" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' कोई वैध नाम नहीं है" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' कोई वैध नाम नहीं है: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "पंक्ति %d: पर त्रुटि %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' के विश्लेषण करने में असफल, जो कि वर्ण संदर्भ के भीतर एक अंक होना चाहिए (उदाहरण " +"के लिए, ê) - शायद अंक काफी बड़ा है" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"वर्ण संदर्भ अर्धविराम चिन्ह के साथ समाप्त नहीं होता है; बहुत संभव है कि आपने एक एम्परसेंड " +"वर्ण का उपयोग किया है पर एक एंटिटी को प्रारंभ करना नहीं चाहते - एम्परसेंड को एस्केप करें " +"ऐसे &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "संप्रतीक संदर्भ '%-.*s' एक अनुमति प्राप्त संप्रतीक को एनकोड नहीं करता" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "खाली एंटिटी '&;' देखा; वैध एंटिटी हैं: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "एंटिटी नाम '%-.*s' ज्ञात नहीं है" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"एंटिटी अर्धविराम पर समाप्त नहीं होता, बहुत संभव है कि आपने एम्परसेन्ड वर्ण का प्रयोग किया " +"है और एक एंटिटी प्रारंभ नहीं करना चाहते- एम्परसेंड को ऐसे एस्केप करें: &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "दस्तावेज़ एक अवयव के नाम से प्रारंभ होना चाहिए (उदाहरण के लिए- <पुस्तक>)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "< के पश्चात आया '%s' एक वैध वर्ण नहीं है; यह अवयव नाम से प्रारंभ नहीं होता" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "'%s' विसम वर्ण, एक '>' संप्रतीक प्रत्याशित रिक्त तत्व टैग '%s' समाप्त करने के लिए" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "विसम वर्ण '%s', प्रत्याशित है एक '=' लक्षण नाम '%s' अवयव '%s' के पश्चात्" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' विसम संप्रतीक, एक '>' या '/' संप्रतीक को '%s' तत्व के आरंभ टैग को खत्म करना " +"प्रत्याशित, या विकल्पतः एक गुण; शायद आपने गुण नाम में एक अमान्य संप्रतीक का प्रयोग किया है" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"पुराना वर्ण '%s', जब विशेषता '%s', अवयव '%s' का मान दिया जाता है तो बराबर चिह्न के " +"बाद एक खुला कोट चिह्न वांछित है" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' एक वैध वर्ण नहीं है क्लोज़ अवयव नाम '%s' के बाद; स्वीकार्य वर्ण है '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "अवयव '%s' बन्द था, कोई अवयव वर्तमान में खुला नहीं है" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "दस्तावेज़ '%s' बन्द था, परन्तु वर्तमान खुला अवयव है '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "दस्तावेज़ खाली था या उसमें सिर्फ श्वेत रिक्ति ही था" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से एक खुला एंगल ब्रेकेट '<' के पश्चात ही हो गया" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से अवयवों के खुला होने पर भी हो गया - '%s' अंतिम खुला हुआ " +"अवयव था" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से हो गया, वांछित था देखना एक क्लोज़ एंगल ब्रेकेट टैग को बन्द " +"करता हुआ <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव नाम के भीतर हो गया" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से विशेषता नाम के भीतर हो गया" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव-खोलने के टैग के भीतर हो गया." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से बराबर के चिह्न के बाद एक विशेषता नाम के पश्चात् हो गया; " +"कोई विशेषता मूल्य नहीं" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से विशेषता मान के भीतर हो गया" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव '%s' हेतु बन्द टैग के भीतर हो गया" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से टिप्पणी या प्रक्रिया निर्देश के भीतर हो गया" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "खराब वस्तु" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "आंतरिक त्रुटि या खराब वस्तु" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "स्मृति के बाहर" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "बैकट्रैकिंग सीमा पहुँच गई" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "प्रारूप में वे वस्तुएँ समाहित हैं जो आंशिक मिलान के लिए समर्थित नहीं हैं" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "आंतरिक त्रुटि" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "प्रति संदर्भ क्योंकि परिस्थिति आंशिक मिलान के लिए समर्थित नहीं है" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "रिकर्सन सीमा समाप्त" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "रिक्त उपस्ट्रिंग के लिए कार्य स्थान सीमा समाप्त" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "न्यूलाइन फ्लैग का अवैध संयोग" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "अज्ञात त्रुटि" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ प्रारूप के अंत में" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c प्रारूप के अंत में" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "अपरिचित वर्ण आता है \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "केस परिवर्तन एस्केप (\\l, \\L, \\u, \\U) यहाँ अनुमति प्राप्त नहीं है" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} क्वांटिफाइर में संख्या क्रमबद्ध नहीं" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} क्वांटिफायर में संख्या बहुत बड़ी" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "अनुपस्थित समाप्त करता ] वर्ण वर्ग के लिए" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "वर्ण वर्ग में अवैध एस्केप शृंखला" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "वर्ण वर्ग में दायरा क्रमबद्ध नहीं" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "दुहराने के लिए कुछ नहीं" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? के बाद अपरिचित वर्ण" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< के बाद अपरिचित वर्ण" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P के बाद अपरिचित वर्ण" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "पोसिक्स नामित वर्ग केवल वर्ग के अंदर समर्थित है" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "समाप्ति चिह्न अनुपस्थित है )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") बिना द्वार के (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R या (?[+-]अंक को जरूर इसके साथ आना चाहिए )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "गैर मौजूद उप प्रारूप का संदर्भ" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "अनुपस्थित ) टिप्पणी के बाद" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "नियमित अभिव्यक्ति काफी बड़ी है" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "स्मृति पाने में विफल" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "लुकबिहाइंड तथ्य स्थिर लंबाई की नहीं है" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "विरूपित संख्या या नाम के बाद (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "गोपनीय समूह में दो शाखाओं से अधिक समाहित है" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "तथ्य इसके बाद प्रत्याशित (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "अज्ञात पोसिक्स वर्ग नाम" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "पोसिक्स कोलेटिंग तत्व समर्थित नहीं है" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} में वर्ण शृंखला काफी बड़ी है" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "अवैध परिस्थिति (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C लुकबिहाइंड तथ्य में स्वीकृत नहीं है" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "पुनरावर्ती आह्वान अनिश्चित काल के लिए लूप कर सकता है" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "उप प्रारूप नाम में अनुपस्थित टर्मिनेटर" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "दो नाम उप प्रारूप के पास समान नाम हैं" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "विरूपित \\P या \\p शृंखला" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P या \\p के बाद अज्ञात गुण नाम" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "उप प्रारूप नाम काफी बड़ा है (अधिकतम 32 वर्ण का)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "कई नामित उप प्रारूप (अधिकतम 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "ओक्टल मान से बड़ा है \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "परिभाषा समूह में एक से अधिक शाखाएँ हैं" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "किसी परिभाषा समूह को दुहराना स्वीकृत नहीं है" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "असंगत न्यूलाइन विकल्प" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g कोष्ठित नाम के बाद नहीं आता है या वैकल्पिक रूप से कोष्ठित गैर शून्य संख्या" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "अप्रत्याशित दुहराव" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "कोड अतिप्रवाह" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "ओवररैन कंपाइलिंग कार्यस्थान" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "पहले से जाँचे गए संदर्भित उप प्रारूप नहीं मिला" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "नियमित अभिव्यक्ति %s मिलान के दौरान त्रुटि: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE लाइब्रेरी को बिना UTF8 समर्थन के कंपाइल किया गया है" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE लाइब्रेरी को बिना UTF8 गुण समर्थन के कंपाइल किया गया है" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "नियमित अभिव्यक्ति %s को वर्ण %d पर कंपाइल करने के दौरान त्रुटि: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "नियमित अभिव्यक्ति %s के अनुकूलित किए जाने के दौरान त्रुटि: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "हेस्काडेसीमल अंक या '}' प्रत्याशित" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "हेस्काडेसीमल अंक प्रत्याशित" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "अनुपस्थित '<' सांकेतिक संदर्भ में" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "अपूर्ण सांकेतिक संदर्भ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "शून्य लंबाई सांकेतिक संदर्भ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "अंक प्रत्याशित" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "अवैध सांकेतिक संदर्भ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "स्ट्रे फाइनल '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "अज्ञात एस्केप शृंखला" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "प्रतिस्थापन पाठ \"%s\" को %lu पर विश्लेषण के दौरान त्रुटि: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "कोटेड पाठ कोटेशन चिह्न के साथ प्रारंभ नहीं होता" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "कमांड पंक्ति में मेल नहीं खाते कोटेशन चिह्न या अन्य शैल-कोटेड पाठ" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ का अंत सिर्फ '\\' वर्ण के बाद हो गया. (पाठ था '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr " %c हेतु मैचिंग कोट से पहले पाठ अंत पाया. (पाठ था '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ खाली था (या उसमें सिर्फ श्वेत रिक्ति ही था)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "संतति प्रक्रिया से डेटा पढ़ने में असफल" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "संतति प्रक्रिया (%s) से संचारण हेतु पाइप बनाने में असफल" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "संतति पाइप (%s) से पढ़ने में असफल" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "निर्देशिका '%s' (%s) पर बदलने में असफल" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "संतति प्रक्रिया (%s) कार्यान्वित करने में असफल" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध प्रोग्राम नाम: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d पर तर्क सदिश में अवैध स्ट्रिंग: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरण में अवैध स्ट्रिंग: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्यशील निर्देशिका: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "हेल्पर प्रोग्राम (%s) कार्यान्वित करने में असफल" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "एक संतति प्रक्रिया से डेटा पढ़ने में g_io_channel_win32_poll() में अप्रत्याशित त्रुटि" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "संतति प्रक्रिया (%s) से डेटा पढ़ने में असफल" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "एक संतति प्रक्रिया (%s) से चुनें() पढ़ने का डेटा में अप्रत्याशित त्रुटि हुई" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) में अप्रत्याशित त्रुटि" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) फॉर्क करने में असफल" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "संतति प्रक्रिया \"%s\" (%s) कार्यान्वित करने में असफल" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "आउटपुट या संतति प्रक्रिया (%s) के इनपुट को अनुप्रेषित करने में असफल" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "संतति प्रक्रिया (%s) फॉर्क करने में असफल" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "संतति प्रक्रिया \"%s\" कार्यान्वित करने में अज्ञात त्रुटि" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "संतति पीआईडी पाइप (%s) से पर्याप्त डेटा पढ़ने में असफल" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "यूटीएफ-8 हेतु वर्ण सीमा से बाहर" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "परिवर्तन इनपुट में अवैध अनुक्रम" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "यूटीएफ-16 हेतु वर्ण सीमा से बाहर" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "प्रयोग:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[विकल्प...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "मदद विकल्प:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "मदद विकल्प दिखाएँ" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "सभी मदद विकल्प दिखाएँ" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "अनुप्रयोग विकल्प:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "पूर्णांक मान '%s' को %s के लिए विश्लेषण नहीं कर सकता" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "पूर्णांक मान '%s' %s के लिए दायरा के बाहर है" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' दोहरे मान का विश्लेषण %s के लिए नहीं कर सकता है" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' दोहरा मान %s के लिए परिसर से बाहर है" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s विकल्प विश्लेषण में त्रुटि" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s के लिए गुम तर्क" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "अनजान विकल्प %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "खोज निर्देशिका में वैध कुंजी फ़ाइल नहीं मिल सका" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "एक सामान्य फ़ाइल नहीं" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "फ़ाइल खाली है" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"कुंजी फ़ाइल में '%s' पंक्ति समाहित है जो कि एक कुंजी मान जोड़ा, समूह, या टिप्पणी नहीं है" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "अवैध समूह नाम: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "कुंजी फ़ाइल एक समूह के साथ शुरू नहीं होता" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "अवैध कुंजी नाम: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "कुंजी फ़ाइल में असमर्थित एनकोडिंग '%s' समाहित है" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "कुंजी फ़ाइल में '%s' समूह नहीं है" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "कुंजी फ़ाइल में '%s' कुंजी नहीं है" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "कुंजी फ़ाइल में '%s' कुंजी समाहित है '%s' मान के साथ जो UTF-8 नहीं है" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "कुंजी फ़ाइल में '%s' कुंजी है जिसके मान का विश्लेषण नहीं किया जा सकता." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "कुंजी फ़ाइल में '%s' कुंजी है जिसमें स्थित मान का विश्लेषण नहीं किया जा सकता है." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "कुंजी फ़ाइल में '%s' कुंजी है '%s' समूह में जिसके मान का विश्लेषण नहीं किया जा सकता." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "कुंजी फ़ाइल में '%s' कुंजी नहीं है '%s' समूह में" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "कुंजी फ़ाइल में पंक्ति के अंत में एस्केप संप्रतीक रहता है" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "कुंजी फ़ाइल में '%s' अमान्य शृंखला समाहित है" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मान्य '%s' को एक संख्या की तरह नहीं विश्लेषित किया जा सकता." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "पूर्णांक मान '%s' दायरा के बाहर है" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मान '%s' को एक फ्लोट संख्या की तरह नहीं विश्लेषित किया जा सकता." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मान '%s' को बुलियन के तौर पर विश्लेषित नहीं किया जा सकता." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "बड़ी गणना मान को %s में भेजा गया" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "धारा पहले से बंद है" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "ऑपरेशन रद्द था" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "अवैध सॉकेट, आरंभीकृत नहीं" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "परिवर्तन इनपुट में अवैध बाइट अनुक्रम" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "सॉकेट पता के लिए पर्याप्त स्थान नहीं" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "रद्द करने योग्य आरंभीकरण समर्थित नहीं है" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "अज्ञात प्रकार" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s फ़ाइल प्रकार" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s प्रकार" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "अप्रत्याशित स्ट्रीम का समय से पहले अंत" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "बेनाम" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "डेस्कटॉप फ़ाइल एक्स क्षेत्र को निर्दिष्ट नहीं करता है" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "अनुप्रयोग के लिए जरूरी टर्मिनल ढूँढ़ने में असमर्थ" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "उपयोक्ता अनुप्रयोग विन्यास फ़ोल्डर %s नहीं बना सकता है: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "MIME विन्यास फ़ोल्डर %s नहीं बना सकता है: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "उपयोक्ता डेस्कटॉप फ़ाइल %s नहीं बना सकता है" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s के लिए मनपसंग परिभाषा" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ड्राइव बाहर करें कार्यान्वित नहीं करता है" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ड्राइव बाहर निकालने या eject_with_operation को लागू नहीं करता है" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ड्राइव मीडिया प्रोफ़ाइलिंग कार्यान्वित नहीं करता है" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ड्राइव आरंभ करें कार्यान्वित नहीं करता है" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ड्राइव रोकें को कार्यान्वित नहीं करता है" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem एन्कोडिंग में (%d) टोकन की विरूपित संख्या" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon एन्कोडिंग में (%d) टोकन की विरूपित संख्या" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon के लिए एक GEmblem प्रत्याशित" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ऑपरेशन समर्थित नहीं है" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "समाहित करने वाला माउंट मौजूद नहीं है" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "निर्देशिका पर नक़ल नहीं कर सकता है" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "निर्देशिका पर निर्देशिका नक़ल नहीं कर सकता है" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "लक्ष्य फ़ाइल मौजूद है" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "निर्देशिका पुनरावर्ती रूप से नक़ल नहीं कर सकता है" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "सिंबालिक लिंक समर्थित नहीं है" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "फ़ाइल खोलने में त्रुटि: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "विशेष फ़ाइल नक़ल नहीं कर सकता है" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "अवैध सांकेतिक कड़ी प्रदत्त मान" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "रद्दी समर्थित नहीं है" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "फ़ाइल नाम में '%c' नहीं हो सकता है" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "आवाज माउंट लागू नहीं कर सकता है" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "इस फ़ाइल के नियंत्रण के रूप में कोई अनुप्रयोग पंजीकृत नहीं है" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "इन्यूमेरेटर बंद है" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "फ़ाइल इन्यूमेरेटर में बचा ऑपरेशन है" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "फ़ाइल इन्यूमेरेटर पहले से बंद है" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon के लिए विरूपित इनपुट आँकड़ा" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "स्ट्रीम query_info का समर्थन नहीं करती है" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "प्राप्ति स्ट्रीम पर समर्थित नहीं है" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "कटान इनपुट स्ट्रीम पर समर्थित नहीं है" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "कटान स्ट्रीम पर समर्थित नहीं है" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "(%d) टोकन की गलत संख्या" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "%s वर्ग नाम के लिए कोई प्रकार नहीं" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s प्रकार GIcon अंतरफलक लागू नहीं करता है" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s प्रकार वर्गीकृत नहीं है" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "विरूपित संस्कण संख्या: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s प्रकार from_tokens() को GIcon अंतरफलक पर लागू नहीं करता है" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "प्रतीक एन्कोडिंग का दिया संस्करण नियंत्रित नहीं कर सकता है" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "इनपुट स्ट्रीम पठन लागू नहीं कर सकता है" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "स्ट्रीम के पास बची ऑपरेशन है" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "सॉकेट पता के लिए पर्याप्त स्थान नहीं" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "असमर्थित सॉकेट पता" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "तयशुदा स्थानीय निर्देशिका मॉनिटर प्रकार ढूँढ़ने में असमर्थ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "अवैध फ़ाइलनाम: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "फ़ाइलतंत्र सूचना पाने में त्रुटि: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "रूट निर्देशिका का नाम नहीं बदल सकता है" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "फ़ाइल का नाम बदलने में त्रुटि: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "फ़ाइल का नाम नहीं बदल सकता है, फ़ाइलनाम पहले से मौजूद है" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "अवैध फ़ाइलनाम" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "फ़ाइल खोलने में त्रुटि: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "डैरक्टरी नहीं खोल सकते है" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "फ़ाइल हटाने में त्रुटि: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "फ़ाइल रद्दी में भेजने में त्रुटि: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "रद्दी निर्देशिका %s बनाने में असमर्थ: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "रद्दी के लिए उच्च स्तरयी निर्देशिका ढूँढ़ने में असमर्थ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "रद्दी निर्देशिका ढूँढ़ने और बनाने में असमर्थ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "रद्दी सूचना फ़ाइल बनाने में असमर्थ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "फ़ाइल रद्दी में भेजने में असमर्थ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "निर्देशिका बनाने में त्रुटि: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "सिंबालिक लिंक '%s' से प्रसंग पढ़ने में असफल %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "सांकेतिक कड़ी बनाने में त्रुटि: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "फ़ाइल खिसकाने में त्रुटि: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "निर्देशिका पर निर्देशिका नहीं खिसका सकता है" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "बैकअप फ़ाइल निर्माण विफल" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "लक्ष्य फ़ाइल हटाने में त्रुटि: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "माउंट के बीच खिसकाना समर्थित नहीं" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "विशेषता मान को जरूर रिक्त होना चाहिए" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "अवैध विशेषता प्रकार (स्ट्रिंग प्रत्याशित)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "अवैध विस्तारित विशेषता नाम" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "विस्तारित विशेषता '%s' सेट करने में त्रुटि: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' फ़ाइल व्यक्त करने में त्रुटि: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (अवैध एन्कोडिंग)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "फ़ाइल विवरणकर्ता व्यक्त करने में त्रुटि: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "अवैध विशेषता प्रकार (uint32 प्रत्याशित)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "अवैध विशेषता प्रकार (uint64 प्रत्याशित)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "अवैध विशेषता प्रकार (बाइट स्ट्रिंग प्रत्याशित)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "सिमलिंक पर अनुमति सेट नहीं कर सकता है" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "अनुमति सेट करने के दौरान त्रुटि: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "स्वामी सेट करने के दौरान त्रुटि: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "सांकेतिक कड़ी जरूर रिक्त होनी चाहिए" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "सांकेतिक कड़ी की सेटिंग में त्रुटि: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "सांकेतिक कड़ी की सेटिंग में त्रुटि: फ़ाइल एक सांकेतिक कड़ी नहीं है" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "रूपांतरण या पहुँच समय सेट करने के दौरान त्रुटि: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux संदर्भ जरूर शून्येतर होना चाहिए" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux संदर्भ सेटिंग के दौरान त्रुटि: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux इस तंत्र पर समर्थित नहीं है" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "विशेषता %s की सेटिंग समर्थित नहीं है" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "फ़ाइल से पढ़ने के दौरान त्रुटि: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "फ़ाइल से प्राप्त करने में त्रुटि: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "फ़ाइल बंद करने में त्रुटि: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "तयशुदा स्थानीय फ़ाइल मॉनिटर प्रकार ढूँढ़ने में असमर्थ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "फ़ाइल में लिखने में त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "पुराने बैकअप कड़ी हटाने में त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "बैकअप की नक़ल बनाने में त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "अस्थाई फ़ाइल का नाम बदलने में त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "फ़ाइल काटने में त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' फ़ाइल खोलने में त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "लक्ष्य फ़ाइल एक निर्देशिका है" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "लक्ष्य फ़ाइल एक सामान्य फ़ाइल नहीं है" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "यह फ़ाइल बाह्य स्तर पर रूपांतरित था" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "पुरानी फ़ाइल हटाने में त्रुटि: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "अवैध GSeekType की आपूर्ति" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "अवैध प्राप्ति आग्रह" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream काट नहीं सकता है" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "स्मृति आउटपुट स्ट्रीम का आकार बदलना संभव हीं" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "स्मृति आउटपुट स्ट्रीम का आकार बदलने में विफल" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "माउंट अनमाउंट लागू नहीं करता है" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "माउंट बाहर करें लागू नहीं करता है" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "आरोह आरोह या unmount_with_operation क लागू नहीं करता है" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "आरोह बाहर निकालें या eject_with_operation क लागू नहीं करता है" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "माउंट रिमाउंट लागू नहीं करता है" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "माउंट अंतर्वस्तु प्रकार गेसिंग लागू नहीं करता है" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "माउंट तुल्यकालित अंतर्वस्तु प्रकार गेसिंग लागू नहीं करता है" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "मेजबाननाम में '%s' शामिल है '[' but not ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "आउटपुट स्ट्रीम लेखन लागू नहीं करता है" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "स्रोत स्ट्रीम पहले से बंद है" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' को हल करने में त्रुटि: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' के विलोम समाधान में त्रुटि: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' के लिए कोई सेवा रिकार्ड नहीं" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "अस्थायी रूप से '%s' हल करने में असमर्थ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' हल करने में त्रुटि" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "अवैध सॉकेट, आरंभीकृत नहीं" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "अवैध सॉकेट, इसके कारण आरंभीकरण विफल: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "सॉकेट पहले से बंद है" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd से GSocket बना रहा है: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "सॉकेट बनाने में असमर्थ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "अज्ञात प्रोटोकॉल निर्दिष्ट किया गया था" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "स्थानीय पता नहीं पा सका: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "दूरस्थ पता नहीं पा सका: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "सुन नहीं सका: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "पता में बांधने में त्रुटि: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "कनेक्शन स्वीकार करने में त्रुटि: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "कनेक्ट करने में त्रुटि: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "कनेक्शन प्रगति में" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "कनेक्ट करने में त्रुटि: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "स्थगित त्रुटि पाने में असमर्थ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "आंकड़ा पाने में त्रुटि: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "आंकड़ा भेजने में त्रुटि: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "सॉकेट बंद करने में त्रुटि: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "सॉकेट स्थिति के लिए प्रतीक्षारत: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "संदेश भेजने में त्रुटि: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage विंडोज पर समर्थित नहीं" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "संदेश पाने में त्रुटि: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "कनेक्ट करने पर अज्ञात त्रुटि" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "श्रोता पहले से बंद है" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "जोड़ा गया सॉकेट बंद है" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 नियंत्रण संदेश की आशा कर रहा है, %d पाया" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "सहायक आंकड़ा का अप्रत्याशित प्रकार" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "किसी एक fd की आशा कर रहा है, लेकिन %d पाया\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "अवैध fd पाया" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "यूनिक्स से पढ़ने में त्रुटि: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "यूनिक्स बंद करने में त्रुटि: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "फ़ाइलतंत्र रूट" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "यूनिक्स में लिखने में त्रुटि: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "इस तंत्र पर अमूर्त unix डोमेन सॉकेट पता समर्थित नहीं" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "आवाज बाहर करें लागू नहीं करता है" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "आयतन बाहर करें या eject_with_operation को लागू नहीं करता है" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "अनुप्रयोग ढूँढ़ नहीं सकता है" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "अनुप्रयोग लॉन्च करने में त्रुटि: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "यूआरआई समर्थित नहीं" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 पर संगठन परिवर्तन समर्थित नहीं" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 पर संगठन निर्माण समर्थित नहीं" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "स्मृति के बाहर" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "आंतरिक त्रुटि" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "अवैध होस्ट-नाम" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "परिवर्तन इनपुट में अवैध अनुक्रम" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "अधिकतम आँकड़ा सरणी सीमा पर पहुँचा" + +#~ msgid "do not hide entries" +#~ msgstr "प्रविष्टि मत छुपाएँ" + +#~ msgid "use a long listing format" +#~ msgstr "लंबी सूची प्रारूप का प्रयोग करें" + +#~ msgid "[FILE...]" +#~ msgstr "[फ़ाइल...]" diff --git a/po/hr.gmo b/po/hr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6590988d36e9ce2ff10d8fcbf3fd7acd4fcebf19 GIT binary patch literal 15675 zcmd6tdyHIHeaCOZ+q?Cp;YR~$KRcM&-tC-`Mu8Xcg}q8buau~kI#tqHrlf<@Vq|&AA1S^@%iz~Jnxsm zpMV#^(>pxR2fqlu9(?7?J?|E9C%7Mc2;2vL0^ALL8Qcp#2fhn@(JMU9fHUA-;632y z!B2vV;NDky-Ygh^H-o=ZeE&MAdH)SO37&tIoA*iZ0N)qa87RI!2Wq~n;M>6;g7e^u z-s0xD9bDr3GAR8%4ITlnd#mT&2i^&a&f}oyd==FE&w*P1e}bBCFG|=0o&{miTLn>t z_Zd)h{uumA@JHYp_(up)a=ihjWCtffMCXk_RPKEWl$<{g&Vf&Z;_qL<1@ItB)%+27 z0Q`MW^L`s#1b+z14sL{5^*aqp-j~61;GclUz@LIU!P|}F=l!7O|8-FBp9EhFJ_kxK z{|t)WYY_&n<=p}9x(@o_MZQ0ZlFxvD3$B3gL^v$j`%UmD_yzDi;P*kT|Lqvxt>8VN z^!uwIEO~zlvIOrccnkOg@blnX=%n#q0dEKY9n`vRX0hUL35>yyfm-KJLG?R^a)ciS zPk?^~N-sYHkANp3BK$ZQg5Lmt1>6Ud($8;!$HAw;J3twQ^l&G53j8qm+u&7D{6DEjZJD7?>tlJl2At@AtJz2JX=((fsRs`=MISoXdG9s~agl)c`>;xz6-Q0x2%|GgFb zbC4x?-vr+a{us3O0n>N$Jpx7VZ@|Og_dvbBfk{6CJ_s_z`#Vs6`T{1?xZ6Rd_C5+C z3hzsx`1}qiIxofOwC)q2zJCUM9r!HxYVaRH(ftvq@$Y~*Q+xM-xS)3llwCXlioY*` z>i_p3s`g%p(j~{6LFxNmP<($Jd<6VDcow_?ASU2_7nB@cOeaL(&4RLE-pT6+9%Ym1GvMbGX zC+!2Y@^fAB2TSyNG)%+VfaD+>xPw;zNWX8Vy^PkTouNHMyPvj`28&i^eNZ~ZmF(v< z|G$A|{Skba7Shhs%8zVS@_8Zct+bnH`bd`LhY)3DtnVY*Ioc_GDL&H6+h{RunU>Lx z)AW&T>C>S}FPMRii-3)nLixw^=OPc@Pm}Mi&|X55p7a^g9<_hDT;~P+eFIH;QtZ~(DcD2t53vVuc^K{oALR6 z53Ngk5$$f;gEaYteCo|KeRA3{n(Q&4=`*0o-cp+U6LYiv=*{d(XH1xyD9(&;Mt(nR zo7Re-_^m8R%yQiC$E#t~;oZ#Pnem%N6J}=MU$*0#K_`riADN&Z41y>#kv|BwO*vZ$ z#&lDr**~*rEL*=o`u#W!CfKtxEE-MjYmGsD*~nw&=!|#QaM%x9eip`&IX4uf3*Iq5 zn#oK%Mk0y7YLdWj8&==B7{(V7ToeWUi+XsmA4b8&G)s`)_6KG0#UN^{zZBAnqfwA# zW*HWneyiuilEu7e2WgPm?`7wqpRmR-%7PA>Lz8*n`Y*?c*_C?79CHS}4#LRKf>eC_ zhH+Ww_s2R=&qDuko|$-=g+`qKV@S+}rIU^M+pg8)P_07}EC)#twZu$g_GYZD9W%9- z$5YlJ7Q|AP)pf8Tg*L|N2DZ&=n5{504F+K=?#I!h8N_L3`e85VUpANH+~g?)u}Xgc z{nU@@8rEnnPU4E%GH|4tW{AStag>GGWz#T0+VY2RSW)m(vzu>=-Z871RHm_<#DlT) z;K=Dk6zkrV=EGr}ut>({eYX&q9tIYeUH#lNFH0wkvNp9G_5-tXSGu#-Jst*8X%zBK zO>Czqrg|P-7i1F0<5q4R78xL`JPIxi1027N1pQ?N0QpDoXzuq@lZGAEIt~a3Hp9A` zIqb{f7g0^^ku|_AX9%M-wCZog1Iq>WHB91Gkfu@yud^g?$?dj9W}2UE4w{HrTM49O zw+eF&sl%F%-rUn5QsR~rx;eJ(RDwlYJHRKgkS3nmlf@n0n!xIc z>}kA)vF@&|DC=qktJpyn_WO>7hO@p^yh3a1`!HE9NjzffTS#=DDb39~U!X|Pvf`Os zTIrz7Ah{jhmF_<}raO>i+z#YILZu(GCz$Qbn#0XF?j7Ab9wByv!4L<>;0UpqPo!>} zIKt`?6HYkvTY-0?*vzbhX^iEqz0Y9rcDb!QA+TkPvic|&uFXU0+;lu{QtLZO#XDgc zgRBD3%Yob33zr9ug(|Bv^2f$n1VJkF!OyyRZK``p+N6>7sYS(fEH9GfyN5 z5^v|)5{odV0BS>#dq*_YwrO^?>kkVzYljKJDNc|J@~w5y&L@(w-J=!Q95uyJJ-4BB zJmyk}3D+OPOBs-x0nv95j{+FzT+Ac5>FwFe28{POo=)07WwF}r*%tY0k~6bsSGw1$ z^|LlzV`AA_(xzl#n~+-T&w^^y-0NY;zN8&l!84C+n!=i_3$*a{b{R^ixd|=>ErsmK zPTFX;*K=xdCApQL&n~M;JBdG-CIzFt4WCVNF-5yWT&v<#szjtFlx247Y%>`S{9(QC zfbW}iwZ2=?wIW?jLK(<{S#Im?_C{KJ9II)P?DHkH)wC|pE0U>widd}`lakG#^A&%@ zmO#KDl(xeTIeHoKYYECYBipn4#sdd$S#(>`CGwhnu$Qa{MXvZm7t;$W%1dGbe9{SO zwrCTTwx9WB4pg(dZFZZs3QIDG;=HqB)=?(?vvxmaCw5Gcg;@^d8=Lm2bUmdpOGVpQ zdU?={N&FRxT*|$!r*n8i202uQoFHcV$MTe0tz$xo(%3Q;J6v4qP&4S=X0|4itPRAT z?31bPc8f1IH}4)ia$L5Y+N>_nBB~tU+o0Rjd$$oOS7m2Ob%ZNbY(8vd0VUUS zg{<7xgXM!VMChRvZ24ka?D>wyi3e1z(ZZY0{!E#0}kx*GV|4@l*qZ(?q@urzCQyzO~LRa%tHeJ;0XYHv>5_EDx zueC|Gh9?gN{9nar^q=ru3}eL*daUN zNY>*_Q1Y%)jg4h>e)^nb9RJ4Az{S4%#Q-7-F6pEwNOfXVFHwv*bmvOq(tF=ZysBd; zqb#aOV^jBZ@=1MXa%U)&KX^;jG<{``*4YYq?kh8c;y6jQ4!MC<{*u^pm47op01{b7 zLWWSB1Xc7b$2rQj=GdAwdzMs$X`J4P%3kKJ$keM;GxLF()od|zT#oIr>Fg%;7!xt~ zg$GW#^;My{SSUv3LT$}E(#atNs-p9{=aP<$t(nGsCC8d3w>5>#e5X=|ohEIqaJ*^9 zmYbUFUOg(drsmM;PT%b%RhRNqGmKjO+@62T+&E*Y4*hJ!CJ0W0#i4ACEp_lNRHrm1 zumzR2jQZ&#=d}k9TpV&zLwcYnV|TbJOQXoH*9RNYONkOKW!Kjn?((dScv|(tY#6p7 zVzZzNQ7?*D*@`XCu51uv6U?{+ud?g7p1TlP)5NDHJx4)V1&|K+>_&qH#V91f?1O&4 zVeQyCqIV(nJHdkY;P_y4!;REn*uLS+pda|r>^8ec`Jfpjv)&`;&M%!hcXoDm_JiK} zB<>=_#;JDWLCzm-q1)+)O*6OSfj}pLjWcN{Y&YJUchbgEykK^mKeyC4hQxK`)i{nT zFPH;!^K*^4gN*~XnfdvJTMjkmZkd~-W8;Bf6pCimZ;p4jHs%kR`CAtb9(wm2pB?vc zAk$dl^fo0h#L0rW&u1rE8FFM@K7~YT?rL))OjVqyS85I?oR(*qe`mk!J{twuQOHG| z93eKA0)MbzjwLay;x>o-agU3GHNO>h85BnOrP-C_=#Dd|&YT#peSUUs$1zS@$iW&* zmxnA)fn+~1E987bai2+#*fe6?PrS21HcsfM7;{-Lhniuw<9t6){C?wPoD9+h6AkUx z^vFT>7W?OsXxIGQkt6eF_im#<=iYT>e%{<+<_x|0e)PzJ^3~xZx9HD3w%g(PIrG?K zZU}wm_A+LkF$WfRJlv>+*En&>>aSFh6a9fhX709yxr0vh4>#`S{L2coF7`dmTop=T z;d^&@*43l18?aHVjpBZnBSo_o`90H%yP-)3dX@J1zfDofCfMVQL{~BD<8$W9Tia)i zQ=co32lNRkF^XN@uhHL}Xzj{nJ-JP&h3PQyM<{ew_{t|j?<^Zt+{sP2CYq9pE@G}c9%g<- zw|p`hDuPYi#rzz@i(8p;BpLT8;0(#_M7b3~JVI}2uSndzyCUll9M8txE06n#b(Bbl z5!FyJZq4VU%2?Is>98C0eebl-utHV{*Q8YOyod+kmB*uS;3gV)@0WS7QUrhk5Y>bo!RpJAv+v)xxXr|W|R-Os~Pz0;b#f+PFmwegDmS#v0>jbn_+=Hzp=*YHGi6up#fgsIvVK^*QIY*LgEggh^u`Ui4uT8;2P@VQCWk=9MGSm(c{;w0 z>G^SS9dn){Xhd-)0|?hjjbLt4iOY8|jIpx~<92fO8N^*#lh0nw1ZcRdMDyq6z8Om4+GTZ06PDSxYeu|Y8 zbgYSOgP2nx7GZ5x6gV~|8Fbe;+f>NUsZOFwH@^Cm$w#QGN4|vBvg-`WHG~7dxY$8H z%`k?!cGL~aer307uaYXTFxox=z`FLD?`HE2k-JZ5D3|URrmicV@`k4n!yv}w%FPYt z3sJ{|J<%|!-|vjYCa&3^)(DTXRo0RE*5OA)jMN{nCTW1ZMZJi6#n;J88#!0O?>@@2 z&}7IdS2UZJg=UZ+Z!x|a8wGe`L7=uDvgKKR%a~{He)yS%-DlZbis$%uzO9=d!e$wu z5w%uL<-VQpye>LZx=w^==RMmB&`j#C%kNHtt55Y%V}d>iB>16z+OUQN+Mrjyx4Tl- z%gdv@@;T!qGwUrmbt(tElJ~^eineyqaIMN4xIU?qDdKsqgBTajD@x}Hpd{^AKEeLy zUKU#i7UHrSl1~_EvX3#z#1&Dwk%wgR%y^a_1LY|g94DSi(IUG`5K5yiKTgmhiXF+; zM|Boub;VMrn5?djrlzZpPB$AYwu;<|K5o})b%Rknirb1|=tVb4?1GAn=nlrYjYnH# zA?(9=oNl(x1~y+=VGXrSATN5`l!eZ|t>s+pR~H6DZ0_V}bMh+EMK?#7U{Rx6=6%W? z8Kc`J-*rD9_tP|wL@z;6I0gZ){a+3ewJ68W@!VZsg*ZQ{T zR5_Afn--p1MV&7OD_MCq%@bNN)V-a?n z_q}rymE?l=-l9CKr^c>I!0l{eP9!3Uh=*y=@we#C6catq2F1p$U#Rs)+>&voRMZp- zo5(J&?SU9w(Vy5y-k$hZ9?x+Tl_wJ~$_VJRTE44IqA*;RLhLfkGp4~pBFw|Nl8+$E z>jpADii&d2EvH=9oj{sjeWpwPVRw=$H6e2)LD3yrkMpCjYu{JWPff4i%}E3YnxjVz zm*d14&ZKF>wPrWy;N#;QY@?AbedGM2T(b6vVkA#ll}*348tS-kTIGx&$%jQDjyJ&4 zIGNU&ialUJ*jYY66&OB0@G8xzwxE)&I_>`ha_i00nYu0b4{ga=60|uiu%>K7tQ{CP ziHqpM>ZLJWxh~;UE-Pm)tGz9$M;v6jLON!E4i1z#Y^n+bTS`n5IS1Zwf?Cg-Y&Y(z zqX#ho&vrrURlM;yW%nv8Y#o@|rN;x$<$xr4`h5waV~MV?Cx2TR$8z$w;K~z3RDLc* z$PK77O4oJV>YX3-R`;KOR1KQ5P4~<+zG1tY-b(CaoE&n zTPr!x4{z1DsXpz6!}-4;6BuKA&{4AF}qs2wzJD;jB08T)s3GdQm5*aqZ>b`pe;w$it|02 zROgdb`ChNOJS#oDv@TX&{KCTRYQebcgp53K?h0al*`!N87AmS#IXg=)zs+XAqxE2WH*A#y_Zj%Xl1 zw5NSOamkg=Q|HgmE*H)kUABpcKuHmy=E9#YKX;F=tbE zeMGYueNY3AnXi>}8<&cTfyF569WGv0?k`EPH<2llxI|#PNm|*}wO`l`y$jsP_)VYt gz3Pn9X$;lWO806@R}9th@%W,Robert Sedak , +msgid "" +msgstr "" +"Project-Id-Version: glib 0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-05-18 15:38+0000\n" +"Last-Translator: Launchpad Translations Administrators \n" +"Language-Team: Croatian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Launchpad-Export-Date: 2008-05-28 06:03+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Nisam uspio pročitati simboličku vezu '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pretvaranje iz znakovnog skupa '%s' u '%s' nije podržana" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ne mogu otvoriti pretvornik iz %s' u '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Neispravna sekvenca bajtova u izlazu konverzije" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Djelomična znakovna sekvenca pri kraju izlaza" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne mogu prevesti '%s' u znakovni skup '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "'%s' nije apsolutni URI sa \"datoteka\" shemom" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI lokalne datoteke '%s' ne smije uključivati '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' nije ispravan" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime računala URI-ja '%s' je neispravno" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' sadrži neispravne escape znakove" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Putanja '%s' nije apsolutna putanja" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Neispravno ime računala" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ne mogu alocirati %lu bajtova za čitanje datoteke \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "GreÅ¡ka pri čitanju iz datoteke '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "GreÅ¡ka pri otvaranju datoteke '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "GreÅ¡ka pri dohvatu atributa datoteke '%s': fstat() nije uspio: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "GreÅ¡ka pri otvaranju datoteke '%s': fdopen() nije uspio: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"GreÅ¡ka pri preimenovanju datoteke '%s' u '%s': g_rename() nije uspio: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "GreÅ¡ka pri otvaranju datoteke '%s' za pisanje: fdopen() nije uspio: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "GreÅ¡ka pri pisanje u datoteku '%s': fwrite() nije uspio: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "GreÅ¡ka pri pisanje u datoteku '%s': fwrite() nije uspio: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "GreÅ¡ka pri pisanje u datoteku '%s': fwrite() nije uspio: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "GreÅ¡ka pri zatvaranju datoteke '%s': fclose() nije uspio: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Postojeća datoteka '%s' ne može biti obrisana: g_unlink() nije uspio: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Predložak '%s' nije ispravan, ne smije sadržavati'%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Predložak '%s' ne zavrÅ¡ava sa XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nisam uspio pročitati simboličku vezu '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Nisu podržane simboličke veze" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Ne mogu otvoriti pretvornik iz '%s' u '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ne mogu izvrÅ¡iti raw čitanje u g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Postoji ostatak nepretvorenih podataka u međuspremniku za čitanje" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal zavrÅ¡ava sa djelomičnim znakom" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ne mogu izvrÅ¡iti raw čitanje u g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "GreÅ¡ka pri otvaranju datoteke '%s': open() nije uspio: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "GreÅ¡ka pri mapiranju datoteke '%s': mmap() nije uspio: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "GreÅ¡ka na retku %d znak %d: %s " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neispravno Å¡ifrirani UTF-8 tekst" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "GreÅ¡ka na retku %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nisam uspio izanalizirati '%-.*s', koji je trebao biti broj unutar znakovne " +"reference (npr. ê) - možda je broj prevelik" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Znakovna referenca nije zavrÅ¡ila sa točka-zarezom; vjerojatno ste koristitli " +"ampersand znakbez namjere da počnete entitet - escapirajte ampersand kao " +"&" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Znakovna referenca '%-.*s' ne kodira dozvoljeni znak" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Prazan entitet '&;' ; ispravni entiteti su: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ime entiteta '%s' nije poznato" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entitet nije zavÅ¡io sa točka-zarezom; vjerojatno ste koristili ampersand " +"znak bez namjere da započnete entitet - escapirajte ampersand sa &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument mora početi sa elementom(npr. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' nije dozvoljeni znak koji smije slijediti nakon '<' znaka; ne smije " +"započeti ime elementa" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Neparan znak '%s', očekuje se da '>' znak zavrÅ¡i početni tag elementa'%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Neparan znak '%s', očekuje se '=' poslije imena atributa '%s' elementa '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Čudan znak '%s', očekuje se da znak '>' ili '/' zavrÅ¡e početak taga elementa " +"'%s', ili opcionalno atributa; možda ste koristili neispravan znaku imenu " +"atributa" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Čudan znak '%s', očekuje se otvoreni navodnik nakon znaka jednakostikada se " +"daje vrijednost atributa '%s' elementa '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' nije ispravan znak koji može slijediti nakon imena zavrÅ¡nog elementa '%" +"s'; dozvoljeni znak je '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' je zatvoren, trenutno nema otvorenog elementa" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' je zatvoren, ali trenutno otvoreni element je '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je bio prazan ili je sadržavao samo znakove prazne znakove" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument je zavrÅ¡io neočekivano nakon otvaranja zagrade '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument je zavrÅ¡io neočekivano sa joÅ¡ uvijek otvorenim elementima- '%s' je " +"bio zadnjiotvoreni element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument je zavrÅ¡io neočekivano, očekivalo se da zatvorena Å¡iljata " +"zagradazavrÅ¡i tag<%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument je zavrÅ¡io neočekivano unutar imena elementa" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument je zavrÅ¡io neočekivano unutar imena atributa" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument je zavrÅ¡io neočekivano unutar taga koji započinje element" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument je zavrÅ¡io neočekivano nakon Å¡to je znak jednakosti slijedioime " +"atributa; nema vrijednosti atributa" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument je zavrÅ¡io neočekivano unutar vrijednosti atributa" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Dokument je zavrÅ¡io neočekivano unutar taga koji zavrÅ¡ava za element '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokument je zavrÅ¡io neočekivano unutar komentara ili izvrÅ¡avanja instrukcije" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanal zavrÅ¡ava sa djelomičnim znakom" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Neispravna sekvenca bajtova u izlazu konverzije" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "NezavrÅ¡ena znakovna referenca" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "NezavrÅ¡ena znakovna referenca" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "NezavrÅ¡ena znakovna referenca" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Nisu podržane simboličke veze" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "NezavrÅ¡ena referenca entiteta" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tekst pod navodnicima ne počinje sa navodnikom" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Navodnik nije uparen u naredbenoj liniji" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst je zavrÅ¡io nakon '\\' znaka (Tekst je bio '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Tekst je zavrÅ¡io prije nego Å¡to je nađen zavrÅ¡ni navodnik %c. (Tekst je bio " +"'%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst je bio prazan (ili je sadržavao samo prazne znakove)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nisam uspio čitati podatke od procesa djeteta" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Ne mogu stvoriti cjevovod za komuniciranje sa procesom djetetom(%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nisam uspio čitati iz cjevovoda djeteta (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nisam mogao promijeniti putanju u mapu '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nisam mogao izvesti proces dijete (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Neispravno ime programa: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Neispravan niz znakova u argumentima na %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neispravan niz znakova u okružju: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neispravni radni direktorij: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Neuspjelo izvrÅ¡avanje pomoćnog programa (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Neočekivana greÅ¡ka u g_io_channel_win32_poll() čitajući podatke " +"procesadjeteta" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Neuspjeh u čitanju podataka od procesa djeteta(%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Neočekivana greÅ¡ka u select() čitanju podataka procesa djeteta (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekivana greÅ¡ka u waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Pokretanje nije uspio (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Neuspjeh u izvrÅ¡avanju procesa djeteta \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nisam uspio preusmjeriti izlaz ili ulaz procesa djeteta (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nisam uspio pokrenuti proces dijete (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nepoznata greÅ¡ka u izvrÅ¡avanju procesa djeteta \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Neuspjeh u čitanju dovoljno podataka iz cjevovoda procesa djeteta (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak je izvan raspona za UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Neispravna sekvenca u pretvaranju ulaza" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak je izvan raspona za UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Uporaba:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcije pomoći:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Prikaži opcije pomoći" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Prikaži sve opcije pomoći" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Prikaži sve opcije pomoći" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Analiza brojčane vrijednosti '%s' za %s nije uspjela" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Brojčana vrijednost '%s' za '%s' izvan opsega" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "GreÅ¡ka prilikom analize opcije %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Nedostaje parametar za %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Nepoznata opcija %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nije regularna datoteka" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Datoteka je prazna" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Datoteka s ključem sadrži redak '%s' koji nije oblika ključ-vrijednost, " +"grupa ili komentar" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Datoteka s ključem ne započinje s grupom" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Datoteka s ključem sadrži nepodržano kodiranje '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Datoteka s ključem ne sadrži grupu '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Datoteka s ključem ne sadrži ključ '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Datoteka s ključem sadrži ključ '%s' čija vrijednost '%s' nije u UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Datoteka s ključem sadrži ključ '%s' čiju vrijednost ne mogu protumačiti." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Datoteka s ključem sadrži ključ '%s' čiju vrijednost ne mogu protumačiti." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Datoteka s ključem sadrži ključ '%s' u grupi '%s' čiju vrijednost ne mogu " +"protumačiti." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Datoteka s ključem na sadrži ključ '%s' u grupi '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Datoteka s ključem na kraju retka ima izbjegnute znakove" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Datoteka s ključem sadrži neispravno izbjegnuti niz '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vrijednost '%s' ne može biti protumačena kao broj." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Brojčana vrijednost '%s' je izvan opsega" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Vrijednost '%s' ne može biti protumačena kao boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Neispravna sekvenca bajtova u izlazu konverzije" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Nisu podržane simboličke veze" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Nisu podržane simboličke veze" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Nisu podržane simboličke veze" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Nisu podržane simboličke veze" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Neispravno ime računala" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Neispravno ime računala" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Nisam uspio pročitati simboličku vezu '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokument je zavrÅ¡io neočekivano unutar imena atributa" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "GreÅ¡ka na retku %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Nisu podržane simboličke veze" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Neispravno ime računala" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "GreÅ¡ka na retku %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Nisu podržane simboličke veze" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Neispravno ime računala" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Neispravna sekvenca u pretvaranju ulaza" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Znak '%s' nije dozvoljen na početku imena entiteta; znak & počinje " +#~ "entitet; ako ovaj & nije entitet onda ga označite sa &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Znak '%s' nije dozvoljen unutar imena entiteta" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Prazna znakovna referenca; treba uključivati broj kao dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "NezavrÅ¡ena referenca entiteta" + +#~ msgid "Unfinished character reference" +#~ msgstr "NezavrÅ¡ena znakovna referenca" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Neispravno Å¡ifrirani UTF-8 tekst" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Neispravno Å¡ifrirani UTF-8 tekst" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Ime računala URI-ja '%s' je neispravno" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Ime računala URI-ja '%s' je neispravno" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" diff --git a/po/hu.gmo b/po/hu.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a3948f8284c68ef2efade8e0ae7d7156f8afb5d2 GIT binary patch literal 47068 zcmd6w37B0~mG6%u0wOXaG8~4G3Zz03=1dSm5+VU&5(Xs@Zq+?ib#rgsTil_ND#Qt; z!3mi}QIXh+M&&6Tg%+{9wHn*DwVhhq*R8hFqIRoow@+=g_4$7Pwf7nCtx84ueP7r2 zo&4`PXOC;Iz1G@m?X&akgP(bKz~B8(3xcD;qYnsz{-=XS>1hyr>4YFS1pG3%5BQ|V zpLqO*$KQE;)`>3N0pR|mKg{1B4?ds!dEiUHCE!-@F0cgt9DD(I#YsVM95@Ef1K$j) z{zt)+!M_DB0Dl1<4xTe72rdUN0}ln?3!Vx-3ig5D2Se~cGQSX92vSwB9#nl};1S^K zz{TLZ!E?c{fyaXf&JBVyz(wF`;1H;K-vXWvJ_xG5?}CfK1E{ngJP%a*QBd{06IA;? z1%}|)LG|xHLAC36Zul822j_!BAWaYM1Zhg}aS##*-|_g2Q(XR&LA7%O7=lf3C3q)z zANVy;?QPRY(e?GbTka5QIP8&K(f1Re(N$DnI!grLe<3WneYQ2DP1RsS17@zs0$^T#}X!{g6EweR^5QTgV9 zO1~P^IA7zRzYg> z0I&ug3r>P+_uIe&!M_Am-rs>r_Y8=lb{^#M98m4s>hEs?kK_IW;KAVMz@xx#fv{rm zD^Ts4f4-ALFZFnn#}9#O-`Bt+z~6(%fk&)#a{X*j^u7pGf42DNEl_;=8c^xq1|A81 z+&}*csPX#&D1Lb^!d>Z>gNUZ!8t{1VR`7-32f<^&zXF-s!IPlqaKx%0*bJ@#F9P2V zN=|(bgv7zA7c%x>1ys2YgDUq4Q1v}?wd?;$;7QzX1SOBRgQC;@;0fR-K+)^lpvL!L zDmfZl59)md6n)+Rs{HqW8n4fQYVX%UL`m?Rwa6fFDR?Zn13VeL2UNL#2CCj)fiD0L zp;MxNKdAA$55rh(8ozTv@zb@S z>b(tw^ueEiOTb@){oomwx$zhPHEwrBJ`Jk9&t{S+-#k$KwhmPNW8f*^9iYnlBzO?` zbx`H~5PUAU&*iSXL&1HxzX}xnuLGYA-TNd|9Vj6)xZ$E13UoS4ZaZk z6u21t7N~U3zt*+uEKuWjDX9K+z@x!?LGkw^;DO*jf#Qpwf=7ZUZguTi28zEYLDAs> zP<;4B@EGvBpwj;yRC|uR&eeM|sQOlb$AN=j2;SuJJsuwij}4fg;920aO74CcIG_8g z{rxTA9Zw5__kl<8e955W_sczA<1z9$>apYTMo{DZT5wQir4}`^nkAMwu-!ifi zoB&0qpMav@evy+?i$Kkb8n^;{C8&A*=io`;fkQTQ!5N_V;tp^b_yLbU08i%rq+!Qj z7lY!LaqxKXeo*}QX>c9*B&hOF8wrB5!B>EY>fjM@E%?leqt|*+<6i|e-|hoN&oBDt z&)(+N2j_y~vpOiczXQ~`egf3I`W`qJJgVyE=>^~#?%UudrSta()|`I20#tu)15X7X z237wP;A!9?qfY;?0^h^^8$j{PqPnBki$FwC&;V7>;~*>?JeR>(4{ifB-j9H)=PRJ< z`8D`jaL$-Z|3Ppi_xoP&#_3{k756uTYWL^B7lX$(otzp2X-e=hkfMSU8T9kOJ3-O) ztDxHP!gdf`0#1M`@2|iO;Qk$KVsHy6`u!FZzswnT`u_q@<2VG0&bNXZ-}i%>H=hGV zhaZCK-_y3cd`E-o=lNg=4ug^hw}5lNPlKZG4?&gpf*mgXQc&d$fO>xeC^~%z6kmP= zoCp36Tma6UaP7DPRJ+@t=IQO=S>QvU`t?I_5qQv~%eM*?e>6e0=U!0t{Dr^&F{pYD zzQK*dGEn7i_jnH&a{maZc6^TBU};*b4rbp6=~D*twW z{{R?r|2H0g3~Ia&c)8>2t>6;w?*=t~UjknU9{&nQ|K*_g?J7|9zZX0W{5+_7ehZ!p zp88719}%ee_8|CD@H^lNaOtbuJevg1Nk9&w8s=gYtYxbJ|cgExVy?-B5D@F$?^edeuB|DFY2 z!2QLb`0-7k+WqIC=>JPlC30K(*%?uXpqEBJdpUZ}IpkkG}y= z;Q8rqaC~?Lcm(&a1~tC-g2#XlgKFpB`R6|Z=X1Z$8{PXez~i{z2x?rL;A-%_pwj&a zd=Yr$n_NE!LDBJU@Obcx;5zU>!1KYSw;^M}mw}gqKLW1;SH9WFm3zT$-2Vy`-wfXF z==5$-boeT`Uhly<;OaYEeN|BXc`vvCoC41Se+H_(i|=&p*#T;t?gdW){}x;X{u@@Z5Xg9q_f_cfkJw-wA&6t#1BJzRiu>-QXEKe-OMJd;%07opZ0#TQ`8Z-vw%1 zehi)lzToYSZtK8>+}FXy;Jd&R!LNWy|4UGGJMkT^KO4b5?q35c-GiX$`(U}XpFyQN_C1b{S9rVyR68F9 z&jP;-hTxI!b^hgZ!7bds4LlM2C8+X_dcd{+a!~ZS6M_^+VqIe3?|6BmLi|2$Ch z=*8f{;A_Eaz_)^$SHA>R?(rW$_k!1fCxBC++Vy=<u2``(2>M=Xc>jJQxI({!Z`|@F8$H_)SplI_iHp z{#g$0&;0W{~hcHpZyU> z*E2wk?-o#Wy9Znf{sPo|SoDzdW7ok8xc?G(F?h(IxcRgdJem78xCnf^zyE@N|8ua9 z=lkw<{ag%+E@Pnju?t)Xeijsce+`P>$9&Y4cOE#0`|ClC(>@0qt9w+oj(ZLV6n3BPLynnZU{yKgi z!tYOToy(>6tmoNl!2jebbDhIIEM$LI^ZTp(S_ys|d^z|su77Z^t-bpBLoU%me;4px zf2V*N_k+Q|2N!@7U=|6fySH=g%e5cZYM$xu zeEsGc=F;Dva;@O^mEiSUhx2=$f47)>Ski2qcYy!KrN7(!d;NYR*VDQGJotBd;Qy`$ zzvzG8@6(?FBHDuA`R5mL|04hHl^(^H8uO#Mf38m_xS9Ju17Ypp`TTw@*QH#4p?j`R zaV_Ou{5$~a?`-fZ?q{$MzYpNLnfoQ+KZ1kcKZD=livOO+v(IsJE!Xw@ex-lW;J0}B zIxzk#`5!O$_!bZr53VK6{|48AuL6(dI+Wi(2RCwkgG+y}cMv?Aceiut?>@qn??SE- z`{neIe(vyT_Vv#%2k+Hyo{#%yfJI-~ZwMV*h)8@NVw^oU6}2dmF#? zcRUyBAovN_XF z`Zd4xSLgTfT(|K1Snx$vo{)j@EB&+l&y`Z71S`QOhir28z-rH@7m&tJr|Uvizs z^LxNiu7Bdv-_IPFe%;AWRX&Y9;GZ+O zp6ze$;N5(#*K@sw>m@vYA=hL6y^Q{=VrT_%QfJo*n1! zzYdi?O)b>;1=HP29M@CliwS-;=gzKAKQ5Lm;62sya`;c=V4!^ zK3=L-%3)L=Y?LeY;d#NF1&fBl)fYHi>+xcbmw4RZaWmKohbpzGJuw#Px5G|2Fwy4T zVJnzBr!_aMw8DC$9hO2@<={xESsH9d&2Xqut2MS$JMZQ$n;Rx?mWGvfI9i&pd;`&N zr5={*VN{Doqk226mqw#mm)stS(sEl=bK2acp*8EjvHV)273G>|H7pHPc}abY%4s7+ zkGU)6_UwVW7Eb$S3B?Z14THY(HinI6*mvI5r}ke{t_)Y&t#Gu{YKH@nrz!OfOoa1- zdExd-d!*56hmEnQE=uu;Mms94b}Lvp&}wU( z!cM)iBP=&YON>IRF<6Zl%5u3GwOWxI*j8t3tkG;!XQNJ+>0WE1)s9AkmE|%IeI6bU zicaNVAhZ>DNXkN^4cCTDRG@SM)31R3?l#ssOsP|ub`TF(21*O4iXUwKYnAAE%v+4Y* zQhjba9BhnDgk}0X*cJgAPgVW&lDm#n*FHPzIID#M+o z>o?P_%$qr_C0sqSlrj|DyPV~yRc$wXkCU>?4d!*Tw4L!Sl|#5^cx$Dxl}TQ&N42eb zxV2WPM_b`DIMX+17Ma?Otr5fEC^=NAm%~iU{bMRA!y=l18tPgF?t;iIafcpO=wKrJ z@_FK9bKvKpaP8_*cx`lV(njTVvo3uNOfmb^n@5mjQBn@-%}^2nX&T>YSg-?G z#-rLqfh&^)CX^)W=Nq%xZBAI^Q#KpSlpHe;Mm0BMEA>hno~=ywn20Jwa}3fk0?ai8 z=KvGQ%|;{xiYjU$d^8*5#ABrcf&GDg%bg3%!b|fh>Z88-;7BxpJ zEwM>U(yTQx3X4{4wy30bvr|XLMB&;?OmwZQk9FFc+VJvdu*xxZh-MqD)JfD5&zDrY zI-M#2rSuxmB=ZoHq&_UsjWpi8rhm~{drEOmCP6bAikhf#iLL$xr=V}k4KJ8Yxg#fC zuiBE(iHhx6LK%xd-DG;1;vj1)8fC838ug{&Xaf~ft5n4*6OE4K3{#ITjzYB-6D}=1 zQ9B}fT?U3^d#ep8Oq18!mG(r~A4aXg(ikmFN+`9$let?OtZE=722EZ=MYO`OG>#s( zQA8@xX_2(EQd@c-&)=bDV>HvEn03?;;}P_V`kH70@^)&j|I*nu%yVkql2I-bW10uy z33FN}WRly&@_Y+}S;ba`uWB!nI?;?Sr|snk;l_l44?RC$xO&aHOIL@(%?9d)3PlQ3 zf1@c$$4E5lQ8)lI4UPmCW<@gNDy?HGV`w5=y(1cADo3?)aA9MxV@4ID#AtTv(GK(q zoWdBFhGe8kTB4szHPm`#SWQWcHikY?g^~(OA!z22O|%(np!Joq7<8~PYOP=fcmqHq z%xfl`F~O{gDYj>pnPN4sF6>>F{@AK&mxdS2CaZ{PR!~R|8`ZdSlWH@K#x@yvZb&rJ zlI2JZn2`ZDqYMjr#wKhZ5$nbz&(dno10^dmHizJYcBNKxP3U)XX*=^)eXEsdWZWgS z5sPPrPR+;IbnIs0Au?7lV>;ipScFi6=(cQ5>$DYVx!&~ED#6+bdEzGYMGJ-(gv(^` zu9%nRP;;ZvF+>my=jRdJ->Ad&kO|RkCgp|G=#?-lwu9AvSz7QZ!QyOcumIkX`8UKT1zi*Kl8nIII(z;r2Y_HQ~gcepUqsMcjBI~uZ{fjA@foN>7`_RkH>By)8mC!NZH4};`;ECFmTnz zZP6p_68{i|Vl9=KV*-6_qSx!hmdd;=cVsiGk6ztn-VH}>D^}fbD=}vMP$QF~R>F)K zQ2`mtIrDzBRMktYpMeI8DwKY`ntk0E??EQil+5{Xj&p+^E! zxtc1|yvsb6rKhGfYyp^(TB^JwFtvo=eizPG2k*7Q^4&4dznZ|6EJ`b5`pt;Y%z``B44bkJRUsBBUMx;r-WM~mApnh1-vDh(LkjOokb+puWBB*E1Oxs*?&FIm}zl2q#Cf>3xtp>%D+j)fL0uOXyYZ8f(hd#1gZrC@cH7}daEU=_gOTr=3u=&Sh3x`Q%+OdNK|8tU` z%&?aAc6K?9W79#+7rVDb%~Y-P)p)CKzO3=Vk+6je8x9#M;p7^?%w@%BZtr9@lUe7d z{*bWxls%xdxDO#fCjJjSE7Dv1}rnSn!yQL*k zMQ$!}XpRQmjWCNnX@Mk-)3$ zBhwYyoxC+sADn$^%U?(?8E2x0Wk-f(^f*e_BqJ;W=>${QEjHkH=YkK`6jD-5>`C>j z7)!xpTb{b~q8zK7#62pn4}=|@Yp=b9pZLMNKPx}Zt!z>`XoIzzER?efClWg45~ot~ z4ly}E35}E++grg!h|4srauJ?D8*3AbEJBY+T3gA2I~keYStmWM?1B4 zMX^Dasn>VRT}da5uSh2Da>H%TOZloQ%4kYkoJ*Q%oVWS4c#mYcwYuIn>o{X08L~D- z*7->2+D+J|n~7#70Rt*^t7$o9&v6j|yaZ-M(0C(2zmd!(6ETuJiDb9PXxQiaZjp|} z=`nBG)DT13G4_s3pRj|2_4LKFOnBBAJrZ^eO1h>@#>e$fgDKk%8b~T8jqhP!i#Ex7 z&Dfp~WCg`Ec0Nrd%ZhUH6kipOw}0JhSPGsjYSe;!1WXtZti2Wd{;)TN3hf2 zNPNd}>MVy&OAO}>m=B3C4AYRtkh8YRgazAf#hsLD^KJSz`XPt0Si(7AK7g6nDV?nbDnGV`&nEPP_59JE!v{MBzITazx7rC;l+2;rOTtBjTi9 z(4!4Wp=mL;^WeXupr_Uz`A}U6nQkKLB`!_G^yrNU?P%n>VFr>mJp`91 zI?1plLPBdQM8hQt01rg%?J|!oG*%36T^d0JixoMwdub!IO#<4v<6=!lC39K#+#wQ> zBjYcWhk~`cXs^8+OjirKt8umoM8c$)#l}}s*zt5Wdwy4naV7O-8p75KGv$*77_W^% z2}rP%Vwf_C(|s*!!dSC1Zfn#U(E|yV0a3}~Yp&1J=430yc!k(1KD|cM)gL#_=qBn9 z67_)C>J&L#;_&wPb?^5Byh?n z-T>2`M%AFv6otkS6I@o#hGy0NOyGsBSIg(dfu&qH&y5kYA&x>=&-YZ=ip)MPtpKDk zEQY9nMSonB!Z@=n4ie8jZJJV@*idPOcA6-3ZeXIh1T!-MucgTvFdN2>l~=0oAY(S0 z4e=g`=_7LrwP5sWk5%s|>h=*B5Vfq?;>5T(DK#2Jn_`!O%i?uJ-cHXvx9}73Up8D| z{#@o3a9)l`aOW*+Tj2y7R&893LMM!f`85l zSi|Ej`Iszjo1s@g8b6ymHip4QbM>33aC3X8%rmnZd1yxDK*RvbR*@7Y6lq%&q)D{o zb}QMg921RrZh-l;1+RAZ9I^pYg;Au^hC$3WX_H6PV^pxxH*hi43-XD)6q+CVyi{tO0a2|brZOm4Q$ehCY}_ShF%byLxT;8kquT{NJYy#Ab|;!7 zD4a?%`(bcF*tc2Hb>-7LRWvVKOm_Q0ICo1%9M6zdC7B~5?312!egfmtT%etbs5{o{ zaXM|Eve`yjw-m`}F$N}^g^}@zyPn&yASDJMkNn80reh|QrsfG!yC;OLLG7%wyn0|H z(6Uy(0;+d$Atb6QjhCeHj7{2IXoR*9x$T*0*Wx|LmHJ?@5wp2&bw>R72gk{U)7 zRcyBs1e;?wB}CF5TBkb3BqDA1EcVA{g>niLYID48%?kA!k`V;XCidbWmnabd8F^vO z5ky3?0!V!{a!+n`Ml&8W6GH5fvyF|mTpQ93-5K(0D5gv9Y2g$>Ie^^7X?uAx32e75 z;>N_0nbckHEYzi0jIlOD3MpoZ8e0<=(%GI!rcD}c9)XEsxiG4>9M%v5ekZkA6X|~5t_%&lYwY<ZLb1cDXvwHKvFT?r?DAxzSs0a?n&I_we`BcM^J4b3g`Cmzx!uFI zWqa!w)&%^fwV=k!E$$S?$0o?el;~2@GV2FJi`uS1&Dmskj_zJ%Y%f*XW0f+6m_t63 zBsOrV$@aJvdmX=@Z#$awHu246TWgC9Oap8>_FTzAQzuDb8)2LqlZ*bi9xq%kp0t12G7~1Q4l+MTS=5vh)>}&b6zm=4W@S! zg@#qyZ|cXHUKD6H9+--o!qVn)+dmOpVJj**8*I|#!mP>4ss$$zEV8u~8F2U*S$lep zv|KG|iB^kB^#v+_7RiTd4J=8wUY~8AIQ5lqibhB?!S|7YDD$vUx5;xQZoFY%xT%)Z z1rc0**@n&QF1vKWf(6$ETQY7qbb@qLuw|7~7hbY61T}WN4Mdp7T9~tlwRPZ@!CrZh zb55YTot=y*pN>EqwiWW*bP{c5A(UB7#V`5dVKQnqe6xe3s)U#Q@~4lZUU`{*i(#SY zf*hCLaGzq>zV9TE$4F^a;)%r_cD58*$}}P>fkWG79UD4<3PC^(ny<6Q<^j1;N+|kr zFj!)fiiN{9B+j_N+q0!MKismOtHX8qyrd#+2i7M%aB&o*%R{GpA@-IXH!w6ert1v| znns7TZ{0TJ!#>-Cq#sCY=U(GUaUXAcJDv~Q#~ZcC(QJ0cv|e#;ZXU#&3?!eO{>g4; z%fHty1T;wR1U2)V8UMKtRUn6t47s4^kaIk{IB6_HgEIaUZM!cnC?mPyXMQUWr6t>{ zrPkIoG&WtClJW7xVL@0aOWHF$t?CY#U(Y@fm?pxE)@)`pWg%yX_`Xi)g17VNd)MjZtg~TkK(6Zk(UCs{x$>FHfDLC;h%4?=?BW*!P5B5AQ`0m$bm?Gvw4< z#jKwpMW;U76jr}aKI;}p7C~Vbvm7QWriIe9Jykq?1hv)Zn0)S$6ESVu%4~f)hAA6( zc93`+sK~?)Z@3W?qQoX-zDQ{L_ZB~w7R2d_>Cly`G1z9#c>&x)kjhH-9|&$a{p_;? zANBP!Tu}tXDYGKpuBI56+vH6oX}m%YY7=OLh@JFh)P(<}2H#GGDNs4?13>q=j;|tV zVUf#l8SBd`lv-Z-_~!^v)`xr+WYU~TH%2%8Cm(!a6C{n$;$EK?nnOZ^leUROUAyj5 z#ly}w$RgQU3UgnMczy5HT7b>Xr?xCmASo;RAT8fb*;t#&KIt1R?Wl})Mni(mNr%}z z<~J#J`>C|Di>Fnh>DXaET2%f$b+|f%Dd|GK+0j5-$1Pd3aQ?!Dh&U-t=QB(@pqK=N zRwG*S&+C2ANf!f-L_E=#HW;W>5&MS{`t#Nq+s-YSdi#?Xwxme!^1;vKx%Z&DzIcfi z3r-R#!Z2KC8%)N_kyuZAdcSN>2{ufZz!`n5a7!?be*_Xur`2bEEoswJtxucHd(r@H>l2#FTHKkYJETNSRR{89*Dm_sONwQ2Sl1H8P)K18xp&=VGLwT#wWcl&i%Olu| zI7^~nmIa@dEg1*AFFVN{SK5TCg=(TYb~0b+S#1iZQ1KnyT;>cOOrTP zhNJS-uG&O2iO)anG_~>kv6>^u3YxuO+B#L_j4zjj>fj)S1SPD_ji_fj;|?ik(YDcT zs;=t%KsrTWUVoiiWw-(@SXi6d)s7}BWSDxm zJ~6&6s!cwAI}LYP87c1MiXEJKaC9V^bgdB=1S==y{hdV1RsCrO+H24lWxywf8pE{` z)3jgN6f0rW;e^q~FudPxmuT)Jd@H|xz1%_ov5#gYF5pQzRAL^=Byc5Q71QH-s8JX% zsnV$jn{awK#CMjB+Hivxt*M=44WY(k)z;LmVR#Y?WokEbJRF5lwNtJR)fxi>^Fus( z1QZxNdftQu>7N?e<}O%StCnh`B^AkNjt%15p4wgEyaP49*_wI~;MfF6){Ll;n^LiB zZmFH?SKs73jp0d)9Y+}->VA>CcX6VrN86oIUs{Q&Tw{06)NUiPMUU;hW*rT!x@lC4 zG=uDDgq3u-&YM;x9MWtqv~e^V9;r+{+QP9)U))HmN7i@-jDA{mnO6g);8F(7)nV)a zcPLL&G*ymzg|f_zMQbr;T*VscOo>(qq;kbO%7rCSWR49Xp{B_?`5|*?+a{|1Y=x3?y44+*d$q&MZqRrQ^7l<%zAbZ6e<9j$kmVnl~~fOML=;81``%1J3!{cnLn_ zJ5A*Ba5P!3z}-3DD!MRtGDH6WO#hS$b0;<=oMQyza|A^8*k4^bImC)&~XoY$l&+p%s$&1Jlz)5n0=Pb>5&by&Q#!g{H6$Q zCjq8*BEC%kipAmmu2~}S>6jSOb-&KAJafO=X--Z(h}a@wIxXtxzqG#j@Q1xKr9%Ex z78_UOQ;V4$0Md3+I*n;fma0f5*SM(m`0XS@6e6p3u^7k;UMm^FoMuqZOE}A$ z;+|bqQ#PjLZIY(C6$``4W!o{{Iy*DZELMbxyg`X@XqUP9nq#!)%vA&*O8nGb>} zPkg_62j7Q{%JkF}DmSXOZyWE(I8})S>K(jPQnPKxjp90Kywp;X^fZwUVByI`t|J;{ z9m1R$8$OdK7A&!Kg%wJJN@bayvuy<#WRFk6Uf8#0s%H(=3N>RUm>tRNXZb&CiY%*>U&t3E#o)DWhK%z8~(SKzk2EmH$84%LcbM1$P2g#z{r zgWSjb)@pQ~8}2`d%(20}S6!V?bf1Wa)*gf&Y2LWD$`h51S80g2ME1b9opz(PO{^_` zi@PHN&8o>u-E_9oJKQQzvd0s)NR)VKsP(Fsy0I$OGBL}E)?5i|8Zrtw-HOsJ-ANnv zjj@m{Pwni~mLx}kWb=npkFj}5weSgv%>)!@)jyT-mFT)i%hp7KGnNH$II}I0t~$H) z=`@x`UK4mugl5ph5pKLR9}z`vDYClsT6R?O;K!5# zJaO_;Y4KP;GPGvyn5%~b@$&}9MmX&_-RUDM<(+U!7JcCTF8_m6c`^h#TPxdTvxX}z z&LN4~&|WJS_X!{h3~yiF8*ou&prkQ&OLcTiMCc5OjiSa(a37-iG?Fm*FU&ZIZHPh= zr;tPyn|H`lG^UL`{v$0hC(tM_5IST;O zsMWxW;?X0?)U0 zx(3N`aVs^|p6|N35m=Ja7e3`$kjN9X2%?E&Qe68o$uJf(4bNF+88Uh)+|5O~431r< zP3sqanfE^#LiVx=#ISoqz{+SDPrmU{1%m?&3x`)o?o0@QeT*a($i*qmKf@u&tSBzNpmi{yM)EW~Sr z9M8CFtCeztC2-2s8GiNiBX+3lfeS1Ok6Dawxmp<_45}F=e?UgTI9n_${GI4eRH*tn z$G)iR;1Vd5l_62CC$?0XHkbAqu}P-_XUWS@&~rJ$n&x6Np}3OOCmw}yIZ3dnW9i^K zQ0t`XtI&g3s94yeP?;0tE+Ue=T4|cqA~&fRu@TlnJCUQY!*B@}ROTohb7ojr(FSfc z_G;n?*7r|*IGdcT6P4w*WsCx(LN=29#u{`OO!&$yvjdijvqnX%;ydY$;5}zR_BiDoR(o2%0n)Wy~_XK*C>Z>gEN z$*xwNt2AQ=5^oz_h$iW}M4(?}E(ovCe9E}1`RM}atZ)*Kh-6aifz5cs@h_1SDUQq{Met}<|h0TJsS}`kJ^e)c3fvMd^Hczt6n5h>V zOJn0(m0{nrQjSPsgH%RD4anu(V+M8Aymz^}xn12fO_P^t8N%f96m6c!9ng`_+(k?1 z-0v*H0qqfz5SAwlMN-i+cp_fA^yqMG{!cR{w9%M7L9wER;Zdf^u}lS4RlLsaOQ>@8 zA811!m7v0Q!j zK+thh&l97Zr51;o!Yk2I92mu^1DmEE9cIdC?}v+LL{)82Av8K>zOxKXY5di>wx>>3 zb?h3wld);Lfu?TF?kIDC8yCtlXHkRyT!6m$>7%U+{D&uQF6EfGPQ%S=k;w}=U}Bk7 zv9F=%+U*MIK4ouiF-AN?fx!h)4Urd);6^kNr1|OhMWp9esYmhn$~T=Sl#9_Odk~0n z$5uW&DqvVBg?>;O7{9R}H)i`nSs8P}ZNdxt2ppJQZ6gsYB~~5vL47+u!7P|J`$C>- zet#;~-dC)QXPq%!i>+^%dzu~Q@J>UOI4To?EuPEM9wr^dxd5X{c{}A;NRlx)^PU8a zO(CsK>zSS#kK~)+1D(p%<83@C3l&v6wZYajS@bbdm91c$Xk`I{?1qliv~XbmBJ z(^3oevbz88rNX>wVX~9*sWmq-{^CN3l=?2PueLPVsLRbN6=2F@w!~n(37i^zDMs0C zVItYl?^_>^p&aI8f!l5iA7zD&;w=dIs=D{8#(D?=;Wv;G2`(yGoLPdP>K2Uh(r`i=W{F%j_TSV{x9#2a`6F|@rNg#YrEDxTEZ)*-i&ZbE zW?H9+knut#**=Ny*;oU2RVttJ!a3RL=eN+wc}kZNl9O(ml^GW1n^ zJ7ZwQIRP$DCQA}RC*=2yNI1P7jX(ZSb_;G-A+#aUS~Istv|#b$w}j^!-=l9n(48(x zUDH@?R^z#m4O#r5^cgJ;Gv3-Dp)Ula`u}i(TL<}cKysxu$)OLMNgm^qwf6%S5s zXDeKm?m9%rz)VsbGj>pVTpNFol@&s(5<*ce=@Rhd+l6=-lf>sAeO*+>UoN1 zniM-R+$I~wz$vxZiQ@EcWkp`DT6G&zdq#slG_x8_Jlrh*IdjI_0z;=C-~{Vl2cm zu^T9*2x>b{twFL74u`gTi9?%hS6gx)Zxl?rf~`Rj8x`(><)ZX+IdAzRDZJ&7TK9ad zA->S6Huffn(kZjlY(HLN-Q-+1CZ*zV8XPP=h1+5S;&qU3Ea@+lN!ElKii{5u8f?@5 zxjVIMmKn4n;Yh}*hgp{}-aUf;YI*Kcr8tdV6!xXlRGmSaeiN2!oHE25VxG3KT%Wve zX%0u3WTs>;-rmLTm*7{U%2v^-Cg!(2d-4pk`JtEFtt$<-V*J%wPg@ZdwolhG^zNNb zzQQy%-PLHX+PvGiiz?}Xe*KUnN5R=SQgc~)wy?M^X4=HN{W(XeyTORyc*_l}<@e)f z9@@$#SuDdxX?k@JF_hQAD{~5_#UYJEXN(Z>QotmvNGI@=vAI?z6W1n)+o!IN54DnDTF)8G%x10PoU1gALUH_G zQbt@$^%n4&Y=BJJF_ExcyX#M-ZG zvo3AQjfM>D0y*keo7i7#HQzOImt+_=PjV@glgdLKU9(*`7_1N&RS?Sn1{y;-G zlp*8GUMwPiz+T1lln=EDnEPXYqO6=PAzB!o}j!n}# z6K97bsjYx!SB6!*r|c$QG!?o&CWd$X6O~_L2=dF ztjyCMmn?^q@#$s{1a`IqXp%G8fa>iZK&kCp~?Q z9VfA|ohrx-ZF*!KXFyEyI)aP&Wg4eVa$HXkuUc`DNz6Zn-t{$Dmwc9BAwy9+zi%t! zVK*I|*>~kfC|gGMgMf;an0=d^KVWk?Q#C4z-Ps)9riGt8muS*#Mn7{m(AQ-Bqph#; zLX&38L&w)A*hF%P*rY@|w)k$zy+}j^6F~bwimMR@D!7zcVe4Wyt_Z$bNF1fV(S{MYBY>Gys}VCDcmyb4M{5uDFFeP<;rM_ zQu)~&+cd`fnzABCbuk%D;Zse%12YPZZFRYVeH?q6C zS#_&r@mkQ9*xd(jKp6g4kI7PY4_AJjf>MAE;$p`k#Zn=SOfbK2*XA$&AEJ0ywM2DX zg_B8Uts%2nVCz#P_=|{b1wq?ACYTaPvWg-(cq!N{#{V($_(R$lDs#FFjL1$=aevDPeWXLO5#QgU$cod1HCCLsYC@EYXq z^)WA&wF`yDk?TOcRm9oPMC})LW`+cU@p+FFj3wWYRLssw(l{OKjEZ{29>>RMCiasV zrKWVf&m-AT#&^-NE5R|Kos^?**U4W}2F2kv z959~#Y)>+?J>RBxfx5Fvs!fuZKR0R}B;gW|jV76b09JH*ZbN1w2YeLNs81>^qyJGT zJ_a=F>}ga3_GiZXd$PaXD0MUL)T7&&4m!O6mn^#jeQ3aYf9-rww*`9}(f-`aWacdK z2ZQEc`)Mr6?zU0I6Ek)jqK2V;Zz*lkqltq}XL^{;o;_3}$cGsxW!G{1o#}L)9O|kJ zoE||$yS0KPb3)mf;!xzR20*Pj5B5O zpC{;Z4lJvAbh}6l{GsvdYm6=SP=>8*OgKX-rkB)OCd6p;>zdt@VmzCrV!q4@b8oX6 z{b)j5T;WjAy)In^`2$P$IZZh`< zN;gr`63FB%(pI`NJo0uhWjX^@Q_S3^wg5Ew04pNH<(yS- zT|49+!|P@>`h$$ZzKnB}vsz=aNsMJhqkXd~E5}(dc1BxlX3u0(T4WOUsI>_~B>R79 z8}26*Wa6a?tXb00RjNLj5g(_uPHLA@qZPwh}vZdu-FWbZW4Kuv2#{LKGf(p0zluRKeA_JsR@6tAy`iU($t90IwoQ)khV|ns1 t*vX&>4}G$$V, 2005. +# Gabor Kelemen , 2005, 2006, 2007, 2008, 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 22:02+0100\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Váratlan attribútum („%s”) a(z) „%s” elemhez" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "A(z) „$2%s” elem „$1%s” attribútuma nem található" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Váratlan címke: „%s” a várt „%s” helyett" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Váratlan címke: „%s” a következőn belül: „%s”" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Az adatkönyvtárakban nem található érvényes könyvjelzőfájl" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Már létezik könyvjelző a következő URI címhez: „%s”" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nem található könyvjelző a következő URI címhez: „%s”" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Nincs MIME típus meghatározva a következő URI könyvjelzőjéhez: „%s”" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nincs magán jelző meghatározva a következő URI könyvjelzőjéhez: „%s”" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nincsenek csoportok beállítva a következő URI könyvjelzőjéhez: „%s”" + +# FIXME: hol jön ez elő? +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Nincs „%s” nevű alkalmazás regisztrálva a következő könyvjelzőjéhez: „%s”" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" +"Nem sikerült kiterjeszteni a(z) „%s” végrehajtási sort a(z) „%s” URL címmel" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "A(z) „%s” és „%s” karakterkészletek közötti átalakítás nem támogatott" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" +"A(z) „%s” karakterkészletről „%s” karakterkészletre átalakító nem nyitható " +"meg" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Érvénytelen bájtsorrend az átalakítás bemenetében" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Hiba az átalakítás során: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Részleges karaktersorozat a bemenet végén" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nem alakítható át a tartalék „%s” a(z) „%s” kódkészletre" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "A(z) „%s” URI nem abszolút, a „file” sémát használó URI" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "A(z) „%s” helyi fájl URI nem tartalmazhat „#” karaktert" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "A(z) „%s” URI érvénytelen" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "A(z) „%s” gépneve érvénytelen" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" +"A(z) „%s” URI érvénytelen, escape sorozatként megadott karaktereket tartalmaz" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "A(z) „%s” elérési út neve nem abszolút útvonal" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Érvénytelen gépnév" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Hiba a(z) „%s” könyvtár megnyitásakor: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nem sikerült %lu bájtot lefoglalni a(z) „%s” fájl olvasásához" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Hiba a(z) „%s” fájl olvasása közben: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "A fájl („%s”) túl nagy" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nem sikerült olvasni a(z) „%s” fájlból: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nem sikerült megnyitni a(z) „%s” fájlt: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Nem sikerült lekérni a(z) „%s” fájl attribútumait. Az fstat() sikertelen: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nem sikerült megnyitni a(z) „%s” fájlt. Az fdopen() sikertelen: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Nem sikerült átnevezni a(z) „%s” fájlt erre: „%s”. A g_rename() sikertelen: %" +"s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Nem sikerült írásra megnyitni a(z) „%s” fájlt: Az fdopen() sikertelen: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nem sikerült írni a(z) „%s” fájlt: az fwrite() sikertelen: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nem sikerült írni a(z) „%s” fájlt: az fflush() sikertelen: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nem sikerült írni a(z) „%s” fájlt: az fsync() sikertelen: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nem sikerült lezárni a(z) „%s” fájlt: az fclose() sikertelen: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "A létező „%s” fájl nem távolítható el: a g_unlink() sikertelen: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "A(z) „%s” sablon érvénytelen, „%s” nem lehet benne" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "A(z) „%s” sablon nem tartalmaz XXXXXX karaktersorozatot" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bájt" +msgstr[1] "%u bájt" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nem sikerült kiolvasni a(z) „%s” szimbolikus linket: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "A szimbolikus linkek használata nem támogatott" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Az átalakító a(z) „%s” elemről „%s” elemre nem nyitható meg: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Nem lehet nyers (raw) olvasást végezni a g_io_channel_read_line_string-ben" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Át nem alakított adatok maradtak az olvasási pufferben" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "A csatorna töredék karakterrel ér véget" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nem lehet nyers (raw) olvasást végezni a g_io_channel_read_to_end-ben" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nem sikerült megnyitni a(z) „%s” fájlt: az open() sikertelen: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Nem sikerült leképezni a(z) „%s” fájlt: Az mmap() sikertelen: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Hiba a(z) %d. sor %d. karakterénél: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Érvénytelen UTF-8 kódolású szöveg a névben - nem érvényes „%s”" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s” nem érvényes név" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s” nem érvényes név: „%c”" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Hiba a(z) %d. sorban: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nem sikerült feldolgozni ezt: „%-.*s”. Valószínűleg számjegy lett volna egy " +"karakterhivatkozáson (mint az ê) belül - lehet, hogy túl nagy a számjegy" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"A karakterhivatkozás nem pontosvesszővel ért véget; valószínűleg egy &-jelet " +"használt anélkül, hogy entitást akart volna kezdeni - írja & formában." + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "A(z) „%-.*s” karakterhivatkozás nem engedélyezett karaktert kódol" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Üres „&;” entitás; az érvényes entitások: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "A(z) „%-.*s” entitásnév ismeretlen" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Az entitás neve nem pontosvesszővel ért véget; valószínűleg egy &-jelet " +"használt anélkül, hogy entitást akart volna kezdeni - írja & formában." + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "A dokumentumnak egy elemmel kell kezdődnie (például: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s” nem érvényes karakter a „<” karakter után; elem neve nem kezdődhet vele" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Furcsa karakter („%s”), „>” karakternek kellett volna jönnie, hogy lezárja a" +"(z) „%s” üres elemcímkét" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Furcsa karakter („%s”) - „=” karakternek kellett volna jönnie a(z) „%s” elem " +"„%s” attribútumneve után" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Furcsa karakter („%s”) - „>” vagy „/” karakternek kellett volna jönnie a(z) " +"„%s” elem kezdő címkéje után, esetleg egy attribútumnak; lehet, hogy " +"érvénytelen karaktert használt az attribútum nevében" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Furcsa karakter („%s”) - egy nyitó idézőjelnek kellene jönnie az " +"egyenlőségjel után, ha értéket ad a(z) „%s” attribútumnak „%s” elemben" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s” nem érvényes karakter a „%s” lezáró elemnév után; az engedélyezett " +"karakter egyedül a „>”." + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "A(z) „%s” elem le lett lezárva, jelenleg egy elem sincs nyitva" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "A(z) „%s” elem le lett lezárva, de a jelenleg nyitott elem a(z) „%s”" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "A dokumentum üres volt, vagy csak üres hely karaktereket tartalmazott" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"A dokumentum váratlanul véget ért egy nyitott hegyes zárójel („<”) után" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"A dokumentum váratlanul véget ért, pedig még nyitva vannak elemek - „%s” az " +"utoljára megnyitott elem" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"A dokumentum váratlanul véget ért; a(z) <%s/> elemet lezáró hegyes " +"zárójelnek kellett volna következnie" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "A dokumentum váratlanul véget ért egy elemnéven belül" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "A dokumentum váratlanul véget ért egy attribútumnéven belül" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "A dokumentum váratlanul véget ért egy elemnyitó címkén belül" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"A dokumentum váratlanul véget ért egy az attribútumnevet követő " +"egyenlőségjel után; az attribútum értéke nem lett megadva" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "A dokumentum váratlanul véget ért egy attribútumértéken belül" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "A dokumentum váratlanul véget ért a(z) „%s” elem lezáró címkéjén belül" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"A dokumentum váratlanul véget ért egy megjegyzésen vagy feldolgozási " +"utasításon belül" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "sérült objektum" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "belső hiba vagy sérült objektum" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "elfogyott a memória" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "a visszakövetési korlát elérve" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"a minta a részleges mintaillesztés esetén nem támogatott elemeket tartalmaz" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "belső hiba" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"a visszahivatkozások használata feltételekként nem támogatott a részleges " +"mintaillesztéshez" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "az ismétlési korlát elérve" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "az üres rész-karaktersorozatok munkaterület-korlátja elérve" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "újsor-jelzők érvénytelen kombinációja" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ismeretlen hiba" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ a minta végén" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c a minta végén" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ismeretlen karakter következik a \\ után" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"itt nem engedélyezettek a kis-és nagybetűket átalakító escape-karakterek " +"(\\l, \\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "a számok nincsenek sorrendben a {} kvantálóban" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "a szám túl nagy a a {} kvantálóban" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "a karakterosztály befejező ] jele hiányzik" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "érvénytelen escape-sorozat a karakterosztályban" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "a tartomány kívül esik a karakterosztály nagyságán" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nincs mit ismételni" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "ismeretlen karakter a (? után" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "ismeretlen karakter a (?< után" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "ismeretlen karakter a (?P után" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "a POSIX elnevezett osztályok csak osztályon belül támogatottak" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "hiányzó befejező )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") nyitó ( nélkül" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "a (?R vagy (?[+-]számjegyek elemeket )-nek kell követnie" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "hivatkozás nem létező almintára" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "a megjegyzés utáni ) hiányzik" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "a reguláris kifejezés túl nagy" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "a memóriakérés meghiúsult" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "a lookbehind kijelentés nem rögzített hosszúságú" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "hibásan formázott szám vagy név a (?( után" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "a feltételes csoport kettőnél több ágat tartalmaz" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "a (?( után kijelentésnek kellene állnia" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ismeretlen POSIX osztálynév" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "a POSIX leválogató elemek nem támogatottak" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "a \\x{...} sorozaton belüli karakterérték túl nagy" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "érvénytelen feltétel: (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "A \\C nem engedélyezett a lookbehind kijelentésben" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "a rekurzív hívás végtelen ciklushoz vezethet" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "hiányzó befejező az alminta nevében" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "két elnevezett alminta neve azonos" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "rosszul formázott \\P vagy \\p sorozat" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "ismeretlen tulajdonságnév a \\P vagy \\p után" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "az alminta neve túl hosszú (legfeljebb 32 karakter)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "túl sok elnevezett alminta (legfeljebb 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "az oktális érték nagyobb, mint \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "a DEFINE csoport több ágat tartalmaz" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "egy DEFINE csoport ismétlése nem engedélyezett" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inkonzisztens NEWLINE beállítások" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"a \\g után nem egy zárójelezett név vagy opcionálisan zárójelezett nem nulla " +"szám áll" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "váratlan ismétlés" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kódtúlcsordulás" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "a fordítási munkaterület túlcsordult" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "a korábban ellenőrzött hivatkozott alminta nem található" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Hiba a(z) %s reguláris kifejezés illesztésekor: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "A PRCE programkönyvtár UTF-8 támogatás nélkül lett fordítva" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"A PRCE programkönyvtár az UTF-8 tulajdonságok támogatása nélkül lett fordítva" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Hiba a(z) „%s” reguláris kifejezés fordításakor a(z) %d. karakternél: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Hiba a(z) %s reguláris kifejezés optimalizálásakor: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "a program hexadecimális számjegyet vagy „}” jelet várt" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "a program hexadecimális számjegyet várt" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "hiányzó „<” jel a szimbolikus hivatkozásban" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "befejezetlen szimbolikus hivatkozás" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "nulla hosszúságú szimbolikus hivatkozás" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "re rendszer számjegyet várt" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "illegális szimbolikus hivatkozás" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "a záró „\\” helye nem megfelelő" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ismeretlen escape sorozat" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Hiba a(z) „%s” helyettesítőszöveg elemzésekor a(z) %lu. karakternél: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Az idézett szöveg nem idézőjellel kezdődik" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Pár nélküli idézőjel a parancssorban vagy más, parancsértelmezőből idézett " +"szövegben" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "A szöveg egy „\\” karakter után véget ért. (A szöveg: „%s”)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"A szöveg véget ért, mielőtt %c idézőjelpárja meglett volna. (A szöveg: „%s”)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" +"A szöveg üres volt (vagy legfeljebb üres hely karaktereket tartalmazott)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nem sikerült adatokat kiolvasni a gyermekfolyamatból" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Nem sikerült csővezetéket készíteni a gyermekfolyamattal (%s) való " +"kommunikációhoz" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nem sikerült olvasni a gyermek csővezetékből (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nem sikerült átváltani a(z) „%s” könyvtárra (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nem sikerült végrehajtani a gyermekfolyamatot (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Érvénytelen programnév: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Érvénytelen karaktersorozat a paraméterben a következő helyen: %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Érvénytelen karaktersorozat a környezetben: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Érvénytelen munkakönyvtár: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nem sikerült végrehajtani a segítő programot (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Váratlan hiba, miközben a g_io_channel_win32_poll() adatokat olvasott egy " +"gyermekfolyamatból" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nem sikerült adatokat olvasni a gyermekfolyamatból (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Váratlan hiba, miközben a select() adatokat próbált olvasni egy " +"gyermekfolyamatból (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Váratlan hiba a waitpid()-ben (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nem sikerült folyamatot indítani (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nem sikerült a gyermekfolyamat („%s”) végrehajtása (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nem sikerült a gyermekfolyamat ki- vagy bemenetének átirányítása (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nem sikerült a gyermekfolyamat elindítása (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ismeretlen hiba a gyermekfolyamat („%s”) végrehajtása közben" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Nem sikerült elég adatot kiolvasni a gyermek pid csővezetékből (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "A karakter az UTF-8 tartományon kívülre esik" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Érvénytelen sorozat az átalakítási bemenetben" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "A karakter az UTF-16 tartományon kívülre esik" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Használat:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[KAPCSOLÓ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Súgólehetőségek:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Súgólehetőségek megjelenítése" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Minden súgólehetőség megjelenítése" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Alkalmazás kapcsolói:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nem dolgozható fel a(z) „%s” egész érték a következőhöz: %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "A(z) „%s” egész érték a tartományon kívülre esik a következőhöz: %s" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nem dolgozható fel a(z) „%s” dupla hosszúságú érték a következőhöz: %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" +"A(z) „%s” dupla hosszúságú érték a tartományon kívülre esik a következőhöz: %" +"s" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Hiba a kapcsoló feldolgozása során: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Hiányzó paraméter a következőhöz: %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Ismeretlen kapcsoló: %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "A keresési könyvtárakban nem található érvényes kulcsfájl" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nem szabályos fájl" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "A fájl üres" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"A kulcsfájl tartalmazza a(z) „%s” sort, amelyik nem egy kulcs-érték pár, " +"csoport, vagy megjegyzés" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Érvénytelen csoportnév: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "A kulcsfájl nem csoporttal kezdődik" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Érvénytelen kulcsnév: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "A kulcsfájl a nem támogatott „%s” kódolást tartalmazza" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "A kulcsfájlból hiányzik a(z) „%s” csoport" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "A kulcsfájlban nincs „%s” kulcs" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"A kulcsfájl tartalmazza a(z) „%s” kulcsot „%s” értékkel, amelyik azonban nem " +"UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"A kulcsfájl tartalmazza a(z) „%s” kulcsot, amelynek az értéke nem " +"értelmezhető." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"A kulcsfájl tartalmazza a(z) „%s” kulcsot, amelynek értéke nem értelmezhető." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"A kulcsfájl tartalmazza a(z) „%s” kulcsot a(z) „%s” csoportban, amelynek " +"értéke nem értelmezhető." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "A kulcsfájl nem tartalmazza a(z) „%s” kulcsot a(z) „%s” csoportban." + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "A kulcsfájl escape sorozattal megadott karaktert tartalmaz a sor végén" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "A kulcsfájl érvénytelen escape sorozatot tartalmaz („%s”)" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "A(z) „%s” érték nem értelmezhető számként." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "A(z) „%s” egész érték a tartományon kívülre esik" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "A(z) „%s” érték nem értelmezhető lebegőpontos számként." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "A(z) „%s” érték nem értelmezhető logikai értékként." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Túl nagy számérték került átadásra ennek: %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Az adatfolyam már le van zárva" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "A művelet megszakítva" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Érvénytelen objektum, nincs előkészítve" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Érvénytelen több bájtos sorozat a bemenetben" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Nincs elég hely a célon" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "A megszakítható előkészítés nem támogatott" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Ismeretlen típus" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s fájltípus" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s típus" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Váratlan korai adatfolyam vége" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Névtelen" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "A desktop fájl nem adta meg az Exec mezőt" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Nem található az alkalmazáshoz szükséges terminál" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Nem hozható létre a(z) %s felhasználói alkalmazáskonfigurációs mappa: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nem hozható létre a(z) %s felhasználói MIME konfigurációs mappa: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nem hozható létre a felhasználói desktop fájl (%s)" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s egyéni meghatározása" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "a meghajtó nem valósítja meg a kiadást" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"a meghajtó nem valósítja meg a kiadást vagy az eject_with_operation függvényt" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "a meghajtó nem valósítja meg a média lekérdezését" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "a meghajtó nem valósítja meg a indítást" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "a meghajtó nem valósítja meg a leállítást" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "A GEmblem kódolás %d. verziója nem kezelhető" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "A GEmblem kódolásban a jelsorok száma (%d) hibásan formált" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "A GEmblemedIcon kódolás %d. verziója nem kezelhető" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "A GEmblemedIcon kódolásban a jelsorok száma (%d) hibásan formált" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Egy GEmblem kellene a GEmblemedIconhoz" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "A művelet nem támogatott" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "A tartalmazó csatolás nem létezik" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Nem lehet a könyvtárra másolni" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "A könyvtár nem másolható könyvtárba" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "A célfájl létezik" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "A könyvtár nem másolható rekurzívan" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "A fájlillesztés nem támogatott" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Hiba a fájl illesztése közben: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "A speciális fájl nem másolható" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Érvénytelen szimbolikus link érték került megadásra" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "A Kuka nem támogatott" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "A fájlnevek nem tartalmazhatnak „%c” karaktert" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "a kötet nem valósítja meg a csatolást" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nincs alkalmazás regisztrálva a fájl kezeléséhez" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Az enumerátor le van zárva" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "A fájlenumerátor hátralévő művelettel rendelkezik" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "A fájlenumerátor már le van zárva" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "A GFileIcon kódolás %d. verziója nem kezelhető" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "A GFileIcon bemeneti adatai rosszul formáltak" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Az adatfolyam nem támogatja a query_info-t" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Az adatfolyam nem támogatja a pozicionálást" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "A bemeneti adatfolyam csonkítása nem engedélyezett" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Az adatfolyam csonkítása nem engedélyezett" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "A jelsorok száma hibás (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Nincs típus az osztálynévhez: %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "A típus (%s) nem valósítja meg a GIcon felületet" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "A típus (%s) nem tartalmaz osztályokat" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Rosszul formált verziószám: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" +"A típus (%s) nem valósítja meg a from_tokens() függvényt a GIcon felületen" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Az ikonkódolás megadott verziója nem kezelhető" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "A bemeneti adatfolyam nem valósítja meg az olvasást" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Az adatfolyam hátralévő művelettel rendelkezik" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Nincs elég hely a foglalat címének" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nem támogatott foglalatcím" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Nem található az alapértelmezett helyi könyvtárfigyelő típus" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Érvénytelen fájlnév: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Hiba a fájlrendszer-információk lekérése közben: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Nem nevezhető át a gyökérkönyvtár" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Hiba a fájl átnevezése közben: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "A fájl nem nevezhető át, a fájlnév már létezik" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Érvénytelen fájlnév" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Hiba a fájl megnyitása közben: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "A könyvtár nem nyitható meg" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Hiba a fájl eltávolítása közben: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Hiba fájl kidobása közben: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nem sikerült létrehozni a(z) %s Kuka könyvtárat: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Nem található a Kuka felső szintű könyvtára" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Nem található vagy nem hozható létre a Kuka könyvtár" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nem sikerült létrehozni a kukainformációs fájlt: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nem lehet a Kukába dobni a fájlt: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Hiba a könyvtár létrehozásakor: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "A fájlrendszer nem támogatja a szimbolikus linkeket" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Hiba a szimbolikus link létrehozása során: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Hiba a fájl áthelyezésekor: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "A könyvtár nem helyezhető át könyvtárba" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "A mentési fájl létrehozása meghiúsult" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Hiba a célfájl eltávolításakor: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "A csatolások közti áthelyezés nem támogatott" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Az attribútum értéke nem lehet NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Érvénytelen attribútumtípus (a várt karakterlánc helyett)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Érvénytelen kiterjesztett attribútumnév" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Hiba a(z) „%s” kiterjesztett attribútum beállításakor: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Hiba a(z) „%s” fájl elérése közben: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (érvénytelen kódolás)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Hiba a fájlleíró elérésekor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Érvénytelen attribútumtípus (a várt uint32 helyett)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Érvénytelen attribútumtípus (a várt uint64 helyett)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Érvénytelen attribútumtípus (a várt bájtkarakterlánc helyett)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Nem állíthatók be a szimbolikus linkek jogosultságai" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Hiba a jogosultságok beállításakor: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Hiba a tulajdonos beállításakor: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "a szimbolikus link nem lehet NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Hiba a szimbolikus link beállításakor: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Hiba a szimbolikus link beállításakor: a fájl nem szimbolikus link" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Hiba a módosítási vagy hozzáférési idő beállításakor: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "A SELinux környezet nem lehet NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Hiba a SELinux környezet beállításakor: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "A SELinux nem engedélyezett ezen rendszeren" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "A(z) %s attribútum beállítása nem támogatott" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Hiba a fájl olvasásakor: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Hiba a fájlban kereséskor: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Hiba a fájl lezárásakor: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Nem található az alapértelmezett helyi fájlfigyelő típus" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Hiba a fájl írásakor: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Hiba a régi mentési link eltávolításakor: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Hiba a mentés létrehozásakor: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Hiba az ideiglenes fájl átnézésekor: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Hiba a fájl csonkításakor: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Hiba a(z) „%s” fájl megnyitásakor: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "A célfájl egy könyvtár" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "A célfájl nem szabályos fájl" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "A fájlt külső program módosította" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Hiba a régi fájl eltávolítása közben: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "A megadott GSeekType nem támogatott" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Érvénytelen keresési kérés" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "A GMemoryInputStream nem csonkítható" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "A memóriakimeneti adatfolyam nem méretezhető át" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "A memóriakimeneti adatfolyam átméretezése meghiúsult" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Az írás feldolgozásához szükséges memória mérete nagyobb, mint az elérhető " +"címtér" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Pozicionálási kérés az adatfolyam eleje elé" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Pozicionálási kérés az adatfolyam vége mögé" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "A csatolás nem valósítja meg az „unmount” függvényt" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "A csatolás nem valósítja meg az „eject” függvényt" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"A csatolás nem valósítja meg az „unmount” vagy az „unmount_with_operation” " +"függvényt" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"A csatolás nem valósítja meg az „eject” vagy az „eject_with_operation” " +"függvényt" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "A csatolás nem valósítja meg a „remount” függvényt" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "A csatolás nem valósítja meg a tartalomtípus meghatározását" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "A csatolás nem valósítja meg a tartalomtípus szinkron meghatározását" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "A gépnév („%s”) „[” karaktert tartalmaz „]” nélkül" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "A kimeneti adatfolyam nem valósítja meg az írást" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "A forrás adatfolyam már le van zárva" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Hiba a(z) „%s” feloldása közben: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Hiba a(z) „%s” fájl fordított feloldása közben: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nem tartozik szolgáltatásrekord ehhez: „%s”" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ideiglenesen nem oldható fel: „%s”" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Hiba a(z) „%s” feloldása közben" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Érvénytelen foglalat, nincs előkészítve" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Érvénytelen foglalat, az előkészítés meghiúsulásának oka: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "A foglalat már le van zárva" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket létrehozása fájlleíróból: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nem sikerült létrehozni foglalatot: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Ismeretlen protokollt adtak meg" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "nem kérhető le a helyi cím: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "nem kérhető le a távoli cím: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "nem lehet figyelni: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Hiba a címhez csatlakozáskor: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Hiba a kapcsolat elfogadásakor: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Hiba a csatlakozáskor: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Csatlakozás folyamatban" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Hiba a csatlakozáskor: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nem lehet lekérni a függőben lévő hibát: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Hiba az adatok fogadásakor: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Hiba az adatok küldésekor: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Hiba a foglalat lezárásakor: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Várakozás a foglalat állapotára: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Hiba az üzenet küldésekor: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "A GSocketControlMessage nem támogatott Windowson" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Hiba az üzenet fájl eltávolítása fogadásakor: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Ismeretlen csatlakozási hiba" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "A figyelő már le van zárva" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "A hozzáadott foglalat le van zárva" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "A GThemedIcon kódolás %d. verziója nem kezelhető" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "A várt 1 vezérlőüzenet helyett %d érkezett" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Váratlan típusú kiegészítő adatok" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "A várt egy fájlleíró helyett %d érkezett\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Érvénytelen fájlleíró érkezett" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Hiba a unix olvasásakor: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Hiba a unix lezárásakor: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Fájlrendszer gyökere" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Hiba a unix írásakor: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Az absztrakt unix tartományfoglalat-címek nem támogatottak ezen a rendszeren" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "a kötet nem valósítja meg a kiadást" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"a kötet nem valósítja meg a kiadást vagy a eject_with_operation függvényt" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nem található az alkalmazás" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Hiba az alkalmazás indításakor: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Az URI címek nem támogatottak" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "a társításmódosítások nem támogatottak win32 rendszeren" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "A társítás létrehozása nem támogatott win32 rendszeren" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Nincs elég memória" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Belső hiba: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "További bemenet szükséges" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Érvénytelen tömörített adatok" diff --git a/po/hy.gmo b/po/hy.gmo new file mode 100644 index 0000000000000000000000000000000000000000..36d3e763852289a864f75af0139a00f9e6626c25 GIT binary patch literal 2913 zcmbW2%WoT16o)URyaJR^V8f%mtrRt(8e^v+6t@JLM@508rEvj?MKrdr?IGj2*37tx zcPX!m1q%d)RTeHSN#sDHD2-Ae$)>xCP2qZp;6FeJvF3N~_)VM^CK`V;cg{Vpd(O$P zdv{-AxSqiMH0~R?pTTY4g&$nMfg$jBFamb&V(f8n5ai(7;8Wl=-D) z*T52(1^)(L2a_F)Jqa#@gWyf@WpK}fjO_)-K)A^ep3WcK)$!~B;hMfWE5ugz2yU3x z7oE*Rm1nrgkXixI>e91rJNk-VI!_9T`nDN zTMl$5qrA(jF6M+|Icc7>T#@jlTi}Pfyh9BFWSj)F{rb0Q%k!I-d7>6YT)^e5JTG7< zJ&|`{b+WsMr%Z$p*gmNrDYk?yJ<+HE{c?wZaxfVGZ<*6in zZKt?-r;fj!+W)F*C$quPx-wh$y2ZAZ@H2vYg=}2fR)P+3vVKZ+FJ0l7*@oOudV>Q? zPXyoE1y4C@*oXl2N{cuZpyhFq&G`j3o{>{LBkUZPIp30w$Hp7|^K?0T`CLxAzDTlj zo|zU=cE*+Oq0Ed^N#iZydf0~wv8{OM)sYj!9cKke8>3#@N*aUtv}eR*ly{st9W#dL z+#zlZkD}E_Tv5T9+gL zQo=PxoP?wfj3R`%<##aki7IimtcvOfwXQbRdii~|8Z2z7B~>h6P;2U{TGT^CU54B> zwV+1_FMq7x7S%l0k~8WG78XfGpkNi-XPEjNs~c(yzYALZ3WzP=L+w`iL$2mHJ}=?k zBv;nUGv$l4HV0L6Y86sz*bLuzclo38j4I*1sFrH;NPVilCA%0!TnnxQL8w_8OjNUE zs~GGe!w3RVA*R67jbM9&_>O_?EPkCrptQ}v;}wpOuHupG;RzOJ8)q09E`Ok1Be@HK z3#}(Y$=6a#q(L`fL+Y`oHstO^-%8*JrF;weR@8S|Yc*u8emg&E`)b*1^@OXh5o#^1 zR8qPC$iwQiZ1xb*;Dq%tH3xlrWB+?s8&|eZ{vG*InaItdwbxf^u%JeC!?Yx_)P66W ze`Bi!J8_gHq#C`80xO|2(9YE!nBOr`mFh%mZ0ai9roMDT>R#Qb)<(lWfZGL)9;nt^ zr8ruGMQv37JG9aDB|N)^z|gpqEsPOV8DgAc>N9F!WUHvI1eM1X_4SX`>LgU1Y&6Iy x?F&#uT*Du=P*j9XeXeSj{R8p_)rbH9 literal 0 HcmV?d00001 diff --git a/po/hy.po b/po/hy.po new file mode 100644 index 0000000..1d1d72d --- /dev/null +++ b/po/hy.po @@ -0,0 +1,2035 @@ +# glib.po armenian translation +# Copyright (C) 2006 GNOME FOUNDATION +# This file is distributed under the same license as the glib package. +# Norayr Chilingaryan , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2006-03-03 16:24+0000\n" +"Last-Translator: Norayr Chilingaryan \n" +"Language-Team: Armenian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 16bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ '%s' Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղումը՝ %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու սխալ՝ %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Չի հաջովում հատկացնել %lu Õ¢Õ¡ÕµÕ© \"%s\" ֆայլը կարդալու համար" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Չի հաջողվում կարդալ '%s' ֆայլից՝ %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը՝ %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը՝ fdopen() խափանվեց՝ %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ վերանվանել '%s' ֆայլը որպես '%s'՝ g_rename() խափանվեց՝ %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը գրելու համար՝ fdopen() խափանվել է՝ %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Չի Õ°Õ¡Õ¸Õ²Õ¾Õ¥Õ¬ գրել '%s' ֆայլ՝ fwrite() խափանվեց՝ %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Չի Õ°Õ¡Õ¸Õ²Õ¾Õ¥Õ¬ գրել '%s' ֆայլ՝ fwrite() խափանվեց՝ %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Չի Õ°Õ¡Õ¸Õ²Õ¾Õ¥Õ¬ գրել '%s' ֆայլ՝ fwrite() խափանվեց՝ %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ¾Õ¥Õ¬ փակել '%s' ֆայլը՝ fclose() խափանվեց՝ %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' ֆայլը Õ¹Õ« կարող վերացվել՝ g_unlink() խափանվեց՝ %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ '%s' Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղումը՝ %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը՝ open() խափանվեց՝ %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Սխալ %d Õ¿Õ¸Õ²Õ« %d տառում՝ %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Սխալ UTF-8 կոդավորված տեքստ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Փաստաթուղթը պետք Õ§ Õ½Õ¯Õ½Õ¾Õ« որևէ Õ§Õ¬Õ§Õ´Õ¥Õ¶Õ¿Õ¸Õ¾ (օրինակ )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Սխալ %d Õ¿Õ¸Õ²Õ« %d տառում՝ %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Կիրառում՝" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +#, fuzzy +msgid "Help Options:" +msgstr "Ցուցադրել Ձեռնարկի հատկությունները" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Ցուցադրել Ձեռնարկի հատկությունները" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Ֆայլը դատարկ Õ§" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու սխալ՝ %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ '%s' Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղումը՝ %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու սխալ՝ %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու սխալ՝ %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու սխալ՝ %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Սիմվոլիկ հղումները Õ¹Õ¥Õ¶ ապահովվում" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Սխալ UTF-8 կոդավորված տեքստ" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Սխալ UTF-8 կոդավորված տեքստ" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" diff --git a/po/id.gmo b/po/id.gmo new file mode 100644 index 0000000000000000000000000000000000000000..3211da6c6fbad00d33837fb01941f814a8a62dbb GIT binary patch literal 15593 zcmd6tYm6kzVat$NR9?-j~<24#qY^b$3m7 zZC6+I)?;VKQ4k6^AU+^0%O3*75ij`*2uG3lfFlATAw&)m5)uN7Sojk%51|ktp(F@? z=iFP>)jiK3Bhi}M|LN*`&pr3N?m74N8#iD7qTyB0K1%!gJB;}v7`=-(UjOhOW1a-x z1ed{uUB>v}uYz&rS3JBT(r6KKNbv z;5Wf%!D|Rn4bKnc0@b`6a9=rji%KWFm17Hryyf1?b z;MYL0gCBs>?{1hDc|8W62R{QI2VVnsgEx7Wp97%G{|qSKC*V85uYe-2KLUl`TOh7v zZbK;Nu7f_<<#P(LYvAjke106I3%yrCnfEWjN5GFEv?E{-6#MvHQ1ttEpvYN_(gSvb z(*HR4W$;(PPl3niEbII^Q26>Pco_U=a1Hzfi$4dx1l|Y!EBF)g93{#4r@=+=H^7I$ zH$ai&9)#2fp9Gh|Z-DoLQz%RH^%QR>!Ow$7!Eb{t@CJ0Lz~{hkgR-8B7#Cg5XF(bFdmy4R{{nj8t^2Lr+zX1`ErX}P zUjz9wZ}Rp&@D_ykesDJ^d>;f+rSUNk$gbx(P(FVPl>T?3EaCqWDD!_76utizD15!{KEIpJGXF79 z{AL;aX>b+%3-E71k<*tLjB3mj#wC1S1V!%8fx_p@py=mML7C^Dz@G$n-*5Ht8Bpf^ zGf?FHUGP@$qX_c>a6gDkm;@AmcmWjpe+7y@|J~s{#xCpm9JmO+41O4V3w#W`p26=1 zp8)0iWssrfH^KLUe-B;<%IglAjFHza+AXw;@`2YeeJ5^$LI<&`T|DKU3;dY-pQW11 zG)zTf-N!-E@ljg+CF>__nfK7zv@^6PXcuUN3H4*qVV@?pFLILCBeW0Fo}r2Df0`yX zaGqAaL^opJ*V9BEA|rW;uFBV4{6kpKSHb%^+QasvzT@H=Yhy5=Wi;^>c|C2xtbn2? z(eXRovky2FyPbTAEj>vS-|EudMH9P}S3(==f7Vvs!T%qj-9QtYlow`Fy+nVH(-Rk48F> zo=*Qsk$cGs3yr%0#*liKmQFSH-?v?l!?g}+uo9#}+!kgU&3mx6PQui(Jf5-+VL@2R z^STZ;q|m`Q?ZA$=8s?KsZEe9dckLDu$%a9C0BGj9){7R+%~O(v$Xk|u+Z^x(+qMJU$2 zD=UV>BxR9|Eh4)RF+B_{@TQ`|Ypsb+7^OC~5=Mcydn(&q>z)jQxHJm!PMKJza8vyV zUFXFlP9*I@9TpiNt0E4r4Fep%g9QB*2>{|B!Ii>~GA|3etaTI+5NwWhw+h%7hhIQ7 zwMS}zTh0*1S*Yr7Cj;dI`x>T6JIFFo2w&%E(H6Jc5t&JTb~tD(W^E;qlHDrIHAEe1 zI)1mgli4)VX(Y=1uDVk>xhQc<3YQCP+o}YMRy)8av5*#?+82vEvNeI#p4ii94I|xc zuPAjj$0~M^hf!o%Xjto8#VcfOkq?vQl7vTWeG7@sdZoFk^92$K+A5y$rIilK3?jE9 zQ`x?wBf0~TjNO53NT~GV%>>PE(>u~ilK#=XqY=VxFc{+C7#txs_leXUFNv{w#Do(L z{dQnZy3I@-OvWg0ommfy*X6d0l)#oVO7&4LTs99;=ceOvlUm<#D(0jz23ZL}(|Z=C zi6;TU&F;+lJS0l^X)tdik+m^Bo=D!h^5zedY{8tgH2xpO%#&$~#5;v-i7t#u z0M$@rzayH;w&_iE>JOcpb;6Y3l%&W7`PMo}ycCieGDqKC3o+IDW9BRaZz~|m4w9<@ z6Lpu1m|6QXd)a9556D-tv?aD zM$LXb4B3BV=anE?#F~z$Xn(_J<6KP8?h?PMc$7)PQ4`7vyK=sn3m@SgNGLEmUE5#B?|VE-Jr;xKeVyiQIY&3A&{rtpk|AjkaYaqFLRxm-R-d3q*W-% zAWn*I&s#^CG*9h*!cKII%eIsQ@r_OURJxwfm{O7LDq9=05)ym~IX1Ok*V8(@N2WNG zOgKf%`p?RQTdiY45~7i1O6;(4sY`7j-)&}VVv@Ci*poh)=&oD2+r-Snc;u)&IlWo_ zFN>&hd9y*ciSO-(BRMHM(3L_nckl-ol^P>U?-8^l+`G>Ijf9Gh~LxFlOa6~Oh|M}sx1BbNjqQJe1* z@m&GLWTYP=H`$lW`Vpa9z8hJsO;dpN-TO=_UkS6_G%1GmlXdPMNrq-)q!&!wwnZRY zl~gI|Fb&Aen;Y;@5q-PJNNHsmQC=-scSs-=;NcCJ(0zM-ci)4%h9x%i!*tdzd)DS& zn)h!&tca^>$ySM?ym66MRiwtkkt|2l#(R`P+V1;t&1}%yR*5#(w2Lukf|Zx~vDr zsxWI$*lU?$s?@e4c63_wF}<&L!Xq(DOkX3V7RHi%PY_l$CVDhNDNE5&$QFnf5kHN&m~lEgRQ6pEZ<<7#!a#}3&IuZs0p6BKz@sm8{#x-fYjGKznr zXkcUCW5NI;3a-hCP>{*VP`woKghP9NBwU)ud&#OCH+hmpQ8nn1l6^Yw<02*pZJikp?BK-p@J?WQ-g zB*m7DlkbGeUgoXH)T>c%`ste0Y%z3HcFkxyyGh-}M9h8Z;%U3SDm1%=Vq`Yd*1RJd zA3~sVo!31V>4>qlvLuq^Sf(lTv_Z^#x12Pt?%u}S;l{x^@4$iiL;F8DcaVN(ID2UFII%9hwTDTlxq$h>#B73RB)`b3NAiLEi)V=IiL z>IwTr9(tW1?&8r^KhD9LEF|>uu;cg9Zxr-A^1;ivhiomr+Zb!}j0W#~l6}nbC=!Z& zEMp$X%|e^VVe2p$JNKnL1m?7qQ9h#f2~mIl1r_ zxy0!ESvYT&R3sgr@PbGpzb{gjQar$3tQxw=#Y|D>|kB&^ule8VCo$>S3gxHND4?vrsB2>J5pP`Imk3sM90a zFx)xCl`<{$spuA>#@P{qVw~$#>qm*$vdmUqnUHjgP6uKqm~d70PmCQ%Oc77&7A-tP z`KdFoVRvhW5`RYh%U~jdwTwKG^rb*mTT1c-@!GX;H8m_!A_UP7Z|iY-ttyZpj2OC%^QMS5;K7sW%sCS7FW-NJBvedXR$dKorkLrwiI#x7rJurm*+VyjT( z7@HY{nIFjnqx%>;s-I-yGisKE98#UyEsTvKC-o}EMsVVhxG%ddJK`)pH6#+*?>7*V zla6Y8D=L-0ZA!{4A{ZC)?8S^uXSrYSPReZyDWyKNd5TYkllmN{N-3sV+R>E_M79g+ z&GDfAc1Cl|Ds$m{NKg;mC6fkodq<;YJxU+SomxYo?VC86YWZUO zR>rPrSGA>Z99v%LIO=LxWAs@XZeJTRm6;7X==rvtCc{eDC1ktif=9Nua(i&8nJt}a z>^b?6)JA?Rd*N8e$;E8ldmFNP%hN()lJZRU<+#9I_taLX562jq941Qe2c+>hz5alp zF0NBH^DM7@v@bgt*;Al0_w9XQZ9<}QkZS@$_&|Klnp_I&?u53cQ|jB=Wu?3-wTO!- z%xafA%E@}$ni#%=4vxv{0%~hEE5DHVUvUXvR%Y%tX-70{mW-(MH#tokw`$t}NnW9G zRxX$92IlUQ>WSK4Z6Z)x}law90!as~`7+ zg-wUB8Tu{iP3)lC$3a{aJ5g;yRGHz5WmkC z8|HE;-Jxoa)z}<0C9m6s^>BVVmkfr9`<Rn>5YnN1h2jn?Lvt@}~j8!4BUjN8?YlLTA z6(a(=Ty$+QRpvNS2kazqA2XZ!*`5lwzPjd4Yjvc-M0)GRIf|o|Q1y&R0(LDz**mkPpzo?A>_$0q;bgpQtg&pCIGG9~;fDJPO79-q zw>{f*iD|9J*0Zo!mJw>2kxlH zuCEL!vT0Jc1_L#EYfn?{rpIktkoDzTTP3Q|%6%Jx8WFCaLsVjxyEl%Sivd^ba`ncL z4e5;bYi~wF7ze}5=hngfzWdSRUQ=CPx$ml}+>WExY4^vfs}qfGz12evzH%}lPuzuD zS=Y$cP#zX$9Ps+?>aDhMtKC$@CTGyVD@TEm_3*lK5aP(WxpI@FL$^0p>@oqa*X%gE zL&$Yo$)YXu_3lbp*!;$=@)VnwQpMJjv`IQHMXxU0CPwqqs&)CV&GRHy*}F95$I+R% zbQ^UViyoZ%`Mn~nO5e@v#VU=nlEgLLP^#A@J+`#A%*hbjBLunhP<{wdqpWbSrZ;tZ8e$%@N6+&v`_ri6CU)n)wWI>4x980ng>~TqQgv^4PScW|Qm{o0_gUOy QnWrwCK6CovMSF|)Ke&>R9smFU literal 0 HcmV?d00001 diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..6699e0e --- /dev/null +++ b/po/id.po @@ -0,0 +1,2169 @@ +# Indonesia translation of glib. +# Copyright (C) 2005 THE glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the glib package. +# Mohammad DAMT , 2005. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-08-30 22:41+0300\n" +"Last-Translator: Mohammad DAMT \n" +"Language-Team: Indonesia \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Ada karakter aneh '%s'. Seharusnya ada karakter '=' setelah nama atribut '%" +"s' pada elemen '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "File kunci yang benar tidak ditemukan pada direktori data" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Gagal saat membaca link simbolik '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konversi dari gugus karakter '%s' ke '%s' tidak dapat dilakukan" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Tidak dapat membuka pengubah dari '%s' ke '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Rangkaian byte dalam input konversi tidak benar" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error saat melakukan konversi: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Rangkaian karakter sebagian pada akhir input" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Tidak dapat mengkonversi, kembalikan '%s' ke gugus kode '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' bukanlah URI absolut dengan menggunakan skema \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI File lokal '%s' tidak boleh ada karakter '#' di dalamnya" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' tidak benar" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Nama host pada URI '%s' tidak benar" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' berisi karakter escape yang salah" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Nama path '%s' bukan path absolut" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nama host salah" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error saat membuka direktori '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Tidak dapat mengalokasikan %lu byte untuk membaca file '%s'" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error saat membaca file '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Gagal saat membaca file '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Gagal saat membuka file '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Gagal saat mengambil atribut file '%s': Fungsi fstat() mengalami kegagalan: %" +"s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Gagal saat membuka file '%s': fungsi fdopen() mengalami kegagalan: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Gagal untuk mengubah nama file '%s' menjadi '%s': g_rename() gagal: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Gagal saat membuat file '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Gagal untuk membuka file '%s' untuk menulis: fdopen() gagal: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Gagal untuk menulis file '%s': fwrite() gagal: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Gagal untuk menulis file '%s': fwrite() gagal: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Gagal untuk menulis file '%s': fwrite() gagal: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Gagal untuk menutup file '%s': fclose() gagal: '%s'" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "File '%s' tidak dapat dibuang: g_unlink() gagal: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' salah, seharusnya tidak boleh berisi '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' tidak boleh diakhiri dengan XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Gagal saat membaca link simbolik '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Tidak dapat membuka konverter dari '%s' menjadi '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Tidak dapat melakukan proses baca raw pada fungsi " +"g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Ada data tersisa yang belum dikonversi pada buffer read" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Chanel terputus pada karakter sebagian" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Tidak dapat melakukan proses baca raw pada fungsi g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Gagal saat membuka file '%s': fungsi open() mengalami kegagalan: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" +"Gagal saat memetakan berkas '%s': fungsi mmap() mengalami kegagalan: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Error pada baris %d huruf ke %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Teks UTF-8 tidak benar" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error pada baris ke %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Gagal saat mengurai '%-.*s'. yang seharusnya sebuah digit dalam referensi " +"karakter (misalnya ê) - mungkin digitnya terlalu besar" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Referensi karakter tidak diakhiri dengan titik koma; Mungkin Anda sedang " +"menggunakan karakter ampersand tanpa bermaksud menjadikannya sebagai " +"entitas. Silakan gunakan & saja" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"Referensi karakter '%-.*s' tidak mengencodekan karakter yang diperbolehkan" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Ada entitas '&;' yang kosong; Entitas yang benar antara lain adalah: & " +"" < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nama entitas '%s' tidak diketahui" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entitas tidak diakhiri dengan titik koma. Mungkin Anda menggunakan karakter " +"ampersand tanpa bermaksud menjadikannya sebagai entitas - silakan pakai " +"& saja" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumen harus dimulai dengan elemen (misalnya )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' bukanlah karakter yang benar bila diikuti dengan karakter '<'. Ini " +"tidak boleh menjadi nama elemen" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Ada karakter aneh '%s'. Seharusnya ada '>' untuk mengakhiri tag awal pada " +"elemen '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Ada karakter aneh '%s'. Seharusnya ada karakter '=' setelah nama atribut '%" +"s' pada elemen '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Ada karakter aneh '%s'. Seharusnya ada '>' atau '/' untuk mengakhiri tag " +"padaelemen '%s', atau bisa juga ada atribut lain. Mungkin Anda menggunakan " +"karakter yang tidak diperbolehkan pada nama atribut." + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Ada karakter aneh '%s'. Seharusnya ada tanda kutip buka setelah tanda sama " +"dengan saat memberikan nilai atribut '%s' pada elemen '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' bukan karakter yang benar bila diikuti elemen penutup '%s'. Karakter " +"yang diperbolehkan adalah '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elemen '%s' sudah ditutup, tidak ada elemen yang masih terbuka" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elemen '%s' sudah ditutup, tapi elemen yang masih terbuka adalah '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumen kosong atau berisi whitespace saja" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Dokumen terpotong tidak sempurna sesaat setelah membuka kurung siku '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumen terpotong tidak sempurna dengan elemen yang masih terbuka - '%s' " +"adalah elemen terakhir yang dibuka" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumen terpotong tidak sempurna, seharusnya ada kurung siku penutup untuk " +"mengakhiri tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumen terpotong tidak sempurna pada dalam nama elemen" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumen terpotong tidak sempurna di dalam nama atribut" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumen terpotong tidak sempurna di dalam tag pembukaan elemen." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumen terpotong tidak sempurna setelah tanda sama dengan mengikuti nama " +"atribut. Tidak ada nilai atribut yang diperoleh" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumen tidak sempura saat ada dalam nilai atribut" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumen terpotong tidak sempurna di dalam tag penutup elemen '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumen terpotong tidak sempurna di dalam keterangan atau instruksi " +"pemrosesan" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Chanel terputus pada karakter sebagian" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Rangkaian byte dalam input konversi tidak benar" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Refersi karakter yang tidak sempurna" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Refersi karakter yang tidak sempurna" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Refersi karakter yang tidak sempurna" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Error pada baris %d huruf ke %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Referensi entitas yang tidak sempurna" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Teks yang dikutip tidak dimulai dengan tanda kutip" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Tanda kutip kurang satu pada perintah atau pada teks yang dikutip dari shell " +"lain" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Teks berakhir saat setelah karakter '\\' dijumpai. (Teksnya adalah '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teks berakhir sebelum tanda kutip pasangannya ditemukan untuk %c. (Tesknya " +"adalah '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksnya kosong (atau hanya berisi whitespace)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Gagal untuk membaca data dari proses child" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Gagal saat membuat pipe untuk sarana komunikasi dengan proses child (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Gagal saat membaca dari pipe child (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Gagal saat mengganti direktori ke '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Gagal saat menjalankan proses child (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nama program salah: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "String tidak benar pada vektor argumen pada %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "String tidak benar pada variabel lingkungan: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Direktori aktif salah: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Gagal saat menjalankan program bantuan (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ada error pada g_io_channel_win32_poll() saat membaca dari proses child" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Gagal saat membaca data dari proses child (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ada error pada fungsi select() saat membaca data dari proses child (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ada error pada fungsi waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Gagal saat fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Gagal saat menjalankan proses child '%s' (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Gagal mengarahkan output atau input pada proses child (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Gagal saat fork proses child (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ada error yang tidak diketahui saat menjalankan proses child '%s'" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Gagal saat membaca data yang dibutuhkan dai pipe pid child (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Karakter di luar jangkauan UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Rangkaian input konversi salah" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Karakter di luar jangkauan UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Gunakan:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[PILIHAN...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Pilihan Bantuan:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Tampilkan pilihan bantuan" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Tampilkan seluruh pilihan bantuan" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Pilihan Aplikasi:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Tidak dapat menguraikan nilai integer '%s' untuk %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Nilai integer '%s' untuk %s di luar jangkauan" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Tidak dapat menguraikan nilai integer '%s' untuk %s" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Nilai integer '%s' untuk %s di luar jangkauan" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Error saat melakukan konversi: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argumen untuk %s tidak lengkap" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Pilihan tidak diketahui %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "File kunci yang benar tidak ditemukan pada direktori data" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Bukan sebuah file biasa" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Filenya kosong" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"File kunci berisi baris '%s' yang bukan pasangan nilai kunci, kelompok atau " +"komentar" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Nama program salah: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "File kunci tidak mulai dengan sebuah kelompok" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Nama program salah: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "File kunci mengadung encoding yang tidak didukung '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "File kunci tidak memiliki kelompok '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "File kunci tidak memiliki kunci '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "File kunci mengandung kunci '%s' dengan nilai '%s' yang bukan UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"File kunci mengandung kunci '%s' yang memiliki nilai yang tidak dapat " +"diterjemahkan." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"File kunci mengandung kunci '%s' yang memiliki nilai yang tidak dapat " +"diterjemahkan." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"File kunci mengandung kunci '%s' dalam kelompok '%s' yang memiliki nilai " +"yang tidak dapat diterjemahkan." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "File kunci tidak memiliki kunci '%s' pada kelompok '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "File kunci mengandung karakter escape pada akhir baris" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "File kunci berisi '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai sebuah nomor." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Nilai integer '%s' di luar jangkauan" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai sebuah nomor." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai suatu nilai boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Rangkaian byte dalam input konversi tidak benar" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Pilihan tidak diketahui %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Nama program salah: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Nama host salah" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Gagal saat membuat file '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Gagal saat membuat file '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Gagal saat membuat file '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Error saat membuka direktori '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Gagal saat membaca link simbolik '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokumen terpotong tidak sempurna di dalam nama atribut" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error saat membuka direktori '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Error pada baris ke %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Bukan sebuah file biasa" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Nama program salah: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Gagal saat membuat file '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Gagal untuk merubah moda berkas: waitpid() gagal: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Gagal saat membuat file '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Error saat membaca file '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Error pada baris ke %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Error saat melakukan konversi: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Link simbolik tidak didukung oleh sistem" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Nama host salah" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Rangkaian input konversi salah" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[PILIHAN...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Karakter '%s' tidak benar apabila ada pada awal nama entitas; Karakter & " +#~ "yang boleh ada pada awal entitas; Bila ampersand ini dianggap bukan " +#~ "sebuah entitas, Beri kode escape dan tulis sebagai &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Karakter '%s' tidak boleh digunakan pada nama entitas" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Refensi karakter kosong. Seharusnya berisi digit, mislanya dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referensi entitas yang tidak sempurna" + +#~ msgid "Unfinished character reference" +#~ msgstr "Refersi karakter yang tidak sempurna" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Teks UTF-8 tidak benar" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Teks UTF-8 tidak benar" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Nama host pada URI '%s' tidak benar" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Nama host pada URI '%s' tidak benar" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Error saat membaca file '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Error saat melakukan konversi: %s" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Gagal untuk merubah moda berkas: fclose() gagal: '%s'" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Gagal untuk merubah moda berkas: chmod() gagal: '%s'" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "Moda berkas tidak dapat diubah: Proses anak dimatikan melalui sinyal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "" +#~ "Moda berkas tidak dapat diubah: Proses anak dimatikan secara tidak normal" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Konversi karakter dari '%s' menjadi '%s' belum dapat dilakukan" + +#~ msgid "Incorrect message size" +#~ msgstr "Ukuran pesan salah" + +#~ msgid "Socket error" +#~ msgstr "Error socket" diff --git a/po/is.gmo b/po/is.gmo new file mode 100644 index 0000000000000000000000000000000000000000..e3971fc4a1b24428ba18f844000c18e6f0fd8e65 GIT binary patch literal 10034 zcmd6sTZ|mpS;uRG*<`)BEMeIIN!XJO8yjF=lP2@{yn(N^YZ&WUv2O+JiiG(2YwU0 z2tM+GAowzP75pgp9q@7Rp$~d~p8)m#Q{cSDfjL5{on#9 zxzB)~2CswC>sP=Qcpp3l{tNgt_~>In@C^7V@RML4)cjuqMgNb$74RSH=f}S<2>2PC z1-0(0;Bl}3UjcsyybJz2_;cWIeK-hy415CSPJ-t^@pBVg0)G{h-v11go*zaD;`1CR z{ionZz^{VR!#nl&e+I?hV?O{7;3{|?{1W&S_*bCT{jd7{$DUyRLqYJf;1_uR21JG5 z0WX6u{-EdQO;CFIb5QgD6ExsQf5_|QG^ppF0e>0%Meup>;U7ka;2AIkOHg+DTW}Hl z2*wn>3*a;0P4Eo(d*B-QZBXN$L^i{O8N4}mXp>msaO{K|KAo#Pf=T_527arev9I>Ybx zamzlB)$bnxr5C~`I8wiJcIUVB{GR%qlZD^%0r{IQ$@M+lm?|*b7rAvwo+a*2bHlE? z5YOpJ4`;a*L(NORFZpmsXaCQDlKZ{fx)hTiWtuH!WZ^K<#UiE@*q zg$d1e7)Kq`-U_p@UD(WY(>P9dqNK;S`P1{0FKZ?$%plx#^EPcSN=%p-8{2_R3X_Bb zduYnVmYvYeS?1*YnsIFXKhlrW+)lCQR#-DyJd}*KDK`3;KRX|s50m-AbW()R!X1;@ zuwxLkcRfn4qoX9T@pZkt9!H72o);O4I{c&}y>63^#!L6@G}*RUVY+a$8Mgag14YV* zj?Hc1o`ds#RfBB?Q4$t57ek>LhFKAX@kEarS=%rz3zK${An92Qnwe`G7h22DKWM~C zV?buRHnU0Fnhx$EcH!LYM8y_s=XMaa(>P7m%plDR6Gwd;@0#7TG-Zxj@r!UUv{@c9 zXX09#E!Lu>fS6niVepp_17;tU-277w$U%Lp!Fi?HWh zcC@&xc_4)wB_8Nag5POjys3vBH;IP6!sztD1a`J$^@$7<+dbG&E+A@F@q;3YW6wg% zyWtMLE7{@@CPyNPM?CTXjh-+gcXJ_Pohvx?Op7)OBUX^!PS52h&rawLq#2*7ec+Dm zV~*R!-l93ZnWp`-3zHdQ*A9k+Ar41=Dnim+$D|2fkD3UTVc538dY$xLq-joDymd|( zJl=`hE;Eux!7OKwk>EY=Z)1Ppd=4-*ar}15s+19fRjdx1ble#b{&8?cbJn-Mhd8#>PuG4&3 zhgm1eNKR>nUeIr2fU=rMy2LjAb|J*$J8~`6G-?FDrb(FNbNNEh7zZJe*}i1_=V3(N zR=rW$DwBvTtHqu3wTZIMD2dIIx3Al_lI8RuCE~-4oZ%K0`m+<=yJ`9}vwGx;aqQxUYa~hs#$2oapFh<+|W4EK>`;l^Gs1p|9sKPb0)*yP&uvy97Sev9} zZ_B)kGR56lZAKSvPF-Ui2eRzGWA+o>QBnHKcL$qk9JS@bzR#J_U}nAl8Tx~vx|fWE z?0$4-oWe12G4VmK>P;57S-MVzzR34fu0wG1gVD$>`V`lrj$Rx%>lNEAQkpaBe%+-J zE>3r>;iTFuyEI6_tDReFFhlr+rlmu*3-mtpFO7a+&CsW9g~NQRdy8uQPI@=>oQ-L|-#?h)x)>`5 zTQ&}ai2+n(Usq>ub9MO5 zs%XR^nTiZ6E`zI0XZ72pNgKIAd5o0`Wib|Tet5#GCB2pVLX4Ud`sLc<#lm^!KK$600H(#}Gx zeeKFcFJC=QTMj2E&f~lDhS%rQQ>gLvVE29$ck)R&>6rA)IJM-lPq^bDqs?HHwBypX z!}Fhz^7!$Y}to@hk8k7J~e}<#lIBq%5^C1yj&e9u*(7M=Zy~dW!bsfDp+BByYPaVBt zwS8(`%6n0#^y!p*s$gVSDLMwE0Ju*lU^D2Y-_`YgH@eloR0Dr;%G6=dS{Pbx_D`QBF6IK($VvDvGj(mjol$! zDymKrz!80;7GU3aMw{c6$v81VYHzKR`sEO-W@R%fjs`B^(V*@3Bhpn&r(50XCp7(8 z_`0cX8EQsEdgjc;eTb5B%~W3xtGi~PubQ^Go81UCcFRUZWVWN~ZWnp-!xNvJl#FOn zrf3#+Ga8hdqv}pgpRHprIyCV(?U$rLH^&9mqIt#csHK9Ho8ILUoo0;7${5go$K*DZVRQJ2=+g)zGQr%)dtn3V1dJ zxl9uU8xG)5rM#ek`GXLXOY=-6ckMM|r7_^O+D4MoFXSXg`#J^btI=IEadoGUnnE3v zU~t@^`g-+_Nqen<&H7G7w-Vm5e>ZZ7>UI%_?w9w7ks~bP_aac%j>8i5(Z@Bf4CMjI z=Tw37(qDUBNIz2^nipkJOf1#Ss#}G1thi$jIEW0}RmTKo6{Sa=?6zo#o?D!|QO_pEFUWzk&xlprK0eIyYzW0P;>6 z7g}^InoFpnC^rxNIzQfL#jJW8@Ao=Shq4AIfLMrx=v41cHujmzKymAIZ6@~EkI?~2 z_B=V+EVFG^B4d;+dcWEp3CloyOwVFQs-@TVG71kU%?obCK4=0YYbA9SwqU6QL_;}nelSdc2~98TJT`MEsspRgMl z6ARae8I1|jx4em(d4EWp`!2dM*O4V*6)4lCtdKJkMWW2$#*GU|mrsx*45okx$b0yf- zOURGCWmfgB38DEMCzWaa=Cq|w2{Bvty2$A#ELiVHGz+*k&gqz_-c&X>o0RS_Q)J-S z)g5L;jW7$dz>OoRkmbV66+-{2V-B44mP>UceP3{@d*lAAR_PtJd#XSrPWD3dT#e39 zN;pA!ZzOshet255)!1j)uv=$C%{>%B4nUlqbOho%Ji~v2#f`>F9h%|)e73@FK2EFN zL>$bh08HY6?))uM`M71X>`)=Ltuy@UUZcZD&$AL7hFyqlS9fwOmHBe*l`+*lkpt-p zd!(ckvaPC2qJK}^o&5BISBra&4y*Tuoq$olGI_WHJ@OT2JcoZp-v;yd25Z*)YZ$&bm6j z;Fas3>5p*~SIViZr~|%b8J9%o+8nW}{^=~Eo}^MND*hCtNyckbXCTfU4xA$@Y6Peo z$KTxw;N#S&aWAkCj87q)BsS)3-b>q|^?5sU>rDoYRS~>42|Lt)>x>Ca##~kE2(#As z(|Ci}P#Z@bSL5m)+DgXicIxexIB4!ZVSV42%V}LgnA(R;oo_S?=X9p4sW{JfM8=02 z%{jfWN6wi^+M~=QE++G54m7Ga@$r6Nea^TsP`%69$2Ib;-+7FEbrdyuVFv@^R{KrV asfrtNj;a1Z$=xT;`)mz}5N+?n;Qs(cQKc&Y literal 0 HcmV?d00001 diff --git a/po/is.po b/po/is.po new file mode 100644 index 0000000..3be15a8 --- /dev/null +++ b/po/is.po @@ -0,0 +1,2113 @@ +# Icelandic translation of glib +# Copyright (C) 2003 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Richard Allen , 2003 +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2003-08-18 18:05+0000\n" +"Last-Translator: Richard Allen \n" +"Language-Team: is \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Undarlegt tákn '%s', átti von á '=' eftir heiti eiginleika '%s' af mengi '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "gat ekki lesið tákntengið '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Umbreyting úr stafasettinu '%s' í '%s' er ekki stutt" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Gat ekki opnað umbreyti úr '%s' í '%s': %s" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ógild bætaruna í ílagi umbreytingar" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Villa við umbreytingu: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Ókláruð stafaruna í enda ílags" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Gat ekki umbreytt '%s' í stafatöflu '%s'" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' er ekki fullt URI sem notar 'file' skemuna" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Skráar-URI '%s' má ekki innihalda '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' er ógilt" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Vélarheitið í URI '%s' er ógilt" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' inniheldur ógild sértákn" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Slóðin '%s' er ekki full slóð" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ógilt vélarheiti" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Gat ekki frátekið %lu bæti til að lesa skrána \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Gat ekki lesið úr skránni '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Gat ekki opnað skrána '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "gat ekki lesið eiginleika skráarinnar '%s': fstat() brást: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Sniðmátið '%s' er ógilt og ætti ekki að innihalda '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Sniðmátið '%s' endar ekki á XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "gat ekki lesið tákntengið '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Tákntengi eru ekki studd" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Gat ekki opnað umbreyti úr `%s' í `%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Gat ekki lesið í g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Það eru eftir óumbreytt gögn í lesminninu" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Rásin endar á hluta úr tákni" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Gat ekki lesið í g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Villa á línu %d tákn %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ógildur UTF-8 þýddur texti" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Villa á línu %d: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Gat ekki þáttað '%s' sem ætti að vera tölustafur innan í tilvísun í tákn " +"(til dæmis ê). Ef til vill er talan of stór" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Viðfangið endar ekki á semikommu; líklega notaðir þú og-merkið án þess að " +"ætla að byrja viðfang. Ritaðu það sem &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tákntilvísunin '%s' vísar ekki í leyfilegt tákn" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tómt viðfang '&;' fannst; gild viðföng eru: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Viðfangið '%s' er óþekkt" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Viðfangið endar ekki á semikommu; líklega notaðir þú og-merkið án þess að " +"ætla að byrja viðfang. Ritaðu það sem &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Skjalið verður að byrja á viðfangi (t.d. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' er ekki gilt tákn strax á eftir '<' tákninu; það má ekki byrja á heiti " +"viðfangs" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "Undarlegt tákn '%s', átti von á '>' tákninu til að enda viðfangið '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Undarlegt tákn '%s', átti von á '=' eftir heiti eiginleika '%s' af mengi '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Undarlegt tákn '%s', átti von á '>' eða '/' tákni rtil þess að enda upphafs " +"viðfangi '%s', eða eiginleika; Þú notaðir ef til vill ógilt tákn í heiti " +"eiginleika" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Undarlegt tákn '%s', átti von á tilvísunarmerki eftir samasem merkinu þegar " +"gildi er gefið með eiginleikanum '%s' af menginu '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' er ekki gilt tákn strax á eftir lokun mengis '%s'. Leyfilegt tákn er '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Mengið '%s' var lokað og engin önnur mengi eru opin" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Mengið '%s' var lokað en mengið sem nú er opið er '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Skjalið var tómt eða innihélt einungis orðabil" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Skjalið endar óvænt rétt eftir opið minna en merki '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Skjalið endar óvænt með mengi sem enn eru opin. '%s' var mengið sem síðast " +"var opnað" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Skjalið endar óvænt. Átti von á að sjá stærraen merki sem lokar taginu <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Skjalið endar óvænt inn í heiti mengis" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Skjalið endar óvænt inn í heiti eiginleika" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Skjalið endar óvænt inn í tagi sem opnar mengi." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Skjalið endar óvænt eftir samasem merkið sem fylgir heiti eiginleika og það " +"er ekkert gildi" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Skjalið endar óvænt inn í gildi eiginleika" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Skjalið endar óvænt inni í lokunartagi fyrir mengið '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Skjalið endar óvænt inni í athugasemd eða í miðri skipun" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Rásin endar á hluta úr tákni" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Ógild bætaruna í ílagi umbreytingar" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Hálfkláruð tákntilvísun" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Hálfkláruð tákntilvísun" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Hálfkláruð tákntilvísun" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Tákntengi eru ekki studd" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Villa á línu %d tákn %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Hálfkláruð viðfangatilvísun" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tilvísunin byrjar ekki á spurningarmerki" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Tilvísunarmerki stemma ekki í skipanalínunni eða öðrum texta" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Textinn endaði eftir '\\' tákn. (Textinn var '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Textinn endaði áður en samstaða við %c fannst. (Textinn var '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Textinn var tómur (eða innihélt eingöngu orðabil)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Gat ekki lesið gögn frá undirferli" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Gat ekki búið til pípu til samskipta við undirferli (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Gat ekki lesið úr undirferlispípu (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Gat ekki farið í möppuna '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Gat ekki keyrt undirferli (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Ógilt vélarheiti" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Ógild runa í ílagi umbreytingar" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Gat ekki keyrt hjálparforrit" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "Óvænt villa í g_io_channel_win32_poll() við lestur úr undirferli" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Gat ekki lesið gögn frá undirferli (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Óvæn villa í select() við lestur gagna frá undirferli (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Óvæn villa í waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Gat ekki ræst (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Gat ekki ræst undirferli \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Gat ekki sent frálag eða ílag underferlis annað (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Gat ekki ræst undirferli (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Óþekkt villa við keyrslu undirferlis \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Gat ekki lesið nægjanleg gögn úr pípunni til undirferlisins (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Táknið er utan UTF-8 sviðsins" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ógild runa í ílagi umbreytingar" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Táknið er utan UTF-16 sviðsins" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Villa við umbreytingu: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Ógilt vélarheiti" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Ógilt vélarheiti" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' inniheldur ógild sértákn" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ógild bætaruna í ílagi umbreytingar" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Tákntengi eru ekki studd" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Tákntengi eru ekki studd" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Tákntengi eru ekki studd" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Tákntengi eru ekki studd" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Ógilt vélarheiti" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Ógilt vélarheiti" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "gat ekki lesið tákntengið '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Skjalið endar óvænt inn í heiti eiginleika" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Villa á línu %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Tákntengi eru ekki studd" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Ógilt vélarheiti" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Gat ekki frátekið %lu bæti til að lesa skrána \"%s\"" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Villa á línu %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Villa við umbreytingu: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Tákntengi eru ekki studd" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Ógilt vélarheiti" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ógild runa í ílagi umbreytingar" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Táknið '%s' er ógilt í upphafi heiti viðfanga; & táknið byrjar viðfang; " +#~ "ef Þetta og-merki á ekki að vera byrjun viðfangs ættir þú að rita það sem " +#~ "&" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Táknið '%s' er ekki gilt í heitum viðfanga" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Tóm tákntilvísun; hún ætti að innihalda tölur eins og dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Hálfkláruð viðfangatilvísun" + +#~ msgid "Unfinished character reference" +#~ msgstr "Hálfkláruð tákntilvísun" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Ógildur UTF-8 þýddur texti" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Ógildur UTF-8 þýddur texti" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Vélarheitið í URI '%s' er ógilt" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Vélarheitið í URI '%s' er ógilt" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Villa við lestur skráarinnar '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Villa við umbreytingu: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Gat ekki opnað skrána '%s': fdopen() brást: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Umbreyting úr stafatöflunni `%s' í `%s' er ekki stutt" diff --git a/po/it.gmo b/po/it.gmo new file mode 100644 index 0000000000000000000000000000000000000000..89ec6b1a11fc04eed7b5cfee551a575e1f4672fc GIT binary patch literal 45780 zcmd6w37lPJdH;`!icwKe_U#Y|Ga;EtLLfjEAS4rrBqU@p3Ze1N%$>Y-Mv9?yN|5mNL*1amN|JJtO-}Ag@yK`qUQU9OMe?A<3_nh;t z&-=X3_P*!MH;y^t6%l`TJRpir0U!IwC>nTR6g}c3J&mG|&yAwTfcJn81-~5d>jA$P z@TUQP6YzK7!%6?(Gd(Zv!dv9a1%HmY=ElwHt=llPr=K; ze*ljIkDnJs+rdHbvEVbo1>kL9Klmvy27d;g3_glNs47|js=iI&@n8a;3qBpZ2z(!S z2KY1ZJn+$dQM3pg0#$DZTngR_s=kkdOTeFi1K?>?uJju~)%O%o?Yk3(CP5~E!Lm*9#njlSxUJXLZ=&u5P8|1&}!RL587lASNSA(m;Cir^reW2RAl}3uL zPX|f;+%Z1w0kvh+Z8~bb1^AQ-8k-UIP9OJRe-OIEvPTE$}7aN5L4}L}t-* z5r&EffL0{%t7FM(>`&%^zZ5L4;T0yWMnL6x@) zRQ)%E_qT&;-+RHwg8u-joF9QP_&|szzCIIFJ647JZJ_eiLGjItL53>&5U6^82%ZW? z%RK*SAVVEp2^XWOD(tRS}KZ6%@ ze?Q1nj?TZ(=gBpo+VND7sT92yRC%8SMTcL3;*Vn}RQ=cjD*sbJ@y{DT_3Ja>W5C~l zYVX5n96zH4p!m8P?q3XQ{67mS-w!~hLUim3<_NeN6#su7)bn3~3|VygN^kF0Q04Cf z)t=ixni$;+s=ogM)vjf$ydOJ3)${yt|3UCL?tcg>|Nnq0Z$89%BzPsLem@aZyZ3{S z0^bCRE`JUx-M2xt^A`b+he(n;7lV2}44w`?7d!@hJ9rZK5m5d4DyVin{8E=g7X=&+ z_o;Bl*+-hH6@vjWufEui>x1XTL{;0fTX!}C7_HGZE4#V?||z6gND34OF+rv$AhBNP2gPcc2M;CD5&xMC3p(BfXej#3Q+Xf1FHO+ zL55ty*<8TS6auZN=xD`~rcY-naDew~T``{pW_SHTw zwu5SS4HQ4$1ghPy0aedOLGjo3K;=7ei}T?X;9~Bt2Sw*Mf*S8HfTGLKK#k8sw>m$a z3)1B1YLF=qy#Z8vzXvMckxUlxTR*7!H-XB3J*e_t3my%=A3P2G4EPA}`=HAE75Gr_ zg6&TKOTdS4e+{U1RzS7?rQlNV9#HiA4H$!GKHmGk7JNAOPXZqU)|H4c}7 z;+HCTJor3N^nWAR58elgKkf&W{+MgM-19-D-vJ&AHbBXRTR_dXcZ2HRm%)p`-+*e* zqMeRcgOZ0WP~-7upwfL4)OeqGo#$Tws=O<~7`z@7Jzol*4BiQz3w{Jtx}Sq;*Rg-% z<2L}Rf7`%QzyqN8`<39Mz>k6Ai!XpDfDhc|?K&A0e?Jiv9c}^Du6Kc_f*%K!{u`j$ z^Y5VQeejdKzEi=|xxWmI!Qp^62YfSlTEzSWmx136_a|4}-dPUn{Ww^AKomU-JdXQc z4LiTj8F4%&;7I}J20SO=xuE*FJlsDHq^M{MI0n8Cd@^|QsMGUVV9fm+LGi)8pvL!S z;r@tf6m8^w5h!}z2<`)K2TuZzq0lAZ0H|@@74QY%+1!5^6urM4?vERHdaVM7cs>lO z{JTKqzaP8|JZrbl_i<2scsF zz7$kHS9P4<$3fBWCh#oqE>Lv74^%&X3W`r2wb$p%LQs4%1S;Q?K#k{fL8X5ucs}?A zQ2cTP%(Vzy0P6jHE$le-|dmJ13nH^yXv6czcApRf@=5Y z!5I7{xEws@fS0=w9N>O0sQTXwYCJv-o(TR5lstIkL4UpgT+ICwK-KeH(C7lHocln{ zkN*VK&w(49o+F^ry#QPaz84hTzYi_|mp#Sx*f4k@_b&ls@Ux)$^%0RAf|x?S*8@5eQu(mw?}6Z|}=e*FSG2|V>C@5hDU#oQ;L=zJHb^8OA~`%inC zr`raqU$=lOz`p?1pI?C&fhRoO^KAiFaeoIWKKnYT`859-UeDFwO733_-U;3Zik|hG zeZJfQUdR1cK+)yAXF8ue2^3wP4Ql><9Mt@H$SqEX?cgQczY#ms`Q3!JEN8@D-rs!bd^T^M|15bnJ6{{H_F# z;r<|a3itw0^mqrTbUy^eC#OBv^KS@v02E!`3X1Q(18UrU2ObZe@jM^5ivn%~C3hO( z{+ZxB?(YCk1wRFz4Sold{+#oCr_U--{l5`h4Zbnle-{*AKI~TKqgCJDGq`^_xETBZDEj;WTnIkkC4N5$UdH_u0iO@9WbSu``x`)|djlxC z-3N*;lCn zF9$`3kANEgFNNnvyxz-S2rB;`a4vWoc#P76G5EKj^8Et55Io}!r}s6W_~nhD#`k;R zD)9I_z5Uxk@z?F3==K><{r?ddgU7zXl5H0_%-m+;E`{_w*gNC=YVZc^u7r^0(=uF`rZXz1pX9MyZhek^s9p6)7OC- zzt4b=0KWqs5B>twcpdo`ACINre(pDbCxV{>MbB@7*MX0GtM_*gxP|*$!AtZWd<=N{ z+q~YTpvvC^icU8Nd^b3k`+ovY1OFRTdrrN}=leOJ+JAMx7lr5df%AC&Yw%3)q_=x} zF9uc44loAyf+vBm0*?aU3#$G1fEvG_gQCMJ@9=hB2#OyjK|Oy1sB!x!csBUW@cbcn z`#hNos=Nz9jnf#Y`TPp-3h+~)_~)p1I$jE1$$b-C3w{jT2tMdfU5{K1p2PhJI3Ii= zcoz7VpvM2};rY+N%eX(`UEbbnLG}AqP<(VZsQljrMc<>|?ek^{DE=PLGXj% z$=`=#&k^uwU^$g4on`JG@4ei2kTzXVn95r5|6dM2p)Hi1gt4ERb=bo>z52mUj7 zF?hs#{eBI2DffHA{X4-2a9`m{|GpT0NIuQu<;%D>hiB*W``k2P!1sgS=VA&(ujBn2 z!t>|y`xt(Ih)cB6xL(P#o5B0JMz}8Eo}sb7Yxw>5{JIqUI(Q>^1J~F5wT+j4{($R* z@N6~j^*0|}0Uiy01sni1pPmGs&ZR%`gZ`ew{j0;XCkNDX@%ab1T3if!bQSMz=Q@(> zVO-)P{avEpTw`4N`wOmB{C+$*$#pEh`@_2>+%wcR*IonuluLgv4Da>(R;~wd|2gnW zdJz63f4&fYYn@JiOF=|O^j~&|4CQ`(cz094MZCL;>tya99@3@oQGUP@(W7|xOs^OUVK#n^|uWCJO3Fygx`9?ZKJbLmg> z;TV3ulzT+ay4 zF4sf;)^Ls6FMOwf`$C$Bh5KzF>OJ}&u1JGq{f9_YGV_dKmuR2L3fymG@5pU&19B zbvE~}=lT)9Kf$HH?>R(|=lK!*Zh!~C7lHaa4*VgwB;2nAS8(m+`Ujr>3)eb+kAkn` z+Rh~bw2~VrN19@{oH;Lm*xF^{63xQ60TA1 z_4lt_-{HE5>*+ij2Cv}K-#)HSb3Kb|7nlD2#34Eu@`qc4zQWB5!|#W8rTYxePvIKx zdcK}#zu_9>`76O1*EhKI_e%%U^LK^c6X0*Te!+EFC~IfH_wejnTrKV&%XK%u^>;Ma zj*!M4@W1o89ujU|!n*}r&*Qq8>j^wRiR;7Ry7x>2H8*8P{tzXRa}d>Ud#QTbG?k~soY=9rN4i2 zh~5R>%CpnL{g=V{T$gce<@x8qja>S>!y!5nyq0(G1yANWkKdcP(!bY-9|_Oy<@age zGr*O49``5py_H%r8dvKhjnSk&K0lf_xMVCIy3FzNfL8|G7;tmIZD1=NOKR2jfyt_V z8}`j>^~Fgmt~c6oCH5Ldc2}B}k#@Bik2Pww#y%?JUEj*SID4}qPTKKA<$&cIu8t@5 zxKfX+wdzE*-j3^)iE1?4lH0qhdATjBS=6^8w#Iv#E`_Docodq~`jw{KZ*t)-#OYGw35T-~3v+O25yaI39x ziaYgWe>~cls4xnx#>k#3LpeIythQQJAJ|rBaFx2 zuc_4g+VMzZ@<2RFpGVpvKw~ex%WjKlrhn6#tkScZ)sp5=536yfMQIz?ZychU`dBjF zX?nkzZlk=J*ILfiBTJ<~!NbcrT5auVH$soIvPT=t>tg3sX0(4bjlYBzRO83w21SW+L23oQ?isbmxu(FD{`*Alo3BDcgHdYI6` zOxBh2q{-&N&tviBLlf}Y#Nni^j;^0|>FZ#M*{9yN8wuF6^a&Ux=b+vUB@vLP37v)o zJCJ2>wRWJ3E3*V9lqA|08nfALNm!IqHXF>85;KofYd&L>deVkxlY>1bq6*O*gLI4l za}B{c%tZ3ph-5%7Ra*!j&BiqGWTlDZ9c^?Z4}3P-WR+lZK2(vODyg@tk|NV4Q{j`< z=0wsGo3td&S_dXz(LFX>R8qUysUu^m@#Py$bgi#XcG_Fp@bW~o#u+VtbY_iUFW*GQCW3khN8vV6M~}^%e0%0~J$C_J~yuG&+(qOg*|d0o7Ve zxV-dC?TF}g*%OlOtu~}EOZTy2e1CTU?-LZua-&E1M-0V)7a)q7}xa zarC&2B2s~_Me@!{ZRveFf5)1Qi9(A~)=@)@N6;(kYo-av+o^f~rL%3A=hZqWQVk`! zOpIwB#B=Ah<`$CM#0q>1gIUE^MX2g9lDcR{m(%vqD#DEk10M!{UOTjI{Z&Kpc(Z|e zp+b=Y)!%4J(lHW^dNm$~nMQU;Yl|Y8ah29Fl`(c89@<|WVJcT^qtV*NNXLvSMv2kv z)T{f^D{u;9Tp5#*CTWR&uGCQL$+()58Ep)GrV1q$RzT3gBb#V5)t+>A0T=oy=^Z?{-CC3%rnhaM#*R(-2g zXk^+YwGoSFhE6TS*mQO?@lZ8ZFk`yhwN!*qgXp$$UTe|CdAY&#m6u@cggj{z`m2NE zgYilkycf^UbEvu1iAh8d3>W4R+~26f^^l4AZYJg0Y4l256x-2Ia7%2)t7JEG7sl9< zMidk*0=iAvHfm|xkUuu))8=O~71EYViH5BC6e~g6clL@tBy|-b%~+Zj$MXcSRcTh2 zyF`u8zP{6FuZYjC>3`$;UuCkQ-7`_RkH_xF^mri;srWclTpwQ^ zM_z5(7Cpi)2@g>y)>4@{CeSAj^m?7yQiYeJ9ofw4V^DX6cjMKz6{~KzC&sKFYZOw{ zDwr|5RY1XVF1(+p?9ofCpWy~h6-vLpr}(^VMK9QdJ&>ZK%8+8K()!eaQRc7wT;_P^B9@EmU)7rufkI;G%N zqh<|uS!Ht!ORVs)RGzr8IxuYlWR!6hqPnZ1R*>;sv`imQr6l&8arxGv4N1MT-^6%z zf4k6{GzCxHy2-7TE^bOwP7wMUOM?hOm?##JOccj3O^qa~Hha`p@F9A<4KBq@Z$z3r zY8EmCq0v&5qsLHUTW6ELo5M@*aH2+<$t1F~&;%kqEt3abqZ0g`9`(63f!#Klz^CIF z$KxHsG*aj?)Md2JL;c{-;p~_!$mE`9ov5^31og~WXqzY3jGjmiPFvNK45=t+Rwrx3 zhs?Ze!wP1+=MAfMia7~5sRr!!Eo>wXEmxzjD*}wew9UT+&`~1znIP}u&h(d<1y2)<<=L9l^Ua7F>N-lro5g^@blC^ znfj1Wkve*11{-{U)Jr3OU9G9&tSBf~P9zVkyWPE0PE*|OYK?j7j%8(HYEhH&XH}vr zH5*-PY#J{u5R7i^=`O*ZmD}9a63OXIA`xvEE0S?D| z1|YC9!#b+Bv&(55n-6Na*uyPqrfNM_6Rf_4vc^Yt$1OtGaLDcoL9SuUTs%e#duQHE z!Ozd*A^m5cdG6BlR=AtBpQu8uI-i&W!@j#R>HbP6MecpWqs)b2mGY0JkKCg#4dyJ9 zb#sLkS*E21PY7n%Jkd;=Hcd9xT_a|t$VDp|b-gAmfp`l{%gZ6U zB^N1Cm`fa5qQTTgn8lv8K$6Bebew3f-c84AXpH0_fplLE2=(IoE3B3?oi7Ju#lv-D zwN7jIbcIe$-a1epnSE-@-<4c4&O{GxM}cMZxSIPUyKw^P1XI|Z4fx$d@X@-iloXRj zQiB&`DR^w|sizm^@N%;7sG>d)cBIc<2Ma%ogN1ljd7N9tqzceRmv6PDoHYcI&?y^T zrIZ6=3V^aSGTPYJimpIh=F2Kq5DB!gHnE5k;(@5XYx~UURamX>y1r;VYl)h5NbiYG zt(_>6hMRhQ$HJ9#!uX10;w~R<3tlQ#l_;YrZE-GXrU~AbeeoX2O1`?@H|qprt1@J5 zimVR{pOYJWwu~IrS45DD0`u=01zcGBZ9^o0S1g@o=n8Z@??_T7DD5G@4KyZ zWI>Pl)24$7uN}8Rd^) zr@@iLj?>gd4xN@59t>Cri7*WFC5mIr04 z%9kz>D^FXk?@gMGx+Y3Fg)dx$#g1{-cj{UH_F=AwyD}@#a$X5xO}1v!IRxjkB?C1C zM@o7CYqlCq&5@*=2t2Hx5z=PH)Z`jVlOS~3$KUQ;=SzsfcOv9&xe+e@FstGCY7<5z zNIlr24OyXiF}CyIk5SMc)*i)By@WzH5%m(6CSrQ@Muc`6d3QqcN=!Egys*hi(!>|g zn!rMjXId=1M`4|Mw%Fm)Ok7YNn@o+Et(6Z-URpUtO6^0vXVeNq+#@y0lC>d^-+Ibu zLv^fe>)!;cd{Hn+9u;Qx%y4In#jj`sei)%<3kG(n(~XrHmN<*1r`H=%|TyOObxG~5yc*6AZgP> zv{9>*3|l57zLc~^>YCG`~=!qy8jb~7DAZl5&#l^TdDK{ELo9-?}n^HfbY^N8V+wv3Z zziha`{MqCVT#zFY+-1w!Je+9rnk_>pbe0hb|1zgNrpLU{WR>-dZn{u`5^A?KrJzJ+ znK4VfY3uqYP&ivbEbc6IUrhd$xuMdd_u3 zY^7~7D}z>c3_e^EJ6kU|U7n3qaTGa#zvVk(0cYZAm-$HrZ9788L*8Lx^Y1iF3EBQRzb zZg({$QCWwVX6?urz&7z0zx!pMZgQ=Z$fASH$&kK)Lxreh|QrsiC!-MMjVL_6y& zuO1i)Tla==F z+%Tf3?sh9dv@H!&LL}{>b=5H`5ox<;u|KwHDW_{fZA-VUS)pM=GJ?Qu;vf!6i82vT zkQWvlK}2L8Kpvw}cygB;%|y&h2(d@bHa42OHl`iAGvwD$OqV>+!WF@21i8DX?e=UE z*lt_Ijfo>Osi(ZNr7q24jI|k3NHI&)m`~i5&i0&QJyr;6#XiiLFAc8{5rEre9!7cX zJ@Oc*&6Heo20sU;%^GbHfdk#;!l>GESVIVeoz!McsBUW_W#cpfNTOc(M4}mYmV^ zrQO4}Wqa2o)&%?}Ur^)a&YhO=u?dQ6N^~h}ne~IAMQzuh=4`Tipu1NY`zlF$G8v^1 z3&Le*_BaDYJ$*3hVQJ~ao z-=+OZ#)!k zswEFWMAvTGylwras|E)LuZwmT!f@yW>8NPu8dn!VvNHrVcDxN&F^}b#&ZPuxw6R8jc)QH78Yiu4+7^Q-u zAB{#TY*Ml1a1DtY7esq@))vM)H*j^hw$INh(sp2d!UGpqquf1oZZeR3cKuV_ z%vOG{T?lB9-U(_JIWzwA4^<#XSQ+v~&oK`?`#NbVL!(jRDcW}5?NC+~hM)PZB9xYF zmt3t~`O?^QWlF}U69(WJd*R6+fyM{fBPc$aj z#pvECnxS6ZXL5Fo*p`ZgD+xYjY{pk&{fp;k&qGWPEZ{eN`A0K)5HL-_Oth`&(km=< zWI2P`V{&zV&!^X!yzTB`T5g)3wyOc1;UG^v(35{(P>!0+HTInw9pb$x;z_$WeTJNx ztC;mOr0CRVo5Jc3$!FaH$s#E1YnJ1zipf!$wx?Q8-;LU8bWA??$cdP?ZDr=4PGZVN zfgL0shZC9D@eMa(LR8p<%ohpG@ZQ$Xr3DGPVmeGo)fj0r=YjxkAxLEYQ`zSBpr);XtWS{g;RQ4wmor#!5=d8o* z9t)ckr^cz|*`?De({${xpXgTpJ$1M`gDL4tzQxf%Tc<5qvUuU*#fUg5O^+Go9nhKt zgjOS3iqGqP)XALzClOEdr40ruRiyEujQ+fJW81@$d9*)!VJ<~}S6=+go`(pk_a#WQ zRB)0=D-7dxw!svl9GUfWsP`)mm0$>9Du zTdMj@d0=B}JQ*FhtTWyk*v1n5oXwlI4Xlv>VX6+SMUE_w&t1G^@xbDx1LrP_mn>O+ z-h~5;&s)5hgaccU6`Imr=@u`G7cW`9c3F>{Q5|eF$1f&NeZ0d~@qumZd0HN?N4zBntd;G_OJ$?A2GQ}I{ewyS z;yGHh%R9JaaPgcqF0}^~U|DW4yhVf^6TSw~6lHO2l`Svl>C`qFF)$Q9_Fo=fIGnWS zY_9RCaBW~6N}bS1ebR1QtIlP;#D1>oug7PsikHk^F^3ZabWVUaOG`NUl2>J#Lj(3q ze`vtAWK!Ev-L0EP^h)=jd2TBB-n-%sf}0N}qNctxiL`B}KDg~sA8_odA>U!G$T z&=(mgSdYg#~w=X|b z#>W%PCnE@vkWQ-+ZKwp}qD`}?!wiB1o@GUcUDQo}s(DquPgY1>U$7AjX0x~YB*IQ6 z_kIxjf^dc?f+MKo2EAj3qhJ)ajE3F)W(v3IB3}WR3k) z5y2_;#2UM-tF)sN+~L(>S+-$Z;ANH=!}y+kd@OP|L=Q$?i&0*Ambo~fROM$C6j}r0 zS#%|QexlYiA>v4)yy(rTZ(bg&GHEe#Ul6=o+(KgojPPkn}}bnpi1w8!l?%e>Mn|2*~&+Nfn&!~U8>);w*_@U=v- zbF-{@9UN`jfPRm>+p^;rN-akUC=_9`B%2M$s2L|ng*_@=SxSZWoODeHuEQHl0F@^R zmXpM(nh}_iy^5)33Hp{@*N9LP*`>M)d5aS|wvEHTvk&UcV#C`+(X zp|A!VWX$A>3UQ--JFrcv(h`$zrCb#$5vuZTq;k!_%e7)8y}M>t&pZ}y2?Df7o<#D+ z1}%|7kY1Ipp>2ep2=GY4^C0mLB9l@ZnMNE6K?{2v3b9@an?7i1)z)Y7RP|Bd0VCwM&n^Y9jHOrcQS*tP2W@5Q% z!N8cQ6y;94#t^G-lcs|))sp6TqgKIsY&M3)A8G@(L}ErA-;iryX;i7sxzaC$d73)h zMk}*sYB(Y4nc6hVP9&G~t9MX*EFkg8^SyTt#_MSio-8q57R5C|ni92@;<*wGu0EAw zC^Ubt68ahlWLX;?)S)9Nln(dmo=+2*63)Y(84)&>f3c5@D+4GuHbkz|OMIhIHNHtt znQ%)f)eS)fs=RVGmlRCqbV}i5p!-TyAASx~X>0As2`4lB)IdKEH0)FgB_0h&QkWSRSc{Qh zuvmr{$`fF0%>^L0EKM`VI(SerPvq>Q9K{^LlE%(Ttsr~^<~DDFEYYk&|D~@Frvcgg z4AonF$>$l(#D48${2J^_yZ^(gNd1^UQj62#QgiYTYn&D}Wz<4cvq#cW2Y>HknPj0* zGw5aH_=u%N2bD2o#1pB>outz^)So>&Azj>skI`f$x^U-K&`omYy(pXSQ zURBW18UWPGOsW~8$^kIrkfBrhS!!g4GLu4~k8|xLtGT8-VS)xeD9YG6l^*<2)yv@I z4{3`C#;5t(od3~It#9&b6wL3Im6#{QWg6F65!&2{k%hj(7%3c)VWnC5tUqKXwCTt~ zA*w%p?=gsJQ{-QbXN?tq*J-R`mFZC#q2A()a=W!mOM}eu!VMSE-Cv(lbCxjkL5fK@ zK!i1yP*8e^h;QS`J6P*$&^*4ZkgcS(K2zy3j8p&I4tgw>%OKD=cB@z`OO9oCve1=8 zhD>H;E3V^4cK2vl=p{AMz5Zf}3?#cRlko~4OBJl#{1g&wz(SH@R%e{44wy~!=@Qax zGiyAib%<0`U*~=eM7Cg&eLaxVUL5K{f>4p9PFFcu8hiz7&GhdjLJNn~IGBp8txm#@R26hsHKI}d3?oT0g!J>}IB6Gb* zr;6n>3sC=XLV5;Ej1hw@C%!#HJxoF^t2L7G3KHw2N)SAQ-lZ2?pOq&4rekH&Sk_F<>s^2ao0yUsEuS5WKJaoqG z7StZA4kjv6>cPSlw*JMuk=Q|i61FFH)M1Uow<3))p9%-kh&R(H zztyUf&Gz;$a&Z{`rkVk?u0 zFoa=drpVPdq7~ZK@C~+WQV%4Z98(f<5Lb3wO(DOZ&(&kGqr0LW32B?1%ON@tn=)Sn z+G4$FW*~n|N->96Z1#vzN>Fd~P>Y=)F67nh?hI2}Fsod}zD<{bWh*w~+P6D2y;lxS zxyhngsrh7w-dLm5LtnU?(ngm1@=hT?bOKJV3i3o!Q%WT&c9URg&JAHjW3&oUv*?Xa zGc&uUw1{z+*TPopVrjuljaMB6MUh43lsddXVl|*C7JDez7PBYrr+pG@rCBCFMPM%Z*;)0!B+6p{11TtL! z+9CmdMvtA#Q;HHZvqFLRd1x9%9DNx!%6P*q8wJW|)D_R=4OEpc# zEs2D0CZe##!qGp7V*6^ohuE6hqg0wF@RT-NXvS+%$fjy9nJz_?9Sl?~&t|O}MdU^D zDP3T9Ef~HIOw#YmEYFjA*8lKF^NNkA?2Eo72RVup9cP||!9ZyPs4Kqal3#}<%_)@w*jBv>_S ztM&sZE`^c^Ap$#+D9svForj}$#1|75RbX5; zq3PTkh)0zf_xaRNO1vaLtH?G$)LeBHLX=b29;XjcLcb8$EaqY$dPg*ad2DIx?kTZ- zOJAU|k3T)oDCaeg6D4@OS(-+cCYwD@>+*B^`Z^RFvV^6!yd;y1R->3ZZ$?PZ{MCNfuJoJ2 z;%5GMp(XKXZCHl&wqThBt1(X;q%mdFF&oz`7~!j3S<*^QD&ub7)C2dJcLIY+ANGvv=-It{|pStYn8nXeNUCLm%AgWP_^Mz znPJIQ5ru3$pWNZ=4znoO(QG<6nDr7z#(mvo@ZP@$K?3GQ+v6@{N(>Zlf{miTz6#@nu}mJ z0X!3dEvW5bW>zG;o8*&C%B~3t&T0$51^rm{7 zIj=T%H_@maJOFjCFzz!Zh2aY0Ib+gFZNz%%Qmq$<^~&xuU$Z2qM6^}53gHm;m14)F zj)3|=I^r%mFW*$3pDCrOP*CLlogAJkbT1l8rWHu)wm|qGN}57mZhpknRqh&*(7ut! z`misjv=V7YOiBA_FvEuGbUWPdmo4mt%QGvkZ2MjEYEy~EW^?s4nEU)H8`8M}Zkt+H z2N7xCWUy9@+oOKUR7PC3gO$#{-PpI&D445L3Pk0Mnb1_}-dmN!mR$*8BOoeBV&0cY z!>2HEC}9H5;Kl*8-JFu!+Vg>VR^DA~Oj<0$kC!5#$eOuxQeh*fw>{k@81@uvUeG>m z5Yalj{flD3Eec+ZG2w1I=R;dO!v3YM_GB%AT@;jP$b;49+|Ze>eQ;MiA2#+TgD#q0n@u8^e@MOM@jWb6u;F4BAGW9jlGq#%q~h4rj^- z>VE8YNWSoE&Z@8APM5>yXmMGouno^XS72i}|I{4ji#9TtG2FGcO$TkIyOx|xbTZ$2 z1FYS*@e!>@-kxHKAJ^OUAn*hW(? zrgn-*uy6A4#m`FE9LTU{cJyGpxfBx0cnITuTnP5N}DAW-9)o^ zwvH;Wujl9<^`#>xUbXjOznMB8YS9i}>JH|PB4Jte(+=(?@&`BFc{hCOP{DyMxbWGG z4%=ig9ujqLSq}Y z^su1mMbe1F^!XY!LK4~#l3Dy&9;Us8 zX9|n9RFHqxLr?rGkn}V$bq%i2W?k>=)X!};ms_nI*^p`UY@y16B)$i=9fsLDmQRP^ z>}FXjoM0(^8n-)y5wN|G57NBGEf`ZCq;5V`d3Hqi1p(&9Tii`3G;q6xP(J%Oy) zkHXw4c2J)lrALtEB^SJr;*5obvY=Z!BHhhfldlIC;$cBsrQbYdHf~Y*#9>!5J$EJQ ztF>;d&_%I-ragO?5C$88RnnxC$QnGFBJ7q|vdrTQXO{I!L#58*9$d&)35)}64-qv< zy)cmCc(ziQ#fWy&E`#uKQF+UR8t$vAl&)`dnNDGzU`xxUa^==*0@CPwbvQLuNBEbH z(;}s&rTylc@7Y~Vd7o$|H#k&=!_Q_eLK5{Jhyk6%S6c>;%OZfDUuCP^%e^JsVPHG{BIY*$>HaFz) zEk;mlU1GqZjFZ53-=#Z4CfUjvjHCS{S8IMjS(gt{Q!TE~I6RH*bbdbC4B2Oqx*(}= zH(fbutVH^(z2%Qv@=ba!V9j$}Uzo7@hQv(VgsmfmJwH7%q%2U{SQz%47}=-PRG9DP za6tO>^fWq_`HSMOyeY|{{n9rW#Y+84AoLhpSyEeoMq@1& zJkFlE(eioM=zmTBaIdCshhCc_9cGskk_lQEscbJN{)KNs%~jMCVuz7%@hUP{iq+|N z5-z8*Z!uJBx7RXMJkd=dJ5FZm5Zg>MrTd@KdtQ{ke=MExCSNt%5ox;>`JasKuDt}k zO3hAsn{6RsLq$p?tQPHHqkUcHy=}vpHi4b>q00!>%V$^ zqT2~^ra98&2u<}N&)+EcT)AOv(gu-cp-YN$$J&CNB*G!Fj}Yv6(ET(hwW=j=?I1af zdO4QTKH2x=W-+IRU`eJmqV4P>EX{^=LZ;@A#U!T>KO~y0+ILneB#&VGL_z;b=>#Rt zx)7y@L*^9WE=v*Slbn7)tCIZ$pg61{%h)acUjYza6W+YW|IiX z5*S+yliS)pbF^cXw_f|eIH?6Bt>^=xqkS^r_2z|q%!XuVLaZ3r7b&mfyu6a zNd=V`z9vkf^g~UxRl`JHi%lnmxm8ef*{2(<(=3e2QKH7XHbYT?8XO;P(PJKHzV7mDyB^k$cgEz&*D+?g&n zG#7pO_nsuT_3bw*nJ;9K1L9w^eTljps)-^(dp5~9a8HL_!GyLCo zpMM>Q8!a2EC*`C0d7?B{3Z=}J=UoU!YtbkzE4r@NQ;R0|>UAi=7VOg^tU2z2!oo~^ z1e^yiAW}Mh`6^Ve8JC{tcbMrR*fhuc&AOoMxW8HF$d3Oz>>O%t@6!MeNhqB}gKY5c zPuyro{V$0V`%wOH3*lVB5j=qU0JRDJ+YS!TJc|p4x_58e}G;nH#jcjU%DqNr11L0f&5rN@=E^dlcA_d+=cg9KI zRY3+>COs#=a)ufu46))^_(w-H?A*e134mi!r4b8XqUCC&XPBJiX=qgAWyc<5s~T!> z9z-!ICSvzC10!o)S!CG?vph-87)qPFWbvRKZYVRTNb^G4G^oSciPSo-Dt51^!jLg} z0*O^FuPUW+%)4tW=Wz+hn$k2#VPAbI`gK8H79aJ{W%+BgjFbygs<5DxzYe-4C@1Xg z^dlfOOI(_{ytzq!s3a?AQOxE;rrBx6ub+&l#`IDkZn8<1%px6fxTno_= 2002. +# Luca Ferretti 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# +# Nota sull'uso delle virgolette: +# '' --> usate quando l'elemento incluso è un solo carattere +# "" --> usate nei messaggi di errore che appaiono solo su terminale +# «» --> usate nei messaggi di errore che appaiono nei dialoghi +# (lo so che è un casino, ma per ora lascio così) +# +# Stream rimane stream (consultare le API reference di GIO) +# Seek è tradotto posizionare +# Polling - proviamo con controllo sistematico (MS lo lascia non tradotto) +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.21.x\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-06 01:03+0100\n" +"Last-Translator: Luca Ferretti \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Attributo \"%s\" inatteso per l'elemento \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributo \"%s\" dell'elemento \"%s\" non trovato" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag \"%s\" inatteso; atteso il tag \"%s\"" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag \"%s\" inatteso all'interno di \"%s\"" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Non è stato trovato alcun file di segnalibri valido nelle directory dei dati" + +# usate le «» perché forse questa compare nella UI +# +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Esiste già un segnalibro per l'URI «%s»" + +# vedi sopra per «» +# +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Non è stato trovato alcun segnalibro per l'URI «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Non risulta definito alcun tipo MIME nel segnalibro per l'URI \"%s\"" + +# o private è il nome della flag (che quindi diventa opzione)? +# cercare nel codice... -Luca +# +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"Non è stata definita alcuna flag privata nel segnalibro per l'URI \"%s\"" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Non risulta impostato alcun gruppo nel segnalibro per l'URI \"%s\"" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Nessuna applicazione di nome \"%s\" ha registrato un segnalibro per \"%s\"" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Espansione della riga exec \"%s\" con l'URI \"%s\" non riuscita" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" +"La conversione del set di caratteri da \"%s\" a \"%s\" non è supportata" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Impossibile aprire il convertitore da \"%s\" a \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Sequenza di byte non valida nell'ingresso per la conversione" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Errore durante la conversione: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Sequenza di caratteri parziale al termine dei dati in ingresso" + +# il primo %s è una 'fallback string' come recita il commento nel codice +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Impossibile convertire \"%s\" nel set di caratteri \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "L'URI \"%s\" non è un URI assoluto che utilizza lo schema \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "L'URI per il file locale \"%s\" non può includere un '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI \"%s\" non è valido" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Il nome dell'host nell'URI \"%s\" non è valido" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI \"%s\" contiene sequenze di escape non valide" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Il nome di percorso \"%s\" non è un percorso assoluto" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nome host non valido" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Errore nell'aprire la directory \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Impossibile allocare %lu byte per leggere il file \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Errore nel leggere il file \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Il file \"%s\" è troppo grande" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Lettura dal file \"%s\" non riuscita: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Apertura del file \"%s\" non riuscita: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Lettura degli attributi del file \"%s\" non riuscita: fstat() non riuscita: %" +"s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Apertura del file \"%s\" non riuscita: fdopen() non riuscita: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Cambio di nome del file \"%s\" in \"%s\" non riuscito: g_rename() non " +"riuscita: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Creazione del file \"%s\" non riuscita: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Apertura del file \"%s\" in scrittura non riuscita: fdopen() non riuscita: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Scrittura del file \"%s\" non riuscita: fwrite() non riuscita: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Scrittura del file \"%s\" non riuscita: fflush() non riuscita: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Scrittura del file \"%s\" non riuscita: fsync() non riuscita: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Chiusura del file \"%s\" non riuscita: fclose() non riuscita: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Il file \"%s\" non può essere rimosso pur esistendo: g_unlink() non " +"riuscita: %s" + +# Il secondo %s è qualcosa tipo +# +# char c[2]; +# c[1] = dir_separator; +# c[2] = '\0'; +# +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Il modello \"%s\" non è valido, non dovrebbe contenere un '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Il modello \"%s\" non contiene XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f kB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Lettura del collegamento simbolico \"%s\" non riuscita: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Collegamenti simbolici non supportati" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Impossibile aprire il convertitore da \"%s\" a \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Impossibile leggere i dati grezzi in g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Sono rimasti dei dati non convertiti nel buffer di lettura" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Il canale termina in un carattere parziale" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Impossibile eseguire una lettura grezza in g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Apertura del file \"%s\" non riuscita: open() non riuscita: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Mappatura del file \"%s\" non riuscita: mmap() non riuscita: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Errore alla riga %d carattere %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Testo in codifica UTF-8 non valido nel nome - \"%s\" non valido" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" non è un nome valido " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" non è un nome valido: '%c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Errore alla riga %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Analisi di '%-.*s' non riuscita: dovrebbe presentare un numero all'interno " +"di un riferimento a carattere (es. ê) - probabilmente il numero è " +"troppo grande" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Il riferimento a carattere non termina con un punto e virgola; probabilmente " +"si è utilizzato un carattere \"e commerciale\" senza l'intenzione di " +"iniziare una nuova entità. In tal caso ricorrere a &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Il riferimento a carattere '%-.*s' non codifica un carattere permesso" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Rilevata entità vuota '&;' (sono entità valide & " < > ')" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Il nome di entità \"%-.*s\" è sconosciuto" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"L'entità non termina con un punto e virgola; probabilmente è stata " +"utilizzata una \"e commerciale\" senza l'intento di iniziare una entità. In " +"tal caso ricorrere a &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Il documento deve iniziare con un elemento (es. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' non è un carattere valido dopo un carattere '<'; non può dare inizio a " +"un nome di elemento" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Carattere '%s' spaiato, era atteso un carattere '>' per terminare il tag " +"dell'elemento-vuoto \"%s\"" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Carattere '%s' spaiato, era atteso un carattere '=' dopo il nome " +"dell'attributo \"%s\" dell'elemento \"%s\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Carattere '%s' spaiato, era atteso un carattere '>' oppure '/' per terminare " +"il tag di partenza dell'elemento \"%s\", oppure opzionalmente un attributo. " +"Probabilmente è stato usato un carattere non valido in un nome di attributo" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Carattere '%s' spaiato, era atteso un simbolo di quoting aperto dopo il " +"segno di uguale per attribuire un valore all'attributo \"%s\" dell'elemento " +"\"%s\"" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' non è un carattere valido dopo la chiusura del nome dell'elemento \"%s" +"\"; il carattere permesso è '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" +"È stato chiuso l'elemento \"%s\", nessun elemento risulta correntemente " +"aperto" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"È stato chiuso l'elemento \"%s\", ma l'elemento correntemente aperto è \"%s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Il documento era vuoto oppure conteneva unicamente spazi" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Il documento è terminato in modo inatteso subito dopo una parentesi angolare " +"d'apertura '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Il documento è terminato in modo inatteso con elementi ancora aperti - \"%s" +"\" era l'ultimo elemento aperto" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Il documento è terminato in modo inatteso, mancando la parentesi angolare di " +"chiusura per il tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" +"Il documento è terminato in modo inatteso all'interno di un nome di elemento" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" +"Il documento è terminato in modo inatteso all'interno di un nome di attributo" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Il documento è terminato in modo inatteso all'interno di un tag di apertura " +"elemento." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Il documento è terminato in modo inatteso dopo il segno di uguale che segue " +"un nome di attributo; nessun valore per l'attributo" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Il documento è terminato in modo inatteso all'interno di un valore di " +"attributo" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Il documento è terminato in modo inatteso all'interno del tag di chiusura " +"per l'elemento \"%s\"" + +# di elaborazione? in elaborazione ? +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Il documento è terminato in modo inatteso all'interno di un commento o " +"istruzione di elaborazione" + +# corrotto sembrava brutto, cfr revisione su TP +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "oggetto non attendibile" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "errore interno oppure oggetto non attendibile" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "memoria esaurita" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "raggiunto limite di backtracking" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"il modello contiene elementi non supportati per la corrispondenza parziale" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "errore interno" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"per la corrispondenza parziale non sono supportati i riferimenti " +"all'indietro come condizioni" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "raggiunto limite di ricorsione" + +# oppure lasciare workspace non tradotto? +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "raggiunto limite dello spazio di lavoro per sotto-stringhe vuote" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinazione non valida di flag di fine riga" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "errore sconosciuto" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ alla fine del modello" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c alla fine del modello" + +# che differenza c'è tra "follows" e gli "after" qualche messaggio dopo? +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "carattere non riconosciuto dopo \\" + +# case --> in tipografia si tradurrebbe cassa, in particolare +# lower -, upper -, cassa per lettere minuscole, maiuscole +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"gli escape per cambio maiuscolo-minuscolo (\\l, \\L, \\u, \\U) non sono " +"consentiti qui" + +# quantificatore: esiste come termine per log. mat. e gramm. +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numeri fuori ordine nel quantificatore {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "numero troppo grande nel quantificatore {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "] terminante mancante per classe di caratteri" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "sequenza di escape non valida nella classe di caratteri" + +# to put out of order --> guastare, mettere in disordine +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "intervallo disordinato nella classe di caratteri" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nulla da ripetere" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "carattere non riconosciuto dopo (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "carattere non riconosciuto dopo (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "carattere non riconosciuto dopo (?P" + +# classi nominate?? +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" +"le classi POSIX nominate sono supportate solo all'interno di una classe" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr ") terminante mancante" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") senza ( di apertura" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R o (?[+-]cifre deve essere seguito da )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "riferimento a sotto-modello non esistente" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr ") mancante dopo il commento" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "espressione regolare troppo grande" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "recupero della memoria non riuscito" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "l'asserzione lookbehind non ha lunghezza fissata" + +# malformato si riferisce a entrambi???? +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "numero o nome malformato dopo (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "il gruppo condizionale contiene più di due diramazioni" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "asserzione attesa dopo (?" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nome di classe POSIX sconosciuto" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "gli elementi di collazione POSIX non sono supportati" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "il valore del carattere nella sequenza \\x{...} è troppo grande" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condizione (?(0) non valida" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C non consentito in asserzione lookbehind" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "la chiamata ricorsiva potrebbe entrare in ciclo infinito" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "terminatore mancante nel nome di sotto-modello" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "due sotto-modelli nominati presentano lo stesso nome" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "sequenza \\P o \\p malformata" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nome di proprietà sconosciuto dopo \\P o \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "il nome di sotto-modello è troppo lungo (massimo 32 caratteri)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "troppi sotto-modelli nominati (massimo 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "il valore ottale è maggiore di \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "il gruppo DEFINE contiene più di una diramazione" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "la ripetizione di un gruppo DEFINE non è consentita" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opzioni NEWLINE incoerenti" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g non è seguito da un nome tra parentesi graffe oppure è un numero diverso " +"da zero opzionalmente tra parentesi graffe" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ripetizione inattesa" + +# secondo garzantilinguistica.it eccedenza (di dati) è la +# traduzione di overflow secondo IBM. La traduzione generica +# per ambito infomatico è superamento di capacità +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "eccedenza di codice" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "sconfinamento compilando l'area di lavoro" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "sotto-modello referenziato precedentemente controllato non trovato" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" +"Errore durante la ricerca di corrispondenza per l'espressione regolare %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La libreria PCRE è compilata senza supporto per UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "La libreria PCRE è compilata senza supporto per le proprietà UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Errore durante la compilazione dell'espressione regolare %s al carattere %d: " +"%s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Errore durante l'ottimizzazione dell'espressione regolare %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "attesa cifra esadecimale o '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "attesa cifra esadecimale" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "'<' mancante nel riferimento simbolico" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "riferimento simbolico non terminato" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "riferimento simbolico di lunghezza zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "attesa cifra" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "riferimento simbolico non lecito" + +# significa che il testo finisce con una barra rovesciata, è il +# carattere successivo che manca +# +# Quindi "isolato" o "staccato" o al limite "accindetale", "casuale" +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "'\\' finale isolato" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "sequenza di escape sconosciuta" + +# da sostituire crea confusione... +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Errore durante l'analisi del testo di sostituzione \"%s\" al carattere %lu: %" +"s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Il testo citato non inizia con un carattere di quoting" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Carattere di quoting non accoppiato nella riga di comando o nel testo con " +"quoting di shell" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Il testo è finito subito dopo un carattere '\\' (il testo era \"%s\")." + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Il testo è finito prima di trovare il carattere di quoting corrispondente " +"per %c (il testo era \"%s\")." + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Il testo era vuoto (oppure conteneva unicamente spazi bianchi)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Lettura di dati dal processo figlio non riuscita" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Creazione della pipe per comunicare con il processo figlio non riuscita (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lettura dalla pipe figlia non riuscita (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Cambio della directory in \"%s\" non riuscito (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Esecuzione del processo figlio non riuscita (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome programma non valido: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Stringa non valida nel vettore di argomenti alla posizione %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Stringa non valida nell'ambiente: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directory di lavoro non valida: %s" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Esecuzione del programma helper non riuscita (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Errore inatteso in g_io_channel_win32_poll() nel leggere i dati da un " +"processo figlio" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Lettura dei dati dal processo figlio non riuscita (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Errore inatteso in select() nel leggere i dati da un processo figlio (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Errore inatteso in waitpid() (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Esecuzione di fork non riuscita (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Esecuzione del processo figlio \"%s\" non riuscita (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Ridirezione dell'output o input del processo figlio non riuscita (%s)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Esecuzione del fork per processo figlio non riuscita (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Errore sconosciuto nell'eseguire il processo figlio \"%s\"" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Lettura di una quantità di dati sufficiente dalla pipe del processo figlio " +"non riuscita (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Carattere fuori dall'intervallo per UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Sequenza non valida in ingresso per la conversione" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Carattere fuori dall'intervallo per UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Uso:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPZIONE...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opzioni di aiuto:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Mostra le opzioni di aiuto" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Mostra tutte le opzioni di aiuto" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opzioni dell'applicazione:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Impossibile analizzare il valore intero \"%s\" per %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Il valore intero \"%s\" per %s è fuori dall'intervallo" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Impossibile analizzare il valore double \"%s\" per %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Il valore double \"%s\" per %s è fuori dall'intervallo" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Errore nell'analizzare l'opzione %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argomento mancante per %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opzione %s sconosciuta" + +# key files sono, per glib, file di impostazioni in stile Windows INI +# +# Ad esempio i file .themes per i temi del desktop e delle icone. +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Impossibile trovare un file chiavi valido nelle directory di ricerca" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Non è un file normale" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Il file è vuoto" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Il file chiavi contiene la riga «%s» che non è una coppia chiave-valore, un " +"gruppo o un commento valido" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome gruppo non valido: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Il file chiavi non inizia con un gruppo" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome chiave non valido: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Il file chiavi contiene la codifica non supportata \"%s\"" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Il file chiavi non presenta il gruppo \"%s\"" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Il file chiavi non presenta la chiave \"%s\"" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Il file chiavi contiene la chiave \"%s\" con il valore \"%s\" che non è UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Il file chiavi contiene la chiave \"%s\" il cui valore non può essere " +"interpretato." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Il file chiavi contiene la chiave \"%s\" che presenta un valore che non può " +"essere interpretato." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Il file chiavi contiene la chiave \"%s\" nel gruppo \"%s\" il cui valore non " +"può essere interpretato." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Il file chiavi non presenta alcuna chiave \"%s\" nel gruppo \"%s\"" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Il file chiavi contiene un carattere di escape alla fine della riga" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Il file chiavi contiene la sequenza di escape non valida \"%s\"" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Impossibile interpretare il valore \"%s\" come un numero." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Il valore intero \"%s\" è fuori dall'intervallo" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Impossibile interpretare il valore \"%s\" come un numero float." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Impossibile interpretare il valore \"%s\" come un booleano." + +# count (gssize) è un parametro delle funzione +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Valore count troppo grande passato a %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Lo stream è già chiuso" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "L'operazione è stata annullata" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Oggetto non valido, non inizializzato" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Sequenza multi-byte non valida in ingresso" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Spazio non sufficiente nella destinazione" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Inizializzazione annullabile non supportata" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipo sconosciuto" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "Tipo di file %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "Tipo %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "End-of-stream prematuro inatteso" + +# NdT: nome di applicazione (quando manca) +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Senza nome" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Il file .desktop non specifica il campo Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Impossibile trovare il terminale richiesto per l'applicazione" + +# NdT il primo %s è il percorso alla cartella .local/share/application +# messo tra parentesi per scelta stilistica... +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Impossibile creare la cartella utente di configurazione applicazioni (%s): %s" + +# NdT il primo %s è il percorso alla cartella .local/share/application +# messo tra parentesi per scelta stilistica... +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Impossibile creare la cartella utente di configurazione MIME (%s): %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Impossibile creare il file .desktop utente %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definizione personalizzata per %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "l'unità non implementa l'azione eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "l'unità non implementa l'azione eject o eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "l'unità non implementa il controllo sistematico dei supporti" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "l'unità non implementa l'azione start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "l'unità non implementa l'azione stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Impossibile gestire la versione %d della codifica GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Numero di token malformato (%d) nella codifica GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Impossibile gestire la versione %d della codifica GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Numero di token malformato (%d) nella codifica GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Atteso un GEmblem per GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operazione non supportata" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "L'oggetto mount contenuto non esiste" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Impossibile copiare sopra la directory" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Impossibile copiare la directory sopra la directory" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Il file destinazione esiste" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Impossibile copiare la directory ricorsivamente" + +# see man splice(2) :) +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Splice non supportato" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Errore nell'eseguire lo splice del file: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Impossibile copiare il file speciale" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Fornito valore di collegamento simbolico non valido" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Cestino non supportato" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "I nomi di file non possono contenere '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "il volume non implementa l'azione mount" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Non risulta registrata alcuna applicazione per gestire questo file" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "L'enumeratore è chiuso" + +# una sola ???? +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "L'enumeratore di file presenta un'operazione in sospeso" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "L'enumeratore di file è già chiuso" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Impossibile gestire la versione %d della codifica GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Dati di input malformati per GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Lo stream non supporta query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Posizionamento non supportato sullo stream" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Troncamento non consentito sullo stream di input" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Troncamento non supportato sullo stream" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Numero di token errato (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Nessun tipo per il nome di classe %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Il tipo %s non implementa l'interfaccia GIcon" + +# o non è classificato ?? ma credo classificato abbia una diversa valenza... +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Il tipo %s non presenta una classe" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Numero di versione malformato: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Il tipo %s non implementa from_tokens() sull'interfaccia GIcon" + +# FIXME c'è qualcosa di sbagliato nell'originale, vero?? +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Impossibile gestire la versione fornita della codifica di icona" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Lo stream di input non implementa la lettura" + +# solo una?? +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Lo stream presenta un'operazione in sospeso" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Spazio non sufficiente per l'indirizzo del socket" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Indirizzo del socket non supportato" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Impossibile trovare il tipo di monitor predefinito per directory locali" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome di file %s non valido" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Errore nell'ottenere informazioni sul file system: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Impossibile rinominare la directory root" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Errore nel rinominare il file: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Impossibile rinominare il file, il nome di file esiste già" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nome di file non valido" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Errore nell'aprire il file: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Impossibile aprire la directory" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Errore nel rimuovere il file: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Errore nel cestinare il file: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Impossibile creare la directory cestino \"%s\": %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Impossibile trovare la directory di livello superiore per il cestino" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Impossibile trovare o creare la directory cestino" + +# consultare la specifica del cestino di freedesktop.org +# (in breve per ogni file cestinato viene creata una copia +# del file e un file di informazioni - data, posizione originaria...) +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Impossibile creare il file informazioni cestinamento: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Impossibile cestinare il file: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Errore nel creare la directory: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Il file system non supporta i collegamenti simbolici" + +# FIXME: all other occurrences are "symlink" +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Errore nel creare il collegamento simbolico: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Errore nello spostare il file: %s" + +# ma che senso ha??? +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Impossibile spostare la directory sopra la directory" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Creazione del file backup non riuscita" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Errore nel rimuovere il file destinazione: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Spostamento tra oggetti mount non supportato" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Il valore dell'attributo deve essere non-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo di attributo non valido (attesa stringa)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nome di attributo esteso non valido" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Errore nell'impostare l'attributo esteso \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Errore nell'eseguire lo stat del file \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codifica non valida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Errore nell'eseguire lo stat del descrittore di file: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo di attributo non valido (atteso unit32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo di attributo non valido (atteso uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo di attributo non valido (attesa stringa di byte)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Impossibile impostare i permessi sui collegamenti simbolici" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Errore nell'impostare i permessi: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Errore nell'impostare il proprietario: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "il collegamento simbolico deve essere non-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Errore nell'impostare il collegamento simbolico: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Errore nell'impostare il collegamento simbolico: il file non è un " +"collegamento" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Errore nell'impostare l'ora di modifica o accesso: %s" + +# lasciata minuscola come per precedente messaggio +# "symlink must be non-NULL" +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "il contesto SELinux deve essere non-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Errore nell'impostare il contesto SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux non è abilitato su questo sistema" + +# %s è l'attributo +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Impostazione dell'attributo %s non supportata" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Errore nel leggere dal file: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Errore nel posizionarsi all'interno del file: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Errore nel chiudere il file: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Impossibile trovare il tipo di monitor predefinito per file locali" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Errore nello scrivere sul file: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Errore nel rimuovere il vecchio collegamento di backup: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Errore nel creare la copia di backup: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Errore nel rinominare il file temporaneo: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Errore nel troncare il file: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Errore nell'aprire il file «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Il file destinazione è una directory" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Il file destinazione non è un file normale" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Il file è stato modificato dall'esterno" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Errore nel rimuovere il vecchio file: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Fornito GSeekType non valido" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Richiesta di posizionamento non valida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Impossibile troncare GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Stream di output di memoria non ridimensionabile" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Ridimensionamento dello stream di output di memoria non riuscito" + +# spero sia write -> scrittura e non write -> write +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"La quantità di memoria necessaria per elaborare la scrittura è più grande " +"dello spazio di indirizzamento disponibile" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Richiesto posizionamento prima dell'inizio dello stream" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Richiesto posizionamento oltre la fine dello stream" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "l'oggetto mount non implementa l'azione \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "l'oggetto mount non implementa l'azione \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"l'oggetto mount non implementa l'azione \"unmount\" o " +"\"unmount_with_operation" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"l'oggetto mount non implementa l'azione \"eject\" o \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "l'oggetto mount non implementa l'azione \"remount\"" + +# ok, lo so, un filesystem non può fare congetture.. +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "l'oggetto mount non implementa la supposizione del tipo di contenuto" + +# ok, lo so, un filesystem non può fare congetture.. +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"l'oggetto mount non implementa la supposizione sincrona del tipo di contenuto" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "L'hostname \"%s\" contiene '[' ma non ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Lo stream di output non implementa la scrittura" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Lo stream sorgente è già chiuso" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Errore nel risolvere \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Errore nella risoluzione inversa di \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nessun servizio registrato per \"%s\"" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Momentaneamente impossibile risolvere \"%s\"" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Errore nel risolvere \"%s\"" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Socket non valido, non inizializzato" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket non valido, inizializzazione non riuscita a causa di: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Il socket è già chiuso" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creazione di GSocket da FD: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Impossibile creare il socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "È stato specificato un protocollo sconosciuto" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "impossibile ottenere l'indirizzo locale: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "impossibile ottenere l'indirizzo remoto: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "impossibile restare in ascolto: %s" + +# oppure "nell'eseguire il binding" ?? +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Errore nel legarsi all'indirizzo: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Errore nell'accettare la connessione: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Errore nel connettersi: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Connessione in corso" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Errore nel connettersi: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Impossibile ottenere l'errore in sospeso: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Errore nel ricevere i dati: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Errore nell'inviare i dati: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Errore nel chiudere il socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "In attesa della condizione del socket: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Errore nell'inviare il messaggio: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage non supportato su Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Errore nel ricevere il messaggio: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Errore sconosciuto nella connessione" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Il listener è già chiuso" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Il socket aggiunto è chiuso" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Impossibile gestire la versione %d della codifica GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Atteso 1 messaggio di controllo, ottenuti %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tipo di dati ausiliari inatteso" + +# tolto il "but" per omogeneità con l'altro simile +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Atteso un FD, ottenuti %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Ricevuto FD non valido" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Errore nel leggere da unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Errore nel chiudere unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "File system radice" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Errore nello scrivere su unix: %s" + +# a chi è riferito abstract?? +# a addresses o a domain? +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Indirizzi di socket di dominio unix astratto non supportati su questo sistema" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "il volume non implementa l'azione eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "il volume non implementa l'azione eject o eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Impossibile trovare l'applicazione" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Errore nel lanciare l'applicazione: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI non supportati" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "cambi di associazioni non supportati su win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Creazione di associazioni non supportata su win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Memoria non sufficiente" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Errore interno: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Necessario maggiore input" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Dati compressi non validi" + +#~| msgid "Invalid sequence in conversion input" +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Sequenza UTF-8 non valida in ingresso" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Raggiunto il limite massimo dell'array di dati" + +#~ msgid "do not hide entries" +#~ msgstr "non nascondere le voci" + +#~ msgid "use a long listing format" +#~ msgstr "usare un formato di elencazione esteso" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Il carattere '%s' non è valido all'inizio di un nome di entità: il " +#~ "carattere '&' dà inizio a un'entità; se questo simbolo \"e commerciale\" " +#~ "non vuole essere l'inizio di una entità, ricorrere a &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Il carattere '%s' non è valido all'interno di un nome di entità" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Riferimento a carattere vuoto; dovrebbe includere un numero, come dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Riferimento a entità non terminato" + +#~ msgid "Unfinished character reference" +#~ msgstr "Riferimento a carattere non terminato" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Testo in codifica UTF-8 non valido - sequenza troppo lunga" + +# anche gradevole "di apertura" come da discussione su TP +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Testo in codifica UTF-8 non valido - non è un carattere di avvio" + +#~ msgid "file" +#~ msgstr "file" + +#~ msgid "The file containing the icon" +#~ msgstr "Il file contenente l'icona" + +#~ msgid "name" +#~ msgstr "nome" + +#~ msgid "The name of the icon" +#~ msgstr "Il nome dell'icona" + +#~ msgid "names" +#~ msgstr "nomi" + +#~ msgid "An array containing the icon names" +#~ msgstr "Un array contenente i nomi delle icone" + +#~ msgid "use default fallbacks" +#~ msgstr "usare alternative predefinite" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Indica se usare le icone alternative predefinite trovate accorciando il " +#~ "nome ai caratteri '-'. Ignora i nomi successivi al primo nel caso in cui " +#~ "ne siano stati forniti più di uno." + +#~ msgid "File descriptor" +#~ msgstr "Descrittore di file" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Il descrittore di file da cui leggere" + +#~ msgid "Close file descriptor" +#~ msgstr "Chiude il descrittore di file" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "" +#~ "Indica se chiudere il descrittore di file quando si chiude lo stream" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Il descrittore di file su cui scrivere" diff --git a/po/ja.gmo b/po/ja.gmo new file mode 100644 index 0000000000000000000000000000000000000000..8de2183a662300c9dddba2a6f4188adb88b8c4cc GIT binary patch literal 49397 zcmd753!GKudGEi{(>AFwiAikYC5bC2&Y%neUZUU)5tXQD6g7z$+|2A5w#>|)%tb(J z%FL)-4R`@XP*4$6bbxrnE6r)n>1i%aPn#xfnlwGx>>21KY1(sAlbrVazrW{w*V=3C zz4pu)+t25}Kdkw!%X@v^=Y4MPyB2@*q2JsX@LT(?Aov*Adt?xN{5OK&o5$#G5M21l zAowsi3w$?toyVIz=E3)Jzr$ZI2an>qAN(A6AGi?w2QUX-F(C+!1&6>B!2bbG0uOn-;77m>;L+eN@Ko@1un{~2hTsQJ3WDRo=^(d)d7$d)20sd}1E+&K zz;nRwfix-j;KU#}13Vo(4O|SWzK6im!9AerD}mF%574+Ka2BZaMNsu^1J%Ai1VivI zLG|kwpxSj}gKO^v;AE~BgA^HT1W6LS210`1#~y!+&MAK*sCHfhhF~u^3)~1k3Vsh% zdv7JN=y?w~6MPPw0v-lW0gvI2u4jW9+HO$y*YZd8zXayMAA*;F7tm?ZvJqz9d9`bl0L=wFo0!6249*2Nf%k%c3x;4f znMBX~!B2osf#T0U0@dGxp!)GEe|_{+c!%p#LFGFiRK9CLsz4G z{Ui9h;E^=?IB)`}a?S%o@ETD0dqCB{9u!~g^!MNN_feck}BdGSR0+oLUsPz9GRJy+bHSTYL3{7x4g9fRBMWE)<{h-o)%i{=m zKG*L$D+rik!G)maM;=uDt3g;i*afP*Z-eUpzk}k7kAKRw|0YoRSAyc3XF>Jn&%h6Z z!P&08M}um|S)lm2%U^E+HST`_D&IeYux=2Ncnx?3D8Bz5sQdp8LaN{tI;-}60Tew3 zK+$stND;xGfFupxJ=3*o7N~x-fvRVdzy2Ed5w8CQRQ@B*b>*D_zK`qcLG`-@`~Wxz zs+{}%^ZyE}eSZq7J^$*jk3Y}x?M2{m++PH$-FJYhe;;KLU?xi<%d^uaRl z6X1)W#^pPp%KH_l`p%r==E2pV=zI(KA@Bk4L~s|V{(J+R2OdLb_kwNUZMweHwc~z| zyTOUv|3grGcNkQECqOLm`PCp(Ex6rZ?*kEq!4E)<=aF-rya+*+GYeF|+d%dEPVjfZ zUEl}7H$aW^w?WbO5GZ=Q=hLp7Q$Rhx98@_ip!(Mjs{apwO1}p@3H+a+_~YlG>T9^% zjqj(y8C>5Bsz2WZ5plsUL5)KbL}JPWbHEVn2OGf0L8bpXI0<|URJjwbbp4$Js@~6m zA^0T_)(f_Q;SfRJ-Scs^?Zv^XXA=3ixMWBlxbXTz^ghPv!bX zP;^=eiY~jrQ@}p}#V3Cc@-H~zYIH96c~I?r6jZ*ig5sn91*-n{e8%NJ1yp(0ff|=i zQ01)vj|8`YD(_kF-QYigqW@dqZ-XDc#1QRDW&*o4_G31b+ak|NjQQ7d-Y_ zN5_ev+I0@7`F=CV&;)&;#{H|H`uR5?tRMUilUVi712t|1a4PsD_&)Hv;56_ccog`N z>sw=p!K1;&pvu1kd_VXwD7o=8cqaHqpvL{*{QZXOUHUno@-G6_j-{aJd7r<2 z0aUr)2377qfEtHif#R1>+~D|bHmH8x2x`3V21TDepwfQ>RJlI^KMEf8SvP+gLAC3A zQ1fgtC^~-`lzey{{2=&qP~-ld&$)DsV9516P;@GSs_zbPI=C5BdEW$8-#>#Imm@y! z+C2?azpe+xw>{toz%AhE;BN33@JFEJ>06-q_N*IS{}zF2*IH0?egstd*Fd%BJD}?Q zF(^9y5>)$7Sm4@yfybLY_JiWn$HB9}ulnn^z{y;H^d|TGVzB>RLC_4U-0~M3A0M&M z;fFjP2Oh`s3847%Jn&d>F1Q?Q2D`u?f_>n;n_WF$14X}|c|0lS#`Om967COx%Kyip z_;mInN0(mkBCfZCv%nH4ewf(oRH|seFNrRcK&hCB?ge1W)K)Mv%(B|6nGN^pN1kV9aUF`H_9=w3-A#e`( z6A%#)oKbM|?QW0zLCxR41J47`y2a_UUT^}}`@m0v-vO2X=ipDk%a$;=!B4fj@tg%R z<%4CQ+Wk%Ne6X>@>9aOa-_s=W)i5Iznn-64>v70l>D zw}JP8dR_wi!AV~Xg5LvogK9@(x1-PRfz!A?04m?lz{|jkdV+u^25Z5;2j2okzk|Jw ze?I}!oWk`5U?X@7cq(|m#{=L=T>m}zLGY+s9sf-LFXZ}M@C@({fB!4sY_7iv&H#^E z>e5{fPT_hTcp~^3cr5rMP;~zVcoBH~GFRRgKx+rs!2JWD`Zofqy~o156Tyo?rMm@G z`I|uT_kRP`t|M=A<2?&h{@?f4`@oNL{Zml&zwdU}&(lDqn-8k|yTK;#Sx|iTeUHa6 z2sd*5c~JGf1ggF=cp-S)9c~`n2x|Pk0$v5a1YZXq!o_u9sqCV`p>}}ct*eL|0eKKu73z#08Sime31t)T<~AP zi@-AmU3-^;M{)fp;AHSep!oR6I~`sRF5r4Qcs%%T;7st?yIjAn1GjL!0aU${?{@uZ z2gR31^^?*2wl^c(iqXRUU6U?n(-`$OPa;9r8r zfFD@n`qv1a#C0B=3$6h_27U*;0{j`McAmf1(fLbY1J`>&_5Uxy8^PaN=jL|~RQkQ( zh2TGVoOX}9-wmq1uYi&R-vcLrKlga-mtDWl1$F@KkWx2G_ouz?->#7Q6*~-@Q(rE(0&;`n%v&;Dr0om0&k`6F3a2 z-iz;dbnFMO;d(!)dfxkhlTVj}s{av>e+G&l-n|jq18f1suYUwy1pWdP9nRh46)`bkjz_$Am2 ze)eH>Hux>@F>o(Tsd2q#tHaws_3Lr)2JpwA>Yee3YxhcU9@k&@*T+8U=(7M+zcz#C zgFo=s$8U4xeF0QEANBZc@D#3t?G8@`&*JiW@B;82Fa*B^D&0>&-9MH_pALQwRQh|s z%fPRJmw@kk+|hA9cn;UkfQ!I`pvLXeCtUuALG|lTz$xJIJ6!pn2AjBE1FF3J;LYIw z12vy+e$qb&)vo=Z+EoJQfG6&B^%X#s|4mTsJ$9Gl=PSWRu6sb0zZI0+D}n9cC!Pv| zR&Xt-^8OhVf1drc!#hEh_ov_);BP+THo8jr7o?*bXF_&19iXZWlC1768BWHUMZD^PU4T$%Wt1)ku~8N%Rt&ez!! zbiGFb>}u`(s=qf4{9V#E`|A&bbGcp#LgE1S3g&a&#G&6mI0#DMMcnHLe;@oj$6xwq ze*+%m_#nq`aGb=m)u4WV$ni;zBe-`6T)^=~&W{9t5B%Ste&Qwjaqm)2P6oGtzs0f7 z9yt1G?DTt-K@U*?!cx~2X>2lzW&H-dc}w{w04_<4?LoPQL&ienAu ztsK$szjAVZ;#&75gFeN*B^=jsev5AMdy?aW+$-9Z^NDWdT61kX$N%v6e++hU|8$Ni zoZrUrGRLu8>-QdytK4PqQ*a^oBrEj$G{@CkKW10%&(S{5Qt(!8&G*kf!1WLP`8JOa zg74z~RUF^<_x=j}1V^4@0>^Lg>^$&yInLz#(;U%nr9Xdf;+~$Z@H0<-pl!C{PQ00pZznz z(TVdj6Xzl6hPnP8$7YT@eg5}@8@axiL%&sA?{ufZe+P?PpUd$fjxyJGfcnkg_>rBV zJ3MxR2RP0k&2DfGM}gx`j#iGz9QtkGxR2u}y70dqa5l%q@RW(9P;OvgEw*rE zm2{up_tJ@-51@6*|LQXP9r#cjP;J z!_Hhse%vMZF3wlV?V*~}8fJ#ptpC9B+lxKu-F|oUU1{7O*gd^+6uirVMkw2Z@4J$X-a*ImWPvqN#W8$@8V)# zZ&>WgcZ$-D!K`pmvACoo*S&D4%eeVv76 zVN0YuQ%@+UTlqN zZv(4bt;N1hYKjxWdVTqrNS(#brg_(0aYb-Zu6apcmoah}*V>wcuUmrIxz2{(u({Z^ zJZvd+=bL+r-OIz`t?+GpnM_mvNl#avp0!&oQ4aMmANKW7+Ld#!oI^F8t%bI}Zr5)n zMhj0S_RQeO$dXG?@a^Sn$@eVjE&3kEWw#WWf!(>Kp*SF9oZA)_iVK;Jot^pig}S-0 zz0jFo2uHv}zCq*2)LUGbXBZqMTML~nVWQ>!HkGur=WVKJsM`y$3`Fh`cWC|;=wK|4 z(s`m}6X85$)SQk*NQk$SHs3OL+@)UvQ;a|L{Kd$s%+fnxlnMuBGn6K4C5`ViEZ7HG zZq2tZuj0x$fr$@E<;liucA1*i>6G0?W=e{goAd4MIj9H^6nf#=!fhE7QH5xZK{`f& zxrT^a#6)tlvA4(r*bFhD*%&46%5@_nTZ(-u-OWautP(+v4^^Z~Rp{)^x558)ld15o ze0N8oM{Lp~xzn?}0~TFkvqdHKcK3B6WAfppSLQpIxpOm*^aS8bWlg3 zlSDn@`J8H3rz@gbDZQ>T8QRJu>1>mbMQ+Z&q-ok&W2HDdk)S)@n(s!jN^CVvIR(ww zQuHF!)GfNg^{Q90G**V0CA6TU)lH_CiFmU1>>^U4 z+2l1;?CLJINjK!=~dBi?|BH3511+Fk#p zU2T{rwtJgHxlD{{9)uGn_Do15w~6KX76!A5tqNb&+eqp}Gg_Cnx8xCSOc?mk^Yg`X zE}1)TPT1C6M7>aRMw2rBa*5%=xW%*{Na=yJK zxVYHdXXX#1#Ax<)=9i&Y;1tF<*D7;L(lYT-%iK z)Fxt@y%LhcMm4J3q}phe-y&1Y4T(ltvK*-aGcw?2K4I&Q+JvQx#k!R~RK{-Xfs(x! znM3eFZ=t>2HKEDPrKQYU^{qWeBcm>^bfHO1a)hl|66mOc?cz`6+Ev!gFPso1bRmLZI6sfz{$eLw51A0%UAg8w z>9h4pm=xQ=9PdEbj91CdAe|gyOBzv7un6d0%C=F9$RmSYs;q8)CQ~A9x|Cp!HJ@T7 zNE=R`*?^?ZBcvHibF{c$Kn>)&^D~@84Nv}JU$J*)cyhb`wCPW-tJpI$nB&U$|B>wX zEiywRQfgjWFX=2U?WD;FEv#Bbui^mA>F(w_*W8@P`bT;&u3m$fP<4+NVJ>=Y zn^}GI>MrrDE#GU!svFK{V%E176Ditrm@$i0K*DlPJnzUY(L=1CMMaz{lz!)um=VJvFUp4q%1UQr%ILtE-8h z$zG@$`qZ(VmDjmH3v=;DrV@bUeAMIXU$VXQ{cn(1nalR7LEi z$L4(%^}Sz{!6MFTz&`6Lz>jSh!EJr*xo#z@BfZkF_P%7!ZnPtv!9K4d#L~)>%5;}! z5s}7d4zoqB0>Lqxn0cgK+rqw1P1?puc(05hw?vG{#L30M1exmgWD{EwX=LZOwm1vJJv<_~#A;NR7zw$PoTWu;*f_CgQZk)cTE=W{KD3(U zl5TyXSg9-O6?4Y(r{-~20e?>YlSvN=6_KM?W|+YTNH=fbSGOjQQ=;HoI*~lB@ujTl zTvXiRd^_{eIgq)I+M>GTw<@tyUh0@@Y!tyv5R7gusV>3prQ2N963OFO@(@*MO_H!x zbG9DEJ90jx=E&W_b-ko!S;j+S1K?SC2Ara&i#I*X8^Y zUkVq+B2EfAGBK=D@}cyO^W0N|InHF&Twz7#JBxj7i)%~9KDSv?#V3}>2Q6%#XeQN7 z6OVP(h*>Fe#Ztyw)`acOJMkcIhA5U?p@PC$;?NWgY8zpedE5d?8pok+M0NG79 z3bzq3x7b-!FFwA)XBDOs#! zxb#|EF_}#S2t{$FvobAm7e})cy<}aZrMR>wxC|LsSrfU8FrE#d$vQj;7e#8gvB5l6 z#s3;^Y6vW}iL0-{u_&7&NCizUQ?cSR($op5rak10WGN4Nu3sL!^jgfr`7Hg}@{D5k z)ZiRi#YN9{L3kW>)9(<+y3u4EcgfVHI8Q8eZ5c6a)FPrfBz+Xc9VXRHJ??~k#5hl% zK8_NV@T@a361s*FWV0|X{i?WiZc4_D%rIp|gZR1TWabSSA`vZJ_)y7Ac0{)qd%lR% zEy=S~TAj)wv2aAq1DW=iLUe*KY*c2?csk|$>dAC9wK~x144M{J*m|Aw8kcI^KiS4T z&XiylKXechN$z<~wgKbQe3t-RTr=4ZyD(w6Rpu8TW4~7J=9) zHnc3~9iYPyK-t( za>`D|BOSE4)70g$6Awol#g{XGPLRyBe(UO4@j3!pxbQ?&EQ!RG%^PY$S9jr7bNku}yi1TQ5>;$z%JsQ!PIe*O zT3}g{a9FY1)gLv@=q746vtR&m)hh^3b<9J|<4T#bqiolO8fgrRs8vdQDv{7)5uRKU zsb+Co^xit`R7o6>Y zvhx7L;40_gpzE`ZS#tq`t7l&`2X)MP8gWo&s0(_*<(hgjSkWwJE0RF%wz%Re9%sfl z^;Or-{VavEC&EG_o)c`Xrm8~n7FKNk&_GyS*n&9f{4F^neZ(CN( z4s-Q_&uDnOJuQ7D8{h4W^Xfz6M>BCIG={-77W1}=?`CRiOHdVnt=$e4CGZLt0~P68 zv#m?Ef4cj&0mC_m*ZN>@g)ay?O4(P&{@TUGrP>x3D&pf80D1zuo4(^Vo6(pm{dR4! zuN!gYnIz+RntOcBA(ZW2zEBG+!L=?$eYemj$S6Cx(o)^C`IVSH&I3xLCrI8>X%z#s z`jLoKB`N3QbHaOGkwnApZPoCz_6yR9yhxZFMQBuNlmWRZuS*%UgiwGX`)r6M^xR5- ztBNFqWnCzKQJ!fo!Qg|#PEKgnI%#jJxOqz0IA3eN%BN?lXi~D6vrGlITYz(Qn6fgf$5p_o@GfJmTJ;wT^byj^sr7$qbER2j#Tyx)sg(7;rMBJ9JfBuA z@{f{#wB()^PAazqj9>M%y)K>vwg(i+Vv@(K)0$_tFr!%vu|`QDEh$k`S+=N@WIG`- z%yND0Y}2w~j@?qsSe$FPU6xlcY98aX(UNP+k$Rh3zAg?bInpe{DUaiQ*BmA$V7IS$*}9< z?N4Do*R2`e+0s;OZSuUBd~6G$DBaYaR@+FtunW}=zsarAc$w8|aa|O2as`Ag#Vxab zFtn)ZcBna?>@F;uRmRd>p|`8hLLnADP9%w}O=_~8SJl0ao=>)YHhLO|tCFoX`yD$I z1B;zNGMCgzQrPy4&~?VGz=#5=Uc1e6>7-0e#ISa2#AQ@g@S~&{UcE)kCKH2hE1M#O z(PPiqrcq$EwBaJkYC%eiJr)OG8;FRt`NFHbc|P!T_58V4&6_f1%1yz7L_`anARQGfnC;Ys zm+TBdJNvK}<*`-e^Wq<>nqWb5R$k>>#cx=4J1TG+xlChm|)3Y~i#@j{875F9_IfOj<{Ys4R2Y z=HJNBu|g0~%@#InXQ{haf&xX~5;W)7I$?{q8WLw*5I9-TJ~>=)1xFvpb(7+Xv`JO3 zfWXE1pyI1JmLvhh9nz$A2mwa~mC%MHc{akD2Xprm#?G}VG{&TNSKn}m;;g;xHT@2T) z>P0d%XdzUg&EU?Bsh9zIYu~6(73{NQ3+4ALtSscz%Ox2fO&q+lLauJ@=9rK2wAdB+ zNH>;}Nat3^g2nk|xfWjW=wL{yI$HaP<~Q7tkkv@#d>a|#MZlPC1B^U2w;P3f!+CRV zxI#OM-6ZPap|dWX2(P+y5z(q)kAnrp4))eLR}sz7nO|yhww17viiInQ>%?rvTSkpj zC&l-DcszDfC9UH<@@8TMS)wBr5rt*&AuAtk7^BdOi6@VF!PRQ$}z;^$`Z+df#W@HdBO2JID4bsvptQo{Pz1d@ObyDWtn@rwT_b@6q%1_(XfWAdu zp1P<@W!HOpJx=qLR=B0EHWp#zOa%2(YlU<%qP^H>GAtt}qRci5nGe^6xfghnNrWsa z$P5i{zXLU!WBVw3$-Dh?TM?C}Am)d9tw~jE?u9SCkm^C$$dc49b42-q(?9j8z^@GY zS)iabA_vZiHXv!q#cj`J;o{Z;J!oH!)XcL7x&=|{UxwfXu>|389o(y1?nMhM^zEd z>}7&1k}tV1wdddKL@)XS>{4E5#PEltc)vlVe8<+2#Fq|l?8q%Ebo6zEtX0MxWA`*5Zp=(0TR{Ie4{_EtNQ9@Gocd1^UzNc zae<4fFo-ZF+^a}e~sG+or!*3&ef72zYUzG{BcYzYviYSYEYks0Cisne!5O+CG7`dQ($X*13^yJ_kf zQ>T)!=^A8(rgWTc>N!pNcV;+!`i#@3o;vj$(p^DyP4f{FJ;cZ4SI*BZ$t~|&QV1`< z?%G-Nt_shcHRsIvO_yIg@4{S9ZgHWhGv7O<*gfTzuJg&;+1AHq-=_J*m}i8a&atzM z_tnC4+d7LK`6gznl}ZyXv^!JUTt2<1S?Tq(DN~P_?L>K#A`>$#_;nibx&oW~HE&t4 zInS0jE9q1;a<6HQf4zD}c=n<~?-5tG^X6xJ(hrNQS*1J9QRUoQ==EDbzimwQKjX}hsBxUn?wSZQEK zX>fO`e`w^Xp~H_oN*1PjeBKw91~*ueReG7ba$z1(seg}Y-BSPVk(VAW^{*e^w6gr% zgQfnbO8xxZ$@Agop0M-vrT&4^z?xG3o2C9OrGfiPD+WsaTs~47SWU)5JNrjo*k0an z4-GlIX>EDeTFO+<`pHf?cg7imM9r+M{CZXUGIr6xM9q7wS{mr;^ev4mJiLjPJ`|^S zPT||BpB`6w&zs*geyG%cpwz$a;2Q@<9)M^x2nvvBb6jhA=ac0(?uQf*r@We{YIGGb z-&SJx^0>V_ZdGm5D7sh3hd1smuh>De*16#IUbm^#53jB(^>4dw-rUcY23MB`9pl3EZ!1~>vHh!(%^PazkwG^gOAv3A(tyU&1HuUyis05YF}--nmvvc5}dg?u$mt%4Kf*N z4t;yMG`LICQ1w4k8hkLmGb6B|6V%%^@*+JwP~NbrG{6MeLfVlBwhgb^pr)sq=w?&x zEP!GnaCzUO!z;uX5mWm6j#+Ig)$okV!+4hl?hEx2JPl&XQ4_O{LU$e9&m`Q)d7x?U z#!cjf)b#VUYVqM4zPr3*-|$9C;UA35-)-b~GKo=P=vRqI{cAPxGw$yb=dBuQUT|r!QcgYAc&EjRdapzz%@~!@8X2UbplIaOoBiTVag#m; zP#R>+Q7Z_)U5B1|t~7u^h(u#;A?{88@#e2b8N|Y&op9d{;}g_GRN?UY4F}(3o`|iC zE178fjh4f$0wiBef96CWyFuFcz)@}~u9ZWk*#2VRiXL-w4$~&-lhT=@J2hD*PHHAxF zUOzB$*Dl7(eOW^7Fyk_23ty^~W>QEZ-Vv&4BPdxS1sQ+Av(Ouk(^SgpO=R7>(lNRQ z;7$9BB_uMMAHZL4XK<5AhK`}wdrPuF(EF3mba7WnQm7TdjFj4 zI_`xCDwE#sKXB+xY$~X^+u8M#vf5i|T6yKpkqwO7eVF~F{(CEw78z7mX7;FCn~hG; zkADag)bxQ-iZYW)CKYYl!-y*P$l7NQt;A3qa%NKCqiUsry_#N5p7-zm>Fcy?$HCX0 zJh-1p>O2f=G-}06S*L+xbi^kyXJe|5WjH}j_r;CF+wU6Lg8hEq@Vb?<06ot{JQq{K z+tTK~mfxf{s)aSyjy$)zy#D1wPd&t6S~vVG&Js?+Y7^N{%879-h9C7z|Hz#$F`o{; zdUsR}>PNJg5mrofCSeuNWtL`hG%j2%F_RwS8y$!Vhcv`JK}znWV|(hP51;bwuQfsMCCxnc*^r_AgJB2feBJ{p2ds3Ac`1V1%A_RgP8wEOH zm68;RFqW}W+gIEK1}rlBusUfnWyw&%6diu(%br;hpJL%rMkveKLG;Uing#ZkLLS}> zD_P41(Xg+(Fo$d|;y5newwq-}Hi~2>OvYbiQ#cvA_VB~_4K;-(VtQkw)hqup(?=~Z z>JY>0S{}rvUTx(vS1d-UuHh#zc^DTA3JVuiVm=~CX6tKRxUn-iv&pn?H8E0zO9nEB zh6nE|Z{J7f%j-9l-=v*&o20Iw`Dr94!2&$j2JHXGwdMrbcdi zz50l^9C{3)Fr>(fa{^?6F{vaFZ1e(`rusI~E^m=~lXZO-AEy1-s>WHMHVzcjYvQk$ zDIEj0&>W_%xxrP#?t2kg?d6r|jt8sK_!wg)0%1WZB|up)~$-E6Vg>sU!;Bs;Sm zUuFG+2M;`!MNTtenJut{MdHMZN;_tANw|8=;ms(pdSouI=i!~D%;}imzws86Ak{eP z-t#8w4(8}HXVzAY_*hjYlcys?_4<17jjh8^K4(inxGOqBodio46N6H>b;D^appHXV@*3^|&vUZ;{Aba+MoxH-tBt!l$hUw>E=JbE!D zlF5i=TvR+7mUrYGM}AtpHl?Tk@Y=`9ufOQ5W-=QaBk|F}_3~rcVviH$8{V{c_`xSd z>lHYf-otWF6^DpJPA<*(%3i%Cj1>oR% zH#s4#!!+ZptLTn|p%gJ`WV9rv03$uJ=B44g)=S)Ru5 zh0@@*ks;ij{bT8|RIh1yI*OPjn=yS4?OcE8v8OQ8{mPA*9k4iIF}FycF|2w`x1uN~ znPR9Z3Q}vu72YODDYxHz0`CEgvoSFD;r^#BoSe}NtM}k*PYiE4;G>4C9*o0Jp@LWy zWnKyY)+;DQz5d<9TL??tqwrO%)~anrTNidxK*|9nj*FF*F*YMA_JZQMvXu$cvkWcK zlH{X`w!pA=tMeA(6#L4RA8}}y0s|?PgRdS%-^HpwAZb;Q>VCzlO%-dkxFJUs zDP|_4+J)2DZ2%V$b$J*)7b$W#Z;?89h+A!0Kf65FF}I|gRV;Pxj12Yc5{$*(Ndb)i zLnXyk@3qN;J?FYcuoa_wyR{Im9g3Qm{E043lJ$ zs3(XDCs!Gw%$e`M0H#>9?TfI1is(_1YlP(o@zI#q_{F=78W|Dy#Miv)R9Ec-RSHQ} zTvfri%FXD$ceIj~un%9~EvxRYk4i9W9fKiS(ocK<3alw)%)D_otPuYnjzI6KHXH9`S$>EKZ#~8nqT*ND z&b9>CS5I5!e=eDO%e;KXx3t>8U=`05OQqS%|1pIFuWz)#mYVn3awGnLTK&eo%>w-=*8aoF zi$20OW`RV{Ues7hO(O+sW}r5w@Y-hledzix<0l7KdLO##%uePqe26SxRp+yB@OpTI`_db7il$U80#mSy zqGOf%@N}%75r+_z`GHx13yxv`{0ts4ZR7&G7_jzOs4sjUE-gG`YY+jrPT!2v^F#z* zhHVf{LvyJs#ZM?PN zsVq`B5=F*@+bB&NqP^JSD=otN1$#CRYQ8(own~;@jfKB$l3!CLVV&aMX@38`J2mFl zYk>a_-Y5n59YAvEJpZsK{LW~9dPEMocyK@5f>oGgJ2v_zBQYojKXxgy28r@2Q_tpY z_H0h&_ByPxdB8H(CP`FMnNyBAFmTP^sM9`IL)va0vl7i=7e*UmC2n{hODxuzHSwO{wi~++9lO4 zE)y9V70*M)1T`C=S+*G7iq(qVNUhzu-ZDgWHlsM6sxB@udD6vclVE!EBZ>9)DnN-; z<^n~qS;NqiRMR5U((qmc3pA9>xi9Ft_V7M zFJRkxrPGmQ{&&>UjI!c(h0zW?I#1M_kS`8Kr1QLFsP6d?Oc590(wt_i_Lv9{mxvP+ zJWdRQ#gZvf#;^r^9@G3*Jo;_a3IDN&E`GVesb|q#d?|53iP$EN)fEe@G_cYsY@<4S znQU)XPScO|Gbe{CDYQn9E&D)hC&$GYZ9KjDKtO*L%wAUEbbCbowY0WEUZw{H)QInw(4U(FwHFYq} z+5EXX@_VqEYTnkX)^9a>kob3bzd{^opF3N9C2Ug)7TXbcvzs;d+QLtwxQ9p*if`Tl3MI7Pzr}@@JN~4khE$;;aFWt^g&%9wkvHG z?S;iAE$_vqi0bm@g?*OPW>Vdn>4w)0S{>UH1<;XBaRb%WTB0CD_U(j4XJ< zkSw;I#_FOg&JAVlm^stby`$%5kwuTIHecJ&?!hf#btc-8U8VQyk^*a})~13eWVmzq z{(EpAjFkAX{sQ{~ONZqx3@j!aG^+|uxX7o)Y%JQzoZk+SQ<1?@Vk{8d$VwZA!qit# zHPVr#$}B`m(GV7O>%nEHbBL%PAY6Ci{SOSpKG zYizEV&Kqk7%vi7T)_Eg3tdxrzyV|}hU^6{sy?QG>6&ds|UU;e@zQ!8Uq~h{&f*GuA z%oI##r%5aRCDBc{G)e!Fq^Z!S$fOsnc52_m4g$>57h_~dC*}Qd*}dYWl=aObP$~#3 zk0?qiZIz-yb>>P$RN1PNCO$wL(t$Ciz_nw2qSiILwwkO+xJC(+Vyp3)?Q)e$uY^a& zXbYxF-F=?=tv8Bhjq!fUIEyqhNyANg=Z2c8!EJj> zLQ*__OO08MB#pi$Q8zvoH867|W1~A=SlzFbL>|VT==;8!Wj-*1_8J;_@g?}wJ0A1{ z=~opOO3Hb-YsV(1p(5WiZ58N~!Wz{0t+j!*k@@NyoLuOkx@^~+PXSA=7{B46ZjZ`f zvMKyxuNtvH#l)w2_Z@HwU&YdlgPNU6AQDWd!EdAx}d^R!y{yL||nS@l0BQd5k74p5eJ?!?}Hh{ z-Vi>-f&zDgrucQ$)b=~YQ^HL~R?K$Uy9|vrBEc3(Oh4};Z^iA|lyr2fxb8Lm$T5bN zIDpj~I0;>_F?|hQ@9=}f@YYue9#}n!2J9}c+IzVF0h5vVW0I8Vue7ATRc*sctl1nq zEN9JNSTePB$?e6l7f3d{UB1b7TTB?Hetmp2^U0SOAbANlVE~OqsfvWli%yw>+{YtD zj_j2H&!v8eJtE;JS-U% zfe(Qaz+MO!V45Up$n<#A_6}+_49?~~7{-{&@j78AGHXJId}SO#90C z;dseqvpzoVK7yY0W%5zJ>lPXOW7$!|k34qpHGO;xN)B&&CE5+U2e(0?@2a;r#ta_V z5}Nb#QNf5Ao%=6)XfF=0;BA0n)oRDgW~KxCLw223-Wz|{G5Tr=lj1Rk1NShs)j?lA zhq?={(4Rj2;p68v)CaKFZS)gE9ewSb&ia?V%mwtjLo{`=eFWqe(NbFyk%;6RHOSwM z-qw=ljP$1`Cpts68;N+f`{1jzz3w+d5-!|k{BytK%q9ggjnC8VvdOdx_c&okI(APi zU}SDHj|Gf3L}@<4i)O9z^X2Uo;J&&JuczivbtTA#$jNhZQa&u=z^Ru5@psx8DEFFz zHO@<;jQwH}ZEd;6DUeO&etq}Kr2ZN+6QJ{u4~CE8k0gtb-dW)kM^wZLxCPI1t?3#) zHBDgpYrubTbXl_{K{Ul52BCRSE(H4=*YG$BU>mjE%beaKQgX@ zs_R&+k2YMw~ydovHyvi1V!y8|=nO_rwiix4m>&GP0SN7?<>1H%^ypxcL zglSDj)lFLuHJut4Qhwv{^6Tp>JQT4-WZR_&%!;q#1y2+Ip_^oSGZM`}g`>$Osi8*5D$%17^d0gWOjB$hc>#^b(kH4QNSx2-Uy1iyE~ab zJ$TkS_c?zUS`%8|d#Z>M?`bfTzWmhi{%2{6M4kTv$TLw4r)D^lC6+g^Sc4ryc#YR6 z5Q+a06^y*H7cqM10G=ocbJ!+KZRoW#{#-H(Clw9I5IghR*%g@oV}ESf zNg1p{9Hzu#fLm0Qh`_HRw(MRu`E@-5C%~cw^{R1V(mtFVh_KQ9#}8q7#oGGac6PNh z*~Tb-0|MotNQOF2Fmu9rVu=BUvi2C!!q?`?_pCA3li)~YJW~uMJ!KJ?Fy1;~#;!u# z)ECr^zQh@;e3~p3Z7s@Brm?Q_W-H!?d<4Jyg6d(ts2(c=J!^t9&UomVdk*Opbe@t} zb10hMNeOHUn*Z%avnf)Kja{m7Z D2;wG2 literal 0 HcmV?d00001 diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..62325a9 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,2169 @@ +# Japanese translation of glib. +# Copyright (C) 2001-2009 Free Software Foundation, Inc. +# Takayuki KUSANO , 2001-2002, 2009. +# KAMAGASAKO Masatoshi , 2003. +# Takeshi AIHANA , 2004-2009. +# Ryoichi INAGAKI , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-05 22:30+0900\n" +"Last-Translator: Takayuki KUSANO \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' は '%s' という要素に対して想定外の属性です" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' という属性は '%s' という要素にはありません" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s' は想定外のタグです (想定していたタグは '%s')" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s' は '%s' の中では想定外のタグです" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "データ・ディレクトリの中に妥当なブックマーク・ファイルはありません" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' という URI のブックマークが既に存在しています" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' という URI のブックマークが見つかりませんでした" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' という URI のブックマークには MIME 型が定義されていません" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"'%s' という URI のブックマークにはプライベートではないフラグが定義されていま" +"す" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' という URI のブックマークにはグループがありません" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "アプリケーションの '%s' は '%s' というブックマークを登録していません" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "コマンドラインの '%s' を '%s' という URI に展開できませんでした" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' から '%s' という文字集合への変換はサポートしていません" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' から '%s' への変換処理を開けませんでした" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "変換する入力に無効なバイトの並びがあります" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "変換中にエラー: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "入力の最後に不完全な文字シーケンスがあります" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "フォールバック '%s' を '%s' という文字集合に変換できません" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "'%s' は \"file\" スキームの絶対 URI ではありません" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "'#' を含んだ '%s' はローカル・ファイルの URI としては正しくありません" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' という URI は正しくありません" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI に含まれる '%s' というホスト名は間違っています" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' という URI に無効なエスケープ文字が含まれています" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' は絶対パスではありません" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "無効なホスト名です" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' を開く時にエラー: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu バイトを確保できませんでした (ファイル \"%s\" の読み込みに必要)" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' の読み出し中にエラー: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "'%s' のサイズが大きすぎます" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' が読めません: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' を開けません: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' の属性の取得できません: fstat() に失敗しました: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' を開けません: fdopen() に失敗しました: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"'%s' から '%s' にファイル名を変更できません: g_rename() に失敗しました: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' というファイルを生成できませんでした: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' を書き込みモードで開けませんでした: fdopen() に失敗しました: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' への書き込みに失敗しました: fwrite() に失敗しました: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' への書き込みに失敗しました: fflush() に失敗しました: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' への書き込みに失敗しました: fsync() に失敗しました: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' をクローズできません: fclose() に失敗しました: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"'%s' という既存のファイルを削除できませんでした: g_unlink() に失敗しました: %" +"s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' というテンプレートは間違っています ('%s' を含めないこと)" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' というテンプレートに XXXXXX が含まれていません" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u バイト" +msgstr[1] "%u バイト" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "シンボリック・リンク '%s' の読み込みが失敗: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "シンボリック・リンクはサポートしていません" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' から '%s' へ変換するコンバータを開けませんでした: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string では raw モードで読めません" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "変換されていないデータが読みこみバッファに残っています" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "チャンネルが不完全な文字で終わっています" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end では raw モードで読めません" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ファイル '%s' を開けません: open() が失敗: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ファイル '%s' のマップに失敗しました: mmap() が失敗: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d 行の %d 文字目でエラー:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "名前はUTF-8として正しくない文字列です - '%s' は妥当ではありません" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' は妥当な名前ではありません" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' は妥当な名前ではありません: '%c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d 行目でエラー: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' をパースできません。文字参照には数字が含まれなくてはなりません (例: " +"ê) おそらく数字が大きすぎます" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"文字参照がセミコロンで終わっていません。エンティティのつもりもないのにアンパ" +"サンド文字を使っているのかもしれません。アンパサンドは & とエスケープして" +"ください" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "文字参照 '%-.*s' が使用可能な文字をエンコードしていません" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"空のエンティティ '&;' があります; 正しいエンティティは: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "エンティティ名 '%-.*s' というのは不明です" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"エンティティがセミコロンで終わってません。エンティティでもないのにアンパサン" +"ドを使ったのではないでしょうか。アンパサンドは & のようにエスケープしてく" +"ださい" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ドキュメントは要素 (例 ) で始まってなくてはなりません" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' は '<' に続く文字としては正しくありません。おそらく要素名の開始になって" +"いません" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"おかしな文字 '%s' があります。空の要素のタグ '%s' の最後は '>' でなくてはなり" +"ません" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "おかしな文字 '%s' です。属性名'%s' (要素 '%s') の後には '=' が必要です" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"おかしな文字 '%s' です。要素 '%s' の開始タグの末尾は '>' または '/' でなくて" +"はなりません。あるいは属性になります。おかしな文字を属性名に使ったのかもしれ" +"ません" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"おかしな文字 '%s' です。属性 '%s' (要素 '%s') の値を設定するには等号記号の後" +"は引用記号で始まってなくてはなりません" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' は閉じ要素名 '%s' に続く文字としては正しくありあません。'>' のみが使用で" +"きます" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "要素 '%s' は閉じています。要素は何も開かれてません" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "要素'%s' が閉ました。しかし現在開いている要素は '%s' です" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ドキュメントが空か、空白だけが含まれています" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ドキュメントが開きカギカッコ '<' の直後で終了しています" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ドキュメントが突然終了しています。要素が開きっぱなしです。最後に開いた要素は " +"'%s' です。" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ドキュメントはタグ <%s/> で終了しているものと想定していましたが、突然終了して" +"います。" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "要素名の途中でドキュメントが突然終了しています" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "属性名の途中でドキュメントが突然終了しています" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "要素の開始タグの途中でドキュメントが突然終了しています" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"属性名の後にある等号記号の次でドキュメントが突然終了しています: 属性値があり" +"ません" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ドキュメントが属性値の途中で突然終了しています" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ドキュメントが要素 '%s' の閉じタグの途中で突然終了しています" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"ドキュメントがコメントあるいはプロセシング指示子の途中で突然終了しています" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "不正なオブジェクト" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "内部エラーまたは不正なオブジェクト" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "メモリが足りません" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "バックトラック処理の上限に達しました" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "パターンに含まれているアイテムは部分マッチングをサポートしていません" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "内部エラー" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "条件の後方参照は部分マッチングをサポートしていません" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "再帰の上限に達しました" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "空の部分文字列に対する作業領域の上限に達しました" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "改行フラグの連携が間違っています" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "原因不明のエラー" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "パタンの終端に \\ があります" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "パタンの終端に \\c があります" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "認識できない文字の後ろに \\ があります" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"ここに大/小文字の変換を行うエスケープ (\\l、\\L、\\u、\\U) を挿入できません" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "量指定子 '{}' の中にある数値の順番が間違っています" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "量指定子 '{}' の中にある数値が大きすぎます" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "文字クラスを表す終端文字 '] ' がありません" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "文字クラスの中に無効なエスケープ・シーケンスがあります" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "文字クラスで文字の順番が間違っています" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "繰り返すものがありません" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "'(?' の後ろに認識できない文字があります" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "'(?<' の後ろに認識できない文字があります" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P の後ろに認識できない文字があります" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX の名前付きクラスはクラスの内部でのみ利用できます" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "終端文字の ')' がありません" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "開始文字 '(' が無い終端文字 ')'" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R または (?[+-]数値 が続く必要あり )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "存在しないサブパタンへの参照です" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "コメントの後ろに ')' がありません" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "正規表現が長すぎます" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "メモリの確保に失敗しました" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "後読み (lookbehind assertion) が固定長ではありません" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "'(?(' の後ろに不正な形式の数値または名前があります" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "条件グループに二つ以上のブランチがあります" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "不明な POSIX のクラス名" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX では照合順序の要素はサポートしていません" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} の中にある文字値が大きすぎます" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "条件の '(?(0)' が間違っています" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "後読みのアサーションでは \\C を指定できません" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "繰り返しの呼び出しが無限ループになっています" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "サブパタンの名前に終端文字がありません" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "二つある名前付きサブパタンが同じ名前です" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "不正な \\P または \\p のシーケンスです" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P または \\p の後ろにあるプロパティ名が不明です" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "サブパタンの名前が長すぎます (32 文字以下にして下さい)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "名前付きサブパタンが多すぎます (10,000 個以下にして下さい)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "8進数値が \\377 よりも大きいです" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE グループに1つ以上のブランチが含まれています" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE グループは繰り返せません" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "NEWLINE オプションに矛盾があります" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"ブレース名の後ろに \\g が存在していないか、または0以外の数値でブレースしてい" +"ます" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "想定外の繰り返しです" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "コードがオーバーフローしました" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "正規表現をコンパイルする領域で上限を超えました" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "直前にチェックしたサブパタンのリファレンスが見つかりませんでした" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "正規表現 %s でマッチングしている際にエラー: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "お使いの PCRE ライブラリは UTF-8 をサポートしていません" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "お使いの PCRE library は UTF-8 のプロパティをサポートしていません" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "正規表現 %s をコンパイルする際にエラー (%d 文字目): %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "正規表現 %s を最適化する際にエラー: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "16進数の数値または '}' を想定していました" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "16進数の数値を想定していました" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "シンボル参照の中に '<' がありません" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "中途半端なシンボル参照です" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "サイズが0のシンボル参照です" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "数値を想定していました" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "シンボル参照が間違っています" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "最後の '\\' に対応するシンボルがありません" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "不明なエスケープ・シーケンスです" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "代替文字列 \"%s\" の %lu 文字目を解析する際にエラー: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "引用テキストが引用記号で始まっていません" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"コマンドライン、あるいはシェルの引用テキストにおいて引用記号の対応が取れてい" +"ません" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "テキストが '\\' 文字の直後で終了しています (テキストは '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c に対応する引用記号の前でテキストが終了しています (テキストは '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "テキストが空です (あるいは空白のみ)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "子プロセスからデータを取得できませんでした" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "子プロセスとの通信用のパイプを作成できませんでした (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "子のパイプからデータを取得できませんでした (%s) " + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' というディレクトリへ移動できませんでした (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "%s を子プロセスとして起動できませんでした" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "プログラム名が無効です: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d の引数ベクタに不正な文字列があります: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "環境変数に不正な文字列があります: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "作業ディレクトリが不正です: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ヘルパー・プログラム (%s) の起動が失敗しました" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"g_io_channel_win32_poll() が子プロセスからデータを読み出す際に想定外のエラー" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "子プロセスからデータを読めません (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "子プロセスからデータを読み出す際に select() で想定外のエラー (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() で想定外のエラー (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork 失敗 (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "%s を子プロセスとして起動できませんでした: %s" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "子プロセスの出力または入力をリダイレクトできません (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "子プロセスを fork できません (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "子プロセスの実行時に不明なエラー \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "子プロセスのパイプから十分なデータを取得できません (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 の範囲外の文字です" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "変換する入力で無効なシーケンスがあります" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 の範囲外の文字です" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "用法:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[オプション...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "ヘルプのオプション:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "ヘルプのオプションを表示する" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "ヘルプのオプションを全て表示する" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "アプリケーションのオプション:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s の整数値 '%1$s' を解析できません" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s の整数値 '%1$s' は範囲外の値です" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s の実数値 '%1$s' を解析できません" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s の実数値 '%1$s' は範囲外の値です" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "オプション %s の解析中にエラー" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s の引数がありません" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "%s は不明なオプションです" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "検索ディレクトリには妥当なキー・ファイルがありませんでした" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "通常のファイルではありません" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ファイルが空です" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"キー・ファイルの行 '%s' がキー/値のペア、グループ、またはコメントではありませ" +"ん" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "グループ名が無効です: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "キー・ファイルがグループで始まっていません" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "キーの名前が無効です: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "キー・ファイルにサポートしてないエンコーディング '%s' があります" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "キー・ファイルにグループ '%s' がありません" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "キー・ファイルにキー '%s' がありません" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "キー・ファイルのキー '%s' の値 '%s' が UTF-8 ではありません" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "キー・ファイルのキー '%s' の値を解釈できませんでした" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "キー・ファイルに解釈できない値を持つキー '%s' が含まれています。" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"キー・ファイルのグループ '%2$s' にあるキー '%1$s' の値を解釈できませんでした" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "キー・ファイルにはグループ '%2$s' のキー '%1$s' がありません" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "キー・ファイルの行末にエスケープ文字が含まれています" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "キー・ファイルに無効なエスケープ・シーケンス '%s' が含まれています" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "値 '%s' を数値として解釈できません" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整数値 '%s' は範囲外の値です" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "値 '%s' を実数値として解釈できません" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "値 '%s' を論理値として解釈できません" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s に引き渡した値が大きすぎます" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "既にストリームは閉じています" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "操作がキャンセルされました" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "無効なソケットです。初期化されていません" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "変換する入力に無効なバイトの並びがあります" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "ソケット・アドレスを作成するために充分な空きがありません" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "キャンセル可能な初期化はサポートされていません" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "不明な種類" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s (ファイルの種類)" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s (種類)" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "想定していたよりも早くストリームの最後に到達しました" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "名前なし" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "デスクトップ・ファイルで Exec 項目を指定してませんでした" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "アプリケーションで必要な端末が見つかりませんでした" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ユーザのアプリケーション設定フォルダ %s を生成できません: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ユーザの MIME 型設定フォルダ %s を生成できません: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ユーザのデスクトップ・ファイル %s を生成できません" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s に対する独自の設定" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ドライブ側で取り出しの操作を実装していません" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"ドライブは「取り出し」あるいは「アンマウント操作での取り出し」を実装していま" +"せん" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ドライブ側でポーリングによるメディアの検出を実装していません" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ドライブは「開始」を実装していません。" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ドライブは「停止」を実装していません" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "バージョン %d の GEmblem のエンコーディングはサポートしていません" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem のエンコーディングにあるトークンの数 (%d) が間違っています" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" +"バージョン %d の GEmblemedIcon のエンコーディングはサポートしていません" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" +"GEmblemedIcon のエンコーディングにあるトークンの数 (%d) が間違っています" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon に対する GEmblem を想定していました" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "サポートしていない操作です" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "マウントを含んでいるものはありません" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ディレクトリ全体をコピーできません" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ディレクトリからディレクトリへコピーできません" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "対象となるファイルが存在しています" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ディレクトリを再帰的にコピーできません" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "シンボリック・リンクはサポートしていません" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ファイルをオープンする際にエラー: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "特別なファイルはコピーできません" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "指定したシンボリックリンクは間違っています" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ゴミ箱はサポートしていません" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ファイル名に '%c' を含めることはできません" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ボリュームはマウントを実装していません" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "このファイルを扱うアプリケーションが登録されていません" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator は閉じています" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ファイルの Enumerator は既に閉じています" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "バージョン %d の GFileIcon のエンコーディングはサポートしていません" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon の入力データが間違っています" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "ストリームは query_info をサポートしていません" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "ストリーム上のシークはサポートしていません" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "入力ストリームを切りつめることはできません" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "ストリーム上での切りつめはサポートしていません" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "トークンの数 (%d) が間違っています" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "%s というクラス名の型がありません" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s という型は GIcon のインタフェースを実装していません" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s という型がクラスになっていません" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "バージョン番号が間違っています: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" +"%s という型は GIcon のインタフェースで tokens() を使って実装していません" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "提供したバージョンの Icon のエンコーディングはサポートしていません" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "入力ストリームで読み込みを実装していません" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "ソケット・アドレスを作成するために充分な空きがありません" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "サポートしていないソケット・アドレスです" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"ローカル・ディレクトリを監視するデフォルト・モニタの種類が見つかりません" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ファイル名が無効です: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ファイルシステムの情報を取得する際にエラー: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ルート・ディレクトリの名前は変更できません" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ファイル名を変更する際にエラー: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ファイル名を変更できません (既に存在しているため)" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "無効なファイル名です" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ファイルをオープンする際にエラー: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ディレクトリをオープンできません" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ファイルを削除する際にエラー: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ファイルをゴミ箱へ移動する際にエラー: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ゴミ箱のディレクトリ (%s) の生成に失敗しました: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ゴミ箱のトップレベルなディレクトリが見つかりません" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ゴミ箱ディレクトリが存在しないか生成できません" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ゴミ箱の情報ファイルを生成できません: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ファイルをゴミ箱へ移動できません: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ディレクトリを生成する際にエラー: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "シンボリック・リンク '%s' の読み込みが失敗: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "シンボリック・リンクを生成する際にエラー: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ファイルを移動する際にエラー: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ディレクトリからディレクトリへ移動できません" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "バックアップ・ファイルの生成に失敗しました" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "対象となるファイルを削除する際にエラー: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "マウント間の移動はサポートしていません" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "属性値を NULL にしないで下さい" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "属性の種類が無効です (文字列を想定していた)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "拡張属性の名前が無効です" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' という拡張属性をセットする際にエラー: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' というファイルの状態を取得する際にエラー: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (無効なエンコーディング)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ファイル・ディスクリプタの状態を取得する際にエラー: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "属性の種類が無効です (uint32 型を想定していた)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "属性の種類が無効です (uint64 型を想定していた)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "属性の種類が無効です (バイト型の文字列を想定していた)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "シンボリックリンクにはアクセス権をセットできません" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "アクセス権をセットする際にエラー: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "所有者をセットする際にエラー: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "シンボリックリンクを NULL にしないで下さい" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "シンボリックリンクをセットする際にエラー: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "シンボリックリンクの指定でエラー: ファイルがリンクではない" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "最終更新日時、あるい最終アクセス日時をセットする際にエラー: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux のコンテキストを NULL にしないで下さい" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux のコンテキストを指定する際にエラー: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "このシステムでは SELinux が有効になっていません" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s という属性値はセットできません" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ファイルから読み込む際にエラー: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ファイルでシークする際にエラー: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ファイルを閉じる際にエラー: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "ローカル・ファイルを監視するデフォルト・モニタの種類が見つかりません" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ファイルに書き込む際ににエラー: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "古いバックアップのリンクを削除する際にエラー: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "バックアップのコピーを生成する際にエラー: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "作業用のファイル名を変更する際にエラー: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ファイルを切りつめる際にエラー: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' というファイルをオープンする際にエラー: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "対象となるファイルはディレクトリです" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "対象となるファイルは通常のファイルではありません" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ファイルが外部で変更されました" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "古いファイルを削除する際にエラー: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "不正な GSeekType が指定されました" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "無効なシークの要求です" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream を切りつめることはできません" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "メモリ出力ストリームの大きさは変更できません" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "メモリ出力ストリームの大きさを変更できませんでした" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount はアンマウントを実装していません" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount は取り出しを実装していません" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"mount は「アンマウント」あるいは「アンマウント操作による取り出し」を実装して" +"いません" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"mount は「取り出し」あるいは「アンマウント操作による取り出し」を実装していま" +"せん" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount は再マウントを実装していません" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount にはメディアの種類を推測するような実装はありません" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount には同期させてメディアの種類を推測するような実装はありません" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ホスト名 '%s' に '[' が含まれていますが ']' がありません" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "出力ストリームは書き込みを実装していません" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "ソース・ストリームは既に閉じています" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' の解決中にエラー: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' の逆引き中にエラー: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' に対応するサービスレコードがありません" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "一時的に '%s' を解決することができません" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' の解決時にエラー" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "無効なソケットです。初期化されていません" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "無効なソケットです。初期化に失敗しました: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "ソースは既に閉じられています" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ファイルディスクリプタ GSocket を作成: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ソケットを作成できません: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "不明なプロトコルが指定されました" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ローカルのアドレスを取得できませんでした: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "リモートのアドレスを取得できませんでした: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "listen できませんでした: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "アドレスに bind 時にエラー: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接続を accept する時にエラー: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "接続エラー: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "接続中" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "接続中にエラー: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "エラーをペンディングできません: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "データの受信時にエラー: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "データの送信時にエラー: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "ソケットを閉じる際にエラー: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ソケットの指定された状態を wait: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "メッセージを送信中にエラー: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage は Windows ではサポートされていません" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "メッセージを受信中にエラー: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "接続時に原因不明のエラー" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "受信を待つ Listener は既に閉じています" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "追加されたソケットは閉じています" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "バージョン %d の GThemedIcon のエンコーディングはサポートしていません" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "コントロールメッセージを一つ待ち受けていましたが、%d 受信しました" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "想定してない種類の補助データです" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ファイルディスクリプタを一つ待ち受けていましたが、%d 受信しました\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "無効なファイルディスクリプタを受けとりました" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix から読み込む際にエラー: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix を閉じる際にエラー: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ファイルシステムのルート" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "UNIXストリームに書き込む際にエラー: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"抽象化されたUNIXドメインソケットのアドレスはこのシステムではサポートされてい" +"ません" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ボリュームは「取り出し」を実装していません" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"ボリュームは「取り出し」あるいは「アンマウント操作での取り出し」を実装してい" +"ません" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "アプリケーションが見つかりません" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "アプリケーションを起動する際にエラー: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI はサポートしていません" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 で組み合わせの変更はサポートしていません" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 で組み合わせの生成はサポートしていません" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "メモリが足りません" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "内部エラー" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "無効なホスト名です" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "変換する入力で無効なシーケンスがあります" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "データ配列の上限に到達しました" + +#~ msgid "do not hide entries" +#~ msgstr "エントリを隠さない" + +#~ msgid "use a long listing format" +#~ msgstr "長い形式で一覧表示する" + +#~ msgid "[FILE...]" +#~ msgstr "[ファイル...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "文字 '%s' はエンティティ名の最初には使えません。文字 & はエンティティの開" +#~ "始を表わします。もしアンパサンドがエンティティでなければ、& のようにエ" +#~ "スケープしてください" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "文字 '%s' はエンティティ名として使えません" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "空の文字参照です。dž のように数字がなくてはなりません" + +#~ msgid "Unfinished entity reference" +#~ msgstr "中途半端な実体参照です" + +#~ msgid "Unfinished character reference" +#~ msgstr "中途半端な文字参照です" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "UTF-8 として正しくない文字列です (シーケンスが長すぎます)" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "UTF-8 として正しくない文字列です (文字で始まっていません)" + +#~ msgid "file" +#~ msgstr "ファイル" + +#~ msgid "The file containing the icon" +#~ msgstr "アイコンの情報を格納したファイルです" + +#~ msgid "name" +#~ msgstr "名前" + +#~ msgid "The name of the icon" +#~ msgstr "アイコンの名前です" + +#~ msgid "names" +#~ msgstr "名前の集合" + +#~ msgid "An array containing the icon names" +#~ msgstr "アイコンの名前を格納した配列です" + +#~ msgid "use default fallbacks" +#~ msgstr "デフォルトのフォールバックを使用する" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "'-' という代替え文字で名前を省略するデフォルトのフォールバックを使用するか" +#~ "どうかです (複数の名前を指定すると一番最初の名前より後ろの名前を全て無視し" +#~ "ます)" + +#~ msgid "File descriptor" +#~ msgstr "ファイル・ディスクリプタ" + +#~ msgid "The file descriptor to read from" +#~ msgstr "読み込むファイルのファイル・ディスクリプタです" + +#~ msgid "Close file descriptor" +#~ msgstr "ファイル・ディスクリプタを閉じるかどうか" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "ストリームが閉じたらファイル・ディスクリプタを閉じるかどうかです" + +#~ msgid "The file descriptor to write to" +#~ msgstr "書き込むファイルのファイル・ディスクリプタです" diff --git a/po/ka.gmo b/po/ka.gmo new file mode 100644 index 0000000000000000000000000000000000000000..90905ff2e3a0f1cfc1c8a46c141074bf02242912 GIT binary patch literal 32223 zcmd^|3y@sbS?3Rdghi0VIB^miHo2COMoKiJhh&Uy+lt?|?8Mka?wPqW(@{_N zq#qi~SschXB!ov~%eLevqXc%d39Q*-i`uHKT5u{nVv>Te#cqn-Kn+W32^3VZFSfR} zQv3UV-?@+O>F$}4tUwiAzWw#R=bZ2H{~qVjJ@TJi_&rYtUZ3UqVXnQe58+Rtw{7B$ z*YCbDga@Esh8}@l_NEXj&?V?r=r^Hnh5o>sL)Zqr6uKAsKIl&9N1;2QFGIIL{|i*( zUUxwV+o9W`mqPD_CeRM_I_NXdm!MyVPCyrbFoZGauR-4p{j+%g#tU7a{m`3u{t{I3 zzX{y~z2q$+j6-jSiti_(?}fe!72oei`S(L_j`SCxySe{6sPx}{k?Z{c^jhve3cUjQ z8_+}0{{?*ldhOdn_#x=mpbQOv4Nai0dwU4{7cS#X?GsSx^M0u8c@nw{`U>=F=zoVE zfbMul2qVy=Q1v?reJAvbQ0cJ(6@Hgq9Kw%4Z-olq1?VXB87L-(FF`MbejR!>^#4MI z-`-37{s>fle-^57zYcv5^v|K6f?j~q^4IfFJ^v!~a_HYcFN1Dou=w8ul|FOOeb6VN zlJ|R1>HqqF8Ui5{_C|U=RDAD(z6-ht)%a6TpbM`+aeeqYRCs<1ipk;IP}%!-z>q%s zp^`rbr73(0D*t^BD!G3QJq-OmgeX2f2)zdSOVHb({}n1eyAtQ~5R^yZF{to(2`YJC zfhxZL7K)3)B?y(AJ<$EoX(*z?8K~^~O{nbuZ&35o<`4+Ua4S@DKM4I*=og@mLLUN5 z;r5@Pl6wI{<);Hs#bFgnsD)>tKL~vp3bf%BDF1~&;Z1S$-2{Q`+zTCtegrChzYbMC z{5e$mza1qfpgW-!XHfM!36;LDKqddLpm##wMyDH~Gf-3xpN9&kuR`e({u-+OZv`aj zcP&)??}oks`ZQGfy#SS8z6wkn4C;3~RQ(== zs(!Vg^6xVA_rHt$hyEY#KaKK#1N|gM{Q-0lXG#BCF!liS=b$y{SD-%wy_%r;Dd=xO ze*$_NPFaS26?zg{2bA|iU$+-qpg#(|4*DYWKIor9??C<)SAZq=k6#(WPeU)giWq@@ z0Xh%8h+w*&eoN5*!2NF%jL$=#BPc|##Q85n{}B2s(2o(s&p>wp#^<5G1N~!Y6C+-Q z-hOQe{|x$$_j<^<@+pjGIr&=zzr$*>K( zJ_l9*uib?Ypm*QxIQ~bd^nM&A?}c8>+Z1#j`eo?Xpr3+1f7si%;#5)~JPHNE@L8yE z{U-Dw==}X59EZLN1)6Xp!2xvPQ&3b2zYo>(cYeU_n}#ahR-ix??s&l4PeCR38&Kge z_oKuh^qWxm{|kWeo6rXk`ahtT;2i1krVobjF!UKHqQc)n8_+wCcs%|F^yA!L^sxK! zd8qXM7IX=EQ^oas70RP<@ud6bQRoZY{{@r~3m*rhKY)G-dIEf(o@VZYZk=)5o}6{L z58>1g(eEpfUWIcQ5oz z3;o|vpbYPM#N+Yjp@e35%Wu_fY|Ub7hz@d?q{KTecDO5GSX|HiW|MYhig06 z1-juST(Z{(_;3T)_ht{EzrgiQt~2o&ppei_WlHy;v{?hboK%ICa&kXPH_pdH*j6TrPmW>E;= zJD~62s&c)BORsyKSd1y3_4*Mm(k=Wf*H3bNl8dlVNweH}BXl2^UWBpDuWzL|^oNa!7EA$zzi@6@+n&Qe{iVwmgJjwM#T#B2Qxb|?#_u1=yK5XS00^;z z4IPi4m3QUWZf>sQQhvV3^>(gjxl*p5;>uo6#SdfIgGjG}-p2JP*Nt39xU$#V`0!D# zgzJa7ws0+S=|$?X0NTNgt`U+O2Ti!a}V& zRcTin_2kY4k=A&)uH9}{Cp+!bhcsq#>1LYXo@sRI)8U3neWaaCH$b>qSxm$^0nOPX z)y5GVQLm@9BYJqGR;{N;T5zq;u76OwaU^vik~r0FvC6{J$T zUG{um4%4KB51dXGtL-_4w$l0PRHN3YPbBk=Ry(OxkEXTb$?--f>9k--E>z~>->THh zai!5RPH@$yl~!QiY6FF3PrY4jA5TV;v^7;(K*O9vrIl>uZX(=Z4s0pXW}1!p0zEWx z?}=kMr(2zcg+>!28QZD3AqsfnHBGkEI?3d5`Gipxc{5dnF*R&^Fzi!ubTd1k51 zOyHW*BMZQx5~}r9)!aYTm^Up5=Y?itDs8po5SrV~&XlrvU2J;wS?8dxN;wRWOx?V= zj>;VtI+fY6^+>b&YW1&OnYDDvgv*ITIee%?Y`aT{Xo~}Kk_ee(emJU#+drJa;+*2C zu%YnX+K#eRi>eX_?P{&&DvWycEs_;F&mxSCu$+mQCb}ZSispG)*VuaL9=NCwD0**r5u29dXlSZAW z2PTqmp)!@yzkj_=%0)38j1#S;p*Wib(>oGo90O&l)1>^h;cZ^a;L*e;rw<%YGL`yv za|s7ceb}l@jclD5q3WcRKzvDwwC7c7Nu`;Nd%a4wez?WXp8Lj-{YFd!$px;G^5N zvqGV8IM6rQMV{VbhJ$j(@L3}lNhm<&t(@luJKH!oC~ zlC}2HywR!Kf)C$V_5(IkYn(-TwMidIr?d|2?xZ<(eLZ`O%h=7OH5M2WI@_$wuV%HN zrH49u)Ow}R>LpvomQ2K~qrDvLS+~wTn#?i*NJ| zr@O6%;wm8ALjD%p#Y2NOP~G!>pKe|2fY8)9bXlZ^X_CpO25Y?)wJoCJiVO68bET=%&o~gqT2JLm(|cGwq8dSsBXipn z8hyG8DXX^H#T&X_d#w=6u~xICFRL_7;J(#n64aKk$@I=PXlxi$uP5iuMl*pcQqnG- z1Kr1VdtVUuGsBrfxV`Ed$vmdx zdC47(;cQ`)t05_!!?wkz#A3vgh1j@s5_c3?z-I$Uz^-F3q~2PuPW@7c+a-o6JR#1wp*X($c*wB}?D($-!t z=5Scwz`S?w;a@RV71h}1sk>z-p3v?>*{;LV^1eF}5PtS5Fv7iajYXa4CR!iIU02JW zc0VbvBK%-5uSel98}*uk-fCkeHclbQ2kh0;Df)Itw$#&sVK#t>)l_jWQsH7 zzPL|wZ)zj&31T&4YAo4ySjP_5gs9D2SEcptZlc@4evMf61*Fxfyc2;W+_ceAu zofa$A_Cj?UCbj}Dby1zOppP4qUbC|H9d;;YJ+tF9v^`pHEOHQLru#ls_I26hhs#;l z;#B0mx+Mdt-ks2zE41U*Zr0WxVBR1Enj~6UtBqRbczp=>wJNjec(~t=qqG=^E5FiN zLq7ks(n^z!naw~9$iCd@yC6%*J)2`|X{A0U{_E&IQ)^Jm>Ye$?w7K3fS?>q$yzB6x zJMS198~d?f-_zuKLKIO|=F0>7o=InI_T5BYyKI`zzFf)bi!o{I%vS!WaoE#V_>f=I zVXDz=b{14)8&k5s19sp>q5wPq8}8Ts*%{Dd`dW}D73FyFJ~h6G#i z)@ieF>ACf#V~=9_^x2r7)K^J52csU;(?tu685St5Fdvs+`nHnL=_5F9nC3ZkY90?9 z+jTghv%|eIENnRVc9T^a8d6z+Grs$Z_w3q3zuP#nA3evUGA~>GaCd^D9eFtt>6maK`R` z#ok}A9&|mC>_67h==aXn8}sQ{qd9v3LG{@VMPc-CTA3eDZccexW#ZXC*KRM2@7y`h znc-O8-)^ZiJ8O1eIn&r_O{0w0lLMQyfG+^sJ+^Dp4IJdN6CFLws(##N>Yc0{svL@I zk;mHl8rw`2{bV%Tgwccg7LsfnPxeh#+nesHb()ph=uM60d}}HoBH_S?rx=SO&wAK$Bj~N8yB~}Rf-_-d=_PC6{z>~lKU^18r_IOtQ-%_V zuyG!z#~DtGKVt|Sk*Qd<)y)vlR+b2LDv!yDow_Sk zI!Sk2%{`_v0=BroYTC-uFWLyk{?f|Q=dGE3;B&frWvSI*`6nWJrD&QC1w1KHGHt6W#zQ{0C+=nt$LOm-@^mgQ) zfDH`s3!|U&8@S^t4|P7P!32S9IUxG`m8jKMc-b%p!=85-#VT12uCQJO*V1WFm`R-t zMf;W(IyvGXq#XAf-tp10g{-C*8v6Py&Jh5`aDtE#SRaG3&j_76@CzW=(GwvUip#q^ z&v>}fHfU0?iTGSNxIjb`PVO$0ISp|B1EVbXJf}RQu?W55L>mTxAv0ESbwp|LxWg_u zBCkka+6XS#^VEapxl!v*!2wvt@qS9PH62hHz6mIm2)g;ULGg1LNKmZ-bLuqa)8a5am$$(*3I1ul>hd}zS=PkV1vQ9A3i9D8iEn|j-Cf1oq*k= z6VQYTJ@W8I7w@MhG|&zco)Ut@ENz8r%28V2&n$p&M8W~|kjH0f!9Z^4$UCfH7?Yh( zzQ&1<${b*oEwTsd0e|dqE`Xlf=5k8wW+`Ho(cj_iCJBdN3Nz$2htM+#*||>u)e#i{ z+`IsB56}yU0f46-KLt`KjcI`HK+rE=1<@o{jN=oaI~=FNd9&%P!s0um8!+Qg-pi0j zga(G}KLFkGN|#p=w?w(qyXELockKN6c`%l-0Q=kt(nL9(RUFn*cMWX^mLg9K-U&Xh zBC1@TuD(kkdr2B4l&ir^v24>jh=Le{EDU^)-&xdkp3Q7(oN(zJb6)FHfiVB~Av z)IXj#7-aDWvcsz{p@iq-H0wc+4!*VoLDlmf(3M)sK*dnaLB}+_A(k;t99x&6v%UUtOn=&j$OuDQ89P7& z#~DQ7z3dB?!GbckFi7h3S2bh~f*sCsomHuG34HM4cA5>z#Aa=kyh3`y_(`L3di4mN zco{gc)=!=Ljg}TN7~)~W4Pmrw=s0WH^^bjfmj}4VOuh@jn?)WHGBlI6Ac-^VWWv4J z)dHOPGLrG|VhG7W*VEaL%`*2F1G5V63OIu(eRa@z)SMZpL)Sn&j&$C=l;!)!*lEzA z<>|;>8$t_fAD-`VeJ4omhL0~0h^xr64=Mw7RrtBNuBZb*fKp7doXHXo;8na$BQGl` zl|}KE7Kaj10n~CoVI7ZLb$I5<6cLO^5_Exe*W?Oh&Vf-hpDH}(3i1pqF zfmKL}$9FE(a~RVRj4cJ?eiBodhj>PyyYM>S*qfFn3b=h9MNys-YrLaHp_utjHVswE z7Ygnq4_-0_YjbzQP)@~6OP&VAj(D&RQcaJl*jf{worplxq>>+WkD0PqMXal7{_JZU zjGQq+M_&S+7{NS1@ij`Z@#hf?DGIX2n3cm47w}x0j6%@?ctxm&h>rSt=sB03Bg+jt z=KM>GW_eKIdh~V&cx*?Ta-1;^!0AChYtwk(J4d5K=4NuqS41wJcjY<~J!0}dHKE=Y zt5Xk7^uqbXf)CA>oYFGW*e#e~Pn~$U#2vh$(dNcyy(Ur5%A6p?eMZ4D?a_ z3#He}Nx4zz9{&hwEtI+fgLni7aONp>B{~^@;E6nLsca-#^qzgUrKy;h<|(zs6CXB& zkG@KRCw*<=vS-DQA7Dx!h7@Z!_XYiPUhq9VbbG%e@jrvwK8`T=qQ_0#pQ!?6DTjN3 z2;;N{aa}P>abCJrn9+>JH2AyDVCe2<)9!N?Pm~h$?VGe}7(NRK6wskxmlqI&mf*OY z&-vl+S^oNKCI-3M4qmj+J;GcLX5K@fWB6I2x)xfQwr9nBxXYw-e-qcMR8Kj{VjxZs zeIqGiHMm5r&Lpx9Hz>?WE^sgw=OkkYE=qPJxqc*+oE}By5$-zt^Q@>ule`u?22o2J z!DmOA1S_i0IWASQuvpVmYt4nOFZhB9nxY^qPcY|dpmqfLUjvpi+u>oX%ve?N;SeXf z0W0kMPX^cG*%e^8g<_SboEK-nkEhBsP-=3t9qQ;CR*pW7cem1~fY?btjN-97C~oVx zcgJHZ2JzViQqc&*^LMCumU`epY(q;tQmjdNiq^i^5lpMYT0ijt3wjX% z!!y@|HO@o5C=7EMh|t_S!b1TW$V7lI7vvfDDk=aH<8T?0(KG5sGn}?J-_tu{N zh#-o-y{kU=CXfItOksT{iGNdTy3vAeU86##^g2}O$G*plg*XJcxIXDBy;SJWT{v3f z9Yo|muPbM~yk>&Bme;;h?rfBkSr{{1oUn^*Q*Jp>W}#IFYfDku!3 zCB#>kbfKMIJSF(37xX236jZtH)POjG4I5DeBSOzal!H`bV52>Z4|U0Kqn1f3W5PLy zm^1QsbmfDmLH@M}+G1Dr3=@#g_q3_)WFD{0KoZzis1?a$S~l7HB(7@q7|fc z`U7K_c&&CTVno8zgN%-4mrLxrXX9dOAAt4h%NkH|Jm2Q&XuGEMxhiJPDX!$855RcyY!x@NP9f!nf4_M{bajCcOXFUNBJ z^)>Lp2_fjjhbQUnoc$^9$cmi0;#DUf;d~i%KtH=iXpazOCfvPshUqzTMo3|`!0IkHtJ&G_igK0xcIEc8b<{S^`NorCMX>pDAy zd7qumsu;*rKtcrBHR;UNYOiKX3(+C*$gHsIW3`0dD&S5y} z`UgGg6NL^wta~kA6@`ok&zvjZ=k7ra@%EAJ+~;ROrS7nW|(xYb`Gjs9!qCi2o{#)dQD? zO8G!ob(L6GMCcjo?s!Hh%3EU=Y-L$AV7h{-Pqes0%5iLbwoGBSt4$mF0U__GB_~MH zet{MpL}2mh1^!K$J|g{B(AzhpO@=Fmx)*TT$z=0G8~Qu+vrxy~wQS}9q1=z%*ha*> zDC^MX9DfQdw71(T*ciL7@TO}XDD{i=V=Xn)(t}rMnlRRmI z%4Ns%#J4gVSE@?`8}5tz_+1l*6eXBiqhex9j#!&e1f^U<+zkx8o6#Fl#s5JdV?}|* zpcuFyG9>X8zNXGbZD(BO69i!oY<$85^RB~n=a1b*IQ0X}Z~+AOJQx)qbe*V5ur@dw z!N&h8F!~`6A=lDfubP)Pnz&!OA_8uJ z0}NOX27EvV5G}A{ED^G7`XIvtCNHAik9WB6uK3TYXR&o%TZlv9j3|)Kv&c5qkaI((6;UYXx8+MFEH-}WkAg?I2!JT{Wf!Mf<9C+Yiy;bMeKy9N2 z<^P1#cSQf}TiMsxh@OAL%7O)Cff%5P9aVM~O^R}#z5Ux;W?DHFQ1SM#{_EK7B7rcm zxg&mGKV-np zf|q`Lw%GTlj3uDSWsFm<^sGCOSjdSq0!bKDocZ^4Zq|+5_=;y0tcPq@1 zLNhii?DD`w7e@{TYO|zq1@$>(X27rb!L)Nje4eK23tNwTHFx#k=<_ z_HCNgt!vIOc7lOJLo*uUda*?-=jj-^iJ0W0#hh{6FqD1{&^iV=cwVf$fWqGyc+g`v zdeA}qY2$`wo+3y}tgY8Mi_mOfzR*8!*SC_o5~v1*c}0og!HCsryH{iq#zgzfN(Nz@ zyrhEXK|?Pud&D}3JHqSf!oaQ=+PKTn95*bRDn$)29Z^o<=f%`x+fNlF(gvuR8@%KW zbyvox@T3j?#3&X?1l>tqH_!XRhfXoYgWaga!j4`jK&5iP)KULK8o8=J+CHog)Q&XF zT}d+28F&asf0S)qHlg~*2K-ZAxP4s2MH!KKH>Rb#n)twE`1Z-kBCNAYsbH{wgV3S_ zFpvr4!pdU;A>cy;l|;}wWUoaXf*BgGQUBnhKf61(t%%a%QqO`>_65 zy^i#t3wC2Ik)U8fk^V`ts$=, 2006. +# Vladimer Sichinava ვლადიმერ სიჭინავა , 2007. +msgid "" +msgstr "" +"Project-Id-Version: ka\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2007-09-14 12:15+0200\n" +"Last-Translator: Vladimer Sichinava ვლადიმერ სიჭინავა \n" +"Language-Team: Georgian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" +"X-Generator: KBabel 1.11.4\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "მოულოდნელი ატრიბუტი '%s' ელემენტ '%s'-თვის" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ატრიბუტი'%s' ელემენტისთვის '%s' ვერ მოიძებნა" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "უცნობი ჭდე '%s', მოსალოდნელი იყო '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "უცნობი ჭდე '%s' - '%s'-ში" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "მონაცემთა დასტებში მართებული საკვანძო ფაილი ვერ მოიძებნა" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' სანიშნე უკვე არსებობს" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-თვის სანიშნე ვერ მოიძებნა" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' სანიშნეში MIME ტიპი არ მითითებულა" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' სანიშნეში პირადი ალამი არ მითითებულა" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' სანიშნეში ჯგუფები არ მითითებულა" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "პროგრამისთვის სახელით '%s' არ მითითებულა სანიშნე '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "შეუძლებელია '%s' exec line-ს გაფართოება, მისამართით URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "კოდური გვერდის \"%s\" გარდაქმნა \"%s\" კოდირებაში არაა რეალიზებული" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "ვერ ხერხდება \"%s\" - \"%s\" გარდამქმნელის გახსნა" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "არასრული სიმბოლო შეტანის ტექსტის ბოლოს" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ვერ ხერხდება \"%s\" სიმბოლოს გარდაქმნა კოდირებაში \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI \"%s\" არ გახლავთ აბსოლუტური იდენტიფიკატორი \"file\" სქემის გამოყენებისას" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" +"ლოკალური ფაილის URI იდენტიფიკატორი \"%s\" არ შეიძლება შეიცავდეს სიმბოლოს \"#" +"\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI იდენტიფიკატორი \"%s\" მცდარია" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI იდენტიფიკატორის \"%s\" მასპინძლის სახელი მცდარია" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI იდენტიფიკატორი \"%s\" შეიცავ მცდარ საკონტროლო სიმბოლოებს" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "გეზი \"%s\" აბსოლუტური არ გახლავთ" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "მასპინძლის მცდარი სახელი" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ვერ ხერხდება %lu ბაიტის გამოყოფა \"%s\" ფაილის წასაკითხად" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ფაილიდან \"%s\" წაკითხვის შეცდომა: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ფაილის \"%s\" გახსნის შეცდომა: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ფაილის \"%s\" ატრიბუტების წაკითხვის შეცდომა: ფუნქცია - fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ფაილის \"%s\" გახსნის შეცდომა: ფუნქცია - fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ვერ მოხერხდა '%s' ფაილის გადარქმევა - '%s': g_rename() ვერ შედგა: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ვერ ვხსნი '%s' ფაილს ჩასაწერად: fdopen() ვერ შედგა: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ვერ ვხურავ '%s' ფაილს: fclose() ვერ შედგა: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "არსებული '%s' ფაილი ვერ ამოიშლება: g_unlink() ვერ შედგა: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "თარგი '%s' მცდარია და '%s'-ს არ უნდა შეიცავდეს" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ნიმუში '%s' არ შეიცავს XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "ვერ ხერხდება გარდამქმნელის გახსნა '%s' - '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "უშუალოდ წაკითხვა ფუნქციაში g_io_channel_read_line_string ვერ ხერხდება" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "გარდაუქმნელი მონაცემები წაკითხვის ბუფერში დარჩა" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "არხი არასრული სიმბოლოთი იხურება" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "უშუალოდ წაკითხვა ფუნქციაში g_io_channel_read_to_end ვერ ხერხდება" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ვერ მოხერხდა '%s' ფაილის გახსნა: open() ვერ შედგა: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ვერ მოხერხდა '%s' ფაილის განთავსება: mmap() ვერ შედგა: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "შეცდომა სტრიქონში %d სიმბოლო %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ტექსტი მიუღებელი UTF-8 კოდირებით - მიუღებელი '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"ვერ მუშავდება სტრიქონი '%-.*s', რომელშიც უნდა იყოს სიმბოლოს ნომერი " +"(მაგალითად, ê): შესაძლოა რიცხვი მეტისმეტად დიდია" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"სიმბოლოს ნომერი არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში " +"გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "სიმბოლოს ნომერი '%-.*s' დაუშვებელია" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ცარიელი ერთეული \"&;\"; შესაძლო ერთეულებია: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ერთეულის სახელი \"%s\" უცნობია" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"ერთეული არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში " +"გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "დოკუმენტი უნდა დაიწყოს ელემეტით (მაგალითად )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"სიმბოლო \"%s\" დაუშვებელია \"<\" სიმბოლოს შემდეგ; ამ სიმბოლოთი ელემენტის " +"სახელის დაწყება არ შეიძლება" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \">\" სიმბოლო ელემენტის \"%s\" ჭდის " +"დასახურად" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \"=\"ატრიბუტის სახელის \"%s\" შემდეგ " +"ელემენტისთვის \"%s\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \">\" ან \"/\" ელემენტის \"%s\" " +"გამხსნელი ჭდის დასახურად ან დამატებითი ატრიბუტი; ასევე, შესაძლოა მცდარი " +"სიმბოლო ატრიბუტის სახელში" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია გახსნილი ბრჭყალები ტოლობის ნიშნის " +"შემდეგ ატრიბუტისთვის \"%s\" მნიშვნელობის მისანიჭებლად ელემენტისთვის \"%s\"" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"სიმბოლო \"%s\" დაუშვებელია ელემენტის \"%s\" დახურვის ჭდის შემდეგ; დასაშვები " +"სიმბოლოა \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ელემენტი \"%s\" დაიხურა, არცერთი ელემენტი არაა გახსნილი" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ელემენტი \"%s\" დაიხურა, მაგრამ გახსნილია ელემენტი \"%s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "დოკუმენტი ცარიელია ან მხოლოდ ხარეებს შეიცავს" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "დოკუმენტი დასრულდა უშუალოდ კუთხოვანი ფრჩხილის \"<\" შემდეგ" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა გახსნილი ელემენტებით - \"%s\" ბოლო გახსნილი " +"ელემენტია" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა, მოსალოდნელია ჩამკეტი კუთხოვანი ფრჩხილი <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის სახელის შიგნით" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შიგნით" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის გამხსნელი ჭდის შიგნით." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შემდგომი ტოლობის ნიშნის " +"შემდეგ; ატრიბუტის მნიშვნელობა არ მითითებულა" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის მნიშვნელობის შიგნით" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის \"%s\" ჩამკეტი ჭდის შიგნით" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა კომენტარის ან დამუშავების ინსტრუქციის შიგნით" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "დაზიანებული ობიექტი" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "შიდა შეცდომა ან დაზიანებული ობიექტი" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "მეხსიერებას გარეთ" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "უკან დაბრუნების ლიმიტი ამოწურულია" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "თარგი შეიცავს ნაწილობრივი დამთხვევისთვის მხარდაუჭერელ ელემეტებს" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "შიდა შეცდომა" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "უკუ მიმართვა პირობების სახით მხარდაუჭერელია ნაწილობრივი დამთხვევისთვის" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "რეკურსიის ლიმიტი მიღწეულია" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "სამუშაო გარემოს ცარიელი ქვესტრინგების ლიმიტი მიღწეულია" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "სტრიქონების გადაყვანის ალმების არასწორი კომბინაცია" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "უცნობი შეცდომა" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "არხი არასრული სიმბოლოთი იხურება" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "დაიშვა შეცდომა სტანდარტული გამოსახულების %s დამთხვევის ძიების დროს: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "ბიბლიოთეკა PCRE-ს არ გააჩნია UTF8-ის მხარდაჭერა" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"PCRE ბიბლიოთეკა კომპილირებულია UTF8 კოდირების პარამეტრების მხარდაჭერის გარეშე" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"შეცდომა სტანდარტული გამოსახულება %s-ის კომპილირებისას, სიმბოლო ნომრით %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "შეცდომა სტანდარტული გამოსახულების ოპტიმიზირებისას %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "მოსალოდნელია თექვსმეტობითი სიმბოლო, ან '}' ბრჭყალი" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "მოსალოდნელია თექვსმეტობითი სიმბოლო" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "არ მოიძებნა '<', სიმბოლურ მითითებაში" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "დაუსრულებელი სიმბოლური მითითება" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "ნულოვანი სიგრძის სიმბოლური მითითება" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "მოსალოდნელი ნომერი" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "მიუღებელი სიმბოლური მითითება" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "დაბოლოვება '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "უცნობი escape სეკვენცია" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"შეცდომა ჩასანაცვლებელი ტექსტის \"%s\" განაალიზებისას, სიმბოლო ნომრით %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ციტირებული ტექსტი ბრჭყალებით არ იწყება" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "უმართებლო ბრჭყალი ბრძანებაში ან სხვა ტექსტურ გარსში" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ტექსტი დასრულდა უშუალოდ \"\\\" სიმბოლოს შემდეგ. (ტექსტი - \"%s\")" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "ტექსტი დასრულდა %c შესაბამისი ბრჭყალის წინ. (ტექსტი - \"%s\")" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ტექსტი ცარიელი იყო (ან მხოლოდ ხარეებს შეიცავდა)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "არხის შექმნა ქვეპროცესთან დასაკავშირებლად ვერ მოხერხდა (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "მონაცემთა წაკითხვა ქვეპროცესის არხიდან ვერ მოხერხდა (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "დასტის შექმნა ვერ მოხერხდა \"%s\" (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ქვეპროცესის გამოყენება ვერ მოხერხდა (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "პროგრამის მცდარი სახელი: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "მცდარი სტრიქონი არგუმენტის ვექტორში - %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "მცდარი სტრიქონი გარემოში: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "უმართებლო სამუშაო დასტა: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "დახმარების პროგრამის (%s) გამოყენება ვერ მოხერხდა" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"მოულოდნელი შეცდომა ფუნქციაში g_io_channel_win32_poll() ქვეპროცესიდან " +"მონაცემთა წაკითხვისას" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"მოულოდნელი შეცდომა ფუნქციაში select() ქვეპროცესიდან მონაცემთა წაკითხვისას (%" +"s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "მოულოდნელი შეცდომა ფუნქციაში waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "განტოტების შეცდომა (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ქვეპროცესის გამოყენება ვერ მოხერხდა \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"ქვეპროცესში შეტანის ან მიღების გადამისამართება გამოყენება ვერ მოხერხდა (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ქვეპროცესის განტოტების შეცდომა (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ქვეპროცესის უცნობი შეცდომა \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ქვეპროცესის არხიდან საკმარის მონაცემთა წაკითხვა ვერ მოხერხდა (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "სიმბოლო UTF-8 რანგს გარეთაა" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "შეტანის ტექსტის გარდაქმნის მცდარი მიმდევრობა" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "სიმბოლო UTF-16 რანგს გარეთაა" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "გამოყენება:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ოპცია...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "დახმარების პარამეტრები:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "დახმარების პარამეტრების ჩვენება" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "დახმარების ყველა პარამეტრის ჩვენება" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "პროგრამის პარამეტრები:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ვერ ვახერხებ მნიშვნელობის წაკითხვას '%s' ელემენტისთვის %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s რანგს გარეთაა" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "ვერ ვახერხებ მთელ მნიშვნელობის '%s' წაკითხვას %s ელემენტისთვის" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s რანგს გარეთაა" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "არ არსებული არგუმენტი - %s-თვის" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "უცნობი პარამეტრი %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "ძიების კატალოგებში შეუძლებელია დამოწმებული გასაღების პოვნა" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ფაილი ჩვეულებრივი არაა" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ფაილი ცარიელია" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"საკვანძო ფაილი '%s' შეიცავს სტრიქონს, რომელიც არ წარმოადგენს კოდურ წყვილს, " +"ჯგუფს ან კომენტარს" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "ჯგუფის მიუღებელი სახელი: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "საკვანძო ფაილი ჯგუფით არ იწყება" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "გასაღების მიუღებელი სახელი: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "საკვანძო ფაილი შეიცავს არარეალიზებულ კოდირებას '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "საკვანძო ფაილი არ შეიცავს ჯგუფებს '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "საკვანძო ფაილი არ შეიცავს კოდს '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც '%s' არაა UTF-8 " +"კოდირებაში" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც ვერ იშიფრება." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც ვერ იშიფრება." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"საკვანძო ფაილი შეიცავს კოდს '%s' ჯგუფში '%s', რომლის მნიშვნელობაც ვერ " +"იშიფრება." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "საკვანძო ფაილი არ შეიცავს კოდს '%s' ჯგუფში '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "საკვანძო ფაილი სტრიქონის ბოლოს შეიცავს escape სიმბოლოს" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "საკვანძო ფაილი შეიცავს მცდარ escape მიმდევრობას '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც რიცხვი." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "მთელი მნიშვნელობა '%s' რანგს გარეთაა" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც მძიმის მქონე რიცხვი." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც ლოგიკური ოპერატორი." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "უცნობი შეცდომა" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "პროგრამისთვის სახელით '%s' არ მითითებულა სანიშნე '%s'" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "გასაღების მიუღებელი სახელი: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "მასპინძლის მცდარი სახელი" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შიგნით" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "გარდაქმნის შეცდომა: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "ფაილი ჩვეულებრივი არაა" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "გასაღების მიუღებელი სახელი: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "უცნობი შეცდომა" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "მეხსიერებას გარეთ" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "შიდა შეცდომა" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "მასპინძლის მცდარი სახელი" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "შეტანის ტექსტის გარდაქმნის მცდარი მიმდევრობა" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[ოპცია...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "სიმბოლო \"%s\" დაუშვებელია ერთეულის დასაწყისში; ერთეულიიწყება \"&\" " +#~ "სიმბოლოთი; თუ ეს სიმბოლო სიმბოლო ერთეულის ნაწილი უნდა იყოს გამოსახეთ " +#~ "იგი, როგორც &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "სიმბოლო \"%s\" ერთეულის სახელში დაუშვებელია" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "სიმბოლოს დამოწმება ცარიელია; იგი ნომერს უნდა შეიცავდეს, მაგალითად, dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "ერთეულის დამოწმება არაა დასრულებული" + +#~ msgid "Unfinished character reference" +#~ msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "ტექსტი მიუღებელი UTF-8 კოდირებით - overlong sequence" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "ტექსტი მიუღებელი UTF-8 კოდირებით - not a start char" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "URI იდენტიფიკატორის \"%s\" მასპინძლის სახელი მცდარია" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "URI იდენტიფიკატორის \"%s\" მასპინძლის სახელი მცდარია" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "შეცდომის გაანალიზების პარამეტრი: %s" diff --git a/po/kn.gmo b/po/kn.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7134dc5dd3e7700b2bbfa4b97f356617adfa504c GIT binary patch literal 70151 zcmeI5d7NEkeg99WbxB=8+?Oj5CXr0Yf`|!(C4@x?2@n=FG~CSGnOrh6cbGdv5;haj z5JAyOgA}bX6#{}Rofx8Zp=euet=4KSb!nU0TD4Z|Qrl{+{@$PO_c`l5_s$&%w152O zl{24v&Uv2i^WC5C^PDp`e|PYcc0~N#Fe8dy0uDVrie7q96n*>!x*A3EUlB!zfD6E< zfXf4}2zUYb8(hC6oY%qEaeg_t7W^Do1&=x`ie3o59eg=>CpZWE3@G|P0*?fL{qQI{ z1)K{$4{U(X1-F4mf$srlgP#E_;19tUgU>l4iuf4yf*R*s@cG~da3Odd_!{s*5SF4J zg2#Xd&x)d>!P7yFw-HF5Lf}vrIYkI2EGiu z9+Y411|{#OLCNv8aQ+kUV9saG_kJ%0)o&rFe&>R+!wC2a@CH!&`Vgpge-0iBeh+*R zI0NQ2{!73LxByiD^FWP10?M!660ZMlz>fy}3Ml@56wYU&M72K>l%1D?qE`hq{x#wL zdqMH{VNm1$H7GjY11sQ@a7y|0EKq!$7|t&Q)o&EU)X}>@R2+RA)VTiwz7#wNqpE)e z#8lB@P<#x6>VF-m_IH44_X$vTe*~029gNXXQFJn>I2r@h?n43p1YFAbevr_LUVf~{ z$El#kUk~Ei(Kb-@?gJ(N--7asUx4EO_*Z-X0Z@K(BPe-(A3Oy7drW{Dky%g1L+#w3yS_f zgW{{Q#N{{*)HoC2`~%?gIR6r;{@(>f?~vo8=o#RvK*_xfd=|J4ls?A7{av8=yB`!k ze;v+$4$5y|af18l$)NaN18V$tf~17#lL5aS@Yxtee7pu!|32{9;B}z%`P-oQy(?UQ z2z)N*Uj$zOek+{+5|mvJ!C3Nx<3Q1?gVN($LCLund@=Y4_)_pEAfXUF=OmYN8MvDB zG4KrVGobR$vrk6%;6>os;0{o9zX`qqd?u5^%fb1eYr;Gctsf!_wD zpP9?tZcD+JaJ~uD{T<-*!H?yHt?0;PEdaGXCVKg z@A3;*ie9tI`Mm~IzxRXkqdx>S{aSpkaPTJY)MwV>$T2tEb;3sCxh z1bj01V{ktBGf@1$@;sO4bzm>&ZwD*j$3V&d4e&R>{{rPVPdeZEdI6~TKM}+<(P~h3 ze?KTbKLO(U(RVlP~o4M}X>oGAKSS1f|c*!}-mi=-vm4?&m=H&DTKr%m0A# zyTdMWxfX-6cMX(&ZUWW*ZcubT4?Z9KH}FvKDHl6mF9j86r-Rb-FsS_S9`HHfS3t@A zZBXr=@;aBl7nGjP0X5zla3Qz}RJ(gXjrW(J{N=l#_{6E6^;g?V|&7igi`n z(Wk-7!C3>uHu!FS)xlqa8fQJkF9SacUJV|xp4t@L1?qebjfK0xjo{%l#^lj^z+1t8 z2X6u2zJZ(z9x>$C9|mvZ{Pn|5@2B7ioL@77PQj0X9|uopuoeP;&M$_HE*p)aE5I*< z;`_Dy68(>Z+raY?ju4H$2EGxT*YtJSeW3Vy>NvcDRq&6{=Tj%VuKzqlakc1~2=Nwh zJ@_8*2Ov$N8#cM#qRl=(H9?L0ArR4`WmghU(7PY}0_R`5irNYMAj;VVUW8FT3jPfI z9JuFN#s}XBlb--j-9oMg4?_6kpz}kJrqP`1paI?qLNYq{&EEd=;0c`H2(#}5{}jB3 zey>Lfr*Zz|?LPmm09SK<8+Z};Z{Qi=>2LMx?*yfnZ-FO*OK zzQgNFUYC0__({$`3l4zS|1P-&`~e7S z(L3Jf{(rj`xAPIX~=n z<}mP2!HgoD`Kt-vH%bqj$UBKMD?W z{v?#}1#k>}KX@|CPJ-VA-w5uw*YVK%!Z~;{*AKnl^V>yWo%4slBf&Wj_&&=j@F>n7 z0M~=x0Cj))@1rYl2oztx0JnqhWY7lq!aeSy86R@|3!O!eSSm0mpm9n zZ{q%a-~_l}pVyyvf(to+1Y88p{D||t6x8_^@GS7d;5<-C;8Ngd@MiFx;6>mOf509F zcr~~jd>Tf$3S0>u4}K0LgrcW@-1F@%;4e8p9teW(K1{@(5QKJYBge+g~`U%TJ=`xLl^^TYqa>D~@r&G~mg#YgR% z9uHpuujRb?kDd>H3?9e%N&n>XZ3fqJ{&n!J;F527{`q5&P>Kfs*{{Fk+te1E?*?xI zmwtyF0)8I60zCe^J|FD?`#68e;6H=U0B8Ns^VK3y^mc*r$GJc9`r={m zQqIr#vFq)F;BRpLeQ-YbGq4H1@+V&Jy$}2n=U)WJzz_Vp>+^X(We(ze2Y51g)qi;1 z^ND~b{-@`$hrxGn|2yD3aMOP|e|H8v^k=>fxeh#^`wxM$z(aoSe)<~lL!9peKLGas zx95YW{=)BH1J=0y-{7TS^?%&{p90V2eBm#>u75N563#yfUI2a_ya-(IE0^=F;7y!= z4BQUBHkuKg1b!J5{pZe@Ve|Qw;0n(F20R5k@}L=3x7ERGIsYNJ8EpL84BPMhF1VEQ z?N6Fvaqt;%6X(k)hDGP&-~w>wlV@1IIv(7{`K{oM;LD#f!{+~cz;|-~AE5l}`lrsY zy6Ai08#zCTq;e$qhv2>7x50jJ$IKbg9pKMF#sB+%V}`}o^PcYV-3DIB^{<2CbKx^) zn4et^F5&#QLCOC`a5;GFGiO*nxjNvd!7A5hK5K@}zeC{doc{>i0^aiM8D_WVKWB#d z{l~x=T;IbH|D42yMd1YZiq7VIAGn$WvztG>R-O2H75K97`NN!Fz-Q@6Ke#~hb042x z&GCofihTRIv|Sg@4+hWRT)O@!$0Ud9g1H>}`JO}cP4Hx{Z2_+ZU&rxCxJT-W{*mL^ z90ze6&OP~#em=!f;ZUw8WteS8`K(yG3M8EDM=_xv+|Kkmi+i{6`PVrf;Ly+M9P(xT z{4R&`Y5X&X55LKw*tm=1&pGt77&1vtpWe)wkg+uWZ{~XGPpK@FiE^Gwv=XeGE^s_qP?0`S^%a%LB zN2}9uL;LwpesAUT=fH>jlCAUm!u>abgibWXp*YI^93D>I46flIB%`GqU+441;ohN~ zKZDP|b1xY_!BoX=PC`7H2t9P|17Jn$TjxAM8h5&t~Q zhZ8dAy1tO(Sgu{haUP%Ry2y`Whmf(kMdwT((FEtmf;%}r!=ayl;An7tAxAHtm2)2C zcme17Ax+rN^$yVwz~AKBE5rGj;7ZQlAI=4bgg#e*$`$8_dxUuOjqv$>0dEm<{Tz<3 zhHHNVzLcY%;}sk;xOY7GT#jS-d?rWyvn_lkE#-bRXZ-<3lVd+e{PSmg*vs)Tj<0aM zfa9g~UBL0LeAdrVffiG6bQYg~2EL4AUby}|@P!<&=Xi6tb|Lql#c=_Le%3nJ-qeop zS^4^@;j^F``W^{x;dnL2B^+A!lJ4#2RPdD?pY>DAt;*l4!u>JuN8z5}kj&>}GM`@_ z+W$4zZsoWxoRf}iUSAg4UeEa*;qxDZBb+bcAl*j)#QD{reqO`zclOEG<@z|x@kx$F zw7DBRm18}}bsRO0qd4@VdHlCHzOR$;GX|c*v5dY)gfSLyei)xm;}{6-P6)V}YgdQQ zf=_T9$MHgrGdT3~mmDwVIEmw}9A|ShIP`O;gYBKx!+4j2=W#G)=6>dc^HHvDzjd|2`becZQmGBqhHE3^m67UjE$Wu?`1)E( zx5+R^_bjPc=L1N8sL`zD*s~FqR5W;1GS>Q2CZvy^r9Gt*NVH1ZJBuOP*HejRpLkxS zF;_U(*8S$E%o8z_N=;Z!>E`~l_?vtMSqmxHRhw6RR@jA^{ zjtZKKqm!GotNX=17_qx@n;dnVWzoXu!+W#^~lse|@ahH{KZATxnc^ z-zKNoHtp{;M{7tnWTV7ABw?*G(S+KHGgmBUn2~|{;KZ2AOJ;9g3ei0w&of-zRQ13(q4ZEgxP-hL}#< zTK}0{Q$G!-=)U#p_2jBj>ccon>OtiWrC?3l1fg-k3Dj~$ZD@1BE0YG6K9q##nzPwy zF0At{#~MUR&YAmaLqk=xh!51q@!9&7C4nd+iZN7&1&B3L+&Tiuqj9{!4cv@0p=gX7 zk5R;k!(3%Kbbufk z8B~%bZ>~PAcfqk!wKy)*V5~M!8)F_-+UlM6N@m9XMo6JHyE0d}RO8B}$z)hcp`R&P zViI1K;_2F~4HGLvjgcjl;RchzPE2pIe@`17gDPdoFR<(0v)2Ga`zN)=4fjWK09 zEYTRLRo3B5ee0uBvnd(7YSytSV_C6LdwU$WND@aur}Fg~aS8MPqMV|BP1$=XEohlxg)!g&txWuxpq>EUEhKb(D)?HVVs)%uN|iHn!00_i^C-MR4)`vpSxEuGnI3#Zi?uyj#o2Gq&J3{$f|=` zUmBxqEK^=`oi$n|_(MVKxh5@q2C`IGn7>sFVkwqC$7#6Ex|+pym8ED4;bvpV81`Ic zF-9epxtOCTZ>;sUZ9tAP&mvV925N>JU(jWIxmAhIJc@8jJZPzj@c;>bR$x(w-UKytyKGxPE2Zp;|h`AwO0d9b(e9GIAV~TalhJ zHZ+m#ImYaWFx2M-MQlv(q~WfWMXVarInEX@71$iJz^sw&2G>rEC}?NTVfBg)xg=%8 zB~CTjOi(!=HWqw29~x z$)|j3t<0X)oRe*5m6kc1$HRbCE_v=VWHnteuADQ8pO)LBb=Gr|PbEDn)Q%idSz(4B zkljLoU*x97qC}f-`9@l4b=R^WTug3#ZHRdE1!Q%&mDH%#t!nI(mjrWW;~mV5!Vqgi zk%C>z^IYIW`8dfu>?#aoRXCuSZKv_!YS>b9bq{miuBla)iD}FL!Ic-|DZ1NTPxIK+ zsClx}CDmzI-;)W|-CR}Oed{YtHkI*^^;I^r)=|!~GPI58WYv;c&!_tyvyVJ{;i6-f z_;P9!y9YzHIqWT9_Vv|KUzY?bTE;h6q%cQj%&JMgqIt(x?m1(2*{tXlMzS{2m>68& zN}2lHqNLy_)+cOQSez)5+O|n-U9gx@(NZi|yp;v)Sk2ReRx|8kX(?3Kc9uLer-N1| ztTInHP^NJY9b{Km_uBayGe-SNHq34BEFPCNzP8U&r<3F6^31@%&_r{6JEE=4o0~`a zx^Hd$3(b||EcLLw$heFy*V47edKP;qj}Z1n1^(_^?a^t4mXL{eOnr6eEx2sUP(PFA zSUo1&pxWI*v3)&uJ5=)8U5!pZ-=3H(V+V+dVue?kwsV*4W@-15=NkQujm_u`a$x#Q zIyEKV&!MFX|tu8Um=$? z%dMc#3{L}3KcDh&HBb8N@r?HD8NnB{+7~^}H{n^R+x(7lOpIO=+?z?Hq)(D`?Wtj9 zwl?x4kmjR!-(gPM)?GK8V2^Xr!Y(MP;jzb*G<3$;WV3Bt+)Y7LRDTq0*jG2qD;pjcGQ!5z5!qa}hQ7 zbYQ>>ntqWu$FuBUjYN8YA-V zd<%aD5S|+h@~C7ak#8dvf!rx6w5;b@D9*BD5?o=QJK22~Bdkf3YAG0NQEQKS{DjXgks=WW*$!DtTF|D3L~rb{)Amp?S4}n7vMHv|1md+}8H`T;CeBZRrwX6C-J+ zjbCCg;%VFD$%K_NsZrXsh_yY{eXN!-aY<|DBObH(R;ag(&aMrN+oNRmef;?vS=34% zh*`<7ZeoDvNYU9Wb=bAFeYL`jwW2yivCH#E&q<-K(Mm?MogQLFX%i;Nbx^^-#~T}J zJfxUCtACC-Z+V{DeV^i!&$MU!$j3*u81(0J`5MFA!)g#cjf__4K_9`JBnd5BNDV9W zEOlLNe4{E*d&*RJBOyAc;m_CgHi|!{F|F8cZ|Q3g>XF%M)8d}xuyjooRv|p?d9|3a zHyxBbie1c}%DV2u+3xvQFDyeaUWO6gTCnOkS<`Ua9Fo0!RwtMx(>Q&3LoAGr)vvH+ z-w+$`N+j!~6?-)0GPmu?TL@Rwc`V6xSYyn`k6AOlN!xuqFhIGI3dJ)VaY%Wb(o`K~ zZ(WEiQg=VR`zF~QHq<)6A0cGI-w_i!jgNg zGASdmiElCzh+2^_O)RWFu=sw%c3^s)_!y_s^bD-eYYeD6Y6F08MotRYR`<{g57isAx z-4sQNR>p<4MRbyhGuQ1o3=cwi^MJx&rLS<9>&uH-TLMI@mYuhp>6qtf?1K`azUhUR zEA&*bGP4|~odia=hbv*=E;}ZzSDt_7#SrJ62-_M7o?y>v3i7P7rV0=IR-xigbaHPm z>5&!u$wb~JT2*}EfFKXGWmOg-~*nn+)9V%`RCR_?svTw_4U8?=_;@b-tzBoKTZ1$#p!KR}o`_%U5uWxMBYjG9r z_=E=l&B(6iulUPmFjJV{&TmYNk*LN)N#lOGqIAMKMC-mXu`IvZ^f^x5#~w^VRP8?gre57y-me^^D47f>zS|m z>7E9flO>aVC|>DVlgW)8x{8u5yDPIb1^EKl98$5AJpN@M#*U}VxSd|=G1sT9SM`}G z1;b>!V42Xk<+_=LkX^@<6zzIymq*!vhghhtEvj8@0jr!@!i6!}(zXmz})hLZG7 zj_2`F+H4nP*tlS@Azhc;4kOYCf14?GG%wyGQ%RPHA zqbNpM9a?CXRH{iITcniiO-Kr}>ckMQX_=XmWhrGWi)*}Hl~>fUk9k_B=875SQJgkm z+FxTW(#28rBHR#3;PMIHb@duBQwFzmXt2A)n}}&Pvm(xh$+XpmIvd*dK)0p`k_Cl1 zTaqK(h&OwRWrdPVT!&c>yC8Y}sZy(sDZ)qkdm972!56c)?LjD$Ztk5{dy#nUC{sKB zre&4vWmT)~>oP%SpMW4z!kNi|X_=~r&}KK?eOtDS#>Q%We6-#V5!*h_G>NNCMzS}r zic-h-=h}NVx|?iQWx2KbojQ{Oi#LH(E=fpQ*y|Y;7sj8!NCP>k{pGoQQ$mw8thY51 z8tD`KxG9C#c!RRZ(xAV}rX9lgcJOSQQE;_<;UdlIfs`Kh*ggQ3ZxG&NOlXvdy*B-L z9RxuuxWF{s6xIAz%+q3wbm%)7*la>KB!lnY2M(*VdbRE7wlME-w=o)poo*^6sm`B{MeA#us{Qw}WV4_#%)52I zRAgotscp18JHWP)$l{gk>m+W*Um4AwKPR~!w#SoYs9#P=qY5A5xK{7rv31{);`j9UwEQgi!B$e5VLbiq*rQC~x%9KLZ)m4U8uDXV4w#w_Hyh}b7?%NYl%@pkUF}=35 zYV?icmmx_tNj9n^^_DrQe9fX)zd8y}2168R)0&in=fp1{>5+@Sp38%aE9yuvw3)0~ z;~nUJQfc^O2>w7Uqd1lh{-<01hZbRogu|jG*s;{##88#w6Lh#vl3@+SA9UEu3OME{ zVuqLX`P+ynVM1#k{ZW`L+GU)SCmOZ9N0laL-ep29$}iPQ?w$WICx+A?QJ3=Pj1>N; zl+|yP(s#FxGrs2V*~8UM_2G%(3ePGNfq5S&yk6G2ZKKss?0U&;z?1pm;sjYb&q)}{ zEq{WTwFWa<%*lfJbLY<|4QOKVO|Db`ZHc33G11iaux_|ss4OX>l z;Du4MvL?EMJp@$LZszNJyY1B1wwooDD2c-mB=Q2^Rl$fjCf=)u9A4U}9P9N2U1q0M zV-3yGy=V6KUg&?M$IEo=#LgS$?+I#S^EQmkJg=s|2JKzZ9IW^Eo-#4m>|M=6;hC#e zuI^o?9744Ao=PfNTv<4O!TjF&i+UFxTUoGR@iE8s&Oc`Ud>ZziN4ii{C++6Hrk8&U z=2sRhT)c46QS)E5X#UKz8L@XYd7{Y{nUlwKo)6TIo$yP6H=#g(&o!dmUGR*tWYoHSIQ*BBdII#Yj;nM$`{-u#)%JZ1N4 z2V${pavjaST%DKr6`wqqIl&%frtQQP`K@<(_^au~mE+dc$7f#Ld%7OkIlE__QeDRi zdcnK}3+5d&bJY-k{5jNn8WSSh3YC#jJ8zz_kez?~c*5+F$}3K&ESR%oCV!T_fATH+ zC-2)o`N{p0ckSQv_WhIhSN2bSWdG!w_D}BEzvue>leh1md`O=sAJ{+nfsTK)ZLM}$ zkKGXY(EiDH@87d6VxuNK(Hv_-LY%?&8QH!2_iXhxjH<48+4zk7z+7KC?Vk*7-eq@o zdxsp`YBD)#R41JZg5^h%knc8eAh2zTGZJX!2-6cz9&|DvrLCz11-Od%Eq=MmB^usq zG*KF~uIC0?;|B86b*o+78rcdkh@rn7rx~p5i3R&^?)h6Q}EwNKRrp5qB_< zFc(W7QkuBBRjS8Q!C07VTb%LGIi~zTthxt{fqnELQN>~HqqmNrPJ6I4{KCe*#6uEo zphBF<88Ta1MqmsK=9+U0Cn`a)aI-rjjmteYr(1VTdG3Y z@Z}*vc<>olf zhAwD}kuoD4D1t6cYDgF>R}VMf2Rlm#o<3-ZW~95WcqizHVi?Cg-DnT^OGMTmBgg(b z`AJCLV>)%sGmz}UlOb*tBhP!qs%-H)+eEX7Zy7v83pJ#b-V@9R4uM!CL-gX=OUAW% zWM@!1vYXGyH04@onK4=v5#=7#uwux4`3Urj+2&nd+qi{4Y6*8MhM?umX26`MXFMW| z?EW1>r(|&d5|hV!+=7i;L$r{&TIBE)px^i`UKR^vvn!W8#}feQbU_lPAw`N$513WH zbyJ)hurApGQ_={pC#TA~MYr~Jbgwx8>43I2Mw@WUFc!aG*m*>oxaD_nw|D=Z>(cy9 zfY0iG%nY^UuH0XHO`(n_p1IR_R%(yM|F3Cnb^3)j|HoL%Oh#nSTryw+PR?)0W)XLN zCQ4;Ep9^q>xMT}O9x$6nB&PEGxna?hJ7+4z%crD~RCc z2=SOEb!7uBh@g{Q+ayZ#QcfAjvrHx-lx5qw&{18Sr3K3h_Z^mbtO&GJvfVP6i$Q8r zdE!+j=7|NBsgT}A*Jsb{p{%89!(fwH(uqADy*%xWjWHM*F1-39d*WeC?Vcd1F%a65 zHA0C25*&Tt@!o>lbzBYPzkI1RJ(G+fiKO^CdcuVn$5t$%l7=xUlj+4hx!^v@gyHi? zJgX#SxRp9_lmr_G6T0}&=bU?`M_>D;IDim>S}3>GUHd2wH8cuw&dlx{{M zc1#F66F32rx%;p;%7qi7$EhiqTwAr%`Yl%peT0IbA`_;Z7X~Z%W4UNvWVlXYZLgDg zS2k1PP3YOzO42qmCCal9Kx-M1T`BNGznBHx_T8s=X{MObdZj?j#@9~kf@2v;S%NEc zCd*&}9DvW#BR4P@Y=yW+f3V_qn}YIj2b3_x-YU0o1;~qT!2$idzsl8FbO{#)3*aT% zJZ#ZOHjcu#h^2vKy{zwUi^4dT3Uo@?Y|EWH15x5}jb2gxeNZSVCT+}MhE~IK!@V(Z zrHxIW2$IdkkVwc)bjP?_!Q(qy%DKBW-VcDaTnOQ7@X2`h8b@Kd3@wb~Ns8YX#}~#7 z8e2?vug`qvSwU~6gxpBJbR=g&B%utu4F3>+=$w9gnmAOWqLV^^wv4|ud>4=vQ);D4 zsbwc0iY)VR2kp2~2ycs!I20g+&wFAaL=vH#H^o;Wx1?_7=^El;Zwt5c;>W3ZoT6sj zDoZwej`vCn&g#i67P{N%C+oweg2HqNJ(z+Q{Ln)@=0aZyXK9_wi5Q zCr2lhv#Bj2oeP;uwHjpIeC%woMDk5ln<C-buY%YthB<_%m@Fq>Y*Hb}m8peRw z9KM*yL$0*bFax3wNHaJZlmYNNb7fsp6X^gb$>F)ioY({4jHi6EnLWt!nOj*)vhKN_UgeT-qqT%&%txUr904VIB@T-UH-x$a?efWs2(;o# zbd3?^YK0}-P%e`8O0WThLi8Ls)kM-pnsFb6<>AdkBsF`YEWCi*|2y0=Dmo-i%N+Cn z5{GCgjc;WWxu`ruGf7->`h25+dYl|#UNj9)2)gx&MEWISU^=O$JXRLB zfjF;LUC_@uI(f&Fd&+@@rBZXJoOIwcOr0F+6a`&@y`+xKxiQ|6%rvrnkTH6qSf1-& zbjrx(*&)YYApe#-$1rDHmfza-@03SRgn>);GP0fHq&T z4%VWS+r~*!`@|)ud{N0amyAsuS5=xQXq1>AHXv(0?UX|_bFqy3pa^SZe+zE^Nrb*K zCi#mmUXCq%r*75@82eTQ9-Dpk?Yi=D4bOv08IKjU^8&XLTiXo2ujMula|JS5Gs$c& zkQZXAujWm7NbFjS4PT?*Y3eh@$=})(-DV@P1Ft(Wxy=K}WRv%Y;`je=oDdk(+Bl&$ zi0v&ss;tOV%eYOtNynmw7QR{_R8p-+na5mS9pY6OnPjumKIma-x3LH@k}-y5T60Ii zhe;c`G~^M64{R|P_q7SJn$FaWh>KGw?F(-cDDxQi_!SQ``tpDs~1hwrVp$jWF4fd(HFx2-nf z3TzYAs5vo3xx7)UjbUjT1ZFiM;ZG@ix^USLN|_s4NdkALrBO~=SBSe8zB)C>HefI{ zJ-Q^5QcEF_WtBk{EPokdqgER+x+z|1} zB*xq&|H5%S>!X`4(tn&d9wQkmN850;*Az)8Qd}_6ajM+K#p!b!s@~L?g(-$eU=XSf z4=#P5dX_K4!q}HXt4L+0+&Gzv9Wd=r-*b>5z!M_VG&5vaUTI#B9*M z1DW~cvj;R#BHGm3KU_ua^erje+A&e84Ie%PtPK@wJf!Q8TXCDL@k(jAHeeE>XqNW2 z(~!?G)8fu+G7O7nPp6=4H%JFNJTXJ%Dk{@(ZXczb2@}6C#mNAs;viC-$ncL{rhVKz zXGwe+hsRw|rF*`6Th^)_)D!69caZl!P;pwGXMJ_H)6(waFmh`}2utWo6ARS=UKipv zIG*hRpahRBbcM#cpVNZ4t%Ld?NSrvOu2AH`hR0I*GDZ1Lsj_(nE5F~v)85u8ZsfR`?QNf;o#}}x-N%svg!Xx6uafAuQjs@FJFSE|w?JVezAqwIeyZohQds;!7K!N4&U% z16(I%!uTWb_r}w4A_pyVDX6#xfStH@R)m;pltT8Jqzr;0!#KJBOvmy8_wLbc>De9H zQz8;wL~28OmgxZ&}p$$R9h!s;oH;n zAMSMG@bP6XvdrPRQMF=*73DglC3xM#-(-$WgJMu0AU#F)e_}WCHn%^{gWzDfeMpx3KQO+)HH^{S;HTJaSn9>H1Mk3c~(E{>)&EV5; z()cf3@(HQ<=UyU=B0@c>Dllt9y{1BqrjhxS+YM;>+ZxNYK2cH}lE@UbbRjy4Q7jf- z)l@t?Jvie8!*P>Tk<5woWzo#IehV$Sdv1;Y3%l^gBkI9yKyzP)k|MV0zqGT}0lO@S z1}E2Xo*&7CAwKAiN&aK$wuSpcL~il3Xp>9_-pZ;k0cT zH#KYVe2AV8JcD6)zDzm&FZ*B@3kFS4PN4wINp3{T>`KU=4xE0lyw9!J5Am?*wuGnf z-vct97xaOpuJxW4^3~Z+=?3zq&rve^`6!haONL4Z{*_^6EC{F76*zNGJj}WG} zulzihQT}!_hcogv6AAk$KpF84G60{Fni+X@vo*8Qf)L||FY#Ty{uv7(9qtZSU6vgk z+`GIyK;}%MPl^XQ7&_DxoMVu4I7AY*wD3e_4KDfqR>`)Qme$FC)0oYPaaoNGQ*R5_ zWu1gJ`HeR+fImeML!1OPGNxC1@n+qgE!IPuB1Ll-`6rLUzvmQ@pN4Kp*D$=(2zWZS zATd?QtGzD~_YeXfl^5tz>v?K zZh&0H<$g!*&gEd5V|x!nJwP>AP*H$?y)D+_{c%w+^>{fIL1T-E$7YPo*go%hLw9UO z-CarlZ`oFtpq5Ad&NyC(pVB2KMk6{$UEf{`+_6pG!`!m_H3OKbu!3wxNA4G-rR|qJ#gcN|IoM9Puj6j@REA0UqKI}aLCyN9O7v$QGK^lWAy(u{>OaGTX@>L#99$zARZ(9|CuwDZSYJhf{i zuk;DWGbxNYtEOW4Tsp5>(~ka~iP}B->!aeRP@oo2k%q9GJf`+MDJ~xZ)_peB*ZSs$ z2(@*Qt!xBy&yCZ5wksbMn{4qZ_fd@MSsveD!Y4zZcC4V}{U~U`2vppPeAe@+)XAV% z>Ww5G8j-$J2c&6HQGSWGIUi(zV#BOPJzt0u&v)SumSB*X>fYScs(j}SwcpBU?wY5;=>576YqQoh9R1Ef*Qb z?NyP{lS&$se+q#RAF+Zu!Y4EuXI3Y}b!(Ta-_oAGydV}5GL!l~&nbMygPz}>!x%I! z5S4diTyu2v9wKJmRN|LWG@jf=TEF5&28B_UJ9wcDDq}M-Xi8~S=F~Ek7;Z|gTgREw z3scqOZoz0zxV8@n-*G{Y97$eO$X^aI+@&Mrj=vG3!@};Oc5mZ*SEf} zAr~jxSxzwDO4ZO?V4IeF`3q@`fgjRzn8uaP5cv*d;S*j1abJEyE|<5Wj&fM#=(A2? zBOs$q`=T-Zr#BwVj60RMQw^F55@-^6ooEJTrXriFGLR*GA5gMkomV8Q%w;Ck_GuV8 zH&MHdvQt5q66HK4)tUuumK+=?5n;)sUg8oh*pedHwJ}wi645BLiziUaq-yPjEx)-! z)G)7wJco;LP9$iCWq;Q_PT{s&y+U7_;N9%R+k|L7ezTF-ii1OfGR+6fsR&Nso(xXD z&TgS7+>CzCkSunf?#!V|$xg)6F!S{%xyfc*bb98?bd$aers4-#y|hLd5S2s(lt#2I zHJLRj%SuFzy7_WrD=#uxN;)hV7bBxRzSIgsP#2;Ty#z~1NFG4*2~V+dXV2=N6OUi( zpYqFsA5ShyUcwNRnBzRHE1M@V)?SxyYCS(*hbN=atrU~U>IKa}`DLpL|{EHs4 zF(qqo?l!>}a5e$-E`xB>i^SNAM+BqsTz)Lm5+e<}@a=It$7FCgb@-&}Q02+c;84XJy(b z=OB{^&|qGXT%6$cjKPzpFoAI=L{?;Nl8D!Il<_s9D16PL4O13q zS+});lAOedNbw*PaW0gNpzzT-qGN|}$J2E5n7yUo?x-Kein|#2+%5}96qahn+rmAj zQTAnqh9jEb@)RV{p@kwRPCdb}aliZ>B$QhxG%(1wsDe^Shk77-=$K(Vl>7;ihF~y@`Bj^ z=mnXCWf~(qjMGJW6JN*x+QT61TUt8f-V@+6B55= z@h(Pn7s^H)jzv%|z`Z06VT^Q)0_2819^#WfxrzjF80nri(x(+k?Q|3t zlG&6Jk`GLfR#Kg37~Lw95e5W}#}L1_aVe*r*3FTeCOyXD0@Mr(1!QXT{Z-s-mziWm zDad)zgDjSfuGKp&6R7$v{a%qAM?NW|>n$-Ud}fMlhF9W}K8cdR_qx?c5^lw*Dr9r( z5(1Wx;_Pgu^ZIL7>@c!_GACmOXejadMB_=(1wk_^v0;RBm{OhLd`d-m=Pn3CK27RW zoYgdu>&%sS9%F}0PrS<~AYGr-E2#y&;9DsPv)H!Es%7UbrzMFS|3h3;POMkFgR8Kq zsUX9hH|2^&M&RX%87%W9Z6>7uXTz3s2wdk=(UDYm1-4uaG=ZQHNc9nADA79!c0NFr z)(TVlx$n_c!@K)29>K{yeLZ0=CbR9ael8_>CiEnusXxak=VY{G5dfQviz6jD3D1{L z!YOp+jm{vfBr|EYz)=pQt>+l1>8+4l>h*JF-8dMD30TxC(Tr0FaA}bqckiFfyi?Jd zunWBuF{Nn%a&RUE!(&oOK+U~=SU6*Gky%>Et^HRRHc$1J3_m}@f} z)DkPZPnchK^BoPye9i@DpY5D`UkDQYjL!$?s0Q24eQr`H?lATceuPsWTu-#@SG_}uoOzJ>dldEzH zE;ugw&X~@er0dbGr; z0}X~opE*mm+9_|$d>odK(8fJIK%|fCG_I?Jh_aQHJC=LO>C)t}Dnz59bgal=L>=C( zyy%mN-@tRt!>8-E@C<>luK-Pi+7%+(NTF#L%ZK%}PW+ME5_gB4I0~(GM}oO&2Z?+a zARE!a(Wc@oM~EmvN4e~p7be4@w?Y7A)OfjU+bkE`4;_pCRmc>nw57D@o#Q0V^PaFI zURc>E>oQtKl63K&^Y6m=KEYd8(L01Kb8q00gyfxlIDXr!fi2DR`dQP% zASf8mAtd+t##6GjhK_uTnxl3WAj^@XQIZO%>A0R4~F*Imof$-P}^M* zgJy_0P?C|=#-h+;3@YxGZ~!;ZQnlxrb*eb1`;nDm?Iy~MMpR9r6%W+*FYM6@iY^6H z4TGn=dJ4vgDCD=`YP8*9Y}{^=g^0>%r04JuCpi@s(nz2$t7tfeM#r?lQIwe?Q!9f? z16(FxjX|{4I^fhMh^b+cSg`CyvJE}i_U{wL!%bG1!YQsBs+PCK#B6fTI}Gx;`Q4Oe zu0qO+t1-7MG;kLF+h<=GOJM8|W1a*tpwn{)iG|3nZD7((Ra|MeD=y-U6rw6#O-n>65}DedlY)eM7^gh?u5mAYmM91Azh)05_fQaNKs^i`0%t(^Wbl>C6aPCWiEJJ z@=BwuCS$=C{+TXnxWvG!>fAFrkJ^rY5}3R#1Z zvYrMbNhoIgaXJcY!w%CRL&8*8^QKw|3xm=z*v5AsM=>(YbP`N?ESF`5OhQPW8w6K# ze!Co2Wld(^w&)7jmsn$J@*Dfi=-OT+lJN*VOz=pjgrL{abL&|?p>6TXF z*}=l}=AFoe!851+%XfPC6CD|k#7Y=~J zU`mI(xP-J^M+d(bOXB>8IMGDEFS5)Piql+%9Seevu|q{+TAsas;Oyq_kx$*pMc$nDWCQt`ILz zN@DB|{EJp(MmR@{@_aHSR8plSlW3Ah3Xf(?*TMf>?#blI4nCApg1F~4%4gGMkWifp zG}$L;v;VP2KAl#_p?c zpTxN4&MX%sJr~9E%FyH0cLerqNz{g;#_pUGAKrqF7>&x|ZSi^L&#m)0fJ~)H!rRnG`4hk5b)azmX;7WZt7<1@Uktgb8&8e5LO#|8Fsc z!E=1rw2P&KdRoG+E8P^m$d_}_A{7u+C=yTSH-n@@?XVMU6z6IwKXwVVR-A{`90>y# zqlfHi@0>$QTQSh}#DY6PTCr1o-=RWyi1}rv?Ba*E>rZ<&-e{#Mwo8rqs4v#FQ`FpbG2;gIg?xaburd!AWAb zQ-j#;_H2!;YV@87qoG_xV_2Q8^gt!(kff*KXwIawJEn<@@%NvRI!&F09Be~M7a<%H zr9@^B6b5A)NypfcRz67t&%wpw^i>QodrZ`l^V^OGeK~-s4E~*}+?*SU&%10AnyXAr zv0kKsTP&)XAaZJ_2bVHR&L&oroF|TWp0H7{5-_9SU(T~sj|P-Q6=}Mv5QGA=Pw?X2 z4(g}-P44S)4>^$Sb}EG!LDTB&HA8bNYtH7F;J84K_NNHYO;?dkuF1B8B|Hoz!oGQf zPF=LH$L=lgL4{^+cJqmctLP5Rx7}xk>zoce56J~@w&=pw^-}yj#tLe?F*0X@so2TY zU+iEWPk{`lNsmjYiiW%5SRvwRt6ai8&k)HY_&@|d#eB?bxREO~=LmEnr^=zSY~LH} zX`g-AX(`d$?P4V2!siY+maq5;>4+fM;$BD-7{GiCjvSokhQ(1H^}-(af?w1ShINJ> zuhCFj?EB{AjD|c&mHpEjPTlMw@@!VLS8|8|i`MWxM)Y>4#qUsvOo|{aRkUI$>kW#i zFw@eV0D)}csYovKbAyrO5s~=<<}#m>Q5a2m&fUmtowEj}paqV(-CD?3p@UHJRht!% zjvyxvq3SUiQh`x*-wCoadI>%Evu+temOEgjQoD>5H~R$R>(@3$Yh%^%dSk>z&GG-3 zm?aftt;wlt)``ljjEKsKV@b$~_fT>1L@5*}M0J?=UJEPNJzCFcp+xJCNijY(2dier zRVsS?eTdA5)ckfo#>vBKAqku$hY%ewgw@PB-Pz+<-D`~BV?oU4Bv8W~MSfF$?lpNx zm2TQF7ld$X9l10HGm~j%0_bJ{_h@tYo@;ta{CgVXxzSLS-gRcCLSQcw@E?~y6m{G% z`IJfsZS<>JrdT{gmRAsswmhuxOitI`m2;L~boQC&=!II$6xW~0BxBP8H|Pd&#t!sR zJNn)S+4eUfiNK}~IlSx%f$nA^PcyK|KiI^1m1478i;rW#u zv)hx4k%fjF5cl@3k^n~G#J$}00pAKlzn2ptHnh)3!O@diQRhZXe(waPs@QE5cPwXB zQZjI|2?F;BlS@X0x+0w$Xh?Si$2AZU(-5_M-nC|x%VLIKGg>ZmR9tY#3bE00i+40; zl;XO`ENGIn<-j-#`f~q)FRa!vLJGF4^c=4U-eJb`MTYx8&KlhI{Kf!!9N`c5>4%oN zq>!n|uY!fAq$VB8Q)7MRrf8!yH3{6RTW?L+Y8^LZUzSr=qJ&Hc?cJ42rq&A{g-@Ua zuX|l2MJ4Wpa7h%>BAu7G9fHcDS>a=&hl`m}#f{IM+2ShoO@_cR2@ImeUj51V%RW<& zoQ_A&78AhRc<6Z~%RXKfdgdAz&J< zlLSdh4C$H6Cl1VlBuYi^FeT{Qys&;O-BntG!Mp2%?&kDj`W{n_C)S)vAwwVN(lm`~ zwYFipUx9TRd(U>02R?FRmkvzys(?-efoF0qRt!R71MX#nUbE=cuTEMcymUfp!G2z* z?Xun|Lmq`Mxqfy!K`s#hZ;PqlAK5vr(sGCG?sHHoX=;sEc zpO4J+YH2RawtFRPcCI-ut^z5Bz=h_Pl%PkOh7V#Eiwin=z`F~3 z__!n=;U0WqelN4JIG-5|YsG#QkK{cV8!i(yN<3&l*#(7tXB97$LhPP|_1-=Ox;qCa zgA@d5D_(qpbzaJIhkG$R`*_rnlE=HkbWGZ=+CAxvtBM>`9*x4>(>dBS^ZGEb7kIT~ zBi;DmNXlnSihMgw30Ob|q$`~gr8rak_E|X2EXr`C9@v7R@J!AtoVY`XWyUG`KWdOi zx3z0>JMJjAyCt$@Q9eOf>=RJyQs45UBPWEatR2Z zR%|;ZZwSVX&1xg$&re-`nwPq<8<^E##FIRVvi8LsVD~*NoPBAAE}ZyaJTY0*1Dmcb zWOe><9IRBB_DqEC1lJqGSlc}^ctK^+LLWR1cipBDl|pXXDoi;v$~nUvxJ8fX86hBL zIYTDGBRM6#aebE=Ex2au_Htq*oE6n!HdBbGq@j%hxJnd>Hk@bqf&jC#4Jt+9yzUe_ zp%V-%!Y#TIpGZ{?%@Vnl(P&JsTpH3v(|mS(8ihy=_DEwbZVM-<$t}PKmkU?$cTaXQ zSgFm8F=&(-aKZe!^XJc(0pO*Dew<@(vQa}}-*JpgbX@NWPKb8$2=t-I%4VD`W_yBg zpQ{~e9a5OQ+X>JJb9u_bpq_-d;{Fr717hV4#|`8wrV%F+$Fl5+5q4MNzj(yNJ|3Eu zOJr2JN13iocN!-P*S1YCFPqiqG{T**+O3X7@5HR?tsB=H&ESMVVL-UXU6wsQX*k@Op-v*uCJe3Y2>oXW71Mu z`C=4La-JhlBo;B#O9(zBlZ_&xFz5~o&3*aGSD}FN>Fr^HI&zG2)kncpZnre8TemPZ S78#G)DJH?f(JKps0ud literal 0 HcmV?d00001 diff --git a/po/kn.po b/po/kn.po new file mode 100644 index 0000000..bc992ab --- /dev/null +++ b/po/kn.po @@ -0,0 +1,2082 @@ +# translation of glib.master.kn.po to Kannada +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Shankar Prasad , 2007, 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.kn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-10 12:23+0530\n" +"Last-Translator: Shankar Prasad \n" +"Language-Team: Kannada \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s'ಘಟಕಕ್ಕೆ ಅನಪೇಕ್ಷಿತ ಗುಣ ವಿಶೇಷ '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' ದ ಘಟಕಕ್ಕೆ '%s' ಗುಣವಿಶೇಷ ಪತ್ತೆಯಾಗಿಲ್ಲ" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ಅನಪೇಕ್ಷಿತ ಪದಗುಚ್ಛ '%s', ಪದಗುಚ್ಛ '%s' ವನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s' ದ ಒಳಗೆ ಅನಪೇಕ್ಷಿತ ಪದಗುಚ್ಛ '%s" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "ದತ್ತಾಂಶ ಕೋಶದಲ್ಲಿ ಯಾವುದೇ ಮಾನ್ಯ ಬುಕ್ ಮಾರ್ಕ್ ಕಂಡು ಬಂದಿಲ್ಲ" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' ಗೆ ಈಗಾಗಲೆ ಒಂದು ಬುಕ್ ಮಾರ್ಕ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' ಗೆ ಯಾವುದೇ ಬುಕ್ ಮಾರ್ಕ್ ಕಂಡು ಬಂದಿಲ್ಲ" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' ಗಾಗಿನ ಬುಕ್ ಮಾರ್ಕಿನಲ್ಲಿ ಯಾವುದೇ MIME ಪ್ರಕಾರವು ಕಂಡುಬಂದಿಲ್ಲ" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' ನ ಬುಕ್ ಮಾರ್ಕಿನಲ್ಲಿ ಯಾವುದೇ ಖಾಸಗಿ ನಿಶಾನೆಯು ಸೂಚಿತವಾಗಿಲ್ಲ" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' ಗಾಗಿ ಯಾವುದೇ ಸಮೂಹವು ಸಂಯೋಜಿತವಾಗಿಲ್ಲ" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' ಎಂಬ ಹೆಸರಿನ ಯಾವುದೇ ಅನ್ವಯವು '%s' ಗಾಗಿ ಒಂದು ಬುಕ್-ಮಾರ್ಕನ್ನು ನೊಂದಾಯಿಸಿಲ್ಲ" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec ಸಾಲು '%s' ಅನ್ನು URI '%s' ನೊಂದಿಗೆ ವಿಸ್ತರಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' ಅಕ್ಷರಗಳಿಂದ '%s' ಗೆ ಪರಿವರ್ತಿಸುವುದು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' ನಿಂದ '%s'ಗೆ ಪರಿವರ್ತಕವನ್ನು ತೆರೆಯಲಾಗುತ್ತಿಲ್ಲ" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "ಪರಿವರ್ತಿತ ಆದಾನದಲ್ಲಿನ ಬೈಟ್ ಅನುಕ್ರಮ ಅಮಾನ್ಯವಾಗಿದೆ" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "ಪರಿವರ್ತಿಸುವಾಗ ದೋಷ: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "ಆದಾನದ ಕೊನೆಯಲ್ಲಿ ಆಂಶಿಕ ಅಕ್ಷರ ಅನುಕ್ರಮಣೆ" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "fallback '%s' ಅನ್ನು ಸಂಕೇತಸೆಟ್ '%s' ಗೆ ಪರಿವರ್ತಿಸಲಾಗಿಲ್ಲ" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"ಕಡತ\" ವಿಧಾನವನ್ನು ಬಳಸುವ ಒಂದು ಪರಿಪೂರ್ಣವಾದ URI ಅಲ್ಲ" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ಸ್ಥಳೀಯ ಕಡತ URI '%s' ಒಂದು '#' ಅನ್ನು ಹೊಂದಿಲ್ಲದಿರಬಹುದು" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ಅಮಾನ್ಯವಾಗಿದೆ" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' ನ ಅತಿಥೇಯದ ಹೆಸರು ಸರಿಯಿಲ್ಲ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' ಅಮಾನ್ಯವಾಗಿ ನುಣುಚಿಕೊಂಡ ಚಿಹ್ನೆಗಳನ್ನು ಒಳಗೊಂಡಿದೆ" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ಪಥದ ಹೆಸರು '%s' ಒಂದು ಪರಿಪೂರ್ಣವಾದ ಪಥವಲ್ಲ" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "ಅಮಾನ್ಯವಾದ ಅತಿಥೇಯದ ಹೆಸರು" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "ಕಡತ ಕೋಶ '%s' ವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu ಬೈಟ್‍ಗಳನ್ನು, \"%s\" ಕಡತವನ್ನು ಓದುವಂತೆ ನಿಯೋಜಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ಕಡತ \"%s\" ವು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ಕಡತದಿಂದ ಓದುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ಅನ್ನು ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ಕಡತದಿಂದ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪಡೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fstat() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ: fdopen() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ಕಡತವನ್ನು '%s' ಕ್ಕೆ ಪುನರ್ ನಾಮಕರಣ ಮಾಡುವಲ್ಲಿ: g_rename() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"ಕಡತ '%s' ವನ್ನು ಬರೆಯಲು ಅನುವಾಗುವಣ್ತೆ ತೆರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fdopen() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ಕಡತ '%s'ವನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fwrite() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ಕಡತ '%s'ವನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fflush() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ಕಡತ '%s'ವನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fsync()) ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ಕಡತ '%s' ವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ವಿಫಲತೆ: fclose() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ '%s' ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕಲಾಗುವುದಿಲ್ಲ: g_unlink() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ಮಾದರಿ '%s' ಅಮಾನ್ಯವಾಗಿದೆ, ಅದು ಒಂದು '%s' ಅನ್ನು ಹೊಂದಿರುವಂತಿಲ್ಲ" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ಮಾದರಿ '%s' ಯು XXXXXX ಅನ್ನು ಹೊಂದಿಲ್ಲ" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕ್ '%s' ಅನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕುಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' ನಿಂದ '%s' ಗೆ ಪರಿವರ್ತಕವನ್ನು ತೆರೆಯಲು ಆಗಿಲ್ಲ: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ನಲ್ಲಿ ಒಂದು ಹಗುರ ಓದನ್ನು ಮಾಡಲಾಗಲಿಲ್ಲ" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "ಪರಿವರ್ತಿತವಾಗದೆ ಬಾಕಿ ಉಳಿದ ದತ್ತಾಂಶಗಳು ಓದು-ಬಫರಿನಲ್ಲಿ" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "ಮಾರ್ಗವು ಒಂದು ಆಂಶಿಕ ಅಕ್ಷರದಲ್ಲಿ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end ನಲ್ಲಿ ಒಂದು ಹಗುರ ಓದನ್ನು ಮಾಡಲಾಗಲಿಲ್ಲ" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ಕಡತ '%s' ವನ್ನು ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ: ತೆರೆಯುವುದು() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ವನ್ನು ನಕ್ಷೆ ಕಡತಮಾಡುವಲ್ಲಿ ವಿಫಲ: mmap() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d ಸಾಲಿನ %d ಚಿಹ್ನೆಯಲ್ಲಿ ದೋಷ: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ಹೆಸರಿನಲ್ಲಿ ಅಮಾನ್ಯ UTF-8 ಎನ್ಕೋಡ್ ಆದ ಪಠ್ಯವಿದೆ - ಮಾನ್ಯವಾದ '%s' ಅಲ್ಲ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ಯು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ಯು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d ಸಾಲಿನಲ್ಲಿ ದೋಷ: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' ಅನ್ನು parse ಮಾಡುವಲ್ಲಿ ವಿಫಲ, ಇದು ಒಂದು ಉಲ್ಲೇಖ ಅಕ್ಷರದ ಒಳಗಿನ ಒಂದು " +"ಅಂಕಿಯಾಗಿರಬೇಕಿತ್ತು(ê ಉದಾಹರಣೆಗೆ) - ಬಹುಷಃ ಅಂಕಿಯು ಬಹಳ ದೊಡ್ಡದಾಗಿರಬೇಕು" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"ಅಕ್ಷರ ಉಲ್ಲೇಖವು ಒಂದು ಅರ್ಧವಿರಾಮ ಚಿಹ್ನೆಯಿಂದ ಕೊನೆಗೊಂಡಿಲ್ಲ; ಹೆಚ್ಚಿನ ಪಕ್ಷ ನೀವು ಒಂದು " +"ಘಟಕವನ್ನು ಆರಂಭಿಸುವ ಉದ್ದೇಶವಿಲ್ಲದೇ ampersand ಅಕ್ಷರವನ್ನು ಬಳಸಿದ್ದೀರಿ - ampersand ನಿಂದ " +"ಹೊರಬರಲು & ಎಂದು ಮಾಡಿ" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ಅಕ್ಷರ ಉಲ್ಲೇಖ '%-.*s' ವು ಒಂದು ಅನುಮತಿ ಇರುವ ಅಕ್ಷರವನ್ನು encode ಮಾಡುವುದಿಲ್ಲ" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ಖಾಲಿ ಘಟಕ '&;' ಕಂಡು ಬಂದಿದೆ; ಮಾನ್ಯ ನಮೂದುಗಳೆಂದರೆ: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ನಮೂದಿನ ಹೆಸರು '%-.*s' ತಿಳಿದಿಲ್ಲ" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"ಘಟಕವು ಒಂದು ಅರ್ಧವಿರಾಮ ಚಿಹ್ನೆಯಿಂದ ಕೊನೆಗೊಂಡಿಲ್ಲ; ಹೆಚ್ಚಿನ ಪಕ್ಷ ನೀವು ಒಂದು ಘಟಕವನ್ನು " +"ಆರಂಭಿಸುವ ಉದ್ದೇಶವಿಲ್ಲದೇ ampersand ಅಕ್ಷರವನ್ನು ಬಳಸಿದ್ದೀರಿ - ampersand ನಿಂದ ಹೊರಬರಲು " +"& ಎಂದು ಮಾಡಿ" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ದಸ್ತಾವೇಜುಗಳು ಒಂದು ಅಂಶದಿಂದ ಆರಂಭಗೊಳ್ಳಬೇಕು (e.g. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' ಅಕ್ಷರವು ಬಂದ ನಂತರ, '%s' ವು ಒಂದು ಮಾನ್ಯವಲ್ಲದ ಅಕ್ಷರವಾಗಿದೆ; ಅದು ಒಂದು ಅಂಶದ ಹೆಸರನ್ನು " +"ಆರಂಭಿಸದೇ ಇರಬಹುದು" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"ಸರಿಯಲ್ಲದ ಅಕ್ಷರ '%s', '%s' ಖಾಲಿ ಅಂಶದ ಟ್ಯಾಗಿನ ಆರಂಭವು ಒಂದು '>' ಅಕ್ಷರದಿಂದ " +"ಕೊನೆಗೊಳ್ಳಬೇಕು ಎಂದು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ಸರಿಯಲ್ಲದ ಅಕ್ಷರ '%s', '%s'ವು '%s' ಅಂಶದ ಗುಣಲಕ್ಷಣ ಹೆಸರಾಗಿದ್ದು ಅದರ ನಂತರ ಒಂದು '=' " +"ಅನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"ಸರಿಯಲ್ಲದ ಅಕ್ಷರ '%s', '%s' ಅಂಶದ ಟ್ಯಾಗಿನ ಆರಂಭವು ಒಂದು '>' ಅಥವ '/' ಅಕ್ಷರದಿಂದ " +"ಕೊನೆಗೊಳ್ಳಬೇಕು ಎಂದು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು, ಅಥವ ಆಯ್ಕಾತ್ಮಕವಾಗಿ ಒಂದು ಗುಣಲಕ್ಷಣ; ಬಹುಷಃ ನೀವು " +"ಅಮಾನ್ಯ ಅಕ್ಷರವನ್ನು ಒಂದು ಗುಣಲಕ್ಷಣದ ಹೆಸರಿನಲ್ಲಿ ಬಳಸಿದ್ದೀರೆಂದು ತೋರುತ್ತದೆ" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"ಸರಿಯಲ್ಲದ ಅಕ್ಷರ '%s', ಗುಣಲಕ್ಷಣ '%s'ವು '%s' ದ ಅಂಶವಾಗಿದ್ದು, ಇದಕ್ಕೆ ಒಂದು ಮೌಲ್ಯವನ್ನು " +"ಕೊಡುವಾಗ ಸಮ ಚಿಹ್ನೆಯ ನಂತರ ಒಂದು ಮುಕ್ತ ಉದ್ಧರಣ ಚಿಹ್ನೆಯನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' ವು ಮುಚ್ಚಲ್ಪಟ್ಟ ಅಂಶ ಹೆಸರು '%s' ನಂತರ ಬರುವ ಒಂದು ಮಾನ್ಯವಾದ ಅಕ್ಷರವಲ್ಲ; '>' ವು " +"ಅನುಮತಿ ಇರುವ ಅಕ್ಷರವಾಗಿರುತ್ತದೆ" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ಅಂಶವು '%s' was closed, no element is currently open" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ಅಂಶ '%s' ವು ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ, ಆದರೆ ಪ್ರಸ್ತುತ ಮುಕ್ತವಾಗಿರುವ ಅಂಶವೆಂದರೆ '%s' ಆಗಿದೆ" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ದಸ್ತಾವೇಜು ಖಾಲಿಯಾಗಿತ್ತು ಅಥವ ಕೇವಲ ಕೇವಲ ಖಾಲಿ ಜಾಗಗಳನ್ನು ಹೊಂದಿತ್ತು" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಮುಕ್ತ ಕೋನ ಆವರಣ ಚಿಹ್ನೆ '<' ಯ ನಂತರ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ಅಂಶಗಳು ತೆರೆದಿರುವಾಗಲೇ ದಸ್ತಾವೇಜು ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ - '%s' ಯು ತೆರೆಯಲ್ಪಟ್ಟ " +"ಕೊನೆಯ ಅಂಶ" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ದಸ್ತಾವೇಜು ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ, <%s/> ಟ್ಯಾಗಿನ ಕೊನೆಯಲ್ಲಿ ಒಂದು ಮುಕ್ತ ಕೋನ ಆವರಣ " +"ಚಿಹ್ನೆಯನ್ನು ಕಾಣಲು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಅಂಶದ ಹೆಸರಿನಲ್ಲಿ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಗುಣಲಕ್ಷಣ ಹೆಸರಿನಲ್ಲಿ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಅಂಶ ತೆರೆಯುವ ಟ್ಯಾಗಿನ ಒಳಗೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ದಸ್ತಾವೇಜು ಒಂದು ಗುಣಲಕ್ಷಣದ ಹೆಸರಿನ ನಂತರದ ಸಮ ಚಿಹ್ನೆಯ ನಂತರ ಅನಿರೀಕ್ಷಿತವಾಗಿ " +"ಕೊನೆಗೊಂಡಿದೆ; ಯಾವುದೇ ಗುಣಲಕ್ಷಣ ಮೌಲ್ಯವಿಲ್ಲ" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಗುಣಲಕ್ಷಣ ಮೌಲ್ಯದ ಒಳಗಿರುವಾಗ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಅಂಶ'%s'ದ ಮುಚ್ಚಲ್ಪಟ್ಟ ಟ್ಯಾಗಿನ ಒಳಗೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಹೇಳಿಕೆ ಅಥವ ಪ್ರಕ್ರಿಯೆ ಸೂಚನೆಯ ಒಳಗೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ಭ್ರಷ್ಟಗೊಂಡ ವಸ್ತು" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "ಆಂತರಿಕ ದೋಷ ಅಥವ ಭ್ರಷ್ಟಗೊಂಡ ವಸ್ತು" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ಮೆಮೊರಿ ಖಾಲಿಯಾಗಿದೆ" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ಹಿಂಬಾಲಿಸುವ ಮಿತಿ ತಲುಪಿದೆ" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "ಆಂಶಿಕ ಹೊಂದಾಣಿಕೆಗೆ ಬೆಂಬಲಿತವಾಗದ ಅಂಶಗಳನ್ನು ಈ ವಿನ್ಯಾಸವು ಹೊಂದಿದೆ" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "ಆಂತರಿಕ ದೋಷ" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"ಆಂಶಿಕ ತಾಳೆಗೆ ಪರಿಸ್ಥಿತಿಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ ಆದ್ದರಿಂದ ಹಿಂಬದಿಯ ಉಲ್ಲೇಖಗಳನ್ನು ಬಳಸಲಾಗುವುದು" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "ರಿಕರ್ಶನ್ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ಖಾಲಿ ಉಪಸಾಲುಗಳಿಗಾಗಿನ ಕಾರ್ಯಕ್ಷೇತ್ರದ ಮಿತಿಯನ್ನು ತಲುಪಲ್ಪಟ್ಟಿದೆ" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ಹೊಸಸಾಲು ಗುರುತುಗಳ ಅಮಾನ್ಯ ಸಂಯೋಜನೆ" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ಗೊತ್ತಿರದ ದೋಷ" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ನಮೂನೆಯ ಕೊನೆಯಲ್ಲಿ" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ನಮೂನೆಯ ಕೊನೆಯಲ್ಲಿ" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರಗಳು ಕಂಡುಬರುತ್ತವೆ \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ಕೇಸ್-ಬದಲಾವಣೆಗಳ ಎಸ್ಕೇಪ್‍ಗಳಿಗೆ (\\l, \\L, \\u, \\U) ಅನುಮತಿ ಇಲ್ಲ" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} ಕ್ವಾಂಟಿಫೈರಿನಲ್ಲಿ ಸಂಖ್ಯೆಗಳು ಕ್ರಮದಲ್ಲಿ ಇಲ್ಲ" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} ಕ್ವಾಂಟಿಫಯರಿನಲ್ಲಿನ ಸಂಖ್ಯೆಯು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "ಕ್ಯಾರೆಕ್ಟರ್ ವರ್ಗವು ಕೊನೆಗೊಳ್ಳಬೇಕಿದ್ದ ] ಕಾಣೆಯಾಗಿದೆ" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ಕ್ಯಾರೆಕ್ಟರ್ ವರ್ಗದಲ್ಲಿನ ಪಾರು ಅನುಕ್ರಮವು ಅಮಾನ್ಯವಾಗಿದೆ" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "ಕ್ಯಾರೆಕ್ಟರ್ ವರ್ಗದಲ್ಲಿ ವ್ಯಾಪ್ತಿಯು ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ಪುನರಾವರ್ತಿಸಲು ಏನೂ ಇಲ್ಲ" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? ನ ನಂತರ ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರ" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< ಯ ನಂತರ ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರ" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P ಯ ನಂತರ ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರ" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX ಹೆಸರಿಸಲಾದ ವರ್ಗಗಳು ಕೇವಲ ಒಂದು ವರ್ಗದಲ್ಲಿ ಮಾತ್ರ ಬೆಂಬಲ ಹೊಂದಿರುತ್ತವೆ" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "ಕೊನೆಗೊಳಿಸುವ ) ಕಾಣೆಯಾಗಿದೆ" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ತೆರೆಯಲ್ಪಡದೆ (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ಅಥವ (?[+-] ಡಿಜಿಟ್‍ಗಳು ) ಅನ್ನು ಅನುಸರಿಸಬೇಕು" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇರದ ಉಪವಿನ್ಯಾಸದ ಉಲ್ಲೇಖ" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "ಕಮೆಂಟ್‍ನ ನಂತರ ) ವು ಕಾಣೆಯಾಗಿದೆ" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆ ಬಹಳ ಉದ್ದವಾಗಿದೆ" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "ಮೆಮೊರಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ವಿಫಲವಾಗಿದೆ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "ಹಿಂದೆನೋಡು ಪ್ರತಿಪಾದನೆಯು ನಿಗದಿತ ಉದ್ದವನ್ನು ಹೊಂದಿಲ್ಲ" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( ನಂತರದ ಸಂಖ್ಯೆ ಅಥವ ಹೆಸರು ವಿರೂಪಗೊಂಡಿದೆ" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "ಶರತ್ತಿನ ಸಮೂಹವು ಎರಡಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಶಾಖೆಗಳನ್ನು ಹೊಂದಿದೆ" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( ನಂತರ ಪ್ರತಿಪಾದನೆಯನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ಗೊತ್ತಿರದ POSIX ವರ್ಗದ ಹೆಸರು" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "ಘಟಕಗಳ POSIX ಹೋಲಿಕೆಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ಅನುಕ್ರಮದಲ್ಲಿನ ಅಕ್ಷರ ಮೌಲ್ಯವು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ಸರಿಯಲ್ಲದ (?(0) ಸ್ಥಿತಿ" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "ಹಿಂದೆನೋಡು ಪ್ರತಿಪಾದನೆಯಲ್ಲಿ \\C ಗೆ ಅನುಮತಿ ಇಲ್ಲ" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "ಪುನರಾವರ್ತಿತ ಕರೆಯು ಅನಿರ್ದಿಷ್ಟವಾಗಿ ಆವರ್ತಿತಗೊಳ್ಳಬಹುದು" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ಉಪನಮೂನೆಯ ಹೆಸರಿನಲ್ಲಿ ಟರ್ಮಿನೇಟರ್ ಕಾಣಿಸುತ್ತಿಲ್ಲ" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "ಹೆಸರಿಸಲಾದ ಎರಡು ಉಪನಮೂನೆಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ವಿರೂಪಗೊಂಡ\\P ಅಥವ \\p ಅನುಕ್ರಮ" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ಅಥವ \\p ಯ ನಂತರ ಗೊತ್ತಿರದ ಗುಣಲಕ್ಷಣದ ಹೆಸರು" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ಉಪನಮೂನೆಯ ಹೆಸರು ಬಹಳ ಉದ್ದವಾಗಿದೆ (ಗರಿಷ್ಟ 32 ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬಹುದು)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ಬಹಳಷ್ಟು ಹೆಸರಿಸಲ್ಪಟ್ಟ ಉಪನಮೂನೆಗಳು (ಗರಿಷ್ಟ 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "\\377 ಕ್ಕೂ ದೊಡ್ಡದಾದ ಆಕ್ಟಲ್ ಮೌಲ್ಯ" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಶಾಖೆಯನ್ನು ಹೊಂದಿರುವ ಸಮೂಹವನ್ನು DEFINE ಮಾಡು" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "ಒಂದು ಸಮೂಹವನ್ನು ಮತ್ತೆ ಮತ್ತೆ DEFINE ಮಾಡಲು ಅನುಮತಿ ಇಲ್ಲ" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "ಅಸಂಜಸವಾದ NEWLINE ಆಯ್ಕೆಗಳು" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g ದ ನಂತರ ಒಂದು ಬ್ರೇಸ್ ಆದ ಹೆಸರು ಅಥವ ಆಯ್ಕಾತ್ಮಕ ಬ್ರೇಸ್ ಆದಂತಹ ಶೂನ್ಯವಲ್ಲದ ಸಂಖ್ಯೆ ಇಲ್ಲ" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ಅನಿರೀಕ್ಷಿತ ಪುನರಾವರ್ತನೆ" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "ಕೋಡ್ ಓವರ್-ಫ್ಲೋ" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "ಸಂಕಲಿಸುವ ಕಾರ್ಯಕ್ಷೇತ್ರವು overran ಆಗಿದೆ" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "ಈ ಮೊದಲು ಪರೀಕ್ಷಿಸಲಾದ ಉಲ್ಲೇಖ ಉಪವಿನ್ಯಾಸ ಕಂಡುಬಂದಿಲ್ಲ" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆಯ %s ಅನ್ನು ಹೊಂದಾಣಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "UTF8 ಬೆಂಬಲವಿಲ್ಲದೆ PCRE ಭಂಡಾರವು ಸಂಕಲಿತಗೊಂಡಿದೆ" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "UTF8 ಗುಣಲಕ್ಷಣಗಳ ಬೆಂಬಲವಿಲ್ಲದೆ PCRE ಭಂಡಾರವು ಸಂಕಲಿತಗೊಂಡಿದೆ" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆಯ %s ಅನ್ನು char %d ನಲ್ಲಿ ಸಂಕಲಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆಯ %s ಅನ್ನು ಸರಳೀಕರಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "ಷೋಡ-ದಶಮಾನ ಅಂಕಿ ಅಥವ '}' ಅನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿದೆ" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "ಷೋಡ-ದಶಮಾನ ಅಂಕಿಯನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿದೆ" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖದಲ್ಲಿ '<' ಕಾಣೆಯಾಗಿದೆ" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "ಅಪೂರ್ಣಗೊಂಡಿರುವ ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "ಶೂನ್ಯ-ಉದ್ದದ ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "ಅಪೇಕ್ಷಿತ ಅಂಕಿ" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ನಿಯಮ ಬಾಹಿರವಾದ ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "ಅಪರೂಪದ ಅಂತ್ಯ '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ಗೊತ್ತಿರದ ಪಾರು ಅನುಕ್ರಮ" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ಬದಲಾಯಿಸಲ್ಪಟ್ಟ ಪಠ್ಯ \"%s\"ಅನ್ನು char %lu ನಲ್ಲಿ ಪಾರ್ಸಿಂಗ್ ಮಾಡುವಾಗಿನ ದೋಷ: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ಉದ್ಧರಿತ ಪಠ್ಯವು ಒಂದು ಉದ್ಧರನ ಚಿಹ್ನೆಯಿಂದ ಆರಂಭಗೊಳ್ಳುವುದಿಲ್ಲ" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"ಆಜ್ಞಾ ಸಾಲಿನಲ್ಲಿ ಅಥವ ಇತರೆ ಶೆಲ್ಲಿನಲ್ಲಿ ಉದ್ಧರಿಸಲಾದ ಪಠ್ಯದಲ್ಲಿ ತಾಳೆಯಾಗದ ಉದ್ಧರಣಚಿಹ್ನೆಗಳು" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ಪಠ್ಯವು ಒಂದು '\\' ಅಕ್ಷರದ ನಂತರ ಅಂತ್ಯಗೊಂಡಿತು. (ಪಠ್ಯವು '%s' ಆಗಿತ್ತು)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c ಗಾಗಿನ (ಪಠ್ಯವು '%s' ಆಗಿತ್ತು)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ಪಠ್ಯವು ಖಾಲಿಯಾಗಿತ್ತು (ಅಥವ ಕೇವಲ ಖಾಲಿಜಾಗಗಳನ್ನು ಹೊಂದಿತ್ತು)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "child ಪ್ರಕ್ರಿಯೆಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ಉಪ ಪ್ರಕ್ರಿಯೆಯೊಂದಿಗೆ ಸಂವಹನಕ್ಕೆ ಪೈಪನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "child pipe (%s) ನಿಂದ ಓದುವಲ್ಲಿ ವಿಫಲತೆ" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ಕೋಶಕ್ಕೆ ಬದಲಾಯಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ (%s) ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲತೆ" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "ಅಮಾನ್ಯವಾದ ಪ್ರೋಗ್ರಾಂ ಹೆಸರು: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d ದಲ್ಲಿರುವ ಆರ್ಗ್ಯುಮೆಂಟ್ ವೆಕ್ಟರಿನಲ್ಲಿನ ಅಮಾನ್ಯ ಸಾಲು: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ಪರಿಸರದಲ್ಲಿನ ಅಮಾನ್ಯ ಸಾಲು: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ಅಮಾನ್ಯ ಕಾರ್ಯಕಾರಿ ಕೋಶ: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ಸಹಾಯಕ ಪ್ರೊಗ್ರಾಂ (%s) ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲತೆ" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"child ಪ್ರಕ್ರಿಯೆ ಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಾಗ g_io_channel_win32_poll() ನಲ್ಲಿ ಅನಪೇಕ್ಷಿತ " +"ದೋಷ" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ (%s) ಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲ" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ (%s) ಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಾಗ select() ನಲ್ಲಿ ಅನಪೇಕ್ಷಿತ ದೋಷ" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() ನಲ್ಲಿ ಅನಪೇಕ್ಷಿತ ದೋಷ (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "ಕವಲೊಡೆಸುವಲ್ಲಿ ವಿಫಲತೆ (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ \"%s\" (%s) ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"child ಪ್ರಕ್ರಿಯೆಯ ಆದಾನ ಅಥವ ಪ್ರದಾನವನ್ನು ಪುನರ್ನಿರ್ದೇಶಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆಯನ್ನು ಕವಲೊಡೆಯಲು ವಿಫಲಗೊಂಡಿದೆ (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "child ಪ್ರಕ್ರಿಯೆ \"%s\" ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಾಗ ಗೊತ್ತಿರದ ದೋಷ" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "child pid pipe (%s) ಇಂದ ಸಾಕಷ್ಟು ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "ಅಕ್ಷರವು UTF-8 ನ ವ್ಯಾಪ್ತಿ ಇಂದ ಹೊರಗಿದೆ" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "ಆದಾನ ಪರಿವರ್ತನೆಯಲ್ಲಿ ಅಮಾನ್ಯ ಅನುಕ್ರಮ" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "ಅಕ್ಷರವು UTF-16 ನ ವ್ಯಾಪ್ತಿ ಇಂದ ಹೊರಗಿದೆ" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ಬಳಕೆ:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "ಸಹಾಯ ಆಯ್ಕೆಗಳು:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "ಸಹಾಯ ಆಯ್ಕೆಯನ್ನು ತೋರಿಸು" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "ಎಲ್ಲಾ ಸಹಾಯ ಅಂಶಪಟ್ಟಿಯನ್ನು ತೋರಿಸು" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "ಅನ್ವಯದ ಆಯ್ಕೆಗಳು:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr " for %s ಕ್ಕಾಗಿನ ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯ '%s' ಅನ್ನು ಶಬ್ಧಲಕ್ಷಣ ಹೇಳಲಾಗಿಲ್ಲ" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s ಕ್ಕಾಗಿನ ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯ '%s' ವು ವ್ಯಾಪ್ತಿಯಿಂದ ಹೊರಗಿದೆ" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' ದ %s ಕ್ಕಾಗಿನ ದ್ವಿಮೌಲ್ಯವನ್ನು parse ಮಾಡಲಾಗಿಲ್ಲ" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%s ಕ್ಕಾಗಿನ '%s' ದ್ವಿ ಮೌಲ್ಯವು ವ್ಯಾಪ್ತಿಯಿಂದ ಹೊರಗಿದೆ" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s ಆಯ್ಕೆಯ ಶಬ್ಧಲಕ್ಷಣವನ್ನು ಹೇಳುವಾಗ ದೋಷ" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ಗೆ ಆರ್ಗ್ಯುಮೆಂಟ್ ಕಾಣುತ್ತಿಲ್ಲ" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "ಗೊತ್ತಿರದ ಆಯ್ಕೆ %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "ಹುಡುಕು ಕೋಶದಲ್ಲಿ ಮಾನ್ಯ ಕೀಲಿ ಪತ್ತೆಯಾಗಿಲ್ಲ" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ಒಂದು ಸಾಮಾನ್ಯ ಕಡತವಲ್ಲ" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ಕಡತವು ಖಾಲಿ ಇದೆ" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ಕೀಲಿ ಕಡತವು '%s' ಸಾಲನ್ನು ಹೊಂದಿದೆ, ಇದು ಒಂದು ಕೀಲಿ-ಮೌಲ್ಯ ಜೋಡಿ, ಸಮೂಹ, ಅಥವ ಹೇಳಿಕೆಯಲ್ಲ" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "ಅಮಾನ್ಯ ಸಮೂಹ ಹೆಸರು: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "ಕೀಲಿ ಕಡತವು ಒಂದು ಸಮೂಹದೊಂದಿಗೆ ಆರಂಭಗೊಳ್ಳುವುದಿಲ್ಲ" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "ಅಮಾನ್ಯ ಕೀಲಿ ಹೆಸರು: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಬೆಂಬಲಿತವಲ್ಲದ encoding '%s'ಅನ್ನು ಹೊಂದಿದೆ" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಸಮೂಹ '%s'ವನ್ನು ಹೊಂದಿಲ್ಲ" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿಲ್ಲ" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು UTF-8 ಅಲ್ಲದ ಮೌಲ್ಯವಾದ '%s'ವನ್ನು ಹೊಂದಿದೆ " + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು ಮೌಲ್ಯವನ್ನು ವಿವರಿಸಲಾಗುವುದಿಲ್ಲ." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ಕೀಲಿ ಕಡತವು ವಿವರಿಸಲು ಸಾಧ್ಯವಾಗದೆ ಇರುವಂತಹ ಕೀಲಿ '%s'ಯ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿದೆ." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು ಸಮೂಹ '%s'ದ್ದಾಗಿದ್ದು ಹಾಗು ಅದರ ಮೌಲ್ಯವನ್ನು " +"ವಿವರಿಸಲಾಗುವುದಿಲ್ಲ." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಕೀಲಿ'%s' ಯನ್ನು ಗುಂಪು '%s'ನಲ್ಲಿ ಹೊಂದಿಲ್ಲ" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "ಕೀಲಿ ಕಡತವು ಸಾಲಿನ ಕೊನೆಯಲ್ಲಿ ಪಾರು ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿದೆ" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಅಮಾನ್ಯ ಪಾರು ಅನುಕ್ರಮವನ್ನು ಹೊಂದಿದೆ '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ಮೌಲ್ಯ '%s' ವನ್ನು ಒಂದು ಸಂಖ್ಯೆಯಾಗಿ ಸೂಚಿಸಲು ಆಗುವುದಿಲ್ಲ." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯ '%s' ವು ವ್ಯಾಪ್ತಿಯನ್ನು ಮೀರಿದೆ" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "ಮೌಲ್ಯ '%s' ವನ್ನು ಒಂದು ತೇಲು ಸಂಖ್ಯೆ ಆಗಿ ವಿವರಿಸಲು ಆಗುವುದಿಲ್ಲ." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ಮೌಲ್ಯ '%s' ವನ್ನು ಒಂದು ಬೂಲಿಯನ್ ಆಗಿ ವಿವರಿಸಲು ಆಗುವುದಿಲ್ಲ." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ಗೆ ಬಹಳ ದೊಡ್ಡದಾದ ಎಣಿಕೆ ಮೌಲ್ಯವನ್ನು ರವಾನಿಸಲಾಗಿದೆ" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "ಸ್ಟ್ರೀಮ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "ಕಾರ್ಯವು ರದ್ದುಗೊಂಡಿದೆ" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "ಅಮಾನ್ಯವಾದ ಸಾಕೆಟ್, ಆರಂಭಿಸಲಾಗಿಲ್ಲ" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "ಪರಿವರ್ತಿತ ಆದಾನದಲ್ಲಿನ ಬೈಟ್ ಅನುಕ್ರಮ ಅಮಾನ್ಯವಾಗಿದೆ" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "ಸಾಕೆಟ್‌ ವಿಳಾಸಕ್ಕಾಗಿ ಸಾಕಷ್ಟು ಸ್ಥಳವಿಲ್ಲ" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "ರದ್ದುಗೊಳಿಸಬಹುದಾದ ಆರಂಭಕ್ಕೆ ಬೆಂಬಲವಿಲ್ಲ" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "ಗೊತ್ತಿರದ ಬಗೆ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ಕಡತದ ಬಗೆ" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s ಬಗೆ" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ಸ್ಟ್ರೀಮ್‍ನ ಅನಿರೀಕ್ಷಿತ ಕ್ಷಿಪ್ರ ಅಂತ್ಯ" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "ಹೆಸರಿಸಲಾಗದ" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ಗಣಕತೆರೆ ಕಡತವು Exec ಕ್ಷೇತ್ರವನ್ನು ಸೂಚಿಸಿಲ್ಲ" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "ಅನ್ವಯಕ್ಕೆ ಅಗತ್ಯವಿರುವ ಟರ್ಮಿನಲ್‍ ಅನ್ನು ಪತ್ತೆಮಾಡಲಾಗಲಿಲ್ಲ" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ಬಳಕೆದಾರ ಅನ್ವಯ ಸಂರಚನಾ ಫೋಲ್ಡರ್ %s ಅನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ಬಳಕೆದಾರ MIME ಸಂರಚನಾ ಫೋಲ್ಡರ್ %s ಅನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ಬಳಕೆದಾರನ ಡೆಸ್ಕ್‍ಟಾಪ್ ಕಡತ %s ಅನ್ನು ತೆರೆಯಲಾಗಿಲ್ಲ" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ಗಾಗಿನ ಕಸ್ಟಮ್ ವಿವರಣೆ" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ಹೊರತಳ್ಳುವುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ಡ್ರೈವ್ ಹೊರತಳ್ಳುವುದನ್ನು ಅಥವ eject_with_operation ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ಮಾಧ್ಯಮಕ್ಕಾಗಿ ಪೋಲ್ ಮಾಡುವುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ಆರಂಭಿಸುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ನಿಲ್ಲಿಸುವುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ಎನ್ಕೋಡಿಂಗಿನಲ್ಲಿ ತಪ್ಪಾದ ಸಂಖ್ಯೆಯ ಟೋಕನ್‌ಗಳು (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ಎನ್ಕೋಡಿಂಗಿನಲ್ಲಿ ತಪ್ಪಾದ ಸಂಖ್ಯೆಯ ಟೋಕನ್‌ಗಳು (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ಗಾಗಿ GEmblem ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ಕಾರ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ಹೊಂದಿರುವ ಮೌಂಟ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ಕೋಶಕ್ಕೆ ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ಕೋಶವನ್ನು ಕೋಶಕ್ಕೆ ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "ಸೂಚಿತ ಕಡತವು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ಕೋಶವನ್ನು ಪುನರಾವರ್ತಿತವಾಗಿ ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕುಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "ವಿಶೇಷ ಕಡತವನ್ನು ಕಾಪಿ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "ಅಮಾನ್ಯವಾದ ಸಿಮ್‍ಲಿಂಕ್ ಮೌಲ್ಯವನ್ನು ಒದಗಿಸಲಾಗಿದೆ" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ಟ್ರ್ಯಾಶ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ಕಡತದ ಹೆಸರುಗಳು '%c' ಅನ್ನು ಹೊಂದುವಂತಿಲ್ಲ" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ಪರಿಮಾಣವು ಆರೋಹಿಸುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ಈ ಪುಟವನ್ನು ನಿಭಾಯಿಸಲು ಯಾವುದೆ ಅನ್ವಯವು ಅನುಸ್ಥಾಪಿತಗೊಂಡಿಲ್ಲ" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ಎನ್ಯುಮರೇಟರ್ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ಕಡತ ಎನ್ಯುಮರೇಟರಿನಲ್ಲಿ ಕಾರ್ಯವು ಬಾಕಿ ಇದೆ" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ಕಡತ ಎನ್ಯುಮರೇಟರ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon ಗಾಗಿನ ತಪ್ಪಾದ ಇನ್‌ಪುಟ್ ದತ್ತಾಂಶ" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "ಸ್ಟ್ರೀಮ್ query_info ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕೋರುವುದು (seek) ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ಆದಾನ ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಡಿತಗೊಳಿಸಲು ಅನುಮತಿಯ ಇಲ್ಲ" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಡಿತಗೊಳಿಸಲು ಅನುಮತಿಯ ಇಲ್ಲ" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ಟೋಕನ್‌ಗಳ ತಪ್ಪಾದ ಸಂಖ್ಯೆ (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "ವರ್ಗದ ಹೆಸರು %s ಗೆ ಪ್ರಕಾರವಿಲ್ಲ" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ಪ್ರಕಾರ %s ವು GIcon ಸಂಪರ್ಕಸಾಧನವನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "ಪ್ರಕಾರ %s ಅನ್ನು ವರ್ಗವಾಗಿಸಿಲ್ಲ" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "ತಪ್ಪಾದ ಆವೃತ್ತಿ ಸಂಖ್ಯೆ: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ಪ್ರಕಾರ %s ವು from_tokens() ಅನ್ನು GIcon ಸಂಪರ್ಕಸಾಧನದ ಮೇಲೆ ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ಒದಗಿಸಲಾದ ಚಿಹ್ನೆಯ ಎನ್ಕೋಡಿಂಗ್ ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ಆದಾನ ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಓದುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಾರ್ಯವು ಬಾಕಿ ಇದೆ" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "ಸಾಕೆಟ್‌ ವಿಳಾಸಕ್ಕಾಗಿ ಸಾಕಷ್ಟು ಸ್ಥಳವಿಲ್ಲ" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "ಬೆಂಬಲವಿರದ ಸಾಕೆಟ್ ವಿಳಾಸ" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "ಪೂರ್ವನಿಯೋಜಿತವಾದ ಕೋಶ ಮೇಲ್ವಿಚಾರಕ ಬಗೆಯನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗಲಿಲ್ಲ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ಅಮಾನ್ಯ ಕಡತದ ಹೆಸರು %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ಕಡತವ್ಯವಸ್ಥೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ಮೂಲ ಕಡತಕೋಶದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ಕಡತದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ಕಡತದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಲಿಲ್ಲ, ಈ ಹೆಸರಿನ ಕಡತವು ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ಅಮಾನ್ಯ ಕಡತದ ಹೆಸರು" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ಕೋಶವನ್ನು ತೆರೆಯಲಾಗಿಲ್ಲ" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ಕಡತವನ್ನು ಕಸದ ಬುಟ್ಟಿಗೆ ವರ್ಗಾಯಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ಕಸದ ಬುಟ್ಟಿ ಕೋಶ %s ಅನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ಕಸದ ಬುಟ್ಟಿಗಾಗಿ ಮೇಲ್ಮಟ್ಟದ ಕೋಶವನ್ನು ಪತ್ತೆಮಾಡಲಾಗಲಿಲ್ಲ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ಕಸದ ಬುಟ್ಟಿ ಕಡತಕೋಶವನ್ನು ಪತ್ತೆಮಾಡಲು ಅಥವ ರಚಿಸಲಾಗಿಲ್ಲ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ಟ್ರ್ಯಾಶಿಂಗ್ ಮಾಹಿತಿ ಕಡತವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ಕಡತವನ್ನು ಟ್ರ್ಯಾಶ್ ಮಾಡುವಲ್ಲಿ ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ಕಡತ ಕೋಶವನ್ನು ರಚಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕ್ '%s' ಅನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "ಸಾಂಕೇತಿಕ ಕೊಂಡಿಯನ್ನು ಮಾಡುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ಕಡತವನ್ನು ಸ್ಥಳಾಂತರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ಕೋಶವನ್ನು ಇನ್ನೊಂದು ಕೋಶಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುವುದಿಲ್ಲ" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "ಬ್ಯಾಕ್ ಕಡತವನ್ನು ನಿರ್ಮಿಸುವಲ್ಲಿ ವಿಫಲತೆ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "ಸೂಚಿತ ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "ಎರಡು ಆರೋಹಣ ತಾಣಗಳ ನಡುವೆ ವರ್ಗಾಯಿಸುವುದು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "ವೈಶಿಷ್ಟ್ಯದ ಮೌಲ್ಯವು ಶೂನ್ಯವಲ್ಲದುದಾಗಿರಬೇಕು" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (ನಿರೀಕ್ಷಿತ ಸಾಲು)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "ಅಮಾನ್ಯವಾದ ವಿಸ್ತರಿಸಲ್ಪಟ್ಟ ವೈಶಿಷ್ಟ್ಯದ ಹೆಸರು" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ವಿಸ್ತರಿಸಲ್ಪಟ್ಟ ವೈಶಿಷ್ಟ್ಯ '%s' ಅನ್ನು ಹೊಂದಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ವ್ಯಕ್ತಪಡಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ಅಮಾನ್ಯ ಸಂಕೇತಿಕರಣ)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ಕಡತ ಡಿಸ್ಕ್ರಿಪ್ಟರನ್ನು ವ್ಯಕ್ತಪಡಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (uint32 ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (uint64 ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (ಬೈಟ್ ಸಾಲನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "ಸಾಂಕೇತಿಕಕೊಂಡಿಗಳಲ್ಲಿ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "ಮಾಲಿಕನನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "ಸಾಂಕೇತಿಕಕೊಂಡಿಯು ಶೂನ್ಯವಾಗಿರುವಂತಿಲ್ಲ" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "ಸಾಂಕೇತಿಕ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "ಸಾಂಕೇತಿಕ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಸುವಲ್ಲಿ ದೋಷ: ಕಡತವು ಒಂದು ಸಾಂಕೇತಿಕಕೊಂಡಿಯಾಗಿಲ್ಲ" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "ಮಾರ್ಪಡಣೆ ಅಥವ ನಿಲುಕಣಾ ಸಮಯವನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ಸನ್ನಿವೇಶವು NULL ಆಗಿರಬಾರದು" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ಸನ್ನಿವೇಶವನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "ಈ ಗಣಕದಲ್ಲಿ SELinux ಶಕ್ತವಾಗಿಲ್ಲ" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊಂದಿಸುವುದು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ಕಡತದಿಂದ ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ಕಡತದಲ್ಲಿ ಕೋರುವಾಗ ದೋಷ: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ಕಡತವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "ಪೂರ್ವನಿಯೋಜಿತವಾದ ಸ್ಥಳೀಯ ಕಡತ ಮೇಲ್ವಿಚಾರಕದ ಬಗೆಯನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗಿಲ್ಲ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ಕಡತಕ್ಕೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "ಹಳೆಯ ಬ್ಯಾಕ್ಅಪ್ ಕೊಂಡಿಯನ್ನು ತೆಗೆದುಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ಬ್ಯಾಕ್ಅಪ್ ಪ್ರತಿಯನ್ನು ನಿರ್ಮಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ತಾತ್ಕಾಲಿಕ ಕಡತದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ಕಡತವನ್ನು ಟ್ರಂಕೇಟ್‍ ಮಾಡುವಲ್ಲಿ ಲಿ ದೋಷ: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "ಸೂಚಿತ ಕಡತವು ಒಂದು ಕೋಶವಾಗಿದೆ" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "ಸೂಚಿತ ಕಡತವು ಒಂದು ಸಾಮಾನ್ಯ ಕಡತವಲ್ಲ" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ಕಡತವು ಹೊರಗಿನಿಂದ ಮಾರ್ಪಡಿಸಲ್ಪಟ್ಟಿದೆ" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "ಹಳೆಯ ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "ಅಮಾನ್ಯವಾದ GSeekType ಅನ್ನು ಒದಗಿಸಲಾಗಿದೆ" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "ಅಮಾನ್ಯವಾದ ಕೋರಿಕೆ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ಅನ್ನು ಕಡಿತಗೊಳಿಸಲಾಗಿಲ್ಲ" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "ಮೆಮೊರಿ ಪ್ರದಾನ ಸ್ಟ್ರೀಮ್ ಪುನರ್ ಗಾತ್ರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "ಮೆಮೊರಿ ಪ್ರದಾನ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಪುನರ್ ಗಾತ್ರಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಉಂಟಾಗಿದೆ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "ಆರೋಹಣವು ಅವರೋಹಣವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "ಆರೋಹಣವು ಹೊರತೆಗೆಯುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "ಆರೋಹಣವು ಅವರೋಹಣವನ್ನು ಅಥವ unmount_with_operation ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"ಆರೋಹಣವು ಹೊರತೆಗೆಯುವುದನ್ನು ಅಥವ eject_with_operation ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "ಆರೋಹಣವು ಪುನಃ ಆರೋಹಿಸುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "ಆರೋಹಣವು ವಿಷಯದ ಬಗೆಯ ಊಹೆಯನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ಆರೋಹಣವು ಹೊಂದಿಕೊಳ್ಳುವ ವಿಷಯದ ಬಗೆಯ ಊಹೆಯನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ಅತಿಥೇಯದ ಹೆಸರು '%s' '[' ಅನ್ನು ಹೊಂದಿದೆ ಆದರೆ ']' ಅನ್ನು ಹೊಂದಿಲ್ಲ" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "ಪ್ರದಾನ ಸ್ಟ್ರೀಮ್ ಬರೆಯುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "ಮೂಲ ಸ್ಟ್ರೀಮ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ಅನ್ನು ಪರಿಹರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ಅನ್ನು ವಿಲೋಮವಾಗಿ ಪರಿಹರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' ಗೆ ಯಾವುದೆ ಸೇವಾ ದಾಖಲೆ ಇಲ್ಲ" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ಅನ್ನು ಪರಿಹರಿಸುವಲ್ಲಿ ತಾತ್ಕಾಲಿಕ ದೋಷ ಉಂಟಾಗಿದೆ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ಅನ್ನು ಪರಿಹರಿಸುವಲ್ಲಿ ದೋಷ" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "ಅಮಾನ್ಯವಾದ ಸಾಕೆಟ್, ಆರಂಭಿಸಲಾಗಿಲ್ಲ" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ಅಮಾನ್ಯವಾದ ಸಾಕೆಟ್, ಆರಂಭಿಸುವಿಕೆಯು ವಿಫಲಗೊಂಡಿದೆ ಏಕೆಂದರೆ: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "ಸಾಕೆಟ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ಇಂದ GSocket ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ಸಾಕೆಟ್‌ ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "ಅಜ್ಞಾತವಾದ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ಸ್ಥಳೀಯ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ದೂರಸ್ಥ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ಆಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "ವಿಳಾಸಕ್ಕೆ ಬದ್ದವಾಗಿರುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "ಸಂಪರ್ಕವನ್ನು ಅಂಗೀಕರಿಸುವಾಗ ದೋಷ: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "ಸಂಪರ್ಕಸಾಧಿಸುವಲ್ಲಿ ದೋಷ: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "ಸಂಪರ್ಕವು ಪ್ರಗತಿಯಲ್ಲಿದೆ" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "ಸಂಪರ್ಕ ಸಾಧಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ಬಾಕಿ ಇರುವ ದೋಷವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "ದತ್ತಾಂಶವನ್ನು ಸ್ವೀಕರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "ದತ್ತಾಂಶವನ್ನು ಕಳಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "ದತ್ತಾಂಶವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ಸಾಕೆಟ್‌ ಸ್ಥಿತಿಗಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "ಸಂದೇಶವನ್ನು ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "ವಿಂಡೋಸ್‌ನಲ್ಲಿ GSocketControlMessage ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "ಸಂದೇಶವನ್ನು ಪಡೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "ಸಂಪರ್ಕಸಾಧಿಸುವಲ್ಲಿ ಗೊತ್ತಿರದ ದೋಷ" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "ಆಲಿಸುವುವುದನ್ನು ಈಗಾಗಲೆ ಮುಚ್ಚಲಾಗಿದೆ" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "ಸೇರಿಸಲಾದ ಸಾಕೆಟ್ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 ನಿಯಂತ್ರಣ ಸಂದೇಶವನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, %d ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "ಅನಿರೀಕ್ಷಿತ ಬಗೆಯ ಪೂರಕ ದತ್ತಾಂಶ" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ಒಂದು fd ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, ಆದರೆ %d ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "ಅಮಾನ್ಯವಾದ fd ಯನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "ಯುನಿಕ್ಸ್‍ನಿಂದ ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "ಯುನಿಕ್ಸ್ ಅನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ಕಡತವ್ಯವಸ್ಥೆ ಮೂಲ" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "ಯುನಿಕ್ಸ್‍ಗೆ ಬರೆಯುವಲ್ಲೆ ದೋಷ: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ಅಬ್‌ಸ್ಟ್ರಾಕ್ಟ್ ಯುನಿಕ್ಸ್ ಡೊಮೈನ್ ಸಾಕೆಟ್ ವಿಳಾಸಗಳಿಗೆ ಈ ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ಪರಿಮಾಣವು ಹೊರ ತಳ್ಳುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ಪರಿಮಾಣವು ಹೊರ ತಳ್ಳುವುದನ್ನು ಅಥವ eject_with_operation ಅನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "ಅನ್ವಯವನ್ನು ಪತ್ತೆಮಾಡಲಾಗುವುದಿಲ್ಲ" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "ಅನ್ವಯವನ್ನು ಆರಂಭಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI ಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 ನಲ್ಲಿ ಅಸೋಸಿಯೇಶನ್ ಬದಲಾವಣೆಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 ನಲ್ಲಿ ಅಸೋಸಿಯೇಶನ್ ರಚನೆಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "ಮೆಮೊರಿ ಖಾಲಿಯಾಗಿದೆ" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "ಆಂತರಿಕ ದೋಷ" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "ಅಮಾನ್ಯವಾದ ಅತಿಥೇಯದ ಹೆಸರು" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "ಆದಾನ ಪರಿವರ್ತನೆಯಲ್ಲಿ ಅಮಾನ್ಯ ಅನುಕ್ರಮ" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ಗರಿಷ್ಟ ದತ್ತಾಂಶ ಅರೆ(array) ಮಿತಿಯನ್ನು ತಲುಪಿದೆ" + +#~ msgid "do not hide entries" +#~ msgstr "ನಮೂದುಗಳನ್ನು ಅಡಗಿಸಬೇಡ" + +#~ msgid "use a long listing format" +#~ msgstr "ದೊಡ್ಡದಾದ ಪಟ್ಟಿಯ ನಮೂನೆಯನ್ನು ಬಳಸು" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/ko.gmo b/po/ko.gmo new file mode 100644 index 0000000000000000000000000000000000000000..e3f0612516ee11d8685efb5ccb41771b043915f6 GIT binary patch literal 48285 zcmds=dz_tBdGBAWN<~poK|zt1OUMK=ApwM#a0!=y5dwjPTM31onLU$DW@eAGX9xk& z1co?}1Og;5fk{kifB>NmAwbYzYg_F(+T*ErPd%O4v*+YWhL*V-k4}#V=1;IOx(cK{U{S$)V zz2KL@L&5KQ{E^3>dK~xo4<3I7zMcGUInk9n0(>{uM}s$jr+_zugJ1#t33xPk$w@(Q z9C!;j4O|VX{b#|G!7qUqf#?Fa-Y{{2&-o2~7p( zfNJj+@crN&;OXGQ;77r)fX9RX4xR}fKQ#zW1Fr?u?pp8+a4V?xz6s6(e+9OJr_s3b z-vp|?4WRn>0vLi{1vS3E0@bf0xZr2d3Qh;F1?h5d4@eh+XFy0A{He!ZfczI6b&Bif zJTT;X8F&GB54a8d3aI|J(@D|wPH-;x1ULiyK1i0}tu(6ZS>Ol2TR`1k1*-j>U;+F( zcnR3bAVrscP;`3+oCE$(Q0>2;%I1MLfNJk?@H+5&9%n!t(Q7RzI_={hjrV8Z`QSTe z2Ej+bE5HTdAovjY4KM_6p|I$=2K+GiC@B7Y3DkJM1!^3B?XTZNC*Q;M(V)sr2UYF@ zP~~m`H4k@z$Aeoy(d&z#^8FAz68slXOXJ;4zUny@48eJz$`?Sje-|je+T`!=_V`~s z{sdJ2L`0Q48dUy|fSTup{(dj0_SgI8&w=XSAA;`#e+sIee*r`Ay%0@&eI}@WT;Z>a zpvrw36yNLsnX2IHpxXUs@L2GOvt0SpK&Coa0P6W|p!)d$sCu6D_x}V`dp`j+|Gx&A z;^3oa2LV$REC;oowt&j_ZI9#Nd0ZblI|x|H!6l&9$qG>Yco1YM1nW;M*Q{Hz@xbS zXHeze4N+9z9Pn^(DX4MZ3aa1tf$swMf~xP2K;`=dsD2&-afB_P`gf(ju7JmJ{W$m@ z@C)EE;C};Q#o%Y4`t_lCP7ZzCW5weLsQ!Hgd_VZN;Bnxg7dW{-6%@T^gBs7}{(c)M zKJ5pU|32^o;4}XIAAp*_?}Or(e*=}T6(KKrF9eSVSApWcC%|LDS3s6_@Lf=JIP{_* zSOT5}ehgd(N=|(TgtWm2FQ!l64WR0M3RJz{0@dE%gBt()=DYq}2udDzf}+z#@C5KV zQ1to+sQG;pjeH0^2h{T$K+)%upz7ZQYQA0u)!(mzh>+lyAS@D`da0Y=<>1L&e+E>& zzYD6}pMgh%zrmnH|6@VT-=*LY;BSE^f?c4-u@TfbN5Lz=UxB0G>T)zXMMK-^ZZE zM;`^%-mM^{4mN;u!0&*q;JdDL^KdRGdh~)U@n8rH!9N10fN2C95FsQQM% zBfuBH4}*UQz61OVQ1$&Scqn+rHIDvs!MAdKEvSCp1gifJfM54*w5`#ezhZv~Zq2vqqeLG|Mc zpy>HsfBjFO^1bJ`T)n4(nuqg1@k;@GKe!eY{kMTF;C}_hAAbib|2uDV_09s7e=&F@ zxB`?sSOaREJqK!h-vmDj{v1?)PF?D7At*Um1~nhggUa_qQ1gA{O|JY@Q1x93hF~`+ zdOiSt5F7zd2ls)>R|VCtBYxY>-!xF;TLgXx900}N4}sjzva6hR0e+H^QzW~+lA-A~pjs}n8`aCcMf7|1yJ#Gg-%>6HeXMz9Q zU%$WL?3}YeJ#Pa$4+(<1!K1hyTju!vkT!>J^LT{Eqdgw)aT=&`&H~>CUI1$STn63& zUJtGTzwPmwcDG)>51z^Ww-%lKJQqBT>$^bF>v<5C3VsZp2+r+b&4D+A;=`B0OTe## zqUU=$9se!@HQ#GNR6(#8oDKd8lsq|WxszARz)QLQ9Z>Wc16AMgCHH(eIF;*N;Dz9y zg6Dwmz13YW0?*_65pW*(EpWb`uW<8o12~84Pl0OZRZ#snqzjz^&H?9vec(dyMeri< zkZ!lW=Ytx@8t{1V^Pu?go8U3vIQTK}H+!HFcoitVIiu|QeHEzwtO7p{{vN3D9oFmQ z$yK2E_EAvd`XVSg{t~M{@ns1f`gr)=Hs70(cy}U8|MaaJ=fm_ zA!)Fz-;ML@pz43efRooB2UXAG;Pv1*NYlY3w;_|jS3uRfd8MPncRQ-pK@~QVo>D^;1%Ey z_(Aadpy=@nQ1m(B)9(Hap!zicc7Vg+Lh#?gi@}AfgWyK+VemNcZ$S0?oh*Lw|7=k7 zTMb?gJ_9ZS{}DV5y!39@?n*G^`YBNT`eX2;;8FLu{x0&k5>!3gK*`N2sP=vZUI0!V zbaX9&=X3oi_+jvSpvLzPpy+uL%)SG>8Wg?$9#nfLuSNHOw}8sG7d#343s8J`=x5xz zIt|n~?f}mPzYePYw+*>+vq4>VfGWQkRR6vJYX1KXJQ|#NpOY6K2lf13Q1bqd!H+w!deEkHt82m1%@lAWe>7#B?*H3~o zz`q9Pfgc!g^tb_B#Pwqye+H_*AKmKoZZ9~C>!(27{{g7^e%CfPjx)iK>#ISHqXM1@ zZUa^B+n~nvme0C%GYveJ>+3+#c>q+uM!-|SuY*g$e*!hGCEJn7-~-^5;IF{B;KChl z{oDtto^OE~|38D`i-o`A`o9u9kL%~bv%wmu_D=eoE4LU_J9mH|0r!GSz%lRw@cf-_ z9@l^&*Drumz;A&n_e)T8IsHkePfOrDu1Ed#&q1|6`zhD&m7w_IMQ{rEm*7?4+n#oG zyAiyV>y6+o;J<>(zjT-5&-I|j`6r<096saL!!_V>TyF)nUS9)6|L=iEg1`B!qw9yk zcW`|tcnUZK9tOS$o)3NroCp5e!5@Kd2j8~a`6Wk!^SC}4JOb22x67b#6JNxfCa2nSyfJN|!;2Gcrzw7MP0Z{qZgBsVjLDAtC9#8zd>(63P z^RNmOU%d!w9={2m10Fi+`2S*1*F&KA=PTf8;2|%#d7TAnTvvl9gP#J`?vvo*;8#G= z``e)A`#1ME`F=jQfa@E;bHUGn>d%is@y`ceboJf@PUreQ@C5K>Q2qHI;2iL%y{=zZ zfj4ly0aSf|<#EbO_@rF7ftP__1{Z^ezwG390i4S9D)0<&2dH+w3%(otCD;nS?G@MF z*`Vt012x`JP;~jezkcsNN6$InncTnLUvB_4zURQx!JmRlzz@9Y4V5uP*RvaKvB#EqD#r$L)9H z9{>;GdKoGD`=Ev9yD&JpUd4@IHROm)|sLG!VTn zgd^ z!MXgt4*Ue^NPf5YXPR@Cj;)Ci@NY=^d%!=}?+v6kas4OYcXY%5-3b17|6BWX`a1)B z68x22AP_0 zJ_@o_gPX|nKfsTHYrqea-plX52gT1nAn9+NgW#<^+ep&iNu>Ai`(e^M`CTI2O?tO~ z{tx_qfE4}p@nbIOH+a5TgoZisSl|Ikg z{C%yv$Mu{0xA}X5wOn5aN}u%eyU&;V1=k<OBkzZN{)Jr6^uO2h`wvL>ll1quq_>k! z;`wsYqoiK0e~a`vlKyI>|7*Y8Ki>dC(mYZ-`Sn*N{e(1!w1#_a-~y8VZYTXQ=`*BT zNcy|kL2!pJ?=KBnQWp>U-|xuf`!C!-meiTM|8eg9BWVWr9|OBde@@ch-#IY5>KXsL z2mBY(&q){hx|Vu;fqQ>Js&M^2(r$k1?>(gJd>*^OKOZ5z)n7csvr|d;lkOqi!2J)B zP;K$wVgA=|^1O}ob*`uQd&h9S*#CYGJc9HlQpMl*b`Ncx*WI-B%_&$k-9kLycGhmzjH^)cY9qz=;2Tt5L0ldj?S2GSS!eLd+;(yb)@ z?I68ITEz1kNGtf=Mfx@AlUz>+mylNR``m?j7f^zXzT|x`?!x`~MBRf~3Fg_AfRecq7kV z1V2PNliyd8qQB4jA0_Vn5x+kS-UFVi`(aC|=e9yusXZ+Aw3XXSJ)P5nDKlnug!3cXgFl(mKzko-;L!pUe$Q{b6@um6cmo>@4+!g`Tk3RqQVI^oKo#?&73t z?q6O^>aEbsX;bHh)~)}*`n$@NVy1i6!rV}e7c|CVd(sKfW9oTR8;(Fj3!6TfL$z&F zL-wh!4$FOE%lS8++Imxask78y3A+a>{o%5rrz!0%TNO?VriCj@{maV({b9Mc*dt1} z1Q&$M%HAYLx3}EaPn+c)hRpCPt1A7)?%;ylfI|i(|W}%PKD=C{xu!abcgm&!M@$a{Ki9-G5n~O|?qhv>^r#(#d+~1~=c34CUP*dGig1aDcMckpAB?cG^ zzigQ(+Z6b@BfNBeH@wz;FnNpZ3npFrB{0S0b1zwr1Z-G)H;j^SP-BLY2uSkyLBoOr zkma^w*Qy*>#u-c~N!Cv{X0ywTu*l}@E3;BE%-mM&ax1pfQ|gCjOLsI_h^j?hY<;j2)ucx=TG| zs)*+cYF&d)6o7Ji4QP_NgGJKQDbbBIUUEt6tg{Z3V|FS-U$LXuhZ>jIYMpTk`nJ97 z1+yu46^%941e6`V*bH3RHi&Pm+$ADEAb@WiV6Q^5EjMNM>H8bxdV+tP1DfUTkA27rWYni_2{T zW>hgt%;rE(@pkkIoWdLzI%K3tTB4r|U8wa^r@9gwZA^Wv3MCchLeSJLTWAxuK<`WK zV$im7xAlS*;0*xHFppVq#srh9Cf}b)7K+rohH!92S|h8fztA~jGDSs9vw}iO*sMm4 zn^c=`_C+xz?>LV7<1cRE6vFX^!_o!Hntb&>|5+3!>XOQ!1yOm(=S`UwH}E zPskH>p`|#Zb4GZM4BqpmB_-6|Vs|eh2!`|P2<|WU!1a&`(QPK>#ZB}|m=@c?eD9Xn zidW6f%$*)$OBzv7un6dW>b6;n`iA_mNpD)7#gxjMttFUm-KSa!(y1rUorC``k-g0GbFyGbjpGfxm9+{yLDK#&xSM-!u z_RwX77FI2@$9?Zs%ty3p2E#QH~iFt1*Nm{4_(mtih?ZRFjD)I(LIhm!FPZaYV& z!2@|n>D#{Hp3XU8;F^v4qFdM{{w4~=dMY!=1bXkPMvr4#D)q2^KsK|+=+#~7S!c1| zs?{)@C&sGpD5r9C6)N zFdlyLC{;@&JLBQma%hmjRIZjvlV_>hvh>uovN?bWsinH3F6WzxpUGaxO?~EBZkn;2 zizOpOd!fIO>O}IO8!+_43ybNm9|mhF8h@sz z{yyG1E_?x3w65Yxxyw52WRdhc%e~Il%v5^Vq3?HKF{HqXE;%9eWhMxXQ~TCdMYLla8~&9a)s8BdK(fM;ce6Fl8aPQm`fa*p+S8o%wmswAW7pmw3BGBo;Bk&G)CzT0_ko$ zz_*LFuNUHZ@EC;vEJ$3m-IlP=WJgTS=N z&}t-e*+h)EOf1=LXEbbaW4E1-IOs90X>N!i?HENznr9p!z7G0Bg1w)R!nlrwUwHKPIHDjQZ@FOOqfB+ReXR zIh`*d3g3y4%jHHm@rPLr#~1rxM1s^a8uTHqG^xf;9{fjC^v3$57^k%gCq+Yd>OUC-~HtkMRrzNrnFB}V|AOrlP{Cs zu1!it`&6z~TZ3*>F*3ZoMihIPfuutZ!9wj$GHtPtkWYnZSf~x)WySuLGLLO*EWf>V zMG-34UXfF~SCm6LB%qT!Zm-FxWFhN@Cqx2Dq~e8&P~f|Z_By-4au+6rhM#x@z@xY4GCN+rYV&ZU$TRy2%MxPxWQ74T9 z5xvTZ11J(&;KY+lBG%jkXAD~=f5$c@j08^kL3=6uK}lySZ#;rZ&9h#y((r8#_{7iN1r3>0&m;2Oy^3nbTGaMz79THQq&Cxf}*W zEo-$nF)mI@j7HHWKcwKw$dAa{>8bm+{lxw+2QDywu5=EZmm?C~S(aBeJ+-hF$?_{%q~o90pfg zsNY0|TiYG&+%v0@n`T5VD>8wyRV0PkinJpN(j;=ZohMsYVpTa>8(=nXE~;IB#w^O< z4FU{ow1c)Vo$&Q1@Z{5EiK`sGKZ|_?J>fbcw$e7Sl@KgmUS6pajG@A1epjX9?q=_} zbAfawr+*ih2l^17o&_5`H`2sjpKm#Yw0)~?)~;2s*yU*MQ~L}J>P~N8+KyCslusw6Y+;etc^xT*#l)nGFf%@L-F=%D z1i~`NqmZ$h88B-}tMCMA*b~A^n-0-gS=}%a$b(f_facv65W-W9M&4(%IOBfjI-%1- z?j&Y1wCH$osi&=Lzz(@gJ&_5e*4{$@^27$Bs(indAy^VcBq5TH%Q`L5D`{v4Wid6D zXxApUVwXfG)T~l}_Lw#A%wNCqGnwMmo)Qff2SFOd#(olxQ6%zaXCD(BGkL>tI6K2= zo>_+u<4#asQ_(EDr-hUG?E&P@FWYP4MPLVOkt`;8%zCbSX1iKi#n@#NVWeEmJ>kY~nr%jYyYX+AFrj0vo&i|@>y)ddy7j_{8 z{Gn+x9Fn8Ebp^@<(m39kNHa4bt(jC_?MAR0V7uf=a4Z>=>z2mhDHO$~@)Zr>hCSJQ;EgiQ&}QgmX_=|TYl8h^XYbYNl)W2T)MaB zPhbULzHz)t#+U|44mv)jx^s9bILNM(3JO zwoH`!Iygl$q?O>u$V9Yrv)p5g=Q<*GoxXBYElIQ?xbezGOBP&t#f%v8N1oMNVCK$<7pXaky<+5ldJ;IR2`+d`sIJl|{}uf$9!%GNZgD0&O@!$Zyk0^ckNg z%xwB$9s0nlpGLGEUqxA zrN|Pd5mDJAv=h~lp%bVQ1XP=aHM=+`pomEUMc>Z1sW^{fJKvfTXIv22S=u!{TzWZa zfOO5YxFMbV)!RC7aWP0dL8p8n_R`z$WNPk8Tnh-AYy|0ux}Cj;eO3nXIFQyZlE$6< zk=_241Uc-;Zm~j%zP^E8xh5{6&5h_hf#kE(Kk0L8+2=ZNfCg!tq053~#((ae6v*K> zf!zLPhl?@0EzwAZ2JM7SbizLGI~EmjpZKYQk(TXdc~v(jyI{@gl#GuS4!&Qh(6oMY z`zLr>?hSk-9&=fw^U;*$#oG(*yf@R$l;j3l|A_8Sy(=ZFk;=tR3dTFAG1~?hdAu=T z6z&hNn19{nI;QOwQH6)jx^yBucj+RwxoM9>5#??UEILON&CpX^X>zuMFqW!?D~U73 zY{m;=EiAN~Gu*}O-7t={zCCCOyPB8X8AvnNuQN(4FB&KvXc zL7#taTjkP%#8)vL>T;Fa`dM>c09O#CvXcF~fJ@If`|QAP@cI?54Fkj}t0Fp?rtL0w zo|{dh+e(a}YZV%y$f5am)P#R~hA>WwDNs4?T|f6`j&CCFVV=u~4(lZt&e!?G9e13F1!3xz}5S7Ld^7Bz+=N-2uBq@o>luvPgCo!put|Uf+AQ z7GQJpRxJ(+B*n82lKS0}jkKBUla}tn?WOL4?vVZEc)%PK^XC!kLsIhWqGc6pIu6r! z=aqj$9j?J(O1jz`%gVX4*c`E+=gypa7#|9#Z5ysW`^D;;`uWj95`<;8MPYwq}mZDz+VRdvh68DZ5zYt zx}CMH>uZl~3~P_<3u{BeVePTCwfkSHt{dXfTza-QbXluAMkvhV;p$VntGo77tDaV$ z8mw&{3~TE~YTF(f-@Lu9j(pQ>H#KN<+mI@EEsc$?4r`kStLwHzy~y?)xna>x*)E0%Og=2dM$A|YBjkm0>ZQdV_Z+^znnNJ#|9zM2P`CI%gV+(kpmLC;S z*~`T~)%B~#H;;tXm)BIE9vWY>+Zup9KF=uAWw>9vXH8fe*NBt@ z`PQzl?SCY!eQrO$jMvm4jCKFc@q0&Tq&CP>d3ts2iH+l%hxq~3?oVi3dwCO;s}rsw zW8HPnjSp{1<#}XuY~Lue9oF`UkEw@-svAb3!eH(3O*VvQHdUY9#lx`n_%qed-e>i^ zIuwq*_|n+uVD-hl5HzfA*c6VhdCe1UeA6JyW9*fE)or`N+VD%Ydxz%)wZ}%s_E2&9 zS@r4l)kk)!3()qu1y`JL`T>VEb;{`{5!Onxt>`^<$}GFRc{>YHEAo|5ei+qL3pl7{ zpNC_k4~s$cEd`Csmf2A4(Y;wlsE)o+d+grO36?PKwAH?D=lJ?vYl#%QtfUC-#}8-WzAO9yx{o#uS#@zL8vv{JTHwiuabRs zM58viv$lP6IR4;Xrc~ia8-YzzohUO8KPjJ?*@Lb}f;#RBM+)pK577t)J<;pB5M<)F zsJP6B9%>`|;Y0f{L~ZM9p3@tWy1p9s>4(xJ%csX~@_+P81~~-+|DhiC)?OPe#qS){wG`95I1LG6`Y$bAId>gxSZnikkQ#0nVSf~G~>H&+`NUXP5_ z?p=pSm8A6o8GTmUv)AbdFKk<&!ZfXq>Wiz#w+x3EZ{wSH1u7+p9BIJOQ3MKF4b`<% zqetZW3RofD(s+5WHn_Fn!pzl1RR>>3ZQbtbi~FljJ&zPwgD$3b(l=u-uZJ$SOik!D zY`^~N8`2kuOQT|LG6U?+>dS~*GbTOdYA*~{2O-Crt<`%516j=2_tia{Y9mOs(ML6# zF26mS-T0Bq5!Occ)pm?RzE-}z;fY+^`cQSF)OKWa@oW6CAt~#P^;SWqB2!?4`!Gss zuZ>i9Y>(KQuHIc&bgpKU(N&o&`aHJhwc6vO=;2M{>qhy{o4o3jljGu*?K{U_+>UgM zD}#1pFTUt0b8;w#9NuT7G}$jcbrnNNe%({scCWK3c$-E%|Jl)~Vf%JRSlzmx7HW@- z*48~Q(`b07w=>8LlMjwRdS6)E`A}RaZjB?&@cEBMcB9 z@suQnY0dzEspjhiIjmBIQzXE)Z%%O*JQlfWbyl8}mXRj|^PcNDFS_LjqB$QNQSZh^ zVVQ?8w5y+eZEVkaTf8u6)Bt{9BRdj~%h;M2?t@#YH1uwWv#}{VRK0tzEUxi;WF+f` zpOQ)U050DM+s1}&q!12rAXHQDzP^z%N@L|m6>h** zNX@YtFnUIEHJJ49XN2x+D1KtK2&L2R-m5y#^9xGDL3fPbvsxM?<4wDUY=r3!F&9y= zWVrU&?o1hCLc>GxH&v3JR$m>IkG5@S?1fRRerswG8r&+EIBudVZs7_>->}_Ej z1VBtl+d%g`MuXLq2na;QI?}?T_}6Hp>8$y|+BSUVWGXbb>5#bm2Q2=11wNw~<& ztGK1QP(VyCNBu}+>su}+OL10G;uGnXL}ViMu964%ybBEMm30tX1;*b0|5+Fj1-)YN z?+|n47^k**J?pQw9nns#r!Fvq9dqB_>aKm&?L!n%pgALm`U}I^R;Y)GTMh84b#$MmRxcIo$+@Czm`8eh12#@R_Srg>V5C)6Q<7G;S!x zfu7IxN=nrE?-4xlA&MwIpPp6r2}ZWdpNJf=tl)BS zjwTQDv5_~BEn-tllbq}`D*(2McCdnoSD)RF1DIpdj1UqfBH`S4h5M?IahjGjyQ@#V zhDM!qu|0$MP`MsN1A*#_^O%8~n`L@6_6jTMp%K}6>$W026Zig$dtD7Fww%&l-Ge2t zFBclJr6%fBM@MS+Y)x+?7&A@OO!et)Z1HHtV*MrEd!4n_UK$~;Np#S6I#Z|bo^{E- zN#TQ;&f>|vm58pCDXv9pGcBE^EX(gDA8nRIIzeSlSqpa61e6&c80NVu?4VYwR3J148u#AjxLA$ zz1m3|ed)?v&lUeov-iQ(cUVwo0VHvsL{HeL-H~(Osx3wDc1J{szt9xjz;4K7x4j}; zQ3)AgDup|p2~``ExUX$l9geSkskUyrG0(`LC}Q(tW}rpUVU|TEInC*WH#F@ z>4zU!gOVDE!i1>?#Qjguzw};ZgKW`DI!U`ein-Uzd#hPy+qh{3$RNfP*IHxg^&X5r zxEt~1pV-0w22`_An2mAI*4p3;K6iQoj04wh;GyUWqd0>$MF_rT!=YBaqu_es)RrBZ zaNVvxy>oms=DhWBPUt`S6kX=#o0V#H6K-bbTHd@j41MYN(@)LHr?WdVG|f(Lq_#O6 zJ93|$O0^yPYJ?45+KmJwsJNFnUE^6H=;4H%551GiY^0&*Of{gP+0{*lIV@yh-0NZx z?!!>}7*x&5n0Ou>k^?`!1{pFm4B5<0jDm}-{`$q@V{(x-D`A_==wwP5&!h`w*2AI& z7bk0vF>0eabpjx2)>jf4(RDnWsWVy23b(zy+O%?m9wdzC8_tZ)aYWvr@XIS*o8#ho z(pjHuQ4pQj{$yAkb~E_$2v@p~{5z~~$}ySz)VHZpjb)ZlF1!CW)g*IA-=?b1E=vGC z=woFOPse9KT!&@PW`iBJ(2|`Q4!Tqy+@ff^RBHNYj2}aN4UP@%EKM$4;%7}&Ddxp4 zShA{;{%}MK5p4g16Suf+QQCSP8y%{%4I);Mo9K?-sHZs-*ZS0SQ#Be&R72>tb%WZ- zkW|g%qqV2}7J#Hn!w+Un+<;S9)u+)c{GAn<>UNSj@W<6_VG;mTubLiq9#=AMz5z$)6=Cy<>gS zZEkD#U-~{SV@D>D-~NQ7jyonUrT@lxw987RJ`%e(qDoAXq{h6f>CQWbEy=vZcDfhp z(}GEq_E9GElpO_|Od0=)u!AeWr^2EF{vbg!c1!qdXao(F8N}w=%bPiA<)b~RN6zxX zDrvM|md=-!56$i?NS2V!ZEZ4_nq|{J$+LV+BUNnt?wy%3Nw6JvaNqjc_N}ZXtspy% z<_~?&2y5~AjbvLty+%@PXUx_{y|eE~aK5j$=lNh_qSrjBlTO;HL}U1rN1y7Rt^IY{ zUDGJ#ve_0-{+OJj*W{~BZLeoW%|hC?v0gMq+$%53nFd>ib+VvNhD8~3^Ou+JSkjyn zY`n_jwe9zO(%zP9n;Ca1zzh-m0d~$zEI=S!q5Z3=8fU}Xnl|?tO_-F=$P&>vT^tSN z;fw$g9eoAYd^D#@&l8wv1b%wBGENMT0Mq*}Jh{xj8q z>uKuIpZ+wFY?GVf=-g0}Ek$W)D~(@Q;}{16Yt@;i+WHM<%Bzkc+X8fS%-xil;8cK& z{^qSA?K7u(lQtv0q3$MqN>omE0^BIw2@ElBTB$e4$t~l(=Gpun^#qJEQ3Z6t^Oif9 zDT_*{LH6vANnee$`s((K z>4Qt96a6}tU$)(5OgaZlnX zn>gP!OuY^Jk{U6#o4hk#b`TTnaH}jmK}1HVNg1?u+08OnGa*@%d5ssa!lm-&*KU^} zpj>1|!;lfRV-CoPMIGTB#WOc^&{!uersLIPJpc0Q+Kv}e?oIlI4WqHWBB4sK=rdW} z&fdg%D5tYPdW*!26c|U^n2=QZ=m&St&@o-~bDbmLi06fMa^i`v@L8W4pVMj3tTkHY zosV3@QtNhv%~&@+48;F(G-b&&IS$mUnYt!yWTq&ZHs;UQ@##LBmS|k=bkOuXU3?w_ z(3!}c4)qNpubgVm?%vVaI!De;iYb^!Bq4MhHh*e0XfVoyn?rvHJF&jRNsrn4BGt|7 z8ysYW_eX2Pd)b-F&>}O`Ad0vk{hG?(C=ctyj*?42q%~lDJZo=g!6K1lLT}za1IWo; zQI#{HpJmU^jw4`)&E{pLD0ZFinvN3JqP?|zZyMDp0=PPDkY@g{7Ms^$9|Pq4iFWm! zyvg|~_r-KOKIC{ZuIq~PKU*ei}WXU=gIJehiYgtLT&c=Fh z3$L*aM(2BNL*Iuvt55G@^xIPJig8tY_B9RKUaSmWM}^ggccv=jDpTR&20Qkejsv{u z1xpgzi{pH&Ltl?AbHBM0YyZSrjR)(DK)KgeqUqw&+fKO?0!|H2%xSXR9@%aizE7}+ zD8;6i>tv}^_eQitfU$Yi>}hgxOUti;U5w+w`Kxr0j>XU4&-G=U;Q@&ZaEdrT0;YFLMmc&$yjWg{f#==sQFTxI0q#`K*Q#LrZnz7FYSU}DL< zf%@E;SetkvRV{v7$e$$6o*~}4ewscI=!xuK8jmJoM2iCsZ4|^wO++j!l8U0kq7D7a zB%5!~e^XLx;qIL>Q{>r363INN?L$n43=v6w${Saujn|Y-yJer*5w_7soVdE0civOp zZPGfHaDER#BC=thX}9*p-H{rJ>u_79e3DYa)sdv(HjC@IL=6_dEs*F1{aSixb;I%= z=^%US^z7BW-r@8CI|Tu3vo+qB8c{G^M-L=Tno4M=kkevtZ~Xsc7VX_DRw-XFp5a7X zIc?zo&t}Dm#iE_7i5#2N{=1bZezr}=A3(wzkGTqy?_##t>$!EtR@{}zRH|-Gt_HW< zP3uP%j!j0|bz{~i9%rI|s&-POPRh85X*5ZZD`#(0Pv(8(@wg=0Js1eFCx?ohph0<} zXg$xuX@Spsjk~Z?Z2Q{2DPiMl@_ui&n#iC!hzgSKr~6Rfq<{0F$&i9{%t3-T3ZGz{ zLdnnXjnk))_;$9EyUoMDVh_nIlO{PoC)gZ&ghTFX--v!xpOY=Wvoeb+`eWLJDn!30|G`GZVu zQO3as8?qf+)}g%2i{i!v*+@x?H_R%u&0`h0^N4Wrz_HDw1@qi>J;svXH()f!_` zw>zg1e`a)&`6rqJb8VOqw_RW{0TT^5f;X7LIEIkVKf`o@_xYoTbzf${8(zC12?JZc zEUTcPZP~_#MI*{KIX-53Ri|ljwLM$fEjL5{)eM$bljr$Tvej)1G5f$R*73F5c?&mE zO1#^c{-#8}0rzp6>a*<2zslh?KZCJXC^G1LsM|{SvZ8h`@-4E^>ix!HhLM>rQ^Yb$ zx2_MI)V4itzC|L_qq*WVqolfL^PFI859inK%SaALB`-J?kxT7E$g)T)6K$(FLm+-p zdJ^NUzJ~%RnDdqMMmoDW?t>Vh+=bpi+m4w>5Phkk1Mi}Hxeq06j zsTgl95=F^L*dSkHTd=e<^@`-3cWJ=YhlYvO)YdWijy3p~qw4vGGiB!4-j>#k&dIq& zxzlrFI*>3U;G2!9hLSF;4s4z+tFwWth98lMj?@h`X} z?@ee-Elceivi1>K`--eSBTEoa>dQ@Sb7M66ifp_!ERF6PZDt|s+gsuvq#XNi_^jCV zkBr#vY_xZvai!nsKAl~yC?xar17d?l4iK66l7#WZ+KniLd?Zh;;YCcwA$69) z6C20&JaZ8FGcVN12gt34lvN_pC38M{t-zDpAJDR}i)_m19W~dVgy#{bbqb5jQRGuJ zu+Q6x1M5uibi7SX)Ri*Z;eO6Aa?E$4!&CXfGXEGBJ%bhWp`WJ-Fdk$b?tg|OsrEWL zQ0eEhl#?wRZC8p$oaKSPkZ`OD>@9ynIkT$xwgxdJrqmd$!34w^LhthP;oW9=-60S! zCS0Zl`?&#z4l+l`vR6?j4zwsZYakKvdqc@Co0;Z2c+ZpQ zG{Ul>M;_f}F~^G+iOY8_y$Fb-(~)G$#WG^C(R}pH)ehYvW-ooqAveClLqDyWbWDP8 zRr=iIzMJ^`X4i7TZD=Dq-1HhL=JglE-Q^XzHNU5sy z$KmQWzwHAm;)HarjA_$^{^oDk$6Rg-lS7*M`n7?&Z@pLAe!LRKakFFlR(rjhFB)&i zYlQxz!y5CX)^W6%pDycXuklBTUti792a8`{>F8s|Z?JSUt|lKletoq!{1WmBud6P$ z=a@FVde*SgN!K|#%vY@JFqghU_q-Y482o%cIo_{InQ?W|v?lr7HkD*{wf@ryvm*&@ zC+hTNWp6bkUl5G<+5OIW5O3Nc=^oO@_}u3QO$86?( zw8%Qi_+?JVq-B7p5DhPm^4lAV{tQ#yv}HfeBa_e?REVItEh*Vy-xyIazFtD6s2U4l zOh6ZZ9eZ_+|BzFQGmQDxvy)OBEY9!UNQF-PMaD?>IcIV*HoBy7w3*w`FvWH^%^_+l zbC$sIK&n`_5ufq0j~V%)`&u+goWW!&kx6Wd+K59eQl6XL@LCELIl3jTFmN#zA62#w zs^NFp)MT}lsPDvm1FtH`MGM^ibgb(Ae#Rc((%4@8?V+&!Pk7S-Lcxg#&Br(qEcOHK=dIJ-JH)VUk99Hh*Nt zH2Prmq@{6OrG3cyzB@qww literal 0 HcmV?d00001 diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..78c7b6d --- /dev/null +++ b/po/ko.po @@ -0,0 +1,2184 @@ +# glib Korean messages +# This file is distributed under the same license as the glib package. +# +# Young-Ho Cha , 2002. +# Eunju Kim , 2007. +# Changwoo Ryu , 2002, 2004-2006, 2007, 2008, 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-02-16 03:42+0900\n" +"Last-Translator: Changwoo Ryu \n" +"Language-Team: GNOME Korea \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "예상치 못하게 '%2$s' 엘리먼트에 '%1$s' 애트리뷰트가 있습니다" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%2$s' 엘리먼트에 '%1$s' 애트리뷰트가 없습니다" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "예상치 못하게 '%s' 태그가 있습니다. '%s' 태그가 있어야 합니다" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "예상치 못하게 '%2$s' 안에 '%1$s' 태그가 있습니다" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "데이터 디렉토리에 올바른 북마크 파일이 없습니다" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URL에 대한 북마크가 이미 있습니다" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' URL에 대한 북마크가 없습니다" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' URL에 대한 북마크에 MIME 타입이 없습니다" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "'%s' URL에 대한 북마크에 개인 플래그가 없습니다" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' URL에 대한 북마크에 그룹이 설정되어 있지 않습니다" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "이름이 '%s'인 어떤 프로그램도 '%s'에 대한 북마크를 등록하지 않았습니다" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "URI '%s'을(를) 사용해 '%s' 실행줄 확장하기에 실패했습니다" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "문자셋 '%s'에서 '%s'(으)로 변환은 지원되지 않습니다" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'에서 '%s'(으)로 변환하는 변환기를 열 수 없습니다" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "변환 입력에서 잘못된 바이트 순서" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "변환중 오류: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "입력의 끝에서 부분적인 문자 순서" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "코드셋 '%2$s'에서 대체하는 '%1$s'(으)로 변환 못함" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s'은(는) \"file\" 스키마를 사용하는 절대 경로 URI가 아닙니다" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "로컬 파일 URI '%s'에는 '#'이 들어갈 수 없습니다" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s'이(가) 잘못되었습니다" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'의 호스트 이름이 잘못되었습니다" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'은(는) 잘못된 이스케이프 문자가 들어 있습니다" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "경로이름 '%s'은(는) 절대 경로가 아닙니다" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "잘못된 호스트 이름" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "디렉터리 '%s' 여는 중 오류 : %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "파일 \"%2$s\"을(를) 읽은 %1$lu 바이트를 할당할 수 없습니다" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "파일 '%s'을(를) 읽는 중 오류: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "파일 \"%s\"이(가) 너무 큽니다" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "파일 '%s'에서 읽기 실패 : %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "파일 '%s' 열기 실패 : %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "파일 '%s'의 속성을 가져오기 실패 : fstat() 실패: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "파일 '%s' 열기 실패: fdopen() 실패: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "파일 '%s'의 이름을 '%s'(으)로 바꾸는데 실패: g_rename() 실패: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "파일 '%s' 만들기 실패: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "파일 '%s' 쓰기 용도로 열기 실패: fdopen() 실패: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "파일 '%s' 쓰기 실패: fwrite() 실패: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "파일 '%s' 쓰기 실패: fflush() 실패: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "파일 '%s' 쓰기 실패: fsync() 실패: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "파일 '%s' 닫기 실패: fclose() 실패: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "기존의 '%s' 파일을 지울 수 없습니다: g_unlink() 실패: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "템플리트 '%s'이(가) 잘못되었습니다, '%s'이(가) 들어 있으면 안 됩니다" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "템플리트 '%s'에 XXXXXX가 없습니다" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 바이트" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "심볼릭 링크 '%s' 읽기 실패: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "심볼릭 링크를 지원하지 않습니다" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "`%s'에서 `%s'(으)로 변환하는 변환기를 열 수 없음: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string으로 raw 읽기를 할 수 없습니다" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "읽기 버퍼에서 변환되지 않은 데이터를 남겨둠" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "일부 문자에서 채널 끝냄" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_endi로 raw 읽기를 할 수 없습니다" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "파일 '%s' 열기 실패: dopen() 실패: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "파일 '%s' 매핑 실패: mmap() 실패: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d째 줄 %d 문자에서 오류: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "이름에 잘못된 UTF-8 인코딩된 텍스트 - '%s' 부분이 올바르지 않습니다" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s'은(는) 올바른 이름이 아닙니다 " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s'은(는) 올바른 이름이 아닙니다: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d째 줄에서 오류: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s'의 구문 해석에 실패했습니다. 문자 참조에는 숫자를 써야 합니다 (예를 " +"들어 ê) - 숫자가 너무 클 수도 있습니다" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"문자 참조가 세미콜론으로 끝나지 않습니다; 대부분의 경우 엔티티 시작에 사용하" +"려고 하지 않은 곳에서 & 기호를 사용한 경우일 것입니다 - 이런 경우 & 라고" +"쓰십시오" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "문자 참조 '%-*s'에 대응되는 문자는 허용되지 않습니다" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"비어있는 엔티티 '&;'를 찾았습니다; 올바른 엔티티는 : & " < > " +"' 입니다" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "엔티티 이름 '%-.*s'이(가) 알려져 있지 않습니다" + +# FIXME: "escape"라는 동사를 번역? +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"엔티티가 세미콜론으로 끝나지 않습니다; 대부분의 경우 엔티티 시작에 사용하려" +"ê³  하지 않은 곳에서 & 기호를 사용한 경우일 것입니다 - 이런 경우 & 라고쓰" +"십시오" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "문서는 엘리먼트로 시작하여야 합니다 (예 )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s'은(는) '<' 문자 다음에 쓸 수 없습니다; 이 문자로는 엘리먼트 이름을 시작" +"할 수 없습니다" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"이상한 문자 '%s'. 빈 엘리먼트 '%s' 태그를 끝내는 '>' 문자가 나타나야 합니다" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"이상한 문자 '%1$s'. 엘리먼트 '%3$s'의 애트리뷰트 이름 '%2$s' 다음에 '='이 나" +"타나야 합니다" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"이상한 문자 '%s'. 엘리먼트 '%s'의 시작 태그를 끝내는 '>' 혹은 '/'가 나타나거" +"나, 애트리뷰트가 나와야 합니다; 아마도 애트리뷰트 이름에 잘못된 문자를 쓴 ê²½" +"우일 것입니다" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"이상한 문자 '%1$s'. 엘리먼트 '%3$s'의 애트리뷰트 '%2$s'의 값을 부여할 때 = " +"기호 다음에 따옴표가 나타나야 합니다" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s'은(는) 엘리먼트 '%s'을(를) 닫은 다음에 쓸 수 있는 문자가 아닙니다; '>' 문" +"자를 쓸 수 있습니다" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' 엘리먼트는 닫혔고, 현재 아무 엘리먼트도 열려 있지 않습니다" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' 엘리먼트는 닫혔고, 현재 열려 있는 엘리먼트는 '%s'입니다" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "문서가 비어있거나 공백문자만 들어 있습니다" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "'<' 바로 다음에 문서가 갑작스럽게 끝났습니다" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"엘리먼트가 열려 있는 상태로 문서가 갑작스럽게 끝났습니다 - 마지막에 열려 있" +"던 엘리먼트는 '%s'입니다" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"문서가 갑작스럽게 끝났습니다. <%s/> 태그를 끝내는 > 기호가 나타나야 합니다" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "엘리먼트 이름에서 문서가 갑작스럽게 끝났습니다" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "에트리뷰트 이름에서 문서가 갑작스럽게 끝났습니다" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "엘리먼트의 열기 태그 안에서 문서가 갑작스럽게 끝났습니다." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"애트리뷰트 이름 다음의 = 기호 다음에서 문서가 갑작스럽게 끝났습니다; 애트리뷰" +"트 값이 없습니다" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "애트리뷰트 값 안에서 문서가 갑작스럽게 끝났습니다" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "엘리먼트 '%s'의 닫기 태그 안에서 문서가 갑작스럽게 끝났습니다" + +# FIXME: processing instruction? +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "주석문 혹은 처리 안내자 태그 안에서 문서가 갑작스럽게 끝났습니다" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "개체가 손상되었습니다" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "내부 오류 또는 개체가 손상되었습니다" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "메모리 부족" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "역추적 최대값에 도달했습니다" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "패턴 안에 부분 매치에서 지원하지 않는 항목이 들어 있습니다." + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "내부 오류" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "후위 참조를 조건으로 사용하면 부분 매치에서 지원하지 않습니다." + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "재귀 최대값에 도달했습니다" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "비어있는 부분 문자열에 대해 작업 공간 최대값에 도달했습니다" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "줄바꿈 플래그의 조합이 잘못되었습니다" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "알 수 없는 오류" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "패턴 끝에 \\\\" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "패턴 끝에 \\\\c" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\\\ 다음에 인식할 수 없는 문자" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"대소문자 바꾸기 이스케이프는 (\\\\l, \\\\L, \\\\u, \\\\U) 여기에서 허용하지 " +"않습니다" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} 안에서 숫자가 순서를 벗어났습니다" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} 안에서 숫자가 너무 큽니다" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "문자 클래스에서 끝나는 ] 괄호가 빠졌습니다" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "문자 클래스에서 이스케이프 시퀀스가 잘못되었습니다" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "문자 클래스에서 범위가 순서를 벗어났습니다" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "반복할 사항 없음" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? 다음에 알 수 없는 문자" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< 다음에 알 수 없는 문자" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P 다음에 알 수 없는 문자" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 네임드 클래스는 클래스 안에서만 지원합니다" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "끝나는 ) 괄호가 없습니다" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") 괄호가 여는 ( 괄호 없이 있습니다" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 혹은 (?[+-]digits 다음에는 ) 괄호가 와야 합니다" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "없는 서브패턴을 참조합니다" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "주석 다음에 ) 괄호가 빠졌습니다" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "정규식이 너무 큽니다" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "메모리를 확보하는데 실패했습니다" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "룩비하인드 어서션이 고정된 길이가 아닙니다" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( 다음에 숫자나 이름의 형식이 잘못되었습니다" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "조건문 그룹에 브랜치가 2개보다 많이 들어 있습니다" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( 다음에 어서션이 이와야 합니다" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "알 수 없는 POSIX 클래스 이름" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX 사전 순서 항목은 지원하지 않습니다" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} 시퀀스의 문자 값이 너무 큽니다" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "잘못된 조건문 (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C는 룩비하인드 어서션에서 사용할 수 없습니다" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "재귀 호출때문에 무한히 반복할 수 있습니다" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "서브패턴 이름에 끝나는 글자가 빠졌습니다" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "이름 있는 2개의 서브 패턴의 이름이 같습니다" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "\\P 혹은 \\p 시퀀스의 형식이 잘못되었습니다" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P 혹은 \\p 다음에 속성 이름을 알 수 없습니다" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "서브패턴 이름이 너무 깁니다 (최대 32글자)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "이름 있는 서브패턴이 너무 많습니다 (최대 10,000개)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "8진수값이 \\377보다 큽니다" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 그룹에 브랜치가 여러 개 들어 있습니다" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE 그룹의 반복은 허용하지 않습니다" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "일관성 없는 NEWLINE 옵션" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g 다음에 {}로 둘러싼 이름이나 {}로 둘러싼 0이 아닌 숫자가 오지 않았습니다." + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "예상하지 못한 반복" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "코드 오버플로우" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "컴파일 작업 공간을 넘어갔습니다" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "이전에 검사한 참조할 서브패턴이 없습니다" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "정규 표현식 %s을(를) 맞추는 도중 오류가 발생했습니다: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 라이브러리가 UTF8 지원 없이 컴파일되었습니다" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 라이브러리는 UTF8 속성을 지원하지 않고 컴파일되었습니다" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"정규 표현식 %s을(를) 컴파일하는 중 %d번째 문자에서 오류가 발생했습니다: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "정규 표현식 %s을(를) 최적화하는 도중 오류 발생: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "16 진수 또는 '}'가 있어야 합니다" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "16 진수가 있어야 합니다" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "심볼 참조에 '<' 기호가 없습니다" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "심볼 참조가 끝나지 않았습니다" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "심볼 참조에 내용이 없습니다" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "숫자가 있어야 합니다" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "심볼 참조가 잘못되었습니다" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "마지막 '\\'가 없습니다" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "알 수 없는 이스케이프 시퀀스" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "\"%s\" 바꿀 문자열을 읽는 중 %lu번째 문자에서 오류가 발생했습니다: %s" + +# g_shell_unquote()에 쓰임. shell의 quoted text를 raw string으로 바꾸는 기능 +# FIXME: "quoted"라는 말을 어떻게 해야 할 것인가? +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "따옴표된 텍스트가 따옴표로 시작하지 않습니다" + +# FIXME: 위 참조, "quoted" +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "명령행에서 따옴표가 맞지 않거나 셸 따옴표된 텍스트가 또 있습니다" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "텍스트가 '\\' 문자 다음에 끝났습니다. (텍스트는 '%s'입니다)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"텍스트가 %c에 대응되는 따옴표가 나타나기 전에 끝났습니다. (텍스트는 '%s'입니" +"다)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "텍스트가 비어 있음 (또는 공백만 들어 있음)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "하위 프로세스에서 데이터 읽기 실패" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "하위 프로세스와 통신을 위한 파이프를 만드는 중 실패 (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "하위 파이프로 부터 읽기 실패 (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "디렉터리 '%s'(으)로 바꾸기 실패 (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "하위 프로세스 실행 실패 (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "잘못된 프로그램 이름: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "인자에서 잘못된 문자열, %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "환경에서 잘못된 문자열: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "잘못된 현재 디렉터리: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "도움 프로그램 실행 실패 (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"하위 프로세스에서 데이터를 읽는중 g_io_channel_win32_poll()에서 기대되지않은 " +"오류" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "하위 프로세스에서 데이터를 읽기 실패 (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"하위 프로세스에서 데이터를 읽는 중 select()에서 예상되지 않은 오류 (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()에서 예상되지 않은 오류 (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "포크 실패(%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "하위 프로세스 \"%s\"을(를) 실행하기 실패 (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "하위 프로세스 (%s)의 입력 또는 출력의 리다이렉트 실패" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "하위 프로세스 (%s)를 생성 실패" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "하위 프로세스 \"%s\"을(를) 실행하는 중 알 수 없는 오류" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "하위 PID 파이프에서 필요한 데이터를 읽는데 실패했습니다 (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 범위 밖의 문자" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "변환 입력에서 잘못된 순서" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 범위 밖의 문자" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "사용법:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[옵션...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "도움말 옵션:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "도움말 옵션을 봅니다" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "모든 도움말 옵션을 봅니다" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "프로그램 옵션:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s에 대한 정수 값 '%1$s'을(를) 분석할 수 없습니다" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s에 대한 정수 값 '%1$s'이(가) 범위를 벗어났습니다" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s에 대한 배정도 실수 값 '%1$s'을(를) 분석할 수 없습니다" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s에 대한 배정도 실수 값 '%1$s'이(가) 범위를 벗어났습니다" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "옵션 읽는 중에 오류: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s에 대한 인자가 빠졌습니다" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "알 수 없는 옵션 %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "검색 디렉터리 안에 올바른 키 파일이 없습니다" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "일반 파일이 아닙니다" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "파일이 비었습니다" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"키 파일에 들어 있는 '%s' 줄은 키-값 쌍도 아니고, 그룹도 아니고, 주석도 아닙니" +"다" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "잘못된 그룹 이름: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "키 파일이 그룹으로 시작하지 않습니다" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "잘못된 키 이름: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "키 파일에 지원하지 않는 '%s' 인코딩이 들어 있습니다" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "키 파일에 '%s' 그룹이 없습니다" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "키 파일에 '%s' 키가 없습니다" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "키 파일에 있는 '%s' 키와 '%s' 값은 UTF-8이 아닙니다" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "키 파일에 있는 '%s' 키의 값을 해석할 수 없습니다." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "키 파일에 있는 '%s' 키의 값을 해석할 수 없습니다." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "키 파일에 있는 '%2$s' 그룹의 '%1$s' 키의 값을 해석할 수 없습니다." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "키 파일에 있는 '%2$s' 그룹의 '%1$s' 키가 없습니다" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "키 파일의 줄 끝에 이스케이프 문자가 있습니다" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "키 파일에 잘못된 이스케이프 시퀀스 '%s'이(가) 들어 있습니다" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "값 '%s'을(를) 숫자로 해석할 수 없습니다." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "정수 값 '%s'이(가) 범위를 벗어났습니다" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "값 '%s'을(를) 단정도 실수로 해석할 수 없습니다." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "값 '%s'을(를) 불리언 값으로 해석할 수 없습니다." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s에 넘긴 카운트 값이 너무 큽니다" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "스트림을 이미 닫았습니다" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "동작이 취소되었습니다" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "올바른 오브젝트가 아닙니다. 초기화되지 않았습니다" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "입력에서 잘못된 멀티 바이트 시퀀스가 불완전합니다" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "대상에 공간이 부족합니다" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "취소 가능한 초기화를 지원하지 않습니다" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "알 수 없는 종류" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s 파일종류" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s 종류" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "예기치 않게 일찍 스트림이 끝났습니다" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "이름없음" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "desktop 파일에 Exec 필드를 지정하지 않았습니다" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "프로그램에 필요한 터미널을 찾을 수 없습니다" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "사용자 프로그램 설정 폴더(%s)를 만들 수 없습니다: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "사용자 MIME 설정 폴더(%s)를 만들 수 없습니다: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "%s 사용자 desktop 파일을 만들 수 없습니다" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s에 대한 사용자 설정 정의" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "드라이브가 eject를 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "드라이브가 eject 기능을 구현하지 않았습니다" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "드라이브가 미디어의 폴링을 구현하지 않았습니다" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "드라이브가 start 기능을 구현하지 않았습니다" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "드라이브가 stop 기능을 구현하지 않았습니다" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem 인코딩의 %d 버전을 처리할 수 없습니다" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 인코딩에서 토큰 수가 잘못되었습니다 (%d개)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon 인코딩의 %d 버전을 처리할 수 없습니다" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 인코딩에서 토큰 수가 잘못되었습니다 (%d개)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon에 GEmblem이 없습니다" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "동작을 지원하지 않습니다" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "들어 있는 마운트가 없습니다" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "디렉터리를 덮어 써서 복사할 수 없습니다" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "디렉터리를 덮어 써서 디렉터리를 복사할 수 없습니다" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "대상 파일이 있습니다" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "디렉터리를 재귀적으로 복사할 수 없습니다" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "심볼릭 링크를 지원하지 않습니다" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "파일 쪼개기 오류: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "특수 파일은 복사할 수 없습니다" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "잘못된 심볼릭 링크 값이 주어졌습니다" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "휴지통을 지원하지 않습니다" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "파일 이름에 '%c' 문자가 들어갈 수 없습니다" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "볼륨이 mount를 구현하지 않았습니다" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "이 파일을 처리하는 프로그램을 아무 것도 등록하지 않았습니다" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "이뉴머레이터를 이미 닫았습니다 " + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "파일 이뉴머레이터에 진행 중인 동작이 있습니다" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "파일 이뉴머레이터를 이미 닫았습니다" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon 인코딩의 %d 버전을 처리할 수 없습니다" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon 입력 데이터의 형식이 잘못되었습니다" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "스트림이 query_info를 지원하지 않습니다" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "스트림에서 seek를 지원하지 않습니다" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "입력 스트림이 truncate를 허용하지 않습니다" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "스트림에서 truncate를 지원하지 않습니다" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "토큰 수가 잘못되었습니다 (%d개)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "클래스 이름 \"%s\"에 대한 타입이 없습니다" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "\"%s\" 타입은 GIcon 인터페이스를 구현하지 않습니다" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "\"%s\" 타입에 대한 클래스가 없습니다" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "버전 형식이 잘못되었습니다: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "\"%s\" 타입은 GIcon 인터페이스에서 from_token()를 구현하지 않습니다" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "아이콘 인코딩의 해당 버전을 처리할 수 없습니다" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "입력 스트림이 read를 구현하지 않았습니다" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "스트림에 진행 중인 동작이 있습니다" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "소켓 주소에 공간이 부족합니다" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "소켓 주소를 지원하지 않습니다" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "기본 로컬 디렉터리 모니터 종류를 찾을 수 없습니다" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "잘못된 파일 이름 %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "파일 시스템 정보를 가져오는 중 오류: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "루트 디렉터리의 이름을 바꿀 수 없습니다" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "파일 이름 바꾸기 오류: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "파일 이름을 바꿀 수 없습니다. 파일이 이미 있습니다" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "잘못된 파일 이름" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "파일 열기 오류: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "디렉터리를 열 수 없습니다" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "파일 제거 오류: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "파일 버리기 오류: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "휴지통 디렉터리(%s)를 만들 수 없습니다: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "휴지통의 상위 디렉터리를 찾을 수 없습니다" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "휴지통 디렉터리를 찾을 수 없거나 만들 수 없습니다" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "휴지통 정보 파일을 만들 수 없습니다: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "파일을 버릴 수 없습니다: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "디렉터리를 만드는 중 오류: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "파일 시스템이 심볼릭 링크를 지원하지 않습니다" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "심볼릭 링크를 만드는 중 오류: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "파일 옮기는 중 오류: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "디렉터리를 덮어 써서 디렉터리를 옮길 수 없습니다" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "백업 파일 만들기가 실패했습니다" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "대상 파일을 제거하는 중 오류: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "다른 마운트 사이에 옮기기는 지원하지 않습니다" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "애트리뷰트 값은 NULL이 아니어야 합니다" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "잘못된 애트리뷰트 종류 (문자열 필요)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "잘못된 확장 에트리뷰트 이름" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "확장 애트리뷰트 '%s' 설정 중 오류: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' 파일의 정보를 읽는 중 오류: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (잘못된 인코딩)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "파일 디스크립터 정보를 읽는 중 오류: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "잘못된 애트리뷰트 종류 (uint32 필요)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "잘못된 애트리뷰트 종류 (uint64 필요)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "잘못된 애트리뷰트 종류 (바이트 문자열 필요)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "심볼릭 링크에는 권한을 설정할 수 없습니다" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "권한 설정 중 오류: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "소유자 설정 중 오류: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "심볼릭 링크는 NULL이 아니어야 합니다" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "심볼릭 링크 설정 중 오류: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "심볼릭 링크 설정 중 오류: 파일이 심볼릭 링크가 아닙니다" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "수정 시각이나 접근 시각을 설정하는데 오류: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 컨텍스트는 NULL이 아니어야 합니다" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux 컨텍스트 설정 중 오류: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "이 시스템은 SELinux를 사용하지 않습니다" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s 애트리뷰트 설정은 지원하지 않습니다" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "파일을 읽는 중 오류: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "파일에서 seek하는 중 오류: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "파일을 닫는 중 오류: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "기본 로컬 파일 모니터 종류를 찾을 수 없습니다" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "파일에 쓰는 중 오류: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "예전 백업 링크를 제거하는 중 오류: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "백업 사본을 만드는 중 오류: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "임시 파일의 이름을 바꾸는 오류: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "파일을 자르는 중 오류: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' 파일을 여는 중 오류: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "대상 파일이 디렉터리입니다" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "대상 파일이 일반 파일이 아닙니다" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "파일이 외부에서 바뀌었습니다" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "예전 파일을 제거하는 중 오류: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "잘못된 GSeekType이 주어졌습니다" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "잘못된 seek 요청" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream은 자를 수 없습니다" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "메모리 출력 스트림은 크기를 바꿀 수 없습니다" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "출력 스트림의 크기를 바꾸는데 실패했습니다" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "쓰기를 처리하는데 필요한 메모리 용량이 빈 공간보다 더 큽니다" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "요청한 파일 이동 위치가 스트림의 맨 앞보다 더 앞쪽입니다" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "요청한 파일 이동 위치가 스트림의 맨 뒤보다 더 뒤쪽입니다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "마운트가 \"unmount\" 기능을 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "마운트가 \"eject\" 기능을 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"마운트가 \"unmount\" 혹은 \"unmount_with_operation\" 기능을 구현하지 않았습니" +"다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"마운트가 \"eject\" 혹은 \"eject_with_operation\" 기능을 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "마운트가 \"remount\" 기능을 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "마운트가 \"content type guessing\" 기능을 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "마운트가 동기식 content type guessing 기능을 구현하지 않았습니다" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' 호스트 이름에 '[' 괄호가 있는데 ']' 괄호가 없습니다" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "출력 스트림이 write를 구현하지 않았습니다" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "원본 스트림을 이미 닫았습니다" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s'의 주소를 알아내는 데 오류: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' 주소의 호스트 이름을 알아내는 데 오류: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'에 대한 서비스 기록이 없습니다" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "일시적으로 '%s' 주소를 알아낼 수 없습니다" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s'의 주소를 알아내는 데 오류" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "올바른 소켓이 아닙니다. 초기화되지 않았습니다" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "올바른 소켓이 아닙니다. 초기화가 다음 이유로 실패했습니다: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "소켓을 이미 닫았습니다" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "파일 디스크립터에서 GSocket을 만드는 중: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "소켓을 만들 수 없습니다: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "알 수 없는 프로토콜을 지정했습니다" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "로컬 주소를 알아낼 수 없습니다: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "원격 주소를 알아낼 수 없습니다: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "연결을 받을 수 없습니다: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "주소에 연결하는데 오류: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "연결을 받아들이는데 오류: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "연결하는데 오류: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "연결이 진행 중입니다" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "연결하는데 오류: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "밀린 오류를 알아낼 수 없습니다: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "데이터를 받는데 오류: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "데이터를 보내는데 오류: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "소켓을 닫는데 오류: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "소켓 조건을 기다리는 중: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "메시지를 보내는 중 오류: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "윈도우즈에서는 GSocketControlMessage를 지원하지 않습니다" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "메시지를 받는데 오류: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "연결에 알 수 없는 오류" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "리스너를 이미 닫았습니다" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "추가한 소켓이 닫혔습니다" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon 인코딩의 %d 버전을 처리할 수 없습니다" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "한 개의 컨트롤 메시지가 와야 하지만, %d개를 받았습니다" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "부속 데이터가 예상치 못한 종류입니다" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "한 개의 파일 디스크립터가 와야 하지만, %d개를 받았습니다\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "올바르지 않은 파일 디스크립터를 받았습니다" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "유닉스 소켓을 읽는 중 오류: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "유닉스 소켓을 닫는 중 오류: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "파일 시스템 루트" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "유닉스 소켓에 쓰는 중 오류: %s" + +# abstract unix domain socket address: 파일시스템과 관계없는 소켓을 말함 +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "가상 유닉스 도메인 소켓 주소는 이 시스템에서 지원하지 않습니다" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "볼륨이 eject를 구현하지 않았습니다" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "볼륨이 eject 혹은 eject_with_operation 기능을 구현하지 않았습니다" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "프로그램을 찾을 수 없습니다" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "프로그램을 실행하는 중에 오류: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI를 지원하지 않습니다" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "연결 프로그램 바꾸기는 WIN32에서 지원하지 않습니다" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "연결 프로그램 만들기는 WIN32에서 지원하지 않습니다" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "메모리가 부족합니다" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "내부 오류: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "입력이 더 필요합니다" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "잘못된 압축 데이터" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "변환 입력에서 잘못된 UTF-8 시퀀스" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "최대 데이터 배열 한계에 도달했습니다" + +#~ msgid "do not hide entries" +#~ msgstr "엔트리를 숨기지 않습니다" + +#~ msgid "use a long listing format" +#~ msgstr "긴 목록 형식을 사용합니다" + +#~ msgid "[FILE...]" +#~ msgstr "[파일...]" + +# FIXME: "escape"라는 동사를 번역? +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "'%s' 문자는 엔티티 이름의 시작에 쓸 수 없는 문자입니다. 엔티티는 & 문자" +#~ "로 시작합니다. 이 & 기호가 엔티티에 사용되는 것이 아닌 경우에는, & 라" +#~ "ê³  쓰십시오" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "문자 '%s'은(는) 엔티티 이름에서 올바르지 않습니다" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "문자 참조가 비어 있습니다; dž처럼 숫자를 써야 합니다" + +#~ msgid "Unfinished entity reference" +#~ msgstr "엔티티 참조가 미완성입니다" + +#~ msgid "Unfinished character reference" +#~ msgstr "문자 참조가 미완성입니다" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "잘못된 UTF-8 인코딩된 텍스트 - 너무 시퀀스가 깁니다" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "잘못된 UTF-8 인코딩된 텍스트 - 시작 문자가 아닙니다" + +#~ msgid "file" +#~ msgstr "파일" + +#~ msgid "The file containing the icon" +#~ msgstr "아이콘이 들어 있는 파일" + +#~ msgid "name" +#~ msgstr "이름" + +#~ msgid "The name of the icon" +#~ msgstr "아이콘의 이름" + +#~ msgid "names" +#~ msgstr "이름 목록" + +#~ msgid "An array containing the icon names" +#~ msgstr "아이콘 이름이 들어 있는 배열" + +#~ msgid "use default fallbacks" +#~ msgstr "기본값 대체 사용" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "이름의 '-' 문자로 줄인 기본값 대체 이름을 사용할 지 여부. 이름이 여러 개 " +#~ "주어진 경우, 처음 나오는 처음 이름 다음은 무시합니다." + +#~ msgid "File descriptor" +#~ msgstr "파일 디스크립터" + +#~ msgid "The file descriptor to read from" +#~ msgstr "데이터를 읽을 파일 디스크립터" + +#~ msgid "Close file descriptor" +#~ msgstr "파일 디스크립터 닫기" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "스트림을 닫을 때 파일 디스크립터를 닫을 지 여부" + +#~ msgid "The file descriptor to write to" +#~ msgstr "데이터를 쓸 파일 디스크립터" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "막 만든 desktop 파일을 읽어들일 수 없습니다" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "백업 링크를 만드는 중 오류: %s" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "g_input_stream_read_async에 카운트 값이 너무 큽니다" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "g_input_stream_skip에 카운트 값이 너무 큽니다" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "g_input_stream_skip_async에 카운트 값이 너무 큽니다" + +#~ msgid "Target file already exists" +#~ msgstr "대상 파일이 이미 있습니다" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "g_output_stream_write에 카운트 값이 너무 큽니다" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "g_output_stream_write_async에 카운트 값이 너무 큽니다" + +#~ msgid "Target stream is already closed" +#~ msgstr "대상 스트림을 이미 닫았습니다" + +#~ msgid "Unknown drive" +#~ msgstr "알 수 없는 드라이브" + +#~ msgid "%s volume" +#~ msgstr "%s 볼륨" + +#~ msgid "Unknown volume" +#~ msgstr "알 수 없는 볼륨" diff --git a/po/ku.gmo b/po/ku.gmo new file mode 100644 index 0000000000000000000000000000000000000000..8cf1656b7ea389fe4bd970b7f9489f3de0fcf659 GIT binary patch literal 1107 zcmZ9L%We}f6o$^;?w;>)f3HbpDYvKfBSHa0c z-UDwze+-8BH{d1EgA?Ef@CNt^ybgW^L%r|dS@0LwgB(DvL9d-+>?XJiPJcESb{8r;?aYxkIBRnJAs|9hDKEo^sQL?}db#aBsNDNgsEH zP~|vva^GjGx+gQ0@Ro62%MOhVxizVk9UhED(OQdmeQUMYCFHA7CadeVHhUUd6OPPB3^kESF86UtkO&Ayr@~J zT_(M;F<-Wc%=nhkvZeSF3R>9~+CtjF;gy@FGmkW#b}@>mk?h2Lt!oqITKq|>yQ19{ zdt_5WQCz@6rkrm43{d zEomM3r}f$k9L+c`biG4XEbFETR~_@YhVrGiVudtzFUDD0lnu&wrCf-=+#cfkt*~1`p z6ywNhYLg#TLbl|1P?GnFy^_7*pm, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.glib-2-8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2006-04-20 17:33+0000\n" +"Last-Translator: Erdal Ronahi \n" +"Language-Team: Kurdish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.10\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ne derbasdar e" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Navê hostê nederbasdar e" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Di rêza %d tîpa %d de çewtî: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Di rêza %d tîpa %d de çewtî: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Bikaranîn:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Vebijêrkên Sepanê:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Vebijêrka nenas %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Dosya vala ye" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Vebijêrka nenas %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Navê hostê nederbasdar e" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Navê hostê nederbasdar e" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Di xwendina dosyeya '%s' de çewtî: %s" diff --git a/po/lt.gmo b/po/lt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..752c661875ea8af7ffb0feb123ab701d3a613206 GIT binary patch literal 44087 zcmd6wd7NEUmG6%u8b#)LIt)owAQdWMikTo}fIt#r5(Z5$oT_`Oa#FYMz1*Ra3ZfuF zi;5_N5e0>A#Q}Y&*tYX)rDD?#t!Qiav(;{KZtbRhYCClMeBa;N`waKitx93{A6=i% z&hMVH=e5^fd#$zi+4;_)&%8U}@BXI+!SUen2L?gk)4^l)HVD3QN)Q|dJ`NrL{=nnE zc>I;e-+O%4sV?1t;PXg-gnvF6JecRX;ETb<;CApXFam!G9s^!+S`eHB*1);o8$i|n zac~a!H{gZfufQY0MYDt8a_}Z^fAfv*7< zf`1CW5d1oLGI&r=5S$Gz0M7)6K-K#u@GS8Cpz8ZBxBxtmO8da`L8TuBRo{J}+V>eS z1it~Qf4>IRu9JD-XRr*M2M&QWJ-8F3DZ$4;NF4l=$7h`G^3MU)&W&IQ*1;9vo#5NR zuY+oDlSYcJuLYNY4}tT+AAuwZj-*mOuKm#BeUrFM({-NK~Vg=4^)4j0M(D*`sYJw)#RhKR~H7gYMy zpvL)X|NaJ0_228`KLM(JUjq*Ze+8`7cKObbMgBOE}zXen~-v+9jkNfxE0+s%kpvM0N=Q%!F3o=x}Zcy{- zJ)qKk&*SgGr%O7{$iqIMqQaS^EYZTHVNfhY0&Uhq)x^Wd@Iw?SAj_zkFb z&AY(Kp_h2P$>aM#weRcTQQ#lIlfa`^IJtfvD0*KEsz2NO`vxdJeHEzm_kc%(AM@|O z3Tpg*1d3mtk8oGIWgwy{xEeeeycIkSdD9sB?k9gbQV1Y5v0;KkruLCLA_ zgOE5lV-;f$CZNjw2&i(O09D^JSG)e72A;p zb)e!CQ1p2nsPf+dYP>!Ns=eO;5hcNMEFQ{@q4XWPXfX9G`(J9ft z57hWw2_6FO1WyHD2C5(TgX-sBf*ZgC*9O4{z-{0jJzwJ5_iB&#gR^=6QBZvQ9Z-C5 z)TNH!R)dI$pyr<+1QF4}$z$3ulfolK3 z>m5Iw0;>H>K=I2~Q1q*TA$SKUzIg;xd0zxYho69=(|>|We-xe8_`MJmKfM%Gy|;sq zKKKy082l~R2cCVI8;=1{<90X5R1e+{hTu=Y9&px1mwq9rakvIlxvv35hxdc3_cLG! z{t!GLJm5u+KQ96`FUCN%`!-Pgd_Smme-czZ-vPy6&)($nEe3mePQZTf4p4M{6coLl z1VxvFHoNia1;tOBL7E=aL8d_PSy1hLHj_m8=7Qq4wV>*+fv1CafGY1(;342QK$Z7n z@cG~Ym%H)~2M^%+Dp2&l27ESn9jJD`5}Xe{0-gmv0gB#7Ug7Ao3RM4N@Oj{k;9=lx zpxX5ScsTeN2&)C(1~u+;uXOEP12T1kYeCij5m4jyIH>v$yvoVN<=_II*MSFvF9+5C z+rbcg7*su90agAFz!!i|f3cG@hk)nsd?u)IkNx}GL8X5`sQjM?)sBAzMbF>)=i^`E z(wzsY+%2HSVGtC*+yWj2J_L&XkAfQSe+5OKqqe&AXMrmB3Q*~HgGYdG0M)JsLCv?X zfa>4BgD(V++~)Fa^jHTa5AOms9$y8OF1Xr__hL}_*MTap42Iwx;DO*H;Bnw*z=hzq zL8UwRrLJA)f*QXKp!(MWj|blZiogE?JP7GAy@{~XkKe+qmK_(f3d|2haO2fqMg@RAa`KKKDp z?K+B=>i4;z#&tV*D0nNV{@n{+41NX-!C7R6<%2Uo@!?IN`tfE^^I#vS^8OtZT~8Wz z<8vvf`s!d0_(o8C@G5 z->-smz-RAt`T9UTuK`uhC^#GZQ~&-k@B*Hn1eb&TBks8hs@xBNJ>V1Iso<=#lQZ){ z@$=Q7^1T*(H~4u_e9{DFY6#xAbsD2$)ck*j3$j}Bi zgBsVLg5sBz4QJ221r+^W*mQh<4XF0+1~r~{f|_q1^7v&R|1p{iGp!oB3pya~`LAB>gpvLKEpxSxx zE?55!Bfuh5` z;0Ew7L5HlumnC1t_0704K@t82fPUU68K{9h}SxKSp{eF{5J4Za01kP_%SH@9sfGV zCrd%`(I}{Py$V!)4}s#R?}AEy!fkH+mVrm`JOYY8Zv;i>4}qfB7eMjH@4;2z($_mW z-3V%ay&YT(ei>A`vu=0ee>$l4tpnAb8$gZwUQl#@2oxWE9xQ`D1gqfYH?RhRkAiOj zZ+)X{-)VQa{EI>Le*^eJunwLHz7G_Az6FYZpMIwszw%NL=WU?sxdl|e-U}WBejYp={JwwxTTuNw=5EJl{h;`1Jt(@?K+T6+K$Y`u zQ2l=l>;-@1pAUYM>(7~>_$>ji0bdWU2cHBr|CjA`?Y<6Fc@KjZgI@;KkE7r0#%(!x zKF>8U1U~@I2OkHI27`NC{l|bR=R#2Q7ywoOn?R-e1b7hmx1jj?``{ViA3UDHAZh%s z^mqr@$Mcs!&5!@^&vV}D=Jys*^nDqqad{9FeZB$4;BUYy!I$3a=>HK=>Awk{13vRU z*U!bE+ItNsdfo*d2|fa$2z(9rLhw;=1NeJz z3Apa%o)35m5Er=HGwP<2OO|^EaUScfdOwz0U+CPX|Gb%MGCT_`RUY{hELO zb5Qw?d#9KGpy;y|oDE(JYW((sqR$t=P2jIVwfm9>UHPvBH}d>Ga3T16@O-fUUCz#^ zfv55ON^lPNE>P|H8z28`Q1pK8yIuZXu!rZZpvLDWQ1##I-#-SP%JaW@Jp4V5&Wpgs zyx#)$g13X`f*%Ey|4C5%eB66oe=h}(<9QG~348^pae6x_I(z_BIiCYX&nH3A@A(fo zJRMa2i$RT330wu<;^V&n&g1zfU4Zp>UpCD+Ch<@vM_bTw$gc4y9&+iBIx0T;t16P3G0bdTjjPOlG z@^^-V;K$%G{`ZB%>+f`MDR?OOci?<*9E`w_pucqvf?IjM$G;o#s3`HlUl5vv|3$cr zxVI9XOPEDi%{%>Fpx=aHg8n{ASkCV&!D|Ue@_Vk26YqV1a3BFu6#Oeef4BR1{l1Ox zbe_Km{;gj4zpdbx{qOsI`m;e;J@~zUe=*OO__!N9_7is*;dq{(@6!ox;rY|xhX@Dr z`)0xh!e8o{@EO7qp2f!lp#IJSzv_Ml2k`qq!Yw>62LAyZ1iuIV6CwS30q;J~!%GR* z^7{rKQRTN})iq%H7x^DA_xL98&j~Lj&Hn+{f;WOE5)SA0FTqWOzbEMLwGM)36Zb}f z{!Swt#_u}`l0^yOm4ril{IB@^dP4eF=f@JlGl+i+;c9*#)+kOZ~dK2Knw)`LXa%^13`Ze5?0tR^ds_|LO6=&ml4+Z_kwp5{+cjE{Po}+gi8rM zJindr&-{LrpuZnF2(IM)Gx=Qu_keEz^>-Bb6L6t_UIs2D>>_-f_unO4#P1k<8{rDV z(|GP9{FdMPtML0|!mIgxB6u`Gf2Vc$Gy;_ zqFaP_=?8yfykA2&$j9HzyG4XmJlFj@rQ1kYPWTO>k1$Ml7D0bn&(A0A2|oRLo)`Gv zujBV;39ljO?@7Y*2(yV#2zv=No?k-vGlKqpM))`TgRRZAh^!w_m2j>g@@by@8@@)@G8QKd4C+?lRjQB%m023@g>3+c%JRw9mn%#|N9~E5W>?54gctEDU2(F z)lyO!o*T@bzhEd_eWAmPJYMQ?y~m9nw}6dsC@IIy@mj3k4qM^Cc#~&`ji6_CqbE!n zVWrv(qtI13xFf1ZgUz@e4pqzL>Mm+0u4idan8hp!lV&&?ja$BfcsQwqQ6-Ga@n~FW zhLvbEo^i>|9dTZ6gKEy~SrS^a{u|3LR~vC#^Q?v?p(>Bm$GDU?LiFfa-qW=Q>RLEu z%wmci>mJkty*tVXSG6?>0V>J(Tqof6{Qj{eI8y9icY0q#b~v~Fjj}c z(Rj349}nyCwXLL1(q=WR)vJRPZKT^(PnxmFRgUVz@Jn+CTo8>#NjVxQLs{2~uu+Q! z<6uRtR!#<^WX=3?re|fVCC#B8#$l^LY3tXnUrjZYp=7vKcl~C%m57<$SWM`WB`Q$x zspTxijge;6_c$xNRApY*qg{+|R0`pq;q6IvJCnRpiObvda(g+c#M|LBIMX+12AP`G z?J>jPC^?i=N@1bp{xy}9U=d9~4RtwzyC8By+@Y5V9n6GZd!97eZ1{O7ylC|(yf*q& z(#EB=GcJ7%OfmD+TXrA;yOur*qvRaaouMQG@-)8FuwVL%06 z77nsD;!);GxmsBgj#gP>%E^dWWxU#woMGzG#Zjo%V8Z34XUmR=UXg+!+1_YE3R}r5 z&7?UV_Jwg{FsjkQtc0i$&f#fEu(FDj7&Lhe6Y3atd=dsr}KBH zUL7s8C}kZr#CU{tMSaay0`j)XuK!xIZJ1}5y(XhvCdM=m!c%59PAMd}iRJkg2D6H- z3SZSzNa{p0YdLK%#RxYh41DPMdDZGQYd5S8hwD|A7b+AfSo*7VNjgTNT8YB}m}ziF zu&OAM8CR`3wqy*AhpTtTgG}YPTnbiI2V168F-nYPs}k>KU4c^=<7h}qnxrM`b5v$o zPlnZ$Olf22v!zf{VF?5+yt0WlZ4Io?lugHOCLUsA z1yiQmyOxR&Y7pI)&TgE!JTKR)zOoXmoscJOLT@~Ocz(E43h(l{c@8x<9<3pQU^qXI z;Qnd_u7^yBZc`~&O|hM_GXFAc$Mtb+<76oq!EP$76IL)Y#X(-ZO9)R^eOW* znF?v!O9@t6^C?z>v}ewe9wc>)kY+5+tmA#cG7#0{#ZIDzbFOVwn@hquW&Ja(f1+Bo zu_RdS%J?57`+bW{(MT6HFRe!^)m;^ujL<@>W%PLO&5G6aI?vJIV2t*U^k7{53SvUl zMGv4Z`qjvr4~0k-q)5s5F0Y*-({>13$000@YZQJxwg{5O=-$ed|^YW z6Tu4;`680h;uxl>kwkI5OML|!qD!ndDW;1NX>zZb&)|hdLtc(9Ly2ykP5Mp_Z;Qi- z8muQZWM`oXczPNp4?0H0+dEzAbJ_%YTP=Z4hf$7)TexYopi5Dg(mI>v2YU`<$7De! z_gvP|sOdyd*PMm6x#XJBqsg8rtD2M{6$SOUR>nVM>SYsFFy%dOSh-cqiNi@XptpAr zLarzulZyda9C~TvC6RHdIE?u+yHrRc{eP(BG!GX!D_CPSs!NQ7%uIf@i`=kxc4KZa zooQfMrxu4pw!*fzzEG@|G3pi5X7g%NbS=ToQ~#vuLqd7#=#?pK@BvaU_55|TCdOEi zQ?5OcEU?aYcTYJ*aXaEN^VAuZ(dgu&YO-flqFdB#bgi+ezqCLwx;4^Sg1u{Rb4N=g zr!$F!w_&JA!XeGssVF`gc~_ew_bAU(B{hvR8yXt`&&mvINwG7_X&jpmYJ0IywW#T; zb-o&}_05wuKDZ-n;KGJOc0@S222gXc7|rdSSu+JYKlg|9&N+4AS!XYCX4Y=J3gvh% zJ_m+*QWMkbiVpfVwv^J%#+l0jtZ;okMIe52ZA|-Nji9_3HFu4(?v1cuiq;VWN zjJH>DQ}G%rMzRM-y4w!$^8%mtK^^%E{cL^7=s7 z!5)kD8h+*n^Zu;%ac&fo%0U}kwAr?DR^mirO3b5XMn={?#iHxum*Vy0f(GIu4NFuo$0xXTT< zIWOg_N|ezSZE-GXrf}Z2+u~i4wb|;5uUBx!#!_T$imdfJp%-mNH{HT+X0~BKrOuj` zQ+AQt0l-UON(7BJ0`wWlTrv?O%aciV+ZhdeUEgh|BXfGpoia7V(CV0aN2X5L!ohmh z!Wkw!_v|hSCk;w&Q)c7i`lrE^ZU+q{6|=^7(XU0DEM7CV>kDZ?DUF>^Q_0#!Wrydq zEZs=Vu5f3n>cCE%mh)^ZvONY|Pif)iK4z7llu`BwdKw&w?>J3e}XQkSFo4SpD$YCr@IOmfcv+Y6YsUboS2qY|B6m!I08AfHoTklXE2LsRHNL&j@KV zV{&qhrAZJv?Z)4p+?p>T3g3y4J7h*U@rPOs$H#RT5hwNhE^WvP&5N;<2mc)f{ny$f zAF3;%&`m_W#HERtF1-<<9gSRfeDWxyn|-dZT9nkW1+*tH&-pXWm)@nYRwdi)aMDa% z&^|WVGGe+`J}7xei~eN;vhXVa8CT4kI%Co@Y6t#)36JP9lK0Hwg+&FV z(p*(GX%l$nc{;ai^PK5Em8;d}pxabT6)(Rciakt0(xHc7y>=%VwoFLKrb0BV*9P!F z+}tJg*tW(xx3@OLP{H0(|y zvQlwtR_!lrym0htSx>sL)V7`H#)#RF?m}44_gC2R!Z|Kk09r9@4^bNyeQ8nJ#+hkx zkhtf}DN1!>L#1`J(?p?j1GAgUW@cf-Ye{AU7Pqm}#VcR$AY(C`4e@@6>38O|)q>Ki zGgjSqQFrZt0a=zcTbvjdC*?|`Xw%uH;Ih`j~$x%Y>wx{G5kr`&pQeU=t?Nt=cQ4sU| zcuue_s*e6_w4|C)@U147+sMkd>itd~?b8ssG{MHsa~8R&kt;4v^u0*K<2Ct|Ebf@0 zUw|}zHg{|cgH7h@H&Nl{_E3p;rZw`?l*oaY0hF#HDa=-+9Z}FqB9q%$vXgR*SJSxx zwx{jzYEM36mL~8D0SY#&gSIf8@bxF~WYe@0S1EjZHhT|x&UJWfwc2D_La=#9b(c;s zhH{trU6qD=+y2I#3#2g}>+j}jtB&~eEZ8Mp?(Dd;R-;#D3i{@R(7QgqU0YefW|v}W zL)$0lQekmVtFyaX^4$|GC04dZP<*A*a;>>DN|fsm=UcGiVRygUrJUv!?C>i43)&NT zDKszjd8yPi1EN|crZQ-=CPA#VY}_ShQ4!dbaaEB7N4MMb@Qj(c+ns2Vpm0l)=?{bR z!`?00T~|KEsiL{XVv5HP!k%pfaXd{{m1K^LuvhD(^Ai}Cwr#Xi5p}2QdYVqhr);*7 z)|n!ORg8ftW?^J};z{pqSdbC}kVk%GRnsyRN>lR`ExV_LjX|BPv%Gp?B#>DvUjfy- zeIX>ODost&bjD`w?r4OL5V_--dDqf2$4OeK`DUTozwR6Y!cXMTf~itBU7m- z#o1PuW--dzG%2(&OVpT6+>y@CoT5EOIJH7I%$Y3>uiz1Y+oc``dF@^D7^h8_Tyq9H z2d2#$Z61N~&T?T?9XTu`1pG;A(^GnZzjS6VfNwA!Lzi@>(dbB|fx zDc3CZ!&4}ASaoVLYEG*9nGCx;J7^ZhQC%~wMekVLP(Dy@oac zzsVNVcsb)v+xX}N#XTjul(o$I!O*g7m!alNvO7n2w=#A`Nwb!eD8wA{g(RthOHFph zt+Ur@{5(6+q}a?iS8S~r8K?&6bey@8hNe!E!VbbXHzpaiMJ5Wg_1Ya%Y){J6L=5X( zOjbsIRw7M`uGg%hshJpbhXy%6on`QxZ7T|5r(IVPWwphp?K5*;F!EKVcbx?dt+daU zAE$azpy_yEE^azZo6GI|L~w;!RB|@hq-on`%`B@1oWy34*;Zu0;bUa&>N%3R8p%W} z$5Caz%AY~

h>X(%I`X&6B3S5>C+wX(sqSG7u$RRx37nuEdQu>6QyG*%^W|C*B5P)MFXu7_nvtZX4{D7dhtysyo@q zi1O(OwBcAGzimyT%@{%jYbuT8i-$dNz3Q7CWL0In?9HEEu6iXh{}#ixqC4cc)(!V5 zhMoJ)Hu4xLStXuWJfUZ6AookCy* z>7Jl$o-^Y=_n`{p@H<0p({soMFe zs!YlFbmCwTCef7Tn=fFR*lI2C?s?Q@kJ zOvY?mHDlWVC6CVtjKa-u!|E&7>FlZ=9!nY&b~%46)Wf_Ix-QF?1m57&KX7-gR!C*$gPerB2nl6D7_aB6(onS-@}l@{eY8Az+$&JikIB`! zUEf}9^0u>wX}M{B+O7t)2E06Vj-LGcf_AUTDaO911pA2>MO@MjPM;>H<|=CaG$~q@ znWnJ%eexN%K(Yu5yFJTccEw~UP1#fJr|)3dsxpVm-i1J4c;j{}KR z?C`qlQ6VA@A@fB--N)PhxmH1(uBZ-^QdI|=%sDTB8wgTq$^HYuZD*Z#Uf_3q{S4PG z0^*ceksepm9+*4i%}&x-LJ!L0tOzkD=}RmV{*xMfI|Zg-$#EY5y3cid6aQwiqao6w5xy%Xd>YUCpGQ^o~ZmlhM{_$fk4FVNQ?vLyD9A zRI=>SX_c*XoUkA5T>QJP;pz;kq}%c>js~lB+L8tR^ZNS{aauH;&oJ+R_9P&*8qtt{ zUhzRIHwGMuc%v_EP*ABN^$%tAC)O$3&MldH`?Cl$De|ZG&Cl$;_n^AIc!`z@P7-N{ zVYtFEn1Yuh)1LMhzjS{IHcpkmDSeG_TQG)y1QJcPs!ty+Y14ICpE8@tu^^j=ev*g_ zoX3bkgfZb>?J_yFO{!*}TYS2W)5dyL`bXc|Qr{KsQ_sa=xjAc7tgn;%);ETeQs0HG z;YQyUcIIboylhL~O34joXx}Qt$Kr5d|APL${2S#=G>S%eDSjT*tZ-@l+6$tQ^89jhIY}$S zEe?kFZQ+E|;&2_B5E3v!LM4R4#>c;be8QLoVMl5k+(L(PQm zH1|EghwzQCRt-t9R0$f1eI!v`67G~-jcaw3$x;;Vtd1nv2Rzynte2`YDApIZ?-8ru zOlnx7UtJnAVii=Xb$qPusFbUvHG^7O`#xRb8`R3gZIjxV)wTpZ59O6*L0|q^CmZ2- zJyL?@w5w3f#9m&LawHOQ)K$oux4K*OVykCRi`Xb{y0B7dhrV}y}G)f;E9_|U~u zU)LFM{v&F#nkUg{btn1c4z!YNu=ag=d^9dk>zcSJs=XQh5P>CcX`yQ&Bs4?R?Z8_gX=PjpY zt5Y7)xGX%)=vAwVV)RAt7Pxnskyujdid~1GorPp%-vgtNwJ;d8y0z~CC<=9(4faiv z%EaCV^Ry;`g^rT7suDLQ_KxWD6AIm6(`i%_nuJVgQKB4GMmSo4YU6)*P1Y7&i^j%B zXeOSAyd-}mLWDXhL$69PmX0rvTO%#p1FZk8622`s$BsT!_@**yj*n{ieJi|Ec$%Dl zR3>KI09@3POt7}uQGt{g^rbXT^Taqw6;hJQ=D_%9HB9zB(C+(W(Q3arAtUM^QI5Y% zA?vROKS__pBQLXvlwqaK!4OS8l@mAWm*>n>Mk4{V{K5uZa;HaWCMVXX43leX`y3)$ z2J$MV$h8Kav~54kxSlQf-3n9X(Mka8vJcKT@CDB0h3B7%n+si#oXS%X;q%vHn6WWF zmLP3%=FM5(^DL!~$*)Zj#xdN!VC$F@uO{Mw6n!JMr zO-d6pnCy(kOmb8*8P_&PP5vWr)o>L=)hH?0BbjVRXnAVglfBGalkrSxjB7{+;FnC6 zIGH0UR1lFQm|f^hmc20s$2o?ZNdcSPYK1_OmC-`Za(xX;3Eg1<;Em0C=;{{t(I{_m zqs1pr7>S~KmpdLVjWCiBy0E+nns?tiA$X4KMmo9*EX{(}+P;jk7nua#u z$ErnpFrBANzG%AC8dJBF&=?JdZhnB4#X9}!jWG19cZ;2SudEcaYwTTbknkfMBjCOq zR;iJswM2$>A{ozyDa?AwzK7Ix6QVoKsc82$uyupDvXWs3ibDgM*jwU@!(1_$cz6uo z9n!3isu@gO?Bi~IAUDgM;v1I5UH`yBiv(#^pfJO;WnwQUWmuekSGCwL@NF|GYK)+hCZXK{;Z|BPpRMJLAT!O0Xg@#cL|RSGPNu7n zU_|Xgm37iQO{XP4{r$(}F~99*cMlN59Mw3)GqG1P0SYjYGNZp$o7jscBUPmowV-K> zP7k-jv4nFYXgtwK6s+o4p^UVZ7IO!-SZyCdAv>ykL_cDulP#W3NgZOr$XTd7K0H1k zT_9zRDYLS!%=#C=M0)5g;?ebqA4u_ zW^TZnOmbZHnwN}yux)7 zg=|h2rpdBm8pumC0+}Bsir~>2R^=+U4DQ5|M3Ok2Ivvx(G8i#==P^0!*djYQQp8e& z=!PbADkDZ=5qABQuIM{P?q+0iTjop)9~#=aAM$aPf&9%&;#b;;b}PYFl*xtDJ>L}c z_J*s5ROu+Cyp^|S;$d!Q^I1}>A?pXV>-q}T8fjMD^?o!N7JP9m%NOa7f`Z!$nu#@_5SZrdh!NAINZG|J2 z+@gI>6(w7lywV*fZk{4irtFlF+4s(QbJC?*ADt9hS$xg%>X*`AE$A0uE2(#8o#&1}h?jYruuBZRYk#gkH{n55XFR4%8sa6zqTPu4!L*$kd8 zQCpn(A9flUoJRp=BpD2n642&{;V*9tBPX9%?CLrqKzCF8`+J0Zg4nUW?kZD_m+IVPt`4X^I) zE5^!~gtKIdx@b|Ipkgwi?8(z5sz`HNELl_}kQ1#so#hl0Goh4Dlc2gshM@11JILiL zY$PqIZA#T`xC+rz44AXDls`SLj9a@I3ma*%3Q)R7SbbNE^ZX+(jad$cW4U#SYyO22tbnICyDq6)J7&L5B!VZHZY+L~)XMV?wp&Eaurao1LAl_7{ryX3I!d{;qPR5Shuz4XMkrrkn^h zDWI7r+gVZV!#>shB3qno*1(bB?=UrkwwgZr8%FYEvIeWH&GtpO`FpZyUFA*@4$Nel zHLkkOe0J|hdzx9fQET**XHnDIT&;y!?G8_7J$G6QX*>Iw-9s{xYdTr3)WzGGspwEj z)6mB;b}Q@VX2r;-*XHWNIC0C8eBx59AO(bINmJlfVk`jNl#*3x%7i-Q)1|i;7pCM) zGfa`L7NHe$+DGQJ*H+;3_QcEp%s1z%lLNTQE`eOLUc<t+7`bBWTM2I1@l7bpPXokSO(dqaQ0|oy8$f4h-<%MU}Z5owVA|a zAkHqGW7nPNiW71da-e+RZ?s+Le8}CHId(^JhKVL|areYDu3O>`rld|=b+oG?TUYya zesWQp?TtBKSk79US}V-Ub`C2R*S*a%%G$|hMcGiSB43qRr=9;epGNJ>LN;9RT||I7 zAWC_^r)egs7c{3V+1s4_`LcqbOcg*$`0N6eZk&`!*C^Y5%xiAcnVt}TTxL&UPt0#d zPMS)EdsVvCHBB~uzsgh0mEN;b$hO9*NNNA&Yt1-Vaj;N+-Acl4Dz_4I_y>PGKXClm zsZ#B3*zGYLsT=9miMD63vVCQ8j%Ln@G@tBtb1u4_0>2UM?p|^2a2BU+12`vgIzcOL zt3jI&cz%4VGy9aaoy{5BB)^hlUtF;w@4b)4RHW-&Z)kBo{>)#^M~_+{koJXb;q}p; zVdq}8a@^4Yb#LFN;|f$ZR^DnmFIv={B1(l<^U7(TcH}~*BOqNP9?{-3?)j!1jQj47 z*!r>!O7WF>Uf7VtgCOlH+qDcf+m_8A=joa{Yo}A}ii8a^ZCex-g2K6x2B(?*wJv$j zwCl#Gs_k|@hK(U@CA)(QBH5j=lI`2bkDfANo?qsr-x{~0Bw;Tqr+n@lRLE#nMNw!w z!ZJ-RFK!&MmGM$_#~m4%vMP7;%gocBdv+mhp`p4;LYpR48)Wuq_-Nnvo@J-SAxZqg ziI?5ujm}OXXHttzJB=w}*u&J`rKqCf@{>G%Yd$?BGEJPk5ot>phhYxEn;Mjtoa^e2 zR%U7Nji2;7=W#0*P>BbD#NJ`Cs-H29pqS6nm?SXT=Ba&g`Ba{iOT1B->z>)195(ss^fK+W zs3BR$+-n9o-AQJ~pq4RV=1*=~MxuT`C zoSV)m$#67R+3{U8Cjp4yMeDPbN2)t+4J?Mm2t2fQYtPQ zV^fC$Q=U!RcTceIQ~q3ITl4+S`80j<4r_N9HS*j$P5J^2)J^WpNkX`hZ4UiAvDfz| zYanA$8JG6yi~@`cf7Fu=W&|CajZ z(o$3qeT(D#CFKEh^JY!%dF!aOdgk#xQU0; z8q)Q}#=;$pL|kVMHSY&Y6unF;IsI+hq(7_ee5F6@V1>Dpms3~fPDFLDN~dnqr4NrB z!oi(Ea$Z4iyx>>!O(}TT{tNY);YvSs6gjPY-yvqT*W)mf5Lp$M={3-G*8_6$d3CAa~9IuT|1ofl2HdSe0SMF$^~i?q?6fw z0%N*0k~`f>)v;u#ZBt&Y8B0p&lZ=*5#-*bvUu$Yg+DWiXw+mJ#c1+u(yEnzCJX=V! zfpYe1izU(-eLNdQJ81|w3*7O{d}j-tQ}T>01WtXMH$+2?JB0I^)8+F^aF)qw zqnyR?ch1XK?i=hr5a2&H8z06=Xa5acnu@IxX|TC*UxAIae6i958{PIB6jZy@Mb28; zae#Y8YFn{Jx-F)0Q7j)OO50SmbHseDLX2}Bt7Nyqi@U+ccZpf&PP4Zw9g~gy_V~@( zqng}`&6#Jw>uqgU_b4)V*|0R*;pd{$Ce7bbnLE3PUZ(!rq0VCOb=p{`)$DwWTOm3> z1K60$e4jwdd}@c_OUaf5A5C3mc8C|H7Wjn+vJCJ)V&&?wSB(9IK0ccC*+Q9FB^Z}G z?L)NUXC-N}V4ZCZ`?&{Q%tfkgT-M<%(H75ftYCHq6Rk!u10IsQOjmhRWk%Lf4%h#fW4;_*74E~mC~QlIruGnP=JG!pBC#?6nEeO%E#`F+JNU!BnEoZAV=h6>0f=ea2+q@DPtzAXV zrp$WP2(CbNK^muD3Z$(`M~LBO{p4!_JF7;|-NZ0M=2Y6p?V4z8)AUdJwDYIJJKj2Q zOJTu2W2I;J{>E#m-qe$Cw>LhHNTq-8?61Y8Hsy0>8 zwSqIT{Z=7&KTu=h=0>y=c^Yi#nx`!lEzA>X4dWZ*5%c_+5}Y@|X@)lA(mg^`9NT^U zX;iuwuC>ldk1B0%Pg_ir@5{p&k|FM9;0=({s+4rm&ZvnQn++QNtZ;rXUvYgHd2u-w zocJy)_7<9eeb*vo)@4>jJ}Y0*Y3#aXWo4YETdd(;^!ab)p<(f$V#eo8yN>QS4|n17 zgX{=_j^*d6-A0ss8sj7uGf3{wY6n3vsZyGvvuBHZk({Zq{AY&+Q~^9qg$}#P%DOOV&(5~t?3mo-a+SX0!lJx~I*VNJs(2l)8?`!87VRPzm6JVhgW2ua zijFli^1zX3EgNEg6w-}6*EOROKrG)oMjmO({(HMY(~$@LEawacDYLg}(>UzPhYD^D$TZQ+K9o;N_hXq8!F#~a^~`9}AzM6i%p7xElUbt2 z-e>`)jovoqLMQ$9F0MA4Rn*ZpYfODSrKl)UV)+!N-F$A7BewRV$;)-c{I>~W4iP(V zoDYs)M$njXLb@BZX&;*-@@JIw6&f-F7i8+Pn_*7Aey;G98>_m$C1E9EJ*P-Hcv^o< zafQ6={Kre)s7K|t(|)NRT%Y&YXO?9Ym@b~LVC%*eo7Qf)bj#Y!Pu%dJZc;)ri|naJ{g-Kkq{}w{P3mEqrvQ zF&beGHCn^=DIFu4?(ziczb(I7f$$qt`Lsvp;Y{6fD|A~DEMn#d{~w;MY0?lo60u0M z8XS0V3zwwr5Jwtx`dN0G-_A8=)oKS_ZE?_9wE#7oJ9Xf!4h@Jx_$cF{QHVa1G|*Rj zcCfQ^xfF~l?I5u~8S`EG)YVA>(H{5#9@NPv#yZ`$nyv{LM{K3bnKET7Niu+`Sk1{^ zkGaob%tTJ^zw?yY_kfQ7LTkw67!Tgn7vYUyzbTyXWtqQTx^TvEnID4L>FvjeSjH4~ zLrP(^`zx9_8fqUf1^6)vyUQJquA1(QD83D`ZrBie)!A z@hwunGc^~&@Bl;_F}Gb(sTQ6tD3)eo=p3w zpQ~KbEr7z?t8+U?-Hns3sWPd8=g>zd!KpE?xmsS)HHm@Nv7A2&yhjG>vi{p&Q5xlinj8uL!;Uq>?BgiS8lLarbP z^2J9dZM&J(FkNmn4aUsr(8zq7K~<0 z%8@4I&7%~shqUk0O2+?d!h+#joN;kBv9q<-;Vf?~QDx+4EkaPCCJ)&JmXxCC>luxWb)R zLb=J}z4=sp!K%puq}3vS%d=nMGRmX2W=jAGqb8@%F^|N+zCm8%PaC;(+SrZL#BO8q z@?T=;SV)@(s3?w``c`hrXdO6-UIyX- literal 0 HcmV?d00001 diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 0000000..e663e50 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,2162 @@ +# translation of lt.po to Lithuanian +# Lithuanian translation of Glib library. +# Copyright (C) 2003-2005, 2007, 2008 Free Software Foundation, Inc. +# Tomas Kuliavas , 2003-2004. +# Žygimantas Beručka , 2004-2007. +# Mantas KriaučiÅ«nas , 2006-2007. +# Gintautas Miliauskas , 2007, 2008. +# Rimas Kudelis , 2010. +msgid "" +msgstr "" +"Project-Id-Version: lt\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 11:16+0200\n" +"Last-Translator: Rimas Kudelis \n" +"Language-Team: Lithuanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%" +"100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Virtaal 0.5.2\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Netikėtas požymis „%s“ elementui „%s“" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Elemento „%2$s“ požymis „%1$s“ nerastas" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Netikėta žymė „%s“, tikėtasi žymės „%s“" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Netikėta žymė „%s“ viduje „%s“" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Duomenų aplankuose nerasta tinkamo žymelių failo" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI „%s“ žymelė jau egzistuoja" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Žymelė URI „%s“ nerasta" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI „%s“ žymelėje neapibrėžtas MIME tipas" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI „%s“ žymelėje neapibrėžta privati vėliavėlė" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI „%s“ žymelėje nenurodyta jokia grupė" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Nėra programos pavadinimu „%s“ registravusios „%s“ žymelę" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Nepavyko iÅ¡skleisti vykdomosios eilutės „%s“ su URI „%s“" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Keitimas iÅ¡ koduotės „%s“ į koduotę „%s“ nepalaikomas" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nepavyko atverti keitiklio iÅ¡ „%s“ į „%s“" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Klaidinga baitų seka keitimo įvedime" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Klaida keitimo metu: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Nepilna simbolio seka įvedimo pabaigoje" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Negalima keisti atgalinio varianto „%s“ į koduotę „%s“" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Adresas „%s“ nėra absoliutus adresas naudojantis „file“ schemą" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Vietinio failo adresas „%s“ negali turėti simbolio „#“" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Adresas „%s“ yra klaidingas" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Kompiuterio vardas „%s“ adrese yra klaidingas" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Adrese „%s“ yra klaidingai perkoduoti symboliai" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Kelias „%s“ nėra absoliutus" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Klaidingas kompiuterio vardas" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Klaida atidarant aplanką „%s“: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nepavyko paskirti %lu baitų reikalingų perskaityti failą „%s“" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Klaida skaitant failą „%s“: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Failas „%s“ per didelis" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nepavyko perskaityti failo „%s“: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nepavyko atverti failo „%s“: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Nepavyko gauti failo „%s“ požymių: fstat() klaida: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nepavyko atverti failo „%s“: fdopen() klaida: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Nepavyko pervadinti failo „%s“ į „%s“: g_rename() klaida: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nepavyko sukurti failo „%s“: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Nepavyko atverti failo „%s“ raÅ¡ymui: fdopen() klaida: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nepavyko įraÅ¡yti failo „%s“: fwrite() klaida: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nepavyko įraÅ¡yti failo „%s“: fflush() klaida: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nepavyko įraÅ¡yti failo „%s“: fsync() klaida: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nepavyko užverti failo „%s“: fclose() klaida: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Nepavyko paÅ¡alinti egzistuojančio failo „%s“: g_unlink() failed: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablonas „%s“ klaidingas, jame negali bÅ«ti „%s“" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablone „%s“ nėra XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u baitas" +msgstr[1] "%u baitai" +msgstr[2] "%u baitų" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nepavyko perskaityti simbolinės nuorodos „%s“: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Simbolinės nuorodos nepalaikomos" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nepavyko atverti keitiklio iÅ¡ „%s“ į „%s“: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Negalima vykdyti tiesioginio skaitymo iÅ¡ g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Nepakeistų duomenų likučiai skaitymo buferyje" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanalas pasibaigia nepilnu simboliu" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Negalima vykdyti tiesioginio skaitymo iÅ¡ g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nepavyko atverti failo „%s“: open() klaida: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Nepavyko rasti failo „%s“: mmap() klaida: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Klaida eilutėje %d simbolyje %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Klaidingai koduotas UTF-8 tekstas varde – netinkamas „%s“" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s“ nėra tinkamas vardas" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s“ nėra tinkamas vardas: „%c“" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Klaida eilutėje %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nepavyko apdoroti „%-.*s“, kuris galėjo turėti skaičius simbolio apraÅ¡yme " +"(pvz., ê) - gal skaičius per didelis" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Simbolio apraÅ¡ymas nepasibaigė kabliataÅ¡kiu; greičiausiai JÅ«s panaudojote " +"ampersendo simbolį nepradėdami elemento įvedimo - apeikite ampersendą " +"įvesdami &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Simbolio apraÅ¡ymas „%-.*s“ neatitinka leistinus simbolius" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Aptiktas tuščias elementas '&;'; galimi elementai yra: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Elemento vardas „%-.*s“ nežinomas" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Elementas nepasibaigė kabliataÅ¡kiu; greičiausiai JÅ«s panaudojote ampersendo " +"simbolį nepradėdami elemento įvedimo - apeikite ampersendą įvesdami &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentas turėtų prasidėti elementu (pvz., )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ negali bÅ«ti raÅ¡omas po „<“ simbolio; jis nepradeda jokio elemento vardo" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Neįprastas simbolis „%s“, tikėtasi sulaukti „>“ simbolio, užbaigiančio " +"tuščią elementą „%s“" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Neįprastas simbolis „%1$s“, tikėtasi sulaukti „=“ po elemento „%3$s“ požymio " +"vardo „%2$s“" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Neįprastas simbolis „%s“, tikėtasi sulaukti „>“ arba „/“ simbolių, " +"užbaigiančių elementą „%s“, arba papildomo požymio; gal JÅ«s panaudojote " +"netinkama simbolį požymio varde" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Neįprastas simbolis „%1$s“, po lygybės tikėtasi sulaukti atidarančio " +"citavimo simbolio pradedant „%3$s“ elemento „%2$s“ požymio reikÅ¡mę" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ negali bÅ«ti raÅ¡omas po uždarančio elemento vardo „%s“; leistinas " +"simbolis yra „>“" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" +"Elemento „%s“ uždarymo simbolis sutiktas anksčiau už elemento atidarymo " +"simbolį" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Sutiktas elemento „%s“ uždarymo simbolis, tačiau Å¡iuo metu atidarytas kitas " +"elementas „%s“" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentas tuščias arba susideda tik iÅ¡ tarpų" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentas netikėtai pasibaigė tuoj po atidarančių skliaustų '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumentas netikėtai pasibaigė neuždarius dalies elementų - „%s“ yra " +"paskutinis atviras elementas" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentas netikėtai pasibaigė, nesulaukta uždarančių skliaustų simbolio <%s/" +">" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentas netikėtai pasibaigė elemento varde" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentas netikėtai pasibaigė požymio varde" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentas netikėtai pasibaigė elemento atvėrimo žyme." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentas netikėtai pasibaigė lygybės simboliu einančio po požymio vardo; " +"nerasta požymio reikÅ¡mė" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentas netikėtai pasibaigė požymio verte" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumentas netikėtai pasibaigė elemento „%s“ uždarančiame simbolyje" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentas netikėtai pasibaigė komentaruose arba apdorojimo instrukcijose" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "sugadintas objektas" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "vidinė klaida arba sugadintas objektas" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "nebėra atminties" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "pasiekta atgalinio sekimo riba" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "Å¡ablone yra dalinio atitikimo nepalaikomų elementų " + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "vidinė klaida" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "atgalinės nuorodos kaip sąlygos nepalaikomos daliniam atitikimui" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "pasiekta rekursijos riba" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "pasiekta tuščių poeilių darbalaukio riba" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "netinkama naujos eilutės vėliavėlių kombinacija" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "nežinoma klaida" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ Å¡ablono pabaigoje" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c Å¡ablono pabaigoje" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "neatpažintas simbolis po \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "kodai, keičiantys registrą, (\\l, \\L, \\u, \\U) čia neleistini" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "skaičiai ne iÅ¡ eilės {} kvantoriuje" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "skaičius per didelis {} kvantoriuje" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "trÅ«ksta baigiamojo ] simbolio klasei" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "klaidinga speciali seka simbolio klasėje" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "ruožas ne iÅ¡ eilės simbolio klasėje" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nėra ką kartoti" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "neatpažintas simbolis po (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "neatpažintas simbolis po (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "neatpažintas simbolis po (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "klasės POSIX vardais leidžiamos tik klasių viduje" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "trÅ«ksta baigiamojo )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") be atveriamojo (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "po (?R arba (?[+-]skaitmenys turi bÅ«ti )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "nuoroda į neegzistuojantį poÅ¡ablonį" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "trÅ«ksta ) po komentaro" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "reguliarioji iÅ¡raiÅ¡ka per didelė" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "nepavyko rezervuoti atminties" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "žiÅ«ros atgal teiginys nefiksuoto ilgio" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "netaisyklingas skaičius ar vardas po (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "sąlyginė grupė turi daugiau negu dvi Å¡akas" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "tikimasi teiginio po (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nežinomas POSIX klasės vardas" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX gretinimo elementai nepalaikomi" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "simbolio reikÅ¡mė \\x{…} sekoje per didelė" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "netaisyklinga sąlygą (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C neleistinas žiÅ«ros atgal teiginyje" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursyvus iÅ¡kvietimas gali veikti be galo" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "trÅ«ksta baigiamojo simbolio poÅ¡ablonio pavadinime" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "du vardiniai poÅ¡abloniai turi tą patį vardą" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "netaisyklinga \\P arba \\p seka" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nežinomas savybės vardas po \\P arba \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "poÅ¡ablonio vardas per ilgas (turi bÅ«ti iki 32 simbolių)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "per daug vardinių poÅ¡ablonių (iki 10000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "aÅ¡tuntainė reikÅ¡mė didesnė už \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupėje yra daugiau negu viena Å¡aka" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "neleidžiama kartoti DEFINE grupės" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "nenuoseklios NEWLINE savybės" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "po \\g nėra vardo riestiniuose skliaustuose arba teigiamo skaičiaus" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "netikėtas pakartojimas" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kodo pervirÅ¡is" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "perpildyta kompiliavimo sritis" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "anksčiau tikrintas nurodytas poÅ¡ablonis nerastas" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Klaida ieÅ¡kant reguliariosios iÅ¡raiÅ¡kos %s atitikmens: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE biblioteka sukompiliuota be UTF8 palaikymo" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE biblioteka sukompiliuota be UTF8 ypatybių palaikymo" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Klaida kompiliuojanti reguliarią iÅ¡raiÅ¡ką %s ties simboliu %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Klaida optimizuojant reguliariąją iÅ¡raiÅ¡ką %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "laukta Å¡eÅ¡ioliktainio skaitmens arba „}“" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "laukta Å¡eÅ¡ioliktainio skaitmens" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "simbolinėje nuorodoje trÅ«ksta „<“" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "nebaigta simbolinė nuoroda" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "nulinio ilgio simbolinė nuoroda" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "laukta skaitmens" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "neleistina simbolinė nuoroda" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "nevietoje galutinis „\\“" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "nežinoma kaitos seka" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Klaida apdorojant pakeitimo tekstą „%s“ ties simboliu %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Cituojamas tekstas neprasideda citavimo ženklu" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Nesutampantis citavimo simbolis komandinėje eilutėje arba kitame terpės " +"cituotame tekste" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekstas pasibaigė tuoj po „\\“ simbolio. (Tekste buvo įraÅ¡yta „%s“)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Tekstas pasibaigė nesulaukus %c atitinkančio citatos ženklo. (Tekste buvo " +"įraÅ¡yta „%s“)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekstas buvo tuščias arba turėjo vien tik tarpo simbolius)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nepavyko gauti duomenų iÅ¡ antrinio proceso" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Nepavyko sukurti konvejerio skirto keistis duomenimis su antriniu procesu (%" +"s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nepavyko perskaityti duomenų iÅ¡ antrinio konvejerio (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nepavyko pakeisti į aplanką „%s“ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nepavyko paleisti antrinio proceso (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Netinkamas programos pavadinimas: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Netinkama seka argumento vektoriuje, pozicijoje %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Netinka seka aplinkoje: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Netinkamas darbinis aplankas: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nepavyko paleisti pagalbinės programos (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Netikėta klaida tarp g_io_channel_win32_poll() funkcijos duomenų skaitymo iÅ¡ " +"antrinio proceso metu" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nepavyko gauti duomenis iÅ¡ antrinio proceso (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Netikėta klaida tarp select() funkcijos duomenų gavimo iÅ¡ antrinio proceso (%" +"s) metu" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Netikėta klaida iÅ¡ waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nepavyko atskirti (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nepavyko perimti antrinio proceso (%s) iÅ¡vedimo arba įvedimo" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nepavyko atskirti antrinio proceso (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nežinoma klaida vykdant antrinį procesą „%s“" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Nepavyko perskaityti reikiamo duomenų kiekio iÅ¡ antrinio pid konvejerio (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Simbolis neatitinka UTF-8 simbolių diapazono" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Klaidinga seka keitimo įvestyje" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Simbolis neatitinka UTF-16 simbolių diapazono" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Naudojimas:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[PARINKTIS…]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Pagalbos parinktys:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Rodyti pagalbos parinktis" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Rodyti visas pagalbos parinktis" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Programos parinktys:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nepavyko apdoroti sveikosios reikÅ¡mės „%s“, reikalingos %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Sveikoji reikÅ¡mė „%s“, reikalinga %s, virÅ¡ija ribas" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nepavyko apdoroti dvigubos reikÅ¡mės „%s“, reikalingos %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Dviguboji reikÅ¡mė „%s“, reikalinga %s, virÅ¡ija ribas" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Klaida apdorojant parinktį %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s trÅ«ksta argumento" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Nežinoma parinktis %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "PaieÅ¡kos aplankuose nepavyko rasti tinkamo raktų failo" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nėra paprastas failas" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Failas yra tuščias" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Raktų faile yra eilutė „%s“, kuri nėra raktas-reikÅ¡mė pora, grupė ar " +"komentaras" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Netinkamas grupės pavadinimas: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Raktų failas neprasideda grupe" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Netinkamas rakto pavadinimas: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Raktų faile yra nepalaikoma koduotė „%s“" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Raktų failas neturi grupės „%s“" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Raktų failas neturi rakto „%s“" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Raktų faile yra raktas „%s“ su reikÅ¡me „%s“, kuri nėra UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Raktų faile yra raktas „%s“, kuriame yra reikÅ¡mė, kurios negalima suprasti." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Raktų faile yra raktas „%s“, turintis nesuprantamą reikÅ¡mę." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Raktų faile yra raktas „%s“ grupėje „%s“, kuriame yra reikÅ¡mė, kurios " +"negalima suprasti." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Raktų faile nėra rakto „%s“ grupėje „%s“" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Raktų faile, eilutės pabaigoje yra pabėgimo simbolis" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Raktų faile yra klaidinga pabėgimo eilutė „%s“" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ReikÅ¡mės „%s“ negalima interpretuoti kaip skaičiaus." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Sveikoji reikÅ¡mė „%s“ virÅ¡ija ribas" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"ReikÅ¡mės „%s“ negalima interpretuoti kaip slankiojo kablelio skaičiaus." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ReikÅ¡mės „%s“ negalima interpretuoti kaip loginės." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Per didelė skaičiavimo reikÅ¡mė perduota %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Srautas jau užvertas" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operacija nutraukta" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Netinkamas objektas, nepavyko inicijuoti" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Klaidinga baitų seka įvestyje" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Nepakanka paskirties vietos" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "AtÅ¡aukiamas inicijavimas nepalaikomas" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Nežinomas tipas" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s failo tipos" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s tipas" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Netikėta ankstyva srauto pabaiga" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Nepavadinta" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Darbalaukio failas nenurodė Exec lauko" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Nerastas terminalas, reikalingas programai" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Nepavyko sukurti naudotojo nustatymų aplanko %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nepavyko sukurti naudotojo MIME nustatymų aplanko %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nepavyko sukurti naudotojo darbalaukio failo %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Specialus apibrėžimas %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "įrenginys nerealizuoja iÅ¡stÅ«mimo" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"įrenginys nerealizuoja iÅ¡stÅ«mimo nei su papildoma operacija, nei be jos" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "įrenginys nerealizuoja laikmenos tikrinimo užklausimo" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "įrenginys nerealizuoja startavimo" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "įrenginys nerealizuoja stabdymo" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nepavyko apdoroti GEmblem koduotės versijos %d" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Netinkamas leksemų skaičius (%d) GEmblem koduotėje" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nepavyko apdoroti GEmblemedIcon koduotės versijos %d" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Netinkamas leksemų skaičius (%d) GEmblemedIcon koduotėje" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Tikėtasi GEmblem skirto GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operacija nepalaikoma" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Tėvinis prijungimo taÅ¡kas neegzistuoja" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Negalima kopijuoti ant aplanko" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Negalima kopijuoti aplanko ant aplanko" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Nurodytas failas jau egzistuoja" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Negalima rekursyviai kopijuoti aplanko" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Skaidymas nepalaikomas" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Klaida skaidant failą: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Nepavyksta nukopijuoti specialaus failo" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Netaisyklinga simbolinės nuorodos reikÅ¡mė" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Å iukÅ¡lės nepalaikomos" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Failų varduose negali bÅ«ti '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "skirsnis nepalaiko prijungimo" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nėra programos, priregistruotos kaip skaitančios šį failą" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumeratorius užvartas" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Failų enumeratoriui liko neatlikta operacija" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Failų enumeratorius jau užvertas" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nepavyko apdoroti GFileIcon koduotės versijos %d" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Netinkami GFileIcon įvesties duomenys" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Srautas nepalaiko query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Pozicijos perkėlimas sraute nepalaikomas" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Trumpinimas įėjimo srauto nepalaikomas" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Trumpinimas srauto nepalaikomas" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Neteisingas leksemų skaičius (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Nėra tipo klasės pavadinimui %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tipas %s nerealizuoja GIcon sąsajos" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Tipas %s neklasifikuotas" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Netinkamas versijos numeris: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tipas %s nerealizuoja from_tokens() GIcon sąsajoje" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Nepavyko apdoroti pateiktosios piktogramos koduotės versijos" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Å altinio srautas nerealizuoja skaitymo" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Srautui liko neįvykdyta operacija" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Nepakanka vietos lizdo adresui" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nepalaikomas lizdo adresas" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Nepavyko rasti įprasto vietinių aplankų stebėjimo tipo" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Netaisyklingas failo vardas %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Klaida skaitant failų sistemos informaciją: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Nepavyko pervadinti Å¡akninio aplanko" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Klaida pervadinant failą: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Nepavyko pervadinti failo, failo vardas jau užimtas" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Netaisyklingas failo vardas" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Klaida atveriant failą: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Nepavyko atverti aplanko" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Klaida trinant failą: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Klaida perkeliant į Å¡iukÅ¡les failą: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nepavyko sukurti Å¡iukÅ¡lių aplanko %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Nepavyko rasti Å¡akninio aplanko Å¡iukÅ¡lėms" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Nepavyko rasti ar sukurti Å¡iukÅ¡lių aplanko" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nepavyko Å¡iukÅ¡lių informacijos failo: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nepavyko į Å¡iukÅ¡les perkelti failo: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Klaida atveriant aplanką: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Failų sistema nepalaiko simbolinių nuorodų" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Klaida kuriant simbolinę nuorodą: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Klaida perkeliant failą: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Negalima perkelti aplanko per aplanką" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Atsarginės kopijos sukÅ«rimas nesėkmingas" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Klaida trinant nurodytą failą: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Perkėlimas tarp prijungimo taÅ¡kų nepalaikomas" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Atributo reikÅ¡mė turi bÅ«ti netuščia" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "netaisyklingas atributo tipas (tikimasi simbolių sekos)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "netaisyklingas iÅ¡plėstinio atributo pavadinimas" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Klaida nurodant iÅ¡plėstinį atributą „%s“: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Klaida skaitant failo „%s“ informaciją: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (netaisyklinga koduotė)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Klaida skaitant failo deskriptoriaus informaciją: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Klaidingas atributo tipas (tikimasi uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Klaidingas atributo tipas (tikimasi uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Klaidingas atributo tipas (tikimasi baitų sekos)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Simbolinėms nuorodoms teisių nustatyti negalima" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Klaida nustatant teises: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Klaida nustatant savininką: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "Simbolinė nuoroda turi bÅ«ti netuščia" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Klaida nustatant simbolinę nuorodą: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Klaida nustatant simbolinę nuorodą: failas nėra simbolinė nuoroda" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Klaida nustatant pakeitimo arba prieigos laiką: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux kontekstas bÅ«ti nelygus NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Klaida nustatant SELinux kontekstą: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux Å¡ioje sistemoje neįjungtas" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Atributo %s nustatymas nepalaikomas" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Klaida skaitant failą: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Klaida keičiant poziciją faile: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Klaida užveriant failą: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Nepavyko rasti numatytojo vietinių failų stebyklės tipo" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Klaida raÅ¡ant į failą: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Klaida Å¡alinant senos atsarginės kopijos nuorodą: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Klaida kuriant atsarginę kopiją: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Klaida pervadinant laikinąjį failą: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Klaida trumpinant failą: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Klaida atveriant failą „%s“: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Paskirties failas yra aplankas" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Paskirties failas nėra paprastas failas" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Failas buvo pakeistas kitos programos" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Klaida iÅ¡trinant senąjį failą: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Netaisyklingas GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Netinkama pozicijos keitimo užklausa" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nepavyko sutrumpinti GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Atminties iÅ¡vedimo srauto dydis nekeičiamas" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Nepavyko pakeisti atminties iÅ¡vedimo srauto dydžio" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Atminties kiekis, reikalingas įraÅ¡ymui apdoroti, netelpa į prieinamą adresų " +"erdvę" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "PraÅ¡oma perkelti poziciją dar prieÅ¡ srauto pradžią" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "PraÅ¡oma perkelti poziciją jau už srauto pabaigos" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "prijungtasis objektas nepalaiko atjungimo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "prijungtasis objektas nepalaiko iÅ¡stÅ«mimo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"prijungtasis objektas nepalaiko atjungimo nei su papildoma operacija, nei be " +"jos" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"prijungtasis objektas nepalaiko iÅ¡stÅ«mimo nei su papildoma operacija, nei be " +"jos" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "prijungtasis objektas nepalaiko pakartotinio prijungimo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "prijungimo taÅ¡kas nepalaiko turinio tipo spėjimo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "prijungimo taÅ¡kas nepalaiko sinchroninio turinio tipo spėjimo" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Mazgo varde „%s“ yra ženklas „[“, bet nėra „]“" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "IÅ¡vedimo srautas nepalaiko raÅ¡ymo" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Å altinio srautas jau užvertas" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Klaida iÅ¡riÅ¡ant „%s“: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Klaida atvirkščiai iÅ¡riÅ¡ant „%s“: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nėra „%s“ tarnybos įraÅ¡o" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Laikinai nepavyko iÅ¡riÅ¡ti „%s“" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Klaida iÅ¡riÅ¡ant „%s“" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Netinkamas lizdas, nepavyko inicijuoti" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Netinkamas lizdas, nepavyko inicijuoti: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Lizdas jau užvertas" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "iÅ¡ fd kuriamas GSocket: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nepavyko sukurti lizdo: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Nurodytas nežinomas protokolas" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "nepavyko gauto lokalaus adreso: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "nepavyko gauti nuotolinio adreso: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "nepavyko klausytis: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Susiejimo su adresu klaida: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Klaida priimant ryšį: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Klaida prisijungiant: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Prisijungiama" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Klaida prisijungiant: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nepavyko gauti laukiančios klaidos: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Klaida priimant duomenis: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Klaida siunčiant duomenis: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Klaida užveriant lizdą: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Laukiama lizdo bÅ«senos: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Klaida siunčiant praneÅ¡imą: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "„Windows“ sistemoje „GSocketControlMessage“ nepalaikoma" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Klaida priimant praneÅ¡imą: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Nežinoma klaida prisijungiant" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Gavėjas jau užvertas" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Pridėtasis lizdas yra užvertas" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nepavyko apdoroti GThemedIcon koduotės versijos %d" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Tikėtasi vieno kontrolinio praneÅ¡imo, bet sulaukta %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Netikėtas tarnybinių duomenų tipas" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Tikėtasi vieno fd, bet sulaukta %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Gautas netinkamas fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Klaida skaitant unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Klaida užveriant unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Failų sistemos Å¡aknis" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Klaida raÅ¡ant į unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstrakčiųjų unix srities lizdų adresai Å¡ioje sistemoje nepalaikomi" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "skirsnis nerealizuoja iÅ¡stÅ«mimo" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "tomas nerealizuoja iÅ¡stÅ«mimo nei su papildoma operacija,nei be jos" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nepavyko rasti programos" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Klaida paleidžiant programą: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI nepalaikomi" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "saitų keitimai win32 sistemose nepalaikomi" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Saitų kÅ«rimas win32 sistemose nepalaikomas" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Nepakanka atminties" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Vidinė klaida: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Reikia daugiau įvesties" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Netinkami suspausti duomenys" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Klaidinga UTF-8 seka įvestyje" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Pasiekta virÅ¡utinė duomenų masyvo riba" + +#~ msgid "do not hide entries" +#~ msgstr "neslėpti įrašų" + +#~ msgid "use a long listing format" +#~ msgstr "naudoti iÅ¡samų sąraÅ¡o formatą" + +#~ msgid "[FILE...]" +#~ msgstr "[FAILAS...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Simbolis „%s“ nepriimtinas elemento vardo pradžioje; & simbolis pradeda " +#~ "elemento įvedimą; jei Å¡is ampersendas nėra elemento pradžia, apeikite jį " +#~ "su &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Simbolis „%s“ nepriimtinas elemento varde" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Tuščias simbolio apraÅ¡ymas; ten turėtų bÅ«ti skaičiai, pvz. dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Nebaigtas elemento apraÅ¡ymas" + +#~ msgid "Unfinished character reference" +#~ msgstr "Nebaigtas simbolio apraÅ¡ymas" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Klaidingai koduotas UTF-8 tekstas – per ilga seka" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Klaidingai koduotas UTF-8 tekstas – ne pradžios simbolis" + +#~ msgid "file" +#~ msgstr "failas" + +#~ msgid "The file containing the icon" +#~ msgstr "Failas, kuriame yra piktograma" + +#~ msgid "name" +#~ msgstr "pavadinimas" + +#~ msgid "The name of the icon" +#~ msgstr "Piktogramos pavadinimas" + +#~ msgid "names" +#~ msgstr "pavadinimai" + +#~ msgid "An array containing the icon names" +#~ msgstr "Masyvas iÅ¡ piktogramų pavadinimų" + +#~ msgid "use default fallbacks" +#~ msgstr "naudoti numatytuosius atsarginius variantus" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Ar naudoti numatytuosius atsarginius variantus, rastus sutrumpinant " +#~ "pavadinimą ties „-“ simboliais. Pavadinimai po pirmojo, jei duoti keli, " +#~ "ignoruojami." + +#~ msgid "File descriptor" +#~ msgstr "Failo deskriptorius" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Failo deskriptorius skaitymui" + +#~ msgid "Close file descriptor" +#~ msgstr "Užverti failo deskriptorių" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Ar užverti failo deskriptorių užvėrus srautą" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Failo deskriptorius raÅ¡ymui" diff --git a/po/lv.gmo b/po/lv.gmo new file mode 100644 index 0000000000000000000000000000000000000000..d51b92f3f6e861817380dafa8728d3fadb209562 GIT binary patch literal 10291 zcmd6sU5uR9S;ya$khCtQC2a{Uq?{&Q&zkJ4cWpN~yBjy|dR-ekj+3qv0Ts)cnX|KJ zXXbq;@5egcBGjc)#0{dwfCQ?lx&;Z?8-#!hWW+^h0U=O@=nX`wgcO0GNL(S&JAThO z@7Ij?3xoutefK{z=bYy}=lMR*eEW$;1xdq z4k&d09Xtzu{6r8efUkp>z+VAh1iu9eoe#a2G4Pcfe;1tR^CREq`8o%FlFx1M6X4gu zYvA95Ujm;w32)#Zfgc3_7F6Ir<=;R4{Xx*+^E2Q_!Rw&V+XPR8zXyIC{1*5D@VlU# z`{etA;Cb*2C~~!66MPFi1^yxUEciBf4t)Im>;W!4_ltG4KI+2K;Am4tx?OMb1}2k?Svm!q;DcBJckMp9G&p z7;^4qP{w*Fo8D8K-p9h7`Z-LK%e+pg%{}JRb zP#A^i@e(L{e*+Y~{3duE{7X>u`$0C5^()|WpasRwz6uIIe+`}jzXSd__ym(*0e=Gg z2KZ(03*gUk2-)WyQ1&?qlVTr>;Ok%reiHoi{QJisD*HbViX1jUIrrzmS#TF*YVZ%B z=t+!g8Mp<)dhn~D?DNOqP4FG?5m5FlUgvouG7`JReaBvMMoi!BAp>mV=&peCJYrMw zI_V+6e1a1^!YeN8WC4u5p5T+5@l!mAC3uwQ1)lfuAU=1#OW=EX-oPED-VqkccSW5X_Ejip94vZ!pT2KugB*D_rjDjh1*Hv-SZMiBL+GqF{%3;Ec;y* zx*6C|rzR1Gv>NI-wYp!)QD){kjIvZk>zp9$8Wb9<+pAZa^UobM<3ephY}QR|!nRQz z%tP3Pb9Kk28|^tX~}9~&4ww& z#Kbskl5!AdNnvW!yQ-;7($+(CR8r81I>o2OVA)A5u~Dej<7iMLU5HC4*6lmVhQlaM z4MLByzCVa4zl|W(R6kR#yCP9mIaROQzEMw4B~J&Jqju&D8%{Y<7MeGQ1_$YIPQ5OU zB6ein$aFtZiS5Es8(nI{|cj#iX&h@4gIAhrFzXQAoM@D8>sXX|U2 zERG~RVv&bPbVe2C=3K-$Q*h!LKU(2N>>zSmno7=GtmqCzGCop!$1U}vrp;`3RxP!n zsCV&nwL;i6gCTB+!4aQQO_=MbD8%X!6RtAUZ4<2ILEm|rtZ55xof(D2yW_UAnBbAJ z%ITvxxCB{I=Yi{SliJ*ID#40l46+g?8mAT;#34fn@)^v1Z}DXvn*|>))TuYJC|y*i z`tq+U|MW0Q7K0T}HCQ!(Asg=$y4d{ zX_B>w&PlkEjx+MwWR!OB;Ce@P4ms}VhH+T_XIToXoFcSAiyndI)Y zHX#eQCeN{s1JUe(a}GLsY`j$|vi?wNl9({--mFik+L68%dRLa5jBme@x%z`@$5%=& z@4NLuF>{0J!&RQe7l*F8Vb;@#l8bDf*Iqb*lL&jb6SuN;%AVlmPQ7dqx2XkW%HkIq zMZy_N^FHKbH$@C{!R{zx7aJm%#+h2FE&eFwmShfJA4zndAUq?>qM;N4R5Vm2wJg7= zsJ=GzFd3`KY%brbB9lt8w#--Yhcld~Sc$BL>i~|ne>rq#gGAi5TM__V9(94C^soJ8 zb!)Pyt;|6C3KSuD6L>`!Kt$$Esn<;+b$dP6DdCX#L);WDgH`fcUt*Xj1scxOW>i8& zn%9MSzN6}LdRrCBzWQq!qKBL|C4g`qe|SlJ>rsZDB;-xCXVvtoBw|@7V?yOL`<7(t zm5OS7wx;kymR2cwnq3ae$!x^lw_m;H&zH}WyMj9?_TkIwnqep7OGwW7WcPjHT4Hu$ zhb8HWc~VRFeWWa>6t_4Vw)>f@V;j#j9Mz#tH^gCcE##L_Ot6(ieaQeaA-G*u+se4a zh@FmI!MLBEJG(Zd;wFxY=ZaRU*hbx4&o=wgOK{S*MD!z<`?$9sPj|FUhqeO|7r$z;yIZYTFW5!=EZimj8FyL`BMFlQ-%Eig0d+~9^A7iMd-)}n0^Hv|+ila@A z(7e`ZzQ$e4l?&azZJl`4$epM8Qqr}Z=BKi5(p-%e)QMX!uQr!Ct@uRqGOn`u+L2 zFnuvf+^m(VqO)E$$c{%F z=1Fs$1AdL`&uDI-o`hyM0@Gq40H#zDP?k(Y8|0=iktw@9B>9haQ?)s|*XIs1+C?@Y z1E#lkf7~U-jmEkn|5F-ylf*4oLqxh|Y)4vEX)m^^HEi#cnAH@tnWR-gCO@=+T4Gz0LYzNB4qPOVyM4wv_LZa97KEqn-T*FFZWPeIrG%^hrX~g3;~K zj$A>oq=D@b(zu@3L@b7Zp4!~oP4H`zMzE5qQ%da4lDD?ePbV7CTJeexQ>1P=R#Pl- zOIGBw-3=%2hg{G5A)BJ!N{wC`c?MF*sb=&o`V~T3dmST_j1$CiJ$3C6B3hQra83(J zr|~p%MQ>L0MKD7=k;rYj+KO>l?4&w6egnH`fT0#VIM0HjcP&vPjgdVVs97Za5$BP` z$kyl{JhGab>EYWsLqw~+NSH$5yx)R%N}rVX^wEf@(k$tv^sf{0gm83ig*M^eJS_U>C;=Uy94p@$fuN@HVhH`e0z zdQ0rebyN=Lsiz05_K|{Z}UD&%i;rY-NB$W zIVk5{-sVC%(w1gan{X}uU`?zuJejyx%1|1Wl?*ak9pdZ}@^bEuqO!96;sryXg>Uia zJS60dWNLZ{=d&}l_Ddm3cZ@V6xF*hw6P;$llUAwiVb*R)99C`xLt8Xbe68u`IF3ba zxLk`1?NIOC$C;_py*BF-anYV!a0D4L5)NGnvZCp|)+sazZs`GmR~*}Msi~cP5Tl-^ zS+l6}YzU!Z0OzD?aJ}8bdNmSbB*gt61lZAoz1@x`yhy7)K@(Bx?*7;F0s1u^tUGVY z6yJIu=3YWurbp=`fm~wn*isi>$!pS4s13Wk=gd&@7lB^__#`1;Z{9R^yJM(2kRu7- zWyu4nl{4_CZmb7Amn9`{N~Z=JB|u8xj8zNs34OO2Ta`Xg#Zy%gjLoV#HAha(36`8E zx}*EzY7;vpdRxbcXKbH|IUOyT#7WR!+OTq;L$YK+6)l^v6qA#G#bNFe2Wz01;B{9v zZVn_^WK6k=WOBEub6?N6hfkaoMLCLgcR@ll z#ca#HnJ>2G$h%8i8vPn5CzepWOL}8}jsne>Wl8+EAOC2e0*_|$s z6z;)iG`@xR*Xm=jgc;=vA8~5w1X1x6W>+zn+hdWDebId!inN2IfRTPsxv!m3J@^VE zl1^7dMpDTr7G2gE-@+|k*S)My^JBETg+~`I!4J6f?`0NxC{bc#RlJi`|#Yxj+zAdF6u? zTlt)v|2(_u$(Hr+(8dEPKU$VLTW*qU-G+%B_LdwjGNsr?9>jL?eBL+8sYsfW-KA~h z*e&VS3o~gQm9}9LX&xQ8UMS`T#kAPf{uKqk6rB#r_Klk(e&Q@b%6nG2n`~0ww_3oh zv6!6%S0DCNtxDQsQ*T7%oj&=~N0xF@De!__giQl!*^C~zJ9b|0xbnj{j+~eo-n&mw z$nPbDlsrp&NgvojlIu=_0Ui{!51?0ckPcm5#NUT#O!SU!nr+La2~*6Oo, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2002-12-19 01:04+0200\n" +"Last-Translator: Artis Trops \n" +"Language-Team: Latvian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Savāda rakstzÄ«me '%s', gaidÄ«ju '=' aiz atribÅ«ta nosaukuma '%s' elementam '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konversija no rakstzÄ«mju kopas '%s' uz '%s' nav atbalstÄ«ta" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nevarēju atvērt konvertātoru no '%s' uz '%s': %s" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Nepareiza baitu secÄ«ba konversijas ievadē" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Kļūda konversējot: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Daļēja simbolu secÄ«ba ievades beigās" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nevar pārveidot atkritienu '%s' uz rakstzÄ«mju kopu '%s'" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' nav absolÅ«tais URI, lietojot failu shēmu" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Lokālā faila URI '%s' nedrÄ«kst saturēt '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ir nepareizs" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Hostdatora nosaukuma URI '%s' ir nepareizs" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' satur nepareizi izvairÄ«gas rakstzÄ«mes" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ceļvārds '%s' nav absolutais ceļš" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nepareizs hostdatora nosaukums" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Kļūda atverot direktoriju '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nevarēju atrast %lu baitus, lai nolasÄ«tu failu \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nespēju nolasÄ«t no faila '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nevarēju atvērt failu '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Nevarēju dabÅ«t faila '%s' atribÅ«tus: fstat() neizdevās: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Veidne '%s' nepareizs, nedrÄ«kstētu saturēt '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Veidne '%s' nebeidzas ar XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, fuzzy, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nevarēju atvērt konvertātoru no `%s' uz '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Nevaru izpildÄ«t jēllasÄ«Å¡anu iekÅ¡ g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "PāpalikuÅ¡ie nepārveidotie dati nolasÄ«Å¡anas buferÄ«" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanāls pārtrÅ«kst daļējā rakstzÄ«mē" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nevaru izpildÄ«t jēllasÄ«Å¡anu iekÅ¡ g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Kļūda rindā %d rakstzÄ«me %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Nepareizi kodēts UTF-8 teksts" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Kļūda rindā %d: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nevarēju parsēt '%s', kur vajadzētu bÅ«t ciparam iekÅ¡ rakstzÄ«mes atsauces " +"(ê piemēram) - iespējams, ka cipars ir pārāk liels" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"RakstzÄ«mes atsauce nebeidzās ar semikolu; visdrÄ«zāk jÅ«s lietojāt & zÄ«mi bez " +"nodoma sākt entÄ«tiju - aizvieto & zÄ«mes ar &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "RakstzÄ«mes atsauce '%s' neÅ¡ifrē atļautu rakstzÄ«mi" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"PamanÄ«ta tukÅ¡a entÄ«tija '&;'; derÄ«gas entÄ«tijas ir: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "EntÄ«tijas nosaukums \"%s\" nav zināms" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"EntÄ«tija nebeidzās ar semikolu; visdrÄ«zāk jÅ«s lietojāt & zÄ«mi bez nodoma " +"sākt entÄ«tiju - aizvieto & zÄ«mes ar &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentam jāsākās ar elementu (piem., )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' nav atļauta rakstzÄ«me, sekojoÅ¡a aiz rakstzÄ«mes '<'; tā nedrÄ«kst iesākt " +"elementa vārdu." + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Savāda rakstzÄ«me '%s', gaidÄ«ju '>' rakstzÄ«mi, kas nobeigtu sākuma tagu " +"elementam '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Savāda rakstzÄ«me '%s', gaidÄ«ju '=' aiz atribÅ«ta nosaukuma '%s' elementam '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Savāda rakstzÄ«me '%s', gaidÄ«ju '>' vai '/' rakstzÄ«mi, kas nobeigtu sākuma " +"tagu elementam '%s' vai fakultatÄ«vi atribÅ«tu; iespējams, jÅ«s lietojāt " +"nepareizu rakstzÄ«mi atribÅ«ta nosaukumā" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Savāda rakstzÄ«me '%s', gaidÄ«ju atvērtās pēdiņas pēc vienādÄ«bas zÄ«mes, " +"nosakot vērtÄ«bu atribÅ«tam '%s' no elementa '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' nav derÄ«ga rakstzÄ«me, sekojot aizverošā eementa nosaukumam '%s'; " +"atļautā rakstzÄ«me ir '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elements '%s' tika aizvērts, neviens elements paÅ¡laik nav atvērts" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elements '%s' tika aizvērts, bet paÅ¡laik atvērtais elements ir '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokuments bija tukÅ¡s vai saturēja tikai tukÅ¡u atstarpi" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokuments negaidÄ«ti izbeidzās tieÅ¡i pēc atvērtās stÅ«ra iekavas '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokuments negaidÄ«ti izbeidzās ar joprojām atvērtiem elementiem - '%s' bija " +"pēdējais atvērtais elements" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokuments negaidÄ«ti izbeidzās, cerēju ieraudzÄ«t aizveroÅ¡o stÅ«ra iekavu, " +"beidzoties ar tagu <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokuments negaidÄ«ti izbeidzās iekšā elementa nosaukumā" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokuments negaidÄ«ti izbeidzās iekšā atribÅ«ta nosaukumā" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokuments negaidÄ«ti izbeidzās elementa-atveroÅ¡ajā tagā." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokuments negaidÄ«ti izbeidzās aiz vienādÄ«bas zÄ«mes, sekojot atribÅ«ta " +"nosaukumam; nav atribÅ«ta vētÄ«bas" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokuments negaidÄ«ti izbeidzās kamēr iekšā atribÅ«ta vērtÄ«bā" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokuments negaidÄ«ti izbeidzās iekšā elementa '%s' aizveroÅ¡ajā tagā" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokuments negaidÄ«ti izbeidzās iekšā komentārā vai apstrādes instrukcijā" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanāls pārtrÅ«kst daļējā rakstzÄ«mē" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Nepareiza baitu secÄ«ba konversijas ievadē" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Nepabeigta rakstzÄ«mes atsauce" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Nepabeigta rakstzÄ«mes atsauce" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Nepabeigta rakstzÄ«mes atsauce" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Kļūda rindā %d rakstzÄ«me %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Nepabeigta entÄ«tijas atsauce" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citētais teksts nesākas ar jautājuma zÄ«mi" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "NeatbilstoÅ¡a jautājuma zÄ«me komandrindā vai citā čaulas-citētā tekstā" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teksts beidzās tieÅ¡i pēc '\\' rakstzÄ«mes. (Teksts bija '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teksts beidzās pirms atbilstoÅ¡ais citāts tika atrasts priekÅ¡ %c. (Teksts " +"bija '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksts bija tukÅ¡s (vai saturēja tikai tukÅ¡umus)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nevarēju nolasÄ«t datus no bērnprocesa" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nevarēju izveidot programkanālu komunikācijai ar bērnprocesu (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nevarēju nolasÄ«t no bērna programkanāla (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nevarēju pāriet uz direktoriju '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nevarēju izpildÄ«t bērnprocesu (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Nepareizs hostdatora nosaukums" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Nepareiza secÄ«ba konversijas ievadē " + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Kļūda atverot direktoriju '%s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nevarēju izpildÄ«t palÄ«ga programmu" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"NegaidÄ«ta kļūda iekÅ¡ g_io_channel_win32_poll(), lasot datus no bērnprocesa" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nevarēju nolasÄ«t datus no bērnprocesa (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "NegaidÄ«ta kļūda iekÅ¡ select(), lasot datus no bērnprocesa (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "NegaidÄ«ta kļūda waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Neizdevās sadalÄ«t (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nevarēju izpildÄ«t bērnprocesu \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nevarēju novadÄ«t bērnprocesa (%s) izvadi vai ievadi" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nevarēju sazarot bērnprocesu (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nezināma kļūda, izpildot bērnprocesu \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Nevarēju nolasÄ«t pietiekami daudz datus no bērna pid programkanāla (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "RakstzÄ«me nav UTF-8 laukā" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Nepareiza secÄ«ba konversijas ievadē " + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "RakstzÄ«me nav UTF-16 laukā" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Kļūda konversējot: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Nepareizs hostdatora nosaukums" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Nepareizs hostdatora nosaukums" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' satur nepareizi izvairÄ«gas rakstzÄ«mes" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Nepareiza baitu secÄ«ba konversijas ievadē" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Nepareizs hostdatora nosaukums" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Nepareizs hostdatora nosaukums" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Kļūda atverot direktoriju '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokuments negaidÄ«ti izbeidzās iekšā atribÅ«ta nosaukumā" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Kļūda atverot direktoriju '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Kļūda rindā %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Nepareizs hostdatora nosaukums" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Nevarēju atrast %lu baitus, lai nolasÄ«tu failu \"%s\"" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Neizdevās izveidot failu '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Kļūda nolasot failu '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Kļūda rindā %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Kļūda konversējot: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Nepareizs hostdatora nosaukums" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Nepareiza secÄ«ba konversijas ievadē " + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "RakstzÄ«me '%s' nav derÄ«ga entÄ«tijas nosaukuma sākumā; rakstzÄ«me & sāk " +#~ "entÄ«tiju; ja Å¡Ä« zÄ«me netiek atbalstÄ«ta, lai bÅ«tu entÄ«tija, aizvieto to ar " +#~ "&" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "RakstzÄ«me '%s' nav derÄ«ga entÄ«tijas nosaukumā" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "TukÅ¡a rakstzÄ«mes atsauce; bÅ«tu jāiekļauj cipars, kā dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Nepabeigta entÄ«tijas atsauce" + +#~ msgid "Unfinished character reference" +#~ msgstr "Nepabeigta rakstzÄ«mes atsauce" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Nepareizi kodēts UTF-8 teksts" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Nepareizi kodēts UTF-8 teksts" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Hostdatora nosaukuma URI '%s' ir nepareizs" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Hostdatora nosaukuma URI '%s' ir nepareizs" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Kļūda nolasot failu '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Kļūda konversējot: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Nevarēju atvērt '%s': fdopen() neizdevās: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Konvertācija no rakstzÄ«mju kopas '%s' uz '%s' nav atbalstÄ«ta" + +#~ msgid "Incorrect message size" +#~ msgstr "Nepareizs ziņas izmērs" + +#~ msgid "Socket error" +#~ msgstr "Kontakta kļūda" diff --git a/po/mai.gmo b/po/mai.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9d7f6061c6d3c630d1ac94d64721e1cba1dbb3a1 GIT binary patch literal 41277 zcmd6w3!Gh5eeXBcTNJUVASznAg@#EqGb8~aB;id05kioJhXoBMGbfWnX3iPsoJojQ z9D+(PAie^YDB&?f5D3B4pj-u&t5s^PRV%hu>1glu+TMEGtD@Fwz2D#ezxL}q=D|Zf zA69;6@4eQ4{om`q);V){{6){+9`X7$?G>~`o)blv>=#7`zCd@Q=!zFd(ZS$maDVXn zfZGFp7X=_;Tmxq%RjFK{{uW0eECbG=xFdf5R%a-*bUwk?tdN>ohLxe`!a~dU=KJ4 zTnTEv&EQ;cJ2(q`1QfqN0FM9+Zvnpx{t-9|(Z%4cU=R3h z@KxaRP_nL%17RsDgC+1va2YrOO0KRyjG_hLrQjm)22k_-C3p&W;Nebx1$YtH*9QD9 zIG^hiU_yG?07{-6;K|@;!PkKM#Zj~zJRW>6coiu99Q;bx20TCs7 zAIN{vef$H-=x;#v`*#r2M+c!a(VGRv;381tE&*kyO`z=g?r{IkfR6-xJUsse$bZp` zFrvo42Gl&S12ujKWXfnOh^eBx!}aGt+4uXP`n}+fqX^YSvqAM+2Fl)-fuegoC^{bj z)&EPN`u$VDUj=*#$~=kt^FeM!Ltq!U9h6-k0>$6Ig3|Z%a3b+>HmLq1AdjM(LB-W) zK+XHN;0fSQLHWr%i0b+hP7EaWaBZO$m8ugm+=OaPI!Kt9+s)MV++reev&%hJGlX!Rz_@|)gJPL}=6QKBe2|+~H=y*``l|jk% zE>M2?=b-HKSh)T%DE~Qhp3~_8#m9M|;&}_W1l$KouRj8%#~0E`_E-o?Kf~aQzz>1q zZx47s_)GB3;BJU%p4k{%cnT;xUJPQ2=t>Y)qK|+v`1j%YFF^4fAM0^?I`~4aUk^&& z4PXpz1EueKLCN=dQ2cxkl%1adrKcB=Or)0uAfiMUfzt0*Pi;!R{x=cu*8vYFDBigru>s<0(dSO` zxcq6r15Wnq!$Ik70r+C@0&oww0sJiZ@>8Pd6X18i3V7qG?vK%FUKh**nKF70coz6& zkfG6`D0drpA^0cY_rMk4iDwWK;5Kj__+MZzSYGOM9tA(Z_3z_+qu>s(3clh@av!)2 z9030s+yO3T(o4Z_g5vMk<>UbH7Vz!h%U|pH;Z|@J*N=npn+0d1Yj6wr5cpN_3G{UX zL3$q7@8IDk@G)=;crJrhs~>nVcodz)&)dM4G42uYD_np3b-4YcKUtb2JU|tJPCX*&V*{Cvp~u9VNiVj6qGzC^!vEY;AXD( zg7Vk7>!S!$MI#_8j=l(r|08gwtH4XZ2KXJY2A+R8eZfb-W5I4NF9T1; zN##Gcf};1*LFeanpsqgv9=0Fx0wP-UgK88(GFrhT*MOe@rH507JT7hkQEBv7;77oo zH#t9l2VTMTSp?O^;Ag=(;9+&I8_ob%aJ?SX{RhCKzzGmjMEfJ$dEn)s^#4h48TbTv zD!2rpgjWXq42a7_&)Vqnl)xjn9s_5AUjVznAA*|a#VFxb;1cjSupg8k-2xIS(YL@= z;9P`Q3XX!Z%U^)kg9l+OM2tQRKBDV4<3r%r!1sf1drK7k19&h&52@(iz~x~7TixG3 z3gS}HuRu&5m98WwfscZcJARwX@g{H!*B=9CgU64$UtR{jm+ObX4}vSNA_s#%012sR z8-q0OKZD|@bhYQNCqU`*U2kVk1%3|v)PCss9jtp`7e-#f{Y6_{Pn$sTc?(ErN6)&} z?fM4rbgmx*6*q^y%l)|@l)iR>3&9_P^5dhnd4Agrp2qc~;rhVqoS#d^Q@gC>zhIKBf!Jo=lq-s9?A9FLHW^LpzOOp%KH$w8N~IXLm`gJqHW;C;0w09zf{0aa{Wp0 zbKs^Mqv*BZlAAmqT?4M+`YRx+jE=@=v%pUTd>kC(`q_Wx>+46rgSmbXl>NR8?gC3U zlk33e?(jP2Ht-ed2d)Jl1OEs-0j6hzuLl=^TR_FzK2UuB-iJLuT?)R6>mA?-_!pq` zx8xSr&sV|ox&8@w5P0TJU$-s-kLP+jsOMh>B~N^-=c{GlDz0w@W!Im8xR>#^6#RXf zUT>itLpz(+P5W2ceYEe=uBPcFek-(vy2!mg%6s{wUYOVNklssAl2xzWH0f&*?K!kE z?KL#%2)maEPF?-3SLEffc7u6L7HCw&%yGV-hPDkU*X;yQ2tg6 z*VTZBgImIT!I`wb3fJEO9}n+;8c^`O-1~=k|7_X|!oBN2LL_}H=iNS+AJEW z&DQjNYm?7+Uc}QX?tk%Xcy9+MbqnYhv+}RCE@*g@DsGp(0)eyChe`X|4TcJ z)=T>yO|PS9U!c92b|mc|Xcy6xAAdr7KJ5=^di@>kf7?59Nx**se?r~zoea@ zi}3o-fS(HZlH>t+JMG`X_4(iq+B<0Pr#(nZUUl9a5iV{CcmcSWb};RAwDV{iXvyp6 z;msl7S7{q*r_t8YUPSvf?aye}(2l0*^$ps?wEbzHq^+dQr|I?g4z}*-?Oy#8&#qKA zmIf+)ak<)C>#J1z=R~u5=C6y-Jk9a!fGfayysk1(ZfqVZ>%C#uta?{msmIk?BQC{G zsds&8xYXMy56A0j0|T{95an6dlCC&?vN*0Z;=$5p8@IOHU#Z5WYFr*D50iqMzR5$B^eWKsiR#x@LQ(=3J)`rT}tWTH-8;row#`3`CCbOg+6iBA$x%RJJ7QC<6bGU}9 z6s#%VK}JN!hj8?@IEZ^$qs9YlRc_d|2&wZ>X_!dqtBtIc#>~si2^9ct%&b?X+9>y9 z@s8aZ!y{D!qa2^PqCAMZEw2uZG*&gR_F#0nn?5GZ3|6Xis>>@%VxS@KN>hz`hICXL zX~=ZLrD{KFQAn;{);<5Ysd_BTbr>$MD-UCF#aegIt4Mx*HKvwO<_DyMct|WY6r$~z z$SCxYb$wtTk=$6%(0X~W(pwv-RTsyDHG*@XvO(tETpLkv;GBp!2>m)PnNhdV5>6Ve zDv8IKr`|vnmR75cN@H`}9hd99r6D*>DU|B*QCuyKPOnuPrAk#J2T2upK`ND!l%6N< zzizlTn43Cr0L_?B*=e3)?8tx%s!VD2oHZ~KuiY%0G0GxZ3rl>&tojkT?&kHu`*0JR z*ro_m&7kWdb3W1?y!Vxf^NJ7q*}g$9EAZuPF4S&Rl&@q_#}iDszC|k0Qez*o%5PmqE$$+LmdTyi(kfc+S4c9Y;qoF+bn#Jd8mToF z$43q5pML#Q8miS7M@yZ??@&r!S|uk9mngGTPr5pzrNhHA7P?iyDQQ|}E8ZTdR<6k3 zCc!q;U5hu>ol3ZNkJE)e_pon7<&?Z5r2pKr{&K^}ii`T@dZRo@T&=6+dJL3Uzt@XE zuBggAA1rOq!}{jIwKYm$R=etk{Nvh2J#Lbcic6IqWmv9jl7dnh%&XdTuysZr*Wp?2 zwn`bzU$dHA3y7;(>s7*6^EBx*Es{-)7oIiQXqft@ov`Ws8cS%fUz3&!U0S9LWGMwO zS1U&>Scxb($q7`yk4@QZlqmF@2oq*zI*qfW(Oe#2c~ zZ?pBY$uLRJ+NNrGxD5p>v{)szW6JE4jKZy&RMqlCyl1=DFd&$j@+o!iW-}L_Q3Ur6 zSB41G921S!D#jj~PUJ%<7waYNK3D^4jsbLk+pI^IfR3GaQQ5-qd-Vu(6cB{T1e0T$1mRiBgZXUmpp z)lIq1@>X%~99d;1-=Jg~Zh1UZp=K3#s*g~Bw#w+qRync@ff1^uW^T$?utS1=v6G6- z>Gf<9E+MzRJb>eA(*EJnU^6Kg-O%=4k&7nU3eGeP>e{5_l_+=Xq{G2d*ebii2f6Ol z)fV2AuBkM*)}nY_pPo){q`7%!rXtyylA3H<-%N&$)?5`Oz3b!pdh_%3CAQ6LS?wvD z`zrk$CnZH)ZgZ0DwPqi6gsJe{SxTr1h2uDtTB|5rXrOgl2s@LIq9h zcxt%c4;nVw`6($sDPvQDZa(^!s~aoBwW>}83Sw+xfzkSxuEh5AY-F)u3!ci>&JTOi zBPdNqy`{*d9wx_%yVR#gm@syg+m&Z&g_@u1HP$n62qOv;e55=) zG+gF%rDrmtPZt@Tt2rY%?!pHaI{sVOh6(A%MRP7f_fm|=-A-(%R2iP@V$b#cvz^_v zAvRJ?kHY+jP{u2&G(BvyMJ>~1My=Q*(fm};il$`;&(_Tk zemN7cg%2~^!m)N_9cQ4?iqZhJ4u{$v!eI$h5vgRVlkQxX-ZrRrYW15(X*hyUqu&$$XA0Mik zP%g6?#(Y>OVoiiCE`9UP!80ehxzoPIY2}wcT2B&SmNQXAewcqUIXT1OSW@RqR5AMS zul*77ruCSqzhb+7&nfcmY)zMLnnj9MCKZcCO6Kp`eLH(A@d3qvKD1luWt*2zcBrop z@hU2R?Woy`rs%xp&rEQ-uvlk{hSh!1>m(M6XQ58X`RBJGi%4#(sZ92$=@_8(Bgdpe z$g!;MM818vX@TZ-R&IncWAkn=LpNiy*=^l z)jE*YI6V`UIn0}q$)DKAU6_AXi=LoF;N5u7BeXeU`t@<*?IoBGlTFM#Z z8x`wRvWw58{!~zlM9Oy)6Z(wIKON7yBwuByRC@jVR3 zJ}1ut%obZ4mFw$NWXHf*Z zMRuIPXMg#FEO<(%PU+Q|u~)}HQx5mNcsm-KN|nY?r4J%@W{~Tm_0uv*I7P8+(B}DE z`|QbjCM?43hAKz2L3BSRlY9l4{KMU(Yj&od+zAG@bc0V8mk|{tI{nk9-d3DrfEqD0 zOe$lc>$cqFs}kHO9B|xvslU7^x-k0=LfcJjr8pj9$!6cTCdz zl9lJJUcU0&o}QjJL<%v!uAncGqzAJ0dGqX(XX|116(Bo+Z3@Kf8$kLdhJAAc#x_NM zkd;u3)}_a|I%V{8m1uqWic%ln!x<#iH1%(Ngtoih+LiJc@xf=gpMmM|QF_i6k)Sw@ zSKUmOId|zr=PW;WX}TC^Uo9wBAxiM-FCU2e*SiDI-}(4wr|>I?+f~-y^^Q``RgDBp(#f zM%EBE2FWs=6=3Dd3F^*|O$X7N%fq#94nF$X%eK+^dBZhP>0aK~eW8CxiDUnP%G#c@ zmY#aX0q2+XeX;Hp_5Mm<_h}>j_3qVtMt8t@D_3`)uI!2Tb)P{JT@){vH-BFDykoi- z92d`@zv$S7-Sdu}H;<0p=a)BDq_?!+yc4?TE$Ciwd_4d7Me|?t>Upm@X5Ink@TqtA zYQ9@jr!3KDA?KGaFS9J1U#ebC4ZUQTN4zw2o?#z_ZgHs(feHbfRtVvwmWY zjcfPP@I}W(@xry0#sL?1pUEfm_Cf2S`0Ue4Ygs4e_spN)bL;`<4U7zz2D+EA&1GGy z4%ub>#0Bgg?CpuOtFJt9{+z`J=*3qlC&u0}F?Qd?*uxWJcTJ36KQXo^o*26!x!682 zzHMUcwu!M%PmFDu7`rKa(UNx)zrF}9s<&G+t`7{4aFSBLgJHrF*1 zV|%%{+ortV#=^n<5sP`7yGyvaz001AJzzs_HY#J>dZ%%**H;2#9X@vQm}mPY#_K?t9kTBb*Sy{8m;2BF1HBh4p_)%jj9tZb%BvVPb?o+Df!2ej zD+JpS*;><)7bZoosQTj&Dv${5aIe@$Ul8S{sX!{97`rokU$kiwhP4R5z~6=hF5+HO z%7-S#KIKBSau;+}luay4Ll|&0bq>2D_be(WwW582HLXyCx?mvlwW|`kV@4Dw!mqI# zGu;KCH7t7vXIp$jmS?ad_h1xHyvw+Cm)p1aaN=}`Hs-oZLc&x_z`|(J z`*)jeh?TvOMYKAIXK73x506X>%VGlp#M1rtrCToD+vSX0crk&U;~C2j-^Jqpl^s;Zr{KSlnmvq=#C2* z4;G$+W|;X&k=|!QkGjm4QUb`(nqesiV;Y2L3Y%<_|7P^^DZMyrzVnxJ%{!Qg)c>0Hhwy$=`L<= zY@+Z*>d6B+;~i@wEvnJVVGe`p)01QFbzC+xi_Yrvu>@6W5Y$x&J7y#&pk6w8DAR*G z#jtPHWahY?W{J;aQ=fdNds_UO?Pkc$lu?WdrWdoB?muYh%az{jmOG+^OHY!`NrUM! zLN{85-kUSx_*O01lat5{X!(th#Uvy;y@5P@DG0JzFb-UXWYcUZP1Ziz?@1{_3Ig{P zh~jy7YCXyPPpr!;b`WWE!93NB0=ibR6MtejFxz=q^PIoa=Vn-Yt>#sd&BeQrSX;R@ zzi<{2A}kZ>B4xZui{!3to;HXO_}!UwQ7y@HCrqrVfXwF0YnhosS%EJ=43?CW%;Po6 zS6Z#Vwl?lF?Ra77^#YaI9i9`dLsmqzpD(dPws2s2t(%sH32vt5a(iy-r0fY|TmEgD zs{>n|gl=Y{^$!pvZ%)nPYNvZsCRUQytgwdXu=X+(;e1&MWot0U%@dj!0#YoaUAMj- z$v1OlvDH4%+-VB~7QBbQWS~o?-sU;*fYF3x@LS9e-?C`bhTg)bM2;z7FI`JXzRWJG z`2(WQExH?*^uMGqm%{bXqn14Q_lgiLu=;ADNU6bfrj?E}Wd^d+BNjN{TLz3ndz_hJ6$GAlK%NQaZICm%M8>ZN^b%WNoE9G0Jv64lZ^x z9~XgH-ce60n7M%|QB6w`f%teBRg9JjO|M)4CDjwnk{YX44~FVm45KAip$ZOVNFXdb z+|O*r1!NTn?wK}JlZmCg_25F1*z-Ud#wA6jh_n(8*0FiJ=`xu(1)C!%Li;ThX>RN- zPC~iWrh7R25lmtfgqIKnUQ&zsC^<`W($5$VmWf)GYh;wo9!wIkoFaK2vVa>2-u5Li zg8M7MIuq`63z@ z(o!l0VTh_o;8r;r|ZLOz4{MfIqjFasc{+d4Gc{q;W)mMJ_y`LZvGy zB{lo`QPY$Zp4UV449LS27Ac*S+GMHUC~qliXcd*BIW0cFV;pr)jHS85V?c?8+Gwl% z*UFBLO6z$hEZR_Unm{(grtNrbwO2Pv82r4 zivc?e{=h#l-<(RkK6$32DAoB?nd!Hw;4F%aU8{hkw}P%IGPDGv#^&r3hrczn(n1T0 zWiaLN0)cE6o^bw#4Ihr4(ZrQEuC~w0zUDDH{quz{@WDgRwKpbdsZc~5l_mo$&UrvZN}x-MwZEW6P7;D+tLSf zz_uJG>L_qXriBz5q?Y?39lDc>xxg2FjYoj2KIt4VVR9?W;ebmh?BQR#1Hn$Sq9&X$ z)JM5tZCOZ7P+$ay(H4VAG8GhTz!UfIou)$V|NT#2C9d)@jzG9?SG|TAw@!@hYBwaM zKhT>>U$9NW$9*rSMBq!&JDY>0(n)J7baDdO_bcK996DnqXRDqgs_^?Sw zRoF?1%py&ma3P+lhZ@R3sw3z;IU^G|+0G9R%M9Etfm$ZOfjf&)*&`5B-nb?-xwAO<8=OH-%~tYv1D3Z)RFryNk!VK+yRf7aT+BVq^yfk4g6e?G1`>H%qmwUu zgnSUlCpnTm@#LQ9M43RU_jRqA1d~ioBhC2~RiO@_A&um#jj4K4{->Dy$qj7s-&`4$ z(ZgX>%`iXWS-sybUu=f)t+F*au8KKBVTE4-AH4;5PdJic}kRTbZ)Z zYnryOzYdNvi=!b`Jysm3EKr;UFDU$KMY7yMcCTgj0;L`O}eDlj9;fGN2A!k0`Zq>kbmFN?#>wWtfoHdWX@bf7NzkZWHj%pWu z`GlgW(tImYT?y;%GJH zRC5PwB;V(-BhA$GxWB7KyOs8~$fVG@Q1-osv@}*!d1@*Ye61(?xq8FgMVm^-&iquC zLBW`FWBU;q{cemg;cgz*tw5hljE7U1>F|Q^XJPvw?~p4TXHG8}8-1ngcZTio*lo5& z3+DuF_G_8uqG{*bV#a@ZrW!S#5u0zyx(-4*xI4*tVS&+-YQgE*-BYEM`Q-TUl?vT^ z0@nE-Gq{P`Og)tbTU|e6+sEQyE$J`B4PD6xET6tOc{%1;Aw1ZgEa8FbILd;aGd(G9 ze3LFR9g&iEnv3Ci+Uei`-QGYq@hRu%0naHwWw`HqaU zb6b*4_gXb2n4&KG?kHoC56+Z$e9P>disvkcw-$bRa_#`>`p`zE^w*2>M9rI)=~o%1 z^&3V7UE6X5+eCw+5EF*{le0%&>Bf_O-H6Tz70~Bqy9WM`2*28 zGiRjbC!uD{L(6YPNnY%({D@z;1E3}CnXm#b88TCv642c~^T=IvaZ}SVWJ1qZc&uyi zzV;%z1G>Yi0!^U@`R zS9jXAnJO~T~v79y%1YL9~?ZPXsro>Ro+d$Q6YrFGRQ#GDI4ne%1adFfQzEedLp}72*ef> z2Ay>h!R8RBuCCurW;+`(F+mgG3_vUTPPy&w>~FNW$W$CGm?{wCg-q5-fdm4bP$Pa8 z0$~!i!o*D<>^B=BJVKvQS_K`LjhvZO z@^;>YfM}FR!+dFC3WLMC5?q#C#yiZRKOx8j@s*j}s=r3#=_vj}2Z|D0))URR_6yu# zo2u-AY1=M~!N4q`%mYWax!V=~G7`Hpm9{D2T!MG|%s0fC5e{VN29vlW#8ephAFoQv zsM8S44vA#FQ0~!5jo;<)$5*msk@9YM>u+GMivxB*{6(d6K{_Llm zm|L5y%yw=c*Ci}7z>hBRD%8z%AswU+gAyQ_ZNR7C$h@t%fu|g?nh!oE{WKRp+G83^ zk5So^Wva`|AiXM=*>m{=v|AZVmON>Ir-*@F(6hWbr^Lxv&XdS9ASdsrM9BLpF*S>w zfApZh;1pIXNRNzY65raZpVLZm)RT0B0vG0@ma3Q#>4|s+daL4}=6RU_iL}$^s01&? z5LQA{CV^@SJ-JlWm?J^sC6xHC*@ya2vPT#&~jar z9jbX%hf$JJ2~1@lvIC}K0N3}M%~dWS8n;NR?LM-!K~}yNxX{mOn){^ml#}6JoF(4G zbSwfyYx*Ts^DoTd1-PG&jzuASe8G_WKnk#RBV%n8=EZJqUF830#|@?#x0(2S)P6^$ z{aAX!tSwVvLNc3+to&`PVK(%@#QF><_ty{U^2S!dhloegBFwnZ*Kj?VB3tS*mlhKE zDe6ZluyZw3a`M@(l^k-1zBr3iZs2gbkAb;XmTEZ{NZqMG3qARYlQ~UiO-Zq-JXvZ^ zMZSUO`kH8D-QZDM0+hjR=1ILG^D;IkC{NE_a$Epg;E0IrA8ZE|@pwl_0s*dJlhL?}<}EN0 zO^m(Q3`(rS9{XrXjjEBt!yk7IL$Y{BYhmSXGZ<0ANhOr%rr%M)SEq4=On+aIg7T9P zFbNR=-zgT3SQsX^G7WRUJ{)@PlM*aQ;1sdZb0`8}gloh^Ch4_kf4laj-n{}@bZ`|k zYbv^pQ3L?&+^R`j=XvEdE8qA)qZmrtw$xFf0QnHVnQn8%@TA|-LKz4?!CzZ2P97Wo`cQjzJRES>R`**mO}Mh4a;P!iErOit=KkxjGP3P^1f@Uh@2W};7X z%i|5ZhD^gPk0M+Gg;8v7fy$E}=#t|z1d2j2(S&DiRbN3Rex`ye;8n66eF;HNMj>y6 z2xvpXRLMY%VsOwC<8ciIDo$w2d@kY&8Yac&KU&dz^q&b!vNF?p)*wA_DR1|8JkZ6Y zrs8?V62sg#vYNS2KoDE#lhP0uFa9dkR3mXQSo1{Vb`GJ5wP(aaVexRPBxd{s@-lRR z-*%4e3n-HK`sR74_;Vlrqrj==a7QfL7{yekv5hqp-LWG!Qb)gN0ior{yJ znX-{lJgb*0XIniOy){_~f&+$J#lzsy1*hV6meyd7K@yC6a3nkOd&BuI%Iva|IGhvZ zpX3v-PnO#F9{UO7*0gIwvNbOM$8gi0mSie7Hw%jMgh9AQoN-?Tx&O5O5tk&V;y_tm zj`8o-q@*+h+T@v`(WNI0_#{L4VxT1j7M*n~cSCf_8H3SNPo`tYJe}sHM>b*7J^bLZ zacjXUmsO0J>RFsIbfI+eg%z8am2>+aL?A!!^wAJ8<4O|b2_itYg}L@IQiw};0KA{M zN1*|rSf?B^@SVnw96S-M%~T<1OtQkKKE{Ir$;Y>9DY4GD#T)5<6!LT~u-PJ7m@n8n zryqV~n!%Q6+nEyODb$^rU{uV&PvlCn{QV zb}~=++$UW(aYkQCLh>W(c*g?lv~bk0Kxd}4q^Z48`x$Y#!jc(g#62PGN#xNhX23+=teLS=Rp=uDfjJd+(sW$D=|5#F~qk zjBHe7o(D9i`3{P`4o+U9%oB> zu9cuM_k?8OKjQpTB9oE=f#+D8aL*{y!L)`tV@)3``_@%fM!T z6y_0$Ht%|}Kh&Ifs(h4<(8@l|gjc-0P`5DyzRT*Y zV?k0d@!$3S!_9, 2008. +# Rajesh Ranjan , 2009. +# translation to glib to Maithili +# Copyright (C) 2006 The GNOME Foundation +# This file is distributed under the same license as the PACKAGE package. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-02-27 17:15+0530\n" +"Last-Translator: Rajesh Ranjan \n" +"Language-Team: maithili \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' अप्रत्याशित गुण '%s' तत्व क' लेल" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' तत्व '%s' क' गुण नहि भेटल" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s' अप्रत्याशित टैग, '%s' टैग प्रत्याशित" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "अप्रत्याशित टैग '%s' '%s' क' भीतर" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "कोनो वैध पुस्तकचिह्न फाइल आँकड़ा निर्देशिकामे नहि मिलल" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' क' लेल पुस्तकचिह्न पहिनेसँ मोजुद अछि" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' क' लेल कोनो पुस्तकचिह्न नहि मिलल" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "कोनो MIME प्रकार URI '%s' क' लेल पुस्तकचिह्नमे परिभाषित नहि अछि" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' क' लेल पुस्तकचिह्नमे कोनो निज फ्लैग परिभाषित नहि अछि" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' क' लेल पुस्तकचिह्नमे कोनो समूह सेट नहि अछि" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' क' नामसँ कोनो अनुप्रयोग '%s' क' लेल पुस्तकचिह्न पंजीकृत नहि अछि" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "अक्षर समूह '%s' सँ '%s' मे परिवर्तन समर्थित नहि अछि" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' सँ '%s' परिवर्तक नहि खोलल जाए सकल" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "परिवर्तन इनपुटमे अवैध बाइट अनुक्रम" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "परिवर्तनक दौरान त्रुटि: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "इनपुट क' अंतमे आंशिक अक्षर अनुक्रम" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फालबैक '%s' केँ कोड सेट '%s' मे बदएल नहि कए सकल" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"file\" योजना क' उपयोग करैबला URI '%s' एकटा निरपेक्ष यूआरआई नहि अछि" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानीय फाइल यूआरआई '%s' मे एकटा '#' सम्मिलित नहि अछि" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "यूआरआई '%s' अवैध अछि" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "यूआरआई '%s' क' होस्टनाम अवैध अछि" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "यूआरआई '%s' मे अवैध एस्केप्ड अक्षर सम्मिलित अछि" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "पथनाम '%s' एकटा निरपेक्ष पथ नहि अछि" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "अवैध होस्ट-नाम" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "निर्देशिका '%s' केँ खोलबामे त्रुटि: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr " %lu बाइट आबंटित नहि कएल जाए सकल फाइल \"%s\" केँ पढ़ै हेतु" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "फाइल '%s' सँ पढ़एमे असफल: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' फाइल खोलबामे असफल :%s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "फाइल '%s' क विशेषतासभ पता करबामे असफल: fstat() असफल: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "फाइल '%s': fdopen() खोलबामे असफल: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फाइल '%s' केँ '%s' मे नाम बदलए मे विफल: g_rename() विफल: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "फाइल '%s' बनाबैमे असफल: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "फाइल '%s' केँ लिखबाक लेल खोलबा मे विफल: fdopen() विफल: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फाइलकेँ लिखबामे विफल: fwrite() विफल: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फाइलकेँ लिखबामे विफल: fwrite() विफल: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फाइलकेँ लिखबामे विफल: fwrite() विफल: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फाइल बन्न करबामे विफल: fclose() विफल: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' मोजुदा फाइल हटाएल नहि जा सकैत अछि: g_unlink() विफल: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "टैम्पलेट '%s' अवैध अछि. एहिमे '%s' सामिल नहि अछि" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "टैम्पलेट '%s' मे XXXXXX समाहित नहि अछि" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f मे.बा." + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f गी.बा." + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f कि.बा." + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "सिंबालिक लिंक '%s' सँ थीम पढ़बामे असफल %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "सिंबालिक लिंक समर्थित नहि अछि" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' सँ '%s' परिवर्तक नहि खोलल जाए सकल: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "यहाँ एकटा रा रीड नहि कए सकैत g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "रीड बफर मे बचल अपरिवर्तित आँकड़ा" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "आंशिक अक्षर मे चैनल समाप्त होइछ" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "यहाँ एकटा रा रीड नहि कए सकैत - g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "फाइल '%s' खोलबामे असफल: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' फाइल चित्रित करबामे विफल: mmap() विफल: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "पँक्ति %d पर त्रुटि: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' क' विश्लेषण करबामे असफल, जे अक्षर संदर्भ क' भीतर एकटा अँक होनाइ चाही (उदाहरण " +"क लेल, ê) - साइत अँक बेसी पैघ अछि" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"अक्षर संदर्भ अर्धविराम चिन्ह क' सँग समाप्त नहि होइछ. बेसी संभव अछि जे अहाँ एकटा एम्परसेंड " +"अक्षर क' उपयोग कएनए छी पर एकटा एंटिटी केँ प्रारंभ कएनाइ नहि चाहैत छी - एम्परसेंड केँ " +"एस्केप करू एहिना &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "संप्रतीक संदर्भ '%-.*s' एकटा अनुमति प्राप्त संप्रतीक केँ एनकोड नहि करैत अछि" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "रिक्त एंटिटी '&;' देखलक; वैध एंटिटी अछि: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "एंटिटी नाम '%s' ज्ञात नहि अछि" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"एंटिटी अर्धविराम पर समाप्त नहि होइछ, बेसी संभव अछि जे अहाँ एम्परसेन्ड अक्षर क' प्रयोग " +"कएनए छी आओर एकटा एंटिटी प्रारंभ नहि कएनाइ चाहैत छी- एम्परसेंड केँ एहिना एस्केप करू: &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "दस्ताबेज एकटा अवयव क' नामसँ प्रारंभ होनाइ चाही (उदाहरण क' लेल- <पुस्तक>)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "< क' पश्चात आबल '%s' एकटा वैध वर्ण नहि अछि. ई अवयव नामसँ प्रारंभ नहि होइछ" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "विषम अक्षर '%s', प्रत्याशित अछि एकटा '=' लक्षण नाम '%s' अवयव '%s' क' पश्चात" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' विसम संप्रतीक, एकटा '>' अथवा '/' संप्रतीक केँ '%s' तत्व क' आरंभ टैग केँ खत्म कएनाइ " +"प्रत्याशित, अथवा विकल्पतः एकटा गुण; साइत अहाँ गुण नाममे एकटा अमान्य संप्रतीक क' प्रयोग " +"कएनए छी" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"पुरान अक्षर '%s', जखन विशेषता '%s', अवयव '%s' क' मान देल जाइत अछि तँ बराबर चिह्नक " +"बाद एकटा खुलल कोट चिह्न वांछित अछि" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' एकटा वैध अक्षर नहि अछि क्लोज़ अवयव नाम '%s' क' बाद; स्वीकार्य अक्षर अछि '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "अवयव '%s' बन्द छला, कोनो अवयव वर्तमानमे खुलल नहि अछि" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "दस्ताबेज '%s' बन्द छला, मुदा वर्तमान खुलल अवयव अछि '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "दस्ताबेज खाली छला अथवा ओकरामे सिर्फ श्वेत रिक्ति छला" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूप सँ एकटा खुलल एंगल ब्रेकेट '<' क' पश्चाते भ' गेल" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"दस्ताबेज क' अंत अप्रत्याशित रूप सँ अवयवसभ क' खुलल हए पर भ' गेल - '%s' अंतिम खुलल अवयव " +"छला" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"दस्ताबेज क' अंत अप्रत्याशित रूप सँ भ' गेल, वांछित छला देखनाइ टैगकेँ बन्द करैत एकटा क्लोज एंगल " +"ब्रेकेट <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ अवयव नाम क' भीतर भ' गेल" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूप सँ विशेषता नाम क' भीतर भ' गेल" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ अवयव-खोलबाक टैगक भीतर भ' गेल." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"दस्ताबेज क' अंत अप्रत्याशित रूपसँ बराबर क' चिह्न क' बाद एकटा विशेषता नाम क' पश्चात भ' " +"गेल; कोनो विशेषता मान नहि" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ विशेषता मान क' भीतर भ' गेल" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ अवयव '%s' लेल बन्द टैग क' भीतर भ' गेल" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ टिप्पणी अथवा प्रक्रिया निर्देश क' भीतर भ' गेल" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "स्मृतिक बाहर" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "अज्ञात त्रुटि" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "नियमित अभिव्यक्ति बहुत पैघ अछि" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "स्मृति पाबैमे विफल" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "असंगत NEWLINE विकल्प" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "अप्रत्यासित दोहराएल" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "कोड ओवरफ्लो" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "हेक्साडेसीमल अंक या '}' प्रत्याशित" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "हेक्साडेसीमल अंक प्रत्याशित" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "नहि समाप्त भेल सांकेतिक संदर्भ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "शून्य नमाइ सांकेतिक संदर्भ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "अंक प्रत्याशित" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "अमान्य सांकेतिक संदर्भ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "कोटेड पाठ कोटेशन चिह्न क' सँग प्रारंभ नहि होइछ" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "कमाँड पंक्तिमे मेल नहि खाएत उद्धरण चिह्न अथवा आन शैल-कोटेड पाठ" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ क' अंत सिर्फ '\\' अक्षर क' बाद भ' गेल. (पाठ छला '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr " %c लेल मैचिंग कोट सँ पहिने पाठ अंत पएलक. (पाठ छला '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ रिक्त छला (अथवा ओकरामे सिर्फ श्वेत रिक्ति छला)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "शिशु प्रक्रियासँ आँकड़ा पढ़बामे असफल" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "शिशु प्रक्रिया (%s) सँ संचारण लेल पाइप बनाबैमे असफल" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "चाइल्ड पाइप (%s) सँ पढ़बामे असफल" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "निर्देशिका '%s' (%s) पर बदलबामे असफल" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "शिशु प्रक्रिया (%s) कार्यान्वित करबामे असफल" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध प्रोग्राम नाम: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d पर तर्क सदिशमे अवैध स्ट्रिंग: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरणमे अवैध स्ट्रिंग: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्यशील निर्देशिका: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "हेल्पर प्रोग्राम (%s) कार्यान्वित करबामे असफल" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"एकटा शिशु प्रक्रिया सँ आँकड़ा पढ़बामे g_io_channel_win32_poll() मे अप्रत्याशित त्रुटि" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "शिशु प्रक्रिया (%s) सँ आँकड़ा पढ़बामे असफल" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "एकटा चाइल्ड प्रक्रिया (%s) सँ चुनें() पढ़बाक आँकड़ामे अप्रत्याशित त्रुटि हुई" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) मे अप्रत्याशित त्रुटि" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) फोर्क करबामे असफल" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "शिशु प्रक्रिया \"%s\" (%s) कार्यान्वित करबामे असफल" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "आउटपुट अथवा शिशु प्रक्रिया (%s) क' इनपुट केँ अनुप्रेषित करब मे असफल" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "शिशु प्रक्रिया (%s) फॉर्क करब मे असफल" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "शिशु प्रक्रिया \"%s\" कार्यान्वित करबामे अज्ञात त्रुटि" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "शिशु पीआईडी पाइप (%s) सँ पर्याप्त आँकड़ा पढ़बामे असफल" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "यूटीएफ-8 लेल अक्षर सीमासँ बाहर" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "परिवर्तन इनपुटमे अवैध अनुक्रम" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "यूटीएफ-16 लेल अक्षर सीमासँ बाहर" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "प्रयोग:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[विकल्प...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "मद्दति विकल्प:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "मद्दति विकल्प देखाबू" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "सभटा मद्दति विकल्प देखाबू" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "अनुप्रयोग विकल्प:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "पूर्णांक मान '%s' केँ %s क' लेल विश्लेषण नहि कए सकैत अछि" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "पूर्णांक मान '%s' %s क' लेल रेंज क' बाहर अछि" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' दोहराएल मान क' विश्लेषण %s क' लेल नहि कए सकैत अछि" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' दोहराएल मान %s क' लेल परिसरसँ बाहर अछि" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s विकल्प विश्लेषणमे त्रुटि" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s क' लेल गुम तर्क" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "अनजान विकल्प %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "एकटा सामान्य फाइल नहि" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "फाइल खाली अछि" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"कुंजी फाइलमे '%s' पंक्ति समाहित अछि जे एकटा कुँजी मान जोड़ा, समूह, अथवा टिप्पणी नहि अछि" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "अवैध समूह नाम: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "कुंजी फाइल एकटा समूहक सँग शुरू नहि होइछ" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "अवैध कुँजी नाम: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "कुँजी फाइल मे असमर्थित एनकोडिंग '%s' समाहित अछि" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "कुँजी फाइल मे '%s' समूह नहि अछि" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "कुँजी फाइलमे '%s' कुँजी नहि अछि" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "कुँजी फाइलमे '%s' कुँजी समाहित अछि '%s' मान क' सँग जे UTF-8 नहि अछि" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "कुँजी फाइलमे '%s' कुँजी अछि जकरा मान क' विश्लेषण नहि कएल जाए सकैत अछि." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "कुँजी फाइलमे '%s' कुँजी अछि जकरा मान क' विश्लेषण नहि कएल जाए सकैत अछि." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"कुँजी फाइलमे '%s' कुँजी अछि '%s' समूह मे जकर मान क' विश्लेषण नहि कएल जाए सकैत अछि." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "कुँजी फाइलमे '%s' कुँजी नहि अछि '%s' समूहमे" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "कुँजी फाइलमे पँक्ति क' अंतमे एस्केप संप्रतीक रहैत अछि" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "कुँजी फाइल मे '%s' अमान्य श्रृंखला समाहित अछि" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मान '%s' केँ एकटा सँख्याक तरह नहि विश्लेषित कएल जाए सकैत अछि." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "पूर्णांक मान '%s' रेंज क' बाहर अछि" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मान '%s' केँ एकटा फ्लोट सँख्याक तरह नहि विश्लेषित कएल जाए सकैत अछि." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मान '%s' केँ बुलियन क' तौर पर विश्लेषित नहि कएल जाए सकैत अछि." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "स्ट्रीन पहिनेसँ बन्न अछि" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "ऑपरेशन रद्द छल" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "परिवर्तन इनपुटमे अवैध बाइट अनुक्रम" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "ऑपरेशन समर्थित नहि अछि" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "अज्ञात प्रकार" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s फाइल प्रकार" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s प्रकार" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "बेनाम" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "प्रयोक्ता डेस्कटाप फाइल %s नहि बनाए सकैत अछि" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s कए लेल पसंदीदा परिभाषित" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblem प्रत्याशित GEmblemedIcon केँ लेल" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ऑपरेशन समर्थित नहि अछि" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "माउंट नहि समाहित मोजुद नहि अछि" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "निर्देशिका पर कापी नहि कए सकैत अछि" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "निर्देशिकाकेँ उप्पर निर्देशिका कापी नहि कए सकैत अछि" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "लक्षित फाइल मोजुद अछि" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "निर्देशिकाकेँ बेरबेर सँ नहि कापी कए सकैछ" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "सिंबालिक लिंक समर्थित नहि अछि" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "विशेष फाइलकेँ कापी नहि कए सकल" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "फाइल नाम मे '%c' नहि रहि सकैत अछि" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "कोनो अनुप्रयोग ई फाइलकेँ नियंत्रणकेँ लेल पंजीकृत नहि अछि" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon एन्कोडिंगकेँ %d संस्करणकेँ नियंत्रित नहि कए सकैत अछि" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon केँ लेल विरूपित इनपुट डेटा" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "प्रकार %s वर्गीकृत नहि अछि" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "विरूपित संस्करण संख्या: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "स्ट्रीमकेँ संग बचल आपरेशन अछि" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "अवैध फाइलनाम %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "फाइलसिस्टम सूचना पाबैमे त्रुटि: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "रूट निर्देशिकाकेँ नाम नहि बदलि सकल" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "फाइलक फेर नाम देबामे त्रुटि: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "फाइलकेँ फेर नाम नहि बदलि सकैत छी, फाइलनाम पहिनेसँ मोजुद अछि" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "अवैध फाइलनाम" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "निर्देशिका नहि खोलि सकैछ" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "फाइलकेँ रद्दीमे भेजबामे त्रुटि: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ट्रैश निर्देशिका %s बनाबैमे त्रुटि: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ट्रैशक लेल उच्च स्तरीय निर्देशिका ताकबामे असमर्थ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ट्रेश निर्देशिका बनाबैमे या ताकबामे असमर्थ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ट्रेशिंग सूचनाकेँ फाइलमे बनाबैमे असमर्थ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "फाइलकेँ रद्दीमे भेजबामे त्रुटि: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "निर्देशिका बनाबैमे त्रुटि: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "सिंबालिक लिंक '%s' सँ थीम पढ़बामे असफल %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "सिंबलिंक बनाबैमे त्रुटि: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "फाइल घुसकाबैमे त्रुटि: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "निर्देशिका पर निर्देशिका नहि घुसकाए सकैछ" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "बैकअप फाइल निर्माण विफल" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "लक्षित फाइल हटाबैमे त्रुटि: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "माउंटकेँ बीच चलनाइ समर्थित नहि अछि" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "गुणकेँ जरूर गैर-NULL होबा चाही" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "अमान्य गुण प्रकार (string expected)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "अमान्य विस्तारित गुण नाम" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "विस्तारित गुण '%s' सेटिंगमे त्रुटि: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' फाइल बताबैमे त्रुटि: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (अमान्य एन्कोडिंग)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "फाइल विवरण कथित करने मे त्रुटि: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "अमान्य गुण प्रकार (uint32 expected)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "अमान्य गुण प्रकार (uint64 expected)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "अमान्य गुण प्रकार (byte string expected)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "अनुमति सेटिंग मे त्रुटि: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "अनुमति सेटिंग मे त्रुटि: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "स्वामी सेटिंग मे त्रुटि: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink जरूर गैर-NULL होबा चाही" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink सेटिंग मे त्रुटि: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink सेटिंग मे त्रुटि: फाइल एकटा symlink नहि अछि" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "अनुमति सेटिंग मे त्रुटि: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux संदर्भ गैर-NULL होबा चाही" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux संदर्भ सेट करबामे त्रुटि: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ई सिस्टम पर सक्रिय नहि अछि" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "सेटिंग गुण %s समर्थित नहि" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "फाइल पढबामे त्रुटि: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "फाइल खोजबामे त्रुटि: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "फाइल बन्न करबामे त्रुटि: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "पूर्वनिर्धारित स्थानीय फाइल मानिटरक प्रकार तकबामे असमर्थ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "पुरान बैकअप लिंक हटाबैमे त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "बैकअप कापी बनाबैमे त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "अस्थाई फाइलकेँ नाम देबामे त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "फाइलकेँ काटबामे त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' फाइल खोलबमे त्रुटि: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "लक्षित फाइल निर्देशिका अछि" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "लक्षित फाइल एकटा नियमित फाइल नहि अछि" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "फाइल बाहरी रूपेँ बदलल अछि" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "पुरान फाइल केँ पढ़बामे त्रुटि: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "अमान्य GSeekType कए आपूर्ति" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "अमान्य प्राप्ति आग्रह" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream केँ काटि नहि सकल" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "स्मृति आउटपुट स्ट्रीमकेँ फेर आकार देनाइ संभव नहि" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "स्मृति आउटपुट स्ट्रीमकेँ फेर आकार देनाइ विफल" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "माउंट अनमाउंट लागू नहि करैछ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "माउंट बाहर निकालब लागू नहि करैछ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "माउंट अनमाउंट लागू नहि करैछ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "माउंट बाहर निकालब लागू नहि करैछ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "माउंट फेर माउंट लागू नहि करैछ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "माउंट कंटेंट प्रकार गेसिंगकेँ लागू नहि करैछ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "माउंट तुल्यकालित कंटेंट प्रकार गेसिंगकेँ लागू नहि करैछ" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "आउटपुट स्ट्रीम लेखन केँ लागू नहि करैछ" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "स्रोत स्ट्रीम पहिनेसँ बन्न अछि" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "स्रोत स्ट्रीम पहिनेसँ बन्न अछि" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "फाइल पढबामे त्रुटि: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ट्रैश निर्देशिका %s बनाबैमे त्रुटि: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "परिवर्तनक दौरान त्रुटि: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "फाइलकेँ काटबामे त्रुटि: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "फाइलकेँ रद्दीमे भेजबामे त्रुटि: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "फाइल बन्न करबामे त्रुटि: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "संयोजन परिवर्तन win32 पर समर्थित नहि अछि" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "अज्ञात त्रुटि" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "स्ट्रीन पहिनेसँ बन्न अछि" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "%d संस्करण GThemedIcon एन्कोडिंगकेँ नियंत्रित नहि कए सकल" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix सँ पढ़बामे त्रुटि: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix केँ बन्न करबामे त्रुटि: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "फाइल सिस्टम रूट" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix मे लिखबामे त्रुटि: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "आवाज बाहर निकालबकेँ लागू नहि करैछ" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "आवाज बाहर निकालबकेँ लागू नहि करैछ" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "अनुप्रयोग नहि पाबि सकल" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "अनुप्रयोग लान्च करबामे त्रुटि: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI समर्थित नहि" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "संयोजन परिवर्तन win32 पर समर्थित नहि अछि" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "संयोजन निर्माण win32 पर समर्थित नहि अछि" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "स्मृतिक बाहर" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "अवैध होस्ट-नाम" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "परिवर्तन इनपुटमे अवैध अनुक्रम" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "अधिकतम आंकड़ा सरणी सीमा तकि पहुँचि गेल" + +#~ msgid "do not hide entries" +#~ msgstr "प्रविष्टि नहि नुकाउ" + +#~ msgid "use a long listing format" +#~ msgstr "नमहर सूची प्रारूपक प्रयोग करू" + +#~ msgid "[FILE...]" +#~ msgstr "[फाइल...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "एकटा एंटिटी क' प्रारंभमे अक्षर '%s' वैध नहि अछि आओर & अक्षर एकटा एंटिटीकेँ प्रारंभ " +#~ "करैत अछि. जँ ई एम्परसेंड एकटा एंटिटी नहि अछि तँ एकरा एहिना एस्केप करू &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "अक्षर '%s' एकटा एंटिटी नाम क' भीतर वैध नहि अछि" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "रिक्त अक्षर संदर्भ, अँक जहिना dž सम्मिलित अवश्य होएबाक चाही;" + +#~ msgid "Unfinished entity reference" +#~ msgstr "अपूर्ण एंटिटी संदर्भ" + +#~ msgid "Unfinished character reference" +#~ msgstr "अपूर्ण अक्षर संदर्भ" + +#~ msgid "file" +#~ msgstr "फाइल" + +#~ msgid "The file containing the icon" +#~ msgstr "फाइल जे प्रतीक राखने अछि" + +#~ msgid "name" +#~ msgstr "नाम" + +#~ msgid "The name of the icon" +#~ msgstr "प्रतीक कए नाम" + +#~ msgid "names" +#~ msgstr "नाम" + +#~ msgid "An array containing the icon names" +#~ msgstr "प्रतीक नामक संग सरणी" + +#~ msgid "use default fallbacks" +#~ msgstr "पूर्वनिर्धारित फालबैक प्रयोग करू" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." + +#~ msgid "File descriptor" +#~ msgstr "फाइल विवरक" + +#~ msgid "The file descriptor to read from" +#~ msgstr "फाइल विवरक जकरासँ पढ़नाइ अछि" + +#~ msgid "Close file descriptor" +#~ msgstr "फाइल विवरक बन्न करू" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "फाइल विवरक केँ बन्न कएनाइ अछि जखन स्ट्रीम बन्न अछि" + +#~ msgid "The file descriptor to write to" +#~ msgstr "फाइल विवरक जकरामे लिखनाइ अछि" diff --git a/po/mg.gmo b/po/mg.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6d3f80ab26f72c3319eaa686605bf86e49371ff7 GIT binary patch literal 17858 zcmd6tYm6jUb;k?r7-t~{j4=;`Db}oK*KE(udKa_Itk=6<@7iPbVXtRx988v)?&|LH zbXT>zs%Lf<62K6Y5I{l-K_U|25h+0m0YX5Eh~NWxDFX7cWFb(bJcyDH`4SNjL4y4L z=T=o$_4GW9P?X-i^Y8Au_uO;O>z;dV|Ks&nf7s*oUfL^YXRh|VFMw~qmOs4id#>j_ z3NC_|z)yhzc-8Yf?^ZAbZvfv9?gc*q9tQs!JOKU#+z%f31<%_9J_c&sli)t^)8MPY ze*k^(zrhpWjn{eJ$G|s%3*ZmHS@6*FJ?}Pf8Pw+wfa2#*!PDT)FL3jR;O%_=C^!#( z0~FnBU+8(q!TUkc{SELD@GoLkuLMGq{{1Et6 z@FwsFvoiy$KK z+90I8w}D#cZ-V0UPe9H8UGSCQa}b{NvIo?>kAO?ydqL^_+u)txZWet8d@CqAp8-YZ zTcG&)5h!`w1X0bm2+D3_5RrHv0X5HO!K2_mfzr#({L#AZ1m6I*K&|UzASU7c6{vZ? z4So*X%Vbx;Z-LUwlJD&49U!XoJ`27O{BsbNyr)6&^F445d>Kq@UH60Y;DAdFMgV>4B%fFM=BXBk;GuMU;%Gc;5wK*}IxSTIVbXOWra_SMP(M`1?x! z`6?Enc@BY?fY$>hw-17{o4*6;>OC7``g|C~g}e}CDc(E5)8J>o*MZ*y#pi8@on54$ z?CQ5b+4B5SG19fS8i^6i8R^hoIuZ9E%k$f;WQ8;7#B5S4p35EMlBZczNZ6Xd`5 z5&mesPk~z3&2$pIqoDd{{1Kf$0$&XN7uW``J%){f3Ha;aQ97yLU+_osU31*o?_p5# zZ-V0Qec-FWKL$~u_Y~L!uRY=P+XGRJ_XY4};D3PP=PHav@?HR?zc~N=X;60a9Z-II z9YT8)%s|oqCMdl>8)MY?Sx|NzfRe-Sfo}xA0{%R>i-(%;h8)j;qW>Q7x!{+;XMys4 z(R&B&YMR#m5KTH#|LSX%4?jn{f%Y&Bm3VKby^AJYLekdy7O+pdL}NMLaauyt>)o`T zy>oUg-Mxg?$-ism$a1}i_5kfYG_Cz2ZA6ni&e8PxCEB(2&goxo_vWAP0AD~u^d^%R zfe+G#wCB)XNz?0bnrxwXy)b`sy7&UzMU#A`d%a{sub?TmJ&*QQTJe$}JVL{DEvD=H z>u9o{D>UhSjTX>eP1EaFXt&T_t`EG{9oXMD=kKNGlqS2>>naDf|KG&>H_>EsOEk>8 zeBH;pm(niNd|LH&ef~kQ?wb6)>_)MwOOuW3wVUfOwq zbjFWTKTa|~@K=Lg)bg9%U>G#BaOk&_UN2dT;ttPdj?RpqEcj98_k(pCw;Xn&*bibq z?1lX>&ipv&hdZX6b;B{;lxYskEcnLO&yapENy8d@Hp7Ci$pfu1tS%dQ%p9BXPWa17 zveFNRD+prfU%asB_zHT%Flep&;pHgJQt!lI(2JTu7A3KNejrHay%SkBjFv}P=!PWi za&}vq#NAFtamzay#50-SN|5j{So1~MN1B~WQE~}I#BtcWq%SY^qBy*iLN)H}d{CBL z3f&}{v6;lH;gFeG@^a8zalB;-4_aXwX7*Xc)p-yMky$GlE%!nh#wcHkM6oBW_ln{y z>|ifby16CzSW`cWgDgz7xwd!z(`GP$!;(Uf z`nU3F!8>UROl4{9VbUK<500GnM6v4A>1Z%WhAfh?qn=xc3?6$8{XM;rzq~G;Fv={i z9ii;qd(z#N?#UpG3)4|d(8M-HKGiemIxow)Cuxo>OdtbfHHyQ_gOG63LV`hCVMksW zJ~0Yt2);bPD2)6Vrg_#9ZQ~AmaaLXB@IE_sG&7^N!V9tYK(hSp73gK}!95v;| zJ0dg5&khIGBIQ;BDcCK8YeVWV(+N7WJDJVmtHr-8=$JbdlS_$PQh0oXZ9A1<(Pjtu zBo?yF{;(p8JGwQ2wXW=GyoRyvwpWz7TFxqVkVU0 zZrC5-;20c%I17m9EkB8|dc=ei4uWP#|LO78uLec$RKC%g8;Y{6ptav;$1$NaM?=D2 z25r+?As%gPQu?Ojai&V&Iu-Afu@6~=shL|BW{5f=ArM^>BJKN#SP~4wc^9wzTb~#u z*@Ay-Pk%c46AY4c!8_$>{6C7Ur-noH(i&-d&4Zo7tOYFhjF_t}*x%EtewjOCD;g5Q zk|AIVqgkqSr6QCzdwRB+4Ew>L+PBZ=&AOWJmUK;|Yr{weGVixrdb+cbW{+bv)yY0n zQd>>ya>hL6+ON3Q?D{D=4?6D#t85$u3<7Q|>TrH2_Jv9sGtS%g-g?XJhYl~e4eK)5 zPcPg@ZiFJc!N5iSoQkrSgl%Bh2`jc}=}argf+AC@*xe4hOG~Te69LWc zC+x(=YLt_ZnaHuF?Jh~ zGFo<~Cq|b4bJ}pn9?P0d7GBY_GfYMUJFS`&i?6$+^mc?TzE}x4=punyuOggmc(9|X z-9ZlBuw8asI=pH-2vMcjVv6ag zKHxJMiH^dT_BL7B|PT+^k0-r0t&9H8Z8RJCC}o)-A?66Sgz*jv;3?=Sw;? zTLeVS7MqqwZ4TVt*~p!uN}JA$1?Lj~?Bdx|ezs2ZYlUq~eHp8eHnqm$F(RncRg4{Z znzODU6{i%N(NVijz=X))3RS8swu=84dg*F zfQZ7&D&2*tN_f@Npf3(xMNnLN4|S6@)fs)IqWM`Mb>G&%sc!GCTvY}NZ;9h$Pu6Hr zsF*g7?f#qWHPI;-`u-vZQyHrmfGH{9ENKm{60;m4CCN1-^+j?{%sO5=%Qa_i&iZ?o zbSTz1Jrk9ERWjA8fj{$D#k95ZFaOWZvKP!1<-dNmQ=d zXX73M&Afm6+`+lV+@Z$pclZYn&L2L~m^(Z-N5{s6a5WO;vfte6)o<>QfA9_Sb91kq zJ4C-TROT8>l<`x-Rx+ITPX}?*53dAq;9m$H50W?-MrjiGN83C&9;K^U*qlWb#~2!S zMu@tx6bAiy|Lln~C+RxyfsYx=7xVMSu1&vXJqKAwr)N*=V0nc+-P$9 z$CnlNq<{;*Xe;n#M~U6Wjr%f9PpoE%*|fWq(@KW{;gARN?XP`2Rv!rxK3fqJ%;fqf za=CDU^~x+tD~@s1%-MNyDJO1oYlhU2w_1YT&1pt#D`h~gvOabtQ!Ba^##2tP^X^tU zI2TFoS}7uv#EE)k$cx}Z4##9gL@Tvdx~r*$2o&MpjTNT=?%Uzq!h)G>A&z2@H)UGx zj8S7~(j=1_M7%Q%43pm1K5p7*M=P+T#)E0|Zc5h{!Ju3%1s^{Rk%^ctqnud%rd%lF z(bU8U1X>Hd(^fOP2_YBh95EIoVIZp-IWvoCG^dd?g)5ZC?DM7pOfaR=%2sB-2H6>* zX}z#hXsDDa%Q6-3&>*H#i^F2Ksjb%0$K0Hse$p({${-8PEC=B$q4(ix_e zS!^br>Xs>uxa&jtZJ)?zUQjArv26!x_xC2<@x9_{3z>{7J&H()4f3lLd_rv#SJ)8f z%}BP|b>DJ?$sV`EK8t6m2PbpY1B~wjorF4oZ*8^rO&BPKB64h7jnkO?QxO zNrK-aQ9ewRjgVcqND!`|pY3iUrINT3>~bgCWSe2q|HF;tobo4JL|P8DaVmQt%4=2H z+4Wc&XTNqyb+JoIn>H-JtDH_~MSHX9w5Q!ip}KN?Ib}?lbL5ub5;-`T(s$b4rRZav zOX!v@wu82IOW9Rz=h7BIx=uGXM&cr<9Im+YEQwT}>Ifmxa1m54Cf{M*5mb}13wD)! zPRzGqs^S*3oQQ!O#W}ES9LoB0(&HX5L!_iPmZj`ABDyJSan{w2u2^!agAf7V4#*;* zB!EPPIT)mn2AdOo$9JKV15lu<=pwjr*p^d_6L4Q?1bgiIbe_oCHe=U4+G1j5emt&k zw93q@df%W2Kfg(>>OuFX+l}Ke&!uX0RB94eUZ;F-C}~a6WmdPi;*PaW$dazupJaV( z2bH{R%hhc`e%lqgTi7aNlw+I{7_b9jU39(mu~tA^BrH@R_!E}^`lH^Rw-@pz2X+v z#=3OF5}|yMH+hby!jm-elzg7eY2rMo`8GYLiv1l8F-ziCo9qcnnyBI;&0H>a?_0#! zD_DV6iS+2`osjhUjpc-Bthn4lbGESj!9XVq%nDNa$xNCQBY40J6aC{xs}eLzS_;Wy z-b~v$d)3%)*@@{q-?1jv#5j#=v?vIeFTq(RzR3av5pGeeGT+}fOk5H$ch7SgN?};5 zt@;cTG*Vqg`M`xCA>lBn~l$p(Se<+O4c^?Hv6P3qcCE- zjI>N}R=8D#x7=;q)wbK!5VO@6y(Q;~&a?LL3nT_p^)#W#@K*>o+GyOhx3WhHKZ-}H z1sW|j5I4HGMH&yT#1?s^xxTrYB3)h>l)YopP_&(>BrEGMO6)^)!UsrBzSo zc3WOnt`JAQSJd;+T&6M^#kA^C-)yy*M%2~p%jz^aIje{Blxn?-ccv}q)$2RcCNNK3 z!I3BV;v`#~IIZ|atSd+om{mJEw8+asHQO9iOKHMyNQP>@sfFS6E9N4v46X(ddZ95u3J{#o z6Hi@nq)6rE7&fL-FjZO3%(wJ>NFdZaav@oCTE>YzO}7n7=qkf;h34-yby=hwf4#3- z4=X(>SF~>TC;D$nrjkOAsr!4eUs*2dMuY;MzUaP}SNfF`us5WBiabt&L;xnHHIfNny_r{i-YOE`+t)%Yjl zCgK&vYTeSnkIkx^!0JQOY3`q;`1RRP1}gAc9am|9eV_jh zZ-ONibSxB(3voK?s^H>IbCXA2cTtm{k@5tgAd(xkk|7R<%vwY&Y=X0SkG+kfN)WAJ zD6XF6Jd{m^y@!M#G4l*oILUdZbIW&^r?r$9n_(coK+xhU`7blNh%Mo`GyLQ@RSMki W5uW+D%}2cXp%bSU?|IaIrSQL6i%rh} literal 0 HcmV?d00001 diff --git a/po/mg.po b/po/mg.po new file mode 100644 index 0000000..81712bb --- /dev/null +++ b/po/mg.po @@ -0,0 +1,2150 @@ +# MALAGASY TRANSLATION OF GLIB. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Thierry Randrianiriana , 2007. +msgid "" +msgstr "" +"Project-Id-Version: GLIB VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2007-03-03 19:00+0300\n" +"Last-Translator: Fanomezana Rajaonarisoa \n" +"Language-Team: MALAGASY \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Marika manokana '%s' ho an'ny '%s' tsy nampoizina" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Tsy hita ny marika manokana '%s' ho an'ny '%s'" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tsy nampoizina ny taf '%s', nantenaina ny tag '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Misy tag '%s' tsy nampoizina anatin'ny '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Tsy misy raki-drohy mitombina anatin'ny lahatahiry misy ny data" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Efa misy rohy ny URI '%s'" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Tsy nahitana rohy ny URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Tsy misy karazana MIME voafaritra ho an'ny rohin'ny URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Tsy misy saina manokana voafaritra ho an'ny rohin'ny URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Tsy misy vondrona voafaritra ho an'ny rohin'ny URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Tsy misy rindranasa mitondra ny anarana '%s' nanambara rohy ho an'ny '%s'" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Tsy voavaky ny rohy misolotena '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Tsy raisina an-tànana ny famadihan'amboara-marika '%s' ho '%s'" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Tsy voasokatra ny mpanova rakitra '%s' ho '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Tsy feno ny filaharan'ny marika amin'ny faran'ny zavatra ovaina" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ny fallback '%s' tsy voaova ho amboaram-pango '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Tsy URI feno mampiasa ny drafitra \"rakitra\" ny URI '%s'" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Tsy azo asiana '#' ny URI '%s' an'ilay rakitra an-toerana " + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Tsy mitombina ny URI '%s'" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Tsy mitombina ny anaram-mpampiantranon'ny URI '%s'" + +#: glib/gconvert.c:1806 +#, fuzzy, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Misy marika nalana tamin'ny fomba tsy mety ny URI '%s'" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Tsy sori-dàlana feno ny anaran-tsori-dàlana '%s'" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Anaram-pampiantrano diso" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Tsy nahatokana %lu byte hamakiana ny rakitra \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ny nahavaky ny mpiatin'ny rakitra '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Tsy voasokatran y rakitra '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Tsy azo ny marika manokan'ny rakitra '%s': tsy nahomby ny fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Tsy voasokatra ny rakitra '%s': tsy nahomby ny fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Tsy voaova ny anaran'ny rakitra '%s' mba ho '%s': tsy nahomby ny g_rename(): " +"%s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Tsy voasotra mba hanoratana ny rakitra '%s': tsy nahomby ny fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Tsy voasoratra ny rakitra '%s': tsy nahomby ny fwrite(): %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Tsy voasoratra ny rakitra '%s': tsy nahomby ny fwrite(): %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Tsy voasoratra ny rakitra '%s': tsy nahomby ny fwrite(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Tsy voahidy ny rakitra '%s': tsy nahomby ny fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Tsy mety fafàna ny rakitra '%s' misy: tsy nahomby ny g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Tsy mitombina ny lasitra '%s'; tsy tokony hisy '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Tsy misy XXXXXX ny lasitra '%s'" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Tsy voavaky ny rohy misolotena '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Tsy voasokatra ny mpanova rakitra '%s' ho '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Tsy afaka manao famakiana fototra amin'ny g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Misy ambina data tsy voaova ao anatin'ny buffern'ny famakiana" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Marika tsy feno no mamarana ilay canal" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Tsy afaka manao famakiana fototra amin'ny g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Tsy voasokatra ny rakitra '%s': tsy nahomby ny open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Tsy voamap ny rakitra '%s': tsy nahomby ny mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Misy tsy fetezana amin'ny andalana %d marika %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Lahabolana voafango UTF-8 tsy mitombina" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Tsy voazarazara ny '%-.*s' izay tokony ho isa anaty fiantsoana marika " +"(ê, ohatra). Mety lehibe loatra angamba ilay isa." + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Tsy niafara tamin'ny teboka amam-paingo ilay fiantsoana marika. Mety tsy " +"nihevitra hampiasa esperluette hanombohana ary angamba ianao - esperluette " +"fialana toy ny &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tsy manafango marika azo ampiasaina ny fiantsoana marika '%-.*s'" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Nahita ary '&;' foana; ireto no fidirana ekena: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Tsy fantatra ny anaran'ary '%s'" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Tsy nifarana tamin'ny teboka amam-paingo ilay ary. Mety tsy nihevitra " +"hampiasa esperluette hanombohana ary angamba ianao - esperluette fialana toy " +"ny &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" +"Tsy maintsy manomboka amina singantaharo ilay tahirin-kevitra (oh. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Tsy mety atao aorian'ny marika '<' ny marika '%s'. Tsy mety anombohana " +"anaran-tsingataharo io" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Marika '%s' hafahafa; nanantena marika '>' hamarana ny tag manomboka ny " +"singantaharo '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Marika '%s' hafahafa; nanantena '=' aorian'ny anaran'ny marika manokana '%s' " +"amin'ny singantaharo '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Marika hafahafa '%s'; nanantena marika '>' na '/' hamarana ny tag manomboka " +"ny singantaharo '%s', na koa marika manokana iray. Mety nampiasa marika tsy " +"ekena amin'ny anarana marika manokana angamba ianao." + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Marika '%s' hafahafa; nanantena farango manokatra aorian'ny mira rehefa " +"manome ny sanda ny marika manokana '%s' amin'ny singantaharo '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' dia tsy mety atao aorian'ny anaran'ny singantaharo mamarana ny marika '%" +"s'. '>' no marika mety atao eo" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Nofaranana ny singantaharo '%s'; tsy misy singantaharo misokatra izao" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Nofaranana ny singantaharo '%s', fa '%s' no singantaharo misokatra izao" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Foana na tsy misy afa-tsy elanelana ilay tahirin-kevitra" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Nifarana tampoka taoriana fonon-teny kitso loha '<' ilay tahirin-kevitra" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Nifarana tampoka ilay tahirin-kevitra nefa misy singantaharo mbola " +"misokatra; '%s' no singantaharo farany nisokatra" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Nifarana tampoka ilay singantaharo; nanantena fonon-teny kitso loha mamarana " +"ny tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Nifarana tampoka tanaty anaran-tsingataharo ilay tahirin-kevitra" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Nifarana tampoka tanaty anarana marika manokana ilay tahirin-kevitra" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Nifarana tampoka tanaty tag manomboka singantaharo ilay tahirin-kevitra." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Nifarana tampoka taorian'ny mira manaraka anarana marika manokana ilay " +"tahirin-kevitra; tsy misy sanda-marika manokana" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Nifarana tampoka ilay tahirin-kevitra raha mbola tanaty sanda-marika manokana" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Nifarana tampoka tanatin'ny tag mamarana ny singantaharo '%s' ilay tahirin-" +"kevitra" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Nifarana tampoka tanaty teny fanampiny na torolàlana fikirakirana ilay " +"tahirin-kevitra" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Marika tsy feno no mamarana ilay canal" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Fiantsoana marika tsy vita" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Fiantsoana marika tsy vita" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Fiantsoana marika tsy vita" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d marika %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Fiantsoana ary tsy vita" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tsy manomboka amin'ny farango ny teny nalaina" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Tsy mifamaly ny farango anaty lazam-baiko na lahabolana hafa tonon'ny akora" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Nifarana taorian'ny marika '\\' ilay lahabolana. ('%s' ilay lahabolana)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Nifarana talohan'ny nahitana ny ilan'ny farango ho an'ny %c ilay lahabolana. " +"('%s' ilay lahabolana)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Foana ilay lahabolana (na tsy misy afa-tsy elanelana)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Tsy voavaky ny datan'ny fizotra zanaka" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Tsy voaforona ny fantsona ifandraisana amin'ny fizotra zanaka (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Tsy voavaky ny mpiatin'ny fantson'ny zanaka (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Tsy nahomby ny fanovana lahatahiry ho '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Tsy nahavita nanatanteraka ny fizotra zanaka (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Anaran-drindranasa diso: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Tsy mitombina ny laha-dazan'ny mpitondra tondriky amin'ny %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Tsy mitombina ny laha-daza anatin'ny tontolo: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Lahatahiry fiasana tsy mitombina: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Tsy nahavita nandefa ny rindranasa mpanampy (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Nisy olana tsy nampoizina tanatin'ny g_io_channel_win32_poll() raha namaky " +"ny datan'ny fizotra zanaka" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Tsy voavaky ny datan'ny fizotra zanaka (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Nisy olana tsy nampoizina tanatin'ny select() raha namaky ny datan'ny " +"fizotra zanaka (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Nisy olana tsy nampoizina tanatin'ny waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Tsy nahavita nanasaka (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Tsy nahavita nandefa ny fizotra zanaka \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Tsy nahavita namily lalana ny fivoahana na fidiran'ny fizotra zanaka (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Tsy nahavita nanasaka ny fizotra zanaka (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" +"Nisy olana tsy fantatra teo am-panatanterahana ny fizotra zanaka \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Tsy nahavaky data ampy tanatin'ny fantsona zanaka pid (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Mihoatra ny fetran'ny UTF-8 ilay marika" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Tsy mitombina ny filaharana amin'ny fidiran'ny fanovana" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Mihoatra ny fetran'ny UTF-16 ilay marika" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Fampiasa:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[SAFIDY...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Safidy momba ny toro-làlana:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Asehoy ny safidy momba ny toro-làlana" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Asehoy ny safidy rehetra momba ny toro-làlana" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Safidy momba ny rindranasa:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Tsy afaka mizarazara ny sanda feno '%s' ho an'ny %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Mihoatra ny fetra ny sanda feno '%s' ho an'ny '%s'" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Tsy afaka mizarazara sanda roa '%s' ho an'ny '%s'" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Mihoatra ny fetra ny sanda roa '%s' ho an'ny '%s'" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Tondrikin'ny %s tsy eo" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Safidy %s tsy fantatra" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Tsy hita anatin'ny lahatahiry misy ny data ny rakitra misy ny famaha marina" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Rakitra tsy mahazatra" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Foana ilay rakitra" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Misy andalana '%s' izay tsy roroa famaha-sanda, vondrona, na teny fanampiny " +"ilay raki-pamaha" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Anaram-bondrona diso: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Tsy manomboka amina vondrona ilay raki-pamaha" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Anaram-pamaha diso: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Misy fango '%s' tsy raisina an-tànana ilay raki-pamaha" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Tsy manana vondrona '%s' ilay raki-pamaha" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Tsy manana famaha '%s' ilay raki-pamaha" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Misy famaha '%s' manana sanda '%s' izay tsy UTF-8 anatin'ilay raki-pamaha " + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Misy famaha '%s' manana sanda tsy mety avadika mba ho azo anatin'ilay raki-" +"pamaha." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Misy famaha '%s' manana sanda tsy mety avadika mba ho azo anatin'ilay raki-" +"pamaha." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Misy famaha '%s' anatin'ny vondrona '%s' manana sanda izay tsy mety avadika " +"mba ho azo ilay raki-pamaha." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Tsy manana famaha '%s' anatin'ny vondrona '%s' ilay raki-pamaha" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Misy marika fialana amin'ny faran'ny andalan'ilay raki-pamaha" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Misy fisesisesim-pialana '%s' tsy mitombina anatin'ilay raki-pamaha" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Tsy mety avadika ho isa mba ho azo ny sanda '%s'." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Mihoatra ny fetra ny sanda feno '%s'" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Tsy mety avadika ho isa float mba ho azo ny sanda '%s'." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Tsy mety avadika ho boleanina mba ho azo ny sanda '%s'." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Safidy %s tsy fantatra" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "" +"Tsy misy rindranasa mitondra ny anarana '%s' nanambara rohy ho an'ny '%s'" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Anaram-pamaha diso: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Anaram-pampiantrano diso" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Tsy voavaky ny rohy misolotena '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Nifarana tampoka tanaty anarana marika manokana ilay tahirin-kevitra" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Nisy olana teo am-panovana: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Rakitra tsy mahazatra" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Anaram-pamaha diso: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Anaram-pampiantrano diso" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Tsy mitombina ny filaharana amin'ny fidiran'ny fanovana" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[SAFIDY...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Tsy mety atao fiantomboham-pidirana ny marika '%s'; ny & no manomboka ny " +#~ "anaran'ny ary. Raha toa ka tsy raisin'ny ary iray an-tànana io marika io " +#~ "(&), dia ataovy & mba ialana izany" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Tsy mety atao amin'ny anaran'ary ny marika '%s'" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Fiantsoana marika foana; tokony hisy isa toy ny dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Fiantsoana ary tsy vita" + +#~ msgid "Unfinished character reference" +#~ msgstr "Fiantsoana marika tsy vita" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Lahabolana voafango UTF-8 tsy mitombina" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Lahabolana voafango UTF-8 tsy mitombina" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Tsy mitombina ny anaram-mpampiantranon'ny URI '%s'" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Tsy mitombina ny anaram-mpampiantranon'ny URI '%s'" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Nisy olana teo am-pizarazarana ny safidy %s" diff --git a/po/mk.gmo b/po/mk.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f67f3cd4c696af081d5f5dcd30b59030b7e4a298 GIT binary patch literal 46623 zcmd6w3!Ghbb?>(=ibheX4@49fSxIA3O@YC7eGFzJl`~hU*8=iTYarR=^9v)4@HUjSJMcmoS)R;1GB+_(AX_ z@NYr&H}iE-bP-qy_z1X&^Me_b_;MkAg4b{PQ5H5q%p}d;bB(;ENHq>MsJ-{%Y_La4=kd zTfprBcZK_H5LQIr2Svy85sK;^1&WSSKn5$x)8h( zyaq&s(Lo4b*O!3DfR}-&OmsV__V<9I=WoEJ-~kL${T&aAuFW7#Mehey?hBym{S-V1 zd<9CT@y!BX1g->i{Q^+^41l8JdQf`uF;IH(MNoAA07RtGAt<@*6DU3V7^r%m z1=a8OL538)@(oe60$dG>uQ!6?--kiTr45QNGZ5BqfJ;Epa|XBrydAs(TuI?Wz)uGJ zDkypW6G)NhRxgzYu&GxD`AYycyKE?*lcS zPk}M`UGNp)0SrcZ`f5=0E(2c)t_D?p11S022%=Ka$3gM?+aM%FvthdE><7i4_kbGL zpMZ1`eI1O!Lohzs-BM8HF9XG=cY~sP5BL)B>!AAkM=%CodZN?ydQkM7396mTK~y5T z6_h@F7L*)+0*cPVPjdO63u>HKg5u-t;Njqt;JM&8!BfHcCp#TY@HL#@0ZOjBLDl;P zD1IJz3Uf1fD5!d~zyra{!RLTYQ2lQOMb}3_(fKt{<35N=&j*)-8t)mP`necQd z7I-K4D)76Y`j1Ytf6>vPvLAR-7N)Q$oVSp)!>^!@qH7h z{yqSzz1`puU^|@u3#k4NLfEQ*6nG?f9QZnL9Vj_p4T`?^g5v*Yz{9{FgDU^LGrZk- zpvs>ENaPuo{-1y`_%ehkJT~A(p!9D`z&k;vmgp1V{JY>EKP!rU4X1Gw*LSRT{rY;q z?*{xKsDAzxd>;6cb9{WS25;beC3qM3Met#;hO%D(9Jdbbg1a{stTc4}S}K z5C3ikPv-mszv*`VG^qX;UrgWNef+r;{4Y>`^b$HnWYN3872sFFMc~UW!54sMfFs~j z0nhp^Y?bpzz;}WxXzV)h&%v9(b1sXbo#5Yqd%<^CqKKl=+5H}me-z|j^z4Bs8Ur_g zTfwKmCV0^xJO@7yNCrJ`*hEQ-DaN?+z}j3QJa zx(;Nh(N{p#J8qbm4}2Ra`F;m{Be)o5BBJOj@MiEUpy(MwNNV>HQ2cs1gHri%@U7q{ zK~y7JjIdSicfl6;ci@@eZ&GL}ct3bO_ze)1iw0pTEQlTf#g8MX^fs^#YMeg=#kV&g z43&R7C^`HUI1fC1+}m$~(#OX^jq4arwt?G0wR`AhbO~G!>i%cIUq>J3Zt?4V2wB%} z0%2YBPv9Bg#aB3A?*~=?UqHH!)?Ddy{wer&&QF18L>zqz)cEII<@CP;d>!W#;G4jo zf|B={R5}dY1WInVg3`P1fa2q6zwL5;A9xw(Uj!w;1>3y*Edjp`ihm2P_Ic<|Z~^Dv z02hNVxW@ZC5uDBW2zWGj2Y3wlDR2?^6Hs!WeXWo4YH&H{-vTwB!>)7t+X6yjv>QZa zq9yNOY~X$1`@z=lxSu=tdVCA#cY&B*bjA&?XCDGJ-k*V@`;6apd-*shzW*FVB+=lF zPUlnLYR;c`lk?>w5EYC*1|q`f)$eqFatC-3=U)LgfD7K`_P-sR$@$E8J6&giFMU=N z{WbVsT>rt%KK{RdkMrx$Tik!14WdfXAAoB2uv^hVum$#m9|bk87vAPr2gR>1f@{DT zw|iW8all)^6S@95a1nUm9bW!8Q1TcDPXg})=Yday$AK^UJ@@ykK=pq!cro}n5YnR8 z-syU`8x%dS+U|DwHtgY${Tfx@d9zTB%tZ{xB${>0^4{iaEy2t6hACx?Q0lpDjeXsk2 z?cg@f;}7^a?*mtG{xwkieEEHD2Seadoc|ek2>7ocBu3BwAZ5S@z=OfPAg(9+5_lPS z()}*a`#_x^^7~$H3#jql2&$i5pxS@-A2?kLLD|zDa4q7(7W^@I5qR)NosJqP`~NJcc76_?3oiL1_ruqLM{&LvTm^m~RQ<(& z?Bl%=l>R*mz8?HH@MQ3)k9iz73@+#VHqiJCp3eD6A9sIyJ-CkZzXnxr(GG8?1)k0M zhrxy5Pr-}9*$=w@Uki$#p8?MUPkYGezZ2}^{4YW2g(mR@!13T~z!7jU_%84a@ROj* zKX;eM`^N^Xf+}}AxDxyvcouljZue_%0X2@Vg3ki=IhaGbbto5Jq6^^@bN)HLujY7l zQkd^Ia2(B{&xAwtvT*+~&i^A^>klXx=lJz-egud(qTdbYKLH`f?B!7K3mnU6@AaTQ z|H~oze83-o2ZrzB#fv$_t3MCd&Ih-J?{jG9FpeuZ{~E`O!gbUo`d5y5+{=D`7*75( zbMaM_c>(9R7}HhVdP0Br$oBPF&hZKR=JNPWzRM2I;dnG$KL9*|LwZpQ*913az9X*a zAo}}Cxc2FQvY|I|{GQIae+UOEX|_75YvD7K>o4Q`Ps8~P@NlmE2Ka4`L5>j)*+TMp zGJJUp_&+&bq4FI6gYSogd*^~nxpo=&mmHtrIE~{4T)PeY3l4q0%ptoB4t zIF;k8;l_Nf5Apr_aQ-xS3daJj-yE)eFQDxI*SLOXI2T;P(GKSWAa2S&YXc^55MS;K zC(j1|cX9)K7HuBGk$l$kMYcJcL$;lKaPju}0Ds@Z@j4FW%P$9y1+M^;&w1g?9PsZr zUc&w7aD1HaCv)7-v6DkKejL|jqcO)jIiAfqZXtRh_#9B54?5Ty@s)g^!M%Cln>l{Q zaUka(0`<9xV-?4R9K#&H&+$(jM^om*;26gyj*~d_IfCnl`&XMwf5G>E=6Dy!e{rnf zzCK^)U^+8D^j7dXj?ElD;&_BZpO0|h>Z5ma+{*E{9Qynt$5A?H>l@&|bLcaR^9ndO z^zlNzD_(sSco>I1vm9*xdnw-!=Kdn^0B{4SIOmg~J}>9{?f%u)Bj4fs+c}nUJk0Ue z9IvCyAArec5$Esal&!f1rGN2O#Xh8 zV=>3`>P;YdDz#g{jPlUu+Y z9Pi_J8%L8vpLcM4%D#CF^QU~D%kguLS8#0QXmRNCMUH>4Z=PqkmhX3SEQT(99^zQY z_rC`>>H?o*IG)S3I=F^oIp4nz-pirSk(|GVL!a+*T+FeA^S*HHUvz`dH5{kgH|9C+ z&E|M+I2U}2<0_8VhI)Udi^(URQ>$;P4A%zZYJH$FSgQ}sjb_eYv_3xL6vwjyt_EB2 z`r2@HZ0l%M-yO%}{;gx2JGP?PGh4IcS}U$M#^OrsO%H6SG%EvR)n>fDF+AMZOfTG< zy<&Ep-dP^k#^RC6R;$-v9jeviNwxX9C_Bm@>rc$G{)*+hY0aw_6f72IVYYMH=6OB6E8lx?~=jVP;IOgkBqm*;{Iyj z47K{V#&e^&@#fmthQ|0<+!(Fa#jiQh$#H+9v2mo*+(_YOe8G9Ed{mX;X0Y}$)lsgwSmf5tx=E99Tl{eMJKmfje(k99H6+}m55s7qoa-H82wTl!5p(VI(clY zS?eDkt9tW|_31c`iK?}}FTB}#BUP*KH^|hh#rjHM0 z8|2Q+)-sNyu}qaphEw}ibFkXlIMxUwOWPi7pw-RF=2-HG(cqy=YmG}$@p`>Fe5o#8 zI$Wz)FKxl!`cNQf8kNQxmsVl7b8LOBJ{V^x50^(^P=|BnjFc*M%7lure!SVLZK@7$ zEl49RAnP+B&a=OEnp3)b$z}r$$q7*^1A`GRs)Kd(qZh7RV-0S=&FYw)t05I0tu!&O z!Nz$1a8*78JVb?S!}F1UdJA)@foYDBWT&G`sn!B`D4gqBs$fF z6XTmkYIO>=B)5tP7^_u=J0`4>!H1buu1C=IA(<_fxc2nEMaNE6Vriy8v%0?8#NldK zee;jPV-7axT7xn-j1P%NMbeloGj)=sEeztjz2cxb4XU=PBej9XaHGCF9%D@wj@C65#E7Rg1}n@L*T-sOTjRdC+8U^gLSfoMr4`TO zY$GE>~NK4>3mVjWu-p{so;>V5==4ef(fEU{*OG-%~%D^Fi_&dPYG z*}&(~p;&=`Z#1jS3b4FUug3jo&A^7}w5BRx?FGWoS zgH7zzFw0Ilm%dEe!sVL9T_lpU94+nvWklcu8|B?rOy0oe4N~3C7&@|>T2KlVk~tbZ z7^@8rI|+SmOPeuJjcvFBk;#xmBh&CC9Gyo*;p%37plYgM?8y%;@fGwSzO9(qT5v+A z-4Nd>pffr%QQe&C{Gs{r3Pm+1%rC$qem+PRmzvo4sq5$ zM=L`FX%?@R2Q-4gc`*TwF@@O=PdrB3Cbfh;ir6Idp7k-NOxb)Z(MltqX5}$w&sshk zmt4ggBTI|4xn9HHSDMvj?mFXHZyj%pEstjn>(7w>R7M-E<8x*LN(@(+^f#!1Ostf-KT_GKo2{)Q{SCrprpWrn?Cr)T-7XA-c}oFY zJkw`Qa9JFN-no@&C2>G$Fl0JaQo!ad>06I`nac`|L|Vf_dqqReWX*pG$;EEcdzy3$ zW6IqtNT^A?RK|z&IstYfy#fQ%B7_e}tGidGq=eke=rBdUj!0RTR9F)f=*5ssa`=<3 zJFXPfEec;0=A`pqfwe>%raq0$^=dQIdve`EFJ?I{ojM#&?xHh=!FJs-d8UitP$3A4 zfGXA9qM&m32#W`rwNVT$L&R9K(lWI!3_b+8B`o!sg*kk*2H8UdN<-trm8P6~Q&Tyb z%VNGlgieHODxK<-R~@O0xh0j>%+Th=rI;hND|&X-RUy&nW_5HJ$8Mp<7(%o_u0z=H zc(!H}56WPO;R=k{+_}@yW<{R~YmDc(l_Z>G?QP0h#h8aK9j{BabLO&6!MAV;W}I$c z)fX&M(9gHLNyl?$w&rHb*)(Zd;HtOY{AAB&)zOGduYP;9M%1lXQ}GyM(;6QZ z*sO|xFvSp^6{)EbQEEA#FQhPedL;{kOPbqI9mY`9=}@yW(%sakRu?MlPE(9D4T#Qoh-JZECV^eeoO?mh%)c4Qz;8B$LpP4HeP^{lp@K^_GB2L(a@%tg||uGwZdB zk6E(ZW8p2V@rJ8&Spg#U4V6(3Dnl!rG#W&hIQxuPHMzutm9a{)-pgp|G>a9r!kVns z8{w?6r6~)oHprOoQn^kuY3Ps5^D2}Zu=^zcA zRH1G9%Qymg8rRSv@<&?5_0lz5dF={PaF*dn`elKpBuB@SNO3dGqjh$r(5O}-)lQVR zfvA~*U{0PCK=(Ys7M)%w$&8oeg+g3tCAe(yyqDJ~h#Ni86T*82IWXI9hiFbYr07f> zOeckDX&Y8I8j>Xzv}mqLC2hu#bfQ(gazXh;K}oUPqG44?iJx&k!NywB-IgXDuCZQ9 zZl!L=(%|tNCBa3UJaV#Zn%lGVvq!!WYkesF+z#a(M%3s9fERRZ{)MQpr@(bwfcPvowPsixKSSWta(B3Iqt#7I|8+9pGzJ!NWT*=vvl6OHONbDEd}vNZ8euc!K5uNaQftoh zVbAmYf#t4B8XK>t$;I^9mo?rgo2D;q+U)SMSBZr4Q{9Kz8OfBC#@CW`^?Zq!jLxpE zAG3!btZO}$&I-q-RvNRZsegPuS>?!+-1#ZM62vw|RLH1Dt81RZOHCqVFjwm#LVtB^ zvjPOm;CfCvWmI%d!ymNh*`KFCp#lOlEtWo=QjN?CTqy&V5rpI9zgeNRh)C*#wk{dl zz&)8tv5K)lF2O~gt)B1G?1BC=gz%Wkf|oSp<29a45{@UP$IniZ zjOo(0!VsyrESj-G;+r@%LFKuox1`C|78((cZDZSJNpr0CovrZG$D z=zHh7SSBLfV@>~z>m@&$u5euuLHK(4p5~ofMm^=pB?Tc`?^{Mm$dw1VLWTBsB{KJBOl!IEM)F6u+ps1ClPs>Xif2H z7{(ID^H^yL_1%(>3N!t@W@o? zSyx9u=Wl3i)&uugtI?1YYejZ7f2A?r8qpD14_nCHA? zk*HRa3OF4_8EYj^&#LuTu_swz$O^eZ$~@f1*<3O(Kc2Hz4+KCh_cb z87DMJRkdVGiFl6XLF^eD>ei^|o(<3ueJ4IY8H*n6nro)42Vog!+sapg?V)hjb>lg< z(cfweE32Yz#w{f)uX&{W_>pmIU<1n%t83Ap5l&vRSvQwC!cH3=@eNvmBsP|xRTC-Q z1tRp+bJ&B)v`Dg}rB)vp9=C^evtNs}Xl1lAwxKgO&{UCb6^Pa*i*}f#2ewHNg=4^o z8;XwCD&ttNy0yt8b!#+icfoFbmFq@E#qiu+g;I;nm^Y&+TEhi(1t{v-_KWb%dS||b z6bq=!OUT*FN{u~*a<*fFdAl+`%%gB)Vj80pef7E{$Y5KqXS5 zeOpUZXcslmW`ki{(XjW$LzGOE)K#IuDwiD^9Y)ndZz=32TTAcl4qRGQ6 zGw%!1C(CiQ(v*GF2m2c9`+_91x9vd>b3<-#i)|dbbd(v0RDyz0TL`6jALfy4eiD*X z%Bo3wEeIM=zHZ9up1CP&V{@f8Hd-5`5lil5iYSb+i9bAHEsi?5KhGXvTFHb&sNGoS zNkQzSdiGP}%Zk6_8n}Wc9+`Nf&s?le zs!(IIcXUCkGE`j_U1(1fweT?g%%!!{n6rgY$pKo_NrhxLP3huKF?mH%@o=?LpRe|( zQGESygFt|kQGc~L-8xC>i_cxNcGbD(%%4C1l4zY)>a zl_pt206OQyIl9@|UuO>q3Z6}F&$rjv=BG5p3bPd#l3CLzIAdzf`%4)sDP7x+luWvj z8o}HLEaNcD^OiB$4U^7bG*D?(`|Lr5l+-7>Ry=3j@Vt24*&O2>7tBpN(ry}URz%yX zQ71t6i2!D=+j1qMxvCTK!O%{sSDUwNvl$w&IZDTYZ}Zi12qUuFV8%AHLbGi!)fP3H z&GAu1jE(-wvH!@^$*JuPvIx^gFb^a<*}ke5?r~R+NP`#ah;(a}Xnpz!N6!pAOB!vc zZmA5i>1G6S3;lNAqN&+e%}!+>vB{!3M8z~2oQgDJGDehI<1(Y3v+|;|wJpdMti?@_ z0^FSxPCa8$U`e`qYK-)2kD6jw+C zNGU9GDC`DB!}3lg-6cxKkj0iyGbqd`!wfs&*kKr@L@0vOHeg%P$P7A6rcl=d=#E2i zj>~u}ac)Ch62ZE=iik|uEKZmPOIbZco%UVb5--)Dr8y&&Ewz#Hk(f++I$)mHhUfC# z`<4}jCn}M8FrJ)@6rFmhZ`NR#%00iGl?Glop=8m*c?%a}o^pmZpJy1PoET0|M6{Ik z(*0<>6EX#*9A~R@y+(jQ7s&!MNV8F({QEWsKRqo)vR z(HN@p;3>0`N@vBX?ys1tz?xnKd@^sv>!MAp!C+CZ38Lq1OKwJ~K?QA>IDL7EI-y~x zq0*H;uPPSka}QX?@HNeb=A^z=gMAnJ9#^&#ko%c`=E{>#n?JH~#(7n3wC`Kp8mbNU zoiaYu>RZc(r5S6^UE6o6Tmf#q?=(EZvUu^rMGN~D9@Dq@*m%*RWlNU!EnKp2AqD%+ z!|JtRBQ3X(dyBapFI=*0(W0ZNw{XVU?DFedi@CQ*18DEa8ylN&Bj;4c+04`0Sc_L& zt_vp(j}JA5EA#8su@k6M9~vi~>|0AZYgxQn(Gd$Hs;wB=I9Tl)UbK)3N>0pgSt12a z4OP9aHr{uJylDQy8K<)M6`SwVle1-(0$4ywqQ?F=Ss!`V<1NA8DJNp_UVSUWD=5q2 zrTw+B8Eb~w$v@n8I&%$czxt@1wvIoBB%^&jKCaJPwD9=j7saz?+1G_f9KUE$d}6#X zUKTH!@#elW*y3nA)t1F)ol@y%0kvrUqDAwU%!uMS?Y-^Y?T6Ys+K;vOw0Cj#M9hV~ z?MK^BaJpw=TYJaEUG3eIz6~>R4RxQ4skI}f(hkm_;Mh$gJ0en5eqZm#v>)W|_K9n< z-`jf%XHRdtXJ+f^ZFj4|-B1%}=!3La&5Ew}qv~X0TikvUsx^%k?<@~ZJkDS~p@twX zZa+*_YD`@3?eA$nu3JX@ZrHF}=k2`^xvzxGb4rR-z(wec_5RJLA5Pl*^uyl!FG*U` z%+ySpxB)5yvB*#$eciwoi;!h{1}x|=H!ZJdmP5mOb8KEz+KZZDNp zpvVJ>QLp|?{0`i>4(T~h^d=BB(7o_BkdY?g2Ew4$H44(W{KUl7*3B;OD(3VFdrgR8 z?QTCDt8dYw7A87mB69lWN!V_DR`i;j15C3K(R;SQ0SmJYRodOF`3=PoLK0_`*_R9C)K zYQJaV8t&|AKR9u%n#>5GOmDji(7w8$i6=Aw=r#UD?OVCDn-lu8(ZY2fU{`-!-z{#- zG-%80Xm@OHH?`ldTi0^)Np8}_qttXFZ zMz>QARKv4r#H~uClq#lKYO1=%hMhf%PS#z<=}p>IR~ts=qo$S*qo5B#3e=l%+c=~_ z(=k7dqpNXi$NA~}uxSNbF#qd>=0XKYo(ZKm`;>T!UXEIxsHhL^j6_N(C~+4i72A1L zsv_Q?nYGOq+o0Q=9Ye~_BychlNWoeN$$0L`_@x=ZBQnHdrt)}<+fa1!1e1W~!R;y{ zj=>8PW9r2-L=frpwnMxX8h3TtL03Bpl%Dx+B@TLh+y*EED|sEUeHV9~1!5V+nPDu} zquw6w7*pK7<#icHm{Bb{=nfH?nN^BbL(FKRkhZ9oU2+tPBMEu+=Sg+g#uCMV@K)pg zG~k^ijVz7Y_XZ+7yb?hgo@nR_nCwpSRwN}LHKR=$iU+dN2Jwn`t*ecw{Q<6D$02vL z7aj$T5lI+!o+Dw3u&yW|b(pw;83Ja=rNNiSFkR`rv=Evtx>huysL6Fw?aPOl--G0I z#*p+R8?`1Y#M>+Q3{jheAfDK$%>9UfG)7lt8$Mr*O2*n}(y|72`tVgIC|BBpanT0g zZ)Udd7U|XueN7M{@}1FXR7RWqK@A|~6CUr;st8Gg!MkkmHstPhq(E34D-lgS9dF?B zb1vq>ymBwV;Nh|9w50oZtXDi4tF4_xmI+Xdg8PWlLc8q5SLQRd(Y;4^<|0u=w*%|Z zShCkeD;}AEQ8A6MGcJPv^z2vJwmrye-$(D*rqL;5VB`d{7F)?BWP)mQdm(QY;tRP6 zxl3t7N4`?)H0amZP*ZtQn%*gO&A1_TmI0XqHtBk!s=deGU3HUb?>4^3 z-*tOxmm{svRVKQR+P6a%^RkS>)YaTX)+nX&2<3W_5hhfdyETP-d+4on(BzmjgTZTl z)p85iD^^<2@o0y4rdh5}OgOSuv0(yBc}A%!PV&E69wfabIf~peA2t%aJaZhEPK3GM z<(n}q@iF-OJPmv1|4KR`&68s1jG;xFZJD;Z9nB00W1k4yM?+?8BXAW6N1Kq2@+WEWzV99v0s;?_FvS$8#Wlp`HEza3~ON|`vz z+?>IQq7}tNp(N7KvIB3aLG(yKZ=_OHXXYJIXvGm}- zJ3QWl7AU^nm+)AFwx~n=W)NxE*R4}g`!)*g#gd?Jx^2?0q<6zW93X$;i6f@T~gtCd<#mlZZ}1zOh`Cy4XuaC96<0}HJ%`jyj+&U7YI#`#AMzN+?L=GkIek z1O)$y(PW-^Oldz;QW`=CG~Q&E^&rx)UPO!iJeCU6us{FGJE?*JOsZTNQ=hC!lX*xg z+WbF#qFr5Jon@#x!m^&Hr!Gz;=3y}zWR#6s{XC&0m+>cYz@n22VL?8%TBrFT<;+UD z!Dr_47J716Znx8;n(1O2vQ&1S$plRxn$hEyocT_tsWLb3iZz+42I=h6_gMd8nYBC4vd;6YTR`={cQ=+vrs5 zhcdZ)^Kek|ktR=*AH6A6!1Opuu2e6RvNfCLF>Dk(+2oFlHMJq4PZi{uyp}YY>bIv; zxRgJ6={T>nDe+pPsK?tla-OQYKP}QiUqn{P^UQ8rkPT|1ik={Z$0}1bZG?83FK;}N zr^YYE)vyZ<+q%nCR3rD`j|kBHF>`OCib01$q~mM~zxR^olPRcLP#~MAV9F=ETTn#V zSBZ!xZ%7*5nOpCLAbC?#U7_JZC{VX0kH?*RJgpiStFv4|BKeIQj3G%7mcABEZne%PF^`7_L;=vw*%PWUQ&NbCC;O#ye?62Wr&HU*@! zi!FSmGd{EEu@_EU(UY`Ex~s$$c|n^Xg16H{SGy#qsMsahU#d;ARJMuUn%p)owqJzO zk3d*rFN{uQ?FeNXB$ zx~P}`U;<_2mU%7=hUX2e;(28;46`$3ng7_gt~xyF`{mmy1UChD)_V@lP7fU+O07|# zTw2YVw8_#^Yw0X7nJr3*Tp!U_vlczCG0&{2Mr!=9!V^uz%t+Gv%r#eLu{<}gtNdh~ zwjr4c=T`mF&B?grOP0sy^FKOIzn!nPbGn6&cSJ^qAxWOwplw5xd$AC184u%v>UU~}*ah{0BxkJn zt3BPeAcuR&jy`*8mf4j0|K!=;1CX(g8~xxc%z~x1NO5;6)xhDHzUYymZ-Mt`LdjD$ zXF=z28HN?7zxHOvK#R${A-XBfq_27)M%kBdOONNMGrC4fN>Y2IYjd+$Z*no$oNi;9 z`;2vvE|{U#lqU4}jP>BZKlh9_ckGg`=0v(l>`}%6w=ro9zy_2u&D|;Yiw<4UQOOf4 z1olLc&o%{1NTUxDEg}2Jt*-R=8kv}#ImEI+9R@ha=!rRkiU0yytT4(DTy67umn|Pf|x0{2a zj+ELoFE4AZk}{zG&Q4~dX&OOOk)cMIB6uP#hNn|nElC79Wp}v(h%!p&=Nx57veT69 z9?+Bp%$h-$Y@nWn-R>;5D}@w+wkDhYO|yH7<@rWW%y;HD9_&R+5`Imi zGm9;04OK%Lwh1;Eh>am>DQHq^k;b^rO*CLaxwGW0vk<^^3Ak9!XXMh1p@P5N8mdPf zl4^Sg+vcWZ-*iXB#N|($6QaAQ{coktvU3HJ;BarAL#+(We?@X?HsxiW(bBYwPxFFZ ziNMU7ZN;7Fd`F?XY?`e|sm`R!6Zwn87vYLfK3jI*S7(U;2W=1iM z_Nl?r#56c(3MuV5eV=ZF)6~T2HkW5Yuu?b7j#ik%|0T(0YA_!|{Oxg_CoMaYGHl(!>wKzKm`QyWRa)S7X4*Y^@FAKtLUp}+f+u%Q zL%PP`ewcNFy%se&#BXM0#O?6L_r++o+3P<;O8XX-o2-?n^-X-~tFGp`Z8Gi7GfU66 zQ9&915Gio3jqe&B#K;pU3P>IkB$KlIaqfwCPzoh_cBpb9+OTwV{@FUVtXV0u90FWQ zO*P|g%1Gpqqn0{d!*wYnCSd&<_dIZ3G<#9WHKll`V^85YMx<%SeT8tyXDrqvoPK?vZC{CXp!Pd&k?#z z-7}|V-jRntQqZElyVt1wAsPznRH>hoElJ2GqAl5|tlx%}kb)|?<+(0rSF6USq?xc@ z&h31)0`~K0`%4JFD~mc~J@(tOE-^VB`4;0Tw4pCHFwgI5<;+DbUgi2s%Lv(x`flP9 z>e*-NSrui&6`oQL4bem`Y1k=ba7oi-N7fb<7dh)1Y*t7!&{@v9X-daUCYKRVf*={U zQJ}dcwP3!JWAOAg3KJw5UMOHl_*5UAKNg~(4b*(GcLs-Tj8?lCEm7K5IouR)JaJ*X zPME0>#}-+=`TgmKE#ZWyP|3tALKTwj<-u7D--A+?)L`U#5aIKWrph#rsjOO(%1t#Q zS;|c}cctOdac+-*|EjKZg+tEWmq^kC8-(i)I;D^<-SOdyAVI;QG}eN4>N!{8ztnlV zX&h>nu*6=WT>8uRYH@5=-;w{a4|L_TcV+_?#3gPUXOc#T`c((k4G^gZO)ATmC*shS z)ZfyXx+>X7C9;)uT@RPAkIWOL;0}qytX+hDFJH2+rplPqq-iqRkM@|>@TbcV&G2%o zN7Ktp;wNf9V8q*w6XcV64ceCwfN-qNI5viJ{nmu_H*+P8>)jx>bnrQq(+7+aEC z)!36@uyj)#trl%i8-;pyU=4~(z9iK{X*e0Yfij)=0(k?oZwbuuzx!KDrsuxdVo;Y` zGB$G<+}=HLx3q(Qbczyr1;iS)@5`69QDw9!1kssaRW8;D>t$c_c7jn9r7Pjz)f)t* z#C1~!oAOVf0uS+(Fcb&mLXeu4Xufn#rUpmcz6(K~RgoG%CpI=!VY*182i36|i}+#c znu(%J9z)#iN@z+f=a#tnbd1;(HpZJJ_ z0YkFe!OQ`EL%P^sGUFr!k%gX&B1O6OLTvInpMImd=&kmvn}iS>bn?R09Mn@GQ-*gw zL2@B@Twiy{d%-ZRsibW?=0?eYvUOdVbJ7x*C0)kVD_z!UO3crTTQLi3gG`Y`6Paj@ zY9;d&#GwT|kwLq(Y05l&E+sZ$%g$_+#;CO?L2rqKXu=hVv)mM|#ifemE@oa7q-#VL zyb(=?H2TA0mPVu2{h3`@n2OdUTdr0$W@c@+B&DyT#-sdL^#k2DK{ETAK6Trts+Vw8aY?8|3u3TBYA7+@!3Zvi)h2>M2x#=c9Wes# z>W^0I*W!_FL#>U3%k<2@jLU`)_!zbClYErll2T1{O^n*-ko`5RB!W(+ZK+T2EcoFm zo9iOLNzSx@l={RC(^IK_3E4Q}_jA2_M;U%d-17i}n6lIthv+WdbDZvioo<^sT@{Hi zg)ld4PLsOl=58Y?*maT3D0QqHiVG`!`jV`GY)^n(uLO$*@Kw76^f1+RRqUU1l-b9d zv_aXOrdYc=l!W!GD|n|zTh+-V#Z${8(>13gW;!;NAti~|L~2(z<-5sy%h5W|jX7-m zn2vy*JOxf2)<$LnB^s0MM0&?ywV_&rc+5R(G7B27EgUOJ_w>}r?va!#rPFK?u~Vd# zq2^nhjHIu;NfMN%`U1WFEVRTF&=%Cj=ihWvk@BEJs;9B0Zps?(FiZDSU8HE{0l4&y z`cesBZDv9c<4u0uBIldTW5%LlYZ{ahNsH!@%sM@Q=%}daf6mWft6fboUQ$@M#*tldld?(A)v z79$G3p)UtoR!=ji(xW!1rlRwe;N*g2)a8}u1uve{BSi*j^Ug+%($gRoE#yQgz7y!^ z>9OMat~Ug*nPhe=h{%7y--cW0AS|*bWGKndlnW7OGDU;Wv+HJ&#VFN@=0#4v;BwFy z@lg6a!E_n~iy7NQyBGVDf!h$3tiZI50=_CvRDgxv?^LhJvNzkL?9V0*>9}G9<^d;J z%OG5o8x76k8SZyiEt^mj&*mXbar$RWGD6bKac2c!jxP7~1)?<|5hT~4`Jj^&wPCvv zs~4j`#1duOixO6gF;J3^t2!HAt-DkV8kt0_Sx+7@{eKKfe)2Kb!G5++?>>v$D#d0@ z7#{*Lp3&ZFRi8RKS+?@xEVYjZEZ^%9obXSEdN%Pb4O9>G) z9iDT`HjQ7lm}u|lLzi+Z82!*1PNDn%tH?03sH_ZDV}`bv=2%OW)_lKyUwDTo66F$)r$X^E5G7;kwbfHBPh`7a z^>Zd8eW5dvVE#XH*`=?vrEjiDka%(iX3Ggx!OcUxU5eWGi8p!UWVtRTTy4}U=yFAp zPGwlI-!;W1ITq%ItF#|il$%%I35k~dlStKTZZEq%NzU0UlPy&tN!68g!Lri-3xr{Z zye$gL9S@WhkD6^r8$xgz(U+c>Yq?Rpm(V)3!caAz$3Q;PUX8+*FvdDt2$)tTJB=(U zYSP57A~n}5XG%T{=vYDce@9BXgb6u|3*I5!=@%Sy`WV41(u0Q7t3+H>W+V6^&cb2` z)$TPf#iB(X3j*+d+D0G+GImM>ACqzF)CVTJ*P}Ekg39pU9oY9h`hQM}W9Y78K~V?* zl8V$vx4Y&NNkvv_c|87FYDKEI!hQrkc&RRBGrmX^B??#49`7N+8wj^Yp)PjKEBHGa zvBgO_AyhQkyCbwGbUxf}nlI@t8m@Fn6P8NbdbJeXuJsn?A#ws1ix?AK;wC$rQ@f%X z30qDf=8GQx>QCcpBk$fGdICJ$$&99{L(saRuB zEtcxyy=#}gF+A%sjS{7+L7y{oqb$?@o0!fBbMr};_w<2;B!%;VGNx^b(YQ7!64(ws z=~^UmCa`>GD={i%QI(qW=}Y{9xze3($Cu7nUE+~M7+7FYF0C)FWcKW*g(OLLP|Ree z1O>_S zax!kvI9a6u#A_Hp9szb*<9YkFAl!K5_A1(~xOw3&ZaR58>7(Zl5G1V5Xfu)(b!t0n z1v8(o-;CeS}lK)mdwJhLESiPw6VBV8(!NVmgCrd`u6Nz-iBhA!RP zk!(&#EkELFF7u)h=3=Ij`)QPsP?iftx|{5*KEp`xJ`>3n4`&0z)0CQx4?;VpDUy_{ zCk(bP@)ukU_2!(oZ>3l4Tk$nLiX&p1=}IVC7n$GpfJ9-q6%6+6x-qQ<#QwJ;Z<^g8 zx;xr`k8V`>n|g`eAbaTnr?N{1n7k;VP{G!#Hp%%E$?ZMSG*#HlIW|jG(!m@{Hn9A^ D<$XZy literal 0 HcmV?d00001 diff --git a/po/mk.po b/po/mk.po new file mode 100644 index 0000000..9416a60 --- /dev/null +++ b/po/mk.po @@ -0,0 +1,2168 @@ +# translation of glib.HEAD.mk.po to Macedonian +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER. +# +# Ivan Stojmirov , 2002. +# Arangel Angov , 2004, 2005, 2006. +# Арангел Ангов , 2005. +# Jovan Naumovski , 2006, 2007, 2008. +# Arangel Angov , 2007. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD.mk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-02-04 04:11+0100\n" +"Last-Translator: Jovan Naumovski \n" +"Language-Team: Macedonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural= n%10==1 && n%100!=11 ? 0 : 1\n" +"X-Generator: KBabel 1.11.4\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочекуван атрибут „%s“ за елементот „%s“" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрибутот „%s“ на елементот „%s“ не е пронајден" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочекувана етикета „%s“, се очекуваше „%s“" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочекувана етикета „%s“ во „%s“" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Не е пронајдена валидна датотека за обележувач во дирекориумите со податоци" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Обележувач за URI „%s“ веќе постои" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Не е пронајден обележувач за URI „%s“" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Не е дефиниран MIME тип во обележувачот за URI „%s“" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Не е дефинирано приватно знаме за обележувачот за URI „%s“" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Не се поставени групи во обележувачот за URI „%s“" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Нема апликација со име „%s“ која регистрирала обележувач за „%s“" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не успеав да ја проширам линијата за извршување „%s“ со URI „%s“" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Конвертирањето од %s' во „%s“ не е поддржано" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не можам да го отворам конверторот од „%s“ до „%s“" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Невалидна секвенца на бајти во влезот на конвертирањето" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка при конвертирање: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Парцијална секвенца на карактер на крајот од влезот" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Не можам да го конвертирам „%s“ во енкодингот „%s“" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "„%s“ не е апсолутна адреса која што ја користи шемата на датотеката" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Локалното URI „%s“ може да не користи '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "„%s“ е невалиден URI" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Името на хостот на URI %s е невалидно" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "„%s“ содржи невалидни посебни карактери" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Патеката „%s“ не е апсолутна патека" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Невалидно име на хост" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не можам да алоцирам %lu бајти за да ја прочитам датотеката \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не успеав да прочитам од датотеката „%s“: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не успеав да ја отворам датотеката „%s“: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Не успеав да ги добијам атрибутите на датотеката „%s“: fstat() failed: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не успеав да ја отворам датотеката „%s“: fdopen() failed: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Не успеав да ја реименувам датотеката „%s“ во „%s“: g_rename() не успеа: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не успеав да ја креирам датотеката „%s“: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Не успеав да ја отворам датотеката „%s“ за запишување: fdopen() не успеа: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не успеав да запишам во датотеката „%s“: fwrite() не успеа: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не успеав да запишам во датотеката „%s“: fwrite() не успеа: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не успеав да запишам во датотеката „%s“: fwrite() не успеа: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не успеав да ја затворам датотeката „%s“: fclose() не успеа: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Постоечката датотека „%s“ не може да биде отстранета: g_unlink()·не успеа " +"за: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Мострата „%s“ е невалидна, не треба да содржи „%s“" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Мострата „%s“ не содржи со XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u бајт" +msgstr[1] "%u бајти" +msgstr[2] "%u бајти" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не успеав да ја прочитам симболичката врска „%s“: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Симболичките врски не се поддржани" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не можам да го отворам конверторот од „%s“ до „%s“: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Не можам да направам грубо читање во g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Преостанати неконвертирани податоци во баферот за читање" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Каналот се терминира во парцијален карактер" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Неможам да читам во g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не успеав да ја отворам датотеката „%s“: open() не успеа: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Не успеав да ја означам датотеката „%s“: mmap() не успеа: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка на линија %d знак %d" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Невалиден UTF-8 енкодиран текст - невалидно „%s“" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка на линија %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Не успеав да парасирам '%-.*s', кое што требаше да биде параметар за " +"внатрешен дигитален карактер (на пример, ê) - најверојатно бројот е " +"преголем" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Референцата за карактерите не заврши со полуколона; најверојатно сте " +"користеле симбол без намера да започнете ентитет - одбегнете го симболот со " +"&" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Параметарот на карактерот '%-.*s' не енкодира забранет карактер" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Празен ентитет '&;' видени; валидни ентитети се: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Името на ентитетот „%s“ е познато" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Ентитетот не заврши со полуколоната; најверојатно сте користеле симбол без " +"намера да започнете ентитет - избегнете го симболот со &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Документите мора да започнуваат со елемент (пр. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ не е валиден карактер по '<' карактер; не може да започне име на елемент" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Чуден карактер „%s“, очекував '>' карактер да го заврши почетниот таг на " +"елементот „%s“" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Чуден карактер „%s“, очекував '=' по името на атрибутот „%s“ од елементот '%" +"s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Чуден карактер „%s“, очекував '>' или '/' за да го затворам почетниот таг на " +"елементот „%s“; можеби сте користеле невалиден карактер во името на атрибутот" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Чуден карактер „%s“, се очекува отворен забележан цитат по еднаквите знаци " +"кога се даваат вредности за атрибутот „%s“· од елементот „%s“·" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“·не е валиден карактер што би можел да доје по името на елементот „%s“, " +"дозволениот карактер е '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елементот „%s“ е затворен. Во моментов не е отворен ниеден елемент" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елементот „%s“ е затворен, но тековно отворениот елемент е „%s“" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Документот е празен или содржи само празни места" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документот заврши неочекувано веднаш по заградата за отворениот агол '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документот заврши неочекувано со сеуште отворени елементи - „%s“ беше " +"последниот отворен елемент" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документот заврши неочекувано, очекував да видам го видам аголот на " +"заградата за затворање на тагот <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документот заврши неочекувано внатре во иметп на елементот" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документот заврши неочекувано внатре во името на атрибутот" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документот заврши неочекувано внатре во тагот за отворање на елементи." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "Нема вредност за атрибутот" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Документот заврши неочекувано додека беше внатре во вредноста на атрибутот" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Документот заврши неочекувано внатре во тагот за затворање на елементи „%s“" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Документот заврши неочекувано внатре во коментар или инструкција за " +"процесирање" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "корумпиран објект" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "интерна грешка или корумпиран објект" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "нема повеќе меморија" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ограничувањето за следење е достигнато" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "шаблонот содржи предмети кои не се поддржани за парцијално совпаѓање" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "внатрешна грешка" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "задните референци не се поддржани како услови за парцијално совпаѓање" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "достигнато е ограничувањето за рекурзија" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "достигнато е ограничувањето за празни поднизи за работните простори" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "невалидна комбинација од ознаки за нов ред" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "непозната грешка" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ на крајот на шаблонот" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c на крајот на шаблонот" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "непрепознатиот знак после \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"знаците за промена на мала-голема буква (\\l, \\L, \\u, \\U) не се дозволени " +"овде" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "броевите се преголеми за во {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "бројот е преголем за ознаката {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "недостасува ] за прекин за класата знаци" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "невалидна секвенца за излез во класата за знаци" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "опсегот е преминат во класата на знаци" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "нема ништо за повторување" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "непрепознат знак после (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "непрепознат знак после (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "непрепознат знак после (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Класите со POSIX имиња се поддржани само внатре во класа" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "недостасува ) за прекин" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") без отворање на (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "цифрите (?R или (?[+-] мора да бидат проследени со )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "референца до непостоечки подшаблон" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "недостасува ) после коментарот" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "регуларниот израз е преголем" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "не успеав да добијам меморија" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "тврдењето за поглед наназад не е со фиксна должина" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "неправилен број или име после (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "условната група содржи повеќе од две гранки" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "се очекува барање после (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "непознато име на POSIX класа" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX елементите не се поддржани" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "вредноста на знакот во секвенцата \\x{...} е преголема" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "невалиден услов (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C не е дозволено во барање за поглед наназад" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "рекурзивниот повик може да се повикува бесконечно" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "недостасува прекинувач во името на подшаблонот" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "два подшаблони имаат исти имиња" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "неправилна \\P или \\p секвенца" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "непознато име на својство после \\P или \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "името на подшаблонот е предолго (максимум 32 знаци)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "премногу именувани подшаблони (максимум 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "окталната вредност е поголема од \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE групата содржи повеќе од една гранка" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "повторувањето на DEFINE група не е дозволено" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "нецелосни NEWLINE опции" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g не е проследено со име во загради или опционално ненулти број во загради" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "неочекувано повторување" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "overflow на код" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "преминато место за компајлирање" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "претходно проверениот референциран подшаблон не е пронајден" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Грешка при совпаѓањето на регуларни изрази %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE библиотеката е компајлирана без UTF-8 поддршка" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE библиотеката е компајлирана без поддршка за својствата на UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка при компајлирање на регуларниот израз %s кај знакот %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Грешка во оптимизирањето на регуларниот израз %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "Се очекува хексдецимална цифра или „}“" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "Се очекува хексдецимална цифра" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "недостасува „<“ во симболичката референца" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "Недовршена симболичка референца" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "симболичка референца со нулта должина" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "се очекува цифра" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "нелегална симболичка референца" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "занемари го финалното „\\“" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "непозната излезна секвенца" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Грешка при парсирањето на текстот за замена „%s“ на знакот %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Цитираниот текст не започнува со знакот за цитирање" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Несовпаѓачки знак за цитирање на командната линија или друг текст цитиран во " +"школка" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текстот заврши веднаш по '\\' карактер. (Текстот беше „%s“)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текстот заврши пред да биде пронајден совпаѓачки цитат за %c. (Текстот беше " +"„%s“)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текстот беше празен (или содржеше само празни места)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Не успеав да ги прочитам податоците од подпроцесот" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Не успеав да креирам цевка за комуникација со другите подпроцеси (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Не успеав да прочитам од под-цевката (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Не успеав да го променам директориумот„%s“ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Не успеав да го извршам подпроцесот (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Невалидно име на програма: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Невалиден стринг во аргументот за векторот кај %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Невалиден стринг во околината: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Невалиден работен директориум: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не успеав да ја извршам програмата за помош (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочекувана грешка во g_io_channel_win32_poll() при читање на податоциод " +"подпроцесот" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Не успеав да ги прочитам податоците од подпроцесите (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочекувана грешка во select() при читањето на податоци од подпроцесот (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочекувана грешка во waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Не успеав да форкувам (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Не успеав да го извршам подпроцесот \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Не успеав да го пренасочам излезот или влезот на подпроцесот (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Не успеав да го форкувам подпроцесот (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Непозната грешка при извршувањето на подпроцесот \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Не успеав да прочитам доволно податоци од pid подцевката (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Карактерот е надвор од опсегот за UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Невалидна секвенца во излезот од конвертирањето" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Карактерот е надвор од опсег за UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Употреба:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ОПЦИЈА...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Опции за помош:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Покажи ги сите опции за помош" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Покажи ги сите опции за помош" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Опции на апликацијата:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не можам да парсирам вредност за целобројната вредност „%s“ за %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Вредноста на целиот број „%s“ за %s е надвор од опсегот" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не можам да ја анализирам целобројната вредност „%s“ за %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Вредноста на целиот број „%s“ за %s е надвор од опсегот" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Грешка при парсирањето на опцијата %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Недостига аргумент за %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Непозната опција „%s“·" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Не е пронајден валиден клуч во директориумите за пребарување" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Не е обична датотека" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Датотеката е празна" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Клучната датотека содржи линија „%s“· која што не е пар на клучна вредност, " +"група или коментар" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Невалидно име на група: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Клучната датотека не започнува со група" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Невалидно име на клуч: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Клучната датотека содржи неподдржан енкодинг „%s“·" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Клучната датотека не ја содржи групата „%s“" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Клучната датотека не го содржи клучот „%s“" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Клучната датотека го содржи клучот „%s“ со вредноста „%s“ која што не е UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Клучната датотека го содржи клучот „%s“ чија што вредност неможе да биде " +"препознаена." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Клучната датотека го содржи клучот „%s“ чија што вредност неможе да биде " +"препознаена." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Клучната датотека го содржи клучот „%s“ во групата „%s“ која што има " +"вредност која што неможе да биде препознаена." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Клучната датотека не содржи клуч во „%s“ во групата „%s“" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Клучната датотека содржи специјални карактери на крајот на линијата" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Клучната датотека содржи невалидни посебни карактери „%s“" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Вредноста „%s“ неможе да биде препознаена како број." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целобројната вредност „%s“ е надвор од опсегот" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Вредноста „%s“ неможе да биде препознаена како рационален број." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Вредноста „%s“ не може да биде препознаена како boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Преголема бројна вредност дадена на %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Стримот е веќе затворен" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Операцијата беше прекината" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Невалидна секвенца на бајти во влезот на конвертирањето" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Операцијата не е поддржана" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Непознат тип" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s тип на датотека" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s тип" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочекувано прерано завршување на стрим" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Неименувано" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop датотеката не одреди Exec поле" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "не успеав да најдам терминал потребен за апликација" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Не можам да креирам папка за конфигурација на корисничките апликации %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не можам да креирам папка за MIME конфигурации %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не можам да креирам корисничка desktop датотека %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Сопствена дефиниција на %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "уредот нема имплементирано вадење" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "уредот нема имплементирано вадење" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "уредот нема имплементирано барање за медиум" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "уредот нема имплементирано вадење" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "уредот нема имплементирано вадење" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Операцијата не е поддржана" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Монтирањето кое се содржи не постои" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Не можам да копирам над директориум" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Не можам да копирам директориум над директориум" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Целната датотека постои" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Не можам рекурзивно да го ископирам директориумот" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Симболичките врски не се поддржани" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: gio/gfile.c:2906 +#, fuzzy +msgid "Can't copy special file" +msgstr "Не можам да копирам над директориум" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Дадена е невалидна вредност за симболичката врска" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Ѓубрето не е поддржано" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Имињата на датотеки не можат да содржат „%c“" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "просторот нема имплементирано монтирање" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Не е регистрирана апликација за справување со оваа датотека" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Енумераторот е затворен" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Енумераторот на датотеки има преголема операција " + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Енумераторот за датотеки веќе е затворен" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Стримот не поддржува query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Барањето не е поддржано за стрим" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Смалувањето не е дозволено на влезен стрим" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Смалувањето не е поддржано на стрим" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Влезниот стрим нема имплементирано читање" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Стримот има преголема операција" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Не можам да најдам локален директориум за тип на надгледување" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Невалидно име на датотека %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка при добивањето на информации за датотечниот систем: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Не можам да го преименувам директориумот root" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Грешка во преименувањето на директоруимот: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Не можам да ја преименувам датотеката, името на датотеката веќе постои" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Невалидно име на датотека" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Не можам да го отворам директориумот" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Грешка при преместувањето на датотеката во ѓубре: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не успеав да креирам директориум за ѓубре %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Не успеав да го најдам директориумот од највисоко ниво за ѓубрето" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Не успеав да го најдам или креирам директориумот за ѓубре" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" +"Не успеав да креирам датотека со информации за преместувањето во ѓубре: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не успеав да ја преместам датотеката во ѓубрето: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Не успеав да ја прочитам симболичката врска „%s“: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка во креирањето на симболичка врска: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Грешка во преместувањето на датотеката: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Не можам да го преместам директориумот над друг директориум" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Не успеа креирањето на бекап датотеката" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Грешка во отстранувањето на целната датотека: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Движењето меѓу монтирањата не е поддржано" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Вредноста на атрибутот не смее да е NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Невалиден тип на атрибут (се очекуваше знаковна низа)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Невалидно име на проширениот атрибут" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка во поставувањето на проширениот атрибут „%s“: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Грешка во стартувањето на датотеката „%s“: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (невалидно енкодирање)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Грешка во поставувањето на опишувач на датотека: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Невалиден тип на атрибут (се очекуваше uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Невалиден тип на атрибут (се очекуваше uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Невалиден тип на атрибут (се очекуваше низа од бајти)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Грешка во поставувањето на пермисиите: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка во поставувањето на пермисиите: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Грешка при поставувањето на сопственикот: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "симболичката врска не треба да е NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка во поставувањето на симболичката врска: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Грешка при креирањето на симболичката врска: датотеката не е симболичка врска" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка во поставувањето на пермисиите: %s" + +#: gio/glocalfileinfo.c:2149 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "симболичката врска не треба да е NULL" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка при поставувањето на сопственикот: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Поставувањето на атрибутот %s не е поддржано" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Грешка при читањето од датотеката: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка при барањето во датотеката: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Грешка во затворањето на датотеката: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Не можам да го откријам типот на локалниот надгледувач на датотеки" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка во отстранувањето на старата бекап врска: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка при креирањето на бекап копија: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка во преименувањето на привремената датотека: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при скратувањето на датотеката: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка при отворањето на датотеката „%s“: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Целната датотека е директориум" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Целната датотека не е обична датотека" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Датотеката беше надворешно изменета" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Обезбеден е невалиден GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Невалидно барање за барање" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Не можам да го смалам GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Меморијата на излезниот стрим не може да си ја промени големината" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Не успеав да ја променам големината на меморијата на излезниот стрим" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount нема имплементирано одмонтирање" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount нема имплементирано вадење" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount нема имплементирано одмонтирање" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount нема имплементирано вадење" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount нема имплементирано запишување" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +#, fuzzy +msgid "mount doesn't implement content type guessing" +msgstr "mount нема имплементирано одмонтирање" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount нема имплементирано одмонтирање" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Излезниот стрим нема имплементирано запишување" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Изворот на стримот веќе е затворен" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Изворот на стримот веќе е затворен" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Грешка при читањето од датотеката: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Не успеав да креирам директориум за ѓубре %s: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Грешка при конвертирање: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Грешка при скратувањето на датотеката: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Не успеав да ја преместам датотеката во ѓубрето: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Грешка во затворањето на датотеката: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "промените на асоцијации не се поддржани на win32" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "непозната грешка" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Стримот е веќе затворен" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Неочекувано прерано завршување на стрим" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Грешка при читањето од unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Грешка во затворањето на unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Root на датотечниот систем" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Грешка во запишувањето на unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "просторот нема имплементирано вадење" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "просторот нема имплементирано вадење" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Не можам да ја најдам апликацијата" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Грешка во пуштањето на апликацијата: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI-те не се поддржани" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "промените на асоцијации не се поддржани на win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Креирањето на асоцијација не е поддржано на win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "нема повеќе меморија" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "внатрешна грешка" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Невалидно име на хост" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Невалидна секвенца во излезот од конвертирањето" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Достигнато е ограничувањето за максимум податоци во низа" + +#~ msgid "do not hide entries" +#~ msgstr "не ги криј записите" + +#~ msgid "use a long listing format" +#~ msgstr "користи фомрат со долго листање" + +#~ msgid "[FILE...]" +#~ msgstr "[ДАТОТЕКА...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Карактерот „%s“ претставува невалиден почеток на име на ентитет, " +#~ "карактерот & го започнува ентитетот;" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Карактерот „%s“ не е валиден внатре во името на ентитетот" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Параметар за празен карактер; треба да содржи бројка како што е dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Недовршен параметар за ентитет" + +#~ msgid "Unfinished character reference" +#~ msgstr "Недовршен параметар за карактер" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Невалиден UTF-8 енкодиран текст - предолга секвенца" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Невалиден UTF-8 енкодиран текст - нема почетен знак" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Името на хостот на URI %s е невалидно" + +#, fuzzy +#~ msgid "name" +#~ msgstr "Неименувано" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Името на хостот на URI %s е невалидно" + +#, fuzzy +#~ msgid "names" +#~ msgstr "Неименувано" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Грешка во поставувањето на опишувач на датотека: %s" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "Грешка при креирањето на бекап врска: %s" diff --git a/po/ml.gmo b/po/ml.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b742cc71d51a42006ee7a42aa0bcf42edaade82d GIT binary patch literal 75041 zcmds=37lM2o$qg}B^E01*=wF$9bP2@n=FOssTQcgl2EHNB7o0h6GJ zpr~l{iH-pkP!Uk*b{V&E9LLeoH!h=$j?U!ybR5T-aUExSqwo9s|Ia!1R`sp!>U4s> z*Pp)iuY2#g=lqx7e>vygs`}f`>?m z=!2kZ0zE6x^Pvyr_{Cwr4t){(mq0f`{{mWtKJ)M_dlK|@(8Hj&L6<;34^{s^gB}U} zy=P?E^Po$ikB2s)kA+?heJ1qn(8bWtLo3jqLZ1wM^buLc+pG_&an6B00lF1>4D>4K zbD$rF!cz8A=yA};EXuN@p=Urf-Ztp5(CeWZ?@ypBp#K8xgH~Wt?azj4yepyN?_JOe z^dnHo_194Gb-!Nc_i50j?4JRpt84;Flk7$)qGz88^!rd<{~&}EpDUmh=y}jnp%c(| zLO%=@zvt6f`W%L?g1#2I4EpELqoDs5_77)ACOrqL<1gbyP>pvT^g`(813e5SNnhKb($o8(lJ{HCQ=q?rJ_~vZOs<7a zLf;7eG_(Rehl`}oG3e8vuZ9Yjw?ZZFXQ7hg+hP9~(8sWU$a25#sZd>a3{=;h1C<>b z(5FMMg-Tx^fU4b>ppS$882bCr9+=noPk~mTE14+Q#W(39EU2gS9r!;W|VI1Q@tw?Kh*b~RM}-3gWa--QYn{|74mPkgpt zKL{0Wu7gUR4?z!w{vA~O{sJmK9(RJ{c^y>ymqBIsDX6adDir8uzkyy0eI|{B`wv5P z{JT(8lsyDt<a4~ISrD!Erf9|_$Il|IJ8`J18Q?=GnL`DWPvPpEMF^phN?r$WW|MySSr1C)@E zeJao&2Kp$BB0io2)%E?*M?tTGN}q3rir@E!I1IWRDtXsK#m|*c$^CBV??b-?JskQ&sPuElYPZ|T(5JA!9jfztpih8) z6srEe0u`S>hvIVC5vPGg=!MXyLEj9OUG9Mj2j7NjyvMF_KR6mHJ+Fm6209LX2J~vE zNv1iF&_QK;m(9V$J43o7{^hLUiV>~a=V{cVCi40Wn zKM4i;**`!vejm;(yFDMO@m~pjICL7i0{U6#qoDr^mHZDp-}yKa`dIeQfU5tE&__Ub zKovKxfj$d*D^zy>PB{L+3%vaiP+fm2RD4_jl|C;C`)`7(-#ek|_b;Hr&9|Y#%YQ?K zyTdPZxmH4D?;2G4xgM(a?}w`2FGHUI{R#AO&<9=Qd_5H^KRW{|J&!;YAKngqH1r!# z$^Ap9+CAt+E`J|XdO91b@isz_fo_MY-R)3~_f@Fy@*}ADe$c|O@e%#hHqd87GsfKuy^6Ot4bT_# zh#EXYhoP^4{tI*qv@u95hTaRk4f+B)X+VDtZ9=Owx*Pgc=wCx$S@->mU*>i2qqbrb zj&FggzmG$|1U+Jy91Hy!^iJrFBVY@<^s&*GoP{TogZ<3k>dOI)IK%agoHiy0+3d`B!wq@BrL0pjb^kdLxzTEl$0aW~6f4Rr?RaX#`*xwE1KYPTL=z;!T3q2D0 zeU$qijz1J--vj+1^dry#g!u&YDH!FW&~HIC-VLv0EUr7_RrmvR{AzLr$8SX$()$w- z=B>~#LO%@M{2JzH&?jB%<9r8t2iNU_DcRxZ*JT;d&2~eFpnnUM9#6lXm=FB|v?|3%U;acTl_j4UUi9(3f)jes9dOi=h2b_45g+j-PS^x`N&WJsbLjH^Ccp5PB5! z3s4}O{StZsbi6%E*^X{He~6q-pzjfF4x~vK8Q^0 zZ-F9u_I>E9d$&`6z>iSdv47}C zozL$;-^l(O5E`guhyRi9-veF6{+f^b{ACyPmFz$46Yi&Pgf`g!By=To=_i?cLx-SC zpnnIgK_Budauc)(y$SkV=q1oAQHt>RQz+2Q&iG?uGxXa~Tq)cB88+zs|HSF#P__Hl zuz$^GJ)8vx@AHG*F>^KO9nc-n z)&J!B|0EQb%GP3BAdvkAs`Fp?7q1&u|HR|xmOy_Dy^!;bpE~aT3_8I6*+27mau4(m z*gxs#9{=6})&B4Q!u@3j^!3{RrStuM=(+4a>0cc`!_W_~|8?jc(4D`c=7TQ#H;)I8 z|95Ig_Wuj2c3=39Ec+bv(*Jb3p7>vm=g&dw9DniuaXkJhl%cX`{Wmo?^r&CEz7PG4 z^S=f98jgP%x(j+C#m*l?zXer4H}>>c9sYp(^<)$59}g9-Z-*jc_H*cyp+C5PkJ+W? z0X{{(stbj4$OtUkXAdO7>=gN{LuJhaE^?6*PR%>L(~Rp^T!>wJ9z+GPLXkMr@a zfIgS~uR+&94}E-(tp~gaDu4YeXdm>vC-j*A?}A>${>P!i(8oT}^|cFn3H!f-o&nwR zB)8`Wq2l99&}*R8-|w+H;UA&G-vv+ZF~7V2Q+h1^4MUf3{Oiz1LjN18>mL5p9-DW* z1^NZ{zYX08eb3W+EDrP>)?@3qHRy{teizjASLv~N=nz!L-vSjLe+rc!zWC`b&)tDO z^l;~Y04jMt0R0g3Y0q%GdgWAlysE$Yd7*uRG@{ymoi$A+C>LeFIXBT(5F zH#57vKo{}%EGQz_-xROs^Io{tA1;^v?&RIG+5R{j5wL=DYmCzTl-5bt*7fRT*c`~6qLsZkfPX7s8g$?(xc=8h7kMdr= z_Hrm;$^MoFN*FNzMm^>)zsLRu!#UyOobdh+p)U{bMPz%$yLYp_m+ebz`ddjqK*2Ec z2=+&K|5s4?_D0@63wjFl9JZ}&KVcteS*^`mo3q^veGbQD*9)M35B)lu{$9lklW4ntDnAqQjKo?t|31T;lM4Gfehl039D5ntxxAN;>F+&kgfgoQ zwNEc<7cydD;)c4=u_F0pP$aw!?_cok7YZK_iNeW z-__wg>7wQDTK4{kZJcc%Tm1VXZ>HHk&h`zqC$bUJvK4Iq#C!c|{;9tovAvM@{{ej( z+p=(+(3}xgZ9U_a;n)S7SKK_GO@Eu5*xJ;d@P0e=!Qs6~HC(HC@=msAvt7(~0^9xB z^miKcD7HWMUAxEf2Hvj^=f|Kw3+F@*ExbRj@Sd=2f8XTwf3RH@_DPqPCszAuo73D9 z-hU3-;QT5!(x1(1E{E#xIc$Gx?|eR`wL?}whowuS8~wi??r+4T2%wl}i< zvv$JY81#8;tGSjCZ+|OzB@JY!vkm$oThr3p9UQwn925B@+X-w>VtYQD{=UlgWVYwB zy@u^fwkDhYZgXO5r}Z%2CD3!(C~aE)mW2ILj_zWkWUyM}%FwC`eHhyp*gnLzl5G=h z{wGv_x3g_ye}ZkCO@IIHBs-e@Pw@UBY;R@zGq$g=>F=eS`!;k7^rz4->mYycU^~p- z`I^q=(B~_{vHL^s2=8A2eK8wlgXQHDL)%Alte@=+_MgXgO*nou$11#kN!WiA`+vz6 z|8C{Y5n<;~p}W~Gr0vphOyuv_wzA!zo$&W7=tZH=LwNsy@Ls1M#P(UXe_&g~_BJ;C zy^HO&Z2!e}J=>aa&0wH!=a~K|!ECMfqrBhE`v*Y3#zx6#e|>>o3#I(YhS&z!p1|4v z_9pgvczC~^bFX64UvHq7@%{?EuPm-NF0BsN2P(Bje{-PT7+R7oTDD@aa>nzVzA(_U zpyQRn`fzPx$7oIOjrJ}Y@2%9wD~;wvrCRZx`nOcas{IqSvC3d`c(}QZPC3_mVs9m# zSyib|R7R>h?7Gdhp?afIZB%N*wUJt5qSC02)Us}Sp4d{$`yFSPqkC6X?BWC1|8R4> z*212Ru&ScLtCF!ckTW5D^q$;XDuG0+bUd??Zu@&H+2T{qtu)6fi%)sUGy5(cs1MaA z#w#O};}ez5wV+eR+q|Q)BwJG1R-f3?oSdjMM{5mfdU1AYWplH+b)-7BmBwS0^Uqyt z+`{NstvaxyQrli1pBT?h-8?=aJ5?qd_3f2`=13JQj5qtY)-dJ3z*ud3yyk`-pBx=+ zj!iITvw_HnH@;(hqBfG9IxxV&a1Dq1rKf@H)X~x5dVh7IPV;r6BI7HwQ^#pn_k;Z~ zVrK=Lmfiu&vBzYmPE3r|H&0H~obl#h(!Cj0R}D5N8;q110=>yvQc|PY=sWxTGtbPP zSMA?AIcm7Aq)`W}z<3~AU2XJERQj8vJ1PV9v0DE`b8JVYc`3L}yTvx0&y0`OkZjmS ziC0L%T4i#a-p*Qk)*6Os4AzGx$6Rh4V}LV@##geHTv9D)aDG<~)W)|?G=s#c?|~*B zI9Ap%u2j|(00pE?4j=+k;lY_o-4?fQZ8_G&Q(C~>UmG5- zqD3%Jp8&J<%Ss$koyf;f9TvdX2yvTnB=^RNCMSRyVM5**8;@4Uh>-)$N%ijDXwIq- z zX_5?v>stkt9nDF_8C(w$N6^|h4wv_y5`>iAP=>Ey!SM-HVL7)kQJ>gR>8sSn`>UgH zn0ly=SB_+FRkpfGl<2p3jTT48nnTJBIy^zjP=_M~V}O=~Rf5s^=)Z$w&5;5}5jtYT zFcJ!glnJH%m%h0!cg;Q>YocuF5)= zG6r{4)@-l!R=gpsQ}$`RVeamI`n-g+z8! z(byO3pNZzaD`bl4sKCxw!vSfQp`;vODmQWH2@<9xAKWvcUBg*Z4q>H z8FJgrZ79`yu^a*i6ZPR?XQ9u1X&Zhk*@mky8ATG0R6Mf?wUn~Z;b!5XW>B!Qw^g(l zLKs1MJ8{wY(I@Bqh9XtKE6R4K1sjsM7T0CHWO%w>C0L2m)}yk3fI30qRi` z{ytjmuhG6duT+X*J6jVb5a#jf*$dL86>3RS3JI0~Jwe}QwWuBy>`G-Fug94RZCiWE z))@PAt3cX&jGb&Vj6Ep1-K@j79vI#yfh5w&vUC6mpGRh1)$^)jTF>S%L(Rkp_a z_#KMw4Vp0pydTXP(tpUpfEvj0qmrnrJjE%8h?eDKq{S!T~YserLRQ>d3%Ege4 z!gQl>Qijt>#rTrLKIJGmp}9=)a2U8Tw6c=2R)aSe2ewYuW@bSG7`iWVwBq zbWZg`o9SE5wV9d9xmGtt3{)qo1t#(nBP6owP!UUGl#OM|OUId`RRSK`wBFKW2A`o@ zDlE)DQw)45%HP6iIL^G9$##{g=!}lXo5RMi$13wNDzU=Bmi~msT3^Qo#3(}+p}K9L z@et$NbQurN)Fkzsq5QlxXVx2&+bxXOwoeqei7hzl)lHu9+RzkRj<6Ut7#9&jFc~Ma z)klgpjID`8wXu@%3Ui2(vtddx+Zm}QU*8HBgrGqUot(QJ$t~xYEcK7oM~RVzp;&tv zH@|Pwewf#kK*XyC>a)>0cpRb#9-17kjwx}gAXjm^h&02zjY*C9e2Q;==}2|LLrv+G z1>U^5Ja?piS;wJfTo7G;tTsAK(zY^k0+U;jo-;N)S-f(L?1(Vb=WUAEmY>PpT{DZQ z8q+yoi&F&_$ILNnM7yC)lMOlT;w8*pu_1?~j9B7S(_(_k`LM9y)A`UygRC$lk2QxY z0rN{MLrlpQ4HVj_&L14`3d2txlAUfNN+c|y=_K!3Lu+O6qVXlgc2;Q_*xVlmt#WDQ zzR<1G72^t=$$w^?9<4KH6|rmd~0o_nO1i#+k}hV zZK)08k3NB{j?C<8RP$Cf_T(kOoY}a7Sx^{aZEf$tjH;5D4*@5 z@sVm+Qgd~Wu-~bvRhG##W`F?Yl^{iDySvg5n;W&Y+xd1i+pxYS6RNwVs=E8PRK{6U z1|eIjEM{${oMmQc3(;xTQkc)@>mG}be8w@y9=FP;Q`=cR7_Kd0Z2_}ysgC-*B=n+b ze3MBEIkI3@CHac-j?dg%jM-(gc2roGwMKJtXv@r=sn5+z+HhjmghdPU6M0g{Hp$j) z7PDS76>BNp${cpA=HWrJ8CJ106{>4FO9*Yz!AvHsGEW>R(l|ngSk=|JPFN#j)GuSf z+}6(GxXkgje3pYwz-@^$gM-79<6Am)IKON?xn0*%{~A z9h23p0Ffxp@+#9-?$TqdeTeoj$ugqcwX* z@CmKfMNjZWcqZzW-%*Z<(Px5tGl`V0NkP}{8der-Ax{D+AH{WtB^_IL-EfjM&SQ`1 zqDM76{B-QScZ*#j&~!J&#RXrYRlb$K`&?qxWhK#lh@R%p?|5_JzZ1) zOE4XZB+~ox=B0M0P354br3Gc=ZEKB7>toG^(B0a??*WAS21DE`X(ai!Q4t7EsnD`3 zUx?x?Iwt1|>)dJeU5qd%QK+S0tYtH=sK-0xzCxZ9X$YU$T(&ZQMrgOM?Ri>NoU%1O ztrAnIdxW8K1(3Bd>Uh?BmzD64I?cPW+wHQ*LOWU*KU$9T9tvU-O%=Q>RFp^~MZ1n% zoY1^lLCikyY_wV*qukc=`chvSv}Ng%&L$gqq>T?TSm$}$bZ5fKncOIyT10Knbsnn~ zOkC2Me8g=QUkde>*_pM$3A>fdx{u#qBZ^wdLuXbpY@QtCK2mljQyo@qZC$M`W1UqU zrr72FqsOFB*JviAY^R%;S>A*sxtU(T_e67RjhhsU7Y!^C=QHl7c7IL#ozMKrc+1B} zH6Qf*bFDRo!NY10-Hpu7(v3cxHw6hzTL=wj>0avQ+Qc?hpmvw3?TLi!?55ve*V8C| zo5r+atG%UD$)T$+ODyh)cB7(XUQmx{) z)q4}zQ%iiZBwII7yhkZ+3U?rQTIi(Sc!#CszLskoEXU<|lVh&VPA)upq!L;2-fpI8 z<-RX=rTZD(c89`xkM7W`JH2{qC_yJV}RFETcP{nWoEEB zlo@VO>7D}xza9%Jzn!>k3veQ-3i}>}g^Rp&lWy8Y%GSj~+dMi&;=*ye55tX6o;;v1 zSm!ewa(#I*Yg2%1{pxeqkdC>Z#yTh->Wf~WT&|~rmCSO2RuUN9ZmxuZySy;9UU%Nw zi|CwZB5Y|SAi?g{w8^vHn#w)Etz5F!2RM1CE%UO&rh3^q zGEbW$z(z{%+9qnZ*zS2)WLzQZ2@-X<500dNVpWJMBf>Yb*c7m z72h7f@X6tMVX-&I1&fYK_POoP+tS>o$Konl@d-Bo#xpzGdc+?#gPFGcc3yLGjBph| zQgXf(Jz?YunjPD*NjF%s^SnjpX<=wk(s%JrOS@zn@-=-X4!ESIV$n|49+d|&?APwL=O-tyXF!Q87I~~XopH`?%*cyT)+{ZQB^7G&+ZK6G_9P^QS#@%l z$F$7MXTXXpgc@)qlru{M2_I?4X9)uev2wXDBv#wqP7Rulm z7c^O2;z`6jnpqKN!xY+TL7fF{yP;dt4aqizIa`t=oQR7(?PZ06OsvB!hMk`tf2!1~ zWAgCEKwopPFJQ5F+HQoBbX%TjwFikejgs2Io2FH=msPE{u1kV0-T^_R#F@!~X-Us@au%6aPedKrWV^a#Ri6&)}g+YImO)G@)bU?Oc z6rk2xxJa|QA*Gu=whn;ho4EHF35^o5&(e?AL3C&Z7c>tyZS#op?XG@yflXF4Z#SoD zxha??E#n}GTN^fQ;R4o9Os%DhFq#QgHTxN^RU6CHe;3UMhntjjKK1SPn%Me6kRl7o z6M~EwVt|9qhB?oLtcVST&f8}5*-O@~->`Pw*~^wKyExleSkWRUC`V-*S9`h$ksT8Z z^BmUZ8nvqCyvz?ZOt!JV>{{ZS2ULIF5R3BB19Zc~ZoIdg1kcP$3R9bSlIQR*tBo}S z+gTbaVL8l27N4?MC-YAT*p1V+I35<#`G9~ujht>fVJS@!g0k47oN3KbQYyE(?BU;7 z=vXHNsD4{E9OhQ{gaQSLejw|w^5}%!yp>73xM1OAS`UnUp zu4VaL&66+6-njkcnC6PS_(!4ny$n4~ZI6iqpKV!^gJ|t5RUB!5x^!Y2iwgF1X>FV< z#>OT`HF;=mewiFMN5A5;=bz#uR;}lC&zuZW-eA}kp$vci@d?xsZh81Ex|?fQyno7vN1L34y>>wKz6W@yy5S)3hY*+|`jO4fA}%=nbi;^j-y z@vuCerm2e7=^1$|v9hwzkwQd$J2>Rd#}LIR`oi%vW8S!49B&*=9#A+J*C)q3l=#|& z;(|i8?T3VF)+C~#8Y2& z$)9>}y&orkg$uvcHN;IAO(wEVt#yZV3!%L^X)&ziNgn9W~)3t%CqES;k?}uRiv)?T5-(ejizH<2Dk?QvP$mB?cdzDFGo(Bq# zm(5(Z(d;KeFJ%Mn%#XAu$kIF~VJNr!4r0+7WVFc1iseg}FDDErvG^iaE`XNAQM8yC z*YdE=XOnrs>?-1jJ|jU9#}IK1CF!5DUXc1aTE5tvPFSUy@3r1*OUJ{KpUV=wJ_Z*W zX@PsF!GjHjm4H-X%ys_6xf-nR)W8d)@yf>RQq~YqQK!r|`{|CUuj6GFRI=oU!AXPy zUsb_~02B1;CWn_cD#!XfK$qER{a8~ux^L}3-v$05JszfGC3e{epC_n|EgKm=rDSXKKbsPFtD~8~$eWwvhR#uK#zG8Xb@?-msIli)D#meJO z=v#i=^5rz_JC|@FuTJfjKc|oXW0rHt%H=0KbNRE5U4F=!jM%qz&}@KNZMl@m7CCl0x&?+o3Ca~@v!yy|AA#VeMrSh4K5L)H)TiO%7^ z)5&tI6*NX|cl@MdSk1S$CoOJNo_*KD}@1Z5*8S^Vs{QZl{NRQ+NB-boIe~(>pbc zF6RWVoZGc;>K+^No{Z%gJN-f9h4H*;Ya?aceN(S8W@z#ebt~3Wb8$B!1gKciM?})9Wg(dbN+tySyj#b@#rhJ5859x-@DG zP17D`U2bWVqi~J}_PRdx8c)+rrVotMri}+_-daj;(JmapI_mMm`!o)E+0D*tq}?F! zQtxWsa@s_+D-qE%s6j^>dWK{Yw9OuHeRpOUE7w_}LvhjP9nkr#LgvOmbMqIMJ90C0 zp4;8eAqUa`lUvPTQoR|VD55}_1?BO+#J39K?VI8}-4r^Q-nFo+i=Wsxf#iwia}4Dm z+LPcWG`4)EKY4z1AB4Rtis{0(p=}AO0dH~+L$m^j_3xOEI-9>ep#sSlX0VyA|DHxf~%#4BP5kj+xyiL7#Uwr}bhSOP7a{iunM zA|d^@_$;VmbQtw^d+j|!!nE_FBXowkc1s_++E3^LPTah2`q~&HTt(7@2LzfBW20Ot z9NTq~cZ~$6?SX)vi&4)Vkm1|RR)AQP%iZusiyTRR!mrGrMy)0+pwx8MnPXJ7ci$8p z)6C-uq6_-xH7X9);_~}P^(1(_2?F+ zcMp;+ioZ&6Q{%()rx&VC&|MbP3USPm?bW8i0Lv8C&^o|Cw!31k!c`Mou^_vc#i1u| ztv#>7$I&ECo{-52N326KUS^;oRe{nJ8<3unciW6aUsC~l^wimr)pL$~*m4W%l}p=8 zfVTJ$VO{`KM4T9MkHE<8T<>t!kS&k!H`_7FmFRgYU0Sr^o#4aKpQrIXK(4f3el;f; z6H#Wkg7};^af`Td3<@`>iGgw(l=mOi*&^bB7%n-FyRL(LPl*{0ka+Ha?y0VSa0_Tr z5hjSvD#hI6PeMgAVNVaLCiT?2XRv6c;4EO7+X(U8uiV2T@f2)!T)=Pj7=AzK*mJ$Xg95u3Ak?!vikw@21;ON_Z$ z%h$a0xfi+b;<(qrv)de_zL%X;*3Iy`nf>}V!7QN5sG4G0Qi)4^zr*r{`#mBS1KRvC zn$6awMKuQXH2N_cm#Rj5kZM9aG7c~$K*IxlHlb4~)c}6a=q<*E?Q0CSh#-KP@2F=o zw?%(HG{5i{pW*C+Kf-F51TyAK7I(oCPh@lMU@{sW9R1yA_jK-A+v5qp`>bxrzlvyn z%$l`3AmJdv;65lTaK)X*Jst*>f&JV;Vy*NUYs0D-u=+ zb!niz_C8d~drCT(uY|E&4CO;HY^h!sgNRG%K%7eD+8f0EC``SKsaSqQzga)3(2)}u;=zg zTRu5rA{EQf`(^~LLpq4l2J8%OsC8QAR_ABDjkuK%@CFl<1*ndilF%d z3Q~B*@7V-PBMxR}2qZT@Q<%-M!qr`ZGJpj+mQ^Z8a^3Z&C3;iNX@jJ=;*bX@S33Zb zJ(wiV3=7xlp#IHaqPL*Jy~$`KiBoLYC@g*9NCB2UoWN|52KzA-MUaOt#457wDE6rn z3i7VPGK(uVDH`FuohQtqt@dOV>sXmhKAA@)cOOhbhO<=%vD4ytTup8v{=^JquGKad z4T90OP0xvuLIE?iTUp6n8@-hIb!t#Rsr)>w#X9C=C^U$<-0oQ@ind)ZMeF+%ZN>7M zVt92=;zX*r{d93oB@6<|J`U!$J52D61K+xpIp!}VP77WzwO^2E0@YOCB# zvsoZ3)*l$D-5Sn3Aq#{?*@}EB>A?1V$mI2A@m8P(j?jFl8!^W3I?vOu>)SW=rs!{E zXpca`A4&&G2td(Mz{Gu}>oN_)R7g{f>Y!(L0<2FQ2vg@W&gB#LF;M*3q+%wB0VT~6 zBWh50ikylF2j0&#l1GZjguFb&2ZgBYK)WG+oWiW|bl_#0)*}L?P(idkDN8c8M?*47 zL11fwRzOQpCAc+EA;yBIkY=re{8G(Ax)O$frAmwD#6O1dLg1a|QM1~jk4uR6q)r6! zc$kN`c3Eg!ssncy&c=zn)Nmh4p~Y2%witr%+V?LLZ)5?^v}J^#DpbR{Jk_~jFhlO# zB~vp`kh40PjhPZBD%=^Z?g^`ifE*)P(a^4UB=Y>sE2%J+ah91{STD1QobYZ_iLHPv zw%P2h97x|bT^x{zKym5ZP${^I>_StY5MgPrqejrN*H}4t0Fx@G;zSCr6*mp@bmgZ* zB=s?ooYNo{-*`36!xY^7WB06Uq3X`7iK%d(dEV=y?kKkz(`|Dx;Ru`JBPHug*<5bn zJ{d#QT=7w8CPO+-m|#c`UQ1%ob{FMPu^tRTpbQb5ZKP$sg#2hD|w^b z(^0DSz+)!ybx^#*plyiEY&ogWWp({zh7I=IocE}!cg%x7by7=jp_U=RNP|6dWCT_q@Du8?ED!cjD_jLUv8@S;iF z7;EiuxOKZk))_ViS*#8mb{Cdr;TMPX@ZnEMq{(CMXpTM@BGPg_H6@&-g)14}lM9`J z@os}f7C@ZBg(2R1@>n|^GEm^JEd9)g-M)mzY)!2zVJRer9_3jkPadjM)HgK?ymm=k zM3c}kvu`S_9w3$lel_%X?P?(sq@IEvT6hR7+-}a8=NQ*jTdc-=yX!OxhMq|JQ8CFT zhNlBFf?M6^JU&jydJF45Xa#uFwfCzai5u*{p4$Mm!2Y6&$;F^1so1?#ujaCxu*hdf zX*oB`b86k$IH>4m0}g2*YDsxq1>k`iz!OArXJt411+NB;(Npw(Hm(UEC@DN_8a3Af zd2>9{pL=%uXq>PyEw|1r45IeuVuNmi=LhAbm6z1s??*I-!G+|KUB84>r_~cpa z`Y@b}3srXLK-sKCwG4%Ac1DCS`W)73Q`4e>KC7&fP1Z4Dqc$o?ndMdO)a zWC~m{euoSi>{P72fJRtScP%1eOZYsPTpoOl0E-wny@(9S@D}qxt0Q&XBT=r0gU?tT zK^Aeek)O4INBYD(D)8B9trO;%W2{KV-$Ue&nxJ~JgN9|sxDPl9@!vxj0`s(qPk-j` zOPTtL(Qsj1g?Q$({b^Hs9^=WFe!|QBu;6N;J9tQ3^q)Pk7PXtV^w|qKAeeStIK&#S zB>GVwkWJ_eEYDx3vE%Zh4{$^qK>ixzBr zeZ019491r8g*m6zwdHjj)w>8%U%&OV=g0GQh0nc(3vgKgf|Knp!UM~#uAkO+3rqhP zMu@UkSdLLU#P~2TE@;<6AL5}@ItMRGYefzFko&D<3hlktwJVtri*6OtyhrqLpmc-e zbdBS9A$4mMo)3})M?Dy$qAD!Qyo00?Vt~tb;0KFeW71+DpKb_O%-_420>D=cKXJL} z21_lw^tBayqtRAcLDlkg1ozbiG zF+6O6A^h}hF_)(@O-=#67l`L}W>~9Zz$7m41K7OAn4lry7N2abuS_w{OYvgQ`un+* zmEx1UzWb+q=QSoe#=NdwfzF}f&g?LVQ+>s7W~S=hr=slNCwm@O}Ou%ccLIYnEGr}8^aj13WMhC5h^n#_pNOV`dFB8@J zbEr!|%Kam@!y`Eu7Mt9W^9R(BtlkgwX z>|Or5L_A1|cJuOxPU$Nz#^`HKHgP2Mx7XxyFAP|uvo^)%QLV&Z#TiOxa5o#T^HPY{ z39XB_2Voc&mrO)Ra&cia=)E;?h2k3_c1B~!DNA)qXDB}R;|RDspoWU0<>vtnyg-0U zeL1oX|A0+iV4!aKp+JnzSm7bIn40p>V|q7qjQ1qo@qFY34)n_Fu51O8xHgEtZYuY- z5VMfMkG4$bXX)Dk%WJ{()4P`XCp*#j9W5M)8%E-_{JJc^XE&&ihVI9}reE*fZtz-M zoHrwfz{$<#9;M5C*rF|S&3^(qHwOGWd~*l%gb^T0bl+9z*~=zuF{cU>QI1Z2 zxPQ>mvuE?-IWmGu?qg2vyRoemHxY!zWIC5K5*_0&$;zRWUb`tRIz()bmoY%> z$1Js*;lr=l&X3*M%S^(y`|+nE?$IUjJ7sUO1G|`mW`dnht-91#`WfB%uxvAuQZCA2 zKii$F;LG#q4REyyC!oZi1D#Z~7D`@?zZi zO@!tda`gNl>lMhZ5};**%|2jbHo}1g*EY$cUIwEO$S0(-wvL%39O%;CUpl$t2m*_W=^Ge&aU8tC6a)aA2TVlu%($E?L z5zNrHyVUM%e#zfTYXr;nj|aP|5Y!bWJ$UcFR&?O1-2bPTovj|^r#?^;-c+bgqZ&QJ zm8%tap;^)r%0{`uv)R)v5Wq^$C3jB_jzwk@vP{6=4sIfsGuI6I4nCCQG{{S}_Q!dA zYK6&|>SD!se}gy`a>v23+XAL$TJVD3H(RO!e(Wo#0%q{1opdN)b+-yK$|gB;91xZj z+HA5@(uY^}9!)7k>0GajhhFGM+0HxA>s&QgdHR|a9UiG!(v!?w54)P1MeBrk&pEHa z(%RpGxzgfO`e}9z-F=0~+ADnd3M_1q*ffi7F<7a+e7)OEh>$x?C=V^@J?LQCj6m=q zhqyjvq6H~HNob~P(q&ui=&lgZ!s#w`l75T6>nrRzlY_}o___Pv9fs`ZH0N2twHqz} z@PEgmgGrMXLYK`jc;SYeuPqyHaOIHDBh75lf+}wIVErtx_gRKfw_mosZB|x1|B97-D-D_3INZGuOQc zQ6(OQLibu|l`I76cKyWSxa}UPiat!m{mMKAWZ@Tp^acB4&Ed27g%iG%pN1a0gCkqD za$W2;*C5`V#PdlD6|t{Elvy&0>@1UP!xE8;?sJUWtjj%VCchHlKDKY#2A8lAYkCiN zA-JouS2FI)(^l_GdMlgxd0G8>RPV)7uiM*G9Iu7&Z`Pe7%gv0uyY)j1DiUo8Tnqto z&oOgJpH?%tnrO|?ajil+@)ewL6D6=E$#rgi-$mtscAd7_B`*l*IQbyZ3IM)O$DP*4 zx?loxMgv>e;0LPs0bBj*1BxP)1nAj(%@ie-%;B}MB8ceo00sJx)qlQ#?5F_c-J3Z% z6;x8OAC_QrMggvl0zKL2e#yOfu)3Q`U%rmeCInb$hgzAWRv9r!GKKTQrTOE4?v(kG zmwtwVYW132YgTu)LREqZ^zfYGFN5s#vNnG8M+k#UvT{3g|1c8DM2g*FZ2^3sv(Bve z5c5;iBtOE%Z}coo2m3ql@yB&Nu*Z+&1Yx31vIGcG;sT!NH#llZbsiz@i0A4yWcmZT zGvMRF3nRjd>b~*|uaEd~D@TqsMj>lhs)0$4#-deRb$pZ!AIJA*9XMvzP(IA}3Yf_+ z(X$~)NM)a*aY(;rT zEjUASp&BrwrO13rM$@m;@+5+CJ@wNaEh0*n(KW@4vxF10#BS0A?YN#2DXuq^Dcizk z*E|%f*I3m>g^>=aXf!KY)&4$HwlwRS_BM=TPzedGw0(!)ZUfv{+ zRV~0p&YeHPri*6Qv7r_$VXF%a%*_KV?u=|8K>~$Xj|Ejnrrgb39mx&6NOtYeBOVtz zMZ7(_gCQ`Xjof89QEGk;n*UDe2{KcFD!iqUt$<eDJD8 zqPDIgpK+uX-OuK-Xm6gqY2+AXb5)g%5dvFZ(L$a04iW|Ev<1R^n6}HK1})dmtX7Iz zv$6$cw?l+fSAdAaDS8!}0YOL`9unipFVdCA-5hjnpZl|*tC7Q^#`N4(UMq;&@0P&@ z`k-5~9tBm%&4_|a?DZQEdQ}V05GctJ+6tO8;*UdM5K<@2a~aBN1{0eSHdREQ%JSz# z1Hi0=VLbfwX6y28v13z!_)tzM@1B&-b&*@)n~QL176Et@5k&7;W zlmj6TA}^g}!>2vL#T*F}sq`V%fLLBp&z-4Yy6^9Z5R?f|iYs1krimSVSx8Kd5Et=G zlV(zLxlqHp^LH$-J9;x3cx^PVDteHDy1<0ja31i0UxY+%WDkFb;SyVDcce;F^;% zJ#)H~i#h)_3*r||a%s8t8gn}OQDm{xU1oW()uVcB!;3ic_v9Rr04so|t-MJzc zF5AMdiqKhO75K8wR)eX&4D?uhIv-c$3 zgG`wK*zGKEhGwGHBymi{Hm#XcmKh1ad7y;%e(pk^4$_*4Ca7cy9*)Wo*KLoG@D>X; zy)WZ4`HyiuH0)sAD;WTU)749t~$!CJ`*?w8gpl`Qf9d_OGOa_B5j5duxT}CnC2B@8KJ~n zXG(L8y~O~&0P`BWXTfl^sd=})IX>FJCiJe!c2A1IjfiwLW-ZFbNLIo~{5&)|B;9~a zt-`047_59oRgNII0IG6OR%n1ts>~RwMT-3e=YE>D3@|v9+)7WetJl)SY6L+qK}qJM zSfAjAZ=*$ma;_#ETS3boif=)?PnbVuSJ7J$PP2u!kSnza5CRw6U~EQ>X~uv9ROPsw zbO_OYW*BT$er!tqb@X_BqaqJ|kG~&xBPd z#G9|lgRv>;?tN2jUy@rkYV-|^uQgEpIuv0Xr_UWGaL zD94|fZvEqISb@K}4cfHrK-n9z8;0YfDpdk~@qMP>sUT zsPm;*&=TX>cbSaWDGiHRfITXSA&cT+ws&xyavt;0~ zhD5j57GfdLp%_&kMg6LOOMcG0UXi2&0HSLqrj#J~5K_ECOr}W6`_7(6`L%!FiqvQ} z`nvhW`@HvS;EospJ8c?`R?(@D!n|qv(j`nCu^+GY)WV!_ry-$msh%0*`VxRzo_9O9 zTif`GW7rfDyT&oZSjT5p++Geg+JP$G+sf>McnHBnpp$dDLWrqm=~%X~b6a!=VhISB zpL7DYen|}j%+W~#ZMk=NC(|A0c@z$2i!f!%?TM4_od+t-&WzIXsWS&oG>c3xc@OB2 z=)1N5OD1b$J2urDgH4870I22$Zn;-$P@w=+C8(j{yUdt6(aP?DRYyR+A5!+K;z3ko|)5_}M>7IM_0ew5czBp^7#`W4{QqqKskJFi~p z5hKKXF;jdWRK2XSIEaP)!fc9W4m0>@&8&PLHS66NmOor-Uj~bg6hzk8Evr`O91Q0r z3d%_U4i6%socQ#!*|jJhyvOQedRGg}aT3+)5)AK92tDfA-wnzh7$-B6Ag z>3xRW7VU=v5etq%TplGPAz>x=Rm{ac?u)p(nAf<7<)`>*P(imvgzn8}cwm6g3$n*S z%xAerfdxX0AW*`DjE@4^Z);;)5ECvoJ~5Pjr__xQ!Z2JW4easmg3r%lP76(7A(;$i z!2z!!q{0!pfH%h!isT$<1?T81T1y8b=!)8$Z60f?b-?&oXk(`#C746`bi>$WqrW<# zPqm;whF~Drz13Knd-Q|a{TXZfn++Hv`nc@4VRCEk2Noh=)QLp0DHFkzAedn35+hq! z=0M2G;8=5H(?oM?tubyNW^Ah{0M=accQ=xm6l2Uo95da)<|oR>ILPXj)GHb%WtwsY zK~GBotpKCZd4%|AD;1=XeTkYU5$@PbHMH@?4w^|3qT355VGm;U*>C>0cB4}c? z;PmXy1haFXr(M=8ddz;w*=~k8n4dG4#SpWrqC^6PZ#mW(z-T!*GzQg z6#6|j@5*Y8fxhNo-}nR{6d##KpL9lRx@8P9Q@OXmIXd7KgTkrG<;>#AHJ*Bi?fa&} z%rQyg8pRdimY(yp=a~SX3K}py(7&cPbb>Kbc-K-i@+RFTD;3$n4U~D*?a-!rb5sA8 zYNJsb-n6aWIQE!Lqs`&r#Y_5%-Z2k-w?cP;LWghmJSdWn*M@8T69-JtZPoe&UrTkM z`tvW3;cp}htVdz?u9W1{`PSkL*i^~aHf=$XD*OsV7y zQ0c<)stw3tf#9Ov&}@@RH1DU50^(8Op~UV z!H^JIxuia)h@G_dj=@7xFh-NpB|kClWSf9eXM3;t21ki5;S;uWDDg=V!QQiG#(D%IEifi zMy-P&VwoeH=V^%5RU!`+}F*0L}O)-(B<;!wD)++G(*LJ4Haw7R*A~PIIC_@_h9M6o?H( zj5LOOCXG}xTpv9Ku!PT~y=2|`4Qtn(y=>XCi_Q2#3LRgiE&{FdAY1M)~qxpM>f~Svc;z?CXk{BRo}>wCIIQK zfP!So*DX)|%u>Nb4a>n?$r>WF+L`e}2zR|XM7;JORxn)4D4a&$em|Y4BZuw~R+Uc5 z1}=nKwC(9uz_75NZq(;Ic?K&6$G2JNH7zN|)P8A9iFgTkjT(^_lxAIj?m=V(=@aA^y-N`(X0&*9 zn<1@R{L7olg|R9c+cLveZGo1&lYCo@)uOk*5ib6h}v&cJj{M`rVB zuXz+x!aVg&)+G6h=K-#`E;FNrlx!uOp}gP2gaK zHJ<|u4bdSAG^PXhE#1Hx8Us?^4X$B|GMJNLeF#3{=enjRNiCV;Aui3wLqix0M*w>& zQ{cPJD+-|0NL;{?0B~A&Ou!+syIWu`#uqdG%7q7gWM9}rOa6ehyeC(|{6!gT{WWPK z0^NB;ag^`o+vA%3TWb>tH_QEj{F0!d1Z@l>{o|GBrm!q2UK0dlO`+GYca547Bx)~X z-p{3U<-E|r>>g)ES1)(Z=&u#UWpWmV6Os&1a9uVnu%@iSOl;Z2H^PrqmEmBtBWmX0 z1|02_{Nhm+0)EZF*x0>^S9aZdVyr2EeIBERm{1v?sE!>t&E~x}N8x@y&4m(>l2%BtHF~IC>KBO;UbLg~}oGzlrbRw2dQKSkwB`b1*RRmQ7^x#?Y7E=m3w8>LcuGxb? z88UU{>@^pjx%O;*mZ4=0!2)?$xTHtec0&F3IL7;>a4x&KPCgaZEO(v3qxN#n*bhcP=be|lBqBdGb_Zv<(@2e zEnt)mh(&Ni(-bjtm+GLuk>+G$qB78|jW>EHD)o`k;o3-zBRuajAv&S&*&UkXJD}^0 zp{!GDeKGo$v1X$=Io{#Q819oxg`g{rTWl7QV4dtYtiq&? z+s#QGRuPXjq9f>m6 zT@yKPURoO)W6`9)IWk)3H=Tzn+xTs=@lh647=un2*1H1XVfy8@4jLe&k=$=HR2Nqc z(gda8Ulw>n-iOIjk7`kS2XBaaURZ8QB8Yj|G2x`DXkd$P@Pj#{fo531L7Pqor^fT! z7IWGMyFMRA9^kPUeDOYY)^6>YV`k?8KuJkoy+DPmxzQuA@S)^ z`yHL66C{Bzu$Tsm`k9qk?;8VhrHva$7Y`wZ()D{f;efJ;(?wmx1W`m$=D9xBNc5bC zQdI1hd$#uifYUfe%Q_nj&KXhiN1#tzbGjFwWvdp%9-bJe?x+mbS$wSU{5}kpz#O5` z4?c}=D#>@jf*y=V9INc4N)Uq`%p2{?u~XfkRh>A2Wce>c8RWCRUJ&KtCT`nKGmfVznUBpHdkrw)xqK{9Ln4tsk z@TQn^Fq4&Ys2wwy`^OLDmKaNVPh-rq0>Vb&S1ez;eED*z8VjVs%tl@IA0dluA<*7n zkbX6S#qz?=xBwB;g2K*tEdao}9K(#9bYjBtf9qM8ruDCXsIRJxyBFq!DnrN&arTw)HpG9SCHM*JZ, 2003. +# Ani Peter , 2006, 2007, 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.ml\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-20 20:08+0530\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' എലമെന്റിന് അപ്രതീക്ഷിതമായ സവിശേഷത '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "എലമെന്റ് '%s'-ന്റെ സവിശേഷതയായ '%s' കണ്ടുകിട്ടിയില്ല" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "അപ്രതീക്ഷിതമായ ടാഗ് '%s', ടാഗ് '%s' പ്രതീക്ഷിച്ചിരുന്നു" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s'-ന്റെ ഉളളില്‍ അപ്രതീക്ഷിതമായ ടാഗ് '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "ഡേറ്റാ ഡയറക്ടറികളില്‍ സാധുതയുളള ബുക്ക് മാര്‍ക്ക് കണ്ടുകിട്ടിയില്ല" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്ക് നിലവിലുണ്ട് " + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്ക് ലഭ്യമല്ല" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ MIME തരം വ്യക്തമാക്കിയിട്ടില്ല" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ സ്വകാര്യ ഫ്ളാഗ് വ്യക്തമാക്കിയിട്ടില്ല" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ ഗ്രൂപ്പുകളൊന്നും ക്രമീകരിച്ചിട്ടില്ല" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' എന്ന് പേരുളള ഒരു പ്രയോഗവും '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ രജിസ്ടര്‍ ചെയ്തിട്ടില്ല" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' എന്ന URI ഉളള '%s' എന്ന exec വരി വികസിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "അക്ഷരക്കൂട്ടം'%s'ല് നിന്നും '%s'ലേക്കുളള മാറ്റം പിന്തുണയ്ക്കുന്നില്ല" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'-ല്‍ നിന്നും '%s'-ലേക്ക് വേര്‍തിരിക്കുന്ന സംവിധാനം ലഭ്യമായില്ല" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "മാറ്റം വരുത്തുന്ന ഇന്‍പുട്ടില്‍ തെറ്റായ ബൈറ്റ് ക്രമം" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "മാറ്റം വരുത്തുന്നതില്‍ പരാജയം : %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "ഇന്‍പുട്ടിന്റെ അവസാനം ഭാഗികമായ അക്ഷര ക്രമം" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ഫോള്‍സെറ്റ് '%s'-ല്‍ നിന്നും കോഡ്സെറ്റ് '%s'-ലേക്ക് മാറ്റുവാന്‍ സാധ്യമല്ല" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI %s \"file\" സ്കീം ഉപയോഗിക്കുന്ന പൂര്‍ണ്ണമായ ഒരു URI അല്ല" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ലോക്കല്‍ ഫയല്‍ URI %s-ല്‍ '#' ഉല്‍പ്പെടുത്താന്‍ പാടില്ല" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' അസാധുവാണ്" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'-ന്റെ ഹോസ്റ്റ് നാമം അസാധുവാണ്" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'-ല്‍ അസാധുവായ എസ്കേപ്ഡ് അക്ഷരങ്ങള്‍ ഉണ്ട്" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' പാഥ് നാമം പൂര്‍ണ്ണമായ ഒരു പാഥ് അല്ല" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "സാധുതയില്ലാത്ത ഹോസ്റ്റ് നാമം" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "ഡയറക്ടറി '%s' തുറക്കുന്നതില്‍ പിശക്: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu ബൈറ്റ്സ് ഫയല്‍ \"%s\" വായിക്കുന്നതിനായി നീക്ക് വയ്ക്കുവാന്‍ സാധ്യമല്ല" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ഫയല്‍ \"%s\" വളരെ വലുതാണു്." + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ഫയല്‍ '%s'-ല്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയം: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "%s തുറക്കുന്നതില്‍‌ പരാജയം : %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "%s-ന്റെ വിശേഷതകള്‍ കണ്ടെത്തുന്നതില്‍ പരാജയം: fstat() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' തുറക്കുന്നതില്‍ പരാജയം: fdopen() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"ഫയല്‍ '%s'-ന്റെ പേര് '%s' ആയി മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: g_rename() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ഫയല്‍ '%s' സൃഷ്ടിക്കുന്നതില്‍ പരാജയം: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "എഴുതുന്നതിനായി '%s' തുറക്കുവാന്‍ പരാജയപ്പെട്ടു: fdopen() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fwrite() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fflush() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fsync() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ഫയല്‍ '%s' അടയ്ക്കുന്നതില്‍ പരാജയപ്പെട്ടു: fclose() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "നിലവിലുളള ഫയല്‍ '%s' നീക്കം ചെയ്യുവാന്‍ സാധ്യമല്ല: g_unlink() പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ടെംപ്ളേറ്റ് \"%s\" അസാധുവാണ്,ഇതില്‍ \"%s\" ഉണ്ടാകുവാന്‍ പാടില്ല" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ടെംപ്ളേറ്റ് \"%s\"-ല്‍ XXXXXX ലഭ്യമല്ല" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "സിബോളിക്ക് ലിങ്ക് '%s' വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "സിബോളിക്ക് ലിങ്ക് പിന്തുണയ്ക്കുന്നില്ല" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s'-ല്‍ നിന്നും '%s'-ലേക്ക് വേര്‍തിരിക്കുന്ന സംവിധാനം ലഭ്യമായില്ല: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string-ല്‍ റോ വായന സാധ്യമല്ല" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "റീഡ് ബഫറില്‍ ബാക്കിയുളള വേര്‍തിരിക്കാത്ത ഡേറ്റാ" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "ചാനല്‍ അവസാനിക്കുന്നത് ഭാഗികമായ അക്ഷരത്തില്‍ ആണ്" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end-ല്‍ റോ വായന സാധ്യമല്ല" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ഫയല്‍ '%s' തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: open() പരാജയപ്പെട്ടു: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ഫയല്‍ '%s' മാപ്പ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: mmap() പരാജയപ്പെട്ടു: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d-ആം വരിയില്‍ %d-ആം അക്ഷരത്തില്‍ പിശക്:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "പേരില്‍ സാധുതയില്ലാത്ത UTF-8 രഹസ്യ വാചകം - '%s' തെറ്റാകുന്നു" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "വരി %d-ല്‍ പിശക്: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു, ഇത് അക്ഷര റഫറന്‍സിനുളളില്‍ ഒരു അക്കം ആയിരിക്കണമാരുന്നു " +"(ê ഉദാഹരണത്തിന്) - ഒരു പക്ഷേ അക്കം വളരെ വലുതാവാം" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"അക്ഷരസൂചകം ഒരു അര്ദ്ധവിരാമത്തില് അവസാനിക്കുന്നില്ല. & എന്ന അക്ഷരം അറിയാതെ ഉള്‍ക്കൊളളാന്‍ " +"ഇടയായോ? & ഒരു സത്ത അല്ലെങ്കില് & എന്ന് പ്രത്യേകം സൂചിപ്പിക്കുക" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"അക്ഷരത്തിന്റെ സൂചനയായ '%-.*s' ഒരു അനുവദനീയമായ രഹസ്യ അക്ഷരത്തിലേക്കല്ല വേര്‍തിരിക്കുന്നത്" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"‌ശൂന്യമായ എന്റിന്റി '&;' കണ്ടു; അനുവദനീയമായവ ഇവയാണ്: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "എന്റിന്റി നാമം '%-.*s' അപരിചിതമാണ്" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"എന്റിന്റി ഒരു അര്ദ്ധവിരാമത്തില് അവസാനിക്കുന്നില്ല. & എന്ന അക്ഷരം അറിയാതെ ഉള്‍ക്കൊളളാന്‍ " +"ഇടയായോ? & ഒരു എന്റിന്റി അല്ലെങ്കില്‍ & എന്ന് പ്രത്യേകം സൂചിപ്പിക്കുക" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "രേഖ തുടങ്ങേണ്ടത് ഒരു എലമെന്റിലാണ് (ഉദാ )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' അക്ഷരത്തിന് പിന്നിലുളള '%s' ഒരു അസാധുവായ അക്ഷരമാണ്; ഇത് ഒരു എലമെന്റ് പേരില്‍ തുടങ്ങില്ല" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"ഓഡ് അക്ഷരം '%s', '%s' എന്ന ശൂന്യ-എലമെന്റ് റ്റാഗ് അവസാനിപ്പിക്കുന്നതിനായി '>' പ്രതീക്ഷിച്ചു" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ഓഡ് അക്ഷരം '%s', എലമെന്റ് '%s'-ന്റെ സവിശേഷത നാമം '%s'-ന് ശേഷം ഒരു '=' പ്രതീക്ഷിക്കുന്നു" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' ഒരു ഓഡ് അക്ഷരം ആണ്, ഇതിന് പകരം ഒരു '>' അല്ലെങ്കില്‍ '/' എന്ന അക്ഷരം അല്ലെങ്കില്‍ ഒരു " +"വിശേഷതായു് '%s' എന്ന എലമെന്റിന്റെ ‍റെ ആരംഭത്തിലുളള ടാഗ് അവസാനിപ്പിക്കുന്നതിന് പ്രതീക്ഷിച്ചത്; " +"ഒരു പക്വിശേഷതയുടെ്‍റെ പേരില്‍ നിങ്ങള്‍ തെറ്റായ അക്ഷരം ആവാം ഉപയോഗിച്ചത്" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"'%s' ഒരു ഓഡ് അക്ഷരം ആണ്, '%s' എന്ന എലമെന്റിന്റെ വിശേഷതയായ‌ '%s'ൂല്ല്യം നല്‍കുമ്പോള്‍ സമം‌ എന്ന " +"ചിഹ്നത്തിന് ശേഷം ഒരു തുറന്ന കോട്ട് ആണ് പ്റതീക്ഷിച്ചത്" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"എലമെന്റ് നാമം '%s'-ന് ശേഷം ഉളള '%s', ഒരു അസാധുവായ അക്ഷരമാണ്; '>' അക്ഷരമാണ് അനുവദിക്കുന്നത്" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "എലമെന്റ് '%s' അടച്ചിരിക്കുന്നു, ഒരു എലമെന്റുകളും നിലവില്‍ തുറന്നിട്ടില്ല" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "എലമെന്റ് '%s' അടച്ചിരിക്കുന്നു, പക്ഷേ നിലവില്‍ ലഭ്യമായ എലമെന്റ് '%s' ആണ്" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "രേഖ ശൂന്യമാണ് അല്ലെങ്കില്‍ അതില്‍ വയിറ്റ് സ്പെയിസ് മാത്രമേ ഉള്ളൂ" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ഒരു '<' ബ്രാക്കറ്റിന് ശേഷം രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചിരിക്കുന്നു " + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"എലമെന്റുകള്‍ തുറന്നു കിടക്കുമ്പോള്‍ തന്നെ രേഖ അപ്രതീക്ഷമായ അടഞ്ഞിരിക്കുന്നു - ഒടുവില്‍ തുറന്ന എലമെന്റ് " +"'%s' ആണ്" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"തന്നെ രേഖ അപ്രതീക്ഷമായ അടഞ്ഞിരിക്കുന്നു, ടാഗ് <%s/>-ന് അവസാനമായി ഒരു ക്ളോസ് ആങ്കില്‍ ബ്രാക്കറ്റ് " +"പ്രതീക്ഷിക്കുന്നു" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "ഒരു എലമെന്റിന്റെ നാമത്തിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ഒരു സവിശേഷത നാമത്തിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ഒരു എലമെന്റ്-ഓപ്പണിങ് ടാഗിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"സമം ചിഹ്നത്തിന് ശേഷം ഒരു വിശേഷതയുടെ പേര് ആയതിനാല്‍ അപ്റതീക്ഷിതമായി ഡോക്യുമെന്റ് അവസാനിച്ചു; " +"വിശേഷതയ്ക്കു് മൂല്ല്യം ലഭ്യമല്ല" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ഒരു സവിശേഷത നാമത്തിനുളളില്‍ വച്ച് രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "എലമെന്റ് '%s'-ന്റെ ക്ലോസ് ടാഗിനുള്ളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"ഒരു അഭിപ്രായം അല്ലെങ്കില്‍ ഒരു പ്രക്രിയ നടത്തുന്ന നിര്‍ദ്ദേശത്തിനുള്ളില്‍ രേഖ അപ്രതീക്ഷിതമായി " +"അവസാനിച്ചു" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "തകരാറുളള ഒബ്ജക്ട്" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "ആന്തരിക പിശക് അല്ലെങ്കില്‍ തകരാറുളള ഒബ്ജക്ട്" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ആവശ്യമായ മെമ്മറി ലഭ്യമല്ല" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ബാക്ക്ട്രാക്കിങ് പരിധി എത്തിയിരിക്കുന്നു" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "പാറ്‍ഷ്യല്‍ മാച്ചിങിന് പിന്തുണ ലഭ്യമല്ലാത്ത വസ്തുക്കള്‍ ഈ മാതൃകയിലുണ്ട്" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "ആന്തരിക പിശക്" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "പാറ്‍ഷ്യല്‍ മാച്ചിങിനുളള പിന്തുണ ലഭ്യമല്ലാത്തതിനാല്‍ ബാക്ക് റിഫറന്‍സുകള്‍" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "റിക്കേറ്‍ഷന്‍ പരിധി എത്തിയിരിക്കുന്നു" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ശൂന്യമായ സബ് സ്ട്രിങ്ങളുകള്‍ക്കുളള പണിയിടത്തിനുളള പരിധി എത്തിയിരിക്കുന്നു" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ന്യൂലൈന്‍ ഫ്ളാഗുകളുടെ അസാധുവായ കൂട്ടായ്മ" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "അപരിചിതമായ പിശക്" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "മാതൃകയുടെ അവസാനം \\" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "മാതൃകയുടെ അവസാനം \\c" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\-ന് ശേഷം അപരിചിതമായ അക്ഷരം" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "കെയിസ്-ചെഞ്ചിങ് എസ്കേപ്പുകള്‍ (\\l, \\L, \\u, \\U) ഇവിടെ അനുവദിക്കുന്നതല്ല" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} ക്വാണ്ടിഫയറില്‍ നമ്പറുകള്‍ ക്രമത്തിലല്ല" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} ക്വാണ്ടിഫയറില്‍ നമ്പര്‍ വളരെ വലുതാണു്" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "ക്യാരക്ടര്‍ ക്ലാസ്സിന് അവസാനമുള്ള ] ലഭ്യമല്ല" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ക്യാരക്ടര്‍ ക്ലാസ്സില്‍ തെറ്റായ എസ്കേപ്പ് സീക്വന്‍സ്" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "ക്യാരക്ടര്‍ ക്ലാസ്സില്‍ പരിധി പുറത്ത് കടക്കുന്നു" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ആവര്‍ത്തനത്തിന്റെ ആവശ്യകതയില്ല" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(?-ന് ശേഷം അപരിചിതമായ ക്യാരക്ടര്‍" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?<-ന് ശേഷം അപരിചിതമായ ക്യാരക്ടര്‍" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P-ന് ശേഷം അപരിചിതമായ ക്യാരക്ടര്‍" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named ക്ലാസ്സുകള്‍ക്കു് ഒരു ക്ലാസ്സില്‍ മാത്രമേ പിന്തുണ ലഭ്യമുള്ളൂ" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "അവസാനത്തിലുള്ള ) ലഭ്യമല്ല" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "( എന്നതില്ലാതെ )" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R അല്ലെങ്കില്‍ (?[+-]digits എന്നിവയ്ക്ക് ശേഷം ) ഉണ്ടായിരിക്കണം" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "നിലവിലില്ലാത്ത ഉപമാതൃകയ്ക്കുള്ള സൂചന" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "കമന്റിന് ശേഷം ) ലഭ്യമല്ല" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "റെഗുലര്‍ എക്സ്പ്രെഷന്‍ വളരെ വലുതാണു്" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "മെമ്മറി ലഭ്യമാക്കുന്നതില്‍ പരാജയം" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind അസേര്‍ഷന്റെ വ്യാപ്തി സ്ഥിരമല്ല" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?(-ന് ശേഷം തെറ്റായ അക്കം അല്ലെങ്കില്‍ പേര്" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "കണ്ടീഷനല്‍ ഗ്രൂപ്പില്‍ രണ്ടു് ബ്രാഞ്ചില്‍ കൂടുതലുണ്ടു്" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?(-നു് ശേഷം അസേര്‍ഷന്‍ പ്രതീക്ഷിക്കുന്നു" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "അപരിചിതമായ പോസിക്സ് ക്ലാസ്സ് നാമം" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX കോളേറ്റിങ് എലമെന്റുകള്‍ക്കുള്ള പിന്തുണ ലഭ്യമല്ല" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...}-ലുള്ള അക്ഷര മൂല്ല്യം വളരെ വലുതു്" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "തെറ്റായ അവസ്ഥ (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "റിക്കേര്‍സീവ് കോള്‍ ലൂപില്‍ അനിശ്ചിതമായി പ്രവര്‍ത്തിക്കുന്നു" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ഉപമാതൃകയുടെ പേരില്‍ ടെര്‍മിനേറ്റര്‍ ലഭ്യമല്ല" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "രണ്ടു് named ഉപമാതൃകകള്‍ക്കു് ഒരേ പേരു്" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "തെറ്റായ \\P അല്ലെങ്കില്‍ \\p ക്രമം" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "അപരിചിതമായ വിശേഷത നാമം \\P അല്ലെങ്കില്‍ \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ഉപമാതൃക നാമം വളരെ വലുതാണു് (കൂടിയതു് 32 അക്ഷരങ്ങള്‍)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "അവനധി named ഉപമാതൃകകള്‍ (കൂടിയാല്‍ 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "ഒക്ടല്‍ മൂല്ല്യം \\377-നേക്കാള്‍ വലുതാകുന്നു" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE ഗ്രൂപ്പില്‍ ഒന്നില്‍ കൂടുതല്‍ ബ്രാഞ്ചുകളുണ്ടു്" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "ഒരു DEFINE ഗ്രൂപ്പ്" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "സ്ഥിരതയില്ലാത്ത NEWLINE ഉപാധികള്‍" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g is not followed by a braced name or an optionally braced non-zero number" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "അപ്രതീക്ഷിതമായ ആവര്‍ത്തനം" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "കോഡ് ഓവര്‍ഫ്ലോ" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "മുമ്പു് പരിശോധിച്ചിട്ടുള്ള സൂചന ഉപമാതൃകകള്‍ ലഭ്യമല്ല" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "സാധാരണ എക്സ്പ്രെഷന്‍ ആയ %s-നൊപ്പം പൊരുത്തപ്പെടുത്തുമ്പോള്‍ പിശക്: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "UTF8 പിന്തുണ ഇല്ലാതെയാണ് PCRE ലൈബ്ററി സംഗ്റഹിച്ചിരിക്കുന്നത്" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "UTF8 ഗുണഗണങ്ങളുടെ പിന്തുണ ഇല്ലാതെയാണ് PCRE ലൈബ്ററി സംഗ്റഹിച്ചിരിക്കുന്നത്" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "സാധാരണ എക്സ്പ്രെഷന്‍ ആയ %s കംപൈല്‍ ചെയ്യുമ്പോള്‍ %d എന്ന അക്ഷരത്തില്‍ പിശക് : %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s എന്ന സാധാരണ എക്സ്പ്രെഷന്‍ കൈകാര്യം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "ഹെക്സാ ഡെസിമല്‍ അക്കം അല്ലെങ്കില്‍ '}' ആവശ്യമുണ്ട് " + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "ഹെക്സാ ഡെസിമല്‍ അക്കം ആവശ്യമുണ്ട്" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "സിംപോളിക് സൂചനയില്‍ '<' ലഭ്യമല്ല" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "പൂര്‍ണ്ണമാകാത്ത സിംപോളിക് സൂചനാ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "അക്കം ആവശ്യമുണ്ട്" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "തെറ്റായ സിംപോളിക് സൂചനാ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "അപരിചിതമായ എസ്കേപ്പ് സീക്വന്‍സ്" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "പകരമായുളള ടെക്സ്റ്റ് ആയ \"%s\" %lu-ല്‍ പാഴ്സ് ചെയ്യുന്നതിനിടയില്‍ പിശക്: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "എടുത്ത് കാണിക്കുന്ന ടെസ്റ്റിന്റെ ആരംഭത്തില്‍ കൊട്ടേഷന്‍ മാറ്‍ക്ക് ലഭ്യമല്ല" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "കമാന്‍ഡ് ലൈന്‍ അല്ലെങ്കില്‍ മറ്റ് ഷെല്‍-കോട്ടട് ടെക്സ്റ്റില്‍ ചേറ്‍ച്ചയില്ലാത്ത അടയാളം" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' അക്ഷരത്തിന് ശേഷം ഉടന്‍ തന്നെ വാചകം അവസാനിച്ചു. ('%s' ആയിരുന്നു വാചകം)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c-ന്റെ അവസാനം കോട്ട് ഇട്ടിട്ടില്ല. ('%s' ആണ് ടെക്സ്റ്റ്)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "വാചകം ശൂന്യമായിരുന്നു (അല്ലെങ്കില്‍ ഇതില്‍ വയിറ്റ് സ്പെയിസ് മാത്രമേ ഉളളൂ)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയുമായി ബന്ധപ്പെടുന്നതിനുളള പൈപ്പ് ഉണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ചൈള്‍ഡ് പൈപ്പില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "ഡയറക്ടറി '%s'-ലേക്ക് മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "അസാധുവായ പ്രോഗ്രാം നാമം: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d-ല്‍ ആര്‍ഗ്യുമെന്റ് വെക്റ്ററില്‍ അസാധുവായ സ്ട്രിങ്: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "എന്‍വിറോണ്‍മെന്റില്‍ അസാധുവായ സ്ട്രിങ്: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "പ്രവര്‍ത്തിക്കുന്ന ഡയറക്ടറി അസാധുവാണ്: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "സഹായത്തിനുളള പ്രോഗ്രാം പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും ഡേറ്റാ വായിക്കുമ്പോള്‍ g_io_channel_win32_poll()-ല്‍ " +"അപ്രതീക്ഷിതമായ പിശക് " + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"ചൈള്‍ഡ് പ്രക്രിയയില്‍ (%s) നിന്നും ഡേറ്റാ വായിക്കുമ്പോള്‍ select()-ല്‍ അപ്രതീക്ഷിതമായ പിശക് " + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()-ല്‍ അപ്രതീക്ഷിതമായ പിശക് (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ \"%s\" (%s) പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു " + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയുടെ ഔട്ട് പുട്ട് അല്ലെങ്കില്‍ ഇന്‍പുട്ട് തിരിച്ച് വിടുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ fork ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ \"%s\" പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ അപ്രതീക്ഷിതമായ പിശക്" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ചൈള്‍ഡ് pid പൈപ്പിന്‍ നിന്നും ആവശ്യത്തിനുളള ഡേറ്റാ വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 പരിധിയില്‍ നിന്നും പുറത്താണ് അക്ഷരം" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "ഇന്‍പുട്ട് വേര്‍തിരിക്കുന്നതില്‍ അസാധുവായ ക്രമം" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 പരിധിയില്‍ നിന്നും പുറത്താണ് അക്ഷരം" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ഉപയോഗിക്കേണ്ട വിധം:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "സഹായ ഉപാധികള്‍:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "സഹായ ഉപാധികള്‍ കാണിക്കുക" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "എല്ലാ സഹായ ഉപാധികളും കാണിക്കുക" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "പ്രയോഗത്തിനുളള ഉപാധികള്‍:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%s-ന് വേണ്ടി ഇന്റിജര്‍ മൂല്ല്യം '%s' പാഴ്സ് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s-ന് വേണ്ടിയുളള ഇന്റിജര്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്താണ്" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%s-ന് വേണ്ടി ഡബിള്‍ മൂല്ല്യം '%s' പാഴ്സ് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%s-ന് വേണ്ടിയുളള ഡബിള്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്താണ്" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s ഉപാധി പാഴ്സ് ചെയ്യുന്നതില്‍ പിശക്" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s-നുളള ആര്‍ഗ്യുമെന്റ് ലഭ്യമല്ല" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "അപരിചിതമായ ഉപാധി %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "തിരച്ചില്‍ നടത്തിയ ഡയറക്ടറികളില്‍ സാധുതയുളള കീ ഫയല്‍ ലഭ്യമല്ല" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ഒരു സാധാരണ ഫയല്‍ അല്ല" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ഫയല്‍ ശൂന്യമാണ്" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"കീ ഫയലില്‍ ഉളള '%s' എന്ന വരി ഒരു കീ-മൂല്ല്യം ജോടി അല്ലെങ്കില്‍ ഒരു ഗ്റൂപ്പോ അഭിപ്റായമോ അല്ല" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "അസാധുവായ ഗ്രൂപ്പ് നാമം: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "കീ ഫയല്‍ ആരംഭിക്കുന്നത് ഒരു ഗ്രൂപ്പിലല്ല" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "അസാധുവായ കീ നാമം: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "പിന്തുണയ്ക്കാത്ത രഹസ്യ ഭാഷ '%s' കീ ഫയല്‍ പിന്തുണയ്ക്കുന്നു" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "കീ ഫയലിന് '%s' എന്ന ഗ്രൂപ്പില്ല" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "കീ ഫയലിന് '%s' എന്ന കീയില്ല" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "UTF-8 അല്ലാത്ത '%s' മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s', '%s' എന്ന ഗ്രൂപ്പില്‍ കീ ഫയലിലുണ്ട്." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ഗ്രൂപ്പ് '%s'-ല്‍ കീ ഫയലിന് കീ '%s' ലഭ്യമല്ല" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "കീ ഫയലിന്റെ വരിയുടെ അവസാനം എസ്കെയിപ്പ് അക്ഷരം ലഭ്യമാണ്" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "കീ ഫയലില്‍ അസാധുവായ എസ്കെയിപ്പ് സീക്വന്‍സ് '%s' ലഭ്യമാണ്" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "മൂല്ല്യം '%s' ഒരു അക്കമായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ഇന്റിജര്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്ത്" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "മൂല്ല്യം '%s' ഒരു ഫ്ളോട്ട് അക്കമായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "മൂല്ല്യം '%s' ഒരു ബൂളിയനായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "വളരെ വലിയ കൌണ്ട് മൂല്ല്യം %s-നു് നല്‍കിയിരിക്കുന്നു" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "സ്ട്രീം നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "പ്രക്രിയ റദ്ദാക്കിയിരിക്കുന്നു" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "തെറ്റായ സോക്കറ്റ്, ആരംഭിച്ചിട്ടില്ല" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "മാറ്റം വരുത്തുന്ന ഇന്‍പുട്ടില്‍ തെറ്റായ ബൈറ്റ് ക്രമം" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "സോക്കറ്റ് വിലാസത്തിനു് ആവശ്യമുള്ള സ്ഥലം ലഭ്യമല്ല" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "റദ്ദാക്കുവാന്‍ സാധിക്കുന്ന ഇനീഷ്യലൈസേഷന്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "അപരിചിതമായ തരത്തിലുള്ളത്" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ഫയല്‍ രീതിയിലുള്ള" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s തരത്തിലുള്ള" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "end-of-stream അപ്രതീക്ഷിതമായി സമയത്തിനു് മുമ്പു്" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "പേരിടാത്ത" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "പണിയിട ഫയല്‍ Exec ഫീള്‍ഡ് വ്യക്തമാക്കിയിട്ടില്ല" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "പ്രയോഗത്തിനു് ആവശ്യമായ ടെര്‍മിനല്‍ ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ഉപയോക്താവിനു് പ്രയോഗത്തിനുള്ള ക്രമീകരണ ഫോള്‍ഡര്‍ %s ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ഉപയോക്താവിനുള്ള MIME ക്രമികരണ ഫയല്‍ %s ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ഉപയോക്താവിനുള്ള ഡസ്ക്ടോപ്പ് ഫയല്‍ %s ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "യഥേഷ്ടം %s നിഷ്കര്‍ഷിക്കുക" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ഡ്രൈവ് eject അനുവദിക്കുന്നതില്ല" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ഡ്രൈവില്‍ നിന്നും eject അല്ലെങ്കില്‍ eject_with_operation സാധ്യമല്ല" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ഡ്രൈവില്‍ മീഡിയ തെരഞ്ഞെടുക്കല്‍ സാധ്യമല്ല" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ഡ്രൈവര്‍ start അനുവദിക്കുന്നതില്ല" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ഡ്രൈവര്‍ stop അനുവദിക്കുന്നതില്ല" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem എന്‍കോഡിങിനുള്ള പതിപ്പു് %d കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem എന്‍കോഡിങിലുള്ള തെറ്റായ ടോക്കനുകളുടെ എണ്ണം (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon എന്‍കോഡിങിനുള്ള പതിപ്പു് %d കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon എന്‍കോഡിങിലുള്ള തെറ്റായ ടോക്കനുകളുടെ എണ്ണം (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-നു് ഒരു GEmblem പ്രതീക്ഷിച്ചു" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "പ്രക്രിയ പിന്തുണയ്ക്കുന്നില്ല" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "മൌണ്ട് ലഭ്യമല്ല" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ഡയറക്ടറിയില്‍ പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ഒരു ഡയറക്ടറിയില്‍ മറ്റൊരു ഡയറക്ടറി പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ നിലവിലുണ്ട്" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ആവര്‍ത്തിച്ച് ഡയറക്ടറി പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "സിബോളിക്ക് ലിങ്ക് പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ഫയല്‍ തുറക്കുന്നതില്‍ പിശക് : %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "പ്രത്യേക ഫയല്‍ പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "തെറ്റായ symlink മൂല്ല്യം" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ചവറ്റുകുട്ട പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ഫയലിന്റെ പേരില്‍ '%c' ഉണ്ടാകുവാന്‍ പാടില്ല" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "വോള്യം മൌണ്ടിനെ ലഭ്യമാക്കുന്നില്ല" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ഈ ഫയല്‍ കൈകാര്യം ചെയ്യുന്നതിനായി ഒരു പ്രയോഗവും രജിസ്ടര്‍ ചെയ്തിട്ടില്ല" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "എന്യൂമറേറ്റര്‍ അടച്ചിരിക്കുന്നു" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ഫയല്‍ എന്യൂമറേറ്റര്‍ നന്നായി പ്രവര്‍ത്തിക്കുന്നു" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ഫയല്‍ എന്യൂമറേറ്റര്‍ നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon എന്‍കോഡിങിനുള്ള പതിപ്പു് %d കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon-നില്‍ തെറ്റായ ഡേറ്റാ" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "സ്ട്രീം query_info പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "സ്ട്രീമില്‍ Seek പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ഇന്‍പുട്ട് സ്ട്രീമില്‍ Truncate അനുവദിക്കുന്നില്ല" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "സ്ട്രീമില്‍ Truncate അനുവദിക്കുന്നില്ല" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "തെറ്റായ ടോക്കന്റെ എണ്ണം (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "%s എന്ന ക്ലാസ് നാമത്തിനു് ഏതു് തരം എന്നു് ലഭ്യമല്ല" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s തരത്തിലുള്ളതു് GIcon ഇന്റര്‍ഫെയിസ് ലഭ്യമാക്കുന്നില്ല" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "%s തരത്തിലുള്ളതു് ക്ലാസ്സ് ചെയ്തിട്ടില്ല" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "തെറ്റായ പതിപ്പു്: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "GIcon ഇന്റര്‍ഫെയിസില്‍ %s തരത്തിലുള്ളവ from_tokens() ലഭ്യമാക്കുന്നില്ല" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ലഭ്യമാക്കിയ ചിഹ്നം എന്‍കോഡിങിന്റെ പതിപ്പ് കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ഇന്‍പുട്ട് സ്ട്രീം read ലഭ്യമാക്കുന്നില്ല" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "സ്ട്രീമില്‍ തെറ്റായ പ്രക്രിയ" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "സോക്കറ്റ് വിലാസത്തിനു് ആവശ്യമുള്ള സ്ഥലം ലഭ്യമല്ല" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "പിന്തുണയില്ലാത്ത സോക്കറ്റ് വിലാസം" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "സ്വതവേയുള്ള ലോക്കല്‍ ഡയറക്ടറി തരത്തിലുള്ള മോണിറ്റര്‍ ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "തെറ്റായ ഫയല്‍ നാമം %s " + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ഫയല്‍സിസ്റ്റം വിവരം ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "റൂട്ട് ഡയറക്ടറിയുടെ പേര് മാറ്റുവാന്‍ സാധ്യമല്ല" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ഫയലിന്റെ പേര് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ഫയലിന്റെ പേര് മാറ്റുവാന്‍ സാധ്യമല്ല, കാരണം ഈ പേര് നിലവിലുണ്ട്" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "തെറ്റായ ഫയല്‍നാമം" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ഫയല്‍ തുറക്കുന്നതില്‍ പിശക് : %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ഡയറക്ടറി തുറക്കുവാന്‍ സാധ്യമല്ല" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ഫയല്‍ നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ഫയല്‍ ചവറ്റുകുട്ടയിലേക്കു് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ചവറ്റുകുട്ടയ്ക്കുള്ള ഡയറക്ടറി %s ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ചവറ്റുകുട്ടയ്ക്കുള്ള ടോപ് ലവല്‍ ഡയറക്ടറി ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ചവറ്റുകുട്ടയ്ക്കുള്ള ഡയറക്ടറി ഉണ്ടാക്കുവാനോ ലഭ്യമാക്കുവാനോ സാധ്യമായില്ല" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "വിവരങ്ങള്‍ സംബന്ധിച്ചുള്ള ഫയല്‍ ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ഫയല്‍ ചവറ്റുകുട്ടയിലേക്ക് നീക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ഡയറക്ടറി ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "സിബോളിക്ക് ലിങ്ക് '%s' വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "സിംബോളിക് ലിങ്ക് ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ഫയല്‍ നീക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ഒരു ഡയറക്ടറിയില്‍ മറ്റൊരു ഡയറക്ടറി നീക്കുവാന്‍ സാധ്യമല്ല" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "ബാക്കപ്പ് ഫയല്‍ ഉണ്ടാക്കുന്നതില്‍ പരാജയം" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "മൌണ്ട് പോയിന്റുകളില്‍ തമ്മില്‍ നീക്കം ചെയ്യുന്നതില്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "ആട്രിബ്യൂട്ട് മൂല്ല്യം non-NULL ആയിരിക്കണം" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "തെറ്റായ ആട്രിബ്യൂട്ട് തരം (സ്ട്രിങ് പ്രതീക്ഷിച്ചു)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "തെറ്റായ എക്സ്റ്റെന്‍ഡട് ആട്രിബ്യൂട്ട് നാമം" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "എക്സ്റ്റെന്‍ഡട് ആട്രിബ്യൂട്ട് ആയ '%s' ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' എന്ന ഫയല്‍ സ്റ്റാറ്റ് ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (തെറ്റായ എന്‍കോഡിങ്)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ഫയല്‍ വിശദീകരണ സംവിധാനം ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "തെറ്റായ തരത്തിലുള്ള വിശേഷത (uint32 പ്രതീക്ഷിച്ച)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "തെറ്റായ തരത്തിലുള്ള വിശേഷത (uint64 പ്രതീക്ഷിച്ച)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "തെറ്റായ തരത്തിലുള്ള വിശേഷത (ബൈറ്റ് സ്ട്രിങ് പ്രതീക്ഷിച്ച)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "സിംലിങ്കുകള്‍ക്കുള്ള അനുമതികള്‍ സജ്ജമാക്കുവാന്‍ സാധ്യമല്ല" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "അനുവാദങ്ങള്‍ ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "ഉടമസ്ഥനെ ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "സിംലിങ്ക് non-NULL ആയിരിക്കണം" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "സിംലിങ്ക് ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink സജ്ജീകരണത്തില്‍ പിശക്: ഫയല്‍ ഒരു symlink അല്ല" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "മാറ്റങ്ങള്‍ അല്ലെങ്കില്‍ ആക്സസ് സമയം സജ്ജമാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux കോണ്‍ടെക്സ്റ്റ് non-NULL ആയിരിക്കണം" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux കോണ്‍ടെക്സ്റ്റ് സജ്ജാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ഈ സിസ്റ്റത്തില്‍ സജ്ജമല്ല" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s ആട്രിബ്യൂട്ട് ക്രമികരണം പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ഫയലില്‍ നിന്നും വായിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ഫയലില്‍ തിരയുന്നതില്‍ പിശക് : %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ഫയല്‍ അടയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "സ്വതവേയുള്ള ലോക്കല്‍ ഫയല്‍ മോണിറ്റര്‍ തരത്തിലുള്ളതു് ലഭ്യമാക്കുവാന്‍ സാധിച്ചില്ല" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ഫയലിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "പഴയ ബാക്കപ്പിലേക്കുള്ള ലിങ്ക് നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ബാക്കപ്പ് പകര്‍പ്പ് ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "താല്‍ക്കാലിക ഫയലിന്റെ പേര് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ഫയല്‍ ട്രങ്‌കേറ്റ് ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ഫയല്‍ തുറക്കുന്നതില്‍ പിശക്: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ ഒരു ഡയറക്ടറി ആകുന്നു" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ ഒരു സാധാരണ ഫയല്‍ അല്ല" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ഫയല്‍ പുറമേ നിന്നും മാറ്റം വരുത്തിയിരിക്കുന്നു" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "പഴയ ഫയല്‍ നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "തെറ്റായ GSeekType നല്‍കിയിരിക്കുന്നു" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "തെറ്റായ seek ആവശ്യപ്പെട്ടിരിക്കുന്നു" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ട്രങ്‌കേറ്റ് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "മെമ്മറി ഔട്ട്പുട്ട് സ്ട്രീമിന്റെ വ്യാപ്തി മാറ്റുവാന്‍ സാധ്യമല്ല" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "മെമ്മറി ഔട്ട്പുട്ട് സ്ട്രീമിന്റെ വ്യാപ്തി മാറ്റുന്നതില്‍ പരാജയം" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount unmount അനുവദിക്കുന്നില്ല" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount eject അനുവദിക്കുന്നില്ല" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount അല്ലെങ്കില്‍ unmount_with_operation, mount അനുവദിക്കുന്നില്ല" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "eject അല്ലെങ്കില്‍ eject_with_operation, mount അനുവദിക്കുന്നില്ല" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount remount അനുവദിക്കുന്നില്ല" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount doesn't implement content type guessing" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ഹോസ്റ്റ്നെയിം '%s'-ല്‍ '[' but not ']' അടങ്ങുന്നു" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "ഔട്ട്പുട്ട് സ്ട്രീം റൈറ്റ് ലഭ്യമാക്കുന്നില്ല" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "സോഴ്സ് സ്ട്രീം നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s'പരിഹരിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "റിവേഴ്സ്-റിസോള്‍വിങ് '%s'-ല്‍ പിശക്: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'-നു് സര്‍വീസ് റിക്കോര്‍ഡ് ലഭ്യമല്ല" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' പരിഹരിക്കുന്നതിനു് താല്‍ക്കാലം സാധ്യമല്ല" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' പരിഹരിക്കുന്നതില്‍ പിശക്" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "തെറ്റായ സോക്കറ്റ്, ആരംഭിച്ചിട്ടില്ല" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "തെറ്റായ സോക്കറ്റ്, ആരംഭിക്കാത്തിതിനുള്ള കാരണം: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "സോക്കറ്റ് നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd-ല്‍ നിന്നും GSocket ഉണ്ടാക്കുന്നു: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "സോക്കറ്റ് ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "അപരിചിതമായ കീഴ്വഴക്കം നല്‍കിയിരിക്കുന്നു" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ലോക്കല്‍ വിലാസം ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "റിമോട്ട് വിലാസം ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ശ്രദ്ധിക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "വിലാസത്തിലേക്ക് ബൈന്‍ഡ് ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "കണക്ഷന്‍ സ്വീകരിക്കുന്നതില്‍ പിശക് : %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "കണക്ട് ചെയ്യുന്നതില്‍ പിശക്: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "കണക്ഷന്‍ പുരോഗതിയില്‍" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "കണക്ട് ചെയ്യുന്നതില്‍ പിശക് : %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ബാക്കിയുള്ള പിശക് ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "ഡേറ്റാ ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "ഡേറ്റാ അയയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "സോക്കറ്റ് അടയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "സോക്കറ്റ് അവസ്ഥയ്ക്കായി കാത്തിരിക്കുന്നു: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "സന്ദേശം അയയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage വിന്‍ഡോസില്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "സന്ദേശം ലഭിക്കുന്നതില്‍ പിശക്: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "കണക്ട് ചെയ്യുമ്പോള്‍ അപരിചിതമായ പിശക്" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "ലിസണര്‍ അടച്ചിരിക്കുന്നു" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "ചേര്‍ത്തിരിക്കുന്ന സോക്കറ്റ് അടച്ചിരിക്കുന്നു" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon എന്‍കോഡിങിനുള്ള %d പതിപ്പു് കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 നിയന്ത്രണ സന്ദേശം പ്രതീക്ഷിക്കുന്നു, %d ലഭിച്ചിരിക്കുന്നു" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "അപ്രതീക്ഷിതമായ രീതിയിലുള്ള ആന്‍സിലിയറി ഡേറ്റാ" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ഒരു fd പ്രതീക്ഷിക്കുന്നു, പക്ഷേ %d ലഭിച്ചിരിക്കുന്നു\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "തെറ്റായ fd ലഭിച്ചിരിക്കുന്നു" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "യൂണിക്സില്‍ നിന്നും ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "യൂണിക്സ് അടയ്ക്കുന്നതില്‍ പിശക്: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ഫയല്‍സിസ്റ്റം റൂട്ട്" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "യൂണിക്സിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ഈ സിസ്റ്റമില്‍ അബ്സ്ട്രാക്ട് യൂണിക്സ് ഡൊമെയിന്‍ സോക്കറ്റ് വിലാസങ്ങള്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "വോള്യം പുറത്തിറക്കല്‍ അനുവദിക്കുന്നില്ല" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "വോള്യം പുറത്തിറക്കല്‍ eject അല്ലെങ്കില്‍ eject_with_operation അനുവദിക്കുന്നില്ല" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "പ്രയോഗം ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "പ്രയോഗം ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "യുആര്‍ഐ പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32-ല്‍ അസോസിയേഷന്‍ സൃഷ്ടി പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32-ല്‍ അസോസിയേഷന്‍ സൃഷ്ടി പിന്തുണയ്ക്കുന്നില്ല" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "ആവശ്യമായ മെമ്മറി ലഭ്യമല്ല" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "ആന്തരിക പിശക്" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "സാധുതയില്ലാത്ത ഹോസ്റ്റ് നാമം" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "ഇന്‍പുട്ട് വേര്‍തിരിക്കുന്നതില്‍ അസാധുവായ ക്രമം" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ഏറ്റവും കൂടുതലായ ഡേറ്റാ അറേ പരിധി എത്തിയിരിക്കുന്നു" + +#~ msgid "do not hide entries" +#~ msgstr "എന്‍ട്രികള്‍ അദൃശ്യമാക്കരുതു്" + +#~ msgid "use a long listing format" +#~ msgstr "ലോങ് ലിസ്റ്റിങ് ഫോര്‍മാറ്റ് ഉപയോഗിക്കുക" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/mn.gmo b/po/mn.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6e49813635128369738a17a85ccc780e5324af22 GIT binary patch literal 17308 zcmds-eT*FCeaD9+CB=Cq33-1R4Ck{G@A_;5aqf(RF$P>-?7*2M1>(%@&fRUiw{z?Z z#*Lc#1p**Es6-nHpFnYqqtJkC~7o|)u>IYM2%9ZYW``}N=f@i+t2s+ z%*@X0?cJF`rK)Sses^}B=lA^Hf4}G1`|(>|^N7bQBEFM#!PdE@oauY2An z!H2eqSR z82A`i27e5G5PZYy-8vhFjo&7Suj@XtWW`4^xM{!Q}ze}Kc>UvR$X zy&t?B6usL($^9sJG5B5Zt>DkW3&H;eKLTF(7N_r9!4mg(f%k)d3a$XxGU-F$C&2aK z-QY#waZq&r9@IMj1#SRW!X%=5L4pw|I=>BS+~XiDdp`ih*H6H;;A<{$dcO=D=RO3b z?-#(!!E@g3dDnv<1;x(;pw>SQegOOtDE|Kw6y25Y-~w*|5yiU`)ch}ihru6$zXjg= zPG{#=z02971hS-eJBW(B7ASwb2OI$(1I5=FP-%;Ck?1K*@VCN?QvC zApgBD@%Ab3G${TrT;s;qK>5!ff}8XltbpfWe9;TR-vECf{66?IQ1&?tary1PgW`W1 z&TupM6YvUfJ(D%A4ekPugBO7Byu{h13~uFq6R78RgW}_7;C0}6m%2Q%6TFH0r@+sF zGSaQU?|{3f4H#GJ&w=vGHxZn&=at}%;9l?s@Grruz_)+I#nG+cBiw%${Ny?K z%P6+te)pK??EtStnVSD45R-a81#vO&Jc1Nb-YQV~nE>wsp91A4D^RB7x)0n2{uB5f zaNS4U_cwy5#QP>FetrtVf;W5xz6l24{opS_Sn&>SW)1M$Ag<{xzY?Cnt>F3K--43w z=in{iM^OIjz=uG@vKOIgwoPt5Km7o{i|gv#{RE#WIo@lyB>x+^P>uNxV7{bv(pQxa zT3c}Fd#NBMx{(Mx)l&OV_V zUbwvFI@uj}w7id-davSA?$PVLT+;7bxGvx#ysY+O7V{(NP%pyRUb5B4xdN`sxMaih zwTut)HN8H-h09sa)4hD=&0M&vz23k(E@Qd*ZQ!qQUCX7{Z*slfKH-m`;`vstPjj8i zrPp~5yw@hUGr`-z_i-tP^xDjIF_&WJA}-v}Uhm+&%=LaQT)|$rh<62-{C1q{LtNhQ zP;1z)wfsiZ_5=UUpkAx`mFb`vRN7(FpN#7DXiu#%#k1j!!@VbCey#1#1bc1XL^xGz z_(8)D>)}k;X#0&|COm7(?dh;bx5YARhR1wk>lLJ5k6K}YJzHVS*W!U>4D({6kKs+j z-saiadaV+)Yf;1BJ}YRAdRv0VaNDm&XrvkJ@ta{#^^tyRS1sCw;u?*xzDr;3s@EFf zu2#E=_RfA%JK7aCsv0kYRHDY6VYBT|!s0|w+3nQQj(AWFTVdPoy)AB4AA`-*8bLd3 ziJ`!s4Vvv*Q12;MBNM|$owgrMB0*y+#L7*7=lIp7wU;e5Vnc2~Gn@>YVWSelMXCHj z+^8C{wD{&*7!(U)sol;icOZo-UgsuO{XMnzG*esQOsx{tqsEv&6SdlYy|z27@Adaa z9lz6pAnq2-K))3<@}|>l30G^hQKUQ}7sC_R1#AGH02r)kA;z zP-}T^cr+U}Qfn*hw6HCaEahDlRXP@02!-&SMtIk3NQhQZNieBUl_!UHbb@-zZ`Gz? zz8AV^s*N8`bl^v!IfkxtUlH`3aM2ZNjaJRP;g$nJ8si!Df8gZ;3y=@$7t=ZJ0J0s1wTH#_mvyZl|!vnUTz$ONM;L?agS$fq<9rKrL9iGN;!+0^Hqql zYMR9Q$%l7^6(!5!Am!|{8`;M#EbQ)|Xx|m-_syCjS7fo@Qnk*BJ4s1vuUtiEAk~?M zd)hH4&ke?C3qPE!YWPB==pksFk^;Y4L06gfTU1z-HyzwbR>SAX2G!aW4PlzJaz(S( zC9GU=(Yp1QjJa%j7qzw?uA&lC!l#2-mzEMLs+AErsyP+r7`NhC4cb9kmvaU@%VGUS zFp^;->P$`h^C;7jm;?2h#pWcPfpH)wTX4)mRxm2c#I3zE6A@jeqRI7lea38tE);ya znpt&iP1I~3Cj0!;F=53cNt@oaVSTpOx^ANIFb+7@!! z9UW`(XenJgYORs6kd2(CL9?Deox13(>%zUxm6MDPv#uK>`jhrFP!CC>pR^?7&7VsdaZKYTY!>Jh5*rxZ-;63Dsa4tJ!8qn^hjbLq_zK zBBRDPXB$U0*_)|9-!Om)OTs2vVR+!fUC9xf4QkERPVCjLkXjQrfLN!I^|G#qSFSFq zH0$v#`g^+UQ7eu}m9*6JqGbk*c0Ign9Go!T_2FbYVuM6G>|9eD4U1#UY!NomnPijV z-DsQJW;oR$shID1+pGCqgJjG#Ic#<>A5NRNLhJ1O2ER=E0@Kb?#5N5}@55_y8)(%y zxwz#3+n%Un>LYCCifre}hJsE%*Ex@6nKQp7O5>szO4 zSF*~2%`ywI_RgEOIr*{_oCu1Oxs;lVj#hCB2`L#o?|W%S&Nk7C>gu1gOvko}a`WXX zhRgj{WtvkWo14}R`MpMDZ1t_7y>#8xjBH4HI8K)sh4qr5ERA+-CcPu?s|RXDgTrN4;BgXps2Opn~b+*n!W6t{w)B@>vdVbY>>PX4$)S z`;PH#+ixtF%eQ+wn$c%aVrg5obPK0FwhNi6*Cxu>Zryyqw$>712EEuNzrAQW{xbT6dYhcJ1gT8%iUWjEpd_bW?a|O=Poi zBbS!=zkb9YSvxxN;nK(k#$C^bxirpkS&Q5dHAnsU;rMWTth7lJPc+={Trgj6n!4ivC)kxwG(PAeMP<2YPZU*$#NrXZ(4T4wi~wg zgk4)6S+<3}FFVT8_}*DWQRY}flB%)WRHEl#>T>H3dgDZ!%2(Q|lQ{fi)ZZ{sYcKmm z=^FO>O((*2R|XSd-G_d8-Lf6^4ic2Ej+!$ql*Py$5uIndl**A4q4$sjuSUDMmuK5= zyk`6L+cx(e-5hnAm2it=Z`AL!CrcZad8g-wTBpC^$0xfF_^0PKp8iIud!TzLK7lF^ z#Yejb;^Xo2@ku{E+}+pxA|JZ|=`LAWA|If>$9 zKI<`4D~}<6ri+)w`O9Y<9USJLl+rzjk`vAr;i^xnXPEtbd{k5t#Y((Q^OTXZr)lYV zFa9GGathNcl1_|zHwAl2*1GklV||%FQ_l>Dy`OU?Tw=02TOTwpmG__&fwSD3Y9M|A z-j10A;wnTs4-a+^BF32~Wk}u=_Yqm?;ADK*i@%N*k8pbwUjUd^aB?}0obkY!ClP#q zJa^{FGf#T%1YX|tVEiqoOH<0>?tb5HkBNBqo<3qWZ^KKUhRiy(A7mm)YT>N&||n(7W434Sh4$go;uY@IZ_}OcF8oB zTfaw@T=1CO?}QZ3b&M>+&9~!cG1`7UpM;e!LYR-wU=T|$N!|3vscb zr;Jfrf+c06{rn^76M3*l$t`R@A7CjST6Q^(+bA`?`1FfUdvQ@>lNY5p6{X&0+S{Mq z?bA%wbgrfw$Bb{uQeJ=D)QdMI#^@=-)9()M7Ey88ME2Cv??%w)At!zC@MQPC_&8!7 zllq%cS*%~m_q|i;Ap-nHf^A$f@Cfk*#u{?v)7^b+$ZPt^y+j z9+C->h1dX976t6NOIlTwwfh(nGg!qU>=0$1A;gbTxrGhQmE(dDBq5qJzvNso3A&ss z=2G#XWft(cT>QM!US1HaXk<$e$DD{_jDIgRs>t!FE%qmgSWT(5s{L9mE^eJ^pBP40k;V(5w_w$ldqRH!&ET317J(?Av zTzN~aQAjeW|GJ(7D(clG6Q+V9ot(H}3GuQovuKfq#4kA0udr(TwZ5fN?SM{w=vL9-O zs&t%5XH0|H|2XkeETqEEJMF#opyp+^8J#yLew@K{5UGQfY)0CpEx}K+pw5c?{HneM z-y9~*I`X9dN<%4W39Vmcu#%Jw1(R0I1dg9j0`%i=6IQ1P*=I=sSrX8y=qcSlsGPCE z_Ph7N{ZXVkk*7Yes~ku^(*(&6Dr$V^vgTBYkf1#XKekVB=VXKF^d_5!Yfs>g73^#+ z{yNW%hP|r{o+V+cW~OsAw-^ntPus2x_P1u1Q>D6nrc8B{xt)|_dDKsT1J3hkChA)w z%`vj3a<`MXm)3r@Ioa>VgO(q-vs5~9{Y2XKnVhGRT-R4ml3$CpF^P|^@>jcx;5v0` z$b;xa9!2_d1@dI(+C8hXGs|{^iP&~{LoPGbD!&;ICmf`#DDAQ>>K^pY{CRv-4U+b} z+Q*Y&=Q+QUFXbc)P>UK^%QiRzBSu}mxvHvoVU1)vrbW%0&OT0@Hx(n(?Ix1=qZZnj zUO>X94j7#8s;_`+sg-=Mw!@mlf!w`BuG|7y9!Qo=b*2!0hT^3ngI#sf$MV{GAL@^o zzL_o^+E!{Q*WQnZoN$M4e0m|DsC3Yg@{;L&$*czzIkbr;t&xFDbA=8E*HAu0G}~*d zij#%=a+a6nd<*!bQ}W`+a6)$k!ghbuv!A3)QFe;Sk-l~4_%!ED-3Js3gHDg2DZU;0Knq_MLj<)h+02fow1R~IawKP=N?*w_g*)RQrLjR> zP$Gz(6Wtr^1oVq`796UTnHfPXo9#&eQ-dL?Qh#xY*e^oh_^i%g4b0(u(` zM;V{B)0xDp6Q&%4c=Mng$D+E^j~4^aS(SP{-hG2~q|ug;>nupvxRM-uS}Q#hZ@rL<&VFEc{# zaviUeBrLWD@4;UdSE*W6Qmhu4f4gI^-Z_CW3Ew)(J%%SOC_*7pdOPRjmz-V{ot~Tj zJJ;fJa+dlimckR!Phvy*i^Z5BrgUOY3t*%d`4y1o<}gyQ5@%B8me6eW0~|BvpHwbp z?_9lA@7CSVJ5H4*T=TA%bTF;fSL#-;n{^63x3QlSvXt?)TtgvOb}VEiO@yRprPG3& z&+|{DCOdfX6TOxBf|8jXCMuku!ZGd(s^0}B8Cnc%XI757sQz|3pKD#*%zdaxKFE&E ziwmvIfahO_-$lALJMA5ibF+3)9nul#7JHE_$V+Z3nWlPeB6D739tw|{g!L$C(k^I1``|E4}Cgi=@Cx-%<`DE`zJYE$v?ks!5_)9KImnw zkn*eSnC892MAP2g{}zxJHhBn_^+sXYf#^7Lh@ zK%G6NogarCNTt67u#Q;WQkomsRGI4>{Q*3F;d^N@Gk6NQlae-^hB=43}V_1N?DGdSZIf84!OWq z&XrN*)6b?0{}og(Gw3);dqs|P^of+@k~&}LK$6_Rj|KLNjV3lhV;A-sw&$$@1RZ8a{Zf`vgexH aR0+8~u;Y=*?i9uvwYi literal 0 HcmV?d00001 diff --git a/po/mn.po b/po/mn.po new file mode 100644 index 0000000..8bca192 --- /dev/null +++ b/po/mn.po @@ -0,0 +1,2159 @@ +# translation of glib.HEAD.po to Mongolian +# translation of glib.HEAD.mn.po to Mongolian +# translation of glib.HEAD.po to mongolian +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Sanlig Badral , 2003. +# Sanlig Badral , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-05-30 01:07-0800\n" +"Last-Translator: Бадрал \n" +"Language-Team: Mongolian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.0.2\n" +"Plural-Forms: 2\n" +"X-Poedit-Language: Mongolian\n" +"X-Poedit-Country: MONGOLIA\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн »%s« аттрибутын нэрийн дараа »=« хүлээгдэж " +"байна" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Өгөгдлийн лавлахаас хүчинтэй утга олдсонгүй" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "»%s« символик холбоос уншигдсангүй: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Тэмдэгт олонлог »%s« ээс »%s« рүү хөрвүүлэх дэмжигдээгүй байна" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "»%s« ээс »%s« рүү хөрвүүлэгч нээгдсэнгүй" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Оролтын төгсгөлд хагас тэмдэгтийн дараалал" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "»%s« ухарч »%s« кодчилол руу хөрвөхгүй байна" + +# CHECK +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI »%s« нь файл схемд хэрэглэгддэг үнэмлэхүй хаяг биш" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Дотоод URI »%s« нь »#« -г агуулж болохгүй" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "»%s« URI хүчингүй" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI »%s« -н хостын нэр хүчингүй" + +# CHECK +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "»%s« URI хүчингүй Escape-тэмдэгт агуулж байна" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "»%s« замын нэр үнэмлэхүй зам биш" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Хүчингүй хостын нэр" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu байтуудыг »%s« файлыг уншихдаа байрлуулж чадсангүй" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "»%s« файлаас уншиж болохгүй байна: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "»%s« файл нээгдэхгүй байна: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "»%s« файлын аттрибут тодорхойлогдсонгүй: fstat() нурлаа: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "»%s« хэв хүчингүй, »%s« -г агуулах хэрэггүй" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "»%s« хэв XXXXXX -р төгсөхгүй байна" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "»%s« символик холбоос уншигдсангүй: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "»%s« -ээс »%s« рүү хөрвүүлэгч нээгдсэнгүй: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Raw-read in g_io_channel_read_line_string боломжгүй" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Унших буфэрт хөрвүүлээгүй файл байна" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Суваг тал тэмдэгтээр төгслөө" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Raw-read in g_io_channel_read_to_end боломжгүй" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d мөрөнд %d тэмдэгт алдаатай байна: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Хүчингүй UTF-8-р кодлогдсон текст" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d мөрөнд алдаа: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"»%-.*s« тэмдэгтийн дотор тоо байх ёстой (ê шиг) , задлан ялгалд " +"танигдсангүй - магадгүй хэтэрхий том тоо байна уу" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Тэмдэгт холбоос цэг таслалаар төгсөөгүй байна; Та магад амперсандыг абтын " +"эхлэл бусаар хэрэглэхийг хүссэн байх - Та & гэж бичнэ Ò¯Ò¯" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "»%-.*s« тэмдэгт холбоос зөвшөөрөгдөөгүй тэмдэгтээр кодлогдсон байна" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Хоосон абт »&;« олдлоо; хүчинтэй абтууд & " < > ' юм. " +"(абт=аский биш тэмдэгт)" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Абтын нэр »%s« тодорхойгүй" + +# CHECK +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Абт цэг таслалаар төгсөөгүй байна; Та магад амперсандыг абтын эхлэл бусаар " +"хэрэглэхийг хүссэн байх - Та & гэж бичнэ Ò¯Ò¯" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Баримт ямар нэгэн элементээр эхлэх ёстой (Ж.нь )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"»%s« нь »<«-тэмдэгтийн арын хүчингүй тэмдэгт; Энэ нь элементийн нэрээр эхэлж " +"болохгүй." + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн эхлэлийн тагийг хаахад »>« тэмдэгт дутуу " +"байна" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн »%s« аттрибутын нэрийн дараа »=« хүлээгдэж " +"байна" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн эхлэлийн тагийг хаахын тулд аттрибутын нэр " +"эсвэл харин »>« эсвэл »/« тэмдэгт хүлээгдэж байна; Магадгүй та аттрибутын " +"нэрэндээ хүчингүй тэмдэгт хэрэглэжээ" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Сонин тэмдэгт »%s«; »%s« элементийн »%s« аттрибутын хувьд өгсөн утга тэнцүүгийн " +"тэмдэгийн дараах хашилтыг хүлээж байна" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"»%s« хүчингүй тэмдэгт, хэрвээ энэ нь хааж буй »%s« элементийн нэрийн ард " +"байгаа бол; »>« тэмдэгт хүчинтэй" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "»%s« элемент хаагдсан, Одоогоор ямарч элемент нээлттэй бус байна" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "»%s« элемент хаагдсан, харин одоогоор »%s« элемент нээлттэй байна" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Баримт хоосон эсвэл зүгээр цагаан зай агуулж байна" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Баримт нээлттэй өнцөгтэй хаалт »<« -н дараа гэнэт төгсөв" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Баримт нээлттэй элементүүдтэйгээр гэнэтийн байдлаар төгсөв - »%s« сүүлчийн " +"нээлттэй элемент нь" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Баримт гэнэтийн байдлаар төгсөв, таг <%s/> -г хаах өнцөгтэй хаалт " +"»>«хүлээгдэж байна" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Баримт нэгэн элементийн нэрийн дотор гэнэтийн байдлаар төгсөв" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Баримт нэгэн аттрибут нэрийн дотор гэнэтийн байдлаар төгсөв" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Баримт нээгдэж буй тагийн нэгэн элементийн нэрийн дотор гэнэтийн байдлаар " +"төгсөв." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Баримт аттрибут нэрийн дараах тэнцүүгийн тэмдэгийн дараа гэнэтийн байдлаар " +"төгсөв; аттрибутын утга алга" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Баримт нэгэн аттрибутын утгын дотор гэнэтийн байдлаар төгсөв" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Баримт гэнэтийн байдлаар нэгэн хаагдаж буй »%s« элементийн тагийн дотор төгсөв" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Баримт тайлбар эсвэл заавар боловсруулалтын дотор гэнэтийн байдлаар төгсөв" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Суваг тал тэмдэгтээр төгслөө" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%d мөрөнд %d тэмдэгт алдаатай байна: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Төгсгөлгүй абт холбоос" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Хашилтан доторхи текст хашилтаар эхлэхгүй" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Тушаалын мөр дэх эсвэл өөр shell-quoted текст доторхи хашилтын тоо " +"балансжаагүй байна" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текст »\\«-тэмдэгтийн дараа төгслөө. (Текст »%s« байсан)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Текст %c -н тохирох хашилт олдохоос өмнө төгслөө. (Текст »%s« байсан)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текст хоосон байв (эсвэл зөвхөн цагаан зай агуулсан)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Өгөгдөл хүү процессоор уншигдсангүй" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процесстой (%s) холбогдох шугам үүсгэж чадсангүй" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ð¥Ò¯Ò¯ процессын (%s) шугамаас унших бүтэлгүйтлээ" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "»%s« (%s) лавлах солигдсонгүй" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процесс ажилласангүй (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Хүчингүй хостын нэр" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Тусламж программ ажиллахгүй байна" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ð¥Ò¯Ò¯ процессоос өгөгдөл уншиж байхад g_io_channel_win32_poll() дотор " +"санамсаргүй алдаа гарлаа" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процессын (%s) өгөгдөл уншигдсаж чадсангүй" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ð¥Ò¯Ò¯ процессоос (%s) өгөгдөл уншиж байхад select() дотор санамсаргүй алдаа " +"гарлаа" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Санамсаргүй алдаа waitpid() дотор (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Салаалалт нурлаа (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ð¥Ò¯Ò¯ процесс »%s« -г ажиллуулах нурлаа (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процессийн (%s) гаралт эсвэл оролтыг солих нурлаа" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процессын (%s) салаалалт нурлаа" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "»%s« хүү процессыг ажиллуулж байхад тодорхойгүй алдаа" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Ð¥Ò¯Ò¯ процессын процессын дугаарын шугамаас (%s) хангалттай өгөгдөл уншиж " +"чадсангүй" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 хязгаараас гаднах тэмдэгт" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 хязгаараас гаднах тэмдэгт" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Хэрэглээ:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Тусламж:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Тусламж харуулах" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Бүх тусламж харуулах" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Програм:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, fuzzy, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "'%s' бүхэл тоог --%s -н хувьд шинжлэх боломжгүй" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' бүхэл тоог --%s -н хувьд шинжлэх боломжгүй" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Тодорхойгүй утга %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Өгөгдлийн лавлахаас хүчинтэй утга олдсонгүй" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Тохиромжгүй файл" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Файл хоосон" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Түлхүүр файл түлхүүр утга, бүлэг, эсвэл тайлбаргүй '%s' мөр агуулж байна." + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Хүчингүй хостын нэр" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Түлхүүр файл бүлэг утгаар эхлэх боломжгүй" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Хүчингүй хостын нэр" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Түлхүүр файлд дэмжигдээгүй кодчилол '%s' байна" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Түлхүүр файлд '%s' бүлэг алга" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Түлхүүр файлд '%s' түлхүүр алга" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Түлхүүр файлд '%s' мөр '%s' гэсэн UTF-8 бус утгатай байна" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Түлхүүр файлд илэрхийлэх боломжгүй '%s' утга байна." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Түлхүүр файлд илэрхийлэх боломжгүй '%s' утга байна." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Түлхүүр файлын '%2$s' бүлэгт '%1$s' гэсэн илэрхийлэх боломжгүй утга байна." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Түлхүүр файлын '%2$s' бүлэгт '%1$s' түлхүүр алга" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Түлхүүр файлын мөрийн төгсгөлд ESC тэмдэгт байна" + +# CHECK +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Түлхүүр файлд »%s« хүчингүй escape-тэмдэгт байна" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' утга бүхэл тоогоор илэрхийлэгдэх боломжгүй." + +#: glib/gkeyfile.c:3663 +#, fuzzy, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' утга бүхэл тоогоор илэрхийлэгдэх боломжгүй." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' утга бүүл утгаар дүрслэгдэх боломжгүй ." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Тодорхойгүй утга %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Хүчингүй хостын нэр" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Хүчингүй хостын нэр" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "»%s« символик холбоос уншигдсангүй: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Баримт нэгэн аттрибут нэрийн дотор гэнэтийн байдлаар төгсөв" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d мөрөнд алдаа: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Тохиромжгүй файл" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Хүчингүй хостын нэр" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "%lu байтуудыг »%s« файлыг уншихдаа байрлуулж чадсангүй" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d мөрөнд алдаа: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Хүчингүй хостын нэр" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPTION...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Абтын нэрийн эхлэлийн »%s« тэмдэгт хүчингүй; Абт & тэмдэгтээр эхэлдэг; " +#~ "Хэрвээ энэ амперсаныг абт бишээр авах хэрэгтэй бол & гэж бичнэ Ò¯Ò¯" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "»%s« тэмдэгт абтын нэрэнд хүчингүй" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Хоосон тэмдэгтийн холбоос; dž гэх мэт тоо агуулах ёстой" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Төгсгөлгүй абт холбоос" + +#~ msgid "Unfinished character reference" +#~ msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Хүчингүй UTF-8-р кодлогдсон текст" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Хүчингүй UTF-8-р кодлогдсон текст" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "URI »%s« -н хостын нэр хүчингүй" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "URI »%s« -н хостын нэр хүчингүй" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Хөрвүүлж байхад алдаа: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "»%s« тэмдэгтээс »%s« рүү хөрвүүлэх дэмжигдээгүй байна" + +#~ msgid "Incorrect message size" +#~ msgstr "Буруу мэдээний хэмжээ" + +#~ msgid "Socket error" +#~ msgstr "Сокет алдаа" diff --git a/po/mr.gmo b/po/mr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c573e1d86ac2f63b8f0509a5d058566f7d9c7075 GIT binary patch literal 62685 zcmds=3!Gh5eeX9GrA9;r@m0|+5RynHB)my@2q8dt1_&S$j3+Z^CdbUo8P1s@1Vsmt zhfo!(JW6c?aY88a@)5vlqxPlsZLLMEZKtoRUT@XbdV6nsZSVK@|F8W#`<$6ckoMmB zWaoF*-fREY|GoZe?R{qca{s;Wi1@j6uPAyYIJ|EZ9rUay`qayGHj0+MCW;OKmx23$ zs{)=E@DlKOoWC-(8{p-%uL9SDUj%F5;Ri?2%fWYpuLgI3i@?u;qW_QJVc@e5iK5fM z#o$Z8Cir6TCh&0ZH^7D9=fD{J3HU4Eiw=zuDDYywd61)LC0el>UrRXQ% z(cu2`qv#0mOi<%(29E;Y18ThA1DAn60{g%iCe{CZP~*J~6o1>m7<>YhT;Br4*RvKl zzpnxp(>@b~R5T9KCAtSh^ysqz{|?ms`yizFTn5JA#o(#nIQU!Oz zD8IZPl)S$WN{;V@_D{k6Y0q2g_ZAn;ijRrkjr zrizw>;$sNZ{WpN>za3P+-vwp&r$G7B{um7vMW=#_qZX)s4+Z=q@MPN4AfXk#`dE*T z(?N~D5yZ8ln?TWf1eE-L0m?7_4=DamJkIYQ1m!okfs*GV-~r%Yf#Ub4p!hiOc=zWE zK(((0W%rMRy6@{Ct{eRacq@1~o#gkAgF62gAS#NUi?E94lR(k0f#T-|kXxgNLDBzj zp!kYcxEyDI8fPN3KLoyn_Md>d{|BJx9dKe4Js&&7x~{-v^4nM?vxP zXQBPCp#1hVC%K=V3X1P_pvJ!)Bqc<<0)8*x3o(lLI04lC{oo718$jvv1EBbQAe{d+ z_+r{$178OIeQ5tXD7zkjvE&EGgQC{}rN?)Hl5;2cE8tV$LEuk8LLqw5>s-#2;9A-( z@GS6ipz_WOPeu3OW#GBs9iZs`4fq;xKPH7&gG)ily9N|LZv!Rwhrm~WUjh#XzXwV` z^H#duP6l5|`x;Q!?*Ly4J_(Bc*Ff?4Paq)|9eO&x2wn!h3j6>lyL=3kAAASYcrRY% zac~4EJ+B7$2ixEw;7y?9c@R7w{1@;s@C<~$R&7vxw9a(A6`W6d8z{f~JSchhLRqBf z=m?Myi{230w}Yg>=#!xA`9m-U{{s}Ac(u!Y1}M4v!2`jYz!!lZ1ZC$(KWnf9k>Mi2)GcO1|`pPFK~Zc4oXjhp!9YV_*!r)C_niE$iL_Z z{D&(=C#-RPuLE`8y`cQ)GoZ%*9;o}Dd!f@i8kAkm14VB=xG(rNQ1osC_W{2OO8-xR z&jJ4lTnhegQ2f94BA4fKu#fh;!5I7`DEYq&J`em~p!{aN1eF{7rJn#ya?^IBHy&06A-wLY#J)rpc7^rbS3u?S?gW~_+!5DniI>%E2z6q3{ zUJo7%-W%Fafs1MX&(J>PO6G{YsO>@N`ActfKmJ+3p9g&Qde`^!LFxGj@G)=|__*kS zw}B78$@OwV&Bu8Y$iL{_{3m{X3|54Dhsf1U~>zru_|2akM|mIR-of#Py@M2K*MdiuTd(^!fW*5EDf| z1J&NH#dT((f+-F&we*D z&^`-9<%o2R^!4d5h$zt` z;6`x8UG6_qATAf}hqGbg=w|SB;JjaVdCmcK-wyC{@MxS#`g;#3zj!Xrr}Jll(%&|4 z|Gk)RL5;KTZ@M2$fLG9-2Br5Cf6MKA7kC-%?}E5cbo5qoCHN%xHt=#9Zv?*uUI`v| zpSSM-kEH$2U;|vR&FQ}nTtxdHz|+8&e#rCu8$kKZP2geRS3pFFeg<9#-abW+0QcJ- zMQ;J`15W@Cx}TZ`ybRm|?gEFw<99gU+XMa_+`#!u9&md-2_8awuiy50Yd-iI+UJ0; z1V=*qR`6Kb4}nL3e+ym$9`K;svjHkDo&d+d{{x-{j(phl|2QZ)e+FX8==g`C2opzN z1NYhs-*}ik1lo;9Sfhc99%T&$zVI=hH$DU2Kzs8?+%EqHo=E%BkGkF84@z(G$Eaz+ zjo|U%cR|_xz>m9MHv|4TD1Oe|>2z-erN{jqce|Yh%HMW??+4>2Sd)Vv2Nfq*J?U}! z8Bly3{0Wb{`$3Jj&+qtnHE=QQFN4>D{|ascCqC(U^JNhIJo0}8d<}T*F87xYq72FR zRd5pA_cP=G@ZDe&Jm9lF&)opZ555Y@|IYb6d;)wBl;55E`@UX#J1D;X6g&r9@(14k zT2SMB8&v<7{Gqp3gBQ}i30w<)3%nHU`y;pOI|F_>;7dN|`ENaV0sXduZvcM`4uWTY z-s9{epzQjJKV~ls`~tWGJmm}C{vP;h+UvgPdEu?#>uG-%JQh6WOD^v)xQ6!k!4`PJ zm%WaC2(0TosCYg9D?abt4{oA8@2l>&SA&Pq{t|cw_)}1Rv;1q$?<3#@?E}B=`Q|q8 zowWD+6Zh};gKF>n4d?S+-~jC(fQpOr|J40y3dFUdzXTrwKk!ZG>(oDUJ^ng)G3WmV zJO@1XDbEw{0LB0R01pRG|CZ}>3|vV2i{PW+KZE;&Q{Q%fe*%0y?Vo@R@ZZ53!HwVX zI^aj3+VA{x*WbMF`nv84@OhlS6MQYW4ZIZmGN|zn{R`$ia1E%qUig=8=c~ZGXnz(w z1-$&PJT8769Hsql;C%4S(>~AN4lbs>&tJQpjs`c-z6XrKpM%GMulgIW-`9fTV>37e zeg(V=Joaxrejfl&rTs%taoP8G-hL~11?^qn@!%`|-s}5|LGg1v_$xC&I#(fKn# z*>M!9N7)jxDTuL3Wp{UA6F?)^WQ>%c9b#@p*3e4Lfw5bckECxS2kk^9l5-~qHB z1nb}~Q2ZVGV|)+19F$&u1g;0q{)w+Q9|Tv>{x*0dc;G*}pPdD2+^az8>tmqwweLT9 zJYE#=U7+;y8BqK`@2B3s4z8xX3w#Io%m3{1-UjYP`(qr*&+9mGRA_KHI+ykn;98D< z<&b^O)=m5z1HLMJ{y6PR_v=_?!QXMc{fXx{{Wg5#qc z7t>zMp&!g(Ke%0VD(5D_w}Gm;pRz0LL4vrSt&^Vx9>O)*TtC0Z5pz73bGVA>evHr0 zo}f8pOZQMoX_%Q{TxX9`QX2Eyop0GkpDS_#=AMrqu&Rxp&7jRs{p`Y~*wl{T0_Iev*l zKc|DQ<@mfeZ7p&;pVx%zEs&I&{v42g^1PiiUmg1Y87J=MxFNKk4}O65%Fyv<+S|kD zKLkfuwIX#M>lcsj>MjvF}Y9EWr0=e->7-oV> zp!xQ2?w7!a!{@WXH*ma^K39S#hQ2T2b3ezKv`^!>C7eHkb1|Q<2<`XN{whcEb3Y#r z4UInl-@$PieHVvwg1_R}#PMrtgrENjzCO^L$LGDnXI`>&_0xY`U2hxzJgH88@c#}D zpReKCjU4(}5b#<)U#HLU!p7*;wc*AomwDfMrxwQBw2^;SIC93F0NhA7t-oVXxPudIk0}xIR)J9gjzABlT#ul*c#LGrDbtIby+z*lvCr=?^#C^#Xe~!irdf z*CbuW7@Zn#Xf`*E)LNV9+=?%`Xti+*qpf;vU`t%T zrqLd6N2hLRkIPQ+#AxH1c%V5_!wT(Y|E4;o92jWT+wHm=wmmU6)@+S4W^)vg5wE?a zJzgJ)P8}HFWVnaZ{nFDwbn4jHaHGFA-k|#hV}kbb=+rj-8h)}LM(nEGra&EMIqJyh z)ba6FW5dLF-5GBVrn)!7>aM}&=B9dW&hda9(+=4jvfmz;ZUbXu){)5MthZJdre zSi_A6qLsDL1>xcb zl-!ngD1I6Um}Z~iJxRCucpfQf)yM`i#9aE;2UgFT`WZOI?0c`>NUo}+K7ylU9#rj6 z3f8Po5E>VpKrL6-hqsixGVNgLLrHkCIh!>LVO{LmY7!|0XYQ{L57*ElKF}D)XB*d6 z1fqy2#!wv=Al6868wezi#_=W>a5K_`qA}?_R%?+X2bvS2?$Kz$subjYD3ac*F*;r! z!vDK=6Y;TnYoyVZo3xd8+FM3&(M=XDqBP!`7$wKl<1^2zj}W=5N5>|{FCNF2N1~PP z*fDd^NMn>vZTWmnqf6*4RjX&1t1O2O5+tKTO0wk5wP*A#J9efX$LBh<>Vx$b^Qh8R z-;&odGY&LE3bomlxx%FyS1wH_!%7MROvw_H@Uj%ot?l{f>xdEakx)RSGXeKb z47>cAUCqq%hbNfwWJ>O`G^RL+51!vXIM>|*EBGxAW&_(0VW>HD_0-I)3-1GUk{bbo z9|nIuebpJO&tDY}wVF&X3@BAFNjF={bXcM}T8}s2O#K_9)AK1AyK2_4DPwR;yy}{I zKcQS79*9nF_D@*(gO#x6#Ay8*<`p~z8`lO^PAOZ~ubQY0GXXb-#7bITVfu6`R90Al z^W;uhp!FO9?i&Mg(EjF#aX|!N>V7OO3v-!(Gbfl8nKD1Kys1zD_EJc~Zdx?h z=eLhIIinkjRMqpwXRfGUSYI-B)<-JH&2%WQ-Jq!-Y7)`QTY2sjTb$1XHeWkxI16*oUkV z>4L*nEFe?YNz&NT)>WKukhW^A`f|^x@nKg@G{;xOhYjn$A^leyYqnQJtDMGvq1+!h zvO*)7)Izr2G}_!e3dgfTRIhN4Jwp3kCYpLADfeF>j zk}*toxobo9aU&}+e9c7E4>of>hHI2D8$}>jIp?mA)HdlN)z5||iz+7l(M|cw&8sWa z#5ARHKA!J&0GNuOUCL2Oa%U=@g+oOLn{pK@U9RO$tI`u|OkU)HKyAF1V3P;@aqx$d)(c%a_zYyJurPn8 z7{pQ{e}U6*o^>^g?HWtb4#Mr`urchp%3_R4EO)X%Pu^JX>)L@FWu8TCiF_O1o z(wj_FZ&i$!TSHV_4NHn%SEQP3e=FP&k_I(&8r)@1E?i@=)Zc21kt1_MvG>xpxG!lx ztZOP<#H$ACv#|#LI7AUVG%;LjY2sEvuHtk)(+ul27Bv?0X@2utM{47qYAWx{@#ftX zxg(8hyAIWHLlW|>`q(g&ww00NnB0o=jIrT~{GBakM}(n1FDYVkb|njUtt=ANn9gyw zWU0XBm<48?Y&W!iVpKu9a1pClY{)4oBPnre>1Kk;`LMCz%lXhrgDf*oZZ(JF;PZ>) zA(mwG2XcK>=MN5eh2a3KgsjM)=56Etzz%O%CXHlZfw_+!)v}V_{BwRvnV||!- z^aW&Xq?6Q`)~)L7la~Z@W|JMvoWc-mQ<;LDEAm|8MEN+)JnSkA=2bYTnC+(Vky_YN zb9Ilm=Sr&Au)Ze~s=LLiy8AcAZ8nwhkc~Aq zvo=u9vNE)d=ycVRThC|v9t#gUQkuP~DJ(dNX^#!kxA=N2U;Ke2nlriI0cBB^Vi)Yc`785J$X z3dLJhz_#k19<-Wa7fVZ_hPJchp#>duGGUc@%7HSCd*~3my1LfQ*O)OH*Ro-5duPeG ztnsydmN}gqw~%KB2Ztxx8@mzh?B3oo+CTf=c7Lh6a-5|emKQmf(dl}&_Snc`59JZU zzNo<8eXBh>qtp{J$&RV74!sAbZ5iqECrS*Y9mj&e+lJ`>!#Nu>0iH0jz?!+4=K@+6Svqh#Mi;??J0#2f^FD@W_vb5`MP>Bq86SG40=H`z!SD{U%aMN&HERd-P4O8T)s0qjRNh_e;m-iVbAursm5iqHZKfiSJEet|-FXg* zv+S4#SJ>xHci+VbYZ9ee3dVZWc}F98Lhd`{sUpq8JG;wP7S9On_O+HztIAWh$ERIl zDs|5=RIWH=y+s|*e(#bB9#Wzi8GGC=i|i?(J>y5)kxn5eCfQWU%Th&!G*Yzd$i)fW zYcXQ>IkB-?qeZ!`?e)dJHE7$?6~rb+vrL=3#9+j;zUh+*D`zsJbnB65d#3AHEob72 z-poflX7R01?-`w29~`$w$?W_1^EI-ll{^r$l3~NdAkUGab6M)JYis*zr5WqI+Azf~ z&mTP}g}O#78O?Tjh#6&Fm?Sqq1^*szZmRQ;V&VLOMdG~UdFt%%DL?tl?o1x}_^1|x z{(P=jW0-qb4Wg%!(Rq5%NARXeLdzCX!+Cm^x}iS4Srw=~Wh%Xq5S`!j=j(bK#UIm{ zR&2Mo@-+zEk=tt1;-2NObWIf&6Q1_GTFls+4oV*7Tg;xyy6(gI+l#MWScYJ{93#B7 zVAXNDrs1+VBzyU+PB2TZbN2FvSQu+HuC`_0FdOemBpaj^do<-TcfFIh5Uy_USd#6q zX3NJNevZj&>Z7(9IODWYVZri;# zfqiO8-YkhO7|1`P6gRmi5WFpP(t_j(OX0beYaCxrw&P8XnTVa7d-X^qvhuw>Ow-PN zUqVXHGiFN;g)KOu3snz#Q7iFjiOlyyd92A(z1&l>73m@=|2#LDda~IH-REyJgUz7K z@Q6y!94PqpT2S@l#LXLVCni<-z9(V%MOL~=H)WBc3z9#K`dTLMIDR$jD<>6qtf?1K`azUhUREA&*bGP4}7odia=hbv*=S>BlTzTo23 zuZKAAMA+6y@C18SQ<7(mbyaxaw+a=1qEmQ#Nsp}HPbTs{(VFrL2LySjEwi%2mU_{J zGEbrhFDFyT_5l6^Z~>r(As z6yILJ@WtW9VY4^$3pO1!*=M%Dcw=+3UW<#h;}aeLv?DuPJmW8$!Axm>ySO>gB3%V1 zskmPBo-lHZW?Ng<>j6u2vG?e{EDRkgXy>1_lqFl6?dh|4VA5zu`BS2n6`|PQXyA|&W@05he-hwB(S>bU z--_Q*C(M-?!sf8&2}P}Edz*^;m&6O#>Y1| z3i1W8IizAKef-NnjGauGNk6^RW3EqMuj+GC3Wmwwf@MPIj`L;~LUsdBQnc%-VJ55^ z(G+p8X0(IjcE8^DvU_#HRG<}LYt%BiKdm6WY0zZ#W+hh-CiG&9zciSMmb|mt80{aP zu=g<*9D+fiGFBVknAIG}Q|4P8qP5AU8cNbTIiAPIl&{DwO-=1<_28itv1^l;sf=iN zp_NSIyHFm7+!)@tQl~W9bE(1h3&;j(xt;A%XftiS*Pra~Kv}vy(_Xi;mCv9a^7pvE zSNEU`&&mT4_A7_&C20`YJD_A1%RE+{c3iUuGm2uA)uV@INu`?Xu|-D7-h`wut4$2^ znwFV4U6xYDvbe_ERe41{?=es7)m<^eJc`q%O#5rBWx6=3UW6Ma30yV7yRKdX=E~rX z8=CAc@g`!H&8&#CVRC)7q0WZ3Jb6t{ZlacJrtFqL|^~Ls{jjpEKRe5f$ey7f)z~W6H zl}i$m9`<@h?85jH7-^s&wZA-9>`G{ohV`~aN+WxMpLC`08gEiISsL_L*|bBLTn?UX zGYYO&EL@~nJ&@AF9@_`N@=e0K#e_zQ*k{v^*Fg}pf(y*jO=%r*i9OYiF15vq*6kKF zg@=OaqNR-|@o2-AE!@D~iK(@66Gkh+npQu<_1fqX(Vs>4!Qm!loiBZ7dr#8)GCV~V zQX~W!F~k5To1+#ym$4%@6o{8r^U)O-tXaGIg7cRwS#o8xF1Mq_oS-=>TDQ`ti;&qd z!7%S(ZKzYLYR${~P{Ty)`m63G&v`=i_YJWqUp+uKyzItjo0H&~RY`7XlU(FI{A=s2 zW?(x?he~}ptVI@{vQQVZZwT0f(^4J}8|i#Oz}`kqA3I?wEfIpUXi?4-=O`(a$6WUE zZ&K(O5fW6tZ5s~rsC!(Af{A`0>aX$Yggv~KNxZmV<7D0N;&|P;91|RuEJ_E`ORD+` z2wq%|vbCB|z9@U$HE+Q**JZ^&3eBEn=xu6yO&s^x9HnxQt$nA8Gv&8S$2YU7U~iY! z+uYG=O^j*r(A@B51#ag3%FjOky$tTln5+z_8-G2oYO~L}t=GC|efA)y+g-}>N#L+LYt*`qZVU4sSDRx| z*y*NHlIr~FShTTzO>Ka$c#L3@lAxWJV1L1Nxm-{#kMF;peR1Rc(kWLQJ-g${dJ0mmFe%tKTT2?{1xBe9hqtM{3tJMkYpLo>is- z^FB~`y{vQFMysF1_0rjZC-Woa39@pYlQ5K9{sb{^4Q8~2lVwX6FI`F+(8S`KT$upc z5=YTuqOI*=U5_TRg4tEX8GT2BB90-FJ(N`cT=jy~_tCP==JbM9s#&Y}tSvnsw)|X{ z5cNrNp_4Yahemm^A-5BdRv0r~KXIlGYr1vt!l)gui>_u50Tp$d`FdaOI`wtE&5}x# z#$gB&d4cb$U_=}f@6|&NFKtwg^?8D>veTMYQ*(6R>VdvX{Y!ew3zO_6Ep10^y%Mm@v;+^FFWe+rNLS>LjMPBz$u!(Zp!lp zqgik6rZ0DV0xnn3nleI<+PO!jw_iU!^|9&gH*?|c>8Y*UnclFIPfuEh$ELTxg9a3k z_EtVUZft+ZIZtoU2$8gMo0eZ2mHGKuKJ!Jhsv)9gq%3bCu zkCyeLZ>V$bCR6dvQ4lP1HaDQ`k(n}laXoMMs&4sjv76C8ZH^<3!dKeOR`O-Y!!Dk3 zuh}_#ju$z%PueBi2H)M4cKyWk6a+tr1M%(mg`5soAK>G=Or7`1U=+Pu*kG9xw;}1Q$@q4m;(%;EeEzl=pBA2cu0$Kphs`t6kAkek<;HbLorq z(twB2cB0Vld5qprf?KX}b}Mbh^Naki&``A4=@7H-`5!fFGNzN5dc+(JmbTjkv60y; z(kSYJg0U5<;}~Kc~vPJY)vDpDT%fnDA(c&`q<*qh_v&|(yP z4+lljlZo9j(|2CGhkj5`4Ww}~C8NQevZ*JdDkteA76zI#G48|6h=6-N!I+uglEvI@ zcWB}c=4H5V@F9h`zx$D>${q59NX)n$+M~D4cNH4xa1Pt>Fz@X$Ztr;Tv7b?PC@cRIl4oeQ71+J#SyzjthefW z20V^Oj-UW?Cl#ZX0~IygNR%jALyEUp;w%A)LgiBLwOAsiDM_*dj0?m+8j(7zvgsOX z$s1SQNLhq*V`l!q(>M~OLbj-q+ujhHgIH(qfXANYJp+QR&3^I5FMhO&G$NP5eZu@( z%$uYb(;5}Y95b%nnN%-x&ed7s$Gu7SH^9c6lWdl#{q8`@2;$d1Wg{>CKk0KCVNs}Z zi+N-*WHOow8C8_H+zy*1$mmceX+ajY=TKw$$X+>BWqOl;PbG*fSKM#;K*f;BONo(H zI#i+L0+rZYPBo59emVe%B($g1h#6@o^WR0!_D^^4c<}W+c7A`wW^8jY;O#NL( zaZ&EfsnXLfs?wrhPeu&8XjQU#1>t<-Z^3T(AF`?jH(eAA{3K`5vlUKe_NepM&CrGE zmTJ+Bj=A#WdIhspd@>ydlpSS!qog&rw^0;IO-pO>1a!E+ZTDpM(fm+`_uiVN!Wgv81di0 zV`1SlKD-8_GpV~!iSRNVm!;jpBwvt-Mo!{c@L;J8wc^c_W?6CtF%1!1Fq=T|%3|i! zmPzJu7MaTESck}j7y?S^oPv&*e10t?3{KH8q~=baE_#Ihjvq)l9Wmy~gj1?{IDuk3 za6-LT!N=_hU*6Fp3Xi!D3T21OQw;fnE*Ow;cFJ{aagP8j(CJIMm86uLT&KT^D>97| z6g|1k!-1YGJDxD*5RH?rQ#v9JYNtYzG&Yd*hYads-JPML2_RkO+g&WpzDO#M@wscZ zDcRZe(A{3O+D#N5s_UeYiAM=`_3O6w6Zg7kM9T0-W}p-am8b*{tKt=XV62m^fDHJJZT5@^qq( zG#H|WRO5?r2F0cL+~MZcn;@R(VKdF-gHCoCzC6p2NXQsa z{~$LJXY`_Y%4&dckWPJFa&2`@_8~|$Z$(ckGry8 z$Jb4-J^>>e?u+NkE}1oGaHTMV%GKw2n(yGNc98v^ePwb=_r$XzE9yC zFak5DSNtB2g?XkFyJ70{$uU$1LAyyl%zJ}Khmw}G5gPI&RRAunZzHjpyelC9*`lKt zQX%P69ir5#$!#-_Yf8sA?oA2_2>=&~0JeY%i@Cy>1#wHZcW1(GW?sq{|5b-ZYg_V& z&7St-X17dF?O;G`oA%fGLeeL-5#-&kSPe-HL0(KW({D-aq{|@a90#2=(a9G7A1t$P zH;ITPds*vvB01rb;JMyJB>Z31w zGA94?@`>2!LY^E33A%l>AQ6ntK!#BzVBiuVi7j#ul(e^)>1Jk1K~+Xczx!;Cw-*^< zj~aT}X3C6Oh&nf5X1r&9o4b6`V_H&9NA~dWJGOaZ51tq&nGE^Snz z&67FWCDSb&%4t2?{wI(kCx228j$R;voa|a+0UuwX(5uW1ZK@dcv(;xA3yS}tAZBg;o?N* zEToA7^Eq(}1Vl;3&Ktv$;nb(&Dkt%n#Z}OjykaiA7`>2P_m~dTvZ-OKGoL0rR|v?3C>(JTy}9-DP%Y@5@Q1~1sRG5nC52fSGZ@6@7ZQQ0xRgaAm2{9z0fqGN zw2c~e*Sdn>kx9g-58=k53ON&9H05pbDd8OSRXzncP~?`z_*ME zbqIO!qB-W77~1C?Nu`p=iph{PU;q*E4bLOYByb6H%#_uMFdq{keH2!1dq%Cq8mSrM zZ|&O?CQBNoGQDkDGiDM}9rY*H$rXq)V&VRLZ37dGJ10qk5Zp=J zh+WeSN}GI|XeVDpDs!6H2VHqO!4s>4Ht*6IwLP@pa>UCeuL50k5VmP@Jwm!b-MABu zq&g@O0h>T8wlN1c^)k=dyw64v&5ZHnpzR4p|jgJSNV9T|Sddh%QNtL#*8km8m{Z|=lcn8M|C&J1eC zQWjgLHQL#-*46T`NlV0Y&G(gxu94hFZWPh{9!zhB>{rwHQ>YGR>{oA_)-w)`1K;^! z+L_E(FS|dGm?)3lW1v~gdXa6Xk;Lc=lm75c$_t8?RMI#O8ggj<8lQJt#Nc|KGBY!J z`bbBw7{PX_!reP9BYLS=E|A^uyU1LRIZUauw-w5(bk0CGJV7XuPwHqC+S3o9 zUCOPt3e)~Ub>&~3j7$ktBUv^LMYbH2K;~C}=r=i4#c@@hpjxNI!f$X7O@6s*#EM8N z6-EzF{PMXy`NI$)zSFs=pbv9vX41)IUdd@Aw=q|^r<3*cZ%NEnDC~Ln^c2g>83qH}Lj^GQSH(e>9vt7ta<%Bzz0lSIu zbdauc`nm8HvdL_oy@a7s>NCfB7e6T``ZNQ(yH;(O;CJDz3Cy6?NNS>c&4YT)R{04b z1Py|u1QK5j!dZZsufrBAdlIk*k7wfC-sx;-Bo*c9-%F{=FBX9WI+1pRg|DIni3zc- z@h9_ph6^YOJERMX^bfam zT&YU;b0;7E(917~dh&;1s>tVk$Ny4{y_VTKH5O*v+mlkS;;jbD|1!4eGn9)YWO8Li z(dY%G7Uh<;cSQx}?5$@nDl0}}3><2QkuD@M&->ZZg8QnPwRK@64w@UUKleV3M`aI1c|9CST#tVW63mc(q|@gYFH`MQ>0Sd zNES{k_;ig8dz3P_;1B!~!{iSfCFvV++!;c-h`te34Lr<6a7)4OBo}aw9KGZVaJO4u z7{+3HQwy{*;GNCL}!|#lJ(k}d_h%zNYSZ)TLv(xr$;@VB?&CXz$ib@ck39YSKT_)0y$7TK0 zl-f+NAj~SWPF;6U;{-`jUTCB>N=Qjo)*XD;$7S~Ugt zblk47jrIAeVPs<=oO`H^8^l%ZQ1Fdjq)M)qJ=LR#$xQ{eC}*m!%Fczc64i$Z#vO@V zC`Zb9i&Uhp!Ik;w#7UeCA$?`RWBLpQ5xt;-{+I@|+%AYlTU&V6zdSLrT*q#BwDzmL z_Ca~54T@drkH}c;&KHDwSTLJl@;pnjYNwtHTb2$M$PH8w855>I8a*|cbavyQ!1T8X zRNOW@B|(w`DJ=-Y&ScqnT+c4JT*!1ji4~3G5K)1MQB>G=dxoQLSczXcW==w*XpEr$ z(D9iQMm|RQ7@X6pc~cJzhPpQ4-(0=Q;VWbbzx3h%MKk?pi!%i+l?6fi4n`4jD1&9{Le0Mq6*b@3CK{&%s_XJ;-$gf zshf~1%b7C0qhsQ!h_N1NCedow$z(=J#9$~>rt~`y3*`p21!f78A7g~w0J(-1e^V;D zC^KMC#oF{#ZmDhCV{UA^dsQMrbjQD7i&I#-P??$e)d^BIn!0Mm6{UXSE61f@ApH z?X<|39#kY}<<6&Tgq_pdZ!s4`7uW%Jfx5QrvWTKfYM~xp*u^A-jmM0Wk%>t}48U2G z&#gsMi$AWQmOjMIaC!J&=a9uDdDiRmDJqU)xk<(0_TE!wuN)$PqhkgXF+tSaXW?7dD z{vI1MR(ax^as!L0*PRsUrEkijJ4q~sCx@ygjqeZ3o~-(Yf-TV^Kxz*1Kr=;mvJkm{TF}hkB6uyv6@Mu|k~li~@V|wQ4`89>;&(ya?e0dS8MVU}D0ExI>sV zs_D5$OE7nT=x6auqu|Eg%>=MnA=*PjCeu_d2&&}{{F<>yH=UW<8uXyRH@#Ql=t!vqzj?xSchkM%gfl~66@B@_ce8*hg^ zgu<4aa}g%IYS)9j_u83;4ZIZA&JadHuE1bc@(l)0-oY=CFuvIBlfAt3%i`Cn0d6HN z!l`=jiG%^qdZd7|u~o@^O*GiUzjnm-ns=I1pyZ!*OYWWUo?jb7WtLN>b}^fx6*1z9 zg@_9aT_%CzJ9FtDwYF=@L@68oYz5s+y1lt}hiS-d>a&WEfgE(|kg&=)!My&4g6`^c zRS8m}WoymqiNzac7MmJWU_8VE#N~ar@qGIfZ=BM%1;+wyXlbeV6jS#vw7jK>^zlzj%GaF zJds8m*%GU3mSAuTKP5RA(+wxzaVN_RI};&vk2BTr&3q|sH#ii?xcW+v-$btX5{ zxU_6`!P`73n`#$~+FF3|xd7*#5D zL%J0tH?Hd(tAV|YnnfDz!U{W88kFc&_RVbAMfpE$RCM&hoUQp)lpws-7?Y{+-b{lo z&7y-b1KPYvN}!}Dp)Ec*-vUWvoKRY$h<-q zLQU<8aYj)ux657y`7vIPwVh}&uF?P`om&)w=W7toa?u85^zA*~d99ksXQVv~?maIe zIW~q5ehpDOJ~R9U71yORh_jd&`kVFZ$D5n#qiy>Fj4B;lF8T{W(qV^&W<3V#sGyfm z`5n^7KZp_{Q>gtX7PO+v5-%{^26f=RMC1ja`Z0QSBFjYOK^IiB(PA;!lwaD1` zhGGL}=su8MuS#}@rn1)q+{=nWSx1U~3a?3$28|z-$B@3tMYC;l+>T9GCUnK{(O+k zhS=1z4wI0kldU;d#@JY01v_4~EqxA6o6{r&W|*FN^_i49)uJb=NzYJT9w9U82+2Ox z3LX7(ValFcxSC4CzGT6z2qltS5-^^_^?&&n=@9AS%W^`POz$=$$QDKYh0A7MaSpY# zv{G1d1BnkosdWgJkdPwFK9sCvBYNR=K{ZfdaPI}5meT8^1AWcGKK_O;f7Z76XVmO3 zEUq7G4iDRmK*A{O9^ufMxZxPJI#D^Ym)zKfp;Rwb6D4uyj;*H6NRpDI>*iAKuB9Xz@PHDhw4#PhtQ zFM@>`Ij)$o#i&#af459e?ckHE2oYc_q`1PAQE&_T7v|Wcq|(jl_mtSLL*t@lUg8PX zq&5fTnohwo>hMY4706njJBkiKN8cXk^%8O=7yLOnmnfLkiO{EJ z=P;~&hrP-dU2(yhwW}{Uf60<1S4KvgfN*Cj%myBqc!$zkye?X|G9GR=H*KhIY>W=X zwRXGS8gDd585U8Xu6Q=S!$R0AF8mw*kb$ts=KX^2!s4tr=!e_np{2q{%RncjXAlg5 z=HLU4r8Wk>#nfZYCk;kW+R+DK*7Z(mF~)V_;zg%DWUg_Vo?j0ka`6uE=T zV$2QYezM)HKrWSZv*62FVddg6fJwx9KH+Kzxjv^cKFTD&;AgT!)L(1Y`}#N5Mu!@s zLvg*`UmL5p0Z{{x@+D-fL&*o z70igtZUd^hGbL*CnUo$Lc_gNsQnf%zq%+LQ*=Un5X%{xX#7jsCkvRe~-p4s6cAt~d ztl}JNuIr|3sZsA*m*?2`x`nv{v7Eb^R@|4Jq-$S_K|rZ2a0V|73j?7W2IC?Nf73~_ zt(^6zbIK#ceC;2W3fW9c|5P}$g~*8ob1pfW)Mj?-*enX^lM=-oH5txG2E_%>+|wa$ zH-5VA@q~xi(itMd%maK4xY@s{J`OKLEJ26fBvsI5;M~)#Qd!q5z>?GT3vH}ME~F{@ zLY7mSMQ};lB(3}0UKM+88akJy)U}dq{mm?U=!^34W(0xlU9p{Azqv8KaXr5&r&SA+ z#U6}f?#T$SF`1ax46bHoGs1wl;S`+cMT|Wdk>AtQl4N^CqB%B83hwwszV;q zmM&r}NVuse92MK};@Y4fBk0Siy)Ytqoa2p|NfaLl(Vfor0zd7Zv4FMv~iHeRrA&nglwC8}Bf;Gn#|z znK)D7FTmk2+pMw)WnDqOt(FHpba6?QJ+MHR;E8d^*J=DR91(E}T_jNHlFV{u<{5A5 zWq*{5FHBk_NFP-LT*-O2qu0NhFH$)><^t`jn2|&6PG?sFZl@8-?p8Hoj=nN>N+M{% zRlq>bkM;zRkw#kcX?4TdG)o50^Nwiyep90UtmkYpc*S_mb-KZTY{8npP)3jk5rY*> z1R^t=6w1bQsiiawh^#qhe9Lw5RTH(*@y1}I-r|y5g?^d=5Dpy`;)DjLx|W%9CFl7_ zRx&9%oalW?$|7XMQL*Y>chqsmaT0BimD1EE=PFm8xT)r<$Q*=ZPhN6&_q#N1#pIgP zQ=w{BDkAngd6Gcf5Ia47AjM@V$vVNA7%$zC=ID>X68zKMsfkFRMWNr036w$nf8$c5 zaa-^1ugr`6if~I~vnmJmN(RV=j>288q0~f$EdakpmWIJ(*0kV;c?GP=t(BZd_fD`)k9)^dQ{?mT6cN%Gy3t zgjq=13$r65g&BZr$PL$8vT>aTE|Xio!GC0vCgkK9mEy@i7#NLrdsK z^f`rN>~uRN3NzPq!fBkz9m^@(SScIDS;L^1952UNROz`}-mQk!i;$XxBD~Pw<8r(E z7iSAPEU3h<_z=j2H3H=dtp<&0s)^Ra!N7Nlwyi87leeju1jDbbv{% zm`XARV->b#qHd)q6g)gsSyvB22853fO;7DeWKeCA$guDfZ_Gpm+MX3c6_16srIlv1 z@RSpGgABK+!k&c;h0&vR+*FtleA42P3`shCrc1Rtill5`2-&qkRo;XkUEb&M%_m&c z9iU?3C1EpgM-{=2lTm)!_aPF(7AJ7!Q#0pX7n#pt~ vgbFU}9kT+Upw#d^PTgd~TF|;8iOu3XY7UQ, 2008, 2009. +# Sandeep Shedmake , 2009. +msgid "" +msgstr "" +"Project-Id-Version: mr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-07 19:13+0530\n" +"Last-Translator: Sandeep Shedmake \n" +"Language-Team: Marathi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: KBabel 1.11.4\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' घटक करीता '%s' अनपेक्षित गुणधर्म" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' घटकाकरीता '%s' गुणधर्म आढळले नाही" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "अनपेक्षीत टॅग '%s', टॅग '%s' अपेक्षीत" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' च्या आत, '%1$s' अनपेक्षीत टॅग" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "माहिती संचयीकेत वैध ओळखचिन्ह आढळले नाही" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' करीता ओळखचिन्ह आधिपासूनच अस्तित्वात आहे" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्ह आढळले नाही" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्हात MIME प्रकार व्याख्यीत नाही" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्हात वैयक्तिक बाब व्याख्यीत नाही" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्हात गट निश्चित नाही" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' नामांकीत कुठल्याही अनुप्रयोगाने '%s' करीता ओळखचिन्ह पंजीकृत केले नाही" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' पासून कार्यान्वीत ओळ '%s' विस्तारीत करू शकले नाही" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "अक्षर संच '%s' पासून '%s' असे रूपांतर समर्थित नाही" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' पासून '%s' असे रूपांतरक उघडू शकले नाही" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "रूपांतर आगत मध्ये अवैध बाईट श्रृंखला" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "रूपांतर करतेवेळी त्रूटी: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "आगतच्या शेवटी अपूरे अक्षर श्रृंखला" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फॉलबॅक '%s' ला कोडसंच '%s' असे रूपांतर करू शकत नाही" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"file\" योजना वापरणारी संपूर्ण URI नाही" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानिक फाइल URI '%s' बहुदा '#' समाविष्टीत करणार नाही" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' अवैध आहे" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' चे यजमान अवैध आहे" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' मध्ये अवैध निसटती अक्षरे समाविष्टीत आहे" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "मार्गनाव '%s' संपूर्ण मार्ग नाही" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "अवैध यजमान" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "संचयीका '%s' उघडतेवेळी त्रूटी: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "वाचतायेण्याजोगी फाइल \"%2$s\" करीता %1$lu बाइट वाटप करू शकले नाही" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फाइल वाचताना त्रुटि : %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "फाइल \"%s\" खूप मोठे आहे" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' फाइल वाचतेवेळी त्रूटी: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' फाइल उघडण्यास अपयशी: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "फाइल '%s'चे गुणधर्म प्राप्त करण्यास अयशस्वी: fstat() अपयशी: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' फाइल उघडण्यास अपयशी: fdopen() अपयशी : %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फाइलला '%s पासून '%s' असे पुनर्नामांकन करण्यास अपयशी: g_rename() अपयशी: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "फाइल बनविण्यास अपयशी '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "लिहण्यासाठी '%s' फाइल उघडण्यास अपयशी: fdopen() अपयशी: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फाइलवर लिहण्यास अपयशी: fwrite() अपयशी: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फाइलवर लिहण्यास अपयशी: fflush() अपयशी: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फाइलवर लिहण्यास अपयशी: fsync() अपयशी: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फाइल बंद करण्यास अपयशी: fclose() अपयशी: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "उपलब्ध फाइल '%s' काढूण टाकल्या जाऊ शकत नाही: g_unlink() अपयशी: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "आराखडा '%s' अवैध, '%s' समाविष्टीत नसायला हवे" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "आराखडा '%s' मध्ये XXXXXX समाविष्टीत नाही" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "बोधचिन्ह लिंक '%s' वाचण्यास अपयशी: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "बोधचिन्ह लिंक समर्थीत नाही" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' पासून '%s' असे रूपांतरक उघडू शकले नाही: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string वाचता येऊ शकले नाही" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "वाचन बफरमध्ये उर्वरीत बिनरूपांतरीत माहिती" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "अपूरे अक्षर असल्यास मार्ग बंद होते" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end वाचता येऊ शकले नाही" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' फाइल उघडण्यास अपयशी: open() अपयशी: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' फाइल महत्व जुळवू शकले नाही: mmap() f: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "ओळ %d अक्षर %d वर त्रूटी आढळली: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "नावातील अवैध UTF-8 ऐनकोड मजकूर - वैध '%s' नाही" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' वैध नाव नाही " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' वैध नाव नाही: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "ओळ %d वर त्रूटी: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' वाचता आले नाही, जे अक्षर संदर्भच्या आत अंक म्हणून असायला हवे होते (उदाहर्णाथ " +"ê) - तसेच अंक खूप मोठे आहे" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"अक्षर संदर्भ सेमीकोलनवर संपत नाही; शक्यतः तुम्ही वस्तुला सुरू करण्याकरीता & स्वरूप न " +"वापरता तुम्ही ऐम्परसेंड अक्षर वापरले असावे" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "अक्षर संदर्भ '%-.*s' परवानगीय अक्षरास एनकोड करीत नाही" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"रिकामी वस्तु '&;' आढळली; वैध वस्तू याप्रकारे आहेत: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "घटकाचे नाव '%-.*s' अपरिचीत आहे" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"वस्तू सेमीकोलनवर संपत नाही; शक्यतः तुम्ही वस्तुला सुरू करण्याकरीता & स्वरूप न वापरता " +"ऐम्परसेंड अक्षर वापरले असावे" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "दस्तऐवजची सुरवात घटकाशी व्हावी (उ.दा. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'<' अक्षरानंतर '%s' वैध अक्षर नाही; त्यामुळे घटक नाव सुरू होऊ शकणार नाही" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "असाधारण अक्षर '%1$s', रिकामे-घटक टॅग '%2$s' करीता '>' अक्षर अपेक्षीत" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "'%s' असाधारण अक्षर आहे, घटक '%s' च्या '%s' गुणधर्म नावानंतर '=' अपेक्षीत" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' असाधारण अक्षर आहे, घटकाचे प्रारंभीक टॅग '%s' समाप्त करण्याकरीता '>' किंवा '/' " +"अक्षर अपेक्षीत, किंवा पर्यायस्वरूपी गुणधर्म अपेक्षीत; तसेच तुम्ही गुणधर्म नावात अवैध अक्षर " +"वापरले" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"'%s' असाधारण अक्षर आहे, घटक '%s' च्या गुणधर्म '%s' करीता मुल्य प्रदान करतेवेळी समांतर " +"चिन्हा नंतर उघडे क्वोट अपेक्षीत" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' घटक नावानंतर '%s' वैध अक्षर नाही; परवानगीय अक्षर '>' आहे" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "घटक '%s' बंद केले गेले,कुठलेही घटक आता उघडे नाही" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "घटक '%s' बंद केले गेले, पण सद्या '%s' हे घटक उघडे आहे" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "दस्तऐवज रिकामे होते किंवा फक्त रिक्त जागा समाविष्टीत होती" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "उघडे कोन कंस '<' नंतरच दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "घटक उघडे असूनही दस्तऐवज अनपेक्षितरित्या समाप्त झाले - '%s'शेवटचे उगडे घटक होते" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"दस्तऐवज अनपेक्षितरित्या समाप्त झाले, टॅग <%s/> ला बंद करण्याकरीता समाप्तीय कोन कंस " +"उपेक्षीत" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "घटकाच्या नावाअंतर्गत दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "गुणधर्माच्या नावाअंतर्गत दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "घटकाच्या-खुल्या टॅग अंतर्गत दस्तऐवज अनपेक्षितरित्या समाप्त झाले." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"गुणधर्म नावा पाठोपाठ समांतर चिन्हानंतर दस्तऐवज अनपेक्षितरित्या समाप्त झाले; गुणधर्माचे मुल्य " +"नाही" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "गुणधर्म मुल्यच्या अंतर्भूत राहतेवेळी दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "दस्तऐवज अनपेक्षितरित्या घटक '%s' करीता बंद टॅगच्या आत समाप्त झाले" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "दस्तऐवज अनपेक्षितरित्या टिप्पणी किंवा सुचनाचे विषलेशन करतेवेळी समाप्त झाले" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "वस्तु भ्रष्ट आहे" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "आंतरीक त्रुटी किंवा भ्रष्ट वस्तु" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "अतिरीक्त स्मृती नाही" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "संयुक्त शोध सीमा पोहचले" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "रचनेत अपूरे जुळवणीकरीता समाविष्टीत घटक जी समर्थित नाही" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "आंतरीक त्रूटी" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "पुनः संदर्भ कारण अपूरे जुळविणीकरीता स्थिती समर्थित नाही" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "पुनःनिर्मीत सीमा पोहचले" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "कार्यक्षेत्र सीमा रिक्त उपअक्षरओळीकरीता पोहचले" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "नविनओळ बाबींचे अवैध संयोग" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "अपरिचीत त्रुटी" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "रचनाच्या शेवटी \\" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "रचनाच्या शेवटी \\c" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "\\ च्या पाठोपाठ अपरिचीत अक्षर" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "case-changing escapes (\\l, \\L, \\u, \\U) ला येथे वापरू शकत नाही" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} quantifier मधील संख्या क्रमात नाही" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} quantifier मधील संख्या खूप मोठे आहे" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "अक्षर वर्गकरीता समाप्ती ] चिन्ह आढळत नाही" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "अक्षर वर्गामध्ये अवैध एसकेप श्रृंखला" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "अक्षर वर्गातले क्रमाच्या क्षेत्रा पलीकडे गेले आहे" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "पुन्हाकृती करीता काहीच नाही" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? नंतर अपरिचीत अक्षर आढळले" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< नंतर अपरिचीत अक्षर" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P नंतर अपरिचीत अक्षर" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX नामांकीत वर्ग फक्त वर्ग अंतर्गत समर्थीत आहे" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "समाप्ती ) आढळले नाही" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ( ला न उघडता" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R किंवा (?[+-]अंक पाठोपाठ ) असायला पाहिजे" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "विना-अस्तित्वातील उपरचना करीता संदर्भ" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "टिप्पणी नंतर ) आढळले नाही" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "वाक्यरचना खूप मोठे आहे" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "स्मृती प्राप्त करण्यास अपयशी" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind निश्चित आकाराचे नाही" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( नंतर सदोष संख्या किंवा नाव" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "स्थिती समुह मध्ये एका पेक्षा जास्त शाखा आहेत" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( नंतर होकारार्थी अपेक्षीत" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "अपरिचीत POSIX वर्ग नाव" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX कोलेटींग घटक समर्थीत नाही" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} श्रृंखला मधिल अक्षर मूल्य खूप मोठे आहे" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "अवैध स्थिती (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C lookbehind assertion अंतर्गत स्वीकार्य नाही" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "recursive call चक्र अनिश्चितरित्या चालू राहू शकते" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "उपरचना नावा मध्ये समाप्ती आढळली नाही" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "दोन नामांकीत उपरचनाकडे समान नाव आहे" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "सदोषीत \\P किंवा \\p श्रृंखला" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P किंवा \\p नंतर अपरिचीत गुणधर्म नाव" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "उपरचना नाव खूपच लांब आहे (कमाल 32 अक्षरे)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "खूपच नामांकीत उपरचना आहेत (कमाल 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "ऑक्टल मूल्य \\377 पेक्षा जास्त आहे" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE समुहात एका पेक्षा जास्त शाखा आहे" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE समुहचे पुनःकृती करू शकत नाही" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "अस्थीर NEWLINE पर्याय" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "ब्रेस नाव किंवा वैक्लपीक ब्रेस विना-शून्य संख्याच्या पाठोपाठ \\g दर्शविले जात नाही" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "अपरिचीत पुनःकृती" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "कोड उत्प्रवाह" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "उत्पकार्यन्वीत कंपाइल कार्यस्थळ" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "पूर्वी-तपासलेले संदर्भीत उपरचना आढळले नाही" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "रेगुलर एक्सप्रेशन %s जुळवणी करतेवेळी त्रूटी: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE लायब्ररी बिना UTF8 समर्थन कंपाईल केले गेले" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE लायब्ररी बिना UTF8 गुणधर्म समर्थन कंपाईल केले गेले" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "अक्षर %2$d वरील रेगुलर एक्सप्रेशन %1$s जुळवणी कंपाईल करतेवेळी त्रूटी: %3$s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "रेगुलर एक्सप्रेशन %s अधिक कार्यक्षम करतेवेळी त्रूटी: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "हेक्जाडेसीमल अंक किंवा '}' अपेक्षीत" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "क्जाडेसीमल अंक अपेक्षीत" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "बोधचिन्ह संदर्भात '<' आढळले नाही" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "अपूरे बोधचिन्ह संदर्भ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "शून्य-लांबीचे बोधचिन्ह संदर्भ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "अंक अपेक्षीत" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "अवैध बोधचिन्ह संदर्भ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "अंतिम '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "अपरिचीत निसटती श्रृंखला" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "अक्षर %2$lu वरील बदलाव पाठ्य \"%1$s\" वाचतेवेळी त्रूटी: %3$s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "क्वोट मध्ये असलेले पाठ्य क्वोटेशन चिन्हापासून सुरू होत नाही" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "आदेश ओळ किंवा इतर शेल-क्वोट पाठ्य मध्ये बिनजुळलेली क्वोटेशन चिन्ह" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ्य '\\' अक्षर संपल्यावर संपते. ('%s' पाठ्य होते)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c करीता जुळते क्वोट आढळण्यापूर्वी पाठ्य समाप्त झाले. ('%s' पाठ्य होते)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ्य रिकामे होते (किंवा त्यात फक्त रिक्त जागा समाविष्टीत होते)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "उप कार्य पासून माहिती वाचतेवेळी त्रूटी" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "उप कार्य पासून संभाषाणाकरीता पाईप बनविण्यास अपयशी (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "उप कार्य (%s) पासून वाचतेवेळी त्रूटी" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' संचयीकेत बदल करण्यास अपयशी (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "उप कार्य (%s) कार्यान्वीत करतेवेळी त्रूटी" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध कार्यक्रम नाव: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%1$d वरील बाबी वेक्टर मध्ये अवैध अक्षरमाळा: %2$s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरणात अवैध अक्षरमाळा: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्यक्षम संचयीका: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "मदतीय कार्यक्रम कार्यान्वीत करण्यास अपयशी (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"g_io_channel_win32_poll() मध्ये उप कार्य पासून माहिती वाचतवेली अपरिचीत त्रूटी आढळली" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "उप कार्य पासून वाचतेवेळी त्रूटी आढळली (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "उप कार्य (%s) पासून माहिती वाचतेवेळी select() मध्ये अपरिचीत त्रूटी आढळली" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) मध्ये अपरिचीत त्रूटी आढळली" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) विभाजीत करण्यास अपयशी" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "उप कार्य \"%s\" कार्यान्वीत करण्यास अपयशी (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "उप कार्य (%s) चे प्रदान किंवा आगत परत पाठवू शकले नाही" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "उप कार्य (%s) चे विभाजन करण्यास अपयशी" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "उप कार्य \"%s\" कार्यान्वीत करतेवेळी त्रूटी" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "उप pid पाईप (%s) पासून वाचतेवेळी त्रूटी" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 करीता अक्षर क्षेत्राच्या अंतर्गत नाही" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "रूपांतर आगत मध्ये अवैध श्रृंखला" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 करीता अक्षर क्षेत्राच्या अंतर्गत नाही" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "वापर:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "माहिती पर्याय:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "मदत पर्याय दार्शवा" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "सर्व मदत पर्याय दर्शवा" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "अनुप्रयोग पर्याय:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s करीता संख्यात्मक मुल्य '%1$s' वाचता आले नाही" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s करीता संख्यात्मक मुल्य '%1$s' क्षेत्राच्या अंतर्गत नाही" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s करीता दुहेरी मुल्य '%1$s' वाचता आले नाही" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s करीता दुहेरी मुल्य '%1$s' क्षेत्राच्या अंतर्गत नाही" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s पर्याय वाचतेवेळी त्रूटी" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s करीता बाब आढळले नाही" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "अपरिचीत पर्याय %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "शोध संचयीकेत वैध किल्ली फाइल आढळली नाही" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "नियमीत फाइल नाही" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "फाइल रिकामी आहे" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "की फाइल मध्ये ओळ '%s' अंतर्भूत आहे जे की-मुल्य जोड, गट, किंवा टिपप्णी नाही" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "अवैध गट नाव: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "की फाइल गटासह सुरू होत नाही" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "अवैध की नाव: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "की फाइल मध्ये असमर्थित ऐनकोडींग '%s' समाविष्टीत आहे" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "की फाइलमध्ये '%s' गट समाविष्टीत नाही" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "की फाइल मध्ये '%s' की नाही" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "किल्ली फाइल मध्ये '%1$s' किल्ली समाविष्टीत आहे ज्याचे '%2$s' मुल्य UTF-8 नाही" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"किल्ली फाइल मध्ये '%1$s' किल्ली समाविष्टीत आहे ज्याचे मुल्य विश्लेषीत केल्या जाऊ शकत नाही." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "कि फाइल मध्ये '%s' कि समाविष्टीत आहे ज्याचे मुल्य विश्लेषीत करणे अशक्य आहे." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"गट '%2$s' मधिल किल्ली फाइल मध्ये '%1$s' किल्ली समाविष्टीत आहे ज्याचे मुल्य विश्लेषीत " +"केल्या जाऊ शकत नाही." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "गट '%s' मधिल '%s' किल्ली किल्ली फाइल मध्ये समाविष्टीत नाही" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "किल्ली फाइलीत निसटते अक्षर ओळीच्या अखेरस समाविष्टीत आहे" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "किल्ली फाइल मध्ये अवैध '%s' निसटती श्रृंखला समाविष्टीत आहे" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मुल्य '%s' संख्या म्हणून विश्लेषीत केले जाऊ शकत नाही." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "संख्यात्मक मुल्य '%s' क्षेत्राच्या अंतर्गत नाही" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मुल्य '%s' फ्लोट संख्या म्हणून विश्लेषीत केले जाऊ शकत नाही." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मुल्य '%s' बूलीयन म्हणून विश्लेषीत केले जाऊ शकत नाही." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s करीता खूप मोठी प्रमाण संख्या पुरविले गेली" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "श्रृंखला आधिपासूनच बंद आहे" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "कार्य रद्द करण्यात आले" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "अवैध सॉकेट, सुरू केले नाही" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "रूपांतर आगत मध्ये अवैध बाईट श्रृंखला" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "सॉकेट पत्त्यांकरीता अतिरीक्त जागा आढळली नाही" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "रद्द करण्याजोगी प्रारंभ समर्थीत नाही" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "अपरिचीत प्रकार" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s फाइलप्रकार" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s प्रकार" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "अपरिचीत पूर्वरत end-of-stream" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "अनामीक" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "डेस्कटॉप फाइल मध्ये Exec नोंदणी निश्चित नाही" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "अनुप्रयोगकरीता आवश्यक टर्मिनल आढळले नाही" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "वापरकर्ता अनुप्रयोग संयोजन संचयीका %s बनवू शकले नाही: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "वापरकर्ता MIME संयोजन संचयीका %s बनवू शकले नाही: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "वापरकर्ता डेस्कटॉप फाइल %s बनवू शकत नाही" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s करीता इच्छिक व्याख्या" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ड्राइव्ह बाहेर पडा लागू करत नाही" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ड्राइव्ह eject किंवा eject_with_operation लागू करत नाही" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ड्राइव्ह मिडीयाकरीता पोलींग लागू करत नाही" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ड्राइव्ह start लागू करत नाही" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ड्राइव्ह stop लागू करत नाही" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem एनकोडींगची आवृत्ती %d हाताळू शकत नाही" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem एनकोडींग अंतर्गत सदोषीत टोकन (%d) आढळले" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblem एनकोडींग ची आवृत्ती (%d) हाताळू शकत नाही" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblem एनकोडींग अंतर्गत सदोषीत टोकन (%d) आढळले" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon करीता GEmblem अपेक्षीत" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "कार्य समर्थित नाही" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "समाविष्टीत आरोहन अस्तीत्वात नाही" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "संचयीकेवर प्रत बनवू शकत नाही" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "संचयीकेवर संचयीकेची प्रत बनवू शकत नाही" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "लक्ष्य फाइल अस्तित्वात आहे" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "संचयीकेची पुनः प्रत बनवू शकत नाही" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "बोधचिन्ह लिंक समर्थीत नाही" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "फाइल उघडतेवेळी त्रूटी: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "विशेष फाइलचे प्रत बनवू शकत नाही" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "अवैध symlink मुल्य दिले गेले" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "कचरापेटी समर्थित नाही" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "फाइल नावात '%c' असू शकत नाही" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "खंड आरोहन कार्यारत करत नाही" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ही फाइल हाताळण्याकरीता कुठलेही अनुप्रयोग पंजीकृत नाही" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ऐन्युमरेटर बंद आहे" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "फाइल ऐन्युमरेटरची अप्रतिम कार्यक्षमता" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "फाइल ऐन्युमरेटर आधिपासूनच बंद आहे" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon एनकोडींगची आवृत्ती %d हाताळू शकत नाही" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon करीता सदोषीत इनपुट डेटा आढळले" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "श्रृंखला query_info ला समर्थन देत नाही" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "श्रृंखलेवर सीक समर्थित नाही" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "आगत श्रृंखलेवर ट्रंकेट वापरू शकत नाही" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "श्रृंखलेवर ट्रंकेट समर्थित नाही" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "चुकीचे टोकन क्रमांक (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "वर्ग नाव %s करीता प्रकार आढळले नाही" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "प्रकार %s GIcon संवाद लागू करण्यास अशक्य ठरले" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "प्रकार %s वर्गीकृत केले गेले नाही" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "सदोषीत आवृत्ती क्रमांक: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "प्रकार %s GIcon संवादवर from_tokens() लागू करत नाही" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "पुरविलेली आवृत्ती आयकन एनकोडींग हाताळू शकत नाही" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "आगत श्रृंखला वाचतायेण्याजोगी कार्यरत करत नाही" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "श्रृंखलाचे अप्रतिम कार्यक्षमता" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "सॉकेट पत्त्यांकरीता अतिरीक्त जागा आढळली नाही" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "असमर्थीत सॉकेट पत्ता" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "मुलभूत संचयीका मॉनीटर प्रकार शोधता आली नाही" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "अवैध फाइलनाव %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "फाइलप्रणाली विषयी माहिती मिळवतेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "रूट संचयीका पुनःनामांकीत करू शकत नाही" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "फाइल पुनःनामांकीत करतेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "फाइल पुनःनामांकीत करू शकत नाही, फाइलनाव आधिपासूनच अस्तित्वात आहे" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "अवैध फाइल नाव" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "फाइल उघडतेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "संचयीका उघडू शकत नाही" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "फाइल काढून टाकतेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "फाइल कचरापेटीत हलवितेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "कचरापेटी संचयीका %1$s निर्माण करती आली नाही: %2$s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "कचरापेटी करीता उच्चस्थरीय संचयीका शोधता आली नाही" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "कचरापेटी करीता उच्चस्थरीय संचयीका शोधता आली नाही" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "कचरापेटी माहिती फाइल बनविता आली नाही: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "कचरापेटीकडे फाइल हलवितेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "संचयीका बनवितेवेळी त्रूटी आढळली: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "बोधचिन्ह लिंक '%s' वाचण्यास अपयशी: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "बोधचिन्ह लिंक बनवितेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "फाइल स्थानांतरन करतेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "संचयीकेवर संचयीका हलवू शकत नाही" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "प्रतिकृत फाइल निर्माण अपयशी" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "लक्ष्य फाइल काढून टाकतेवेळी त्रूटी: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "आरोहन मधिल स्थानांतरन समर्थीत नाही" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "गुणधर्म मुल्य शून्य नसायला हवे" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "अवैध गुणधर्म प्रकार (अक्षरमाळा अपेक्षीत)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "अवैध विस्तारीत गुणधर्म नाव" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "विस्तारीत गुणधर्म निश्चित करतेवेळी त्रूटी '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "फाइल '%s' सुरू करतेवेळी त्रूटी: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (अवैध ऐंकोडींग)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "फाइल व्याख्यक निश्चित करतेवेळी त्रूटी: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "अवैध गुणधर्म प्रकार (uint32 अपेक्षीत)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "अवैध गुणधर्म प्रकार (uint64 अपेक्षीत)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "अवैध गुणधर्म प्रकार (बाईट अक्षरमाळा अपेक्षीत)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "symlinks करीता परवानगी सेट करण्यास अशक्य" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "परवानगी स्थापित करतेवेळी त्रूटी: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "मालक स्थापित करतेवेळी त्रूटी: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink शून्य नसायला हवे" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink स्थापीत करतेवेळी त्रूटी: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink निश्चित करतेवेळी त्रूटी: फाइल symlink नाही" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "संपादन किंवा प्रवेशवेळ ठरवतेवेळी त्रुटी: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux संदर्भ विना-शून्य असायला हवे" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux संदर्भ संयोजीत करतेवेळी त्रूटी: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux या प्रणालीवर कार्यान्वीत नाही" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s गुणधर्म स्थापित करणे समर्थित नाही" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "फाइल पासून वाचतेवेळी त्रूटी: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "फाइल शोधतेवळी त्रूटी: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "फाइल बंद करतेवेळी त्रूटी: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "मुलभूत स्थानीक फाइल मॉनीटर प्रकार शोधता आले नाही" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "फाइलवर लिहीतेवेळी त्रूटी: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "जुने प्रतिकृत लिंक काढून टाकतेवेळी त्रूटी: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "प्रतिकृत प्रत बनवितेवेळी त्रूटी: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "तातपूरती फाइल पुनःनामांकीत करतेवेळी त्रूटी: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "फाइल ट्रंकेट करतेवेळी त्रूटी: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "फाइल '%s' उघडतेवेळी त्रूटी: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "लक्ष्य फाइल संचयीका आहे" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "लक्ष्य फाइल सामान्य फाइल नाही" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "फाइल बाहेरुन संपादित करण्यात आली" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "जुणी फाइल काढूण टाकतेवेळी त्रूटी: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "अवैध GSeekType पुरविले गेले" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "अवैध संचयन विनंती" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ट्रंकेट करू शकत नाही" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "स्मृती आउटपुट श्रृंखला पुन्हआकार देण्यजोगी नाही" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "स्मृती आउटपुट स्ट्रीम पुन्ह आकार देण्यास अपयशी" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "आरोहन अनारोहन कार्यान्वीत करीत नाही" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "आरोहन बाहेर पडा कार्यान्वीत करत नाही" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount unmount किंवा unmount_with_operation लागू करत नाही" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount eject किंवा eject_with_operation लागू करत नाही" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "आरोहन पुनःआरोहन कार्यान्वीत करत नाही" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "माउन्ट अनुक्रम प्रकार अंदाज लागू करत नाही" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "माउन्ट समजुळवणी अनुक्रम प्रकार अंदाज लागू करत नाही" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "यजमाननाव '%s' मध्ये '[' समाविष्टीत आहे परंतु ']' समाविष्टीत नाही" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "आगत श्रृंखला लिहीतायेण्याजोगी कार्यरत करत नाही" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "स्त्रोत श्रृंखला आधिपासून बंद" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' च्या निर्धारणवेळी त्रुटी: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s'च्या उलट-निर्धारणवेळी त्रुटी: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' करीता सर्व्हीस रेकॉर्ड आढळले नाही" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "तात्पुर्ते '%s'चे निर्धारण करण्यास अशक्य" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "त्रुटीच्या निर्धारणवेळी त्रुटी: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "अवैध सॉकेट, सुरू केले नाही" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "अवैध सॉकेट, कारणास्तव अपयशी: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "सॉकेट आधिपासून बंद आहे" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd पासून GSocket बनवत आहे: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "सॉकेट निर्माण करणे अशक्य: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "अपरिचीत प्रोटोकॉल निर्देशीत केले" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "स्थानीय पत्ता प्राप्त करण्यास अशक्य: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "दूरस्थ पत्ता प्राप्त करण्यास अशक्य: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ऐकणे अशक्य: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "पत्त्याशी बांधणी करतेवेळी त्रुटी: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "त्रुटी स्वीकारतेवेळी त्रुटी: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "जुळवणीवेळी त्रुटी: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "जुळवणी चालू आहे" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "जुळवणीवेळी त्रुटी: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "स्थागीत त्रुटी प्राप्त करणे अशक्य: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "डाटा प्राप्त करतेवेळी त्रुटी: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "डाटा पाठवतेवेळी त्रुटी: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "सॉकेट बंद करतेवेळी त्रुटी: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "सॉकेट अटची प्रतिक्षा करत आहे: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "फाइल पाठवतेवेळी त्रुटी: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage windows वर समर्थीत नाही" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "संदेश प्राप्त करतेवेळी त्रुटी: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "जुळवणीनंतर अपरिचीत त्रुटी आढळली" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Listener आधिपासूनच बंद आहे" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "समावेश केलेले सॉकेट बंद आहे" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon एनकोडींगची आवृत्ती %d हाताळू शकत नाही" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 कंट्रोल संदेश अपेक्षीत, %d प्राप्त झाले" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "ancillary डाटाचा अनपेक्षीत प्रकार" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "एक fd अपेक्षीत, परंतु %d प्राप्त\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "अवैध fd प्राप्त झाले" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix पासून वाचतेवेळी त्रूटी: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix बंद करतेवेळी त्रूटी: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "रूट फाइलप्रणाली" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unixकरीता लिहितेवेळी त्रूटी: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstract unix क्षेत्र सॉकेट पत्ते या प्रणालीवर समर्थीत नाही" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "खंड बाहेर कडा कार्यन्वीत होत नाही" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "खंड eject किंवा eject_with_operation लागू करत नाही" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "अनुप्रयोग आढळले नाही" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "अनुप्रयोग प्रक्षेपीत करतेवेळी त्रूटी: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI समर्थित नाही" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "संबंधीत बदल win32 वर समर्थित नाही" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 वर ग निर्माण समर्थित नाही" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "अतिरीक्त स्मृती नाही" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "आंतरीक त्रूटी" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "अवैध यजमान" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "रूपांतर आगत मध्ये अवैध श्रृंखला" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "कमाल माहिती अर्रे मर्यादा पोहचले" + +#~ msgid "do not hide entries" +#~ msgstr "नोंदणी लपवू नका" + +#~ msgid "use a long listing format" +#~ msgstr "लांब यादी स्वरूप वापरा" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/ms.gmo b/po/ms.gmo new file mode 100644 index 0000000000000000000000000000000000000000..107c97218ca17ccd28fb6b04ddc9e93e538b5306 GIT binary patch literal 10220 zcmd6sTZ|mpS;uRG+0EKO!X|9E1ajCgZV#Cr&)D8wXU2BcYtMR}y*b`75mC^jy1S;k z+|^aRT~+o@Kqz@a%0pHGMTjIs%8Do80fYkLB7qRRAe09pBrXy{Twa2R$OCy@e*f=O zbybf&<5|Q5rK$N(_c`Y~-}&z6n}2%j*cStykMh2sH+e@8MBtws;}_43hlAi}!H0@gTR3=fL{d@a1%W7Xb`M|*Fe#`13m}- z9VogVI35INz-@2?{3Y-*_~+m=;IR{)&KCG_K7Y2tzX#X(y#9TjuRiz@KK}~%B=}A6 zI{4`K2f-J>SHT|x{~dfU_|Ok{ejf+*{nKDa^T3|~e;yRQFM-S8KY%|49(z|1ya!wc zb?%Gchru0Ca{V>13;sTM68tytL*R*b2fEMJQMKL$SqeiwWe z{5Xrwf?opH!EbaPgHM2nD)>c^q2P<) z)8N-Z(fLnM_VXyjB%de274YXk$>Ve268IM&M+v?K%I+RPIZuMCp!72UF_qvAQ2T!k zJO}<2_yYJA_#5C080Q`Ezd(%-F+R!TD{uK@Z0_JJa8nc;!RwM>2SpS31Te%{HXhM|kx}hJ+mRF@4sv#VcK$;KhCH zS*`Fn@Cxs{crn?4@M(7cy`bz%4=S}sej%H9AMa!KjsGRNKg=t=N%tS+mG1P&w)Dt$ z?CC7!9T(>=%?cN~J7E$JTz?eK!hR9W+-{a6+1)rDGS<1!X+}0(T)0WNXX|>=Fiu^V zx+sYzQChe(oJ7GCUFJ#s7!&lPr%G*s~oroi-13#;AR4yKymM?>w5s{Vd7SO*hH%!X@!IO7`4d zR=P4rtk^|3nMSibWKCmQS}oS%w1AjQjKk&y2Qf=Zi@4ZxT^Hs3aEgxR6vEt{u=N!# zS4M~K5T|)OKm?e=#JE6*(^=M!@?2tLxR{mw0zn*!%zl23xM;z*4--hu?mQfHvuTu? zg2UnJQFgP4U>;k9Lo?ZWb7}KX3b#uv(5nQy)5ciS5Iy$rhOyk}!r=t&j->VG42|v{ ztSEDcidF2Oh?B&#(Di0`7u(g@k`N~ABZ)^W@(_uxxZ2#zMIti=6VKw&YBypB$?d{Y ze)>{FcOuF7NbMbWt{-V{;;?u-ZoixnJPKBsKI(%j$V#0DuE$MUa~G)uTgDh<6(%|-H#@|k zh!Es6n0+7P%i%2A@bSW(e67riO?NWUuc3a0(=6W%wmgmhN0Du7HbdfrQu(Ax3<`4_ zZYdA^7%@*d$1M%oUsi55h-U<+Y=&HrZ)<|0nn+q;n~yygV(|l+mU0?7g1;6?xKm5{ za?qLwA%fX~Wc=_nCT=U=C~TE!OqA8;W_*3TY)}WW{p6$9qrQUW;v@y)qs`pMEi8=p zFSPF#>F--LBv#CQKUV^69e0;JRh(KTSxa;#;YK=UQ83Eb;*xhFo#>Dm1JH4_uQQ)=GDi!J?UsG9yVC#c==7>7QYSj9R zLsz{R?G_ou8F{~|(r_1(9edcRdgU$!Qt-;4UEs*UTA`Z)`eLU}O$!BqPYzgE9qlYE zK8V<*j^xrg-73oExhl*|$W}=y59}knqGj1s;1zSu9C50aKyy{m%M-BbazC`9>#YRDlFq#2$_50{bhAyfBD;(LFj8$gy2o! zV`2aiMX#%}k8)M`?X2j;A(4s*D=vdq+s5jzNlh8KO?pfe3Z*eNFgsjvIfZRiURG(7 z;?0!0t!;e~*^3B55=B8A;;>#a%AdPgi4qk#m-?&j)VA`u)@e*smV*|VcERI1pKMvf zAxoRgeu`ZVOzmvM-nVXE_vfqT>B?aT#dv&m-m?09aS1uTnrz?KekYrhk=#5+xE%2yV@bb{AQG#fTSfa$IxI zp4pjFxD$@$*3wE7A}PPyN$bA!ay+=N#PGo7K78Jfr@LWXOydDWEV$iD$7yz#TFrR& zsZoqAFyn72w^B1Etb5UhQGw-P-M_4APyj&uGYmCKlCD{vcZuM}EW6DSy4MHYpW(`8 zRmU)id+zzI%U6%zjC6nMzLXE+LHF5mn0L3c4R`#;E8E>G99dq|y^2353{&0OnT_@J53N0YcJ26!6v*9eZmc=p zmCZKX^I_gAlO!CuXF1FbdJh-!h$QmNWUov99F}pqn$3onSjmTQ7-}6-CE6H+7fu#UPHy zWf2p+(qS{gjfHMY=!$p{jv2$6%Oc$i30t#CnS^fOr{e-4DJm~#N86>^xYchdppQ_a zk()%KEcV_m)q9vBrKDw1PMx{uW_{j0$+^i#USLA;-XiA^g}}C z(1T%Uiu4v8SI)N3g8AQ3sQNL@;sX6B=~IZayJ>E$0;6!_Y+#>*SGl}vkQM-W3)LBS zm}WQ%hcN?Q$iZc=v98aA{Is@ zh>GkWoW*wXT1bYT-9emZbmZ~jMaaU#rvcCGjL@q zhiX72I0aX0JGH8;+L7AE82TOzEkE?4^W(o%_|}-=&U@Gfs7)R_LGR*%dc2g-=)vT6 z#YEX^y&Q>z`P19nw&jCI+(mU?RZZ62m!mSMrI<4@2A}l?VnM|l{Nek{RAR*_uMqR! zv2~8;yC0~-NthGLYDvE>^>{z{9 zQ1KoUyedj4WBIUsqz(%*v;;PnbtNGhIG7CI(j6GYBbvw@e{44l1^R>H7n0hG6nC1S zQDv-sL97+Qst|S)UoJ3Gvp8iZi)VHR^+OiQdeF}628;i`wrAZ=$J8Y;4H@5GX~yS) zOQJWL*NC2pG^>43UA@+<(rUck9c*0Q5&S%ieHxQ)MW5 zEl7?k06#Xd+#}U{#^xQB`_YkhtfZf3tQNCDEdq+e!{#j>x;5Dxu#b;V*`&&drZDPx zQgS$s7sOGoY|qrJ`_Z?qE; z;CJ3GXGYKZDOJ^pubWrQ-NnVkrr>32PA+wIZ5ob(dU3OEzoT&-(NgXS)U=$|SDXrI z@{f75rQVK1;Xb|utm`PMv_L7NpwH$$kjg|?{F-^qF^LWdYK^Gu%x$(G#H25IrV$~O{pnCd^jWmZCp1w}mt~QRFKX&a`jZ_sSTu!dX%LP|{(pGSYM-vFJbJ1s z92;(Z(r+^Ta?rFpT8FB(teY(sX68oIEU9vSGg5o!oM6l-c$s+%Pq*maTp9vXRTl6Hfss(&LX zi?_zh14;N0SFzTnW4^bq`BJ5Ix&-nZ{(Xp>;YbJMQh!(3wp&Q;l9j|USy`R!!Q~0P U6VX&(m`N0}qJ>_JdJDn-04``M4*&oF literal 0 HcmV?d00001 diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..4f6c976 --- /dev/null +++ b/po/ms.po @@ -0,0 +1,2119 @@ +# glib Bahasa Melayu (ms) +# Jika takut risiko, Jangan bicara tentang Perjuangan +# Hasbullah Bin Pit (sebol) , 2002-2004 +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2004-02-03 02:11+0730\n" +"Last-Translator: Hasbullah Bin Pit \n" +"Language-Team: Projek Gabai \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Aksara ganjil '%s', dijangkakan '=' selepas nama atribut '%s' unsur '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Gagal membaca pautan simbolik '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Penukaran set aksara daripada '%s' ke '%s' tidak disokong" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "tak dapat membuka penukar daripada '%s' kepada '%s': %s" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Turutan byte tidak sah pada penukaran iput" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Ralat semasa penukaran: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Sebahagian turutan aksara berada di penghujung input" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Tak dapat tukar unduran '%s' ke set kod '%s'" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' adalah bukan URI mutlak menggunakan skema fail" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI Fail local '%s' mungkin tidak disertakan dengan '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' adalah tidak sah" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Namahos URI '%s' tidak sah" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' mengandungi aksara escaped yang tidak sah" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Nama laluan '%s' adalah bukan laluan mutlak" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Namahos tidak sah" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Ralat membuka direktori %s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Tak dapat memperuntukkan %lu byte untuk membaca fail \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Gagal membaca fail '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Gagal membuka fail '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Gagal mendapatkan atribut fail '%s': fstat() gagal: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Gagal mencipta fail %s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Templet '%s' tidak sah, sepatutnya tidak mengandungi '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Templet '%s' tidak berakhir dengan XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Gagal membaca pautan simbolik '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Pautan simbolik tidak disokong" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Tak dapat membuka penukar daripada `%s' kepada `%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Tak dapat membuat bacaan rawak pada g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Data tak boleh ditukar Leftover pada penimbal bacaan" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Saluran terhenti pada sebahagian aksara" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Tak dapat membuat bacaan rawak pada g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Ralat pada baris %d aksara %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Teks terenkod UTF-8 tidak sah" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Ralat pada baris %d: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"gagal menghantar '%s', yang sepatutnya satu digit didalam satu rujukan " +"aksara (ê sebagai contoh) - mungkin digit terlalu besar" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Rujukan aksara tidak berakhir dengan semicolon; agaknya anda menggunakan " +"aksara '&' tanpa niat untuk memulakan entiti - escapekan & sebagai &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Rujukan aksara '%s' tidak mengenkodkan aksara yang diizini" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Entiti kosong '&;' kelihatan; entiti sah ialah : & " < > " +"'" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nama entiti '%s' tidak diketahui" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiti tidak berakhir dengan titik bertindih; mungkin anda gunakan aksara " +"'&' tanpa menyedari untuk memulakan entiti - escape & sebagai &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumen mesti dimulakan dengan unsur (e.g. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' adalah bukan aksara sah diikuti sengan aksara '<'; ia tidak sepatutnya " +"bermula dengan nama unsur" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Aksara ganjil '%s', dijangkakan aksara '>' untuk mengakhiri tag permulaan " +"unsur '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Aksara ganjil '%s', dijangkakan '=' selepas nama atribut '%s' unsur '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Aksara ganjil '%s', menjangka aksara '>' atau '/' untuk mengakhiri tag " +"permulaan unsur '%s', atau atribut; meungkin anda gunakan aksara tidak sah " +"pada nama atribut" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Aksara ganjil '%s', menjangka tanda petikan membuka selepas tanda = bila " +"memberi nilai atribut untuk '%s' unsur '%s' " + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' adalah bukan aksara sah diikuti dengan nama unsur penutup '%s'; aksara " +"yang diizinkan ialah '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Unsur '%s' telah ditutup, tiada unsur yang dibuka" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Unsur '%s' telah ditutup, tetapi unsur yang dibuka adalah '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumen kosong atau hanya menandungi ruangputih" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumen berakhir tanpa diduga sebaik selepas membuka '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumen berakhir tanpa diduga dengan unsur yang masih dibuka - '%s' adalah " +"unsur dibuka" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "Dokumen berakhir tanpa diduga, menjangkai tag <%s/> pada hujungnya" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumen berakhir tanpa diduga di dalam nama unsur" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumen berakhir tanpa diduga di dalam nama atribut" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumen berakhir tanpa diduga di dalam tag element-opening" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumen berakhir tanpa diduga selepas tanda '=' diikuti dengan nama atribut; " +"tiana nilai atribut" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumen berakhir tanpa diduga semasa di dalam nilai atribut" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumen berakhir tanpa diduga di dalam tag tertutup untuk unsur '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokumen berakhir tanpa diduga di dalam komen atau memproses arahan" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Saluran terhenti pada sebahagian aksara" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Turutan byte tidak sah pada penukaran iput" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Rujukan aksara tidak tamat" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Rujukan aksara tidak tamat" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Rujukan aksara tidak tamat" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Pautan simbolik tidak disokong" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Ralat pada baris %d aksara %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Rujukan entiti tidak tamat" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Teks dipetik tidak bermula dengan tanda petikan" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Tanda petikan tidak sepadan pada arahan baris atau teks shell-quoted lain" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teks berakhir selepas aksara '\\'. (Teks terdahulu ialah '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Teks berakhir sebelum quot sepadan dijumpai untuk %c (Teks ialah '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teks telah kosong (atau mengandungi hanya ruangputih)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Gagal membaca data daripada proses anak" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Gagal mencipta paip untuk berkomunikasi dengan proses anak (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Gagal membaca daripada paip anak (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Gagal menukar direktori '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Gagal melaksanakan proses anak (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Namahos tidak sah" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Turutan tidak sah semasa penukaran input" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Ralat membuka direktori %s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Gagal melaksanakan program pembantu" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ralat tidak diduga bila g_io_channel_win32_poll()membaca data daripada " +"proses anak" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Gagal membaca data daripada proses anak (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ralat tanpa diduga bila select() membaca data daripada proses anak (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ralat tanpa diduga pada waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Gagal untuk sepit (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Gagal melaksanakan proses anak \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Gagal melencongkan output atau input proses anak (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Gagal menyepit proses anak (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ralat misteri ketika melaksanakan proses anak \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Gagal membaca data yang cukup daripada paip pid anaki(%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Aksara di luar julat UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Turutan tidak sah semasa penukaran input" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Aksara di luar julat UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Ralat semasa penukaran: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Namahos tidak sah" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Namahos tidak sah" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' mengandungi aksara escaped yang tidak sah" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Turutan byte tidak sah pada penukaran iput" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Pautan simbolik tidak disokong" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Pautan simbolik tidak disokong" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Pautan simbolik tidak disokong" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Pautan simbolik tidak disokong" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Namahos tidak sah" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Namahos tidak sah" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Ralat membuka direktori %s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Gagal membaca pautan simbolik '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokumen berakhir tanpa diduga di dalam nama atribut" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Ralat membuka direktori %s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Ralat pada baris %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Pautan simbolik tidak disokong" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Namahos tidak sah" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Tak dapat memperuntukkan %lu byte untuk membaca fail \"%s\"" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Ralat pada baris %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Ralat semasa penukaran: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Pautan simbolik tidak disokong" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Namahos tidak sah" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Turutan tidak sah semasa penukaran input" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Aksara '%s' adalah tidak sah pada permulaan nama entiti; aksara '&' " +#~ "memulakan entiti; jika & tidak disokong untuk dijadikan entiti, escapekan " +#~ "sebagai &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Aksara '%s' adalah tidak sah di dalam nama entiti" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Rujukan aksara kosong; sepatutnya disertakan digit seperti dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Rujukan entiti tidak tamat" + +#~ msgid "Unfinished character reference" +#~ msgstr "Rujukan aksara tidak tamat" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Teks terenkod UTF-8 tidak sah" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Teks terenkod UTF-8 tidak sah" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Namahos URI '%s' tidak sah" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Namahos URI '%s' tidak sah" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Ralat membaca fail '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Ralat semasa penukaran: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Penukaran set aksara daripada '%s' kepada '%s' tidak disokong" diff --git a/po/nb.gmo b/po/nb.gmo new file mode 100644 index 0000000000000000000000000000000000000000..0eef6664328182d3c379a21bad49a395e901c084 GIT binary patch literal 43063 zcmd6w3A|lZb^nioqETcXWIPEZFAs7bNti+=2q6hEqa*>8K)CPS^X|LckvqKPfmjtq zL2y7&al`>yi`ZIQMbuUkr@!`Z)fQ`8#i2OVYVDxa+FJYlt-a51hxhX6zn@S4@5API z&)L)3Yp=cb+H3E#^Z3z+-W%|D|5JkC6!4V8gCO@*@Fcwrf-lbtf@8q1fQNzK^Y{~w zKlk`+k54F z3&1admx4bBj|Z2{4}x9bHt<;R0q|__QE(yneJ})%AoI!KVvwqW&7kUQfG2==fJ?!5 zgBO91fpftlhJxTca0z%0I1Z}bH-hJa4}+@jJKz%Va4OA#7lTS)1y$eMLDBaqFa*B_ zs(rrzMb}&&_!+DM7lGp-qz7*RAtm@I2#bSndpzVUmwy2$I=6!%*aX*rZvfu`J_d^3 zHbjcAuLf6u4}l}#4?vOx$5W}E*MKL24N&iI2UY(cf_d<7!1drN8Y#ZK92DO^3N8nK z466Pi3cCa>fvWF!!K=XUdt423#IHAk;?w8(pW6FN@M7?^#X)dBcpbPAya#+e_&6AX z4KjW90)x#0Ui@#~AA z()~Sn95{zg*U$(-m9qj2!R?^(-w3MyyFkg+d;R;5d;Ge`pMj$9NSLU6!=Tcy1J%#h z`u8sZRsY+3{Kr7i_vhfT;LkyoGY4jc;2EIg`Z7>-T<4!Vpz^&IM1+D5f^=2zH=yc$ z<^@4;DmWKZ{)<7nI(Px7_}f6y`3_L!JnG+n162B-f$IO~TT`#_DS_kl|H zw;q2DuIBlKWkJAD4z2_>PHqN8$2&oWRPYH9kqN#BiVw$9nB?PJQ0-`e%Kvsy^0OaQ zyM72B10D}iqW3J2SHWgba($bB{vfFS|9epRp0UD>=L^6)cpe2M|3C5Xk6r1;{UxC2 zZG$TR&7kOc6ok~^2~hQ&y2{aY6{vRH0;-<(`{%y~kLUTBFhlu6P~|-jJRGcmr-3(t zqWeDZ2=LRO%KHmY=?;M@qVp(^%Rte$$3Nc+p3d{{f=7d208awH2_lNYFG10@=n|)g zUg+^wkM9RX-(%nj;BUaw!4uXvy?!AmeqRo%J-hw;7AQG=IjHpafhU3=_3yt5s{eif zN?x9ga#y-lAgU?27Mu&-4xS7?1fB|h4rFKt-vh;m6V?X7PH;VVIrvskdg=)f76)fv zM&E-aQ00CYRJq>;Ro|iOT>H-i&*b?EQ2KZ;C_dc}&I3ONieHa|>ffWO

l-sQ3~n z{@e+w{P%+Dug`*__iG@kBzVRKbP%`#JPq6jE&$&Is@y*YRqrps=Yq%3DDgiBs{gJ6 zj{EDsgW&hU-QZ1nex9T6RUYpL=kxv%P;&b?C^fRCMqaQ2qTBDpR|T1J4FGfFaldRqj2Y`12?z{`@6)9QZ3x^dGs!$-_KQ z^sfLVFV}$LUjq!myFtm#hd`D0r=a-occA$6AE45oK%>=v7lD$e>p<1}S`gL;e*i8A z{|(H6=WTQSF$${R?gbg@!NXt({v9|3&e`tLF9p>P*Mlne4p4k}7*xHV0z>fo;Kkr! z&v){<0o1sd1V#5hc1cLpb=zThaMEQn6$=gOy^*6w?z`H?}_X+SQ@N1yT`yu#j@UUI3 zyko(`c)l7G|E~w14&Drk&X<8B;D^9-!S90N_wiRc{#*vC{So*q@TK4};9a2TdKY*s z_<0af3%&`e--oYqbgl;(y1|X0>i;mPe)|fj`VYU_>BZIH5}r4MM}jW~)&AFlA^3Zs z>iIIL^1lZ@2Yl)aoSr!fJfG)tK=pg%-@g`A`iDW~{{kpFz6FY(zw*zgywIh)5LCH4 zLG{BJD0#UJJOO+N6#ox^>hFI5#h(+dap}(mRqmCb((eP0178P-u{+sQjBjl~(~n@NV#M@I&Cq;HSW);5R{~JMub5 z*9D;ZZ!4(wb-+`=w}6uGkAO#j-vT8UKLt+&&)DPWS_w+NZvw@K2SLf-vO2W zH=yV_@p@P90#Nm>22Tgaz!1FE<9j`R20Sfbe1aE%Ps_XKmEaBr*$^fvdnP z!ArnP$DeV7qw8`|@>m1aAHM?*gO7o#=Qp6*aZcHly8~Rn^FC1RdM7Bk{0#VR@R#7x z;9DzB{yqSz-mih8^O&k@?>bQOa2u$8_yo8R{05i(5L<@u%HTJY1L>Ul=P>Eq=fT@~B`ia-D8@yr`tzg-Qk=KWp%`A@;EJU^w$8UWl5 zil09L#m}Q#uKhz`$n#cE{aN>T7pU>~5GZ;1JosGj+u+&YuRxWzpzX%>CU6PQMKA>K z1I7PGLGk4YP~-oQj?+J_l9$Io_46;m#o+0Coxa@;hCG)+(QzlJa{kEUS3&86pZfSC_Br`j2CAK9 zQ0d@@JFE9d-RLk^IA~(%Am^sAgFeK2UI`Jxy6ms z^T3ejDtIpV8t^i3Ke!w`?8WZ+Qc(T&O7MK}{h;LeyWlIpqkhY^^G%@Y+Yhb={}~j0 zOJ3sgzW`Le7lWejVQ>rhFQDpM^HRsZ7lCTe2mJH5z~gy7>SeCHg<#0@cJSHYjo@7H z#i00ozkmNla4FAU2ag1wb*n4)6mTBTTR_p*0M)KHgQD+C;1S@j!RLa9zud(Sfr`Ht z6d&*O_+gLV_VIIIit=3qs-7L7%9{j_25$pT2JZup0{;j+1^gU%D)TO`2 z=O2QS;pn^ylw95jE&%TY7l9uF)t+yI8W+Fx z&$(ASy4Hcm@P40vz7te`{0X=g{5h!lF1pi|w+9p*cYQ|2e4sJ?-^wye|gN;`usI^xW>>e*g@5{syS_{2EmM&Ar?4WjQFmZUrUh zB~Wy|8kBs!2NZuk3yKdv29@raZ*cnmY*6Vh0Z#|71{J>#6uoZ&&jG&(ZUX-uTnTQt z$H~FVLACG0p!oMsp!jguy{_NagR1{}Q03hQs{J1U)t+yIqW{o0y76;5sQ9hmCE#BF z{t;00{{TE5JoHVj{FA}6c|IRJ7tDhfgZF|Q2c%bR5{-S z#fN9!=j4AFyoBeQL5;tUgQDZFLG{-!z@xxWJ>dl@*y^DW>D!3X@aoWIZJc_Fw6JRj6}83je}jiC5;4|pv2 zQSe0YOQ6#I02H796yALii)1XvKfgLqhOe|PX(ZTcADBEk@1Gw)sw{(?{- zEaUlMP=D9(`_I8O;NzgyWiKN9wIcabf9UUr1o2jXmlChPv%r<$(coW#Bj6O62SbAX zHaiGz=lMSWuIy1!3kV+}v5mxYg1~>}p??Uja?q_fqzYize z#`ALUZ@@9|Z^3U9;=kwc?h8CzN4SySFYys|ejmZ_>%sUh?|;15;~T+0B3wtBzXCUc zF9lB{9Lw*YfmaZ|PSD@09RyD&?)3!yok=)`-)|sjESCr`BOK-9f6njM5aPckKQu-T zA^t6dYx(_LpY{b{#s60N3kZ7&xB7RN>m`4e5hm;xYa5UId>YLk`rAc#i+=EaQt1C) z$@8WBzL?PAcgyGd7oIoy-_HW?<@rwt3;nzM_^rRWgx@9ngdm;r8-o5&4Z#}wh5bsN zd4v;qei324e=k4<1pkLHPW&z4-GohqA)en!_z}Mk5cKzb2fi5?;mc)4&r6`a2UGc0YqD zejmc`-y)prSbH2R8q{&;PE0zasn-VXZIgT8|&( z-FFFXo{uBEpWpgBnsBvGV=wsM`GlwYhr5YeM0hpf<%AdT{$#?(eY{|f|NRW&3xqH7 zJm0@Nndcq;_e0=Ogr^c({@rIi3aX^7`{!5j`%r@ZzDGEY@EO89!Z!)}8zEdsc$-i6 zQt)=3HxLdZJdNj*z>gBf2`BOVR`AV)EBXBz!lV4Yns77W27>-_t*};ahxyP|IX01R=EvGmGaRp1D)qh8PTbJS zp)iSA5tiCvH9uwfMx$b>7UpYVREerltsU0#)o9iww&ZtRqrByHEjMzcOf(Z;&H%~CrO zyDIr+5qW7(AO-o!e5sNjt-x7FMc8WO$D&|Oqfsf1<=Z8Q*wzrVmIrHE)LwEg$7r6# zN*KFnMg-4Y8mwuzo2AhXHJW%pUMz6-tX$&|4*f|&1iBL?tgqE;xvjf4Zw@ZakCi(O z8y;a&>o{c7__g`kP&*u}H>Sb@Z60fj0rg2*mpo?EOdr!~M6|48wZu8p!YJ&tC~eEe zE$gVJHeM=rny%dpw*oQqTgwRpvg9)yd~!JpQLEgp`xYl<7wU}bW_~aIn=gb&PjOGF zzK20xt3{PPdby`kszrN{GbGa!G>c5_`kshxaGV@3)e2#Ta{ro23W$gXpt`zJLb_mb zOVXj2B^sD0zwSJ7viZpKc(`F*6NjRXFJMfhi^F`b8#e_SmH?x>GjmjFc{69*Zh&#FlEMHZohfX}~~K zAsS<_jvipFp*TkwNNzNu8JMV|7RpDXF;3jbH_^O>dPn-ejYb=+Qfy8RRisN*s1i zr5cG^lKH%9SEJJjKq>tUXqtJPK~gJ9b)$`UuFoyG;9x11WfC-_@u+P`tfno+$K!XrS+8a&ibY3+n2a#5sIAFNK;BNpwO@0#b@Tj+ zw`7#d)R@LWIB$MyUM9H>EHAeRm{n|5_^O^nQm2}k%b~pxq1+fS$f1|#%hs*mxOH7v zY}T1xs8Fn6>aRDY>F9}iEeb~wrm>0OvaCv`Up4F4lrcUPuG<%lF_fc9A-JqQ)-j`s zUZOWUwP+vn3X(z}=f`EFNn0{M=POL>rJ_hlj5fMHnF^&9R>08AD;sDt)&TXTf&_G| zUNtHh0p0*m4-?IRGa;B&F}?K6GE+Rws|imoOD?vm+WF$hY_f`(W(9@huwIQTH?1~P zZ`>dQ&vl7 zwXKqe$hb+O5sPPrMlHhFbmC^}Au>@gW4gO(u?nFE@onY&);X)wa=q!RRf5q8dtwq6 zMkB?MaHS01)x&8HksDPTs2~K+k0YeNUPJ0(6RO)x%FCviSHi5?4%Yc)iH&%b?9ALn zA-1G3g$Wh~-KK2owU{>ak9GRA`58=^wB4ly>x_Jgl_DKluwn>J9igP@OIz0QzQi<; zZ$`_VMhzF-*r~TygbOPAUs3rd{6m!wfMt=E_iBv&~l#U4--nbk%=-DTp6QQL}DGu%pyQ9oYK zq^RUEVV*QNPSyVCU*UH)G`s4sMF-^&w59d2O08E;nMrBHgb!XB% z8x8{!*p#cGGEH3OwJbf6R<{LU%4$vBG0DBvByqAAdb++VuBV%^oTHL4qL6RrGeo2j zRZNzAF)K?=%*H{?OWw0a3%xw_aJ?%@ADzBfEG)XezZs0Bxcyy}`uD8XS;FU8iuM)U zs#lC)r>ks?VTom4c9kb-jB?W^Ku4Kmp{jc-YIz;s!^`+}KPR#0Ov-nx+gz%3_L&-w z_O&zA#3^{|teezY>5-;5Wffo8cW(_eQ)-Ne$iVoQ9dSB16pzDrS+FY3L%V_5V+!Oz(#1n;+{@T zgL&aFt6KV&S7JtN`s5QQgUo#IaB$0fpGcJ~F$r(hD|pRJt1JqOEMMjqGHGQ0j~ATf z;Ueb*>#asLiJs6hlV9B`H(WTsHJnXn7Fg1#<>9!^u-(*Wiq$kmy%O4FT=hjaO04tL zKAHNkP@XzkWd<8^fYysWe?8PhELP-{>rSKsgiP zCN=9_BR2MzW*A1Z%DpAnyKb6$D3P8{G!ov1@hl6+HD;&dcs1``ZI0blo~KJ{7H85m z)&X9W>DGc`XP46?Htp2zVxMeLGga$+HQwr5Bx`(ZB5dKpMnWd?IJrhKb6GK(+dEm! zWY+nqKV;#8GnSrv-U_$O+J{%65)I>XpxY<%4YywLrSMR%J1=vlTQ&KInvdLyzN<55 znXFeTtjMTV?-VEcOU7=uQPLwPmd86YY@BE$O`9g^>z*F7QnW z@0ONGCAqmIpjPuQhAi4!_=z9P`?I?Hxs^>S2W_xnhi&Do#fik6 zvc*j)-3~E1K-n58)c3Z6%TbrCRZerbh+*}=cRmAC1tcpTartfX`Hv+Yw-cey4LE7Z`N?e zMlxh=h-~ybp&NE!o9<*cGubepQn#9xQ+Ao#0l-UOMg+tg19HYPmrTq^@+6wwc1FX6 zuI;wdkvKhur%eqrG&{!Lk?9k5aIl`cbe0J(IB!70zD`Nklu7@%_Ng;v+ra~A#f10) z_O*DE#B0P3d?70+=CSi>Dp^;rOn6C4(v>52g?m%gM{mGsxybq=*<--<6c=vpV`llj zj9QOiry-H}j^or>37wW1&Ka->7GW5sTN>le+A6Ru*mf)Kq*NPk)6?j?9Km7<=X|o0 zwmm3YRcq-Cv(mItZL-v?*ECSNQ@D)_zu8e_f2WqTZ!hMGq${xkE$1c}Yq~WV&fYnn zY#E3U7E+oAux6v6KSwD(Rp8wE2_tP}^e0zeng*fKuK(@H&G}NI$ekEDp=E?qf0)%s zeAGk`aZ-;Apdl$VEyhkB{7)40|3;5|sIG)eGg0+Ym!@I{v__0}JaWzP$@3x2%(=oE z`BIa$fc69yIe(`4(gzgQsU@2oPMb*zy89-XM$FbqJ0&fxJ4MXxgT>QpnJylXn#q#A zA?Lq!DTB??c-!{BaaOraL9cmKnAtOBxL|ulZra^i5ABeEPVTt9 zCgYO1tOuSD3CNN07s^Ay+FiWY*$sxPZMus%I|L$S(woKlS6bM~bT)hUsT7k+>dO$q z(F-%>lLZ*jCZKFcu#}>kGKtf3Eh3@OEKS-PwZiU!6w9c%WczEb&C}-OD8*!ny;XdA z^`@&oCe8RJ?vJtS0khRAI)dsLm)P=YnKJt9=!l3k2}JcOB?~~Y&>Sb8T~e{OJaERa zCGu}e|k8eZ**pcOk6h z2P) zv)kD5y7(Z>^gDCfYQgB$8LPp&sCy?6K&EAl7N^D~NvY8&-t;yp*cPuN zy6yDLd)t0u|Ca+7m_OUx0?z9ZDei8|+EzHh_O(~6V?t*e5%(`++WGVt7aFXxo|&7L z$x%Y>wx{GLky&O;Qg7R_@oEa^D2RD}yd>BbRZn}iTT%@uA}H&x-r_IQDJW;OECjL6Z5 z4wS7TEzDM=9Z}Fsq9wOm$@b-#s>fpk>`vR`)$TuI7ANoq0R}d+gSIf8^7SY1w5I81 zu2Ohw0L%GZRu1d?j?SA9V1wu^E{JW#xX`(*82o8vs zJ3H#F)%cYx1wA<-{BBO|(Ni>FxcCil{rD*W+|LK4qhgv~DSqnZ@XsY!-UPC+>T1-GY`Fg+1~ktD26P zP#T)^H0{m{TVpy|XLsx)4b#v?YNyN3uJA#%qv)278|j!U(% zO22Gq{@*qRmU z4Ma*R)se#rO2D6_Hfth1&)b)w zj(3eSpQ$!8yV9!3q}3J$TLiXso_fsEMme(74$q<3VbyENh@9B;Gaa@oIcOF}`KCsA zt&ppa=e#UtqixHXdA{rPupQan)4-ZQ-n14}f4Rk-w(+qEvU^H2DWS~TLDw>ESK#Js zvO7ojpfdL6OYKIfKq2Ok&m@TrTxzm2ZoRFJ;}_Y9CdDScxh%D|$iOtfrsK?&EHpKe z6m}5CxiQJ8Ei!SStJUt9Vs}!8CTdvcVv;h_vl4MqY`u0JOU=}vJ2c4o=_G@fY@1O~ zJKeUDIIAr_ZJ(L*f}XE4yqipDSfx3eew^t=fo9`@sk-S|+U&CP6Ty|XqLQ=022IyC zYqGLxAxUf&+1iQ>IDCw)13gDtuI9Bwt3>(Qh{~Tu^6^R?OVX{^XPYNZeHD_T9@0qg zZKNX#ysX!3@LYu(ujmW6sU>wm1lMfazH{TYts^5N*9N;YZaC%y%~8SbwQjobnw>7F zaN=z=!aUZ(oJFjy19y)N%8QFwjHi6amEGSp52v2;qJ|Z4q?}DQjv}W>k}TN zI119`p__bR_U?T*(>1rG>kSy1?hfhPx*f%>G*iyuplhur!C)n0W-wb8-aJvV=jwz z-o-Kz?aLSVn5IgX^fa_T3i5|;$>?gda#SQ^vaOnkZGe%-X9ULKcDQxjRhxBo+YO=? zkxp8~CJ@HS}tDItVt5ar%TC~^n>^QzH6^m5jd`iTOuf!HE9!}nSpMK(* zm$pv6MlcgA7^FH96;axU9I~BL#2AHN3_LB;cW)QPyBo;}$i&4?)uvM=&K)9sVBc9F zZ~F2NG6pa(PQggDqv)Df*yu=ddb7v$>hQp~*P6cVZDCw)oFCdnKxfqJQ|IVOzc1+a zn#?otofjM=UL0{rdnA2^oEoc`^)saC)MlH)>i5ZKO@VX~9Cmw_MRvusP@1--+E1Tg z+NyUnzmzQwmxlO$_8E>q#j30GO@#(Z^4Afa|oF)5}H2V_Rlp7;&jDy=u1@} zYcuA&0&by5WhMI$1b3f%;e~Uv1yhdu0MLD|~~Nv(VG@$XTftPlAt$h0|wu0b>XCm(!a z6C^}vaj#Dc%^{)ANogWc->JKF;^E{QY?1EFhh1Ne`1#&XYXLSlpW3oOfu*eMgS31% zWaHUP_Q}F(eqX8DsfKJiCk^KGm_MZ0@2AqrE*@6NOvefPYVYJfa1K{vFeTlVZ?-p> ztz$}-EMByDF)B`zrt=x54bYwhj200s`R5fMbkfCuV-aukr40ruRmA?Gg#W}kW81kU zQ*VC~VM~hiseAJ?dG9@_t}R}p#fpZxI0lpPawOK%!QxjQEW!5a5;&u;748lu z@sGfw>1Oqrqor*IPV3WVGd&h0 zHWqSMx=%ehdWmB@TspG!+>!I=ToLIr<=mE5u~f)i+9|ejJK3V2vwhpn+*&CRhHCCI z^vLpX>Eb1ebBoW-ExjOIvSj&r%W{j)TfCTrxhv2W8qz)K7M~X`UAp}I3(h9r;yIi7 z2qw1^CDFq7r&A`IZooE0{cPd0KTO$``uLh3mlSLDYBW-B7FUy}R_t(8JhziGPs_ut z_2yo@$mAK-r`nZpWogN>TCO&FiCJvTkp_$z>6GdtwfgEg+Qv(pykunYoV8Am=j3u( zZeG1}a732)K173-?Xp$2;hd%uwJ5#ZI)5L)@^IN`sXb?Vg^!0Tx%Eu*I7?~`du*** z$_|SCT(z(k&RrEQ8D24mO9eW`sR{;ESpIKbDZtv!*1PjtL5%(;f%Ha!{SVD=?f)27 zQ&=jOId#2inZs#)c;ESMUE=kP_9yEz3J|^m3Iw1{dwV0qrQoR}L`uatax?jURZVQq<jvmq-|emTfk)_Syi-s?|B}b;ctq`Br#Mk0N;#E7JmdWqtkwbq;whus zT6l@dO#M(VzETYOnT;ma%0!m6z_GPS>jn;0BUr53sgn=6kS_LEN|oXblowSHcTZit z+C1<;Aqv)0yIbemW_da9ieQ&chgRHtJgHSV9~)WR;8t~CO3?O93QMt|#xL~cvvuxx zhjz7-+X>p(JcW{VQ%3OZeu8dFT8eH?MD13&-YA9R5$?QpuqhredMTci@jF%O?6XpC z{Lr6j=2(15Ej~LnuXvib?ij;ZX?CEbh5qo@7Kn2#PB(Kv0l%~QNvh74s|kHc?iq5$ z1=GdFru6Il)(q9Nb*|eCa;T%Ogq=3>4kzelB%W`pWLlNF{gTWh-M1Pfbj~`rzuq9p zh-rendeT#}Ck{MNE1>Q0Ei@Wj0m5bgyn|toRDu^dr-cV)h!f7oIW!p`Zh5ll-NBaG z=UR_gX+vQ4Id&$u9rWcHuS{vo&n%Osi7+1#pOg!|;@phNcK<;};?Z7k)ik8ki#(3C zkr4XzN;5^jDoe}n$&4q}6UhO*HIt*wsrD$}!`P|8$er=*QE6#WbRs=vT|6(o4Pjn9 z?9o7`>-8~GtUwcyK{mM#!N$J^jlUnkPX>CEm48c&Z&q5p+S+llXmcZ=BFj3{+n8;3}-C1xDuz#pI$I@y7=C`g#D7)(s z3LO?3OcNYbWMRz2fT?II4T+&)#hgveHb>$`mQgZEayc|K`?*^MR**H#U8A-RJqSMO~$cb3lcZi8_ra9ce^cpRmelyZ8 zV!Q~ZG-RuE1*AE2=fZ$2rsvlcWsT5qT`J<%*QO=?FmMawToD&5vy9j?;jYQSY_X}H z9>Kj(i!W5rtiY=Y{HaP#;eMc%>{^A~IMPeMTvjjJ8D5Eq7n=@eaMiCGL>MKdvZh?g zgwp8KQ!}QhH2o}yL-vyxu&$c;n1-9!XR3i#FqmqHw)xADGH1Od7LEkMU9M0TFAiQ- z4@tAhkhQ00;6_X<`(e&#Qr}7;dbZd(2%b8H@`nPc&rp$I87-zzYU`qig= zuE&uV)@k%vi$YjV9Fz?5&AyYQK%5-=W+D{1SnQ=4%wFzJG6MzN%~NlB36nZ8RnpT6 ziM--WAjM#r!>$@}kcaqYg@oO*^1W*E8ZTarEF2$UBFx;akmM2Z++PAuZOssmDHdTJ z*0Ys7oOSx$-LH@vFz3i59<2D2>lVC%kooHj{6*5GVZPihO-iHEi=x1NLqc&b{Y=^2 zFzfA;+JOf+cA*QPoLb)h(1I0A8_wEZ;in~W+oGvR-vrwoHZ$M2!2J2YGNl}BMp@?? z(lYxeohE6R&3i0t@xW&;U?9RTu-3D3u*s@eFDO|&jM3qKjxvRuBunmMAe&!9r3pCg z>r3{^0KJ>WYD&zEbzAC98=HKvYc;!qvor@P zluTa~*&F8<7YtFIL1|XqI#H8Esp1y8X%6uM;@nACa%2}d39oyoHz#MS>@2plC`Y{+ z*Mqn&YY$Tc*T#J9;A5QG9S>GXHmWA#iiF#w(^@=%2V1#zW ziZXRGy_hm~`U-p+nG{_@=eU!J?G`Nc16!@_JZFAUtt^*Q+PdSa+`QD)>53k|ft~z8 zT;OAPF>Oys~W z(|X7=#UICIp^CjwZn=-KGL6Y3?X)Mk^eSUf^~t$dlgZ%O+Tyx2n^5y*`Ke%O+Rok_ zcxyuH%d)>1CuF}oY=WlZJO5nr1+$> zYKF}wjFAkdY@-g>GuNrMn^Wa7YRRU`M2mK-DULUfj~h#}8RMM26zNO>%N0+Oa&*_! zn?9o>aT#&YU3!P52y*LrnxV~Kkdc*Tc}G>57H553X1>!nHqnslVxNgtrR0h0!6b~= zk*s2!5{wu<*()>5A!%*65^=B>Vx6z=TPyBh~mdnjA*#0|PlBVN$=rgRFA zy%vplomI>^Bf?XlCS-O2rlFmVj_=qQOoI||4pRcr)y|X}jr0y%!HG&q7HeoM<;(U( zasfx$huKb-gDp)izX2-4b`}uc_(F~}Yo<{dV~7F}KFwYt3#PI;PI1n@TlpVOyd*Vs_m@4O{wr_fb(5K z@FbG@@y$_NhQCc?GJ4hBwR$-|VccE1sNxWC&W30zZmttD=HfhmI+y!9;=5~Lsb5}X z(q(zyJuRfo?4DSYzU@w4uW}X^t|jBYZQMzg<&Ia=4;a^iK~`OtFxBUk5pbZ zb+c0?M)7`{^nw--9V3n{{{xS(%z-EyO+m*`3(i zQqANp$2)SdL&dz6ytfIyGSo84oL?*U0SH%;d+ zXEJTJ6JLRL<`e4Va=C^VnqaNK{SRFWvAet@Ke-X46_v5$aY`$zM3RdN481HQUzxaF z0y*m4IMAge(`{PJ;6NIfi$+i5Z`z2-(Zocc_icub=}+$qVWQUlThcN+T4DPN+Q*Pl zRdTyYImZXj0H^npTz29inUUOuA@(_hyz{YZZ+P0|FpK@@*`)MWhRmW&rM%$0L1pUF zkiLGiQJeK@#Kf{ur>jF`qoP!;i(@V(i^;xKQJh)hU8#DXwXp9i#kujj`U&r%6VU$D zHP(fAdApM9jCGl-L`-7+HeK4a-oz0-UAeTvv=2aA4a_aREJ-SxJ(t{p1%IQ6)7cU_ zroTqfxf0^$n!9T{61^alk{bdhX%FgDI@Vt!5|@)Ct(Gd7iCrynPFXM7*0ZrLacjb) zf%)cWR4TY#dMjb8<0{>zfuC-uIFs5IJhH^h1~gZ6kmksy@Az@z^2L1gqbAMLU5W2f zUV5{N{dwEkNnXe{k!mK1YolIRZ%e^y5u)W$)E>!@b&xv#7mJ)dkutMggFR=GcBA`D zWo63B_Jeg)7yFD`&;GCBQ5h$lj=rYuKGu#J|FR}MTPHJ)rzkz(HREq7xd5njQe;tw6T}oR$`_%n^Ll-Z7jJvO5#Oud{W{d$+{13 zSYoJ^anizoK~LLAPR zQ&t_Zasrmx2HK~x6OT4yCR@9u^sJd`%&aIk+AeLpI>kN0Cm9?#&}nYl4@*zduph?y z#55O1h$@P6nT(_LV=<8kWlCZsBq!ZesuxXHMjXQeQ>Lk_w~sz2NIE~jZsfrmlU`_I zXWVAZhBg~B*rXh8Yv?qSI;4+aW31km%`awiG(G5A1jzNOHkdEw0E;&+3LGMntuJT8%)YpVoTuu5~Iz%e|#2@0S0 zKeP(_)9tq>mX)=}t3b6e-Xio}cF-a@R_Ur#X6DrVq~A}q4VawYNY$E1PF@Un&Q!-c zys>+2M#Amnrg!!3e~7cCv#hSWA>8odoW&eR;46096r~#yHmuN*SUaZ5xfQu%vCN=1 zo^(yMU_7S3~ z^iNz-g^X5=7(~nt?Rd3hLdkr&EXThl0|)u{OPc?k?1B57AQlbhf%1Oi%7F(oF#DS6 z#-me+mOUqF<{BB>IPwH?ev*B58D2U|a{uFa&>Pxzro2S}*`JYG*SEH=wCKL`Fkz01L4z@Jo5|R_wNw@T+t~W?-M@+ZT~W@lz|w-= z6g%8~DM{PB;iL;uyp($>@bq@ync|aZ@*3!wK$6pf2G#Djb7FTwzl3ga+lOji?D1~~ znU`jF`{|+ky>$TjG7|-NrNw$7vyQNY{_d1a3dr@!3!gsSWXY0j@r=ABvmFTwlz*uwmKJKk;aMB@6`Gos+>GBbxW2xyOq^*ndwixJbz3#qWF9|3*%-M-KL_U6ql4e zb)EKAYkh}nhEvZB+Dvq%7Dv{)_dG-S+h zHtsKfu?p8jagtwa3OlDLU-k`Al^t|ymO{nt?3ej9cFZ-au*q*9V@TgXj#sH(q4X#BL)Pi2WcVldr3`R@b>Fw5YV7tDjxjPN z@l`hNC>;*f&3?3FKmju)r`Z`!xj9FjpLrisoORE#k&h==%B_3x!1vKa#JgxBC*50( zoEs%sXfX0LE_AXI&bwnTEt#0=hwdHO9-p#1B~LOw3gzPuGhy{H!sLMmI3{8FIi`vL z#mXnCvnQuZMV)bOI<}?a(sRu&hZ}$i#qKkOE;@U2AnlmEcJ5gNCG+`-UuIP4v>v+n z5P`!pw4$2@X)^6+@x@HW(JZggpe_&}`+2|1TX5-wHob8ir{(N{jCoUK*|{=~7X?%` z{f#YMdn5krg`MGLv{)Pr(IJPRr^MvW7V{vvFEFy%vw7W4PEP^77qq{(0KI!fa;G`cQYPy}bD7$pX=(!CQzg&; zM5UV_j>|n6Dp0_`M8ttLQ_|eMa?lLSd2%?=8l^6jD51Cf)Ys?gKx_Eqa`~HF(+AEx zuyLK}wt?Q2;F|TD*KF9}FKLlZj*VC(w0htX{xLfi9&KIL606sEo>1EdUAw>}#+@xQ z6vY|=ZP|23$KAPp+ho^2k~~?9*MR0MQWwRauhm!!;6K*dfR#~v%9%OZUErb)PS$l| zg|2JRq>U;R>9hTKZ8Tq&5>2*wnM!3JL~;Y^+skyGiRH&ciw{8fbV8S2aR?@GQ<_EC zx36j+LSzTmO58u(5|cf8mQFXeW? z0xmuk#V6CoSb2bao|-_Z_>h zxA6kR#|Kj$GH>yZUN*yFpDo>6h-2U;Ru-yOo9H{igF;B|_4q=qJI3}Dnr)CIuP7B`aQ)`X|#Cq0`%@Q}q??%s zz*)x#U}y@A^(UWAn*__K>Jp@^O%%lC(E$76vAYFXVRav^YPZJEj&2G}zGY>RgHhGEA8Kq4?Wen{+_>qYGVnebJgRnfHR%Y7Y3MspKUlD_ zx<99bea1&WnFd-H__MY$NU06OXE&aYVDLDTno(ugu&n90@r4hLxOhgauq$VrO^EJc z!cNS_j4Lo6uXI7;AK*H|Wa~p6&-7w6dK1JQFzYr!M1u5#`zTmOwyr4P&}Ce{CvC~% z5qA@fE~1fNwm+d`IA^8x!6x{nl(1OMCU z^hE#m, 2001-2010. +# Terance Edward Sola , 2005. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.23.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-04 22:56+0100\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Norwegian bokmal \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Uventet attributt «%s» for element «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributt «%s» i element «%s» ble ikke funnet" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Uventet tagg «%s», tagg «%s» forventet" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Uventet tagg «%s» i «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Ingen gyldig bokmerkefil ble funnet i datakatalogene" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Et bokmerke eksisterer allerede for URI «%s»" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Ingen bokmerker funnet for URI «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Ingen MIME-type definert i bokmerke for URI «%s»" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Ingen private flagg er definert i bokmerke for URI «%s»" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Ingen grupper satt i bokmerke for URI «%s»" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Ingen program med navn «%s» har registrert et bokmerke for «%s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Feil under utvidelse av exec-linje «%s» med URI «%s»" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konvertering fra tegnsett «%s» til «%s» er ikke støttet" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Kunne ikke Ã¥pne program for Ã¥ konvertere fra «%s» til «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ugyldig bytesekvens i inndata for konvertering" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Feil under konvertering: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Ufullstendig tegnsekvens ved slutten pÃ¥ inndata" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan ikke konvertere \"fallback\" «%s» til tegnsett «%s»" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI «%s» er ikke en absolutt URI som bruker skjema for filer" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Lokal fil-URI «%s» kan ikke inneholde en «#»" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI «%s» er ugyldig" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Vertsnavnet for URI «%s» er ugyldig" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Vertsnavnet for URI «%s» inneholder ugyldige escape-tegn" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Stinavnet «%s» er ikke en absolutt sti" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ugyldig vertsnavn" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Feil under Ã¥pning av katalog «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Kunne ikke allokere %lu bytes til lest fil «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Feil under lesing av fil «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Fil «%s» er for stor" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Feil under lesing fra fil «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Feil under Ã¥pning av fil «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Feil ved uthenting av attributter for fil «%s»: fstat() feilet: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Feil under Ã¥pning av fil «%s»: fdopen() feilet: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Feil under endring av navn pÃ¥ filen «%s» til «%s»: g_rename() feilet: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Feil under oppretting av fil «%s»: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Feil under Ã¥pning av filen «%s» for skriving: fdopen() feilet: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Kunne ikke skrive fil «%s»: fwrite() feilet: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Kunne ikke skrive fil «%s»: fflush() feilet: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Kunne ikke skrive fil «%s»: fsync() feilet: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Kunne ikke lukke fil «%s»: fclose() feilet: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Eksisterende fil «%s» kunne ikke bli fjernet: g_unlink() feilet: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Mal «%s» er ugyldig, mÃ¥ ikke inneholde «%s»" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Mal «%s» inneholder ikke XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Feil under lesing av symbolsk lenke «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolske lenker er ikke støttet" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Kunne ikke Ã¥pne konverterer fra «%s» til «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Kan ikke utføre rÃ¥ avlesing i g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Overflødig ikke-konvertert data i innlesingsbuffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanalen terminerer i et oppdelt tegn" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Kan ikke utføre rÃ¥ avlesing i g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Kunne ikke Ã¥pne fil «%s»: open() feilet: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Kunne ikke lese fil «%s» inn i minnet: mmap() feilet: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Feil pÃ¥ linje %d tegn %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ugyldig UTF-8 kodet tekst i navn - ikke gyldig «%s»" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» er ikke et gyldig navn " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» er ikke et gyldig navn: «%c» " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Feil pÃ¥ linje %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Feil under lesing av «%-.*s», som skulle vært et tall inne i en tegnreferanse " +"(ê for eksempel) - tallet er muligens for stort" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Tegnreferansen sluttet ikke med et semikolon; du har sannsynligvis brukt et " +"og-tegn uten at det var ment Ã¥ starte en entitet - unngÃ¥ ved Ã¥ bruke & i " +"stedet" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tegnreferanse «%-.*s» koder ikke et tillatt tegn" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tom entitet «&;» funnet; gyldige entiteter er: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitetsnavn «%-.*s» er ikke kjent" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiteten sluttet ikke med et semikolon; du har sannsynligvis brukt et og-" +"tegn uten at det var ment Ã¥ starte en entitet - ungÃ¥ ved Ã¥ bruke & i " +"stedet" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentet mÃ¥ starte med et element (f.eks )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"«%s» er ikke et gyldig tegn etter en «<» tegn; det kan ikke være begynnelsen " +"pÃ¥ et elementnavn" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Rart tegn «%s», forventet et «>» tegn for Ã¥ avslutte start-taggen til det " +"tomme elementet «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "Rart tegn «%s», forventet et «=» etter attributtnavn «%s» for element «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Rart tegn «%s», forventet «>» eller «/» tegn for Ã¥ avslutte start-taggen til " +"element «%s», eller alternativt en attributt; kanskje du brukte et ugyldig " +"tegn i attributtnavnet" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Rart tegn «%s», ventet et Ã¥pent sitattegn etter likhetstegnet nÃ¥r verdi for " +"attributt «%s» for element «%s» oppgis" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"«%s» er ikke et gyldig tegn etter element for lukking med navn «%s»; tillatt " +"tegn er «>»" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element «%s» ble lukket, ingen Ã¥pne elementer nÃ¥" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element «%s» ble lukket, men aktivt Ã¥pent element er «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller inneholdt kun blanke tegn" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentet sluttet uventet rett etter en Ã¥pen vinkelparantes «<»" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumentet sluttet uventet med Ã¥pne elementer - «%s» var siste Ã¥pne element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentet sluttet uventet, forventet Ã¥ se en vinkelparantes for Ã¥ slutte av " +"den siste taggen <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet sluttet uventet inni et elementnavn" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet sluttet uventet inni et attributtnavn" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentet sluttet uventet inni en tagg for Ã¥pning av element." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentet sluttet uventet etter likhetstegnet som følger et attributtnavn; " +"ingen attributtverdi" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet sluttet uventet inni en attributtverdi" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumentet sluttet uventet inni tagg for lukking av element «%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentet sluttet uventet inni en kommentar eller prosesseringsinstruksjon" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "korrupt objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "intern feil eller korrupt objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ikke mer minne" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "grense for liste av funksjonskall nÃ¥dd" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "mønsteret inneholder oppføringer som ikke støttes for delvise treff" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "intern feil" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "bakoverreferanser som betingelser er ikke støttet for delvise treff" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "rekursjonsgrense nÃ¥dd" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "grense for tomme understrenger nÃ¥dd" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ugyldig kombinasjon av flagg for nye linjer" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ukjent feil" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ pÃ¥ slutten av mønsteret" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c pÃ¥ slutten av mønsteret" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ugjenkjennelig tegn følger \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"escape-verdier som bytter mellom smÃ¥/store bokstaver (\\l, \\L, \\u, \\U) er " +"ikke tillatt her" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "tall ute av rekkefølge i {}-kvantifikator" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "for stort tall i {}-kvantifikator" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "mangler terminerende ] for tegnklassen" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ugyldig escape-sekvens i tegnklassen" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "omrÃ¥de utenfor rekkefølge i tegnklassen" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ingenting Ã¥ gjenta" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "ikke gjenkjent tegn etter (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "ikke gjenkjent tegn etter (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "ikke gjenkjent tegn etter (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "klasser med POSIX-navngivning støttes kun innen en klasse" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "mangler terminerende )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") uten Ã¥pnende (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]tall mÃ¥ følges av )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referanse til ikke-eksisterende undermønster" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "mangler ) etter kommentar" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "vanlig uttrykk for stort" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "ikke nok minne" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-regel er ikke av fast lengde" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "ugyldig tall eller navn etter (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "betinget gruppe inneholder mer enn to grener" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assert forventet etter (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ukjent navn pÃ¥ POSIX-klasse" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX elementer for sammenslÃ¥ing er ikke støttet" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "tegnverdi i \\x{...} sekvens er for stor" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ugyldig betingelse (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C er ikke tillatt i «lookbehind assertion»" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursivt kall kunne gÃ¥ i uendelig løkke" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "mangler terminering av navn pÃ¥ undermønster" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "to navngitte undermønster har samme navn" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ugyldig \\P- eller \\p-sekvens" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "ukjent navn pÃ¥ egenskap etter \\P eller \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "navn pÃ¥ undermønster er for langt (maks 32 tegn)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "for mange navngitte undermønster (maks 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "oktal verdi er større enn \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-gruppe inneholder mer enn en gren" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "repetering av en DEFINE-gruppe er ikke tillatt" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistente NEWLINE-alternativer" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g etterfølges ikke av et navn, eller tall større enn null, i " +"klammeparanteser" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "uventet gjentagelse" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kodeoverflyt" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "gikk ut over arbeidsomrÃ¥de for kompilering" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "tidligere sjekket og referert undermønster ikke funnet" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Feil under treff pÃ¥ regulært uttrykk %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8-egenskaper" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Feil under sammensetting av regulært utrykk %s ved tegn %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Feil under optimering av reguært utrykk %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "heksadesimalt tall eller «}» forventet" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "heksadesimalt tall forventet" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "mangler «<» i symbolsk referanse" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "uferdig symbolsk referanse" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "symbolsk referanse med null lengde" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "tall forventet" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ugyldig symbolsk referanse" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "feilplassert siste «\\\\»" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ukjent escapesekvens" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Feil under tolking av erstatningstekst «%s» ved tegn %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Sitert tekst begynner ikke med sitattegn" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Ubalansert sitattegn i kommandolinje eller annen skall-sitert tekst" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst sluttet rett etter et «\\» tegn. (Teksten var «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teksten sluttet før likt sitattegn ble funnet for %c. (Teksten var «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksten var tom (eller inneholdt kun blanke tegn)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Feil under lesing av data fra underprosess" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Feil under oppretting av rør for kommunikasjon med underprosess (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Feil under lesing fra \"child pipe\" (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Feil ved skifte til katalog «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Feil under kjøring av underprosess (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ugyldig programnavn: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ugyldig streng i argumentvektor pÃ¥ %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ugyldig streng i miljø: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ugyldig arbeidsmappe: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Feil under kjøring av hjelpeprogram (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Uventet feil i g_io_channel_win32_poll() under lesing av data fra en " +"underprosess" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Feil under lesing av data fra underprosess (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Uventet feil i select() ved lesing av data fra underprosess (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Uventet feil i waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Feil under kjøring av fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Feil under kjøring av underprosess «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Feil under omdirigering av utdata eller inndata for underprosess (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Feil under kjøring av fork() for underprosess (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ukjent feil under kjøring av underprosess «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Klarte ikke Ã¥ lese nok data fra underprosessens pid-rør (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Tegn utenfor gyldig omrÃ¥de for UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ugyldig sekvens i inndata for konvertering" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Tegn utenfor gyldig omrÃ¥de for UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Bruk:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[FLAGG...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Flagg for hjelp:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Vis flagg for hjelp" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Vis alle flagg for hjelp" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Flagg for applikasjonen" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan ikke lese heltallsverdi «%s» for %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Heltallsverdi «%s» for %s er utenfor gyldig omrÃ¥de" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan ikke lese verdi for double «%s» for %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double-verdi «%s» for %s er utenfor gyldig omrÃ¥de" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Feil under tolking av flagg %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Mangler argument for %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Ukjent flagg %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Gyldig nøkkelfil ble ikke funnet i søkemapper" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ikke en vanlig fil" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Filen er tom" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Nøkkelfil inneholder linjen «%s» som ikke er et par med nøkkelverdier, gruppe " +"eller kommentar" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ugyldig navn pÃ¥ gruppe: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Nøkkelfil starter ikke med en gruppe" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ugyldig navn pÃ¥ nøkkel: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nøkkelfil inneholder ustøttet tegnkoding «%s»" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nøkkelfil har ikke gruppe «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nøkkelfil har ikke nøkkelen «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Nøkkelfilen inneholder nøkkelen «%s» med verdi «%s» som ikke er UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Nøkkelfilen inneholder nøkkelen «%s» som har en verdi som ikke kan bli tolket" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Nøkkelfilen inneholder nøkkelen «%s» som har en verdi som ikke kan bli tolket." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Nøkkelfilen inneholder nøkkelen «%s» i gruppen «%s» som har en verdi som ikke " +"kan bli tolket." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Nøkkelfilen har ikke nøkkelen i «%s» i gruppen «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Nøkkelfilen inneholder skiftetegn ved linjeslutt" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nøkkelfil inneholder ugyldig skiftesekvens «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vedien «%s» kan ikke bli tolket som et tall." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heltallsverdi «%s» er utenfor gyldig omrÃ¥de" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Verdi «%s» kan ikke tolkes som et flyttall." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Verdi «%s» kan ikke tolkes som en bolsk verdi." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Tellerverdi gitt til %s er for stor" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Strømmen er allerede lukket" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operasjonen ble avbrutt" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Ugyldig objekt, ikke initiert" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Ugyldig multibytesekvens i inndata" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Ikke nok plass i mÃ¥l" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Avbrytbar initiering er ikke støttet" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Ukjent type" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "filtype %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "type %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Uventet tidlig slutt pÃ¥ strøm" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Uten navn" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop-filen hadde ingen verdi i Exec-feltet" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Kan ikke finne terminalen som kreves for programmet" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan ikke opprette konfigurasjonsmappe %s for brukers program: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan ikke opprette brukers konfigurasjonsmappe %s for MIME: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan ikke opprette brukers desktop-fil %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Egendefinert definisjon for %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "stasjonen implementerer ikke utløsing" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "stasjonen implementerer ikke eject eller eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "stasjonen implementerer ikke sjekk om medie er satt inn" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "stasjonen implementerer ikke start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "stasjonen implementerer ikke stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GEmblem-koding" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Feil antall tegn (%d) i GEmblem-koding" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GEmblemedIcon-koding" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Feil antall tegn (%d) i GEmblemedIcon-koding" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Ventet et GEmblem for GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operasjonen er ikke støttet" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Omsluttende monteringspunkt finnes ikke" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kan ikke kopiere over katalog" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kan ikke kopiere katalog over katalog" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "MÃ¥lfilen eksisterer" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kan ikke kopiere katalog rekursivt" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Splice er ikke støttet" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Feil ved bruk av splice(2) pÃ¥ fil: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Kan ikke kopiere spesiell fil" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ugyldig verdi oppgitt for symbolsk lenke" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Papirkurv er ikke støttet" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnavn kan ikke inneholde «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volumet implementerer ikke montering" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Ingen program registrert for Ã¥ hÃ¥ndtere denne filen" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator er lukket" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Filenumerator har utestÃ¥ende operasjon" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Filenumerator er allerede lukket" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GFileIcon-koding" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Feil inndata for GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Strømmen støtter ikke query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Søking ikke støttet pÃ¥ strøm" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Avkorting er ikke tillatt pÃ¥ en inndatastrøm" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Avkorting er ikke støttet pÃ¥ strømmen" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Feil antall tegn (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Ingen type for klassenavn %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s implementerer ikke GIcon-grensesnittet" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s er er ikke en klasse" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Feil versjonsnummer: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Type %s implementerer ikke from_tokens() pÃ¥ GIcon-grensesnittet" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Kan ikke hÃ¥ndtere oppgitt versjon i ikon-koding" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Inndatastrøm implementerer ikke lesing" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Strømmen har utestÃ¥ende operasjoner" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Ikke nok plass til adresse for plugg" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Adresse for plugg er ikke støttet" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Klarte ikke Ã¥ finne forvalgt type overvÃ¥ker for lokal katalog" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ugyldig filnavn %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Feil under lesing av informasjon om filsystem: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kan ikke endre navn pÃ¥ rotkatalogen" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Feil under endring av navn pÃ¥ fil: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Kan ikke endre navn pÃ¥ filen. Filnavnet eksisterer allerede" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ugyldig filnavn" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Feil under Ã¥pning av fil: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kan ikke Ã¥pne mappe" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Feil ved fjerning av fil: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Feil ved plassering av fil i papirkurv: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kan ikke legge katalog %s i papirkurven: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Kan ikke finne toppnivÃ¥ for papirkurv" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Kan ikke finne eller opprette mappe for papirkurv" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kan ikke opprette informasjonsfil for papirkurv: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kan ikke legge fil i papirkurven: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Feil under oppretting av katalog: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filsystemet støtter ikke symbolske lenker" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Feil ved oppretting av symbolsk lenke: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Feil under flytting av fil: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kan ikke flytte katalog over katalog" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Oppretting av sikkerhetskopi feilet" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Feil under fjerning av mÃ¥lfil: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Flytting mellom monteringspunkter er ikke støttet" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attributtverdi mÃ¥ ikke være NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Ugyldig type attributt (streng forventet)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Ugyldig navn pÃ¥ utvidet attributt" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Feil under setting av utvidet attributt «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Feil ved henting av informasjon om fil «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ugyldig koding)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Feil ved henting av informasjon om fildeskriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ugyldig type attributt (uint32 forventet)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ugyldig type attributt (uint64 forventet)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ugyldig type attributt (byte-streng forventet)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Kan ikke sette rettigheter pÃ¥ symbolske lenker" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Feil ved setting av rettigheter: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Feil ved setting av eier: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolsk lenke kan ikke være NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Feil ved setting av symbolsk lenke: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Feil ved setting av symbolsk lenke: filen er ikke en symbolsk lenke" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Feil ved setting av endrings- eller aksesstid: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-kontekst kan ikke være NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Feil ved setting av SELinux-kontekst: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux er ikke slÃ¥tt pÃ¥ pÃ¥ dette systemet" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Støtter ikke Ã¥ sette attributt %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Feil under lesing fra fil: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Feil under søking i fil: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Feil under lukking av fil: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Kan ikke finne forvalgt lokal filovervÃ¥kingstype" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Feil under skriving til fil: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Feil ved fjerning av gammel sikkerhetskopi av lenke: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Feil under oppretting av sikkerhetskopi: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Feil ved endring av navn pÃ¥ midlertidig fil: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Feil under avkorting av fil: «%s»" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Feil under Ã¥pning av fil «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "MÃ¥lfilen er en katalog" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfilen er ikke en vanlig fil" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Filen ble endret eksternt" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Feil ved fjerning av gammel fil: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Ugyldig GSeekType oppgitt" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ugyldig søkeforespørsel" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan ikke avkorte GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Kan ikke endre størrelse pÃ¥ utdatastrøm for minne" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Klarte ikke Ã¥ endre størrelse pÃ¥ utdatastrøm for minne" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Mengden minne som kreves for Ã¥ prosessere skriveoperasjonen er større enn " +"tilgjengelig adresseomrÃ¥de" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Forespurt søk før begynnelsen pÃ¥ strømmen" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Forespurt søk forbi slutten pÃ¥ strømmen" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount implementerer ikke «unmount»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "mount implementerer ikke «eject»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount implementerer ikke «unmount» eller «unmount_with_operation»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount implementerer ikke «eject» eller «eject_with_operation»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "mount implementerer ikke «remount»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount implementerer ikke gjetting av innholdstype" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount implementerer ikke synkron gjetting av innholdstype" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Vertsnavn «%s» inneholder «[» men ikke «]»" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Ut-strømmen implementerer ikke skriving" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Kildestrømmen er allerede lukket" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Feil under oppslag av «%s»: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Feil under omvendt oppslag av «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Ingen tjenesteoppføring for «%s»" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Midlertidig ute av stand til Ã¥ slÃ¥ opp «%s»" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Feil ved oppslag av «%s»" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Ugyldig plugg, ikke initiert" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ugyldig plugg, initiering feilet pga: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Pluggen er allerede lukket" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "lager GSocket fra fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kunne ikke lage plugg: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Ukjent protokoll ble oppgitt" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "kunne ikke hente lokal adresse: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "kunne ikke hente ekstern adresse: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "kunne ikke lytte: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Feil ved binding til adresse: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Feil ved godkjenning av tilkobling: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Feil under tilkobling: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Tilkobling pÃ¥gÃ¥r" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Feil under tilkobling: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kan ikke hente utestÃ¥ende feil: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Feil ved mottak av data: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Feil ved sending av data: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Feil ved lukking av plugg: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Venter pÃ¥ tilstand for plugg: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Feil ved sending av melding: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage er ikke støttet pÃ¥ windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Feil ved mottak av melding: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Ukjent feil ved tilkobling" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Lytter er allerede lukket" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Tillagt plugg er lukket" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GThemedIcon-koding" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Ventet 1 kontrollmelding, fikk %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Uventet type data" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Ventet en fd, men fikk %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Mottok ugyldig fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Feil under lesing fra unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Feil ved lukking av unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filsystemrot" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Feil ved skriving til unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstrakte unix domenepluggadresser er ikke støttet pÃ¥ dette systemet" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volumet implementerer ikke utløsing" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volumet implementerer ikke eject eller eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Kan ikke finne program" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Feil ved oppstart av program: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIer er ikke støttet" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "endringer i assosiasjon er ikke støttet pÃ¥ win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Oppretting av assosiasjon er ikke støttet pÃ¥ win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Ikke nok minne" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Intern feil: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Trenger med inndata" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Ugyldige komprimerte data" diff --git a/po/nds.gmo b/po/nds.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9dd629cfae62ba3e45e382ba750e8936a7c051ff GIT binary patch literal 4710 zcmbW3O^h5z701iLA!LCBVuFDXs5q>5O)~2luM=-3j$`k7*IwD)HQw1EAc^Risp)B^ zr>d#$p7rLyEgUQ%l%Q~d0|Dn2DHkx8aLMo?S&9@1Ar1(H1d%u(BqT18IPm{hS9^Lk z@r9Plzp1ZRuii(!{mXs(UlI70(LRs%=p90Q4LrFY|Ka<|okAP{Uj^?1f8qHn&);~y z?fD1KKZ75|`geW*-{5D_e-Hd3c;LfA90nJ`Pk~;DCQ9K7=*kOdw9*?$=1 zISud=;8~DzwtYVWdF~6I-v_DBb?`y(w;<*H9sC0LACU46+%3c>!NcIg;1WnZp9Sv+ zGe3U~_@$@{%`&f|od=YeVJa2-`pMQXqdk2JY{sHh1_ykBjo&~A@4oJIw52T)N zfKWmF4nzowKY|kcD@Z@?!{PML-5`z-_k(bOI1J*SSoHlh-`@iFVVtt6-{a^s{Qz9x z&Y-?eqw$`{&>ll;pi!^#tKr9j?@)h!XVB;?>c^b@5E^Yve^R&dqu=-)MZ@#u;)gMD z3hg8sKd9^Cg1?v0Xghw4Iojn*?BIJ8?IARnMIg1rX*7QH6`n5l(GRpazvBg5Of$Y{ zLw--9Eu%ewR!5^x8MjCuaRO})t^8>3r_d03!auv>%lJ)y3OOI?Q4mL6sdUG5BOM+Q zvkQ%$TwN}B&hvujCC|&AEije6C|22SqWIf!ZZ@5hQ7W~`WFU(ZbTCv>+-{~R=Vm)| zQk;=(V+O;(4rI?*xqW3F6A%`}Rt4Q%sjfz8mWne;5=WgNi;R|=36VC%N}%U5D5JYF zn9TcOlPE2_kyV|{*j+zpmD9=^=vkS|)65KIS3y+dj-V>DsaVzdP}u+ic)3n&Qq>i! z)}qf2%;!webZd)Yqcu*%OjG)mp~~2IE7RRHQ$rc)o~dlYo#IFf6GA_9lC~kH`!JtE9aYvox znbLDFt@Bu#>jaw1aG87OS-cCAWNv6(Ou z8UH&0VlmJi6~nh;t8aFYEwSv=vZlz5VsvVxMdvVE;2ob-)gd@6nA}wCnJV&n>K3iO znq(_>`-ep!gNt_{&6C8~3@UExfi^oZv`Z1(pi^YYt%*WwI<{QuUX^W4S91R?S#pn6 zw$mU~P4SJ*%dPdzjfI7U=LFt0CCy0LUTk(mG!cpFX9mur#g#>&c*z2e7dSS?a|V1`McBel>~ryxUzIgC|nsbJWY z7ZEk*lpO|Ip48p623v)$dphQWyO5gPb`(N6R0~>Vr)Dm#Us|15p|Mb(SuwD!hGM7$ zO_`~y+0i5pBK@T7^aGo!?5XY6T5V~vju+@DTU+(Drzw}(Q8pvyb=2w0V88%Z@&f#a zcl!S-Of+_c*byj9P)n56XP{6F`~g;O1i`R6H9b>Srd4dYsBjH6z^~r;hDC*#gnSr{ zP(uPFXdE+8LK_T+2;{WWH%2Sn6c@&CYLp->DW|2oD5?zRE7OS83{R9s7P$o`8A8`` zg)3GFKfgpn`C{4lI^X0_3dbGC~<1rDO zMRz7muH`6)<;o58VpY6bM<+^ef~nXo z@uHQ9Xkd}LbVpHAea7sl+{$3owoG?%1_kx}9(TagI}xK(+, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-18 13:53+0100\n" +"Last-Translator: Nils-Christoph Fiedler \n" +"Language-Team: Low German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Een Leseteken för de URI '%s' givt dat all" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Keen Leseteken funnen för URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "De URI '%s' is nich akerat" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nich akerater Hostnaam" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datei \"%s\" is to grot" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Dat Opmaken vun de Datei '%s' is fehlslagen: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Künn de Datei '%s' nich opmaken: open() failed: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is keen akerater Naam" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is kee akerater Naam: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fehler in Reeg %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "keen Spieker" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "Binnenfehler" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "unbekannter Fehler" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nix to wedderholen" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "Code Överlööp" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nich akerate Reeg in Umgeven: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nich akerates Orbietsverteeknis: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Künn nich opgaveln (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Gebruk:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Hölpoptschoonen:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Hölpoptschoonen opwiesen" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "All Hölpoptschoonen opwiesen" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Programmoptschoonen:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Unbekannte Optschoon %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Keene normale Datei" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "De Datei is leer" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nich akerater Slötelnaam: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "De Operatschoon weur avbreken" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Unbekannter Typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s Dateityp" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s Typ" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Ohn Naam" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Eegen Definitschoon för %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Tääldatei givt dat all" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Tääler is sluten" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Nich genug Spieker för Sockelanskrivt" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nich unnerstütte Sockelanskrivt" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nich akerater Dateinaam %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Künn dateisysteminfo nich kregen: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Künn root Verteeknisnaam nich ännern" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fehler bi'm Naam ännern vun de Datei: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nich akerater Dateinaam" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Künn de Datei nich opmaken: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Künn dat verteeknis nich opmaken" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "(nich akerate Koderen)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Künn de Datei nich sluten: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Tääldatei is een Verteeknis" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Tääldatei is keene normale Datei" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Nich akerate Sökanfrage" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Fehler bi'm Verbinnen:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Unbekannter Fehler bi'm Verbinnen" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Dateisystem root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Künn dat Programm nich finnen" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs nich unnerstütt" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Nich genug Spieker" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Binnenfehler: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Bruk mehr Ingaven" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "" diff --git a/po/ne.gmo b/po/ne.gmo new file mode 100644 index 0000000000000000000000000000000000000000..07614c572e11a8818953dd5390d8f5fdb4a755af GIT binary patch literal 23563 zcmdU$e~?{edB=|^RpU?8s)*G?AZ&uUn;!&-yCM7tATdA?gQ#fZ-QBahm)yN~x%X~D zthInusfe^z#26(+?n(*XmvpXYg>-|u^Ozw?Uc-5K$-o9p#l-+XQqeIES4^ZAdT|9D{(y$k#a zxD(vAEQ+e&1K_K`m%J#7Hh{~)HQ=@2YVf1r8Q|Z5tH7thQ^6Bo97QoW0A2`Q2Hp*R z3>*emy(EeT!2~=L{8YGq0uM1+M4*o8S=m3s7{2UKT|cfFA%w_iNy_ z;Qs`C+smV99ru3)t^uD0&j(+0QWTvHZUeW1H-moxJ_()zzV{Wr?!92l{U^ZJfDeIs z{}141@VnpuxcrsAp0|Q;;C?SCKA!=lmv4iogD0TO72p8Kqv#6oRIm!Z8T=3^eS9t4 z{{WP|mj8YfRlxJXH-S^&$H0A{^nd!R{rNWVEbjM!r-2WEqW>*Wa{L6`2%f@X#BT>U z2z~-Y<phE zTyO{XY6-HPIUI`*%vb`;zP zPJurM>)UpWr_t z-(BZGi~A84Ej=9quK=F{_5AcVyPsbVicS}lK3;%PuLpO58ut`<0DL{hY=D0Y*1$Jy zBDa8df-EU|#d)4zE(CXRzYlx|c;aTC_a0FG@g#U1_{Y-$;%j4je!3`+;Q{eZ(kAQ!KvOW%;fRSDY-U03g z?+0;(=v0VGZ`XmM`y_Z5c=9`==+oerK~x%D_AX)+yd5MoqF26~ngVVDUkQF6{1EuR z;7#BMQT~g-Uw|yfeBfkIy3x-vF3m%1`@#J7)8c>G1NSz2yvLsUeE|p5`~Ot_C#~3zbiSPnx5<9aex|u@uutCWJeSX>aLG<@2+xNC3SP{$hUugx1tCTfki+K7{SGLuz4W5aC*948?AO~%|^U^TF@Sfwp1Gf zop`K?Mq1T9aVx2g#jJi}XRWyt#Wfm9eWxDotk)XJ&UUAT_Le@W)7+Uf#x!0A8ErOp zC#_CAj))`G(Os^VPLmg7NjvG-eL8r$+G35hMkkrTa#(UE@$uu$R=lDeZE@jZ>^fCz zR69vqa#v&Kb!ydmZUc=B_HWK~;^sIDZA>IMLo2>!$EB5Z=NxUs#=?MBGM==O#;Am; z44#R%jWuDd)Mfwa(tS5-07^>NFB&6sqm` z4DN=bEoPdwTw}b|oXWL_L~a*REJjy*W_r5WVv)?9sry3YdN^1Tuc*(&BYR~NW|>co z*Xl{Ud_{YCVR&;oX{1h}=oDjP5m+6=&>^|R#m&(f3s`i3u4Wp^jnfH%KZXXY<4ORE zkK~4#YP}t|YZI(BPY5WsgLjY2Aie^A7}FFUnFB7$q1I^E%>1LxDU$;Knr<~mlXhDM z;dQ4qGpev#5}96kmN==DvldfGDsGnMDl&(;PIY2%Dcmg6StjaKCoG&&<}%`<6t17a zx7{RowD|!siHD33sk`KHn-(XqXHx!@uOYYH(G6vx7DUAlI<p(u8vc8v*1gV2}Vsl<)x(o3J2+J(~9<*%{kpEX~rv%r-aNt@ycXyVldt` z(roV9yegj|ag(WO0vv}U#dfM>>an=l!0S;HK{#CE9FuKqb&SW`az|%c zB(@H-%pU2&RXk+Q1?Lkcg|THS(IqArWR-vh&KMpbpClwVugvzmMwY0yk|EDT@fkPF zG&{rb8Fl?Pq5rDW&Gv9~iPQKk%9)q6T4;Q1MkO(%F(pt-MgER#s^n!j11627$vS~G1iOs1gkLtOl(tOU1HC(v(7+KPUJd%)or<%JH1en-4(?FVC zD_2o~i5{2fQu`>6Rkf!q@~JFYymCc*Ra6*fK3x!E+&pPPvWQJeEsSSD1#13!x<*}6 zMON~hX;_=Wnk)oHiS@BGmG(-L+?b3iWtRu3&@63a&*D;YlS!Q_E2a~z>QpZ&1l`s5 zSy_r6+7slpEKjx7h!m7EPPOhVq{FG|baCty_X`cR*v;sgO82yCa*&~Td`xebHq-nu zH&dDHv65Pht@nAMnOd!kH98r$>1MF`WOX+sfrLRS9ji^yqo*0a(4gcU*~&9cTYuJu zVJ}5D(%00JRdhWVaN9;o1VOB~kg6-F{?G-oCz z<9U>6|IF`u{KV#jF3coQY%Dk?vvrTfjEc%wd+*dplg3}E$Xo7tBR$|_I>>2t$Su@t zAI5vaYMu~klyc8h?(n=c!Ja|y7VUl-V2d>RVvdBGuGL&kMOOE^~0tMDEY`qx^mkOrVr8-p@*i}^u?0M`GyL8QvxTv zdEISQflQH>jf|jezBD#z?5?$%4Rx6%mV3xcDg{{rx3}Apy>6q>9H3F(2axf@#t3G# zCDNPfRWyG_Ei6CG%+_YD!TjO7V5wIUcB0jsnf5ym?n#;t>(XdDU_9!ZLrRr)FRkfT zLdQPXM}~~(@gk!wmkVODI@xe|pq=5yK0;VMpFg}BBVEObO;>BJ)xPZ2-jmsWpbxQ` zMz)Lc-J^_GR%y1ov|O0$GN)D^kt*qE@5`3yGun5L-h=vLqRW%<4!uN+ot4Ljwz!tn zFtg>Gk(qI}$I%rv-}7WX9ro;3+Nn${nV2EOCjP^Ix6~Jomj# z0-&PgMx7KTZJihuwCqhlS!~o@xux(JoIRQH8NUBk_|~uHEWI0 z`iz}_44gJ#RHv(*Nox??g5glMAeIJ1*JP(Oabg=Pm5k!)Bj>eet=~D#Ne%6RvW!)@ ztV?5)UECk^rPn4)jHU8h3`pLAXTI)>L#vo!{&^3)+jpiOovB~V)1_@RY#t*#G zq4|F9nufV1F;$KnC1q`Zbhu}Q1`ldtkQQ#A)aw=VV-LjWns#*}8H(PKAB^@bq%n?N zjX5)@C)LK_5{EZtrbd$1V07K~t9ESNe&yic;CrL1TFvWGVrA=Cb!!J3$+D{x9ST;iXiwC}Di_U6v@1KBL-De!w(qEHLHRoUs$5J|55?=(u3KAK zdsb!rIq|x6LmM_$)^1q4mVuS4lif9u&&I7ihj*3r=f-Q-4y|4LrnP5pID6UUoXu2r zaFE+3M>JbQ@!Kc&vQOLAs_0tFmM7G^9<`}9ZBl(x|^owu@a>Urx{EsN&5cg%JFY_5A?uKRWSK4Y$X z=iKb=bKQq{FxP!}ZuX<;6NWq-&voyg>+Ua%VD2H$KXct9bF;V3b?>v8hvvFZFp~*K zq4)UQ>}_*hxEva0Fl@hK)E|K}_XX+Zx?TN~a7TCp0|b1KPxsrihl9Y~2krK-54p?M zz?4JWeU`VAOAj!iN}k@T=xO9)t79M9=CU=$XpkhA9X8NQX{zrdNWt1Z|8qssw^cCuxo!M)F z@fp-&M{%u7bOjY#t&gj-HjEmKa>>`_e?< z6$1MQm$z~t?cV|GVUxg95s`~OgbIYGARVN5iVL$~3IFG!qD5MU&{GE8Yfltni@8Q> zc?Bh$)8cCqyE>H@C64H;)bSK~5aDKS@?aF3t~{v}b%i{rK>G^sDU~)$RGA_*FGNy| za8%_`jy>&*T}B6sA%W+JpuoOLV1&Dk^Z;k)86+tPFHT+>wCHGYow>xQ_&{%BTY475 z+{o=dG3y$JEWHedRiPw{A|*T?q32$II;a0;-7lCK$XDx5=NswNc+4SdU?1t%BboIa zOsVKIFY@JbQ*yT`$ereA-DZxN=~;==xP)A6=JOTsM5g~VhB8-06t}C4#Uc(x@6+K~ zD%^oM+y>Jf7Z$Od4H^rq{HXDL%;HF*VSD8F25o-JXtO*b(Sh>cXU!(Q-p9Eovi9?c zPjYipCh^Aymd-m54^5;6$eiAvdgk%MpnR0AHpH~M0;GJNh6JZq4@$>_{Z#m*EZ1w^ z#6&$&d%(nYLWo5UxQUsRGU*_b%M$|YMNyKDcODyVO_CipLtxnuQ5co4uekhQ*}|hV zOD=52#pIG%5Zz6|QhdEQgI2wptzK=a#CXv8r^hVs-Gkt19?);w&Cdlq zvMs=I60=|I_ZpUaRwFTCPS=fgf=m2*A~lqbH1#XQa(PS{v$rdJ^g`*k6icK&Dl~5u6m zv>7cfH|VtF_a#fDrN5^cqtXx?#OrnPvJbl@Insi|KO2ueD z*AdST^jf$p#+C1u2B{01>(1IdRUxl^c@^?n&6JY6?TyvJNilej>jvRiNJ_$f6G^)~ zQE;_rjcOo{nDOr8Q~$ZyIRqm}unJRCzSJJfPiy7P_d>tRv=D7)>RxkSTGQQjSTuNl zsTGyPERFEQA~>CAW^L|%ySF~(!linbbz2YFT7Gx7K3R8!1w3#RCSDG4Az~L(nwx|u zQK&KrQyt(%Xv19>cq5yYG0Yc?9YVNw^g+`RqoKq9L<%&a#_dgMQ<0V!y$Yum3sA#* z`kmk)IbxF*vlF-lgwn65g@`Zg!^|sv1GWJBbPM8I%5oS?)pZs~W$8p~M9p??-Lokh zD*S$1h%b?NBzG{R33H)LryFPc8vB1+P99C^b|Ld(&c$K93jgi4WH*J}LS+NkVL@cK~77 zGlYz1c@fVh&tgdo01oa`dZ6B`+=YLF!IF=lvp|?kJwjx}7~4kQhqklCh8pnKzAx!|_U+ zuc{TgJ$=PTPt2NUgyUG_#O@8x#Kjf$_}o4lp#Vg9 zX1J6(J?GIqc4CWpt-p5++DD(mP|rnNCR97fE(!uDU9u$brc z1G##>U^NF@@XJ}xOn9uCFqT42$#R(P-GPhWPA-X``38b=d}oenQL;qxI1(<+5>biE zlJA0oLuH#9G=F4nmT=cD+hv8H@)d8GjL&6}`Cw#E^YJ=UNHf6!4L660dxxQQB*_}V zoE}`#IU#(Wwdnn%^+jZ?{Ya9qW`V92E%UJ5yG*RXGtq6OjbBMep7;Ei3~6toa0JdLqOwo`BekKjB;nhybCIp5hBG)2r z=etw9I-~{6TPRHJ`)#R2*e(bJ4;A%~J(ecrR`Gh_RARjgHg zh`FsFk1j=tzl$;lU77aHjaWKys}}5-mm?h=itRT5neMqtp&#|3wWKgfePThQJIDFt zE144@2w_RmJV-#PQO-S1cS<1ud5CE9Zi`qAUxnr?NDs-E;sq|OC*N5qBqgkRm3~%( zL6{vbegVQnPZB5|wUH;X-%sqPfF;SqM1l(^Hwvm!S)k>I#`6qaHcm!k-nbBx=n2d7 zFT_kV-ykfvPg*q~;92I*V%z`l97X@P0Ow5wM?u^W9pg{J5c_5W* z7P`ofw}-I9y%`e%fR_-=(%`%*60E6Kadr3%=kTq8&DF~C?-}u5mi=HFq-ZJp)&q+t zln}w$J?1fHnO5Rpk+86WZS=P;tPa&4o510lnIL5d(@PUx-r|= zgZ!>PQZ~*p~ZWA zBF(0=Vur}96HOgN7=O==e8x4xjdx%Y^KeKRv)y>5k+Pv-acB);lu}kj`AZ8ah7olv zlCJ{!qcyV$B9jAoGq2>?ncSD8hz0A2+_4Y?HVpyD{LJ!1+qFOJGuKG_qk?)^ zUdXGwbPXJE=BN(hWr?G749do>Sl&&D%&-USULj!Ig1d&qTM&@H5@d8A>#^K4K=sXNQ@%01HA z{^Lgke>Oyxs&o6RNq8s+r{;58cr=kRv=T;G&5(c7vdE0A$-hUr+omp{;Xb1viNRqQ zT2B2&gB^r>EGwya;`G!MR?n=!HAFrHc=p*!-@;HVa3R)0%aEzlt%D?9Er$s9K*Uw0zHx$g+XXJ9C$6toh->?2ZHS_LI literal 0 HcmV?d00001 diff --git a/po/ne.po b/po/ne.po new file mode 100644 index 0000000..7d5abb6 --- /dev/null +++ b/po/ne.po @@ -0,0 +1,2117 @@ +# translation of glib.HEAD.ne.po to Nepali +# This file is distributed under the same license as the glib package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Jyotshna Shrestha , 2005. +# Ganesh Ghimire , 2005. +# Shiva Pokharel , 2005. +# Kapil Timilsina , 2005. +# Jaydeep Bhusal , 2005. +# Shyam Krishna Bal , 2006. +msgid "" +msgstr "" +"Project-Id-Version: glib.glib-2-10.ne\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2006-04-27 00:00+0545\n" +"Last-Translator: Shyam Krishna Bal \n" +"Language-Team: Nepali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.10.2\n" +"Plural-Forms: nplurals=2;plural=(n!=1)\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "विजोड क्यारेक्टर '%s' ले,'%s' तत्वको गुण नाम '%s' पछि अपेक्षा गरिएको एउटा '=' " + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "वैध कुञ्जी फाइल डेटा डाइरेक्टरीहरूमा फेला परेन" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "क्यारेक्टर सेट '%s' बाट '%s' मा रूपान्तरण समर्थित छैन" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' बाट '%s'मा रूपान्तरणकर्ता खोल्न सकेन" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "आगतको अन्त्यमा आंशिक क्यारेक्टर" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फलब्याक '%s' बाट कोड सेट'%s' मा रूपान्तरण गर्न सक्दैन" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"file\" योजना प्रयोग गर्ने एउटा निश्चित URI होइन" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानीय फाइल URI '%s' मा एउटा '#' समावेश नहुनसक्छ" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' अवैध छ " + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' को होस्टनाम अवैध छ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' मा अवैध रूपमा निस्किएका क्यारेक्टरहरू देखिन्छन्" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "बाटोनाम '%s' निश्चित मार्ग होइन" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "अवैध होस्टनाम " + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "फाइल \"%2$s\" पढ्न %1$lu बाईट्स बाँडफाँड गर्न सकिएन" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' फाइलबाट पढ्न असफल : %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s'फाइल खोल्न असफल : %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' फाइलको विशेषता पाउन असफल: fstat() असफल भयो: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' फाइल खोल्न असफल : fdopen() खोल्न असफल : %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फाइल '%s लाई '%s' मा पुन: नामकरण गर्न असफल:g_rename() असफल: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "लेख्नका लागि '%s' फाइल खोल्न असफल : fdopen() असफल : %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फाइल बन्द गर्न असफल : fबन्द गर्न() असफल : %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "अवस्थित फाइल '%s' हटाउन सकिएन:g_unlink() असफल: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s ' टेम्प्लेट अवैध, एउटा '%s' सम्मिलित हुनु हुँदैन" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' टेम्प्लेट XXXXXX संगसमाप्त हुँदैन" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "`%s' बाट `%s' मा रूपान्तरणकर्ता खोल्न सकेन : %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string मा परीक्षण पढाई गर्न सक्दैन" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "पढ्ने बफरमा छाडेको अरूपान्तरित डेटा " + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "आंशिक-क्यारेक्टरमा माध्यम टुङ्गिन्छ" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end मा परीक्षण पढाई गर्न सक्दैन" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' फाइल खोल्न असफल : खोल्न() असफल : %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' फाइल नक्सा असफल : m नक्सा() असफल : %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "लाइन %d क्यारेक्टर %d मा त्रुटि: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "अवैध UTF-8 सङ्केतन गरिएको पाठ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "लाइन %d मा त्रुटि: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-*s' पद वर्णन गर्न सकिएन, जुन एउटा क्यारेक्टर सन्दर्भ (उदाहरणका लागि; ê) हुनु " +"पर्थ्यो - संभवत अङ्क ज्यादै ठूलो छ" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"क्यारेक्टर सन्दर्भ अर्धविराममा सकिएन;तपाईँले धेरैजसो ऐम्परसेण्ड क्यारेक्टरबाट एउटा अस्तित्व सुरु " +"गर्नका लागि प्रयास नगरिकन सुरु गर्नुभयो - & को रूपमा ऐम्परसेंन्ड निकास गर्नुहोस्" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "क्यारेक्टर सन्दर्भ '%-.*s' ले स्वीकृत क्यारेक्टरको सङ्केतन गर्दैन " + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"खाली अस्तित्व '&;' देखियो; वैध अस्तित्वहरू निम्न हुन : & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "अस्तित्व नाम '%s' ज्ञात होइन" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"अस्तित्व अर्धविराममा सकिएन; तपाईँले धेरैजसो ऐम्परसेण्ड क्यारेक्टरबाट एउटा अस्तित्व सुरु गर्नको " +"लागि प्रयास नगरिकन सुरु गर्नुभयो - & को रूपमा ऐम्परसेंन्ड निकास गर्नुहोस्" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "कागजात एउटा तत्व बाट सुरु हुनैपर्छ (जस्तै: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"एउटा '<' क्यारेक्टर पछ्याउन '%s' वैधानिक क्यारेक्टर होइन; यस्ले एउटा तत्व नाम प्रारम्भ " +"नगर्न सक्छ" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"बिजोड क्यारेक्टर '%s', एउटा अपेक्षा गरिएको क्यारेक्टर '>', '%s' को सुरु ट्याग अन्त्य " +"गर्नलाइ" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "विजोड क्यारेक्टर '%s' ले,'%s' तत्वको गुण नाम '%s' पछि अपेक्षा गरिएको एउटा '=' " + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"बिजोड क्यारेक्टर '%s', तत्व '%s' को सुरु ट्याग अन्त्य गर्नलाई अपेक्षा गरिएको एउटा '>' वा " +"'/' क्यारेक्टर, वा वैकल्पिक रूपमा एउटा विशेषता ,सायद तपाईँले एउटा विशेषता नाममा अवैध " +"क्यारेक्टर प्रयोग गर्नुभयो" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"बिजोड क्यारेक्टर '%s',तत्व '%s' को '%s' विशेषताका लागि मान दिइएको बेला बराबर चिन्ह " +"पछि खुला उद्धरण चिन्हको अपेक्षा गरेको हुन्छ।" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"बन्द तत्व नाम '%s' को पछि लाग्ने '%s' मान्य क्यारेक्टर होइन; अनुमति पाएको क्यारेक्टर '>' " +"हो।" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "तत्व '%s' बन्द थियो, हाल कुनै तत्व खुलेको छैन" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "तत्व '%s' बन्द थियो, तर हाल खुला तत्व '%s' हो" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "कागजात खाली छ वा सेतो खाली स्थान मात्र राखिएको छ" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "एउटा खुल्ला कोण कोष्ठ पछि '<' कागजात अनपेक्षित रूपले समाप्त भयो।" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "'%s' खोलिएको अन्तिम तत्व संगकागजात अप्रत्याशित रूपले समाप्त भयो।" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"कागजपत्र अप्रत्याशित रूपले समाप्त भयो, ट्याग <%s/> को अन्तमा बन्द कोण कोष्ठको अपेक्षा " +"गर्दछ।" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "तत्व नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "विशेषता नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "तत्व-खुल्ला ट्याग भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"बिशेषता नाम पछ्याउन बराबर चिन्ह पछि कागजातपत्र अप्रत्याशित रूपले समाप्त भयो; गुण मान " +"होइन" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "गुण मान भित्र भएको बेला कागजपत्र अप्रत्याशित रूपले समाप्त भयो" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "तत्व '%s' का लागि बन्द ट्याग भित्र कागजात अनपेक्षित रूपले समाप्त भयो।" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "एउटा टिप्पणी वा प्रक्रिया निर्देशन भित्र कागजपत्र अप्रत्याशित रूपले समाप्त भयो" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "आंशिक-क्यारेक्टरमा माध्यम टुङ्गिन्छ" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "लाइन %d क्यारेक्टर %d मा त्रुटि: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "अधुरो अस्तित्व सन्दर्भ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "उद्धरण गरिएको पाठ उद्धरण चिन्ह बाट सुरु हुँदैन" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "आदेश रेखामा वा अरू कवच-उद्धरण गरिएको पाठमा नमिलेको उद्धरण चिन्ह" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ चाँही '\\' क्यारेक्टर पछि मात्र समाप्त भयो। (पाठ '%s' थियो)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c का लागि मिल्ने उद्धरण फेला पर्नु अगाडि पाठ समाप्त भयो। (पाठ '%s' थियो)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ खाली थियो (वा सेतो खाली स्थान मात्र समावेश थियो)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "शाखा प्रक्रियाबाट डेटा पढ्न असफल भयो" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "शाखा प्रक्रिया (%s)सँग कुराकानीका लागि पाइप सिर्जना गर्न असफल" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "शाखा प्रक्रिया (%s)बाट पढ्न असफल" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "डाइरेक्टरी '%s' (%s) मा परिवर्तन गर्न असफल" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "शाखा प्रक्रिया (%s) कार्यान्वयन गर्न असफल" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr " अार्गुमेन्ट भेक्टरको %d मा अवैध स्ट्रीङ: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरणमा अवैध स्ट्रीङ: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्य डाइरेक्टरी : %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "मद्दत गर्ने कार्यक्रम कार्यान्वयन गर्न असफल (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "शाखा प्रक्रियाबाट डेटा पढ्दा g_io_channel_win32_poll() अनपेक्षित त्रुटि" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "शाखा प्रक्रिया (%s) बाट डेटा पढ्न असफल" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "शाखा प्रक्रिया (%s) बाट डेटा पढ्दा () चयनमा अनपेक्षित त्रुटि" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) मा अनपेक्षित त्रुटि" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) फोर्क गर्न असफल" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "शाखा प्रक्रिया \"%s\" (%s) कार्यान्वयन गर्न असफल" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "शाखा प्रक्रिया (%s) को निर्गत वा आगत पुन:निर्देशिन गर्न असफल" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "शाखा प्रक्रिया (%s) फोर्क गर्न असफल" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "शाखा प्रक्रिया \"%s\" कार्यान्वयन गर्दा अज्ञात त्रुटि" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "शाखा पिड पाईप (%s) बाट प्रशस्त डेटाहरू पढ्न असफल" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 का लागि क्यारेक्टर दायरा भन्दा बाहिर छ" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "रूपान्तरण आगतमा अवैध अनुक्रम" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 का लागि क्यारेक्टर दायरा भन्दा बाहिर छ" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "प्रयोग:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "मद्दत विकल्पहरू:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "मद्दत विकल्पहरू देखाउनुहोस्" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "सबै मद्दत विकल्पहरू देखाउनुहोस्" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "अनुप्रयोग विकल्पहरू:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%s का लागि इन्टेजर मान %s को पद वर्णन गर्न सक्दैन" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "इन्टेजर मान '%s' %s का लागि दायरा भन्दा बाहिर छ" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%s का लागि इन्टेजर मान %s को पद वर्णन गर्न सक्दैन" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "इन्टेजर मान '%s' %s का लागि दायरा भन्दा बाहिर छ" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s का छुटेको तर्क" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "अज्ञात विकल्प %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "वैध कुञ्जी फाइल डेटा डाइरेक्टरीहरूमा फेला परेन" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "नियमित फाइल होइन" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "फाइल खाली छ" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "कुञ्जी फाइलमा पङ्गति '%s' समावेश छ जुन कुञ्जी-मान जोडि, समूह, वा टिप्पणी होइन।" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "कुञ्जी फाइल एउटा समूहबाट सुरु हुँदैन" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "कुञ्जी फाइलमा समर्थन प्राप्त नभएको सङ्केतन '%s' समावेश छ।" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "कुञ्जी फाइलसंगसमूह '%s' छैन" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "कुञ्जी फाइलसंगकुञ्जी '%s' हुँदैन" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "कुञ्जी फाइलमा मान '%s'सँगै कुञ्जी '%s' समावेश छ जुन UTF-8 होइन" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "कुञ्जी फाइलमा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।" + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "कुञ्जी फाइलमा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"कुञ्जी फाइलमा समूह '%s' मा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "कुञ्जी फाइलमा समूह '%s' मा कुञ्जी '%s' हुँदैन" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "कुञ्जी फाइलमा पङ्गतिको अन्त्यमा निकास क्यारेक्टर समावेश छ।" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "कुञ्जी फाइलमा अवैध निकास अनुक्रम '%s' समावेस छ।" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मान '%s' लाई सङ्ख्याको रूपमा व्याख्या गर्न सकिँदैन" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "इन्टेजर मान '%s' क्षेत्र भन्दा बाहिर छ" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मान '%s' लाई सङ्ख्याको रूपमा व्याख्या गर्न सकिँदैन" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मान '%s' एउटा बुलिएनको रूपमा व्याख्या गर्न सकिँदैन।" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "अज्ञात विकल्प %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "अवैध होस्टनाम " + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "विशेषता नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "लाइन %d मा त्रुटि: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "नियमित फाइल होइन" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "लाइन %d मा त्रुटि: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "अवैध होस्टनाम " + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "रूपान्तरण आगतमा अवैध अनुक्रम" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPTION...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "अस्तित्व नामको सुरुमा क्यारेक्टर '%s' वैध हुँदैन ; & क्यारेक्टरले एउटा अस्तित्वा सुरु गर्दछ ; " +#~ "यदि यो एम्परस्यान्ड भएमा एउटा अस्तित्वको रूपमा मानिँदैन,यसलाई & को रूपमा " +#~ "परित्याग गर्नुहोस्" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "अस्तित्व नाम भित्रको क्यारेक्टर '%s' वैध छैन" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "खाली क्यारेक्टर सन्दर्भ, dž जस्तो अङ्क समाहित हुनुपर्छ" + +#~ msgid "Unfinished entity reference" +#~ msgstr "अधुरो अस्तित्व सन्दर्भ" + +#~ msgid "Unfinished character reference" +#~ msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "अवैध UTF-8 सङ्केतन गरिएको पाठ" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "अवैध UTF-8 सङ्केतन गरिएको पाठ" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "URI '%s' को होस्टनाम अवैध छ" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "URI '%s' को होस्टनाम अवैध छ" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "पद वर्णन विकल्पमा त्रुटि %s" diff --git a/po/nl.gmo b/po/nl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..6636a8df9e05b8d4e183c0823b0f08dd607d4bd6 GIT binary patch literal 38034 zcmd6w37A|*b?>ji!C+%-@NT?Z%N}WDsil!6ETNHX%ht#i)`k`v+cHYe^qrp8^mI49 zXe1ef0S5?cAb|ictRV!yB-n`oLjq(mgd~KA6CgkmAaNiBh{*zB$qO&<_div2m!2MJ z^uqVP%;(a-@2&mRIj2sYs=EHl(@uUv#NVwaMbSmz=T42HKj!zV&e7W_dVrT_fxii! z0)E2dr#*fiJdO8X_Rrr0&*b@Ez}vvbT^vOR!2Mtu{0O)dyyOyB?oHrg#e-*qF9DZ< zZvuzGkApGz82EJXDVIjk<=~az1>g?wJa7uU3cLq=CiozD8Tc5u20SBp#Ke;L{gH(GYkOsD3p- z{)^tgKT7{0kfhP0U<{s2;hVrA@NHlfq{-0}u85*ha51<790#uiU+14c0-n$FxBdH* zsZ{l?1k2zp;1=*hp!)xxpy;!PMC-vSsCwT8UI%^+RDDBB;03Vk@x!3#@>B*x^tb_} zsHg*83%(hA2KXg#D|iN-d>wcjD0+Px6us4W;dvlK8La?ek!U+8`W*x>178ZN|L+Br z?vFsR;y1tx!5@Pv_k0E|21}sw?*LW)K~VhgBLDu)9zWpm&wTu2AVU!S6oaPx!=UQh z3@ZNwsP^0iiqGEapC1D0QuHNI=^hWWz|zsvL8W^pNK~{3RJr$nD(9C#rT-YHbbkSA z9R3;9_%7q05%6|U{QF8!=|17{tKc;}{|IErqjd}hLlfNz@+$fnQ0;#|sB!r$sCJ%3 zp-R6I)VPgTf{F&DlJt{B@w(b33>WycbmY9|hH}AAst|#W1VJaT}=g6QJ_H8ay4m zA5=d-3Z4P}wSWJQpz8Z~Q0=({rW7BIf#RD4RQvA%Vb$n;9>3r*y4uyZ6jZ)F;F(|t zJPW)RJQsYEe}6xCHqXBYN)A8opT7f&-j84F=rIhc{d+<2!y!=o@_G;wMh}4M_oLum z@Tm}I3pfdG1b+kE27Vh9eb+%Wl~)1P&XX!{t@sz@VlVOJ#Eyrs{}HH(E)G+_s(&8>AzAbY7=ur~!O3q4R6qBDqTfrv zMc{9M;=4yc)%P_p2A{Oq$@i6@_~syZF8F3pbbkQ6415@re)u}5@jrdcrQZaKKU$#L z|7K8p^(UbE|9w#OJ%dhN0snN{9^FQ;4gs6 z_fGH>@ay0cz{fz<|2^kjo&HHa`ayWs@~^;I<`gVij&jzS;?*vuf zCqdEotDxHb1O{LIS_UowZvxK%TcG&r9#DMqeo*@A)8I1jv|X-$YeBW^r$N!P4J!T5 zfv1D_fvWc*Q1yKVRQtaN#^Bk{cK8gBw}9fyS&wf7m-GAq|NJP}JSmD!+U@A}ygiQZ zUgq(&9)A%$gM4rI&-eT1hd{DMp9F6MFWehNJ+KR|0>1@n{4d()p4WnB@>~Pe@1x)b z@IBz=;NO9w?#v%m}KObo67Ro_lfbbJM<^6vBRzX`74`HI`!c-#hx zPhS9P{C^b`e|!eK4*Wj&Ah`Ap*Pm~Ln|MBBKfD4y8-$e6TReUTRK3^V>Bg-LiVm*< zr@`L>)!$2=>-tdx)vvdM8^F(kuts#|0oU#_sQ$kbtb$(xNfK@PX(t!&0M(zr1g`q5q`J@|{ZQuy+JD|qv-TwWbf@-2tjSF9WS!@I0RX4OBl*ue)`}HK5{O4x+lEKLoD?&zW(2aviAnd%!n> z9|MsC7lC6u{}!nFeh4lFhnvnG*$v*v^D9B=htK-=i(BwA&j-MZz;}VF_jkdI z!Eb?QfKPm$1<9<9>eI$?F`o-*s^`!(QoJWqfchj)WlfscUd z&*Klfbj!dsJl_tgAFl;f?|VVD{~O?H@bO37e7_c4$Mf?+R8#Z;P~&mtQKy$iLGk0= zpvLRtp!ni%!Lz_i??NYot3g;OdMo%9@YLtK_0BgzjcfOAm;d$PdYn0VR*`21Sogf#-rh0M7=Wa*rFg%R!~v2%ZO4 z!1KZ9gUa^?Q2BlzRQwk~jq5*ylE1TFRI^`XV={U4)OeUP<;Cd@FMX0p!#{%y)NI4;59rS0ZZVAz>C4Z_jvNpIC)zH zuI2qU@R{JfpvM1WKK{GlW}Yv8sY^Ews{L;PRo@rD%fZuL=Ei>|xP#|cfQ!H{f#T=? z09EeL%bni39h7{$5j-8d58Mhq1fB+-^s~q?csh7JcrK`R+y?Fg-{#+c4;0B z_kfpz&jm%F7l1K%KX?#)1l0JAzS7CZUQqn>A}|I&0^SII85I48UghNaR`6<`+u&2d z`#|ZL-vOTiehRz+Jn7Z0oH0=CngkbvF9yX|_kkL(kAY7H{|dYe{0DG3cBGQ0>3q=Uh9Nfuhqk z|9m&7cD@Z%eGh`_-)BLU^Q6}~ejf!#c-{@F-7f*vt_S@4PlKZK{{h7(=e^#^-OU~k zfokVF!4=?Vz;l!ylpLM?^NtS7!Kd(iBPcn$1-t^B0oBgegUa`-9zP0R!1HIpRp4Xb zYVguuaD2K4ypZQv@FZ}Ua617uw()!pNRy+(g#N$l$gqv@heVtNeghPZR}%h}pug`E z&L!^I1dZ?W2pb9OdA=9CjiA3b5w0ctHQ~#I2MFT?`GwyKzJt&pT*@<|ZN5stXd&Fr z`ycBEe{1+1{t(ybj|qS8U;M4d&wBg~@J|V%Z|(68?zr6v}=BDBeHC z*CRb~C*ju#`uiLE*Zp%DY2NIg{~283^E`pyH}M-bkG@0LLUZTg8m*MTtQsVo{%km&+@zCpKk^K2jOLerxLaj{|})4ev04M5cGE~C>1^C9r}KFn|Z zJ==l(`vd;HinvP%ZGI1d-v*^){*CZ3;a3S;38xbDx0djigu4m1kpB6g{_b#K|E}WS zvj`^>KMnq(y`}#=>+kpM-|QdMip^``&5iu{cf!{Ro5M?RG5NQHk0*S{zuymTBYc{m zxg-4jN%#S7BH#UB2|N@04B__)|A(NzD|x?*Fv;&7;2v-lsJ|NF>HNOIKc4|Uf$)Cb z{{`Vmgm)62%DXp$%faw>D!;$U!~Z6{i15oH0$iQ@y_?^UC+)|;o#02o3&9WgG-vYr za)SO|LpYi6m>&516~bTHFZa(_?)N@^|14n_;p2pJ2#$-Gu*12!Frre{3Pm z&HR23;V!~W{{0o;S;UGjn_N8+2eMw6HnIaN%u%A(Qk*nc>GA0XNR3=$xvrW zT4@ocR-)$DcSW-DokUc=F*c)Z!1 zo+-DdN!*V2?cVBoRj#*_a^*;z9Ikb`ooG|5Rj*ByyR~K`-q{j#)<>HJol zwrz{9FHcPOTE;YSTI*yP9;!q)lp9OB@kFzAB(Buj$war=J`y(%!6WHoKF$0womN86 z>Q+n0p&ll2uS03uw{9P!n#N?U+H1Rh!-N%LhC1sB1G1EJ6g;tZTcRkWmlST zd%HXvYn);@yLzD3JOJxA8cF?tULL5|8p(kUbZ=CBgBFmf+dPmk433hMwMHe*wcNj^ zl1e=>w$xD9Ym78R?ua|Yt2H{9iheOqNHzp-pby4o#*xMoNt;x*F1Yk9FvY@C@0~&~ z3@m*HM#(s6FhfbCvNXQauwW0e97^g(`nWPpAT4BUw%q=;$Aa(`Q?{E(N`aXrI#2|{ zB0^}1apc1ZS+_|9+>>e>XsEL&m)yACb02JC6ZMzO9oI=g6Z?gBk|bb zWCA%$>Xm47bE0Q<0K>ts^%}`xls+uMV3sFkS4fp5&+C=zow!r0HvDXAb_QddPG}O@ zQMe@c%EaZEHPHH6MVvU%oUvBG>aBKjBI$Hg0ntd-geb6}V*1;&z)S^G=vV{^%}uSR zQZOO9fX85!`2X=%3&$1Y%YO01jp zAsf5n50p%%V5`6f-CDiwnox4GG>d?$Z}l>b3|&$iF-ML;(dAfHj@?WTB*qFxo?_R6 zuAm0dZNpG!WX-Sth;NLW;xW{WTu6#f#JLy!Trq!To0Mh z(XH}CLi)k8L!8&o(U`ZSP2yFu4RB?7jG<>lVfI54cPZOOEs#f+s|J1E{0LJnZLySS z%$iTJ(wIvYk1jzaCun2F(pDV2uc7bD?PR@Eo$=!5^_tz$cyV3-RP|4})$EK$W3G(< zMoNCHflk7rWN;voBWE<$ZfmgM4ygvIVbhhx*S$vVaQ-zayQ}0f2TWzQjtq)UO^IA& zr6-e7+~FsbTwFEjTCr+H=SZiE@m6b0HghTJWh{az6_7I=bMZ6fX+?I9%#1f#Q!sxv zrt{IwLyGR}CHADO*?7oJso?t9(l?l{#?&A>r0-d6grV&tU?ItzDt)oo9gO7M7BQEFuH<@- z47>LXHw(Kmi>khYkw6<&6w#a*$1r=ww$&QF!=`hR!`)ozm?y?kymeD?rk?u-CZuf6 zHj?&$63nV&0@dm?8=sI1j_V`UoEWt|^E3DieweY8$((cPqldC;oS>?$@`wO22+@t0$;}>VaNEV>`T*B@koCD-k2iu;p~2DQnU%I^9w)+G6R|An2$?2fvD1 zBOV^=EX}90Y1&xD@#m!J>0;fvVx@`Q5-($$Ink{eR=-*&dk_N1*8-hvR%aBEc5fZ_ zw^=kf}0mig9cqmKEj*OikY0VlZ3V4llm^s?}>ooh^Qt zHD*0o$_kWWpDMSUQR_?Lq1nX3WzNVAtLCq`Qtp=Bvac|h3ryC}6;@=@X!fd8b4$j! zGb!og6U*aQye21-qE=Eb;ypc$>|{uEzn?YBh0yz zwm_Q3acC8Po#N)>HS~S$D6UZRu!MS9Aj-*-F`XESVU*<+tuanI9 zoWhu=e@L10Rlt(Y&lzp$OGz=oUFFSHOTlYfX1Mg~9OkU^KlxP$eVq=!{wj|Nq9JR24=5nU}mckg2T%@%*m`=OluqQV?NSMvh zAy*mpq7y^xC-^66V@=}pT5+sGe^SNBmEszbYaN9QH8$f?n9W$@y-A$i(e`p3gNoe?KNY!IS+=f}v9>^RNzn4+ zn0D}9w>h2QMI9chELHR7?8aop9xqS-zDbrd_@rG4CLeC6pg4~i57<0cW?LfKUUPoX zRDfj~BevVM6EmK4XJzG>8{BbEI;_!-rrVvvx?m=NqKjQI0<%t78^7vFvqC*?8WU>lV0k}HH1A+v%pfjnP}rWoQ+t(3`;I? zwn3{VwA!^pwzR0@8I+KZiz?3c(IQ)!8$1Cib+%CWDC@E8O*UL9p z3Ps6dy3pbv#*&rulYaPGK8M2V zb+>-@oM7JIzW(g8q+)&eR$}0M#)ZQRa*ESF4UtO|?dspVL`uD#mCfn49*CZ;;ejpX z649(8+tnRH@k(CfM>BEcXbhu1582$44c^cn^(_PT6dA%-5JRl?kpuD> zM?S^;YYm@ZK-qccaeoK)X1+~qV>`Z*f2GnggDvWd5-s`^+g=tju#;ErVI;k67eB}T zqGBR1<;%m$T&0E#s6yFrd&L&c-#MNjmJ(#|uXA!ODRY|F=Dvv)@$g>l0x6&3RLatP zG5Kw>c**{pE;~k6m1GOGcv#bc+gLTGDr^W*5p{<-Dx}kXzD*dUbtZ0Z3g{HGKz5&a z&U>RdA~xP>*5%4lH9d2+OQkQ;?6N5COz3!q<<$!#fmSc=hH2gzj+wEqTd@RT`MDIr+l>SF*4B=j*;2fy#p<#Q+P%T4qNP|Ezv#r1I#`BlyZU($KrPC_30RCsJQ(MO}K1~Fv&Afo|R5C^HECgC(rU;h; z%hhCkbc=0fYjJ7(S=jbS?ePwSiu>0rax#R2Tmu*QTFI2PmZ&G?#tN0cfaH_)CRUAG zx-B$MNPR2Ll&a6$x7dvC*tu)()}1?6tXOepv_IzzL4!)8NBeJZ%GK*Z$XMqb!+3%v zrX?9iFzsZ_{)s_((HKtsxO2gb3a4M`I)_F0Z5o_$z~;^w?je#xrbm-@(>FUxt4g`X zTiV0d4l6P{{%U(ieOgai)}4N}GkK}!oq>=6jAvE7;EBn_Jc>3*>TrdkF6@n_5 zFppE6y}GVsifOSDO_V!H$@Z_rz-}sLUBAD+Jl?;J&?D?ynpUJkUOGz*Cniz05^+-% z#NL1SE{5jr%(R7|nXg!93hfLe+%X%a{Xp+IZ;3Y|@~5-9v#fdTbXL+KN4wo?$uw?` zA4E4qZkHjbj;O-2R_7C)#hlGxiAy|Btdx{GFVbPs*UHgky0fRPBObAh3h*MK>H$JnjgbXv_ZScgbwr#My9_vk!U zeI!YjiOrdD9i7x7fwgBNnKeB!$%3i>WOcyB9M(IIIo2;Wj zVwH+d?J#46|F?=+1HGWE)=K+#sm1$SDR<=Jf}5!A#LTTqB`Y)DpQGdXG-Ch(LkhUm z4&O;{Ld!I#pImKMbm_piciPzZ_b`+j^3!%Tpf~PyjazSLCn}3O4B};tsMLI1#T6~H zG@37U=LjcXPr>(E|4eN9sR-|e5ghb z>POHh3Fqr7G}WJ|trQ4{5$ewDyVJV9inN9OBjFE2!^uVEl^&ADGtIKoO?5D4i*EXZ zpd7G`(niRR(`^7-+i7sJ!6ea~LlT+dauk=6D945Kq<+5eYB9n(;?4-BA|z!U6=mf+ zwhr1*^V{%D`EYHfHxsjClXjTn0{-mC+(o?X=)iiZrex!8rhoDnI0vXRm=kUvB|jQy z`_PhABg;odPyfoC2&SVC*B_& zVl@hh=9`G-jW+ENr2^%-UBl@X+KdJq1{=!J?B;LT93`h|2N8T%yQ#Uaw6#*Y#a*-D z$P3Q2Q+Fr2XH(kVsn#l`>wDEsX)j0dPTjS0Z|Mf90H%%7W;DV2_^OdrBc+kmrK_%v zSFKvVW?gAy&BzD|OS_SF9VSZCjXbk7a#iW7)$yt|>qpiuBj3oW+c?}>+KZTXaD?bw z)2#?Q`sMm&U4HU#B|BOtPZcu3kgFMzx1MTiT0naDBYFhleBHfbv0G zL4fNHwQC1i*tctwU6(-@YqCDBS}}6!4Ne1>v@~6B-j9`dV``lDl(^v{-)K8WSvs{6 zbyXVkSI^eR>&9!{Q+L(5sZ%d)VG?7(*=X5gXX914Y3=96;YNJf#(34z(NnpA&-Za#C^qx0seyz$=@2a3r?7|?4 zF$p#hKN>62uj3kJcD`ruJVWh9&FmO$fNKkZ6!SIdXiouM=uUPP z1`lQ}_&d;<#cOjviSqo7It`5EAnmlH5SufwvkeR5-fUHo4UQPN`*hl(7ninbTxArg zAhc6QK6BEZP1-P}<+rU?J0mR)@w>Svp2O|so=CnexTfSuJdr$m)7y5(%r%#l=_M0D zx!du*&Qj>og`-6J&fAvBWS<0RAOaH^qp}okGW;=9R5VQ;nP~xHl*F$RiSZRrvpv3vlSujNVgy@%Aenk z%I%~!ZK}{;six6ZrlPnqH&r9KMKqmMXoCSF(~J@_4&fo9>3Wr$W{lY#^1$f`q=~ zo55c^D~AEP+E3RUuJk!2){cqUQ!lqAuI`fGO$;Hrw#C+)HV>v)0h+e=^O%~>5joBp z&KzYYkFphOjnZL(lu6**cJ>rzoEbl7MK`ksGYceK@-w#SRg(tYnxWww#Gqo`qNJuE z4OxMts3%9o8x*8LM)pbFsU?|mvvE;ep{et<&<}}|-{X{dg5}xFb9+*stTHi`r)he) zT*&2D8399`$Snp-xUZ5Hz2#5^?jnqY3dDW*zK8EKZQLzS%kvhl7Y6O&k{dP0I1XLH zonNsbs-*V|O>(5%MWk6Qetmnum<4idgr7ZI$u{zQ>Gx-Q9H7JgGsA~FhE_`&tX%p1C1?S3{izk{V+%}Xoxnkj&)znGMqSO*~ zBkmiL^7HWv^uyI}V={a)*pHu|At=yop+h%={75!RW!Se<=R84bQ1Yvk_CN-pWXun3fQK8rBeolFCNwW zrnQdD!qJ$YZXFsDK}@X%j(4?jbFNr7@xc%OooBwiI!$Ec3Y;Eokw+1RG1fM&r1R-? z*l-7V(?t0M=?$VZR?-m`BUXl=;^5VnR!sttnO@ zuBF<$ZnJ}f{bFmeU|8B&odlQ2P$%nVvxR=+vnejCTAWU&#e|BQv9+kE;XQOZAYoF< z0vEkLHwO|N4CldAL`&g6g++(F3FWR?TDNm?#gfIwzQwYLgM1VdslmB~VeUMU#Ki)o zjcnm#J+b9_fs|&RFHhRsP^tSXBh%vEZNctXa~yv*63sHvkR?xo$hGlOk@mK>Pf zQ?b}uQ97R*?`3`7gz3s<{)Vf(Vloo|bA8NPu6#2`n|?VU`xn0M7gw1b68T2#kF~K3 zWUs~F3@r#_mQ?g*HkTEhu<@1JA@huGmNCJVCmI)tmBq^?#iFajdT|N?oG;lzL@g_H zzSN!`ni|Za8=NlF3mSuQnm>of=IQpl={tQ_QwvmvYf|-K>XYby>qS1D`|0{FU_5-*&|!oQ_y!OYhjj{3ytB* zYyKtlDf%e;`*^Ixt=d68By|uSszsT|t3``$!rGY1ki^DBIJvN*&!o(0`@UNDP%|C> zV%l^(vljTHM90W~dXpp2d0+HqyAC{^ zE6}z0CK6&(I9H2XRuuc%-|U^OLv6NTwBk33_80B#|&qC#ZGamQ6+ccoX?cy;apZx+Q-jhNMy%9;u{2Nx~3 z$$?|6fZIXeRMeKrVEHBsd ziN18e42M^FE}x}pUM-LtIOosvjnfdY_1wg#mz5dq(FUwdW5-tv;YM+m-893T*^Ky< z(|n{e_p~P`|C&ftm%zXobgWp zwX0@p)v>+s^Ef7?+2_eP(5D{l^qbUic4wK@oAw>Jl@sDp8`-v{ho_){qrNT)JI7<2 z8zVMeQYcFokk#v?6U^oBHNzJRt;b(*o|6NXq4BQS40P&!E;(^bd%)K^)5QXN(qV%Z z>6*!<2|RF&*KYbt&jgsG*m$Zh!d*Nll#U0BqY`x$-j_JF90tT`^%Phv*VMUPp3~#p z*g%?af70K7mW#q)fDQ~|CNGYE;{kFsXRs22{~${=kDl~4MXrewWhBe`DvtL3_e9P~ zKdU`R*lNiK?W7q0jLlT?SLw@?PLY}gWl}Y;sAf7Ua|*PB1$M4s{_MWYoWe(W+CD(4 zek(X{q^|tdyxSPkOH(w}HYQ(H_UK#S!bXW7Ax|Bd*j^izT+*#AY8whZS3V%*>7}*E+`_27@h9mh2!0yug)M z&z1R2t@+2$nqM5W<0S4U{|P47_TBO8GiRP-lHdlnOwn$el*}K=o=}x@ZrT{?vg1U* z%}kLRJ62{BU^Q{ueZ{bO?2AE)<;2PqZ_4-3OU?vfm=HFH{VtXnTUu|@SLo%6DL6J z(8KqY4(Yo2iPF*9Y$ITOnYIhJn)o!jIa;~xj$H488VXw?e$XT)Of%5hk)xW-av~|% zbMPqK>GrEK3sFZ0id$WfRQs=~uSEN@2wuTb$Og-1B>(A|bTAfPllIa4PH);cv5y3u zqZQ%SdPy5=p?ExNGNk?9#tC%GDhr#vl%_*~gDW>RWt9%N_ioCqJTo`cqd^ z8mle+!@4=QESalX3bD3vsvX4fw!WtkWqu5q0d4~qJ&*U+&220VQED`5&Z^8VyO+jm zxPB3)m{=ZOKWaqm}Iwu|!28NI$ z6a(-5l%{iYy>qz`L>;H1lU~xz=GV1yje0IQ`+GXcYRur0ipjalBatZBrg`hoxhr%! zPHS#?9a%VWN{RYl9Ogeea^p!KCSS%oW1Dc>KI}RSJaL)7aF2n)Q1CyT;Bt}_v)>^O z3&-2tc8BjxZqZnrleVV29^$}Mc2I(InQRk8Fc+hB2^w|z$TgpXX5PtOhnIzweSXor zIg822-pyUZw^=jFCDTOO?>(rM!U1BCnxxuz?wwTdrhIG!dId5np9!?ol(Ve$uD&W|;>YfVxa~+RPypm~D_#B)hP1EMMJ5 zJnYkBIyr@uLG!##BvuPtptSX-9T@g?bV`M^@+YZj)^`oq<+RD!nJJ5CmD}P|h+#NW zUUuE)3zCL)0pj9CE%dlmF>N`c_b5G{x2zE!;Ks!Yq>M^ z{s@`VjhQCO^2{?W`Fyz?dv)tgswsSN56#E!L-9)joRsk&62Sd}S4JNaa5`mh_T#4Z zJ%XJ6g92g$Mr8@aa%cbN%sDz+O}W{2rF?rd+!8`)J1k*q6s63P(c*AE!;gP9iiNy( z(vcc$Bb!C8jrQQL4WtYbPIjZE`g6|t=D?gxg=VTZ)*M%)jIhutJ2PxT2I=kV16XI+ z8QgHNgXP(FnzuI4u@VX~b-FGI=bFbkqr&Oes@n=xt){pNl+8CJJ+M5Oc-VAi=VbJj zp&iz7d1E%42vZ@ln&+5hx1fA=0D+s5&PyaI3X5SkQRT|DPgmKI<-#fd!dDH#sU36T zI(@;6X+NZ93U2&?MW-J)IFXXvEt%H1$!ot8?8i8JgrsWg5FCT`Mxr#HQc>=R(|`T#!dw9@{4uegdWPxdt7OlBo(o`#GdME|KqAXDcI(lJ0e-GrM^O zypzWrL+#kQ(-F%LjvYW!HH{u0IS>b89J3@X=8J4=$<|209e{0B_;`ai8{`x5BOe@6 zGV$H#8?@1*{2b2X|D2R<#%g;i{gOk{8D#qEsx!nhZC3bz1D{~zUPL$YMwcuC_GTt4 z%lUr*afhkSV8}6`?_n_Sg(DnhT4ca>%Y6+(x}vF-rQeR$PMdZ} z<7xKvz$p9tgDrC;F{z#$5Qo-62JTiH(`3P{%&&-|{Ffn;@M#DRv}0R$h-7>jXxZ9@ z2hH(w$(dDvPr!W`!fliw6}{QSoi>qwP94e;XT#~g5aFU^&h+?*8zU~QoZ}$B5}#kl zu^)6j#+2_N_LRk{d?zBIQs+^YRJXPM*NyH;eJ;WnF$#+cC(Oi{w0ohXKAop$oa6~k zI2J>*L|u2JmBLdGv3bP&A@!wl+v&6reko*ho@DE}Et=1DXRaDed~>_+?+!TIztARY zw7XSrIQiaVM3&o@gPe#8wQP(6lqh zQSp$6$j8?toFp?MN!umRsY^#$n;>8zG_XwT0U7Me66rjN{y-PVywu$o_hpFzLKS(J zRY|*n{!S5DrEzT2KhnG;CC0&|X;~m}l2faiuQI}hso43q(JywFY~H5N9l~(`&#U2} zbi->tg}@wQ+kJ8cFooD%op`!uPAN@EuDux(ieb6Q?}xZ#mao3=lr=iStm*OL@WKJd zbXgaMDzz{RmyhNy=OT{8w#&F-jd!K0krKHDB4a`+xU6a|Jtd1+Q2u)my1K`wDcme$ zpQX_Mb*Im3Gtl{!vjNaVI5}hA8o)+}DB|)kCCN#J4FJts_1+`QesjdZQ~F9a0C2)_E_pjfPy5Y1=HN`%VtZ z6E93IRpv}JN~2?fE=vcE#92EN_Z|5ow`eW`(|S6`jbPR8KFCUa-UiUlDeeNk&z#?J>2ymjA!$7}j(E literal 0 HcmV?d00001 diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..ac1e103 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,2287 @@ +# Dutch translation for glib +# +# This file is distributed under the same license as the glib package. +# +# Dirk-Jan C. Binnema 2001 +# Tino Meinen 2002–2008. +# Wouter Bolsterlee , 2008–2009 +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-02-23 14:07+0100\n" +"Last-Translator: Wouter Bolsterlee \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Onverwacht attribuut ‘%s’ voor element ‘%s’" + +# aangetroffen hier mooier dan gevonden +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribuut ‘%s’ van element ‘%s’ is niet aangetroffen" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Onverwachte tag ‘%s’, tag ‘%s’ werd verwacht" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Onverwachte tag ‘%s’ binnen ‘%s’" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Er is geen geldig bladwijzerbestand gevonden in de datamappen" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Er bestaat al een bladwijzer voor de URI ‘%s’" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Geen bladwijzer gevonden voor URI ‘%s’" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Er is geen MIME-type gedefinieerd in de bladwijzer voor URI ‘%s’" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Er is geen privé-vlag gedefinieerd in de bladwijzer voor URI ‘%s’" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Er zijn geen groepen ingesteld in de bladwijzer voor URI ‘%s’" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Er is geen programma genaamd ‘%s’ die een bladwijzer geregistreerd heeft " +"voor ‘%s’" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Exec-regel ‘%s’ kon niet worden verwerkt met URI ‘%s’" + +# is niet mogelijk/wordt niet ondersteund +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Het omzetten van tekenset ‘%s’ naar ‘%s’ is niet mogelijk" + +# conversieprogramma/omzet-programma/omzetter +# kon converteerder van %s naar %s niet openen +# Openen van converteerder van '%s' naar '%s' mislukt +# Openen van het programma voor het omzetten van s naar s is mislukt +# (tekenreeks komt verderop nog een keer voor) +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" +"Kon het conversieprogramma voor het omzetten van ‘%s’ naar ‘%s’ niet openen" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ongeldige bytereeks in conversie-invoer" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fout tijdens omzetten: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Onvolledige tekenreeks aan het eind van de invoer" + +# wordt hier niet character set ipv codeset bedoeld? +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan vanaf codeverzameling ‘%s’ niet terugvallen op ‘%s’" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"De URI ‘%s’ is geen absolute URI die gebruik maakt van het schema ‘bestand’" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "De lokale bestands-URI ‘%s’ mag het teken ‘#’ niet bevatten" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "De URI ‘%s’ is ongeldig" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "De hostnaam van de URI ‘%s’ is ongeldig" + +# controle-tekens/ontsnappingstekens/sturingstekens +# betere vertaling? +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "De URI ‘%s’ bevat tekens met een foutief controleteken" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Het pad ‘%s’ is geen absoluut pad" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ongeldige hostnaam" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fout bij openen van map ‘%s’: %s" + +# Allocatie van %lu bytes om bestand "%s" te lezen is mislukt< +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Kon geen %lu byte geheugenruimte reserveren om bestand ‘%s’ te lezen" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Bestand ‘%s’ is te groot" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Lezen uit bestand ‘%s’ is mislukt: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Openen van bestand ‘%s’ is mislukt: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Opvragen gegevens van bestand ‘%s’ is mislukt: fstat() is mislukt: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Openen van bestand ‘%s’ is mislukt: fdopen() is mislukt: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Hernoemen van bestand ‘%s’ naar ‘%s’ is mislukt: g_rename() is mislukt: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Aanmaken van bestand ‘%s’ is mislukt: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Openen van bestand ‘%s’ voor schrijven is mislukt: fdopen() is mislukt: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Schrijven van bestand ‘%s’ is mislukt: fwrite() is mislukt: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Schrijven van bestand ‘%s’ is mislukt: fwrite() is mislukt: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Schrijven van bestand ‘%s’ is mislukt: fwrite() is mislukt: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Sluiten van bestand ‘%s’ is mislukt: fclose() is mislukt: %s" + +# bestaand bestand is een beetje dubbelop +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Bestand ‘%s’ kon niet worden verwijderd: g_unlink() is mislukt: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Sjabloon ‘%s’ is ongeldig, het zou geen ‘%s’ moeten bevatten" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Sjabloon ‘%s’ bevat geen XXXXXX" + +# ook byte voor meervoud (het bestand is 29 byte groot) +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Lezen van symbolische verwijzing ‘%s’ is mislukt: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolische verwijzingen zijn niet mogelijk" + +# Openen van converteerder van '%s' naar '%s' mislukt: %s +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" +"Kon het conversieprogramma voor omzetten van ‘%s’ naar ‘%s’ niet openen: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Een kale ('raw') leesoperatie is niet mogelijk in " +"g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Restant aan ongeconverteerde data in de leesbuffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanaal eindigt in een gedeeltelijk teken" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Een kale ('raw') leesoperatie is niet mogelijk in g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Openen van bestand ‘%s’ is mislukt: open() is mislukt: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Openen van bestand ‘%s’ is mislukt: mmap() is mislukt: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fout in regel %d teken %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ongeldige UTF-8-gecodeerde tekst - niet geldig ‘%s’" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fout in regel %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Verwerken van ‘%-.*s’ is mislukt, hetgeen een getal in een tekenreferentie " +"zou moeten zijn (bijvoorbeeld ê) - misschien is het getal te groot" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Tekenreferentie eindigt niet op een puntkomma; waarschijnlijk heeft u een " +"ampersand-teken gebruikt zonder daarmee een entiteit te willen beginnen - " +"gebruik in plaats daarvan &" + +# niet geoorloofd/toegestaan/ongeoorloofd +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tekenreferentie ‘%-.*s’ staat niet voor een geoorloofd teken" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Lege entiteit ‘&;’ gevonden; geldige entiteiten zijn: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entiteitnaam ‘%s’ is niet bekend" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"De entiteit eindigde niet op een puntkomma; waarschijnlijk heeft u een " +"ampersand-teken gebruikt zonder daarmee een entiteit te willen beginnen - " +"gebruik in plaats daarvan &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Het document moet beginnen met een element (bijv. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"‘%s’ is geen geldig teken na ‘<’; een elementnaam mag er niet mee beginnen" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Onverwacht teken ‘%s’, er werd een ‘>’-teken verwacht om de ledig-element-" +"tag ‘%s’ af te sluiten" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Onverwacht teken ‘%s’, er werd een ‘=’ verwacht na de attribuutnaam ‘%s’ van " +"element ‘%s’" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Onverwacht teken ‘%s’, er werd een ‘>’- of een ‘/’-teken verwacht om de " +"start-tag van element ‘%s’ af te sluiten, of eventueel een attribuut; " +"misschien heeft u ongeldige tekens gebruikt in een attribuutnaam" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Onverwacht teken ‘%s’, er werd een ‘\"’-teken verwacht na het ‘=’-teken bij " +"de attribuutwaarde van ‘%s’ in element ‘%s’" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"‘%s’ is geen geldig teken na de elementnaam ‘%s’ in de afluitingstag; het " +"teken dat toegestaan is is ‘>’ " + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element ‘%s’ is afgesloten, er is nu geen enkel element open" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element ‘%s’ is afgesloten, maar op dit moment is element ‘%s’ open" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Het document was leeg of bevatte slechts lege ruimte" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Het document eindigde onverwacht na een openingshaakje: ‘<’" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Het document eindigde onverwacht met niet-afgesloten elementen - ‘%s’ is het " +"laatstgeopende element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Het document eindigde onverwacht, er werd een sluithaakje (‘>’) verwacht " +"voor de tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Het document eindigde onverwacht in een elementnaam" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Het document eindigde onverwacht in een attribuutnaam" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Het document eindigde onverwacht in een element-openingstag." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Het document eindigde onverwacht na een ‘=’-teken dat op een attribuutnaam " +"volgde; geen attribuutwaarde" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Het document eindigde onverwacht in een attribuutwaarde" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Het document eindigde onverwacht in een een afsluitingstag voor element ‘%s’" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Het document eindigde onverwacht in commentaar of een bewerkingsinstructie" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "beschadigd object" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "interne fout of beschadigd object" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "onvoldoende geheugen" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "limiet voor backtracking bereikt" + +# voor deelzoeken +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "het patroon bevat niet-ondersteunde tekens" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "interne fout" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "achterwaartse referenties als condities zijn niet mogelijk" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "recursielimiet bereikt" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "limiet voor lege substrings bereikt" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ongeldige combinatie van nieuwe-regelvlaggen" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "onbekende fout" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ aan het einde van het patroon" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c aan het einde van het patroon" + +# onbekend/niet herkend +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "onbekend teken volgt na \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"tekens die hoofd,- en kleine letters wijzigen zijn hier niet toegestaan" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "getallen in verkeerde volgorde in {} waardegever" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "getal te groot in {} waardegever" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "sluithaakje ] ontbreekt bij lettertekenklasse" + +# controleteken/sturingsteken/stuurcode/escape-teken +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ongelde stuurcode in lettertekenklasse" + +# [Z-a] +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "bereik in verkeerde volgorde in lettertekenklasse" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "niets te herhalen" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "onbekend teken na (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "onbekend teken na (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "onbekend teken na (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX benoemde klassen zijn alleen ondersteund binnen een klasse" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "ontbrekend sluithaakje: )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") zonder openingshaakje: (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R of (?[+-]cijfers moeten gevolgd worden door )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "verwijzing naar een niet-bestaand subpatroon" + +# opmerking/commentaar +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "ontbrekend sluithaakje ) na commentaar" + +# te groot/te lang +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "reguliere expressie te groot" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "kon onvoldoende geheugen krijgen" + +# terugkijkbewering +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "‘lookbehind assertion’ heeft geen vaste lengte" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "foutief getal of naam na (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "voorwaardelijke groep bevat meer dan twee vertakkingen" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "bewering verwacht na (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "onbekende POSIX-klassenaam" + +# collate=vergelijken/ordenen +# POSIX collating zorgt bijv. dat de Spaanse ll, na de l komt en voor de m. +# het betreft het beschouwen van meerdere tekens als 1 teken +# samengesteld teken +# geordende elementen/samengestelde elementen +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-samengestelde elementen worden niet ondersteund" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "lettertekenwaarde in de reeks \\x{...} is te groot" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ongeldige voorwaarde (?(0)" + +# terugkijkbewering +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C niet toegestaan in ‘lookbehind assertion’" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "recursieve aanroep zou oneindig kunnen doorlopen" + +# afsluiter/afsluitteken +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "afsluitteken ontbreekt in naam subpatroon" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "twee genoemde subpatronen hebben dezelfde naam" + +# onjuist samengesteld/gevormd +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "onjuist gevormde \\P of \\p reeks" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "onbekende eigenschapnaam na \\P of \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "naam van subpatroon is te lang (maximaal 32 tekens)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "teveel genoemde subpatronen (maximaal 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "octale waarde is groter dan \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-groep bevat meer dan één vertakking" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "herhalen van een DEFINE-groep is niet toegestaan" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inconsistente NEWLINE-opties" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g wordt niet gevolgd door een naam tussen haakjes, of getal niet gelijk " +"aan nul, optioneel tussen haakjes" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "onverwachte herhaling" + +# te weinig geheugen voor code/code overstroomt/ +# programmacode loopt over +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "overstroming programmacode" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "compile-werkruimte is overlopen" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "eerder nagekeken gerefereerd subpatroon niet gevonden" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fout bij reguliere expressie %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-bibliotheek is gecompileerd zonder ondersteuning voor UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"PCRE-bibliotheek is gecompileerd zonder ondersteuning voor UTF8-eigenschappen" + +# opbouwen/compileren +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Fout bij compileren van reguliere expressie %s op teken %d:%s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fout bij optimaliseren van reguliere expressie %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimaal getal of ‘}’ verwacht" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimaal getal verwacht" + +# tekort/ontbreekt/te weinig +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "‘<’ ontbreekt in verwijzing" + +# symbolische verwijzing +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "onafgemaakte verwijzing" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "verwijzing heeft nullengte" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "cijfer verwacht" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ongeldige verwijzing" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "extra afsluiting ‘\\’" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "onbekende escape-reeks" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Fout bij inlezen vervangende tekst ‘%s’ op teken %lu:%s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Aangehaalde tekst begint niet met een ‘\"’-teken" + +# solitair "-teken/ongebalanceerd +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Solitair ‘\"’-teken in opdrachtregel of andere shell-aangehaalde tekst" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst eindigde na een ‘\\’-teken (de tekst was ‘%s’)." + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"De tekst eindigde voordat een afsluitend aanhalingsteken was gevonden voor %" +"c (de tekst was ‘%s’)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "De tekst was leeg (of bevatte slechts lege ruimte)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Lezen van data van dochterproces is mislukt" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Aanmaken van pijplijn voor het communiceren met dochterproces is mislukt (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lezen van pijplijn naar dochter (%s) is mislukt" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Wijzigen naar map ‘%s’ is mislukt (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Uitvoeren van dochterproces is mislukt (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ongeldige programmanaam: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ongeldige tekenreeks in argumentvector bij %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ongeldige tekenreeks in omgeving: %s" + +# werkmap/huidige map +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ongeldige werkmap: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Uitvoeren van het hulpprogramma (%s) is mislukt" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Onverwachte fout in g_io_channel_win32_poll() bij het lezen van data van een " +"dochterproces" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Lezen van data van dochterproces is mislukt (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Onverwachte fout in select() bij het lezen van data van een dochterproces (%" +"s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Onverwachte fout in waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "De fork is mislukt (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Uitvoeren van dochterproces ‘%s’ is mislukt (%s)" + +# was eerst: herleiden +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Doorsluizen van invoer of uitvoer van een dochterproces is mislukt (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Het forken van een dochterproces is mislukt (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Onbekende fout bij het uitvoeren van dochterproces ‘%s’" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Lezen van voldoende data van pijplijn van dochter-pid is mislukt (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Teken valt buiten het bereik van UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ongeldige reeks in conversieinvoer" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Teken valt buiten het bereik van UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Gebruik:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTIE...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Hulpopties:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Deze hulptekst tonen" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Alle hulpteksten tonen" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Programmaopties:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan het geheel getal ‘%s’ voor %s niet verwerken" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Het geheel getal ‘%s’ voor %s valt buiten het bereik" + +# integer-double +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan het lange geheel getal ‘%s’ voor %s niet verwerken" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Het lange geheel getal ‘%s’ voor %s valt buiten het bereik" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Fout bij verwerken van optie %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Ontbrekend argument voor %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Onbekende optie %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Er kon geen geldig sleutelbestand gevonden worden in de zoekmappen" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Geen gewoon bestand" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Bestand is leeg" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Sleutelbestand bevat regel ‘%s’ wat geen sleutelwaarde-paar, groep of " +"opmerking is." + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ongeldige groepsnaam: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Het sleutelbestand start niet met een groep" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ongeldige sleutelnaam: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Het sleutelbestand bevat de niet-ondersteunde tekenset ‘%s’" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Het sleutelbestand bevat geen groep ‘%s’" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Het sleutelbestand bevat geen sleutel ‘%s’" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Het sleutelbestand bevat sleutel ‘%s’ met waarde ‘%s’ wat geen UTF-8 is" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Het sleutelbestand bevat sleutel ‘%s’ die een waarde heeft die niet " +"geïnterpreteerd kan worden." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Het sleutelbestand bevat sleutel ‘%s’ die een waarde heeft die niet " +"geïnterpreteerd kan worden." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Het sleutelbestand bevat sleutel ‘%s’ in groep ‘%s’ die een waarde heeft die " +"niet geïnterpreteerd kan worden." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Het sleutelbestand bevat geen sleutel ‘%s’ in groep ‘%s’" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" +"Het sleutelbestand bevat een ontsnappingsteken aan het einde van een regel" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Het sleutelbestand bevat ongeldige ontsnappingstekens ‘%s’" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "De waarde ‘%s’ kan niet geïnterpreteerd worden als een getal." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Het geheel getal ‘%s’ valt buiten het bereik" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"De waarde ‘%s’ kan niet geïnterpreteerd worden als een getal van het type " +"float." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "De waarde ‘%s’ kan niet geïnterpreteerd worden als een boolese." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "De telwaarde die aan %s werd gegeven is te groot" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "De stroom is al gesloten" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "De bewerking werd afgebroken" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ongeldige bytereeks in conversie-invoer" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +# niet ondersteund/niet mogelijk +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "De bewerking is niet mogelijk" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Onbekend type" + +# bestandssoort/bestandstype +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "bestandstype %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "type %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Voortijdig einde aan gegevensstroom" + +# naamloos/zonder naam/onbenoemd +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Zonder naam" + +# bureaubladbestand/desktopbestand +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktopbestand bevat geen Exec-veld" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Kan geen terminalvenster vinden voor het uitvoeren van het programma" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan persoonlijke programmaconfiguratiemap %s niet aanmaken: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan persoonlijke MIME-configuratiemap %s niet aanmaken: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan desktopbestand %s niet aanmaken" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Zelfgemaakte definitie voor %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "dit station begrijpt de opdracht ‘uitwerpen’ niet" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "dit station begrijpt de opdracht ‘uitwerpen’ niet" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "dit station kan niet onderzocht worden op de aanwezigheid van media" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "dit station begrijpt de opdracht ‘uitwerpen’ niet" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "dit station begrijpt de opdracht ‘uitwerpen’ niet" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan versie %d van GEmblem-codering niet verwerken" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Onjuist aantal tokens (%d) in GEmblem-codering" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan versie %d van GEmblemedIcon-codering niet verwerken" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Onjuist aantal tokens (%d) in GEmblemedIcon-codering" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblem voor GEmblemedIcon verwacht" + +# niet ondersteund/niet mogelijk +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "De bewerking is niet mogelijk" + +# de koppeling hiervan bestaat niet/het koppelpunt hiervan bestaat niet +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Het koppelpunt hiervan bestaat niet" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kan niet over map kopiëren" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kan map niet over map kopiëren" + +# er is al een bestand met die naam? +# Het doelbestand bestaat (al) +# er was ook een msgid: Target file already exists +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Doelbestand bestaat al" + +# map/de map +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kan map niet recursief kopiëren" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolische verwijzingen zijn niet mogelijk" + +# openen/lezen +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Fout bij het openen van bestand: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Kan speciaal bestand niet kopiëren" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ongeldige symbolische verwijzing gegeven" + +# wordt hier niet ondersteund +# (dus bijv. op een aangekoppelde externe opslag?) +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Prullenbak wordt ondersteund" + +# Een bestandsnaam mag het teken / niet bevatten +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Het teken ‘%c’ mag niet in een bestandsnaam voorkomen" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volumen begrijpt de opdracht ‘aankoppelen’ niet" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Er is geen programma toegewezen om dit bestand te openen" + +# opsomming/teller +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Teller is gesloten" + +# hmm +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Bestandsteller bevat een lopende bewerking" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Bestandsteller is al gesloten" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Kan versie %d van GFileIcon-codering niet verwerken" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Ongeldige invoergegevens voor GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Datastroom ondersteunt query_info niet" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Zoeken binnen datastroom niet mogelijk" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Afkappen is niet toegestaan op een invoerdatastroom" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Afkappen wordt niet ondersteund op een datastroom" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Verkeerd aantal tokens (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Geen type voor klassenaam %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s implementeert de GIcon-interface niet" + +# Uhhh? (Wouter Bolsterlee) +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is niet ‘classed’" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Onjuist versienummer: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Type %s implementeert from_tokens() op de GIcon-interface niet" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Kan de opgegeven versie in de pictogram-codering niet verwerken" + +# huh? +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Invoerdatastroom begrijpt de opdracht ‘lezen’ niet" + +# Vrij vertaald (Wouter Bolsterlee) +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Datastroom is nog bezig" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Kon de standaard ‘directory monitor type’ niet vinden" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ongeldige bestandsnaam: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fout bij het ophalen van informatie over bestandssysteem: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kan de root-map niet hernoemen" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fout bij het hernoemen van bestand: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Kan het bestand niet hernoemen, de bestandsnaam bestaat al" + +# ongeldige naam voor bestand/ongeldige bestandsnaam +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ongeldige bestandsnaam" + +# openen/lezen +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Fout bij het openen van bestand: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kan map niet openen" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Fout bij het verwijderen van bestand: %s" + +# naar prullenbak verplaatsen/verwijderen +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fout bij het verplaatsen naar de prullenbak van bestand: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kan de prullenbakmap %s niet aanmaken: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Kan de bovenliggende map voor de prullenbak niet vinden" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Kan prullenbakmap niet vinden of aanmaken" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kan prullenbak-informatiebestand ‘%s’ niet aanmaken" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kan het bestand ‘%s’ niet naar de prullenbak verplaatsen" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fout bij het aanmaken van map: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Lezen van symbolische verwijzing ‘%s’ is mislukt: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fout bij het maken van symbolische verwijzing: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Fout bij het verplaatsen van bestand: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kan map niet over map verplaatsen" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Aanmaken van backupbestand is mislukt" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fout bij het verwijderen doelbestand: %s" + +# (nog) niet mogelijk/niet ondersteund +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Verplaatsen tussen aankoppelpunten is niet mogelijk" + +# technotalk +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attribuutwaarde moet niet-NULL zijn" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Ongeldig attribuuttype (hoort een tekenreeks te zijn)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Ongeldige uitgebreide attribuutnaam" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fout bij het instellen van uitgebreid attribuut ‘%s’: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Fout bij het benaderen van bestand ‘%s’: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ongeldige codering)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Fout bij het benaderen van bestandsdescriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ongeldig attribuuttype (hoort een uint32 te zijn)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ongeldig attribuuttype (hoort een uint64 te zijn)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ongeldig attribuuttype (hoort een byte-tekenreeks te zijn)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Fout bij instellen toegangsrechten: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fout bij instellen toegangsrechten: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fout bij instellen eigenaar: %s" + +# technotalk +# symlink/symbolische verwijzing +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolische verwijzing moet niet-NULL zijn" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fout bij instellen symbolische verwijzing: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Fout bij instellen symbolische verwijzing: bestand is geen symbolische " +"verwijzing" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fout bij instellen toegangsrechten: %s" + +# technotalk +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-context moet niet-NULL zijn" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fout bij instellen SELinux-context: %s" + +# geactiveerd/aangezet +# systeem/computer +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is niet geactiveerd op dit systeem" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Instellen van attribuut %s is niet mogelijk" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fout bij het lezen van bestand: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fout bij het doorzoeken van bestand: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Fout bij het sluiten van bestand: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Kon de standaard ‘file monitor type’ niet vinden" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fout bij het schrijven naar bestand: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fout bij verwijderen van oude verwijzing naar reservekopie: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fout bij het aanmaken van reservekopie: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fout bij het hernoemen van tijdelijk bestand: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fout bij het afkappen bestand: %s" + +# lezen/openen +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fout bij het openen van bestand ‘%s’: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Doelbestand is geen map" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Doelbestand is geen gewoon bestand" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Het bestand is door een ander programma gewijzigd" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fout bij verwijderen van oude bestand: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Ongeldig GSeekType geleverd" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ongeldige zoekopdracht" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan GMemoryInputStream niet afkappen" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Wijzigen van geheugenruimte uitvoerdatastroom is niet mogelijk" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Wijzigen van geheugenruimte uitvoerdatastroom is mislukt" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +# ontkoppelen is op deze koppeling niet mogelijk/niet geimplementeerd +# ontkoppelen is bij deze koppeling/bij dit aangekoppelde object +# dit aangekoppelde object kan niet worden ontkoppeld/losgemaakt/vrijgemaakt +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "ontkoppelen niet ondersteund door koppeling" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "uitwerpen niet ondersteund door koppeling" + +# ontkoppelen is op deze koppeling niet mogelijk/niet geimplementeerd +# ontkoppelen is bij deze koppeling/bij dit aangekoppelde object +# dit aangekoppelde object kan niet worden ontkoppeld/losgemaakt/vrijgemaakt +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "ontkoppelen niet ondersteund door koppeling" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "uitwerpen niet ondersteund door koppeling" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "opnieuw koppelen niet ondersteund door koppeling" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "inhoudstype raden niet ondersteund door koppeling" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "op synchrone wijze inhoudstype raden niet ondersteund door koppeling" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +# uitvoerdatastroom begrijpt de opdracht 'scrijven' niet +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "schrijven wordt niet ondersteund door de uitvoerdatastroom" + +# bronstroom/datastroom van de bron +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Datastroom is al gesloten" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Fout bij het verwijderen van bestand: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +# bronstroom/datastroom van de bron +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Datastroom is al gesloten" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Fout bij het lezen van bestand: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Kan de prullenbakmap %s niet aanmaken: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Fout bij het schrijven naar bestand: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Fout tijdens omzetten: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Fout bij het afkappen bestand: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +# openen/lezen +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Fout bij het openen van bestand: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Kan het bestand ‘%s’ niet naar de prullenbak verplaatsen" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Fout bij het verwijderen van bestand: %s" + +# openen/lezen +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Fout bij het openen van bestand: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Fout bij het sluiten van bestand: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# openen/lezen +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Fout bij het openen van bestand: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "associatiewijzigingen niet mogelijk op win32" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Fout bij het verwijderen van bestand: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "onbekende fout" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "De stroom is al gesloten" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan versie %d van GThemedIcon-codering niet verwerken" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Voortijdig einde aan gegevensstroom" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Fout bij lezen van unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Fout bij sluiten van unix: %s" + +# hoofdmap van bestandssysteem +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Hoofdmap bestandssysteem" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Fout bij schrijven naar unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +# volumen kan niet uitgeworpen worden/implemeteert 'uitwerpen' niet/ +# begrijpt de opdracht 'uitwerpen' niet +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volumen begrijpt de opdracht ‘uitwerpen’ niet" + +# volumen kan niet uitgeworpen worden/implemeteert 'uitwerpen' niet/ +# begrijpt de opdracht 'uitwerpen' niet +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volumen begrijpt de opdracht ‘uitwerpen’ niet" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Kan het programma niet vinden" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Fout bij opstarten van het programma: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI's worden niet ondersteund" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "associatiewijzigingen niet mogelijk op win32" + +# Associeren/associaties aanmaken +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Associaties aanmaken niet mogelijk op win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "onvoldoende geheugen" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "interne fout" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Ongeldige hostnaam" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ongeldige reeks in conversieinvoer" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Maximum data-arraylimiet bereikt" + +# vrij vertaald +#~ msgid "do not hide entries" +#~ msgstr "ook de verborgen items tonen" + +#~ msgid "use a long listing format" +#~ msgstr "gebruik een uitgebreide opsomming" + +#~ msgid "[FILE...]" +#~ msgstr "[BESTAND...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Teken ‘%s’ is niet geldig aan het begin van een entiteitnaam; het &-teken " +#~ "begint een entiteit; indien dat niet de bedoeling is, gebruik dan &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Het teken ‘%s’ is niet geldig in een entiteitnaam" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Lege tekenreferentie; ze zou een getal moeten bevatten, zoals dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Onbeëindigde entiteitreferentie" + +#~ msgid "Unfinished character reference" +#~ msgstr "Onbeëindigde tekenreferentie" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Ongeldige UTF-8-gecodeerde tekst - de reeks is te lang" + +# het is geen startteken/er is geen startteken +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Ongeldige UTF-8-gecodeerde tekst - geen startteken" + +#~ msgid "file" +#~ msgstr "bestand" + +# dat het pictogram bevat/met het pictogram +#~ msgid "The file containing the icon" +#~ msgstr "Een bestand met het pictogram" + +#~ msgid "name" +#~ msgstr "naam" + +#~ msgid "The name of the icon" +#~ msgstr "Naam van het pictogram" + +#~ msgid "names" +#~ msgstr "namen" + +#~ msgid "An array containing the icon names" +#~ msgstr "Een lijst met de pictogramnamen" + +# Vrij vertaald (Wouter Bolsterlee) +#~ msgid "use default fallbacks" +#~ msgstr "standaard terugvalmechanisme gebruiken" + +# Vrij vertaald (Wouter Bolsterlee) +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Of het standaard terugvalmechanisme gebruikt moet worden door de naam bij " +#~ "het ‘-’-teken af te knippen. Als meerdere namen worden gegeven wordt de " +#~ "eerste gebruikt." + +# Expres onvertaald (Wouter Bolsterlee) +#~ msgid "File descriptor" +#~ msgstr "Bestandsdescriptor" + +#~ msgid "The file descriptor to read from" +#~ msgstr "De bestandsdescriptor om van te lezen" + +#~ msgid "Close file descriptor" +#~ msgstr "Bestandsdescriptor sluiten" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "" +#~ "Of de bestandsdescriptor gesloten moet worden als de stream wordt gesloten" + +#~ msgid "The file descriptor to write to" +#~ msgstr "De bestandsdescriptor om naar te schrijven" diff --git a/po/nn.gmo b/po/nn.gmo new file mode 100644 index 0000000000000000000000000000000000000000..5c27414ae713507727b2a3127a34d71ae62c717d GIT binary patch literal 33763 zcmd6vd7NBFb?-04V308e;}tJlFOo)BJz6YmA<2tuOSX`;#FC7`BJ!Q-J2S2B>2CM! z9%*bGmV}qYtF)@Hn;*@MrA5@H@Hmk;2Gc> z!OOt+fMejNz!>}%NY?1A3!>-}a4mQ)cq_OT?1C=^e-^w5{1Uhh{4Tf(Tz4UP!8)k? zcY~_$-Cztp2#T)HfvV@b;7ahk7e&!h@Fq}nw!w?Rw}MK41XO*GfiZXz|7`}Bg6{&S zL878(l4v8i3>*h1z!!sW^6wu7&*A-R{`*N(qWV^W33w~G6+8l3yFj&j9gW!lPJ^4l z_kq`fe+jC-rI$w0%fZCsN5D0_Kc7a4FV}-=U&epefbRfb0)8Ic2A&2HZvtNdieFy? z#m8v5!?QtH6^(=9+YXQ>L=8~wexr|n06dfTKL8Pp=*ytW`!_HKpGRja{~A!`?*PvR z>;C(zJ-*%JgFgOY5LQHA1x3dxbc*u57!)1Xfs&It$iL|O`A_k`03sUECqTtN3aY>V z1r!}i=^W+X3@ZI3sC0LO;`duY_2a|fYVfYV;*g`JO># zqIVrAzV894I=T;}i=vN#>X*mB8u%>!(|EZ86kRU^RbLCF>gay|{zo7~B|3#lc#OtC zs*G+0?*(5E(uL8fbiTf?11|^f01=t!EuhLj0*anL1J{Em(MZ*I6)3t6ffN<}45)OU z0+sIx@Ko>|giP&Q2A&3P0rhA)fE{)Dc$c5K>Y=Elo z&7ksq6nq}|MNs^C9F+V#jYjGFIiTch1*q|LwSRv(C_cA9@!?IN=>Hg~{{M4O^6_sV zq(tX3=+xfr;9l@9a4Yy(@G9^u2F=ajUQp$|7gTwl21VyLK(*_%D_p%-foj(TDEWOO zC^`E8sC=IURqt0pniRe8$|%|d?f}KtdqMH<7eV#Q!=U)Ggw8r0TnCDt8^K=%-vZtR zZXxm6;3qsj0;)g136dl_3*i=>yFkg+Js_kU1B}5lu5om|1Qb0t zfhy-9h)6_l1|<)l1l5n<0!8PA*Sh}S1*)BQgW}^`zze~TgS)^-!Rx{C&5n*9_#)ol z3aVc}1S;PbLGknC>zJFtb3x@>2A&Ka1fL1^K-E7FimqP*Md#;1wfj^uodRwI)!rLH z)pI*|2Kah#JNP#6eDEuv>W^-)f6-;2`lkzuzi$Lp-|vE_g8u?aUZ1(ejl1>Wb9vte zUI5+(itlrv>U$5U@;(G!1U~HF{{d9}r_$NV|6=fB@TK6T;C@j3{5nwdy#o~ge;Ygx zd>mBzXW!_`T?s1vPEhhW1&WSWgG<5tLGkxfp!ol&|Nb2?=Ka!}T>G|wDt`|sdFz16 z|2|OV{~ovu{4yvyPu}L*u@YR)`!-N|@J>+u@;XrR@gWdVjXncPZ#?H^u088P(UpMW zUj{1un?UjVmq68f1XO(wgQEXiU<{r~X9}g*ik^KA^5n* zXMLZOt4lzJT(k>Rzq|t!e?JYz;CDdP_o4&NKD!1K|6T*CKOY3QfPW2M2(G-t<=YOb z+!m7x&e+(4ezv=O-;3nQrpKx-!%VQtBiSO?KuLU0iH-nc< zx^yY1`tAkSf)9Z|2!0*B49w~-{@vh4-X8|X!RMr|{*9p8mx8F!=$#-#Ir~d@4pO+&M*4!{{-H^`-QVE-z2Dd-|64K4qnas(zcr~>Y&PhANT_B^B_Y$ zdK~-hE#P<;3>sQ!BxRC)ghs-0`^bbLuc$={p77lWS#*MQ#!V{m29 z_16wi_0EB(g7<=I|Jy;8{~MtA`Xx|&{ty5C+|14Eo4_;pz8zG$J3#U6wcu6Y`@wzS zSHR8SOZ#q|-VHA0{ez(R_c>5}dmKCmTsv^_+d;|gouK&s04VwT9H@T&S8xnGW6q_& z3RHQMpxS*mSOf0|RnDJ)SAx$yxQVQ@M4$Dr!}Hh2qo_T7$e2SN4o4}jN#9|F$vF8EFGOmN9-T)r68_}>Da0k%NZ|2k0g{4{tWcobCo z{sNTTd;?q$p8Hz&ehYXO@2>_g1MlKf=6I6R%4PFPn2V4t& z1yns}z25cvwV>#_1w0#^1;v*)fTH_NpxSXicro~CQ00Ep;~78T(ya&eeFqqWcY><# z&EN&#?|@GO^^?4*P3Q9A1^VEBG4H?2^A5rVAu-QCOiz~Ic=RCsQynmi>n*aU)_>Y8@#Fc+v^DqBi`glHRB-?K%NLKXwO$QOf*M1xM|HJ-y z9DF6=8p2M(ZxHl5iEuSRdZR%Izk9<2_#oj_>ifU`+fk2KfZt2_Nxc()HsJ$2zK+n< zH~(A8_cM8Z!oM#8FXY?l;Fk$?!YtwCgz)>gf6zGpQ^Gk)PxwQgC4>6yBCO}z9pE1m zew%Ou;W>P}5BxMizt0g~YESOJmk_^>$1f4CCp_XlN8@~-=J|*G`(xmBgjIb1asTbF zJYE7mo$qh+?}Aqm9`^5(;Qju2ug3tV^6*~&@(l2wLj?FV%DkKqep5U!+)YpJ4@eZm~! zT7rHT@m)Gkzl#aqCHy_%e-i$Ku!(s6zCd^v;YEZy2|q|UMEEn z;V%jLeS`2~1(Ia8`TGg$3BOMG6T+pWc|RC_Yj}SLFQ4@vKIZX&$L|9-_~&Pn_GX?> z@$XLuujJd~`UdK^&w>4a6aPO-SW9@eePJyLo<`cYg8xK#9?vf%9N~F8Atii=P$PVl z@GFE*5{?nV@Bi>{rGI%7_^X7UBD|W=Bk1=A!f)AA6#WnIcL*y8|4KNAFi*$``hAA* z|Ln=l3qQc~PZQQcmwx}7u$t$;0h{{3?{dPk_|^t@6E^bvRq)*e{VwMHMFjo6Lb#o< zj`y1X_795S_jw9@{3H`TMlK|C?v=iOlzEnk`~j~iLs?)2j%c12IlB)w#^ zpZ4OZPOH^9L@mTE-?Ti=V>ZT(emtAZTfT{Oy3vl4cAU1-*|gn{+sSNt!X@`-(xTjq zYE~`Z7#mstjpesGSy~~_YSje?w$MUO}M`PFA5_fv>*fqCbR(n;wG2Q5A z@$4Y$#}ldN47n!e;}y}0_)w!i(;4*RPB(3fUt`hcc%sv3&L+JkiF@(BTei7YC9PhX z)aT>$a3kwy(dKTq)tF5BjZQn>)fHqLqRm;>nQXX^lO(rTbx}6xc00X3^^%;9xqNN3 zx!>yMILKEk;P9?}t zJ-R+=FYm{bo$h>GZ}ig1ey2Adcjl0h{I#5Bbc|Y(#)FJpJGSlELUHY>#`K`)+J~^! ziCLO$AcVq7S&|Z`o?6a&nl<|!-?F^ydIzcQC5K}5M~nndA82$AAmZ(I+B%?*2U?AG zdLV~)ZkN+(KWU@)DF=rB4akP9bV{SFauGws{E3R2>3(qnklJA;W< zDjkAwne0jK9lMKEjdnksrkfW{*6$74jE6M7aYs6flx=Hw2mL*L`eQb_-gQolZklbh zNtCJI5)sgEB&}iyE2YmQ^V+xxGR$S8kxD099cpg-R&~gO=*xdOJ^IComQv4F`n(9URsT&x_7=a&{#oy zXyPp8X9=>Dm!7K}akQMt1DpTo4!Uj7P7jj^ zk)Sh^Db1&vZqhpkNh^!9#x!g#=2!YSSL7P98gu9gZ{NtEGdfFF-B>z4 zJsxk8Rde-*$++Jr)=xBz#ds_>hwkPGnh(gtEEI+jC_if#$3K^<8oATiZ-S%&C=$31AU+L z(hW{^#>?&;bov|PWi9(MecXbPh~%?2NYbdg?5AE7c%1 zY`U`gdC+bgE`LU4_my1cfT_&xd?~s@N-5fZaVE-PF0l6XZ>`Rp)=JfrD!Eg z`ZFq^WGj{8XOpHPv-#PH4(2jbWV>08?#wBAs3FW-GT`E+Zq@`h#J=f8RH>ApfO2EV zWNJhLo3|uyi^P>a%QO;c9W(7^4LK%j{tF}zSChwS(j973C2pvPde}>&_>h0czz)4P z#K1fW<^#R8uvVs|KyImZ3`O^yE@fSkuqGIymw{wGhdx;lG^uEmoS)EwKuTDAnqsyA7;v*_yJ)Xq(pfu)t=c|ci zCZAZ!p~i*cX3`b|MU_tXlG%ktb+x)sVy8642uE!2T$C6_vzo&t*taUpLzGCdFZl6iI z&ZzXI@Y3mEVWR9y-KxnYt|$E@toKS%dV0!>biLX${vOT{B~_GPG0twhqo%A3JzrXdU`=M+HpoP#aeI+T(b zFZhMLU1%xzZ1%iMuU23;I!BK;?`h=Za*OuXoP0>pO(>Ycg=uaZRyS&rITo~NZb&3; z#!&A>+ZOW$RTl*#l2sNB+q_Hs#yuDtdvSN0o3zzny%eHywPSAZcuY=k5hsltmQ5=b zO?|=%2l!$xUwZ;2D&ZCDMkI8E;Uh426IN4UP&=W_i5y`!sju>Qjf;^VG)D%$IPZs& z+2{$MXK+JR@-|ak{llrkRI(sKMjx{@jlhc(%FIrrQJ&Ls>h-3bGiA=4%`z-xzn5q) z(x&aXMz7PBU{zB%)6e@Fr}3J$b8-$bg{k**%fNDOr=6xyyreS}ocpYByFm!{s&oUU zM;a~6(Fi*D5SScG_&#*bI% ze^)W`SvW#U)OnLx4%PJ|h!B5V(;OAKg-w%duCQ*>=&f|kUg`V?=DQkE*r1&|7xTR@ zE4)aXyDx3pEO@zCiop3Ni-*~zo*9uEU5nGz`Ab~N=;m~)Z<`>jYn>~d6^>1<6lPP? z#9#`qa^#%c)hWOn#5P4Fc+{gE4d=qkhlKZF?$9Q}MA|F8Y;tCj15u=uItO$t99CV zpuQ3zY*U%>lAD}FTR-9_!+3=9QsQDyO(b-CjXAT*TR62eY$n7NbNjkBFPhVNd5UPw zlD1=}`mD>)5gB!8hcqmztmV7vWq-WdQ*y$wV|vx{;AG5~wgqE`HtM1$E9~m!8X(J8 zm3CoeZ%7xJm18m}kKRzhHm;oe0arYp=#po5V{RLkHyeTiD|8-=C}(pUyvHZlyH({U z!_Ltz=x7)Cp&7af)hu1?bb_S2n6FLU3^gg*6>J(CDTTZj-_3W3^FD29_i~pr?3gh| zTO(#xMZ2%RWeZ9jA25Clq}wgRksgV(EDjXidM%)+-5i3x;uFl6r{1+^+ieuyYPl7m z_e+|8ai~4JEvaM%LBk)MIWJ^o8(3~u=u;QDG|}$i-7p4^HzOaWD>!3c2WMNfl)JC-9E0NAmQ*<7l3hi|j9kgerb4VNRu~wtrDV9a{ zwfdzq=&{}AJB+>e+=u*cJRxe zR9azDL_<;H#gGcwi>Zwqcx4&7AlTWr*)OUl^22jwSR|^{kO8G5D`T(v(|OeiTux{diolE-tEQCJRVz9@2f{*hc=po}4Vzasy!Yih%W<0YG(Ot(T4$=}d$JsD z8$HYom9s5&aOgmn83lk(R+X?Ewi8CAxiq|xs- z>J(zmol+8+F*fo09oFGihxnDYg=r}RiBQ{Yvr`Z|Ql0lx?W?rOojM3fi_Mwv#mkpz zO**_f3nIFVKb(-5Ube=ee>$jw9vT^Yqh>1BO{!31vv;&FOQzEe(XFNIuo-UJkO>d;Wegc$({|7oMO8x?R9*!qP(iy$>I&rv1`T@S)8x4O@blKCbj2|*V*Bx z+{FsBWf$UEQ!995YOU%^4OU#bb{r{8x{(TDxKEnLp~ZenU*m>JryflvSz5D=3JIy3 z=(2che`{sD|7OB~ux~|PkxtX-up-iyMumayCIXnf|M1;(%{_(12SW>2uMTh7VKXG) zP?Wa=-R4%y-i#<8gXte)g=WWK(u^Fv-k>Xsu`_Xy@gF&Naz6IzEW&gU%o&n}w=Z>x z7m1Z3Qsc!sEZs&DP32oS+B0xo(r6|sn z`c%czW4OQbF5r~u*yUAIO^PPU?5OMSYYP-C%rRT+=AZ* zcqpi3&E(03)I|QK^o6NI#e>BG$ z3>GamK`a_=&dn$vP+r>Aoo;!FI3Zz(q1=^jUX?9Sa~g0I!*};Onv-hV>a|{JTI;-vFn9`EnyY|+umjXbU*KR-$Y>3ycUbDKk`tsV^E8;b4 zHmqA;TfJ`eY7*9NVXW(zMxJgpacgU9*TrkD+;I8jmyvJvlAAf(SKG@V&shBH#K^HX zWE>Kx$9tLwkKNDOLAK?lB(aa#wS!i#(HtK%I^*rm)nsl@4=^Wdd+}y%h$XW*S5@aJKlved2XG&FWS6jeD#v+IsD3?uW9RSgZThf;ge`^ z08YaX$Lm$*;V;sOZq!$8i@$@iAznYx=r6ggb|Z%r?X1~`c>8t91WTYb<7?K8uUoRa z#VP+*Z7cH->%zF*wfF3*wRj-y@v5L`4%%gq%@lCX62eoBiwTd z4?Fab)i9^cX6Mmi^`c93^ns<>(TAAD<3_W2kPTBzuyQRizAGYArh%gmY&!Z-&FUVH zZ@~U&!djOL9glm5PgC;*@l9Me{wU!$P_+9z6{)sna>S>v@J;phXajy^OF7{Nu| zw#ktES1U^9GTa~96V|SCPiI_R4I8aJI)s|^*{(5yh%`d3KKhVdf^meodoY?5XOF!< zo;r4Cv}})Qd_NIXhZT&^;}WChykf{ zDa^MUqGNC1Xu@=&e5x77FH)PVaP z`DK_sU0QEw|AfM z1Rce+(q-Spwt>Ri!gLmGDNAuyla16)x2yANt|;$RDeAIxXnnD6D5WudqBm%=Mrpgv z&74HbW^|?#7#C^)4x37jNR5ZB}Cg9H{$r>iwV zh)a3h&nugVaJTobZk^2TC@+{5Dsqy|bMcas5H#9O~CPmbp z4q<_d2uOq0(-xDRQyO@S(bisGylT}9?XTM$Cw9HdYSs`l3pLR)-LpYq!;@SHo4Nez zs}9FQLaQ^!%C1a8sT@bIr%5Xy<W%lF8UVC3`gNaGR=gBy^>n_>snk^|_O|)jFbm4Z8CL3YVrtN;4 z*v_PwUNl`Sfhbg%#Kd>|usXB>n`^xUxl(+o7gb0eW5 zVotz@bm9r-GX=EgAd|)%DxR%yyN@HyE)9w(y46E%8vg=1lhL2zORFvWFOD?#Pzz1xD2{oeg1b!Ofs15qJ!;JTt`&*UrdB zHOMZbeI`4;6LQ9x`YRVv6$(=g{$$z|Qz_Fs?tyMQ&FwH1tP0Fe6j-8nSY=EVzZR`v zC8mXhkMWlsx!g@p}1=PM$^d za}Q3vDI=3E*YMJ2FZXE_!?MfAGaJR+=IF*8`5 z6_vW;%^oB1jSb|Oh7fWUK@slShvOBV6 zwfTCO^EAojedz6H*MnaEi|p2s&cb#JB<%CWWAl3xr4E?FSPyL!^+j&a(Ng?$B9D4i zBuf1-++i7iQbOkUvG=#CC5vjCIPDCpxc_AFvnV6HjW0|))NMxC`{Ws+XNQlG6cjYFf^z)fA$Rw}D??8y9_k7BgBOx2+?QdCbg?N%+c zq{X}s!h5E2!FK}Usx3rBBdj-T%itItC$28izG@zym_-G;Mi-O(IX z)CuS|tqMlQJ1U#z?#`2#v-sHkGBW6o`DRngN{K=-IKwb-`Ei*h+~H}uTj*3ds)VAi zLXU7~>9}p`sL%NNH@bLPmI1w0&F33Gz`n zJbr9wYOY7QH_e>DorYJY(yis2O=x!4EyE?5Alqs(tZ0k2*pB*e24`hdDk^R|En1D2 zf7YKvf;U`zp0LL-(jSlMY3f5lbo~k2*O@C5Nw1yC9>yEwHvWgp8T4^3kyT5K(zXlQjcrJ<8F z&78&X(V7JtMx3p5#*{=_*FqNU#NhfUWivVEWD6^u4RN?qwP*om!IX202wU|sB+B=p zPPhacT?>|=r7Hf5rE2+bTwXYD3KHdf3>>6Gt4<8q26P@knQ~5FY59d=DZ?W7D#ZSl z6=zS-1NCD^xF55^d;s!KU?DLX;c>wXM$sFS(7bqx8WiSP4k}jV8A$YgNt8_`WU_1 zUS!3%NJg5nNQQlW$yvJTMPJBmQIA4gZV2km!tKQ}J;E~`A%?95;F7;rkaVEcmB)ke0=F&G|%%Pey#f0_%AvQD>$ z8(x9lJn?L!h3l}=7L*9nack*7zqOq%anKpZF7gm~ln)o||1{{xX^}A7p ztJ@~4tUtb>%msxxUl5)%m0@$5TV|-Nr&fxUkW=aAN55oo{`~b7YD|^LSzED_G^ys9 zG^KiiU60kUW4J8i86ba<+)|otWiQHE)*D@i>}FSN*ambP#DRyET&yjonNX@+9+_g8 zo0UZBLRaT-GCH-=gOzN~$_rUt_qgO~v@ahW?4rmD&?Ka-Kef+ew;7Q)&NGxhcV)JVYq7gQ#exoV0%yJLNot23 zGQ;*R8yQqFWD{>Q*Lkq9>01_doJQ#BkIJd7j5OUPg9KX(;S$uitk&(S3}r~5*v^vs z-cKv`1@cQp2bzo|KN^P(5x2Lf!t*AKYC(k!wqxq(amtl$&2x`rz;5jV_iH-uhj%bY zLC(%6$vv88uXI8q;TTj%d~AD|ZS8Hru`tJ~8m}ZNq8)O`=X+$HcfljA5qI=~t8_GC z)D}qKG|F&+H~+Zha@dZ6s$qZh0ge%P{pv=!opA79Bsqve@DjW2HQPck=izXrsEk}u zV4Y0$m`H--XFT4X8{q8WdH1YH2+BGb^?4S}Zw#^HwnPPBa^d-R!zDB77THJg&CzDC zIO|lgjgCNNu2wa{3^&hRY}3Y&m=|OwjLTiY@FUXu)+aF5nDk24=a7jOR%mudtv1n^ zXf?>uRN=vOBVP@Sa~T5^!wSCL zB6ZuTGFx*+qlFY5O_$lOfej}+8D#RmbW*q4dXVIVh^B3V!K(t;k;L5o}y{D~_A3+=??V zh@BUr6?9KZLo#+_W)oE8R&|$g$(b9rK*Ny`-5S;u7!3`TQ>n`L86#BpK$`TZrleXW zSz+rAcjP60S;}SG+(|o{e*Rumv=zmrH972P9mLRaXI>baS|Q5hSekJ)w%h16JH673 z><3b$`)}UY?Zk>Kb~96&1j@pw3<(E1|71F$oG?!%uG7UixuKfjiQS#x3S_xMP2rf= zkT1lNYBK;9%D108?{m*dUK=DkD@Uf9bUUV2(!)YmAGkp(V{Cb|;e8xxK0d4BxMFZE@y{SF6Z%!!sb%UXBk|qJ0bd`m9|JGN#<3RE~NJcS(iF2b~@8!lGMyl5Cvcu?I;Ot>%qzRK7G|tv%o*BgB%#S>>rE<*rSr*tsvg z)vRkp=nFTKobVxE)T~ZT21h)KK{FPo@|wrqzfjRa3a1mx+l!GeAmfO?rU#Cbwei8X zIlNMj+@`QM9(~c!P8Xvg=Bc}4SrXG`=M7~|#yO2-%`FS{Q?AUoYYG6}~rY6&@Qzj1LPK(?? z&l>gzW}wzDD27Z%dO-W#uwc-Sj+ZLyVmV>ox)ma3GB@;)gv!xqZB&`hJDR~nN-$z| zPfsIMhcb+ykugq^jy`Y?D^QmzEY`v<0jqoN8t7bTgugGpsh5VUdiqO3#4rqSz2j#q zKYKx4z@ShEN=A3|!ZF15ylER-vPU6J5HNQ^FMO@Y3mt3igejczYe%C-9^Q^%Nl)qQ zD)#j>ho(fat<04Jf&#UM9cw|RGlX2+^AvJy>9g)Y5g7-Q?*(&3Dkq_^M}@Xh3oDU@aN#E+qHE8 z-4)?*ht65zR~1lx79Fz=Wva=CAp1L>hHt2pn2SX^d{B?_5n-RJL`f$)GTi!X;dzRj z?~x8P4k@iv-Wb&DJn>3|`!#O|lGVUCRlCAVp0d{C`~%TP1!O!?1o>sQHf0DBP04x-o, 2002. +# Åsmund Skjæveland , 2003-2008. +# Norwegian (Nynorsk) translation of glib +# Copyright (C) Free Software Foundation, 2002. +msgid "" +msgstr "" +"Project-Id-Version: nn\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-02-24 17:33+0100\n" +"Last-Translator: Åsmund Skjæveland \n" +"Language-Team: Norwegian Nynorsk \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Uventa attributt «%s» til elementet «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributt «%s» til elementet «%s» ikkje funne" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Uventa merke «%s», venta merket «%s»" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Uventa merke «%s» inni «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Klarte ikkje Ã¥ finna gyldig bokmerkefil i datamappene" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Eit bokmerke for adressa «%s» finst frÃ¥ før" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Klarte ikkje Ã¥ finna noko bokmerke for adressa «%s»" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Det er ikkje definert nokon MIME-type i bokmerket for adressa «%s»" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Privat-flagg er ikkje definert i bokmerket for adressa «%s»" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Det er ikkje laga nokon grupper i bokmerket for adressa «%s»" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Det er ikkje nokon program som heiter «%s» som har registrert bokmerke for «%s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Klarte ikkje Ã¥ utvida køyrelinja «%s» med adressa «%s»" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr ")" +msgstr "Dokumentet mÃ¥ byrja med eit element (t.d. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"«%s» er ikkje eit gyldig teikn etter ein «<»-teikn. Det kan ikkje vera det " +"fyrste teiknet i eit elementnamn" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Merkeleg teikn «%s», venta eit «>»-teikn for Ã¥ avslutta startmerket av " +"elementet «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Merkeleg teikn «%s», venta ein «=» etter attributtnamnet «%s» av elementet «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Merkeleg teikn «%s», venta anten eit «>»-teikn eller «/»-teikn for Ã¥ avslutta " +"startmerket av elementet «%s», eller ein valfri attributt. Kan henda du " +"brukte eit ugyldig teikn i attributtnamnet" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Merkeleg teikn «%s», venta eit ope siteringsmerke etter likskapsteiknet for Ã¥ " +"gje ein verdi for attributten «%s» av elementet «%s»" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"«%s» er ikkje eit gyldig teikn etter avsluttande merket «%s»; det tillatne " +"teiknet er «>»" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elementet «%s» vart lukka. Det er ingen opne element no" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elementet «%s» vart avslutta, men det opne elementet er «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller innheldt berre tomme teikn" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument avslutta uventa rett etter ei open vinkelhake «<»" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumentet slutta uventa med element framleis opne. «%s» var det siste " +"elementet som vart opna" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentet slutta uventa, venta Ã¥ sjÃ¥ at ei vinkelhake lukka det avsluttande " +"merket <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet tok uventa slutt inni eit elementnamn" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet tok uventa slutt inni eit attributtnamn" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Dokumentet vart uventa avslutta inne i eit merke som opnar eit element." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentet slutta uventa etter likskapsteiknet etter attributtnamnet; ingen " +"attributtverdi" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet avslutta uventa medan det var inne i ein attributtverdi" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumentet avslutta uventa i eit lukkemerke for elementet «%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentet avslutta uventa inne i ein merknad eller prosseseringsinstruksjon" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "øydelagt objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "intern feil eller øydelagt objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "tom for minne" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "tilbakesporingsgrensa nÃ¥dd" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "mønsteret inneheld element som ikkje er støtta i delsamanlikning" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "intern feil" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "tilbakereferansar som vilkÃ¥r er ikkje støtta i delsamanlikning" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "rekursjonsgrensa nÃ¥dd" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "arbeidsomrÃ¥degrensa for tomme understrengar nÃ¥dd" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ugyldig kombinasjon av nylinjeflagg" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ukjend feil" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ pÃ¥ slutten av mønsteret" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c pÃ¥ slutten av mønsteret" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ukjend teikn etter \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"skiftesekvensar som pÃ¥verkar smÃ¥/store bokstavar (\\I, \\L, \\u, \\U) er " +"ikkje tillatne her" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "tal ikkje i rekkefølgje i {}-kvantor" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "tal for stort i {}-kvantor" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "manglar avsluttande ] i teiknklassen" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ugyldig skiftesekvens i teiknklassen" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "spenn ikkje i rekkefølgje i teiknklassen" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ikkje noko Ã¥ gjenta" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "kjenner ikkje att teiknet etter (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "kjenner ikkje att teiknet etter (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "kjenner ikkje att teiknet etter (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-type klassar med namn er berre støtta inni ein klasse" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "manglar avsluttande )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") utan opnande (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]tal mÃ¥ følgjast av )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referanse til undermønster som ikkje finst" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "manglar ) etter kommentar" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regulært uttrykk for stort" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "klarte ikkje Ã¥ fÃ¥ minne" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "bakoversøk-pÃ¥stand har ikkje fast lengde" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "uleseleg tal eller namn etter (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "vilkÃ¥rgruppa inneheld meir enn to greiner" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "pÃ¥stand venta etter (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ukjend POSIX-klassenamn" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-type sorterte element er ikkje støtta" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "teiknverdi i \\x{...}-sekvens er for stor" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ugyldig vilkÃ¥r (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ikkje tillate i bakoversøk-pÃ¥stand" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursivt kall kan kanskje gÃ¥ til evig tid" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "manglar lukketeikn i undermønsternamn" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "to namngjevne undermønster har same namn" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "feilskriven \\P- eller \\p-sekvens" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "ukjend eigenskapnamn etter \\P eller \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "undermønsternamn for langt (toppen 32 teikn)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "for mange namngjevne undermønster (toppen 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "oktalverdi er større enn \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-gruppe inneheld meir enn ei grein" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "det er ikkje tillate Ã¥ gjenta ei DEFINE-gruppe" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistente NEWLINE-val" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g er ikkje følgd av eit namn i klammer eller eit ikkje-null tal i valfrie " +"klamer" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "uventa gjentaking" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kode-overflyt" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "gjekk utanfor kompileringsarbeidsomrÃ¥det" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "tidlegare kontrollert referert undermønster ikkje funne" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Feil under samanlikning med regulært uttrykk %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-bibliotek er kompilert utan støtte for UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-bibliotek er kompilert utan støtte for UTF-8-eigenskapar" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Feil under kompilering av regulært uttrykk %s pÃ¥ teikn %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Feil under optimering av regulært uttrykk %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "heksadesimalt teikn eller «}» venta" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "heksadesimalt teikn venta" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "manglar «<» i symbolsk referanse" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "uferdig symbolsk referanse" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "null-lengd symbolsk referanse" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "venta siffer" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ugyldig symbolsk referanse" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "laus avsluttande «\\»" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ukjend skiftesekvens" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Feil under tolking av erstatningsteksten «%s» pÃ¥ teikn «%lu»: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Sitert tekst startar ikkje med eit siteringsmerke" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Upara siteringsmerke i kommandolinje eller anna skal-sitert tekst" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teksten tok slutt rett etter eit «\\»-teikn (Teksten var «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teksten tok slutt før avsluttande sitatteikn vart funne for %c. (Teksten var " +"«%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksten var tom (eller inneheldt berre tomme teikn)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Klarte ikkje Ã¥ lesa data frÃ¥ barneprosess" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Klarte ikkje Ã¥ oppretta røyr for Ã¥ kommunisera med barneprosess (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Klarte ikkje Ã¥ lesa frÃ¥ røyr frÃ¥ barn (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Klarte ikkje Ã¥ skifta til katalogen «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Klarte ikkje Ã¥ utføra barneprosess (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ugyldig programnamn: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ugyldig streng i argumentvektor plass %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ugyldig streng i miljø: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ugyldig arbeidskatalog: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Klarte ikkje Ã¥ køyra hjelpeprogram (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Uventa feil i g_io_channel_win32_poll() ved lesing av data frÃ¥ barneprosess" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Klarte ikkje Ã¥ lesa data frÃ¥ barneprosess (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Uventa feil i select() ved lesing av data frÃ¥ barneprosess (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Uventa feil i waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Kunne ikkje starta barneprosess (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Klarte ikkje Ã¥ utføra barnprosess «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Klarte ikkje Ã¥ redirigera utdata eller inndata frÃ¥ barneprosess (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Kunne ikkje starta barneprosess (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ukjend feil ved køyring av barneprosess «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Klarte ikkje Ã¥ lesa nok data frÃ¥ pid-røyr frÃ¥ barn (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Teikn ikkje gyldig for UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ugyldig sekvens i inndata-konvertering" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Teikn ikkje gyldig for UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Bruk:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[VAL...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Hjelpeval:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Vis hjelpeval" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Vis alle hjelpevala" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Programval:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan ikkje tolka heiltalsverdien «%s» til %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Heiltalsverdien «%s» til «%s» utanfor gyldig omrÃ¥de" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan ikkje tolka flyttalsverdien «%s» til «--%s»" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Flyttalsverdien «%s» til «%s» utanfor gyldig omrÃ¥de" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Feil under tolking av val %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument manglar for %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Ukjend val «%s»" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Klarte ikkje Ã¥ finna gyldig nøkkelfil i søkjemappene" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ikkje ei vanleg fil" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Fila er tom" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Nøkkelfila inneheld linja «%s» som ikkje er eit nøkkel-verdi-par, ei gruppe " +"eller ein kommentar" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ugyldig gruppenamn: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Nøkkelfila startar ikkje med ei gruppe" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ugyldig nøkkelnamn: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nøkkelfila inneheld den ikkje støtta kodinga «%s»" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nøkkelfila manglar gruppa «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nøkkelfila manglar nøkkelen «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Nøkkelfila har nøkkelen «%s» med verdien «%s», som ikkje er UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Nøkkelfila har nøkkelen «%s» med ein verdi som ikkje kan tolkast." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Nøkkelfila har nøkkelen «%s» med ein verdi som ikkje kan tolkast." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Nøkkelfila har feil i nøkkelen «%s» i gruppa «%s». Verdien kan ikkje tolkast." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Nøkkelfila har ikkje nøkkelen «%s» i gruppa «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Nøkkelfila inneheld escape-teikn pÃ¥ slutten av linja" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nøkkelfila inneheld ugyldig escape-sekvens «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Verdien «%s» kan ikkje tolkast som eit tal." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heiltalsverdien «%s» er utanfor gyldig omrÃ¥de" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Verdien «%s» kan ikkje tolkast som eit flyttal." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Verdien «%s» kan ikkje tolkast som ein boolsk verdi." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "For stor teljingsverdi sendt til %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Straumen er allereie stengt" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operasjonen vart avbroten" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ugyldig bytesekvens i inndata for konvertering" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Operasjonen er ikkje støtta" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Ukjend type" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s-filtype" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s-type" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Uventa tidleg slutt pÃ¥ straumen" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Utan namn" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Skrivebordfila oppgav ikkje Exec-felt" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Klarte ikkje Ã¥ finna terminalen programmet krev" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan ikkje laga programoppsettmappe %s for brukaren: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan ikkje laga MIME-oppsettmappe %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan ikkje laga skrivebordfila %s for brukaren" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Sjølvvald definisjon av %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "stasjonen støttar ikkje Ã¥ løysa ut" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "stasjonen støttar ikkje Ã¥ løysa ut" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "stasjonen støttar ikkje Ã¥ spørja etter media" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "stasjonen støttar ikkje Ã¥ løysa ut" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "stasjonen støttar ikkje Ã¥ løysa ut" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operasjonen er ikkje støtta" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Omsluttande monteringspunkt finst ikkje" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kan ikkje skriva over mappe" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kan ikkje skriva ei mappe over ei mappe" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "MÃ¥lfila finst" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kan ikkje kopiera katalog rekursivt" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolske lenkjer er ikkje støtta" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Feil ved opning av fila: %s" + +#: gio/gfile.c:2906 +#, fuzzy +msgid "Can't copy special file" +msgstr "Kan ikkje skriva over mappe" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ugyldig symlink-verdi oppgjeven" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Papirkorg er ikkje støtta" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnamn kan ikkje innehalda «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volumet støttar ikkje montering" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Ingen program er registrert til Ã¥ handtera denne fila" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Teljaren er stengt" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Filteljaren har ventande operasjon" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Filteljaren er allereie lukka" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Straumen støttar ikkje query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Søking ikkje støtta i straumen" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Trunkering ikkje tillate pÃ¥ innstraumen" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Trunkerung ikkje tillate pÃ¥ straumen" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Innstraumen støttar ikkje lesing" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Straumen har ventande operasjon" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Klarer ikkje Ã¥ finna typen standard lokal mappeovervakar" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ugyldig filnamn %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Feil ved henting av filsysteminfo: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kan ikkje gje rotmappa nytt namn" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Feil ved namnebyte pÃ¥ fila: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Kan ikkje gje fila nytt namn, filnamnet finst frÃ¥ før" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ugyldig filnamn" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Feil ved opning av fila: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kan ikkje opna mappa" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Feil under fjerning av fila: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Feil under kassering av fila: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Klarte ikkje Ã¥ laga papirkorgmappa %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Klarar ikkje Ã¥ finna toppnivÃ¥mappe for papirkorga" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Klarar ikkje Ã¥ finna eller laga papirkorgmappa" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Klarte ikkje Ã¥ laga infofil om kassering: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Klarte ikkje Ã¥ kassera fila: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Feil ved opning av katalog «%s»: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Klarte ikkje Ã¥ lesa den symbolske lenkja «%s»: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Klarte ikkje Ã¥ laga symbolsk lenkje: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Feil under flytting av fil: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kan ikkje flytta mappa over ei mappe" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Klarte ikkje Ã¥ laga tryggleikskopi av fila" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Klarte ikkje Ã¥ sletta mÃ¥lfila: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Flytting mellom monteringar ikkje støtta" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attributtverdien mÃ¥ vera ikkje-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Ugyldig attributtype (venta streng)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Ugyldig utvida attributtnamn" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Feil under endring av utvida attributtverdi «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Feil under lesing av informasjon om fila «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "(ugyldig teiknkoding)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Feil under lesing av info om fildeskriptoren: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ugyldig attributtype (venta uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ugyldig attributtype (venta uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ugyldig attributtype (venta byte-streng)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Feil endring av løyve: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Feil endring av løyve: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Feil under eigarskifte: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolsk lenkje mÃ¥ vera ikkje-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fil under oppretting av symbolsk lenkje: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Fil under oppretting av symbolsk lenkje: Fila er ikkje ei symbolsk lenkje" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Feil endring av løyve: %s" + +#: gio/glocalfileinfo.c:2149 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "symbolsk lenkje mÃ¥ vera ikkje-NULL" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Feil under eigarskifte: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Å setja attributten %s er ikkje støtta" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Feil ved lesing frÃ¥ fila: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Feil ved søking i fila: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Feil ved stenging av fila: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Klarer ikkje Ã¥ finna typen standard lokal filovervakar" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Feil ved skriving til fila: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Feil under fjerning av gamal tryggleikskopilenkje: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Feil ved oppretting av tryggleikskopi: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Feil ved namnebyte pÃ¥ mellombels fil: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Feil ved trunkering av fila: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Feil ved opning av fila «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "MÃ¥lfila er ei mappe" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfila er ikkje ei vanleg fil" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Fila vart endra utanfrÃ¥" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Feil under fjerning av fila: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Ugyldig GSeekType sendt med" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ugyldig søkeførespurnad" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan ikkje trunkera GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Utstraumen frÃ¥ minnet kan ikkje endra storleik" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Klarte ikkje Ã¥ endra storleik pÃ¥ utstraumen frÃ¥ minnet" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "monteringspunktet støttar ikkje avmontering" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "monteringspunktet støttar ikkje Ã¥ løysa ut" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "monteringspunktet støttar ikkje avmontering" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "monteringspunktet støttar ikkje Ã¥ løysa ut" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "monteringspunktet støttar ikkje Ã¥ remontera" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +#, fuzzy +msgid "mount doesn't implement content type guessing" +msgstr "monteringspunktet støttar ikkje avmontering" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "monteringspunktet støttar ikkje avmontering" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "utstraumen støttar ikkje skriving" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Kjeldestraumen er allereie stengt" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Feil under fjerning av fila: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Kjeldestraumen er allereie stengt" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Feil ved lesing frÃ¥ fila: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Klarte ikkje Ã¥ laga papirkorgmappa %s: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Feil ved skriving til fila: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Feil under konvertering: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Feil ved trunkering av fila: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Feil ved opning av fila: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Klarte ikkje Ã¥ kassera fila: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Feil under fjerning av fila: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Feil ved opning av fila: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Feil ved stenging av fila: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Feil ved opning av fila: %s" + +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "Ã¥ endra assosiasjonar er ikkje støtta pÃ¥ win32" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Feil under fjerning av fila: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "ukjend feil" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Straumen er allereie stengt" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Uventa tidleg slutt pÃ¥ straumen" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Feil ved lesing frÃ¥ unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Feilved lukking av: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filsystemrot" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Feil under skriving til unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volumet støttar ikkje Ã¥ løysa ut" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volumet støttar ikkje Ã¥ løysa ut" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Kan ikkje finna programmet" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Feil under oppstart av programmet: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI-ar er ikkje støtta" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "Ã¥ endra assosiasjonar er ikkje støtta pÃ¥ win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Å laga assosiasjonar er ikkje støtta pÃ¥ win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "tom for minne" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "intern feil" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Ugyldig vertsnamn" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ugyldig sekvens i inndata-konvertering" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "NÃ¥dd maksgrensa for dataarray" + +#~ msgid "do not hide entries" +#~ msgstr "ikkje gøym oppføringar" + +#~ msgid "use a long listing format" +#~ msgstr "bruk langt listeformat" + +#~ msgid "[FILE...]" +#~ msgstr "[FIL ...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Teiknet «%s» er ikkje gyldig pÃ¥ byrjinga av eit entitetsnamn; &-teiknet " +#~ "opnar ein entitet; om dette et-teiknet ikkje er meint Ã¥ vere ein entitet, " +#~ "skriv den som &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Teiknet «%s» er ikkje gyldig inne i eit entitetsnamn" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Tom teiknreferanse, bør innehalda eit nummer slik som dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referansen til entiteten er uferdig" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referansen til teiknet er uferdig" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Ugyldig UTF-8-koda tekst - for lang sekvens" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Ugyldig UTF-8-koda tekst - ikkje eit startteikn" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Vertsnamnet i URIen «%s» er ugyldig" + +#, fuzzy +#~ msgid "name" +#~ msgstr "Utan namn" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Vertsnamnet i URIen «%s» er ugyldig" + +#, fuzzy +#~ msgid "names" +#~ msgstr "Utan namn" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Feil under lesing av info om fildeskriptoren: %s" diff --git a/po/oc.gmo b/po/oc.gmo new file mode 100644 index 0000000000000000000000000000000000000000..baaa9e60e41792a31b0626c7cdf9c3418e6ad3ce GIT binary patch literal 1249 zcmZva&u`pB6vwAferdiw1 zK7Da}&buAQU`?~e%LN_#ys8S73a^Z&NfqD{wr#Dklv;^%ol~Z)Ouey9Ld&j8BA12S zzA7a3mtDWj?Fei$@`g+$^?#E=svOC(@(mm5BT=ZV)o4*lwxxytzMI(K|(66)Qwp_zdFA%&bB^`G3-T=JZrLIx;F__f1Jz p|K!+t_;hYhHdR$9=2D|&UVHXXVj68q_E2dro}s~D&aH(xUjgF|H`V|E literal 0 HcmV?d00001 diff --git a/po/oc.po b/po/oc.po new file mode 100644 index 0000000..1815a92 --- /dev/null +++ b/po/oc.po @@ -0,0 +1,2022 @@ +# Occitan translation of glib. +# Copyright (C) 2007 Free Software Foundation, Inc. +# This file is distributed under the same license as the ekiga package. +# +# +# Yannig Marchegay (Kokoyaya) , 2007. +msgid "" +msgstr "" +"Project-Id-Version: oc\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-04-23 10:42+0200\n" +"Last-Translator: Yannig Marchegay (Kokoyaya) \n" +"Language-Team: Occitan \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Impossible de dobrir le fichièr '%s' : %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Impossible de dobrir le fichièr '%s' : %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Impossible de dobrir le fichièr '%s' : %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u octet" +msgstr[1] "%u octets" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f ko" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Mo" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Go" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f ko" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f ko" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f ko" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Sintaxi :" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcions de l'aplicacion :" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Lo fichièr es void" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipe desconegut" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sens nom" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nom d'òste invalid" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "" + +#~ msgid "[FILE...]" +#~ msgstr "[FICHIÈR...]" + +#~ msgid "name" +#~ msgstr "nom" + +#~ msgid "names" +#~ msgstr "noms" diff --git a/po/or.gmo b/po/or.gmo new file mode 100644 index 0000000000000000000000000000000000000000..7c4f557a6510bca41d324fb0119d5492a088f03c GIT binary patch literal 65787 zcmeI5d4OGIefN(`MG^M}tqPYVB!Nsw*hyFnA%sYPKoU?4jW;uQCYQ|29p=uE1O$U9 zAc(jDm0A;)1gbNDq9BUk@>Z<2uS=^`t2OQ0SBkBDZSB7Ke!joobDp!@duMJIZ2#!M z$@iXfp5?dye$R8xo%z$3Klhe|pBtW)B(Dbt_e+vDJUdAqeT}Xr$-IM-#0*Lz9G$Ne`%b&I9)cH-JZh*MKL24}p-B{2V+6 zeEEzdITBn7YQBx&(ct?)&G%(+KKM6a4_JXnwLb^cd{=>@?@q7+J`9SlKL$nDvu8TJ z2Y_=pUkWl*G6vElxgCV{2P@!8a1l5LehhpF6uqlyEO`!s3&Hn- zbHT5HhlBqV&JX59Dm@R>^-K6i^WOqi!AHR}zyn}fa;brm+wI^2@DD)E|9qHuBlspz z^W6wu2tE<;K!hZDZ3HE!-vPz%_rX)aUxLSir$Xd1a2)&q_&8Vr&!dy%ISL*CUI)r9 zcYxyeE1>xJK{)>f_;Swoo#*}D0IJ_np!%H$N)N-}LEsIb1k7`kxPK{$Wsd_3m)}w*x*B@VlVs``d87FG5uN!$9fz6j0+;LCt?BQ@VOYJ?0N<$I!+De7l7(F0;1~VgCHVK9tAb;Pr)~U&qk^0Ujb27 zvH%nv1EBg}1FHRYQ0=||O7BmCvZt4$G(?mv0_8`epxR9Y{3>_~=Q}}MD>?8u_m9&- z&A%SRw3BN=jdvd?{(l6@F8&=9{U;so{rf@L&5fY=`6T!X@W-I&{RJpGUUh=o^SPkT zF9)UfPlM|BZ4lELuG z{|d@(4?5ZHbP*`J*MOS;{U9MBc`V>l0bhzzM8}Ds`uBn_1+M`m&kuv5_ug>*aqyL# ze+zsK_?P)j`SeJ)rpf4EQ?mN$?HeFF;%&dD$DC&&A*>&PTyB z!6!h)otG{`_TYu!a_|;VOWY5R z1SRKX;LE`#cnEkcD1JT;o&)|9_yBkYOkb{ZP;`tgb-V$b!TFt_?Cxuz_EH-#;9b{1$`a?`@#?Z-Q$7KJZZR0Z{hwT~PBq?=08vY;XbRBcS;C1SmOw9~A%l zAtYQSITWmbZv$t7SA%N*JK${aNl@cH>ul%uP*C%p09L?@K};^W3Y1?x2FkvF28!&r!pzP?2pyq!HRR0&8=i?m%N-t-F8gDJQA9xk0@ooh70lx`K{!fC> z1OE=32mT8v`VT+f`FRW2!}(2M1^hfH{(lI*5d3FQcJthoPSC7<_!YX5OioiUIH$x zp$l*axCMMpzt_j_0@eN};5Fc>1LP3!E8wNzTh^m{@EaiiCnqxKQt(djE8tJT%fb7Y z4Nlh=z~AP4)gU$x{vCKWcm;#K2mC$ogW$?xr|%~qBqZlGy!~gv_i?^xgc<<+ z7AQKZ5QWJk-vkLo$?Q>V8{7;cn&ije?cixmYK>>15AX!eZyHY$RGoYk90L!&jM@gg z4HW+`+DHxo`@u!v*TEIwew$p57lZpS-V@;Gx&F<~E~gt|{$rdUbOo^${37@uIQsS^ zc?3M{N_+;~3H}ZE_N&k-<7{|`^LPCg))ZXd|7xe_X7FClf9;*v9C#o20q|Uub1VJ+ z3|z?hrguAj8eGo#&%yJ-ldokh3%)<#_rQ}mfBkiyr!E3zFSmfQhwp$@@JN(&0{8*& zt>D)|LR)ee%98zD0czZzfQ!L7H+X&?0X6S7a1ri;egeiFsg0k1Y05$)n4?4eJ1K-5?8@P#zlJ%hE@Ry+Eb@GS3 z{q3OW`zgr($s2EB4F!G|M1{%eIH&afRq!lu-EA)a`@jvHKMh_8uKrE8`$_Nu&R_Wv zuctPE;^TARdEkK<^$ze-a3lB{2Hym}9~=Q+@KLvu%fT}^-w)@z0$d5c75pYR03Ly{ zHo*^p3&DN1y8ae}D>%Ou+<=`u1zy7W$~)Mr03QS8S99-lx_%ElLFac-n}7r0r@`L^ zC5OxJb~>L1Wgpe;&c~-goj(s|)c-Budhmmw^!IPz;owF0xW3*E9?$ttz@^{;_j(@b z2Q|)nL0mZbF{pVj_#M~F?}A5h{<@F5yw3sE?sMQEIR6u_*N+AK1t@u+IpKM35~7+lQx)8IJRbHCfsU7+NxqIo57 z9*9XK+rdl0lRudxe+}Lb!g})2PdT3cATfsXzXrbxP9k*K!8M<8zWyED%z6DGkFWm+ zyoB@19`=2!KLaJlMW1y!y$6(Behj`Hyx>Z4NlgAkAULmwO{o8mM?*8IDht+k^~l$wctO4 zFaI*Kd=_&53i%p*nn{l3`isBnc5^!T4$iLxZvy`VwE3TKdwkB<+`p@!^!g9r)!;?H z=W*+Y;9EG~@9XY&{on%5zW}ZV{~0_JJm(u8zitC1x9@><@POav5nDJd5)$f*%6+`yMqoxD7lVJn%{9 zqYpfn^WO&F5B?171+V&J*Z-e`gn;C>?|YtF@B^3spMauc<)4JS1Ztd z3w{b*{v(fTzXX?YzT;1w&Yy$hy8mPMr!Rvya=!mgZ+91XAm={=SAj43Ge2Jkewy=l zf-eV;|8v*Fo4{9dz6HD;ybXL8c+~%KdLIU5AFKYt?c#gjT+ZkHU$4j4f(LOv1`dF? zf(L{D3F0crK|k^Q_9tMK^VdD)bX*Ba|3{(R`@s)@vY$myd;R(eQ1X8g)OZ*C)cM;C zF6R6z;L+edf92yZ1drwX3a|-&5|q4W{I%=p%b>2W{FC&1G=KjCjY{$2^L=lq-C zn{@sEd7iumJc9Etf};PgLD6~6&pqCL78D1C$><_wQW4zX6`i`Io_y zz~mQB$I0LlPVWOh2>v~IFL>SGyZz4l2ha2G043i)2A6_w{72{adQklz13wHt_n+L3 zJ_4@f{O`fL!7~XS7lJEukKeTfJbxw8E_JO8kBwC_HP~!{tcA; z&;NHH|5orw&VLHN7X0=9@bQiT&*l6Q@F?(epvL`Kz=QtN<-Zz~pWhC?AAJ5VJ->Yf zyqWWV1xLUel4tRs*N}kyypanUQ$L6+SYdL>}<5L_fIiJI!AI#2vaHC`q*S3IHfp6h> z((VwyLEOsL$q6 z96fyA%<&M%YdF`B)^hr}&cW7ZzrnS`!}&7sT+X+JbHOV@pUc2;&R2$eFXsG*;q%7= z-YVq!IUL^)*GQSRH_-V=LgN+28#y22XmaT1pB<7TIe(PTFW|V1 z&1nQfT`! zKKF7g<@_{`>%;XUxmMxxTf_N>IR7R``m=)%hlZ2?1-_HxLfXy=*91T2*ue2YorIr% z1m7IS+?UVK4WD&;AC9kZ{3XW{j*oEY=T46Ia{L>|`#6?_KK%iIi);FMIp?njKg;n> zK0g=y4#x{ayPkkIfWOW$z|qICKW+YlBmFrzeAvXjcXQ}xX28q&e5F2DX4Qu;s}9!t zDz)L>Mqhn+V0JQN?)?7B($gHz3V1fytn}9hYh#;7YWi$Ab4GJ!rQWOzH^wT}ijUO0 zzB*d%9jlF2`Wu6Tjg1V-y_qM?ti(GDEA_F;P<6BQTUQ&X4_B(gmD*r!s5U%S8Lkf1 zl5R&HTVKn@Z8FV~GZ$8@^IjZ(u+gj)$g>$1Ry284Jl6U$A|#KQr_5~2fmo|_yt9B| zduLXXS*M;~X^d88o%+@zdM@s(57ft+m7($GSY=%;$dvikZLZ8tW>+@W$JRH-$107H z+OQ-&D_K-o*Jx}Qs*Y};@n~iB`OA!22pz3e`!-iMD2i0O^jqL79g!#(G$UcNjzt=hX`e8lXw5@+qNV#a;R;_C3su}W`aWOJpjK3eM? zYm9ELG%mw#<7vK4=R3`j8k`NDsIf;VXlU;f0l<2FYNszCot4xiPLdgX_WK5K?R6aM|cFK}hJs z%J3C5*c?L?mUD;4>SLQLJ(XIsw>koaafE8Kau{a|lf@09M6bnbq&PC#7*KA|`9E7&atW)s^KVX9qd>YCi-DxK>$*G4-xbPS1yA^s205DWiXLWyz*mFRol0>`P8>^p0EkgOz}dez}#+TlQ6AbsnEl;noe#}ZK}yH zQ7Pssk){>Pi5eIq3b*o!T6ankHm;ZHW;|rNn_f|>_tJ6*I~c1E4mt@v?n@i-Tk$qn zg~*g8(MZKJ1yge<3*Fo-Jk-n-tn4kamWB{!klaq1(LC~$Y}`9p${*+gqdhCwidQkU=b{`t5a;iy<3@>F3jEFMF;%iSBOjoGkb!`DoBeSag@ zVz5dXvt9$_D(Bq&q3Q@t*31lIjchN@}KZuGLKtebupQj)?5W z5Q(fhkhi5#%EorWi`QABRf0W~q+V#!LT4D33JdkOvVkw9{1+$<*I8Gy*sih^Z5g=P z7&L-CR+*1ciRCU9#*;PHdO9{BMww+1s!J0!LyRxUGQHd?N$NSX@|8=L*N4Y9Ss1Tv z8p~0Ww&1E)H(ACjSyS3_h|Q?}bQ2*2lO~z1K9tvC+L}mI8*MXRZVl1qZdg)Gbw{Gf z_P0WZ5HzTvqjQ%nxp0rgQtxPegczBdioKVn`F%R6u%p9{uv>RAEJ}jr5HJjBd zI^>dsk(M~sxS61GK5Q)bay~TDB=gOZM;n8cVDob-11!mA^yS*9&hPK@3d3*io19@Y ziX}9m4a6jYWwz--?a2((0~diMe#R^|e9#(HD@_q1K^Bv~E>nPhMioiA{Gf za{_~{4doH+T9M`wC5p!}^02GWpBG`je72LshpJ&q&BZ;$d8ejUSw_{E0)itVH7Rn8!S@DkvX+0$ybzjeC1wHW|z&%R$)Wd zh8yDp>sv>rJ~uBZ*@^WDn-=CL@}!P!qOMCCvr)7ZD->_-9Cozk;X$hzcCoY+s%tw- z7Fv)&D-l+iM+y{a+(HM~)z!UDwnoONU(SZP?VY9bvc}i;S!Q%H+(Mk`?;jj*uJ1Hx zYxCyj;ok0BTmMpX#W)K+EH82T+geNlnE`&N5$MyVykq&ud*I`kG? zwq>ZFNph?n<2I;vcMxpvOuHQ_dF`$yOIO+xlf~=+ktojgD${oE;%=69FL|!f*Vx!h z&LjqA&qU5-8_yJIv5pml?;_27>r7j*YX5KM#WNGz+GMFO<=8Hpc980FE=#epGum|6 zQZ25K+cYbzpqGWGflF6X9!&YC-^2j3w6uy2*=pyF~+@_Sc-jO z(6y(Am08-z6GO^J>Au74j;*_HIL;pD(MNSLq8c7|Oq+&I7@KUijSFAdvd&#H64|Dd zl?>v2`DEJ*DnwFQ`u3rkS?owJuMc(++ij@vsI=V5c4D!JmK!SVDTQEyZP;|oW;aav zx_S<*7M>3DdqLC36Sgs5yv9+@`sbM5W2c<41l1u(BE4^KUS?0)R1RucniEFWwl;iO zeY7zw>n^tNX8_^3!2pj+h9iF)sR(3FvCy)fXCXL?j?uZoK6l)G7a^=k6ly6LYe{R5 zdisRicgUk4&B9xoOIPO4Fzx!aGf%6EQ?|#aU1BPAk1$lO7-VgfI-dRBxov2OgJ#3n z<92CePY2pFdbAzsBjng5nksl%sA$8D1nn|%c0%)N1vYzpu#swglyY0!>vMc-(6*)9 z3^qQTMcVWw1{*wU8=p*AIg=@+Q;SsE)7?jFITg2QO+Ml=i*JQ`%Vc@2f6N{wv+v{2 z*NCE4@-Uc{4C}`Gd5)AUXQ{)kt?jFoGS=DEL5f|TKYC0Gb&Xas%658)nPg2!lIs`+ z`yOj-sPT|u){MT{qP*pKYWIE0Pd>Ar=_4PX)qK#O&lPJ7GY_jl^fWR#TMznh-WVjb zY#}t9t!Jt0YGWH!f!b51(i;iMISqfluD4PAF^x&Zc6-~t2B99gtu`(0Sq@9qRACj| z)1Ft07<F`6! z<7`aTQTEn_h%|#G)T$+GDv8kcB7(RSQmx{)-Fsu$Q%m}0Npfyq{u!mH$vuJKZK0EA zrcYQ3&$V3Q*mAlZZ+uKQ*eSVJk5nQn-rK`8?cDdIL+N=&x5FW@nMZaQ)tz3WmFToU z=KG;M*5s*P?kU;AxJb%B&rMTLmaUL|zMCm*8exV!LQeX+CNU*xE^yNsmk^} z2+JZqX19kcVd5@3#@6SqT=r%L=bZ@K8VQzQ&uU8itgxnX5A0U1 z;!ku6Z!hVQ74%6(-X>X5e&GNo54B}hcGyxcIZx^d^|bPpYJ7h)E~F3X4>DOyNQcS! zw&!h*@1EMQflBmkd96#ef02EA0mB!EE5l}QW*2NaD%oecU%9@q zQLn{SwBr*V05lW3TD;;fn?Xz|zpZSHj}oqek+ivAw4N|?1<8(XUaJQz$x3h0d07}5 zv>7}9q@~Q+s%%f6#REyBndC2Nw5$Lv-;$6@k#ZGlPHZnEl2q-XR;|3*ev)FN5EAC3 zJ2Vc>Zf~}Xm);>{6q1|%r&{#I7L^DWXtZ#ETte{0GmO|m*V4JCSvY1Wv1=)QjeKF zZM~|`r4$sC?}BDR26Pg1n&scFWo8c~WkSQ+i$O0!q*ds$yyFcD}4I67>R z+@Dqu-ZW{tdb5&i3L^Aki@!9Ov6jBGS|9Em9Jlu|W*&k<8D*q8wmz#l;HONt8YHXI zO*Mq1cXB+Ak0@RdTN+C3tMuTZ-8u5JB%#ZF16R~Y~|Chhx}9YpQ?F~g-7MS1pSrWc6D?Ddk2)rVv)zH z)0TVoU`Aeyu%>9CEU8eFJ+{b3vNs_q%&OyqyryMpj>}TYSQghG~w{i#x`j>^M_`+6GvJ;4_9x9veFNw@G$tG!6P zc7)W9y=hq`eOc9N`?@6P{1XsZij)~2sFqYch%~$D?%T5M#@JY`kB!v(7{s=Zb4}7} zlbP(zt1{Q={W`FH7)hYOwZA-9Y>I0V zhV`~a93y*zpEjlN8f#ECSs3(J*|bBL-VT;+83j`-7A}&k9!Tk7kL?4X`3CMiN~eu12k@H81N!O_QwYZP%AL=KT}JMP{8kOE3l)J-bRj(ozRq)2tin!QO*=|l!VG-E_?YmEp%)U0#vVU8xHcQdrX0XMBkV6R(W;8 z9^OhNURR`cYGu-9z50@YlZ75@k{dzPWM zsqHm!%x7Z~`5;>RP8CQ{L5PpEX;n zby2V}q9!-Jy7UlUI`tjVlG@{DL1Tz_ z>wKw5W*Dw*v^d+(wvmR#D%sbGX2!RSX3d)&uZQjNxJ*^Fj_=4@iIubq9Wg}IH(`f7 z`52%WMP4|bR?KTwh~hOP(F1b#(*4O%4<)`gp?F|#|6_0Z<``tO5n$Q^PqY`Ll~;IX z5POEQ$KvYjwpTByo|oUVI)We}xKv)HT3E7%e7}PObHX zbUmTHF>W!eO;19Zy(naBxDm>|B#2BQWL;flXyuA4NwZa6ALU*0(Qx0Mh$>UC=SO;N zY1QZ*!!ARRY7%TzN$M?gLiw7bk3T*MPX>b*Xw#aIgXN?zAnB2dzn;s3i_7Y8Fu0kh zS>qk(K0;~uG6Y``%L$I9gMW3)zi1Jrh!mDJ!H%WA6GK%}4A9{^L54LHU+A!x6)?;Z z*bFc0^WBIf5}~z^z7%GQb}1*LiAF8&QDwoIcbO22;!Cwsc;`Rl#1Q%u>QcVWNa2r2 zS^Xy2_-@u|#8(cVHB{YH9~vL3@T@X2%=hZ5z_ zT`x#|A1&K#jyJ4Q&CZI?+T!)F<>$NvuTO&ujkLi%FwBb$xt)MmVN7@br0E*0=+wXq zqh@7Iav6IFh^SNMoBDRg)Yq|_1(hWFVQ>;zf$yrIL<|$_)k6+1ZB&l+cz|xFrxl|O z<>;PeeLWZWm-Kj#`z~k3o>jz&CR=1$TAp1UZd_71Yn=Vh%F_C1y>imf0PsfEvpfTx zOJF*MPQwG^yy)Ariv8sUm2*eyo2!+R8iJns*c%5L4Zf)14_v&1zMYw|I)CoGeHVND z?$LI{0^9LAl1;igZ}iJqc}jD#J=e_Ii9~{3&l2*v)|m?`C#+{3|J16d%@|)Z{ zCq7}l>GY|c6CbxR=tNhBd>~;Lr_EJmVxxiCnDb#;TC<7Y(u|YWadNH5n!I}F#C9WP zg7JKn)!Hv(LPoiH=forGxpU&Sos&22oY-oE-OM=yGCq^vZGANVy+-qW zCWEUvhXgpe&st4#?&3f$A9v=Qu-K7_xOa7;Z;o>j31{5d{4jIJ&WT5@*)6nSn7zxd ztwLK_eNRg94x<}33*72tH(50?B6P&KgHg&8aVf|Y)g5&xI}cqkJ>Odv1W3=0YUUno zUH543Za>e2&$*if28t1-->7$M;AX37q>hnNpN@`-(XX~pcC&N-i}_|ySd1H(8MuE@ z-`GjLQPh`jNH}c%hMVX&7Iv+FyD&xd`aJw_%SMiC*lW-r)n%rs) z<;LnO;%=$vMQ&Ofle$6#lNkfh0F7HY+2(BtVB#f>1&{LyX}Qtj`JBruj%}Gb(AhqT$ZJ~#InAI20(Nf(WD1K! z5?Fi~3Nm>G6UmEsS4c-i*u;a3;;+@14>Oe+I_9sth@C6)ollrtF(){FfX5{+3vMD% z95l1@_9T==XWL9>CMgZ_Gk5iz>pAlUirUj+&eF+#+LP2qq3x);!zAwx&OpfJ<3>X8 zzEADBERw?049e=lZ|GpMV8FP6g&JuEsofKGLnzn=@3f4ZW?sTo43GAy_qWdGzuKc> zj4B}PrHNWK8Z9=9R~BBO&SQ0laFu4zkP1AIcp3?Doe|P>EJrC6$1>QAmI+EMPb#5n z4BsxiH1Y;xk|TKNkC{kO%iA*R{U%$c^my!SOtc6+eF4v0YIojpPJGM)ujhlZCASmPw1l{ODIy`0YT$yGtat@b`XK@@?5Y}vKG=Flq}uP_*y&MG0rGv~HL zxt*ldnJS;DIQAH~C*(2}q`;lWPLy}QrF_;Ap)O4Gvl^kPu(@ zE)bY57J@AEWKrBhtdo_cFG!i9P6%7ns`P@;$tcJgxuapXlJd%zyEG39<5Sc_p8fWr z*IymC??0{dH~NCWQvu&@j4P!X83>_G#nX~`D~YY25!^%8Q)-0|WW)erS1YjR0T2!m z6)KYdyEUU~w|z0qc-PHkX~D78Mq~qv;`pYyJv%4w**Pf!oY`OSOMfyuV+6%;jmn4%)`?E|dj)C&tLcuV&U*b6!B&-&y4jP($n9UUH zgVGSRbV`V)Ws=<3ut>~;iEcFASuUAWnkZ|KOK$V;;ZtE!ZAMyaS;nNP1btt_Rkq%c zxBRBeIBH{l+LNke`5iauT)#mOvRgN{P?IZFU`Db{M)1JOjIhek&fs14nZ<~LU_ri| z$LPg0!G^dRoe!UhG4gS~qif!aQF~J(%6|P9H{hEa3?ngf4pq(|t*`{SK^!?9b5ffw zNDdzhDZ`qGcC+zGtVY4gS@x;`4#I}ZJvJi^3vp??=~Ggpqf@{ob3}7{`g1ehK=%s! z1$`#1a&l2xCQcI?DNd1g= zXPzS;AAw$7nKA!Re%+a|1AANwiB1z}A4p)C?4HS-~b80`^4suSDOVMrg(O_dP-SQ4Jrrb(FgjDYC0 z2PD5TQQqSrf=grqM!l7PIpMNRk=dU`-)WcqOZ3|d%z{wR!!~1BA##;{AKOpUzmRgP zH4JoPq;B03NK)F1a|;d;9uE;KbS5fbyU5&oM!!%dhWZdt+(sZr=O!oXyu(5wHJF~dpD&KuXVu(Uk;!62%OCCDK z&T(!}fLNex2)jq~I^;Yy0qqlGfPm_x`>zcP~N_^+8X5~JTc!Dt)-hJ_fHVtES>5-=7i z0e5=(nRCx+?LD1_Skyi{dKzvK4pfwVt4*|sDLo5ybo3%D@Io&l9`e6iZ-Q{<5u7@c zJ}Q)nFs?n+sCqU2w#~eG(N0B9?V z7UTn3eR}A1^Y<}WpH-|Eq;6eC+Qw**v*iI6@SK3DN{{H7=*Y2wiX1l zOQVE$Z}xBGtsyYu(mtlHwh{7lYRhCp|KBt>E zkJ1%)$j)vF4?~4t?PNm9j6OOPhMAgj-#MGc=wii39WMV%~^@DJ&aKABOO1lB6p+%imK*WCkyU`|_0Vvr8eg4G9@b=B-k4d6uco z%+^1tpQl>OMrFL+4lCIxkib9+&;&j{;mxes{Cxow+l_O>6_K92v|XbpUTgn)FHRBs zEyRCR=b6)knzmHCQ&qB;#<5DQI2K|efW#%>-8~_ZNUFO^W+?RX@|(2bS<8i}gv9Ya zY(Bc-Zcf6GSwMjNZDt2u>OD^G>np{8T^l0(RX^%yHG?tq5&Ntcm|dzCXRs>CQqOX` zQ+AMIloWd&9`Ix@d_s74*-|z-XBV^4)vQm{OqC#VrogDQ#5ugmK;R+(vTzpesVw5e z6-h))dY#`N*#&H9cSUtiw9b@xgZWZIa>Jh*6R*UBV9l{vX57WvvP$I#wPNRZBKyfN!`^`x0RhLG|AO{F9yHc>PY&iZhLi)Ee zOfF%Td|jDYFax>;xn(|VzJWGmD}|Y&A?GJbx2IeHuui2x;8Ui^#YwrF1y89tlpWcw zBIFg;N>O)V-RhR6;ha_i<1SI@zjrDan!K?~GVNFHr`>!;Cv688yO7Rq&Kpg}H-+|K zVg!rq5VX0T*uLM%=G=3cB7>1>*Ui*+d)D9%sCe?~xn3wZTsPPBCPFZiyRBH^O2>(O zt>Io(t`ht?8ZA02z+=23SCR&x@Ms1*-yPdw7^k&s(}^nd7^UfLgPt(u<$(%{>72{W zrzI$$Iy&DLRv5WR*CDnL4EUu#`Wx%YBfu38JAlAWc*Y<>c94inspgctJMeAou=G03q3;r6^sKI)^oy;-4%s;gA-}V8^5YBjM|YHPwU8oSFcIFTU!MTyVScZ} ztW~%#zl0cK&!gUwV5WD@ciI0Din14Fq3wTI;KjVD!Tgsfba2+aI~Df8Y#pYWE;~&; zoVmVPM z1k&*cx{wp|9o>0j!QDC0W+9|Qs$vpTP7pGaAe=xHHB?xX1|nma$cEK|B>oAfe8>vR zf3I6fRd68rGm_H2O`{KSWDi^fITDS(IgW=*2CM;GWjaAr8C4zivj^EB{lif$thBSj z?h;P;<5GKZ#PknPwG3&(bnVkuC(_1*hbuH5q6eR{1s1siXT?)IE%Kq= z@PT(P?zGH=xDJ#A%TLQTNhL^0e^85l2o1UkBZchDCaXGX*; zU=v@6+XGB+Z->9t75+3A-NIx9Ey9-zX}giCIL;hI3`o%Y?H3o2%#9$*)K&1Zz@QD{ zQK0k}zPJ+#nf9`P3K+PVi4lZFPYY#qi|tK74ut^vG zK6^$)$)<8+r@kW5rY@gqO7DIuubGc-rGcMVl$S!YD9=5(ddS+EX4T1=B*4h4XD23~ zR4Q>=S4`)b_v&PAd1Px)f5~mPIp{bjfAy`aK~XsFj*TI+G`z@erILaZn!m{Q3i``5 zgirWQ4$*mQIhK1C0{v_&F+D;Jyd8M zv9ki9gPR0^t>LSiT2ewx{K`BA<-2+clg^_I!C0QO!0v7;8XlV#nG705*7jrDIIT)|q;JM4$lfzv8m{iD2Elwq`{F_Uq0Ereu*#qws z5~)CpFG?76BT<;fQKqkO5V~oH;ii^=(-YDqtqTqux>8g@8Z&5W+9<@Bcj~e;5X%0b z6U6E&bR$#~x*!i%Q`ot<$A*Pc8JRN;FM-!7=n6?UC*Dpk2k)&Jaoe`EZa3-60@KaZ zEYKKB$Y+}yAi)#wmq4}q5m+!G%HkB_IB|DStVMzn1fQ^JMv?!z;By9KyBRnVLn3&F z!H5g8#97hW1f!JQZ3^-31!iR+|3jy_j9wPrW8-O+XXXQnWF58+(fxaR+~@#IO1}q! zUjyOU%-0Yy5G^B67dfGA90+sayGj}DnQ3FJc(m-dX!xaxAS>HJ7nh!(6xGC2<{vuK zfN730pR?42TZG_G6VJkK_JJ$hqAgc3FqR1jwx`RxnpAI72$0SmQ zObwAmt`$)PTA@ce~*Qj=d<2hp}P!uKCX67(XK_lhFJC%ll%;{eu-$WzLIvH{}XlloV zq|oMthyqDvK01>G(};tq5I_HFi4^7HW&GYZ&gK z2s+xGJ9StXLJj2vBErH@7Mj6^_t=Hn*;840#2_4lIVWv?JrgG~;Z#_Qo)cJXRQxJh zOZxC$P9=d)D&2aM``UaTygX|;Uc}C+Rah*`azC*TN_;ZLf?W4j88Ur6QZap+V67=P z%JZV9>#5GUQxZ3$%Qy0|SNU~X>$MdFM9Z#;S9+2J86KIuvxd#$m))0aQM4+I#IgWn z2AkYwjG}x>0*zU4JVGTRq2^A$nVY>y%GgUbfxdE$m;ik{4uMcN`f4~B+{xEnJ>Owi?F`u38Aa;@+pA;Sv zGe0k}m;gm9pqDEHTNh}x!$ubVD?9D6r*H+bxsR3T3trahwsbWSjnA?hI@UCkHjT-6?mk3ygQCD`_g_q`jh^Y5pv$>aVG{vKps$TkEW6 zDGxcpf5_2Tb$lBhaZ}uE!K!FAY09IOnNvqI)Ncd8yUF19m~-J`T8*$yK|iW4yD{H5 zNpNK-%pwLSIj6BZ*bOW~n<9WaLbMLbytFi#cs#LIU3;QgdodU zEs7AhJl@2M%8ORpV^D;A%x+F2sCT`)||1f`Y?x5e!3>Ix4oPoP;;Blhi+g~*7V z_&Lrbhk-aq)Kr`xy_geWRrlROnbN(J$xIr%Momd8dou62E0?|5DJA$qTp+VGwz&i- z1+ryOi46Ewy3HAf|M@Z(N1D#nxqG7?4 z&B_8bn!yC9tQnk&Pet=KI@9oJUt&On9trT+G)vp0j%Sa;_p5;>dMLHZpNtwGsCaa2lQiQ9;-!B8pLU9BpIRC^LvFn(K!Ea9w3( zt)_3jwb43Pb7q;E8-Ea>$(__?L-1fs)#2`_W+XXdA^5iqbvo?#?6ep%#?mF$zxk;5!2;9XSCPLz0=MXAQ}NzR+aK zncSL>&e1sbV5Ur!{9(@8=;pQdx8iNOAkMt(V;q$SceV;+UPL3|U|x8oa|9pkDm-j1 z5v1hNKTCbsZ%9-*>bj9<*3qMhC13dsCIvN40Q|Ij<&(ach#8Kgd`n^(%3Z>!HJ2b^ zG7!uwtE47C>`#8AX?oE8@yeU+$B2}HL=6=JThTPKeWKRk3eht1sYRLn6}0xl%OjW@ zo616AkpmkkY9{-I1e2ye_r~keNl!{Z!jkYd{T1V8NEww;8YUGlmXgD@?+jZm8Qe;>t64fQJEPzKomn)if?b zH`+m{QdOb3hh&5#OLL2Ww}O>tBhF6TUh%NFjYx!>Yc-61<9=p2X=PyhCT^ilgmlDI z1z~c|q)Oc(Bu+Vv_s%9@C<_`>cRDy93iQjrNt-v?_Pu*?@D7G0C?OSu<>^)Bo8@XP zf?O8CI?KV$G_CG=v-Nkp5oiaYF?!jjvyc^SR5M0`+>g!Tg3}^*ruD$@wdLK@s)~uJ zJcG)O3QeI^2LkORU94F%AqLt)_ZHZqM@DgHK4%^xCn^=4LF!R*`4}KSjzyB&JXWG8 z#f`S1mqy#;J#j)o7?PkDv~3k5-}P?NFp&dSQIUigOrj`GVq#*Ag(kF$;1f>6_LvCa zgz>3@?6q1XGNUQdClziPe49zDT>Kz>#&XT^BqEICe7YvHg@dr4(Wvfd{{#x81CHepd3HgVfR|b-kW22bVh|vjs1nXrOWsO+R*IOm<=lwKsl{r z0fhhqBe39M~+#tWW{eM)2T;uK4Cn}tbtlcu2II1?ka><~;SCeuRnm#wz_ z^y%`)d-&>g5?eCPB_Re(BL;TLpA}7)8?sANW3+iqOP3CYgV(t*<-%@7-X1SR1BE2u z0Z25_7HxS}3&V#;x!qYbRAPl1Ddi|v0_GfNFA$XXFXoiwh+p_AQ7HIZK615_fm7Os z=SpBYA5xevPjy=PNSGeE0tK!Tu4WN*N~u^q>my^?3JWd1q_iIL8Jte3t;D+L*KE5> zbU}C+&E6z&FBns+OpqKY0qMMxPkF9))#6=-=n*@1^9@gyQ7U$=sN@XTR))nRE=hUj zke=osfaY3a?TYTY6O8APK#Hv(6bP_;Pv8^@P!h8DG`6=Z#35Qj3VbRjhAd{Wi%W`x zk*p~#G`Ln~UN)+PN;j9FGA8F1Srt#FAJ5A}^BxMfs}ggEBqj3Eb@r$g#_qJa$P_u575?C;{rTjzBaOkqkYq#5kCe9;LRsC#vN73b3ss#Bo|$Cx44MzU zU72#A+WXl)Rpzo&#sT64MS9z4q~EFH43Z0dHK-t72q~QV+C<#qiJZf5VNj}6sgRKh zcW^X%lHhU59r3F@Sdnw%qLjG7btcB(L0w2sv=%}K5%r<38owK2l z>XibdeZ)j+)?#*%Et%m4MKPmT%aRx;p7(u=Oa8?rXVUjR;+CWw3%;>Sw*x7nyxYKh z2vEB|rX*>MR(O-o9jrB~o3T(*p{DnxZpYPhfq-b6Wiot1R}C{uf}AiLWrK@eT$ag# z_;9n-(BvtWrXj8y33Wlo?uf@2%uEi$MAcqaZFilzH(-)k^}q>T;F))FB#_7_-Q~%l zg4QWn#UUld(jf zyFZ(PvR0P|?V;425)XA+@hG#YHH&En)$Tydb7P0ygEhTA;1r~+8K4PlY3j0JdEf~l z!$-otw5x-7gLOk0rose}8-f>tZvUo9c{~CzR?0y1jhl33u}gZ{bVx@UW)YFhI(1h0 z7L>FX91VSPyKUM`tj6L-V8pduHX>g%!kAO(1r`bkPDV8G8xY0h3Wlx}qKP)Jm=q4Z z^pO1^C!`Y|z!z+k=?hahVIDF9g|v^{ApxIE(|SkOliQL~NeGjCV(cjiHKNghQbA(U zF3*!QHY*@ZW!inS(I>a~Y@9$Ntoz%svR*EEQ3Kmqx{Q9P7!uPkrUY9L^aOp2vvz{7 zHG8WgwPt13n!!1hHOo21IacepB4NO|9O>gxQ->sebGrE#gqY)`liL);v1Zd1IQ5l` z6ni@LScVH#6-lHsm@#Z{6>X!ybVt%gFawhP-4iLKuP9E^fa3v1+GR$mBqt);BBDoV z8>QwgxZxql$5n6Fq1ZO>(k2|nfqXdUY6y%O9V$kZ3M^i6S-L2ttL=96W~L`fVldo) z*gkA!a7b|Pfk)YX=1N9eSm|zazD1Hv6rG@5G7ce`ksur56)l))cg8>(jKQQbNuShx zyW_m}MuiD#>B>g$hT0e%Jveg_=H0(yI@jzFh{)Y%YFUz zS`#fTP?g>Q32Jwp#1Y&-Xcf{(@E_~mvI{yn50-q6r(5?jpsZJVm9Y5n53T4ML zF`>IJ`n@KNLIsCr%ILaoo{BVF*6J1mc z_MrJJ@+>DXIzzArTcU-ln}{zFdTfRW6oh3fb9ddA$y?-;&NF3DhXR5y6x_=Yo+Qw2 zh^bt*Xk<~&{SmQbAut+D$UT{SX^gVcj5To=ycFc$QXNtJ&6`atMCj2ts~^)*(!6Ia zWSNB#U0<$9z5B#Xcq4`r9z6W&6+bB6y)vBKBEE_6l^zv-JGmh!Fh{9 z){Jnq4PCKbPwmHCl(sC`@C|ZCx#TK0bZfj-oI+Zfl#1?BD6i8UDF#vogLD+_0t(W? z4!5M-b>|pCFZ|WiJex>73J!wwo)Z-E$z71!dLBm)K3T*GzYWus*QPhTx+(eq*l19J zhMBH&7v|-pWO=4_zQ-#UPsO3%3&k;8H1L3Y3A`Ai1kL>*@4O|)P!NI-1f)9{ISF!A z!!ZOx#c@f3TkMjnNM;yATV|Qj=AsYpdCrVV&66a}__Rbo2>b6qDDrT@69=I+T7XL| zL_UPdJv>d3%pKPXzf@JJDz4DNfyQ2Hx;Uvpr86^L=_T&em@7u-MhP~ht`cbR0QG_# z;_ai!?hIT`E=GD9>>@#KYbgU3fI^LLjuhx9ENueKYmPqtc*fjjvVlFxCZ#vE$*i8> zW)uuUkSWp_sWLVHN<2y9vfAiqRc|NIBIJ>{e2#8RxXzWkVhDoKO|bFAY+OqRi|npY z(dJPy){%_oDv!~V@C>`6iq_>FVY{bwmb>how&;ZLIG#G8aYn$ngD>Zu)CqywE>c%n zQW%Hr-^n-_Cps6CDPneI!*tr>u@OR<0J%rn87E31M5gJ+w4jV_B7z`EhP6l{5xDHV zFmh`SMnxl6B%2}-LGR#I>>h+vOcQ9O%87Q!fIbHwypx%W&F8YfPr2s~^hpN5s>|A> zBUiIH3z0SxS7k#xQlcjlYv|APT%l4s-QBB80hC4FRwkzf%)1F9%2p3PeaRVK1-7YI zZ1^t1kcn6A;DXE#$zqz`o(<8c7UEC}?`>A>uupqeO}cS0xwXQ(mh_s+tUX2`ixQ`k zoVReQmmuZfsrRAcw2l2jyRsk5PO{%qMq_2zY| z6R5dpj8K^ z@G087dl=(Gw#(Rkqh!4DUiSq#rn8StxafSa&=1c;XtdqpG^G7#8Y&&c=sIe%%u1ib zrQb>_`&P!0(~!2eS+aE$9AeJ`<~zkLN*>XBrRC<)q!{vtpO~7$4J7A@t*6DuMy-I~@Pceof_l6FsaMvF+AYIGWz zO-feW*y29SRVG8|5A&(xDzr=wJFf&DCeiax$YMwjAz5jVk2B2W>i0l0Z9w?{cFO>o literal 0 HcmV?d00001 diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..2a2c165 --- /dev/null +++ b/po/or.po @@ -0,0 +1,2080 @@ +# translation of glib.master.or.po to Oriya +# translation of or.po to +# Oriya translation of glib.glib-2-4.or.pot. +# Copyright (C) 2004, 2006, 2007, 2008, 2009, Free Software Foundation, Inc. +# This file is distributed under the same license as the glib.glib-2-4 package. +# $Id: or.po,v 1.37 2006/08/16 00:43:58 matthiasc Exp $ +# +# Subhransu Behera , 2004, 2006, 2007. +# Manoj Kumar Giri , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.or\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-15 16:20+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' ର ଗୁଣ '%s' ଉପାଦାନ ପାଇଁ ଅପ୍ରତ୍ଯାଶିତ ଅଟେ" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' ଗୁଣକୁ '%s' ଉପାଦାନ ପାଇଁ ଖୋଜି ପାରିଲା ନାହିଁ" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ଅପ୍ରତ୍ଯାଶିତ '%s' ସୂଚକ, '%s' ସୂଚକକୁ ଆଶା କରାଯାଉଥିଲା" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "ଅପ୍ରତ୍ଯାଶିତ '%s' ସୂଚକଟି '%s' ମଧ୍ଯରେ ଅଛି" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "ତଥ୍ଯ ଡିରେକ୍ଟୋରି ମାନଙ୍କରେ କୌଣସି ବୈଧ ଚିହ୍ନିତ ସ୍ଥାନ ମିଳିଲା ନାହିଁ" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URI ପାଇଁ ଗୋଟିଏ ବୁକ୍ ମାର୍କ ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ କୌଣସି ବୁକ୍ ମାର୍କ ମିଳିଲା ନାହିଁ" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୌଣସି MIME ପ୍ରକାରକୁ ବ୍ଯାଖ୍ଯା କରାଯାଇ ନାହିଁ" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୌଣସି ଗୁପ୍ତ ଚିହ୍ନକକୁ ବ୍ଯାଖ୍ଯା କରାଯାଇ ନାହିଁ" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୈଣସି ସମୂହକୁ ସେଟ କରାଯାଇ ନାହିଁ" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' ନାମରେ ନାମିତ କୌଣସି ପ୍ରୟୋଗ '%s' ପାଇଁ ଗୋଟିଏ ବୁକ୍ ମାର୍କକୁ ପଞ୍ଜିକ୍ରୁତ କରିନାହିଁ" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ସହିତ '%s' ନିଷ୍ପାଦନ ଧାଡିକୁ ବର୍ଦ୍ଧନ କରିବାରେ ବିଫଳ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ଅକ୍ଷର ସେଟ୍ '%s'କୁ '%s'େର ରୂପାନ୍ତରିତ କରିବା ଅସହାୟକ" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'ରୁ '%s'ର ରୁପାନ୍ତରକ ଖୋଲି ହେଲା ନାହିଁ" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ବାଇଟ୍ ଅନୁକ୍ରମ" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "ରୁପାନ୍ତରଣରେ ତ୍ରୁଟି: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "ନିବେଶର ସମାପ୍ତିରେ ଆଶିଂକ ଅକ୍ଷର ଅନୁକ୍ରମ" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "'%s' ସହାୟକକୁ ସଂକେତ '%s' ସେଟ୍ ରେ ରୁପାନ୍ତରିତ କରିହେଲା ନାହିଁ" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ. \"ଫାଇଲ\" ଯୋଜନାକୁ ବ୍ଯବହାର କରୁଥିବା ଗୋଟିଏ ସମ୍ପୂର୍ଣ୍ଣ ୟୁ.ଆର୍.ଆଇ. ନୁହେଁ" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "'%s' ସ୍ଥାନୀୟ ଫାଇଲ ୟୁ.ଆର୍.ଆଇ. '#' ଚିହ୍ନକୁ ସମ୍ମିଳିତ କରିପାରିବ ନାହିଁ" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ. ଅବୈଧ ଅଟେ" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ.ର ଆଧାର ନାମ ଅବୈଧ ଅଟେ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ.ରେ ଅବୈଧ ଏସ୍କେପ୍ ଅକ୍ଷର ରହିଛି" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' ପଥ ନାମ ଏକ ସମ୍ପୂର୍ଣ୍ଣ ପଥ ନୁହେଁ" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "ଅବୈଧ ଆଧାର ନାମ" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "%s' ଡିରେକ୍ଟୋରି ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "\"%2$s\" ଫାଇଲ ପଢିବା ପାଇଁ %1$lu ବାଇଟ୍ ବାଣ୍ଟିହେଲା ନାହିଁ" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ଫାଇଲ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ଫାଇଲ \"%s\" ଟି ଅତ୍ଯଧିକ ବଡ଼" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ଫାଇଲ ପଢିବାରେ ଅସଫଳ: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ଫାଇଲର ଗୁଣ ପାଇବାରେ ଅସଫଳ: fstat() ଅସଫଳ: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fdopen() ଅସଫଳ: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ଫାଇଲ ରୁ '%s' ନାମ ବଦଳାଇ ବାରେ ଅସଫଳ: g_rename() ଅସଫଳ: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ଫାଇଲ ସ୍ରୁଷ୍ଟି କରିବାରେ ଅସଫଳ: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' ଫାଇଲ କୁ େଲଖନ ପାଇଁ ଖୋଲିବାରେ ଅସଫଳ: fdopen() ଅସଫଳ: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fwrite() ଅସଫଳ: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fflush() ଅସଫଳ: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fsync() ଅସଫଳ: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ଫାଇଲ କୁ ବନ୍ଦ କରିବା ରେ ଅସଫଳ: fclose() ଅସଫଳ: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ଅବସ୍ଥିତ '%s' ଫାଇଲ କାଢି ହେଲା ନାହଁି: g_unlink ଅସଫଳ %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' ନମୁନା ଟି ଅବୈଧ ଅଟେ, '%s' ଧାରଣ କରିବା ଉଚିତ ନୁହେଁ" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ନମୁନା ଟି XXXXXXକୁ ଧାରଣ କରିନାହିଁ" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ପଢିବାରେ ଅସଫଳ: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ଅସହାୟକ" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "%s' ରୁ '%s' ର ରୁପାନ୍ତରକ ଖୋଲି ପାରିଲା ନାହିଁ: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ରେ ଅଂସସାଧିତ ପଠନ କରିହେଲା ନାହିଁ" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "ପଠନ ବଫରରେ ଅରୂପାନ୍ତରିତ ତଥ୍ଯ ବଳକା ଅଛି" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "ଆଂଶିକ ଅକ୍ଷର ରେ ଚାନେଲର ସମାପ୍ତି" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end େର ଅଂସସାଧିତ ପଠନ କରିହେଲା ନାହିଁ" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: open() ଅସଫଳ: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ଫାଇଲ କୁ ମ୍ଯାପ୍ କରିବାରେ ଅସଫଳ: mmap() ଅସଫଳ: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "ଧାଡ଼ି %dର ଅକ୍ଷର %dରେ ତ୍ରୁଟି: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ନାମରେ ଅବୈଧ UTF-8 ସାଙ୍କେତିକ ପାଠ୍ଯ- '%s' ବୈଧ ନୁହଁ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ଟି ଗୋଟିଏ ବୈଧ ନାମ ନୁହଁ" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ଟି ଗୋଟିଏ ବୈଧ ନାମ ନୁହଁ: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d ଧାଡ଼ିରେ ତ୍ରୁଟି: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s' କୁ ବିଶ୍ଳେଷଣ କରିବାରେ ଅସଫଳ, ଯାହାକି ଗୋଟିଏ ଅକ୍ଷର ରେଫରେନ୍ସ ମଦ୍ଧ୍ଯରେ ଏକ ଅଙ୍କ ହେବା ଉଚିତ " +"ଥିଲା(ଉଦାହରଣ ସ୍ବରୂପେ &#୨୩୪;) - ବୋଧହୁଏ ଅଙ୍କଟି ବହୁତ ବଡ଼ ଅଟେ" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"ଅକ୍ଷର ରେଫରେନ୍ସ ସେମିକୋଲନରେ ସମାପ୍ତ ହେଉ ନାହିଁ; ସମ୍ଭବତଃ ଆପଣ ଗୋଟିଏ ବସ୍ତୁ ଆରମ୍ଭ କରିବାକୁ ନ ଚାହିଁ, " +"ଏକ ଆମ୍ପର୍ସେଣ୍ଡ୍ ଅକ୍ଷର ବ୍ଯବହାର କରିଛନ୍ତି - ତାହାକୁ & ଭାବରେ ଏସ୍କେପ୍ କରନ୍ତୁ" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' ଅକ୍ଷର ରେଫରେନ୍ସ ଟି ଗୋଟିଏ ଅନୁମତ ଅକ୍ଷରକୁ ସଙ୍କେତ କରୁ ନାହିଁ" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "ଖାଲି ବସ୍ତୁ '&;' ଦେଖା ଗଲା; ବୈଧ ବସ୍ତୁଗୁଡ଼ିକ ହେଲା: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ବସ୍ତୁ ନାମ '%-.*s' ଜଣା ନାହିଁ" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"ବସ୍ତୁଟି ସେମିକୋଲନରେ ଶେଷ ହେଲା ନାହିଁ; ସମ୍ଭବତଃ ଆପଣ ଗୋଟିଏ ବସ୍ତୁ ଆରମ୍ଭ କରିବାକୁ ନ ଚାହିଁ, ଏକ " +"ଆମ୍ପର୍ସେଣ୍ଡ୍ ଅକ୍ଷର ବ୍ଯବହାର କରିଛନ୍ତି - ତାହାକୁ & ଭାବରେ ଏସ୍କେପ୍ କରନ୍ତୁ" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ଦଲିଲ ଗୋଟିଏ ଉପାଦାନରେ ଆରମ୍ଭ ହେବା ଉଚିତ (ଉଦାହରଣ ସ୍ବରୂପ )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' ଅକ୍ଷର ପଛରେ ଆସୁଥିବା '%s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଏହା ଗୋଟିଏ ବସ୍ତୁର ନାମକୁ ଆରମ୍ଭ କରିପାରିବ ନାହିଁ" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"ଅଯୁଗ୍ମ ସଂଖ୍ୟା '%s', ଖାଲି-ଉପାଦାନ ଟ୍ୟାଗ '%s' ପ୍ରାରମ୍ଭ ସୂଚକକୁ ସମାପ୍ତ କରିବା ପାଇଁ '>' ଅକ୍ଷର " +"ଆଶାକରାଯାଉଥିଲା" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ବିଚିତ୍ର ଅକ୍ଷର '%1$s', '%3$s' ଉପାଦାନର ଗୋଟିଏ ଗୁଣର ନାମ '%2$s' ପରେ '=' ପ୍ରତ୍ଯାଶିତ ଥିଲା" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"ବିଚିତ୍ର ଅକ୍ଷର '%s', '%s' ଉପାଦାନର ପ୍ରାରମ୍ଭ ସୂଚକକୁ ସମାପ୍ତ କରିବା ପାଇଁ '>' ବା '/' ଅକ୍ଷର " +"ପ୍ରତ୍ଯାଶିତ ଥିଲା, ଅଥବା ଇଚ୍ଛାଧୀନ ଭାବରେ ଗୋଟିଏ ଗୁଣ; ବୋଧହୁଏ ଆପଣ ଗୋଟିଏ ଗୁଣର ନାମରେ ଏକ ଅବୈଧ " +"ଅକ୍ଷର ବ୍ଯବହାର କରିଛନ୍ତି" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"ବିଚିତ୍ର ଅକ୍ଷର '%1$s', ସମାନ ଚିହ୍ନ ପରେ '%3$s' ଉପାଦାନର '%2$s' ଗୁଣର ମୂଲ୍ଯ ଦେବା ପାଇଁ ଗୋଟିଏ " +"ଖୋଲା ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ ପ୍ରତ୍ଯାଶିତ ଥିଲା" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"ବନ୍ଦ ଉପାଦାନ ନାମ '%2$s' ପଛରେ ଆସୁଥିବା '%1$s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଅନୁମତ ଅକ୍ଷର ହେଲା '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ଉପାଦାନ '%s' ବନ୍ଦ କରାଯାଇଥିଲା, ବର୍ତ୍ତମାନ କୌଣସି ଉପାଦାନ ଖୋଲା ନାହିଁ" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ଉପାଦାନ '%s' ବନ୍ଦ କରାଯାଇଥିଲା, କିନ୍ତୁ ବର୍ତ୍ତମାନ '%s' ଉପାଦାନଟି ଖୋଲା ଅଛି" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ଦଲିଲ ଖାଲି ଥିଲା ବା କେବଳ ଖାଲି ଯାଗା ଧାରଣ କରିଥିଲା" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ଦଲିଲଟି ଗୋଟିଏ କୌଣିକ ବନ୍ଧନୀ '<'ର ଠିକ ପରେ ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ଉପାଦାନଗୁଡ଼ିକ ଖୋଲା ଥାଇ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା'%s' ଉପାଦାନ ସର୍ବଶେଷ ଖୋଲା " +"ଥିଲା" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା, <%s/> ସୂଚକ ସମାପ୍ତ କରିବା ପାଇଁ ଗୋଟିଏ ବନ୍ଦ କୌଣିକ " +"ବନ୍ଧନୀ ପ୍ରତ୍ଯାଶିତ ଥିଲା" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "ଉପାଦାନର ନାମ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ଗୁଣର ନାମ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ଉପାଦାନ ଆରମ୍ଭର ସୂଚକ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ଗୁଣର ନାମ ପଛରେ ଆସୁଥିବା ସମାନ ଚିହ୍ନ ପରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା; ଗୁଣର କିଛି " +"ମୂଲ୍ଯ ନାହିଁ" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ଗୁଣର ମୂଲ୍ଯ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' ଉପାଦାନର ବନ୍ଦ ସୂଚକ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ଟିପ୍ପଣୀ ବା ସଂସାଧନ ସାଧନ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ଭ୍ରଷ୍ଟ ବସ୍ତୁ" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "ଆଭ୍ଯନ୍ତରୀଣ ତୃଟି କିମ୍ବା ଭ୍ରଷ୍ଟ ବସ୍ତୁ" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ସ୍ମୃତି ପରିସର ବାହାରେ" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ପଶ୍ଚାତ ଅନୁମାର୍ଗଣ ସୀମା ପହଞ୍ଚି ଯାଇଛି" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "ଏହି ଶୈଳୀ ଆଂଶିକ ମେଳନ ପାଇଁ ସମର୍ଥିତ ନ ଥିବା ବସ୍ତୁ ମାନଙ୍କୁ ଧାରଣ କରିଥାଏ" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "ଆଭ୍ଯନ୍ତରୀଣ ତୃଟି" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "ଆଂଶିକ ମେଳନ ପାଇଁ ସର୍ତ୍ତ ରୂପରେ ପଶ୍ଚାତ ନିର୍ଦ୍ଦେଶ ମାନ ସମର୍ଥିତ ନୁହଁନ୍ତି" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "ପୁନରାବର୍ତ୍ତନ ସୀମା ପହଞ୍ଚିଯାଇଛି" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ଶୂନ୍ଯ ଉପବାକ୍ଯଖଣ୍ଡ କାର୍ଯ୍ଯସ୍ଥଳୀ ପରିସୀମା ଶେଷ ହୋଇଯାଇଛି" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ନୂତନ ଧାଡି ପତାକା ମାନଙ୍କ ପାଇଁ ଅବୈଧ ମିଶ୍ରଣ" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ଅଜଣା ତୃଟି" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ନମୁନା ଶେଷରେ" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ନମୁନା ଶେଷରେ" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ଅଚିହ୍ନା ଅକ୍ଷର ଅନୁସରଣ କରେ \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ଅକ୍ଷର ପ୍ରକାର-ପରିବର୍ତ୍ତନ escapes (\\l, \\L, \\u, \\U) ଗୁଡ଼ିକ ଏଠାରେ ଅନୁମୋଦିତ ନୁହଁନ୍ତି" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} ପରିମାଣକ ରେ ସଂଖ୍ୟାଗୁଡ଼ିକ କ୍ରମରେ ନାହିଁ" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} ପରିମାଣକ ରେ ସଂଖ୍ୟାଟି ଅତ୍ୟଧିକ ବଡ଼" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "ବର୍ଣ୍ଣ ଶ୍ରେଣୀ ପାଇଁ ସମାପ୍ତି ] ଅନୁପସ୍ଥିତ ଅଛି" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ବର୍ଣ୍ଣ ଶ୍ରେଣୀରେ ଅବୈଧ ନିକାସ ଅନୁକ୍ରମ" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "ବର୍ଣ୍ଣ ଶ୍ରେଣୀରେ ପରିସର ଅବ୍ୟବସ୍ଥିତ" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ପୁନରାବର୍ତ୍ତନ ପାଇଁ କିଛି ନାହିଁ" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? ପରେ ଅଚିହ୍ନା ଅକ୍ଷର" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< ପରେ ଅଚିହ୍ନା ଅକ୍ଷର" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P ପରେ ଅଚିହ୍ନା ଅକ୍ଷର" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX ନାମିତ ଶ୍ରେଣୀଗୁଡ଼ିକ କେବଳ ଗୋଟିଏ ଶ୍ରେଣୀ ମଧ୍ଯରେ ସମର୍ଥିତ" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "ସମାପ୍ତକାରୀ ) ଅନୁପସ୍ଥିତ" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ଆରମ୍ଭ ବିନା (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R କିମ୍ବା (?[+-]ଅଙ୍କଗୁଡ଼ିକ ନିଶ୍ଚିତରୂପେ ) ପରେ ଆସିବା ଉଚିତ" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "ଅସ୍ତିତ୍ୱ ନଥିବା ଉପନମୁନାର ସନ୍ଦର୍ଭ" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "ଟିପ୍ପଣୀ ପରେ ) ଅନୁପସ୍ଥିତ" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "ନିୟମିତ ପରିପ୍ରକାଶଟି ଅତ୍ଯଧିକ ବଡ଼" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "ସ୍ମୃତିସ୍ଥାନ ପାଇବାରେ ବିଫଳ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "ପଛକୁ ଦେଖି ନିଶ୍ଚିତକରଣର ସ୍ଥାୟୀ ଆକାର ନଥାଏ" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "ବିକୃତ ସଂଖ୍ୟା କିମ୍ବା (?( ପରେଥିବା ନାମ" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "ପ୍ରତିବନ୍ଧିତ ଶ୍ରେଣୀ ଦୁଇରୁ ଅଧିକ ଶାଖା ଧାରଣ କରିଥାଏ" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( ପରେ ନିଶ୍ଚିତକରଣ ଆବଶ୍ୟକ" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ଅଜଣା POSIX ଶ୍ରେଣୀ ନାମ" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ସଂକଳନ ଉପାଦାନଗୁଡ଼ିକ ସମର୍ଥିତ ନୁହଁ" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ଅନୁକ୍ରମରେ ବର୍ଣ୍ଣର ମୂଲ୍ୟ ଅତ୍ୟଧିକ ବଡ଼" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ଅବୈଧ ସର୍ତ୍ତ (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "ପଛକୁ ଦେଖି ନିଶ୍ଚିତକରଣରେ \\C ଅନୁମୋଦିତ ନୁହଁ" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "ପୁନରାବର୍ତ୍ତୀ ଡାକରା ଅନିର୍ଦ୍ଧିଷ୍ଟ କାଳପାଇଁ ଚକ୍ର ସୃଷ୍ଟିକରିପାରେ" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ଉପନମୁନା ନାମରେ ଅନ୍ତକ ନାହିଁ" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "ଦୁଇଟି ନାମିତ ଉପନମୁନାର ଏକା ନାମ ଅଛି" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "\\P କିମ୍ବା \\p ଅନୁକ୍ରମଟି ବିକୃତ ହୋଇଯାଇଛି" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P କିମ୍ବା \\p ପରେ ଅଜଣା ଗୁଣଧର୍ମ ନାମ" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ଉପଢ଼ାଞ୍ଚା ନାମଟି ଅତ୍ୟଧିକ ବଡ଼ (ସର୍ବାଧିକ 32 ବର୍ଣ୍ଣ)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ଅତ୍ୟଧିକ ନାମିତ ଉପଢ଼ାଞ୍ଚା (ସର୍ବାଧିକ 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "ଅଷ୍ଟମିକ ମୂଲ୍ୟଟି \\377 ଠାରୁ ବଡ଼" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE ଶ୍ରେଣୀ ଏକାଧିକ ଶାଖା ଧାରଣ କରେ" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE ଶ୍ରେଣୀର ପୁନରାବର୍ତ୍ତନ ଅନୁମୋଦିତ ନୁହଁ" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "ଅସଂଗତ NEWLINE ବିକଳ୍ପଗୁଡ଼ିକ" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g ଟି ଗୋଟିଏ ଆବଦ୍ଧ ନାମ ପରେ କିମ୍ବା ଇଚ୍ଛାଧୀନ ଆବଦ୍ଧ ପୂର୍ଣ୍ଣ ସଂଖ୍ୟା ପରେ ନଥାଏ" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ଅପ୍ରତ୍ୟାଶିତ ପୁନରାବୃତ୍ତି" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "ସଂକେତ ଅତିପ୍ରବାହ" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran ସଙ୍କଳନ କାର୍ଯ୍ୟକ୍ଷେତ୍ର" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "ପୂର୍ବରୁ ଯାଞ୍ଚକରାଯାଇଥିବା ଉଲ୍ଲେଖିତ ଉପଢ଼ାଞ୍ଚା ମିଳୁନାହିଁ" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "%s ନିୟମିତ ପରିପ୍ରକାଶକୁ ମିଳାଇବା ସମୟରେ ତୃଟି: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE ଲାଇବ୍ରେରୀକୁ UTF8 ସମର୍ଥନ ବିନା ସଙ୍କଳନ କରାଯାଇଛି" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE ଲାଇବ୍ରେରୀକୁ UTF8 ଗୁଣଧର୍ମ ସମର୍ଥନ ବିନା ସଙ୍କଳନ କରାଯାଇଛି" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%s ନିୟମିତ ପରିପ୍ରକାଶକୁ %d ଅକ୍ଷରରେ ସଙ୍କଳନ କରିବା ସମୟରେ ତୃଟି: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s ନିୟମିତ ପରିପ୍ରକାଶକୁ ଅନୁକୂଳତମ କରିବା ସମୟରେ ତୃଟି: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "ଷୋଡଶାଧାରୀ ଅଙ୍କ କିମ୍ବା '}' ଆଶା କରାଯାଉଥିଲା" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "ଷୋଡଶାଧାରୀ ଅଙ୍କ ଆଶା କରାଯାଉଥିଲା" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶରେ '<' ଅନୁପସ୍ଥିତ" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "ଅସମାପ୍ତ ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "ଶୂନ୍ଯ ଲମ୍ବ ବିଶିଷ୍ଟ ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "ଅଙ୍କ ଆଶା କରାଯାଉଥିଲା" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ଅବୈଧ ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "ପଥଭ୍ରଷ୍ଟ ନିର୍ଣ୍ଣୟ '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ଅଜଣା ପଳାୟନ ସଂପ୍ରତୀକ" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ପରିବର୍ତ୍ତିତ ପାଠ୍ଯ \"%s\" ର %lu ଅକ୍ଷରରେ ବିଶ୍ଳଷଣ କରିବା ସମୟରେ ତୃଟି: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ଉଦ୍ଧ୍ରୁତ ପାଠ୍ଯ ଉଦ୍ଧ୍ରୁତ ଚିହ୍ନରେ ଆରମ୍ଭ ହୋଇ ନାହିଁ" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "ପାଠ୍ଯ ନିର୍ଦ୍ଦେଶ ବା ଅନ୍ଯ ଆବରଣ-ଉଦ୍ଧ୍ରୁତ ପାଠ୍ଯରେ ଅମେଳ ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ଗୋଟିଏ '\\' ଅକ୍ଷରର ଠିକ ପରେ ପାଠ୍ଯ ସମାପ୍ତ ହୋଇ ଗଲା (ପାଠ୍ଯଟି ଥିଲା: '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"%c ପାଇଁ ମେଳ ହେଉ ଥିବା ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ ମିଳିବା ପୂର୍ବରୁ ପାଠ୍ଯ ସମାପ୍ତ ହୋଇ ଗଲା. (ପାଠ୍ଯଟି ଥିଲା: '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ପାଠ୍ଯ ଖାଲି ଥିଲା (ବା କେବଳ ଖାଲି ଯାଗା ଧାରଣ କରିଥିଲା)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢ଼ିବାରେ ଅସଫଳ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟା ସହିତ ସଂଯୋଗ ପାଇଁ ପାଇପ୍ ସୃଷ୍ଟି କରିବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ନିର୍ଭରକ ପାଇପ୍ ରୁ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)" + +# Gora: "change to directory" means "go to directory" here +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ଡିରେକ୍ଟୋରିକୁ ଯିବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "ଅବୈଧ ପ୍ରୋଗ୍ରାମ ନାମ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "ସଦିଶ ସ୍ବତନ୍ତ୍ରଚର %d ରେ ବାକ୍ଯଖଣ୍ଡ %s ଟି ଅବୈଧ ଅଟେ" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ଏହି ପରିୂବେଶ ରେ ବାକ୍ଯଖଣ୍ଡ:%s ଅବୈଧ ଅଟେ" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ଚଳନ୍ତି ଡିରେକ୍ଟୋରି: %s ଟି ଅବୈଧ ଅଟେ" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ସାହାଯ୍ଯ କାରିକା (%s) କୁ ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ g_io_channel_win32_poll()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ select()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "ଶାଖା ସୃଷ୍ଟି କରିବାରେ ଅସଫଳ (%s" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟା \"%s\" ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାର ନିର୍ଗମ ବା ନିବେଶର ପୁନଃନିର୍ଦ୍ଦେଶନ କରିବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ଶାଖାଯୁକ୍ତ କରିବାରେ ଅସଫଳ (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ନିଷ୍ପାଦନ କରିବାରେ ଅଜଣା ତ୍ରୁଟି \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ନିର୍ଭରକ ପି.ଆଇ.ଡି. ପାଇପ୍ ରୁ ପର୍ଯ୍ଯାପ୍ତ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "ଇ.ଉ.ଟିଏଫ୍.-à­® ପାଇଁ ଅକ୍ଷରଟି ପରିସର ବାହାରେ" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ଅନୁକ୍ରମ" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "ଇ.ଉ.ଟିଏଫ୍.-୧୬ ପାଇଁ ଅକ୍ଷରଟି ପରିସର ବାହାରେ" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ବ୍ଯବହାର:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ପସନ୍ଦ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "ସାହାଯ୍ଯ ପସନ୍ଦ" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "ସାହାଯ୍ଯ ପସନ୍ଦ ଦେଖାନ୍ତୁ" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "ସବୁ ସାହାଯ୍ଯ ପସନ୍ଦ ଦେଖାନ୍ତୁ" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "ପ୍ରୟୋଗ ପସନ୍ଦ" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%s ପାଇଁ ପୂର୍ଣ ସଂଖ୍ଯା ମୂଲ୍ଯ '%s' କୁ ବିଶ୍ଲେଷିଣ କରିହେଲା ନାହିଁ" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s ପାଇଁ ପୂର୍ଣ ସଂଖ୍ଯା '%s' ର ମୂଲ୍ଯ ପରିସର ବାହାରେ" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' ଦ୍ବ୍ଯର୍ଥକ ମୂଲ୍ଯକୁ %s ପାଇଁ ବିଶ୍ଳେଷିତ କରିପାରିଲା ନାହିଁ" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' ଦ୍ବ୍ଯର୍ଥକ ମୂଲ୍ଯଟି %s ପାଇଁ ପରିସରର ବହିର୍ଭୂତ।" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "ରୁପାନ୍ତରଣ ର ବିକଲ୍ପ ରେ ତ୍ରୁଟି: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ପାଇଁ ସ୍ବତନ୍ତ୍ରଚର ଟି ହଜି ଯାଇଛି" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "ଅଜଣା ପସନ୍ଦ %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "ଅନୁସନ୍ଧାନ ଡିରେକ୍ଟୋରି ମାନଙ୍କରେ ବୈଧ ଚାବି ଫାଇଲ ମିଳିଲା ନାହିଁ" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ଏହା ଏକ ନିୟମିତ ଫାଇଲ ନୁହେଁ" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ଫାଇଲ ଟି ଖାଲି ଅଛି" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "ମୁଖ୍ଯ ଫାଇଲ '%s' କୁ ଧାରଣ କରିଛି ଯାହାକି ଗୋଟିଏ ମୁଖ୍ଯ-ଗୁଣ ର ଯୋଡି, ସମୂହ, କିମ୍ବା ବାକ୍ଯ ନୁହେଁ" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "ଅବୈଧ ସମୂହ ନାମ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "ମୂଖ୍ଯ ଫାଇଲ କୌଣସି ସମୂହ ସହ ଆରମ୍ଭ ହୁଏ ନାହିଁ" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "ଅବୈଧ ଚାବି ନାମ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଟି ଗୋଟିଏ ଅସହାୟକ ସଂକେତ '%s' ଧାରଣ କରିଛି" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ସମୂହ ନାହିଁ" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ଚାବିକାଠି ନାହିଁ" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ '%s' ଅଟେ, ଯାହାକି ଇଉ-ଟି-ଏଫ୍-à­® ନୁହେଁ" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ଗୋଟିଏ '%s' ସମୂହ ସହିତ ଏଛି ଯାହାର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ଚାବିକାଠି '%s' ସମୂହ ରେ ନାହିଁ " + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଟି ଲାଇନ୍ ର ସମାପ୍ତି ରେ ଏସ୍କେପ୍ ଅକ୍ଷର ଧାରଣ କରିଛି" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ '%s' ଅବୈଧ ଏସ୍କେପ୍ ଅକ୍ଷର ଧାରଣ କରିଛି" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' ର ମୂଲ୍ଯ ଗୋଟିଏ ସଂଖ୍ଯା ଭାବରେ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ପୂର୍ଣ ମୂଲ୍ଯ '%s' ପରିସର ର ବାହାରେ ଅଛି" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' ମୂଲ୍ଯକୁ ଗୋଟିଏ ଭାସମାନ ସଂଖ୍ଯା ଭାବରେ ବ୍ଯାଖ୍ଯା କରିହେବ ନାହିଁ" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' ର ମୂଲ୍ଯ ଗୋଟିଏ ବୁଲିଆନ୍ ଭାବରେ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "ଅତ୍ୟଧିକ ବଡ଼ ଗଣନା ମୂଲ୍ୟ %sକୁ ପଠାଯାଇଛି" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "ଧାରା ପୂର୍ବରୁ ବନ୍ଦଅଛି" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "ପ୍ରୟୋଗଟି ବାତିଲ ହୋଇଛି" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "ଅବୈଧ ସକେଟ, ଆରମ୍ଭ ହୋଇନାହିଁ" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ବାଇଟ୍ ଅନୁକ୍ରମ" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "ସକେଟ ଠିକଣା ପାଇଁ ଯଥେଷ୍ଟ ସ୍ଥାନ ନାହିଁ" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "ବାତିଲଯୋଗ୍ୟ ପ୍ରାରମ୍ଭିକରଣ ସମର୍ଥିତ ନୁହଁ" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "ଅଜଣା ପ୍ରକାର" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ଫାଇଲପ୍ରକାର" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s ପ୍ରକାର" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ଅପ୍ରତ୍ୟାଶିତ ପ୍ରାରମ୍ଭିକ ଧାରାର ଶେଷ" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "ବେନାମୀ" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ଡେସ୍କଟପ ଫାଇଲ Exec କ୍ଷେତ୍ର ଉଲ୍ଲେଖ କରିନଥିଲା" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "ପ୍ରୟୋଗ ପାଇଁ ଆବଶ୍ୟକ ଟର୍ମିନାଲ ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ଚାଳକ ପ୍ରୟୋଗ ବିନ୍ୟାସ ଫୋଲଡର %s କୁ ନିର୍ମାଣ କରିପାରିବେ ନାହିଁ: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ଚାଳକ MIME ବିନ୍ୟାସିତ ଫୋଲଡର %s ନିର୍ମାଣ କରିପାରିବ ନାହିଁ: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ଚାଳକ ଡେସ୍କଟପ ଫାଇଲ %s ନିର୍ମାଣ କରିପାରିବ ନାହିଁ" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ପାଇଁ ଇଚ୍ଛାରୂପୀ ପରିଭାଷା" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ଡ୍ରାଇଭ ବାହାର କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ଡ୍ରାଇଭ ବାହାର କରିବା କିମ୍ବା eject_with_operation କୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ଡ୍ରାଇଭ ସଞ୍ଚାର ମାଧ୍ଯମ ପାଇଁ ଚୟନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ଡ୍ରାଇଭ ଆରମ୍ଭ କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ଡ୍ରାଇଭ ବନ୍ଦ କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %dକୁ ନିୟନ୍ତ୍ରଣ କରୁଅଛି" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ସାଙ୍କେତିକରଣରେ ତ୍ରୁଟିଯୁକ୍ତ ଟକେନ ସଂଖ୍ୟା (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %dକୁ ନିୟନ୍ତ୍ରଣ କରିପାରୁ ନାହିଁ" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ସାଙ୍କେତିକରଣରେ ତ୍ରୁଟିଯୁକ୍ତ ଟକେନ ସଂଖ୍ୟା (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ପାଇଁ ଗୋଟିଏ GEmblem ଆଶାକରାଯାଉଅଛି" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ପ୍ରୟୋଗ ସମର୍ଥିତ ନୁହଁ" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ଧାରଣ କରିଥିବା ସ୍ଥାପନ ଅବସ୍ଥିତ ନାହିଁ" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ଡିରେକ୍ଟୋରୀ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲ ଅବସ୍ଥିତ" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ପୁନରାବର୍ତ୍ତୀ ଭାବରେ ଡିରେକ୍ଟୋରୀ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ଅସହାୟକ" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ଫାଇଲ ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "ବିଶେଷ ଫାଇଲକୁ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "ଅବୈଧ symlink ମୂଲ୍ୟ ପ୍ରଦାନ କରାଯାଇଛି" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ଆବର୍ଜନା ପାତ୍ର ସମର୍ଥିତ ନୁହଁ" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ଫାଇଲ ନାମଗୁଡ଼ିକ '%c' ଧାରଣ କରିପାରେ ନାହିଁ" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ଆକାର ସ୍ଥାପନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ଏହି ଫାଇଲକୁ ନିୟନ୍ତ୍ରମ କରିବା ଫଳରେ କୌଣସି ପ୍ରୟୋଗ ପଞ୍ଜିକୃତ ହୋଇନାହିଁ" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ଗଣନାକାର ବନ୍ଦ ହୋଇଯାଇଛି" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ଫାଇଲ ଗଣନାକାର ପାଖରେ ଉତ୍କୃଷ୍ଟ ପ୍ରୟୋଗ ଅଛି" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ଫାଇଲ ଗଣନାକାର ପୂର୍ବରୁ ବନ୍ଦ ହୋଇଯାଇଛି" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %d କୁ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ ନାହିଁ" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon ପାଇଁ ତ୍ରୁଟିଯୁକ୍ତ ନିବେଶ ତଥ୍ୟ" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "ଧାରା query_info କୁ ସମର୍ଥନ କରେନାହିଁ" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "ଧାରାରେ Seek ସମର୍ଥିତ ନୁହଁ" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ନିବେଶ ଧାରାରେ କାଟିବା ଅନୁମୋଦିତ ନୁହଁ" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "ଧାରାରେ କାଟିବା ଅନୁମୋଦିତ ନୁହଁ" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ଭୁଲ ସଂଖ୍ୟକ ଟକେନ (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "ଶ୍ରେଣୀ ନାମ %s ପାଇଁ କୌଣସି ପ୍ରକାର ନାହିଁ" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ପ୍ରକାର %s GIcon ଅନ୍ତରାପୃଷ୍ଠକୁ କାର୍ଯ୍ୟକାରି କରେନାହିଁ" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "ପ୍ରକାର %s ଶ୍ରେଣୀଭୁକ୍ତ ନୁହଁ" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "ତ୍ରୁଟିଯୁକ୍ତ ସଂସ୍କରଣ ସଂଖ୍ୟା: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ପ୍ରକାର %s GIcon ଅନ୍ତରାପୃଷ୍ଠରେ ଟକେନ()ରୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ଚିତ୍ରସଂକେତ ସାଙ୍କେତିକରଣର ପ୍ରଦତ୍ତ ସଂସ୍କରଣକୁ ନିୟନ୍ତ୍ରଣ କରାଯାଇପାରିବ ନାହିଁ" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ନିବେଶ ଧାରାରେ ପଢ଼ିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "ଧାରା ପାଖରେ ଉତ୍କୃଷ୍ଟ ପ୍ରୟୋଗ ଅଛି" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "ସକେଟ ଠିକଣା ପାଇଁ ଯଥେଷ୍ଟ ସ୍ଥାନ ନାହିଁ" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "ଅସମର୍ଥିତ ସକେଟ ଠିକଣା" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସ୍ଥାନୀୟ ଡିରେକ୍ଟୋରୀ ମନିଟର ପ୍ରକାର ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ଅବୈଧ ଫାଇଲ ନାମ %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ଫାଇଲତନ୍ତ୍ର ସୂଚନା ପାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ମୂଳ ଡିରେକ୍ଟୋରୀର ନାମ ବଦଳାଯାଇପାରିବ ନାହିଁ" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ଫାଇଲର ନାମ ବଦଳାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ଫାଇଲର ନାମ ବଦଳାଯାଇପାରିବ ନାହିଁ, ଫାଇଲ ନାମ ପୂର୍ବରୁ ଅବସ୍ଥିତ" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ଅବୈଧ ଫାଇଲ ନାମ" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ଫାଇଲ ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଖୋଲିପାରିବେ ନାହିଁ" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ଫାଇଲ ଅପସାରଣରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ଫାଇଲକୁ ବର୍ଜନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ଆବର୍ଜନା ପାତ୍ର ଡିରେକ୍ଟୋରୀ %sକୁ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ଆବର୍ଜନା ପାତ୍ର ପାଇଁ ଉଚ୍ଚସ୍ତରୀୟ ଡିରେକ୍ଟୋରୀ ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ଆବର୍ଜନା ପାତ୍ର ଡିରେକ୍ଟୋରୀ ଖୋଜିବା ଏବଂ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ବର୍ଜିତ ସୂଚନା ଫାଇଲ ନିର୍ମାଣରେ ଅସମର୍ଥ : %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ଫାଇଲକୁ ବର୍ଜନ କରିବାରେ ଅସମର୍ଥ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ଡିରେକ୍ଟୋରି ନିର୍ମାଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ପଢିବାରେ ଅସଫଳ: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "ପ୍ରତୀକାତ୍ମକ ସମ୍ପର୍କ ନିର୍ମାଣରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ଫାଇଲ ଘୁଞ୍ଚାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ଡିରେକ୍ଟୋରୀକୁ ଘୁଞ୍ଚାଇପାରିବେ ନାହିଁ" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "ନକଲ ସଂରକ୍ଷଣ ଫାଇଲ ନିର୍ମାଣ ଅସଫଳ ହେଲା" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲ ଘୁଞ୍ଚାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "ଅସମର୍ଥିତ ସ୍ଥାପନଗୁଡ଼ିକ ମଧ୍ଯରେ ଗତିକରନ୍ତୁ" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "ଗୁଣର ମୂଲ୍ୟ ନିଶ୍ଚିତରୂପେ non-NULL ହୋଇଥିବା ଉଚିତ" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "ଅବୈଧ ଗୁଣର ପ୍ରକାର (ବାକ୍ୟଖଣ୍ଡ ଆଶାକରାଯାଉଛି)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "ଅବୈଧ ବିସ୍ତୃତ ଗୁଣର ନାମ" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ଅନୁଲଗ୍ନ ଗୁଣ '%s'କୁ ବିନ୍ୟାସ କରିବା ସମୟରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "ଫାଇଲ '%s'କୁ ଆରମ୍ଭ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ଅବୈଧ ସାଙ୍କେତିକରଣ)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ଫାଇଲ ନିରୂପକ ଆରମ୍ଭ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ଅବୈଧ ଗୁଣ ପ୍ରକାର (unit32 ଆଶାକରାଯାଉଛି)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ଅବୈଧ ଗୁଣ ପ୍ରକାର (unit64 ଆଶାକରାଯାଉଛି)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "ଅବୈଧ ଗୁଣ ପ୍ରକାର (ବାଇଟ ବାକ୍ୟଖଣ୍ଡ ଆଶାକରାଯାଉଛି)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "symlinks ରେ ଅନୁମତିଗୁଡ଼ିକୁ ସେଟ କରିପାରିବେ ନାହିଁ" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ଅନୁମତି ବିନ୍ୟାସକରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "ମାଲିକ ନିରୁପଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink ନିଶ୍ଚିତ ରୂପେ non-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink ବିନ୍ୟାସ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink ବିନ୍ୟାସ କରିବାରେ ତ୍ରୁଟି: ଫାଇଲଟି ଗୋଟିଏ symlink ନୁହଁ" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "ପରିବର୍ତ୍ତନ ଅଥବା ଅଭିଗମ୍ୟତା ସମୟ ବିନ୍ୟାସକରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ପ୍ରସଙ୍ଗଟି ନିଶ୍ଚିତ ରୂପେ non-NULL ଅଟେ" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ପ୍ରସଙ୍ଗ ବିନ୍ୟାସ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ଏହି ତନ୍ତ୍ରରେ ସକ୍ରିୟ ହୋଇନାହିଁ" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ଗୁଣ %s ବିନ୍ୟାସ କରିବା ସମର୍ଥିତ ନୁହଁ" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ଫାଇଲରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ଫାଇଲଭିତରେ ଅନୁସନ୍ଧାନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ଫାଇଲ ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସ୍ଥାନୀୟ ଫାଇଲ ମନିଟର ପ୍ରକାର ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ଫାଇଲଭିତରେ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "ପୁରୁଣା ନକଲ ସଂରକ୍ଷଣ ସଂଯୋଗ ଅପସାରଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ନକଲ ସଂରକ୍ଷଣ ନକଲ ନିର୍ମାଣରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ଅସ୍ଥାୟୀ ଫାଇଲର ନାମ ବଦଳାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ଫାଇଲ ବିଚ୍ଛିନ୍ନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ଫାଇଲ '%s' ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲଟି ଗୋଟିଏ ଡିରେକ୍ଟୋରୀ ଅଟେ" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲଟି ଗୋଟିଏ ନିୟମିତ ଫାଇଲ ନୁହେଁ" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ଫାଇଲଟି ବାହାରୁ ପରିବର୍ତ୍ତିତ" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "ପୁରୁଣା ଫାଇଲକୁ ଅପସାରଣରେ ତ୍ରୁଟି: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "ଅବୈଧ GSeekType ଦିଆଯାଇଅଛି" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "ଅବୈଧ ଅନୁସନ୍ଧାନ ଅନୁରୋଧ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream କୁ ବିଚ୍ଛିନ୍ନ କରିହେବ ନାହିଁ " + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "ସ୍ମୃତି ଫଳାଫଳ ବାକ୍ଯଖଣ୍ଡର ଆକାର ବଦଳାଯାଇପାରିବ ନାହିଁ" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "ସ୍ମୃତି ଫଳାଫଳ ବାକ୍ଯଖଣ୍ଡର ଆକାର ବଦଳାଇବାରେ ଅସଫଳ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "ସ୍ଥାପନ ବିସ୍ଥାପନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "ସ୍ଥାପନ ବାହାର କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "ସ୍ଥାପନ କ୍ରିୟା ବିସ୍ଥାପନ କ୍ରିୟା ଅଥବା unmount_with_operation କୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "ସ୍ଥାପନ ବାହାର କରିବା ଅଥବା eject_with_operation କୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "ସ୍ଥାପନ ପୁନଃସ୍ଥାପନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "ସ୍ଥାପନ ସୂଚୀପତ୍ର ପ୍ରକାର ଅନୁମାନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ସ୍ଥାପନ ସମକାଳୀନ ସୂଚୀପତ୍ର ପ୍ରକାର ଅନୁମାନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' ଆଧାର ନାମ '[' but not ']' କୁ ଧାରଣ କରିଥାଏ" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "ଫଳାଫଳ ବାକ୍ଯଖଣ୍ଡ ଲେଖିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "ଉତ୍ସ ବାକ୍ୟଖଣ୍ଡଟି ପୂର୍ବରୁ ବନ୍ଦହୋଇଯାଇଛି" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' କୁ ସମାଧାନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' କୁ ବିପରିତ-ସମାଧାନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' ପାଇଁ କୌଣସି ସର୍ଭିସ ଅନୁଲିପି ନାହିଁ" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "ଅସ୍ଥାୟୀ ଭାବରେ '%s' କୁ ସମାଧାନ କରିବାରେ ଅସମର୍ଥ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' କୁ ସମାଧାନ କରିବାରେ ତ୍ରୁଟି" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "ଅବୈଧ ସକେଟ, ଆରମ୍ଭ ହୋଇନାହିଁ" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ଅବୈଧ ସକେଟ, ଏହା ଯୋଗୁଁ ପ୍ରାରମ୍ଭିକରଣ ବିଫଳ ହୋଇଛି: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "ସକେଟ ପୂର୍ବରୁ ବନ୍ଦହୋଇଯାଇଛି" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ରୁ GSocket ନିର୍ମାଣ କରୁଅଛି : %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ସକେଟ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "ଅଜଣା ପ୍ରଟୋକଲକୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ସ୍ଥାନୀୟ ଠିକଣା ପାଇଲା ନାହିଁ: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ସୁଦୂର ଠିକଣା ପାଇଲା ନାହିଁ: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ଶୁଣି ପାରିଲା ନାହିଁ: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "ଠିକଣା ସହିତ ବାନ୍ଧିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "ସଂଯୋଗ ଗ୍ରହଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "ସଂଯୋଗ କରିବାରେ ତ୍ରୁଟି: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "ସଂଯୋଗ କ୍ରିୟା ଚାଲିଅଛି" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "ସଂଯୋଗ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ବକୟା ତ୍ରୁଟି ପାଇବାରେ ଅସମର୍ଥ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "ତଥ୍ୟ ଗ୍ରହଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "ତଥ୍ୟ ପଠାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "ସକେଟ ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ସକେଟ ଅବସ୍ଥା ପାଇଁ ଅପେକ୍ଷା କରିଅଛି: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "ସନ୍ଦେଶ ପଠାଇବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage windows ରେ ସମର୍ଥିତ ନୁହଁ" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "ସନ୍ଦେଶ ଗ୍ରହଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "ସଂଯୋଗ କରିବା ସମୟରେ ଅଜଣା ତୃଟି" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "ଗ୍ରହଣକାରୀ ପୂର୍ବରୁ ବନ୍ଦଅଛି" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "ଅତିରିକ୍ତ ସକେଟ ବନ୍ଦ ଅଛି" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %dକୁ ନିୟନ୍ତ୍ରଣ କରାଯାଇପାରିବ ନାହିଁ" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 ନିୟନ୍ତ୍ରଣ ସନ୍ଦେଶକୁ ଆଶାକରୁଅଛି, %d ପାଇଲି" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "ସହାୟକ ତଥ୍ୟର ଅପ୍ରତ୍ୟାଶିତ ପ୍ରକାର" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ଗୋଟିଏ fd ଆଶାକରୁଅଛି, କିନ୍ତୁ %d ପାଇଲି\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "ଅବୈଧ fd ଗ୍ରହଣ କରିଛି" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unixରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ଫାଇଲତନ୍ତ୍ର ମୂଳସ୍ଥାନ" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unixରେ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ଅବ୍ୟବହାରିକ unix ପରିସର ସକେଟ ଠିକଣା ଏହି ତନ୍ତ୍ରରେ ସମର୍ଥିତ ନୁହଁ" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ଆକାର ବାହାର କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ଆକାର ବାହାର କରିବା ଅଥବା eject_with_operation କୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "ପ୍ରୟୋଗକୁ ଖୋଜିପାରିଲା ନାହିଁ" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "ପ୍ରୟୋଗକୁ ଆରମ୍ଭକରିବାରେ ତ୍ରୁଟି: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIଗୁଡ଼ିକ ସମର୍ଥିତ ନୁହଁ" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 ରେ ସଂସ୍ଥା ପରିବର୍ତ୍ତନ ସମର୍ଥିତ ନୁହଁ" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 ରେ ସଂସ୍ଥା ନିର୍ମାଣ ସମର୍ଥିତ ନୁହଁ" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "ସ୍ମୃତି ପରିସର ବାହାରେ" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "ଆଭ୍ଯନ୍ତରୀଣ ତୃଟି" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "ଅବୈଧ ଆଧାର ନାମ" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ଅନୁକ୍ରମ" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ସର୍ବାଧିକ ତଥ୍ୟ ଆରେ ସୀମା ପହଞ୍ଚିଗଲା" + +#~ msgid "do not hide entries" +#~ msgstr "ଭରଣଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ ନାହିଁ" + +#~ msgid "use a long listing format" +#~ msgstr "ଲମ୍ବା ତାଲିକାଭୁକ୍ତ ଶୈଳୀ ବ୍ୟବହାର କରନ୍ତୁ" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/pa.gmo b/po/pa.gmo new file mode 100644 index 0000000000000000000000000000000000000000..cd456793b1dd679aba841d312ade56d70b48208f GIT binary patch literal 61870 zcmd6w37lPJdH;`EtKx1?K>c?V_{x_?QP*>$=q0b#)hK#uP8978eg=F2_^p6{ z74QcEe-iLl0sj+xG3}p!i1&L1cme18gX_TtSOLEQ?hhVwXcWB$Tm{Yt>!8N{5O^5) z0JseNCb%!S-`prV7hC|o5_~s!IQSuO9{2??27d}30KOa|3>6&?YP?n8eqaqe61)<8 zJ@`rRwct;|qrp8pqUZ>4IjC_*!K1)!pvHR&Tm=3T*aaTU;A+1T)Oc?P#otH47~BO) zzCQ!SmrnQ?9SC-U%RyL3QeihDR27eXjt3X}f2x|NffEDml;A!B22r0dEgVNgv!NuTL zL5=_05Pt)B2B`7g1D*$dA>ctMNBSBCrKg?zCwadOo(%pccno;r!YEn+Ho*6Tp9W)a z6`iHeA@E@EYEXWA7btl@14@qXg!5m3dvX3km{q?6K=oS)s^2P5cIXFR3yy=**S(RYT$CoiJ_HmWCx-L2p!yAh@|*1-riwlVYTO@z z2Z7PC-v3|_Q%A>xx?csw&lRBPd?;N1eNf|l1C;%L0%GE5-f`#_JP%Ynje~0U*?@lu zp2YdDK|(n?=6H{j3qkSm4v!$J9VHJon;W&f{$>i72`p%Cq}gct#rg7W`A1akwCL0ltx_33Wk^T5M6zZ4YRkANEY+u;7-KZDZ$OAt=>I~IHexB`@& zF9IdUJ3-0013Vl2C-5O~$qIC$b5Q*Cz0vWV;9Smc0p+)!2Bn8zgRcV*J=62>Dp2QF zgQVu@AyDx(1xl{}10D_@#^5n{4k)?}Q2O~0DE&MF?gRcgDE@y2${(I{mh=B=Q2w$Q zl>SzMF?b26b~l2ecONJ{d>NFU{sL6{UxSB&uR?hF(}|$Q9RyK%^nP$L_#Lnd+ zD8Bna`SUwL@qHVpaXt;ozkUF!-~Q*gAD#g&xI` z<>*ZyArRdTir*iA>i0r|MgBGq)cC7F^}hrZy$^%00C#~0gI@w)0{##by+niqriq8rt{%-`20zU&vf4>4_@Q^pV{HKC1=KQVT-e5l{zQ({;f;&N6D|#H1 z-CuZ~^EnqJWTVxf?0*v|yFCPI{C@&p3LbR6`{&`{o}6C{O8!AG2Hy*6oR5K`|9S9b z;NO7CGd~B90bh23+x=8f*9Sqh-v+AxBq%5q6)1j=Sm*dA zQ2DR{${rsF)$XrB*?a$sz5n5$=$#41;3c5+c_VlL_)+jk@NrP>eg=xKecs~s>jEX; zTJS({D=7cI8GJeT1Sr4wI`}H^x$B*;13>xr1)%hBH7LFw1P=nA0@eO|p!oS0P~$%T ztv=pC;A=Qv2FBoqfbR-;7kF?)e1gYgL^$+tOno8_3hx%;4eVBM2Gcx zJ#rm*9OwINBxitUfro)V23Lc7)`)qq67Un?X`Da*ZLA5vl^~%MJqfDazMJqNa3gpP z_#IH=t?%a=_&HGLodaHnZwGJT{JY>NI6R1L!5@K}!3_}8`FFv0f@_C74}BBF#iBzm zK{oJ85K*GNU}_b38TeN4De_<7^+IDc1z@8tXo;L+gnn}WRHX`Fu* zTm|lRGqD720A<%NfOLsoaEq_QKMab`{{r6(Uid-Q_Tb0CdEkK`@_muzAg&zU2I~Gk zw=%baW8ksib8d5e91p&g^ACbAz~BBAls%sF5tpk9Uds7bLCLr5cik=zgXePoFCZkN zvvzpA{s_E`^K(Axe)Tm_@qhU3em)M$em?~J!Ts-WIj#X?&i@L$5d1H&7rfw3&vQ?K zqVxCQe&DHhxxUtc;^Tf${hoWb=aGv+>GiYVVc?7I@p*P3*u(inpzQV(D0?2Z6Q04r zfS&=SzgJFpJiQk@it{gnG58cuiKEEvmb-fnOuLCdQ{9$k*__BL_J~Rvvafz6LJl{E$z0z4sPScE1B01^4=-%QFu4 za{d@7e~NdxJ5OF2LC4}9LA1jWz4gPmaKS6t2uK#lh}_$KgQKzOMZecqr%5H(hUY z!P7Y12yOyD2Fgwce9P;$^Fir%G@L&QzMJ!JfqR1&{+YKQ1o!0pKJYs5ac~=W`nRbi zz;A*#fTQ1WKA-pJ&d)ONWn8};JOaE9TmpUyl)ioqqT;CIyW~{xmjRdlh0izd1LZ%5 z{H4e5MWF2TIq*R6;J@;GzXY7i`90v-;2(mr-vQtA`DXw;gY!E;`Q<-?tHGE5wbwy! z1-m(a5?l!$GUa>@fk$zEKPWv-fueiJ-?)6E;A=U55S#=4F(`lhC3re`+TS`~?*-4} z{FC5P@Fm}OeVh%R$@x3LHQ-mk6TpN2&g6DZ;6>mM!5(ng58Q8dg1wx-;)kB! zw}1`KzX!^n&iQ+flc&I=IY0GBUI%OiPvrdb;PK#df9!s{1YE}X22gbF2BoL{|H1FS z4cy52`$1j*H&Ak(`H$}B9{^*{e*%inm;IBsYk)U${&`S(IPWK(M?MD1j{gmw1RnTP zkJF1lT^|SMgLi`$fPVx^Kl6X)`Jp%9M?lHAsgF6J2G^E<h{iIQ08x&fge5?*aY}=TC5Sgliw%Yb4I=B^lAE=*wK~ib7D4d@FF5$S8W+;&gD=7>g4#p`pnM&pJR?| z`Fs$#ABTPp0q6P0XbYd8$LDu&92xFk5B^cOe&q=;Y|-cs_@I_U1T=wg-mxD>+{nK3~u0&v3klLqDYL z=xXjA%CV8-W{x`7l+*9v(9b_|{LDVFFU$R}@%c3zCv)_0t{6rhNHpxD>?4tvwmK|ab9R+7x?dJj^7R^@8{m( z9M^HYi{pH*znbIs!+pUX;qwc)-_7wA&JPXOUd{PA;q$%Vo*d8R7!KFI5Kz!h+re;t zEuWvqp`X9wcqPZ@IbO^0mmK=(;y9M$w$N@29OwKrju&wJ7U%nek8)Hw_UHUo@D`49 z`FsP%V|+f3<1&sKhkicF@i@n7?q9(1Ha>6S_)m_vbAC9uhGQ$A{~grNO?;lik^F4u z!@q@-_kq8|y`#XD;C|riz*{(u;P^1-pWyfa$2&NG6Ni5O!XbJP+{U$o!}+(s`5enQ z)^Pm~!LvB@v%?{JA$Sq@9tIEKIGWF^IFg^=4IgS;`y8JS2Co87(Dis;ZSc}cf2}93 z4tCdjYJ+|Aqqz$f^~TGWIi4Qy%z$SFTpe&N*ob>;{ne4JLsfk??3ml=h--~_us#x3 zVjrPflH` zSQ)5B?NT1uSk34*80LtMC9!pW7U}ob8`T1PHo}rvgI6SDwI^dj`sg^Rqp1WEEpB;d zF=V?t;%MH<=fw5lc;3ku9o}_uPpz*u(ufB}8zb?CYS1a;ZP*&mkLJglYa<)$qa$&B zs5&T3&x@AE8|w8<1C`-TG#-x6J!ge+3!}r;O3&7~x~0|_X+%pmG)82ncyzF~CGM#Y zRIoy$-o2@cDSLW`tBpq04cizU8mbSEFlK!akrA)4wJ}m1h?e&Ba541Za<}x<6D=L6 zk7CApZ#+;Ps1I+AhpU&2)`n?1Qjdp*>)ntx)omWGjZ~$s{>pG4{xY%=FQ{Bvsr6Sj z^rKnlB5n*-x~tLBp`rd-cV(mo6RU;H=l=Qt0S8KegnQ2@%+{WZJ`B{$?9x>!TNG}jgT zB+cgH&%N>K%Lnkaf!%3a?OD+__0w>Q_FJ#rNCs?5eE>(vJgB)tDFtM0g3!3&C~CR1 z+P}5rm1zS@N=ogW=4^IaNEXGG!*wF1;LP3CevjDNU~L4StzFh65Jf~WhU%~Yu}0$D zKp=TEk{OtnstuBlqA_VaR2e4o_S8p}4?G$zSe4k^4@J^j)dokZ$|5bBiTF@;c%ash zn>3Wo8e0c&(M=XDqBJr*I!KPG#;2cUscXgH(CEmT5qxjA3W@a0x4brF~pRZ_i z37t&FST#-%hza;S)ore zjxLWd5s9GBBAKw7wsb#<-`?T+K#rrtb;OAI2=j_$O=kl7j`q9!nzPN!bNfe`NM%ZT zSsGIu#B=60=H!}NUc>YrK3*wVP0`_V+}m*1JcosKQEE zb9At}g?R-}!N!$d6=}+r%+Hm6ruAB%SV@aEOrK7L$_h(RXzr2)+KeN>eXU0h+Fc(o zE{K3o0La4JCg98o+9Fftr_D~uG%pc$uS-`_RgF~o7PQk<%CssdriWQI8QikkOxAdt z3OqN7EUjEl*1#DtxD{no&@-~Id81r6QF&fhvl~iPWKs^{2P3uqerKV}V`(#SE7|%h zFqw!X9;tX{5UP`6)7{O|L)Bctis_E>FtEMjU!IV=!Vi)s|4c{^&~9Jt1jqU z5TBre_oVq*53ySv7$ODXa3PNH{`w$ZkD7>gD=ANHF|Wk=v>h!E%My!tQT8&oGp3d_ zr7*#gphuu>R!evz|CrHR_9vKfZHrW*<;Ff_l}I}dThc+Mu9Bp&rLE$)UL$Q)hO3J` zqsE6_GFl&55+ByD|N8V_WvJd*5-oQc|BG^e;K&M%WKs*+dedNi^B^pfw5V#a9@oRN zV)^he=aug6D%C&P1G|P9#FDDt-axq+W}~ot$lVkn-BgZma@iL$O>Ss~l)oGX9_(8j zM?P%Ai!M=@go{il#;M92OXx#eo83-psoc$;QPs?nF-&*4dwtarBP%g{B}UZu)^jcT zE0i%CMIcu>=k5PX-egMJlE?0Fcm+$m7|j6&Qv@L zhb9ed%2lYexR<-EN>8lSZ2_36T2ptza(S5ap6Z2?=?nKtW~Oqk)=UvSm61x0iR{Jz zB}=6*?@Pm!jm?yoUT2LK2Y)DOz0hPDpMfkD7UrKW2CWidu2mb+M>CvU8FwQN9+GS4Damj-Ht9ADC9a(TKYsprhg*DPOI8ywwYX}r2+ zB*#tCf~#KLWYtQ^o066TY<=}6n+PG9XfL8RkhfvdnoLw3ZZckO4bkLoSW?V%N2on-g9$vV|BC311Hbm~svA|AG!}3ANDq+3TWIV4XsN05W_-P-- zao;H0G@8&=sHV4Uf;8`W*MZ82r=X@ibG&(TMf5=JvX(yV^^;p$L7 z`$JY7O+*aVBh-D zK?U=?`K)TOEtjN>r1Ytzn+z)R!-j(|^Ft#IvdBDqxZcmMnPrvExR2$_+@4$;)&IRc zUU~S4QV|q ziax2Cb&c6%zci;X#M)G*VAqN~mpD6yY2NfkIjr)B)hw$W*XM_YC_f5scO7?W87d18xPr7VUueEWiBg5+xAXZ zGr4tswjVO@utSbK>gXlD%-X`PLVtBWdk&a=V`a$KD}joZ_jTW8&Y4w{f2{e)SM&vA zw%M%g6-Kf;SRd`%IGr+eyG2RKPpnVa%&<67B(-dl+PY*hqoO5Rp{Q#Xux!NJ#~3j^RMR$>JhY&L=}cI~o^qf};~v__Zm;gO@-=3R+GT8{`{RHxE^B{nt7T5-j{{Qj zcwKM*Xk%k5qSKoS5WDa~WN(W^0m-ECLaN5cb6e{_b1w(P^cY zkV$q@!z#vFaM_lp-d>txm6L9dYS#zFc6ZqAP~oThU|~P2Xy-=0sWxb%)7RLeoKx6D zVoo{Br9Ur zqK@o6Fxo#-(@q-8)JsNfyAmPHuV^Oka&z0}rS__7>S&X;JeM{tHgAh-@g~g*Yjxcp z9%M7NszTO6WJP%JdHNb^)3rRjOdl99sIR8ADSNy>0brNFiU^oD1$3FpyqT1d_DM6l zJqV5Gx$O3&Bi;0v-?BBz(CnD(j)MFqv}Pb@0;KaD7mLQf%Q5F2ci(KA!Ikrt)p3T#z`k)o6N;TJjQsZ|kRuw8)s=T(-0fg3xY%JM%eTNff`6A~$Lo z;pvaE8jr6IyN+C((7X~O zW|tEis?>&A3+S0Zr|)OlUV0N^ql4+g4$o%tf}(BGX~b%+%qSVPVv9uEv)#vPITJT& z&1A{5A>Y6CmeI;;?}$DBX0ys43Wm%hVph*=813cZSG1CK7+cM@8CaT5&#LrOiSy8u zKAL5`oYOK(6Rn=SMp+YP@C{JGzennusytblH@9cL2AlQ}xcxrm$F*6{!xprMD)n*7ix!swYzk$cQ*)Ed+09a>?IH-lX4fcud=ZFbiRA> ztrYW0#>+9ns~1+vrwcG{n}hN|f~6E@$~Dg3YY_`W!?jCojoQ!C10|LX(vm%2bD3NA z}g<0q_{-lY9*o_e5cNrfR8j<}?j&uFUXvsXvNqYs&*KhOJS!Vh<%u1wQ#CFThN1qhXlQ^c0$nm}pf`{?V-X&pmkI)vFUbk_StL z$9Zleq9J(-VUo{A?4;a#Tv`EW#;|9IdSKC&kkVtEcFCdQjw4!7^|T>sB|a?``Zh36 zb9tDVd*HPsT?6JHV<(eWHs7Jfd^a=kEXoW|=JcqAqF3)&HGhh_c_R+Uw5(|HG%iod zibm^xSoO{KWHLUbvwAS>+43kVllbioyUl5{}R)_ zr$<~USXDhUHyy8y5=OUYN?{Udvt!zN)tVLOL!4JZZ09Fls_mUgwLzhjm(2n7KJHnW2s zVS4fnZ{TT7Q&g^61b)_p9rVoW*s;}YlU51QnvM0%dV?|6c3F6;((tRrEB;;}%#`Ne zHTBV9(r0kNCik_ST`iAl`bw9Aft?tA4{u$sM_JJtZ_#?89U3$lF#k-eEbiLu=?N<( zX0}F@za(l|)m*+M&6U#mT2}G6dzkGKPYVThe7^le#YQ0ubtZdWqMCFdRcnc<4tiKq zBdv{^-IZr45qK!$L(zndZhz*t9_=G*m{BXC6q<81?aqlC-Fmam`s#wIK+9U~6)?O%7b2r-&}2!PL~P1;i3z=7m`T?UK59OP-v8_S*ga> z#HDuj&MDPng-xy4&77{K@fCIi@OG7lQ8s#$KIUmNHCN2A&cSI@rfo-HYnd*Ns#gyC zNdn1R3Y-1J4WxLO%jgb(&~)qA^wFXnICBWLFM!rR04%J%vpstNo}YeCt|7k7G$Pfd`2 zri4f-XC?=xW!mmXo9%S>jqYYNHdksRL$w}=*oJ(rNmAf4lD*?rmO8oLX>T;?Zn`&@ z=hhY(lm^svymO@rO+wPbUWD;&OgicjnKV$4+Fw&FHYGGk!+I|!rIEcWku;^&8>v&N zSsL`026=xv?GQZMW)#v+u~w31^@vZ8&usGo%hw6-VJ0-H(k`2Ry!3*g)p%f*Zc0m= zbM5_!=*_mG(q@ANP2n+Xy0U8ENjxmFwG|!M@G-SE-8s^7wW1|jf3-5WK=j*a-rHZN zlJxa@yM2<@=iw=`kRl<-h#`8oSRb_DIgf3;zChfjmTU_mx@gtvwJTPgy}K^TykTD&?^j<}6}u9k{N$Szq#;Cscp46N~cI5p=_Ag?zR- z37%O9TFG9nbSzAJUF!1tdl|~5)l$qx9xTI^YVbUQ7TOIJyCasmsIR=xJ=^31-m`# z`a9!wD>+6v&YhnQq}PG<6&}2}8fD8vpL|jFx-FMunk%yP1`5rd4(Yvhdm$h9*&L;E zkga`tjVtB%ctmri{fw`BHof1*CXTa3OsWo8(xZniwz z%ifmA;+1SZrEbQz#O5uWpI#4p`svQRvUU1x1S_$kW~n1h5w$J&A&+zVC`Qp2fu}|K zy4B)%-B20aeF0-wsheu9c;IS zjUSq~&4F?e8un+FeLNM@LaC*sdY-fIy6Tu8tT5~-@>@CCtjM;&)u6rTEq2-i~t z(kW4qysoBaVE&RfPm(UJAwmCEW`rtl()Tb;gs;@Fx07=UrX2qQpnqK_43TnJ_A<7N z_01|Kwc_Lxu9HAnAM&*z%jN{#5MqX}eDDpMC}l#6dwsRgHY8-6j3*jRd+RQnczE*- zwJ3L1;=(sa!h9d5wTPOVuiCOeL8Ywhql~_XY%-gvKAAUA*-{%A9f*18oC?g_W8o#m z>HAb#*(G6>&UCzCKTw|ho6g}9hEmcW`R1*`Y@KkjXkq8Vg`_x5n!ab437}^ZC|XQ3 zv_G%=(P*|9a20Vy-?X7XWr$>dDAhlAz1a3`$!xbjyZ+%892JkxzDB$*x|ID9RMcu#pZT`3P19+;WjD)XQ5uIK zNaO{+V}ucLOuSc5nY?UMsoCX|Pcu8M9r}GH;`qpgixze*JgV!+W8+1O79V|l z*TSP0E~H`CIb;e2bgA8<*T)NwU%cq}!xtWN)WSVh@)ek_wWNp!JAZn|WNEx6UfR#w z2Paf2z#H`S+{S`N?}EYV$VoIG>>K4B@vgPJ?6f#uJv#Wd%7)qzt1E`_37dMVUA0BW z4|es`yWhacg8FdZNqgwQT_)tB1q=5$#WQ!8Hdz+iKHd>*J=XX}h{BWyWGC7q=B%AK zB+Yd#4`29S93Q`-HnPY0U8n0&sVCdR+~0K?Q$8CfgF|-OIPplH zrr5_5=MBcMJuzN1e~)P1)Wj`Q6Aw>K+!aqvTst-S(A30DQpZU9Y>tJq-yn7-?&MN%bJIh*QEsV0k(PPS{W;~JM`A)bgC_SH zDFz~&gh-K>aOc6P$!!*_==vVcZH%djk4;JW6KKPH=TYw5ZhX-mcb?!JuYwegB`x5$ zWF-P_+>E34A&P0nxct9^!MKdkkPYR?T3kj%$k14PPV<|nG)`+lkR4%jA|NUQlcA(R zPNXUud6LvLW=ahTKt{xZCHU7R)a`e~*#fGhor@#8=whiWLn>z(AC|mqmxmicwsv&MxIQTIA~h!7 zK@K|dP)lA$r(^CSKf6V~WV$OD#l?TXbbAdfX3Ze!k*Vy<#6?RgVdR6 zi4#0ADH<)4;iF0q1-_Cm*FmBs3!UHzV;7aYq>CBXirJe;(!F@{}JL@Dvre@+LsVHhZJX+5Z z&1SH|1QS9Lj-XYntihpNJy$wJSN zQy+({3?1}EZh=+iNans<7?}y8u*3=l2bWvauFxa#(EE1pjZg^jm`^83RcNy*X)T)% zFq$b#R&iwY7_r%rzpFY+MPPpc*V`w2(vD@&)85(BNd2>}c~6j7uN1 zrX1sws`T6_zU)on$YcskJ%eGP5<>%^tsI}x5M?HsXR|jmMK%ywNSuPI!H@izN&IZ71UH=5m#9A7OFxD|8cXj zSGkfqEN4_{64;8gNE=X7lRKv-@8@FBb%7=!0|)T;I1LhSGY`QH@Ysip#PLtNcOqHX z`|gEwVJ{`%Cq6dYQ~A8 zS6ano$3$GAfYQ8*uoLuvB*dN;r-d;~3DRnaa1BCF(j4s~79+^|*)n{)nH=-^*br4B zD2PqGVomOZ)JhlSIsFTPU(7iLPlgE%Nb+C|Z4Lrl(}G3(b%M~t>$qNE!K<#1gkNQ2 zzE0ND!ag$1BMkOHUC3uy&lDwBH}mFv99`2hEUsb1)v8L(_Z_ZtdF(uw(K*jlY-0wu zVL*geG&63S`O=c5tf>V)j;8#!%bcI=DPEx-Mj#nb!;7%&+ga@Lt!#Sje8n|P&JO=p7TT$o|aka!e4xIKr5_* z=vmlgxe6=dT@n{DFrk9Pa;QFVl`J+9nd4#(hJzbe;bv+5CUs$v<@yB#GP-gA{-S6s z=rL!&3Hh+;HBDaG7Dq_o^bL$;ETaRsLI=$sjXqu>5bB zg|4Q_YX_d-1?+E_og@VXwfqnB@vJzOA|{k7q{pz0=`L?kEKQD=8IZo zwZL0WG4dbPckw*Sq2zx{?x}v0U#@6uDXVG;VDl)>DBtpwE0cuhmY7JF?f-Vj`aHcUP7=L(EqV?(W2d zIS+)4=ir?<%5E;2yig0CqpSkGYz5`~X4N3_cwJdo!ThgSL@6?n{UKA#Rn1pZ1#_f| zQ+e*cUfQHno#*!yUx~%c5wNNysE~80#fUvZM<3{trK}JwxM1_u8`Bexrik-&L1)i$ zUX@K2sx&4tsyK`?7M|Q729eCr;}-c^Vj;YbzEd@jtv`2z;C-ev1SxKE>;?tK#|7!2 z(ks(L+Z6Ph=bm0qjatyMIB0L&=o$2#+n_gs;t~wz5uk+*CnzF3oMigTo(^-9No!`y zVpe)%2s5sTxsNH$?=~?UnLe5*(`lwP12G$+(bPo26EG^i#Q!j%C8f_!NaRAoqxfP5 zLkZ267tI`(^x?%iRzpsRKTa$d8HuhHB_|9(Ah#6^&Loy#8YWC&Sc@_Hq>0E^X1i&I zf)>(;3vG$$>n$Y;ezOgX~;|)zmH3+Ev0tT-s6)_b@jOATa$$%~`dvRYvD0fkc}^%$8NqY=T8p{Qk}m1;rldtUwR1 zf6^>Q&BU~XqB&)F;vhVnVfO@ToX=#30!@lH#Dt5nWP044Xecp=Ibn*~A0|Q(%y}Dg zXR$sy@=#Swg|f%%VB&(p5O)mXrfXmuMK4FXnV5^Tfse=2o^B^wwYtR)MiUa0Dm5`Q_3%~dr^}_pj`kVJc6k3n#rzZ8K1mbBdTEqwU zWX1WEQo677^F`mJKcBMNh!J!BJAM6;c;@7_QI^|!6=xRvQ_-~fbMa7Lp>NHDC-%IFdLMiu)+)HDG zDKR%h%3@(@-kQrm!JqXJG#F2FwI>1@#X{*(6Nc+v1%}vk1zu;NHD=~S$|Q3HKS-jD zJIbBtu1&@wEuEyf8JJ3cnLLyq2_^farhJSR5~4X{NozC+TUg~0=*Nh3MPV8`5!>70 zf<@x3)e85dahroCv|F6&le7VOXg`?HHigOS@wYtrW}Xn)FSa+;x@K7Z72k)-eODv1 z6@KYjq*Hi=)LJhX9b;XC1a#vBc5g~}ZPts1Wi_VKmb@oNa5fv+@X`~!Je&xrpicLh zP5ClAEzn`u*qpXVZ>B~9ir+b)Um;WSjOpA4tf#uejj#2I z2aMOjQVn3cNK zjHN_L(#831cVkW0rA4#JDzlCyW+SV}eyE=nJfXxE1NU@}y|5pbm_%eqzoa|%R4)b%`YtWE8B6S-f<(KPRrLo~>`x~ za-E>cXZ;-(J{Dwck`G-jsA&0VTal6&FAzOuetcwynTZT3Pvn#vEWBC0)9S%UCXyiv zS=Kd}WhU1E<;1mgZZRKZoYE#JhNjMqDi(?)#<|IB`TUE$jDwp5lVpX4bIj0+8}3RX z2;fIzr=3C6es|=K-^18SkS{k2!wf7TQ&0wqa>U7Hdu~qfl}y=!-!xkQOb1M;x_z|9Jz6x zHM9ORAjzN8nUQ3!nn;rnj#02N#$m-N*DQpfJFR90?u4+Wsr!^RKt5{fEv7Lp2Pe#| zi9g`%zK|ZbJmJd|87C}tvtlwT`9W|Vxs6S143OCk_rY#g75Ze!nx^eG@P%N;GM|vs zUvQJCfleuKny1AAH^>eZ#FsD5K^Av>n6x0_| z3LWSxQ$=|#lDaHKDk@DdDNR#XQ7U<%lA4mOILQ9h(50{%{+=3Iyv24i& z>HBFfPHid;IT98!nWlLT0@2#_q2H8jpP`5FO5bG#(U6-S|5m9Kioz(blRV|=gbG~E zqUq@`i=aOD9PKUcN=*uLb{>LHvs~tIS$@+AgUhlG%P#ABB{LBx#Py^y>ksKT_)+@K~v z`A-=$Xr$m?R?6FxAa@v3eaN-QB0t#;XAZjaUvO09dupPU-2(IF=F|Bvh*ywedfQw% zYc53;;CE2q!+2RJy60xnTNFHd~FLsT_m@>$vF8RWvR@3U@^?ZIsJtjnG#JK zaQI}L6lMha8*QCNv73}_*4Oe2Br9zHPn**&X^KZ8oLm-(Nvot8DyNziGn?f(gb?D&2=tB0*P{1?Ka6Gfk3q>x4FSf zS)(0~DUvh-#HyyiM_Lv!(48@GCq6=VmV$R;$+Yqy8*0xtD;YWACh2L~{EGjC)~(YR#1@YmlG?(hdlz?PQ+n!%sdQBAjHz8QgB$yBD|j5&)FO!iQy z5J(c^mMUP3G^0BCnx^}y7;c9*p*gKQyJ(vcCkd9|a`ww7vS^9&%XFy2fxoQcgKKYv zp0>0QccLDAMh_iq0UFvAw3WS!Lo51tzCrxJgG-ZR!^lcb8aHv5;&M}eXvFIdS_ikI zcJo3Fd7U-bRRvez%dI?~{B|nZ!V}C%E?bG|`~j1UtB>1l6N9e0W_gQOB z6w|te|Cu9&N9eGTE4>p2rY5%Ah%9@@WFr-9KB5}aC)77?SuQo>AYs2a^=dVaFX@X) zO@9X)ltPU7C+Ab%ukdZD$Juy7hB04xW#&n(lZoAuenCLg!mKJoG$GcKL{n4Saw1n$ zO3xTc^k*&uJ$3NAF%oA>rD@4PCT6m@w8BhICn<8vTGa#3OLYq*&+j>eh1%l`;wO#myCWTVJ zeM)3}C`0TKd+^H#<*(f1>+rUrGF7K@5AiWenm+aIi0ASeA-BT9N|}i>GbL0*rV3ju zjAh9rd|i{w>je+l~jpbPn@bA+JA}Ih&Du zCZU-+%b8jxxT!MG%;pHk5*-g#2S^IZ(A3mC}?ZmOPi{| zVA=`uHJAOnuASksvyuGL9l4mYRGR2iU_mUj=B}LP6F#YM57wkkuHhiWN0?QEaAbN^ zA4p1%zSeHTMf8hBHKyt&)0IAO9`uqLj)7#^qJx@m$yPk5_v!)8BtKfl-{}+1%Vba! z#Q`zTRIh|*UDAyS#y0<#Zp~JpaJ}o*Ux0`4l$>+};liR2q3JRP%hA+C^DdA;5Dy-;3|S$Wy4o#R z(J~UEEWJ6yi5DW_JwlyitZ)MLasLaaZXdIv*btgxEE5tS8aMyJ+~ zAs8{gg3oi2q(6Iy8QSPWlT>6T8(nFX?J=7Z7T|y$1A8{ zuGYyE`VTNnA^O8x1*v22vH&Iou8*3xgg~JUL@@^LEMIPJe1&9I?*s+YkI=ysnvyvw zC@5=9LK$n3_#*4akeyJ~QK zg&731N?$6V0Mt7oi7neqE^5M}=u&l=Cs z-#wjUEUM}nLrI)uwL2l4*$cBMCnV*JZ1ixf9j0bOlp@||TO0#_LA9FW&jUG;XhKFAl(a2XNzi%8-wU75^|Uyfww-2_jYP5(utg%5nYU&C zT^3P0`Gn%&F?mQ}X$1yCbvtI}OY|Eh(W;aSN3CZmvLy15?0rS1NR;xeKQv1XI`4?xy2OE3)G&?^s&f2qfLn4vE|UW%5R+0=u8=DJ z!Exiy1C(5)Nw-NtEy%Mw!-iyuFzFD8RGd;#QIVwkun8yDv%xtrukmAV$3#8Rg%Fos*-e@ z=3}JoNl7y%ud>*(%^rnK&sgOq`={5YS;6BIX$C(}V7tDv0@ zJfIFeu^~qy8D7aO&Q;~7taxxMC~U0dB*p&?HU-H)NG02B0JJ<27yf39{Y|I!`fJVh zeaONzU6v(?4YyGuw1C%o0{`1+S2iF(qjdGiuAKV6%|!(K$1PCkQF! zChLHc$Tw#7i176mZwEU{F;Kv@yJ8J8=p2HGAsu9?*P=){ zQA4>U>8Wt!d{;8G7Gtd6iDB|8|EqC%{pF*fWCeUkpd@w-Jwbp^*zi|HreEqb7}4J- zW1vET$hqY}8=gdgbKoZ9CjX;!h9gD@0k7|ugc*t<-H%|-I+(TW^H}p|t=UWHW@DA2 zWD7Y!A&bH{vOq&lluU=#OgiKm979040M#VV7Q)gOzX=bMP@e4oh!SQCeu$`CRblS6 zFb0GT_XGry2@2zDAW3fn=f{_mh#9HfA7ISHOqN{f2LF$ntKcBJAmO{1vLUgk_(a)C zoB9$oA9V!=;T%q<6^E@E#0{>Y>+Ul6o8qS6cdioo862aQae!y2x108*84n-)Ectz% zY0L&Ur%lLYS=!_iN=VjF_M+8AN@j}oI~OciaB;MbZY+lg4R-{2NiagTx16P)Xx%As z)4zA0GL0aG=*pZaTDMz6#of`mKDfyonk0cVWDhySE;IoU?OE(uYx#)+#}%ee=_aoF z_|0;+#EFbFS}SA=1|>f6SZ$@j4pvfsP5?$DxU}#j86hmg(wPwR#z`bc{8iC;G|K9R zLSHvOv>>8Hhp3Daj3GJ049BN1vC+f#J$G^qT7(sDqqR=_H2zv7q;LWGnQJr2fyxz% zIP?QQ?v2i?cq21P*`7|&!cG_5EkibdBsZB8nM~-eq!V1bwU^Ka|IuD+;E9ZFu4xRG zNSQlW&QhRbH*H(sx6Cc&7HKvgdy9*2T6%Z-h*Abp{dNQToswRiBL_UJmG~t4e&tufZuFl z3xvmXJ{jn7TY)PgT2H<*=OYr(QE(loxf#8BQOE=n;LoV|CcCdz+_}cQ4MF5Dm?m<* z>_ncsU2fuDq#>rIYa9TQGM54rz!jjQYw03fXD9>}XgYf46bTuWO>Bgb5er3+WqD#c z8}=YD)0YfqtfDAMO$UsqX!BGZWI;zF%v~8W$m4lbu@!>YXocA`M6;<(#F&D2Sc zJJ&FVT$va|p?8EJCr0v8q})K@nkd*HC1`(X9ui_xQaAg{^W4T1cUuc)TU1rtvEjai zN~iiU8zg9yDFkboZA+0}mdqyyG@&G(AFw!DR1$%~V}5tc@QAS?DVmUI#dDb$l3cC)BN6!PoyN!(sU~Fr;JKs z*p4eYxE|^NIL0CUxu;c&f*<%+YHLm-_~+%8ipF`7L`f*b*Kr=bRTo=b5hjSy4AE#w7E{c4ktH=f0naeiG(W8$%hhV8XdEw zGa-%=ie{f+`Q33PNaU2{e_gcB%<)8n(6Fn!nR!?X-PZxS!Z1^<=}_t z9~K{%Gqmb4n_)4r^e>w?Cwy@WRv7qx>X&kXjmT17Os||enhg-#teKd;_Pq`|bTsKj zG-O4$>a>X?o;Sx*{~T!|NCl5+(w~-t%Y#^-Km!tqKlqjPn`oTZp5qiyn(@=FJ(d4%9~nM_NfUZNS-vAqw>EozgHJqk}d~ z3!SwyN>Fuf?wb>cN=c~}!?oSjqbrb5!8@5{_+P0G*FmA#Jclsn3ZFr$4=>>(D z#^e?xMSL=|f?66s*an>{XF>v7!Yne;mQGhei+SH2N%aR5$He1=re~iTNk&Y#(9+@s zVlC2Num^2OSj?CY*f1(w&5jb#m7`gQPtL%!NtQ8TmH5%y04Nz&webgEHy9Jzx|NCo zSuqrS6@!hm;bBUff|^KFK_IQ20c>#E4$)$RS`Kku|{=wtkUs+N*}4 z)Mu2(r9>M7D{hkjBBDKn78-*&O+c<<)2|57M^^HyL^$U(6z7nE@>n9atY2_ruPhXE z+=18exb>fK#LL5mB2zG7ph?Blp-6EG5JE#TgE1ivI1e_Cj2--3#^Mg_qf6MQ32*wW z>+lB69Ay@s=OyvTzQgsHJ%mVX0VJ6*6TYRLfcZX%TOB32=gWsPb3nmZGR}#uAe`IP zg$d=OGzP))w7$#ehWbx#W#R3aEm>4|G9>1fbKqW20!%v3#=eP90tJnw`e^P}tD8)5lwE12{;K3r0|fPDp`O, 2004. +# ASB , 2004, 2005, 2006, 2007. +# Amanpreet Singh Alam , 2008. +# A S Alam , 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-19 08:18+0530\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi/Panjabi \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "ਐਲੀਮੈਂਟ '%2$s' ਲਈ ਗਲਤ ਗੁਣ '%1$s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ਐਲੀਮੈਂਟ '%2$s' ਲਈ '%1$s' ਗੁਣ ਨਹੀਂ ਲੱਭਿਆ" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ਗਲਤ ਟੈਗ '%s', ਟੈਗ '%s' ਲੋੜੀਦਾ ਸੀ" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' ਵਿੱਚ '%1$s' ਟੈਗ" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "ਡਾਟਾ ਡਾਇਰੈਕਟਰੀਆਂ ਵਿੱਚ ਕੋਈ ਢੁੱਕਵੀਂ ਬੁੱਕਮਾਰਕ ਫਾਇਲ ਨਹੀਂ ਲੱਭੀ" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' ਲਈ ਇੱਕ ਬੁੱਕਮਾਰਕ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' ਲਈ ਕੋਈ ਬੁੱਕਮਾਰਕ ਨਹੀਂ ਲੱਭਾ" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' ਲਈ ਬੁੱਕਮਾਰਕ ਵਿੱਚ ਕੋਈ MIME ਕਿਸਮ ਪਰਿਭਾਸ਼ਿਤ ਨਹੀਂ ਹੈ" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' ਲਈ ਬੁੱਕਮਾਰਕ ਕੋਈ ਪ੍ਰਾਈਵੇਟ ਫਲੈਗ ਨਹੀਂ ਦੱਸਿਆ ਗਿਆ" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' ਲਈ ਬੁੱਕਮਾਰਕ ਵਿੱਚ ਕੋਈ ਗਰੁੱਪ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "ਕਿਸੇ ਕਾਰਜ ਨੇ '%2$s' ਲਈ '%1$s' ਨਾਂ ਨਾਲ ਕੋਈ ਬੁੱਕਮਾਰਕ ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec ਲਾਈਨ '%s' ਨੂੰ URI '%s' ਨਾਲ ਫੈਲਾਉਣ ਲਈ ਫੇਲ੍ਹ ਹੋਇਆ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ਕਰੈਕਟਰ ਸਮੂਹ %s ਤੋਂ %s ਵਿੱਚ ਬਦਲਣ ਇਸ ਵੇਲੇ ਸੰਭਵ ਨਹੀਂ" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' ਤੋੱ '%s' ਵਿੱਚ ਬਦਲਣ ਵਾਲਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "ਬਦਲਣ ਲਈ ਦਿੱਤੀ ਸਤਰ ਵਿੱਚ ਬਾਇਟ ਦਾ ਸਰੂਪ ਠੀਕ ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "ਤਬਦੀਲੀ ਦੌਰਾਨ ਗਲਤੀ %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "ਸਤਰ ਦੇ ਅਖੀਰ ਤੇ ਅੱਖਰਾਂ ਦਾ ਸਰੂਪ ਅਧੂਰਾ ਹੈ" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ਕੋਡ ਸਮੂਹ %s ਤੋਂ %s ਵਿੱਚ ਤਬਦੀਲੀ ਸੰਭਵ ਨਹੀਂ" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"file\" ਸਕੀਮ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਸਲ URI ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ਲੋਕਲ ਫਾਇਲ URI %s ਵਿੱਚ ਇਹ ਨਿਸ਼ਾਨ # ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' ਦੇ ਹੋਸਟ ਦਾ ਨਾਂ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' ਕੋਲ ਗਲਤ ਅੱਖਰ ਹਨ" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ਮਾਰਗ-ਨਾਂ %s ਇਕ ਅਸਲੀ (absolute) ਮਾਰਗ ਨਹੀਂ ਹੈ" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "ਗਲਤ ਹੋਸਟ-ਨਾਂ" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "ਡਾਇਰੈਕਟਰੀ '%s' ਖੋਲ੍ਹਣ ਲਈ ਗਲਤੀ: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ਫਾਇਲ \"%2$s\" ਖੋਲ੍ਹਣ ਲਈ %1$lu ਬਾਈਟ ਨਹੀਂ ਦਿੱਤੇ ਜਾ ਸਕੇ" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਪੜ੍ਹਨ 'ਚ ਗਲਤੀ: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ਫਾਇਲ \"%s\" ਬਹੁਤ ਵੱਡੀ ਹੈ" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ਫਾਇਲ '%s' ਤੋਂ ਪੜ੍ਹਨ 'ਚ ਅਸਫ਼ਲ: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਖੋਲ੍ਹ 'ਚ ਗਲਤੀ %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ਫਾਇਲ '%s' ਦੀਆਂ ਵਿਸ਼ੇਸਤਾ ਖੋਲ੍ਹਣ 'ਚ ਫੇਲ੍ਹ: fstat() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ਫਾਇਲ '%s' ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ਫਾਇਲ '%s' ਦਾ ਨਾਂ '%s' ਬਦਲਣ 'ਚ ਅਸਫ਼ਲ: g_rename() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ਫਾਇਲ %s' ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਖੋਲ੍ਹਣ ਵਾਸਤੇ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ: fwrite() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ: fflush() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ: fsync() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਬੰਦ ਕਰਨ 'ਚ ਫੇਲ੍ਹ: fclose() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ਮੌਜੂਦਾ ਫਾਇਲ '%s' ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: g_unlink() ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ਟੈਪਲੇਟ '%s' ਸਹੀਂ ਨਹੀਂ ਹੈ, ਇਸ ਕੋਲ '%s' ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ਟੈਂਪਲੇਟ '%s' XXXXXX ਨਹੀਂ ਰੱਖਦਾ ਹੈ" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "ਸਿੰਬੋਲਿਕ ਲਿੰਕ '%s' ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "ਸਿੰਬੋਲਿਕ ਲਿੰਕ ਮੱਦਦ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹਨ" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' ਤੋਂ '%s' ਬਦਲਣ ਵਾਲਾ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ਵਿੱਚ ਰਾਅ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "ਕੁਝ ਅਣ-ਬਦਲਿਆ ਡਾਟਾ ਬਫਰ ਵਿੱਚ ਪਿਆ ਹੈ" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "ਇਕ ਅੱਧ ਪਚਦੇ ਅੱਖਰ ਉੱਤੇ ਚੈਨਲ ਬੰਦ ਹੋ ਗਿਆ" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end ਵਿੱਚ ਰਾਅ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ਫਾਇਲ '%s': ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ਫਾਇਲ '%s' ਮਿਲਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ: mmap() ਫੇਲ੍ਹ ਹੋਇਆ: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "ਲਾਈਨ %d ਅੱਖਰ %d ਉੱਤੇ ਗਲਤੀ:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ਨਾਂ ਵਿੱਚ ਗਲਤ UTF-8 ਇੰਕੋਡ ਟੈਕਸਟ - ਵੈਧ '%s' ਨਹੀਂ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ਢੁੱਕਵਾਂ ਨਾਂ ਨਹੀਂ" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ਢੁੱਕਵਾਂ ਨਾਂ ਨਹੀਂ ਹੈ: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "ਲਾਈਨ %d ਉੱਤੇ ਗਲਤੀ: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +" '%-.*s' ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ, ਜੋ ਕਿ ਅੱਖਰ ਵਿੱਚ ਨੰਬਰ ਹੋਣ ਚਾਹੀਦਾ ਹੈ ਵੇਖੋ (ê ਉਦਾਹਰਨ " +"ਲਈ) - ਅੱਖਰ ਬਹੁਤ ਲੰਮਾ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"ਅੱਖਰੀ ਰੈਫਰੈਂਸ ਸੈਮੀਕਾਲਨ ਨਾਲ ਖਤਮ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੋ ਕਿ ਤੁਸੀ ਇੱਕ ਐਪਰਸੈਨਡ ਅੱਖਰ ਬਿਨਾਂ ਐਂਟਟੀ ਸ਼ੁਰੂ ਕੀਤੇ " +"ਹੀ ਵਰਤ ਰਹੇ ਹੋ, ਐਪਰਸੈਨਡ ਇੰਝ & ਛੱਡੋ" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ਅੱਖਰ ਰੈਫਰੈਂਸ '%-.*s' ਇਕ ਚੁਣੇ ਅੱਖਰ ਨੂੰ ਇਨਕੋਡ ਨਹੀਂ ਕਰ ਸਕਦਾ" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "ਖਾਲੀ ਐਂਟਟੀ '&;' ਵੇਖੋ; ਵੈਧ ਐਂਟਟੀਆਂ ਹਨ : & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ਐਂਟਟੀ ਨਾਂ '%-.*s' ਪਤਾ ਨਹੀਂ ਹੈ" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"ਐਂਟਟੀ ਸੈਮੀਕਾਲਨ ਨਾਲ ਖਤਮ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੋ ਸਕਦਾ ਕਿ ਤੁਸੀਂ ਇੱਕ ਐਪਰਸੈਨਡ ਅੱਖਰ ਬਿਨਾਂ ਐਂਟਟੀ ਸ਼ੁਰੂ ਕੀਤੇ " +"ਹੀ ਵਰਤ ਰਹੇ ਹੋ, ਐਪਰਸੈਨਡ ਇਸਤਰਾਂ & ਛੱਡੋ" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ਦਸਤਾਵੇਜ਼ ਇਕ ਐਲੀਮੈਂਟ (ਜਿਵੇਂ ਕਿ ) ਨਾਲ ਸ਼ੁਰੂ ਹੋਣਾ ਜਰੂਰੀ ਹੈ" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"ਇਹ '%s' ਜਾਇਜ ਅੱਖਰ ਨਹੀਂ ਹੈ ਜੋ ਕਿ '<' ਅੱਖਰ ਤੋਂ ਮਗਰ ਹੈ, ਇਹ ਕਿਸੇ ਐਲੀਮਿੰਟ ਦੇ ਨਾਂ ਨਾਲ ਆਰੰਭ ਨਹੀਂ " +"ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ '%s', ਇਹ '>' ਅੱਖਰ ਦੀ ਉਮੀਦ ਖਾਲੀ-ਐਲੀਮਿੰਟ ਟੈਗ '%s' ਬੰਦ ਕਰਨ ਲਈ ਸੀ" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ %1$s ਹੈ, ਐਲੀਮਿੰਟ %3$s ਦੇ ਇਸ ਵਿਸ਼ੇਸਤਾ ਨਾਂ %2$s ਮਗਰੋਂ = ਲੋੜੀਦਾ ਸੀ" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ '%s' ਹੈ, ਇਕ ਅੱਖਰ '>'ਜਾਂ '/' ਨਿਸ਼ਚਿਤ ਅੱਖਰ ਹੈ ਤਾਂ ਕਿ ਹਿੱਸੇ ਦੇ ਸ਼ੁਰੂ ਕੀਤੇ ਟੈਗ ਨੂੰ " +"ਖਤਮ ਕੀਤੀ ਜਾ ਸਕੇ '%s', ਜਾਂ ਚੁਣਿਆ ਪ੍ਰਤੀਕ, ਜਿਸ ਲ਼ਈ ਤੁਸੀ ਗਲਤ ਨਾਂ ਭਰਿਆ ਹੈ।" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ '%1$s', ਬਰਾਬਰ ਦੇ ਨਿਸ਼ਾਨ ਮਗਰੋਂ ਇਕ ਖੁੱਲਾ ਹਵਾਲਾ ਨਿਸ਼ਾਨ ਜ਼ਰੂਰੀ ਹੈ, ਜਦੋਂ ਕਿ ਤੁਸੀਂ " +"ਇੱਕ ਐਲੀਮਿੰਟ '%3$s' ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ '%2$s' ਲਈ ਮੁੱਲ ਦੇ ਰਹੇ ਹੋ।" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "ਇਹ '%s' ਅੱਖਰ '%s' ਐਲੀਮਿੰਟ ਨਾਂ ਮਗਰੋਂ ਜਾਇਜ ਨਹੀਂ ਹੈ ; ਸਿਰਫ '>' ਅੱਖਰ ਹੀ ਮਨਜ਼ੂਰ ਹੈ" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ਇਹ ਐਲੀਮਿੰਟ '%s' ਬੰਦ ਸੀ, ਕੋਈ ਐਲੀਮਿੰਟ ਖੁੱਲ੍ਹਾ ਨਹੀਂ ਹੈ" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ਇਹ ਐਲੀਮਿੰਟ '%s' ਬੰਦ ਸੀ, ਪਰ ਅਜੇ '%s' ਐਲੀਮਿੰਟ ਖੁੱਲਾ ਹੈ" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "ਦਸਤਾਵੇਜ਼ ਖਾਲੀ ਹੈ ਜਾਂ ਕੇਵਲ ਖਾਲੀ ਥਾਂ ਹੀ ਰੱਖਦਾ ਹੈ" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਇਕ ਖੁੱਲੀ ਬਰੈਕਟ '<' ਪਾਉਣ ਮਗਰੋਂ" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਜਦੋਂ ਕਿ-ਇਹ '%s' ਆਖਰੀ ਐਲੀਮਿੰਟ ਖੁੱਲਾ ਹੈ" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਇਕ ਬੰਦ ਬਰੈਕਟ <%s/> ਜੋ ਕਿ ਪੱਟੀ ਨੂੰ ਬੰਦ ਕਰਦੀ ਹੈ, ਦੀ ਉਮੀਦ ਸੀ" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "ਇਕ ਐਲੀਮਿੰਟ ਦੇ ਨਾਂ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ਇਕ ਗੁਣ ਦੇ ਨਾਂ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ਇਕ ਐਲੀਮਿੰਟ-ਖੋਲ੍ਹਣ ਟੈਗ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ਇਕ ਗੁਣ ਦੇ ਨਾਂ ਤੋਂ ਪਹਿਲਾਂ ਬਰਾਬਰ ਦੇ ਨਿਸ਼ਾਨ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਗੁਣ ਦਾ ਕੋਈ ਮੁੱਲ " +"ਨਹੀਂ ਹੈ" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ਇਕ ਗੁਣ ਦੇ ਮੁੱਲ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ਇਕ ਐਲੀਮਿੰਟ '%s' ਦੇ ਟੈਗ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ਇਕ ਟਿੱਪਣੀ ਜਾਂ ਹਦਾਇਤ ਚਲਾਉਣ ਦੌਰਾਨ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ਨਿਕਾਰਾ ਆਬਜੈਕਟ" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ ਜਾਂ ਨਿਕਾਰਾ ਆਬਜੈਕਟ" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ਮੈਮੋਰੀ ਖਤਮ ਹੋਈ" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "ਬੈਕ-ਟਰੈਕਿੰਗ ਲਿਸਟ ਆ ਗਈ" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "ਪੈਟਰਨ ਵਿੱਚ ਆਈਟਮਾਂ ਹਨ, ਜੋ ਕਿ ਅਧੂਰੀ ਮੈਂਚਿੰਗ ਲਈ ਸਹਾਇਕ ਨਹੀਂ।" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "ਬੈਕ ਰੈਡਰੈਂਸ ਕੰਡੀਸ਼ਨ ਵਾਂਗ ਅਧੂਰੀ ਮੈਂਚਿੰਗ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹਨ" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "ਰੀਕਰਸਵ ਲਿਮਟ ਆਈ" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ਖਾਲੀ ਸਬ-ਲਾਈਨਾਂ ਲਈ ਵਰਕਸਪੇਸ ਲਿਸਮਟ ਆਈ" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ਗਲਤ ਨਵੀਂ ਲਾਈਨ ਫਲੈਗ ਦਾ ਸੰਯੋਗ" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ਅਣਜਾਣ ਗਲਤੀ" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ਪੈਟਰਨ ਦੇ ਅੰਤ ਉੱਤੇ" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\ਪੈਟਰਨ ਦੇ ਅੰਤ ਉੱਤੇ c" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "ਬੇਪਛਾਣ ਕਰੈਕਟਰ ਅੱਗੇ \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ਅੱਖਰ ਅੱਖਰ ਬਦਲਣਾ (\\l, \\L, \\u, \\U) ਇੱਥੇ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "ਨੰਬਰ {} ਗਿਣਤੀ ਤੋਂ ਬਾਹਰ ਹਨ" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "ਨੰਬਰ {} ਵਿੱਚ ਆਉਣ ਤੋਂ ਬਹੁਤ ਵੱਡਾ" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "ਕਰੈਕਟਰ ਕਲਾਸ ਲਈ ਟਰਮੀਨੇਸ਼ਨ ] ਗੁੰਮ ਹੈ" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ਕਰੈਕਟਰ ਕਲਾਸ ਵਿੱਚ ਅਸਕੇਪ ਲੜੀ ਗਲਤ ਹੈ" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "ਕਰੈਕਟਰ ਕਲਾਸ ਵਿੱਚ ਰੇਜ਼ ਬਿਨ-ਕ੍ਰਮ" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ਰਪੀਟ ਕਰਨ ਲਈ ਕੁਝ ਨਹੀਂ" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? ਦੇ ਬਾਅਦ ਬੇਪਛਾਣ ਕਰੈਕਟਰ" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< ਬਾਅਦ ਬੇਪਛਾਣ ਕਰੈਕਟਰ" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P ਬਾਅਦ ਬੇਪਛਾਣ ਕਰੈਕਟਰ" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX ਨਾਂ ਦੀ ਕਲਾਸ ਕੇਵਲ ਇੱਕ ਹੀ ਕਲਾਸ ਸਹਿਯੋਗੀ ਹੈ" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "ਟਰਮੀਨੇਸ਼ਨ ) ਗੁੰਮ ਹੈ" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") ਬਿਨਾਂ ( ਖੋਲ੍ਹਣ ਦੇ ਹੈ" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ਜਾਂ (?[+-]ਡਿਜ਼ਟ ਦੇ ਬਾਅਦ ) ਹੋਣਾ ਚਾਹੀਦੀ ਹੈ" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "ਗ਼ੈਰ ਮੌਜੂਦ ਸਬ-ਪੈਟਰਨ ਲਈ ਰੈਫਰੈਂਸ" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "ਟਿੱਪਣੀ ਦੇ ਬਾਅਦ ) ਗੁੰਮ ਹੈ" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "ਰੈਗੂਲਰ ਸਮੀਕਰਨ ਬਹੁਤ ਲੰਮਾ ਹੈ " + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "ਮੈਮੋਰੀ ਲੈਣ ਲਈ ਫੇਲ੍ਹ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind ਸਥਿਰ ਲੰਬਾਈ ਵਿੱਚ ਨਹੀਂ" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( ਦੇ ਬਾਅਦ ਨਿਕਾਰਾ ਨੰਬਰ ਜਾਂ ਨਾਂ" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "ਕੰਡੀਸ਼ਨ ਗਰੁੱਪ ਵਿੱਚ ਦੋ ਤੋਂ ਵੱਧ ਬਰਾਂਚਾਂ ਹਨ" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr " (?( ਤੋਂ ਬਾਅਦ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਲੋੜ ਸੀ" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "ਅਣਜਾਣ POSIX ਕਲਾਸ ਨਾਂ" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ਲੋਕੇਲ ਐਲੀਮੈਂਟ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ਵਿੱਚ ਅੱਖਰ ਮੁੱਖ, ਲੜੀ ਬਹੁਤ ਲੰਮੀ ਹੈ" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ਗਲਤ ਕੰਡੀਸ਼ਨ (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C lookbehind assertion ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "ਲਗਾਤਾਰ ਕਾਲ ਨਾਲ ਬੇਅੰਤ ਲੂਪ ਚਾਲੂ ਹੋ ਸਕਦਾ ਸੀ" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ਸਬ-ਪੈਟਰਨ ਨਾਂ ਵਿੱਚ ਟਰਮੀਨੇਟਰ ਗੁੰਮ ਹੈ" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "ਦੋ ਨਾਮੀ ਸਬ-ਪੈਟਰਨ ਲਈ ਇੱਕੋ ਨਾਂ ਹੈ" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ਨਿਕਾਰਾ \\P ਜਾਂ \\p ਕ੍ਰਮ" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ਜਾਂ \\p ਦੇ ਬਾਅਦ ਅਣਜਾਣ ਵਿਸ਼ੇਸ਼ਤਾ ਨਾਂ" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ਸਬ-ਪੈਟਰਨ ਬਹੁਤ ਲੰਮਾ ਹੈ (ਵੱਧੋ-ਵੱਧ ੩੨ ਅੱਖਰ)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ਬਹੁਤ ਵੱਧ ਸਬ-ਪੈਟਰਨ (ਵੱਧੋ-ਵੱਧ ੧੦,੦੦੦)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "ਓਕਟਲ ਮੁੱਲ \\à©©à©­à©­ ਤੋਂ ਵੱਧ" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE ਗਰੁੱਪ ਵਿੱਚ ਇੱਕ ਤੋਂ ਵੱਧ ਬਰਾਂਚਾਂ ਹਨ" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE ਗਰੁੱਪ ਨੂੰ ਦੁਹਰਾਉਣਾ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "ਗਲਤ NEWLINE ਚੋਣਾਂ" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g ਨੂੰ ਕਿਸੇ ਵੀ ਬਰੈਕਟ ਨਾਂ ਜਾਂ ਚੋਣਵੀਂ ਬਰੈਕਟ ਕੀਤੇ ਗ਼ੈਰ-ਸਿਫ਼ਰ ਨੰਬਰ ਬਾਅਦ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "ਅਣਜਾਣ ਰਪੀਟ" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "ਕੋਡ ਓਵਰਫਲੋ" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "ਓਵਰ-ਰਨ ਕੰਪਾਇਲਿੰਗ ਵਰਕਸਪੇਸ" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "ਪਹਿਲਾਂ-ਚੈੱਕ ਕੀਤਾ ਰੈਂਫਰਡ ਸਬ-ਪੈਟਰਨ ਨਹੀਂ ਲੱਭਿਆ" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "ਰੈਗੂਲਰ ਐਕਸਪਰੈਸ਼ਨ %s ਮਿਲਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE ਲਾਇਬਰੇਰੀ ਨੂੰ UTF8 ਮੱਦਦ ਬਗੈਰ ਕੰਪਾਇਲ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE ਲਾਇਬਰੇਰੀ ਨੂੰ UTF8 ਵਿਸ਼ੇਸ਼ਤਾ ਮੱਦਦ ਬਗੈਰ ਕੰਪਾਇਲ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ਅੱਖਰ %2$d ਉੱਤੇ ਰੈਗੂਲਰ ਸਮੀਕਰਨ %1$s ਨਾਲ ਕੰਪਾਇਲ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %3$s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s ਰੈਗੂਲਰ ਐਕਸਪਰੈਸ਼ਨ ਅਨੁਕੂਲ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "ਹੈਕਸਾਡੈਸੀਮਕ ਅੰਕ ਜਾਂ '}' ਦੀ ਮੰਗ ਸੀ" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "ਹੈਕਾਡੈਸੀਮਲ ਅੰਕ ਲੋੜੀਦਾ ਸੀ" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ ਵਿੱਚ '<' ਨਹੀਂ ਹੈ" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "ਅਧੂਰਾ ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "ਜ਼ੀਰੋ-ਲੰਬਾਈ ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "ਅੰਕ ਲੋੜੀਦਾ ਸੀ" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ਗਲਤ ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "ਸਟਰੇ ਫਾਈਨਲ '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ਅਣਜਾਣ ਇਸਕੇਪ ਕਰਮ" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ਬਦਲਣ ਟੈਕਸਟ \"%s\" ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਅੱਖਰ %lu ਉੱਤੇ ਗਲਤੀ: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ਹਵਾਲਾ ਟੈਕਸਟ ਇਕ ਹਵਾਲਾ ਮਾਰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "ਕਮਾਂਡ ਲਾਈਨ ਜਾਂ ਸੈੱਲ ਟੈਕਸਟ ਵਿੱਚ ਬੇਮੇਲ ਹਵਾਲਾ ਮਾਰਕ ਹੈ" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ਇੱਕ '\\' ਅੱਖਰ ਮਗਰੋਂ ਟੈਕਸਟ ਖਤਮ ਹੋਣੇ ਹਨ (ਟੈਕਸਟ ਸੀ '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c ਲਈ ਹਵਾਲਾ ਲੱਭਣ ਤੋਂ ਪਹਿਲਾਂ ਟੈਕਸਟ ਖਤਮ ਹੈ। (ਟੈਕਸਟ ਸੀ '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ਟੈਕਸਟ ਖਾਲੀ ਸੀ (ਜਾਂ ਸਾਫ ਥਾਂ ਹੀ ਹੈ)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈੱਸ ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਨਾਲ ਕਮਿਊਨੀਕੇਸ਼ਨ ਲਈ ਪਾਇਪ ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ਚਾਈਲਡ ਪਾਈਪ (%s) ਤੋਂ ਡਾਟਾ ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ ਹੈ" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "ਡਾਇਰੈਕਟਰੀ '%s' ਬਦਲਣ ਵਿੱਚ ਫੇਲ੍ਹ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ਚਾਈਲਡ ਕਾਰਵਾਈ (%s) ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "ਗਲਤ ਪ੍ਰੋਗਰਾਮ ਨਾਂ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d ਉੱਤੇ ਮੁੱਲ ਵੈਕਟਰ ਵਿੱਚ ਗਲਤ ਲਾਈਨ: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ਇੰਵਾਇਰਨਮਿੰਟ ਵਿੱਚ ਗਲਤ ਲਾਈਨ: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ਗਲਤ ਵਰਕਿੰਗ ਡਾਇਰੈਕਟਰੀ: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ਮੱਦਦ ਪਰੋਗਰਾਮ (%s) ਸ਼ੁਰੂ ਕਰਨ 'ਚ ਫੇਲ੍ਹ" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ਇੱਕ ਚਾਈਲਡ ਪਰੋਸੈਸ ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਦੌਰਾਨ g_io_channel_win32_poll() ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਤੋਂ ਡਾਟਾ ਖੋਲ੍ਹਣ ਲਈ select() ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "ਫੋਰਕ (%s) ਲਈ ਫੇਲ੍ਹ" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ \"%s\" (%s) ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਦੀ ਆਉਟਪੁੱਟ ਜਾਂ ਇੰਪੁੱਟ ਦੀ ਦਿਸ਼ਾ ਬਦਲਣ 'ਚ ਫੇਲ੍ਹ" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਫੋਰਕ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ \"%s\" ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਅਣਜਾਣੀ ਗਲਤੀ" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ਚਾਈਲਡ pid ਪਾਇਪ (%s) ਤੋਂ ਚਾਹੀਦਾ ਡਾਟਾ ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 ਲਈ ਅੱਖਰ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "ਬਦਲਾਉ ਇੰਪੁੱਟ ਵਿੱਚ ਤਰਤੀਬ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-੧੬ ਲਈ ਅੱਖਰ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ਵਰਤੋਂ:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ਚੋਣ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "ਮੱਦਦ ਚੋਣ:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "ਮੱਦਦ ਚੋਣ ਵੇਖੋ" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "ਸਭ ਮੱਦਦ ਚੋਣਾਂ ਵੇਖੋ" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਚੋਣ:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ਪੂਰਨ ਅੰਕ ਮੁੱਲ %s' ਨੂੰ %s ਲਈ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "ਪੂਰਨ ਅੰਕ '%s' %s ਲਈ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਜਾ ਰਿਹਾ ਹੈ" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s ਲਈ ਡਬਲ ਮੁੱਲ '%1$s' ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s ਲਈ '%1$s' ਡਬਲ ਮੁੱਲ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "ਚੋਣ %s ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ਲਈ ਆਰਗੂਮੈਂਟ ਗੁੰਮ ਹੈ" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "ਅਣਜਾਣ ਚੋਣ %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "ਖੋਜ ਡਾਇਰੈਕਟਰੀਆਂ ਵਿੱਚ ਠੀਕ ਕੁੰਜੀ ਫਾਇਲ ਨਹੀਂ ਖੋਜੀ ਜਾ ਸਕੀ" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ਇੱਕ ਰੈਗੂਲਰ ਫਾਇਲ ਨਹੀਂ" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "ਫਾਇਲ ਖਾਲੀ ਹੈ" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਲਾਈਨ '%s' ਰੱਖਦੀ ਹੈ, ਜੋ ਕਿ ਕੁੰਜੀ-ਮੁੱਲ ਜੋੜਾ, ਗਰੁੱਪ ਜਾਂ ਟਿੱਪਣੀ ਨਹੀਂ ਹੈ" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "ਗਲਤ ਗਰੁੱਪ ਨਾਂ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਗਰੁੱਪ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "ਗਲਤ ਕੁੰਜੀ ਨਾਂ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਨਾ-ਸਹਾਇਕ ਇੰਕੋਡਿੰਗ '%s' ਰੱਖਦੀ ਹੈ" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਦਾ ਗਰੁੱਪ '%s' ਨਹੀਂ ਹੈ" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਨਹੀਂ ਹੈ" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਕੁੰਜੀ '%s' ਦਾ ਮੁੱਲ '%s' ਹੈ, ਜੋ ਕਿ UTF-8 ਨਹੀਂ ਹੈ" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਹੈ, ਜਿਸ ਤੇ ਕਾਰਵਾਈ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਮੁੱਲ ਹੈ, ਜਿਸ ਉੱਤੇ ਕਾਰਵਾਈ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਕੁੰਜੀ '%s' ਗਰੁੱਪ '%s' ਵਿੱਚ ਹੈ, ਜਿਸ ਦੇ ਮੁੱਲ ਨੂੰ ਇੰਟਰਪਰੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਕੁੰਜੀ '%s' ਗਰੁੱਪ '%s' ਵਿੱਚ ਨਹੀਂ ਹੈ" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਲਾਈਨ ਦੇ ਅੰਤ ਵਿੱਚ ਇਸਕੇਪ ਅੱਖਰ ਹੈ" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਗਲਤ ਇਸਕੇਪ ਕ੍ਰਮ '%s' ਹੈ" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ਮੁੱਲ '%s' ਨੂੰ ਇੱਕ ਅੰਕ ਦੇ ਤੌਰ 'ਤੇ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ਪੂਰਨ ਅੰਕ '%s' ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "ਮੁੱਲ '%s' ਨੂੰ ਇੱਕ ਦਸ਼ਮਲਵ ਅੰਕ ਦੇ ਤੌਰ 'ਤੇ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ਮੁੱਲ '%s' ਨੂੰ ਬੂਲੀਅਨ ਵਾਂਗ ਇੰਟਰਪਰੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ਨੂੰ ਬਹੁਤ ਵੱਧ ਗਿਣਤੀ ਪਾਸ ਕੀਤੀ ਗਈ" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "ਸਟਰੀਮ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "ਓਪਰੇਸ਼ਨ ਰੱਦ ਕੀਤਾ ਗਿਆ" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "ਗਲਤ ਆਬਜੈਕਟ, ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "ਇੰਪੁੱਟ ਵਿੱਚ ਅਧੂਰਾ ਮਲਟੀਬਾਈਟ ਕ੍ਰਮ" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "ਟਿਕਾਣੇ ਉੱਤੇ ਲੋੜੀਦੀ ਥਾਂ ਨਹੀਂ" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "ਰੱਦਕਰਨਯੋਗ ਸ਼ੁਰੂ ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "ਅਣਜਾਣ ਟਾਈਪ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s ਫਾਇਲ-ਟਾਈਪ" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s ਟਾਈਪ" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ਅਚਾਨਕ ਛੇਤੀ ਐਂਡ-ਆਫ਼-ਸਟੀਰਮ" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "ਬਿਨ-ਨਾਂ" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "ਡੈਸਕਟਾਪ ਫਾਇਲ ਨੇ Exec ਫੀਲਡ ਨਹੀਂ ਦਿੱਤਾ ਹੈ" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਟਰਮੀਨਲ ਲੋੜ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ਯੂਜ਼ਰ ਐਪਲੀਕੇਸ਼ਨ ਸੰਰਚਨਾ ਫੋਲਡਰ %s ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ਯੂਜ਼ਰ MIME ਸੰਰਚਨਾ ਫੋਲਡਰ %s ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ਯੂਜ਼ਰ ਡੈਸਕਟਾਪ ਫਾਇਲ %s ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ਲਈ ਕਸਟਮ ਪਰਿਭਾਸ਼ਾ" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ਡਰਾਇਵ ਲਈ ਬਾਹਰ ਕੱਢਣਾ ਨਹੀਂ ਬਣਾਇਆ" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ਡਰਾਇਵ eject ਜਾਂ eject_with_operation ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ।" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ਮੀਡਿਆ ਪੋਲਿੰਗ ਲਈ ਡਰਾਇਵ ਹਾਲੇ ਸਥਾਪਤ ਨਹੀਂ" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ਡਰਾਇਵਹ start ਹਾਲੇ ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ਡਰਾਇਵ stop ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ਇੰਕੋਡਿੰਗ ਵਿੱਚ ਨਿਕਾਰਾ ਟੋਕਨਾਂ ਦੀ ਗਿਣਤੀ (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GThemedIcon ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ਇੰਕੋਡਿੰਗ ਵਿੱਚ ਨਿਕਾਰਾ ਟੋਕਨਾਂ ਦੀ ਗਿਣਤੀ (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ਲਈ GEmblem ਦੀ ਲੋੜ ਸੀ" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ਓਪਰੇਸ਼ਨ ਸਹਾਇਕ ਨਹੀਂ" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ਰੱਖਣ ਵਾਲਾ ਮਾਊਂਟ ਮੌਜੂਦ ਨਹੀਂ" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਕਾਪੀ ਨਹੀਂ ਹੋ ਸਕਦਾ" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਕਾਪੀ ਨਹੀਂ ਹੋ ਸਕਦੀ" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਮੌਜੂਦ ਹੈ" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਲਗਾਤਾਰ ਕਾਪੀ ਨਹੀਂ ਹੋ ਸਕਦੀ" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "ਸਪਲਿਸ ਸਕਾਇਕ ਨਹੀਂ" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "ਸਪਲਿਸ ਫਾਇਲ ਗਲਤੀ: %s " + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "ਖਾਸ ਫਾਇਲ ਕਾਪੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "ਗਲਤ ਸਿੰਬੋਲਿੰਕ ਮੁੱਲ ਦਿੱਤਾ" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ਰੱਦ ਸਹਾਇਕ ਨਹੀਂ" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ਫਾਇਲ ਨਾਂ ਵਿੱਚ ' %c' ਮੌਜੂਦ ਨਹੀਂ ਹੋ ਸਕਦਾ" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "ਵਾਲੀਅਮ ਲਈ ਮਾਊਂਟ ਸਥਾਪਤ ਨਹੀਂ ਹੈ" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ਇਹ ਫਾਇਲ ਹੈਂਡਲ ਕਰਨ ਲਈ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ਈਨੂਮੀਟਰੇਟਰ ਬੰਦ ਹੈ" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ਫਾਇਲ ਈਨੂਮੀਟਰੇਟਰ ਗੰਭੀਰ ਕਾਰਵਾਈ ਕਰ ਚੁੱਕਾ ਹੈ" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ਫਾਇਲ ਈਨੂਮੀਟਰੇਟਰ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon ਲਈ ਨਿਕਾਰਾ ਇੰਪੁੱਟ ਡਾਟਾ" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "ਸਟਰੀਮ query_info ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "ਸਟਰੀਮ ਉੱਤੇ ਸੀਕ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ਇੰਪੁੱਟ ਸਟਰੀਮ ਉੱਤੇ ਟਰਾਂਸਕੇਟ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "ਸਟਰੀਮ ਉੱਤੇ ਟਰਾਂਸਕੇਟ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ਟੋਕਨਾਂ ਦੀ ਗਲਤ ਗਿਣਤੀ (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "ਕਲਾਸ ਨਾਂ %s ਲਈ ਕੋਈ ਟਾਈਪ ਨਹੀਂ" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ਟਾਈਪ %s GIcon ਇੰਟਰਫੇਸ ਲਈ ਸਥਾਪਿਤ ਨਹੀਂ" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "ਟਾਈਪ %s ਕਲਾਸ ਨਹੀਂ ਹੈ" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "ਨਿਕਾਰਾ ਵਰਜਨ ਨੰਬਰ: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ਟਾਈਪ %s GIcon ਇੰਟਰਫੇਸ ਉੱਤੇ from_tokens() ਸਥਾਪਨ ਚਾਹੀਦਾ ਨਹੀਂ" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ਆਈਕਾਨ ਇੰਕੋਡਿੰਗ ਦਾ ਦਿੱਤਾ ਵਰਜਨ ਨੰਬਰ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ਇੰਪੁੱਟ ਸਟਰੀਮ ਹਾਲੇ ਪੜ੍ਹਨ ਲਈ ਨਹੀਂ ਹੈ" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "ਸਟਰੀਮ ਪਹਿਲਾਂ ਹੀ ਕਾਰਵਾਈ ਅਧੀਨ ਹੈ" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "ਸਾਕਟ ਐਡਰੈੱਸ ਲਈ ਲੋੜੀਦੀ ਥਾਂ ਨਹੀਂ" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "ਗ਼ੈਰ-ਸਹਾਇਕ ਸਾਕਟ ਐਡਰੈੱਸ" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "ਡਿਫਾਲਟ ਲੋਕਲ ਡਾਇਰੈਕਟਰੀ ਮਾਨੀਟਰ ਟਾਈਪ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ਗਲਤ ਫਾਇਲ ਨਾਂ %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ਫਾਇਲ ਸਿਸਟਮ ਜਾਣਕਾਰੀ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ਰੂਟ ਡਾਇਰੈਕਟਰੀ ਦਾ ਨਾਂ ਨਹੀਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "ਫਾਇਲ ਨਾਂ ਬਦਲਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ਫਾਇਲ ਦਾ ਨਾਂ ਨਹੀਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ, ਫਾਇਲ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ਗਲਤ ਫਾਇਲ ਨਾਂ" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "ਫਾਇਲ ਖੋਲ੍ਹਣ ਦੌਰਾਨ ਗਲਤੀ: %s " + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "ਫਾਇਲ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "ਫਾਇਲ ਰੱਦੀ 'ਚ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ਰੱਦੀ ਡਾਇਰੈਕਟਰੀ %s ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ਰੱਦੀ ਲਈ ਟਾਪ-ਲੈਵਲ ਡਾਇਰੈਕਟਰੀ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ਰੱਦੀ ਡਾਇਰੈਕਟਰੀ ਲੱਭਣ ਜਾਂ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ਰੱਦੀ 'ਚ ਭੇਜੀ ਫਾਇਲ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ਫਾਇਲ ਰੱਦੀ 'ਚ ਭੇਜਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ਫਾਇਲ-ਸਿਸਟਮ ਸਿੰਬੋਲਿਕ ਲਿੰਕ ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "ਸਿਬੋਲਿਕ ਲਿੰਕ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "ਫਾਇਲ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "ਬੈਕਅੱਪ ਫਾਇਲ ਬਣਾਉਣ ਲਈ ਫੇਲ੍ਹ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "ਮਾਊਂਟ ਵਿੱਚ ਭੇਜਣਾ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "ਗੁਣ ਮੁੱਲ ਗ਼ੈਰ-ਨਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "ਗਲਤ ਗੁਣ ਟਾਈਪ (ਲਾਈਨ ਦੀ ਲੋੜ ਸੀ)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "ਗਲਤ ਐਕਸਟੈੱਡ ਗੁਣ ਨਾਂ" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ਐਕਸਟੈੱਡ ਗੁਣ '%s' ਸੈੱਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਦੇਣ'ਚ ਗਲਤੀ: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "(ਗਲਤ ਇੰਕੋਡਿੰਗ)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਸਟੇਟਿੰਗ ਗਲਤੀ: %s " + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ਗਲਤ ਐਟਰੀਬਿਊਟ ਟਾਈਪ (uint32 ਲੋੜੀਦਾ ਸੀ)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ਗਲਤ ਐਟਰੀਬਿਊਟ ਟਾਈਪ (uint64 ਲੋੜੀਦਾ ਸੀ)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "ਗਲਤ ਐਟਰੀਬਿਊਟ ਟਾਈਪ (ਬਾਈਟ ਲਾਈਨ ਲੋੜੀਦੀ ਸੀ)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "ਸਿਮਲਿੰਕਲਈ ਅਧਿਕਾਰ ਨਹੀਂ ਸੈੱਟ ਕੀਤੇ ਜਾ ਸਕਦੇ" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ਅਧਿਕਾਰ ਸੈੱਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "ਓਪਨ ਸੈਟਿੰਗ ਗਲਤੀ: %s " + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "ਸਿਮਲਿੰਕ ਗ਼ੈਰ-ਨਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink ਸੈਟਿੰਗ ਗਲਤੀ: %s " + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink ਸੈਟਿੰਗ ਗਲਤੀ: ਫਾਇਲ ਇੱਕ symlink ਨਹੀਂ ਹੈ" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "ਸੋਧਣ ਜਾਂ ਵਰਤਣ ਸਮਾਂ ਸੈੱਟ ਕਰਨ ਲਈ ਗਲਤੀ: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ਪਰਸੰਗ ਗੈਰ-ਨਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ਪਰਸੰਗ ਸੈਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "ਇਸ ਸਿਸਟਮ ਉੱਤੇ SELinux ਚਾਲੂ ਨਹੀਂ ਹੈ" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ਗੁਣ %s ਸੈਟਿੰਗ ਸਹਾਇਕ ਨਹੀਂ" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "ਫਾਇਲ ਤੋਂ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ਫਾਇਲ 'ਚ ਵੇਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "ਫਾਇਲ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "ਡਿਫਾਲਟ ਲੋਕਲ ਫਾਇਲ ਮਾਨੀਟਰ ਟਾਈਪ ਖੋਜਣ ਲਈ ਅਸਮਰੱਥ" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "ਫਾਇਲ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "ਪੁਰਾਣਾ ਬੈਕਅੱਪ ਲਿੰਕ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ਬੈਕਅੱਪ ਕਾਪੀ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ਆਰਜ਼ੀ ਫਾਇਲ ਨਾਂ ਬਦਲਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "ਫਾਇਲ ਸੰਖੇਪ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਖੋਲ੍ਹਣ 'ਚ ਗਲਤੀ: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਡਾਇਰੈਕਟਰੀ ਹੈ" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਇੱਕ ਰੈਗੂਲਰ ਫਾਇਲ ਨਹੀਂ ਹੈ" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ਫਾਇਲ ਬਾਹਰੋਂ ਸੋਧੀ ਗਈ ਸੀ" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "ਪੁਰਾਣੀ ਫਾਇਲ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "ਗਲਤ GSeekType ਦਿੱਤੀ ਗਈ" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "ਸੀਕ ਮੰਗ ਗਲਤ ਹੈ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ਛੋਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "ਮੈਮੋਰੀ ਆਉਟਪੁੱਟ ਸਟਰੀਮ ਮੁੜ-ਅਕਾਰ ਯੋਗ ਨਹੀਂ" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "ਮੈਮੋਰੀ ਆਉਟਪੁੱਟ ਸਟਰੀਮ ਮੁੜ-ਸਾਈਜ਼ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "ਲਿਖਣ ਲਈ ਲੋੜੀਦੀ ਮੈਮੋਰੀ ਦੀ ਮਾਤਰਾ ਉਪਲੱਬਧ ਐਡਰੈੱਸ ਥਾਂ ਤੋਂ ਵੱਧ ਹੈ" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "ਕੀਤੀ ਗਈ ਮੰਗ ਸਟਰੀਮ ਦੇ ਸ਼ੁਰੂ ਤੋਂ ਪਹਿਲਾਂ ਹੈ" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "ਕੀਤੀ ਗਈ ਮੰਗ ਸਟਰੀਮ ਦੇ ਅੰਤ ਤੋਂ ਬਾਅਦ ਹੈ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "ਮਾਊਂਟ ਹਾਲੇ ਅਣ-ਮਾਊਂਟ ('unmount) ਲਈ ਸਥਾਪਿਤ ਨਹੀਂ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "ਮਾਊਂਟ ਹਾਲੇ ਬਾਹਰ ਕੱਢਣ (\"eject\") ਲਈ ਸਥਾਪਤ ਨਹੀਂ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "ਮਾਊਂਟ ਲਈ ਹਾਲੇ \"unmount\" ਜਾਂ \"unmount_with_operation\" ਸਥਾਪਿਤ ਨਹੀਂ।" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "ਮਾਊਂਟ ਲਈ \"eject\" ਜਾਂ \"eject_with_operation\" ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ।" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "ਮਾਊਂਟ ਹਾਲੇ ਰੀ-ਮਾਊਂਟ (\"remount\") ਲਈ ਸਥਾਪਿਤ ਨਹੀਂ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "ਪਰਸੰਗ ਟਾਈਪ ਗੈੱਸਿੰਗ ਲਈ ਮਾਊਂਟ ਸਥਾਪਤ ਨਹੀਂ ਹੈ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ਸੈਕਰੋਨਿਸ ਪਰਸੰਗ ਟਾਈਪ ਗੈਸਿੰਗ ਲਈ ਮਾਊਂਟ ਸਥਾਪਤ ਨਹੀਂ ਹੈ" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ਹੋਸਟ-ਨਾਂ '%s' '[' ਰੱਖਦਾ ਹੈ, ਪਰ ']' ਨਹੀਂ" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "ਆਉਟਪੁੱਟ ਸਟਰੀਮ ਲਿਕਣ ਲਈ ਬਣਾਈ ਨਹੀਂ ਗਈ" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "ਸਰੋਤ ਸਟਰੀਮ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ਲੱਭਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ਉਲਟ-ਲੱਭਣ ਲਈ ਗਲਤੀ: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' ਲਈ ਕੋਈ ਸਰਵਿਸ ਰਿਕਾਰਡ ਨਹੀਂ" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ਲੱਭਣ ਲਈ ਆਰਜ਼ੀ ਰੂਪ ਵਿੱਚ ਅਸਮਰੱਥ" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ਲੱਭਣ ਦੌਰਾਨ ਗਲਤੀ" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "ਗਲਤ ਸਾਕਟ, ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ਗਲਤ ਸਾਕਟ, %s: ਕਰਕੇ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "ਸਾਕਟ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ਤੋਂ ਜੀਸਾਕਟ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ਸਾਕਟ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "ਅਣਜਾਣ ਪਰੋਟੋਕਾਲ ਦਿੱਤਾ ਗਿਆ" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ਲੋਕਲ ਐਡਰੈੱਸ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਿਆ: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ਰਿਮੋਟ ਐਡਰੈੱਸ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਿਆ: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ਸੁਣਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "ਐਡਰੈੱਸ ਸਬੰਧਿਤ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "ਕੁਨੈਕਸ਼ਨ ਮਨਜ਼ੂਰ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "ਕੁਨੈਕਸ਼ਨ ਜਾਰੀ ਹੈ" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ਬਾਕੀ ਗਲਤੀ ਲੈਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "ਡਾਟਾ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "ਡਾਟਾ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "ਸਾਕਟ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ਸਾਕਟ ਸ਼ਰਤ ਲਈ ਉਡੀਕ ਜਾਰੀ: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "ਸੁਨੇਹਾ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "ਵਿੰਡੋਜ਼ ਉੱਤੇ GSocketControlMessage ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "ਸੁਨੇਹਾ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "ਕੁਨੈਕਟ ਉੱਤੇ ਅਣਜਾਣ ਗਲਤੀ" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "ਲਿਸਨਰ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "ਸਾਕਟ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 ਕੰਟਰੋਸ ਸੁਨੇਹੇ ਦੀ ਲੋੜ ਸੀ, %d ਮਿਲੇ" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "ਅਚੀਲਿਰੇ ਡਾਟਾ ਦੀ ਅਣਜਾਣ ਕਿਸਮ" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ਇੱਕ fd ਦੀ ਲੋੜ ਸੀ, ਪਰ %d ਮਿਲੀਆਂ।\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "ਗਲਤ fd ਮਿਲੀ" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix ਤੋਂ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "ਫਾਇਲ ਸਿਸਟਮ ਰੂਟ" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix ਉੱਤੇ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ਯੂਨੈਕਸ ਡੋਮੇਨ ਸਾਕਟ ਐਡਰੈੱਸ ਇਹ ਸਿਸਟਮ ਵਲੋਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "ਵਾਲੀਅਮ ਹਾਲੇ ਬਣਾਇਆ ਨਹੀਂ ਹੈ" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ਵਾਲੀਅਮ ਲਈ eject ਜਾਂ eject_with_operation ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ।" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਲੱਭੀ ਜਾ ਸਕਦੀ" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਲਾਂਚ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "ਸਬੰਧ ਬਦਲਣਾ win32 ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "ਸਬੰਧ ਬਣਾਉਣਾ win32 ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "ਲੋੜੀਦੀ ਮੈਮੋਰੀ ਨਹੀਂ" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "ਹੋਰ ਇੰਪੁੱਟ ਦੀ ਲੋੜ" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "ਗਲਤ ਕੰਪਰੈੱਸ ਕੀਤਾ ਡਾਟਾ" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "ਬਦਲਾਉ ਇੰਪੁੱਟ ਵਿੱਚ ਤਰਤੀਬ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ਵੱਧੋ-ਵੱਧ ਡਾਟਾ ਅਰੇ ਲਿਮਟ ਆ ਗਈ" + +#~ msgid "do not hide entries" +#~ msgstr "ਐਂਟਰੀਆਂ ਓਹਲੇ ਨਾ ਕਰੋ" + +#~ msgid "use a long listing format" +#~ msgstr "ਇੱਕ ਲੰਮਾ ਲਿਸਟਿੰਗ ਫਾਰਮੈਟ ਵਰਤੋਂ" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "ਇਹ %s ਅੱਖਰ ਕੋਈ ਐਂਟਟੀ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਗਲਤ ਹੈ & ਅੱਖਰ ਇਕਾਈ ਆਰੰਭ ਕਰਦਾ ਹੈ; ਜੇਕਰ ਇਹ ਐਪਰਸੈਡ " +#~ "ਐਂਟਟੀ ਬਣਨਯੋਗ ਨਹੀਂ ਤਾਂ ਇਸ ਨੂੰ ਇੰਝ & ਛੱਡ ਦਿਓ" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "'%s' ਅੱਖਰ ਇੱਕ ਐਂਟਟੀ ਦੇ ਨਾਂ ਲਈ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "ਖਾਲੀ ਅੱਖਰ ਰੈਫਰੈਂਸ, ਕੋਈ ਨੰਬਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਵੇਂ ਕਿ dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "ਅਧੂਰਾ ਐਂਟਟੀ ਰੈਫਰੈਂਸ" + +#~ msgid "Unfinished character reference" +#~ msgstr "ਅਧੂਰਾ ਅੱਖਰੀ ਰੈਫਰੈਂਸ" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "ਗਲਤ UTF-8 ਇੰਕੋਡ ਟੈਕਸਟ - ਓਵਰਲਾਂਗ ਕ੍ਰਮ" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "ਗਲਤ UTF-8 ਇੰਕੋਡ ਟੈਕਸਟ - ਇੱਕ ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਨਹੀਂ" + +#~ msgid "file" +#~ msgstr "ਫਾਇਲ" + +#~ msgid "The file containing the icon" +#~ msgstr "ਫਾਇਲ ਆਈਕਾਨ ਰੱਖਦੀ ਹੈ" + +#~ msgid "name" +#~ msgstr "ਨਾਂ" + +#~ msgid "The name of the icon" +#~ msgstr "ਆਈਕਾਨ ਦਾ ਨਾਂ" + +#~ msgid "names" +#~ msgstr "ਨਾਂ" + +#~ msgid "An array containing the icon names" +#~ msgstr "ਅਰੇ ਵਿੱਚ ਆਈਕਾਨ ਨਾਂ ਹਨ" + +#~ msgid "use default fallbacks" +#~ msgstr "ਡਿਫਾਲਟ ਫਾਲਬੈਕ ਵਰਤੋਂ" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "ਜੀ '-' ਅੱਖਰ ਉੱਤੇ ਨਾਂ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਡਿਫਾਲਟ ਫਾਲਬੈਕ ਲੱਭਿਆ ਵਰਤਣਾ ਹੈ। ਜੇ ਕਈ ਨਾਂ ਲੱਭਣ ਤਾਂ " +#~ "ਪਹਿਲੇ ਦੇ ਬਾਅਦ ਨਾਂ ਅਣਡਿੱਠੇ ਕਰੋ।" + +#~ msgid "File descriptor" +#~ msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ" + +#~ msgid "The file descriptor to read from" +#~ msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਪੜ੍ਹਨਾ ਹੈ" + +#~ msgid "Close file descriptor" +#~ msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਬੰਦ ਕਰੋ" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "ਕੀ ਸਟਰੀਮ ਬੰਦ ਹੋਣ ਨਾਲ ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਵੀ ਬੰਦ ਕਰਨਾ ਹੈ" + +#~ msgid "The file descriptor to write to" +#~ msgstr "ਲਿਖਣ ਲਈ ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ" diff --git a/po/pl.gmo b/po/pl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..dd131263ebdd66faf0406dea8832202dbe402e9f GIT binary patch literal 46239 zcmdU&37B0~mG6(Jpiu;wMTSE`k}61r1Q22-hLAuYlO!Pu!FcN4Ta{aNC+?8SEkGrJ z3Wx)Oh$y11*f#ncu(3sK2S~SV+wIiacB?p|ZL96`wc2Xi&-eSUz0YuO-CL>He&2hq zzVGCJ&pCTsd+oK>UVELL#}9kTodJLMJt+u|1CKj62!;;;kJZy4_`*OC91eaFJP3Tk z<4-;Q(&K-5eCo+A-NE29NPnciKM6dP`yuc};8Ji0cn27PzW|>DUVcgtoCwyyA@Fse z>VFuV2mU>H0r*SsC~(Q#AlM3S1djmU1)c^z3=V=n07LK)GCvnw1X5M74pezU}eJr@H*}K(%ud7=m^1eDDq6 zz2H|swYNzlMb}%wW#9wgLhy$mNrI!ORQKnD$AC3Z&u<1*|A)Z{{5rS>TtO#Amm5LR z?W5pQ@F$?^pHE@ufkjaD{Ta9o{DH@n5J&WSBPcq3hJV!GUxVj@CoBqr=YcN<*MfI| zuLmCoL$F3>(ew4-3E=&p_;)X;{(cu!KYruy52KNXaX$nq-*Qm-UH~dz4b(W?2A%}I z2Nb>j7F4<)gGYjM7<5gI5L7wKz!2O7D*x4>>c0&XU%k^mf5hY0JpKYy`woSO$~Ocm z{c2F-e3gIxa!~cZ#lQa;sP=ssJOcbBsB-2&tPngI6klHmsvR%(_bpKQUJJrP!3RNx zD)>66dY^uF5F8Jl1St5Y+hp7*xKeEpzkvZ15KDM?mraPyO>F zmb-a>9;o&eFZ!k{5^Ogc=Y*BuAc*n-WP-F&vyU30g6v=1eN}7@EGu; z{`r?cjo%MJ@yjz2?n<`;L^K6gfhU1CgU9of0`Jnje#h~ha zEePp@4}nX;-+;s5SsUGWjDQ-qJ3*#;@IEjEe+144=WKH6&j2+JF9B8VEuiS|K2Y_3 z3Jk#?faih-y}P{h4HQ4$2ddqVfU4(lQ2ce^WiH=RaFF{VxCp!*6rCRh zMX#TMqRSzh-FOXx;-}3ZO%LiIQy};>sP-PnBvHO0Q2e$QRQ)yZRPc6C<$WA{HuzOg z<^2ozOz@zsuDm0_gSdYoDEhwyJP^DFR6F;83&97$Gr{kIqW4jkJNjG*s{aM>8Q}Hc z;oxnc+Vytu2=Fr?tQLF|)VL3AbM0IMGIfKiLDl~dsB!xusQM3np_7X%!NuIK0}lmX z3abCF1w-)tpz8SosPdlxp9LQ9A}42_4L*b?i^6%ZUHq8IZ*ua3h-#~0Z{aR6x4YC8z}l5eWgo(Ca7{R2bF#|cqI5bQ0=-O z)O`B_sQd_H*8c9(CH$2ur^cn7HQ_!6je!BuX&mx9W_4pez1Fa&Q04+b9up9_8p zJOlhDsC0+E*tP3yP~*1&RR3Dwap0Rl@%Kl-L%?r=;)|bw$ABmAaP3+Siod5o(cykj zeE50rcUdeh)UmEAosb z_<2x#adE-*djdS2`#Zq7;A5cZ@~@!g!%?HI-6J56g6l!i^@pIwKXuH}{R&X@ z-UEtX9s)z~+y4ENb|SmE9|BeW)!;ec$HDdBFTsn!RYh0tt3l0+2SC;L9dHSF#JF1* ztOrHkJ)rpdqoBs``=IE2z=V?{r-S0d2Dlu2J9sJhICuegYRU0u8C=2ryTSS36X1p5 z!DUCc%fOSkZ-M86cY*hV{|JhIURrVd@j7rd_kRwG@Bb5A2tKds`jH34Uw46$8y^5q z0ly1soDQnNBjC$HweK4qPrTZ#Lq|ZSe()Ed`g2&_>79*WoBKC{Ou69DhO>Xm-~#U7 z3tj^L6SxjM1?JFrTn(zekAnArN4DJj`XG2L_g@2*|KCB;Io##waVe;FSHP3OH-O^5 zkARvVUj{87IG6iy(#_K~;4E8tE{ii^s ze*#S=*0|E-|v`!sku_+#+-;B&8a74!#AnaR4=s!k4@HHiK&K zF7O55{h-qQ8e9j?z242YI(R1c4}fa-x4;X*qxZP<+d)y-*aB+=Ho7K zBli!1dVk=n-2GNieDp3*^!+%f@%tfo2zbcNj^9rN)sHn`2wn$154;yV82krt82qls zLvL~AtOPIM`6##yd=GdO_yjl){2jOjJo#2v{%&wF_wV=k9gl~<+Pz;5p2YiW!PCHd z!DGSCg2#hTfG2=YzRlqPcp~@bgX&iVD*w%(=EnozLhy^=YA|?>&E>IP|ruf9C$yt6`b=rhc5xeKM#Q~2A}qN$7f@p%6T(*GWcLN8jb3`c((@{&k@E?bD#<(XT-DXVDuRpIinW$^EV1D)8-~-ai3qUL16X!60!Oh^?LGj-& z!B2vh-9_8M!{6li=bfPXwHFj0d=J#TnRB-*XCtWoz6#X1JnS)ev+MsF@Hsr60vCdJ zfTG)@pxX5lP~&#kJq}lZ3%K72iXL}@;`@()>fh%S`%6HTdn+jZ_z-v*c+|a)e~aMR+}{a`A3g_e0e=Rn z9~ZvOy&ngcbN_a55%@T$b{uk_Yu9p6%hCHq;Ip~k1)c!D3VbH`ZZHpi7<@YTockU9PX?dH{rTW} z@DlL(;G4knz%PNK*WvGWbUqI}k^3At2fP7PeXjvUhx@?8z%PN~=O;k%+w=d_@!Mu_ z6Zd<-=Yn4bcYr?wSArYgLtWr&K#j{gK$ZU$a1i_>ObVYj{lZ`%9jV# z&Kp3@r-#7fz$d^EJm7t<{*ytqYdxrbSHaW3TS2w!BmVxM!8P0;_&>Zo3NGM&54aY5 zKd65F23!Z8{eDNU8^BYzzYA3QM?jVTBk*AG$Pc*ZCxeT)-vsLY_2BW~`@jppzXjFL zXMNDM^Bhp=HiMc6F9Xj4?*diN=fKtAZ@|UixgT=$yBgHE+zE=#AMp2I1rOo==b-9+ z(u0ofCxS|U2`Ks$JYEl~-nW9H)1QNypI-w-&!ax<myuEF4!g5$h&*Ep3XIgOXH@$^Yoi*j7xui!L^d#+rX>2j^g)_e|HA= zu!!;0Tfl$g(%)j3UQ2mXT|_`fT`&->r^`SfRj@8a2i`R5mNe~Ewha*vC6 zw~^~O?w{$?30}edUxKhwa45fT;@ZIVN!@dOifbA7n$IJk{>}lvH&pyk|i@C1m_sji@D!;|cF9GAf$p3h$$2Wq1&h=u_{1dnqydFG( z>j-}T0=$gtYh3!f)j@C|?_STPzf-sl=l2`9p2hDX*B-8C`}e=(_iMP~zdApbaXp#$ zZ|1s+-_P-BUj&x?Z>5(mndG{`Kf72D`MZ#7r~UGJh~K+?ny35cTfsN$H_vzZXM$I9 ze*q{x*y4A?=lgf=FZI8l0b&XTpWqtw&+g{8{!ZdTTn9hpI-TqHT>878>wNo#JR;8k z*U{Wx%eBTo7yK#L-*Aoc{yOk>u1mS*bN@E3f93b1T>ATggJ2uapTh4NI0e2A)ZfwI zkH9nh{R(h7*Cf|hc>W!(i}+mt@8!Cj>q*=XbNz^zUB{e!;(g1Gts@9sb?(J?eFf>)ran-!7i7;X1^>zlmqEKQ83H?w={$ zCa#rSzvdd|8smB@m;R36I+wJ^`}FI%U+jOsn%|%1x`j)BKjV4^*IeEgx$fesaeoEZ zpK$5#CtUy2ej&$s|M&b3xz6J%aIe1~bA6v{Dc2sJ<-oOE`rFO**IcjUdI^{Qb~p&G z@%jC&!C>a*wf^@ryV8Az=f`vH?0S9)&wj;qI?wL{%Us{$(%=7bV0!L7{&xlZE!WSv zR{657^7uiXeV41r{gGVn<+uJ0<9eY_V-NV}d0Yqjo7;J}fa_MS8@XP@^XGCs;@=DA z_}@?CeV*%Yxu5HwJ(v5<{`Ujmv$+o7YWQb=MBj@cs&}34WKj{x{ck+%EvPa82?1ccA{>$nTT6;=kAP<3Ih)>%cpCcNVxFJO(@s zd=u9quD5dkVXiy4UdH`pT>ATlgW&z(Z9F^C-+vW6m1`B(7M}kdxPeQ5_u0SBj^56@ z2f06v>v{a%#1;R&&HotZ*<<`Z5xfChq37XXv9c>F74u=ClB?#6m9e2Pi;b{SZH7_ks?6<->QSy) zsE4D~QmHyg?Yx`6e14d`Sr!(XVL57BzLCOMu@Xj=uuv+L3zcSAiOPjpm)zW0NXuVR;+*xfk!)mQi5v2!%^TUy9b)p>A zCrDfmw_di^T1!Lgg(%++3%iSrW+OO%q|wwkg{?|)cbKo1BSxW7%}o>-%6z_FXfz6L zU>mJkty*tVXSG6?>0YDVXco%B`T0B#eI6d?M5lake!1FW7^|aUxlpdw+hM(Mb*oq> zX|o#E>eU=Y8|fzN#b!a|Dn<1%_@%iME{JwT#ZojlcTB(?ennfD1 zu_kCN4bE>+d(l12(LH-BX6$G)EO_P_!THT*y*SdMMq>|}7c-pQE7vFur~OGn7`jzR zNMET|hBs_ow=TFK%1yLtHa)_m)=`>G=T}9Q`OPp_t+m5EeaN31m-k-FE{MuQUz6Pe4 zed;Yck$^o*FT*G)2lZwsiGVbX?=&pff-JiVrFIurCJ9U^N!BkgX0zK4VbPhgUS+0q zFmtX@ax=DADK_ER;#7}`s6sTyARQyXTtje?ql;yz)?mV=r6+1fM6bxekZf->A%$u3O0(E(hr?l^k&9}y zFexEwg!8yt7ObiwC2}UOp(0vgOd3azn%Vli4fEWRw`7#d#F*wmI54*{kV$S6%kwP^W))i%zN-C5>O?cToVMo+ z2sb7SeCYZ4!qscmZde_T)vKr%DikSD{nff89V1b#6v7dhDYrAYFe{Q7S7{wn8KdoR z_3lEBsaz=KgA1#{H;n=EbMq>+S zlU2ktD<~v~jcQ!ENwt|qV_XKF8xoDQWI0j;W@Nz4D8quDu?dqq#kw)cv$WdxK*@@X z%^~=pSuB-Y6NcSfnq=OpZ>5Mv#$8eyv3O?a)B=o6$8IJb3dRa%Om}uI79rFix-FmE zIDKVWt~Y(PO0af9p128vg@t1a!{st~R}Q5))Z9Y3h6sY;{5*pDs};B&G9kLnq`a_? zUJ0{eJ6P?PB{t(#vNLlRgxHcs6cj81x=GnKYH{0;KQ`!n^D~(;X*){^R$KEaR)Tc? zyk+x|)CGhzV`KMt=E_d8vZ* zQZl~BW4Dm$@j@%4>|$rm@zw5K*n;;ye~%+dWrQjQe{zv(yvTpUsreaAQNgz z=6pEU*#ThE{q$9)lvs8q-LvV?BY~-0O_e_HGLL2HscBVP0H&mt>W-V-T}|>%_CnXt zcf9KwW-RAI(Fl=`no*_^>5DQZOEi|{r8;I~FXAQ7S)+xXAG)aCkz`sseX&?r4FB|Q zFqh)~ceK<$XSL1}K4K|4t>8wrWDRz*%H|lBSmt3zdE&;xaNh*TDB~_qUwM81e(IXi}N zY9vvi-lM+E8luNrzoeMyjYyMv&3pzgG#c`9^cYHP>txb*b9l!)7E!r+v4-r-GyzXf z!{kBNsQC3xkNTW7f!$Us!lz>x$73zrG*aj?)Md2JMg6dzW3gkhAd!16YdLB<5!5qh zrfn{{W^}nY)wil?8DddTFVsr-hs?Ze!U|@*rwuE$vN>@$sRr!!E<(r^<=>=YKr0SC zwDA&4!G!S=0#}?(*aA{;Y)7l2$vim3s+O_kk%$qSK2hRikeTlt4sMz66RDEL#^Lp9 z39p$+l?CA#%a^(NOd8q$qj_g}xR-N+HCCg##7JnF$*)e48xGEG3}w@q1(tMbX*g;c zwzKt_Vx`8YS4^ACt7)%mMb>%hpGtU`%&_M5c6K?9W79$HEOvj3nyFgntMOLf0$Jm^ zonZqPHXO1u!pSv)nahgN+}_D*CbP~@{UL+%PCnzzvzEDK)^5BCrNR(C2ZnuTRCDVU zUkW$Xs`D~uhE>WxlsIJAQX(;HzHd(r|)8pokyczgA(AFrV? zic>h!-FASlm$kp#YAMsX?SQ0sxNfx6YV7P+==9``b|p9a)Rw<1xn!J)9+n*$meJ!v zx+dAlB9Klnh23HUes?bTU`(ruNC@dVmfn^P zNH}d!(luo=KCXWnOxbqOKvFSjd=L9tv`OA;#`b(5D=4P1^Jyws$EfV|oR*}UD6lKs zovJ!Aj?;31jYYD@fa@tP+}y`#`Dq!o9>Gq7Bk>)_sk0o~ml)0&umBQa7^Yhqqt4pO zvn|+kEAFIJn{WNw=!YD}VhQJbvb$`1P`0Yp(iviN_qfmwh&CuQH-MsoLfI3q|J=!$u*WH zLFlv_f4g%!UqTeV6CrnM8R5hqW;GmNsKbajsTcNWLsDp3j71*&F$((cwMRZwS3;(n zhX5xa*u}Rd3 z*;?tKq@{JHh^f7=_l#O*h9aps(sSyHsxc@5GeXz&qAfxny8i2^$-gLCsks%+XO z@a*$+Z`Ys}=L(jirw5JU2$nhIkjkdcLp1R%YV3v;vUEusuX=SPaKSX&Yy@#X;ivr}rt< zi4B$3)lL(I&JE0NE}NN|4XX{!aJS20$-cTp#I z!hon{%@!xd#Yw5rDB5&)DcBgVBRcK$%yZj*V*i(b3(TL5ZUN`zhy-`1Wo;{*VAHD0 zR-@3_M#TNgoOV7v=7lD!tY>u75;;n!-S(8c5}9SjB=yG4YhOs=go2po$8&;hQFZla zlO@%Jf^Rjs+(uTqRquD|XrG42r3p55$62IHjnr^)qVEM79&gFVWN~4JUIA(RZ0^_? z2A7$u-$aF*+oO4&nbpWcGa^R{44`ZkNny4kEkr?@L`!bBlAV^LU5)1k*qOG=t35r& zEKcAJ0t{@lgSIf8@bwXRTGMnAS1EjZHhT|x%5`{brEL-`A=tdLI;jZ8Q0_9ntI}{! zJD<3?KpNAfe>YcKb;PG{9e!X!`^`D$MR_ zb$545x_iP(3C-3BvX4|+YBhJi66LzY`4(33u)EiGF{gP0JA9%21)Yh!6j~7byi{tO z0a2|brZQ-=rifT;*|!}!LE%)A*$=se;ouhSt}CD3 zsiL85G1>5gaQ^m;IG!P^N-{@AI4C{o`~=3O9UJXbMBTAokJBl9%4QpB-BKi@#Tb}u z7DmP=p7z{^1t~ECdE`e{H7zrtG&KjLb_c>nPLXw%R}YK?TGq-}K=p242#Kmn<0WZ4 zW0Q7wH9{doE<7{sS{!p+tmH~9i+q`XG6PDfwWzr>HH;{#yWL6C~J5J@q#PIc5I zA}x9r`(ul?a=IqemN;z93iScW2m)sldvVZ_C=me}d11~GL`1RzNPRSNPwsF=GafS& zLd3{fV52S9MirquLw*fKzvP}4P7&k-$lX0{wX?O*X0NgI~Fi30fk;gb~rsSG4taD)6q|xRPXm^(j zqblUEgb?tN)Mibj@x0SARPnA6^O;IBvn#EdOj>PGuti{7=c&gm?UZYl`r#=QJFL1b z88s(1{Y-{!O#;orLR8lbujGfTqr;vTv#)K-89m<-J!~P{J8D=H@SE0x8ZWoF(>6Xf zL3U4xE+s9qelWDC?Gn_SO?Kz#?p4NQRBYCYc?vOyd?rb3;8K&txOMkBe!svXn)EjD z&1G9_iwsNyY&v4DWTB~(q_993=f)(Xw#Y<*j$XSk#m=NmO~kO`Vv;h_Scy0(wqCP} zrDkH#1q~8Eon-KwZ5jo!(`hS-vfAR)_L(^^82KvGyN*J`DjhcU<4i9KG#d|0#ZA}J zW~;?d1ee>2O3ntGG#%Tl$;zq$C$U*%Yb!F~@G-LX^c-oq8fl4EDnylqDt{KqM@v;K zNw;2~ZJs#wHaJBiq?zFR$Ux+ISgqLP*@hc$%olE|C3QgrS8m+2W$nfd3l}cDD%hTJ z!=V$Tqk`?LoVxImogpX@@itPxJl4XTMXap@x9580Mb0^a>LNQCQ9d1kHiQ-O+jJ6b zW+9YWO~o(y;$f;#uli;ONmU6i`{mCdN4@eg{T9QvqPyg{^oIKs!{WY^jXXw5s}fHv z?y$3^$Wo>eQQ0`OFzeXR2~-FIDrdgV62SvQnBrD4T&=@@b+vkEeN-- z<7#nj9ZD)vIIuq9fr|@4x;%8s7h-SUeGNl%UAo?Ypy}?A;?^x7ANH9Hl71kqoqLTZ z-Eq9lNjx7G$6IKSqh4>-v|e#;ZXU!z29nQC|73&NI^Qb_0S(eSLCHL4#((ZZ70BUt zhTNv-sB=8KebQKl26_A`3cK%KP!{BdpZTpkl$LCVmRdW~t+9S(O2)?%hXr9V>RZ0~ z0%mwytp(makGU+;c^Avh!tN-~$24Vzq^qOTU(x*e*JWfiQn@fj#$;PHVcP&BkIx8< z!p(5Q>TT;3yX_`XgO|>_bRxX#*12)JhCT65RLev$y45L~p;DMMIXjAPOU1&KIG++W z<14YjMMKGR@6%5_^ODxd*9c}}1-(Q^A|i^r;X}4_#xO>q7ZXp5^zEC};_bC$24vpF zPSv^-CC(ipd0^jJz;F8Uk7o2BV4Q-PXrbuRD{OQmIlb9qa&@TZ)2mG0cK0wYH_lJn z)qvKBm#5CrlYU>&=`|TJ_8kcJ@m>^hNxL|GhMbzKnDsNHXjNvL!s_?QXWatHA}H+k zEXUXt(?Y3lPqm-E6SY-snSAb%6ESUJWwt)8Vaf)c9V8w{iZZdoYp%nDhzLUFi-fv= zZ~N!cf;e3<9j2wK=9>pA43x-NkaN9J1-0beQNdAEY?lPo7w?BDdON#WabMrHK?meikFJ7X>f|EqrVHm3r29xn}B-Ycu-Y?%* zf=&GrIHRu-ZVz_hAAv;uwEE1iC2e}D^}g9mjs?j)^piwf;5c4Y zn4`lNB0!dgXDnL0Xn4_?!)KfwE?&I!tR=&X&RVpHgu|C1Bs7=1(k)sNE?%_sd5caX z-=aC|`1)md3(}#1(@)_gTli|aF%@1|Wp!ShAdY6D7%t~i>g4XcF+Qs_!>h4Tw02$^E*U8{=WHtRv2ba44Qd_dNTp`CjTL9I zV`4v73|3aGSR9@kE(&=)ck!Z?E6xb#&9k4&SDdAvgL=GZ`Qk<4wb$BnrCBsYp2g%j zV`$l&7Y=W#V#qaz;~vMIP2a4N8m#j*1XN%pIfoMqD#b#LkBN)~Nt?t*)ZS*|W1^iiPrm zaH9F>gRJ*mIkoCIeW!p%@v*yATca>BNf_05ks42@N{dQM>;0otYCXKErfR7XzHLuL zp>=CuL@l9l_x5UHs@)qEmim4 zqfy{1j>qoK72&;dG!|7{Gi&uJ_Wi5;OYPxQR4dYGBQYFv_e5hVBI>9})AIyV!Lejh z7NqM`VegHu>2NXIh`Dk2Tc6rS<<`<*i!T%1IRX2*)M7C!yQ@2H;l6>l)jWnoVG3cX zk3s8gK7(UgC|+AM?ckVT8;f?=wIpTA!y|2Vna>{acg6jqeKvC^skb&jhX|@{f(f@P)CCDqGfK^&qJc z?rAsC0+T+8heXWen{3lk zNv}q$4z-yp)jR@?VVw-8U|;-+LZw5v_Aeu8{Mg<-XlI*uS77QCbK}k+@R~E3{86Qas*#S(%C2m4 zMI;!4v1s}nPMA(Pg_4^R?>jAqprs@ZH<4nY9rn1ptb~y8-{hkYq9|ZNC-M;D?0ip+ znDk1dW9Pg}1iQu}&6kVz?m>*Oh#F7jYG+OfO*0o-(y|)&8zt~CnTn6yG!>yI^i_pl z>P%JI92k(Hcw?ge=z}>8TaRNdHXt{vdvDCO5Ns7%f)H?qPz&V|TO|<^LXtSjn|ftC zX6muK_ufON%}R21kFx@*Q_@)zXj)ELksy+#$`Ke>NN>-OWC@WtbgY5+VOTjf#!7}D zIs{|Dw65hgeW;?VQ$7gA-1v0Fz%vp5fxhp6Lf_1 zzRq*e_2t|HE*#^6%pmhQ+)pe()^pI6CflW^zPX zu7Dfc`6*6~5M$WE7#Ped4cf>0!08p0m(7_GC~k6LblI=VYLS zjeVF1WBAJxmxrehI}2D&5;wAhM1D-NF$U$aoAy2&Y{IAr6LqKotHP0c?|~ihKSy?A zMzBFr0CSjuBn2it-?BpMHuHh|9CVnlxa}5sJU23rCMy^?X0n;_)sg{?=|>XDL~4pH zpJj6SPh{qK{9->Uo-9n#FAO`{Bv&a$TVyt}J4$0hhK7?WdV?7FgUWWo{J+(_u65At zNt^c2=91Y`U530jF&F+peM?Kttaq51op$RL9N;sR4l|2BMst?j@dq_4mHzurc7nq> z)~yC>Bn!57s1?a1GX5rJ1N1{F6%a)>B}dv4RY)`zI%WS7j`bAaT(?<|*0L~}CGm`4 z9f)9*0-4fE(h1|-6yum2>)~dRTgr8;V{Pp_j@3}!dr#UNTm!Z286Q5oQynP6woQOo z3^dy%B&%G%Ea5hJwH(E>4$0=Va+FoAP9rpG(p8x?uC?A&S1UOM#3&f+gJcQUUcjbF zZYqo>nw+F#^2KPLC9A8%gyCxc>C?=GnYidKQEiHOm4T{No2Y3bpdkb!9;+RE2m|w$ z;WnsM%|K|Ei^)6InBtCo9UF3q*I;ge+odw2|GO%41CljLI)sa4no&@RDpB?r5#N5l z;%)~QNHOp|rWBh(1txT=h-uaiUF?p1=t}IZthV&9_{IAXOlNf^g+cJCD4A)_nUgs0 zK+h`Ea-7qlS3!vZK?&Xc%a|8E%a51evi&+1-n}ZyB=(E#Ua6d&&1$UI%UX3rt{D+V zL0I)N)3wNwA$FJ;xzMe>^0qiKY9~zW$QpYy|^4+EV$cfd-W`r&smPpiI*B=jsfn;6h^|)2p;hBJ3hgAApuU zt8Fz}Zr1i~Sds$o1BRX1A53wyWgX*k7PBKMz_K8%_g$4EX`X{o6^GKBE8R-lc;4Ao zeT(g#QvOJZy1o^liEZ)d$Hes1bZ+R8s@H&^cZo5xwb(3ku*jThnZ3o2Jk!L~Ik1lw?U#JaR4_w6v1htSPZP3I&-f+E z-7?!2pyuc9%ioi2x5`emYG0aXQ_2-uZ|hi`8FcY<(J%ErfimbxYD$cVKJ2C4VLJ}a zvB8~e*CV!yl+17E8^;i6-K9RJYcOn4%~(Gr`xew|bcsV^4}qgty-~AYnLCw(pBB@d zWZCxnb9TB^usLUZ^PyzlG3`p1Q3o63Tyb80BrA(wOnC1b@#_mK)bqe7d--w{WKQIn znlxt@(;ouBU zhU8$M-b9$T>tglyDiGGpCMJBCtx%g9PTNX|q3!K#Z)P~Fl4@C7guVMx#ms&b*kOaDkJeV$!nKRi|NdS-J7t8`~ZVPVQ&t(f}@9= zzj3zZ`NN8O7q?N1;x7J$i){9{W^N{;(9SZNeZhVBxK|r`B~1wQ$Ei6kZpLn8gq;(? zexC+~r_ckp%H_}`+|7mYhFtWDA<(4JXpx|%I3YD%zRaTF?n2zsI`(Jnhn&ka)-Q(o2@0o`G9*p6axw-}A|I!d z)e6|84KCKFe$KLUE?d#Lh$q|rX7(iUDk`(!aLtcZ)wEV%CdG`NITNb)ob`ocN23Vq zj%VO<-%Pg;odiTouL*rfAcWH)7BbLB0;erXj+5%sp8YP*pEvc#DlR^ds&{#tWKdfl z$1RM=O~ZE9$t965(O=e%8)55v_pos`rJX5}saHxX%64W`SEk!6u{ZK6vU_eZO>yB; zGv(?SLd3gVF~}6M6Ku9%7t<4Jgwpw~ChZ)?D*!esGxk6Gl9xIkQs}pP@myOu@Pq43 zzmu#e-rAVi&QjRTHh-X%4|b8BZ!fhj$hTGIj1X;3IR)-^*1~}+aaltzYx2NVwzX9& z?A-&Gr~94gf1MTYx5OlA-P~&7WX2kbZ!y-pd+uBvtxPOTvcbE*PUvk(I8ApEMv567 z*xoX?{gt~hRV(f+VqD}hSsAS~UW#bP0(xw1si~1L-tu)LFwr_dN8xIFpxQ1YhY;h*<5_-{^W4SZS8N4v(M_zk>#8o zJfmfU3kd1#j74JEAzTvROd9^_Oo2DveBZsj553cBBDH3CCBI+CP{fsJpVe_m&)3Ox z>YaO{)WXwYYN;c8%v}mvE5IsAXotmDrCb=d0(IpA)~2p$vlPdbY; z^S1vO_$a*v*|t%`G!=y5D!Z$icRrhrPA0K_`|2hCD+`-+9F&R#Ayy0htuNgOV{dA2 znaBQUu#VER>@}&a7zN7~8{XBr4T?=hc|22H^P1`C_ZgAdu|SqzB9+J(7@gE(_uC8T zdUb?3>7|C0ksDyBq_q($M*$r=EXZwvEB?R-lJNafvFOxFR~|+#9dMc#j}-e?Nl84G zxbB(XigVI@lCMNsHO5JaeQZV~RhV{}+GNj`ij$P7bw_g4nAuCw!hO_{M11^zP%4`# zzT?CubdUrp#Fo4nP;$4Ll@^*5dnz!Wb zU>hf5vVq04^?DwW;J1g3P+G@1X>Z$$u}qH?E6h5@$k=UwUBG(d?mU4fwlk(f&1_BM zEe=c!eFZHqRT4kwb71Hz<}8WAl>`~o8E2CW1QQ-fnfSTP^GYrIlgEcRcDIjjzL@ns z_|mOIoK56b9I}ZLLtf<1n1!1ezN2rf{FOe_F#G0{u3la@7pOHQFy5J&rNQ5+4W z-R+h)bor?&rkRGgoGhf;zv@9!$-QvO1sjP}1TeO1Ef=>-7+_?P<2eS9Hg!dg2YWxp z7pDHdG157daSNujYothQ70BXL-bNQC&PN>a-cWb$Byvc+>y>0$46z%&Ed-aTEym$$ zJB#`xFuOBJcXO56x$&hV#P@K>%sre&oLU{fE?Yd~p}tHdWPKI|WLr3CVeBnWjie*S z07iH{ax2dX&WLJz?H@aXT~R(b7!Bk;8;MC8w}sP@V11{+6cXu%onuxqLqzoR-aT+A z(#f$OrUbiv*e?ECh@ztNk)kmV&z#D+W>}r2Y~nZeXO}N^?)VMCHUT*u;b^94HR=lQ zFcLAG9UD+dgorUmk06~Dw#Z3LY#-97GVx=lu50giQb-SH2EZT|*Q01v-ngJ1<58^> z#m;G9O1}p8D%=#s!0A%jJ>!NXcnNwVBsTrB#&t{@MqAhTk}c>aCIX>$YNT^su@vnL z#On^{tYnQ4M~eOw&vd}=#~YW>c}J`qf~XBsS10Asm>wn=N1T9>dpTfWeN9 z^Ce*+%GhTjP!;+pwI_+lwtfxRf62ljV!hkxW|rRh=9{-Go{UlUR6Ccnk9W?! z?9t{nUymhW{n@3OHK?1#o#h&*c3(1t7;Ce zBT^$(NZ3TSI@e6$7!_{^>B9ki7m$3`m>Wi`3R;RiVT2de(vPBbv^A zFra-GFX9Kb^Z%73D=t<)R-*oQNpyiVdT609(&{kRYB(qj7Sk{rx;n&vuFU3Qy0sW5 z>Yyj|mqSTcGxIW<cm7-40j0fQIR`tg=urTh2v< z){};f{sy06@Bw&2!i)q%i2Cr5jA%?gQjvGWN#u;@nE5rUEIMhAx~X1#OIl+5TQU5N?i2BU2QrhZQoKpXsM(8KiO#%yeB&jel= zv8AbK8+sQz4r7BqElXV2>Wmvzro;;u=g2G(Bn0@{!{Q5Uap8~UgBN`WE9WeE&XVo7 zUq!g~>?^-!dfJDiTI+6~Dj7FB_74r{7q431AmdP|Zc6pZn0`8!_D}1PX_d7sasUQ5 zv)0*L)G=ZXh-m~>)eO1&RM`fBIbdbRgOymvoG|7-4R(`Gm3P{+5IIfECxepQldL=% z2#rpQg&hh-%q9L6zjQYm@L$PiH=FU{Wd93t`(`;lM9?g{90~M*CH|0gdv@QN2 zqRH)KB3)^@9V8gr?#|N_hc!9pOt0n)>i^x^N8#>-K}BHnNKGp|7+(e2Y<-&1(5i{2(sXC`cx(A4D2NCm@*FnYNA5$B?b7ckSz1!1F@e%}vwo0^Rm_FMV94`sqWV^7hM8bFE9 zCw89GCOAJ1eboSX$$+;aTUv*!+FL>DRMyMOXYW!|g>k-&O54#tr;nJx1;-cOd?zx+ z8EF;i^ZhGeVH)g4t&AsD5J&J#_|p#3$jKR;jXD8w)g|Zq0}v_0?;K1{RqL(5Mnz{J zQogC8SdD5i!cl*9g`W+i=b8-!oP^k22$tG*&R?`9CTlxeIZ{YP>ym~%L>(>#J6NHh zV`;EjylXX+I6zTx(plDH;#(7Vzh>9L3f;PrnoUM=&XYTlik0{zu9VzVGPXqWIge(K zyxH*3R`LlhI=US2AKkL6WXDVJAD`Lbhy+&1i{i+cwHe(v{zd2R(zIfYY%;#YC&=~b z$0mw~YE3)}wAq$~J}4p*kp^TFt2ue3tquTMDmc(Xe_eTsFxy-Jh~|7W94H3^Vc$lq>z z4k5*-3<^Jt_MO5x(Rv-xG|)FQ0nyF{6@Tf_C#Cme%+!)8)V)Q&(pE=Y5hwPT_SicO zx`_}HP0!c9tn(#-_VLx(-MfybzS67Q z@iOMH^8~Oqc^lc{`V&tt7LC&!$qo_D8AW*;eKJd?>=fINv@=b%eHBx~ys=X)kVXDu z{wRol#<3CI?X2eG6wI&q=WG(Ymi9j;(zT#pNjC8r0J*7c*@WPYkGI%oGvd=D%_d<{ zF=JuGVrxN-fu@L7`}QvIya)$cz^V8jan-c1W?ZDiHP^XBvIE>nv$hkW{`BGExg(dnWh z(1y-It}i|URSwnSLz1+t(U)Y*$A)Bpl#&^Oj!Sb9>P_ck*z|Vp<2ZoMHLjx%Jv4iK zJPTFxtw`**jGx;1RYdH`4}~?Y$Pk_IAZl~?RLQIh>=b>mO}oa?0kOA{y-wRG>-ydz zo?L!lWKH`oTL=_emJdCa-ujCq+u;EKq8l%3#QA>T?iy3uzC}FBH4hTl^Iu#44fHk zEl&rx73WrizR|Y-o^2;5=jkZRJbdSqaHN?GuaMma9bw5Yb^Ecq#YBmUG?!^SF$#JW z@5Qn6HG|62)Q!WaoaD5<6e}RR09JvPG}R5M-icGk1;t;W!D!kQrT3{Gp`c`%`;8D} zKT6ItT<=%QXLz@%-@EOcEXi?}92`rPS\n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: Poland\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Nieoczekiwany atrybut \"%s\" dla elementu \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Nie odnaleziono atrybutu \"%s\" dla elementu \"%s\"" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Nieoczekiwany znacznik \"%s\", oczekiwano znacznika \"%s\"" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Nieoczekiwany znacznik \"%s\" wewnątrz \"%s\"" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Nie można odnaleźć prawidłowego pliku zakładek w katalogach danych" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Zakładka dla adresu URI \"%s\" już istnieje" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nie odnaleziono zakładki dla adresu URI \"%s\"" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Nie zdefiniowano typu MIME w zakładce dla adresu URI \"%s\"" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nie zdefiniowano prywatnej flagi w zakładce dla adresu URI \"%s\"" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nie ustawiono grup w zakładce dla adresu URI \"%s\"" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Å»aden program o nazwie \"%s\" nie zarejestrował zakładki dla \"%s\"" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Rozwinięcie wiersza exec \"%s\" z adresem URI \"%s\" się nie powiodło" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" +"Konwersja z zestawu znaków \"%s\" na zestaw \"%s\" nie jest obsługiwana" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nie można otworzyć konwertera z \"%s\" na \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Nieprawidłowa sekwencja bajtów na wejściu konwersji" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Błąd podczas konwersji: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Na końcu wejścia występuje sekwencja odpowiadająca części znaku" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Nie można przekonwertować napisu zastępczego \"%s\" na zestaw znaków \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Adres URI \"%s\" nie jest bezwzględnym adresem URI, używającym schematu " +"\"plikowego\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Adres URI lokalnego pliku \"%s\" nie może zawierać znaku \"#\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Adres URI \"%s\" jest nieprawidłowy" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Nazwa komputera w adresie URI \"%s\" jest nieprawidłowa" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Adres URI \"%s\" zawiera nieprawidłowe znaki sterujące" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ścieżka \"%s\" nie jest ścieżką bezwzględną" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nieprawidłowa nazwa komputera" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Wystąpił błąd podczas otwierania katalogu \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nie można przydzielić %lu bajtów do odczytu pliku \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Wystąpił błąd podczas odczytu pliku \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Plik \"%s\" jest za duży" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Odczytanie z pliku \"%s\" się nie powiodło: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Otwarcie pliku \"%s\" się nie powiodło: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Uzyskanie atrybutów pliku \"%s\" się nie powiodło: funkcja fstat() zwróciła " +"błąd: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" +"Otwarcie pliku \"%s\" się nie powiodło: funkcja fdopen() zwróciła błąd: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Zmiana nazwy pliku \"%s\" na \"%s\" się nie powiodła: funkcja g_rename() " +"zwróciła błąd: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Utworzenie pliku \"%s\" się nie powiodło: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Otwarcie pliku \"%s\" do zapisu się nie powiodło: funkcja fdopen() zwróciła " +"błąd: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" +"Zapisanie pliku \"%s\" się nie powiodło: funkcja fwrite() zwróciła błąd: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" +"Zapisanie pliku \"%s\" się nie powiodło: funkcja fflush() zwróciła błąd: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" +"Zapisanie pliku \"%s\" się nie powiodło: funkcja fsync() zwróciła błąd: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" +"Zamknięcie pliku \"%s\" się nie powiodło: funkcja fclose() zwróciła błąd: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Nie można usunąć istniejącego pliku \"%s\": funkcja g_unlink() zwróciła " +"błąd: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Szablon \"%s\" jest nieprawidłowy, nie powinien on zawierać \"%s\"" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Szablon \"%s\" nie zawiera XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtów" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Odczytanie dowiązania symbolicznego \"%s\" się nie powiodło: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Dowiązania symboliczne nie są obsługiwane" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nie można otworzyć konwertera z \"%s\" na \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Nie można wykonać surowego odczytu w zmiennej g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "W buforze odczytu pozostały nieprzekonwertowane dane" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Na końcu kanału występuje sekwencja odpowiadająca części znaku" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nie można wykonać surowego odczytu w zmiennej g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" +"Otwarcie pliku \"%s\" się nie powiodło: funkcja open() zwróciła błąd: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" +"Zmapowanie pliku \"%s\" się nie powiodło: funkcja mmap() zwróciła błąd: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Błąd w wierszu %d przy znaku %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" +"Nazwa zawiera nieprawidłowy tekst zakodowany za pomocą UTF-8 - nieprawidłowe " +"\"%s\"" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" nie jest prawidłową nazwą " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" nie jest prawidłową nazwą: \"%c\" " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Błąd w wierszu %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nie można przetworzyć znaku \"%-.*s\", w miejscu którego powinna wystąpić " +"liczba, będąca częścią odniesienia do znaku (np. ê) - być może liczba " +"jest za duża" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Odniesienie do znaku nie jest zakończone średnikiem; najprawdopodobniej " +"został użyty znak &, który nie miał oznaczać jednostki - należy go zapisać " +"jako &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Odniesienie do znaku \"%-.*s\" nie jest zapisem dozwolonego znaku" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Napotkano pustą jednostkę \"&;\"; poprawnymi jednostkami są: & " " +"< > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nazwa jednostki \"%-.*s\" nie jest znana" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Jednostka nie jest zakończona średnikiem; najprawdopodobniej został użyty " +"znak &, który nie miał oznaczać jednostki - należy go zapisać jako &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument musi rozpoczynać się jakimś elementem (np. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Znak \"%s\" nie powinien występować po znaku \"<\"; nie może on rozpoczynać " +"nazwy elementu" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Nieoczekiwany znak \"%s\", oczekiwano znaku \">\", by zakończyć znacznik \"%s" +"\" pustego elementu" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Nieoczekiwany znak \"%s\"; po nazwie atrybutu \"%s\" elementu \"%s\" " +"oczekiwano znaku \"=\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Nieoczekiwany znak \"%s\"; oczekiwano znaku \">\" lub \"/\", kończącego " +"znacznik początkowy elementu \"%s\" lub opcjonalnie atrybutu; być może w " +"nazwie atrybutu został użyty nieprawidłowy znak" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Nieoczekiwany znak \"%s\"; oczekiwano otwierającego znaku cudzysłowu po " +"znaku równości podczas podawania wartości atrybutu \"%s\" elementu \"%s\"" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Znak \"%s\" nie jest znakiem, który może wystąpić po domykającej nazwie " +"elementu \"%s\"; dopuszczalnym znakiem jest \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" +"Element \"%s\" został zamknięty, lecz brak aktualnie otwartego elementu" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Element \"%s\" został zamknięty, lecz aktualnie otwartym elementem jest \"%s" +"\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument jest pusty lub zawiera tylko spacje" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Zaraz po znaku \"<\" nastąpił nieoczekiwany koniec dokumentu" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu, gdy pewne elementy są wciąż otwarte " +"- \"%s\" był ostatnim otwartym elementem" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu; oczekiwano znaku \">\", kończącego " +"znacznik <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz nazwy elementu" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz nazwy atrybutu" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu wewnątrz znacznika otwierającego " +"element." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu po znaku równości występującym po " +"nazwie atrybutu; brak wartości atrybutu" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz wartości atrybutu" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu wewnątrz znacznika domykającego " +"elementu \"%s\"" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu wewnątrz komentarza lub instrukcji " +"przetwarzania" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "uszkodzony obiekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "błąd wewnętrzny lub uszkodzony obiekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "brak pamięci" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "osiągnięto limit wyjątku" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "wzorzec zawiera elementy nieobsługiwane w dopasowywaniu częściowym" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "błąd wewnętrzny" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"referencje wstecz jako warunki nie są obsługiwane w dopasowywaniu częściowym" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "osiągnięto limit rekurencji" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "osiągnięto limit pustych ciągów w przestrzeni roboczej" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "nieprawidłowa kombinacja flag nowych linii" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "nieznany błąd" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ na końcu wzoru" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c na końcu wzoru" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "nierozpoznany znak po \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"znaki sterujące zmieniające wielkość liter (\\l, \\L, \\u, \\U) nie są " +"dozwolone w tym miejscu" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "liczby w operatorze {} nie są w kolejności" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "liczba za duża w kwantyfikatorze {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "brak kończącego znaku \"]\" dla klasy znaku" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "nieprawidłowa sekwencja sterująca w klasie znaku" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "zakres klasy znaków nie jest w kolejności" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nic do powtórzenia" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "nierozpoznany znak po \"(?\"" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "nierozpoznany znak po \"(?<\"" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "nierozpoznany znak po \"(?P\"" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Klasy nazwane z użyciem POSIX są obsługiwane tylko wewnątrz klasy" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "brak znaku kończącego \")\"" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "znak \")\" bez znaku otwierającego \"(\"" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "po (?R lub (?[+-]cyfry musi następować znak )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "nawiązanie do nieistniejącego podwzoru" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "brakujący znak \")\" po komentarzu" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "za duże wyrażenie zwykłe" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "uzyskanie pamięci się nie powiodło" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "asercja \"lookbehind\" nie ma stałej długości" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "błędna liczba lub nazwa za (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "zależna grupa zawiera więcej niż dwie gałęzie" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "za (?( oczekiwano asercji" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nieznana nazwa klasy POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "elementy porównujące POSIX nie są obsługiwane" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "wartość typu \"character\" w sekwencji \\x{...} jest zbyt duża" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "nieprawidłowy warunek \"(?(0)\"" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "znak \\C nie jest dozwolony w asercji \"lookbehind\"" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "wywołanie rekurencyjne mogło prowadzić do pętli nieskończonej" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "brak terminatora w nazwie podwzoru" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dwa podwzory mają tę samą nazwę" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "błędna sekwencja \\P lub \\p" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nieznana nazwa właściwości za \\P lub \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nazwa podwzoru jest za długa (maksymalnie 32 znaki)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "za dużo nazwanych podwzorów (maksymalnie 10000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "wartość ósemkowa jest większa niż \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "grupa DEFINE zawiera więcej niż jedną gałąź" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "powtarzanie grupy DEFINE nie jest dozwolone" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "niespójne opcje NEWLINE" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"po \\g nie następuje nazwa w nawiasach lub opcjonalna, niezerowa liczba w " +"nawiasach" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "nieoczekiwane powtórzenie" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "przepełnienie kodu" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "przekroczono przestrzeń roboczą kompilacji" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "nie znaleziono wcześniej sprawdzonego podwzorca" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Błąd podczas dopasowywania wyrażenia regularnego %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteka PCRE została skompilowana bez obsługi UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Biblioteka PCRE została skompilowana bez obsługi własności UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Błąd kompilacji wyrażenia regularnego %s przy znaku %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Błąd podczas optymalizowania wyrażenia regularnego %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "oczekiwano cyfry szesnastkowej lub znaku }" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "oczekiwano cyfry szesnastkowej" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "brak znaku \"<\" w odniesieniu symbolicznym" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "niezakończona referencja symboliczna" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referencja symboliczna o zerowej długości" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "oczekiwano cyfry" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "niedozwolona referencja symboliczna" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "pominięto końcowe '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "nieznana sekwencja sterująca" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Błąd podczas przetwarzania tekstu zastępczego \"%s\" przy znaku %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Cytowany znak nie rozpoczyna się znakiem cytowania" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"W wierszu poleceń lub innym napisie cytowanym jak w powłoce wystąpił " +"niesparowany znak cytowania" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Tekst zakończył się bezpośrednio po znaku \"\\\" (wartością tekstu było \"%s" +"\")." + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Tekst zakończył się przed odnalezieniem domykającego znaku cytowania dla %c " +"(tekstem jest \"%s\")" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst jest pusty (lub zawiera tylko spacje)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Odczytanie danych z procesu potomnego się nie powiodło" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Utworzenie potoku do komunikacji z procesem potomnym (%s) się nie powiodło" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" +"Odczytanie danych z potoku łączącego z procesem potomnym (%s) się nie " +"powiodło" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Zmiana katalogu na \"%s\" (%s) się nie powiodła" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Wykonanie procesu potomnego (%s) się nie powiodło" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nieprawidłowa nazwa programu: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Nieprawidłowy ciąg w wektorze parametrów w %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nieprawidłowa sekwencja w środowisku: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nieprawidłowy katalog roboczy: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Wykonanie programu pomocniczego (%s) się nie powiodło" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Podczas odczytu danych z procesu potomnego w g_io_channel_win32_poll() " +"wystąpił nieznany błąd" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Odczytanie danych z procesu potomnego (%s) się nie powiodło" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Nieoczekiwany błąd w funkcji select() podczas odczytywania danych z procesu " +"potomnego (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Nieoczekiwany błąd w funkcji waitpit() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Rozdzielenie procesu (%s) się nie powiodło" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Wykonanie procesu potomnego \"%s\" (%s) się nie powiodło" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Przekierowanie wejścia lub wyjścia procesu potomnego (%s) się nie powiodło" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Rozdzielenie procesu potomnego (%s) się nie powiodło" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Podczas wykonywania procesu potomnego \"%s\" wystąpił nieznany błąd" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Odczytanie odpowiedniej liczby danych z potoku procesu potomnego (%s) się " +"nie powiodło" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak jest poza zakresem dla UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Nieprawidłowa sekwencja na wejściu konwersji" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak jest poza zakresem dla UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Użycie:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCJA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcje pomocy:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Wyświetla opcje pomocy" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Wyświetla wszystkie opcje pomocy" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcje programu:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nie można przetworzyć wartości całkowitej \"%s\" dla %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Wartość całkowita \"%s\" dla %s jest spoza dopuszczalnego zakresu" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nie można przetworzyć podwójnej wartości liczbowej \"%s\" dla %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" +"Podwójna wartość liczbowa \"%s\" dla %s jest spoza dopuszczalnego zakresu" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Błąd podczas przetwarzania opcji %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Brak parametru dla %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Nieznana opcja %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Nie można odnaleźć prawidłowego pliku klucza w przeszukiwanych katalogach" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "To nie jest zwykły plik" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Plik jest pusty" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Plik klucza zawiera wiersz \"%s\", który nie jest parą klucz-wartość, grupą " +"lub komentarzem" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nieprawidłowa nazwa grupy: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Plik klucza nie rozpoczyna się od grupy" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nieprawidłowa nazwa klucza: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Plik klucza zawiera nieobsługiwane kodowanie \"%s\"" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Plik klucza nie zawiera grupy \"%s\"" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Plik klucza nie zawiera klucza \"%s\"" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Plik klucza zawiera klucz \"%s\" o wartości \"%s\", która nie jest zapisana " +"w UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Plik klucza zawiera klucz \"%s\", który ma wartość niemożliwą do " +"zinterpretowania." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Plik klucza zawiera klucz \"%s\", który ma wartość niemożliwą do " +"zinterpretowania." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Plik klucza zawiera klucz \"%s\" w grupie \"%s\", która ma wartość " +"niemożliwą do zinterpretowania." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Plik klucza nie zawiera klucza \"%s\" w grupie \"%s\"" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Plik klucza zawiera znak sterujący na końcu linii" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Plik klucza zawiera nieprawidłową sekwencję sterującą \"%s\"" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nie można zinterpretować \"%s\" jako liczby." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Wartość całkowita \"%s\" jest spoza dopuszczalnego zakresu" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Nie można zinterpretować \"%s\" jako liczby zmiennoprzecinkowej." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Nie można zinterpretować \"%s\" jako wartości logicznej." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Za duża wartość licznika przekazana do %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Potok jest już zamknięty" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Działanie zostało anulowane" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Nieprawidłowy obiekt, nie zainicjowano" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Niepełna sekwencja wielu bajtów na wejściu" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Brak wystarczającej ilości miejsca w miejscu docelowym" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Zainicjowanie, które można anulować nie jest obsługiwane" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Nieznany typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "typ pliku %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Nieoczekiwany, przedwczesny koniec potoku" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Bez nazwy" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Plik .desktop nie określa pola Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Nie można odnaleźć terminala wymaganego przez program" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Nie można utworzyć katalogu użytkownika dla konfiguracji programu %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nie można utworzyć katalogu użytkownika dla konfiguracji MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nie można utworzyć pliku .desktop dla użytkownika %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Własna definicja dla %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "napęd nie obsługuje wysunięcia" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "napęd nie obsługuje wysunięcia lub \"eject_with_operation\"" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "napęd nie obsługuje wykrywania nośnika" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "napęd nie obsługuje rozpoczęcia" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "napęd nie obsługuje zatrzymania" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nie można obsłużyć wersji %d kodowania GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Błędna liczba elementów (%d) w kodowaniu GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nie można obsłużyć wersji %d kodowania GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Błędna liczba elementów (%d) w kodowaniu GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Oczekiwano obiektu GEmblem dla GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Działanie nie jest obsługiwane" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Nie istnieje zawierające montowanie" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Nie można skopiować na katalog" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Nie można skopiować katalogu na katalog" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Plik docelowy istnieje" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Nie można skopiować katalogu rekurencyjnie" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Wywołanie \"splice\" nie jest obsługiwane" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Błąd podczas dzielenia pliku: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Nie można skopiować pliku specjalnego" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Wprowadzono nieprawidłową wartość dowiązania symbolicznego" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Kosz nie jest obsługiwany" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nazwy plików nie mogą zawierać \"%c\"" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "wolumin nie obsługuje montowania" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Å»aden program nie jest zarejestrowany do obsługi tego pliku" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator jest zamknięty" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Enumerator plików ma zaległe działanie" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Enumerator plików jest już zamknięty" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nie można obsłużyć wersji %d kodowania GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Błędny format danych wejściowych dla GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Potok nie obsługuje działania query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Szukanie nie jest obsługiwane przez potok" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Skracanie nie jest dozwolone na potoku wejściowym" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Skracanie nie jest dozwolone na potoku" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Błędna liczba elementów (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Brak typu dla nazwy klasy %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typ %s nie obsługuje interfejsu GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s nie jest klasowy" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Błędny format numeru wersji: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Typ %s nie obsługuje metody from_tokens() z interfejsu GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Nie można obsłużyć podanej wersji kodowania ikony" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Potok wejściowy nie obsługuje odczytu" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Potok ma zaległe działanie" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Brak wystarczającej ilości miejsca dla adresu gniazda" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nieobsługiwany adres gniazda" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Nie można odnaleźć domyślnego typu monitora katalogu lokalnego" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nieprawidłowa nazwa pliku %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Błąd podczas pobierania informacji o systemie plików: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Nie można zmienić nazwy katalogu głównego" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Błąd podczas zmieniania nazwy pliku: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Nie można zmienić nazwy pliku, plik o takiej nazwie już istnieje" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nieprawidłowa nazwa pliku" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Błąd podczas otwierania pliku: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Nie można otworzyć katalogu" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Błąd podczas usuwania pliku: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Błąd podczas przenoszenia pliku do kosza: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nie można utworzyć katalogu kosza %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Nie można odnaleźć głównego katalogu dla kosza" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Nie można odnaleźć lub utworzyć katalogu kosza" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nie można utworzyć pliku informacji o koszu: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nie można przenieść pliku do kosza: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Błąd podczas tworzenia katalogu: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "System plików nie obsługuje dowiązań symbolicznych" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Błąd podczas tworzenia dowiązania symbolicznego: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Błąd podczas przenoszenia pliku: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Nie można przenieść katalogu na katalog" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Utworzenie pliku kopii zapasowej się nie powiodło" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Błąd podczas usuwania pliku docelowego: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Przenoszenie między zamontowanymi udziałami nie jest obsługiwane" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Wartość atrybutu nie może być pusta" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"string\")" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nieprawidłowa nazwa rozszerzonego atrybutu" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Błąd podczas ustawiania rozszerzonego atrybutu \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Błąd podczas wyznaczania pliku \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (nieprawidłowe kodowanie)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Błąd podczas wyznaczania deskryptora pliku: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"uint32\")" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"uint64\")" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"byte string\")" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Nie można ustawić uprawnień na dowiązaniach symbolicznych" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Błąd podczas ustawiania uprawnień: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Błąd podczas ustawiania właściciela: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "dowiązanie symboliczne nie może być puste" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Błąd podczas ustawiania dowiązania symbolicznego: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Błąd podczas ustawiania dowiązania symbolicznego: plik nie jest dowiązaniem " +"symbolicznym" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Błąd podczas ustawiania czasu modyfikacji lub dostępu: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Kontekst SELinux nie może być pusty" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Błąd podczas ustawiania kontekstu SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nie jest włączony w tym systemie" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Ustawianie atrybutu %s nie jest obsługiwane" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Błąd podczas odczytywania z pliku: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Błąd podczas wyszukiwania w pliku: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Błąd podczas zamykania pliku: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Nie można odnaleźć domyślnego typu monitora pliku lokalnego" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Błąd podczas zapisywania do pliku: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Błąd podczas usuwania odnośnika do starej kopii zapasowej: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Błąd podczas tworzenia kopii zapasowej: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Błąd podczas zmieniania nazwy pliku tymczasowego: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Błąd podczas skracania pliku: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Błąd podczas otwierania pliku \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Plik docelowy jest katalogiem" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Plik docelowy nie jest zwykłym plikiem" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Plik został zmieniony poza programem" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Błąd podczas usuwania starego pliku: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Podano nieprawidłowy obiekt GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Nieprawidłowe żądanie wyszukiwania" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nie można skrócić GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Potok wyjściowy pamięci nie obsługuje zmiany rozmiaru" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Zmiana rozmiaru potoku wyjściowego pamięci się nie powiodła" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Ilość pamięci wymagana dla przetworzenia zapisu jest większa, niż dostępna " +"przestrzeń adresowa" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Zażądano przejścia przed początkiem potoku" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Zażądano przejścia poza koniec potoku" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "montowany obiekt nie obsługuje odmontowania" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "montowany obiekt nie obsługuje wysunięcia" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"montowany obiekt nie obsługuje odmontowania lub \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "montowany obiekt nie obsługuje wysunięcia lub \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "montowany obiekt nie obsługuje ponownego montowania" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "montowany obiekt nie obsługuje rozpoznania typu zawartości" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"montowany obiekt nie obsługuje synchronicznego rozpoznania typu zawartości" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nazwa komputera \"%s\" zawiera \"[\", ale nie \"]\"" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Potok wyjściowy nie obsługuje zapisu" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Potok źródłowy jest już zamknięty" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Wystąpił błąd rozwiązywania \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Błąd podczas odwrotnego rozwiązywania \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nie odnaleziono wpisu usługi dla \"%s\"" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Nie można tymczasowo rozwiązać \"%s\"" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Błąd podczas rozwiązywania \"%s\"" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Nieprawidłowe gniazdo, nie zainicjowano" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Nieprawidłowe gniazdo, zainicjowanie się nie powiodło z powodu: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Gniazdo jest już zamknięte" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "tworzenie GSocket z fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nie można utworzyć gniazda: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Określono nieznany protokół" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "nie można uzyskać lokalnego adresu: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "nie można uzyskać zdalnego adresu: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "nie można nasłuchiwać: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Błąd podczas dowiązywania do adresu: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Błąd podczas akceptowania połączenia: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Błąd podczas łączenia: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Trwa połączenie" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Błąd podczas połączenia: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nie można uzyskać oczekującego błędu: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Błąd podczas pobierania danych: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Błąd podczas wysyłania danych: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Błąd podczas zamykania gniazda: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Oczekiwanie na warunek gniazda: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Błąd podczas wysyłania komunikatu: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage nie jest obsługiwane w Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Błąd podczas pobierania komunikatu: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Nieznany błąd połączenia" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Nasłuch jest już zamknięty" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Dodane gniazdo jest zamknięte" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nie można obsłużyć wersji %d kodowania GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Oczekiwano jeden komunikat kontrolny, otrzymano %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Nieoczekiwany typ podrzędnych danych" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Oczekiwano jedno fd, otrzymano %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Pobrano nieprawidłowe fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Błąd podczas odczytywania z Uniksa: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Błąd podczas zamykania Uniksa: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Katalog główny systemu plików" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Błąd podczas zapisywania do Uniksa: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Abstrakcyjne adresy gniazd domen Uniksa nie są obsługiwane w tym systemie" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "wolumin nie obsługuje wysunięcia" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "wolumin nie obsługuje wysunięcia lub \"eject_with_operation\"" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nie można odnaleźć programu" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Błąd podczas uruchamiania programu: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Adresy URI nie są obsługiwane" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "zmiany skojarzeń nie są obsługiwane w win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Tworzenie skojarzeń nie jest obsługiwane w win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Brak wystarczającej ilości pamięci" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Błąd wewnętrzny: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Wymagane jest danych wejściowych" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Nieprawidłowe skompresowane dane" diff --git a/po/po2tbl.sed.in b/po/po2tbl.sed.in new file mode 100644 index 0000000..b3bcca4 --- /dev/null +++ b/po/po2tbl.sed.in @@ -0,0 +1,102 @@ +# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets +# Copyright (C) 1995 Free Software Foundation, Inc. +# Ulrich Drepper , 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +1 { + i\ +/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\ +\ +#if HAVE_CONFIG_H\ +# include \ +#endif\ +\ +#include "libgettext.h"\ +\ +const struct _msg_ent _msg_tbl[] = { + h + s/.*/0/ + x +} +# +# Write msgid entries in C array form. +# +/^msgid/ { + s/msgid[ ]*\(".*"\)/ {\1/ + tb +# Append the next line + :b + N +# Look whether second part is continuation line. + s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ +# Yes, then branch. + ta +# Because we assume that the input file correctly formed the line +# just read cannot be again be a msgid line. So it's safe to ignore +# it. + s/\(.*\)\n.*/\1/ + bc +# We found a continuation line. But before printing insert '\'. + :a + s/\(.*\)\(\n.*\)/\1\\\2/ + P +# We cannot use D here. + s/.*\n\(.*\)/\1/ +# Some buggy seds do not clear the `successful substitution since last ``t''' +# flag on `N', so we do a `t' here to clear it. + tb +# Not reached + :c + x +# The following nice solution is by +# Bruno + td +# Increment a decimal number in pattern space. +# First hide trailing `9' digits. + :d + s/9\(_*\)$/_\1/ + td +# Assure at least one digit is available. + s/^\(_*\)$/0\1/ +# Increment the last digit. + s/8\(_*\)$/9\1/ + s/7\(_*\)$/8\1/ + s/6\(_*\)$/7\1/ + s/5\(_*\)$/6\1/ + s/4\(_*\)$/5\1/ + s/3\(_*\)$/4\1/ + s/2\(_*\)$/3\1/ + s/1\(_*\)$/2\1/ + s/0\(_*\)$/1\1/ +# Convert the hidden `9' digits to `0's. + s/_/0/g + x + G + s/\(.*\)\n\([0-9]*\)/\1, \2},/ + s/\(.*\)"$/\1/ + p +} +# +# Last line. +# +$ { + i\ +};\ + + g + s/0*\(.*\)/int _msg_tbl_length = \1;/p +} +d diff --git a/po/ps.gmo b/po/ps.gmo new file mode 100644 index 0000000000000000000000000000000000000000..70803ae151ae11e58487ce2c599192e4777a3db3 GIT binary patch literal 9790 zcmb`LZH!!3dB-m#5aJ|l2&5qtl1stZ0ncXFF^Mw?PHba4PW(o)4g@EmcW3YJ4xXJm z+Er?>~ajrpfR+3`70^k+cv|6A~OFabsP8}MfE7L<3v z5-9oup!E1m`hGIS7gPK;D7}9Q{t5W&bpFQcE#FO`)*k^Sx01fkf$!!0MNsyCH^rZV z8+d;mlwP;o;5Z)u?*`X{M?l$g5|m&68Wi6jg7VA1g8X;h{s(sd?cg8sz75p;0Z{v% z1ZDr9gExX-1r^sHI%~^83Go^7C6@CcoSUO8+wWVepfn^q2+3_iJDYd<~TT z|Cz4eiZI!AA1Hl41>OYCg7VW}rg#xlJpK-RJNQqa?0y{-{q;<~8@wHq+%hP6PlDpJ z1iIi?K+*pIfu-5PVicSCI9aS9|LDV?fXY?6DViMt`c}Jcm%u~d>*_D{0Gp`5!^$f14Z{| z;Dg||K<)o6ct5y-WZepmgWCThI1K(6l-xIC%r@{Np!UU}^!y5V5BM+X`fVhU_CE#g z13wRb1pGNDx_1(6@!bb*0Y3+d&n2)7{&)I5LJ~^vCMf^B29APPlVlHoPk;}De+A+a z=a=A};2R+Soez_&nC3hT?glHM^tb?`s`CpFmd+dL`>n2>-vXk7a}eaeQ{zK^ISp!9LOdY|>j6QJx^03QH<1nvN@Be^tx0IY#u044W-L0saz_x(1H?*-K#_JJ-K zgC7E)2l?-OpAX6ZB{%}!K=C~UJ^;%8MNoQv86;#*0wTiskM#X!n#}dQ-wECT-Vg2t z9|kEA=ZoMwz^{SY{~b_q{|QLyI@i!#Fv)oj_$E-gNGV~~a>zczt8 z8G01g?TiY8XEPX3^DdF zu3{)odX6ymG35Uz8QF6aUlaq?m&-WJ!2KrA-vz3#>bZ__GviT)dd^!IinZ!vKjR={ z2SahzLyDV+R^55t%C|9wVynEmkD=#5^GV+aRZoQ5)KfZL0Og^cyDgYc<&vjw?#62U zm{+TgyMDbAj92TEcR1^ZMkd@nJ1jnu;(jo4C#p3+o@w~{Zg9Ih76eD9z3`|z5rppH zNB6oL)<+v$uNL~=_>AkHs77(*Y;QDb)ruEagSvaLA&AP(4zF^w*)Tla3gl*W!b8Nk zv(u|@h}}xim~qFep(64*bzR_Wm`82Nu9~CLXAc*r^no%4~qb!P5 zt($N*>h20dzEo;KMC1(Ta{qL*UOkbYHm-(z%=%wW9<mZ<+L?qhGJDl@swXo`fkqcR?=1@mng+Ej(Jn> zh}?=-uhS!_#MrCW*-+VFmea~p192Y0z;3(UTaW!o?4{i|Z6TPJO(zeUu^UXdp+evc zAnRGT=Y=eiDr_iDr~zejlVL!I7n#YCY3PfUY)37JDYkfIb1(lr;VnLP<>=G z<_>kZt_){qYH zv7srt;krkCRa0qyG+7-l?PyL$rBTlQb%zd)mUgOXb5N8%#=WcTZXO;PE)CyR+I+V= zGE&~MwKTkCco@RcqyDj~4wMev@V%^+MmD=6_mqe4DGhIhZl4#$rBQlSRP(qMB4QtX ztBLDMqrNv?b`N>c6z9nO4KLwo;fJMN>D{^PZXK(}>podJ6!_!S zxRhy@DYeNx)Rb~vik&Luko(v6-FqI|eqiroquURx<5u39PtGQnTXU@iw|%~~*nXz9 z)LKd|wH90Rt%dZ8-hRnV&e>af`+VnXYffL2i><}vf{0!AF1BWsb=_~R+1B?Eu*@=y z7X`DeB_z$a&+w95bX#-D%kA@5o^=h6rItRU{Xka{Ihtvy_}gMDiVkF7tJ< zwS)#PyUr#T+Rw4iY6H9E>sa%gwZk<^T+l4L*ge}?U|+I~B6A`U5B)F9uxZ&%F7uJ9 z)>@MGb61|lVY63G!QuDb(msjS^X-?~&qViZ*-J}?NGsq zvoumZGrQo`jE`R$!Aq_8^(Pa@r|(f&~A8*i)0*j=Y9q0=S=Db9g(YY;?CVQ{{KX6Wt!`y$&C)Rk1bs<)j<~uzwk`a7kW-HhN))8Asrz~@m^UuHx$G&p9yww z##!D~X8H0k?|4+1oc`*Q7xJd2Ysop1mdeBq$9QeF+pOV|>jN$)>7ryiD>RB6!Jsy# zA~BvTs3A`lt|qcYznzIklbJq2%N8T|Q+h1=%0PI5`Enb$w# g3W>@*wekuPAuNNK*}lfA@*q8r`rSbDDBi_>2OA>yPXGV_ literal 0 HcmV?d00001 diff --git a/po/ps.po b/po/ps.po new file mode 100644 index 0000000..4d8770e --- /dev/null +++ b/po/ps.po @@ -0,0 +1,2040 @@ +# Pashto translation of glib.head +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Glib package. +# Zabeeh Khan , 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.head\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-04-12 17:07-0800\n" +"Last-Translator: \n" +"Language-Team: Pashto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Pashto, Pushto\n" +"X-Poedit-Country: AFGHANISTAN\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "په اومتوک درکموندونو کې کومه سمه ليکنښه دوتنه ونه موندل شوه" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "لپاره يوه ليکنښه د مخکې نه شته دی URI '%s' د" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "لپاره کومه ليکنښه ونه مونل شوه URI '%s' د" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "%s :د اړونې پر مهال ستونزه" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "ناسم دی URI '%s'" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "ناسم کوربه نوم" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "%s :درکموند پرانيستلو کې ستونزه '%s'" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "%s :دوتنې نه لوستلو کې پاتې راغی '%s' د" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "%s :دوتنه پرانيستلو کې پاتې راغی '%s'" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "%s :دوتنې جوړولو کې پاتې راغی '%s' د" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f Ú© ب" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f م ب" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Ú« ب" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f Ú© ب" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f Ú© ب" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f Ú© ب" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "%s :په لوستلو کې پاتې راغی '%s' د پېلامي تړنې" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "پېلامي تړنې نه منل کيږي" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "اندرغل څيز" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "دنننۍ تېروتنه يا اندرغل څيز" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "له ياده بهر" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "دنننۍ تېروتنه" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ناپېژندلې تېروتنه" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ليکنه تشه وه (يا يوازې سپينه تشه يې لرله)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "د ماشوم بهير نه د اومتوک په لوستلو کې پاتې راغی" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "(%s) درکموند ته بدلېدلو کې پاتې راغی '%s'" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "(%s) د ماشوم بهيرپه پېلولو کې پاتې راغی" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "%s :ناسم کړنلار نوم" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "%s :ناسم کارونې درکموند" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "په پېلولو کې پاتې راغی (%s) د مرستندويه کړنلار" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr ":کارونه" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[...غوراوی]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr ":مرسته غوراوي" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "مرسته غوراوي ښودل" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "ټول مرسته غوراوي ښودل" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr ":کاريال غوراوي" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "صحيح ارزښت له سيمې بهر دی '%s' لپاره د %s د" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "%s ناپېژندلې غوراوی" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ساده دوتنه نه ده" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "دوتنه تشه ده" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "%s :ناسم ډله نوم" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "کيلۍ دوتنه د کومې ډلې سره نه پېليږي" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "%s :ناسم کيلۍ نوم" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "لري '%s' کيلۍ دوتنه ناسمه کوډييزونه" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ډله نه لري '%s' کيلۍ دوتنه" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "کيلۍ نه لري '%s' کيلۍ دوتنه" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "کيلۍ نه لري '%s' ډله کې '%s' کيلۍ دوتنه په" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ارزښت د شمېرې په توګه نه شي ژباړل کېدی '%s'" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "د سيمې نه بهر دی '%s' صحيح ارزښت" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "چار بند شو" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "چار نه منل کيږي" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "ناپېژندلی ډول" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "دوتنه ډول %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "ډول %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "بېنومه" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "نه شي جوړولی %s د کارن سرپاڼې دوتنه" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "لپاره دوديز پېژنداوی %s د" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "چار نه منل کيږي" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "د درکموند پر سر نه شي لمېسلی" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "درکموند د درکموند پر سر نه شي لمېسلی" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "موخه دوتنه شتون لري" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "پېلامي تړنې نه منل کيږي" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "ځانګړې دوتنه نه شي لمېسلی" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "ناسم پېلامتړنې ارزښت ورکړل شوی" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "نه شي لرلی '%c' دوتنه نومونه" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "%s ناسم دوتنه نوم" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "%s :د دوتنه غونډال خبرتياوو اخيستلو کې ستونزه" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ولۍ درکموند نه شي بيانومولی" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "%s :دوتنه بيانومولو کې ستونزه" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "دوتنه نه شي بيانومولی، دوتنه نوم د مخکې نه شته" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ناسم دوتنه نوم" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "درکموند نه شي پرانيستلی" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "%s د پوښۍ په جوړولو کې ستونزه:" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "%s :په لوستلو کې پاتې راغی '%s' د پېلامي تړنې" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "%s :د پېلامي تړنې په جوړولو کې ستونزه" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "%s :دوتنه خوځولو کې ستونزه" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "يو درکموند پر بل درکموند نه شي خوځولی" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "د شاتړ دوتنې جوړونه پاتې راغله" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "%s :د موخه دوتنې په ړنګولو کې ستونزه" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "د ماونټونو ترمنځ خوځېدنه نه منل کيږي" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ناسمه کوډييزونه)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "%s :د پرېښلو په امستلو کې ستونزه" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "%s :د پرېښلو په امستلو کې ستونزه" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "%s :د خاوند په امستلو کې ستونزه" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "%s :د پرېښلو په امستلو کې ستونزه" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "%s :دوتنې نه لوستلو کې ستونزه" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "%s :دوتنه بندولو کې ستونزه" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "%s :د زوړ شاتړ تړون په ړنګولو کې ستونزه" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "%s :شاتړ لمېسې جوړولو کې ستونزه" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "%s :د لنډمهاله دوتنې په بيانومولو کې ستونزه" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه '%s'" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "موخه دوتنه يوه پوښۍ ده" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "موخه دوتنه ساده دوتنه نه ده" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "دوتنه په بهرنۍ توګه بدله شوې وه" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "%s :د زړې دوتنې ړنګولو کې ستونزه" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "%s :دوتنې نه لوستلو کې ستونزه" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "%s :دوتنې جوړولو کې پاتې راغی '%s' د" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "%s :د اړونې پر مهال ستونزه" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "%s :دوتنه بندولو کې ستونزه" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "ناپېژندلې تېروتنه" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "%s :د يونېکس نه په لوستلو کې تېروتنه" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "%s :د يونېکس په بندولو کې تېروتنه" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "دوتنه غونډال ولۍ" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "%s :پر يونېکس ليکلو کې تېروتنه" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "کاريال نه شي موندلی" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "%s :د کاريال په پېلولو کې تېروتنه" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "نه منل کيږي URIs" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "له ياده بهر" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "دنننۍ تېروتنه" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "ناسم کوربه نوم" + +#~ msgid "do not hide entries" +#~ msgstr "ننوتنې نه پټول" + +#~ msgid "use a long listing format" +#~ msgstr "د اوږد لړونې بڼه کارول" + +#~ msgid "[FILE...]" +#~ msgstr "[...دوتنه]" + +#~ msgid "The file containing the icon" +#~ msgstr "د انځورن دوتنه" + +#~ msgid "name" +#~ msgstr "نوم" + +#~ msgid "The name of the icon" +#~ msgstr "د انځورن نوم" + +#~ msgid "names" +#~ msgstr "نومونه" diff --git a/po/pt.gmo b/po/pt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..0bd8ae37308bf5aebe54c326a644523d05b7c332 GIT binary patch literal 44740 zcmd6w37Di+b@yLHQBf3G6%bwqW|Qe*hGBDtZJ3SG*??gY2FL2I>h5BytD0J70f`H! zh$0HOZ=gm$R1%eFB5D%pm>3ficas<}8Zn6)%_44JjNk8n&b{waT|LvI`JN~JaQWB! z-u>Ql&pqed^WJ&*u*beW;qUGPlH@q>xI>a;=rQ0idYdF)n3E)jgI@$64?Ys`UjsfG z@RtD}cao<&1bh&b^ONLsa4C2yI0~xXH-O8)`#{zAEpRD#2$c?j=YvW=0jj>YgKFQW!4&)& zsQ&#FRJ%^(fuG5_;39Aor0L0>AWca=4l=~aKLkARS)P9$sCI4vQ?L!L1n&gj0e%%! zd%HAJkXjB>9hP#{rwquK6w0+Bsl|oKDZvd3w#~; zFqndqWY&1T4m=)wFDUx`45Anvh2_DR(YiXpQ%2@%X;1*E%uLD*8ZJ_AtJ>mT)1O83GAA@S&p$ww(Ed-T* z4XAm(CcJ+!sQTX);y(eZeP0HT03QWa&cO^;3Z4Xtu2+L<$MeH;4^+O}K}ab1FvwIT z-vCwb6VFVNXM!h!%6~q{R42~^75{Qj?R*EQavlip{~lEOAA_3zr<~<s%tlHH)z z)4ib5{bRsig6Hvk^w~+mQcf-hwN7pT)sA<9EUDyEAS9DK0%{zNpfJ(LGEn{KfXe@N zQ1tU4sDAx3csO_zjZ%A`1@bD{0E(_(9-co8YW}|uD&G@U_U-w7-mWV^_2WiR^?Wcq{~dS~&rf79ls^Sk-gCf1 zzy^3ccs;0gzZrZg_$Q#s`wFOZ2QnyX=hFh74XSf_e+8ZZ9=+1}`dOgH`yx>N*%sb+K+);Vpwhn?d^-5? z@cv7n=I@_C(aV!z?n-wq2y05N0Z#;92_6f60DLC+XCO;Ec?8rr9K9+@wt{QHi@>*n z;#1!N8RF!W)yzFu2UYIJK$ZJ#Q1v}_jrad#@MNAZ0mYAZff}c~!8zb3K#kYKpyu~5 zDmf0^04lx?YJ6S|s{HqWny)_v)!wgxu#)5n>)=7)3h;PvH#iS`BdBu!5LCTC1D^pN zPNy{fL!jpG3h-&*wcttM3qkecZczRFV{j9A$oeGt5V#GzUeC|*_T3WjZg4K|{{R%- zJ`9Quj()Dw+ZqrSkxYi?_kytKk*a21UU7*J20Z`-fb?`{= z7oggI=tif9IiT9V0u;Sm4Ql)*!4$j$6y4kps=U7hH4gs*YMlNHRQjXowC3;Gpy=uO zpz6IHWayKRfXl(3gG1oyn|(fpLCxFiL6&-QADDvw0?r2y-s0&`12qpX09Ed-pvK`o zQ1yNqOu_Gh=Yx;G*y(c}sCBUuRJ(5jMbCGGYWF8W)$=eY`a0+m&$k?0z;hj30^R{? zoTosI*N;Gr%Tq7)`C0&qo-PGxdeR120?C7*+ItX-MEMqiqPO*+>YoIk1>OOwyib8o z1HT5UynhCt3_kucFYgHO@jPD%YW!aS9t7S1s+}(d7lZeM%fN4g8t-Q1kXhQ1u^jrSrw}z@W?hA9t0fI}22~TS3jk2q=1aIe0Yq0Z`*V1!}&32x@$ezS`3-16A(jpwjOKj|5)} zs$K5|wcfq}s((KLpA8N^iS0UQBS@TP$83HTZC_=NQdo(Vp#;?L)R zi+H{|Jl_I#4@i>tfyeOvxDluKvjUzUa9zO70j~(S9TYu}h36YU(ceuVLzdhHj)DIH zR>7RiUC;t2bc4F3wQxI z1)c*w_F9+kR)VMV{9;h!{!vil{1s5`IbeskV;OiV&sTvLg13TN$DaqS-JrF*;dC(y zsvWn3YX3(9ehpm3^Dn>;gXc{+zx_8*ba-IX`J_~AGe-54uKBMLP z;(4IPc^AmiO1=+X0Ir*Kyal|N=RXHGgU4Ry2-Y0`Pflr@se4&C|b! z=aZ>qHP2Ur>c`#SW#D(fcY({h-v5U{&G$h)Z|@1DM}YSS z{4A(?9|G0iLw9<bK&|glQ1tW?Q0;mTsPaAys(n8J)t)17@cb)4 zwW|&){hiJ=?9?ddBzKUKG%UM&#wlR{ytFa?Q@{`+@Uu*oj)6#&+`sY?Y$E` z6MO(v`~DqNJxBbO*RuswyKV$e0pATO{;$Df!6&`Q+c6*1xLyXTU#|x*1V0C=+(TX* z))%;p=TY!2;9Ee=?-?)g{$2&D{F}iP{A2J$@LS;V;DImodgg$l<6%&A_CD}z@bAF0 zz{79y=jVdTe>13lz8BPZJOqlq4!YUvJr-2|)_@wn>p+$J8t^di)8Jz8E1>4(z?b=c zIs~e|E5W7UYr#Xo2f-BlGWcxp#{n0=+{b4eJeBuv5BPcT44!`ps{UoK@NwA!9>a4F zd?xr>P~-kP;r-{r^CRHNyg%R;@9#WN=`I3ACsk1GyaPN5{2X`z_(M?nPJN~4+X~L* zc_*m&w}Ij}4}n*JL${(kf-eKtgI@@E%&UCgse+<|2SJVJV_xmJ7}We+6`t<|)!#n? zQ}9tx<9pO?KL2aLl{~)$oC8jQqO0$M8joXN05;15C3+tS;8 zerllRbnr8v=;~om`3`-(uiurR z%B_PMk2}G|;O~H%zlT7z_rN!JIVXWy2j_sA|L23ErbS~e+r8Jz6;uVd!xtC z0W}U6fl9X<)cSZ6sCNAYcp3O#pyv6KH~ITlfqMQVcr^GZcs_W@n|=H@f})c)sC4fD zRqodV9{d)s?_5yryarT%ZvvMqJ*fPD3#Q=X-sWu@Co1tLFNA_cnJ76;70Jf;2GfQcl&z07F4@G z3N8SD0IHow-s5`JS>Ta8uLjQpuL6$(-wbNrJ_Mc!9`r6B*9G7eJdc1UfS&-jg5LmF zfJ@%(bkzVgJ}(0g13v=J13v?bK7RnJo}=F5^DzV-&hvWE<`cAW2Uqg`Q=r=aD^TrO z@Y_C4&jHnrVNm726x2B03(f)m416;9z3}`~Q1o=nd!1e`1yAR>37!MK8&rA!0L}%I z_xZY*2ddoXfa=dUsP^0t@I9dD?epLo@aLfD>-_)YI03Hb`K{n8@DWh+weVio&vtjaG$ULlfdJ7e<`T(YX`go z)I59yR5@P-MJGQG@6Y%h->GnD@5MPZ_(H%2%@d|gblpA8T=`sN;sQmnr44j^ZU#ES_wW3{ucN`!rytc z&9{F3GvOKG-G#*K?^&Se=`ir?;9_tOSOHUl{x&!yujKj7;oXjaiqd%eKA}rsSdz`e zy_N7p!odX5nf@-&Z^9Tse}6zYkKbCS*Ab55_ree-8u}375CSYL`5{4nw}*KBzK!r0 zp8pd3ie7}jtHHkxzwZv|PX}32$uGnEi+Fxch)IWzcxR#Mh+zYEre_M{fv_R{Apuy9hUh zcNgg;f2#@O_KQ6(;O>y-iQ!rNo$b*U+|KY$@Cwph2%b;q@w*f9{U^`Q4ZoiRzMkhl zA}k2+-pp_Pok)NUCI3n|mGCQq{@zPiX}{nT=so`(oO=ePcv{63Lz3%`#CpH9%<$>2i&ne5^Bf&6|EVOfZOHTZ=PeM^mhc|e9}HMq~FN% z((wD${C<#dD?xuhB0PyOm-ss2jf6>_uOhsgpuZmw{>^^DpNan~ey4;B2sNJd_kF^5 z2+IjC<=qIlo}j5FR4vZ!zI4!rMZ+mw>P2c^%>LgvarG4ES-vDB&2M z-wM8oa5=wULwJDSR}yX@Tuad3J%mpYE++me!VZ2n2>(sEk>^F=R>JlC{x48}Z{YVy zg!uP5e*E9?@LKTo#GMXq1fLF`0=|i`gz$Ere~)k%;YB=OLeSseJ0!mg-p0EV!t>X_ zXAxErw(|b-;3k6p?zaECT)mCB`*}W&a0b7(5aQoE!;fou_b2>50lW!3SMSpW_2$k> zqh3vG&5>5M-W*$)%w4>6G+lF{Q#=6SK5`4Zmpe;wi=DrE@~%k{yFp0EM`So@1_%#J(h2{Hdb$@ zm1bIN)Fx`pZrZG1*qv?3-SJvpZii}4oxdWr%>RSsH(H%qsd-kzid2xgAFFpe=|r#7O^0h?OsQ{pPr5K! znC_}~$6LK_+M292HPQ=`mFaM+wPT{v-a+Dadf6rGt+h0?U8_|0q_y4kPPdb+9PV^A zPie1N-mpWTbx=i;vdph0PM6$A4jj z>k*ApHCZ{)>M@P2(R89V(Q5BW+qLU@^)^Ynt#q>88lh+#x?Syhx2EB0RN7TC#F-vQZzYbn7%?^Q54&JXzVH_PW0up?el9Vl1^85?pp# zva;K4*N1!5XyifjBEi|Sa*fh(+MgwapnJ7!=$ozP(5A~aY)CGwjO^%5+VV)VT1RO% zonKXH&hMrpt;s!Ul|GMjH2|%h^e%fWrkOdWGg+f&4XY*QP!DTquS01Y*Kb@yHO7{UF^S*>+;bX%dvS=rSV>$+Xp#r#&PDbzEzz24f+B5yWp zjqQ55y-{!0wnJx7W@ykXGId+qYfOWWKFO$#j#uc@R8iD&_8svC8vi$U&)I`pzm z2Q%hZ&J&Z(g`P*#b!#S|wTb;nTdS_0b?Iv%irJ^$It~XMSo#Enl2g!Nf)WeJ(}Ye# zf<1<1XRWcPk1DeS#+1bC7a6hHV~JUmQ?^^IloBzI)Ed5G>&nyp_yU?Hjytucm< z8DOo!IEPtCz8c{SY*e)l%txy+CZ4Rc;k?yWPyE1Fqb*i3Hm5@s>8a|?ZcSWd#$+md zveurccSI%~akI{z2}pE@trnHkZTFh+m|D7Sqp_~_&BP-@L zMDrEZu1@D0fKrAX&^Yrbi=;Uw)(tn_x^`&knfpp{b|FE#Hd<@5jf-s!Eq)gJZM78` zvu*D1N$*ux96H-#2bNGpB2YJ3UbbWR;=^yuOQ zqt;=;<)vrajt0Fc0YkjK(`6`ZCvSG^-9710TI-BdCTU?-LZy?=<7q{*ss)!AF@DV` zvMY>f$IbO%z%bNkRcuv+s`ewPvu5^k+Fq@}+*mNsVW8*LYu2vcv?d*E zx7c2&P(#7i-)f7~F%zw3EggoKM#huXMV8FGYS*zXV{}itW_N9brCe)Nlhv(}o(WaV z60_NB)^@Y6Kq<^|WmH0%xF!2@rNOpdA5&8@p^d4}wnA}*6%1(Ml`XWr)Q=@U&nBw|)1;u395$=5a^q@y zn~iHF;Q5qjrp3$Q8W1BBZbBIn^j@2=Yh0uohrBpe`<^ICkx?9i4!ZS5!<#VVYiSqj zR()$!Xk_e?+K9xnmrgB0*mQC;_E0lYFk!mfwa7xKLF0DL+|H@z<>dy^S6YI#li`U? zSWsI$wm3aU0`GYX^Bih!ZDJA@1i^)M1ogL?P(8y0>o$>c^$hz;T4dYFnxK~0idV@l z<}ON+C2dgHU}4Z*%C=dHZG->Vq|cb2#Z*XJE+tuG&8Ju~()sgN%!gCgVA9N`sdc=s zvkg?*wdKxH(|OnRTHO`tyoUZarvFtYTb&ij8ZYC25$_KzGC?D5YJpqtXts7WX);U; zsg~K}eNZdbwA(yaMn-B#|8NiHHS8e9R6TkaaWU*hL47Dhsvt#*#}9bzip+orX-LJ_ zq2lJ)@-*>kV_WnJxg@+~L$Q`h%rS;Oxo1#xCQB6}t3Aog>SNgM3UOn#t`)0pxF*J` zA8i#0Flsz^wauRH2l} zJG1WDau|@nwp=Zh8R81BCF!YYEmHvVq1M(No7`Vb7AJY3Z|X~NebbEOT&vqaR4d&| zp%Hn+1R_gitVm03#Ku8`m%T?vO9MUhje04`w04GKk+7Kl>D^#0#r~IC8s4L=qrz8E zMW+?qX*I0D&Z}&VA&C`UmdX<~)`n(G0FN@tf>rlb)CoMkZ!F{M=_83eXHd|EXFz=}O(3^T z)}hlegyXRuW*Tki64WKM&Sm>SpF`O(UXbxU&pJ`*Itv<@v(PqAt`$8|zkbH5re%n% zpk146U>`E^vI{Ag@SZoU(JSV};G`Om+xrGWrl=5;vjJ%wdTH||l7a}M3V|uk7HkbJ zIJUjl)M8$+5UrNE<&_2_iawRh$RII47#v*94~bOCQls#8tAW+bxXPk*4E1GhwU9>g z|7g`E505-JS!*?_OU#7SOn#MFZn|J@XJIj&Nnly0mZzh(!7@1)a~oxZ}=tld}@8nuPk9GLd;%B1Tnp%flkEw?fkrd6ANs{P0{ z`qE_1GFd-WSdq16t2Z`2y=3HeTP1yTVtIlw!`6vb(u`@cx$c`WD@7_=NvIpNU@^p- zVOm-a)-9<>b(y(Dp`|gH-UyS}vlfWcIE9X3?N!`Nw8oB6zaB%n9|web(fwss%Zbj9 z1G3_wy3t0jGd@$H)021hG)HEi+Vb}$7mqX6gW6Fb8NIIMI>|UnAe~?dyRrejy9qv7 z+n17Jq9rwGF_wbYrk;9wjT~A|W*(K*hk+fLZ_z=*&+K5qo>iXbPBEzrw8^?l?I>pz zMkMx>jlQLn4Pr8Yax_wH?dl{K!7lS-m5Z%d7;nqE_<&?3U0w0* zCdSyB1X)`m>%&Rtx=WEww{n`99T-rlYtu5yp6w?9SP4vspz$^ULpEfdOoNf-$vC^6 zjHU~`?{?CW89f%xn3}=R?ij5jGbij}U|n|FEEAr2`hbMfCMDM?v-$Dp%D*BYBFUMqIs3rRt7jNPWGWTjad50sXr+fn0GxIa~E_*#sXi)=2kGX_jgv2ZgV zv&&D*D18Ju4T{8e98(u5bjHDOW56PY2*EHv(inAVtIDxp*EQ~}R9kN|w=qmPgoO&{ zHrbtaJSbUJx^!W%^0c+)&U(Am)Iuqz@PmtR*fGZWPBZJ@F2og4S0)8o&gU|)##^)H z9E|hXk%1b5BBgx*X||S3&ry$F1#Z^Q2GUl>^yHdL;~;d}=ii=u&leMg?lh3&QX`!G zAyz~2wKjx^k$UlfHe`k7#hB;8|3pE*S$kwd^%4r*gw=~(8jBgw8x6FNk#{E~ucUNy z$P1gS)Z6F+Iulsr_Dr*-4=AkH%nm!8n~4g_bCYc&CTr!Bl9yIa5l4Gp@yuFbiU*`- zv*c{Z?YEvX*-#tp+W9xeDnAqqoJWP3JTu%IScT+1hCjoix z_*s*Ul9{XrdWaqx}Ab~2yG!+u(el2RkWV^o8bkqi?2VyM48YMel^FGg*6IY6zb9yKke{7nKn?`?xQx67Py<#G$j&+GFpO-12&s;~;NTWbluTr7_Y6#765{64G*3<(R zhAmNeV}}wp1itx12bk$;R1G_tPN6ZxB%7Gyv@wc7~_}i=kMQj&WvN978<+)EP>3wxQDc+G(uN&A^=Ia+p~-@LG}S zfW>3%xOwIK9m816W>dV6!3-yJI%+}am5XS43S8hLV%%lP+BBSG%c@J(u%UB|i20W_?KVBug%+!%XZEJE zWhkL`J5vgq$SgBvsW)G`{z?kR6~rt*ffDS9s;@s=EU6Y0bgRYX2U+=1eK@J3eVQUq zlWghtv&dDATySyLcd@1?Nb+%5+|4j-K$<^WJ2r>OC1&b3R^e-Vw8}e^8hL3#ba{aczL*w0&0X={{yLK@bQKu-P4Sgz3yTc;HE=DG#nv zg!Wt-Ea*AaVX@V2lSv85rQ@w#@?cD5E(@nB9e-PX<9>lOrf>hfwAE|FJ_893h?hCL z)?cfQSEdSv=A?{wd(UQM7rf)R+NQEfrH4bXZe|t@Ui)#b*%_IF#|K zNP?l;4?O~5X6ANhO=1+jC7Jv%vN&C^Rj2F9r#Mx#uvkpd{UDvct-y}=l2s*{AtPO& zebVg&Mx~{Lb}FLoxUa`_a-Xu*Mp{=z3cDB+Q_RB5gv8U{+qA$Xh8Z5&kyTC4L?|uI zIofvTq@59Y)>&S?upy9ID_a58`?(MtRh34SG_KgJ-F=Oa3z55L=3R?E$Mxn&qi3Ek z^G{+zDRr{a9nS?Lit2B-5+qxrnUX=053O$m+fWQA~0`T*p0Cx6RD@g*-@8PF~ZtjQfOlqt1+FpFP-_EB0W|xYNbBSnJx{j zU=e`YB_1Yu?E~@{rR^=b)(mv$R%eYlSzfL#@%F zK#Rp_J91{9FL@7}%l7t3qzULvx}fIEl{+2dBNG(Ql;~2{GV2FZ%eLKMG-s3D4c&vv z*j1@_C+k%TF@t;|NfdCY$$Z@UdmZB!nMadiGuvFTwWees8X(i*b0rB)og{@h!nhfe zj5;FI2$Xv5Zi?lkEKS(3{9>{)a$kv<6j`s^LQ*p}=uU(9PiGkdW!sJd+bPRR8d)9j z>G;fy7tDN%<=tjOLnctXzBMwSze29<+DbF+?uPNG6!P$OpR zY~VZ~GfIVxzM70wa8j}3a7~E|7g&3?H5R4YHV}G*%NAx8$sJgq@Ib}2Bv%i8^JTEN z?Y@DjxiQx_7|{H5NPg?)kPrFnO0s^yt=+uFn|?pu?k+4J=Eqy>kfYu1O-f&JGdC}y zlY#iN?>|LnwsO3@5ZFNmCuo@E%;?WQRAD&6$&epO{&;aj&)?BeczT3WtIz+m3=`6hO(apGh z)1KKUS`&CNx^~LW(5&q;K0AtSOT|K!7@smS<14WROBQDDgH1oP%!^xRUn7`^l?-AX z8H=dzh7LK-8ABLlyjXZr(zk6Z?E1(b;jjC;DC2kH8Kd|pCpf`Q_M>7TtU`)YE zG*@)(D;#uWIfK|^e0AZ#x7QfI?eAeMH|D49YCvx|@KZPRk_fk8*W5|sNjUm7YXeUZ|CRQ1u?oJI!sH|8tJm;0t4>ANF^nQ z4+OU@JL{|@oce|pu2TfqDXSv7tLY5PoxC|o+F7RujXmrLH9YC7Y!l&=8f-fSqF~GM z4*>mholr&A!hR~lWUMc%*wo6KPk0XlML*=TAmipNx=FejKKbAanTT@*0Ci^mn>Sc1Qw@F z(`|-%2XrREK&ufQ+2<9X^m1juhln@&(gp#QDx!TT8-HS5*mkpIZtc$^Or^-5%7>rX z`(Q!!z66dI87GN!!Z6mv4W?k_$fT!z#hqw5#tuTHI#f zwmxGv<6~SE8P;J~B%%Vh7%__uus7Bj+REAd!CN+O9a<&M!5SS}4Fe(hlBG+AmMj}O?aXxP z(&eY0J+$QXB}+&+bO}sCYq>AolC#q#r!8N$+RV-*}Y)A)#Z!o#$s5~d1P#k^>7p)+KR{1@^lNW?TP!=(sRa| zt%;g4?5T{m_y~?u-i~L|;a%R*rHhvwyvn)vkPI!$&6am6=Epi;g=ndANOrCrGw12l zR9M~68YC5I(96@ahwI&gw>0=21!-=(+YmgS#vazs(M zTVQ%E;^AHi_3d{(A#?UYkdISsWZXUMR-}0M#sT1%23@Dlht!NrcF{ngGuDteOw+nr zj4fR_&hdQmL}q(c3CCKUz`wwuc?RHuXL#z-B82uFFr=V@5su$!!Ev_ciOSRKD0gr5(*H z8X-%EV%c0c|0Iv3?}|^CK_Q8lK`c!OM6BcLY|U~O#rE)2B;>ahN=78^$LaP zE`q6h^xN7A57!&0rXsZwr|^nKnUzdWD3v1$`l8Rr=zxln4PL!r-)X`Es`buft2uQa zrZ-OQSTP@kZmN}ZrQKa%D`?e(w2rBbRcqJd4g>PHcL3f`E zFD&P1t4@Qo3%Av2j2_AW-R=-oS~>e%PL<&{#~tE62$@}5g2gh!8ZE>karvzf#g*l+P?n7T(ivoMfQ1QaB# z&l?*Uov~@+u0@ZwH5B(nZO}SBEfkS+bMx6TW@tA_*!FKFm6zT03^LWY)OKW9mMfU>g-A&UR}jDqKVRr@W}@IiD@nH^0uxM=nwK^)2)Sbc8`7 z+edS04@QZx!S?zgc5bw_c5O)4i%hh_-4h$?V}bT4Mhl^ZdmTpFF+K8w%r11eN**tr z5G^y*dm%m_|B`T-QGSsy*_dfnn%_QQ^VWdY3%lPF ziOnXw+HRomF@%CUh)%Xg8Zodm#xP8`qHRGVGj*>dI}8Te4=1?SWTM5F2SJ=4xXT$8 zKvm34i-jc1c_KbsASH zAc}(f(*jmWw~jdLLQ@ptL$70j`JESgnWH#fYH5o*Fi}%V;-r=D$j~sDvL<>(M3*y;G2E<03u?QkUz8!?tjmRKER^e= zz`3ob>8EiR7EudmnN*!lrc6xRKfQ_U-^Fbxs;KeujIe=fw1P^uNUWKm%NmFt$kO(0 zzz5m%TW#rUN~%t&kg(9RQe5quUKaP|bdilDf@ZseI*rQ}cWbQ3Uh++Xn>X0I;rFw- zTf=sm|Gk^tCMZJ7I_q}a+Y!t3t$3@6Rb2acxO77bQdxOkgNKInL(YrQhed^rxPjU( z665u@J%mw7*%oBQG>SIVEox+P#xT>fo#XcM(rwWY)ZU%GaS{xIblZT_pM z+m_0S3UNWK&EvVDgF_8ED}f;BI(aOeZ4I+-iI$g9dm?K5+RMylp*e{PqB|xQlAA zS~8j-XCZvV;ph{KB`!jt^_!L987I^U36JA`zYR1l~>aAMu?vLqk#UD(-gYC`a*mhKy4+M z*-Yl?OKBdcvY%v=6TDJ6H1D4lEE19>HK~>;NKM#}<*foAroGcLi4<5@oF&gNq52+< zXju%W&0C0@VcMdmW&*tYU|VVMu`YEoPZlKwjG8DKT%Y8d*uc~kyhf#n!44X%`mop$ z7~z??#SF|N>8Lq4ik-2bP|lFs$!i~x*`(SA1Cm2Rl-E{{mmlw&_iO+&`vb`m2oTvwnnvp2;v)44i< zEc3bo;VLiMuE=v>-cm(!>fmycS*FhUnZz;?8gyaDUD)yJ&fn(fev4A`3Kx~w28#6= z56-=;ghGOhzZKNQ0USchEtu%px%j@`EWflOzre)1T@Xj(r*S5Tw&Is^!DzN7mt8Ad zU=rD-`YUab56@eRwBZ;>WzCCkl%-wWW+EE~x};b#i>yNi-D(ny(h#OqUD$(-`rIKi zOP0wFkx&AOW?hVToLC35Y;lM0%LSeECBaA~y;J5DD2MTu{w^6iOt#pSjJo08hR}F- z+$3do?{Q3L^FKr4*%eu^z^0YnZj9U1(_f-)Ibj6j=FYrWlbi;P9Mp%x=}gw`%mU5q zWS5`BZZX#CmM;*KzqA=^ z*_SC{R*9Tw3!E!2u+wAy>U2h@X!57AMTq;G(a`kuW;tWJK?|}^Rt%I>T<%JNs$-({ zfaq{}ik&iYELxem4@ri7UIQ-Wa@r8|Ey;qhd;n>>Jd}}7eyvKG7}N;yS{-$A9c`nx z+qW2R4NZs#ocZ{R=xsaM%i;^St(5DUO-8?WW&iVq8(2JJv?3a3G~Kk1;0pRFUCc&L zh7X;RnWw2UHW75RnH1I9Vm3R=D4h|njV*BP*GwXOdaJux3KUSwi`~_- zd7xq!4zK;(IvxuomvA;B8Xlwy&UAB&YAv0lP=CC=B|mDer7N%PRV&M_;cEB9)IEGM zf_fLYz1whglZ)&x))!snaw#8{gmZxWDwoXHL+W9m@MLWyw@C6?Nn{*~Of*%4D7N zn_~7a{h6mPEY3WgQbX-qJGX*q;#=*y4n|;ZxuGLjZ46&RbQ{T7%s(3iefaJsr>vj3 z29>4C5@ic{FHwl{(_{T`B71LKB-Wf!eHNY7heHS+gYmuV-kXQzSe83CA+K&P$Z+bu09EpO#=H*AUpTQoMVDS*3*>wgjam+)^`B0Tuk#>41MLCIZpgD;&Y7 zy@e53ou5`~$TGi(*eD;4!VIGMHxXDjiRi3(!iF zqx|&q&r*@GJ>l!znH$7p8f_V;l~!e^XU=zf*T!QAn-CbeaVuSOV<+E>r?=C6uGQ00 z!6Uy$QChh+X8*rRG9|*N+WITmG=Ed{}iGPRlOB(U~NK z5A%WA%uF?X@Uk9jk|URQ>A>2R9n0FjI3T~Jg7iB*PNXLab2(GmK|?%K+E8w3HcA9D zQ%3cf;~n)qYgORIm_O>(p3Y{i>CUTlKyQn}Z_?2^3*JQhGeNAH9>;%@gs_-L$FXog zQwhbABX0D34>E+tH(?7c+5<8lm`(0Bs49jz-lkf+U8j)A*?!>^!`;BkHbX0{2m~!+5wRlrW?Bq*dx}3E_~tbV`7(rweLvQwzg_V|hW*JIdZB^0dw%4zX~W{3@ZxO(0yUe!#~Apx=(2O$cn|JrCb-zV z25;9~dPHl;H#k!v%wnC94I`VCz;f6ewpGMo=LFQ>4Jr1NC@68o;)89=s6ZMsIm&Pz<;{c(`1YK=LEKf} zrgheD8yd7#vSk#MY%L0R-Ggi7T47+Wwg;7zLKza^g2`}wxKZbe)saeSHxs$G%?gky zpS35~F5jJlI~%ezi@(O|K`cXQcQxM}kKDXlKJ_?j)OTwC&@L4n`rXRl^A?OJq4605jZ-O$gYODH zeKapFO>yv*Iv8S4Mvm;ZID*i}=61?#uK5g}>?Ori1LK2YHNa{VrHY^?PfxKroUcW0 z9|W|5Ee9VuE2Y$3MCf=MlE?1L(1nC;r3{wmTKuzyQous(CE`U&DQY!gk1)Y7ct8${ zrUQ^#VUz2V@nbQOf<>3n#1=L@jA)I(hAdT-p~KBd8w>FnJqOi1TE3M98l!OA7q;5j zHFqZk2SR+d@=r3H^V?~(PS!#O9nkr10GAJo!UTp~x)F&Po7MFz@KMMqFsHe?S!r`P z=94Rz3dIOxYauUn`nO8k=Ii=xu|4Xw-;-YnSp$a5}~JrATQ`yzzbP zS@d#)Q%ig|vsd4_2Qg)?_>0XF|gH_8AnzE8-yC0|)9JmVS zI`Oczz%sOZ>CB(rnT|FfbvElH?RTZh+yx5xqDrD;92+?D#Y>oUFo2%pege#4u_Z=S zMSttOpuHEpCd0ivH=?x68)Ll3I{?a%a^>VaxgMTJz{;Zyw=`JCT8JUU@e6PsyJp zDV08XDqRs(;ZOjUZYq{aV?U6*Am4s$4r2TUz^WU=Q$GVai6UL{vD|X!x@gV)+iUYlFM8R zGqG^_;3ZZRO4JN9;LfPT2N6_eox=LbEV=Y4T6v8G=#+*>_fY8?s>yXz^2XzeKBlOPiidK6Bkx@V$ZX<5$iwH7w=+?}@M}+sDHA!Ud&}fe6=V1rjoz z7`$f^H1DQ=jb?LE5Z|zJaqMXGxtCOS>xMWBP9{2~?7Qn{FFEZK+``ojOs&bO`FWS$ zx3#wxa)C;_RdwIpy;S9!e4G2Xf{U1sZM3h)wN)G#Zd=Q)<=R)gI?t_KNnsUXDF~ld zax!XHbR|WtK3>Nq?iKIoVv{rxC-@1J9#q2sqGHYIE-qhlQ3Z7`pGte`T@zY!wuDfD zxX?|D$xj{Ql7{!?+5D=m!a~uE_-!(IBAp4_o!BZYF0f=a>@s7DYK6{lY0zkWcO@y* zs0(R&y2*>v5v@TEb1EtO)KR_FUx1DGHZJg;!u-TMU)kjiJ>@c;c_CU+s+SCK^ z*!?V{!zCUg+#kle7*v`aH;I%cvG%t!D(v4fBm%?>#QaK;8*Yq=b;-4soxD`!kToc& z?^b@J7&{WX3A96lbVhA=iAf%foQmbk*-OGMs*R?X6%PT|Y6*jOA;q!P@)Cr?<4x0eZ+4`3ZkcPG~1j^@&<7q+Pt99VmCroY!_8Y==oM qhZj~T2ApZU#K;Zm;0{2YR&?wd3Hv;?Gt-, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: 2.30\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-08 02:30+0000\n" +"Last-Translator: Duarte Loreto \n" +"Language-Team: Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo '%s' inesperado para o elemento '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributo '%s' do elemento '%s' não foi encontrado" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta '%s' inesperada, esperada a etiqueta '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta '%s' inesperada dentro de '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Não foi encontrado nenhum ficheiro de marcador válido nos directórios de " +"dados" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Já existe um marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Não foi encontrado nenhum marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Nenhum tipo MIME definido no marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nenhum sinal privado definido no marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nenhum grupo definido no marcador para o URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Nenhuma aplicação denominada '%s' registou um marcador para '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Falha ao expandir a linha de execução '%s' com o URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversão do conjunto de caracteres '%s' para '%s' não é suportada" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Incapaz de abrir conversor de '%s' para '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Sequência de bytes inválida na origem da conversão" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erro durante a conversão: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Sequência de caracteres parcial no final da origem" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Incapaz de converter recurso '%s' para conjunto de caracteres '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "O URI '%s' não é um URI absoluto que utiliza o esquema \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "O URI de ficheiro local '%s' não deverá incluir um '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "O URI '%s' é inválido" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "O nome de máquina do URI '%s' é inválido" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "O URI '%s' contém caracteres incorrectamente mascarados" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "O nome de caminho '%s' não é um caminho absoluto" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nome de máquina inválido" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Erro ao abrir o directório '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Incapaz de alocar %lu bytes para ler o ficheiro \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Erro ao ler o ficheiro '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Ficheiro \"%s\" é demasiado grande" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Falha ao ler do ficheiro '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Falha ao abrir o ficheiro '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Falha ao obter atributos do ficheiro '%s': falha no fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Falha ao abrir o ficheiro '%s': falha no fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Falha ao renomear o ficheiro '%s' para '%s': falha no g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Falha ao criar o ficheiro '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Falha ao abrir o ficheiro '%s' para escrita: falha no fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Falha ao escrever o ficheiro '%s': falha no fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falha ao escrever o ficheiro '%s': falha no fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falha ao escrever o ficheiro '%s': falha no fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Falha ao fechar o ficheiro '%s': falha no fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Incapaz de remover o ficheiro '%s' existente: falha no g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Modelo '%s' inválido, não deveria conter um '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Modelo '%s' não contém XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Falha ao ler o atalho '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Atalhos não são suportados" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Incapaz de abrir conversor de '%s' para '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Incapaz de efectuar uma leitura em bruto sobre g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Dados residuais não convertidos no buffer de leitura" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Canal termina num caracter parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Incapaz de efectuar uma leitura em bruto sobre g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Falha ao abrir o ficheiro '%s': falha no open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Falha ao mapear o ficheiro '%s': falha no mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erro na linha %d caracter %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Texto codificado UTF-8 inválido no nome - '%s' inválido" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' não é um nome válido " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' não é um nome válido: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erro na linha %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Falha ao processar '%-.*s', que deveria ser um dígito dentro de uma " +"referência de caracter (ê por exemplo) - talvez o dígito seja demasiado " +"grande" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Referência de caracter não termina com um ponto e vírgula; provavelmente foi " +"utilizado um caracter 'i comercial' sem intenção de iniciar uma entidade - " +"mascare-o como &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Referência de caracter '%-.*s' não codifica um caracter permitido" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Detectada entidade vazia '&;'; entidades válidas são: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nome de entidade '%-.*s' é desconhecido" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entidade não termina com um ponto e vírgula; provavelmente foi utilizado um " +"caracter 'i comercial' sem intenção de iniciar uma entidade - mascare-o como " +"&" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Documento tem de começar com um elemento (ex. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' não é um caracter válido após um caracter '<'; não pode iniciar um nome " +"de elemento" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Caracter estranho '%s', era esperado um caracter '>' para terminar a " +"etiqueta de elemento vazio '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Caracter estranho '%s', era esperado um '=' após o nome do atributo '%s' do " +"elemento '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Caracter estranho '%s', era esperado um caracter '>' ou '/' para terminar a " +"etiqueta inicial do elemento '%s', ou opcionalmente um atributo; talvez " +"tenha sido utilizado um caracter inválido no nome de um atributo" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Caracter estranho '%s', era esperada uma abertura de aspa após o sinal de " +"igual ao atribuir valor ao atributo '%s' do elemento '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' não é um caracter válido após o nome do elemento de fecho '%s'; o " +"caracter permitido é '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elemento '%s' foi fechado, nenhum elemento está actualmente aberto" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elemento '%s' foi fechado, mas o elemento actualmente aberto é '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Documento estava vazio ou apenas continha espaços" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Documento terminou inesperadamente logo após um caracter menor que '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Documento terminou inesperadamente com elementos ainda abertos - '%s' foi o " +"último elemento aberto" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Documento terminou inesperadamente, era esperado um maior que '>' para " +"terminar a etiqueta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Documento terminou inesperadamente dentro do nome de um elemento" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Documento terminou inesperadamente dentro do nome de um atributo" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Documento terminou inesperadamente dentro da etiqueta de abertura de um " +"elemento." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Documento terminou inesperadamente após o sinal de igual posterior a um nome " +"de atributo; nenhum valor de atributo" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Documento terminou inesperadamente dentro do valor de um atributo" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Documento terminou inesperadamente dentro da etiqueta de fecho do elemento '%" +"s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Documento terminou inesperadamente dentro de um comentário ou instrução de " +"processamento" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objecto corrompido" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "erro interno ou objecto corrompido" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "sem memória livre" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "limite de retroceder alcançado" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "o padrão contém itens não suportados para comparação parcial" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "erro interno" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"referências anteriores como condições não são suportadas para comparação " +"parcial" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "alcançado o limite de recursividade" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "alcançado o limite da área de trabalho para sub-expressões vazias" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinação inválida de parâmetros de quebra de linha" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "erro desconhecido" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ no final do padrão" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c no final do padrão" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "o caracter após \\ é desconhecido" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"não são aqui permitidos escapes de alteração de capitalização (\\l, \\L, " +"\\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "números fora da ordem no quantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "número demasiado grande no quantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "falta o ] de fecho da classe de caracter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "sequência de escape inválida na classe de caracter" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "intervalo fora da ordem na classe de caracter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nada a repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "caracter desconhecido após (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "caracter desconhecido após (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "caracter desconhecido após (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "classes denominadas POSIX apenas são suportadas dentro de uma classe" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "falta o ) de fecho" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") sem um ( de abertura" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ou (?[+-]números tem de ser seguido de )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referência a padrão inexistente" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "falta o ) após o comentário" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "expressão regular demasiado extensa" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "falha ao obter memória" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "asserção de verificação anterior não é de largura fixa" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "número ou nome mal formado após (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "grupo condicional contém mais de dois ramos" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "esperada uma asserção após (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nome de classe POSIX desconhecido" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "não são suportados os elementos de junção POSIX" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "valor do caracter na sequência \\x{...} é demasiado grande" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condição inválida (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C não é permitido numa asserção de verificação anterior" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "chamada recursiva pode iterar indefinidamente" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "falta o terminador no nome do subpadrão" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dois subpadrões denominados têm o mesmo nome" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "sequência \\P ou \\p mal formada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propriedade desconhecido após \\P ou \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nome do subpadrão é demasiado extenso (máximo de 32 caracteres)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpadrões denominados (máximo de 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "valor octal é maior do que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "grupo DEFINE contém mais de um ramo" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "não é permitido repetir um grupo DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opções de NEWLINE inconsistentes" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g não é seguido de um nome com chavetas ou número não-zero com chavetas " +"opcional" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetição inesperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "código fora dos limites" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "derramou fora da área de trabalho de compilação" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "subpadrão referenciado previamente verificado não foi encontrado" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Erro ao comparar a expressão regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "biblioteca PCRE está compilada sem suporte UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "biblioteca PCRE está compilada sem suporte para propriedades UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Erro ao compilar a expressão regular %s no caracter %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Erro ao optimizar a expressão regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "esperado um dígito hexadecimal ou '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "esperado um dígito hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "falta '<' na referência simbólica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "referência simbólica por terminar" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referência simbólica de tamanho zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "esperado um dígito" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referência simbólica ilegal" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "'\\' final a mais" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "sequência de escape desconhecida" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Erro ao processar o texto de substituição \"%s\" no caracter %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Texto citado não é iniciado com um caracter de aspa" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Aspa sem par na linha de comando ou outro texto de consola citado" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Texto terminou após um caracter '\\'. (O texto era '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Texto terminou antes de ser encontrada a aspa equivalente para %c. (O texto " +"era '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Texto estava vazio (ou apenas continha espaços)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Falha ao ler dados de processo filho" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Falha ao criar canal para comunicar com processo filho (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Falha ao ler de canal filho (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Falha ao ir para directório '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Falha ao executar processo filho (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de aplicação inválido: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Expressão inválida no vector de argumentos na posição %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Expressão inválida no ambiente: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directório de trabalho inválido: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Falha ao executar aplicação auxiliar (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Erro inesperado no g_io_channel_win32_poll() ao ler dados de um processo " +"filho" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Falha ao ler dados de processo filho (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Erro inesperado no select() ao ler dados de processo filho (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erro inesperado em waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falha ao efectuar fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Falha ao executar o processo filho \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Falha ao redireccionar saída ou entrada de processo filho (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Falha ao efectuar fork de processo filho (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erro desconhecido ao executar processo filho \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Incapaz de ler dados suficientes de canal pid do filho (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Caracter fora do limite para UTF-8 " + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Sequência inválida na conversão da entrada" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Caracter fora do limite para UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Utilização:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPÇÃO...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opções de Ajuda:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Apresentar as opções de ajuda" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Apresentar todas as opções de ajuda" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opções da Aplicação:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Incapaz de processar o valor inteiro '%s' para %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Valor inteiro '%s' para %s para lá do limite permitido" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Incapaz de processar o valor double '%s' para %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Valor double '%s' para %s para lá do limite permitido" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Erro ao processar a opção %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argumento em falta para %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opção %s desconhecida" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Incapaz de encontrar um ficheiro de chave válido nos directórios procurados" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Não é um ficheiro comum" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Ficheiro está vazio" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"O ficheiro de chave contém a linha '%s' que não é um par chave-valor, grupo " +"ou comentário" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupo inválido: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Ficheiro de chave não começa com um grupo" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de chave inválida: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ficheiro de chave contém uma codificação não suportada '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ficheiro de chave não possui um grupo '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ficheiro de chave não contém a chave '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Ficheiro de chave contém a chave '%s' com o valor '%s' que não é UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Ficheiro de chave contém a chave '%s' cujo valor não é interpretável." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Ficheiro de chaves contém a chave '%s' cujo valor não é interpretável." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ficheiro de chave contém a chave '%s' no grupo '%s' cujo valor não é " +"interpretável." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ficheiro de chave não possui a chave '%s' no grupo '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Ficheiro de chave contém caracteres escapados no final da linha" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" +"Ficheiro de chave contém uma sequência de caracteres escapados inválida '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Incapaz de interpretar o valor '%s' como um numérico." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Valor inteiro '%s' para além do limite permitido" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"Incapaz de interpretar o valor '%s' como um número de vírgula flutuante." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Incapaz de interpretar o valor '%s' como uma boleana." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Valor de contagem demasiado grande passado para %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "O fluxo já se encontra fechado" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "A operação foi cancelada" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Objecto inválido, não inicializado" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Sequência multibyte inválida na entrada" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Espaço insuficiente no destino" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Não é suportada a inicialização cancelável" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "Tipo de ficheiro %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "Tipo %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final precoce de fluxo inesperado" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Sem nome" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Ficheiro de área de trabalho não especifica campo Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Incapaz de encontrar a consola necessária à aplicação" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Incapaz de criar a pasta de configurações de utilizador da aplicação %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Incapaz de criar a pasta de configurações MIME do utilizador %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Incapaz de criar ficheiro de área de trabalho de utilizador %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definição personalizada de %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "a unidade não implementa a ejecção" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "a unidade não implementa ejectar ou eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "a unidade não implementa a verificação de existência de media" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "a unidade não implementa a reprodução" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "a unidade não implementa o parar" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Incapaz de manipular a versão %d da codificação GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Número de blocos (%d) mal-formado na codificação GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Incapaz de manipular a versão %d da codificação GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Número de blocos (%d) mal-formado na codificação GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperado um GEmblem para o GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operação não suportada" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Montagem contida não existe" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Incapaz de copiar sobre um directório" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Incapaz de copiar um directório sobre um directório" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Ficheiro de destino já existe" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Incapaz de copiar directório recursivamente" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Dividir ficheiros não é suportado" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Erro ao dividir o ficheiro: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Incapaz de copiar ficheiro especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Dado um valor de atalho inválido" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Não existe suporte para o Lixo" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nomes de ficheiros não podem conter '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "unidade não implementa a montagem" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Não existe nenhuma aplicação registada para gerir este ficheiro" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerador está fechado" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Enumerador de ficheiro tem uma operação por terminar" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Enumerador de ficheiro já está fechado" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Incapaz de manipular a versão %d da codificação GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Dados de entrada mal-formados para o GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Fluxo não suporta query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Fluxo não suporta procura" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Fluxo de entrada não permite truncar" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Fluxo não suporta truncar" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número incorrecto de blocos (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Nenhum tipo para o nome da classe %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "O tipo %s não implementa o interface GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "O tipo %s não possui uma classe" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versão mal-formado: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "O tipo %s não implementa from_tokens() no interface GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Incapaz de manipular a versão especificada pela codificação do ícone" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Fluxo de entrada não implementa a leitura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Fluxo tem uma operação por terminar" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Espaço insuficiente para o endereço do socket" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Endereço de socket não suportado" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Incapaz de encontrar o tipo de monitor por omissão do directório local" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome de ficheiro %s inválido" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Erro ao obter a informação do sistema de ficheiros: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Incapaz de renomear o directório raiz" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Erro ao renomear o ficheiro: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Incapaz de renomear o ficheiro, o nome já existe" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nome de ficheiro inválido" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Erro ao abrir o ficheiro: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Incapaz de abrir o directório" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Erro ao remover o ficheiro: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Erro ao enviar o ficheiro para o Lixo: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Incapaz de criar o directório de Lixo %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Incapaz de encontrar o directório de topo para o Lixo" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Incapaz de encontrar ou criar o directório de Lixo" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Incapaz de criar o ficheiro de informação do Lixo: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Incapaz de enviar o ficheiro para o Lixo: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Erro ao criar o directório: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "O sistema de ficheiros não suporta atalhos" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Erro ao criar atalho: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Erro ao mover o ficheiro: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Incapaz de mover um directório sobre um directório" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Falha ao criar o ficheiro de cópia de segurança" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Erro ao remover o ficheiro de destino: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Não é suportado mover entre montados" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Valor do atributo tem de ser não-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo inválido (esperada uma expressão)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nome de atributo extendido inválido" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Erro ao definir o atributo extendido '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Erro ao verificar o ficheiro '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codificação inválida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Erro ao verificar o descritor do ficheiro: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo de atributo inválido (esperado um uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo de atributo inválido (esperado um uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo de atributo inválido (esperado uma expressão byte)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Incapaz de definir permissões em atalhos simbólicos" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Erro ao definir as permissões: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Erro ao definir o dono: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "atalho tem de ser não-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Erro ao definir o atalho: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Erro ao definir o atalho: ficheiro não é um atalho" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Erro ao definir a hora de alteração ou acesso: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "O contexto SELinux tem de ser não-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erro ao definir o contexto SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "O SELinux não está activo neste sistema" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Não é suportada a definição do atributo %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Erro ao ler do ficheiro: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Erro ao procurar no ficheiro: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Erro ao fechar o ficheiro: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Incapaz de encontrar tipo de monitor por omissão de ficheiro local" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Erro ao escrever no ficheiro: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Erro ao remover o atalho para a cópia de segurança antiga: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Erro ao criar a cópia da cópia de segurança: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Erro ao renomear ficheiro temporário: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Erro ao truncar ficheiro: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Erro ao abrir o ficheiro '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Ficheiro de destino é um directório" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "O ficheiro de destino não é um ficheiro comum" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "O ficheiro foi alterado externamente" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Erro ao remover o ficheiro antigo: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Fornecido um GSeekType inválido" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Pedido de procura inválido" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Incapaz de truncar um GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Fluxo de saída de memória não é redimensionável" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Falha ao redimensionar fluxo de saída de memória" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Quantidade de memória necessária para processar a escrita é maior do que o " +"espaço de endereçamento disponível" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Pedida uma procura para antes do início do fluxo" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Pedida uma procura para depois do final do fluxo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "Dispositivo montado não implementa \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "Dispositivo montado não implementa \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"Dispositivo montado não implementa \"unmount\" ou \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"Dispositivo montado não implementa \"eject\" ou \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "Dispositivo montado não implementa \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "Dispositivo montado não implementa detecção do tipo de conteúdo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"Dispositivo montado não implementa detecção síncrona do tipo de conteúdo" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nome de máquina '%s' contém '[' mas não ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Fluxo de saída não implementa a escrita" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Fluxo de origem já está fechado" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Erro ao resolver '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Erro ao realizar a resolução invertida de '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nenhum registo de serviço para '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporariamente indisponível para resolver '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Erro ao resolver %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Socket inválido, não inicializado" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket inválido, a inicialização falhou devido a: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket já está fechado" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "a criar o GSocket do fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Incapaz de criar socket: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Foi especificado um protocolo desconhecido" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "Incapaz de obter o endereço local: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "Incapaz de obter o endereço remoto(): %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "incapaz de escutar: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Erro ao ligar-se ao endereço: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Erro ao aceitar a ligação: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Erro ao se ligar: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Ligação em curso" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Erro ao se ligar: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Incapaz de obter o erro pendente: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Erro ao receber os dados: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Erro ao enviar os dados: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Erro ao fechar o socket: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "A aguardar pela condição do socket: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Erro ao enviar a mensagem: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage não é suportada em windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Erro ao receber a mensagem: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Erro desconhecido ao se ligar" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "A escuta já se encontra fechada" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Socket adicionado está fechado" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Incapaz de manipular a versão %d da codificação GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Era esperada 1 mensagem de controlo, %d recebidas" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tipo inesperado de dados basilares" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Era esperado um fd, foram recebidos %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Recebido um fd inválido" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Erro ao ler de unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Erro ao fechar unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Raiz do sistema de ficheiros" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Erro ao escrever no unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Endereços abstractos de sockets de domínio unix não são suportados neste " +"sistema" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "unidade não implementa a ejecção" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "unidade não implementa a ejecção ou eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Incapaz de encontrar a aplicação" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Erro ao iniciar a aplicação: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Não são suportados URIs" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "alterações de associação não são suportadas em win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Criação de associação não é suportada em win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Memória livre insuficiente" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Erro interno: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Necessita de mais dados" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Dados comprimidos inválidos" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Sequência UTF-8 inválida na entrada" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Atingido o limite de dados de uma matriz" + +#~ msgid "do not hide entries" +#~ msgstr "não esconder as entradas" + +#~ msgid "use a long listing format" +#~ msgstr "utilizar um formato de lista extenso" + +#~ msgid "[FILE...]" +#~ msgstr "[FICHEIRO...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Caracter '%s' não é válido no início do nome de uma entidade; o caracter " +#~ "& inicia uma entidade; se este 'i comercial' não é suposto ser uma " +#~ "entidade, mascare-o como &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Caracter '%s' não é válido dentro do nome de uma entidade" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Referência de caracter vazia; deverá incluir um dígito tal como dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referência de entidade por terminar" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referência de caracter por terminar" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Texto codificado UTF-8 inválido - sequência demasiado extensa" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Texto codificado UTF-8 inválido - não é um caracter inicial" + +#~ msgid "file" +#~ msgstr "ficheiro" + +#~ msgid "The file containing the icon" +#~ msgstr "O ficheiro que contém o ícone" + +#~ msgid "name" +#~ msgstr "nome" + +#~ msgid "The name of the icon" +#~ msgstr "O nome do ícone" + +#~ msgid "names" +#~ msgstr "nomes" + +#~ msgid "An array containing the icon names" +#~ msgstr "Uma matriz contendo os nomes dos ícones" + +#~ msgid "use default fallbacks" +#~ msgstr "utilizar nomes de recurso por omissão" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Se utilizar ou não os nomes de recurso criados abreviando o nome nos " +#~ "caracteres '-'. Ignora os nomes após o primeiro se forem indicados vários." + +#~ msgid "File descriptor" +#~ msgstr "Descritor de ficheiro" + +#~ msgid "The file descriptor to read from" +#~ msgstr "O descritor do ficheiro de onde ler" + +#~ msgid "Close file descriptor" +#~ msgstr "Fechar o descritor de ficheiro" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Se fechar ou não o descritor do ficheiro quando o fluxo é fechado" + +#~ msgid "The file descriptor to write to" +#~ msgstr "O descritor de ficheiro onde escrever" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "Erro ao criar o atalho para a cópia de segurança: %s" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "" +#~ "Incapaz de ler o ficheiro de área de trabalho que acabou de ser criado" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "" +#~ "Valor de contagem demasiado elevado passado a g_input_stream_read_async" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "Valor de contagem demasiado grande passado para g_input_stream_skip" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "" +#~ "Valor de contagem demasiado grande passado para g_input_stream_skip_async" + +#~ msgid "Target file already exists" +#~ msgstr "Já existe o ficheiro de destino" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "" +#~ "Valor de contagem demasiado grande passado para g_output_stream_write" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "" +#~ "Valor de contagem demasiado grande passado para " +#~ "g_output_stream_write_async" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Incapaz de alterar o modo do ficheiro: falha no fork(): %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Incapaz de alterar o modo do ficheiro: falha no chmod(): %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "Incapaz de alterar o modo do ficheiro: Filho terminado pelo sinal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Incapaz de alterar o modo do ficheiro: Filho terminou anormalmente" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Conversão do conjunto de caracteres `%s' para `%s' não é suportada" + +#~ msgid "Incorrect message size" +#~ msgstr "Tamanho de mensagem incorrecto" + +#~ msgid "Socket error" +#~ msgstr "Erro de socket" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "Canal definiu parâmetros não suportados" diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo new file mode 100644 index 0000000000000000000000000000000000000000..1b651b5d85b1578cafb324b973975ecc7d8b4874 GIT binary patch literal 44569 zcmd6w37lPJdH;_UQKKlb1(4-1m}CN(ED%CSLLg*;Xf{Y#gkZcgb7$s~JNFKE$%eS0 zs30N{aaT~QRgBi+QgLZ@)V9{OZf&i$+PbuE)xWmZYW;tI&-0$`-aC^4`~Q6Y^Wo%o z&pGexH1G%D$$A<^U+jybW5F+hj|RUR@W%mv z8Su9OA9bduI|_Up>5mWhXMjg@KOcNLxB}b--VK((Uw|ipS3M<)P6sEz`QXbz)&C$k z7yLYU3HVF!1aSGBD7q5d3LXdkA$T_UAlMIn4~)SllKIKtVvwq$O`z(V0B3`@f#-m4 z1}^}=3Z4Nzab6TH1($$}z!6aO-UFTs9s*V0x4|XgQB*nrUIZ%rIH>yG0IGc-2V?MS zp!)ZppxSi?H~fq)1Q&oKAWe^60n(J{Lm(uM{wd%i&+`0pLA7%m7=sOP4fqQ1jo?>7 zwYNnhMc3QGmEis0Lh$<_Num>|RQGGZ6Tt~k&tC$n{`Y|;@EhO;@IpE%y1W1s-97}a z0DlCk{&^I3F<1dr-#fvp!S4lJ4RJ)TdqC0YFZoCP{S|l-c-rD9IuCpXxDmV?ybJsm z7=sgJ7Cr9*PXpfuihn-^s=wa>)sO!Q_s7u4W4NCWD&Hzl`7Q^QZvxaf+yR~ez5^7! z{u)%eAA-k&vlw(ujTlrpE5R7t1}guJpz6N^6kokHJpV|*zYX{cQ0+S!A}Zf}Q0do$ z8t3c7^XG!9|MlVhhe5UP%iwX~FF}1;=^hDD)XpabTn?&zyTbh~;OX4I6Fdg|40tm5O%PU$eg&#s z3odp!bZx*}0=^4W`@Ra!27d>h4$fZVa{YWz^u7#Ke|CoFO;CLL0#NB+1D*(eC_Mig zP~-P~Q2g?EguBvR2qK!I>%lX?mw-{{m!cN8bfShuLeRXa~3fybOFDC^_{n zAS8~?UdPyj6;S1V093i(0af1->%IR^0iVMC6`8xAh<*BAN*IZvzq0(U(At_amrG{W=~z8@v>Z!6vA3?*>Jm2SL&2>)`R=uR*o{ z=*`X#eW2RE5){8&2a0|ZU<@7v#WxRtD(|zP=1Wevjo$^J_~{v->b(<$ z^wFPyE5QE(2f(FUeLMz1joT|hrh0S;jKO~e=Yg}fdHQoejl(lRm3tc~IvfI3@5jLy z{2q7__~^@>KQ9F}FZO_H_Z^`4`Cd@%{s^dgz6FZEj=aM2tpNMEuYilegP`a<35s4n z1x1%9Zujx(2gOg@L7E;lK&C+S2~h1ll1ZX`^Fi_3Mo{%nfMj4IooDx)D_U9{@FOUjkMCQP;R!Tn#SaeiL{!_-s)9 zzY~nX_kgPBi=fK?F8BoS51#IF=1Jgr+%Ez(?&a|OPEhF&fy)0GQ0@3fQ1twDxIg7u zPj^13a(93lhaph>aw|9+ydM<(Cqa$(Pe9RU_H~~ATu|j+1uFeM@Obd$pxX5|Q1k7J zp!)Y8;053bJ3ZgFfDKUc@NQ7!@i(B-Mc4ayuK<;Q6R7g4U<@7vj{+Y6pA3E+JO}(H zsB}j^!`rnC)c9=y)xS1)3iw)3{QW`jiQqqi;)|bxCxU10@^-BP#oq@&(cx{N`0xwh zso=LkrT-nM_MG@kuXiq}`c{LdgF|2p-V*Sw0Y3$v7BN4;W#FSqe!mJ_!2NaM{>9)Q zKO&0W4xYsGYlfWP8vzdle15>&0v-(bTJRY1y*b>!9~A$66y(3?^ZZi<&l$$n2j2vW zPDhq~yw3y|alZjnKlgy5>kB~5>-)hN{BMw{5uHLI;)^Dze%%ggd_Dn+F24k0@Z?dq z+gF0(n+Z_#el2(@_-Sw(_=GW^=exko+`k394E!0`53ZP< zwk-H8P~-dwP<;O%;8O6U-R{S20Y&$_!1>_Ez)j!}K-GI5L^>b51zZJw7+e7U3Oo~> zGw%J{24JzF&;r$yx$(08|@xj+XwJ+N5?Kl%uIqN|2UkN-OybU}Fyce7cJ_wqe z08ixpcc9vT;sJlZ0z8}h61W_^1JwIZgX-50K=tP_H#r|I08i$=0mk4Rpz42jz^{W( z=019s+ZCsPD*tLw{kR3Z1Uv+){C@{Ur=xFndAA5udE=n+-2*D!C%`%2cfcj!W1j8L zSAZ+IzZN_Tya!aekAo`b`{4QD(a-Vmz6{j-zYbglJ{MdBeiXbA{4sbsc=mH$Z$1rN z$o;dx*Ms+i%75AOyg%dM1>C<1jKMDj{5hz09Q%Cd`wPH}xZekgzyA~zU;Pj~5A3_e z@2>$*;r>og?Rpm|y8Q!q6nNwdTyGo)uHb$ZsBzs3o(sMl6kmT5RJ*?piY`aK(CM)R z6kV?c&jfD;j|Sffo(g^#R6G9;6hEAFtCxEPC^>U$zz0Cl^`Ahs_rw=DUCskf;{IAt z<+VWZ!$DAd^X_o}SD@d)K30dNx3`2P$P-Oj$l=g)3X?Y#rk{QfhrAN+c_k6z~Wo(Qht`8IGhco19wehE~4 z{}bLXz0>(=4|oR8Uk|EZ9|JZ1kA1n%|2|OdUJfeVZczQa1AHd<1Msup#=EdF!4nR; z9sX)i|+@Eo`kKg&=S=^6+bHKa6 zv%wF7ec(TX3&A5_>En4GC^}sQioP{a>23p+{}4DA{4#ht_-jyncJe(wZcD*qxqmt+ zz8eRX?{-k>-wU1tehFL*9`P!-6V3xg_m_ft{@0+={RW&3E_${1_fk;hy$Do44uMO- zzXO&239s>ftN~U3AgKO77Zji053T^e04o2i*LwSxfvRU4sB~lCGVrCK_+k>=06yw< zt_L@P8kd)Ymw=xGF9VN$y~~NGgKEz$pz8SmC^~)z+yXx84c?y}p!nl%P<;OZQ0@H& zsCFFrM(5wNz*D*3396k3K&3kfJ_-CNxB~nF_;_&En>_z)@Cfc#f|r9AgBO4Y!3)99 zg3G~K_j$SK=tdWH+vj> z5vcaP5IhF_b5QjCGN|^?dW)BT3Mf9`2%ZM+1^d8zK(*sT;rZu4<^K^VemV24-tHaX zDcm2foeDDys2>dP>gU7$k z`EVJia(9Ai?=7I}eKWWOd=S+5|0v*zZ+AXg2dba9gPMOI0ylv_051X0`y;>K2R?!O zPl5BnuYel&{{hvH`S0-gekrK&xgJ#h+d#GVbD-MwTTtVD$~#@ITnonBKOYqR-U1#E zeg#|!{u}rdaPIxi|4##z?ha7>`51VD(t$Dfh<7>t`aq56I#Bez3RFAxgJ**809Eei z0{$FSy4i=kKP$lVxW5L}xV;R#2z)nq7WfnJ5#S(K^7p0iL+zQ%%e%QQ56_nITjQDk z`v5oJ=Yj>IH}d|?;pJ`o7LR?HOLJr%*Cw950Q^s`VXo!e(**mwj^AJA*BbC!;IqMJ zas9o&Hah9&54cVW&o1G;{>}ndfyaPf2N#0-!4epA>2H%m^b+o06Q1o3s8@5jKFHPL zdNu7$zkZTLqpX;9M<6JAb7hes6`a2)|8~+(Sn%_rp-OBw6@EhO|_|M=!aV39G z;Mr%mc?Q>w{C;kDQRnv)`Ta~V`74DV&klGG_sWrjf=hF~!u5QvCx!RF0B|N)K5BXciHD;AUSAwtAZ=UZ7&jc^x{t{60vd!;i$oGG^ ze_HtcIPjI+{~1?*c=j58>+cLM#7p#JF3E=9ap?~cX}VUwx09!jYc{{1#kD~X!ylqA z`YWyx-ro!!6&1r#G~!8dYU#q|j82e|%=-}F;&iH^MU|+{U$<>sMR@T%%l% z;?ke=_eG>VHKgCn{gUwerTqQ`*KJ(-`zhDsxaRP_!u2Yy3GT1udJC8Se#G_f_KWo{ z-hZCoG1tXhW$yL&L#}_}TEX>vo(+K;x%9V>>o2%o#Pv)r{q1syZVLIstwDe8=Faf@ z@g3>@lIN##jdeVKD$o9dYZ1?11&(w5BbWYu?qGWR9pQHk{599lxYmZUt`GQLo_&X_ z#r^SI@8Y-qj^Vl{q_GG5a~{``;pQOk7I59p^#ZP^^ZdzN9|`XTv%>Gk@P3%- z2fl>+OSvA+^(gL720z3#!gVtDuLEDrbrru~#`Pe-ui?6h>jp0U-N*G&uFH9UE!S>- zSGoR&>t^m3fIGMj@cTEQ{_f%TnOw==UHtg(aPxBTmAqRDZU#>T&jw%3wV3M-+`o_O zZm#EWe+8HR{=p%74|oU9P7n8A1JB}G%e8~&p98mW>F-|qmskh5lXnk*r*NIe?`>Sk z-9OmqQ|_|^Lq9`U5lrDvw~uW=EYI}MOVc2M%;hVb!QJ; zKU^8Dw3_jFyV;5d%YmlUH@H8ZAI*>VR$62Ab}Oz=lxw1Nf3zkZtk-vsmm0fC+=#Ed zVxzT|hBnHj;r(%WU!~bWvn4)@yW`?lt!}TjlX+&G0Y}LmnOviB7}On(=y@VXTkDs);gHx_KOCZa_EyYTXfrH$?m5w#R;y7NY*VAL2hB?u&hC|Kgoe}pG$9P#E~lig z)oTM=uH3XKx}-F;yFFpkBTj1_q1kkPZK*b|6%W-X_Q%8Yd8j1<)c4T4^fsSn>Nm}a zGCiwWElCdbupGCWl(u=}=Jixl8>x)88{TiG+c0nDG*@u-$WqEt@S)`#E;o0#>Y>MJ z*~4|_b)&SG@huI1u> zV&maRDOdM*aAlgngpy?a0%JD2EeMNZ%0``; zQeftxa@A*SrB-Rdvy}rqCZY<_9D{U>0CNq&Imkrv*@$F7QI(qrAI-)j@kFVC{_!@!bd zhfA?Mm!MG|DK}8#5?ccc&qCi0*Mnd-<&K>6UbQ5lQx)5@gkdZKb(863ii51p@;Gy) zTCc5)$Lpw=YGt=rWq-XbIm6VWi{ntO$%M;FPt}fyUXy_#+1_kH3e)7ZR;9H+9*E1$ zq0$5`OiL&=C}ABn z#CQa~qQ0h@fV}Oh_g^~OhIvjkSTf3GVodWO?wix>%O$so75Ekgvx=>XP}M_7>Y^E4 zPTPme2sb7Sd>Ht7-TDn1x2%sx8+FtR6^az7{(3`_j*+O>%JCq~G&B~i%Zp^jRa(bX z#>oD7{l4-LQ@LCnj@H$O+GbQSN{nW^R^EqRfm0ac(uj;SNlWx|sft>!jH)TA(Zs!!-aVS_t$H1J!C?3 zn@PED3cV8N#dfqlxFt5@RkEA83u0_ZBMJ%@0o|f(8?~fu$R8W@Df2U#a%qdDMC+~j z6e~eGZ|=%@Na`{|nz1yuj^`EBK&eq);Sx2TdtYq{lQ<|tZS4Qi-jQ@{h ze`t{z8i`U1(t3BTzPCn`5n5Qaj2_Q}Td}^;;J!38RL1&8dN8g*gP2hD*MpdgK^q14 zA@@=R>7`_RkH_xF^mri;DgQWBTpL{xM_z5x7Cpi)2@g>y)>4@{CeSDL_j;Y$Qn{DI zZQ0D~V^DXwccbN&6{~KzC&sKFspnEuOPDcZDj;V$=iZN(cIze9&tM&=3Z-A$oqt{5 z(}PT?DVg)}9Jd3&wENksTq%j{OuJ{(p+^E!xtc0dyvse7rKhIV%>m3vE!CYgxwD$| zo$Q5WQSTxykajmTb%W3rS+^Sso+Z0tq6^f^9S9QdJw>V+g-?F_|Y zVKMyO-C!;y{V%jMJjYwdg)iZXb`{*LSFOP=t89*8iRB&^$`d!12c}Gbj55wbRCiR= z3^KlhmdWF8N@C9$mv3LcsZwk2GcjJ?*UGgfNx@UMZZd17gPW3+0$>D`}I8j55$^^1A z*90OxO_K*5qZ0g`9`(63f!#Jyflo&4({fMM5<(o zad@L%C2D3;WkEcO`!Z)Zmqzyg$go=;{&H5d!D>{O7zw$V{3?pvxPMM_emjT z#3QC*i>=QUD>X*FV%l_Gb-kXb;OD7-GW8*$B6al23^w=xsh33lI$Bf4Sy51~m`EO2 zXS;i+oT9j~a+P`Nj%8`QyQm5IvntV*nvJeCHi?(!2u8Pdca~t!if!&_iR5%Dk%%^o z_aVTx@tXE6Rf@k zvc`wT;wB+%IAp9ukZTY#7mv}x-l;c}^YgQKNdMe3&pCJLN_VsN5ml&`=M!^a*vCo} z?yrPWxT)7Y%A6ZkDgRjd$UXYPV9qdECs$aJcDv1z4nDCwA(&zFL^Em1 zH0fA(jF^=o7p-8_^_s8*;w>;OFNf%sT%?M^T;k9I4Z0g)7JJ$PNgC(SQKG$iHx;j; zF)9ZLr2BF}s2AT~VYQ6ud^sR39*erx)e$a?KmQ^kz5@=&>Vi70A z15xv?n`ch1!fNxbpBHUpaZ$4l={?@Awkld1#7(`iZQ)8fVSGh0ahDIb1uqq=swkr= zZE-GXrU>2^eeoX23ckADH);f9%Q9qbifjxkp_gvQHr>H$X1ZWNrS45DD7)NO0EiNp z5kcdP00TxcPbOldc~Z%4E2DA0_uW=H(xAuuDN{oXX~!fwGIhc>0oHTRnPI|ZOM4{j z8kEeZOvlIjr@@qM2Mr_@)5iC(uSJ{my=H9B2eN_^8hcDr$qJ(~7C0?Ux4X=$aA&Ie z;0**V7uZ;&YYc>*lEN)~jF#`pD1QVy4UQysoTSck=#<3pV88-MgkhL1X^gnFHO#VL z%RTP2RGV*8w=oPkjD-v5G1)z~JSbaLzI2XQS=w@KPo+_>X`&QU_`*e4>=V-YpkQSO1V>=K2Hwyaw+M^h%myqiwqF&ByD<#Hfwc~VM~RCd@4l4W-R~@mRoye9^2Ab=knH; zGE}g&B3HXx>alGS(9RuSYceWX$hzkak%%0*c%dQ``0k>;_HHm;ZP8tgvrQlpCY@Pq zd?kgQr}Np1yHboRsV~2MF}H;E1zToOm`YpgGSRTG=Z3C>u`Q)R_)I%ys-7^ z!g{_3vxt)yJ%UPhZAjEd&PPbI?ITJ zf0@%B(_>y}vdVf!H!WA7gxYOQDJYQ{W=vCW-M;Y}3TG>bMScP&*b-Gof3{gtO(^(Q zlgk&fvZea4Qb+qVM4l$v*169jb2T!<#YNxc8lGUuCuH$$hCu;o{A}*n7)DoEsNY0| z&+U<6o|)CiLo*@=%M74w6-i;1B5jL;G>Kep_hh?r?5`(t11zTPh-!E5F-sBzg8%~? z?Vu%07rtQ!o_v}jag`#pXM2dCXIw|bR@x@D5~A&6^}X7`7%N;BR#lq*wD`pL1=5%f z{ky&1ZXiAb3-)-gaCW(~R-;$y3Wnyy(7UmJmzJ`k?Ve(4M>{0wQDJ^ftFya1vegqj zB{W+z%0E(Rnbq9+N|fsm=R5G?VfUcz5>5*Sc6^QfMa4ux3N1)tUMe-ofT)&>sSH}I zsUX(cHtv$MmQ3}}l1|&FY_^fsU6Gs?V_@=G7@3f`>$wdJ zQeqJDD2}XZ+Gav&YW7L(_QlO1?X0uBdSE1wTdP=HZE@?7j({^_>LR*M@ zduGHdJlf&X;*-GN6}%2XRnHl!}0yys+R1A|mwwvKWoRle^q#CSqnnh&^()vC-VM z5$({OCclPas^ozdt_X%B$lW<@uS_R_?Y2eSm^d<%y6c@Sb!ir3tWA?bidmw@eBzFD zw&xV=+Bw*EP$*4Jr>1Q(R z%5^^t+Vi}}~K>jo)+q)*PCg3;uf*LP(?zD`LO^{zxqDyJZ ztRD<5YP$+GXOi6m-Mz}#TdK4sD#H|F0r^~##K5H{+vC>R>*W0c+tH-AX>2avT5~cm z4Y29hb0rH+og{^Agz+#Y8MQbu2X#gT85y z{nKfNz}coz5IaR%NtD$RpO()oc)`fmncfW)8dm9msUJ7JD9~&?FcUW&uFaLUe2LTdq$4ru9oDYRm-K?LX|&*}7Bg&^E(1vY={5G9Ln{kA4-c<6E zFCGq*8}-oaD6J~x<>3DGbJQy@vu`nMDY`?BOK_UC3jk}cok)cspoT2gS!MHp!YCya{cto?Vv~w3higdOxFFiIv$`POxrwXIb>;lD zB5eoOCp>U*Im+BaSH2K?=f0a5nwv9!1A=C&L)y1)8}ebFy;0f^q_v0Fc+$C#x3!nZ zhwbAnH_6dxv?t`Rc$k|9$tDBIXV*XZ&1}W@+J%4y>7Afzku&2z|4;>Tgq0y*^c?ZP zv#*mTGBg?{o}z8{oepJLVfg9aDne<=cFEP+l`V};Ri zo3wY^CsC7^Ze6+v@3{3aZpW~v@rn94yBOU&MKjdOdri)c5Zh9*a3#T~l+E}`tbg(R z^m&Nsr;&L{>-1{`GqIvxq9YX%m3{Cb%Q>SMqtJ_qCntU9Hnn)?L^=a0TjM^41FZ7VbXbOKX03hW^9I9QR19p7{_CPax%$b6B|2=8tETw0Kz zE2cwNs`^liITr+Q6G18~IeZ|v^W5{#kHV^NnBiJQK%6owlI?0*1M^MZtR(HJ(1YrJ zG(wr3^uwr$@JS7^og7o3a{L28|6C_jk+!gt%Lp0k%PN#wQTc@D2vGb(J_|Bw&ZL{5 zo8glWzOaeXM##C>r-c@f(BNckB2m|_yG-%0^9`~{c9!D8mm@*n2elSqbMvV!4hkg2 zvyZa!eaa@sVt1TMo?SAnQccGW`|(cY-&2RHGnkUT zO9Us0w8Ai2V;f8^%8^=6hkL*3a0#|emB5X@ zX1p`nLwp1hO{LYRe=TX#Q>{;#&E!~=&ciTC#04HPVh~|WxL2!8ZnnwP9B}2+Yn-+< z>asruHVzM5<)3=8^^(B$tSid;K6zksbF?x%a7lZ#Ik1DZ`B~ex?ig4r$-x{QScd>v z5udYo$>M><=MJ2+EMBr?#nR;iiAgvei_(- zbZ8Rv)Ao|5)@x(&)r!M0(O2ED*MD6+TC0zj7uFl2tI1LuZL>vuUYSyN(b0a zi>TU0i`$aG<#?5)ADC$E8f*;6V#^nxCA_S=OBODkwbo_$fWj>+ETXrFAY_GaLo{Jo zD!b4Yo3nIkFamF2eK-qXMZA2l(wcS6z_vQ}R%;+>Oi!sZH2z^TKmjbg`co_SfRo@sjx~XGQ%wdqDfGC*MB#mOA2Z&*Xg= zFQtcm7(uHt!LC-U+y?QFJ$0?a*&{HVMUY@Kvi(~%RXF*M7)dr1KE~t&QmbBzoRbeU zi?8}t_3?F^GEHF4Hzx0sE-6pGoxRNzq48ApA;eLiaUFH->+)|wS>xziwTN1>_H|Vy zMc_42=|it9B^Wr!bxkwH=`B4$A(OOtNXh8WK9VqoA%`jN+0Tr zh9?hkQUN`-;|tp1_yWkbhtI3^$$ArIMtx04+_19?`1X{zZG%uiEV}pt-$$X6 z;&MEBFEPSOm_f84c-cOqpr1R`mTjb7ac`0Dul1Qd(v?rteC#1l%1};8LL#(GB_`=K zQZ`T`nNB*`%I3`KSSc>SH?)DSh3Q8w|AxieOF#M2tZ6-C-b^T|0;Vm|iqC@UgLw4W zgQ+vkJSE)=ZQ)x!J1C)7sn%$s=ZpnS#ys)U5}bIpIRdh@n{ADwgo-)JM$2NCrY%RL zPDfC5o@s$e59YwXFw1?YDm4?n9fa&m-mIt|of|2kE}1JO+_g#znT%c~sGtGoM z!NsE(y1O_{X*8+3v~Wg4cR?1efB}gL=E%~c{Za&4Gg2^DTV=%fSO-ijUWgz?5vlIZ?{O`1C4jjy5rNlo7W1{Qf1B?Tm)sr<@JM)NOat@6nqb>1h!?TA~9Z9_lP~ zSv-@8>Ytc|`JFgC*xq=TJ=((NaMYT!gwI-bZ=}j9nFcqc8esY&vi8Nc(|J4Wo=D3Q zMh1eM5XpfcGKmheTVnD)3Egg5!%&b(uBA>wxN-6$lkX%DUor{la-9@6U;yPbCwg3( zsJpNd4pv1PKt_bJuzkHH^&!#2=l*TXH1=7*;KuAK#p{^EUZF0g&XtBAjHp&biM^n? zwk7!__%i|QJ|?QukGe1|Q$q0(McS=z{Kp3;A7D|w-m6mo9*o^{n{BK9#{BUYYEW|c zg#yBPTLN_r(K)pv*gBfYOk%#dP+V3XBDXS2b@s(!6D?=+1qN#v3rX%YOP`&A(dSw{ zkq|{w&idWL(3rZEnyBs3Am7Y3dKT?9OIC>;h7kX9iTw_pam)gSuK`hp$;f{7#C?j_#Odl#=ptWtk6P zB+)!dN^|i)gBDinqq2d5uSq$~1PwaA=0m2?!(sqQn55M#s}X+0mKS}{1_Q1~G~=nSYhK-^#6*L~CnZN|Faqb~psV8X-MoHtbS^+ZCWI4`shQvhw}@^t1pIniO#oKj+Z z(d%C<1r;pP1ut;{T_U8NwY7xa4{F0nX->AxhH1(Ob3N^_JEC1h*?}IWO#0@o?6Z#3 zef(K87OhBB4PRGyv<01yCYZ@7Ay#NkH_CpVk!sviADVn;K|%g+sKqTI7LxP`j@1EJ zLHXkWAlixOOVe+q+jeA#Vg^MAem(n3V!+-O!(?@8rq+RZK4^2LRSFP#ces`e?Pm(vu zv)7y>Vg{)7I=ETcTl!ibl=Z8fP>pe!%odZ7uCn-uNmN(%?i?r0s+MXtNhRPgCW)~U zy--*#N#Ko=&6zVf3n|<~37R*1Q^TRPiHir9*?s9@BZT98jFhBI2;_;UtBCEu9pj$*dcAtx`BE~Uz?@kn9o5)oS5{a} zW`;Qvw!r$+-sxHF!zc`fSJwa!wpqJjp}O~&=vzD9c9Y&&E4=PW|HS7qYg?Oa>v7n? zU1(;KEV1Gwst`7^>ATvRq}6_~MPuep$rZ>4)TQkdbS%!iBqKH*-^CDwlg-z&895KJ z=lkhqZ&FKFnv}NgrXZ$K;vK0{DFOdmpvXl`p%IDulrUo#fszD%;EA?m!qvUFt{`aK z7?BLwhc}%a>mvc2c)z_0K@)Nk3hcoq8GR%x=PFs9C4dJ@6@^u9at_teEfvBRz4L}% zLpP+c9fC4dEd~0d@d0Ny`fe*~gaRurr9`lfcI6I3QEiG-Yraf5A(HpzTBWjTYeHpX zS|8?#$@i%Rlx0E$j_x=Xg@9%_iN$>*WZ!uD-JO+RPi{kWZM`Mr^K_0zNhY0!SPmVZ zv~yZ1x=Z_%=5RzxnwC;^LWo9aA{m{+c?%&`QPqdJnL8yV?Mzy3 zF+QI1YR7wmQ8<3q0Qd=lN*c+=3jUYvMkexGY>jXKBxOgc9u1!=>C^>|;tJyxwD)OQ zl7$#QDn@j`9EaC+#6cryT!?QKJ$5$F_K6} z?L;rI8Ye&M02XC_`~2n|TqEwg_0ko}3A%T8VCu4$TV z>FFyEDOYw1OPXy>F1jecdA!ZCa$vQn;OXV$gQ5qv+0=!TzG@JgOqt$R8wxAENwpS9 z;G0_=$^!c)0>b=at=M}U7Phce@2$ODCD(~+QnoN5CMt&Cw|DzkzM^4O>Ahx~t zaV}c_wF6uV3(7aNhfAy_oBzzdT#xLe(T&2 zeRU5`=O-6KYNtz2|RS9+uks|dLWj64C~TI(il zcB%_$ZS64IXHvKC+n5PqttnY9;GU7OO)`{~YzhehG3!aP>tRQ-?Ic+u&yo|3O6|Zv zt(Z`gg?;(nZMuw>$^&LuAv4KC!~Hy%hmd&L()m-3Y={r#23GtIe}p(ew9Z7h7@$D} zOyWH4zrJqwohpg8ruT_2lcvfNg(*FQH>O6D!ab6o<|@3iPxlq?NnfYcv2_ExFnw;> zwhrD*Iejzu@Zo)6AzBF}iZ-}L)MrS~~Q|MkI-9z!ZGpb7^nB!w&37Md6 zMhj`F)G}f6zEAd+%!6dut>L*+l2mJxl_0UHLFZv1xp$b+}F4&b856 z9W0KRfzvElF?G?22+w&ST5=6qwmYA-Sc8_0<1~q~p`TGAapYmkRkw(gnwLlaEqxHI zI`n0@tz}7TrppK|@LD**&%TjF4*PpBW$JCh)GViW8!s-Z#qGi53?FZp1UEwx_d2)f z8J zW1b`j=3r`TvjH~z7RmRb8RelM(I{P3udy;@donD%ZmYzBhF*Y{c|6#K0Jcr1wsDNH zpK_Dp7GJc@BIB_yN%(O%cmxU)vfReb_sRr|4pL$|&m}cBqwW&m&2eS4NfioW*1%H5 zX6Sv^@MJd@8H>qsTPjmB8E?ww)n@s?h12IM&?a5phW@RJFQ&|ZN~XqHpc4xw{qiBS zu4s3UQQbxrwzTs?BtsxaHq2^CuCs~JPMJv$FlG}|uO`Pd)lX*SThQ0(<`K)J1O}=- z9yod-&JX3FcZWT!eXjmGWDhqV-1AXeb?J;l!?seF_TU=;m z*!wQ*3yaIStyGDfYFt9K=~|-Ea&5Yerf1Qlr`$~SvUclzu}?>APhYZj>*Z%F?7sXu zXPb7D4LWQk3pYR3b?<%(`Ip>h?m_n5ufzKX#7U;??~pIK(# z@3lNiMlCqga5P4be`=GfEAn|Q&Bso`Vb-xdNo(?*sd`VA_KSfm&sZ?Mne{1$(F5O{ zrZM(!pmG+t&QU=aW7ESMK?~>gwGS>E$yk+>0Y0L0<`VBPaR(?*dy3o{&}u7PH3_f1 z>H28_8Md0c_fSk;l`pO|GHsKjThR}clUqhYJalc&PL2q&cDsfdD-9CI_1>65N%py? zLOuydu&>-3EV9U*?^c&2aa|DnorH&>7}|CHz6ysmw(1%yZGOmaXjl9pBwGvb1NeYcgF_d~40`sgCeDszGX4qQq|sM-FYyy-)cy zIJ`-S*f`9#>zHoXVJopEg2yt$<}l!w)H<+{EaR zP*0Y6nF{n#Cl%SikSftsX#j*IX(xKLD4Q4IFagsx)l^Ld;WV_YUUpTf{An{T~LaeEQgU?V@7C~<cn+h_xLgBYL!LQ1xzv3}QI63CC>+m8!oru0qmG!V`C1!#y+S2WKFh0HZTl=zM zkcZ~}SYF7S?dR^^-s3S4Tfe54hsl=k6h!RU|}{zit#(_u7x!PV?W(=941|2c9~e^bok7=z@#e= z@v)lQJ0WIW_bnN@QkYJK&wdIgGL`a+a5VMynm@SB#m@E=W8%~m)hqjHvj%OmU z)zJ@YfDLtL4zkR}XU6ApSJ?)s2&c6_Gu5OY&+ZPLP7 zgnQZ2-xxOPPL%n~hY>c@NoHy4{fC+E5il4-j0Rb9fj6B5HTj~+SFYb4&Vn+h#pZ4z zV09Lh^owoYay==oNA)DWVs^kw#EDQnO5hkOm4KEBpX4%drvA;c&;$x&rDHn8dZC+0 zTst^J26{QRgQ1EZcs^_7lg8J%3hi?rSx3ZJGxFM89w!EbyS>5e?ES@SkF13~4aDIa zoaTiU>P(Uw5EIfmb%_=-OyM&lp4vA|;fp0YSU6y+RK?3CkPFYdLFoQ$(pHVLVoeoR zgxcBHXI)25S+i~PSUP_67`~63;VC3FKQ(vrYZ=KgRE%43-v#C_$FN!p*eJ{qNA<|# z($;AYk%%LU-@y=i=IDj&Lm0>%=>#e{#1Kaj0Xl09F3#Nc+2A7NGc{PD~e;KC^uWP9DdSOenv1`d@`n9n6I{aj5t4+no&UnWg;>ag``G= zj_O0|k;=YOl&?p}xU_Ztm5vZ&0aT%9W`+y$?3rm+lcAZ2<6|GKv9gZqTPS){KboH< zNo?F? zOLVBz)|cM)EvZpF=}1^T3&EOv4^Zam)N-lg5kYzrW&42Wv>*9Z7&wHshSe*f{n%u# z;lsIKMg&C-Lhz&%5g-fUZg~O~tb3U*Y3L|xNvAcz!CRB}aRyl3jsQzmj5q>JA9EMJ z=3$7sV$$+HO?agC24Bwce_F|f`rS#M(*7#%vrif{{t3Ng2nMG_=YoaiEm^$K&IKE; zvx43;sVyF`@+k>m1r*4bIgLEdHpAvsVy!g9Ssaq}VR6U2 zWy*@pEwa$>%#{nvNs0Q2Qnq#ekslwvfD0-6FPcf3RWnJnZMsDA8_L<4Vx3wc*jnLi zu-, 2001-2005 +# Leonardo Ferreira Fontenelle , 2006-2009. +# Vladimir Melo , 2007, 2009. +# Luiz Armesto , 2008. +# Og Maciel , 2008-2009. +# Henrique P Machado , 2008-2009. +# Fábio Nogueira , 2009. +# Jonh Wendell , 2009, 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-04 17:12-0300\n" +"Last-Translator: Jonh Wendell \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Portuguese\n" +"X-Poedit-Country: BRAZIL\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo \"%s\" inesperado para elemento \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Não foi localizado atributo \"%s\" do elemento \"%s\"" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Marca \"%s\" inesperada, esperava marca \"%s\"" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Marca \"%s\" inesperada dentro de \"%s\"" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Não foi localizado arquivo de marcadores válido nos diretórios de dados" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Já existe um marcador para o URI \"%s\"" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Não foi localizado marcador para o URI \"%s\"" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Não foi definido tipo MIME no marcador para o URI \"%s\"" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Não foi definido sinal de particular no marcador para o URI \"%s\"" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Não há grupos definidos no marcador para o URI \"%s\"" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Nenhum aplicativo chamado \"%s\" registrou um marcador para \"%s\"" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Falha em expandir linha de execução \"%s\" com URI \"%s\"" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" +"Não há suporte à conversão do conjunto de caracteres \"%s\" para \"%s\"" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Não foi possível abrir conversor de \"%s\" para \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Seqüência de bytes inválida na entrada de conversão" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erro durante a conversão: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Seqüência de caracteres parcial no final da entrada" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Não é possível converter a seqüência \"%s\" para conjunto caracteres \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "O URI \"%s\" não é um URI absoluto que utilize o esquema \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "O URI de arquivo local \"%s\" não pode incluir um \"#\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "O URI \"%s\" é inválido" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "O nome de servidor do URI \"%s\" é inválido" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "O URI \"%s\" contém caracteres com escape inválido" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "O nome de caminho \"%s\" não é um caminho absoluto" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nome de servidor inválido" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Erro ao abrir o diretório \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Não foi possível alocar %lu bytes para ler arquivo \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Erro ao ler arquivo \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Arquivo \"%s\" é muito grande" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Falha ao ler do arquivo \"%s\": %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Falha ao abrir arquivo \"%s\": %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Falha ao obter atributos do arquivo \"%s\": fstat() falhou: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Falha ao abrir arquivo \"%s\": fdopen() falhou: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Falha ao renomear arquivo \"%s\" para \"%s\": g_rename() falhou: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Falha ao criar arquivo \"%s\": %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Falha ao abrir arquivo \"%s\" para escrita: fdopen() falhou: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Falha ao escrever no arquivo \"%s\": fwrite() falhou: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falha ao escrever no arquivo \"%s\": fflush() falhou: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falha ao escrever no arquivo \"%s\": fsync() falhou: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Falha ao fechar arquivo \"%s\": fclose() falhou: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "O arquivo \"%s\" não pôde ser removido: g_unlink() falhou: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Modelo \"%s\" inválido, não deveria conter um \"%s\"" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Modelo \"%s\" não contém XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Falha ao ler link simbólico \"%s\": %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Não há suporte a links simbólicos" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Não foi possível abrir conversor de \"%s\" para \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Não é possível fazer uma leitura em bruto em g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Dados residuais não convertidos no buffer de leitura" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Canal termina num caractere parcial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Não é possível fazer uma leitura em bruto de g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Falha ao abrir arquivo \"%s\": open() falhou: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Falha ao mapear arquivo \"%s\": mmap() falhou: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erro na linha %d caractere %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Texto do nome codificado em UTF-8 inválido - \"%s\" não válido" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" não é um nome válido" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" não é um nome válido: \"%c\"" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erro na linha %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Falha ao analisar \"%-.*s\", que deveria ter sido um dígito dentro de uma " +"referência de caractere (ê por exemplo) - talvez o dígito seja grande " +"demais" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Referência de caractere não terminou com um ponto e vírgula; provavelmente " +"utilizou um caractere \"e\" comercial sem desejar iniciar uma entidade - " +"escape-o com &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Referência de caractere \"%-.*s\" não codifica um caractere permitido" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Entidade \"&;\" vazia vista; as entidades válidas são: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nome de entidade \"%-.*s\" não é conhecido" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entidade não termina com um ponto e vírgula; provavelmente você utilizou um " +"\"e\" comercial sem desejar iniciar uma entidade - escape-o com &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Documento tem de começar com um elemento (ex. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"\"%s\" não é um caractere válido após um caractere \"<\"; não poderá começar " +"um nome de elemento" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Caractere estranho \"%s\", esperado um caractere \">\" para finalizar a " +"marca \"%s\" de elemento vazio" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Caractere estranho \"%s\", esperava-se um \"=\" após o nome do atributo \"%s" +"\" do elemento \"%s\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Caractere estranho \"%s\", esperava-se um caractere \">\" ou \"/\" para " +"terminar a marca inicial do elemento \"%s\", ou opcionalmente um atributo; " +"talvez tenha utilizado um caractere inválido no nome de atributo" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Caractere estranho \"%s\", esperava-se uma aspa aberta após o sinal de igual " +"ao atribuir o valor ao atributo \"%s\" do elemento \"%s\"" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"\"%s\" não é um caractere válido após o nome do elemento de fecho \"%s\"; o " +"caractere permitido é \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elemento \"%s\" foi fechado, nenhum elemento está atualmente aberto" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elemento \"%s\" foi fechado, mas o elemento atualmente aberto é \"%s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Documento estava vazio ou apenas continha espaços" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Documento terminou inesperadamente logo após um menor que \"<\"" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Documento terminou inesperadamente com elementos ainda abertos - \"%s\" foi " +"o último elemento aberto" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Documento terminou inesperadamente, esperava-se ver um maior que (\">\") " +"para terminar a marca <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Documento terminou inesperadamente dentro de um nome de elemento" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Documento terminou inesperadamente dentro de um nome de atributo" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Documento terminou inesperadamente dentro de uma marca de abertura de " +"elemento." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Documento terminou inesperadamente após o sinal de igual que se seguiu a um " +"nome de atributo; nenhum valor de atributo" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Documento terminou inesperadamente dentro de um valor de atributo" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Documento terminou inesperadamente dentro da marca de fechamento do elemento " +"\"%s\"" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Documento terminou inesperadamente dentro de um comentário ou instrução de " +"processamento" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objeto corrompido" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "erro interno ou objeto corrompido" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "memória insuficiente" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "limite de backtracking alcançado" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "o padrão contém itens sem suporte para correspondência parcial" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "erro interno" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"não há suporte à referência retroativa como condição para correspondência " +"parcial" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "limite de recursão alcançado" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "limite de espaço de trabalho para substrings vazias alcançado" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinação inválida de sinalizador de nova linha" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "erro desconhecido" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ no fim do padrão" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c no fim do padrão" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "caractere não reconhecido segue \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"escapes de alteração de maiusculização (\\l, \\L, \\u, \\U) não são " +"permitidos aqui" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "números fora de ordem no quantificador {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "número grande demais no quantificador {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "terminação ] em falta para classe de caracteres" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "seqüência de escape inválida na classe de caracteres" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "intervalo fora de ordem na classe de caracteres" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nada a repetir" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "caractere não reconhecido após (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "caractere não reconhecido após (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "caractere não reconhecido após (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "classes nomeadas POSIX têm suporte apenas dentro de uma classe" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "terminação ) em falta" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") sem abrir (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "dígitos (?R ou (?[+-] devem ser seguidos por )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referência a subpadrão não existente" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr ") em falta após o comentário" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "expressão regular grande demais" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "falha ao obter memória" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "declaração lookbehind não é de largura fixa" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "número mal formado ou nome após (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "grupo condicional contém mais que duas ramificações" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "esperava-se declaração após (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nome de classe POSIX desconhecido" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "elementos de arranjo POSIX sem suporte" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "valor de caractere na seqüência \\x{...} é grande demais" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condição inválida (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C não permitido na declaração lookbehind" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "chamada recursiva pode causar uma repetição indefinidamente" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "terminação em falta no nome do subpadrão" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dois subpadrões nomeados têm o mesmo nome" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "seqüência \\P ou \\p mal formada" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propriedade desconhecido após \\P ou \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nome de subpadrão é grande demais (máximo 32 caracteres)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "excesso de subpadrões nomeados (máximo 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "valor octal é maior que \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "O grupo DEFINE contém mais que uma ramificação" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "repetição de um grupo DEFINE não é permitida" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opções do NEWLINE inconsistentes" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g não é seguido por um nome entre chaves ou um número diferente de zero " +"opcionalmente entre chaves" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetição inesperada" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "estouro de código" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "espaço de trabalho de compilação invadido" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "subpadrão de referência verificado anteriormente não localizado" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Erro ao coincidir expressão regular %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteca PCRE compilada sem suporte a UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Biblioteca PCRE compilada sem suporte às propriedades UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Erro ao compilar expressão regular %s no caractere %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Ero ao otimizar expressão regular %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "esperava-se dígito hexadecimal ou \"}\"" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "esperava-se dígito hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "\"<\" em falta na referência simbólica" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "referência simbólica inacabada" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referência simbólica de comprimento zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "esperava-se dígito" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referência simbólica ilegal" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "\"\\\" final sem isolado" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "seqüência de escape desconhecida" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Erro ao analisar texto de substituição \"%s\" no caractere %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Texto citado não começa com uma aspa" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Aspa sem par na linha de comando ou outro texto de console" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Texto terminou logo após um caractere \"\\\". (O texto era \"%s\")" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Texto terminou antes da aspa equivalente ter sido localizada para %c. (texto " +"era \"%s\")" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Texto estava vazio (ou apenas continha espaços)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Falha ao ler dados de processo filho" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Falha ao criar canal para comunicar com processo filho (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Falha ao ler de canal filho (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Falha ao ir para diretório \"%s\" (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Falha ao executar processo filho (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de programa inválido: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "String inválida no vetor de argumentos em %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "String inválida no ambiente: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Diretório de trabalho inválido: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Falha ao executar programa auxiliar (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Erro inesperado no g_io_channel_win32_poll() ao ler dados de um processo " +"filho" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Falha ao ler dados de processo filho (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Erro inesperado no select() ao ler dados de processo filho (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erro inesperado em waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falha no fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Falha ao executar processo filho \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Falha ao redirecionar saída ou entrada do processo filho (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Falha no fork de processo filho (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erro desconhecido ao executar processo filho \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Falha ao ler dados suficientes de canal pid do filho (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Caractere fora do limite para UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Seqüência inválida na conversão da entrada" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Caractere fora do limite para UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Uso:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPÇÕES...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opções de ajuda:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Exibe opções de ajuda" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Exibe todas as opções de ajuda" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opções de aplicativo:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Não é possível analisar o valor inteiro \"%s\" para %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Valor inteiro \"%s\" para %s fora dos limites" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" +"Não é possível analisar o ponto flutuante com dupla precisão \"%s\" para %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Ponto flutuante com dupla precisão \"%s\" para %s fora dos limites" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Erro ao ler a opção %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Falta argumento para %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opção %s desconhecida" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Não foi possível localizar arquivo de chave válido nos diretórios pesquisados" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Não é um arquivo comum" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Arquivo vazio" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Arquivo de chave contém a linha \"%s\" que não é um par chave-valor, grupo " +"ou comentário" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupo inválido: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Arquivo de chave não começa com um grupo" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de chave inválido: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Arquivo de chave contém codificação \"%s\" sem suporte" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Arquivo de chave não tem grupo \"%s\"" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Arquivo de chave não tem chave \"%s\"" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Arquivo de chave contém chave \"%s\" com valor \"%s\" que não é UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Arquivo de chave contém chave \"%s\" que tem valor que não pode ser " +"interpretado." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Arquivo de chave contém chave \"%s\" cujo valor não pode ser interpretado." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Arquivo de chave contém chave \"%s\" no grupo \"%s\" que tem valor que não " +"pode ser interpretado." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Arquivo de chave não tem chave \"%s\" no grupo \"%s\"" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Arquivo de chave contém caractere de escape no fim da linha" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Arquivo de chave contém seqüência de escape \"%s\" inválida" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "O valor \"%s\" não pode ser interpretado como um número." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Valor inteiro \"%s\" fora dos limites" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "O valor \"%s\" não pode ser interpretado como ponto flutuante." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "O valor \"%s\" não pode ser interpretado como um booleano." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Valor muito alto passado para %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "O fluxo já está fechado" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "A operação foi cancelada" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Objeto inválido, não inicializado" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Seqüência de bytes incompleta na entrada" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Sem espaço suficiente no destino" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Sem suporte a inicialização cancelável" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "tipo de arquivo %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "tipo %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Fim do fluxo precoce não esperado" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Não nomeado" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "O arquivo da área de trabalho não especifica o campo Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Não é possível localizar o terminal requerido para o aplicativo" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Não é possível criar pasta de configuração do aplicativo do usuário %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Não é possível criar pasta de configuração MIME do usuário %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Não é possível criar arquivo %s da área de trabalho do usuário" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definição personalizada para %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "unidade não implementa ejetar" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "unidade não implementa ejetar ou eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "unidade não implementa verificação por mídia" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "unidade não implementa start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "unidade não implementa stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Não é possível lidar com a versão %d da codificação GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Número inválido de tokens (%d) na codificação GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Não é possível lidar com a versão %d da codificação GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Número inválido de tokens (%d) na codificação GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperado um GEmblem para o GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operação sem suporte" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Ponto de montagem contido não existe" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Não é possível copiar sobre diretório" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Não é possível copiar diretório sobre diretório" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Arquivo alvo existe" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Não é possível copiar o diretório recursivamente" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Não há suporte a união de arquivos" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Erro ao unir o arquivo: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Não é possível copiar o arquivo especial" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Valor fornecido de link simbólico inválido" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Não há suporte para lixeira" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nomes de arquivo não podem conter \"%c\"" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volume não implementa montagem" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nenhum aplicativo está registrado como manipulador deste arquivo" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "O enumerador está fechado" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "O enumerador do arquivo tem operação pendente" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "O enumerador do arquivo já está fechado" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Não é possível lidar com a versão %d da codificação GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Dados de entrada malformados para o GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Fluxo não tem suporte para query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Não há suporte à busca no fluxo" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Truncar não permitido no fluxo de entrada" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Não há suporte a truncar no fluxo" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número errado de tokens (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Sem tipo para a classe chamada %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "O tipo %s não implementa a interface GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "O tipo %s não tem classe" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versão malformado: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "O tipo %s não implementa from_tokens() na interface GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Não é possível lidar com a versão fornecida da codificação do ícone" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Fluxo de entrada não implementa leitura" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "O fluxo tem operação pendente" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Sem espaço suficiente para o endereço do soquete" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Endereço de soquete não suportado" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Não é possível localizar o tipo de diretório monitor local padrão" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome de arquivo inválido: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Erro ao obter informações do sistema de arquivos: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Não é possível renomear o diretório root" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Erro ao renomear arquivo: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Não é possível renomear o arquivo, o nome do arquivo já existe" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nome de arquivo inválido" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Erro ao abrir arquivo: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Não é possível abrir diretório" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Erro ao remover arquivo: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Erro ao mover arquivo para a lixeira: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Não é possível criar o diretório da lixeira %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Não é possível localizar diretório de nível superior para a lixeira" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Não é possível localizar ou criar o diretório da lixeira" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Não é possível criar o arquivo de informações da lixeira: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Não é possível mover arquivo para a lixeira: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Erro ao criar o diretório: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "O sistema de arquivos não tem suporte a links simbólicos" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Erro ao criar link simbólico: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Erro ao mover arquivo: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Não é possível mover diretório sobre diretório" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Falha ao criar arquivo de backup" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Erro ao remover arquivo alvo: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Não há suporte a mover entre montagens" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Valor de atributo deve ser não-NULO" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo inválido (esperava-se expressão)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nome de atributo estendido inválido" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Erro ao definir atributo estendido \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Erro ao iniciar arquivo \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "(codificação inválida)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Erro ao iniciar descritor de arquivo: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo de atributo inválido (esperado uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo de atributo inválido (esperado uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo de atributo inválido (expressão de byte esperada)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Não foi possível definir permissões aos links simbólicos" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Erro ao definir permissões: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Erro ao definir proprietário: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "o link simbólico deve ser não-NULO" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Erro ao definir link simbólico: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Erro ao definir link simbólico: o arquivo não é um link simbólico" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Erro ao definir data/hora de modificação ou acesso: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "O contexto SELinux deve ser não-NULO" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erro ao definir o contexto SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux não está habilitado neste sistema" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Não há suporte à definição do atributo %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Erro ao ler do arquivo: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Erro ao buscar no arquivo: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Erro ao fechar arquivo: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Não é possível localizar o tipo de arquivo monitor local padrão" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Erro ao escrever no arquivo: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Erro ao remover link antigo de backup: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Erro ao criar cópia de backup: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Erro ao renomear arquivo temporário: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Erro ao truncar arquivo: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Erro ao abrir arquivo \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Arquivo alvo é um diretório" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Arquivo alvo não é um arquivo comum" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "O arquivo foi modificado externamente" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Erro ao remover arquivo antigo: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "GSeekType fornecido inválido" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Solicitação de busca inválida" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Não é possível truncar GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Fluxo de saída da memória não redimensionável" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Falha ao redimensionar fluxo de saída da memória" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Quantidade de memória necessária para processar a escrita é maior que a " +"disponível" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Solicitada uma busca antes do começo do fluxo" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Solicitada uma busca além do fim do fluxo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "objeto de montagem não implementa \"desmontar\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "objeto de montagem não implementa \"ejetar\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"objeto de montagem não implementa \"desmontar\" ou \"desmontar_com_operação\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"objeto de montagem não implementa \"ejetar\" ou \"ejetar_com_operação\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "objeto de montagem não implementa \"remontar\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "objeto de montagem não implementa estimativa de tipo de conteúdo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"objeto de montagem não implementa estimativa de tipo de conteúdo síncrono" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nome da máquina \"%s\" contém \"[\" mas não \"]\"" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Fluxo de saída não implementa escrita" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "A fonte do fluxo já está fechada" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Erro ao resolver \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Erro ao resolver reversamente \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nenhum serviço de registro para \"%s\"" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporariamente sem condições de resolver \"%s\"" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Erro ao resolver \"%s\"" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Soquete inválido, não inicializado" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Soquete inválido, inicialização falhou devido a: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "O soquete já está fechado" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "Criando GSocket a partir do fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Não é possível criar soquete: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Foi especificado um protocolo desconhecido" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "não foi possível obter endereço local: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "não foi possível obter endereço remoto: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "não foi possível escutar: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Erro ao vincular ao endereço: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Erro ao aceitar a conexão: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Erro ao conectar: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Conexão em progresso" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Erro ao conectar: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Não é possível obter erro pendente: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Erro ao receber dados: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Erro ao enviar dados: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Erro ao fechar soquete: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Aguardando pela condição do soquete: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Erro ao abrir enviar mensagem: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "não há suporte a GSocketControlMessage no windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Erro ao receber mensagem: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "erro desconhecido ao conectar" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "O ouvinte já está fechado" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Soquete adicionado está fechado" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Não é possível lidar com a versão %d da codificação GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Esperando 1 mensagem de controle, obtive %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tipo de dado auxiliar não esperado" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Esperando um fd, mas obtive %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Recebido fd inválido" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Erro ao ler do unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Erro ao fechar unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Sistema de arquivos root" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Erro ao escrever para unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Soquetes de endereços de domínio unix abstratos não suportados neste sistema" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volume não implementa ejetar" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume não implementa ejetar ou eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Não é possível localizar o aplicativo" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Erro ao lançar o aplicativo: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Não há suporte a URIs" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "não há suporte às alterações de associação em win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Não há suporte à criação de associação em win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Memória insuficiente" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Erro interno: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Precisa de mais entrada" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Dados comprimidos inválidos" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Seqüência UTF-8 inválida na entrada" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Foi alcançado o limite máximo de matriz de dados" + +#~ msgid "do not hide entries" +#~ msgstr "não ocultar entradas" + +#~ msgid "use a long listing format" +#~ msgstr "usar um formato de listagem longo" + +#~ msgid "[FILE...]" +#~ msgstr "[ARQUIVO...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Caractere \"%s\" não é válido no início do nome da entidade; o caractere " +#~ "& inicia uma entidade; se este \"e\" comercial não é suposto ser uma " +#~ "entidade, escape-o como &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Caractere \"%s\" não é válido dentro de um nome de entidade" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Referência de caractere vazia; deveria incluir um dígito tal como dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referência de entidade inacabada" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referência de caractere inacabada" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Texto codificado em UTF-8 inválido - seqüência muito extensa" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Texto codificado em UTF-8 inválido - não é um caractere inicial" + +#~ msgid "file" +#~ msgstr "arquivo" + +#~ msgid "The file containing the icon" +#~ msgstr "O arquivo contendo o ícone" + +#~ msgid "name" +#~ msgstr "nome" + +#~ msgid "The name of the icon" +#~ msgstr "O nome do ícone" + +#~ msgid "names" +#~ msgstr "nomes" + +#~ msgid "An array containing the icon names" +#~ msgstr "Um array contendo os nomes dos ícones" + +#~ msgid "use default fallbacks" +#~ msgstr "usa os fallbacks padrões" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Se deve tentar os nomes mais curtos, localizados através do caractere " +#~ "'-'. Ignora nomes depois do primeiro, de vários foram fornecidos." + +#~ msgid "File descriptor" +#~ msgstr "Descritor de arquivo" + +#~ msgid "The file descriptor to read from" +#~ msgstr "O descritor de arquivo de onde ler" + +#~ msgid "Close file descriptor" +#~ msgstr "Fechar descritor de arquivo" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Fechar ou não o descritor de arquivo quando o fluxo for fechado" + +#~ msgid "The file descriptor to write to" +#~ msgstr "O descritor de arquivo para o qual escrever" diff --git a/po/ro.gmo b/po/ro.gmo new file mode 100644 index 0000000000000000000000000000000000000000..95e457569be0941ab3ebe0d53d31b430d60a01d0 GIT binary patch literal 46329 zcmd6w2b^42b^jljYN`#mTYfH*R!F-l?kcur6CznoK8@!S!Chb*EP-DJPXy0BD~e77w}1=42B>lmg7d&X1}_D_ z0v-n*KR1f50>{87g3kpPf(OA7@RMK+{tP@Bd>oljRJ0IOd0W8a!78{6ycN6;%@|1-m^i~?@eF~egIVaz6PpZ zdf;bt3b+Vd2U6vz1yY6R4iHjCf9dgiApb=VeX^_PVld|UN^mvU0^b0>A5?v}Q%TYF zdT<5!B5(}+6iAfle*YX(_z6630rh?gRQaz2OW=pW_24NqQgkVUqT3zda`3M~mH#j@ zzXZG-RCzB1uK_>l@l=Q-dUZk3>23T^?fp79&CChZ=Y~_ySP$dIzX@p9P-; z{utDd_#LQxPJ#(ya51R#TS1jy1I1Sd{QJ8+{+Y)wgR0-p{qrLrrsAIks-IVa%5N8_ z@}K3u-wCRI?**R-eg#xMKL%s)!4OS+eI}@Stn$x0K&7jL;+vO&bXD|WQ04vzJQa-2 zbLr=RbaiwAsP74=`rHI6pM(DWpMxsz%b@!IryyM%jhqi{!D~Q`rx$>V_g5aj4PM0a zuR(@#bnXRioID*=J$?^lC`GRWmER#ybhr-`e;iAuYR5KE>7NaXf8GqLU7rS@0NxL( zzK^7G{EQZY;_JjezYJ9We->1_AA$^p=t(OWBj9RK{Qo&n@9zWYvgovxuD;tr<-ZqH zeGY~m_fNIazLDlO~mpD0ep~rEL zF9ub=_k+iS-vv(te+@n!JZ`n4_k2+8Spn+(Hc)(81{HrFcmjBbfBz?-`tMVq_~l#;N_t5 zeKn|jKMtzA?}KXpQR`fNmV%PUSA(L{&EOf}ouKITQBeK+OYjtMA%*Gt<)G-Z8&v)W zK=s#KK-KpHAfhAsAqZ&wD`S`+892ejPj!{1qtrKbpp=|IP!C0XKl^ z=W9W=<7QCpd?UCS{0VpuxMBk|(KD#}O+Llp&EQ;~Uki$FKMINtzXqQSo^^$j!&^W- z-v%O@qkBM&ufGS?u73p=g7YXm2DgFAw+)Iu2SL&2Pr)aF-vm|vpM&Cu2W@ioKM54S zEC)ruEnp1Z04m-qK;`#NP;|H#6rKJSRQz9qXMrcsc=6LJQ03M^NFKc$Tn>H%90i}S z#r4N(P;}{l4Dsl8Fb3}h=Yu~675|v6t{*N2m2VXk9c~9z?wi0E{3LiW_)p*%IPXd~ zF0KMq?;0q6z8O@#?*diMM?vw|4?v|mahv1A%fTf)-vElvcZ2HhFMy)U&p`Fh!?!zr zS_V?(=t__w5WN{xeSZKd-6I$*;0=Y2)+%3 zwW5!J>i0)np-=?4#wb1L6!3! zQ28GM9}E5iC^_>B@Lce*Pjmgg7S#JXsQ9;oO8-Zo>hTw#==n|m{9mBr9rtvX@7bXG z;Zjiil7Pp9F9JpXyTK9g^Pu?S*P!Abd#%g&Tu||^0iOgmK*@#MK#jNefNI}Y!3)9r zLDgsRPKQ^5l80?j{qZND;{6?{{yye?gz!+uK^zi{skz$_yTwW_~2cxUMGX%@27#H!)>7I^=|M~@MECj ze-~7J{tZ;Q4}GR9?^N(Ko-YMsaNOeokADcxi5Q>YdEh_#=aWm$-dPUn`y}|$2Sw5I zK=tq1vg7xsc`SLXdc48oevh|;s`m>)jf=ZLvWo5ocY_b9V55UgQ1$&jsD3;uaeOce zs+~^-HI8louLR!&D*ms)8hGr4tKZGwYMx&OUJQN>RQrybbp5dj6umoO489#a6Z{N# z8TeChGkETl>(A$c%I_WEO7JJ3>a(Eg=3keB=kRgQ7-hQ`+ha4mQ=z)d_~1g-&Z2gUb)1Fiy(Za8{e4ld%k2C5zh!9Cy?L5hejZ${Bm zzz={|fYA-;USK0gmqc#|RnBASTz%gOD*f9*suZ2pcI|%&xRmG5fh)lO29<7k$IW+M z0Pf=XOWKFO>G3(>SvIQ1R~rMUOepa`|2g zsvc!f{PH|deDq%MJn)C0+BfIfF5P-?0ngWi8^BkA%fau0=Yl8Rh#$ivL|u`9I`lm(ONU`QHetKKFp)&u@SigQwi$gV@^s>k1g7lQMj+;_UUc~cDK&Ag2sCfSYt_DYLbNOEnp3n1#K+*A+;0kcj^ISet z;ORWS1ys6EgX+geKHuqwb3nCoEvSBLf)*cKrud-r`G10{_oH6m>azhfcJpv z?_YvX07qWv`e7v~x{rewfOmkS;1@x~|DDJ4UgX*_4Ia^zQ{#-=Bjqxa{SQKHEXH|Ha@Y@GamdcpoT!IsFxm@1F@?!}B}9#o&Ws zHu1$Wa6MQD)!!cg&jkM&TmwG#RWAQ+pyXK%RQ}Ha74IIf0e%Hkd)L02F$BH~d@Xp} zYaIPfLSe;qgv zyag1WybV-;eha(|j9%yBUk*N%#~VQL$7eyc^SIZ$eqIlr!t<@5+WQ7jbp1X!A3Wv_ zZhTz`>UponH-bxe{xqoe{yX?&@T@nw_*+1|e+hUp_#sg3`YL!D_&aa~c-ouX_`enu z-@M*G{|k5l&!ca4<8%VlICveX`hOWzeU7@@^}|9?d@uz*9lRaXIQSu`c<20qYu8Rt z<-Q11y*>qQ0KW&u;G#ct{ksViJtx4&gSUfE0bdV368sT32mBRyGe{~^d<@SM;F(|tR6pJUo(29jI1c{8KW~4Vlhgaa?Y#dWI1haE z+nrr;Hn^PUH-pE4-v%Y$?gLfMfF9Fq#w}MXuKMAUTz6Gk@{|Soj z=e)!5=WbBx?*vZ*?*(J<`=I*!A@6kQmw?K5EBH9D0iF)t44w_X89WjED!3B-IjHt8 zdY8*@7x-kJZvjWZcY>1gy&1Zx!|p!+VwV2<$VSm1&{g@ z*Z!rT^4kg?5AFw_0=^tv41OED8hrG7T|LX-LZ06Nsvo}wia&k|s{O~j&*`zHp!j4R zI0jx1irxo7#rvSgZ-8pozk|vre!m-6Yr!*kz6o3kz6lgReF=OJSR#bKzwtjrhq-)w zC1I<7cP_t|g@_(M0R9u<4+yX4`cr)V?Z?j$^d@JPa1-s$gR{U%Hh^!I0kRs6mhY!aTt?-Bn^w1%b3 zmvR^QQ-c0p>c8vv?Su#M{MX=@^}_#2u6@D();gX3&IS=d(QoVt+0XL^|Ltav;%?^^(6jzaIj@k{g0bGz8Zujqw9$C4e)aC7VuQU6Zm}} zcqQTM1pU3pLG)0*y^Nqg@%^#npG2lM?PVJE*& z@Nu6C?)JYG|6IZz!gKt)%k+}JHH1m~<>rU_x!1>eq<_ByJV^K*q3hoXo=3dZ;6;QE zzgs@tuXuin|9v$0DxUv>FyFtsgWvj#35f0JCj`lc|0d|~Erd(-gTHO0Ih}AEzn?`| zrYrDF zD+qfCU*Y}V6V~&)0=}Mb6+r@M5#itUo4;v($Aste`&96Fg8t3~C0q5kkKaduzeiZ+ zzrPs#Kl;euD+oJyeun>cfk%Do5Z)h46Fx zh5f_#&-42HVX@{M^G! z{qINh#QQYwrH3bb-f!UD{e&^zzXq%kzDv;GFCCcO_;&w$8vGB!F9?_VymorLhj;%# zX!HC;!aMn`zhem3_&D~0|D8j4n16UV-xd;HL^wcrD(_Ds{JH-wINJYyIN!^J&+>eh ze|Hkk+x+i$fR86Un9%a?KIu_VBW~S4KcC-65%l+ugeMXX5l$z3o1ni@!g++de7sx0 z7x28E@NmLIcs>#QAR!@~$n%}xYYA8J`z3@A@%tLWjf5&ee{Ujugs_$GPa|B<@7;vo z5}wWTLU21_KfnJA)ZeT5eFh=?y^J6K=^uU{d==l$1~-DogHHxuOIS>J9nbG0ypr&H zJYPxB-`_fj-VNT)yE*>(tKb5{rG)Lg{~Wl9puaadh#mo6%eVJ}Clk)$_ZC9op`#m z-_ngIlht}$s>ew!nNI4RxL%r0qS@x$nM$&J+Z3~S{)*TV|1aiWYqXO>^{j*yu?jD# zjY%b|gy=E$SCUsGIBw8JhHyXRAORe2RZpBw^+hDb&qOGJ<*&iqSs_jlY zT0P$GsGs6)y}B>1G^R`RLc3AkozRt)N-Jr%6W6irZnN2Fbttn@r^z(0y}#W_rlZxB z3NL*cUYA9uO0;^q(WM(36Y+F1-DvHPTgeUGYKy3yM%-*Q%4BV%+uN#k5|OJ`YE8l~ zohi7Ww5L?9mBwpO*3}|zH%sLtTHS2cs^wCrN+q^51?}b0>NcfU-ODn~v#(;tLY-m3 zvzJAyJDpZ_yi1A39#k(doINYm1QnxGJ#N|eFe_Wx><&Fr@*hA~m$9$aOU)s%tmes73kU}j?;%=MVHf`9nj$-N) z)yZzlwVUBq;mh3ia>9Tlr5pv1EM+BW@9s2wi_^R-4aRk=w3q%ZRbseja#yvni$Pwm zC$(LAxvN&KC%fP?IMY{X7Ku8IT?yUbC^=EBSK?gF{c8%Tz#grk*?t;i|afe=3 zX<#brifKZ$x$yHueA&8bcy0Pf;wF_1v(9}zOfmb|JEo9;19P8-Q8Er1%uo^mSsdSJ zSg;FO_9V6aJzSYaFrg&TzQ~x(9t*;v7_-%2q!gIBoYdTit=6j@c(!`ufPtt?G{ztu zJ-}E)aE>#O+-O8HpqG+1!bhVqL~fQ^NZv}LD|z5XqYYLGHphp`(#5LQJBg&o&}hoM znY5;>ZLvvP(yYCI8W!DcqeVG&THQJ_CW$ZGWTIWSX&3Yt&c7(+yNit-4#RvcJ)loMGtE#A&G3 zX24~+r)oz;ugjj0Y;SiUg=zA7r`p*ckH$&6TxwFoG>1|lJ6 z^+JIn1**T%lBA<28ucU|hndP#(b~L7reCFXOl3^$kJs%>$_(YCR*BX&%3U+6=p}ly zTTk|(SKt)-xHKUnP0|wmT&khgtCOlqYP8YysVbCISOGzEuWX>rSOT@LR>Yv?#Phl8O$O0pi`~YTop#$SlY|DRoiMM zDjAxjI%4t6(5OWin~vQ~JS4^nW=t2G7DNaoh;A$AwijQNOv<%G^h%r;+tE5dEwK@=oSm7wD8`mF zqM%?A&>ix&UJG?Y{#d6EP0wJ;#VzI%t+VQrtpw@(c`N24sS|`WeQC2e-d7P@rB<@s zNz{1W4c$g(MLe&j|4r(DrDmhOB3kG2`2R@u`x=>{5tN#j*1PMCy>+UL(88*v_jvE8 z73*3po=fF&g7uH|pkKWPF`?={k7F)+ZRDp9xsS?7A0^`lymk|r0UtC&%D?sn*C&_9 zkt;UTMX#_+{7V#y)l_DV3H0XvL7!7wD)+I{mCdX+dUcokHkouRTQ$SY#2EDxja-ac z2{UF&8RRVI-1q6yZhgf18E-JDLh09c=RY_03?LI~O6Gh#*VzGJ+WhQOE|(xX)8^T5 z7!bi!u7=8xZ@Jg9^i;KmO#m}eOLd1T_ZE|WlfBT>^@VRe-Hhd&RE-doQm2%wMD}4C zlchA7=cN{A;~?Ut@0p{;o*#OsUWn3HPoFIo7Tw?948~Guf1#%SJ+pPD@Fk|AeHphK zHLI|bRW`=3#BwhS`H35o(V-ELQN~$_>YjqyUdH#(GQ94mB=($f`Sx`itM%?a6XVIg zPOdf~25+5plUXZ0+!SI?gJ+rL{C?599mRgf*=Z7NwbE3 z$jr+QtYF4_R`q>o2hsOcy%zW=~aMOGrNrfym4sSJTc+E_zEQ%+YzRa!U;>iA=s5r~R zeLOl^ZzZZp^n|9F{3?pvcw}ySK|Y>YU}>Y4#}lSui?z>XD>X*BV%l_E^?hzundhl} zGW8*$Jax3n3^w=xsTVwdJ+(=gtjH->jHDS@Z@mY{9FpBsQe&LDiDhZJKdYwZv&zva zHS1lgZ19)n2u8DZ_vT>ligoU(iR5%Dk?=N57RFpE8{fh3LN&`G?#`ZkQ$&=}PlaiqKD0ADV1f4S8%rgO^yY4&j4 zM6KJN8kT8)^!EOGdG@g_eNS}BI1@cgJ8~?e*GV=fnPL)1BN)PNvH`z47ksq7Cnnhh zPpY5ASPWj<^wh-{<(TE9?ooMtAZ&TQefAc9>Id`wtYSa6^HJrXjV{}6OF3(BBB4_@ zIh9g$h{*xU(nzJTw;f%MxXhMSF2@sSeQjcqNr-bq&A)cOO?u^4n}6N>Xaj4B8g)qT z>29r4l_!m9>J43USJDXME24?JTz8xEQogFH5}MK$=Mra#^R_q_9}ulDSJ(Ge9cOGJ zL)M1K2EXum*>-Hx9V}j^3kDSGX47)YUf@;$@Di92LFJ7Aqee0pO~gpkq>|khLgNwF zc3bI4ogNE@#)cTuj=?)JJYp9I>)Fd@8S%Vx21M-Zlx$9!_K$0yI#aeCG>}wGD?h-# z7H!h+8nFXk$O;NHc0Nr-EA+~g=d?85?u1q0-dK(C>v38xvc5>y7;rs>%*}m_mhVfb z`3QCz9EtBZ#Ljc*P+~Y|z#>S5VVEsxOgL++!m?n;&A8KCZM+SyqwjJUiz%G*$?mb` zLD{OBOXrA{#ZBsas;x#{1EmS_D-Vy=k0QY+9>UIAfEwx+|`JLl6S z1672Hl=J}BY!daSsD@1h&aIyk(ndyqboHf45E||J-=3V#mk@>TM93*kBb@ldtcK&0 z7L16KdTc-)(oC~#Z0EuMMn?a$`pAdsa>z9kQ7>_6B4$8qL}*7N*Bl?c6w}O6mszt^ zZ7~@ zf9qmK81*C>mE1|KIE_`B2Cov^YpGPkloh4n20&pu7>a&49}tW&vCZ4A0a#b9`OjVSgo z14)}6qD@+zq}x&W3g+&jz4mS}Ty4=^m9tGC5+=P#tbZki9Z%rxE^+1AUTvW34HP_~$DcMS~r^?zYKD|cE zl^?2RbQAT*+Js@i-+Xu#D;R~si%oT=LTjqm&MH7g4c?44wzrY z4$3RjcaSlk%)0n6#Pln3T57@Q)gG(CtEhXYU_jKeMvD{U;-t)I6m5E&6m1Ffh@zdI zdvD86tpBp%0`q5!o4|QFBEem>tZjx9ZC$f%9SWUgMBKlOY3I{pTxhV$dPX;0AV&$M z+nSPBBC|}G#@@1h!&Awetsv(4@tj~wR6Xt4YEdZdMpaiXog z`z*4lMrOD;(RZb~$6NA&EN+{jS3v4N8#~sA(Kd7So2YPOd!oWSvl@A6M&x)x2g+8F z6lN*XwkSxGXv*zovVAG`H^SHei*b9r+WmXXLIiIRU|^#iw1nw|uit^EIZctcis9?C z-Fwh8uES$1ZIfCF(e|mvUhQCvcWeJHEoDX9U5w!qZ69Gkf%!G9-sbMeR!^8Iq1oC|{*`jetmfWNqFj$S z-@z;%cK6yYaGE!;lo*FR@*}I5u9;98nrBGu zo)Ndp+F565^}h7noy)>{#x9l=crk+g@_sg9;Zr0t%?{@9_VoSp%-BWzo04+ii=uF>z!jb>BBz>e492Seqe+6thH)&53*B*`8CZ#}ZDh*mZL{mxfpH z2*B+!52LK~0cniWW{R#c!#oG3O)G64f&IPt!l>GESVIW-oz!McWczvh5;X9xvF9_B zW@cAfF}b)}qF{-@md-PeS=K05Ew#f_C^)QoEg4lOn0_Y1u1YtW#Yw595niv1HYP?r zFXlhnk~4a~uzT3HZ0~AfO~7xO3#z}|!)StHbw2wxda3Q{P;^wl>MYG{B}~&y_4RHIf*%5yrVO zNvI_ES(X<(_D7<8Kk**~2o@SJTL1+i1Kl|)%B z@oD+YoEP+bgW=smp<$Jdn)-337a5w32WH}?XKHhm?VpIQwi%V24K`>B%dF|lstqTx zSY&f665#MLvJUhdX}Vg{6s?w&>SM}(7SSha4J=7FU!QH75c?W9MLndE;M+(?RCw8_ z+u*qdH{PVr+*C{Ef{3o&vUSIXEt|*2#;%KY=G<`T1nH<~=NhLjykw^fYV3F$PcV-) zF=rBM^T3_uL1~e5PN2G-o%AS2N1zSc3i)k1i8?b8%FU+2M@~H4n6w(c+EH3m%FBNG zGjj2WK4xbzY$>`&j!SR2qZqdDJ6*`5r!*_^#Nr7%TZ$}W8WEL+L)&H@44p`sAfU?T z>#VVPKyH*0ioOz+OKeiH<#2V0GcNGX7!W+lGADXK$3Y18MEtYrN^*$J^P9=fn2#CT&u*THU7RE6&Z$ zi?GQ+^4aO1{ARY|ckMzzgA9&PGtZgvpF5}mIsD3yTlAc8j%T+{8f0ix!JndS_q`L! zL~i(*zsf^t(ROL7wJTd18A-P2&<)``I|3bhOdogX@S9HlQH=ov z3^5pqwiR7^g@ukZr8j#_t}Yn(_BxZdy)6v+hV;~373hw8dFmWJ+4+K^*W?Ui-!r1a zd>2Jr)E-WsA*IGDX8jB?y7k${u=0KMS=T_a2nxG3%Sl$nG*KGbQmv;?p|%=blg|TE zBBpIynaxj|n6i;)2Z_h=s!Z(oSvO%ql-PvKiG-H_ZtLgLf;e3<9r|K5${og>7r<=< zsjOswKyc^T=bs<>RbM~CwTgf^WmJUiYFYzxo4i>`+Eb+kwf$&>gq`#i)Pz4$gKsCt z6sR0`0MH%R@kOLH?Bz0C#yVMrQY$JS{~iI#{E%ZoCe0aiO`7SCd~m`hN-Lqsy^a=| zLqeUC)rm-byY4c@!_GIzBH3Ar3nxdszV~V^!sh0vEfW+-%FI5>@^?cvXfxR-Bh#gQ z)#>hZ%%XGJV0MrBO^W?~D$VS|uu3%@JM5=>mH$8;uEtSQzB*&uxg|4ifBM0u6xma8 z@iTqzJ*ciNUZMrTNhGZ>OxD>3lk;+<*3;p>uRL6Yt-~TXqpuzBjP~FkfkeZ!`plmt zZ3e3Kp~*~+Md>*7gG5~5JVtaPj0yK@mC2cHGBrn?@)^`mTU!m;AEO&8qgT75o@~9u zv3>NmMCX%7H?=3LmC;MPlkL$Rtj!<2b<2*?HIf{R(b2UCkmd2RB}@2ZxHh^TrH|{R-n7T|sZ?{QjW3Ru#LHv-UJ^h1+5DKhbjgzVBHqrM7rTd*Px4dC)`+K*%o|y{vKK5`IZ4gdjI+Ll= zZ5}$1zU<=f&+`RYB}N^ z=KFFhsH_gK+Y8#IZtnVmd+(~^;Y!B4RcP9pF6o(S>iU9-LkC*)3N#o|wb?&??_Gxu z;4$FWo(7w;<)31gx?HTIuFo79O1exo7*%4aa_B&JQY%biD@R&8FU$!nQnFy+H#X8Z z{4Pnmqz3s~b2QiPJK&rxoAT+9lFNq67PRuDPA`ArZc1&6D3nHKC2I^bm39+X<9M~k z`ky}5tE|rJ3Irbb2O1>VlwV1+?u5kxBrB=?&=3#1qH@ioUZU|ee$U@(#4l&q@>In_ z$n#R*9%V*Th^wO~@#LWc?P^C(m4>TA$O!fe{oJN73_hBH)TuJqRXMvoAynMgG%&3{ z6a#^fsTh)*=_dNc#wFJ&R7+x#;D&|1evp@N(T2AJ(ztjtL`ZAlPS2KV#Y{wD-}0#>>~D5}bZ}h5cMtq$8!o)xxzKUPF0p5jj9p6wqE6Cxs9JVyNsD8xu>rf=!Za$0 zO+2-ovMAX_4%K__N~(v;VlJLAjBQ41t6B{^dLB?Be>5Xc@BvlsDQ`Vaa@%fnWXX1< zH$D`qI^AVg`jPRw&izQ}=a{pQr5i(GaxyFyJAJg#xfM&`U0w_)JFE{L{iPF=0vdl!Q+wKP0YbZv!9 z1A14^($bAov`|a4M+Rk~B*-)0K5Y|~Xse^xF#uz>#zOf+2gYKi2ID1IC^p-IIS&VY zb+b`gm)sQ;-sF&jj_N{M_{CV!Oh0XCa+-ZCzRF2_B4w9WV7Q|5jEtyuU0T7`JRH1Y zXLysi^{&L2I9WRkV0vtIlXOraPT5FVNXr#8xN%1&;ZecmQmkt%aG4~kX^@|Y ze$^?}5;+F-d3YrOTN)YM$Z9)+oBm{VYbU;vdrY613`aqi;@-+fNiZFS?7IkM-3gZ2U zO5tQNOB#WR@&XBN)a>(!a?5p-I827l1MVl&6fz8b8{OQ7q39^vPI7Zr#E9+&(itDd zU`P>S9!V3}_k^_dV~fgX0vdW~BB~b*U+Q5UksvC3_mq0>1)(DO$%djQC7a@#4)o26 zM;H{zzWz%>)DE=ZB+K9$PeITiq#3zkLZ;8zJZGqpkj@Qp=oM6JxIBcyQnBud>G-U@ z2>U$UJ3%y0eH5MU6mc1cq_fG5lec1uw2y)k@%j1eqwPq&O439@!JL`SLz;OrXx<7s zV=P`LWq9ZS@&!&YR{)*E?0Hs~j@a~=3KT@_;WT)euK$0l#Wy?ej_G-8nls&UR*I?J za<|@Sv+p8z8;N)(?*&-bGAWOObk~vuD*(-pIIfz`%f)dsb(FH3;`e@c93i(&L2dWs zl8;4(T-S(~qB~Pwu#X%c^k+|2@Vql;>>`iQl-yg)->mvtKz3G6vx+cgSh*>CZ>Bz4 zHUlVDj{57u1?hN7GQ%k8t-a>0DyovO3{*AOhV#pqAf{w*)wpd*SruzIIjxSl`SXzK zv8KA)atn5MPdv@QRE3=Vl#iiSkOjulT+ZWX7O$P;3Pj6C$|r_jg8H&nrrv~{jW$F4 zT$NI(GP~$KvBGpll?YA@`5Qw0sb}bkS(F)~%EjQL_mr29F_bAe%Q5XbUw(`97K^~0 z>1WQ&maZSb`O+=AO>}tQ(X3n~4&hDVd4u#~3H*QlPMl%p#C`zNb!TI3|Y1QQn-j$Rxsc9@Y@KQl`g^ zW~!t~JBfJKt(m)rYh-lyR$;Vc^{QwthR1_tq5(Xbi|73T{fwT)Ih?4PF=onmHY4>; z(*mdGM!OT6#(hk(HBU3uXm`>iGS1T6iZVSXC~_h@7kL<+Q;C4{%3WGx!akR>hr&TD ztHj2=2bl&9kL!IWhYwTe#XMYF=Ud3 zJ~HdJkV=>4$j+7}nnpXi=*{qBKIa(?Mz{!;nKK#1ZBOuKXWu%9J29OTHs#7RcJ7*; z0yPThWn*O=olA?D>5u3vHAxu7)ZHQ)qrm~xaM$pdloWAv@3t9T-00-CGZ%7nn~X&s zA2IFS{$}>Ym2-JermV~3mM}*d9vj?qGJ%}mSTA&WmH-JYL9VF*U0zhR{{H| z!Tq(ln)m0<(20$j#!Ws&sMM|u%iTe3x2 zKhgqENJoW5H24yQkPZ>!qnV;(3Kt{iIlr#}X4c$JS7l-<|5krVGbV;rWqA*l34IJ- zSRl*{b|*<}g}t9Qj1bNk$;{*+CHkXdrrN}YH9VGd%>a|5#m*#APM{0JYFO=pp*v_G zNG4}x=Pn=`&RwbyK2&YhT&&gii%+=xZ|%|%zp z;2fL^)P+RBHJ_Ll&3j$Q*r&5C3Qc$X(Mes^+uZZp@k=Gr7d^2#5x_<->NIHCY+G1o zWF63_hqrP$47(GFWtRLJi>>X1Jrdd0i|f1E@&#wu)*!N-EZtaCPj29v^^JX+NvM)o+X8nfEOPV!r8L#4e3Qn@#blM?q0v0Ifmg7QFZrWkok-+hSE~pYo7iqysq_>qcS>fqgbsrHN)!gnbjrnj5 zpzZyFm9?D%cbiR-}_EnQ`N0 z2YLIuFhKKWdnZ~QF3+n~o0b>`XjN0Xb7`bGq9{LqR-jJ3*aiwqp$7_cJ3$ zoh-~*WDq=T7LwJSZt_(+cZC+$i)L*Nb97Ts+O$koUN;ZT2|kq(g}MlXt2c8oLRLpl z)(~0w%6H~={;G{LZ_m!x!$uQcb59I69I}#Tqy`1CSy`7!qnj{nxaBM4b0kE~=&0SH z>N|DO_H9=O_Q~4mm(TUx)4*I1$`PR9nde0$D?Kb z^hq1z{9rp#C)%V-auLX^P6TfNdTG1cAfA64>Sv3|DBWx=cwlVxFPsxrp0W*o^&~Ak zWsbgW8W3oe)Uw+Qr}Gem zE@aMt&`9`>UeG;fqZb@DBZjZf#Krf$ELyq)f-oN2DIg}b?K?;knV2B17q~u6Up%+V z2xel|f_~B*pr&<3OP-&?gdMz6UgYYT+muggW|P`aZMxM+Gie#?I-Q~_I)=3h!ENe# z%ZSgo7;@7EK2B)kqnnTGLz$h~9HRFtx;pIY7BiJ4N6mEhC5#5+6z5W-3Nt45EEuK; zR5eYvCM@R0;r6rq2Cv*{61Bk2l7x7)(-?w1&ZZ**S4%sFBRy-1i_Ly`5pSIF$&bp1BClxRrWWH-)`ecAPE2tod3)ov5dc<38#+jFZv z#)xwq zUK4}&Y1@16;9k9kcJ>AZqDrQdA%BJ2fLM-iyvW9TF^aR#ajUIP_#7Y>#fGfIN_*I- z!B=d^0Xs0lAePC+q|*Mm$#m3-`Mm^}M6iL3z;p95&-io8@rYY5woQ(q0{EnybSPvz z;~v$W(ugzW6?RdM%)E_qK{V6{kV!Qv>O2WOK7ih&M*SeGdOzkmoKN9qIFyh5^IseR zXJR;Q1HfwHs^{! z{o9psj$h7Hoz|4Ny(s0LRQ#~&#fQ)?8Hcb5cf=v@Gk-+7nkC1WCP2<`4aX)MnE=pi z#9EFar6Wm_9&qDvri zHm~xcPY0G|BQa3eO<;OCog$}8bv{+D0QD-DZp^^iX`hB=|HQV%nGQ>Lo%l^&g+7)| zB++eKkkbB2dxNp5JusXe$xQ&#ZVxp|rw{2DQ_q>eFC0SA71d1+=LH>-`-mFRKpB32 zo@yF))MBLQ$QQ)nZCHb)A=uHwvrezl8#W|qCTn`w_3dchjHvSo(&I8Y3j1F+) zz0}l1l#Z^r19hpA@S7z!7u~8*Gt4d7*il)aTLAC9bHi1e*ZF$@8Ep9}o}KiedH%K? z^_T7i^ivo*U3WUD&+${~)TjADiJ#r~Wl8u4&kmojE-G~M4IOkd<>5$XE-jf8CGL;p zR<+>q_tf;K{WY|7nG2V+>ukKaLa13TT@=Q=BN|@Mw9?*5p)15#)^fY>XS(DdXUT~E zqCi-^Pi4RB5=};^nRGpLDPBSdZPaF}r7a1%&sIZ5dpl_WTiEuaU-7DKaxQu8pP?z%opmlrB)rC~iF@@pWfgJ)<-I=}RnKaA-d z>vkZs8sTx%qArds&U70M`gE*!SDLZlS5QT(q48v==zy}UZ_}`a*nYLdKG1g<8P1Lj zmmJz*1b4?_;5e_A?IyqoPmUG=O6q$ja_p8PE0pdjeD5(;Euxt=120DE&lxJ4>4^c* zs`4+9mV+fg1M#kKloXRYpRA`qC&Jx~o?+1uo6R_Rr8{{Be~c6PDl!NpDS*?=xJbm_*JDbC$nu4d{7xKGp)K zK^one$WYC;I#3|on=T*NR7L6##jCZTDDbruv1ut1xXTp7m{FDe4ButuB}cZ{ZKH)L z1qPP)%te_Xvz{tQUvZgEDxTfzCMI&Sgei<$s1xma21MAIW}>oPmIDsWL`F6s zXO~AVwvFZR+;gSk>@v$LL^l4i$0JP%Eh{Vmxm8B8@mD;~E}KI9(4N7UM9wZl=AVfU zf}rzoWnv1zmzwvOBGBDIxO)%ZQG;?}T^e?*m$_fk-~7^>Z=ItOW$~6~K1k^>3{u_Y zl$F0*($)y!mS^3hcwz(=fLax74_MsBX@A62ZQ6a4G|hBl@8wK(;iQw3y~}d>dz)k~ zuoxlR$SrhmzLtdtw!u)L{OT#4RN!roD7M=Sr|&v1(xC(>ov(eG7~-IbaH+r*S)fM%*2)D;je#?G&2XJF4drt6l~X6 zS`Vwry`;=aVGp2I@SRzVVZdGZY$)yMUQ5yiX`L)Ul<6R7Dj5rB$_Fhu;1@I+Di^<^ z5XM8!pbwU(*ul4UX0y^UH8oUxN%a24jmkzC(yXOR#_WPirJ*pND42~&9+7sG=$zv$y=&8~OlBR0;hgJa$Q?`*&EKN`3t9)o AumAu6 literal 0 HcmV?d00001 diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..6fe18b0 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,2171 @@ +# Romanian translation for glib +# Copyright (C) 2001 - 2010 Free Software Foundation, Inc. +# Marius Andreiana , 2001. +# Mișu Moldovan , 2004 - 2010. +# Lucian Adrian Grijincu , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-18 22:47+0200\n" +"Last-Translator: Mișu Moldovan \n" +"Language-Team: Romanian GNOME Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2);;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Nu se aștepta un atribut „%s” pentru elementul „%s”" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributul „%s” al elementului „%s” nu a putut fi găsit" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "S-a primit eticheta „%s”, se aștepta eticheta „%s”" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Nu se aștepta eticheta „%s” în „%s”" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Nu s-a găsit un fișier valid cu favorite în directoarele de date" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Un favorit pentru URI-ul „%s” există deja" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nu s-a găsit un favorit pentru URI-ul „%s”" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Nu există un tip MIME definit în favoritul URI-ului „%s”" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nu există un indicator privat definit în favoritul URI-ului „%s”" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nu există grupuri definite în favoritul URI-ului „%s”" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Nu există o aplicație cu numele „%s” înregistrată în favoritul pentru „%s”" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Nu s-a putut expanda linia de comandă „%s” cu URI-ul %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversia de la setul de caractere „%s” la „%s” nu este implementată" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nu s-a putut iniția conversia de la „%s” la „%s”" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Secvență de octeți incorectă în inputul conversiei" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Eroare în timpul conversiei: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Secvență parțială de caractere la sfârșitul inputului" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nu se poate converti rezerva „%s” la setul de caractere „%s”" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI-ul „%s” nu este un URI absolut folosind schema „fișier”" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI-ul fișierului local „%s” nu poate include un „#”" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI-ul „%s” este nevalid" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Numele din URI-ul „%s” este nevalid" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI-ul „%s” conține caractere „escaped” incorecte" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Calea „%s” nu este o cale absolută" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Nume nevalid" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Eroare la deschiderea directorului „%s”: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nu s-au putut aloca %lu octeți pentru citirea fișierului „%s”" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Eroare la citirea fișierului „%s”: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Fișierul „%s” este prea mare" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nu s-a putut citi din fișierul „%s”: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nu s-a putut deschide fișierul „%s”: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Nu s-au putut obține atributele fișierului „%s”: fstat() a eșuat: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nu s-a putut deschide fișierul „%s”: fdopen() a eșuat: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Nu s-a putut redenumi fișierul „%s” în „%s”: g_rename() a eșuat: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nu s-a putut crea fișierul „%s”: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Nu s-a putut deschide fișierul „%s” pentru scriere, fdopen() a eșuat: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nu s-a putut scrie fișierul „%s”: fwrite() a eșuat: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nu s-a putut scrie fișierul „%s”: fflush() eșuat: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nu s-a putut scrie fișierul „%s”: fsync() a eșuat: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nu s-a putut închide fișierul „%s”: fclose() a eșuat: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Fișierul existent „%s” nu a putut fi șters: g_unlink() a eșuat: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Șablonul „%s” este incorect, n-ar trebui să conțină un „%s”" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Șablonul „%s” nu conține XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nu s-a putut citi linkul simbolic „%s”: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Linkurile simbolice nu sunt implementate" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nu s-a putut iniția conversia de la „%s” la „%s”: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Nu s-au putut citi datele brute din g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Date neconvertite rămase în memoria tampon pentru citire" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Canalul se termină cu un caracter parțial" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nu s-au putut citi datele brute din g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nu s-a putut deschide fișierul „%s”: open() a eșuat: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Nu s-a putut mapa fișierul „%s”: mmap() a eșuat: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Eroare în linia %d, caracterul %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Text codat UTF-8 incorect în nume - „%s” nevalid" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s” nu este un nume valid " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s” nu este un nume valid: „%c” " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Eroare în linia %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nu s-a putut procesa „%-.*s”, care ar fi trebuit să fie o cifră într-un " +"caracter referință (de exemplu ê). Poate cifra este prea mare" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Referința caracter nu s-a terminat cu punct și virgulă. Probabil ați folosit " +"un caracter ampersand fără intenția de a începe o entitate. Utilizați &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Referința caracterului „%-.*s” nu codează un caracter permis" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"S-a depistat o entitate nulă „&;”. Entitățile valide sunt: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Numele entității „%-.*s” nu este cunoscut" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entitatea nu s-a terminat cu punct și virgulă. Probabil că ați folosit un " +"caracter ampersand fără intenția de a începe o entitate. Utilizați &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Documentul trebuie să înceapă cu un element (de ex. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s” nu este un caracter valid după caracterul „<”, nu poate începe numele " +"unui element" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Caracter neobișnuit „%s”, se aștepta un „>” pentru a termina eticheta de " +"element gol „%s”" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Caracter neobișnuit „%s”, se aștepta un „=” după numele atributului „%s” al " +"elementului „%s”" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Caracter neobișnuit „%s”, se aștepta un „>” sau „/” pentru a termina " +"eticheta de început a elementului „%s” sau opțional un atribut. Poate ați " +"utilizat un caracter incorect în numele atributului" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Caracter neobișnuit „%s”, se așteptau ghilimele de deschidere după semnul " +"egal pentru a da valoarea atributului „%s” al elementului „%s”" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s” nu este un caracter valid după numele elementului de închidere „%s”. " +"Caracterul permis este „>”" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elementul „%s” a fost închis, nici un element nu este curent deschis" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elementul „%s” a fost închis, dar elementul deschis curent este „%s”" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Documentul era gol sau conținea doar spațiu gol" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Documentul s-a terminat în mod neașteptat imediat după un caracter „<”" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Documentul s-a terminat în mod neașteptat cu unele elemente încă deschise. „%" +"s” a fost ultimul element deschis" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Documentul s-a terminat în mod neașteptat, se aștepta un caracter „>” care " +"să încheie eticheta <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" +"Documentul s-a terminat în mod neașteptat în cadrul numelui unui element" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" +"Documentul s-a terminat în mod neașteptat în cadrul numele unui atribut" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Documentul s-a terminat în mod neașteptat în cadul unei etichete ce " +"deschidea un element" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Documentul s-a terminat în mod neașteptat după semnul egal ce urma unui nume " +"atribut. Nici o valoare pentru atribut" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Documentul s-a terminat în mod neașteptat în cadrul valorii unui atribut" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Documentul s-a terminat în mod neașteptat în cadrul etichetei de închidere a " +"elementului „%s”" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Documentul s-a terminat în mod neașteptat în cadrul unui comentariu sau a " +"unei instrucțiuni de procesare" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "obiect corupt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "eroare internă sau obiect corupt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "memorie insuficientă" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "s-a atins limita de „backtracking”" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"modelul de căutare conține elemente pentru care nu se pot face comparații " +"parțiale" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "eroare internă" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"pentru condițiile de tip „back reference” nu se pot face comparații parțiale" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "s-a atins limita de recursivitate" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "s-a atins limita maximă pentru substringuri nule" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "combinație incorectă de indicatori de linie nouă" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "eroare necunoscută" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ la sfârșitul unui „pattern”" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c la sfârșitul unui „pattern”" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "după \\ urmează un caracter necunoscut" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"nu se permite aici trecerea la majuscule sau invers prin folosirea de " +"caractere „escape” (\\l, \\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numere neordonate în cuantificatorul {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "număr prea mare în cuantificatorul {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "lipsește un ] de închidere pentru clasa caracter" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "secvență incorectă de tip „escape” în clasa caracter" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "interval depășit în clasa caracter" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nimic de repetat" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "caracter nerecunoscut după (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "caracter nerecunoscut după (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "caracter nerecunoscut după (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "clasele cu nume POSIX sunt implementate doar înăuntrul altei clase" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "lipsește un ) de închidere" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") fără un ( în față" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R sau (?[+-]digiți trebuie urmați de )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referință la un „subpattern” inexistent" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "lipsește un ) după comentariu" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "expresie regulată prea lungă" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "nu s-a putut aloca memoria" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "aserțiunea „lookbehind” nu e de lungime fixă" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "număr greșit formatat sau nume după (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "grupul de condiții conține mai mult de două ramuri" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "se așteaptă o aserțiune după (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nume necunoscut de clasă POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "elementele POSIX de unire nu sunt implementate" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "valoarea caracterului în secvența \\x{...} este prea mare" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "condiție nevalidă (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nu este permis în aserțiunea „lookbehind”" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "apelul recursiv e pasibil de a intra în buclă infinită" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "terminator lipsă în numele de „subpattern”" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "două „subpattern”-uri au același nume" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "secvență malformată \\P sau \\p" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nume necunoscut de proprietate după \\P ori \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nume de „subpattern” prea lung (sunt permise cel mult 32 de caractere)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "prea multe nume de „subpattern”-uri (sunt permise cel mult 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "valoarea octală este mai mare decât \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "grupul DEFINE conține mai mult de o ramură" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "nu se permite repetarea unui grup DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opțiuni NEWLINE inconsistente" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g nu este urmat de un nume între acolade sau un număr diferit de zero, " +"opțional între acolade" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "repetare neașteptată" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "„overflow” în cod" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "spațiul de compilare a fost depășit" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "nu s-a găsit „subpattern”-ul referit și verificat anterior" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Eroare la compararea expresiei regulate %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteca PCRE este compilată cu suport UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Biblioteca PCRE este compilată fără suport pentru proprietăți UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Eroare la parsarea expresiei regulate %s la caracterul %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Eroare la optimizarea expresiei regulate %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "se aștepta un digit hexadecimal or „}”" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "se aștepta un digit hexadecimal" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "„<” lipsă în referința simbolică" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "referință simbolică neterminată" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referință simbolică de lungime zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "se aștepta un digit" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referință simbolică ilegală" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "„\\” inutil la final" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "secvență „escape” necunoscută" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Eroare la prelucrarea textului de înlocuire „%s” la caracterul %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Textul citat nu începe cu un semn de citare" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Semn de citare nepereche în linia de comandă sau text „shell-quoted”" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Textul s-a terminat imediat după un caracter „\\” (textul era „%s”)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Textul s-a terminat înainte de semnul de citare pereche pentru %c (textul " +"era „%s”)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Textul era gol (sau conținea doar spațiu gol)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nu s-au putut citi datele de la procesul copil" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Nu s-a putut crea conectorul „pipe” pentru comunicarea cu procesul copil (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nu s-au putut citi datele din conectorul „pipe” copil (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nu s-a putut schimba directorul curent în directorul „%s” (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nu s-a putut executa procesul copil (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nume incorect de program: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Secvență incorectă în vectorul argumentului la %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Secvență incorectă în variabilele de mediu: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Director curent nevalid: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nu s-a putut porni programul asociat (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Eroare neașteptată în g_io_channel_win32_poll() la citirea datelor de la " +"procesul copil" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nu s-au putut citi datele din procesul copil (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Eroare neașteptată în select() la citirea datelor din procesul copil (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Eroare neașteptată în waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nu s-a putut clona procesul (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nu s-a putut executa procesul „%s” (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nu s-a putut redirecta ieșirea sau inputul procesului copil (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nu s-a putut clona procesul copil (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Eroare necunoscută la lansarea în execuție a procesului copil „%s”" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Nu s-au putut citi date suficiente de la procesul copil (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Caracter în afara limitelor standardului UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Secvență incorectă în inputul conversiei" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Caracter în afara limitelor standardului UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Utilizare:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPȚIUNE...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opțiuni ajutor:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Arată opțiunile de ajutor" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Arată toate opțiunile de ajutor" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opțiuni aplicație:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nu se poate prelucra valoarea întregului „%s” pentru %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Valoarea întregului „%s” pentru %s este în afara limitelor" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nu se poate prelucra valoarea dublă „%s” pentru %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Valoarea dublă „%s” pentru %s este în afara limitelor" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Eroare la prelucrarea opțiunii %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument lipsă pentru %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opțiune necunoscută %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Nu s-a găsit un fișier cheie valid în directoarele de căutare" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nu e un fișier obișnuit" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Fișierul e gol" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Fișierul-cheie conține linia „%s” care nu este o pereche cheie-valoare, un " +"grup sau un comentariu" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nume incorect de grup: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Fișierul cheie nu începe cu un grup" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nume incorect de cheie: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Fișierul cheie are o codare neimplementată de tip „%s”" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Fișierul cheie nu are grupul „%s”" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Fișierul cheie nu are cheia „%s”" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Fișierul cheie conține cheia „%s”, cu valoarea „%s”, ce nu este UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Fișierul cheie conține cheia „%s”, ce are o valoare neinterpretabilă." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Fișierul cheie conține cheia „%s” ce are o valoare neinterpretabilă." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Fișierul cheie conține cheia „%s” în grupul „%s”, care are o valoare ce nu " +"poate fi interpretată" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Fișierul cheie nu are cheia „%s” în grupul „%s”" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Fișieul cheie conține caractere „escape” la sfârșit de linie" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI-ul „%s” conține secvențe „escaped” incorecte" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Valoarea „%s” nu poate fi interpretată ca un număr." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Valoarea întregului „%s” este în afara limitelor" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Valoarea „%s” nu poate fi interpretată ca un număr flotant." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Valoarea „%s” nu poate fi interpretată ca o valoare booleană." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "S-a pasat o valoare prea mare către %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Flux deja închis" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operațiunea a fost anulată" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Obiect nevalid, neinițializat" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Secvență de octeți incompletă la intrare" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Spațiu insuficient în destinație" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Inițializarea întreruptibilă nu este implementată" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Tip necunoscută" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "tip de fișier %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "tip %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Flux terminat neașteptat de repede" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Nedenumit" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Fișierul desktop nu are specificat un câmp „Exec”" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Nu s-a găsit un terminal pentru pornirea aplicației" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Nu se poate crea pentru utilizator directorul cu opțiunile aplicației %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nu se poate crea pentru utilizator directorul cu opțiunile MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nu se poate crea fișierul desktop %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Definiție personalizată pentru %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "unitatea nu poate ejecta discul" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "unitatea nu implementează eject ori eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "unitatea nu poate verifica periodic pentru discuri noi" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "unitatea nu implementează comanda „start”" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "unitatea nu implementează comanda „stop”" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nu se poate gestiona versiunea %d a codării GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Număr greșit formatat de elemente (%d) în codarea GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nu se poate gestiona versiunea %d a codării GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Număr greșit formatat de elemente (%d) în codarea GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Se aștepta un GEmblem pentru GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Operațiune neimplementată" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Montarea conținută nu există" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Nu se poate copia peste director" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Nu se poate copia un director peste un alt director" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Fișierul destinație există deja" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Nu se poate copia recursiv directorul" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Nu există suport pentru funcția „splice”" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Eroare la aplicarea funcției „splice” fișierului: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Nu se poate copia fișierul special" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "S-a primit o valoare incorectă pentru linkul simbolic" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Nu există o implementare pentru coșul de gunoi" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Numele de fișiere nu pot conține „%c”" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volumul nu implementează montarea" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nu există o aplicație înregistrată pentru deschiderea acestui fișier" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumeratorul este închis" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Enumeratorul fișierului este deja deschis de o altă operațiune" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Enumeratorul fișierului este deja închis" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nu se poate gestiona versiunea %d a codării GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Date de input malformate pentru GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Fluxul nu implementează „query_info”" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Căutarea în flux nu este implementată" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Nu se permite trunchierea fluxului de input" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Trunchierea fluxului nu este implementată" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Număr greșit de elemente (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Nici un tip pentru numele clasei %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tipul %s nu implementează interfața GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Tipul %s nu este clasificat" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Număr malformat de versiune: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tipul %s nu implementează from_tokens() în interfața GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Nu se poate gestiona versiunea furnizată pentru codarea iconiței" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Fluxul de input nu are implementată o funcție de citire" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Asupra fluxului se execută deja o operațiune" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Spațiu insuficient pentru adresa socket-ului" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Adresă nesuportată de socket" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Nu s-a putut identifica tipul implicit de monitorizare a directoarelor locale" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Nume incorect de fișier: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Eroare la citirea detaliilor sistemului de fișiere: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Nu se poate redenumi directorul rădăcină" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Eroare la redenumirea fișierului: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Nu se poate redenumi fișierul, numele de fișier există deja" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Nume nevalid de fișier" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Eroare la deschiderea fișierului: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Nu se poate deschide directorul" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Eroare la ștergerea fișierului: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Eroare la mutarea la coș a fișierului: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nu s-a putut crea directorul coșului de gunoi „%s”: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Nu s-a găsit directorul de top pentru coșul de gunoi" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Nu s-a putut găsi ori crea directorul coșului de gunoi" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nu s-a putut crea fișierul cu detalii despre mutarea la coș: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nu s-a putut muta la coș fișierul: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Eroare la crearea directorului: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sistemul de fișiere nu suportă legături simbolice" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Eroare la crearea linkului simbolic: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Eroare la mutarea fișierului: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Nu se poate muta un director peste un alt director" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Crearea fișierului de backup a eșuat" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Eroare la ștergerea fișierului destinație: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" +"Operațiunea de mutare între două dispozitive montate nu este implementată" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Valoarea atributului trebuie să fie diferită de NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Tip incorect de atribut (se aștepta un șir)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nume incorect de atribut extins" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Eroare la stabilirea atributului extins „%s”: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Eroare la citirea detaliilor fișierului „%s”: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (codare incorectă)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Eroare la citirea descriptorilor fișierului: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tip incorect de atribut (se aștepta o valoare uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tip incorect de atribut (se aștepta o valoare uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tip incorect de atribut (se aștepta un șir de octeți)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Nu se pot defini drepturi pentru legături simbolice" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Eroare la definirea drepturilor: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Eroare la definirea deținătorului: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "linkul simbolic trebuie să fie diferit de NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Eroare la definirea linkului simbolic: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Eroare la definirea linkului simbolic: fișierul nu este un link simbolic" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Eroare la schimbarea datei de acces ori modificare: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Contextul SELinux trebuie să fie diferit de NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Eroare la definirea contextului SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nu este activat pentru acest sistem" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Definirea atributului %s nu este implementată" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Eroare la citirea din fișier: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Eroare la căutarea în fișier: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Eroare la închiderea fișierului: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Nu s-a găsit tipul implicit de monitorizare a fișierelor locale" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Eroare la scrierea în fișier: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Eroare la ștergerea vechiului link simbolic de backup: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Eroare la crearea copiei de backup: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Eroare la redenumirea fișierului temporar: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Eroare la trunchierea fișierului: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Eroare la deschiderea fișierului „%s”: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Fișierul destinație este un director" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Fișierul destinație nu este un fișier obișnuit" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Fișierul a fost modificat de o terță parte" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Eroare la ștergerea vechiului fișier: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "S-a primit un „GSeekType” nevalid" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Cerere nevalidă de căutare" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nu se poate trunchia GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Fluxul de ieșire al memoriei nu poate fi redimensionat" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Nu s-a putut redimensiona fluxul de ieșire al memoriei" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Cantitatea de memorie necesară pentru a procesa scrierea este mai mare decât " +"spațiul de adrese disponibil" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "S-a cerut mutarea cursorului înaintea începutului fluxului" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "S-a cerut mutarea cursorului după sfârșitul fluxului" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "obiectul montat nu implementează operația de demontare „unmount”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "obiectul montat nu implementează operația de scoatere „eject”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"obiectul montat nu implementează „unmount” ori „unmount_with_operation”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "obiectul montat nu implementează „eject” ori „eject_with_operation”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "obiectul montat nu implementează operația „remount”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "obiectul montat nu implementează detecția automată a conținutului" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"obiectul montat nu implementează detecția automată și sincronizată a " +"conținutului" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Numele de gazdă „%s” conține „[” dar nu și „]”" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Fluxul de ieșire nu implementează scrierea" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Sursa fluxului este deja închisă" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Eroare la rezolvarea „%s”: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Eroare la rezolvarea inversă „%s”: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nu există înregistrări de tip SRV pentru „%s”" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Eroare temporară la rezolvarea „%s”" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Eroare la rezolvarea „%s”" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Socket nevalid (neinițializat)" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket nevalid, inițializarea a eșuat din următoarea cauză: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket-ul este deja închis" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "se creează GSocket din fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nu s-a putut crea socket-ul: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "S-a specificat un protocol necunoscut" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "nu s-a putut obține adresa locală: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "nu s-a putut obține adresa la distanță: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "nu s-a putut asculta: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Eroare la asocierea adresei: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Eroare la acceptarea conexiunii: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Eroare la conectare: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Conectare în progres" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Eroare la conectare: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nu s-a putut obține eroarea în așteptare: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Eroare la primirea datelor: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Eroare la trimiterea datelor: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Eroare la închiderea socket-ului: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Se așteaptă condiția socket-ului: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Eroare la trimiterea mesajului: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage nu e implementat în Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Eroare la primirea mesajului: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Eroare necunoscută la conectare" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Procesul de ascultare este deja închis" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Socket-ul adăugat este închis" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nu se poate gestiona versiunea %d a codării GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "S-a așteptat un mesaj de control, dar s-au primit %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Tip neașteptat de date ANC" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "S-a așteptat un fd, dar s-a primit %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "S-a primit un fd nevalid" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Eroare la citirea din „unix”: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Eroare la închiderea „unix”: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Rădăcina sistemului de fișiere" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Eroare la scrierea în „unix”: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Adresele cu nume abstract de socket tip unix nu sunt implementate pe acest " +"sistem" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "Volumul nu implementează ejectarea" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "Volumul nu implementează eject ori eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nu s-a găsit aplicația" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Eroare la lansarea aplicației: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Linkurile de tip URI nu sunt implementate" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "editarea asocierilor de fișiere nu e implementată în Windows" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Crearea asocierilor de fișiere nu este implementată în Windows" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Memorie insuficientă" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Eroare internă: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Sunt necesare date suplimentare de la intrare" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Date comprimate nevalid" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Secvență UTF-8 incorectă la intrare" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "S-a atins limita maximă a matricii de date" + +#~ msgid "do not hide entries" +#~ msgstr "nu ascunde intrările" + +#~ msgid "use a long listing format" +#~ msgstr "utilizează un format detaliat de listare" + +#~ msgid "[FILE...]" +#~ msgstr "[FIȘIER...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Caracterul „%s” nu este valid la începutul numelui unei entități. " +#~ "Caracterul „&” e cel ce începe o entitate. Dacă acest ampersand nu ar " +#~ "trebui să fie o entitate, utilizați &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Caracterul „%s” nu este valid în cadrul unui nume de entitate" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Referință caracter goală. Ar trebui să includă o cifră precum dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Referință neterminată la o entitate" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referință caracter neterminată" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Text codat UTF-8 incorect - secvență prea lungă" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Text codat UTF-8 incorect - nu e un caracter de start" + +#~ msgid "file" +#~ msgstr "fișier" + +#~ msgid "The file containing the icon" +#~ msgstr "Fișierul conținând iconița" + +#~ msgid "name" +#~ msgstr "nume" + +#~ msgid "The name of the icon" +#~ msgstr "Numele iconiței" + +#~ msgid "names" +#~ msgstr "nume" + +#~ msgid "An array containing the icon names" +#~ msgstr "O matrice conținând numele iconițelor" + +#~ msgid "use default fallbacks" +#~ msgstr "utilizează variantele de rezervă" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Specifică dacă să se utilizeze variantele de rezervă implicite prin " +#~ "prescurtarea numelor la caracterele „-”. Se vor ignora numele de după cel " +#~ "dintâi dacă sunt precizate mai multe." + +#~ msgid "File descriptor" +#~ msgstr "Descriptor de fișier" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Descriptorul fișierului de citit" + +#~ msgid "Close file descriptor" +#~ msgstr "Închide descriptorul fișierului" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "" +#~ "Specifică dacă se închide descriptorul fișierului la închiderea fluxului" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Descriptorul fișierului de scris" diff --git a/po/ru.gmo b/po/ru.gmo new file mode 100644 index 0000000000000000000000000000000000000000..25a3684128fb972971063a2e679fa77645248043 GIT binary patch literal 60196 zcmd6w37lPJdH)Zt6-5MDTtE*?NP?M=1Z2s=VhAx3AVMG@!Ek5h&g7bzxx?HUlCac3 z09m3D1Vv>RSELPruq2Qu+SaPAcWTwP*0t3xmfFQywe8>k_xC*S+3qq+g0?rGlixk( zyysn>_u1d~-1+YQFS;Y*bKhQ3bO?CJK2g;10`PUZ8b$TPqv+M(DELzFM**J;_#XlP zC*X^Z@N)ZrFQ@#0;ruZ0Rh&-;F9PR+tH9gA68JOlwcrIuM$sF=L2x?weo*ai2af{( z6nqQ#AK*dYiBqEJeDECb0Py4Bo51bhH1Nk@4DQRruLoy=G!-oc)!ra@FnBXK2YdiL z3H%0l7`X4$C^`=pY)^`Dx&5z(G*gZvxf+V_*sVHh2cOfI*5b*MXwjQ{Y_i zpFp)gmC8;9E1=r@47dXPaln%yj_CD4P;~kd|7pCx08atmFe{4Q489Xw0^SbZ3Vs)i z!9gAtJ#Piy0Db}#|Na4}@%|9hIDQ$<_otKlb3Pr^bMrwx_jXXv4T747_kxFkp9V#* zuYfA|6YxNAZzf%$5re8{9vFkmKs|pMsP^9rimx6F*Pjmf7Xg0;s(-J7hvhVv0n&us=_q398isfxZ0 zs@<0zA4P|Phk<(j6p*QoE&_G`22lOH2UI=V!}Y%gRsLt7=Kqx^I3FzmnW|_VD0%uc zsB(W3@PELQIY0QsC_ZGGd@J}-P2&5EtbnTbaZvUC5LA0FTIAzD5#9A9y&p0~Ec!3u=D%r;$Uz zrJ(LtK+$ItsQMoSHD7-Ss=wa^Q6%gPH4}q$8C#ZIR0lpS|HG>lU zJ3!6f3UEL0UEmSmRiMUkAEE(T+;2CClMLD6SBDEfR0JP`a9sQ$m| zEa!*ALG^zgD1NyZ6#WLl7`zP>-#iMczORC!!#{wc(|?01e=vjA{G9}fpWX?o-OV7R zkG6ty!C!(M;Bn{pd~|}Ew>v;YJ$e|7!G8d!f_pFX@^e7V!=<3=y%`i89tPF!=fN2K zF?b62(ziQ*E(RqRmxJo}dqMH@eW3dNG^lpI3yQy9a;`r&7o5g<1)K%m28zyK07b8# zf}+d5=lOh11I170fpk3@0uh1eSy26b2|}Xhri0?QC7{|L1dj%916AKM;C|pYLDl#7 z;48qFp6~S?0KSy-3qjHUQt&0iI8&>c{s$(eqc~{E&Be zxf4LuyByR!bb;cR8^D9Xhd|N)3!vuvpFz>*;ETQdv7qX`095&P;DO-#LG|kspyaI% zYJ5KjPXZ5G>CY_-I0Q-`-VSO${tQ&P=n|jrxuBk33aY+7Fa~b}_W>UTUk`pBoCAIb zRJm8Z)BANisQEh^)c8igL%@%K;_oNGeZlX6;)|bxuK|x(<^7ruiodS_MTbv-;=`|j zhk`!;$zXUuCybC-F+zDO{zM|L5-3)$`^QS=3tF#(l6ucQc1^hO68u1Uta< zXnYZP4R`|hN8l*iGx2bHM)uMVH0b zx*zmD@Knyf1H!PsQSMOo(3LpBR(#80Vw{sAJlXI2CfEAy2<1E z2f!7a{{qzfErU3{;K#se;LDke8Q^i?DPRdyyZ3|Y|8t<|GoQ)05WE$HC8K`?nX>4j z_j>zZ2i5+O@AJIG8t`7uzXGbCYc@L{J`U=+*S+8CyB*YX&w(ERkGmC}1AYlqJ4

8u)WibbHqaoxVFj z&C`oNgw6)Lz*E6G2&+c>-5Ety@Mdro_^WXKjt_giUk26gULSG3xCH!H&Yu7;1V8;z zum1&iIsaY?Uc~k1K+WgkyS@K6fg1OBK=pI!JuV-g1J%F7A?iwS1E}-wfYZTw_u;F7 zWpEz&MQ}eby5H;HA5_1WgEPR#K+)$1;Njqr54e6?3|_|h4dChEFF-xF;A75DcY{+n z|95aU_}T|uubl~=!}(W1&G#W6_xgJSeg=f4qvyam;P5A$?w5W4^>Hf#t zK=J35;7ssAa4Gn8Q1cjn%I)q7kSU681=oPnKke<`0aiHwK6ncFw$J$UH-mFI{}y;Y zxc@`0Csu<@RrDhe7L7K1*7@*N52H&sza4xEJm~j)KI)+Ao%8!n?;%if@_V4Jzi^As z&qDAh&hG~ofnNgq!B;-w^LrI|9OwT6c7jv3I$duBHJ;;d0 z%A-Yz2I4#{}R;m zi+6fI-Ulw^{OjQH;K93`kIn{F@2%iT;9r5_qXRzY{>NhQ7|we@J@-NISnyB4)4;tx z@8uSPs=pJI9DD+t2Yww~0`B{)^WR0_J2<}?JO%s_h{#7%zTkFuC%BCBBfsc!Hv+zq z^FIe~27d-l2jBe%-k(o{>pA~EDE@oLAA0?FfU`LN7f|gV_D4>KHQ?Jg-vX-qe}Sih z$A8J^Z7nGIyBk~#ehoYiJot~@Z&(9Lk9;3I7d+?7F2@gmCC*>)6{lx6cpB#qgVIMo z1x1e~UyY(qf!Bj~fiwTa=l3h%iJTwtr{2$%p!$73sPX*-6urt{bN=`^DE_X4hk`Gz zNi}!Uj_Da{!idx;5)wQdhIH33g=%1#jpPs z@T70Kd~X1cBr8`FaA6CUsr+ixqb_%cD@820sazHdx!qL&(9EeEay*w$AQlUJp3P= zPga2H#|OYQ;Gck+=ac@?ofboIeceb1~mx|L8Q3X^egsyov)B zvd^0WGE~cz>GUn!*XL+ZblV?9Qugw^tp-i4~J`O0_yrv98YizbNn91 zIo$gw$ICeO=2*lveNNSPj$RIZp5!>0@8TE9ko@=Q;ocn1w{YykaTmuwbLg`<+}HQ_ za=d_ZR9N)qx)46%JJgYV?hECQ13%7{{|VRM%K6*Ey$u1yH|KC1!ucygIl&E_?*zAU zyo&GFbDYibIh}KSo?{;8;2f=L|@1)FMf=j?_z&CIl!1tel=W_f7hd$Do`n-gD zw{qxnB*&}y{sE3x^1Z@wEysT0{(tcOeH_VWh%b_b7jpk29MUhZ4P`F^`@(mXKb~VP z$Hs8&t-8qPbdJ^b&Gm%7t_x*e7OtNUenj87etEbicn{}q0VSU!e6NM){+;tP!}phi zcW}OoV_LZOVZQ5g7{_Ngp5r)%#NFLC`) zj@1p<-^R6{a~#9<4}tw0-{a8d-yF>U`*ip|0RD>OUpW?rx-JR$2-kkdG0eGgI-ljc zKKpZA7|PfM{(CdWOTx)*+?&C13&(XF7jgad98ZV)g1y6c#RlCRU*UX8xb}L^&kNrl z0{7#10Y@!d`@?{Oe#%zE`Hg&k5r;lM;y94w4>%6z_zs6YGdWJ+xGR*q2E2*$#T+l? zcroX%1E1pP;dmYA9|iB^xPb5P`6yo+mJ z}y5sUdSGBt`&^tYvGIMrMyyz{Civyk+@T`E#0xkz@aZjbM zJiLCetnZE^ap(GB&K+yf)G4*8aitayREOhI>`iv9E)A8shRZ{7PqnYFx|Y_tH+BBh zIK4A3t_;WhrSJTM#&l={mPu6cNMIjgruGsjGw7hAWU$NKxK zwQ`|**2274jh8gWa(C7V(PQe#Q(KNeLyOzqnM<`@Q{!mbDd)!3p?KOU7r&|FlI}`x zWw;jikJN_a&T^nB?RBn?r$^J{wUy!3)sf-2I#?bMrKd%w#human*P$z8VV1^=byX8 zdP_%#%BAl0ad};(He8EN>#PlHp5l>#%DT9_+FxQ8YSpeaWu~&bd#GHim3?AsBZGt0 zp<&vr4lrbfS6g2jF84>Lb$4?yJj3NK(WyH+t-m_LG*)}!{&IhHXnj0XzHFp2MA6}D zJUCSCqG}`E+M&vDS>);~4fVn=!>i$f(&eQ}U#YVX%6c#2+F+@x9Gx~e*jMQ)4Oi&I zIfH`QTr%FYUh#`v4A1V084G=e1&^H*oi;o?ROuX{MPm=TmoS{2>!}_(PXE(_F!V?{ zCH+8kpyTZGmoAOoQtDbWGHBuvr>*wTZ3e%vG%$5I?y3&1kGmOj*RTjsy`0gdr};AN z@6-m%jI7UENuJOM%kfB!+Rj>X)*_l2=&AIM4EeYbw{GrCsm!H$G=C{-x!#%yLD%Dj8`M^NAZZ=TtSHWj+X6Voa9vZH$Dl-jE z$)3tUcbw~axJ)D6u!sauQ{7jAyC8B++@XsV2AC?p;xkFHDe!Yoym(PRyw*RNvgPh2 z6R!OXm}26km#;!|-h7iWY*XN+e^Dju}AKP@J6zl1n3+0Yg=;p?oBbN#ViL z5Sq8UIwF1G(rCge#pZmdD!o)?V7M$T(zci?A1n{`S88IDnzUJMeLpO^#-v3x4G)bB zpkvDM;>y>n0@?sB~Hv07%KOahcM$(TOBix#@=>UgJL%0j-K>U4NF6(Cbne_-FO5VCgNp= zgGX!Seq^PuIxsKpuVP~QDr>|l>#HNuGl(8T?1ySK1TL#RH9I2ufE*0z_S!I{FiSo# zTp3;;cf{pdS80$QrZtpm@ll-3ixyVV5?!XRp(0kHR~AQ?hcQH|(5*-|SeY%|Pvo~} zsM??FQNlXvi17$^MPp4Z0nd)~`S@kCZJMX_1y4p#nHrNE#D`C*9iA(0f))4{2D65( ziO|#}in?mXmecp{GRh5sfe!;epT6jfC1)>+dxxr+7a9~PF#XjbX*y=2I#7-~VWzIt z(dl`W%)H9#n91l_A1_*0?n0EyecjRN)vgh9s+c8ab7Y{r4!Z)UFvq1HIcd_C*ymCo zX1&s@uB1*IQ=ghbX@z+ZGm{2v1{h8oH ziJ8|BCih53;#CcodS_1LQ4!O;pqM9YR+Gj}tBo}q?~;S(Q=*xcE=Oy?j7+#WWq8nI zc46&mv2H^0Jgvr`D0z{II|LsLSNi(A3mq;?Ymr-xt*=BUlOd^(csyeaY6i}xvzw`h zvay0W)5W1BDufn9xA{|Q$DEwi8(d#S3D!@@lXPKPd1mj-c)lFolc#4-sJrF`I(h+tH#BmYBq=W_NRE#Q2g%6bvj1dYHOx){?%Ve{9m* zK94Zv$`)&h7FqYHR*H1$QS+vvsmmy7=F-ACu2(PvrJ?d%*QoJPmyJ}1=fy|$>Azn6 zR~oF==0%IVj{iftKlI2Pjl`%0ZM|lox^{prqqOj9nLVzDuwv2B5a*??t}@;~+Jkuw z7Q~dQ-|oa+4Av-w54oGFNH?Y9TU_=)ro|0KNcqd5;ep<{apcV=ebFWSl5i1&Vm+0c zV+wt6eXHB4FO|F5JtCi3V+`glcdxfRY}INQ9*H6KJ=I)^z7lTCYE_W)oOAd4OKWr! z@29g$P=(PSSd+h9y}SjPFjI2p<0{$w zRSN(!QpNuB%MO@WgT#3-yT` z%N=bCpreelP}L0$)q;+1pk;EonUeT(#^vWNT3Q(xS!Zgzylyzxo1_F+-Mh)Wl?HA~ zO7@cr>q(LbL76BQQR&amVNx1RR32*4UM_}caW{k%W8D#HvaDHnASjKRvK%d@65l!% z`bG{f+#`tU8mbJUJ9Awi(^E5j&@d|@-f7XEdlUF=gBAF+7w5Qlgfxu|x*T;mty3^R z#B&5YrVCQN=a2T6hFt}?1#9?&UD7V9tBivA&V~ zlO&wf0)Be~A(V;=cQQ4gh(i}`zQj^6VG=@+iZg*NqXm0cjSNVbr%flSWp247VkE9l zDNQoS%?}9&5A#DIH8R^ce5l$-*37iZjJTKZWlDFhjQszeZudO==HAg6)}n^QOeoCc zTT$i4)27s>=gXM~mJVue++!BD*!x_yGGnwWrcLFl>GoiSI8Wn~s}Bj4sbf^;u)zmt zy(IJ3(3>*Bijs20LW;l|``x-^o9b4V`;b!)EKB{(RShbhRgG@cY<8`)Nxn2kFow0J zu?D+V>~lj;q^DDjM7E(PPr@F_Y&(kgmqMz|$=%O+yQ1cCrc+}R5LlUM?bh9iJ!u@9 zO=_{)$yPO1v!1I7Uf&FP<6W!c8YyfzWOa!oS0`>R5u>HO(`Y6a=V$qlX-6F~=h)-s zd6>11tU_OTIyncXeRXNj2B%n252%vB1vjnCY|es8M9gxq7|IFRsu^R-V)P_a>#BeM5-vwB@Qjnpt%#~ zv8O$drg0AKCEKfe?RX7~QMrOdx-SQWc8UF!R?C>qmjlx3;kur_k=p8Zl{Ocztsm%` zcxijSp}2IMsUE_P9Lwl(Ig3eF69h5{MA(B3_}x?R(HRXTsV2#!hA75LaM{9BFE7dw z<)rCRWqlxQ*HpV5Jp42d7V=red9LM)DnT19KF^kN7Lr85rkv#_rI-*?0+gkZ?&{iF z^j6emwyg42GJ!VNrWOf8JP|eZ;;9z&Dy=s4lBv-W78fOTXz%`!zTt}21_@Iy8?kgH zgD}3Ln7GTQ+me^cRaNw$8EtVcW!fZfi?Mi%Vue^;_lE{Z#+K#Cnush3E1`?e!#7>d zYG%4%K%*W_D=B-TuK`429BP3Xloio9L#~;_CVAG^zF=aYGK0ZyRd^>0$t(bPcg?}yDr1vGUEicFmN@(mk zO%*H5%Id&rX}L9JR)rf&RXg8B(sG8)MY_g7>M5z*(#Kf&rUw;|;HSZnUgQS%d( zWLJTw^;1HcWHcAoT$%=9&_4fm<~CnS6uuK7S1XKg^@m#x$Crm-M3U4qTl68VG^@sT z9y}iv?OA`6L-iVR!$j3fU7Ct%F&YutY2?ER#Y-{6?C{D4OO+vF0j&wl@O-A_(pywE zGLSBIxHc0P6z3*2Bj#&mlakd|ERj%qy!*^rZi-u!##pj8s{qg;_GRT6vAKB3STFYJtCp zt82=vtW2BIJzb48Edo#cna1VX?8#)E%3C!V^hL$Q@d_4E>|qX)Ha$dVX?2omOO=FT zDpbQ+S^(}W53iMbY)fN}%Ufrcp@OXyx!FCt8rvoT?cDLTCZm$2tXu97iFhKHFI0wt z*j=>O-VMan7Twi3+XNzI()ftYue7l9bpG+;t`y@++RJr>trzCXrvVtZjX_zEAe3U7 za)q;fE$YJHP~~!qQTtdukYec+m27>@$K3Wwwo+VPVQrP1UUkUZPr7Dw6ZN}T^?=wK z6%#>o$R)mfR;Qdk+d8678V90!RgwTuB(%gyAeU6Eg$M2oTcL2p7A1@XZhVprFwJGu z3>HnR&?I7_bGq|Ov+93t;f1YN3#KLuONHe;pChCpS%t8Xk5}2rxqV!U0Aw+24N(gg z9Z6MM#+hh!ka+4bZEAJ3q1qbyX{ylEz^vx7n3-GfnwQ3a`DN_HcxCnuGUgw%DISNI zVP#HBEjYc}W7T>Ub?s^x5VI_4aWyVZ%A7{grg2EoIY}H*^wV?KZTX4yUp8Fe{+#0h zT+ky@+(pmYBAjU1!gCj4&{;+#{fkU{P7k?|u*!SJHl3(M39Z|jQZOPDd@wD2&Us5N zq;j@`Smq~if-O-sjAxk@l|aF_5-wlJ%9iTGN*(>v6nU9wS>ry7EY!#x7gv36*YpHW zJ|T;5GYkeu^JlVSa~Pd#seV%xF55lbTr;nci{?ajmYG2LD$>F%McNhxSrUcZ9?3R6 zvA&wf23RcHkkxM9W0n*M4gn4})G#%6cf0vtmq4{t;#-6mGh1(}I@hggnY4tCcpLh^iX< ztpd^VBuxpCw1?JB$DmZC?ViQ|Sgxg<27y|hY+JKR!-ixOf&0Wk9TWg>Ei_W@ife*zwj`#ywVGP7rHx;L5I6&!XpC zq595FW|UV)pbgs!`EE9eJ`)J#qN(I2Z#-O49;$|JM`=?jFNg4F8b9^Q&FozaTZ(Sb zFG3Pku97 z@xFE;U_n|J=(Eh3@t?n_0y)CUkS}`nc;eaDNfR9!b(2rgw)@6_vaB@x*msqov|_6i zYOTta#@f{>9iIpe0b!-owtmY6jB&R*7=`pa?y^W1QY@>>>q_0cOw-SlGz_%)7TuqE zbxv2KmCL<6m@ccPY#ZU^@fv|qcsM?L(Tb(oyX`_$qPZ3J_%qE@OSRS}hS@FB}N zy*Q)L3&B&6zH*s*ymBy=fZV+#sXFAU#M2?t2lk!?{H8bm=tc_yCMA$W+lnr`!a_&- zWN>>-uTF1y^%B#!jU!CzO`fOk>cB{6(5Ig0$=)w0W=#$^_B}ir=e{W7MH@JMj3*_l zxb>%~nS&@q!UwJhyM2Stvypb>z?%VpgtRP8OT!*Go)vjS=E-2s{id0^5ctLRGu_v4m zg;n1m;aWvNogx*g1+@wgfctnyD<~tl^Sw8Ii|qm_zQskx=v^! z?O`LAkuuhsRT#CR@d?*apu~r~7G&BSp&MkF;gt{Gu!+)6D7e?Fg_e-e_5l zC{7A#g`szVZ7{hkN9sL|cYpqP1(vld;7(sHUKw3ZegqP=v+85tmbPhW*4sX2dMrxi zFbIjbz%xcnB8&<5YL&^|Ho2M|ZhTtJ)3Twe{Ev<$-5nSBtDbY?p^?4ME$i*%jfpNVcmH_h+k^wg5} z@3LKa=FrH=JTcHa!v64%?R)+Up*2jCneH~|D!O4Tf z1A}&6TW~C^BldN{w1FwJXDwJTJ3i{DSYKxywqW+`_>_27JlD=oUN9%QHGjcz`f5+i znm>D1eAQL{2xVqX=b70&GiUm|y)W!otd&|P(3x*3b&`XaJ#+T#naAzTuM*Ussc)-q zt#2FMz_%@OWOb|3LcfBk8xh(r@>s-yY!G z=(Y7H>$~F7>*`zTPt|v*QmxsA%Y5UP3+j*P=IFKg@AWPDv#5SQ)jUmycGh>q&ptGz z_Uw*$bTj8W_Cs#2PsjCL^_`>F(E7F*NGqyup{n`M z?wA*kzL(NFN3Sj1w)$dP-C2KJZRmW<=zDlxc*c#Z()2f<++v?9y&z6?GZPmH9 z9TS!4+A-F*T#u8XtFqr(&+1PwJ=;e&K+3HQ{C%T0G0;crJDbLB^bis1Plk@pi(Ae| zVG?#SK}}Qn>_aC%yCbUKO>GSm%4{%n&FtpT$OMbcRq-y>nsI}E*MYir&|&{=htV5g z{p&PV@A(dI8uM-)-6*b$>hG^Vq6<8&X}A_1yG10Ra<7o8v_l>{V!s$c z-8*TON5QRui5W7Tc#NwXXz9r?k*U~h2@+6$$|S(rH-?VtxAUar6H&9NRqIwNG!kd* zq0WAU;*b+D38R2dAov!|mk2l`wvlXOObpM2i?QsYTRWk>o>BJ^Sux!%DuVlGNJCKV z=%&#dMJ4K12^hoZvXOGnaKAv4aKS51sP~Kw3?&lP?}d{^P=r<;(tN9|c)`S7Ogy@I zu0(k!eR+(cT(LI1kKz>S(Em@hC$iOUx@l{?!hZBZJZ+i;b;x|wpJ67ABu|PYXqkj1 z8k9=P>>m6cTm{yMZ z;BY#>fq4%z9yGX18*@>ALM(j^tcJpcSZ*+aVub6NZL7cjs2D)Tgz84GmxamQleUzU zk5}Oy*FaBq(F2<`Ypunw;<2e>!?2Fpa5M_*xQM{iz0VnamriVkjXOn_ZT0QG^Cv8T zOkf7~sI6A4oGiZVVcW*;Y<1DEk8~tfT^8MDQTF+XU@?)vxV{x_p{d(p@??$jlS zBPM%HL=taMz-4yyJx15S+*@%Sn3ZQBs;2JA;-UoJWbr3W{`Yzjej}w7dFj3RH}t-F zX7~x=md~JdA$97lgrazs&P?F6e_YNHE!12_~S`u zrGgfofQD|=jmDPd6}G6a2nEZLE4>7*WNurnJY#>6i zP}p4e8IyY$O7x1nF6bi%VN)BrHCL|+8H^N}L=E#_ASTX*hAO8*Ju=c;Xr;j6$;1ND z9b6opNgT~&OHnpBX;foQn)j_qy;?^CU2zP}*Rs<@dpwb+N~=Hu{hGh5UYYGOy@UQq z-42X&BMZ>d76uX8ayF1pDu>Z^d8%eCC=jh5bCTJ8+(<=T@6m~~X5#!%Ob&A}D-&oJ zI%0~gGP#VwRi!61nW(y?55d72rwxxF<@JfLg3!oClp-}J3kJ%Ojw0ss!V7W}8P7G$ z{|=oN84CfphG~5dURR6XG{S*an|Mw+$J*J*Il*Sf7$!BW7D45^vMs9LFLpOtQ;}5t z^^8Mteen4ueKs99u~g*qNVz0dQA&fKMS5Q9Igx5oYP2AoW?es|L`?6!QUq_#fhN@h zd~^4?oDb|hSV@LCUL#4>$SN+a!gv$TK#;(RQWdH;#2*&3aAlq;NTVSd1GSQ)HoZSe zJ;%q^q>25^8R5(*$OV*X^;BXz{W71YSa)cN`0hT9c&qjoh2 z+R{xjCz?u+$)$?$HtCao)Jf5<0vJWn(msg@ zw{M*Y`im)U5xtr&rTZ&EPhU#~w zmVvHc-FC=JhQof`Z(tp@t%@#mocNGYA&qHdutiC;vw8Yu95jW%ncIm7z=j3Jd- zF-49MitV8Sx$vkWrRSyDq&o6i;{Wket3gxje)I6XWZ(%UCd}o{$w@03U;;NXU`yA- zEM{mWYmXpL%I%Ug-~G-&>l{lL#7WHjd@&Q$RhJ)?#*mMH)99_iNK2B^Q8O90G-R^5 zAVZs&o?zHhl2M_O6J#I@l_-r}%-P|W?KYL@eWvg52$(^vMl-v(g%*4IkF@0{&hB}F zP7~LPeUmI9x>0(ou)JX!6<4TXR9kG-2&d8XqVlI3(%*Y)mXCyZ?zknYs$fdw>!Ow| z!K*1li&M3jP2S%vkT9Iez9foW&bCbh7bY1~SXL_YhmES)K5 zuVtRx7BPY(8nz`T%e-sa6yj{gm$E#u9H_8P)V%0XBy=kDlj@3Cn^9m28s?2r`wWlK zBZdMwb6g$O?_nCm7aLFrXbycBtwMApd377C2wG(*GKb=^z z25W^Qs$0og5bD@smGOQ}&z2mTs&Xsr0wW(|PaS?agqE$4QBoYPWyt^2e*c}eLVWI7i+;NPcR%`tD%qi6RVVdZG}so2>BH$W2)Vb=}4BuMmJ8TzD%t$ z$*L>!`1hby4T8#OgoIBAeYx(fxW+%U51~nDRr;ACD#1dw< zXjFf4GIX(?WovPob9oC)yBrn#v&mFuMn*wJb6`5DPK989W5UW}ANZ3Y%a({Y87`V5 zw*kUPKp_N--kX(~RL^C8Or?ssf}|MFN{?i;n$+m>J+gWx zt36vtG_tHb1xv=G*H5N1EvhmlCan{MVUog{EZeseqzO)2Q#H~=Vgr-)W`(`G;*Uq@ z+YHkFW)0aEqC_oDN_RKc>gj)9kJVqkp%oa}4OOt-y zWdlq0BAMT}yQ0~;x;+(7SuWERVjVNj9v{ih`}+KrIQ){pWC)oAT!AN5u_!@nm_P9Y zHq*zqklZleoxzDV({ab*4FnbIvWEkOkiL~p zq4_2n+T#iX7wuuc?dsK70Wb)6uW7m zTN}mp9`m-{VBpENA!)U3hg#pzb}q@!E=1XUq{%T#qs2>2oTXq;2UPw9)sqCBT*Y*Z zbz|521$S#Q)gY`&L9t^GY1$mb)-=eYNUJVw$TSJtw>aGrGCx{t;MWL9BIg;)JaaLi zWwt0TI)x@!Hp0mq!g(9?4<2scn zhb%4Bn1z@WU6iI$_)iXs3KNCa*cn=rk=A-*6J;jW939S+#A->rafp&P6zT{4LAeJJ zm>BKDFKkcHg||k+PFp&b3iZTBBUOsNw~*9kmXocvAK9P3Tb3$u0%a4}Ynq(;N-Wn3 z%f_}0qo_GmZk~vrD~8d+Iq|f5Nj3Rhfyobkd$YHTlapVO3%>}*qsandq9D@^Y46bf_PF6F@X>LSyC3|`NmlIm0sKmeM5X%*iqi0Ig&z$N~QwGAVZ5?tA+aVb&;b;gwuYJq9t7? zTj8W?+6oDzSLKnB1Tzg{?224zPqHY1K9%xh?HKLdzIIF2Q##wOD}UB1uuaYRaTLQ3 zC%X57rM6A9oW0)=)gR2Hl?mdVvo)?WlzQG^DV%hTi!}(>5STh7F7)w9{gMkp;-ZT;8!r`uw8@S~(d^v2Up zU)PjHVR@H&v=DS-P@I&tja2pREe%nSN%d1XCEN6$2I)#TD!Dg~;Qq!c9z*%LiZ65< z;yO9hZCMSG!M1raG;`$Af$7Z_8(3=oC)P}8~TxE3R}$ajxF#nPBy%Vo)zR z-y44^3<6oOR9sZQGw==}V&Ys_=jf3qL;zj-#Pc*8uRr-xL(8|Zf8$V>pzAuW*2yx z1cJRrX@4N2#Vee2GSMCEQ)9&&qG_NTA+B-*F33e1A&XqU_}Lw9@th3LK6HsP>iB-{ z>(Mc@$WPm3Bb)@H>DFPtC1Ld!4`jAQVU0C}jT*W3Z-v-D$hlUN{ zM1`pa7;kp6MK2id6Ka_5B%Xp)PGHi)ZaZc$P=rn>UbcLSdPVEX?ZWVIrCYJw-l*NE zA00kkt+%DFjP;j96w|%aVguV!;?f<2%Bkk^XhDmMiFnlF>GW@l_$0O}Vn5oD%eR<{ z6_1;ScBe?(?g1lsD`e{%-$rvQjkTH(p zH`xIF;Se|KFp?yE&+6OVs!S05&!Fsa6~`YJs%V&@iBmZ*iLC`p6PVlRfi^H5)FgW* z?UXgw!zY{hvV@PTQhV(_6<4WvJ<`~7+oLExMDb7=)Ea+@X8f8GozEuD@fuBw+B*I? zrIi?fB5d>@y(P8IV~!~(({cL&%lZzluw2ukBPI?o_amb>Lr8wxz;v)h2y&9byV{5d z>2hdkYE_zS{I<<8%q2bAkInmFzKxnt?#SY;uy4h+7K+)kwwZ@!TVg_LL?+lZsA-EF zv!#8ueflyRQXryux|#Bs7Cbaj9n+E!u4Lo~ux@8G)vG^6au!}Zq&MQ~MCZurxXxFs zqi46Z<&5UGC@qhvvB3$Z>qUsnTLVUK^UDaXz3_l1>Q$m3T8{_OKXXDq7tR&*P`f zoG@LAUEAG0NL=JC!rNx6_@0W3{KnsQf9MBh>$gXf#0fRk!R(4z<$k)x*X9HB)h0SC znPjJV2WBQ?22-xa3Qa#CaiBTsAu*wzH@u&P*5ECW39`C$ zj99TL0>hoKWPSr_(gC(ZlTfgMMY8(IMDuMz!oYg;qcBf-O?*jHDf&;@NRiCq7L-z<9oH*rCtp=Fx$Su}F{y^r+k7ymv6*PZy~Jsk z*5VHB8PjIe^L!KPb`QFc%ri7Z0ovp#rZFR^YSWD*Md~4{@=lFk)YmZ67z4Q)RHp4f z#o21NQeYHSO{%5w-Ll-Sk-{i#LKu0$v8HMAZ?d{3GX!$>W%OSYkh>J8cYI(~NBQVLki6s0stUt%(v(1=BGp>wU9YN|wR zs<(ZaqfPY5f(a!TT_72kWW~qk3wxMF3sy{Cq*IgpIi6E4D`k&BD@j#SYJqz`xyThWaz+ndB^KVy(~xM?Vf22=}*H<{fA z1Im@ctkG{@6E?dS7NIE=-s_d%NPv_YO@G_Ny{VSMnH#XhrR|yJ`CwOuV$NMNp)3Z- z-W#@4S!Cs@%{CWU+9FF+vaqu;5URi&0_id{Jpmwxd`ACm83`3qP>4&VP6`B0UGRqY zb#r2IJHnh>Sqhe=Wt`v|OK+VwJYw@DwIo`|8NtR#Pl?P)YCfoO$+9vli3w}dkedG0YdhQukG#C&^RuLqCn z2JR!8j|SzAn4&iCyC^0IqW|u=NYvQR!Y`*r4Ax1Rx;O64r)Djys|6907o24lU4roO zC6L*c4(O5^NH-#?N4v8;S!NwDMLfBs37eCI_F9b&YiqQZ~9v{#IYo1Jq3xXq) zYJ^iCJ$=YepoJ!|@id)U53xi3VGQNHMvCw@1NaJLLkG7h)ld1BO#UF&``-ojI<^iM!DqgNjkNpE%kG) z2&E}k>ujcN!Y{YphLW&uS?bRmY@T2!f#!PU#Il3to`)8)m1v6wtXsLh$<=Mg>B+=J z^^ciUDgYL*OSp?_j0;*l9KRw>u;v^~>=UBxiza6ZsuUB6S@eUvT$gHOR`_W#>v*VjO#0;i+@|Cp zdB&BD*lHbr3C%etFM$V?UUU;OvyZ$LEegsKF%>{qX2MV(lGwI=P zh1T0V0KE&b$6Wb$h^`4hUYH9NJIiP8uH1CDAQm!cdK>&PTSLT^SKO&}MCq{P`J5K^ zh)%j&DmS?Hbi-{65jQTIWCxq>o&fTTzDq+>POSV{*YMPuMtV&Ja7Q=hT++VR^tCouoZ6~bzz%j*y`v$bdmPNG$vB=Rn5{$ zyTB_9gP)n19_1qN!h^OCLQ~T)<)Ut39fZpA3B&w=NJ!?Y7nd~F)_A`~7z*cF$E4x? zXW-cZs$WFIXmBBW7f(^BhQ{sSoVN7Sc~)K*DiAKT_(Ol|Pa9v-bafzXnp88p!gKo3 z5C)M3wh8IErEmd##20*BRF7}H!N6t&(8ioLy|z*&pJG?vaS`IO#N;ROVi2}mc#@jG zU|aGtfYcnJq1_9QWI_~#zexwRAaztH=L?b3U9fr=Me+5GKH!3zFAB&J&;!|iQKT$! zKRlr&ch6SoaSoU;!6d3&Pw#+RV^5l6gs`go&HNmWIU^Go zfy7qt5{i~=E|gOXt6Q>O+SX$hWqw^p8$r__a2c=u#?HAzc)gg{^6Mx$834tSG>~Rn z)5+HYSqnDSd@)f9zueW}G;B$O{lgM}x+gDrf3-zLsd#ub$t*SUU{XWN#Gl5JHqXd> zx0|W<4bat+iir%aYJ!}Q`NzKi0+sV^xN~)D+M1?eQS#a!>{V<^w2Xk1) zQTN*OOF=d!){LpfV&qFeF4-zP?^>-PEI0q=V`eL4n>u44sf zujrzPi-J+7JB8rY<}K6FA&10Zp0W`%S!(fD(UY#1sNWa<8hP;J&}_D!k3A^xp=C74 zRq}_)0|DgZ`vwGyGO|B1+#!t^y1|wNrpUTGdVR#7D<89R)f}(v4eVuMyS6l#gDOwvz?4XmTBsB(6LPHd#aG_ed#d0+>j(8i6ml4Qs!XzKMJ7HA%q zgcSj#Pga`_=2AK^wz{J@-d2#McbtU^zmXvtLrNP}qgu&A6a?Jsq877&?nFq1L-j)M z=z_K6iO?-ko16x!hk1~?H|il@zTjv?JHU2n~o<{jtg24#R zz^_AhY>_&b8Ba8wR3&Of7ASFX@l2DDHSAY1wILBVW|2a~R`NH#jmVZ=Fg`-Lv`%@O z3N_C*b0h3a#}ZPSI{Ac5hkLVOam2^VGU zgOBYVimZ`k&`tkRB4bU@4efj$IIvBBOh}&@z1{@H_X)_+-_34HGn;Q@b%?RHn(S=w zjWv-e+qSD?GOt#`Vo{8jX>t?eMw@b1yG%9&kHwZN8xj=gA?}mBAa;{3k`7sU>5w5XWHfJsYlY1!7S`IbKojN0<8h55 z_q&zM2Gb%A(%gon9WkLNs3@J~XPV?Gx7D8wTBk2M!`x2~loe~~4K;0$aQV>250XI< zH!KO$)OA-sg*ZF7PY^==oaW3WcRKy6;RO+ZMK{IA&Jp)yrhm(H(Ih=@>1+p|E~^>3 zv#r4Dv%g24H}&-9pQUvyz8(2~Ll9XyE;UfY>HE1oq=uDA9lL#zq6l9biJrRMFoCSg5^flLCFXWzih+qjgy8aKE;JOesbYv}?h*Nivs+b~>nU6*0w$ZVAvC1oqH>DG zAi^mtLYhT^h_1TwVv>J)+9}?&@(dGyX8!Ixv}}S8`M7YxLt@vGzUHQAPf0szGZPu+ zx{yZM{U^n)3eH;9+S, 2001-2002. +# Dmitry G. Mastrukov , 2002-2003. +# Leonid Kanter , 2004, 2006, 2010. +# Vasiliy Faronov , 2008. +# Yuri Kozlov , 2008. +# Anisimov Victor , 2009. +# Yuri Kozlov , 2010. +msgid "" +msgstr "" +"Project-Id-Version: ru\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 15:48+0200\n" +"Last-Translator: Leonid Kanter \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: KBabel 1.11.4\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Встретился неожиданный атрибут «%s» элемента «%s»" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Не найден атрибут «%s» элемента «%s»" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неожиданный тэг «%s», ожидался тэг «%s»" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неожиданный тэг «%s» внутри «%s»" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Не удалось найти допустимый файл закладок в каталогах поиска" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Закладка для ресурса URI «%s» уже существует" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Для ресурса URI «%s» закладок не найдено" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "В закладке на ресурс «%s» не определён тип MIME" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Отметка о приватности данных в закладке для URI «%s» не определена" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "В закладке для URI «%s» не определена группа" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Нет приложения с именем «%s», создавшего закладку для «%s»" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не удалось дополнить строку выполнения «%s» с помощью URI «%s»" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Преобразование из набора символов «%s» в «%s» не поддерживается" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не удалось открыть преобразователь из «%s» в «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Недопустимая последовательность байтов во входных преобразуемых данных" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Произошла ошибка при преобразовании: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" +"Неполная символьная последовательность содержится в конце входных данных" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Невозможно корректно преобразовать символ «%s» в символ из набора «%s»" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI «%s» не является абсолютным идентификатором при использовании схемы «file»" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Идентификатор URI локального файла «%s» не может включать символ «#»" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI «%s» недопустим" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Недопустимое имя узла в URI «%s»" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI «%s» содержит недопустимо экранированные символы" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Путь «%s» не является абсолютным" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Недопустимое имя узла" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Произошла ошибка при открытии каталога «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не удалось выделить %lu байтов для прочтения файла «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Произошла ошибка при чтении файла «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файл «%s» слишком велик" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не удалось прочитать из файла «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не удалось открыть файл «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не удалось получить атрибуты файла «%s»: сбой в функции fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не удалось открыть файл «%s»: сбой в функции fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Не удалось переименовать файл «%s» в «%s»: сбой в функции g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не удалось создать файл «%s»: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не удалось открыть файл «%s» для записи: сбой в функции fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не удалось закрыть файл «%s»: сбой в функции fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Не удалось удалить существующий файл «%s»: сбой в функции g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблон «%s» недопустим: он не должен содержать «%s»" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон «%s» не содержит XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u байт" +msgstr[1] "%u байта" +msgstr[2] "%u байт" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f КБ" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f МБ" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f ГБ" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ТБ" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f ПБ" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ЭБ" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не удалось прочитать символьную ссылку «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Символьные ссылки не поддерживаются" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не удалось открыть преобразователь из «%s» в «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Невозможно выполнить непосредственное чтение в функции " +"g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "В буфере чтения остались непреобразованные данные" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Канал закрывается на неполном символе" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Невозможно выполнить непосредственное чтение в функции " +"g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не удалось открыть файл «%s»: сбой в функции open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Не удалось отобразить файл «%s»: сбой в функции mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Ошибка в строке %d на символе %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Недопустимый UTF-8 текст в имени — неправильная последовательность «%s»" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "Недопустимое имя «%s»" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "Недопустимое имя «%s»: «%c»" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Ошибка в строке %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Не удалось разобрать строку «%-.*s», которая должна быть числом внутри ссылки " +"на символ (например ê) — возможно, номер слишком велик" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Ссылка на символ не оканчивается точкой с запятой; похоже, символ «&» был " +"использован не для обозначения начала конструкции — экранируйте его как " +"«&»" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Ссылка на символ «%-.*s» не определяет допустимый символ" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Обнаружена пустая конструкция «&;»; допустимыми конструкциями являются: & " +"" < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Имя сущности «%-.*s» неизвестно" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Конструкция не заканчивается точкой с запятой; похоже, что символ «&» был " +"использован не для обозначения начала конструкции — экранируйте его как " +"«&»" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ должен начинаться с элемента (например )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Символ «%s» является недопустимым после символа «<»; этот символ не может " +"начинать имя элемента" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Встретился лишний символ «%s», ожидался символ «>» для завершения пустого " +"элемента тэга «%s»" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Встретился лишний символ «%s», ожидался символ «=» после имени атрибута «%s» " +"элемента «%s»" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Встретился лишний символ «%s»; ожидались символы «>» или «/» для завершения " +"открывающего тэга элемента «%s», либо, возможно, атрибут; может быть, был " +"использован недопустимый символ в имени атрибута" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Встретился лишний символ «%s», ожидалась открывающая двойная кавычка после " +"знака равенства при присваивании значения атрибуту «%s» элемента «%s»" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Символ «%s» недопустим после закрывающего элемента имени «%s»; допустимым " +"символом является «>»" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Элемент «%s» был закрыт, ни один элемент в настоящий момент не открыт" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Элемент «%s» был закрыт, но открытым в настоящий момент является элемент «%s»" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Документ был пуст или содержал только пробелы" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ неожиданно окончился сразу же после открывающей угловой скобки «<»" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ неожиданно окончился, когда ещё были открыты элементы — «%s» был " +"последним открытым элементом" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ неожиданно окончился, ожидалась закрывающая тэг <%s/> угловая скобка" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ неожиданно окончился внутри имени элемента" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ неожиданно окончился внутри имени атрибута" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ неожиданно окончился внутри открывающего элемент тэга" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ неожиданно окончился после знака равенства, следующего за именем " +"атрибута; значение атрибута не указано" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ неожиданно окончился внутри значения атрибута" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документ неожиданно окончился внутри тэга, закрывающего элемент «%s»" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Документ неожиданно окончился внутри комментария или инструкции обработки" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "повреждённый объект" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "внутренняя ошибка или повреждённый объект" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "закончилась память" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "достигнут предел обратного хода" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблон содержит элементы, которые не поддерживаются при поиске частичного " +"совпадения" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "внутренняя ошибка" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"условия в виде обратных ссылок при поиске частичного совпадения не " +"поддерживаются" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "достигнут предел рекурсии" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "достигнут предел рабочего пространства для пустых подстрок" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "недопустимая комбинация флагов перевода строки" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "неизвестная ошибка" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ в конце шаблона" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c в конце шаблона" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "неопознанный символ следует за \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"экранирование, изменяющее регистр (\\l, \\L, \\u, \\U), здесь запрещено" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "числа в квантификаторе {} в неправильном порядке" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "слишком большое число в квантификаторе {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "отсутствует завершающая ] для класса символов" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "неверное экранирование в классе символов" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "диапазон в классе символов в неправильном порядке" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "нечего повторять" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "неопознанный символ после (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "неопознанный символ после (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "неопознанный символ после (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "именованные классы POSIX поддерживаются только внутри класса" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "отсутствует завершающая )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") без открывающей (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "после (?R или (?[+-]цифры должна идти )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "ссылка на несуществующий подшаблон" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "отсутствует ) после комментария" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "слишком большое регулярное выражение" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "не удалось получить память" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-утверждение не имеет фиксированную длину" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "ошибочное число или имя после (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "условная группа содержит более двух ветвей" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "ожидалось утверждение после (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "неизвестное имя класса POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "сортировочные элементы POSIX не поддерживаются" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "слишком большое значение символа в последовательности \\x{...}" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ошибочное условие (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C запрещено в lookbehind-утверждениях" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "рекурсивный вызов мог повторяться бесконечно" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "отсутствует завершающий символ в имени подшаблона" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "два именованных подшаблона имеют одинаковое имя" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ошибочная последовательность \\P или \\p" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "неизвестное имя свойства после \\P или \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "имя подшаблона слишком длинное (не должно превышать 32 символа)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "слишком много именованных подшаблонов (не должно быть больше 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "восьмеричное значение превышает \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "группа DEFINE содержит более одной ветви" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "запрещено повторять группу DEFINE" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "противоречивые параметры NEWLINE" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"за \\g не следует имя в скобках или неотрицательное число (возможно, в " +"скобках)" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "неожиданное повторение" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "переполнение кода" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "переполнение рабочего пространства компиляции" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "не найден ранее проверенный подшаблон со ссылкой " + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" +"Во время поиска совпадений с регулярным выражением %s возникла ошибка: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Библиотека PCRE собрана без поддержки UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Библиотека PCRE собрана без поддержки свойств UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Произошла ошибка при компиляции регулярного выражения %s у символа с номером " +"%d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Произошла ошибка при оптимизации регулярного выражения %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "ожидалась шестнадцатеричная цифра или символ «}»" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "ожидалась шестнадцатеричная цифра" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "в символьной ссылке отсутствует «<»" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "незаконченная символьная ссылка" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "символьная ссылка нулевой длины" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "ожидалась цифра" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "недопустимая символьная ссылка" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "лишний «\\» в конце" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "неизвестная экранирующая последовательность" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Произошла ошибка во время разбора текста замен «%s» у символа с номером %lu: %" +"s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Текст в кавычках не начинается с символа кавычки" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Обнаружена незакрытая кавычка в командной строке или другом тексте от " +"оболочки" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текст закончился сразу после символа «\\» (текст был «%s»)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текст закончился до того, как была найдена закрывающая кавычка для %c (текст " +"был «%s»)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текст был пуст (или содержал только пробелы)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Не удалось прочитать данные из процесса-потомка" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Не удалось создать канал для сообщения с процессом-потомком (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Не удалось прочитать данные из канала потомка (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Не удалось сменить каталог на «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Не удалось выполнить процесс-потомок (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Недопустимое имя программы: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Недопустимая строка в векторе аргументов под номером %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Недопустимая строка в окружении: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Недопустимый рабочий каталог: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не удалось выполнить вспомогательную программу (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Произошла неожиданная ошибка в функции g_io_channel_win32_poll() при чтении " +"данных из процесса-потомка" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Не удалось прочитать данные из процесса-потомка (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Произошла неожиданная ошибка в функции select() при чтении данных из " +"процесса-потомка (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Произошла неожиданная ошибка в функции waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Функция fork завершилась неудачно (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Не удалось выполнить процесс-потомок «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Не удалось перенаправить вывод или ввод процесса-потомка (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "При создании процесса-потомка функция fork завершилась неудачно (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Произошла неизвестная ошибка при выполнении процесса-потомка «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Не удалось прочитать нужное количество данных из канала процесса-потомка (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Символ находится вне диапазона для UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" +"Во входной строке для преобразования обнаружена недопустимая " +"последовательность" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Символ находится вне диапазона для UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Использование:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ПАРАМЕТР...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Параметры справки:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Показать параметры справки" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Показать все параметры справки" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Параметры приложения:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не удалось разобрать целочисленное значение «%s» для %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Целочисленное значение «%s» для %s выходит за пределы" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не удалось разобрать дробное значение двойной точности «%s» для %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Дробное значение двойной точности «%s» для %s выходит за пределы" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Произошла ошибка при разборе параметра %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Отсутствует аргумент для %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Неизвестный параметр %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "В каталогах поиска не удалось найти допустимый файл ключей" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Не является обычным файлом" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Файл пуст" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Файл ключей содержит строку «%s», которая не является парой «ключ-значение», " +"группой или комментарием" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Недопустимое имя группы: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Файл ключей не начинается с группы" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Недопустимое имя ключа: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Файл ключей содержит неподдерживаемую кодировку «%s»" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Файл ключей не содержит группу «%s»" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Файл ключей не содержит ключ «%s»" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Файл ключей содержит ключ «%s», значение которого «%s» не в кодировке UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Файл ключей содержит ключ «%s», значение которого не удалось распознать." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Файл ключей содержит ключ «%s», значение которого не удалось интерпретировать." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Файл ключей содержит ключ «%s» в группе «%s», значение которого не удалось " +"распознать." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Файл ключей не содержит ключа «%s» в группе «%s»" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Файл ключей содержит символ escape в конце строки" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Файл ключей содержит неверную экранирующую последовательность «%s»" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Не удалось преобразовать значение «%s» в число." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целочисленное значение «%s» выходит за пределы" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Не удалось преобразовать «%s» в число с плавающей запятой." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Не удалось преобразовать «%s» в булево значение." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Слишком большое значение количества передано в %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Поток уже закрыт" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Действие было отменено" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Недопустимый объект, не инициализировано" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Неполная многобайтовая последовательность во входных данных" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Недостаточно места для результата" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Прерываемая инициализация не поддерживается" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Неизвестный тип" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "тип файлов %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "тип %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неожиданный ранний конец потока" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Без имени" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "В desktop-файле не указано поле Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Не удалось найти терминал, требуемый для приложения" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не удалось создать пользовательскую папку настроек приложения %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не удалось создать пользовательскую папку настроек MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не удалось создать пользовательский desktop-файл %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Особое определение для %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "привод не поддерживает извлечение" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "привод не поддерживает извлечение или извлечение_с_операцией" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "привод не поддерживает опрос носителя" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "привод не поддерживает старт" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "привод не поддерживает остановку" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Не удалось обработать версию %d текстового представления GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Некорректное число лексем (%d) текстового представления GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Не удалось обработать версию %d текстового представления GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Некорректное число лексем (%d) текстового представления GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Для GEmblemedIcon ожидается GEmblem" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Действие не поддерживается" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Содержащая точка монтирования не существует" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Нельзя скопировать поверх каталога" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Нельзя скопировать каталог поверх каталога" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Целевой файл существует" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Не удалось рекурсивно скопировать каталог" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Соединение не поддерживается" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Произошла ошибка при соединении файла: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Нельзя скопировать специальный файл" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Дано неверное значение символьной ссылки" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Корзина не поддерживается" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Имена файлов не могут содержать «%c»" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "том не поддерживает присоединение" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Нет зарегистрированного приложения для обработки данного файла" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Перечислитель закрыт" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Перечислитель файлов имеет незавершённое действие" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Перечислитель файлов уже закрыт" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Не удалось обработать версию %d текстового представления GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Некорректные входные данные для GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Поток не поддерживает query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Переход по потоку не поддерживается" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Усечение на входном потоке не разрешено" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Усечение не поддерживается на потоке" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Неверное число лексем (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Нет типа для класса с именем %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Тип %s не реализует интерфейс GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Тип %s не является классифицируемым" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Некорректный номер версии: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Тип %s не реализует from_tokens() интерфейса GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Не удалось обработать данную версию текстового представления значка" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Входной поток не поддерживает чтение" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Поток имеет незавершённое действие" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Недостаточно места для адреса сокета" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Неподдерживаемый адрес сокета" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Не удалось найти тип монитора локальных каталогов по умолчанию" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Недопустимое имя файла %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Произошла ошибка при получении сведений о файловой системе: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Нельзя переименовать корневой каталог" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Произошла ошибка при переименовании файла: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Не удалось переименовать файл, такое имя файла уже есть" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Недопустимое имя файла" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Произошла ошибка при открытии файла: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Не удалось открыть каталог" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Произошла ошибка при удалении файла: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Произошла ошибка при удалении файла в корзину: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не удалось создать каталог корзины %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Не удалось найти каталог верхнего уровня для корзины" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Не удалось найти или создать каталог корзины" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не удалось создать запись о файле в корзине: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не удалось удалить файл в корзину: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Произошла ошибка при создании каталога: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файловая система не поддерживает символьные ссылки" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Произошла ошибка при создании символьной ссылки: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Произошла ошибка при перемещении файла: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Нельзя переместить каталог поверх каталога" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Не удалось создать резервный файл" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Произошла ошибка при удалении целевого файла: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Перемещение между точками монтирования не поддерживается" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Значение атрибута не должно быть NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Неверный тип атрибута (ожидалась строка)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Недопустимое имя расширенного атрибута" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Произошла ошибка при установке расширенного атрибута «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Произошла ошибка при получении сведений о файле «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (неверная кодировка)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Произошла ошибка при получении сведений о файловом дескрипторе: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Неверный тип атрибута (ожидался uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Неверный тип атрибута (ожидался uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Неверный тип атрибута (ожидалась строка byte)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Не удалось установить права на символические ссылки" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Произошла ошибка при установке прав: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Произошла ошибка при установке владельца: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "символьная ссылка не должна быть NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Произошла ошибка при установке символьной ссылки: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Произошла ошибка при установке символьной ссылки: файл не является " +"символьной ссылкой" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Произошла ошибка при установке времени модификации или доступа: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Контекст SELinux не должен быть равен NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Произошла ошибка при установке контекста SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "В этой системе не включён SELinux" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Установка атрибута %s не поддерживается" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Произошла ошибка при чтении из файла: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Произошла ошибка при переходе по файлу: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Произошла ошибка при закрытии файла: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Не удалось найти тип монитора локальных файлов по умолчанию" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Произошла ошибка при записи в файл: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Произошла ошибка при удалении старой резервной ссылки: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Произошла ошибка при создании резервной копии: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Произошла ошибка при переименовании временного файла: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Произошла ошибка при усечении файла: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Произошла ошибка при открытии файла «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Целевой файл является каталогом" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Целевой файл не является обычным файлом" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Файл был изменён извне" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Произошла ошибка при удалении старого файла: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Передан недопустимый GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Недопустимый запрос на переход" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Нельзя усечь GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Невозможно изменить размер выходного потока в память" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Не удалось изменить размер выходного потока в память" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Количество памяти, требуемое процессом записи, больше чем доступное адресное " +"пространство" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Выполнять перемещение в начало потока" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Выполнять перемещение в конец потока" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "точка монтирования не поддерживает «отсоединение»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "точка монтирования не поддерживает «извлечение»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"точка монтирования не поддерживает «отсоединение» или " +"«отсоединение_с_операцией»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"точка монтирования не поддерживает «извлечение» или «извлечение_с_операцией»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "точка монтирования не поддерживает «переподсоединение»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" +"точка монтирования не поддерживает возможность определения типа содержимого" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"точка монтирования не поддерживает возможность синхронного определения типа " +"содержимого" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Имя узла «%s» содержит «[», но не «]»" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Выходной поток не поддерживает запись" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Исходный поток уже закрыт" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Ошибка разрешения «%s»: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Ошибка обратного разрешения «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Нет служебной записи для «%s»" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Временно невозможно разрешить «%s»" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Ошибка разрешения «%s»" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Недопустимый сокет, не инициализировано" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Недопустимый сокет, инициализация не удалась по причине: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Сокет уже закрыт" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "создание GSocket из fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не удалось создать сокет: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Указан неизвестный протокол" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "не удалось получить локальный адрес: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "не удалось получить удаленный адрес: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "не удалось слушать: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Произошла ошибка при связывании к адресу: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Произошла ошибка при одобрении подключения: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Произошла ошибка при соединении:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Соединение выполняется" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Произошла ошибка при соединении: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не удалось получить ожидающую ошибку: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Произошла ошибка при получении данных: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Произошла ошибка при отправлении данных: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Произошла ошибка при закрытии сокета: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Ожидание состояния сокета: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Произошла ошибка при отправлении сообщения: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage не поддерживается в Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Произошла ошибка при получении сообщения: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Неизвестная ошибка при соединении" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Слушатель уже закрыт" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Добавленный сокет закрыт" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Не удалось обработать версию %d текстового представления GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Ожидается 1 контрольное сообщение, получено %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Неожиданный тип вспомогательных данных" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Ожидается один файловый дескриптор но получено %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Получен недопустимый файловый дескриптор" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Произошла ошибка при чтении из unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Произошла ошибка при закрытии unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Корень файловой системы" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Произошла ошибка при записи в unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Абстрактные адреса unix domain сокетов не поддерживаются на этой системе" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "том не поддерживает извлечение" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "том не поддерживает извлечение или извлечение_с_операцией" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Не удалось найти приложение" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Произошла ошибка при запуске приложения: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI не поддерживаются" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "смена ассоциаций не поддерживается в Win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Создание ассоциаций не поддерживается в Win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Недостаточно памяти" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Внутренняя ошибка: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Требуется больше входных данных" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Неправильные сжатые данные" diff --git a/po/rw.gmo b/po/rw.gmo new file mode 100644 index 0000000000000000000000000000000000000000..42329057f93709a625551235c9d90583f0dbacb4 GIT binary patch literal 443 zcmY+9K~BRk5Jdw5B(h}9!Utf2(-tVEAVeur1r?(_v~2nJwmyd0Jz5-)27e%~MQNTzBS{0XZ*kx6&HXE^-PItV^`WQwH<5Gp`V<3DDgG;<#}lWg(SGj=Qwe`z{Db* z#e@E!_t!g3WZZR@(DG+ib8bcWM*H(p8+#)1srCWs^dY-~_MfjFHbD, 2005 +# Steve performed initial rough translation from compendium built from translations provided by the following translators: +# Philibert Ndandali , 2005. +# Viateur MUGENZI , 2005. +# Noëlla Mupole , 2005. +# Carole Karema , 2005. +# JEAN BAPTISTE NGENDAHAYO , 2005. +# Augustin KIBERWA , 2005. +# Donatien NSENGIYUMVA , 2005.. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.12\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-03-28 19:34-0700\n" +"Last-Translator: Steve Murphy \n" +"Language-Team: Kinyarwanda \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Inyuguti Ikitezwe: a Nyuma Ikiranga Izina: Bya Ikigize:" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Urufunguzo IDOSIYE OYA Byabonetse in Ibyatanzwe" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Kuri Gusoma Ihuza" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, fuzzy, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Bivuye Inyuguti Gushyiraho Kuri ni OYA" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "OYA Gufungura Bivuye Kuri" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +#, fuzzy +msgid "Invalid byte sequence in conversion input" +msgstr "Bayite in Ihindurangero Iyinjiza" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, fuzzy, c-format +msgid "Error during conversion: %s" +msgstr "Ihindurangero" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +#, fuzzy +msgid "Partial character sequence at end of input" +msgstr "Inyuguti ku Impera Bya Iyinjiza" + +#: glib/gconvert.c:928 +#, fuzzy, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "GUHINDURA Kuri" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "ni OYA ikoresha IDOSIYE Igishusho" + +#: glib/gconvert.c:1761 +#, fuzzy, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "IDOSIYE Gicurasi OYA Gushyiramo a" + +#: glib/gconvert.c:1778 +#, fuzzy, c-format +msgid "The URI '%s' is invalid" +msgstr "ni Sibyo" + +#: glib/gconvert.c:1790 +#, fuzzy, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Izina ry'inturo: Bya ni Sibyo" + +#: glib/gconvert.c:1806 +#, fuzzy, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Kirimo Inyuguti" + +#: glib/gconvert.c:1901 +#, fuzzy, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ni OYA Inzira" + +#: glib/gconvert.c:1911 +#, fuzzy +msgid "Invalid hostname" +msgstr "Izina ry'inturo:" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, fuzzy, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gufungura %s%S bushyinguro" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, fuzzy, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "OYA Bayite Kuri Gusoma IDOSIYE" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: glib/gfileutils.c:551 +#, fuzzy, c-format +msgid "Error reading file '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, fuzzy, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Kuri Gusoma Bivuye IDOSIYE" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, fuzzy, c-format +msgid "Failed to open file '%s': %s" +msgstr "Kuri Gufungura IDOSIYE" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, fuzzy, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Kuri Kubona Ibiranga Bya IDOSIYE Byanze" + +#: glib/gfileutils.c:750 +#, fuzzy, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Kuri Gufungura IDOSIYE Byanze" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Kuri Guhindura izina IDOSIYE Kuri Byanze" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, fuzzy, c-format +msgid "Failed to create file '%s': %s" +msgstr "Kuri Kurema IDOSIYE" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Kuri Gufungura IDOSIYE kugirango Byanze" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Kuri Gufunga IDOSIYE Byanze" + +#: glib/gfileutils.c:1124 +#, fuzzy, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "IDOSIYE OYA Cyavanyweho Byanze" + +#: glib/gfileutils.c:1328 +#, fuzzy, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Sibyo OYA a" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Impera Na:" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, fuzzy, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Kuri Gusoma Ihuza" + +#: glib/gfileutils.c:1871 +#, fuzzy +msgid "Symbolic links not supported" +msgstr "amahuza OYA" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "OYA Gufungura Bivuye Kuri" + +#: glib/giochannel.c:1753 +#, fuzzy +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "a Gusoma in" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +#, fuzzy +msgid "Leftover unconverted data in read buffer" +msgstr "Ibyatanzwe in Gusoma" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +#, fuzzy +msgid "Channel terminates in a partial character" +msgstr "in a Bituzuye Inyuguti" + +#: glib/giochannel.c:1944 +#, fuzzy +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "a Gusoma in" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Kuri Gufungura IDOSIYE Byanze" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Kuri Gufungura IDOSIYE Byanze" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "ku Umurongo INYUGUTI" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "8 Umwandiko" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, fuzzy, c-format +msgid "Error on line %d: %s" +msgstr "ku Umurongo" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "Kuri a Mo Imbere a Inyuguti Indango kugirango Urugero ni Binini" + +#: glib/gmarkup.c:590 +#, fuzzy +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "Indango OYA Impera Na: a Akabago n'Akitso Inyuguti Kuri Gutangira Nka" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Indango OYA a Inyuguti" + +#: glib/gmarkup.c:654 +#, fuzzy +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Byemewe" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Izina: ni OYA" + +#: glib/gmarkup.c:667 +#, fuzzy +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "OYA Impera Na: a Akabago n'Akitso Inyuguti Kuri Gutangira Nka" + +#: glib/gmarkup.c:1014 +#, fuzzy +msgid "Document must begin with an element (e.g. )" +msgstr "g." + +#: glib/gmarkup.c:1054 +#, fuzzy, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s'ni OYA a Byemewe Inyuguti a Inyuguti Gicurasi OYA Ikigize: Izina:" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Inyuguti Ikitezwe: a Inyuguti Kuri Impera Gutangira Itagi: Bya Ikigize:" + +#: glib/gmarkup.c:1206 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "Inyuguti Ikitezwe: a Nyuma Ikiranga Izina: Bya Ikigize:" + +#: glib/gmarkup.c:1247 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Inyuguti Ikitezwe: a Cyangwa Inyuguti Kuri Impera Gutangira Itagi: Bya " +"Ikigize: Cyangwa Ikiranga Sibyo Inyuguti in Ikiranga Izina:" + +#: glib/gmarkup.c:1291 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Inyuguti Ikitezwe: Gufungura Gushyiraho akugarizo Ikimenyetso Nyuma " +"IKIMENYETSO Ryari: Agaciro kugirango Ikiranga Bya Ikigize:" + +#: glib/gmarkup.c:1425 +#, fuzzy, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s'ni OYA a Byemewe Inyuguti Gufunga Ikigize: Izina: Inyuguti ni" + +#: glib/gmarkup.c:1472 +#, fuzzy, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Oya Ikigize: ni Gufungura" + +#: glib/gmarkup.c:1481 +#, fuzzy, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Gufungura Ikigize: ni" + +#: glib/gmarkup.c:1648 +#, fuzzy +msgid "Document was empty or contained only whitespace" +msgstr "ubusa Cyangwa" + +#: glib/gmarkup.c:1662 +#, fuzzy +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Nyuma Gufungura Imfuruka" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, fuzzy, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "Na: Ibintu Gufungura Iheruka Ikigize:" + +#: glib/gmarkup.c:1678 +#, fuzzy, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "Ikitezwe: Kuri a Gufunga Imfuruka Itagi:" + +#: glib/gmarkup.c:1684 +#, fuzzy +msgid "Document ended unexpectedly inside an element name" +msgstr "Mo Imbere Ikigize: Izina:" + +#: glib/gmarkup.c:1690 +#, fuzzy +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Mo Imbere Ikiranga Izina:" + +#: glib/gmarkup.c:1695 +#, fuzzy +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Mo Imbere Ikigize: Gufungura%S Itagi:" + +#: glib/gmarkup.c:1701 +#, fuzzy +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "Nyuma IKIMENYETSO Ikiranga Izina: Oya Ikiranga Agaciro" + +#: glib/gmarkup.c:1708 +#, fuzzy +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Mo Imbere Ikiranga Agaciro" + +#: glib/gmarkup.c:1724 +#, fuzzy, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Mo Imbere Gufunga Itagi: kugirango Ikigize:" + +#: glib/gmarkup.c:1730 +#, fuzzy +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Mo Imbere a Icyo wongeraho Cyangwa Inonosora" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "in a Bituzuye Inyuguti" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Bayite in Ihindurangero Iyinjiza" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Inyuguti Indango" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Inyuguti Indango" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Inyuguti Indango" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "amahuza OYA" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ku Umurongo INYUGUTI" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Indango" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +#, fuzzy +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Umwandiko Na: a Gusubiramo ibyavuzwe Ikimenyetso" + +#: glib/gshell.c:182 +#, fuzzy +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Gusubiramo ibyavuzwe Ikimenyetso in Komandi: Umurongo Cyangwa Ikindi " +"Igikonoshwa Umwandiko" + +#: glib/gshell.c:560 +#, fuzzy, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Nyuma a Inyuguti Umwandiko" + +#: glib/gshell.c:567 +#, fuzzy, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Mbere Gushyiraho akugarizo Byabonetse kugirango Umwandiko" + +#: glib/gshell.c:579 +#, fuzzy +msgid "Text was empty (or contained only whitespace)" +msgstr "ubusa Cyangwa" + +#: glib/gspawn-win32.c:283 +#, fuzzy +msgid "Failed to read data from child process" +msgstr "Kuri Gusoma Ibyatanzwe Bivuye" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, fuzzy, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Kuri Kurema kugirango Na:" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, fuzzy, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Kuri Gusoma Bivuye" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, fuzzy, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Kuri Guhindura>> Kuri bushyinguro" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, fuzzy, c-format +msgid "Failed to execute child process (%s)" +msgstr "Kuri Gukora" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Izina ry'inturo:" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "in Ihindurangero Iyinjiza" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Gufungura %s%S bushyinguro" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Kuri Gukora Porogaramu" + +#: glib/gspawn-win32.c:998 +#, fuzzy +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "Ikosa in Ibyatanzwe Bivuye a" + +#: glib/gspawn.c:190 +#, fuzzy, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Kuri Gusoma Ibyatanzwe Bivuye" + +#: glib/gspawn.c:329 +#, fuzzy, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Ikosa in Guhitamo Ibyatanzwe Bivuye a" + +#: glib/gspawn.c:414 +#, fuzzy, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ikosa in" + +#: glib/gspawn.c:1206 +#, fuzzy, c-format +msgid "Failed to fork (%s)" +msgstr "Kuri" + +#: glib/gspawn.c:1356 +#, fuzzy, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Kuri Gukora" + +#: glib/gspawn.c:1366 +#, fuzzy, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Kuri Ibisohoka Cyangwa Iyinjiza Bya" + +#: glib/gspawn.c:1375 +#, fuzzy, c-format +msgid "Failed to fork child process (%s)" +msgstr "Kuri" + +#: glib/gspawn.c:1383 +#, fuzzy, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ikosa Gukora: %s%s" + +#: glib/gspawn.c:1407 +#, fuzzy, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Kuri Gusoma Ibyatanzwe Bivuye" + +#: glib/gutf8.c:1055 +#, fuzzy +msgid "Character out of range for UTF-8" +msgstr "Inyuma Bya Urutonde kugirango 8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +#, fuzzy +msgid "Invalid sequence in conversion input" +msgstr "in Ihindurangero Iyinjiza" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +#, fuzzy +msgid "Character out of range for UTF-16" +msgstr "Inyuma Bya Urutonde kugirango" + +# crashrep/source\all\crashrep.lng:%MSG_CMDLINE_USAGE%.text +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Ikoresha:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +#, fuzzy +msgid "Show help options" +msgstr "Ifashayobora Amahitamo" + +#: glib/goption.c:868 +#, fuzzy +msgid "Show all help options" +msgstr "Byose Ifashayobora Amahitamo" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, fuzzy, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Umubare wuzuye Agaciro kugirango" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, fuzzy, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Agaciro kugirango Inyuma Bya Urutonde" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Umubare wuzuye Agaciro kugirango" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Agaciro kugirango Inyuma Bya Urutonde" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Ihindurangero" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, fuzzy, c-format +msgid "Unknown option %s" +msgstr "Ihitamo ritazwi:" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Urufunguzo IDOSIYE OYA Byabonetse in Ibyatanzwe" + +#: glib/gkeyfile.c:396 +#, fuzzy +msgid "Not a regular file" +msgstr "a Ibisanzwe IDOSIYE" + +#: glib/gkeyfile.c:404 +#, fuzzy +msgid "File is empty" +msgstr "Idosiye ni ubusa" + +#: glib/gkeyfile.c:763 +#, fuzzy, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"IDOSIYE Kirimo Umurongo ni OYA a Urufunguzo Agaciro Itsinda Cyangwa Icyo " +"wongeraho" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Izina ry'inturo:" + +#: glib/gkeyfile.c:845 +#, fuzzy +msgid "Key file does not start with a group" +msgstr "IDOSIYE OYA Gutangira Na: a Itsinda" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Izina ry'inturo:" + +#: glib/gkeyfile.c:898 +#, fuzzy, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "IDOSIYE Kirimo Imisobekere:" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, fuzzy, c-format +msgid "Key file does not have group '%s'" +msgstr "IDOSIYE OYA Itsinda" + +#: glib/gkeyfile.c:1288 +#, fuzzy, c-format +msgid "Key file does not have key '%s'" +msgstr "IDOSIYE OYA Urufunguzo" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, fuzzy, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "IDOSIYE Kirimo Urufunguzo Na: Agaciro ni OYA 8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, fuzzy, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "IDOSIYE Kirimo Urufunguzo Agaciro" + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "IDOSIYE Kirimo Urufunguzo Agaciro" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "IDOSIYE Kirimo Urufunguzo in Itsinda Agaciro" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, fuzzy, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "IDOSIYE OYA Urufunguzo in Itsinda" + +#: glib/gkeyfile.c:3485 +#, fuzzy +msgid "Key file contains escape character at end of line" +msgstr "IDOSIYE Kirimo Inyuguti ku Impera Bya Umurongo" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "IDOSIYE Kirimo Sibyo" + +#: glib/gkeyfile.c:3649 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nka a Umubare" + +#: glib/gkeyfile.c:3663 +#, fuzzy, c-format +msgid "Integer value '%s' out of range" +msgstr "Agaciro kugirango Inyuma Bya Urutonde" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Nka a Umubare" + +#: glib/gkeyfile.c:3720 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Nka a Icyungo" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Bayite in Ihindurangero Iyinjiza" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "amahuza OYA" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Ihitamo ritazwi:" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "amahuza OYA" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "amahuza OYA" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "amahuza OYA" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Izina ry'inturo:" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Izina ry'inturo:" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Gufungura %s%S bushyinguro" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Kuri Gusoma Ihuza" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Ihindurangero" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Mo Imbere Ikiranga Izina:" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Gufungura %s%S bushyinguro" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Ihindurangero" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Ihindurangero" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Ihindurangero" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "ku Umurongo" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Ihindurangero" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Ihindurangero" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "amahuza OYA" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Ihindurangero" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "a Ibisanzwe IDOSIYE" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Izina ry'inturo:" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Ihindurangero" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Kuri Kurema IDOSIYE" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "ku Umurongo" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Ihindurangero" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Ihindurangero" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "amahuza OYA" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Izina ry'inturo:" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "in Ihindurangero Iyinjiza" + +#, fuzzy +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "ni OYA Byemewe ku Gutangira Bya Izina: Inyuguti NIBA iyi Kuri Nka" + +#, fuzzy +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "ni OYA Byemewe Mo Imbere Izina:" + +#, fuzzy +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Inyuguti Indango Gushyiramo a Nka" + +#, fuzzy +#~ msgid "Unfinished entity reference" +#~ msgstr "Indango" + +#, fuzzy +#~ msgid "Unfinished character reference" +#~ msgstr "Inyuguti Indango" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "8 Umwandiko" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "8 Umwandiko" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Izina ry'inturo: Bya ni Sibyo" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Izina ry'inturo: Bya ni Sibyo" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Ikosa mu gusoma idosiye" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Ihindurangero" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Kuri Gufunga IDOSIYE Byanze" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Kuri Gufunga IDOSIYE Byanze" + +#, fuzzy +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Bivuye Inyuguti Gushyiraho Kuri ni OYA" diff --git a/po/si.gmo b/po/si.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a04a93814d0519bdb4b5ef76f2d8978d4e68ff16 GIT binary patch literal 9251 zcmc(k`;#116~`Nlf{P#^ipcANhTXu9O8Kr_7K(j*eiz%fLB}mO+fU>Oe2Mh5>rOF?yDJ(7i0Ikw0fADk8?ViW(&axXQ z?W&pY-tKeHJ&*4>_x9{xE?n`n!?l&qW%4=GalR_Jf-kOvA9b8-z(e3g;7`E;@J;Yq z@bBOdc)`aUX9U~|-ULSAI`9?nQt&-c=C3%*aSV6~DEIT=7VvIR^gIn-0sa=e5&SDC z>s)@e9p46uoezUK@Okh$@DJcs;J?9D;H4k8^4met`)%-C@aHMM0j^^F7Wf(PAK>}m zIepg7%fQbv9sw^0zXXbZB~a{}1+M{r1&W>~_-U~39AW_)Q0!a{egWJK4uc7JF?a&( z2j2v*1^)(K4W9oA$GH+*1B(8;K+*RQNC=(pfrvWCK(Y6E@I3Hk@N?j=L5ahk)A4`O z=NIF==)VS(=Q}}($0T3k-*h_u0Vw{R0Kahtc>oKHw|>&va{}DQ_-!x-uf~W6z-Pb; zcm~E6!4NEi?|_@YZ5LYq4}miO74SCj>`$>a_+?P!e-G{gH$axd;N##o!E*`jG4Keu z7rcU`?FSzO6YxDy=G{kd#onKRGvEaz(FcDFivQ8MGv2!EI7Q21}-U41kP`?I#1>6GGL5b5pLE*#K3Gxo` zFjxZL2KRvLNdCRxW8f3uyWm=|YAjDrfRg_=K(Y6Cpy>Y>=z=$pT*0 zfcJwn@NV#r;6`xp^Nw>nSOU4_yqb>R0ZG4dYbz*RluK+EeR7@2N9L^HLpqf=q(|!k zH#LrcvzgCLd{*+2nCAJ&1vRyHh1aB6{Q|TvNbNx>y~NJ-e8k`Ek{Xgre9taIr9EK~ zgbrG-gu%fTz0T%aa!rc#+Q2vMW!?qloz;A9-~-KD7p<=AT9=Nbj!pVE^wl~P&Pd;p z+{s0Ia6ZCEYMoZ&KsT*x=Vmh&hLaUHnluw(WcKadY5G^j{l+avo?DnU-T^;OV&~>+ zwd{|(i5~`LcU2(HJ2xjuH* z?VTo0xv?29hp|@}G&o|Cl4r(iQG^fWX=`lek{??Gd(IES){4k>YjL(m5z#HwB0ngm z{>KDSeX!36Y}pSyv$D{6lW@t5f**O~Nf=G54IKiKBoUbK%Qg%4nIx_2Hfv@n81qcz zRl@xq3l;CL1*|$bu*yuhsIY7A&_4|+(b#k?NzGDv~!zR zuC|-O&S1Y=_6ufg8a=W1V9g805zeYz*v_b0OPoxy7=^W}5rfs=>~<-P6S>)voAjpV zOI4$=7`c`C52nIsva4iN`L591x%1BLCYi2!rr=FbX$3J(qPk!MbePfcfG*b6ALX&y zALDBxnmUBrZB)e4u(Z0Y#8BI!%qqBvE7cu4ca_2^x^CH&B&?zBvG#8FolXwK+En9O zwHne-3(hE+DN6}z4=;pX9P}sBZxWZq?$K+GkZvjlS?xqX3mpi2KDnBye02K#T#;ZC-61Qme z_(AL!tk(-YA2cn=%o4;VgK#QHBQ1N$zSu2#dFS5Udq#Ke-ZeBdbe}UGMp3OQhKFMh z;DJ-{i+;kUXx(v2-T}AZjr$e1Ocvkg5x(|+tG_+jFPFU{6I)dsc@rL0I_^1s!0s6E zOoK3IXizlIu!2`M<^;tWDbJ01 zZY6K-@`I9FcFiU)*jo07!l<~VPkKh%sga@KzFVm!P6xSB8cE(H-ht$LD$Wl!n(>kw z(F->38{LuH(3TUMNNa9;FdoWQoi`iC{G{)m+!wvTi>$G?-{OvWWiv7~GBUKbZ%?@v zx#irBFsj6P6I68=Z(hC8*grQ91m>#EW@OdIK1b_ZYOdLMq*?!Ev+-!Nag@QqX5%Si zn)O$kjhSZsCo&R=#^GjtmO-=rA`gGjY&_YlpX51%1`~B2@-H>(r<#pf?mo`I(a~|0 zXXb0o#u2*$lC#bFn~Yf~Z*9@%&&XX-aa;|Wu|=9{ZyZ8(v+*!CAcLkybVLGRZcG|K4E<3S4vB9TKebCkfkUrh^JC(jW`KmXT{)#GeM!F&6OU)jK(qc` z&DqiR;aBO>nIbDpa3zS6Yz;&mnh?L&x!2}MkGUFi4K3@YO40y!xbnX1NCuRlWLZ3& z6NMJz#5c)f$6`IQ53h*}p~VG~EAX7s?o^s@jsMC5kEjyXKP)Eb9Bv6w=FZRwX&96` zu)HA^VZCcdg1PFCQ1O`cC)I@{!KO%A$yV9S9Iel4zNH#kT5toem!_yQV<^Z{+P1n& z|93>Q1e5qKSQlNd2u*l_`Q#>@B4$a*7I8sDo>ZsB{+1U#6}4V4PG>P`8rWkS0E-=M z71e2kA5M@h^{}I55hq$(9o_r|3ABM`x#{gy`f_txPEm~b1<&w{Z(5ygobx!=b9wu| zwD{uMh%ALI(KQ%W}y3uvPw_JV{?Dmmfaa zlZ8%c!Atdac9)(RYlTi|!QM@OqqWjGs4?ju+7)EqrkA#;Dr4IS?INruz5V?ck;>|5 zRB6)awj3xPK?A)#ZMxPQda5{-?(R$DVC#*zr$On@Aq!E)o|!PHvtoKX)_R%lxt6xj zbZ3w)Lfq*Jf{mn;?H`1_b+#eKvJ=@;m^KJHg&LN&LUx*y=p!{p-aYt)o*`b=%*nUJ zO>)-YP$VlK)jffRX=Pc3b|)+$tQ;i8FchJlG+OUTial3i0dlj}$oYDNI=Zhn9z_Wx z#0mBiyM6Rp+ZxKLN66Hk(`yY3u%WoZX=6FUb1hAE(i@JcMLRnkn(e zKnXD$0}9e(L3>;5bwW==x!?hvoS-mEjsAL}nUUR1vM38tBlt^+krlC@thMb|tE3nu zCpLKOR_Td)zC|{xy-g9#WDlYolAVtlLQ}xbMh_wu8@)Js2k#~ zOyi-{eOKf)AZ?v8$2Nt78lyI|7cnafYp2^B%n9c4PAjBj(9Lb?A$`k|moPQf?vNez z$xN))0}6)<>{6Ff{-`e}Ewewkisf`^aiX=NSSXZI^Q0Cu=JOb&ZzIUr)3^=6Z2B7$ zZqgB6(4B%VCPYRNe?gtuY!BvTrfa%Vn7|=~3GMcylLk%NhI{H23s{FlkR>gf`YA{L zm61`smuhQ|m6DS=N_sS%MJ>$SQu3x`m72`XP})Z63@`)MQMs^y@07uFg7j4CuJ}%q z?RsT)+CPXbQ>VuDxvrNW{YgziyKGg|C3V=*fzkwN=o|8eEiWG$l@F?WW)N*`LW@UF zVwLr!)Rs;gA;t`RK$B7tipd|A+-!n2(jBELR1$*DIN6UQPi8{$=GOf~VfF-#5crT) zC*1&>s4eMHVjM#)EmXo|Jw~Og$hNv94~6DT*G@0=!YwIHCaWV^8~D;fFmR{W8ZA1hN{^oV2J(n``KTj%VLKqUM{rIhp#I}vBuOe}Hb7JN)M vOLiyaqLSV|A$IWF9{ZMVuhXM|x*{wci&~Td(-Wt3W-, 2007. +msgid "" +msgstr "" +"Project-Id-Version: glib.si\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2007-06-20 14:56+0530\n" +"Last-Translator: Danishka Navin \n" +"Language-Team: Sinhala \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' මූලය සඳහා බලාපොරොත්තු නොවු '%s' විශේෂණය" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' මූලයෙහි '%s' විශේෂණය හමුවුයේ නැත" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s'බලාපොරොත්තු නොවු ටැගයකි, බලාපොරොත්තු වුයේ '%s' ටැගයයි" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s'බලාපොරොත්තු නොවු ටැගයක් '%s' තුළ ඇත" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "දත්ත බහලුම් තුළ නිරවද්‍ය පිටු සළකුණක් හමුවූයෙ නැත" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URI සඳහා වු පිටු සළකුණ දැනට භාවිතයේ ඇත" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' URI සඳහා පිටු සළකුණු හමුවුයේ නැත" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' URI සඳහා වු පිටු සළකුණු තුළ MIME වර්‍හගයක් සදහන් කරුයේ නැත" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' URI සඳහා වු පිටු සළකුණු තුළ සමූහ කට්ටලය නැත" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' සිට '%s' දක්වා පරිවර්තකය විවෘත කළ නොහැකි විය" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "%s' URI සාවද්‍ය වේ" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' URI හි ධාරක නාමය සාවද්‍ය වේ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "සාවද්‍ය ධාරක නාමය" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, fuzzy, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr " \"%s\" ගොනුව කියවීම සඳහා %lu බයිට් ප්‍රමාණයක් යෙදවිය නොහැකි විය" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ගොනුවෙන් කියවීම අසමත් විය: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ගොනුව විවෘත කිරීම අසමත් විය: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ගොනුවේ විශේෂණ ලබා ගැනීම අසමත් විය: fstat() අසමත් විය: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ගොනුව විවෘත කිරීම අසමත් විය: fdopen() අසමත් විය: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ගොනුව '%s' ලෙස නම වෙනස් ත කිරීම අසමත් විය: g_rename(අසමත් වියed: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ලිවීම සඳහා '%s' ගොනුව විවෘත කිරීම අසමත් විය: fdopen() අසමත් විය: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ගොනුවට ලිවීම අසමත් විය: fwrite() අසමත් විය: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ගොනුවට ලිවීම අසමත් විය: fwrite() අසමත් විය: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ගොනුවට ලිවීම අසමත් විය: fwrite() අසමත් විය: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ගොනුව වැසීමීම අසමත් විය: fclose() අසමත් විය: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "දැනට ඇති '%s' ගොනුව ඉවත් කළ නොහැක: g_unlink() අසමත් විය: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' ආකෘතිය සාවද්‍ය වේ, '%s' අඩංගු නොවිය යූතුය" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ආකෘතියේ XXXXXX අඩංගු නොවේ" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' සංකේතාත්මක පුරුක කියවිම අසමත් විය: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' සිට '%s' දක්වා පරිවර්තකය විවෘත කළ නොහැක: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' ගොනුව විවෘත කිරීම අසමත් විය: open() අසමත් විය: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ගොනුව අනුරුපණය කිරීම අසමත් විය: mmap()අසමත් විය: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d පේළියේ %d අක්‍ෂරය මත දෝෂයකි: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "සාවද්‍ය UTF-8 සංකේතාංකන පෙළ" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d පේළියේ ත දෝෂයකි: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "'%s' වස්තුවේ නම නොදනී" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ලේඛණය මූලයකින්ම ආරම්භ කළ යුතුම වේ (උදා. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' මූලය වසා ඇති අතර කිසිම මූලයක් විවෘතව ඇත" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' මූලය වසා ඇති අතර දැනට'%s' මූලය විවෘතව ඇත" + +#: glib/gmarkup.c:1648 +#, fuzzy +msgid "Document was empty or contained only whitespace" +msgstr "ලේඛණය හිස්ව තිබුනි හෝ තිබුනේ සුදුඉඩ පමණි" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "විනාශ වු වස්තුවක්" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "අභ්‍යන්තර දෝෂය හෝ විනාශ වු වස්තුවක්" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "ප්‍රමාණවත් මතකයක් නැත" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "අභ්‍යන්තර දෝෂය" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "නොදන්නා දෝෂය" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "දහසයේ පාදයේ අංකිතයක් හෝ '}' බලාපොරොත්තු වේ" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "දහසයේ පාදයේ අංකිතයක් බලාපොරොත්තු වේ" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "සංකේතාත්මක යොමුව තුළ '<' මගහැරී ඇත" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "අවසන් නොකළ සංකේතාත්මක යොමුව" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "ශුන්‍ය දිග සංකේතාත්මක යොමුව" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "අංකයක් බලාපොරොත්තු විය" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "සාවද්‍ය සංකේතාත්මක යොමුව" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "සාවද්‍ය වැඩසටහන් නම: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "සාවද්‍ය වැඩකරන බහලුම: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() බලාපොරොත්තු නොවු දෝෂයකි (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "භාැවිතය:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "සහාය විකල්ප:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "සහාය විකල්ප දර්ශනය කරන්න" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "සියළු සහාය විකල්ප දර්ශනය කරන්න" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "යෙදුම් විකල්ප:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "%s නොදන්නා විකල්පයකි" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "හිස් ගොනුවකි" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "සාවද්‍ය සමූහ නාමය: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "සාවද්‍ය යතුරු නම: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "නොදන්නා දෝෂය" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "සාවද්‍ය යතුරු නම: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "සාවද්‍ය ධාරක නාමය" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' සංකේතාත්මක පුරුක කියවිම අසමත් විය: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "%d පේළියේ ත දෝෂයකි: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d පේළියේ ත දෝෂයකි: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "සාවද්‍ය යතුරු නම: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "නොදන්නා දෝෂය" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d පේළියේ ත දෝෂයකි: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "ප්‍රමාණවත් මතකයක් නැත" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "අභ්‍යන්තර දෝෂය" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "සාවද්‍ය ධාරක නාමය" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPTION...]" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "ඇතුළත් කළ නම තුළ ඇති '%s' අක්‍ෂරය සාද්‍යවේ " + +#~ msgid "Unfinished entity reference" +#~ msgstr "අවසන් නොකළ වස්තු යොමුව" + +#~ msgid "Unfinished character reference" +#~ msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "සාවද්‍ය UTF-8 සංකේතාංකන පෙළ" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "සාවද්‍ය UTF-8 සංකේතාංකන පෙළ" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "'%s' URI හි ධාරක නාමය සාවද්‍ය වේ" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "'%s' URI හි ධාරක නාමය සාවද්‍ය වේ" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "පරිවර්තනයේදි දෝෂයකි : %s" diff --git a/po/sk.gmo b/po/sk.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f7bfb5569b9db852e8697a64f1a939e70209f316 GIT binary patch literal 21222 zcmd6u3y@sbS?5od1QR(gn>d8TNp6%#Gh=JUlB_t|(ZiNy`4L+W+wx0^Bj4%1GjrA5 z_qO|Xw=}bPkg%8pFdNWqf(S~?CTtu9i6SHM*hkeS%hnbYP;AJCM-eE(x@uW3 z)c*eGocrjW9%;m~ReMWk{(bK~kMDfvd!6qd{qdDA{J7!zb;{M0|NSCko(KQ%a{h4r z&dZJYe(-m}%fLVK_}@K#2UOMP{QV1FVGRGwi}~{q_!{si*abuI_rMA8hAUjZkANHX z9(*PEDR3No2HXbzK6oAYvMY^w6}THzz5BpT;4x6`p8(bGS@4bEpMwFo4&wKK*Mgr0 zTi_1xC3G?c-VR;^9{2Z8fv@KN>!9fUOYm0kuB#k99|gB^|2yC`_&lioZ-BU)z!RYQ z{|fj3_?*Z6KVZxj?w{{RNyl{{3v>p}H%(BIE`e80y}gOFlQgX_U>fEwpH|NND7@<#4A zfvR@^WC%0s@rOKq65P%6FM(s=-+|)qYY{5-_cl=TjX|x`N$}0!e+D;z{}Ys)z5aD> zyshBBKh&x4}(H$eWG@9;--U&&(7rP%>$z26CHo_!FNGCv2Z z-)F#Qz<&T2!Ov4k^(R<-;U17z<{?o0eJ`l-o&~j@-v*@zS1>3lWcGllx_JN;eK9D0 zd=S)nKLu+1-vAL!^9@k*`3@-hUk;NugWEvyAp)ntUja4lpMlcbs~BAL-45;m9|0l7 z{4A(?=Rm5O?}8fdYM94Qa~*gPJOb_oe;E{?{u&g$S7409r!AoBKL~0*KMcME{5Ys~ zPl1<#-v+-I{A*C__#7xXeKSOejtBX3Irtd(GVmjy=w9;p6;OQpIw*So3>2TPpfmAp z3e@}JHY^a0@S)b3+@5`0Mt5N4Rh4b zgP`br7brdY7%2PsIq-h)zk%v+`!;899tGdZ{jY-R=Py9fzkx>gf;WMp|6`!&{!>tL z`N|vI__u&sx5vPnz<&oagt?qf9|3O!)z6b4q?-Q$s{I&5+zLJb-T{6Zyc_&;@DXqt zW21R~3Y7eu0TCthN8qc$7bCpVpY@>D^>*-8U<4xa=3V~%(_p~;zXzoUe+5b|uVAw3 zcN?hZhe5hF3!vutMNsv=1&ZFwcDnK23hMr0FaRG1B{!c3MgM;U5jFD$7EkN5AC&%l z2-JMP466MSKvef1apw{nO;C^tNLB)qY$RqO%cqRB<@M`cy zRM!1^5D_(R0Y&c|sCFL#Q5o|eJU$Piy5^c&+`2sgs-HIagW%)f>%h-?JP&GJ{}fdJ zFW%?mdIz|k`=cNtXxl9SXe1Y&N_zKlimt0Edni51Mv81ieo5YHl<%YLq|8xt zy`S@WA{E5Iqrv;Nsnd+dWD z)%lBrmUx2PSN$_l>L|-NdZ_CtWt06?{@KS*>CuNMU#0vIsacVPcMRQdfXes8Ya>*v3s?56xErAe8m)G5{L zQ{23b@~eH>2)CJJN55ySwh>$)}{cEVaW>IAcCvzZ=e z6yA;P91Ds!JA$|yw8913ZYG+GlORljs2R1Qq#Gn*D_V2U-TA2OH)ELV#&!gjtbfM- zn`ssekY`8O5oqvGbByXG5#q<#?lCid<2^yz3C3@H`?Zq~*W87I-vj9!zuwKwXfN26kp**K{OVM(p;MiUO|aVM&E)6Rk(in>~w z^rH?`!rYm#)^PLaro5;}S=6=ndF6K4VRho98_gke$Y9UUTYTG)nZ0fz0TS7Yldv0Q znqwHyt{aEVa^Y0dORimuS(uW{X|dq{;aexS+;FiP+bb11(QMQ~%|y)P)HUcyJ!NQ3 z&nh316SPHAw_BB-kv-JWSl6&_MTMqW)QW3qGfj2`trVeZ#*L`C5G>F08N`m~`XrLNFObSuJcsVbMdF1sl2BVfNak$s}*HowQZy zI$sy{ShWjTuiZ{NOp>;}rkjYA2C0pL4NY%K)XK`Aj83qAL$x3ylybSzMP~)Y6uv0>Nu{(pr>dS}9(4JH49dT~jy1^sKSb zfEiv3xrODP%*|IfoSRz9Xx4aJ<4OywXZhe--3#_`OqSFw38HQV1Z72ZW>DdVOvKI$ zcW``Of|j$q%Bzbnl+1N*Q;~yi+-y1$CY@LwM_n|xW(bk_ltd#+Z~=~P!m2xQvsxKh zQLyY8oLa8Aj3B=4+>l+jyX@Ed7&%o-XT`IQM^kfC!A^OW-4kUCksGzzXg&gmnsr0W zeLYAMq#ib5G23A+GW)!Lwwk9lHPKez6yR#?bZfm17OzVyyB_((SL^ASJmYhdu`UMy-;~w@5xDP74e`l)0KD4u$R>4 z^}6DSEAO%Ca`eFl=P|(Pz&K*cSJnDHS}FXuUFQ)MtWB2;tn#k%SUw=~-(YR_#_|Ol&11Tu4S`RQI|a6NSh( z%Of&3MY^!S+BGDZW%K@Vn40KBR8s&vSV>{U+G-9>F7IwWY7$dv(78_78tw{08zY|$ zQZdxG#Ht7!vVds4!jxHJv+im^NIcnbvH))F3M%62lEz=Uz!)};IycM}yW3^$auw6z;+MAnS*)zeumHQz% zv2A?JZ7Gm$tXij7>!B61y(l)pz|5rV9cA*}25Uu4r|9oTGt%nqs53L+H! zmXayk;Z%H%-K5^FCTpE2ix;Dyg}ugN`f&+*qp($Bv;?=(JyK_%40URwJ0I7WTe-^? zGOTgXNz<;m9X&4h%Xh4{cN7UyNV^X-BdQI(cQHw!%rC7JHYs-ZNf=lL18xP2u_Yv0kK(~xCncoNBP$F!jq~g<2kJE< zayP@Za;v!FMYa}NJcG0~@65SPSl?y^Fpf47!7JtTly#$|A9vD3yQKk&k7J7EDGHxu z-`)w?Rxx~#i+H$=Zn;5bFv4psI(iYAl`V=4nrm6i&4#!utBX^51?L0DU3=&3**rnC z-E9y)GjPpiKk&}lo_E@vh@I!u2pWn`|GB!+e#Q|}q0Z;^l=|2{f(Y@)P0dkJqyeFB z(skAj3GorRjkGQ>* zn~b?Dn(d|p*klNtaw&&nT?ET)P3%l>mi&*|Kf;vRRE{-u;Y>3!`(wAgFT~#GA`YZ( zFgBP(2=qHLA!rWR)N3c2>*2Soben_qYRX3|TG?5WirqDq@0c$yvV|AzZ1)JdRGQtN@U%P%`Iu0I@GZhh}5Pm$p(>LscgY_6wbMt&&oBgR8|>_N;8)^zVPgQ zu0UHv9F5Yeqw_k)=Ls+7V!Lf{!mMQ}O}o{Tp(&Yz#1t+Ut885%(Us?R+Z>V=Y!Ydk zgU+)$4`=g(%E!ivP;CCk`ZaTC?>+mlMkF?Hif9?Ja2vzzQi1Y7Xy|suq>SFxUf2)3 z#)d`h;e04^=Y2?N6m0}x?iTl0-{^$0$5AG#T^iqOiP-BHAr_l^=hNd#ln08RNe;~YB$vsSupmFih^FCsd{p`pmDqHS|u68K#W~{l_>nF zpD6n5JZr@eWrIy%yRW?Bx#c-}J(HzPZQ?Xc&!$LZQP#_YuMe`?JW68Q=HZDg9H{*teTL+K>9>2DWsI(J=(tEJmGl zlKsmZv1_rJEn6Szq^dS~M}6}CJQF&H7hQKxq|Z^4`?I;YK6!I*E}J}@P6z7_9Xvd_ z7ZnlvCU3#KPX}8!Z`nM#`TEJNHw0U@OmEvhxp~{>%~YJcC+f$Vby06K@2;QR@|IxB zTc$T}xt4aD*WE?(fATO}#|&qYlH=PS;@q0S;i%aNgPk}=?r!SpZYpc+rhYQlL-ZyO zv)!Ez?ro<1uo3Lc8k6ys?a56|eeaz@hkll%N(fazfSOx#^}sM+g;&BS z%S(Igv39(Lj;pOT4YI7%=Uh{UeeJLnI3GXhDB(h%OkCc4BI@J8^XG@i<8vLp9({pZJ+7bT;1!>yq3@w0Y-%FkP?C0IJ3ziAz_EEBPOW{9a_Gi^AY+S3Bo7+5(@tU@~}%MFJ;IWQ<0m4$a{d)T9; z7HI>t42`?yb~d-ZMcusS zML9#JC6~IU476q=&tiq3XN8bcXZT0U@&%nI&~XAkQRiVQzSA=lwu~oXyHh<+;G4)D zVKXwMnA zzN;^*Loz|uO#zMi%{@5rj6`7din&)~$Hd<0XnbJSR6CA{2dwpXfu_;+L55lq*PT0?_HF&q^s=sUL-NF{QRAvCpLTWX zRvw6zkkQdy5}$U%zVEVcgUaPojc|zJ1GVxUU1Rl`A*1b>qn|_)qlc|jC>g&`2P1mN zmQUA+SnO`YS=oe4{X9l!W`X$6GL0xtHkt2>y#%KjR*y<7HW%i@rklZFw6O^D2BS=c zW7d${+{sXFwAMwX6i!&6fk0-4i(F58#I8s@!vwWHzmV6^20*tZIelL(l>#QM$ zy`6GA66G2}aMtGFotvL37gfun6@$aBR{w%sr>(RmUzdMT98q}@d1`9ELr%>fy7(s# zyogzCsIS~-Tib5;q0VsRr!ZDu1yV;GGP4`7fra#EGFESBy^;7?X=c~P32#Ld@>3d@ z)|b_>LC%aCl5zg2{rgiKtCN+-nM|@c&vEYYRA=8?=#bMmSxIea`CkNRA9gG%b}=^0 zz+N;thT)EK==es9{Vbb!qJXj~QOBufe10kDW8@I)Ar)|z7&7Y1OE~pKFYxGsllM!k zK1w~%s&W**niJ19>~M@Gy<5n~8r8UHx#qeGX`JA=o#lwtu2NJQRpLmyQ!E_gpoq{Y zYmr~G0^P@6wtXPiUp`~+oT(@{H)=NY;rz&uaC>W5N_OQ`NL7fAI1?MlpduAoQ5eeB zC2TE!=KRy%hk1gW_hJ1{*Ly?D=)6`4haRBSPA21xb4Y8#oq~&nVrp znD%o?9`S;Mu5sdyx#mNhbV)pY`{6jyxwGNQW{q=amroO`=33z=?nm>^#l=f`uT{b? zL~+j0pr0a|4f4Cpi~l{+iiqVjSH-l>2m4XW7BV~f#EBIes^hXp&hzCtDqF?Nqn{A0 zDmGL$fcB?Y7*<>0*vHpq^;U_K0_8;O#CfNS<#J}^0xdlWHlW#rtHZ~ai zN>hZ}HEpwb2|V{E-5?>~gDv|~GCkx<%al#px&TL5yfRr=1(A}-C%sRWI?2H(4d#x}#O6?8@XrK= zxmR$Au~#3K8A>k5Q}jwt!FE;2GZ*T6<&1QA*Ct;N;8nCMv4cDAEHELz@g?)5diiH! zbHFWPI9&F`U8|FQ2;P#^&5l6khQsJ>TJeVN^Ry2iZdSa`lY1)^^!$^YvRnQlT(O}SDfm1W z=}+nmRbZT4zL$zmhqjH2hSiHZWmD$w@#TtP?B}pkq>E*duxr-zkU=Y!11XpBu}61w zY)45?_2-Z66djgnXjUGB@D2)6(1sOFZU+WnNR!G|95 zSxHnTlJZ5fA8@Oyz#*Nz5%$|xaOSz7DYV@U3EP3n*B3luuBj-7m5lP^CXr;tN-gmb zMoHG8@0bH8b7ZyL?oCNEZ7)aeE=TrSoX=THC;3KeR8J|#zy^-#3{AtCe$O#ES^_`J zs-6Atl&f|54}P+p14CBd({>T*Z|N|S%|@$chH0EvmPuKna-Zlw&-wb^5ZO4{K3dR` z`KtdIa1nipI-4sT2H}BEB0HJybJB-rIt+)2*4ZAn4RkwDT#Y$ozgcoVa@yQ(zs2UF zbAhckb&MiZL}_@&a0MyaQ<#JR literal 0 HcmV?d00001 diff --git a/po/sk.po b/po/sk.po new file mode 100644 index 0000000..6e6061e --- /dev/null +++ b/po/sk.po @@ -0,0 +1,2140 @@ +# translation of glib.HEAD.po to Slovak +# translation of sk.po to Slovak +# glib Slovak translation. +# Copyright (C) 2001, 2002, 2004, 2005, 2008 Free Software Foundation, Inc. +# Stanislav Visnovsky , 2001,2002. +# Stanislav Visnovsky , 2004. +# Marcel Telka , 2005, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-03-15 15:01+0100\n" +"Last-Translator: Marcel Telka \n" +"Language-Team: Slovak \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural= (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neočakávaná vlastnosÅ¥ '%s' prvku '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "VlastnosÅ¥ '%s' prvku '%s' nenájdená" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Neočakávaná značka '%s', bola očakávaná značka '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neočakávaná značka '%s' vo vnútri '%s'" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Nepodarilo sa nájsÅ¥ platný súbor kľúčov v dátových adresároch" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Záložka pre URI '%s' už existuje" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nenastavené skupiny v záložke pre URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Nepodarilo sa prečítaÅ¥ symbolický odkaz '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Prevod zo znakovej sady '%s' do '%s' nie je podporovaný" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nepodarilo sa otvoriÅ¥ program na prevod z '%s' do '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Neplatná sekvencia bajtov na vstupe prevodu" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Chyba počas prevodu: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Čiastočná sekvencia znakov na konci vstupu" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nepodarilo sa previesÅ¥ náhradné `%s' do kódovej stránky `%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' nie je absolútne URI, používajúce schému \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI lokálneho súboru '%s' nesmie obsahovaÅ¥ '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' je neplatné" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI hostiteľa '%s' je neplatné." + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' obsahuje neplatne zadané znaky" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Cesta '%s' nie je absolútna" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Neplatné meno hostiteľa" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Chyba pri otváraní priečinka '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nepodarilo sa alokovaÅ¥ %lu bajtov pre načítanie súboru \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nepodarilo sa čítanie súboru '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nepodarilo sa otvoriÅ¥ súbor '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Nepodarilo sa získaÅ¥ atribúty súboru '%s': fstat() zlyhala: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nepodarilo sa otvoriÅ¥ súbor '%s': fdopen() zlyhala: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Nepodarilo sa premenovaÅ¥ súbor '%s' na '%s': funkcia g_rename() zlyhala: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nepodarilo sa vytvoriÅ¥ súbor '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Nepodarilo sa otvoriÅ¥ súbor '%s' pre zápis: funkcia fdopen() zlyhala: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nepodarilo sa zapísaÅ¥ súbor '%s': funkcia fwrite() zlyhala: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nepodarilo sa zapísaÅ¥ súbor '%s': funkcia fwrite() zlyhala: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nepodarilo sa zapísaÅ¥ súbor '%s': funkcia fwrite() zlyhala: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nepodarilo sa zatvoriÅ¥ súbor '%s': funkcia fclose() zlyhala: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Existujúci súbor '%s' nemohol byÅ¥ odstránený: funkcia g_unlink() zlyhala: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablóna '%s' je neplatná, nesmie obsahovaÅ¥ '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablóna '%s' neobsahuje XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajtov" +msgstr[1] "%u bajt" +msgstr[2] "%u bajty" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nepodarilo sa prečítaÅ¥ symbolický odkaz '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symbolické odkazy nepodporované" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nepodarilo sa otvoriÅ¥ program na prevod z '%s' do '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Nepodarilo sa 'raw' čítanie v g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Zanechané neprevedené dáta vo vstupnom bufferi" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanál končí čiastočným znakom" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nepodarilo sa 'raw' čítanie v g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nepodarilo sa otvoriÅ¥ súbor '%s': open() zlyhala: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Nepodarilo sa namapovaÅ¥ súbor '%s': mmap() zlyhala: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Chyba na riadku %d znak %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neplatný text v kódovaní UTF-8 - neplatné '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Chyba na riadku %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nepodarilo sa spracovaÅ¥ '%-.*s', čo by mala byÅ¥ číslica v odkaze na znak " +"(napríklad ê) - možno je číslica príliÅ¡ veľká" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Odkaz na znak neskončil bodkočiarkou. Asi ste použili & a nezadali ste ho " +"ako &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Odkaz na znak '%-.*s' nie je kódom povoleného znaku" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Nájdená prázdna entita '&;', platné entity sú: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Meno entity '%s' nie je známe" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entita nekončí bodkočiarkou. Asi ste použili znak & bez toho, aby ste ho " +"zapísali ako &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument musí začínaÅ¥ elementom (napr. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' nie je platný znak za znakom '<', nesmie začínaÅ¥ meno elementu" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Prebytočný znak '%s'. Bol očakávaný znak '>', aby skončil začiatočnú značku " +"elementu '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Prebytočný znak '%s'. Bol očakávaný znak '=' za menom atribútu '%s' elementu " +"'%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Prebytočný znak '%s'. Bol očakávaný znak '>' alebo '/', aby ukončil " +"začiatočnú značku elementu '%s' alebo nepovinne atribút. Možno ste použili " +"neplatný znak v mene atribútu" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Prebytočný znak '%s'. Boli očakávané úvodzovky po '=' pri zadávaní hodnoty " +"atribútu '%s' v elemente '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' nie je platný znak po koncovom mene elementu '%s'. Povolený znak je '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' bol ukončený, momentálne nie je otvorený žiadny element" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' bol ukončený, ale momentálne otvorený element je '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prázdny alebo obsahuje iba medzery" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument neočakávane skončil hneď po začiatočnom znaku '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument neočakávane skončil s otvorenými elementami - '%s' bol posledný " +"otvorený element." + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument neočakávane skončil, očakával sa znak '>' pre ukončenie značky <%s>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument neočakávane skončil v mene elementu" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument neočakávane skončil v mene atribútu" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument neočakávane skončil v začiatočnej značke elementu." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument neočakávane skončil po '=' za menom atribútu, chýba hodnota atribútu" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument neočakávane skončil v hodnote atribútu" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument neočakávane skončil v koncovej značke pre element '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokument neočakávane skončil v komentári alebo inÅ¡trukcii pre spracovanie" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "chýbajúca koncová ] pre triedu znakov" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Neplatná sekvencia bajtov na vstupe prevodu" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Neukončený odkaz na znak" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Neukončený odkaz na znak" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Neukončený odkaz na znak" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "chýbajúca koncová )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") bez otváracej (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "Za (?R alebo (?[+-]číslice musí nasledovaÅ¥ )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "chýbajúca ) po komentári" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regulárny výraz je príliÅ¡ veľký" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Symbolické odkazy nepodporované" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "neplatná podmienka (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "neočakávané opakovanie" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Knižnica PCRE je skompilovaná bez podpory UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Knižnica PCRE je skompilovaná bez podpory UTF8 vlastností" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Chyba na riadku %d znak %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "neukončený symbolický odkaz" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "symbolický odkaz s nulovou dĺžkou" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "očakávaná číslica" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citovaný text nezačína úvodzovkami" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Prebytočné úvodzovky v príkazovom riadku alebo v inom texte shellu" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Text skončil hneď po znaku '\\'. (Text bol '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Text skončil pred nájdením zodpovedajúcej úvodzovky pre %c. (Text bol '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text bol prázdny (alebo obsahoval iba medzery)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nepodarilo sa čítaÅ¥ dáta z procesu potomka" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nepodarilo sa vytvoriÅ¥ rúru pre komunikáciu s procesom potomka (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nepodarilo sa čítaÅ¥ z rúry potomka (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nepodarilo sa zmeniÅ¥ priečinok na '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nepodarilo sa spustiÅ¥ proces potomka (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Neplatný názov programu: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Neplatný reÅ¥azec vo vektore parametra na %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neplatný reÅ¥azec v prostredá: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neplatný pracovný priečinok: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nepodarilo sa spustiÅ¥ pomocný program (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Neočakávaná chyba v g_io_channel_win32_poll() pri čítaní dát z procesu " +"potomka" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nepodarilo sa čítaÅ¥ dáta z procesu potomka (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Neočakávaná chyba v select() pri čítaní dát z procesu potomka (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočakávaná chyba vo waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nepodarilo sa zavolaÅ¥ fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nepodarilo sa spustiÅ¥ proces potomka \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nepodarilo sa presmerovaÅ¥ vstup alebo výstup procesu potomka (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nepodarilo sa spustiÅ¥ proces potomka (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Neznáma chyba počas behu procesu potomka \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Nepodarilo sa prečítaÅ¥ dostatok dát z rúry potomka (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak mimo rozsah UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Neplatná sekvencia na vstupe prevodu" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak mimo rozsah UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Použitie:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[VOĽBA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Voľby pomocníka:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "ZobraziÅ¥ voľby pomocníka" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "ZobraziÅ¥ vÅ¡etky voľby pomocníka" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Voľby aplikácie:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nepodarilo sa spracovaÅ¥ celočíselnú hodnotu '%s' pre %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Celočíselná hodnota '%s' pre %s je mimo rozsah" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nepodarilo sa spracovaÅ¥ celočíselnú hodnotu '%s' pre %s" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Celočíselná hodnota '%s' pre %s je mimo rozsah" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Chyba počas prevodu: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Chýbajúci parameter pre %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Neznáma voľby %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Nepodarilo sa nájsÅ¥ platný súbor kľúčov v dátových adresároch" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nie je obyčajný súbor" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Súbor je prázdny" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Súbor kľúčov obsahuje riadok '%s', ktorý nie je pár kľúč-hodnota, skupinou, " +"ani komentárom" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neplatný názov skupiny: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Súbor kľúčov nezačína skupinou" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neplatný názov kľúča: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Súbor kľúčov obsahuje nepodporované kódovane '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Súbor kľúčov nemá skupinu '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Súbor kľúčov nemá kľúč '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Súbor kľúčov obsahuje kľúč '%s' s hodnotou '%s', ktorá nie je UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Súbor kľúčov obsahuje kľúč '%s', ktorý má hodnotu, ktorá nemohla byÅ¥ " +"interpretovaná." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Súbor kľúčov obsahuje kľúč '%s', ktorý má hodnotu, ktorá nemohla byÅ¥ " +"interpretovaná." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Súbor kľúčov obsahuje kľúč '%s', v skupine '%s', ktorý má hodnotu, ktorá " +"nemohla byÅ¥ interpretovaná." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Súbor kľúčov nemá kľúč '%s' v skupine '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Súbor kľúčov obsahuje znak escape na konci riadku" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Súbor kľúčov obsahuje neplatne zadanú sekvenciu '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Hodnota '%s' nemohla byÅ¥ interpretovaná ako číslo." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Celočíselná hodnota '%s' je mimo rozsah" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Hodnota '%s' nemohla byÅ¥ interpretovaná ako reálne číslo." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Hodnota '%s' nemohla byÅ¥ interpretovaná ako booleovská." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Prúd je už zatvorený" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operácia bola zruÅ¡ená" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Neplatná sekvencia bajtov na vstupe prevodu" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Nepodporovaná operácia" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Neznámy typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "typ súboru %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Nepomenované" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Vlastná definícia pre %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "zväzok neimplementuje vysunutie" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "zväzok neimplementuje vysunutie" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "zväzok neimplementuje vysunutie" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Nepodporovaná operácia" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Cieľový súbor existuje" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolické odkazy nepodporované" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Chyba pri otváraní súboru: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Symbolické odkazy nepodporované" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Neplatný názov programu: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Chyba pri premenovaní súboru: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Neplatný názov súboru" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Chyba pri otváraní súboru: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Nepodarilo sa otvoriÅ¥ priečinok" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Chyba pri odstraňovaní súboru: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ súbor '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ súbor '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ súbor '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Chyba pri otváraní priečinka '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Nepodarilo sa prečítaÅ¥ symbolický odkaz '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Chyba počas prevodu: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Chyba pri odstraňovaní cieľového súboru: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokument neočakávane skončil v mene atribútu" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Chyba pri nastavovaní rozšírenej vlastnostii '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (neplatné kódovanie)" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Neplatný typ vlastnosti (očakávané uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Neplatný typ vlastnosti (očakávané uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Neplatný typ vlastnosti (očakávaný bajtový reÅ¥azec)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Chyba počas prevodu: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Chyba počas prevodu: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Chyba pri nastavovaní vlastníka: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolický odkaz nesmie byÅ¥ prázdny" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Chyba pri nastavovaní symbolického odkazu: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Chyba počas prevodu: %s" + +#: gio/glocalfileinfo.c:2149 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "symbolický odkaz nesmie byÅ¥ prázdny" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Chyba pri nastavovaní vlastníka: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Symbolické odkazy nepodporované" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Chyba pri čítaní zo súboru: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Chyba pri zatváraní súboru: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Chyba pri zápise do súboru: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Chyba pri odstraňovaní starého záložného odkazu: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Chyba pri vytváraní záložnej kópie: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Chyba pri premenúvaní dočasného súboru: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Chyba pri otváraní súboru '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Cieľový súbor je priečinok" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Cieľový súbor nie je obyčajný súbor" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Chyba pri odstraňovaní súboru: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Neplatný názov programu: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Pamäťový výstupný prúd nepodporuje zmenu veľkosti" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Zlyhala zmena veľkosti pamäťového výstupného prúdu" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "pripojenie neimplementuje odpojenie" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "pripojenie neimplementuje vysunutie" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "pripojenie neimplementuje odpojenie" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "pripojenie neimplementuje vysunutie" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "pripojenie neimplementuje opätovné pripojenie" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +#, fuzzy +msgid "mount doesn't implement content type guessing" +msgstr "pripojenie neimplementuje odpojenie" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "pripojenie neimplementuje odpojenie" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Výstupný prúd neimplementuje zápis" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Zdrojový prúd je už zatvorený" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Chyba pri odstraňovaní súboru: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Zdrojový prúd je už zatvorený" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Chyba pri čítaní zo súboru: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ súbor '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Chyba pri zápise do súboru: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Chyba počas prevodu: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Chyba pri čítaní súboru '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Chyba pri otváraní súboru: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ súbor '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Chyba pri odstraňovaní súboru: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Chyba pri otváraní súboru: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Chyba pri zatváraní súboru: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Chyba pri otváraní súboru: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Chyba pri odstraňovaní súboru: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Prúd je už zatvorený" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Chyba pri čítaní z unixu: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Chyba pri zatváraní unixu: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Koreň súborového systému" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Chyba pri zápise do unixu: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "zväzok neimplementuje vysunutie" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "zväzok neimplementuje vysunutie" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Nepodarilo sa nájsÅ¥ aplikáciu" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Chyba pri spúšťaní aplikácie: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI nepodporované" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Neplatné meno hostiteľa" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Neplatná sekvencia na vstupe prevodu" + +#~ msgid "use a long listing format" +#~ msgstr "použiÅ¥ dlhý formát výpisu" + +#~ msgid "[FILE...]" +#~ msgstr "[SÚBOR...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Znak '%s' nie je platný na začiatku mena entity. Znak & začína entitu. Ak " +#~ "tu ale nemá predstavovaÅ¥ entitu, musíte ho zapísaÅ¥ ako &." + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Znak '%s' nie je platný v mene entity" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Prázdny odkaz na znak. Odkaz by mal obsahovaÅ¥ číslice, napríklad Ʋ" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Neukončený odkaz na entitu" + +#~ msgid "Unfinished character reference" +#~ msgstr "Neukončený odkaz na znak" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Neplatný text v kódovaní UTF-8" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Neplatný text v kódovaní UTF-8 - nie je úvodný znak" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Pole obsahujúce názvy ikon" + +#~ msgid "name" +#~ msgstr "názov" + +#~ msgid "The name of the icon" +#~ msgstr "Názov ikony" + +#~ msgid "names" +#~ msgstr "názvy" + +#~ msgid "An array containing the icon names" +#~ msgstr "Pole obsahujúce názvy ikon" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Chyba pri čítaní súboru '%s': %s" diff --git a/po/sl.gmo b/po/sl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..d29168b9723782dcbae3e1a99ebc715ef0884329 GIT binary patch literal 43611 zcmdU&3!Gh5eeZXDfl&l`%X1S5lYvY~!Yd>M2uXlQUXlb90&&lrGc#xAoU;$-F-ZpT zNm0>=0=|_;tF($E4*ncG7F@X~igtoq!K1-~8sPX*=sD7Qs1wW%T;1X~Yr0db$AYF+*1VZBIn;xHdmMecIsD5q(W3UOX1@8v$ z1-}HUzim1xy1oir4L$@e1-}oHB|4Tyb-flm9&CWR|4LBp{{fhQUjwfI*Dy%Y-151t0T z3lzQn3RJ!yfyaOgm~<_T7*sv0!5G{Is{GBM+TRa~uioMBf7IhwJpK$+|Bir&DmMr! z{{~R=e51erVo>eB%|HJLsQ!HcJR1BtsCpJatQb5U6ko3g)sLI}bq7?rJ3&||`hAe8 zioOP_-KSmZ34yDxBKhg2Q~jc0#)wN)owjs0N%m%Fev{2vA=)x z#cthS2CBbpQ1!nFRDV7U($(lYpxQfmjqBHSpvG}4sCM4tufGZ&%k@(shRVmF>U%bL z7+3{Q0jELr`_16t;3J^w`y!}(PlPDy=QBO71l7OY{`zI$sa(GsJQDmAcmnu!5LS$S z0jgh1E^~6|dXF#j_#ROG`x1B@_!xL9c-&ei*DnM`@2fzKXP3X<0>!7dfy)18@Obb; z{{H7d&ENMy@ypW@?#j0YL^MS=f~SG61WyDX0#6429As%n-vvd7A)&CAq^Yv$-`uk-NQ4$?`B{B$H4W0t-1_fTx2m05y*LL5=g{;1=+(jZyS_;4W}l*UxtSdxgjQ!A0EvV^Dni z4N!b=+|`cXHh_qTsNt_41QF5E=RnQ(Z_t>=bqshmcqJHvEl~B|1ByN$21TF01&;xL z1*-o?YicU@boe1CI{g=@{Kqk9&EG|!_~|B4 z?cNDO`sn@OD)5)!5P05JHy^{G=I!+$OFeoo7=u3q2fzi}T>cfH=HdCE>b(OL9o`G7 z-A{lq_&xAa@Q~*?{=5>@x|jmh@BN_o`F>FS{wSz+z5$BAo^p*Vw+dX$bp>1o-UW)z zp9Dp(pMs*x;oIGOEe6F;+d;Y>H9?j@^rxWu`xF+5$_;|zw~e6MZ-8fkcY&(!VepyY zmqFF{1MunKAv;}tM}voO{ajG=e?IsW@D@=0d?~mT`~Y|^_-#=1KK5EipY@=|Uk0BB zz63l9+z+Z>4}eF5e*wa3(bqxE``~r1pI3k^-RNde?SBx|ynPN-`-eT($;C^+z9 zj{si?YW#PCG59`E?R*wg{oe(j0Y2e*PR=|NJfG`xK+SvE-@g-7{`Z0^|0z)Y_y3Wy%LQwVY05uOIp!nr>@Hp@xQ1t&KsQLa0DEb_CgUf#|sCusjm47dI4ES15 z{dy48diyM>@%=k^5qRt_S8kifCMbD$52*S0Jg9upjc&eIfhxZVRDD%22JZq713v(s z2z~-w0e&4+z9VjO{kj0u{A~d>z7BX2_!dz7{YT*8;6H%ki=TqWgQxFy{kj+we@}y= z!-Jss@H61a;I}~Ke+*QAj(@&u_e@ajT>_p8j({=vGLP@@cmO;lVts-afKN``^~K;4 zu5a+yuKi@^c#!=Ung8&o@oOgjF$091VyP~&(9I0$|T zJPmvd)HqJ7I{vr}RKITm?*{Jy#czvij;<>~$%7rB+P@tf0zdBW{{+i;)T?H#$-@zwdDt`kuG zx(!shcY$i>v)~2bzk}z4L;GAmMnL6%IVifk2iyq$oxgwjwBx(0K(*fl&jNo7RJl)s zmw^8Yicgo{;^uQ06hGVps$X9PC7&JzuLMtifh%7IHUD>jqRU4?@%cBw3&91qy8d4d zUcvP^sCM25o~?YK`t|e|y8IV|Cve>cHGg-4THg%fSm?8K^+BN3Z4XR2Umd&Q1pKY6g|HVs=cS)?r^2YF;L~+0Geuz4#`{u#|6YIpL!jFK7O474oC^`2X zQ2jdb_3$2eDYyoF3#jpa1(X~)`VDTLH-P7Hy$d`8d>yFqe-Jze{5Gh5ANfW%?j@l5 zzZ2B_jf0xcH-Mt!hd{OeBT)T1{7p^|odfFnD)3Bj98~!`LDBbN@LcepK&{(T-t6kT z3RHd5p!oD&kALa$XQ1jk^)1+d;1%FC;JZQHe-zZbo&i%_2yOy(|2FUf@F7tB`Zg$f zKjCd|UXBG1<9Y>nId~bk0DKvE9QYdWQ1C%e^}G*U4So;25?uIpH=YUbWUlY^_)+i~ zTz?gOCip{8-{VFi}d>($kqw{L;SgyyxQ^6O3$AI^NCxCwlYCN9>HLr&};P~P!Q1xyF)!%)f`0wqY z_~et|N#MVMs^^H`a(39+pz^H-wQdqn?cV{44<7(EAD;(R|1UwUr_+Di&D%Ag#x)I! z?)yQt_fGJ9@Jrz7;M3mW=zk8V=aZoL`K{m@@Z+HB|6icSxA>iIzITJ_R|{MLz715l z&w%RZ&p`3#(;js8-AYi;r$N&AT}cs%!C4W0tN6I6YVfa05P`0F2o3%NezU9O*Jfuhe^kIw^D{$^0~@mf&p z{2@^FeG|L{{1tc_c+tCw?SR9i@b@|YLv%Qkhxd@4`tj-v_z)J_!;>_wt;n zw7)y}t+n+L(nX{J(kAZR2L1=BL|V!9dqMr(!0#`BYr$`TF9cse`l=rCCw|u74@eq| z{x0Xa{>}m~29E^)7F-JM0~0VN>2H&R=#^Z*+25P=s7Gg#{)p5j{SVSsp1qayRMG;{ z2JY$aGW{lvk@WY+q)YgH9e6Y8Sbh)sXX35jBT1$pBBGy=^mnI!uHXAfPvH8m!7u8D z|GNSFjQ@SV&wm~WYetXy`&V)OZ2#=V9>r%{Nhfjrbe~UfJJ%lr-%mP%-@i%PLi)I_ zNuMCC=347&7}Vc|;OE`X=n#G%M!KErRp8ga5%3?uZ<4~_Gr0FDE^Z>-%FZB2Z@DE8hk>~Hgjo?ebQ%Fbi`)A-aq_2?l_bLa`Q+W0|lK##h9mVgv zNm@G<(o0Ft^v{3J@7IvRUy~oJNl)bYTSzzZ`&mBk^T4YAt^8Wcdq^+y_pZ`S{??Pm z?H4-L<6fWVss4H=_!j-<{*=EbcsbXXgO`#z{BHSj|Hk#z{`b?s*K_?Rq{aT;oB6H3 z(?~4i=*J|mkxF z`K`Y?zfU8*g5Rfr$CLDT1~}+`M*H~vM1H@BbgqB?YVfoE`Q6}7u6O%q7kSj<4hivV ze^cDQf^@il{+rxgNm|c!)8A9ZZKO*`zaR~f#z;>l>F;RLrQ|)?=ikira{v3){QgtY z9VGqzl=L*xBA!=BZzMIizMk~kB>nv}>0j&@dY0#Z!|#}M8L7;*{(eOI4rvwXrQ90< zHfeIC2P|IQ~p#b4aT zvn8Zgk!~YBkNYQ*KI)$f7Wm(X^1MX)E3Oy$dnal45akw!@;aQ#;BO{8o2 z{TkAT`TbndEu;yO{vIGbOnMH_uP06NyGr_Bq+7XO0`4G9^ZUO*{k?(Tr<20p>-h1X z{^GUZ>v?t_xEVYiJR5uyX&LG5T>k;-9@2}rzJ{c~zjqM558ThaQ~mXq!Lvx~NISUy zX>bckfA`z}ogKZ4XCL7DB+~i(-bM<4_xT?a+>`OTs#nGPgcj3c3eyLS-IizSfw5(^|)Lu*UI&F zTu*A{dDq+?FX#2PXy%-O)vC>vXr#?HZKidG%&>zS=(vcXr?1nZKT`NthCD_S2byl!7uG`xFDHID%E7T3T0g{;#MOW zDMxD?jcR2iX;L}f2@avNLKsz2u8~frCV;*UX z0O=H?%Pxy~W`ELZlo?soS_vgI!gAbcQQPK?n>Wx*eY7&xX}WQ<+)6xI)LKRAQzR)+ z@bQ%_m0OeT)Q>o;yOgr7o5>#LHz~z%&)Dutx|>B_ua~R4b#r&MQZMg@&)`hop?MT) zr@PBcgQMhVrCy2)J@>b1qy&p-0cxtN6}Sr`x5OQ~Sz&;g@arxUvMqw2N8>9u)Zn$+ z>v5g zwVRzfGNv3~x!FY5#(JaE-rk0nYtcH#*fE-|R;iPzC7w^zx(1yq0Oj-=&?NIHi=;j# z(Tz0TamCQ`3l5fJWg$beJX&s|#wE6fmY#*aEu~&Cn{r1^x>299*WDYk)%Nnvl^0Cd?r_`qjf1#V#MS%R75L`N#p2t8%3lFofgRlE48KPVf~Ia z(^{cNfpydo;}P_V#+qpY%66)5{L^@0`P4FJtBk6CcW1oNtH#Em86nMFnp?;H3Thx}mRC868lQP{CvC5e&#dZyWBOmxNL#C; z4X%#=hh)F+kr^66sd;HVSx@)W=`unKtCrd0zIQ7&G@D!}BO_(3f20TV>NSW7Rrh!p zbJ1%f?>-bBsvhHPHuOceuuJ?+6pHm!W{wH;#=d@! zGh3?gu+)*wtTB3ZS9ms7ZdWBW8CL}b%enBpmQ3m)*3WQ?Q-#v6 zPZl4iQ+>#UnvyvmFLHJOm<>OFRH!A$&TM$L9QtH1m8+#P%d^65S$gVPY7SsdYN_tf z<=$qpXR;T1roQW0&opB>mn%kyQqoQeoyZ^5FjKTqS6sSgPisbf@Tu)zmNy%729=}j4DMM1gl zO!B~b``th1EY*#dtE^M!SSGcZRW;<#sz#^OY<8`)AzoS_7{i+Et-}(XTB|g;V$X(-lwyb7xW>aGm;8~ezE$Qj}N*c%JliFSFuG0fd}htq?Y2sK_{7TiV1}&| zt)yA=WOLm!V^)h?v@WBr--0C&Z-HrfIYhVQB2^UT5{GutU}h)GV$XUYN#i(ljA*Z( z&BkkJjLI~DbhjPg+r{@+SS@Edw;hmG57&)WJFW5ADxI0VwXZ%h|J+u-C%a^vi5}dJ z0?X)jIrmA%aRM0xOV~LZ@Vg7aM_2UZq?!;(^ zTliTV%*V63=ebqPssL?t<#yZ3Sw|2FowC`fl0Rqo+ZF8%;-=o*v2Z1WFuo$2xXVqq1uqq= zs;HnTZE-GnW(nSQ`{I4Fb@}Rg-mDXhEz6L#C9=`)gkHHF+jIxJnc0Q`jXG~yLD`jV z2Y@Jn84+~e2ry(MbJ;|UtV|}^ZD%xI?8a_89a+$0aMs)qL)tM!M`q91A;5a>ig{+d z;JiK=XG}`&Q)cty#;3`YZ3hh`6|>Iwv9Cp&?73EK-y5=m0*zfvQ`x#^W!!UGmT$7m zu5fRzba;ZG$D^Q>fg+$7uN(1?7)mr@@iLjzjJuht5h27YtYei7*WFEsarU zZI##-Y&(xTtJT)q?0xi84rAfMxtQ#fZ4b&;l`mZ&R-U(9pQ<#|x)w@z4!3dPH#^4I z->GNg+k?3x?#iq{D|t19HQAaiXCIu;whYt}94YAmtl4rjvqUAFDsW-_jF7f6W@gu1 zngn6cZvO4c>3j)M_)dfzmmA^4A7(WiUv9#P1gV$y=|fg&UX7hR`0uFb|ExcXp}HCh z!$j0eT$+gKGa3=v(Z~(QXHQ~=Ipiv9B$Xz`|wilPZ=to2HbJmT~5s+$G27P0x26m~paEZ%)8#ki983LW9-g_-i11IA-xP&OoRrI@Bd=KNfXy3lA=rp!mJ zvU?!GGAt_D{+b)}tR*>0F;!u2m6%@IbnS<(8Qnzv5q3QwwnoK7&>ZU$TRyK-MxPxW zQ74T95xvTZ11J(&;KY+lBG%jkXAD~=f5$c@j08^kgaa@$^Qaj#ns%WH#6(+5#jRQO zzp(Mb(W^BBVPmOlJI~D#t0C+{*vJo7*(HT@T=D>DV}8x}*MDsAJ;w>n5XaLz2X zIB{I)~S?;adH$IojISOKtAI}N4Mb$H& zZI)FF3cl6iavNFsR=wY;qkozrmnYiRd(I+vHFCqniN5D(db}kc$l{I}dIhBUv$bP$ z7+qtbeiIdLZI70?XI3LO&4?T>Gl8;IB!$_Ev?B`AByzc(Cp)9WzBH^2usd&0RD0$b zvyj0X1Q^(82W??G;p0#O50>sLbQE6-J=tXvBG73SEc3d zcHeR50_jYT{@tE-nut%&f_FX|TAb z)jQlB`R)mx5}K_Q6>q7w+-mN9B+B)O^Bs8cu)EiGfz!N!9Y5FpqV7yy3M~mSFVz|f zAgbkJs(?0YDu}g?&Aa3*CIXu>t|_t*=ysbPo-wmnf*b zYG|-nP4W0aJg}=Ej^`+22#KmjgG(A# zY}W6dPUr}cJD!;jEu1;7)JLivJNYtjIulB*jif!E8%9*s+izuvc7!k`MA8{rr#c!E zk#>3(`(uZ;a(Wijj&N+vD)k4F5d_XA_Tr!`Qzilm^1^~6h=|Ms$YV4LPwsX`GZ8Zr zLY$GagN^2{jp~H%9OX3?vt{?RaEhQ5LGIpVyE9t^cG?zkW8%n6>KV^$t4pgGV{MKc zQp^%H<`ehivoohyj|oAo*iCchOT#Nf1mJd=hf&^opEAa2b7j|>!Owwdvrbz?U|(;& zFshCmRuKaJB(+%+`FY+M1yZ7GocYY9nc0=rOd+qfDA*#ft@Au$mJiBxOXKhq3IVHL zOGe!Zrk}~Mo!LRNxSTY#!t14>bacq`V)3zUIiu&hP7m9W?cEKm3HVLEpytatciP6s zCMfPHF{G?#HV&p1wOxgp^C|8E-Tms=lT_M`N{LD=AYaH53|v~WGj6@34$qg^i6%YG zVspjbnv;QPfKA7lD_Lk7BsuILj0b4&{B%~pbGB&|#7?)ZB+6=wPuph}ykO>2mUk0{hE+Ob>c^R0RA@FHn2Vbp z*Jh`kpNOtCk4nJ?TQptUteI!kf|J-RGT({<1bmFFeIrM5R};Bt)pAl_s`}@VeYBcl zNjiUhzGXu0>);g4kXC{pBNI{LW?Hw!a~)y4F<-fr3 zGmcQfn+gwk<6*koOntYbtf`Ebz5BD6PrdRme;32HqI=}H^oDyC!_IwY8+pu>yb@0= zuCTME$a1C;QQ0`OW7fgYiBt&!YQ$olRSpj*jFO<}OVLQeAr;#W*OWNpf@sgK>XLZZ zCQ^sAb1-X2$AR?<4_sW1a`(_FUx>YH?=4Ktt+~GeLG#@qom;m9`LNHPC>saT+J)D+ z(|eA$y@$w$o#QRHDA8Iv-*gFYirCyi8MLN_qx5^AX)2xV0dwk;>&U3TE4?8QVq}dAvqo z6mG{`He9z!XSdxVYVpunmrjKDT)HrB&$MUpiL}NkM(3TP8S3RdCTB;9ZK+zglHgOu zX1pb~c-dff-^cW`$h@R=_BMiMJJfhik#c93`+uE@lWZ@Co{BH<7+ZzMGR zbK5_c79{A3=`bT#I?`s%c>&x)kjhH-F9_~B_reP!zw7H)xONc`r>u%_Tupmm?vOV- zNmCU@P~C?{D07m&gqrZL)DYV#Fa;{dy#VN5*YQncJ?!N&LdJTt3Z>SqeEfX`DE=X@ z1(`Hw(KQ&Rf8~QWY@)0aa_;qNp#>x~IeDMRG~?7=u6Q{423aIKlep{65wGvPT8pr` zdDRvN1(M>~M|u5j$p&pE`($w~*;}b~YB8J6*?>7c<_{^(j8n<83(G3gbeyoS^(z0q zI$VRnlyqCZ#o0hxhn_57wq)5dM4XhSiy7tv(4GW@Rwr7D&+B>A$(;d5BJSu-8w^yM z2=Sqe{ycTYwhK$<(f;g#xfJJ-_&1 z8Me)q!5Mw6cvmzBRDJ1KJ*}0Orp>WS zC|Dosa8P_`2Pd9Z#oMb0ta=53b>)_=n>WOvO34!Ch%dIXL#@hXV`<7eKyDjsDdO#t z1=`cg$G?2(vIXm$P#;qKWtD~a&LJvU;bjr6VD`?|*zR+lPa{AA4sF1Ikz>6oUO8N8 zFW6S)P2%d%73h2-C-sJ1w$^aM&i!1oxV{K7tXZ=>zLevtWO0`(xLlE6o*Td51>w4(LsX*2`m(`rvpgNA zrADQhOr#8CEaBq@*C!CQ#-;}}$O5wmK86E^G)X2B|5<~{w))i8lB_2!mRl0*ST|#U zz>vHWH>jBd3H5{pQ{&A?ebAu88)PL`r7Oq?r$vwGYTl7yd6Tt~*6NjNy)wxJB;)iv z;U+z4RCqm>{QNgneq{dy$2Tx0xN0WT_&4c+k5wnw3)ChXZ+^;Bwmz|`f8b+vZrPKu zW>QO5MLS#VsiZk!^(Ee;hPB6Oe5yR1Oy!-II&==T?|)^SZx`4%4%|*c_YA6FEgcgn zDLB!tMAx#fujYvw_)^eDjDs|&K&z_q(uM|OA3oTU*TCC~bW`~NRYK9pv{9MhOhBGX zcXTuoCC?!QOtDGndjhBZ@*M0jAD0-Wm27bq>d1T3(bmZ@Q>60}(7ByVRoY0~a%_ho ztRFrw+_!vJ5zAey5gud?ZKgtaxo<7SGFgY|4sSTX9E&&`kkg1^6AOSwT>((^R`=%< z`jwdKQ^tQip^)7sJL`9`=}x1WOd&dHe45@(l}m^pF|9HDNXm>7ZG#n)7=qTjrmd@N zp~#|Ap_D&ZGi#d%Dd%63D2!!(tzJRI+BPR1f5SVnPcRhAGDo~Kr=x(5lUWzj`jr+l zNuo&H&dT6?RAq{gifxy6Cfgn2T)laz!E^w}Sy+Ky4RH!_THzv-u5nS?6)4kHvNhRc z4IFr2(zmd_>;wv#2$yL=AhyO*)^oq}d{>ZH&%)A-1K3^x-S zQ|Salobs}z;xrCIvYYFRML5oodPUHp#|JCw1d|g{P9;qs0QD+kK};4Wrr1`W4?A3q z6t7BJJL*WqO>w@aT1PQRg?F6htV|ZU}O(ru+$xx`UvM@B&c*_(RYH6Ze#nD7JI(+!i`rZ<-J*1@aM8Y$7dGb_$|s+#rI$#gp0QPk!6;tEQCK25ds(g?9lLX(7=G2c3q$#gRR zl9Fjj)}_Z=E;EPcK@{IpEh5P{8IYK?xp}P5I2@F+J(Z}29&>m;wX~VDi9#Q05-_D& znT6uM|{~*wc6(<66QnGKQ4c3@izs z>1Vl-OvI_1fbb;;KT?F4nfbY6;+w_(Ukrm#G0Us)JqKToMzB<-;d$|1BVTG9<$$L0 z8W26!WNy@!ydo;|NgK1VZQQnUkx7!}$SPJ{_Xi$qJkV^3kq?WAHAjQo?xK?saki2i zUaEK66oevHN^3h~Vsl|^u<~Vs7=|bK$OGSZaIUQ0H!|_8!w&QM!h_f@!cAOnO+uS+?owHx*OZdU(GhXnEdh*80_(FoBxIr^SAx!&+4~ z#V%AKe_V^Zm`TltTyRooeZKj6s|qIMgnWLnrmR^P1B;-yhGL!;o-htPA5-kjm6o(6z%cw+X6sLHK5f8a-ems%Y}4LbZoc(%1V*mI zY}px{_l;&{D9?1oY|=G}oUYlbWonycbfqVTvk~)E(dY3DdNOeYoNDr%d#mcrTWR_A zfQ#XTQ>8ac17`?I_=QMBs_#q}GxeY9Jd|Oksopg5r;2-9bT+7KkTK9a&V)&dU?lck zH^pL-+w8^-n}!y}<<#IFG-hyLu@r~DA>8Dgc|zQAVy<2vR1|qL+fVY0?1VSnY?w#v zAIl)Om>bSX&JYY#@4Px{&Bj!Xv<(S+)>mI5cI6~o)1cbOX?$PMCM+Ria$ow zu04a1iaIKcud6=4T(W>;jngJ$*mgGcm1$T(I)XN_?BocC_Y}LRA(PEBYroRHvqoi{ zWFS;)i+DaI=!QiXGI|d4oyZckU~b}95c&5nZ5R6KKl@SasEg5}cLOPA=uIES)qA8C zF1D^`PHrwiY#wFYg>b4Dc!VUnJ_bUL4#(@NR?oJA(H!14gS_3J11V(En>C8?mZnqU ztJp1h4)@HPeJiAEaD{StD7LGlDa^d~Jl6>Ee z+ez8+7C!IFtQr#c9{=Mh;PU1Royr57;`l05Z$5g6|GFcg1r7_6({Z*uWF)RLaQsol z={W3JGLSFbt%Xl(KP#D z31OCDb%>o(qEUL}BbV9}A_&H2Rerw2q$b-|=Iu#N#_p3P`b>%2|HH4$%R@xmKPDjO z4)bqiUKj_MC7^(sTP4y@GZ)F+g}Y1i=Og;znslmHtz<3Ra(!Ht(A{|#a?KV@WY2%y zvE!_NGt~HO**oY*w^=pLSj2pEY-bM=_M(J)VUnsK{^q)w1+~vZ@Qo0JR4YxE(D%ma*XauOUpzIK`m^~p(F2M{fIBhkUH#T>P$CKB6lx5yk zEBgiK6|xuSZ`f^ZglV+-W9My{z1A>PxVK$tVJ>TWO%zx1hqhho9X1zp3octR4+|p` zT(jLb3oW$is&YFU-eu^1lyh-!eJ=RuT{>Tg>4Pz4!|~p>Hl4MZ!f;$5m<^Kd%EKPJ z)BoX_?0q|Q!D(eV(a3`Es7TQ{NJ%#=+()b_i*;q{Uv)Hj(WtA@yoB|3Op(p3SsubR z$epP&|2#sIgEQf)4G466CjV8J&`X~^ozyN*S1amrSdTMwTGkx7*p*DDK*E8phD<=V zV!tnhgX8z1I>TjbR_D4&POy16(g_A>E?WJ3WyR__QC$s1;@Tpdt5H{*mu#_Pps)v= z4RQh}2182XE7w_gtDNEDpZ{oA*rW-nrO&vEO+bB5xc`6ZG~yTmjHlc_>y%!@=POjU zRmwr6ImYi?3is``P>rL>P#}ihmf;m+zcHyz6WhCE$8L^#*=dx4&5m$5_Tk?)?pKJe z!;HR(IrDK!EwI?E+(YoJI~R+p$UA-e9ddNZEAQ#;7ud|@X% z@r$Muv9EIRC8hnGGDYR5%>dw`}fIV0OCGJWh;n_4cMWKeNGG+$+R0ys3(1#n*G{6PT$% zuxYdy@rG*Xfpm$tD8hkF z^X`2I?Q!Vf9Q}47Rv&6{3^+&be3a9?pr*5Ipbn_<^7IxdLx}>Ey$;^k37xEmSxGi; zG%^bsAo$!CPCkM_3Dsrgi4=g@caD8g9DNi$)u_ z^X9Z^SHVIah4VY`wq!a7%iR8sM8MMcdN&NhJi%IVGqpJElG^2LFB}jT(t5jvx4#1W_H{ZiIc5 zlf}rqXUZZpiuU&%vQ(#Yys}62T@BH898&*$pCPH%7j`|{?!QSB8Wyp8 zShese8vk&X5Qcx+UB5evD8{$lBU!l_Kb50(+U3lpZgyg>_daz>SkK5WlFyXgbfm;) zijOHsk$Nw{e}$&|IduoAQ%^7y5fpy@RSdyF%*l*3zk6yrxL_SbbS+I*!Ke;COQ3w{I|K`8;cPEXir)ZnMfCCQ75L2}_sdI0jvx z4{YYV^TnENI`xTGEOd*)Y*lKlxEOV=K4fd^fE@qYOjUY?|1c4^Ye%x1^RLN{3A5F~ zfWywN710H!xPpM{M7_D4ptigXTd>5uECeJWB7Vn`Qc$h?TQyUBTiLd`?DI4IOZ3U3 zPyMNjovG%52i#i_Q*L{|6gf&)jD&@iO;9FxX7l~6;`yR}&vmlLZQs(QiwgA1<|ody zX*kr=n>!rzuPF59ww_=t+d;IDLD%{Hp3IYuL-H_DC|DeoE2Gtuk1y~4%$)uO>?$G# zcOT&t0yy5BpIKt6IW9g|BmgBW7Aodp4f#DTMf%)pLG+WuV?IWeQw|mhC-yVab#0U5 zHs$fc#3>}l^T;G`134Ke?<~(s#nWSODkmqAcl`SSju{n@;Ktg>K%oDM}bT(}PrK4lCW^r;~Jgtk=YXleH7`G8yI#v1|PiQPxuktl%=p_QJnY zHI+$zP<>F?wrsP5u|67CcwUIS!PD*daz2}bG|nVE-@?JVaOVhvRtRRNp8yaULNBo-d{T(DrWKE$Hy95YgNT1QzE=g7)+O2^<{ucr% zUDD1_ZjB;~nd64~SK)KzxoIj_*4}%O`R?4MsWjpg7hz-!4h(&NNH5jJ{u7(pS4loik!`Dgbc9I0R&+a z#?p{@waaWGCm-}uioLL*bMMV*EKTH-`?-61x8IGe<;5g_%wdFJ(qvN4jHZMrkLH<2)?Mc8%j^)~fRM{!Gr)!|kQ%gF^OI!u8{G1i!bSg^L;`@EQVX%#n{ z*Et!e>sKMLo$6~pVh}#}6PDd1ZHAC0OZmx@-6#~bgL@iik>VkIkwIB>Emb~r5bP5?wQ@I$q zx*8aFW|6d2lXNHqIAtNw&O4(3E7jnw(qqZPQ6O&0~Zhpys*Uf{HsI>ik(0JD{NCDEVN zmFhswxRA4HU}_-7?>A(+UW&B1My}fFG_h6JGIl@TB9a6N?MPjELgm_BVOG7}iX`Ea zM2u#E^`k?qSs6tdlcLHcm0@;VKYNudqKvh24@<#ZrS^jzS@hEu9mpbY2Gk> S;%lVX4AX(z3hLz=_J0GPh1@Uz literal 0 HcmV?d00001 diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..c85803b --- /dev/null +++ b/po/sl.po @@ -0,0 +1,2153 @@ +# Slovenian translation for glib. +# Copyright (C) 2002-2006 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# +# Andraz Tori 2000. +# Matej Urbančič , 2007 - 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-05 07:21+0100\n" +"Last-Translator: Matej Urbančič \n" +"Language-Team: Slovenian GNOME Translation Team \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" +"%100==4 ? 3 : 0);\n" +"X-Poedit-Country: SLOVENIA\n" +"X-Poedit-Language: Slovenian\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Nepričakovan atribut '%s' za element '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributa '%s' elementa '%s' ni mogoče najti" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Nepričakovana oznaka '%s'. Pričakovana je oznaka '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Nepričakovana oznaka '%s' znotraj '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Ni veljavne datoteke zaznamkov v podatkovnih mapah" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Zaznamek za URI '%s' že obstaja" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Ni veljavnega zaznamka za URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "V zaznamku za URI '%s' ni določene vrsta MIME" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "V zaznamku za URI '%s' ni določene zasebne zastavice" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "V zaznamku za URI '%s' ni nastavljenih skupin" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Program z imenom '%s' ni ustvaril zaznamka za '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Napaka med razÅ¡irjanjem ukazne vrstice '%s' z URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pretvorba iz nabora znakov '%s' v '%s' ni podprta" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ni mogoče odpreti pretvornika iz '%s' v '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Neveljavno zaporedje bajtov na vhodu pretvorbe" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Napaka med pretvorbo: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Delno (nedokončano) zaporedje znakov na koncu vhoda" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ni mogoče pretvoriti '%s' v nabor znakov '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' pri uporabi \"datotečne\" sheme ni absoluten" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Krajevna datoteka URI '%s' ne sme vsebovati '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' je neveljaven" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime gostitelja naslova URI '%s' ni veljavno" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Naslov URI '%s' vsebuje neveljavne ubežne znake" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Pot '%s' ni absolutna pot" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Neveljavno ime gostitelja" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Napaka ob odpiranju imenika '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ni mogoče rezervirati %lu bajtov za branje datoteke \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Napaka ob branju datoteke '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datoteka \"%s\" je prevelika." + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ni mogoče brati iz datoteke '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Ni mogoče odpreti datoteke '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Ni mogoče dobiti atributov datoteke '%s': fstat() ni uspel: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Ni mogoče odpreti datoteke '%s': fdopen() ni uspel: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Ni mogoče preimenovati datoteke '%s' v '%s': g_rename() ni uspel: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ni mogoče ustvariti datoteke '%s' %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Ni mogoče odpreti datoteke '%s' za pisanje: fdopen() ni uspel: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Ni mogoče zapisati datoteke '%s': fwrite() ni uspel: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Ni mogoče zapisati datoteke '%s': fflush() ni uspel: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Ni mogoče zapisati datoteke '%s': fsync() ni uspel: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Ni mogoče zapreti datoteke '%s': fclose() ni uspel: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Obstoječe datoteke '%s' ni mogoče odstraniti: g_unlink() ni uspel: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Predloga '%s' je neveljavna, saj ne sme vsebovati '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Predloga '%s' ne vsebuje XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajtov" +msgstr[1] "%u bajt" +msgstr[2] "%u bajta" +msgstr[3] "%u bajti" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Ni mogoče prebrati simbolne povezave '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Simbolne povezave niso podprte" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Ni mogoče odpreti pretvornika iz '%s' v '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ni mogoče prebrati g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Preostanek nepretvorjenih podatkov v bralnem medpomnilniku" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal je prekinjen v delnem znaku" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ni mogoče prebrati v g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Ni mogoče odpreti datoteke '%s': open() ni uspel: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Ni mogoče preslikati datoteke '%s': mmap() ni uspel: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Napaka v vrstici %d, znak %d:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neveljavno UTF-8 kodirano besedilo imena - neveljaven '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ni veljavno ime" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ni veljavno ime: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Napaka v vrstici %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Ni mogoče razčleniti '%-.*s', ki bi morala biti Å¡tevilka znotraj reference " +"znaka (na primer ê) - morda je Å¡tevilka prevelika" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Referenca znaka se ni končala s podpičjem; najverjetneje je uporabljen znak " +"'&' brez povezave z entiteto - znak '&' mora biti zapisan kot '&'" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Referenca znaka '%-.*s' ne Å¡ifrira dovoljenega znaka" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Zaznana prazna entiteta '&;'; veljavne entitete so: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Neznano ime entitete '%-.*s'" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiteta se ne zaključi s podpičjem; najverjetneje je uporabljen znak '&' " +"brez povezave z entiteto - znak '&' mora biti zapisan kot '&'" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument se mora začeti z elementom (na primer )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' ni veljaven znak, kadar sledi znaku '<'; morda se ne začne z imenom " +"elementa" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Nenavaden znak '%s'. Pričakovan znak je '>', da se zaključi oznako predmeta " +"'%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Nenavaden znak '%s'. Za imenom atributa '%s' (elementa '%s') je pričakovan " +"znak '='" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Nenavaden znak '%s'. Pričakovan znak '>' ali '/', ki bi zaključil oznako " +"elementa '%s' ali atribut; morda ste uporabili neveljaven znak v imenu " +"atributa'" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Nenavaden znak '%s'. Za enačajem je pričakovan narekovaj znotraj katerega je " +"podana vrednost atributa '%s' elementa '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Znak '%s' ni veljaven kadar sledi zaprtju imena elementa '%s'; dovoljen znak " +"je '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' je zaprt, trenutno ni odprtega elementa" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element '%s' je zaprt, Å¡e vedno pa je odprt element '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prazen ali pa vsebuje le presledne znake" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument nepričakovano zaključen takoj za odprtjem predmeta '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument nepričakovano zaključen s Å¡e odprtimi elementi - '%s' je zadnji " +"odprt element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument nepričakovano zaključen, pričakovan je zaključni zaklepaj oznake <%" +"s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument nepričakovano zaključen sredi imena elementa" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument nepričakovano zaključen sredi imena atributa" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument nepričakovano zaključen sredi oznake za odprtje elementa." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument nepričakovano zaključen za enačajem, ki sledil imenu atributa; ni " +"določena vrednosti atributa" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument nepričakovano zaključen sredi vrednosti atributa" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument nepričakovano zaključen sredi oznake zaprtja elementa '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokument nepričakovano zaključen sredi opombe ali ukaza" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "pokvarjen predmet" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "notranja napaka ali pokvarjen predmet" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "primanjkuje pomnilnika" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "dosežena omejitev sledenja nazaj" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "vzorec vsebuje predmete, ki niso podprti za delno iskanje zadetkov" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "notranja napaka" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "predhodne povezave, kot pogoji, niso podprti za delno primerjavo" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "dosežena omejitev globine drevesne ravni" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "dosežena omejitev delovnega prostora za prazne podrejene niti" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "nepravilna sestava zastavic nove vrstice" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "neznana napaka" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ na koncu vzorca" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c na koncu vzorca" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "neprepoznan znak sledi znaku \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"ubežno spreminjanje velikosti črk (\\l, \\L, \\u, \\U) na tem mestu ni " +"dovoljeno" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "Å¡tevilke niso zapisane pravilno v {} količilniku" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "Å¡tevilke so prevelike v {} količilniku" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "manjkajoč zaključni znak ] za znakovni razred" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "neveljavno ubežno zaporedje v znakovnem razredu" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "nepravilen obseg v znakovnem razredu" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ni mogoče ponoviti" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "neprepoznan znak za (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "neprepoznan znak za (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "neprepoznan znak za (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX razredi so podprti le znotraj razreda" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "manjka zaključujoči )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") brez odpirajočega (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ali (?[+-] Å¡tevilom mora slediti )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "povezava na neobstoječ podrejen vzorec" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "manjka ) po opombi" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "logični izraz je predolg" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "napaka med pridobivanjem pomnilnika" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "povratna trditev ni določene dolžine" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "nepravilno oblikovano ime ali Å¡tevilka za (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "pogojna skupina vsebuje več kot dve veji" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "trditev pričakovana za (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "neznano POSIX ime razreda" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX primerjalni elementi niso podprti" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "znakovna vrednost v zaporedju \\x{...} je predolga" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "neveljaven pogoj (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ni dovoljen v povratnih trditvah" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "drevesni klic opravila se lahko izvaja v neskončnost" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "manjkajoč zaključni znak v imenu podrejenega vzorca" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dva imenovana podrejena vzorca imata enako ime" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "nepravilno oblikovano \\P ali \\p zaporedje" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "neznano ime lastnosti za \\P ali \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ime podrejenega vzorca je predolgo (največ 32 znakov)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "preveč imenovanih podrejenih vzorcev (največ 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "osmiÅ¡ka vrednost je večja kot \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE skupina vsebuje več kot eno vejo" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "ponavljanje DEFINE skupine ni dovoljeno" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "nepopolna NEWLINE možnost" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g ne sledi označenemu imenu ali pogojno označenemu Å¡tevilu večjem od nič" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "nepričakovana ponovitev" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "prekoračitev kode" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "pretečena delovna povrÅ¡ina prevajanja kode" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "predhodno preverjene povezave podrejenega vzorca ni mogoče najti" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Napaka med primerjanjem logičnega izraza %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Knjižnica PCRE je pretvorjena brez UTF-8 podpore" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Knjižnica PCRE je pretvorjena brez lastnosti UTF-8 podpore" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Napaka med pretvarjanjem logičnega izraza %s pri znaku %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Napaka med prilagajanjem logičnega izraza %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "Å¡estnajstiÅ¡ko Å¡tevilo ali pa pričakovan '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "pričakovano Å¡estnajstiÅ¡ko Å¡tevilo" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "manjkajoč znak '<' v simbolni povezavi" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "nedokončana simbolna povezava" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "simbolna povezava nične dolžine" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "pričakovano Å¡tevilo" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "neveljavna simbolna povezava" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "obidi končna '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "neznano ubežno zaporedje" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Napaka med razčlenjevanjem besedila zamenjave \"%s\" pri znaku %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citirano besedilo se ne začne z narekovajem" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "V ukazni vrstici ali v citiranem besedilu manjka končni narekovaj" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Besedilo končano takoj po znaku '\\'. (Besedilo je bilo '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Besedilo končano preden je bil najden zaključni narekovaj za %c. (besedilo " +"je bilo '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Besedilo je bilo prazno (ali pa vsebuje le presledne znake)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Ni mogoče prebrati podatkov iz procesa podrejenega predmeta" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Ni mogoče ustvariti cevi za stik s procesom podrejenega predmeta (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ni mogoče prebrati iz cevi podrejenega procesa (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Ni mogoče spremeniti imenika v '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ni mogoče izvesti podrejenega procesa (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Neveljavno ime programa: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Neveljaven niz v vektorju argumenta pri %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neveljaven niz okolja: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neveljavna delovna mapa: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Napaka med izvajanjem pomožnega programa (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Nepričakovana napaka v g_io_channel_win32_poll() med branjem podatkov " +"procesa podrejenega predmeta" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ni mogoče prebrati podatkov podrejenega procesa (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Nepričakovana napaka branja podatkov v opravilu select() podrejenega procesa " +"(%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Nepričakovana napaka v waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Ni mogoča razvejitev (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ni mogoče izvesti podrejenega procesa \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Ni mogoče preusmeriti vhoda ali izhoda podrejenega procesa (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ni mogoče razvejiti podrejenega procesa (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Neznana napaka med izvajanjem podrejenega procesa \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Ni mogoče prebrati dovolj podatkov iz cevi podrejenega procesa (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak izven intervala za UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Neveljavno zaporedje na vhodu pretvorbe" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak izven intervala za UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Uporaba:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[MOŽNOST ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Možnosti pomoči:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Pokaži možnosti pomoči" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Pokaži vse možnosti pomoči" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Možnosti programa:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Ni mogoče razčleniti celoÅ¡tevilske vrednosti '%s' za %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "CeloÅ¡tevilska vrednost '%s' za %s izven obsega" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Ni mogoče razčleniti dvojne vrednosti '%s' za %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Vrednost dvojne velikosti '%s' za %s izven obsega" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Napaka med razčlenjevanjem %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Manjka argument za %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Neznana možnost %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Veljavnega ključa v iskanih imenikih ni mogoče najti" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ni običajna datoteka" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Datoteka je prazna" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Datoteka s ključem vsebuje vrstico '%s', ki ni ključ-vrednost par, skupina " +"ali opomba" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neveljavno ime skupine: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Datoteka s ključem se ne začne s skupino" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neveljavno ime ključa: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Datoteka s ključem vsebuje nepodprto kodiranje '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Datoteka s ključem ni del skupine '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Datoteka s ključem nima ključa '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Datoteka s ključem vsebuje ključ '%s' z vrednostjo '%s', ki ni zapisan v UTF-" +"8 naboru" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Datoteka s ključem vsebuje ključ '%s' z vrednostjo, ki je ni mogoče " +"obravnavati." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Datoteka s ključem vsebuje ključ '%s' z vrednostjo, ki je ni mogoče " +"obravnavati." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Datoteka s ključem vsebuje ključ '%s' v skupini '%s' z vrednostjo, ki je ni " +"mogoče obravnavati." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Datoteka s ključem nima ključa '%s' v skupini '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Datoteka s ključem vsebuje ubežni znak na koncu vrstice" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Datoteka ključa vsebuje neveljavno ubežno zaporedje '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vrednosti '%s' ni mogoče obravnavati kot Å¡tevilo." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "CeloÅ¡tevilska vrednost '%s' izven obsega" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Vrednosti '%s' ni mogoče obravnavati kot Å¡tevilo s plavajočo vejico." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Vrednosti '%s' ni mogoče obravnavati kot Boolovo vrednost." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Prevelika vrednost Å¡tetja poslana na %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Pretok je že zaprt" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Opravilo je bilo preklicano." + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Neveljaven predmet, opravilo ni začeto" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Neveljavno večbitno zaporedje na vhodu" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Ni dovolj prostora za cilju" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Dejanje prekinitve zagona ni podprto" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Neznana vrsta" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s vrsta datoteke" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s vrsta" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Nepričakovan prezgodnji konec pretoka" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Neimenovan" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Namizna datoteka ne vsebuje določenega polja Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Ni mogoče najti terminala, ki ga zahteva program" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Ni mogoče ustvariti nastavitvene mape uporabnikovega programa %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Ni mogoče ustvariti uporabnikove nastavitvene MIME mape %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ni mogoče ustvariti uporabnikove datoteke namizja %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Določilo po meri za %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "pogona ni mogoče izvreči" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "pogon ne vključuje ukaza izvrzi ali izvrzi_z_dejanjem" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "pogon ne podpira preverjanja enote" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "pogon ne vključuje možnosti zagona" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "pogon ne vključuje možnosti zaustavitve" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Ni mogoče upravljati z različico %d kodiranja GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Ni mogoče upravljati z različico %d kodiranja GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Pričakovan GEmblem za GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Opravilo ni podprto" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Obstoječa enota ne obstaja" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Ni mogoče kopirati preko mape" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Ni mogoče kopirati mape preko mape" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Ciljna datoteka obstaja" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Ni mogoče kopirati drevesne strukture mape" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Splice ni podprt" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Napaka med prepletanjem datoteke: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Ni mogoče kopirati posebne datoteke" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Neveljavna vrednost simbolne povezave" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Smeti niso podprte" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Ni mogoče uporabiti '%c' v imenu datoteke" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "enota ne podpira priklopa" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Na voljo ni programa z a upravljanje s to datoteko" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Å tevilčnik je zaprt" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Å tevilčnik izvaja izredno dejanje" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Å tevilčnik datotek je že zaprt" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Ni mogoče upravljati z različico %d kodiranja GFileIcon " + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Nepravilno oblikovani podatki za GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Pretok ne podpira query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Iskanje po pretoku ni podprto" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Razčlenitev ni dovoljena na dovodnem pretoku" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Razčlenitev ni podprta na pretoku" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Napačno Å¡tevilo znakov (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Ni določenega imena razreda %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Vrsta %s ne vstavlja vmesnika GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Vrste %s ni uvrščena v razred" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Nepravilno oblikovana Å¡tevilka različice: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Vrsta %s ne vstavlja from_tokens() vmesnika GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Ni mogoče upravljati z navedeno različico kodiranja ikone" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Vhodni pretok ne podpira branja" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Pretok izvaja izredno dejanje" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Ni dovolj prostora za naslov vtiča" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nepodprti naslov vtiča" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Ni mogoče najti privzete vrste nadzora mape" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Neveljavno ime datoteke %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Napaka med branjem podrobnosti datotečnega sistema %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Ni mogoče preimenovati skrbniÅ¡ke mape" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Napaka med preimenovanjem datoteke: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Ni mogoče preimenovati datoteke, izbrano ime že obstaja" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Neveljavno ime datoteke" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Napaka med odpiranjem datoteke: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Ni mogoče odpreti mape" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Napaka med odstranjevanjem datoteke: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Napaka ob premikanjem datoteke v smeti: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ni mogoče ustvariti mape smeti %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Ni mogoče najti vrhnje ravni smeti" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Ni mogoče najti ali ustvariti mape smeti" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ni mogoče ustvariti datoteke podrobnosti: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ni mogoče premakniti datoteke v smeti: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Napaka med ustvarjanjem mape: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Datotečni sistem ne podpira simbolnih povezav" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Napaka med ustvarjanjem simbolne povezave: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Napaka med premikanjem datoteke: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Ni mogoče premakniti mape čez mapo" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Ni mogoče ustvariti varnostne kopije" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Napaka med odstranjevanjem ciljne datoteke: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Premikanje med priklopi ni podprto" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Vrednost atributa ne sme biti določena kot NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Neveljavna vrsta atributa (pričakovan niz)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Neveljavno razÅ¡irjeno ime atributa" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Napaka med določanjem razÅ¡irjenega atributa '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Napaka med potrjevanjem datoteke '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (neveljavni nabor znakov)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Napaka med potrjevanjem opisovalca datoteke: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Neveljavna vrsta atributa (pričakovan uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Neveljavna vrsta atributa (pričakovan uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Neveljavna vrsta atributa (pričakovan bitni niz)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Ni mogoče določiti dovoljenj simbolnih povezav" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Napaka med določanjem dovoljenj: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Napaka med določanjem lastnika: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "Simbolna povezava ne sme biti določena kot NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Napaka med določanjem simbolne povezave: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Napaka med določevanjem simbolne povezave; datoteka ni simbolna povezava" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Napaka med določanjem sprememb ali časa dostopa: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux atribut ne sme biti določena kot NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Napaka nastavitve vsebine SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "Na tem sistemu SELinux ni omogočen" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Določanje atributa %s ni podprto" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Napaka med branjem iz datoteke: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Napaka med iskanjem v datoteki: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Napaka med zapiranjem datoteke: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Ni mogoče najti privzete krajevne datoteke nadzora" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Napaka med pisanjem v datoteko: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Napaka med odstranjevanjem stare varnostne povezave: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Napaka med ustvarjanjem varnostne kopije: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Napaka med preimenovanjem začasne datoteke: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Napaka med obrezovanjem datoteke: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Napaka med odpiranjem datoteke '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Ciljna datoteka je mapa" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Ciljna datoteka ni običajna datoteka" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Datoteka je bila zunanje spremenjena" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Napaka med odstranjevanjem datoteke: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Privzet neveljaven GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Neveljavna zahteva iskanja" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ni mogoče razčleniti GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Odvoda pretoka pomnilnika ni mogoče razÅ¡iriti" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Napaka med razÅ¡irjanjem pretoka odvoda pomnilnika" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Količina pomnilnika zahtevana za pisanje je večja kot je razpoložljivi " +"prostor naslova" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Zahtevano iskanje pred začetkom pretoka" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Zahtevano iskanje za koncem pretoka" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "enota ne podpira možnosti \"odklopi\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "enota ne podpira možnosti \"izvrzi\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "enota ne podpira možnosti \"odklopi\" ali \"odklopi_z_dejanjem\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "enota ne podpira možnosti \"izvrzi\" ali \"izvrzi_z_dejanjem\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "enota ne podpira možnosti \"ponovnega priklopa\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "priklop ne podpira ugibanja vsebine vrste" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "priklop ne podpira usklajevanja ugibanja vsebine vrste" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Ime gostitelja '%s' vsebuje '[' vendar ne tudi ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Odvodni pretok ne podpira pisanja" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Izvorni pretok je že zaprt" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Napaka med razreÅ¡evanjem '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Napaka med obratnim razreÅ¡evanjem '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Ni zapisa storitve za '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "začasno ni mogoče razreÅ¡iti '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Napaka med razreÅ¡evanjem '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Neveljaven vtič, ni zagnano" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neveljaven vtič, zaganjanje ni uspelo zaradi: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Vtič je že zaprt" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ustvarjanje GSocet preko fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ni mogoče ustvariti vtiča: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Določen je neznan protokol" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ni mogoče pridobiti krajevnega naslova: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ni mogoče pridobiti oddaljenega naslova: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ni mogoče slediti: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Napaka vezanjem na naslov: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Napaka med sprejemanjem povezave: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Napaka med obrezovanjem:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Povezava v teku" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Napaka med povezovanjem: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ni mogoče pridobiti čakajoče napake: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Napaka med prejemanjem podatkov: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Napaka med poÅ¡iljanjem podatkov: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Napaka med zapiranjem vtiča: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čakanje na stanje vtiča: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Napaka med poÅ¡iljanjem sporočila: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ni podprto na windows sistemih" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Napaka med prejemanjem sporočila: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Neznana napaka med povezovanjem" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Sledilnik je že zaprt" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Dodan vtič je zaprt" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ni mogoče upravljati z različico %d kodiranja GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Pričakovano eno nadzorno sporočilo, prejetih %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Nepričakovana vrsta dodatnih podatkov" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Pričakovan en fd, pridobljenih %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Prejet neveljeven fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Napaka med branjem unix-a: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Napaka med zapiranjem unix-a: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Koren datotečnega sistema" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Napaka med pisanjem na unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstraktni vtič naslova unix domene ni podprt na tem sistemu" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "medija ni mogoče izvreči" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "medij ne prepozna ukaza izvrzi ali izvrzi_z_dejanjem" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Ni mogoče najti programa" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Napaka med zaganjanjem programa: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "naslovi URI niso podprti" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "Spreminjanje asociativnih povezav ni podprto na win32 sistemih" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Ustvarjanje asociativnih povezav ni podprto na win32 sistemih" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Ni dovolj pomnilnika" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Notranja napaka: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Zahteva več vhoda" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Neveljavni stisnjeni podatki" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Neveljavno UTF-8 zaporedje v vhodu" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Dosežena največja dovoljena vrednost podatkov" + +#~ msgid "do not hide entries" +#~ msgstr "ne skrij vnosov" + +#~ msgid "use a long listing format" +#~ msgstr "uporabi zapis v obliki dolgega seznama" + +#~ msgid "[FILE...]" +#~ msgstr "[DATOTEKA ...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Znak '%s' ni veljaven na začetku imena entitete; entiteto začne znak &; v " +#~ "primeru, da znak ne predstavlja entitete, mora biti zapisan kot &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Znak '%s' ni veljaven znotraj imena entitete" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Prazna referenca znaka; vsebovati bi morala Å¡tevilko kot dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Nedokončano nanaÅ¡anje na entiteto" + +#~ msgid "Unfinished character reference" +#~ msgstr "Nedokončano nanaÅ¡anje na znak" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Neveljavno UTF-8 kodirano besedilo - predolgo zaporedje" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Neveljavno UTF-8 kodirano besedilo - ni začetnega znaka" + +#~ msgid "file" +#~ msgstr "datoteka" + +#~ msgid "The file containing the icon" +#~ msgstr "Datoteka, ki vsebuje ikono" + +#~ msgid "name" +#~ msgstr "ime" + +#~ msgid "The name of the icon" +#~ msgstr "Ime ikone" + +#~ msgid "names" +#~ msgstr "imena" + +#~ msgid "An array containing the icon names" +#~ msgstr "Vrsta, ki vsebuje imena ikon" + +#~ msgid "use default fallbacks" +#~ msgstr "uporabi privzete povrnitve" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Ali naj se uporabi povrnitev s skrajÅ¡evanjem imena pri '-' znaku. Prezrta " +#~ "so imena za prvim, če je podanih več imen." + +#~ msgid "File descriptor" +#~ msgstr "Opisnik datoteke" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Opisnik datotek iz katerega naj se bere" + +#~ msgid "Close file descriptor" +#~ msgstr "ZApri opisnik datotek" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Ali naj se zapre opisnik datoteke, ko je pretok končan" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Datotečni opisnik kamor naj se izpiÅ¡e" diff --git a/po/sq.gmo b/po/sq.gmo new file mode 100644 index 0000000000000000000000000000000000000000..5528f30424668ac28018ef6e7a699fabe6210020 GIT binary patch literal 36368 zcmd6wd7K?bb?+Nu;>36ZWAIMfMw%I0BTMpvtdT9tT5O>eOER{R5j}HzW_s?byGR-l zvpo|NmL!A_ATPlXY#ea%Amp(IUI1Z}l_UhRkq3D|!V)0M3nmFK%lCJxs=M!;1)1q$;ljuLN%b zN5L8xgKq#SDtbS7IrtgyeDE=F4S4n?QFJ}H3A_}%2fPNnAG`|uEckTrlxMp97lNv9 z0~mw*K+)9$RnPt43h+0;W#HF9(RpSZMVEosf=Yh}sQO+G@-KRTKO4bEz_);>@{+94 zJHQF>QE(;rL<+eATn*~}0C*nwYXAHJQ1$%*n1GLgTfsYMytNBdyFUxA15bUHtM_K` zChqSARo^4v^S~$22;rUJYVg-U@#V`P|DtoKYy)^bcr7>&ZUf&9z7G5sQ2cuJh~wj1 zJ$?X$wb7?Rx-$9}DE^&B=h4(?IjHvE3M$QgMg6hY2gR8(VfY*a(QHauQ^Ed_G$o)MatcpGY zD&JQ?(S6Ri>xVU<=xc*?Ve|{2`sw2!|Dvz*NBVOvnMKzasQR{pkQ}|j-@gY`zkCB! zzEkORNQAXr zK=s?hpwfQ=RQ_**XMkrSv})%?;91}VsOQ^3)psW-dhP)wHxGc4lTU)8|BE1^5uE{% z!s|R91XbTFLFIcdcsBSM@Eq{Vpy>Lpe|{!PB)NMgD80MJ-|qy)?@3U6x(^inzYaq+Px9n2e!bi;3MD-;OW<4Q^DteD({V;$~z8<&c6oLt|vX))q6Fl zcHIF=o?iw&1AG8fzK?*a_X{Abh|Z=n)`Ocs@%5#k_;)|3{&^G>Uv%?S;0jRm+yL$Z zUj@Dg{B!V_?h$6y_oNAj7lZ2GYe9;No)3!Np9Ljnp8#oU^eumXIm94J(Jn9sUkob$ z{oqC5BcR&#CGcGENigXt;Dw<0F%GJoJHZ%ig6Dxh4J!XTLAB#iP;&9-pwj;nsD67o z%7th~6QKH`2GXSH*Fn+!ZBTr>XoG9tZV=L=888Ol4oWXS2`c?JLGkZ`n;hMnLCMn$ zsQO+6#^75)(e-gq^n4anIgf#eTy)7sCnvXo>fe`vqVrv#!FsQ%svsy}8y@$>cI>EMGP|DyNu=Tz`9@Q1;F2UY)*Haohm z14U;Fs@-n}pA3EqRD1szR6Sn>p9Y?}1=_&NLG?=$RQ<03NfLbkRR8=xQ2c$yR#)F% z@C@$n1trHn1D*|j5$7jH0;6H*fc;0hdd#?vo-z}izZwgepp959jN5JLaXF<{ZJy7k6Ve$xg11Ni$ zg6gLpD0z7&i0DV30Ivk4+@rt>P;~7F#m^Z~>0beg|8D_R@2`NW?~|bD|2i0hKf2T5 z6&|;PlE<3ISA#3Kf0w`iQ}DGxQ_cv_B*+_6I8jc z2SxwyfYP_eK$SakyQA+G@Fwo3!8d^qf$G1Tp6C343|!CsJHgf9-+w}V~q_d%Kv-F&Ch$DadHh3NAjCNR33#;cu^AYC547ewWv{{UYAZhgK>{~$QQ z{kOmk;Mf7zt_(!vqPK#mNc2sRDx+)fMh?KA1TO$DqA=;#v%w3&yFm5VVNiU02Y3cR>xBmI~L6>encsb8s0bUBe6Fd+6UGNIk~tQWfey%totw}aBB7lX?8pvO;v zqUY=2I`H(w@$D8+%cz)#qYBwUB7Mytz1y`KM1P+KLkd*CMU zqG>1RF9cQJYeDh(gWwwQYv3i|g)>fG)`2&3Ujz02-QW%2m%tc|XI;9D9y{RcdH$fk zzdm#Pse-6n^h@9}@SniT!3*Xby*GlAvpTp7{3s~Co?dnB*aSY4`y=3b@QtA8{w(+u z@RXWs&(lHm`$q6-;9a2VX@b{+uLq^4zYVIq@A~^^U`$52-{P_1@r|JR|6|}7_&reN zFKalw5tRHs4?Gua`}Z!I=9GgUi9sgR&z}Y&(8m4N5-l1l5i=gVLwt;5hhK z;1=-Aj+3u_pz66F)cd~$SA*wcG~G_+0R`p40CG;J3MdANZ5t1Babo zef1Hi-_HRh2h-q2@HODI;HN>+cgj(xCo93t+#dzkfFA{~0RJ9T`!1Y!db|Tvd0me` z51!Bc$3XG*FF?ulzkKlf$s&c0zU<+J>LbN z3SRtTN6#uyB)sJbNtx=N^a-Cb>L5dqVIRWv%oKccYuEfo(kUja_0x`0c9@^fU5s~a02`jQ2qPV z|K`T$TS4)AKd5?Y;4{G2ftaA^o&NpV_d2;70eABJPVi#zA#e-$2zVp-~!#fL9}mw;#fxa;3>aD@Av;Dulhya0S1DE|KnD7pDfQ2p}_Q1W%b zeXd>CfYOsWFb3ZQE(bpZUJCvdsP;bbmCjC_4@zFH0;T^i1UG`O1*Knq0E&)_e!}(F zT8}RPM|plPcsls2p!ob@kN*IQj?q^+`fdkRPYWCa-v(X|{w}Eg_&ZQ^Eqk@Ae?9n2 z?q3XU2j2op55574ujjwU_0uje=6)Ky2)qwG8+-s1-R}cc-yebE)AvB}^W4`uTm{D5 zZwHrwHBjaJ45Y+8+-z&?|;K3n)UgzgXmITUd1({M0_svILG&Iab2N@d_=>D zeM4?Y^B%tcFeq6)hwJCLuJn07!uLPq(nmU`&$qdLnroCaKf?8oe18Mi9xi=OvXPv;!3&Bc@8J9WTu5=;8Nu)g+{A)en^DOSaxXnx`m7-Rr@8O>XHy>k7<|3|9^kP5@&xjH zi0?n)?>`JaiR<6|{X-r%lWqgwuK*{&_xk5IfYK*@zQ*;>T(@#v&UFrH-wLkd`YKoW z{89J<-awl0`Iqnoe53#VMQ}e?#&yg;8zawNzCX&f!#{f!_%PS&xX$Dn<9Y$tZCsa= z{(9B~!gU>K{tx(Ou9tGX zjBB3jJ6zx6`cd9r5B>w!Z*e`9`#%7G2z(ldX|d1E-2Xn`e%#;x2e^i3`n-+n*?hka z{5aR2a-HGdjq?2v*Gsrg<$5ibKBw}&0&e9xkMI8zJl*Gc8hDETz5#qc@2=$PaOrbB z&+6bOxGv!Px!^TiKgab^u9#=P2fmo=GQR&WP@fk$h<*|L0@uHCoyPmW1%Hj}$y|?d z{V10{RR=bgxSDj&_4fg4eEIKOKgl)8wVX8DL48*9J$%mf-`~xHuW)VSO1M^W{Vtcr z)}P@DpP%wyronNpPjWT5WP|m&m+NEt!snTk{lCFq=K3zzGOp)weTGY)U*KBJby10) zOZ38jp6GEscnN9l0zb#~cCHz&vr74PbN|C!8@V=f-N*GxE`46e)#6&oHBO!_;Pbik z`AY}U`83Jitbt{fNI=#`p91{z0y%^Ie~q>lu7M0{#itzjJ+_>nS|D z8q{a2PkX1kwZA+0`%Qm;9Q+-w<^KLEj{*L#|FTNu#G_f`a8k=EaoU(_Rgo8Fn;jC_v-_Q3C!Wq~X?MPr>bt{UJUQRx-eD&iS=JeevrgP-cH<;=MNiEp?PRK( zw&Uq$t=2q3Exa39KN9C}CgQ9c*OPh6H<`|4jW}tgh?B+?`E}aywLW z)yPC_Wc>ikuQfYqA9+^8M6AjawK1&}M2H_FH;zQ38*Yo6?Ra#<^RFDgyOPah-A-KZ zb-M9n>N!KM$@zFJ8jFu)-PvZZ8#h~NL;M1NGFyt^gntcx~wI?bufJ)9!By;T==daYKo-KAcV(=k`Ci8gk- z?QF8wOAaoBMCF=p_8OH^Lb|z^=1pld8{@n7@7NLDoJ>`FEfbnJuXQ>>hAPpf zq%qQsr<$$#xRSNgscy49A2$ypBl&GP&G0vBNgDS$VyH`O<+)CQ0SEbpTtfjIc z2$#v86Z=?vYxXtHj**FYcA_?De%9Vy$^X!W{#yYxpr+T=PX#x~Wn28lZA zw?qVVv!qt2uu^&(W?DH-M>l4qwrJwMt>de&J5h?Yr3CGCI&EWc)vWQAS70$KO{!L- z%nV~g;+9D2N;7jKIkbcdw%cW_n9(3>C#`2w&04cD5!aiTms(a;_s%za(iOyqCe|sx zlORiZ>AA@fM;jUnV!Ef(g%xIt8{MosACJdrXDVqyVO~PgiI;OX5p8NVx=Ci{s*Z&~ z3i4LTHt9Vw(2-@DZa3?ts)GQi#_|Y~ndDo16zynl|If5xm0!nDJeZNby>0osLv{r#HnW8s6fE368G7qj2J8b|5uTF!uB}E!YZb5Z~4>>s)nXQLguIGvXnvHbl(xSV!uTSeVr4N$mQRdel2fcPeQBOH&ok_O(oWYo(-|*6 z)N6Jp;^j5{nbDu5)$B|}TU;6c9~t>A4Qvt~7M%l=96O^e?Y24#-pVw{44bX&f81+i zN6U{f*2I=*)MzX&t?qZkAHi5Ymf3Oj;5q3 zf|%Iw)D5?V2_9g6NZCBnNZUh7Fwc!aQZuij4?-@aYJeRJ-dK<4b7-HzcP0KustXor&cL^R zrH@CKb;io+Y?L)AaH2PDW_HnHWk}r&t&oUPt?qRz!)ceRDtC^yDMSDZY*40yP*(5U z4N{ZhkSZF`pGaQz$)y}kqs($C(_$R2Cw}hlx~IkgnrT$_c zZ&6EC>*n5mUb;da*VJs>Ar^&%%qBz`CUIq$6}T@?;5B$PLaEvyg-?DbO}RmJER` zjg!zB!cUq6E+%W3^6VH9JPVM7dYRuTMp9T332v!)q|TlU6sn1gSqDb2Qm^W9TKJB$ z_~Nt=Epwp;MAC)rqOAidDJDdlytip7cxM$7_TQv1aC+rd7xq8h>l&FN)T{9%1BaFy{1+j3q3Qye0YEI-3 zcS?Pgzn8iUeW0N;@WsVcl+2VWJf0=E)t9%LvVbs{DvU4-UdUTy@TL*Orb3yWlWCOa zv_ggL85g2CY$0s<8*=Qlid#(hAeA9YTcoyCXc(qT1nPk z;hMd|MI|gEHl(m#BM(`+P_8d1x8`$q-~JKM;S5T}oJW-c(8tAvk>?$px6 zWZFFI+4(7XNS#M zuMsMf+DwWo7EE?+UNonR9Tl%NO4>S{>a#AxMs%n{>#kw0Wi8)bDM$I$o>FL!b=Vt5 zLg=zDVC)z(u>2RDsIVJLi@NeZWQ5d@Hdc>^keLF7#@Lf64)B- zOELV5H-k-zb_W;96t7U9;<*JlSz$v}~$@11QP(dL3!Q)eIJ z>qPdn|4FmgW@*v)J2VZr&wKj?!dDQ(toHmtg-RozVsRhcCm2$8Ic7T8fPF={51-O@ zE0iCpw8GJe240C51BPuMMg?*5COq_H@c!?xPt>2tYx#;WqgAOP1Ex^E&pwHT3jt21 zsHGIyhp?PpOUs<)wGnP=Wjwl1iyz9TcPeG9Tuga&C>}XbvSmwTRY_(v<53IR*m|M~ zRo^-Y6;XE>i9%bnjBNu3X`O3W8Ui}~Szx*1`OE>|iv??B$u@2kWe>??{kT+eNhG5RB9RmAw(vv)EqkepMNhVnWPG^OC;3A4K})37p*Bw4qW zRVc(FQKclow?as40e`U7;r$9*uGQOof)BOT2Fn_;Bh`g!)xN$qxg8cEX|dK6o_P5( zt4W9V52jFs{t+?7FSMB#{nNx0w6VyzE#qcl-PjB@<^)9hJIPGCF1p=TPclEAUfv?33(ebYPP+UEa#Tsv3*qlPP|VrZwzyv+WiKriSIkDmWA4Hi5u- zwi41jb|CQG>?6F!qb<3`;Uzovj-~CUZ&s97l}m>AV@EfP>SeK)&{i}CEL*Xa&^CJI z@nD!O_mX&@TEQJdYrnmevJ!u`tyf{tjZ_HgK4o!`8jC|+=?#NUC7Mb)>A0<`NJ!m4 z*NI0D)KO!+oAXDD7-Z@a zFY;D~NR1ckaG0|sn$Fjow7}s)y3uTUG^wz`s1CUU^)7rxQ6u-1tO6TK(it-5k?Xum zBL-u-QZsKx)LmPiw?kW?oPc$B>AV1EP6lpW9A$td`6R4apVWRlx!|}8jr54wifLxe zDwZB2R-bnPJ8DN)jpfgMEG&2bWpVP|dp4nnhN)GqKG{+Fh^XWYP6Pacvzmz<*dvM$ zv~uYvy>t4l_oilU&L>@|`lAP&oZgkWG06ue$hP)6$$%Y@D|(ty{!>Q0-9}Yh=>6r97O`g4#S5C1ulA1ycPs%}O8RaPiy*XtxE_ zSCLaV*b{z-Et1@Cyz-s5#7mjfx#0}KY|%`=yO3R*QBH(BMQyFNnUgxF=u8qVSd}jf zm*cpML=yLHQVgE5Gm8-(5F7Au2Vp6*l&C1*iFL4sO-dTACr7h-uO73GkT;k`Y`9~?Y}jsa>6E`y8imwN+iA1GP9YQ?Hmm;o7G^BYPGQbZ8rDk3_H z`RRSsD_k=#ls&eOH!>U%st6O=od2YE&XJ2xm>~%TmAs}r*?<|!pZidXYm3+VU|dLq zSTtuEtj3jQZ29PWqW9}hlwi+d37pf=i4R1Fnd`x##Rj59Uz>G^a)t8JuI_ZxSi}hl zLktzHb>p{uj&WychcSFlyQ#5nd|PGwcDHYsJr;zj;#;?D+Q(DjUw`GQHKg0Yw#o5*=z51(gLc#GNP5~b7;m0sIE~k{n@qRa zO-XH%QL1-zWh3q0NVdjI55IMMAJMmU#9$_qMuzQKKhtQ|)A4XWPFStlotscGQ}4&RJj9iR=dSM}=~<8Azj7jgLRvne85bIBv}Gr;};( z9Tnx(#Pv!1NB0~bkRf#i{%RFdqYyJ$m=#bTUy$Ckj-WRqdq3MtUQH z>1g>BQD2={3svx6tF3kXVa6=VIh-7ut@PMORiB)%)#iv1yOuBzmzv?uN=yV+z@u6^ zr(A)7`B@_lQMkiKZ2FpR6I|=f;u0E8wHf9n#ZA4o~F_En~)=9)Mlnk2GyA68V z=*#0UY4sRl%5cWUSw(IY!~lvxOkT%qG!i!EO-o|#L#(d{+13s70&&MF}fMca5!iE~YN2&tgK zW{rNcX~lTe%%W{bvLvY2j;qam9n7Zm7T5SMmj{P94pzk)9zOmstS^c#H$3kqW6{cRyh&{A zqZjQhWvk(dSm!ETMY3XJtTH9a*6KBo$^`RN?GK?~o%@eM{lE(KN2P|bE$2hljY{w7 zn8VpI>!`(gy_8xiqCU-&miZCnr=3>qNEHG+G+jGO>##@r97!UUvmU1>u~RK%!=9GQ z?$47K8{3wa68jJ)d|Y3&Gk5gIH2Y?~IVqVm1-naG6Z}3lUK&vt-FA@J%KWrcoMNmz zli7YjSS)9&)?ARS#LNatsLcUwW9g97S=+5(6TxXz6q6&@tu#8AfX=1pl?_DEUbEMk z8H(IY$-MX@T1&oP8{L*MM2Z37R2Fv2m8gJE6$7DAHY{F1gfqZ>^)p&AB@)H0ta|)m z?UtR>A)HDRW@>XmBg>VGd1I+n#mTDWXcGTA7$;*EGeZKX408}!jBYw2kajb(>+MV% z?BFXlh6?OlRvbsWi8xeA;%0EJVhEh;s$^Ogm=$d=wq>ADIFu z1Kl*3!Hnu2*fW*D4kHZztJ5^m7coJ)A-;CjoXHn zn@$_z>_nHz%XH7iQajwm$(5?@8Oq|G8|Y;(*;+?mI2VV-VZ_0W7f4YerR>IxpYdV& z1eQoHhabu%I$<1~$iF#>!AH z7t%loeVmnX^U~B&lIB2&^Hr88Zv{3%3?>RmHniK3;<~%a`Z#>(#Fz|B1rbtra%@qF zSx8*jc3VdV*;s-mbD7N^;N_suQuM4co8*4w@If#4u;*AORIX}oI-_Obn3#85Dc0Uv8++^=!__VLhUMYF zrpODN%ZoLewk0swOx=RAl1^XyOQnURp+EMUtL&xT4H7JNzz>~Bn_%t1#trk?ks0Q4 zj8$_90(DY{(lp}8%H>-7_{O@+SUHx3Y4fuL>||n`tH4u)O>AXWg`IKj6qP!5d`$kU z*(ibnyoFdB-8drGtM|;I&iUvWAKj8nGJTnuOH^nsadN{o=-6Q3l2m$Cmiaa5f`a_u zM_=};bCR9Sm8*xBrjp!*qEwczt}lJ=unkFrb(e9J9`j!8z}2>|Zje@k45J!c+?rI=!t zi|QA)z(JcnxjFc7kwYc3y!!`O>dO!YNSFN>GxxT9!Qq0`mlId0kuU(9paR*6N;{qFGC@93($ew3K2y+F zuMe|x0t3-9GaQV+8BHe&LGP+**|V;;=lzUJC!F%`SfsTswb$}IgF3V`TlG;4$;9xk zA&_o%L|s|c$g_A-{Ie5?I-`ZoAOl`Ka;hxL zW}TLnr7bw6w&CQv!Zpb%6}_@`k(-;+Y+U9*6FrltA`sz}pmee^M9z#C+Zecg^ei_Lcr}H|R&D0T zjOvKvP77=1wb+ZIy!@17@rbV5Y?9r~Vn0Grypfn|XNiU)iJjxJu9V0jIyAW|rPh4h z&tKT4&0Z@btW?IaNrGi=X6VzgIh1tP6N8E26TzOL=}(kYryj9Th}~>mJ#FdllI?M| z`|*>As?IM#I{s=erB>ScZp_s4t)}46m1StH01U7 zQzW~gb#Swfh>{THx{b8vM=6WhjGLR7sm6Jg!Lj)_+gn`(Nz$YiFN$DoFlQsq)KD2_R8xwjNtTrbc4k5PVvxGT6%2t&W`v@k$blBm*|%|0=^EmH^AVXIjww{Owv zW+#GMq33Lty3U0S`tHE50rQWPX73eLFjAjhDZn91Y!!4=mQHL-9>4GCmR7CNXIs0u! ze}HuC#Hro#{7EEq2S`sc;dR%Hak`BB6`Rd}GA?^YmfF{sO$O1IOSb8*4!ZJl zObYueK*vTGW7ne14Vyx2MM{fRTG$Ws=Yd?R80MDvJtToQ-VIl;BYQ|P%2}cxhh)G2 z@SBL50oWiQA|jR;X+A!a&G-v5onyKtAM8s|KV7vHW(!tFr)`*}0fghsIXEjM)*z6^8 zXp6B{D>$WVhPOngEbb5<_7m$z85GKGj_U6O{9Uud#RR$R8Xso&Oawtc<5#MdEYVqL{d#dp27H{H6#!P!@KCV7MVW4e zLB{uF3)W95>x8fMlL*uo?P~meK=Ox>yOu6W6(dIf9Dt(n>rBrFl2FycGu-@y~F_N)8SSv<; zkASz-C+^nUv1yti4A>4kEUYzzV#b&>Sf!_eV9c^`%)gYCt>bR~(1>=}S>Y^+?c{J! zB^R9&nc6pJV?fZB5Ihhkb(r|^mteVkmt%Hta5VQ7EB#qvv?kw#(1@xW8n%gnScpWh zxeIFTRB@3iECWhvhOK^6M%wR@&AE*x*f!UtQfB4OJr)b|hJ8?aV_q94K^2Vl{cjx! zxy4|_c4G;Wv`7L%pLMkjqw8{oqs2w=z-@2Ke`Gr(P-lhCKwvmqe$48E3~#F4oG03& z?I_*>#m_0T&Y3(nqvW@k!xo7`*qGV$XJA@6ogA`ZhvB13<2n72Zv_l9DxYfT8+RCa z(pK>D2Ke>iUM`cRS{p-7DlaMJHy#k&Q4rfTxz(YA^#;1rG^yFR7ndv>vW0@NQ%uiEaTD}FX zYx#tsiP7zDGUyIa`$(hC$5%L5LG@}4c1vrf+X>Jt7<_gy;)Wf6sw}t0Zg%PnPch$( zPAa|ep|3Q4K8aCC13bM@tO?|bXlqe8%ZhB-Tz6=46H;R>Tq-ZVE95k|vgJYmMXmYn z-;!VM4^(?EU5XY)cI(B0JnPE7MZ52#xI!q7KRk>dn&0Kc7IjPLv{cu>OEypFkCWAW zBXWbF&}{DhXXQnSJZn*h#>tM0Vmf7ZH8#rGjKK^~o*Y=N1{s?-x;@_vsQETA6JO(E za18ylaZCAdx8-QFyU8y_hwOfVzf_*8UHsJdzyiKlrmKhz!wi!i9}Kp*x?8Xts3SiK z{{0l`0^mc-9XK7n&;Q&`nPqBXzuzM!@~a!}mw8G_{Tzcmmi}FdUyZq@Htl%wi{&sk z6YUR%OWl0D)k^nyF%~;?PDHG6k8Bp?r&VE;aNe_=BeO6*ra>kgPtKBK9xY-a>%%qR zZ_yuix||=0kx6bxdz_J`xOL^q{H)Pbr+o6n;tW=AA;f+(GFo6tmR?oJY;0& z9GGjER1^o!A6GWNQe@}PIe7kk+=!^Hd9o&U9v#bT z3lf=)U!<}9kxAsk+f^gXO?h?Pw!8*?awksAW|X%8n4hD~T^ewWmhw2IA4Ri0;<$)) zPIk9o45kdnUH(thv(3l^%xqgA!dX7Mo>NC&_6)OvV^-sEbEcMDg;cWr(0I4t_&Pm- z{16Uf>eGuf0o3}YR}Am67qQTAh&?zA{iAf$Vcm$_?kSWKy^Aay=i0ztX7(zIE9PK9 zR+um2ck!PLh3(F1Z=PVEui*&$(g(Xyv>V3?uw9@5;qf7;h=;8Q#I*iKldy`Ghzf+BMb>MWB z%7R)%ZhKgoA9wg%_YM0YQIYOkHP4{5b8Tkm~Y*lGxIK}_RTV>}p0Kh0Yhn-y{T z^-kNsCXp>Ue_o~Ln2C10?jXDNLqvU=(N_Xz7^>{NaI>++3QIaOGNjhFZqJZjWzNg& z*|Xo<04l^&w}#0Kz!Et8qI;AIlMm$$c^TdaLjg>xbty6D(*!5@eFsupct{n`bM|S4_;`Vp_=ib z`78c8Zy~Y)m!AVLRR}RtYl>n*gR;KBTsJCgfm8?aYXz7mg{|FDE}Dplndr~X+ptBw zc2>WYNMItraf2}|nRBCj(SnS#i1~)9DC`h}Z8?Ftjdn^FsV`k0+Ex~`WX?$Y^ZROY z=mNydj(IZEe-yt!a_2adz^RaDNM>-R>XIMhEFg9=A1 zonn~e*{G36>WpFKB_R{irG{ImrR^5(^t2Ux, 2003-2008. +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2008-08-18 10:19+0200\n" +"Last-Translator: Laurent Dhima \n" +"Language-Team: albanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atribut i papritur '%s' për elementin '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributi '%s' i elementit '%s' nuk u gjet" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag '%s' i papritur, pritej tag '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag '%s' i papritur në brendësi të '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Nuk u gjet asnjë file i vlefshëm libërshënimesh tek directory e të dhënave" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Një libërshënim për URI '%s' ekziston rregullisht" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nuk u gjet asnjë libërshënim për URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Asnjë përcaktim i llojit të MIME në libërshënimin për URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nuk është përcaktuar asnjë flag privat në libërshënimin për URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nuk është përcaktuar asnjë grup për URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Asnjë aplikativ me emrin '%s' ka regjistruar një libërshënues për '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Zgjerimi i rreshtit exec '%s' me URI '%s' dështoi" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konvertimi nga familja e simboleve '%s' në '%s' nuk suportohet" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "E pamundur hapja e konvertuesit nga '%s' në '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Sekuencë byte e pavlefshme tek të dhënat për konvertim" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Gabim gjatë konvertimit: %s" + +# (pofilter) doublewords: The word 'të' is repeated +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Sekuencë e pjesëshme simbolesh në fund të së dhënave në hyrje" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "I pamundur konvertimi i '%s' në familjen e simboleve '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' nuk është një URI absolute duke përdorur skemën e \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI për file lokal '%s' mund të mos përdorë një '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' është e pasaktë" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Emri i host të URI '%s' është i pasaktë" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' përmban simbole escape të pavlefshëm" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Pozicioni me emër '%s' nuk është një pozicion absolut" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Emër host i pasaktë" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gabim gjatë hapjes së directory '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "I pamundur grumbullimi i %lu bytes për të lexuar file \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" është tepër i madh" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "I pamundur leximi nga file '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "E pamundur hapja e file '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "E pamundur marrja e pronësive të file '%s': fstat() dështoi: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Dështoi hapja e file '%s': fdopen() dështoi: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Ndryshimi i emrit të file nga '%s' në '%s' dështoi: g_rename() dështoi: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Dështoi krijimi i file '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Hapja e file '%s' për shkrim dështoi: fdopen() dështoi: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Shkrimi i file '%s' dështoi: fwrite() dështoi: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Shkrimi i file '%s' dështoi: fwrite() dështoi: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Shkrimi i file '%s' dështoi: fwrite() dështoi: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Mbyllja e file '%s' dështoi: fclose() dështoi: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "E pamundur heqja e file ekzistues '%s': g_unlink() dështoi: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Shabllon '%s' i pavlefshëm, nuk mund të përmbajë një '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Modeli '%s' nuk përmban XXXXXX" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "I pamundur leximi i lidhjes simbolike '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Lidhjet simbolike nuk suportohen" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nuk arrij të hap konvertuesin nga '%s' në '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"I pamundur leximi i të dhënave të papërpunuara tek " +"g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Kanë tepruar të dhëna të pakonvertuara tek buffer i leximit" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanali përfundon me një simbol të pjesëshëm" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"I pamundur leximi i të dhënave të papërpunuara tek g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "E pamundur hapja e file '%s': open() dështoi: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "I pamundur mapimi i file '%s': mmap() dështoi: %s" + +# (pofilter) variables: translation contains variables not in original: %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) endwhitespace: checks whether whitespace at the end of the strings matches +# (pofilter) printf: checks whether printf format strings match +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Gabim tek rreshti %d simboli %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Tekst i kodifikuar UTF-8 i pavlefshëm - '%s' e pavlefshme" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Gabim tek rreshti %d: %s" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +# (pofilter) sentencecount: The number of sentences differ: 1 versus 2 +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"I pamundur analizimi i '%-.*s', duhet të ishte një numër brenda riferimeve " +"të një simboli (p.sh. ê) - ndoshta numri është tepër i madh" + +# (pofilter) endwhitespace: checks whether whitespace at the end of the strings matches +# (pofilter) doublespacing: checks for bad double-spaces by comparing to original +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Simboli nuk mbaron me pikëpresje; ndoshta keni përdorur një simbol ampersand " +"& pa pasur ndërmend fillimin e një entiteti të ri - përdorni & " + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Riferimi '%-.*s' i simbolit nuk kodifikon një simbol të lejuar" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"U gjet një entitet bosh '&;'; entitetet e vlefshme janë: & " < " +"> '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Emri entitetit '%s' nuk njihet" + +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiteti nuk përfundon me pikëpresje; ndoshta keni përdorur një \"e\" " +"komerciale pa dashur të nisni një entity - zëvendësojeni me &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumenti duhet të fillojë me një element (p.sh. )" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' nuk është një simbol i vlefshëm mbas simbolit '<', nuk mund të fillojë " +"me emrin e një elementi" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Simbol tek '%s', pritet një simbol '>' për të mbyllur etiketën e elementit " +"bosh '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Simbol tek '%s', pritet një '=' mbas emrit të atributit '%s' të elementit '%" +"s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Simbol tek '%s', pritet një simbol '>' ose '/' për të përfunduar etiketën e " +"nisjes së elementit '%s', ose në menyrë apsionale një atribut; ka shumë " +"mundësi të keni përdorur një simbol të pavlefshëm tek emri i një atributi" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Simbol tek '%s', pritet simboli i kuotës së hapur mbas shenjës së barazimit " +"për t'i caktuar një vlerë atributit '%s' të elementit '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' nuk është një simbol i vlefshëm për të vazhduar mbylljen e emrit të " +"elementit '%s'; simboli i lejuar është '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elementi '%s' është mbyllur, asnjë element aktualisht është i hapur" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Elementi '%s' është mbyllur, por elementi aktualisht i hapur është '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumenti ishte bosh apo përmbante vetëm hapësira të bardha" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Dokumenti u mbyll papritur, menjëherë pas hapjes së kllapës këndore '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumenti u mbyll papritur me elementë akoma të hapur - '%s' ishte elementi " +"i fundit i hapur" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "Dokumenti u mbyll papritur, pritet simboli i mbylljes për tag-un <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumenti përfundoi papritur në brendësi të emrit të një elementi" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumenti u mbyll papritur në brendësi të emrit të një atributi" + +# (pofilter) endpunc: checks whether punctuation at the end of the strings match +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumenti u mbyll papritur brënda një etikete hapje elementi" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumenti u mbyll papritur mbas shenjës së barazimit që vjen mbas emrit të " +"një atributi; atributi nuk ka vlerë" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumenti u mbyll papritur në brendësi të vlerës së një atributi" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Dokumenti u mbyll papritur në brendësi të tag-ut mbyllës të elementit '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumenti u mbyll papritur në brendësi të një komenti apo instruksioni " +"proçesi" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "objekt i korruptuar" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "gabim i brendshëm ose objekt i korruptuar" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "mbi memorjen" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "u arrit kufiri i backtracking" + +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "modeli përmban elementë të pasuportuar për korrispondimin e pjesëshëm" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "gabim i brendshëm" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"për korrispondimin e pjesëshëm nuk suportohen referimet mbrapsht si kushte" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "u arrit kufiri i ndjekjes" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "u arrit kufiri i hapësirës së punës pën nënstringa boshe" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "kombinim i pavlefshëm i flag të fund'rreshtit" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "gabim i panjohur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ në fund të modelit" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c në fund të modelit" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "simbol i papërshtatshëm mbas \\" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ndryshimet gërma të vogla/mëdha nuk (\\l, \\L, \\u, \\U) lejohen këtu" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "numra jashtë rendit në sasiuesin {}" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "numër tepër i madh në sasiuesin {}" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +# (pofilter) brackets: translation is missing ']' +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "] përfunduese munguese për klasën e simboleve" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "sekuencë escape e pavlefshme në klasën e simboleve" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "interval i parregullt në klasën e simboleve" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "asgjë për tu përsëritur" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) endpunc: checks whether punctuation at the end of the strings match +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +# (pofilter) brackets: translation is missing '(' +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "simbol i panjohur mbas (?" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +# (pofilter) brackets: translation is missing '(' +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "simbol i panjohur mbas (?<" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +# (pofilter) brackets: translation is missing '(' +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "simbol i panjohur mbas (?P" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "klasat e përmendura POSIX suportohen vetëm në brendësi të një klase" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr ") përfunduese mungon" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") pa ( hapje" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ose (?[+-]shifra duhet të ndiqet nga )" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "riferim ndaj një nën-modeli joekzistues" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr ") mungon mbas komentit" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "shprehje e rregullt tepër e gjatë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "rekuperimi i memorjes dështoi" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "kushti lookbehind nuk ka gjatësi të fiksuar" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "numër apo emër i keqformuar mbas (?(" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "grupi kushtëzor përmban më shumë se dy degëzime" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "pritej kushti mbas (?(" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "emër i panjohur klase POSIX" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) acronyms: acronyms should not be translated: POSIX +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "elementët vendosës POSIX nuk suportohen" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "vlera e simbolit në sekuencën \\x{...} është tepër e madhe" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "kusht (?(0) i pavlefshëm" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C e palejuar në kushtin lookbehind" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "thirrja rekursive mund të hyjë në loop pafund" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "mungon përfunduesi në emrin e nën-modelit" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dy nën-modelet e emërtuar kanë të njëjtin emër" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "sekuencë \\P ose \\p e keqformuar" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "emër i panjohur pronësie mbas \\P ose \\p" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "emri i nën-modelit është tepër i gjatë (maksimum 32 simbole)" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "emërtuar tepër nën-modele (maksimum 10,000)" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "vlera tetore është më e madhe se \\377" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "grupi DEFINE përmban më shumë se një degëzim" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "përsëritja e një grupi DEFINE nuk është e lejuar" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "opsione NEWLINE jokoerente" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g nuk ndiqet nga një emër në kllapa ose një numër të ndryshëm nga zero me " +"dëshirë në kllapa" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "përsëritje e papritur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "sasi e tepërt kodi" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "tejkalim kufir gjatë kompilimit të zonës së punës" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "nën-model referues i kontrolluar më parë nuk u gjet" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" +"Gabim gjatë kërkimit të korrispondimeve për shprehjen e rregullt %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Libraria PCRE është kompiluar pa suportin për UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Libraria PCRE është kompiluar pa suportin për pronësitë UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Gabim gjatë kompilimit të shprehjes së rregullt %s tek simboli %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Gabim gjatë optimizimit të shprehjes së rregullt %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "pritej një shifër exadecimale ose '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "pritej një shifër exadecimale" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "mungon '<' në referimin simbolik" + +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "Riferim simbolik i papërfunduar" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referim simbolik me gjatësi zero" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "pritej një shifër" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "referim simbolik i palejuar" + +# (pofilter) startpunc: checks whether punctuation at the beginning of the strings match +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "'\\' në fund e izoluar" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "sekuencë e panjohur escape" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Gabim gjatë analizimit të tekstit zëvendësues \"%s\" tek simboli %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Teksti i kuotuar nuk fillon me shenjën e kuotimit" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Nuk u gjet simboli i kuotimit tek rreshti i komandës apo tek teksti i " +"kuotuar nga shell" + +# (pofilter) puncspacing: checks for bad spacing after punctuation +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teksti përfundoi menjëherë pas një simboli '\\'. (Teksti ishte '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teksti përfundoi përpara se të gjente tekstin e kërkuar për %c. (Teksti " +"ishte '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksti është bosh (ose përmban vetëm hapsira të bardha)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "I pamundur leximi i të dhënave nga proçesi bir" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "I pamundur krijimi i pipe për të komunikuar me proçesin bir (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "I pamundur leximi nga pipe bijë (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "I pamundur ndryshimi i directory në '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "I pamundur ekzekutimi i proçesit bir (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Emër i pasaktë programi: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Vlerë e pasaktë në vektorin e argumentit tek %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Vlerë e pavlefshme në ambient: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directory e pavlefshme pune: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "I pamundur ekzekutimi i programit ndihmues (%s)" + +# (pofilter) doublewords: The word 'të' is repeated +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Gabim i papritur në g_io_channel_win32_poll() gjatë leximit të të dhënave " +"nga një proçes bir" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "I pamundur leximi i të dhënave nga proçesi bir (%s)" + +# (pofilter) doublewords: The word 'të' is repeated +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Gabim i papritur në select() gjatë leximit të të dhënave nga një proçes bir " +"(%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Gabim i papritur në waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "E pamundur kryerja e fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "I pamundur zbatimi i proçesit bir \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"I pamundur ridrejtimi i të dhënave në hyrje apo dalje të proçesit bir (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "E pamundur kryerja e fork për proçesin bir (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Gabim i panjohur gjatë ekzekutimit të proçesit bir \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"I pamundur leximi i një sasie të dhënash të mjaftueshme nga pid pipe bir (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Simboli nuk ekziston në UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Sekuencë e pavlefshme në hyrje për konvertimin" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Simboli nuk ekziston në UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Përdorimi:" + +# (pofilter) acronyms: acronyms should not be translated: OPTION +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPSIONI...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Opcionet e ndihmës:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Shfaq opcionet e ndihmës" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Shfaq të gjithë opcionet e ndihmës" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcionet e programit:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "I pamundur analizimi i vlerës së plotë '%s' për %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Vlera integruese '%s' për %s është jashtë kufirit" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "I pamundur analizimi i vlerës së dyfishtë '%s' për %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Vlera e dyfishtë '%s' për %s është jashtë kufirit" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Gabim gjatë analizimit të opsionit %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Mungojnë argumentë për %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Opcion i panjohur %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Nuk u gjet asnjë file i vlefshëm kyçi tek directory e kërkimit" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nuk është një file i rregullt" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "File është bosh" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Kyçi përmban rreshtin '%s' që nuk është një vlerë çift, grup apo koment kyçi" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Emër i pasaktë grupi: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "File i kyçit nuk fillon me një grup" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Emër i pasaktë kyçi: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "File i kyçit përmban kodifikimin e pasuportuar '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "File i kyçit nuk ka grupin '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "File i kyçit nuk përmban kyçin '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "File i kyçit përmban kyçin '%s' me vlerë '%s' që nuk është në UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "File i kyçit përmban kyçin '%s' që ka një vlerë të painterpretueshme." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "File i kyçit përmban kyçin '%s' që ka një vlerë të painterpretueshme." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"File i kyçit përmban kyçin '%s' në grupin '%s' që ka një vlerë të " +"painterpretueshme." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "File i kyçit nuk ka kyçin '%s' në grupin '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "File i kyçit përmban simbolin escape në fund të rreshtit" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "File i kyçit përmban sekuencën e pavlefshme escape '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vlera '%s' nuk mund të interpretohet si një numër." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Vlera integruese '%s' është jashtë kufirit" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Vlera '%s' nuk mund të interpretohet si një numër float." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Vlera '%s' nuk mund të interpretohet si një boolean." + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Vlerë count tepër e madhe kaluar tek %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Stream është i mbyllur rregullisht" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Operacioni është anulluar" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Sekuencë byte e pavlefshme tek të dhënat për konvertim" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Veprimi nuk suportohet" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Lloj i panjohur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "Lloj file %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "Lloj %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "End-of-stream i parakohshëm papritur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Paemër" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "File .desktop nuk specifikon fushën Exec" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "E pamundur gjetja e terminalit të kërkuar nga aplikativi" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"E pamundur gjetja e kartelës së përdoruesit për konfigurimin e aplikativëve " +"(%s): %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" +"E pamundur gjetja e kartelës së përdoruesit për konfigurimin MIME (%s): %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "I pamundur krijimi i file .desktop të përdoruesit %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Përcaktimi i personalizuar për %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "njësia nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "njësia nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "njësia nuk suporton shqyrtimin e suporteve" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "njësia nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "njësia nuk suporton nxjerrjen jashtë" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Veprimi nuk suportohet" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Objekti mount i përmbajtur nuk ekziston" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "I pamundur kopjimi mbi directory" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "I pamundur kopjimi i directory mbi directory" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "File objektiv ekziston" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "I pamundur kopjimi rekursiv i directory" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Lidhjet simbolike nuk suportohen" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Gabim gjatë hapjes së file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:2906 +#, fuzzy +msgid "Can't copy special file" +msgstr "I pamundur kopjimi mbi directory" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Dhënë vlerë e pavlefshme lidhje simbolike" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Koshi nuk suportohet" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Emrat e file nuk mund të përmbajnë '%c'" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "Volumi nuk suporton montimin" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Nuk rezulton i regjistruar asnjë aplikativ për të manazhuar këtë file" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumuruesi është mbyllur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Enumuruesi i file prezanton një operacion të papërfunduar" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Enumuruesi i file është rregullisht i mbyllur" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Stream nuk suporton query_info" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Pikëvendosja nuk suportohet në stream" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Ndërprerja nuk suportohet tek stream në hyrje" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Ndërprerja nuk suportohet tek stream" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Stream i input nuk suporton leximin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Stream prezanton një operacion në pritje" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"E pamundur gjetja e llojit të monitorit të paracaktuar për directory lokale" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Emër file i pasaktë %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Gabim gjatë marrjes së informacioneve mbi file të sistemit: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "I pamundur riemërtimi i directory root" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Gabim gjatë ndryshimit të emrit të file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "I pamundur riemërtimi i file, emër ekzistues file" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Emër i pavlefshëm file" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Gabim gjatë hapjes së file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "E pamundur hapja e directory" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Gabim gjatë fshirjes së file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Gabim gjatë hedhjes në kosh të file: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "I pamundur krijimi i directory koshit \"%s\": %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "E pamundur gjetja e directory së sipërme për koshin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "I pamundur krijimi apo gjetja e directory të koshit" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "I pamundur krijimi i një file me informacionet e hedhjes në kosh: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "E pamundur hedhja në kosh e file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Gabim gjatë krijimit të directory: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "I pamundur leximi i lidhjes simbolike '%s': %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Gabim gjatë krijimit të lidhjes simbolike: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Gabim gjatë lëvizjes së file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "E pamundur lëvizja e directory mbi directory" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Krijimi i file backup dështoi" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Gabim gjatë heqjes së file objektiv: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Lëvizja midis objekteve mount nuk suportohet" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Vlera e atributit duhet të jetë jo-NULL" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Lloj i pasaktë atributi (pritej string)" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Emër i pavlefshëm atributi të zgjeruar" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Gabim gjatë caktimit të atributit të zgjeruar '%s': %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "E pamundur kryerja e stat të file '%s': %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (kodifikim i pavlefshëm)" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Gabim gjatë kryerjes së stat të përshkruesit të file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Lloj i pasaktë atributi (pritej uint32)" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Lloj i pasaktë atributi (pritej uint64)" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Lloj i pasaktë atributi (pritej byte string)" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Gabim gjatë caktimit të së drejtave: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Gabim gjatë caktimit të së drejtave: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Gabim gjatë caktimit të pronarit: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink duhet të jetë jo-NULL" + +# (pofilter) variables: translation contains variables not in original: %d +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Gabim gjatë caktimit të symlink: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Gabim gjatë caktimit të symlink: file nuk është një lidhje simbolike" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Gabim gjatë caktimit të së drejtave: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Konteksti SELinux duhet të jetë non-NULL" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Gabim gjatë përcaktimit të kontekstit SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nuk është aktivizuar në këtë sistem" + +# (pofilter) variables: do not translate: %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Caktimi i atributit %s nuk suportohet" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Gabim gjatë leximit nga file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Gabim gjatë pikëvendosjes në brendësi të file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Gabim gjatë mbylljes së file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "E pamundur gjetja e llojit të monitorit të paracaktuar për file lokalë" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Gabim gjatë shkrimit tek file: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Gabim gjatë heqjes së lidhjes së vjetër të backup: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Gabim gjatë krijimit të kopjes së backup: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Gabim gjatë riemërtimit të përkohshëm të file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Gabim gjatë ndarjes së file: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Gabim gjatë hapjes së file '%s': %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "File objektiv është një directory" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "File objektiv nuk është një file i rregullt" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "File është ndryshuar nga jashtë" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Gabim gjatë fshirjes së file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Dhënë GSeekType i pavlefshëm" + +# (pofilter) variables: translation contains variables not in original: %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) printf: checks whether printf format strings match +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Kërkesë pikëvendosje e pavlefshme" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "E pamundur ndërprerja e GMemoryInputStream" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Stream output memorje të papërmasueshme" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Ripërmasimi i stream të output të memories dështoi" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "objekti mount nuk suporton zmontimin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "objekti mount nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "objekti mount nuk suporton zmontimin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "objekti mount nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "objekti mount nuk suporton rimontimin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "objekti mount nuk suporton mbivendosjen e llojit të përmbajtjes" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"objekti mount nuk suporton mbivendosjen sinkrone të llojit të përmbajtjes" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Stream i output nuk suporton shkrimin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Stream burues është i mbyllur" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Gabim gjatë fshirjes së file: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gsocket.c:292 +#, fuzzy +msgid "Socket is already closed" +msgstr "Stream burues është i mbyllur" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Gabim gjatë leximit nga file: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "I pamundur krijimi i directory koshit \"%s\": %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Gabim gjatë shkrimit tek file: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Gabim gjatë konvertimit: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Gabim gjatë ndarjes së file: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Gabim gjatë hapjes së file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "E pamundur hedhja në kosh e file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Gabim gjatë fshirjes së file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Gabim gjatë hapjes së file: %s" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Gabim gjatë mbylljes së file: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Gabim gjatë hapjes së file: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gsocket.c:2745 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "ndryshimi i shoqërimeve nuk suportohet në win32" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Gabim gjatë fshirjes së file: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +#, fuzzy +msgid "Unknown error on connect" +msgstr "gabim i panjohur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gsocketlistener.c:192 +#, fuzzy +msgid "Listener is already closed" +msgstr "Stream është i mbyllur rregullisht" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gunixconnection.c:164 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "End-of-stream i parakohshëm papritur" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Gabim gjatë leximit nga unix: %s" + +# (pofilter) variables: translation contains variables not in original: %d +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) printf: checks whether printf format strings match +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Gabim duke mbyllur unix: %s" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "File rrënjë i sistemit" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Gabim gjatë shkrimit në unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volumi nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volumi nuk suporton nxjerrjen jashtë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "E pamundur gjetja e aplikativit" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Gabim gjatë nisjes së aplikativit: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI nuk suportohen" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "ndryshimi i shoqërimeve nuk suportohet në win32" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Krijimi i shoqërimeve nuk suportohet në win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "mbi memorjen" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "gabim i brendshëm" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Emër host i pasaktë" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Sekuencë e pavlefshme në hyrje për konvertimin" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "Reached maximum data array limit" +#~ msgstr "U arrit kufiri maksimum i array të së dhënave" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "do not hide entries" +#~ msgstr "mos fshih zërat" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "use a long listing format" +#~ msgstr "përdor një format liste të gjatë" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) acronyms: acronyms should not be translated: FILE +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Simboli '%s' nuk vlen si fillues i emrit të një entiteti; simboli & " +#~ "fillon një entitet; nëse ky simbol nuk do të jetë fillimi i një entiteti, " +#~ "përdore si &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Simboli '%s' nuk është i vlefshëm brenda emrit të një entiteti" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Simbol bosh, duhet të përmbajë një vlerë numerike, si dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Riferim entiteti i papërfunduar" + +#~ msgid "Unfinished character reference" +#~ msgstr "Referim i papërfunduar i simbolit" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Tekst i kodifikuar UTF-8 i pavlefshëm - sekuencë tepër e gjatë" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Tekst i kodifikuar UTF-8 i pavlefshëm - nuk është një simbol nisje" + +#~ msgid "file" +#~ msgstr "file" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "The file containing the icon" +#~ msgstr "File që përmban ikonën" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "name" +#~ msgstr "emri" + +# (pofilter) variables: translation contains variables not in original: %s +# (pofilter) simplecaps: checks the capitalisation of two strings isn't wildly different +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) printf: checks whether printf format strings match +#~ msgid "The name of the icon" +#~ msgstr "Emri i ikonës" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "names" +#~ msgstr "emrat" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "An array containing the icon names" +#~ msgstr "Një array me emrat e ikonave" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "use default fallbacks" +#~ msgstr "përdor alternativat e paracaktuara" + +# (pofilter) untranslated: checks whether a string has been translated at all +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Tregon nëse duhen përdorur ikonat alternative të paracaktuara gjetur duke " +#~ "shkurtuar emrin tek simbolet '-'. Shpërfill emrat mbas emrit të parë në " +#~ "rast se jepen më shumë se një." + +# (pofilter) variables: translation contains variables not in original: %s, %s +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) singlequoting: checks whether singlequoting is consistent between the two strings +# (pofilter) printf: checks whether printf format strings match +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Gabim gjatë kryerjes së stat të përshkruesit të file: %s" diff --git a/po/sr.gmo b/po/sr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..de0ea8fcbf33b0417e1dbd68f4a997b16c8a81b9 GIT binary patch literal 56690 zcmd^|37A|}nfI?d;))xx$rT7mARQ9ckc1^bfXEUcK@@_ay1Tklrn{@@>Lv+@?5m0p zLBlSH>$n6+O9m3eaUIw05l0yMQaf23P^V1?~bKvQHH42`&X^f^|^s-U{vuegZrO zd>niYxbw6qIuo1?z6!h&+#kFZoB@6TjKN=nyMZsG5}Jzk2i4wEaA&Xv9td6r9u95- zUl0BoJQ#fW^e8$2Tnwt+5%3`JouJx#44e!83hV%1N8>7gGN|_628zD-gE2S?s(*hE ziY}e-HQF7V1uh05IT`{XA=&`K%IGrzp8)w6J#Rm!^8hgB{B&>;I0W7WZURN`GKdsk z-wG}OuLoy?Uj!)<{V|-!H2zx7mx8*!3RL^=0W09c;PK$@bW(ij0>!rt;C%3_pxS>v zl^+eB2&%p7z_Y+F1l$AWh+iY1`1E1^Q-8k$9tHjdJOn&qP82Nx8{kdgRxk#a^04?h z2)+)y3Y6a72dclH1=Wx5hV$Qnui$(Kh}CnufqHHZsOOe~l0zT(dhl9M{Q4NEa$f;o z4gMUINjwFro?TIb7(4*f^QVDozYmmNT@kL|9`K=n-vUM7Z^HQwFjM9C0VU^!pz2!* zs{MW9I3k=c2ldd(IpMAXqdQ1`2#=(!kFJ-3GIkAQ0LTcG6sZy+L$W*i1@!LvZw)3u<={Y}7s1drtW zNf1+x4w>h6ayBSB-VS0)(H)@b`#dN<{2r8kyn;&Ak263$|29zia}TI~eF=Oe_(xFm zz7XR08to5CudCtwMo{wq3aICP3StV;s~2D+;381^|20t8e-9$EXwQXC?=n#JuK`8R ztso>up99t2pFz=e=n>wJ6`zj$@HL$O4Ak>afvRsN%y|iT5~zN^85G@X!Iyy_ z0L7OFL6v&~6rH~fxHC+W-#HT0^-ge4@H+4n;77q-!7ZTr^Bquhz36E7Lx%_K4EPRE z^lbun27dtV2|fwF9DL0p=l66_{aFC&`Wc|~vV z$&23$!PkSUz}>*>!9BnaftYmkc~E?K5?l^WI~JbOAi@_5?)q4x5 zdOr)Qy?+JO|K}`rdgg-i$8QA1r%S-Sz}rCaYbz-E{tnz7+@HpD|3pyySq-ZGD?rKX zgP`ag1#unGPeD{8+VupN?^)o!oL>N{-aA3H`yFr>@ZUl4|HX7p@;emV30wk7&gX#Y z$0eZpc{g|}_$zQDxL^r9(K#skdf(u92{?`O_kq&et)TeuB)A{A&q?lwmx4OK3dA)> z8$sFE4?*?o58(dbzBC?#XMn1=0g6Ajg5uAo!B>Od14aLDKt%2ghJ3+PkelP~V03HSY1e^`-d%D}jnV{(I z1EtTGfTH_$Q0;65rC&b=_1rFJxE`Je&f)xgP<*}@l)S$IiZ8zgC7%~8bA37xgyiUS z5EF>*0Y&eRK|Qwv#v*;20jm9_pq@V;RDE}VJAtF%>%cF8F9v@Cs=nWYF8~ia)A@fC z_E~x$wfH8OjsCGUDs{YS|F9rVv zl%M%6cnJ8?H@n=A19g1>RQY#;dj6xJ=y((qKff2w{~J`f*PQM39t27b$AHq8D!4Ov zJt+R)3(f$)4oW|s1XcbO=Xkw`fGU3$_-e2Y$}e06%HBQ&s(;@G4+sAUik<^jIGzs5 zA2vYA<9<-({uz|KcRAOe-yc+cCxJ0|J}7>!2X_PC4;~0^0afldpy+z_TU>q}p!&BQ z+#Os8O26L=z6^X6lwN!Td@cCwl}^`gp!ECAp!jeVD7rog?g2gqs{9W?(eodm+I`-6 z-rgSIo}3>8#$ac_D+1mJzAnN(!9&3xh4bAip6|>Db-x!p=2=m6H7Gj%w$t_f-vj2fUpdL0nSwLr`=cTqj2WuLjl5Qy?Z3tr&Fvd>TB4^IwAdgR{?f{+$iNqUb8{ zmB{Uv;55#k8lvyuv z>d{vN&Rl~Ha()fSzvw^s@7-XXPKchT!27`JI(#X(`L}?uAo@nY zBi;s&IsZ8LKj4gu-M>wLyZ5&XoXhnaz$3xOz{TKG;9=n6OWZy$2KVKBBPc!o4!9hQ zE_HsN3C`m5!yu{@Jq|7a7hLA$)_~HNuYoG}s>|K37J;I_GvKGdV>$mbcpP{%$|}09 z0*?Ye4~pLBUg>s!Xu!9EdhRZ;8+-yh6+Gc8$M=FqaQk-B0q0yBMQ;JugC~H$1DAk@U+4Y30)$1;cR|tprt8VAzztv( z`~xVxKl>f-H#dT!`xl_WTnIh|?gcKq&HJ|!Je~9V!2Q4{!NuU~Z}+&; z3!cLHmEfV^-vxZ(9nQz2LD})m;6C6F!2`kP-RX4A14ZY1!MB2c24x?;cR6kexYONk z7d_xH+`ku`3;q~90NnZgPTvWjWA z9r$6lyR~2!=UYJ8L;MlfgH>P$=br<`*WZC}24{TK_55;BeEbpkMsVkkxj!BNS8{$E zI34^GcqX{lUj;u4p3V6;LG^FHkGmh~1to_~;1S@ipYXW%CJ>d3ZUXlOr+w1>*vX*! zF#^s59|5ld{{W(T(S@I){IkfLHb&7uaDMpxF8^0O;QDnqDEn9es{c2ElKUUQW5G8( z=>50>T*UdWLCJg0Chun_D1O`kR=}Tu2ZC=Hb-#BpsD5k#j|Tq)>i&XH2R?z)o7+HL z{|c!7{RI@?_Ib$1bteZL1P|l-&7kP`8Yq4EAMhA(-e%9YF9J{J{9~Z#{xkSq@W{XR z@!z*W$@#R0T`n6y(eZ0ga(mq){`}j)lQ|y)&j$C{;{93+F6aCqQ13LXmX@Tgxu3RM5z4$cEV2rdJE0ImQJ{0wui;Jd+#z?~j*|MxDioAY0RDu4QC z-7kDF;4i>8aQ%S4ad}<{Uds8Wzy>(yb8dI{f#TCYfTx0ceBSxc2TG2cz!~66zu@|D z70FMW^g0Bak`?t)sf%}4@<33RG_%3)oIPEL$KQ@BbasFSR+P&hd?*G3J zs=ogQMgK8hbA323;Jx79T>lXmgFAfP`#lq!!THJHao`9jeR?=tfAKe5KMw(=x95Tj zz#G9gfL{Y8_np7#{^L||H_qP%9t~~)CCBf9`+*%}o(H}OJeKp1fNJ+w;1Y1|xW}oB zK(+S>I34^osQ$g?@4Ve}!Gk&f2>3?upFq)Z@V6XSgVN)B!85_XfJ5N2$DPhEg6hW~ z!1>^uZ@c}j26y57qhJI49M}mS_V+H=+rUFO{|PAm@BSU{$1r#p=bOQ!!QXwQlKgzeCaD0H{PVV0m?p(+BSMdE|4$;0Z$4Okf0(_FAi{miPKMv}1Hs29rbTkNA z(Z%3J9I(hf(jR?(%JEwJhK_SzpPAqSa3>JaL>=H-@H}u&4t->o`drKThH&kz0d;*E z$EP_Y_fK$~%Dvk-cHnp+hxAmRqx7AlheMx-IF8`^8^J-2SMz;FxHp&cPjS4M<93dJ z(*6H*)2)qycvz?&}oG%IYE(v%5_fF;5jq?|U zatUnZ%l#ZL(O%ftOY@cmsJ$>)5&%;$JE_iyD`!S~mOvTp)c zhwmyc+rNP0@^DSIsL!z+z4pz=5Bj<$lzCyez8t)j<0+1ja7}PEZYCaOm?vj-&O3&lx=PdXCrd{UVOVx)?qm z1_?t^mHTf4Z{m<|S3Y$Y$ItoxHyrx>*dcl&*PqMxI=BveH>l5Rz@LG0!}&sR0mlU# zk8}Np9LMv$8@!X_Ob$7qSseeV?|l0C9&=p7_dUR!IrP~Zl&{lgE#IF5zMbR1aQ_`3 zVa7h|`F}a*ZwdG21=P)9jt}VzpAoJv=6GqiemU0}y@gE$sIC?mq z$Dz+FIgX_4?xFn2oX-j0-@*6Ka$Luu&#yVI;@&+j>9=F<60+pB8NU}IKIenHOER0ecs{_T^ODZrv}q=CpU!e zFDjM$64!U<=q+7e!nHqg%;x%g!9I>3aOm?p2b-V$Nci3l{ujq@IgSZ+tq8c0YyZO0 z;QUn_f5mrwcH%fIl(7r^cQD8E!^utD+n?iljw?9c#PwY{9trmaJBIHs;C>g!S2*7% zT-%lNGs5?efiLHHHpfu7_Jx3gKFSV+^K1D291eYc#PKSQ&vU$<;~zQn>EJk&NkLP#+$8$N~1>DS0<=BPu+ram6oXPihar`yk&*Hd{qsF1n`#H97oW}h(bG()B zt2zF{@ixx)2bXcI1e_XFR@aRA31oIl9% z9*(zjemaLf-*<>U3BHqSuM6kj24`{{!?BF(Ujt9!(C2Q4Xb12d?mYnR#&Iy;mvSVZ zyTX?m*FMMh*MXOV3w1r7Q5(3R(pT$_s{>v2?%F`_%xK!|xjpgXV;oNicv8Sq0-hFd zIoODMYJJt=b%RxXH=I7LF+Hv|;(_{bT#3Dfu2q$xO4o38DDJ8E_0`wV826?xoF1ol z7R0sTxWBT_p6jgk)&}CrKwRys_E!gng)Uy$zZ! zbf{YCUKdx_)*8cΞZlSaOO-25M{L?s|U(DKzR`tE-5zyL+hGXjEOWjgi5@`p__K z)(7Y^-D|9C3|IT3Mcv(849{@6OML2%7WLOh5M#Y3?yvUOht|bI)$>PcLlhmZ$Ad%l zE~+-xtr@BfSH-Tr%1|%*GQ0{cs9aE~^;J6i;H*;-HwG(R)o9V+U|+4PGF*d*rGtXT z{Af{w)@y#Ti|*N7DPw_VRPdk!qea8RL$%HkS~T^5yhP#bTu=2tIP|9lQRtCs%KCx& zK*yk}$e>w6oVMBn*>wKc%E0vDxT`+6F7Bq!UBhBP{Q`QIp61K6ztb43 z(z8BmC3!+Uti~e^YCC1gDT`@lpr_V5GUWZn+`73ltuddY#Uqs*2e<9X?rLN8a6R-m zt-HI9T@O{(Am2)NjP~@dtkqXyHfvE$!$Ttj_?T*Z z!YSsumJAGz3@;l-m;0k*U9n>#TYqhULJjGBMXjsTSpZPU5CP3I_h2Lgy>i`nb2R>$o9h_~JK;Fv9z<0rjW!}8E+h;3OzHwl2ciFsMz;L%34 zA6x0G4=jlL>x7uT+G?rFy84Lx45mjH`{7yxgUf19!;Y9fpnO8Uy)g_cERqil*M`@{ z9dWhMRT+fBw1!F}-j}ll(Xn;BM3?z%xJXp!Rm9QdVFHmV^eB>bR$)u`6Z`EMs`uw8 zN>oRLn2r!v)Ymi;@a#yR_g^vF#5}EUgg`1$@|3wT*+IP5w8mb!;$~PuZ&5I7*qR7U zZ9`Fa&BStO@2=w9Fc|bO=<{)lk6&`?;<$IHPI#d~v4YTFACjj-67_*<+=()Et%{Dz zyJY05sAD0cXI;E_ZM6$iuJ(0D$JM(=EU7|DNONSMx|X6zj~Ntjm` zw(XIQB&!;(^v<5jqhh9IK`~F5RFlTdt4$=0w<^JNkx0_=<#-L05rJD$Mg~1032RnK zbrY87c{RD9ltm`#5PC3N>+5q8I^34lV7Ka9Uj-tQE{R4mo(VcNi)7Q)&D=xPRKb$z zV%HKELJQ*C!fA~Ij?C%}sjo%}Mknk^NSINb-8(y8sD$^(nb{K}x7t653qs+79ijd8 z0kj@AVeghw9@i$W#Cf+JEe^vHvv}3)Y3{6;T+*0AfW<)%Q@2Sip$-3ILT~###*`~t ztR-4(GXXUOvh7Kani`rMsZxP;kGJ6)%osG<9*K`sShuR_wCbvz51^*SZ^$d z7JD847y14`ktG^QPz&CA^+0{i03_qI$ZC-u*Tb-4@z4Omi_JK@`8yX?yFNcN)dgsTHH=EF+OXMZtA_2uHRhnZCeQ;f? z+i5P9yV*UWoLPMg;VyTtw>oUqsvABM!|HqLxe|R9(wJ4MAeTAk?)O(#>n7PxXPrS6 zL4RO%{&xL>7HlF+DV>j}c^&|!-Oq02YDs)&+C4Le76mNi%2e9i%UxEcC(`OR0L)me z(4CN6ZYI5_e4!-z!o8B1$(*Y-V?=jlxRN6xyU|a|Qt8d>(hzB5E9Rxw8KcEPA4*&= z6ltO}R7-}1_?x?dEhYUgP#Uf?T4xAfVJO;EaiiX61iP;?8zU3TT`bfmZLD^*Er5?Q z&B9fe8fpX|U*ctQxtWvXbEf6X7N1-j7+Gs>yt;NcM@>?KtDfCt*-A;9l9K&Qef1=h z2*H_XE~3_-mtj&GPgEUh(Ozy0(c*3xQcQG5tjT80!UMr+G&IZ6LX_mzsnM4;yl{^} zRM${#5Z{?2ftj9$`Gb;F!g!}ed!9{@w++_N(_WI}-Vvs06wsBZD`}lZ_+dQ9V8?tx z>i7K7{>respq5YOX!GK-=>FP;ZJTO(AaMml)xkdIhb+AuMinf1&j{-q$v?@2lUg8e zFEK(>QQ=PJ1~lT(MU$6Q3MEX25KP6H!B+8ty(>osWXv;WGO9(kToN;q)Tfe8GAPXt z6AnJi4~5joT+{HOdLOf9=2d3Jy$oNbb?3?`|L^Jc%)@W)7#(jds!K>h!%V&vU2Z&M zT4QFuoMm8Xr{>2!7GaCj=c-j0qg^R&YFACS2WyP;)IX*AuuwB~^vV)8^Z>7y%>0$8 zsWMp6q+GF(Mqp*STbFE8-KuIIcIpGmN`G@zgBs7OMh|KxT_ZM`FU>KGZmllYVAqN? zmne~+PCXK{4Lx}l_Q+=2alF40rrMm{{hYTeY8huL8WTWJWyIR8yHk78G&U1zvD$5| zYNBR+t|nxCvy_c@t%@5=VWT0dDok>9lIAjEv}x~jG?N?WXY(O5_TBrygAQKc!>qN; zD)d!nGUtHUS5*dmyb@~B@V@S|%sH_t_{WMzKB6xObBe{vT47aI2kIletD0*jZ#OF` z>4`lPCNs=VWJztyq_Qqa%xcjPt&r5UGFT?!ZDLxZ9A>vPM5<|;OB!0>K{FASv8NQs z)3}EAGTW%Vub>M>9 zP<=p#QY_&M7h$oZm-U^2w0~L8Z|#r zOEwYsw0_D+vyA5AlBIbNI_>heGmrUlqUfC%xk|$bcYmbSXnb`DMP!nCb_*KPO0#Ng z=fN{k(bJxn;l-+V5K(1SU_t6vwS|&=F(eK zHZqVdcDOf_78GTZh7rrPGNEL(6-y-Cp6otS%Za!}X@VtdLq31&C8Lw8J;S#C&197? z3I@-k$}FGh9O+^4D>|8R7*owQ8CVLZr&RjL#91`u8ATaS=QPYxpw-H2locU@cTx-b zJzQU1Wo2c?wCd%yyYqKYlbt-SwY|s}Klf)}TM5%`*NZRxeoubuA#Fjb< zjj3=Ar)UAVvpT#+>9H-1m6x|pt-=LcEAp^=YCX110@|qKYfZ)_o3d`XLnPvf+Xno_u9LGx!R(;h_g)~awg?ROuq8MuG9I)i@Q=xD`_uB2wN{Kl}`s?+%^SeL4u(a zV#*cH_O*zF!J*m(Hb(7Z^+1lLQ(Ut3HScrVC)rAIL5;Ol=Je`A-hM)w@lD+CV$}m? zt5*nu=CDh0`K(SQeYSN(M4ATTdR3AEpjc=VCxKmZu{J#LWY`LYE4C%VK73!D~S}2Fx#GC&4R=cd#-4n2C52 zW`>nHEwzyJYL8XxRn#@BP(Z@6ti|29G$~6O#hY@MqNT|=qL`=WuG{hx>%VNcApKeD z1GwNvE@Z6Ao{3HKG*Lq9wx$$<$P^z;OD|ov zocZ?{tYL zWbz4He4AkiK$4%?j>#}O!>0PpRk&^UbaTzJMlM4|mq#5TZU+0v|b^B%LLKu8Eku!#;@!gS{wcHn7DQ)I461bUW*8T3r+n6Xu~Nwb7# z*{b>)?O=>GT^3eV8h*8S#rFk5Oey{@tB(xfK7$IjxUcE#YPnV8S2`37tebFN*W;)&Ou1Su< zLz3kWU9;mE%eA_$=X6gE&CFMm-+mBJUy*ai6FjP#Y$79`p*ZRD1g52hg?1XE?If-z z<+Odutc|ih6v;&~1e1RR$%Mj9*G(*ViB8y~d1N&+VkwkNb1#M6z2ZifcGlUmx?n8O zuvT*gH1F#|cvLl-3`rAnjX zTtqqo$mVD?J-O18W@gOH39(1cHa6ODtw%d_CwN|>XjeS&!UI8f1iQ;-duD0`w%ZnW zWA4aO>ZW_P)Fmq>S(~7Q0<&C=jfqR;Y|km#V}(hr*u|WVrO_2;1kiS+hf&sgi)T#J zCMqtQVVr}~rbOF}z`An1D5|y`_TdD=PHM|0vi-bG57e1mW6x*i%`C69W^!es9(S@=MAN4=*b=wkl1EjbhC3%iGH z%l67avI+D}V?oKw2X|V=Cnw0SDbb~rGV2GTC2aS>&8a-@6Wy)qSW~GD57xS=#3tl( zMUn)UmTZq(x!1}4S+=7|chkAKJhe8+AT=PTW6zZ`GZct zOEv`&owM|`7H8zy3S^nmh^Z_b+BWMX(TP+E4yw!MI{Vl>plOr} zfxbKHs<27Lmcu0yPcE44SG1R_Z50(~}fX8PwZs=$u0GUSV%JwEa5>!gVfjk=jn(YE{YfU>G-_=)do zhSG|y)KF_>wlvnRPWkx6a2OEQDsAhxxqu1o)(4|7Jx{tU)`cmSRn@hXZeFJ8M9@BQx~6gvi5Gf5jD8!*`>Si(y345mc*XU zPt^O_#pt6`BEvv+jrrLg=C)KVTFK;7s%E?;He=4r^m>@nPiN-kt<$#=EX9gixsKFD z)YhVhEa&u+jKVJrPlNOor-|YfgQ*4N?j@6|L+(m^Iz;}!-m^g8^yVLAv|wOT0!y^5 z=!z>Wbfiy)w8#AF%$8TrHGf;~VN!4MJhY2|kxeWE9Ozo0m4vX`mvUeP4?#St%B z()0@@6IJf*L*OTSr8wvXj1>FcDsk9v%$s9$gLE^z^1&N6QA&gc_j-?YheX4?Evri+pD#F1$Gs;(Z8f5ji)n+A=_arHt&OtbRAyB$_EdnbBWaTk9X` zk6Cn1JIwB}ut~9bo=PLT#H`Xt#}51ca`0~%!_^s5Nni5KOM_^gP%?MUtT}UVaSEC~ zXP9+BYZ5S8L^L!%ulvzRHW+XgaYb+1kf72;GC!2^pSzxH`?O>>+n?UBAw_mpT>MP0 zhZ$7wOYmrkun!1KNh8S7>q<(;4?-D5yeD%waVman^MgV4?eBrblOl|`A5f+?v6M5tDf`Y182|M z@roj^ycq-Vrv7cPwYu)BJc@b*Qt3 z%UakwQ17oEEiYB?o?Rd6J#t5_+GRbQJA2NK$GY3@&O%#MKGiKI=0nGvZl81+^4xs zCqp@8Hh#_6C}lPm=-NEKLDfu&jIC7mP$1#}qoUNqq*;}cmLx5Sm6dHjlK>}HiV z(b9IgIj^uR`Hj)o2HK@fIj3u-*0KxdULZp1OGiGV#>_0o9>gz=<-h!fQ*^|=iC??=9g|4>(AU6H6` z>)1omQKYU*+(SUI{Z54SRWe3UI9zIeME7wP_84N+^Qb9&y_B9<6LM`5gXu=ukET?> zQWt@wwng+BkG4oGa^tvNiH>j7q#}u%rTVsI#?X{IT|FeTHVr6n$g4lidYmIcQ#Qhx zt$C%gz#)BariaerL?J@a3r`b|Ux^4WQ%z9yh-#6Bh(hcBWjvrevM4U!fic`Mc1zGd zIDf5Gq`0>+Su%L$TQz0h{>FmIhk!~Kt^3kb8H&1wnOuuLPHVJcS)!X#gTybIGsQib zdKM?&Nt%j3-O+*{+f!xuVUHHINv39nK~Gbc(XuxZJ!wgJqB6*7?)UeVohQw#0|72Zhb+OS#_ zw@gNG@p3K?qh-pFzGnDy9`+=9TrF0 zc+?gRUrkGl2GcCn0$Q1XsZ=hed!iL09F;zxF4EQ8kwlsWp?DJb{oMBqME#+takVAC z&{Q58g=5mc7Qb>cM&1|jaV9@i{h<$TXj?IhD=wA97bmlvLzaOpH;w6jq)0% zk~0BXw58To-FJDB*;J_K8bxHbPurA&66|xe>J%eyhhO zH(aZHyku^`$R-m}_a0WNb`P~=0~vgWe1tbHYtcg@%Y2HdcW`ERs{>S{kyu)gI3@+8 zVmfbXquwT2Txvymw~;ba_LHZil_gNZG9mlllL`G85T^*q`ee#3Z4F!sJt(+rdXtdS zvXRt#s^hW~^O3FknpA^({okz8mIBAb@ki0GWV~-uahAEW)aVsKsrUH5FuAN@To8w; zqRX1Fk`601@{u~5!{vD%Kxoviach1?DEI-pjdPa67pp9bbtNgZuvqWu(zN+#9|KD< zJeV>{%d8M>x980UG)ggr)q}3~mi_4g*CvFUkZa0iYDte|LpGnFjMAEs4$=cC-i(9S zzo!+uI8bB_V=(T$!A_O;Tggs>u?`$SHIQO4XgyvQkYT zY&-Mv&9>*rGhBOV4F62jF2VYAU(oqP6X0H{x!KP|dzofV+Fs7=w@*f>)u?N(D+uRB zt)D!3iBYE!v&G+MyqilK1q|R&jcSzhN5J&WKG-MisBS~NK$@v4Gk@e zQ%b8DzME4vo9X9Forqx}s!&y_nr0%$6$Yo|fM(HU5vtTH^Goi5tcF4tC|Z;b7xK~x z_cy3cu4f^ICb(ek4Y%q)rPXZo>C|av5QwB`0h)f)dI2$u-`K)wXwsY z=(f?w#0v*!q@*Q@6z0@v+A|m>k*Hxb_I?_+j9r~6X^Ik?ZO+((Xg$D{Q_yJa7Abog zJ+jD~h%zq-lbZQ`6wAD-S=B^J;;kpuZgX?8V(IE6jS^R`DoD(ffVlF3pks)jAP>=> zPXzDUcLByt5K}2Cv;6CFR$mk{O&N0K6;>`opX|pQ+y2xToXtI>{0-YMPm}pUA4Nb3 z)9$GF|5JJL1}T+iJGgz```9S0|Bqd-si@=v(D&GCgoA*t6>_zm2Y8LZ~|ukgp;lWWi)w-KO{DI5Fc+z(EI z8cIoWb1iDC;I@otv#)IZWVHFYg!txX^|L)pW;H)z9D>rq07gBF#`67YTTBxG`GU<1 zNb;+PtQ83lxga8XsKHtD#C|i8Q>zrdww&B=)$N2+vhKp@YHC8&5Lt^Hu8fFO`MHZ# znKBnx9xAL&m8IT76e&&Am77#D))XCRdA)1N_K9Xhrowh(m(1AKzFd}5Qs-&i zvt8($G>@mVBn-FEw0z-qR4G@;4T{C2w&G8dns${H_?EA>g|$ATm9-;Cyh^9;u$Y_= zYMNRk__Q{{+|b?8{T-jZe;oGS`j4&7c--hzebV!aZfaTF$NNI^{x1rNP4Rsk8%#1(lk&P z{cW2`#BOmXc*y+5r=~{H?tG(i(BYle7A?q`e+H)`laL$8;#pI@v z+m;gFz+)O>BR%`ieGmLgd|ApPe7CVqyOuO&qRsHjtu49&*L_0|0V(WRd-i3WAV>MfmGR0~<*;3-{EBZ2;jMVoKcPxZFps;t&l$dow9iK%A!;bJv81x@(b zf?WDJ#oD%~67d(~QPzwrkvinY_Wmw)D=}NakOP?;vV|tU5cwnc8RGW{& zm!uA+1uxNOUJgoL>2BtAdcP%a6K<4sNJ539ns-M%iX|?dRt{B zk%KbZtG~^b;6EkYw(4wFdqOMlVE~g6IrrPTE8!Q2pKgOs|M?bPIQeh1k#Hn4&YOz6UN8V_9dxCm@8&CnD4)qb5E87*q?w?56_!r;rH{ISd2H>JbtCz zy~L9nTO~`Kiu?*%78djSXGU$gN4|+$$`gphvH!^OOmy~UcblJf(v7Cjl=(ANN6lJ8 zQgpVx#4Q|8HfIvtSFjEnzggPR(y7Ui(>Q7zn4}_0y;^z4#DYt-^P7`n`R};q&4^GIOfof35b-_rIm$~q^hzH3ehCcF6Ur%6@pp8 z`*<*$v>LQm+K?Ma(H|4_LpevBDZ8mgQ$pa?$ju4^&t0D{xn;)1Y4#?a#j^EBh;#iVPSsoY~u|2%!z!k0DD;|YWnq5EFxJ5Kc z-84~B1d94 z#cZjK$=Xy-oc7JX^W^cuw5c31{WLGi*TOEHOo{Rp;YzdAzR-kOk%mcO?xC29&p_RZ zgYCp1rK|GA2*zLTvI&yhU~IxxFmY4kur-iGY6|V-6S9pnS&weRVb_&y?2!L*{8Z_m zB9~O@p$A)~iN|y`F!h9m%3X>kggi3?@=Z+}WRNod+`9DG7B_$SKWyIYkseDga{6OA zm^>^K)yT?3Bn4^9I;Cthl%H7VlBrs0l$LWad4ElsY*v_sh*a;J)!WDml@}fPsI6ei z=`?jGl*icM6O%+~ByC%?K3)X9SHCw0; zX5J`9m3fl>>*2vA8aQw#g3-RlbW(tCS@)>(Npf8R}JW{bRR zN)5>m$o`V8^9pzpjvODHF0`El^zCgcbUK&fAg{zvkK@)ex zDtQn`M_IzSuAm;W?ELz!ta*i3ltW5V3}>VrPq+Hyq42t{F(N$8C_ZLLpMt*>#Z<_783it)5CW>kz$f0!X1yjdDy zElPhBXw|25C8^9w%0NV_$z%nL4@7|}pWRWe#3){7mQ|COvBh!gpIE?~4i?X?sK(!@ zT8kb^YqS345+5g(>;qm}k}!pbw}pvjcts{6-y}O2eI_KLF8KZp|E(J-U2si$<&P9A z*WawCWM;|@RD_?z@eM(mvAIq1k=`Z@H%)hUD2JzsI)s*r-wQ(l3M)2aSgJZ1NtI^B z&@5-QroAaA;%$PWg$9_LZz)b|4KfoODd(u%NOC3%hO~+Q)zus;Y;_%{V5w(8`Mg*N zcuFI4OA9nfJz-jS3<2J07a*p&pi3bz$R`7ByS~gfKbV(#-cmmtGk}2h%Y?F+ryPSs@YV1Zked)`k!$MK++MNzOnfH{qmm*zM$hnul($;PBL*aLS0)?b&4~rhTW0F07jbWZ_I`?B&&rlmwpKBvBR$1sO zvTAeezrHEqi5uosZ5LJ92+5DKP(at+yCgG#qh3!3wXodYqM?xDqxtyCF!ADJDr=Vb z;*M8JsC_m0wSl1Y)U6qQDJEe_o@Lx-7Hl`5daD|O&Z?BePHkz%Us7n1>M04G(SFY~ z%PLzQYQ|nH{Y1sa@vBVYwl1KqM571pjoS#r=#=`C!N|X*^vI(qdjZ1ID; z*+VarMW}>v&Ja1m0?#szw0zpezLKer(~^DRP+l-0%T(@$!|Brwd7;<%T#0b){@i>-BEqOp5mYjFaShUM~DyL38R znZMTJcn!prrj(o6<1K#oae^nDM4tl5CSp-IloYF;;K_`W6Q_$Gfjx5aIKy06l2<{O zJoS@eg+DfBNn<|!wK1EvotEn$K?s$|KPx^%8CLs2QBCKPq+ApwtFfp1)}S zv%inBC0D~eDV=yq)5^p>(5J*D$$uzgQI0RC1dyC*yRRvmp&^m)W{T#@+zn^4$3OxvYnd2MK*Vz zxw57r3uJp@nc{d(zC7BVv*DLt^n{zPru1E9%&Ni+ zoQ6N%jQ%k&xA8h-W!;S$gnL=M@i$-BqY!*p63=%6jk<)hRH4B;uM9^ zUd#5RY063wguaSVG9)<`%6do8K+A+d?#V&4?6nOM%H4A}gZ52I2cb9D&SZ2IxFl_A zEv}^1FzS~Tg|BHeq9Xk(y?%y- zc&0Efr94ErKa-s13iy`hA~D6=&40D13iXj>ef^aLDhxprk7>it=JpXs+I`7JtYKbE zIWqs+|M5M#VOycyAaceTqXWKE8FrZRW3m>~O}tGEC=o!T>0jux$8mt6DM=&q0~*U( z=xWzoy0v=JPE&2^FZx-&To#pSZjuk>0x#Yq+fJV(l5IPiP19vnAi8p6Vemd_b-{H> zbcusYLbLr6P$HSYE+%vNcX>ed*+rVIk_%R)`Hb@H0SAgpDcPXglah!2vzbY&rBBCvf7k8b{9brS!E*{V8~JBhYIQ-*X*`_IM0}1 zQ-ev`NYdf2Q7HGaXd&IRJrWw6j5-M#ek%1$=AQDKqY@FNKk82})u4sAViZ<&A5fod za@N+_*zG!rlcyfBMIEyj{F$pAGE|_wKIETZSb0Y^H1X^ z3M;qfa`S*_Z$Zi*igQqi;KX2adI}mIakVN0m)VfAoiL=@!3` z66Xh0HoG3Wk$7|;-)NaUI)^{6a5vKm8^*33yD|K|NVk|VW`IwaP{6fOU)&d427@(2wC z@tSZGWs(2TEkuEsVW8zmQt{+Zc*PT6IHV*v)hH8y*pe-< z(>yNLoVupp)Je@h6W^tj`prVVKWKy?S!t*Ci;a#mI#x`QiON5T*vqAddEwKp=V!Up zwKQNz!%332PFe$URgkdt1u=gLHAo)xUzx!cAJru>N6t3+JED>@%MxCooZTcw2&?r@ zqBB&6vL0GC1g*~pOZ3P8(3m(srGkmuX!+;Kq=aHLx+lp{qgyy;Bjxm88cBt&c&@l; zv$qn0M4qREIe`3W8~XhZl}@Q3f3tK7!WUhdA-mLRlQtCx7YUoMl1jN^x^mGS>qEx> zr}1pUX+rW_9)4c z69eSLe*AEvdkL+R8(vcn%oUr0mk!eD zBqQ*@+S;-xRcTv!Yj;W=xv3$!RY){~F&vzkl-y|+1Ij@>HX<$HDH^LJoWoxuTy^|A2RZ@2%kTsK<(CEabR+T^1tYn%2o0Ov2;7&R$r%S>Xv{MQq^-7nrqujVg30z2%WpHNa@_5SfP(}X0 zZ(0~4JI)D}rPo0UZeJ(%2-=9ivU#rqyGKN1RQ5q$@DY z1*!;$HPAM}2W4?mGIL1&z_L<$it?JCs0q?lv$-WLy_%{p?CYJHod~f{?%-M;vzcG5 z9!KhtILRD=wV8H+-YLkqOk0o`&oDDl?3Mv2;yHhKBGGaFgfl!1gCQ^shh|1RnuSPt zf``pnnXXYI)(5kEQd1XJe7(j>XmM<3&!u% zsOe;;6|SS)m{Z8DgPrB>BiBNjr;Zg<)!RIM3U-mJJx_{kmv%kBM&KgSY`>6HHW8S* ztNar)j+$z@g;OnfnhGWq@zq~@O1NYWK1twgXyX%HK#{Vgw2$CiKf}v%R-ZV=$^A8G>MyO<-lQ1 R=6DkCmK%H^S$Eda{{f)v1^fU2 literal 0 HcmV?d00001 diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 0000000..958b793 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,2128 @@ +# Serbian translation of glib +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003 - 2009. +# +# This file is distributed under the same license as the glib package. +# +# Maintainer: Данило Шеган +# Reviewed on 2004-02-01 by: Данило Шеган +# Reviewed on 2005-07-08 by: Данило Шеган +# Translated on 2006-01-31 by Слободан Д. Средојевић +# +msgid "" +msgstr "" +"Project-Id-Version: 2.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-09 20:28+0100\n" +"Last-Translator: Милош Поповић \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочекивано својство „%s“ елемента „%s“" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Својство „%s“ елемента „%s“ није пронађено" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочекивана ознака „%s“, очекивано је „%s“" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочекивана ознака „%s“ унутар „%s“" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Не могу да нађем исправну датотеку са обележивачима међу фасциклама са " +"подацима" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Обележивач ка „%s“ већ постоји" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Није пронађен обележивач ка „%s“" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "У обележивачу ка „%s“ није одређена МИМЕ врста" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "У обележивачу ка „%s“ није одређена приватна заставица" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "У обележивачу ка „%s“ нису одређене групе" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Програм „%s“ није регистровао обележивач ка „%s“" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не могу да проширим комадну линију „%s“ са везом ка „%s“" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Претварање из скупа знакова „%s“ у „%s“ није подржано" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не могу да покренем претварање из „%s“ у „%s“" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка при претварању: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Непотпун низ знакова на крају улаза" + +# ово претпостављам да се односи на делимичан УТФ8 запис +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Не може претворити резерву „%s“ у запис „%s“" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Адреса „%s“ није апсолутна адреса помоћу „file“ шеме" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адреса локалне датотеке „%s“ не сме садржати „#“" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адреса „%s“ је неисправна" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Име домаћина из адресе „%s“ је неисправно" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адреса „%s“ садржи неисправно назначене знаке" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Путања „%s“ није апсолутна путања" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Неисправно име домаћина" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +# bug: plural-forms +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не могу да обезбедим %lu бајтова за читање датотеке „%s“" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Датотека „%s“ је превелика" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не могу да прочитам из датотеке „%s“: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не могу да отворим датотеку „%s“: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не могу да сазнам особине датотеке „%s“: неуспешан fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспешан fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Не могу да преименујем датотеку „%s“ у „%s“: неуспешан g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“ ради уписа: неуспешан fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не могу да упишем у датотеку „%s“: неуспешан fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не могу да упишем у датотеку „%s“: неуспешан fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не могу да упишем у датотеку „%s“: неуспешан fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не могу да затворим датотеку „%s“: неуспешан fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Постојећа датотека „%s“ се не може уклонити: неуспешан g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Неисправан шаблон „%s“, не сме садржати „%s“" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон „%s“ не садржи XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Симболичке везе нису подржане" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не могу да покренем претварање из „%s“ у „%s“: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Не могу да читам без обраде у g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Преостали непретворени подаци у баферу за читање" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Канал се завршава делимичним знаком" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Не могу да читам без обраде у g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспешан open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Не могу да мапирам датотеку „%s“: неуспешан mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка у %d. реду, %d. знак: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Неисправан УТФ-8 текст у имену — „%s“ није исправно" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s“ није исправно име " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s“ није исправно име: „%c“ " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка у %d. реду: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Нисам успео да рашчланим „%-.*s“, што је требало да представља цифру унутар " +"знаковне референце (на пример ê) — можда је цифра превелика" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Знаковна референца се не завршава тачка-запетом; највероватније сте " +"користили амперсанд без намере да започнете ентитет — назначите амперсанд са " +"&" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Знаковна референца „%-.*s“ не представља дозвољени знак" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Уочен празан ентитет „&;“; прихватљиви ентитети су & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Име ентитета „%-.*s“ није познато" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Ентитет се не завршава тачка-запетом; највероватније сте користили амперсанд " +"без намере да започнете ентитет — назначите амперсанд са &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ мора почети елементом (нпр. <књига>)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ не представља исправан знак након знака „<“; име елемента не може њиме " +"почети" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Чудан знак „%s“, а очекиван је „>“ знак ради окончања ознаке празног " +"елемента „%s“" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Чудан знак „%s“, очекиван је „=“ после имена атрибута „%s“ елемента „%s“" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Чудан знак „%s“, очекиван је или „>“ или „/“ ради окончања почетне ознаке " +"елемента „%s“, или можда атрибут; можда сте користили неисправан знак у " +"имену атрибута" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Чудан знак „%s“, очекиван је почетни наводник након знака једнакости при " +"додели вредности атрибута „%s“ елемента „%s“" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ није исправан знак након имена затвореног елемента „%s“; дозвољени знак " +"је „>“" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елемент „%s“ је затворен, нема тренутно отворених елемената" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Документ је празан или садржи само белине" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ завршен неочекивано непосредно након отворене косоугле заграде „<“" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ завршен неочекивано са отвореним елементима — „%s“ је последње " +"отворен елемент" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ је завршен неочекивано, а очекивана је затворена косоугла заграда " +"која затвара ознаку <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ завршен неочекивано усред имена елемента" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ завршен неочекивано усред имена атрибута" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ завршен неочекивано усред почетне ознаке елемента." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ завршен неочекивано након знака једнакости после имена атрибута; " +"вредност атрибута није наведена" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ завршен неочекивано усред вредности атрибута" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документ завршен неочекивано усред завршне ознаке елемента „%s“" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документ завршен неочекивано усред примедбе или упута за обраду" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "оштећен објекат" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "интерна грешка или оштећен објекат" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "нема меморије" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "достигнут је лимит претраживања уназад" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "образац садржи ставке које нису подржане за делимично поклапање" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "интерна грешка" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"референце на претходно поклапање не могу бити услов за делимично поклапање" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "достигнут је лимит рекурзије" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "достигнут је лимит броја празних подниски карактера" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "неисправна комбинација ознака за нову линију" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "непозната грешка" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ на крају обрасца" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c на крају обрасца" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "након непознатог знака следи \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"овде нису дозвољени избегавачки низови за промену величине слова (\\l, \\L, " +"\\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "бројеви нису по реду у {} бројачу" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "бројеви су превелики у {} бројачу" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "недостаје завршница ] за класу знакова" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "неисправан избегавачки низ у класи знакова" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "опсег је неисправан унутар класе знакова" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "нема ничега за понављање" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "непознат знак након (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "непознат знак након (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "непознат знак након (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "класе именоване POSIX-ом су подржане само унутар класе" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "недостаје завршница )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") без отварања (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "након(?R или (?[+-]бројева мора да следи )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "референца на непостојећи подобразац" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "недостаје ) након коментара" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "регуларни израз је предугачак" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "не могу да добијем меморију" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "подаци иза тврдње нису задате дужине" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "неисправно задат број или назив након (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "условна група садржи више од две гране" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "очекивана је тврдња након (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "непознат назив POSIX класе" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "нису подржани POSIX колациони елементи" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "превелика је вредност карактера у \\x{...} секвенци" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "неисправан је услов (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "није дозвољено \\C у подацима иза тврдње" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "рекурзиван захтев се може понављати бесконачно" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "недостаје завршница у називу подобрасца" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "двоимени подобрасци имају исто име" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "није исправно задата \\P или \\p секвенца" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "није познат назив особине након \\P или \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "назив подобрасца је предугачак (сме да има највише 32 каракатера)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "има превише именованих подобразаца (сме их бити највише 10000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "осмобројна вредност је већа од \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE група садржи више од једне гране" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "понављање DEFINE групе није дозвољено" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "неуједначене NEWLINE опције" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "након \\g не следе заграде са називом или вредношћу различитом од нуле" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "неочекивано понављање" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "прекорачење кода" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "превише покренутих радних простора за превођење изворног кода" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "није нађен претходно проверени и повезани подобразац" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Грешка приликом претраживања регуларним изразом %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE библиотека је преведена без подршка за УТФ8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE библиотека је преведена без подршке за УТФ8 особине" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка при превођењу регуларног израза %s код знака %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Грешка при оптимизовању регуларног израза %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "очекивана је хексадекадна цифра или „}“" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "очекивана је хексадекадна цифра" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "недостаје „<“ у референци симбола" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "Недовршена референца симбола" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "референца симбола је дужине нула" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "очекивана је цифра" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "неисправна референца симбола" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "одлутало завршно „\\“" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "непозната секвенца избегавања" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Грешка приликом обраде текста за замену „%s“ код карактера %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Навод не почиње наводником" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Неупарен наводник у наредби или другом цитату из љуске" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Садржај завршен непосредно након „\\“ знака. (Ради се о тексту „%s“)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Садржај завршен пре наиласка на одговарајући наводник за %c. (Ради се о " +"тексту „%s“)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Садржај празан (или садржи само белине)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Није успело читање података из потпроцеса" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Није успело стварање цевке за везу са потпроцесом (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Није успело читање из подређене цевке (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Није успело приступање директоријуму „%s“ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Није успело извршавање потпроцеса (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Није исправно име програма: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Није исправна ниска — члан вектора у %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Није исправна ниска у окружењу: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Није исправна радна фасцикла: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Није успело извршавање помоћног програма (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочекивана грешка док су у g_io_channel_win32_poll() читани подаци из " +"потпроцеса" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Неуспело читање података од потпроцеса (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Неочекивана грешка у select() при читању података из потпроцеса (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочекивана грешка у waitpid() (%s)" + +# за сада овако, можда гранање, умножавање? виљушкање ;-) +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Није успео fork() (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Није успело извршавање потпроцеса „%s“ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Није успело преусмеравање улаза или излаза потпроцеса (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Није успео fork() потпроцеса (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Непозната грешка при извршавању потпроцеса „%s“" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Није успео да прочита довољно података из цевке ка потпроцесу (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Знак ван опсега за УТФ-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Није исправан низ у уносу за претварање" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Знак ван опсега за УТФ-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Употреба:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ОПЦИЈА...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Помоћне опције:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Прикажи опције за помоћ" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Прикажи све опције за помоћ" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Опције програма:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не могу да рашчланим целобројну вредност „%s“ за %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Целобројна вредност „%s“ за %s је изван опсега" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не могу да рашчланим реалну вредност двоструке тачности „%s“ за %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Реална вредност двоструке тачности „%s“ за %s је изван опсега" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Грешка при рашчлањивању могућности %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Недостаје аргумент за %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Непозната опција %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Не могу да нађем исправну датотеку са кључевима међу директоријумима претраге" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Није обична датотека" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Датотека је празна" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Датотека са кључевима садржи ред „%s“ што не чини пар кључ-вредност, групу " +"или примедбу" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Неисправно име групе: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Датотека са кључевима не почиње групом" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Неисправно име кључа: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Датотека са кључевима садржи неподржано кодирање „%s“" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Датотека са кључевима нема групу „%s“" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Датотека са кључевима нема кључ „%s“" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Датотека са кључевима садржи кључ „%s“ вредности „%s“ што није УТФ-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Датотека са кључевима садржи кључ „%s“ неразумљиве вредности." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Датотека са кључевима садржи кључ „%s“ неразумљиве вредности." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Датотека са кључевима садржи кључ „%s“ у групи „%s“ неразумљиве вредности." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Датотека са кључевима не садржи кључ „%s“ у групи „%s“" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Датотека са кључевима садржи знак истицања на крају реда" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Датотека са кључевима садржи недозвољен низ истицања „%s“" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Вредност „%s“ се не може сматрати бројем." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целобројна вредност „%s“ је изван опсега" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Вредност „%s“ се не може сматрати реалним бројем једноструке тачности." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Вредност „%s“ се не може сматрати истинитосном." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Превелика бројчана вредност је прослеђена у %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Ток је већ затворен" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Радња је прекинута" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Неисправан објекат, није покренуто" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Непотпун низ бајтова на улазу" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Нема довољно места у одредишту" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Није подржано покретање уз могућност прекида" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Непозната врста" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s врста датотеке" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s врста" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочекиван, преран крај тока" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Неименовано" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Датотека за радну површ не садржи Exec унос" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Не могу да нађем терминал ради покретања овог програма" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не могу да направим фасциклу за корисникова подешавања %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не могу да направим фасциклу за корисникова МИМЕ подешавања %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не могу да направим датотеку радне површи %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Произвољне одреднице за %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "уређај не подржава eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "уређај не подржава eject или eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "није подржано извлачење медијума на уређају" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "уређај не подржава start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "уређај не подржава stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Не могу да радим са издањем %d за кодирање GEmblem-а" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Неисправно задат број токена (%d) у кодирању GEmblem-а" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Не могу да радим са издањем %d за кодирање GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Није исправно задат број токена (%d) у кодирању GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Очекивано је GEmblem за GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Радња није подржана" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Садржано монтирање не постоји" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Не могу да умножим преко директоријума" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "не могу да умножим директоријум преко директоријума" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Циљна датотека већ постоји" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Не могу да умножим директоријум и његов садржај" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Дељење није подржано" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Грешка приликом дељења датотеке: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Не могу да умножим специјалну датотеку" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Дата је неисправна симболичка веза" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Није подржано смеће" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Имена датотека не могу да садрже „%c“" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "није подржано монтирање диска" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Ни један програм не може да отвори ову датотеку" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Набрајање је затворено" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Бројање датотека има неиспуњену радњу" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Бројање датотека је већ завршено" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Не могу да радим са издањем %d за кодирање GFileIcon-а" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Улазни подаци за GFileIcon су лоши" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Ток не подржава query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Није подржавано премотавање тока" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Сасецање није дозвољену над улазним током" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Сасецање није дозвољено над током" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Није исправан број токена (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Не постоји врста за име класе %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Врста %s не подржава GIcon сучеље" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Врста %s не припада ни једној класи" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Број издања је лоше задат: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s врста не подржава from_tokens() на GIcon сучељу" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Не могу да радим са датим издањем кодирања иконице" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Улазни ток не подржава читање" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Ток ради јако добро" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Нема довољно места за адресу утичнице" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Није подржана адреса утичнице" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Не могу да нађем подразумевану врсту монитора за локални директоријум" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Неисправно име датотеке %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка приликом добијања података о систему датотека: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Не могу да преименујем корени директоријум" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Грешка у преименовању датотеке: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Не могу да преименујем датотеку, јер она већ посотоји" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Име датотеке је неисправно" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Грешка приликом отварања датотеке: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Не могу да отворим директоријум" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Грешка приликом уклањања датотеке: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Грешка приликом премештања датотеке у смеће: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не могу да направим директоријум за смеће %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Не могу да нађем корени директоријум за смеће" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Не могу да нађем или направим директоријум за смеће" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не могу да направим датотеку са подацима о смећу: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не могу да пошаљем датотеку у смеће: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Грешка приликом образовања директоријума: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Систем датотека не подржава симболичке везе" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка приликом образовања симболичке везе: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Грешка приликом премештања датотеке: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Не могу да преместим директоријум преко директоријума" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Није успела израда резервне копије датотеке" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Грешка приликом уклањања циљње датотеке: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Није подржано премештање између монтираних уређаја" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Вредност особине мора бити различита од NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Није исправна врста атрибута (очекивана је ниска знакова) " + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Није исправно проширено име особине" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка приликом постављања проширене особине „%s“: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Грешка приликом постављања стања датотеке „%s“: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (неисправно кодирање)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Грешка приликом постављања стања описивача датотеке: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Није исправна врста особине (очекивана је uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Није исправна врста особине (очекивана је uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Није исправна врста особине (очекивана је ниска битова)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Не могу да поставим овлашћења за симболичке везе" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка приликом постављања овлашћења: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Грешка приликом постављања власника: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "симболичке везе морају бити различите од NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка приликом постављања симболичке везе: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Грешка при постављању симболичке везе: датотека није симболичка веза" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка при постављању датума измене или приступа: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux контекст не сме бити NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка приликом постављања SELinux контекста: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux није укључен на вашем систему" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Није подржано постављање особине %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Грешка приликом читања датотеке: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка приликом претраге унутар датотеке: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Грешка приликом затварања датотеке: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Не могу да пронађем подразумевану, локалну врсту монитора датотеке" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Грешка приликом уписа у датотеку: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка приликом уклањања старе резервне копије везе: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка приликом образовања резервне копије: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка приликом преименовања привремене датотеке: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при сасецању датотеке: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка приликом отварања датотеке „%s“: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Циљна датотека је директоријум" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Циљна датотека није обична датотека" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Датотека је измењена неким другим програмом" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Грешка приликом уклањања старе датотеке: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Није исправно одређен GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Затражена је неисправна претрага" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Не могу да сасечем GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Величина излазне меморије се не може променити" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Не могу да променим величину излазног меморијског тока" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "Има више меморије за упис него што има места у датој адреси" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Захтевано је премотавање на део пре почетка тока" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Захтевано је премотавање на део након завршетка тока" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "монтирање не подржава „unmount“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "монтирање не подржава „eject“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "монтирање не подржава „unmount“ или „unmount_with_operation“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "монтирање не подржава „eject“ или „eject_with_operation“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "монтирање не подржава „remount“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "монтирање не подржава налажење врсте садржаја" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "монтирање не подржава синхронизовано налажење врсте садржаја" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Име домаћина „%s“ садржи „[“, али не и „]“" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Излазни ток не подржава упис" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Изворни ток је већ затворен" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка у разрешавању „%s“: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка у обрнутом разрешавању „%s“: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Није нађен сервис снимања за „%s“" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Привремено не могу да разрешим „%s“" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Грешка у разрешивању „%s“" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Неисправна утичница, није покренуто" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Неисправна утичница, покретање није успело због: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Утичница је већ затворена" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "правим GSocket из fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не могу да направим утичницу: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Задат је непознати протокол" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "не могу да добијем локалну адресу: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "не могу да добијем удаљену адресу: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "не могу да слушам: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "грешка при повезивању на адресу: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "грешка у прихватању везе: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Грешка у повезивању: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Повезивање је у току" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Грешка у повезивању: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не могу да добијем грешку на чекању: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Грешка у примању података: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Грешка у слању података: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Грешка у затварању утичнице: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Чекам услов утичнице: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Грешка при слању поруке: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage није подржано у прозорима" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при примању поруке: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Непозната грешка везе" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Слушање је већ затворено" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Додата утичница је затворена" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Не могу да радим са издањем кодирања %d за GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Очекујем једну контролну поруку, добио сам %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Неочекивана врста подређених података" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Очекујем једно fd, добио сам %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Примљен је неисправни fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Грешка при читању из unix-а: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Грешка при затварању unix-а: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Корени систем датотека" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Прешка при упису на unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Абстрактна јуникс утичница адреса домена није подржана на овом систему" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "диск не подржава избацивање" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "диск не подржава eject или eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Не могу да нађем програм" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Грешка при покретању програма: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Адресе нису подржане" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "нису подржане промене придруживања за win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Нису подржане промене придруживања за win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Нема довољно меморије" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Грешка у програму: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Потребан је већи унос" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Подаци нису исправно запаковани" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Није исправан низ у уносу за претварање" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Достигнут је највећи број података у опсегу" + +#~ msgid "do not hide entries" +#~ msgstr "не сакривај уносе" + +#~ msgid "use a long listing format" +#~ msgstr "користи дуги формат списка" + +#~ msgid "[FILE...]" +#~ msgstr "[ДАТОТЕКА...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Име ентитета не може почети знаком „%s“ ; знак & започиње ентитет; ако " +#~ "овај знак не означава ентитет, истакните га помоћу &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Знак „%s“ није дозвољен у имену ентитета" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Празна знаковна референца; мора да садржи цифру као на пример ˫" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Недовршена референца ентитета" + +#~ msgid "Unfinished character reference" +#~ msgstr "Недовршена знаковна референца" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Неисправан текст у УТФ-8 запису – предугачка секвенца" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Неисправан текст у УТФ-8 запису — карактер није почетни" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Не могу да променим овлашћења датотеке: неуспешан fork(): %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Не могу да променим овлашћења датотеке: неуспешан chmod(): %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "Не могу да променим овлашћења датотеке: потпроцес окончан сигналом: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Не могу да променим овлашћења датотеке: потпроцес силом окончан" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Није подржано претварање из скупа знакова „%s“ у скуп „%s“" + +#~ msgid "Incorrect message size" +#~ msgstr "Неисправна величина поруке" + +#~ msgid "Socket error" +#~ msgstr "Мрежна грешка" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "Неподржана подешавања канала" diff --git a/po/sr@ije.gmo b/po/sr@ije.gmo new file mode 100644 index 0000000000000000000000000000000000000000..cbabc133b1aff18b7b5e67bb8798f8796d0c250d GIT binary patch literal 13747 zcmds+TWlQHdB-QN8^>~DCyt$)>*UxjMakw;)Wxn$O7caQR*CPXYNSc3F1bT$rR5I2 zv#X2i0%m(-6a;sH4}uQ-68H}IA~*uxabpk+g3p2X zg0Fz0dm7vWeteCm{~O>Yp1%eTgWm@q0sk9(7<}j^PwzPR9MAI!-uB@j*vNAY6o2o4 z4}pIN-VfgVks#O$?gGCKz6Ra_x|@UGHgFs0z^6gIZ-D*aYv5xd&eh5mQ4`7@dp*H}I@%#Wn zO@Jps(FyK^7vNd&F!*VV_a*Rk@GIcYzzF>O=Yrq}coF;>xXA^a2y_ooF=_W2381028!MDGyz2sjUl z&dS74-~S3kiI|DtKj`8YcF^i+ymZ# z62<=$pyYlV90hNOS@C<2KeE@G-~sTTz!$(>IK_J8dJp^w&;K^)`ThY;wUOtWaHd}Y zw}bn@7I+H$8&LBn7$iRa71a0pa4x0>FM*GNr$O=kb5L@AWwW=(x4@Tq9@ygJ_q(9@ z`YBiepST}i0Dp~J*N3@rLCZ0Eev}&(+4T|riU(bo+t&FIh)V_^j4iI57#CCOIF!!8@J-~W^POy`~tV*zKi?w+`4cT)6p=9IqkyC!S>{T*%9*;F4S&z zP^{j@{V+GG4{qSrg<67JxN*Del6_Hka1%G-W0!QS>sPsVaetKiv)pUAcXR(D_b0h^ z;j(s(@E5lT2u;gr_L4uSJoq5@XSh+j)egeXF2c;N^$7<3eR035#;zVUUD+Kj*Qyma zexTeak2k}Hn}}+)=t#9b$+!M({oOAkuG(}{L)d${b9YL@zVWxR6iUxnr;Ga#>(S|yat*P zA1YxSHtjjs=~s2wW~y2*H^W#AmECl?(X5thT|H`KV#BD_bkPJ7)F(p>+Hm_u_mnn1 zaHSDja|0UTMA!)Hw*7S7LXoe^~YSp|TGX6MB7#cy>xmQGID_n7fYCW!2&=xFC85fv)x)F_saV!n%9DeuSM4OPwGC#GyAx8;o#(;+cp+Ohjy&*&Jerd)HD%` z!;#9GWin#LMRmL$H4#6KPf9DTlr#V@2iA;xe*Tg)Z*4Y--?*OQk2tOUj7Dt}hP!H`1fZlk2PGUnXHzsWwPXQ3Ji8-`oHtK#{Z@ zn0?z*#^Wn;EtNmY3I7#IxOIK;`XDzBLL{?g$@tIHRZ_f4lhRhJUL_%GadW|?mPTUDfT65ic>bg{C8t!Vx zoIE!eqb>h&qN3r;k+OyDaJ-VbP9kw?sV}Y=qwb9IeE(8l46S+5Va6aSCH%Z`}vI3O!li z`Ia>`v{1hNvSz~O2kFQIv^3VvrY}~U^;kI3jOgR2`$d_H;HRIWrMln`k#&2l$)yEGO%J$@8;7@SEe&lM8e(ASnecE`1ha8NTliMm z^q?EsIJ|M=eM6fV_ZY2lX_RekOk72cVfScskW}+*>jmls9V!p;!_6?N4c5cv4u;n! zTjj~HG#ZwthTXGaW30;Xb#Y_8+ZNl?WIdV+OSLK``{8<2pRBhAqsHWpHIMIoe0NvI zje|pLcGBX~IF?3_O(TawZUfO>rKwcrWB<8bo9wOKablCaU)oJwkhcuGtz*^Zn&AE8 z@ASp*AODtXUv8gw?e{vz+vnToIxlrzZqK&QbWXNsU3;$cl6~L>FE6|H1qRQyFKQ0Z zUdX*;JS4Y4afFHOc@aI|zQoPH?aLyYEH%%(@A0{FDjoM;d!h4c`#fXj3Vh9VPKeB^ z*tiU_3kee&jEf!#(`7ZPom+7^Zm*gX6J8pUzGe~X4B|<Qa-Xy?14r5TA3-RB{2UAIIHhakmc z_P5P$bL}(T<*RJ9O47Wh#+Sq460cWr+h;gy@4nXNKf$b z6%Fw?C!rl`n8&Y~#KKb5xy%uyHlmOT%#^bviz@2i&r|e4D%?}|`YiL8CB{dA4&zM-~EFUc>k5dDZG9o9O>wJR&ys^N- z6nTkM%nRm9t9xRu^!o|vBAsiML(!jjIfMK;@!|wZ3naUHZ6qyZkLb{uckAGeWX%CG z30!?A1)pQ&MFbPonlH(#NXkiWlGwfsk*G`ua#LS$)N>FhLHnEeSnM@eDqhkIqFaj5 z%Pgg0ptNU>zmgTb<H%{L5F5i692o2GoTa|zF8Se8nR->th94@ zXYGjJ251z-RLNNLBw9M7@F|Q}-hT-T+fQrDo`0iRZ6VS%FaQx?xk)_a+dxMBKW(l4 zK(0c&OTU$rP!EN6t21NglsAafi*kOS*Cj5CsclVKP zk8l=tede|JV3NR0D(n1mB$i{zTC99q+j+&xn1@kVSP8QG{ORN-HXGNqw=q&WChHsn^mz z-g4(HMs2yBWM`JP6d_OaKGYSTUjt!Rbr?KJfY$*<>e}t4rNGw1)|mmNfo43 zISTcr^A>B6!WR#=4#acdm-HK2mb8rAvz)Rh$2HBIua)Im(O@rygbowcD9E04WUr!_Qx@K6bD0h5@=T(FHyeBBU#O=#C_>5dJ ziPuCstg2HuNq}Z$;|@(;7Q8;@65%uo{d?KxFg*`Fl0%M={v*?OE|qDdbw_@RY=SJnZb)4p-w`XshYowSA?Dw7ho-{V)s496emP-@A?d8xi6rVb z5+;jWau#A%a7-z(>RGR*R6QN?(IU}(%CX-=+kdDf83Q3CXWQ)COlxQ}A!z(oW(^Td z*~!Tn{1uKyP{x-nPE%9P@_XvlF0D+NZt2!xJ~<)Wr(ZNOsgjmiF_(|5IEP3(R3HHxP4z0Kd_Pg@@$nBhe}rVTSUtR zrrD&YUFGWCj?ZUg0yjN7C!yt40t-DqTwA`;!rlw5HO +# Reviewed on 2004-02-01 by: Данило Шеган +# +msgid "" +msgstr "" +"Project-Id-Version: 2.4\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2004-04-29 01:11+0200\n" +"Last-Translator: Bojan Suzic \n" +"Language-Team: Serbian (sr) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Чудан знак „%s“, очекивао сам „=“ после особине „%s“ елемента „%s“" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Претварање из скупа знакова „%s“ у „%s“ није подржано" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не могу да покренем претварање из „%s“ у „%s“" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка при претварању: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Непотпун низ знакова на крају улаза" + +# ово претпостављам да се односи на делимичан УТФ8 запис +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Не може претворити резерву „%s“ у запис „%s“" + +# bug: "file" should be in quotes, if it's about "file:///" +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Адреса „%s“ није апсолутна адреса помоћу „file“ шеме" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адреса локалне датотеке „%s“ не смије садржати „#“" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адреса „%s“ је неисправна" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Име домаћина из адресе „%s“ је неисправно" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адреса „%s“ садржи неисправно назначене знаке" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Путања „%s“ није апсолутна путања" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Неисправно име домаћина" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +# bug: plural-forms +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не могу да обезбједим %lu бајтова за читање датотеке „%s“" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не могу да прочитам из датотеке „%s“: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не могу да отворим датотеку „%s“: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не могу да сазнам особине датотеке „%s“: неуспјешан fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Неисправан шаблон „%s“, не смије садржати „%s“" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон „%s“ се не завршава са XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Симболичке везе нису подржане" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не могу да покренем претварање из „%s“ у „%s“: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Не могу да читам без обраде у g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Преостали непретворени подаци у међуспремнику за читање" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Канал се завршава дјелимичним знаком" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Не могу да читам без обраде у g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка у %d. реду, %d. знак: %s" + +# ознака знака??? неееее +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Неисправан текст у УТФ-8 запису" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка у %d. реду: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Нисам успио да рашчланим „%s“, што је требало да представља цифру унутар " +"позива знака (на пример ê) — можда је цифра превелика" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Позив знака се не завршава тачка-запетом; највјероватније сте користили " +"амперсанд без намере да започнете ентитет — назначите амперсанд као &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Позив знака „%s“ не стоји за дозвољени знак" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Уочен празан ентитет „&;“; прихватљиви ентитети су & " < > " +"'" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ентитет „%s“ није познат" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Ентитет се не завршава тачка-запетом; највјероватније сте користили " +"амперсанд без намере да започнете ентитет — назначите амперсанд као &" + +# може и ћирилица: „Уникод ТрансФормација 8“ +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ мора почети елементом (нпр. <књига>)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ не представља исправан знак након знака „<“; име елемента не може њиме " +"почети" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Чудан знак „%s“, а очекивао сам „>“ знак ради окончања почетне ознаке " +"елемента „%s“" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "Чудан знак „%s“, очекивао сам „=“ после особине „%s“ елемента „%s“" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Чудан знак „%s“, очекивао сам или „>“ или „/“ ради окончања почетне ознаке " +"елемента „%s“, или могућу особину; можда сте користили неисправан знак у " +"имену особине" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Чудан знак „%s“, очекивао сам почетни наводник након знака једнакости при " +"додјели вриједности особини „%s“ елемента „%s“" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ није исправан знак након имена затвореног елемента „%s“; дозвољени знак " +"је „>“" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елемент „%s“ је затворен, нема тренутно отворених елемената" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Документ је празан или садржи само бјелине" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ завршен неочекивано непосредно након отворене косоугле заграде „<“" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ завршен неочекивано са отвореним елементима — „%s“ је последње " +"отворен елемент" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ завршен неочекивано, очекивао сам да наиђем на затворену косоуглу " +"заграду која затвара ознаку <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ завршен неочекивано усред имена елемента" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ завршен неочекивано усред имена особине" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ завршен неочекивано усред почетне ознаке елемента." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ завршен неочекивано након знака једнакости после имена особине; " +"вриједност особине није наведена" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ завршен неочекивано усред вриједности особине" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документ завршен неочекивано усред завршне ознаке елемента „%s“" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документ завршен неочекивано усред примедбе или упута за обраду" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Канал се завршава дјелимичним знаком" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +# позив уместо ознака? +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Недовршен позив знака" + +# позив уместо ознака? +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Недовршен позив знака" + +# позив уместо ознака? +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Недовршен позив знака" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Симболичке везе нису подржане" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка у %d. реду, %d. знак: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Недовршена ознака ентитета" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Навод не почиње наводником" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Неупарен наводник у наредби или другом цитату из љуске" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Садржај завршен непосредно након „\\“ знака. (Ради се о тексту „%s“)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Садржај завршен прије наиласка на одговарајући наводник за %c. (Ради се о " +"тексту „%s“)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Садржај празан (или садржи само бјелине)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Неуспјело читање података из подређеног процеса" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Неуспјело стварање цјевке за везу са подређеним процесом (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Неуспјело читање из подређене цјевке (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Неуспјело приступање директоријуму „%s“ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Неуспјело извршавање подређеног процеса (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Неисправно име домаћина" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Неисправан низ у уносу за претварање" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Неуспјело извршавање помоћног програма" + +# Овај превод није психолошке природе :) +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочекивана грешка док су у g_io_channel_win32_poll() читани подаци од " +"подређеног процеса" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Неуспјело читање података од подређеног процеса (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочекивана грешка у select() при читању података од подређеног процеса (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочекивана грешка у waitpid() (%s)" + +# за сада овако, можда гранање, умножавање? виљушкање ;-) +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Неуспио fork() (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Неуспјело извршавање подређеног процеса „%s“ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Неуспјело преусмјеравање улаза или излаза подређеног процеса (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Неуспио fork() подређеног процеса (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Непозната грешка при извршавању подређеног процеса „%s“" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Није успио да прочита довољно података из цјевке ка подређеном процесу (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Знак ван опсега за УТФ-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Неисправан низ у уносу за претварање" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Знак ван опсега за УТФ-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Грешка при претварању: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Неисправно име домаћина" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Неисправно име домаћина" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Адреса „%s“ садржи неисправно назначене знаке" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Симболичке везе нису подржане" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Симболичке везе нису подржане" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Симболичке везе нису подржане" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Симболичке везе нису подржане" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Неисправно име домаћина" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Неисправно име домаћина" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Документ завршен неочекивано усред имена особине" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка у %d. реду: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Симболичке везе нису подржане" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка при претварању: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Неисправно име домаћина" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +# bug: plural-forms +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Не могу да обезбједим %lu бајтова за читање датотеке „%s“" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Грешка при претварању: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Грешка у %d. реду: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Грешка при претварању: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Грешка при претварању: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Симболичке везе нису подржане" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Неисправно име домаћина" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Неисправан низ у уносу за претварање" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Име ентитета не може почети знаком „%s“ ; знак & започиње ентитет; ако " +#~ "овај знак не означава ентитет, истакните га помоћу &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Знак „%s“ није дозвољен у имену ентитета" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Празан позив знака; морао би садржати цифру као на примјер ˫" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Недовршена ознака ентитета" + +# позив уместо ознака? +#~ msgid "Unfinished character reference" +#~ msgstr "Недовршен позив знака" + +# ознака знака??? неееее +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Неисправан текст у УТФ-8 запису" + +# ознака знака??? неееее +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Неисправан текст у УТФ-8 запису" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Име домаћина из адресе „%s“ је неисправно" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Име домаћина из адресе „%s“ је неисправно" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Грешка при читању датотеке „%s“: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Грешка при претварању: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Није подржано претварање из скупа знакова „%s“ у скуп „%s“" diff --git a/po/sr@latin.gmo b/po/sr@latin.gmo new file mode 100644 index 0000000000000000000000000000000000000000..cb6880835d3b147c0aa938d710272c74cd3649ff GIT binary patch literal 44256 zcmd6wcbr{EdG`;5;zBj<^;oj3U96SmE=#hEEX%gAEXgW17#aEO-m|-R_uhNfx2&WE z(~L1THel0iOtI-D35HM-z@|hZgb+ePXfK3>4sR$SfK!0*et*x*oOABoyV5#u{>c4k z^gCthGtWHpJkQLT{nlZRdQHUd&5wwpl= z{|LMY{Cn_7@Tf&mv>jXu9uB@3JPo`X902!$G59m^IPi&NLQ&Capvv0>9tBpxGr<>v z=Yt;vPX>Pmo((=}aTJ{nt^-wW2RsYB4ODrb1kV6}0uF&EQn=!809D>|LDlbGFa|#a zs(oJpRWIFe866KU0oQ?4IckDbA-W5Ml+h3| z?^Y@)x=w&A!CS$l;AcRhM8Ed;F@+z^{U%V)$3d0*3SI&pPa{Q_5m0oy3tR#I z6{zwbL*`EdF9TKHE#TGQK946r9MP)-icat3KehL(;DzAtz;nP0mPOHeum#=$J^;qx zCK8LDQ{aiI2t$)+JaYu8c#0;74Op? zzX`79{vnW|9G$b=jgxCY)#G^}Ln(R#sQmVVqQfsi@yB6gs&;GvmHxS)_~$-Q?fMJw zDd4X`)%Rd3$7OUHD85ep{VPHB|K~uZ`yt3sh>lpv7y;LS;{VTsdj3n0E{jfD3T)IS5IkLoP-Z zgO`EI_cfsM{S>J3z6+}Tf3VKg=L}Ht_$p9zdOo-Sd_5?7JpihIe*qp3oG5QylAeh9)E(Xp4h{=FJJmHTN>`MwcUxnBj30sj>g{U1l;)PLuK zPX^b6>gQ*HYRB_Iwe!v3M(`)#{ou;=&_ws3>NoauhtCHWasN6{eER?>Iy?kE6+Go~ zCx4xH!ik=s&@?(KR+K-z3%~4&I6$M>-(V69ka#p;bq`5?ym<$=eL0B?=OI&%g;dd z&ttbbemWDR%F&e|Lm;{jRDHh>D&0X07V+BvsPZ>~N`F15{N4aQ8T=4$) z%I}xpW5M&bJNjP;K8E{iK-Dt=RsTD|v%pV*qTjE<7+iRjYyZXIq1;~wJ_W3Ss@Ds^ z!@+lguvYYOQ2l<;)vlh4K!$9z8C3tj22{V@532m1fR6`Hc!uN8)4(Tje=Vr?H^3Nt zIjC~p2P*%);1j@agOW4<0-ggt;hC=AF9!9z0V@7&pwhn^R6QO9MbEGM``>_ycjPrL z-?KpV!$qL@B?XTHZv{pFw}1oSUxVV0hd{+Y>{%|~b3nzv8ax8bK*@!hK#jNefok8E z!SlgigR0NzI~-mKN*=aA^~d``#rsE4{e8@}F8yhs^1B?2!RtZM^G@(M@Lupt@Z+H3 z{Tx)ij(E1~zadcV+XfyF?g7Q$uLYk7J_w30z5pH#K60n4*Kwfu`Fp3z72{FPfZ=YE(68aF99{)UI&VFaHKS8$5W@@zrW@5%(#m`n(JjKfE2h z0DKU91Nd7|VFfce)uFf2!0bB0w2?0E(gyB*MRqe zqVIP+9+|oPo(^8Z^IO0x!7qZM+kz?A&)0yEF!~sHI=Jw9*Z!^GMch9RR6l$QR6QTl zME3wM0q+3c2&&zuw;Vri2gRp#P|t4z2fz=23&3xHCxib5ihtv_qt|k98TVVjrQnUA z+Wi4gboc_e5Inf!O@pU`_kpU{ zXF-k6fA)CjE?4iDE=Ipar}23sCvH#RK5Nd)OdK@b6kGwLAB=wQ2E{q zo)3NtR6a*PH;OI=F9+2>uL4!CKLa;_Uj>!_DL1(CF9+3MGvHa^8$j{t7eVpk6QAem zeLi>w_t%5!@3(@Y)8|3)=kLHH!3&@7^1BLL%l&R}CHQghGVtF)rC;*`SN{o6@81Q! z4*VW?8u;87I{Ll~6n}oj-yioP_k2C5_U;0e{ypGE@CTsie9n!IpX=ai?*GW&{{%dd z`z0@S^|%~d$bB0;47>|e|GXDe|9%BjyB>9uYwvO3lepgiE(fm#PXJ#F#^47*)$7aP z67Zmxxb)|MdcOfwf7L;ye?Du`gqcb3Y6YgC7D#|D$hn{dzShy4(n^1@8w%?_Ysx|4Fwyxv&LP z`3+G0c_*lRJ_m{(2fy6)#~^q#_t$`m*8;hWjvs((|B0`5ddx-OG2HJ2MW;RBx!@my>eugr>eolV z#`XJB@Ko-v1XbQ{Q0ZR_9tYkJ9uIyVJPQ1=fBuNqx_X`f9?tVKK+*dWQ1M6o{f*!v z?%xWE&;AlT7yJpRdMtb$wjsCyyaId|I0!xjo(0Btxq58_)vrxZeDQv8Dflf=^m+W< zjxLvi%ec?LBfxt>$%zkxqSJT4bHK;E-tqG)P|p)k@oxe}r+Yxr`vFk#e-2&(F1p9@ zV-3{v`@!Yl55UvGliuL?bd$#!Q1y8`DEfW{+y?#%ybN6bMn|7JLAC2o!Lz~dgX-sF z-{k0Z5qKo`d%&lFuLO?+-v&Mr{3LiD_(kwg@Sr!l{x}>wnESKAE5X&E@_!|`0o(_Q zj)&drdp_lKbP zan)N~ei^9uF9M$oz84gqJOGLxzYD6phrHE|+mk_+y8=8G+z5(4s-WopM*sY;!DG1p z5h(gR@@;PXod}A)7lOxwHIKJ|qTf3}mH%N-@xBQvpM&4-_-7%gdTj#LFVmpt@g{H) z_*qcp{S35vzr)2l8B{yhgA2hXcoFzoQ0czz@%P{*+%I~kqf-rB!~L5<<@;@L0r)$Q z@w*)Vt_2^@^KtNL;4~<{{0KMz{uESuk9@b|=d-|5xKBa#^R1xby&F_}{|;OW{sa_V zm%Yc`Uk5&o`?rCr$M?ab!GqrG`1)i}{c<6w{=5cM{xxtAd>JUZdKztH$y#LHI^Hv4Dia4o(o|31Xc4+yYG z^hVy_=U?8!wRrub1dZua377NiM(`oR2;n^Lse=8k;rj2mdK&l-;0@q&2w!)vZNAdw z4+)}`ertHI-ypaWd@}eIa0uKDUI(5;(C=~w(M!3%%Rig&s8`~j4-;C1KO$`8-RlVl z5e_C?%rpHi)HPw0px;Lb7jS(QI7K*u>jD2xGVgta#}V!!{FI>I%l&&@-$r-@_kRU` zNe}$*8t@DLTI+QBodq(KqTkvbIso_U{k!LT6rXJ*9LN2kK3;$axOhL|iM)F;;R?bh zbWivsVFmZ%#{|^xT<~w*W%L-XA4j-}`}4v70}g}V0sqm*5j>t}e+gbonBw~RddRQA z^%KCIVEA3|YNBg+X04M#m;!74x6JF$>U8;xt))L0- z%FVyJ+~wmO?4L_+-%a>Eq2r$kUP8Pz;A%pf>!wfluiQV~UmpU#n)?R{i~X~^xYjQw zAYP)M5H$Dv7ePNnr^y&yZz0Xegd@3r4q=@h`X3@N`Ya*k{d2)P2u~-R%Ke)NKj!+= z1pU76Ai9d@kK#H5_kgbe^*a*$5qO5bUj?otOcVZ|=l?{wgzF0UM#6T21ke(~zw4S` zo$HuzGuJ18M-lW}2uilg1?i9i};kAT}XU`rJI-g>qC3u{RPi8?~V05U(d5&6PEJ)wP20#ErNc( zaA5k{yZm(>{13vv5H9k0?eKU%&%RA)aep}BySNvk8y!H+S&vG{UWf z8wtpvjq z_dUYlguR553Ew2>H$*s>aF37o0`R5WUqW~+;ZfWl1O6!?B^<;3>%rF%wsUji}HdnFhD>2F>EzM6Mu zfg8Z1z^8(*Bb-in1NVPIcopG!++Ru1?;8%HKL&5(*@^!C%itj4BEnXle;&Mopx>Jv zn4k1ny!!z6#}UrvdJ`f1-sCT;Jo|I5PXu2CuF~^(pxT&DYSl`dHb$~awJ|mrEn0fU zXuR$shnIT1+~XAv>A_P zwOY1|!g#lM)#5mRvofx><9f2k(ha9$)kd5&;TJXC1mR8;$E}J!|fXo9XqPYLlq#ES_p+ zBV=u)+tsYLQ<1BdG{@kV_BdRSOefV^GF*eQt`>1?Dj7+mHB(cy>PXVAQi)Adg4T*? zO^ed2?%@c{v$tZ#t~$elXPp_XX}6oz;SMDldr-Z=aCWa$qg0&w=MiD(PMVXxku`=k zZr`vWx+oc$>`d8ci1SiMsWy#Yn=}@;UBJN*6Paq%}8U ztBq=fk_T=y+F+Gn zb9|^QU94)Ool1(#8BLi_rOkS^B{peEnzi=SVbMt&Ey}6g>@<)uX?*DwCc4%)raJAd zZFspJt#ynYGqcsJ4I;I~^NC7Vql*bZG5ri^l6jOt(ioHIMjCIsWax}@4-{j0DMB+H zO`FWx5?ez{pUQk&$-H2;xg0s^TGf_>&ZpSEIaE*p)J%q#O&la`rFF(iEo-cd>lsr_ ztvV@I*^_l7XBc`ku@2Q*47eiqeA*Gw8`38v+goi&VKaH7U2X4)hvKv~l1x#=-Xtfno!594>Vnbk`*3aq1w7>_WosIB=- zK-x~twO@0#b@QTHhlx~ONh%X#8VB)$MXd#;=r*uC-@;&4uodBpdKgiiXl5>_?v)hb z#(;qjJwIQ(?vnKz*TrMajOm2}MGB_=tSL!HPh^cW9)_7l#-oeNBAI^GtYcHg=$?4p z?sSBqoYpGQ#o0*5lq!0O-t08e-OMX+3Voc6N=cKnWPVO+OzYJ#RV7#2==yvrlvG#= zK}(NppzXH=YG190K}WK>)q)Y=6#(@xuNiR01oO(Kw?6Ys6sCDK;o&723R+b=8CyD^ zq#~wiK`|+;S3}_@)%MpL6H@S8m#C*D%aIx|BOPu^85;C{tFUWatQ$yPrqzKvN?K%4 zhv0*DwN`Ug7;DbbEl@#99gGCBeH?2=0f?zm5j^O^R0oOw&#=EJM7tb-T z#AUG^t@CDyjd2^Im}CU5JtP&ed{b^4s?8BC?P-MK{TtomdtLAv{G5wcJWv!LbI+w@)BH8b2WQsDkHs= zjPLW<88Urd$U-VV_60Y_R>YAjHq=Fr&`bP7CKRiw)EpD&Q+xWo&ULBM%SuN&v)bsV zyVAR{v~Ag{8O{=8)Q@JR7_|g7W?UJRH0RR$dNQe(Xg|XlMirBOW3v1@o9;s{S|$&A zdd1s2eads%1bW+46+Rt9IUeiarqP5hMO{kkBBmegIgA~X1-aaFN$W}5iJ-nIOLcS6 zHKOa)nK_G^l^}?MW;#{FKV<4<8&)voy{K5NQ%;G)NhP4S_Ygv^DF3Dq1F|^u(E3X( z1rr7n0#}?3*c2%^wzJdFU>+F6s-WNWI|s>#0qOu_C8jcO+S0z4h)NbB^rB z(;DN{8J0n}(Wak(DkbzSdo_W^UE1j9O8?Qnw9mMBAw~r@N&R+4k$h^;- zm$}rfn*3wUN6w<}>dbjY>*Wf|GHqm?vGLhCqqo~A>ERPgAnEq>Nw zGkWD#TYT-}XgzC*8g)qTdZ*T|%9DnfdVR;-l{CWmifH04*WKp4l&`9)gf?l5bBQyD z^S0X-?-Q-dR@eJx17~b1Mb?JMdcW{_=~i^pZ7g2q3kDSGtZ6xAm%9}Jyac91Pse>cGvc{t_lY>GQwp0h z?;qDbb*6MXXdtPWSH6#aE!yPoHDdcdkQNkZ?0lMv*3~QHp40MplPRmhy|J?437nQo ztS|C423$`eb8{av%g;(EdjvfVj>LByVwX8|PGUG`z!FG=VpuF`j5=+r!m?o7S=@Q9 zHs0p0qwjJU3lq-yWT$O;P`avY=@PMuxM^d$+RPdnDBUsK!i8V#7-M~>k+*Lb>Wa84 z*8(l&vlI zONhdEBILNt2q*qftKs;x2_xd9UfQP)d8S1+w)5bBBBTGm`pAdsaws(uQ7>_6BBoDk zL}*7N*Bl=`iD~AL%WNvCHn9b?Ca}c$GtHOYC$ml?U+i$wOkB|2H~BPTx>nICMQ+_O z0<{nHo?a_;ai7>smaGjq|E-G|ZAeGkw*HN?$}I|d$)n6npBe6qviKEkzz)OJY|g-* z>GX=Eh9=IUDQPszICV~DmL^)QyhcS7X7FKhfxp|?WXj6Qz@o~a3Y)bEJpVMk%e6(y zuukPlwK3=x6@%jCXGF1wDM;G%5M80wNxCf;60)ff4OeIZcsOnEl6q`QW4+5;8&jxY zYejC_-I&F;NkAKQ+**@S$z0ZbcZfu!DESNJp}=+*?X`D<;cAQSs+?^Ckud2^V*M*A z?0CAIyn9!QaV6!ID#F$aQ{{65jMv7XEJ$EV(M_eu#l99*VX9f3HXF6Z>VX8yu&89~ zYp%_6rerI{bd|MLe0o{al^?2RbQASQSoMI|Y84$pag0lJ`65p#eYSN(l{5}S^eQF> zph#$r6HhLQSThftGHj9j6I+xp61d4HY=D^^N5wFsX%!krOth&|UYb??OA9Y-y}Dp= zSXk;>&U1alXb7ti*75^owz{;BOBR4;3|m9gg2hnCO3OI&%?=VTK7Ec{o!C%rJ@qtE z=-j}p=CYVsTJTz#+koX|>@ay1^BrU?C$la-05Sc_oR(TpdbP)@|0?RPaTt(kS);{? zadA?iG>SI8O^P-JJEB`pFFm*AC)R)2aDn=>$r*57j!1BKYu0ArM4Q)cS;vIVG9vC@ z#KN~yNhtU>u^_!@0 zV|%p1Gt(M*XiDU8N(V|;krZYr(zYmQCXvbQEZJEp_GDpffZcI>yxOz(n1u*lAwa=q zcF+>06TW^2o@|blbDoeCN(XH(vO z5HH?Q636>Vs+`P`5f5mdbbbQk(yoPe3Zm>VuZMWrK4qhgxXu(Q&0=&+ISD=EBhPwn z-GY=DhCK2ktC)_dP#T&GH0>^kTO-<8XKD4oNFcLTz5q1CW6&g&^Fk)6hh#S7_Ba-B-rWaCdds?`Opb|mu-eJ2v9|X4B7I9-*wdJse z5b!&xO`9n8^Ug|;;ay|TXCci@ue4%HakWIj5`it97ap^sQLb8Qho?|*SoLZ$s!mY- zOonaGH=4z1($olVREDzAAdJd*rz04fiRA?fcFb^5`j9C7xK^p=WC% zE0{(^W#Q1aSqDWYQYHwf5%YD{*gPONO2R~6iAEAOsn~M3y2L3Lczbr#mc%5Buzj@^&DtoqLTZz596E zyYPJ2KHjuNie|GjC40rWxp@#a8Av|6`KP>@t^2)pAuxmVk5Dtunem_dPz7@Ml_9t2 zIqDqGZk;s9(5QkxMceLs4a!t*`2D|?hti_$l&Q6|SQ?uvPs#W&a4-m~$(;F{FJM1! zv#H3t=TVnMI`3i`Pj@F3KBlSDB|QzD{fg=@zM&+mk;>^93G-#uoNXhNJU$~Z3b*5p z>#p9Qz1waOwRq{YODDp6Zk-#qr`vP?L{?`Pqq9z#85-#>le44vwv;VgiSsFEGrkfV zST>kH_dfmHGcReKe~n-&R@6^)|Q8t<6OM?mRaaH=+) zC~@u($pib&0)Eq%e^jFn0YeN%qHRUjyuw09p3e0$X9tPL;i^>Z_&GPALL_WL=8J@;e{bvO zngwyXqB_iqm5sC+b6xz#VcqI2G0c8~c@inIMxvh2dJ%4a%u*w=d}|Gsm$ z8iOk7mVC>-!E7CBa>lYH%a$SHG-*1YVbK7sNkC{-q9y;l-bbCn7;q%wiN3T!L8XY` zAIj;^Tc>P0w`Ae%&tI5HQQUPee&)};2i3L3OSB+3iKG>Vu?E{1)M1qG|jikZ7)1egCf|ZTe2@b0#x67Ukp64-#>K^BB>IFecoqRVJslN!1*3 zlTW{X+T6^fe+;d!3|-|u^;{93xpeswX@v5<@j1NnmHpaKqwWSE7)ud^Rb=V?4 zw2i$^E8?wbbGVA2S~b?l>gm%Yo3hH%tU0#&5Ute}?K)%WvP0H7VLc?j$_jJcosPG$ z%10m?nXHLjV5`bSJXHR(eF$IwH_~crs+mkTvUrkLM4U+fTPFZa zH_^gmqoQ+8+BpFBB>K(^-n6Loofo_Tb%mvbv_h=u+C+k0p<-$AOe4WlolGJwb(zGZ zSVaPk0)Q#K?;ug~dbaODM)HK7Pi1>=PutZ}_SFe(ot~X3Bg^G^x@B6fkIQg|uVE~+ zt^((gGxcaBF`u+fvjEV@uqWKcB`eMvy^=vS!$6qe6MWZDDoG7iQp>_J;xtYbZ=7(5k84h+C`;RP8)~;dBOje3}nX8<2k>+B8gc_dUq^ z=-%67M|Rgy(2G&|O2(SQ=1)wy*#n`qIC zMp|RmSv~2Sht8Aiy@Sq zN)67RX(secGexRRlW;Pd(%XFKSYBglV%(`W;Q1e7NAGI-546VUVNzWX$y zp{#eXmMV3?Oy-;3lc@uhD^Lmn+uV0w)z;q&5*YF8tjEFfnA4cyoo+88(!cu*f>KrI zm)M_0P)cW=A1eVP?4Ce=Mop5K>V>B);CceeNn|x-izt5Ic2D; z_w%w2l+1r;P-?(Dl3s$xSI+$dl^Ny|SivfN>9+g;gK`_;Pz~sZ$>2yaxUYLqlymJr zYO2f}h>~gg!DQ4#ISCb!H1DWa0*5V$C$KCS@SGpvBqGjHL}H0zENL9yO~>uDQJFeSU=<%OV3o^FEw=} zQBh41dNLWJzf!*I=PUVS0)rHp*|yn|4OC8$@>zAYbQXf-mJAl$olF8wKWS()HAWy7 zRGV&lH4#vkB&*7&C?I3pDGHmhd}o;3#cN_WY)Pd0R>%5i8LU3FowjGqq|3zGo5gmf zA)rgm#4SEfrF^Lw&^+()5-)a5`dPU{Ga50B?op5JD1~H#9evg*CSFyoFyZAHmy_F2 zX}}LQ5{fGIsl@A>lfGQPg47p$Sd8UA~S_*bdZ4rGQSVyJX20s;~;-RwI>B#qzXM zITOqyzA;bu=sOJV@W|;Y4Q$^EO4)(R>a<7?iOII24YqJ$hs~1K5Suuqx9zvKE{E=F zJ)AT_(VAZxr>Lv1#FT|~pd%ROQB6ni*~tqIJU})L3`&tK?FO$_^v%rItIEgn-S)TDE(NHAs-_QGGm*HhMSKbA{Pblt}iDp!F!bR zCF;MTIa5dKpEXyEqUP#>DbyxCT<>)9(;9rwn1UQkEnj5}gn`CXlam@IvFpYXJFCIR zSM5=yk?7*fFplu%;6OzDGw!x%hGTjTgW$k3oLa$v&u5AJ42Lq!LNi4Gwi`7%ZTh>1 ze99=KIY1^zvDx`l!>Jm!s4Ft-tQ%`>A>`k5>PlFMO^eOyICDmAf^CCg4uB$^`JC^- zZ1KNmR$4EM-pye>Q>{~!7}afNkp!K6B1~POH?jz4@4ox6R1vR^AVfjGL6b099$xcO z^4Cv)9R#Yg6W#Z|m-7N8b2#C59*}u^fq0A%@(! z03n9W2%$!tjxfh_RIubb4hC)=Rrs-wI~F70x^P3u(-`?rl6*I@$b&}L1Uv#Bd;2a97VgsQNV zt1C?uT?7xWyHbf7jBw)vT2`{Q3%#c|fn%SLs;Evb7v`IwHy);~*WwxQ#^W;WovC1! zZi$ewSEussD8y24wywTDeo@`tXhn`_fcoTpHY=kqShWIE%*q0Ch8Qw9df&U6bSAM= z9C!5{csWCtB4Syf6!#2+LIjiuGph`jblxSg>t>>?rFOMJjBN&^jmv`eU6Jzom*X;$ zSV9*Uqcrrbj654N5>meJ^I0Y|E{|Z&mO>ftD!e1d2QwD}&S$s3*yXCSCd63*9nx}q z!yGll&n?kAXaDE#=k9%HCE^LzNDh0N(R}ef(NkS*DQahyrB8!sfksTvs5agO7f98c zT3V2EJFC{Tsl$w1ov}WUZb1R9Hd=mfI>$q$#ONCAO2_RrpQvT?cOE$(NC0*>Vs>ob zRo)R>yqEi8CYddKF`;ow&m~6t(;O<6Qyf6jbrH@d#n;K1li00u3m{MRev+Q4zg5Q> zGfSeN9=1~Ud%5nNJuA>04cX~T&RZh+a?71M>BR&#V1_A$a)PIJ*A z(9AM%_MMzUFxqo41fN5v81_b&A|Ky^|iEj0sWXhUk1)Mtj z15HXrdl?AHgUejLT`O&Kp$3_o-PEM~fRoMU4}j2lFBQ|ES0~-t38GoMUaKpxVddV& zJEQ%Y;nWi=YExm`qBMsu>S#~*fhQKt9B{IFJG9O|P&Z>5F~W2%Z3Oj$&v_T|iHma0 zqqAF=(@)9~4sp&m^SRr1U^c={qL*g(5;bif=f=VT=JZaw)(@;AYFA^!5h>QxQu5s4 z-6y#`ZTW(LPR9&BmyvWDs}|BQWMOrwU2WtX=OW8c(qS#-bQm(u9i~?0F-tu)?-U1$ zSkI(=j4_0qI_K+B5X%c=sD(;x9uN#P7Ap#7r7<*$W|Wqiiq_D7?8^wdY4b+rk4vrV z?WdOfVD)?s@Z>J5K_%Aor>pdK7U!to3_DO)yW>`R)0$z}k4>~fA%6;^ubX51=_~Wj z=wU=GH}&BcQ%cSDJPwF)CDVYqEnczcgwPAhDQ(t->%FB*+!`I6h{-&h)GRI{H+P?o zR7aZ_P)@Iqn8oudRW2N2JAj>rxWwxjyW?91$^O+iD)&7|spP8+6h+(DnSl%Dp{(4g z7*rAja%o85BJ_e_c0`2!Eba<}(>DV1T#I=X7Bo=`<;RE1G*3{78?s#InRI54)Vx%y z6@ErdL$t_-doM#XmMp#|l^}e|>@4ZgHS&DyV#+t8xEOoB7a?IT4IzilQPecX)0!qg zDMHm5yUd%yISU)gJOEiop*Y7a?F1_xj#zA(qA0B#6e9JQy1)f5eqEV9bSUb zBWS6%Kcho0K^eK0CpyvWh~#5SRKbmx6&`6TLK2cCcCFIqnZtfz!PvRh9E)jVLA2E@ z{I0mLycYIx;TLS?S8*nV6xx|gpALkws`5_T$*F6S=Xxm8*$Tef)S2&M$oWddLRoidMDb>|18wOQc6`c zEDX|UZCLJN$_lQ*c#~v>G8P!LDq7JPpmt z_qW*o9;X^I1`wLCN0;lD$(Jhntvyau`a3mB3S}^w29P#x?ZKohyWtRK>|;P*_3B1X z!r-Fj)4o0_on%i2@i+AvAbDPb_U;{l4DR(dtY)_!Nk zgcgJ}f#Z8Ko2*TAu$#Ora5vD<3q=boA2jO}MOhvj@# zO0}Ox$g&l0iqCD08=q?Dl&Xk(WN7ga`%(kp-G~f;biB_G{4v$TRkYw9$Qo8eq?6zsyQ7ou?qHR%BQ=86G^Rc?%o>5N&|kX| zwljgS80$BJLYtDNWn(5NB7UEr+ts_VN;Wh$%qh~OTnn((oJGv`&q6zg6Kw9uS=`N5 zIKz-_+7QD6YpELLTKEQsotJaR+kZ=7kkAr8`97ScGqAO3M?N?@g@b`S!?@j`bRmZY zaT*bpj4=Q`m5VGNMKHzI(Oj zQ+wISw7?4S*VV8ne=TmQA z9~9q&&k9(-m~)pA{^|-ld8u5O--|=n*Rp!nX8mUE%W=Fo0R!{c`#(=ozj?FDI+rjLS?J5`^;xD z39~@~N-)=4imDvR%{=(SCjMY7(tIn@>Ck=yESo7+PS>w8uNWTt3W8@e>ULcBEL8vv6^o?upYOZOyEGC@TUE)`R=|-i z&=%Ru>PNFP26#6C;%7a>yl}wb0I=K(Uv!sP%0ks@_-bpk2G!RVVslpL%Onfc^_!U& zG<)Q9>S>ksr1BnK^3H$L>NT;KTy(UEs-srOZDvjZzswdyG%IZ=O*f}-gIg^2qd7OW zwFt_eLNothU2*^#%oSH1r<0cy2Zx~ZsnP0OyxB1d#nDLA$enZ4l5|8y@&%C;Ez)+S z>WY+hN8+z{U{D|(AUu0eCrpRr8!a)6+R`O7HWq^|UyBTm7VmKE6Qe9TBvBp3sHOMW zkHSrWR%zfqb zh|=4{S5H>Oq_m-)&#bx*YjP&OsAbka;-pw-Di>K~N-NO8?5HLTu&~Hi>^nk&mGTH{ zRe9aZ8TFjk)YS&F3`)YsuTchJ)Lplp$R+c}RI&bvoOBScnsCA_7ZJ3CNaj<@5=r2C zTCP>bZ)tNRet&qzV^a5Nh2(GoGA zY0e&vZpEV8^7R^}`B$CQTb5F?h2c@#wuZQrVC1XJ&<|bSl@>F+U^V^-3p#mCm1 z=QO`W_B|EzqZ~?%H50+TA5_gdGndIyj5o%#R@ZBMnU>SY30rBJx&K`WH2#7cOGiVk zUH|ko{%9zs7w2Hst|87Lh-?PUXSOWnq$oFVemEku?!w$m3cpKe%tH>4XaQ5go_J5=;_p zX+QajQ4~mpN)cw8Fn`*hbrVgWSa^A44Ry-<>PyjD=ECJr1B4G6vOXOSM@u0w{J~P) zjA45_BJZp0R*2luQggpDHtc%>g$;oqh**%DVe_UGZAi!WPWqHuoESW$o&Lq6qcz)e zz2ac0Qo92Yy<@G@!~ElHE4elnw>Dk2 zx+A%@0H^UG!pdSO_qIcAeYZu`f~>)`Gy7cm1)uz&PYYrAo&}S%^v-`}rV|nd`#-)` zazZU<=|iHBmKRxG0X0b=!B){4_|g3*#Zwp_ z-X9g&9FEYJ+2v)q7PUCmN^cm7oji)4=Cu4PCAl0WYt`i$l7lCo1k@DUeTxLQQ?0BT zxx-$i*WL_2t~cHnB;=29Q}$=41)8C<`(Ai}DOW zW>oDO=aL~Q)|*L2BKxpf!#j*ChP2m}&EJ_bbDw#YiL29`kudUCSbmHGIWeW8`PDB^ zTr{*{{))M5Jib#Wh1(-&(%Sqse5?$4x+)j;RZDtMT~!k@RXStjkxU|4@_s9h#9{{q z@`afBte!<#1xJduFZyw4hl0p46xmn|^gzYxDIy+_SCqL_`jtNPwjScNESu4FN*ViU zij4;9Vg2PZrgOFhbe|i73#;PJ4e_KeoJ)8^aecF^#p@$sdb3@_{k0sgAiMemHQkvY zK6{iC)tzTnkG%4nZKU(H_^eXNa&mJDh#Ef1f6Q($KBHjvTa&~l1^db5(7do| rpd{Ip6=!44)@4l!F$%QZ%`8r&5UOgfVU`A#?+~%HpJb)JC(-`{@riW( literal 0 HcmV?d00001 diff --git a/po/sr@latin.po b/po/sr@latin.po new file mode 100644 index 0000000..3cd8d9f --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,2129 @@ +# Serbian translation of glib +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003 - 2009. +# +# This file is distributed under the same license as the glib package. +# +# Maintainer: Danilo Å egan +# Reviewed on 2004-02-01 by: Danilo Å egan +# Reviewed on 2005-07-08 by: Danilo Å egan +# Translated on 2006-01-31 by Slobodan D. Sredojević +# +msgid "" +msgstr "" +"Project-Id-Version: 2.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-09 20:28+0100\n" +"Last-Translator: MiloÅ¡ Popović \n" +"Language-Team: Serbian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neočekivano svojstvo „%s“ elementa „%s“" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Svojstvo „%s“ elementa „%s“ nije pronađeno" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Neočekivana oznaka „%s“, očekivano je „%s“" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neočekivana oznaka „%s“ unutar „%s“" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Ne mogu da nađem ispravnu datoteku sa obeleživačima među fasciklama sa " +"podacima" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Obeleživač ka „%s“ već postoji" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nije pronađen obeleživač ka „%s“" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "U obeleživaču ka „%s“ nije određena MIME vrsta" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "U obeleživaču ka „%s“ nije određena privatna zastavica" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "U obeleživaču ka „%s“ nisu određene grupe" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Program „%s“ nije registrovao obeleživač ka „%s“" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Ne mogu da proÅ¡irim komadnu liniju „%s“ sa vezom ka „%s“" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pretvaranje iz skupa znakova „%s“ u „%s“ nije podržano" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ne mogu da pokrenem pretvaranje iz „%s“ u „%s“" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Neispravan niz bajtova u ulazu koji pretvaram" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "GreÅ¡ka pri pretvaranju: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Nepotpun niz znakova na kraju ulaza" + +# ovo pretpostavljam da se odnosi na delimičan UTF8 zapis +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne može pretvoriti rezervu „%s“ u zapis „%s“" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Adresa „%s“ nije apsolutna adresa pomoću „file“ Å¡eme" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Adresa lokalne datoteke „%s“ ne sme sadržati „#“" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Adresa „%s“ je neispravna" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime domaćina iz adrese „%s“ je neispravno" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Adresa „%s“ sadrži neispravno naznačene znake" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Putanja „%s“ nije apsolutna putanja" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Neispravno ime domaćina" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "GreÅ¡ka pri otvaranju direktorijuma „%s“: %s" + +# bug: plural-forms +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ne mogu da obezbedim %lu bajtova za čitanje datoteke „%s“" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke „%s“: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datoteka „%s“ je prevelika" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ne mogu da pročitam iz datoteke „%s“: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Ne mogu da otvorim datoteku „%s“: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Ne mogu da saznam osobine datoteke „%s“: neuspeÅ¡an fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Ne mogu da otvorim datoteku „%s“: neuspeÅ¡an fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Ne mogu da preimenujem datoteku „%s“ u „%s“: neuspeÅ¡an g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ne mogu da napravim datoteku „%s“: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Ne mogu da otvorim datoteku „%s“ radi upisa: neuspeÅ¡an fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Ne mogu da upiÅ¡em u datoteku „%s“: neuspeÅ¡an fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Ne mogu da upiÅ¡em u datoteku „%s“: neuspeÅ¡an fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Ne mogu da upiÅ¡em u datoteku „%s“: neuspeÅ¡an fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Ne mogu da zatvorim datoteku „%s“: neuspeÅ¡an fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Postojeća datoteka „%s“ se ne može ukloniti: neuspeÅ¡an g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Neispravan Å¡ablon „%s“, ne sme sadržati „%s“" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablon „%s“ ne sadrži XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Ne mogu da pročitam simboličku vezu „%s“: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Simboličke veze nisu podržane" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Ne mogu da pokrenem pretvaranje iz „%s“ u „%s“: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ne mogu da čitam bez obrade u g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Preostali nepretvoreni podaci u baferu za čitanje" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal se zavrÅ¡ava delimičnim znakom" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ne mogu da čitam bez obrade u g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Ne mogu da otvorim datoteku „%s“: neuspeÅ¡an open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Ne mogu da mapiram datoteku „%s“: neuspeÅ¡an mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "GreÅ¡ka u %d. redu, %d. znak: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neispravan UTF-8 tekst u imenu — „%s“ nije ispravno" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s“ nije ispravno ime " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s“ nije ispravno ime: „%c“ " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Nisam uspeo da raščlanim „%-.*s“, Å¡to je trebalo da predstavlja cifru unutar " +"znakovne reference (na primer ê) — možda je cifra prevelika" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Znakovna referenca se ne zavrÅ¡ava tačka-zapetom; najverovatnije ste " +"koristili ampersand bez namere da započnete entitet — naznačite ampersand sa " +"&" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Znakovna referenca „%-.*s“ ne predstavlja dozvoljeni znak" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Uočen prazan entitet „&;“; prihvatljivi entiteti su & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ime entiteta „%-.*s“ nije poznato" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entitet se ne zavrÅ¡ava tačka-zapetom; najverovatnije ste koristili ampersand " +"bez namere da započnete entitet — naznačite ampersand sa &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument mora početi elementom (npr. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ ne predstavlja ispravan znak nakon znaka „<“; ime elementa ne može " +"njime početi" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Čudan znak „%s“, a očekivan je „>“ znak radi okončanja oznake praznog " +"elementa „%s“" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Čudan znak „%s“, očekivan je „=“ posle imena atributa „%s“ elementa „%s“" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Čudan znak „%s“, očekivan je ili „>“ ili „/“ radi okončanja početne oznake " +"elementa „%s“, ili možda atribut; možda ste koristili neispravan znak u " +"imenu atributa" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Čudan znak „%s“, očekivan je početni navodnik nakon znaka jednakosti pri " +"dodeli vrednosti atributa „%s“ elementa „%s“" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ nije ispravan znak nakon imena zatvorenog elementa „%s“; dozvoljeni " +"znak je „>“" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element „%s“ je zatvoren, nema trenutno otvorenih elemenata" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Element „%s“ je zatvoren, a trenutno otvoren element je „%s“" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prazan ili sadrži samo beline" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Dokument zavrÅ¡en neočekivano neposredno nakon otvorene kosougle zagrade „<“" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokument zavrÅ¡en neočekivano sa otvorenim elementima — „%s“ je poslednje " +"otvoren element" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokument je zavrÅ¡en neočekivano, a očekivana je zatvorena kosougla zagrada " +"koja zatvara oznaku <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument zavrÅ¡en neočekivano usred imena elementa" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument zavrÅ¡en neočekivano usred imena atributa" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument zavrÅ¡en neočekivano usred početne oznake elementa." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument zavrÅ¡en neočekivano nakon znaka jednakosti posle imena atributa; " +"vrednost atributa nije navedena" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument zavrÅ¡en neočekivano usred vrednosti atributa" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument zavrÅ¡en neočekivano usred zavrÅ¡ne oznake elementa „%s“" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokument zavrÅ¡en neočekivano usred primedbe ili uputa za obradu" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "oÅ¡tećen objekat" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "interna greÅ¡ka ili oÅ¡tećen objekat" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "nema memorije" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "dostignut je limit pretraživanja unazad" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "obrazac sadrži stavke koje nisu podržane za delimično poklapanje" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "interna greÅ¡ka" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"reference na prethodno poklapanje ne mogu biti uslov za delimično poklapanje" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "dostignut je limit rekurzije" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "dostignut je limit broja praznih podniski karaktera" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "neispravna kombinacija oznaka za novu liniju" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "nepoznata greÅ¡ka" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ na kraju obrasca" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c na kraju obrasca" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "nakon nepoznatog znaka sledi \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"ovde nisu dozvoljeni izbegavački nizovi za promenu veličine slova (\\l, \\L, " +"\\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "brojevi nisu po redu u {} brojaču" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "brojevi su preveliki u {} brojaču" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "nedostaje zavrÅ¡nica ] za klasu znakova" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "neispravan izbegavački niz u klasi znakova" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "opseg je neispravan unutar klase znakova" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "nema ničega za ponavljanje" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "nepoznat znak nakon (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "nepoznat znak nakon (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "nepoznat znak nakon (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "klase imenovane POSIX-om su podržane samo unutar klase" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "nedostaje zavrÅ¡nica )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") bez otvaranja (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "nakon(?R ili (?[+-]brojeva mora da sledi )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referenca na nepostojeći podobrazac" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "nedostaje ) nakon komentara" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "regularni izraz je predugačak" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "ne mogu da dobijem memoriju" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "podaci iza tvrdnje nisu zadate dužine" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "neispravno zadat broj ili naziv nakon (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "uslovna grupa sadrži viÅ¡e od dve grane" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "očekivana je tvrdnja nakon (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "nepoznat naziv POSIX klase" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "nisu podržani POSIX kolacioni elementi" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "prevelika je vrednost karaktera u \\x{...} sekvenci" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "neispravan je uslov (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "nije dozvoljeno \\C u podacima iza tvrdnje" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekurzivan zahtev se može ponavljati beskonačno" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "nedostaje zavrÅ¡nica u nazivu podobrasca" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "dvoimeni podobrasci imaju isto ime" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "nije ispravno zadata \\P ili \\p sekvenca" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "nije poznat naziv osobine nakon \\P ili \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "naziv podobrasca je predugačak (sme da ima najviÅ¡e 32 karakatera)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ima previÅ¡e imenovanih podobrazaca (sme ih biti najviÅ¡e 10000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "osmobrojna vrednost je veća od \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupa sadrži viÅ¡e od jedne grane" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "ponavljanje DEFINE grupe nije dozvoljeno" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "neujednačene NEWLINE opcije" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "nakon \\g ne slede zagrade sa nazivom ili vrednošću različitom od nule" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "neočekivano ponavljanje" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "prekoračenje koda" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "previÅ¡e pokrenutih radnih prostora za prevođenje izvornog koda" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "nije nađen prethodno provereni i povezani podobrazac" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "GreÅ¡ka prilikom pretraživanja regularnim izrazom %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE biblioteka je prevedena bez podrÅ¡ka za UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE biblioteka je prevedena bez podrÅ¡ke za UTF8 osobine" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "GreÅ¡ka pri prevođenju regularnog izraza %s kod znaka %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "GreÅ¡ka pri optimizovanju regularnog izraza %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "očekivana je heksadekadna cifra ili „}“" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "očekivana je heksadekadna cifra" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "nedostaje „<“ u referenci simbola" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "NedovrÅ¡ena referenca simbola" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "referenca simbola je dužine nula" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "očekivana je cifra" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "neispravna referenca simbola" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "odlutalo zavrÅ¡no „\\“" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "nepoznata sekvenca izbegavanja" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "GreÅ¡ka prilikom obrade teksta za zamenu „%s“ kod karaktera %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Navod ne počinje navodnikom" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Neuparen navodnik u naredbi ili drugom citatu iz ljuske" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Sadržaj zavrÅ¡en neposredno nakon „\\“ znaka. (Radi se o tekstu „%s“)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Sadržaj zavrÅ¡en pre nailaska na odgovarajući navodnik za %c. (Radi se o " +"tekstu „%s“)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Sadržaj prazan (ili sadrži samo beline)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nije uspelo čitanje podataka iz potprocesa" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nije uspelo stvaranje cevke za vezu sa potprocesom (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nije uspelo čitanje iz podređene cevke (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nije uspelo pristupanje direktorijumu „%s“ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nije uspelo izvrÅ¡avanje potprocesa (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nije ispravno ime programa: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Nije ispravna niska — član vektora u %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nije ispravna niska u okruženju: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nije ispravna radna fascikla: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nije uspelo izvrÅ¡avanje pomoćnog programa (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Neočekivana greÅ¡ka dok su u g_io_channel_win32_poll() čitani podaci iz " +"potprocesa" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Neuspelo čitanje podataka od potprocesa (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Neočekivana greÅ¡ka u select() pri čitanju podataka iz potprocesa (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekivana greÅ¡ka u waitpid() (%s)" + +# za sada ovako, možda grananje, umnožavanje? viljuÅ¡kanje ;-) +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nije uspeo fork() (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nije uspelo izvrÅ¡avanje potprocesa „%s“ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nije uspelo preusmeravanje ulaza ili izlaza potprocesa (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nije uspeo fork() potprocesa (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nepoznata greÅ¡ka pri izvrÅ¡avanju potprocesa „%s“" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Nije uspeo da pročita dovoljno podataka iz cevke ka potprocesu (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Znak van opsega za UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Nije ispravan niz u unosu za pretvaranje" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Znak van opsega za UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Upotreba:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPCIJA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Pomoćne opcije:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Prikaži opcije za pomoć" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Prikaži sve opcije za pomoć" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Opcije programa:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Ne mogu da raščlanim celobrojnu vrednost „%s“ za %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Celobrojna vrednost „%s“ za %s je izvan opsega" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Ne mogu da raščlanim realnu vrednost dvostruke tačnosti „%s“ za %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Realna vrednost dvostruke tačnosti „%s“ za %s je izvan opsega" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "GreÅ¡ka pri raščlanjivanju mogućnosti %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Nedostaje argument za %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Nepoznata opcija %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Ne mogu da nađem ispravnu datoteku sa ključevima među direktorijumima " +"pretrage" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Nije obična datoteka" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Datoteka je prazna" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Datoteka sa ključevima sadrži red „%s“ Å¡to ne čini par ključ-vrednost, grupu " +"ili primedbu" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neispravno ime grupe: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Datoteka sa ključevima ne počinje grupom" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neispravno ime ključa: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Datoteka sa ključevima sadrži nepodržano kodiranje „%s“" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Datoteka sa ključevima nema grupu „%s“" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Datoteka sa ključevima nema ključ „%s“" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Datoteka sa ključevima sadrži ključ „%s“ vrednosti „%s“ Å¡to nije UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Datoteka sa ključevima sadrži ključ „%s“ nerazumljive vrednosti." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Datoteka sa ključevima sadrži ključ „%s“ nerazumljive vrednosti." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Datoteka sa ključevima sadrži ključ „%s“ u grupi „%s“ nerazumljive vrednosti." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Datoteka sa ključevima ne sadrži ključ „%s“ u grupi „%s“" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Datoteka sa ključevima sadrži znak isticanja na kraju reda" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Datoteka sa ključevima sadrži nedozvoljen niz isticanja „%s“" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vrednost „%s“ se ne može smatrati brojem." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Celobrojna vrednost „%s“ je izvan opsega" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Vrednost „%s“ se ne može smatrati realnim brojem jednostruke tačnosti." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Vrednost „%s“ se ne može smatrati istinitosnom." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Prevelika brojčana vrednost je prosleđena u %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Tok je već zatvoren" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Radnja je prekinuta" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Neispravan objekat, nije pokrenuto" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Nepotpun niz bajtova na ulazu" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Nema dovoljno mesta u odrediÅ¡tu" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Nije podržano pokretanje uz mogućnost prekida" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Nepoznata vrsta" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s vrsta datoteke" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s vrsta" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Neočekivan, preran kraj toka" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Neimenovano" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Datoteka za radnu povrÅ¡ ne sadrži Exec unos" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Ne mogu da nađem terminal radi pokretanja ovog programa" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Ne mogu da napravim fasciklu za korisnikova podeÅ¡avanja %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Ne mogu da napravim fasciklu za korisnikova MIME podeÅ¡avanja %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ne mogu da napravim datoteku radne povrÅ¡i %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Proizvoljne odrednice za %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "uređaj ne podržava eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "uređaj ne podržava eject ili eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "nije podržano izvlačenje medijuma na uređaju" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "uređaj ne podržava start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "uređaj ne podržava stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Ne mogu da radim sa izdanjem %d za kodiranje GEmblem-a" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Neispravno zadat broj tokena (%d) u kodiranju GEmblem-a" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Ne mogu da radim sa izdanjem %d za kodiranje GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Nije ispravno zadat broj tokena (%d) u kodiranju GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Očekivano je GEmblem za GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Radnja nije podržana" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Sadržano montiranje ne postoji" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Ne mogu da umnožim preko direktorijuma" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ne mogu da umnožim direktorijum preko direktorijuma" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Ciljna datoteka već postoji" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Ne mogu da umnožim direktorijum i njegov sadržaj" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Deljenje nije podržano" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "GreÅ¡ka prilikom deljenja datoteke: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Ne mogu da umnožim specijalnu datoteku" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Data je neispravna simbolička veza" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Nije podržano smeće" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Imena datoteka ne mogu da sadrže „%c“" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "nije podržano montiranje diska" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Ni jedan program ne može da otvori ovu datoteku" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Nabrajanje je zatvoreno" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Brojanje datoteka ima neispunjenu radnju" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Brojanje datoteka je već zavrÅ¡eno" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Ne mogu da radim sa izdanjem %d za kodiranje GFileIcon-a" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Ulazni podaci za GFileIcon su loÅ¡i" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Tok ne podržava query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Nije podržavano premotavanje toka" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Sasecanje nije dozvoljenu nad ulaznim tokom" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Sasecanje nije dozvoljeno nad tokom" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nije ispravan broj tokena (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Ne postoji vrsta za ime klase %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Vrsta %s ne podržava GIcon sučelje" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Vrsta %s ne pripada ni jednoj klasi" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Broj izdanja je loÅ¡e zadat: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s vrsta ne podržava from_tokens() na GIcon sučelju" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Ne mogu da radim sa datim izdanjem kodiranja ikonice" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Ulazni tok ne podržava čitanje" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Tok radi jako dobro" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Nema dovoljno mesta za adresu utičnice" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Nije podržana adresa utičnice" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Ne mogu da nađem podrazumevanu vrstu monitora za lokalni direktorijum" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Neispravno ime datoteke %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "GreÅ¡ka prilikom dobijanja podataka o sistemu datoteka: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Ne mogu da preimenujem koreni direktorijum" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "GreÅ¡ka u preimenovanju datoteke: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Ne mogu da preimenujem datoteku, jer ona već posotoji" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ime datoteke je neispravno" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "GreÅ¡ka prilikom otvaranja datoteke: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Ne mogu da otvorim direktorijum" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "GreÅ¡ka prilikom uklanjanja datoteke: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "GreÅ¡ka prilikom premeÅ¡tanja datoteke u smeće: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ne mogu da napravim direktorijum za smeće %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Ne mogu da nađem koreni direktorijum za smeće" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Ne mogu da nađem ili napravim direktorijum za smeće" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ne mogu da napravim datoteku sa podacima o smeću: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ne mogu da poÅ¡aljem datoteku u smeće: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "GreÅ¡ka prilikom obrazovanja direktorijuma: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sistem datoteka ne podržava simboličke veze" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "GreÅ¡ka prilikom obrazovanja simboličke veze: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "GreÅ¡ka prilikom premeÅ¡tanja datoteke: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Ne mogu da premestim direktorijum preko direktorijuma" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Nije uspela izrada rezervne kopije datoteke" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "GreÅ¡ka prilikom uklanjanja ciljnje datoteke: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Nije podržano premeÅ¡tanje između montiranih uređaja" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Vrednost osobine mora biti različita od NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Nije ispravna vrsta atributa (očekivana je niska znakova) " + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Nije ispravno proÅ¡ireno ime osobine" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "GreÅ¡ka prilikom postavljanja proÅ¡irene osobine „%s“: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "GreÅ¡ka prilikom postavljanja stanja datoteke „%s“: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (neispravno kodiranje)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "GreÅ¡ka prilikom postavljanja stanja opisivača datoteke: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Nije ispravna vrsta osobine (očekivana je uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Nije ispravna vrsta osobine (očekivana je uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Nije ispravna vrsta osobine (očekivana je niska bitova)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Ne mogu da postavim ovlašćenja za simboličke veze" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "GreÅ¡ka prilikom postavljanja ovlašćenja: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "GreÅ¡ka prilikom postavljanja vlasnika: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "simboličke veze moraju biti različite od NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "GreÅ¡ka prilikom postavljanja simboličke veze: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "GreÅ¡ka pri postavljanju simboličke veze: datoteka nije simbolička veza" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "GreÅ¡ka pri postavljanju datuma izmene ili pristupa: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux kontekst ne sme biti NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "GreÅ¡ka prilikom postavljanja SELinux konteksta: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nije uključen na vaÅ¡em sistemu" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Nije podržano postavljanje osobine %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "GreÅ¡ka prilikom čitanja datoteke: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "GreÅ¡ka prilikom pretrage unutar datoteke: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "GreÅ¡ka prilikom zatvaranja datoteke: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Ne mogu da pronađem podrazumevanu, lokalnu vrstu monitora datoteke" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "GreÅ¡ka prilikom upisa u datoteku: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "GreÅ¡ka prilikom uklanjanja stare rezervne kopije veze: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "GreÅ¡ka prilikom obrazovanja rezervne kopije: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "GreÅ¡ka prilikom preimenovanja privremene datoteke: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "GreÅ¡ka pri sasecanju datoteke: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "GreÅ¡ka prilikom otvaranja datoteke „%s“: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Ciljna datoteka je direktorijum" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Ciljna datoteka nije obična datoteka" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Datoteka je izmenjena nekim drugim programom" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "GreÅ¡ka prilikom uklanjanja stare datoteke: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Nije ispravno određen GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Zatražena je neispravna pretraga" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ne mogu da sasečem GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Veličina izlazne memorije se ne može promeniti" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Ne mogu da promenim veličinu izlaznog memorijskog toka" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "Ima viÅ¡e memorije za upis nego Å¡to ima mesta u datoj adresi" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Zahtevano je premotavanje na deo pre početka toka" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Zahtevano je premotavanje na deo nakon zavrÅ¡etka toka" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "montiranje ne podržava „unmount“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "montiranje ne podržava „eject“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "montiranje ne podržava „unmount“ ili „unmount_with_operation“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "montiranje ne podržava „eject“ ili „eject_with_operation“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "montiranje ne podržava „remount“" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "montiranje ne podržava nalaženje vrste sadržaja" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "montiranje ne podržava sinhronizovano nalaženje vrste sadržaja" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Ime domaćina „%s“ sadrži „[“, ali ne i „]“" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Izlazni tok ne podržava upis" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Izvorni tok je već zatvoren" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "GreÅ¡ka u razreÅ¡avanju „%s“: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "GreÅ¡ka u obrnutom razreÅ¡avanju „%s“: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Nije nađen servis snimanja za „%s“" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Privremeno ne mogu da razreÅ¡im „%s“" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "GreÅ¡ka u razreÅ¡ivanju „%s“" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Neispravna utičnica, nije pokrenuto" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neispravna utičnica, pokretanje nije uspelo zbog: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Utičnica je već zatvorena" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "pravim GSocket iz fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ne mogu da napravim utičnicu: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Zadat je nepoznati protokol" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ne mogu da dobijem lokalnu adresu: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ne mogu da dobijem udaljenu adresu: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ne mogu da sluÅ¡am: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "greÅ¡ka pri povezivanju na adresu: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "greÅ¡ka u prihvatanju veze: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "GreÅ¡ka u povezivanju: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Povezivanje je u toku" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "GreÅ¡ka u povezivanju: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ne mogu da dobijem greÅ¡ku na čekanju: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "GreÅ¡ka u primanju podataka: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "GreÅ¡ka u slanju podataka: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "GreÅ¡ka u zatvaranju utičnice: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čekam uslov utičnice: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "GreÅ¡ka pri slanju poruke: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage nije podržano u prozorima" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "GreÅ¡ka pri primanju poruke: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Nepoznata greÅ¡ka veze" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "SluÅ¡anje je već zatvoreno" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Dodata utičnica je zatvorena" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ne mogu da radim sa izdanjem kodiranja %d za GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Očekujem jednu kontrolnu poruku, dobio sam %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Neočekivana vrsta podređenih podataka" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Očekujem jedno fd, dobio sam %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Primljen je neispravni fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "GreÅ¡ka pri čitanju iz unix-a: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "GreÅ¡ka pri zatvaranju unix-a: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Koreni sistem datoteka" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "PreÅ¡ka pri upisu na unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstraktna juniks utičnica adresa domena nije podržana na ovom sistemu" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "disk ne podržava izbacivanje" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "disk ne podržava eject ili eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Ne mogu da nađem program" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "GreÅ¡ka pri pokretanju programa: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Adrese nisu podržane" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "nisu podržane promene pridruživanja za win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Nisu podržane promene pridruživanja za win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Nema dovoljno memorije" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "GreÅ¡ka u programu: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Potreban je veći unos" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Podaci nisu ispravno zapakovani" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Nije ispravan niz u unosu za pretvaranje" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Dostignut je najveći broj podataka u opsegu" + +#~ msgid "do not hide entries" +#~ msgstr "ne sakrivaj unose" + +#~ msgid "use a long listing format" +#~ msgstr "koristi dugi format spiska" + +#~ msgid "[FILE...]" +#~ msgstr "[DATOTEKA...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Ime entiteta ne može početi znakom „%s“ ; znak & započinje entitet; ako " +#~ "ovaj znak ne označava entitet, istaknite ga pomoću &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Znak „%s“ nije dozvoljen u imenu entiteta" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Prazna znakovna referenca; mora da sadrži cifru kao na primer ˫" + +#~ msgid "Unfinished entity reference" +#~ msgstr "NedovrÅ¡ena referenca entiteta" + +#~ msgid "Unfinished character reference" +#~ msgstr "NedovrÅ¡ena znakovna referenca" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Neispravan tekst u UTF-8 zapisu – predugačka sekvenca" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Neispravan tekst u UTF-8 zapisu — karakter nije početni" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: neuspeÅ¡an fork(): %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: neuspeÅ¡an chmod(): %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "Ne mogu da promenim ovlašćenja datoteke: potproces okončan signalom: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Ne mogu da promenim ovlašćenja datoteke: potproces silom okončan" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Nije podržano pretvaranje iz skupa znakova „%s“ u skup „%s“" + +#~ msgid "Incorrect message size" +#~ msgstr "Neispravna veličina poruke" + +#~ msgid "Socket error" +#~ msgstr "Mrežna greÅ¡ka" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "Nepodržana podeÅ¡avanja kanala" diff --git a/po/sv.gmo b/po/sv.gmo new file mode 100644 index 0000000000000000000000000000000000000000..eac4fc7a80c0fe390a161f18735ee3a82bec4b06 GIT binary patch literal 43437 zcmdU&37DK!mG@sa(8#`poi`0hcSEX42!@ai0wf`l%_QuBSlw0CU34u?EuA!o3xW!Y z2qKCLFb?P_GLEBWMjf2djEEQ8t8U&x~3xXrT&w~eo-}U%o zk3aMHYmd)5)x|p)d@k{i_V@F^!?+&=uLPHayTE(EJop579C+DjL2wE<0S5f3h)td2>d=sl;9W&)%_aqSa1T=^V>j`{{b)$ehpj)uA-5m%PpYj_91XN z`0t>~?fe6^RQFVH0Q14#>s-E|Q%ICxW`PV_ke*#qhA99Z4qYWTk73={up56s2 z-oJYMHMpAlxyyopp&VQWYMk5%svZx345{ET5S9tP3yKa$k(u~o38;27L8X5iDE|34 zsCNATJQ6&HN~yl5gFFg0g5v8}`1|*P>i-{sO84v)ZagmqZ|8m(6#xI&KR;@v8~5jf zs&5Na{%-UBA&cH9K2ocH+qe*%x;{y7js=|fQYJs&(6tbiwj zH-M`5ec++sUxUi;i=g5?1EQ#&hkINGs(!ot{ma2qxPLcz1o&z2c<>t_tQhP;{7kVG!&9*MS#wuMyvnM1;tO-f-3h;5Yh*K z3N8o#2h4$IZ*l!G465JW05a5rN5K&MH?SX^v(?2v3sgV65LCXmgQCNupvwIi7=qse z&jSy9f#c8hpvJ`{sCwT4ik}|@Rqww5Rn9j-@z(*{T)O4p0QY5Z5qLK!I`0ETub+aV z%c0v{e+_`*r|lqB4;mmtAow__`X0a_QMy4;{I&s9`4iyj;N76|dkj1r{1T}AegGZ> z9(bwC?fH#7w=gr^{_MEocn7F@ z{Q-Cs_$d%p3%&uW-v=*u^;`!sbc5?bmA@BMzkME5`3GO&uPlKw*KZBy@lm7n1t6aQu zK;^pwR6mS>;+I!|bHPVI(SIMP{{9Il`pmuB#a{v{-^)P7-vb^Ez7ABq-T`X7eGXLn zeh!`s9<$S>+v>3aN*>+=sz3e_RJ`CC*Wb%QrQZlDzX}+FcY_Cm?*~r+KL(x!egjmz z!>)DpS_-QFHiK$k8$1zwGbsN4Gw@LGpF#1(Pr+lsQ+K&~tpvs2H-MtUJ3#T_XTg)e zZ-I*cTTt~m_Jyw81)$1X4W0syfFbyDj}LkL1bA}5_ym`N&&s>|mEc0|ulDz^0;^98 zf_H*P@cifz$L|9k7kOOf@qCXLd)x{>hjdqf8W+Q$+Fb_enqUf~i-X5ONDwS4c)kQh z&-a4jO*$?$?0Ffj5IxF?cJe{C@+AeutDC-!BJGb%w_)K(+f; za2fbM@LuqTpxXDcilgt_z?IxT2CDy`1Xb_FRhO;=D*gkY%Kr!`dVLq9D}sY+ZhpNU zRQ*2+s-6D@D&P5ar+*BCE4Y6Il>GQU2nmCeCR~5t3M&40K*^_h*Sq|-gWI@&C3qqD zPv92tVsdZJ_%3F;H^q>!8y8C)f`@yXE37 z0yVC-fb=T{1UhtJmbaC47?81`1%N_`hO2peFt9R)<0w567K&S zTnhHT)a7$6csBR%2UYG5z~$hvFLU$tc2MO#0Imj~0M~#^Zg%pk4eEX`cr5r!P<(dy z%N-w|3m(k59=D7b`@DT79{{Dbl9G%VvRqty-)$?v}A^11oq2Lps z%6;ao?)^!i+OZ83y>13Ymp}ISRZ#NanXhpCFa(~&{l(y6U3 z{2+J=`1hd7{V{kHc)%+ipPv9O<9-czGI#^1`rZesoKO1u?|{c~fB35$z0Uy8;l2cp zfcJx<`_pf8csY16_wNCBfkoy;c zqR;K%5#ZZF_2&n{5d5rv{vY51?w@gwtHjxOhctGK@mJRZCURD0eFE(RY5PX`Ztqt6#q z{jUO*PYcv|eLJ`Y{A*D3Jm5_(-cnHQ-U=%J5m4z~3=VflI+-?sIhC1fH#U z;921NLGjo3z+=Hf-|Xr&0E%z6gFChVTU?fnFJ z82BS_F8C{O4tUgCvC)C2fX@bt;PGG$JP5oER6Xwnp9g*hRK8Dpo9q8G!I1ka!K1(% zz~_Q@f@;TGK=s!Lz~jKLgO`Fo2SwM7_q%?pfh)Lw3wR>P<-}l@MLh_AGmg% z4~jqX;7Q3w{Nh4<7MOCl8l_ z;+q>m#eW~Dc76j?KmRAFat`?;$B*+t)q4@R09*&^eH9en-s17CpyGW1JPrIbxElN^ zH~mkgta`=?|fYo zMhW`;Ibk)|mxI?6j^TRHzmp966N1JhA|m(+LBBiwdtKi_cslog2Yyix{O@Y;v;O)) zAOCC+)(d{^pI^-V^ZmP*der#cLO7B8gM2)}E4cqC_@{)!xW1LJnebP-Cwz>sg8Ng! zVNkzwz<+d?!GT;KOn3$N%fYXKBjCS+|3Zj==<@$wS^vnB; z7kj)H{2<|4;(Qg{0KN=7nQ#=>Pk`G9Um@uCY6rmqyt|8_-)V#+xqdxCW4TPYnQ*v& z|1+*%ONf3AE>;kp!TUE8uHpJPANNYI;;$8dDPcF^<^I{lddTl0!kAq-{Y#g7e4OX_ z=a+&^Pd4Bt{WHNUiFW}g`P=5Y>C^o;_m}wV=YntG{x1mw{@Hz8>op=bHg8v4dsRA?9^qA7p9~&L z(C;*G&|L;oTt9>Bmk^ft_pbpz=ik2`yp;Q0{@uAA^}0D@B5ozDCj63+Ba9NBMbJ<4`+3AY$;aQs{bGOp8m>Q1xSgQiPYKT@%;$ZX@J7M} z_g4}Akf7hc6aK@lSl9FZAGi()=M#$D>-QtVcL>V~H}h-++(6K858-bJuOz&Xpx-VB z!Hqt>zcm<0-Q4M~59)~bDV}S78|!%fe4hQBa3;^+2v!OIOwjMY9GE`&E`MDEpCtSz z;XWU$Payn-e=nHh zub<8P0^u{<&-c$x;C{Qmegr(6@N`1cKl`Ldfoz3!fB!13pGnZ~yM&_&pCI%RzCqA$ zh;R_j$imj=MqOKjb!{MnG_YRvu|NLfuSZ;>3dMnI_uE>$Gd?P>7DmKDWy;7;~ zrgYx*uj~)wH!H$&E3D?HEZuN%v|J1GwXj$zR*SV(Sj$(7v(C9SR!s73Qp}nCD?+Q* z?=k;My;;mu&q`Pks_?wpSS%!!5Iy==_jhf9nilqavz%;4`om!0ylr8<5e}Sp^%=Qq z3gyvqs~J|?%~m*E^faZs;i+&i7z}rpTVwThE38ixYohc(uqGU?*T<{*#yF81;icO) zSZ%3jqnIyDg~dJPW~&*j8E&@JPhq=O-V+w;)jYk>tdEQr>B>T(QEWDgu49|+iHUln zMVa*)O{RIxsb;HK4b~J2JoIUJJR&+3f;H88n{KR^!fLTvZ%l=a;`QxvgQ%@~IMJw& zkhPI+cca`Yid>a^V-$XAjll)^$$YtzAFe=ISBtPYksm1rYbGWt<&k`=OeMBV2%5`- zHBCw{yN4q*&)$j|Gj)aqmz))>X|)>V;Wi~2dr-ZI;p|?iN>rTs#}Q%Zb}=S>tzOG* zzI5Zp;DY?fczeQzM;Mn{qS`e6!hEg26^_&=rosYk9%+dH^+{S6-=^dAe$$*N(z1$` z5~WZJi($J-Zksl2T1zptQhBu9aP4Ne6?ikhxt!1?Nj^ovrv0;zQu9gg*xN9 zk>5@K<_jU*GrFr>-^C!W)ryr}dbq1nt`&E|XK<#k&@2+Q>br_`gQH}rTq}gBn)}BT zQh-G?0M*r%GTa4`o8k^VEYrYP_+`^X(dNU?rEvY)D!f*GDshX24YSUD9ZWI%*gM9M zfL(L1!YBy`b!RAvfFzD@G%VPLER)5`R0mha5lkpa)-N<>v)hcY$i{5c87UcN9w}Db zh%ML3EqJzkLzjW5Of<$I9X-HULvRi=klbiQGB8mUn+P9`#whYczJcT|)Z3B=ZZz6p zm0)vxs4QKqa;;UA6zLgFnNJiO)pAp8(v&o7PE}#iaT_hlsnuxLkTJz@{U#G#8)_5n z*7g>>Tn#RCj2$wwRm(LZHO2FJm99o76M$m+8PFtii9u2umFPwq?^u^xymWstmZc&z zilt(MXEN!O~DBy>E*cFm!HMxbUgylmniX|q^mtW@f?6=Ai` z6jLdWi&duTZOIvi9!;!5wI%~D$vvKSMD&^z49WIp3sTrjUTc+GQ(-PFHb?Rk)G*E= z-wYRUw<5T(j+7WNc?}hr6-G7V=y8jQNEy0WBx$UsExnJ%Z>dqQrfL+ijw)h2!n~rk z#xntF+ZES-&Dqw?^DADHQ7RK-8V6zD{AOP&x(zJPw=kF$Y(@B@o(!`mlWH^d#&uHgT$iY)CCiZ-Fe4pqN*NmTj8)h@Cf1Eeo~G6QJ4#w) zqz=Ict#YN}s*rPIX*c6mZL8#|WYi?p5shbtMlD3ybnIs0p=hjN%5=7AkqDs#(QW1Y z=9#OLe7)+cRf5$M@| z5lw1dT94Q2yK7V#p@mjU@A2F(E7mp|+~-F|ifI2x5Bk;5ASP7Z>tWPIKO6bwL+Yh6 z(o4zsE|1+prppVhkkXHR!L`xlVc?35>Y_*JCH^53iq%wVjtTUMscx@hT`Kjm(3Z}u zHu~u<^=`D-vTW51w-RI2m+Gk)l{{+9m@-Id&Z+m+{J37C{S4PxR59t-#?!CslU>Nf zG$nODobU7iFm8VGDwRtlJLBfraOe`jrd$n`9`90*rRk|^bz1-?q}J3ORk^d6_?`5H zj;_zV>*!`Q=VI9iQOLLQsY)a-s;Dga(KIhLP#e1uFMiG%E%f}*LG?_OY4!BkqG8ef z)0@FqirSy4sejIDoh5vprRcPboAruS*vTpzV`yTjhnf7ujm2Eg2*@boEJSrjK}|2? zJ7^g_o=!>hIpgx}Yd4l_?L8*Oi+ftB+C(vU>a?3gTj}7YC}tH~SSd0hcwr)2M7f&o z!zebAsMzRIUTO`|<*i>*%=AX2Nvvi*ffpK0Svk6NCAxJy=sP()^NvN-NTWP~>`YYw zOHb3}K}WCn^-h=aoHl{pHc^I8M^TPP+n8xIp-WMh(mJ2%hxHtb9g_vI+;d5*`IZww zT~ns&=AvsvSIal_ENWVUNE9@R6BX=3re3yS1ykOWidEX_lo*^;0(yG~A!Lg3ZxS(} z6^9;Le~G1F!e|MBDb5CL5h*yjt6kGz9vEa*OW*QH#E4X%d~9Tpn(qw`Zkg{RsgT9S z;f;C)tC>lah2bd6m-&TM9O?h1g3~Nb)MQMRUZ<{Qb(&yVS^8ldXeR?qc%krD>BMuBWVTJ zS?}&Kdt^6OtT0a9!ZKf-p4Eibv&zv;YSz0}*~ng+A{fmY@65rTW$WBg6UpgVB4KSP zrAb)QnC(UJYTldL9J#C9_ljy7XWTW`0iKoV)`H&7E~Rm7(y7^OpK4Y!73*v@Uh7*Z zZG2=bY+}NOL&owLxrR}5SuvW~J6_GC*7=D&WMILmXDvB?AGsBMrZZ<5t&=M(%VMqG9vz#WGkUv?k`6wxG~SqD<3uB= zXPmgNJ9^A=(Go4A)O8!M7~;(^tyK=zEiIACGINPTGc=f93Del)8c5PO4jskXt9QM4 zjTxhS1BP_x4)Eo&_Lo^LVLImyh_i?5N|knVtXHPfqc^8&BeRcf={urJ#+m40*^y!y zJuW6|k}(#6G=d@Q78~%pGrmJUTb{c3q8zK7*gPt$4}=}*x7S|7 zkL_UIo|WzAW;&`2w88rA=E}JcBNB7UCO4&I4Pr8Y;u*4HK$ zS%f%4RR7iew&;~vt^b<-U<1xYjXI=vwOwhIl{CWmifH04*WG5kl&z|) zgf?l5bBWW#c$-~|cZrr+tLuHEhB3A%Mb?JM2JZ=7za8Cl2j0xsVL+j7H7%p;GUoxn zN?=L^l{W(9jASmFh!LlWCA)b>!vWWJ^K`^UkHMa?A%6J0hX>q*qB3|Ln zSoPuSFj_9OzKDGcn4Y4{&3w!(KP{owBj{;xB(~!ycA7(b62ln-7D6Hv!^EXga@tk_ zw_wYyxZ_-Hy!Ec5?{XN6C7iR#PMUjAx~kUFDPkpYi?zveqh8ZM$;NPw3-9b0#lKUF z+qWBaMcfr@ftK&Jw&kug2G`qCr_ zjduNScW%y?5QXnV$T2M=ocKenhU1G37!f1&P?tKynI_rT&V%1aM*nB^kqy=5kZLBP zUgFY3OqbS((2ho~IX-$mq?tLF*+jnFU@ah@z(QxwG+TO?%-Xfs+2N#_xFFj%@ibz( zR?;a+ZrK!|f8zuV5qV zFig#64D6UrH{~m6;y6u7qglqOb6RF;qLt@0NTM)<50eZ0-Kvil@vIEYFAS=%X-?qT zr|ERpCMhF7l`GZ8pmQolikF`e#U7?0Y12cnN#04iEfx}5Qz05Q$pJiEZ0(kMY_73R z_txejR4`wWn|3$XL)#>vojcCgWK=Sfb=Mst0Vz`ULRlzSyNmYPyTNcZr@Ja=n?NK? zI+IxcN(wukPAAXqN-?gayi`TldSR-3ya401F(?iRmQr+6Dsr-~MOBz+lqYSCTETlD z!7?l=nSaf-xo1kYQcRZdtzy%wH(dEq)r@YU{s>+Vh^%*m5=H_y`9vFFrpHk+%xLmLV~7d16wZVEap$={Vl+fv2y6NNGFzS6$E6j3W(@No%3+acoa} z>!_!RLT3iXn~O6u}c{z<~zukPG()aA7XmXoLns^z1m~d-HW<=3M5AxCNY-BNE(M&DvHt!PX16tz|;T zjfnY|G3{)6j0+7`Y0u0}%Va2_bn_|sNo1A@b6LIY(CFs`s8c>ZdMpae}R#`z(^BMxwYl(f0y%kJscQvbb%Aegabe+1Rl@47Qo6 z-$aEQ+ob}}Ol#z!DUriPI#9Zbq%f{X+oGVEL`!bBlAV@fsveCEFdMhSsy%&=Srox5 z1Sr_d4su~S;p=zcX-$(Qu44H5Z1)!QgzK=_YPN~BgkbwveYbWnhBB9VuS(NB%|3Da z0;x>L{JXv0ZXiBA3wC)gb9S+_RHIkC6!g^zp?70ymt0xFb{C`fLfc2^QefJr)!Ez~ ziT8w+5;I#fNIz0;iPqftN|fsm=Q~)%!|r~zi#W|I*x?oS3$l^C6j~VByp(H{08ya4dS1Un)#B}CF5S~qn}NJQH1 zS@e$`a^-Xks2$O^HOtg*NJbDio!EBtx-+C#SM-YRY2hY?yj@Q!g3KjvlUFunJxiu4US;K+V}CcZTk6dF;-YTNC91nV3O76(v$|DarP@b+$TsztDCx>1}MA zOV`#G8K?&6bnLm3hNeam!#2V=GbRb;A`=BNt#;cKvr!qEh+*xEiStPIN<>l7^;&f_ zH4}qw(;)k&;{=|wZAL-tWOXG`RxUod&&+s1&(|5=4JI_S(wt2{PW2)~)A7JW+;l8$ zF17s=!DY6hlCi-CO~%a{udJGI63!x9Taf^RkCC;js$ zy7l^O(?qc^hf~x;8VSCQbVPxN^_mTy%Q54P`pj)=NlXyI)mygi*sx{u(9qB|!OoN! zjyXYdRIu|xH(hwiP8U?z@itsUJ=VgUMXap@caC&Ri=1-;)$Q!0NBMLF+OVyVYnzj( zGYg^AYASlk7Y{cS8+BjpATBEAWxxCx;HXz#Cf{P1E4o9DYu<35V%Wa#*pWw1X;tEh z#T|OKCbEQSL{uDyw#_H~B*BoqKMiYi>%`8xS<{4r$-IZODgxb_a1gkk-z; z#*@x{ysh0>K5QRvu}O+XqdlSZiZgTbAlhUg`RwMO^k%l~d+kDC2I(H5VwN-GKlh;u z(G4i=!lr-KsI$1}J%a zMqm_fg`3x2zEOL(-5_f6(rK4Ygm>IJGj2z>$M%VOm0gT(b;`_8EABQqTf(-bY~f0b zPcfVEmDs?d!T7ni>Bp9NN$dD)1XHnsZlWU=5#>GbA?}<}lu_u#z|$gq=T_Bt=R`aL zQtu+8YQu>VXAY4(uHM$Tmior;~IpaCF2ez1m}Pb+GHxYfRpDwlK;! zN>ANYf%dSMr_Rumd|!~Yn)Dg__67TSFN(OR9h^QxN{v<2`Wa%hYqO1E<@@Nfu7P9` z6m~w#QM_VWDD`Zq{OMy%TlKcd=PoG`)3&Y5)~6GwvVms@iO1oxRP6A^n@}P0Y(nOX zgob}_{&UTO7+p~vrp2m{v>0<<05=h&(vtlLf;*R-b57vBzJ7$ui-0&~R7Bg=Nu7u^ZP#5g@v!p^vPgF3!_1c>e!ln9 zT7b^Yr?xCmASo;RAj#hi*=RPCelk$a?DXak z?VS9(&f#hds-$!Irh9|gI;zRyMGF@#Ld0p(bT-4J0rE*eXjP&q`@G%F; zX@i1F5s`f;ray0;vhB>0iM2m|VM~hSF6;b^pL+|cYm1j?k>DhfJPe~Xw!x&V9I^Ja zzxONm7h!9!2u|s1hC72v>?4q<*Q`GCYe}1~(|XTjCdYz!9Qr{bE^rnjIuXW%d*x+v zYMWHeoSS^Q_0!fyUHV6ELm_vW`_z-Iml(F^Y%A*fBuAt|nb=w9P*8 z+zvK8Ef2S&Yr>4-%GN}#IeETxw0dL6ZY;XIc1a5t4=tK=p%dFVSy+~v5${awj%7Xv z(HO-$w#xj=Nj%jN8JAn@KmT7IE*mbl=4`F-t#Bo`j#(YsNNvJyo2$;kVPco725RBF zRpH{n6>~U4pgvk=Q_pBPUN6Yn{kt3?kYhQ=ax$3T%o$|Q4+w0l)xL)`0ieQSuEu4e zBAK8hsrk;w^a8!;TiKU$4~N2w(Cte59`?z~H4Ni2_AGj!}*#&OJJOxl$Y|UOpe0@XnDJZ4WyZOCke19ZtdG!kQtZ4 zC-yyz1C#d*b2~|3hm0R|yQMKgIO4VV&JlOF=!kEd5@q|VhU1NW4^3j=R)tt17f zG}(=_auKtVO5{|be4NEKeiO_@;&Z*JLG$_7V8h!^!RXrNva2peQ!+i!7$&fj~Cqm1KI>onHm|l zWKzJ@NUKZO-1pEp8(fR6=6HRg%on7U;1YVx$ZAi>XdDw#r9Mhmq8CMX)1&R@wLgF$ zQ-Z6538?Y(*#k|sD6?nT`lCkEY6UIgy#Y3^pG(a=DSH3T>8+24QOlZCtxK6nLr19( zf`QE>@LOfyLrrtqm9v&cCW!1g1#xv}pWL5V5T~>*kM^Edi>;(e@F|LH9&?NB*^19B zFw&Kwi5IqP=Sp((X`&4!^WlfdXwOQ{Czxe)w_Rn{iPmBIm6dE&FWxo^=fh4jy6b=ZPM55w!XRBiJJ>+Ii?5D-C8#$NH`LVTIs2$K?p}MAByQC!TyUZgmrz<`&1~8UU>9*f#72 zuT&R~M3{Z#Wfr%HMs3SDJ|TmcIvSx*s*3fL*CzZNOG!?3n4ZwufgCpZ8MQ`dB8=-y zgrRT;o2O|J${|D61REN3+uFRq>my8B2w+L*{3M4}n5fofH}HTUfuS0|04XOC>B($uWQAzeGi+`QN#rE1qErt*g)3Dq;-p)lrVf(EKYZN8L!TRjz}Q z8VmH6oiikvGZb#H0-|Sbyv|$*UpuzSs`j`uhr!TJkMmlNZg zuk4#S?Q}xTrmqS}QeQ(^B3mW&IE^UuIj=|$x#6b=XuKFuYdS)~(MJs9RtKmEGj$`| z`Ah?4HZcN4trCTdKc!w8xg>oMLz2#NJc^9bX$o-4#dC{BWUA~VZZ^q`5ZdD{`R0VCz$kZ?Un$cS*niVh;34J4-NoN&0UXSLhXzSFgHg4968JTZ-TKPBk zQv#yD(iuhL-aZoR;0q1y_?=h*qds<4BtT~l=w4VvF{(^DsT)zS<9UWM^{Q!B;Y@L) z2OIs%)7r(b^wNYvr}a(dZI7;z3Z>~H>R`X&mSrniwLfPfYDj0?HfAL_KUVdoGk<3a zRo5&^oQY-=C#FC2yC#b==Yj84)V_yC5xg1Fb>^L3+szm;Uh{Pk51pA#i%X|_`EP3_ zt~;V6;?wQ+_J{PUq`0X8A);`8&rm^E_AEtYCDVGIp)Xkl|ODAx` zgcmPX4LV-OlJEkpw_2=!(~G}wJX!p;upLVd zWsbm*_dPORx^|;zx@D9U-dY%aZDnd(_Bf1n>8OiY0om8fm1GFZn!}lq^U*%iQMK;U z!5C5$eS|soDOFSvQ*)&po3+O@knGguHu!ZnyqX<9O@q{t8Pi(ZJqt6bxFHlzlrzL^ z&^V{oY7t0>P+57JAq1xfHEJjVc8ad;O6;1?I61J%D~TKN$x}!&15I4^V~msv8?(G# zGDCc}7HM!&C2eNRp>IU>QIoXA+Vu6VP0{i_KSSQmtek4<3~}-8*oI8aXVIdZn&>v& zJJInR)lOdST0t4Vv+UuI?3i70w-`*7?|MESm8s)5e#Z=L7N$BxXd zvd;49R~>v7!D_2Hjx~{u`1-Dwb9v0FqWvJTWyI;Jk^L`>4g#@Z?U%2E*zT}Yy0zdq zihkt4lC!ndT{dV=!U&6|=Pg(%p2C9Em4Gv)nSl>oGF6z_dt_WTMjPCz!X*Q!zcoq~ z!Q{mGA%*>B>a<;xAaUARCQ1(hbnTfM%%F+qf3LIp5#5{F*tuKggxgb8se}Yy;*GhJZ3ljame_LNBljS#Nu8O?j56MSNmDF zL?V6H$Q$HJV6$1N=*%oz{AQ2jm=rURH-qSf?J$v34^x4CMpm}fAsv--P4OAnJRT*A zrdT$AxFb?LXIOtmIw9N3y2gJhas4?dVw3%4tEfxQ?p1?qFQzRxm}exVqPn(ZpXbAK zJE+uswc%T#Z4BAvB{50R_o%60qpcB7!*%n}O}Z**~9`IttO z#)%84myE@_TWxMOV$*{R;@uZs+Du&$?yGkZSh-N2Xd+xaLN_1gko{ zC3$F)tY?!`OB2^%pGqWjJ$HXW_ia0M_e_3E>%``>pH1-L0HlPsPh z(jD79M!J{wAA^C>GfU?a@^h1@2t!%qVBfu%vWF`=Xb87JWY~@l&@0>2<&JB?A`xty zYT{3b90rk6;B|tceO8cX{vmlhPd1$jsChm)y9EP=Gl|>u$UYcW0rnXxnxT$viEIh+ zW|P?_=-3C7P3AY+G|_>O?k1?VdzH}iknTF6@s^FO*w}|E8?1>=doq2-yXj=e)@~Rx z8&y$)8H=%ZKT>-9j9F`7vX1p;pMbw~6^jTPwY9+>tcdv*&$d(WX61givxj zu&lzEpV)sYRnNzDJCwX}id8yGZ^T_kO0k9}4kVmpl#EzD7nyiuX36dvG(n~sr{BaI zOo7t~G)Z65BIeuVQU$I=$$6!K*%T0k$(OZeH26gUH;Z9UY8#`ff7Msj+stY_J`N zS+d-4F{UpL+ZZI_NLLY?G5z++{Uu;3#PF|uXne4g-e0R0;#{V~`d0O2RU*IHA=2Q| zy=}|N*mLb>sTp!!9qruhD8T4R{wM<(hqdhwk57`ZPMA4&FMj*ZoNYn&C0XxX22jLo z^woWPuZwp7h(-}D*udMy^JO-Lcvp}j_^CYFZUoPzlZk{g^ng`rr0mWmvE3!`h-k!g zgW!{k-)(T{*nd*foEFV?7?h)0Mq{%}Z`mSQ{wgvJ_TB1MbCi}^DWxCh*$B69FNbAZ z+OZ7owT_8RS9XR>Zn(_E!AFX+rK_^TQ=_)m7ole*I)-LiUY6rO_&`?vXH4U%CJpTK zja(D!j%l9y{9Cherco}AI)d$&NH!bIh*jTkzlWh*LtTIz_O@fC=M=n19hO@_yi3EN zyk8(($c`^fZMI69Hlud*Fxw0GLKSCX#5~xsg9}XkMwBKVFuB)5ml=DP@JpK=f(CYp zER#GfNGg^@?(lN;*nb=yKBLaE87muH! zCX`LuVCg+WX`S7o`h#iGag@K8UJL2p9yS`AD73GJZJ=(@O1MP3ZY*ycdk@R0>t=-= z&Ov439d@QBBs7Pax#~K`LcFua43DxuY5NkY8at+J^U|QsAX(mpc(HglD+r&R**?p3>=YS0AEQx0R)0*5c|5ed zh^7ykr$uF7&Q7Xf>ATLBn4I}EiO0m5YD}$UA$b|4M24!ea*FDjD!mnKtdHjzN93AI zMd@mK6Qi8k7ic6ikEoiWwby6UwU#(i40FE0xyTvqEM^;|n}4v};}(NdB&s^ zHDfY2(t0*6O&V7Y-0n`h(Ev$*>f_ff_CZDBg!YN*e701c-1o3=i4!3yQl`sEdja8G zv@4mlBU5OKW=74Jm|I-jL=kl3#Prw>bvTa7{tk3}6pPg9H}OkKL`Up>@Qu_9K5vV@ zTw&Tz`AOi3l&d7@$TU9vMtRIC2j^_*$fn}}9RC*GhBcOJy(vqkq)&gz+QMtuCQvfU zY*bN{8%L>Ic?h^yGa(S@ceSPVSI}Eb)#tY+lt!X8ZJ;&=XGdDLx zn!hZ3CYYR=&&*Al!tGcb{-dj3HE`68W|aMQW22Fj}?aCk(Yk&sAE_Ah8CSFy(kZgHGNgp)2A1^ zj`tVQKCh3sO&_{f|HefH+5K@g1YB22%30jq9G9QPnO~%ck)gbG~@d{17cTS%|u?<)Zh4UL++> z3!l(i2r=D@-j%@U9IOf49qZWpKx49CXq zD=X6&BaI+29;mi%{OdE*?hQz@um6r1!IGIF-Bz34=!6F#wGm*6S?0Ip)isv!l-A$R9@*JMKsS88rHkq=%U>&KjB|UtYR>2c5o6 z*Su*uiq!`fM{sceS!PvDRib{6L2QD{A0~6c8PD)4g!kBvyTv2u+2&2Wo$~CN7*|{$7*4Z z$18h0-`e%Lo$)gjSts3~jsDFNgNKcjc7C5fvZt3IQXDVJdY$+)QyH-vGjO{n_#&ST jQGR5(sY8nJo&!?S2<8{ literal 0 HcmV?d00001 diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..76e3c54 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,2229 @@ +# Swedish messages for glib. +# Copyright (C) 2001-2010 Free Software Foundation, Inc. +# Christian Rose , 2001, 2002, 2003, 2004, 2005. +# Daniel Nylander , 2006, 2007, 2008, 2009, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-06 00:28+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Oväntat attribut \"%s\" för elementet \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributet \"%s\" för elementet \"%s\" hittades inte" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Oväntad tagg \"%s\"\", taggen \"%s\" förväntades" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Oväntad tagg \"%s\" inom \"%s\"" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Ingen giltig bokmärkesfil hittades i datakataloger" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Ett bokmärke för uri \"%s\" finns redan" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Inget bokmärke hittades för uri \"%s\"" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Ingen Mime-typ definierad i bokmärket för uri \"%s\"" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Ingen privat flagga har definierats i bokmärket för uri \"%s\"" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Inga grupper inställda i bokmärket för uri \"%s\"" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Inget program med namnet \"%s\" registrerade ett bokmärke för \"%s\"" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Misslyckades med att expandera exec-raden \"%s\" med URI \"%s\"" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konvertering frÃ¥n teckentabellen \"%s\" till \"%s\" stöds inte" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Kunde inte öppna konverteraren frÃ¥n \"%s\" till \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ogiltig bytesekvens i konverteringsindata" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fel vid konvertering: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Ofullständig teckensekvens vid slutet av indata" + +# fallback syftar pÃ¥ en sträng +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan inte konvertera reservsträngen \"%s\" till kodningen \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI:n \"%s\" är ingen absolut URI som använder \"file\"-schemat" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Lokala fil-URI:n \"%s\" fÃ¥r inte innehÃ¥lla en \"#\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI:n \"%s\" är ogiltig" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Värdnamnet i URI:n \"%s\" är ogiltigt" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI:n \"%s\" innehÃ¥ller ogiltigt kodade tecken" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Sökvägen \"%s\" är ingen absolut sökväg" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Ogiltigt värdnamn" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fel vid öppning av katalogen \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Kunde inte allokera %lu byte för att läsa filen \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fel vid läsning av filen \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Filen \"%s\" är för stor" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Misslyckades med att läsa frÃ¥n filen \"%s\": %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Misslyckades med att öppna filen \"%s\": %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Misslyckades med att fÃ¥ tag pÃ¥ attributen pÃ¥ filen \"%s\": fstat() " +"misslyckades: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Misslyckades med att öppna filen \"%s\": fdopen() misslyckades: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Misslyckades med att byta namn pÃ¥ filen \"%s\" till \"%s\": g_rename() " +"misslyckades: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Misslyckades med att skapa filen \"%s\": %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Misslyckades med att öppna filen \"%s\" för skrivning: fdopen() " +"misslyckades: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Misslyckades med att skriva filen \"%s\": fwrite() misslyckades: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Misslyckades med att skriva filen \"%s\": fflush() misslyckades: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Misslyckades med att skriva filen \"%s\": fsync() misslyckades: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Misslyckades med att stänga filen \"%s\": fclose() misslyckades: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Befintliga filen \"%s\" kunde inte tas bort: g_unlink() misslyckades: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Mallen \"%s\" är ogiltig, den fÃ¥r inte innehÃ¥lla ett \"%s\"" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Mallen \"%s\" innehÃ¥ller inte XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Misslyckades med att läsa den symboliska länken \"%s\": %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Symboliska länkar stöds inte" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Kunde inte öppna konverteraren frÃ¥n \"%s\" till \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Kan inte göra en rÃ¥ läsning i g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Överbliven okonverterad data i läsbufferten" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanalen slutar med ett ofullständigt tecken" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Kan inte göra en rÃ¥ läsning i g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Misslyckades med att öppna filen \"%s\": open() misslyckades: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Misslyckades med att mappa filen \"%s\": mmap() misslyckades: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fel pÃ¥ rad %d tecken %d:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ogiltig UTF-8-kodad text i namnet - inte giltig \"%s\"" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" är inte ett giltigt namn " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" är inte ett giltigt namn: \"%c\" " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fel pÃ¥ rad %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Misslyckades med att tolka \"%-.*s\", som skulle ha varit ett tal inuti en " +"teckenreferens (ê till exempel). Talet är kanske för stort" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Teckenreferensen slutade inte med ett semikolon. Troligtvis använde du ett &-" +"tecken utan att avse att starta en entitet. Skriv om &-tecknet som &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Teckenreferensen \"%-.*s\" kodar inte ett tillÃ¥tet tecken" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tom entitet \"&;\" hittades, giltiga entiteter är: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitetsnamnet \"%-.*s\" är okänt" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Entiteten slutade inte med ett semikolon. Troligtvis använde du ett &-tecken " +"utan att avse att starta en entitet. Skriv om &-tecknet som &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentet mÃ¥ste börja med ett element (exempelvis )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"\"%s\" är inte ett giltigt tecken efter ett \"<\"-tecken. Det fÃ¥r inte " +"inleda ett elementnamn" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Konstigt tecken \"%s\", ett \">\"-tecken förväntades för att avsluta taggen " +"empty-element \"%s\"" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Konstigt tecken \"%s\", ett \"=\" förväntades efter attributnamnet \"%s\" " +"till elementet \"%s\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Konstigt tecken \"%s\", ett \">\"- eller \"/\"-tecken förväntades för att " +"avsluta starttaggen för elementet \"%s\", eller möjligtvis ett attribut. Du " +"kanske använde ett ogiltigt tecken i ett attributnamn" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Konstigt tecken \"%s\", ett startcitationstecken förväntades efter " +"likhetstecknet när värdet av attributet \"%s\" till elementet \"%s\" " +"tilldelades" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"\"%s\" är inte ett giltigt tecken efter stängelementnamnet \"%s\". Det " +"tillÃ¥tna tecknet är \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elementet \"%s\" stängdes, inget element är öppet för tillfället" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Elementet \"%s\" stängdes, men det element som är öppet för tillfället är \"%" +"s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller innehöll endast tomrum" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentet tog oväntat slut efter ett öppningsklammer \"<\"" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumentet tog oväntat slut dÃ¥ element fortfarande var öppna. \"%s\" var det " +"senast öppnade elementet" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentet tog oväntat slut, en stängningsklammer föräntades för att avsluta " +"taggen <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet tog oväntat slut inuti ett elementnamn" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet tog oväntat slut inuti ett attributnamn" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentet tog oväntat slut inuti en elementöppnande tagg." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentet tog oväntat slut efter likhetstecknet som följde ett " +"attributnamn. Inget attributvärde" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet tog oväntat slut inuti ett attributvärde" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Dokumentet tog oväntat slut inuti stängningstaggen för elementet \"%s\"" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentet tog oväntat slut inuti en kommentar eller behandlingsinstruktion" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "skadat objekt" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "internt fel eller skadat objekt" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "slut pÃ¥ minne" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "bakÃ¥tspÃ¥rningsgräns nÃ¥dd" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "mönstret innehÃ¥ller objekt som inte stöds för delvis matchning" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "internt fel" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "bakreferenser som villkor stöds inte för delvis matchning" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "rekursionsgräns nÃ¥dd" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "arbetsytans gräns för tomma understrängar nÃ¥dd" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ogiltig kombination av nyradsflaggor" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "okänt fel" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ pÃ¥ slutet av mönster" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c pÃ¥ slutet av mönster" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "okänt tecken efter \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "skiftlägesändrade escape-tecken (\\l, \\L, \\u, \\U) tillÃ¥ts inte här" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "tal är inte i ordning i {}-kvantifierare" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "tal för stort i {}-kvantifierare" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "saknar avslutande ] för teckenklass" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "ogiltig escape-sekvens i teckenklass" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "intervall är inte i ordning i teckenklass" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ingenting att upprepa" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "okänt tecken efter (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "okänt tecken efter (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "okänt tecken efter (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-namngivna klasser stöds endast inom en klass" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "saknar avslutande )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") utan öppnande (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]siffror mÃ¥ste efterföljas av )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "referens till icke-existerande undermönster" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "saknar ) efter kommentar" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "reguljärt uttryck för stort" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "misslyckades med att fÃ¥ minne" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-assertion är inte av fast längd" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "felformulerat tal eller namn efter (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "villkorsgrupp innehÃ¥ller fler än tvÃ¥ grenar" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "assertion förväntades efter (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "okänt POSIX-klassnamn" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-sorteringselement stöds inte" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "teckenvärde i \\x{...}-sekvens är för stort" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "ogiltigt tillstÃ¥nd (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C tillÃ¥ts inte i lookbehind-assertion" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "rekursivt anrop kan gÃ¥ in i en oändlig slinga" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "saknar avslutstecken i undermönstrets namn" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "tvÃ¥ namngivna undermönster har samma namn" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "felformulerad \\P eller \\p-sekvens" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "okänt egenskapsnamn efter \\P eller \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "undermönstrets namn är för lÃ¥ngt (maximalt 32 tecken)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "för mÃ¥nga namngivna undermönster (maximalt 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "oktalt värde är större än \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-grupp innehÃ¥ller fler än en gren" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "upprepning av en DEFINE-grupp tillÃ¥ts inte" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistenta NEWLINE-flaggor" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g följs inte av ett namn inom klamrar eller ett valfri (icke-noll) tal " +"inom klamrar" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "oväntad upprepning" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "överflöde i kod" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "fyllde över kompileringsutrymme" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "tidigare kontrollerad refererande undermönster hittades inte" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fel vid matchning av reguljära uttrycket %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteket är byggt utan stöd för UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteket är byggt utan stöd för UTF8-egenskaper" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Fel vid kompilering av reguljära uttrycket %s vid tecknet %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fel vid optimering av reguljära uttrycket %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal siffra eller \"}\" förväntades" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "hexadecimal siffra förväntades" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "saknar \"<\" i symbolisk referens" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "oavslutad symbolisk referens" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "symbolisk referens med noll-längd" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "siffra förväntades" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "otillÃ¥ten symbolisk referens" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "felplacerad avslutande \"\\\"" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "okänd escape-sekvens" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Fel vid tolkning av ersättningstexten \"%s\" vid tecknet %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citerad text börjar inte med citationstecken" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Ensamt citationstecken pÃ¥ kommandoraden eller annan skalciterad text" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Texten slutade efter ett \"\\\"-tecken (texten var \"%s\")." + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Texten slutade innan matchande citationstecken hittades för %c (texten var " +"\"%s\")." + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Texten var tom (eller innehöll bara tomrum)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Misslyckades med att läsa data frÃ¥n barnprocessen" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Misslyckades med att skapa rör för kommunikation med barnprocess (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Misslyckades med att läsa frÃ¥n rör till barn (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Misslyckades med att byta till katalogen \"%s\" (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Misslyckades med att köra barnprocess (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ogiltigt programnamn: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ogiltig sträng i argumentvektorn vid %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ogiltig sträng i miljön: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ogiltig arbetskatalog: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Misslyckades med att köra hjälparprogram (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Oväntat fel i g_io_channel_win32_poll() vid inläsning av data frÃ¥n en " +"barnprocess" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Misslyckades med att läsa data frÃ¥n barnprocess (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Oväntat fel i select() vid läsning av data frÃ¥n en barnprocess (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Oväntat fel i waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Misslyckades med att grena (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Misslyckades med att köra barnprocessen \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Misslyckades med att dirigera om utdata eller indata frÃ¥n barnprocess (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Misslyckades med att skapa barnprocess (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Okänt fel vid körning av barnprocessen \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Misslyckades med att läsa tillräckligt med data frÃ¥n röret till barnets pid " +"(%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Tecknet är utanför intervallet för UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ogiltig sekvens i konverteringsindata" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Tecknet är utanför intervallet för UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Användning:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[FLAGGA...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Hjälpflaggor:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Visa hjälpflaggor" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Visa alla hjälpflaggor" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Programflaggor:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan inte tolka heltalsvärdet \"%s\" för %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Heltalsvärdet \"%s\" för %s är utanför intervallet" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan inte tolka dubbelvärdet \"%s\" för %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Dubbelvärdet \"%s\" för %s är utanför intervallet" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Fel vid tolkning av flaggan %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument saknas för %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Okänd flagga %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Giltig nyckelfil kunde inte hittas i sökkatalogerna" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Inte en vanlig fil" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Filen är tom" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Nyckelfilen innehÃ¥ller raden \"%s\" som inte är ett nyckel-värde-par, grupp " +"eller kommentar" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ogiltigt gruppnamn: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Nyckelfilen börjar inte med en grupp" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ogiltigt nyckelnamn: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nyckelfilen innehÃ¥ller kodningen \"%s\" som inte stöds" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nyckelfilen har inte gruppen \"%s\"" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nyckelfilen har inte nyckeln \"%s\"" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Nyckelfilen innehÃ¥ller nyckeln \"%s\" med värdet \"%s\" som inte är UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Nyckelfilen innehÃ¥ller nyckeln \"%s\" som innehÃ¥ller ett värde som inte kan " +"tolkas." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Nyckelfilen innehÃ¥ller nyckeln \"%s\" som innehÃ¥ller ett värde som inte kan " +"tolkas." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Nyckelfilen innehÃ¥ller nyckeln \"%s\" i gruppen \"%s\" som innehÃ¥ller ett " +"värde som inte kan tolkas." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Nyckelfilen har inte nyckeln \"%s\" i gruppen \"%s\"" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Nyckelfilen innehÃ¥ller kontrolltecken i slutet pÃ¥ en rad" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nyckelfilen innehÃ¥ller ogiltiga kontrollsekvensen \"%s\"" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Värdet \"%s\" kan inte tolkas som ett tal." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heltalsvärdet \"%s\" är utanför intervallet" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Värdet \"%s\" kan inte tolkas som ett flyttal." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Värdet \"%s\" kan inte tolkas som ett booleskt värde." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "För stort räknevärde skickat till %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Strömmen är redan stängd" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Åtgärden avbröts" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Ogiltigt objekt, inte initierat" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Ofullständig flerbytesekvens i inmatning" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Inte tillräckligt med utrymme i mÃ¥let" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Avbrytningsbar initiering stöds inte" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Okänd typ" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s-filtyp" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s-typ" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Oväntat tidig end-of-stream" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Namnlös" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Skrivbordsfilen angav inget Exec-fält" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Kunde inte hitta terminal som krävs för programmet" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan inte skapa programkonfigurationsmapp för användare %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan inte skapa MIME-konfigurationsmapp för användare %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan inte skapa skrivbordsfil för användare %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Anpassad definition för %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "enheten har inte implementerat utmatning" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "enheten har inte implementerat eject eller eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "enheten har inte implementerat pollning av media" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "enheten har inte implementerat start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "enheten har inte implementerat stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan inte hantera version %d av GEmblem-kodning" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Felformaterat antal token (%d) i GEmblem-kodning" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan inte hantera version %d av GEmblemedIcon-kodning" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Felformaterat antal token (%d) i GEmblemedIcon-kodning" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Förväntade en GEmblem för GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Åtgärden stöds inte" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Infattande montering finns inte" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Kan inte kopiera över katalog" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Kan inte kopiera katalog över katalog" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "MÃ¥lfilen finns" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Kan inte kopiera katalogen rekursivt" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Splice stöds inte" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Fel vid splice av fil: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Kan inte kopiera specialfil" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Ogiltigt värde för symbolisk länk angivet" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Papperskorgen stöds inte" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnamn fÃ¥r inte innehÃ¥lla \"%c\"" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "volymen har inte implementerat montering" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Inget program är registrerat för hantering av denna fil" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Numreraren är stängd" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Filnumreraren har kvarstÃ¥ende Ã¥tgärd" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Filnumreraren är redan strängd" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Kan inte hantera version %d av GFileIcon-kodning" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Felformaterad inmatningsdata för GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Strömmen saknar stöd för query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Sökning stöds inte pÃ¥ strömmen" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Kapning tillÃ¥ts inte pÃ¥ inmatningsströmmen" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Kapning stöds inte pÃ¥ strömmen" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Fel antal token (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Ingen typ för klassnamnet %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typen %s implementerar inte GIcon-gränssnittet" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Typen %s är inte klassad" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Felformaterat versionsnummer: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Typen %s implementerar inte from_tokens() pÃ¥ GIcon-gränssnittet" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Kan inte hantera angiven version för ikonkodningen" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Inmatningsströmmen har inte implementerat läsning" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Strömmen har kvarstÃ¥ende Ã¥tgärd" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Inte tillräckligt med utrymme för uttagsadress" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Uttagsadressen stöds inte" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Kunde inte hitta standardtyp för lokal katalogövervakare" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Ogiltigt filnamn %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fel vid hämtning av filsystemsinformation: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kan inte byta namn pÃ¥ rotkatalog" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fel vid namnbyte av fil: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Kan inte byta namn pÃ¥ filen, filnamnet finns redan" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Ogiltigt filnamn" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Fel vid öppnade av fil: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Kan inte öppna katalog" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Fel vid borttagning av fil: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fel vid kastande av fil: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kunde inte skapa papperskorgskatalogen %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Kunde inte hitta toppnivÃ¥katalog för papperskorg" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Kunde inte hitta eller skapa papperskorgskatalog" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kunde inte skapa information om kastad fil: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kunde inte kasta fil: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fel vid skapande av katalog: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filsystemet saknar stöd för symboliska länkar" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fel vid skapande av symbolisk länk: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Fel vid flyttning av fil: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Kan inte flytta katalog över katalog" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Misslyckades med att skapa säkerhetskopiefil" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fel vid borttagning av mÃ¥lfil: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Flyttning mellan monteringar stöds inte" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Attributvärde mÃ¥ste vara icke-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Ogiltig attributtyp (sträng förväntades)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Ogiltigt utökat attributnamn" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fel vid inställning av utökat attribut \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Fel vid tillstÃ¥ndsläsning av filen \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (ogiltig kodning)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Fel vid tillstÃ¥ndsläsning av filhandtag: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ogiltig attributtyp (uint32 förväntades)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ogiltig attributtyp (uint64 förväntades)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ogiltig attributtyp (bytesträng förväntades)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Kan inte ställa in rättigheter pÃ¥ symboliska länkar" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fel vid inställning av rättigheter: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fel vid inställning av ägare: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symbolisk länk mÃ¥ste vara icke-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fel vid inställning av symbolisk länk: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Fel vid inställning av symbolisk länk: filen är inte en symbolisk länk" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fel vid inställning av ändrings- eller Ã¥tkomsttid: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-kontext mÃ¥ste vara icke-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fel vid inställning av SELinux-kontext: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux är inte aktiverat pÃ¥ detta system" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Inställning av attributet %s stöds inte" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fel vid läsning frÃ¥n fil: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fel vid sökning i fil: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Fel vid stängning av fil: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Kunde inte hitta standardtyp för lokal filövervakare" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fel vid skrivning till fil: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fel vid borttagning av gamla länk till säkerhetskopia: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fel vid skapande av säkerhetskopia: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fel vid namnbyte pÃ¥ temporärfil: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fel vid kapning av fil: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fel vid öppning av filen \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "MÃ¥lfilen är en katalog" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfilen är inte en vanlig fil" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Filen blev externt ändrad" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fel vid borttagning av gammal fil: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Ogiltig GSeekType angavs" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Ogiltig sökbegäran" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan inte kapa av GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Storlek för minnesutmatningsström är inte ändringsbar" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Misslyckades med att ändra storlek pÃ¥ minnesutmatningsström" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Den mängd minne som krävs för att behandla skrivningen är större än " +"tillgänglig adressrymd" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Begärde sökning innan början av strömmen" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Begärde sökning bortom slutet av strömmen" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount har inte implementerat \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "mount har inte implementerat \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"mount har inte implementerat \"unmount\" eller \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount har inte implementerat \"eject\" eller \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "mount har inte implementerat \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount har inte implementerat estimering av innehÃ¥llstyp" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount har inte implementerat synkron estimering av innehÃ¥llstyp" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Värdnamnet \"%s\" innehÃ¥ller \"[\" men inte \"]\"" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Utmatningsström har inte implementerat skrivning" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Källströmmen är redan stängd" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fel vid uppslag av \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fel vid omvänt uppslag av \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Ingen tjänstepost för \"%s\"" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Kan för tillfället inte slÃ¥ upp \"%s\"" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fel vid uppslag av \"%s\"" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Ogiltigt uttag, inte initierat" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ogiltigt uttag, initiering misslyckades pÃ¥ grund av: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Uttaget är redan stängt" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "skapar GSocket frÃ¥n fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kunde inte skapa uttag: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Okänt protokoll angavs" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "kunde inte fÃ¥ lokal adress: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "Kunde inte fÃ¥ fjärradress: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "kunde inte lyssna: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fel vid bindning till adress: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fel vid godkännande av anslutning: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Fel vid anslutning: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Anslutningsförsök pÃ¥gÃ¥r" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Fel vid anslutning: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kunde inte fÃ¥ tag pÃ¥ väntande fel: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fel vid mottagning av data: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Fel vid sändning av data: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fel vid stängning av uttag: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Väntar pÃ¥ uttagstillstÃ¥nd: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Fel vid sändning av meddelande: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage stöds inte pÃ¥ Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fel vid mottagning av meddelande: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Okänt fel inträffade vid anslutning" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Lyssnaren är redan stängd" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Tillagt uttag är stängt" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan inte hantera version %d av GThemedIcon-kodning" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Förväntade 1 kontrollmeddelande, fick %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Oväntad typ av underordnat data" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Förväntade ett fd, men fick %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Tog emot ogiltig fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Fel vid läsning frÃ¥n unix: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Fel vid stängning av unix: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Filsystemsrot" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Fel vid skrivning till unix: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Abstrakta Unix-domänuttagsadresser stöds inte pÃ¥ detta system" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volymen har inte implementerat eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume har inte implementerat eject eller eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Kan inte hitta programmet" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Fel vid start av program: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI:er stöds inte" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "associeringsändringar stöds inte pÃ¥ win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Associeringsskapanden stöds inte pÃ¥ win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Slut pÃ¥ minne" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Internt fel: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Behöver mer inmatning" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Ogiltigt komprimerat data" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ogiltig sekvens i konverteringsindata" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "NÃ¥dde maximal gräns för datakedja" + +#~ msgid "do not hide entries" +#~ msgstr "dölj inga poster" + +#~ msgid "use a long listing format" +#~ msgstr "använd ett lÃ¥ngt listningsformat" + +#~ msgid "[FILE...]" +#~ msgstr "[FIL...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Tecknet \"%s\" är inte giltigt i början pÃ¥ ett entitetsnamn; tecknet & " +#~ "inleder en entitet. Om detta &-tecken inte ska vara en entitet mÃ¥ste du " +#~ "skriva om det som &." + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Tecknet \"%s\" är inte giltigt inuti ett entitetsnamn" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Tom teckenreferens, mÃ¥ste innehÃ¥lla ett tal som exempelvis dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Oavslutad entitetsreferens" + +#~ msgid "Unfinished character reference" +#~ msgstr "Oavslutad teckenreferens" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Ogiltigt UTF-8-kodad text - för lÃ¥ng sekvens" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Ogiltigt UTF-8-kodad text - inte ett starttecken" + +#~ msgid "file" +#~ msgstr "fil" + +#~ msgid "The file containing the icon" +#~ msgstr "Filen innehÃ¥llandes ikonen" + +#~ msgid "name" +#~ msgstr "namn" + +#~ msgid "The name of the icon" +#~ msgstr "Namnet för ikonen" + +#~ msgid "names" +#~ msgstr "namn" + +#~ msgid "An array containing the icon names" +#~ msgstr "En kedja innehÃ¥llandes ikonnamnen" + +#~ msgid "use default fallbacks" +#~ msgstr "använd standardvärden att falla tillbaka pÃ¥" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "Huruvida standardvärden att falla tillbaka pÃ¥ ska användas som hittas " +#~ "genom att förkorta namnet vid \"-\"-tecken. Ignorerar namn efter den " +#~ "första om flera namn anges." + +#~ msgid "File descriptor" +#~ msgstr "Filhandtag" + +#~ msgid "The file descriptor to read from" +#~ msgstr "Filhandtaget att läsa frÃ¥n" + +#~ msgid "Close file descriptor" +#~ msgstr "Stäng filhandtag" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "Huruvida filhandtaget ska stängas när strömmen stängs" + +#~ msgid "The file descriptor to write to" +#~ msgstr "Filhandtaget att skriva till" + +#~ msgid "cancelled" +#~ msgstr "avbröts" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "Fel vid skapande av länk till säkerhetskopia: %s" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "Kan inte läsa in nyligen skapad skrivbordsfil" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "För stort räknevärde skickat till g_input_stream_read_async" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "För stort räknevärde skickat till g_input_stream_skip" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "För stort räknevärde skickat till g_input_stream_skip_async" + +#~ msgid "Target file already exists" +#~ msgstr "MÃ¥lfilen finns redan" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "För stort räknevärde skickat till g_output_stream_write" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "För stort räknevärde skickat till g_output_stream_write_async" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Kunde inte byta filläge: fork() misslyckades: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Kunde inte byta filläge: chmod() misslyckades: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Kunde inte byta filläge: Barnet avslutades med signal: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Kunde inte byta filläge: Barnet avslutades onormalt" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Konvertering frÃ¥n teckentabellen \"%s\" till \"%s\" stöds inte" + +#~ msgid "Could not open converter from `%s' to `%s': %s" +#~ msgstr "Kunde inte öppna konverteraren frÃ¥n \"%s\" till \"%s\": %s" + +#~ msgid "" +#~ "Failed to parse '%s', which should have been a digit inside a character " +#~ "reference (ê for example) - perhaps the digit is too large" +#~ msgstr "" +#~ "Misslyckades med att tolka \"%s\", som skulle ha varit ett tal inuti en " +#~ "teckenreferens (ê till exempel). Talet är kanske för stort" + +#~ msgid "Character reference '%s' does not encode a permitted character" +#~ msgstr "Teckenreferensen \"%s\" kodar inte ett tillÃ¥tet tecken" + +#~ msgid "Incorrect message size" +#~ msgstr "Felaktig meddelandestorlek" + +#~ msgid "Socket error" +#~ msgstr "Uttagsfel" + +#~ msgid "Channel set flags unsupported" +#~ msgstr "Kanalinställningsflaggor stöds inte" + +#~ msgid "" +#~ "The hostname of the URI `%s' is contains invalidly escaped characters" +#~ msgstr "Värdnamnet för URI:n \"%s\" innehÃ¥ller felaktigt inbäddade tecken" diff --git a/po/ta.gmo b/po/ta.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c1dc6e9fe82df1e90c71e57b60625291d3a56898 GIT binary patch literal 66878 zcmeI5dz@WWdG|LKMdJN}*eY_kgh?b567D2igpgq5k^n(OLc__-naLqDbA~xHBmq$( z3NZ>&Z0sviV?{0TlBgIjt(SVKv}#*xtEja$Z{N1wYHPJ`t-a{`{XNfGYwvx|J~NXL z+y3#+Cp*8h_g?E+&wV{>?R{px_4Gq`Wc+MDB+H%)jyy5Tj(SX%eeBt~nq`ZQ$+BmF zi^0RdivB-=CxDMV zF3TM+X4y&LMWDvp1fBxk4QjkkgNwm`0QEZh@O2a;NO7ie;7iF&&6O3yb?SgoCMzjeh3u5SJ7Dd z908YtuLBo?e*iuo{7E=JmJ^xua!}WA;6IJO1FVA|16P30Lul!x0ZMQ8flI(Y0yX~Q z5#j~li$IO{TJUP{;ebb@B$r-LGf|K zneNZ4K%L(V%I+To)$dP1TsQkUxE(x^M)La)fx7;eAS%iZM_9%4IiTp*LGg1tNZ0JW zpy>Y{D86b-U5*u?#+eG|4}j0&{L7&Fe-{+JXPlj7PXbQ^CHFG$Dd2ig`j`m!e+v|U zdqDB?)o}iAp#1ijbKFnQ2gUbVP~+bNk`l5{1pIcur(zWGaTcil1K?A^+d=8`*Fo|7 zV7UHC@R^){34AvAx8eL}pzQh#j3qxf6BNBBC_TOgl$?9P=YWrZM}a>E35D!wFK{`R zfonLQ0AC0`3@YzD^?Y;>UJYIX?f^yiufb!$Co?G=4K4yD?`lx|yd0F=4}iY{ei1wt z{5B~4%vt7kI~RN|=bJ&@-vJ&8egqW#FM;CoM<5}W9e*Ld2wn|75Bzmdc6kVtAAAGU zc+Xt!ac~kSJ+B0x4z|JLz&k+6^Dgi*@F(E=z!eC6v(7>BF>#UOc5p7|Zv*9be*j9} zLr@keIy(s@#Il!$^Ls#2VD`J9?D>7L2L2oro!Uy5dj%-D2f!o1JHV%b_k*(YZczGt z7?eJ~4c5TJU*z|n4@!T_K*@JKDEZr<+TRTx555nSe|!bhc#pf-?K>Y_!udETdEO05 z&tC^6{}WLXp^_aB*1+q*K5#3j_PfCO;3J^u9&)M6dpxLd&jf4Wbs#R6y&P0reFBt! z{{R%`VLCOD3@Co3*g7TX~uXMhi4J!W612Iju z29(|33X0E2p$0*_7dmoC{S^B5hy*6g31qX2A>9g z1(e+12G#DcYh3<*P6ok8~g;QeEJA@B6!5LF5mf}___g{5b z0j~$;r(40(!MBFi~tiw0y zcO=Na?77!_z4|ine9pfGlB%*=ofrXc0A;uDf&<_a*W&}=ILN>3XfB=$z7o6<{1mtW zJY|p^4Bj8`DUB?$8~7=3C-|aaZ}&a0$$1@OkjTCOE&&&D@qd9E z!A;+>!Ow%Yfpf>ao_QyzaTm9o zk2iy`nmv6S-oVYEVYB{{egee9I&} zgBMI?*(<^ukpI*g&?k!{U*2?eC&45 z`!5c7AGnh1-vXuAd9QUj9st$;$Dri9@OAhUcprEM_=LM0mw{JvehVo1{|sCK9(T9% za|3u0=N|?M-R$S!Z-8rG?|l9_5aKmqT-uQFy!<=9DHf#(Y z@c?T{@FDOf@T|A9mH^)eYP=KP;dST(py=-d*MI}>bpQGYcmwDE44w?G`)$8}FR1fx zgX_Rwc@Q0eH-orb_AlTB_=;VwpC5s+l&yG|^YdL$dTqVi@jIZ}*WY8VpZz%~|GW0R zKF(J`>FMy@UN^iH)cHHZ`A@)8IA6BM`Q8M+l=Fu`$@}E@`T48BI_G}{DlX2)n8V;^ za0R#z#DrPj2V5VY0{3x#;X~v&aP9{kzY8j_y>~CR1uyv!_R@Wnf1|F0BjC{=VeJCG z4%E2M`Y3ZhxEYk+9QHdNZ`Xp-|2x1f;Jn{;dEN#}uU`c(0`~h47;Cjvv`+{G;0emUvUj#1%`@ZOQ9|3j!?A`1gRTIR7d5QE(;3m!JL8KA$%)2BpV$f!BkJ{=l`waz2Fe%{{~(K*8k4e6CVbj z!TD!E>FW{jnc%74MpuWxKlpOaSAECh@Q*=Mp1t6^&i9eubAQ+h%1(a)&IPx8-{s#4 z&g1-=zjyn+64dzL0#5@^{ejPKH-IZR|1`J>Jp3Qr9$Uc?&X4&=*ZR{5;1mAE z=m&STAHpm%f0*f{8*0nap*^WB3tU`H#u&xPyXM0;8!^w;CPVZiyZn{0-fh_ zyob+E<{0JkpMxiGtmU&}?mX~vj*T3IQ}!HCw$%^mA^RA&#O7E zwom@w5dfiJHI=Sx;@HD+4E^-8Cg8k)gq{7IA5gH0b297KE+|)&W-p=t< zu8r9laRyFtemc05IkojL_#MaEf!~1^qmk^Kbe`tIhQBjrx!4mvMYupZWP3$59;07sqfM!o9P>XL6j% z=an4s=Z^4sPT`vFZRhwMjyA_Wj`;I=KJ4ZAU5>ACJe%Vv`Yz`9dp_&u#6XKFDZ7}@ zKLwx1u`pbJ7Wm5?FXebuxb|Z1KZWBe4*jfiu)V1r;j{AaRyp7`wj_Wwi zhYSmd`6VhC;h@0&d~j%fe^D$2rdA_+^e4a_HwzIiADu z0*=>kT*A@f(9dr>*xqR~jCUh=1;^vUd1#W&59i}t*vjz~&R2sk4-M+z6FL5nnCxo#^-Cp`5QR@ z6OQ=vPCgtTPCg61lH+RHE(q5If5owp<6fPFpML>g5@^oh^P%ChZXd?+8IJF8Ea!L= zhkoA1@j8xw=eV0=dFV3~@XcJ)&(k@7F8C3SSMvE#@XH)e2<`d(Z<+hZLB`p$Yx7`9@F=={Uc7APrtF>{oKCzL;6Sb?ZSZUnC z=tQGFxTV(E+-y&_v-8)tCuOJF)L3(KZLl?3#|rJ%z{Uoq92}fzwA&3gY)^svPtt*bUV>wyZwZH(48Kjc=(9HYXYbldXv@wbo7eZ8|Ns>3yd?-axVu8zuIT zgpJx%8)}!XymUFkj14u1rzTu(0%MRnbK6TeD!SAQ8r;90gN^pa$ySg!(H?9OffMyj zHF-b{I}fjGw$>4jV`Ghxb-K82q&e1DhezN;fuUJ+nry9WUS?DMK@Zsh|=W5)EGIYQM>5U#wd}ya%_BR z^2$kkc{E$*j$LC88f}izs4btbYjg>nr)sqfbCu=LA%bLVSV@+=xn@QG;?rkpab}^x zL}REi!91$8)xYrh%#4GrkV0*CWv+0kCY4LmWLQaIkSSSW5?+?#>Dq3L5-TIEv8A=q z7L&n9bE8~kOKVDbhR{RAQMA@3;Bx9|f{@b3G{e`hV0#i(*ql2y*__-`>#sH11NCt@ zOcd(v+6kO3&6c&u5(Ad6(c<_-YgluGE>ALLh~Oy67)MLOYJ$=I7{5akt%#kBgXBiQ;D^DVFI>K2rj!xJs07Y39nn50`1%5+$wHP)!D$C(B;WEU1wGIrIh zV^hY^mfG^ojR8WrF*2B4*czC!@&_wn&8e}*X66+<1sm6gR8A>dHg24%k1zo@hs8=N zuP}X@3Y8U>;yi^*7HHFs0Qb#7Ip{!Z)VLr5F!cbImW8=Zz?l=wicBXzv+Pu=0H;$( zWH%L!{jvU;tPd}o&1h1l)hji6m{sH8mer;k{05a`ZW38qxty$lGh%QnpQv@GWnt3> zxo$2)Zo8QcrFt)xL-@gDb7aI>==WIKMBGZYkvdF9k;Eev&on|Upe%HEv-Hp~SFp0T zELuzroT&K3*Sa(7t+JsTI?9wmd8#EaFAk3(^HOYDrTH6D$dO653|9s2&yUn#y|iCzuLt z%T%)E#y(_~Nc&D$+DE2tkfgDtt*f}+ByH6v8cRH*)=s!_sx`T^cEX7M8`gjI@m70j zw%lp_56b<4BP%rGq!zOE#F<2&PQPpC-d;ze0VuJJfz(9lQpX`BM!wh0c)o-t- zTnw{OSZ)+<%5b`=9A9zSmmC#0w3aDe4g-%3FR5idY~)3ks7t~{CKTgTWsW8E@hw%i zQ!Q1vIXI=7Su%#{u5fR-F==EahOe23`k_{##YmkpW`hV6D(Axe(fUT+r21LkVo}AU zKen-WyLD5AnwX|k&e!I89RMcr^IHWfF?S~MEF3Bt*p#bK>2a@cS(TnxYuN%YSGA_@ z$a3c}>7MF^4%3(Jb(opTxzRL54Av*>1t#(vqfBJ=;i4~1P&QU6FI{JiRtx^nq4iRe zEuCuOYv0Y~=+C{kC8Zm}FS6Pfvi4`uE=*b%!{XH9yqs+5N z)g1%1LyqszWxU+2N$NTC@++5L(j1%GY-zl)d9uJwY{6BpZt@wg!<%BuQ8uH7;wC~! zCT(W6=4jD|u{D{fF;OvIVGU7nH!LZpyCc=)`&*$yNE+18DY!d5xpa@k(!fM>oE%vg zioKV%#eIkN!@8!zMZ9XDJ{xc1kHZwf!&4*m2~FH8$W@%qWtw5##-hezKIJ#>I$EFf zR8!frz?(N$CP?m1LfhZyn`jqwpCZ7U-uF}W4#Ib$PJ#hw$)jtE12-l2$1`JFu6 zwX%q+F`eUVajC%Om<48oY&X1aYD_^pZ$7J6Y{(@kBbGSzw3(oCK5Q)bay~TDAdAhD zCt4%5;PVS=!z{_>4i?&|&L0}|3d3*C$yV5i5(!IaImxGTYOT$i+n!%+XO)&Yo5#bD zRW4=j3uHB2F|M35#ZTAm@h0mz$)}PY6>3KgsjM)=56Etz!0+Uy!JY0a)> zhj5YHhQR_3{b6XoNSdDvALDyncu zG22VyqxG<*=IS2hyjN4JER$)>0Kt`);3>L0yPoE;xlzkx_m|Xk!}^{~sO}c1>K@oo zYqP10his^`nYEsBmX)DxM5k3tVLhMkd(1oGxRXygb*V3>HnV#$(wNWQ0%qS(ANO@h zprU1bi$w}^WWlVO#2r eN8c+cMP8q&ZfPX&Y3#J1BOb&u)iGUc0N= zMOWGrlV$7xF;QIVRi^FSrQIy;Uh-UHu(he3y^tK3KNEQ&+jwR`%XO?Ed>5(j+CE#c zYX7hAy1vY|Hd*S+IJV2C9i*m$%cfZQ8EtxOsg_sB70pU3=#}AV;6+zb9!&YXZj{Q3w4{{QI3hxZ-RR>iIn=Jq-#$NYxA^`CxJ8{#eIkQJzLMZ;S_tE zr<^KF*ez38yC6qWu1p)VzQ!?l@8K<#bo6L6(UiWzI~`>mOJ9*4Z$x` zyNwMVm3FqWomf1g>xN2uN+E<`8#dBx&qgR;S1&-+($j$1-> zAFCBiT+y2Oh{r6x73wXsOBzFy_9&TsAAi0^7PXQGVpcM&pBmyhQg#VT9d>PPU#(-t zy0kt*vCH#E&q<-K(Mm?MogQLlc@rkd^-#gTCtDjEJfxU6cW}Nq?|Pm(`#zmdKJ%XO zk&lmRG3d|d$~A_$ht(i@8kt?H2Ym!@N)lSOkQy%4v()vC$xW(2?I}~o8wuHEEq}hQ zw^95tjcLVpdn;dqP>;e^n-=#hhox((uo~fM&#T3Zz3HIj(b>i9sjTZhT%fb&0$HkYRQ^PDzv?bpf06U ztGI3V-URlkCB9jbtr{#oqZBuVClI_XbWUGGA<958sF%z+K3$GrjL{`4H zhiTfm?~kPPJY%-xP*~qdJ*axni&_VtmdJcRl*gJp)hj$DTbdS0#pk(k>d9v-bYJXd z2Ae^d;SrUdIZ*KHwV>+9iJLayPE4xueNV#ji@bD`ZaPKER>eZwB06Q_!gYHN!-G)X zJfJXG?srw*|gO>d;`;u>srtI#g^BCR_?svTxUG zU8?=d;@b-tzBs%xZ1(1U!KR}o``q?dZfI@NYjHL0_=E=l?aZ#0ulUPmFw-%=UD=wN zAYBC~skmSEo-lF^%}#7trw1(AmENNFvM@BLpj~{@(ka=Rd{3Xn1CvHOD_#<{ya4UI zB_(xa$~CMx@x3sSM6-ulwe}MG$;ypFN>~tgXhb!3Aa82br4D+8(8M99%*0B1{v^PM zq6yowz7@Z|L6|Esgw0{k6N*~T_BIs{EUe92qi4SAr+XS`evwS^p?IxtZ6P;K(^Zsg z*$;hRkX_G{6zzIy zm?^79G({Y%8SU6wdqD4dSzlc+6=(%GF=mx#_N+C@|pvAI{8+EY)#x$LrHok$Mg8O@)fzIrKx?59z1kJ?3(y8 zl@Sduw32Cj7s}(1j^T|fHA>N5NDa1MKsHF_cD_fU&9rr1f3m*=W$E@Jd)>}fK0|uQ zKTZGXng?BYRvyf-UuW1}m4d+D0VT6o=CSIu>z+NBQ52)BXH2KMYs`?z>QP9>*_UN zp$zWo&|-IqHxct}W<{J0Q)sIVbvCr^fo?+&Bs&!5Y)OuABX0I|mK91eu@18wc2#=) zsn)1ZD8k1E`&&c(!553S?LjD$Zt0y?dy#nEI8!_Rre&4vWmT)~>oP$XpMW4z;>_g0 zv`p0_Xmd8*eOtDQ#-@66a=bYR5!*g4G>O$FBiWl*ol?j93+z1`-A&t7MQ*Krr_Q9n z;!PlxOA?Y6_IgImh4Cja(m+XSe|fIll+Yv%>urrhBY%P)n^Jg9wkVq{4f?BW+98a$ zgJ;`}f~%Da7im@xr1Y@I_5rYbi}0RcLZd|Nx9P|0AP8E)1?K6dV;ymoJ=M=%Y>O4G z+bw8H4+YbrrHv=?Xv3B*bYSnq)LOX-qm^J?tDliZeQcrV&!YLzNQ<)0m%g*@6I)-6 zr^rHzgdih^802DW%!21?cEpAQ@s8DecI~RwYgVqhY~jL%*JW!9J6g;MnxnF{%Y3>B znH>|1@E+Fs2DPfzysQs3OtyBQsxNuY6RN*&h(-D80lML3H$K~(1kbEW3QL=KllSm% zZcMZS+gTba`Epo`%sX$MZsy+*um`6dc|2^S^92EW8#z68!ctly1Z8nXIa8jaq*NYr z*~`DN&@mz;r~%tH9N|&-q!I-a{a`jw=hX>&cq@~5alyvP+K~mdwU=;Aaa=V&4WyS; z^%W4jxRK>+HJ^M@_S((2V47R=;va?P&ocBjwY?^e`)taR9As`!Xgk0~*HPw0E`HXU*1W-Lo!#kkhM|a(oONR%gw6&(UpRKF!_M zcoufLsg$HTe>#?JXl$+z@)eI!Owu7}_bu4(yS0$3$;ypkI;Mw!$!#-=JYH@$4NulC zTYmK=dZXBbsLf5UEwKxm%rMs2WO;UoZ6lGzE7{jcZpOEa z<}I3^u7~aMv`kgDPVdNDiIr8Qj+7#roAE=Qd<;{JqAvnZE9SMU#qrwl6aj^Maes2c zQ;F|QC?D9{|M;7}IR+aQ3XCm?M0-J6^9s)lQqNHKSYDl9dG$KWx1AD3y0JgJi-D>2 zA)orLOa9h-`FWh;6)yZy*Dw!Zw3x_xwbm2T4W#zgl;yCBo}@B+QOMSCa>{#kMF;pex1RbuEWLQJ-g${dJ0mmFi%x{ zRi2!AmkG5fztn4`cmBhi7*c;mUCP%PDg03>tKTfA?`|D4zUJ_GqxH?r(W%iI&nlC^ zybly!FYDg6(ds9SJ=Dkv6!8$9S=!uoI9fjG6AAJyV0#y&8C7)UK_~ZekAs74@3=roY{D>g(Cfl1i51 zFa(Lbz;{(JB94jo>LG`hHY&&ZJwaF5Y4t=)b9Dd8!TuNfm-KjG5EE?Pvx{wqiqit5yE(OLccTYN@s@o7s=J>$ehr=7BB&Lxc4zlJ=~W{XTq zORkI!Pw^IS{~9)rm(*%!H^yEt(p=b@7(RE7zGa!Sym;ZFImzk8vUebS&p2Im07hh0c&$4*&!o`aho;qjs z2;b-&>0iMt$6mqMxSh7oIhoyj`*_a0v186zJb&rhu{rqyKncq_U*aL{@)56h(c;x#x_iTq8ZfA z-nVZz^!FJ3_u2n@Y0SO1@7uF|-|n6Jc5@YC58D4+-0Djt?@T*qjdn&x%&XB-?!4MQ zZgX}xf0xGDy({nrX~{=ps3ZF)Y4HXhjZd$U^fknA@FPEWpg&`*uIzmfE-bA-{yD1S=QJ ziKiBvL1b_V1T-@G-n-hWAJlPp?(eYsyF-(C+6Roz8yn!x`*y$HoXtDz5}SMOT{V&Jcn#EXx4y<^OkGNDgJdTNl@YUeK_Zf$YE=Hn}l;U<|OrqCA zl+QssXfi}24Y~Y4&{iHFL9=4Wl_W0r(F`;ltFJU$baqM_ z=?Hvmrr3uj!l5KjJE?aFTNigpX4`h=K0zv+*L4_s7%2=9)0c#cDpk{v6e?8#2ktZ? zZjQ1Io!~NlwJ?Mwi<~fnhAWI*PF2PaUhV4NYeoocpy|>;$b#c|6S0p@s>U{hpyd0F z$@@)fq*9tnR64l@kub>}KkRYa&@Q-VF}B?HkiiNCQH@OJG*Yc#V_06cGcx5i?UWLO zO4YnLA%G#B`uH=htm#wKm!mGut>U@PIvps zeuesC_{hQU@^@QI9ZD6Z_=<2q*pdOwN4N3(0)_RoB!6(Vw@hjKg^51Otm60GdGXiff`Ql^y~^M;_X z*$aP+1zw0~O&~Kc2#qlD6{Z7OIoPyt)!f@B0%h7XCWFlEVV!g$r%?ik^h~drmCZyM z4!4*8eZbpdUCa#(2Mh8+=WkXsVMQFEtm3rbBjx2wTqH<8JDm$g-q~wvUqF)%iZmy? zMmolEb#;xLw4(T7C{~~7CM^x(Y?|^;v>;ZoYR1TRDx9R6%CI>8Eak|oFvd;X=Ey){ zWHfYzJcE#Y;D0Zs#4@7C`YyjsPwXB%%WpF~VpT-qo>$+P#hpX#thGu`f)KJHC0efZ zZnRKmD>fIzk`qoK=h;fUnH`jqy_9oJsu4GQvI)wy^U^d{;Uw4sPD@E2BF=NPP2dQ6 z_b_c1G!#M-MLByFZWKeZyP_5)OA&dnm~eM{D7Z9bMuOJDv@n}t!=7p<)A$oZqt+zr z4qJkVGWQ5S3?gOo|18wl{X2*}pTa$}A7k(jgIB1h!XjKkX@rS;q5ZEb!PD>^)2Z#D z&^E5}+~@RvPP2n`Zg}3=VeDWt%a+;(TYNfggTU@e6{Kmhci*1dEMj1bxRC>3uiUx2 zh?E0Avn{v(nxTxd51N(pX!oI0Je54$e`iy1d!))u+$@SyRDdx;=(r-v!{V-B1>~DeIX+%qL<>#WSP?`~&Gb_fC*{dwJRmEzl(a zgR9ZW7aUSDS3`LnbYq_0>Hf6Bb0NL0cD-Jj37y1+*4&y?WjHy0Y!J0?oHH;6iPKXE zC*ru2W|=Oy#Lx`ovs!cqqv7G@q2`6F#hHGEl_hv`OYj=wh~@~s&A;Yoycef!g&4!Y zlo!%*Bymt;ihV&1Q}8BaMv42C$wHcTvvnyv8D=Z2fn?Y{I*tUpD+`YY?J`zSDnMqe;`2PVD%d9IZci$O zN}0qRNKPSY?j1(AI$qrHnWZD&AA}(&%L8EnHp>pRTwk&`PlO{(E%v<~=RT7sFGJFu z)-+~2IU^VIl%M}HCx4+he>BKzd(~ex$amX$pq#%+t|yC?zqxGRZX%9xt>`gc-MbL* zHj8U+cP=fX1kyT=j3)iLN0>%Q?NI~^8{{u0tzuFR>R}AebR|06WB^ozPTlxJFec5jNfVRf9_>cYPTE-w4QcnhTptYZ-^)P1IV`@6+6o)MQeg-& ztmB&W^r>|}fy5=ekpH*VevwKGX^6VUBbWa%aqt4bmnB<~Vn#N9fu{9`dZZ1s=2=$h z<{)|wq68lxZS$0po^%3p%oN9!o8jOXk^q1~I~M23Zn+ z6Cpf6zm$r&wAZH3RCK6rx4BYM`lK1EIfRWGQM~&s7^f|$N9<1W*1@GVT}dZ#<~3M$%OzQXS zyu)%1*%@DFA!wf0cY=6k5Sa3MfX}Ky^02h67>m2&>_T^^1DE`A))V@y!rW%R0~Cs6 z1Z^$3oK8=lmuAx_(3n6imf6&NxI}p&QF4_g`Go2gVnMVmJX>_5qh}7ztr%$h147_-D& z(YyAW9zKB|q;9A*B`gUZ6*f!$^h@mMrDvYSo@l^BHkhGHS4r!Mk(sre*)(u~YIF|V z)maiTKB0iqCB-Ua(Xn?%TByw&b9&E`&Ef<-OVgN< zi>@OH-F18t$(KoxKPQ>3rv`B<7(uthS9!K97<5Kn3WCWI znIie$lSf>qS;_M##tDgbR-~ij&ya&rKMuJUpZ1u;cJ$o8*pItQVO68|3HO^ug+aU~ z;zr3^o%l3vfu|}&aZ_s=lY*5f)fvA!S#%GN<=k7V<4#g*v@m*16UtDPLd1r!*(rT> z!s$T?_VI{(hzfeV+-h06a~zs71A3ZwlTiwK+2Z*zWHatfqw(G(@-!ZDGy|eSpTu@p zz_~N4UMw@`F|jr~jQ>lF z&SVaFk<(c;s*rH@sA$kTz8)Nsv_ilVV{wq)j&8wO;A_^iQSQJqD>_*g9moRan&I67 zeTD*pmlP2l%GxKv@oe97cc(296R(+p`uX=7wYfH;{u50!UswZ{vEIXLL z6pe@b^zgN5@}&D8|9g5&IRC}G7q92bL^NXcbzv(m8Gg3q%`*N`dH zDv!1%vGo`!*InP!mm-r2N#(vR=M|M(BZO4$ zc|oV#CDBCMXhqRo!IadDA>qcU#*hp?)5A%^FHf1Z;6CTDlH9S6RfA_1IUqbm7B!%3 zR}x<*@(0^pNQ0JBm08ahsp%=ZbWBfZLp6=idt#({g^p|fOg{u#P;AanS_Rx~3^J0t zfABztE%{jJ?K)g-?Hxs+ndC%lbGCt;|un#)Uqe}?ODA%Y4`d0ymyb_mnoKFH0${hprGds-t7U9ce1YzD_QgIav+i&(s? zzl#w9AZ(%FS=%*CunhW=`!FC^gHU!Js$h{bcNEcL-%#SwcK^A~(w}CadoQ;4D2j&3;`=d69EH_S*4cncRLOa1D>7ptwMO3Ik&|>0P-kUuncn` zgXg=RcyS?3Ta+CL!Sv@$9)&c)#oTLkvVRKY_XFwgsmzuEd&Sq&06MVJdzQ|#z$Qwx z6cT?dP%1a5%Xvc2$lYPdIAN2S9aL&mQh`qg5+8;L+W0U)Y^ix7MT@gfmTQV*eM-LjD(4 z^c}+Z%d+!dPZ)kpU+K@&bd@EDO5XR~wY;w2YMNkt;+j^N15;to-0XFl`)$c?2Q-eY z6v9}P!-_mh_aO=?p@@-KrGb3@b4Vj5J0xOmll3bx^0+Q5WL80N3q87zg z>zk$uDL*i{&8i-|2>~gSuF%(3gb{S%+>d58!xsMT(Cl*ZzEJX^E=+}Wlrf4*i}_4K zD~EC0zvSyF3tzjAsT>(j-?E ze+=hg=*&moDZW?Es}Zoy9Vbe2rm2vgOWN_6@A&gusal-DEee@i8ELvyC9}W&pMXip@?6aeMuq*@YPC7tdK^Hw)B?c*#~3Fi@9QLO2q+Fow4B? z48f%25%qvI^0FH-Nt*KOqaM=zfG9_uyZGg#@eh~9P zqg?prB7!p>K8X@?Q%A#zKH=6m5Ng0hq+YA8y>+r8B#kGhYQb&_*3=%SqP$$lqWed& zt(GV~<6}5fi`d)r>&9RPV@hPM<8;K9QMT;qrhzk84AT1N-a50aHGjXk_-`6G{8_jP zS%1M2hd(n{F|Z6gYb8Gz^Ph4np+w(e*2dRx#gNY`vQQ~AbURMTH7puM4)?@i^4yNC z@lQ_x^zaf>^HZ2u;H)^bCOvLKZlM^tI(bi_jiZRpT3Spq4L*14q zY$++U=o}W=d;p0D>CXEkAatEZ$1X~V`nCbw(s-BMPsC*iNQU;bDmp8U@2XUD<0!t} zJo{0-=*fpLD|;434V~n9yD>@LHKUr}z~WwWH)k0di0c|jLWyiXZR9CASQ5=qyV)Bk z(kna!ru1i9znZ#3$sbQ+gV_g$5AI`7*&BDpS}^|#Yu3y z((|n#!_;I zW2P}X6;RCsSMxxyIz`bw!{}CLST$))LkcVUA(^l*o=Yu>@=RRMG;-KnHU0H$Tjfr2 zt)Sb|%xG<;Ut)kJm{rN1)VeVH|1$LSKeR@)NKMmu%R#b(xtkR<?CD4@VoLi+8;ko=i9Hj2?kmWQwdwSgG-{KK={6_bU!ehOLVO`mbl*MO z#4Zwrs0`nbi*rxGW;F1{Nh#y*mta0E;UyN}vPT+6QIr_*aePuNEf;6dylE^eCK4xE zVZe?gRGCJ_pjSS)g^io!wB#hhxt+f2PgmWr>%qHd zR7&7E8O4AGvKCrzd%DOe!`fa849Kcp$ShF2{&a@vp1)%7`nY_eIRzhGXR}4u@yqqh z%`8qkC*)MMQV}q&sslKuRbUhDI=j#Y*H6x?rJQ-OKQ+)P6eue^Z~Hc9Y>jW*AN0*% zl;Tdx0p-|?kvuyVW z_!-VfsQ^DAb!4`c7IiIq<_ooA-G{yWF+-Ouo|=#w@7`;ciL73rT#$`B7MN74?UBH3cww6gzjP zQgzJjt2G$wvd^4hs_q!wMsM&=z9eCYz!XX`1I* zXwE|0X0GW(#ZzTU8NOqvnFoNMYELLB!Dr6+%hdBhVl2!&j;Y7>7R-v|zCx0vMbfm{ zlOIAB^90AR<_y}~zq)xf57}=<(Jj*hjAH;|Gq@2fZ`Zjk8>{t4lLHD2xm&K_=+;;R zANS3gkX<;J&zJ0!nTPw(Q9V)a=)Hth)o*;DlgM|HL;f&jaT6POe$v>%WFZ)2RNoIk zS01iPk~8a@MhsmHeo0lW(@y5{Nb>lNY3s;yfdAz~1IBj7$Zrhr^(+Iv>p$b-2J>KR?iVutuW`71Q zSTQB0)M8$^MD@WSSSb2HY%w3wrdnO_d4&N`LTQfibVAd}w*C-%K^Zx#*{lSz?2&$x zX*Y8yPunl#Fb}F!Au0=V1D%D?b01A?@h9CY+2X33P?XgohLLGc<}U3Gp%G8qQW||{ ztDzbGIXW5m{&S7$O$BTxQojfoIH5ma@m2wZ!NE1&#o?mRv>rGZf z2wqxYZ?)xoh62Ic!73iZ_>_nYnPMof<11f1k*DH0Y1fbNLjYV@X*CX<%Z?=0!nsqX zVXQ*gVL55+?{_q%oEYkm+Tlj0k6@M)>^QLCfFpEkAYw2+J70yohABw3 zaqHY4QER|Jp`0M2^C1M}aHWn3fqouzgdtpL8ICl?G3lTPOINke5YsS$t@)NAak3cY zA-s@8@kv*>g@_zHCir7({dO5`=W=(<5ex`(rNBW`T#b)6h6bUCP?(QP(K1QHmKw6^ zFW)MpT^*19&#>eppo4q~vqM&Nv*>@69He3B8Iwjq7)jizhpIFc8$lk;Tje6}@k}Lo zdwW*Z5OE>x9*76nw_x=Ji&U>CCK)4_tuwyS12=K|wAvFRnbE=aTn&!mZicV8mBVuz z`pN+d_Dw|u5g?yp08ij}8^eh7K_Sw!ho3333>KTr*GKY zo0tiTo2%dL9QiOgaUTN88H6Tu5XpyAfm5EGOR3GoX_=Jl1U=rv(dxM15$raaC=iUbECWbyK{bK3Q$N`gOFx| zPU5ey557-}+4^*?FS?GVL`!`7Fpa*=E3)e`%>E2B9rtO!x^}D?w3O+%gm0O{$zyj~ z{Fv*SCU8caKbl;oLx||y`i#fPhu!gfX~t&~wuknvn)V5c=E=;8`9y_7ml&dPZmdWK zqr+1)dWZnUaq^B7DX?gAh`I8F7IcbDdzd*^has$Jh+fM6CSE17g{IlF`$aJ%n5}!5 zE<>f1n05W37f%iq>ggpwx1YvB|N7(PPKDepo zmA3m0h)^so`#>g+re-01t0i~vqtKa?JXW)=jZ%0*=`autsvHpV5?$|(6-(FSITOcS zId#oa`MoZR2FSmcwf1yh!TOI zd5AJVWW$+^_s|or2tO!AlEF;Df=u4kCE6^hi|ayl#pjs*yC*wKFX+bp+TqYdYjoXY zYhz=qJ#W6I(Aq^S`FrVb=UJd&yaFp868MS)H-{)ElNko>IRre#cspR?#*W3h7)DNy zf#^rdik=LdcmCg|q^jRX)S*R_OnRM8m(?p8pBN$OQzA4Nlb{LgB=y1!Od@M1OX;OM zjURb8_25V-8-K;y{A&wZKpy;Ya8is9U%|Oyy^!0*HvTMoJ<6fo&wN(eRmjpwXvHaG z#Bh{jYS^+KEUr+nQ-~pmXiwrfL zmq=T=#CgJYhvz2R^%(;_?T?e99eUsiUYC)^qtP@T;o~VhmhPqlXJoHgBenMIfh{z> zB!}>v94VRMcEqu~N3py{35s+GU|P!_T|ouEovN}cmLYDX6!CgSr~+h84|xnqiDQTNFan*hZStbK_alVsdutDTItiJcC5Y z|Jr_pXE!=F#P@>oZ8H>er>`n8d|n;mX1eF%+5g3!-Y2Vgpi~^+Z0wfK=_scMzKV*% z$&@>)Cha|UWmk2KBAAJ$$s&h|IIEkR#8Z;lPu@-Lj% z`IGm}k-^&dL~EeYp4IQb34VoAJlsk(Fxt-R5)VXQvM1f5EyVK*Ou3lI;PGdhZTSIy zM@XOM1qEXmWo84?R!-;N?%z~zPL4MR9}S)GJhjNLk~SuoffqJDV#dy02X9F!Uy@dN zhOD0ZWQmNJ(X-*w#klv-gP&f`rR(Un7Z>~EpQ7P~8oYIy9L=c?q`JaI*r$@}N~Ko( zduMh#54zwO77)QNjJmQ%s$KHHjdr(8S>BN=_z#>`bcbbpQ(+9F)lEFxxre6=Z;orf zDz>^4p}=VD$HAP(Fk>jsq7%gP8;Kf?utz%0ou}Jps)vI|Q}*@3$?JMJbSZf9=>>W`d#|m~mr@ zA8}QdD?r#Xs1aCKrxR)3^;hV;UR&-jmKFnuo=Mv)X1<(lCZ zvlsesLN0u`&A3HYw137xCL-RxS}Lf+#r@7)=o19Vpkj@lY2WOm~4v|+r z7ANk|K^Qkm@>LAtp-wz`JFXC}(pe}=V$P7-Wqf=Ed#Cp9VUTsF(P@WxP>ii{7`?lj zUAt=anw6_ATexuHb=g|}9v;6CX0X;8s*Urf@fs6j+1h2$xTiMKYHeKK*wEx=@>ZND z`huqx{U79^6=4nwTuRo?vw+dqmaQGA8gZD;xp`8(nEPWv3dk#^(SxiJW837e$TB%m z_xrBY8WlU+F+Cu1hW5ePYV*#Ums!o0c2?Y)XqeQLo57SWhCNl&z4-J~ zz9--HN!t4H+4C3DIEztBmU(i4O)~}8b}tIkxcn)J#!{(sP{<%BV`&JOfZ^@d!!Fq@ zVw|BH=Pzo-vH?CsKiJ$04HH2pvI-|@eHWD=Q=+*Y7IQRGGA!0xyE2U*?bs=nvB!Wu zK;b0{OMba-Aeuaq7%B`dX<$KeWCQhfqkmvSeQa3ub)!8{A8)j4^VW_msI9$(V~XRd z`Osp@i8?b8p48>fGyum3`U`LK1w|4U_Ldm%LCN?Qf;EA zwI3&_4rBSWL=!x!*qZ>6*B9#-hAWa1Q>u+j%1|UBEMmqO63xzXo$19?pnidQhM`~b zYxT&=uBT{qW{k^R@hC+%!mz2y&Y-cbnjlR+8V;{Gs8ms(RY20VtOwVyJ3TKKUD+Dg z*qGF`q+eJ|f1idtok#1My;8v9cJd#yD*wAmP-@6|LB`;k>xcNHI(s*k3$@0Vo=DT;2(+LzZ9iVEsxu{ffen#P0h&- z>-c4b6TE$9JJJjhK=EhOQwmV zno~#mL8%PynvRVQ!~zOf*$HbibfOeL9ISDD5YK1s817yOD$M~XI!{|%qLs%BA6(0F zC2qhPGq3xVNM!{>DDNx#2XP8jIvo!@WWxKK&c?K3ba}4++UKJloBSG*bPOw0gA&4& zAJcJ|OV9wJD76+7Ju0S0$iwK+9osX8=Wkp##C+|t+VIg%?@ z6d|pnE4s?7vdXld-)E36t=Sq2uY}K;rW6l~m}X)jBn4P^sR2fq6jf@;-NcnVeuvdW ze2_u?p1qAC4^muZ>hD5`s@5~^#l&6A;Wk679$hq_=6QBzL?0@tjB%3xmWc-LV!`1P z42nbWFcUf(P;hI-*ffG!Y2gE{o-3Z9k;sP20#7zhE}@)=X&?=fGj8*kw4+X)+6l^D zyBalhnRD$pSLu#g84V^Oy0cfgC0#qU&M_d8tGH_r^Lh#u+}Pa}3&5=GKu3(mpjh6{ zwStHy>Zrtm^&=6O4aO%(c1IIHjl#Z5NB(E0^^|Uhb)$_78{O0N#=R8H#3LG+hEvtU z$qkVJ=@?ed>6GQECOLe=RUk|!_an4Sr^Kka;0&%RdXXW?zN2;>Pi^l^*BG+|mSB4ioF5avUP8=<@}Qgz}x(vQd7a+?WDyD^9R>rPClt zflW#iv(1^(CU)k30w5SAWq}7nV7a>D?OU|K3c)JP+DySEC!j*w4XwOvqne|Ym9Q%_ zDzJnx7@QBZ#g}MHhVrh#K?)X9BYs6su%-=EijC+E5Ta#B{)tsWmaDOI?%P_uq(-VM zki;2^Zb+J0d&(JS_}huW5ot%B@^&bJm=qmX86)FiGz>Rr>o*Wg4K2=GV2k+HO+3A- z>xB)tqi1ZR&p`{Gmb?%D?@S|lGVsa;ew7f>m@0^pxH3vfS3VfJ_avEaJMnay2cS50 z2d6713=wJy=Y^}C(+FDi2bVD*j6KtfXr)0IGlM^M?8UATOOSDQY#yMyjncU2_$(jfT}R>7@N5uI?_ z9V)ZAhLbZqgUYqJR8S2gg(fbEI(s^C!Go2}1iW2ao|r0Vl#}UvcN8(`ZGPb|pfMzcY4;{BgD8r31Y~ri)>0TJkc;hqIm5LzXlY^^$uX$&Ri$}A-EJnHU62Cgg8179`N#+$LQ^6I|bx|;` z>5e*lc~;c~FQa3{P8QmwuV)@oK0>s8C(zVQn$wjpSGOPF^%r4R=uXIuAZu z@;J-PaRySUbAU4Mu&m=HSU$1BGrH2E$H*!IiyKJXE9G$9*_|8;D0L^Duyw9m&WlkL dlSr6VNn;w%ckJ?cQ, 2001. +# Felix , 2006. +# Dr.T.Vasudevan , 2007. +# I. Felix , 2009. +# Priyadharsini , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.ta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-17 15:47+0530\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "எதிர்பாராத பண்புக்கூறு '%s' இந்த உறுப்புக்கு '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "மதிப்பு '%s' க்கு '%s' உறுப்பு எதுவும் இல்லை" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "எதிர்பாராத ஒட்டு'%s', ஒட்டு '%s' எதிர்பார்க்கப்பட்டது" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s' க்குள் எதிர்பாராத ஒட்டு '%s' உள்ளது" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "தரவு அடைவுகளில் சரியான புத்தகக்குறி கோப்பு எதுவும் இல்லை" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' க்கு ஏற்கனவே புத்தகக்குறி உள்ளது" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URIக்கு புத்தகக்குறி எதுவும் இல்லை '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'க்கு MIME வகை எதுவும் புத்தகக்குறியில் குறிப்பிடப்படவில்லை" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'க்கு புத்தகக்குறியில் தனிபட்ட கொடி எதுவும் குறிப்பிடப்படவில்லை" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'க்கான புத்தகக்குறியில் குழுக்கள் எதுவும் அமைக்கப்படவில்லை" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' பெயரிலுள்ள பயன்பாடு '%s'க்கு ஒரு புத்தகக்குறியை பதிவு செய்தது" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec வரி '%s' ஐ யூஆர்ஐ (URI) '%s' உடன் விரிவாக்குதல் தோல்வியுற்றது" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "வரியுரு வகை `%s' இலிருந்து `%s' க்கு மாற்றுவதற்கு ஆதரவளிப்பு கிடையாது" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' லிருந்து '%s'க்கு மாற்றியை திறக்க முடியவில்லை" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "நிலை மாற்றியின் உள்ளீடுக்கு தவறான பைட் வரிசைமுறை" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "மாற்றும் போது பிழை: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "உள்ளீடின் முடிவில் பூர்த்தியாகாத வரியுரு வரிசைமுறை" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "பின்னடைப்பு '%s', '%s' குறிக் கணமிற்கு மாற்ற முடியவில்லை" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"கோப்பு\"திட்டத்தை பயன்படுத்தும் முழுமையான URI அல்ல" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "உள்ளமைக் கோப்பு வலை முகவரி `%s' இல் ஓர் `#' இல்லாமல் இருக்கலாம்" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "`%s' செல்லுபடியாகாத வலை முகவரி" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "`%s' வலை முகவரியின் விருந்தோம்புப்-பெயர் செல்லுபடியாகாதது" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "வலை முகவரி `%s' இல் செல்லுபடியாகாத 'விடுபடு' வரியுருகள்" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' பாதைப்-பெயர் ஓர் தனிப் பாதை அல்ல" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "பிழையான விருந்தோம்புப்-பெயர்" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' அடைவு திறக்கும்போது பிழை: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu பைட்டுகளை \"%s\" கோப்பு வாசிப்பதற்கு ஒதுக்கிவைக்க முடியவில்லை" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' கோப்பு வாசிக்கும் போது பிழை: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "கோப்பு \"%s\" மிகப்பெரியது" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' கோப்பிலிருந்து வாசிக்க முடியவில்லை: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' கோப்பு திறக்க முடியவில்லை: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' கோப்பின் பண்புகளை பெறமுடியவில்லை: fstat() செயலிழந்தது: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' கோப்பை திறக்க முடியவில்லை: fdopen() செயலிழந்தது: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s'கோப்பினை '%s'க்கு மறுபெயரிட முடியவில்லை: g_rename() செயலிழந்தது: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' கோப்பை படைக்க முடியவில்லை: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' கோப்பினை திறக்க முடியவில்லை: fdopen() செயலிழந்தது: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' கோப்பினை எழுத முடியவில்லை: fwrite() செயலிழந்தது: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "கோப்பு '%s' எழுத முடியவில்லை: fflush() செயலிழந்தது: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "கோப்பு '%s' எழுத முடியவில்லை: fsync() செயலிழந்தது: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s'கோப்பினை மூட முடியவில்லை: fclose() செயலிழந்தது: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "இருக்கும் கோப்பு '%s' ஐ நீக்க முடியாது: g_unlink() செயலிழந்தது: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' படிம அச்சு செல்லுபடியாகாதது; அதனில் '%s' இருக்கக் கூடாது" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' படிம அச்சில் XXXXXX இல்லை" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' என்பதன்-குறுக்கம் இணைப்பை வாசிக்க முடியவில்லை: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "என்பதன்-குறுக்கம் இணைப்புகளுக்கு ஆதரவு கிடையாது" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' லிருந்து'%s'க்கு மாற்றியை திறக்க முடியவில்லை: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string இல் மூலமாக வாசிக்க முடியாது" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "வாசிப்புத் தாங்ககத்தில் மாற்றப்படாத மீதித் தரவுகள்" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "வாய்க்கால் பாதி வரியுருவில் முடிவடைகிறது" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end இல் மூலமாக வாசிக்க முடியாது" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' கோப்பினை திறக்க முடியவில்லை: open() செயலிழந்தது: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' கோப்பினை ஒப்பிட முடியவில்லை: mmap() செயலிழந்தது: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "வரி %d எழுத்து %d ல் பிழை: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "பிழையான UTF-8 குறியீடு செய்யப்பட்ட உரை - செல்லுபடியாகும் '%s' அல்ல" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ஒரு முறையான பெயர் அல்ல" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ஒரு முறையான பெயர் அல்ல : '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d வரியில் பிழை: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"'%-.*s'ஐ கூறிட முடியவில்லை,அதன் ஒரு எழுத்துக்குள் ஒரு தசமத்தை கொண்டிருக்க வேண்டும் " +"குறிப்பு (ê எடுத்துக்காட்டாக) - எனினும் தசமம் மிக பெரியதாக உள்ளது" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "எழுத்து குறிப்பு '%-.*s' ஒரு அனுமதிக்கப்பட்ட எழுத்தினை குறிமுறையாக்கவில்லை" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"வெற்றா பிரதிநிதி '&;' கண்டது; சரியான பிரதிநிதிகள்: & " < &qt; '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "பிரதிநிதியின் பெயர் '%-.*s' தெரியாதது" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"பிரதிநிதி ';' உடன் முடிவடையவில்லை; நீங்கள் பிரதிநிதி ஒன்றை தொடங்க யோசிக்காமல் '&' " +"பயன்படுத்தி இருக்கலாம் - '&'சை & ஆக விடுவி;" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "ஆவணம் ஓர் உறுப்புடன் (உதாரணம்: ) தொடங்க வேண்டும்" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' வரியுருவை தொடர்ந்து '%s' வர முடியாது; அதைப் பயன்படுத்தி ஓர் உறுப்படியின் பெயரைத் " +"தொடங்க முடியாது" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"ஒற்றை வரியுரு '%s', '%s' உறுப்படி தொடங்கல் ஒட்டை ஓர் '>' வரியுரு முடிவு செய்யும் " +"என்று எதிர்பார்த்தது" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%s' ஓர் ஒற்றை வரியுரு, பண்பின் பெயர் '%s' பின் ('%s' உறுப்பின்) எதிர்பார்த்தது ஓர் '=' " +"வரியுரு" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' is not a valid character following the close element name '%s'; the " +"allowed character is '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' உறுப்பு மூடப்பட்டுல்லது, தற்பொது ஒரு உறுப்பும் திறந்து இல்லை" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' உறுப்பு மூடப்பட்டுல்லது, அனால் தற்பொது திறந்திறுக்கும் உறுப்பு '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "வெற்றான ஆவணம் அல்லது ஆவணத்தில் இறுப்பது அனைத்தும் வெண்வெளி" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "'<' பிறகு ஆவணம் திடீரென முடிவடைந்தது" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"உறுப்புகள் திறந்திறுக்கும்போது ஆவணம் திடீரென முடிவடைந்தது - கடைசியாகத் திறக்கப்பட்ட " +"உறுப்பு '%s'" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ஆவணம் திடீரென முடிவடைந்தது, அடையாள ஒட்டு <%s/> முடிவில் ஓர் '}' இருக்கும் என " +"எதிர்பார்த்தது" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "உறுப்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "பண்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "உறுப்பு-தொடங்களின் அடையாள ஒட்டு உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "பண்பு பெயர் உள்ளிறுக்கும் போது ஆவணம் திடீரென முடிவடைந்தது" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' என்னும் மூடு-அடையாள ஒட்டு உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ஆவணம் திடீரென குறிப்புரையுல் அல்லது செயலாக்கம் ஆணையுல் முடிவடைந்தது" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "சிதைந்த பொருள்" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "உள்ளமை தவறு அல்லது சிதைந்த பொருள்" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "நினைவகம் நிரம்பியது" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "பின்நோக்கி ஆராயும் எல்லை அடையப்பட்டது" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "தோரணி உள்ளடக்கங்கள் பகுதி பொருத்தத்துக்கு ஆதரவு தராத உருப்படிகளாக உள்ளன" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "உள்ளமை தவறு" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "பின்நோக்கும் சமர்பணங்கள் பகுதி பொருத்தத்துக்கு ஆதரவு தராத உருப்படிகளாக உள்ளன" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "உட்சுழல் எல்லை அடையப்பட்டது." + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "காலியான துணை சரங்களுக்கு பணியிட எல்லை அடையப்பட்டது." + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "செல்லாத புது வரி குறிகளின் கூட்டு" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "தெரியாத தவறு" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "அறியாத எழுத்து வருகிறது \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "case-changing escapes (\\l, \\L, \\u, \\U) இங்கு அனுமதி இல்லை" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} தகுதியாளரில் செயலிழக்கப்பட்டவையின் எண்ணிக்கைகள்" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "நிறையில்{} எண்கள் மிக பெரிதாக உள்ளன" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "எண் வகுப்புக்காக ] விடிபட்டவைகளை முடிவடையச் செய்தல்" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "எண் வகுப்பில் தவறான வரிசைமுறையை தவிர்த்தல்" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "எழுத்து வகுப்பில் வரம்பு செயலிழக்கப்பட்டது" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "மீண்டும் செய்வதற்கு எதுவுமில்லை" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "அடையாளம் காணமுடியாத எண்ணிற்கு பிறகு (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "அடையாளம் காணமுடியாத எண்ணிற்கு பிறகு (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "அடையாளம் காணமுடியாத எண்ணிற்கு பிறகு (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX என பெயரிடப்பட்ட வகுப்புகள் வகுப்பிற்குள் மட்டும் தான் துணைபுரியும் " + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "விடுப்பட்ட முடித்தல் )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") திறக்காமல் (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R அல்லது (?[+-]இவற்றால் எண்கள் பின்தொடரப்பட்டால் )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "இல்லாத துணை தோற்றத்திற்கான குறிப்பு" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "கட்டளைக்கு பிறகு ) தவறியது" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "சாதரண வெளிப்பாடுகள் மிகப்பெரியவை" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "நினைவிற்கு கொண்டு வருவதில் தோல்வி" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind வலியுறுத்துதல் நிலையான நீளத்தில் இல்லை" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "தவறான எண் அல்லது பெயருக்கு பிறகு (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "நிபந்தனைக்குட்பட்ட குழு இரண்டுக்கும் மேற்பட்ட கிளைகளை பெற்றுள்ளது" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "பின் வலியுறுத்துதல் எதிர்பார்க்கப்படுகிறது (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "தெரியாத POSIX வகுப்பு பெயர்" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "எண்ணின் மதிப்பு \\x{...} இடைவிடா வரிசையில் மிகப்பெரிதாக உள்ளது" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "தவறான நிபந்தனை (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ஐ lookbehind ல் வலியுறுத்த அனுமதியில்லை" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "கட்டாயமில்லாமல் மறுசுழற்சி அழைப்பு சுற்றாது" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "subpattern பெயரில் முடிக்கப்பட்ட விடுபட்டவைகள்" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "இரண்டு பெயரிடப்பட்ட subpatterns களும் ஒரே பெயரை பெற்றுள்ளது" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "தவறானது \\P அல்லது \\p இடைவிடா வரிசையானது" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "பின் தெரியாத இயல்பின் பெயர் \\P அல்லது \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern ன் பெயர் மிக நீளமானது (அதிகபட்சம் 32 எண்கள்)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "subpatterns க்கு நிறைய பெயர்கள் உள்ளது (அதிகபட்சம் 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "எண்ம மதிப்பு \\377ஐ விட அதிகம்" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE குழு ஒன்றுக்கு மேற்பட்ட கிளைகளை கொண்டுள்ளது" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE குழுவை மீண்டும் அமைக்க அனுமதி இல்லை" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "தொடர்சியற்ற NEWLINE விருப்பங்கள்" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g ஒரு அடைப்புக்குறி மெயர் அல்லது ஒரு விருப்பமான அடைப்புக்குறி பூஜ்ஜியமில்லாததை " +"தொடர்ந்து வராது" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "எதிர்பாராத திரும்புதல்" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "அதிக குறியீடு" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "overran கைம்பைல் பணியிடம்" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "முன்பு சோதிக்கப்பட்ட குறிப்பிடப்பட்ட துணை தோற்றம் இல்லை" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "வழக்கமான கூற்றை பொருத்துவதில் பிழை%s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "பிசிஆர்ஈ நூலகம் யூடிஎஃப்8 ஆதரவு இல்லாமல் தொகுக்கப்பட்டது." + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "பிசிஆர்ஈ நூலகம் யூடிஎஃப்8 பண்புகள் ஆதரவு இல்லாமல் தொகுக்கப்பட்டது." + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "இயல்பான கூற்று %s ஐ தொகுக்கும்போது %d வரியுருவில் பிழை: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "இயல்பான கூற்று ஐ உகந்ததாக்கும்போது பிழை:%s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "பதின்னறும எண் அல்லது '}' எதிர்பார்க்கப்பட்டது." + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "பதின்னறும எண் எதிர்பார்க்கப்பட்டது." + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "குறியீட்டுருவான சமர்பணத்தில் '<' ஐ காணவில்லை" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "முடிவடையாத உள்ளீட்பு மேற்கோள்" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "பூஜ்ய நீள உள்ளீட்பு மேற்கோள்" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "எண் எதிர்பார்க்கப்பட்டது" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "சட்டவிரோத உள்ளீட்பு மேற்கோள்" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "அனாதையான கடைசி '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "தெரியாத வெளியேற்ற வரிசைமுறை" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "மாற்று உரை \"%s\" ஐ பகுக்கையில் பிழை வரியுரு %lu இல்: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "மேற்களித்த உரை ஓர் \" -உடன் தொடங்கவில்லை" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "`கட்டளை வடியில் அல்லது வேறு மேற்களித்த உரையில் பொருத்தமற்ற \" " + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' வரியுருக்கு பின்பு உரை முடிவடைந்தது. (கடைசி உரை: '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"%c க்கு பொருத்தமான மேற்கோள் கண்டுபிடிப்பதட்கு முன் உரை முடிவடைந்தது. (உரை: '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "உரை வெற்றா இருந்தது (அல்லது வெண்வெளி மட்டுமே)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "சேய் செயலில் இருந்து தரவு வாசிக்க முடியவில்லை" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "(%s) சேய்-செயலிடன் தொடர்பு கொல்ல கழாய்த்-தொடரைப் படைக்க முடியவில்லை" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "(%s) சேய் கழாய்த் தொடரில் இருந்து வாசிக்க முடியவில்லை" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' (%s) அடைவுக்கு போக முடியவில்லை" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "(%s) சேய்-செயலை இயக்க முடியவில்லை" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "தவறான நிரல் பெயர்: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%dல் மதிப்பரு வெக்டாரில் தவறான சரம்: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "சூழலில் தவறான சரம்: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "தவறான பணி செய்யும் அடைவு: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "உதவியாளர் நிலையை இயக்க முடியவில்லை (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) சேய்-செயலில் இருந்து தரவு வாசிக்க முடியவில்லை" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "(%s) சேய்-செயலில் இருந்து தரவு வாசிக்கும் போது, select()'டில் எதிர்பாராத பிழை" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "(%s) waitpid()'டில் எதிர்பாராத பிழை" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) தொடங்க முடியவில்லை" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\" (%s) சேய்-செயலை இயக்க முடியவில்லை" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "சேய் (%s) செயலகத்தின் வெளியீடலை அல்லது உள்ளடலை திசை-மாற்றும்போது பிழை" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "சேய் (%s) செயலகத்தை தொடங்க முடியவில்லை" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "சேய் செயல் \"%s\" இயக்கும்போது தெரியாத பிழை" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Failed to read enough data from child pid pipe (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 க்கு வரியுரு வீச்சு எல்லைக்கு வெளியே" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "உரையாடல் உள்ளீட்டில் தவறான வரிசை" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 க்கு வரியுரு வீச்சு எல்லைக்கு வெளியே" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "ஓபயன்பாடு:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "உதவி விருப்பங்கள்:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "உதவி விருப்பங்களை காட்டு" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "அனைத்து உதவி விருப்பங்களை காட்டு" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "பயன்பாடு விருப்பங்கள்:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "'%s' க்கு %sன் இயல் எண் மதிப்பினை கூறிட முடியாது" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' க்கு %sன் இயல் எண் மதிப்பு வரையறையை தாண்டியுள்ளது" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "இரட்டை மதிப்பு '%s' ஐ %sக்கு கூறிட முடியாது" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "இரட்டை மதிப்பு '%s' %sக்கு வரையறையை தாண்டியுள்ளது" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "கூறிடும் போது பிழை: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr " %sக்கான விடுபட்ட மதிப்புரு" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "தெரியாத விருப்பம் %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "தேடல் அடைவுகளில் சரியான விசை கோப்பினை காண முடியவில்லை" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ஒரு முறையான கோப்பில்லை" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "கோப்பு வெற்றாக உள்ளது" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"விசை கோப்பு வரி '%s' கொண்டுள்ளது இது விசை-மதிப்பு சோடியை, குழு, அல்லது குறிப்பு அல்ல" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "செல்லுபடியாகாத குழு பெயர்: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "விசை கோப்பு ஒரு குழுவாக ஆரம்பமாகாது" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "செல்லுபடியாகாத விசை பெயர்: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "விசை கோப்பு துணையில்லாத குறிமுறையை கொண்டுள்ளது '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "விசை கோப்பு குழுவினை கொண்டிருக்கவில்லை '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr " '%s' விசையை விசை கோப்பு கொண்டிருக்கவில்லை" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr " '%s'மதிப்பினை உடைய '%s'விசை விசை கோப்பு கொண்டுள்ளது, இது UTF-8 அல்ல" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "%s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற முடியாது." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "%s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற முடியாது." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"'%s'குழுவில் %s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற " +"முடியாது." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "'%s' குழுவில் '%s' விசையை விசை கோப்பு கொண்டிருக்கவில்லை" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "கடைசி வரியில் விசை கோப்பு விடுபடு எழுத்தினை கொண்டுள்ளது" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "விசை கோப்பு தவறான விடுபடு வரிசையை கொண்டுள்ளது '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "மதிப்பு '%s' ஒரு எண்ணாக செயல்பட முடியாது." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "இயல் எண் மதிப்பு '%s' வரையறையை தாண்டியுள்ளது" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "மதிப்பு '%s' தசம எண்ணாக செயல்பட முடியாது." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "மதிப்பு '%s' பூலியனாக செயல்பட முடியாது." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%sக்கு மிகப்பெரிய எண்ணிக்கை மதிப்பு செலுத்தப்பட்டது" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "ஸ்ட்ரீம் ஏற்கனவே மூடப்பட்டது" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "செயல்பாடு ரத்து செய்யப்பட்டது" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "தவறான சாக்கெட், துவக்கப்படவில்லை" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "நிலை மாற்றியின் உள்ளீடுக்கு தவறான பைட் வரிசைமுறை" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "சாக்கெட் முகவரிக்கு போதிய இடம் இல்லை" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "ரத்துசெய்யக்கூடிய துவக்குதல் துணைபுரிவதில்லை" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "தெரியாத வகை" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s கோப்பு வகை" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s வகை" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "எதிர்ப்பார்க்கப்படாத முடிவு ஸ்ட்ரீம்" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "பெயரில்லாதது" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "பணிமேடை கோப்பு Exec புலம் குறிப்பிடப்படவில்லை" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "விண்ணப்பத்திற்கு தேவைப்படும் முனையத்தை கண்டுபிடிக்க இயலவில்லை" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "பயனர் விண்ணப்ப கட்டமைப்பு கோப்புறை %sஐ உருவாக்க இயலவில்லை: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "பயனர் MIME கட்டமைப்பு கோப்புறை %s உருவாக்க இயலவில்லை: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "பயனர் டெஸ்க்டாப் கோப்பு %s உருவாக்க முடியாது" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%sக்கு தனிபயன் விளக்கம்" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "இயக்கி வெளியேற்றம் செயல்படுத்தப்படுவில்லை" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "இயக்கி eject_with_operation அல்லது வெளியேற்றம் செயல்படுத்தப்படுவில்லை" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "இயக்கி ஊடகத்தில் பதிவு செய்யப்படவில்லை" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "இயக்கி துவக்கத்தை செயல்படுத்தப்படுவில்லை" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "இயக்கி நிறுத்தத்தை செயல்படுத்தப்படுவில்லை" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "பதிப்பு %d GEmblem குறிமுறையில் கையாள முடியவில்லை" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "தவறான டோக்கன்களின் எண்ணிக்கை (%d) GEmblem குறிமுறையில்" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "பதிப்பு %dஐ GEmblemedIcon குறிமுறையில் கையாள முடியவில்லை" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "தவறான டோக்கன் எண்ணிக்கை (%d) GEmblemedIcon குறிமுறையில்" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon க்காக ஒரு GEmblem எதிர்பார்க்கப்படுகிறது" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "செயல்பாட்டிற்கு ஆதரவு கிடையாது" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "கொண்டுள்ள மவுண்ட் இல்லை" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "அடைவுக்கு மேலாக நகலெடுக்க முடியாது" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "அடைவுக்கு மேலாக அடைவினை நகலெடுக்க முடியாது" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "இலக்கு கோப்பு வெளியேற்றப்பட்டது" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "அடைவை மீண்டும் நகலெடுக்க முடியவில்லை" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "என்பதன்-குறுக்கம் இணைப்புகளுக்கு ஆதரவு கிடையாது" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "கோப்பு திறக்கும் போது பிழை: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "சிறப்பு கோப்பை நகலெடுக்க முடியவில்லை" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "தவறான symlink மதிப்பு கொடுக்கப்பட்டுள்ளது" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "குப்பை ஆதரவு கிடையாது" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "'%c' கோப்பின் பெயர்களை பெற்றிருக்கவில்லை" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "தொகுதி மவுண்டை செயல்படுத்தவில்லை" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "இந்த கோப்பைக் கையாள எந்த பதிவு செய்யப்பட்ட விண்ணப்பமும் இல்லை" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "எண்ணிடல் மூடப்பட்டது" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "கோப்பு எண்ணிடல் சிறந்த செயல்பாட்டை கொண்டுள்ளது" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "கோப்பு எண் ஏற்கனவே மூடப்பட்டது" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon குறிமுறை பதிப்பு %d ஐ கையாள முடியவில்லை" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon க்கு தவறான உள்பாடு தரவு" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "ஸ்ட்ரீம் query_infoக்கு துணைபுரியவில்லை" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "ஸ்ட்ரீமில் தேடுதல் துணைபுரியவில்லை" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "உள்ளீடு ஸ்ட்ரீமில் வெட்டுதல் அனுமதி இல்லை" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "ஸ்ட்ரீமில் வெட்டுதல் துணைபுரியவில்லை" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "தவறான டோக்கன்களின் எண்ணிக்கை (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "வகுப்பு பெயர் %sக்கு வகை இல்லை" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "வகை %s GIcon முகப்பை செயல்படுத்தவில்லை" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "வகை %s பிரிக்கப்படவில்லை" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "தவறான பதிப்பு எண்: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "வகை %s from_tokens()ஐ GIcon முகப்பில் செயல்படுத்தவில்லை" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "கொடுக்கப்பட்ட சின்ன குறிமுறை பதிப்பை கையாள முடியவில்லை" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "உள்ளீடு ஸ்ட்ரீம் வாசிப்பை செயல்படுத்தவில்லை" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "ஸ்ட்ரீம் சிறந்த செயல்பாட்டை கொண்டுள்ளது" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "சாக்கெட் முகவரிக்கு போதிய இடம் இல்லை" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "துணைபுரியாத சாக்கெட் முகவரி" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "முன்னிருப்பு உள்ளமை அடைவு மானிட்டர் வகையை தேட முடியவில்லை" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "செல்லுபடியாகாத கோப்பு பெயர் %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "கோப்பு முறைமை தகவலை பெறும் போது பிழை: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ரூட் அடைவை மறுபெயரிட முடியவில்லை" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "கோப்பு மறுபெயரிடும் போது பிழை: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "கோப்பை மறுபெயரிட முடியவில்லை, கோப்புபெயர் ஏற்கனவே வெளியேற்றப்பட்டது" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "தவறான கோப்பு பெயர்" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "கோப்பு திறக்கும் போது பிழை: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "அடைவை திறக்க இயலவில்லை" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "கோப்பு நீக்கும் போது பிழை: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "கோப்பினை குப்பைக்கு அனுப்பும் போது பிழை: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "குப்பை அடைவு %sஐ உருவாக்க முடியவில்லை: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "குப்பைக்கு மேல் நிலை அடைவை தேட முடியவில்லை" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "குப்பை அடைவை தேட அல்லது உருவாக்க முடியவில்லை" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "குப்பை தகவல் கோப்பினை உருவாக்க முடியவில்லை: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "கோப்பை இழுக்க முடியவில்லை: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "அடைவை உருவாக்கும்போது பிழை: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' என்பதன்-குறுக்கம் இணைப்பை வாசிக்க முடியவில்லை: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "குறிப்பீட்டின் இணைப்பை ஏற்படுத்துவதுல் பிழை: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "பிழை நகர்த்தும் கோப்பு: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "அடைவில் அடைவை நகர்த்த முடியவில்லை" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "பின்சேமிப்பு கோப்பு உருவாக்க முடியவில்லை" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "பிழை நீக்கும் இலக்கு கோப்பு : %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "மவுண்டிற்கிடையே நகர்த்த முடியவில்லை" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "அளவுரு மதிப்பு பூஜ்ஜியமாக இருக்கக்கூடாது" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "தவறான அளவுரு வகை (சரம் எதிர்பார்க்கப்பட்டது)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "பண்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "விரிவான அளவுரு'%s' அமைப்பதில் பிழை: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' கோப்பை துவக்குவதில் பிழை : %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (தவறான குறிமுறை)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "கோப்பு விவரிப்பவரை துவக்குவதில் பிழை: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "தவறான அளவுரு வகை (uint32 எதிர்ப்பார்க்கப்பட்டது)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "தவறான அளவுரு வகை (uint64 எதிர்பார்க்கப்பட்டது)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "தவறான அளவுரு வகை (பைட் சரம் எதிர்பார்க்கப்பட்டது)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "symlinksக்கு அனுமதிகளை அமைக்க முடியவில்லை" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "பிழை அமைப்பதில் அனுமதி: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "மாற்றும் போது பிழை: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink பூஜ்ஜியமாக இருக்கக்கூடாது" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink: %s கை அமைப்பதில் பிழை" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink அமைப்பதில் பிழை: கோப்பு ஒரு symlinkஆக இல்லை" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "மாற்றத்தை அமைக்கும் போது அல்லது அணுகல் நேரத்தில் பிழை: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux சூழல் பூஜ்ஜியமாக இருக்கக்கூடாது" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux சூழலை அமைப்பதில் பிழை: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux இந்த கணினியில் செயல்படுத்தப்படவில்லை" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "அளவுரு %s ஐ அமைப்பதில் ஆதரவு கிடையாது" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "கோப்பிலிருந்து வாசிக்கும் போது பிழை: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "கோப்பை பார்க்கும் போது பிழை: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "கோப்பை முடிக்கும் போது பிழை: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "முன்னிருப்பு உள்ளமை கோப்பு மானிட்டர் வகையை தேட முடியவில்லை" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "பிழையை எழுதும் கோப்பு: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "பழைய பின்சேமிப்பு இணைப்பை நீக்குவதில் பிழை: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "பின்சேமிப்பு நகலை உருவாக்குவதில் பிழை: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "மறுபெயரிடப்பட்ட தற்காலிக கோப்பில் பிழை: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "கோப்பு வாசிக்கும் போது பிழை: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' பிழையை திறக்கும் கோப்பு: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "இலக்கு கோப்பு ஒரு அடைவில்லை" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "இலக்கு கோப்பு ஒரு நிரந்தர கோப்பு இல்லை" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "இந்த கோப்பு வெளியார்ந்து மாற்றப்பட்டுள்ளது" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "பிழையை நீக்கும் பழைய கோப்பு: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "தவறான GSeekType கொடுக்கப்பட்டுள்ளது" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "தவறான தேடும் கோரிக்கை" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStreamஐ தசமமிட முடியவில்லை" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "நினைவக வெளிப்பாடு ஸ்ட்ரீம் அளவிடக்கூடியதல்ல" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "நினைவக வெளிப்பாடு ஸ்ட்ரீமை மறுஅளவிட முடியவில்லை" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount unmountஐ செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount வெளியேற்றத்தை செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount unmount அல்லது unmount_with_operationஐ செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount eject_with_operation அல்லது வெளியேற்றத்தை செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount remount ஐ செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount உள்ளடக்க வகையை செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount ஒருங்கிணைத்தல் உள்ளடக்க வகையை செயல்படுத்தவில்லை" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "புரவலன் பெயர் '%s' '[' but not ']'ஐ கொண்டுள்ளது" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "வெளிப்பாடு ஸ்ட்ரீம் எழுதுதலை செயல்படுத்தவில்லை" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "மூல ஸ்ட்ரீம் ஏற்கனவே மூடப்பட்டது" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s'ஐ தீர்க்கும் பிழை: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ஐ தலைகீழாக தீர்க்கையில் பிழை: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'க்கு சேவை பதிவு இல்லை" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "தற்காலிகமாக '%s'ஐ தீர்க்க முடியவில்லை" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "%sஐ தீர்க்கையில் பிழை" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "தவறான சாக்கெட், துவக்கப்படவில்லை" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "தவறான சாக்கெட், இதனால் துவக்க முடியவில்லை: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "சாக்கெட் ஏற்கனவே மூடப்பட்டது" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocketஐ fdஇலிருந்து உருவாக்குகிறது: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "சாக்கெட்டை உருவாக்க முடியவில்லை: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "தெரியாத நெறிமுறை குறிப்பிடப்பட்டுள்ளது" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "உள்ளமை முகவரியை பெற முடியவில்லை: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "தொலை முகவரியை பெற முடியவில்லை: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "கேட்க முடியவில்லை: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "முகவரியை பிணைக்கும் போது பிழை: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "இணைப்பை ஏற்கும் போது பிழை: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "இணைக்கும் போது பிழை:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "இணைப்பு செயலிலுள்ளது" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "இணைக்கும் போது பிழை: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "விடுப்பட்ட பிழையைப் பெற முடியவில்லை: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "தரவைப் பெறும் போது பிழை: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "தரவை அனுப்பும் போது பிழை: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "சாக்கெட்டை மூடும் போது பிழை: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "சாக்கெட் நிலைக்காக காத்திருக்கிறது: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "செய்தி அனுப்பும் போது பிழை: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage windowsஇல் துணைபுரிவதில்லை" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "செய்தி பெறும் போது பிழை: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "இணைப்பில் தெரியாத தவறு" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "கேட்பாளர் ஏற்கனவே மூடப்பட்டது" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "சேர்க்கப்பட்ட சாக்கெட் மூடப்பட்டது" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "பதிப்பு %d இன் GThemedIcon குறிமுறையாக்கத்திற்கு கையாள முடியாது" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 கட்டுப்பாட்டு செய்தியை எதிர்ப்பார்க்கிறது, %dஐ பெறுகிறது" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "எதிர்ப்பார்க்கப்படாத துணை தரவு வகை" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ஒரு fdஐ எதிர்பார்க்கிறது, ஆனால் %dஐ பெற்றது\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "தவறான fd பெறப்பட்டது" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix லிருந்து வாசிப்பதில் பிழை: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix ஐ மூடுவதில் பிழை: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "கோப்பு முறைமை ரூட்" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "யுனிக்ஸில் எழுதும் போது பிழை: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "யுனிக்ஸ் டொமைன் சாக்கெட் முகவரிகள் இந்த கணினியில் துணைபுரியாது" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "தொகுதி வெளியேற்றத்தை செயல்படுத்தவில்லை" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "தொகுதி eject_with_operation அல்லது வெளியேற்றத்தை செயல்படுத்தவில்லை" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "பயன்பாட்டை காணவில்லை" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "பிழையை கண்டுபிடிக்கும் விண்ணப்பம்: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIs துணைப்புரியவில்லை" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32இல் அமைப்பு மாற்றங்கள் துணைபுரிவதில்லை" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32இல் அமைப்பு உருவாக்கம் துணைபுரிவதில்லை" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "நினைவகம் நிரம்பியது" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "உள்ளமை தவறு" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "பிழையான விருந்தோம்புப்-பெயர்" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "உரையாடல் உள்ளீட்டில் தவறான வரிசை" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "அதிகபட்ச தரவு அணி வரம்பை அடைந்தது" + +#~ msgid "do not hide entries" +#~ msgstr "உள்ளீடுகளை மறைக்காதே" + +#~ msgid "use a long listing format" +#~ msgstr "நீண்ட பட்டியலிடும் முறையை பயன்படுத்து" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/te.gmo b/po/te.gmo new file mode 100644 index 0000000000000000000000000000000000000000..5ecc7ae0b53b2ae29dc6a8c1bdf26e7c309a7d9c GIT binary patch literal 66976 zcmd6w37lPZdG`-WUC>qpTv}WXNJs*ikg%Ju7()pAmawS7cr$Zna?Q-#aTY>A=l~jG zWUCnZ7Hva{ECmBeHGr)^tyXQdt+rLFwe8gQ)v8^z?OVJ1et*yNKmT*?x#!-w3F!OI zCug2}&iVhJ_4hpg<(xbDi-Y#xmhiK6za)7Lboix7^4jMm$tPc}t4Xrxup~Jcx)}OG z=!!tk5A;&#OSpbzIB!7T!uh+PYoT9&)}Tipo+LjDy%qX;=mXIC(9c1|{|C?`p+EJ8 zBzZG*0rZv7CiD>KX6Vt-4?*WaKL<^r--jLwefbed!pEc!DmfQJUj^L&Jr;Ts^o`KR zps195A9_6WpgBo$40I(_@-{+`gWd*}yx)c{hW-Pz51OK++Ft;byz8OT?^mHI^l_-{ z`ctU%dfr^u_jS+(oUeq!Dw%}RB)J=k>B*-8{TrzIzYrs(=VE9IT?JhRorL}h^f9RP zy_ClC=P-0B^cLts=;xtFL4O#|59dT7y%?(N@8p-{Z-dsLpM;(XeH}*2FLkK=b~khh z^!K5X|00Zd6Z9OYtyIrMXZz8)vZUmKzF)2~5g@7JKGLw^K40eU)0o(-LX{sQ!A zXbQcUPV(nC^mWjip~B_;P}%!wsOu=k1o{=I^!q_LKL97H z{gF_``825b)u57pUAX^YsPy|dRPw(H6`$`xQ|SJHQn;Q2l^&;u^UI*>HwGot$p@gg zIQb-0a=#0GE%bQ=RsB;ap-PrOrN4kBo{C|L$o9*slQ z?xTTz7J3@zGf+}1dHso=A7?-%e?1gvC!3+-_Xt$>|2b5+_%EpRKjkFvKL{0W-Vc>M zyP*d|{}L*F{~0PhUU9PH`9i49uYoG=ABU>nm!Uv6`4Mz0^k^Ch_m4q!{m-GeD0wl) zDxXh>23-f0KgPrT9Z>1_C{+4wq&_g)?67<#3{~gZ%2dcOpOt6H5lcD0*fXa{WgUZf5 z&_kimKwk^}XDF$Vy!=gW=W^(3&c~r=K|cpo-8pa>zK328JrBAKD!$)@9tQmx28Gu{ z7eQt3MNsK;Jydqz3;j9h7omqkzYUdt4p{DSI}Q38&aZ~*{x;~Vpie->|4UHm`A<+% zE;-^1un4^z`a0+bp^D4Lpu)k|p^|sV3eSUMpz`zC(1V~8&^JIgLuJoH&&xFeEe&{Qpo1rgJBE`rE42>S0(>3`HEZqHkw zeVpG4O`*RDmHpp&@d!UP0eU}FasNiR z{({TA{Si?0Uj~&PmqF#vcZKsiq2l`pRD8bx6>h!`6<+=uD%>4@x!bh_s(9C-^3QEh zwSNdIzP}HB74#pWuYkVr3fJqkQ03W5sQf$vReksn^ySd6KxOy0p=$TSx48X%Q2FTs zsN}7I9t*u1s&)@UCGX2n;pIC}>3!f^-L4a$!tEu{mqD+A9tYhDeKqtcsOsr6(4(QR zc$?d|3@W|e36-DU4ORQQq0;ALP|5uiRPw$CmHz(&O`)$_)EEn(w?ko_%s`KUp0k&}ry-4VU-(&|l#EAcSm$egt|Q z^fep6I`nSnHPAy)23IAwLr;bN9TZl{Q6r26&^w{1oSZo7*YAcd=KT3h*Z&0Q1n2ia zW%nUtK7L#ay^-^eL(hVq^sXcUipeze4(QjQjs4&;?(^|Kfrs{aPLlK?a@bj#7pg)A(27S*ozJwlp1385JN1&@X zpL>)0^IE9ne*$_b^pN-XI`f^-Q#juVy#V@M=u+q#-|O{u3R>g*6HxU(bhD3VS3woe zC!v=^Pq^9rdMor?&c6j+20eC**Re_H>6||Vm0sV4UI;zyebjpBZO}8I-+)TL!?wD- zjnK0=|0Ag69QuBrKTSY^PV#vusgxX#Gk{2PCv*t9->uB?pbe<-^!L!^(4%qIWzZ&6 zd_N045&E**S=&R;gq{z*1xo0WuS1*ARe(k9KMg$>`qE$UJh}pUC+81ANwMTKf(3+< z9Z=!<72F(vjzfiqXP}DPmJc$P>Haoy54r;?|F68u?Yj#K%jA2|mC);c5nG_Y16>6@ z2GA)UH$j0w@)yuC=-WxghoFB51!~DPfZ{6Xzd)~nZupSr{kNbebG{1D$zQiXaeeYH zP(qqq4>*4f`cuE+avp`EN^-z<_v;Sm;oxk}J&nd?Ho2$lTWPS^Xd z1HJ4K_xJBY#pmot(HZ(N=o0Anpu*dc1bZ2D0J;czKUDa61}b^!Zr5uRD!V@eRs7HS zb?5&}&@s+`_G4a;wnE>^`46DFe%{C34^KkB$@y`67^9)Dd<@&6e*+~H$%Btm6P`EQp*60*gdp4s9f2xN{|Qz6`+w8(3P@s`4ebV#bYf$Mw z=P4hD9)@1d`F}wbuhj$_*CpSFqI&Wxzr~mYz2sAlr%ypqExF>i9p^7c`Aax|3lyj% zABCO)z34NZSKFY{Hz6E+9P8NM9bOZD=&^mO{A9!Bg1wDuJ z??T@JJ>d_TlR@u-PD5YxCHK?&pciufb?7qaQD1hy4MQh5{|s~q^yEMCacKf7Tt5kw zzYh9iauoUnXg~CvKk;$k5$N%ppNcc?fsRAp0X_Ju-fj{)!ug*<&xD@&jN|xLsQUd7 zdNXvvpSoQihi>Kk=f39W_d(yp`Afd;VG@_J^+0s=U;~oLw^wH+rQ=Y z^b1hwwc^{Z=T4~fcuM?s3IR7kk0Q!&68g%tPc)Q1-(&w8{=`sHw-R>)( zKq`3@D*bQxzQ^l3&<5x0e&F_h5qcTthy0V{WCQdZ&c6md9eTt+`}}+WdIjfOq3ZwF zP{}+0U%Y<38#=}Le?eD4$1#3A^s`X4KjvRO&wmNJg7d$FjzW+9q2J#D-NgAz{>}aI zUg)WuANcR?rwgD>&UZu4haUDHj>jhSBF=X}Z-f35^hW3n|LJz@|6e{&z7VQ@JE7-7 z{}U?wuKe$?K85}~=ii2&4ITO)pXcp{Ud8!2Kl1VNQ&7d@++;tqa}v6g^Up))K=H*w*(@ENx!=W+fxbTtQVFn!KZCw@+VzAk+JIOmu0`Tcf>m<1~G2**hrzr~@S zMI49FR#?@~K^$jsz8U%nj$h|k#rXmb{d~`fjZw?EHqH6<(6?|r6Yl*vlr*(<^7Ei? z;NF&S@3)~T$BVf}s@Yt6jL$FO^R-Z5XFm%AB^-wTIo!LO&p*YnE8JTNy*PaSWvKEi z`P2%rB1dL+jhKA!+R9eOdx1`g6IITWfK(+}mt z#^E<|?OlAn4EinTA9LvEy&Q^X_VWrpkRrB5(zT5ok8&JFKmDu@bY7sOrTr`mROCXA zmxlX4b}7<9ymFZ}c`salD#y z{k$;HoBcHT2k6_mc2qc5ZMcy0d&0TM!J*Gp&?(MU|Mc@SoPWbV+A}PDyi32hegVhV z^qHSO<#;WJ>ic0F`*H6S=ph`(^Z9I!>}PZMd_duv?rr7x4UP$p8IJ7d_xP}f<2O0J z!trX3*V1<}2Sbhh936OlhqH6}{O{1$aV!kiUkUwLj<<5WCtSOX`!D0TltVvjo!H*g zw(wc?^+n;cNGK5Q+vj82cItr_s5|OS@GxK_{rxp z+3D*;`>%50e{tLt&VL&ELC%+lhBtG5U-m+>~ z;dqMUINCe}J%eLC$4wk{j-xsBb34Z`aQwYa!p}JL%^b_=dqj}2nDfK=d?v?WXm@I$ zo4EGw@LA+Zj*~flmg6iA{d}3@P>wfoypQ8NjwXkG9&loNr;Q-*UC>K7UJ%Yh6Whcy^-T`+Aav!ME;Uv1IGt+ z5`O*_dPU%Q0H5~{pLP3%9G~X+TaFbRzr>-RU*))k<3BlW<5&^;3&R+w4 zg5yR$?+^VWj+caXeSvO;{v5{;#{kExX!GA3+0WtOgZ7W!%b}mSfnLMs>-0ID*BHI3 zHryCU>!bb6fyU_2{AA9;#e?a}H#0o2HKDmkAL_QmxJ7;2U+L%a3o0DlR zbx!^3YvZ;4$@+LY*c={iZiFfK=AJS)jdzx&jmdPRw#oXfs}D6s)7ofSAFhwoM<>(K z+DJX=mGk8Kdd_zOF~`hZnp)@QkpFOVqTZsONm!ancuh9e2XZCkkGZGKt+YUzd6CBen4jG#*bcz2t1u7DdPFwSi4({p!ZVHh(d^$)CzJyNJ(1z->G&w&{FlVyup3!zLx`Aq(s2)CAnlKl}U@h#4Jh3{8!@-6X~Ucjini z;i%|RD|m44dJfblHcU2y#gX?wlMEcMZA^uLlsFHqZ8X=Cj-#XX;kCNBcDONGUkf6@ zP*A9cPLs{Gb;97D9BhmZqy^2xWrPe2*DX~P>fr{E!O0Ushw`U^fwB6u_Q{&f0eO_9 z6(j4Y5PQ?MK5%x=+|L9Qy|-Syo?2DOeFUK72&x8@k~MD=j0S>JxaF$)@TL+fV*@K6 zD#8m4Ya*YzVjzscooNRIf zm{BH_jalQd+Bh|GpgAS(o{g5QDnX7zvGi7r(aHJ{`0vrth9wv_9wFwd~=N<8s%8CMQ?+3R;Kq znVBRVnelWnY5~(ihntm$xUz0oP9#NAZ0FT zPGNwhKu^NkqL#Tw6Lt+{9s83^g|@9+k`<;tY*k3-9=UWbmAX!mCYH9Y;(CL!RU5A_ z@rs%r`L3zvVw!52V+DO|Q`PM_mnz&Gn9`hCHiqG@aBrwSX>4VNubIgD!DgYw zaE)oqdNC->oD26yY8!Nu+0VKriz){F(GA7h&8sTh#4x4ld^*SH0nliEeyhMGtDVt2 zONWXEHsmT*I@~K<)=W>THEjWyyIMncrgB+Kyr=m>DfBJ(N?~T^TyK~o25OVFf)e?S z5eBl_P!UVxOdG457q7EMO9LKCUTMI&Ym81^ZDqWE z^<+VttOZwnc9V~IB{XF%N7#%S%r+51F_~awYm5|Qn6;)7)yFI371j_Hcf*pR+a0+k z-`@%yLeXFj9h19^rt@KA!I$%)k%TNZB#$?T(}4K}=@3h@IRk|@n&%G=_zc5u9*~@A z5@iyR&~lPbt)(@cH)mpgv7ODd3~ZhcgEn(%)xN-1!xeG`&X_-Kx5pZ+=VYIz^tezv za#&>(GjKq43lsdZHgy&y+I(wmq?J~0Elb8_?AF(Z$wyy6)<)V{jcMJg#y)t-FjqF) z!7Mlovo@4D*tJ%jOPZ)2$I8R5!eG&bgUZ=X9v`WNEj4%d2@Xx81oKAm7w8HB8_v6;1w=`1Tl+lY>vo_7({H`r4SUO9B@y4YinUDMsuFg*?&U$N8FsO>6l!QY zO9*Z8LAw$*Gmjdm(l|ng*wxj&PFQ2aXk5dFx$T{0a#`bR`z!~YfZI}M1_y_yCf0Xi z+TMI((`bM1t*w8lxoVu19+npc$mnuCUwf=)v4`_WVP8~$ci(DH&MdWrO}1m|t3z+W zWm|^&nLNkpF>ZrucL&Gz&$ZiOCa>MqWaTP*VzQhaAO?!_eU@oEcX2mMyO%uI7-(*s zNY0`L=FddVVjIr_XtjIN-i5>g)`c8 z*ivm>Ay+hOSwWv2o(8U5#q@ABPx|cfjP~r2;0s#qi=OP8@GR7Ae8)LvMxPn(&16#S z6N|1rHB9GeBToitJj(VR=67t}bHge2IFCEF2aalZ;_(#?T`@MzzVz)wHM820U0xq>5!-F3^Qg4k%64KwMB5Eb?U@Q;1lzC~&xu}) z@^$qBOl^5OFz6GS0iLi;`rXP8ROoJP;m-iVbAursm5fIFHZmg+oZ>{wdY+5ptUAWz3j5q~_g#vxCQ+$n!dOq* zdo;2q3+3BP0Nas*6lWMBsWu>CR8adj1b+v^K_YtXi( zE0|4<=9M;kiNToXZR3*(o6h7x>C__g_H6fwS|P+0tr?Ga%;H<2-ZD9_J~(NQlG*q1 z=WA3^oASWSrVQ(*26>K@oX1j!U0d5%D~(v^*M^zw^8C?jQkd6hC8N6Ox34`Q1 zxPb4;=7u^CDdx=?m@m!So~QQSr~KqI@0mUFajBMr{(P==j$!byIf$M{Cg}n2mQ8l6CTmJ(_ZxJND!)gsU1nmSj7uIqvc^)y!}5c0UgcaIUPv@rWZ2 znI7jnHIK5lE~KOZmQt&htf}Ne+lvV9Qc1NLx9#4W!9KKPZapQX6#Goqd zdl42c@~NAAQ#L8NFq>#wM#oBAxNgs3co52)2TTku^c4H;YtwPW5?L~!c}Kq0dwAou&t4R1bbFfvgaaes`LQ2 zN)>;i)AII`9$BHELga0di^?w?kmO-*nNK@xsh3==@Pzra#w*S7{mr;Ad?K zTHoBL*Wyy`_=E=l6Nz1Iz2YyMp-gFfTh*Kzr(6Y)RNQYxPmrAA+3`(l^?)T=Mu4c^%_QF7tg+0tw(<|&JX>Alr z!h&pvMqINF)J?6r)IpCB8US+2Lad_aPXb&NP1u(8t@w3y(p-fhYz}*!P}X|2x1qRy zVLETMp82Yu?n%)6BAenv@pSH*LT&8QRh(?uozBw``)h5^Ha}Mk&>#YXK z>TFXDC+VFWuj6B?SJalKhW6EZ@KDOw)!EBb#x%UpN~Q5#D9=MWhBvO%C}w-1G}wLt z)gVr{^F0b}rmgk)C;K~amTyvp#C8Pr4mF8#YT55DlKJdhB-a@t-Rlfd2qrLtJ% zvDstEXG+~T4R@nYl?SWeGXWd2Df!+vb)5ah8`}0j zx2^}0C5O3MvLoEcHhap`3Kf}b9%eP{()jvQTCa^O!$$}DnuC1-i^bdaAe2G3<(*c0 zk$CMGLpylWvP$u?S*z{qGC&uffM8P8%^&RZjoVd4ZEgO}Jd+6)Zvtt$BqM2IuVq2U@K5m*-lW zlA4rZy{!>>UCIlM^!~hqYqn13Evm-VXn3q=b z$=fcxX!Y3_Ua)ZC!Yh+Cg&i%%1dUP2n&m!Rgvw3`hItQbU7fkA*1W6_B_>(ZU)7g7 z=LOZ@HzcBb^#I@SvKyamOhRW?C55F;c9Zw;uc?nWgW5?H6|o%FBJ)n4r9ZzIRYPDDyegy1aBn9j70QF1Dex$NcNY@%aKC{X>jZ8*%M?nxC22Ks@d zzs9Q*_V89A@yP`nCu@cmq-)OOnBur}eiWpaRP_}QP+U*)wVDsUID5_2*AklR^2t9A z&7WoHZEAZ>9QbTZq8(Ig->KqC`R&rljch8|+okmhdW?@xjcM`FT=z~TZjOG{XCHrx zuUNI-*E4fQkm?4*wh3kU^RG|fj_}CCAJGl^9t6jE|SJ;#$pB(?q&Ov<6cU9Z$kCJ-u?$~`sNsFR5&neK_=P@ z(i&HIW)ORZX^+*_`IT3%w0c{%Fyou`M|UYOwJy|C-*w5~dT)Imr+h^Vf7CU^Ll`Y4 zl1{DlgmgWny*XtytfD8S%w80-HQX4}y(G9yC1hPg)6n$V>lkKhygtgiSN19$Z}2 zz=GjTRLwf?Ko3w#!^iee|U;TeK@UxlS}{dygtF&b-TnTU1|aY0EqRVN49AKVe?V z*BP1k<5E_?NzUJ4omG5|;qyjnS2sqcMpB+tMuT}DD7;?QzHOt`PX@g>8t`O(q&z@Y zj&m}G>6Sl1EJlM7Ez@N2q6LcG|{)3 zhr$P3bm8j0<*FfMYu_1^k|pV}ixw~HTXbCCu_vaB7cV*f%V@$pL*pK$b|6OLPSzL9iZ=H=Ef~v zxaff8Ua|YM0kOpPxQ=04uE9I}N>854oN7-p^LA2-^47N^d}(?~dh)u)hzdp13R{h@f;LNV4)0th5+SLc`>b9BP@1NPVgBvruZk*Zmi(Ksb?d_Re z_s{Hl!n%IMe(##u^~lWb8)kO#VVi$W*uQBxPi_32*+q}{bLXL~<5SiOu{+gK!f){9 z)Xc8;N?Wl-XCzAPC#*GMQ1uROaEVqJfN_sICoZ7_Z0{GVrJO!$%>xG%MHr6Q#vK^b z5V2gEMX^2R!<(J$!Zb}}5RYzVcI}ywgW<5<^u3u&y;!F}m_hCV^x9HskUX1WhpjQA znzrU0@p(LVJr%wpZ(u?t@I*vOnHx~-BUv~f5@zOeCF0W2=vi~O zITu_#&6nvdOt5gEa*H+(rt`QCQ!s=8V2vb_?kVjwT6Fz7jU2EJBBX*V`qM|y`hc`B zmEe#ip%Aakkwm2eSeEJ_)5Qq;$;>V^`Y89mIekmkl|azkfq?)%D>QVaKG4-M>Nk+3 z8#`upZ?zN`TIs_SoaPV;cci7i8fOOIk}wKA{ep zW6ZSqqEs~jCAGXL)+;Arfz);1YLKV*xT(M#f0v0D-{T(c1zxcg|wE(iTSO z?w)E9)dLgZO>vMf_zbt!)X^VO=ra+H7KG>F%v5qDSpkIs(a#_*jd4$?4qWZ%J=fx4 za}3SFDU#r%fP-Gn2_8^&58+czr_FBFp)M_OPN-CTvWOSJ>E4ohvx+fwESd0iM^+)m zaVT*>l9#FKMrexskenJIe23w{8zi3=7Be2x|-h>qmJcYMC579TE6kKBo znGQB?Y*H*DU46Awb{{~5U*Ka0%h?3tz2@rqn}Q=Mnb5NbK=^%SGQ-; zVO){ILiP;VVJSe+1tK3|xanp00a{vE8MA1p7R-~Ll}5K2cBJb*tAGM=z;3}zW>ZKQ zaH&r=kWxPdDFfBgap`CB5YV3Y{=_A(&i_F{oe3(+%wk*c)WFy(6$vCElcA`2EdkU#LU_Tfjg(@U*w4s?w8FqJ1Nr zTE)hRiS0;qld9nlsc@*4NpZv+VBw0zx-0`QlYU^wz+eW&Q3qE8S#t|5vU^;0^%+bH zrnUbWBC)kjE(gS-1!C?-pm(%9=B(%xW<@l^Be({&Q~*jlC3ZvJ4!0fR1jI*kEq%~2 z#spZ&xsqiw#h`?pO2LI1>PsRlg|z3j_(ZxYs%A7ZSRV<=t=wM)CsZ?n1%(yq+s(Fz zVaGR!_JVJlhIE$kmdGfDYaaxr{x_Ej(*_G*=JjlOL@(u7mBn#*;66dKsexq?jrW)n zfT*%;VNzmHrI3}q%@zz~IzO<7&jnSGrTw&GSYnZr2yK927h&|@MA_q~qU*Jd8-mCC zEC=y0vb=@}WEP8fz=fm`PoL#HU{Z;{q15Ey8SEln*zXAhC^;o)+(Ko! z3Qk^O96C76J8;iUvnZKM2>_*CGiduwJN${Y0E&yMddOxo2F_v7=$-@;Ks&qW9nbJG(qa0`Et7_ynGQ1^rrd+b9dPPP#eXxBptG$)V=wh@2i#J;@voO?U#h)Jb37egQLhuQrEM?|kNRBHq2PRwhsQ%Ex5GpR`QI?h#IrF5Fd~lBz?4I}B&;@StE}iyL4bWz!aPm3z3J#S&iL`dp}u0>sf-4&-EyIm@-a z%Rh4!&Ojk6SXL6b3Pwm}!UHm7D+7nCi%7u;h=DgO<0?oltA|AVd5`xk=?X&FGcXH1 zX9yo~c{)u@)946^^(4V>nyHjz(oF>kOjfu#U!Y$epORq#ledJbJ`Pk%9)SjU?p(+p@RhKf?k{94*F2O0p^W%35=&s9&r} zfm`yN>$f1&AqRXwTPxToV`z;R9c(HNMT6yN7KAu}--LR*_vUKJe`Skk(VAfXR}S0l z#IYJ0?S_JoL75LB03Sdm?20b6fb8z}ES-RW6R@m-O0NO{TVnGRe?HMP!xsE;D}P22 z)@5uk-cu{VT&_eB^&!Ua2ZK^AXt>7!5+<`gB4QeC^qFROIr0=pS|IAs(Zlr_5=zcP zMMS70#-NFCuUSc$ki~&8V91_AU=x8MmV8j`Pzl%i(B^K=r}o@-6Kos^TwAU=|o$k2~rvM-GCyqC<4#GPEYdq_El!%UTM=!f!j-RU@Z4! zdWFHp0|K}R0ImT&HsS~(4hdxoC(*0S)Nt>1U9~@2nI#MT%l=xLT1R4|E*^!DR@EFm z;IsX?%j&*dB?{=z%njrK2F4jYta8Xb%nrGO22mkUmg8Zzr89A-FNve>QJlHX&dC>U z;!uEz>s1{@ZZE0Bv~;?`!o*TmSK#JWS8R3RWRCB zBTs_L1u}nbwCEI+0mjJZH!OFW8(X|%`#nW)2DM2Ax`pX7AkKDE9A}>Vp&*-e0u!h= zQ+MBx#Jv;q9HQZbf3XpW1xLHoiiD(hED6Y<_XEZmoupl;gf=ha96aFNEG)W>2qGg~ z0D5i{5A_QVCw(@C4#p^0iQa@ji3Hja2uGxaF+_{}*|^fds|5~nuS+ESAn@~i?5-H5 zx*D4$%#hG~=d1#UBtZqKlkL75ME6FQ&i)6!-MqmYW6_oS%7pkcXkdZ^9ax3LAS9d+ z+Z+Q}$=*y}y)1fhgzo|aU)=%&yzOc0$efPDz&^9KTB1OZX~Mb{$p9x2!=MFm|-v2N!Tdb^#rb&2LZj5OLh4PbxaQ8BYCk2Nv=pw$A@6&)r1qJU=#vN%0(}U)9xtcUSxz1H24{c_}#(!V7%K*vnTk2 zMCgVy936$CZa0AB7VgIoN+f?*mwQ~zxwMy})>ymKy-S7|TSpZJbm?B9wa+j*f<+41 z>?1lNV<~<>shX?X!Al6Tt*WL~vg;cE3|My_~IQKen(5ZEHaqu$Zd8!MTZ+uTM&_6|*ndSO>^-0a18pIM_0-U1EUqVXDlfzwtP z$w?s8V>bH0ii=1x+%D~7WS6l4*8fM?7q5MWMMiTN8Bxx_F_Y%x1fX+Vmp+BEJBwADcWOT5tcyQuL z;1dG3qz9NKVa>R&{o~*fW-Y!bVuT~Pw)I(!E9qqz2w7J(OR>t`wYJ;9q*(+}BImVr zRXI!)>QYPbz*f3B0sv)|5~GE3bOpJ9!ly<%Q3E3wXMKra!^7;Rp!Zf8 zts+t=B|6oXsLvc{c_h%Y%wjNb#-5lUIE@Hni$8Y}?tQjE1>NlR8D)HehD!TlDBXA$ z&?k7LsO;nSK6orn>)=JA0v1vd4#$9{qG|0%~#HOFIt<{j1c z+NFs@(vgX3Mf4mv1hFKyCp0br(C(YAbE2-Pjh@1U_Gs{%i{aq`%-Z%G(5^RyV-)D& zBL>?%uv4LnF4`weaK*Fn9#N#A;TQ~M+QM&;=coImPSC|Yha;JQIG_7)0hT(h?=e49 z0tF&_2O&C$0#ghpuddrG4FoNZrZe$qw!e&4)EhVgM7<1H6~0cO4z+HNY3Vhfm-TA* z<-tBO&A0WZ+8glq9b5}tkxYT3{I;=^yWLI>%ihXpWqzu?H5yRqb}n>Ml3 zU;CjSMw)rbY^m;py2G&Wu+ov~d4pB==_Dplj8q&Dw?O5(x}$^i2ZtS@Vo-<`Vaz(7`35 zqAdf+W;dsJ;8KRkg zDKntLbAN|9zOZgk$L&_61gcgz79=LYy}YzaarAh}xVAnygjF>3J>#~(w0TL`B~byb z`%7!*y%m(SR|UAh(uYEn!S~eob}PfEZaJXLUP8ayOaWQv8IFetux4!h39~9U!Cdxs zpWKGJ;nh#6XK(10@-r+)J4Rwj8vfUnDm4N=W>+KT{GJS<0` zJ|Q#?Pp5sxnE?kU`mP0EW{}&@esEw(xR1F$*}|wD zDt8*Y(Au4$-xQ9@faPTphKeo!+r7_~_Ew-53Vvs^pl72)_8=n6F^C>sV|k}=5e7n} zvXzzevh8u{MnB(`BcQlO+t)q%C7>WU#r{r3n@&*;g;h>|_THE8dniNuC@we3YLd?% z-6yy=JQs8iV+wKPDwCno0(c*B6~+QaG+({Oms$X`0PEri7r{k6Mof|(d~2{X9hEY( zPos&n20(g%cY0_HpAE`zWteesVZR*9ThvSqYl$)MJlWPrQ3iuwgSke0FCpm2jGW)V zi$NF%DDAnu*F$jOzm=N3%u-kJD!+Z^G>t&2n3CSTY_kB@FgQJ%bok^^n>+OO*@7Tg zGKg&RAo|3DI;Kj#_hu!Xyd370!IvlwJdlVNBQD}SVYhPO6#vVt*&POuDq`JDi;i_x zs3xZbP39xvzv1ep0n?FvaYK&^WdF0*zG`6q1DF+4oX=RR5fS77udw&yrdF6hLxM#^ z0A!<=R>uH_lqXxa+Xv-4!x|A(mDg|G;FRcUhlt24U-<+dL!J7vt0v4yz9#lr>IUR72<>BiYn6%&@*S^zjEBaYph}Al8qF(Ii@6l5hH}e_oZd0$ zx3Xhp5AH>qy$VW)O0L|nDB#nehhAtQ7#N`%VL$_QTfngmcI{l(W3lqsm`C7nl^ zTf3ZUhV1toMD#|cHZZsm?zY|U$z-sKrT)B?ejk3JQe zD}3m$Asl5Y8qkeYhn;do!IN3p8xmO#(TE#F(uTu%)?kZw;g$!k*dO!5$^W1m9}!haTMbCREs(c!-x>`5euYMl_4!bpT10E}e>FcbqD zoP-Hd$TPdVxd;M?CN13m)J4z)Twvq!#ECeQv_xTtH7#tLsb|lR+p7VLctj#k@a%{v z@a7s)$=%TBq@Qm9R4b+=Ft=I3$VQ!9*X)UB2mkHf;;td{-RbukKP}dKQ=O1bmmAwY zc&Ac8j9g)IHB;Vw+pc_A4pm$3GbB}1v!CCzb1!H=A5;11Vn9UZCo2>+^jX_p0!r_H+>ekgbjWd<`VX}dH_q#Lc!-P_U#uxssu zKB(}pjT#`4;L%A{uB)f2wBQSz84|gIM45s%Y&=Y7Etps; zHH^XgdD>*U2KF@VV~zI zZy`9OUWIh2X67sVa-nIWxdxYJ6N(2J4%`4Og!1+pFSwA^pHMd9ADSVSnl!pdeB@(^ z2PA~T({6zg10_?S5)>?KjzuM!&|$x~n@+mni5dS~007t_hW@uY&|8(YJ&Ks2&P2&l z(NZ+qmLOEPY&xbWCZL@sH8CL7OpVa9v&tpYUGW@+rdz&|gEo~NEFE_}z3@2;SV_uH zG$PLqbP){C(u6GG+;pG>Ji{NSNoIE4Ztx+gn1E;#ARxZ44VkJ|sYau=6adl=7iA1_ z2T?wIzso;!6%zmzI1SGpfT)m^r&l{>K|)9>h>~9QC3tjpk0i5kccqF;`W9$#n^g0P zP1-Qip_nn)>FI}667Dj0M-f$0YZ;cVJQAJ7Fz2nDv|Pn8xXYi1aVr#>N)yqCba!Vf z>C?mrW(*4FZQh zcdE69H1ybP5amxrg%~QZUdSCM8g~GyPu1O}a9|tU(M08Dk#Lg zSzOU#Wta9 zxnCJ40X~!CTt4G!+%+XT!K0wp`d7|d62fhF*PuC!T`$)WUhbJ3!we)SjJDh$RHiw@ zUHF5=mT8&G@F@B@Cz>*Zcyg4NRa>wK#WN*j2YiCxJ@(i_G~8fB`YIsPP92ctk)^^Y z(L1PF*tS8V%t-YP;`|d4li$oACU-Zr#yn{$-)8+RY{OsxZu*Px1m$^c1AP{1w?wIjJ^DWx zdyOB-hq{WHd29>)kTN?yXw%Cik*D1I)aLbu)?Ox1e=>&9O z3v_(Nzui;~SlnqA(};;~CRjemCJinzpivM`E?R!c3e3b7^z&zwaK{VNDUVI{2Y?O6 z0pek{%*A%sU`#-{83w9%peF6G8WkeM{eusiGy()Z!Jv)h75?e2l>J%aQe2)(;TNtt z`wG;iw7Ctgn2Kj!i$aOj@l@w23=gK&-AA=3gS4w5wuCn^ZO!2Ip2*ZYJ*;oW1^~h& zPVAIkG$%*0@ls+iGlx$)Z*5~f9(TN}^Xd_gvIMa5!VosTtW=S{q&80R`Ap9y z@0}-eAGTB^T$N4lqyib+^3t@Ux>R6r5>TL1hi9+5r}tH}z!%Fw4<_&%^yoo ziYzl&5NCy@zFzZ)>kh;1=0ZpaBWk7+1D13#r1I4P)S zDFstfoOT46524r-eVj&m7`h$&luLO!U8rxPC{tr+an+<*DI71dm|PQ z#8*o<50}K-!$1P88lU@C%KMqB#RrIjYlC}3J@z!hdOWPp+{bhHQb{Nojs?{B;p>hp zyf}#1dUr>(+Y9RlVRBn`4|l*C0b<=UGqPx)ojl|+Vdx%lp>Yr+YKltubJR3%Q%ZiV z*5`)ga0_LrUfg)Nvtix^oah`XxUT}?&y5%z2b|1m6C8H0@PLDe-|i@1ECg?~bu)`G zD@;^`2;f%IF`$Rh(04zaFcAhsk-07mQtAJ3$aw=_|D^tyP?+HIj5g2_X9-ZXGr zz&}Hdu5UN5$ z(|wnsfg)JU_WZP2=KwB5r>G`-{tm+qSZepNB?YDv9?-3T6?MkLY@PUcjq|~{3wF;a zn{hsw79%7thX6N(UtQ;7tl`I9D7kAaPA3H~UY8NEw`j* zdyxy17eLQ#h7ocG(DD1hln2|EVx9wh#+$lfdbQ+T(X!s6Tj4!2jJ}2)gE%4FlA+vj zr?kZp9oIFcTiMgS>4WjO!0Q5NGIyx@09p*!ki&pR&>r`CZ8zjPltcioq*K>uhU98T zs!xPM(XDVxsl0bDVlYD&!bn8)e8~UTYdkAmSU+?u|f~`9o6SMx$zDPCf63*Sf zHnaP|OkgnVJSW5s6VL`PYKwQD zdE3|FJ0S$`0!ADB!UP$APDkg;7E{9iZ?~jJHhKhGL}W`|mqfy|IZn?xnvPnJWws5k5`bqNVTHRUgnD)KzktjfN4v=tN?ixvr19T zJVIMN@KaSQ+`xo^nuTXN?eMBQ)1M9;EGy~FFp4SQj^E@Fo|V7hpNUmAg2%X6#HRZR zL`Sy8h!{(s99Ru8#_(srQG}7g35MLyCrZ8~ueHo_mGHcBfSWDpNi(Gy{zY4?#0o-# z0B06rM1F!W41+(sgFI53Nahbi;FDL6G_eR9*ATCqCHJs|;2;hM;GXFsBwQPWqIAe& zm*uMmlybID!6z${QU#t;Uf<8>Y`iNrgh5AmR6$c3r-Y8rw<74uZPkL4kF zZVMLZl|8MhTUp9Q8owBq5aDwagSgD!VerX|;m}+TyOWh*pAy=?H zal+f2VYBeZAh|^hVxNVDnfWc@2eUo^dt~l2k zhHi}6I7%b;%r3Gb_?%|ZQHoEN$bz94Q6a|OtxeumC>q2OJi-kIAQaAo$5Z#lg$oy6 znXG}CXD--6E1AM2$F$mV0txw$nA$EA{WLeBIB}k7Efzk#lU${!2R&W0oVKxMB2gYP z^AY7m#}Ktb5TRRCtF9f>zt4 zf&vh*QYj$LBxA|+hWUw zL!aFUNXaXwe6T%t`EHGM6)tySZgBo&$UG)MI+UnWF1w37Yf2A-h*x09)++|Jgc3g7 zQ^;xPG9NZ?I0hoMWQ-+CIGfaI{t5DNmT0;W(394WxSqG!HscG*CcsB4KIem5AX+<%>2L z6rp1HGdBRtkhti>30wp-^LajmB&~R$g{O$>5m-e{&cUswZQMi@=PIV=i##E@?XGqG z`5lyHZ9!mp=>>ght{C7%A1eV8hM^v9VH-h3wwD{-bCk3=wYPRq7xHnU4OGM5q&qNPly z72euzOi+iI!BBX$Fq*p+28G2uCP&l3?X%%&@7Tg5>$^*^2NcL82Jj_W1Vlr&tX*4D zkMmqV`nKd#1O{%{nc)#f#*D%WlccbB4^M`)IHd!4zTDZpRl3UI!vAfquX{&VGi+A) zIS!4P^@jXXLovnoUR>}!qKF38WL3t*b~Mm>t5a^F@hfLU65OsJZ||hEba^f$p*k_< zx4TX#Dx_{u0jFpV;sJeF@lg*@8gdwoS-8MQUa{a6I?A@MznUx|D#qv^akODn%t!`$=zrKEl!(J0T*6c( zht&raP3(+ylSVWpWw^a3yd9TCzW_!!GBn%AYhp$+LKNNAh9jX%`z!R(` zxr#rOwU|)dR$Z);(MqR%vMF|FB zjsiDg7l9IW4IbZJ?zMSfhQ@L5PeOL(~7fiqX-^lofZ z;Z0#Tha(h?h&QJ}VybCt7Y=5DDF&jp^@v*9-H=`hyl8iyIZ zX_AMg#mn6}SF4j45MXH8Z0hletdO%QA8~hFx=Wfh!LD1(mtivs-|RFUiC$?!fVXWv zqu$$dbX!W?Zjum&e1EG_pME@=U`{txa5P_`0eSi&O3uQwbT1hb<0Rt7i1k7>p~aE^*dWRS8Pzxz{3G8}p=r5UFt*N{l>`SgQe~r4X25 zVOVBucM82GBTR_I!)o!(hPUa;=hIVqgbww8kQE-V* zOtTH4-8a+Eiwzp#F23uxW^R&ypDb8xx|$bhhHXetTF{wKAulTo)f=1y#Qo}3;U2lj zcJ4|*_B2z4(9nxxk;yfWExvSf0IQ@r*zg@#>-q%^Yk|TJ^2d!$*mrTQDmL#hDTa$# z@U&%(0)}9eCLV0KWa<`TgBV5E?WHZ4aJ_K>R~>)!&LPm^Nk=XXy}3$A3y`|tS6=Jj z>yRyr7cE${$R^Q53p}DmC_*uyD5J4-HZlGtE(02EV_)}1fN7=Oq0k$8RKAk}UI`B6 zJ$M-9P{9j|*wPSWp>HhJxCjxb8+v%5ubgAb)QSoWPXfz5j}Q77tL*DtpbKyi24zv% z%np4OR$1}5L!)D>>djGv#O%cz02>8Dk|mY1d($yg4_x8%*>;o6MCXWR)F-*L&7^s! zbE$$OOM1#l(ecCqcL&E;WN}*oHMh2VLVvHzHUOp=J z{}QX{$|egW0mo^$T?3h<2qOwyG0p^r>$wg)?cDPq)*?YMn~I8gJ|~DHH9QFzMG=u? zjUt^jw803-+vu#m;6X{bRvvEO&?|9?mfs&UFY3$qRc$SuIvV1W1PyoX)BBDL@!~CJ zo5ruO&Nm}VZlOG2J=y3JMVx`!Dmm`%7`OS?yWDXa41WjO!@VqManaW7m;UyS$UFw?HSJk!u3k_OB A?EnA( literal 0 HcmV?d00001 diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..f2b66df --- /dev/null +++ b/po/te.po @@ -0,0 +1,2067 @@ +# translation of glib.master.te.po to Telugu +# Telugu translation of glib +# Copyright (C) 2005 Free Software Foundation, Andhra Pradesh. +# This file is distributed under the same license as the GLIB package. +# +# +# విక్రం ఫణీంద్ర , 2005. +# దండు ప్రసాద్ , 2005. +# రమణ సాయి , 2005. +# Krishna Babu K , 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.te\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-17 14:15+0530\n" +"Last-Translator: Krishna Babu K \n" +"Language-Team: Telugu \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "మూలకం '%2$s'కు అనుకోని యాట్రిబ్యూట్ '%1$s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "మూలకం '%2$s'యొక్క యాట్రిబ్యూట్ '%1$s' కనబడలేదు" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "అనుకోని టాగ్ '%s', అనుకున్న టాగ్ '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "అనుకోని టాగ్ '%s' దీని లోపల '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "డాటా dirsనందు యెటువంటి విలువైన పుస్తకగుర్తు దస్త్రము కనబడలేదు" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'కు యిప్పటికే ఒక పుస్తకగుర్తు వుంది" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'కొరకు యెటువంటి పుస్తకగుర్తు కనబడలేదు" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'కొరకు పుస్తకగుర్తునందు యెటువంటి MIME రకము నిర్వచించలేదు" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'కొరకు పుస్తుకగుర్తునందు యెటువంటి వ్యక్తిగత జెండా నిర్వచించలేదు" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'కొరకు పుస్తకగుర్తునందు యెటువంటి సమూహములు అమర్చలేదు" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "ఎటువంటి అనువర్తనము '%s' నామముతో పుస్తకగుర్తును '%s'కొరకు నమోదుచేయలేదు" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec వరుస '%s'ను URI '%s'తో పొడిగించుటకు విఫలమైంది" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "అక్షరమాలలొ కల '%s' నుండి '%s' కు పరివర్తించడానికి సహకరించదు" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' నుండి '%s' కు పరివర్తించడం సాధ్యం కాదు " + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "ఎగుబడి బైట్ క్రమంను పరివర్తించుట నిస్సారమగును" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "పరివర్తనం నందు దోషం కలదు: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "చివరి ఎగుబడి నందు పాక్షికముగా అక్షర క్రమము కలదు." + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ఫాల్ బ్యాక్ '%s' ను '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"దస్త్రం\" యోచనను ఉపయోగించిన యుఆర్ఐ '%s' సంపూర్ణమైన యుఆర్ఐ కాదు" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "స్థానిక యుఆర్ఐ '%s' '#' ను కలుపుకొనియండలెదు " + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr " '%s' యుఆర్ఐ నిస్సారము" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "ఆతిథ్య నామం యొక్క యుఆర్ఐ '%s' నిస్సారము" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "యుఆర్ఐ '%s' నిస్సారమైన ఎస్కేప్ అక్షరాలు కలిగియున్నాయి." + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr " '%s' త్రోవ నామం సరిఐనది కాదు." + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "నిస్సారమైన ఆతిథ్య నామము" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr " వివరణ తెరచుటలో దోషం '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu బైట్లని దస్త్రం \"%s\" చదువుటకు ఇవ్వలేము" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "దస్త్రం '%s': %s చదువుటలో దోషం" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "దస్త్రము \"%s\" చాలా పెద్దది" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr " దస్త్రం '%s': %s నుండి చదువుటలో విఫలమైనారు" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr " దస్త్రం '%s': %s తెరుచుటలో విఫలమైనారు" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "దస్త్ర ఆపాదనలు విఫలమగును '%s': ఎఫ్ స్టాట్() విఫలమైనది: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "దస్త్రమును '%s'నుండి '%s'కు పునఃనామకరణ చేయుటలో విఫలమైంది: g_rename() విఫలమైంది: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr " '%s' దస్త్రమును సృష్టించుటలో విఫలమయినావు. :%s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "దస్త్రము '%s'ను వ్రాయటుకొరకు తెరుచుటలో విఫలమైంది: fdopen() విఫలమైంది:%s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "దస్త్రము '%s'కు వ్రాయటలో విఫలమైంది: fwrite() విఫలమైంది:%s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "దస్త్రము '%s'కు వ్రాయుటకు విఫలమైంది: fflush() విఫలమైంది: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "దస్త్రము '%s'కు వ్రాయటలో విఫలమైంది: fsync() విఫలమైంది:%s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "దస్త్రము '%s'ను మూయుటలో విఫలమైంది: fclose() విఫలమైంది: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ఉన్న దస్త్రము '%s' తొలగించబడ లేకపోయింది: g_unlink() విఫలమైంది: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr " '%s' మాదిరి, '%s' కలిగియుండలెదు. " + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "మాదిరి '%s' XXXXXX కలిగిలేదు" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr " '%s' చిహ్న పూరితజోడి చదువుటలో విఫలమయినావు : %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "చిహ్న పూరితజోడి సహకరించలెదు. " + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "కన్వర్టర్‌ను '%s' నుండి '%s'కు తెరువలేకపోయింది: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr " జి_ఐఓ_ఛానెల్_రీడ్_లైన్_స్ర్టింగ్ ముడి చదువు సాధ్యపడదు " + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr " మిగిలిన దత్తాంశమును రీడ్ బఫర్ లో పరివర్తించలెము " + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr " పూర్తికాని అక్షరాన్ని ప్రసార మార్గం ముగించును. " + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "జి_ఐఓ_ఛానెల్_రీడ్_లైన్_ఎండ్ ముడి చదువు సాధ్యపడదు" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "దస్త్రము '%s'ను తెరువుటలో విఫలమైంది: open() విఫలమైంది: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "దస్త్రము '%s' మాప్‌చేయుటలో విఫలమైంది: mmap() విఫలమైంది: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "వరుస %d అక్షరము %d పై దోషము: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "నామమునందు చెల్లని UTF-8 ఎన్కోడెడ్ పాఠ్యము - చెల్లనిది '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' చెల్లునటువంటి నామము కాదు " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' చెల్లునటువంటి నామము కాదు: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d వరుసలో దోషం కలదు : %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"అక్షరములో అంకె కలిగియున్నందువలన '%-.*s', పార్సింగ్ విఫలమైనది.దాదాపుగా అంక్య భారీగా ఉన్నది -నివేదన " +"(ఉదాహరణకు : ê )" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"అక్షర నివేదన సెమికోలన్ తో ముగియలేదు; దాదాపుగా యిది ఉపయెగించండి యాంపర్ సెండ్ అక్షరం తో ప్రారంభమవరాదు - " +"ఎస్సేప్ యాంపర్ సెండ్ యాజ్ &యాంప్ " + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "అక్షర నివేదన '%-.*s' అనుమతించబడిన అక్షరము ఎన్ కోడ్ అవ్వదు." + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr " ఖాశి వ్యష్టి '&;' చూడబడినది; వర్తించు వ్యష్టిలు: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "మూలకము నామము '%-.*s' తెలిసినది కాదు" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +" వ్యష్టి సెమికోలన్ తో పూర్తవలేదు; దాదాపుగా యాంపర్ సెండ్ ఉపయెగించవలెను అక్షరము దాదాపుగా -' ఎస్కేప్ " +"యంపర్ సెండ్ యాజ్ &యాంప్;' తో ప్రారంభమవలేదు. " + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "పత్రం తప్పనిసరిగా ఒక మూలకంతో ప్రారంభమవలెను (ఉదా. <బుక్>)" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +" '<' తో ప్రారంభమగు '%s' అనునది సరరిఐన అక్షరం కాదు ; యిది మూలక నామంతో ప్రారంభమవలేదు. " + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "బేసి అక్షరము '%s', ఖాళీ-మూలకపు టాగ్ '%s'ను ముగించుటకు '>' అనుకొనబడింది" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "బేసి అక్షరము '%s', ఊహించిన '=' తర్వాత '%s' ఆపాదించు నామం '%s' మూలకం " + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"'%s' ఊహించిన బేసి అక్షరము '>' లేక '/' చివరి ర్రంభ బొందు అక్షరము మాలకం %sలేక ఇచ్చాపూర్వక " +"ఆపాదన; దాదాపుగా ఆపాదన నామంలో అనర్హమైన అక్షరం ఉపమెగించినావు" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"బేసి అక్షరము '%s', ఊహించిన తెరచిన క్వోట్ చిహ్నం తరాత ఇచ్చిన ఆపాదన విలువ '%s' మూతకము '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' is not a valid character following the close element name '%s'; the " +"allowed character is '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr " '%s' మూలకం మూయబడినది, ప్రస్ధుతం ఏ మూలకము తెరచియుండలెదు " + +# ../glib/gmarkup.c:1588 +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' మూలకం మూయబడినది, కాని ప్రస్ధుతం తెరువ బడిన మూలకం '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr " పత్రం ఖాలిగా ఉన్నది లేక ఒక వైట్ స్పేస్ కలిగి యున్నది. " + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "పత్రం చివర కోణ కుండలీకరణము'<' వెంటనె అనవసరముగా ముగింపు అయినది" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"మూలకములు ఇంకను తెరచియున్న పత్రం ఊహించని విధంగా అంతమైనది- '%s' చివరిది మూలకము తెరచబడినది" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"పత్రం ఊహించని విధంగా అంతమైనది,మూసిన కోణకుండశికరణం అంతము చూచుటకు ఊహించబడినది బొందు <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr " పత్రం చివర ఊహించని మూలకనామం కలదు " + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "పత్రం చివర ఊహించని ఆపాదననామం కలదు" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "పత్రం చివర ఊహించని తెరచిన బొందు కలదు." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +" '=' చిహ్నము తర్వాత యాట్రిబ్యూట్ నామమును అనుసరిస్తూ యాట్రిబ్యూట్ విలువలేకుండా పత్రము అనుకోకుండా " +"ముగించబడింది." + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr " లోపల ఆపాదన విలువ ఉన్నపుడు పాఠం ఊహించకుండా ముగింపు అయినది " + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr " '%s'మూలకము యోక్క మూసిన బొందు ఊహించకుండా పాఠం ముగింపు అయినది " + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr " లోపల వ్యాఖ్య క్రమగతి ఆదేశం ఉండగా ఊహించకుండా పాఠం ముగింపు అయినది " + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "పాడైన ఆబ్జక్టు" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "అతర్గత దోషము లేదా పాడైన ఆబ్జక్టు" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "మెమోరీ అయిపోయింది" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "బ్యాక్‌ట్రాకింగ్ పరిమితి చేరుకొంది" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "పాక్షిక సరిజోడికి మద్దతీయని అంశములను మాదిరి కలిగివుంది" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "అంతర్గత దోషము" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "పాక్షిక సరిజోడికి నియమాలు మద్దతీయని కారణంగా బ్యాక్ రిఫరెన్స్‍" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "పునరావృతపు పరిమితి చేరినది" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "ఖాళీ వుపస్ట్రింగ్స్‍ కొరకు పనితలం పరిమితి చేరినది" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "కొత్తవరుస జెండాలయొక్క చెల్లని మిశ్రమం" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "తెలియని దోషము" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ మాదిరి చివర వద్ద" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c మాదిరి చివరవద్ద" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "గుర్తించబడని అక్షరము \\ను అనుసరిస్తోంది" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "కేస్-మరల్పు యెస్కేప్స్‍ (\\l, \\L, \\u, \\U) యిక్కడ అనుమతించబడవు" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} క్వాంటిఫైర్‌లో క్రమము బయటవున్న సంఖ్యలు" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} క్వాంటిఫైర్‌లో పెద్దగావున్న సంఖ్య" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "అక్షరపు క్లాస్‌కు ] ముగింపు తప్పిపోయినది" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "అక్షరపు క్లాస్‌నందు చెల్లని ఎస్కేప్ అనుక్రమము" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "అక్షరపు క్లాస్‌నందు వ్యాప్తి క్రమముకు బయటవుంది" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "మళ్ళీచేయుటకు యేమీలేదు" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? తర్వాత గుర్తించని అక్షరము" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< తర్వాత గుర్తించని అక్షరము" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P తర్వాత గుర్తించని అక్షరము" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX నామపు క్లాసెస్ క్లాస్ లోపల మాత్రమే మద్దతునిస్తాయి" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "ముగించునది ) తప్పిపోయింది" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") తెరిచిన ( లేకుండా" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R లేదా (?[+-]అంకెలు తప్పక ) అనుసరించాలి" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "లేని వుపమాదిరికి రిఫరెన్స్‍" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "వ్యాఖ్యానం తర్వాత తప్పిపోయిన )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "సాదారణ సమీకరణం చాలా పెద్దది" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "మెమొరి పొందుటలో విఫలమైంది" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "వెనుకచూడండి చెప్పినమాట నిర్ధరిత పోడవులేదు" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( తర్వాత తప్పుగావున్న సంఖ్య లేదా నామము" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "నియమరూపక సమూహం రెండుకన్నా యెక్కువ శాఖలను కలిగివుంది" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( తర్వాత చెప్పేమాట అనుకోబడినది" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "తెలియని POSIX తరగతి నామము" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ఖండించుకొను మూలకాలు మద్దతీయబడవు" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} అనుక్రమమునందలి అక్షరపు విలువ చాలా పెద్దది" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "చెల్లని నియమము (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "వెనుక చెప్పిన దానిలో \\C అనుమతించబడదు" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "పునరావృత కాల్ అనంతంగా లూప్‌కాగలదు" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ఉపమాదిరి నామమునందు తప్పిపోయిన ముగింపు" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "రెండు నామాల వుపమాదిరిలు ఒకే నామమును కలిగివున్నాయి" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "తప్పుగావున్న \\P లేదా \\p అనుక్రమము" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P లేదా \\p తర్వాత తెలియని లక్షణము నామము" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ఉపమాదిరి నామము మరీ పెద్దది (గరిష్ఠం 32 అక్షరములు)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "నామము గలిగిన చాలా వుపమాదిరిలు (గరిష్ఠంగా 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "అష్టాంశ విలువ \\377 కన్న పెద్దది" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "నిర్వచించిన సమూహం వొకటికన్నా యెక్కువ శాఖలను కలిగివుంది" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "నిర్వచించు సమూహంను మళ్ళీచేయుట అనుమతించబడదు" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "అస్థిరత్వ NEWLINE ఐచ్చికాలు" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g బ్రేస్‌డ్ నామముతో లేదా పాక్షికముగా బ్రేస్‌చేయబడివున్న సున్నా-కాని సంఖ్యతో అనుసరింపబడదు" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "అనుకోని ఆవృతము" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "కోడ్ వోవర్‌ఫ్లో" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "మించిపోయిన నిర్వర్తనా పనితలం" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "ముందుగా-పరిశీలించిన రిఫరెన్సుడు వుపమాదిరి కనబడలేదు" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "సాదారణ సమీకరణమును సరిజోడి చేస్తున్నప్పుడు దోషము %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE లైబ్రరీ UTF-8 మద్దతులేకుండా నిర్వర్తించబడింది" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE లైబ్రరీ UTF8 లక్షణముల మద్దతులేకుండా నిర్వర్తించబడింది" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "సాదారణ సమీకరణము %sను అక్షరము %dవద్ద నిర్వర్తిస్తున్నప్పుడు దోషము: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "సాదారణ సమీకరణము %sను మెరుగుపరుస్తున్నప్పుడు దోషము: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "హెగ్జాడెసిమల్ డిజిట్ లేదా '}' అనుకోబడింది" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "హెగ్జాడెసిమల్ అంకె అనుకోబడింది" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "చిహ్నరూప రిఫరెన్సునందు '<' తప్పిపోయినది" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "పూర్తికాని చిహ్నరూప రెఫరెన్సు" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "సున్నా-పొడవు చిహ్నరూప రిఫరెన్సు" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "అంకె అనుకోబడినది" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "సరికాని చిహ్నరూప రిఫరెన్సు" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "స్ట్రే ఫైనల్ '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "తెలియని యెస్కేప్ అనుక్రమము" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "పునఃస్థన పాఠ్యము \"%s\"ను అక్షరం %lu వద్ద పార్శ్‍‌చేస్తుంటే దోషము: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "కోటెడ్ పాఠం కొటేషన్ చిహ్నంతో ప్రారంభవరాదు" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr " కమాండ్ లైన్ లేద షల్_కోటెడ్ పాఠం లో సామ్యంలేని కొటేషన్ చిహ్నం కలదు " + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "పాఠం '\\' అక్షరము వెంటనె ముగింపు అయినది. (ఈ పాఠము '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "సామ్యమైన కొటేషన్ చిహ్నం %c లభించకముందె పాఠం ముగింపు అయినది . (ఈ పాఠము'%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "పాఠం ఏమి లేదు (లేక ఒక వైట్ స్పేస్ కలదు)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr " శిశు కార్యం నుండి చదువుటలో విఫలమయినావు " + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr " (%s) శిశు కార్యం తో తెలియచేయుటకు పైప్ ను సృష్టించుటలో విఫలమైనావు " + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr " శిశు పైప్ నుండి చదువుటలో విఫలమయినావు(%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr " '%s' (%s) వివరణ మార్చుటలో విఫలమయినావు " + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "(%s) శిశు కార్యం నిర్వర్తించుటలో విఫలమయినావు " + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "చెల్లని ప్రోగ్రామ్ నామము: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "ఆర్గుమెంట్ శీర్షములో %dవద్ద చెల్లని స్ట్రింగ్: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ఎన్విరాన్‌మెంట్ నందు చెల్లని స్ట్రింగ్: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "చెల్లని పనిచేయుచున్న డైరెక్టరి: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "సహాయ కార్యక్రమం నిర్వర్తించుటలో విఫలమైంది (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr " శిశు కార్యం నుండి జి_ఐఓ_ఛానెల్_విన్౩౨32_పోల్() పాఠం ను చదువుటలో ఊహించని దోషం కలదు" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) శిశు కార్యం నుండి వివరము చదువుటలో విఫలమయినావు " + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr " శిశు కార్యం (%s) నుండి పాఠం చదువుటలో సెలెక్ట్() లో ఊహించని దోషం కలదు. " + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "వెయిట్ పిడ్() లో ఊహించని దోషం కలదు(%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) ఫోర్క్ విఫలమయినది " + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr " \"%s\" శిశుకార్యం నిర్వర్తించుటలో విఫలమయినావు (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ఎగుబడికి రిడైరెక్ట్ చేయుటలో విఫలమైనది లేక శిశు కార్యం యొక్క దిగుబడి (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr " (%s) శిశుకార్యం యెక్క ఫోర్క్ విఫలమయినది " + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr " \"%s\" శిశుకార్యం నిర్వర్తించుటలో తెలియని ధోషం కలదు " + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "శిశు పిడ్ పైప్ (%s) నుండి సరిపడునంత చదువుటలో విఫలమైనావు. " + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "అక్షరము యుటిఫ్-8 శ్రేణియందు లేదు " + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "పరివర్తన ఎగుబడి వరుస నిస్సారము " + +# ../glib/gutf8.c:1382 ../glib/gutf8.c:1478 +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "అక్షరము UTF-16 శ్రేణియందు లేదు" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "వినిమయం:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ఇచ్చాపూర్వరకం...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "సహాయ ఇచ్ఛాపూర్వకాలు:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "సహాయ ఇచ్ఛాపూర్వకాలను చూపించుట" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "సహాయ ఇచ్ఛాపూర్వకాలన్నింటని చూపించుట" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "కార్యక్షేత్ర ఇచ్ఛాపూర్వకాలు :" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "పూర్ణాంకం విలువ %sను %s కొరకు పార్స్‍ చేయలేదు" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr " పూర్ణాంకం విలువ '%s' లో విస్రృతి లో లేని %s " + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "డబుల్ విలువ '%s'ను %sకొరకు పార్శ్‍‌చేయలేదు" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "డబుల్ విలువ '%s' అనునది %sకొరకు వ్యాప్తిలో లేదు" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "ఐచ్చికం పార్శింగ్‌లో దోషము %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s కొరకు తప్పిపోయిన ఆర్గుమెంట్" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "తెలియని ఇచ్ఛాపూర్వకము %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "శోధన dirsనందు విలువైన కీ దస్త్రము కనబడలేదు" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "క్రమబద్దమైన దస్త్రం కాదు" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr " కాళీ దస్త్రం " + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "ఏదైతే మీట-విలువలు , గ్రూప్ ,లేక వ్యాఖ్య కాదో అది మీట దస్త్రంలో లైన్ '%s' కలిగియున్నది" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "చెల్లని గ్రూప్ నామము : %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr " మీట దస్త్రం సముదాయంతో ప్రారంభమవలెదు. " + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "చెల్లని కీ నామము :%s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr " మీట దస్త్రం కలిగియున్న సంకేతరచన '%s' సహకరించదు " + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr " మీట దస్త్రం సముదాయం '%s' ను కలిగియుండలేదు " + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "మీట దస్త్రం '%s' తాళంను కలిగియుండలేదు. " + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "'%s' మీట దస్త్రం యొక్క మీటను కలిగియున్నది,దాని విలువ '%s' యుటిఫ్-8 " + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "'%s' మీట దస్త్రం యొక్క మీట ను కలిగియున్నది,దాని విలువను చదువుటకు సాధ్యపడదు." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "కీ దస్త్రము ఇంటర్‌ప్రీట్ కాలేనటువంటి విలువను కలిగివున్న కీ '%s'ను కలిగివుంది." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"'%s' మీట దస్త్రం యొక్క మీట ను గ్రూప్ '%s' లో కలిగియున్నది,దాని విలువను చదువుటకు సాధ్యపడదు." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "'%s' మీట దస్త్రం యొక్క మీట ను గ్రూప్ '%s' లో కలిగియుండలేదు " + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr " మీట దస్త్రం గీత చివర ఎస్పేప్ అక్షరము కలదు" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr " '%s' మీట దస్త్రం నిస్సారమైన ఎస్పేప్ వరుస కలదు " + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' విలువను సంఖ్య గా చదువుటకు సాధ్యపడదు." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "పూర్ణాంకం విలువ '%s' విస్రృతిలో లేదు" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' విలువను ఫ్లోట్ సంఖ్యగా చదువుటకు సాధ్యపడదు." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "%s' విలువను బులియన్ గా చదువుటకు సాధ్యపడదు." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "చాలపెద్ద లెక్కింపు విలువ %sకు పంపబడింది" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "స్ట్రీమ్ యిప్పటికే మూయబడింది" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "ఆపరేషన్ రద్దైనది" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "చెల్లని సాకెట్, సిద్దపరచలేదు" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "ఎగుబడి బైట్ క్రమంను పరివర్తించుట నిస్సారమగును" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "సాకెట్ చిరునామా కొరకు సరిపోవునంత జాగాలేదు" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "రద్దుచేయగలిగిన సిద్దీకరణ మద్దతీయబడదు" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "తెలియని రకము" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s దస్త్రమురకము" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s రకము" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "స్ట్రీమ్ యొక్క అనుకోని త్వరిత ముగింపు" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "నామములేని" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "డెస్కుటాప్ దస్త్రము Exec క్షేత్రమును తెలుపలేదు" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "అనువర్తనంకు కావలిసిన ‍టెర్మినల్‌ను కనుగొనలేక పోయింది" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "వినియోగదారి అనువర్తన ఆకృతీకరణ సంచయం %sను సృష్టించలేకపోయింది: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "వినియోగదారి MIME ఆకృతీకరణ సంచయం %sను సృష్టించలేకపోయింది: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "వినియోగదారి డెస్కుటాప్ దస్త్రమును సృష్టించలేకపోయింది %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s కొరకు మలిచిన నిర్వచనము" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "డ్రైవ్ బయటకుపంపుదానిని చేయలేదు" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "డ్రైవ్ బయటకుపంపు లేదా ఆపరేషన్‌తో_బయటకు_పంపు విలువను అభివృద్దిపరచలేక పోయింది" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "మాధ్యమం కొరకు ఎన్నికను డ్రైవ్ చేయలేదు" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "డ్రైవు ప్రారంభమును అభివృద్ది పరచలేకపోయింది" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ఆపుటను డ్రైవు అభివృద్ది పరచలేకపోయింది" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ఎన్కోడింగ్ యొక్క వర్షన్ %dను సంభాలించలేదు" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ఎన్కోడింగ్‌నందు టోకెన్సు (%d)యొక్క తప్పుగావున్న సంఖ్య" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon ఎన్కోడింగ్ యొక్క వర్షన్ %dను సంభాలించలేదు" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ఎన్కోడింగ్‌నందు టోకెన్సు (%d)యొక్క తప్పుగావున్న సంఖ్య" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon కొరకు GEmblem కావలసివుంది" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ఆపరేషన్ మద్దతీయబడలేదు" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "వినియోగదారికి దృగ్గోచరమగు మౌంట్ లేదు" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "డైరెక్టరీనందు నకలు తీయలేదు" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "డైరెక్టరీని డైరెక్టరీకి నకలు తీయలేము" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "లక్ష్యపు దస్త్రము వుంది" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "డైరెక్టరీని పునరావృతముగా నకలుతీయలేదు" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "చిహ్న పూరితజోడి సహకరించలెదు. " + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "దస్త్రమును తెరుచుటలో దోషము : %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "ప్రత్యేక దస్త్రమును నకలుతీయలేదు" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "చెల్లని సిమ్‌లింక్ విలువ యివ్వబడినది" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ట్రాష్ మద్దతీయలేదు" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "దస్త్రము నామములు '%c'ని కలిగిలేవు" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "వాల్యూమ్ మౌంట్‌ను చేయలేకపోయింది" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ఈ దస్త్రము సంబాలించుతున్నట్లు యెటువంటి అనువర్తనము నమోదుకాలేదు" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ఎన్యూమరేటర్ మూయబడినది" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "దస్త్ర యెన్యూమరేటర్ యిప్పటికే వొక ఆపరేషన్‌ను కలిగివుంది" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "దస్త్ర యెన్యూమరేటర్ యిప్పటికే మూయబడివుంది" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon ఎన్కోడింగ్ యొక్క వర్షన్ %dను సంభాలించలేదు" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon కొరకు తప్పుగావున్న ఇన్పుట్ డాటా" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "స్ట్రీమ్ క్వరీ సమాచారంను మద్దతీయుటలేదు (_i)" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "సీక్ స్ట్రీమ్‌పైన మద్దతీయుటలేదు" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "ట్రంకేట్ ఇన్‌పుట్ స్ట్రీమ్‌పైన అనుమతించబడుటలేదు" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "స్ట్రీమ్‌పైన ట్రంకేట్ మద్దతీయుటలేదు" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "తప్పుడు సంఖ్యా టోకెన్లు (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "క్లాస్ నామము %s కొరకు ఏ రకములేదు" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "రకము %s GIcon యింటర్‌ఫేస్‌ను తయారుచేయలేదు" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "రకము %s వర్గీకరించబడలేదు" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "తప్పుగావున్న వర్షన్ సంఖ్య: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "GIcon యింటర్ఫేస్ పైన రకము %s అనునది from_tokens()ను తయారుచేయలేదు" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ప్రతిమ ఎన్కోడింగును పంపిణిచేసిన వర్షన్ సంభాలించలేదు" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "ఇన్‌పుట్ స్ట్రీమ్ చదువుటను అభివృద్ది చేయుటలేదు" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "ఈ స్ట్రీమ్ యిప్పటికే వొక ఆపరేషన్‌ను కలిగివుంది" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "సాకెట్ చిరునామా కొరకు సరిపోవునంత జాగాలేదు" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "మద్దతీయని సాకెట్ చిరునామా" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "అప్రమేయ స్థానిక మానిటర్ రకమును కనుగొనలేక పోయింది" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "చెల్లని దస్త్రనామము %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "దస్త్రవ్యవస్థ సమాచారంను కనుగొనుటలో దోషము : %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "రూట్ డైరెక్టరీని పునఃనామకరణ చేయలేము" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "దస్త్రమును పునఃనామకరణ చేయుటలో దోషము: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "దస్త్రమును పునఃనామకరణ చేయలేము, దస్త్రనామము యిప్పటికే వుంది" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "చెల్లని దస్త్రనామము" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "దస్త్రమును తెరుచుటలో దోషము : %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "డెరెక్టరీని తెరువలేము" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "దస్త్రమును తొలగించుటలో దోషము: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "దస్త్రమును ట్రాష్ చేయుటలో దోషము : %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ట్రాష్ డెరెక్టరీ(dir)ను సృష్టించలేక పోయింది %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "ట్రాష్ కొరకు పైస్థాయి డైరెక్టరీని కనుగొనలేక పోయింది" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "ట్రాష్ డైరెక్టీని కనుగోనలేక పోయింది లేదా సృష్టించలేక పోయింది" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ట్రాషింగ్ సమాచారపు దస్త్రమును సృష్టించలేక పోయింది: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "దస్త్రమును ట్రాష్ చేయలేక పోయింది: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "డెరెక్టరీని సృష్టించుటలో దోషము: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr " '%s' చిహ్న పూరితజోడి చదువుటలో విఫలమయినావు : %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "చిహ్నరూప లింకును చేయుటలో దోషము: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "దస్త్రమును కదుపుటలో దోషము: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "డెరెక్టరీని డెరెక్టరీకి కదుపలేము" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "బ్యాకప్ దస్త్రము సృష్టీకరణ విఫలమైంది" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "టార్గెట్ దస్త్రమును తొలగించుటలో దోషము: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "మౌంట్స్‍ మధ్య కదలిక మద్దతీయబడదు" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "యాట్రిబ్యూట్ విలువ తప్పక NULL-కాకూడదు" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (స్ట్రింగ్ ఊహించినది)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "పొడిగించిన యాట్రిబ్యూట్ చెల్లని నామము" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "పొడిగించిన యాట్రిబ్యూట్ అమర్చుటలో దోషము '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "దస్త్రము '%s'ను ప్రారంభించుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (చెల్లని యెన్కోడింగ్)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "దస్త్రము వివరణిని ప్రతిపాదించుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (uint32 అనుకోబడినది)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (uint64 అనుకోబడినది)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (బైట్ స్ట్రింగ్ అనుకోబడినది)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "సిమ్‌లింకుల నందు అనుమతులను అమర్చలేదు" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "అనుమతులను అమర్చుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "యజమానిని అమర్చుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "సిమ్‌లింకు తప్పక NULL-కాకూడదు" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "సింమ్‌లింకు అమర్చుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "సింమ్‌లింకు అమర్చుటలో దోషము: దస్త్రము సిమ్‌లింకు కాదు" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "సవరణ లేదా యాక్సెస్ సమయం అమర్చుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux సందర్భం తప్పక NULL-కాకూడదు" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux సందర్భం అమర్చుటలో దోషము: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ఈ సిస్టమ్‌పైన చేతనపరచ బడిలేదు" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "యాట్రిబ్యూట్ %sను అమర్చుట మద్దతీయుటలేదు" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "దస్త్రము నుండి చదువుటలో దోషము: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "దస్త్రముకు చూడుటలో దోషము: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "దస్త్రము మూయుటలో దోషము: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "అప్రమేయ స్థానిక దస్త్రపు మానిటర్ రకమును కనుగొనలేక పోయింది" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "దస్త్రముకు వ్రాయుటలో దోషము: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "పాత బ్యాకప్ లింకును తొలగించుటలో దోషము: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "బ్యాకప్ నకలును సృష్టించుటలో దోషము: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "తాత్కాలిక దస్త్రమును పునఃనామకరణ చేయుటలో దోషము: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "దస్త్రమును ట్రంకేట్‌ చేయుటలో దోషము: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "దస్త్రము '%s'ను తెరువుటలో దోషము: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "లక్ష్యపు దస్త్రము వొక డైరెక్టరీ" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "లక్ష్యపు దస్త్రము వొక సాదారణ దస్త్రముకాదు" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "ఆ దస్త్రము బహిర్గతముగా మార్చబడినది" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "పాత దస్త్రమును తొలగించుటలో దోషము: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "చెల్లని GSeekType పంపిణీచేయబడింది" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "చెల్లని యెదురుచూపు అభ్యర్ధన" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStreamను కుదించ లేము" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "మెమోరీ అవుట్‌పుట్ స్ట్రీమ్ పునఃపరిమాణము చేయలేము" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "మెమోరీ అవుట్‌పుట్ స్ట్రీమ్‌ను పునఃపరిమాణము చేయుటలో విఫలమైంది" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "మౌంట్ అన్‌మౌంట్‌ను అభివృద్దిచేయుట లేదు" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "మౌంట్ నిష్క్రమణను అభివృద్ది చేయుటలేదు" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "అన్‌మౌంట్ లేదా ఆపరేషన్_తో_అన్‌మౌంట్‌ను మౌంటు అభివృద్ది పరచలేదు" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "మౌంట్ బయటకుపంపు లేదా ఆపరేషన్‌తో_బయటకు_పంపును అభివృద్దిపరచుటలేదు" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "మౌంట్ రీమౌంట్‌ను అభివృద్ది చేయుటలేదు" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "సారము రకం ఊహింపును మౌంట్ అభివృద్దిచేయుటలేదు" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ఏకకాల సారము రకం ఊహింపును మౌంట్ అభివృద్ది చేయుటలేదు" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "హోస్టునామము '%s' కలిగివుంది '[' but not ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "అవుట్‌పుట్ స్ట్రీమ్ వ్రాయుటను అభివృద్దిచేయుటలేదు" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "మూల స్ట్రీమ్ యిప్పటికే మూయబడివుంది" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' పరిష్కరించుటలో దోషము: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "వ్యతిరేక-పరిష్కారములో దోషము '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' కొరకు ఏ సేవ రికార్డైలేదు" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "తాత్కాలికంగా '%s' పరిష్కరించలేదు" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "%s పరిష్కరించుటలో దోషము" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "చెల్లని సాకెట్, సిద్దపరచలేదు" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "చెల్లని సాకెట్, దీని కారణంగా సద్దీకరణ విఫలమైంది: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "సాకెట్ యిప్పటికే మూయబడింది" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd నుండి GSocket సృష్టిస్తోంది: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "సాకెట్‌ను సృష్టించలేక పోయింది: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "తెలియని ప్రోటోకాల్ తెలుపబడింది" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "స్థానిక చిరునామాను పొందలేక పోయింది: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "దూరస్థ చిరునామాను పొందలేక పోయింది: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "%s వినలేక పోయింది" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "చిరునామాకు బందనం అగుటలో దోషము: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "అనుసంధానమును ఆమోదించుటలో దోషము: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "అనుసంధానమగుటలో దోషము:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "అనుసంధానము పురోగతిలోవుంది" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "%sకు అనుసంధానమగుటలో దోషము" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "వాయిదావున్న దోషమును పొందలేక పోయింది: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "డాటా స్వీకరించుటలో దోషము: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "డాటా పంపుటలో దోషము: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "సాకà±†à°Ÿà± మూయుటలో దోషము: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "సాకెట్ పరిస్థితి కోరకు వేచివుంది: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "సందేశమును పంపుటలో దోషము: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "విండోస్ నందు GSocketControlMessage మద్దతీయదు" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "సందేశమును స్వీకరించుటలో దోషము: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "అనుసంధానమునందు తెలియని దోషము" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "లిజనర్ యిప్పటికే మూసివేయబడింది" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "జతచేసిన సాకెట్ మూయబడింది" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ఎన్కోడింగుయొక్క వర్షన్ %dను సంభాలించలేదు" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 నింయంత్రణ సందేశము అనుకొంది, %d పొందింది" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "ఊహించని యాన్సిల్లరి డాటా రకము" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ఒక fd ఊహించినది, అయితే %d పొందింది\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "చెల్లని fd స్వీకరించినది" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "యునిక్స్‍‌నుండి చదువుటలో దోషము: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "యునిక్స్‍‌ను మూయుటలో దోషము: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "దస్త్రవ్యవస్థ రూట్" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "యునిక్స్‍‌కు వ్రాయుటలో దోషము: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ఆబ్‌స్ట్రాక్టు యునిక్సు డొమైన్ సాకెట్ చిరునామా ఈ సిస్టమ్ నందు మద్దతీయబడదు" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "వాల్యూమ్ నిష్క్రమణిని అభివృద్ది చేయలేదు" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "బయటకుపంపు లేదా ఆపరేషన్_తో_బయటకుపంపు అనుదానిని వాల్యూమ్ అభివృద్ది పరచుటలేదు" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "అనువర్తనమును కనుగొన లేదు" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "అనువర్తనంను ఆరంభించుటలో దోషము: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URIలు మద్దతీయుటలేదు" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 నందు సహసంభంద మార్పులు మద్దతీయుటలేదు" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 నందు సహసంభంద సృష్టీకరణ మద్దతీయుటలేదు" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "మెమోరీ అయిపోయింది" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "అంతర్గత దోషము" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "నిస్సారమైన ఆతిథ్య నామము" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "పరివర్తన ఎగుబడి వరుస నిస్సారము " + +#~ msgid "Reached maximum data array limit" +#~ msgstr "గరిష్ఠ డాటా యెరే పరిమితిని చేరినది" + +#~ msgid "do not hide entries" +#~ msgstr "ప్రవేశాలను మరుగుపరచవద్దు" + +#~ msgid "use a long listing format" +#~ msgstr "పొడవైన జాబితాకరణ రూపాన్ని ఉపయోగించుము" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" diff --git a/po/th.gmo b/po/th.gmo new file mode 100644 index 0000000000000000000000000000000000000000..0b174bd9947f1889f9e344a558e5ee2819f336fe GIT binary patch literal 67609 zcmeIbd3+sLefK{mlqD@o2oTDa$>P`s%h+)??Cg#cOg1NWNFWZ*wR9!lSke{Jm6t%k z3*f{_$`Xf=1&B-`3rz_mCK41%DN8BPvV}sSpqA37PbuW){H+N;@1B(;&j1em8=P!J9$#_ZQ$I@F!pwcqE;x{)M3W zyABk8V_*t?1eAP#2a2y*TyUDa0Gtn=3&L_T0>VOaJBTWiPX_!x$Zzt57df8`!IbMu z!Lz^-@ZI2EQ2efjN$GV1xD>n*TmXI!q)PIuaD5b=KZom;pvo(t`ri$fz>k6Ff-gWw z>7@sh-fjn%fL{dF{}Um8Cb$Arf4jiT!OsSKA!A4iS-5^O z%2fT?pzM4aD0)|e>i>1&{+*!sdkB0c_$VkkKLS(m5R@jrJ{A-or-$pyK((ua@|(AT zm@4@gsD6J4z5twclD9t+#MH@4LGjTGs{M9Q_5T=DKYs?w?%x10ZF1Pj=mIh7HrHPP)&5^W(R&8Uc?x&}D7nuD z#disO8h8^Zz1#(=-WNc{=eGh%Ny;~KK$V{l9tjSE&j8;JJ{No+D0w~!im(3wm4A*t z)A9U(HBkJ$3p@h+9C#%7J@Dz^??CDM>1Vk-$AT(f3d%n(09C&PJ_p4W_j@FF>3cSK6nF_J{~G~c0KNqzl#>TQ>EV0eYVfJclH_GzH>mvdCmkjvAg+-da-Q4wOz=3a*Mg$^W>Ecp68uB(+o1ISOHlSZ5+M%* zj|Yzd&jBUJdQfs+4_*X53O)!PyCO-h)io&oR=(VEJvf`|t)Tq&{h;*lJ@7@~Q_lDN zdkU!QL6DT3+z!g#p9dw^KY%X=pGM~?xD*uKHK6pf9h83F13nA<6e#|`3CbUS1d9Jd zE_A&e1EyRr2X(&}6rDGKlK(DH`uQLzJ^wW*yZsoHA03A9>hEk2RVQU|3HT>q7x=$G z+2L6iyB=N!657etU<%#^&H+CTs{Ri^>HqMRPWLoW@?QLw}WSZ9|aeH{{>@CjTm02hKMg5tjyTnyd{N`IdRQ}91Q$^V>J_`L80@Nllr1jW~C@R{IiL0l?% zD=52v2Na*b1_{yR*vq~D3Mjk15mf)51fK%_99#tc4tzSe=n9wrY%t||9jJbGfTI6S z@TuTlQ2FK4;ECWrfwKE^Ug_m$gQ|ZusP@-^^24`-(&q!=`fowi`w=L*Pkfcz;n|@4 z<)z>e;HyE&wGouP$3W@luR+=EUqI1)@|9ly#o)8JUIvPXs62QcD0{pKRK15l+50D;+W!s|y(6!3JuL^N&tC9(U=2JTd@HDWe+f#CAA+*q ztXI2ybHV3xeIY3Sz6N|6_;yf!u?Kt(_zmzh@TZ{syKAlM;gz8H+77+|+zqP!he7f4 z1yKEd3zR;84ju_U`)cR=q=1(P+zh@jAwI#A!0~YXQ*b`lPc8ZVrQqgSN%AW249dT@ z&i(!HZpY^ZJSO0a11=7@6qKHpfs%J^z$*9^uHOKD2E3#vN&XEyqU`+~(n}0-y$rHoslk{iHV zKunYT3j7tg=5t)VX<~Us63O))R!NteGpMcWm zecN4c&)nhtT@Q+{e*;BtGfI94JmgK}2;_MLJcsLNqogkIN)Q)HZUC3QFFmy~X>z78D=f11|%Qf2*(St_Q`}S3#AZ{5IqU zZw6KVV^Dr}$=iLu;4`53nSBduBJc(f6(vvD?euQ~Mdy3qE5H+Pb-UdJQj{F_4wv)& zp!j{i$1~&!5GZ@W)>Miubu+J`Ae= zBi^4Rgj8}TD19A{kZRWt!fNtYp!~P*UTg;b2Y5BO{XVzX_d#7RyWjKLAA?tM{U~@o zxcCD;PP_rUi0gYm-TxJM6uA0NTyGn}C0u_Fd>Qz-2RyHx5B73B4sHaG{8PXG4sa3I z-vd{HhkelPUj}itv`l>@K&yue#H6x3W)0@FMGuO?EBzquFoI$>$|~j zuAemFa`uCmCixn;3*7Qi$H#xn^XOZ^Z&QB6pLzK&z@=Qj{^LH+|0uYM>tBGc0?+$| z>thet#r5JpCl`Vxunc|>+yFl7lOE^Wz;|%{74U3u{a?7fJ^;#oPyUqW$1A|Qxc)m3 z6(qI4bbHVHwEN>IC_DTdd^x!NGj6vpfwyq|?9ckRb3eF{>qo%~_=L}Sy&>>hTu*>s z0&n>%e0~;ue;zr&bH3o~tl=-Z-98A)j^77&fNN;99-IVE16TZw+hZrVlk4At$_H=$ zTfhHn5Z6vl{<8bWBzQ5`TfgG=`Z6dx&;F|KbKMEPn(JSH^4Ckh=KS0VF6a82;ECW1 zzwXzo!NpwP5w8CRJfG`lKI-kS26cTOxB&bmcnNsyH(W0pK}?-Yf^P)h^>;4s(cg6b z?gWpe{Ab`5;ImNPMc^Q~0{l4m3h;@4?{tP67 z!u2P?Bf;N*=Yr4s2On?Nf!A>TY49%aCExXY@kLN}ebx7z?@xoT=X%AY=g+?arRSIZ zqub@3p!iAuiN3(A!H2=4zVCkc4R96LC;YR^e?8dE^{gLw+?Bymu73lb1it29++O#B zFXcM8tc_J|Dabyo~GXf9!ebyWl6ezWOKL?x_FG8kXxTLCN!^pZa>BA5UxACj7yR7w?Zx1$xZVWzfL{&QC;z+i{dVvy${z*guSfjC z^>r0^F4w!k%fWAhF9R3}0XKse{>t|OKMP9k-}_Iu z+m)c~@ol2V zdS3dtrpq(Aub;W#so>MWZ-Dc`E#O-4g&g{kp7gVm z>)S$EC7{ZWcWX|4HT(NUu0PJ%hdA!!dXrL@lvjj0j~!2b0YW^KTU9*o=p&oF$7x7#^L5jIB+#mSqf zcQzM_{}Ik#6WaYd*DJ#Lq2O+=Kf!TaD0?U8`ZvwVdkn>M*=;sFx$z_y3p7TNQTJVoR{X7f& zS8!ptUJ5SZ80Gjn<&zxCIWL3n;&=r|!u5+eNagm^&-sxYJGpv3_-qdS91YI%(_|Cp zhj9J|jz!`AF7R)|{kMawxV|dfJ2{|kk8-?UC;ZeXKZoO~;r<&bJB8zHu7^UI>aFBB zo#Q__G(Plk{2qsXp2=|%%!dz`1^&!SRYv#|rp!BF7WL#ap@eB90q4wsX9a^5=1UEZi3y8qS}{ z{dF9F&Gqb1_J>@r3g`EOhjBcPV?p`U-|coxT}IgaM|4u^gg zaGcC>N2vD(@OrM#<9H&+64kHgMk0@jo1|<$6B2nqxEPzXA2LoAaYMvY)qd@?YWNE#NKOI{`c&d=5Addng4#|_iS8?yd;PW{a zbAAy=_Vey=vYxWP)dfPUALviwc|)KXZFaPv@((oR%>Y~^)9>DmxfE-weoP< zTkY?!ZlZVY%{g^W8t*JkE46f>w8h%3EB93f)6!sC?k^9N2W#nIX`no1%C+_7obCwS zykySO)Yv+J^!uwLY1=zXAlp4BP3E3)X<8jl z=bmxpi@UDssq|H9Bk92CNG)Ag4mzd3bz9PT$-Hz^rMA90T1%@#Bsp(BQ@D69UZJ}PJ5~YC9E(~?cPwvls!Ge z<&lxH8+K%LXs9||qtEIfA|u|&mXTU{AUUh2hr-Z?;%@1wCpl}NI*J*qz3D)CpgO!I z9WK9Sv@%T9S~VRSu69G(RJUokQY%Yc{iWeP{H3-YFDPv+Rr*Wo`q8X&k&X>R{JJmtAl{a(1bE!|0HOM;d$Wg>8giRvMgBOS`K>Thbn6?ygAz z)s09OFN<~B-x(PyBU!)olC_Y8<#coeY8S4!a5>!!_E!2vhh1*Mt%p0aN0xB3Xi_R@ zaC$9!$|DcB6d-~Q^s%r`I!NGF>S{1JCuMC#g;%9hfU}y@B zYSp!6%;1{rtqk_01v;`2fB) zFrB*Po)uH3elAWi_1de~lL1>&AHY#^4{GgDN&$JDAT%yGidr_7`?oZBWvpOHNx6Q$ zIh$S9C5!r+!&M@s&Y8Q*{T{KE!AcFEtz6q85Jf~WhU%~Yu}0!tM<97Lk{KAN$|EEn zMPpWZs5DIG?Wv9`A9yrcuqv^+ABv>cstnf3$|7y6iTF@?c%U*OHyKej8`&~|i*B%J z5vAJj=pZ?!oSt`~rLGl&L!-4-HGFv>S>}$NGO`U+2B|b6pD(F*37roBsu@N=%gnt5 z$zY#SH`#dgxm}A++Eaa2$mZ%Pv z({(sg_xj|VVoJuY8g*>Q=-rYo-(2n{l*|1+$vM^TQJYj@C9F9*Sl-OIf~R2PQm-ay z%9f1JrGAF>N}pJXlQv8rheBnAr6{yeWP#SP2e_~F$U(cS1I7gr5GDY!Ft-UfbAl<6 zY2;^$jj~~0B22GIS2nAvmHHM;rKyx@v!Ij~X4R~7%W9phag8Q;ZW38qxty$lGh%R? zlre+u$ik-ea@|bjMP2RNP?|+%(;@tzR_X6|7P>r^HW9ayt-l15nMmT18BYhH<}=xJ zceC_RHdnC8biHU<3ZVz-?bO*LFF8G@8>YTmB^aNmCu3o5c|qTT^i)lFPoI~!5WD4p zAyNdyN@0K{LD!&dR?B!J z|CrI+wkMbhb?d1l%Z+`=Dv{1PZs{B{b(tiMEp1sxd4*x1G+bWd88tobHKWzq()74~ z{pr)6(ol6|X|mjD{9ly&14lN|$Og5Ltv3u-Hx0rvNsC!6)}uTuE0zxrb6x80E;IWl zdtlcvf>=`Z+v}JvhS4Z29||``NH>+^TNL|3ro|1dkc!2j}Oq-MHPeo;D+Mu>c$poVwlo&KAr9J05FQ5-zreaa%U9J!l6Y48*&vYZSEC{ zHPaJoRa*e&s@Bk*vE0~Ayr=m>gX!z;HJF*1bGc%Q=qc4o1t#(v158;;eMMgyX4=?F zd9j=|S{nSJLF;u@n)nQ4nPFl6W-*ARO#V7fLpiH;mhdH(qD_QHs{O{W=PHXaW@3fH zI(qWPa#!05(1>7> z)@>|mEaqc=^QHr(nx~qUEepJPbw%z#<=VDgH8sdWez-i;&pwb%BWsx4Ch0k2{iDT} zY%Hk<=I0HH(3VrUlZU%j7AiEm$aQeGY^lJOn+0Z>Y}dDTbWlM%cOI)(Y)Fxmkxg+* zaWg^F`LMCz%lS}Aoh&j>9?Z_UBeaq$~j~FG~FJmu%45An$n{}?Z_dOP0a8E zvRk&p*T7AgMTs`w>MLob)yQ}2nr+CfFZUCVzJM$ZG?NXc?@G|Qfv)R6AL1Bos zp^<`>)$`oIiSlvGJnSm;7FF1*m~E%=fl}B~b9E1J-L9(5ETd`60Kt_pYme?ut)+Qv zZq$0R(0MdMcY~O&^jG7 zGhs9H$bmAAduSiKy1LiS*BCJ>*Ro;m+y0?n*7({!%bm`*{Udq2uD5@5WPLlL&DBS? z40cbwwzY4lt{i8nhvh}VWmH_w*B>&gp?28Kg-M8A4a~obCT@djcL&9G&#~KKCLi~^!oF3#okxmQwGo?~x5^&bEMv2XG37!ZQtCIpw9&~U zke=$Mk>q8h%lz@l%h>TVTU%OWvEds|bFQ3Yi(74<&ADn$vVw<*iaN6Qz-WK1qGy0C zM_)5)+mZ-jenmBTmz&!*DYYk6Q9~QF<+;>pvq@XO=5A4~ZcVQH!-H(PmNj9u5LpqP zc%HY4Ip}JhTE+(hbn2^SZN8r3JN@hi*dzkxO#xk|GOs3O#5OUr+Y``quFGyuG~(vQ zytcJbhDOJ17o>f~Q8rQ+A3w#4C!NruVv|wwwPUo8%O_)MZifz(6(jR4=F!qkyswCD zS)f@^reoi`RJA&*tPh?R>uo6W^tZ8Ab=@^=PR=)5#AgX?F=fPUo0w6)siD>#%+v5l z_K36EMGtMO3}5umM@38w^G6rGKHKWy@n6kX){&~kTYDaZ$#E=}YQFcn(H;Y8uBtV2 zL0Ng-^5DkGaCK0DQeVR#P=tpXeLTk*jPh+_x+3q2vp{QkK8m&68pAnk!pBDgVuS^g z#sOxt<)pbqC3}0ox9_7OEi#&`%a)cw5Zdi;S3c$|iQ;!s!lN>ZKGhyPViisWQx3Kzsl5 zec#gd%v%r}9gGh(Je$c2>TMH;5u0n}M#-tw*T}TJulrc7VB!|F87z4QkpDs49fBVF|lKu*e@QQ^^ z<>La3+vcD=cwi}onF^Kj_gBQi&~Rm=tx@}VN}$BDPFk|(XfAWxmb@~tvBEP{_U@{~ z-halL=}p@2=II8?mQ)ym?ubj~@;OaS`s@`EF=-x1>Qzk^fKs7toCI|##oF?~C&N}L zl-R=uQ-KdY*^4gCb<_Br3iV*3D)12QZtT0D)*lk!QUbkitOa&fkf zsGp}7%Iz@|&v|*Vg6Yr2zJLpPM2Wk8W^F5+WaY9;mouRAxR7mLV%qoghzkX)X3vaG zr)Z;u-tE~@7(}MnFxI|!)ru=1&MP0b^AkM59z`|Cv(l<6pzvD-mp`z|AIXO&a_}b; zd7Wfs07Gs*zWD2%w~-g+9Yya z83SsrqAbiKM|%}PBZ-#WzLITfv89^D23TLWVfVWEU9zk~m=G|*W^~Y_N>9GwO*^e= z>XoY+fuB`jr#$yMc5F4;#92bJYJGK+-c(GrT^636jCg5%iNF5`GY#YKs_N)4=`*-s zi~FXUxatc%r>J&#%UV61N>+J|_G{`;p#|;YW2#2UR_6~ySQIgcjU>e)QOhUDjklzv zhRnU11v{P{2DZ$p!dyDN!hVwaN+IFQ&$hQjHETdt)@o7>^!%kl1{*aKE2T0U;5mzT zMHTk6{W(VP!ML;TSx7m-M<1IibT3HfuGRx{wbMOyG_Ode_(nlGXH6mVc4#U}wr7#f z)sX000_Ko)&(7(HzOx}btEV@jEU>8StB%5eg<*x*qc&So z6dtV+_ULq^TQAF5TNRiJw1U;P0Nwke9+Iaz%~qdTa7Mlxn9y56{>Ei4TJ{=oWw5({ z)Lv$pa|{NB>QJe+KA!_Ys*!J1NLFV%k|;^9#rh~Qq-_w1>bqL_JEhZ-7#m1=DH+fdJ5BW0pkV*e_2 zGsk5!zQW=kZ`VvP$$M|n#yqW4b;S%z8k{yVZHxacjdXETy+znh5(qCx+r%M%MYpLz zm5nrB&+uP-e1u4mGm`_;GD7#G z&8al^J?&OBHkB&1p-K-#Z125LC7a9AlfAaqD0Oy!zP+TRyKx(?$gQm>m<2F><25Qx z#v~*)?A;dMv817%hDif;Qu~{S^;HQ?(y(52i8S)pAF`@U>uOadWtIm0JwRTGjtzom z+lWHish<`}vwE7RCuO!zf#s`&_b>w*6VNUjeteb%L7UEjdAey>#aw2uL?o}U#gq0G zENJSUsK!Oq2%f}qAzMb#fV~}4Ys*a{txQW=jrEsHg9}7|3e|i2t4tbwX+G69S?$a5 z6j?}-5M;yy3VW41KC{D8T7U#)amAEc16l4g zQYy~~?ak?IqLYXS398$+HT!u_KszQS2Kt_)yTp4Z_T*b8@yP`nJ8Syqr)w_Y80ENZ zUhGJ3`07(RcyT$&SAstHqU<%BUyEt3%a;}?G=C7JSJCYqd)#MJ66GLU`%W4qjj!g` zHnGWJujZCVXfZrII;5qE?`Ttyy-%S0?Bh@I{j~b~df|W(q;-XU+axpp^Ut23j_?r3 zpKtd199SN8c2m}uHt_OtTL_dP-Ap(sx_?tP<_fAC>Nn& ze>~a8128R=+DfWN=j$1^s-u>lTeKui+Z$xIJ{@8zn*?`IdR$l06gz$Gbxa{jyjRSJ z42HvfdsMDbko{Gr4o$VH-8Et^B;XMesb9`J?;*8>C6DN&KVnWo2G z{@ykZjW$-0pnnS^LYbH2dl)9dr)1d1DL4f~j(?`lKY<<3%C_hFDQ z-iKi=Vb0B`XIY@2Qdag!PTxZ|8_hI7nLAM0Tp1W0NO`^-1?EMu@ZMqbmXua@Sy;u9 zj+f>K8VCQDW4MH2D(O#mi`HPY&Nx}LaQ?!Dq&N+lzCD-=pvMm=T1<>+D_-}L(R?xB zDxyRmo?(JY7uo($)IWE9vh6#N`Nn>{VM~hqs{T1=EDxKdE=$O0S>mLU9wzh+^2SSH zmm|)e_I3Z%eN|Z5u7XecM$$FOM)pTgQM*yS^KE6Dmcx46W|qg27>6N9t?aaNxT^U_*NUF5SNNwldCQVL?DY5ri%wXu=+H~c`s8ufg(H2H zp02Y;`$oD}^ECd@l^3t>TBZa-sCJ!09$Atezi`pQu7!)cjz1|~v}nl*r*thmVc|k5 zc3n!YP)OI+JHBh-De1zOE;;eU7cV@SdKd7ymaf$#i4pex^g_w%_2r?VO0BdZJ-@_z zHiIlX2Dg+3Nl2&SnL}qXevfWmz!UAtg28g_bO;Rgjq)mZ*J|E%Qu9(pHA|JQ{zVH1 z&+MyK`6!P++oyZEG`B2pIXzaAnT5s1W zc|Ea9*6Ui%q(zJACFv>aDz!sb_Va<@{;qQw=h-b89J0%i(-!fx#7<9Jxb#rIAz*U+ zy_4e~m>mDmQ9oFSdi7g3ph9-8XfjDbodi=J@ z@x8hg>cH-;lj9$jBog&~Cge_=z8F1Nxgnh#htx+V$9LvkNF&~gzo_XQ1%fE(BgQ+@ zxJEcZxJNRU;0h_}>*2|Xt=6^IyeW1$6N%ag!t=C9*4NJeS4+{+E>l!vCMIrhySdVB zlM_45LGR4`3*QZx zPH;SsOpd>Ma{LY}#lz9io?Keh*qhGv20_U*P-#Jd$oe6R0n|vaVH>(4e(2$$jA@v> zBi~xL2*wN()@)lAKyKCdIji)8un*GCexXf(-%#L^S*UP2P27jEGxkirkVyT}hB>`kme(c$Eb#zdsTiHR+8{6b}HNz&15)G`qy-Fq|V zLHk*`_}Nv+vy4u3vd3)SsF1KJRp?LNoyq3*ge7!=1MnB^6E8P~)Y3w~NJq66N!^;D zkT;q~e0ZN-SVv(P&DoQkd`yEkQ>;WaPanV6#$RkkMBYSC_3Dv+!&sX61%knD!*KSH z*%Q5@(d&zbfSfy?D<6lpK$htd*Q^@S82X1a{oxFhbB>#FZc*31&NMqa@D%G*v&q`B#Jk3C2p|O-`&c? zZ~QLHhh(@N<`Os9PG9aRGJk`;4kmjRV~v4)Ah|8LZ_p>=ps<_dT2dS8y|ayOn{?IL zj1Pnm_53I8Lwn4k3uD5F1_R4^mKS7z+v^`;vE-=#PMeN)IY9k|ufwrKPJU^TSPNVz z&2`oS;|q>SbR)2bJSXO=^4Yi`pc}N~NrV$}0)I(D)EPHDavlc-3Vnp;7B%-BQPX20 zzPDNIo_DF!gW6ko@*goM!8l}}U(!w(LNINXklMUBQ5hiGlg zNN^Iz^CA@*610rCbO2LSBWNK-SW?n?3ay}IxekLhQ?|d{aZ6*DsE= zAJWNO$W=$rE+GMj_n6|42qn^CCeF0`kZ(Ct5XI-b2iAPJx64iRd$X zaMjQey-iSYKRUA(sIynK!IFIt-mzbDaQ3!4!!7U~zIVax-EPMmm zxw7aMt6;FbscjLOxq`N?r-)Pqa~`dv4jUoH zx3y*k&w?Blkb+$u;cI=e9JLpg6LUdg6Iv+B9U}TDOfn0jC-#Bp6$LPTgIj_ojyGc# z1l(oECx!+AqJf1{v=e(Si?Ps=HfbcWu|Y3*5|{TF zyI7tRuT0@XslE};Gy|uk3z8lEFsqIlEX?W);`^tGqjPp-#yOYo;D%YeA7E{`3?8ky zotyOX*s|hF**r&M;^H_{e<{}7WN_`(f(!XG18Nfmz7`qF9+sNXab;o&o4Wf`>k%VG zi!m$bgx?q?<`UY}#{qEE&=wO?Df4b|gSB9VsIFU^=3$g)CihxA2=-`*A7kdmp~=3c zk6v6(`f}^g7CwBh3JUzPBjCP5v``IFT*7or0@O!Z7=siJ4Tb2f$V1IBtFXsDAynUV zS6)}*qHxHg0cg+(o%5FfQ6%6}2(nvYlY11DQFq+epn}e7z6c55YN1JHpBWqDzizN9112RJb%Vq$;l zoP%bU7|aJLhSNNaXujan82pVi($@0klSK!ip;o+n3rtu?5z?OI+tW~5+p8pB=WVPI zJbhwr&3fIH7A)!zH@&EF2&2qo$l_5(k=nFQVxYviw4pOy(y})-)cSA(#ha zX!1=L_Mk|muD(p!BGDoEv42sX)-`i`*0~^*gFoBQBtH%bW&fFJ9I4w%Vg8FlY|Z^k zA_vAYz34Wjwl0u57+ZQA;`|mk`Ys%B}rm zSDb9(-?nd&m#+NRwJ@5S<|4P(u_ipf6@p_$Uo<53z4>yiB@*5*xz{U==DGNca~ z6pO(%CWBC#a6%t zmzr_6GPZPLKFLxUc96<71RU=ZmFe@6!2E5KZ6?B;9^NN@K^7yA(k49m*4 zcoZkltIG=GV>I2S%bBQh=6%dq z*Ro?aUbpvrn?D_xK63RQ6rwX{62^SIyw!}w2#RWOy+A$W>KqzzJ07ZJYo>(Iwk-#_3loK6%EjLaIiIN1W#Aceff%8m1DCAs zZz6dhk`-$4Jy#U9JI%fu$v)y3zWRSgOTap^rhJkehQQfKy0|xaoWJB+7J@w8apAax z4Qzp*D^cv<_%C_YyKi+Caafv>>mBjzaPA7T2(3i%`ZletSTXrzjd0--aVOlbhIH?%-Z>0$HWfb3(dNnN#5gY zwD?krBK`exEhlH+veEEQA!ZaTSP1jr13QZxnycc8cpMp#6OW4rXRdaiw(gco1drQO z-(k+kj5|>fd4?sD@jf<)xFoCkbA4ip3jBKTTQCx66X9iU81R7Xyd0Y8UICo=6q3xT zan#by^q8EnViel^l3*|c=7xna-=BFbxya2E2c~=!$tE$L`%F`+k5RB?Fim*vBD*x1 zs7W>46YCZiuHip~%p@k1pdpxz$(+k$(H}aSu*kr5>cVBlhM9g>Ha@|HdpM#OcG=9V z@+^`sLm2Gx7rhY0a9p=8uoRR=&01vyM#w$EJ;QRFPbBo^{|H5dq>M4sE4G5}JubZl zQ&$t|0=~TKM%@)&?uJPpA>mN=&TfVOp<<(R2ZBY{@pFcCPI#<0#=l*W2?IZQP0zwG z%CJYNKLE(O*Bj=o8YL|`;s0<@-DY+1X@_*JsY8^1-~BbVIMhcN=bgC%ToSceY6?tm zHLIdy%CQ(U_6B>Z0=97%sQVC*fB%(HBk3SH&BGdTpKS~OOQw?pV9?@5<+M6bR+ZZp z3ApUM_0{}Z7B%B6n{)RyI`q6j@RIr=g`#dWvbZTR!;Zr~^|RY1>@@TM<1g+EeMXVC zWDBo@byogNi0?Pg_z$W;IsD=(W7*T)d*rG6R*1JEwc=Fn+>M)v7IuU(h6u0NWZA_7 zOdShT!3$gsPI37X5M$(7|e&!4xD#r z9sf1bLE(*W!qUH8>O{N98?iE$WhTB+0P_++d>cXb3b!&-d<&6=LMMp4DDhw{w5HP}+UG_$v> zkd<3%lfblwmL8^{iNb&J>Xf=#GD9p9tVp`sMt8!W6op?BwM|Nk$_Z)7rpAhR5*vQ( z84gmkrI5KPC9Qofn*zrb*hEW3v~FDZ|6=nEXy!pH)WK93n-l)}!kQ@_uYMPY80@O8 zjHEC!bf(Tqlypy>IKW%Bl>U8Tc@M_tA|w$T_h1%Yn0{q0YQqS9whk4O4u;3fyo9T# z4y-Lf2$=5hB|7Fm*&qiwmy@|)y+(3Br2^zo94DqYrIslrET@hXh}OCr#E$XM*iZI_ zpZdzE!he0Uc`D&ae7T_!kvQd&4Q+jOM6~!;Y1j9Y;XwLjs!mlz@y6`Yk|KB5%HRgR zxT8+Bkp0sT{uA*#Go;;A|2fXc#TB*3q~GLU$z@iccbtbF-QSQDHPgsGTA{9eJsu+( z0#v|LP=#KdFy0WgDd`k4HJu?9GSdbRhD4{@mXqKHw`!~RLKx(u6y3znKUf}9hD3`b zk*y{ZO6~Mn%+#F7M-f{332!_?3o10u*81`l-yflxUR9lXw-9aH0feGnT0Q{2+rn*+ zt31reQIXFC(XD%aUIHIxD>)ZR`yhLvYNSF+*qqmqIaFZ;{2!08?XY<{WggRGYq2|F4LT zeV-?tpgu_$q>X81st#Tl{Ti|pMmG8!6F7HSQU-?dk5=Pdcsi>*EasEKx(I;3W{S88 z9P=0Nq%kfV1De>OS9*dR75I{nLR?sBM~~JB;t7dpz%%z`Ibo~C?ZbALY`t$kYwkD> z?bBd3TT|GV?o6?rd>?Cuj|_IuP1wH9^Twpsp!ty3p=rHzn&V;+QYYhDTP{O)j3`(b zD=^zYt7sd3eMpQ=Ns&lEy4anz7_YKWw$v29Unn0XL=-Q`Ocip_?e!c>P`s^SdocFj z=tY5b#H`!xGXY>U+f7mm#h<71-a}NE*hVh}QWA4JY>%~w&lW+Eg;~sa`FrJsG%U|G z*AAfwapDCTvgV4NnM5g1W8AFFvk-;9T%wGq(>j}SW2%NL41SCpbzA$^6VgPb(Ix(* z>1MFl^tdA0NhgJw(M&z9VTg-5X!I*fBtC(<$8?6~Pz}L>XA(vfw^<;;3vR_wL`{CVs}T!XI`;v&!os1@LD=|+ z-E<81eRh)zmu;x*Fx|l%9Auw542q1Ph5Y|m$$X-%fm&3EmI{$W-o!oYLd91f`?OA@Z_lhV^9=2&*a?oJ*+f?y z*5{Ke>YP#qgdIFTVp)K5cQ)FQAh^We#;KIKW~ zNJ!)Fjd`JyBGi!j5aER8`Zhb{Yn64Pr6eGVsZ)dXG4-|$@jl~*>Ey(YHi=>iG_%0B z4BGrH(>`vHB}klg!X{>8RM5O6z}QqJA7LnxORF(l`i(0LbPsj&w;%~_j2$olHs^aU zso-NUhV|WuU?|;^m(t7aN&HvN&7b14fyT$3xWm`XxO#JGpvQP3pUD5&b6S``(S2QX zq71lzHM|gAF^ix%V-5tdGM8>3nneeV^p_9t-!})?j_3bHcODS;znAdsdsFI5%rox5 zCv5xZgLGr&_Kos)<~z*)Fdm*kQ=A4e&3=Qv`DM1c!xV|C&>VVo?<)*euIxM(o5nZs z?(W5G1PXhMAfg}vw#BKTCf7!#lvllu9HP2u2hZ zLO5^&^_X0u!=Vz|^5PJTQvp)ibcDgeia|G=T$A>S&Z~2#_z#=xtdO}x^9VFXLO^ng zitipl)T0XRFn!!*YNGb;@I|p|!W7rPAC@{Xi&O6JT2ScL@`!KJQufa;3*EaXDNdT# zez61m4`p)ckE78izT?Jh?871uog+Y|q&huYFM-b8MiZv-4*!lZi8n>&GD6}5Ytb17 zV#<%&!rCVrYo;PbtTSa@`UEhuNs(#a%$z>O7S<7YPyG$f!DT)fHD@~Dp3$yvHz(a| zxQCD8_7Luk?P2BMxoV4q<+Cj!1#Ubn8@)1{62O)PoqK&D#B8$CFs4x%9YYXm1+TKF z$&rv5yUxS+Y51&y@@w<@&dlwpH&}qQK^8(b8j_kgC;A!_Pr(5LT~Z5eVuJH@ru>s+ zSz;Drv)~;yAw+BTO&U|ZInTk71_nCV$wa|q#Ly#fn$FQbQOO6=eadF}O%n)2#Uh+w znkgENj`E%hVPmc@Lo+dkEORYaB7Nb^aEdm`aQwX|xIs{4s7)%OC4YUOh@nXd<05Wc zuab}*V7)0cq9S4)k+p;w>FX9U=lO7->?V(8C}vXKY|e@D@Kxl;SMSZ-&pcM92*K>p z8|3o3v~#6V3t@N1CHJJN`9m5i5GVe60Ge!Xt?7n$)cH7UKpCIl#QF-NID7m>I9vpO zhe^_urqM+KiZ$ZK-X7JFyIF$KH#jS0!#=h5%Gymsi*W%XkfyQazp3!3J_rqH(#pa_ z@d6#Xn4o(fvEagoZ%iZ((v{0DU7i+}j(DK8QJ182rX5W3Ai<^s4AB-7WM0}rW8Cs6 zKuB6q9|4f|VeRDbt-ES_aCsz;9e->^3`Y-#h+cBx6_HXQ9b4NB;C`6tX zweXJS5Dq0F87e{NZg@^8-039JJVl5W_9!%#smR|xq;t!kL+JSsD#L(uf|C&j=7mxj zden%Nt6n51!C7h2%nK!Wfe-z-EY3=2bcsj6KDQd@Gv=aUQ3fCJHhq%@X+t-h!xm0~ zJCXdjtj|?aMdz&)XY}UgWZ{nC85M0xZvT)+#(eCp^&VPK9OiJpW;yH5kAloDGJ++N z5Q<^VVwS-@o1T}cKgLc%7sbIgRy(;%qG}tbI4)BD}%k&CU=ou_L~08Go(nG$FaSzfh#o=SW2VKRHnjjdj>6N zu{44cdknGY2amnk$~l3l`{GuZF)Vc!SC>8#!Cus0&aDx}H7N1; zj5&_(=?RJ`i~mcuZ$dQo$ag>Pus#+ougZyHJ!~cA>Kmia^a}g&u3J|3j(ls&E4TnR zq=g(o5kZC!MpLszC}zCM40r{%+&B2}$ksevDXu9;4L+de3NJ8>!pLX4EEF*TeL~6gR){=`TS8+}A2sStA=5=J=bB|KAQIV!_P>bc^Bg zi2Y%81T*MLlDO3;Cs3Lv&qm&|fsJxF&#BH!vhBh&&}b6N`ax*VEtxWN*NO>)p79X% zP#`+7!@6$ayv0hHpN87k+eiDdk*SrT${(^GU3m z2abK_b$f`vFs#_!T=8(p`_jh{=f!oj0*b(SXCZVwXE9wbQS;^^Vq zvE0kv%H>~{^KZy=-7BSF6ZcCbA?bT&MVHWGT}6kQnojwlN-#b?gaSOo(C!|x0qoJ+ zt>ytR3Hcc4oWlh{u{A67PdJ;*&1p|WAdTURs|K9fXO>8VD=O7Bb(!lO2XQ-b0xf(K z@liRK`=Aa{5-7<8W$`_E{JXzMHS5kK^|j2cbsADQI97)B3sw9n!qbbS!F0_3PeM z%O6M<$OL_&7J9`#nXcsIjqcSLDpTwMsxf?<{4w{5f^*@v=Fhp=+jLbYENa2a-N9hp z2kYFAvN034AXccx-{>xxXUaP7vi$7SVk*JcTj^+GhlMk@e3Xyt%AG}nVu^#tTtU5^ zxC#0wj)nCOH62grV3;ImUh2x6DeNIxKq?jB^EVdW-Lj(g(8Hp2_%3;)GbO=GGqc!+4zZW^+LtRbyV zPC$t+$=;AhF&GrJ@%J8^PsL9tWqjvaD4002X=>VTP%_jZ2a_<5)yB*yG;Vkp!|3d0 z;sg%RF+9N#NsA`M$uk`13vyx-q7>1`?ra>S%T~(Ic}MwZoBG5K)H!D|v;)rS|7Gc> z%HZPT*AB6{Xd@Ba;9fMzCy`QKSh3@3&8ZM!AP)C9IQk|_!!3b=cxYsTTL)Tz5q3bk z{hJaF3crPq+a5TrZz@%4LzN!1Ja_hpmL<_QnXBO3*?+H!;gg%Pg&R(e-(6=@UlHyf z&D2JgTg(HpSinQGX}`H3md3znrO0$9Obh4m4L1S}=i90T7^V=rEJWO)v%YeHTlntG ze8>YHraj#J9YnmFxFZsASeKS4@i_+$4p02WAhcr2+t#V=D_jmHSJD@1ieocDj4_Bd z9<}GHA^=FFq*iW_@v#iDaYFpko&bErlHWG}r&!P+*-**ssN6%eqZ?isi-K~3+Askr zhW5?YY3vg77tPs}A=)!bON#<^1oHV?{oev*7%vwkQQ~bg#bTB6s zNT8&kH~?XFD!4Wxi&VomA&6qU3H*?Ix1-9ZY@;&rK#y}&*oPa!ti=jCH@PTi0W>+W!`$01Q7wGp z7BC5WobR4isx4&v%uXymgDvE=4@kr#v9Z)AaW>`h>oW~G%`SHBW`Pw*0nB5Taki;Y? zmZmf!D?<{&ZlBUSs#jjTa`lRfFIuo*!Br?+p_r~o3$6+|pS0mt@J|IY5FOwqcqan^ zzQzv91iqx{Z@Ok#Y8Nomwz?%Kq=#qt4_;)BOIJ9b>%e@e;0(@N_w<=t(+5i^q>iBR z;8AbEAZCckJd}eJD)$UP80@q#W(tp^A|1aUhMi(sY4o&QlQ{>jDkQ(x{2t@ghpbcp zXH+QU2`Sjk+=-jS%;Q>wSutovnyx7<>dj5lxo6BRW*y81SJ39fvs&x~uRt{x#u}s0 zraOTb7TKX@LD4b{j!S*&+;0x;Di!_IW~Wo+z%`5b8Bg#U+!xaDjmvU^x-&;pO%F)l z$IfOaa&c-lg=H{9q>r4g1^jEmhGt9hqR9y6du;c3gg}vIaDW*R7jC>u&heT^krj@c z9g2@wOB^f+fuf>_=pQZ7IT~|wnNy1KCM(1Vf#Meq#uUgzuBg%WW*F}ZlLh(swsh{A z{`u*e3phqOF5^x2eDH$Vrl-!5iSa_4YB8LV0`8Ct0b!Om>gbJnsD_la+ZC6t+5B2^ z&vkSFQ%De-Bi4j$Ab}uadQ%MXtx)n7>S05u5SE;16PH@h&OW=_&Vr#I%tUBpu@oi+ zP%!i1zOF}U!?RKG)hRfoEtUDb$BfP;{30>+17#TEnqRjvjzVp6r++UYwGnoYsh`Gs ziVn^_io6pP7k7j*)`EYyyS+<#RJa+ZW`sE8_!tork64@$Vd)z!NX=8Go%UBoYURN& zOhMq55E1x7@Mb=&v8vj=p{z}31c0?|ygLzEpec`0`J>%L6}TQQh05^>OugN;h7)j) z(!y&dDsgjg5+fA9LkCe`?t{og2X~ngaZfjz7OXhi3`wWuYgnBkmgliYpz1|yH&tru z*Yc%s!@S3%ZQT9nL?SDmP>P8!9U@&wS^Gs=Ul%=G+g}pZAz}cg+zzM$O>+s?_&v(y z#NClXG72R&LQ9Cc?O&+0@`lU_Cdc1ugir-7AGRTy&h*0COq$ghZO(Oi_>#FDl4P!H zQqdRQX&%+;0eC?qVwhy+2_U$2fo_mQZlV~tX!+$Athh)ow-Gk@F7p#w`k+OBoKuJ{ zx4LQ}v^@)!R{KHYcbj@>zk_Det6fxv^#+4e%x41(g++)Yfsqz@m6Fu;sE$l1@PV#-V~g`zWo zWXP~sO4lqt`DFOR!kwpt=zu94`Iz@t#GMV-%6RT17$K^d6EYK3aVpB`l}k?;p1SDX zQlJb-R%3|d#H8027Bx|w&$N6+$vba(CZrzI9!PKkNAN{|s5|U`**FohZGk6Dg;nmc zNiYo2D@5oO#ca#6GrYPQa1Hp2@)W0<%p*R6Y(%U5Kk}gy{P2ck&KiB@%p)7B_r^tXHrIt!c%Cp8a<&UT!~pMJ z1z%{{-4U*3v0eFGY^r|URyw_^2-heBK4B@Vn8!Z7`&xi%k6`9>@$tw8)5Io<+HS^w za9%R9WuU(@$k+KR%6u3g>(a<)v^y*XV2sQKB?j(9P1J)XFc|Y5J)(hXyI6%od>J#s zEv!vLb!HJNw(gXwQ6{3oRi@RfKJtFPSQmu4P`)J5wEYp>|)C8oTo6W;Hp_}{s-SXTgqyz+l33P&)ZZY!* zzKYD#e@un=8-2u2Jhirb%slEDR<~y!*)rck-g6d`!v^BP61>$tZ-xpyFfgG8s8Rzq zT(A%VrXK3xpjbZ=g<>N+uK5ND39?(PTUQCBQ82n}Hb*1HtYez&Y_aZ(rfz0MjVvSr>@ literal 0 HcmV?d00001 diff --git a/po/th.po b/po/th.po new file mode 100644 index 0000000..12fcb0c --- /dev/null +++ b/po/th.po @@ -0,0 +1,2147 @@ +# Thai translation of glib. +# Copyright (C) 2005-2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Theppitak Karoonboonyanan , 2005-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.14.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-02-08 09:55+0700\n" +"Last-Translator: Theppitak Karoonboonyanan \n" +"Language-Team: Thai \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "พบแอตทริบิวต์ '%s' ที่ไม่ต้องการ สำหรับอิลิเมนต์ '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ไม่พบแอตทริบิวต์ '%s' สำหรับอิลิเมนต์ '%s'" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "พบแท็ก '%s' ที่ไม่ต้องการ ขณะที่ต้องการแท็ก '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "พบแท็ก '%s' ที่ไม่ต้องการภายใน '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "ไม่พบแฟ้มที่คั่นหน้าที่ใช้การได้ในไดเรกทอรีข้อมูล" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "มีที่คั่นหน้าสำหรับ URI '%s' อยู่ก่อนแล้ว" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "ไม่พบที่คั่นหน้าสำหรับ URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "ไม่ได้กำหนดชนิด MIME ไว้ในที่คั่นหน้าสำหรับ URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "ไม่ได้กำหนดแฟล็กส่วนตัวไว้ในที่คั่นหน้าสำหรับ URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "ไม่ได้กำหนดกลุ่มไว้ในที่คั่นหน้าสำหรับ URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "ไม่มีโปรแกรมประยุกต์ชื่อ '%s' ที่ลงทะเบียนที่คั่นหน้าสำหรับ '%s' ไว้" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "กระจายบรรทัดคำสั่ง '%s' ด้วย URI '%s' ไม่สำเร็จ" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ไม่รองรับการแปลงรหัสอักขระจาก '%s' ไปเป็น '%s'" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "ไม่สามารถเปิดตัวแปลงรหัสอักขระจาก '%s' ไปเป็น '%s' ได้" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "มีลำดับไบต์ที่ไม่ถูกต้องในข้อมูลที่ป้อนให้ตัวแปลงรหัส" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "เกิดข้อผิดพลาดระหว่างแปลงรหัส: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "มีลำดับไบต์ไม่เต็มอักขระอยู่ที่ท้ายข้อมูลเข้า" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ไม่สามารถแปลงสตริงซ่อมเสริม '%s' ให้เป็นรหัส '%s' ได้" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' ไม่ใช่ URI สัมบูรณ์ที่ใช้ scheme \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI ของแฟ้มท้องถิ่น '%s' ต้องไม่มี '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ใช้ไม่ได้" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "ชื่อโฮสต์ของ URI '%s' ใช้ไม่ได้" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' มีอักขระหลีกที่ไม่ถูกต้อง" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ชื่อพาธ '%s' ไม่ใช่พาธเต็ม" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "ชื่อโฮสต์ผิดรูปแบบ" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดไดเรกทอรี '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ไม่สามารถจองหน่วยความจำ %lu ไบต์เพื่ออ่านแฟ้ม \"%s\" ได้" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "แฟ้ม \"%s\" ใหญ่เกินไป" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "อ่านข้อมูลจากแฟ้ม '%s' ไม่สำเร็จ: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "อ่านแอตทริบิวต์ของแฟ้ม '%s' ไม่สำเร็จ: fstat() ล้มเหลว: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: fdopen() ล้มเหลว: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "เปลี่ยนชื่อแฟ้ม '%s' ไปเป็น '%s' ไม่สำเร็จ: g_rename() ล้มเหลว: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "สร้างแฟ้ม '%s' ไม่สำเร็จ: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "เปิดแฟ้ม '%s' เพื่อเขียนไม่สำเร็จ: fdopen() ล้มเหลว: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fwrite() ล้มเหลว: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fflush() ล้มเหลว: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fsync() ล้มเหลว: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ปิดแฟ้ม '%s' ไม่สำเร็จ: fclose() ล้มเหลว: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ไม่สามารถลบแฟ้ม '%s' ที่มีอยู่ได้: g_unlink() ล้มเหลว: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "แม่แบบ '%s' ใช้ไม่ได้ ไม่ควรมี '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "แม่แบบ '%s' ไม่มี XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u ไบต์" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "อ่านลิงก์สัญลักษณ์ '%s' ไม่สำเร็จ: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "ไม่รองรับลิงก์สัญลักษณ์" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "ไม่สามารถเปิดตัวแปลงรหัสอักขระจาก '%s' ไปเป็น '%s' ได้: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "ไม่สามารถอ่านข้อมูลแบบดิบใน g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "มีข้อมูลตกค้างไม่ได้แปลงอยู่ในบัฟเฟอร์สำหรับอ่าน" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "แชนเนลจบด้วยข้อมูลไม่เต็มอักขระ" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "ไม่สามารถอ่านข้อมูลแบบดิบใน g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: open() ล้มเหลว: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "แม็ปแฟ้ม '%s' ไม่สำเร็จ: mmap() ล้มเหลว: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "มีข้อผิดพลาดที่บรรทัด %d อักขระที่ %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "พบข้อความลงรหัส UTF-8 ไม่ถูกต้องในชื่อ - ข้อความที่ผิด: '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้: '%c' " + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "มีข้อผิดพลาดที่บรรทัด %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"ไม่สามารถแจง '%-.*s' ซึ่งควรจะเป็นตัวเลขภายในตัวอ้างอิงอักขระ (เช่น ê) " +"เป็นไปได้ว่าตัวเลขอาจจะมากเกินไป" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"ตัวอ้างอิงอักขระไม่ได้ปิดด้วยอัฒภาค เป็นไปได้สูงที่คุณอาจใช้ ampersand โดยไม่ได้จงใจให้เริ่มเอนทิตี " +"ถ้าใช่ ก็จงหลีก ampersand โดยแทนด้วย & เสีย" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ตัวอ้างอิงอักขระ '%-.*s' ไม่ได้ลงรหัสอักขระที่อนุญาตให้ใช้ได้" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "พบเอนทิตีว่างเปล่า '&;' ซึ่งไม่ถูกต้อง ค่าที่ใช้ได้คือ: & " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ไม่รู้จักเอนทิตีชื่อ '%-.*s'" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"เอนทิตีไม่ได้ปิดด้วยอัฒภาค เป็นไปได้สูงที่คุณอาจใช้ ampersand โดยไม่ได้จงใจให้เริ่มเอนทิตี ถ้าใช่ " +"ก็จงหลีก ampersand โดยแทนด้วย & เสีย" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "เอกสารต้องเริ่มด้วยอิลิเมนต์ (เช่น )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' ไม่ใช่อักขระที่ใช้ตามหลัง '<' ได้ จึงไม่สามารถใช้ขึ้นต้นชื่ออิลิเมนต์ได้" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "พบอักขระแปลกปลอม '%s' ในขณะที่มองหาอักขระ '>' ที่จะมาปิดแท็กอิลิเมนต์เปล่า '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหา '=' หลังชื่อแอตทริบิวต์ '%s' ของอิลิเมนต์ '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหา '>' หรือ '/' ที่จะมาปิดแท็กตั้งต้นของอิลิเมนต์ '%" +"s' หรือไม่ก็เป็นแอตทริบิวต์ เป็นไปได้ว่าคุณกำลังใช้อักขระที่ใช้ไม่ได้ในชื่อแอตทริบิวต์" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหาอัญประกาศเปิดหลัง '=' " +"ในการกำหนดค่าให้กับแอตทริบิวต์ '%s' ของอิลิเมนต์ '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' ไม่ใช่อักขระที่ใช้ตามหลังชื่ออิลิเมนต์ '%s' ในแท็กปิดได้ อักขระเดียวที่อนุญาตคือ '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "พบการปิดอิลิเมนต์ '%s' แต่ไม่มีอิลิเมนต์ใดเปิดอยู่" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "พบการปิดอิลิเมนต์ '%s' แต่อิลิเมนต์ที่เปิดอยู่คือ '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "เอกสารว่างเปล่า หรือมีแต่อักขระช่องว่าง" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "เอกสารจบแบบผิดปกติหลังจากวงเล็บแหลม '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "เอกสารจบแบบผิดปกติ โดยยังมีอิลิเมนต์เปิดอยู่ - '%s' คืออิลิเมนต์ที่เปิดล่าสุด" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "เอกสารจบแบบผิดปกติ ในขณะที่กำลังมองหาวงเล็บแหลมที่จะมาปิดแท็ก <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางชื่ออิลิเมนต์" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางชื่อแอตทริบิวต์" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางแท็กเปิดอิลิเมนต์" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "เอกสารจบแบบผิดปกติหลังจากเครื่องหมาย '=' หลังชื่อแอตทริบิวต์ โดยไม่มีค่าของแอตทริบิวต์" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางค่าแอตทริบิวต์" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางแท็กปิดสำหรับอิลิเมนต์ '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางหมายเหตุหรือคำสั่งประมวลผล" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "ออบเจกต์เสียหาย" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "ข้อผิดพลาดภายในหรือออบเจกต์เสียหาย" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "หน่วยความจำเต็ม" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "เกินขอบเขตการถอยคืน" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "แพตเทิร์นมีรายการที่ไม่รองรับในการจับคู่ทีละส่วน" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "ข้อผิดพลาดภายใน" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "ไม่รองรับการใช้การอ้างอิงย้อนกลับเป็นเงื่อนไขในการจับคู่ทีละส่วน" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "เกินขอบเขตการเรียกตัวเอง" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "เกินขอบเขตพื้นที่ทำงานสำหรับสตริงย่อยเปล่า" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "ชุดของแฟล็กการขึ้นบรรทัดใหม่มีค่าไม่เข้ากัน" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "ข้อผิดพลาดไม่ทราบสาเหตุ" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "พบ \\ ที่ท้ายแพตเทิร์น" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "พบ \\c ที่ท้ายแพตเทิร์น" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "พบอักขระที่ไม่รู้จักตามหลัง \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ห้ามใช้รหัสหลีกเปลี่ยนตัวพิมพ์ใหญ่-เล็ก (\\l, \\L, \\u, \\U) ที่ตำแหน่งนี้" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "ค่าตัวเลขผิดพลาดในตัวระบุปริมาณ {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "ค่าตัวเลขสูงเกินไปในตัวระบุปริมาณ {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "ไม่มี ] ปิดในคลาสอักขระ" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "มีลำดับอักขระหลีกที่ไม่ถูกต้องในคลาสอักขระ" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "ค่าช่วงผิดพลาดในคลาสอักขระ" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "ไม่มีสิ่งที่จะซ้ำ" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "พบอักขระที่ไม่รู้จักหลัง (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "พบอักขระที่ไม่รู้จักหลัง (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "พบอักขระที่ไม่รู้จักหลัง (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "ใช้ชื่อคลาสอักขระของ POSIX ได้ในคลาสเท่านั้น" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "ไม่มี ) ปิด" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "พบ ) โดยไม่มี ( เปิด" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R หรือ (?[+-]ตัวเลข ต้องตามด้วย ) เสมอ" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "มีการอ้างถึงแพตเทิร์นย่อยที่ไม่มีอยู่" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "ไม่มี ) หลังหมายเหตุ" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "นิพจน์เรกกิวลาร์ยาวเกินไป" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "จองหน่วยความจำไม่สำเร็จ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "แพตเทิร์นตรวจค่าย้อนไม่ได้มีความยาวคงที่" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "ตัวเลขหรือชื่อผิดรูปแบบหลัง (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "กลุ่มเงื่อนไขมีทางเลือกที่เป็นไปได้มากกว่าสองทาง" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "ต้องการแพตเทิร์นตรวจค่าหลัง (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "พบชื่อคลาสของ POSIX ที่ไม่รู้จัก" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "ไม่รองรับ collating element ของ POSIX" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "ค่าอักขระในลำดับ \\x{...} มีค่าสูงเกินไป" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "เงื่อนไข (?(0) ใช้ไม่ได้" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "ใช้ \\C ในแพตเทิร์นตรวจค่าย้อนไม่ได้" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "การเรียกตัวเองมีโอกาสวนรอบไม่รู้จบ" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "ไม่มีตัวปิดในชื่อแพตเทิร์นย่อย" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "มีแพตเทิร์นย่อยชื่อซ้ำกัน" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "ลำดับ \\P หรือ \\p ผิดรูปแบบ" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "พบชื่อคุณสมบัติที่ไม่รู้จักหลัง \\P หรือ \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ชื่อแพตเทิร์นย่อยยาวเกินไป (ความยาวสูงสุดคือ 32 อักขระ)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "มีแพตเทิร์นย่อยมากเกินไป (สูงสุดได้ 10,000 แพตเทิร์น)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "ค่าเลขฐานแปดสูงกว่า \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "กลุ่ม DEFINE มีทางเลือกมากกว่าหนึ่งทาง" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "ซ้ำกลุ่ม DEFINE ไม่ได้" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "ตัวเลือก NEWLINE ขัดแย้งกันเอง" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g ไม่ได้ตามด้วยชื่อในวงเล็บปีกกา หรือตัวเลขที่ไม่ใช่ศูนย์ที่อาจอยู่ในวงเล็บปีกกา" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "พบการซ้ำที่ไม่คาดหมาย" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "โค้ดล้น" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "ใช้พื้นที่ทำงานสำหรับการคอมไพล์หมดแล้ว" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "ไม่พบแพตเทิร์นย่อยที่ตรวจสอบไปก่อนหน้าที่อ้างถึง" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "เกิดข้อผิดพลาดขณะจับคู่นิพจน์เรกกิวลาร์ %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "ไลบรารี PCRE ถูกคอมไพล์มาแบบไม่รองรับ UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "ไลบรารี PCRE ถูกคอมไพล์มาแบบไม่รองรับคุณสมบัติ UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "เกิดข้อผิดพลาดขณะแจงนิพจน์เรกกิวลาร์ %s ที่อักขระที่ %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "เกิดข้อผิดพลาดขณะออปติไมซ์นิพจน์เรกกิวลาร์ %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "ต้องการเลขฐานสิบหกหรือ '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "ต้องการเลขฐานสิบหก" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "ไม่มี '<' ในตัวอ้างอิงสัญลักษณ์" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "ตัวอ้างอิงสัญลักษณ์ไม่สมบูรณ์" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "ตัวอ้างอิงสัญลักษณ์มีความยาวเป็นศูนย์" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "ต้องการตัวเลข" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "ตัวอ้างอิงสัญลักษณ์ไม่ถูกต้อง" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "'\\' ปราศจากข้อมูลอยู่ที่ท้ายสตริง" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "ลำดับอักขระหลีกไม่รู้จัก" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "เกิดข้อผิดพลาดขณะแจงข้อความสำหรับแทนที่ \"%s\" ที่อักขระที่ %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ข้อความคำพูดไม่ได้ขึ้นต้นด้วยอัญประกาศ" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "พบอัญประกาศไม่เข้าคู่ในบรรทัดคำสั่งหรือข้อความคำพูดของเชลล์" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ข้อความจบทันทีหลังอักขระ '\\' (ข้อความที่ว่าคือ '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "ข้อความจบเสียก่อนจะพบอัญประกาศที่เข้าคู่กับ %c (ข้อความที่ว่าคือ '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "ข้อความว่างเปล่า (หรือมีแต่อักขระช่องว่าง)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "อ่านข้อมูลจากโพรเซสลูกไม่สำเร็จ" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "สร้างไปป์เพื่อสื่อสารกับโพรเซสลูกไม่สำเร็จ (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "อ่านข้อมูลจากไปป์จากโพรเซสลูกไม่สำเร็จ (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "เข้าไปที่ไดเรกทอรี '%s' ไม่สำเร็จ (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ดำเนินงานโพรเซสลูกไม่สำเร็จ (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "ชื่อโปรแกรมผิดรูปแบบ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "สตริงผิดรูปแบบในเวกเตอร์ของอาร์กิวเมนต์ที่ตำแหน่ง %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "สตริงผิดรูปแบบในตัวแปรสภาพแวดล้อม: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ไดเรกทอรีใช้งานมีรูปแบบไม่ถูกต้อง: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ดำเนินงานโปรแกรมช่วยไม่สำเร็จ (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"เกิดข้อผิดพลาดไม่คาดหมายใน g_io_channel_win32_poll() ระหว่างอ่านข้อมูลจากโพรเซสลูก" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "อ่านข้อมูลจากโพรเซสลูกไม่สำเร็จ (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "เกิดข้อผิดพลาดไม่คาดหมายใน select() ระหว่างอ่านข้อมูลจากโพรเซสลูก (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "เกิดข้อผิดพลาดไม่คาดหมายใน waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork ไม่สำเร็จ (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ดำเนินงานโพรเซสลูก \"%s\" ไม่สำเร็จ (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "เปลี่ยนทิศทางข้อมูลเข้าหรือออกจากโพรเซสลูกไม่สำเร็จ (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "fork โพรเซสลูกไม่สำเร็จ (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะดำเนินงานโพรเซสลูก \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "อ่านข้อมูลจากไปป์จากโพรเซสลูกได้ไม่เพียงพอ (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "อักขระอยู่นอกช่วงของ UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "มีลำดับข้อมูลที่ไม่ถูกต้องในข้อมูลที่ป้อนให้ตัวแปลงรหัส" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "อักขระอยู่นอกช่วงของ UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "วิธีใช้:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "ตัวเลือกแสดงวิธีใช้:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "แสดงวิธีใช้ตัวเลือกต่างๆ" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "แสดงวิธีใช้ตัวเลือกต่างๆ ทั้งหมด" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "ตัวเลือกของโปรแกรม:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ไม่สามารถแจงค่าจำนวนเต็ม '%s' สำหรับ %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "ค่าจำนวนเต็ม '%s' สำหรับ %s ออกนอกช่วงที่กำหนด" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "ไม่สามารถแจงค่า double '%s' สำหรับ %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "ค่า double '%s' สำหรับ %s ออกนอกช่วงที่กำหนด" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "เกิดข้อผิดพลาดขณะแจงตัวเลือก: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "ขาดอาร์กิวเมนต์สำหรับ %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "ไม่รู้จักตัวเลือก %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "ไม่พบแฟ้มคีย์ที่ใช้การได้ในไดเรกทอรีแหล่งค้นหา" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "ไม่ใช่แฟ้มปกติ" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "แฟ้มว่างเปล่า" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "แฟ้มคีย์มีบรรทัด '%s' ซึ่งไม่ใช่รูปแบบคู่คีย์-ค่า, กลุ่ม, หรือหมายเหตุ ที่ถูกต้อง" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "ชื่อกลุ่มผิดรูปแบบ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "แฟ้มคีย์ไม่ได้ขึ้นต้นด้วยกลุ่ม" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "ชื่อคีย์ผิดรูปแบบ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "แฟ้มคีย์มีเนื้อหาเป็นรหัสอักขระ '%s' ซึ่งไม่รองรับ" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "แฟ้มคีย์ไม่มีกลุ่ม '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "แฟ้มคีย์ไม่มีคีย์ '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่า '%s' ซึ่งไม่ใช่รูปแบบ UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "แฟ้มคีย์มีคีย์ '%s' ในกลุ่ม '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "แฟ้มคีย์ไม่มีคีย์ '%s' ในกลุ่ม '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "แฟ้มคีย์มีอักขระหลีกที่ท้ายบรรทัด" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "แฟ้มคีย์มีลำดับหลีก '%s' ที่ไม่ถูกต้อง" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ค่า '%s' ไม่สามารถตีความเป็นตัวเลขได้" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ค่าจำนวนเต็ม '%s' ออกนอกช่วง" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "ค่า '%s' ไม่สามารถตีความเป็นตัวเลข float ได้" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ค่า '%s' ไม่สามารถตีความเป็นบูลีนได้" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "สตรีมถูกปิดไปแล้ว" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "การกระทำถูกยกเลิก" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "อ็อบเจกต์ผิดพลาด ยังไม่ได้ตั้งค่าเริ่มต้น" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "มีลำดับไบต์ที่ไม่สมบูรณ์ในข้อมูลเข้า" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "มีที่ว่างไม่พอที่ปลายทาง" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "ไม่รองรับการตั้งค่าเริ่มต้นแบบยกเลิกได้" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "ชนิดข้อมูลไม่รู้จัก" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "ชนิดแฟ้ม %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "ชนิด %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "พบจุดจบสตรีมก่อนกำหนด" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "ไม่มีชื่อ" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "แฟ้มเดสก์ท็อปไม่ได้ระบุเขตข้อมูล Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "หาเทอร์มินัลซึ่งต้องใช้ในการเปิดโปรแกรมไม่พบ" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ไม่สามารถสร้างโฟลเดอร์ %s สำหรับเก็บค่าตั้งโปรแกรมของผู้ใช้: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ไม่สามารถสร้างโฟลเดอร์ %s สำหรับเก็บค่าตั้ง MIME ของผู้ใช้: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ไม่สามารถสร้างแฟ้มเดสก์ท็อป %s สำหรับผู้ใช้" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "ข้อกำหนดกำหนดเองสำหรับ %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ไดรว์ไม่รองรับคำสั่งดันแผ่นออก" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ไดรว์ไม่รองรับคำสั่ง eject หรือ eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ไดรว์ไม่รองรับคำสั่งวนตรวจสื่อ" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ไดรว์ไม่รองรับคำสั่ง start" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ไดรว์ไม่รองรับคำสั่ง stop" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GEmblem รุ่น %d ได้" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "จำนวนโทเคนในรหัสของ GEmblem (%d) ไม่ถูกต้อง" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GEmblemedIcon รุ่น %d ได้" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "จำนวนโทเคนในรหัสของ GEmblemedIcon (%d) ไม่ถูกต้อง" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "ต้องการข้อมูล GEmblem สำหรับ GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "ไม่รองรับการกระทำนี้" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "ไม่มีจุดเมานท์ที่บรรจุแฟ้มอยู่" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "ไม่สามารถคัดลอกทับไดเรกทอรี" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "ไม่สามารถคัดลอกไดเรกทอรีทับไดเรกทอรี" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "มีแฟ้มปลายทางอยู่ก่อนแล้ว" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "ไม่สามารถคัดลอกไดเรกทอรีทั้งยวง" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "ไม่รองรับลิงก์สัญลักษณ์" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "ไม่สามารถคัดลอกแฟ้มพิเศษได้" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "ได้รับชื่อ symlink ที่ใช้การไม่ได้" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "ไม่รองรับการใช้ถังขยะ" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ชื่อแฟ้มจะมีอักขระ '%c' ไม่ได้" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "โวลุมไม่รองรับการเมานท์" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "ไม่มีโปรแกรมที่ลงทะเบียนสำหรับจัดการแฟ้มประเภทนี้ไว้" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "ตัวแจงนับถูกปิด" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "ตัวแจงนับแฟ้มมีการกระทำค้างอยู่" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "ตัวแจงนับแฟ้มถูกปิดไปแล้ว" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GFileIcon รุ่น %d ได้" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "ข้อมูลเข้าของ GFileIcon ผิดรูปแบบ" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "สตรีมไม่รองรับ query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "สตรีมไม่รองรับการเลื่อนตำแหน่งอ่านเขียน" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "สตรีมข้อมูลเข้าไม่สามารถตัดท้ายทิ้งได้" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "สตรีมไม่รองรับการตัดท้ายทิ้ง" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "จำนวนโทเคน (%d) ไม่ถูกต้อง" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "ไม่มีชนิดสำหรับคลาสชื่อ %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ชนิด %s ไม่ได้ทำอินเทอร์เฟซ GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "ชนิด %s ไม่ได้เป็นคลาส" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "เลขรุ่นมีรูปแบบไม่ถูกต้อง: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ชนิด %s ไม่ได้ทำ from_tokens() ของอินเทอร์เฟซ GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของไอคอนรุ่นที่ระบุได้" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "สตรีมข้อมูลเข้ายังไม่รองรับการอ่าน" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "สตรีมมีการกระทำค้างอยู่" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "มีที่ว่างไม่พอสำหรับที่อยู่ซ็อกเก็ต" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "ไม่รองรับที่อยู่ซ็อกเก็ต" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "ไม่สามารถหาชนิดปริยายของการเฝ้ามองไดเรกทอรีในเครื่อง" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "ชื่อแฟ้ม %s ผิดรูปแบบ" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านข้อมูลของระบบแฟ้ม: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "ไม่สามารถเปลี่ยนชื่อไดเรกทอรีราก" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปลี่ยนชื่อแฟ้ม: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "ไม่สามารถเปลี่ยนชื่อแฟ้ม เนื่องจากมีแฟ้มชื่อเดียวกันอยู่ก่อนแล้ว" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "ชื่อแฟ้มผิดรูปแบบ" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "ไม่สามารถเปิดไดเรกทอรี" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้ม: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "เกิดข้อผิดพลาดขณะทิ้งแฟ้มลงถังขยะ: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "สร้างไดเรกทอรีถังขยะ '%s' ไม่สำเร็จ: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "หาไดเรกทอรีระดับบนสุดสำหรับถังขยะไม่สำเร็จ" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "หาหรือสร้างไดเรกทอรีถังขยะไม่สำเร็จ" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "สร้างแฟ้มข้อมูลการทิ้งขยะไม่สำเร็จ: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ทิ้งแฟ้มลงถังขยะไม่สำเร็จ: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างไดเรกทอรี: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ระบบแฟ้มไม่รองรับลิงก์สัญลักษณ์" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างลิงก์สัญลักษณ์: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "เกิดข้อผิดพลาดขณะย้ายแฟ้ม: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "ไม่สามารถย้ายไดเรกทอรีทับไดเรกทอรี" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "สร้างแฟ้มสำรองไม่สำเร็จ" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้มปลายทาง: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "ไม่รองรับการย้ายแฟ้มข้ามอุปกรณ์" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "ค่าแอตทริบิวต์ต้องไม่ใช่ตัวชี้ศูนย์" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "ชนิดของแอตทริบิวต์ใช้การไม่ได้ (ต้องการสตริง)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "ชื่อแอตทริบิวต์ส่วนขยายเพิ่มใช้การไม่ได้" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดแอตทริบิวต์ส่วนขยาย '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะ stat แฟ้ม '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (รหัสอักขระไม่ถูกต้อง)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "เกิดข้อผิดพลาดขณะ stat file descriptor: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ชนิดของแอตทริบิวต์ไม่ถูกต้อง (ต้องการ uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ชนิดของแอตทริบิวต์ไม่ถูกต้อง (ต้องการ uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "ชนิดของแอตทริบิวต์ไม่ถูกต้อง (ต้องการสตริงของไบต์)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "ไม่สามารถกำหนดสิทธิ์ให้กับ symlink ได้" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดสิทธิ์: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดเจ้าของ: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "symlink ต้องไม่ใช่ตัวชี้ศูนย์" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนด symlink: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "เกิดข้อผิดพลาดขณะกำหนด symlink: แฟ้มไม่ใช่ symlink" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดเวลาเปลี่ยนแปลงหรือเข้าถึง: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context ต้องไม่ใช่ตัวชี้ศูนย์" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนด SELinux context: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "ไม่ได้เปิดใช้งาน SELinux ในระบบนี้" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ไม่รองรับการกำหนดแอตทริบิวต์ %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านข้อมูลจากแฟ้ม: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "เกิดข้อผิดพลาดขณะเลื่อนตำแหน่งอ่านเขียนแฟ้ม: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดแฟ้ม: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "ไม่สามารถหาชนิดปริยายของการเฝ้ามองแฟ้มในเครื่อง" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้ม: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้มสำรองเก่า: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างสำเนาสำรอง: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปลี่ยนชื่อแฟ้มสำรอง: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "เกิดข้อผิดพลาดขณะตัดท้ายแฟ้มทิ้ง: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "แฟ้มปลายทางเป็นไดเรกทอรี" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "แฟ้มปลายทางไม่ใช่แฟ้มปกติ" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "แฟ้มถูกแก้ไขโดยโปรแกรมอื่น" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้มเดิม: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "ได้รับค่า GSeekType ที่ใช้การไม่ได้" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "คำสั่งเลื่อนตำแหน่งอ่านเขียนผิดเงื่อนไข" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "ไม่สามารถตัดท้าย GMemoryInputStream ทิ้ง" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "สตรีมข้อมูลออกในหน่วยความจำไม่สามารถเปลี่ยนขนาดได้" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "เปลี่ยนขนาดสตรีมข้อมูลออกในหน่วยความจำไม่สำเร็จ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "ปริมาณหน่วยความจำที่ต้องการสำหรับการเขียนใหญ่เกินขอบเขตของแอดเดรสที่มี" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "มีการร้องขอให้เลื่อนตำแหน่งไปก่อนหน้าจุดเริ่มต้นของสตรีม" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "มีการร้องขอให้เลื่อนตำแหน่งเลยจุดสิ้นสุดของสตรีมออกไป" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "การเมานท์นี้ยังไม่รองรับคำสั่ง \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "การเมานท์นี้ยังไม่รองรับคำสั่ง \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "การเมานท์นี้ยังไม่รองรับคำสั่ง \"unmount\" หรือ \"unmount_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "การเมานท์นี้ยังไม่รองรับคำสั่ง \"eject\" หรือ \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "การเมานท์นี้ยังไม่รองรับคำสั่ง \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "การเมานท์นี้ยังไม่รองรับการเดาชนิดเนื้อหา" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "การเมานท์นี้ยังไม่รองรับการเดาชนิดเนื้อหาแบบซิงโครนัส" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ชื่อโฮสต์ '%s' มี '[' แต่ไม่มี ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "สตรีมข้อมูลออกยังไม่รองรับการเขียนข้อมูล" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "สตรีมต้นทางถูกปิดไปแล้ว" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดหาที่อยู่ '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดหาที่อยู่ '%s' ย้อนกลับ: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "ไม่มีข้อมูลบริการสำหรับ '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "ไม่สามารถเปิดหาที่อยู่ '%s' ได้ชั่วคราว" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "เกิดข้อผิดพลาดขณะเปิดหาที่อยู่ '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "ซ็อกเก็ตผิดพลาด ยังไม่ได้ตั้งค่าเริ่มต้น" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ซ็อกเก็ตผิดพลาด ตั้งค่าเริ่มต้นไม่สำเร็จเนื่องจาก: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "ซ็อกเก็ตถูกปิดไปแล้ว" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ขณะสร้าง GSocket จาก fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "สร้างซ็อกเก็ตไม่สำเร็จ: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "มีการระบุโพรโทคอลที่ไม่รู้จัก" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "ไม่สามารถหาที่อยู่ฝั่งนี้ได้: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "ไม่สามารถหาที่อยู่ฝั่งโน้นได้: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "ไม่สามารถ listen: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "เกิดข้อผิดพลาดขณะ bind กับที่อยู่: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "เกิดข้อผิดพลาดขณะรับการเชื่อมต่อ: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "เกิดข้อผิดพลาดขณะเชื่อมต่อ: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "กำลังอยู่ระหว่างเชื่อมต่อ" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "เกิดข้อผิดพลาดขณะเชื่อมต่อ: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ไม่สามารถอ่านข้อผิดพลาดที่คั่งค้างอยู่ได้: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "เกิดข้อผิดพลาดขณะรับข้อมูล: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "เกิดข้อผิดพลาดขณะล่งข้อมูล: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดซ็อกเก็ต: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "กำลังรอเงื่อนไขของซ็อกเก็ต: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "เกิดข้อผิดพลาดขณะส่งข้อความ: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "ไม่รองรับ GSocketControlMessage บนวินโดวส์" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "เกิดข้อผิดพลาดขณะรับข้อความ: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะเชื่อมต่อ" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Listener ถูกปิดไปแล้ว" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "ซ็อกเก็ตที่เพิ่มถูกปิดไปแล้ว" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GThemedIcon รุ่น %d ได้" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "ต้องการข้อความควบคุม 1 ข้อความ แต่ได้รับ %d ข้อความ" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "พบข้อมูลช่วยเป็นชนิดที่ไม่คาดหมาย" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ต้องการ fd หนึ่งรายการ แต่ได้รับ %d รายการ\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "ได้รับ fd ที่ไม่ถูกต้อง" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้มยูนิกซ์: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดแฟ้มยูนิกซ์: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "รากระบบแฟ้ม" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้มยูนิกซ์: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ระบบนี้ไม่รองรับที่อยู่ unix domain socket แบบ abstract" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "โวลุมยังไม่รองรับการดันสื่อออก" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "โวลุมยังไม่รองรับคำสั่ง eject หรือ eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "หาโปรแกรมไม่พบ" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "เกิดข้อผิดพลาดขณะเรียกโปรแกรม: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "ไม่รองรับ URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "ไม่รองรับการเปลี่ยนแปลงการเชื่อมโยงสำหรับ win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "ไม่รองรับการสร้างการเชื่อมโยงสำหรับ win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "หน่วยความจำไม่พอ" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "ข้อผิดพลาดภายใน: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "ต้องการข้อมูลเข้าเพิ่มเติม" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "ข้อมูลบีบอัดผิดรูปแบบ" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "มีลำดับ UTF-8 ที่ไม่ถูกต้องในข้อมูลเข้า" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "มาถึงขีดจำกัดสูงสุดของแอร์เรย์ข้อมูลแล้ว" + +#~ msgid "do not hide entries" +#~ msgstr "ไม่ต้องซ่อนรายการใด" + +#~ msgid "use a long listing format" +#~ msgstr "ใช้รูปแบบรายการแบบยาว" + +#~ msgid "[FILE...]" +#~ msgstr "[FILE...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "อักขระ '%s' ไม่สามารถใช้ขึ้นต้นชื่อเอนทิตีได้ อักขระ & ใช้เริ่มเอนทิตี ถ้าเครื่องหมาย " +#~ "ampersand นี้ไม่ได้เจตนาให้เป็นเอนทิตี ต้องหลีกโดยแทนด้วย &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "อักขระ '%s' ใช้ในชื่อเอนทิตีไม่ได้" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "ตัวอ้างอิงอักขระว่างเปล่า ควรจะมีตัวเลข เช่น dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "ตัวอ้างอิงเอนทิตีไม่สมบูรณ์" + +#~ msgid "Unfinished character reference" +#~ msgstr "ตัวอ้างอิงอักขระไม่สมบูรณ์" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "ข้อความลงรหัส UTF-8 ไม่ถูกต้อง - ลำดับซ้อนเหลื่อมกัน" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "ข้อความลงรหัส UTF-8 ไม่ถูกต้อง - ไม่ได้เริ่มด้วยไบต์ที่เป็นต้นอักขระ" + +#~ msgid "file" +#~ msgstr "แฟ้ม" + +#~ msgid "The file containing the icon" +#~ msgstr "แฟ้มที่เก็บไอคอน" + +#~ msgid "name" +#~ msgstr "ชื่อ" + +#~ msgid "The name of the icon" +#~ msgstr "ชื่อของไอคอน" + +#~ msgid "names" +#~ msgstr "รายชื่อ" + +#~ msgid "An array containing the icon names" +#~ msgstr "แอร์เรย์เก็บรายชื่อของไอคอน" + +#~ msgid "use default fallbacks" +#~ msgstr "ใช้ fallback ปริยาย" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "กำหนดว่าจะใช้ fallback ปริยายซึ่งหาได้โดยตัดท้ายชื่อที่อักขระ '-' หรือไม่ ถ้ามีหลายชื่อ " +#~ "จะใช้เพียงชื่อแรกเท่านั้น" + +#~ msgid "File descriptor" +#~ msgstr "File descriptor" + +#~ msgid "The file descriptor to read from" +#~ msgstr "File descriptor ที่จะอ่าน" + +#~ msgid "Close file descriptor" +#~ msgstr "ปิด file descriptor" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "กำหนดว่าจะปิด file descriptor ด้วยหรือไม่ เมื่อปิดสตรีม" + +#~ msgid "The file descriptor to write to" +#~ msgstr "File descriptor ที่จะเขียน" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "เกิดข้อผิดพลาดขณะสร้างลิงก์สำรอง: %s" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "ไม่สามารถเรียกแฟ้มเดสก์ท็อปที่เพิ่งสร้าง" + +#~ msgid "Target file already exists" +#~ msgstr "มีแฟ้มปลายทางชื่อนี้อยู่ก่อนแล้ว" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ g_input_stream_read_async" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ g_input_stream_skip" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ g_input_stream_skip_async" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ g_output_stream_write" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ g_output_stream_write_async" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: fork() ล้มเหลว: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: chmod() ล้มเหลว: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: โพรเซสลูกจบโดยสัญญาณ: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "ไม่สามารถเปลี่ยนโหมดของแฟ้มได้: โพรเซสลูกจบแบบผิดปกติ" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "ไม่รองรับการแปลงรหัสอักขระจาก '%s' ไปเป็น '%s'" diff --git a/po/tl.gmo b/po/tl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9a8783d9928f77471bb58dbe5f6939a05965f928 GIT binary patch literal 16011 zcmd6tYm6k)G8iI}ZLpYw!NMtL{Db+;h%7_uO;l_3PjJqQfVn-Aen`dmQJ>VE=0VWC_~YQ;gBt%IAR=>i-r_j?a}M&K*7X=DzAl2A@5|tA;H%&Q z_&reax%Q)uvkV>qrPmk0`@!#mkAb&*%+m2e(Rm)!{NDhz{=We=-&H7KFSrMUCFcx? z3Y-8Go#()>gWm?911}>)$@NW8`oA6K5SeotMAc3gl$R!M^}Q@P3qZKln0u82l&jG`JJv(t0j}7r?K9FM(Ij+Wq!5 z(5xGj9$p7w&3PZflYUyDo`<0Lem?*G8hC`?Z-NYQ4j^>(TLJa^3!v!!UjF>g!4v#` zBgexS(oZkmoqVqiv)}3o$0#!SU zpbM^m;`?Vo>G>7#v*25x*7upa9p?$~tKjFrx4~oJ1&j;TIWK|Y|20tS{x^^=P79?8 zJ0M%b`4T9;z6q{?e+~XAcz{7Kg8vD^qVq+Rr1k$XsC{`A%n5G?WyedP`g!0};EUkH z;J<*H{{X_$ygl$X@Fh@seianI{|z1m_hMw?`&m%yeF6MQ@QwWWNtl2ICk1Z-e;btk zzYXpHuY;)Me=8`zaT?S<{Tc8oP#>-LocU(Q+`#w8^WP8Vco7soh}+2j>HN9iNAmAl z*RwRub3F}L;#^B(s>VlpzK!;NT8H)+?Md2MntTsSH$J!rYAv!ieLh9|2<-xm?PcV; z2Fm`5kM@N8!Fy>RqsfN!kGO;QXBFH< z!#s>X)Z^>)A0M-i?AP-D&+_flG}(4QyPBqbrB6&7nr~LO@8SE$Y0}f}`E%*G_jSeTb${oAyB(W@q9R%)wDYu+G})x=O`nwZ5KVU9rRmeB$^J()?N7|r*t;{cJDG9A#Es(A_1sHdKkT}l zHE-l~Qh(&G#{GW09!3H0W)9C(Zv>s_SZj}yPao|$3E)#RSm=+~ExJZ6r}I7f%We%SHSFpk_aLqW3W9P^@? z)a}MdWaO>8Bj4+~tUg!?;}rxKMSg!p4_EqOc*=qGzxr-VdS1)ex$W<&y{){s&yFotNzH3I%1|ZcPG}?jhR}@ z<0pGZ9p^I_afn9e!OxGBi_=B($_v2{E9mGlM_QRgv-*7kL%*_%AVwK(i z`iU3SHLTHEoWvD%W#C9PNfCvy<0uW&4Y%d`Nyi()VM)PD+&%nSa*i3*Br=WFQ9P)m z2S-*fqFCQuNj4nDBNoZntZx@0)5E}gcXvN?+Z)meql`_hhJD}NxjWfe>mCpNs4xoc zPEBm4$ftS-T^D5%567L%Y*=J~tg^_zJoMT4T_otO$^mG9_!l#;pSVdFu-3{UAlMY^ zZfCHs4ZnnHYLAQoZaG63C81G&Cmt9su&?1L?)XU}h44BZWgTt1ZIK!0XPbi>K5Hw1 z6zrC6t|fIC)A542?aXF8o$*Ae7nto-OfDsEN#WTH+qNpfqKzG}C$W$=JGCc^JG?c4 z^)=a3wT4P}S5}nSYB{UeK^pe^mW7tJzIAqm*4Fo6vRIOM#MZZv=&W0qo7sH6JVD2Z zr@6FZgEE8Uc6fKP|42o5Aj#Mh$hw45KkiCRK8l6w@Q^w;9nUtY^=(pd zjvK}xD+e^QXK4n1;^W-x$!wm7cnNRhFIrFJ?zx!7>5{vrum1x5=MCdz$vJLm{6F%U z$44V1-pzC*=59<5)VL!14sWVs)7{;zKg_pTHyq)d;t_H|zO@eWmm+CgX7%oJh^f{e zGiTv=+df`)5MT0{C|JoNX6^0W$3e?3v2#CSzREIns&oADt;vDAcXzVSsr56qTVrC? zSj?tmVH?+3>yJmSQM0dyA?J@yUOCAuGT{hoGN#^PPj?HKInIrL+3(0TH#_M-*x|%&& z(lsJoAB8fIMR&EUx7!qc{uJ+zHBrdB*O??8J=8qb%uvyBm23>!F#*0@ zjt#9RdfE-|5-AQ936Bu7`La5;ttOaIKvY?#e24W*0e1tv+sxKvlC^=@lX)`M-5lll zA?7^Fj;yXHCpL@!wTLp7ccye3dv6aM#iX1-7c&#Vb6>Dm5)=0tSwPA5TqF86_rBsm z;Ue_V2)1~!EpqnaguFTG0vn`WGTt9gQ5+8?L37DcUq8AOj^aqsWMj&8{F07>(t(?| zC;bhpqdW*eqBh>g`T59lZ6*Ym?A~Kay%Mv*D9(oVm)+cJ z1Q{k8BfMbZj=cnOROyy78jgG-^SLQJltkYxGP+t>Mhvf(Y@Q_04e-zuCd|1#+1+#D zu4Rc0y>K*ZmpyA^FBA7qA(lnuZOPserM#v{%Uh)Jg_SHTYRw*nkgoK;shKIg?Jd#9 znszbHWBzJNEHUB+W%q}!vc{{SX5(+#*(%py=TvC#HlixAUD?MlRs%t#+I`)e5<`7D{f@s#Fbtl)c$uu)@d zQX^btxir=;VN2!tQooEB`=#1q+TyigHhHu)!}$$Jfv-;%ikM^iZFPN(6EX-d$$G2_ zO5SCtFqdD=*K8e#*Z{AICcZ}@E=0Z3#i0U1KE z64d2pHO^4BF~`oFyLVZaEsfJVQQ615C7Jqd)SY>zW;I(3t*%{rO*p&By^D#M`~2f4 z?D|UAoG%n3v#z$bJCf!Q997^`kL*Cl_t%upji|&E> zh56R}!PbF$+=Ye3yAHMH@0y>dW9xDMQYeaLzxlgc3kO>B3+}?biw74zF@K1DkCAq1 zEt8{7a0~Hh(LFvQsKt%>&wB3R%LLiUgV}H}=XbNY;o1@UM?r>+TFbsSSag@Y!0X54 zRl0sV^rBYUf3WRE>)u>_%&8Nnj#tZDn48~mjKm3HR%>}<$O_~u_T!d9QWbLTBth>t zkwVo^3~~mxjw|bnMJ&39+F`oGF`Ix&0uHGglHrMhfLmQe;6M=8QxX!JP)fs93_ua0 z_G&2~6>?Y&JkK+kg@G5evcWJ+JdGGa(ChPGaU#afqnpm8Zib)Ql!Ktg3Uk{6#nGZ? z$$2^dyEV6%5%&pln7$Ij>k=M~^tDp@d>NM=?5UJt%NL?@l$u7*OE$>6y#r5{J@Et*o#PO?6MaUW~m3?nG^4YL7$C z<7GvI(d8sXb)&S02s6wp91x$P8|Ns`t4n&FSe=NqeXT2t(ySK`JW3t#jx(ezx8ZU- z@~ED`$wsVYRK<$gM$x8OGiJ|e=XEzUwz*GCYEdSse6%qQ#@OP=Sr4Pc z54!{6Rmrf5=E~{^XIK^mF=Lt=oInPz=yi*2m|IaR_1dA>FDfB!Cfj#qT`+EKoK^QI z7nUSMBn%fab{+&vr$?6)?=E?o6BNpVN7o&i6F&XK6N+lnQN*XkyV)( zHMJ94IzappkwYw?!L!L9?+N zyIE>oC|j1RdEzH=MR5v^<|H+Wg+py{{(mQx-&cNUrUJ}>{g0G&Phmj?!MTdJ=9;D~ zy0*-m3eqzEx9~LuRR+ttD%w-1HK!}gBHy|6mn2KB`94<8*}lcC;lZI7$&D9^FI{GN z-FXMRB1MI-I{Hcmi1Sh~luOu)bgIhGQ+CrC#h7WUL3mVoL;EV%oPrG~53_Y9 zaGrp5(x}$|6cg}TGMc3yIeXnX*omyLpY<~1dutu7fRVPbr>)85?qNbFb53Io2r75y zGkZuA@K+k1M9QB#z(^h;NVj<>Z{td}B@)8#Jj?bm?%!E(tN_8kDKg_X& zTqq5A2s&{qKMaibwy(84!f1ntp5pzjY68E)lZv@Y18sBlHN?W z;y|)e?i;O-cWZ|MRdU8xRVOp{32!~L=K^;Jjvsw5vz2zknd{X<#rVQ8O<|>+qbNXC zGiYW;5`3*~wu%NPc{h`dH!e`eb(RpI8%p*Zfu@Ir+52B@c9tQ!lep(q1Xu=rrXg(w+w8)hZ+K zx~fL}xz4C?f0uz zUZ0}A^i8KIxwBQUYEG-@Jp4zfWep5}(dEj4KgFdHZH@Swo$AD!9!ksAhl94ajtVzi zTL@F}tGupBZ8_~h@@<;XJMBMVu*D=^&lq-dt~`a( zsE&;@SnyT!Eh=QDUvAdz^1|1&p-KZ~N5qSGHmQ`==5CGryjDi{qFlzQu4)-ino_c> zuGz>C71@4FtiyP6k4e$i(UxXY)zS>(hMqN@d;?5Usc(tAux7?KPEReq5KQgjylh+y zmu48;>MklX(>X1U&E0a75tH4<(-O_%8|3VXRx7^Q6Q_2n7YR$}1SZela>^;z19lW) zoTgdz#OShmHEpgM#k@F2ud(3kR7=3;{AssXG{Pxh;OcX3ZEh_;P{*Vq8 zqvB4wEfH9PWzvADOirbc`X)5;IJvHmt$WrKx$TbQ8sB7~T>*;C^28v9LT-|k81|e~ z7zw#M?TJFGkyiw-5~4i>7^OTM_c2pRJjn@9e_j_`FfKy?@?nn}U!u(sg}SCx4(%iX zTxhO~<<^n%n^!PZ7mNEUg9{HroL6Kctj+VTc9RhuXM6Nja5VKs7EtmbK8N0*P2Pxw z=JV#^!^E|o*T!gTe{-t5Se^qOPl{P3)V6#%DRP~%yzMQ+Fq>x`Y$?qYBWseY|Lv^F zmZGtM6HGcs+vX@K^>$_9=4!=|`hF@;Q!S(T8x7V|_(5BwJW4mNCs+)xX}7)!0!H~G6K z9i=wvgLh+Mr;B8-?QT}n_PAGZ2~j>yK3Jjc!es zrL4urGc%hIX%fyIkt9-c>5bpfWI2X7jX@1Iisrp2kW7x+;uH zZiM!=!f0urCBJ%~TMP!xMI2@0flQ?l(`^(U8r4y=$;+#IGpcUJrdyCNi=|bTp^Bup zqG{t@yC0_UJyt=r9eZT7jEgUq$IT7_Y;mV9ynZpVs;fR_NsVoZ>Ms*?lr`(Cu0116 yd9`vHbIw_ug|U}KYaI|a!LaegrN;7-QeHGDi>%VI^?6ddf~HMI*!x(s&icQ@m=Ur7 literal 0 HcmV?d00001 diff --git a/po/tl.po b/po/tl.po new file mode 100644 index 0000000..3c367d2 --- /dev/null +++ b/po/tl.po @@ -0,0 +1,2178 @@ +# Tagalog translation of glib. +# Copyright (C) 2005 +# This file is distributed under the same license as the glib package. +# Eric Pareja , 2005. +# +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-12-01 17:31+0800\n" +"Last-Translator: Eric Pareja \n" +"Language-Team: Tagalog \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Kakaibang karakter '%s', inasahan na '=' matapos ng pangalang attribute '%s' " +"ng elementong '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Walang mahanap na talaksang susi sa mga dir ng datos" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Sawi ang pagbasa ng symbolic link '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pagsalin mula sa character set '%s' patungong '%s' ay hindi suportado" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Hindi mabuksan ang converter mula '%s' tungong '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Hindi tanggap na byte sequence sa conversion input" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error habang nagco-convert: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Hindi kumpletong karakter sequence sa dulo ng input" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Hindi maka-balik '%s' sa codeset '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Ang URI '%s' ay hindi absolute URI na gamit ang paraang \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Ang lokal na talaksang URI '%s' ay hindi maaaring maglaman ng '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Ang URI '%s' ay hindi tanggap" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ang hostname ng URI '%s' ay hindi tanggap" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Ang URI '%s' ay may hindi tanggap na escaped karakter" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ang pathname '%s' ay hindi absolute path" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Hindi tanggap na hostname" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Hindi makapag-tabi ng %lu byte upang basahin ang talaksang \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Sawi ang pagbabasa ng talaksang '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Sawi ang pagbukas ng talaksang '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Sawi ang pagkuha ng mga attribute ng talaksang '%s': sawi ang fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Sawi ang pagbukas ng talaksang '%s': sawi ang fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Bigo ang papalit ng pangalan ng talaksang '%s' sa '%s': bigo ang g_rename(): " +"%s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Bigo ang pagbukas ng talaksang '%s' para sa pagsusulat: bigo ang fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Bigo sa pagsusulat ng talaksang '%s': bigo ang fwrite(): %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Bigo sa pagsusulat ng talaksang '%s': bigo ang fwrite(): %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Bigo sa pagsusulat ng talaksang '%s': bigo ang fwrite(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Bigo ang pagsara ng talaksang '%s': bigo ang fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Hindi matanggal ang talaksang '%s': bigo ang g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Hindi tanggap ang template '%s', wala dapat na '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Hindi XXXXXX ang dulo ng template '%s'" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Sawi ang pagbasa ng symbolic link '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Hindi mabuksan ang converter mula '%s' patungong '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Hindi mabasa ng hilaw ang g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "May natirang hindi na-convert na datos sa read buffer" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Nagwakas sa partial karakter ang channel" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Hindi makapagbasa ng hilaw sa g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Bigo ang pagbukas ng talaksang '%s': bigo ang open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" +"Bigo ang pagreserba ng memory para sa talaksang '%s': bigo ang mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Error sa linya %d char %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Hindi tanggap na tekstong encoded ng UTF-8" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error sa linya %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Sawi sa pag-parse ng '%-.*s', na dapat ay numero sa loob ng reference sa " +"karakter (halimbawa ay ê) - maaaring ang numero ay sobra ang laki" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Ang reference sa karakter ay hindi nagtapos sa puntukoma; malamang ay " +"gumamit kayo ng ampersand na karakter na hindi sinadyang mag-umpisa ng " +"entity - itaglay ang ampersand bilang &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"Reference sa karakter '%-.*s' ay hindi nag-encode ng tanggap na karakter" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Walang laman na entity '&' ay nakita; tanggap na mga entity ay: & " " +"< > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Pangalan ng entity '%s' ay hindi kilala" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Hindi nagtapos ang entity sa puntukoma; malamang ay gumamit kayo ng " +"ampersand karakter na hindi sinasadyang mag-umpisa ng entity - itaglay ang " +"ampersand ng &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Kailangang mag-umpisa ang dokumento ng elemento (hal. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' ay hindi tanggap na karakter matapos ng '<' na karakter; hindi ito " +"maaaring mag-umpisa ng pangalang elemento" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Kakaibang karakter '%s', inasahan na '>' karakter ang pambungad ng pambukas " +"na tag ng elementong '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Kakaibang karakter '%s', inasahan na '=' matapos ng pangalang attribute '%s' " +"ng elementong '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Kakaibang karakter '%s', inasahan na '>' o '/' na karakter ang pambungad ng " +"pangbukas na tag ng elementong '%s' o attribute; maaaring gumamit kayo ng " +"hindi tanggap na karakter sa pangalang attribute" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Kakaibang karakter '%s', inasahan na pambukas na quote mark matapos ng " +"equals sign kapag nagbigay ng halaga para sa attribute '%s' ng elementong '%" +"s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Hindi tanggap na karakter ang '%s' matapos ang pangsara ng pangalang " +"elemento '%s'; ang tinatanggap na karakter ay '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Sinarhan ang elementong '%s', walang bukas na elemento." + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Sinarhan ang elementong '%s', ngunit ang kasalukuyang elementong bukas ay '%" +"s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Walang laman ang dokumento o naglalaman lamang ito ng puwang" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento matapos lamang ng pangbukas na " +"angle bracket '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento na may mga bukas na elemento - '%" +"s' ay ang huling elementong binuksan" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento, inasahan na makita ang angle " +"bracket na pang-sara ng tag <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng elemento" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng attribute" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pagbukas na tag ng " +"elemento." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento matapos ang equal sign na sumunod " +"sa pangalan ng attribute; walang halaga ang attribute" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento habang nasa loob ng halagang " +"attribute" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Nagwakas ang dokumento ng hindi inaasahan sa loob ng tag ng pagsara para sa " +"elementong '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Nagwakas ang dokumento ng hindi inaasahan sa loob ng komento o utos ng " +"pagproseso" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Nagwakas sa partial karakter ang channel" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Hindi tanggap na byte sequence sa conversion input" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Hindi tapos na reference sa karakter" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Hindi tapos na reference sa karakter" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Hindi tapos na reference sa karakter" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Error sa linya %d char %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Hindi tapos na reference sa entity" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Ang binanggit na teksto ay hindi nag-umpisa sa quotation mark" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Walang kapares na quotation mark sa command line o ibang shell na teksto." + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Nagwakas ang teksto matapos ng karakter na '\\'. (Ang teksto ay '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Nagwakas ang teksto bago nakahanap ng kapares na quote para sa %c. (Ang " +"teksto ay '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Ang teksto ay walang laman (o naglaman lamang ng puwang)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Sawi sa pagbasa ng datos mula sa prosesong anak" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Sawi sa paglikha ng pipe para makausap ang prosesong anak (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Sawi sa pagbasa mula sa child pipe (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Sawi sa paglipat sa directory '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Sawi sa pagtakbo ng prosesong anak (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Imbalidong string sa argument vector sa %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Imbalidong string sa kapaligiran: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Imbalidong working directory: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Bigo sa pagtakbo ng programang katulong (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Hindi inaasahang error sa g_io_channel_win32_poll() sa pagbasa ng datos mula " +"sa prosesong anak" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Sawi sa pagbasa ng datos mula sa prosesong anak (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Hindi inaasahang error sa select() habang nagbabasa ng datos mula sa " +"prosesong anak (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Hindi inaasahang error sa waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Sawi sa pag-fork (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Sawi sa pagtakbo ng prosesong anak \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Sawi sa pag-redirect ng output o input ng prosesong anak (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Sawi sa pag-fork ng prosesong anak (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Hindi kilalang error sa pagpatakbo ng prosesong anak \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Sawi sa pagbasa ng akmang datos mula sa child pid pipe (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Character wala sa sakop ng UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Hindi tanggap na sequence sa conversion input" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Character wala sa sakop ng UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Pag-gamit:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Option ng Tulong:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Ipakita ang option ng tulong" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Ipakita ang option ng tulong" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Option ng Aplikasyon:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Hindi mai-parse ang halagang integer '%s' para sa %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Halagang integer '%s' para sa %s ay wala sa sakop" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Hindi mai-parse ang halagang integer '%s' para sa %s" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Halagang integer '%s' para sa %s ay wala sa sakop" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Error habang nagco-convert: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Kulang na argumento para sa %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Hindi kilalang option %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Walang mahanap na talaksang susi sa mga dir ng datos" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Hindi karaniwang talaksan" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Walang laman ang talaksan" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ang talaksang susi ay naglalaman ng linyang '%s' na hindi pares na susi-" +"halaga, grupo, o komento" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Ang talaksang susi ay hindi naguumpisa sa isang grupo" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ang talaksang susi ay naglalaman ng hindi suportadong encoding '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ang talaksang susi ay walang grupong '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ang talaksang susi ay walang susing '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Ang talaksang susi ay naglalaman ng susing '%s' na may halagang '%s' na " +"hindi UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Ang talaksang susi ay naglalaman ng susing '%s' na may halagang hindi mabasa." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ang talaksang susi ay naglalaman ng susing '%s' na may halagang hindi mabasa." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ang talaksang susi ay naglalaman ng susing '%s' sa grupong '%s' na may " +"halaga na hindi mabasa." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ang talaksang susi ay walang susing '%s' sa grupong '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Ang talaksang susi ay may escape karakter sa dulo ng linya" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ang talaksang susi ay may hindi tanggap na escape sequence '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Ang halagang '%s' ay hindi mabasa bilang numero." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Halagang integer '%s' ay wala sa sakop" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Ang halagang '%s' ay hindi mabasa bilang numero." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ang halagang '%s' ay hindi mabasa bilang boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Hindi tanggap na byte sequence sa conversion input" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Hindi kilalang option %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Hindi tanggap na hostname" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sawi ang pagbasa ng symbolic link '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng attribute" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Error sa linya %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Hindi karaniwang talaksan" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Imbalidong pangalan ng programa: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang waitpid(): %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Error sa linya %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Error habang nagco-convert: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Hindi tanggap na hostname" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Hindi tanggap na sequence sa conversion input" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPTION...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Hindi tanggap ang karakter '%s' sa umpisa ng pangalan ng entity; ang & " +#~ "karakter ang nag-uumpisa ng entity; kung ang ampersand ay hindi dapat " +#~ "maging entity, itaglay ito bilang &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Hindi tanggap ang karakter '%s' sa loob ng pangalan ng entity" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "" +#~ "Walang laman na reference sa karakter; dapat may kasamang numero tulad ng " +#~ "dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Hindi tapos na reference sa entity" + +#~ msgid "Unfinished character reference" +#~ msgstr "Hindi tapos na reference sa karakter" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Hindi tanggap na tekstong encoded ng UTF-8" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Hindi tanggap na tekstong encoded ng UTF-8" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Ang hostname ng URI '%s' ay hindi tanggap" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Ang hostname ng URI '%s' ay hindi tanggap" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Error habang nagco-convert: %s" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang fork(): %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang chmod(): %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "" +#~ "Hindi mapalitan ang modo ng talaksan: Hininto ang anak ng hudyat: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "" +#~ "Hindi mapalitan ang modo ng talaksan: Hininto ng hindi pangkaraniwan ang " +#~ "anay" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Paglipat mula karakter set `%s' tungong `%s' ay hindi suportado" diff --git a/po/tr.gmo b/po/tr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..b6c6c87c646c8f9204bfa7904a5f49c46a2b7ba1 GIT binary patch literal 41560 zcmd6wd7PbfeeWM_1qEc0McE&gFbQOaNx~8mwuFQblaP=JnTP?q*6O{tRcn=2t+&jj? z&Wk6X^E}UQ{rhUN#o))l82l!9D)_8(qlll;>7eRa1HKTv4O|X3!OOr8fHW!k zCU_C}>_t&@A$TdM`X;~?;N76=`v|xU{02A(9!n#Y{z_2w)j+lHZD0&O460wB0oAS_ zfokv315vaTycDFUs0i{Zx(}qw(W9X9JqfCPKL=wlCi5C_4fsCrRiN5=Hi<>Y%fQv( zt>6%NKX^WPDBS-5)KH$mLp{Hge^l=%SO8xSUJHH~6g`&HY0+x}Tm`-dRQ+E8uLfU8 zCsf}p;LYGW0)7t^oz_7l(Ps~+etrPF3j7>+F?bY>+z74(-wM7FjKMR=BsyLNo&oLv z#g9!;{e26lemorRKMB5o`>%n@_m80R{Q^|JGlrf1tHHClzZn$0Ws0bd*NK~U}c<8c2qQ0bonHNHneROK52RsV}Y zy)T1m-zz}X|C^x7`8XJZUjoI?KLXW`qhL#M`9|hH}?}O^c@k|2Mvli6-GV_3r{DU)~V#v4CF()sDj$9OWMdj|I1ZqGthA zd)wjp8^IH}e=qnV@FU^=v!KTHo1pmMISiW0y95*+ZvxfNSAwU44}qtHp9Eq3=o_H= zdF<89Y49rWI`AE!20Rn|4^aI*9p#|*Yy#EqX;5@| zH+VMq7^rdm8mMtQ@*3xh^`PF5f-eML1FHP@f@fTG7^U<`gWy#EQPa*lnm_iqqX|E~s>{xZUa`sh zvkw%VKLD!#e+4o{q91}WI0(@O!0SQve-F3>d$oZ34w_ zZve&Le*nG!{1Pbs{5Gg|Yfx0r*`WC4#h~)t4K4Uf&XMIrr;9rP~LpzW0F|m&ZZ1`|F_k_3W28-<}B` z!~F(u1$Z;~BJd5M-G59V}elaepb=-#dh#`p6>xw?|tAZ@PnY_)VD$L>ro}<8h9zV5`2BYPl4xf|9?TH zKNF&R-vqA&9|9i({~pwMKQQ6r`3Q(ejlKk`-DgZXUvCGM{~l0ud=wPjJ`HLf z`~=(so>j)S03QIa2LAz6edpf}Z-ZqJ(HngjWC}$80bU2*H0AdPK$;Z&6jc4YD^9Ps zgS!7yQ1tj2sD58ubvo3*4{`rVQ2aVob9w&;Q1o~ocnbI_P<;ROfd3afjr)`9E~hR5 zMgI+;=yw~aad;KD7<>>sAN(wMHuz&u^_@KJy`g3A9SsQx?!Y8;MhxZGV0N$FzK&Zvj_uzaP~5-vvdV zFM=xPDNyuW()Mw?0lb|1`#`n-)1b=#4!8zfa2Rvg5tZw_G2@G zYe1F%X;AI?F?bPp{+-_6-JsfkKd5wn464812X`sm%e_6X1DA9ES#TNnb5Q*nzRTxj z9aQ=Eg6DyM2p$1`3p^G4K6o>n0q|n*k3hBSDew&Nv|n+0 zuLjkQyFk(N5m0pddcY&^@#mL;8jo@C1n@233&GzC_(!1X{|a~t_}zeqy~6d(S)llD z6*vr*K=H{t!OOwl5BEO?MgNmu>GNp~cm?+bQ0+PZ-T;0c+yI{WD(}Yx_+suq2)+dT z7f^KA`f9J|Zcuc5KdAaX1BxEcVNgY%AyEA(f@gy-2QLK=fU5s%py+<$Yd!rk@I~BD zfEuTJz{|kLK$ZVb;A-%Kd%fNXQ0;#+sB#a2r-Af_Z?8>oc&hs_XhAJ?yI2q`_&0vrba z8Pt3_>up}{4)6l*UkeU`9|6^_Z-S?TzW|qkr@!6rw}RWbuY%Wtp9Dq6!{6a_IUiJg zBcS?qH+UuZTi{vXw?Vb@u=~B9)4^l7zZ|>~+zcKMJ_w4R9|w;B{}L2^zYbmkp7c(~ zEuiTAYEbDv8t^Z`=X3vE@Hp__z>B~m-{s?RH8{ro2&jI34AlJi3b+*X?FZGbcZ2Hp2f?Gk&w?7azXmS>e*uc_m%PX4 zTM<+_uK-ofd%=^zgP{21tKt36!uykc&FjAyR6o{$8n4~pN#I*S)%V{($;Z!wn%6%8 zRo)4|?)g@Nr*eN2sQxuTrN0*x-#iM6Pre1N0FQpJ^VwQZ^xp+u2)+^2JUj@h|K9>t z&yT=W;7RXu{G=0Mt_0P-U7+ay8t`K90I2%E z0E5U7C zw{!gy_osm4p#Hwi^&4C(c{UB+2!03rOD_Grn(HR}<^P-r{0rC1!?Qi$?{dZD)89zI zfq*~s$I;aR1=n*O8Q%Yx-}mtQ&%re3_nTbD@T_Wg_+Ma)d(A1Pdi1B^`8UBD z&zErx@_QfG?{U45d;J|2@U?y$eIMM#v-89Kb>Q{f9|-q?7lb@*u*LoM@b3BC|4sP) z-hlUmzu?-!yZ;fMeGNRFYmDnGJ>%VKKyq>gzpvv;{$3M)KQH%8?_SUK`&~3&{U3h6nBPAI&)^yi&rbwj#C0pztHQGzc`tdl zgG+xebuiiYj_`Xg_}uVY@UoD15%?=ymvHUmx|HkLT>85PT*CEfzct(QSNXj)yuSnd z=kQK&eD3#(-0w3&`mgZpU0kmW_eX(m=YDNS`&#ZF3cnA5Rqj`D9n1Ci+}{c6Zzb2) z?H9T(UF>>4Z{hl$Zo=Ok;2N&A*SOBKU(9>35X!teJo_c^x5Mv^;H_LIk!B~j zI;1_0-=kdDa=(V_-tc^gXJ_*JCE@;U+<$>9`TH$?oEvUt!B=qIMB1g{ncy2-w{yK! zH{tJJ!J9*wNAUZX!f(Akoa<9u|C?(a*8^Podq3A3xPHdG*BI9eN%QYq$=})G$6nsOnoED@1)Smc%k?{6T(0dY zRLaG;R2!=o%e9Fm(W0ScIj;uu4{T8qpkC!W@*35KCzYPZ#H3#ByGp^NJaUu4S z#wH7m!dR=+h{x-dN_{Vd@^0YrfjE7$Ixe^3YGKCmjg}_LwYX4=OO;Z!RBOexLbVhv zwB*)gDJ!>0H5U%7jxF>5$MP%nW~rljR>SI8l^4{`M@^Y)6?}vi#qEyx=i<)GtE}18m%c7c^LBWcuaIEMr)?0E9J35t4#8( z(}L!zXibxJWq&wEL+q{CrlWM2WySJnO{>)?kG5MSZ+Lw?rM(TTa*fy9HEK!|!g}pe zN~Bu7HhBGwn>R;m3u9C5Y2({Ct#!Nr8yBN%3blb&JXW8ciHqe%X{=Rm%*6FQ@NIgV zPc!$M=5&dkRjigIhk96w+f7Q_vT@6Ls;P~aC)y3~Hxr}Cn?=o4Tz#?>auj@KIg6#{ zRI46(oR(dzGXooiy|FkTW}GK>m+QNkj9==LKwrn9yuY5>FQz z$jD;7tPmu5SrN^sT7D+%fr0)@G^7M5xqjtK(`NNna^Xi4SJ# zZ3z+P6XyZHP6l^w^#f!Cc@_OLp??a~_2%kmy_fM{NcM*o znH7;JwIHphYW2M}nvBrGWM%X+>wbNs!F^$Dtb}Qg^k7_r1~H-PuSc;3gEk7jMDC>q zPA?_n`#g4kqR$ICD*4Bu;@ZTjIPz+fw&)Q?M|g-rv6jk)F@Zik)9-a^DCJ%j+cJpN z$DrT$GhBPnQ>}b-MqVu)Kc9^le?=)-^pI+ z8v2fRUBir7Tq+wOiiK7o*NE&z6-8E<$n#PIv#}rX(&so}ao~q8s&^#mX=f-F3yb0J z?FMrx>3>H{!*iTwJm~^{W>3M*dc_*-vdZQdmRRm#M|tAL(%_s4kWt22i0ZD2nnA{Q z(K315OG)fG}meXU$;k`z33>n789UEGwUtP*J&Pa*_Cm^9IBXdjcbPqFpI8q_|~}%Q#(xn!zcG?BVU>11X9Mj>XRyz^2(dSNlTCMd z771yL<}h30DiHayiCIG0P3&&hG`5SE;F>aqJQ6Vy6Q__y3S`cQsDbH6m)G=>t5}wQvjBZVJmtfC2+uYR>$>UV=G!-z)k#Jmd zb}oun3n5*fk8vQ(?LCnkGK#y+=M(#0p1Cj>2Qo@ge`nI;|U zt`W0R|aABx#&OCkWZ<-CVqe#whP6 z8g8+(q+Wb{h0ijk6XSNsnep*TyE!>mp}onQGqtgWr?&iE$tB}V^x$6PSVoUaneQ=) zvj_2*!tPYS?;b~wuI)-mF-bVoy+cpIV{=3OPL#uYOkXA`WhUIvMGX8*5oo3D?TI59P!dl54lgW4i9=`SnAs_f_b=uWjtGZQ9zy=+@V!m zbfrhwanwz}LmcbIpmp4nsY_{|ROs50V7yp?JatI=D2Y2PnKSi*6Sj$Qu2{Z+5|!|h zi~1z=h7n}5FfRSd+&Z6r+d$+<%YOV zYV;AyEFKE=l+otWc+1v_iTn8C8B)|t9tty)VYEHYI#RS5SBI#r#nrkr)|NsAW0%E6 zmr22{ktZWqvsk+DJl)HhS*&teKjJA}0nIRPta$67$TeMI*T59c;1!}8IUE2+!>+8OFuB|4%Ok-5BXm8&= z4$6@WwaK~19Tu&z!eXYUEk;X{*fs_UkM1lso|3xG!};u;`zlOAP+zVgY)LTdIQ40G zZ45~)AMb==$tBKqW~d3%jq)CI`zi$9B}hg^6#(bqWZOuz zwU}R{RBLi85NrjyVjx*z=~<io?rEINtj4bcJ1++gBtLS@PZ%(-gTMOp4Na#zKpO zU;`JeNZfujeMJC(~BYKA+77>}iM@mZ-GmfWfal zKmC^z_fEo2C{^*k3t{m^X1a+s-Cc^dCWf}n=u{Htp4&PM3!!W)z%bbA9uB&`zcFhr zK(y_e?dws;tfvtNWrljt3oh5xlfjB+S*b_@wcFxKsCa=H)6`o>Hr_(vY_=--))+8-i(LN24r-`<8Z#ZC*2ir0;JIvLKZqV=qds_NRHok9r z3+hATM>BCIG=|Z3i+S6`_nA6gC$f_^>zbs6_}*Y`%dl&HOEl4 zF|%6>EYXOknA!-Kx*26b2@rg^>w~d!E~{Fl9$sNm0~O)wFHtN-E-PX|%KB=9o5f zSzbLb637E=)J&55Y6ap=l_uVsnOyTULK|CrM_|^qWJ7AXHdbldevE;07*I-?F0>{y zn}hyzw_6FK9Z66PB56;K%kgQ+D`ZPus(ptR9=c}ij$|{H6&iM{GUq)C6=r@%qI9lPyYFm2U@sPE=G)B_q4q+odmYQ z6Ukzd$E?$yceXI2Sq!n}Ng*vMQIjoOWF^@)M+~zNEw*hlza8HIh(IvJSX41@zIIAX?RsnSa z+P0uu(t>0c!Ms`OM|hD0d%DdE37NzWGZ}Vcy8S6G6&jl1wc=oXd@%50{g8Qz;c{Ln?m($;T^o%sO{{7n&zYeKVY*5zOIv#hD%kGQQj;8wMtfS$Lw)piP27z8C7)gYH}6{o`z+aR`8~U{ zg`Bx^NyaA=2k)$0n6q|s%;$MqpN>ML8%s%~^VP9vvb3*Iju))T1uhuJ_LMIL%jD;Y(c;EW*f{h~`SI71BvWd%bNk ztWQovnQas@A8s0RFA5}+2pKKQ42|!+3pHC{`zU+K8{xgJh)Pos^FzJ%q^gg#;L9MS zng|c9(DNvD7g&k-{CP#oy6%?dE)G~EoF^*I|6rHzp9 zqZ41|v}Kb7nK45~cGnOcHT{M^zX^7!&T*B8QtcGRFp8K=&J`ZH>Bg^x($g;7xu4kIi&M zVvpEf(gDxGEzOB?ad2&WqB*#OrQjpBZQU_=jU)$ibZ{L4WL3O;c-ipa@QT6Zm&D7K zt-5IC;P6Gm!z3Ksj*!q?PSXuvHaNU;aQVgY@bIb?%P$ySLAuSHTNvDdbZ8P7lS8?d zKvpxphV_dnjt}VO>K3tMIyqJv5-$$58ds97HqmB-@8AyJt%`TFSq&!4ars28UM&r_ zxV_qb4%HhIS017BmRbLn4GkZ0jSKBT#UNH$nCn6!b7i*iYlgBkb49x~KDaVVrxqgN z2G@r}(W~N>qvh5S+bSI3tPEa@-XnSt*QV{hdBrjU{Py#T;nhcQrh1|@`>^P{Kc1== zD}`!d-b2;JdUK`_w`LDEW)DV0Si&!9#wiZ4O(C}>_s~)GTBCsN!T`H-Q$OkIrM0xgVJf9imE8%j82uOf9)4YH7Q% zOz`uPv(_EWg&B3UOQZ+~uIGBKQ`a%Oe{|}afhZQj!Ryfi60tCa-%ZO|RHbi$K&@&C zGppQ)3bPMaNgmfL#P;aL5(TINDP|w0!RpG4^fMIVs3lF`Q)omZ^%<5qwDFZO_4C#Q za5V^Q4dVEh4p-wgu(h~Vnxene@=U!Et=CUV@GOC((Ty`waI|7XOjlF-MtN1Vp203X zaiCSkM5B3aezqHJn%Sf?7C(t+4Cb!XkwCX`Y;^ynB3v7^~Dh3P|&@`$c9Xb}V6 zoPC_RNQf|PsYq-!o41rNq8;e3e*Nc4Vr&Yt2b)a)j8grY5Ou`D5YHWlx8t%HPfq7l zo8E*b1+w+#^b_1&neu~@F<2OKAApf^mA%hFywP_EnoZB9$+9XPDT@tjoNd*hC3_OO zaxKE9m^VY%kdS3#bJ3hxu4SHD=y_qucVy?d7nGqdceY?+`rpZ%$Of@h2g5QpB6S~r zHddYC6Alu-1(b%dV^+Y@z|AIWU6NEwd)UbxZJK?Ysio;sM%2t%Ky>JlX}JVA(I#mT zOsPib762QV!o}IgYqJNRIFQNOso8^UoODUQ)P-E4pW^V2oj*xF*JA8qw4o0o#dwpR z*m*w*XUU2nTnaOY0mKxuFza?CQRLi-@U1orGfcAuW$ZmUF8wL#Du>xywF!YziKmc0 zi08c4Vfv8R#Do}kQ&7WNndaDd?EKy^&0vg==r9f_7CO_e3{7892D7IzJm_J18n2(y zD~D<46ESUDE_&xV4V>5tq>(ZzO<~NS&dy7@fkv1dmHw9K9^@Tm6P?4KDu<(xbtqJr3MmVyclMO< zc0ZrxID{=yW2_m>J#2G?D@AC3j@WYEwvk4EYsxeNAEB6fxGptVdfsIG2=jKcxt%&M z%!DH>iFTqpE<5SF>2PCAsaWYc*+qkcW*v2M`WT`cf!8_fU#8Uhr)ygDOKh42dGD1n z7-%qdJRf?r8l}Ez8}opnQh$quNjB0K_E#)eTVtYTR7wt|CtdQB=+d9`Z4^b_2&@pT zEmaWXRF)`kbyBHvrXXenA2onM((zUOZj6q)eZug$+4jT%4xaIC6Iw|Y8Hj1g$*i5J zPlamDII1`BmG_h|yi8YAshMa%L9AhvD3)f}*hZ_(5SpW+T!Fb7O;(0No=E{RnU$B% zA0%yfhS>+*Fk~)Z-IW(u$dLCUh}OjVq75?ju-oHjR$QQoF(kW!q>U6NXV#VWBXkva zOXjP_Q+jY=quQU?$?zuhrsoSBHS4Jvzmu@2w{+_1b0c!#!DPbK++39{&n5|H>-l+x zEootR;8m7Qoz9Y)-L#VBPa0C#iTJ<^#d1=O$xdUMocp7K7Gp=&clIR*v_dTlTd+&oPkiP*dk9H;L|aMDOR$c zIMBA;W@3yfr=AmUzO0iBZ%`KISbAoSeYp~?Ri~JLi59Wr@)KrDSBkR-SL5VKkmIi= zL*Dny{2keudF=S4usL;_^um7um3C85o#tyN`dcb5@!p8*hO_jE>z31kQw6MRv(3s4 zu|C_r{iyRAeTWP8FooIqYMr|`5)OZJT5pyg}bo6<9qkPY~UV6K-;(}Vv9^e^8 z?$ViaC5t6->2M1>)49Ps_v>J0Nn*dl%+yt9 zm8nY{%$Pp?A1T?9ds#Y%4#-Jj*Il0MUR$v1dq^vS>kw`_TlHHlrZpVKA4%U^FPJiJ zy;wiobZ~Rs1Wm9kaxW7%*=Dbwlc18%zB|0#$9RtbC$eLzv);Fi*!YEXrVS%g6Snrpr zXuRL=^>ySQ56%+rOPy_U;`MWry2-o&I+n-Ep`?Z6aJl&~0x+x8Nj|HG*x`7&9b9HP z2=8GOV}#9-$eWy~)j~`B65RUkHrqfTaB=?|T~zbI2=5395CjeJOuUTGdG!>d>N!&&D`{EYWb+S{a%sRs&LbS@`w*O z?$B4LTd9nU8ES1#)My5D4%0dX#W)@xm&dUz6vKiUh{1TW#JuPbSV;5UTv+`IAUa9DQ_0g26%*i zXV%~{dS?ek^+kcg?Toh@pfXUFir}WKu7uj>dCNF&DT(TpAyf$5- z$Vz@P^=Yl|LhIzxM8&)J%E9vF(*u3-TW>qE%Mna8H^Y|CV~N+W1JWk)?88{TlLd|< ziDwWmCay4Q8*Rpg!@3NcH^CceLtn^pBm6|1H2Ra9O-TbhW3I-S5C&0NJlT$hg`xB0 zx7q?jRdbKU#fe7vGC_BB!M9(p&l5CFd6U5?p>V!@a=JH>$v50iz9#`KNh4w*L6I*xarrlx0~U zVUO_XgL#XvnIw~s*+@6N#7;{l{Sv~03KEx*zl&u3xv^imXI5L{Fj_cg6+3e5lMQn< zbW?E0e8+6>Czhsd6Lv;y&TwW`4qIAf2czcNWph1b@|A}^ zE$heL!P=a2^gC3s$EJGA@03Pk_}ddi$>boI(P3UHGRU|V^9Xgw>YZt=V!2a5$;NOO@ zRkE5zlCX0K_9MH}xK6STE60p(oEqD^PIUBqv`!JBu0?x?J6rcmRjz?XTu@zVeGrKy&$&G&7~1QtDno4vQR zhs5(G$!OT2U(CkF!lEM70}_y|Z5GKWnq_e2QZGX4?z)yDO56uUv}pH9SY(A;MnyM*Daq2Rx6-v|THsLBU1E2E zvT&sJ5TY)XaZ;SO5@V94HTsm}nF!`|H&82KR-la7`C8(_CNEEty1f^!sl2Eetn;+2 z-cE%!4|>H6NqM|g*5@afRAwGnE6s>=D$>Zr3y^I(N6|T95Oxl9N&cReh#{=qHbSNd zxQ5*khQ(ih#yx`(=FpuN$)%H5M$!>ZnE>CmPsb588I)pm@aYo=LOVVSTZNg%N| zWu7Yr6vSg{5dgAy#lfDMQK+m_GpC=cP+L$FqxJo)Zb(biFGB*^~~mC5-h9vO8eZYF(+6Xr-!!NAS{w&S7s~pf#vMe7)|w+e%VACG3haG z%e&^-8*6H>ioLb~s)={=vr~;9wpb>eN~L|ich|Ekl-(q**aK005vHIu920j&KKH0( z2wR;y+LMLxR6T^5tVQ4z`AvA_Ot8VfJbI3%}d?UJQ7ap+N248uxmSLt+;J*Xyv#WFc7F^i0KY$32k`E*cZ zlPX`*#<0)CP1D48_WdS(Nf26`rzSK;_$R%fCL6~Pz)t3pqM~!{hd^X-YMhh_b7nok zqE@W4XBSHHm~Y62?ODvI*?Y0pJLHdley_tpun%dl^9uHz=3Iw(%s!oA^MmNMc-W;2 ztYZ32&bEhxWuE#6HTo1_5^1hH_N@$PE~!{SeW=Swv1Ca%)M&dkjQ#vjfVSf%Znv4n zNL-XF=az`Jhb3^vGCcM9YxECWVA*Vo)5JmF9LFPV-73piz>Ov%Ae2tSB;VXg=@}S> z^g6U(X6g}|HH9bRymxJ+YinzoAZ*;F(WMs7U?Nx7_=1h=kzRK)w|5pTLNL%HNnJW& zhsUHBWq1oshis&r2V--f@-__at3SQXbn17@xZz7uSEoMu7wLa4KiTCjZ6igYL z)c(DVyj|4sI<>&V_8YS#Fmuqa<^;&T32`8o5vZ zjgDdtI#1djDL$aFMQ*h3Tv-y?jeTPyk!v!+y7uQt{`Ai%x!!8Wi%qH~6N_isTjJIc zmR_-)+o+!QJn3KNg81fP7pO^VWW=NeWtu-NC4ICs`Md_yFs7C*?VARnfR?Tl$@H&a z1$DX3oMMh-H>*nPVDQ8=#tCnVnA7pVKiBG9*`I2T2 zv#Kg1JWQEvbH3^Kwo?o{kN$Mc7lea8XA!=*ficU%2&|dg-{1Lxjt(6%SLVKnQkk7> zPIlG^T9bL_H!ILZ_Wor%Qs2j=5omLO>iOeMl?z~cY1Uj|6=1BTZPE*5YRSABq zHF1IwxV)d4%J~hmnLCay^ky(7OfuLSQ|D<1A7^iLeos6CT8Bq^T9)mghy56ATP47v zY@12WT6o@ybT0CQ%zB*%K;Z8w!#v)Te2r`-LmIO;!B$IMY30u;_c95CBh zg-#13E{J=LPBRp@kKqb*V#aoMu5ngteTgC^>pl<^L#2R4@eNdc3s|K5=hMt;x?ZQ{WO> zlHVMjrBPE&xo-9d!XiVb@XeConu(&Js3V(*%S1+>aQfd)B`i4G{K;Kh+D;MndZ#-C zOcLH&s2O8;jf_ApCUV=z`q_KeU%!4+_)Z8?m<8+9J=9l1Xs_hRXo3GZXk0GxH3d<| zmAMOmZe_$bLwd@YFs-dfhjtQcqlr%1x$MIZ9pg{|e8_uFV%vKvVfBj-!4Tb5fX(|) zgj$PYs6b4maPCkVUOJEu1o-}PYo8jLqeK);EI-<2x<@;T%-MOGgKbk7LTs}PBPDXA z>$I-{A$C6h0&~I59d=8W$UZva0;}KmN9M}Lp=g%( zT^kdJ)jo-ND)DcF&d~z?SA)}?)e!b!QJ4+y+94@dwDTNfowG?uCRs9FeeZeWlTTkJ zN$Has#Mxf9U`_u1|Bx*ry7%}{aepem2-(iY71DLlD1K@v#6^{_{FiC7i zj!bPo0&QO`Y0k(-$eI-x&p%L-GOo`lmkY?Nqzv&odHJ6Lcgn6N8zeYLyPy9bOdEFd zNmhx}#!8hlulhEL6Nk@}_=M>cF5VlbuP2l=i_%4*gl5b_i|FdyL}Z&?j2SX1k-PlY|f`e%piAIK@VRZ@pMzk>T0Vn zX{T4PG5vI^$M^j!C8&idK1mV;$J6EE05Z%%XA0V#Cas4%r~fbMRAh2oa+B|q@IRoz zQ&z|*-{cPQ^YqCXe9pJiH;GclUk-2CEv?CDYtCgOkvARsGipb}F@>f%I37U=BL?3a5DCNB z_o|CPVXCCfhYo1-0_@Xl@3%8!9N&Y3rx83-E#X*PqDj*>>g&&ZuYmnY5eF^u`#(E| zK*N_mONM8fjIUI4k1t9)LL>sIH{H#gRQ!Y2aeSH5NmCNajqWHJ@35ngvsh%qHku7S&jhwNJ@s5&!T5OirWWLHc?OtZ6@ z?nCJ?*li>u1?jZ)H!N27k+3-{+{2$iuGy@Pa&OH(&*WSddI`cRFTWTKTRh6!_(`bO z3toIxCXjNgDKff}Q9=A&zK}%Qo<0%As2e@fin%J{otZ(WAqpQjaTVMlkbGH;gIM}1 zNf6WvP|tQG6^*Ggq^Qo0B5hs6MpU~+G@{HyByF!e@FD4)k35&TI+$sdl#kO%_WuC7 CqE_wz literal 0 HcmV?d00001 diff --git a/po/tr.po b/po/tr.po new file mode 100644 index 0000000..8736fcb --- /dev/null +++ b/po/tr.po @@ -0,0 +1,2087 @@ +# Turkish translation of Glib. +# Copyright (C) 2001-2003, 2005, 2007, 2008 Free Software Foundation, Inc. +# +# KEMAL YILMAZ , 2001. +# Arman Aksoy , 2003. +# Onur Can ÇAKMAK , 2004, 2006. +# Baris Cicek , 2005, 2007, 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-08-25 00:32+0300\n" +"Last-Translator: Baris Cicek \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%2$s' öğesinde beklenmeyen '%1$s' özniteliği" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%2$s' öğesinde '%1$s' özelliği bulunamadı" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Beklenmeyen etiket '%s', '%s' bekleniyordu" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' içinde beklenmeyen etiket '%1$s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Veri dizinlerinde geçerli bir yer imi dosyası bulunamadı" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' için bir yer imi zaten var" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' için bir yer imi bulunamadı" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' için yer iminde hiç bir MIME tipi belirtilmedi" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' için yer iminde özel işareti tanımlanmadı" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' için yer iminde grup tanımlanmadı" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' adında hiçbir uygulama '%s' için yer imi kaydetmedi" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Exec satırı '%s' URI %s ile genişletilirken başarısız olundu" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' karakter kümesinden '%s' karakter kümesine dönüşüm desteklenmiyor" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'--'%s' dönüştürücüsü açılamıyor" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Dönüşüm girdisinde geçersiz bayt dizisi" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Dönüşüm sırasında hata oluştu: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Girdinin sonunda parçalı karakter dizisi" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Geridönüş karakter kümesi '%s', '%s' karakter kümesine dönüştürülemiyor" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s', \"file\" şemasını kullanan kesin bir URI değil" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Yerel dosya URI'si '%s', '#' içeremez" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' geçersiz" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI makine adı '%s' geçersiz" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' geçersiz olarak çıkış yapılmış karakterler içeriyor" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Yol adı '%s', kesin bir yol değil" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Geçersiz makine adı" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' dizini açılamadı: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu bayt \"%s\" dosyasını okumak için ayrılamadı" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' dosyası okunurken hata: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Dosya \"%s\" çok büyük" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' dosyasından okuma başarısız: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' dosyasını açma başarısız: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"'%s' dosyasının özniteliklerini alma başarısız: fstat() başarısızlığı: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' dosyasını açma başarısız: fdopen() başarısızlığı: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"'%s' dosyasının adı '%s' olarak değiştirilirken hata: g_rename() " +"başarısızlığı: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' dosyasını oluşturma başarısız: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' dosyası yazma için açılamadı: fdopen() başarısızlığı: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' dosyasına yazılamadı: fwrite() başarısızlığı: %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Dosya '%s' yazılamadı: fflush() başarısız: %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Dosya '%s' yazılamadı: fsync() başarısız: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' dosyası kapatılamadı: fclose() başarısızlığı: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Varolan dosya '%s' silinemedi: g_unlink() başarısızlığı: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Şablon '%s' geçersiz, '%s' içermemeli" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Şablon '%s' XXXXXX içermiyor" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' sembolik bağını okuma başarısız: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Sembolik bağlar desteklenmiyor" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "`%s'-`%s' dönüştürücüsü açılamıyor: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string içinde okuma yapılamıyor" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Okuma tampon belleğinde kalıntı çevrilmemiş veri" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kanal kısmi bir karakterde sonlanıyor" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end içinde okuma başarısız" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' dosyası açılamadı: open() başarısızlığı: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' için eşlem oluşturulamadı: mmap() başarısızlığı: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Satır %d karakter %d hatalı: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ä°simde geçersiz UTF-8 kodlanmış metin - geçerli olmayan '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' geçerli bir isim değil " + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' geçerli bir isim değil: '% c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Satır %d hata içeriyor: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Karakter referansı içinde bir rakam olması gereken '%-.*s' ayrıştırılamadı, " +"(örneğin; ê) - rakam çok büyük olabilir" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Karakter referansı noktalı virgül ile bitmemiş; büyük ihtimalle bir özvarlık " +"başlatmak istemeksizin & karakteri kullandınız - & işaretini & olarak " +"kullanabilirsiniz" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Karakter referansı '%-.*s' izin verilen karakteri kodlamıyor" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Boş özvarlık '&;' görüldü; geçerli öğeler: & " < &qt; '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Varlık adı '%-.*s' bilinmiyor" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Özvarlık noktalı virgül ile bitmiyor; büyük ihtimalle bir özvarlık başlatmak " +"istemeksizin & karakteri kullandınız - & işaretini & olarak " +"kullanabilirsiniz" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Belge bir öğe ile başlamalı (örneğin )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' karakterinden sonra gelen '%s' geçerli bir karakter değil; bir öğe adı " +"başlatmamalı" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Tuhaf karakter '%s', boş öğe '%s' etiketinin sonunda '>' karakteri bekleniyor" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Tuhaf karakter '%1$s', '%3$s' öğesinin '%2$s' özniteliğinin sonunda '=' " +"karakteri bekleniyor" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Tuhaf karakter '%s', '%s' öğesinin başlangıç etiketinin sonunda '>', '/' " +"veya bir öznitelik bekleniyor; öznitelik isminde geçersiz bir karakter " +"kullanmış olabilirsiniz" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Tuhaf karakter '%s', '%s' özniteliğini '%s' öğesinde değiştirmek için " +"eşittir işaretinden sonra tırnak işareti bekleniyor" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s', kapalı öğe ismi '%s' ardından gelebilecek bir karakter değil; izin " +"verilen karakter ise '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' öğesi kapatılmış, hiç bir öğe açık değil" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' öğesi kapatılmış, fakat şu an açık öğe '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Belge boş veya sadece boşluk karakteri içeriyor" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Belge açık açı parantezi '<' işaretinden hemen sonra beklenmedik bir şekilde " +"bitti" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Belge öğeleri hala açıkken beklenmedik bir şekilde bitti - son açılan öğe: '%" +"s'" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Belge beklenmedik bir şekilde bitti, etiketi bitiren kapalı açı parantezi " +"ile biten <%s/> beklendi" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Belge bir öğe isminin içinde beklenmedik bir şekilde bitti" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Belge bir öznitelik ismi içinde beklenmedik bir şekilde bitti" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Belge bir öğe-açma etiketi içinde beklenmedik bir şekilde bitti." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Belge öznitelik adını takip eden eşittir işaretinden sonra beklenmedik bir " +"şekilde bitti; öznitelik değeri yok" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Belge bir öznitelik değeri içinde iken beklenmedik bir şekilde bitti" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Belge, '%s' öğesinin kapatma etiketi içinde beklenmedik bir şekilde bitti" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Belge bir yorum veya işlem talimatı içindeyken beklenmedik bir şekilde bitti" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "bozuk nesne" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "dahili hata ya da bozuk öğe" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "yetersiz bellek" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "geri takip sınırına ulaşıldı" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "doku (pattern), kısmi eşleme için desteklenmeyen öğeler içeriyor" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "dahili hata" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "koşul olarak geri referanslar kısmi eşleme için desteklenmiyor" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "iç içe tekrar sınırına ulaşıldı" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "boş alt dizgiler için çalışma alanı sınırına ulaşıldı" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "yeni satır işaretlerinin geçersiz kombinasyonu" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "bilinmeyen hata" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ desenin sonunda" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c desenin sonunda" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "anlaşılamayan karakter \\ takip ediyor" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"büyük küçük harf değiştiren kaçış karakterleri (\\l, \\L, \\u, \\U) burada " +"kullanılamaz" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "sayılar {} niceliği içerisinde sıra dışı" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "sayılar {} niceliği içerisinde çok büyük" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "karakter sınıfı için eksik sonlanan ]" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "karakter sınıfında geçersiz dizi" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "karakter sınıfında sıra dışı kapsam" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "tekrarlanacak bir şey yok" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? sonrası tanımlanmayan karakter" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< sonrası tanımlanmayan karakter" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P sonrası tanımlanmayan karakter" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX isimlendirilmiş sınıflar sadece bir sınıf içinde desteklenir" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "eksik sonlandıran )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "açma ( olmayan )" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ya da (?[+-]basamakları ) ile takip etmelidir" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "mevcut olmayan alt desene referans" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "açıklama sonrası eksik )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "düzenli ifade çok büyük" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "hafıza alma başarısız oldu" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "geribakma iddiası sabit uzunlukta değil" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( sonrası bozuk rakam ya da isim" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "koşul grubu ikiden daha fazla branç içeriyor" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( sonrası iddia bekleniyor" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "bilinmeyen POSIX sınıf ismi" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "POSIX karşılaştırma öğeleri desteklenmiyor" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} dizisi içerisinde karakter değeri çok büyük" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "geçersiz koşul (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C geriye bakma iddiası içerisinde izin verilmiyor" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "tekrarlı çağrı sonsuz döngü yapamadı" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "alt desen ismi içerisinde eksik sonlandırıcı" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "iki isimli alt desenler aynı isme sahip" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "bozulmuş \\P ya da \\p dizisi" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ya da \\p sonrası bilinmeyen özellik ismi" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "alt desen ismi çok uzun (en fazla 32 karakter)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "çok fazla isimlendirilmiş alt desen (en fazla 10.000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "sekizlik değer \\377'den daha büyük" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grubu birden daha fazla branş içeriyor" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "bir DEFINE grubunu tekrarlamaya izin verilmiyor" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "kararsız NEWLINE seçenekleri" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g bir parantezli isim ya da tercihten parentezli sıfır olmayan sayı " +"tarafından takip edilmiyor" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "beklenmeyen tekrar" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "kod akış taşması" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "derleme çalışma alanı kaplandı" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "onceden kontrol edilmiş referanslı alt desen bulunamadı" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Düzenli ifade %s eşleşirken hata: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE kütüphanesi UTF8 desteği olmadan derlenmiş" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE kütüphanesi UTF8 özellikleri desteği olmadan derlenmiş" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Düzenli ifade %s derlenirken karakter %d hatalı: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Düzenli ifade %s eniyilemesinde (optimization) hata: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "onaltılı rakam ya da '}' beklendi" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "onaltılı rakam beklendi" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "sembolik referansda eksik '<'" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "tamamlanmamış sembolik referans" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "sıfır-uzunlukta sembolik referans" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "rakam beklendi" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "geçersiz sembolik referans" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "son '\\' kayıp" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "geçersiz çıkış dizisi" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Yerine koyma metni \"%s\" işlenirken karakter %lu hatalı: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Alıntılı metin tırnak işareti ile başlamıyor" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Komut satırında veya diğer kabuk alıntısı metinde eşlenmemiş tırnak işareti" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Metin '\\' karakterinden hemen sonra bitti. (Metin: '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c için eşleşen tırnak işareti bulunmadan metin bitti. (Metin: '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Metin boştu (veya sadece boşluk içeriyordu)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Alt süreçten bilgi okuma başarısızlığı" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Alt süreçle haberleşme için boru yaratılamadı (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Alt süreç borusundan okuma başarısızlığı (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' dizinine değiştirme başarısızlığı (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Alt süreç yürütme başarısızlığı (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Geçersiz program adı: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d konumunda parametre vektörü içinde geçersiz dizgi: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Çevre içinde geçersiz dizgi: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Geçersiz çalışma dizini: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Yardımcı program (%s) çalıştırılamadı" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Alt süreçten bilgi okurken g_io_channel_win32_poll() işleminde beklenmeyen " +"hata" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Alt süreçten bilgi okuma başarısızlığı (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Alt süreçten bilgi okurken select()'te beklenmeyen hata oluştu (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()'de beklenmeyen hata (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Çatallama başarısızlığı (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\" alt süreç çalıştırılırken hata oluştu (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Alt sürecin girdisi veya çıktısı yönlendirilemedi (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Alt süreç çatallanamadı (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Alt süreç \"%s\" çalıştırılırken bilinmeyen hata oluştu" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Alt süreç borusundan yeterli bilgi okunamadı (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Karakter UTF-8 için sınırlarının dışında" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Dönüşüm girdisi içinde geçersiz dizi" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Karakter UTF-16 sınırlarının dışında" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Kullanım:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[SEÇENEK...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Yardım Seçenekleri:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Yardım seçeneklerini göster" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Tüm yardım seçeneklerini göster" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Uygulama Seçenekleri:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s için tamsayı değeri '%1$s' ayrıştırılamıyor" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s için tamsayı değeri '%1$s' aralık dışında" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%2$s' için double değeri '%1$s' ayrıştırılamıyor" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s için double değeri '%1$s' aralık dışında" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "%s seçeneği işlenirken hata" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s için parametre eksik" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Bilinmeyen seçenek %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Arama dizinlerinde geçerli anahtar dosyası bulunamadı" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Normal dosya değil" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Dosya boş" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Anahtar dosyası anahtar-değer çifti, grup veya yorum olmayan '%s' satırını " +"içeriyor" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Geçersiz grup adı: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Anahtar dosyası bir grupla başlamıyor" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Geçersiz anahtar adı: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Anahtar dosya geçersiz kodlama '%s' içeriyor" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Anahtar dosyasında '%s' grubu yok" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Anahtar dosyasında '%s' anahtarı yok" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Anahtar dosyası UTF-8 olmayan '%s' anahtarını '%s' değeriyle içeriyor" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Anahtar dosyası değeri yorumlanamayan '%s' değerini içeriyor." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Anahtar dosyası yorumlanamayan bir değere sahip anahtar '%s' içerir." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Anahtar dosyası, yorumlanamayan '%2$s' grubundaki '%1$s' anahtarını içeriyor." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Anahtar dosyası '%2$s' grubunda '%1$s' anahtarı içermiyor" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Anahtar dosyası satır sonunda çıkış karakteri içeriyor" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' geçersiz çıkış dizisi içeriyor" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' değeri bir sayı olarak yorumlanamıyor." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Tamsayı değeri '%s' aralık dışında" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' değeri bir gerçel sayı olarak yorumlanamıyor." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' değeri mantıksal değer olarak yorumlanamıyor." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s için çok büyük sayaç değeri geçildi" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Akış zaten kapalı" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "İşlem iptal edildi" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "Geçersiz soket, başlatılmamış" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Dönüşüm girdisinde geçersiz bayt dizisi" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "Soket adresi için yeterli alan yok" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Ä°ptal edilebilir başlatma desteklenmiyor" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Bilinmeyen tür" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s dosya türü" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s türü" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Beklenmeyen erken akış-sonu" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Ä°simlendirilmemiş" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop dosyası Exec alanı belirtmemiş" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Uygulama için gerekli uçbirim bulunamadı" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kullanıcı uygulaması yapılandırma klasörü %s oluşturulamıyor: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kullanıcı MIME yapılandırma klasörü %s oluşturulamıyor: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kullanıcı masaüstü dosyası %s oluşturulamıyor" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s için özel tanım" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "sürücü çıkartmayı uygulamıyor" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "sürücü eject veya eject_with_operation uygulamıyor" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "sürücü ortam için yoklamayı uygulamıyor" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "sürücü start uygulamıyor" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "sürücü stop uygulamıyor" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem kodlamasının %d sürümü işlenemiyor" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem kodlaması içerisinde bozuk sayıda token (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon kodlaması %d sürümü işlenemiyor" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon kodlaması içerisinde bozuk sayıda token (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon için bir Gemblem beklendi" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "İşlem desteklenmiyor" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Bağlama mevcut değil içeriyor" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Dizin üzerine kopyalanamıyor" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Dizin dizin üzerine kopyalanamıyor" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Hedef dosya mevcut" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Dizin iç içe kopyalanamıyor" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Sembolik bağlar desteklenmiyor" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Dosya açılırken hata: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Özel dosya kopyalanamıyor" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Geçersiz sembolik bağ değeri verildi" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Çöp desteklenmiyor" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dosy adları '%c' içeremez" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "sistem bağlama uygulamıyor" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Bu dosyayı işlemek için hiçbir uygulama kayıtlı değil" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Enumerator kapalı" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Dosya numaralandırıcı sıradışı işleme sahip" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Dosya numaralandırıcı zaten kapalı" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon kodlaması %d sürümü işlenemiyor" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon için bozuk girdi verisi" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Akış query_info desteklemiyor" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Atlama akışta desteklenmiyor" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Sonunu kesmeye giriş akışında izin verilmiyor" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Akış üzerinde sonunun kesilmesi desteklenmiyor" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Yanlış sayıda token (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Sınıf ismi %s için tür yok" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tür %s GIcon arayüzü uygulamıyor" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Tür %s sınıflandırılmış değil" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Bozuk sürüm numarası: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tür %s GIcon arayüzü üzerinde from_tokens() uygulamıyor" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Simge kodlamasının verilen sürümü işlenemiyor" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Giriş akımı okumayı uygulamıyor" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Akışın sıradışı işlemi var" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Soket adresi için yeterli alan yok" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Desteklenmeyen soket adresi" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Öntanımlı yerel dizin izleme tipi bulunamadı" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Geçersiz dosya adı %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Dosya sistemi bilgisi alınırken hata: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Kök dizini yeniden adlandırılamıyor" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Dosya yeniden adlandırılırken hata: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Dosya yeniden adlandırılamıyor, dosya ismi zaten mevcut" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Geçersiz dosya adı" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Dosya açılırken hata: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Dizin açılamıyor" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Dosya silinirken hata: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Dosya çöpe atılırken hata: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Çöp dizini %s oluşturulamıyor: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Çöp için en üst seviye dizin bulunamıyor" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Çöp dizini bulunamıyor ya da oluşturulamıyor" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Çöp bilgi dosyası oluşturulamıyor: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Dosya çöpe atılamıyor: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Dizin oluşturulurken hata: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' sembolik bağını okuma başarısız: %s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Sembolik bağ yaparken hata: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Dosya taşınırken hata: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Dizin dizin üzerine taşınamıyor" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Yedek dosyası oluşturma başarısız oldu" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Hedef dosya silerken hata: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Bağlı sistemler arasında taşıma desteklenmiyor" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Öznitelik değeri NULL olmamalı" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Geçersiz öznitelik türü (dizgi beklendi)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Geçersiz genişletilmiş öznitelik ismi" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Genişletilmiş öznitelik '%s' atanırken hata: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' dosyası durumlandırılırken hata: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (geçersiz kodlama)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Dosya tanımlayıcı durumlandırılırken hata: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Geçersiz öznitelik türü (uint32 beklendi)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Geçersiz öznitelik türü (uint64 beklendi)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Geçersiz öznitelik türü (byte dizisi beklendi)" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Ä°zinler atanırken hata: %s" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Ä°zinler atanırken hata: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Sahip atanırken hata: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "sembolik bağ NULL olmamalı" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Sembolik bağ atanırken hata: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "Sembolik bağ atanırken hata: dosya bir sembolik bağ değil" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Değiştirme veya erişim süresi atanırken hata: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux bağlamı NULL olmamalı" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux bağlamı atanırken hata: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux bu sistede etkin değil" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Öznitelik %s ataması desteklenmiyor" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Dosyadan okunurken hata: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Dosya içinde atlama yapılırken hata: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Dosya kapatılırken hata: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Öntanımlı yerel dosya izleme türü bulunamadı" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Dosyaya yazılırken hata: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Eski yedek bağı silinirken hata: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Yedek kopyası oluşturulurken hata: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Geçici dosya yeniden adlandırılırken hata: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Dosyanın sonu kesilirken hata: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' dosyası açılırken hata: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Hedef dosya bir dizin" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Hedef dosya normal dosya değil" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Dosya harici olarak değiştirilmiş" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Eski dosya silinirken hata: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Geçersiz GSeekType sağlandı" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Geçersiz atlama isteği" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream sonu silinemiyor" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Hafıza çıktı akışı yeniden boyutlandırılamaz" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Hafız çıktı açışı yeniden boyutlandırma başarısız oldu" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount unmount uygulamıyor" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount eject uygulamıyor" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount, unmount veya unmount_with_operation uygulamıyor" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount, eject veya eject_with_operation uygulamıyor" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount remount uygulamıyor" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "mount içerik türü tahminini uygulamıyor" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount senkron içerik türü tahminini uygulamıyor" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Makine ismi '%s' içeriyor '[' var ama ']' yok" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Çıktı akışı write uygulamıyor" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Kaynak akışı zaten kapalı" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' çözülürken hata: %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' tersine çözülürken hata: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' için servis kaydı yok" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Geçici olarak '%s' çözülemiyor" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' çözerken hata" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Geçersiz soket, başlatılmamış" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Geçersiz soket, başlatma başarısız oldu: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Soket zaten kapalı" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd'den GSocket oluşturuluyor: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Soket oluşturulamadı: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Bilinmeyen protokol belirtildi" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "yerel adres alınamadı: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "uzaktaki adres alınamadı: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "dinlenemedi: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Adrese bağlarken hata: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Bağlantı kabul edilirken hata: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Bağlarken hata:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Bağlantı devam ediyor" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Bağlarken hata: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Bekleyen hata alınamıyor: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Veri alırken hata: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Veri gönderirken hata: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Soket kapatılırken hata: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Soket durumu bekleniyor: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Mesaj gönderme hatası: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage windows'ta desteklenmiyor" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Mesaj alma hatası: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Bağlanırken bilinmeyen bir hata" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Dinleyici zaten kapalı" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Eklenen soket kapalı" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon kodlaması %d sürümü işlenemiyor" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 kontrol mesajı bekleniyor, %d alındı" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Yardımcı veri'nin beklenmeyen türü" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Bir fd bekleniyordu, ancak %d alındı\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Geçersiz fd alındı" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Unix'den okurken hata: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Unix kapatılırken hata: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Dosya sistemi kök dizini" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Unix'e yazılırken hata: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Soyut unix soket adresleri bu sistemde desteklenmiyor" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "volume eject uygulamıyor" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "sistem, eject ya da eject_with_operation uygulamıyor" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Uygulama bulunamıyor" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Uygulama başlatılırken hata: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI'ler desteklenmiyor" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "eşleştirme değişimleri win32 üzerinde desteklenmiyor" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Eşleştirme oluşturulması win32 üzerinde desteklenmiyor" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "yetersiz bellek" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "dahili hata" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Geçersiz makine adı" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Dönüşüm girdisi içinde geçersiz dizi" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "Azami veri dizisi sınırına ulaşıldı" + +#~ msgid "do not hide entries" +#~ msgstr "girişleri saklama" + +#~ msgid "use a long listing format" +#~ msgstr "uzun listeleme biçimini kullan" + +#~ msgid "[FILE...]" +#~ msgstr "[DOSYA...]" diff --git a/po/tt.gmo b/po/tt.gmo new file mode 100644 index 0000000000000000000000000000000000000000..da3eb8b01fb397a2846af98c544edb268bd80bc0 GIT binary patch literal 5257 zcmbW4TZ|i58Gxs>6dG=60u)Lq2byJ*Cga#i8f_dJNVW+Ho121@Dyk4Vw$Iwbj%U0x z2vDT*f{==e5DyI!ixvrjvQmi<%1aqX;sqfjBrZZo%`2)90v@@1{~3EcyJWWs zqaA~QVpeuDee2OQ_q@brUxaJ3(DocBTxeiVKgD)>Ek7`_Id zhW~;kxbv-!vll)OKLlTdGXMKf!JiGE{{bH1_dlV`JMggMJP8|c0)7o1f{NBd=$O`%kV!?pL8WKj#P^pLu{AKF;r#-dIYp@D`5BI|DIAJ@Sh7#}Rq3B7VGXq=rM9+e>^S`S=JoF3B&+5%Hh+R<51ggwWPn2~xJ!jtZ1Zd`jwApUH2@Iq~o4 z5?kdGU&w`9Z2imkk8w+m%e9YN{7rdh*U@g*_Zm9!!a$wt3gW6W-PVzABqmZ}FHzyF zigeI2YBr42#o7tCa`4S0rkv?8STIp6YG5GE?_b-Q7d zm?m?3e$ze+yCzT#t4elbH5KRHhiFwz#LjbJqt`J(q84?mOsAXl6*jRzqP@U0RT%hv zwb=F&6L)pPILD)i@n$dbg4S>!Vv^OBjbWe9R5j5oK4jZ6qv=Jak%Up-8d?yDjBbj+ ztmm7;*cC5M);wm-kt^y(MWz!j7#3=Mz8A3S+|FHUR-+> z#o11>Mjls~|^s-#ccfD@y$OO7m@aQPlC3M-?Mka~n zg^6t2K3OL&k)>>G20JH-%eZz=1&L`9rUmWyvfQ#BoggHIT6XRtwr(5+UQ@NhI1yWz zkUbcMUmjYkM*}gjC#AhWnP9<-!axdbjl^OY&51}}7It*T^s`hMmSL=VLEa0{)d+2= zNZC8NY%?Usq-(VGf>Es~>~(D&Z6q^lK4i}a7eOpT^%=&HiRH`d~QX{gy)TC{8Ugr8eDsJcP zVCXCsux8cTMqRvcYA7FLhK-gZ&qpDYnoKs4^TUSrvry!!I=XM&>;(pd@^)U2}4odeZ9`rhO6P277&YiEFI(N2IDt*p5ABA6_3A?A7?xpO7RHb9rTS3?{ zTP_%R<+x|!me+KT^;)r83#)3&`ExaQTACug-hGZZRMoz6rRZ@r*)jTHQu5zQ4OQ2I_k60M4iw}etKPf zg6^mzFK(CoN;&vct3xL*HNwsjCI+n@4s&ZpcdDv3l-p#+nNw$uk1ef~%3G#+y-|v8 zt>49v#9T@Cl3ZSJ*uIo`9X~5C^{KI(>~q#c?(t#mRn=78OSU+d_0nL~AFOuNOnS5L zr^}smna_xDX2$}Ru6QjI1nF|X*TL%iJPA?v{Fbo-Q=5$2EOPIB<>y%nH@%i9v2#_r zEQZi+Sy?t#@{tc(hXPdSD$UJ~25G35%Nw1D95VM**zCt83A7PGNYNAw3|zyrM>@i%q7)y0{E|;4+DWBRYgi_4C9sx3A&Bq_C&#oMAm-x2@7!OE`8# zq9Q)28^0jUW`;+N;$BGHo=R`ptQc#$n?v*SMsfP)Q?O-of&WA2@bt0KCTxL8tk?N; zybmQAA7s(yK+zSikwhG?i&F}Rk&TwhVpE)yA4rN*j!6RAqEOx(DV~S7&?;j3#KgWG z@i-Ed9sCS zbTIMHc)%uk&5P1yx34Lc@rc;p;YFlr+C=*J?Q1G8$gz|iJDRQ#l5~YeV5?Ee+(u-y z>8x{6hoi1Ys?$Q94JXPZmIQg8cg2yA10fAh#C#Ur(RE%iD zi#Uj9Z3%soPp`UW sr=wB{B=DrDvZbDAcAr&jdcCy41gW&UNxv|Ye*5z2^y-=Psy#ma7deGwxBvhE literal 0 HcmV?d00001 diff --git a/po/tt.po b/po/tt.po new file mode 100644 index 0000000..86e0aae --- /dev/null +++ b/po/tt.po @@ -0,0 +1,2055 @@ +# Tatarish translation +# Albert Fazlí , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: libgnome\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-11-09 13:19+0300\n" +"Last-Translator: Albert Fazlí \n" +"Language-Team: Tatarish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' biremennän uqıp bulmadı: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' -› '%s' digän bilge äyländerü totılmí" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' -› '%s' äyländergeçen açıp bulmadı" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "'%s' digän cirle birem URI'sında '#' bilgese bula almí" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' digän URI yaraqsız" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' digän URI'nıñ host adı yaraqsız" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' digän yul töptän tügel" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Host adı yaraqsız" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' biremennän uqıp bulmadı: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' biremen açıp bulmadı: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' birem üzençälegen belep bulmadı: fstat() uzmadı: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' biremen açıp bulmadı: fdopen() uzmadı: %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' birem adın '%s' itep üzgärtep bulmadı: g_rename() uzmadı: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Yazu öçen '%s' biremen açıp bulmadı: fdopen() uzmadı: %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' biremen yabıp bulmadı: fclose() uzmadı: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Barlıqtağı '%s' biremen beterep bulmadı: g_unlink() uzmadı: %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' ürçetmäse yaraqsız, eçendä '%s' bula almí" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ürçetmäneñ azağında XXXXXX tügel" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' -› '%s' äyländergeçen açıp bulmadı: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' biremen açıp bulmadı: open() uzmadı: %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d. yulnıñ %d. bilgedä xata: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Yazmanıñ UTF-8 bilgelämäse yaraqsız" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d. yulda xata: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Ä°stälek eçtälege yä buş, yä buşlıq bilgelärennän genä tora" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%d. yulnıñ %d. bilgedä xata: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Tirä-yaqta yaraqsız yazma bar: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Eş törgäge yaraqsız: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Yärdämçe yazılım eşlätep bulmadı (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 çigennän çıqqan bilge" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 çigennän çıqqan bilge" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Totılu:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[KÖYLÄMÄ...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Yärdäm Köylämäse:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Yärdäm köylämäsen kürsätü" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Yärdäm köylämäsen kürsätü" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Yazılım Köylämäläre:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s öçen '%1$s' digän tulısan bäyäse çiktän uzdı" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s öçen '%1$s' digän tulısan bäyäse çiktän uzdı" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "%s öçen köylämä birelmäde" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Bilgesez %s atlı köylämä" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Ğädäti birem tügel" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Birem buş ikän" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Açqıç bireme törkem belän başlanmí" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Açqıç biremendä '%s' digän totılmağan bilgelämä" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Açqıç biremendä '%s' törkeme yuq" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Açqıç biremendä '%s' açqıçı yuq" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Açqıç biremendäge '%2$s' törkemendä '%1$s' açqıçı yuq" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' digän bäyäsen san itep tanıp bulmí." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' digän tulısan bäyäse çiktän çıqtı" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' digän bäyäsen san itep tanıp bulmí." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' digän bäyäsen yuqbar itep tanıp bulmí." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Bilgesez %s atlı köylämä" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Host adı yaraqsız" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d. yulda xata: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Ğädäti birem tügel" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Yazılım adı yaraqsız: %s" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Birem ısulın üzgärtep bulmadı: waitpid() uzmadı: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d. yulda xata: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Host adı yaraqsız" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[KÖYLÄMÄ...]" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Yazmanıñ UTF-8 bilgelämäse yaraqsız" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Yazmanıñ UTF-8 bilgelämäse yaraqsız" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "'%s' digän URI'nıñ host adı yaraqsız" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "'%s' digän URI'nıñ host adı yaraqsız" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "'%s' biremen uqığanda xata: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Äyländergändä xata çıqtı: %s" + +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Birem ısulın üzgärtep bulmadı: fork() uzmadı: %s" + +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Birem ısulın üzgärtep bulmadı: chmod() uzmadı: %s" + +#~ msgid "Could not change file mode: Child terminated by signal: %s" +#~ msgstr "Birem ısulın üzgärtep bulmadı: Balanı ımlaw özderde: %s" + +#~ msgid "Could not change file mode: Child terminated abnormally" +#~ msgstr "Birem ısulın üzgärtep bulmadı: Balanı özü tieşleçä bulmadı" diff --git a/po/uk.gmo b/po/uk.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ca43cfc78b2bbebe427c5134ce7e5d22af7e52d3 GIT binary patch literal 58382 zcmd6w37j2OmH$h}1(`uq5Zu5b5Rzy*bN~Uf0fvCl00F|H1j9@B>&_$H{hEH=Sx__* zK~N+tF;NhMh`2CnSh7GC6vt(p8K-+@aGY^;2FGQb&Dos4&VQWwe}CuPs#jI7UUw%l z|Np=9sr+75-MaVObI*3qz4hMrU-rBYNBrIQoG5w?_?p9_sN=cdt8_JrMyEv45#Sj3 zLhwfc{~_Sd1O6)D^N;s(hk?II`Im?DP?I1j%X>;!2lS^}!Q zLGWns1K`Qv{ootHr@`aE!>2{jso-qzB(MimyIa6hz|Vtf?-_75co>a#fMc=m``O6^kWt`6d_1rvA&s_xSxj|6l z@FDOx@Ux)!^?RVo{T=vn@K6R_su6>#XD%3nOF=zbXrI zA{0FgGE~ubLACp$)1v4Y@HkM6XE(_fGYoQpvM2jr@I_2 z1{tbo9VmVJEU0pS9q?D+0?v;ha;&>@^K2N zel$Qme=jKcc?wj&{sue(JPM*j@9RJ=MN2@*^-baYVNm1$cc7j-WUlM;Y2XJqUkOV7 z{~=sIa-Qq`S)k}0237w@K+*FA2&vHzLA7_xe5dPjQ2n?bR6D;N&i@=dit`u23_Tx% zs_!k}VPGG4EO;F#x<3jY4*m|P`u+q|x!-^(qVuHz&j3Z=ig3OWd@bjn178My6MPl; zJrGfhegTTEnP<5jdV9c)0e>45eNTf&gZ~Y_7CicFx9g{a;`f_D^=Emw-T)=1?*mo- zqu?vR$HVnM0yTa=0VOZLg>hH8`5>k#x(YlFyajwU_z-vu_;nD~j(!A+4@WPIqGjN@ z;G4mFK-sAug0MJx{W*+1SOZn>PEhs!091R=Tjc#e0X%{8i$U4rwV?QPA210c!j%2VV+a10D~)3sgVu1J%zjffs;>Esmn?;BxRfoxjEDyE))};8d>f z1|_%O2PFqbzt!b!5r~P12E+M-ASOB*12x{yp)vLA<>2eV^S~HvfU0*hDE>SFia&n} zz8w4yQ1rj#e3yqQpy;0qN?xu6#lJx?2JZwVH;;m<@ApCR;isVZ^q-*0A5EtIm-u*12PIFJfRG*yfv7kJX zmw+z;-wmq&o4^?SBB*voLDl~w@WtSB-{yAarQjPlKMB;hSHty9pvr$9)brm2MaN%) z;^%*a^VhuH%bgCY-esW1p$n9}+yovCJ_L&YUja4V{|JgdM_=jXPXSf$WuVHh178l_ z4vMY^LFwBlsQ&#s_(t%k<^J5#fJ30{;bu_d@kgM_MOXQF&jI!P5>WN^fiZX|co_I7 z_-gRW;K|_kK$UyRJDjf5K#ku8p!zogz6QJ-lzi_34+sAelwAA_d4a-*a-auPXnJ{@$-4$ zOwO+i=Qo4g(vQys`$5tDB@h!E9X1d}=Yz{Z>CxvvUH>a^2t29o?cNX4h3H>F_3z3-Yzg=W z;ML$_E;hi=fwRG5d06c(1y%1o;Hlsk2uq_EQ1~|)zty0|d+o6EV+#liqdx`3rv)S4 z-}}LYv@%{I~z2G5hogZHXujKqK>wF&jAh@3M7x3S^zzyJg!C!&m z(|fKXW&@uA?*<>Fb60_9Q}{w~8>s&N3{?5mFnb~R2jI=%OW)0Z^yh9+{k-QruGgdB z0?z*>;Oq^q&x4@o{v3D~_+xN7I1QqtUrRyp?_J=0@ay0k!RO!L{5umolk*3_%fKIk zs&DQ_j}z8{$8)|NRJlI^=YdBeEGl;qcnbI-@O1FY;ry52S)6y==+_6pMVvnv&i@`n z^r91Pa{g}uB~RZ5&jycwzsqG66utXF_2U;{1zZTT#LrKGy8m(lu zxE!4N0oQ{Yz=fRe19km5AH+t2?*LB&{}oidue;Ud<~r~q&c6@70qpz`wi4_C5#i{M zLCM*|+oFgrMV|vzPv<7*cQ4q@`KLh1^P#unv%z_w#^ZKSeEb%;RQK=jcCG}~&K=-| z;D3SY{{?sY`A0#G*H1ywb=FTX~qt30)&o6*;IR8&j&!7Gg*V7Mx>fe8XdamoEZg=*BZ|3|ElwdJ< z5h!`Q2V4Sv9XuU8@*aLjizZuS7@G0l_ z72tBN-vw$M{|Q9oqRSt2`}8AFe7NS*K3@L}G89q$Gd?bdeAeZxA5{Ghf$Hy1z=hyx zpYw6M4ir64gQEM`hdh6GDJXt@5j+(<{I|XQIpB$$ZvzLxuYnrR(?9QeSO-P-E^sAy zECns@CdOEFz-2#{uGSC zqn>a+o(`VC`FlXg-2>p+;Gck^>!>|0#|uF{zXiMjd>X8RSM2q;dOz6D`JwxqAL~Hz z?PH*xo3-Ej(GOnB`Ger=z*ju!d|L?4;{0x~2mD=7G_N=dpnnc zZ{U1AcoFzT@J--zo^n5W4%py)KX?Ur@>d)`2=;RRLs0x&@;kxqfr~l+X~0vy%3O}~ z>p_MlI^t_Chu;LnpXYwv?czz`nVhcyuLO63XMivJhRg9=L5ELv0}g{91-ro)f78dm0ba=Y55P|F>jGcS`8IGWxC1;3{4OXxdd=@+ zGr)zQ==v@wI*&{VKX@D%{h`a{6mSZs{otFy+r#xg12ujp zjJiBs0=|~>b>L#~BjD}e55TvBjWL&-Zv}i6N_8sNd%$_%J>W9%JK!9!8qW8F zBjAibb-T9>Je~7nzT^6PDOllr2lxT-=s$yI@P1JIUhwB`|El06oPQP+9lruk0Ox$y z>0SZ8kMo`2a&YcnxLkb%)cIGzCE%3rdHZ!x^nV)EI6njSf-n5O>uDX_!ueC6`ti2E zbiegGpvq7EE2rbF;7rbM1~pDQz>~qJL5=Gn&$wP)1fItE`vdL=HJ(2QrEh2cz~jn0 zz;if%)nB`vTLCWO{2SnNz?B@yA46_`NAdrO+}zBey7YG%pHK0R>Hj`}%twI1hXoh$uv}!1Z7Sj5+kDanj!{oPRW2TOCl>B^SFmhB>~#aUu8a;dl|p zp&a6u{?5{8j$RJ^?dDj(=gYxsIgaAcJj*oHtBZvMrh5P#aA&%#A{`(;6 zkp5lCC)C#d?hEBl1wX}=Uxn*$=KL+;-iCmk+`EwDHJtxeC?~jy^Zno>953PXjT{$n zd`agVU*?bxJsw;M>hE;$kNjiwLOvhHaTDirKvW{?0uiC;uQ-yw7jq5s=kX4oH-sB? zJ|E8KtHI>257IhYy10Pz!z}u4i5dDz;Ohh z@8WndpKBa9aJ)3!|2dy;<4FF7_%N5_H@JT{$5niOWhnbLurGX8dFk3(j*a1(bWwlj zaICUVZWr`%T`2RSaQ#y7ZhhwZns80#a^18)cQcQp7@@Z@klADqXrmg8xzKf`ezpR3@ zB9yTU{PzZq7le~Lxi^#JgBaYPj}l&Myg{9|B*> z@m!8Zxc0Sxf_}=@!}-m8ejbPZe#G%|j<0e|;rJeh{$_EU&hfEO?!DkGoS(<>LXPKi z{wnZsjvkIzaefc@5su6Fd>h9Te7=I?ogCM2=r-J8$uK-^UeuSfw<6h1mj=~ zKUmdg$B}sD`eDu;8_~3>jcIYM5f9Xd<4WvJcCD%mRl0_&Lvc^NudlwA*10!r-n2Nq zGdHdc$NiP{_T0*9Z*3s148+yGYJYWLI3B3RflL+x++Jb4NJy6%;ws+=GZP&ConttZRaeXMBe&&_0@3^YF)>|8H z#Qh_U;do^=@Raseu8(I#Gvc+i;Z^mK;kZ6n9T2CdM`y-E+Bm7&!X9*Qr$c(G9n zp+nV5_xiZHuGScCL}#yT3~QX?k%8K}xVzq8VH6tmuGLkBvb%ez+GtdLU>hTYgY}_d z+N=-IWxCf`-x#j;M`w3;b1^)_0uJXF1Qq&7s+;d(qc zRPUl{W8K=J+Hh6u>Z=U(A}_(#*(p8Pl9vtkebybFI5OLw4 zpfM*pyFu$Uzt~0h?5>0{M>8UL%E{5$!^1Va_RPYWW@Bh{4k z1NDK93oc!XF`&MN-leD6GVSj) z2CMX}&ss^IP!Fr|NQ2tWUwr-|ni=S+^^OdAzfret?o4gW;V5~elHuTiJ=tAttRAk1 z9;bD8*U{^t%38*^(j6l`y(?<<6)5?@K(%j$F0SaS4OCYkXGmrsXc7+%*H=^-2Ipi? zZJ;~OP#!MRNH-!P1=LXY)sQZj+>mtWVvP=_#xMU&Qfw;n+!LR-s2^GDKajH3?!}X? z{al1%@}-xp!UC4o-jAR(C8%7WWCEIHLZ=bI5!kY(+PA(Sm1zMpO0xAcP1x)-XDsq1 zhw5lbPMEu@eXg;!f!Z)KTf44A5mkwF4AwCM=o*G|C5q(Qh-JW0RT~%|X=74&urh?@ z?XHi=9=JA|vdXZz9I8q$RT~(t%8IltrpgDaL;bae#H1l>)>z+~Pef5F4aeo~b(^p$9QCVLfk)1*H=wd%yYoKt=+Ece9rVl8IgBZFE%zp)jqX(uhywY;Lr$j+N*#dkq)y3cd0;x;%^{QibkCnw^!~()~n#dxq-$ z8Hy6o5g{fc_!adv^#nXS(&zn`&$eNn+7}`jJ!NK0dJs>U+L)3lZi*G;76G${t%=ao z0Tgx9j4y}w?kdI&g+UI3JfE}Z+{G6xihGCZxEC4}D{%ewAz3;`qCQZKS0YSZtD0y z;lLj0NTRCYO7E=6JSt{d6cqD>jcU@kS+(&-;~E8cJ|r4x*>bD~!pMMIP(}njE(vQ_ zNpusIXL&X8Kq-n$!Xe~fxYpO_By_kgtwnFux4sHQCS4MZL_FhkY9_&^i<_B;s)>RH z)A_C?CWIEmw|P?=CoO2!8$w^r5{ypRlaMgII;(e9JWm1df*H*xL~gZz5EF#J1wBIg z>jOwVY{GO~NO?{hzY=H7cC;u=OHAWcvxm7eV`52T3Jw+nJxtv;Y6)%F9~<owd!WvDvGEoyw?wIlW6x$%j8`mb02RR-&g zxzQr8QGX^T&`55&ArTJMS3EwZWF*J ztL3^Al8eox_Y^M_hCX+%Fw8{G)tWJ)yE0tK5YfERPsmc~&C1dcVPhHd((BC8;vf$N zuIGxh&>5;F!eaPayMZnx{m)Svt}|O_3SVI=+EQ_&-e&~6tuh@W63bl7)hB7JcC;;k zjWWr?R2Ld*1RG!AWpcTdlf-i-<(Dj4QX3dqXJ)**Za70tQi7`<-87?>f;1&1`^km% zBuRu|Oq7eL^=HR0DUBtn4wbZ*nM0J^4O5Eo?ua$btXX&<7>$Oq93?|ZY@I57QNnZg zm_&6A)dsPh84}3!G|V0pMkUO5O4{>ig1Bw4hMe{i9QTfprjbKepst{GD(;8*9FrZh z1*zThNBb+oZh}gm%+Th=rP2Mh>)JNe@<3t=hN^>oXE3W}Y`G+6B%x0wO)@CV z4+#gK=7&ORWVT88P`!_=nOT*YaWB)Csoj|}ivN4MJ@W9IheqdGi|P_1p=lNC~KjnS@zHr1<^+k-XcdFr1+eORbW9lf%E4LQK-C7Hhh zHB}}nO3LL6X$DrLyS!wZ>Q+_z&{LmSR{C438q|DNHM&!?(KTX|d})SZbZd372D_H0 zxj>2RbZU{vHuPj!*dv{7$MOD3NVPe;`#En{)FRGwXlww2C^M|xx;wciO=6pany>ai zs~WFa&((yeZ>FO0u2pe^6gCpFszQ=$C1EZzMoW9Avzg31znKr2e&X>bpK|J4pJuHi ztI$`SLC%3;UsW0O`AVpTlX~5=%$Z@8^N;0^d`6!e%t;n2N`+Nf9jK4=u4=8BxZSj* zASd=rNM@LxNR!%@NyoY{VpfZ$Xt|)SOkqjHTVh(X9I{)QBGr`Ul7!}X&`N|w>?sAZ zG%lgNWP5e5ovh(8YS)oS_vL`lE^~jS)tW-*%K>TiNL^3gNMlvIN?VIJ)(><|zO+4G zC@vdkriW=qMr3rk+MJWDViHIvP+^~JAn%@nkIpTWq?#m?8fGz8g3C5N_448zvz#XLOc;Q?aFC3=~Y^7+Evq{#VjsL>#*MaBYnd)tqn3wy>`UXm2|@7 ziei#3A8t!tDpyt0gXXj)xs+*>yv@(WON!;@>bgHPKr*(fK-N@baaajG?-F9uWvphV z3kEdmvuPz|&+ruhvIG`HK)f-a!&v6U#EkTr)Uw;kXguBfZYv#W(ql&3(lA5bG0Bd! zFE~Pi^^}t*S@5(|OA59ON^?$`j*s_GgQ?gK9>^-D#Fxa^;!S#A8e4inQBcBT&uOYy zZd6tUNlVMEuCgjzELC554N1$HHWuj`1F5H^a!ViM z;A#Dok)|1~#Wj{@LFlxPzn!_ymk~wo#K={eM!5MStVZIiLkJ>C>RBZ;q?ISZp?#FX?#jCLM*cS7+>OgB5cvcXDih`E5)1ZH|Z({kx0m5mIf ziydywBnA1gN!^IWTFpUe)|M}kaC@Trj9O-hOG@J`SsU{Ft(T0JRC|VP{hMT!FA4_B zqslCvSvk_f;#ahUc^Ii?O9mF)>G_pDB5@W?c}8Bw!#Pc}8a0dH!BH~E$8_dp$*9@g!O!)$`)kyacKr1k6~+wTCnIy zs?svfWUGV4(@ttrtD6ngR-n^Np{Ida&1Eq&v*0y1odafSHes}Mlkvb4p`xFo3=G>SLHE=3n6^N4($p1E$zPptp4;eznzLZ83| zJ0ioKkF0Hm6D?hM@gf{L%ZQ|Z(P_`=p%+qCMbG%AGn6Qybz4&kPGph~rll{uWbqYL z&Q=i1`~*p`C8|PymReCM6ml!&@`bGCQhivdgFX$Bmx-1Z_gOTj8qL7PP2WWto)F0= zZ1HV|!2xOfOm}Pyql+!oZ>GX^yQiCL7BzCwg2Ri)uq^H+RdAjA~>?i?glB6+*-NUe88sJgiE{;WzKmHs;vT$RB55JOj<2x4 zC|@X8p_xg}OSL8sV5&96)B{?qsbSVeY}{pM2@zP7@unz3qT3fef?%fUb~jBj6z-BN ze(0JNPhY0hbv>thYG_8bn(X$2c-r!eIUeUx)nti`c)I+g=Lt+oa|`V>MB9m9Ps(Zg zlxZ7feJYaiVhl|75k@8yZn@|WC=+SBXNfFQCkg$`hFzL&G>fa1A!+zPcSpUaBgkU*wk;qwmrw4rj89CET~neH>R4N;4G-43sl*cUnIcJm zOG~!Lt=Q}2{!H7^q`PTuE=#RVG6)Tb>DY6n2u+=&gl&ZJG$s#fiA)^G_1d>7=8K}5 zm|^XUN$Y6tl}L&b>kZe5)XWU}ra|^krw;_lHjjeY$;V3Ktd{t+d}hfDM!t@E58=>= zN;}N`c<4oi7UO|Ub5oewTx$C#qRVVXrDTICO>UVromn-IBo>QoZp8y6e2lH7nIlbC zE1IJ9RVxFtRR1K3_w?0?Bz?X<*=Lf{mm?_}A!$PBBLmUR#rl9L&*h}?dPC*rTAC?{ z=*kP1E?a!z1+!+&x++?pNyFh2-b0)Di4_w|=_AGYJ z4XW?#WJGy&1m3W%kk96mpqYtKW;T`F0Y@*>Yq}p%GJAIJ9lnNuU#{5)4$Aa* zLQ}03&84w+b;`ykio=AkR%u(mKsZeFJ8XGjViZM_Bg z)2`3hYOHd#mj}~j)l_UFf;?U$Fb)sL7c9DbiS};05;eH#(WRU4!l|cm3&Wn~C+hv| zV)WT5o?)Q6*6eH#xh++TRFZs3#f-PargzRruZNs|nwgiiPTxkb5GyJ(9jS?^twRo3 z&gmr>gLX&&FT4)Ig4Nj9L3bpLI zYdRiwzQGpR&Ptqnb0qlt;MO8yZeF!zf&xpK*+z%j8fi`joJCyGn>GZfG?CGhC7^}Ym) zmKaV7X@#M8fNe0DEJqqWO>}?WLuMuNadlvIJ)YOy zJUOeEm#X__VU-r}=s@oXd&N7JvFT|}JhFPIf=FVs=3UzSII{YzzS^w%Q15~ThidJv z+0WUtIuBjw#=Ap#mN}NnJBjRLjh8~CsjQLBw^in5IT4Db>sUmfq6zez_>7gc;X{}9 z@y2jp$GP}+G9&|ocG{SK3d<(;asKpysk1xh&z~Kicw(%NoyX0eJv%-#?u;qU`GWZ; zC%5L!KUE*?iOzYmJL7k~%O9ak=M0{i%`+#@n0qMSNie!^bjRqEV;e@dk3KTGdvwp( zt-2DAJ~6s~^s%vxT-?ruePf%#mlceDc=U;}_j2(Lj>pGt@UJcyy=(O0-1!rQ^N$tI zw~g)?yP>6)`_o#vxqI}bZXJ8?*ru3EJ9&a`tF;)`Y@xe*xC5j$LC=(VQ)W_{ zM)t*C*f6>qhTbr?MVzs&isA_S5msS@%xwlytErPHI) z2dDtq4opKXwp)*$pqL30WW^pD*{Bb&!=GxnS4Nmlod-4=~*rlQBJ%aX)q zy}2=$lt!a>Q@;$!6QWpkiyPZ*WJCvQBMqT_$~`OzNqTIuupidbF)52!{3M;>gohsX zYR7KY1N%7Hsps}v6B{WdEAN8uwVi2G7KTM$B(OuB9+smn=W<1+7*m~>vmeJe2d6%o8tUmIks^WEL zg^#`bxE4CTC2NDNo4erK2AG5F zOQa>;GLl=P(R*e59+8wFLy1VG1#aV3Fsd|2Guvr;|LCK!NXuQBd`**ml%Y%LY?8sn zC+UlgsL89#OX73dP?6yfMh@xWza6Ii)RvPhWaJUw?GqL~${BQk6&8gxSy7o}<-xXy z9gLz>>jwAo$kBFfV9|GqbR;~G*DbG@!Q5>;l?a+uG`j~6P&Jc~9W=F1c5|1UVbTm@ zBW+^fu&x_9d%|qa*8EBX0b>4pN}LGyVrDSX<^%QrGbDs>J!!*&U65}

T(b^F$kD zJ4bgS<_akA6#G#@*^Gz94?UFeBogIE#5jgz3l`Xzn~T6?4_)CgtO{-JOp9+~vufEB z$sRhMQ(VGhS-YPqDJC1L@{Q$Qi6TyH(x%2{w6S!VDknkRxh!JYdgX-lO`@`8&F^WM zu)1K(C{(DTUus=ovWvfT3P#q5)uQG8buhT)(iQ_7|}M> znSoQ69+$gA^DLk@auOAnYfU~QVKQe#5oj?YDDk!+StkmN^FfGlF{6_S|3YJk6d^Cq zrB*-jr#rZ4zPiwdo1kz@YLK_c|C@Ed`w~%Ql*tFk;}q3FfS`6D*j)8Q(hlL-+N7Fp z4`s*|KXD;+hEtCNg0as`0^DWGl4UQ7Qt^#Yl0jsipsy_{Hy~yUb|EIR3eF@mmCQH9 zJE?4<@u`c)z9LnUt;a?U$@;;y94i@QbxVdzeM4dtBHIuLhBjpnjlpaNo!DLWO+lDA zJxtJ{4r#V4TYIy@>1M1V64azxqy#)wfLx#|8vO*cBy&m?M>)oBw1JVIBMP)g8yTPr z8?=>AUoUhJPo1G?wb1oeJ|SZI4x%YWx%6~*DmDaS#%3-c#bFRa{GN7Ua*cRD#W{JO zePi#>b53?n!FsS9C;^|OWMj8sU*2o%G5e9#l_@7eG*PMK-3fO!w6KKgOc9O0AuiUi zl&J)QBK^@E%*0Evhr$ysa_I*f?ur>xCs8(#yoCnsacX;1_I1F_UKm*0qnO+(0p_Z?#1-SFp@xZrj|+@LXYjQLq~(@IlC6 zI1_xmeM@f)eKf{#==Yjb(ve&&F4=gD+K5OXV0WyqTEbFU5Mzz-fN~w>FF|+RGNe&*-qw!P)=Zs;j5w2$XbT5v}JQWrmFUpQ9kje5_Ac|#%|E8 z6GfBUNrK#%1(jrUWpx=p&B#1$<@zFB;7N@!%?3|_V&0+}9%l+mWmc7$7dIDj`a#`z zd^f3@7S+q#PP;=(6g1^MIO5?Qw0kHfH8!W=*2Fl#sBMtzXI7zv&p!DX8>VC`0o6&I z4c!MvMDRI*iY8YG+B2Pg*6S|h$PTXlG6o_qJCH~Pdp72o=oFE_9m+yxQj`C4ExQX* z?y0QZU|N)II$)u5mYS0yA=n8K@M7^Q<*5zcnB4#-Gl3XQE0}~ zmxF3yrn^DnoSrR<>WQ_)?>@!qV#@sy)w zuO)NQ=%=~!tOow_wK7!}nCyTor934!P^U;uR(e0Q;-2ncAS?t+byJE_;D~7^0;ut# z0~B>t3z8x>wR@_43+@7;C@Y^NadTr4Y{H#1unEcVsf7E<9LJ5Rnb0qua^hUpM5sHz zPGHL^J_MQ4fj?uLC;INT(QUMvc`$fB=iPyY#t_ps>2hSH~&135G}002aFLvH4uG#7Hla&?N|tO+zH246udMrg=V0 zOj(fBP560RRN7UD(LJEs#xNHjAAN-7Afnk^dH{Kl7$?gFyW2mWA<-9p+ARniSXCNx>JN(oZCQ(@ zkYy!smwmJFtU%SKaoUA=pUokWNT_u|8v8!$mHdMizz7D&gC(<_Bwmn88Vi&=nowpE z%bqk73_kM-S|0!TGCpU_fvwQ{#5KelnZ(F=eNWPJN^cS%B>hj9*h`;%M6-rXW}aDt zC&{c7N!B_c1@@(b#r34ZgXNVs4S%X$OkN6-VCKK{`CuV(@r_xCWbiOZ3UVg-a7sgV z(W~rP^E$iI6rY@F7*}6X+-~b81$$Jw43aW`B03dKn0g$L3G$~h)^AJ8vhcWOq*Yyz z1c@{Y%w>%6Xh}}3sAdw?j6X=yf#WKxWh=}gOj1}AdBBH=%%l;9(^8QdHk2D+h2CsO z>nf&2O(x%IvT?kQmXMe><+-JFgvYC zYF%ofkrBrWa-aE-@A`qAo)sh8*CzNVry74HhIl5CsJ67kDZKV(QGa&j;erd^ir@?Dso;U z3KQ1FkO(ujlk!KNZPoGus{x6%lG`MMXqPrL1q>HxLadw{FDi4RG(c=M?Tl|en%}SG zIAw)GN+A<7q&aK%-gz>#M28Y)$p|dbAjC+z#z9`IxuhJzfP6(}Z1NRZ#q=qpfJ|_k zijy>x>4$_0^O7w8=1e2k3I2oO@$8!dh<3GWwI`=NSbg$TQf<7SHMCbtIOB}Jwdh;u z%w;s?eSAR_p}EJ}%s%h+#gnpSCTd8QnGjZA|GG^9sd8g^rL%!&Cky3OR8(t-jb(ei=c;bSC4`@)NUsed0j(#<>*NMBE6U+^8^xP-}5QKF7LC{ z#6pd<$GM6WB%AV@O;0zFnu^&=;zb@FTzy_udzlXu%Gg*(eGurTa>8`qsMDGvy^zr= zBhA!$SMVR10S>cprE^<}cU$5d*S6uw4OgC7WyHAokP~sUoE^M2JTI*#uM)OLCm+*k zfqOz3=3P_1I$)9_EMY|1H53z7?BC^FR&Ov5?#wfTk=M3V)|*z7$fT%&;ftRSzL{U= z$^QXj3RUt_F<)z4N@HRa@V*Fr`Zd#NFxE0G%2;Txu~MGH)j_^>?lnC?Z}jGlyIoNvS!l5$M7m|mUa8p1 z=_U5hmdmn1j#67pTr5ru%Mue;_6U)Nug!V@A*B})3Bfjkgj*Jnut*&l;mV6;yrhu@ zJ;7{R&V|K!NrAEhzH=?OMH80V}WN5`q@1&}MugnS&uOW(Q0o)$yWz z-()+~5kf82+?qOcYsyl(*~WIa`JVMQBuHK%6g}FQe)BrvVm_mf78Cm<;Q-4&xkXTI zbKZpw*lzNiV-?iu8`=>MOhn*9hLgI@m$uu>0#ZNOl4OY#rfF;5qh`AmM*F)4&fdVH zJ#fSbQ#37hi#w)_xuvl&d+P-T=*2L4aicvJPE&i&?#AXFW@*-jUL0eow$1RtldOpP zt}KKk%u9;f8a$`%B8tjr8b-~E2lIQ1J$OQ~B!lDcUHG)b4Cab0Y)`kOdHV)5<(pKs ztPGgoBXZ;;En?NP=_J(+fp&wYyWNaQ7UO3}QPbV@Ywn}b`{@oZ(6WzDbl9B6$4?xy zsj)Vr+B?I|`buAqbRCggXx0>7iDU+X6eZi(VV{>O6BBW~T=0wxS&k=>+n}vU>UBB| zWcTj)JQ&T?8X=y+WtI)Lh|ME2BFRlDOUyDIMEz8G?}1c_2$hrUU*dnD)uCJMt2^z~ zHr0(g4vAumVZV;S><16 zG288mKAEO-`GWDfm(|$3McyhqWAPj=UeeDO^x8*_S2F z`q{pSaY@V9Xt8zb62pRES+^|0%e&8PI5zGEk#QI$ZCBcwIg8|3`IB@%j`R5Lpb8RW zV@Xi!V#MQLc%_%mo156ouGkC%6_IA(snfkB+8;LA%B5RHm%@OAHYap=lWoQV5)E{) zE>NpW$^Pk(wkYiILqmXF?sC2#hy{QDw|%kU$v&dx0_xVMmcZOi|*rtXx=w7G1%B zSRIH^8^ZP!Rj#$8iKL1w^o4ms2<2?zrI~`wdc>zTjo6n{*yH&bOG^80N~l$BSX_%RMPnz z)^#!)B~^n>u@rM{Gs)1KIU8;5CwW2k{j`$bvPpU|Gn)@@D?+&i+@)4r4W(1NOskon zT`BdF1XCqhKxMS_O+UyW2}WM{c9WFXrY*^@w3HI0>D#YebNEfpQp$tcnbPp0B@EMu z>HYbwX;7dUq~$wAO_JKmdP599Ss?eFrM0l!RF9_7`$;F|BHB zt`l0php}X^;wIbpW^ZTa=MD!}If|XkXJlw)?9vu9U9mRZ5*iJf_j*XM`^58 zeCZopA%?+TD?w{|l}#4nP47U+jB6^KNm*l?^S307l3xDbpyq>^O711ugtlU2m|FNt zG})TVAJ?N=1Y-bhrD`Qtc>QLpQ5#~fY|O0uGND3g#wAy7{uFUEedRL|dH9^l3G{lp zI`_r~Mp0Lv4H_0eLtv7LIDM7Vyg`}OpkGDjz zxfpHl%6yjt`*m^;*jJj#gh*$DGm1t(DI4JPZcRsRMAEf7HDC&>4K4E1>4V~SmKxSk zGv-s4MBY~qsczyZ)XaYINn>l8nkQNfyZw~66~E**nI4)B7(}oxaU&zs8}NW=5T!YsI`0!;brj& z+AWrS10ti(-DaW^yM{a$b=tmPF8Qr2IE@-Hbz&6uGK`#Z5LhB(TCB0}5=>VLHAl)TuI51| zKxQ2orOZ-0<4fa7I@4N`8_X*g0};O3Gg$v-kdJ(7%`3IN`P${3v%AiHb8CtIrqb)n z-e|kbfsG<2iRp;gI{tcM>ywjsvv!QvVF4$R?fw!T2VM(&22m7PZPoPWb*QTJS=5^GXe5VxD zOe3-8;uRzye*S zjK`^MNidN~VoAm?p0a$(L9`;_OJZKxyXopMY?dI2HPWP}-?QN%ypZJ(QBZG(KqV|H3y`JH@a;w(*YNvq$)%f5Ji5khCyQQkHr7Xt zGGB9}J#VU=S+8*d!5zD;ZT2dOX^17#HA6n8e4iXAq^)uaGAH7EHmjj9#Wk24X2UZh zN&m7k7*9E#nc8P$KnaO_+{fXveK`m7@r+ja(5pqwV~d*}TRk~VX-`hFBSle)ePy+1 z46mOA^4q%IR)3CUE8vv!jc1E9>Dl18o5`z?vyf(mbltPqOs-aUSF~b#FpQhVa!ur0 z=LPwn__)BIx<|7t-7_Qq#l{%CsWE8BAZHJSKL-)G~JZj z#jQAA8P9jG<|xJNjhQOVOl(%~f*GO@Pql7Cew!<|L4z|-NfFH#=iH)LRCt?-o|M(t zQdM)~qs5ZBT9TJrO1pyON&fXEaF%n0d(a-zFD{vGA9;(|y&-f{So0(%C1u(iOtLn4 z$*>TG|KDmk$(gB531-W{<$Ej7li{TA<;zpwG9Ydp^Bz85s|mQ}w8hvx$;y){lIgm> z8+c#A@P;iY6Hr{BjqXX8ZbX!l^pQ27?OMzf+)xxHs@-TPl2m}Nw5Vjkm6Nb4x0Pm^hF&i@yYJ4{P#fT zesR*}u*j)as?4-0IY*32rl!DIlM}==4H3))G5&ZXeGCI;79qG9LKQ?R_eQ6lpG3cW zFZZOFN!x`VwzMU$BKa1}pl^I{x-Dk#Sh{Y}($`F3MGHjv`RY9ArthlGzsIjn+N=8AQYCfp$ z(1+ZF+!VWHH)ruFggAs8@L*3_&9Wq;PiF6!cY$5{TF6{Bm9fLTSzq9Xef<-BMFxFe zkS*<)!49#j-_&T?4pLR-+dpkONL8#|-@#pUPIlOqLY$C-x5tVq_F{CJ%NdqI3m!d_ zMv?(ChY^A`+xR?@n=$RqPCbm}1SYnTF7>sEZFD}!1_uYq*m%m%GtkP?Fodn1LZhMm zAIvbA)rj-0A*^eOHq{2_oPMitA#F8FX>*t&TLj8Z*t2{tX&M1Ci$$ZksEE;%L9`vo zvVM%Euk_nQBN=bz95nYV^r_hx^?f`sbz{xg8N)2k&4A1Mq~qK4JjMAPLNSRo`{+tC zF}IK2$MG?K66pTX`@-*}ih~~fSv6ss7eCpNWG#>_emPZ44aHg(IbflfD)v5xjY$H> z=1(L>{HE%p+Ud1+Boh)w1rGV|dv>di{5*+ls2!UgCc2{&@z;rUO$*->;wwEw4q_^f zAyb7es&^f7CrG@)6xz;+MMTGwRTO@cF=Ldoe_IS zKSz=Z3PB5YNp|{CO;DI8VrOJaEQ`U=1f#F$F3qV~>KFn%h)Un%hkek=GtRL6V_T^i zX65rb$#RF-rXZ2~No0odWM(G$d<|BQx=EdAXnd(4QQQK(Vajb^(T)6-Y)^#nmS3V3 zIju4ZHx%xS-4M}8-dq?vlH4Ow3>%$EnH315S!+AV@7Jmh^;hXP+5fqASDL+7SPVnOO+l1bSlD{?teC~3NR099Fjhr#eoR^}JX-eo2}iJ&CEyNjg` zzq(70LMT3#v7*VZL6QBiD8r>Vn3u4vBL90P(ja)VNz*|-XL22q+AU*f^Rrcxcx>t0 zHcb)_NQjJ;tc8RuSbhnUAAOoUL3%VF^luU?w$t0fGH}vY(*@ZF3P^g9K8XQWTGJ?q zbC#7YNxstT&%`B?ju<@?+nqw!6rxyrvTYJO))6)PPq#pbdY@0qqWUH-kqO22 zRfbApGVrE=En%vZXafSbEBuPH%^q5#q>1;NOHR{e>-=bF;Suq$m?UAkF|rxtDD$*k z`E%0~OXV?g7RibIHvOam{a7KV<^A#L7msBekV`3^fuBLO=w|s~`NP?eB^@t0D}Ol% z=4FByDP@biAriXWoXxn^L`!_rBmwq3WY-LR=AxV%{UT2o^D{%uX2PIjx?vr&Hwkb4 zS=)t~3HBh?bM7{S&8P#v)OXO2UM1EmbDIusq3gD)e6WORWCN3>h1v$FMN60A5Xa=B z=|BxU!Lm?XApmj$lZuX~jlCuC$oqoZ)b2#iE2P?<%~qd!$bQZCDK@veLkkxQzoh*X z^X>y^{i%n-FMJ>1bEUqigjY{J6n^kq^?x$Av)|>vA^t4& z0Fx(aF$2S#8L0_gFu(cNET&~MB$Tqawv-W)515<-7=(7rJQz~U&g|n&C~>&uO2$T4Zj zAbBxX#+I6h@F!6x=7XO2jv1dnw#+ulB76H8c8w-uqtHusQrpv+gqlZBzMz4eSmGg# zG4@E9URYF`cvwxwwA?5UYhRgW(_p$1c&@_UkgbkHoGOp1xWJ-~;Dxy$T?lFCyiqgT zoH1!+DH)X*zG2Ihsp8kqcu$cxfJ?QWD?lYl3i?raTBXBn?S zQ8H1^S>k$1%a6fXn|w-8)Jf8IjJiVntzt)d!D8Q(1DfR7RL`xoR(@r!X(FsknIG`H zv(kT_lrml+hk95;Si%u}K5U`&{5P%@JV}x1PHFbr@Qn4%SV&`%Xo_;ckI;XL7!iqL zWp}!tv*_H#7c4SbEX*P&3ST6VT5qu@%|+TE`}SEJSJ;pT)3_N=TdwH97?pTH>s=Cp zAY_@elG1Vr%E`(ufic&+eSr+1W{qMWR8fT&P*y%nd6SvbA~$v)wa43Qm+7*ESxR z@JxIZqTX~urN%_J=l4^4uO90QpCtuNRXULQk?EzR9#Qh`uw?hBFGRvgkRRxAx%R>u zC!W&IGut{LO0xGSoJBbC*+;T1mv0-+#LR^tAKB3)Nmkv>rgJMR{F1O{U~kPI@Kf^+ z?y;qle~i&|9VnaI+!im_>Hf=5d=o1CkYzNbNMA&zg-Six*^kn$2gXxmgD~j$y?#C&_Y46T6eK J=`HJ8{|EI%^N9ce literal 0 HcmV?d00001 diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..95aa92c --- /dev/null +++ b/po/uk.po @@ -0,0 +1,2084 @@ +# Ukrainian translation of GLIB library. +# Copyright (C) 2001-2004 Free Software Foundation, Inc. +# Yuri Syrota , 2001, 2004. +# Maxim Dziumanenko , 2004-2009 +# +# wanderlust , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 20010-03-26 14:56+0300\n" +"Last-Translator: Maxim Dziumanenko \n" +"Language-Team: ukrainian >\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочікуваний атрибут \"%s\" для елемента \"%s\"" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрибут \"%s\" для елемента \"%s\" не існує" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочікуваний тег \"%s\", очікувався тег \"%s\"" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочікуваний тег '%s' у '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Не вдається знайти правильний файл закладок у каталогах даних" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Файл закладок для URI '%s' вже існує" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Не знайдено закладки для URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Не визначено тип MIME у закладці для URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Не вказано приватну ознаку у закладці для URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Не встановлено групи у закладці для URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Не зареєстровано програму з назвою '%s' для закладки '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Помилка розкривання рядка виконання \"%s\" для URI %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Перетворення з набору символів \"%s\" у \"%s\" не підтримується" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не вдається відкрити модуль перетворення з \"%s\" у \"%s\"" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Неправильна послідовність байтів у перетворюваних вхідних даних" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Помилка під час перетворення: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Незавершена символьна послідовність на кінці вводу" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Неможливо коректно перетворити символ \"%s\" у символ з набору \"%s\"" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Ідентифікатор URI \"%s\" не є абсолютним ідентифікатором при використанні " +"схеми \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Ідентифікатор URI \"%s\" локального файла не може містити символ \"#\"" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI \"%s\" - неправильний" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Неправильна назва вузла в URI \"%s\"" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Ідентифікатор URI \"%s\" містить неправильно екранований символ" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Шлях \"%s\" не є абсолютним" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Неправильна назва вузла" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Помилка відкривання каталогу \"%s\": %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не вдається виділити %lu байтів для зчитування файла \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файл \"%s\" занадто великий" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Помилка зчитування з файлу \"%s\": %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Помилка відкривання файлу \"%s\": %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Помилка отримання атрибутів файлу \"%s\": помилка fstat(): %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Помилка відкривання файлу \"%s\": помилка fdopen(): %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Помилка перейменування файлу \"%s\" на \"%s\": помилка g_rename(): %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Помилка створення файлу \"%s\": %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Помилка відкривання файлу \"%s\" для запису: помилка fdopen(): %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Помилка запису у файл \"%s\": помилка fwrite(): %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Помилка запису у файл '%s': помилка fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Помилка запису у файл '%s': помилка fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Помилка закривання файлу \"%s\": помилка fclose(): %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Не вдається видалити існуючий файл \"%s\": помилка g_unlink(): %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблон \"%s\" неправильний, бо не може містити \"%s\"" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон \"%s\" не містить XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u байт" +msgstr[1] "%u байти" +msgstr[2] "%u байтів" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f кбайт" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Мбайт" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Гбайт" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ТБайт" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f ПетаБайт" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ЕксаБайт" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Помилка читання символічного посилання \"%s\": %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Символічні посилання не підтримуються" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не вдається відкрити модуль перетворення з \"%s\" у \"%s\": %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Не вдається виконати безпосереднє зчитування у функції " +"g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "В буфері зчитування лишились не перетворені дані" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Канал завершується на неповному символі" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Не можна виконувати безпосереднє зчитування у функції " +"g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Помилка відкривання файлу \"%s\": помилка open(): %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Помилка створення карти файлу \"%s\": помилка mmap(): %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Помилка в рядку %d на символі %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" +"Текст закодований як UTF-8 неприпустимим способом - некоректна послідовність " +"'%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' - недопустиме ім'я" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' - недопустиме ім'я: '%c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Помилка в рядку %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Помилка аналізу '%-.*s', де має бути число у символьному посиланні " +"(наприклад, ê), можливо, число надто велике" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Посилання на символ не закінчується крапкою з комою, схоже символ \"&\" було " +"використано не для позначення початку предикату – екрануйте його як &." + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Посилання на символ \"%-.*s\" не визначає дозволений символ" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Виявлено порожній предикат \"&;\"; допустимими предикатами є: & " " +"< > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Назва елементу '%-.*s' невідома" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Предикат не закінчується крапкою з комою; очевидно, що символ & було " +"використано не для позначення початку предикату – екрануйте його як &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ має починатися з елемента (наприклад, )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Символ \"%s\" не дозволяється вживати після символу \"<\", він не може " +"починати назву елемента" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Зайвий символ \"%s\", очікувався символ \">\" для закриття тегу порожнього " +"елементу \"%s\"" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Зайвий символ \"%s\", очікувався символ \"=\" після назви ознаки \"%s\" " +"елемента \"%s\"" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Зайвий символ \"%s\", очікувались символи \">\" чи \"/\", для закриття " +"початкового тегу елементу \"%s\", чи додаткова ознака; можливо, було " +"використано неприпустимий символ в назві ознаки" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Зайвий символ \"%s\", очікувались відкриваючі лапки після знаку рівності на " +"присвоєнні значення ознаці \"%s\" елементу \"%s\"" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Символ \"%s\" неприпустимий на закритті назви елемента \"%s\"; припустимим " +"символом є \">\"" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Було закрито не відкритий елемент \"%s\"" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Було закрито елемент \"%s\", але зараз відрито елемент \"%s\"" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Документ порожній чи містить лише пропуски" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ раптово закінчився відразу після початкової кутової дужки \"<\"" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ раптово закінчився, коли деякі елементи ще були відкритими – \"%s\" " +"був останнім відкритим елементом" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ раптово закінчився, очікувалась кінцева кутова дужка для закриття " +"тегу <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ раптово закінчився посеред назви елемента" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ раптово закінчився посеред назви ознаки" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ раптово закінчився у середині тегу, що відкривав елемент" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ раптово закінчився після знака рівності, що йшов за назвою ознаки; " +"значення ознаки не вказано" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ раптово закінчився посеред значення ознаки" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Документ раптово закінчився у середині тегу, що закривав елемент \"%s\"" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документ раптово закінчився у середині коментарю чи інструкції обробки" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "пошкоджений об'єкт" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "внутрішня помилка або пошкоджений об'єкт" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "недостатньо пам'яті" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "закінчилось обмеження зворотного ходу" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблон містить елементи, які не підтримуються при пошуку часткової " +"відповідності" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "внутрішня помилка" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"умови у вигляді зворотних посилань при пошуку часткової відповідності не " +"підтримуються" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "досягнуто межу рекурсії" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "досягнуто межу робочого простору для порожніх підрядків" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "некоректна комбінація ознак переведення рядка" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "невідома помилка" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ наприкінці шаблону" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c наприкінці шаблону" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "нерозпізнаний символ за послідовністю \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "escape-символи (\\l, \\L, \\u, \\U) неприпустимі тут" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "неправильний порядок чисел у специфікаторі {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "надто велике число у специфікаторі {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "відсутній завершальний символ ] для класу символів" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "Неправильна escape-послідовність у класі символів" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "неправильний порядок у діапазоні у класі символів" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "немає що повторювати" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "нерозпізнаний символ після (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "нерозпізнаний символ після (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "нерозпізнаний символ після (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "назви класів у стилі POSIX підтримуються лише у межах класі" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "відсутній завершальний символ )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") без початкової дужки (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(за ?R або (?[+-]цифри має бути вказано дужку )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "посилання на неіснуючий вкладений шаблон" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "відсутня дужка ) після коментаря" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "регулярний вираз надто довгий" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "не вдається отримати пам'ять" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "твердження lookbehind має не фіксовану довжину" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "неправильне число або назва після (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "група умови містить більше ніж дві гілки" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "після (?( очікується твердження" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "невідома POSIX-назва класу" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "елементи порівняння у стилі POSIX не підтримуються" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "значення символу у послідовності \\x{...} надто велике" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "неправильний вираз (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C неприпустимий у твердженні lookbehind" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "рекурсивний виклик може увійти у нескінчений цикл" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "відсутній завершальний символ у назві вкладеного шаблону" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "два іменовані вкладені шаблони мають однакову назву" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "неправильна послідовність \\P чи \\p" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "невідома назва властивості після \\P чи \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "вкладена назва шаблону надто довга (максимум 32 символів)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "надто багато іменованих вкладених шаблонів (максимум 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "вісімкове значення більше ніж \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "група DEFINE містить більш ніж одну гілку" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "повтор групи DEFINE неприпустимий" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "неузгоджені параметри NEWLINE" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g не завершується скріпленою назвою чи необов'язковим скріпленим не-" +"нульове число" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "неочікуваний повтор" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "переповнення коду" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "переповнення при компіляції робочого простору" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" +"раніше перевірений вкладений шаблон, на який йде посилання не знайдений" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Помилка під час пошуку відповідності регулярному виразу %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Бібліотека PCRE не підтримує UTF8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Бібліотека PCRE не підтримує властивості у кодуванні UTF8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Помилка при компіляції регулярного виразу %s на символі %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "При оптимізації регулярного виразу %s виникла помилка: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "очікується шістнадцяткова цифра або символ '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "очікується шістнадцяткова цифра" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "у символьному рядку відсутня '<'" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "незакінчене символьне посилання" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "символьне посилання нульової довжини" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "очікується цифра" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "некоректне символьне посилання" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "відкидати кінцеві '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "невідома escape-послідовність" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Під час розбору тексту заміни \"%s\" виникла помилка у символі з номером %" +"lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Текст в лапках не починається з лапок" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Невідповідні лапки у командному рядку чи іншому тексті оболонки" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текст закінчився перед символом \"\\\". (Текст був таким: \"%s\")" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текст закінчився перед відповідними лапками для %c. (Текст був таким: \"%s\")" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текст порожній (чи містить лише пропуски)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Помилка зчитування даних з дочірнього процесу" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Помилка створення каналу для обміну з дочірнім процесом (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Помилка зчитування з дочірнього каналу (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Помилка переходу в каталог \"%s\" (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Помилка виконання дочірнього процесу (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Неправильна назва програми: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Неправильний рядок у векторі аргументів %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Неправильний рядок у оточенні: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Неправильний робочий каталог: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не вдається виконати допоміжну програму (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочікувана помилка в зчитуванні даних з дочірнього процесу через " +"g_io_channel_win32_poll() " + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Помилка зчитування даних з дочірнього процесу (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочікувана помилка під час очікування на зміну стану файлового дескриптора " +"дочірнього процесу (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочікувана помилка у waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Помилка створення процесу (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Помилка виконання дочірнього процесу \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Помилка перенаправлення виводу чи вводу дочірнього процесу (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Помилка запуску дочірнього процесу (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Невідома помилка виконання дочірнього процесу \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Не вдається зчитати достатню кількість даних з дочірнього каналу (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Символ не входить в набір UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Неправильна послідовність у перетворюваному вводі" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Символ не входить в набір UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Використання:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[ПАРАМЕТР...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Параметри довідки:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Показати параметри довідки" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Показати усі параметри довідки" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Параметри програми:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не вдається розібрати числове ціле значення '%s' для %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Числове ціле значення '%s' для %s поза межами діапазону" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не вдається розібрати числове значення подвійної точності '%s' для %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Числове значення подвійної точності '%s' для %s поза межами діапазону" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Помилка розбору параметра %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Відсутній аргумент %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Невідомий параметр %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Не вдається знайти правильний ключовий файл у каталогах ключів" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Не є звичайним файлом" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Файл порожній" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ключовий файл містить рядок '%s, який не є парою ключ-значення, групою або " +"коментарем" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Неправильна назва групи: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Ключовий файл не починається з групи" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Неправильна назва ключа: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ключовий фал містить кодування, що не підтримується '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ключовий файл не містить групи '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ключовий файл не містить ключ '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Ключовий файл містить ключ '%s' зі значенням '%s', кодування якого не UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Ключовий файл містить ключ '%s', що має значення, яке не вдається розібрати." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ключ '%s' з файлу ключів містить значення, яке не вдається проаналізувати." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ключовий файл містить '%s' у групі '%s', що має значення, яке неможливо " +"розібрати." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ключовий файл не містить ключ '%s' у групі '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Ключовий файл містить escape-символ наприкінці рядка" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ключовий файл містить неправильну escape-послідовність '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Не вдається розібрати значення '%s' як число." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Числове ціле значення '%s' поза межами діапазону" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Значення '%s' не вдається перетворити у число з рухомою комою." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Не вдається розібрати значення '%s' як логічне значення." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "До %s передано надто велике значення лічильника" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Потік вже закрито" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Операцію скасовано" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Неправильний об'єкт, не ініціалізований" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Неправильна багатобайтова послідовність у перетворюваних вхідних даних" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Бракує простору для результату" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Ініціалізація з можливістю скасування не підтримується" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Невідомий тип" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "тип файлу %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "тип %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочікуваний передчасний кінець потоку" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Без назви" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "У Desktop-файлі не визначено поле Exec" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Неможливо знайти термінал, що потрібен програмі" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не вдається створити теку параметрів програми %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не вдається створити теку параметрів MIME %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не вдається створити для користувача desktop-файл %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Власне визначення %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "привід не має функції витягування носія" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"привід не має функції витягування носія або витягування з подальшою операцією" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "привід не має функції опитування наявності носія" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "у приводі не реалізована функція запуску" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "у приводі не реалізована функція зупинки" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Версія %d кодування GEmblem не підтримується" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Неправильна кількість лексем (%d) у кодуванні GEmblem" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Кодування GEmblemedIcon (версія %d) не підтримується" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Неправильна кількість лексем (%d) у кодуванні GEmblemedIcon" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Очікується GEmblem для GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Операція не підтримується" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Вкладена точка монтування не існує" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Не вдається копіювати у каталог" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Не вдається копіювати каталог у каталог" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Цільовий файл існує" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Не вдається рекурсивно скопіювати каталог" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "З'єднання не підтримується" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Помилка при з'єднанні файлу: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Не вдається скопіювати спеціальний файл" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Неправильне значення символьного посилання" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Смітник не підтримується" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "назви файлів не можуть містити символ '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "том не підтримує операцію монтування" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Не зареєстровано програму для обробки цього файлу" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Лічильник закрито" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Лічильник файлів має невиконані операції" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Лічильник файлів вже закритий" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Версія %d кодування GFileIcon не підтримується" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Неправильні вхідні дані GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Потік не підтримує query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Операція встановлення позиції не підтримується для потоків" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Операція урізання не підтримується для вхідного потоку" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Операція урізання не підтримується для потоку" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Неправильна кількість лексем (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Відсутній тип назви класу %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Для типу %s не реалізовано інтерфейс GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Тип %s не класифікований" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Неправильний номер версії: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Для типу %s не реалізовано from_tokens() у інтерфейсі GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Неможливо обробити вказану версію кодування значків" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Вхідний потік не підтримує операцію читання" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Для потоку є незавершена операція" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Бракує простору для адреси сокету" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Непідтримувана адреса сокету" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Не вдається знайти типовий різновид монітору локального каталогу" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Неправильна назва файлу %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Помилка при отриманні інформації з файлової системи: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Не можна перейменовувати кореневий каталог" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Помилка при перейменуванні файлу: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Не вдається перейменувати файлу, файл з такою назвою вже існує" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Неправильна назва файлу" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Помилка при відкриванні файлу: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Не вдається відкрити каталог" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Помилка при видаленні файлу: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Помилка при переміщенні файлу до смітника: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Помилка при створенні каталогу смітника %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Не вдається знайти каталог верхнього рівня для смітника" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "не вдається знайти чи створити каталог смітника" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Помилка створення файл у смітнику: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не вдається перемістити файл до смітника: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Помилка при створенні каталогу: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файлова система не підтримує символічні посилання" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Помилка при створенні символьного посилання: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Помилка при переміщенні файлу: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Не вдається перемістити каталог у каталог" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Помилка при створенні файлу резервної копії" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Помилка при зчитуванні цільового файлу: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Переміщення між різними точками монтування не підтримується" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Значення атрибуту не можу бути NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "неправильний тип атрибуту (очікувався рядок)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Неправильна назва розширеного атрибуту" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Помилка при встановленні розширеного атрибуту \"%s\": %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Помилка отримання інформації про файл \"%s\": %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (неправильне кодування)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Помилка отримання інформації для дескриптору файлу: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Неправильний тип атрибута (очікувався uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Неправильний тип атрибуту (очікувався uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Неправильний тип атрибуту (очікувався рядок байтів)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Помилка при встановленні прав доступу на символічне посилання" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Помилка встановлення прав доступу: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Помилка встановлення власник: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "символьне посилання не може мати значення NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Помилка при встановленні символьного посилання: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"помилка при встановленні символьного посилання: файл не є символьним " +"посиланням" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Помилка при встановленні часу зміни або доступу: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Контекст SELinux не може значення NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Помилка при встановленні контексту SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux не увімкнено у цій системі" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Встановлення атрибуту %s не підтримуються" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Помилка при читанні файлу: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Помилка при встановленні позиції у файлі: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Помилка при закриванні файлу: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Не вдається знайти типовий різновид монітору локального файлу" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Помилка при записі до файлу: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Помилка при видаленні старої резервної копії посилання: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Помилка при створенні резервної копії: %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Помилка при перейменуванні тимчасового файлу: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Помилка при усіканні файлу: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Помилка при відкритті файлу \"%s\": %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Цільовий файл є каталогом" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Цільовий файл не є звичайним файлом" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Файл був змінений іншою програмою" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Помилка при видаленні старого файлу: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "Вказано неправильний GSeekType" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Неправильний тип операції зміни позиції у файлі" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Не можна усікати GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Не можна змінювати розмір потоку виводу у пам'ять" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Помилка при зміні розміру потоку виводу у пам'ять" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Кількість пам'яті, потрібна для процесу запису, більша ніж доступний " +"адресний простір" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Виконувати переміщення на початок потоку" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Виконувати переміщення на кінець потоку" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "для точки монтування не реалізовано операцію «unmount»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "для точки монтування не реалізовано операцію витягування носія" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "У mount не реалізовано функцію «unmount» або «unmount_with_operation»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"для точки монтування не реалізовано операцію «eject» або «eject_with_operation»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "для точки монтування не «remount»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" +"для точки монтування не реалізовано автоматичне визначення типу контексту" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"для точки монтування не реалізовано автоматичне визначення типу синхронного " +"змісту" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Назва вузла '%s' містить '[' але не містить ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "У потоці виводу не реалізовано операцію запису" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Вхідний потік вже закритий" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Помилка розв'язання імені на адресу \"%s\": %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Помилка зворотного розв'язання імені за адресою \"%s\": %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Немає службового запису для '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Тимчасово неможливо розв'язати '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Помилка при розв'язанні імені %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Неправильний сокет, не ініціалізований" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Неправильний сокет, помилка ініціалізації через : %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Сокет вже закритий" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "створення GSocket з fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не вдається створити сокет: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Вказано невідомий протокол" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "не вдається отримати локальну адресу: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "не вдається отримати віддалену адресу: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "не вдається прослухати: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Помилка прив'язування до адреси: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Помилка при прийнятті з'єднання: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Помилка при з'єднанні:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "З'єднання триває" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Помилка при з'єднанні: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не вдається отримати помилку, що очікує: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Помилка при отриманні даних: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Помилка при надсиланні даних: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Помилка при закриванні сокету: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Очікується умова сокету: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Помилка при надсиланні повідомлення: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage не підтримується у windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Помилка при отриманні повідомлення: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "невідома помилка при з'єднанні" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Прослуховувач з'єднання вже завершився" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Доданий сокет закритий" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Версія %d кодування GThemedIcon не підтримується" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Очікується 1 керуюче повідомлення, отримано %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Неочікуваний тип допоміжних даних" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Очікувався один fd, але отримано %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Отримано неправильний fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Помилка при зчитуванні unix-сокету: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Помилка при закриванні unix-сокету: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Корінь файлової системи" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Помилка при записі до unix-сокету: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Адреси абстрактних unix-сокетів не підтримуються цією системою" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "том не підтримує операцію витягування носія" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"том не підтримує операцію витягування носія або ж витягування з операцією" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Не вдається знайти програму" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Помилка при запусканні програми: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "URI не підтримуються" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "Зміни асоціацій розширень не підтримуються на win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "Створення асоціацій розширень не підтримуються на win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Бракує пам'яті" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "внутрішня помилка: %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Потрібно більше вхідних даних" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Неправильно стиснені дані" diff --git a/po/vi.gmo b/po/vi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..2e1a38c15d55cd3e4ec44d3ff51f38450440f483 GIT binary patch literal 48196 zcmd6w37A|}nfI?cxB$u``+8YIcS|}XVNb%64G2j{NWvz;P+e8sU8cIKsU=B+fJ{VW zQxFkDWQoWiAO-|Q6LFbFRK{^;Tt=O7oM|1$aUX{fote*>@ArStxm#6rrvrS?^Yz2Y zzwW(feb2j{_ndqA;og68XTaZmuL^=gzBze+?cC?m;Cq6&wqyy=CD3U&<)Gr@B}wRah$;Azu?U=dgcZwH?NLvR^| zMbBaIFz|X%eEU&Q(|p+l{*+zx#^(FEdw$k3RrU z=lVquQ4UT##mUKALG|Mr5K#&~4643oLDAs_Q2ensm1-O-K$U+7DE`?3YFu9d-wgf^ zRDa(<=lB^M3yQCc{`xjh^Zz`kaz6zTg<#*=$Ot$W6#su6)cqGgrYtyoj_dDAQ1!0| z)t^luT?|G+wfBEO_3Nb5+&ET)YUgHu{aJ87uKyKO`Tqq~Uk}82Be)pUxGw?K?+xG{ z-~*uO@+7EyKLXXyfAhFMM3UY)9n}3k@Nn=(aBuKo@F4JWpvLoEQ2pBNOs9uV_1Nd} zW>Ecm3fv$3A$U0WBDg2G-&{xUE>Po{4eI_1P<)yPm45?x0Qez){|Qj@_Z%pG`30za zhoIy|?>XQR;2?M~coTRi_-7y@9Xtz)4ljbMz$x?5IpCF`^wcN_NrPP%po_tCK-GIE zsCvHys=XhB8vkn+y8g@nrH?NJMW<`QBf+~t(d!vd^ZQ%y5b#(U)AMsc(Pu5F`Zt1_ zuLnW(_fsIMBlsx@YXk?K?dJC)@EESwfvWc&Q0;yfJP`bMQ1suO!D;?Z0`~$Jftu$_ zL5<^DP~*H0JP-UO_&7Lw5j4>?sQwL{>+o7|3fFgm;@f9H(cwk#E#T3MogQ8W>iT*R z)f_wyO1}OH)VTfwJQh5L#zSxgsCw(5=(7nFeLfBD3w|F||9=CDA6~W8_5UDH{4xs^ z{g#0tcm=3@?*~=iqoC;URZw*Ldr#CJ2(sc9@q=Md6}D! zxuEFM01@%v7BB?A3U+}%1C@WT)$aXZ2!0tn1N;|o8hFh4PA)D0 z)$cMWe!dn|zc+(w=NVA^^%GF#4qV~*@EmYD*H?g|^G86<_cuV%<=3F*=XEO`Kg|T` za&SI~2n1U|_4g;B%Do<85x;eVYJVB1@>hVW@5A6;;HSXDz^{P2gZ~1mz8ApPfhS+! z=zj+ITCU#;s-HPf{eM4rJoqJ0^!ptcf=6BG#=ijEjqA(7H-lwR{dy<35BLxWYXzSJ zHSe##$n|pyh{y)ZLCyc2pyusyQ0@N`d?R@1#g0FZ1^49oGEn2MfFbx^Q0;65RsXZ# zo4_$pdgkB26TvrK;^ut;sQVRA`ELPL{$Wu4_&g|je&1jJH>iC3z17uwJg9k?2Z~>c z;QruEpy>Y*up9hKQ2g;CsQi0h>gqiaRQ`*=eZeXyy>LA!dD{wVeBS|21%C&sKgX?h zcs?k7SO+y9Pk_qzkD%uJz{_0uV?ouo7!1KHK+*I4;KAVi;7ssypz{3&RKNCpo14F0 zP~%$#9s-Vl;_nZFdw`z@#TVZI4**}i#`Wu9Q2c!fC^}pZs$ZV~4+XynD*q2b_2>7X z+TG=H*WRJv;atxHL$J@|Mvor_4-1e_@Feh`{q?~)=kLq{^?U%l^Ho9cZcz0dl6U+* z$KwKzOFXXfxY}a@G=2u(K>2rqcY!y7H-bkNoId_ID1PrMy7tclB{x@rYWERPba)PhLHGOwZ~@nO5LFy} z4D14b2f}*6p(VGz+5oCQ-|*MJ2G8Vr!P}i)y&jy$_18hww+Ed&1zZJc{%-}y4ns zy|U__*T7|5-vyoq{uG=AP8oK7=;ff~>^^_}=inJ!zv>Ej5S$A_`rs?zan!hQ1dkiz8QQExG(r&um}7ksC+*FRnPB1 zjrZUYN8d}q6S=+#RQ@l5YUk(R0pJ_2bbNUXD1KQ6>iK%`E#Tdt%6-}6Z$Qn{fmbj874Rad>gn3d?$D;_&hiZd=WexobjiwU+04}xV{cN415wi z3;d>ke&9ye{vz;r?l(Zy^D*#9@W&os`!44X_kiNF8mMtU2p$T4$6vqT@u=(FI(sFk zd_Mt2|9#)>#&<5L@!S9&4SoVtKfeWv4!hjo#&0B2<@!>~7)&C4Ae*HP9{NYW`u3ZLd+;@TE z|K~xq_fP)$o;N$bIu}&ATfo`i*F5fWi_=$g!F}``R6AS15d1DEI{d+3A9}0f%hN$U ze=DeZuL9o!eg-@O{4ux$+~vJakFEekuRFk{;ParydBFQz|1JWja=i&$06qtv3hs8B zz7_lfD1EZ>c6=)EA#g6Z&-jBaxEU3|Bj z$E(2;xc`3e0`M!~x!|Fj9X}6(8pqwB===k4F}UA{-Td}}qQ^DhEb#N7`1e0S)f?X9 z=HmkJB(6UUYW}|kY8?LqO0K)_b$oI*sPPPfqW6cvBfzhM;`5(_qWf#^b8@o?oWgY; zoCn?rs{OBnbHEos)ieEmd_-_HsBwNBRR50L;`s_Zi0e(@<=|7G=(+DlTz}_*;;SKW zxt@bIUk|wUP5~wVYe4nqc2N1B2B(An14@pM`>4}P7l9$ySAycV&7kP>7vS08s~>db z&jrum`gU+3_&1>DVgEmK`ucoO^tuvM`A>kN>rcQdz&##v_WC;T6s~^?ivHopT>lq) zyarS|Pk^GsZ^1*r-5+-2=>hlRdKq{Xm;?6!{{id%lX@4}!hmcR|hPE>E~|E(ND^{WehbybnAEd>&MNzXi_&kNu?U z&z0abu0H^t1CD}+gS$WJ*3nZzjblDI1FV2&g7<@O1INGx;F(Xk`M4g;bNw|??e%`j z(QyC_x&8zwKKLu}B5;pSyZIjg_vHFk@M!Q}a49$no(Asqw4>uPP;ylUXM$V6qrh*2 zXM%qK)z4EuT58v+S`Y!NvuKyA|8QlGI_`G0_6#f0R|FJJPg@<>L zmiv1r@>}Cg|3SjwUq}y-?&0|s|L{hB@6B(zU^1!sU(CIY;EN>9&&gcF;`aAeet(l+ zXM+C#UJYJF`o4Q?^RJ&jB^}`J&E>iNdcfJ>Uf|z?z2FA$a`14H{uVn3-oy2W{Jpn( z)T1dRra7pS5Ub!kp50A)J?RZ3(NlkC=r^gKq(7!QIE~*Ig2SYJ`Q7cGY0eQL(;1t= zUy=0pUjJObZy~*k>%RcMr5pb5t>8EOZ|&3R?|AT|;Qz5JWRB}a{@Jx2#Xpj*gSp<# z=ZoMOemp_igJr=tM1N*=qf&b|9 z2;RuOuYs45hWUN1Zt_>*_nW{qVDxvn|8cd)J3&M?xQsmC1J4292_8y%GrwN|&nJDC zq`#XS1iSF;Hj@4%hkNt;{iHYYdysS;X;1(BKlptsDf+vDAG1iW=J_VlYJMN!^IiO2J9DW9FOaL9_eTOts-qA{V%CWivHeBzPVgTE*t!=`Evix z^|}7{uHXl_{yeG6-}?~1^%s&bOTjNm(xLxD(jO+&bdi3qpv)1Z{rG(qX`ycVzlXrD zl8QWk2Y5T_T+%UI-%I)#zyF-1zn?e=F6927@Vg3*fbRqKw;%Yg;0%8~2b@h>NBTDR z|A}-KzYE|!qzgz=KvPM7&~N^R_#KjN;P;{6{v`b!1$Mii!3KW6hTqqaX8PwhgMa0p zzaL!1_1pZjQ#|T%gY;+m!C#a63rTPC&)>y8>Bae6U*Yd5-!jr^q~DXKlKM%zko5Ov z(&^+q#OGha^>qLHW`2K(bR$WBzb0MJv!h9aqz{s++`EMI5t9CXLHdpT!Y}0cU-J8K z(ix-z*ZTW8>Bpo~N!M|&4?KsYzxAZ&Nbe@CA?fdJ4uUIvd4FlpmAZJZ|GisFzOQiq z5Yj-){YBjS9cdc(KM0mdKP2hzw+_q?_?Z7a1pX)K-$?U(U8_Al&b={Gooo5>kMdi8 zdyy{kdF%%NoIrZ5zqp-e$C7R$Z6saH{ewu`{d0kAsQzBZ^E~N!ejjaj$jkK#|N9Ye zPtvPNHGl8R9tCCcR{Zr1{C*8dfB#I{hx9Dz2+|Ko`s*c~MB420y%T&7*JqJlNBR@4 z4+K9$Dv}Q5`fl(p(gpm!mGoJDUqrf+R3ho`e$wYi%XxkY>FxYpOZp?}9b6v^t|X1{ z`@cc`-O2AGNzvbJ{P-__@jmbaJUbp-0`3pK1-y%N9O=VcKS{cSbPd<%ll1rZ4uVgB zw{Y(;fBhY>hcu70lKWo=my+~%pM&7_;H5nKBzQ3C1b#0gMSu7DA0_UM^7}CGPr*65 zA9j~2>vH8%AuLw%)k3K<&=X9VHlsgWIM3nP9v6FD>T$WpRbV~rFO`dpk>R3#8+J{p zcZH>TSgAI`TW-0bv=#otZPnJ7(baEmKxzuZp6y<6$eU{FjonS z<>FAW(g-WLp<*!Enj3?~q~1Es9M?5Fw8F1o{pD)CnCYIiFgsM^IgPPcNID^Ube-PS zaReG#IPQ~KRGaS#gYGj{gwTt0lN_Piy!@g>D?NF|^mdv&Af)$Ibw{)~t%oRq$;)YVaQ4i+!)f<|puvsZ> z2n*Gr9J5fb=GPXP%0i)5tk;WfV(ZP};cBfxo7DC13CFFF;1 zxkJ?^(^%~fhl)eh+DKR{UePSo$l9oe!?kLjs*QB(Yo$g}Eho5LmzVccpz-DdFfbCs?} zn6D0xgayW&Z-@ZZb&M{)Oy?Q@NqxA;$ja7AR6-*xhRr&)EnT#9ApRMx1RaU6+*aYU`?sI1|hFhisd!Bxu#sI z6xYCKaHj9jBnmaEYl=*Rqhx=nQV3H$_qS=J0E?Ng1}>@uS)vN>y2BqhVl`C{2gY^hRez_X<*I|!mGk&Hn)W&l}3arPld zP8!h+*rj3}7#DShCi(S%is&GDhCbh%2EMp0U1+-$0RxL6x1)x{=t zX|wvs5G=aZq(wC~YRw8drWl^R)Ku4^%5bx>vH>p-1@j$ahgi0uQiV))@qA9LYtV@S zP)=_FO*8i+B$WZFZnW{LvwCNow4)rSq%zcs{lywqTWYI!+FP)NluK*HDkIgV^bDfM5Qm^z9f3<~kIjyV zUXec`-Cl1%3bW*uMyW9p_J+lJJ~vDc;~H}H@EERU2lK0FiM;7+sEAb$fz#E@z#DP?L*au6Ol zrG8{8y9t)(TNun5wkCX2JCW6?W^6fqFBDO32n>Aa`FX*@vlgAVFdV2=F)uVIQegV4 zHEB9#qFO12eJ~UI(F@WlnR%7fF_Y0h5-!|O%p=Ohav@ky%{R@dVwRZAW~I0Ry8@>$ z$GLtvY0{S1=Uf@HUK&tWVyBI%k4>Sp!fXhdx@CekVGH!WR1kyat3%ccB)~fWnqeLz zaK;3as;0F+lPnaOc@1Ibiu6WaRUF}7;Yto)c03YIm$WQm_b#L z@|;u8hjMH65bvk2%AyLRUs;=eTwT|JOqeOT^WhZd2Y~VLlSipqBHbAe&%~ia1~a)5 zm2sY>Zp+hC*Q&MvOh_%$9d)_2nfRIfg_fz$JZqU|Jm+G`2vNv2a;Z)v4~B4Aasz2z zs^K{q4g*mZI@zdg|}9T4xELV=3BJalKl$4m(|C zGKMFXx|yj@+*s@#Hv>A#I15$X(oo&&_!e45x7#U+KWALNa^aFvrMbb>cyU7`)te{> zcb#{Wcq=X36y+Qu^wl2)5xg={ETS}&p2H|Nny6Uo&|Yc{(c!6IQcUzjq)DP?zJOO6 zbwxQkOeMZ`EcC4$o_WS1DqkxNqdQYwAktGeeb6#1e!bJ7J?Bl}w+)xz(*d00fhJ)Z z8FV@7a$2Wgept`3*fCuY>pfR=DA#Z*sAI`g-&}S{^ib)_ahqx@5UGM%akxx;$lS{Y ztYFT2(y?+gU6O#4TEK5_A%sFv{z;++wBpcBn=i2xOc*U82*sJe7SVzOYnl}ab9WD` zTIQBpB1Yu;v%ODMD>FvBV%k`)+8z&=Sm$Yca`hph zB6W<)95(m>trtc9T6$Atv7(?{Hj`Fht^MwtbDZi1i)G~0Ei7|G?NtqHJ*yg>QM1{# z&PMUl6u}tQ+SVHEUbfFIJ&~S{H4@Q={xk{uC9~sEd?@EbZI0YST#uL4JkEG(Yyvzh zGpz+Zom@%d*kn?()$VLn6E*8%HQwu+DsMbL7}g14!y$t?f?R#LxvUs1>>aOWQtSLA z9@2fxQ8SM}VYXXlZ6K;pF7^;}VA=Y~i4X_fI0Wsls7J~Nq<%+|^k zR%NkLZ4L~!*Noq8QqsaFR>lW2Oim<8>beyRkmK`aU(d}ZgCK+TA$RH45x7dK+T?jrnt0gDZM3Gd# zim@Erw&khIFUqmXiNm9c`asxxmp%3#ejEq$@vQ7T*V9=QpbgGmXg)w(Y03Kp@KD5*nx4>ik; zk|Jp=Q?F=RxROB_Uy)7R<)+($mx@)DRM3pJIF~%*1aGrz@ebKCYjr)ZRS3ow<;a?d zEb<$lXRpLJUB%{QykS72ZZ)l->?v*sfGB}E5p>=N&}$@f*+h)EOsv^$BQ)%GW4E1- zIOx$cZf=Mn>lj5x#?RO!zRuSJ{q zxg@sZ4S7Kkja^Jr*)p>-=s7LUx36An}54S{<06ICyDX)30}Xhdj7BR3qMJr^>}URT+0u2f?! zpgn=9E}m(z^bVCZEAeKB(`Mp=?A*j=#C)w}Qj*%TIU;KB=sB~Nn&J+*F_!ENx%jQi z87wLGH*Ei#V3pex^qNPNnLpFl>}T^USi(AtP_qRCTg>UwTp3TCO;gIq$~bpU%PbjM z?Yss_7A$xlwZPwv>e?bZE8SBHJ!-6N6L|7vTDNPHlF>euYt>}XZ7N2Nm$!&w4|9-o z=pk6D-ASe`RuWoMp&FKI1Gul)STFb3w#Hhwx6Ug<1=}lfX7{{mXom!JP{-{x8I>$# z-SLD-K#5emP!S5&?xMZUZXm9<>8{S%ArL8()*?2)(!!3X)5Wu=Qj9BUFVzu_UYIK% zFTi+g49bQCODU!)l{q=rqAm>AO6zQmT4wh^ilt9fvi&tT=5b4Mlww_py;Wj*)tYNR z>YC9_)X%f)0kJhICW7XWOMLmHPC0#cbVQvr4n*}TCksH4&;lo(TvD;NJaEpiW%74y zQ^H8#j8Aj`rah0E!J=swnm|mjtdQQCRsT~PFC4u(tt;AC%53MkIYJtuT?iZbjw(An zb&g9b09g#%L)3;vZ&a1GaVA?GBiR(#5VI_4acW$glsJu|P3w??Wzjk!>!+vg z+x8RtzZ|&0{aNM~a9)o{ac4biTj2!D=dW0ZL1!D0@Gmm$VtUAhgjL=%w&@fFN@(5o zl)Mp{WWhN1vXzT2rgDygSmeiZf^AW?jAyxJl|aF_5-zuqm2B1fojUrbDROy&<*nx| zlBGuCxH#2!zNW`}@)23wF+*>FG=C;LHiy9q3-z0-aI)QB;GTJn+%zY$ugC<-SCJNG zE7FcA$dYKu?N+jFB}S@|Y=GIkEm7_EGiFf+?-1Z%V;!`G>6EWOfu}W1mbl8{`?JzV z&=amBVk>JCdkMkH!RmUQU-oeQKhE%tY1wOK=bdKT>PT;c3uYpX`D zcq!<+6GHFW$Qo^B1uI>S@fX@YLx%>_ds?l-U6t&fuu{UZ)r0gc)s}e8t&c>x7InUg zRXptOtzE=v-oXwpw!a{o$!nphQOrxVMg>sST4JhzHfu_#wWiIx^eip{n=-B`vJmKY zn;xDq<8ZrEO;QxjB$@w^pB8qn((by->6sepNmr9Teh_x8PO0MwimE0HWQ5(alP*qR zT$$EQr%$m^CODJ#arq>C^!K6BfBn-;W0ALLOSSd0XkCE!m|n>Uf1=WQ!cCA!9$&qSM< zUun&x@@k8MEdtv*Pa%+(~}l|pZ|zt{6( z`mt>}W9KuchwaGrnqj;N_)Tj;&6iu;X&WD(Aibx=km8=%IG9?@b{T3;rnn1qcdBE3 zuGAPV6{y4l@~JG5gG)Jk{osr#)UB{ zs4X&4ATw%rOfj1k(L@dFTufX?a#kYBim%tG;;ES$bcY5xKOGnFoNX2bwUhOgL|JX| zY5UBA7tDMW@vdRe@Jf5l{5aQ(3eCp@6Lr(Fw7I~}PXrg*ib}x-6PnC6YrL|m!%1uw z+1iQ%1bmFF9V16tuI98vD;IN>X{vt`+55{?JW01+pKO^Z_eF4uW=N9Y$H+t!xLK{3 z@LWU~Z@^b>rX>kM1eY#bzG~63^QKLkc3H4G6^6qm$VLUL=R0%ZH9J#K=EPfH5%*XN za~83-4qTn@R2Dtw6skMf$&B*q2(;l?A-~Ng(PtJysnt~UkT)K#EY_;N+dS>OnV%ks19+8(XCFg43*+~)3g1=wp1-#N$@FVGu{&Gp57DR_c8rAGB0f%zl~rn zR?tax#44h+0X}3qX8>mudLejPq_1AC9vPu0)Eq*e{`b* z0izs9q8&w-U16gmF6rGK)2lrl?_Os5wsnM2y-|7kt`0Q&ygqe-p5*<4Y}DjPW8Wi# z9XuCBT-Fv&pP-~<6}NtZ9L>sPb6ER6`=omyT?B>Qp5*|$Vp=GTJ5ueZ4`Q~eP1DaE zN}{IiSedO)hjC>C&kjcr;Z;}TLgYAv%o_ix{hxm?qMsJ5i-`BRT#Cb@$vUjpsWvhEy%PvLO0AX{VN~5VH3oi(BfXN z7Fs|;laus`Ol_y`62rsEH^?I0nF}*-j(B_T&02uZ&8xO7P#`HQ`yi>`iEL!e$)s4k#v`BH1NjnS!6^_BAq8zdJw4>*9c9dcHcp042R}WVQ>xhp)qVcTy z#E+$II-2!yi=yzSdY*p`kDG)@pcL922RycF| zjOo48kMEs%QaEGAtP@V@oqodf>16C(fv%89x8|D}&YUsp_?gE}KlS+OyDs4+nBG+= zi8`@AoidqU9wBfZt}GP_lK44!yFOD+RISWHX*5B6`OWge>uH zhy<3cveRs{ImxGyYgv)zOii&pgM*|9|+eDjy}cD!LjWR z42R{h?KkZFX9m`m#rTfKy_@})A_JMM{i|2b!_{6=BCV!29O_QQ*m(g z;o-0{`eeuew>GG0Y}-RkUr%H7kxDo+w(Se*>Gs=qzF(EGZBGojp5;fk7D=ouf%%e{-pK6;fMdW?<_U9gFhV!08ngBj{Fl{^{SfvR|OfsAM z7=nEZVG#4>K8BE|nyq0Siqp2uexCX1adfQbnt{9Y45EwfXx&dZEX9aOuSJ6^7!Ur zvQXwO%k%*MswHmRKp*Kgxhtdhj|5}eKj3SOOEm^Z9~lzGAMj)kE<_Y=$cF=iB`Xw; zj6Tv-shA7bjeb@YQt@U<+h$sNZVR67*!G9>*7b*T8h$d6`q;Kl@qF}tiVdoEZ6}Rw zzo!(e8vQIUi1QnHpg7M9W7{7@Sp>RCb(Lo~auc!K!i&BVGDk$Yb~`43TlOz@+MzM} zadAG9I07`8k$l(~eXKHQe8vE`Ka@+!mfa1`E{$$6n%>+}CdCH>ah_laQ-I)GZxdBg z&v6Qv`3|C`+H#K+JbfDJ&QZ_)vFdSQA!~o?_JDWGjo6GRF_>ix8;fY@<;0 ziG0jkB}5Dg)~w^=#9NtaxPV*oHoG!0Uu<;dixFL~aMkX+5=pHoHcXQv+v*if)C?{@ zx^H;U)P|WmC#U%)gV5aYwzhF?$`oo|Wyiddm|U$>a1L85@`saNb_M>8lgxCDH@c4f zIE#G%J5lx0t5_9(;37MmLJ0|MjzF=ryiGy~&2&#jLJ=~Sp;9=Jh-Z7iA;b~Wm3N{x zB=&9|VsV`st{eThdlKLCOn|k>P-MKS;+De!EI~dhgv7+wVh~l-Fn55v_m!+eo5W*S zGAZhfq4ed`cqH537nOJSWAaJL7=z#r>F}+lHMct5itOEw3ZeKW^Vek9v-RNhe1tim z4}+XviFGb2?x~X3&-g~IVn0qPGt{`e7%rV?*9%mx@Y$$7a}ZI|YcX%83mclCvF+E% zUT(vTDR0_RPbg6`&y7x>?O06PgR%sVS-n_%r+Z>=rY5N#Fn{8qO0YO`a-hHS6StJ? z*_NSjT}fwU^!<)WZ+mdaI{Yy99A?4)&C5p24hyE`8EQqGh^m6d=59C}f+*obyK2_SrzZLO z#Y{IF-?TfzPT@Ny{LwoV@bYj;?Jrr_WlW# zZ1-v%>NAe$Ga)8b8|_~ive+87i;?Li6SI!p7`I_0e5Z<9Xdh<>PavA4%D~{W(95&6 z7q|*MHWWpPy0ck(A`(~R5?+U&At%zY1Ld|9Y`WTu~#=`o$neHJnk5cDrRs z_j0>uvSBQmTK(?S^ri?4mmq2AAT2V*sY#vA>))x0D+A0*!X*>a8-ePDSW~`WI zi&uu**0Fk%q9ziMqQN@jto-OFeT+i-)l`QxX)2#-ahsI1#?Op#0)d;VGc5zAKM1F2 zPFR?Aq@JItbX{%=yX=!KoODXbxnGze!%6VO3$zoc)Bw8IO)Es-aS1OqHvmttE-&P= ztoC5(eHWdT0D8k9xDoR}NJn8P7U$cxvZ-JPWN%WBzzR<)ihHsDJ9NhEq zICX4CAB>@mr1DhH980_m55raP|K7LA3;-u$3)5+zPIGRBoXsx`$rZTS>mDC2u%Qw1 zgT^?Ej?2wMiL5N%YT6++GwNeRmZjaTHO&?~3aNU$D8-SbiOMVJlq#C(nD2V#9^QFt zPvkJMBPS8Dc!x#3QgyoL$>OMEcUoMTj(H%r!aA|PfMUBY8~=)*bu5nur-hHEV#`Q2 z5~Wo~=W(ScC0cNsOX9!B(^@LC+>E-KriMlB3h3PdUd>BfVc4%&{bR?-$Oh;3rr%8@~Q%#QST0VS9bZ*qbblBGePMTg=1n^_=6u_`#hwqk61 zL-EHcb#p%B5QKm8JIy9Zl`@8#hbOA6t?Nl)`LS@Zwzm|Gd5N{84az#UfV>Z3stp~q z?F%+>Eo1T@T}ls1Q9cC=jP&tLv~@p|Ew&&@UG)mjk1`wFF5s6VeyHbq7Cv8MLN zyT<;e4|yZBirHEus>NY&2hSq~nRO?#Lyf-T(C=T{?$f{O%CcmAv_dU#1orjx=O=*#5J4&dYJNeD( zCSASxU0(Y;A1>QL>yBTEMlbhdHw-5ntRv|}S)9hQ#eCK{wd^Uh%pd1ld0inreTuyi zSYiRwI)!D&-tN;-=_1bQjFfRp3;u&pJIs%_=*a(y)aLsdeU2*KdRn{0--ObUi;ALe zigGw1WjPS-`=`Q3?is46Lzvw~6uRsaQC&TuA}3m1Gd0h!xFG&*dlOeQQH=C&Gw%qv z5laB@ic=1ZlnZ`u>xA!Y{xpaBMg$MFHsh{)dg%eRxyjk?O8?%E95~(OnJM|= zRGOXAHLbNkt&1ve<|}V(h1@}JYrOfOy#@NaeY2lK*`;iov&0nGkLU|jW~Us3Opw`q ze`->ByRy=-Di&D#`c%S}nTSQwN4FmsZ5CR9(5;xq$!}gU?6gwF$%QVC#lZSMym2*RydsH^N}suf=TmIG; zACIpJ3r39STr5OK2XW-j1WP<~c_A<#Cq==;HcF4hXK9@9r301Y?U#-duS|tF+e>O4 zV&~k_`k_;w*ZO>g7 zh~2|CZ4a%m&f)0@r&l5Exu%*q*Q(vS-}UEI7woS?Z78)?r?GQ8mn3KF?0i~Vu3&*S zw%cxJc7#$>5*fsG3T5dqUdGiAlJkFUHBR-tH(y*43@x*;qz;q1ynqFj9t&^*b)w<$FnxuPtSoYc5)J-gMY7Z@K zKH^DNF?kv;Jecqw+ab|u9yyCTp<&c+%jozpZQVF=Vak|;1<{EQe`vvt&^a-<9&AuM zAI6pvshw~dNh&F%PCc}>ZiZ*PlCByvO-=_mQL-C4f+5S4qK~g!chiR*eB2KPB>KQ- z)8dm1nD5BR*2Zdnl2Yy2%xL}2(TS<%*`|&FjMtcLv1AUz$BGG3M^2JD(^f-j zY7-uqD3^7xGjpZtN^<#W-f`s&BH6Qb^I(O7`LJDD$+ak&7A*(wvU9C4LU!Za9B?U> z8+6`zjP+J9&(?dkbBou)>pW(@_=l4L!GgrnMQW93h2j8pjG+Z?;@aCthlBaJ zxaRiS!E`RXzdPUT%Le6EyE+=?U(s-1oU_BdX-%FvWFKiK=`bk7G{RCGHK#5+V=jdp zou*0F2kzXwA5&Y=hWN)s+%ryGlN0W?&X@%H+R_Ko+cL%xA~$HpYnv2yp314s9TmyY z30rbcbT(^8#Z!YdwPFEOr{Wcsdob+Ie!flzx!fn2(y@b0RkgUyVx^==tf#}w-r(8Wy1_Y4nfX_D>9q-^?A(p;s$UVNdY_6OJ3Yv< zj#y93See7%7IyI`>Qc(h`ylBk2%#ux7TAM56i-8RM&d+y1(Mb&=`z82^oBj8eh!<& zG>BH=&)$YJlX~~d%$04!OWdTF+_H)&XGZ>f$dgyuc2r)6CZm&s_WDUw^t=vx@pibJ zGX``N#4=x49M&F3PHh1oY2yW^4dL}chRhpxh? zi|ss<@p42F4i#k8G`8;?1)}8JC@9Lb+{)rKbzUYFLCj`#MsJ*)$)enQA)W!90*{53 zHzI7m(utos;4@@MlHOhSOwoZFait00M3QRq-<5n-u`A9i@y4h0x+fhzj-1i9uCUR6 zxiZN@N=ZHd7iwi&Adk| z8mBy9zAaUp68|!~MGt%(=?sa!RLIt!abh~g%^&lYd`r0#Z0sc^GsRNx%=&eueO#e1 z`Y9BY96@9l_DnG;ik4G!HZWc!in=>tJ#l|_rW&c6wZ8vQbfY2%P%G7`WJsO5!H0}s zYK7Uc$FVcy;vepbm^vM==v+&R26``8Gp-d8WjnNQ9c9JCk!iQ#{H(nSCz-w{LwCy< zhu2~)wf zU=C@-^la@*TGBo<3f~`*kP4MX!oBycr(XwSB-AEWX=3@#645;VvD$l1e`c^Yqg#EhKs2Kcv8ob zb&g71evCt~zPmh$e3{zlHomUYv=20CpNE;&saZ{UCGgp$BzS?%a*lphyF_e51eyf+ zn79nq=;KkJ8!t9PJNLKWAaIJf}{ zgA+h(D+O-*EIS_Ka#k>zH>d~MoFcQ{pH}D6rx?u1pr`L+L7E|j^977Sqjgi_1etZ; zQFak;gZtlAw`Sc6pJ;Q<>T&K-^f6dFP3S)ctJYy9M@jJ_6LKf?)m!DMDib4O6pX$Q zMComOdZ4ChdsA|!P-Fq-^OqH3Z%ww~P9W)1mB^}5| zZUaI<$;sK4P)#(`vDA6xk&1jppSfcmZoD<(ya$vPB{zEEUkvxGx*Qx4zOq$ zrdm@$9EIT9a;;T)M?%a1IU|)3?1YVp>XeGta5vE)v2{jtyIr%b8aPe0+(^RrcfF;@ zx-%V5+R0!u7Ult&U*x)@eeta7cgvgT!wQi}5})0g`T(A@lN0d;Oe6oK$w$|c2GZvu zlIIc>zC{AlKir6mT_(K}-{zvqL}p1C)!>*nlil}EBXt2h%+K}*1B-OJ@AY;gPFsgF zY?vr2%jduED_3c3+e6Y+Juj^SZ^}D=1o&lCAAKb_bYlq_(H3@Zc5aZ-hlKTcMqZY5 zRC%d&L?a#NbHgvKjc0F1u=wAsnj$E$n3;6%+De+Z=ybP~Cn9K33<<~p?gPOj4lzIg z`{EF!3}Uw{vF~1*qoZu;<%;u%Il+Lwp^2-mcA7A*BsPhBWKvr1VImJ4`EZW-PSu-o zLHeX~+`%pMR`g*%`}8s5;=&ZsA$I4QxNiZbPr;=(_9CLB*C#0nQg2x&rR{+ZTG?G& zV)DW%=ToA1bRe&f2sa-@n#|~11w1Yz=TDmNIzowN5^(+)E+4ZYjL43Rp1IFL& zXs(l+&2^(sIpu+NNm(+nok)zhg-G>rW?MU?yKdbv!$9y^CXo=4zRnz3oStBU z4Ht9I%Db-gJ*`uB4(<9iA~gw2wH; zC+?V+SFRB*6}7KbdFqN9a6~M+tudDD#J9RIZab2rjPcq1Xh!XmMe3qwO}ClsJQJGR z;_R+pUf7LzP}!YCPd3$;m_xq$EQ7pyIBL$0a_hu)#?Ylobf2*kS?BCT-sLDOw(>KF zA5bf7QfSY2wNttN8_wN|v&iQvRVK2Z&OdLno;z1bWP~Hj(#g+1vfYMGx)I~;Xi1Xs r41#t=8EFTGztNUGEOa7EAT{rIwA|t}qiWhX4q{7bc~>sAkPrSZAC>|y literal 0 HcmV?d00001 diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..d9ab476 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,2071 @@ +# Vietnamese translation for GLib. +# Copyright © 2010 GNOME i18n Project for Vietnamese. +# T.M.Thanh , 2002. +# Clytie Siddall , 2005-2010. +# Nguyễn Thái Ngọc Duy , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.19.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-03-22 21:32+0930\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: LocFactoryEditor 1.8\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Thuộc tính bất thường '%s' cho yếu tố '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Không tìm thấy thuộc tính '%s' của yếu tố '%s'" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Thẻ bất thường '%s', mong đợi thẻ '%s'" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Thẻ bất thường '%s' bên trong '%s'" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "Không tìm thấy tập tin liên kết lÆ°u hợp lệ trong các thÆ° mục dữ liệu" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Một liên kết lÆ°u URI '%s' đã có" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Không tìm thấy liên kết lÆ°u URI '%s'" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "ChÆ°a xác định kiểu MIME trong liên kết lÆ°u URI '%s'" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "ChÆ°a xác định cờ riêng trong liên kết lÆ°u URI '%s'" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "ChÆ°a đặt nhóm trong liên kết lÆ°u URI '%s'" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Không có ứng dụng tên '%s' đã đăng ký một liên kết lÆ°u '%s'" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Lỗi mở rộng dòng thá»±c hiện '%s' bằng URI '%s'" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Không hỗ trợ khả năng chuyển đổi từ bộ ký tá»± '%s' sang '%s'" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Không thể mở bộ chuyển đổi từ '%s' sang '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Gặp dây byte không hợp lệ trong dữ liệu nhập chuyển đổi" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Gặp lỗi khi chuyển đổi: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Dây ký tá»± riêng phần ở cuối dữ liệu nhập" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Không thể chuyển đổi đồ dữ trữ '%s' thành bộ mã '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI '%s' không phải là một URI tuyệt đối sá»­ dụng lược đồ 'file' (tập tin)" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Không cho phép URI tập tin cục bộ '%s' chứa dấu thăng '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' không hợp lệ" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Tên máy của URI '%s' không hợp lệ" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' chứa một số ký tá»± đã thoát không hợp lệ" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Tên đường dẫn '%s' không phải là một đường dẫn tuyệt đối" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Tên máy không hợp lệ" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gặp lỗi khi mở thÆ° mục '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Không thẻ cấp phát %lu byte để đọc tập tin '%s'" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Gặp lỗi khi đọc tập tin '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Tập tin \"%s\" quá lớn" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Lỗi đọc từ tập tin '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Lỗi mở tập tin '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Lỗi lấy các thuộc tính của tập tin '%s': lỗi 'fstat()': %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Lỗi mở tập tin '%s': lỗi 'fdopen()': %s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Lỗi thay đổi tên tập tin '%s' thành '%s': lỗi 'g_rename()': %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Lỗi tạo tập tin '%s': %s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Lỗi mở tập tin '%s': lỗi 'fdopen()': %s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Lỗi ghi tập tin '%s': lỗi 'fdopen()': %s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Lỗi ghi tập tin '%s': lỗi fflush(): %s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Lỗi ghi tập tin '%s': lỗi fsync(): %s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Lỗi đóng tập tin '%s': lỗi 'fclose()': %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Không thể gỡ bỏ tập tin tồn tại '%s': lỗi 'g_unlink()': %s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Biểu mẫu '%s' không hợp lệ, không nên chứa '%s'" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Biểu mẫu '%s' không chứa XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Lỗi đọc liên kết tượng trÆ°ng '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Không hỗ trợ khả năng sá»­ dụng liên kết tượng trÆ°ng" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Không thể mở bộ chuyển đổi từ '%s' sang '%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Không thể thá»±c hiện tiến trình đọc thô trong 'g_io_channel_read_line_string'" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Có dữ liệu chÆ°a được chuyển đổi còn lại nằm trong bộ đệm đọc" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Kênh tận hết trong ký tá»± riêng phần" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Không thể thá»±c hiện tiến trình đọc thô trong 'g_io_channel_read_to_end'" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Lỗi mở tập tin '%s': lỗi 'fdopen()': %s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Lỗi ánh xạ tập tin '%s': lỗi 'mmap()': %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Lỗi trên dòng %d ký tá»± %d: " + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Văn bản được mã hoá UTF-8 không hợp lệ '%s'" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' không phải là tên hợp lệ" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' không phải là tên hợp lệ: '%c'" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Lỗi trên dòng %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Lỗi phân tách '%-.*s', nó nên là một chữ số bên trong một tham chiếu ký tá»± " +"(v.d. 'ê') — có lẽ chÆ° số quá lớn." + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Tham chiếu ký tá»± không có dấu chấm phẩy cuối cùng; dường nhÆ° bạn đã dùng một " +"dấu và mà không định bắt đầu một thá»±c thể — hãy thoát dấu và nhÆ° là '&'" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tham chiếu ký tá»± '%-.*s' không mã hóa một ký tá»± được phép." + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Thấy thá»±c thể rỗng '&;'; những thá»±c thể hợp lệ là: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Thá»±c thể lạ '%-.*s'" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Thá»±c thể không có dấu chấm phẩy cuối cùng; dường nhÆ° bạn đã dùng dấu và mà " +"không định bắt đầu một thá»±c thể — hãy thoát dấu và nhÆ° là '&'" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Tài liệu phải bắt đầu bằng một yếu tố (v.d. [quyển sách])" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' không phải là một ký tá»± hợp lệ đi theo một dấu ngoặc nhọn mở '<' ; " +"không cho phép nó bắt đầu một tên yếu tố" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Ký tá»± lạ '%s', mong đợi một dấu ngoặc nhọn đóng '>' để kết thúc thẻ rỗng '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Ký tá»± lạ '%s', mong đợi một dấu bằng '=' nằm sau tên thuộc tính '%s' của yếu " +"tố '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Ký tá»± lạ '%s', mong đợi một dấu ngoặc nhọn đóng '>' hay dấu xuyệc '/' để kết " +"thúc thẻ khởi đầu của yếu tố '%s', hay tùy ý một thuộc tính; có lẽ bạn đã " +"dùng một ký tá»± không hợp lệ trong một tên thuộc tính." + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Ký tá»± lạ '%s', mong đợi một dấu nháy kép mở nằm sau dấu bằng khi đưa giá trị " +"cho thuộc tính '%s' của yếu tố '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' không phải là một ký tá»± hợp lệ nằm theo tên yếu tố đóng '%s'; ký tá»± " +"được phép là '>'." + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Yếu tố '%s' đã được đóng, không có yếu tố mở hiện thời" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Yếu tố '%s' đã được đóng, nhÆ°ng yếu tố mở hiện thời là '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Tài liệu rỗng hay chứa chỉ khoảng trắng" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Tài liệu đã kết thúc bất thường ngay sau một dấu ngoặc nhọn mở '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Tài liệu đã kết thúc bất thường với các yếu tố vẫn còn mở — '%s' là yếu tố " +"đã mở cuối cùng" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Tài liệu kết thúc bất thường, mong đợi thấy dấu ngoặc nhọn đóng kết thúc thẻ " +"'<%s/>'" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Tài liệu đã kết thúc bất thường bên trong một tên yếu tố" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Tài liệu đã kết thúc bất thường bên trong một tên thuộc tính" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Tài liệu đã kết thúc bất thường bên trong một thẻ mở yếu tố" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Tài liệu đã kết thúc bất thường sau dấu bằng nằm sau một tên thuộc tính; " +"không có giá trị thuộc tính" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Tài liệu đã kết thúc bất thường trong khi nằm trong một giá trị thuộc tính" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Tài liệu đã kết thúc bất thường bên trong thẻ đóng cho yếu tố '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Tài liệu đã kết thúc bất thường bên trong một chú thích hay hướng dẫn xá»­ lý" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "đối tượng bị hỏng" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "lỗi nội bộ hay đối tượng bị hỏng" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "hết bộ nhớ" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "không thể rút lùi nữa" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "mẫu chứa mục không được hỗ trợ khi khớp bộ phận" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "lỗi nội bộ" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "khi khớp bộ phận, không hỗ trợ rút lui làm điều kiện" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "không thể đề qui nữa" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "vùng làm việc không thể chứa chuỗi con rỗng nữa" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "kết hợp cờ dòng mới một cách không hợp lệ" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "lỗi lạ" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ ở kết thúc của mẫu" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c ở kết thúc của mẫu" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "có ký tá»± lạ phía sau \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"ở đây thì không cho phép ký tá»± thoát thay đổi chữ hoa/thường (\\l, \\L, \\u, " +"\\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "các con số không theo thứ tá»± đúng trong chuỗi xác định số lượng {}" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "con số quá lớn trong chuỗi xác định số lượng {}" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "thiếu ] chấm dứt cho hạng ký tá»±" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "gặp dây thoát không hợp lệ trong hạng ký tá»±" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "phạm vi không theo thứ tá»± đúng trong hạng ký tá»±" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "không có gì cần lặp lại" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "không nhận dạng ký tá»± nằm sau (?" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "không nhận dạng ký tá»± nằm sau (?<" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "không nhận dạng ký tá»± nằm sau (?P" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "Hạng POSIX có tên chỉ được hỗ trợ bên trong hạng" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "thiếu ) chấm dứt" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "có ) không có ( đầu tiên" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R hay (?[+-]chữ số phải có ) theo sau" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "tham chiếu đến mẫu phụ không tồn tại" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "thiếu ) nằm sau chú thích" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "biểu thức chính quy quá lớn" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "không lấy được bộ nhớ" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "khẳng định lookbehind (thấy ở sau) không có độ dài cố định" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "có con số hay tên dạng sai nằm sau (?(" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "nhóm điều kiện chứa nhiều hÆ¡n hai nhánh" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "mong đợi khẳng định nằm sau (?(" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "không rõ tên hạng POSIX" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "Không hỗ trợ yếu tố đối chiếu POSIX" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "dãy \\x{...} chứa giá trị ký tá»± quá lớn" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "điều kiện không hợp lệ (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C không được phép trong khẳng định lookbehind (thấy ở sau)" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "lời gọi đệ quy có thể bị lặp vô hạn" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "thiếu dấu chấm dứt trong tên mẫu phụ" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "hai mẫu phụ có tên cÅ©ng có cùng một tên" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "dãy \\P hay \\p dạng sai" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "có tên thuộc tính không rõ nằm sau \\P hay \\p" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "tên mẫu phụ quá dài (tối đa 32 ký tá»±)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "quá nhiều mẫu phụ có tên (tối đa 10 000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "giá trị bát phân lớn hÆ¡n \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "nhóm DEFINE (định nghÄ©a) chứa nhiều hÆ¡n một nhánh" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "không cho phép lặp lại một nhóm DEFINE (định nghÄ©a)" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "các tùy chọn NEWLINE (dòng mới) không thống nhất với nhau" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g không đi trước một tên có dấu ngoặc móc hoặc một con số không phải số " +"không có dấu ngoặc móc tùy chọn" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "lặp lại bất thường" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "tràn mã" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "tràn vùng làm việc biên dịch" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "không tìm thấy mẫu phụ đã tham chiếu mà đã kiểm tra trước" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Gặp lỗi trong khi khớp biểu thức chính quy %s: %s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "ThÆ° viện PCRE đã biên dịch không có khả năng hỗ trợ UTF-8" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "ThÆ° viện PCRE đã biên dịch không có khả năng hỗ trợ tài sản UTF-8" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Gặp lỗi trong khi biên dịch biểu thức chính quy %s ở ký tá»± %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Gặp lỗi trong khi tối hÆ°u hoá biểu thức chính quy %s: %s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "đợi chữ số thập lục hay dấu ngoặc móc đóng '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "đợi chữ số thập lục" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "thiếu dấu ngoặc nhọn mở '<' trong tham chiếu tượng trÆ°ng" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "tham chiếu tượng trÆ°ng chÆ°a hoàn thành" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "tham chiếu tượng trÆ°ng có độ dài số không" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "đợi chữ số" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "tham chiếu tượng trÆ°ng không cho phép" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "dấu xuyệc ngược kết thúc rải rác '\\'" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "dãy thoát lạ" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Gặp lỗi trong khi phân tách văn bản thay thế '%s' ở ký tá»± %lu: %s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Văn bản trích dẫn không bắt đầu bằng một dấu trích dẫn" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Dấu ngoặc kép không ăn khớp nằm trên dòng lệnh hay trong văn bản khác đã " +"trích dẫn trong trình bao" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Văn bản đã kết thúc ngay sau dấu xuyệc ngược '\\' (văn bản là '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Văn bản đã kết thúc trước khi tìm dấu ngoặc kép tÆ°Æ¡ng ứng với '%c' (văn bản " +"là '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Văn bản rỗng (hay chÆ°a chỉ khoảng trắng)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Lỗi đọc dữ liệu từ tiến trình con" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Lỗi tạo ống dẫn để liên lạc với tiến trình con (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lỗi đọc từ ống dẫn con (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Lỗi chuyển đổi sang thÆ° mục '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Lỗi thá»±c hiện tiến trình con (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Tên chÆ°Æ¡ng trình không hợp lệ: %s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Gặp chuỗi không hợp lệ nằm trong véc-tÆ¡ đối số tại %d: %s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Gặp chuỗi không hợp lệ nằm trong môi trường: %s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ThÆ° mục làm việc không hợp lệ: %s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Lỗi thá»±c hiện chÆ°Æ¡ng trình bổ trợ (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Gặp lỗi bất thường nằm trong 'g_io_channel_win32_poll()' khi đọc dữ liệu từ " +"tiến trình con" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Lỗi đọc dữ liệu từ tiến trình con (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Gặp lỗi bất thường nằm trong 'select()' khi đọc dữ liệu từ tiến trình con (%" +"s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Gặp lỗi bất thường nằm trong 'waitpid()' (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Lỗi tạo tiến trình con (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Lỗi thá»±c hiện tiến trình con '%s' (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Lỗi chuyển hướng kết nhập hay kết xuất của tiến trình con (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Lỗi tạo tiến trình con (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Gặp lỗi không rõ khi thá»±c hiện tiến trình con '%s'" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Lỗi đọc đủ dữ liệu từ ống dẫn PID con (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Ký tá»± ở ngoại phạm vi UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Dãy không hợp lệ nằm trong dữ liệu nhập việc chuyển đổi" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Ký tá»± ở ngoại phạm vi UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Sá»­ dụng:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[TÙY_CHỌN...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Tùy chọn trợ giúp:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Hiển thị các tùy chọn trợ giúp" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Hiển thị mọi tùy chọn trợ giúp" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Tùy chọn ứng dụng:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Không thể phân tách giá trị số nguyên '%s' cho %s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Giá trị số nguyên '%s' cho %s ở ngoại phạm vi" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Không thể phân tách giá trị đôi '%s' cho %s" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Giá trị đôi '%s' cho %s ở ngoại phạm vi" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "Gặp lỗi khi phân tách tùy chọn %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "Thiếu đối số cho %s" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Không biết tùy chọn %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "Không tìm thấy tập tin khoá hợp lệ nằm trong thÆ° mục tìm kiếm" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Không phải là một tập tin chuẩn" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Tập tin rỗng" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Tập tin khóa chứa dòng '%s' mà không phải là một cặp giá trị khóa, nhóm, hay " +"chú thích" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "Tên nhóm không hợp lệ: %s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Tập tin khóa không bắt đầu với nhóm" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "Tên khoá không hợp lệ: %s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Tập tin khóa chứa bảng mã không được hỗ trợ '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Tập tin khóa không có nhóm '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Tập tin khóa không có khóa '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Tập tin khóa chứa khóa '%s' với giá trị '%s' mà không phải là UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Tập tin khóa chứa khóa '%s' mà có giá trị không có khả năng giải dịch." + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Không thể phân tích giá trị '%s' chứa trong tập tin khoá." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Tập tin khóa chứa khóa '%s' trong nhóm '%s' mà có giá trị không có khả năng " +"giải dịch." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Tập tin khóa không có khóa '%s' trong nhóm '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Tập tin khóa chứa ký tá»± thoát tại kết thúc của dòng" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Tập tin khóa chứa dãy thoát không hợp lệ '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Không thể giải dịch giá trị '%s' dạng con số." + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Giá trị số nguyên '%s' ở ngoại phạm vi" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Không thể giải dịch giá trị '%s' dạng con số nổi." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Không thể giải dịch giá trị '%s' dạng bun (đúng/sai)." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Giá trị đếm quá lớn được gá»­i cho %s" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "Luồng đã bị đóng" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "Thao tác bị thôi" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "Đối tượng không hợp lệ, chÆ°a được sÆ¡ khởi" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "Gặp dây byte không hoàn thành trong đầu vào" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "Không đủ không gian trong đích đến" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "Không hỗ trợ thao tác khởi động có thể huá»· bỏ" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Không rõ kiểu" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "kiểu tập tin %s" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "kiểu %s" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Kết thúc luồng sớm bất thường" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "Không có tên" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "Tập tin Desktop không ghi rõ trường Exec (thá»±c hiện)" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "Không tìm thấy thiết bị cuối cần thiết cho ứng dụng" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Không thể tạo thÆ° mục cấu hình ứng dụng người dùng %s: %s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Không thể tạo thÆ° mục cấu hình MIME người dùng %s: %s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Không thể tạo tập tin desktop %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "Lời định nghÄ©a riêng cho %s" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "ổ đĩa không thá»±c hiện chức năng đẩy ra" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"ổ đĩa không thá»±c hiện chức năng đẩy ra (eject hoặc eject_with_operation)" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "ổ đĩa không thá»±c hiện chức năng thăm dò có phÆ°Æ¡ng tiện không" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "ổ đĩa không thá»±c hiện chức năng chạy (start)" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "ổ đĩa không thá»±c hiện chức năng dừng (stop)" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Không thể quản lý phiên bản %d của bảng mã GEmblem" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Bảng mã GEmblem chứa số các hiệu bài dạng sai (%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Không thể quản lý phiên bản %d của bảng mã GEmblemedIcon" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Bảng mã GEmblemedIcon chứa số các hiệu bài dạng sai (%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Mong đợi một GEmblem cho GEmblemedIcon" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "Thao tác không được hỗ trợ" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "Bộ lắp chứa không tồn tại" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "Không thể sao chép đè lên thÆ° mục" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "Không thể sao chép thÆ° mục đè lên thÆ° mục" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "Tập tin đích đã có" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "Không thể sao chép đệ quy thÆ° mục" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "Chức năng nối bện không được hỗ trợ" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "Gặp lỗi khi nối bện tập tin: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "Không thể sao chép tập tin đặc biệt" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "Đưa ra giá trị liên kết tượng trÆ°ng không hợp lệ" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "Thùng rác không được hỗ trợ" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Tên tập tin không thể chứa '%c'" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "hàm volume (khối tin) không thá»±c hiện chức năng mount (lắp)" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "Không có ứng dụng đăng ký xá»­ lý tập tin này" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "Bộ đếm bị đóng" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "Bộ đếm tập tin có thao tác còn chạy" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "Bộ đếm tập tin đã bị đóng" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Không thể quản lý phiên bản %d của bảng mã GFileIcon" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Dữ liệu nhập dạng sai cho GFileIcon" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "Luồng không hỗ trợ hàm 'query_info'" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "Chức năng seek (tìm nÆ¡i) không được hỗ trợ trên luồng" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "Không cho phép cắt ngắn luồng nhập vào" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "Không cho phép cắt ngắn luồng" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Số các hiệu bài không đúng (%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "Không có kiểu cho tên hạng %s" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Kiểu %s không thá»±c hiện giao diện GIcon" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "Kiểu %s không được đặt hạng" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "Số thứ tá»± phiên bản dạng sai: %s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Kiểu %s không thá»±c hiện 'from_tokens()' trên giao diện GIcon" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Không thể quản lý phiên bản đã cung cấp của bảng mã biểu tượng" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "Luồng nhập vào không thá»±c hiện chức năng đọc" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "Luồng có thao tác còn chạy" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "Không đủ không gian cho địa chỉ ổ cắm" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "Địa chỉ ổ cắm không hỗ trợ" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Không tìm thấy kiểu theo dõi thÆ° mục cục bộ mặc định" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "Tên tập tin không hợp lệ: %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Gặp lỗi khi lấy tập tin về hệ thống tập tin: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "Không thể thay đổi tên của thÆ° mục gốc" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "Gặp lỗi khi thay đổi tên của tập tin: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "Không thể thay đổi tên của tập tin, vì tên tập tin đã có" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "Tên tập tin không hợp lệ" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "Gặp lỗi khi mở tập tin: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "Không thể mở thÆ° mục" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "Gặp lỗi khi gỡ bỏ tập tin: %s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "Gặp lỗi khi chuyển tập tin vào sọt rác: %s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Không thể tạo thÆ° mục sọt rác %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "Không tìm thấy thÆ° mục cấp đầu cho sọt rác" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "Không tìm thấy hay không thể tạo thÆ° mục sọt rác" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Không thể tạo tập tin thông tin sọt rác: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Không thể chuyển tập tin vào sọt rác: %s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "Lỗi tạo thÆ° mục: %s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Hệ tậo tin không hỗ trợ liên kết biểu tượng" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Gặp lỗi khi tạo liên kết tượng trÆ°ng: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "Gặp lỗi khi di chuyển tập tin: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "Không thể di chuyển thÆ° mục đè lên thÆ° mục" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "Lỗi tạo tập tin sao lÆ°u" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "Gặp lỗi khi gỡ bỏ tập tin đích: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "Không hỗ trợ chức năng di chuyển giữa các bộ lắp" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "Giá trị thuộc tính phải có giá trị" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "Kiểu thuộc tính không hợp lệ (mong đợi chuỗi)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "Tên thuộc tính đã mở rộng không hợp lệ" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Gặp lỗi khi đặt thuộc tính đã mở rộng '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Gặp lỗi khi lấy trạng thái về tập tin '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (bảng mã không hợp lệ)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Gặp lỗi khi lấy trạng thái về mô tả tập tin: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Kiểu thuộc tính không hợp lệ (mong đợi uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Kiểu thuộc tính không hợp lệ (mong đợi uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "Kiểu thuộc tính không hợp lệ (mong đợi chuỗi byte)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "Gặp lỗi khi đặt quyền hạn cho liên kết biểu tượng" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Gặp lỗi khi đặt quyền hạn: %s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "Gặp lỗi khi đặt người sở hữu : %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "liên kết tượng trÆ°ng phải có giá trị" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Gặp lỗi khi đặt liên kết tượng trÆ°ng: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Gặp lỗi khi đặt liên kết tượng trÆ°ng: tập tin không phải là liên kết tượng " +"trÆ°ng" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Gặp lỗi khi đặt thời gian sá»­a đổi hoặc truy cập: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "Ngữ cảnh SELinux phải khác NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Lỗi đặt ngữ cảnh SELinux: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux chÆ°a được bật trên hệ thống này" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Không hỗ trợ chức năng đặt thuộc tính %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "Gặp lỗi khi đọc từ tập tin: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Gặp lỗi khi tìm nÆ¡i trong tập tin: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "Gặp lỗi khi đóng tập tin: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "Không tìm thấy kiểu theo dõi tập tin cục bộ mặc định" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "Gặp lỗi khi ghi vào tập tin: %s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Gặp lỗi khi gỡ bỏ liên kết sao lÆ°u cÅ© : %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Gặp lỗi khi tạo bản sao lÆ°u : %s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Gặp lỗi khi thay đổi tên của tập tin tạm thời: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "Gặp lỗi khi cắt ngắn tập tin: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Gặp lỗi khi mở tập tin '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "Tập tin đích là một thÆ° mục" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "Tập tin đích không phải là một tập tin bình thường" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "Tập tin đã bị sá»­a đổi bên ngoài" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "Lỗi xoá tập tin cÅ©: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "GSeekType được cung cấp không hợp lệ" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "Yêu cầu tìm không hợp lệ" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Không thể cắt GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "Luồng ra bộ nhớ không thể thay đổi kích thước" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "Lỗi thay đổi kích thước luồng ra bộ nhớ" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Việc ghi này yêu cầu một vùng nhớ lớn hÆ¡n sức chứa địa chỉ sẵn sàng hiện thời" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "Đã yêu cầu tìm nÆ¡i đằng trước đầu của luồng" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "Đã yêu cầu tìm nÆ¡i đằng sau cuối của luồng" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "hàm mount (lắp) không thá»±c hiện hàm \"unmount\" (bỏ lắp)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "hàm mount (lắp) không thá»±c hiện hàm \"eject\" (đầy ra)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"hàm mount (lắp) không thá»±c hiện hàm \"unmount\" hoặc \"unmount_with_operation" +"\" (bỏ lắp)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"hàm mount (lắp) không thá»±c hiện hàm \"eject\" hoặc \"eject_with_operation" +"\" (đầy ra)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "hàm mount (lắp) không thá»±c hiện hàm \"remount\" (lắp lại)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "hàm mount (lắp) không thá»±c hiện đoán nội dung" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "hàm mount (lắp) không thá»±c hiện đoán nội dung đồng bộ" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Tên máy '%s' có '[' nhÆ°ng không có ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "Luồng xuất không thá»±c hiện hàm write (ghi)" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "Luồng nguồn đã bị đóng" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Lỗi phân giải '%s': %s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Lỗi phân giải ngược '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "Không có bản ghi dịch vụ (service record) cho '%s'" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Tạm thời không thể phân giải '%s'" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "Lỗi phân giải '%s'" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "Ổ cắm không hợp lệ, chÆ°a được sÆ¡ khởi" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ổ cắm không hợp lệ, khởi động thất bại vì: %s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Ổ cắm đã được đóng" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "tạo GSocket từ fd: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Không thể tạo ổ cắm: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "Lỗi giao thức không xác định" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "không thể lấy địa chỉ cục bộ: %s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "không thể lấy địa chỉ ở xa: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "không thể lắng nghe: %s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "Lỗi liên kết địa chỉ: %s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Lỗi chấp nhận kết nối: %s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "Lỗi kết nối: " + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "Kết nối đang hình thành" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "Lỗi kết nối: %s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Không thể lấy lỗi đang chờ: %s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "Lỗi nhận dữ liệu: %s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "Lỗi gá»­i dữ liệu: %s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "Lỗi đóng ổ cắm: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Đang chờ ổ cắm: %s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "Lỗi gá»­i thông điệp: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage không được hỗ trợ trên Windows" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "Lỗi nhận thông điệp: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "Lỗi lạ khi kết nối" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "Bên lắng nghe đã đóng" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "Ổ cắm được thêm đã đóng" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Không thể quản lý phiên bản %d của bảng mã GThemedIcon" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Chờ 1 thông điệp điều khiển, nhận được %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "Gặp dữ liệu bổ sung kiểu bất thường" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Chờ 1 fd, nhận được %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "Nhận fd không hợp lệ" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Gặp lỗi khi đọc từ UNIX: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "Gặp lỗi khi đóng UNIX: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "Gốc hệ thống tập tin" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Gặp lỗi khi ghi vào UNIX: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Địa chỉ ổ cắm UNIX trừu tượng không được hỗ trợ trên hệ thống này" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "hàm volume (khối tin) không thá»±c hiện hàm eject (đầy ra)" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"hàm volume (khối tin) không thá»±c hiện hàm \"eject\" hoặc " +"\"eject_with_operation\" (đầy ra)" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "Không tìm thấy ứng dụng" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "Gặp lỗi khi khởi chạy ứng dụng: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "Không hỗ trợ địa chỉ URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "các thay đổi liên quan không được hỗ trợ trên win32" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "chức năng tạo sá»± liên quan không được hỗ trợ trên win32" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "Không đủ bộ nhớ" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "Lỗi nội bộ : %s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "Cần thêm đầu vào" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "Sai nén dữ liệu" diff --git a/po/wa.gmo b/po/wa.gmo new file mode 100644 index 0000000000000000000000000000000000000000..8886bbdcacddb672128f0439a79a7c317b1a096a GIT binary patch literal 4486 zcmb7GO^h5z6)qrzWcd$&0Sr_e?_ca*&u%tmnOU2k^;)d724hc*;8xRJGgCV~UG1vs znVl$C1QJptB;blKQDPz?MM8;$Iqh7ya)2X9NN_^}kvn{^s%NHmylb15y1(wO_g=mK zSATitiC-{W&*MIWd-HvaT?FpG9}iqleSop&fKLNC@I0^q+y|}!e*$~~_%3iA_%|T& zfBFf=_JCJ`KLfr7{34Kl5Np6~AP0UANdFCR8TcCT%fNSltH3`2&jJ4n{1ouqlR=*? z;Mef|Lm=t>b6^B~8@L4gEAV;XlOGE7F91p2eu)F%C-8k2Nb=tXlAJ#SYry{iN#41q z0^dy_+4(B41s}ZuBzqSYg1y^7vNr`@2EGHl1bnZ=^B-pHMSQn_KLGv`_&eagfQ!Jl zJ`()$N8n5N{s-`@z%w6ZYy;Q?l3#xer1f`!xf;B9>00iFl`0k{i% z4@iEge>~VDfMn-Sft$eJ14-|H13wSE21Fu=z?4PML9zk z(u#cs_j9;OZ@NB<8*ZImP>sP&-VVwkx?rY{|I@%P(2t$2Fd}x+a9udA+uVq(BY9gJ z{&MqLw0`MP6kBXZX9H=h(iv|X-RJRCq?L{@FWP19bUS>xL+t$SBiXBS}tPAc0CEU zP@r61YAkarW!B&Wk*b9I{|Z(JBkO!g^z#N^x>INeNa@j`hsd>Uu-zad0UNnTW=W|k zB=%LTQw_0w4LefRlh9(M3tm|01Y;l>-WTARIi3uqc&f}nn94fjOY4Mj-u$p##HEcz zE-MmXxYv~J8Ux#t!Vqt8GX=QL7j3zQXs2)sUree$5f$P{l##L127W>KD+ClzBJd%d zu3Zy|a6&r51WG@=9T&k@7VRpl&_NJ#LB}tb4InGily4BsM|&~+{!9%d(*v#X4d)St`NiNr!Te>B0o)(FQ7y? zF{#apLn=Z;orUW46bgAUXU~l0G}SzX>q>4%{gzHuOexZv<-lGRYJ>}wi(U;R759PX5-FCj!G*QwiC5>+rDyVXSTNFy!g340o!jrJ3Jal~4 z3sxT13|3haX6M3nN!xOZpaGR=%j%T!kqFq!SufK=bRl13Apw1vJ&>&IhS3Koq-ZaR zZig0I=bcow7H&#vpwV^PQAzZzqGO|`uJeT(-)%-ah=N0{Mpt2Mop03EYf-WsphvZ zG~A)+2)>=uk8cbGdeoXWohx9;I)&)Ss3}Fi&c9EM9nE4JsZbn7Ls6x@zIT0hX4(2$ zZD9xP7OgXCj&dmP5Q2+{nnM4h?uLPKna0xAjE;0`OB3y8v8L8i=UXl17H*`45ovTy zo4&2{Ecc)G@&ooi*>_#V4@pg1iF zZp8p208TH4n0_=eHHNseUhDBaBT;#1H!x-Vn^I`WjqDE0iO~a6rBqH9Xt|U9E4q;S z3C&W>61v8Wf4dF(WWqS)@TGdSfdUS!~&D zB7h_XW1-4Y18#v*4w{aCJ(3Ncg0@_@Vb0=*Man#C!tTRs6Tzf%TV?978~p3-K!)a! z6UDkOkRwL7#;>>1V09171C2>O(64Zrr+NhI!4OXqVLF4+)>H=7QdtR@-C-y`H45LR2#{NXw$&QlzkKl zYGiug2&&9+geZpk9Z;H3Qj2g*u*5xY_vEO65k3@(&a!5R26dv(%c7pI{r``4dZKuo z9g!7C@p+>kXjLT{60}vkf<*N}I^8pY{DB^Jq8(FODopB^${#*Z4wa<7CF3F57Boew zl)chN!kkk28s2t%EQ?5Xr@_8pu@!I$dfK+DiI0w0^oeSBg2UQP6^iJmwo9P9Iz zdM=I%23c1QhhqaFY<+=;Vc>hR7a)8(O_@lFld*+ymHxZ(kOsW!S>i7G@`)QmG$snI l`V);V%C_Tok28JP)k8YGy9j-fN^{aJ%GxZ@@G8~G{s*Osh7SM$ literal 0 HcmV?d00001 diff --git a/po/wa.po b/po/wa.po new file mode 100644 index 0000000..51a4efa --- /dev/null +++ b/po/wa.po @@ -0,0 +1,2078 @@ +# Translation into the walloon language. +# +# Si vos voloz donner on côp di spale pol ratournaedje di Gnome (ou des +# ôtes libes programes) sicrijhoz-mu a l' adresse emile +# ; nos avans co brÃ¥mint di l' ovraedje a fé. +# +# Copyright (C) 2001 Free Software Foundation, Inc. +# Pablo Saratxaga , 2004. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2004-05-03 14:40+0200\n" +"Last-Translator: Pablo Saratxaga \n" +"Language-Team: Walloon \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Dji n' a savou lére li loyén simbolike «%s»: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Li cviersaedje di l' ecôdaede «%s» viè «%s» n' est nén sopoirté" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Dji n' a savou drovi l' cvierseu di «%s» viè «%s»" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Li tchmin «%s» n' est nén on tchmin absolou" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Li tchmin «%s» n' est nén on tchmin absolou" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "No d' lodjoe nén valide" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Dji n' a savou alouwer %lu octets po lére li fitchî «%s»" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Dji n' a nén savou lére li fitchî «%s»: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Dji n' a nén savou aveur les atributs do fitchî «%s»: fstat() a fwait " +"berwete: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Li patron «%s» n' est nén valide, i n' doet nén aveur on «%s»" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Li patron «%s» èn finixh nén avou XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Dji n' a savou lére li loyén simbolike «%s»: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Dji n' a savou drovi l' cvierseu di «%s» viè «%s»: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Aroke el roye %d caractere %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Tecse ecôdé en UTF-8 nén valide" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Aroke el roye %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Vude intité «&;» di trovêye; les intités valides sont: & " < > " +"'" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Li no d' intité «%s» n' est nén cnoxhou" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"L' intité èn finixh nén avou on pont-coma; probÃ¥blumint k' vos avoz eployî " +"on caractere ampersande sins vleur sicrire ene intité, dins ç' cas el fÃ¥t " +"scrire insi: « ↦ »" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Li documint doet cmincî avou èn elemint (eg: )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Li documint esteut vude ou avou seulmint des blancs" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Aroke el roye %d caractere %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Li tecse esteut vude (ou avou seulmint des blancs)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Dji n' a savou lére do process efant" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Dji n' a savou lére del buze efant (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Dji n' a savou candjî viè l' ridant «%s» (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Dji n' a savou enonder l' process efant (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "No d' lodjoe nén valide" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Secwince nén valide e l' intrêye do cviersaedje" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Dji n' a savou enonder l' aidant programe" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Dji n' a savou fé on fork() (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Dji n' a savou enonder l' process efant «%s» (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Dji n' a savou fé on fork do process efant (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Aroke nén cnoxhowe tot-z enondant l' processus efant «%s»" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Caractere foû fortchete po l' ecôdaedje UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Secwince nén valide e l' intrêye do cviersaedje" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Caractere foû fortchete po l' ecôdaedje UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "No d' lodjoe nén valide" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "No d' lodjoe nén valide" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "No d' lodjoe nén valide" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "No d' lodjoe nén valide" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Dji n' a savou lére li loyén simbolike «%s»: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Aroke el roye %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "No d' lodjoe nén valide" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Dji n' a savou alouwer %lu octets po lére li fitchî «%s»" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Aroke el roye %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "No d' lodjoe nén valide" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Secwince nén valide e l' intrêye do cviersaedje" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Li caractere «%s» n' est nén valide Ã¥ cmince do no d' ene intité; le " +#~ "caractere & cmince ene intité; si ç' caractere ampersande doet esse hÃ¥yné " +#~ "té ké, adon el fÃ¥t scrire come « & »" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Li caractere «%s» n' est nén valide dins on no d' intité" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Tecse ecôdé en UTF-8 nén valide" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Tecse ecôdé en UTF-8 nén valide" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Åk n' a nén stî tot cviersant: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "Dji n' a savou drovi li fitchî «%s»: fdopen() a fwait berwete: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "Li cviersaedje di l' ecôdaede «%s» viè «%s» n' est nén sopoirté" diff --git a/po/xh.gmo b/po/xh.gmo new file mode 100644 index 0000000000000000000000000000000000000000..92f4b59995a9250c84f98192cc23100dfc9ff329 GIT binary patch literal 14200 zcmd6tTZ|;vS;xz<<0P9naUAR985J8HB5as~{D2faLAt53q4@g`h z1pNNzR8?2crFWe8fznj}`*O~AzVqF`Q}f16*S+d-8SbCve&AZqdl`(b=Y{K)cY5B_ z;1|Hl;P=4*eE40S_fz2Sfp>x50*`|K0UiNo_Ici6a0$E}d=d1)-vG~oe**qGcyPVV=BOMEt< zR?CHOFS6U=D+=fU&fZ-Z^{hoEA> z(gA00-vk%<`~y(>yA!6)fRaJOQ3SIg)D!{3Q4)cnSOqQ1d>@%LQ-|{37@YC^_88VxoT;)c7xgn*XmL zf8PEh&R!k^pW^e&;Jd+p1jX+UK#jki#m|7JLGk@_p!oX=cpCgJ_#k*2%95Vj;HSaY zKz)DBQP2Af_z*Y`ehEaR-rs_V%KL9n`@92VMupy!;Cslp!RVAybQire0~Ge{96!~_VYNXeg87}0QeOU z5qtjvYW_`kJ9$0?KEvmiz=y$q01=gU1mlu@J$o4|elNG=E7|LMp8E;=&b_pON4X_)UE;;^ z1xjugxpm<#)%79XNk+O5m(}CbAR@8XwY*AKlB;y2{pgZBCBvumfeRC{zJh9OZ2bTz zoxP1)GS(%X$zE^bzL{ILZMbD)&vL(?TbFdI>o)EuxdU!QY;zP~uYJ6Jws`+B5E0uL zqOUG--^h*H>~#aLr?_!9o6p`3%5HW24EKBNJM09Mo~8R2xUc8d^)3hAI|^Jb@Hy}! z+~ve*{z?)>$uNvN{5ErHX8g;7A7*|p7}o6=ABFY8ILJ&Yh62AI46-nY#=_OeLa|An`N;}9h&u)? z5B%k&3yovb=d8?A>3n67^v2SIBPVcCth-H`_xs6!O)@u++(u+m zSdQ@zM7iG_Nhi#*#;_?lFG2dW)44c%>`s#`wFMe&D0gbI1Q~nTS?Dyfx+|# zNz0_EB+Sp*AaBV*_C#hYKYN@s5nZMUq-3`WNDax?+CtEo-OFk=CfS&g1s&@j<>J!H zR0>yejMb?G6Sa!P$xwL{*IShdotjQy*p-2d_b}Go)fHuZr(hL3$igUcEHs=s4KZ`= zEec?=+>&_2c&AA8h+mqU^(G_NZdvh6Zmsk9I9Y~L!9@FhfGA>s*AFuS|A2PF@ zS^rcsNmfrE9?uZFrq{<~F*t%@77$b0eiCE#hzYOi2QA~BFVc?n7|pS~wU78%yxndq z9}uZBW?6ld8&{Z@I(MCqo7BcmQt{4P#vrSRGIMZYh5%uRRxXFy??c=^7?^n%TKt1+ zd6F&o2P3_7^b+)wbiq6CX#774g69VVB;L-Iyo$J_h&b;bNImx(;ZX_BKhUm!S-4p{ z91xt60dhgUwE+r%B57k__1lF2i*L)clt4*HyqhH9A3Bg8_G;rGL@?WxjQhDC65^HI z6t?o%rg9dy#@E8j+GP;iO5SXkmV)KvAjRyxjoiX5EUa#wXuq4Jzhzd3SW)?Ys%%}` z?g}X_J9L=JK%%n}9!tj>d2KLC+x^FtwubLUiW-8#sYvig>$hDC%7hp-=$IPgHhH## zEGYAGO@VtHwp9t1q=}Qf)AhGerX;Zjv_&m;PEi?H4rFAzj@eBMmWm>AI_fnOs!Vy4 ztM9fbb6}h+_*6B0Rc!;rY~QSGu}{Z@O&&$q^d2-(e_XmQQWJG36>J`{u4$EV0OP8a zgWh87LYT@HV%l16i#$q7SB~1!$g)t4>{6iFn!lVnb=JdX_WPt}b{Oqycvm>M&3KQPl`Nq_q8xUnsYb*4 zF>1CR*34IEQoP4(b2~7doSr{n2kCZvD=*m@y zlJ%_em&BfH%bErONMsqA9icc0sv=!Ua+EFc9B9q@hn7?!Yo2}+mBXxCk*T*3{>-yA ztC=!&Tq_@9m0gQv7Gmw?#~0oHst{ak6eDvXwdNh^Sqt zG+3N%)!5PiZ@FrrePgR#rH1+;4#!?6j$iK6MpGOqnn+*snIEF~-?gL$9BxkSxG$<| zxp5~)UX3La^ydAiF!;bfwb5;qlgydCna5e~hCjOa==t$3kIl~QJ4e$?E7@2Y_1TC* z#!;eENSmn$&xzE%wlElv6Emc|#(5pVVHorN$!3`C^K3K=(lAQ;-C&rLzrxfsO}rV5 z)Z~T{x;Iha=k}a8w}TdB49RL9cY-wzhW)S;^a4LJX~;(tCEJMN^<$#>D%sW%4Z~hv zi`LF|-zv&mSkhKj^A-3Ht#K~+ZYw^lt>^K`L_@=dBR<+A-o-F(vz5T#WS<4^zS*?f zUhSH!I}GN%v#a^)FxWJ!q0bx13}lhG9r#W>5i$zXA=;+!8itdBM9x2P8vIt!D-Mb$ zNadY;4Vn94WAeZljWkqIrVvcU@xNo@~%yduNWO+xWnXStC2+JlIE+{Hsa1&!b!IFJ2KQ7)-TkW zFlOYe$NB0g+@LeDHiZRR`?K~XTSVYGSPsL6ZPF@h3|E3th^N})<;pgSX*hs3fx=`a zvgLv)T%pE*`{XTe3{A6}`-M~`Q0zq_=16WGMv)3^6sn2%giCjVm;h1uJq?uePG>+1 zz9NZC(BBA}VJa`QCN*s-XKUdq89QXj-pB?Xe<&@iCwN~V6Qy-t%bUs72^DmPrq0-# zo;D7EQ-tI=uNI6Drdo4TD#3-&**CHHm;}MthOtq_iPhjVT24?-b8^~dNG!zRO`B&d zikk36fU}0J6Y42D+c0T2R2&RZ^_Fe!U9&YR;bxIgsO~qzG=LR}syMU8V4bY|6eH`b zg-!WRlRaqMkXW#*r5?fLuu2l!5KqTm6U-BO+c#fI6sig$FyX_3Q<*!)E?2RE-{8xU zf&vdztY0{@Je2n~SEKPkb~y)*^G#D)D--b$)w{4ll2JBJL!uMzKuEPwEU?kpQMJx# z_iMRiQ%QSh_fg2D5(PoYh94XrQK4L7r)Ezh7LeR<$+3_Nu};$BsAnSf8Mb53ybUrP zQbX`Sn5^l>R1s3zEQ^e*9fEIJfH)>aplU4aCy(X|8@}$15em1>MOa4)uj#u9+mDm7~uZKON=g^oUVoObvG&I)L7-dwi z#t_;2HfJIr92)_#CGkOGAu{hs+_euo&TLy@Y-MEkp-R{i0J%v)oUpzjr<8P2m2ttC zwAqU@h6Gbqw!5I5Dgt9YI_1)*R^Sesc9VP)31bBq2RsZP~;w4Xxyg z#3cIZA;eZ!szK3#Ql-3{0vz?CQp)a4+c{B+Qj2Yuz7ynP5l6yJGBf`j!hg!x5J8xz z8mh&zOi+;>s`?-p5>3S&A(c?7&eOITwj?Hxsmbt`i7+JdBJ$9~F{UWxQH^SNTMpYg zQ+ziFQSdq{gS59;)P21*g5{sT@>{rx&td7w~SZrT&uGtfhh zy9|UtR#VS_AKCoI_9<&SEfRhqxSgg?-}jiR1UQWl4PTMii zP2Ax$V;aS>8>Qv2R#&xVc9|WfQoqCj4mTF@)Inpl>~R?X>x22Sp%@rXJ>TYZy3c%D)=ANAhLX$jA*>QB3$W!o4^)>BC8sfufB^kfBhQY)=kBgdMk z;Kv>O#4_YFH(wE6hdl~amdy0Sf~|oE+12;7CxKM#@_%ULJ!@B_@3I9eWmOyy=yb|P zM07%&B*4*tQDl^Hw8*&DQ??0naqCeIyPOCp6R~JArY-lHU74}|nJtA+*LNc5!nmqb zUu?s>pW{!OC$f+JyDo4EfI6{?{^f|Be_Y%xabe4q&v}cSr`Dg+VC+R2P{)VCsy|Z# zag7!ym(ESf-B=4T9Nz>w4JuDEYMP+xAsninRbCNA+<_jl#~~AB-9wy;TGJhw9QLYj zY-m?6R-TnO z4(MEx4-~^gSk@-L3?3OQybNDq`i$-RXO<->Hh$ZtbL9E literal 0 HcmV?d00001 diff --git a/po/xh.po b/po/xh.po new file mode 100644 index 0000000..eff2527 --- /dev/null +++ b/po/xh.po @@ -0,0 +1,2168 @@ +# Xhosa translation of glib +# Copyright (C) 2005 Canonical Ltd. +# This file is distributed under the same license as the glib package. +# Translation by Canonical Ltd with thanks to +# Translation World CC in South Africa, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2005-02-08 12:31+0200\n" +"Last-Translator: Canonical Ltd \n" +"Language-Team: Xhosa \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Uphawu olutenxileyo '%s', lulindele '=' emva kwegama lophawu '%s' " +"lwesiqalelo '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Iqhosha elisebenzayo lefayili alifumanekanga kwidata yoovimba beefayili" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" +"Uguqulo ukusuka kwingqokelela yeempawu '%s' ukuya kwi '%s' ayixhaswanga" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Akukwazekanga ukuvula isiguquli ukusuka ku '%s' ukuya ku '%s'" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "Inxalenye yophawu lolandelelwano ekupheleni kongeniso-lwazi" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Akukwazeki ukuguqula i-fallback '%s' kwiseti yekhowudi '%s'" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "I-URI '%s' asiyiyo i-URI ngokupheleleyo esebenzisa indlela ye \"file\"" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "I-URI yefayili yendawo '%s' kunokwenzeka ingaquki i-'#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Ayisebenzi i-'%s' yeURI" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Igama lomququzeleli weURI '%s' alisebenzi" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "I-URI '%s' iqulethe iimpawu ezisindileyo ezingasebenziyo" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Igama lendlela yothungelwano '%s' akuyiyo kuphela indlela" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Akwazekanga ukwaba %lu ii-byte ukufunda ifayili \"%s\"" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Akuphumelelekanga ukufunda ifayili '%s': %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Akuphumelelekanga ukufumana iimpawu zefayili '%s': fstat() " +"akuphumelelekanga: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "I-Template '%s' ayisebenzi, kufuneka ingaqulathi i '%s'" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "I-Template '%s' ayipheli ngo XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Akukwazekanga ukuvula isiguquli ukusuka ku `%s' ukuya ku `%s': %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Akukwazeki ukwenza ukufunda okungalungiswanga kwi " +"g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "Intsalela yedata engaguqulwanga kwisigcini sethutyana sokufunda" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "Isiqhagamshelanisi siphelela inxalenye yophawu" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Akukwazeki ukwenza ukufunda okungalungiswanga kwi g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Impazamo emgceni %d uphawu %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Umbhalo onxulumanisayo ongasebenziyo we- UTF-8" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "Impazamo emgceni %d: %s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"Akuphumelelanga ukwahlula ngezijungqe '%-.*s', obekufanele ukuba ngumvo " +"ngaphakathi kophawu lokuthumela (ê umzekelo) - mhlawumbi umvo mkhulu " +"kakhulu" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"Uphawu lokuthumela aluphelelanga ngechaphaza-msila; mhlawumbi usebenzise " +"uphawu lwe- ampersand ungenanjongo yokuqala into ezimeleyo - phepha i- " +"ampersand njenge &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Uphawu lokuthumela '%-.*s' alulunxulumanisi uphawu olunemvume" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Into ezimeleyo eze '&;' ebonwayo; izinto ezizimeleyo ezisebenzayo: & " +"" < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Igama lento ezimeleyo '%s' alaziwa" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"Into ezimeleyo ayiphelelanga ngechaphaza-msila; mhlawumbi usebenzise uphawu " +"lwe- ampersand ungazimiselanga ukuqala into ezimeleyo - phepha i- ampersand " +"njenge &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "Uxwebhu kufuneka luqale ngesiqalelo (umzkl. )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' asilophawu elisebenzayo elilandela u '<' uphawu; linokungaqali igama " +"lesiqalelo" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"Uphawu olutenxileyo '%s', lulindele '>' uphawu lokuphelisa ilebhile " +"yokuqalisa isiqalelo '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Uphawu olutenxileyo '%s', lulindele '=' emva kwegama lophawu '%s' " +"lwesiqalelo '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"Uphawu olutenxileyo '%s', lulindele '>' okanye '/' uphawu lokuphelisa " +"ilebhile yokuqala isiqalelo '%s', okanye ngokhetho lophawu; mhlawumbi " +"usebenzise uphawu olungasebenziyo kwigama lophawu" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"Uphawu olutenxileyo '%s', lulindele uphawu locaphulo oluvulekileyo emva " +"kweempawu zokulingana xa kunikwa ixabiso lophawu '%s' lwesiqalelo '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' asilophawu olusebenzayo ukulandela igama lesiqalelo elikufuphi '%s'; " +"uphawu oluvunyelweyo lolu '>'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Isiqalelo '%s' besivaliwe, akukho siqalelo sivuliweyo njengangoku" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Isiqalelo '%s' besivaliwe, kodwa isiqalelo esivuliweyo njengangoku sesi '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "Uxwebhu beluze okanye luqulathe isikhewu esimhlophe kuphela" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Uxwebhu luphele ngesiquphe kanye emva kwesibiyeli sedolo elivulekileyo '<'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Uxwebhu luphele ngesiquphe xeshikweni iziqalelo bezisavulile - '%s' " +"isiqalelo sokugqibela besivuliwe" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Uxwebhu luphele ngesiquphe, kulindelwe ukubona isibiyeli sedolo elivaliweyo " +"esiphelisa ilebhile <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lesiqalelo" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lophawu" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwelebhile evula isiqalelo." + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Uxwebhu luphele ngesiquphe emva kokuba uphawu lokulingana lulandele igama " +"lophawu; kungekho xabiso lophawu" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Uxwebhu luphele ngesiquphe xeshikweni lungaphakathi kwexabiso lophawu" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Uxwebhu luphele ngesiquphe ngaphakathi kwelebhile evaliweyo yesiqalelo '%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Uxwebhu luphele ngesiquphe ngaphaikathi komyalelo wezimvo okanye inkqubo" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Isiqhagamshelanisi siphelela inxalenye yophawu" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Uphawu lokuthumela olungagqitywanga" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Uphawu lokuthumela olungagqitywanga" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Uphawu lokuthumela olungagqitywanga" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Impazamo emgceni %d uphawu %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Into ezimeleyo yokuthumela engagqitywanga" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Umbhalo ocatshuliweyo awuqali ngophawu locaphulo" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Uphawu locaphulo olungangqinelaniyo kumgca womyalelo okanye omnye umbhalo " +"ocatshuliweyo" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Umbhalo uphele nje emva kophawu '\\'. (Umbhalo ubu '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Umbhalo uphele phambi kokuba ucaphulo olungqinelanayo lufunyanwe malunga %c. " +"(Umbhalo ubu '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "Umbhalo ubuze (okanye uqulethe isithuba esimhlophe kuphela)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Akuphumelelekanga ukufunda idata kwinkqubo yomntwana" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Akuphumelelekanga ukudala uthungelwano lokunxibelelana nenkqubo yomntwana (%" +"s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Akuphumelelekanga ukufunda kuthungelwano lomntwana (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Akuphumelelekanga ukuguqukela kuvimba weefayili '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Akuphumelelekanga ukuphumeza inkqubo yomntwana (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Akuphumelelekanga ukuphumeza inkqubo yomncedi" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Impazamo engalindelekanga kwi g_io_channel_win32_poll() yokufunda idata " +"kwinkqubo yomntwana" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Akuphumelelekanga ukufunda idata kwinkqubo yomntwana (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Impazamo engalindelekanga select() lokufunda idata kwinkqubo yomntwana (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Impazamo engalindelekanga kwi-waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Akuphumelelekanga ukudala inkqubo entsha (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Akuphumelelekanga ukuphumeza inkqubo yomntwana \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Akuphumelelekanga ukuyalela kwakhona ungeniso nophumezo lolwazi kwinkqubo " +"yomntwana (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Akuphumelelekanga ukudala inkqubo entsha yomntwana (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Impazamo engaziwayo yokuphumeza inkqubo yomntwana \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Akuphumelelekanga ukufunda ngokwaneleyo idata evela kuthungelwano nomntwana " +"(%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "Uphawu lungaphandle kwesigaba se-UTF-8" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "Uphawu lungaphandle kwesigaba se-UTF-16" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "Ukusetyenziswa:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "Uncedo lokunokukhethwa:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "Bonisa amancedo anokukhethwa" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "Bonisa onke amancedo anokukhethwa" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "Iindlela zokusebenza ezinokukhethwa:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, fuzzy, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Akukwazeki ukwahlula ngezijungqe ixabiso lanani elimbaxa '%s' for --%s" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba" + +#: glib/goption.c:1027 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Akukwazeki ukwahlula ngezijungqe ixabiso lanani elimbaxa '%s' for --%s" + +#: glib/goption.c:1035 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "Ukhetho olungaziwayo %s" + +#: glib/gkeyfile.c:361 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Iqhosha elisebenzayo lefayili alifumanekanga kwidata yoovimba beefayili" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "Asiyofayili esebenza rhoqo" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "Ifayili ize" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ifayili engundoqo iqulethe umgca '%s' ongesiso isibini sexabiso okanye " +"isindululo" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "Ifayili engundoqo ayiqali ngeqela" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ifayili engundoqo iqulethe unxulumano olungaxhaswanga '%s'" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ifayili engundoqo ayinalo iqela '%s'" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ifayili engundoqo ayinalo iqhosha '%s'" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Ifayili engundoqo iqulethe iqhosa '%s' elinexabiso '%s' elingeyiyo UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Ifayili engundoqo iqulethe iqhosha '%s' elinexabiso elingekhe lichazwe." + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ifayili engundoqo iqulethe iqhosha '%s' elinexabiso elingekhe lichazwe." + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ifayili engundoqo iqulethe iqhosha '%s' kwiqela '%s' elinexabiso elingekhe " +"lichazwe." + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ifayili engundoqo ayinalo iqhosha '%s' eqeleni '%s'" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "Ifayili engundoqo iqulethe uphawu lokuphepha ekupheleni komgca" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" +"Ifayili engundoqo iqulethe ulandelelwano olungasebenziyo lokuphepha '%s'" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Ixabiso '%s' alinakho ukuchazwa njengenani." + +#: glib/gkeyfile.c:3663 +#, fuzzy, c-format +msgid "Integer value '%s' out of range" +msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba" + +#: glib/gkeyfile.c:3696 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Ixabiso '%s' alinakho ukuchazwa njengenani." + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ixabiso '%s' alinakho ukuchazwa njenge-boolean." + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +#, fuzzy +msgid "Cancellable initialization not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: gio/gcontenttype.c:180 +#, fuzzy +msgid "Unknown type" +msgstr "Ukhetho olungaziwayo %s" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +#, fuzzy +msgid "Operation not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +#, fuzzy +msgid "Trash not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lophawu" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Impazamo emgceni %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Asiyofayili esebenza rhoqo" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Akwazekanga ukwaba %lu ii-byte ukufunda ifayili \"%s\"" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Impazamo emgceni %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: gio/gwin32appinfo.c:336 +#, fuzzy +msgid "URIs not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Igama lomququzeleli elingasebenziyo" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPTION...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "Uphawu '%s' alusebenzi ekuqaleni kwegama lento ezimeleyo; u-& uphawu " +#~ "uqala into ezimeleyo; ukuba le ampersand ayifanelanga ukuba yinto " +#~ "ezimeleyo, yiphephise njenge &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "Uphawu '%s' alusebenzi ngaphakathi kwegama lento ezimeleyo" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "Uphawu lokuthumela oluze; kufuneka luquke umvo ofana nalo dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "Into ezimeleyo yokuthumela engagqitywanga" + +#~ msgid "Unfinished character reference" +#~ msgstr "Uphawu lokuthumela olungagqitywanga" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "Umbhalo onxulumanisayo ongasebenziyo we- UTF-8" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "Umbhalo onxulumanisayo ongasebenziyo we- UTF-8" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "Igama lomququzeleli weURI '%s' alisebenzi" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "Igama lomququzeleli weURI '%s' alisebenzi" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "Impazamo yokufunda ifayili '%s': %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "Impazamo ngelixa lenguqulo: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "" +#~ "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "" +#~ "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "" +#~ "Inguqulo ukusuka kwingqokelela yeempawu `%s' ukuya ku `%s' ayixhaswanga" diff --git a/po/yi.gmo b/po/yi.gmo new file mode 100644 index 0000000000000000000000000000000000000000..4e96556115fbc33c8bbe9aeef7c83efaccd6c765 GIT binary patch literal 13844 zcmdU!ZH!#kS;ucn+O%#%+oT~R4fMq6dTioZd+j8+yN;XGv5DJ6PAr=c5m?=wxw|{@ z?962DOdOXFq=KRXAMm?u;(FIk8?U2CIDsl@WhF=zLTW(;sq%viHrW#sGs&b{Y6=Xv=*&w0+BzrXRi;{l(CxNhfq^8G;&f~T+JKR)h* zLGT242RI4-7O3ZMfp>%VT^|G+z$UmJJO{1=zYpF4{s?s7r#=(}XTYuC1o##>3f}Tz zFK;Kflkbb5qtzUjlXi8{o$G1;M|9FZ2C2guV{` zCAa`S_wzn(cib8Td-#43jKIGF9|bqv23Nq}0Tt&z2X8>$kHIJSz6z)A1Iyrd!Eb|q z0)FKe@G*D~!TMeB68MMU1D_6p=fS@Q8(_r+!B@c_g5Ly7IQ;^6E5me3Bsi8~8nNEBLJu@1Oqy@8`QC$oGOFxC=Z9%KvYJl6Mo%eGL36sQCR5 zRGbO~^&#+a@F2JV-VNS{^QG5r@DcE3@HfE!0j1}!;rs`|*FdfFWAG2aA|$JVuY+UY z$oe4ob?|X;7W`B29C$lH-hqGL1pk8XA3&K&@Oz;AeHTK%0Dc9W2mc0?{02fx;QxXe zHwlR_CHNM&8~g`Q`8l>3`QYz^C&2H6Uk0Z!Zaerd;0(C_9()ZR15w8~3D`$|fHub4 zkNR8P|CLLh;KKd(!OfOOT2pr8Ci~ow;H}^)uA8|?+2EJC`ad^v<8xe}=OXOEbzJvx zeT)lw7~dZNKf?8XF2&7pLDAq>xCou)($9eUC_b2Fd5!tq&j-7I`I@nl@7uUO$tCW8 zoa@6}P|bV`SS=Fj^C2$65qyA4T>LpM!f1XS1#jXajQ06-f~1LkZck7E6^yg@gP-EM zo+~Jf#06K0U9H}7p?fB*R?4n48#cpID{8vwdbL_VP^r!EtgyAvdotlFEjJe)w0Tp} zOr_?+nv1H@TvThhS~wT2SaNGN>dB2+Wj`7X#fNMr!*%-LZNGf%~mC>_WY=kNet`l zma9)=L2V`?piQ@L@6O`by;mBsB{QHIO-IeBR*GC1dPrR~cLyr1S=NrDxk{;Ct=A^p zTs>~NYGr>^J?IYB+pZnsR(KK4HKJx5GN(r^&6aAFS_@&K7{C8oo^g+s$KfrCxK>&H7wMbm}fi%zP4 z)IoWaSr+Q)N;Pt;N8;7NgY{C|h>fOL)UHL(HX;(FjGf`M5=A_Uo^FTL*u|9@H0mV| z=C`26RGUSV7!x=!bBmN~N6W5Isl}BtE`SPirUfxxz3rDO-Ous%W zoRrJ$s?AW zOOeQ^VD8DAmZlLa$ZuOm;tkt+a_8h3U#WfKcH`sLMx!&MZtGONzJJ@g-VCW5%{53v z2uFQtg_OCntJh#XZX#70VJQlBBt_pcO>;`pt-RjBcr&-uZc;p2%(8f-hO5XboI~f6 zCYiB$DZvg?46!N`g*6ie>QF=p@;jK_uaL`OGaC2x!mW9_U2jdeHC6pLqyNH2J)Q`5 zco{!Mm2F3}iO0)r?I+2`pfWe^M&iIfqvmPPaUAuxQQ2zODpXl5ZsaSGW#zPp z^^1?5jY=w(`9UhgD;wFTEh_BqpJ?~;^804ZP%FB*A8P~6m^;lr)mpob&04NA5BI!d zB+m>cXu}^)moinXO&~uZ>T3}QfBRs>Ap~#=v_6R%G#63?Wfz;f6(ptPRaItn;)bjXX!qy z^Gt6nJL}cv;VmD8EFOtAK!Ww4rRC}7XC)i!iwk=AVOhKkCzORsOIJs@!mwb4W z)-Wq}R}!|ZAioqgWLjrt$}J-gRAX-NH{Zc58wFZ)_mHB3Q4hEZ+3i|I&{zA)ME=(;R! zdnMU-e^U|FL)Nw^AlT!L*Ty$pZxbh#yphtVTf0{qvF7QSq^x7zu9$46;tEe@0=~@D z-j=+URfg`#EX3OT_U!WZCF68fFhk*oZ>uxJj`LI4oRh(JKTR#sPCV?2?i;6Gy6P)s zcSw4QtJF%>w)L@vI}0YY5w>QPut^k>LnsuSitAPF02&bN>vr2NvW*d*=8j;TPd9Ix zY|wF2N0qsXO0TxjH)nU7f%0OKw4{oD#p%B84btgASZOsXWrSG$+E?3Os~@1rGM)XN zCdG2f_~XUCnvn?t=V?j^Z1dE?$+mmtIPPyk)Tml58uL8sgGZb7r!b+ot6cn5&RW(k zjE!zwwI|Y%r}#)bQz;ie-=2w!d+XzF)uX%j7Pn)pQlj`EnK14)Z5-QJ+_<^8>0UQB zHh%Y(;>No-Ze(C_PxMSh0=wfF#J{o6u6me8wz!v*WlS>Fo8xXz*q9BYs@qwqaR_u< zoBsR#rFgWx|KMm;Zf|2!ZKfU0M8&;PI5+N|sFcf~{O;57cFU^nIB7>2FYchsiy7l?%T%ScDzMD&9O|6v{ITmS04H7N zeCO59yz89qoa4{4+&j--i>`B_v&fgPUw*T5vhyNip4X^_&Y{b%Yx1GXuerk8&%Lzu z?dM)D3>-Xxn6r+_nt{AzIelB`97Et?2~1W$#P}L>Zi?%XIUt>a2gPEm{pVs*YRI~;~gA# z0fRJW-b~#lO9QmE&>!K6qKyffMofK_6PV)U+=LJp?4i+C5;lw}~kqkVd1BTswjcJ;4 z+L=o<c@K8oh!aI@5yTlS) zM$Nl5BI1C0A{Dx>=sb_ii>!T2ZdREfV!cw~B|$_h6{9XC|DyCz+;HonR=P;K``2Y= zv!3OdB7z)o_VBotAH)ey7tto;7$wswv^p7N?{-t@Q0Emqa}ouWZ+f|AiapOQpSIA* zNa(X_fxE1(hlns99yP2K%SOQz5GS<6!8>`twxJrU$b6)u=BeE zQ_tck<;y8}eZ0S_`H+~iY`@T){NP-|1rSJTygO5T(Lt1yO57zHTh!1X4PD|a^EO+J z7WUbtJ1!{&(s+@-&!PAHKRAl_6XWo0-|E-D53A+~Vqrb9slg?wY z+Y)5ylMS48TuIsQmGVS=db=Lg)J^O4H7(jeO_PSs?~L6By6Z%3vlyLmo?B~MA-B$m z-QAbnSg@otC+_|F=a*Y>12YFI8Rt(p1nERaVrA0&mEO~*(=u&V(gI|!~Nl(q9e+kF=gV?UF4xTJw_a z*FxW-Ewhvf7}D8YX<8Cg&Ud!U}3#qL9UfV@5F(G zu_&I$dgZ)Kmbq6ueyAzKqvt)6w##_9uTPZIl@`|eW}}<_F4HSrJ`J=RcJoM;M(5l? zyy@e7DqC#3>PaKgxFX<`nN$tuGscqIblG?wQV zP=q7qpoJ3U`PHdhgk4Iw6^qYs!1VPAlNB;3!a42I_$pMQ#Bi5gg#EtRd6B<#q_t4+ zVu%hw$9ZjIl!$Dnz#V^oAv>Z=+#!KW9N>?&nT^vg*gZefwt+mWM>w$NN`J|FGwoOEtql1(QL>JsdRp23L(+!;v0aj52cMx-EaZa zPUAC`@o5U@4I_v-awT5yf$kk{)Av-#OIS5$vQLd2JKW%RGRph3C+qKW^}C#yT?oYwm4XC+h}_Y6iiBvgTDM*n@tpYU3yZ4 zhpLb34%rxjo9Wt&LjL%oARS504VF_&h=>-0-V13 zj;7A?qP8N7Tte<4N;`6Aq{R7?m#b@2DVfDpWpZb5Us6=R1`lHW zJ6C0iwnQgA-L5sqr+)HgWt{JixBPmgT+JVEG1pJiZ@oUQ=9J9rC6N|)wYFO7lbvJm zWB`*pXNO2$A}$>V#l-3XdsWJNpICjG4wvVfUcC)h%4O2w+~qe?AuFJ)5l_E&%XQvz zNlXq=SifjGpV5iT62lyrq<}^qhU-d<)1(kvmRH!k-rJD8dPAF+;XjrmJvmY4+M+?7 z8oCT^3E!Do-QV1??Nv-rfUI`P?0k>A+~T=@>FONQ_ltev-1PJzH5RPiP?Ux`7Z+-v zuI>x&rl literal 0 HcmV?d00001 diff --git a/po/yi.po b/po/yi.po new file mode 100644 index 0000000..8383cfb --- /dev/null +++ b/po/yi.po @@ -0,0 +1,2127 @@ +# Yiddish version +# Copyright (C) 2003 Free Software Foundation, Inc. +# Raphael Finkel , 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2003-03-19\n" +"Last-Translator: Raphael Finkel \n" +"Language-Team: Yiddish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: glib/gbookmarkfile.c:737 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '=' שריפֿטצײכן נאָך אַטריבוט־נאָמען %s פֿונעם " +"עלעמענט '%s'" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: glib/gbookmarkfile.c:3417 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "פֿאַרװאַנדלונג פֿון קאָדירונג %s צו %s ניט געשטיצט" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "ניט געקענט עפֿענען פֿאַרװאַנדלער פֿון %s צו %s: %s" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "האַלבע כאַראַקטער־סעקװענץ צום סוף פֿון אַרײַנשרײַב" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ניט געקענט פֿאַרװאַנדלען גרונטבאַטרעף %s צו קאָדירונג %s" + +#: glib/gconvert.c:1751 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "דער URI %s איז ניט אַבסאָלוט לױט דער טעקע־סכעמע" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "דער לאָקאַלער טעקע־URI %s טאָר ניט כּולל זײַן אַ '#'" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "דער URI %s איז אומלעקסיק" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "דער מאַשין־נאָמען פֿונעם URI %s איז אומלעקסיק" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "דער URI %s איז כּולל אומלעקסיקע פּליטה־כאַראַקטערס" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "די פּאַפּקע־רשימה %s איז ניט אַבסאָלוט" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ניט געקענט אױסטײלן %lu אַכטעלעך צו לײענען טעקע %s" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ניט געקענט לײענען טעקע %s: %s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ניט געקענט עפֿענען טעקע '%s': %s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ניט געקענט באַקומען אַטריבוטן פֿון טעקע %s: fstat() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:858 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: glib/gfileutils.c:914 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:939 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:958 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:987 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "מוסטער %s אומלעקסיק, טאָר ניט כּולל זײַן %s" + +#: glib/gfileutils.c:1341 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "מוסטער %s ענדיקט זיך ניט מיט XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "" + +#: glib/gfileutils.c:1850 +#, fuzzy, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "" + +#: glib/giochannel.c:1408 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "ניט געקענט עפֿענען פֿאַרװאַנדלער פֿון %s צו %s: %s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "ניט געקענט מאַכן אַ רױ־לײען אין g_io_channel_read_line_string" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "איבעריקע ניט־פֿאַרװאַנדלטע דאַטן אין לײען־באַהאַלטאָרט" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "קאַנאַל ענדיקט זיך מיט אַ האַלבן שריפֿטצײכן" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "ניט געקענט מאַכן אַ רױ־לײען אין g_io_channel_read_to_end" + +#: glib/gmappedfile.c:151 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gmappedfile.c:230 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "דורכפֿאַל אױף שורה %d פּאָזיציע %d: %s" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "אומלעקסיק UTFÖ¾8 קאָדירטער טעקסט" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: glib/gmarkup.c:578 +#, fuzzy, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "" +"דורכפֿאַל אין אַנאַליזירן '%s', װאָס זאָל האָבן אַ ציפֿער אין דער שריפֿטצײכן־רעפֿערענץ " +"(למשל ê); אפֿשר איז דער ציפֿער צו גרױס" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"שריפֿטצײכן־רעפֿערענץ האָט זיך ניט געענדיקט מיט קײן \";\". מסתּמא האָט מען געשריבן " +"אַן & שריפֿטצײכן אָן דער כּװנה אָנצוהײבן אַן אײנס. נאָרמאַליר & װי &" + +#: glib/gmarkup.c:616 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "שריפֿטצײכן־רעפֿערענץ '%s' קאָדירט ניט קײן דערלאָזטן שריפֿטצײכן" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"לײדיקער אײנס '&;' געזען; לעקסיקע אײנסן זײַנען: & " < > '" + +#: glib/gmarkup.c:662 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "אײנסנאָמען %s איז ניט באַקאַנט" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"אײנס האָט זיך ניט געענדיקט מיט קײן \";\". מסתּמא האָט מען געשריבן אַן & " +"שריפֿטצײכן אָן דער כּװנה אָנצוהײבן אַן אײנס. נאָרמאַליר & װי &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "דאָקומענט מוז אָנהײבן מיט אַן עלעמענט (װי למשל )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' איך ניט קײן לעקסיקער שריפֿטצײכן נאָך אַ '‪<‬' שריפֿטצײכן;עס טאָר ניט אָנהײבן " +"קײן אײנסנאָמען" + +#: glib/gmarkup.c:1122 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '‪>‬' שריפֿטצײכן צו ענדיקן דעם אָנהײב־הענטל " +"פֿונעם עלעמענט '%s'" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '=' שריפֿטצײכן נאָך אַטריבוט־נאָמען %s פֿונעם " +"עלעמענט '%s'" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '‪>‬' אָדער '/' שריפֿטצײכן צו ענדיקן דעם " +"אָנהײב־הענטל פֿונעם עלעמענט '%s'; אפֿשר האָט מען געלײגט אַן אומלעקסיקן שריפֿטצײכן " +"אין אַן אַטריבוט־נאָמען" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '\"' נאָך דעם '=' צו באַשטעטיקן דעם באַטרעף פֿון " +"אַטריבוט '%s' פֿונעם עלעמענט '%s'" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' איז ניט קײן לעקסיקער שריפֿטצײכן נאָך דעם שלאָס־עלעמענט נאָמען '%s'; מען מוז " +"שטעלן '‪>‬'" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "עלעמענט '%s' איז פֿאַרמאַכט; קײן עלעמענט איז דערװײַל אָפֿן" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "עלעמענט '%s' איז פֿאַרמאַכט; דער איצטיקער אָפֿענער עלעמענט איז '%s'" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "דאָקומענט איז פּוסט אָדער איז כּולל בלױז לײדיק אָרט" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט נאָך אַן עפֿן־צײכן '‪<‬'" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט מיט אָפֿענע עלעמענטן; '%s' איז געװען דער " +"לעצט־געעפֿנטער עלעמענט" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט; דערװאַרט אַ שלאָס־צײכן '‪>‬' צו ענדיקן דעם " +"הענטל ‪<%s/>‬" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן עלעמענט־נאָמען" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־נאָמען" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן עלעמענט־עפֿן הענטל" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט נאָך דעם '=' שריפֿטצײכן נאָך אַן " +"אַטריבוט־נאָמען אָן קײן אַטריבוט־באַטרעף" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־באַטרעף" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון דעם שלאָס־הענטל פֿון עלעמענט " +"'%s'" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַ קאָמענטאַר אָדער אַ " +"באַאַרבעטן־באַפֿעל" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "" + +#: glib/gregex.c:221 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "קאַנאַל ענדיקט זיך מיט אַ האַלבן שריפֿטצײכן" + +#: glib/gregex.c:224 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "" + +#: glib/gregex.c:233 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#: glib/gregex.c:237 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#: glib/gregex.c:241 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr "" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: glib/gregex.c:1157 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "דורכפֿאַל אױף שורה %d פּאָזיציע %d: %s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: glib/gregex.c:2096 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "ניט־געענדיקט אײנס־רעפֿערענץ" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ציטירטער טעקסט הײבט ניט אָן מיט קײן גענדזן־פֿיסל" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "גענדזן־פֿיסל אָן אַ זיװג אין באַפֿעל־שורה אָדער אַנדער ציטירטן טעקסט" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"טעקסט האָט זיך געענדיקט באַלד נאָך אַ '\\' שריפֿטצײכן. (דער טעקסט איז געװען '%s')" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"טעקסט האָט זיך געענדיקט אײדער אַ זיװג צו דעם גענדזן־פֿיסל ‪%c‬. (דער טעקסט איז " +"געװען '%s')" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "טעקסט איז געװען פּוסט (אָדער איז כּולל בלױס לײדיק אָרט)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "ניט געקענט לײענען דאַטן פֿון קינדפּראָצעס" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "דורכפֿאַל אין שאַפֿן רער צוליב קאָמוניקירן מיט קינדפּראָצעס (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "דורכפֿאַל אין לײענע פֿון אַ ינדרער (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "דורכפֿאַל אין זיך קערן צו פּאַפּקע '%s' (%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס (%s)" + +#: glib/gspawn-win32.c:445 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: glib/gspawn-win32.c:784 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "דורכפֿאַל אין באַאַרבעטן הילף־פּראָגראַם" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"אומדערװאַרטער דורכפֿאַל אין g_io_channel_win32_poll() בשעת לײענען דאַטן פֿון אַ " +"קינדפּראָצעס" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "דורכפֿאַל אין לײענען דאַטן פֿון אַ קינדפּראָצעס (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "אומדערװאַרטער דורכפֿאַל אין select() לײענען דאַטן פֿון אַ קינדפּראָצעס (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "אומדערװאַרטער דורכפֿאַל אין waitpid() (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "דורכפֿאַל אין קלאָנירן (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס \"%s\" (%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "דורכפֿאַל אין װידערצילן אַרױסשרײַב אָדער אַרײַנשרײַב פֿון קינדפּראָצעס (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "דורכפֿאַל אין קלאָנירן קינדפּראָצעס (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "אומבאַקאַנטער דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס \"%s\"" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "דורכפֿאַל אין לײענען גענוג דאַטן פֿון קינד pid-רער (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "שריפֿטצײכן ניט אין דער UTFÖ¾8 גאַמע" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "שריפֿטצײכן ניט אין דער UTFÖ¾16 גאַמע" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: glib/gkeyfile.c:823 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "" + +#: glib/gkeyfile.c:871 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: glib/gkeyfile.c:3507 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "דער URI %s איז כּולל אומלעקסיקע פּליטה־כאַראַקטערס" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "" + +#: gio/gfile.c:2755 +msgid "Splice not supported" +msgstr "" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: gio/glocalfile.c:973 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +#, fuzzy +msgid "Invalid filename" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: gio/glocalfile.c:1314 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "" + +#: gio/glocalfile.c:1449 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:1816 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:1839 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "" + +#: gio/glocalfile.c:1993 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: gio/glocalfile.c:2141 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: gio/glocalfile.c:2174 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "" + +#: gio/glocalfile.c:2305 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:740 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־נאָמען" + +#: gio/glocalfileinfo.c:780 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "" + +#: gio/glocalfileinfo.c:1755 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: gio/glocalfileinfo.c:1891 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfileinfo.c:1907 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfileinfo.c:1958 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: gio/glocalfileinfo.c:2126 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: gio/glocalfileinfo.c:2164 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileoutputstream.c:269 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileoutputstream.c:314 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "" + +#: gio/glocalfileoutputstream.c:1028 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: gio/gmemoryinputstream.c:497 +#, fuzzy +msgid "Invalid seek request" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "" + +#: gio/gresolver.c:736 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gresolver.c:786 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "" + +#: gio/gsocket.c:413 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: gio/gsocket.c:1159 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "ניט געקענט אױסטײלן %lu אַכטעלעך צו לײענען טעקע %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: gio/gsocket.c:1291 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:1411 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/gsocket.c:1524 +#, fuzzy +msgid "Error connecting: " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "" + +#: gio/gsocket.c:1533 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:1573 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: gio/gsocket.c:1669 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:1812 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:2004 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "" + +#: gio/gwin32appinfo.c:300 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "שריפֿטצײכן %s איז ניט לעקסיק צום אָנהײב פֿון אַן אײנסנאָמען; דער & שריפֿטצײכן " +#~ "הײבט אַן אײנס אָן; אױב מיט דעם דאָזיקן & מײנט מען ניט קײן אײנס, נאָרמאַליר אים " +#~ "װי &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "שריפֿטצײכן %s איז אומלעקסיק אין מיטן פֿון אַן אײנסנאָמען" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "נוליקע שריפֿטצײכן־רעפֿערענץ; מוז כּולל זײַן אַ ציפֿער, װי dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "ניט־געענדיקט אײנס־רעפֿערענץ" + +#~ msgid "Unfinished character reference" +#~ msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "אומלעקסיק UTFÖ¾8 קאָדירטער טעקסט" + +#, fuzzy +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "אומלעקסיק UTFÖ¾8 קאָדירטער טעקסט" + +#, fuzzy +#~ msgid "The file containing the icon" +#~ msgstr "דער מאַשין־נאָמען פֿונעם URI %s איז אומלעקסיק" + +#, fuzzy +#~ msgid "The name of the icon" +#~ msgstr "דער מאַשין־נאָמען פֿונעם URI %s איז אומלעקסיק" + +#, fuzzy +#~ msgid "Close file descriptor" +#~ msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#, fuzzy +#~ msgid "Error creating backup link: %s" +#~ msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#, fuzzy +#~ msgid "Could not change file mode: fork() failed: %s" +#~ msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#, fuzzy +#~ msgid "Could not change file mode: chmod() failed: %s" +#~ msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#~ msgid "Conversion from character set `%s' to `%s' is not supported" +#~ msgstr "פֿאַרװאַנדלען פֿון שריפֿטצײכן־געזעמל %s צו %s איז ניט געשטיצט" + +#~ msgid "Incorrect message size" +#~ msgstr "ניט־ריכטיקע אָנזאָגגרײס" + +#~ msgid "Socket error" +#~ msgstr "סאָקעט־דורכפֿאַל" diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo new file mode 100644 index 0000000000000000000000000000000000000000..f36ab1c11cd348fbbf45a9dbe9a1c841417e7f17 GIT binary patch literal 37744 zcmd6v37B0~mG6&A3nGF{3IcKngj66E5gRc+g-w6=Ep^!@&O?Q`zAw{9iz z`}%v|yI*$w&)IwJY3;SwUVH6*^5fHvTNUt|_l_Vq7o2cX5WMG|LGZb=6dME^!yq^v z+yovEzV7j$$FG9#CH|ZK{hz`2^ZqmNli+W_$>4+wf*=LH44w_1JRk_p2dlur;4Pr) zX#p<==YcnZ+rbZjzXHzykH0VoE(Om8tH4{p5PS$c2YdqLU(m@P)$<+jgW$h`mxIS$ z6a?3TSA#SqcnG`_TmfDNejQYOzXz`XPZ?zhT!+WG2m~(4dB%j zs`maPD1QDD90|UU%tOIj!AroI{{2}{L;D>c{|iv{e*mHscpZ2X_zWn%6hQIq9GE@= zyd6~i3&0z|zXMg@Np$L7@D`67LGkPNp!jqNOjCb91zr!fgC7CE2;K_*4qOi2K%+zO zJD~XaHuz!i1PYOS4g%HRaiIEfzkhE9Pvd(jfU5sqP~|j$AvhP5Tt5%09bfeC-v^cN*C0b0oR09q(%?E!^-crN z10MyIe-p^i1p7g?zXw$Q3~C;|4T`Rs!4%#Mjs{a8 zQz+O7YJPkbRQi zJ63~;YVZ&K{l7tt`$w*^e0PC}YS0cY1YZUv_g9ly@ehKqAXo^hy@x=R|0byR90wD~ z5)1{23hF_%YZEBGd<_)8f9KyX8foKmH>mud0ae~g@O|KJQ2qW2cnbJ)Q02Vs(+7;Q z_6-Boo_qcKXF<*L&ESW?FN13LzksU$)ay*oT<>wJ$K{~fu@6-KF7W-}aSWFDc_#P) za4@L&8^ANbkAr7{b^iSepvGk-C^^^*s=R*%#m5sFMD_D3@Eq_y@I0^;M8tz9K=t!0 z;6(6kQ2OSU8<16SDL4WACaCg0G{(xi2|Si6ft0pMEjOz;qRD)>E6<68j5-#>%m$N9Hf zIb%SjPXSfVXF>JvNl^TL2^9U`fER&1pyc9xAGP{MgLEZGfg`|epvLd#p!j_1$E^S3 zKtw;71cu;~;2>}>DEgm)gTYf^ruuO$sQyj@Rc|vGf~!D8D%cH5&VC0;3eSqLCMKG@1Sh(0{$Q> z!9$?h`#Pw6{{&tP{vK5Q=ih1h$ABuY0o1t61y$Y}@FZ|IsPg_AJRUs$i-#cncX%F6dy-{YS*2h=KTy1mIsSLjr%`=>gR7k zL^%lWw))ec#;qMx{RhDJfxiTYgZ~Y_AFO7wtN)|H5PT3+JzoG-{z~v<@D)({;)|fh z`^VrJ;0gCwedmGV+cp0EQ=syp=Cd6BOOIz!3ZoQ2aRaKCACS@N(X- z2SwKceh_>T6#sXEYWMd+_3MwIC*@u?nEeGh}8U*X@s1ghOX09DT) zK+UJ&H8#I%K&3wco)5kPo&$ax{1Es{@NDpeTAQB(z&73=1f@^D2ddtmfhzaEKVac3VhDTe+v}d zzk7UlgVBE&RQza z`?AL$fGYPl;6U&LO{RZFfy!S4s-Dk#Tn9=X_JN}RcTjSD27{n-MuRGU3V1E}Fn9^L z3mgRg1k}7azS-!;d7K1_z7-T7J3-NZ3%nHk9VodP@Q}&rI8b!cL8Y$-mHuT=^4(=TCM*Bz$^@X73=Z)Y=;QgS+ zV=8ziI1dz`)`6#hUjeTGzXvMc2{UY7UH~fJ9iYaw5xffQ05yJx!Hd9Nk0;Nx_bWh^ ze;=sw+QHMnr$CkSGN|@`&By=9zrO{3koe#&Z;?{!9ly1a9=W9~AvRf@gv6`J9zI z091c&1~p!v0yQ4(p!o9&sB(Hhwf|j@*!&&{s-4$@s_#Cq8k_@;0C)QIUw|R+Cw|`O zE(Ikg_kbS&+dz%iVo>e)BB=g;7rYnzJ$M^<=NH)Pfg3=UfM86!(Qg4Y?r(tV*VjPt z^QYj&;QMCVJh&26|2__?{23nCf#>l4B`^g41w0S@6R7r_JIBhs%;PPf;!~jHuhrv1 zP~*MPr|$vPuD|o?KlJ!(kH42=E;Mg+Oq__8GHd83H}-k!Rp71kGF%T z@;(z(zJ;L5*$al?4?*dLKY|y6Rda3KngFW(Sy23%xPecriE+l-z6w)$Z?u9|ivajseGY zSo}Ot^=t#xpKpL427eD~oIkk0_%#j`zdsFXT$(}Yi+SK^a0U1t@H?RR`y>DUdr<9u z=R#}G6&@b|)z0~#`rQeh4gM|oUhwCj=KWis=#E=t^{P%-u?;KG4UFzR=fs)5Bfhy-GpvL`A;6U*GODx}2p!z))RR2B+s-89< z-vOS>`v(8M9~9lU!IQvWf-3*NK+&E3xRrMmsP;?%L+~L`dx{60iWO+*6;haxMZjj@Nd*RPduqkq1UXQpoOOM-s4 z`uGdLTEaCJ?f%}w`!Jq9=4li;o#*}F4DcHu(=RxkXYIKzBlPmF-xWOT_aTpZ-ayb; zYP_P~d;P-|;3&dO!e99~!CQn+QO4&9@8|hs@NUA*1pWSnAURvB7k-Bc?~8FIoJkPgnFwJokWG2)7Vw3CH>LMxICTd@HEm z%Y@Gnbe1*V)1X$}{&=*1Px0;q4_HK~(mTK35gu_*_UCrs-w5ZC?;m`8=~7l8WBC7i+gdN4;gp63aKjXX~S zA0b4)|KlHi0-i;flt_Cw&woQ)7vVfY8(|`$f%tz0mlLKE2KYRkJnQ#q-v8YmgL}Yz z{`pey?+Cvk4DxyI^=X0!3C%uU@6!m65?J=!?}z-omh=L6w?(`xYGBdvz;VM3NLoS@%dfurp)_yPD+!WaDe z^EKmC`p0^Rs;r)MsHxn-8c`9Kxp_%u~2-gxu^8QUQ`Yq;RFkv9^hrrc@PxAae z@Z*FL1pU?+1Q&qo2=9aD@4#u`SmcPDy*7Qs0zW;ox9!I3v?KHQUx2W}DMZ;&fFoCY+MZPHRlHOoO;3yyvc4 zU2AD*OFC6MD@@PKG(GbcE%K%Y!kktu2`;ZLMi*c(yL)y&G8Ns>`-DQBzEa=(VL|CN*W7s&Bt%!i3<) zRL!)uW+%vDTx(qlxvmYyrkVz|hBevdSz&FaC0)~+ZJ8Bjrz5xVYm%n_lw5O~o;A2y zq8#dBI&8~P+HJSqHlAvl>N53hE!J-)MlC4=b0Y{9vZN9m{L6CIrgPI;v%bf1*|k|_ zU`uL7C|~~6Q&YNOvLYupWSY{GkqBhSH|Q8LwPq)$83yBIU8bovOtjob zQ%P+@+D#P=bwdV`fyp^ZhvrX)4#w)JG*3h}5XnPFjc=TShWJZp)3vuAbLlrB6vs|I zaVom1V(EPF;3zQ~nk;Zo#5p07k)6)&J%A_(TaOy)^d59A>_gXToODS8j%#;#g zu1PmEq~IblkZDC`GY?moh$=*L4AwCM%r#Wp6eg0*#?~weh#6`^voRuWPPL#TYqM=C z-DabktWrTHhbq#jGEJ@NdgQ-fG8NvOZfVTqBqllOo!qQOL=+FQZ(M6jTN64a9o~Ff zx{;ZCYg2Pu>)ox$a$_*o1UqC6YRoi2l#|S-RJ%G|RMn#NYn9WXbxe|`dMR1-=ER$- zhhKFxifa-CE$O;+3k$2%R`t+JSQ%@xUWK~lmbJoq)hb;YFNPIMsAY{7!0C{!nHI(+q;lcKyp0UTX3-KgPG7^t=9X-|)&@nlvSg^hMwBsv7I#()jMAg| zTi23pOtdHx9W}(sh&LeOm4Li$4c33Hu5OqIHh7yuxtto)JO~F2%neA8yNTuH76Ee= zyDEHDe*vkfW>#I=UYka_F=3EHFVEw~-*oHkQ#svG8;r}=v^n#KQDQXPn$j~_SCACOI8`TeO4>60 zP+O{j1vpc$ro`qILmw}N(h4IHo*9v9;LtVp2YlKN=!Z{&0 zreez5bBvivEWjf%Bx-JKG*(CUPiv}v=&{r$W;%N%B!?T-sB)*(j#T+)WQy64Xr!gf z(HaON1MbWxY~3R^Va8O6Zm|!=u{-)e$=-|1A>^Pn)6if|sJ6K@gL$jIHKb@{)FrhM zi{}WP8iHA9;^x#t+KGZQdrP|(sSs)q-$o70T{gN{t~XL;&%1UejQXnd(E6d_D4C|C z2N!dwx#`AcR1gB^=MmDMZ9?i{6RNv8Rg;Fk^12cx)pju6Zy?-^SIK6O4hgX(9aC6f zQP8cF?M5wPj|_G#W&P%7G9_qBO9{ri=2NT`>7a{84nk9>QPPa1+h`G=VHrrZq(_)W z4KIGEE!#RWytqMs>h&kpoXw34##z2la+gS}Pq(^a)eYM-G3)EH35tdk zX3SI-kg%K+>5ZvrO2qn^l4VoHqTe(vnVg+oflVw^GUvmAW(R)) zEM%$rq%5^yHdbO@9M2vt^zu-~^%9ak?exWBVKMxDyTM$F`d`vgAJ4v;&31~dXrF>} z*#_5O(^YPcVTmOoOUjcprmOoUKu0;rLRFVll=C{ijF(Y#Uru7rIVrz;{De$X+f1j% z(=%HWt%)dzHS4Ch;+08LMA?XUsxEROcx94fWy>@s$1tKs6Qx@!)R)*pR7mw(iX)|n zHAVlH&)}5?Hgr6>%O$xajm=U`OQsnenWzfiOU}*vGVc3*O$8A#s{#A0IfFdbV+7Z? zHKba!aLXW~_ID&|bI&B!%#8#530TUDP7(UfmVH#e|o zJ2SGCA$LZ4v0)8u$(${$j&uh5yo?buiYdkEuAN218pm^lE!ryJ9CH&hjkc?w+}5N? zTQ!*7D`QBMm=T#cso0qybKW}^Y&-9XRLO8B$t~H2(98Ugu%0d1z}f_j?EJb~voI|2 z#NZ}Zqq@XMXgkSMscH?Y2IdAQ>71qIgw5tdowHm@Tc0Ra%N6xXIOF-#C%HMpeop<9 zNe>Ix_flM{_Evi}jRuS9c zrH)x+BM)YRVRUO+c?mAAw9RELkv@(!4_<}3Bn#^_XZz!LW6HbKjNOgA_ebh1%Xnzq z0C-Uzfutz)*m63FEe>jFv43e%N2=C*GTyoyBCES*YM8^RjD$>0;mn$XIm^z_IillT zOJYA?^m|lYeBtF+TshLVQ#0`%G^7XPTVU9yrkZVE;!EKrn`M*28krbYE%Kq(9oxB= z4CXPCl}m*yGToGItDoApWbAV{OUmTLyhwxYALMqd^8XEbU{K&(n{4$pIL^x^ z4^l>x%Pp~zGids8sg~}LE0C4!pl|iZgE!xec{q`yKX*JMpFK6$hE{&jYs?AHM%}IN zFvoSH+I8H>)TKC2taRNmVpyd^M0H5(QRH_R+%NSp6Sm>wyyEg>C{cu0U0H$98ite2 zxpC=Naa(6oGHzrAQ&v2P(={h6M#vC}cxmoKkvZKFMNjo|5z|deb5vSRZE^&8}~RoV;w()guwya7|IUk?A#8~R4VX#~g z$aD*KJpSIH71|IN`ae~SyolD2MC(w3(m8I1S7?OzV_maWc=A+8>#D7==2WHyD_LIg zA?DF@-sB2}wKWwLWONz96<(x`4-}jgQsiZS6cLk-mJYKMBU6EzWrWia^I#ffFd<#n z>P~=h*VwTb%FkIU6y{d?DQ$He{{$1*q2O$F?y$0j=C)J=HY&%4rb@gyq78@^DV;qA zMH1GwDU^a(wq~cLIa{b2SUXrP?{f@#?0L!$EQ>j#lNzhlO&vQ{D>V(AcsSERhls&# zI-g_C#dBM`4QBLhIs%=NZk-{+(H#zzT_gx@&)TuLZk5>SisOoN(pJ2^pd1MgnfB!D zV#RBWr;u6Yj+xaMcR@jOzC4Q?Pbo{2;bivG8xw9~Q(vMXTsCk8Czl7NXE;s7iLgzy8?2;yQhO%?IyAIom5M2lf?x;;3Evhw% zg99%4TsJ5>7%4f9GL9q5kr&GDYzrDkKK%pHE|-|9iMQ1$%O&d^E+%~!V+EC26dKuaOc>& z#Nq+C-^b|x#!HF5w@yE_x{6(3{9nEH;pZ@rJgxys-?8eS6I5ldNr z?sTM@9>}exiXFt1TsqQ86YbLw8BK6!`8@$9xi<-m)`Hui1s~V&cr#e*l}vNH(B_v9 zjUUZq51=s&?sBebH}P$z*3|}Oe$&3Um?8qd;9^&zef!+TlF44$eRprd_H=i9A8k=C z@D*yYFOL1)Q?oO4n=O>1#{2Dafr~ATu{&Zkrfhw?JKNTRy7EF&A-z<3e9a-8ZJ9M$ z=OV$~M$!Ln&J$E9J9$7--m{5CS3EX9i$*R;Mya%--B_L^CY5Q*iEI^-J-?7d!|qMY z@ILnoN{PHm7!o;FRBDs~y{XNTGRX6vK_J`Q5KHNq1K+BG1aGQ&(5IxC=28sar)zpb zv(~h|TZ(IjhE)@FRI7YSQ$>T5#U#(N!$Ff0y735ERg&8+hgDjFY~ShxQgbOjwWT8J zj+V@bPIqyf=tFD9cw$LmV3JuF8Bg3N-VF;=b_xd|a#pIEHfN1!i5Q?2Z9tf-(KRiX zR}qc{+PJkeIZbYd45&9%8g06q$#sNA=st?w^(%HQx@wwfs%dC**C+;E$beExbEgzw&8& zPdo|S)lD>u(>%^P?UUxtQ#6ZV))6SQN=nrfPaBFQxeJUKW~sIYZdbWsj(3xovFwSF zc3ED*5%V}nI}*9(4C^RD8#mf+pO%-4pz8iw14`hbHm<0e4VW;4`(()C6ygG5QJXm< z&Q+73l^+~Gv^$4Q>m0F+Vb(15!zV;OnsT#3N+zS)Kqn6_=u+G=*AIr4rMdxb9!qxfrdBFr zMk>?VoT;S{=k-mHMAjxXxeHU}y^hj{xa%=WjlE3C);jwgI}-zo3p_HH)JZ7Zt%}e( zV+SYVKuNFd&RZ!dQxi3;OBQh%#e?^V6vL}Ei`nGVpxr=|V=qeflI>O$M6J|t5odLd zq%#`l2Vms0Oz##JG)%;5xBQqLM1juW0*mUVY#(utJB$xL;jYMN-|i+&$yr{!X~`i; zoJhEB3mI@iIkr~xooFYR(q60~ooX7Y@{fVMt|5zAXItN6%@a}Ii==3TG!uLu8HidU zvrTUD+>0Zt-WOiBn-A{44^>Stsisn1^qeVFyC%qp^2GqW;f@;5ZcU=i>`D?_n<$a%^AD$6vcB0tTvaT~ zelJpWeU%c67yI3LXPF-N{%`K}yGz9JX%Qo(ErMqjZ6E*(8yPyT5EN96 z^Y%4xLftAw!9rgf)TFra;Lcn%BxYRTIGNNiB%CyX&_=jta9ok@mg>t5q&OWE_iDEI z!t6;iKg-ZOQZ)WyXz>U_m!RG4Zp3Fs5cdOZZJsJ($}fes&cLbQE`_FZ(vh9A{`pk;;PUc zZrjEb&49FPUw^66*3lGTpOr}k-d~L2qMq0pQ!q6>GgZrn5{+=Etlqv!4E&%+5~>p= znXV^ee3TYTQGm_G6>-<$*6{Z6_fF8gT$AY>iDvAXMlE|a2W8nP#C!K_BRAA+=Z2zg zO3!d=uMRJcibY5`Jd8)3Z*{7M4UXfzlR4fsN_oaN&7H*)RGP{0jLpnMEI2=?$2Npt z%mZy;C*7$QPil?@GLaU!3tMbvo2x+6)7_zG`1So2&8Wb@h=PgXt{F?s<9UyBdMm`K zxxp1dl-W#k=FBr&^jmw89RI>N(1gZ6EYUt#ihyXxeO> zQz;d4qFLN^8@Huu#`+38%QT~>WMmbFpM8W?FU2KHZe+Lkba$>O#f=M&)vga!wx$)i z^g1KQ+?QdeyV_{hNmpEbb>Pp}{49_U84ZBsMAvw9aAB8RasN-x(1V6qD6up*iEGhp z{*wYevq~@yOWr$s8M*;_;zAV8=DAkufo;lB!hR-70kw1djOgH_NcfK$P z;znpIqED;b9$JG_Y!gI%ZX*?SB{za#i`Fd4x*->Y(e(W4BIT|c5 zQA>so8!~JdYCwA4d``s<$U_aI)rg$DwMq}#iuS9qh!}lofK5dekxL`yKdELPnp>;r z`;8Nv;aGetJ+X@8y$8Eo2ISA@H<smb#U+su+EJS>*b=loo&!yRF!%>;x z*ECf#*Ia?reuE5#+)!4ywwXhl(yc>lnns_f?-q-_9zJx~iDOMCS8K;V!a0>L!w;6> zuDd262O-zFqr)PdYCwTikN002j|i`sl4(8h&IUe&Y^c78WsSXhQ?q-`T{j$Wx_i8C z*ol0qTv)TQu&Sf`>BqVctnS`8`-opE7go>j+P}N|mHqh*ivoNZ(NkNP-@c}Y|5xeF z_H_euZ?><`&)?Vm_|E*gZNzuK{5;X46ua#4!jn6!LQ8n-z}kH0qg{KJ^gMd7>)^Vs zJ^S)=AMM_?F~4jHEy^Eg&u`gvq(U$ArMf;)SXBRCT4MM96@~TBsLH7Ns3f&HDm_1U zc2DOXQMq2x7pO+lgt&^-gu^aeY^V@x$x>HY7lp}E}}JjjEq|+YA_L9d!O&#eklLOtKIvT=C?n| zFa(8lFL%GTzkB~PYQoALg~hWA%b)Cdes*||K1RtLE~>EZ#lnI^`Hr1|rR3WWSjQ2H-t`;0U!asNh~GgI zLMu4G<&~aY&jlKx*H-0s&g)*=nLoHHzhz0jV>deX!Hly=5=%FS{y~Jp zy4`blZO^8~`Ny9@8hUo@&o5nFA+vo#e6)O4pbbN^8&NN}Jl4HzUSa97u0v}zf@=>I zHqJM-(Y>Gp5i6mKkI+2@8paWEAtkIx=+Djjl9y56gvZP|M~_N5vH1CL|Fn_RbZ_0C zU%0JYY6=ThFwsh+rnmix{J|$o$VwCDFUc=I$eg!feCxpCo*mD5ky*Bc`4~+`C$7CQ z^~Sxvn0RvLm+mM$v88uqyPHDm8QJ{e)t(JK2VX8M*^FLdI+!BrT{|zD{WQN%Tq*lB z1H;0Cc1>c&aOvXiR}ba)JlaGbNp2d&m z*Y4_@bWLeW{=h0asb1+bVYH5^Uz3EcJ?&k4UhLWYQkhcsrCMH7v|an3%XiG9U$#p8 zynRmoPzNK#npK#yt?S@nYU$cHFT7Z*AROpvUz}gsVU<}m`OXbp2Ul=K7ZufW_$ewD z@zN*ZnE(2>u>D!obkE@pDB&Q#cy4~#ON>ro@tmH62Pw%5PAnf?`ycN!%nW@b1!OfT zi3YM`9{MZP$Gv1@p{7fwDoi?~e9=fbnWv5@zEaWor&v{-Alnoz^XBEsjFb^ZFZ1cvNdo=gy;$MgwG>IZ77erdMc8{hg}|i(ZB$6cSly z3C{HCS^I&08`E?6Ns~~<#hPLZeqqh-B(s~&V8s(JEmU6bEuQ-_zP0DhFGSyUE z`dYH(GQSGzpGz{pe=h5#!5L5F^Ri@P;7q5gu0xCR&(Dd!mbDDhVlV7t)Vub(S@^=f z?x!MUbS%2lR8^#+Ty@bXnMD=}-s1eh75N2AVn!gMo@)tS6b&b5Ry&g}F2E$WZvjDm z>2l0(x}h?i?x6`6kAzhyucC44Qs^%e)BPU={eCfPW&A(XhKSKK&&7>r3X6qaiwA`b zPj~G(g#OWrYDTF{*QIMreX>yWu6)Xr4G%p#c69GwE=}VMTZ^}Bru>rh7GJb_6Gd54 zsE?#Dql#4|D-A~krLP!rk)i5L*F|si>{{=eU?!#+tjY4+^4@cJJ|;F3uB0kw-C3)> zHGgso*5edGI%FFY!&+%0Q+ zNoSJYM6RpP0KmlFr?&KMua94|RbuTnGMGty2S9n(Z0#>Qb|Ol?Z)(w&bUXB9JL9CT zJ-eij`x3Z0(zEqh*cnD65ZDlv#U>|Jektqf@`?nky;hADjAx!>KcSIN2pUq*+djK5 zPc6PLPtBSPqYGMHdlq)>Swt1dGQGvQ;D!7vtBQL|?~Eu@2u9m=xU;ZwFPgrm^KkE) zPTJVJW|ws_Dy$u4+0!oDGcLiBd=_Wl_Dzk=;Ii>0FN&yQYQ!+P50V5y&*N{frL*K{ zbh;PrF0{`ssW(AYSh}?5@J z9m{2_c0ARyX?HMOI1=KbRBq-%}xc< z@*(>T~4{y$PX$>+drJq>}C8_88{?@`Mv!LFxhA|6^($^hwd+c>xq#5@0e ztK~EiC_K3_zw@!uoN>DU$TfbC*UmC}C$KS9{E2HE(_g-*VMj~<%S-fMyCz#;i?W#P zjWtWumbvp$GvU#1-hOb~b0!2#lt*FvnkuYu`?OV`v)T?@9u$|D-|}L9%U1T;f!q9g z86&%2@NI!Mf8bFm+)yW}Ohn_-dUn5--y(moU!#ihVVTOvt(UIQisnaR3@kmV;Y+38 zBu0xi7VEO*@f=a%w5R9L3h6D@EFR|Xvx)=U3Z>GLSoHVxDL?ViYI5wPF_u1=pEsAS zoRwa9eKsu5?_|5|+^k8Z*{9U_o7H5QN6z6tTRrv+(U+^q9HkvMDbW^^gNk^g;JoE? z@_Y6aRxII|p*%UUk8t^H3+SoXeBgG$*JF+e_1n4XtqL>43$X|9Ui$*I=n0Q5gy>MG z_~~kp-_x02_(IWt-nD0cVckCJiY>4(uJ3-it`5$VVQ^qye&=$U@BmSPmxb47vjb#@ z#xiQc6_jpMD>&>*_NXQ4vX@FzBX2Jqi9S}9+hWnzu?8f)Lu ze8-w%vkD1glins0oETM(BG#`8j*HA`IlcNs#sX0+wRdG_UpiX?`^KBy-LvD3!Ygx* z*t4=e#d}{F6&>F5Z1at#>Xc#aMkKMU3&~tITjW`dvIk}pD*w_sXjGUh11jpjF}G{a zt5#_D<2&-3ITJi0&Hkq}Jn$~Lm2E%JN5tNEj`?m@kk_m$qeC3rt=J$t58-N+m4EPM z{E*fZHb0(7V&I&yabrE5<60!xMS3hxMVjdmXI7LM9b)R--8j!x-fOGaJ>g+wbxf4t zs-po>;m4Y#4}BCNr}2|JY>pP|p>eR!TSP_YI2Bjx!vHy?|jr6?Pw3k)QW! z@BGExtDcg)t$WdCxUK0y_uA$8WiOYwk>W2zL+I7R?ay{^>J*=B*>yHX5PcdN9VAFl zlf)*I)Y3bDsXix-GL)QenS38HTS=ljI>T9OQe3u5n>6_a+^yJwEfw0E(R`bBfeN(a zSvKf)w6J#(dtUSVR6Im>ON%`8b_(hb{JrDxwQc!%i&-qae|)?5dZ@yL|0ytPR1~C< zB$Ux4QV=(l>W;A4^!P(zS@ns$KDkn)hS|2+`yV@Um%6vIaxTE1l0S@6cW3JHS|zR( z)-A~|+=LUJBjrFnXLW|3UaIX9gmGRD4<{R@X*9O(C|kw571G*kCW9LW?g%{9$p*SiS0#+k5E} zNpu>QWCp_!AI=%Kyn64i!|S$nv#z)@qlT0-vgh?hPJ8b*#>Zz$Mb;iz#VjpOHSJ%# z(dj_zBJP~s9nO54zYiPR%`us8W-Z%in)!Vzytf6P9rm4D7No?l39W@TlaEU5$>OOW z+NCy(K92H@ksKGih@>Ln=t`saRCbyTqe+X*&2=wn%{1F6aZt-`5ZOj{Zb}Zb0Zp!T zYU9`<^~{AH{HgdRY)EVZ#IB6^E6t*h&mG_(wEhxEVfz*{y7N1q7Gsv}(5BzJ1_Rg` zchyXw#89|1Y2%)*SQMT-)V&2E-q!o*wxm5CB_vGrpg0%pR*gS)SpQsM-!g5JN@5dj zNPc$dhMH?T$&E-^*0}9SyM~o2;q{Gg5hP<_kExy#T9sC=Xtr%CtUnw{H{%42mo5K6 zWub&3)-s}V3c;wO5`x0hbMUx{%$YMKK4g;tDMzOb@ePFoYuMMw6{y+kWTI>DB2K|f z31A6TS*FB-fc0+siFMn|OGe$3&>J?3b(-idZ}pQ`XL&Ar6&j@Pk>23s5`n_7-dV3{ zVu@9lSZ$1;G_QC~)AWfAtt)IifNzu{y7#Zgn$r3eZ77|rxSI#NyY{a(1KxbmDv(CF zVe$LHh|#`A?W@-9q(^LTRc4gT@FcgW7fP@9ys;yHNLz~pkp#sx$P$CD0~@){g4*+z zLQm%=Rx(+DMR!YVHAJrBNEJ9axBC<3F)p2c?!JdxI5#XRE}XVg^`AGoLzHLfulru2 z_zh%X^mUJ zNn;ZLIq%*7WKZW7dSoMIC1Ps!Y@LUxDJz1jlQA`Fuq=ZWeWVP?ak53Y?)}tHmYOuc zde^mc)6a=wNB2uyq;UMOIa%!b(~tFT+TFcxYe`}L@BuYD?==cYy6LTy*z;sIB>l;+ z-GF}Ye#xJ}77Y=z=EWIz%b>W^x z)e`bcmiBaZ$~4y*z15AOz}*;jlM>FkQfuyeMSqLR>0c>VXEkUgDP00omYEvGnakK0 z*Ic`j$~uoyVB%_jS6H^Ld)HAvqjp_Hs9L5?0Gc5b0sO- zh{s}GiL&r|XZM`FaQ*0%PKk<4CL)6s=^ZdJ^I}kLv}3&AJcI6&#rUAD z;7l(V!`=PFcTHTX>)F~$y z-=v%7YRcnsgZs0BB`lk!*@vw)Rz-z)~v zw}@uV%5^{s-1et*N!=7 zY?6?(SVy{53wrWyN;0+Q@H*KC(ajY%8=dwx=Y@$8`pd*TwxVr)h+NM`W#@-}uzFv3 zgi61AIlwLU& zQPP)&QejMCm}(Ml!zzAY+4aodMMC^-q0NAR8Zpnk)=IumBq#Hlt}$Qjg+jQzE?wky z_VNlX>lo@Lw%d!_c==BWZE&T<`gim7ooqB1Ly8lc-c^UGF32C;jIpQK$YG?f2-Rsm zBlJ5XKR-}TeW`6!G~eud0rXpvK{5#=&%bW!1?G~I>Fc8TD8L^4QVACa`+Yb)i;_A> z6@wojX<4ios8M3>%HamCXjo~@I~2=@hP`vI>H6-)>k6-9!Z`m?kz(26!uIDX(b=~O zOLwpd)Tz`KXZgGG0zL$^DQ5jInw(_`g_k$!V}s2b^X*UQ05CuIC6hNdDLE5-+`a)+ z_1n2ry97rH9MN5cymJ6^KhzF2bgN*`9)CHH#`}$l+kzCHZD+@*i&xBfr*Hgof?El$ zqDI^`4 zMNoDh0$w3|Vuo@!t#90oKKw)MN!rX*g($vt$=au_Q@I4hrB#V?%hOj}9^djpw306N zvdwthKAS#b{pOdno#wu@-S}{3IGy1;5mdth#H~d7w9DY8?>t|zecDImgK50fXWuNu zbg$i$U*=S^O_!u$WL%&sR2$aFGOA8aB_-I^Lhs^`Q0wR>X&l8gNoRkMn9(er&Y$cr zDcTJHN~yZuEv%$DCEc@QUcN*3xJ}EDJnAUvD2@IyCyNXxshncL`6X|-4m&5(fxTLl ml2JBSy>QBJw|yC>Ey`}kBhK3>VeHr)u%Jt+xiR, 2001. +# Funda Wang , 2004, 2005. +# yetist , 2007. +# Deng Xiyue , 2008, 2009. +# Aron Xu , 2009. +# Note:"fd" is abbr. of "File Descriptor", 文件描述符 +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2009-09-09 20:48+0800\n" +"Last-Translator: Hinker \n" +"Language-Team: Chinese/Simplified \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "元素“%2$s”的意外属性“%1$s”" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "元素“%2$s”的属性“%1$s”未找到" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "意外标签“%s”,需要标签“%s”" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "“%2$s”的意外标签“%1$s”" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "无法在数据目录中找到有效的书签文件" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI“%s”的书签已经存在" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "未找到 URI“%s”的书签" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI“%s”的书签未定义 MIME 类型" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI“%s”的书签未定义私有标志" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI“%s”的书签未设定组" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "没有名为“%s”的应用程序为“%s”注册书签" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "用 URI “%2$s”展开 exec 行“%1$s”失败" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "不支持从字符集“%s”到“%s”的转换" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "无法打开从“%s”到“%s”的转换器" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "转换输入中出现无效字符序列" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "转换过程中出错:%s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "输入末尾出现未尽字符序列" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "无法转换后备字符集“%s”到字符集“%s”" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI“%s”不是“file”格式的绝对 URI" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "本地文件 URI“%s”不能包含“#”" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI“%s”无效" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI中的主机名“%s”无效" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI“%s”中包含无效的转义字符" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "路径名“%s”不是绝对路径" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "无效的主机名" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "打开目录“%s”时发生错误:%s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "无法分配 %lu 字节以读取文件“%s”" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "读取文件“%s”出错:%s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "文件“%s”太大" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "读取文件“%s”失败:%s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "打开文件“%s”失败:%s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "获得文件“%s”的属性失败:fstat() 失败:%s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "打开文件“%s”失败:fdopen() 失败:%s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "将文件“%s”重命名为“%s”失败:g_rename() 失败:%s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "创建文件“%s”失败:%s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "打开文件“%s”写入失败:fdopen() 失败:%s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "写入文件“%s”失败:fwrite() 失败:%s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "写入文件“%s”失败:fflush() 失败:%s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "写入文件“%s”失败:fsync() 失败:%s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "关闭文件“%s”失败:fclose() 失败:%s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "无法删除已有文件“%s”:g_unlink() 失败:%s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "模板“%s”无效,不应该包含“%s”" + +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "模板“%s”的不包含 XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 字节" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1802 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1807 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "读取符号链接“%s”失败:%s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "不支持符号链接" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "无法打开从“%s”到“%s”的转换器:%s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string 函数无法进行原始读取" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "在读缓冲里留有未转换数据" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "通道终止于未尽字符" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end 函数无法进行原始读取" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "打开文件“%s”失败:open() 失败:%s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "映射文件“%s”失败:mmap() 失败:%s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "第%d行第%d个字符出错:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "无效的 UTF-8 编码的文本名称 - “%s”无效" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "“%s” 不是有效的名称" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "“%s”不是有效的名称:“%c”" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "第%d行出错:%s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "分析“%-.*s”失败。它应该是字符引用中的数字(如ê) - 可能该数字太大了" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"字符引用没有以分号结束。很可能您使用了 & 字符而又不是一个实体 - 将这个 & 变" +"为 &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "字符引用“%-.*s”不是编码一个被允许的字符" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "发现空的实体“&;”。有效的实体为:& " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "未知的实体名“%-.*s”" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"实体没有以分号结束。很可能您使用了 & 字符而又不是一个实体 - 将这个 & 变为 " +"&" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "文档必须以一个元素开始(例如 )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "“%s”出现在字符“<”后是无效字符;它不能作为元素名的开头" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "字符“%s”无效,应该以字符“>”来结束空元素标记“%s”" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "字符“%s”无效,在属性名“%s”(元素“%s”)的后应该是字符“=”" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"字符“%s”无效,应该以“>”或“/”结束元素“%s”的起始标记,或紧跟该元素的属性;可能" +"您在属性名中使用了无效字符" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "字符“%s”无效,在给属性“%s”(元素“%s”)赋值时,在等号后应该是引号" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "“%s”出现在结束的元素名“%s”后无效;允许的字符是“>”" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "元素“%s”已经结束,没有未结束的元素" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "元素“%s”已经结束,当前未结束的元素是“%s”" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "文档为空或仅含空白字符" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "文档在一个打开的尖括号“<”后意外结束" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "文档在还存在未结束元素时意外结束 - 最后的未结束元素是“%s”" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "文档意外结束,应该以右尖括号“>”来结束标记 <%s/>" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "文档在元素名中意外结束" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "文档在属性名中意外结束" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "文档在元素起始标记中意外结束" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "文档在跟在属性名后的等号后意外结束;没有属性值" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "文档在属性值中意外结束" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "文档在元素“%s”结束标记中意外结束" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "文档在注释或处理指令中意外结束" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "无效对象" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "内部错误或者无效对象" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "内存不足" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "达到回溯上限" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "表达式包含不被部分匹配支持的项" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "内部错误" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "不完全匹配时作为条件的后向引用不被支持." + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "达到递归上限" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "达到空子串的工作空间限制" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "无效的新行标志组合." + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "未知错误" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "表达式末尾的 \\" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "表达式末尾的 \\c" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "无法识别 \\ 后的字符" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "这里不允许使用改变大小写的转义符(\\l, \\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} 里的数字次序颠倒了" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} 里的数字太大了" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "字符类缺少终结的 ]" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "字符类包含无效的转义序列" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "字符类的范围次序颠倒" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "没有可以重复的内容" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "(? 后有无法识别的字符" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "(?< 后有无法识别的字符" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "(?P 有无法识别的字符" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "只有类里支持 POSIX 命名的类" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "缺少结束的 )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") 没有开始的 (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 或 (?[+-]数字 必须跟着 )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "引用了不存在的字表达式" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "注释后缺少 )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "正则表达式太长了" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "获取内存失败" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind 断言不是定长的" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( 后有形式不正确的数字或名称" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "条件组包含了超过两个分支" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( 后应该有断言" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "未知的 POSIX 类名" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "不支持 POSIX 整理元素" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} 序列里的字符值太大了" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "无效的条件 (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "lookbehind 断言里不允许使用 \\C" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "递归调用可能导致无限循环" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "子表达式名里缺少终结符" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "两个有名子表达式有相同的名称" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "形式不正确的 \\P 或 \\p 序列" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "\\P 或 \\p 后有未知的属性名" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "子表达式名太长了(最多32个字符)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "有名子表达式太多了(最多10,000个)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "八进制值大于 \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 组包含多于一个分支" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "不允许重复 DEFINE 组" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "不一致的 NEWLINE 选项" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g 后没有花括号括起来的名称或可选的花括号括起来的非零数字" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "非预期的重复" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "代码溢出" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "编译工作区超出正常范围" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "未找到之前检查过的引用过的子表达式" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "匹配正则表达式 %s 出现错误:%s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 库编译时未包含 UTF8 支持" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 库编译时未包含 UTF8 属性支持" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "编译正则表达式 %s (于字符 %d 处)时出错:%s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "优化正则表达式 %s 时出错:%s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "期望十六进制数或 '}'" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "期望十六进制数" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "在符号引用中缺少“<”" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "未完成的符号引用" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "零长符号引用" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "期望数字" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "非法的符号引用" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "丢失了最后的“\\”" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "未知的转义序列" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "分析替换文本\"%s\" 时在字符 %lu 处发生错误:%s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "引用的文本没有以引号开头" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "命令行或其他shell引用文本中出现不匹配的引号" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "文本在一个“\\”字符后结束。(文本为“%s”)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "文本在找到与 %c 匹配的引号之前结束。(文本为“%s”)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "空文本(或仅含空白字符)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "从子进程中读取数据失败" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "创建与子进程通讯的管道失败(%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "从子管道中读取失败(%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "更改到目录“%s”失败(%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "执行子进程失败(%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "无效的程序名:%s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d 处的参数中有无效的字符串:%s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "环境中有无效的字符串:%s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "无效的工作目录:%s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "执行助手程序(%s)失败" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "g_io_channel_win32_poll() 从子进程中读取数据时出现异常错误" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "从子进程中读取数据失败(%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "select() 在从子进程中读取数据时出现异常错误 (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() 出现异常错误 (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork 失败(%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "执行子进程“%s”失败(%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "重定向子进程(%s)的输入或输出失败" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "fork 子进程失败 (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "执行子进程“%s”时出现未知错误" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "从子进程管道中读取足够的数据失败(%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "字符超出 UTF-8 范围" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "转换输入中出现无效序列" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "字符超出 UTF-16 范围" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "用法:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[选项...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "帮助选项:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "显示帮助选项" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "显示全部帮助选项" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "应用程序选项:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "无法处理 %2$s 所用的整数值“%1$s”" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s 所用的整数值“%1$s”超出范围" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "无法处理 %2$s 所用的双精度值“%1$s”" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s 所用的双精度值“%1$s”超出范围" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "分析选项出错:%s" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "缺少 %s 的参数" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "未知选项 %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "在搜索目录中无法找到有效的键文件" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "不是普通文件" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "文件为空" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "键文件中的行“%s”不是键-值对、组或注释" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "无效的组名:%s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "键文件不以组开始" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "无效的键名:%s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "键文件包含不支持的编码“%s”" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "键文件没有组“%s”" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "键文件没有键“%s”" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "键文件包含“%s”,其值“%s”不是 UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "键文件包含键“%s”,其值无法解释。" + +#: glib/gkeyfile.c:1530 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "关键文件包含关键“%s”,其值无法解释。" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "键文件在“%2$s”中包含“%1$s”,其值无法解释。" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "键文件的组“%2$s”中不包含键“%1$s”" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "键文件在行尾含有转义字符" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "键文件中包含无效的转义序列“%s”" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "无法将值“%s”解释为数值。" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整数值“%s”超出范围" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "无法将值“%s”解释为浮点数。" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "无法将值“%s”解释为布尔值。" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "传递给 %s 的计数值太大了" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "流已经关闭" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "操作被取消" + +#: gio/gcharsetconverter.c:264 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "无效的套接字,不能被初始化" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "转换输入中出现无效字符序列" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +#, fuzzy +msgid "Not enough space in destination" +msgstr "没有足够的空间套接字地址" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "不支持可撤销的初始化" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "未知类型" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s 文件类型" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s 类型" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "非预期的过早的流结束符" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "未命名" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "桌面文件未指定 Exec 区域" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "无法找到应用程序需要的终端" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "无法创建用户应用程序配置文件夹 %s:%s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "无法创建用户 MIME 配置文件夹 %s:%s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "无法创建用户桌面文件 %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "%s 的自制定定义" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "驱动未实现探出" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +#, fuzzy +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "驱动器未执行弹出或 eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "驱动未实现媒体轮询" + +#: gio/gdrive.c:726 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "驱动未执行开始" + +#: gio/gdrive.c:828 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "驱动未执行停止" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "无法处理 GEmblem 编码的版本 %d " + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 编码中有不正确的符号数量(%d)" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "无法处理 GEmblemedIcon 编码的版本 %d" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 编码中有不正确的符号数量(%d)" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon 中应为 GEmblem" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "不支持该操作" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "包含的挂载不存在" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "无法复制目录" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "无法将目录复制到目录" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "目标文件已存在" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "无法递归复制目录" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "不支持符号链接" + +#: gio/gfile.c:2759 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "打开文件出错:%s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "无法复制特殊文件" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "给出的符号链接值无效" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "不支持垃圾箱" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "文件名不能包含“%c”" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "卷未实现挂载" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "没有注册为处理此文件的应用程序" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "枚举器已关闭" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "文件枚举器有异常操作" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "文件枚举器已关闭" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "无法处理 GFileIcon 编码的版本 %d" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon 有不正确的输入数据" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "流不支持 query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "流不支持查找" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "输入流不允许截断" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "流不支持截断" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "错误的符号数量(%d)" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "类名 %s 没有类型" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "类型 %s 没有实现 GIcon 接口" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "类型 %s 不是类" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "不正确的版本号:%s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "类型 %s 没有实现 GIcon 接口的 from_tokens() 方法" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "无法处理提供的图标编码版本" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "输入流未实现读取" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "流有异常操作" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "没有足够的空间套接字地址" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "不支持的套接字地址" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "无法找默认的本地目录监视器类型" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "无效的文件名名:%s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "读取文件系统信息出错:%s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "无法重命名根目录" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "重命名文件出错:%s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "无法重命名文件,该文件名已存在" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "无效的文件名" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "打开文件出错:%s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "无法打开目录" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "移除文件出错:%s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "将文件放到垃圾箱出错:%s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "创建垃圾箱目录 %s 失败:%s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "无法找到垃圾箱的顶级目录" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "无法找到或创建垃圾箱目录" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "创建垃圾信息文件失败:%s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "无法将文件移动到回收站:%s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "创建目录出错:%s" + +#: gio/glocalfile.c:2170 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "读取符号链接“%s”失败:%s" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "创建符号链接出错:%s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "移动文件出错:%s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "无法将目录移动到目录" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "备份文件创建失败" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "移除目标文件出错:%s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "不支持在挂载之间移动" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "属性值必须为非空" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "无效的属性类型(应为 string)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "无效的扩展属性名" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "设置扩展属性“%s”出错:%s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "获取文件“%s”状态出错:%s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr " (无效的编码)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "获取文件描述符状态时出错:%s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "无效的属性类型(应为 uint32)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "无效的属性类型(应为 uint64)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "无效的属性类型(应为 byte string)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "无法为符号链设置权限" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "设置访问权限出错:%s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "设置所有者出错:%s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "符号链接必须是非空" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "设置符号链接出错:%s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "设定符号链接出错:文件不是符号链接" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "错误设置修改或访问时间:%s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 上下文必须是非空" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "设置 SELinux 上下文出错:%s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "此系统尚未启用 SELinux" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "不支持设置属性 %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "读取文件出错:%s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "在文件中查找时出错:%s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "关闭文件出错:%s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "无法找到默认的本地文件监视器类型" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "写入文件出错:%s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "移除旧的备份链接出错:%s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "创建备份拷贝:%s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "重命名临时文件出错:%s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "截断文件出错:%s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "打开文件“%s”出错:%s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "目标文件是目录" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "目标文件不是普通文件" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "文件已经被其他程序修改" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "移除旧文件出错:%s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "提供的 GSeekType 无效" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "无效的查找请求" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "无法截断 GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "内存输出流无法改变大小" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "改变内存输出流大小失败" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "挂载未实现卸载" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "挂载未实现弹出" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +#, fuzzy +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "挂载未执行卸载或 unmount_with_operation" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "挂载未执行弹出或 eject_with_operation" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "挂载没有实现重新挂载" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "挂载未实现内容类型猜测" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "挂载未实现同步内容类型猜测" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "主机名 “%s” 包含“[”但是缺少“]”" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "输出流未实现写入" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "来源流已经关闭" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "错误解析 “%s”:%s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "错误反向解析 “%s”:%s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "没有 “%s” 的服务记录" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "暂时无法解析 “%s”" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "错误解析 “%s”" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "无效的套接字,不能被初始化" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "无效的套接字,初始化失败的原因是:%s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "套接字已经关闭" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "从文件描述符创建 GSocket:%s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "无法创建套接字:%s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "指定了未知协议" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "不能获取本地地址:%s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "不能获取远程地址: %s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "无法监听:%s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "错误绑定地址:%s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接受连接出错:%s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "连接出错 :" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "正在连接" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "连接出错 :%s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "无法获取未决的错误:%s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "接收数据出错:%s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "发送数据出错:%s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "关闭套接字出错:%s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "等待套接字状态:%s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "发送信息出错:%s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "Windows 不支持 GSocketControlMessage" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "接受信息出错:%s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "连接时出现未知错误" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "监听器已关闭" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "新增套接字已关闭" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "无法处理 GThemedIcon 编码的版本 %d" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "期望一个控制信息,却得到 %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "非预期的辅助数据类型" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "期望一个文件描述符,却得到 %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "收到无效文件描述符" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "读取 unix 出错:%s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "关闭 unix 出错:%s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "文件系统根目录" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "写入 unix 出错:%s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "本系统不支持摘要 Unix 域套接字地址" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "卷未实现弹出" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "卷未执行弹出或 eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "无法找到应用程序" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "启动应用程序出错:%s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "不支持 URI" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "win32 不支持关联的修改" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "win32 不支持关联的创建" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +#, fuzzy +msgid "Not enough memory" +msgstr "内存不足" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "内部错误" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "" + +#: gio/gzlibdecompressor.c:243 +#, fuzzy +msgid "Invalid compressed data" +msgstr "无效的主机名" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "转换输入中出现无效序列" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "达到数据数组上限" + +#~ msgid "do not hide entries" +#~ msgstr "不要隐藏项目" + +#~ msgid "use a long listing format" +#~ msgstr "使用长列表格式" + +#~ msgid "[FILE...]" +#~ msgstr "[文件...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "字符“%s”出现在实体名的开头无效。实体都以 & 字符 开头,如果这个 & 不是一个" +#~ "实体的开头,把它变为 &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "字符“%s”在实体名中无效" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "空的字符引用;应该包括数字,如 dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "未完成的实体引用" + +#~ msgid "Unfinished character reference" +#~ msgstr "未完成的字符引用" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "无效的 UTF-8 编码文本 - 序列过长" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "无效的 UTF-8 编码文本 - 非开始字符" + +#~ msgid "file" +#~ msgstr "文件" + +#~ msgid "The file containing the icon" +#~ msgstr "包含该图标的文件" + +#~ msgid "name" +#~ msgstr "名称" + +#~ msgid "The name of the icon" +#~ msgstr "图标的名称" + +#~ msgid "names" +#~ msgstr "名称" + +#~ msgid "An array containing the icon names" +#~ msgstr "包含图标名称的数组" + +#~ msgid "use default fallbacks" +#~ msgstr "使用默认预案" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "是否使用通过缩短在“-”字符的名称找到的默认预案。如果给出了多个名字则忽略除" +#~ "第一个之外的名字。" + +#~ msgid "File descriptor" +#~ msgstr "文件描述符" + +#~ msgid "The file descriptor to read from" +#~ msgstr "要读取的文件描述符" + +#~ msgid "Close file descriptor" +#~ msgstr "关闭文件描述符" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "当流关闭时是否关闭文件描述符" + +#~ msgid "The file descriptor to write to" +#~ msgstr "要写入的文件描述符" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "创建备份链接:%s" + +#~ msgid "Can't load just created desktop file" +#~ msgstr "无法导入刚刚创建的桌面文件" + +#~ msgid "Too large count value passed to g_input_stream_read_async" +#~ msgstr "传递给 g_input_stream_read_async 的值太大了" + +#~ msgid "Too large count value passed to g_input_stream_skip" +#~ msgstr "传递给 g_input_stream_skip 的计数值太大了" + +#~ msgid "Too large count value passed to g_input_stream_skip_async" +#~ msgstr "传递给 g_input_stream_skip_async 的计数值太大了" + +#~ msgid "Target file already exists" +#~ msgstr "目标文件已存在" + +#~ msgid "Too large count value passed to g_output_stream_write" +#~ msgstr "传递给 g_output_stream_write 的计数值太大了" + +#~ msgid "Too large count value passed to g_output_stream_write_async" +#~ msgstr "传递给 g_output_stream_write_async 的计数值太大了" diff --git a/po/zh_HK.gmo b/po/zh_HK.gmo new file mode 100644 index 0000000000000000000000000000000000000000..3c4fba99cbebaedff9fc993426a9690b06c061c5 GIT binary patch literal 41655 zcmd6v33yz^mG5s>CM1wRAnf6?7|UQ8+ib=*W;NhomVkjUF)?kaB{i1Ridw=pgo$jh zE$;@r;N1p;jg2=J+jvVdlVoNxGs!GjW=UqUs9REI^74{QW|Da?nfLqGseAi&t0gOM z=6m1M=kmXA)v4{&sZ*y;)xH0C`g>Oe{B3?$5S$O5aY_(WzdHy%bgp89;ENXr!AHR_ zfhU3A^7uWEd5=Hw_)Cw!0Y3=+`!2D3r-2{g`5f>O@N#e(_$-(LyTEh6+b<1*3&F?0 zVPFTS`gektfycpHz&!XduxdyUJP6(ho&l}`uK;&~Rp7V55d2T@JTRmXstU$~s_!xI zEbvKiH26GtJ@^&yBJe-KtHFzg2Emo!L!j!N4_*as1XbT(fuq3RfYsoYR4)2QLDjbu zRQvXWA^25L{p$wRuG4tnXHX3e2Ok1ya_|gD6N1-3SQ`AL$6tW_3qE$aweu!0Uk7+HuxB*_}QT9-v*|@KLc+EtLdcp z(guoeuYqI1?}DoTEDE~`d<0Z|>%fP>Z+jd8bHuOtp!jr%|J2_e@J8^|kwI_`cn>%U zd=`8T{5lwdkC9pYoCAIwTn$Qo-v-s+zXsKhUjO`V8hJX;=YYyL98|uWLFIc4)Hpm1 zUIeZM#jhiv=>7pb6Z{WQQ{y8HzRI}*48fZ~Rpvw6VFa$pe(`?DX+}4ywK`P~-nwkRcAPzb*(Es-OYX zd|C^N?r%K)1f0P0Nn?V5sT|x6YM#sh)sE#LQz_UDs=RN3;=_9>O!9FFsD9Ld%D)tp z{Ja6GUw;dJ6nsC8QhUz@i3-MplIth@^Hxyf{|}(@{R(7C1ec8qf<@r{pydC1pyJ;< z-sb&CQ0=V+RemR^_Ur^{YVb`^^__Bqwd)R0{b&MJ&j$beHSl9R{~A>OkH8d_Hx@hv zoC>PnkArIWLh!@jTcFDOGAO!VfNJNvV2-c~RQvAr&pGfyp4Wk=gNMO$!M^|z#h?dN zyUxGK^w1|f<~(iy)xNKQXMsNjF9c7z+4TBQQ2ZVPsy~x`d<`f$Z39KW5Ih@v&By;C zsPX#_D0%tcpy;Ym^5Xa1;6>nUQ1Z7PyZ}51GPQ$mf#SnSw+6u!@LKRra4{%7^-U1g z2It*Io4`jvmHR5Fa{n4seg6uo|7T3J_S^zWAJ>E8(+cona2F_keI3;JzMD$U2gid- ze*_eNJ_oA&m7vD!0I2qU6-0#uzXB1F;EFqJd>g>acwPXi+&!S`?E%jL-$SRw{|i8k z-yPs-;O~Q%fQ_K~u>w>-_ks6-zXA7wlP9sp=^0e}W_`kN1vrG~9iZg)>!A2>(p@HR z*MO*o;4%Na8bn10UjjAWKLgdT_fhE;;B{aK)_^MaSy24h35q{|44w)87*zX%yGfHc_;FrJ~!5@Mnz>7a= z^Wl@A+T8$3j-LY6?lqw5c?XnS{Qy+HGw(O~yA2%4a}y~3ZUV)puYsCJKL#%c-}8XU z(Fl+x2X}*rey|Z#dw&2b-+P%PlCw)e)qfYL{7svP~4;L9MQ z6&wOJ?(cor+IbPkR1GGB8vo}&joa&>>hA$h0nhoA$>mV+BRoF>s{fCJA-D)sJ-a}a z|3&ar@Oz;2%fEovfG0m<<9-vU_{TxfcY@0Q3aEA*2F1^B`R9KJMR)q|Te(+)8ixs> z|4m>O_@|)cy21K^q93{d)D4ybvy3snF93cMct8L0ML zG1c&HPqWcF><9+6%mVYRy^6mgbun81Dmx1Sj8^F=vAy9Px460qHea6Ob z7^wc;2c8eMgOcy(!4HFnLCM9}z_Y>Mf;WI?O*8p^5ELKgfNIxH@B;8CDEhw#)t+B~ zs`p)wS$*e#7xFv-48hNM{Jh64;Kzyo5_m26egAw`%IutLL8aG#OWzd)b3yU>BQ+-P zmw6oF@mh})Jl^i{9#H*!2>bw82WtMbfRBMsgZvBrk^ksIa7(S}@0UQ$o3DZz_g{jV z7iXufKf^)E7#QSY@Xc?O0H&ss{d6`^?e&W9sCujc6=~n z<9{ir`acDV?`_~%@C9%b_;s)f3?8>~hJhO2yFkg$3@`*Y`}i+{<9Pl)_%wL_3>$}a zpvvC~iobvA@mHYuHMG&@!6!iR`&m%+z6f3pehIt<{1;IA<;o`O|6`!iJ3+<235tJR z;1%En&Bn(`;A1>DgZF~p0M)+>vzGsppz?nXRR4E_8jl|Ee(=1OAead@gW_iaycGPs z&szVh!Ap3)$3M4%>embY`2hG~p1%X026ls&fxiYNM`5e!uLYtwihw;1t6#Z90wd2Pg zPiwdKjRBP}4XU5dfEuq?LD7E$48ec%c-9kE?ig?c@zcR8!RJ8L^Cd6@^Puv-A7+mS zt3ky-4l3VbQ2aUUvD>GgG0W!3HK61n2WmVwfp>!609DV~vkk|C(z}oO=XId+9S7B) zUQqJ-p(jmFt^mc)M?uy9G0Ub)eGk1+NDm2i5Ow;8^gR zpvwL5=Pciqpwd$yQ#*JLR6BkRy7oV9^KLvC65j$U|8w9Fa6fnr_#N;z@RUEWe%%kM zT~CAJ%U=KdeNgQ?{qsgw4N9+k3OpU`07LKvQ2l)ilpKE>RDA{i{GkrZe?F-4?*Kmz z&H`258t?+}3*Z^x_rMFmpMy7or_ZtW-4ALUo(09{y&k^{Ud!_b=9>Py2|SPIhx~IZ zcs9?Sp!%~FRQr#Ds`ne*LJ+WQnJy2bwa9WdniPeIMAAA_p* z_tshbxuE(r4%9f_2~Gf;LCM!{AO8(dj z&)q)$&q3wy0ae~_!7<<^8>}BwLCIYQsQI)PRC~YS@du##@e5G-PupnxxfawoJpxK@ z)`H^8m%*FC9#H(ee3S9#eo*b`0M+i*;K#we;K#tPgKB>sJP-UOsQjmGHojaBY8*Zd zsvXUs=w1L-?q2W$@GGFo`w^)5@*h6_vMn|rZv)lec2MKC4OF>*4XRyv@O<#MpxSfZ zRxAGsQ1W#%DEXKHs=v!Tz5%NKZ~OFr1;_Dx)=Sp@2SD|w9Xtoz2)+xPPKf^g%KuRN zhmiOJ;gde@8h%UelYa+z=q79AKk-q2Jp{E~e>an^zhU5b@HFr{U^O@!dj)npoJ^2@(cg{yzKu{v(BC1#4g7u>{4C*2epmUl(LC=X zoI*f!ga1L$-!h-B-%APa=K0UTZz{t7eH#3R|E+U6{appV0{+H5G5>g;-XLt?_p^k%318&-BZMyz#_}wAN`d;j7W`}b8JxuLQwZ~Uz8?Gs za60%S@cV@5?^NQx#=~a_E&T5A3C;YLEKdWYzm)&+2Od|0ZxbGc=I_8e!8zc^2_NP6 zzk>G@{+6J>#RkFqNn1hC-=&1p`TacMRDNd&a|s{u>A&RnGD7s%$`8$v_mIAp@F>5} z_Ozb@XZYWuzm_nQFxSW3sYw2ABQ&^Q__jRG^fX#8^!FeEHR>kZ6GHztAG%xkeIucb z->p91FL?fh|NTL570+KF4E1qq`K`Z;2s;TsAzVrLPlEnlCEV+hclU4*fOImFd~lL-2oMfhXF0>Wbi{Y^6np7i>5ch9{5yY>j>*TT?e?3=Q{`|5#Go1x!^m5 zI>I?TuLoZwJjm~*gv0#)6yYht;{^R}B^)E%NBSd#8T@V}{Fd-Jo`-`|2($V9zd`-2 z;`hab=6Y*Fyjq`e8APq>=j_Y$JN&HhJ*xG(ejn`y2e77Q6NsxF*(i{Tv}@AAlrqD#Ne;}kF#)@2&gZL?d_`fb=APM_Vz zvtce6IwUtV%;du6Y+INLt;(8)RBNiHE!`T{Wg8o_GpU`lq2q^!amu(b(-tXYlLo4<`T?_k78B4J>LqpD~?+>%BVbzVFzM}fk+Dv_>Ef+Sm=i0*QY0p#Y zn?5@n77Pn#X4)FE?QLPUCEYAeR|PkR)3ezbO{vxy5VwX8-apB;mWH;bQ?;|h^sG#- zEf?H8J=dmj3fr4Av%=bJQ;Jc@Wou@n8Oqw))^skHwt>yHx3pwi+o&_!Oqc0iZg#FM z-4xthTT7(RLv)S!R2$sflx=4ivvpxpx+&W_J8VsVwms7dX}pK4)*~-%4M;)iiBzUBHN6qeS}Vd_OR6Rv+}zUAn5jv%WoX2`ErQ(G;N~2)XDqUY z?zvP6V@aD4!K+3GH@CI5W~R4OqZ1FB7YUquR<1f4PWxj*1iC#Pv%WdoTz$`jlP3qa zq-tigx47vM#>Y`vkp%laP2W!Gkz*R83U zjBlzoM0)C{WwO(l?i%M#1ZEr@$q{BPzcB*Sq zb4z>M18vB1Q*f&ZcF4-slxc=2Cz(&Fc6GYA0Ep7BfKD^lF-e;1rMl6^Q*N&wb?u2L z#v}+@({<@qmT{@A>JgW--qvQlVs?u=deVB;CJh}gu@y_G#UfBQnO<(;AZsq V32 zHjfLNvMe!;nHdt5+1YmK8KxdxY=Ub!CS0-fc-axtn`K}~x98emgsqr-i55ko zqlP#cVO>#Qw?-9+JB_LGC7&ms1yTeB=LR47)k^k-Y8=@^M@b2^-kFx4~!wd2~UOVy7UOja?|SwSH=+^9yCJFPa*Xgn?h&xS-JEnSY*Ko}WtXOv+<57>m6 z4HDgm82J`5CZ4t z5z?P+M(SY`s@s{AxAn8Ggh{m>O!V6lH{(^ZnYqJ5Y)Quy7FZN?8)dsui`s_%af9A( zekN0bwzQOBqH8|IN|6q|Y}`;Zbs8njSh{T;@fntZRBL*yY1Htt&$egV#)X$P>c4vZ zmuku8#sw3tjQ@{xzi*KZ4!o5^446Hdm~=VLLHqeO)#|(U`)FX;1+P%Q=zWl$xPL zte@#wHdQS8%`=k8*(WNniDgRWd^p7H05I-;F)2|>q&ws8x#>`Wz%99&D*dD-qGjo+ zX<4@cEV5clchuzaYT`863uQxJl2$g%SkCE;V?=GLEtP0QF`)^QB~_o4rB=+wO3aJn z*`tMC9?H00Lei(5zE~_QhQDt&m`hRrOIqsV*{!pMPq7v4Q*bWZ=o)Og%FQt>u|#A^ zd6LF-b-x7YC?{E{>avP*UdNa5GK%iYN$fc%K<WG+MBJT6?o5bJZ|*wTvxM zVn$^8q+%z7%zW=~ux-94QYE9DgtulJ@tQfUGCZtj`!b|9K_mOWuGTCMOFTKa-PNcr zF%sHl@~c$khE+py!;*B)0*gB}Hmq|iY-#Hg#cCO&UI}eHulgjnWZ37ae=_x9p*(f; z${B3P0a`Ee{FSvP&1OYTxl$tSz{=ZQnX;ea8q$r-Q`=akn)(*iqW!E&v_;L0u4`=M zFHJCvZp|n!!NrxfxvVA9)3HXv+fbKeVV&k|e;jX0c~_gUyNT!iNS(zQ4~-iDFUkyS ztx^Y<(@AV`P)m#bU5gs1TJzO-t8cih@tTG(hYK4CX-MJZnvR*vj?uZjJc%RSjstwX?EU3dD+-+*2gJoAb#;yH zxrY7(Jg! z?Tu|2oei>0{cO8)SJDY5SCC1%Y`C5CQogE;GP*@uk_$~g&fC(xcm=YOy}Hs{n{mdb zWyrcIGRdEW-thpo=@d>g;{yXKwcWIwvSaK7055?vB51s0K(%9;k%<{`o>;THlhLrs z`tD9TVyDNjeyL%GR>#OY(m!E44%Vwi50dcOt1A%p8ILi=TgIRl2nA`HXgkw%?aTeTbuw%Lw5F4fJq{@dt>9Km7>XFk~{ z-0`4nRqdq{%qr5Ro1e(EW}7upN-6B%!XI|jbH39Y_irZVili&H0$t9#V64-v@pSgi z`S{2{4PhgtbpUHN9rVqSiEb5`TR&!`n;Ct{HI`0;&}kcg_hf6nlqhm1MmA_0Vd@XF z8i`N0B8WJtM^tD-TxhWvck|%CqoDsFLD z!dg<9R`voq6Bus(Oy^6lP*{6&eAr>yOj1xfHt{mzY^~y;6iX|mh`4>CbVe;P#1*Jn zEIAu8|E*C5lhbu=?))2Pl^qIt&7;DcJu|(%j>E5DGW#%G&CVHEww&IbYQz%f(3Ct{ zWz3w@HcJbwPF{l|2`l(?N9(0NkKNH&`SI30X}I9difq}vCmXs; z0=l_lXHAYv&ShQkhDbn;guhT83ij^ez3y%>UEQI(8s{#7NSTypapNm3Y%-n9UV1CV zNhS3q8p72JXUfMLFp`~sav;H0ieX9+7w@&G2`#OeC)^&jk<$Yymg(Y>J72Rt_nVWe z6i;M0Tg9iBZMFKNra8We`!$?;z-;x3fuK6(CANIAOc{Od>WCWYBoNgrN;ZIEp>v#g zc1gv$?SUD?j>yNjLkY(MTYRDmFnwuM4J(>Xp>f0n_tqwlX4U@0!3$TfZWtOJER`JR z*%&b!qEiUh^Ai;|A#smOI{>X1?hH`}7S&NvI>s4naj(e2O}=0Rd!L)@(5~E=ejH zjp9vtmx6nveMG69o``qHPn`d9;R5sLUfaNVJtD}ts0@W zT`h6WY9!Jbk<-%*pllUsVU8l*6$Py%+H%`Ywoi`P*=TNnrL<*U?Y?)+A_8v^U|_R4 z=m^u4ufKt(JxwWdMd91?fcKymr4Em+R-4#L2p(w2&eRRYQ0_8+s*uQ`OZt+S`;)GBzuDEi-1dx8pOCy%endp4zbP{O8&MJyL2 zqf}baKrT-blgc#r6gKQgwqMvHq4KtL_$l`nloEM`Gdyx{snjR~T3NeEWze}y1`XEk zhFB^UYk>0?s|pf)+IGI-Wia-vn--Ezu+_(z3N<6bswp~1S3aewqG8Emk~a;)p;Hr@ zcYv%a$@wh8DlLiT5^w@pa;8p2)EzD15uI*Ixrqg>?K%<*76X&a!pL~yKJji?Pzcju zk6gy8rrlXfnuQl@g}pe;)#wtP%c}^-0_|Ys7NB}N0z!GJ(rEV?P0qO8WsT5nA-joL z>{@iaIMZCy*zPX5484Q_rPP*GTSL(XqNwtAiy)X1c_d+yuFKjg(IRc=F3MtROwp-L z*^HeM-B5Fd`n$)>c{6|g%r7B|XL~|5I6ny5AU5`k?ihI@rbIj=*uEV)IjBaOE zr^~nl~ZGX$? z-1Sln#T5Rl(1tnQHX|!+{*iWBfMNoCSun{HT zFHJkcp?Gz-PlhaxG_H3RwV5*^T{Q_>oknmP;7-Yl&aq;rtXb-Z=TPLEDmPlxoXE;^ zI_$ytPFa{vwQ7bp*H&lis=X{GlileuOM1ygVRt)wS__5)@}_N{#>@6`ID$~}IsihF-dry!=wk$Qd>ulw{j?#y_%S%d)-Ehg) zy8Q%J0OlLlt7MF+lTf%jFXpi%qfW!bfs$U^jl@z?rY34wS772Yiq|3{Qp~!xEJm4A zgLXfVtI}}>FWGKILG6^9MdGYZ^K???{1l9Qmg(Kff`$QF?Uo<2vMA7*b6`>3l9s?z15Zruh|)bMlQEaPh$yd56*toZTY6wRLYBT1&*Dm zjl;vKlL_sF2ZzNK>E^HA)?0mD%e9U$v8tKrW7T1Yx*q84e)AG0voGNFeBb%mO)wJR%Sbt?o$43)~ zyCGehj%w@68ds7jzqIAO@)^|n#Z`dbSQX zmWo9x@iWC@#tUIpBZtND-hCfC;iawP7Z03?6;x6kv5LsdLJm2(smB z7Ef)7XFwt?@}IVvDlyN8^nrV&0(sL*el(*310xD%qPumjb%isHIHxyzoL(JPG4@fX zZ_9fal^f-!?P@^#bgxg%r&D~DpwvNfu@m2mgA=5SBSu;#=>z1{T*a&(fTF#5uoSL- zPd?}tNEg9jJD#lP08AUDetW8;^9Gi!Y`fFX6>_4c-3>CgKW)L34ZJu=JxA1`8b8~3)M1~$T&SphOb7{VoWx~HbgBvFy6f8ORuAjY`<@VZ$Z2yXT?^gxZ+GxAO%OLin|r-Q=o}InoMM|G>T|)axbSev4Yo*k zroxh!MErX1m$d+!o40D&pukdg_Cc|Ho3hbrCi|qSDK#t8)ZP?wz8rU$i(>vhVqce( zc6QOUidQ-=(>Ikb{uS47bp}(?PIr@|!D=0~WYoyvBS)g*v}l@pu-E||Kfq`;A}3e8 z(u4NmX24iPj9#k2K&6VvKNRzyR5P~C16g$J#|dsrQG6;r=ZxdMv()pk!v7OwDRrd@7C8eXUv9AJvm;s~@trI=N+u4?7$^V)Rubt~vSswBAUr zzB^Z+sja@Hy*^hxh12+x@4I(O^{rAMOx5b!&?95R(IZEVtR8t)_2_HEQKQCQJ*Il( z)gwnjSbaabLQ}egZglnN>&PG4*)pzDH?M$G_ znN&6$|M;{9UUN;g-!wbbkj;)jFO6uMIf0zb_3hjZub#psC*|Xymsc69?$p$~i~oj& z~WhE0%We*iQkys~6|DFYbM2N7s>Ku7WFn#~KnX z7*rkBv?v!1iungG>1+3~J^2kgde>~|UA@rS8q;pr)xB#k{H0&{d2@PP`>nX{xrcw$ zv1G!JI+h0DkQ_gZBVC6&@*Rtdd~w|#49!oEu2V@hDpDUED0Hs&UmYl{Iz*-UFU;%R z(pgycO83SN_qBn-8_!b>?CjmL8@}?j0epB-V~8lMKh(W{TmIl1-3MOC?|zX!1`H03 z>wfb{_uKo`+?9I^%Q_2-j`i%{8tSTb*nQxQ{N~NkPFjMnu_MSY+LE95imLECY%9|^ zMwxH)Y+aJyy9=7a!j9ez9Z>e{c(E}5K<}=V-G`3#Ze5z+w!N_WD5KTAatEnaZue`4 zdsn{@6c#L0?2g6xqsx2e9O~UN4^9LW-ZN)!{>b6(U5jbCZD7N$LyLT~m%kMh79N+F zb?#%(x{e%B&qrTs10jCo_rG4~*sj=7E;g_TF|*^SF_S^;-MGoVBjBr=yB4vusgd8d zzp!deKpn_&e&2%b^?Q1kJlnHvLC?#_sMQ{6k*BbP!m78#VMkh$(7o`T!k$I6%Lvy*9t?I1W`fG9*_yOOk!RTgI(RdN;mgt%~d^nI`Yd`=a+3}B3mbHnQHZHG4XTh80LM3InYIBJ=_0HLpKXSyRtu$f5(!%O}`R9(IYHe75 zdUQ$8Yj1dIc8Z9Z>s5h?b#F4ymUoKfNi{5giy6y67Y=B#$#-sKxbsU^2POnGo)sZK zSF1zUp*JF(DN46o^sb-Zb8KN@`T9cViYU=%?SA{!P;)ix+5U22(~92pYrEe#oa7-MbE5dVW^ygS!VM%L1-Q7*|9snXC13m&)Uts9WQsky@Cc6USHI^c7+#$ zLg&uz&ATgoRDc;^O)qTNncuU7O1j=zoL{(9Y&?2MDsa!%-Z?Lr_M_y&#?66ckRD?C zXxSfiZP>jRab2ps^S1XT7*i=dzxSJLl6PExn!d;e%GMM{em=b0Xq z)ZD}Qy|1FY!ym5f2zyY#`xZcJqp3M&Ukwm@53V!yk7@|=OXlTQ?CLtKx=qN$`eo~T zjxJ@F;U-Rtc80EO4JCQ1d{A{84;-MbeufXp*wu&{ao%Ut))Io;15 zu%TvP%?R+hI*zJ{o*hRtuR2$I6}n^rGK45rETX*50qL9}r=FQE8K}sJ)Yx6vu~w$Y z2{S}vLLFvZoFJpIL~Pr)x@Y_Ig~hMKEedf)E9R=_)!f4Fml7Ri`5&MqT}PI}V6&{y zy;}6>vFlG^?c9n?)I5or?u_CNM$8OBufU@cf=Yw9gw+hWW)VbN=NBCAUVa>NfS4o? z>_vPhfQi2P@>C1D*;$B8P*v?3ECcuW;{2;~{cHK!DtMmlS(2Z(0~4%!?J-0pzkDZi zmrh%Z&CkH;XpO}H3cBaOJT=*=yr9&4Mp0T1U|QF)`NoP8e!jRjV%q>&V>`EOGy=~m z*9VP}(^(XF**FxalwM?SS_+I|Iy>Ff@B8_l^8dLmwR&w{alB^VmMJ{D98Kdi`Le*T z;+<=HIv1jts*10`42$_3*aBgS8DZ^Sd$fDy=H4ZHdv8ZUKj zdpH0=v>6zP#O*066WHPrHH}?_TTG&7*`sFrJA)i+hdENQAR{xwrEh=zx>AW1vS5#| zF}B){2vfFa$D+!$Y(B^)CuycuCUb30S|1h3%-r)UL8Z2Jzy7)mS*rBE*i&dumX2qT zAS+FQeO~dnjYu@fDmKOltufK=v46rB257Zeb6O^CA6HgNP`YrN8=;KGq%?nglU3t$ zRALb{wq+fFhUrjPdBAokl`BF9)^F;4=4~ykeOSma^{(AEK!=T>r*jcjFxy76H!D^Y zQ=YIiB$-8T0J0L3eSk@twCvaI!XO)SNKw-s( z{JzB%`IVphW^c!wfkw^A`LWYLj)VcoyS}ie zu<{+PoOo8)BCVa9?>sU9ec^>UtgdYF2cmJ?lmQ4%s95^$e)^Ucv0wXxWPt(pYJQ>L zE%wbOjhxV!k*stt?!Z@ZLh{1$hd19hr+oe#YAy9q6Si`^s}&cWq#k%3c35Lh{A@Bu48YqDXu_WvFY8b4rpJn zX@&e@ZWpATFxwj$Fw0kW9eEl1jD(`!szNbWUCLlMha0RKfDJK?Y03&EHo>|L^ZQq^aJwsNG82?y4ioRSw5ocxE|mf3nwqS~;^Rj8q@{02ler}&VuqyB zsl=FT(Z>?v2(gjbvS49p&N$tFF(H12K5249HFX`^VB#7R#-B`xW6H8dI;g+&sOUKT zgeCUL!95y%v>`4bmI+(xMDHCo5>_{#%^kxI)9>fpw#r=i#qF4VErIQrJS^s!(Z|2IuVRf5`dGE-|{ZYZJ#HgX@ zDQ-;SO9*isRYQ%FD?XvHO7UP8-ku|I-?lx!Z@JM&V_;_+uE&wgp#tMCA|wm~skBMd-hS1-{GmgI7nU;D1|l^F zr)g79CtD%fXGd9`6NufZPDh;UPfc>iSJsS@W2WVAB_$##Y}h0m(hOoq6C# zl`Oe)Uf7{`i~I?#^;dqBINhB$hjzAL_5p{k-7g)c zoAEfxExV#K(e{^L=svV3p*@WU3A5iATg>5SlbztkJV?gs+$>J;u3$%Q7E)3^jjTv* zrh4zvx2;yoP%LZVYivoirkLmz&tBX)spT>1vYfW5>UnieVgKBqBG0_rED|1DwY=2F z4e;I_wIHh7bdXN{)^9OiTC(?v4CPHWXNFuDM^~}LX$G#?71w0q<9qS^zWhr%f-o}8 zOeb8)p7xy{NzH<=6nUIK_zE-DEJdpz=DHt6v;t?>`;MCe>pA!)%rS-p<)lupBqfar zmCV3?F7+s7Y~r)cF5;3DPCjh2o-&8tFRpDyQx4kZeqOb6`YNKLcWvam!!^=Rg>l zKkArc9F&RRPC3fUi4J1?IwF?4J2Fw><@DxTE)I({bY+^jHT@M;d3ddYlFa^KGmf(X zu|8wyTVpVhxz-WbIY80~b6t9^XY0oN(hj)BX$31gtCLN2QoV-jnR5(l-Zl{>3%U+p z;}0@uvt}!uSE*Z$vQtLNdlv2uqAxKR3!SXK$oUGU7+-22BZJ(#V0j_RVk$VwRdSj> z*t~IBRIiS@gMO-Xx14kZqN3HN=5jdd%sMmQg6^Y-^ZTBQPVAOHLsJt6kocgYV@XbF zxrAcghk&~)Qk?7G%5Pg|TuEN3vHLW1#hUbJ@AFGYPcIk?k16Vo46HYg;@2`JTKmU(Z(=}RYrH~XMlE_+?kXOK-Rro4y(eN zHTico`$i^f*|0Rfcy0Gv9o&cs)cej?Y)x`b7Q2{aH_K#rxtlDehQ+?<-j2$5i?FrX zGejzut&sEGs6Wm!_ATg%cP!EUqQGBC^5+?@=9tRgFro=mE_vFuHy*xnBC5q1iG2*6 ztpL$P*BWShV7IgvqdOIi8^;~B6{8n&_-A`R`a$#!=oG)E7({&J&z&Q)RH>hC8AEjbEKR(hTLn6VO>hZ5+a-gf9qYL;U|VsJ*~z$-7O_>MB4e~ap5xmR z3!~$5>y%kK>g>@~Xpy1@ptNWkutI72PB{B5UZUt;ij_3$p# zHpRb}^bA1Q(%@3=G1+qU?^3pLU$w!ur*F zkRywch+Dl$&2Dl6n`{u=y5VoR=n5Vu&!{NllaA5fK8UAFjdI>dwdqAS^zMWmRb>*y zURv(E*p|a-r*rmrGi|Gw-J&s*R7I}X(EXM>kFP*?d`UT7sRutkKWst~7YSKF(0G z;_7Vw@Cq+b?mDL5TU%6dz!P6$uq0KR+_YCLBeHc8cb)?DU3`i}TkJYcNvy`x-B&Ta zT#{zP-A4sGP0Zz9EQDxU`qj%BlhKD4N+}}K9ivW8Lc3)UWe*DLcF8LpnY#GJBekc? zO>~zny0qWIr4m@D-MzDM_0e!hjjRxpS!o8_DwNoqy6r$bV@{P*W2LE!Yy0-2*|->j zg2FzQ&FV;z?WlGBwgmZMR_y)|Wj_}tl)<}cWk_0I>5#ha_NTUAV5gvVJ8xl<-dL54 zv4Jo}iYHkw>2lf0tR#x)etVVEIrmQriue3Xm2F!s$Aa4|+EEowqSBIet);>SRp;!l zZMIbxiZIcivJt$5E(SdZ_vVj3XKR1NH*2*u&e8+U^W3FBcY~^Dhu%J0%X5o+QLuWm&W)`~I>+)PI|k)LY!#zqzW62CGU3DQ;3G z$uO@_$(*L3%;*v0ncuJv%g4&>UeB4>YA%o%KYaE5uDA=#*PJS}c^e|JZu;w*yfMK_kUY{=clmb5Z z*wLNb&BaG@)@V0sx@>Fx2~=qOJq4Aqdxf}oczMM#k}b3X%xhl!nt~l*_D44mJIq$> zhaJU4aSA(313vd~X*70~jTro^@`zS_!sofxPR;wtVLr3HZDNT#Qw3=#z`5WLs@? z%p((C-U)lX#haS6z^pV#i@JaZKl$BtR^F{(Uf|_HD4ohX(MGAvXAqd1C82lO2V=;Z z(@0j@+~qw-_hLB919T$d`1bXnh}}_@D6zTo97y_oSmBv@g*WHeBxAFV)ooq^a~gQD z{Q$XK!9VBhAC$~?DaixH+hQc%RqJD4QE$n0Hzz!=9%IaOhCYez|y z8|GhK!Ha-LLVaV9n7$B`-Z6W^eKu&Rv>cdheOH5cYOZY`61eM+==--F{KBZF_S0GTq)g zXNxxL?){@=s(H0629pZ*>U6WNHnc@3IyW)`f1|)jYS8oYMsAY(wZWa_^mcT}+q-Bp zlcvhOWI1ebRPNQRif?81tt7wmdA$WCFWb(Z*Iuen0s9l){qW6j-&&~DjQpGp*s3vA zwgtP#u`>3EnS0*7PQ@t>uOV>k4+AB(TQ{wPrNXs zd!F58!khfELO*ko*{2O`e*IzH-e*}@b&%IhIED1yPP5L{LEapu;rix+FI=-;8(4fg z7zlkb7<scLsG zEDwst+G82YKE2RygOJGlo_EZ|kUlu{dOxjMv81s3l}glZ(^=TKzvq=N;Qr!H0+*2k zKCXcNWw>noO<`hOlqcA+TJP5N`Htt6JjTyTmSn9nY+~JK72-+U)3K&|{no(ylicwY ze*Tg(_?dGj8lJSF}xo<$4ilzH^o2Lf(XPw7tX-EIs>%=7euhJFsn$EHX*3S%c`NT6y TT!?05G+ovosJ6AFeBk~M-v&xV literal 0 HcmV?d00001 diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..9416191 --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,2108 @@ +# Chinese (Hong Kong) translation for glib 2.x +# Copyright (C) 2001, 02, 03, 05, 07 Free Software Foundation, Inc. +# XML glossary from http://xml.ascc.net/zh/big5/gloss.html +# Chao-Hsiung Liao , 2005, 2010. +# Abel Cheung , 2001-2003, 2005. +# Woodman Tuen , 2005-07. +msgid "" +msgstr "" +"Project-Id-Version: glib 2.23.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-02-27 20:39+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Hong Kong) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "元件「%2$s」中有未預期的屬性「%1$s」" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "找不到元件「%2$s」中的屬性「%1$s」" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "未預期的標籤「%s」,應為標籤「%s」" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "「%2$s」中有未預期的標籤「%1$s」" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "在資料目錄中找不到有效的書籤檔案" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI「%s」的書籤已經存在" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "找不到 URI「%s」的書籤" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有定義 MIME 類型" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有私有旗幟" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有設定羣組" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "沒有名為「%s」的應用程式註冊書籤「%s」" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "以 URI‘%2$s’ 展開 exec 行‘%1$s’失敗" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "不支援將字符集‘%s’轉換成‘%s’" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "無法將‘%s’轉換至‘%s’" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "轉換輸入資料時遇到不正確的位元組組合" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "轉換時發生錯誤:%s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "輸入資料結束時字符仍未完整" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "無法將後備字串‘%s’的字符集轉換成‘%s’" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI‘%s’不是使用“file”格式的絕對 URI" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "本機檔案的 URI‘%s’不應含有‘#’" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI‘%s’無效" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI‘%s’中的主機名稱無效" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI‘%s’含有「不正確跳出」的字符" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "路徑名稱‘%s’不是絕對路徑" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "主機名稱無效" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "開啟目錄‘%s’時發生錯誤:%s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "無法配置 %lu 位元來讀取檔案“%s”" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "讀取檔案‘%s’時發生錯誤:%s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "檔案「%s」太過巨大" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "讀取檔案‘%s’失敗:%s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "開啟檔案「%s」失敗:%s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "獲取檔案‘%s’的屬性失敗:fstat() 失敗:%s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "開啟檔案‘%s’失敗:fdopen() 失敗:%s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "檔案名稱由‘%s’改為‘%s’失敗:g_rename() 失敗:%s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "建立檔案‘%s’失敗:%s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "開啟檔案‘%s’作寫入失敗:fdopen() 失敗:%s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "寫入檔案‘%s’失敗:fwrite() 失敗:%s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "無法寫入檔案「%s」:fflush() 失敗:%s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "無法寫入檔案「%s」:fsync() 失敗:%s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "關閉檔案‘%s’失敗:fclose() 失敗:%s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "現存檔案‘%s’無法移除:g_unlink() 失敗:%s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "樣式‘%s’無效,不應含有‘%s’" + +# (Abel) this is file template for mktemp/mkstemp +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "檔案樣式‘%s’沒有包含 XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 位元組" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "讀取符號連結‘%s’失敗:%s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "不支援符號連結" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "無法開啟將‘%s’轉換至‘%s’的轉換器:%s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "在 g_io_channel_read_line_string 中無法讀取原始資料" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "用來讀取資料的緩衝區中仍有未轉換的資料" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "在字符未完整之前,輸入管道已經結束" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end 中無法讀取原始資料" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "開啟檔案‘%s’失敗:open() 失敗:%s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "對應檔案‘%s’失敗:mmap() 失敗:%s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "第 %d 行第 %d 個字發生錯誤:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "名稱中無效的 UTF-8 編碼文字 - 不是合法的「%s」" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "「%s」不是一個有效的名稱" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "「%s」不是一個有效的名稱:「%c」" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "第 %d 行發生錯誤:%s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "無法解析‘%-.*s’,字符參引內應該含有數字(例如 ê)─ 可能是數字太大" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"字符參引的結束部分不是分號;很可能你想使用 & 字符但未將它變為實體 ─ 請將 & 轉" +"換為 &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "字符參引‘%-.*s’無法表示任何能接受的字符" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "出現空白的實體‘&;’;可用的實體為:& " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "實體名稱 '%-.*s' 意義不明" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"實體的結束部分不是分號;很可能你想使用 & 字符但未將它變為實體 ─ 請將 & 轉換" +"為 &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "文件開始必須為一元素(例如 )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "‘<’字符後的‘%s’不是有效的字符;這樣不可能是元素名稱的開始部份" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "字符「%s」只有一半,空元素標籤「%s」的結尾應該以‘>’字符結束" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "不尋常的字符‘%s’,屬性名稱‘%s’(屬於元素‘%s’)後應該是‘=’字符" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"不尋常的字符‘%s’,元素‘%s’的開始標籤應該以‘>’或‘/’字符終結,也可以是屬性;或" +"許你在屬性名稱中使用了無效的字符" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"不尋常的字符‘%s’,當指定屬性‘%s’的值(屬於元素‘%s’)時,等號後應該出現開引號" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "字符‘%s’是無效的(位置在關閉元素‘%s’末端);允許的字符為「>」" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "元素‘%s’已關閉,沒有開啟中的元素" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "元素‘%s’已關閉,但開啟中的元素是‘%s’" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "文件完全空白或只含有空白字符" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "文件在尖角括號‘<’後突然終止" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "在仍然有開啟中的元素時,文件突然結束 ─‘%s’是最後一個開啟的元素" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "文件突然結束,本來應該出現用來關閉標籤 <%s/> 的尖角括號" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "在元素的名稱內,文件突然結束" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "在屬性名稱內,文件突然結束" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "在元素的開啟標籤內,文件突然結束" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "在屬性名稱的等號後,文件突然結束;沒有屬性值" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "在屬性值內,文件突然結束" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "在元素‘%s’的關閉標籤內,文件突然結束" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "在註解或處理指示內,文件突然結束" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "損毀的物件" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "內部錯誤或損毀的物件" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "記憶體耗盡" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "已達回溯上限" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "此模式包含了不支援部分比對的項目" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "內部的錯誤" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "部分比對不支援以反向參照為條件" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "已達遞廻上限" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "已達空白子字串的工作區上限" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "無效的換行旗標組合" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "不明的錯誤" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ 於模式結尾" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c 於模式結尾" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "無法辨識的字符接着 \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "這裏不允許使用改變大小寫的轉義符(\\l, \\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} 裏的數字次序顛倒了" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} 裏的數字太大了" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "字符類別缺少結束的 ]" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "字符類別中無效的跳脫序列" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "字符類別的範圍次序顛倒" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "沒有東西可重複" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "在 (? 後有無法辨識的字符" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "在 (?< 後有無法辨識的字符" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "在 (?P 後有無法辨識的字符" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 命名類別只在單一類別中支援" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "缺少結束的 )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") 沒有開頭的 (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 或 (?[+-]數字必須接着 )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "參照不存在的子模式" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "註解後缺少 )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "正規表示式太長" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "取得記憶體失敗" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind 判斷提示(assertion) 不是固定的長度" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( 之後有格式不正確的數字或名稱" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "條件式羣組包含了兩個以上的分支" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( 後應該有判斷提示(assertion)" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "未知的 POSIX 類別名稱" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "不支援 POSIX 整理元件" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} 序列中的字符值太大" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "無效的條件 (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "在 lookbehind 判斷提示(assertion) 中不支援\\C" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "遞廻呼叫可能變成無限廻圈" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "子模式名稱中缺少結束字符" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "兩個命名的子模式具有相同的名稱" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "格式不正確的 \\P 或 \\p 序列" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "在 \\P 或 \\p 後有未知的屬性名稱" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "子模式名稱太長(最多 32 字符)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "太多命名的子模式(最大值 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "8 進位值大於 \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 羣組包含一個以上的分支" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "不允許重複 DEFINE 羣組" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "不一致的 NEWLINE 選項" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g 並未隨着具有大括弧的名稱或選用的具大括弧的非零數值" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "未預期的重複" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "程式碼溢流" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "編譯工作區超出範圍" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "找不到預先核取的參照子字串" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "比對正規表示式 %s 發生錯誤:%s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 程式庫並未編譯對 UTF8 的支援" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 程式庫並未編譯對 UTF8 屬性的支援" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "編譯正規表示式 %s 時於第 %d 個字發生錯誤:%s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "最佳化正規表示式 %s 時發生錯誤:%s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "應為 16 進位數字或「}」" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "應為 16 進位數字" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "在符號參照中缺少「<」" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "未完成的符號參照" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "零-長度的符號參照" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "預期數字" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "不合法的符號參照" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "缺少最後的「\\」" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "不明的跳脫序列" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "當分析於字符 %2$lu 的取代文字「%1$s」時發生錯誤:%3$s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "應該用引號括起來的文字不是以括號為開始" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "指令列或其它標為指令的字串內有不對稱的引號" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "文字在‘\\’字符後就終止了。(文字為‘%s’)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "字串完結前仍沒有對應於 %c 的引號(字串為‘%s’)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "文字是空白的(或只含有空白字符)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "無法從副進程讀取資料" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "無法建立管道來和副進程溝通 (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "無法從管道讀取資料 (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "無法進入目錄‘%s’(%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "無法執行副進程 (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "程式名稱無效:%s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "第 %d 個引數中含無效的字串:%s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "環境變數中的字串無效:%s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "無效的工作目錄:%s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "無法執行協助程式 (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "當 g_io_channel_win32_poll() 從副進程讀取資料時發生無法預計的錯誤" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "無法從副進程讀取資料 (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "當 select() 從子程序讀取資料時發生未預期的錯誤 (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() 發生未預期的錯誤 (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "無法衍生進程 (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "無法執行副進程“%s”(%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "無法將副進程的輸出或輸入重新導向 (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "無法衍生副進程 (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "執行副進程“%s”時發生不明的錯誤" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "無法從 child pid pipe 讀取足夠的資料 (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "字符不在 UTF-8 範圍之內" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "轉換輸入資料時出現無效的字符次序" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "字符不在 UTF-16 範圍之內" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "用法:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[選項...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "說明選項:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "顯示說明的選項" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "顯示所有的說明選項" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "應用程式選項:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "無法給 %2$s 解析整數值‘%1$s’" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s 的整數值‘%1$s’超出範圍" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "無法給 %2$s 解析雙精度浮點數‘%1$s’" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s 的雙精度浮點數‘%1$s’超出範圍" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "解析 %s 選項時發生錯誤" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "缺少 %s 的參數" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "未知的選項 %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "在資料目錄中找不到有效的設定鍵檔案" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "不是正規的檔案" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "檔案是空白的" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "設定鍵檔案中‘%s’行並非設定鍵值配對、羣組或註解" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "無效的羣組名稱:%s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "設定鍵檔案並非以羣組開頭" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "無效的設定鍵名稱:%s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "設定鍵檔案包含不支援的編碼‘%s’" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "設定鍵檔案沒有羣組‘%s’" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "設定鍵檔案沒有設定鍵‘%s’" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "設定鍵檔案包含的設定鍵‘%s’(數值為‘%s’)並非 UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "設定鍵檔案包含的設定鍵‘%s’的數值無法解譯。" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "設定鍵檔案包含的設定鍵「%s」的數值無法解譯。" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "設定鍵檔案包含的羣組‘%2$s’中設定鍵‘%1$s’數值無法解譯" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "設定鍵檔案的羣組‘%2$s’中沒有設定鍵‘%1$s’" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "設定鍵檔案在行尾包含跳出字符" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "設定鍵檔案含有不正確的「跳出字符」‘%s’" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "數值‘%s’不能被解譯為數字。" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整數值‘%s’超出範圍" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "數值‘%s’不能被解譯為浮點數。" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "數值‘%s’不能被解譯為邏輯值。" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "傳給 %s 的計數值太大" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "串流已經關閉" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "操作已被取消" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "無效的物件,尚未初始化" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "在輸入中出現不完整的多位元組次序" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "在目的端中沒有足夠的空間" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "不支援可取消的初始化" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "不明的類型" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s 檔案類型" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s 類型" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "未預期的串流過早結束" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "未命名的" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "桌面(Desktop)檔案未指定 Exec 欄位" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "無法找到應用程式要求的終端機" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "不能建立使用者應用程式組態資料夾 %s:%s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "不能建立使用者 MIME 組態資料夾 %s:%s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "不能建立使用者桌面檔案 %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "自選 %s 的定義" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "裝置無法實作退出功能(eject)" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "裝置無法實作退出功能(eject) 或 eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "裝置無法實作媒體的輪詢" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "裝置無法實作啟動功能(start)" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "裝置無法實作停止功能(stop)" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "不能處理版本為 %d 的 GEmblem 編碼" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 編碼中記號 (%d) 的數量格式不正確" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "不能處理版本為 %d 的 GEmblemedIcon 編碼" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 編碼中記號 (%d) 的數量格式不正確" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "預期為 GEmblemedIcon 的 GEmblem" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "不支援的操作" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "包含了不存在的掛載點" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "不能複製整個目錄" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "不能將目錄複製到目錄上" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "目標檔案已存在" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "不能遞廻複製目錄" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "不支援符號連結" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "分割檔案時發生錯誤:%s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "不能複製特殊的檔案" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "提供了無效的符號連結值" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "不支援回收筒" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "檔案名稱不能包含「%c」" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "儲存區尚未實作掛載功能" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "沒有應用程式註冊為用以處理這個檔案" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "檔案列舉器(enumerator)已關閉" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "檔案列舉器(enumerator)有異常操作" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "檔案列舉器(enumerator)已經關閉" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "不能處理版本為 %d 的 GFileIcon 編碼" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "給 GFileIcon 的輸入資料格式不良" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "串流不支援 query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "不支援在串流中搜尋" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "在輸入串流中不允許截短(truncate)" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "在串流中不支援截短(truncate)" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "記號數量 (%d) 錯誤" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "類別名稱 %s 沒有類型" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "類型 %s 尚未歸類" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "格式不良的版本號碼:%s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面的 from_tokens()" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "不能處理提供的圖示編碼版本" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "輸入串流尚未實作讀取" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "串流有異常操作" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "socket 位址沒有足夠的空間" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "不支援的 socket 位址" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "無法找到預設的本地端目錄監視器類型" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "無效的檔案名稱 %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "取得檔案系統資訊時發生錯誤:%s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "不能重新命名根目錄" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "重新命名檔案時發生錯誤:%s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "不能重新命名檔案,該檔案名稱已存在" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "無效的檔案名稱" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "開啓檔案時發生錯誤:%s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "不能開啟目錄" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "移除檔案時發生錯誤:%s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "移動檔案至回收筒時發生錯誤:%s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "無法建立回收筒目錄 %s:%s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "無法找到回收筒的頂端層級目錄" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "無法找到或建立回收筒目錄" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "無法建立回收筒資訊檔案:%s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "無法將檔案移至回收筒:%s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "建立目錄發生錯誤:%s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "檔案系統不支援符號連結" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "建立符號連結時發生錯誤:%s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "移動檔案時發生錯誤:%s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "不能將目錄移動至目錄上" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "建立備份檔案失敗" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "移除目標檔案時發生錯誤:%s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "不支援在掛載點之間移動" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "屬性數值必須為非-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "無效的屬性類型(應為字串值)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "無效的延伸屬性名稱" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "設定延伸屬性「%s」時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "取得檔案「%s」狀態時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "(無效的編碼)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "取得檔案描述狀態時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "無效的屬性類型(應為 uint32 值)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "無效的屬性類型(應為 uint64 值)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "無效的屬性類型(應為 byte string 值)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "不能設定符號連結的權限" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "設定權限時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "設定擁有者時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "符號連結必須為非-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "設定符號連結時發生錯誤:%s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "設定符號連結時發生錯誤:檔案不是符號連結" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "設定修改或存取時刻時發生錯誤:%s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 關聯必須為非-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "設定 SELinux 關聯時發生錯誤:%s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux 在這個系統上並未啟用" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "不支援設定屬性 %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "從檔案讀取時發生錯誤:%s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "在檔案中搜尋時發生錯誤:%s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "關閉檔案時發生錯誤:%s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "無法找到預設的本地端檔案監視器類型" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "寫入至檔案時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "移除舊備份連結時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "建立備份複本時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "重新命名暫存檔案時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "截短檔案時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "開啟檔案「%s」時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "目標檔案是一個目錄" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "目標檔案不是正規的檔案" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "該檔案已被外部程式修改過" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "移除舊檔案時發生錯誤:%s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "提供了無效的 GSeek 類型" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "無效的搜尋要求" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "不能截短 GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "記憶體輸出串流不能改變大小" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "改變記憶體輸出串流的大小失敗" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "進行寫入所需的記憶體總額大於可用的位址空間" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "在串流的開頭之前要求的搜索" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "在串流的開頭之後要求的搜索" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "掛載點尚未實作卸載(umount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "掛載點尚未實作退出(eject)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "掛載點尚未實作卸載(umount)或「umount_with_operation」" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "掛載點尚未實作退出(eject)或「eject_with_operation」" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "掛載點尚未實作重新掛載(remount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "掛載點尚未實作內容類型預測" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "掛載點尚未實作同步內容類型預測" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "主機名稱「%s」含有 '[' but not ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "輸出串流尚未實作寫入" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "來源串流已經關閉" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "解析「%s」時發生錯誤:%s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "反向解析「%s」時發生錯誤:%s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "沒有「%s」的服務紀錄" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "暫時無法解析「%s」" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "解析「%s」時發生錯誤" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "無效的 socket,尚未初始化" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "無效的 socket,初始化失敗原因為:%s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket 已經關閉" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "正在從 fd 建立 GSocket:%s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "無法建立 socket:%s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "指定了不明的通訊協定" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "無法取得本地端位址:%s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "無法取得遠端位址:%s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "無法聽取:%s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "綁定至位址時發生錯誤:%s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接受連線時發生錯誤:%s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "連線錯誤:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "連線進行中" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "連線錯誤:%s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "無法取得未處理的錯誤:%s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "接收資料時發生錯誤:%s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "傳送資料時發生錯誤:%s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "關閉 socket 時發生錯誤:%s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "等候 socket 情況:%s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "傳送訊息時發生錯誤:%s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "視窗不支援 GSocketControlMessage" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "取回郵件發生錯誤:%s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "連線時有不明的錯誤" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "聽取程式已經關閉" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "加入的 socket 已經關閉" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "不能處理版本為 %d 的 GThemedIcon 編碼" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "預期有 1 個控制訊息,卻收到 %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "輔助資料的未預期類型" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "預期有 1 個 fd,卻收到 %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "收到無效的 fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "從 unix 讀取時發生錯誤:%s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "關閉 unix 時發生錯誤:%s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "根檔案系統" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "寫入至 unix 時發生錯誤:%s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "這個系統不支授抽象 unix 網域 socket 位址" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "儲存區尚未實作退出(eject)" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "儲存區尚未實作退出(eject) 或 eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "找不到應用程式" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "執行應用程式時發生錯誤:%s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "不支援 URIs" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "關聯更改在 win32 上不支援" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "關聯建立在 win32 上不支援" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "沒有足夠的記憶體" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "內部的錯誤:%s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "需要更多輸入" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "無效的壓縮資料" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "在輸入中出現無效的 UTF-8 次序" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "已達最大資料陣列上限" + +#~ msgid "do not hide entries" +#~ msgstr "不要隱藏項目" + +#~ msgid "use a long listing format" +#~ msgstr "使用長式表列格式" + +#~ msgid "[FILE...]" +#~ msgstr "[檔案...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "實體名稱不應以‘%s’開始,應該使用 & 字元;如果這個 & 字元不是作為實體使用," +#~ "請將 & 轉換為 &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "實體名稱中不應含有字元‘%s’" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "字元參引是空白的;它應該包括數字,像 dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "未完成的實體參引" + +#~ msgid "Unfinished character reference" +#~ msgstr "未完成的字元參引" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "無效的 UTF-8 編碼文字 - 序列過長" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "無效的 UTF-8 編碼文字 - 非開始字元" + +#~ msgid "file" +#~ msgstr "檔案" + +#~ msgid "The file containing the icon" +#~ msgstr "含有圖示的檔案" + +#~ msgid "name" +#~ msgstr "名稱" + +#~ msgid "The name of the icon" +#~ msgstr "圖示的名稱" + +#~ msgid "names" +#~ msgstr "名稱" + +#~ msgid "An array containing the icon names" +#~ msgstr "包含圖示名稱的陣列" + +#~ msgid "use default fallbacks" +#~ msgstr "使用預設的回饋" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "是否使用縮短過在「-」字元的名稱找到的預設回饋。如果提供多個名稱則忽略第一" +#~ "個以外的名稱。" + +#~ msgid "File descriptor" +#~ msgstr "檔案描述子" + +#~ msgid "The file descriptor to read from" +#~ msgstr "要讀取的檔案描述子" + +#~ msgid "Close file descriptor" +#~ msgstr "關閉檔案描述子" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "當串流關閉時是否關閉檔案描述子" + +#~ msgid "The file descriptor to write to" +#~ msgstr "要寫入的檔案描述子" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "建立備份連結時發生錯誤:%s" diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo new file mode 100644 index 0000000000000000000000000000000000000000..55aee2a4747b15e95d5c04b02777a4c37abb3634 GIT binary patch literal 41631 zcmd6w33yz^mG5r|2?<#UTL>Y*WihtFGPc=_4F&=RoUl09kPu8vTWU#-CAFfKYz!fh z4Yp;x0$%WLgTWi#SZw2sWG2aEnXHpc-ej9B?v^w&877lGZ<4&RXyI#u`b<5P}b7Vx+JO+oMh@U(XYLDg|V@Xq%uHV8g@eh{1rehxeV z{I16zdCYtKg~#7`{1f;N=-+aIWa6nHiG1@JuZFW}|ic>{ysQt%#7_09n=1J{D8?_1z-@K0bBcqx^O{(eyPEd%n_L)wc@#DEN;ahr%53YYr$r?dKo$w+p-ueD|;*xB|Qb90xuQ zJ_&vu48aG;EPl=e&jFW%lHXTB_4nJL`qAy5kE4;N@O&nyd_zFxy8%?b2SAO(qu_bq zN>Kbd2#W3p;OXEWK~0VKF!(Cx5-2bDhss{Tho$<7$<0QPp$fhV zs@^|wb3{_AMYCf$5 zMfVRLe*uo+`Gk={z*G)y1~pHnf@;TNkf{{x09D?1LGj^u3X^ev4QPX*sfqtxE_gG2?_fRgKJ{&^#)@&5s+e7^^o62V2IgWw79E>QCSBT(_jUt{xr z7^wEvfGWQORC~68G&T4RsQTV@t+neGQ2l5GRnHp#{1x!MJpTby{`bHXl{X4}7dQ!2 zzaIqE?s?!z;47fY`#dPRUx8}pn_!M`5UBRu>7R4pxje4|PXP~r?+3pIB8ov5sCIqe zdecK6@|g3u22}gL0G$U~^YPW7Ao6dg?nMtPRe( zi8g`vf-3g~Q00CbRDHh&)&JART6;bSN*~vO;?olFd~iD`etjL(_#Q_k9{{fbm3}WM z{(K5l`Ab2K*IrQV{UV4834RYEBEcoM*!b3i7x6q7RJl7r)!PN03BH+5iT`JV8oyh> zlfjRJ7k~|*`mqF5KX-$7fPVsagSU-ijngxz_C53=!zJJVp0|LK+pmM-!wDZYdAkBc zH3Sd%=j9+OI`|x@@%|;Ke!YcCF9ELtL$DfDxsQY5&o)r}`8)7*@Lxc+Ke*lG;S^Bq zzXTNDJ`9FnqfcK1s+`TB`u}-Q{P`Xz`u_wk1W%*WlB26Z)%PF>tAmB$DDXRA6?oE} zHV)T<;zu*c6c0MU5d1ti5X^(3f7f{9|7cL`NRC&*UCxd&ybHKj^-wFNDK(+IJQ0-p?UIrcp#lK&IA$aaR*8l6lcknz3JQb`5)viy0r-9Fbh*q#4 z)VLr2QETUUAX7EC4b=EQ32NM41XX_*_%86wkC|K!1mDB+y`cL4AQ*yAfU0LZsPaDx zz8m}zDE;zp;1%GB_u9B$4=VmaQ1l(3@;?u%9S1=1^Sl1}ccAD_`M8yPDX4K614>>} z;2Gc?Q2bv94g$XnNbo+@c0>z8^Cjj{~UNF_!IwpM#}7*D?z1KgKcjLf?1&W{QD^;@9(ZQ ze6PoIJYM8+sK+Zo^>YmPcJK~R^XFsW17I5Dzu=4fLl=UJYfOJX0czgt1U2qI0yQs! zwDspSQ1W;MD1J-@uLI|SYUh_h<@;ywQt-H1qZI&M4{AI&ff~=xf+N9S zffs^9>TFy-0$$GZVo>#b9vldMACx{iuHNR^P*8I90I2#GfvWEacnbIvQ0@2?sPTVi z#_Iu4e4hl40v`c~gL}b2U>B%zPJYnF_cBoVCx9V1*T-)GNAvt8@KNyisWuL?K$ZU# zDE{v8_!Ch4I;p|t!3a?NZU9wpJ9sg;75pIh9Z>q^j7IDKt)SAILB+2I#lOD?F9F}u zWPBVBKEU%m;GN(;Q2je0Yx%DRmA?j5|CfOpk8gr^fp2aOg6ZHrp!o20P~-C-U3w!{|mg9__H6f@w^Wl#`7HTR&XDvdV(2-7lP8exBBN^l>0lJD35g9X|zK`yaJ=cOe)O|1nVcXMh91mEaZN>)=h`Z$R~H)Tgcd zG$_8T@XucY-_P?OLD8N58JkzvgQxIZ4~F0)p!&N8lpG%cRo~bB^RGeWKfc|{zZ5(t zV9tTkQ=b9P1~-GJfnNa61-}no2mTRM|3}TVavDJKd4 z>Q^||=Fioj#q5B~arO%(Hf! z>+xn#d}{kUx+dfOA$?n}TLp2vgtg0F(x!IS2**8vZLYR}~h z3~vEd|Hr`*;0$mG_#&u!{|T%De+#OA7cMlu+y<(gIiTWKdi)$Hx#|Wl0^h#K6BNHz`1I|d#`p6+{hvYA^Be#Cw#An39PljSF9#(T<3Y8f1-t}Y1*)7c zf@8s-f|B!rON@_o;H5l21D*_i3A`NqKB)0O=}D81%fX>Me+*QA=7QqOPEhUoDyaH? z3=RNKe9Foh21;(z;CsP&;Jd*Mp!l%Mr+*1lx&H=AE>3;g@D@<*cm%u{+~D!6pvwKN z$M-L_aT^0_96t$81ebv7cODd9E?H*dIsqKcb2}*dmq791TcG&)rsdYJvq7Z~15X0) z1jWC};5)(fp!oYD_;&E`z{|jIfkVKztS}q_4(53>cqTXxRR5m?-vJ&1PX@mPUIBg| zJOzBuGq!KP0CeLDO3qh-Rp4PzbpHxo5B?bxU#?qe?X3nym-EjX!I0-Ypyt)LLDl;o zKK{5>)~^ddjpHzI40sPH`C8`V_kkLhAAzTX$E~*UeIFR|d@1-oa6EVxm;uGV*`WBj z%*Ve1D*rb@l~({qg6~*k{kRE~+|`4cPb)yRcb~^EgX+f*K;{1fDE^$Y*2d`uP;xU9 z6klEhZvejuil3*fGyaSM)sA{l?fx`)4!8n*FSr*}`@aUB1^x(B{y%`?%X#Z<9Bu^F zj(b4SJp!uS72w(64p8NN71VtBnU8<>2AhvVK=t>2P~)}$)c76%)vm9B9{>xW+Vkd( zR{p7=p2_oU@J-+pLiG17|3mE` zK;qMckNCJN_$|3l{_W+Vldy@fmUN1AfAjc#D!&dAt|o|&A13Z`@OOk7!c{!)0QL8A ze*Xh_J@{krQScGM_m#+>_^7`wg4(XX8%WpRVDK97Wbk`n6*vQY06dqVzuOFg4xXR! zaSwV_lJwF(LMve>;SSPP5#CNXks$q|zw7vY6QP!%zx{-3`TbGwlZ4axJ;j}vYue3s|;5I#p3#k1ro1?ulg@Z0t?IDy~qBFy3WYVZf( z6!7QZPYBW9yNUY>51$}3^Sj+AH1S)qJQCEg|UdLc%Hhev0sJerE`?2=DRfzv1^HLiE?d56zJ`lfII0KfmAS zX+H)|^}j`bC1E;YmXEttk^J36sCU2E(|VllY2NOi?*>t$Zo*CTae_I}eGt5k(8})? zpYK;Zf5`uS2e^#q*9ilC+)94y?>xdb!Y>Gy68=Ka-wT8r+%I@Wp7RK2@cb#l%|2eR zh45uUn)FA(rwAV=T*UJ_!oTqQZwdM<7zFnae>}gl;KSfzP=D_QyTRf9`5JIEVH)AP z#Q&6VGr!Z|I>J4KH}O1#@CSbDuaVy&p@ZLNgJ%%*cL6xqeg+Tm`_26R3}J*%pAUZ1 zr#}r&SUj3u1p(`OSml5iu>pY(B}8&4QR_&uSDP)B$RL4T(a z#z6Z4Pk%el!~E|B{Qeul69oOeL3jt@LelFA%L&aqf1L0fL4W^7_z(BX{`oo(60RrI zK(D`lB^)J;BFrSN8XQN^-$R7IBg`c{K+xZ0gWzGG-# zabNT(Xn;2BpXc)Xc!K`&gwqLMAe>M55kY@L30DzTd%AXT9?!QBP9VI6=l6rJ5o!r% z^1K>+hHy8(7ZMKe`(uPh2oDnUw~=s|FrM^#2~+vqK=?D^Q#=m=ClY4x`@cZ_E#vq3 zgy`={e*AC$umoI6+U4MF;QPRf!4-r{32S+NMKpv@^ZXHl{(fi>>;e}Mcdmc_NAP08 zjf4rre+|5YpuY|7U-od|eWbk%et>W}zwabOf9w5^3~`_5_c`EW;I)bm2W6V3r5Z9d zVY;b0Ta#(38ypN6I=nU<`$5B7Jbu_CCyFk8yvK=PF09Qoq+4e+r}f*gEu1o=m1o0T zFmOO_V3^5;P1)8k6hR%?+9ARBMJt+}SM1jS6naQG3QBtLdIg zl`xjH84@b!{!yZ>C!fDFbq&2o|<1YC7Ya zstJ*vy2+XBWF~o2Q@UZYA}2Rwn$nYzGbGbDs2`bHvy;;dgK@Gp(^L~CTJEE%qy`bu z1k_MBWRNbHoRf4YGD8Pr~A{&4_*M_%@ZA8`@{~FqK&A5J-eltSRf9i?#Xuyi4 zHzFuS392kmQUOI8-)Tg!4Yo{6H_RxL%9y|@CF%MhPT1UIiLxlAY{@cHN`$#O-C#2| z)0AmNW-||0n20Jwa}3ro0?aiO=M*NA%|3spLY^3iOJh?`R_Xx^G^oAiOrMmJfd z*h~&pq)}y>TGP@Zy^^W$=5$MACMPk;Nt@+nG$Nu?-E2`wtu1X$=$LeP%k55ejcaOd zYn{-FEH?%>nqY^lY>k;Fh;owolxkO}iwl4#{R-$bb1jpksZOdJZ9MVjs^M22i(+Jg zpe0?KZebah+Nv6QG3#wj)+=VWxT7bnSFO^}@e*6Hgc>XYb(87k77nuJ(v8fOhHTU5 zurbRL(~y}eQJIl#lb&Jf(Zxo%mSe&dOOKZwF}+C!hID(b6;`;Fys0(QIwPzK)4A$Y zGcAluNaezdcp4qtm_;D(hsq&ASsM-s#Zptv?c3vs)1!aQ>UiH zMjJyPFNM+yqhV+w%1yLBYoPU+8VP81w$ZhM8Q={7jWEefI41=CDyFzNDeouQRPmn^)(s~%D}TB(MU^|qcspl2HY8CSkQeoVS2qp zH)45`SH~VGS&@-BgdDVH8XBw#RW_HVGjG+mh7^sAx}-K@@$}KDAsCw`ZcaUGbwNCWnBrAYC9O~wQ^eEG);YFWp%eIaVFKW;~b^0gO zoXw36##$NwAL)MIB4=nsi<;NgQ=78Wn`kmh3#*pVBi?T-#GTK+%R5vONtlFq8io!1Okt`^#r80Az zLT{c?DLJ;K5{Wf!vYFLKzuYC#>e8*QSarj8V$Ay5Y=WX8g&9+?0uq*UBE2y+Rf$+X zQ?hKTSoE8wCX=(%DzJ%VO6Ghx!0Z4p?tU>TQA(sc8WX1 zw*f4&T1$7-5OAUO{z7OXhbog5tAiVmz1Rz%*IO0i{sg& zgf_n1vxQHw741=QF5BQ5Y`V(LF)Xn}WJ!6F z#&lJ$1n4LyS*Yr=igI4Zm+>-+?#W5)IVa^4#@?1`YJ143@$^HjiPl6E#F}+ev{uTb zDWYt|7gifN5xg>yFCx>J9K(njO_Xk_P+wvXQ6bfDDf&tgYl>bopTR4QoV*+rh7#L4 zp7iAsUXsQps=6i9jP6V{0Z&iP>4UOS@%x<$^_ew+-PW8zPU|p^>)LSBXhD~uE~9k- z%MbfGHakui#Cp%NHl|ul1y#(MXq%C1MmJ_2?zO5O86s8Cl5TFmKjh5IRz$%W@5P2S zv?X)ma8eD}?PZLRE6S%7)qr*!ige>8kwOTgEd;JOH(}Fg!Me$9O`6Pu2D7VWY>5&x zBGV@oI~io=dxwK<^F5I&8SW&!CEI}4%xRS&VIA9-0W}F4+5fdQW_eiRiNVdTMsd4R^*f`CDIP8yxo;4dnv9y-M~Dxjb*B_XHm`C&#FXQ)ZFO0#zy|q z1jFdo)bbKsTxpxjS|U9iYb3l4wMiD%YR>k?@y3*QwHdn`dG3wWS)B3ExB>8@%&^ud zwSPIC#1;p&wAjD4sJ^N-UyZl=hR7PPt`Bp#u#u4Z6i%)wn7Qm2o!dL!%_R2uMSsYk zi!K;(+2x~coAnT0g@*KCd=3nIeX7~^E4~ySvRU&oCx%svf2j4ycJw8K*-x@^sc=Q6 zo3d?n^*u|*Zg;b!Oio-L@62%XL^G*Zns}_sM$DC>En10DS82lHhaN$S}I(g~)pZ8ng1bHN8Umr+toJXCyl%tWF?DSl4E9$a%ta2-!KsVM-EwTwQN7TUk2D(kJ+-d{w9~g||a8a`k?cLbc z(3;WNAluYWwmEktop5pmnWW2x+c_`gtI8;&TeKy)(DdTGE!~S(AS>CcE4`%&XKY%A zteYa^{7L976R=Gua+(<*7*MJ0rsb3!X(s@937io@;~fL49LtPM%!u>En%$j@hJ&o{ z?xZ7jdJOKB8fIv9jJzYg6Sm=Cy=+8339r1o0%4CqDefub@v;7CFlF1p18K#$@fGZA z@g`2!jI9_UD=6Zz`7}jVGAi|6(qg))X-1(nKkxu!9SK*ipy%PE*{!>6j~$uGk86IX?_zoo=ShMM%XO2vCtH9j)F(ci~=t-`zbQ*+C+xWXDTl1wvkvlQ6UfT#$f0)%s ze7Xfe#7RB0LL1^ji^aH`2mccV{rB1e8v03cV4djYrlUPo4_tW|bAz zoXWJY7too&5c6j`UwVbY+M43S4%23mg3_^xml0=c6$hnQS}8@u?PH}gYKbAPK+R&w z*^v2fjWW0`UEAu;zj0RCp`h11D$Ln4Q`%}d{0eSkABL;hIRnd<)7w)GSmGR-l1HnI znRD7^X`$80YfvO%1)oAG$aiaYYMPUkK?7_YWGA2;NU)V+m=eUrdo5~0b4zBL+oLvcdLYFzMO<>{Yu4vpb8?kp zT86V#e0tdyt3PU*R<9Tcs$*Va%NNU((dVv?sF6+rQN5yM11J_c$BAc` zRIJ+`m@({#e2hDka4fLJC%ORBlSb9BqUjVGM@(>MP4Z|~?N1!MaP{iifziQI$#I^I z5wjsWg>XGTR$*fj_qenJ(2C*C5OrWt6&0mpoc*qF@bhWHrF^e1yVYQgB$9jnTxsMG5aK$d0A7E|Mrq@vL% z-jsJKxHH;El-lWucz687`7akPFn{i}4V>2_QrxAMwcFtY<8QocEDJivh`4{5)8^A- zUTCt)dS-1JDMtylyE7%fi1agKOnv8saUY{_u7WtvkCy~@L{-+G@s3mz3c1zfvV*MR zQN2H@qkS48qY1{B-?J!gHHwCdslJbBc)TSavBj<#`UObi=jM(Z!{9FG>UXNb=5}oj zan5Qa(ixFc(hQ(%6=`9PBHa}Qtt8rV+fKGejv3i#Zh)na){zgE5r5%%7^{EVeYp?gi4Avh{aD zwyg#A=|!+Yx?@ee>+>~-u(oB!WSv?C6O5wwJ+&vOPb5CT$j%53VEfOkkONSqGe?cjcS2#l=_m)bHGN6^Un^Xp!%Vf}CZElFA zQn3a&f3d0{!KZEK8(s!u&$?+L=>%JSoT*SfG#oTh2kFYEG*vV>SxoY#K{#+yLi6^K zRV6u}ML0-HqPYZ|K$e`TQxSDXOL#=5n^JCKL2J8?#Dc}ZB(pFwp14Q68x|D86xbt| zv8riv){LsxYEw32 zCq_5aT%rE%F>~I`UqACph~n9vPz}xxf;Nba{h~WYp2*2&ALATz`iARp?hd2dnbqnt zZXfwI6upsqUYO3W31D~mw7ol?1ny!jn#E}zXFc~wbEjIG#n@$iP-qR7s&U)jGCFs? z6hkqE|0=X$jx&yoCdg4@}hIB*ePq4`r$bg`KHQ^7Bwfb@|+I4 zJHAsErc*7N;Y~GF+1e^Ei^*hny3CSZa#7gb&Ys+i;efnp+o$oeeVk70S^ks9M|3G} znd=8b%L?59H~W*_eA<=Dn4ZeCHfL%m#QEM6B#|vkP3}5dd9S1NA@1^$Qe!t%kt~HBM=G36w z59F$JoWV=BTTxIurDl;htJ6H4lsP{IBcEk@x3HjLfL6KX$E++0bmkmbR5xY2n7iFo ziQpc$d6HkjO`4Ju)p!$?Ly|Zba@!~};M;L*t>`4u&NQXnSVKD1G*spHgS@sOi_vIX z^Zw?Es6UFNXoNHqd>F|{l_?z`O&s=q znN+XkyKR3TsoCbhd*U&d#X9dzsZT$Ys^PtvMuw!Uqdk*o{=i2Qx*DyVt|Mc7f*Ol$ zfRV==1CGP3;T>Z?dYi6k+a$`7Xx62v@Ulnq*p>}@?25=Xa$(UnqO1%}>FG|-*5bxe zu}CF;rdZ5)A#BjF!EwBI-^WgPY3umK17~6dl~hNpA~Fvlhn(EhVT{5rCZ6`=lg6vX zlbYihkVuRCr!A&R%=00A;9jXf-t>|m&8Wb@h=Q5uZk=mg;Y=gW>CGOeR|i*&z2E8E z@*YOzM)_&G8qhYy>r?aT6kjDMb&#Cz#P|H*80q4Ok(Nn%A2~HwG3)!FXlv>(g{$9_ z_qzqsMR3@TC+j!>(?+S+p6cklo@FcB=Ja!goTzDcgUszun=xerFAh?VQ!+BK!$%&) zgh+AUn3oS)e7ZX-*D8pA71N;yRkpg7Ip-B{4n-;}*}n@o>9VV?3j6`DpW!+%K%Fux zqMK$s8r3~+|UZP@A zD_wkiJPMTkA#VUVZO)`?rknol4qm1S;znq5ueS)DLqda7Y!gI1F4z?p9xl1T7U|AZ zSn`sHU+?|07GQJpRxKM8Sjx^mD3)(iHd@VOpA2eDJ(Ou|YYaJGjyudnF@GPir%OsZ zyJ%X)D;<~V8_O5}ifgz!gDGjJyUEdDwT@aceAtj-!%%TrG|fF&?0}9RV6+;MlPg~7 zL0fS%U@Rg=FV$e6Qbpt+iuq5f8QbQ8EIRh%1h=IqK9!zx#_`@+YJKqv+ z*f0pI?m|~+N|(@$s2XuqIDF)&5m#O^Y$SBI@xDvdM3h7h-=8j&+*qH=R^6J*v@wBh z%cQd5H4jd%=QY<<+x0V2_1WxD^wQAQ>0`**RM*Dc@T!Sia#B7HdU=&`5EImP3aN&{ zC+d8z*umjLhn;w%Y3(XGSVlP?-le!5GrahrDatw6weBRjNT;@;;;P1Cp=jqkDjYc_ z(;8PlDtx$p^2CpxIKF|mgd3`EW|7BL($wr8bJq^%sKouecG&0>gEtO!bUwbZu&kqV z)#IJ}wsbyw=#4}3{%<}UP}sJ#u(6|ihAWHg)PsKnqR!D>#@VosH|5u z8{svlqV-6y_a~n04%C(2gG5tDcXz&;~;M$nSZv(7su* z!(D7(5n^WhA!88p=IxjEl+S#68 zyga{XJrmiQ8T8C)UkK4K3 zOXw_$@#L0P2zh*4#B%hD*54B8SB{(U!8&()zo;h`KN(O$9}89I=7ah9%ev;iTrN~n zmdnb@_t_P1;Hm<}NHO-<^N*Fsjyu^^HRdy0*ULrP(PWX0BHSCf41_JR4ps zmM7J)_!VX>16|mw#U|gemf_AXSRR-V(0Epa{4A{wNB6%J=}b|&<)VA_oUX(33X4}4 zI+jF^``T87g{aEek{C9LzGC#|c8~ zP}i0n`JJmeUwol!<@)aS=Q>|qLW2q~KGD5$i5G%G$F|P(J1TuVfEi#-FRa;?-?@NF zj=nZOKX0Mfcxb;=;LeTRGoLo?N6Ce?>jTRmJ;e0UvOoOFuyYsUx=?v%Z|+GjvQm0} z@niWz%hVfvK7fAviMDYIQh)T|!J~(lX)#^&e17qYn8Uto%S)^^iIp|qF^3ju>Ft;U zAGCTM>F{gitSyDdUN(gjUKIM~AD*KwGoU*k>q1G*I*{M>0?Ir5+0yo~3kAG;F0?k9 znq&5L0I_%9DpUWch9JLSc7DnBqX$&C37J^GXm!`2d5o&K?}dtbA_<8Eqc=(Eo~`9M z)F%MUDmi*&j%gp0>Yuf*ku|cmD3hfnGNqyjPhvBQ9!2q1b%KyqTU>tS7E`=kbGLPE znT3*+YLR#y*&6sAUgwcbXkFiRxAY%9_&ke(2s`G`;h^C3>>&RwfWg*o*j-ovyI0wF z017W^O_U0@MJhIyI(N)t0GVgVU}5=OmbuPtGdmyOYeUVzni1f0wI5OuU0V)nUUe+@ zDs;hIWC&5LSVVc9ebPBYPCYYS(pQlYsj<7TWu;7!V`hlPggVT+I7UWeiP*M#dDrHr z3iDrtTNL7qR?Jn;t67B|&n7y`^4~{GjvibHgUzx+_iE9j$F4txm9r``QS&5fx-*K~ z88I^iy#kL)2r3QY0#-BRnne(8ou7N4bMX<(0b-Iouov!~04DnC%Tq1rW@jNXK~=SD zungQI^Ybsv@~_`(tKfOIb3uOg7EG|tm4^|P{NioQT{>+sHa`QWqcs+NDCn-ev(;p$ z@`6(H8AWM5fN4h$&oNe%@bj5n5!?F68r!*LqY-#kxjtx&oX(=ai$g6lsnu)qieohUhD_n{#b_F*$rlBF74KNl)iDpnG^qHh%ix&Lfh`cG zm=V^_m4`Z)uJ2y3t83dP(`21{XQFgac4mTCr14VcwugNXM4N%WNZg*HGJ!1~QPbE( zxWy!TmOW~=zca|Oc9UAq)1%3S+D7h%jZlwmea}mi7DC) z#S&~I5Jp!tQEK=T`k>4o+u;(g(pY6-&?EPtVdK_G^ETEHJ=c&Cm0@#h%%ukrNs-l9kT+?f5E=NnTjI zxa;-ZeGn&ABFhuAl9}7N-Ava*Hn7obTAHMRq1`)dl&52N`92Y5Iaf87XhZmrsvmAJw2_Y>ln*v2pp_Q*lH_jK5*?l%8e<@u);#Fv<4+^RF=bgJ9n@QTRCJtv%o2O#;J%DL&JdRn%Y-d;qW2CP z39FmW=8j>9>GyMPTV*c%;&#lwiokYE9v1JJ;WWh@{hPMoFOOvJ$hvr#%+m1=S1(Jw zBqs-3mXg1y7=7Kqm$dig{H6^Iu@zaC$DCcsI*q{FTP0$W|TUvVRf5`dGE;5JyF4|#HgX@DQ-;SiwAKWRYQ%FD?XvHO7UP8 zUY#j%-?TZud$G|+V_;_+uE&wgp#tMCA0!L+!_rF*|M7!l27ho;nVq%K_Yaaej0sUg z@|(7G&s>z>w?#7J`BQ0=sJ;EN-TD3d3r{a(uJuJ~4o=gio=&zxw9k&RIwugjQ=N`D z*Poi?j<2j4CC5yQUr9;?|5upTl0-q*3(GsV;YRi@!st?*PFjm!MhLpLZ7V#psCY

!HEr3L=195?TR(cZl$7{w7X?7PktnUlQOxC;)*KfKSb-DZ*S*sA5FK5l^b?x+P(-KK+d>bH7>`O=cT zPh==>vN<#4!Z@^yB~CMN$@aJ=6CdA;r*`L`)e(e|X=Xa%O7^tp^hjzJgr&&i{J!Uz zv1Tb+1u@tCD54cOyWV}o6j;~3mtl@EBq%3!dL=1oOsHfA_KVR9)FZD`kMzbwL}X^h z!HT#V#hM8xGobyD`pi-5=I7YS^jct?JDS~8(lh(d+YtqKFowMOo<~iJsdC8xZR=hQ2ih6Parrft>>+jWE}x ztz8?}<`=fZHBKv7*;$=zs*~z9T-VIQSo5}tC|S^T_!@tBL7O#O>AXtaaEP5UQr4rFva*H0~s0Q?zxK#Q5I9dQLd8H^#10J%c6R9)E)FwrMu;%D-ac} zHZ_;SQD@ef`4)5@I*{M}WOQP;_%WKAIDo_l6&*`*O3Nh_^F9RJU6JBk{Yrk*D&tD> zN{!v8p)3B(&7A|yH`TX=y~IcE7rWHOk6FiYRkT zT&BN=(0B7oT1bJ~fN!2}hpXkqqFbq;cqy;*)mhX*`;NZ0o}DW7(=B6&&Yz`;_Y`Jr z(IIStOYqq)86@pk&xJnQii6Bf#;vr7tr`^>qrLGQ-) zMcW{^8$v;LJ-c1rkG&nv@}J8YYPscaJ2m^_g4e4DwxhODzUFUah0^La66cJro~aUd zi>5zWio}wCmo2ml(Ci?%2!&)|5C#@ycYOS`P>2PlM~ovgW%Q; zf6GNz@Hlx!MH!!TjQ;9AJY8y(^G2#o&$yv?C+w&ylOXoea^Ja><&`SKN7g1-c^(%IQiy`0*Kcd~q*Ir{2=*ja(Jf*y#S$(k;cYkJ~3cxf6(D zn(0OxKH2u&8+UPcf?JKuQ(B(ffBH0wBF%QC!36sVL&=J(v;6~0yg<3@n0{|o_H`8c%m$#q@GXnhkdk73?%ImwT}gqG{<@ zFK0|fA6O`*h)j2kIynjLmO+#~D6HBpuXJSU;unw9o-Q}hUAE}be)ASeV4ZgN&c@}3 z!U5H?LQH0*8EmUiVsq-Yg9Luf7OI>SD@|Qo+r0Eg66!x)fR!53#N3HX>CCCr6 zV)utAd$};74BkyEL(=+6htzeqKehb=I|a4dc?*;D#;RnD4TLFDJjr?)m&;COB~e7@ ztIM3uxoccdyys`CY}0Z%7Tjjhj;e4Hm6oh)EfqGXI%nUy-d0^G!bE?{M(_f<7yOAk2DbC>?y4XUm!et&@PN?t3`+jYa})W=<8^6na`VXY>t&+ZDg z9sY1f-~KN^gNq8ssH~_SRA!t@v6=^A_DOjj=b%RZhyCf{q#KjTM(cN=>>o*@v9w-{CY&n&#iLZ>y z8eOx^A8Ii@-5M?m_G`M6pG-78%#%qB<3q0oW&e+T4hm@H}NeeXG3G3B+@9mbG_bJuvJ-0xfzvqJJr*+ zuVMn_Ic(dx%1u`*!L}`sA3eA!-?2ghK6@`0W7Qk_g zD-F`3F5tmWes`UfcPp3|czF;?r}B=qQ7ZEp1m9$ zLJR%wBVt7IdkXoEO@-zA@cLni4T`^bFgQ$V`$;zjd~Bh-ph|lps={Lqom3W^RKSRiHRej@~bO$ zN89ch#H$}WtGv5L!wF*N?9CFkXV=Q;$AIgexm23*05+Su%8sSm_1wmIO*9K3=>cK0 zLU(Wqaf1;5X!*Amg6JCx=n{k+UaIqUe#!M%e*)>u2YfGu1JAMu2i6=7RPxgE0rnh_D0ZQGN}m+AKInH#iOckdr1Q_ZVoF_=`aSErk` zHK8p+(YcWk_!|XIQiHDN)^d~FuMO@br@Osf-rgtHGie67mnjGLkIKE8Rq^f1o|WXc zJ*Bsxr|ZL@EQWg z{xDF&yJJN!(TF}O{ZTD%lBMXV$QhDuN`mg}p^8$tzTlfY%y{v>yNg`dCV%s6(R(w+S5j>3lhC<0ny z(-rAJ1h7v_r3fwTZs;f57Iqrw}3Zp)cmiK&~nPuXb%Zai1T23*{dsP@f_ zUuYjfQ0=w=_9QopqjUBC{1SD{tBBa}RedH-vKD#a3_deZt}9;ol3<3ccLthL@C7-g zmaux`=MwEG6C|P4Opisy+AhbJC(1$BIU5JRllf$haFOyEwcWfGMsiI*XvX(RQ?Yda zZu6ud|G4v5Eo|>ydmWpk_f@)LUej5&!1|eCE}wWti3`z;jHb)#y;ZiBln>nh0qYnp AHUIzs literal 0 HcmV?d00001 diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100644 index 0000000..8def779 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,2108 @@ +# Chinese (Taiwan) translation for glib 2.x +# Copyright (C) 2001, 02, 03, 05, 07 Free Software Foundation, Inc. +# XML glossary from http://xml.ascc.net/zh/big5/gloss.html +# Chao-Hsiung Liao , 2005, 2010. +# Abel Cheung , 2001-2003, 2005. +# Woodman Tuen , 2005-07. +msgid "" +msgstr "" +"Project-Id-Version: glib 2.23.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-26 11:48-0400\n" +"PO-Revision-Date: 2010-02-27 18:26+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (traditional)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: glib/gbookmarkfile.c:737 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "元件「%2$s」中有未預期的屬性「%1$s」" + +#: glib/gbookmarkfile.c:748 glib/gbookmarkfile.c:819 glib/gbookmarkfile.c:829 +#: glib/gbookmarkfile.c:936 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "找不到元件「%2$s」中的屬性「%1$s」" + +#: glib/gbookmarkfile.c:1106 glib/gbookmarkfile.c:1171 +#: glib/gbookmarkfile.c:1235 glib/gbookmarkfile.c:1245 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "未預期的標籤「%s」,應為標籤「%s」" + +#: glib/gbookmarkfile.c:1131 glib/gbookmarkfile.c:1145 +#: glib/gbookmarkfile.c:1213 glib/gbookmarkfile.c:1265 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "「%2$s」中有未預期的標籤「%1$s」" + +#: glib/gbookmarkfile.c:1793 +msgid "No valid bookmark file found in data dirs" +msgstr "在資料目錄中找不到有效的書籤檔案" + +#: glib/gbookmarkfile.c:1994 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI「%s」的書籤已經存在" + +#: glib/gbookmarkfile.c:2040 glib/gbookmarkfile.c:2198 +#: glib/gbookmarkfile.c:2283 glib/gbookmarkfile.c:2363 +#: glib/gbookmarkfile.c:2448 glib/gbookmarkfile.c:2531 +#: glib/gbookmarkfile.c:2609 glib/gbookmarkfile.c:2688 +#: glib/gbookmarkfile.c:2730 glib/gbookmarkfile.c:2827 +#: glib/gbookmarkfile.c:2953 glib/gbookmarkfile.c:3143 +#: glib/gbookmarkfile.c:3219 glib/gbookmarkfile.c:3384 +#: glib/gbookmarkfile.c:3473 glib/gbookmarkfile.c:3563 +#: glib/gbookmarkfile.c:3691 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "找不到 URI「%s」的書籤" + +#: glib/gbookmarkfile.c:2372 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有定義 MIME 類型" + +#: glib/gbookmarkfile.c:2457 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有私有旗幟" + +#: glib/gbookmarkfile.c:2836 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有設定群組" + +#: glib/gbookmarkfile.c:3237 glib/gbookmarkfile.c:3394 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "沒有名為「%s」的應用程式註冊書籤「%s」" + +#: glib/gbookmarkfile.c:3417 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "以 URI‘%2$s’ 展開 exec 行‘%1$s’失敗" + +#: glib/gconvert.c:437 glib/gconvert.c:515 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:459 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "不支援將字元集‘%s’轉換成‘%s’" + +#: glib/gconvert.c:441 glib/gconvert.c:519 gio/gcharsetconverter.c:463 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "無法將‘%s’轉換至‘%s’" + +#: glib/gconvert.c:638 glib/gconvert.c:1031 glib/giochannel.c:1576 +#: glib/giochannel.c:1618 glib/giochannel.c:2462 glib/gutf8.c:981 +#: glib/gutf8.c:1436 gio/gcharsetconverter.c:346 +msgid "Invalid byte sequence in conversion input" +msgstr "轉換輸入資料時遇到不正確的位元組組合" + +#: glib/gconvert.c:646 glib/gconvert.c:956 glib/giochannel.c:1583 +#: glib/giochannel.c:2474 gio/gcharsetconverter.c:351 +#, c-format +msgid "Error during conversion: %s" +msgstr "轉換時發生錯誤:%s" + +#: glib/gconvert.c:678 glib/gutf8.c:977 glib/gutf8.c:1187 glib/gutf8.c:1328 +#: glib/gutf8.c:1432 +msgid "Partial character sequence at end of input" +msgstr "輸入資料結束時字元仍未完整" + +#: glib/gconvert.c:928 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "無法將後備字串‘%s’的字元集轉換成‘%s’" + +#: glib/gconvert.c:1751 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI‘%s’不是使用“file”格式的絕對 URI" + +#: glib/gconvert.c:1761 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "本機檔案的 URI‘%s’不應含有‘#’" + +#: glib/gconvert.c:1778 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI‘%s’無效" + +#: glib/gconvert.c:1790 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI‘%s’中的主機名稱無效" + +#: glib/gconvert.c:1806 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI‘%s’含有「不正確跳出」的字元" + +#: glib/gconvert.c:1901 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "路徑名稱‘%s’不是絕對路徑" + +#: glib/gconvert.c:1911 +msgid "Invalid hostname" +msgstr "主機名稱無效" + +#: glib/gdir.c:112 glib/gdir.c:135 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "開啟目錄‘%s’時發生錯誤:%s" + +#: glib/gfileutils.c:536 glib/gfileutils.c:624 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "無法配置 %lu 位元來讀取檔案“%s”" + +#: glib/gfileutils.c:551 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "讀取檔案‘%s’時發生錯誤:%s" + +#: glib/gfileutils.c:565 +#, c-format +msgid "File \"%s\" is too large" +msgstr "檔案「%s」太過巨大" + +#: glib/gfileutils.c:648 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "讀取檔案‘%s’失敗:%s" + +#: glib/gfileutils.c:699 glib/gfileutils.c:786 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "開啟檔案「%s」失敗:%s" + +#: glib/gfileutils.c:716 glib/gmappedfile.c:170 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "獲取檔案‘%s’的屬性失敗:fstat() 失敗:%s" + +#: glib/gfileutils.c:750 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "開啟檔案‘%s’失敗:fdopen() 失敗:%s" + +#: glib/gfileutils.c:858 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "檔案名稱由‘%s’改為‘%s’失敗:g_rename() 失敗:%s" + +#: glib/gfileutils.c:900 glib/gfileutils.c:1366 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "建立檔案‘%s’失敗:%s" + +#: glib/gfileutils.c:914 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "開啟檔案‘%s’作寫入失敗:fdopen() 失敗:%s" + +#: glib/gfileutils.c:939 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "寫入檔案‘%s’失敗:fwrite() 失敗:%s" + +#: glib/gfileutils.c:958 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "無法寫入檔案「%s」:fflush() 失敗:%s" + +#: glib/gfileutils.c:987 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "無法寫入檔案「%s」:fsync() 失敗:%s" + +#: glib/gfileutils.c:1006 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "關閉檔案‘%s’失敗:fclose() 失敗:%s" + +#: glib/gfileutils.c:1124 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "現存檔案‘%s’無法移除:g_unlink() 失敗:%s" + +#: glib/gfileutils.c:1328 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "樣式‘%s’無效,不應含有‘%s’" + +# (Abel) this is file template for mktemp/mkstemp +#: glib/gfileutils.c:1341 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "檔案樣式‘%s’沒有包含 XXXXXX" + +#: glib/gfileutils.c:1774 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 位元組" + +#: glib/gfileutils.c:1782 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: glib/gfileutils.c:1787 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: glib/gfileutils.c:1792 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: glib/gfileutils.c:1797 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: glib/gfileutils.c:1802 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: glib/gfileutils.c:1807 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#: glib/gfileutils.c:1850 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "讀取符號連結‘%s’失敗:%s" + +#: glib/gfileutils.c:1871 +msgid "Symbolic links not supported" +msgstr "不支援符號連結" + +#: glib/giochannel.c:1408 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "無法開啟將‘%s’轉換至‘%s’的轉換器:%s" + +#: glib/giochannel.c:1753 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "在 g_io_channel_read_line_string 中無法讀取原始資料" + +#: glib/giochannel.c:1800 glib/giochannel.c:2058 glib/giochannel.c:2145 +msgid "Leftover unconverted data in read buffer" +msgstr "用來讀取資料的緩衝區中仍有未轉換的資料" + +#: glib/giochannel.c:1881 glib/giochannel.c:1958 +msgid "Channel terminates in a partial character" +msgstr "在字元未完整之前,輸入管道已經結束" + +#: glib/giochannel.c:1944 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end 中無法讀取原始資料" + +#: glib/gmappedfile.c:151 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "開啟檔案‘%s’失敗:open() 失敗:%s" + +#: glib/gmappedfile.c:230 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "對應檔案‘%s’失敗:mmap() 失敗:%s" + +#: glib/gmarkup.c:303 glib/gmarkup.c:343 +#, c-format +msgid "Error on line %d char %d: " +msgstr "第 %d 行第 %d 個字發生錯誤:" + +#: glib/gmarkup.c:363 glib/gmarkup.c:441 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "名稱中無效的 UTF-8 編碼文字 - 不是合法的「%s」" + +#: glib/gmarkup.c:374 +#, c-format +msgid "'%s' is not a valid name " +msgstr "「%s」不是一個有效的名稱" + +#: glib/gmarkup.c:390 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "「%s」不是一個有效的名稱:「%c」" + +#: glib/gmarkup.c:494 +#, c-format +msgid "Error on line %d: %s" +msgstr "第 %d 行發生錯誤:%s" + +#: glib/gmarkup.c:578 +#, c-format +msgid "" +"Failed to parse '%-.*s', which should have been a digit inside a character " +"reference (ê for example) - perhaps the digit is too large" +msgstr "無法解析‘%-.*s’,字元參引內應該含有數字(例如 ê)─ 可能是數字太大" + +#: glib/gmarkup.c:590 +msgid "" +"Character reference did not end with a semicolon; most likely you used an " +"ampersand character without intending to start an entity - escape ampersand " +"as &" +msgstr "" +"字元參引的結束部分不是分號;很可能您想使用 & 字元但未將它變為實體 ─ 請將 & 轉" +"換為 &" + +#: glib/gmarkup.c:616 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "字元參引‘%-.*s’無法表示任何能接受的字元" + +#: glib/gmarkup.c:654 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "出現空白的實體‘&;’;可用的實體為:& " < > '" + +#: glib/gmarkup.c:662 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "實體名稱 '%-.*s' 意義不明" + +#: glib/gmarkup.c:667 +msgid "" +"Entity did not end with a semicolon; most likely you used an ampersand " +"character without intending to start an entity - escape ampersand as &" +msgstr "" +"實體的結束部分不是分號;很可能您想使用 & 字元但未將它變為實體 ─ 請將 & 轉換" +"為 &" + +#: glib/gmarkup.c:1014 +msgid "Document must begin with an element (e.g. )" +msgstr "文件開始必須為一元素(例如 )" + +#: glib/gmarkup.c:1054 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "‘<’字元後的‘%s’不是有效的字元;這樣不可能是元素名稱的開始部份" + +#: glib/gmarkup.c:1122 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "字元「%s」只有一半,空元素標籤「%s」的結尾應該以‘>’字元結束" + +#: glib/gmarkup.c:1206 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "不尋常的字元‘%s’,屬性名稱‘%s’(屬於元素‘%s’)後應該是‘=’字元" + +#: glib/gmarkup.c:1247 +#, c-format +msgid "" +"Odd character '%s', expected a '>' or '/' character to end the start tag of " +"element '%s', or optionally an attribute; perhaps you used an invalid " +"character in an attribute name" +msgstr "" +"不尋常的字元‘%s’,元素‘%s’的開始標籤應該以‘>’或‘/’字元終結,也可以是屬性;或" +"許您在屬性名稱中使用了無效的字元" + +#: glib/gmarkup.c:1291 +#, c-format +msgid "" +"Odd character '%s', expected an open quote mark after the equals sign when " +"giving value for attribute '%s' of element '%s'" +msgstr "" +"不尋常的字元‘%s’,當指定屬性‘%s’的值(屬於元素‘%s’)時,等號後應該出現開引號" + +#: glib/gmarkup.c:1425 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "字元‘%s’是無效的(位置在關閉元素‘%s’末端);允許的字元為「>」" + +#: glib/gmarkup.c:1472 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "元素‘%s’已關閉,沒有開啟中的元素" + +#: glib/gmarkup.c:1481 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "元素‘%s’已關閉,但開啟中的元素是‘%s’" + +#: glib/gmarkup.c:1648 +msgid "Document was empty or contained only whitespace" +msgstr "文件完全空白或只含有空白字元" + +#: glib/gmarkup.c:1662 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "文件在尖角括號‘<’後突然終止" + +#: glib/gmarkup.c:1670 glib/gmarkup.c:1715 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "在仍然有開啟中的元素時,文件突然結束 ─‘%s’是最後一個開啟的元素" + +#: glib/gmarkup.c:1678 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "文件突然結束,本來應該出現用來關閉標籤 <%s/> 的尖角括號" + +#: glib/gmarkup.c:1684 +msgid "Document ended unexpectedly inside an element name" +msgstr "在元素的名稱內,文件突然結束" + +#: glib/gmarkup.c:1690 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "在屬性名稱內,文件突然結束" + +#: glib/gmarkup.c:1695 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "在元素的開啟標籤內,文件突然結束" + +#: glib/gmarkup.c:1701 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "在屬性名稱的等號後,文件突然結束;沒有屬性值" + +#: glib/gmarkup.c:1708 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "在屬性值內,文件突然結束" + +#: glib/gmarkup.c:1724 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "在元素‘%s’的關閉標籤內,文件突然結束" + +#: glib/gmarkup.c:1730 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "在註解或處理指示內,文件突然結束" + +#: glib/gregex.c:131 +msgid "corrupted object" +msgstr "損毀的物件" + +#: glib/gregex.c:133 +msgid "internal error or corrupted object" +msgstr "內部錯誤或損毀的物件" + +#: glib/gregex.c:135 +msgid "out of memory" +msgstr "記憶體耗盡" + +#: glib/gregex.c:140 +msgid "backtracking limit reached" +msgstr "已達回溯上限" + +#: glib/gregex.c:152 glib/gregex.c:160 +msgid "the pattern contains items not supported for partial matching" +msgstr "此模式包含了不支援部分比對的項目" + +#: glib/gregex.c:154 gio/glocalfile.c:2115 +msgid "internal error" +msgstr "內部的錯誤" + +#: glib/gregex.c:162 +msgid "back references as conditions are not supported for partial matching" +msgstr "部分比對不支援以反向參照為條件" + +#: glib/gregex.c:171 +msgid "recursion limit reached" +msgstr "已達遞廻上限" + +#: glib/gregex.c:173 +msgid "workspace limit for empty substrings reached" +msgstr "已達空白子字串的工作區上限" + +#: glib/gregex.c:175 +msgid "invalid combination of newline flags" +msgstr "無效的換行旗標組合" + +#: glib/gregex.c:179 +msgid "unknown error" +msgstr "不明的錯誤" + +#: glib/gregex.c:199 +msgid "\\ at end of pattern" +msgstr "\\ 於模式結尾" + +#: glib/gregex.c:202 +msgid "\\c at end of pattern" +msgstr "\\c 於模式結尾" + +#: glib/gregex.c:205 +msgid "unrecognized character follows \\" +msgstr "無法辨識的字元接著 \\" + +#: glib/gregex.c:212 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "這裡不允許使用改變大小寫的轉義符(\\l, \\L, \\u, \\U)" + +#: glib/gregex.c:215 +msgid "numbers out of order in {} quantifier" +msgstr "{} 裡的數字次序顛倒了" + +#: glib/gregex.c:218 +msgid "number too big in {} quantifier" +msgstr "{} 裡的數字太大了" + +#: glib/gregex.c:221 +msgid "missing terminating ] for character class" +msgstr "字元類別缺少結束的 ]" + +#: glib/gregex.c:224 +msgid "invalid escape sequence in character class" +msgstr "字元類別中無效的跳脫序列" + +#: glib/gregex.c:227 +msgid "range out of order in character class" +msgstr "字元類別的範圍次序顛倒" + +#: glib/gregex.c:230 +msgid "nothing to repeat" +msgstr "沒有東西可重複" + +#: glib/gregex.c:233 +msgid "unrecognized character after (?" +msgstr "在 (? 後有無法辨識的字元" + +#: glib/gregex.c:237 +msgid "unrecognized character after (?<" +msgstr "在 (?< 後有無法辨識的字元" + +#: glib/gregex.c:241 +msgid "unrecognized character after (?P" +msgstr "在 (?P 後有無法辨識的字元" + +#: glib/gregex.c:244 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 命名類別只在單一類別中支援" + +#: glib/gregex.c:247 +msgid "missing terminating )" +msgstr "缺少結束的 )" + +#: glib/gregex.c:251 +msgid ") without opening (" +msgstr ") 沒有開頭的 (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: glib/gregex.c:258 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 或 (?[+-]數字必須接著 )" + +#: glib/gregex.c:261 +msgid "reference to non-existent subpattern" +msgstr "參照不存在的子模式" + +#: glib/gregex.c:264 +msgid "missing ) after comment" +msgstr "註解後缺少 )" + +#: glib/gregex.c:267 +msgid "regular expression too large" +msgstr "正規表示式太長" + +#: glib/gregex.c:270 +msgid "failed to get memory" +msgstr "取得記憶體失敗" + +#: glib/gregex.c:273 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind 判斷提示(assertion) 不是固定的長度" + +#: glib/gregex.c:276 +msgid "malformed number or name after (?(" +msgstr "(?( 之後有格式不正確的數字或名稱" + +#: glib/gregex.c:279 +msgid "conditional group contains more than two branches" +msgstr "條件式群組包含了兩個以上的分支" + +#: glib/gregex.c:282 +msgid "assertion expected after (?(" +msgstr "(?( 後應該有判斷提示(assertion)" + +#: glib/gregex.c:285 +msgid "unknown POSIX class name" +msgstr "未知的 POSIX 類別名稱" + +#: glib/gregex.c:288 +msgid "POSIX collating elements are not supported" +msgstr "不支援 POSIX 整理元件" + +#: glib/gregex.c:291 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} 序列中的字元值太大" + +#: glib/gregex.c:294 +msgid "invalid condition (?(0)" +msgstr "無效的條件 (?(0)" + +#: glib/gregex.c:297 +msgid "\\C not allowed in lookbehind assertion" +msgstr "在 lookbehind 判斷提示(assertion) 中不支援\\C" + +#: glib/gregex.c:300 +msgid "recursive call could loop indefinitely" +msgstr "遞廻呼叫可能變成無限廻圈" + +#: glib/gregex.c:303 +msgid "missing terminator in subpattern name" +msgstr "子模式名稱中缺少結束字元" + +#: glib/gregex.c:306 +msgid "two named subpatterns have the same name" +msgstr "兩個命名的子模式具有相同的名稱" + +#: glib/gregex.c:309 +msgid "malformed \\P or \\p sequence" +msgstr "格式不正確的 \\P 或 \\p 序列" + +#: glib/gregex.c:312 +msgid "unknown property name after \\P or \\p" +msgstr "在 \\P 或 \\p 後有未知的屬性名稱" + +#: glib/gregex.c:315 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "子模式名稱太長(最多 32 字元)" + +#: glib/gregex.c:318 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "太多命名的子模式(最大值 10,000)" + +#: glib/gregex.c:321 +msgid "octal value is greater than \\377" +msgstr "8 進位值大於 \\377" + +#: glib/gregex.c:324 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 群組包含一個以上的分支" + +#: glib/gregex.c:327 +msgid "repeating a DEFINE group is not allowed" +msgstr "不允許重複 DEFINE 群組" + +#: glib/gregex.c:330 +msgid "inconsistent NEWLINE options" +msgstr "不一致的 NEWLINE 選項" + +#: glib/gregex.c:333 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g 並未隨著具有大括弧的名稱或選用的具大括弧的非零數值" + +#: glib/gregex.c:338 +msgid "unexpected repeat" +msgstr "未預期的重複" + +#: glib/gregex.c:342 +msgid "code overflow" +msgstr "程式碼溢流" + +#: glib/gregex.c:346 +msgid "overran compiling workspace" +msgstr "編譯工作區超出範圍" + +#: glib/gregex.c:350 +msgid "previously-checked referenced subpattern not found" +msgstr "找不到預先核取的參照子字串" + +#: glib/gregex.c:522 glib/gregex.c:1603 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "比對正規表示式 %s 發生錯誤:%s" + +#: glib/gregex.c:1094 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 程式庫並未編譯對 UTF8 的支援" + +#: glib/gregex.c:1103 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 程式庫並未編譯對 UTF8 屬性的支援" + +#: glib/gregex.c:1157 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "編譯正規表示式 %s 時於第 %d 個字發生錯誤:%s" + +#: glib/gregex.c:1193 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "最佳化正規表示式 %s 時發生錯誤:%s" + +#: glib/gregex.c:2031 +msgid "hexadecimal digit or '}' expected" +msgstr "應為 16 進位數字或「}」" + +#: glib/gregex.c:2047 +msgid "hexadecimal digit expected" +msgstr "應為 16 進位數字" + +#: glib/gregex.c:2087 +msgid "missing '<' in symbolic reference" +msgstr "在符號參照中缺少「<」" + +#: glib/gregex.c:2096 +msgid "unfinished symbolic reference" +msgstr "未完成的符號參照" + +#: glib/gregex.c:2103 +msgid "zero-length symbolic reference" +msgstr "零-長度的符號參照" + +#: glib/gregex.c:2114 +msgid "digit expected" +msgstr "預期數字" + +#: glib/gregex.c:2132 +msgid "illegal symbolic reference" +msgstr "不合法的符號參照" + +#: glib/gregex.c:2194 +msgid "stray final '\\'" +msgstr "缺少最後的「\\」" + +#: glib/gregex.c:2198 +msgid "unknown escape sequence" +msgstr "不明的跳脫序列" + +#: glib/gregex.c:2208 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "當分析於字元 %2$lu 的取代文字「%1$s」時發生錯誤:%3$s" + +#: glib/gshell.c:92 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "應該用引號括起來的文字不是以括號為開始" + +#: glib/gshell.c:182 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "指令列或其它標為指令的字串內有不對稱的引號" + +#: glib/gshell.c:560 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "文字在‘\\’字元後就終止了。(文字為‘%s’)" + +#: glib/gshell.c:567 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "字串完結前仍沒有對應於 %c 的引號(字串為‘%s’)" + +#: glib/gshell.c:579 +msgid "Text was empty (or contained only whitespace)" +msgstr "文字是空白的(或只含有空白字元)" + +#: glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "無法從副進程讀取資料" + +#: glib/gspawn-win32.c:300 glib/gspawn.c:1480 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "無法建立管道來和副進程溝通 (%s)" + +#: glib/gspawn-win32.c:339 glib/gspawn-win32.c:347 glib/gspawn.c:1139 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "無法從管道讀取資料 (%s)" + +#: glib/gspawn-win32.c:370 glib/gspawn.c:1346 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "無法進入目錄‘%s’(%s)" + +#: glib/gspawn-win32.c:376 glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "無法執行副進程 (%s)" + +#: glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "程式名稱無效:%s" + +#: glib/gspawn-win32.c:455 glib/gspawn-win32.c:723 glib/gspawn-win32.c:1279 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "第 %d 個引數中含無效的字串:%s" + +#: glib/gspawn-win32.c:466 glib/gspawn-win32.c:738 glib/gspawn-win32.c:1312 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "環境變數中的字串無效:%s" + +#: glib/gspawn-win32.c:719 glib/gspawn-win32.c:1260 +#, c-format +msgid "Invalid working directory: %s" +msgstr "無效的工作目錄:%s" + +#: glib/gspawn-win32.c:784 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "無法執行協助程式 (%s)" + +#: glib/gspawn-win32.c:998 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "當 g_io_channel_win32_poll() 從副進程讀取資料時發生無法預計的錯誤" + +#: glib/gspawn.c:190 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "無法從副進程讀取資料 (%s)" + +#: glib/gspawn.c:329 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "當 select() 從子程序讀取資料時發生未預期的錯誤 (%s)" + +#: glib/gspawn.c:414 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() 發生未預期的錯誤 (%s)" + +#: glib/gspawn.c:1206 +#, c-format +msgid "Failed to fork (%s)" +msgstr "無法衍生進程 (%s)" + +#: glib/gspawn.c:1356 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "無法執行副進程“%s”(%s)" + +#: glib/gspawn.c:1366 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "無法將副進程的輸出或輸入重新導向 (%s)" + +#: glib/gspawn.c:1375 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "無法衍生副進程 (%s)" + +#: glib/gspawn.c:1383 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "執行副進程“%s”時發生不明的錯誤" + +#: glib/gspawn.c:1407 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "無法從 child pid pipe 讀取足夠的資料 (%s)" + +#: glib/gutf8.c:1055 +msgid "Character out of range for UTF-8" +msgstr "字元不在 UTF-8 範圍之內" + +#: glib/gutf8.c:1155 glib/gutf8.c:1164 glib/gutf8.c:1296 glib/gutf8.c:1305 +#: glib/gutf8.c:1446 glib/gutf8.c:1542 +msgid "Invalid sequence in conversion input" +msgstr "轉換輸入資料時出現無效的字元次序" + +#: glib/gutf8.c:1457 glib/gutf8.c:1553 +msgid "Character out of range for UTF-16" +msgstr "字元不在 UTF-16 範圍之內" + +#: glib/goption.c:755 +msgid "Usage:" +msgstr "用法:" + +#: glib/goption.c:755 +msgid "[OPTION...]" +msgstr "[選項...]" + +#: glib/goption.c:861 +msgid "Help Options:" +msgstr "說明選項:" + +#: glib/goption.c:862 +msgid "Show help options" +msgstr "顯示說明的選項" + +#: glib/goption.c:868 +msgid "Show all help options" +msgstr "顯示所有的說明選項" + +#: glib/goption.c:930 +msgid "Application Options:" +msgstr "應用程式選項:" + +#: glib/goption.c:992 glib/goption.c:1062 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "無法給 %2$s 解析整數值‘%1$s’" + +#: glib/goption.c:1002 glib/goption.c:1070 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s 的整數值‘%1$s’超出範圍" + +#: glib/goption.c:1027 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "無法給 %2$s 解析雙精度浮點數‘%1$s’" + +#: glib/goption.c:1035 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s 的雙精度浮點數‘%1$s’超出範圍" + +#: glib/goption.c:1298 glib/goption.c:1377 +#, c-format +msgid "Error parsing option %s" +msgstr "解析 %s 選項時發生錯誤" + +#: glib/goption.c:1408 glib/goption.c:1522 +#, c-format +msgid "Missing argument for %s" +msgstr "缺少 %s 的參數" + +#: glib/goption.c:1917 +#, c-format +msgid "Unknown option %s" +msgstr "未知的選項 %s" + +#: glib/gkeyfile.c:361 +msgid "Valid key file could not be found in search dirs" +msgstr "在資料目錄中找不到有效的設定鍵檔案" + +#: glib/gkeyfile.c:396 +msgid "Not a regular file" +msgstr "不是正規的檔案" + +#: glib/gkeyfile.c:404 +msgid "File is empty" +msgstr "檔案是空白的" + +#: glib/gkeyfile.c:763 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "設定鍵檔案中‘%s’行並非設定鍵值配對、群組或註解" + +#: glib/gkeyfile.c:823 +#, c-format +msgid "Invalid group name: %s" +msgstr "無效的群組名稱:%s" + +#: glib/gkeyfile.c:845 +msgid "Key file does not start with a group" +msgstr "設定鍵檔案並非以群組開頭" + +#: glib/gkeyfile.c:871 +#, c-format +msgid "Invalid key name: %s" +msgstr "無效的設定鍵名稱:%s" + +#: glib/gkeyfile.c:898 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "設定鍵檔案包含不支援的編碼‘%s’" + +#: glib/gkeyfile.c:1114 glib/gkeyfile.c:1276 glib/gkeyfile.c:2505 +#: glib/gkeyfile.c:2571 glib/gkeyfile.c:2706 glib/gkeyfile.c:2839 +#: glib/gkeyfile.c:2992 glib/gkeyfile.c:3179 glib/gkeyfile.c:3240 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "設定鍵檔案沒有群組‘%s’" + +#: glib/gkeyfile.c:1288 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "設定鍵檔案沒有設定鍵‘%s’" + +#: glib/gkeyfile.c:1395 glib/gkeyfile.c:1510 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "設定鍵檔案包含的設定鍵‘%s’(數值為‘%s’)並非 UTF-8" + +#: glib/gkeyfile.c:1415 glib/gkeyfile.c:1909 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "設定鍵檔案包含的設定鍵‘%s’的數值無法解譯。" + +#: glib/gkeyfile.c:1530 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "設定鍵檔案包含的設定鍵「%s」的數值無法解譯。" + +#: glib/gkeyfile.c:2124 glib/gkeyfile.c:2336 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "設定鍵檔案包含的群組‘%2$s’中設定鍵‘%1$s’數值無法解譯" + +#: glib/gkeyfile.c:2520 glib/gkeyfile.c:2721 glib/gkeyfile.c:3251 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "設定鍵檔案的群組‘%2$s’中沒有設定鍵‘%1$s’" + +#: glib/gkeyfile.c:3485 +msgid "Key file contains escape character at end of line" +msgstr "設定鍵檔案在行尾包含跳出字元" + +#: glib/gkeyfile.c:3507 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "設定鍵檔案含有不正確的「跳出字元」‘%s’" + +#: glib/gkeyfile.c:3649 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "數值‘%s’不能被解譯為數字。" + +#: glib/gkeyfile.c:3663 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整數值‘%s’超出範圍" + +#: glib/gkeyfile.c:3696 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "數值‘%s’不能被解譯為浮點數。" + +#: glib/gkeyfile.c:3720 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "數值‘%s’不能被解譯為邏輯值。" + +#: gio/gbufferedinputstream.c:415 gio/gbufferedinputstream.c:496 +#: gio/ginputstream.c:186 gio/ginputstream.c:318 gio/ginputstream.c:557 +#: gio/ginputstream.c:682 gio/goutputstream.c:198 gio/goutputstream.c:657 +#, c-format +msgid "Too large count value passed to %s" +msgstr "傳給 %s 的計數值太大" + +#: gio/gbufferedinputstream.c:883 gio/ginputstream.c:892 gio/giostream.c:305 +#: gio/goutputstream.c:1108 +msgid "Stream is already closed" +msgstr "串流已經關閉" + +#: gio/gcancellable.c:433 gio/glocalfile.c:2108 gio/gsimpleasyncresult.c:651 +#: gio/gsimpleasyncresult.c:677 +msgid "Operation was cancelled" +msgstr "操作已被取消" + +#: gio/gcharsetconverter.c:264 +msgid "Invalid object, not initialized" +msgstr "無效的物件,尚未初始化" + +#: gio/gcharsetconverter.c:285 gio/gcharsetconverter.c:313 +msgid "Incomplete multibyte sequence in input" +msgstr "在輸入中出現不完整的多位元組次序" + +#: gio/gcharsetconverter.c:319 gio/gcharsetconverter.c:328 +msgid "Not enough space in destination" +msgstr "在目的端中沒有足夠的空間" + +#: gio/gcharsetconverter.c:448 gio/gsocket.c:772 +msgid "Cancellable initialization not supported" +msgstr "不支援可取消的初始化" + +#: gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "不明的類型" + +#: gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s 檔案類型" + +#: gio/gcontenttype.c:681 +#, c-format +msgid "%s type" +msgstr "%s 類型" + +#: gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "未預期的串流過早結束" + +#: gio/gdesktopappinfo.c:468 gio/gwin32appinfo.c:222 +msgid "Unnamed" +msgstr "未命名的" + +#: gio/gdesktopappinfo.c:742 +msgid "Desktop file didn't specify Exec field" +msgstr "桌面(Desktop)檔案未指定 Exec 欄位" + +#: gio/gdesktopappinfo.c:924 +msgid "Unable to find terminal required for application" +msgstr "無法找到應用程式要求的終端機" + +#: gio/gdesktopappinfo.c:1132 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "不能建立使用者應用程式組態資料夾 %s:%s" + +#: gio/gdesktopappinfo.c:1136 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "不能建立使用者 MIME 組態資料夾 %s:%s" + +#: gio/gdesktopappinfo.c:1544 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "不能建立使用者桌面檔案 %s" + +#: gio/gdesktopappinfo.c:1658 +#, c-format +msgid "Custom definition for %s" +msgstr "自訂 %s 的定義" + +#: gio/gdrive.c:364 +msgid "drive doesn't implement eject" +msgstr "裝置無法實作退出功能(eject)" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gdrive.c:444 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "裝置無法實作退出功能(eject) 或 eject_with_operation" + +#: gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "裝置無法實作媒體的輪詢" + +#: gio/gdrive.c:726 +msgid "drive doesn't implement start" +msgstr "裝置無法實作啟動功能(start)" + +#: gio/gdrive.c:828 +msgid "drive doesn't implement stop" +msgstr "裝置無法實作停止功能(stop)" + +#: gio/gemblem.c:325 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "不能處理版本為 %d 的 GEmblem 編碼" + +#: gio/gemblem.c:335 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 編碼中記號 (%d) 的數量格式不正確" + +#: gio/gemblemedicon.c:296 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "不能處理版本為 %d 的 GEmblemedIcon 編碼" + +#: gio/gemblemedicon.c:306 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 編碼中記號 (%d) 的數量格式不正確" + +#: gio/gemblemedicon.c:329 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "預期為 GEmblemedIcon 的 GEmblem" + +#: gio/gfile.c:871 gio/gfile.c:1101 gio/gfile.c:1236 gio/gfile.c:1472 +#: gio/gfile.c:1526 gio/gfile.c:1583 gio/gfile.c:1666 gio/gfile.c:1721 +#: gio/gfile.c:1781 gio/gfile.c:1835 gio/gfile.c:3304 gio/gfile.c:3358 +#: gio/gfile.c:3489 gio/gfile.c:3529 gio/gfile.c:3856 gio/gfile.c:4258 +#: gio/gfile.c:4344 gio/gfile.c:4433 gio/gfile.c:4531 gio/gfile.c:4618 +#: gio/gfile.c:4711 gio/gfile.c:5041 gio/gfile.c:5321 gio/gfile.c:5390 +#: gio/gfile.c:6981 gio/gfile.c:7071 gio/gfile.c:7157 +#: gio/win32/gwinhttpfile.c:441 +msgid "Operation not supported" +msgstr "不支援的操作" + +#. Translators: This is an error message when trying to find the +#. * enclosing (user visible) mount of a file, but none exists. +#. Translators: This is an error message when trying to +#. * find the enclosing (user visible) mount of a file, but +#. * none exists. +#. Translators: This is an error message when trying to find +#. * the enclosing (user visible) mount of a file, but none +#. * exists. +#: gio/gfile.c:1357 gio/glocalfile.c:1065 gio/glocalfile.c:1076 +#: gio/glocalfile.c:1089 +msgid "Containing mount does not exist" +msgstr "包含了不存在的掛載點" + +#: gio/gfile.c:2409 gio/glocalfile.c:2264 +msgid "Can't copy over directory" +msgstr "不能複製整個目錄" + +#: gio/gfile.c:2469 +msgid "Can't copy directory over directory" +msgstr "不能將目錄複製到目錄上" + +#: gio/gfile.c:2477 gio/glocalfile.c:2273 +msgid "Target file exists" +msgstr "目標檔案已存在" + +#: gio/gfile.c:2495 +msgid "Can't recursively copy directory" +msgstr "不能遞廻複製目錄" + +#: gio/gfile.c:2755 +#, fuzzy +msgid "Splice not supported" +msgstr "不支援符號連結" + +#: gio/gfile.c:2759 +#, c-format +msgid "Error splicing file: %s" +msgstr "分割檔案時發生錯誤:%s" + +#: gio/gfile.c:2906 +msgid "Can't copy special file" +msgstr "不能複製特殊的檔案" + +#: gio/gfile.c:3479 +msgid "Invalid symlink value given" +msgstr "提供了無效的符號連結值" + +#: gio/gfile.c:3572 +msgid "Trash not supported" +msgstr "不支援回收筒" + +#: gio/gfile.c:3621 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "檔案名稱不能包含「%c」" + +#: gio/gfile.c:6038 gio/gvolume.c:331 +msgid "volume doesn't implement mount" +msgstr "儲存區尚未實作掛載功能" + +#: gio/gfile.c:6149 +msgid "No application is registered as handling this file" +msgstr "沒有應用程式註冊為用以處理這個檔案" + +#: gio/gfileenumerator.c:206 +msgid "Enumerator is closed" +msgstr "檔案列舉器(enumerator)已關閉" + +#: gio/gfileenumerator.c:213 gio/gfileenumerator.c:272 +#: gio/gfileenumerator.c:372 gio/gfileenumerator.c:481 +msgid "File enumerator has outstanding operation" +msgstr "檔案列舉器(enumerator)有異常操作" + +#: gio/gfileenumerator.c:362 gio/gfileenumerator.c:471 +msgid "File enumerator is already closed" +msgstr "檔案列舉器(enumerator)已經關閉" + +#: gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "不能處理版本為 %d 的 GFileIcon 編碼" + +#: gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "給 GFileIcon 的輸入資料格式不良" + +#: gio/gfileinputstream.c:155 gio/gfileinputstream.c:422 +#: gio/gfileiostream.c:171 gio/gfileoutputstream.c:170 +#: gio/gfileoutputstream.c:525 +msgid "Stream doesn't support query_info" +msgstr "串流不支援 query_info" + +#: gio/gfileinputstream.c:337 gio/gfileiostream.c:389 +#: gio/gfileoutputstream.c:383 +msgid "Seek not supported on stream" +msgstr "不支援在串流中搜尋" + +#: gio/gfileinputstream.c:381 +msgid "Truncate not allowed on input stream" +msgstr "在輸入串流中不允許截短(truncate)" + +#: gio/gfileiostream.c:465 gio/gfileoutputstream.c:459 +msgid "Truncate not supported on stream" +msgstr "在串流中不支援截短(truncate)" + +#: gio/gicon.c:286 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "記號數量 (%d) 錯誤" + +#: gio/gicon.c:306 +#, c-format +msgid "No type for class name %s" +msgstr "類別名稱 %s 沒有類型" + +#: gio/gicon.c:316 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面" + +#: gio/gicon.c:327 +#, c-format +msgid "Type %s is not classed" +msgstr "類型 %s 尚未歸類" + +#: gio/gicon.c:341 +#, c-format +msgid "Malformed version number: %s" +msgstr "格式不良的版本號碼:%s" + +#: gio/gicon.c:355 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面的 from_tokens()" + +#: gio/gicon.c:431 +msgid "Can't handle the supplied version the icon encoding" +msgstr "不能處理提供的圖示編碼版本" + +#: gio/ginputstream.c:195 +msgid "Input stream doesn't implement read" +msgstr "輸入串流尚未實作讀取" + +#. Translators: This is an error you get if there is already an +#. * operation running against this stream when you try to start +#. * one +#. Translators: This is an error you get if there is +#. * already an operation running against this stream when +#. * you try to start one +#: gio/ginputstream.c:902 gio/giostream.c:315 gio/goutputstream.c:1118 +msgid "Stream has outstanding operation" +msgstr "串流有異常操作" + +#: gio/ginetsocketaddress.c:182 gio/ginetsocketaddress.c:199 +#: gio/gunixsocketaddress.c:174 +msgid "Not enough space for socket address" +msgstr "socket 位址沒有足夠的空間" + +#: gio/ginetsocketaddress.c:212 +msgid "Unsupported socket address" +msgstr "不支援的 socket 位址" + +#: gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "無法找到預設的本地端目錄監視器類型" + +#: gio/glocalfile.c:599 gio/win32/gwinhttpfile.c:424 +#, c-format +msgid "Invalid filename %s" +msgstr "無效的檔案名稱 %s" + +#: gio/glocalfile.c:973 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "取得檔案系統資訊時發生錯誤:%s" + +#: gio/glocalfile.c:1111 +msgid "Can't rename root directory" +msgstr "不能重新命名根目錄" + +#: gio/glocalfile.c:1131 gio/glocalfile.c:1157 +#, c-format +msgid "Error renaming file: %s" +msgstr "重新命名檔案時發生錯誤:%s" + +#: gio/glocalfile.c:1140 +msgid "Can't rename file, filename already exist" +msgstr "不能重新命名檔案,該檔案名稱已存在" + +#: gio/glocalfile.c:1153 gio/glocalfile.c:2137 gio/glocalfile.c:2166 +#: gio/glocalfile.c:2326 gio/glocalfileoutputstream.c:557 +#: gio/glocalfileoutputstream.c:610 gio/glocalfileoutputstream.c:655 +#: gio/glocalfileoutputstream.c:1137 +msgid "Invalid filename" +msgstr "無效的檔案名稱" + +#: gio/glocalfile.c:1314 +#, c-format +msgid "Error opening file: %s" +msgstr "開啓檔案時發生錯誤:%s" + +#: gio/glocalfile.c:1324 +msgid "Can't open directory" +msgstr "不能開啟目錄" + +#: gio/glocalfile.c:1449 +#, c-format +msgid "Error removing file: %s" +msgstr "移除檔案時發生錯誤:%s" + +#: gio/glocalfile.c:1816 +#, c-format +msgid "Error trashing file: %s" +msgstr "移動檔案至回收筒時發生錯誤:%s" + +#: gio/glocalfile.c:1839 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "無法建立回收筒目錄 %s:%s" + +#: gio/glocalfile.c:1860 +msgid "Unable to find toplevel directory for trash" +msgstr "無法找到回收筒的頂端層級目錄" + +#: gio/glocalfile.c:1939 gio/glocalfile.c:1959 +msgid "Unable to find or create trash directory" +msgstr "無法找到或建立回收筒目錄" + +#: gio/glocalfile.c:1993 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "無法建立回收筒資訊檔案:%s" + +#: gio/glocalfile.c:2022 gio/glocalfile.c:2027 gio/glocalfile.c:2107 +#: gio/glocalfile.c:2114 +#, c-format +msgid "Unable to trash file: %s" +msgstr "無法將檔案移至回收筒:%s" + +#: gio/glocalfile.c:2141 +#, c-format +msgid "Error creating directory: %s" +msgstr "建立目錄發生錯誤:%s" + +#: gio/glocalfile.c:2170 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "檔案系統不支援符號連結" + +#: gio/glocalfile.c:2174 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "建立符號連結時發生錯誤:%s" + +#: gio/glocalfile.c:2236 gio/glocalfile.c:2330 +#, c-format +msgid "Error moving file: %s" +msgstr "移動檔案時發生錯誤:%s" + +#: gio/glocalfile.c:2259 +msgid "Can't move directory over directory" +msgstr "不能將目錄移動至目錄上" + +#: gio/glocalfile.c:2286 gio/glocalfileoutputstream.c:935 +#: gio/glocalfileoutputstream.c:949 gio/glocalfileoutputstream.c:964 +#: gio/glocalfileoutputstream.c:980 gio/glocalfileoutputstream.c:994 +msgid "Backup file creation failed" +msgstr "建立備份檔案失敗" + +#: gio/glocalfile.c:2305 +#, c-format +msgid "Error removing target file: %s" +msgstr "移除目標檔案時發生錯誤:%s" + +#: gio/glocalfile.c:2319 +msgid "Move between mounts not supported" +msgstr "不支援在掛載點之間移動" + +#: gio/glocalfileinfo.c:726 +msgid "Attribute value must be non-NULL" +msgstr "屬性數值必須為非-NULL" + +#: gio/glocalfileinfo.c:733 +msgid "Invalid attribute type (string expected)" +msgstr "無效的屬性類型(應為字串值)" + +#: gio/glocalfileinfo.c:740 +msgid "Invalid extended attribute name" +msgstr "無效的延伸屬性名稱" + +#: gio/glocalfileinfo.c:780 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "設定延伸屬性「%s」時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1484 gio/glocalfileoutputstream.c:819 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "取得檔案「%s」狀態時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1557 +msgid " (invalid encoding)" +msgstr "(無效的編碼)" + +#: gio/glocalfileinfo.c:1755 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "取得檔案描述狀態時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1800 +msgid "Invalid attribute type (uint32 expected)" +msgstr "無效的屬性類型(應為 uint32 值)" + +#: gio/glocalfileinfo.c:1818 +msgid "Invalid attribute type (uint64 expected)" +msgstr "無效的屬性類型(應為 uint64 值)" + +#: gio/glocalfileinfo.c:1837 gio/glocalfileinfo.c:1856 +msgid "Invalid attribute type (byte string expected)" +msgstr "無效的屬性類型(應為 byte string 值)" + +#: gio/glocalfileinfo.c:1891 +msgid "Cannot set permissions on symlinks" +msgstr "不能設定符號連結的權限" + +#: gio/glocalfileinfo.c:1907 +#, c-format +msgid "Error setting permissions: %s" +msgstr "設定權限時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1958 +#, c-format +msgid "Error setting owner: %s" +msgstr "設定擁有者時發生錯誤:%s" + +#: gio/glocalfileinfo.c:1981 +msgid "symlink must be non-NULL" +msgstr "符號連結必須為非-NULL" + +#: gio/glocalfileinfo.c:1991 gio/glocalfileinfo.c:2010 +#: gio/glocalfileinfo.c:2021 +#, c-format +msgid "Error setting symlink: %s" +msgstr "設定符號連結時發生錯誤:%s" + +#: gio/glocalfileinfo.c:2000 +msgid "Error setting symlink: file is not a symlink" +msgstr "設定符號連結時發生錯誤:檔案不是符號連結" + +#: gio/glocalfileinfo.c:2126 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "設定修改或存取時刻時發生錯誤:%s" + +#: gio/glocalfileinfo.c:2149 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 關聯必須為非-NULL" + +#: gio/glocalfileinfo.c:2164 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "設定 SELinux 關聯時發生錯誤:%s" + +#: gio/glocalfileinfo.c:2171 +msgid "SELinux is not enabled on this system" +msgstr "SELinux 在這個系統上並未啟用" + +#: gio/glocalfileinfo.c:2263 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "不支援設定屬性 %s" + +#: gio/glocalfileinputstream.c:171 gio/glocalfileoutputstream.c:708 +#, c-format +msgid "Error reading from file: %s" +msgstr "從檔案讀取時發生錯誤:%s" + +#: gio/glocalfileinputstream.c:202 gio/glocalfileinputstream.c:214 +#: gio/glocalfileinputstream.c:326 gio/glocalfileoutputstream.c:456 +#: gio/glocalfileoutputstream.c:1012 +#, c-format +msgid "Error seeking in file: %s" +msgstr "在檔案中搜尋時發生錯誤:%s" + +#: gio/glocalfileinputstream.c:247 gio/glocalfileoutputstream.c:242 +#: gio/glocalfileoutputstream.c:337 +#, c-format +msgid "Error closing file: %s" +msgstr "關閉檔案時發生錯誤:%s" + +#: gio/glocalfilemonitor.c:213 +msgid "Unable to find default local file monitor type" +msgstr "無法找到預設的本地端檔案監視器類型" + +#: gio/glocalfileoutputstream.c:188 gio/glocalfileoutputstream.c:221 +#: gio/glocalfileoutputstream.c:729 +#, c-format +msgid "Error writing to file: %s" +msgstr "寫入至檔案時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:269 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "移除舊備份連結時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:283 gio/glocalfileoutputstream.c:296 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "建立備份複本時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:314 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "重新命名暫存檔案時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:502 gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error truncating file: %s" +msgstr "截短檔案時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:563 gio/glocalfileoutputstream.c:616 +#: gio/glocalfileoutputstream.c:661 gio/glocalfileoutputstream.c:801 +#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1143 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "開啟檔案「%s」時發生錯誤:%s" + +#: gio/glocalfileoutputstream.c:832 +msgid "Target file is a directory" +msgstr "目標檔案是一個目錄" + +#: gio/glocalfileoutputstream.c:837 +msgid "Target file is not a regular file" +msgstr "目標檔案不是正規的檔案" + +#: gio/glocalfileoutputstream.c:849 +msgid "The file was externally modified" +msgstr "該檔案已被外部程式修改過" + +#: gio/glocalfileoutputstream.c:1028 +#, c-format +msgid "Error removing old file: %s" +msgstr "移除舊檔案時發生錯誤:%s" + +#: gio/gmemoryinputstream.c:487 gio/gmemoryoutputstream.c:718 +msgid "Invalid GSeekType supplied" +msgstr "提供了無效的 GSeek 類型" + +#: gio/gmemoryinputstream.c:497 +msgid "Invalid seek request" +msgstr "無效的搜尋要求" + +#: gio/gmemoryinputstream.c:521 +msgid "Cannot truncate GMemoryInputStream" +msgstr "不能截短 GMemoryInputStream" + +#: gio/gmemoryoutputstream.c:468 +msgid "Memory output stream not resizable" +msgstr "記憶體輸出串流不能改變大小" + +#: gio/gmemoryoutputstream.c:484 +msgid "Failed to resize memory output stream" +msgstr "改變記憶體輸出串流的大小失敗" + +#: gio/gmemoryoutputstream.c:572 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "進行寫入所需的記憶體總額大於可用的位址空間" + +#: gio/gmemoryoutputstream.c:728 +msgid "Requested seek before the beginning of the stream" +msgstr "在串流的開頭之前要求的搜索" + +#: gio/gmemoryoutputstream.c:737 +msgid "Requested seek beyond the end of the stream" +msgstr "在串流的開頭之後要求的搜索" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: gio/gmount.c:364 +msgid "mount doesn't implement \"unmount\"" +msgstr "掛載點尚未實作卸載(umount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: gio/gmount.c:443 +msgid "mount doesn't implement \"eject\"" +msgstr "掛載點尚未實作退出(eject)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: gio/gmount.c:523 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "掛載點尚未實作卸載(umount)或「umount_with_operation」" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gmount.c:610 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "掛載點尚未實作退出(eject)或「eject_with_operation」" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: gio/gmount.c:699 +msgid "mount doesn't implement \"remount\"" +msgstr "掛載點尚未實作重新掛載(remount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:783 +msgid "mount doesn't implement content type guessing" +msgstr "掛載點尚未實作內容類型預測" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: gio/gmount.c:872 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "掛載點尚未實作同步內容類型預測" + +#: gio/gnetworkaddress.c:295 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "主機名稱「%s」含有 '[' but not ']'" + +#: gio/goutputstream.c:207 gio/goutputstream.c:408 +msgid "Output stream doesn't implement write" +msgstr "輸出串流尚未實作寫入" + +#: gio/goutputstream.c:369 gio/goutputstream.c:781 +msgid "Source stream is already closed" +msgstr "來源串流已經關閉" + +#: gio/gresolver.c:736 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "解析「%s」時發生錯誤:%s" + +#: gio/gresolver.c:786 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "反向解析「%s」時發生錯誤:%s" + +#: gio/gresolver.c:821 gio/gresolver.c:899 +#, c-format +msgid "No service record for '%s'" +msgstr "沒有「%s」的服務紀錄" + +#: gio/gresolver.c:826 gio/gresolver.c:904 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "暫時無法解析「%s」" + +#: gio/gresolver.c:831 gio/gresolver.c:909 +#, c-format +msgid "Error resolving '%s'" +msgstr "解析「%s」時發生錯誤" + +#: gio/gsocket.c:277 +msgid "Invalid socket, not initialized" +msgstr "無效的 socket,尚未初始化" + +#: gio/gsocket.c:284 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "無效的 socket,初始化失敗原因為:%s" + +#: gio/gsocket.c:292 +msgid "Socket is already closed" +msgstr "Socket 已經關閉" + +#: gio/gsocket.c:413 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "正在從 fd 建立 GSocket:%s" + +#: gio/gsocket.c:447 gio/gsocket.c:461 gio/gsocket.c:1925 +#, c-format +msgid "Unable to create socket: %s" +msgstr "無法建立 socket:%s" + +#: gio/gsocket.c:447 +msgid "Unknown protocol was specified" +msgstr "指定了不明的通訊協定" + +#: gio/gsocket.c:1126 +#, c-format +msgid "could not get local address: %s" +msgstr "無法取得本地端位址:%s" + +#: gio/gsocket.c:1159 +#, c-format +msgid "could not get remote address: %s" +msgstr "無法取得遠端位址:%s" + +#: gio/gsocket.c:1217 +#, c-format +msgid "could not listen: %s" +msgstr "無法聽取:%s" + +#: gio/gsocket.c:1291 +#, c-format +msgid "Error binding to address: %s" +msgstr "綁定至位址時發生錯誤:%s" + +#: gio/gsocket.c:1411 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接受連線時發生錯誤:%s" + +#: gio/gsocket.c:1524 +msgid "Error connecting: " +msgstr "連線錯誤:" + +#: gio/gsocket.c:1528 +msgid "Connection in progress" +msgstr "連線進行中" + +#: gio/gsocket.c:1533 +#, c-format +msgid "Error connecting: %s" +msgstr "連線錯誤:%s" + +#: gio/gsocket.c:1573 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "無法取得未處理的錯誤:%s" + +#: gio/gsocket.c:1669 +#, c-format +msgid "Error receiving data: %s" +msgstr "接收資料時發生錯誤:%s" + +#: gio/gsocket.c:1812 +#, c-format +msgid "Error sending data: %s" +msgstr "傳送資料時發生錯誤:%s" + +#: gio/gsocket.c:2004 +#, c-format +msgid "Error closing socket: %s" +msgstr "關閉 socket 時發生錯誤:%s" + +#: gio/gsocket.c:2481 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "等候 socket 情況:%s" + +#: gio/gsocket.c:2720 gio/gsocket.c:2801 +#, c-format +msgid "Error sending message: %s" +msgstr "傳送訊息時發生錯誤:%s" + +#: gio/gsocket.c:2745 +msgid "GSocketControlMessage not supported on windows" +msgstr "視窗不支援 GSocketControlMessage" + +#: gio/gsocket.c:3003 gio/gsocket.c:3141 +#, c-format +msgid "Error receiving message: %s" +msgstr "取回郵件發生錯誤:%s" + +#: gio/gsocketclient.c:521 gio/gsocketclient.c:770 +msgid "Unknown error on connect" +msgstr "連線時有不明的錯誤" + +#: gio/gsocketlistener.c:192 +msgid "Listener is already closed" +msgstr "聽取程式已經關閉" + +#: gio/gsocketlistener.c:233 +msgid "Added socket is closed" +msgstr "加入的 socket 已經關閉" + +#: gio/gthemedicon.c:499 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "不能處理版本為 %d 的 GThemedIcon 編碼" + +#: gio/gunixconnection.c:151 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "預期有 1 個控制訊息,卻收到 %d" + +#: gio/gunixconnection.c:164 +msgid "Unexpected type of ancillary data" +msgstr "輔助資料的未預期類型" + +#: gio/gunixconnection.c:182 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "預期有 1 個 fd,卻收到 %d\n" + +#: gio/gunixconnection.c:198 +msgid "Received invalid fd" +msgstr "收到無效的 fd" + +#: gio/gunixinputstream.c:354 gio/gunixinputstream.c:374 +#: gio/gunixinputstream.c:452 gio/gunixoutputstream.c:439 +#, c-format +msgid "Error reading from unix: %s" +msgstr "從 unix 讀取時發生錯誤:%s" + +#: gio/gunixinputstream.c:407 gio/gunixinputstream.c:589 +#: gio/gunixoutputstream.c:394 gio/gunixoutputstream.c:545 +#, c-format +msgid "Error closing unix: %s" +msgstr "關閉 unix 時發生錯誤:%s" + +#: gio/gunixmounts.c:1846 gio/gunixmounts.c:1883 +msgid "Filesystem root" +msgstr "根檔案系統" + +#: gio/gunixoutputstream.c:340 gio/gunixoutputstream.c:361 +#, c-format +msgid "Error writing to unix: %s" +msgstr "寫入至 unix 時發生錯誤:%s" + +#: gio/gunixsocketaddress.c:182 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "這個系統不支授抽象 unix 網域 socket 位址" + +#: gio/gvolume.c:407 +msgid "volume doesn't implement eject" +msgstr "儲存區尚未實作退出(eject)" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: gio/gvolume.c:486 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "儲存區尚未實作退出(eject) 或 eject_with_operation" + +#: gio/gwin32appinfo.c:277 +msgid "Can't find application" +msgstr "找不到應用程式" + +#: gio/gwin32appinfo.c:300 +#, c-format +msgid "Error launching application: %s" +msgstr "執行應用程式時發生錯誤:%s" + +#: gio/gwin32appinfo.c:336 +msgid "URIs not supported" +msgstr "不支援 URIs" + +#: gio/gwin32appinfo.c:358 +msgid "association changes not supported on win32" +msgstr "關聯變更在 win32 上不支援" + +#: gio/gwin32appinfo.c:370 +msgid "Association creation not supported on win32" +msgstr "關聯建立在 win32 上不支援" + +#: gio/gzlibcompressor.c:279 gio/gzlibdecompressor.c:250 +msgid "Not enough memory" +msgstr "沒有足夠的記憶體" + +#: gio/gzlibcompressor.c:286 gio/gzlibdecompressor.c:257 +#, c-format +msgid "Internal error: %s" +msgstr "內部的錯誤:%s" + +#: gio/gzlibcompressor.c:299 gio/gzlibdecompressor.c:271 +msgid "Need more input" +msgstr "需要更多輸入" + +#: gio/gzlibdecompressor.c:243 +msgid "Invalid compressed data" +msgstr "無效的壓縮資料" + +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "在輸入中出現無效的 UTF-8 次序" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "已達最大資料陣列上限" + +#~ msgid "do not hide entries" +#~ msgstr "不要隱藏項目" + +#~ msgid "use a long listing format" +#~ msgstr "使用長式表列格式" + +#~ msgid "[FILE...]" +#~ msgstr "[檔案...]" + +#~ msgid "" +#~ "Character '%s' is not valid at the start of an entity name; the & " +#~ "character begins an entity; if this ampersand isn't supposed to be an " +#~ "entity, escape it as &" +#~ msgstr "" +#~ "實體名稱不應以‘%s’開始,應該使用 & 字元;如果這個 & 字元不是作為實體使用," +#~ "請將 & 轉換為 &" + +#~ msgid "Character '%s' is not valid inside an entity name" +#~ msgstr "實體名稱中不應含有字元‘%s’" + +#~ msgid "Empty character reference; should include a digit such as dž" +#~ msgstr "字元參引是空白的;它應該包括數字,像 dž" + +#~ msgid "Unfinished entity reference" +#~ msgstr "未完成的實體參引" + +#~ msgid "Unfinished character reference" +#~ msgstr "未完成的字元參引" + +#~ msgid "Invalid UTF-8 encoded text - overlong sequence" +#~ msgstr "無效的 UTF-8 編碼文字 - 序列過長" + +#~ msgid "Invalid UTF-8 encoded text - not a start char" +#~ msgstr "無效的 UTF-8 編碼文字 - 非開始字元" + +#~ msgid "file" +#~ msgstr "檔案" + +#~ msgid "The file containing the icon" +#~ msgstr "含有圖示的檔案" + +#~ msgid "name" +#~ msgstr "名稱" + +#~ msgid "The name of the icon" +#~ msgstr "圖示的名稱" + +#~ msgid "names" +#~ msgstr "名稱" + +#~ msgid "An array containing the icon names" +#~ msgstr "包含圖示名稱的陣列" + +#~ msgid "use default fallbacks" +#~ msgstr "使用預設的回饋" + +#~ msgid "" +#~ "Whether to use default fallbacks found by shortening the name at '-' " +#~ "characters. Ignores names after the first if multiple names are given." +#~ msgstr "" +#~ "是否使用縮短過在「-」字元的名稱找到的預設回饋。如果提供多個名稱則忽略第一" +#~ "個以外的名稱。" + +#~ msgid "File descriptor" +#~ msgstr "檔案描述子" + +#~ msgid "The file descriptor to read from" +#~ msgstr "要讀取的檔案描述子" + +#~ msgid "Close file descriptor" +#~ msgstr "關閉檔案描述子" + +#~ msgid "Whether to close the file descriptor when the stream is closed" +#~ msgstr "當串流關閉時是否關閉檔案描述子" + +#~ msgid "The file descriptor to write to" +#~ msgstr "要寫入的檔案描述子" + +#~ msgid "Error creating backup link: %s" +#~ msgstr "建立備份連結時發生錯誤:%s" diff --git a/sanity_check b/sanity_check new file mode 100755 index 0000000..5f6e66e --- /dev/null +++ b/sanity_check @@ -0,0 +1,40 @@ +#!/bin/sh + +VERSION=$1 + +if [ ! -f glib-$VERSION.tar.gz ]; then + echo "ERROR: glib-$VERSION.tar.gz does not exist..." + exit 1 +fi + +echo "" + +echo "Checking glib-$VERSION.tar.gz..." +tar xfz glib-$VERSION.tar.gz + + +for file in INSTALL NEWS README +do + echo -n "$file... " + if [ "x`grep $VERSION glib-$VERSION/$file | wc -l | awk -F' ' '{print $1}'`" = "x0" ]; then + echo "failed." + #exit 1 + else + echo "ok" + fi +done + +echo -n "INSTALL..." +if [ "x`grep $VERSION glib-$VERSION/INSTALL | wc -l | awk -F' ' '{print $1}'`" = "x2" ]; then + echo "ok" +else + echo "failed." + exit 1 +fi + +echo "" +echo "Number of lines in created documentation files:" + +wc -l glib-$VERSION/docs/reference/*/html/*.html | grep total + +rm -rf glib-$VERSION diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..0298f2a --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,240 @@ +include $(top_srcdir)/Makefile.decl + +SUBDIRS=gobject refcount + +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) + +AM_CFLAGS = -g + +EFENCE= + +libglib = $(top_builddir)/glib/libglib-2.0.la +libgthread = $(top_builddir)/gthread/libgthread-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la +libgobject = $(top_builddir)/gobject/libgobject-2.0.la + +libadd_libgmodule = $(libgmodule) +libadd_libglib = $(libglib) +if PLATFORM_WIN32 +no_undefined = -no-undefined + +module_test_exp = module-test.exp + +module-test.exp: module-test.o + dlltool --output-exp module-test.exp module-test.o + +spawn_test_win32_gui = spawn-test-win32-gui + +spawn_test_win32_gui_LDFLAGS = -mwindows + +endif + +EXTRA_DIST += \ + $(test_scripts) \ + makefile.msc.in \ + casefold.txt \ + casemap.txt \ + gen-casefold-txt.pl \ + gen-casemap-txt.pl \ + iochannel-test-infile \ + utf8.txt \ + timeloop-basic.c + +BUILT_EXTRA_DIST = \ + makefile.msc + +if HAVE_CXX +CXX_TEST = cxx-test +cxx_test_LDADD = $(progs_ldadd) +cxx_test_SOURCES = cxx-test.C +else +CXX_TEST = +endif + +if ENABLE_TIMELOOP +timeloop = timeloop timeloop-closure +endif +noinst_PROGRAMS = $(TEST_PROGS) \ + testgdate \ + testgdateparser \ + unicode-normalize \ + unicode-collate \ + $(timeloop) \ + errorcheck-mutex-test \ + assert-msg-test + +TEST_PROGS += scannerapi +scannerapi_SOURCES = scannerapi.c +scannerapi_LDADD = $(progs_ldadd) +TEST_PROGS += testglib +testglib_SOURCES = testglib.c +testglib_LDADD = $(libglib) +TEST_PROGS += testingbase64 +testingbase64_SOURCES = testingbase64.c +testingbase64_LDADD = $(progs_ldadd) + + +patterntest_LDADD = $(libglib) +testgdate_LDADD = $(libglib) +testgdateparser_LDADD = $(libglib) +unicode_normalize_LDADD = $(libglib) +errorcheck_mutex_test_LDADD = $(libglib) $(libgthread) $(G_THREAD_LIBS) +assert_msg_test_LDADD = $(libglib) +if ENABLE_TIMELOOP +timeloop_LDADD = $(libglib) +timeloop_closure_LDADD = $(libglib) $(libgobject) +endif + +test_programs = \ + atomic-test \ + base64-test \ + bit-test \ + $(CXX_TEST) \ + checksum-test \ + child-test \ + completion-test \ + convert-test \ + date-test \ + dirname-test \ + file-test \ + env-test \ + gio-test \ + hash-test \ + iochannel-test \ + list-test \ + mainloop-test \ + mapping-test \ + markup-collect \ + markup-escape-test \ + module-test \ + node-test \ + onceinit \ + patterntest \ + queue-test \ + asyncqueue-test \ + qsort-test \ + relation-test \ + sequence-test \ + shell-test \ + slist-test \ + slice-test \ + slice-color \ + slice-concurrent \ + slice-threadinit \ + spawn-test \ + $(spawn_test_win32_gui) \ + thread-test \ + threadpool-test \ + tree-test \ + type-test \ + unicode-caseconv \ + unicode-encoding \ + utf8-validate \ + utf8-pointer \ + uri-test \ + regex-test + +test_scripts = run-markup-tests.sh run-collate-tests.sh run-bookmark-test.sh run-assert-msg-test.sh + +test_script_support_programs = markup-test unicode-collate bookmarkfile-test + +check_PROGRAMS = $(test_programs) $(test_script_support_programs) + +TESTS = $(test_programs) $(test_scripts) +TESTS_ENVIRONMENT = srcdir=$(srcdir) \ + LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset \ + MALLOC_CHECK_=2 \ + MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) + +progs_ldadd = $(EFENCE) $(libglib) $(EFENCE) +thread_ldadd = $(libgthread) $(G_THREAD_LIBS) $(progs_ldadd) +module_ldadd = $(libgmodule) $(G_MODULE_LIBS) $(progs_ldadd) + +atomic_test_LDADD = $(progs_ldadd) +base64_test_LDADD = $(progs_ldadd) +bit_test_LDADD = $(progs_ldadd) +bookmarkfile_test_LDADD = $(progs_ldadd) +checksum_test_LDADD = $(progs_ldadd) +child_test_LDADD = $(thread_ldadd) +completion_test_LDADD = $(progs_ldadd) +convert_test_LDADD = $(progs_ldadd) +date_test_LDADD = $(progs_ldadd) +dirname_test_LDADD = $(progs_ldadd) +file_test_LDADD = $(progs_ldadd) +env_test_LDADD = $(progs_ldadd) +gio_test_LDADD = $(progs_ldadd) +hash_test_LDADD = $(progs_ldadd) +iochannel_test_LDADD = $(progs_ldadd) +list_test_LDADD = $(progs_ldadd) +mainloop_test_LDADD = $(thread_ldadd) +markup_test_LDADD = $(progs_ldadd) +mapping_test_LDADD = $(progs_ldadd) +markup_escape_test_LDADD = $(progs_ldadd) +module_test_LDADD = $(module_ldadd) $(module_test_exp) +module_test_LDFLAGS = $(G_MODULE_LDFLAGS) +node_test_LDADD = $(progs_ldadd) +onceinit_LDADD = $(thread_ldadd) +queue_test_LDADD = $(progs_ldadd) +asyncqueue_test_LDADD = $(thread_ldadd) +qsort_test_LDADD = $(progs_ldadd) +relation_test_LDADD = $(progs_ldadd) +sequence_test_LDADD = $(progs_ldadd) +shell_test_LDADD = $(progs_ldadd) +slist_test_LDADD = $(progs_ldadd) +slice_test_SOURCES = slice-test.c memchunks.c +slice_test_LDADD = $(thread_ldadd) +slice_color_SOURCES = slice-color.c memchunks.c +slice_color_LDADD = $(thread_ldadd) +slice_concurrent_SOURCES = slice-concurrent.c +slice_concurrent_LDADD = $(thread_ldadd) +slice_threadinit_SOURCES = slice-threadinit.c +slice_threadinit_LDADD = $(thread_ldadd) +spawn_test_LDADD = $(progs_ldadd) +thread_test_LDADD = $(thread_ldadd) +threadpool_test_LDADD = $(thread_ldadd) +tree_test_LDADD = $(progs_ldadd) +type_test_LDADD = $(progs_ldadd) +unicode_encoding_LDADD = $(progs_ldadd) +unicode_caseconv_LDADD = $(progs_ldadd) +unicode_collate_LDADD = $(progs_ldadd) +utf8_validate_LDADD = $(progs_ldadd) +utf8_pointer_LDADD = $(progs_ldadd) +uri_test_LDADD = $(progs_ldadd) +regex_test_LDADD = $(progs_ldadd) +markup_collect_LDADD = $(progs_ldadd) + +noinst_LTLIBRARIES = libmoduletestplugin_a.la libmoduletestplugin_b.la + +libmoduletestplugin_a_la_SOURCES = libmoduletestplugin_a.c +libmoduletestplugin_a_la_LDFLAGS = $(G_MODULE_LDFLAGS) -avoid-version -module $(no_undefined) -rpath $(libdir) +libmoduletestplugin_a_la_LIBADD = $(G_MODULE_LIBS) $(libadd_libgmodule) $(libadd_libglib) + +libmoduletestplugin_b_la_SOURCES = libmoduletestplugin_b.c +libmoduletestplugin_b_la_LDFLAGS = $(G_MODULE_LDFLAGS) -avoid-version -module $(no_undefined) -rpath $(libdir) +libmoduletestplugin_b_la_LIBADD = $(G_MODULE_LIBS) $(libadd_libgmodule) $(libadd_libglib) + +dist-hook: $(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 + mkdir $(distdir)/markups; \ + for f in $(srcdir)/markups/* ; do \ + cp $$f $(distdir)/markups; done + mkdir $(distdir)/collate; \ + for f in $(srcdir)/collate/* ; do \ + if test -f $$f; then cp $$f $(distdir)/collate; fi; done + mkdir $(distdir)/bookmarks; \ + for f in $(srcdir)/bookmarks/* ; do \ + cp $$f $(distdir)/bookmarks; done + +DISTCLEANFILES = \ + iochannel-test-outfile \ + file-test-get-contents \ + maptest \ + mapchild \ + collate.out diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 0000000..28136c2 --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,1677 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/makefile.msc.in $(top_srcdir)/Makefile.decl +noinst_PROGRAMS = $(am__EXEEXT_5) testgdate$(EXEEXT) \ + testgdateparser$(EXEEXT) unicode-normalize$(EXEEXT) \ + unicode-collate$(EXEEXT) $(am__EXEEXT_6) \ + errorcheck-mutex-test$(EXEEXT) assert-msg-test$(EXEEXT) +check_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4) +TESTS = $(am__EXEEXT_3) $(test_scripts) +subdir = tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = makefile.msc +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +am__DEPENDENCIES_1 = +libmoduletestplugin_a_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(libadd_libgmodule) $(libadd_libglib) +am_libmoduletestplugin_a_la_OBJECTS = libmoduletestplugin_a.lo +libmoduletestplugin_a_la_OBJECTS = \ + $(am_libmoduletestplugin_a_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libmoduletestplugin_a_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libmoduletestplugin_a_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +libmoduletestplugin_b_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(libadd_libgmodule) $(libadd_libglib) +am_libmoduletestplugin_b_la_OBJECTS = libmoduletestplugin_b.lo +libmoduletestplugin_b_la_OBJECTS = \ + $(am_libmoduletestplugin_b_la_OBJECTS) +libmoduletestplugin_b_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libmoduletestplugin_b_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_CXX_TRUE@am__EXEEXT_1 = cxx-test$(EXEEXT) +@PLATFORM_WIN32_TRUE@am__EXEEXT_2 = spawn-test-win32-gui$(EXEEXT) +am__EXEEXT_3 = atomic-test$(EXEEXT) base64-test$(EXEEXT) \ + bit-test$(EXEEXT) $(am__EXEEXT_1) checksum-test$(EXEEXT) \ + child-test$(EXEEXT) completion-test$(EXEEXT) \ + convert-test$(EXEEXT) date-test$(EXEEXT) dirname-test$(EXEEXT) \ + file-test$(EXEEXT) env-test$(EXEEXT) gio-test$(EXEEXT) \ + hash-test$(EXEEXT) iochannel-test$(EXEEXT) list-test$(EXEEXT) \ + mainloop-test$(EXEEXT) mapping-test$(EXEEXT) \ + markup-collect$(EXEEXT) markup-escape-test$(EXEEXT) \ + module-test$(EXEEXT) node-test$(EXEEXT) onceinit$(EXEEXT) \ + patterntest$(EXEEXT) queue-test$(EXEEXT) \ + asyncqueue-test$(EXEEXT) qsort-test$(EXEEXT) \ + relation-test$(EXEEXT) sequence-test$(EXEEXT) \ + shell-test$(EXEEXT) slist-test$(EXEEXT) slice-test$(EXEEXT) \ + slice-color$(EXEEXT) slice-concurrent$(EXEEXT) \ + slice-threadinit$(EXEEXT) spawn-test$(EXEEXT) $(am__EXEEXT_2) \ + thread-test$(EXEEXT) threadpool-test$(EXEEXT) \ + tree-test$(EXEEXT) type-test$(EXEEXT) \ + unicode-caseconv$(EXEEXT) unicode-encoding$(EXEEXT) \ + utf8-validate$(EXEEXT) utf8-pointer$(EXEEXT) uri-test$(EXEEXT) \ + regex-test$(EXEEXT) +am__EXEEXT_4 = markup-test$(EXEEXT) unicode-collate$(EXEEXT) \ + bookmarkfile-test$(EXEEXT) +am__EXEEXT_5 = scannerapi$(EXEEXT) testglib$(EXEEXT) \ + testingbase64$(EXEEXT) +@ENABLE_TIMELOOP_TRUE@am__EXEEXT_6 = timeloop$(EXEEXT) \ +@ENABLE_TIMELOOP_TRUE@ timeloop-closure$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +assert_msg_test_SOURCES = assert-msg-test.c +assert_msg_test_OBJECTS = assert-msg-test.$(OBJEXT) +assert_msg_test_DEPENDENCIES = $(libglib) +asyncqueue_test_SOURCES = asyncqueue-test.c +asyncqueue_test_OBJECTS = asyncqueue-test.$(OBJEXT) +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(libglib) \ + $(am__DEPENDENCIES_1) +am__DEPENDENCIES_3 = $(libgthread) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +asyncqueue_test_DEPENDENCIES = $(am__DEPENDENCIES_3) +atomic_test_SOURCES = atomic-test.c +atomic_test_OBJECTS = atomic-test.$(OBJEXT) +atomic_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +base64_test_SOURCES = base64-test.c +base64_test_OBJECTS = base64-test.$(OBJEXT) +base64_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +bit_test_SOURCES = bit-test.c +bit_test_OBJECTS = bit-test.$(OBJEXT) +bit_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +bookmarkfile_test_SOURCES = bookmarkfile-test.c +bookmarkfile_test_OBJECTS = bookmarkfile-test.$(OBJEXT) +bookmarkfile_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +checksum_test_SOURCES = checksum-test.c +checksum_test_OBJECTS = checksum-test.$(OBJEXT) +checksum_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +child_test_SOURCES = child-test.c +child_test_OBJECTS = child-test.$(OBJEXT) +child_test_DEPENDENCIES = $(am__DEPENDENCIES_3) +completion_test_SOURCES = completion-test.c +completion_test_OBJECTS = completion-test.$(OBJEXT) +completion_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +convert_test_SOURCES = convert-test.c +convert_test_OBJECTS = convert-test.$(OBJEXT) +convert_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +am__cxx_test_SOURCES_DIST = cxx-test.C +@HAVE_CXX_TRUE@am_cxx_test_OBJECTS = cxx-test.$(OBJEXT) +cxx_test_OBJECTS = $(am_cxx_test_OBJECTS) +@HAVE_CXX_TRUE@cxx_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +date_test_SOURCES = date-test.c +date_test_OBJECTS = date-test.$(OBJEXT) +date_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +dirname_test_SOURCES = dirname-test.c +dirname_test_OBJECTS = dirname-test.$(OBJEXT) +dirname_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +env_test_SOURCES = env-test.c +env_test_OBJECTS = env-test.$(OBJEXT) +env_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +errorcheck_mutex_test_SOURCES = errorcheck-mutex-test.c +errorcheck_mutex_test_OBJECTS = errorcheck-mutex-test.$(OBJEXT) +errorcheck_mutex_test_DEPENDENCIES = $(libglib) $(libgthread) \ + $(am__DEPENDENCIES_1) +file_test_SOURCES = file-test.c +file_test_OBJECTS = file-test.$(OBJEXT) +file_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +gio_test_SOURCES = gio-test.c +gio_test_OBJECTS = gio-test.$(OBJEXT) +gio_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +hash_test_SOURCES = hash-test.c +hash_test_OBJECTS = hash-test.$(OBJEXT) +hash_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +iochannel_test_SOURCES = iochannel-test.c +iochannel_test_OBJECTS = iochannel-test.$(OBJEXT) +iochannel_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +list_test_SOURCES = list-test.c +list_test_OBJECTS = list-test.$(OBJEXT) +list_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +mainloop_test_SOURCES = mainloop-test.c +mainloop_test_OBJECTS = mainloop-test.$(OBJEXT) +mainloop_test_DEPENDENCIES = $(am__DEPENDENCIES_3) +mapping_test_SOURCES = mapping-test.c +mapping_test_OBJECTS = mapping-test.$(OBJEXT) +mapping_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +markup_collect_SOURCES = markup-collect.c +markup_collect_OBJECTS = markup-collect.$(OBJEXT) +markup_collect_DEPENDENCIES = $(am__DEPENDENCIES_2) +markup_escape_test_SOURCES = markup-escape-test.c +markup_escape_test_OBJECTS = markup-escape-test.$(OBJEXT) +markup_escape_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +markup_test_SOURCES = markup-test.c +markup_test_OBJECTS = markup-test.$(OBJEXT) +markup_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +module_test_SOURCES = module-test.c +module_test_OBJECTS = module-test.$(OBJEXT) +am__DEPENDENCIES_4 = $(libgmodule) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +module_test_DEPENDENCIES = $(am__DEPENDENCIES_4) $(module_test_exp) +module_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(module_test_LDFLAGS) $(LDFLAGS) -o $@ +node_test_SOURCES = node-test.c +node_test_OBJECTS = node-test.$(OBJEXT) +node_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +onceinit_SOURCES = onceinit.c +onceinit_OBJECTS = onceinit.$(OBJEXT) +onceinit_DEPENDENCIES = $(am__DEPENDENCIES_3) +patterntest_SOURCES = patterntest.c +patterntest_OBJECTS = patterntest.$(OBJEXT) +patterntest_DEPENDENCIES = $(libglib) +qsort_test_SOURCES = qsort-test.c +qsort_test_OBJECTS = qsort-test.$(OBJEXT) +qsort_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +queue_test_SOURCES = queue-test.c +queue_test_OBJECTS = queue-test.$(OBJEXT) +queue_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +regex_test_SOURCES = regex-test.c +regex_test_OBJECTS = regex-test.$(OBJEXT) +regex_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +relation_test_SOURCES = relation-test.c +relation_test_OBJECTS = relation-test.$(OBJEXT) +relation_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_scannerapi_OBJECTS = scannerapi.$(OBJEXT) +scannerapi_OBJECTS = $(am_scannerapi_OBJECTS) +scannerapi_DEPENDENCIES = $(am__DEPENDENCIES_2) +sequence_test_SOURCES = sequence-test.c +sequence_test_OBJECTS = sequence-test.$(OBJEXT) +sequence_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +shell_test_SOURCES = shell-test.c +shell_test_OBJECTS = shell-test.$(OBJEXT) +shell_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +am_slice_color_OBJECTS = slice-color.$(OBJEXT) memchunks.$(OBJEXT) +slice_color_OBJECTS = $(am_slice_color_OBJECTS) +slice_color_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_slice_concurrent_OBJECTS = slice-concurrent.$(OBJEXT) +slice_concurrent_OBJECTS = $(am_slice_concurrent_OBJECTS) +slice_concurrent_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_slice_test_OBJECTS = slice-test.$(OBJEXT) memchunks.$(OBJEXT) +slice_test_OBJECTS = $(am_slice_test_OBJECTS) +slice_test_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_slice_threadinit_OBJECTS = slice-threadinit.$(OBJEXT) +slice_threadinit_OBJECTS = $(am_slice_threadinit_OBJECTS) +slice_threadinit_DEPENDENCIES = $(am__DEPENDENCIES_3) +slist_test_SOURCES = slist-test.c +slist_test_OBJECTS = slist-test.$(OBJEXT) +slist_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +spawn_test_SOURCES = spawn-test.c +spawn_test_OBJECTS = spawn-test.$(OBJEXT) +spawn_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +spawn_test_win32_gui_SOURCES = spawn-test-win32-gui.c +spawn_test_win32_gui_OBJECTS = spawn-test-win32-gui.$(OBJEXT) +spawn_test_win32_gui_LDADD = $(LDADD) +spawn_test_win32_gui_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(spawn_test_win32_gui_LDFLAGS) \ + $(LDFLAGS) -o $@ +testgdate_SOURCES = testgdate.c +testgdate_OBJECTS = testgdate.$(OBJEXT) +testgdate_DEPENDENCIES = $(libglib) +testgdateparser_SOURCES = testgdateparser.c +testgdateparser_OBJECTS = testgdateparser.$(OBJEXT) +testgdateparser_DEPENDENCIES = $(libglib) +am_testglib_OBJECTS = testglib.$(OBJEXT) +testglib_OBJECTS = $(am_testglib_OBJECTS) +testglib_DEPENDENCIES = $(libglib) +am_testingbase64_OBJECTS = testingbase64.$(OBJEXT) +testingbase64_OBJECTS = $(am_testingbase64_OBJECTS) +testingbase64_DEPENDENCIES = $(am__DEPENDENCIES_2) +thread_test_SOURCES = thread-test.c +thread_test_OBJECTS = thread-test.$(OBJEXT) +thread_test_DEPENDENCIES = $(am__DEPENDENCIES_3) +threadpool_test_SOURCES = threadpool-test.c +threadpool_test_OBJECTS = threadpool-test.$(OBJEXT) +threadpool_test_DEPENDENCIES = $(am__DEPENDENCIES_3) +timeloop_SOURCES = timeloop.c +timeloop_OBJECTS = timeloop.$(OBJEXT) +@ENABLE_TIMELOOP_TRUE@timeloop_DEPENDENCIES = $(libglib) +timeloop_closure_SOURCES = timeloop-closure.c +timeloop_closure_OBJECTS = timeloop-closure.$(OBJEXT) +@ENABLE_TIMELOOP_TRUE@timeloop_closure_DEPENDENCIES = $(libglib) \ +@ENABLE_TIMELOOP_TRUE@ $(libgobject) +tree_test_SOURCES = tree-test.c +tree_test_OBJECTS = tree-test.$(OBJEXT) +tree_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +type_test_SOURCES = type-test.c +type_test_OBJECTS = type-test.$(OBJEXT) +type_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +unicode_caseconv_SOURCES = unicode-caseconv.c +unicode_caseconv_OBJECTS = unicode-caseconv.$(OBJEXT) +unicode_caseconv_DEPENDENCIES = $(am__DEPENDENCIES_2) +unicode_collate_SOURCES = unicode-collate.c +unicode_collate_OBJECTS = unicode-collate.$(OBJEXT) +unicode_collate_DEPENDENCIES = $(am__DEPENDENCIES_2) +unicode_encoding_SOURCES = unicode-encoding.c +unicode_encoding_OBJECTS = unicode-encoding.$(OBJEXT) +unicode_encoding_DEPENDENCIES = $(am__DEPENDENCIES_2) +unicode_normalize_SOURCES = unicode-normalize.c +unicode_normalize_OBJECTS = unicode-normalize.$(OBJEXT) +unicode_normalize_DEPENDENCIES = $(libglib) +uri_test_SOURCES = uri-test.c +uri_test_OBJECTS = uri-test.$(OBJEXT) +uri_test_DEPENDENCIES = $(am__DEPENDENCIES_2) +utf8_pointer_SOURCES = utf8-pointer.c +utf8_pointer_OBJECTS = utf8-pointer.$(OBJEXT) +utf8_pointer_DEPENDENCIES = $(am__DEPENDENCIES_2) +utf8_validate_SOURCES = utf8-validate.c +utf8_validate_OBJECTS = utf8-validate.$(OBJEXT) +utf8_validate_DEPENDENCIES = $(am__DEPENDENCIES_2) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_$(V)) +am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) +am__v_CXX_0 = @echo " CXX " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_$(V)) +am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CXXLD_0 = @echo " CXXLD " $@; +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libmoduletestplugin_a_la_SOURCES) \ + $(libmoduletestplugin_b_la_SOURCES) assert-msg-test.c \ + asyncqueue-test.c atomic-test.c base64-test.c bit-test.c \ + bookmarkfile-test.c checksum-test.c child-test.c \ + completion-test.c convert-test.c $(cxx_test_SOURCES) \ + date-test.c dirname-test.c env-test.c errorcheck-mutex-test.c \ + file-test.c gio-test.c hash-test.c iochannel-test.c \ + list-test.c mainloop-test.c mapping-test.c markup-collect.c \ + markup-escape-test.c markup-test.c module-test.c node-test.c \ + onceinit.c patterntest.c qsort-test.c queue-test.c \ + regex-test.c relation-test.c $(scannerapi_SOURCES) \ + sequence-test.c shell-test.c $(slice_color_SOURCES) \ + $(slice_concurrent_SOURCES) $(slice_test_SOURCES) \ + $(slice_threadinit_SOURCES) slist-test.c spawn-test.c \ + spawn-test-win32-gui.c testgdate.c testgdateparser.c \ + $(testglib_SOURCES) $(testingbase64_SOURCES) thread-test.c \ + threadpool-test.c timeloop.c timeloop-closure.c tree-test.c \ + type-test.c unicode-caseconv.c unicode-collate.c \ + unicode-encoding.c unicode-normalize.c uri-test.c \ + utf8-pointer.c utf8-validate.c +DIST_SOURCES = $(libmoduletestplugin_a_la_SOURCES) \ + $(libmoduletestplugin_b_la_SOURCES) assert-msg-test.c \ + asyncqueue-test.c atomic-test.c base64-test.c bit-test.c \ + bookmarkfile-test.c checksum-test.c child-test.c \ + completion-test.c convert-test.c $(am__cxx_test_SOURCES_DIST) \ + date-test.c dirname-test.c env-test.c errorcheck-mutex-test.c \ + file-test.c gio-test.c hash-test.c iochannel-test.c \ + list-test.c mainloop-test.c mapping-test.c markup-collect.c \ + markup-escape-test.c markup-test.c module-test.c node-test.c \ + onceinit.c patterntest.c qsort-test.c queue-test.c \ + regex-test.c relation-test.c $(scannerapi_SOURCES) \ + sequence-test.c shell-test.c $(slice_color_SOURCES) \ + $(slice_concurrent_SOURCES) $(slice_test_SOURCES) \ + $(slice_threadinit_SOURCES) slist-test.c spawn-test.c \ + spawn-test-win32-gui.c testgdate.c testgdateparser.c \ + $(testglib_SOURCES) $(testingbase64_SOURCES) thread-test.c \ + threadpool-test.c timeloop.c timeloop-closure.c tree-test.c \ + type-test.c unicode-caseconv.c unicode-collate.c \ + unicode-encoding.c unicode-normalize.c uri-test.c \ + utf8-pointer.c utf8-validate.c +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 +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +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" +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = $(test_scripts) makefile.msc.in casefold.txt casemap.txt \ + gen-casefold-txt.pl gen-casemap-txt.pl iochannel-test-infile \ + utf8.txt timeloop-basic.c +TEST_PROGS = scannerapi testglib testingbase64 +SUBDIRS = gobject refcount +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) + +AM_CFLAGS = -g +EFENCE = +libglib = $(top_builddir)/glib/libglib-2.0.la +libgthread = $(top_builddir)/gthread/libgthread-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la +libgobject = $(top_builddir)/gobject/libgobject-2.0.la +libadd_libgmodule = $(libgmodule) +libadd_libglib = $(libglib) +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +@PLATFORM_WIN32_TRUE@module_test_exp = module-test.exp +@PLATFORM_WIN32_TRUE@spawn_test_win32_gui = spawn-test-win32-gui +@PLATFORM_WIN32_TRUE@spawn_test_win32_gui_LDFLAGS = -mwindows +BUILT_EXTRA_DIST = \ + makefile.msc + +@HAVE_CXX_FALSE@CXX_TEST = +@HAVE_CXX_TRUE@CXX_TEST = cxx-test +@HAVE_CXX_TRUE@cxx_test_LDADD = $(progs_ldadd) +@HAVE_CXX_TRUE@cxx_test_SOURCES = cxx-test.C +@ENABLE_TIMELOOP_TRUE@timeloop = timeloop timeloop-closure +scannerapi_SOURCES = scannerapi.c +scannerapi_LDADD = $(progs_ldadd) +testglib_SOURCES = testglib.c +testglib_LDADD = $(libglib) +testingbase64_SOURCES = testingbase64.c +testingbase64_LDADD = $(progs_ldadd) +patterntest_LDADD = $(libglib) +testgdate_LDADD = $(libglib) +testgdateparser_LDADD = $(libglib) +unicode_normalize_LDADD = $(libglib) +errorcheck_mutex_test_LDADD = $(libglib) $(libgthread) $(G_THREAD_LIBS) +assert_msg_test_LDADD = $(libglib) +@ENABLE_TIMELOOP_TRUE@timeloop_LDADD = $(libglib) +@ENABLE_TIMELOOP_TRUE@timeloop_closure_LDADD = $(libglib) $(libgobject) +test_programs = \ + atomic-test \ + base64-test \ + bit-test \ + $(CXX_TEST) \ + checksum-test \ + child-test \ + completion-test \ + convert-test \ + date-test \ + dirname-test \ + file-test \ + env-test \ + gio-test \ + hash-test \ + iochannel-test \ + list-test \ + mainloop-test \ + mapping-test \ + markup-collect \ + markup-escape-test \ + module-test \ + node-test \ + onceinit \ + patterntest \ + queue-test \ + asyncqueue-test \ + qsort-test \ + relation-test \ + sequence-test \ + shell-test \ + slist-test \ + slice-test \ + slice-color \ + slice-concurrent \ + slice-threadinit \ + spawn-test \ + $(spawn_test_win32_gui) \ + thread-test \ + threadpool-test \ + tree-test \ + type-test \ + unicode-caseconv \ + unicode-encoding \ + utf8-validate \ + utf8-pointer \ + uri-test \ + regex-test + +test_scripts = run-markup-tests.sh run-collate-tests.sh run-bookmark-test.sh run-assert-msg-test.sh +test_script_support_programs = markup-test unicode-collate bookmarkfile-test +TESTS_ENVIRONMENT = srcdir=$(srcdir) \ + LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset \ + MALLOC_CHECK_=2 \ + MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) + +progs_ldadd = $(EFENCE) $(libglib) $(EFENCE) +thread_ldadd = $(libgthread) $(G_THREAD_LIBS) $(progs_ldadd) +module_ldadd = $(libgmodule) $(G_MODULE_LIBS) $(progs_ldadd) +atomic_test_LDADD = $(progs_ldadd) +base64_test_LDADD = $(progs_ldadd) +bit_test_LDADD = $(progs_ldadd) +bookmarkfile_test_LDADD = $(progs_ldadd) +checksum_test_LDADD = $(progs_ldadd) +child_test_LDADD = $(thread_ldadd) +completion_test_LDADD = $(progs_ldadd) +convert_test_LDADD = $(progs_ldadd) +date_test_LDADD = $(progs_ldadd) +dirname_test_LDADD = $(progs_ldadd) +file_test_LDADD = $(progs_ldadd) +env_test_LDADD = $(progs_ldadd) +gio_test_LDADD = $(progs_ldadd) +hash_test_LDADD = $(progs_ldadd) +iochannel_test_LDADD = $(progs_ldadd) +list_test_LDADD = $(progs_ldadd) +mainloop_test_LDADD = $(thread_ldadd) +markup_test_LDADD = $(progs_ldadd) +mapping_test_LDADD = $(progs_ldadd) +markup_escape_test_LDADD = $(progs_ldadd) +module_test_LDADD = $(module_ldadd) $(module_test_exp) +module_test_LDFLAGS = $(G_MODULE_LDFLAGS) +node_test_LDADD = $(progs_ldadd) +onceinit_LDADD = $(thread_ldadd) +queue_test_LDADD = $(progs_ldadd) +asyncqueue_test_LDADD = $(thread_ldadd) +qsort_test_LDADD = $(progs_ldadd) +relation_test_LDADD = $(progs_ldadd) +sequence_test_LDADD = $(progs_ldadd) +shell_test_LDADD = $(progs_ldadd) +slist_test_LDADD = $(progs_ldadd) +slice_test_SOURCES = slice-test.c memchunks.c +slice_test_LDADD = $(thread_ldadd) +slice_color_SOURCES = slice-color.c memchunks.c +slice_color_LDADD = $(thread_ldadd) +slice_concurrent_SOURCES = slice-concurrent.c +slice_concurrent_LDADD = $(thread_ldadd) +slice_threadinit_SOURCES = slice-threadinit.c +slice_threadinit_LDADD = $(thread_ldadd) +spawn_test_LDADD = $(progs_ldadd) +thread_test_LDADD = $(thread_ldadd) +threadpool_test_LDADD = $(thread_ldadd) +tree_test_LDADD = $(progs_ldadd) +type_test_LDADD = $(progs_ldadd) +unicode_encoding_LDADD = $(progs_ldadd) +unicode_caseconv_LDADD = $(progs_ldadd) +unicode_collate_LDADD = $(progs_ldadd) +utf8_validate_LDADD = $(progs_ldadd) +utf8_pointer_LDADD = $(progs_ldadd) +uri_test_LDADD = $(progs_ldadd) +regex_test_LDADD = $(progs_ldadd) +markup_collect_LDADD = $(progs_ldadd) +noinst_LTLIBRARIES = libmoduletestplugin_a.la libmoduletestplugin_b.la +libmoduletestplugin_a_la_SOURCES = libmoduletestplugin_a.c +libmoduletestplugin_a_la_LDFLAGS = $(G_MODULE_LDFLAGS) -avoid-version -module $(no_undefined) -rpath $(libdir) +libmoduletestplugin_a_la_LIBADD = $(G_MODULE_LIBS) $(libadd_libgmodule) $(libadd_libglib) +libmoduletestplugin_b_la_SOURCES = libmoduletestplugin_b.c +libmoduletestplugin_b_la_LDFLAGS = $(G_MODULE_LDFLAGS) -avoid-version -module $(no_undefined) -rpath $(libdir) +libmoduletestplugin_b_la_LIBADD = $(G_MODULE_LIBS) $(libadd_libgmodule) $(libadd_libglib) +DISTCLEANFILES = \ + iochannel-test-outfile \ + file-test-get-contents \ + maptest \ + mapchild \ + collate.out + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .C .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/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): +makefile.msc: $(top_builddir)/config.status $(srcdir)/makefile.msc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +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 +libmoduletestplugin_a.la: $(libmoduletestplugin_a_la_OBJECTS) $(libmoduletestplugin_a_la_DEPENDENCIES) + $(AM_V_CCLD)$(libmoduletestplugin_a_la_LINK) $(libmoduletestplugin_a_la_OBJECTS) $(libmoduletestplugin_a_la_LIBADD) $(LIBS) +libmoduletestplugin_b.la: $(libmoduletestplugin_b_la_OBJECTS) $(libmoduletestplugin_b_la_DEPENDENCIES) + $(AM_V_CCLD)$(libmoduletestplugin_b_la_LINK) $(libmoduletestplugin_b_la_OBJECTS) $(libmoduletestplugin_b_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_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 + +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 +assert-msg-test$(EXEEXT): $(assert_msg_test_OBJECTS) $(assert_msg_test_DEPENDENCIES) + @rm -f assert-msg-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(assert_msg_test_OBJECTS) $(assert_msg_test_LDADD) $(LIBS) +asyncqueue-test$(EXEEXT): $(asyncqueue_test_OBJECTS) $(asyncqueue_test_DEPENDENCIES) + @rm -f asyncqueue-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(asyncqueue_test_OBJECTS) $(asyncqueue_test_LDADD) $(LIBS) +atomic-test$(EXEEXT): $(atomic_test_OBJECTS) $(atomic_test_DEPENDENCIES) + @rm -f atomic-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(atomic_test_OBJECTS) $(atomic_test_LDADD) $(LIBS) +base64-test$(EXEEXT): $(base64_test_OBJECTS) $(base64_test_DEPENDENCIES) + @rm -f base64-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(base64_test_OBJECTS) $(base64_test_LDADD) $(LIBS) +bit-test$(EXEEXT): $(bit_test_OBJECTS) $(bit_test_DEPENDENCIES) + @rm -f bit-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(bit_test_OBJECTS) $(bit_test_LDADD) $(LIBS) +bookmarkfile-test$(EXEEXT): $(bookmarkfile_test_OBJECTS) $(bookmarkfile_test_DEPENDENCIES) + @rm -f bookmarkfile-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(bookmarkfile_test_OBJECTS) $(bookmarkfile_test_LDADD) $(LIBS) +checksum-test$(EXEEXT): $(checksum_test_OBJECTS) $(checksum_test_DEPENDENCIES) + @rm -f checksum-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(checksum_test_OBJECTS) $(checksum_test_LDADD) $(LIBS) +child-test$(EXEEXT): $(child_test_OBJECTS) $(child_test_DEPENDENCIES) + @rm -f child-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(child_test_OBJECTS) $(child_test_LDADD) $(LIBS) +completion-test$(EXEEXT): $(completion_test_OBJECTS) $(completion_test_DEPENDENCIES) + @rm -f completion-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(completion_test_OBJECTS) $(completion_test_LDADD) $(LIBS) +convert-test$(EXEEXT): $(convert_test_OBJECTS) $(convert_test_DEPENDENCIES) + @rm -f convert-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(convert_test_OBJECTS) $(convert_test_LDADD) $(LIBS) +cxx-test$(EXEEXT): $(cxx_test_OBJECTS) $(cxx_test_DEPENDENCIES) + @rm -f cxx-test$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(cxx_test_OBJECTS) $(cxx_test_LDADD) $(LIBS) +date-test$(EXEEXT): $(date_test_OBJECTS) $(date_test_DEPENDENCIES) + @rm -f date-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(date_test_OBJECTS) $(date_test_LDADD) $(LIBS) +dirname-test$(EXEEXT): $(dirname_test_OBJECTS) $(dirname_test_DEPENDENCIES) + @rm -f dirname-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dirname_test_OBJECTS) $(dirname_test_LDADD) $(LIBS) +env-test$(EXEEXT): $(env_test_OBJECTS) $(env_test_DEPENDENCIES) + @rm -f env-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(env_test_OBJECTS) $(env_test_LDADD) $(LIBS) +errorcheck-mutex-test$(EXEEXT): $(errorcheck_mutex_test_OBJECTS) $(errorcheck_mutex_test_DEPENDENCIES) + @rm -f errorcheck-mutex-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(errorcheck_mutex_test_OBJECTS) $(errorcheck_mutex_test_LDADD) $(LIBS) +file-test$(EXEEXT): $(file_test_OBJECTS) $(file_test_DEPENDENCIES) + @rm -f file-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(file_test_OBJECTS) $(file_test_LDADD) $(LIBS) +gio-test$(EXEEXT): $(gio_test_OBJECTS) $(gio_test_DEPENDENCIES) + @rm -f gio-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gio_test_OBJECTS) $(gio_test_LDADD) $(LIBS) +hash-test$(EXEEXT): $(hash_test_OBJECTS) $(hash_test_DEPENDENCIES) + @rm -f hash-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(hash_test_OBJECTS) $(hash_test_LDADD) $(LIBS) +iochannel-test$(EXEEXT): $(iochannel_test_OBJECTS) $(iochannel_test_DEPENDENCIES) + @rm -f iochannel-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(iochannel_test_OBJECTS) $(iochannel_test_LDADD) $(LIBS) +list-test$(EXEEXT): $(list_test_OBJECTS) $(list_test_DEPENDENCIES) + @rm -f list-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(list_test_OBJECTS) $(list_test_LDADD) $(LIBS) +mainloop-test$(EXEEXT): $(mainloop_test_OBJECTS) $(mainloop_test_DEPENDENCIES) + @rm -f mainloop-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(mainloop_test_OBJECTS) $(mainloop_test_LDADD) $(LIBS) +mapping-test$(EXEEXT): $(mapping_test_OBJECTS) $(mapping_test_DEPENDENCIES) + @rm -f mapping-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(mapping_test_OBJECTS) $(mapping_test_LDADD) $(LIBS) +markup-collect$(EXEEXT): $(markup_collect_OBJECTS) $(markup_collect_DEPENDENCIES) + @rm -f markup-collect$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(markup_collect_OBJECTS) $(markup_collect_LDADD) $(LIBS) +markup-escape-test$(EXEEXT): $(markup_escape_test_OBJECTS) $(markup_escape_test_DEPENDENCIES) + @rm -f markup-escape-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(markup_escape_test_OBJECTS) $(markup_escape_test_LDADD) $(LIBS) +markup-test$(EXEEXT): $(markup_test_OBJECTS) $(markup_test_DEPENDENCIES) + @rm -f markup-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(markup_test_OBJECTS) $(markup_test_LDADD) $(LIBS) +module-test$(EXEEXT): $(module_test_OBJECTS) $(module_test_DEPENDENCIES) + @rm -f module-test$(EXEEXT) + $(AM_V_CCLD)$(module_test_LINK) $(module_test_OBJECTS) $(module_test_LDADD) $(LIBS) +node-test$(EXEEXT): $(node_test_OBJECTS) $(node_test_DEPENDENCIES) + @rm -f node-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(node_test_OBJECTS) $(node_test_LDADD) $(LIBS) +onceinit$(EXEEXT): $(onceinit_OBJECTS) $(onceinit_DEPENDENCIES) + @rm -f onceinit$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(onceinit_OBJECTS) $(onceinit_LDADD) $(LIBS) +patterntest$(EXEEXT): $(patterntest_OBJECTS) $(patterntest_DEPENDENCIES) + @rm -f patterntest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(patterntest_OBJECTS) $(patterntest_LDADD) $(LIBS) +qsort-test$(EXEEXT): $(qsort_test_OBJECTS) $(qsort_test_DEPENDENCIES) + @rm -f qsort-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(qsort_test_OBJECTS) $(qsort_test_LDADD) $(LIBS) +queue-test$(EXEEXT): $(queue_test_OBJECTS) $(queue_test_DEPENDENCIES) + @rm -f queue-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(queue_test_OBJECTS) $(queue_test_LDADD) $(LIBS) +regex-test$(EXEEXT): $(regex_test_OBJECTS) $(regex_test_DEPENDENCIES) + @rm -f regex-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(regex_test_OBJECTS) $(regex_test_LDADD) $(LIBS) +relation-test$(EXEEXT): $(relation_test_OBJECTS) $(relation_test_DEPENDENCIES) + @rm -f relation-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(relation_test_OBJECTS) $(relation_test_LDADD) $(LIBS) +scannerapi$(EXEEXT): $(scannerapi_OBJECTS) $(scannerapi_DEPENDENCIES) + @rm -f scannerapi$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(scannerapi_OBJECTS) $(scannerapi_LDADD) $(LIBS) +sequence-test$(EXEEXT): $(sequence_test_OBJECTS) $(sequence_test_DEPENDENCIES) + @rm -f sequence-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(sequence_test_OBJECTS) $(sequence_test_LDADD) $(LIBS) +shell-test$(EXEEXT): $(shell_test_OBJECTS) $(shell_test_DEPENDENCIES) + @rm -f shell-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shell_test_OBJECTS) $(shell_test_LDADD) $(LIBS) +slice-color$(EXEEXT): $(slice_color_OBJECTS) $(slice_color_DEPENDENCIES) + @rm -f slice-color$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(slice_color_OBJECTS) $(slice_color_LDADD) $(LIBS) +slice-concurrent$(EXEEXT): $(slice_concurrent_OBJECTS) $(slice_concurrent_DEPENDENCIES) + @rm -f slice-concurrent$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(slice_concurrent_OBJECTS) $(slice_concurrent_LDADD) $(LIBS) +slice-test$(EXEEXT): $(slice_test_OBJECTS) $(slice_test_DEPENDENCIES) + @rm -f slice-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(slice_test_OBJECTS) $(slice_test_LDADD) $(LIBS) +slice-threadinit$(EXEEXT): $(slice_threadinit_OBJECTS) $(slice_threadinit_DEPENDENCIES) + @rm -f slice-threadinit$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(slice_threadinit_OBJECTS) $(slice_threadinit_LDADD) $(LIBS) +slist-test$(EXEEXT): $(slist_test_OBJECTS) $(slist_test_DEPENDENCIES) + @rm -f slist-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(slist_test_OBJECTS) $(slist_test_LDADD) $(LIBS) +spawn-test$(EXEEXT): $(spawn_test_OBJECTS) $(spawn_test_DEPENDENCIES) + @rm -f spawn-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(spawn_test_OBJECTS) $(spawn_test_LDADD) $(LIBS) +spawn-test-win32-gui$(EXEEXT): $(spawn_test_win32_gui_OBJECTS) $(spawn_test_win32_gui_DEPENDENCIES) + @rm -f spawn-test-win32-gui$(EXEEXT) + $(AM_V_CCLD)$(spawn_test_win32_gui_LINK) $(spawn_test_win32_gui_OBJECTS) $(spawn_test_win32_gui_LDADD) $(LIBS) +testgdate$(EXEEXT): $(testgdate_OBJECTS) $(testgdate_DEPENDENCIES) + @rm -f testgdate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testgdate_OBJECTS) $(testgdate_LDADD) $(LIBS) +testgdateparser$(EXEEXT): $(testgdateparser_OBJECTS) $(testgdateparser_DEPENDENCIES) + @rm -f testgdateparser$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testgdateparser_OBJECTS) $(testgdateparser_LDADD) $(LIBS) +testglib$(EXEEXT): $(testglib_OBJECTS) $(testglib_DEPENDENCIES) + @rm -f testglib$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testglib_OBJECTS) $(testglib_LDADD) $(LIBS) +testingbase64$(EXEEXT): $(testingbase64_OBJECTS) $(testingbase64_DEPENDENCIES) + @rm -f testingbase64$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(testingbase64_OBJECTS) $(testingbase64_LDADD) $(LIBS) +thread-test$(EXEEXT): $(thread_test_OBJECTS) $(thread_test_DEPENDENCIES) + @rm -f thread-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(thread_test_OBJECTS) $(thread_test_LDADD) $(LIBS) +threadpool-test$(EXEEXT): $(threadpool_test_OBJECTS) $(threadpool_test_DEPENDENCIES) + @rm -f threadpool-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(threadpool_test_OBJECTS) $(threadpool_test_LDADD) $(LIBS) +timeloop$(EXEEXT): $(timeloop_OBJECTS) $(timeloop_DEPENDENCIES) + @rm -f timeloop$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(timeloop_OBJECTS) $(timeloop_LDADD) $(LIBS) +timeloop-closure$(EXEEXT): $(timeloop_closure_OBJECTS) $(timeloop_closure_DEPENDENCIES) + @rm -f timeloop-closure$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(timeloop_closure_OBJECTS) $(timeloop_closure_LDADD) $(LIBS) +tree-test$(EXEEXT): $(tree_test_OBJECTS) $(tree_test_DEPENDENCIES) + @rm -f tree-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(tree_test_OBJECTS) $(tree_test_LDADD) $(LIBS) +type-test$(EXEEXT): $(type_test_OBJECTS) $(type_test_DEPENDENCIES) + @rm -f type-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(type_test_OBJECTS) $(type_test_LDADD) $(LIBS) +unicode-caseconv$(EXEEXT): $(unicode_caseconv_OBJECTS) $(unicode_caseconv_DEPENDENCIES) + @rm -f unicode-caseconv$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unicode_caseconv_OBJECTS) $(unicode_caseconv_LDADD) $(LIBS) +unicode-collate$(EXEEXT): $(unicode_collate_OBJECTS) $(unicode_collate_DEPENDENCIES) + @rm -f unicode-collate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unicode_collate_OBJECTS) $(unicode_collate_LDADD) $(LIBS) +unicode-encoding$(EXEEXT): $(unicode_encoding_OBJECTS) $(unicode_encoding_DEPENDENCIES) + @rm -f unicode-encoding$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unicode_encoding_OBJECTS) $(unicode_encoding_LDADD) $(LIBS) +unicode-normalize$(EXEEXT): $(unicode_normalize_OBJECTS) $(unicode_normalize_DEPENDENCIES) + @rm -f unicode-normalize$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(unicode_normalize_OBJECTS) $(unicode_normalize_LDADD) $(LIBS) +uri-test$(EXEEXT): $(uri_test_OBJECTS) $(uri_test_DEPENDENCIES) + @rm -f uri-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(uri_test_OBJECTS) $(uri_test_LDADD) $(LIBS) +utf8-pointer$(EXEEXT): $(utf8_pointer_OBJECTS) $(utf8_pointer_DEPENDENCIES) + @rm -f utf8-pointer$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(utf8_pointer_OBJECTS) $(utf8_pointer_LDADD) $(LIBS) +utf8-validate$(EXEEXT): $(utf8_validate_OBJECTS) $(utf8_validate_DEPENDENCIES) + @rm -f utf8-validate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(utf8_validate_OBJECTS) $(utf8_validate_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assert-msg-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asyncqueue-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomic-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bookmarkfile-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checksum-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/child-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/completion-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convert-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cxx-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/date-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errorcheck-mutex-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gio-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iochannel-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoduletestplugin_a.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmoduletestplugin_b.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainloop-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapping-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/markup-collect.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/markup-escape-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/markup-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memchunks.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/onceinit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/patterntest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qsort-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relation-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scannerapi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sequence-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shell-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slice-color.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slice-concurrent.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slice-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slice-threadinit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slist-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn-test-win32-gui.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testgdate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testgdateparser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testglib.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testingbase64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadpool-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeloop-closure.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeloop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/type-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicode-caseconv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicode-collate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicode-encoding.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicode-normalize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uri-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8-pointer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8-validate.Po@am__quote@ + +.C.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.C.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.C.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES 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-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) check-am \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-TESTS check-am check-local clean \ + clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags \ + ctags-recursive dist-hook 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 + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +@PLATFORM_WIN32_TRUE@module-test.exp: module-test.o +@PLATFORM_WIN32_TRUE@ dlltool --output-exp module-test.exp module-test.o + +dist-hook: $(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 + mkdir $(distdir)/markups; \ + for f in $(srcdir)/markups/* ; do \ + cp $$f $(distdir)/markups; done + mkdir $(distdir)/collate; \ + for f in $(srcdir)/collate/* ; do \ + if test -f $$f; then cp $$f $(distdir)/collate; fi; done + mkdir $(distdir)/bookmarks; \ + for f in $(srcdir)/bookmarks/* ; do \ + cp $$f $(distdir)/bookmarks; 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/tests/assert-msg-test.c b/tests/assert-msg-test.c new file mode 100644 index 0000000..1dbe7bc --- /dev/null +++ b/tests/assert-msg-test.c @@ -0,0 +1,8 @@ +#include + +int main() +{ + g_assert(42 < 0); + return 0; +} + diff --git a/tests/asyncqueue-test.c b/tests/asyncqueue-test.c new file mode 100644 index 0000000..eb38d9e --- /dev/null +++ b/tests/asyncqueue-test.c @@ -0,0 +1,194 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +#include + +#define DEBUG_MSG(args) +/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ +#define PRINT_MSG(args) +/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */ + +#define MAX_THREADS 50 +#define MAX_SORTS 5 /* only applies if + ASYC_QUEUE_DO_SORT is set to 1 */ +#define MAX_TIME 20 /* seconds */ +#define MIN_TIME 5 /* seconds */ + +#define SORT_QUEUE_AFTER 1 +#define SORT_QUEUE_ON_PUSH 1 /* if this is done, the + SORT_QUEUE_AFTER is ignored */ +#define QUIT_WHEN_DONE 1 + + +#if SORT_QUEUE_ON_PUSH == 1 +# undef SORT_QUEUE_AFTER +# define SORT_QUEUE_AFTER 0 +#endif + + +static GMainLoop *main_loop = NULL; +static GThreadPool *thread_pool = NULL; +static GAsyncQueue *async_queue = NULL; + + +static gint +sort_compare (gconstpointer p1, gconstpointer p2, gpointer user_data) +{ + gint32 id1; + gint32 id2; + + id1 = GPOINTER_TO_INT (p1); + id2 = GPOINTER_TO_INT (p2); + + DEBUG_MSG (("comparing #1:%d and #2:%d, returning %d", + id1, id2, (id1 > id2 ? +1 : id1 == id2 ? 0 : -1))); + + return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1); +} + +static gboolean +sort_queue (gpointer user_data) +{ + static gint sorts = 0; + static gpointer last_p = NULL; + gpointer p; + gboolean can_quit = FALSE; + gint sort_multiplier; + gint len; + gint i; + + sort_multiplier = GPOINTER_TO_INT (user_data); + + if (SORT_QUEUE_AFTER) { + PRINT_MSG (("sorting async queue...")); + g_async_queue_sort (async_queue, sort_compare, NULL); + + sorts++; + + if (sorts >= sort_multiplier) { + can_quit = TRUE; + } + + g_async_queue_sort (async_queue, sort_compare, NULL); + len = g_async_queue_length (async_queue); + + PRINT_MSG (("sorted queue (for %d/%d times, size:%d)...", sorts, MAX_SORTS, len)); + } else { + can_quit = TRUE; + len = g_async_queue_length (async_queue); + DEBUG_MSG (("printing queue (size:%d)...", len)); + } + + for (i = 0, last_p = NULL; i < len; i++) { + p = g_async_queue_pop (async_queue); + DEBUG_MSG (("item %d ---> %d", i, GPOINTER_TO_INT (p))); + + if (last_p) { + g_assert (GPOINTER_TO_INT (last_p) <= GPOINTER_TO_INT (p)); + } + + last_p = p; + } + + if (can_quit && QUIT_WHEN_DONE) { + g_main_loop_quit (main_loop); + } + + return !can_quit; +} + +static void +enter_thread (gpointer data, gpointer user_data) +{ + gint len; + gint id; + gulong ms; + + id = GPOINTER_TO_INT (data); + + ms = g_random_int_range (MIN_TIME * 1000, MAX_TIME * 1000); + DEBUG_MSG (("entered thread with id:%d, adding to queue in:%ld ms", id, ms)); + + g_usleep (ms * 1000); + + if (SORT_QUEUE_ON_PUSH) { + g_async_queue_push_sorted (async_queue, GINT_TO_POINTER (id), sort_compare, NULL); + } else { + g_async_queue_push (async_queue, GINT_TO_POINTER (id)); + } + + len = g_async_queue_length (async_queue); + + DEBUG_MSG (("thread id:%d added to async queue (size:%d)", + id, len)); +} + +int +main (int argc, char *argv[]) +{ +#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) + gint i; + gint max_threads = MAX_THREADS; + gint max_unused_threads = MAX_THREADS; + gint sort_multiplier = MAX_SORTS; + gint sort_interval; + gchar *msg; + + g_thread_init (NULL); + + PRINT_MSG (("creating async queue...")); + async_queue = g_async_queue_new (); + + g_return_val_if_fail (async_queue != NULL, EXIT_FAILURE); + + PRINT_MSG (("creating thread pool with max threads:%d, max unused threads:%d...", + max_threads, max_unused_threads)); + thread_pool = g_thread_pool_new (enter_thread, + async_queue, + max_threads, + FALSE, + NULL); + + g_return_val_if_fail (thread_pool != NULL, EXIT_FAILURE); + + g_thread_pool_set_max_unused_threads (max_unused_threads); + + PRINT_MSG (("creating threads...")); + for (i = 1; i <= max_threads; i++) { + GError *error = NULL; + + g_thread_pool_push (thread_pool, GINT_TO_POINTER (i), &error); + + g_assert_no_error (error); + } + + if (!SORT_QUEUE_AFTER) { + sort_multiplier = 1; + } + + sort_interval = ((MAX_TIME / sort_multiplier) + 2) * 1000; + g_timeout_add (sort_interval, sort_queue, GINT_TO_POINTER (sort_multiplier)); + + if (SORT_QUEUE_ON_PUSH) { + msg = "sorting when pushing into the queue, checking queue is sorted"; + } else { + msg = "sorting"; + } + + PRINT_MSG (("%s %d %s %d ms", + msg, + sort_multiplier, + sort_multiplier == 1 ? "time in" : "times, once every", + sort_interval)); + + DEBUG_MSG (("entering main event loop")); + + main_loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (main_loop); +#endif + + return EXIT_SUCCESS; +} diff --git a/tests/atomic-test.c b/tests/atomic-test.c new file mode 100644 index 0000000..c2a67e4 --- /dev/null +++ b/tests/atomic-test.c @@ -0,0 +1,63 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +/* Obviously we can't test that the operations are atomic, but we can + * at least test, that they do, what they ought to do */ + +int +main (int argc, + char *argv[]) +{ + gint i; + gint atomic = -5; + gpointer atomic_pointer = NULL; + gpointer biggest_pointer = (gpointer)((gsize)atomic_pointer - 1); + + for (i = 0; i < 15; i++) + g_atomic_int_inc (&atomic); + g_assert (atomic == 10); + for (i = 0; i < 9; i++) + g_assert (!g_atomic_int_dec_and_test (&atomic)); + g_assert (g_atomic_int_dec_and_test (&atomic)); + g_assert (atomic == 0); + + g_assert (g_atomic_int_exchange_and_add (&atomic, 5) == 0); + g_assert (atomic == 5); + + g_assert (g_atomic_int_exchange_and_add (&atomic, -10) == 5); + g_assert (atomic == -5); + + g_atomic_int_add (&atomic, 20); + g_assert (atomic == 15); + + g_atomic_int_add (&atomic, -35); + g_assert (atomic == -20); + + g_assert (atomic == g_atomic_int_get (&atomic)); + + g_assert (g_atomic_int_compare_and_exchange (&atomic, -20, 20)); + g_assert (atomic == 20); + + g_assert (!g_atomic_int_compare_and_exchange (&atomic, 42, 12)); + g_assert (atomic == 20); + + g_assert (g_atomic_int_compare_and_exchange (&atomic, 20, G_MAXINT)); + g_assert (atomic == G_MAXINT); + + g_assert (g_atomic_int_compare_and_exchange (&atomic, G_MAXINT, G_MININT)); + g_assert (atomic == G_MININT); + + g_assert (g_atomic_pointer_compare_and_exchange (&atomic_pointer, + NULL, biggest_pointer)); + g_assert (atomic_pointer == biggest_pointer); + + g_assert (atomic_pointer == g_atomic_pointer_get (&atomic_pointer)); + + g_assert (g_atomic_pointer_compare_and_exchange (&atomic_pointer, + biggest_pointer, NULL)); + g_assert (atomic_pointer == NULL); + + return 0; +} diff --git a/tests/base64-test.c b/tests/base64-test.c new file mode 100644 index 0000000..a021435 --- /dev/null +++ b/tests/base64-test.c @@ -0,0 +1,138 @@ +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#define DATA_SIZE 1024 +#define BLOCK_SIZE 32 +#define NUM_BLOCKS 32 +static guchar data[DATA_SIZE]; + +static void +test_incremental (gboolean line_break, + gint length) +{ + char *p; + gsize len, decoded_len, max, input_len, block_size; + int state, save; + guint decoder_save; + char *text; + guchar *data2; + + data2 = g_malloc (length); + text = g_malloc (length * 4); + + len = 0; + state = 0; + save = 0; + input_len = 0; + while (input_len < length) + { + block_size = MIN (BLOCK_SIZE, length - input_len); + len += g_base64_encode_step (data + input_len, block_size, + line_break, text + len, &state, &save); + input_len += block_size; + } + len += g_base64_encode_close (line_break, text + len, &state, &save); + + if (line_break) + max = length * 4 / 3 + length * 4 / (3 * 72) + 7; + else + max = length * 4 / 3 + 6; + if (len > max) + { + g_print ("Too long encoded length: got %d, expected max %d\n", + len, max); + exit (1); + } + + decoded_len = 0; + state = 0; + decoder_save = 0; + p = text; + while (len > 0) + { + int chunk_len = MIN (BLOCK_SIZE, len); + decoded_len += g_base64_decode_step (p, + chunk_len, + data2 + decoded_len, + &state, &decoder_save); + p += chunk_len; + len -= chunk_len; + } + + if (decoded_len != length) + { + g_print ("Wrong decoded length: got %d, expected %d\n", + decoded_len, length); + exit (1); + } + + if (memcmp (data, data2, length) != 0) + { + g_print ("Wrong decoded base64 data\n"); + exit (1); + } + + g_free (text); + g_free (data2); +} + +static void +test_full (gint length) +{ + char *text; + guchar *data2; + gsize len; + + text = g_base64_encode (data, length); + data2 = g_base64_decode (text, &len); + g_free (text); + + if (len != length) + { + g_print ("Wrong decoded length: got %d, expected %d\n", + len, length); + exit (1); + } + + if (memcmp (data, data2, length) != 0) + { + g_print ("Wrong decoded base64 data\n"); + exit (1); + } + + g_free (data2); +} + +int +main (int argc, char *argv[]) +{ + int i; + for (i = 0; i < DATA_SIZE; i++) + data[i] = (guchar)i; + + test_full (DATA_SIZE); + test_full (1); + test_full (2); + test_full (3); + + test_incremental (FALSE, DATA_SIZE); + test_incremental (TRUE, DATA_SIZE); + + test_incremental (FALSE, DATA_SIZE - 1); + test_incremental (TRUE, DATA_SIZE - 1); + + test_incremental (FALSE, DATA_SIZE - 2); + test_incremental (TRUE, DATA_SIZE - 2); + + test_incremental (FALSE, 1); + test_incremental (FALSE, 2); + test_incremental (FALSE, 3); + + return 0; +} diff --git a/tests/bit-test.c b/tests/bit-test.c new file mode 100644 index 0000000..230c852 --- /dev/null +++ b/tests/bit-test.c @@ -0,0 +1,145 @@ +#include + +#if defined(__GNUC__) && (__GNUC__ >= 4) +# define TEST_BUILTINS 1 +#else +# define TEST_BUILTINS 0 +#endif + +#if TEST_BUILTINS +static gint +builtin_bit_nth_lsf1 (gulong mask, gint nth_bit) +{ + if (nth_bit >= 0) + { + if (G_LIKELY (nth_bit < GLIB_SIZEOF_LONG * 8 - 1)) + mask &= -(1UL<<(nth_bit+1)); + else + mask = 0; + } + return __builtin_ffsl(mask) - 1; +} + +static gint +builtin_bit_nth_lsf2 (gulong mask, gint nth_bit) +{ + if (nth_bit >= 0) + { + if (G_LIKELY (nth_bit < GLIB_SIZEOF_LONG * 8 - 1)) + mask &= -(1UL<<(nth_bit+1)); + else + mask = 0; + } + return mask ? __builtin_ctzl(mask) : -1; +} + +static gint +builtin_bit_nth_msf (gulong mask, gint nth_bit) +{ + if (nth_bit >= 0 && nth_bit < GLIB_SIZEOF_LONG * 8) + mask &= (1UL< GLIB_SIZEOF_LONG * 8)) + nth_bit = GLIB_SIZEOF_LONG * 8; + while (nth_bit > 0) + { + nth_bit--; + if (mask & (1UL << nth_bit)) + return nth_bit; + } + return -1; +} + +static guint +naive_bit_storage (gulong number) +{ + register guint n_bits = 0; + + do + { + n_bits++; + number >>= 1; + } + while (number); + return n_bits; +} + + + +#define TEST(f1, f2, i) \ + if (f1 (i) != f2 (i)) { \ + g_error (G_STRINGIFY (f1) " (%lu) = %d; " \ + G_STRINGIFY (f2) " (%lu) = %d; ", \ + i, f1 (i), \ + i, f2 (i)); \ + return 1; \ + } +#define TEST2(f1, f2, i, n) \ + if (f1 (i, n) != f2 (i, n)) { \ + g_error (G_STRINGIFY (f1) " (%lu, %d) = %d; " \ + G_STRINGIFY (f2) " (%lu, %d) = %d; ", \ + i, n, f1 (i, n), \ + i, n, f2 (i, n)); \ + return 1; \ + } + +int +main (void) +{ + gulong i; + gint nth_bit; + + /* we loop like this: 0, -1, 1, -2, 2, -3, 3, ... */ + for (i = 0; (glong)i < 1500 ; i = -(i+((glong)i>=0))) { + +#if TEST_BUILTINS + TEST (naive_bit_storage, builtin_bit_storage, i); +#endif + TEST (naive_bit_storage, g_bit_storage, i); + + for (nth_bit = -3; nth_bit <= 2 + GLIB_SIZEOF_LONG * 8; nth_bit++) { + +#if TEST_BUILTINS + TEST2 (naive_bit_nth_lsf, builtin_bit_nth_lsf1, i, nth_bit); + TEST2 (naive_bit_nth_lsf, builtin_bit_nth_lsf2, i, nth_bit); +#endif + TEST2 (naive_bit_nth_lsf, g_bit_nth_lsf, i, nth_bit); + +#if TEST_BUILTINS + TEST2 (naive_bit_nth_msf, builtin_bit_nth_msf, i, nth_bit); +#endif + TEST2 (naive_bit_nth_msf, g_bit_nth_msf, i, nth_bit); + + } + } + + return 0; +} diff --git a/tests/bookmarkfile-test.c b/tests/bookmarkfile-test.c new file mode 100644 index 0000000..40e9a05 --- /dev/null +++ b/tests/bookmarkfile-test.c @@ -0,0 +1,188 @@ +#undef G_DISABLE_ASSERT + +#include +#include +#include +#include +#include +#include + +#define TEST_URI_0 "file:///abc/defgh/ijklmnopqrstuvwxyz" +#define TEST_URI_1 "file:///test/uri/1" +#define TEST_URI_2 "file:///test/uri/2" + +#define TEST_MIME "text/plain" + +#define TEST_APP_NAME "bookmarkfile-test" +#define TEST_APP_EXEC "bookmarkfile-test %f" + +static gboolean +test_load (GBookmarkFile *bookmark, + const gchar *filename) +{ + GError *error = NULL; + gboolean res; + + res = g_bookmark_file_load_from_file (bookmark, filename, &error); + if (error) + { + g_print ("Load error: %s\n", error->message); + g_error_free (error); + } + + return res; +} + +static gboolean +test_query (GBookmarkFile *bookmark) +{ + gint size; + gchar **uris; + gsize uris_len, i; + gboolean res = TRUE; + + size = g_bookmark_file_get_size (bookmark); + uris = g_bookmark_file_get_uris (bookmark, &uris_len); + + if (uris_len != size) + { + g_print ("URI/size mismatch: URI count is %d (should be %d)\n", uris_len, size); + + res = FALSE; + } + + for (i = 0; i < uris_len; i++) + if (!g_bookmark_file_has_item (bookmark, uris[i])) + { + g_print ("URI/bookmark mismatch: bookmark for '%s' does not exist\n", uris[i]); + + res = FALSE; + } + + g_strfreev (uris); + + return res; +} + +static gboolean +test_modify (GBookmarkFile *bookmark) +{ + gchar *text; + guint count; + time_t stamp; + GError *error = NULL; + + g_print ("\t=> check global title/description..."); + g_bookmark_file_set_title (bookmark, NULL, "a file"); + g_bookmark_file_set_description (bookmark, NULL, "a bookmark file"); + + text = g_bookmark_file_get_title (bookmark, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (text, ==, "a file"); + g_free (text); + + text = g_bookmark_file_get_description (bookmark, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (text, ==, "a bookmark file"); + g_free (text); + g_print ("ok\n"); + + g_print ("\t=> check bookmark title/description..."); + g_bookmark_file_set_title (bookmark, TEST_URI_0, "a title"); + g_bookmark_file_set_description (bookmark, TEST_URI_0, "a description"); + + text = g_bookmark_file_get_title (bookmark, TEST_URI_0, &error); + g_assert_no_error (error); + g_assert_cmpstr (text, ==, "a title"); + g_free (text); + g_print ("ok\n"); + + g_print ("\t=> check non existing bookmark..."); + g_bookmark_file_get_description (bookmark, TEST_URI_1, &error); + g_assert_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND); + g_clear_error (&error); + g_print ("ok\n"); + + g_print ("\t=> check application..."); + g_bookmark_file_set_mime_type (bookmark, TEST_URI_0, TEST_MIME); + g_bookmark_file_add_application (bookmark, TEST_URI_0, + TEST_APP_NAME, + TEST_APP_EXEC); + g_assert (g_bookmark_file_has_application (bookmark, TEST_URI_0, TEST_APP_NAME, NULL) == TRUE); + g_bookmark_file_get_app_info (bookmark, TEST_URI_0, TEST_APP_NAME, + &text, + &count, + &stamp, + &error); + g_assert_no_error (error); + g_assert (count == 1); + g_assert (stamp == g_bookmark_file_get_modified (bookmark, TEST_URI_0, NULL)); + g_free (text); + + g_bookmark_file_get_app_info (bookmark, TEST_URI_0, "fail", + &text, + &count, + &stamp, + &error); + g_assert_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_APP_NOT_REGISTERED); + g_clear_error (&error); + g_print ("ok\n"); + + g_print ("\t=> check groups..."); + g_bookmark_file_add_group (bookmark, TEST_URI_1, "Test"); + g_assert (g_bookmark_file_has_group (bookmark, TEST_URI_1, "Test", NULL) == TRUE); + g_assert (g_bookmark_file_has_group (bookmark, TEST_URI_1, "Fail", NULL) == FALSE); + g_print ("ok\n"); + + g_print ("\t=> check remove..."); + g_assert (g_bookmark_file_remove_item (bookmark, TEST_URI_1, &error) == TRUE); + g_assert_no_error (error); + g_assert (g_bookmark_file_remove_item (bookmark, TEST_URI_1, &error) == FALSE); + g_assert_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND); + g_clear_error (&error); + g_print ("ok\n"); + + return TRUE; +} + +static gint +test_file (const gchar *filename) +{ + GBookmarkFile *bookmark_file; + gboolean success; + + g_return_val_if_fail (filename != NULL, 1); + + g_print ("checking GBookmarkFile...\n"); + + bookmark_file = g_bookmark_file_new (); + g_assert (bookmark_file != NULL); + + success = test_load (bookmark_file, filename); + + if (success) + { + success = test_query (bookmark_file); + success = test_modify (bookmark_file); + } + + g_bookmark_file_free (bookmark_file); + + g_print ("ok\n"); + + return (success == TRUE ? 0 : 1); +} + +int +main (int argc, + char *argv[]) +{ + if (argc > 1) + return test_file (argv[1]); + else + { + fprintf (stderr, "Usage: bookmarkfile-test \n"); + + return 1; + } +} diff --git a/tests/bookmarks/fail-01.xbel b/tests/bookmarks/fail-01.xbel new file mode 100644 index 0000000..e69de29 diff --git a/tests/bookmarks/fail-02.xbel b/tests/bookmarks/fail-02.xbel new file mode 100644 index 0000000..39f0094 --- /dev/null +++ b/tests/bookmarks/fail-02.xbel @@ -0,0 +1,2 @@ + + diff --git a/tests/bookmarks/fail-03.xbel b/tests/bookmarks/fail-03.xbel new file mode 100644 index 0000000..563dd54 --- /dev/null +++ b/tests/bookmarks/fail-03.xbel @@ -0,0 +1,18 @@ + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/fail-04.xbel b/tests/bookmarks/fail-04.xbel new file mode 100644 index 0000000..86f1e90 --- /dev/null +++ b/tests/bookmarks/fail-04.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/fail-05.xbel b/tests/bookmarks/fail-05.xbel new file mode 100644 index 0000000..355f172 --- /dev/null +++ b/tests/bookmarks/fail-05.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file & containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/fail-06.xbel b/tests/bookmarks/fail-06.xbel new file mode 100644 index 0000000..d1e288b --- /dev/null +++ b/tests/bookmarks/fail-06.xbel @@ -0,0 +1,19 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + diff --git a/tests/bookmarks/fail-07.xbel b/tests/bookmarks/fail-07.xbel new file mode 100644 index 0000000..8e24c64 --- /dev/null +++ b/tests/bookmarks/fail-07.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/fail-08.xbel b/tests/bookmarks/fail-08.xbel new file mode 100644 index 0000000..d26f752 --- /dev/null +++ b/tests/bookmarks/fail-08.xbel @@ -0,0 +1,18 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + diff --git a/tests/bookmarks/fail-09.xbel b/tests/bookmarks/fail-09.xbel new file mode 100644 index 0000000..5e1ce64 --- /dev/null +++ b/tests/bookmarks/fail-09.xbel @@ -0,0 +1,20 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + diff --git a/tests/bookmarks/fail-10.xbel b/tests/bookmarks/fail-10.xbel new file mode 100644 index 0000000..f4eef12 --- /dev/null +++ b/tests/bookmarks/fail-10.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/fail-11.xbel b/tests/bookmarks/fail-11.xbel new file mode 100644 index 0000000..520693b --- /dev/null +++ b/tests/bookmarks/fail-11.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + & + + + + + + + + + + diff --git a/tests/bookmarks/fail-12.xbel b/tests/bookmarks/fail-12.xbel new file mode 100644 index 0000000..9ba280e --- /dev/null +++ b/tests/bookmarks/fail-12.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + + diff --git a/tests/bookmarks/fail-13.xbel b/tests/bookmarks/fail-13.xbel new file mode 100644 index 0000000..cdd1aff --- /dev/null +++ b/tests/bookmarks/fail-13.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + + diff --git a/tests/bookmarks/fail-14.xbel b/tests/bookmarks/fail-14.xbel new file mode 100644 index 0000000..2161632 --- /dev/null +++ b/tests/bookmarks/fail-14.xbel @@ -0,0 +1,24 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + Test + + + + + diff --git a/tests/bookmarks/fail-15.xbel b/tests/bookmarks/fail-15.xbel new file mode 100644 index 0000000..9a2ac12 --- /dev/null +++ b/tests/bookmarks/fail-15.xbel @@ -0,0 +1,23 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + Test + + + + diff --git a/tests/bookmarks/fail-16.xbel b/tests/bookmarks/fail-16.xbel new file mode 100644 index 0000000..18f55b3 --- /dev/null +++ b/tests/bookmarks/fail-16.xbel @@ -0,0 +1,24 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + Test + + + + + diff --git a/tests/bookmarks/fail-17.xbel b/tests/bookmarks/fail-17.xbel new file mode 100644 index 0000000..9ad97bd --- /dev/null +++ b/tests/bookmarks/fail-17.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + + diff --git a/tests/bookmarks/valid-01.xbel b/tests/bookmarks/valid-01.xbel new file mode 100644 index 0000000..6ab98ba --- /dev/null +++ b/tests/bookmarks/valid-01.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/valid-02.xbel b/tests/bookmarks/valid-02.xbel new file mode 100644 index 0000000..85a84a0 --- /dev/null +++ b/tests/bookmarks/valid-02.xbel @@ -0,0 +1,15 @@ + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/bookmarks/valid-03.xbel b/tests/bookmarks/valid-03.xbel new file mode 100644 index 0000000..32f431d --- /dev/null +++ b/tests/bookmarks/valid-03.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/tests/casefold.txt b/tests/casefold.txt new file mode 100644 index 0000000..a5add1e --- /dev/null +++ b/tests/casefold.txt @@ -0,0 +1,1120 @@ +# Test cases generated from Unicode 5.1 data +# by gen-casefold-test.pl. Do not edit. +# +# Some special hand crafted tests +# +AaBbCc@@ aabbcc@@ +# +# Now the automatic tests +# +A a +B b +C c +D d +E e +F f +G g +H h +I i +J j +K k +L l +M m +N n +O o +P p +Q q +R r +S s +T t +U u +V v +W w +X x +Y y +Z z +µ μ +À à +Á á + â +à ã +Ä ä +Šå +Æ æ +Ç ç +È è +É é +Ê ê +Ë ë +Ì ì +Í í +Î î +Ï ï +Ð ð +Ñ ñ +Ò ò +Ó ó +Ô ô +Õ õ +Ö ö +Ø ø +Ù ù +Ú ú +Û û +Ü ü +Ý ý +Þ þ +ß ss +Ā ā +Ă ă +Ą ą +Ć ć +Ĉ ĉ +Ċ ċ +Č č +Ď ď +Đ đ +Ē ē +Ĕ ĕ +Ė ė +Ę ę +Ě ě +Ĝ ĝ +Ğ ğ +Ä  Ä¡ +Ä¢ Ä£ +Ĥ Ä¥ +Ħ ħ +Ĩ Ä© +Ī Ä« +Ĭ Ä­ +Ä® į +Ä° i̇ +IJ ij +Ä´ ĵ +Ķ Ä· +Ĺ ĺ +Ä» ļ +Ľ ľ +Ä¿ ŀ +Ł ł +Ń ń +Ņ ņ +Ň ň +ʼn ʼn +Ŋ ŋ +Ō ō +Ŏ ŏ +Ő ő +Œ œ +Ŕ ŕ +Ŗ ŗ +Ř ř +Ś ś +Ŝ ŝ +Ş ş +Å  Å¡ +Å¢ Å£ +Ť Å¥ +Ŧ ŧ +Ũ Å© +Ū Å« +Ŭ Å­ +Å® ů +Å° ű +Ų ų +Å´ ŵ +Ŷ Å· +Ÿ ÿ +Ź ź +Å» ż +Ž ž +Å¿ s +Ɓ ɓ +Ƃ ƃ +Ƅ ƅ +Ɔ ɔ +Ƈ ƈ +Ɖ ɖ +Ɗ ɗ +Ƌ ƌ +Ǝ ǝ +Ə ə +Ɛ ɛ +Ƒ ƒ +Ɠ É  +Ɣ É£ +Ɩ É© +Ɨ ɨ +Ƙ ƙ +Ɯ ɯ +Ɲ ɲ +Ɵ ɵ +Æ  Æ¡ +Æ¢ Æ£ +Ƥ Æ¥ +Ʀ ʀ +Ƨ ƨ +Æ© ʃ +Ƭ Æ­ +Æ® ʈ +Ư Æ° +Ʊ ʊ +Ʋ ʋ +Ƴ Æ´ +Ƶ ƶ +Æ· ʒ +Ƹ ƹ +Ƽ ƽ +DŽ dž +Dž dž +LJ lj +Lj lj +NJ nj +Nj nj +Ǎ ǎ +Ǐ ǐ +Ǒ ǒ +Ǔ ǔ +Ǖ ǖ +Ǘ ǘ +Ǚ ǚ +Ǜ ǜ +Ǟ ǟ +Ç  Ç¡ +Ç¢ Ç£ +Ǥ Ç¥ +Ǧ ǧ +Ǩ Ç© +Ǫ Ç« +Ǭ Ç­ +Ç® ǯ +Ç° ǰ +DZ dz +Dz dz +Ç´ ǵ +Ƕ ƕ +Ç· Æ¿ +Ǹ ǹ +Ǻ Ç» +Ǽ ǽ +Ǿ Ç¿ +Ȁ ȁ +Ȃ ȃ +Ȅ ȅ +Ȇ ȇ +Ȉ ȉ +Ȋ ȋ +Ȍ ȍ +Ȏ ȏ +Ȑ ȑ +Ȓ ȓ +Ȕ ȕ +Ȗ ȗ +Ș ș +Ț ț +Ȝ ȝ +Ȟ ȟ +È  ƞ +È¢ È£ +Ȥ È¥ +Ȧ ȧ +Ȩ È© +Ȫ È« +Ȭ È­ +È® ȯ +È° ȱ +Ȳ ȳ +Ⱥ â±¥ +È» ȼ +Ƚ ƚ +Ⱦ ⱦ +Ɂ ɂ +Ƀ ƀ +Ʉ ʉ +Ʌ ʌ +Ɇ ɇ +Ɉ ɉ +Ɋ ɋ +Ɍ ɍ +Ɏ ɏ +ͅ ι +Í° ͱ +Ͳ ͳ +Ͷ Í· +Ά ά +Έ έ +Ή ή +Ί ί +Ό ό +Ύ ύ +Ώ ώ +ΐ ΐ +Α α +Β β +Γ γ +Δ δ +Ε ε +Ζ ζ +Η η +Θ θ +Ι ι +Κ κ +Λ λ +Μ μ +Ν ν +Ξ ξ +Ο ο +Π π +Ρ ρ +Σ σ +Τ τ +Î¥ υ +Φ φ +Χ χ +Ψ ψ +Ω ω +Ϊ ϊ +Ϋ ϋ +ΰ ΰ +ς σ +Ϗ ϗ +ϐ β +ϑ θ +ϕ φ +ϖ π +Ϙ ϙ +Ϛ ϛ +Ϝ ϝ +Ϟ ϟ +Ï  Ï¡ +Ï¢ Ï£ +Ϥ Ï¥ +Ϧ ϧ +Ϩ Ï© +Ϫ Ï« +Ϭ Ï­ +Ï® ϯ +Ï° κ +ϱ ρ +Ï´ θ +ϵ ε +Ï· ϸ +Ϲ ϲ +Ϻ Ï» +Ͻ Í» +Ͼ ͼ +Ï¿ ͽ +Ѐ ѐ +Ё ё +Ђ ђ +Ѓ ѓ +Є є +Ѕ ѕ +І і +Ї ї +Ј ј +Љ љ +Њ њ +Ћ ћ +Ќ ќ +Ѝ ѝ +Ў ў +Џ џ +А а +Б б +В в +Г г +Д д +Е е +Ж ж +З з +И и +Й й +К к +Л л +М м +Н н +О о +П п +Р р +С с +Т т +У у +Ф ф +Ð¥ х +Ц ц +Ч ч +Ш ш +Щ щ +Ъ ъ +Ы ы +Ь ь +Э э +Ю ю +Я я +Ñ  Ñ¡ +Ñ¢ Ñ£ +Ѥ Ñ¥ +Ѧ ѧ +Ѩ Ñ© +Ѫ Ñ« +Ѭ Ñ­ +Ñ® ѯ +Ñ° ѱ +Ѳ ѳ +Ñ´ ѵ +Ѷ Ñ· +Ѹ ѹ +Ѻ Ñ» +Ѽ ѽ +Ѿ Ñ¿ +Ҁ ҁ +Ҋ ҋ +Ҍ ҍ +Ҏ ҏ +Ґ ґ +Ғ ғ +Ҕ ҕ +Җ җ +Ҙ ҙ +Қ қ +Ҝ ҝ +Ҟ ҟ +Ò  Ò¡ +Ò¢ Ò£ +Ò¤ Ò¥ +Ò¦ Ò§ +Ò¨ Ò© +Òª Ò« +Ò¬ Ò­ +Ò® Ò¯ +Ò° Ò± +Ò² Ò³ +Ò´ Òµ +Ò¶ Ò· +Ò¸ Ò¹ +Òº Ò» +Ò¼ Ò½ +Ò¾ Ò¿ +Ӏ ӏ +Ӂ ӂ +Ӄ ӄ +Ӆ ӆ +Ӈ ӈ +Ӊ ӊ +Ӌ ӌ +Ӎ ӎ +Ӑ ӑ +Ӓ ӓ +Ӕ ӕ +Ӗ ӗ +Ә ә +Ӛ ӛ +Ӝ ӝ +Ӟ ӟ +Ó  Ó¡ +Ó¢ Ó£ +Ó¤ Ó¥ +Ó¦ Ó§ +Ó¨ Ó© +Óª Ó« +Ó¬ Ó­ +Ó® Ó¯ +Ó° Ó± +Ó² Ó³ +Ó´ Óµ +Ó¶ Ó· +Ó¸ Ó¹ +Óº Ó» +Ó¼ Ó½ +Ó¾ Ó¿ +Ԁ ԁ +Ԃ ԃ +Ԅ ԅ +Ԇ ԇ +Ԉ ԉ +Ԋ ԋ +Ԍ ԍ +Ԏ ԏ +Ԑ ԑ +Ԓ ԓ +Ԕ ԕ +Ԗ ԗ +Ԙ ԙ +Ԛ ԛ +Ԝ ԝ +Ԟ ԟ +Ô  Ô¡ +Ô¢ Ô£ +Ô± Õ¡ +Ô² Õ¢ +Ô³ Õ£ +Ô´ Õ¤ +Ôµ Õ¥ +Ô¶ Õ¦ +Ô· Õ§ +Ô¸ Õ¨ +Ô¹ Õ© +Ôº Õª +Ô» Õ« +Ô¼ Õ¬ +Ô½ Õ­ +Ô¾ Õ® +Ô¿ Õ¯ +Հ Õ° +Ձ Õ± +Ղ Õ² +Ճ Õ³ +Մ Õ´ +Յ Õµ +Ն Õ¶ +Շ Õ· +Ո Õ¸ +Չ Õ¹ +Պ Õº +Ջ Õ» +Ռ Õ¼ +Ս Õ½ +Վ Õ¾ +Տ Õ¿ +Ր ր +Ց ց +Ւ ւ +Փ փ +Ք ք +Օ օ +Ֆ ֆ +և եւ +Ⴀ ⴀ +Ⴁ ⴁ +Ⴂ ⴂ +Ⴃ ⴃ +Ⴄ ⴄ +Ⴅ ⴅ +Ⴆ ⴆ +Ⴇ ⴇ +Ⴈ ⴈ +Ⴉ ⴉ +Ⴊ ⴊ +Ⴋ ⴋ +Ⴌ ⴌ +Ⴍ ⴍ +Ⴎ ⴎ +Ⴏ ⴏ +Ⴐ ⴐ +Ⴑ ⴑ +Ⴒ ⴒ +Ⴓ ⴓ +Ⴔ ⴔ +Ⴕ ⴕ +Ⴖ ⴖ +Ⴗ ⴗ +Ⴘ ⴘ +Ⴙ ⴙ +Ⴚ ⴚ +Ⴛ ⴛ +Ⴜ ⴜ +Ⴝ ⴝ +Ⴞ ⴞ +Ⴟ ⴟ +Ⴠ â´  +Ⴡ â´¡ +Ⴢ â´¢ +Ⴣ â´£ +Ⴤ â´¤ +Ⴥ â´¥ +Ḁ ḁ +Ḃ ḃ +Ḅ ḅ +Ḇ ḇ +Ḉ ḉ +Ḋ ḋ +Ḍ ḍ +Ḏ ḏ +Ḑ ḑ +Ḓ ḓ +Ḕ ḕ +Ḗ ḗ +Ḙ ḙ +Ḛ ḛ +Ḝ ḝ +Ḟ ḟ +Ḡ ḡ +Ḣ ḣ +Ḥ ḥ +Ḧ ḧ +Ḩ ḩ +Ḫ ḫ +Ḭ ḭ +Ḯ ḯ +Ḱ ḱ +Ḳ ḳ +Ḵ ḵ +Ḷ ḷ +Ḹ ḹ +Ḻ ḻ +Ḽ ḽ +Ḿ ḿ +Ṁ ṁ +Ṃ ṃ +Ṅ ṅ +Ṇ ṇ +Ṉ ṉ +Ṋ ṋ +Ṍ ṍ +Ṏ ṏ +Ṑ ṑ +Ṓ ṓ +Ṕ ṕ +Ṗ ṗ +Ṙ ṙ +Ṛ ṛ +Ṝ ṝ +Ṟ ṟ +á¹  ṡ +á¹¢ á¹£ +Ṥ á¹¥ +Ṧ ṧ +Ṩ ṩ +Ṫ ṫ +Ṭ á¹­ +á¹® ṯ +á¹° á¹± +á¹² á¹³ +á¹´ á¹µ +Ṷ á¹· +Ṹ á¹¹ +Ṻ á¹» +á¹¼ á¹½ +á¹¾ ṿ +Ẁ ẁ +Ẃ ẃ +Ẅ ẅ +Ẇ ẇ +Ẉ ẉ +Ẋ ẋ +Ẍ ẍ +Ẏ ẏ +Ẑ ẑ +Ẓ ẓ +Ẕ ẕ +ẖ ẖ +ẗ ẗ +ẘ ẘ +ẙ ẙ +ẚ aʾ +ẛ ṡ +ẞ ss +Ạ ạ +Ả ả +Ấ ấ +Ầ ầ +Ẩ ẩ +Ẫ ẫ +Ậ ậ +Ắ ắ +Ằ ằ +Ẳ ẳ +Ẵ ẵ +Ặ ặ +Ẹ ẹ +Ẻ ẻ +Ẽ ẽ +Ế ế +Ề ề +Ể ể +Ễ ễ +Ệ ệ +Ỉ ỉ +Ị ị +Ọ ọ +Ỏ ỏ +Ố ố +Ồ ồ +Ổ ổ +Ỗ ỗ +Ộ ộ +Ớ ớ +Ờ ờ +Ở ở +á»  ỡ +Ợ ợ +Ụ ụ +Ủ ủ +Ứ ứ +Ừ ừ +Ử á»­ +á»® ữ +á»° á»± +Ỳ ỳ +á»´ ỵ +Ỷ á»· +Ỹ ỹ +Ỻ á»» +Ỽ ỽ +Ỿ ỿ +Ἀ ἀ +Ἁ ἁ +Ἂ ἂ +Ἃ ἃ +Ἄ ἄ +Ἅ ἅ +Ἆ ἆ +Ἇ ἇ +Ἐ ἐ +Ἑ ἑ +Ἒ ἒ +Ἓ ἓ +Ἔ ἔ +Ἕ ἕ +Ἠ á¼  +Ἡ ἡ +Ἢ á¼¢ +Ἣ á¼£ +Ἤ ἤ +á¼­ á¼¥ +á¼® ἦ +Ἧ ἧ +Ἰ á¼° +á¼¹ á¼± +Ἲ á¼² +á¼» á¼³ +á¼¼ á¼´ +á¼½ á¼µ +á¼¾ ἶ +Ἷ á¼· +Ὀ ὀ +Ὁ ὁ +Ὂ ὂ +Ὃ ὃ +Ὄ ὄ +Ὅ ὅ +ὐ ὐ +ὒ ὒ +ὔ ὔ +ὖ ὖ +Ὑ ὑ +Ὓ ὓ +Ὕ ὕ +Ὗ ὗ +Ὠ á½  +Ὡ ὡ +Ὢ á½¢ +Ὣ á½£ +Ὤ ὤ +á½­ á½¥ +á½® ὦ +Ὧ ὧ +ᾀ ἀι +ᾁ ἁι +ᾂ ἂι +ᾃ ἃι +ᾄ ἄι +ᾅ ἅι +ᾆ ἆι +ᾇ ἇι +ᾈ ἀι +ᾉ ἁι +ᾊ ἂι +ᾋ ἃι +ᾌ ἄι +ᾍ ἅι +ᾎ ἆι +ᾏ ἇι +ᾐ ἠι +ᾑ ἡι +ᾒ ἢι +ᾓ ἣι +ᾔ ἤι +ᾕ ἥι +ᾖ ἦι +ᾗ ἧι +ᾘ ἠι +ᾙ ἡι +ᾚ ἢι +ᾛ ἣι +ᾜ ἤι +ᾝ ἥι +ᾞ ἦι +ᾟ ἧι +á¾  ὠι +ᾡ ὡι +á¾¢ ὢι +á¾£ ὣι +ᾤ ὤι +á¾¥ ὥι +ᾦ ὦι +ᾧ ὧι +ᾨ ὠι +ᾩ ὡι +ᾪ ὢι +ᾫ ὣι +ᾬ ὤι +á¾­ ὥι +á¾® ὦι +ᾯ ὧι +á¾² ὰι +á¾³ αι +á¾´ άι +ᾶ ᾶ +á¾· ᾶι +Ᾰ á¾° +á¾¹ á¾± +Ὰ á½° +á¾» á½± +á¾¼ αι +á¾¾ ι +ῂ ὴι +ῃ ηι +ῄ ήι +ῆ ῆ +ῇ ῆι +Ὲ á½² +Έ á½³ +Ὴ á½´ +Ή á½µ +ῌ ηι +ῒ ῒ +ΐ ΐ +ῖ ῖ +ῗ ῗ +Ῐ ῐ +Ῑ ῑ +Ὶ ὶ +Ί á½· +á¿¢ ῢ +á¿£ ΰ +ῤ ῤ +ῦ ῦ +ῧ ῧ +Ῠ á¿  +á¿© á¿¡ +Ὺ ὺ +á¿« á½» +Ῥ á¿¥ +ῲ ὼι +ῳ ωι +á¿´ ώι +ῶ ῶ +á¿· ῶι +Ὸ ὸ +Ό á½¹ +Ὼ á½¼ +á¿» á½½ +ῼ ωι +Ω ω +K k +Šå +Ⅎ ⅎ +Ⅰ ⅰ +Ⅱ ⅱ +Ⅲ ⅲ +Ⅳ ⅳ +Ⅴ ⅴ +Ⅵ ⅵ +Ⅶ ⅶ +Ⅷ ⅷ +Ⅸ ⅸ +Ⅹ ⅹ +Ⅺ ⅺ +Ⅻ ⅻ +Ⅼ ⅼ +Ⅽ ⅽ +Ⅾ ⅾ +Ⅿ ⅿ +Ↄ ↄ +Ⓐ ⓐ +Ⓑ ⓑ +Ⓒ ⓒ +Ⓓ ⓓ +Ⓔ ⓔ +Ⓕ ⓕ +Ⓖ ⓖ +Ⓗ ⓗ +Ⓘ ⓘ +Ⓙ ⓙ +Ⓚ ⓚ +Ⓛ ⓛ +Ⓜ ⓜ +Ⓝ ⓝ +Ⓞ ⓞ +Ⓟ ⓟ +Ⓠ ⓠ +Ⓡ ⓡ +Ⓢ ⓢ +Ⓣ ⓣ +Ⓤ ⓤ +Ⓥ ⓥ +Ⓦ ⓦ +Ⓧ ⓧ +Ⓨ ⓨ +Ⓩ ⓩ +Ⰰ â°° +Ⰱ â°± +Ⰲ â°² +Ⰳ â°³ +Ⰴ â°´ +Ⰵ â°µ +Ⰶ â°¶ +Ⰷ â°· +Ⰸ â°¸ +Ⰹ â°¹ +Ⰺ â°º +Ⰻ â°» +Ⰼ â°¼ +Ⰽ â°½ +Ⰾ â°¾ +Ⰿ â°¿ +Ⱀ ⱀ +Ⱁ ⱁ +Ⱂ ⱂ +Ⱃ ⱃ +Ⱄ ⱄ +Ⱅ ⱅ +Ⱆ ⱆ +Ⱇ ⱇ +Ⱈ ⱈ +Ⱉ ⱉ +Ⱊ ⱊ +Ⱋ ⱋ +Ⱌ ⱌ +Ⱍ ⱍ +Ⱎ ⱎ +Ⱏ ⱏ +â°  ⱐ +â°¡ ⱑ +â°¢ ⱒ +â°£ ⱓ +â°¤ ⱔ +â°¥ ⱕ +â°¦ ⱖ +â°§ ⱗ +â°¨ ⱘ +â°© ⱙ +â°ª ⱚ +â°« ⱛ +â°¬ ⱜ +â°­ ⱝ +â°® ⱞ +â±  ⱡ +â±¢ É« +â±£ áµ½ +Ɽ ɽ +Ⱨ ⱨ +Ⱪ ⱪ +Ⱬ ⱬ +â±­ ɑ +â±® ɱ +Ɐ ɐ +â±² â±³ +â±µ ⱶ +Ⲁ ⲁ +Ⲃ ⲃ +Ⲅ ⲅ +Ⲇ ⲇ +Ⲉ ⲉ +Ⲋ ⲋ +Ⲍ ⲍ +Ⲏ ⲏ +Ⲑ ⲑ +Ⲓ ⲓ +Ⲕ ⲕ +Ⲗ ⲗ +Ⲙ ⲙ +Ⲛ ⲛ +Ⲝ ⲝ +Ⲟ ⲟ +â²  ⲡ +â²¢ â²£ +Ⲥ â²¥ +Ⲧ ⲧ +Ⲩ ⲩ +Ⲫ ⲫ +Ⲭ â²­ +â²® ⲯ +â²° â²± +â²² â²³ +â²´ â²µ +Ⲷ â²· +Ⲹ â²¹ +Ⲻ â²» +â²¼ â²½ +â²¾ ⲿ +Ⳁ ⳁ +Ⳃ ⳃ +Ⳅ ⳅ +Ⳇ ⳇ +Ⳉ ⳉ +Ⳋ ⳋ +Ⳍ ⳍ +Ⳏ ⳏ +Ⳑ ⳑ +Ⳓ ⳓ +Ⳕ ⳕ +Ⳗ ⳗ +Ⳙ ⳙ +Ⳛ ⳛ +Ⳝ ⳝ +Ⳟ ⳟ +â³  ⳡ +â³¢ â³£ +Ꙁ ꙁ +Ꙃ ꙃ +Ꙅ ꙅ +Ꙇ ꙇ +Ꙉ ꙉ +Ꙋ ꙋ +Ꙍ ꙍ +Ꙏ ꙏ +Ꙑ ꙑ +Ꙓ ꙓ +Ꙕ ꙕ +Ꙗ ꙗ +Ꙙ ꙙ +Ꙛ ꙛ +Ꙝ ꙝ +Ꙟ ꙟ +Ꙣ ꙣ +Ꙥ ꙥ +Ꙧ ꙧ +Ꙩ ꙩ +Ꙫ ꙫ +Ꙭ ꙭ +Ꚁ ꚁ +Ꚃ ꚃ +Ꚅ ꚅ +Ꚇ ꚇ +Ꚉ ꚉ +Ꚋ ꚋ +Ꚍ ꚍ +Ꚏ ꚏ +Ꚑ ꚑ +Ꚓ ꚓ +Ꚕ ꚕ +Ꚗ ꚗ +Ꜣ ꜣ +Ꜥ ꜥ +Ꜧ ꜧ +Ꜩ ꜩ +Ꜫ ꜫ +Ꜭ ꜭ +Ꜯ ꜯ +Ꜳ ꜳ +Ꜵ ꜵ +Ꜷ ꜷ +Ꜹ ꜹ +Ꜻ ꜻ +Ꜽ ꜽ +Ꜿ ꜿ +Ꝁ ꝁ +Ꝃ ꝃ +Ꝅ ꝅ +Ꝇ ꝇ +Ꝉ ꝉ +Ꝋ ꝋ +Ꝍ ꝍ +Ꝏ ꝏ +Ꝑ ꝑ +Ꝓ ꝓ +Ꝕ ꝕ +Ꝗ ꝗ +Ꝙ ꝙ +Ꝛ ꝛ +Ꝝ ꝝ +Ꝟ ꝟ +Ꝡ ꝡ +Ꝣ ꝣ +Ꝥ ꝥ +Ꝧ ꝧ +Ꝩ ꝩ +Ꝫ ꝫ +Ꝭ ꝭ +Ꝯ ꝯ +Ꝺ ꝺ +Ꝼ ꝼ +Ᵹ áµ¹ +Ꝿ ꝿ +Ꞁ ꞁ +Ꞃ ꞃ +Ꞅ ꞅ +Ꞇ ꞇ +Ꞌ ꞌ +ff ff +fi fi +fl fl +ffi ffi +ffl ffl +ſt st +st st +ﬓ Õ´Õ¶ +ﬔ Õ´Õ¥ +ﬕ Õ´Õ« +ﬖ Õ¾Õ¶ +ﬗ Õ´Õ­ +A a +ï¼¢ b +ï¼£ c +D d +ï¼¥ e +F f +G g +H h +I i +J j +K k +L l +ï¼­ m +ï¼® n +O o +ï¼° p +ï¼± q +ï¼² r +ï¼³ s +ï¼´ t +ï¼µ u +V v +ï¼· w +X x +ï¼¹ y +Z z +𐐀 𐐨 +𐐁 𐐩 +𐐂 𐐪 +𐐃 𐐫 +𐐄 𐐬 +𐐅 𐐭 +𐐆 𐐮 +𐐇 𐐯 +𐐈 𐐰 +𐐉 𐐱 +𐐊 𐐲 +𐐋 𐐳 +𐐌 𐐴 +𐐍 𐐵 +𐐎 𐐶 +𐐏 𐐷 +𐐐 𐐸 +𐐑 𐐹 +𐐒 𐐺 +𐐓 𐐻 +𐐔 𐐼 +𐐕 𐐽 +𐐖 𐐾 +𐐗 𐐿 +𐐘 𐑀 +𐐙 𐑁 +𐐚 𐑂 +𐐛 𐑃 +𐐜 𐑄 +𐐝 𐑅 +𐐞 𐑆 +𐐟 𐑇 +𐐠 𐑈 +𐐡 𐑉 +𐐢 𐑊 +𐐣 𐑋 +𐐤 𐑌 +𐐥 𐑍 +𐐦 𐑎 +𐐧 𐑏 diff --git a/tests/casemap.txt b/tests/casemap.txt new file mode 100644 index 0000000..6bf3509 --- /dev/null +++ b/tests/casemap.txt @@ -0,0 +1,3246 @@ +# Test cases generated from Unicode 5.1 data +# by gen-case-tests.pl. Do not edit. +# +# Some special hand crafted tests +# +tr_TR i i Ä° Ä° # i => LATIN CAPITAL LETTER I WITH DOT ABOVE +tr_TR I ı I I # I => LATIN SMALL LETTER DOTLESS I +tr_TR İ i İ İ # I => LATIN SMALL LETTER DOTLESS I +tr_TR.UTF-8 i i Ä° Ä° # i => LATIN CAPITAL LETTER I WITH DOT ABOVE +tr_TR.UTF-8 I ı I I # I => LATIN SMALL LETTER DOTLESS I +tr_TR.UTF-8 İ i İ İ # I => LATIN SMALL LETTER DOTLESS I +# Test reordering of YPOGEGRAMMENI across other accents + ᾁ ᾁ ᾉ ἉΙ + ᾁ ᾁ ᾉ ἉΙ +# Handling of final and nonfinal sigma + ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ + ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ + ΣΙΓΜΑ σιγμα Σιγμα ΣΙΓΜΑ +# Lithuanian rule of i followed by letter with dot. Not at all sure +# about the titlecase part here +lt_LT iė iė Ie IE +lt_LT iė iė Ie IE +lt_LT Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I WITH GRAVE +lt_LT Í i̇́ Í Í # LATIN CAPITAL LETTER I WITH ACUTE +lt_LT Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I WITH TILDE +lt_LT Í i̇́ Í Í # LATIN CAPITAL LETTER I (with acute accent) +lt_LT Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I (with grave accent) +lt_LT Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I (with tilde above) +lt_LT Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I (with ogonek and acute accent) +lt_LT J́ j̇́ J́ J́ # LATIN CAPITAL LETTER J (with acute accent) +lt_LT Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent) +lt_LT.UTF-8 iė iė Ie IE +lt_LT.UTF-8 iė iė Ie IE +lt_LT.UTF-8 Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I WITH GRAVE +lt_LT.UTF-8 Í i̇́ Í Í # LATIN CAPITAL LETTER I WITH ACUTE +lt_LT.UTF-8 Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I WITH TILDE +lt_LT.UTF-8 Í i̇́ Í Í # LATIN CAPITAL LETTER I (with acute accent) +lt_LT.UTF-8 Ì i̇̀ Ì Ì # LATIN CAPITAL LETTER I (with grave accent) +lt_LT.UTF-8 Ĩ i̇̃ Ĩ Ĩ # LATIN CAPITAL LETTER I (with tilde above) +lt_LT.UTF-8 Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I (with ogonek and acute accent) +lt_LT.UTF-8 J́ j̇́ J́ J́ # LATIN CAPITAL LETTER J (with acute accent) +lt_LT.UTF-8 Į́ į̇́ Į́ Į́ # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent) +# Special case not at initial position + affl affl Affl AFFL # FB04 +# +# Now the automatic tests +# + A a A # 41 + B b B # 42 + C c C # 43 + D d D # 44 + E e E # 45 + F f F # 46 + G g G # 47 + H h H # 48 + I i I # 49 + J j J # 4A + K k K # 4B + L l L # 4C + M m M # 4D + N n N # 4E + O o O # 4F + P p P # 50 + Q q Q # 51 + R r R # 52 + S s S # 53 + T t T # 54 + U u U # 55 + V v V # 56 + W w W # 57 + X x X # 58 + Y y Y # 59 + Z z Z # 5A + a a A A # 61 + b b B B # 62 + c c C C # 63 + d d D D # 64 + e e E E # 65 + f f F F # 66 + g g G G # 67 + h h H H # 68 + i i I I # 69 + j j J J # 6A + k k K K # 6B + l l L L # 6C + m m M M # 6D + n n N N # 6E + o o O O # 6F + p p P P # 70 + q q Q Q # 71 + r r R R # 72 + s s S S # 73 + t t T T # 74 + u u U U # 75 + v v V V # 76 + w w W W # 77 + x x X X # 78 + y y Y Y # 79 + z z Z Z # 7A + ª ª # AA + µ µ Μ Μ # B5 + º º # BA + À à À # C0 + Á á Á # C1 +  â  # C2 + à ã à # C3 + Ä ä Ä # C4 + Šå Å # C5 + Æ æ Æ # C6 + Ç ç Ç # C7 + È è È # C8 + É é É # C9 + Ê ê Ê # CA + Ë ë Ë # CB + Ì ì Ì # CC + Í í Í # CD + Î î Î # CE + Ï ï Ï # CF + Ð ð Ð # D0 + Ñ ñ Ñ # D1 + Ò ò Ò # D2 + Ó ó Ó # D3 + Ô ô Ô # D4 + Õ õ Õ # D5 + Ö ö Ö # D6 + Ø ø Ø # D8 + Ù ù Ù # D9 + Ú ú Ú # DA + Û û Û # DB + Ü ü Ü # DC + Ý ý Ý # DD + Þ þ Þ # DE + ß ß Ss SS # DF + à à À À # E0 + á á Á Á # E1 + â â   # E2 + ã ã à à # E3 + ä ä Ä Ä # E4 + Ã¥ Ã¥ Å Å # E5 + æ æ Æ Æ # E6 + ç ç Ç Ç # E7 + è è È È # E8 + é é É É # E9 + ê ê Ê Ê # EA + ë ë Ë Ë # EB + ì ì Ì Ì # EC + í í Í Í # ED + î î Î Î # EE + ï ï Ï Ï # EF + ð ð Ð Ð # F0 + ñ ñ Ñ Ñ # F1 + ò ò Ò Ò # F2 + ó ó Ó Ó # F3 + ô ô Ô Ô # F4 + õ õ Õ Õ # F5 + ö ö Ö Ö # F6 + ø ø Ø Ø # F8 + ù ù Ù Ù # F9 + ú ú Ú Ú # FA + û û Û Û # FB + ü ü Ü Ü # FC + ý ý Ý Ý # FD + þ þ Þ Þ # FE + ÿ ÿ Ÿ Ÿ # FF + Ā ā Ā # 100 + ā ā Ā Ā # 101 + Ă ă Ă # 102 + ă ă Ă Ă # 103 + Ą ą Ą # 104 + ą ą Ą Ą # 105 + Ć ć Ć # 106 + ć ć Ć Ć # 107 + Ĉ ĉ Ĉ # 108 + ĉ ĉ Ĉ Ĉ # 109 + Ċ ċ Ċ # 10A + ċ ċ Ċ Ċ # 10B + Č č Č # 10C + č č Č Č # 10D + Ď ď Ď # 10E + ď ď Ď Ď # 10F + Đ đ Đ # 110 + đ đ Đ Đ # 111 + Ē ē Ē # 112 + ē ē Ē Ē # 113 + Ĕ ĕ Ĕ # 114 + ĕ ĕ Ĕ Ĕ # 115 + Ė ė Ė # 116 + ė ė Ė Ė # 117 + Ę ę Ę # 118 + ę ę Ę Ę # 119 + Ě ě Ě # 11A + ě ě Ě Ě # 11B + Ĝ ĝ Ĝ # 11C + ĝ ĝ Ĝ Ĝ # 11D + Ğ ğ Ğ # 11E + ğ ğ Ğ Ğ # 11F + Ä  Ä¡ Ä  # 120 + Ä¡ Ä¡ Ä  Ä  # 121 + Ä¢ Ä£ Ä¢ # 122 + Ä£ Ä£ Ä¢ Ä¢ # 123 + Ĥ Ä¥ Ĥ # 124 + Ä¥ Ä¥ Ĥ Ĥ # 125 + Ħ ħ Ħ # 126 + ħ ħ Ħ Ħ # 127 + Ĩ Ä© Ĩ # 128 + Ä© Ä© Ĩ Ĩ # 129 + Ī Ä« Ī # 12A + Ä« Ä« Ī Ī # 12B + Ĭ Ä­ Ĭ # 12C + Ä­ Ä­ Ĭ Ĭ # 12D + Ä® į Ä® # 12E + į į Ä® Ä® # 12F + Ä° i̇ Ä° Ä° # 130 + ı ı I I # 131 + IJ ij IJ # 132 + ij ij IJ IJ # 133 + Ä´ ĵ Ä´ # 134 + ĵ ĵ Ä´ Ä´ # 135 + Ķ Ä· Ķ # 136 + Ä· Ä· Ķ Ķ # 137 + ĸ ĸ # 138 + Ĺ ĺ Ĺ # 139 + ĺ ĺ Ĺ Ĺ # 13A + Ä» ļ Ä» # 13B + ļ ļ Ä» Ä» # 13C + Ľ ľ Ľ # 13D + ľ ľ Ľ Ľ # 13E + Ä¿ ŀ Ä¿ # 13F + ŀ ŀ Ä¿ Ä¿ # 140 + Ł ł Ł # 141 + ł ł Ł Ł # 142 + Ń ń Ń # 143 + ń ń Ń Ń # 144 + Ņ ņ Ņ # 145 + ņ ņ Ņ Ņ # 146 + Ň ň Ň # 147 + ň ň Ň Ň # 148 + ʼn ʼn ʼN ʼN # 149 + Ŋ ŋ Ŋ # 14A + ŋ ŋ Ŋ Ŋ # 14B + Ō ō Ō # 14C + ō ō Ō Ō # 14D + Ŏ ŏ Ŏ # 14E + ŏ ŏ Ŏ Ŏ # 14F + Ő ő Ő # 150 + ő ő Ő Ő # 151 + Œ œ Œ # 152 + œ œ Œ Œ # 153 + Ŕ ŕ Ŕ # 154 + ŕ ŕ Ŕ Ŕ # 155 + Ŗ ŗ Ŗ # 156 + ŗ ŗ Ŗ Ŗ # 157 + Ř ř Ř # 158 + ř ř Ř Ř # 159 + Ś ś Ś # 15A + ś ś Ś Ś # 15B + Ŝ ŝ Ŝ # 15C + ŝ ŝ Ŝ Ŝ # 15D + Ş ş Ş # 15E + ş ş Ş Ş # 15F + Å  Å¡ Å  # 160 + Å¡ Å¡ Å  Å  # 161 + Å¢ Å£ Å¢ # 162 + Å£ Å£ Å¢ Å¢ # 163 + Ť Å¥ Ť # 164 + Å¥ Å¥ Ť Ť # 165 + Ŧ ŧ Ŧ # 166 + ŧ ŧ Ŧ Ŧ # 167 + Ũ Å© Ũ # 168 + Å© Å© Ũ Ũ # 169 + Ū Å« Ū # 16A + Å« Å« Ū Ū # 16B + Ŭ Å­ Ŭ # 16C + Å­ Å­ Ŭ Ŭ # 16D + Å® ů Å® # 16E + ů ů Å® Å® # 16F + Å° ű Å° # 170 + ű ű Å° Å° # 171 + Ų ų Ų # 172 + ų ų Ų Ų # 173 + Å´ ŵ Å´ # 174 + ŵ ŵ Å´ Å´ # 175 + Ŷ Å· Ŷ # 176 + Å· Å· Ŷ Ŷ # 177 + Ÿ ÿ Ÿ # 178 + Ź ź Ź # 179 + ź ź Ź Ź # 17A + Å» ż Å» # 17B + ż ż Å» Å» # 17C + Ž ž Ž # 17D + ž ž Ž Ž # 17E + Å¿ Å¿ S S # 17F + ƀ ƀ Ƀ Ƀ # 180 + Ɓ ɓ Ɓ # 181 + Ƃ ƃ Ƃ # 182 + ƃ ƃ Ƃ Ƃ # 183 + Ƅ ƅ Ƅ # 184 + ƅ ƅ Ƅ Ƅ # 185 + Ɔ ɔ Ɔ # 186 + Ƈ ƈ Ƈ # 187 + ƈ ƈ Ƈ Ƈ # 188 + Ɖ ɖ Ɖ # 189 + Ɗ ɗ Ɗ # 18A + Ƌ ƌ Ƌ # 18B + ƌ ƌ Ƌ Ƌ # 18C + ƍ ƍ # 18D + Ǝ ǝ Ǝ # 18E + Ə ə Ə # 18F + Ɛ ɛ Ɛ # 190 + Ƒ ƒ Ƒ # 191 + ƒ ƒ Ƒ Ƒ # 192 + Ɠ É  Ɠ # 193 + Ɣ É£ Ɣ # 194 + ƕ ƕ Ƕ Ƕ # 195 + Ɩ É© Ɩ # 196 + Ɨ ɨ Ɨ # 197 + Ƙ ƙ Ƙ # 198 + ƙ ƙ Ƙ Ƙ # 199 + ƚ ƚ Ƚ Ƚ # 19A + ƛ ƛ # 19B + Ɯ ɯ Ɯ # 19C + Ɲ ɲ Ɲ # 19D + ƞ ƞ È  È  # 19E + Ɵ ɵ Ɵ # 19F + Æ  Æ¡ Æ  # 1A0 + Æ¡ Æ¡ Æ  Æ  # 1A1 + Æ¢ Æ£ Æ¢ # 1A2 + Æ£ Æ£ Æ¢ Æ¢ # 1A3 + Ƥ Æ¥ Ƥ # 1A4 + Æ¥ Æ¥ Ƥ Ƥ # 1A5 + Ʀ ʀ Ʀ # 1A6 + Ƨ ƨ Ƨ # 1A7 + ƨ ƨ Ƨ Ƨ # 1A8 + Æ© ʃ Æ© # 1A9 + ƪ ƪ # 1AA + Æ« Æ« # 1AB + Ƭ Æ­ Ƭ # 1AC + Æ­ Æ­ Ƭ Ƭ # 1AD + Æ® ʈ Æ® # 1AE + Ư Æ° Ư # 1AF + Æ° Æ° Ư Ư # 1B0 + Ʊ ʊ Ʊ # 1B1 + Ʋ ʋ Ʋ # 1B2 + Ƴ Æ´ Ƴ # 1B3 + Æ´ Æ´ Ƴ Ƴ # 1B4 + Ƶ ƶ Ƶ # 1B5 + ƶ ƶ Ƶ Ƶ # 1B6 + Æ· ʒ Æ· # 1B7 + Ƹ ƹ Ƹ # 1B8 + ƹ ƹ Ƹ Ƹ # 1B9 + ƺ ƺ # 1BA + Ƽ ƽ Ƽ # 1BC + ƽ ƽ Ƽ Ƽ # 1BD + ƾ ƾ # 1BE + Æ¿ Æ¿ Ç· Ç· # 1BF + DŽ dž Dž DŽ # 1C4 + Dž dž dž DŽ # 1C5 + dž dž Dž DŽ # 1C6 + LJ lj Lj LJ # 1C7 + Lj lj lj LJ # 1C8 + lj lj Lj LJ # 1C9 + NJ nj Nj NJ # 1CA + Nj nj nj NJ # 1CB + nj nj Nj NJ # 1CC + Ǎ ǎ Ǎ # 1CD + ǎ ǎ Ǎ Ǎ # 1CE + Ǐ ǐ Ǐ # 1CF + ǐ ǐ Ǐ Ǐ # 1D0 + Ǒ ǒ Ǒ # 1D1 + ǒ ǒ Ǒ Ǒ # 1D2 + Ǔ ǔ Ǔ # 1D3 + ǔ ǔ Ǔ Ǔ # 1D4 + Ǖ ǖ Ǖ # 1D5 + ǖ ǖ Ǖ Ǖ # 1D6 + Ǘ ǘ Ǘ # 1D7 + ǘ ǘ Ǘ Ǘ # 1D8 + Ǚ ǚ Ǚ # 1D9 + ǚ ǚ Ǚ Ǚ # 1DA + Ǜ ǜ Ǜ # 1DB + ǜ ǜ Ǜ Ǜ # 1DC + ǝ ǝ Ǝ Ǝ # 1DD + Ǟ ǟ Ǟ # 1DE + ǟ ǟ Ǟ Ǟ # 1DF + Ç  Ç¡ Ç  # 1E0 + Ç¡ Ç¡ Ç  Ç  # 1E1 + Ç¢ Ç£ Ç¢ # 1E2 + Ç£ Ç£ Ç¢ Ç¢ # 1E3 + Ǥ Ç¥ Ǥ # 1E4 + Ç¥ Ç¥ Ǥ Ǥ # 1E5 + Ǧ ǧ Ǧ # 1E6 + ǧ ǧ Ǧ Ǧ # 1E7 + Ǩ Ç© Ǩ # 1E8 + Ç© Ç© Ǩ Ǩ # 1E9 + Ǫ Ç« Ǫ # 1EA + Ç« Ç« Ǫ Ǫ # 1EB + Ǭ Ç­ Ǭ # 1EC + Ç­ Ç­ Ǭ Ǭ # 1ED + Ç® ǯ Ç® # 1EE + ǯ ǯ Ç® Ç® # 1EF + Ç° Ç° J̌ J̌ # 1F0 + DZ dz Dz DZ # 1F1 + Dz dz dz DZ # 1F2 + dz dz Dz DZ # 1F3 + Ç´ ǵ Ç´ # 1F4 + ǵ ǵ Ç´ Ç´ # 1F5 + Ƕ ƕ Ƕ # 1F6 + Ç· Æ¿ Ç· # 1F7 + Ǹ ǹ Ǹ # 1F8 + ǹ ǹ Ǹ Ǹ # 1F9 + Ǻ Ç» Ǻ # 1FA + Ç» Ç» Ǻ Ǻ # 1FB + Ǽ ǽ Ǽ # 1FC + ǽ ǽ Ǽ Ǽ # 1FD + Ǿ Ç¿ Ǿ # 1FE + Ç¿ Ç¿ Ǿ Ǿ # 1FF + Ȁ ȁ Ȁ # 200 + ȁ ȁ Ȁ Ȁ # 201 + Ȃ ȃ Ȃ # 202 + ȃ ȃ Ȃ Ȃ # 203 + Ȅ ȅ Ȅ # 204 + ȅ ȅ Ȅ Ȅ # 205 + Ȇ ȇ Ȇ # 206 + ȇ ȇ Ȇ Ȇ # 207 + Ȉ ȉ Ȉ # 208 + ȉ ȉ Ȉ Ȉ # 209 + Ȋ ȋ Ȋ # 20A + ȋ ȋ Ȋ Ȋ # 20B + Ȍ ȍ Ȍ # 20C + ȍ ȍ Ȍ Ȍ # 20D + Ȏ ȏ Ȏ # 20E + ȏ ȏ Ȏ Ȏ # 20F + Ȑ ȑ Ȑ # 210 + ȑ ȑ Ȑ Ȑ # 211 + Ȓ ȓ Ȓ # 212 + ȓ ȓ Ȓ Ȓ # 213 + Ȕ ȕ Ȕ # 214 + ȕ ȕ Ȕ Ȕ # 215 + Ȗ ȗ Ȗ # 216 + ȗ ȗ Ȗ Ȗ # 217 + Ș ș Ș # 218 + ș ș Ș Ș # 219 + Ț ț Ț # 21A + ț ț Ț Ț # 21B + Ȝ ȝ Ȝ # 21C + ȝ ȝ Ȝ Ȝ # 21D + Ȟ ȟ Ȟ # 21E + ȟ ȟ Ȟ Ȟ # 21F + È  ƞ È  # 220 + È¡ È¡ # 221 + È¢ È£ È¢ # 222 + È£ È£ È¢ È¢ # 223 + Ȥ È¥ Ȥ # 224 + È¥ È¥ Ȥ Ȥ # 225 + Ȧ ȧ Ȧ # 226 + ȧ ȧ Ȧ Ȧ # 227 + Ȩ È© Ȩ # 228 + È© È© Ȩ Ȩ # 229 + Ȫ È« Ȫ # 22A + È« È« Ȫ Ȫ # 22B + Ȭ È­ Ȭ # 22C + È­ È­ Ȭ Ȭ # 22D + È® ȯ È® # 22E + ȯ ȯ È® È® # 22F + È° ȱ È° # 230 + ȱ ȱ È° È° # 231 + Ȳ ȳ Ȳ # 232 + ȳ ȳ Ȳ Ȳ # 233 + È´ È´ # 234 + ȵ ȵ # 235 + ȶ ȶ # 236 + È· È· # 237 + ȸ ȸ # 238 + ȹ ȹ # 239 + Ⱥ â±¥ Ⱥ # 23A + È» ȼ È» # 23B + ȼ ȼ È» È» # 23C + Ƚ ƚ Ƚ # 23D + Ⱦ ⱦ Ⱦ # 23E + È¿ È¿ # 23F + ɀ ɀ # 240 + Ɂ ɂ Ɂ # 241 + ɂ ɂ Ɂ Ɂ # 242 + Ƀ ƀ Ƀ # 243 + Ʉ ʉ Ʉ # 244 + Ʌ ʌ Ʌ # 245 + Ɇ ɇ Ɇ # 246 + ɇ ɇ Ɇ Ɇ # 247 + Ɉ ɉ Ɉ # 248 + ɉ ɉ Ɉ Ɉ # 249 + Ɋ ɋ Ɋ # 24A + ɋ ɋ Ɋ Ɋ # 24B + Ɍ ɍ Ɍ # 24C + ɍ ɍ Ɍ Ɍ # 24D + Ɏ ɏ Ɏ # 24E + ɏ ɏ Ɏ Ɏ # 24F + ɐ ɐ Ɐ Ɐ # 250 + ɑ ɑ â±­ â±­ # 251 + ɒ ɒ # 252 + ɓ ɓ Ɓ Ɓ # 253 + ɔ ɔ Ɔ Ɔ # 254 + ɕ ɕ # 255 + ɖ ɖ Ɖ Ɖ # 256 + ɗ ɗ Ɗ Ɗ # 257 + ɘ ɘ # 258 + ə ə Ə Ə # 259 + ɚ ɚ # 25A + ɛ ɛ Ɛ Ɛ # 25B + ɜ ɜ # 25C + ɝ ɝ # 25D + ɞ ɞ # 25E + ɟ ɟ # 25F + É  É  Ɠ Ɠ # 260 + É¡ É¡ # 261 + É¢ É¢ # 262 + É£ É£ Ɣ Ɣ # 263 + ɤ ɤ # 264 + É¥ É¥ # 265 + ɦ ɦ # 266 + ɧ ɧ # 267 + ɨ ɨ Ɨ Ɨ # 268 + É© É© Ɩ Ɩ # 269 + ɪ ɪ # 26A + É« É« â±¢ â±¢ # 26B + ɬ ɬ # 26C + É­ É­ # 26D + É® É® # 26E + ɯ ɯ Ɯ Ɯ # 26F + É° É° # 270 + ɱ ɱ â±® â±® # 271 + ɲ ɲ Ɲ Ɲ # 272 + ɳ ɳ # 273 + É´ É´ # 274 + ɵ ɵ Ɵ Ɵ # 275 + ɶ ɶ # 276 + É· É· # 277 + ɸ ɸ # 278 + ɹ ɹ # 279 + ɺ ɺ # 27A + É» É» # 27B + ɼ ɼ # 27C + ɽ ɽ Ɽ Ɽ # 27D + ɾ ɾ # 27E + É¿ É¿ # 27F + ʀ ʀ Ʀ Ʀ # 280 + ʁ ʁ # 281 + ʂ ʂ # 282 + ʃ ʃ Æ© Æ© # 283 + ʄ ʄ # 284 + ʅ ʅ # 285 + ʆ ʆ # 286 + ʇ ʇ # 287 + ʈ ʈ Æ® Æ® # 288 + ʉ ʉ Ʉ Ʉ # 289 + ʊ ʊ Ʊ Ʊ # 28A + ʋ ʋ Ʋ Ʋ # 28B + ʌ ʌ Ʌ Ʌ # 28C + ʍ ʍ # 28D + ʎ ʎ # 28E + ʏ ʏ # 28F + ʐ ʐ # 290 + ʑ ʑ # 291 + ʒ ʒ Æ· Æ· # 292 + ʓ ʓ # 293 + ʕ ʕ # 295 + ʖ ʖ # 296 + ʗ ʗ # 297 + ʘ ʘ # 298 + ʙ ʙ # 299 + ʚ ʚ # 29A + ʛ ʛ # 29B + ʜ ʜ # 29C + ʝ ʝ # 29D + ʞ ʞ # 29E + ʟ ʟ # 29F + Ê  Ê  # 2A0 + Ê¡ Ê¡ # 2A1 + Ê¢ Ê¢ # 2A2 + Ê£ Ê£ # 2A3 + ʤ ʤ # 2A4 + Ê¥ Ê¥ # 2A5 + ʦ ʦ # 2A6 + ʧ ʧ # 2A7 + ʨ ʨ # 2A8 + Ê© Ê© # 2A9 + ʪ ʪ # 2AA + Ê« Ê« # 2AB + ʬ ʬ # 2AC + Ê­ Ê­ # 2AD + Ê® Ê® # 2AE + ʯ ʯ # 2AF + Í° ͱ Í° # 370 + ͱ ͱ Í° Í° # 371 + Ͳ ͳ Ͳ # 372 + ͳ ͳ Ͳ Ͳ # 373 + Ͷ Í· Ͷ # 376 + Í· Í· Ͷ Ͷ # 377 + Í» Í» Ͻ Ͻ # 37B + ͼ ͼ Ͼ Ͼ # 37C + ͽ ͽ Ï¿ Ï¿ # 37D + Ά ά Ά # 386 + Έ έ Έ # 388 + Ή ή Ή # 389 + Ί ί Ί # 38A + Ό ό Ό # 38C + Ύ ύ Ύ # 38E + Ώ ώ Ώ # 38F + ΐ ΐ Ϊ́ Ϊ́ # 390 + Α α Α # 391 + Β β Β # 392 + Γ γ Γ # 393 + Δ δ Δ # 394 + Ε ε Ε # 395 + Ζ ζ Ζ # 396 + Η η Η # 397 + Θ θ Θ # 398 + Ι ι Ι # 399 + Κ κ Κ # 39A + Λ λ Λ # 39B + Μ μ Μ # 39C + Ν ν Ν # 39D + Ξ ξ Ξ # 39E + Ο ο Ο # 39F + Π π Π # 3A0 + Ρ ρ Ρ # 3A1 + Τ τ Τ # 3A4 + Î¥ υ Î¥ # 3A5 + Φ φ Φ # 3A6 + Χ χ Χ # 3A7 + Ψ ψ Ψ # 3A8 + Ω ω Ω # 3A9 + Ϊ ϊ Ϊ # 3AA + Ϋ ϋ Ϋ # 3AB + ά ά Ά Ά # 3AC + έ έ Έ Έ # 3AD + ή ή Ή Ή # 3AE + ί ί Ί Ί # 3AF + ΰ ΰ Ϋ́ Ϋ́ # 3B0 + α α Α Α # 3B1 + β β Β Β # 3B2 + γ γ Γ Γ # 3B3 + δ δ Δ Δ # 3B4 + ε ε Ε Ε # 3B5 + ζ ζ Ζ Ζ # 3B6 + η η Η Η # 3B7 + θ θ Θ Θ # 3B8 + ι ι Ι Ι # 3B9 + κ κ Κ Κ # 3BA + λ λ Λ Λ # 3BB + μ μ Μ Μ # 3BC + ν ν Ν Ν # 3BD + ξ ξ Ξ Ξ # 3BE + ο ο Ο Ο # 3BF + π π Π Π # 3C0 + ρ ρ Ρ Ρ # 3C1 + ς ς Σ Σ # 3C2 + σ σ Σ Σ # 3C3 + τ τ Τ Τ # 3C4 + υ υ Î¥ Î¥ # 3C5 + φ φ Φ Φ # 3C6 + χ χ Χ Χ # 3C7 + ψ ψ Ψ Ψ # 3C8 + ω ω Ω Ω # 3C9 + ϊ ϊ Ϊ Ϊ # 3CA + ϋ ϋ Ϋ Ϋ # 3CB + ό ό Ό Ό # 3CC + ύ ύ Ύ Ύ # 3CD + ώ ώ Ώ Ώ # 3CE + Ϗ ϗ Ϗ # 3CF + ϐ ϐ Β Β # 3D0 + ϑ ϑ Θ Θ # 3D1 + ϒ ϒ # 3D2 + ϓ ϓ # 3D3 + ϔ ϔ # 3D4 + ϕ ϕ Φ Φ # 3D5 + ϖ ϖ Π Π # 3D6 + ϗ ϗ Ϗ Ϗ # 3D7 + Ϙ ϙ Ϙ # 3D8 + ϙ ϙ Ϙ Ϙ # 3D9 + Ϛ ϛ Ϛ # 3DA + ϛ ϛ Ϛ Ϛ # 3DB + Ϝ ϝ Ϝ # 3DC + ϝ ϝ Ϝ Ϝ # 3DD + Ϟ ϟ Ϟ # 3DE + ϟ ϟ Ϟ Ϟ # 3DF + Ï  Ï¡ Ï  # 3E0 + Ï¡ Ï¡ Ï  Ï  # 3E1 + Ï¢ Ï£ Ï¢ # 3E2 + Ï£ Ï£ Ï¢ Ï¢ # 3E3 + Ϥ Ï¥ Ϥ # 3E4 + Ï¥ Ï¥ Ϥ Ϥ # 3E5 + Ϧ ϧ Ϧ # 3E6 + ϧ ϧ Ϧ Ϧ # 3E7 + Ϩ Ï© Ϩ # 3E8 + Ï© Ï© Ϩ Ϩ # 3E9 + Ϫ Ï« Ϫ # 3EA + Ï« Ï« Ϫ Ϫ # 3EB + Ϭ Ï­ Ϭ # 3EC + Ï­ Ï­ Ϭ Ϭ # 3ED + Ï® ϯ Ï® # 3EE + ϯ ϯ Ï® Ï® # 3EF + Ï° Ï° Κ Κ # 3F0 + ϱ ϱ Ρ Ρ # 3F1 + ϲ ϲ Ϲ Ϲ # 3F2 + ϳ ϳ # 3F3 + Ï´ θ Ï´ # 3F4 + ϵ ϵ Ε Ε # 3F5 + Ï· ϸ Ï· # 3F7 + ϸ ϸ Ï· Ï· # 3F8 + Ϲ ϲ Ϲ # 3F9 + Ϻ Ï» Ϻ # 3FA + Ï» Ï» Ϻ Ϻ # 3FB + ϼ ϼ # 3FC + Ͻ Í» Ͻ # 3FD + Ͼ ͼ Ͼ # 3FE + Ï¿ ͽ Ï¿ # 3FF + Ѐ ѐ Ѐ # 400 + Ё ё Ё # 401 + Ђ ђ Ђ # 402 + Ѓ ѓ Ѓ # 403 + Є є Є # 404 + Ѕ ѕ Ѕ # 405 + І і І # 406 + Ї ї Ї # 407 + Ј ј Ј # 408 + Љ љ Љ # 409 + Њ њ Њ # 40A + Ћ ћ Ћ # 40B + Ќ ќ Ќ # 40C + Ѝ ѝ Ѝ # 40D + Ў ў Ў # 40E + Џ џ Џ # 40F + А а А # 410 + Б б Б # 411 + В в В # 412 + Г г Г # 413 + Д д Д # 414 + Е е Е # 415 + Ж ж Ж # 416 + З з З # 417 + И и И # 418 + Й й Й # 419 + К к К # 41A + Л л Л # 41B + М м М # 41C + Н н Н # 41D + О о О # 41E + П п П # 41F + Р р Р # 420 + С с С # 421 + Т т Т # 422 + У у У # 423 + Ф ф Ф # 424 + Ð¥ х Ð¥ # 425 + Ц ц Ц # 426 + Ч ч Ч # 427 + Ш ш Ш # 428 + Щ щ Щ # 429 + Ъ ъ Ъ # 42A + Ы ы Ы # 42B + Ь ь Ь # 42C + Э э Э # 42D + Ю ю Ю # 42E + Я я Я # 42F + а а А А # 430 + б б Б Б # 431 + в в В В # 432 + г г Г Г # 433 + д д Д Д # 434 + е е Е Е # 435 + ж ж Ж Ж # 436 + з з З З # 437 + и и И И # 438 + й й Й Й # 439 + к к К К # 43A + л л Л Л # 43B + м м М М # 43C + н н Н Н # 43D + о о О О # 43E + п п П П # 43F + р р Р Р # 440 + с с С С # 441 + т т Т Т # 442 + у у У У # 443 + ф ф Ф Ф # 444 + х х Ð¥ Ð¥ # 445 + ц ц Ц Ц # 446 + ч ч Ч Ч # 447 + ш ш Ш Ш # 448 + щ щ Щ Щ # 449 + ъ ъ Ъ Ъ # 44A + ы ы Ы Ы # 44B + ь ь Ь Ь # 44C + э э Э Э # 44D + ю ю Ю Ю # 44E + я я Я Я # 44F + ѐ ѐ Ѐ Ѐ # 450 + ё ё Ё Ё # 451 + ђ ђ Ђ Ђ # 452 + ѓ ѓ Ѓ Ѓ # 453 + є є Є Є # 454 + ѕ ѕ Ѕ Ѕ # 455 + і і І І # 456 + ї ї Ї Ї # 457 + ј ј Ј Ј # 458 + љ љ Љ Љ # 459 + њ њ Њ Њ # 45A + ћ ћ Ћ Ћ # 45B + ќ ќ Ќ Ќ # 45C + ѝ ѝ Ѝ Ѝ # 45D + ў ў Ў Ў # 45E + џ џ Џ Џ # 45F + Ñ  Ñ¡ Ñ  # 460 + Ñ¡ Ñ¡ Ñ  Ñ  # 461 + Ñ¢ Ñ£ Ñ¢ # 462 + Ñ£ Ñ£ Ñ¢ Ñ¢ # 463 + Ѥ Ñ¥ Ѥ # 464 + Ñ¥ Ñ¥ Ѥ Ѥ # 465 + Ѧ ѧ Ѧ # 466 + ѧ ѧ Ѧ Ѧ # 467 + Ѩ Ñ© Ѩ # 468 + Ñ© Ñ© Ѩ Ѩ # 469 + Ѫ Ñ« Ѫ # 46A + Ñ« Ñ« Ѫ Ѫ # 46B + Ѭ Ñ­ Ѭ # 46C + Ñ­ Ñ­ Ѭ Ѭ # 46D + Ñ® ѯ Ñ® # 46E + ѯ ѯ Ñ® Ñ® # 46F + Ñ° ѱ Ñ° # 470 + ѱ ѱ Ñ° Ñ° # 471 + Ѳ ѳ Ѳ # 472 + ѳ ѳ Ѳ Ѳ # 473 + Ñ´ ѵ Ñ´ # 474 + ѵ ѵ Ñ´ Ñ´ # 475 + Ѷ Ñ· Ѷ # 476 + Ñ· Ñ· Ѷ Ѷ # 477 + Ѹ ѹ Ѹ # 478 + ѹ ѹ Ѹ Ѹ # 479 + Ѻ Ñ» Ѻ # 47A + Ñ» Ñ» Ѻ Ѻ # 47B + Ѽ ѽ Ѽ # 47C + ѽ ѽ Ѽ Ѽ # 47D + Ѿ Ñ¿ Ѿ # 47E + Ñ¿ Ñ¿ Ѿ Ѿ # 47F + Ҁ ҁ Ҁ # 480 + ҁ ҁ Ҁ Ҁ # 481 + Ҋ ҋ Ҋ # 48A + ҋ ҋ Ҋ Ҋ # 48B + Ҍ ҍ Ҍ # 48C + ҍ ҍ Ҍ Ҍ # 48D + Ҏ ҏ Ҏ # 48E + ҏ ҏ Ҏ Ҏ # 48F + Ґ ґ Ґ # 490 + ґ ґ Ґ Ґ # 491 + Ғ ғ Ғ # 492 + ғ ғ Ғ Ғ # 493 + Ҕ ҕ Ҕ # 494 + ҕ ҕ Ҕ Ҕ # 495 + Җ җ Җ # 496 + җ җ Җ Җ # 497 + Ҙ ҙ Ҙ # 498 + ҙ ҙ Ҙ Ҙ # 499 + Қ қ Қ # 49A + қ қ Қ Қ # 49B + Ҝ ҝ Ҝ # 49C + ҝ ҝ Ҝ Ҝ # 49D + Ҟ ҟ Ҟ # 49E + ҟ ҟ Ҟ Ҟ # 49F + Ò  Ò¡ Ò  # 4A0 + Ò¡ Ò¡ Ò  Ò  # 4A1 + Ò¢ Ò£ Ò¢ # 4A2 + Ò£ Ò£ Ò¢ Ò¢ # 4A3 + Ò¤ Ò¥ Ò¤ # 4A4 + Ò¥ Ò¥ Ò¤ Ò¤ # 4A5 + Ò¦ Ò§ Ò¦ # 4A6 + Ò§ Ò§ Ò¦ Ò¦ # 4A7 + Ò¨ Ò© Ò¨ # 4A8 + Ò© Ò© Ò¨ Ò¨ # 4A9 + Òª Ò« Òª # 4AA + Ò« Ò« Òª Òª # 4AB + Ò¬ Ò­ Ò¬ # 4AC + Ò­ Ò­ Ò¬ Ò¬ # 4AD + Ò® Ò¯ Ò® # 4AE + Ò¯ Ò¯ Ò® Ò® # 4AF + Ò° Ò± Ò° # 4B0 + Ò± Ò± Ò° Ò° # 4B1 + Ò² Ò³ Ò² # 4B2 + Ò³ Ò³ Ò² Ò² # 4B3 + Ò´ Òµ Ò´ # 4B4 + Òµ Òµ Ò´ Ò´ # 4B5 + Ò¶ Ò· Ò¶ # 4B6 + Ò· Ò· Ò¶ Ò¶ # 4B7 + Ò¸ Ò¹ Ò¸ # 4B8 + Ò¹ Ò¹ Ò¸ Ò¸ # 4B9 + Òº Ò» Òº # 4BA + Ò» Ò» Òº Òº # 4BB + Ò¼ Ò½ Ò¼ # 4BC + Ò½ Ò½ Ò¼ Ò¼ # 4BD + Ò¾ Ò¿ Ò¾ # 4BE + Ò¿ Ò¿ Ò¾ Ò¾ # 4BF + Ӏ ӏ Ӏ # 4C0 + Ӂ ӂ Ӂ # 4C1 + ӂ ӂ Ӂ Ӂ # 4C2 + Ӄ ӄ Ӄ # 4C3 + ӄ ӄ Ӄ Ӄ # 4C4 + Ӆ ӆ Ӆ # 4C5 + ӆ ӆ Ӆ Ӆ # 4C6 + Ӈ ӈ Ӈ # 4C7 + ӈ ӈ Ӈ Ӈ # 4C8 + Ӊ ӊ Ӊ # 4C9 + ӊ ӊ Ӊ Ӊ # 4CA + Ӌ ӌ Ӌ # 4CB + ӌ ӌ Ӌ Ӌ # 4CC + Ӎ ӎ Ӎ # 4CD + ӎ ӎ Ӎ Ӎ # 4CE + ӏ ӏ Ӏ Ӏ # 4CF + Ӑ ӑ Ӑ # 4D0 + ӑ ӑ Ӑ Ӑ # 4D1 + Ӓ ӓ Ӓ # 4D2 + ӓ ӓ Ӓ Ӓ # 4D3 + Ӕ ӕ Ӕ # 4D4 + ӕ ӕ Ӕ Ӕ # 4D5 + Ӗ ӗ Ӗ # 4D6 + ӗ ӗ Ӗ Ӗ # 4D7 + Ә ә Ә # 4D8 + ә ә Ә Ә # 4D9 + Ӛ ӛ Ӛ # 4DA + ӛ ӛ Ӛ Ӛ # 4DB + Ӝ ӝ Ӝ # 4DC + ӝ ӝ Ӝ Ӝ # 4DD + Ӟ ӟ Ӟ # 4DE + ӟ ӟ Ӟ Ӟ # 4DF + Ó  Ó¡ Ó  # 4E0 + Ó¡ Ó¡ Ó  Ó  # 4E1 + Ó¢ Ó£ Ó¢ # 4E2 + Ó£ Ó£ Ó¢ Ó¢ # 4E3 + Ó¤ Ó¥ Ó¤ # 4E4 + Ó¥ Ó¥ Ó¤ Ó¤ # 4E5 + Ó¦ Ó§ Ó¦ # 4E6 + Ó§ Ó§ Ó¦ Ó¦ # 4E7 + Ó¨ Ó© Ó¨ # 4E8 + Ó© Ó© Ó¨ Ó¨ # 4E9 + Óª Ó« Óª # 4EA + Ó« Ó« Óª Óª # 4EB + Ó¬ Ó­ Ó¬ # 4EC + Ó­ Ó­ Ó¬ Ó¬ # 4ED + Ó® Ó¯ Ó® # 4EE + Ó¯ Ó¯ Ó® Ó® # 4EF + Ó° Ó± Ó° # 4F0 + Ó± Ó± Ó° Ó° # 4F1 + Ó² Ó³ Ó² # 4F2 + Ó³ Ó³ Ó² Ó² # 4F3 + Ó´ Óµ Ó´ # 4F4 + Óµ Óµ Ó´ Ó´ # 4F5 + Ó¶ Ó· Ó¶ # 4F6 + Ó· Ó· Ó¶ Ó¶ # 4F7 + Ó¸ Ó¹ Ó¸ # 4F8 + Ó¹ Ó¹ Ó¸ Ó¸ # 4F9 + Óº Ó» Óº # 4FA + Ó» Ó» Óº Óº # 4FB + Ó¼ Ó½ Ó¼ # 4FC + Ó½ Ó½ Ó¼ Ó¼ # 4FD + Ó¾ Ó¿ Ó¾ # 4FE + Ó¿ Ó¿ Ó¾ Ó¾ # 4FF + Ԁ ԁ Ԁ # 500 + ԁ ԁ Ԁ Ԁ # 501 + Ԃ ԃ Ԃ # 502 + ԃ ԃ Ԃ Ԃ # 503 + Ԅ ԅ Ԅ # 504 + ԅ ԅ Ԅ Ԅ # 505 + Ԇ ԇ Ԇ # 506 + ԇ ԇ Ԇ Ԇ # 507 + Ԉ ԉ Ԉ # 508 + ԉ ԉ Ԉ Ԉ # 509 + Ԋ ԋ Ԋ # 50A + ԋ ԋ Ԋ Ԋ # 50B + Ԍ ԍ Ԍ # 50C + ԍ ԍ Ԍ Ԍ # 50D + Ԏ ԏ Ԏ # 50E + ԏ ԏ Ԏ Ԏ # 50F + Ԑ ԑ Ԑ # 510 + ԑ ԑ Ԑ Ԑ # 511 + Ԓ ԓ Ԓ # 512 + ԓ ԓ Ԓ Ԓ # 513 + Ԕ ԕ Ԕ # 514 + ԕ ԕ Ԕ Ԕ # 515 + Ԗ ԗ Ԗ # 516 + ԗ ԗ Ԗ Ԗ # 517 + Ԙ ԙ Ԙ # 518 + ԙ ԙ Ԙ Ԙ # 519 + Ԛ ԛ Ԛ # 51A + ԛ ԛ Ԛ Ԛ # 51B + Ԝ ԝ Ԝ # 51C + ԝ ԝ Ԝ Ԝ # 51D + Ԟ ԟ Ԟ # 51E + ԟ ԟ Ԟ Ԟ # 51F + Ô  Ô¡ Ô  # 520 + Ô¡ Ô¡ Ô  Ô  # 521 + Ô¢ Ô£ Ô¢ # 522 + Ô£ Ô£ Ô¢ Ô¢ # 523 + Ô± Õ¡ Ô± # 531 + Ô² Õ¢ Ô² # 532 + Ô³ Õ£ Ô³ # 533 + Ô´ Õ¤ Ô´ # 534 + Ôµ Õ¥ Ôµ # 535 + Ô¶ Õ¦ Ô¶ # 536 + Ô· Õ§ Ô· # 537 + Ô¸ Õ¨ Ô¸ # 538 + Ô¹ Õ© Ô¹ # 539 + Ôº Õª Ôº # 53A + Ô» Õ« Ô» # 53B + Ô¼ Õ¬ Ô¼ # 53C + Ô½ Õ­ Ô½ # 53D + Ô¾ Õ® Ô¾ # 53E + Ô¿ Õ¯ Ô¿ # 53F + Հ Õ° Հ # 540 + Ձ Õ± Ձ # 541 + Ղ Õ² Ղ # 542 + Ճ Õ³ Ճ # 543 + Մ Õ´ Մ # 544 + Յ Õµ Յ # 545 + Ն Õ¶ Ն # 546 + Շ Õ· Շ # 547 + Ո Õ¸ Ո # 548 + Չ Õ¹ Չ # 549 + Պ Õº Պ # 54A + Ջ Õ» Ջ # 54B + Ռ Õ¼ Ռ # 54C + Ս Õ½ Ս # 54D + Վ Õ¾ Վ # 54E + Տ Õ¿ Տ # 54F + Ր ր Ր # 550 + Ց ց Ց # 551 + Ւ ւ Ւ # 552 + Փ փ Փ # 553 + Ք ք Ք # 554 + Օ օ Օ # 555 + Ֆ ֆ Ֆ # 556 + Õ¡ Õ¡ Ô± Ô± # 561 + Õ¢ Õ¢ Ô² Ô² # 562 + Õ£ Õ£ Ô³ Ô³ # 563 + Õ¤ Õ¤ Ô´ Ô´ # 564 + Õ¥ Õ¥ Ôµ Ôµ # 565 + Õ¦ Õ¦ Ô¶ Ô¶ # 566 + Õ§ Õ§ Ô· Ô· # 567 + Õ¨ Õ¨ Ô¸ Ô¸ # 568 + Õ© Õ© Ô¹ Ô¹ # 569 + Õª Õª Ôº Ôº # 56A + Õ« Õ« Ô» Ô» # 56B + Õ¬ Õ¬ Ô¼ Ô¼ # 56C + Õ­ Õ­ Ô½ Ô½ # 56D + Õ® Õ® Ô¾ Ô¾ # 56E + Õ¯ Õ¯ Ô¿ Ô¿ # 56F + Õ° Õ° Հ Հ # 570 + Õ± Õ± Ձ Ձ # 571 + Õ² Õ² Ղ Ղ # 572 + Õ³ Õ³ Ճ Ճ # 573 + Õ´ Õ´ Մ Մ # 574 + Õµ Õµ Յ Յ # 575 + Õ¶ Õ¶ Ն Ն # 576 + Õ· Õ· Շ Շ # 577 + Õ¸ Õ¸ Ո Ո # 578 + Õ¹ Õ¹ Չ Չ # 579 + Õº Õº Պ Պ # 57A + Õ» Õ» Ջ Ջ # 57B + Õ¼ Õ¼ Ռ Ռ # 57C + Õ½ Õ½ Ս Ս # 57D + Õ¾ Õ¾ Վ Վ # 57E + Õ¿ Õ¿ Տ Տ # 57F + ր ր Ր Ր # 580 + ց ց Ց Ց # 581 + ւ ւ Ւ Ւ # 582 + փ փ Փ Փ # 583 + ք ք Ք Ք # 584 + օ օ Օ Օ # 585 + ֆ ֆ Ֆ Ֆ # 586 + և և Եւ ԵՒ # 587 + Ⴀ ⴀ Ⴀ # 10A0 + Ⴁ ⴁ Ⴁ # 10A1 + Ⴂ ⴂ Ⴂ # 10A2 + Ⴃ ⴃ Ⴃ # 10A3 + Ⴄ ⴄ Ⴄ # 10A4 + Ⴅ ⴅ Ⴅ # 10A5 + Ⴆ ⴆ Ⴆ # 10A6 + Ⴇ ⴇ Ⴇ # 10A7 + Ⴈ ⴈ Ⴈ # 10A8 + Ⴉ ⴉ Ⴉ # 10A9 + Ⴊ ⴊ Ⴊ # 10AA + Ⴋ ⴋ Ⴋ # 10AB + Ⴌ ⴌ Ⴌ # 10AC + Ⴍ ⴍ Ⴍ # 10AD + Ⴎ ⴎ Ⴎ # 10AE + Ⴏ ⴏ Ⴏ # 10AF + Ⴐ ⴐ Ⴐ # 10B0 + Ⴑ ⴑ Ⴑ # 10B1 + Ⴒ ⴒ Ⴒ # 10B2 + Ⴓ ⴓ Ⴓ # 10B3 + Ⴔ ⴔ Ⴔ # 10B4 + Ⴕ ⴕ Ⴕ # 10B5 + Ⴖ ⴖ Ⴖ # 10B6 + Ⴗ ⴗ Ⴗ # 10B7 + Ⴘ ⴘ Ⴘ # 10B8 + Ⴙ ⴙ Ⴙ # 10B9 + Ⴚ ⴚ Ⴚ # 10BA + Ⴛ ⴛ Ⴛ # 10BB + Ⴜ ⴜ Ⴜ # 10BC + Ⴝ ⴝ Ⴝ # 10BD + Ⴞ ⴞ Ⴞ # 10BE + Ⴟ ⴟ Ⴟ # 10BF + Ⴠ â´  Ⴠ # 10C0 + Ⴡ â´¡ Ⴡ # 10C1 + Ⴢ â´¢ Ⴢ # 10C2 + Ⴣ â´£ Ⴣ # 10C3 + Ⴤ â´¤ Ⴤ # 10C4 + Ⴥ â´¥ Ⴥ # 10C5 + ᴀ ᴀ # 1D00 + ᴁ ᴁ # 1D01 + ᴂ ᴂ # 1D02 + ᴃ ᴃ # 1D03 + ᴄ ᴄ # 1D04 + ᴅ ᴅ # 1D05 + ᴆ ᴆ # 1D06 + ᴇ ᴇ # 1D07 + ᴈ ᴈ # 1D08 + ᴉ ᴉ # 1D09 + ᴊ ᴊ # 1D0A + ᴋ ᴋ # 1D0B + ᴌ ᴌ # 1D0C + ᴍ ᴍ # 1D0D + ᴎ ᴎ # 1D0E + ᴏ ᴏ # 1D0F + ᴐ ᴐ # 1D10 + ᴑ ᴑ # 1D11 + ᴒ ᴒ # 1D12 + ᴓ ᴓ # 1D13 + ᴔ ᴔ # 1D14 + ᴕ ᴕ # 1D15 + ᴖ ᴖ # 1D16 + ᴗ ᴗ # 1D17 + ᴘ ᴘ # 1D18 + ᴙ ᴙ # 1D19 + ᴚ ᴚ # 1D1A + ᴛ ᴛ # 1D1B + ᴜ ᴜ # 1D1C + ᴝ ᴝ # 1D1D + ᴞ ᴞ # 1D1E + ᴟ ᴟ # 1D1F + á´  á´  # 1D20 + á´¡ á´¡ # 1D21 + á´¢ á´¢ # 1D22 + á´£ á´£ # 1D23 + á´¤ á´¤ # 1D24 + á´¥ á´¥ # 1D25 + á´¦ á´¦ # 1D26 + á´§ á´§ # 1D27 + á´¨ á´¨ # 1D28 + á´© á´© # 1D29 + á´ª á´ª # 1D2A + á´« á´« # 1D2B + áµ¢ áµ¢ # 1D62 + áµ£ áµ£ # 1D63 + ᵤ ᵤ # 1D64 + áµ¥ áµ¥ # 1D65 + ᵦ ᵦ # 1D66 + ᵧ ᵧ # 1D67 + ᵨ ᵨ # 1D68 + ᵩ ᵩ # 1D69 + ᵪ ᵪ # 1D6A + ᵫ ᵫ # 1D6B + ᵬ ᵬ # 1D6C + áµ­ áµ­ # 1D6D + áµ® áµ® # 1D6E + ᵯ ᵯ # 1D6F + áµ° áµ° # 1D70 + áµ± áµ± # 1D71 + áµ² áµ² # 1D72 + áµ³ áµ³ # 1D73 + áµ´ áµ´ # 1D74 + áµµ áµµ # 1D75 + ᵶ ᵶ # 1D76 + áµ· áµ· # 1D77 + áµ¹ áµ¹ Ᵹ Ᵹ # 1D79 + ᵺ ᵺ # 1D7A + áµ» áµ» # 1D7B + áµ¼ áµ¼ # 1D7C + áµ½ áµ½ â±£ â±£ # 1D7D + áµ¾ áµ¾ # 1D7E + ᵿ ᵿ # 1D7F + ᶀ ᶀ # 1D80 + ᶁ ᶁ # 1D81 + ᶂ ᶂ # 1D82 + ᶃ ᶃ # 1D83 + ᶄ ᶄ # 1D84 + ᶅ ᶅ # 1D85 + ᶆ ᶆ # 1D86 + ᶇ ᶇ # 1D87 + ᶈ ᶈ # 1D88 + ᶉ ᶉ # 1D89 + ᶊ ᶊ # 1D8A + ᶋ ᶋ # 1D8B + ᶌ ᶌ # 1D8C + ᶍ ᶍ # 1D8D + ᶎ ᶎ # 1D8E + ᶏ ᶏ # 1D8F + ᶐ ᶐ # 1D90 + ᶑ ᶑ # 1D91 + ᶒ ᶒ # 1D92 + ᶓ ᶓ # 1D93 + ᶔ ᶔ # 1D94 + ᶕ ᶕ # 1D95 + ᶖ ᶖ # 1D96 + ᶗ ᶗ # 1D97 + ᶘ ᶘ # 1D98 + ᶙ ᶙ # 1D99 + ᶚ ᶚ # 1D9A + Ḁ ḁ Ḁ # 1E00 + ḁ ḁ Ḁ Ḁ # 1E01 + Ḃ ḃ Ḃ # 1E02 + ḃ ḃ Ḃ Ḃ # 1E03 + Ḅ ḅ Ḅ # 1E04 + ḅ ḅ Ḅ Ḅ # 1E05 + Ḇ ḇ Ḇ # 1E06 + ḇ ḇ Ḇ Ḇ # 1E07 + Ḉ ḉ Ḉ # 1E08 + ḉ ḉ Ḉ Ḉ # 1E09 + Ḋ ḋ Ḋ # 1E0A + ḋ ḋ Ḋ Ḋ # 1E0B + Ḍ ḍ Ḍ # 1E0C + ḍ ḍ Ḍ Ḍ # 1E0D + Ḏ ḏ Ḏ # 1E0E + ḏ ḏ Ḏ Ḏ # 1E0F + Ḑ ḑ Ḑ # 1E10 + ḑ ḑ Ḑ Ḑ # 1E11 + Ḓ ḓ Ḓ # 1E12 + ḓ ḓ Ḓ Ḓ # 1E13 + Ḕ ḕ Ḕ # 1E14 + ḕ ḕ Ḕ Ḕ # 1E15 + Ḗ ḗ Ḗ # 1E16 + ḗ ḗ Ḗ Ḗ # 1E17 + Ḙ ḙ Ḙ # 1E18 + ḙ ḙ Ḙ Ḙ # 1E19 + Ḛ ḛ Ḛ # 1E1A + ḛ ḛ Ḛ Ḛ # 1E1B + Ḝ ḝ Ḝ # 1E1C + ḝ ḝ Ḝ Ḝ # 1E1D + Ḟ ḟ Ḟ # 1E1E + ḟ ḟ Ḟ Ḟ # 1E1F + Ḡ ḡ Ḡ # 1E20 + ḡ ḡ Ḡ Ḡ # 1E21 + Ḣ ḣ Ḣ # 1E22 + ḣ ḣ Ḣ Ḣ # 1E23 + Ḥ ḥ Ḥ # 1E24 + ḥ ḥ Ḥ Ḥ # 1E25 + Ḧ ḧ Ḧ # 1E26 + ḧ ḧ Ḧ Ḧ # 1E27 + Ḩ ḩ Ḩ # 1E28 + ḩ ḩ Ḩ Ḩ # 1E29 + Ḫ ḫ Ḫ # 1E2A + ḫ ḫ Ḫ Ḫ # 1E2B + Ḭ ḭ Ḭ # 1E2C + ḭ ḭ Ḭ Ḭ # 1E2D + Ḯ ḯ Ḯ # 1E2E + ḯ ḯ Ḯ Ḯ # 1E2F + Ḱ ḱ Ḱ # 1E30 + ḱ ḱ Ḱ Ḱ # 1E31 + Ḳ ḳ Ḳ # 1E32 + ḳ ḳ Ḳ Ḳ # 1E33 + Ḵ ḵ Ḵ # 1E34 + ḵ ḵ Ḵ Ḵ # 1E35 + Ḷ ḷ Ḷ # 1E36 + ḷ ḷ Ḷ Ḷ # 1E37 + Ḹ ḹ Ḹ # 1E38 + ḹ ḹ Ḹ Ḹ # 1E39 + Ḻ ḻ Ḻ # 1E3A + ḻ ḻ Ḻ Ḻ # 1E3B + Ḽ ḽ Ḽ # 1E3C + ḽ ḽ Ḽ Ḽ # 1E3D + Ḿ ḿ Ḿ # 1E3E + ḿ ḿ Ḿ Ḿ # 1E3F + Ṁ ṁ Ṁ # 1E40 + ṁ ṁ Ṁ Ṁ # 1E41 + Ṃ ṃ Ṃ # 1E42 + ṃ ṃ Ṃ Ṃ # 1E43 + Ṅ ṅ Ṅ # 1E44 + ṅ ṅ Ṅ Ṅ # 1E45 + Ṇ ṇ Ṇ # 1E46 + ṇ ṇ Ṇ Ṇ # 1E47 + Ṉ ṉ Ṉ # 1E48 + ṉ ṉ Ṉ Ṉ # 1E49 + Ṋ ṋ Ṋ # 1E4A + ṋ ṋ Ṋ Ṋ # 1E4B + Ṍ ṍ Ṍ # 1E4C + ṍ ṍ Ṍ Ṍ # 1E4D + Ṏ ṏ Ṏ # 1E4E + ṏ ṏ Ṏ Ṏ # 1E4F + Ṑ ṑ Ṑ # 1E50 + ṑ ṑ Ṑ Ṑ # 1E51 + Ṓ ṓ Ṓ # 1E52 + ṓ ṓ Ṓ Ṓ # 1E53 + Ṕ ṕ Ṕ # 1E54 + ṕ ṕ Ṕ Ṕ # 1E55 + Ṗ ṗ Ṗ # 1E56 + ṗ ṗ Ṗ Ṗ # 1E57 + Ṙ ṙ Ṙ # 1E58 + ṙ ṙ Ṙ Ṙ # 1E59 + Ṛ ṛ Ṛ # 1E5A + ṛ ṛ Ṛ Ṛ # 1E5B + Ṝ ṝ Ṝ # 1E5C + ṝ ṝ Ṝ Ṝ # 1E5D + Ṟ ṟ Ṟ # 1E5E + ṟ ṟ Ṟ Ṟ # 1E5F + á¹  ṡ á¹  # 1E60 + ṡ ṡ á¹  á¹  # 1E61 + á¹¢ á¹£ á¹¢ # 1E62 + á¹£ á¹£ á¹¢ á¹¢ # 1E63 + Ṥ á¹¥ Ṥ # 1E64 + á¹¥ á¹¥ Ṥ Ṥ # 1E65 + Ṧ ṧ Ṧ # 1E66 + ṧ ṧ Ṧ Ṧ # 1E67 + Ṩ ṩ Ṩ # 1E68 + ṩ ṩ Ṩ Ṩ # 1E69 + Ṫ ṫ Ṫ # 1E6A + ṫ ṫ Ṫ Ṫ # 1E6B + Ṭ á¹­ Ṭ # 1E6C + á¹­ á¹­ Ṭ Ṭ # 1E6D + á¹® ṯ á¹® # 1E6E + ṯ ṯ á¹® á¹® # 1E6F + á¹° á¹± á¹° # 1E70 + á¹± á¹± á¹° á¹° # 1E71 + á¹² á¹³ á¹² # 1E72 + á¹³ á¹³ á¹² á¹² # 1E73 + á¹´ á¹µ á¹´ # 1E74 + á¹µ á¹µ á¹´ á¹´ # 1E75 + Ṷ á¹· Ṷ # 1E76 + á¹· á¹· Ṷ Ṷ # 1E77 + Ṹ á¹¹ Ṹ # 1E78 + á¹¹ á¹¹ Ṹ Ṹ # 1E79 + Ṻ á¹» Ṻ # 1E7A + á¹» á¹» Ṻ Ṻ # 1E7B + á¹¼ á¹½ á¹¼ # 1E7C + á¹½ á¹½ á¹¼ á¹¼ # 1E7D + á¹¾ ṿ á¹¾ # 1E7E + ṿ ṿ á¹¾ á¹¾ # 1E7F + Ẁ ẁ Ẁ # 1E80 + ẁ ẁ Ẁ Ẁ # 1E81 + Ẃ ẃ Ẃ # 1E82 + ẃ ẃ Ẃ Ẃ # 1E83 + Ẅ ẅ Ẅ # 1E84 + ẅ ẅ Ẅ Ẅ # 1E85 + Ẇ ẇ Ẇ # 1E86 + ẇ ẇ Ẇ Ẇ # 1E87 + Ẉ ẉ Ẉ # 1E88 + ẉ ẉ Ẉ Ẉ # 1E89 + Ẋ ẋ Ẋ # 1E8A + ẋ ẋ Ẋ Ẋ # 1E8B + Ẍ ẍ Ẍ # 1E8C + ẍ ẍ Ẍ Ẍ # 1E8D + Ẏ ẏ Ẏ # 1E8E + ẏ ẏ Ẏ Ẏ # 1E8F + Ẑ ẑ Ẑ # 1E90 + ẑ ẑ Ẑ Ẑ # 1E91 + Ẓ ẓ Ẓ # 1E92 + ẓ ẓ Ẓ Ẓ # 1E93 + Ẕ ẕ Ẕ # 1E94 + ẕ ẕ Ẕ Ẕ # 1E95 + ẖ ẖ H̱ H̱ # 1E96 + ẗ ẗ T̈ T̈ # 1E97 + ẘ ẘ W̊ W̊ # 1E98 + ẙ ẙ Y̊ Y̊ # 1E99 + ẚ ẚ Aʾ Aʾ # 1E9A + ẛ ẛ á¹  á¹  # 1E9B + ẜ ẜ # 1E9C + ẝ ẝ # 1E9D + ẞ ß ẞ # 1E9E + ẟ ẟ # 1E9F + Ạ ạ Ạ # 1EA0 + ạ ạ Ạ Ạ # 1EA1 + Ả ả Ả # 1EA2 + ả ả Ả Ả # 1EA3 + Ấ ấ Ấ # 1EA4 + ấ ấ Ấ Ấ # 1EA5 + Ầ ầ Ầ # 1EA6 + ầ ầ Ầ Ầ # 1EA7 + Ẩ ẩ Ẩ # 1EA8 + ẩ ẩ Ẩ Ẩ # 1EA9 + Ẫ ẫ Ẫ # 1EAA + ẫ ẫ Ẫ Ẫ # 1EAB + Ậ ậ Ậ # 1EAC + ậ ậ Ậ Ậ # 1EAD + Ắ ắ Ắ # 1EAE + ắ ắ Ắ Ắ # 1EAF + Ằ ằ Ằ # 1EB0 + ằ ằ Ằ Ằ # 1EB1 + Ẳ ẳ Ẳ # 1EB2 + ẳ ẳ Ẳ Ẳ # 1EB3 + Ẵ ẵ Ẵ # 1EB4 + ẵ ẵ Ẵ Ẵ # 1EB5 + Ặ ặ Ặ # 1EB6 + ặ ặ Ặ Ặ # 1EB7 + Ẹ ẹ Ẹ # 1EB8 + ẹ ẹ Ẹ Ẹ # 1EB9 + Ẻ ẻ Ẻ # 1EBA + ẻ ẻ Ẻ Ẻ # 1EBB + Ẽ ẽ Ẽ # 1EBC + ẽ ẽ Ẽ Ẽ # 1EBD + Ế ế Ế # 1EBE + ế ế Ế Ế # 1EBF + Ề ề Ề # 1EC0 + ề ề Ề Ề # 1EC1 + Ể ể Ể # 1EC2 + ể ể Ể Ể # 1EC3 + Ễ ễ Ễ # 1EC4 + ễ ễ Ễ Ễ # 1EC5 + Ệ ệ Ệ # 1EC6 + ệ ệ Ệ Ệ # 1EC7 + Ỉ ỉ Ỉ # 1EC8 + ỉ ỉ Ỉ Ỉ # 1EC9 + Ị ị Ị # 1ECA + ị ị Ị Ị # 1ECB + Ọ ọ Ọ # 1ECC + ọ ọ Ọ Ọ # 1ECD + Ỏ ỏ Ỏ # 1ECE + ỏ ỏ Ỏ Ỏ # 1ECF + Ố ố Ố # 1ED0 + ố ố Ố Ố # 1ED1 + Ồ ồ Ồ # 1ED2 + ồ ồ Ồ Ồ # 1ED3 + Ổ ổ Ổ # 1ED4 + ổ ổ Ổ Ổ # 1ED5 + Ỗ ỗ Ỗ # 1ED6 + ỗ ỗ Ỗ Ỗ # 1ED7 + Ộ ộ Ộ # 1ED8 + ộ ộ Ộ Ộ # 1ED9 + Ớ ớ Ớ # 1EDA + ớ ớ Ớ Ớ # 1EDB + Ờ ờ Ờ # 1EDC + ờ ờ Ờ Ờ # 1EDD + Ở ở Ở # 1EDE + ở ở Ở Ở # 1EDF + á»  ỡ á»  # 1EE0 + ỡ ỡ á»  á»  # 1EE1 + Ợ ợ Ợ # 1EE2 + ợ ợ Ợ Ợ # 1EE3 + Ụ ụ Ụ # 1EE4 + ụ ụ Ụ Ụ # 1EE5 + Ủ ủ Ủ # 1EE6 + ủ ủ Ủ Ủ # 1EE7 + Ứ ứ Ứ # 1EE8 + ứ ứ Ứ Ứ # 1EE9 + Ừ ừ Ừ # 1EEA + ừ ừ Ừ Ừ # 1EEB + Ử á»­ Ử # 1EEC + á»­ á»­ Ử Ử # 1EED + á»® ữ á»® # 1EEE + ữ ữ á»® á»® # 1EEF + á»° á»± á»° # 1EF0 + á»± á»± á»° á»° # 1EF1 + Ỳ ỳ Ỳ # 1EF2 + ỳ ỳ Ỳ Ỳ # 1EF3 + á»´ ỵ á»´ # 1EF4 + ỵ ỵ á»´ á»´ # 1EF5 + Ỷ á»· Ỷ # 1EF6 + á»· á»· Ỷ Ỷ # 1EF7 + Ỹ ỹ Ỹ # 1EF8 + ỹ ỹ Ỹ Ỹ # 1EF9 + Ỻ á»» Ỻ # 1EFA + á»» á»» Ỻ Ỻ # 1EFB + Ỽ ỽ Ỽ # 1EFC + ỽ ỽ Ỽ Ỽ # 1EFD + Ỿ ỿ Ỿ # 1EFE + ỿ ỿ Ỿ Ỿ # 1EFF + ἀ ἀ Ἀ Ἀ # 1F00 + ἁ ἁ Ἁ Ἁ # 1F01 + ἂ ἂ Ἂ Ἂ # 1F02 + ἃ ἃ Ἃ Ἃ # 1F03 + ἄ ἄ Ἄ Ἄ # 1F04 + ἅ ἅ Ἅ Ἅ # 1F05 + ἆ ἆ Ἆ Ἆ # 1F06 + ἇ ἇ Ἇ Ἇ # 1F07 + Ἀ ἀ Ἀ # 1F08 + Ἁ ἁ Ἁ # 1F09 + Ἂ ἂ Ἂ # 1F0A + Ἃ ἃ Ἃ # 1F0B + Ἄ ἄ Ἄ # 1F0C + Ἅ ἅ Ἅ # 1F0D + Ἆ ἆ Ἆ # 1F0E + Ἇ ἇ Ἇ # 1F0F + ἐ ἐ Ἐ Ἐ # 1F10 + ἑ ἑ Ἑ Ἑ # 1F11 + ἒ ἒ Ἒ Ἒ # 1F12 + ἓ ἓ Ἓ Ἓ # 1F13 + ἔ ἔ Ἔ Ἔ # 1F14 + ἕ ἕ Ἕ Ἕ # 1F15 + Ἐ ἐ Ἐ # 1F18 + Ἑ ἑ Ἑ # 1F19 + Ἒ ἒ Ἒ # 1F1A + Ἓ ἓ Ἓ # 1F1B + Ἔ ἔ Ἔ # 1F1C + Ἕ ἕ Ἕ # 1F1D + á¼  á¼  Ἠ Ἠ # 1F20 + ἡ ἡ Ἡ Ἡ # 1F21 + á¼¢ á¼¢ Ἢ Ἢ # 1F22 + á¼£ á¼£ Ἣ Ἣ # 1F23 + ἤ ἤ Ἤ Ἤ # 1F24 + á¼¥ á¼¥ á¼­ á¼­ # 1F25 + ἦ ἦ á¼® á¼® # 1F26 + ἧ ἧ Ἧ Ἧ # 1F27 + Ἠ á¼  Ἠ # 1F28 + Ἡ ἡ Ἡ # 1F29 + Ἢ á¼¢ Ἢ # 1F2A + Ἣ á¼£ Ἣ # 1F2B + Ἤ ἤ Ἤ # 1F2C + á¼­ á¼¥ á¼­ # 1F2D + á¼® ἦ á¼® # 1F2E + Ἧ ἧ Ἧ # 1F2F + á¼° á¼° Ἰ Ἰ # 1F30 + á¼± á¼± á¼¹ á¼¹ # 1F31 + á¼² á¼² Ἲ Ἲ # 1F32 + á¼³ á¼³ á¼» á¼» # 1F33 + á¼´ á¼´ á¼¼ á¼¼ # 1F34 + á¼µ á¼µ á¼½ á¼½ # 1F35 + ἶ ἶ á¼¾ á¼¾ # 1F36 + á¼· á¼· Ἷ Ἷ # 1F37 + Ἰ á¼° Ἰ # 1F38 + á¼¹ á¼± á¼¹ # 1F39 + Ἲ á¼² Ἲ # 1F3A + á¼» á¼³ á¼» # 1F3B + á¼¼ á¼´ á¼¼ # 1F3C + á¼½ á¼µ á¼½ # 1F3D + á¼¾ ἶ á¼¾ # 1F3E + Ἷ á¼· Ἷ # 1F3F + ὀ ὀ Ὀ Ὀ # 1F40 + ὁ ὁ Ὁ Ὁ # 1F41 + ὂ ὂ Ὂ Ὂ # 1F42 + ὃ ὃ Ὃ Ὃ # 1F43 + ὄ ὄ Ὄ Ὄ # 1F44 + ὅ ὅ Ὅ Ὅ # 1F45 + Ὀ ὀ Ὀ # 1F48 + Ὁ ὁ Ὁ # 1F49 + Ὂ ὂ Ὂ # 1F4A + Ὃ ὃ Ὃ # 1F4B + Ὄ ὄ Ὄ # 1F4C + Ὅ ὅ Ὅ # 1F4D + ὐ ὐ Υ̓ Υ̓ # 1F50 + ὑ ὑ Ὑ Ὑ # 1F51 + ὒ ὒ Υ̓̀ Υ̓̀ # 1F52 + ὓ ὓ Ὓ Ὓ # 1F53 + ὔ ὔ Υ̓́ Υ̓́ # 1F54 + ὕ ὕ Ὕ Ὕ # 1F55 + ὖ ὖ Υ̓͂ Υ̓͂ # 1F56 + ὗ ὗ Ὗ Ὗ # 1F57 + Ὑ ὑ Ὑ # 1F59 + Ὓ ὓ Ὓ # 1F5B + Ὕ ὕ Ὕ # 1F5D + Ὗ ὗ Ὗ # 1F5F + á½  á½  Ὠ Ὠ # 1F60 + ὡ ὡ Ὡ Ὡ # 1F61 + á½¢ á½¢ Ὢ Ὢ # 1F62 + á½£ á½£ Ὣ Ὣ # 1F63 + ὤ ὤ Ὤ Ὤ # 1F64 + á½¥ á½¥ á½­ á½­ # 1F65 + ὦ ὦ á½® á½® # 1F66 + ὧ ὧ Ὧ Ὧ # 1F67 + Ὠ á½  Ὠ # 1F68 + Ὡ ὡ Ὡ # 1F69 + Ὢ á½¢ Ὢ # 1F6A + Ὣ á½£ Ὣ # 1F6B + Ὤ ὤ Ὤ # 1F6C + á½­ á½¥ á½­ # 1F6D + á½® ὦ á½® # 1F6E + Ὧ ὧ Ὧ # 1F6F + á½° á½° Ὰ Ὰ # 1F70 + á½± á½± á¾» á¾» # 1F71 + á½² á½² Ὲ Ὲ # 1F72 + á½³ á½³ Έ Έ # 1F73 + á½´ á½´ Ὴ Ὴ # 1F74 + á½µ á½µ Ή Ή # 1F75 + ὶ ὶ Ὶ Ὶ # 1F76 + á½· á½· Ί Ί # 1F77 + ὸ ὸ Ὸ Ὸ # 1F78 + á½¹ á½¹ Ό Ό # 1F79 + ὺ ὺ Ὺ Ὺ # 1F7A + á½» á½» á¿« á¿« # 1F7B + á½¼ á½¼ Ὼ Ὼ # 1F7C + á½½ á½½ á¿» á¿» # 1F7D + ᾀ ᾀ ᾈ ἈΙ # 1F80 + ᾁ ᾁ ᾉ ἉΙ # 1F81 + ᾂ ᾂ ᾊ ἊΙ # 1F82 + ᾃ ᾃ ᾋ ἋΙ # 1F83 + ᾄ ᾄ ᾌ ἌΙ # 1F84 + ᾅ ᾅ ᾍ ἍΙ # 1F85 + ᾆ ᾆ ᾎ ἎΙ # 1F86 + ᾇ ᾇ ᾏ ἏΙ # 1F87 + ᾈ ᾀ ᾈ ἈΙ # 1F88 + ᾉ ᾁ ᾉ ἉΙ # 1F89 + ᾊ ᾂ ᾊ ἊΙ # 1F8A + ᾋ ᾃ ᾋ ἋΙ # 1F8B + ᾌ ᾄ ᾌ ἌΙ # 1F8C + ᾍ ᾅ ᾍ ἍΙ # 1F8D + ᾎ ᾆ ᾎ ἎΙ # 1F8E + ᾏ ᾇ ᾏ ἏΙ # 1F8F + ᾐ ᾐ ᾘ ἨΙ # 1F90 + ᾑ ᾑ ᾙ ἩΙ # 1F91 + ᾒ ᾒ ᾚ ἪΙ # 1F92 + ᾓ ᾓ ᾛ ἫΙ # 1F93 + ᾔ ᾔ ᾜ ἬΙ # 1F94 + ᾕ ᾕ ᾝ ἭΙ # 1F95 + ᾖ ᾖ ᾞ ἮΙ # 1F96 + ᾗ ᾗ ᾟ ἯΙ # 1F97 + ᾘ ᾐ ᾘ ἨΙ # 1F98 + ᾙ ᾑ ᾙ ἩΙ # 1F99 + ᾚ ᾒ ᾚ ἪΙ # 1F9A + ᾛ ᾓ ᾛ ἫΙ # 1F9B + ᾜ ᾔ ᾜ ἬΙ # 1F9C + ᾝ ᾕ ᾝ ἭΙ # 1F9D + ᾞ ᾖ ᾞ ἮΙ # 1F9E + ᾟ ᾗ ᾟ ἯΙ # 1F9F + á¾  á¾  ᾨ ὨΙ # 1FA0 + ᾡ ᾡ ᾩ ὩΙ # 1FA1 + á¾¢ á¾¢ ᾪ ὪΙ # 1FA2 + á¾£ á¾£ ᾫ ὫΙ # 1FA3 + ᾤ ᾤ ᾬ ὬΙ # 1FA4 + á¾¥ á¾¥ á¾­ ὭΙ # 1FA5 + ᾦ ᾦ á¾® ὮΙ # 1FA6 + ᾧ ᾧ ᾯ ὯΙ # 1FA7 + ᾨ á¾  ᾨ ὨΙ # 1FA8 + ᾩ ᾡ ᾩ ὩΙ # 1FA9 + ᾪ á¾¢ ᾪ ὪΙ # 1FAA + ᾫ á¾£ ᾫ ὫΙ # 1FAB + ᾬ ᾤ ᾬ ὬΙ # 1FAC + á¾­ á¾¥ á¾­ ὭΙ # 1FAD + á¾® ᾦ á¾® ὮΙ # 1FAE + ᾯ ᾧ ᾯ ὯΙ # 1FAF + á¾° á¾° Ᾰ Ᾰ # 1FB0 + á¾± á¾± á¾¹ á¾¹ # 1FB1 + á¾² á¾² Ὰͅ ᾺΙ # 1FB2 + á¾³ á¾³ á¾¼ ΑΙ # 1FB3 + á¾´ á¾´ Άͅ ΆΙ # 1FB4 + ᾶ ᾶ Α͂ Α͂ # 1FB6 + á¾· á¾· ᾼ͂ Α͂Ι # 1FB7 + Ᾰ á¾° Ᾰ # 1FB8 + á¾¹ á¾± á¾¹ # 1FB9 + Ὰ á½° Ὰ # 1FBA + á¾» á½± á¾» # 1FBB + á¾¼ á¾³ á¾¼ ΑΙ # 1FBC + á¾¾ á¾¾ Ι Ι # 1FBE + ῂ ῂ Ὴͅ ῊΙ # 1FC2 + ῃ ῃ ῌ ΗΙ # 1FC3 + ῄ ῄ Ήͅ ΉΙ # 1FC4 + ῆ ῆ Η͂ Η͂ # 1FC6 + ῇ ῇ ῌ͂ Η͂Ι # 1FC7 + Ὲ á½² Ὲ # 1FC8 + Έ á½³ Έ # 1FC9 + Ὴ á½´ Ὴ # 1FCA + Ή á½µ Ή # 1FCB + ῌ ῃ ῌ ΗΙ # 1FCC + ῐ ῐ Ῐ Ῐ # 1FD0 + ῑ ῑ Ῑ Ῑ # 1FD1 + ῒ ῒ Ϊ̀ Ϊ̀ # 1FD2 + ΐ ΐ Ϊ́ Ϊ́ # 1FD3 + ῖ ῖ Ι͂ Ι͂ # 1FD6 + ῗ ῗ Ϊ͂ Ϊ͂ # 1FD7 + Ῐ ῐ Ῐ # 1FD8 + Ῑ ῑ Ῑ # 1FD9 + Ὶ ὶ Ὶ # 1FDA + Ί á½· Ί # 1FDB + á¿  á¿  Ῠ Ῠ # 1FE0 + á¿¡ á¿¡ á¿© á¿© # 1FE1 + á¿¢ á¿¢ Ϋ̀ Ϋ̀ # 1FE2 + á¿£ á¿£ Ϋ́ Ϋ́ # 1FE3 + ῤ ῤ Ρ̓ Ρ̓ # 1FE4 + á¿¥ á¿¥ Ῥ Ῥ # 1FE5 + ῦ ῦ Υ͂ Υ͂ # 1FE6 + ῧ ῧ Ϋ͂ Ϋ͂ # 1FE7 + Ῠ á¿  Ῠ # 1FE8 + á¿© á¿¡ á¿© # 1FE9 + Ὺ ὺ Ὺ # 1FEA + á¿« á½» á¿« # 1FEB + Ῥ á¿¥ Ῥ # 1FEC + ῲ ῲ Ὼͅ ῺΙ # 1FF2 + ῳ ῳ ῼ ΩΙ # 1FF3 + á¿´ á¿´ Ώͅ ΏΙ # 1FF4 + ῶ ῶ Ω͂ Ω͂ # 1FF6 + á¿· á¿· ῼ͂ Ω͂Ι # 1FF7 + Ὸ ὸ Ὸ # 1FF8 + Ό á½¹ Ό # 1FF9 + Ὼ á½¼ Ὼ # 1FFA + á¿» á½½ á¿» # 1FFB + ῼ ῳ ῼ ΩΙ # 1FFC + ⁱ ⁱ # 2071 + ⁿ ⁿ # 207F + ℂ ℂ # 2102 + ℇ ℇ # 2107 + ℊ ℊ # 210A + ℋ ℋ # 210B + ℌ ℌ # 210C + ℍ ℍ # 210D + ℎ ℎ # 210E + ℏ ℏ # 210F + ℐ ℐ # 2110 + ℑ ℑ # 2111 + ℒ ℒ # 2112 + ℓ ℓ # 2113 + ℕ ℕ # 2115 + ℙ ℙ # 2119 + ℚ ℚ # 211A + ℛ ℛ # 211B + ℜ ℜ # 211C + ℝ ℝ # 211D + ℤ ℤ # 2124 + Ω ω Ω # 2126 + ℨ ℨ # 2128 + K k K # 212A + Šå Å # 212B + ℬ ℬ # 212C + ℭ ℭ # 212D + ℯ ℯ # 212F + ℰ ℰ # 2130 + ℱ ℱ # 2131 + Ⅎ ⅎ Ⅎ # 2132 + ℳ ℳ # 2133 + ℴ ℴ # 2134 + ℹ ℹ # 2139 + ℼ ℼ # 213C + ℽ ℽ # 213D + ℾ ℾ # 213E + ℿ ℿ # 213F + ⅅ ⅅ # 2145 + ⅆ ⅆ # 2146 + ⅇ ⅇ # 2147 + ⅈ ⅈ # 2148 + ⅉ ⅉ # 2149 + ⅎ ⅎ Ⅎ Ⅎ # 214E + Ↄ ↄ Ↄ # 2183 + ↄ ↄ Ↄ Ↄ # 2184 + Ⰰ â°° Ⰰ # 2C00 + Ⰱ â°± Ⰱ # 2C01 + Ⰲ â°² Ⰲ # 2C02 + Ⰳ â°³ Ⰳ # 2C03 + Ⰴ â°´ Ⰴ # 2C04 + Ⰵ â°µ Ⰵ # 2C05 + Ⰶ â°¶ Ⰶ # 2C06 + Ⰷ â°· Ⰷ # 2C07 + Ⰸ â°¸ Ⰸ # 2C08 + Ⰹ â°¹ Ⰹ # 2C09 + Ⰺ â°º Ⰺ # 2C0A + Ⰻ â°» Ⰻ # 2C0B + Ⰼ â°¼ Ⰼ # 2C0C + Ⰽ â°½ Ⰽ # 2C0D + Ⰾ â°¾ Ⰾ # 2C0E + Ⰿ â°¿ Ⰿ # 2C0F + Ⱀ ⱀ Ⱀ # 2C10 + Ⱁ ⱁ Ⱁ # 2C11 + Ⱂ ⱂ Ⱂ # 2C12 + Ⱃ ⱃ Ⱃ # 2C13 + Ⱄ ⱄ Ⱄ # 2C14 + Ⱅ ⱅ Ⱅ # 2C15 + Ⱆ ⱆ Ⱆ # 2C16 + Ⱇ ⱇ Ⱇ # 2C17 + Ⱈ ⱈ Ⱈ # 2C18 + Ⱉ ⱉ Ⱉ # 2C19 + Ⱊ ⱊ Ⱊ # 2C1A + Ⱋ ⱋ Ⱋ # 2C1B + Ⱌ ⱌ Ⱌ # 2C1C + Ⱍ ⱍ Ⱍ # 2C1D + Ⱎ ⱎ Ⱎ # 2C1E + Ⱏ ⱏ Ⱏ # 2C1F + â°  ⱐ â°  # 2C20 + â°¡ ⱑ â°¡ # 2C21 + â°¢ ⱒ â°¢ # 2C22 + â°£ ⱓ â°£ # 2C23 + â°¤ ⱔ â°¤ # 2C24 + â°¥ ⱕ â°¥ # 2C25 + â°¦ ⱖ â°¦ # 2C26 + â°§ ⱗ â°§ # 2C27 + â°¨ ⱘ â°¨ # 2C28 + â°© ⱙ â°© # 2C29 + â°ª ⱚ â°ª # 2C2A + â°« ⱛ â°« # 2C2B + â°¬ ⱜ â°¬ # 2C2C + â°­ ⱝ â°­ # 2C2D + â°® ⱞ â°® # 2C2E + â°° â°° Ⰰ Ⰰ # 2C30 + â°± â°± Ⰱ Ⰱ # 2C31 + â°² â°² Ⰲ Ⰲ # 2C32 + â°³ â°³ Ⰳ Ⰳ # 2C33 + â°´ â°´ Ⰴ Ⰴ # 2C34 + â°µ â°µ Ⰵ Ⰵ # 2C35 + â°¶ â°¶ Ⰶ Ⰶ # 2C36 + â°· â°· Ⰷ Ⰷ # 2C37 + â°¸ â°¸ Ⰸ Ⰸ # 2C38 + â°¹ â°¹ Ⰹ Ⰹ # 2C39 + â°º â°º Ⰺ Ⰺ # 2C3A + â°» â°» Ⰻ Ⰻ # 2C3B + â°¼ â°¼ Ⰼ Ⰼ # 2C3C + â°½ â°½ Ⰽ Ⰽ # 2C3D + â°¾ â°¾ Ⰾ Ⰾ # 2C3E + â°¿ â°¿ Ⰿ Ⰿ # 2C3F + ⱀ ⱀ Ⱀ Ⱀ # 2C40 + ⱁ ⱁ Ⱁ Ⱁ # 2C41 + ⱂ ⱂ Ⱂ Ⱂ # 2C42 + ⱃ ⱃ Ⱃ Ⱃ # 2C43 + ⱄ ⱄ Ⱄ Ⱄ # 2C44 + ⱅ ⱅ Ⱅ Ⱅ # 2C45 + ⱆ ⱆ Ⱆ Ⱆ # 2C46 + ⱇ ⱇ Ⱇ Ⱇ # 2C47 + ⱈ ⱈ Ⱈ Ⱈ # 2C48 + ⱉ ⱉ Ⱉ Ⱉ # 2C49 + ⱊ ⱊ Ⱊ Ⱊ # 2C4A + ⱋ ⱋ Ⱋ Ⱋ # 2C4B + ⱌ ⱌ Ⱌ Ⱌ # 2C4C + ⱍ ⱍ Ⱍ Ⱍ # 2C4D + ⱎ ⱎ Ⱎ Ⱎ # 2C4E + ⱏ ⱏ Ⱏ Ⱏ # 2C4F + ⱐ ⱐ â°  â°  # 2C50 + ⱑ ⱑ â°¡ â°¡ # 2C51 + ⱒ ⱒ â°¢ â°¢ # 2C52 + ⱓ ⱓ â°£ â°£ # 2C53 + ⱔ ⱔ â°¤ â°¤ # 2C54 + ⱕ ⱕ â°¥ â°¥ # 2C55 + ⱖ ⱖ â°¦ â°¦ # 2C56 + ⱗ ⱗ â°§ â°§ # 2C57 + ⱘ ⱘ â°¨ â°¨ # 2C58 + ⱙ ⱙ â°© â°© # 2C59 + ⱚ ⱚ â°ª â°ª # 2C5A + ⱛ ⱛ â°« â°« # 2C5B + ⱜ ⱜ â°¬ â°¬ # 2C5C + ⱝ ⱝ â°­ â°­ # 2C5D + ⱞ ⱞ â°® â°® # 2C5E + â±  ⱡ â±  # 2C60 + ⱡ ⱡ â±  â±  # 2C61 + â±¢ É« â±¢ # 2C62 + â±£ áµ½ â±£ # 2C63 + Ɽ ɽ Ɽ # 2C64 + â±¥ â±¥ Ⱥ Ⱥ # 2C65 + ⱦ ⱦ Ⱦ Ⱦ # 2C66 + Ⱨ ⱨ Ⱨ # 2C67 + ⱨ ⱨ Ⱨ Ⱨ # 2C68 + Ⱪ ⱪ Ⱪ # 2C69 + ⱪ ⱪ Ⱪ Ⱪ # 2C6A + Ⱬ ⱬ Ⱬ # 2C6B + ⱬ ⱬ Ⱬ Ⱬ # 2C6C + â±­ ɑ â±­ # 2C6D + â±® ɱ â±® # 2C6E + Ɐ ɐ Ɐ # 2C6F + â±± â±± # 2C71 + â±² â±³ â±² # 2C72 + â±³ â±³ â±² â±² # 2C73 + â±´ â±´ # 2C74 + â±µ ⱶ â±µ # 2C75 + ⱶ ⱶ â±µ â±µ # 2C76 + â±· â±· # 2C77 + ⱸ ⱸ # 2C78 + â±¹ â±¹ # 2C79 + ⱺ ⱺ # 2C7A + â±» â±» # 2C7B + â±¼ â±¼ # 2C7C + Ⲁ ⲁ Ⲁ # 2C80 + ⲁ ⲁ Ⲁ Ⲁ # 2C81 + Ⲃ ⲃ Ⲃ # 2C82 + ⲃ ⲃ Ⲃ Ⲃ # 2C83 + Ⲅ ⲅ Ⲅ # 2C84 + ⲅ ⲅ Ⲅ Ⲅ # 2C85 + Ⲇ ⲇ Ⲇ # 2C86 + ⲇ ⲇ Ⲇ Ⲇ # 2C87 + Ⲉ ⲉ Ⲉ # 2C88 + ⲉ ⲉ Ⲉ Ⲉ # 2C89 + Ⲋ ⲋ Ⲋ # 2C8A + ⲋ ⲋ Ⲋ Ⲋ # 2C8B + Ⲍ ⲍ Ⲍ # 2C8C + ⲍ ⲍ Ⲍ Ⲍ # 2C8D + Ⲏ ⲏ Ⲏ # 2C8E + ⲏ ⲏ Ⲏ Ⲏ # 2C8F + Ⲑ ⲑ Ⲑ # 2C90 + ⲑ ⲑ Ⲑ Ⲑ # 2C91 + Ⲓ ⲓ Ⲓ # 2C92 + ⲓ ⲓ Ⲓ Ⲓ # 2C93 + Ⲕ ⲕ Ⲕ # 2C94 + ⲕ ⲕ Ⲕ Ⲕ # 2C95 + Ⲗ ⲗ Ⲗ # 2C96 + ⲗ ⲗ Ⲗ Ⲗ # 2C97 + Ⲙ ⲙ Ⲙ # 2C98 + ⲙ ⲙ Ⲙ Ⲙ # 2C99 + Ⲛ ⲛ Ⲛ # 2C9A + ⲛ ⲛ Ⲛ Ⲛ # 2C9B + Ⲝ ⲝ Ⲝ # 2C9C + ⲝ ⲝ Ⲝ Ⲝ # 2C9D + Ⲟ ⲟ Ⲟ # 2C9E + ⲟ ⲟ Ⲟ Ⲟ # 2C9F + â²  ⲡ â²  # 2CA0 + ⲡ ⲡ â²  â²  # 2CA1 + â²¢ â²£ â²¢ # 2CA2 + â²£ â²£ â²¢ â²¢ # 2CA3 + Ⲥ â²¥ Ⲥ # 2CA4 + â²¥ â²¥ Ⲥ Ⲥ # 2CA5 + Ⲧ ⲧ Ⲧ # 2CA6 + ⲧ ⲧ Ⲧ Ⲧ # 2CA7 + Ⲩ ⲩ Ⲩ # 2CA8 + ⲩ ⲩ Ⲩ Ⲩ # 2CA9 + Ⲫ ⲫ Ⲫ # 2CAA + ⲫ ⲫ Ⲫ Ⲫ # 2CAB + Ⲭ â²­ Ⲭ # 2CAC + â²­ â²­ Ⲭ Ⲭ # 2CAD + â²® ⲯ â²® # 2CAE + ⲯ ⲯ â²® â²® # 2CAF + â²° â²± â²° # 2CB0 + â²± â²± â²° â²° # 2CB1 + â²² â²³ â²² # 2CB2 + â²³ â²³ â²² â²² # 2CB3 + â²´ â²µ â²´ # 2CB4 + â²µ â²µ â²´ â²´ # 2CB5 + Ⲷ â²· Ⲷ # 2CB6 + â²· â²· Ⲷ Ⲷ # 2CB7 + Ⲹ â²¹ Ⲹ # 2CB8 + â²¹ â²¹ Ⲹ Ⲹ # 2CB9 + Ⲻ â²» Ⲻ # 2CBA + â²» â²» Ⲻ Ⲻ # 2CBB + â²¼ â²½ â²¼ # 2CBC + â²½ â²½ â²¼ â²¼ # 2CBD + â²¾ ⲿ â²¾ # 2CBE + ⲿ ⲿ â²¾ â²¾ # 2CBF + Ⳁ ⳁ Ⳁ # 2CC0 + ⳁ ⳁ Ⳁ Ⳁ # 2CC1 + Ⳃ ⳃ Ⳃ # 2CC2 + ⳃ ⳃ Ⳃ Ⳃ # 2CC3 + Ⳅ ⳅ Ⳅ # 2CC4 + ⳅ ⳅ Ⳅ Ⳅ # 2CC5 + Ⳇ ⳇ Ⳇ # 2CC6 + ⳇ ⳇ Ⳇ Ⳇ # 2CC7 + Ⳉ ⳉ Ⳉ # 2CC8 + ⳉ ⳉ Ⳉ Ⳉ # 2CC9 + Ⳋ ⳋ Ⳋ # 2CCA + ⳋ ⳋ Ⳋ Ⳋ # 2CCB + Ⳍ ⳍ Ⳍ # 2CCC + ⳍ ⳍ Ⳍ Ⳍ # 2CCD + Ⳏ ⳏ Ⳏ # 2CCE + ⳏ ⳏ Ⳏ Ⳏ # 2CCF + Ⳑ ⳑ Ⳑ # 2CD0 + ⳑ ⳑ Ⳑ Ⳑ # 2CD1 + Ⳓ ⳓ Ⳓ # 2CD2 + ⳓ ⳓ Ⳓ Ⳓ # 2CD3 + Ⳕ ⳕ Ⳕ # 2CD4 + ⳕ ⳕ Ⳕ Ⳕ # 2CD5 + Ⳗ ⳗ Ⳗ # 2CD6 + ⳗ ⳗ Ⳗ Ⳗ # 2CD7 + Ⳙ ⳙ Ⳙ # 2CD8 + ⳙ ⳙ Ⳙ Ⳙ # 2CD9 + Ⳛ ⳛ Ⳛ # 2CDA + ⳛ ⳛ Ⳛ Ⳛ # 2CDB + Ⳝ ⳝ Ⳝ # 2CDC + ⳝ ⳝ Ⳝ Ⳝ # 2CDD + Ⳟ ⳟ Ⳟ # 2CDE + ⳟ ⳟ Ⳟ Ⳟ # 2CDF + â³  ⳡ â³  # 2CE0 + ⳡ ⳡ â³  â³  # 2CE1 + â³¢ â³£ â³¢ # 2CE2 + â³£ â³£ â³¢ â³¢ # 2CE3 + ⳤ ⳤ # 2CE4 + ⴀ ⴀ Ⴀ Ⴀ # 2D00 + ⴁ ⴁ Ⴁ Ⴁ # 2D01 + ⴂ ⴂ Ⴂ Ⴂ # 2D02 + ⴃ ⴃ Ⴃ Ⴃ # 2D03 + ⴄ ⴄ Ⴄ Ⴄ # 2D04 + ⴅ ⴅ Ⴅ Ⴅ # 2D05 + ⴆ ⴆ Ⴆ Ⴆ # 2D06 + ⴇ ⴇ Ⴇ Ⴇ # 2D07 + ⴈ ⴈ Ⴈ Ⴈ # 2D08 + ⴉ ⴉ Ⴉ Ⴉ # 2D09 + ⴊ ⴊ Ⴊ Ⴊ # 2D0A + ⴋ ⴋ Ⴋ Ⴋ # 2D0B + ⴌ ⴌ Ⴌ Ⴌ # 2D0C + ⴍ ⴍ Ⴍ Ⴍ # 2D0D + ⴎ ⴎ Ⴎ Ⴎ # 2D0E + ⴏ ⴏ Ⴏ Ⴏ # 2D0F + ⴐ ⴐ Ⴐ Ⴐ # 2D10 + ⴑ ⴑ Ⴑ Ⴑ # 2D11 + ⴒ ⴒ Ⴒ Ⴒ # 2D12 + ⴓ ⴓ Ⴓ Ⴓ # 2D13 + ⴔ ⴔ Ⴔ Ⴔ # 2D14 + ⴕ ⴕ Ⴕ Ⴕ # 2D15 + ⴖ ⴖ Ⴖ Ⴖ # 2D16 + ⴗ ⴗ Ⴗ Ⴗ # 2D17 + ⴘ ⴘ Ⴘ Ⴘ # 2D18 + ⴙ ⴙ Ⴙ Ⴙ # 2D19 + ⴚ ⴚ Ⴚ Ⴚ # 2D1A + ⴛ ⴛ Ⴛ Ⴛ # 2D1B + ⴜ ⴜ Ⴜ Ⴜ # 2D1C + ⴝ ⴝ Ⴝ Ⴝ # 2D1D + ⴞ ⴞ Ⴞ Ⴞ # 2D1E + ⴟ ⴟ Ⴟ Ⴟ # 2D1F + â´  â´  Ⴠ Ⴠ # 2D20 + â´¡ â´¡ Ⴡ Ⴡ # 2D21 + â´¢ â´¢ Ⴢ Ⴢ # 2D22 + â´£ â´£ Ⴣ Ⴣ # 2D23 + â´¤ â´¤ Ⴤ Ⴤ # 2D24 + â´¥ â´¥ Ⴥ Ⴥ # 2D25 + Ꙁ ꙁ Ꙁ # A640 + ꙁ ꙁ Ꙁ Ꙁ # A641 + Ꙃ ꙃ Ꙃ # A642 + ꙃ ꙃ Ꙃ Ꙃ # A643 + Ꙅ ꙅ Ꙅ # A644 + ꙅ ꙅ Ꙅ Ꙅ # A645 + Ꙇ ꙇ Ꙇ # A646 + ꙇ ꙇ Ꙇ Ꙇ # A647 + Ꙉ ꙉ Ꙉ # A648 + ꙉ ꙉ Ꙉ Ꙉ # A649 + Ꙋ ꙋ Ꙋ # A64A + ꙋ ꙋ Ꙋ Ꙋ # A64B + Ꙍ ꙍ Ꙍ # A64C + ꙍ ꙍ Ꙍ Ꙍ # A64D + Ꙏ ꙏ Ꙏ # A64E + ꙏ ꙏ Ꙏ Ꙏ # A64F + Ꙑ ꙑ Ꙑ # A650 + ꙑ ꙑ Ꙑ Ꙑ # A651 + Ꙓ ꙓ Ꙓ # A652 + ꙓ ꙓ Ꙓ Ꙓ # A653 + Ꙕ ꙕ Ꙕ # A654 + ꙕ ꙕ Ꙕ Ꙕ # A655 + Ꙗ ꙗ Ꙗ # A656 + ꙗ ꙗ Ꙗ Ꙗ # A657 + Ꙙ ꙙ Ꙙ # A658 + ꙙ ꙙ Ꙙ Ꙙ # A659 + Ꙛ ꙛ Ꙛ # A65A + ꙛ ꙛ Ꙛ Ꙛ # A65B + Ꙝ ꙝ Ꙝ # A65C + ꙝ ꙝ Ꙝ Ꙝ # A65D + Ꙟ ꙟ Ꙟ # A65E + ꙟ ꙟ Ꙟ Ꙟ # A65F + Ꙣ ꙣ Ꙣ # A662 + ꙣ ꙣ Ꙣ Ꙣ # A663 + Ꙥ ꙥ Ꙥ # A664 + ꙥ ꙥ Ꙥ Ꙥ # A665 + Ꙧ ꙧ Ꙧ # A666 + ꙧ ꙧ Ꙧ Ꙧ # A667 + Ꙩ ꙩ Ꙩ # A668 + ꙩ ꙩ Ꙩ Ꙩ # A669 + Ꙫ ꙫ Ꙫ # A66A + ꙫ ꙫ Ꙫ Ꙫ # A66B + Ꙭ ꙭ Ꙭ # A66C + ꙭ ꙭ Ꙭ Ꙭ # A66D + Ꚁ ꚁ Ꚁ # A680 + ꚁ ꚁ Ꚁ Ꚁ # A681 + Ꚃ ꚃ Ꚃ # A682 + ꚃ ꚃ Ꚃ Ꚃ # A683 + Ꚅ ꚅ Ꚅ # A684 + ꚅ ꚅ Ꚅ Ꚅ # A685 + Ꚇ ꚇ Ꚇ # A686 + ꚇ ꚇ Ꚇ Ꚇ # A687 + Ꚉ ꚉ Ꚉ # A688 + ꚉ ꚉ Ꚉ Ꚉ # A689 + Ꚋ ꚋ Ꚋ # A68A + ꚋ ꚋ Ꚋ Ꚋ # A68B + Ꚍ ꚍ Ꚍ # A68C + ꚍ ꚍ Ꚍ Ꚍ # A68D + Ꚏ ꚏ Ꚏ # A68E + ꚏ ꚏ Ꚏ Ꚏ # A68F + Ꚑ ꚑ Ꚑ # A690 + ꚑ ꚑ Ꚑ Ꚑ # A691 + Ꚓ ꚓ Ꚓ # A692 + ꚓ ꚓ Ꚓ Ꚓ # A693 + Ꚕ ꚕ Ꚕ # A694 + ꚕ ꚕ Ꚕ Ꚕ # A695 + Ꚗ ꚗ Ꚗ # A696 + ꚗ ꚗ Ꚗ Ꚗ # A697 + Ꜣ ꜣ Ꜣ # A722 + ꜣ ꜣ Ꜣ Ꜣ # A723 + Ꜥ ꜥ Ꜥ # A724 + ꜥ ꜥ Ꜥ Ꜥ # A725 + Ꜧ ꜧ Ꜧ # A726 + ꜧ ꜧ Ꜧ Ꜧ # A727 + Ꜩ ꜩ Ꜩ # A728 + ꜩ ꜩ Ꜩ Ꜩ # A729 + Ꜫ ꜫ Ꜫ # A72A + ꜫ ꜫ Ꜫ Ꜫ # A72B + Ꜭ ꜭ Ꜭ # A72C + ꜭ ꜭ Ꜭ Ꜭ # A72D + Ꜯ ꜯ Ꜯ # A72E + ꜯ ꜯ Ꜯ Ꜯ # A72F + ꜰ ꜰ # A730 + ꜱ ꜱ # A731 + Ꜳ ꜳ Ꜳ # A732 + ꜳ ꜳ Ꜳ Ꜳ # A733 + Ꜵ ꜵ Ꜵ # A734 + ꜵ ꜵ Ꜵ Ꜵ # A735 + Ꜷ ꜷ Ꜷ # A736 + ꜷ ꜷ Ꜷ Ꜷ # A737 + Ꜹ ꜹ Ꜹ # A738 + ꜹ ꜹ Ꜹ Ꜹ # A739 + Ꜻ ꜻ Ꜻ # A73A + ꜻ ꜻ Ꜻ Ꜻ # A73B + Ꜽ ꜽ Ꜽ # A73C + ꜽ ꜽ Ꜽ Ꜽ # A73D + Ꜿ ꜿ Ꜿ # A73E + ꜿ ꜿ Ꜿ Ꜿ # A73F + Ꝁ ꝁ Ꝁ # A740 + ꝁ ꝁ Ꝁ Ꝁ # A741 + Ꝃ ꝃ Ꝃ # A742 + ꝃ ꝃ Ꝃ Ꝃ # A743 + Ꝅ ꝅ Ꝅ # A744 + ꝅ ꝅ Ꝅ Ꝅ # A745 + Ꝇ ꝇ Ꝇ # A746 + ꝇ ꝇ Ꝇ Ꝇ # A747 + Ꝉ ꝉ Ꝉ # A748 + ꝉ ꝉ Ꝉ Ꝉ # A749 + Ꝋ ꝋ Ꝋ # A74A + ꝋ ꝋ Ꝋ Ꝋ # A74B + Ꝍ ꝍ Ꝍ # A74C + ꝍ ꝍ Ꝍ Ꝍ # A74D + Ꝏ ꝏ Ꝏ # A74E + ꝏ ꝏ Ꝏ Ꝏ # A74F + Ꝑ ꝑ Ꝑ # A750 + ꝑ ꝑ Ꝑ Ꝑ # A751 + Ꝓ ꝓ Ꝓ # A752 + ꝓ ꝓ Ꝓ Ꝓ # A753 + Ꝕ ꝕ Ꝕ # A754 + ꝕ ꝕ Ꝕ Ꝕ # A755 + Ꝗ ꝗ Ꝗ # A756 + ꝗ ꝗ Ꝗ Ꝗ # A757 + Ꝙ ꝙ Ꝙ # A758 + ꝙ ꝙ Ꝙ Ꝙ # A759 + Ꝛ ꝛ Ꝛ # A75A + ꝛ ꝛ Ꝛ Ꝛ # A75B + Ꝝ ꝝ Ꝝ # A75C + ꝝ ꝝ Ꝝ Ꝝ # A75D + Ꝟ ꝟ Ꝟ # A75E + ꝟ ꝟ Ꝟ Ꝟ # A75F + Ꝡ ꝡ Ꝡ # A760 + ꝡ ꝡ Ꝡ Ꝡ # A761 + Ꝣ ꝣ Ꝣ # A762 + ꝣ ꝣ Ꝣ Ꝣ # A763 + Ꝥ ꝥ Ꝥ # A764 + ꝥ ꝥ Ꝥ Ꝥ # A765 + Ꝧ ꝧ Ꝧ # A766 + ꝧ ꝧ Ꝧ Ꝧ # A767 + Ꝩ ꝩ Ꝩ # A768 + ꝩ ꝩ Ꝩ Ꝩ # A769 + Ꝫ ꝫ Ꝫ # A76A + ꝫ ꝫ Ꝫ Ꝫ # A76B + Ꝭ ꝭ Ꝭ # A76C + ꝭ ꝭ Ꝭ Ꝭ # A76D + Ꝯ ꝯ Ꝯ # A76E + ꝯ ꝯ Ꝯ Ꝯ # A76F + ꝱ ꝱ # A771 + ꝲ ꝲ # A772 + ꝳ ꝳ # A773 + ꝴ ꝴ # A774 + ꝵ ꝵ # A775 + ꝶ ꝶ # A776 + ꝷ ꝷ # A777 + ꝸ ꝸ # A778 + Ꝺ ꝺ Ꝺ # A779 + ꝺ ꝺ Ꝺ Ꝺ # A77A + Ꝼ ꝼ Ꝼ # A77B + ꝼ ꝼ Ꝼ Ꝼ # A77C + Ᵹ áµ¹ Ᵹ # A77D + Ꝿ ꝿ Ꝿ # A77E + ꝿ ꝿ Ꝿ Ꝿ # A77F + Ꞁ ꞁ Ꞁ # A780 + ꞁ ꞁ Ꞁ Ꞁ # A781 + Ꞃ ꞃ Ꞃ # A782 + ꞃ ꞃ Ꞃ Ꞃ # A783 + Ꞅ ꞅ Ꞅ # A784 + ꞅ ꞅ Ꞅ Ꞅ # A785 + Ꞇ ꞇ Ꞇ # A786 + ꞇ ꞇ Ꞇ Ꞇ # A787 + Ꞌ ꞌ Ꞌ # A78B + ꞌ ꞌ Ꞌ Ꞌ # A78C + ff ff Ff FF # FB00 + fi fi Fi FI # FB01 + fl fl Fl FL # FB02 + ffi ffi Ffi FFI # FB03 + ffl ffl Ffl FFL # FB04 + ſt ſt St ST # FB05 + st st St ST # FB06 + ﬓ ﬓ Մն ՄՆ # FB13 + ﬔ ﬔ Մե ՄԵ # FB14 + ﬕ ﬕ Մի ՄԻ # FB15 + ﬖ ﬖ Վն ՎՆ # FB16 + ﬗ ﬗ Մխ ՄԽ # FB17 + A a A # FF21 + ï¼¢ b ï¼¢ # FF22 + ï¼£ c ï¼£ # FF23 + D d D # FF24 + ï¼¥ e ï¼¥ # FF25 + F f F # FF26 + G g G # FF27 + H h H # FF28 + I i I # FF29 + J j J # FF2A + K k K # FF2B + L l L # FF2C + ï¼­ m ï¼­ # FF2D + ï¼® n ï¼® # FF2E + O o O # FF2F + ï¼° p ï¼° # FF30 + ï¼± q ï¼± # FF31 + ï¼² r ï¼² # FF32 + ï¼³ s ï¼³ # FF33 + ï¼´ t ï¼´ # FF34 + ï¼µ u ï¼µ # FF35 + V v V # FF36 + ï¼· w ï¼· # FF37 + X x X # FF38 + ï¼¹ y ï¼¹ # FF39 + Z z Z # FF3A + a a A A # FF41 + b b ï¼¢ ï¼¢ # FF42 + c c ï¼£ ï¼£ # FF43 + d d D D # FF44 + e e ï¼¥ ï¼¥ # FF45 + f f F F # FF46 + g g G G # FF47 + h h H H # FF48 + i i I I # FF49 + j j J J # FF4A + k k K K # FF4B + l l L L # FF4C + m m ï¼­ ï¼­ # FF4D + n n ï¼® ï¼® # FF4E + o o O O # FF4F + p p ï¼° ï¼° # FF50 + q q ï¼± ï¼± # FF51 + r r ï¼² ï¼² # FF52 + s s ï¼³ ï¼³ # FF53 + t t ï¼´ ï¼´ # FF54 + u u ï¼µ ï¼µ # FF55 + v v V V # FF56 + w w ï¼· ï¼· # FF57 + x x X X # FF58 + y y ï¼¹ ï¼¹ # FF59 + z z Z Z # FF5A + 𐐀 𐐨 𐐀 # 10400 + 𐐁 𐐩 𐐁 # 10401 + 𐐂 𐐪 𐐂 # 10402 + 𐐃 𐐫 𐐃 # 10403 + 𐐄 𐐬 𐐄 # 10404 + 𐐅 𐐭 𐐅 # 10405 + 𐐆 𐐮 𐐆 # 10406 + 𐐇 𐐯 𐐇 # 10407 + 𐐈 𐐰 𐐈 # 10408 + 𐐉 𐐱 𐐉 # 10409 + 𐐊 𐐲 𐐊 # 1040A + 𐐋 𐐳 𐐋 # 1040B + 𐐌 𐐴 𐐌 # 1040C + 𐐍 𐐵 𐐍 # 1040D + 𐐎 𐐶 𐐎 # 1040E + 𐐏 𐐷 𐐏 # 1040F + 𐐐 𐐸 𐐐 # 10410 + 𐐑 𐐹 𐐑 # 10411 + 𐐒 𐐺 𐐒 # 10412 + 𐐓 𐐻 𐐓 # 10413 + 𐐔 𐐼 𐐔 # 10414 + 𐐕 𐐽 𐐕 # 10415 + 𐐖 𐐾 𐐖 # 10416 + 𐐗 𐐿 𐐗 # 10417 + 𐐘 𐑀 𐐘 # 10418 + 𐐙 𐑁 𐐙 # 10419 + 𐐚 𐑂 𐐚 # 1041A + 𐐛 𐑃 𐐛 # 1041B + 𐐜 𐑄 𐐜 # 1041C + 𐐝 𐑅 𐐝 # 1041D + 𐐞 𐑆 𐐞 # 1041E + 𐐟 𐑇 𐐟 # 1041F + 𐐠 𐑈 𐐠 # 10420 + 𐐡 𐑉 𐐡 # 10421 + 𐐢 𐑊 𐐢 # 10422 + 𐐣 𐑋 𐐣 # 10423 + 𐐤 𐑌 𐐤 # 10424 + 𐐥 𐑍 𐐥 # 10425 + 𐐦 𐑎 𐐦 # 10426 + 𐐧 𐑏 𐐧 # 10427 + 𐐨 𐐨 𐐀 𐐀 # 10428 + 𐐩 𐐩 𐐁 𐐁 # 10429 + 𐐪 𐐪 𐐂 𐐂 # 1042A + 𐐫 𐐫 𐐃 𐐃 # 1042B + 𐐬 𐐬 𐐄 𐐄 # 1042C + 𐐭 𐐭 𐐅 𐐅 # 1042D + 𐐮 𐐮 𐐆 𐐆 # 1042E + 𐐯 𐐯 𐐇 𐐇 # 1042F + 𐐰 𐐰 𐐈 𐐈 # 10430 + 𐐱 𐐱 𐐉 𐐉 # 10431 + 𐐲 𐐲 𐐊 𐐊 # 10432 + 𐐳 𐐳 𐐋 𐐋 # 10433 + 𐐴 𐐴 𐐌 𐐌 # 10434 + 𐐵 𐐵 𐐍 𐐍 # 10435 + 𐐶 𐐶 𐐎 𐐎 # 10436 + 𐐷 𐐷 𐐏 𐐏 # 10437 + 𐐸 𐐸 𐐐 𐐐 # 10438 + 𐐹 𐐹 𐐑 𐐑 # 10439 + 𐐺 𐐺 𐐒 𐐒 # 1043A + 𐐻 𐐻 𐐓 𐐓 # 1043B + 𐐼 𐐼 𐐔 𐐔 # 1043C + 𐐽 𐐽 𐐕 𐐕 # 1043D + 𐐾 𐐾 𐐖 𐐖 # 1043E + 𐐿 𐐿 𐐗 𐐗 # 1043F + 𐑀 𐑀 𐐘 𐐘 # 10440 + 𐑁 𐑁 𐐙 𐐙 # 10441 + 𐑂 𐑂 𐐚 𐐚 # 10442 + 𐑃 𐑃 𐐛 𐐛 # 10443 + 𐑄 𐑄 𐐜 𐐜 # 10444 + 𐑅 𐑅 𐐝 𐐝 # 10445 + 𐑆 𐑆 𐐞 𐐞 # 10446 + 𐑇 𐑇 𐐟 𐐟 # 10447 + 𐑈 𐑈 𐐠 𐐠 # 10448 + 𐑉 𐑉 𐐡 𐐡 # 10449 + 𐑊 𐑊 𐐢 𐐢 # 1044A + 𐑋 𐑋 𐐣 𐐣 # 1044B + 𐑌 𐑌 𐐤 𐐤 # 1044C + 𐑍 𐑍 𐐥 𐐥 # 1044D + 𐑎 𐑎 𐐦 𐐦 # 1044E + 𐑏 𐑏 𐐧 𐐧 # 1044F + 𝐀 𝐀 # 1D400 + 𝐁 𝐁 # 1D401 + 𝐂 𝐂 # 1D402 + 𝐃 𝐃 # 1D403 + 𝐄 𝐄 # 1D404 + 𝐅 𝐅 # 1D405 + 𝐆 𝐆 # 1D406 + 𝐇 𝐇 # 1D407 + 𝐈 𝐈 # 1D408 + 𝐉 𝐉 # 1D409 + 𝐊 𝐊 # 1D40A + 𝐋 𝐋 # 1D40B + 𝐌 𝐌 # 1D40C + 𝐍 𝐍 # 1D40D + 𝐎 𝐎 # 1D40E + 𝐏 𝐏 # 1D40F + 𝐐 𝐐 # 1D410 + 𝐑 𝐑 # 1D411 + 𝐒 𝐒 # 1D412 + 𝐓 𝐓 # 1D413 + 𝐔 𝐔 # 1D414 + 𝐕 𝐕 # 1D415 + 𝐖 𝐖 # 1D416 + 𝐗 𝐗 # 1D417 + 𝐘 𝐘 # 1D418 + 𝐙 𝐙 # 1D419 + 𝐚 𝐚 # 1D41A + 𝐛 𝐛 # 1D41B + 𝐜 𝐜 # 1D41C + 𝐝 𝐝 # 1D41D + 𝐞 𝐞 # 1D41E + 𝐟 𝐟 # 1D41F + 𝐠 𝐠 # 1D420 + 𝐡 𝐡 # 1D421 + 𝐢 𝐢 # 1D422 + 𝐣 𝐣 # 1D423 + 𝐤 𝐤 # 1D424 + 𝐥 𝐥 # 1D425 + 𝐦 𝐦 # 1D426 + 𝐧 𝐧 # 1D427 + 𝐨 𝐨 # 1D428 + 𝐩 𝐩 # 1D429 + 𝐪 𝐪 # 1D42A + 𝐫 𝐫 # 1D42B + 𝐬 𝐬 # 1D42C + 𝐭 𝐭 # 1D42D + 𝐮 𝐮 # 1D42E + 𝐯 𝐯 # 1D42F + 𝐰 𝐰 # 1D430 + 𝐱 𝐱 # 1D431 + 𝐲 𝐲 # 1D432 + 𝐳 𝐳 # 1D433 + 𝐴 𝐴 # 1D434 + 𝐵 𝐵 # 1D435 + 𝐶 𝐶 # 1D436 + 𝐷 𝐷 # 1D437 + 𝐸 𝐸 # 1D438 + 𝐹 𝐹 # 1D439 + 𝐺 𝐺 # 1D43A + 𝐻 𝐻 # 1D43B + 𝐼 𝐼 # 1D43C + 𝐽 𝐽 # 1D43D + 𝐾 𝐾 # 1D43E + 𝐿 𝐿 # 1D43F + 𝑀 𝑀 # 1D440 + 𝑁 𝑁 # 1D441 + 𝑂 𝑂 # 1D442 + 𝑃 𝑃 # 1D443 + 𝑄 𝑄 # 1D444 + 𝑅 𝑅 # 1D445 + 𝑆 𝑆 # 1D446 + 𝑇 𝑇 # 1D447 + 𝑈 𝑈 # 1D448 + 𝑉 𝑉 # 1D449 + 𝑊 𝑊 # 1D44A + 𝑋 𝑋 # 1D44B + 𝑌 𝑌 # 1D44C + 𝑍 𝑍 # 1D44D + 𝑎 𝑎 # 1D44E + 𝑏 𝑏 # 1D44F + 𝑐 𝑐 # 1D450 + 𝑑 𝑑 # 1D451 + 𝑒 𝑒 # 1D452 + 𝑓 𝑓 # 1D453 + 𝑔 𝑔 # 1D454 + 𝑖 𝑖 # 1D456 + 𝑗 𝑗 # 1D457 + 𝑘 𝑘 # 1D458 + 𝑙 𝑙 # 1D459 + 𝑚 𝑚 # 1D45A + 𝑛 𝑛 # 1D45B + 𝑜 𝑜 # 1D45C + 𝑝 𝑝 # 1D45D + 𝑞 𝑞 # 1D45E + 𝑟 𝑟 # 1D45F + 𝑠 𝑠 # 1D460 + 𝑡 𝑡 # 1D461 + 𝑢 𝑢 # 1D462 + 𝑣 𝑣 # 1D463 + 𝑤 𝑤 # 1D464 + 𝑥 𝑥 # 1D465 + 𝑦 𝑦 # 1D466 + 𝑧 𝑧 # 1D467 + 𝑨 𝑨 # 1D468 + 𝑩 𝑩 # 1D469 + 𝑪 𝑪 # 1D46A + 𝑫 𝑫 # 1D46B + 𝑬 𝑬 # 1D46C + 𝑭 𝑭 # 1D46D + 𝑮 𝑮 # 1D46E + 𝑯 𝑯 # 1D46F + 𝑰 𝑰 # 1D470 + 𝑱 𝑱 # 1D471 + 𝑲 𝑲 # 1D472 + 𝑳 𝑳 # 1D473 + 𝑴 𝑴 # 1D474 + 𝑵 𝑵 # 1D475 + 𝑶 𝑶 # 1D476 + 𝑷 𝑷 # 1D477 + 𝑸 𝑸 # 1D478 + 𝑹 𝑹 # 1D479 + 𝑺 𝑺 # 1D47A + 𝑻 𝑻 # 1D47B + 𝑼 𝑼 # 1D47C + 𝑽 𝑽 # 1D47D + 𝑾 𝑾 # 1D47E + 𝑿 𝑿 # 1D47F + 𝒀 𝒀 # 1D480 + 𝒁 𝒁 # 1D481 + 𝒂 𝒂 # 1D482 + 𝒃 𝒃 # 1D483 + 𝒄 𝒄 # 1D484 + 𝒅 𝒅 # 1D485 + 𝒆 𝒆 # 1D486 + 𝒇 𝒇 # 1D487 + 𝒈 𝒈 # 1D488 + 𝒉 𝒉 # 1D489 + 𝒊 𝒊 # 1D48A + 𝒋 𝒋 # 1D48B + 𝒌 𝒌 # 1D48C + 𝒍 𝒍 # 1D48D + 𝒎 𝒎 # 1D48E + 𝒏 𝒏 # 1D48F + 𝒐 𝒐 # 1D490 + 𝒑 𝒑 # 1D491 + 𝒒 𝒒 # 1D492 + 𝒓 𝒓 # 1D493 + 𝒔 𝒔 # 1D494 + 𝒕 𝒕 # 1D495 + 𝒖 𝒖 # 1D496 + 𝒗 𝒗 # 1D497 + 𝒘 𝒘 # 1D498 + 𝒙 𝒙 # 1D499 + 𝒚 𝒚 # 1D49A + 𝒛 𝒛 # 1D49B + 𝒜 𝒜 # 1D49C + 𝒞 𝒞 # 1D49E + 𝒟 𝒟 # 1D49F + 𝒢 𝒢 # 1D4A2 + 𝒥 𝒥 # 1D4A5 + 𝒦 𝒦 # 1D4A6 + 𝒩 𝒩 # 1D4A9 + 𝒪 𝒪 # 1D4AA + 𝒫 𝒫 # 1D4AB + 𝒬 𝒬 # 1D4AC + 𝒮 𝒮 # 1D4AE + 𝒯 𝒯 # 1D4AF + 𝒰 𝒰 # 1D4B0 + 𝒱 𝒱 # 1D4B1 + 𝒲 𝒲 # 1D4B2 + 𝒳 𝒳 # 1D4B3 + 𝒴 𝒴 # 1D4B4 + 𝒵 𝒵 # 1D4B5 + 𝒶 𝒶 # 1D4B6 + 𝒷 𝒷 # 1D4B7 + 𝒸 𝒸 # 1D4B8 + 𝒹 𝒹 # 1D4B9 + 𝒻 𝒻 # 1D4BB + 𝒽 𝒽 # 1D4BD + 𝒾 𝒾 # 1D4BE + 𝒿 𝒿 # 1D4BF + 𝓀 𝓀 # 1D4C0 + 𝓁 𝓁 # 1D4C1 + 𝓂 𝓂 # 1D4C2 + 𝓃 𝓃 # 1D4C3 + 𝓅 𝓅 # 1D4C5 + 𝓆 𝓆 # 1D4C6 + 𝓇 𝓇 # 1D4C7 + 𝓈 𝓈 # 1D4C8 + 𝓉 𝓉 # 1D4C9 + 𝓊 𝓊 # 1D4CA + 𝓋 𝓋 # 1D4CB + 𝓌 𝓌 # 1D4CC + 𝓍 𝓍 # 1D4CD + 𝓎 𝓎 # 1D4CE + 𝓏 𝓏 # 1D4CF + 𝓐 𝓐 # 1D4D0 + 𝓑 𝓑 # 1D4D1 + 𝓒 𝓒 # 1D4D2 + 𝓓 𝓓 # 1D4D3 + 𝓔 𝓔 # 1D4D4 + 𝓕 𝓕 # 1D4D5 + 𝓖 𝓖 # 1D4D6 + 𝓗 𝓗 # 1D4D7 + 𝓘 𝓘 # 1D4D8 + 𝓙 𝓙 # 1D4D9 + 𝓚 𝓚 # 1D4DA + 𝓛 𝓛 # 1D4DB + 𝓜 𝓜 # 1D4DC + 𝓝 𝓝 # 1D4DD + 𝓞 𝓞 # 1D4DE + 𝓟 𝓟 # 1D4DF + 𝓠 𝓠 # 1D4E0 + 𝓡 𝓡 # 1D4E1 + 𝓢 𝓢 # 1D4E2 + 𝓣 𝓣 # 1D4E3 + 𝓤 𝓤 # 1D4E4 + 𝓥 𝓥 # 1D4E5 + 𝓦 𝓦 # 1D4E6 + 𝓧 𝓧 # 1D4E7 + 𝓨 𝓨 # 1D4E8 + 𝓩 𝓩 # 1D4E9 + 𝓪 𝓪 # 1D4EA + 𝓫 𝓫 # 1D4EB + 𝓬 𝓬 # 1D4EC + 𝓭 𝓭 # 1D4ED + 𝓮 𝓮 # 1D4EE + 𝓯 𝓯 # 1D4EF + 𝓰 𝓰 # 1D4F0 + 𝓱 𝓱 # 1D4F1 + 𝓲 𝓲 # 1D4F2 + 𝓳 𝓳 # 1D4F3 + 𝓴 𝓴 # 1D4F4 + 𝓵 𝓵 # 1D4F5 + 𝓶 𝓶 # 1D4F6 + 𝓷 𝓷 # 1D4F7 + 𝓸 𝓸 # 1D4F8 + 𝓹 𝓹 # 1D4F9 + 𝓺 𝓺 # 1D4FA + 𝓻 𝓻 # 1D4FB + 𝓼 𝓼 # 1D4FC + 𝓽 𝓽 # 1D4FD + 𝓾 𝓾 # 1D4FE + 𝓿 𝓿 # 1D4FF + 𝔀 𝔀 # 1D500 + 𝔁 𝔁 # 1D501 + 𝔂 𝔂 # 1D502 + 𝔃 𝔃 # 1D503 + 𝔄 𝔄 # 1D504 + 𝔅 𝔅 # 1D505 + 𝔇 𝔇 # 1D507 + 𝔈 𝔈 # 1D508 + 𝔉 𝔉 # 1D509 + 𝔊 𝔊 # 1D50A + 𝔍 𝔍 # 1D50D + 𝔎 𝔎 # 1D50E + 𝔏 𝔏 # 1D50F + 𝔐 𝔐 # 1D510 + 𝔑 𝔑 # 1D511 + 𝔒 𝔒 # 1D512 + 𝔓 𝔓 # 1D513 + 𝔔 𝔔 # 1D514 + 𝔖 𝔖 # 1D516 + 𝔗 𝔗 # 1D517 + 𝔘 𝔘 # 1D518 + 𝔙 𝔙 # 1D519 + 𝔚 𝔚 # 1D51A + 𝔛 𝔛 # 1D51B + 𝔜 𝔜 # 1D51C + 𝔞 𝔞 # 1D51E + 𝔟 𝔟 # 1D51F + 𝔠 𝔠 # 1D520 + 𝔡 𝔡 # 1D521 + 𝔢 𝔢 # 1D522 + 𝔣 𝔣 # 1D523 + 𝔤 𝔤 # 1D524 + 𝔥 𝔥 # 1D525 + 𝔦 𝔦 # 1D526 + 𝔧 𝔧 # 1D527 + 𝔨 𝔨 # 1D528 + 𝔩 𝔩 # 1D529 + 𝔪 𝔪 # 1D52A + 𝔫 𝔫 # 1D52B + 𝔬 𝔬 # 1D52C + 𝔭 𝔭 # 1D52D + 𝔮 𝔮 # 1D52E + 𝔯 𝔯 # 1D52F + 𝔰 𝔰 # 1D530 + 𝔱 𝔱 # 1D531 + 𝔲 𝔲 # 1D532 + 𝔳 𝔳 # 1D533 + 𝔴 𝔴 # 1D534 + 𝔵 𝔵 # 1D535 + 𝔶 𝔶 # 1D536 + 𝔷 𝔷 # 1D537 + 𝔸 𝔸 # 1D538 + 𝔹 𝔹 # 1D539 + 𝔻 𝔻 # 1D53B + 𝔼 𝔼 # 1D53C + 𝔽 𝔽 # 1D53D + 𝔾 𝔾 # 1D53E + 𝕀 𝕀 # 1D540 + 𝕁 𝕁 # 1D541 + 𝕂 𝕂 # 1D542 + 𝕃 𝕃 # 1D543 + 𝕄 𝕄 # 1D544 + 𝕆 𝕆 # 1D546 + 𝕊 𝕊 # 1D54A + 𝕋 𝕋 # 1D54B + 𝕌 𝕌 # 1D54C + 𝕍 𝕍 # 1D54D + 𝕎 𝕎 # 1D54E + 𝕏 𝕏 # 1D54F + 𝕐 𝕐 # 1D550 + 𝕒 𝕒 # 1D552 + 𝕓 𝕓 # 1D553 + 𝕔 𝕔 # 1D554 + 𝕕 𝕕 # 1D555 + 𝕖 𝕖 # 1D556 + 𝕗 𝕗 # 1D557 + 𝕘 𝕘 # 1D558 + 𝕙 𝕙 # 1D559 + 𝕚 𝕚 # 1D55A + 𝕛 𝕛 # 1D55B + 𝕜 𝕜 # 1D55C + 𝕝 𝕝 # 1D55D + 𝕞 𝕞 # 1D55E + 𝕟 𝕟 # 1D55F + 𝕠 𝕠 # 1D560 + 𝕡 𝕡 # 1D561 + 𝕢 𝕢 # 1D562 + 𝕣 𝕣 # 1D563 + 𝕤 𝕤 # 1D564 + 𝕥 𝕥 # 1D565 + 𝕦 𝕦 # 1D566 + 𝕧 𝕧 # 1D567 + 𝕨 𝕨 # 1D568 + 𝕩 𝕩 # 1D569 + 𝕪 𝕪 # 1D56A + 𝕫 𝕫 # 1D56B + 𝕬 𝕬 # 1D56C + 𝕭 𝕭 # 1D56D + 𝕮 𝕮 # 1D56E + 𝕯 𝕯 # 1D56F + 𝕰 𝕰 # 1D570 + 𝕱 𝕱 # 1D571 + 𝕲 𝕲 # 1D572 + 𝕳 𝕳 # 1D573 + 𝕴 𝕴 # 1D574 + 𝕵 𝕵 # 1D575 + 𝕶 𝕶 # 1D576 + 𝕷 𝕷 # 1D577 + 𝕸 𝕸 # 1D578 + 𝕹 𝕹 # 1D579 + 𝕺 𝕺 # 1D57A + 𝕻 𝕻 # 1D57B + 𝕼 𝕼 # 1D57C + 𝕽 𝕽 # 1D57D + 𝕾 𝕾 # 1D57E + 𝕿 𝕿 # 1D57F + 𝖀 𝖀 # 1D580 + 𝖁 𝖁 # 1D581 + 𝖂 𝖂 # 1D582 + 𝖃 𝖃 # 1D583 + 𝖄 𝖄 # 1D584 + 𝖅 𝖅 # 1D585 + 𝖆 𝖆 # 1D586 + 𝖇 𝖇 # 1D587 + 𝖈 𝖈 # 1D588 + 𝖉 𝖉 # 1D589 + 𝖊 𝖊 # 1D58A + 𝖋 𝖋 # 1D58B + 𝖌 𝖌 # 1D58C + 𝖍 𝖍 # 1D58D + 𝖎 𝖎 # 1D58E + 𝖏 𝖏 # 1D58F + 𝖐 𝖐 # 1D590 + 𝖑 𝖑 # 1D591 + 𝖒 𝖒 # 1D592 + 𝖓 𝖓 # 1D593 + 𝖔 𝖔 # 1D594 + 𝖕 𝖕 # 1D595 + 𝖖 𝖖 # 1D596 + 𝖗 𝖗 # 1D597 + 𝖘 𝖘 # 1D598 + 𝖙 𝖙 # 1D599 + 𝖚 𝖚 # 1D59A + 𝖛 𝖛 # 1D59B + 𝖜 𝖜 # 1D59C + 𝖝 𝖝 # 1D59D + 𝖞 𝖞 # 1D59E + 𝖟 𝖟 # 1D59F + 𝖠 𝖠 # 1D5A0 + 𝖡 𝖡 # 1D5A1 + 𝖢 𝖢 # 1D5A2 + 𝖣 𝖣 # 1D5A3 + 𝖤 𝖤 # 1D5A4 + 𝖥 𝖥 # 1D5A5 + 𝖦 𝖦 # 1D5A6 + 𝖧 𝖧 # 1D5A7 + 𝖨 𝖨 # 1D5A8 + 𝖩 𝖩 # 1D5A9 + 𝖪 𝖪 # 1D5AA + 𝖫 𝖫 # 1D5AB + 𝖬 𝖬 # 1D5AC + 𝖭 𝖭 # 1D5AD + 𝖮 𝖮 # 1D5AE + 𝖯 𝖯 # 1D5AF + 𝖰 𝖰 # 1D5B0 + 𝖱 𝖱 # 1D5B1 + 𝖲 𝖲 # 1D5B2 + 𝖳 𝖳 # 1D5B3 + 𝖴 𝖴 # 1D5B4 + 𝖵 𝖵 # 1D5B5 + 𝖶 𝖶 # 1D5B6 + 𝖷 𝖷 # 1D5B7 + 𝖸 𝖸 # 1D5B8 + 𝖹 𝖹 # 1D5B9 + 𝖺 𝖺 # 1D5BA + 𝖻 𝖻 # 1D5BB + 𝖼 𝖼 # 1D5BC + 𝖽 𝖽 # 1D5BD + 𝖾 𝖾 # 1D5BE + 𝖿 𝖿 # 1D5BF + 𝗀 𝗀 # 1D5C0 + 𝗁 𝗁 # 1D5C1 + 𝗂 𝗂 # 1D5C2 + 𝗃 𝗃 # 1D5C3 + 𝗄 𝗄 # 1D5C4 + 𝗅 𝗅 # 1D5C5 + 𝗆 𝗆 # 1D5C6 + 𝗇 𝗇 # 1D5C7 + 𝗈 𝗈 # 1D5C8 + 𝗉 𝗉 # 1D5C9 + 𝗊 𝗊 # 1D5CA + 𝗋 𝗋 # 1D5CB + 𝗌 𝗌 # 1D5CC + 𝗍 𝗍 # 1D5CD + 𝗎 𝗎 # 1D5CE + 𝗏 𝗏 # 1D5CF + 𝗐 𝗐 # 1D5D0 + 𝗑 𝗑 # 1D5D1 + 𝗒 𝗒 # 1D5D2 + 𝗓 𝗓 # 1D5D3 + 𝗔 𝗔 # 1D5D4 + 𝗕 𝗕 # 1D5D5 + 𝗖 𝗖 # 1D5D6 + 𝗗 𝗗 # 1D5D7 + 𝗘 𝗘 # 1D5D8 + 𝗙 𝗙 # 1D5D9 + 𝗚 𝗚 # 1D5DA + 𝗛 𝗛 # 1D5DB + 𝗜 𝗜 # 1D5DC + 𝗝 𝗝 # 1D5DD + 𝗞 𝗞 # 1D5DE + 𝗟 𝗟 # 1D5DF + 𝗠 𝗠 # 1D5E0 + 𝗡 𝗡 # 1D5E1 + 𝗢 𝗢 # 1D5E2 + 𝗣 𝗣 # 1D5E3 + 𝗤 𝗤 # 1D5E4 + 𝗥 𝗥 # 1D5E5 + 𝗦 𝗦 # 1D5E6 + 𝗧 𝗧 # 1D5E7 + 𝗨 𝗨 # 1D5E8 + 𝗩 𝗩 # 1D5E9 + 𝗪 𝗪 # 1D5EA + 𝗫 𝗫 # 1D5EB + 𝗬 𝗬 # 1D5EC + 𝗭 𝗭 # 1D5ED + 𝗮 𝗮 # 1D5EE + 𝗯 𝗯 # 1D5EF + 𝗰 𝗰 # 1D5F0 + 𝗱 𝗱 # 1D5F1 + 𝗲 𝗲 # 1D5F2 + 𝗳 𝗳 # 1D5F3 + 𝗴 𝗴 # 1D5F4 + 𝗵 𝗵 # 1D5F5 + 𝗶 𝗶 # 1D5F6 + 𝗷 𝗷 # 1D5F7 + 𝗸 𝗸 # 1D5F8 + 𝗹 𝗹 # 1D5F9 + 𝗺 𝗺 # 1D5FA + 𝗻 𝗻 # 1D5FB + 𝗼 𝗼 # 1D5FC + 𝗽 𝗽 # 1D5FD + 𝗾 𝗾 # 1D5FE + 𝗿 𝗿 # 1D5FF + 𝘀 𝘀 # 1D600 + 𝘁 𝘁 # 1D601 + 𝘂 𝘂 # 1D602 + 𝘃 𝘃 # 1D603 + 𝘄 𝘄 # 1D604 + 𝘅 𝘅 # 1D605 + 𝘆 𝘆 # 1D606 + 𝘇 𝘇 # 1D607 + 𝘈 𝘈 # 1D608 + 𝘉 𝘉 # 1D609 + 𝘊 𝘊 # 1D60A + 𝘋 𝘋 # 1D60B + 𝘌 𝘌 # 1D60C + 𝘍 𝘍 # 1D60D + 𝘎 𝘎 # 1D60E + 𝘏 𝘏 # 1D60F + 𝘐 𝘐 # 1D610 + 𝘑 𝘑 # 1D611 + 𝘒 𝘒 # 1D612 + 𝘓 𝘓 # 1D613 + 𝘔 𝘔 # 1D614 + 𝘕 𝘕 # 1D615 + 𝘖 𝘖 # 1D616 + 𝘗 𝘗 # 1D617 + 𝘘 𝘘 # 1D618 + 𝘙 𝘙 # 1D619 + 𝘚 𝘚 # 1D61A + 𝘛 𝘛 # 1D61B + 𝘜 𝘜 # 1D61C + 𝘝 𝘝 # 1D61D + 𝘞 𝘞 # 1D61E + 𝘟 𝘟 # 1D61F + 𝘠 𝘠 # 1D620 + 𝘡 𝘡 # 1D621 + 𝘢 𝘢 # 1D622 + 𝘣 𝘣 # 1D623 + 𝘤 𝘤 # 1D624 + 𝘥 𝘥 # 1D625 + 𝘦 𝘦 # 1D626 + 𝘧 𝘧 # 1D627 + 𝘨 𝘨 # 1D628 + 𝘩 𝘩 # 1D629 + 𝘪 𝘪 # 1D62A + 𝘫 𝘫 # 1D62B + 𝘬 𝘬 # 1D62C + 𝘭 𝘭 # 1D62D + 𝘮 𝘮 # 1D62E + 𝘯 𝘯 # 1D62F + 𝘰 𝘰 # 1D630 + 𝘱 𝘱 # 1D631 + 𝘲 𝘲 # 1D632 + 𝘳 𝘳 # 1D633 + 𝘴 𝘴 # 1D634 + 𝘵 𝘵 # 1D635 + 𝘶 𝘶 # 1D636 + 𝘷 𝘷 # 1D637 + 𝘸 𝘸 # 1D638 + 𝘹 𝘹 # 1D639 + 𝘺 𝘺 # 1D63A + 𝘻 𝘻 # 1D63B + 𝘼 𝘼 # 1D63C + 𝘽 𝘽 # 1D63D + 𝘾 𝘾 # 1D63E + 𝘿 𝘿 # 1D63F + 𝙀 𝙀 # 1D640 + 𝙁 𝙁 # 1D641 + 𝙂 𝙂 # 1D642 + 𝙃 𝙃 # 1D643 + 𝙄 𝙄 # 1D644 + 𝙅 𝙅 # 1D645 + 𝙆 𝙆 # 1D646 + 𝙇 𝙇 # 1D647 + 𝙈 𝙈 # 1D648 + 𝙉 𝙉 # 1D649 + 𝙊 𝙊 # 1D64A + 𝙋 𝙋 # 1D64B + 𝙌 𝙌 # 1D64C + 𝙍 𝙍 # 1D64D + 𝙎 𝙎 # 1D64E + 𝙏 𝙏 # 1D64F + 𝙐 𝙐 # 1D650 + 𝙑 𝙑 # 1D651 + 𝙒 𝙒 # 1D652 + 𝙓 𝙓 # 1D653 + 𝙔 𝙔 # 1D654 + 𝙕 𝙕 # 1D655 + 𝙖 𝙖 # 1D656 + 𝙗 𝙗 # 1D657 + 𝙘 𝙘 # 1D658 + 𝙙 𝙙 # 1D659 + 𝙚 𝙚 # 1D65A + 𝙛 𝙛 # 1D65B + 𝙜 𝙜 # 1D65C + 𝙝 𝙝 # 1D65D + 𝙞 𝙞 # 1D65E + 𝙟 𝙟 # 1D65F + 𝙠 𝙠 # 1D660 + 𝙡 𝙡 # 1D661 + 𝙢 𝙢 # 1D662 + 𝙣 𝙣 # 1D663 + 𝙤 𝙤 # 1D664 + 𝙥 𝙥 # 1D665 + 𝙦 𝙦 # 1D666 + 𝙧 𝙧 # 1D667 + 𝙨 𝙨 # 1D668 + 𝙩 𝙩 # 1D669 + 𝙪 𝙪 # 1D66A + 𝙫 𝙫 # 1D66B + 𝙬 𝙬 # 1D66C + 𝙭 𝙭 # 1D66D + 𝙮 𝙮 # 1D66E + 𝙯 𝙯 # 1D66F + 𝙰 𝙰 # 1D670 + 𝙱 𝙱 # 1D671 + 𝙲 𝙲 # 1D672 + 𝙳 𝙳 # 1D673 + 𝙴 𝙴 # 1D674 + 𝙵 𝙵 # 1D675 + 𝙶 𝙶 # 1D676 + 𝙷 𝙷 # 1D677 + 𝙸 𝙸 # 1D678 + 𝙹 𝙹 # 1D679 + 𝙺 𝙺 # 1D67A + 𝙻 𝙻 # 1D67B + 𝙼 𝙼 # 1D67C + 𝙽 𝙽 # 1D67D + 𝙾 𝙾 # 1D67E + 𝙿 𝙿 # 1D67F + 𝚀 𝚀 # 1D680 + 𝚁 𝚁 # 1D681 + 𝚂 𝚂 # 1D682 + 𝚃 𝚃 # 1D683 + 𝚄 𝚄 # 1D684 + 𝚅 𝚅 # 1D685 + 𝚆 𝚆 # 1D686 + 𝚇 𝚇 # 1D687 + 𝚈 𝚈 # 1D688 + 𝚉 𝚉 # 1D689 + 𝚊 𝚊 # 1D68A + 𝚋 𝚋 # 1D68B + 𝚌 𝚌 # 1D68C + 𝚍 𝚍 # 1D68D + 𝚎 𝚎 # 1D68E + 𝚏 𝚏 # 1D68F + 𝚐 𝚐 # 1D690 + 𝚑 𝚑 # 1D691 + 𝚒 𝚒 # 1D692 + 𝚓 𝚓 # 1D693 + 𝚔 𝚔 # 1D694 + 𝚕 𝚕 # 1D695 + 𝚖 𝚖 # 1D696 + 𝚗 𝚗 # 1D697 + 𝚘 𝚘 # 1D698 + 𝚙 𝚙 # 1D699 + 𝚚 𝚚 # 1D69A + 𝚛 𝚛 # 1D69B + 𝚜 𝚜 # 1D69C + 𝚝 𝚝 # 1D69D + 𝚞 𝚞 # 1D69E + 𝚟 𝚟 # 1D69F + 𝚠 𝚠 # 1D6A0 + 𝚡 𝚡 # 1D6A1 + 𝚢 𝚢 # 1D6A2 + 𝚣 𝚣 # 1D6A3 + 𝚤 𝚤 # 1D6A4 + 𝚥 𝚥 # 1D6A5 + 𝚨 𝚨 # 1D6A8 + 𝚩 𝚩 # 1D6A9 + 𝚪 𝚪 # 1D6AA + 𝚫 𝚫 # 1D6AB + 𝚬 𝚬 # 1D6AC + 𝚭 𝚭 # 1D6AD + 𝚮 𝚮 # 1D6AE + 𝚯 𝚯 # 1D6AF + 𝚰 𝚰 # 1D6B0 + 𝚱 𝚱 # 1D6B1 + 𝚲 𝚲 # 1D6B2 + 𝚳 𝚳 # 1D6B3 + 𝚴 𝚴 # 1D6B4 + 𝚵 𝚵 # 1D6B5 + 𝚶 𝚶 # 1D6B6 + 𝚷 𝚷 # 1D6B7 + 𝚸 𝚸 # 1D6B8 + 𝚹 𝚹 # 1D6B9 + 𝚺 𝚺 # 1D6BA + 𝚻 𝚻 # 1D6BB + 𝚼 𝚼 # 1D6BC + 𝚽 𝚽 # 1D6BD + 𝚾 𝚾 # 1D6BE + 𝚿 𝚿 # 1D6BF + 𝛀 𝛀 # 1D6C0 + 𝛂 𝛂 # 1D6C2 + 𝛃 𝛃 # 1D6C3 + 𝛄 𝛄 # 1D6C4 + 𝛅 𝛅 # 1D6C5 + 𝛆 𝛆 # 1D6C6 + 𝛇 𝛇 # 1D6C7 + 𝛈 𝛈 # 1D6C8 + 𝛉 𝛉 # 1D6C9 + 𝛊 𝛊 # 1D6CA + 𝛋 𝛋 # 1D6CB + 𝛌 𝛌 # 1D6CC + 𝛍 𝛍 # 1D6CD + 𝛎 𝛎 # 1D6CE + 𝛏 𝛏 # 1D6CF + 𝛐 𝛐 # 1D6D0 + 𝛑 𝛑 # 1D6D1 + 𝛒 𝛒 # 1D6D2 + 𝛓 𝛓 # 1D6D3 + 𝛔 𝛔 # 1D6D4 + 𝛕 𝛕 # 1D6D5 + 𝛖 𝛖 # 1D6D6 + 𝛗 𝛗 # 1D6D7 + 𝛘 𝛘 # 1D6D8 + 𝛙 𝛙 # 1D6D9 + 𝛚 𝛚 # 1D6DA + 𝛜 𝛜 # 1D6DC + 𝛝 𝛝 # 1D6DD + 𝛞 𝛞 # 1D6DE + 𝛟 𝛟 # 1D6DF + 𝛠 𝛠 # 1D6E0 + 𝛡 𝛡 # 1D6E1 + 𝛢 𝛢 # 1D6E2 + 𝛣 𝛣 # 1D6E3 + 𝛤 𝛤 # 1D6E4 + 𝛥 𝛥 # 1D6E5 + 𝛦 𝛦 # 1D6E6 + 𝛧 𝛧 # 1D6E7 + 𝛨 𝛨 # 1D6E8 + 𝛩 𝛩 # 1D6E9 + 𝛪 𝛪 # 1D6EA + 𝛫 𝛫 # 1D6EB + 𝛬 𝛬 # 1D6EC + 𝛭 𝛭 # 1D6ED + 𝛮 𝛮 # 1D6EE + 𝛯 𝛯 # 1D6EF + 𝛰 𝛰 # 1D6F0 + 𝛱 𝛱 # 1D6F1 + 𝛲 𝛲 # 1D6F2 + 𝛳 𝛳 # 1D6F3 + 𝛴 𝛴 # 1D6F4 + 𝛵 𝛵 # 1D6F5 + 𝛶 𝛶 # 1D6F6 + 𝛷 𝛷 # 1D6F7 + 𝛸 𝛸 # 1D6F8 + 𝛹 𝛹 # 1D6F9 + 𝛺 𝛺 # 1D6FA + 𝛼 𝛼 # 1D6FC + 𝛽 𝛽 # 1D6FD + 𝛾 𝛾 # 1D6FE + 𝛿 𝛿 # 1D6FF + 𝜀 𝜀 # 1D700 + 𝜁 𝜁 # 1D701 + 𝜂 𝜂 # 1D702 + 𝜃 𝜃 # 1D703 + 𝜄 𝜄 # 1D704 + 𝜅 𝜅 # 1D705 + 𝜆 𝜆 # 1D706 + 𝜇 𝜇 # 1D707 + 𝜈 𝜈 # 1D708 + 𝜉 𝜉 # 1D709 + 𝜊 𝜊 # 1D70A + 𝜋 𝜋 # 1D70B + 𝜌 𝜌 # 1D70C + 𝜍 𝜍 # 1D70D + 𝜎 𝜎 # 1D70E + 𝜏 𝜏 # 1D70F + 𝜐 𝜐 # 1D710 + 𝜑 𝜑 # 1D711 + 𝜒 𝜒 # 1D712 + 𝜓 𝜓 # 1D713 + 𝜔 𝜔 # 1D714 + 𝜖 𝜖 # 1D716 + 𝜗 𝜗 # 1D717 + 𝜘 𝜘 # 1D718 + 𝜙 𝜙 # 1D719 + 𝜚 𝜚 # 1D71A + 𝜛 𝜛 # 1D71B + 𝜜 𝜜 # 1D71C + 𝜝 𝜝 # 1D71D + 𝜞 𝜞 # 1D71E + 𝜟 𝜟 # 1D71F + 𝜠 𝜠 # 1D720 + 𝜡 𝜡 # 1D721 + 𝜢 𝜢 # 1D722 + 𝜣 𝜣 # 1D723 + 𝜤 𝜤 # 1D724 + 𝜥 𝜥 # 1D725 + 𝜦 𝜦 # 1D726 + 𝜧 𝜧 # 1D727 + 𝜨 𝜨 # 1D728 + 𝜩 𝜩 # 1D729 + 𝜪 𝜪 # 1D72A + 𝜫 𝜫 # 1D72B + 𝜬 𝜬 # 1D72C + 𝜭 𝜭 # 1D72D + 𝜮 𝜮 # 1D72E + 𝜯 𝜯 # 1D72F + 𝜰 𝜰 # 1D730 + 𝜱 𝜱 # 1D731 + 𝜲 𝜲 # 1D732 + 𝜳 𝜳 # 1D733 + 𝜴 𝜴 # 1D734 + 𝜶 𝜶 # 1D736 + 𝜷 𝜷 # 1D737 + 𝜸 𝜸 # 1D738 + 𝜹 𝜹 # 1D739 + 𝜺 𝜺 # 1D73A + 𝜻 𝜻 # 1D73B + 𝜼 𝜼 # 1D73C + 𝜽 𝜽 # 1D73D + 𝜾 𝜾 # 1D73E + 𝜿 𝜿 # 1D73F + 𝝀 𝝀 # 1D740 + 𝝁 𝝁 # 1D741 + 𝝂 𝝂 # 1D742 + 𝝃 𝝃 # 1D743 + 𝝄 𝝄 # 1D744 + 𝝅 𝝅 # 1D745 + 𝝆 𝝆 # 1D746 + 𝝇 𝝇 # 1D747 + 𝝈 𝝈 # 1D748 + 𝝉 𝝉 # 1D749 + 𝝊 𝝊 # 1D74A + 𝝋 𝝋 # 1D74B + 𝝌 𝝌 # 1D74C + 𝝍 𝝍 # 1D74D + 𝝎 𝝎 # 1D74E + 𝝐 𝝐 # 1D750 + 𝝑 𝝑 # 1D751 + 𝝒 𝝒 # 1D752 + 𝝓 𝝓 # 1D753 + 𝝔 𝝔 # 1D754 + 𝝕 𝝕 # 1D755 + 𝝖 𝝖 # 1D756 + 𝝗 𝝗 # 1D757 + 𝝘 𝝘 # 1D758 + 𝝙 𝝙 # 1D759 + 𝝚 𝝚 # 1D75A + 𝝛 𝝛 # 1D75B + 𝝜 𝝜 # 1D75C + 𝝝 𝝝 # 1D75D + 𝝞 𝝞 # 1D75E + 𝝟 𝝟 # 1D75F + 𝝠 𝝠 # 1D760 + 𝝡 𝝡 # 1D761 + 𝝢 𝝢 # 1D762 + 𝝣 𝝣 # 1D763 + 𝝤 𝝤 # 1D764 + 𝝥 𝝥 # 1D765 + 𝝦 𝝦 # 1D766 + 𝝧 𝝧 # 1D767 + 𝝨 𝝨 # 1D768 + 𝝩 𝝩 # 1D769 + 𝝪 𝝪 # 1D76A + 𝝫 𝝫 # 1D76B + 𝝬 𝝬 # 1D76C + 𝝭 𝝭 # 1D76D + 𝝮 𝝮 # 1D76E + 𝝰 𝝰 # 1D770 + 𝝱 𝝱 # 1D771 + 𝝲 𝝲 # 1D772 + 𝝳 𝝳 # 1D773 + 𝝴 𝝴 # 1D774 + 𝝵 𝝵 # 1D775 + 𝝶 𝝶 # 1D776 + 𝝷 𝝷 # 1D777 + 𝝸 𝝸 # 1D778 + 𝝹 𝝹 # 1D779 + 𝝺 𝝺 # 1D77A + 𝝻 𝝻 # 1D77B + 𝝼 𝝼 # 1D77C + 𝝽 𝝽 # 1D77D + 𝝾 𝝾 # 1D77E + 𝝿 𝝿 # 1D77F + 𝞀 𝞀 # 1D780 + 𝞁 𝞁 # 1D781 + 𝞂 𝞂 # 1D782 + 𝞃 𝞃 # 1D783 + 𝞄 𝞄 # 1D784 + 𝞅 𝞅 # 1D785 + 𝞆 𝞆 # 1D786 + 𝞇 𝞇 # 1D787 + 𝞈 𝞈 # 1D788 + 𝞊 𝞊 # 1D78A + 𝞋 𝞋 # 1D78B + 𝞌 𝞌 # 1D78C + 𝞍 𝞍 # 1D78D + 𝞎 𝞎 # 1D78E + 𝞏 𝞏 # 1D78F + 𝞐 𝞐 # 1D790 + 𝞑 𝞑 # 1D791 + 𝞒 𝞒 # 1D792 + 𝞓 𝞓 # 1D793 + 𝞔 𝞔 # 1D794 + 𝞕 𝞕 # 1D795 + 𝞖 𝞖 # 1D796 + 𝞗 𝞗 # 1D797 + 𝞘 𝞘 # 1D798 + 𝞙 𝞙 # 1D799 + 𝞚 𝞚 # 1D79A + 𝞛 𝞛 # 1D79B + 𝞜 𝞜 # 1D79C + 𝞝 𝞝 # 1D79D + 𝞞 𝞞 # 1D79E + 𝞟 𝞟 # 1D79F + 𝞠 𝞠 # 1D7A0 + 𝞡 𝞡 # 1D7A1 + 𝞢 𝞢 # 1D7A2 + 𝞣 𝞣 # 1D7A3 + 𝞤 𝞤 # 1D7A4 + 𝞥 𝞥 # 1D7A5 + 𝞦 𝞦 # 1D7A6 + 𝞧 𝞧 # 1D7A7 + 𝞨 𝞨 # 1D7A8 + 𝞪 𝞪 # 1D7AA + 𝞫 𝞫 # 1D7AB + 𝞬 𝞬 # 1D7AC + 𝞭 𝞭 # 1D7AD + 𝞮 𝞮 # 1D7AE + 𝞯 𝞯 # 1D7AF + 𝞰 𝞰 # 1D7B0 + 𝞱 𝞱 # 1D7B1 + 𝞲 𝞲 # 1D7B2 + 𝞳 𝞳 # 1D7B3 + 𝞴 𝞴 # 1D7B4 + 𝞵 𝞵 # 1D7B5 + 𝞶 𝞶 # 1D7B6 + 𝞷 𝞷 # 1D7B7 + 𝞸 𝞸 # 1D7B8 + 𝞹 𝞹 # 1D7B9 + 𝞺 𝞺 # 1D7BA + 𝞻 𝞻 # 1D7BB + 𝞼 𝞼 # 1D7BC + 𝞽 𝞽 # 1D7BD + 𝞾 𝞾 # 1D7BE + 𝞿 𝞿 # 1D7BF + 𝟀 𝟀 # 1D7C0 + 𝟁 𝟁 # 1D7C1 + 𝟂 𝟂 # 1D7C2 + 𝟄 𝟄 # 1D7C4 + 𝟅 𝟅 # 1D7C5 + 𝟆 𝟆 # 1D7C6 + 𝟇 𝟇 # 1D7C7 + 𝟈 𝟈 # 1D7C8 + 𝟉 𝟉 # 1D7C9 + 𝟊 𝟊 # 1D7CA + 𝟋 𝟋 # 1D7CB diff --git a/tests/checksum-test.c b/tests/checksum-test.c new file mode 100644 index 0000000..dc1a61e --- /dev/null +++ b/tests/checksum-test.c @@ -0,0 +1,676 @@ +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +/* Test GChecksum by computing the checksums of every initial + * substring of this string, calling g_checksum_update with chunks of + * every possible size. That is, first it computes the checksums of + * "", then "T". Then it computes the checksums of "Th", first by + * feeding the GChecksum 1 letter a time, then 2. Then it does "The", + * first feeding it one letter at a time, then 2, then 3. Etc. + * + * MD5, SHA1, and SHA256 all use a 64-byte buffer internally; this + * string is intentionally more than twice that length. + */ + +#define FIXED_STR "The quick brown fox jumps over the lazy dog. Jackdaws love my big sphinx of quartz. Pack my box with five dozen liquor jugs. How razorback-jumping frogs can level six piqued gymnasts!" +#define FIXED_LEN (strlen (FIXED_STR)) + +const char *MD5_sums[] = { + "d41d8cd98f00b204e9800998ecf8427e", + "b9ece18c950afbfa6b0fdbfa4ff731d3", + "eeeb9a8eb45dd351d9ec0eb4acce66ce", + "a4704fd35f0308287f2937ba3eccf5fe", + "02edd93949f6d3c57d9822691b59f649", + "6131a51747610d0ae4e86c3a3416788c", + "8c871099d54c09d4099fa7a0e77c9113", + "bbb9873bad399cd1cc0d5e336ca5beee", + "b9b926544b8ecd5c3ef553a87170b726", + "912d57cea222bc1730dd531b9d6afbb6", + "03c729679ca3252a4735c4148b7c11e3", + "d7027ce01f22eb9d2bb32d9a153a7e29", + "e05e6a516c92259691cf9194dfdeff92", + "dd1ac3c70b6f51dd545cdf64053209d4", + "caa1e1e79c65480a48cf08a38ac1d87d", + "5aa207e85988921b8733912c4f526c80", + "b0e45b65d9e1d88169c40dc47605e2d9", + "e4b6d6fabe9dfcbe83a51d19df5f0ac3", + "168534eca593b6cef86aea9081f0f5bf", + "a2004f37730b9445670a738fa0fc9ee5", + "c4314972a672ded8759cafdca9af3238", + "29dcbbf4add427ccba06d3c37ad44aa9", + "d0312d0e9e2d8c063d95a06fbbba9cb1", + "770fd972e360cb8538ce6a880741936e", + "8e53cb84ef3d981a86fbb69b24827c46", + "83de97cab1f553eb3acc22866a4f6942", + "a2829f93d701f36d808d0a698dcebf02", + "efcead92aba26426db84b75413f17c10", + "60a0732774106c2348eb576596668eb9", + "d44f138aa2f39488c03391771eea258c", + "f85199fa76594dfb190fab5dfe42a769", + "cd4c02f190df2372cb703994dd84e881", + "566cb723d4fb7a7dd38163532fe760b7", + "4433001bd59da157c18b09f6c10d4163", + "b76b517e01f5b708af50af906adb2dac", + "0f611396bcfe9ab7666c45ebd37e59ba", + "4c6606c2117565959048d356c1d7f6cc", + "5f7f3f510b8a8f0a5e1d6193c6c7f3af", + "542560ce828579cfe777aa165b4d1bed", + "171e092149d366acca00d1cd783e61cd", + "4ed8b5a69f7c329f498320947db666f2", + "eb4c251a5abb3c59d306276ba2dc644d", + "2b6e07526e77047d7935681efc3b9f90", + "9e107d9d372bb6826bd81d3542a419d6", + "e4d909c290d0fb1ca068ffaddf22cbd0", + "1c6d98786bea70b9c34ce7f33201120c", + "bdda04a65a37f97d3ac3be6b0d5f58ea", + "954c69b280f0b5eed4b36eb714d26f82", + "e5fad54e00d29bf5b1671b3d351624e9", + "1a0b3d4eec1bd869af85945f60ff19c3", + "055031167bd9f17448623653eb4b27ed", + "4ca7c851615ea3abc43b5e1df410b84a", + "774873408e0032f8c56106dc28d489e2", + "fc44cc8ad9ff4aef8a4187688cb65378", + "b939f1b04b296ac8ff8261876ae86704", + "de9362af59e6e23688a243f909e9fdbd", + "6827a93d7492d3da381d7b45f2a0b94f", + "459ade91c05ca5f8bfdc8c3f6014ce04", + "55b143ec7d943b04666010e165d753e0", + "04ad29c207b52f46fd50f208744d936d", + "8d26f6529919e3d3e33b5e147e96bd8c", + "de98a267f5acd95c52bf439be075f360", + "4a8a2b0f0cc485c957992c6c9865b33d", + "566f00c9d7ac74a1daeb2925de2aca23", + "6ebee39c52840729c65d815fbdb9e9c7", + "7dc322a68ec5881e78cb718a3ca9a557", + "b00112c2c7844e0c6c0cab1fdc7a12ab", + "6f78ec779e96448daa9675bf06a0dbe3", + "8bba94005e06aefd071ed8a5c1b89068", + "220316718ce3875281be580a731ef0a1", + "7dd175908a4fce0e510287a9f884ef1d", + "030d864e63a6b67e11084f27ac5a422f", + "cad084c9d6c71aa60c414b3df22e4ef2", + "a10296630814335017df32f94b5202ff", + "de23bdf63d07cc75716e1e303df0677c", + "9718898182f2ba3a4428d9e357f5788e", + "9dfc12c4b82dcf727fc6599a0696a48c", + "6cca243870d308ffe8ae51993258e9ef", + "6b425096ac7743989c9744ff45ea027f", + "742a87784ffd6e2b0697aabf6b453309", + "b9b7f74d898d1fe768777bd7fb7844e7", + "4717614d82c1df37d608111953c75912", + "43298b7db8498f89b9aa1bcb410a8ed2", + "1b3621f615f0861d672d406257f5a97b", + "9ef3e55a2eb9d5d41f9f850cc86f8fea", + "3ec2cbcec99a048d9410c64a61796b0f", + "e75f9f48ac684c1c49a256df39ac118b", + "3518518b7b3b87f298d0518ccab65534", + "d936105bf33a89e00fe8ed8711b732d3", + "70858151e61f8862decb044c2050ae40", + "81491684aa39d20b064ceff099a3175b", + "bd73078b5a0a3a6d40fb1376347d64a6", + "9da1f6dc1bc2ffb5ccafa14a04ff5f84", + "a5c9c51a8981234ef59a969e3ad147ef", + "c105573b4d5ef469c7867094b4e589e1", + "d479c97efb06a112534196e257192c4a", + "fc7b07eb35cc515c1beb93aaa4e51a64", + "83470666e83e382a35d97f406f79eb70", + "e2ecf716fa93c1e1764a8e584cbffe04", + "534a7c131ee92bd5c9105cd293a9fa6e", + "5afea20e81c95d55e70bb0805158d207", + "8bb0ebc08bd51a0f62808c76005d5d33", + "c689312f4c99858ba414b63b61408f7b", + "cf1636f7d96fae80a428db4dbd93450d", + "963b816a27e6432c8200f35c11cb3d18", + "2dcd8661e650a8efe99642df35e1c0a4", + "2f6207c7ae99db3da286ebdb98b10f60", + "b515b746e01836e24966ff679f9dde6b", + "5b53b6ca7982077b891b03ae9546984d", + "4c57e9d52f8e782b44304f2d4613456d", + "7f28eb1a0f03dd38c73da46973299d00", + "997d1c07005040126addd2dbecc623fc", + "817dbe3e415b05eca731e27ca792adbc", + "ebffcb6fd54cfc146afe9485884b540e", + "2d6394332758bd5411eada08d85af3d6", + "27e0d08eda3a775290e0962483fa5ec8", + "d444cd632037609ccb972ce79009b16e", + "31c0453b13e1dd83f6ea55b7be54da15", + "aa95999a313b3794d7902a751ee77c05", + "cd30f6386d09f62f49537b2d23ea713e", + "149a308e31876049d76b7393512451d6", + "d0d4a7c2254d9f8c18668c103a3d7f82", + "1f822faa98bc97d382fb28019730daf3", + "a59e31843f29f63c8ec857084fd91161", + "e871798ecb332a9a082ab69d747c624d", + "dba105cfd9294cbc4269096d9c682b89", + "c9cbdc59fb3afff3051b33788d1e946a", + "890247b165402b325ac88212b21e4e42", + "777c5b13c598663f136be27451b5379a", + "888e851163704b4fed2d9b82e51aff16", + "3069f2cddd3a17dd655c61372def9c0d", + "39ae3b6ae2e9ecf5f0c25eff8d52ddef", + "058dcd07dc12be85774e7f72587bfe43", + "522c5460f239de773cdbcefb4d55b129", + "c6b5babfeaae6d7bb86c1c2b64fa1b56", + "fffa674d8c9bcb251c0ab3cf9d7aec89", + "7aabad234a1f9f05ef6c5fb6ddc15b0a", + "9b3ca93cfa10b081de65516d67170e3b", + "1990bf44ba11b087af262e017d8c823e", + "072e4bc6ef0ee5d9e7c56dafb9f65088", + "e2825a9231a65676a7b79b648fd94fcb", + "ab864a28e6eac29000429a5536fd9cf9", + "decfbab07f8d11187365c385f12d038b", + "1f0dd358531e06187d33964d0e0e115f", + "acdf4cc64f0c62013621d6ebc69687d2", + "6827965643e24616e892e5636f1265c9", + "2daed5786790d38ede194d351b383d46", + "eb05cb49a9e01e2c0a1329c2d1859394", + "83065746806dbca73e787939d359e74c", + "0a318bc9d7e2d4d03a96e755fd2214f6", + "85421302d14c37029512ab3e848c4498", + "02ee794a181044b80588bd14f76ea4dd", + "abeca493fed89cd65ed112e069a695c1", + "e5828e0a11268c9baaaac24bd46d1e15", + "e0a8b89702312967460ad9940aa108d5", + "6e5c8f2aacd19e70d15be253369cdfc4", + "eabc6ce71e74b5b48150ceda5a916948", + "5c263ad8e8dc1fd66e9b35daf7f74c48", + "030b2b56e20c53b75191369104b9509a", + "1225f4418731a8e7944d1366efd89234", + "9085ba0fe1c64c3dce45708de32c3440", + "49efb746a4938e7da19ecb3bb2c8e1d3", + "833095be66f1f7b5942a817846c97ed5", + "28f9f64eba29e57a7bd4bc0840aedf90", + "9b5984b93bd951a70dea62942634c009", + "ddb73667065d5ab761612be590e339e5", + "59c4b46e73c2679610b7a4e9b3a04bc1", + "fcc2a983de8f0ebb193864e0c60a00a6", + "af8f1f4bb88555d688508eb9f3c876ac", + "814e087171d6a45ac4fb4a110e889a38", + "733130f693a1c3a24703052717330807", + "b319f375927ed3f197a26c1112df86ae", + "ace1c7e7c2ffcfe31a042d2b9ae00905", + "5231c151c22b31180e900647fd5097ed", + "07e7238f4f3d8b3a279a2d9f78fa8b08", + "208b1f437aac92a96eef5ec9ca5d53da", + "3a675752c5faa15bd61c63499684c570", + "efa1debf8fb84e142c83c0dcf221d247", + "d940ea701a781a4ff62a99d831c2286a", + "d88294e690a6375d22b12fcc88bebb56", + "f209ebcae30e147ccd9e42d32cfe33b4", + "fbf1e18620fe5a9c40a65cbbd50af177", + "4e682a50db552d15bfe109a1147f6770", + "407b72260377f77f8e63e13dc09bda2c" +}; + +const char *SHA1_sums[] = { + "da39a3ee5e6b4b0d3255bfef95601890afd80709", + "c2c53d66948214258a26ca9ca845d7ac0c17f8e7", + "6929e765f6bd128088cdf81ba4805d3a84da4e5e", + "93ef0dd827103681fcee453b78be2ff14e1a261d", + "9f7ed32a201bab6d11f7be88b9335973d93de3f5", + "a2b847dd0e90bca83b418103baa63c67c85b5a30", + "ee4801c9d009963ac6dda49b100f0d9a9f3983b2", + "0dab89aa7606af6df94d1c3f8872ca98440ce299", + "2eb3456b1b4fb96df1309eff21b02814663f939a", + "30b59bc6c7c1622283a23950f2984bc5cd4fdd51", + "4d39faadbf264f3fb59268228994276c36fc3172", + "8312b76dd9300bcbbd9c5148461949f31f593bdc", + "0d12bfd71a11c686cf53adaacf0bec05c557e768", + "ca150c0c3372de80daa720b7d4081022b7befbe4", + "d2ac2275af550efdde0aca4713835f3480498387", + "07bb8c8ec36e16d57141fbf95fb8478a668b451f", + "6ad802395de4400a9892c9f65868879bee5d1bf6", + "569c7018c812f0cc51c093dbc026baebaab1eb22", + "b8cfd76b506e7aaeb55c3d4e73e8868df8c4dfb1", + "c519c1a06cdbeb2bc499e22137fb48683858b345", + "3e3436a073e72c5300cdca6ce5c321e49dfc412e", + "e2b72fb64787db45dc11bca1f194bef40b5be347", + "52f4aaab2d5f9bc918700c517253e5bd6981ba95", + "001233b5471e0bfa33f8133cf3cc3b97351033a5", + "b2cc1f24e2599121adf86c5161dfe43fd5486985", + "743e27565bb39d4cf6cdf7b19450f94ef12b2206", + "6b57e81439c46aca165e5eacd44c0829670c9bb5", + "4bbe681b61206e8689fce488662e7be67053ad03", + "332ffb34a55ebf0b01beb604bca729887fd4c047", + "b09b432ae19ca6971bb28a3705c9be3b02ec388f", + "051605798e587fd98b428b88077d015494978bda", + "33d579648c883c1b3a2ba91b7d4efd79d2d04e65", + "d035de80a23137cd473991fea53b6b1b1f22e57d", + "4ed82184201c1063c9f89d83b01d277e2db0847c", + "1477d62ad76e1d543380ce2f4253a701fe039af2", + "df72568859f54940e93ba5ace28430d38e4ab10f", + "65ebceacd76a51d7076728d8ecbfcb1a4014fe3d", + "0f5f0f1c642e616224d356a835ed3d054935608a", + "caa9daf50b65b3739eb9a88547c516d89b72ac11", + "1e9c81970164a681a35993d773e1d55d328ed64b", + "8aefdcfcbaa21522fb39162d7507492e47b30f25", + "a374c23022eea446300e1b3303272bdb8f6cfab3", + "f2f38c31109f8a9421f301e9d554193bc4274a32", + "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12", + "408d94384216f890ff7a0c3528e8bed1e0b01621", + "22b759d30862cc7c7eb3ce9616a9d4e853b1e14d", + "97e2821bba8dbd62f7823b7ecf095dad5d152371", + "190c9e3674d72f3abfa027a38a425de21ea124a5", + "8a9f1acbeb7dea1bdb61c0e5885043caa84c3812", + "8431fa593176872aea33d2ece77fff42f22c409b", + "08efef7adec17bd8d97f24cc373bfeab4b602d7a", + "669f7e46d635f02a355635d9a09bf3bf2936bcf8", + "695ed476d76f489707db6862a6411973d0207558", + "084ef870fa0d4674d8488040a3d147235cfcb50d", + "2a7d533528fcdaa6795ece88ab526b3e077f4f52", + "4546fb23d600a7e358edf7033eef05af19b4fb1f", + "59c3623fbc8c29341481a7fead82ef6b3aa43d93", + "806b2e0c9be4502325b23d20f085b6d8dd8f559b", + "113382ddaeee3a9880b3328b4240ae9e750be3cd", + "543bef2867245f702b77470bfe08350cff1090ab", + "977eb8d9219bae5415e13656113e30d66c2f5b45", + "58153daaa0ec2e5f3e96879a33aee162f0c1283c", + "6663fde567230f1d0247dc7ea3144b3aedac160e", + "b418a310c03a4795b9ed4577c876b9dc50c18481", + "75c2add8fd09dedee1f2728426f5e94f9860d062", + "3f188f1a66fd317b645ea7eecebcae844bba9944", + "049296261ba622294ec83fbe8f5cb0d2cc3c475e", + "c60fe6fe0ea55fb34b3b5e740400c495e305597b", + "64df347932a61deb5ed0e41e811d24cdf745c7a8", + "eaaf91d87507541a572b693cd53cb31a4ff3ac2b", + "712424206790276862399340047ca6d6028ab2e0", + "2cc40cd0dd42274998746980844a8df708a3af94", + "da0ba0bed525b2a41d906aaf078f7da4c53bfad4", + "ee16dc82f66d8f069d83b76f1c433d658367dd27", + "64fe9ccff8f5235dd72a85e6c7676bc091f34038", + "20e9001f77c5454f9b9a9fa681f40067e4e1b8c2", + "40cce478fceb688eea9d9385f00acfc73ecb2f9d", + "21955259821de3bf9de7c8708d7a4d037d244c92", + "b922eb3c6a86c38717535220cbafffe3032803a3", + "be386c5615669fb19a05101d90df850569a366a1", + "c733de72b09be501a6d8555a51bab2ca9d65b203", + "740eaaab9d5ac5a9854260b09a1127c520b7b27c", + "0b3e8e2cf27e492dfb0bfbe9b8d6a3b2e2bc17f9", + "2516ba614aced5f991fc2f67e66fa90f3dec756f", + "5abe738e94964292a2bd38e6cf048138bb593fe4", + "1c5d0b73e977edfe89b447bfca585e8826b5783a", + "e3096837858dc2247961a29fb59164d5e39d8cd1", + "9a6d5ce05968464a6c00426a5d18595e5e0c2534", + "e74f03f5e56d5a9926c6f6351fd8131242a84ef1", + "573b84daad0e7149c3b128f65d75120095a1d3c5", + "5facae19039c0444d188729f5eeaa58440b55d7a", + "e617e14b9abc583b5e31b9ee315217cf52e7053f", + "62bbd3fc168a7bbd4703fb1778d72214115dc200", + "f9fc375d30b5626eced981d4ba80d2fcf6fba368", + "01227f21040de0e7be4979604d23aaeb2d220d50", + "1e53d5126a6f21a5cd9945ce4ae79a856d1c2aa6", + "def7d9867c9ed2bcf49984cbe78066456175afa2", + "2e1fc20df269fd7c6894c61c01f6fe0518029d38", + "5d6c196729f7c0eb0850bd9093d0a018b62168ba", + "062b7865763fd8cd0ad6079ec51a97c1bc35f88c", + "4630931b71697d8ffbe6154c45be34251811e205", + "a09166918a47fbda6c96df9a83f2e3b0df9057dd", + "036e1c39411e8eb6fa3d616fcad19f92188de807", + "8e6aee80cbffd0c0a3895a29bb029f57e1d76aec", + "483a716335fd7a07acb9a8fdf759add85cd55ffb", + "b1b1d87b55275de0f3b9c1a759ec6b543282cd5b", + "cded9ffcab1c2fc873af9650ae35004160b39410", + "37cc453cada7173368bfd3ed7c86c053557e5926", + "8538eda858022257c393f2b7d72291b2a133f452", + "d68841c1696583e487cc09a4e01a27afc4753bb9", + "c29fa22be5cbc683d781ce42d325830b4337a62f", + "28863c5a458f53c87559603b6bdb2e890ff002da", + "5e4e15446aeee7ea6989e2502b20b1278ee81768", + "25cf8915d7e4510f14f83d5317e6535d6e473bfb", + "3e602c716c72f31569c1ead4ca6b8781d15f9866", + "67e03a7960ccb911c4394671aec77d22f07cb495", + "e2b3f1d1f69d2b555083899700cadb4a971349b5", + "6c423e4662e730b3885e3375ee6d914612d5867e", + "1694013c7d8caf3b3c577c8024ef1c58f94b7955", + "91630edf6358ff0411a23f0a95ffa693bae1323b", + "028454e0ff1e27ebd16cae59b2da633d377204c7", + "0d07cb105767718dcaf998f307d4a97a38b35dea", + "23c3569fc657d3a4b1bdde834df0c8f6ffacab11", + "73c30d2754cfd13d6ac47ef28af974bfb021a121", + "055890aeb6273f7a6ab5176722418048a03d3461", + "3b89112c4fdc7e3fb8dded5157ae95c6afb68da3", + "7cb3cfae1db1575b52d02afd3d12f27fbfd6b56c", + "a310e3d7c808c74a9a2dd611d0bd6eda1f5f5340", + "f329178028da5004aabd83549936ea9728326736", + "5578dbecf4f35c97fc8762721ae16e010e42330a", + "14020d1fc290f5a4c1feb06d970b395aa2d60518", + "a1b2ffe5722b3d68d3dfbd1d3135c98681f1b480", + "f3b3996a94517365815ba8bfd31306483c453afb", + "cba0a45d7202f78c1e1ec5f150a1361df0565553", + "dbe1feeba6cebaa82465ff34ac85324eb99bbd96", + "067fac1d8369638e135bebaa5fc24648efe539a4", + "18983e0eba9f797a5602dacb9e3a1fdb1b0e5b8c", + "9f5445a4bbfd237564917d8749986798d61964c1", + "79025990785dd192d5732f072e29a37728a05109", + "a7caf5831836aef6ac5e6726a05f807ac20bbebb", + "23027cde1334d6db48868b8dadb94cd027b9b7bb", + "d0b280d64748bfc59a7da25bf640aa2d5462266e", + "8a9c5dac4ddf028916e6feef81ec0cb670f1e713", + "3790e9a57245215e68c06879cfb3d49ddf511f11", + "a5004ed91303ead3670260a0e682726c42cee57c", + "23e829a6706142d16305cc8f7f8c8b9bd8ffc040", + "7e592d0d2c566b32b7c1e44b3413354cfae15e4e", + "2e7a1685959b20ba75ddbce3db38798fc18becab", + "82218944dfd3501a3d4705c5132ad06506372a0f", + "ef4930e12ae3838d6059cf4990c8a0c2f6669c59", + "574f7a6ca7a130635f84701294f347ce26d2d586", + "5c91c2f83ca9daa19786263acd958bff2c79ca44", + "65d838dfb75cda0055db5fb03f12008ede246a3f", + "3c29ee4da5392eb1bdc9eb39068ab6a870d0c16a", + "f17a673f3438bc7d8e0b0b22ccf20e4b868f0ad7", + "653bf84319d61c7b41ad67b7648c8ee8571b6a16", + "3187b6d0e15a37687fa6a8683d54e2fc5c3a13da", + "4c29e4987613d1b30fdeff0a6af7a91b3be543f2", + "ee68df44ba84a65ec112d289100ecf978485c7d0", + "59283ef51d65bf7f7b7f430059aea19533f780b4", + "7694f04e3be4bea0e35f95d4728fd65cc9ef46a7", + "dcca8b27811f93142ec2bc14762593193ea69147", + "20115938f5b50616fca15cc1816b28423c2e016b", + "07b7e2a3f9733cbff1035533d0f2ba66008266b6", + "cd2d04dd8bd78ac250a2adebede35802ad117110", + "06e86e3d4a3f735c915a770fdff73ca8bc610476", + "3014039565f5e568630f7e463c35475bdbe697c9", + "eb729c4de8839c4123d0eb24d1d35886286ffff0", + "c990f68c512ecc7c23ec6ff428d51300d6425dc2", + "f3df0f4508b4cfe7e720f830f560c4e10f900703", + "43ff171136ab1855eb37721075a9208c1de3ad20", + "5d487b6bd25daa126e8edcb23f70a87ce4f7a27f", + "84f6f72a57317242849131eb3c6aac28cb01abd3", + "fd583ad477087f488eacd4ca243f1c93f5dac09b", + "ef3cb487cb03dfde3a33b592c24dff439ce9b783", + "7bd47a7efc8448f750163b07c812654bfadbe91d", + "b9de6e1facedee977ccd4b30aea8fe957a0ae09a", + "4ae009c0577ce4d0c87dcd743de9039ef050210f", + "04280ea8afacc8b46982710da67a835b92275625", + "ba7939b877ef0c1f066f0f6944b8c834f96fb67c", + "bd735f759f8c653a215f2e9d2cc1d8a248a25567", + "e9c70b7ab18d0b07580b80f2d92c43b11be5f71e", + "795c10dada7dd963603073be205325324a1dc205", + "8802f1d217906250585b75187b1ebfbb5c6cbcae" +}; + +const char *SHA256_sums[] = { + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "e632b7095b0bf32c260fa4c539e9fd7b852d0de454e9be26f24d0d6f91d069d3", + "3bff939c10f4d9bc21c6944606bcb81901cbad80fc6801b257fd8aa127881687", + "b344d80e24a3679999fa964450b34bc24d1578a35509f934c1418b0a20d21a67", + "103c5169871d49be7a2ebf9e6fe4720244cbf1fdbccdbfaca489898ea069504c", + "5845d549b3465df3c1fe755ccd99a9252858b448fa85fbd29139c3a33418a9ba", + "2363ecd70a265e2233d2b8b0a703bcd6aa71dbf47a8716fcdb4b35ac4fded6c7", + "883dbdc815a382a8ac863a990b4a33b601acfce6286df588b1e10416ca9934c1", + "10ae0f24c936bc39be215f80c343c6e870f640fd56b0aeb842c3cd49a4e6dfa3", + "3ba62773d07dd21b5712a1c221207bf2f46e459d862e7b7062b3b9e0073bbb1e", + "1a90011d5a17cbd702ea49cddd28190439dfeec1710e0efe52315e034ef449bc", + "030b6b1f71e51020e7b34f753d26741e7ed7c5cac3324b4fb237bf7f190326a1", + "a83b8899ae591254330a059b8c5c5a0d61b8a5cb1e20cd43cf62ea950861a108", + "8536a46b036db54a1f68389081f4c5dfb36c005ca655c0d005ade052e074fefc", + "3b6052bcafcb593a2b44229d6418f3638a1040ede220a06186948e0bc2378e10", + "9bc94b608c3636f6dbd12a7a08e586f2529c1910465cf764e5a2a16260a15c3b", + "1b0b70a113cd4065b095bae73fba840f3b93912e89dd535f7f795912e9b307d6", + "33a753c1d23f6a539b55c5c35dc0174ae048bbe517c701f3959495d509b862c1", + "99159403f98a4d80adb6234c336029f32c17efdc70f1d412b7e6008d6623f3fd", + "5cac4f980fedc3d3f1f99b4be3472c9b30d56523e632d151237ec9309048bda9", + "b29d66e56ed90cce9b0165c43fedec612b60a071974d8be4513e18580d55b5bd", + "60985d1eccaf8f3b95df873307d4727bc7af67dedaca6ea3d00d7e80dbb9d95c", + "0ec4cdc3ab31a48025746379b070b1af6b152e6dd1eefe8a16d1855c85711d72", + "76169b1e79ed4d640a78d664fdaced5035e7e0f116d7f044169763763a73d6b2", + "cebf42910d175773a31cd23fc7c08eaddba11c267105e51688728efd6152f798", + "8df831769cd51e4f57808343603e97c1ea44fcab46bb595a5000b9ad1d03bd70", + "4e866f068eb39bb4465a3185badc58f8be565b3cbe0d8e79d0c893dd92ca99ae", + "4a7b18fd0454f18d0ad320d8cf874e0466490e327bc3ca3beb13b1cb0fb01fff", + "a5e86ccb68457b2e8e5591e3c132ed5f824480ab3b34e8b798b1b4e955cc2bad", + "6c007ec72ab6d8bd1e7e2b90ab06095d38d042c172100b5364687985cccb71d5", + "588f6b03a29d124ef050bc1e46bb60cd983e3d75bff45b6f1438cb58baaf1a9b", + "ce32c090e5e13b6e5967e71e0d0025ca61fb6bcd54502221e354535ee7504fbe", + "5f48828a7ecafc69180e8e9607b277b3dd17e53acc043412a06d8f170711c74b", + "2d79fab9bb7d5b49e4c7eb28c14334f9d014129ce43d1252636b23ecaa569771", + "acbe47d52e08dc6ae67b0bc249c6fe92c2fea7cb5d168d089bdb4e5f012a70dd", + "177264d66f016c32fc7a4bf3d6a18fe64f3b92aa25dee9c3b84e6e2d3dba2467", + "41555a329cd561031b7f79aa7ffe614aa341fa4c8f67be9d3169ca02ac513951", + "6c450daf0a44317b850ab800b2986e3bfa19b118d82de07331c59b4461e08bb4", + "72a0280b4079082c4823f72d5847038ca4b3d689b8d4de7f4b8565ca5cc59ad0", + "e79df309e6b0e98a1b677e5d47765063170fd0fbe136d305230dca2ca1ade525", + "119ef8154ecb9f78200ab9a95930877811261da37f9cad9e533ad34a57275fad", + "fd535438ba7bc96dc5aae8b19059fc4307c0e2df4b252dd0d4d10dedd3116fd9", + "677b9fdbe2bd79af033c224b32803a77dd284885f8655aff914ac63fb65c0a70", + "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592", + "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c", + "88e197dce3e2562b9fb62bfdfb92c525328742af370fa2cd7c7bafaefb38f09c", + "6e186b825513e046ba1d030f5bd31caa27a486bab8933e3799e8fc8c7a0be919", + "ffe66f70564e2ef5b55cc4083aa1bbc24169c799a624d98182f99b8a7c950a82", + "381ba8d74f62ef53fe4d22511c9d7c9f182d719e8073a5ab0201f91676a2ee86", + "0147a26010960f5db71fcfa15c6f9278f2556905aa9fce122bbd5fe787e3d934", + "fb736023fbce2dd88d6eeffa02dc975f5b3cfa0d2c0641382ace3cf92975bda8", + "7c17ff3bf15c19d9a78f5c3f60dc38fab533ece520c8b8c73fcb0fba670c76b3", + "e32271566d6a71b90285b5d00447d1f27737d56bc14b17efea026c78e27af416", + "6867916bb6e48ee4f3b3a9eb4630233ec89fcf3722ea429ef300139d74f1f18a", + "5a0e44a7c154b01f19a6cf5d83d8ea556d17ba1ffeb05bfcacdb7c477dd1c912", + "0e9bc14d279f681c01eca319b7c22bf6e313186865a4d2111712f29ecc0223bf", + "1be2cb604f04f8538e1ab595dcceccf0b838041e72a4dfde8df53d84fc841828", + "0415d70cae1ca48b070e789748e8f3982a209a0c4b8070e2d3a26f729f04b0a6", + "0e29d748b4cca4b372d587ab8164361aa127664635f956fbbdf076c36ffb0c9b", + "8b0ccd3d72a10e396b16b67980f31823972b7114059d0d780b7c6c1d11aaab73", + "7105f8ae45fcb1a1829053f98681b526616e1d6028d1f72a6a0cea1e079c2aaf", + "5ab206331d14b2216b02eb0a58388e8209ffb396bc54eb22a47634cf236a03b9", + "71daf2e02b4b542a8064567793b62fed41f2241dd284163b15d02d279910e1d6", + "795a664f3ecfa5003b7d18e8ac44d88ed49a8ad731238e381f76cc72451e5d49", + "0d01316239b68e707e8079f02588bba156906aa0a8b328a2103f3dbe79464272", + "53798a699aaf9b5992322e27a7c48802ff41d04acc52c1e6657fdee037f9c0b0", + "250676ab47b392eaeb3bd8f7640c676e5a9fcfed22dc08948601c68d7eb867e5", + "c8c295b3179d555b5e04c82f8834b031d4dcb5df9409081e6e9b23be4d1aeb93", + "a6265afb2182630750a70887a35072908c048d5f9c831a2155da1887f1dd7709", + "78ba265740cc1335d27530a52dc456668c9475250d83f3e1c3041ab3d0856338", + "490b607d2009507689d5ce40f964e9b5c56ee54d13d99666eec256439a5d7691", + "012c3b2137fbb69e1b1457499923622d7a6639c3fcfd0c1889de9f1ae9a5224c", + "47f57d4c0eef68f4b14a02295da342bba8be6ddf901ed4ae1eaf7c3306672593", + "33eea677868305f597087e15be83723efd51e1f55342dac47afb604579fa0f74", + "f9aab1fa5ed80cd385cf625ec808339d819bd1faee979c3ee008db68db19e6bc", + "1e6279781c1a757c9cd3aaf2665c0c1d235e514065f57dff455256896313c5ae", + "fcad8c2b8ab78e1eb313f9a77b85e29ed86d4468d78e845fe7b197cff28889a0", + "0cc46a7fba1d7b1e7a7c6c438352fdde342c573550eac5a177e38d0cfd854b91", + "7d64ff1a21b7194e2a34f718bf536f4fbb636ea2d50b9de9423c1a64da67a566", + "624097dd2a64d12dbd7a9d15d58b6a31a8c11e0be67f20afd388e61ab316d6d5", + "c10ed525d528079a6ac6e6ebc51bb439a48df167c6860da2dcd8ef5a101a4bf9", + "b9ce9b34346f2d83dc60927231c14d1af0b1a915514d610cbdd69a8928ae1b57", + "4a3194983f551da64720e60b91e0bfcca2c5f7277b97ceb813b6665cbecf5078", + "cac95b35edebc00cb109d4726befb06adbadec365e102f8c9c024fec2efedd93", + "bd284ce312ff8f71a8fffd5737733c72dee0199eb5d9dea29875b02fe7dec138", + "888f4d527281b7ca77fb63651ea8c28850d62f38d6918a178bc7de7ecd61aca1", + "50839952e08506f523696a35e758eed06d7fce0a8e4c079242bd15b476dc2632", + "ce6b0b2e2494ba591909f5971d4a326c395f47d45ab2389fc5980a8d7c160373", + "328524b5f7c5de2b6fda754cd634480d2ae9953514e208d93c7b0493de3c376f", + "00e6bbca7e9f230b903d0029a603831688e37e141d283a88ff65f8a8de711214", + "e9419c75509f476ecd71c0ce5de42b13b70665182d470dc6b9389992e71ca610", + "bc93bf4ac98f5e62a180219b7cae5fe4b1a33700d1abd8769310f1b9c458052e", + "b59cbe76a3a993a8a5e93e7fae2277a99c52b27570f8cec0fc27c6407b87a863", + "7b977d99df79f3c123a551339a3584e1dbf8c6b220489c94e8b5ef241a2f4f32", + "42da1a65ef28c00d30b63128ad839782daf8437da50eaedf9e40c05daa324030", + "27b7b244d0a284afc02b21ddf8818d4934bf7d4a96db6c9be02b9a29f1d3e877", + "69e8ebc88995bfb9af4938fac297e7cc87f516d91ee3db9c385051aa67bfa291", + "e97ec334ea0e600801845a004cf943282716e537d2fb41edd3252ecc604cb868", + "61ddc6c83fcded7492a0b4e6682a2ec54ea79bd832ffacebd13eec490ae9c513", + "b1b2e4d6d5f02ab694d8be129dbf9f7fb345190927fd2732ab24e395ef877a95", + "036d3ac977186da97d849ae8706f573bae36822a83a8b820b0b09bfa7a4fde52", + "244dd1e7818cc1fc0b1790e5bdd79df79720b5ca4b30ddfbc6e03d2fa80edf24", + "025dd4c8ae7d9f3aec6b2e3014eda38ec54898c67de9ee68578ec7cc8254c345", + "e29858f925c90e19c49336f52a8acf57e7a0f10fbf1b0254ec9926afc77d34dd", + "e6ece3c684d5874497b83f6b486f0dddef4377f914e19ea717b82426d6ca37e3", + "952c6da8834e0c4c127269a6e69c59a23af9e35ed70577715979075324776eb0", + "675a0a83882910ca29d9a4b72e278afa307a2661bee3f28dee7faa7db73dde73", + "4102eada32bbc31c13f1fbf2f039bb7a46bdb3589e9bb3915046de72c0c2ead1", + "305793f522114ca65e243f80b82199425286a07585deff0d132223506c54c48a", + "c666ec59da13eae8361c08bae009f114641bb3bed6f6c88c69c888ab9b9bd2d7", + "115ad98815bdfbc2e9aa0922a63c530f2f49bb36bf339345694b6cfadc5a25bd", + "1186297e299b427c8ce24e20670156fe85eb9102f8ed7104154fbd10ad28b49a", + "2d02d02abca735d371fa9fbe2ec1fcf5c02a8eb5186140b849d13d5667c8588b", + "c8357ae61f0c6107d48ffd35b791f2a96c36d9004acbf97a7a6fe1941096e74c", + "e2f783571644ff40bb649ee1a6c7481e288eae50bd9621c638102c1222f02695", + "b057d8b05d77dfd016c7820ee32b3dcf8c0af73f79a003a68f7b344bff5f9489", + "f98a7811608e9f78df7c1dcc6765ad672d907ab49e3ab756b6ad2ff392ae3cb0", + "06727bbca9d6e47cbd4e2f61b313627cf0489c5f84850dfb45cb496f11e0d880", + "62e011d19bbb328c57808bb4dcb1fd25551a642df179615559a654e91b233afb", + "18811c3a1798f207c75d895a6deb4b2ee05a27749e5d4dab02f5299f8f62e43a", + "a2eec6a9e819ca9ae6accd714273210cad3a98ea104661b841b8b18fd695115a", + "b745658efb45b83211abaffe3af0e5fd3769866d154194c9078da9491f793bae", + "bef6454bcf2dd622f73ab849166a95f56be540ff05cc2b79412f40c60cfec3b3", + "13f42a4a6df75f6b09a53eff4a92b824b8212ce99b54169774958debe92ba00f", + "f6addf5f0a754434e6767535ee8cd12a57d3c78eb5925d421e43870ddc0c4b02", + "abbd74e4444bcf0a33da28cd9b74483d19c07c0c84c7a217ed1d8d143da44c4c", + "18c5fb1bfd33fc27a0b7799eb14d502e8b59acd5da0be6f9a7fbabd96608c61d", + "91a32360bd0152180990285fd7cb3145207d33f866c9d99e7f8bb7331a12d03a", + "3324ebb8bfd51c9ac3f3994a56b7e0c0106d9d938c147edb391a4bf812d6afb1", + "914e88337910ee43d63f77d91502eebb35ae38ac6138bd7af4d879dbb730ac85", + "bc73865737be6195981507338ef06ec2a5f34d3f12580b4f89d5e28ef8283969", + "0b41f57008120081011a2ba580d8cff17f9c1f3b2e811359cd3ecfa9b36dc5e9", + "a1702789897f4e641bf00d505549c6dc9df9daf904f3267e0cb583c7fb49e832", + "70737787a53182c78152e845e0d803171d27105c7ef9407b48ae51280b0b1ed3", + "683a017524f641b4c38c26db0df5046fbc38e30fbbe7fb7a6804e2e039c9d353", + "8bbd8c3f3c6911a3e73ba7a480f902a95fdf4c8a7c554b68e7330e4914481f15", + "66e62f07828e8a8a6ce821cb29fe34f2ec551d4422b593380e5209ee4a3a3e57", + "2aa054e91da4874329ac8946922323c8d5b114b4ddd714f54cb1fb069dc56646", + "47db1856215834b20d70031695491a4a90416bac8d231646bba8754585f67d08", + "eab539981a22c36e481b71d2c828b848b9b127963d7b5eb56c4903f5cf004296", + "cf43ef0749885e4108f8fc2774a840264980e4f2be51d1c803bbb90965745034", + "fd6847b7d5ea924beb8e7d43d0e87d4866f9744629f2768cf32e7f37efd23253", + "1c3d53f1a7fe78c34a4c33331126375e57f4f8f732d39e0ff550fb717e683724", + "f03b454c7bf5ddfe083798a85ac46bc671ef76b381b969ab4f333c74397693ab", + "0c7255ee15ceac49e1281447b159ed1ccb8fa09d3d002fe3337c80f75a247b86", + "4c69c21e1afa642423a660359e058c8d6a2dae61c1083b7dea46471ebf24f0da", + "b984e785026dabfa52ece12495df98bf80ba831ea316c08fc4b39c5fc00b50ed", + "40b33b1a89820917e19e95bf5abae2121b8f200c826a3559440010d2863a5acd", + "053de20a192f3205f46e3f68d8b9926abcf64df55d01cf166e7f8e8c8d042487", + "ababd9164d854d8a7b56fc4e6980dbafcd5aa017f5e2b5777a6e6e47460fc716", + "f3982fa10d2353163d644ab33e2c5af7264c0c9c8b14cd88d91331b5d01ae3c7", + "0d7c2df609dc5c44677d62b8839576b98ec78fa8b5913add17b7e9cfaa6aa75d", + "3b86e1a3a4e3cf19734b693cc3d9b24d4173b5e8ace1be3daa303755ce8d5737", + "dfcdb86a6ec326f0f4c8b167b5945979a5cf3a2ef20970c47b46ddd47f8fd6d1", + "e2a696a14922cdeb99abe04a66576e65142be3b0e53cf0c0f05c86acf63bc83a", + "780646dc52688aead41076d4906e17b42eb5593565f179a6bb5135143d40d03d", + "847ed344db2cdbfb7f69f9b2c9a5359e13df72c2485345a80fa9b114ec7c8c03", + "a4f5b2a505437424c3382e2d534ed2fdb55af631c5b211871f2e62acb5dd722f", + "e6e8883f5c8d840d7895afac181c6d9fb154672fb2c7ba9757ca8528242bef64", + "c89e7de64979fcbf929148c7b44322047e820219854600e88f7a7ce805971c38", + "591555d8d3936620ebb6be7549ea9eaafa9e6a562b9ebbbf4c04eb4f926d5060", + "2ec1da3a8252e21834db7c90077b12547f70890b853b5b269a38f74b421f3a4f", + "3b05f141c3855409941c6596a92ea7a3ab59764bda3cdcc6812060a5e5d1f48c", + "82b21ff095df092358450698e7a534453105014f3b227a210cb5d523191570e8", + "229da5c29efe0885663587fe0080862ef52e7504ca64f5d6ff1c26f5a7b1c0c7", + "cd3c1d86961be993a150c1126a958ef14a3e47ef21507492ffdee8b089774505", + "e346ecc2f3e8cbcbbead67341edb971f2a9e152f8c1e086693dce431d9e14335", + "5e5c06dc93c409e935b87373f2647f57a951118851b226f908751bcafb496b2a", + "2f5ded0589de3ef9f5e5b05df0a19b02fcee0e686900c5eb9e3153ba3ccdf685", + "6a0335f78e0fea8e4cdf747d6464f2de78e659b9de5be37ccf8f81f1e775ca79", + "8adfeb35e7d07f4aece0f8b4b282a303e45b11c9b4f9b1798cbcf8cf0dc5f48a", + "94dc98b89a5b498d7c7eb0fb0524af296d0181e7a4dac82c3bd7ce147019b52d", + "4b2dae26d837294c81e00c6c28692235a9ea046bc8038ea78ce1819cb5f54be4", + "77d9e99e3a956c9b52742b498b8811cb721ad798866d36d269b4b554a707e63a", + "652082a8998da5439cb5e695104febfa81d3d3a0bb4dfd49120b82e350b48f6f", + "43bf07481f0bc237e1ed2ce2b0b3cca1989f9bdbbc7cf1e78879984ff927b3e1", + "648f7216f324f0a46648d757a21dc25c9382c64a095ea95b62aed37596bdf842", + "34c3d02b75da5d2739bb8d4916110469e1b854a8104aeec7ccfef52a02f234e1", + "0d0b8d475cb50a40e2cb999757106f4576c5b69176df4c30e1c4659de1468ff8", + "63d7e84cef1bc8c74ebdf53fe795766f0fd32a9c6246586f8217010db1c2c9f5", + "99525cf2ec889a1628576099f34ece6d60de03fa85ade70a3d0913033934dc1f", + "8aa3e3cd4d678c9623caebac79ecd62fdcd15de5960c7fbffc3ab8e77788109a", + "c71259d6ad975ada31990fb7b3aa958248bd88d3563b581959acf4f18310f266", + "df3a0c35d5345d6d792415c1310bd4589cdf68bac96ed599d6bb0c1545ffc86c" +}; + +static void +test_checksum (GChecksumType checksum_type, + const gchar *type, + const gchar *sum, + int length) +{ + GChecksum *checksum; + const char *p; + int chunk_length; + + for (chunk_length = MIN (length, 1); chunk_length < length; chunk_length++) + { + checksum = g_checksum_new (checksum_type); + for (p = FIXED_STR; p < FIXED_STR + length; p += chunk_length) + { + g_checksum_update (checksum, (const guchar *)p, + MIN (chunk_length, length - (p - FIXED_STR))); + } + + if (strcmp (g_checksum_get_string (checksum), sum) != 0) + { + g_print ("Invalid %s checksum for `%.*s' (length %d) counting by %d:\n" + "%s (expecting: %s)\n", + type, + length, FIXED_STR, + length, chunk_length, + g_checksum_get_string (checksum), + sum); + exit (1); + } + + g_checksum_free (checksum); + } +} + +static void +test_checksum_string (GChecksumType checksum_type, + const gchar *type, + const gchar **sums) +{ + int length; + + for (length = 0; length <= FIXED_LEN; length++) + { + const char *expected = sums[length]; + char *checksum; + + checksum = g_compute_checksum_for_string (checksum_type, + FIXED_STR, + length); + if (strcmp (checksum, expected) != 0) + { + g_print ("Invalid %s checksum for `%.*s' (length %d):\n" + "%s (expecting: %s)\n", + type, + length, FIXED_STR, length, + checksum, + expected); + exit (1); + } + + g_free (checksum); + } +} + +#define test(type, length) test_checksum (G_CHECKSUM_##type, \ + #type, \ + type##_sums[length], \ + length) + +#define test_string(type) test_checksum_string (G_CHECKSUM_##type, \ + #type, \ + type##_sums) + +int +main (int argc, char *argv[]) +{ + int length; + + for (length = 0; length <= FIXED_LEN; length++) + { + test (MD5, length); + test (SHA1, length); + test (SHA256, length); + } + + test_string (MD5); + test_string (SHA1); + test_string (SHA256); + + return EXIT_SUCCESS; +} diff --git a/tests/child-test.c b/tests/child-test.c new file mode 100644 index 0000000..b678572 --- /dev/null +++ b/tests/child-test.c @@ -0,0 +1,206 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include + +#ifdef G_OS_WIN32 +#include +#endif + +#ifdef G_OS_WIN32 +#define GPID_FORMAT "%p" +#else +#define GPID_FORMAT "%d" +#endif + +GMainLoop *main_loop; +gint alive; + +#ifdef G_OS_WIN32 +char *argv0; +#endif + +GPid +get_a_child (gint ttl) +{ + GPid pid; + +#ifdef G_OS_WIN32 + STARTUPINFO si; + PROCESS_INFORMATION pi; + gchar *cmdline; + + memset (&si, 0, sizeof (si)); + si.cb = sizeof (&si); + memset (&pi, 0, sizeof (pi)); + + cmdline = g_strdup_printf( "child-test -c%d", ttl); + + if (!CreateProcess (argv0, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + g_error ("CreateProcess failed: %s\n", g_win32_error_message (GetLastError ())); + + g_free(cmdline); + + CloseHandle (pi.hThread); + pid = pi.hProcess; + + return pid; +#else + pid = fork (); + if (pid < 0) + exit (1); + + if (pid > 0) + return pid; + + sleep (ttl); + _exit (0); +#endif /* G_OS_WIN32 */ +} + +gboolean +child_watch_callback (GPid pid, gint status, gpointer data) +{ +#ifdef VERBOSE + gint ttl = GPOINTER_TO_INT (data); + + g_print ("child " GPID_FORMAT " (ttl %d) exited, status %d\n", pid, ttl, status); +#endif + + g_spawn_close_pid (pid); + + if (--alive == 0) + g_main_loop_quit (main_loop); + + return TRUE; +} + +static gboolean +quit_loop (gpointer data) +{ + GMainLoop *main_loop = data; + + g_main_loop_quit (main_loop); + + return TRUE; +} + +#ifdef TEST_THREAD +static gpointer +test_thread (gpointer data) +{ + GMainLoop *new_main_loop; + GSource *source; + GPid pid; + gint ttl = GPOINTER_TO_INT (data); + + new_main_loop = g_main_loop_new (NULL, FALSE); + + pid = get_a_child (ttl); + source = g_child_watch_source_new (pid); + g_source_set_callback (source, (GSourceFunc) child_watch_callback, data, NULL); + g_source_attach (source, g_main_loop_get_context (new_main_loop)); + g_source_unref (source); + +#ifdef VERBOSE + g_print ("whee! created pid: " GPID_FORMAT " (ttl %d)\n", pid, ttl); +#endif + + g_main_loop_run (new_main_loop); + + return NULL; +} +#endif + +int +main (int argc, char *argv[]) +{ +#ifndef TEST_THREAD + GPid pid; +#endif +#ifdef G_OS_WIN32 + argv0 = argv[0]; + if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'c') + { + int ttl = atoi (argv[1] + 2); + Sleep (ttl * 1000); + /* Exit on purpose with STILL_ACTIVE (which isn't a very common + * exit status) to verify that g_child_watch_check() in gmain.c + * doesn't believe a child still to be active if it happens to + * exit with that status. + */ + exit (STILL_ACTIVE); + } +#endif + /* Only run the test, if threads are enabled and a default thread + * implementation is available. + */ +#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) +#ifdef TEST_THREAD + g_thread_init (NULL); +#endif + main_loop = g_main_loop_new (NULL, FALSE); + +#ifdef G_OS_WIN32 + system ("ipconfig /all"); +#else + system ("/bin/true"); +#endif + + alive = 2; + g_timeout_add (30000, quit_loop, main_loop); + +#ifdef TEST_THREAD + g_thread_create (test_thread, GINT_TO_POINTER (10), FALSE, NULL); + g_thread_create (test_thread, GINT_TO_POINTER (20), FALSE, NULL); +#else + pid = get_a_child (10); + g_child_watch_add (pid, (GChildWatchFunc) child_watch_callback, + GINT_TO_POINTER (10)); + pid = get_a_child (20); + g_child_watch_add (pid, (GChildWatchFunc) child_watch_callback, + GINT_TO_POINTER (20)); +#endif + + g_main_loop_run (main_loop); + + if (alive > 0) + { + g_warning ("%d children still alive\n", alive); + return 1; + } + +#endif + return 0; +} diff --git a/tests/collate/collate-1.file b/tests/collate/collate-1.file new file mode 100644 index 0000000..c8e41e9 --- /dev/null +++ b/tests/collate/collate-1.file @@ -0,0 +1,9 @@ +223 +bar +baz +c +eer34 +er1 +foo +GTK+ +z diff --git a/tests/collate/collate-1.in b/tests/collate/collate-1.in new file mode 100644 index 0000000..1fc8977 --- /dev/null +++ b/tests/collate/collate-1.in @@ -0,0 +1,9 @@ +z +c +eer34 +223 +er1 +foo +bar +baz +GTK+ diff --git a/tests/collate/collate-1.unicode b/tests/collate/collate-1.unicode new file mode 100644 index 0000000..c8e41e9 --- /dev/null +++ b/tests/collate/collate-1.unicode @@ -0,0 +1,9 @@ +223 +bar +baz +c +eer34 +er1 +foo +GTK+ +z diff --git a/tests/collate/collate-2.file b/tests/collate/collate-2.file new file mode 100644 index 0000000..2a5a4da --- /dev/null +++ b/tests/collate/collate-2.file @@ -0,0 +1,13 @@ +bla001 +bla02 +bla03 +bla4 +bla10 +bla100 +event.c +event.h +eventgenerator.c +file.c +file.txt +file2.bla +file3.xx diff --git a/tests/collate/collate-2.in b/tests/collate/collate-2.in new file mode 100644 index 0000000..be294ca --- /dev/null +++ b/tests/collate/collate-2.in @@ -0,0 +1,13 @@ +file.txt +file2.bla +file.c +file3.xx +bla001 +bla02 +bla03 +bla4 +bla10 +bla100 +event.c +eventgenerator.c +event.h diff --git a/tests/collate/collate-2.unicode b/tests/collate/collate-2.unicode new file mode 100644 index 0000000..3546853 --- /dev/null +++ b/tests/collate/collate-2.unicode @@ -0,0 +1,13 @@ +bla001 +bla02 +bla03 +bla10 +bla100 +bla4 +event.c +eventgenerator.c +event.h +file2.bla +file3.xx +file.c +file.txt diff --git a/tests/completion-test.c b/tests/completion-test.c new file mode 100644 index 0000000..bece9c3 --- /dev/null +++ b/tests/completion-test.c @@ -0,0 +1,74 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ +#include + +#include "glib.h" + +int main (int argc, char *argv[]) +{ + GCompletion *cmp; + GList *items; + gchar *prefix; + + cmp = g_completion_new (NULL); + + items = NULL; + items = g_list_append (items, "a\302\243"); + items = g_list_append (items, "a\302\244"); + items = g_list_append (items, "bb"); + items = g_list_append (items, "bc"); + g_completion_add_items (cmp, items); + + items = g_completion_complete (cmp, "a", &prefix); + g_assert (!strcmp ("a\302", prefix)); + g_assert (g_list_length (items) == 2); + g_free (prefix); + + items = g_completion_complete_utf8 (cmp, "a", &prefix); + g_assert (!strcmp ("a", prefix)); + g_assert (g_list_length (items) == 2); + g_free (prefix); + + items = g_completion_complete (cmp, "b", &prefix); + g_assert (!strcmp ("b", prefix)); + g_assert (g_list_length (items) == 2); + g_free (prefix); + + items = g_completion_complete_utf8 (cmp, "b", &prefix); + g_assert (!strcmp ("b", prefix)); + g_assert (g_list_length (items) == 2); + g_free (prefix); + + items = g_completion_complete (cmp, "a", NULL); + g_assert (g_list_length (items) == 2); + + items = g_completion_complete_utf8 (cmp, "a", NULL); + g_assert (g_list_length (items) == 2); + + g_completion_free (cmp); + + return 0; +} diff --git a/tests/convert-test.c b/tests/convert-test.c new file mode 100644 index 0000000..10b8c00 --- /dev/null +++ b/tests/convert-test.c @@ -0,0 +1,662 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#include + +/* Bug 311337 */ +static void +test_iconv_state (void) +{ + gchar *in = "\xf4\xe5\xf8\xe5\xed"; + gchar *expected = "\xd7\xa4\xd7\x95\xd7\xa8\xd7\x95\xd7\x9d"; + gchar *out; + gsize bytes_read = 0; + gsize bytes_written = 0; + GError *error = NULL; + + out = g_convert (in, -1, "UTF-8", "CP1255", + &bytes_read, &bytes_written, &error); + + if (error && error->code == G_CONVERT_ERROR_NO_CONVERSION) + return; /* silently skip if CP1255 is not supported, see bug 467707 */ + + g_assert_no_error (error); + g_assert (bytes_read == 5); + g_assert (bytes_written == 10); + g_assert (strcmp (out, expected) == 0); + g_free (out); +} + +/* some tests involving "vulgar fraction one half" */ +static void +test_one_half (void) +{ + gchar *in = "\xc2\xbd"; + gchar *out; + gsize bytes_read = 0; + gsize bytes_written = 0; + GError *error = NULL; + + out = g_convert (in, -1, + "ISO-8859-1", "UTF-8", + &bytes_read, &bytes_written, + &error); + + g_assert_no_error (error); + g_assert (bytes_read == 2); + g_assert (bytes_written == 1); + g_assert (strcmp (out, "\xbd") == 0); + g_free (out); + + out = g_convert (in, -1, + "ISO-8859-15", "UTF-8", + &bytes_read, &bytes_written, + &error); + + g_assert_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_ILLEGAL_SEQUENCE); + g_assert (bytes_read == 0); + g_assert (bytes_written == 0); + g_assert (out == NULL); + g_clear_error (&error); + g_free (out); + + out = g_convert_with_fallback (in, -1, + "ISO8859-15", "UTF-8", + "a", + &bytes_read, &bytes_written, + &error); + + g_assert_no_error (error); + g_assert (bytes_read == 2); + g_assert (bytes_written == 1); + g_assert (strcmp (out, "a") == 0); + g_free (out); +} + +static void +test_byte_order (void) +{ + gchar in_be[4] = { 0xfe, 0xff, 0x03, 0x93}; /* capital gamma */ + gchar in_le[4] = { 0xff, 0xfe, 0x93, 0x03}; + gchar *expected = "\xce\x93"; + gchar *out; + gsize bytes_read = 0; + gsize bytes_written = 0; + GError *error = NULL; + + out = g_convert (in_be, sizeof (in_be), + "UTF-8", "UTF-16", + &bytes_read, &bytes_written, + &error); + + g_assert_no_error (error); + g_assert (bytes_read == 4); + g_assert (bytes_written == 2); + g_assert (strcmp (out, expected) == 0); + g_free (out); + + out = g_convert (in_le, sizeof (in_le), + "UTF-8", "UTF-16", + &bytes_read, &bytes_written, + &error); + + g_assert_no_error (error); + g_assert (bytes_read == 4); + g_assert (bytes_written == 2); + g_assert (strcmp (out, expected) == 0); + g_free (out); +} + +static void +check_utf8_to_ucs4 (const char *utf8, + glong utf8_len, + const gunichar *ucs4, + glong ucs4_len, + glong error_pos) +{ + gunichar *result, *result2, *result3; + glong items_read, items_read2; + glong items_written, items_written2; + GError *error, *error2, *error3; + gint i; + + if (!error_pos) + { + /* check the fast conversion */ + result = g_utf8_to_ucs4_fast (utf8, utf8_len, &items_written); + + g_assert (items_written == ucs4_len); + g_assert (result); + for (i = 0; i <= items_written; i++) + g_assert (result[i] == ucs4[i]); + + g_free (result); + } + + error = NULL; + result = g_utf8_to_ucs4 (utf8, utf8_len, &items_read, &items_written, &error); + + if (utf8_len == strlen (utf8)) + { + /* check that len == -1 yields identical results */ + error2 = NULL; + result2 = g_utf8_to_ucs4 (utf8, -1, &items_read2, &items_written2, &error2); + g_assert (error || items_read2 == items_read); + g_assert (error || items_written2 == items_written2); + g_assert (!!result == !!result2); + g_assert (!!error == !!error2); + if (result) + for (i = 0; i <= items_written; i++) + g_assert (result[i] == result2[i]); + + g_free (result2); + if (error2) + g_error_free (error2); + } + + error3 = NULL; + result3 = g_utf8_to_ucs4 (utf8, utf8_len, NULL, NULL, &error3); + + if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT) + { + g_assert_no_error (error); + g_assert (items_read == error_pos); + g_assert (items_written == ucs4_len); + g_assert (result); + for (i = 0; i <= items_written; i++) + g_assert (result[i] == ucs4[i]); + } + else if (error_pos) + { + g_assert (error != NULL); + g_assert (result == NULL); + g_assert (items_read == error_pos); + g_error_free (error); + + g_assert (error3 != NULL); + g_assert (result3 == NULL); + g_error_free (error3); + } + else + { + g_assert_no_error (error); + g_assert (items_read == utf8_len); + g_assert (items_written == ucs4_len); + g_assert (result); + for (i = 0; i <= items_written; i++) + g_assert (result[i] == ucs4[i]); + + g_assert_no_error (error3); + g_assert (result3); + for (i = 0; i <= ucs4_len; i++) + g_assert (result3[i] == ucs4[i]); + } + + g_free (result); + g_free (result3); +} + +static void +check_ucs4_to_utf8 (const gunichar *ucs4, + glong ucs4_len, + const char *utf8, + glong utf8_len, + glong error_pos) +{ + gchar *result, *result2, *result3; + glong items_read, items_read2; + glong items_written, items_written2; + GError *error, *error2, *error3; + + error = NULL; + result = g_ucs4_to_utf8 (ucs4, ucs4_len, &items_read, &items_written, &error); + + if (ucs4[ucs4_len] == 0) + { + /* check that len == -1 yields identical results */ + error2 = NULL; + result2 = g_ucs4_to_utf8 (ucs4, -1, &items_read2, &items_written2, &error2); + + g_assert (error || items_read2 == items_read); + g_assert (error || items_written2 == items_written); + g_assert (!!result == !!result2); + g_assert (!!error == !!error2); + if (result) + g_assert (strcmp (result, result2) == 0); + + g_free (result2); + if (error2) + g_error_free (error2); + } + + error3 = NULL; + result3 = g_ucs4_to_utf8 (ucs4, ucs4_len, NULL, NULL, &error3); + + if (error_pos) + { + g_assert (error != NULL); + g_assert (result == NULL); + g_assert (items_read == error_pos); + g_error_free (error); + + g_assert (error3 != NULL); + g_assert (result3 == NULL); + g_error_free (error3); + } + else + { + g_assert_no_error (error); + g_assert (items_read == ucs4_len); + g_assert (items_written == utf8_len); + g_assert (result); + g_assert (strcmp (result, utf8) == 0); + + g_assert_no_error (error3); + g_assert (result3); + g_assert (strcmp (result3, utf8) == 0); + } + + g_free (result); + g_free (result3); +} + +static void +check_utf8_to_utf16 (const char *utf8, + glong utf8_len, + const gunichar2 *utf16, + glong utf16_len, + glong error_pos) +{ + gunichar2 *result, *result2, *result3; + glong items_read, items_read2; + glong items_written, items_written2; + GError *error, *error2, *error3; + gint i; + + error = NULL; + result = g_utf8_to_utf16 (utf8, utf8_len, &items_read, &items_written, &error); + + if (utf8_len == strlen (utf8)) + { + /* check that len == -1 yields identical results */ + error2 = NULL; + result2 = g_utf8_to_utf16 (utf8, -1, &items_read2, &items_written2, &error2); + g_assert (error || items_read2 == items_read); + g_assert (error || items_written2 == items_written2); + g_assert (!!result == !!result2); + g_assert (!!error == !!error2); + if (result) + for (i = 0; i <= items_written; i++) + g_assert (result[i] == result2[i]); + + g_free (result2); + if (error2) + g_error_free (error2); + } + + error3 = NULL; + result3 = g_utf8_to_utf16 (utf8, utf8_len, NULL, NULL, &error3); + + if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT) + { + g_assert_no_error (error); + g_assert (items_read == error_pos); + g_assert (items_written == utf16_len); + g_assert (result); + for (i = 0; i <= items_written; i++) + g_assert (result[i] == utf16[i]); + } + else if (error_pos) + { + g_assert (error != NULL); + g_assert (result == NULL); + g_assert (items_read == error_pos); + g_error_free (error); + + g_assert (error3 != NULL); + g_assert (result3 == NULL); + g_error_free (error3); + } + else + { + g_assert_no_error (error); + g_assert (items_read == utf8_len); + g_assert (items_written == utf16_len); + g_assert (result); + for (i = 0; i <= items_written; i++) + g_assert (result[i] == utf16[i]); + + g_assert_no_error (error3); + g_assert (result3); + for (i = 0; i <= utf16_len; i++) + g_assert (result3[i] == utf16[i]); + } + + g_free (result); + g_free (result3); +} + +static void +check_utf16_to_utf8 (const gunichar2 *utf16, + glong utf16_len, + const char *utf8, + glong utf8_len, + glong error_pos) +{ + gchar *result, *result2, *result3; + glong items_read, items_read2; + glong items_written, items_written2; + GError *error, *error2, *error3; + + error = NULL; + result = g_utf16_to_utf8 (utf16, utf16_len, &items_read, &items_written, &error); + if (utf16[utf16_len] == 0) + { + /* check that len == -1 yields identical results */ + error2 = NULL; + result2 = g_utf16_to_utf8 (utf16, -1, &items_read2, &items_written2, &error2); + + g_assert (error || items_read2 == items_read); + g_assert (error || items_written2 == items_written); + g_assert (!!result == !!result2); + g_assert (!!error == !!error2); + if (result) + g_assert (strcmp (result, result2) == 0); + + g_free (result2); + if (error2) + g_error_free (error2); + } + + error3 = NULL; + result3 = g_utf16_to_utf8 (utf16, utf16_len, NULL, NULL, &error3); + + if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT) + { + g_assert_no_error (error); + g_assert (items_read == error_pos); + g_assert (items_read + 1 == utf16_len); + g_assert (items_written == utf8_len); + g_assert (result); + g_assert (strcmp (result, utf8) == 0); + } + else if (error_pos) + { + g_assert (error != NULL); + g_assert (result == NULL); + g_assert (items_read == error_pos); + g_error_free (error); + + g_assert (error3 != NULL); + g_assert (result3 == NULL); + g_error_free (error3); + } + else + { + g_assert_no_error (error); + g_assert (items_read == utf16_len); + g_assert (items_written == utf8_len); + g_assert (result); + g_assert (strcmp (result, utf8) == 0); + + g_assert_no_error (error3); + g_assert (result3); + g_assert (strcmp (result3, utf8) == 0); + } + + g_free (result); + g_free (result3); +} + +static void +check_ucs4_to_utf16 (const gunichar *ucs4, + glong ucs4_len, + const gunichar2 *utf16, + glong utf16_len, + glong error_pos) +{ + gunichar2 *result, *result2, *result3; + glong items_read, items_read2; + glong items_written, items_written2; + GError *error, *error2, *error3; + gint i; + + error = NULL; + result = g_ucs4_to_utf16 (ucs4, ucs4_len, &items_read, &items_written, &error); + + if (ucs4[ucs4_len] == 0) + { + /* check that len == -1 yields identical results */ + error2 = NULL; + result2 = g_ucs4_to_utf16 (ucs4, -1, &items_read2, &items_written2, &error2); + + g_assert (error || items_read2 == items_read); + g_assert (error || items_written2 == items_written); + g_assert (!!result == !!result2); + g_assert (!!error == !!error2); + if (result) + for (i = 0; i <= utf16_len; i++) + g_assert (result[i] == result2[i]); + + g_free (result2); + if (error2) + g_error_free (error2); + } + + error3 = NULL; + result3 = g_ucs4_to_utf16 (ucs4, -1, NULL, NULL, &error3); + + if (error_pos) + { + g_assert (error != NULL); + g_assert (result == NULL); + g_assert (items_read == error_pos); + g_error_free (error); + + g_assert (error3 != NULL); + g_assert (result3 == NULL); + g_error_free (error3); + } + else + { + g_assert_no_error (error); + g_assert (items_read == ucs4_len); + g_assert (items_written == utf16_len); + g_assert (result); + for (i = 0; i <= utf16_len; i++) + g_assert (result[i] == utf16[i]); + + g_assert_no_error (error3); + g_assert (result3); + for (i = 0; i <= utf16_len; i++) + g_assert (result3[i] == utf16[i]); + } + + g_free (result); + g_free (result3); +} + +static void +check_utf16_to_ucs4 (const gunichar2 *utf16, + glong utf16_len, + const gunichar *ucs4, + glong ucs4_len, + glong error_pos) +{ + gunichar *result, *result2, *result3; + glong items_read, items_read2; + glong items_written, items_written2; + GError *error, *error2, *error3; + gint i; + + error = NULL; + result = g_utf16_to_ucs4 (utf16, utf16_len, &items_read, &items_written, &error); + if (utf16[utf16_len] == 0) + { + /* check that len == -1 yields identical results */ + error2 = NULL; + result2 = g_utf16_to_ucs4 (utf16, -1, &items_read2, &items_written2, &error2); + g_assert (error || items_read2 == items_read); + g_assert (error || items_written2 == items_written2); + g_assert (!!result == !!result2); + g_assert (!!error == !!error2); + if (result) + for (i = 0; i <= items_written; i++) + g_assert (result[i] == result2[i]); + + g_free (result2); + if (error2) + g_error_free (error2); + } + + error3 = NULL; + result3 = g_utf16_to_ucs4 (utf16, utf16_len, NULL, NULL, &error3); + + if (error3 && error3->code == G_CONVERT_ERROR_PARTIAL_INPUT) + { + g_assert_no_error (error); + g_assert (items_read == error_pos); + g_assert (items_read + 1 == utf16_len); + g_assert (items_written == ucs4_len); + g_assert (result); + for (i = 0; i <= items_written; i++) + g_assert (result[i] == ucs4[i]); + } + else if (error_pos) + { + g_assert (error != NULL); + g_assert (result == NULL); + g_assert (items_read == error_pos); + g_error_free (error); + + g_assert (error3 != NULL); + g_assert (result3 == NULL); + g_error_free (error3); + } + else + { + g_assert_no_error (error); + g_assert (items_read == utf16_len); + g_assert (items_written == ucs4_len); + g_assert (result); + for (i = 0; i <= ucs4_len; i++) + g_assert (result[i] == ucs4[i]); + + g_assert_no_error (error3); + g_assert (result3); + for (i = 0; i <= ucs4_len; i++) + g_assert (result3[i] == ucs4[i]); + } + + g_free (result); + g_free (result3); +} + +static void +test_unicode_conversions (void) +{ + char *utf8; + gunichar ucs4[100]; + gunichar2 utf16[100]; + + utf8 = "abc"; + ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0x63; ucs4[3] = 0; + utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0x63; utf16[3] = 0; + + check_utf8_to_ucs4 (utf8, 3, ucs4, 3, 0); + check_ucs4_to_utf8 (ucs4, 3, utf8, 3, 0); + check_utf8_to_utf16 (utf8, 3, utf16, 3, 0); + check_utf16_to_utf8 (utf16, 3, utf8, 3, 0); + check_ucs4_to_utf16 (ucs4, 3, utf16, 3, 0); + check_utf16_to_ucs4 (utf16, 3, ucs4, 3, 0); + + utf8 = "\316\261\316\262\316\263"; + ucs4[0] = 0x03b1; ucs4[1] = 0x03b2; ucs4[2] = 0x03b3; ucs4[3] = 0; + utf16[0] = 0x03b1; utf16[1] = 0x03b2; utf16[2] = 0x03b3; utf16[3] = 0; + + check_utf8_to_ucs4 (utf8, 6, ucs4, 3, 0); + check_ucs4_to_utf8 (ucs4, 3, utf8, 6, 0); + check_utf8_to_utf16 (utf8, 6, utf16, 3, 0); + check_utf16_to_utf8 (utf16, 3, utf8, 6, 0); + check_ucs4_to_utf16 (ucs4, 3, utf16, 3, 0); + check_utf16_to_ucs4 (utf16, 3, ucs4, 3, 0); + + /* partial utf8 character */ + utf8 = "abc\316"; + ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0x63; ucs4[3] = 0; + utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0x63; utf16[3] = 0; + + check_utf8_to_ucs4 (utf8, 4, ucs4, 3, 3); + check_utf8_to_utf16 (utf8, 4, utf16, 3, 3); + + /* invalid utf8 */ + utf8 = "abc\316\316"; + ucs4[0] = 0; + utf16[0] = 0; + + check_utf8_to_ucs4 (utf8, 5, ucs4, 0, 3); + check_utf8_to_utf16 (utf8, 5, utf16, 0, 3); + + /* partial utf16 character */ + utf8 = "ab"; + ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0; + utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0xd801; utf16[3] = 0; + + check_utf16_to_utf8 (utf16, 3, utf8, 2, 2); + check_utf16_to_ucs4 (utf16, 3, ucs4, 2, 2); + + /* invalid utf16 */ + utf8 = NULL; + ucs4[0] = 0; + utf16[0] = 0x61; utf16[1] = 0x62; utf16[2] = 0xdc01; utf16[3] = 0; + + check_utf16_to_utf8 (utf16, 3, utf8, 0, 2); + check_utf16_to_ucs4 (utf16, 3, ucs4, 0, 2); + + /* invalid ucs4 */ + utf8 = NULL; + ucs4[0] = 0x61; ucs4[1] = 0x62; ucs4[2] = 0x80000000; ucs4[3] = 0; + utf16[0] = 0; + + check_ucs4_to_utf8 (ucs4, 3, utf8, 0, 2); + check_ucs4_to_utf16 (ucs4, 3, utf16, 0, 2); +} + +int +main (int argc, char *argv[]) +{ + test_iconv_state (); + test_one_half (); + test_byte_order (); + test_unicode_conversions (); + + return 0; +} diff --git a/tests/cxx-test.C b/tests/cxx-test.C new file mode 100644 index 0000000..c076e88 --- /dev/null +++ b/tests/cxx-test.C @@ -0,0 +1,10 @@ +#include +#include +#include +#include + +int +main () +{ + return 0; +} diff --git a/tests/date-test.c b/tests/date-test.c new file mode 100644 index 0000000..1a35030 --- /dev/null +++ b/tests/date-test.c @@ -0,0 +1,499 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "glib.h" + +#include +#include +#include +#include +#include + +gboolean failed = FALSE; +guint32 passed = 0; +guint32 notpassed = 0; + +#define TEST(m,cond) G_STMT_START { failed = !(cond); \ +if (failed) \ + exit(1); \ +} G_STMT_END + +void g_date_debug_print(GDate* d) +{ +} + +void g_print_dummy(const char *format, ...) +{ +} + +void fflush_dummy (FILE *f) +{ +} + + +#define g_print g_print_dummy +#define fflush fflush_dummy + +int main(int argc, char** argv) +{ + GDate* d; + guint32 j; + GDateMonth m; + GDateYear y, prev_y; + GDateDay day; + gchar buf[101]; + gchar* loc; + + /* Try to get all the leap year cases. */ + GDateYear check_years[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 98, 99, 100, 101, 102, 103, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, + 1598, 1599, 1600, 1601, 1602, 1650, 1651, + 1897, 1898, 1899, 1900, 1901, 1902, 1903, + 1961, 1962, 1963, 1964, 1965, 1967, + 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, + 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, + 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, + 3000, 3001, 3002, 3998, 3999, 4000, 4001, 4002, 4003 + }; + + guint n_check_years = sizeof(check_years)/sizeof(GDateYear); + + guint i = 0; + gboolean discontinuity = FALSE; + + g_print("checking GDate..."); + + TEST("sizeof(GDate) is not more than 8 bytes on this platform", sizeof(GDate) < 9); + + d = g_date_new(); + + TEST("Empty constructor produces invalid date", !g_date_valid(d)); + + g_date_free(d); + + d = g_date_new_dmy(1,1,1); + + TEST("January 1, Year 1 created and valid", g_date_valid(d)); + + j = g_date_get_julian(d); + + TEST("January 1, Year 1 is Julian date 1", j == 1); + + TEST("Returned month is January", g_date_get_month(d) == G_DATE_JANUARY); + TEST("Returned day is 1", g_date_get_day(d) == 1); + TEST("Returned year is 1", g_date_get_year(d) == 1); + + TEST("Bad month is invalid", !g_date_valid_month(G_DATE_BAD_MONTH)); + TEST("Month 13 is invalid", !g_date_valid_month(13)); + TEST("Bad day is invalid", !g_date_valid_day(G_DATE_BAD_DAY)); + TEST("Day 32 is invalid", !g_date_valid_day(32)); + TEST("Bad year is invalid", !g_date_valid_year(G_DATE_BAD_YEAR)); + TEST("Bad julian is invalid", !g_date_valid_julian(G_DATE_BAD_JULIAN)); + TEST("Bad weekday is invalid", !g_date_valid_weekday(G_DATE_BAD_WEEKDAY)); + TEST("Year 2000 is a leap year", g_date_is_leap_year(2000)); + TEST("Year 1999 is not a leap year", !g_date_is_leap_year(1999)); + TEST("Year 1996 is a leap year", g_date_is_leap_year(1996)); + TEST("Year 1600 is a leap year", g_date_is_leap_year(1600)); + TEST("Year 2100 is not a leap year", !g_date_is_leap_year(2100)); + TEST("Year 1800 is not a leap year", !g_date_is_leap_year(1800)); + + g_date_free(d); + + loc = setlocale(LC_ALL,""); + if (loc) + g_print("\nLocale set to %s\n", loc); + else + g_print("\nLocale unchanged\n"); + + d = g_date_new(); + g_date_set_time(d, time(NULL)); + TEST("Today is valid", g_date_valid(d)); + + g_date_strftime(buf,100,"Today is a %A, %x\n", d); + g_print("%s", buf); + + g_date_set_time(d, 1); + TEST("Beginning of Unix epoch is valid", g_date_valid(d)); + + g_date_strftime(buf,100,"1 second into the Unix epoch it was a %A, in the month of %B, %x\n", d); + g_print("%s", buf); + + g_date_set_julian(d, 1); + TEST("GDate's \"Julian\" epoch's first day is valid", g_date_valid(d)); + + g_date_strftime(buf,100,"Our \"Julian\" epoch begins on a %A, in the month of %B, %x\n", + d); + g_print("%s", buf); + + g_date_set_dmy(d, 10, 1, 2000); + + g_date_strftime(buf,100,"%x", d); + + g_date_set_parse(d, buf); + /* Note: this test will hopefully work, but no promises. */ + TEST("Successfully parsed a %x-formatted string", + g_date_valid(d) && + g_date_get_month(d) == 1 && + g_date_get_day(d) == 10 && + g_date_get_year(d) == 2000); + if (failed) + g_date_debug_print(d); + + g_date_free(d); + + j = G_DATE_BAD_JULIAN; + + i = 0; + discontinuity = TRUE; + y = check_years[0]; + prev_y = G_DATE_BAD_YEAR; + while (i < n_check_years) + { + guint32 first_day_of_year = G_DATE_BAD_JULIAN; + guint16 days_in_year = g_date_is_leap_year(y) ? 366 : 365; + guint sunday_week_of_year = 0; + guint sunday_weeks_in_year = g_date_get_sunday_weeks_in_year(y); + guint monday_week_of_year = 0; + guint monday_weeks_in_year = g_date_get_monday_weeks_in_year(y); + guint iso8601_week_of_year = 0; + + if (discontinuity) + g_print(" (Break in sequence of requested years to check)\n"); + + g_print("Checking year %u", y); + + TEST("Year is valid", g_date_valid_year(y)); + + TEST("Number of Sunday weeks in year is 52 or 53", + sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53); + + TEST("Number of Monday weeks in year is 52 or 53", + monday_weeks_in_year == 52 || monday_weeks_in_year == 53); + + m = 1; + while (m < 13) + { + guint8 dim = g_date_get_days_in_month(m,y); + GDate days[31]; /* This is the fast way, no allocation */ + + TEST("Sensible number of days in month", (dim > 0 && dim < 32)); + + TEST("Month between 1 and 12 is valid", g_date_valid_month(m)); + + day = 1; + + g_date_clear(days, 31); + + while (day <= dim) + { + guint i; + GDate tmp; + + TEST("DMY triplet is valid", g_date_valid_dmy(day,m,y)); + + /* Create GDate with triplet */ + + d = &days[day-1]; + + TEST("Cleared day is invalid", !g_date_valid(d)); + + g_date_set_dmy(d,day,m,y); + + TEST("Set day is valid", g_date_valid(d)); + + if (m == G_DATE_JANUARY && day == 1) + { + first_day_of_year = g_date_get_julian(d); + } + + g_assert(first_day_of_year != G_DATE_BAD_JULIAN); + + TEST("Date with DMY triplet is valid", g_date_valid(d)); + TEST("Month accessor works", g_date_get_month(d) == m); + TEST("Year accessor works", g_date_get_year(d) == y); + TEST("Day of month accessor works", g_date_get_day(d) == day); + + TEST("Day of year is consistent with Julian dates", + ((g_date_get_julian(d) + 1 - first_day_of_year) == + (g_date_get_day_of_year(d)))); + + if (failed) + { + g_print("first day: %u this day: %u day of year: %u\n", + first_day_of_year, + g_date_get_julian(d), + g_date_get_day_of_year(d)); + } + + if (m == G_DATE_DECEMBER && day == 31) + { + TEST("Last day of year equals number of days in year", + g_date_get_day_of_year(d) == days_in_year); + if (failed) + { + g_print("last day: %u days in year: %u\n", + g_date_get_day_of_year(d), days_in_year); + } + } + + TEST("Day of year is not more than number of days in the year", + g_date_get_day_of_year(d) <= days_in_year); + + TEST("Monday week of year is not more than number of weeks in the year", + g_date_get_monday_week_of_year(d) <= monday_weeks_in_year); + if (failed) + { + g_print("Weeks in year: %u\n", monday_weeks_in_year); + g_date_debug_print(d); + } + TEST("Monday week of year is >= than last week of year", + g_date_get_monday_week_of_year(d) >= monday_week_of_year); + + if (g_date_get_weekday(d) == G_DATE_MONDAY) + { + + TEST("Monday week of year on Monday 1 more than previous day's week of year", + (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 1); + if ((m == G_DATE_JANUARY && day <= 4) || + (m == G_DATE_DECEMBER && day >= 29)) { + TEST("ISO 8601 week of year on Monday Dec 29 - Jan 4 is 1", + (g_date_get_iso8601_week_of_year(d) == 1)); + } else { + TEST("ISO 8601 week of year on Monday 1 more than previous day's week of year", + (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 1); + } + } + else + { + TEST("Monday week of year on non-Monday 0 more than previous day's week of year", + (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 0); + if (!(day == 1 && m == G_DATE_JANUARY)) { + TEST("ISO 8601 week of year on non-Monday 0 more than previous day's week of year (", + (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 0); + } + } + + + monday_week_of_year = g_date_get_monday_week_of_year(d); + iso8601_week_of_year = g_date_get_iso8601_week_of_year(d); + + + TEST("Sunday week of year is not more than number of weeks in the year", + g_date_get_sunday_week_of_year(d) <= sunday_weeks_in_year); + if (failed) + { + g_date_debug_print(d); + } + TEST("Sunday week of year is >= than last week of year", + g_date_get_sunday_week_of_year(d) >= sunday_week_of_year); + + if (g_date_get_weekday(d) == G_DATE_SUNDAY) + { + TEST("Sunday week of year on Sunday 1 more than previous day's week of year", + (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 1); + } + else + { + TEST("Sunday week of year on non-Sunday 0 more than previous day's week of year", + (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 0); + } + + sunday_week_of_year = g_date_get_sunday_week_of_year(d); + + TEST("Date is equal to itself", + g_date_compare(d,d) == 0); + + + /*************** Increments ***********/ + + i = 1; + while (i < 402) /* Need to get 400 year increments in */ + { + + /***** Days ******/ + tmp = *d; + g_date_add_days(d, i); + + TEST("Adding days gives a value greater than previous", + g_date_compare(d, &tmp) > 0); + + g_date_subtract_days(d, i); + TEST("Forward days then backward days returns us to current day", + g_date_get_day(d) == day); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward days then backward days returns us to current month", + g_date_get_month(d) == m); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward days then backward days returns us to current year", + g_date_get_year(d) == y); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + /******* Months ********/ + + tmp = *d; + g_date_add_months(d, i); + TEST("Adding months gives a larger value", + g_date_compare(d, &tmp) > 0); + g_date_subtract_months(d, i); + + TEST("Forward months then backward months returns us to current month", + g_date_get_month(d) == m); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward months then backward months returns us to current year", + g_date_get_year(d) == y); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + + if (day < 29) + { + /* Day should be unchanged */ + + TEST("Forward months then backward months returns us to current day", + g_date_get_day(d) == day); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + } + else + { + /* reset the day for later tests */ + g_date_set_day(d, day); + } + + /******* Years ********/ + + tmp = *d; + g_date_add_years(d, i); + + TEST("Adding years gives a larger value", + g_date_compare(d,&tmp) > 0); + + g_date_subtract_years(d, i); + + TEST("Forward years then backward years returns us to current month", + g_date_get_month(d) == m); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward years then backward years returns us to current year", + g_date_get_year(d) == y); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + if (m != 2 && day != 29) + { + TEST("Forward years then backward years returns us to current day", + g_date_get_day(d) == day); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + } + else + { + g_date_set_day(d, day); /* reset */ + } + + i += 10; + } + + /***** increment test relative to our local Julian count */ + + if (!discontinuity) { + + /* We can only run sequence tests between sequential years */ + + TEST("Julians are sequential with increment 1", + j+1 == g_date_get_julian(d)); + if (failed) + { + g_print("Out of sequence, prev: %u expected: %u got: %u\n", + j, j+1, g_date_get_julian(d)); + } + + g_date_add_days(d,1); + TEST("Next day has julian 1 higher", + g_date_get_julian(d) == j + 2); + g_date_subtract_days(d, 1); + + if (j != G_DATE_BAD_JULIAN) + { + g_date_subtract_days(d, 1); + + TEST("Previous day has julian 1 lower", + g_date_get_julian(d) == j); + + g_date_add_days(d, 1); /* back to original */ + } + } + discontinuity = FALSE; /* goes away now */ + + fflush(stdout); + fflush(stderr); + + j = g_date_get_julian(d); /* inc current julian */ + + ++day; + } + ++m; + } + g_print(" done\n"); + ++i; + prev_y = y; + y = check_years[i]; + if (prev_y == G_DATE_BAD_YEAR || + (prev_y + 1) != y) discontinuity = TRUE; + } + + + g_print("\n%u tests passed, %u failed\n",passed, notpassed); + + return 0; +} + + diff --git a/tests/dirname-test.c b/tests/dirname-test.c new file mode 100644 index 0000000..0c8753c --- /dev/null +++ b/tests/dirname-test.c @@ -0,0 +1,121 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include "glib.h" + +int array[10000]; +gboolean failed = FALSE; + +#define TEST(m,cond) G_STMT_START { failed = !(cond); \ +if (failed) \ + { if (!m) \ + g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \ + else \ + g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \ + } \ +else \ + g_print ("."); fflush (stdout); \ +} G_STMT_END + +#define C2P(c) ((gpointer) ((long) (c))) +#define P2C(p) ((gchar) ((long) (p))) + +#define GLIB_TEST_STRING "el dorado " +#define GLIB_TEST_STRING_5 "el do" + +int +main (int argc, + char *argv[]) +{ + gint i; + struct { + gchar *filename; + gchar *dirname; + } dirname_checks[] = { + { "/", "/" }, + { "////", "/" }, + { ".////", "." }, + { ".", "." }, + { "..", "." }, + { "../", ".." }, + { "..////", ".." }, + { "", "." }, + { "a/b", "a" }, + { "a/b/", "a/b" }, + { "c///", "c" }, + { "/a/b", "/a" }, + { "/a/b/", "/a/b" }, +#ifdef G_OS_WIN32 + { "\\", "\\" }, + { ".\\\\\\\\", "." }, + { ".\\/\\/", "." }, + { ".", "." }, + { "..", "." }, + { "..\\", ".." }, + { "..\\\\\\\\", ".." }, + { "..\\//\\", ".." }, + { "", "." }, + { "a\\b", "a" }, + { "a\\b\\", "a\\b" }, + { "\\a\\b", "\\a" }, + { "\\a\\b\\", "\\a\\b" }, + { "c\\\\\\", "c" }, + { "c/\\\\", "c" }, + { "a:", "a:." }, + { "a:foo", "a:." }, + { "a:foo\\bar", "a:foo" }, + { "a:/foo", "a:/" }, + { "a:/foo/bar", "a:/foo" }, + { "a:/", "a:/" }, + { "a://", "a:/" }, + { "a:\\foo", "a:\\" }, + { "a:\\", "a:\\" }, + { "a:\\\\", "a:\\" }, + { "a:\\/", "a:\\" }, +#endif + }; + guint n_dirname_checks = sizeof (dirname_checks) / sizeof (dirname_checks[0]); + + for (i = 0; i < n_dirname_checks; i++) + { + gchar *dirname; + + dirname = g_path_get_dirname (dirname_checks[i].filename); + if (strcmp (dirname, dirname_checks[i].dirname) != 0) + g_error ("%s returned %s, should return %s", + dirname_checks[i].filename, dirname, + dirname_checks[i].dirname); + g_free (dirname); + } + + return 0; +} + diff --git a/tests/env-test.c b/tests/env-test.c new file mode 100644 index 0000000..5fd75df --- /dev/null +++ b/tests/env-test.c @@ -0,0 +1,117 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef GLIB_COMPILATION +#undef GLIB_COMPILATION +#endif + +#include +#include +#include + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +int +main (int argc, char *argv[]) +{ + gboolean result; + const gchar *data; + gchar *variable = "TEST_G_SETENV"; + gchar *value1 = "works"; + gchar *value2 = "again"; + + data = g_getenv (variable); + g_assert (data == NULL && "TEST_G_SETENV already set"); + + result = g_setenv (variable, value1, TRUE); + g_assert (result && "g_setenv() failed"); + + data = g_getenv (variable); + g_assert (data != NULL && "g_getenv() returns NULL"); + g_assert (strcmp (data, value1) == 0 && "g_getenv() returns wrong value"); + + result = g_setenv (variable, value2, FALSE); + g_assert (result && "g_setenv() failed"); + + data = g_getenv (variable); + g_assert (data != NULL && "g_getenv() returns NULL"); + g_assert (strcmp (data, value2) != 0 && "g_setenv() always overwrites"); + g_assert (strcmp (data, value1) == 0 && "g_getenv() returns wrong value"); + + result = g_setenv (variable, value2, TRUE); + g_assert (result && "g_setenv() failed"); + + data = g_getenv (variable); + g_assert (data != NULL && "g_getenv() returns NULL"); + g_assert (strcmp (data, value1) != 0 && "g_setenv() doesn't overwrite"); + g_assert (strcmp (data, value2) == 0 && "g_getenv() returns wrong value"); + + g_unsetenv (variable); + data = g_getenv (variable); + g_assert (data == NULL && "g_unsetenv() doesn't work"); + +#if 0 + /* We can't test this, because it's an illegal argument that + * we g_return_if_fail for. + */ + result = g_setenv ("foo=bar", "baz", TRUE); + g_assert (!result && "g_setenv() accepts '=' in names"); +#endif + + result = g_setenv ("foo", "bar=baz", TRUE); + g_assert (result && "g_setenv() doesn't accept '=' in values"); +#if 0 + /* While glibc supports '=' in names in getenv(), SUS doesn't say anything about it, + * and Solaris doesn't support it. + */ + data = g_getenv ("foo=bar"); + g_assert (strcmp (data, "baz") == 0 && "g_getenv() doesn't support '=' in names"); +#endif + data = g_getenv ("foo"); + g_assert (strcmp (data, "bar=baz") == 0 && "g_getenv() doesn't support '=' in values"); + +#if 0 + /* We can't test this, because it's an illegal argument that + * we g_return_if_fail for. Plus how would we check for failure, + * since we can't set the value... + */ + g_unsetenv ("foo=bar"); +#endif + g_unsetenv ("foo"); + data = g_getenv ("foo"); + g_assert (data == NULL && "g_unsetenv() doesn't support '=' in values"); + + return 0; +} diff --git a/tests/errorcheck-mutex-test.c b/tests/errorcheck-mutex-test.c new file mode 100644 index 0000000..5b30057 --- /dev/null +++ b/tests/errorcheck-mutex-test.c @@ -0,0 +1,131 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN +#define G_ERRORCHECK_MUTEXES + +#include +#include +#include + +static gpointer +locking_thread (gpointer mutex) +{ + g_mutex_lock ((GMutex*)mutex); + + return NULL; +} + +static void +lock_locked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + g_mutex_lock (mutex); + g_mutex_lock (mutex); +} + +static void +trylock_locked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + g_mutex_lock (mutex); + g_mutex_trylock (mutex); +} + +static void +unlock_unlocked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + g_mutex_lock (mutex); + g_mutex_unlock (mutex); + g_mutex_unlock (mutex); +} + +static void +free_locked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + g_mutex_lock (mutex); + g_mutex_free (mutex); +} + +static void +wait_on_unlocked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + GCond* cond = g_cond_new (); + g_cond_wait (cond, mutex); +} + +static void +wait_on_otherwise_locked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + GCond* cond = g_cond_new (); + GThread* thread = g_thread_create (locking_thread, mutex, TRUE, NULL); + g_assert (thread != NULL); + g_usleep (G_USEC_PER_SEC); + g_cond_wait (cond, mutex); +} + +static void +timed_wait_on_unlocked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + GCond* cond = g_cond_new (); + g_cond_timed_wait (cond, mutex, NULL); +} + +static void +timed_wait_on_otherwise_locked_mutex (void) +{ + GMutex* mutex = g_mutex_new (); + GCond* cond = g_cond_new (); + GThread* thread = g_thread_create (locking_thread, mutex, TRUE, NULL); + g_assert (thread != NULL); + g_usleep (G_USEC_PER_SEC); + g_cond_timed_wait (cond, mutex, NULL); +} + +struct +{ + char *name; + void (*func)(); +} func_table[] = +{ + {"lock_locked_mutex", lock_locked_mutex}, + {"trylock_locked_mutex", trylock_locked_mutex}, + {"unlock_unlocked_mutex", unlock_unlocked_mutex}, + {"free_locked_mutex", free_locked_mutex}, + {"wait_on_unlocked_mutex", wait_on_unlocked_mutex}, + {"wait_on_otherwise_locked_mutex", wait_on_otherwise_locked_mutex}, + {"timed_wait_on_unlocked_mutex", timed_wait_on_unlocked_mutex}, + {"timed_wait_on_otherwise_locked_mutex", + timed_wait_on_otherwise_locked_mutex} +}; + +int +main (int argc, char* argv[]) +{ + int i; + + if (argc == 2) + { + for (i = 0; i < G_N_ELEMENTS (func_table); i++) + { + if (strcmp (func_table[i].name, argv[1]) == 0) + { + g_thread_init (NULL); + func_table[i].func (); + g_assert_not_reached (); + } + } + } + + fprintf (stderr, "Usage: errorcheck-mutex-test [TEST]\n\n"); + fprintf (stderr, " where TEST can be one of:\n\n"); + for (i = 0; i < G_N_ELEMENTS (func_table); i++) + { + fprintf (stderr, " %s\n", func_table[i].name); + } + + return 0; +} diff --git a/tests/file-test.c b/tests/file-test.c new file mode 100644 index 0000000..adab1f2 --- /dev/null +++ b/tests/file-test.c @@ -0,0 +1,180 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef GLIB_COMPILATION +#undef GLIB_COMPILATION +#endif + +#include + +#include + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef G_OS_WIN32 +#include /* For read(), write() etc */ +#endif + +static void +test_mkstemp (void) +{ + char template[32]; + int fd; + int i; + const char hello[] = "Hello, World"; + const int hellolen = sizeof (hello) - 1; + char chars[62]; + + strcpy (template, "foobar"); + fd = g_mkstemp (template); + if (fd != -1) + g_warning ("g_mkstemp works even if template doesn't contain XXXXXX"); + close (fd); + + strcpy (template, "foobarXXX"); + fd = g_mkstemp (template); + if (fd != -1) + g_warning ("g_mkstemp works even if template contains less than six X"); + close (fd); + + strcpy (template, "fooXXXXXX"); + fd = g_mkstemp (template); + g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX"); + i = write (fd, hello, hellolen); + g_assert (i != -1 && "write() failed"); + g_assert (i == hellolen && "write() has written too few bytes"); + + lseek (fd, 0, 0); + i = read (fd, chars, sizeof (chars)); + g_assert (i != -1 && "read() failed: %s"); + g_assert (i == hellolen && "read() has got wrong number of bytes"); + + chars[i] = 0; + g_assert (strcmp (chars, hello) == 0 && "read() didn't get same string back"); + + close (fd); + remove (template); + + strcpy (template, "fooXXXXXX.pdf"); + fd = g_mkstemp (template); + g_assert (fd != -1 && "g_mkstemp didn't work for template fooXXXXXX.pdf"); + + close (fd); + remove (template); +} + +static void +test_readlink (void) +{ +#ifdef HAVE_SYMLINK + FILE *file; + int result; + char *filename = "file-test-data"; + char *link1 = "file-test-link1"; + char *link2 = "file-test-link2"; + char *link3 = "file-test-link3"; + char *data; + GError *error; + + file = fopen (filename, "w"); + g_assert (file != NULL && "fopen() failed"); + fclose (file); + + result = symlink (filename, link1); + g_assert (result == 0 && "symlink() failed"); + result = symlink (link1, link2); + g_assert (result == 0 && "symlink() failed"); + + error = NULL; + data = g_file_read_link (link1, &error); + g_assert (data != NULL && "couldn't read link1"); + g_assert (strcmp (data, filename) == 0 && "link1 contains wrong data"); + g_free (data); + + error = NULL; + data = g_file_read_link (link2, &error); + g_assert (data != NULL && "couldn't read link2"); + g_assert (strcmp (data, link1) == 0 && "link2 contains wrong data"); + g_free (data); + + error = NULL; + data = g_file_read_link (link3, &error); + g_assert (data == NULL && "could read link3"); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + + error = NULL; + data = g_file_read_link (filename, &error); + g_assert (data == NULL && "could read regular file as link"); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL); + + remove (filename); + remove (link1); + remove (link2); +#endif +} + +static void +test_get_contents (void) +{ + const gchar *text = "abcdefghijklmnopqrstuvwxyz"; + const gchar *filename = "file-test-get-contents"; + gchar *contents; + gsize len; + FILE *f; + GError *error = NULL; + + f = g_fopen (filename, "w"); + fwrite (text, 1, strlen (text), f); + fclose (f); + + g_assert (g_file_test (filename, G_FILE_TEST_IS_REGULAR)); + + if (! g_file_get_contents (filename, &contents, &len, &error)) + g_error ("g_file_get_contents() failed: %s", error->message); + + g_assert (strcmp (text, contents) == 0 && "content mismatch"); + + g_free (contents); +} + +int +main (int argc, char *argv[]) +{ + test_mkstemp (); + test_readlink (); + test_get_contents (); + + return 0; +} diff --git a/tests/gen-casefold-txt.pl b/tests/gen-casefold-txt.pl new file mode 100755 index 0000000..d028ea9 --- /dev/null +++ b/tests/gen-casefold-txt.pl @@ -0,0 +1,84 @@ +#! /usr/bin/perl -w + +# Copyright (C) 1998, 1999 Tom Tromey +# Copyright (C) 2001 Red Hat Software + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# gen-casefold-test.pl - Generate test cases for casefolding from Unicode data. +# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html +# Usage: +# I consider the output of this program to be unrestricted. Use it as +# you will. + +require 5.006; + +# Names of fields in the CaseFolding table +$FOLDING_CODE = 0; +$FOLDING_STATUS = 1; +$FOLDING_MAPPING = 2; + +my $casefoldlen = 0; +my @casefold; + +if (@ARGV != 2) { + $0 =~ s@.*/@@; + die "Usage: $0 UNICODE-VERSION CaseFolding.txt\n"; +} + +print <) +{ + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + my @fields = split ('\s*;\s*', $_, 30); + + my $raw_code = $fields[$FOLDING_CODE]; + my $code = hex ($raw_code); + + if ($#fields != 3) + { + printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); + next; + } + + # skip simple and Turkic mappings + next if ($fields[$FOLDING_STATUS] =~ /^[ST]$/); + + @values = map { hex ($_) } split /\s+/, $fields[$FOLDING_MAPPING]; + printf ("%s\t%s\n", pack ("U", $code), pack ("U*", @values)); +} + +close INPUT; diff --git a/tests/gen-casemap-txt.pl b/tests/gen-casemap-txt.pl new file mode 100755 index 0000000..0b9fc1d --- /dev/null +++ b/tests/gen-casemap-txt.pl @@ -0,0 +1,258 @@ +#! /usr/bin/perl -w + +# Copyright (C) 1998, 1999 Tom Tromey +# Copyright (C) 2001 Red Hat Software + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# gen-casemap-test.pl - Generate test cases for case mapping from Unicode data. +# See http://www.unicode.org/Public/UNIDATA/UnicodeCharacterDatabase.html +# I consider the output of this program to be unrestricted. Use it as +# you will. + +require 5.006; +use utf8; + +if (@ARGV != 3) { + $0 =~ s@.*/@@; + die "Usage: $0 UNICODE-VERSION UnicodeData.txt SpecialCasing.txt\n"; +} + +use vars qw($CODE $NAME $CATEGORY $COMBINING_CLASSES $BIDI_CATEGORY $DECOMPOSITION $DECIMAL_VALUE $DIGIT_VALUE $NUMERIC_VALUE $MIRRORED $OLD_NAME $COMMENT $UPPER $LOWER $TITLE $BREAK_CODE $BREAK_CATEGORY $BREAK_NAME $CASE_CODE $CASE_LOWER $CASE_TITLE $CASE_UPPER $CASE_CONDITION); + +# Names of fields in Unicode data table. +$CODE = 0; +$NAME = 1; +$CATEGORY = 2; +$COMBINING_CLASSES = 3; +$BIDI_CATEGORY = 4; +$DECOMPOSITION = 5; +$DECIMAL_VALUE = 6; +$DIGIT_VALUE = 7; +$NUMERIC_VALUE = 8; +$MIRRORED = 9; +$OLD_NAME = 10; +$COMMENT = 11; +$UPPER = 12; +$LOWER = 13; +$TITLE = 14; + +# Names of fields in the SpecialCasing table +$CASE_CODE = 0; +$CASE_LOWER = 1; +$CASE_TITLE = 2; +$CASE_UPPER = 3; +$CASE_CONDITION = 4; + +my @upper; +my @title; +my @lower; + +binmode STDOUT, ":utf8"; +open (INPUT, "< $ARGV[1]") || exit 1; + +$last_code = -1; +while () +{ + chop; + @fields = split (';', $_, 30); + if ($#fields != 14) + { + printf STDERR ("Entry for $fields[$CODE] has wrong number of fields (%d)\n", $#fields); + } + + $code = hex ($fields[$CODE]); + + if ($code > $last_code + 1) + { + # Found a gap. + if ($fields[$NAME] =~ /Last>/) + { + # Fill the gap with the last character read, + # since this was a range specified in the char database + @gfields = @fields; + } + else + { + # The gap represents undefined characters. Only the type + # matters. + @gfields = ('', '', 'Cn', '0', '', '', '', '', '', '', '', + '', '', '', ''); + } + for (++$last_code; $last_code < $code; ++$last_code) + { + $gfields{$CODE} = sprintf ("%04x", $last_code); + &process_one ($last_code, @gfields); + } + } + &process_one ($code, @fields); + $last_code = $code; +} + +close INPUT; + +open (INPUT, "< $ARGV[2]") || exit 1; + +while () +{ + my $code; + + chop; + + next if /^#/; + next if /^\s*$/; + + s/\s*#.*//; + + @fields = split ('\s*;\s*', $_, 30); + + $raw_code = $fields[$CASE_CODE]; + $code = hex ($raw_code); + + if ($#fields != 4 && $#fields != 5) + { + printf STDERR ("Entry for $raw_code has wrong number of fields (%d)\n", $#fields); + next; + } + + if (defined $fields[5]) { + # Ignore conditional special cases - we'll handle them manually + next; + } + + $upper[$code] = &make_hex ($fields[$CASE_UPPER]); + $lower[$code] = &make_hex ($fields[$CASE_LOWER]); + $title[$code] = &make_hex ($fields[$CASE_TITLE]); +} + +close INPUT; + +print < LATIN CAPITAL LETTER I WITH DOT ABOVE +tr_TR\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I +tr_TR\tI\x{0307}\ti\tI\x{0307}\tI\x{0307}\t# I => LATIN SMALL LETTER DOTLESS I +tr_TR.UTF-8\ti\ti\t\x{0130}\t\x{0130}\t# i => LATIN CAPITAL LETTER I WITH DOT ABOVE +tr_TR.UTF-8\tI\t\x{0131}\tI\tI\t# I => LATIN SMALL LETTER DOTLESS I +tr_TR.UTF-8\tI\x{0307}\ti\tI\x{0307}\tI\x{0307}\t# I => LATIN SMALL LETTER DOTLESS I +# Test reordering of YPOGEGRAMMENI across other accents +\t\x{03b1}\x{0345}\x{0314}\t\x{03b1}\x{0345}\x{314}\t\x{0391}\x{0345}\x{0314}\t\x{0391}\x{0314}\x{0399}\t +\t\x{03b1}\x{0314}\x{0345}\t\x{03b1}\x{314}\x{0345}\t\x{0391}\x{0314}\x{0345}\t\x{0391}\x{0314}\x{0399}\t +# Handling of final and nonfinal sigma + ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ + ΜΆΙΟΣ μάιος Μάιος ΜΆΙΟΣ + ΣΙΓΜΑ σιγμα Σιγμα ΣΙΓΜΑ +# Lithuanian rule of i followed by letter with dot. Not at all sure +# about the titlecase part here +lt_LT\ti\x{117}\ti\x{117}\tIe\tIE\t +lt_LT\tie\x{307}\tie\x{307}\tIe\tIE\t +lt_LT\t\x{00cc}\ti\x{0307}\x{0300}\t\x{00cc}\t\x{00cc}\t # LATIN CAPITAL LETTER I WITH GRAVE +lt_LT\t\x{00CD}\ti\x{0307}\x{0301}\t\x{00CD}\t\x{00CD}\t # LATIN CAPITAL LETTER I WITH ACUTE +lt_LT\t\x{0128}\ti\x{0307}\x{0303}\t\x{0128}\t\x{0128}\t # LATIN CAPITAL LETTER I WITH TILDE +lt_LT\tI\x{0301}\ti\x{0307}\x{0301}\tI\x{0301}\tI\x{0301}\t # LATIN CAPITAL LETTER I (with acute accent) +lt_LT\tI\x{0300}\ti\x{0307}\x{0300}\tI\x{0300}\tI\x{0300}\t # LATIN CAPITAL LETTER I (with grave accent) +lt_LT\tI\x{0303}\ti\x{0307}\x{0303}\tI\x{0303}\tI\x{0303}\t # LATIN CAPITAL LETTER I (with tilde above) +lt_LT\tI\x{0328}\x{0301}\ti\x{0307}\x{0328}\x{0301}\tI\x{0328}\x{0301}\tI\x{0328}\x{0301}\t # LATIN CAPITAL LETTER I (with ogonek and acute accent) +lt_LT\tJ\x{0301}\tj\x{0307}\x{0301}\tJ\x{0301}\tJ\x{0301}\t # LATIN CAPITAL LETTER J (with acute accent) +lt_LT\t\x{012e}\x{0301}\t\x{012f}\x{0307}\x{0301}\t\x{012e}\x{0301}\t\x{012e}\x{0301}\t # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent) +lt_LT.UTF-8\ti\x{117}\ti\x{117}\tIe\tIE\t +lt_LT.UTF-8\tie\x{307}\tie\x{307}\tIe\tIE\t +lt_LT.UTF-8\t\x{00cc}\ti\x{0307}\x{0300}\t\x{00cc}\t\x{00cc}\t # LATIN CAPITAL LETTER I WITH GRAVE +lt_LT.UTF-8\t\x{00CD}\ti\x{0307}\x{0301}\t\x{00CD}\t\x{00CD}\t # LATIN CAPITAL LETTER I WITH ACUTE +lt_LT.UTF-8\t\x{0128}\ti\x{0307}\x{0303}\t\x{0128}\t\x{0128}\t # LATIN CAPITAL LETTER I WITH TILDE +lt_LT.UTF-8\tI\x{0301}\ti\x{0307}\x{0301}\tI\x{0301}\tI\x{0301}\t # LATIN CAPITAL LETTER I (with acute accent) +lt_LT.UTF-8\tI\x{0300}\ti\x{0307}\x{0300}\tI\x{0300}\tI\x{0300}\t # LATIN CAPITAL LETTER I (with grave accent) +lt_LT.UTF-8\tI\x{0303}\ti\x{0307}\x{0303}\tI\x{0303}\tI\x{0303}\t # LATIN CAPITAL LETTER I (with tilde above) +lt_LT.UTF-8\tI\x{0328}\x{0301}\ti\x{0307}\x{0328}\x{0301}\tI\x{0328}\x{0301}\tI\x{0328}\x{0301}\t # LATIN CAPITAL LETTER I (with ogonek and acute accent) +lt_LT.UTF-8\tJ\x{0301}\tj\x{0307}\x{0301}\tJ\x{0301}\tJ\x{0301}\t # LATIN CAPITAL LETTER J (with acute accent) +lt_LT.UTF-8\t\x{012e}\x{0301}\t\x{012f}\x{0307}\x{0301}\t\x{012e}\x{0301}\t\x{012e}\x{0301}\t # LATIN CAPITAL LETTER I WITH OGONEK (with acute accent) +# Special case not at initial position +\ta\x{fb04}\ta\x{fb04}\tAffl\tAFFL\t# FB04 +# +# Now the automatic tests +# +EOT +&print_tests; + +exit 0; + +# Process a single character. +sub process_one +{ + my ($code, @fields) = @_; + + my $type = $fields[$CATEGORY]; + if ($type eq 'Ll') + { + $upper[$code] = make_hex ($fields[$UPPER]); + $lower[$code] = pack ("U", $code); + $title[$code] = make_hex ($fields[$TITLE]); + } + elsif ($type eq 'Lu') + { + $lower[$code] = make_hex ($fields[$LOWER]); + $upper[$code] = pack ("U", $code); + $title[$code] = make_hex ($fields[$TITLE]); + } + + if ($type eq 'Lt') + { + $upper[$code] = make_hex ($fields[$UPPER]); + $lower[$code] = pack ("U", hex ($fields[$LOWER])); + $title[$code] = make_hex ($fields[$LOWER]); + } +} + +sub print_tests +{ + for ($i = 0; $i < 0x10ffff; $i++) { + if ($i == 0x3A3) { + # Greek sigma needs special tests + next; + } + + my $lower = $lower[$i]; + my $title = $title[$i]; + my $upper = $upper[$i]; + + if (defined $upper || defined $lower || defined $title) { + printf "\t%s\t%s\t%s\t%s\t# %4X\n", + pack ("U", $i), + (defined $lower ? $lower : ""), + (defined $title ? $title : ""), + (defined $upper ? $upper : ""), + $i; + } + } +} + +sub make_hex +{ + my $codes = shift; + + $codes =~ s/^\s+//; + $codes =~ s/\s+$//; + + if ($codes eq "0" || $codes eq "") { + return ""; + } else { + return pack ("U*", map { hex ($_) } split /\s+/, $codes); + } +} diff --git a/tests/gio-test.c b/tests/gio-test.c new file mode 100644 index 0000000..cc56ef4 --- /dev/null +++ b/tests/gio-test.c @@ -0,0 +1,445 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2000 Tor Lillqvist + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* A test program for the main loop and IO channel code. + * Just run it. Optional parameter is number of sub-processes. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "config.h" + +#include + +#include +#include +#include +#include + +#ifdef G_OS_WIN32 + #include + #include + #include + #define STRICT + #include + #define pipe(fds) _pipe(fds, 4096, _O_BINARY) +#else + #ifdef HAVE_UNISTD_H + #include + #endif +#endif + +static int nrunning; +static GMainLoop *main_loop; + +#define BUFSIZE 5000 /* Larger than the circular buffer in + * giowin32.c on purpose. + */ + +static int nkiddies; + +static struct { + int fd; + int seq; +} *seqtab; + +static GIOError +read_all (int fd, + GIOChannel *channel, + char *buffer, + guint nbytes, + guint *bytes_read) +{ + guint left = nbytes; + gsize nb; + GIOError error = G_IO_ERROR_NONE; + char *bufp = buffer; + + /* g_io_channel_read() doesn't necessarily return all the + * data we want at once. + */ + *bytes_read = 0; + while (left) + { + error = g_io_channel_read (channel, bufp, left, &nb); + + if (error != G_IO_ERROR_NONE) + { + g_print ("gio-test: ...from %d: G_IO_ERROR_%s\n", fd, + (error == G_IO_ERROR_AGAIN ? "AGAIN" : + (error == G_IO_ERROR_INVAL ? "INVAL" : + (error == G_IO_ERROR_UNKNOWN ? "UNKNOWN" : "???")))); + if (error == G_IO_ERROR_AGAIN) + continue; + break; + } + if (nb == 0) + return error; + left -= nb; + bufp += nb; + *bytes_read += nb; + } + return error; +} + +static void +shutdown_source (gpointer data) +{ + if (g_source_remove (*(guint *) data)) + { + nrunning--; + if (nrunning == 0) + g_main_loop_quit (main_loop); + } +} + +static gboolean +recv_message (GIOChannel *channel, + GIOCondition cond, + gpointer data) +{ + gint fd = g_io_channel_unix_get_fd (channel); + gboolean retval = TRUE; + +#ifdef VERBOSE + g_print ("gio-test: ...from %d:%s%s%s%s\n", fd, + (cond & G_IO_ERR) ? " ERR" : "", + (cond & G_IO_HUP) ? " HUP" : "", + (cond & G_IO_IN) ? " IN" : "", + (cond & G_IO_PRI) ? " PRI" : ""); +#endif + + if (cond & (G_IO_ERR | G_IO_HUP)) + { + shutdown_source (data); + retval = FALSE; + } + + if (cond & G_IO_IN) + { + char buf[BUFSIZE]; + guint nbytes; + guint nb; + int i, j, seq; + GIOError error; + + error = read_all (fd, channel, (gchar *) &seq, sizeof (seq), &nb); + if (error == G_IO_ERROR_NONE) + { + if (nb == 0) + { +#ifdef VERBOSE + g_print ("gio-test: ...from %d: EOF\n", fd); +#endif + shutdown_source (data); + return FALSE; + } + + g_assert (nb == sizeof (nbytes)); + + for (i = 0; i < nkiddies; i++) + if (seqtab[i].fd == fd) + { + if (seq != seqtab[i].seq) + { + g_print ("gio-test: ...from %d: invalid sequence number %d, expected %d\n", + fd, seq, seqtab[i].seq); + g_assert_not_reached (); + } + seqtab[i].seq++; + break; + } + + error = read_all (fd, channel, (gchar *) &nbytes, sizeof (nbytes), &nb); + } + + if (error != G_IO_ERROR_NONE) + return FALSE; + + if (nb == 0) + { +#ifdef VERBOSE + g_print ("gio-test: ...from %d: EOF\n", fd); +#endif + shutdown_source (data); + return FALSE; + } + + g_assert (nb == sizeof (nbytes)); + + if (nbytes >= BUFSIZE) + { + g_print ("gio-test: ...from %d: nbytes = %d (%#x)!\n", fd, nbytes, nbytes); + g_assert_not_reached (); + } + g_assert (nbytes >= 0 && nbytes < BUFSIZE); +#ifdef VERBOSE + g_print ("gio-test: ...from %d: %d bytes\n", fd, nbytes); +#endif + if (nbytes > 0) + { + error = read_all (fd, channel, buf, nbytes, &nb); + + if (error != G_IO_ERROR_NONE) + return FALSE; + + if (nb == 0) + { +#ifdef VERBOSE + g_print ("gio-test: ...from %d: EOF\n", fd); +#endif + shutdown_source (data); + return FALSE; + } + + for (j = 0; j < nbytes; j++) + if (buf[j] != ' ' + ((nbytes + j) % 95)) + { + g_print ("gio-test: ...from %d: buf[%d] == '%c', should be '%c'\n", + fd, j, buf[j], 'a' + ((nbytes + j) % 32)); + g_assert_not_reached (); + } +#ifdef VERBOSE + g_print ("gio-test: ...from %d: OK\n", fd); +#endif + } + } + return retval; +} + +#ifdef G_OS_WIN32 + +static gboolean +recv_windows_message (GIOChannel *channel, + GIOCondition cond, + gpointer data) +{ + GIOError error; + MSG msg; + guint nb; + + while (1) + { + error = g_io_channel_read (channel, &msg, sizeof (MSG), &nb); + + if (error != G_IO_ERROR_NONE) + { + g_print ("gio-test: ...reading Windows message: G_IO_ERROR_%s\n", + (error == G_IO_ERROR_AGAIN ? "AGAIN" : + (error == G_IO_ERROR_INVAL ? "INVAL" : + (error == G_IO_ERROR_UNKNOWN ? "UNKNOWN" : "???")))); + if (error == G_IO_ERROR_AGAIN) + continue; + } + break; + } + + g_print ("gio-test: ...Windows message for %#x: %d,%d,%d\n", + msg.hwnd, msg.message, msg.wParam, msg.lParam); + + return TRUE; +} + +LRESULT CALLBACK +window_procedure (HWND hwnd, + UINT message, + WPARAM wparam, + LPARAM lparam) +{ + g_print ("gio-test: window_procedure for %#x: %d,%d,%d\n", + hwnd, message, wparam, lparam); + return DefWindowProc (hwnd, message, wparam, lparam); +} + +#endif + +int +main (int argc, + char **argv) +{ + if (argc < 3) + { + /* Parent */ + + GIOChannel *my_read_channel; + gchar *cmdline; + guint *id; + int i; +#ifdef G_OS_WIN32 + GTimeVal start, end; + GPollFD pollfd; + int pollresult; + ATOM klass; + static WNDCLASS wcl; + HWND hwnd; + GIOChannel *windows_messages_channel; +#endif + + nkiddies = (argc == 1 ? 1 : atoi(argv[1])); + seqtab = g_malloc (nkiddies * 2 * sizeof (int)); + +#ifdef G_OS_WIN32 + wcl.style = 0; + wcl.lpfnWndProc = window_procedure; + wcl.cbClsExtra = 0; + wcl.cbWndExtra = 0; + wcl.hInstance = GetModuleHandle (NULL); + wcl.hIcon = NULL; + wcl.hCursor = NULL; + wcl.hbrBackground = NULL; + wcl.lpszMenuName = NULL; + wcl.lpszClassName = "gio-test"; + + klass = RegisterClass (&wcl); + + if (!klass) + { + g_print ("gio-test: RegisterClass failed\n"); + exit (1); + } + + hwnd = CreateWindow (MAKEINTATOM(klass), "gio-test", 0, 0, 0, 10, 10, + NULL, NULL, wcl.hInstance, NULL); + if (!hwnd) + { + g_print ("gio-test: CreateWindow failed\n"); + exit (1); + } + + windows_messages_channel = g_io_channel_win32_new_messages ((guint)hwnd); + g_io_add_watch (windows_messages_channel, G_IO_IN, recv_windows_message, 0); +#endif + + for (i = 0; i < nkiddies; i++) + { + int pipe_to_sub[2], pipe_from_sub[2]; + + if (pipe (pipe_to_sub) == -1 || + pipe (pipe_from_sub) == -1) + perror ("pipe"), exit (1); + + seqtab[i].fd = pipe_from_sub[0]; + seqtab[i].seq = 0; + + my_read_channel = g_io_channel_unix_new (pipe_from_sub[0]); + + id = g_new (guint, 1); + *id = + g_io_add_watch (my_read_channel, + G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, + recv_message, + id); + + nrunning++; + +#ifdef G_OS_WIN32 + cmdline = g_strdup_printf ("%d:%d:%d", + pipe_to_sub[0], + pipe_from_sub[1], + hwnd); + _spawnl (_P_NOWAIT, argv[0], argv[0], "--child", cmdline, NULL); +#else + cmdline = g_strdup_printf ("%s --child %d:%d &", argv[0], + pipe_to_sub[0], pipe_from_sub[1]); + + system (cmdline); +#endif + close (pipe_to_sub[0]); + close (pipe_from_sub [1]); + +#ifdef G_OS_WIN32 + g_get_current_time (&start); + g_io_channel_win32_make_pollfd (my_read_channel, G_IO_IN, &pollfd); + pollresult = g_io_channel_win32_poll (&pollfd, 1, 100); + g_get_current_time (&end); + if (end.tv_usec < start.tv_usec) + end.tv_sec--, end.tv_usec += 1000000; + g_print ("gio-test: had to wait %ld.%03ld s, result:%d\n", + end.tv_sec - start.tv_sec, + (end.tv_usec - start.tv_usec) / 1000, + pollresult); +#endif + } + + main_loop = g_main_loop_new (NULL, FALSE); + + g_main_loop_run (main_loop); + } + else if (argc == 3) + { + /* Child */ + + int readfd, writefd; +#ifdef G_OS_WIN32 + HWND hwnd; +#endif + int i, j; + char buf[BUFSIZE]; + int buflen; + GTimeVal tv; + int n; + + g_get_current_time (&tv); + + sscanf (argv[2], "%d:%d%n", &readfd, &writefd, &n); + +#ifdef G_OS_WIN32 + sscanf (argv[2] + n, ":%d", &hwnd); +#endif + + srand (tv.tv_sec ^ (tv.tv_usec / 1000) ^ readfd ^ (writefd << 4)); + + for (i = 0; i < 20 + rand() % 20; i++) + { + g_usleep (100 + (rand() % 10) * 5000); + buflen = rand() % BUFSIZE; + for (j = 0; j < buflen; j++) + buf[j] = ' ' + ((buflen + j) % 95); +#ifdef VERBOSE + g_print ("gio-test: child writing %d+%d bytes to %d\n", + (int)(sizeof(i) + sizeof(buflen)), buflen, writefd); +#endif + write (writefd, &i, sizeof (i)); + write (writefd, &buflen, sizeof (buflen)); + write (writefd, buf, buflen); + +#ifdef G_OS_WIN32 + if (rand() % 100 < 5) + { + int msg = WM_USER + (rand() % 100); + WPARAM wparam = rand (); + LPARAM lparam = rand (); + g_print ("gio-test: child posting message %d,%d,%d to %#x\n", + msg, wparam, lparam, hwnd); + PostMessage (hwnd, msg, wparam, lparam); + } +#endif + } +#ifdef VERBOSE + g_print ("gio-test: child exiting, closing %d\n", writefd); +#endif + close (writefd); + } + else + g_print ("Huh?\n"); + + return 0; +} + diff --git a/tests/gobject/Makefile.am b/tests/gobject/Makefile.am new file mode 100644 index 0000000..9cfb33b --- /dev/null +++ b/tests/gobject/Makefile.am @@ -0,0 +1,101 @@ +include $(top_srcdir)/Makefile.decl + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) + +libglib = $(top_builddir)/glib/libglib-2.0.la +libgthread = $(top_builddir)/gthread/libgthread-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la +libgobject = $(top_builddir)/gobject/libgobject-2.0.la + + +# libtool dependency tracking seems broken. this is currently +# required to get the tests to dynamic link against the in-tree +# libglib instead of the system one +libgobject += $(libglib) + +######################################################################## + +noinst_LTLIBRARIES = libtestgobject.la + +libtestgobject_la_SOURCES = \ + testcommon.h \ + testmarshal.h \ + testmarshal.c \ + testmodule.c \ + testmodule.h + +if CROSS_COMPILING + glib_genmarshal=$(GLIB_GENMARSHAL) +else + glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal +endif + +testmarshal.h: stamp-testmarshal.h + @true +stamp-testmarshal.h: @REBUILD@ testmarshal.list $(glib_genmarshal) + $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --header >> xgen-gmh \ + && (cmp -s xgen-gmh testmarshal.h 2>/dev/null || cp xgen-gmh testmarshal.h) \ + && rm -f xgen-gmh xgen-gmh~ \ + && echo timestamp > $@ +testmarshal.c: @REBUILD@ testmarshal.list $(glib_genmarshal) + $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --body >> xgen-gmc \ + && cp xgen-gmc testmarshal.c \ + && rm -f xgen-gmc xgen-gmc~ + +BUILT_SOURCES = testmarshal.h testmarshal.c +CLEANFILES = stamp-testmarshal.h + +######################################################################## + +LDADD = libtestgobject.la $(libgobject) + +test_programs = \ + deftype \ + gvalue-test \ + paramspec-test \ + accumulator \ + defaultiface \ + dynamictype \ + ifacecheck \ + ifaceinit \ + ifaceinherit \ + ifaceproperties \ + override \ + performance \ + performance-threaded \ + singleton \ + references + +performance_LDADD = $(libgobject) $(libgthread) +performance_threaded_LDADD = $(libgobject) $(libgthread) +check_PROGRAMS = $(test_programs) + +TESTS = $(test_programs) +TESTS_ENVIRONMENT = srcdir=$(srcdir) \ + LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset \ + MALLOC_CHECK_=2 \ + MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) + +######################################################################## + +EXTRA_DIST += \ + testmarshal.list + +BUILT_EXTRA_DIST = \ + testmarshal.h \ + testmarshal.c + +dist-hook: $(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 + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + fi diff --git a/tests/gobject/Makefile.in b/tests/gobject/Makefile.in new file mode 100644 index 0000000..44de50d --- /dev/null +++ b/tests/gobject/Makefile.in @@ -0,0 +1,982 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines + +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +check_PROGRAMS = $(am__EXEEXT_1) +TESTS = $(am__EXEEXT_1) +subdir = tests/gobject +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libtestgobject_la_LIBADD = +am_libtestgobject_la_OBJECTS = testmarshal.lo testmodule.lo +libtestgobject_la_OBJECTS = $(am_libtestgobject_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +am__EXEEXT_1 = deftype$(EXEEXT) gvalue-test$(EXEEXT) \ + paramspec-test$(EXEEXT) accumulator$(EXEEXT) \ + defaultiface$(EXEEXT) dynamictype$(EXEEXT) ifacecheck$(EXEEXT) \ + ifaceinit$(EXEEXT) ifaceinherit$(EXEEXT) \ + ifaceproperties$(EXEEXT) override$(EXEEXT) \ + performance$(EXEEXT) performance-threaded$(EXEEXT) \ + singleton$(EXEEXT) references$(EXEEXT) +accumulator_SOURCES = accumulator.c +accumulator_OBJECTS = accumulator.$(OBJEXT) +accumulator_LDADD = $(LDADD) +accumulator_DEPENDENCIES = libtestgobject.la $(libgobject) +defaultiface_SOURCES = defaultiface.c +defaultiface_OBJECTS = defaultiface.$(OBJEXT) +defaultiface_LDADD = $(LDADD) +defaultiface_DEPENDENCIES = libtestgobject.la $(libgobject) +deftype_SOURCES = deftype.c +deftype_OBJECTS = deftype.$(OBJEXT) +deftype_LDADD = $(LDADD) +deftype_DEPENDENCIES = libtestgobject.la $(libgobject) +dynamictype_SOURCES = dynamictype.c +dynamictype_OBJECTS = dynamictype.$(OBJEXT) +dynamictype_LDADD = $(LDADD) +dynamictype_DEPENDENCIES = libtestgobject.la $(libgobject) +gvalue_test_SOURCES = gvalue-test.c +gvalue_test_OBJECTS = gvalue-test.$(OBJEXT) +gvalue_test_LDADD = $(LDADD) +gvalue_test_DEPENDENCIES = libtestgobject.la $(libgobject) +ifacecheck_SOURCES = ifacecheck.c +ifacecheck_OBJECTS = ifacecheck.$(OBJEXT) +ifacecheck_LDADD = $(LDADD) +ifacecheck_DEPENDENCIES = libtestgobject.la $(libgobject) +ifaceinherit_SOURCES = ifaceinherit.c +ifaceinherit_OBJECTS = ifaceinherit.$(OBJEXT) +ifaceinherit_LDADD = $(LDADD) +ifaceinherit_DEPENDENCIES = libtestgobject.la $(libgobject) +ifaceinit_SOURCES = ifaceinit.c +ifaceinit_OBJECTS = ifaceinit.$(OBJEXT) +ifaceinit_LDADD = $(LDADD) +ifaceinit_DEPENDENCIES = libtestgobject.la $(libgobject) +ifaceproperties_SOURCES = ifaceproperties.c +ifaceproperties_OBJECTS = ifaceproperties.$(OBJEXT) +ifaceproperties_LDADD = $(LDADD) +ifaceproperties_DEPENDENCIES = libtestgobject.la $(libgobject) +override_SOURCES = override.c +override_OBJECTS = override.$(OBJEXT) +override_LDADD = $(LDADD) +override_DEPENDENCIES = libtestgobject.la $(libgobject) +paramspec_test_SOURCES = paramspec-test.c +paramspec_test_OBJECTS = paramspec-test.$(OBJEXT) +paramspec_test_LDADD = $(LDADD) +paramspec_test_DEPENDENCIES = libtestgobject.la $(libgobject) +performance_SOURCES = performance.c +performance_OBJECTS = performance.$(OBJEXT) +performance_DEPENDENCIES = $(libgobject) $(libgthread) +performance_threaded_SOURCES = performance-threaded.c +performance_threaded_OBJECTS = performance-threaded.$(OBJEXT) +performance_threaded_DEPENDENCIES = $(libgobject) $(libgthread) +references_SOURCES = references.c +references_OBJECTS = references.$(OBJEXT) +references_LDADD = $(LDADD) +references_DEPENDENCIES = libtestgobject.la $(libgobject) +singleton_SOURCES = singleton.c +singleton_OBJECTS = singleton.$(OBJEXT) +singleton_LDADD = $(LDADD) +singleton_DEPENDENCIES = libtestgobject.la $(libgobject) +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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libtestgobject_la_SOURCES) accumulator.c defaultiface.c \ + deftype.c dynamictype.c gvalue-test.c ifacecheck.c \ + ifaceinherit.c ifaceinit.c ifaceproperties.c override.c \ + paramspec-test.c performance.c performance-threaded.c \ + references.c singleton.c +DIST_SOURCES = $(libtestgobject_la_SOURCES) accumulator.c \ + defaultiface.c deftype.c dynamictype.c gvalue-test.c \ + ifacecheck.c ifaceinherit.c ifaceinit.c ifaceproperties.c \ + override.c paramspec-test.c performance.c \ + performance-threaded.c references.c singleton.c +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending + +######################################################################## +EXTRA_DIST = testmarshal.list +TEST_PROGS = +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) + +libglib = $(top_builddir)/glib/libglib-2.0.la +libgthread = $(top_builddir)/gthread/libgthread-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la + +# libtool dependency tracking seems broken. this is currently +# required to get the tests to dynamic link against the in-tree +# libglib instead of the system one +libgobject = $(top_builddir)/gobject/libgobject-2.0.la $(libglib) + +######################################################################## +noinst_LTLIBRARIES = libtestgobject.la +libtestgobject_la_SOURCES = \ + testcommon.h \ + testmarshal.h \ + testmarshal.c \ + testmodule.c \ + testmodule.h + +@CROSS_COMPILING_FALSE@glib_genmarshal = $(top_builddir)/gobject/glib-genmarshal +@CROSS_COMPILING_TRUE@glib_genmarshal = $(GLIB_GENMARSHAL) +BUILT_SOURCES = testmarshal.h testmarshal.c +CLEANFILES = stamp-testmarshal.h + +######################################################################## +LDADD = libtestgobject.la $(libgobject) +test_programs = \ + deftype \ + gvalue-test \ + paramspec-test \ + accumulator \ + defaultiface \ + dynamictype \ + ifacecheck \ + ifaceinit \ + ifaceinherit \ + ifaceproperties \ + override \ + performance \ + performance-threaded \ + singleton \ + references + +performance_LDADD = $(libgobject) $(libgthread) +performance_threaded_LDADD = $(libgobject) $(libgthread) +TESTS_ENVIRONMENT = srcdir=$(srcdir) \ + LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset \ + MALLOC_CHECK_=2 \ + MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) + +BUILT_EXTRA_DIST = \ + testmarshal.h \ + testmarshal.c + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu tests/gobject/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/gobject/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 +libtestgobject.la: $(libtestgobject_la_OBJECTS) $(libtestgobject_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libtestgobject_la_OBJECTS) $(libtestgobject_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_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 +accumulator$(EXEEXT): $(accumulator_OBJECTS) $(accumulator_DEPENDENCIES) + @rm -f accumulator$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(accumulator_OBJECTS) $(accumulator_LDADD) $(LIBS) +defaultiface$(EXEEXT): $(defaultiface_OBJECTS) $(defaultiface_DEPENDENCIES) + @rm -f defaultiface$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(defaultiface_OBJECTS) $(defaultiface_LDADD) $(LIBS) +deftype$(EXEEXT): $(deftype_OBJECTS) $(deftype_DEPENDENCIES) + @rm -f deftype$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(deftype_OBJECTS) $(deftype_LDADD) $(LIBS) +dynamictype$(EXEEXT): $(dynamictype_OBJECTS) $(dynamictype_DEPENDENCIES) + @rm -f dynamictype$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dynamictype_OBJECTS) $(dynamictype_LDADD) $(LIBS) +gvalue-test$(EXEEXT): $(gvalue_test_OBJECTS) $(gvalue_test_DEPENDENCIES) + @rm -f gvalue-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(gvalue_test_OBJECTS) $(gvalue_test_LDADD) $(LIBS) +ifacecheck$(EXEEXT): $(ifacecheck_OBJECTS) $(ifacecheck_DEPENDENCIES) + @rm -f ifacecheck$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ifacecheck_OBJECTS) $(ifacecheck_LDADD) $(LIBS) +ifaceinherit$(EXEEXT): $(ifaceinherit_OBJECTS) $(ifaceinherit_DEPENDENCIES) + @rm -f ifaceinherit$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ifaceinherit_OBJECTS) $(ifaceinherit_LDADD) $(LIBS) +ifaceinit$(EXEEXT): $(ifaceinit_OBJECTS) $(ifaceinit_DEPENDENCIES) + @rm -f ifaceinit$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ifaceinit_OBJECTS) $(ifaceinit_LDADD) $(LIBS) +ifaceproperties$(EXEEXT): $(ifaceproperties_OBJECTS) $(ifaceproperties_DEPENDENCIES) + @rm -f ifaceproperties$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ifaceproperties_OBJECTS) $(ifaceproperties_LDADD) $(LIBS) +override$(EXEEXT): $(override_OBJECTS) $(override_DEPENDENCIES) + @rm -f override$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(override_OBJECTS) $(override_LDADD) $(LIBS) +paramspec-test$(EXEEXT): $(paramspec_test_OBJECTS) $(paramspec_test_DEPENDENCIES) + @rm -f paramspec-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(paramspec_test_OBJECTS) $(paramspec_test_LDADD) $(LIBS) +performance$(EXEEXT): $(performance_OBJECTS) $(performance_DEPENDENCIES) + @rm -f performance$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(performance_OBJECTS) $(performance_LDADD) $(LIBS) +performance-threaded$(EXEEXT): $(performance_threaded_OBJECTS) $(performance_threaded_DEPENDENCIES) + @rm -f performance-threaded$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(performance_threaded_OBJECTS) $(performance_threaded_LDADD) $(LIBS) +references$(EXEEXT): $(references_OBJECTS) $(references_DEPENDENCIES) + @rm -f references$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(references_OBJECTS) $(references_LDADD) $(LIBS) +singleton$(EXEEXT): $(singleton_OBJECTS) $(singleton_DEPENDENCIES) + @rm -f singleton$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(singleton_OBJECTS) $(singleton_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accumulator.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/defaultiface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deftype.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynamictype.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvalue-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifacecheck.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifaceinherit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifaceinit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ifaceproperties.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/override.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramspec-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/performance-threaded.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/performance.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/references.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/singleton.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testmarshal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testmodule.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-local distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am check-local \ + clean clean-checkPROGRAMS clean-generic clean-libtool \ + clean-noinstLTLIBRARIES ctags dist-hook distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-local 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 maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +testmarshal.h: stamp-testmarshal.h + @true +stamp-testmarshal.h: @REBUILD@ testmarshal.list $(glib_genmarshal) + $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --header >> xgen-gmh \ + && (cmp -s xgen-gmh testmarshal.h 2>/dev/null || cp xgen-gmh testmarshal.h) \ + && rm -f xgen-gmh xgen-gmh~ \ + && echo timestamp > $@ +testmarshal.c: @REBUILD@ testmarshal.list $(glib_genmarshal) + $(glib_genmarshal) --prefix=test_marshal $(srcdir)/testmarshal.list --body >> xgen-gmc \ + && cp xgen-gmc testmarshal.c \ + && rm -f xgen-gmc xgen-gmc~ + +dist-hook: $(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 + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + fi + +# 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/tests/gobject/accumulator.c b/tests/gobject/accumulator.c new file mode 100644 index 0000000..602ab11 --- /dev/null +++ b/tests/gobject/accumulator.c @@ -0,0 +1,227 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestAccumulator" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include + +#include "testmarshal.h" +#include "testcommon.h" + +/* What this test tests is the behavior of signal accumulators + * Two accumulators are tested: + * + * 1: A custom accumulator that appends the returned strings + * 2: The standard g_signal_accumulator_true_handled that stops + * emission on TRUE returns. + */ + +/* + * TestObject, a parent class for TestObject + */ +#define TEST_TYPE_OBJECT (test_object_get_type ()) +typedef struct _TestObject TestObject; +typedef struct _TestObjectClass TestObjectClass; + +struct _TestObject +{ + GObject parent_instance; +}; +struct _TestObjectClass +{ + GObjectClass parent_class; + + gchar* (*test_signal1) (TestObject *tobject, + gint param); + gboolean (*test_signal2) (TestObject *tobject, + gint param); +}; + +static GType test_object_get_type (void); + +static gboolean +test_signal1_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer data) +{ + const gchar *accu_string = g_value_get_string (return_accu); + const gchar *new_string = g_value_get_string (handler_return); + gchar *result_string; + + if (accu_string) + result_string = g_strconcat (accu_string, new_string, NULL); + else if (new_string) + result_string = g_strdup (new_string); + else + result_string = NULL; + + g_value_set_string_take_ownership (return_accu, result_string); + + return TRUE; +} + +gchar* +test_object_signal1_callback_before (TestObject *tobject, + gint param, + gpointer data) +{ + return g_strdup (""); +} + +gchar* +test_object_real_signal1 (TestObject *tobject, + gint param) +{ + return g_strdup (""); +} + +gchar* +test_object_signal1_callback_after (TestObject *tobject, + gint param, + gpointer data) +{ + return g_strdup (""); +} + +gboolean +test_object_signal2_callback_before (TestObject *tobject, + gint param) +{ + switch (param) + { + case 1: return TRUE; + case 2: return FALSE; + case 3: return FALSE; + case 4: return FALSE; + } + + g_assert_not_reached (); + return FALSE; +} + +gboolean +test_object_real_signal2 (TestObject *tobject, + gint param) +{ + switch (param) + { + case 1: g_assert_not_reached (); return FALSE; + case 2: return TRUE; + case 3: return FALSE; + case 4: return FALSE; + } + + g_assert_not_reached (); + return FALSE; +} + +gboolean +test_object_signal2_callback_after (TestObject *tobject, + gint param) +{ + switch (param) + { + case 1: g_assert_not_reached (); return FALSE; + case 2: g_assert_not_reached (); return FALSE; + case 3: return TRUE; + case 4: return FALSE; + } + + g_assert_not_reached (); + return FALSE; +} + +static void +test_object_class_init (TestObjectClass *class) +{ + class->test_signal1 = test_object_real_signal1; + class->test_signal2 = test_object_real_signal2; + + g_signal_new ("test-signal1", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestObjectClass, test_signal1), + test_signal1_accumulator, NULL, + test_marshal_STRING__INT, + G_TYPE_STRING, 1, G_TYPE_INT); + g_signal_new ("test-signal2", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestObjectClass, test_signal2), + g_signal_accumulator_true_handled, NULL, + test_marshal_BOOLEAN__INT, + G_TYPE_BOOLEAN, 1, G_TYPE_INT); +} + +static DEFINE_TYPE(TestObject, test_object, + test_object_class_init, NULL, NULL, + G_TYPE_OBJECT) + +int +main (int argc, + char *argv[]) +{ + TestObject *object; + gchar *string_result; + gboolean bool_result; + + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + object = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_signal_connect (object, "test-signal1", + G_CALLBACK (test_object_signal1_callback_before), NULL); + g_signal_connect_after (object, "test-signal1", + G_CALLBACK (test_object_signal1_callback_after), NULL); + + g_signal_emit_by_name (object, "test-signal1", 0, &string_result); + g_assert (strcmp (string_result, "") == 0); + g_free (string_result); + + g_signal_connect (object, "test-signal2", + G_CALLBACK (test_object_signal2_callback_before), NULL); + g_signal_connect_after (object, "test-signal2", + G_CALLBACK (test_object_signal2_callback_after), NULL); + + bool_result = FALSE; + g_signal_emit_by_name (object, "test-signal2", 1, &bool_result); + g_assert (bool_result == TRUE); + bool_result = FALSE; + g_signal_emit_by_name (object, "test-signal2", 2, &bool_result); + g_assert (bool_result == TRUE); + bool_result = FALSE; + g_signal_emit_by_name (object, "test-signal2", 3, &bool_result); + g_assert (bool_result == TRUE); + bool_result = TRUE; + g_signal_emit_by_name (object, "test-signal2", 4, &bool_result); + g_assert (bool_result == FALSE); + + return 0; +} diff --git a/tests/gobject/defaultiface.c b/tests/gobject/defaultiface.c new file mode 100644 index 0000000..2ebe890 --- /dev/null +++ b/tests/gobject/defaultiface.c @@ -0,0 +1,191 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestDefaultIface" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include "testcommon.h" +#include "testmodule.h" + +/* This test tests getting the default vtable for an interface + * and the initialization and finalization of such default + * interfaces. + * + * We test this both for static and for dynamic interfaces. + */ + +/********************************************************************** + * Static interface tests + **********************************************************************/ + +typedef struct _TestStaticIfaceClass TestStaticIfaceClass; + +struct _TestStaticIfaceClass +{ + GTypeInterface base_iface; + guint val; +}; + +#define TEST_TYPE_STATIC_IFACE (test_static_iface_get_type ()) + +static void +test_static_iface_default_init (TestStaticIfaceClass *iface) +{ + iface->val = 42; +} + +DEFINE_IFACE (TestStaticIface, test_static_iface, + NULL, test_static_iface_default_init) + +static void +test_static_iface (void) +{ + TestStaticIfaceClass *static_iface; + + /* Not loaded until we call ref for the first time */ + static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE); + g_assert (static_iface == NULL); + + /* Ref loads */ + static_iface = g_type_default_interface_ref (TEST_TYPE_STATIC_IFACE); + g_assert (static_iface && static_iface->val == 42); + + /* Peek then works */ + static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE); + g_assert (static_iface && static_iface->val == 42); + + /* Unref does nothing */ + g_type_default_interface_unref (static_iface); + + /* And peek still works */ + static_iface = g_type_default_interface_peek (TEST_TYPE_STATIC_IFACE); + g_assert (static_iface && static_iface->val == 42); +} + +/********************************************************************** + * Dynamic interface tests + **********************************************************************/ + +typedef struct _TestDynamicIfaceClass TestDynamicIfaceClass; + +struct _TestDynamicIfaceClass +{ + GTypeInterface base_iface; + guint val; +}; + +static GType test_dynamic_iface_type; +static gboolean dynamic_iface_init = FALSE; + +#define TEST_TYPE_DYNAMIC_IFACE (test_dynamic_iface_type) + +static void +test_dynamic_iface_default_init (TestStaticIfaceClass *iface) +{ + dynamic_iface_init = TRUE; + iface->val = 42; +} + +static void +test_dynamic_iface_default_finalize (TestStaticIfaceClass *iface) +{ + dynamic_iface_init = FALSE; +} + +static void +test_dynamic_iface_register (GTypeModule *module) +{ + static const GTypeInfo iface_info = + { + sizeof (TestDynamicIfaceClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) test_dynamic_iface_default_init, + (GClassFinalizeFunc) test_dynamic_iface_default_finalize + }; + + test_dynamic_iface_type = g_type_module_register_type (module, G_TYPE_INTERFACE, + "TestDynamicIface", &iface_info, 0); +} + +static void +module_register (GTypeModule *module) +{ + test_dynamic_iface_register (module); +} + +static void +test_dynamic_iface (void) +{ + GTypeModule *module; + TestDynamicIfaceClass *dynamic_iface; + + module = test_module_new (module_register); + + /* Not loaded until we call ref for the first time */ + dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE); + g_assert (dynamic_iface == NULL); + + /* Ref loads */ + dynamic_iface = g_type_default_interface_ref (TEST_TYPE_DYNAMIC_IFACE); + g_assert (dynamic_iface_init); + g_assert (dynamic_iface && dynamic_iface->val == 42); + + /* Peek then works */ + dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE); + g_assert (dynamic_iface && dynamic_iface->val == 42); + + /* Unref causes finalize */ + g_type_default_interface_unref (dynamic_iface); + g_assert (!dynamic_iface_init); + + /* Peek returns NULL */ + dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE); + g_assert (dynamic_iface == NULL); + + /* Ref reloads */ + dynamic_iface = g_type_default_interface_ref (TEST_TYPE_DYNAMIC_IFACE); + g_assert (dynamic_iface_init); + g_assert (dynamic_iface && dynamic_iface->val == 42); + + /* And Unref causes finalize once more*/ + g_type_default_interface_unref (dynamic_iface); + g_assert (!dynamic_iface_init); +} + +int +main (int argc, + char *argv[]) +{ + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + test_static_iface (); + test_dynamic_iface (); + + return 0; +} diff --git a/tests/gobject/deftype.c b/tests/gobject/deftype.c new file mode 100644 index 0000000..924e7ad --- /dev/null +++ b/tests/gobject/deftype.c @@ -0,0 +1,59 @@ +/* deftype.c + * Copyright (C) 2006 Behdad Esfahbod + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include + +/* see http://bugzilla.gnome.org/show_bug.cgi?id=337128 for the purpose of this test */ + +#define MY_G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \ + static const GInterfaceInfo g_implement_interface_info = { \ + (GInterfaceInitFunc) iface_init, \ + NULL, \ + NULL \ + }; \ + g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \ +} + +#define MY_DEFINE_TYPE(TN, t_n, T_P) \ + G_DEFINE_TYPE_WITH_CODE (TN, t_n, T_P, \ + MY_G_IMPLEMENT_INTERFACE (G_TYPE_INTERFACE, NULL)) + +typedef struct _TypeName { + GObject parent_instance; + const char *name; +} TypeName; + +typedef struct _TypeNameClass { + GObjectClass parent_parent; +} TypeNameClass; + +MY_DEFINE_TYPE (TypeName, type_name, G_TYPE_OBJECT) + +static void type_name_init (TypeName *self) +{ +} + +static void type_name_class_init (TypeNameClass *klass) +{ +} + +int +main (void) +{ + return 0; +} diff --git a/tests/gobject/dynamictype.c b/tests/gobject/dynamictype.c new file mode 100644 index 0000000..fba1ced --- /dev/null +++ b/tests/gobject/dynamictype.c @@ -0,0 +1,173 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestDynamicType" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include "testcommon.h" +#include "testmodule.h" + +/* This test tests the macros for defining dynamic types. + */ + +static gboolean loaded = FALSE; + +struct _TestIfaceClass +{ + GTypeInterface base_iface; + guint val; +}; + +#define TEST_TYPE_IFACE (test_iface_get_type ()) +#define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass)) +typedef struct _TestIface TestIface; +typedef struct _TestIfaceClass TestIfaceClass; + +static void test_iface_base_init (TestIfaceClass *iface); +static void test_iface_default_init (TestIfaceClass *iface, gpointer class_data); + +static DEFINE_IFACE(TestIface, test_iface, test_iface_base_init, test_iface_default_init) + +static void +test_iface_default_init (TestIfaceClass *iface, + gpointer class_data) +{ +} + +static void +test_iface_base_init (TestIfaceClass *iface) +{ +} + +#define DYNAMIC_OBJECT_TYPE (dynamic_object_get_type ()) + +typedef GObject DynamicObject; +typedef struct _DynamicObjectClass DynamicObjectClass; + +struct _DynamicObjectClass +{ + GObjectClass parent_class; + guint val; +}; + +static void dynamic_object_iface_init (TestIface *iface); + +G_DEFINE_DYNAMIC_TYPE_EXTENDED(DynamicObject, dynamic_object, G_TYPE_OBJECT, 0, + G_IMPLEMENT_INTERFACE_DYNAMIC (TEST_TYPE_IFACE, + dynamic_object_iface_init)); + +static void +dynamic_object_class_init (DynamicObjectClass *class) +{ + class->val = 42; + loaded = TRUE; +} + +static void +dynamic_object_class_finalize (DynamicObjectClass *class) +{ + loaded = FALSE; +} + +static void +dynamic_object_iface_init (TestIface *iface) +{ +} + +static void +dynamic_object_init (DynamicObject *dynamic_object) +{ +} + +static void +module_register (GTypeModule *module) +{ + dynamic_object_register_type (module); +} + +static void +test_dynamic_type (void) +{ + GTypeModule *module; + DynamicObjectClass *class; + + module = test_module_new (module_register); + + /* Not loaded until we call ref for the first time */ + class = g_type_class_peek (DYNAMIC_OBJECT_TYPE); + g_assert (class == NULL); + g_assert (!loaded); + + /* Make sure interfaces work */ + g_assert (g_type_is_a (DYNAMIC_OBJECT_TYPE, + TEST_TYPE_IFACE)); + + /* Ref loads */ + class = g_type_class_ref (DYNAMIC_OBJECT_TYPE); + g_assert (class && class->val == 42); + g_assert (loaded); + + /* Peek then works */ + class = g_type_class_peek (DYNAMIC_OBJECT_TYPE); + g_assert (class && class->val == 42); + g_assert (loaded); + + /* Make sure interfaces still work */ + g_assert (g_type_is_a (DYNAMIC_OBJECT_TYPE, + TEST_TYPE_IFACE)); + + /* Unref causes finalize */ + g_type_class_unref (class); + + /* Peek returns NULL */ + class = g_type_class_peek (DYNAMIC_OBJECT_TYPE); + g_assert (!class); + g_assert (!loaded); + + /* Ref reloads */ + class = g_type_class_ref (DYNAMIC_OBJECT_TYPE); + g_assert (class && class->val == 42); + g_assert (loaded); + + /* And Unref causes finalize once more*/ + g_type_class_unref (class); + class = g_type_class_peek (DYNAMIC_OBJECT_TYPE); + g_assert (!class); + g_assert (!loaded); +} + +int +main (int argc, + char *argv[]) +{ + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + test_dynamic_type (); + + return 0; +} diff --git a/tests/gobject/gvalue-test.c b/tests/gobject/gvalue-test.c new file mode 100644 index 0000000..2d721e0 --- /dev/null +++ b/tests/gobject/gvalue-test.c @@ -0,0 +1,374 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#include +#include +#include "gobject/gvaluecollector.h" + +static void +test_enum_transformation (void) +{ + GType type; + GValue orig = { 0, }; + GValue xform = { 0, }; + GEnumValue values[] = { {0,"0","0"}, {1,"1","1"}}; + + type = g_enum_register_static ("TestEnum", values); + + g_value_init (&orig, type); + g_value_set_enum (&orig, 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_CHAR); + g_value_transform (&orig, &xform); + g_assert (g_value_get_char (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_UCHAR); + g_value_transform (&orig, &xform); + g_assert (g_value_get_uchar (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_INT); + g_value_transform (&orig, &xform); + g_assert (g_value_get_int (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_UINT); + g_value_transform (&orig, &xform); + g_assert (g_value_get_uint (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_LONG); + g_value_transform (&orig, &xform); + g_assert (g_value_get_long (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_ULONG); + g_value_transform (&orig, &xform); + g_assert (g_value_get_ulong (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_INT64); + g_value_transform (&orig, &xform); + g_assert (g_value_get_int64 (&xform) == 1); + + memset (&xform, 0, sizeof (GValue)); + g_value_init (&xform, G_TYPE_UINT64); + g_value_transform (&orig, &xform); + g_assert (g_value_get_uint64 (&xform) == 1); +} + + +static void +test_gtype_value (void) +{ + GType type; + GValue value = { 0, }; + GValue copy = { 0, }; + + g_value_init (&value, G_TYPE_GTYPE); + + g_value_set_gtype (&value, G_TYPE_BOXED); + type = g_value_get_gtype (&value); + g_assert (type == G_TYPE_BOXED); + + g_value_init (©, G_TYPE_GTYPE); + g_value_copy (&value, ©); + type = g_value_get_gtype (©); + g_assert (type == G_TYPE_BOXED); +} + +static gchar * +collect (GValue *value, ...) +{ + gchar *error; + va_list var_args; + + error = NULL; + + va_start (var_args, value); + G_VALUE_COLLECT (value, var_args, 0, &error); + va_end (var_args); + + return error; +} + +static gchar * +lcopy (GValue *value, ...) +{ + gchar *error; + va_list var_args; + + error = NULL; + + va_start (var_args, value); + G_VALUE_LCOPY (value, var_args, 0, &error); + va_end (var_args); + + return error; +} + +static void +test_collection (void) +{ + GValue value = { 0, }; + gchar *error; + + g_value_init (&value, G_TYPE_CHAR); + error = collect (&value, 'c'); + g_assert (error == NULL); + g_assert (g_value_get_char (&value) == 'c'); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_UCHAR); + error = collect (&value, 129); + g_assert (error == NULL); + g_assert (g_value_get_uchar (&value) == 129); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_BOOLEAN); + error = collect (&value, TRUE); + g_assert (error == NULL); + g_assert (g_value_get_boolean (&value) == TRUE); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_INT); + error = collect (&value, G_MAXINT); + g_assert (error == NULL); + g_assert (g_value_get_int (&value) == G_MAXINT); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_UINT); + error = collect (&value, G_MAXUINT); + g_assert (error == NULL); + g_assert (g_value_get_uint (&value) == G_MAXUINT); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_LONG); + error = collect (&value, G_MAXLONG); + g_assert (error == NULL); + g_assert (g_value_get_long (&value) == G_MAXLONG); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_ULONG); + error = collect (&value, G_MAXULONG); + g_assert (error == NULL); + g_assert (g_value_get_ulong (&value) == G_MAXULONG); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_INT64); + error = collect (&value, G_MAXINT64); + g_assert (error == NULL); + g_assert (g_value_get_int64 (&value) == G_MAXINT64); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_UINT64); + error = collect (&value, G_MAXUINT64); + g_assert (error == NULL); + g_assert (g_value_get_uint64 (&value) == G_MAXUINT64); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_FLOAT); + error = collect (&value, G_MAXFLOAT); + g_assert (error == NULL); + g_assert (g_value_get_float (&value) == G_MAXFLOAT); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_DOUBLE); + error = collect (&value, G_MAXDOUBLE); + g_assert (error == NULL); + g_assert (g_value_get_double (&value) == G_MAXDOUBLE); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_STRING); + error = collect (&value, "string ?"); + g_assert (error == NULL); + g_assert (strcmp (g_value_get_string (&value), "string ?") == 0); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_GTYPE); + error = collect (&value, G_TYPE_BOXED); + g_assert (error == NULL); + g_assert (g_value_get_gtype (&value) == G_TYPE_BOXED); +} + +static void +test_copying (void) +{ + GValue value = { 0, }; + gchar *error; + + { + gchar c = 0; + + g_value_init (&value, G_TYPE_CHAR); + g_value_set_char (&value, 'c'); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == 'c'); + } + + { + guchar c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_UCHAR); + g_value_set_uchar (&value, 129); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == 129); + } + + { + gint c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, G_MAXINT); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXINT); + } + + { + guint c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_UINT); + g_value_set_uint (&value, G_MAXUINT); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXUINT); + } + + { + glong c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_LONG); + g_value_set_long (&value, G_MAXLONG); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXLONG); + } + + { + gulong c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_ULONG); + g_value_set_ulong (&value, G_MAXULONG); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXULONG); + } + + { + gint64 c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_INT64); + g_value_set_int64 (&value, G_MAXINT64); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXINT64); + } + + { + guint64 c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_UINT64); + g_value_set_uint64 (&value, G_MAXUINT64); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXUINT64); + } + + { + gfloat c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_FLOAT); + g_value_set_float (&value, G_MAXFLOAT); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXFLOAT); + } + + { + gdouble c = 0; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_DOUBLE); + g_value_set_double (&value, G_MAXDOUBLE); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_MAXDOUBLE); + } + + { + gchar *c = NULL; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, "string ?"); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (strcmp (c, "string ?") == 0); + } + + { + GType c = G_TYPE_NONE; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_GTYPE); + g_value_set_gtype (&value, G_TYPE_BOXED); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c == G_TYPE_BOXED); + } +} + + +int +main (int argc, char *argv[]) +{ + g_type_init (); + + test_enum_transformation (); + test_gtype_value (); + test_collection (); + test_copying (); + + return 0; +} diff --git a/tests/gobject/ifacecheck.c b/tests/gobject/ifacecheck.c new file mode 100644 index 0000000..f57189a --- /dev/null +++ b/tests/gobject/ifacecheck.c @@ -0,0 +1,167 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestIfaceCheck" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include + +#include "testcommon.h" + +/* This test tests g_type_add_interface_check_func(), which allows + * installing a post-initialization check function. + */ + +#define TEST_TYPE_IFACE (test_iface_get_type ()) +#define TEST_IFACE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE, TestIfaceClass)) +typedef struct _TestIfaceClass TestIfaceClass; + +struct _TestIfaceClass +{ + GTypeInterface base_iface; + GString *history; +}; + +static void +test_iface_base_init (TestIfaceClass *iface) +{ + iface->history = g_string_new (iface->history ? iface->history->str : NULL); +} + +static DEFINE_IFACE(TestIface, test_iface, test_iface_base_init, NULL) + +/* + * TestObject1 + */ +#define TEST_TYPE_OBJECT1 (test_object1_get_type ()) +typedef struct _GObject TestObject1; +typedef struct _GObjectClass TestObject1Class; + +static DEFINE_TYPE_FULL (TestObject1, test_object1, + NULL, NULL, NULL, + G_TYPE_OBJECT, + INTERFACE (NULL, TEST_TYPE_IFACE)) + +/* + * TestObject2 + */ +#define TEST_TYPE_OBJECT2 (test_object2_get_type ()) +typedef struct _GObject TestObject2; +typedef struct _GObjectClass TestObject2Class; + +static DEFINE_TYPE_FULL (TestObject2, test_object2, + NULL, NULL, NULL, + G_TYPE_OBJECT, + INTERFACE (NULL, TEST_TYPE_IFACE)) + +/* + * TestObject3 + */ +#define TEST_TYPE_OBJECT3 (test_object3_get_type ()) +typedef struct _GObject TestObject3; +typedef struct _GObjectClass TestObject3Class; + +static DEFINE_TYPE_FULL (TestObject3, test_object3, + NULL, NULL, NULL, + G_TYPE_OBJECT, + INTERFACE (NULL, TEST_TYPE_IFACE)) + +/* + * TestObject4 + */ +#define TEST_TYPE_OBJECT4 (test_object4_get_type ()) +typedef struct _GObject TestObject4; +typedef struct _GObjectClass TestObject4Class; + + +static DEFINE_TYPE_FULL (TestObject4, test_object4, + NULL, NULL, NULL, + G_TYPE_OBJECT, {}) + +static void +check_func (gpointer check_data, + gpointer g_iface) +{ + TestIfaceClass *iface = g_iface; + + g_string_append (iface->history, check_data); +} + +int +main (int argc, + char *argv[]) +{ + TestIfaceClass *iface; + GObject *object; + char *string1 = "A"; + char *string2 = "B"; + + g_type_init (); + + /* Basic check of interfaces added before class_init time + */ + g_type_add_interface_check (string1, check_func); + + object = g_object_new (TEST_TYPE_OBJECT1, NULL); + iface = TEST_IFACE_GET_CLASS (object); + g_assert (strcmp (iface->history->str, "A") == 0); + g_object_unref (object); + + /* Add a second check function + */ + g_type_add_interface_check (string2, check_func); + + object = g_object_new (TEST_TYPE_OBJECT2, NULL); + iface = TEST_IFACE_GET_CLASS (object); + g_assert (strcmp (iface->history->str, "AB") == 0); + g_object_unref (object); + + /* Remove the first check function + */ + g_type_remove_interface_check (string1, check_func); + + object = g_object_new (TEST_TYPE_OBJECT3, NULL); + iface = TEST_IFACE_GET_CLASS (object); + g_assert (strcmp (iface->history->str, "B") == 0); + g_object_unref (object); + + /* Test interfaces added after class_init time + */ + g_type_class_ref (TEST_TYPE_OBJECT4); + { + static GInterfaceInfo const iface = { + NULL, NULL, NULL + }; + + g_type_add_interface_static (TEST_TYPE_OBJECT4, TEST_TYPE_IFACE, &iface); + } + + object = g_object_new (TEST_TYPE_OBJECT4, NULL); + iface = TEST_IFACE_GET_CLASS (object); + g_assert (strcmp (iface->history->str, "B") == 0); + g_object_unref (object); + + return 0; +} diff --git a/tests/gobject/ifaceinherit.c b/tests/gobject/ifaceinherit.c new file mode 100644 index 0000000..f9fe8be --- /dev/null +++ b/tests/gobject/ifaceinherit.c @@ -0,0 +1,227 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestIfaceInherit" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include "testcommon.h" +#include "testmodule.h" + +/* This test tests inheritance of interface. We two object + * class BaseObject and DerivedObject we add an interface + * to BaseObject: + * + * I1) Before DerivedObject is registered + * I2) After DerivedObject is registered, but before + * DerivedObject is class initialized + * I3) During DerivedObject's class_init + * I4) After DerivedObject's class init + * + * We also do some tests of overriding. + * + * I5) We add an interface to BaseObject, then add the same + * interface to DerivedObject. (Note that this is only legal + * before DerivedObject's class_init; the results of + * g_type_interface_peek() are not allowed to change from one + * non-NULL vtable to another non-NULL vtable) + */ + +/* + * BaseObject, a parent class for DerivedObject + */ +#define BASE_TYPE_OBJECT (base_object_get_type ()) +typedef struct _BaseObject BaseObject; +typedef struct _BaseObjectClass BaseObjectClass; + +struct _BaseObject +{ + GObject parent_instance; +}; +struct _BaseObjectClass +{ + GObjectClass parent_class; +}; + +static GType base_object_get_type (); +static GType derived_object_get_type (); + +/* + * DerivedObject, the child class of DerivedObject + */ +#define DERIVED_TYPE_OBJECT (derived_object_get_type ()) +typedef struct _DerivedObject DerivedObject; +typedef struct _DerivedObjectClass DerivedObjectClass; + +struct _DerivedObject +{ + BaseObject parent_instance; +}; +struct _DerivedObjectClass +{ + BaseObjectClass parent_class; +}; + +/* + * The interfaces + */ +typedef struct _TestIfaceClass TestIfaceClass; +typedef struct _TestIfaceClass TestIface1Class; +typedef struct _TestIfaceClass TestIface2Class; +typedef struct _TestIfaceClass TestIface3Class; +typedef struct _TestIfaceClass TestIface4Class; +typedef struct _TestIfaceClass TestIface5Class; + +struct _TestIfaceClass +{ + GTypeInterface base_iface; + guint val; +}; + +#define TEST_TYPE_IFACE1 (test_iface1_get_type ()) +#define TEST_TYPE_IFACE2 (test_iface2_get_type ()) +#define TEST_TYPE_IFACE3 (test_iface3_get_type ()) +#define TEST_TYPE_IFACE4 (test_iface4_get_type ()) +#define TEST_TYPE_IFACE5 (test_iface5_get_type ()) + +static DEFINE_IFACE (TestIface1, test_iface1, NULL, NULL) +static DEFINE_IFACE (TestIface2, test_iface2, NULL, NULL) +static DEFINE_IFACE (TestIface3, test_iface3, NULL, NULL) +static DEFINE_IFACE (TestIface4, test_iface4, NULL, NULL) +static DEFINE_IFACE (TestIface5, test_iface5, NULL, NULL) + +static void +add_interface (GType object_type, + GType iface_type, + GInterfaceInitFunc init_func) +{ + GInterfaceInfo iface_info = { NULL, NULL, NULL }; + + iface_info.interface_init = init_func; + + g_type_add_interface_static (object_type, iface_type, &iface_info); +} + +static void +init_base_interface (TestIfaceClass *iface) +{ + iface->val = 21; +} + +static void +add_base_interface (GType object_type, + GType iface_type) +{ + add_interface (object_type, iface_type, + (GInterfaceInitFunc)init_base_interface); +} + +static gboolean +interface_is_base (GType object_type, + GType iface_type) +{ + gpointer g_class = g_type_class_peek (object_type); + TestIfaceClass *iface = g_type_interface_peek (g_class, iface_type); + return iface && iface->val == 21; +} + +static void +init_derived_interface (TestIfaceClass *iface) +{ + iface->val = 42; +} + +static void +add_derived_interface (GType object_type, + GType iface_type) +{ + add_interface (object_type, iface_type, + (GInterfaceInitFunc)init_derived_interface); +} + +static gboolean +interface_is_derived (GType object_type, + GType iface_type) +{ + gpointer g_class = g_type_class_peek (object_type); + TestIfaceClass *iface = g_type_interface_peek (g_class, iface_type); + return iface && iface->val == 42; +} + +static void +derived_object_class_init (BaseObjectClass *class) +{ + add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE3); +} + +static DEFINE_TYPE(BaseObject, base_object, + NULL, NULL, NULL, + G_TYPE_OBJECT) +static DEFINE_TYPE(DerivedObject, derived_object, + derived_object_class_init, NULL, NULL, + BASE_TYPE_OBJECT) + +int +main (int argc, + char *argv[]) +{ + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + /* Register BaseObject */ + BASE_TYPE_OBJECT; + + add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE5); + + /* Class init BaseObject */ + g_type_class_ref (BASE_TYPE_OBJECT); + + add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE1); + + /* Register DerivedObject */ + DERIVED_TYPE_OBJECT; + + add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE2); + add_derived_interface (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE5); + + /* Class init DerivedObject */ + g_type_class_ref (DERIVED_TYPE_OBJECT); + + add_base_interface (BASE_TYPE_OBJECT, TEST_TYPE_IFACE4); + + /* Check that all the non-overridden interfaces were properly inherited + */ + g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE1)); + g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE2)); + g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE3)); + g_assert (interface_is_base (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE4)); + + /* Check that all the overridden interfaces were properly overridden + */ + g_assert (interface_is_derived (DERIVED_TYPE_OBJECT, TEST_TYPE_IFACE5)); + + return 0; +} diff --git a/tests/gobject/ifaceinit.c b/tests/gobject/ifaceinit.c new file mode 100644 index 0000000..eaa6d35 --- /dev/null +++ b/tests/gobject/ifaceinit.c @@ -0,0 +1,422 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestIfaceInit" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include "testcommon.h" + +/* What this test tests is the ability to add interfaces dynamically; in + * particular adding interfaces to a class while that class is being + * initialized. + * + * The test defines 5 interfaces: + * + * - TestIface1 is added before the class is initialized + * - TestIface2 is added in base_object_base_init() + * - TestIface3 is added in test_iface1_base_init() + * - TestIface4 is added in test_object_class_init() + * - TestIface5 is added in test_object_test_iface1_init() + * - TestIface6 is added after the class is initialized + */ + +/* All 6 interfaces actually share the same class structure, though + * we use separate typedefs + */ +typedef struct _TestIfaceClass TestIfaceClass; + +struct _TestIfaceClass +{ + GTypeInterface base_iface; + guint val; + guint base_val; + guint default_val; +}; + +#define TEST_TYPE_IFACE1 (test_iface1_get_type ()) +#define TEST_IFACE1_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE1, TestIface1Class)) +typedef struct _TestIface1 TestIface1; +typedef struct _TestIfaceClass TestIface1Class; + +static void test_iface1_base_init (TestIface1Class *iface); +static void test_iface1_default_init (TestIface1Class *iface, gpointer class_data); + +static DEFINE_IFACE(TestIface1, test_iface1, test_iface1_base_init, test_iface1_default_init) + +#define TEST_TYPE_IFACE2 (test_iface2_get_type ()) +#define TEST_IFACE2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE2, TestIface2Class)) +typedef struct _TestIface2 TestIface2; +typedef struct _TestIfaceClass TestIface2Class; + +static void test_iface2_base_init (TestIface2Class *iface); + +static DEFINE_IFACE(TestIface2, test_iface2, test_iface2_base_init, NULL) + +#define TEST_TYPE_IFACE3 (test_iface3_get_type ()) +#define TEST_IFACE3_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE3, TestIface3Class)) +typedef struct _TestIface3 TestIface3; +typedef struct _TestIfaceClass TestIface3Class; + +static void test_iface3_base_init (TestIface3Class *iface); + +static DEFINE_IFACE(TestIface3, test_iface3, test_iface3_base_init, NULL) + +#define TEST_TYPE_IFACE4 (test_iface4_get_type ()) +#define TEST_IFACE4_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE4, TestIface4Class)) +typedef struct _TestIface4 TestIface4; +typedef struct _TestIfaceClass TestIface4Class; + +static void test_iface4_base_init (TestIface4Class *iface); + +static DEFINE_IFACE(TestIface4, test_iface4, test_iface4_base_init, NULL) + +#define TEST_TYPE_IFACE5 (test_iface5_get_type ()) +#define TEST_IFACE5_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE5, TestIface5Class)) +typedef struct _TestIface5 TestIface5; +typedef struct _TestIfaceClass TestIface5Class; + +static void test_iface5_base_init (TestIface5Class *iface); + +static DEFINE_IFACE(TestIface5, test_iface5, test_iface5_base_init, NULL) + +#define TEST_TYPE_IFACE6 (test_iface6_get_type ()) +#define TEST_IFACE6_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TEST_TYPE_IFACE6, TestIface6Class)) +typedef struct _TestIface6 TestIface6; +typedef struct _TestIfaceClass TestIface6Class; + +static void test_iface6_base_init (TestIface6Class *iface); + +static DEFINE_IFACE(TestIface6, test_iface6, test_iface6_base_init, NULL) + +/* + * BaseObject, a parent class for TestObject + */ +#define BASE_TYPE_OBJECT (base_object_get_type ()) +typedef struct _BaseObject BaseObject; +typedef struct _BaseObjectClass BaseObjectClass; + +struct _BaseObject +{ + GObject parent_instance; +}; +struct _BaseObjectClass +{ + GObjectClass parent_class; +}; + +/* + * TestObject, a parent class for TestObject + */ +#define TEST_TYPE_OBJECT (test_object_get_type ()) +typedef struct _TestObject TestObject; +typedef struct _TestObjectClass TestObjectClass; + +struct _TestObject +{ + BaseObject parent_instance; +}; +struct _TestObjectClass +{ + BaseObjectClass parent_class; +}; + +#define TEST_CALLED_ONCE() G_STMT_START { \ + static gboolean called = 0; \ + g_assert (!called); \ + called = TRUE; \ +} G_STMT_END + +#define CHECK_IFACE_TWICE(iface) G_STMT_START { \ + static guint n_calls = 0; \ + n_calls++; \ + g_assert (n_calls <= 2); \ + g_assert (G_TYPE_IS_INTERFACE (((GTypeInterface*) iface)->g_type)); \ + if (n_calls == 1) \ + g_assert (((GTypeInterface*) iface)->g_instance_type == 0); \ + else \ + g_assert (G_TYPE_IS_OBJECT (((GTypeInterface*) iface)->g_instance_type)); \ +} G_STMT_END + +#define ADD_IFACE(n) G_STMT_START { \ + static GInterfaceInfo iface_info = { \ + (GInterfaceInitFunc)test_object_test_iface##n##_init, \ + NULL, NULL }; \ + \ + g_type_add_interface_static (TEST_TYPE_OBJECT, \ + test_iface##n##_get_type (), \ + &iface_info); \ + \ +} G_STMT_END + +static gboolean base1, base2, base3, base4, base5, base6; +static gboolean iface1, iface2, iface3, iface4, iface5, iface6; + +static void test_object_test_iface1_init (TestIface1Class *iface); +static void test_object_test_iface2_init (TestIface1Class *iface); +static void test_object_test_iface3_init (TestIface3Class *iface); +static void test_object_test_iface4_init (TestIface4Class *iface); +static void test_object_test_iface5_init (TestIface5Class *iface); +static void test_object_test_iface6_init (TestIface6Class *iface); + +static GType test_object_get_type (void); + +static void +test_object_test_iface1_init (TestIface1Class *iface) +{ + TEST_CALLED_ONCE(); + + g_assert (iface->default_val == 0x111111); + + iface->val = 0x10001; + + ADD_IFACE(5); + + iface1 = TRUE; +} + +static void +test_object_test_iface2_init (TestIface2Class *iface) +{ + TEST_CALLED_ONCE(); + + iface->val = 0x20002; + + iface2 = TRUE; +} + +static void +test_object_test_iface3_init (TestIface3Class *iface) +{ + TEST_CALLED_ONCE(); + + iface->val = 0x30003; + + iface3 = TRUE; +} + +static void +test_object_test_iface4_init (TestIface4Class *iface) +{ + TEST_CALLED_ONCE(); + + iface->val = 0x40004; + + iface4 = TRUE; +} + +static void +test_object_test_iface5_init (TestIface5Class *iface) +{ + TEST_CALLED_ONCE(); + + iface->val = 0x50005; + + iface5 = TRUE; +} + +static void +test_object_test_iface6_init (TestIface6Class *iface) +{ + TEST_CALLED_ONCE(); + + iface->val = 0x60006; + + iface6 = TRUE; +} + +static void +test_iface1_default_init (TestIface1Class *iface, + gpointer class_data) +{ + TEST_CALLED_ONCE(); + g_assert (iface->base_iface.g_type == TEST_TYPE_IFACE1); + g_assert (iface->base_iface.g_instance_type == 0); + g_assert (iface->base_val == 0x110011); + g_assert (iface->val == 0); + g_assert (iface->default_val == 0); + iface->default_val = 0x111111; +} + +static void +test_iface1_base_init (TestIface1Class *iface) +{ + static guint n_calls = 0; + n_calls++; + g_assert (n_calls <= 2); + + if (n_calls == 1) + { + iface->base_val = 0x110011; + g_assert (iface->default_val == 0); + } + else + { + g_assert (iface->base_val == 0x110011); + g_assert (iface->default_val == 0x111111); + } + + if (n_calls == 1) + ADD_IFACE(3); + + base1 = TRUE; +} + +static void +test_iface2_base_init (TestIface2Class *iface) +{ + CHECK_IFACE_TWICE (iface); + + iface->base_val = 0x220022; + + base2 = TRUE; +} + +static void +test_iface3_base_init (TestIface3Class *iface) +{ + CHECK_IFACE_TWICE (iface); + + iface->base_val = 0x330033; + + base3 = TRUE; +} + +static void +test_iface4_base_init (TestIface4Class *iface) +{ + CHECK_IFACE_TWICE (iface); + + iface->base_val = 0x440044; + + base4 = TRUE; +} + +static void +test_iface5_base_init (TestIface5Class *iface) +{ + CHECK_IFACE_TWICE (iface); + + iface->base_val = 0x550055; + + base5 = TRUE; +} + +static void +test_iface6_base_init (TestIface6Class *iface) +{ + CHECK_IFACE_TWICE (iface); + + iface->base_val = 0x660066; + + base6 = TRUE; +} + +static void +base_object_base_init (BaseObjectClass *class) +{ + static int n_called = 0; + n_called++; + + /* The second time this is called is for TestObject */ + if (n_called == 2) + { + ADD_IFACE(2); + + /* No interface base init functions should have been called yet + */ + g_assert (!base1 && !base2 && !base3 && !base4 && !base5 && !base6); + g_assert (!iface1 && !iface2 && !iface3 && !iface4 && !iface5 && !iface6); + } +} + +static void +test_object_class_init (TestObjectClass *class) +{ + ADD_IFACE(4); + + /* At this point, the base init functions for all interfaces that have + * been added should be called, but no interface init functions. + */ + g_assert (base1 && base2 && base3 && base4 && !base5 && !base6); + g_assert (!iface1 && !iface2 && !iface3 && !iface4 && !iface5 && !iface6); +} + +static DEFINE_TYPE(BaseObject, base_object, + NULL, base_object_base_init, NULL, + G_TYPE_OBJECT) +static DEFINE_TYPE(TestObject, test_object, + test_object_class_init, NULL, NULL, + BASE_TYPE_OBJECT) + +int +main (int argc, + char *argv[]) +{ + TestObject *object; + TestObjectClass *object_class; + TestIfaceClass *iface; + + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + /* We force the interfaces to be registered in a different order + * than we add them, so our logic doesn't always deal with interfaces + * added at the end. + */ + (void)TEST_TYPE_IFACE4; + (void)TEST_TYPE_IFACE2; + (void)TEST_TYPE_IFACE6; + (void)TEST_TYPE_IFACE5; + (void)TEST_TYPE_IFACE3; + (void)TEST_TYPE_IFACE1; + + ADD_IFACE(1); + + object_class = g_type_class_ref (TEST_TYPE_OBJECT); + + ADD_IFACE(6); + + /* All base and interface init functions should have been called + */ + g_assert (base1 && base2 && base3 && base4 && base5 && base6); + g_assert (iface1 && iface2 && iface3 && iface4 && iface5 && iface6); + + object = g_object_new (TEST_TYPE_OBJECT, NULL); + + iface = TEST_IFACE1_GET_CLASS (object); + g_assert (iface && iface->val == 0x10001 && iface->base_val == 0x110011); + iface = TEST_IFACE3_GET_CLASS (object); + g_assert (iface && iface->val == 0x30003 && iface->base_val == 0x330033); + iface = TEST_IFACE4_GET_CLASS (object); + g_assert (iface && iface->val == 0x40004 && iface->base_val == 0x440044); + iface = TEST_IFACE5_GET_CLASS (object); + g_assert (iface && iface->val == 0x50005 && iface->base_val == 0x550055); + iface = TEST_IFACE6_GET_CLASS (object); + g_assert (iface && iface->val == 0x60006 && iface->base_val == 0x660066); + + return 0; +} diff --git a/tests/gobject/ifaceproperties.c b/tests/gobject/ifaceproperties.c new file mode 100644 index 0000000..382edd5 --- /dev/null +++ b/tests/gobject/ifaceproperties.c @@ -0,0 +1,507 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2001, 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestIfaceProperties" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +#include + +#include "testcommon.h" + +/* This test tests interface properties, implementing interface + * properties and #GParamSpecOverride. + * + * Four properties are tested: + * + * prop1: Defined in TestIface, Implemented in BaseObject with a GParamSpecOverride + * prop2: Defined in TestIface, Implemented in BaseObject with a new property + * prop3: Defined in TestIface, Implemented in BaseObject, Overridden in DerivedObject + * prop4: Defined in BaseObject, Overridden in DerivedObject + */ + +static GType base_object_get_type (); +static GType derived_object_get_type (); + +enum { + BASE_PROP_0, + BASE_PROP1, + BASE_PROP2, + BASE_PROP3, + BASE_PROP4 +}; + +enum { + DERIVED_PROP_0, + DERIVED_PROP3, + DERIVED_PROP4 +}; + +/* + * BaseObject, a parent class for DerivedObject + */ +#define BASE_TYPE_OBJECT (base_object_get_type ()) +#define BASE_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BASE_TYPE_OBJECT, BaseObject)) +typedef struct _BaseObject BaseObject; +typedef struct _BaseObjectClass BaseObjectClass; + +struct _BaseObject +{ + GObject parent_instance; + + gint val1; + gint val2; + gint val3; + gint val4; +}; +struct _BaseObjectClass +{ + GObjectClass parent_class; +}; + +GObjectClass *base_parent_class; + +/* + * DerivedObject, the child class of DerivedObject + */ +#define DERIVED_TYPE_OBJECT (derived_object_get_type ()) +typedef struct _DerivedObject DerivedObject; +typedef struct _DerivedObjectClass DerivedObjectClass; + +struct _DerivedObject +{ + BaseObject parent_instance; +}; +struct _DerivedObjectClass +{ + BaseObjectClass parent_class; +}; + +/* + * The interface + */ +typedef struct _TestIfaceClass TestIfaceClass; + +struct _TestIfaceClass +{ + GTypeInterface base_iface; +}; + +#define TEST_TYPE_IFACE (test_iface_get_type ()) + +/* The paramspecs installed on our interface + */ +static GParamSpec *iface_spec1, *iface_spec2, *iface_spec3; + +/* The paramspecs inherited by our derived object + */ +static GParamSpec *inherited_spec1, *inherited_spec2, *inherited_spec3, *inherited_spec4; + +static void +test_iface_default_init (TestIfaceClass *iface_vtable) +{ + inherited_spec1 = iface_spec1 = g_param_spec_int ("prop1", + "Prop1", + "Property 1", + G_MININT, /* min */ + 0xFFFF, /* max */ + 42, /* default */ + G_PARAM_READWRITE | G_PARAM_CONSTRUCT); + g_object_interface_install_property (iface_vtable, iface_spec1); + + iface_spec2 = g_param_spec_int ("prop2", + "Prop2", + "Property 2", + G_MININT, /* min */ + G_MAXINT, /* max */ + 0, /* default */ + G_PARAM_WRITABLE); + g_object_interface_install_property (iface_vtable, iface_spec2); + + inherited_spec3 = iface_spec3 = g_param_spec_int ("prop3", + "Prop3", + "Property 3", + G_MININT, /* min */ + G_MAXINT, /* max */ + 0, /* default */ + G_PARAM_READWRITE); + g_object_interface_install_property (iface_vtable, iface_spec3); +} + +static DEFINE_IFACE (TestIface, test_iface, NULL, test_iface_default_init) + + +static GObject* +base_object_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + /* The constructor is the one place where a GParamSpecOverride is visible + * to the outside world, so we do a bunch of checks here + */ + GValue value1 = { 0, }; + GValue value2 = { 0, }; + GParamSpec *pspec; + + g_assert (n_construct_properties == 1); + + pspec = construct_properties->pspec; + + /* Check we got the param spec we expected + */ + g_assert (G_IS_PARAM_SPEC_OVERRIDE (pspec)); + g_assert (pspec->param_id == BASE_PROP1); + g_assert (strcmp (g_param_spec_get_name (pspec), "prop1") == 0); + g_assert (g_param_spec_get_redirect_target (pspec) == iface_spec1); + + /* Test redirection of the nick and blurb to the redirect target + */ + g_assert (strcmp (g_param_spec_get_nick (pspec), "Prop1") == 0); + g_assert (strcmp (g_param_spec_get_blurb (pspec), "Property 1") == 0); + + /* Test forwarding of the various GParamSpec methods to the redirect target + */ + g_value_init (&value1, G_TYPE_INT); + g_value_init (&value2, G_TYPE_INT); + + g_param_value_set_default (pspec, &value1); + g_assert (g_value_get_int (&value1) == 42); + + g_value_reset (&value1); + g_value_set_int (&value1, 0x10000); + g_assert (g_param_value_validate (pspec, &value1)); + g_assert (g_value_get_int (&value1) == 0xFFFF); + g_assert (!g_param_value_validate (pspec, &value1)); + + g_value_reset (&value1); + g_value_set_int (&value1, 1); + g_value_set_int (&value2, 2); + g_assert (g_param_values_cmp (pspec, &value1, &value2) < 0); + g_assert (g_param_values_cmp (pspec, &value2, &value1) > 0); + + g_value_unset (&value1); + g_value_unset (&value2); + + return base_parent_class->constructor (type, + n_construct_properties, + construct_properties); +} + +static void +base_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + BaseObject *base_object = BASE_OBJECT (object); + + switch (prop_id) + { + case BASE_PROP1: + g_assert (pspec == inherited_spec1); + base_object->val1 = g_value_get_int (value); + break; + case BASE_PROP2: + g_assert (pspec == inherited_spec2); + base_object->val2 = g_value_get_int (value); + break; + case BASE_PROP3: + g_assert_not_reached (); + break; + case BASE_PROP4: + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +base_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + BaseObject *base_object = BASE_OBJECT (object); + + switch (prop_id) + { + case BASE_PROP1: + g_assert (pspec == inherited_spec1); + g_value_set_int (value, base_object->val1); + break; + case BASE_PROP2: + g_assert (pspec == inherited_spec2); + g_value_set_int (value, base_object->val2); + break; + case BASE_PROP3: + g_assert_not_reached (); + break; + case BASE_PROP4: + g_assert_not_reached (); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +base_object_notify (GObject *object, + GParamSpec *pspec) +{ + /* The property passed to notify is the redirect target, not the + * GParamSpecOverride + */ + g_assert (pspec == inherited_spec1 || + pspec == inherited_spec2 || + pspec == inherited_spec3 || + pspec == inherited_spec4); +} + +static void +base_object_class_init (BaseObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + base_parent_class= g_type_class_peek_parent (class); + + object_class->constructor = base_object_constructor; + object_class->set_property = base_object_set_property; + object_class->get_property = base_object_get_property; + object_class->notify = base_object_notify; + + g_object_class_override_property (object_class, BASE_PROP1, "prop1"); + + /* We override this one using a real property, not GParamSpecOverride + * We change the flags from READONLY to READWRITE to show that we + * can make the flags less restrictive + */ + inherited_spec2 = g_param_spec_int ("prop2", + "Prop2", + "Property 2", + G_MININT, /* min */ + G_MAXINT, /* max */ + 0, /* default */ + G_PARAM_READWRITE); + g_object_class_install_property (object_class, BASE_PROP2, inherited_spec2); + + g_object_class_override_property (object_class, BASE_PROP3, "prop3"); + + inherited_spec4 = g_param_spec_int ("prop4", + "Prop4", + "Property 4", + G_MININT, /* min */ + G_MAXINT, /* max */ + 0, /* default */ + G_PARAM_READWRITE); + g_object_class_install_property (object_class, BASE_PROP4, inherited_spec4); +} + +static void +base_object_init (BaseObject *base_object) +{ + base_object->val1 = 42; +} + +static DEFINE_TYPE_FULL (BaseObject, base_object, + base_object_class_init, NULL, base_object_init, + G_TYPE_OBJECT, + INTERFACE (NULL, TEST_TYPE_IFACE)) + +static void +derived_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + BaseObject *base_object = BASE_OBJECT (object); + + switch (prop_id) + { + case DERIVED_PROP3: + g_assert (pspec == inherited_spec3); + base_object->val3 = g_value_get_int (value); + break; + case DERIVED_PROP4: + g_assert (pspec == inherited_spec4); + base_object->val4 = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +derived_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + BaseObject *base_object = BASE_OBJECT (object); + + switch (prop_id) + { + case DERIVED_PROP3: + g_assert (pspec == inherited_spec3); + g_value_set_int (value, base_object->val3); + break; + case DERIVED_PROP4: + g_assert (pspec == inherited_spec4); + g_value_set_int (value, base_object->val4); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +derived_object_class_init (DerivedObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = derived_object_set_property; + object_class->get_property = derived_object_get_property; + + /* Overriding a property that is itself overridding an interface property */ + g_object_class_override_property (object_class, DERIVED_PROP3, "prop3"); + + /* Overriding a property not from an interface */ + g_object_class_override_property (object_class, DERIVED_PROP4, "prop4"); +} + +static DEFINE_TYPE (DerivedObject, derived_object, + derived_object_class_init, NULL, NULL, + BASE_TYPE_OBJECT) + +/* Helper function for testing ...list_properties() + */ +static void +assert_in_properties (GParamSpec *param_spec, + GParamSpec **properties, + gint n_properties) +{ + gint i; + gboolean found = FALSE; + + for (i = 0; i < n_properties; i++) + { + if (properties[i] == param_spec) + found = TRUE; + } + + g_assert (found); +} + +int +main (gint argc, + gchar *argv[]) +{ + BaseObject *object; + GObjectClass *object_class; + TestIfaceClass *iface_vtable; + GParamSpec **properties; + gint n_properties; + + gint val1, val2, val3, val4; + + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + object = g_object_new (DERIVED_TYPE_OBJECT, NULL); + + /* Test setting and getting the properties + */ + g_object_set (object, + "prop1", 0x0101, + "prop2", 0x0202, + "prop3", 0x0303, + "prop4", 0x0404, + NULL); + g_object_get (object, + "prop1", &val1, + "prop2", &val2, + "prop3", &val3, + "prop4", &val4, + NULL); + + g_assert (val1 == 0x0101); + g_assert (val2 == 0x0202); + g_assert (val3 == 0x0303); + g_assert (val4 == 0x0404); + + /* Test that the right spec is passed on explicit notifications + */ + g_object_freeze_notify (G_OBJECT (object)); + g_object_notify (G_OBJECT (object), "prop1"); + g_object_notify (G_OBJECT (object), "prop2"); + g_object_notify (G_OBJECT (object), "prop3"); + g_object_notify (G_OBJECT (object), "prop4"); + g_object_thaw_notify (G_OBJECT (object)); + + /* Test g_object_class_find_property() for overridden properties + */ + object_class = G_OBJECT_GET_CLASS (object); + + g_assert (g_object_class_find_property (object_class, "prop1") == inherited_spec1); + g_assert (g_object_class_find_property (object_class, "prop2") == inherited_spec2); + g_assert (g_object_class_find_property (object_class, "prop3") == inherited_spec3); + g_assert (g_object_class_find_property (object_class, "prop4") == inherited_spec4); + + /* Test g_object_class_list_properties() for overridden properties + */ + properties = g_object_class_list_properties (object_class, &n_properties); + g_assert (n_properties == 4); + assert_in_properties (inherited_spec1, properties, n_properties); + assert_in_properties (inherited_spec2, properties, n_properties); + assert_in_properties (inherited_spec3, properties, n_properties); + assert_in_properties (inherited_spec4, properties, n_properties); + g_free (properties); + + /* Test g_object_interface_find_property() + */ + iface_vtable = g_type_default_interface_peek (TEST_TYPE_IFACE); + + g_assert (g_object_interface_find_property (iface_vtable, "prop1") == iface_spec1); + g_assert (g_object_interface_find_property (iface_vtable, "prop2") == iface_spec2); + g_assert (g_object_interface_find_property (iface_vtable, "prop3") == iface_spec3); + + /* Test g_object_interface_list_properties() + */ + properties = g_object_interface_list_properties (iface_vtable, &n_properties); + g_assert (n_properties == 3); + assert_in_properties (iface_spec1, properties, n_properties); + assert_in_properties (iface_spec2, properties, n_properties); + assert_in_properties (iface_spec3, properties, n_properties); + g_free (properties); + + g_object_unref (object); + + return 0; +} diff --git a/tests/gobject/override.c b/tests/gobject/override.c new file mode 100644 index 0000000..f812e03 --- /dev/null +++ b/tests/gobject/override.c @@ -0,0 +1,418 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * override.c: Closure override test program + * Copyright (C) 2001, James Henstridge + * Copyright (C) 2003, Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestOverride" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#undef VERBOSE + +#include + +#include +#include + +#include "testcommon.h" + +static guint foo_signal_id = 0; +static guint bar_signal_id = 0; +static guint baz_signal_id = 0; + +static GType test_i_get_type (void); +static GType test_a_get_type (void); +static GType test_b_get_type (void); +static GType test_c_get_type (void); + +static void record (const gchar *str); + +#define TEST_TYPE_I (test_i_get_type ()) + +typedef struct _TestI TestI; +typedef struct _TestIClass TestIClass; + +struct _TestIClass +{ + GTypeInterface base_iface; +}; + +static void +test_i_foo (TestI *self) +{ + record ("TestI::foo"); +} + +static void +test_i_default_init (gpointer g_class) +{ + foo_signal_id = g_signal_newv ("foo", + TEST_TYPE_I, + G_SIGNAL_RUN_LAST, + g_cclosure_new(G_CALLBACK(test_i_foo), + NULL, NULL), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, NULL); +} + +static DEFINE_IFACE (TestI, test_i, NULL, test_i_default_init) + +#define TEST_TYPE_A (test_a_get_type()) + + typedef struct _TestA TestA; + typedef struct _TestAClass TestAClass; + +struct _TestA { + GObject parent; +}; +struct _TestAClass { + GObjectClass parent_class; + + void (* bar) (TestA *self); +}; + +static void +test_a_foo (TestI *self) +{ + GValue args[1] = { { 0, } }; + + record ("TestA::foo"); + + g_value_init (&args[0], TEST_TYPE_A); + g_value_set_object (&args[0], self); + + g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id); + g_signal_chain_from_overridden (args, NULL); + + g_value_unset (&args[0]); +} + +static void +test_a_bar (TestA *self) +{ + record ("TestA::bar"); +} + +static gchar * +test_a_baz (TestA *self, + GObject *object, + gpointer pointer) +{ + record ("TestA::baz"); + + g_assert (object == G_OBJECT (self)); + g_assert (GPOINTER_TO_INT (pointer) == 23); + + return g_strdup ("TestA::baz"); +} + +static void +test_a_class_init (TestAClass *class) +{ + class->bar = test_a_bar; + + bar_signal_id = g_signal_new ("bar", + TEST_TYPE_A, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestAClass, bar), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, NULL); + + baz_signal_id = g_signal_new_class_handler ("baz", + TEST_TYPE_A, + G_SIGNAL_RUN_LAST, + G_CALLBACK (test_a_baz), + NULL, NULL, + g_cclosure_marshal_STRING__OBJECT_POINTER, + G_TYPE_STRING, 2, + G_TYPE_OBJECT, + G_TYPE_POINTER); +} + +static void +test_a_interface_init (TestIClass *iface) +{ + g_signal_override_class_closure (foo_signal_id, + TEST_TYPE_A, + g_cclosure_new (G_CALLBACK (test_a_foo), + NULL, NULL)); +} + +static DEFINE_TYPE_FULL (TestA, test_a, + test_a_class_init, NULL, NULL, + G_TYPE_OBJECT, + INTERFACE (test_a_interface_init, TEST_TYPE_I)) + +#define TEST_TYPE_B (test_b_get_type()) + +typedef struct _TestB TestB; +typedef struct _TestBClass TestBClass; + +struct _TestB { + TestA parent; +}; +struct _TestBClass { + TestAClass parent_class; +}; + +static void +test_b_foo (TestI *self) +{ + GValue args[1] = { { 0, } }; + + record ("TestB::foo"); + + g_value_init (&args[0], TEST_TYPE_A); + g_value_set_object (&args[0], self); + + g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id); + g_signal_chain_from_overridden (args, NULL); + + g_value_unset (&args[0]); +} + +static void +test_b_bar (TestA *self) +{ + GValue args[1] = { { 0, } }; + + record ("TestB::bar"); + + g_value_init (&args[0], TEST_TYPE_A); + g_value_set_object (&args[0], self); + + g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id); + g_signal_chain_from_overridden (args, NULL); + + g_value_unset (&args[0]); +} + +static gchar * +test_b_baz (TestA *self, + GObject *object, + gpointer pointer) +{ + gchar *retval = NULL; + + record ("TestB::baz"); + + g_assert (object == G_OBJECT (self)); + g_assert (GPOINTER_TO_INT (pointer) == 23); + + g_signal_chain_from_overridden_handler (self, object, pointer, &retval); + + if (retval) + { + gchar *tmp = g_strconcat (retval , ",TestB::baz", NULL); + g_free (retval); + retval = tmp; + } + + return retval; +} + +static void +test_b_class_init (TestBClass *class) +{ + g_signal_override_class_closure (foo_signal_id, + TEST_TYPE_B, + g_cclosure_new (G_CALLBACK (test_b_foo), + NULL, NULL)); + g_signal_override_class_closure (bar_signal_id, + TEST_TYPE_B, + g_cclosure_new (G_CALLBACK (test_b_bar), + NULL, NULL)); + g_signal_override_class_handler ("baz", + TEST_TYPE_B, + G_CALLBACK (test_b_baz)); +} + +static DEFINE_TYPE (TestB, test_b, + test_b_class_init, NULL, NULL, + TEST_TYPE_A) + +#define TEST_TYPE_C (test_c_get_type()) + +typedef struct _TestC TestC; +typedef struct _TestCClass TestCClass; + +struct _TestC { + TestB parent; +}; +struct _TestCClass { + TestBClass parent_class; +}; + +static void +test_c_foo (TestI *self) +{ + GValue args[1] = { { 0, } }; + + record ("TestC::foo"); + + g_value_init (&args[0], TEST_TYPE_A); + g_value_set_object (&args[0], self); + + g_assert (g_signal_get_invocation_hint (self)->signal_id == foo_signal_id); + g_signal_chain_from_overridden (args, NULL); + + g_value_unset (&args[0]); +} + +static void +test_c_bar (TestA *self) +{ + GValue args[1] = { { 0, } }; + + record ("TestC::bar"); + + g_value_init (&args[0], TEST_TYPE_A); + g_value_set_object (&args[0], self); + + g_assert (g_signal_get_invocation_hint (self)->signal_id == bar_signal_id); + g_signal_chain_from_overridden (args, NULL); + + g_value_unset (&args[0]); +} + +static gchar * +test_c_baz (TestA *self, + GObject *object, + gpointer pointer) +{ + gchar *retval = NULL; + + record ("TestC::baz"); + + g_assert (object == G_OBJECT (self)); + g_assert (GPOINTER_TO_INT (pointer) == 23); + + g_signal_chain_from_overridden_handler (self, object, pointer, &retval); + + if (retval) + { + gchar *tmp = g_strconcat (retval , ",TestC::baz", NULL); + g_free (retval); + retval = tmp; + } + + return retval; +} + +static void +test_c_class_init (TestBClass *class) +{ + g_signal_override_class_closure (foo_signal_id, + TEST_TYPE_C, + g_cclosure_new (G_CALLBACK (test_c_foo), + NULL, NULL)); + g_signal_override_class_closure (bar_signal_id, + TEST_TYPE_C, + g_cclosure_new (G_CALLBACK (test_c_bar), + NULL, NULL)); + g_signal_override_class_handler ("baz", + TEST_TYPE_C, + G_CALLBACK (test_c_baz)); +} + + +static DEFINE_TYPE (TestC, test_c, + test_c_class_init, NULL, NULL, + TEST_TYPE_B) + +static GString *test_string = NULL; +gboolean failed = FALSE; + +static void +record (const gchar *str) +{ + if (test_string->len) + g_string_append_c (test_string, ','); + g_string_append (test_string, str); +} + +static void +test (GType type, + const gchar *signal, + const gchar *expected, + const gchar *expected_retval) +{ + GObject *self = g_object_new (type, NULL); + + test_string = g_string_new (NULL); + + if (strcmp (signal, "baz")) + { + g_signal_emit_by_name (self, signal); + } + else + { + gchar *ret; + + g_signal_emit_by_name (self, signal, self, GINT_TO_POINTER (23), &ret); + + if (strcmp (ret, expected_retval) != 0) + failed = TRUE; + } + +#ifndef VERBOSE + if (strcmp (test_string->str, expected) != 0) +#endif + { + g_printerr ("*** emitting %s on a %s instance\n" + " Expecting: %s\n" + " Got: %s\n", + signal, g_type_name (type), + expected, + test_string->str); + + if (strcmp (test_string->str, expected) != 0) + failed = TRUE; + } + + g_string_free (test_string, TRUE); +} + +int +main (int argc, char **argv) +{ + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init(); + + test (TEST_TYPE_A, "foo", "TestA::foo,TestI::foo", NULL); + test (TEST_TYPE_A, "bar", "TestA::bar", NULL); + test (TEST_TYPE_A, "baz", "TestA::baz", "TestA::baz"); + + test (TEST_TYPE_B, "foo", "TestB::foo,TestA::foo,TestI::foo", NULL); + test (TEST_TYPE_B, "bar", "TestB::bar,TestA::bar", NULL); + test (TEST_TYPE_B, "baz", "TestB::baz,TestA::baz", "TestA::baz,TestB::baz"); + + test (TEST_TYPE_C, "foo", "TestC::foo,TestB::foo,TestA::foo,TestI::foo", NULL); + test (TEST_TYPE_C, "bar", "TestC::bar,TestB::bar,TestA::bar", NULL); + test (TEST_TYPE_C, "baz", "TestC::baz,TestB::baz,TestA::baz", "TestA::baz,TestB::baz,TestC::baz"); + + return failed ? 1 : 0; +} diff --git a/tests/gobject/paramspec-test.c b/tests/gobject/paramspec-test.c new file mode 100644 index 0000000..498aed0 --- /dev/null +++ b/tests/gobject/paramspec-test.c @@ -0,0 +1,220 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#include +#include + +static void +test_param_spec_char (void) +{ + GParamSpec *pspec; + GValue value = { 0, }; + gboolean modified; + + pspec = g_param_spec_char ("char", "nick", "blurb", + 20, 40, 30, G_PARAM_READWRITE); + + g_assert (strcmp (g_param_spec_get_name (pspec), "char") == 0); + g_assert (strcmp (g_param_spec_get_nick (pspec), "nick") == 0); + g_assert (strcmp (g_param_spec_get_blurb (pspec), "blurb") == 0); + + g_value_init (&value, G_TYPE_CHAR); + g_value_set_char (&value, 30); + + g_assert (g_param_value_defaults (pspec, &value)); + + g_value_set_char (&value, 0); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_char (&value) == 20); + + g_value_set_char (&value, 20); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_char (&value) == 20); + + g_value_set_char (&value, 40); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_char (&value) == 40); + + g_value_set_char (&value, 60); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_char (&value) == 40); + + g_param_spec_unref (pspec); +} + +static void +test_param_spec_string (void) +{ + GParamSpec *pspec; + GValue value = { 0, }; + gboolean modified; + + pspec = g_param_spec_string ("string", "nick", "blurb", + NULL, G_PARAM_READWRITE); + g_value_init (&value, G_TYPE_STRING); + + g_value_set_string (&value, "foobar"); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified); + + g_value_set_string (&value, ""); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_string (&value) != NULL); + + /* test ensure_non_null */ + + G_PARAM_SPEC_STRING (pspec)->ensure_non_null = TRUE; + + g_value_set_string (&value, NULL); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value) != NULL); + + G_PARAM_SPEC_STRING (pspec)->ensure_non_null = FALSE; + + /* test null_fold_if_empty */ + + G_PARAM_SPEC_STRING (pspec)->null_fold_if_empty = TRUE; + + g_value_set_string (&value, ""); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value) == NULL); + + g_value_set_static_string (&value, ""); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value) == NULL); + + G_PARAM_SPEC_STRING (pspec)->null_fold_if_empty = FALSE; + + /* test cset_first */ + + G_PARAM_SPEC_STRING (pspec)->cset_first = g_strdup ("abc"); + G_PARAM_SPEC_STRING (pspec)->substitutor = '-'; + + g_value_set_string (&value, "ABC"); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value)[0] == '-'); + + g_value_set_static_string (&value, "ABC"); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value)[0] == '-'); + + /* test cset_nth */ + + G_PARAM_SPEC_STRING (pspec)->cset_nth = g_strdup ("abc"); + + g_value_set_string (&value, "aBC"); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value)[1] == '-'); + + g_value_set_static_string (&value, "aBC"); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_string (&value)[1] == '-'); + + g_value_unset (&value); + g_param_spec_unref (pspec); +} + +static void +test_param_spec_override (void) +{ + GParamSpec *ospec, *pspec; + GValue value = { 0, }; + gboolean modified; + + ospec = g_param_spec_char ("char", "nick", "blurb", + 20, 40, 30, G_PARAM_READWRITE); + + pspec = g_param_spec_override ("override", ospec); + + g_assert (strcmp (g_param_spec_get_name (pspec), "override") == 0); + g_assert (strcmp (g_param_spec_get_nick (pspec), "nick") == 0); + g_assert (strcmp (g_param_spec_get_blurb (pspec), "blurb") == 0); + + g_value_init (&value, G_TYPE_CHAR); + g_value_set_char (&value, 30); + + g_assert (g_param_value_defaults (pspec, &value)); + + g_value_set_char (&value, 0); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_char (&value) == 20); + + g_value_set_char (&value, 20); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_char (&value) == 20); + + g_value_set_char (&value, 40); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_char (&value) == 40); + + g_value_set_char (&value, 60); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_char (&value) == 40); + + g_param_spec_unref (pspec); +} + +static void +test_param_spec_gtype (void) +{ + GParamSpec *pspec; + GValue value = { 0, }; + gboolean modified; + + pspec = g_param_spec_gtype ("gtype", "nick", "blurb", + G_TYPE_PARAM, G_PARAM_READWRITE); + + g_value_init (&value, G_TYPE_GTYPE); + g_value_set_gtype (&value, G_TYPE_PARAM); + + g_assert (g_param_value_defaults (pspec, &value)); + + g_value_set_gtype (&value, G_TYPE_INT); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_gtype (&value) == G_TYPE_PARAM); + + g_value_set_gtype (&value, G_TYPE_PARAM_INT); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_gtype (&value) == G_TYPE_PARAM_INT); +} + +int +main (int argc, char *argv[]) +{ + g_type_init (); + + test_param_spec_char (); + test_param_spec_string (); + test_param_spec_override (); + test_param_spec_gtype (); + + return 0; +} diff --git a/tests/gobject/performance-threaded.c b/tests/gobject/performance-threaded.c new file mode 100644 index 0000000..56a21eb --- /dev/null +++ b/tests/gobject/performance-threaded.c @@ -0,0 +1,381 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include "testcommon.h" + +#define DEFAULT_TEST_TIME 2 /* seconds */ + +static GType +simple_register_class (const char *name, GType parent, ...) +{ + GInterfaceInfo interface_info = { NULL, NULL, NULL }; + va_list args; + GType type, interface; + + va_start (args, parent); + type = g_type_register_static_simple (parent, name, sizeof (GObjectClass), + NULL, parent == G_TYPE_INTERFACE ? 0 : sizeof (GObject), NULL, 0); + for (;;) + { + interface = va_arg (args, GType); + if (interface == 0) + break; + g_type_add_interface_static (type, interface, &interface_info); + } + va_end (args); + + return type; +} + +/* test emulating liststore behavior for interface lookups */ + +static GType liststore; +static GType liststore_interfaces[6]; + +static gpointer +register_types (void) +{ + static volatile gsize inited = 0; + if (g_once_init_enter (&inited)) + { + liststore_interfaces[0] = simple_register_class ("GtkBuildable", G_TYPE_INTERFACE, 0); + liststore_interfaces[1] = simple_register_class ("GtkTreeDragDest", G_TYPE_INTERFACE, 0); + liststore_interfaces[2] = simple_register_class ("GtkTreeModel", G_TYPE_INTERFACE, 0); + liststore_interfaces[3] = simple_register_class ("GtkTreeDragSource", G_TYPE_INTERFACE, 0); + liststore_interfaces[4] = simple_register_class ("GtkTreeSortable", G_TYPE_INTERFACE, 0); + liststore_interfaces[5] = simple_register_class ("UnrelatedInterface", G_TYPE_INTERFACE, 0); + + liststore = simple_register_class ("GtkListStore", G_TYPE_OBJECT, + liststore_interfaces[0], liststore_interfaces[1], liststore_interfaces[2], + liststore_interfaces[3], liststore_interfaces[4], (GType) 0); + + g_once_init_leave (&inited, 1); + } + return NULL; +} + +static void +liststore_is_a_run (gpointer data) +{ + guint i; + + for (i = 0; i < 1000; i++) + { + g_assert (g_type_is_a (liststore, liststore_interfaces[0])); + g_assert (g_type_is_a (liststore, liststore_interfaces[1])); + g_assert (g_type_is_a (liststore, liststore_interfaces[2])); + g_assert (g_type_is_a (liststore, liststore_interfaces[3])); + g_assert (g_type_is_a (liststore, liststore_interfaces[4])); + g_assert (!g_type_is_a (liststore, liststore_interfaces[5])); + } +} + +static gpointer +liststore_get_class (void) +{ + register_types (); + return g_type_class_ref (liststore); +} + +static void +liststore_interface_peek_run (gpointer klass) +{ + guint i; + gpointer iface; + + for (i = 0; i < 1000; i++) + { + iface = g_type_interface_peek (klass, liststore_interfaces[0]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[1]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[2]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[3]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[4]); + g_assert (iface); + } +} + +static void +liststore_interface_peek_same_run (gpointer klass) +{ + guint i; + gpointer iface; + + for (i = 0; i < 1000; i++) + { + iface = g_type_interface_peek (klass, liststore_interfaces[0]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[0]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[0]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[0]); + g_assert (iface); + iface = g_type_interface_peek (klass, liststore_interfaces[0]); + g_assert (iface); + } +} + +#if 0 +/* DUMB test doing nothing */ + +static gpointer +no_setup (void) +{ + return NULL; +} + +static void +no_run (gpointer data) +{ +} +#endif + +static void +no_reset (gpointer data) +{ +} + +static void +no_teardown (gpointer data) +{ +} + +typedef struct _PerformanceTest PerformanceTest; +struct _PerformanceTest { + const char *name; + + gpointer (*setup) (void); + void (*run) (gpointer data); + void (*reset) (gpointer data); + void (*teardown) (gpointer data); +}; + +static const PerformanceTest tests[] = { + { "liststore-is-a", + register_types, + liststore_is_a_run, + no_reset, + no_teardown }, + { "liststore-interface-peek", + liststore_get_class, + liststore_interface_peek_run, + no_reset, + g_type_class_unref }, + { "liststore-interface-peek-same", + liststore_get_class, + liststore_interface_peek_same_run, + no_reset, + g_type_class_unref }, +#if 0 + { "nothing", + no_setup, + no_run, + no_reset, + no_teardown } +#endif +}; + +static gboolean verbose = FALSE; +static int n_threads = 0; +static gboolean list = FALSE; +static int test_length = DEFAULT_TEST_TIME; + +static GOptionEntry cmd_entries[] = { + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, + "Print extra information", NULL}, + {"threads", 't', 0, G_OPTION_ARG_INT, &n_threads, + "number of threads to run in parrallel", NULL}, + {"seconds", 's', 0, G_OPTION_ARG_INT, &test_length, + "Time to run each test in seconds", NULL}, + {"list", 'l', 0, G_OPTION_ARG_NONE, &list, + "List all available tests and exit", NULL}, + {NULL} +}; + +static gpointer +run_test_thread (gpointer user_data) +{ + const PerformanceTest *test = user_data; + gpointer data; + double elapsed; + GTimer *timer, *total; + GArray *results; + + total = g_timer_new (); + g_timer_start (total); + + /* Set up test */ + timer = g_timer_new (); + data = test->setup (); + results = g_array_new (FALSE, FALSE, sizeof (double)); + + /* Run the test */ + while (g_timer_elapsed (total, NULL) < test_length) + { + g_timer_reset (timer); + g_timer_start (timer); + test->run (data); + g_timer_stop (timer); + elapsed = g_timer_elapsed (timer, NULL); + g_array_append_val (results, elapsed); + test->reset (data); + } + + /* Tear down */ + test->teardown (data); + g_timer_destroy (timer); + g_timer_destroy (total); + + return results; +} + +static int +compare_doubles (gconstpointer a, gconstpointer b) +{ + double d = *(double *) a - *(double *) b; + + if (d < 0) + return -1; + if (d > 0) + return 1; + return 0; +} + +static void +print_results (GArray *array) +{ + double min, max, avg; + guint i; + + g_array_sort (array, compare_doubles); + + /* FIXME: discard outliers */ + + min = g_array_index (array, double, 0) * 1000; + max = g_array_index (array, double, array->len - 1) * 1000; + avg = 0; + for (i = 0; i < array->len; i++) + { + avg += g_array_index (array, double, i); + } + avg = avg / array->len * 1000; + + g_print (" %u runs, min/avg/max = %.3f/%.3f/%.3f ms\n", array->len, min, avg, max); +} + +static void +run_test (const PerformanceTest *test) +{ + GArray *results; + + g_print ("Running test \"%s\"\n", test->name); + + if (n_threads == 0) { + results = run_test_thread ((gpointer) test); + } else { + guint i; + GThread **threads; + GArray *thread_results; + + threads = g_new (GThread *, n_threads); + for (i = 0; i < n_threads; i++) { + threads[i] = g_thread_create (run_test_thread, (gpointer) test, TRUE, NULL); + g_assert (threads[i] != NULL); + } + + results = g_array_new (FALSE, FALSE, sizeof (double)); + for (i = 0; i < n_threads; i++) { + thread_results = g_thread_join (threads[i]); + g_array_append_vals (results, thread_results->data, thread_results->len); + g_array_free (thread_results, TRUE); + } + g_free (threads); + } + + print_results (results); + g_array_free (results, TRUE); +} + +static const PerformanceTest * +find_test (const char *name) +{ + int i; + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + if (strcmp (tests[i].name, name) == 0) + return &tests[i]; + } + return NULL; +} + +int +main (int argc, + char *argv[]) +{ + const PerformanceTest *test; + GOptionContext *context; + GError *error = NULL; + int i; + + g_type_init (); + + context = g_option_context_new ("GObject performance tests"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (list) + { + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + g_print ("%s\n", tests[i].name); + } + return 0; + } + + if (n_threads) + g_thread_init (NULL); + + if (argc > 1) + { + for (i = 1; i < argc; i++) + { + test = find_test (argv[i]); + if (test) + run_test (test); + } + } + else + { + for (i = 0; i < G_N_ELEMENTS (tests); i++) + run_test (&tests[i]); + } + + return 0; +} diff --git a/tests/gobject/performance.c b/tests/gobject/performance.c new file mode 100644 index 0000000..c626916 --- /dev/null +++ b/tests/gobject/performance.c @@ -0,0 +1,729 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2009 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include "testcommon.h" + +#define WARM_UP_N_RUNS 50 +#define ESTIMATE_ROUND_TIME_N_RUNS 5 +#define DEFAULT_TEST_TIME 15 /* seconds */ + /* The time we want each round to take, in seconds, this should + * be large enough compared to the timer resolution, but small + * enought that the risk of any random slowness will miss the + * running window */ +#define TARGET_ROUND_TIME 0.004 + +static gboolean verbose = FALSE; +static int test_length = DEFAULT_TEST_TIME; + +static GOptionEntry cmd_entries[] = { + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, + "Print extra information", NULL}, + {"seconds", 's', 0, G_OPTION_ARG_INT, &test_length, + "Time to run each test in seconds", NULL}, + {NULL} +}; + +typedef struct _PerformanceTest PerformanceTest; +struct _PerformanceTest { + const char *name; + gpointer extra_data; + + gpointer (*setup) (PerformanceTest *test); + void (*init) (PerformanceTest *test, + gpointer data, + double factor); + void (*run) (PerformanceTest *test, + gpointer data); + void (*finish) (PerformanceTest *test, + gpointer data); + void (*teardown) (PerformanceTest *test, + gpointer data); + void (*print_result) (PerformanceTest *test, + gpointer data, + double time); +}; + +static void +run_test (PerformanceTest *test) +{ + gpointer data = NULL; + guint64 i, num_rounds; + double elapsed, min_elapsed, factor; + GTimer *timer; + + g_print ("Running test %s\n", test->name); + + /* Set up test */ + timer = g_timer_new (); + data = test->setup (test); + + if (verbose) + g_print ("Warming up\n"); + + /* Warm up the test by doing a few runs */ + for (i = 0; i < WARM_UP_N_RUNS; i++) + { + test->init (test, data, 1.0); + test->run (test, data); + test->finish (test, data); + } + + if (verbose) + g_print ("Estimating round time\n"); + + /* Estimate time for one run by doing a few test rounds */ + min_elapsed = 0; + for (i = 0; i < ESTIMATE_ROUND_TIME_N_RUNS; i++) + { + test->init (test, data, 1.0); + g_timer_start (timer); + test->run (test, data); + g_timer_stop (timer); + test->finish (test, data); + + elapsed = g_timer_elapsed (timer, NULL); + if (i == 0) + min_elapsed = elapsed; + else + min_elapsed = MIN (min_elapsed, elapsed); + } + + factor = TARGET_ROUND_TIME / min_elapsed; + + if (verbose) + g_print ("Uncorrected round time: %f.4 secs, correction factor %f.2\n", min_elapsed, factor); + + /* Calculate number of rounds needed */ + num_rounds = (test_length / TARGET_ROUND_TIME) + 1; + + if (verbose) + g_print ("Running %"G_GINT64_MODIFIER"d rounds\n", num_rounds); + + /* Run the test */ + for (i = 0; i < num_rounds; i++) + { + test->init (test, data, factor); + g_timer_start (timer); + test->run (test, data); + g_timer_stop (timer); + test->finish (test, data); + elapsed = g_timer_elapsed (timer, NULL); + + if (i == 0) + min_elapsed = elapsed; + else + min_elapsed = MIN (min_elapsed, elapsed); + } + + if (verbose) + g_print ("Minimum corrected round time: %f secs\n", min_elapsed); + + /* Print the results */ + test->print_result (test, data, min_elapsed); + + /* Tear down */ + test->teardown (test, data); + g_timer_destroy (timer); +} + +/************************************************************* + * Simple object is a very simple small GObject subclass + * with no properties, no signals, implementing no interfaces + *************************************************************/ + +#define SIMPLE_TYPE_OBJECT (simple_object_get_type ()) +typedef struct _SimpleObject SimpleObject; +typedef struct _SimpleObjectClass SimpleObjectClass; + +struct _SimpleObject +{ + GObject parent_instance; + int val; +}; + +struct _SimpleObjectClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (SimpleObject, simple_object, G_TYPE_OBJECT); + +static void +simple_object_finalize (GObject *object) +{ + G_OBJECT_CLASS (simple_object_parent_class)->finalize (object); +} + +static void +simple_object_class_init (SimpleObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = simple_object_finalize; +} + +static void +simple_object_init (SimpleObject *simple_object) +{ + simple_object->val = 42; +} + +typedef struct _TestIfaceClass TestIfaceClass; +typedef struct _TestIfaceClass TestIface1Class; +typedef struct _TestIfaceClass TestIface2Class; +typedef struct _TestIfaceClass TestIface3Class; +typedef struct _TestIfaceClass TestIface4Class; +typedef struct _TestIfaceClass TestIface5Class; +typedef struct _TestIface TestIface; + +struct _TestIfaceClass +{ + GTypeInterface base_iface; + void (*method) (TestIface *obj); +}; + +#define TEST_TYPE_IFACE1 (test_iface1_get_type ()) +#define TEST_TYPE_IFACE2 (test_iface2_get_type ()) +#define TEST_TYPE_IFACE3 (test_iface3_get_type ()) +#define TEST_TYPE_IFACE4 (test_iface4_get_type ()) +#define TEST_TYPE_IFACE5 (test_iface5_get_type ()) + +static DEFINE_IFACE (TestIface1, test_iface1, NULL, NULL) +static DEFINE_IFACE (TestIface2, test_iface2, NULL, NULL) +static DEFINE_IFACE (TestIface3, test_iface3, NULL, NULL) +static DEFINE_IFACE (TestIface4, test_iface4, NULL, NULL) +static DEFINE_IFACE (TestIface5, test_iface5, NULL, NULL) + +/************************************************************* + * Complex object is a GObject subclass with a properties, + * construct properties, signals and implementing an interface. + *************************************************************/ + +#define COMPLEX_TYPE_OBJECT (complex_object_get_type ()) +typedef struct _ComplexObject ComplexObject; +typedef struct _ComplexObjectClass ComplexObjectClass; + +struct _ComplexObject +{ + GObject parent_instance; + int val1; + int val2; +}; + +struct _ComplexObjectClass +{ + GObjectClass parent_class; + + void (*signal) (ComplexObject *obj); +}; + +static void complex_test_iface_init (gpointer g_iface, + gpointer iface_data); + +G_DEFINE_TYPE_EXTENDED (ComplexObject, complex_object, + G_TYPE_OBJECT, 0, + G_IMPLEMENT_INTERFACE (TEST_TYPE_IFACE1, + complex_test_iface_init) + G_IMPLEMENT_INTERFACE (TEST_TYPE_IFACE2, + complex_test_iface_init) + G_IMPLEMENT_INTERFACE (TEST_TYPE_IFACE3, + complex_test_iface_init) + G_IMPLEMENT_INTERFACE (TEST_TYPE_IFACE4, + complex_test_iface_init) + G_IMPLEMENT_INTERFACE (TEST_TYPE_IFACE5, + complex_test_iface_init) + ); + +#define COMPLEX_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), COMPLEX_TYPE_OBJECT, ComplexObject)) + +enum { + PROP_0, + PROP_VAL1, + PROP_VAL2 +}; + +enum { + COMPLEX_SIGNAL, + COMPLEX_LAST_SIGNAL +}; + +static guint complex_signals[COMPLEX_LAST_SIGNAL] = { 0 }; + +static void +complex_object_finalize (GObject *object) +{ + G_OBJECT_CLASS (complex_object_parent_class)->finalize (object); +} + +static void +complex_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ComplexObject *complex = COMPLEX_OBJECT (object); + + switch (prop_id) + { + case PROP_VAL1: + complex->val1 = g_value_get_int (value); + break; + case PROP_VAL2: + complex->val2 = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +complex_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ComplexObject *complex = COMPLEX_OBJECT (object); + + switch (prop_id) + { + case PROP_VAL1: + g_value_set_int (value, complex->val1); + break; + case PROP_VAL2: + g_value_set_int (value, complex->val2); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +complex_object_real_signal (ComplexObject *obj) +{ +} + +static void +complex_object_class_init (ComplexObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = complex_object_finalize; + object_class->set_property = complex_object_set_property; + object_class->get_property = complex_object_get_property; + class->signal = complex_object_real_signal; + + complex_signals[COMPLEX_SIGNAL] = + g_signal_new ("signal", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ComplexObjectClass, signal), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + g_object_class_install_property (object_class, + PROP_VAL1, + g_param_spec_int ("val1", + "val1", + "val1", + 0, + G_MAXINT, + 42, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_VAL2, + g_param_spec_int ("val2", + "val2", + "val2", + 0, + G_MAXINT, + 43, + G_PARAM_READWRITE)); + + +} + +static void +complex_object_iface_method (TestIface *obj) +{ + ComplexObject *complex = COMPLEX_OBJECT (obj); + complex->val1++; +} + +static void +complex_test_iface_init (gpointer g_iface, + gpointer iface_data) +{ + TestIfaceClass *iface = g_iface; + iface->method = complex_object_iface_method; +} + +static void +complex_object_init (ComplexObject *complex_object) +{ + complex_object->val2 = 43; +} + +/************************************************************* + * Test object construction performance + *************************************************************/ + +#define NUM_OBJECT_TO_CONSTRUCT 10000 + +struct ConstructionTest { + GObject **objects; + int n_objects; + GType type; +}; + +static gpointer +test_construction_setup (PerformanceTest *test) +{ + struct ConstructionTest *data; + + data = g_new0 (struct ConstructionTest, 1); + data->type = ((GType (*)())test->extra_data)(); + + return data; +} + +static void +test_construction_init (PerformanceTest *test, + gpointer _data, + double count_factor) +{ + struct ConstructionTest *data = _data; + int n; + + n = NUM_OBJECT_TO_CONSTRUCT * count_factor; + if (data->n_objects != n) + { + data->n_objects = n; + data->objects = g_new (GObject *, n); + } +} + +static void +test_construction_run (PerformanceTest *test, + gpointer _data) +{ + struct ConstructionTest *data = _data; + GObject **objects = data->objects; + GType type = data->type; + int i, n_objects; + + n_objects = data->n_objects; + for (i = 0; i < n_objects; i++) + objects[i] = g_object_new (type, NULL); +} + +static void +test_construction_finish (PerformanceTest *test, + gpointer _data) +{ + struct ConstructionTest *data = _data; + int i; + + for (i = 0; i < data->n_objects; i++) + g_object_unref (data->objects[i]); +} + +static void +test_construction_teardown (PerformanceTest *test, + gpointer _data) +{ + struct ConstructionTest *data = _data; + g_free (data->objects); + g_free (data); +} + +static void +test_construction_print_result (PerformanceTest *test, + gpointer _data, + double time) +{ + struct ConstructionTest *data = _data; + + g_print ("Number of constructed objects per second: %.0f\n", + data->n_objects / time); +} + +/************************************************************* + * Test runtime type check performance + *************************************************************/ + +#define NUM_KILO_CHECKS_PER_ROUND 50 + +struct TypeCheckTest { + GObject *object; + int n_checks; +}; + +static gpointer +test_type_check_setup (PerformanceTest *test) +{ + struct TypeCheckTest *data; + + data = g_new0 (struct TypeCheckTest, 1); + data->object = g_object_new (COMPLEX_TYPE_OBJECT, NULL); + + return data; +} + +static void +test_type_check_init (PerformanceTest *test, + gpointer _data, + double factor) +{ + struct TypeCheckTest *data = _data; + + data->n_checks = factor * NUM_KILO_CHECKS_PER_ROUND; +} + + +/* Work around g_type_check_instance_is_a being marked "pure", + and thus only called once for the loop. */ +gboolean (*my_type_check_instance_is_a) (GTypeInstance *type_instance, + GType iface_type) = &g_type_check_instance_is_a; + +static void +test_type_check_run (PerformanceTest *test, + gpointer _data) +{ + struct TypeCheckTest *data = _data; + volatile GObject *object = data->object; + volatile GType type, types[5]; + int i, j; + + types[0] = test_iface1_get_type (); + types[1] = test_iface2_get_type (); + types[2] = test_iface3_get_type (); + types[3] = test_iface4_get_type (); + types[4] = test_iface5_get_type (); + + for (i = 0; i < data->n_checks; i++) + { + type = types[i%5]; + for (j = 0; j < 1000; j++) + { + my_type_check_instance_is_a ((GTypeInstance *)object, + type); + } + } +} + +static void +test_type_check_finish (PerformanceTest *test, + gpointer data) +{ +} + +static void +test_type_check_print_result (PerformanceTest *test, + gpointer _data, + double time) +{ + struct TypeCheckTest *data = _data; + g_print ("Million type checks per second: %.2f\n", + data->n_checks / (1000*time)); +} + +static void +test_type_check_teardown (PerformanceTest *test, + gpointer _data) +{ + struct TypeCheckTest *data = _data; + + g_object_unref (data->object); + g_free (data); +} + +/************************************************************* + * Test signal emissions performance + *************************************************************/ + +#define NUM_EMISSIONS_PER_ROUND 10000 + +struct EmissionTest { + GObject *object; + int n_checks; +}; +static gpointer +test_emission_setup (PerformanceTest *test) +{ + struct EmissionTest *data; + + data = g_new0 (struct EmissionTest, 1); + data->object = g_object_new (COMPLEX_TYPE_OBJECT, NULL); + + return data; +} + +static void +test_emission_init (PerformanceTest *test, + gpointer _data, + double factor) +{ + struct EmissionTest *data = _data; + + data->n_checks = factor * NUM_EMISSIONS_PER_ROUND; +} + +static void +test_emission_run (PerformanceTest *test, + gpointer _data) +{ + struct EmissionTest *data = _data; + GObject *object = data->object; + int i; + + for (i = 0; i < data->n_checks; i++) + g_signal_emit (object, + complex_signals[COMPLEX_SIGNAL], + 0); +} + +static void +test_emission_finish (PerformanceTest *test, + gpointer data) +{ +} + +static void +test_emission_print_result (PerformanceTest *test, + gpointer _data, + double time) +{ + struct EmissionTest *data = _data; + + g_print ("Emissions per second: %.0f\n", + data->n_checks / time); +} + +static void +test_emission_teardown (PerformanceTest *test, + gpointer _data) +{ + struct EmissionTest *data = _data; + + g_object_unref (data->object); + g_free (data); +} + + + +/************************************************************* + * Main test code + *************************************************************/ + +static PerformanceTest tests[] = { + { + "simple-construction", + simple_object_get_type, + test_construction_setup, + test_construction_init, + test_construction_run, + test_construction_finish, + test_construction_teardown, + test_construction_print_result + }, + { + "complex-construction", + complex_object_get_type, + test_construction_setup, + test_construction_init, + test_construction_run, + test_construction_finish, + test_construction_teardown, + test_construction_print_result + }, + { + "type-check", + NULL, + test_type_check_setup, + test_type_check_init, + test_type_check_run, + test_type_check_finish, + test_type_check_teardown, + test_type_check_print_result + }, + { + "emit", + NULL, + test_emission_setup, + test_emission_init, + test_emission_run, + test_emission_finish, + test_emission_teardown, + test_emission_print_result + } +}; + +static PerformanceTest * +find_test (const char *name) +{ + int i; + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + if (strcmp (tests[i].name, name) == 0) + return &tests[i]; + } + return NULL; +} +int +main (int argc, + char *argv[]) +{ + PerformanceTest *test; + GOptionContext *context; + GError *error = NULL; + int i; + + g_type_init (); + + context = g_option_context_new ("GObject performance tests"); + g_option_context_add_main_entries (context, cmd_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s: %s\n", argv[0], error->message); + return 1; + } + + if (argc > 1) + { + for (i = 1; i < argc; i++) + { + test = find_test (argv[i]); + if (test) + run_test (test); + } + } + else + { + for (i = 0; i < G_N_ELEMENTS (tests); i++) + run_test (&tests[i]); + } + + return 0; +} diff --git a/tests/gobject/references.c b/tests/gobject/references.c new file mode 100644 index 0000000..86c700f --- /dev/null +++ b/tests/gobject/references.c @@ -0,0 +1,281 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2005 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestReferences" + +#undef G_DISABLE_ASSERT +#undef G_DISABLE_CHECKS +#undef G_DISABLE_CAST_CHECKS + +#include + +/* This test tests weak and toggle references + */ + +static GObject *global_object; + +static gboolean object_destroyed; +static gboolean weak_ref1_notified; +static gboolean weak_ref2_notified; +static gboolean toggle_ref1_weakened; +static gboolean toggle_ref1_strengthened; +static gboolean toggle_ref2_weakened; +static gboolean toggle_ref2_strengthened; +static gboolean toggle_ref3_weakened; +static gboolean toggle_ref3_strengthened; + +/* + * TestObject, a parent class for TestObject + */ +#define TEST_TYPE_OBJECT (test_object_get_type ()) +typedef struct _TestObject TestObject; +typedef struct _TestObjectClass TestObjectClass; + +struct _TestObject +{ + GObject parent_instance; +}; +struct _TestObjectClass +{ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT); + +static void +test_object_finalize (GObject *object) +{ + object_destroyed = TRUE; + + G_OBJECT_CLASS (test_object_parent_class)->finalize (object); +} + +static void +test_object_class_init (TestObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = test_object_finalize; +} + +static void +test_object_init (TestObject *test_object) +{ +} + +static void +clear_flags (void) +{ + object_destroyed = FALSE; + weak_ref1_notified = FALSE; + weak_ref2_notified = FALSE; + toggle_ref1_weakened = FALSE; + toggle_ref1_strengthened = FALSE; + toggle_ref2_weakened = FALSE; + toggle_ref2_strengthened = FALSE; + toggle_ref3_weakened = FALSE; + toggle_ref3_strengthened = FALSE; +} + +static void +weak_ref1 (gpointer data, + GObject *object) +{ + g_assert (object == global_object); + g_assert (data == GUINT_TO_POINTER (42)); + + weak_ref1_notified = TRUE; +} + +static void +weak_ref2 (gpointer data, + GObject *object) +{ + g_assert (object == global_object); + g_assert (data == GUINT_TO_POINTER (24)); + + weak_ref2_notified = TRUE; +} + +static void +toggle_ref1 (gpointer data, + GObject *object, + gboolean is_last_ref) +{ + g_assert (object == global_object); + g_assert (data == GUINT_TO_POINTER (42)); + + if (is_last_ref) + toggle_ref1_weakened = TRUE; + else + toggle_ref1_strengthened = TRUE; +} + +static void +toggle_ref2 (gpointer data, + GObject *object, + gboolean is_last_ref) +{ + g_assert (object == global_object); + g_assert (data == GUINT_TO_POINTER (24)); + + if (is_last_ref) + toggle_ref2_weakened = TRUE; + else + toggle_ref2_strengthened = TRUE; +} + +static void +toggle_ref3 (gpointer data, + GObject *object, + gboolean is_last_ref) +{ + g_assert (object == global_object); + g_assert (data == GUINT_TO_POINTER (34)); + + if (is_last_ref) + { + toggle_ref3_weakened = TRUE; + g_object_remove_toggle_ref (object, toggle_ref3, GUINT_TO_POINTER (34)); + } + else + toggle_ref3_strengthened = TRUE; +} + +int +main (int argc, + char *argv[]) +{ + GObject *object; + + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + g_type_init (); + + /* Test basic weak reference operation + */ + global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42)); + + clear_flags (); + g_object_unref (object); + g_assert (weak_ref1_notified == TRUE); + g_assert (object_destroyed == TRUE); + + /* Test two weak references at once + */ + global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42)); + g_object_weak_ref (object, weak_ref2, GUINT_TO_POINTER (24)); + + clear_flags (); + g_object_unref (object); + g_assert (weak_ref1_notified == TRUE); + g_assert (weak_ref2_notified == TRUE); + g_assert (object_destroyed == TRUE); + + /* Test remove weak references + */ + global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42)); + g_object_weak_ref (object, weak_ref2, GUINT_TO_POINTER (24)); + g_object_weak_unref (object, weak_ref1, GUINT_TO_POINTER (42)); + + clear_flags (); + g_object_unref (object); + g_assert (weak_ref1_notified == FALSE); + g_assert (weak_ref2_notified == TRUE); + g_assert (object_destroyed == TRUE); + + /* Test basic toggle reference operation + */ + global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_object_add_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42)); + + clear_flags (); + g_object_unref (object); + g_assert (toggle_ref1_weakened == TRUE); + g_assert (toggle_ref1_strengthened == FALSE); + g_assert (object_destroyed == FALSE); + + clear_flags (); + g_object_ref (object); + g_assert (toggle_ref1_weakened == FALSE); + g_assert (toggle_ref1_strengthened == TRUE); + g_assert (object_destroyed == FALSE); + + g_object_unref (object); + + clear_flags (); + g_object_remove_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42)); + g_assert (toggle_ref1_weakened == FALSE); + g_assert (toggle_ref1_strengthened == FALSE); + g_assert (object_destroyed == TRUE); + + global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); + + /* Test two toggle references at once + */ + g_object_add_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42)); + g_object_add_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24)); + + clear_flags (); + g_object_unref (object); + g_assert (toggle_ref1_weakened == FALSE); + g_assert (toggle_ref1_strengthened == FALSE); + g_assert (toggle_ref2_weakened == FALSE); + g_assert (toggle_ref2_strengthened == FALSE); + g_assert (object_destroyed == FALSE); + + clear_flags (); + g_object_remove_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42)); + g_assert (toggle_ref1_weakened == FALSE); + g_assert (toggle_ref1_strengthened == FALSE); + g_assert (toggle_ref2_weakened == TRUE); + g_assert (toggle_ref2_strengthened == FALSE); + g_assert (object_destroyed == FALSE); + + clear_flags (); + g_object_remove_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24)); + g_assert (toggle_ref1_weakened == FALSE); + g_assert (toggle_ref1_strengthened == FALSE); + g_assert (toggle_ref2_weakened == FALSE); + g_assert (toggle_ref2_strengthened == FALSE); + g_assert (object_destroyed == TRUE); + + /* Test a toggle reference that removes itself + */ + global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); + + g_object_add_toggle_ref (object, toggle_ref3, GUINT_TO_POINTER (34)); + + clear_flags (); + g_object_unref (object); + g_assert (toggle_ref3_weakened == TRUE); + g_assert (toggle_ref3_strengthened == FALSE); + g_assert (object_destroyed == TRUE); + + return 0; +} diff --git a/tests/gobject/singleton.c b/tests/gobject/singleton.c new file mode 100644 index 0000000..c7609a6 --- /dev/null +++ b/tests/gobject/singleton.c @@ -0,0 +1,85 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2006 Imendio AB + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "TestSingleton" +#include +#include + +/* --- MySingleton class --- */ +typedef struct { + GObject parent_instance; +} MySingleton; +typedef struct { + GObjectClass parent_class; +} MySingletonClass; + +#define MY_TYPE_SINGLETON (my_singleton_get_type ()) +#define MY_SINGLETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MY_TYPE_SINGLETON, MySingleton)) +#define MY_IS_SINGLETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_SINGLETON)) +#define MY_SINGLETON_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), MY_TYPE_SINGLETON, MySingletonClass)) +#define MY_IS_SINGLETON_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), MY_TYPE_SINGLETON)) +#define MY_SINGLETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), MY_TYPE_SINGLETON, MySingletonClass)) + +G_DEFINE_TYPE (MySingleton, my_singleton, G_TYPE_OBJECT); + +static MySingleton *the_one_and_only = NULL; + +/* --- methods --- */ +static GObject* +my_singleton_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + if (the_one_and_only) + return g_object_ref (the_one_and_only); + else + return G_OBJECT_CLASS (my_singleton_parent_class)->constructor (type, n_construct_properties, construct_properties); +} + +static void +my_singleton_init (MySingleton *self) +{ + g_assert (the_one_and_only == NULL); + the_one_and_only = self; +} + +static void +my_singleton_class_init (MySingletonClass *klass) +{ + G_OBJECT_CLASS (klass)->constructor = my_singleton_constructor; +} + +/* --- test program --- */ +int +main (int argc, + char *argv[]) +{ + MySingleton *singleton, *obj; + g_type_init_with_debug_flags (G_TYPE_DEBUG_OBJECTS | G_TYPE_DEBUG_SIGNALS); + /* create the singleton */ + singleton = g_object_new (MY_TYPE_SINGLETON, NULL); + g_assert (singleton != NULL); + /* assert _singleton_ creation */ + obj = g_object_new (MY_TYPE_SINGLETON, NULL); + g_assert (singleton == obj); + g_object_unref (obj); + /* shutdown */ + g_object_unref (singleton); + return 0; +} diff --git a/tests/gobject/testcommon.h b/tests/gobject/testcommon.h new file mode 100644 index 0000000..7bfef05 --- /dev/null +++ b/tests/gobject/testcommon.h @@ -0,0 +1,100 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __TEST_COMMON_H__ +#define __TEST_COMMON_H__ + +G_BEGIN_DECLS + +#define DEFINE_TYPE_FULL(name, prefix, \ + class_init, base_init, instance_init, \ + parent_type, interface_decl) \ +GType \ +prefix ## _get_type (void) \ +{ \ + static GType object_type = 0; \ + \ + if (!object_type) \ + { \ + static const GTypeInfo object_info = \ + { \ + sizeof (name ## Class), \ + (GBaseInitFunc) base_init, \ + (GBaseFinalizeFunc) NULL, \ + (GClassInitFunc) class_init, \ + (GClassFinalizeFunc) NULL, \ + NULL, /* class_data */ \ + sizeof (name), \ + 0, /* n_prelocs */ \ + (GInstanceInitFunc) instance_init \ + }; \ + \ + object_type = g_type_register_static (parent_type, \ + # name, \ + &object_info, 0); \ + interface_decl \ + } \ + \ + return object_type; \ +} + +#define DEFINE_TYPE(name, prefix, \ + class_init, base_init, instance_init, \ + parent_type) \ + DEFINE_TYPE_FULL(name, prefix, class_init, base_init, \ + instance_init, parent_type, {}) + +#define DEFINE_IFACE(name, prefix, base_init, dflt_init) \ +GType \ +prefix ## _get_type (void) \ +{ \ + static GType iface_type = 0; \ + \ + if (!iface_type) \ + { \ + static const GTypeInfo iface_info = \ + { \ + sizeof (name ## Class), \ + (GBaseInitFunc) base_init, \ + (GBaseFinalizeFunc) NULL, \ + (GClassInitFunc) dflt_init, \ + }; \ + \ + iface_type = g_type_register_static (G_TYPE_INTERFACE, \ + # name, \ + &iface_info, 0); \ + } \ + return iface_type; \ +} + +#define INTERFACE_FULL(type, init_func, iface_type) \ +{ \ + static GInterfaceInfo const iface = \ + { \ + (GInterfaceInitFunc) init_func, NULL, NULL \ + }; \ + \ + g_type_add_interface_static (type, iface_type, &iface); \ +} +#define INTERFACE(init_func, iface_type) \ + INTERFACE_FULL(object_type, init_func, iface_type) + +G_END_DECLS + +#endif /* __TEST_COMMON_H__ */ diff --git a/tests/gobject/testmarshal.c b/tests/gobject/testmarshal.c new file mode 100644 index 0000000..eb68d72 --- /dev/null +++ b/tests/gobject/testmarshal.c @@ -0,0 +1,127 @@ + +#include + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) +#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_uint(v) g_value_get_uint (v) +#define g_marshal_value_peek_long(v) g_value_get_long (v) +#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) +#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) +#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) +#define g_marshal_value_peek_enum(v) g_value_get_enum (v) +#define g_marshal_value_peek_flags(v) g_value_get_flags (v) +#define g_marshal_value_peek_float(v) g_value_get_float (v) +#define g_marshal_value_peek_double(v) g_value_get_double (v) +#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) +#define g_marshal_value_peek_param(v) g_value_get_param (v) +#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#define g_marshal_value_peek_object(v) g_value_get_object (v) +#else /* !G_ENABLE_DEBUG */ +/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. + * Do not access GValues directly in your code. Instead, use the + * g_value_get_*() functions + */ +#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int +#define g_marshal_value_peek_char(v) (v)->data[0].v_int +#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint +#define g_marshal_value_peek_long(v) (v)->data[0].v_long +#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 +#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 +#define g_marshal_value_peek_enum(v) (v)->data[0].v_long +#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong +#define g_marshal_value_peek_float(v) (v)->data[0].v_float +#define g_marshal_value_peek_double(v) (v)->data[0].v_double +#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* BOOLEAN:INT (./testmarshal.list:2) */ +void +test_marshal_BOOLEAN__INT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__INT) (gpointer data1, + gint arg_1, + gpointer data2); + register GMarshalFunc_BOOLEAN__INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__INT) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_int (param_values + 1), + data2); + + g_value_set_boolean (return_value, v_return); +} + +/* STRING:INT (./testmarshal.list:3) */ +void +test_marshal_STRING__INT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gchar* (*GMarshalFunc_STRING__INT) (gpointer data1, + gint arg_1, + gpointer data2); + register GMarshalFunc_STRING__INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + gchar* v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 2); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_STRING__INT) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_int (param_values + 1), + data2); + + g_value_take_string (return_value, v_return); +} + diff --git a/tests/gobject/testmarshal.h b/tests/gobject/testmarshal.h new file mode 100644 index 0000000..0745f2f --- /dev/null +++ b/tests/gobject/testmarshal.h @@ -0,0 +1,28 @@ + +#ifndef __test_marshal_MARSHAL_H__ +#define __test_marshal_MARSHAL_H__ + +#include + +G_BEGIN_DECLS + +/* BOOLEAN:INT (./testmarshal.list:2) */ +extern void test_marshal_BOOLEAN__INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +/* STRING:INT (./testmarshal.list:3) */ +extern void test_marshal_STRING__INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +G_END_DECLS + +#endif /* __test_marshal_MARSHAL_H__ */ + diff --git a/tests/gobject/testmarshal.list b/tests/gobject/testmarshal.list new file mode 100644 index 0000000..bed97e2 --- /dev/null +++ b/tests/gobject/testmarshal.list @@ -0,0 +1,4 @@ +# Marshallers used in tests +BOOLEAN:INT +STRING:INT + diff --git a/tests/gobject/testmodule.c b/tests/gobject/testmodule.c new file mode 100644 index 0000000..a6159f1 --- /dev/null +++ b/tests/gobject/testmodule.c @@ -0,0 +1,69 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * testmodule.c: Dummy dynamic type module + * Copyright (C) 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "testmodule.h" +#include "testcommon.h" + +static gboolean test_module_load (GTypeModule *module); +static void test_module_unload (GTypeModule *module); + +static void +test_module_class_init (TestModuleClass *class) +{ + GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (class); + + module_class->load = test_module_load; + module_class->unload = test_module_unload; +} + +DEFINE_TYPE (TestModule, test_module, + test_module_class_init, NULL, NULL, + G_TYPE_TYPE_MODULE) + +static gboolean +test_module_load (GTypeModule *module) +{ + TestModule *test_module = TEST_MODULE (module); + + test_module->register_func (module); + + return TRUE; +} + +static void +test_module_unload (GTypeModule *module) +{ +} + +GTypeModule * +test_module_new (TestModuleRegisterFunc register_func) +{ + TestModule *test_module = g_object_new (TEST_TYPE_MODULE, NULL); + GTypeModule *module = G_TYPE_MODULE (test_module); + + test_module->register_func = register_func; + + /* Register the types initially */ + g_type_module_use (module); + g_type_module_unuse (module); + + return G_TYPE_MODULE (module); +} + diff --git a/tests/gobject/testmodule.h b/tests/gobject/testmodule.h new file mode 100644 index 0000000..751d8ad --- /dev/null +++ b/tests/gobject/testmodule.h @@ -0,0 +1,57 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * testmodule.h: Dummy dynamic type module + * Copyright (C) 2003 Red Hat, Inc. + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __TEST_MODULE_H__ +#define __TEST_MODULE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _TestModule TestModule; +typedef struct _TestModuleClass TestModuleClass; + +#define TEST_TYPE_MODULE (test_module_get_type ()) +#define TEST_MODULE(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TEST_TYPE_MODULE, TestModule)) +#define TEST_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), TEST_TYPE_MODULE, TestModuleClass)) +#define TEST_IS_MODULE(module) (G_TYPE_CHECK_INSTANCE_TYPE ((module), TEST_TYPE_MODULE)) +#define TEST_IS_MODULE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), TEST_TYPE_MODULE)) +#define TEST_MODULE_GET_CLASS(module) (G_TYPE_INSTANCE_GET_CLASS ((module), TEST_TYPE_MODULE, TestModuleClass)) + +typedef void (*TestModuleRegisterFunc) (GTypeModule *module); + +struct _TestModule +{ + GTypeModule parent_instance; + + TestModuleRegisterFunc register_func; +}; + +struct _TestModuleClass +{ + GTypeModuleClass parent_class; +}; + +GType test_module_get_type (void); +GTypeModule *test_module_new (TestModuleRegisterFunc register_func); + +G_END_DECLS + +#endif /* __TEST_MODULE_H__ */ diff --git a/tests/hash-test.c b/tests/hash-test.c new file mode 100644 index 0000000..23411c3 --- /dev/null +++ b/tests/hash-test.c @@ -0,0 +1,459 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * Copyright (C) 1999 The Free Software Foundation + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if STDC_HEADERS +#include +#include +#include +#endif + +#include + + + +int array[10000]; + +static void +fill_hash_table_and_array (GHashTable *hash_table) +{ + int i; + + for (i = 0; i < 10000; i++) + { + array[i] = i; + g_hash_table_insert (hash_table, &array[i], &array[i]); + } +} + +static void +init_result_array (int result_array[10000]) +{ + int i; + + for (i = 0; i < 10000; i++) + result_array[i] = -1; +} + +static void +verify_result_array (int array[10000]) +{ + int i; + + for (i = 0; i < 10000; i++) + g_assert (array[i] == i); +} + +static void +handle_pair (gpointer key, gpointer value, int result_array[10000]) +{ + int n; + + g_assert (key == value); + + n = *((int *) value); + + g_assert (n >= 0 && n < 10000); + g_assert (result_array[n] == -1); + + result_array[n] = n; +} + +static gboolean +my_hash_callback_remove (gpointer key, + gpointer value, + gpointer user_data) +{ + int *d = value; + + if ((*d) % 2) + return TRUE; + + return FALSE; +} + +static void +my_hash_callback_remove_test (gpointer key, + gpointer value, + gpointer user_data) +{ + int *d = value; + + if ((*d) % 2) + g_assert_not_reached (); +} + +static void +my_hash_callback (gpointer key, + gpointer value, + gpointer user_data) +{ + handle_pair (key, value, user_data); +} + +static guint +my_hash (gconstpointer key) +{ + return (guint) *((const gint*) key); +} + +static gboolean +my_hash_equal (gconstpointer a, + gconstpointer b) +{ + return *((const gint*) a) == *((const gint*) b); +} + + + +/* + * This is a simplified version of the pathalias hashing function. + * Thanks to Steve Belovin and Peter Honeyman + * + * hash a string into a long int. 31 bit crc (from andrew appel). + * the crc table is computed at run time by crcinit() -- we could + * precompute, but it takes 1 clock tick on a 750. + * + * This fast table calculation works only if POLY is a prime polynomial + * in the field of integers modulo 2. Since the coefficients of a + * 32-bit polynomial won't fit in a 32-bit word, the high-order bit is + * implicit. IT MUST ALSO BE THE CASE that the coefficients of orders + * 31 down to 25 are zero. Happily, we have candidates, from + * E. J. Watson, "Primitive Polynomials (Mod 2)", Math. Comp. 16 (1962): + * x^32 + x^7 + x^5 + x^3 + x^2 + x^1 + x^0 + * x^31 + x^3 + x^0 + * + * We reverse the bits to get: + * 111101010000000000000000000000001 but drop the last 1 + * f 5 0 0 0 0 0 0 + * 010010000000000000000000000000001 ditto, for 31-bit crc + * 4 8 0 0 0 0 0 0 + */ + +#define POLY 0x48000000L /* 31-bit polynomial (avoids sign problems) */ + +static guint CrcTable[128]; + +/* + - crcinit - initialize tables for hash function + */ +static void crcinit(void) +{ + int i, j; + guint sum; + + for (i = 0; i < 128; ++i) { + sum = 0L; + for (j = 7 - 1; j >= 0; --j) + if (i & (1 << j)) + sum ^= POLY >> j; + CrcTable[i] = sum; + } +} + +/* + - hash - Honeyman's nice hashing function + */ +static guint honeyman_hash(gconstpointer key) +{ + const gchar *name = (const gchar *) key; + gint size; + guint sum = 0; + + g_assert (name != NULL); + g_assert (*name != 0); + + size = strlen(name); + + while (size--) { + sum = (sum >> 7) ^ CrcTable[(sum ^ (*name++)) & 0x7f]; + } + + return(sum); +} + + +static gboolean second_hash_cmp (gconstpointer a, gconstpointer b) +{ + return (strcmp (a, b) == 0); +} + + + +static guint one_hash(gconstpointer key) +{ + return 1; +} + + +static void not_even_foreach (gpointer key, + gpointer value, + gpointer user_data) +{ + const char *_key = (const char *) key; + const char *_value = (const char *) value; + int i; + char val [20]; + + g_assert (_key != NULL); + g_assert (*_key != 0); + g_assert (_value != NULL); + g_assert (*_value != 0); + + i = atoi (_key); + + sprintf (val, "%d value", i); + g_assert (strcmp (_value, val) == 0); + + g_assert ((i % 2) != 0); + g_assert (i != 3); +} + + +static gboolean remove_even_foreach (gpointer key, + gpointer value, + gpointer user_data) +{ + const char *_key = (const char *) key; + const char *_value = (const char *) value; + int i; + char val [20]; + + g_assert (_key != NULL); + g_assert (*_key != 0); + g_assert (_value != NULL); + g_assert (*_value != 0); + + i = atoi (_key); + + sprintf (val, "%d value", i); + g_assert (strcmp (_value, val) == 0); + + return ((i % 2) == 0) ? TRUE : FALSE; +} + + + + +static void second_hash_test (gboolean simple_hash) +{ + int i; + char key[20] = "", val[20]="", *v, *orig_key, *orig_val; + GHashTable *h; + gboolean found; + + crcinit (); + + h = g_hash_table_new_full (simple_hash ? one_hash : honeyman_hash, + second_hash_cmp, + g_free, g_free); + g_assert (h != NULL); + for (i=0; i<20; i++) + { + sprintf (key, "%d", i); + g_assert (atoi (key) == i); + + sprintf (val, "%d value", i); + g_assert (atoi (val) == i); + + g_hash_table_insert (h, g_strdup (key), g_strdup (val)); + } + + g_assert (g_hash_table_size (h) == 20); + + for (i=0; i<20; i++) + { + sprintf (key, "%d", i); + g_assert (atoi(key) == i); + + v = (char *) g_hash_table_lookup (h, key); + + g_assert (v != NULL); + g_assert (*v != 0); + g_assert (atoi (v) == i); + } + + sprintf (key, "%d", 3); + g_hash_table_remove (h, key); + g_assert (g_hash_table_size (h) == 19); + g_hash_table_foreach_remove (h, remove_even_foreach, NULL); + g_assert (g_hash_table_size (h) == 9); + g_hash_table_foreach (h, not_even_foreach, NULL); + + for (i=0; i<20; i++) + { + sprintf (key, "%d", i); + g_assert (atoi(key) == i); + + sprintf (val, "%d value", i); + g_assert (atoi (val) == i); + + orig_key = orig_val = NULL; + found = g_hash_table_lookup_extended (h, key, + (gpointer)&orig_key, + (gpointer)&orig_val); + if ((i % 2) == 0 || i == 3) + { + g_assert (!found); + continue; + } + + g_assert (found); + + g_assert (orig_key != NULL); + g_assert (strcmp (key, orig_key) == 0); + + g_assert (orig_val != NULL); + g_assert (strcmp (val, orig_val) == 0); + } + + g_hash_table_destroy (h); +} + +static gboolean find_first (gpointer key, + gpointer value, + gpointer user_data) +{ + gint *v = value; + gint *test = user_data; + return (*v == *test); +} + + +static void direct_hash_test (void) +{ + gint i, rc; + GHashTable *h; + + h = g_hash_table_new (NULL, NULL); + g_assert (h != NULL); + for (i=1; i<=20; i++) + { + g_hash_table_insert (h, GINT_TO_POINTER (i), + GINT_TO_POINTER (i + 42)); + } + + g_assert (g_hash_table_size (h) == 20); + + for (i=1; i<=20; i++) + { + rc = GPOINTER_TO_INT ( + g_hash_table_lookup (h, GINT_TO_POINTER (i))); + + g_assert (rc != 0); + g_assert ((rc - 42) == i); + } + + g_hash_table_destroy (h); +} + + + +int +main (int argc, + char *argv[]) +{ + GHashTable *hash_table; + gint i; + gint value = 120; + gint *pvalue; + GList *keys, *values; + gint keys_len, values_len; + GHashTableIter iter; + gpointer ikey, ivalue; + int result_array[10000]; + + hash_table = g_hash_table_new (my_hash, my_hash_equal); + fill_hash_table_and_array (hash_table); + pvalue = g_hash_table_find (hash_table, find_first, &value); + if (!pvalue || *pvalue != value) + g_assert_not_reached(); + + keys = g_hash_table_get_keys (hash_table); + if (!keys) + g_assert_not_reached (); + + values = g_hash_table_get_values (hash_table); + if (!values) + g_assert_not_reached (); + + keys_len = g_list_length (keys); + values_len = g_list_length (values); + if (values_len != keys_len && keys_len != g_hash_table_size (hash_table)) + g_assert_not_reached (); + + g_list_free (keys); + g_list_free (values); + + init_result_array (result_array); + g_hash_table_iter_init (&iter, hash_table); + for (i = 0; i < 10000; i++) + { + g_assert (g_hash_table_iter_next (&iter, &ikey, &ivalue)); + + handle_pair (ikey, ivalue, result_array); + + if (i % 2) + g_hash_table_iter_remove (&iter); + } + g_assert (! g_hash_table_iter_next (&iter, &ikey, &ivalue)); + g_assert (g_hash_table_size (hash_table) == 5000); + verify_result_array (result_array); + + fill_hash_table_and_array (hash_table); + + init_result_array (result_array); + g_hash_table_foreach (hash_table, my_hash_callback, result_array); + verify_result_array (result_array); + + for (i = 0; i < 10000; i++) + g_hash_table_remove (hash_table, &array[i]); + + fill_hash_table_and_array (hash_table); + + if (g_hash_table_foreach_remove (hash_table, my_hash_callback_remove, NULL) != 5000 || + g_hash_table_size (hash_table) != 5000) + g_assert_not_reached(); + + g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL); + + + g_hash_table_destroy (hash_table); + + second_hash_test (TRUE); + second_hash_test (FALSE); + direct_hash_test (); + + return 0; + +} diff --git a/tests/iochannel-test-infile b/tests/iochannel-test-infile new file mode 100644 index 0000000..86e24ee --- /dev/null +++ b/tests/iochannel-test-infile @@ -0,0 +1,5 @@ +Line one +Line two +Line three +/* Hello */ +\x1234\x567890\x6666 diff --git a/tests/iochannel-test.c b/tests/iochannel-test.c new file mode 100644 index 0000000..f08688b --- /dev/null +++ b/tests/iochannel-test.c @@ -0,0 +1,176 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 1024 + +static void +test_small_writes (void) +{ + GIOChannel *io; + GIOStatus status; + guint cnt; + gchar tmp; + GError *error = NULL; + + io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error); + if (error) + { + g_warning ("Unable to open file %s: %s", + "iochannel-test-outfile", + error->message); + g_error_free (error); + + exit (1); + } + + g_io_channel_set_encoding (io, NULL, NULL); + g_io_channel_set_buffer_size (io, 1022); + + cnt = 2 * g_io_channel_get_buffer_size (io); + tmp = 0; + + while (cnt) + { + status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL); + if (status == G_IO_STATUS_ERROR) + break; + if (status == G_IO_STATUS_NORMAL) + cnt--; + } + + g_assert (status == G_IO_STATUS_NORMAL); + + g_io_channel_unref (io); +} + + +gint main (gint argc, gchar * argv[]) +{ + GIOChannel *gio_r, *gio_w ; + GError *gerr = NULL; + GString *buffer; + char *filename; + char *srcdir = getenv ("srcdir"); + gint rlength = 0; + glong wlength = 0; + gsize length_out; + const gchar encoding[] = "EUC-JP"; + GIOStatus status; + GIOFlags flags; + + if (!srcdir) + srcdir = "."; + filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL); + + setbuf (stdout, NULL); /* For debugging */ + + gio_r = g_io_channel_new_file (filename, "r", &gerr); + if (gerr) + { + g_warning ("Unable to open file %s: %s", filename, gerr->message); + g_error_free (gerr); + return 1; + } + gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr); + if (gerr) + { + g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message); + g_error_free (gerr); + return 1; + } + + g_io_channel_set_encoding (gio_r, encoding, &gerr); + if (gerr) + { + g_warning (gerr->message); + /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */ + if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION) + return 1; + g_error_free (gerr); + gerr = NULL; + } + + g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE); + + status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr); + if (status == G_IO_STATUS_ERROR) + { + g_warning (gerr->message); + g_error_free (gerr); + gerr = NULL; + } + flags = g_io_channel_get_flags (gio_r); + buffer = g_string_sized_new (BUFFER_SIZE); + + while (TRUE) + { + do + status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr); + while (status == G_IO_STATUS_AGAIN); + if (status != G_IO_STATUS_NORMAL) + break; + + rlength += buffer->len; + + do + status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len, + &length_out, &gerr); + while (status == G_IO_STATUS_AGAIN); + if (status != G_IO_STATUS_NORMAL) + break; + + wlength += length_out; + + if (length_out < buffer->len) + g_warning ("Only wrote part of the line."); + +#ifdef VERBOSE + g_print ("%s", buffer->str); +#endif + g_string_truncate (buffer, 0); + } + + switch (status) + { + case G_IO_STATUS_EOF: + break; + case G_IO_STATUS_ERROR: + g_warning (gerr->message); + g_error_free (gerr); + gerr = NULL; + break; + default: + g_warning ("Abnormal exit from write loop."); + break; + } + + do + status = g_io_channel_flush (gio_w, &gerr); + while (status == G_IO_STATUS_AGAIN); + + if (status == G_IO_STATUS_ERROR) + { + g_warning (gerr->message); + g_error_free (gerr); + gerr = NULL; + } + +#ifdef VERBOSE + g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength); +#endif + + g_io_channel_unref(gio_r); + g_io_channel_unref(gio_w); + + test_small_writes (); + + return 0; +} diff --git a/tests/libmoduletestplugin_a.c b/tests/libmoduletestplugin_a.c new file mode 100644 index 0000000..150d50d --- /dev/null +++ b/tests/libmoduletestplugin_a.c @@ -0,0 +1,71 @@ +/* libgplugin_a.c - test plugin for testgmodule + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +G_MODULE_EXPORT gchar* gplugin_a_state; + +G_MODULE_EXPORT void +gplugin_a_func (void) +{ + gplugin_a_state = "Hello world"; +} + +G_MODULE_EXPORT void +gplugin_clash_func (void) +{ + gplugin_a_state = "plugin clash"; +} + +G_MODULE_EXPORT void +g_clash_func (void) +{ + gplugin_a_state = "global clash"; +} + +G_MODULE_EXPORT void +gplugin_say_boo_func (void) +{ + gplugin_a_state = "BOOH"; +} + +G_MODULE_EXPORT void +gplugin_a_module_func (GModule *module) +{ + void *f = NULL; + + if (!g_module_symbol (module, "gplugin_say_boo_func", &f )) + { + g_print ("error: %s\n", g_module_error ()); + exit (1); + } + + ((void(*)(void)) f) (); +} diff --git a/tests/libmoduletestplugin_b.c b/tests/libmoduletestplugin_b.c new file mode 100644 index 0000000..26e065d --- /dev/null +++ b/tests/libmoduletestplugin_b.c @@ -0,0 +1,70 @@ +/* libgplugin_b.c - test plugin for testgmodule + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +G_MODULE_EXPORT gchar* gplugin_b_state; + +G_MODULE_EXPORT const gchar* +g_module_check_init (GModule *module) +{ + gplugin_b_state = "check-init"; + + return NULL; +} + +G_MODULE_EXPORT void +g_module_unload (GModule *module) +{ + gplugin_b_state = "unloaded"; +} + +G_MODULE_EXPORT void +gplugin_b_func (void) +{ + gplugin_b_state = "Hello world"; +} + +G_MODULE_EXPORT void +gplugin_clash_func (void) +{ + gplugin_b_state = "plugin clash"; +} + +G_MODULE_EXPORT void +g_clash_func (void) +{ + gplugin_b_state = "global clash"; +} + +G_MODULE_EXPORT void +gplugin_say_boo_func (void) +{ + gplugin_b_state = "BOOH"; +} diff --git a/tests/list-test.c b/tests/list-test.c new file mode 100644 index 0000000..6e274fc --- /dev/null +++ b/tests/list-test.c @@ -0,0 +1,212 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#define DEBUG_MSG(args) +/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ +#define PRINT_MSG(args) +/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */ + +#define SIZE 50 +#define NUMBER_MIN 0000 +#define NUMBER_MAX 9999 + + +static guint32 array[SIZE]; + + +static gint +sort (gconstpointer p1, gconstpointer p2) +{ + gint32 a, b; + + a = GPOINTER_TO_INT (p1); + b = GPOINTER_TO_INT (p2); + + return (a > b ? +1 : a == b ? 0 : -1); +} + +/* + * glist sort tests + */ +static void +test_list_sort (void) +{ + GList *list = NULL; + gint i; + + PRINT_MSG (("testing g_list_sort()")); + + for (i = 0; i < SIZE; i++) { + list = g_list_append (list, GINT_TO_POINTER (array[i])); + } + + list = g_list_sort (list, sort); + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_list_nth_data (list, i); + p2 = g_list_nth_data (list, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("list_sort #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } + + g_list_free (list); +} + +static void +test_list_sort_with_data (void) +{ + GList *list = NULL; + gint i; + + PRINT_MSG (("testing g_list_sort_with_data()")); + + for (i = 0; i < SIZE; i++) { + list = g_list_append (list, GINT_TO_POINTER (array[i])); + } + + list = g_list_sort_with_data (list, (GCompareDataFunc)sort, NULL); + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_list_nth_data (list, i); + p2 = g_list_nth_data (list, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("list_sort_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } + + g_list_free (list); +} + +static void +test_list_insert_sorted (void) +{ + GList *list = NULL; + gint i; + + PRINT_MSG (("testing g_list_insert_sorted()")); + + for (i = 0; i < SIZE; i++) { + list = g_list_insert_sorted (list, GINT_TO_POINTER (array[i]), sort); + } + + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_list_nth_data (list, i); + p2 = g_list_nth_data (list, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("list_insert_sorted #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } + + g_list_free (list); +} + +static void +test_list_insert_sorted_with_data (void) +{ + GList *list = NULL; + gint i; + + PRINT_MSG (("testing g_list_insert_sorted_with_data()")); + + for (i = 0; i < SIZE; i++) { + list = g_list_insert_sorted_with_data (list, + GINT_TO_POINTER (array[i]), + (GCompareDataFunc)sort, + NULL); + } + + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_list_nth_data (list, i); + p2 = g_list_nth_data (list, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("list_insert_sorted_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } + + g_list_free (list); +} + +static void +test_list_reverse (void) +{ + GList *list = NULL; + GList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + PRINT_MSG (("testing g_list_reverse()")); + + for (i = 0; i < 10; i++) { + list = g_list_append (list, &nums[i]); + } + + list = g_list_reverse (list); + + for (i = 0; i < 10; i++) { + st = g_list_nth (list, i); + g_assert (*((gint*) st->data) == (9 - i)); + } + + g_list_free (list); +} + +static void +test_list_nth (void) +{ + GList *list = NULL; + GList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + PRINT_MSG (("testing g_list_nth()")); + + for (i = 0; i < 10; i++) { + list = g_list_append (list, &nums[i]); + } + + for (i = 0; i < 10; i++) { + st = g_list_nth (list, i); + g_assert (*((gint*) st->data) == i); + } + + g_list_free (list); +} + +int +main (int argc, char *argv[]) +{ + gint i; + + DEBUG_MSG (("debugging messages turned on")); + + DEBUG_MSG (("creating %d random numbers", SIZE)); + + /* Create an array of random numbers. */ + for (i = 0; i < SIZE; i++) { + array[i] = g_random_int_range (NUMBER_MIN, NUMBER_MAX); + DEBUG_MSG (("number #%3.3d ---> %d", i, array[i])); + } + + /* Start tests. */ + test_list_sort (); + test_list_sort_with_data (); + + test_list_insert_sorted (); + test_list_insert_sorted_with_data (); + + test_list_reverse (); + test_list_nth (); + + PRINT_MSG (("testing finished")); + + return 0; +} diff --git a/tests/mainloop-test.c b/tests/mainloop-test.c new file mode 100644 index 0000000..cfa7f73 --- /dev/null +++ b/tests/mainloop-test.c @@ -0,0 +1,438 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#ifdef G_OS_UNIX +#include +#endif +#include +#include + +#ifdef G_OS_WIN32 +#include /* For _O_BINARY used by pipe() macro */ +#include /* for _pipe() */ +#define pipe(fds) _pipe(fds, 4096, _O_BINARY) +#endif + +#define ITERS 10000 +#define INCREMENT 10 +#define NTHREADS 4 +#define NCRAWLERS 4 +#define CRAWLER_TIMEOUT_RANGE 40 +#define RECURSER_TIMEOUT 50 + +/* The partial ordering between the context array mutex and + * crawler array mutex is that the crawler array mutex cannot + * be locked while the context array mutex is locked + */ +GPtrArray *context_array; +GMutex *context_array_mutex; +GCond *context_array_cond; + +GMainLoop *main_loop; + +G_LOCK_DEFINE_STATIC (crawler_array_lock); +GPtrArray *crawler_array; + +typedef struct _AddrData AddrData; +typedef struct _TestData TestData; + +struct _AddrData +{ + GMainLoop *loop; + GIOChannel *dest; + gint count; +}; + +struct _TestData +{ + gint current_val; + gint iters; + GIOChannel *in; +}; + +static void cleanup_crawlers (GMainContext *context); + +gboolean +read_all (GIOChannel *channel, char *buf, gsize len) +{ + gsize bytes_read = 0; + gsize count; + GIOError err; + + while (bytes_read < len) + { + err = g_io_channel_read (channel, buf + bytes_read, len - bytes_read, &count); + if (err) + { + if (err != G_IO_ERROR_AGAIN) + return FALSE; + } + else if (count == 0) + return FALSE; + + bytes_read += count; + } + + return TRUE; +} + +gboolean +write_all (GIOChannel *channel, char *buf, gsize len) +{ + gsize bytes_written = 0; + gsize count; + GIOError err; + + while (bytes_written < len) + { + err = g_io_channel_write (channel, buf + bytes_written, len - bytes_written, &count); + if (err && err != G_IO_ERROR_AGAIN) + return FALSE; + + bytes_written += count; + } + + return TRUE; +} + +gboolean +adder_callback (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + char buf1[32]; + char buf2[32]; + + char result[32]; + + AddrData *addr_data = data; + + if (!read_all (source, buf1, 32) || + !read_all (source, buf2, 32)) + { + g_main_loop_quit (addr_data->loop); + return FALSE; + } + + sprintf (result, "%d", atoi(buf1) + atoi(buf2)); + write_all (addr_data->dest, result, 32); + + return TRUE; +} + +gboolean +timeout_callback (gpointer data) +{ + AddrData *addr_data = data; + + addr_data->count++; + + return TRUE; +} + +gpointer +adder_thread (gpointer data) +{ + GMainContext *context; + GSource *adder_source; + GSource *timeout_source; + + GIOChannel **channels = data; + AddrData addr_data; + + context = g_main_context_new (); + + g_mutex_lock (context_array_mutex); + + g_ptr_array_add (context_array, context); + + if (context_array->len == NTHREADS) + g_cond_broadcast (context_array_cond); + + g_mutex_unlock (context_array_mutex); + + addr_data.dest = channels[1]; + addr_data.loop = g_main_loop_new (context, FALSE); + addr_data.count = 0; + + adder_source = g_io_create_watch (channels[0], G_IO_IN | G_IO_HUP); + g_source_set_callback (adder_source, (GSourceFunc)adder_callback, &addr_data, NULL); + g_source_attach (adder_source, context); + g_source_unref (adder_source); + + timeout_source = g_timeout_source_new (10); + g_source_set_callback (timeout_source, (GSourceFunc)timeout_callback, &addr_data, NULL); + g_source_set_priority (timeout_source, G_PRIORITY_HIGH); + g_source_attach (timeout_source, context); + g_source_unref (timeout_source); + + g_main_loop_run (addr_data.loop); + + g_io_channel_unref (channels[0]); + g_io_channel_unref (channels[1]); + + g_free (channels); + + g_main_loop_unref (addr_data.loop); + +#ifdef VERBOSE + g_print ("Timeout run %d times\n", addr_data.count); +#endif + + g_mutex_lock (context_array_mutex); + g_ptr_array_remove (context_array, context); + if (context_array->len == 0) + g_main_loop_quit (main_loop); + g_mutex_unlock (context_array_mutex); + + cleanup_crawlers (context); + + return NULL; +} + +void +io_pipe (GIOChannel **channels) +{ + gint fds[2]; + + if (pipe(fds) < 0) + { + g_warning ("Cannot create pipe %s\n", g_strerror (errno)); + exit (1); + } + + channels[0] = g_io_channel_unix_new (fds[0]); + channels[1] = g_io_channel_unix_new (fds[1]); + + g_io_channel_set_close_on_unref (channels[0], TRUE); + g_io_channel_set_close_on_unref (channels[1], TRUE); +} + +void +do_add (GIOChannel *in, gint a, gint b) +{ + char buf1[32]; + char buf2[32]; + + sprintf (buf1, "%d", a); + sprintf (buf2, "%d", b); + + write_all (in, buf1, 32); + write_all (in, buf2, 32); +} + +gboolean +adder_response (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + char result[32]; + TestData *test_data = data; + + if (!read_all (source, result, 32)) + return FALSE; + + test_data->current_val = atoi (result); + test_data->iters--; + + if (test_data->iters == 0) + { + if (test_data->current_val != ITERS * INCREMENT) + { + g_print ("Addition failed: %d != %d\n", + test_data->current_val, ITERS * INCREMENT); + exit (1); + } + + g_io_channel_unref (source); + g_io_channel_unref (test_data->in); + + g_free (test_data); + + return FALSE; + } + + do_add (test_data->in, test_data->current_val, INCREMENT); + + return TRUE; +} + +void +create_adder_thread (void) +{ + GError *err = NULL; + TestData *test_data; + + GIOChannel *in_channels[2]; + GIOChannel *out_channels[2]; + + GIOChannel **sub_channels; + + sub_channels = g_new (GIOChannel *, 2); + + io_pipe (in_channels); + io_pipe (out_channels); + + sub_channels[0] = in_channels[0]; + sub_channels[1] = out_channels[1]; + + g_thread_create (adder_thread, sub_channels, FALSE, &err); + + if (err) + { + g_warning ("Cannot create thread: %s", err->message); + exit (1); + } + + test_data = g_new (TestData, 1); + test_data->in = in_channels[1]; + test_data->current_val = 0; + test_data->iters = ITERS; + + g_io_add_watch (out_channels[0], G_IO_IN | G_IO_HUP, + adder_response, test_data); + + do_add (test_data->in, test_data->current_val, INCREMENT); +} + +static void create_crawler (void); + +static void +remove_crawler (void) +{ + GSource *other_source; + + if (crawler_array->len > 0) + { + other_source = crawler_array->pdata[g_random_int_range (0, crawler_array->len)]; + g_source_destroy (other_source); + g_assert (g_ptr_array_remove_fast (crawler_array, other_source)); + } +} + +static gint +crawler_callback (gpointer data) +{ + GSource *source = data; + + G_LOCK (crawler_array_lock); + + if (!g_ptr_array_remove_fast (crawler_array, source)) + remove_crawler(); + + remove_crawler(); + G_UNLOCK (crawler_array_lock); + + create_crawler(); + create_crawler(); + + return FALSE; +} + +static void +create_crawler (void) +{ + GSource *source = g_timeout_source_new (g_random_int_range (0, CRAWLER_TIMEOUT_RANGE)); + g_source_set_callback (source, (GSourceFunc)crawler_callback, source, NULL); + + G_LOCK (crawler_array_lock); + g_ptr_array_add (crawler_array, source); + + g_mutex_lock (context_array_mutex); + g_source_attach (source, context_array->pdata[g_random_int_range (0, context_array->len)]); + g_source_unref (source); + g_mutex_unlock (context_array_mutex); + + G_UNLOCK (crawler_array_lock); +} + +static void +cleanup_crawlers (GMainContext *context) +{ + gint i; + + G_LOCK (crawler_array_lock); + for (i=0; i < crawler_array->len; i++) + { + if (g_source_get_context (crawler_array->pdata[i]) == context) + { + g_source_destroy (g_ptr_array_remove_index (crawler_array, i)); + i--; + } + } + G_UNLOCK (crawler_array_lock); +} + +static gboolean +recurser_idle (gpointer data) +{ + GMainContext *context = data; + gint i; + + for (i = 0; i < 10; i++) + g_main_context_iteration (context, FALSE); + + return FALSE; +} + +static gboolean +recurser_start (gpointer data) +{ + GMainContext *context; + GSource *source; + + g_mutex_lock (context_array_mutex); + context = context_array->pdata[g_random_int_range (0, context_array->len)]; + source = g_idle_source_new (); + g_source_set_callback (source, recurser_idle, context, NULL); + g_source_attach (source, context); + g_source_unref (source); + g_mutex_unlock (context_array_mutex); + + return TRUE; +} + +int +main (int argc, + char *argv[]) +{ + /* Only run the test, if threads are enabled and a default thread + implementation is available */ +#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) + gint i; + + g_thread_init (NULL); + + context_array = g_ptr_array_new (); + context_array_mutex = g_mutex_new (); + context_array_cond = g_cond_new (); + + crawler_array = g_ptr_array_new (); + + main_loop = g_main_loop_new (NULL, FALSE); + + for (i = 0; i < NTHREADS; i++) + create_adder_thread (); + + /* Wait for all threads to start + */ + g_mutex_lock (context_array_mutex); + + if (context_array->len < NTHREADS) + g_cond_wait (context_array_cond, context_array_mutex); + + g_mutex_unlock (context_array_mutex); + + for (i = 0; i < NCRAWLERS; i++) + create_crawler (); + + g_timeout_add (RECURSER_TIMEOUT, recurser_start, NULL); + + g_main_loop_run (main_loop); + g_main_loop_unref (main_loop); + +#endif + return 0; +} diff --git a/tests/makefile.msc.in b/tests/makefile.msc.in new file mode 100644 index 0000000..f87c58f --- /dev/null +++ b/tests/makefile.msc.in @@ -0,0 +1,105 @@ +## Makefile for building the GLib test programs with Microsoft C +## Use: nmake -f makefile.msc check + +TOP = ..\.. + +!INCLUDE ..\build\win32\make.msc + +################################################################ + +INCLUDES = -FImsvc_recommended_pragmas.h -I .. -I ..\glib -I ..\gmodule +DEFINES = -DHAVE_CONFIG_H -DENABLE_REGEX + +NONAUTOMATIC_TESTS = \ + testglib.exe \ + testgdate.exe \ + testgdateparser.exe \ + unicode-normalize.exe \ + unicode-collate.exe + +TESTS = \ + atomic-test.exe \ + asyncqueue-test.exe \ + base64-test.exe \ + bit-test.exe \ + bookmarkfile-test.exe \ + child-test.exe \ + checksum-test.exe \ + completion-test.exe \ + convert-test.exe \ + date-test.exe \ + dirname-test.exe \ + env-test.exe \ + errorcheck-mutex-test.exe \ + file-test.exe \ + gio-test.exe \ + iochannel-test.exe \ + hash-test.exe \ + list-test.exe \ + mainloop-test.exe \ + mapping-test.exe \ +#c99 markup-collect.exe \ + markup-escape-test.exe \ + markup-test.exe \ +#main? memchunks.exe \ + module-test.exe \ + node-test.exe \ +#c99 onceinit.exe \ + patterntest.exe \ + queue-test.exe \ + qsort-test.exe \ + regex-test.exe \ + relation-test.exe \ + scannerapi.exe \ + sequence-test.exe \ + shell-test.exe \ + slice-color.exe \ +#unistd slice-concurrent.exe\ + slice-threadinit.exe \ + slice-test.exe \ + slist-test.exe \ + spawn-test.exe \ + testingbase64.exe \ + thread-test.exe \ + threadpool-test.exe \ +#unistd timeloop-basic.exe \ +#unistd timeloop-closure.exe \ +#unistd timeloop.exe \ + tree-test.exe \ + type-test.exe \ + unicode-caseconv.exe \ + unicode-encoding.exe \ + utf8-validate.exe \ + utf8-pointer.exe \ + uri-test.exe \ + \ + gio-ls.exe + +DLLS = \ + libmoduletestplugin_a.dll \ + libmoduletestplugin_b.dll + +all : $(TESTS) $(NONAUTOMATIC_TESTS) $(DLLS) + +.c.exe : + $(CC) $(CFLAGS) -c $< + $(CC) $(CFLAGS) -Fe$@ $< ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib ..\gthread\gthread-2.0.lib $(LDFLAGS) user32.lib /subsystem:console + +gio-ls.exe : gio-ls.obj + $(CC) $(CFLAGS) -Fe$@ gio-ls.obj \ + ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib ..\gthread\gthread-2.0.lib \ + ..\gobject\gobject-2.0.lib ..\gio\gio-2.0.lib \ + $(LDFLAGS) user32.lib /subsystem:console + +slice-test.exe : memchunks.obj slice-test.obj + $(CC) $(CFLAGS) -Fe$@ memchunks.obj slice-test.obj \ + ..\glib\glib-2.0.lib ..\gmodule\gmodule-2.0.lib ..\gthread\gthread-2.0.lib $(LDFLAGS) user32.lib /subsystem:console + +libmoduletestplugin_a.dll : libmoduletestplugin_a.obj + $(CC) $(CFLAGS) -LD libmoduletestplugin_a.obj ..\gmodule\gmodule-2.0.lib ..\glib\glib-2.0.lib $(LDFLAGS) + +libmoduletestplugin_b.dll : libmoduletestplugin_b.obj + $(CC) $(CFLAGS) -LD libmoduletestplugin_b.obj ..\gmodule\gmodule-2.0.lib ..\glib\glib-2.0.lib $(LDFLAGS) + +check: all + for %p in ($(TESTS)) do set PATH=..\glib;..\gmodule;..\gobject;..\gthread;%PATH% && %p diff --git a/tests/mapping-test.c b/tests/mapping-test.c new file mode 100644 index 0000000..1a10b19 --- /dev/null +++ b/tests/mapping-test.c @@ -0,0 +1,256 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2005 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include + +#include "glib.h" +#include "gstdio.h" + +static gchar *dir, *filename, *displayname, *childname; + +static gboolean stop = FALSE; + +#ifndef G_OS_WIN32 + +static void +handle_usr1 (int signum) +{ + stop = TRUE; +} + +#endif + +static gboolean +check_stop (gpointer data) +{ + GMainLoop *loop = data; + +#ifdef G_OS_WIN32 + stop = g_file_test ("STOP", G_FILE_TEST_EXISTS); +#endif + + if (stop) + g_main_loop_quit (loop); + + return TRUE; +} + +static void +write_or_die (const gchar *filename, + const gchar *contents, + gssize length) +{ + GError *error = NULL; + gchar *displayname; + + if (!g_file_set_contents (filename, contents, length, &error)) + { + displayname = g_filename_display_name (childname); + g_print ("failed to write '%s': %s\n", + displayname, error->message); + exit (1); + } +} + +static GMappedFile * +map_or_die (const gchar *filename, + gboolean writable) +{ + GError *error = NULL; + GMappedFile *map; + gchar *displayname; + + map = g_mapped_file_new (filename, writable, &error); + if (!map) + { + displayname = g_filename_display_name (childname); + g_print ("failed to map '%s' non-writable, shared: %s\n", + displayname, error->message); + exit (1); + } + + return map; +} + +static int +child_main (int argc, char *argv[]) +{ + GMappedFile *map; + GMainLoop *loop; + + map = map_or_die (filename, FALSE); + + loop = g_main_loop_new (NULL, FALSE); + +#ifndef G_OS_WIN32 + signal (SIGUSR1, handle_usr1); +#endif + g_idle_add (check_stop, loop); + g_main_loop_run (loop); + + write_or_die (childname, + g_mapped_file_get_contents (map), + g_mapped_file_get_length (map)); + + return 0; +} + +static void +test_mapping (void) +{ + GMappedFile *map; + + write_or_die (filename, "ABC", -1); + + map = map_or_die (filename, FALSE); + g_assert (g_mapped_file_get_length (map) == 3); + g_mapped_file_free (map); + + map = map_or_die (filename, TRUE); + g_assert (g_mapped_file_get_length (map) == 3); + g_mapped_file_free (map); +} + +static void +test_private (void) +{ + GError *error = NULL; + GMappedFile *map; + gchar *buffer; + gsize len; + + write_or_die (filename, "ABC", -1); + map = map_or_die (filename, TRUE); + + buffer = (gchar *)g_mapped_file_get_contents (map); + buffer[0] = '1'; + buffer[1] = '2'; + buffer[2] = '3'; + g_mapped_file_free (map); + + if (!g_file_get_contents (filename, &buffer, &len, &error)) + { + g_print ("failed to read '%s': %s\n", + displayname, error->message); + exit (1); + + } + g_assert (len == 3); + g_assert (strcmp (buffer, "ABC") == 0); + g_free (buffer); + +} + +static void +test_child_private (gchar *argv0) +{ + GError *error = NULL; + GMappedFile *map; + gchar *buffer; + gsize len; + gchar *child_argv[3]; + GPid child_pid; + +#ifdef G_OS_WIN32 + g_remove ("STOP"); + g_assert (!g_file_test ("STOP", G_FILE_TEST_EXISTS)); +#endif + + write_or_die (filename, "ABC", -1); + map = map_or_die (filename, TRUE); + + child_argv[0] = argv0; + child_argv[1] = "mapchild"; + child_argv[2] = NULL; + if (!g_spawn_async (dir, child_argv, NULL, + 0, NULL, NULL, &child_pid, &error)) + { + g_print ("failed to spawn child: %s\n", + error->message); + exit (1); + } + + /* give the child some time to set up its mapping */ + g_usleep (2000000); + + buffer = (gchar *)g_mapped_file_get_contents (map); + buffer[0] = '1'; + buffer[1] = '2'; + buffer[2] = '3'; + g_mapped_file_free (map); + +#ifndef G_OS_WIN32 + kill (child_pid, SIGUSR1); +#else + g_file_set_contents ("STOP", "Hey there\n", -1, NULL); +#endif + + /* give the child some time to write the file */ + g_usleep (2000000); + + if (!g_file_get_contents (childname, &buffer, &len, &error)) + { + gchar *name; + + name = g_filename_display_name (childname); + g_print ("failed to read '%s': %s\n", name, error->message); + exit (1); + } + g_assert (len == 3); + g_assert (strcmp (buffer, "ABC") == 0); + g_free (buffer); +} + +static int +parent_main (int argc, + char *argv[]) +{ + /* test mapping with various flag combinations */ + test_mapping (); + + /* test private modification */ + test_private (); + + /* test multiple clients, non-shared */ + test_child_private (argv[0]); + + return 0; +} + +int +main (int argc, + char *argv[]) +{ + dir = g_get_current_dir (); + filename = g_build_filename (dir, "maptest", NULL); + displayname = g_filename_display_name (filename); + childname = g_build_filename (dir, "mapchild", NULL); + + if (argc > 1) + return child_main (argc, argv); + else + return parent_main (argc, argv); +} diff --git a/tests/markup-collect.c b/tests/markup-collect.c new file mode 100644 index 0000000..70c4b71 --- /dev/null +++ b/tests/markup-collect.c @@ -0,0 +1,221 @@ +/* + * Copyright © 2007 Ryan Lortie + * + * This program 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 of the + * License, or (at your option) any later version. + * + * See the included COPYING file for more information. + */ + +#include +#include + +static void +start (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + gpointer user_data, + GError **error) +{ + GString *string = user_data; + gboolean result; + +#define collect(...) \ + g_markup_collect_attributes (element_name, attribute_names, \ + attribute_values, error, __VA_ARGS__, \ + G_MARKUP_COLLECT_INVALID) +#define BOOL G_MARKUP_COLLECT_BOOLEAN +#define OPTBOOL G_MARKUP_COLLECT_BOOLEAN | G_MARKUP_COLLECT_OPTIONAL +#define TRI G_MARKUP_COLLECT_TRISTATE +#define STR G_MARKUP_COLLECT_STRING +#define STRDUP G_MARKUP_COLLECT_STRDUP +#define OPTSTR G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL +#define OPTDUP G_MARKUP_COLLECT_STRDUP | G_MARKUP_COLLECT_OPTIONAL +#define n(x) ((x)?(x):"(null)") + + if (strcmp (element_name, "bool") == 0) + { + gboolean mb = 2, ob = 2, tri = 2; + + result = collect (BOOL, "mb", &mb, + OPTBOOL, "ob", &ob, + TRI, "tri", &tri); + + g_assert (result || + (mb == FALSE && ob == FALSE && tri != TRUE && tri != FALSE)); + + if (tri != FALSE && tri != TRUE) + tri = -1; + + g_string_append_printf (string, "", + result, mb, ob, tri); + } + + else if (strcmp (element_name, "str") == 0) + { + const char *cm, *co; + char *am, *ao; + + result = collect (STR, "cm", &cm, + STRDUP, "am", &am, + OPTDUP, "ao", &ao, + OPTSTR, "co", &co); + + g_assert (result || + (cm == NULL && am == NULL && ao == NULL && co == NULL)); + + g_string_append_printf (string, "", + result, n (cm), n (am), n (ao), n (co)); + + g_free (am); + g_free (ao); + } +} + +static GMarkupParser parser = { start }; + +struct test +{ + const char *document; + const char *result; + GMarkupError error_code; + const char *error_info; +}; + +static struct test tests[] = +{ + { "", "", + G_MARKUP_ERROR_PARSE, "'bool'" }, + + { "", "" }, + { "", "" }, + { "", "" }, + { "", "" }, + + { "", "", + G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'mb'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'tri'" }, + + { "", "" }, + + { "", "", + G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'cm'" }, + + { "", "", + G_MARKUP_ERROR_MISSING_ATTRIBUTE, "'cm'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'am'" }, + + { "", "", + G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "'qm'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'am'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'am'" }, + + { "", + "", + G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "'a'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" }, + + { "", "", + G_MARKUP_ERROR_INVALID_CONTENT, "'mb'" } +}; + +int +main (int argc, char **argv) +{ + gboolean verbose = FALSE; + int i; + + if (argc > 1) + { + if (argc != 2 || strcmp (argv[1], "-v") != 0) + { + g_print ("error: call with no arguments or '-v' for verbose\n"); + return 1; + } + + verbose = TRUE; + } + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + GMarkupParseContext *ctx; + GError *error = NULL; + GString *string; + gboolean result; + + string = g_string_new (""); + ctx = g_markup_parse_context_new (&parser, 0, string, NULL); + result = g_markup_parse_context_parse (ctx, + tests[i].document, + -1, &error); + if (result) + result = g_markup_parse_context_end_parse (ctx, &error); + + if (verbose) + g_print ("%d: %s:\n (error %d, \"%s\")\n %s\n\n", + i, tests[i].document, + error ? error->code : 0, + error ? error->message : "(no error)", + string->str); + + if (result) + { + if (error != NULL) + g_error ("parser successful but error is set: " + "%s(%d) '%s'", g_quark_to_string (error->domain), + error->code, error->message); + + if (tests[i].error_code != 0) + g_error ("parser succeeded on test %d ('%s') but " + "we expected a failure with code %d\n", i, + tests[i].document, tests[i].error_code); + } + else + { + if (error->domain != G_MARKUP_ERROR) + g_error ("error occured on test %d ('%s') but is not in " + "the GMarkupError domain, but rather '%s'", i, + tests[i].document, g_quark_to_string (error->domain)); + + if (error->code != tests[i].error_code) + g_error ("failure expected with test %d ('%s') but it " + "has error code %d (we expected code %d)", i, + tests[i].document, error->code, tests[i].error_code); + + if (strstr (error->message, tests[i].error_info) == NULL) + g_error ("failure message on test %d ('%s') fails " + "to mention '%s' in the error message", i, + tests[i].document, tests[i].error_info); + } + + if (strcmp (tests[i].result, string->str) != 0) + g_error ("result on test %d ('%s') expected to be '%s' " + "but came out as '%s'", i, tests[i].document, + tests[i].result, string->str); + + g_markup_parse_context_free (ctx); + g_string_free (string, TRUE); + g_clear_error (&error); + } + + if (verbose) + g_print ("\n*** all tests passed ***\n\n"); + + return 0; +} diff --git a/tests/markup-escape-test.c b/tests/markup-escape-test.c new file mode 100644 index 0000000..2734162 --- /dev/null +++ b/tests/markup-escape-test.c @@ -0,0 +1,132 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include + +static void test_format (const gchar *format, + const gchar *expected, ...) G_GNUC_PRINTF (1, 3); + +static gboolean error = FALSE; + +static void +test (const gchar *original, + const gchar *expected) +{ + gchar *result = g_markup_escape_text (original, -1); + + if (strcmp (result, expected) != 0) + { + g_printerr ("g_markup_escape_text(): expected '%s', got '%s'\n", + expected, result); + error = TRUE; + } + + g_free (result); +} + +static void +test_unichar (gunichar c, + gboolean entity) +{ + gint len; + gchar outbuf[7], expected[12]; + + len = g_unichar_to_utf8 (c, outbuf); + outbuf[len] = 0; + + if (entity) + g_snprintf (expected, 12, "&#x%x;", c); + else + strcpy (expected, outbuf); + + test (outbuf, expected); +} + +static void +test_format (const gchar *format, + const gchar *expected, + ...) +{ + gchar *result; + + va_list args; + + va_start (args, expected); + result = g_markup_vprintf_escaped (format, args); + va_end (args); + + if (strcmp (result, expected) != 0) + { + g_printerr ("g_markup_printf_escaped(): expected '%s', got '%s'\n", + expected, result); + error = TRUE; + } + + g_free (result); +} + +int main (int argc, char **argv) +{ + /* Tests for g_markup_escape_text() */ + test ("&", "&"); + test ("<", "<"); + test (">", ">"); + test ("'", "'"); + test ("\"", """); + + test ("", ""); + test ("A", "A"); + test ("A&", "A&"); + test ("&A", "&A"); + test ("A&A", "A&A"); + test ("&&A", "&&A"); + test ("A&&", "A&&"); + test ("A&&A", "A&&A"); + test ("A&A&A", "A&A&A"); + test ("AA", "A&#23;A"); + test ("A A", "A&#xa;A"); + test_unichar (0x1, TRUE); + test_unichar (0x8, TRUE); + test_unichar (0x9, FALSE); + test_unichar (0xa, FALSE); + test_unichar (0xb, TRUE); + test_unichar (0xc, TRUE); + test_unichar (0xd, FALSE); + test_unichar (0xe, TRUE); + test_unichar (0x1f, TRUE); + test_unichar (0x20, FALSE); + test_unichar (0x7e, FALSE); + test_unichar (0x7f, TRUE); + test_unichar (0x84, TRUE); + test_unichar (0x85, FALSE); + test_unichar (0x86, TRUE); + test_unichar (0x9f, TRUE); + test_unichar (0xa0, FALSE); + + /* Tests for g_markup_printf_escaped() */ + test_format ("A", "A"); + test_format ("A%s", "A&", "&"); + test_format ("%sA", "&A", "&"); + test_format ("A%sA", "A&A", "&"); + test_format ("%s%sA", "&&A", "&", "&"); + test_format ("A%s%s", "A&&", "&", "&"); + test_format ("A%s%sA", "A&&A", "&", "&"); + test_format ("A%sA%sA", "A&A&A", "&", "&"); + + test_format ("%s", "<B>&", + "&"); + test_format ("%c%c", "<&", + '<', '&'); + test_format (".%c.%c.", ".<.&.", + '<', '&'); + test_format ("%s", "", + ""); + test_format ("%-5s", "A ", + "A"); + test_format ("%2$s%1$s", "B.A.", + "A.", "B."); + + return error ? 1 : 0; +} diff --git a/tests/markup-test.c b/tests/markup-test.c new file mode 100644 index 0000000..6d5f44b --- /dev/null +++ b/tests/markup-test.c @@ -0,0 +1,214 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +static int depth = 0; + +static void +indent (int extra) +{ + int i = 0; + while (i < depth) + { + fputs (" ", stdout); + ++i; + } +} + +static void +start_element_handler (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + int i; + + indent (0); + printf ("ELEMENT '%s'\n", element_name); + + i = 0; + while (attribute_names[i] != NULL) + { + indent (1); + + printf ("%s=\"%s\"\n", + attribute_names[i], + attribute_values[i]); + + ++i; + } + + ++depth; +} + +static void +end_element_handler (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + --depth; + indent (0); + printf ("END '%s'\n", element_name); + } + +static void +text_handler (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + indent (0); + printf ("TEXT '%.*s'\n", (int)text_len, text); +} + + +static void +passthrough_handler (GMarkupParseContext *context, + const gchar *passthrough_text, + gsize text_len, + gpointer user_data, + GError **error) +{ + indent (0); + + printf ("PASS '%.*s'\n", (int)text_len, passthrough_text); +} + +static void +error_handler (GMarkupParseContext *context, + GError *error, + gpointer user_data) +{ + fprintf (stderr, " %s\n", error->message); +} + +static const GMarkupParser parser = { + start_element_handler, + end_element_handler, + text_handler, + passthrough_handler, + error_handler +}; + +static const GMarkupParser silent_parser = { + NULL, + NULL, + NULL, + NULL, + error_handler +}; + +static int +test_in_chunks (const gchar *contents, + gint length, + gint chunk_size) +{ + GMarkupParseContext *context; + int i = 0; + + context = g_markup_parse_context_new (&silent_parser, 0, NULL, NULL); + + while (i < length) + { + int this_chunk = MIN (length - i, chunk_size); + + if (!g_markup_parse_context_parse (context, + contents + i, + this_chunk, + NULL)) + { + g_markup_parse_context_free (context); + return 1; + } + + i += this_chunk; + } + + if (!g_markup_parse_context_end_parse (context, NULL)) + { + g_markup_parse_context_free (context); + return 1; + } + + g_markup_parse_context_free (context); + + return 0; +} + +static int +test_file (const gchar *filename) +{ + gchar *contents; + gsize length; + GError *error; + GMarkupParseContext *context; + + error = NULL; + if (!g_file_get_contents (filename, + &contents, + &length, + &error)) + { + fprintf (stderr, "%s\n", error->message); + g_error_free (error); + return 1; + } + + context = g_markup_parse_context_new (&parser, 0, NULL, NULL); + + if (!g_markup_parse_context_parse (context, contents, length, NULL)) + { + g_markup_parse_context_free (context); + return 1; + } + + if (!g_markup_parse_context_end_parse (context, NULL)) + { + g_markup_parse_context_free (context); + return 1; + } + + g_markup_parse_context_free (context); + + /* A byte at a time */ + if (test_in_chunks (contents, length, 1) != 0) + return 1; + + /* 2 bytes */ + if (test_in_chunks (contents, length, 2) != 0) + return 1; + + /*5 bytes */ + if (test_in_chunks (contents, length, 5) != 0) + return 1; + + /* 12 bytes */ + if (test_in_chunks (contents, length, 12) != 0) + return 1; + + /* 1024 bytes */ + if (test_in_chunks (contents, length, 1024) != 0) + return 1; + + return 0; +} + +int +main (int argc, + char *argv[]) +{ + if (argc > 1) + return test_file (argv[1]); + else + { + fprintf (stderr, "Give a markup file on the command line\n"); + return 1; + } +} + diff --git a/tests/markups/expected-1 b/tests/markups/expected-1 new file mode 100644 index 0000000..8b6cdd7 --- /dev/null +++ b/tests/markups/expected-1 @@ -0,0 +1,37 @@ +PASS '' +PASS '' +ELEMENT 'foobar' + TEXT ' +' + ELEMENT 'e1' + TEXT 'Hi & this is some text inside an element Two 'E' chars as character refs: E E and some 'J': J J' + END 'e1' + TEXT ' +' + ELEMENT 'e2:foo' + TEXT ' Text ' + ELEMENT 'childfree' + END 'childfree' + TEXT ' with some ' + ELEMENT 'nested' + TEXT 'nested elements' + END 'nested' + TEXT ' and entities "& < >> ' and whitespace ' + END 'e2:foo' + TEXT ' +' + ELEMENT 'tag' + ab="fo' +ELEMENT 'foo' + TEXT '' +END 'foo' diff --git a/tests/markups/expected-6 b/tests/markups/expected-6 new file mode 100644 index 0000000..bfb41ce --- /dev/null +++ b/tests/markups/expected-6 @@ -0,0 +1,6 @@ +PASS ' +]>' +ELEMENT 'foo' + TEXT '' +END 'foo' diff --git a/tests/markups/expected-7 b/tests/markups/expected-7 new file mode 100644 index 0000000..2fe1975 --- /dev/null +++ b/tests/markups/expected-7 @@ -0,0 +1,4 @@ +PASS '' +ELEMENT 'foo' + TEXT '' +END 'foo' diff --git a/tests/markups/expected-8 b/tests/markups/expected-8 new file mode 100644 index 0000000..5bbda04 --- /dev/null +++ b/tests/markups/expected-8 @@ -0,0 +1,5 @@ +ELEMENT 'foo' + TEXT '' + PASS '>>> CDATA ]]>' + TEXT '' +END 'foo' diff --git a/tests/markups/expected-9 b/tests/markups/expected-9 new file mode 100644 index 0000000..7810394 --- /dev/null +++ b/tests/markups/expected-9 @@ -0,0 +1,3 @@ +ELEMENT 'foo' + TEXT 'data' +END 'foo' diff --git a/tests/markups/fail-1.gmarkup b/tests/markups/fail-1.gmarkup new file mode 100644 index 0000000..e69de29 diff --git a/tests/markups/fail-10.gmarkup b/tests/markups/fail-10.gmarkup new file mode 100644 index 0000000..fe16558 --- /dev/null +++ b/tests/markups/fail-10.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tests/markups/fail-11.gmarkup b/tests/markups/fail-11.gmarkup new file mode 100644 index 0000000..216f40c --- /dev/null +++ b/tests/markups/fail-11.gmarkup @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/markups/fail-12.gmarkup b/tests/markups/fail-12.gmarkup new file mode 100644 index 0000000..a640299 --- /dev/null +++ b/tests/markups/fail-12.gmarkup @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/markups/fail-13.gmarkup b/tests/markups/fail-13.gmarkup new file mode 100644 index 0000000..a719288 --- /dev/null +++ b/tests/markups/fail-13.gmarkup @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/markups/fail-14.gmarkup b/tests/markups/fail-14.gmarkup new file mode 100644 index 0000000..ed52a60 --- /dev/null +++ b/tests/markups/fail-14.gmarkup @@ -0,0 +1,2 @@ + +< \ No newline at end of file diff --git a/tests/markups/fail-15.gmarkup b/tests/markups/fail-15.gmarkup new file mode 100644 index 0000000..c3b59e0 --- /dev/null +++ b/tests/markups/fail-15.gmarkup @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tests/markups/fail-16.gmarkup b/tests/markups/fail-16.gmarkup new file mode 100644 index 0000000..20f0148 --- /dev/null +++ b/tests/markups/fail-16.gmarkup @@ -0,0 +1 @@ + + \ No newline at end of file diff --git a/tests/markups/fail-8.gmarkup b/tests/markups/fail-8.gmarkup new file mode 100644 index 0000000..b355951 --- /dev/null +++ b/tests/markups/fail-8.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tests/markups/fail-9.gmarkup b/tests/markups/fail-9.gmarkup new file mode 100644 index 0000000..edd5596 --- /dev/null +++ b/tests/markups/fail-9.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tests/markups/valid-1.gmarkup b/tests/markups/valid-1.gmarkup new file mode 100644 index 0000000..6745c5c --- /dev/null +++ b/tests/markups/valid-1.gmarkup @@ -0,0 +1,9 @@ + + + +Hi & this is some text inside an element Two 'E' chars as character refs: E E and some 'J': J J + Text with some nested elements and entities "& < >> ' and whitespace +This element has attributes + + + \ No newline at end of file diff --git a/tests/markups/valid-10.gmarkup b/tests/markups/valid-10.gmarkup new file mode 100644 index 0000000..cbeb68e --- /dev/null +++ b/tests/markups/valid-10.gmarkup @@ -0,0 +1,6 @@ +data diff --git a/tests/markups/valid-11.gmarkup b/tests/markups/valid-11.gmarkup new file mode 100644 index 0000000..fe1cc4e --- /dev/null +++ b/tests/markups/valid-11.gmarkup @@ -0,0 +1,2 @@ +data diff --git a/tests/markups/valid-2.gmarkup b/tests/markups/valid-2.gmarkup new file mode 100644 index 0000000..4a3fa69 --- /dev/null +++ b/tests/markups/valid-2.gmarkup @@ -0,0 +1,49 @@ + +Παν語 + +This is a list of ways to say hello in various languages. Its purpose is to illustrate a number of scripts. + +(Converted into UTF-8) + +--------------------------------------------------------- +Arabic السلام عليكم +Czech (česky) Dobrý den +Danish (Dansk) Hej, Goddag +English Hello +Esperanto Saluton +Estonian Tere, Tervist +FORTRAN PROGRAM +Finnish (Suomi) Hei +French (Français) Bonjour, Salut +German (Deutsch Nord) Guten Tag +German (Deutsch Süd) Grüß Gott +Greek (Ελληνικά) Γειά σας +Hebrew שלום +Hindi नमस्ते, नमस्कार। +Italiano Ciao, Buon giorno +Maltese Ċaw, Saħħa +Nederlands, Vlaams Hallo, Dag +Norwegian (Norsk) Hei, God dag +Polish Dzień dobry, Hej +Russian (Русский) Здравствуйте!‎ +Slovak Dobrý deň +Spanish (Español) ‎¡Hola!‎ +Swedish (Svenska) Hej, Goddag +Thai (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ +Turkish (Türkçe) Merhaba +Vietnamese (Tiếng Việt) Xin Chào +Yiddish (ײַדישע) דאָס הײַזעלע + +Japanese (日本語) こんにちは, コンニチハ +Chinese (中文,普通话,汉语) 你好 +Cantonese (粵語,廣東話) 早晨, 你好 +Korean (한글) 안녕하세요, 안녕하십니까 + +Difference among chinese characters in GB, JIS, KSC, BIG5:‎ + GB -- 元气 开发 + JIS -- 元気 開発 + KSC -- 元氣 開發 + BIG5 -- 元氣 開發 + + + \ No newline at end of file diff --git a/tests/markups/valid-3.gmarkup b/tests/markups/valid-3.gmarkup new file mode 100644 index 0000000..aed984e --- /dev/null +++ b/tests/markups/valid-3.gmarkup @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/markups/valid-4.gmarkup b/tests/markups/valid-4.gmarkup new file mode 100644 index 0000000..2036162 --- /dev/null +++ b/tests/markups/valid-4.gmarkup @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/markups/valid-5.gmarkup b/tests/markups/valid-5.gmarkup new file mode 100644 index 0000000..3b861de --- /dev/null +++ b/tests/markups/valid-5.gmarkup @@ -0,0 +1,2 @@ + + diff --git a/tests/markups/valid-6.gmarkup b/tests/markups/valid-6.gmarkup new file mode 100644 index 0000000..d7c065a --- /dev/null +++ b/tests/markups/valid-6.gmarkup @@ -0,0 +1,4 @@ + +]> + diff --git a/tests/markups/valid-7.gmarkup b/tests/markups/valid-7.gmarkup new file mode 100644 index 0000000..832445d --- /dev/null +++ b/tests/markups/valid-7.gmarkup @@ -0,0 +1,2 @@ + + diff --git a/tests/markups/valid-8.gmarkup b/tests/markups/valid-8.gmarkup new file mode 100644 index 0000000..a75aee0 --- /dev/null +++ b/tests/markups/valid-8.gmarkup @@ -0,0 +1 @@ +>>> CDATA ]]> diff --git a/tests/markups/valid-9.gmarkup b/tests/markups/valid-9.gmarkup new file mode 100644 index 0000000..90a99a0 --- /dev/null +++ b/tests/markups/valid-9.gmarkup @@ -0,0 +1,2 @@ +data diff --git a/tests/memchunks.c b/tests/memchunks.c new file mode 100644 index 0000000..7a08de0 --- /dev/null +++ b/tests/memchunks.c @@ -0,0 +1,612 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +/* + * MT safe + */ + +#include "config.h" + +#include +#include +#include + +#include "glib.h" + +/* notes on macros: + * if ENABLE_GC_FRIENDLY is defined, freed memory should be 0-wiped. + */ + +#define MEM_PROFILE_TABLE_SIZE 4096 + +#define MEM_AREA_SIZE 4L + +static guint mem_chunk_recursion = 0; +# define MEM_CHUNK_ROUTINE_COUNT() (mem_chunk_recursion) +# define ENTER_MEM_CHUNK_ROUTINE() (mem_chunk_recursion = MEM_CHUNK_ROUTINE_COUNT () + 1) +# define LEAVE_MEM_CHUNK_ROUTINE() (mem_chunk_recursion = MEM_CHUNK_ROUTINE_COUNT () - 1) + +/* --- old memchunk prototypes --- */ +void old_mem_chunks_init (void); +GMemChunk* old_mem_chunk_new (const gchar *name, + gint atom_size, + gulong area_size, + gint type); +void old_mem_chunk_destroy (GMemChunk *mem_chunk); +gpointer old_mem_chunk_alloc (GMemChunk *mem_chunk); +gpointer old_mem_chunk_alloc0 (GMemChunk *mem_chunk); +void old_mem_chunk_free (GMemChunk *mem_chunk, + gpointer mem); +void old_mem_chunk_clean (GMemChunk *mem_chunk); +void old_mem_chunk_reset (GMemChunk *mem_chunk); +void old_mem_chunk_print (GMemChunk *mem_chunk); +void old_mem_chunk_info (void); + + +/* --- MemChunks --- */ +#ifndef G_ALLOC_AND_FREE +typedef struct _GAllocator GAllocator; +typedef struct _GMemChunk GMemChunk; +#define G_ALLOC_ONLY 1 +#define G_ALLOC_AND_FREE 2 +#endif + +typedef struct _GFreeAtom GFreeAtom; +typedef struct _GMemArea GMemArea; + +struct _GFreeAtom +{ + GFreeAtom *next; +}; + +struct _GMemArea +{ + GMemArea *next; /* the next mem area */ + GMemArea *prev; /* the previous mem area */ + gulong index; /* the current index into the "mem" array */ + gulong free; /* the number of free bytes in this mem area */ + gulong allocated; /* the number of atoms allocated from this area */ + gulong mark; /* is this mem area marked for deletion */ + gchar mem[MEM_AREA_SIZE]; /* the mem array from which atoms get allocated + * the actual size of this array is determined by + * the mem chunk "area_size". ANSI says that it + * must be declared to be the maximum size it + * can possibly be (even though the actual size + * may be less). + */ +}; + +struct _GMemChunk +{ + const gchar *name; /* name of this MemChunk...used for debugging output */ + gint type; /* the type of MemChunk: ALLOC_ONLY or ALLOC_AND_FREE */ + gint num_mem_areas; /* the number of memory areas */ + gint num_marked_areas; /* the number of areas marked for deletion */ + guint atom_size; /* the size of an atom */ + gulong area_size; /* the size of a memory area */ + GMemArea *mem_area; /* the current memory area */ + GMemArea *mem_areas; /* a list of all the mem areas owned by this chunk */ + GMemArea *free_mem_area; /* the free area...which is about to be destroyed */ + GFreeAtom *free_atoms; /* the free atoms list */ + GTree *mem_tree; /* tree of mem areas sorted by memory address */ + GMemChunk *next; /* pointer to the next chunk */ + GMemChunk *prev; /* pointer to the previous chunk */ +}; + + +static gulong old_mem_chunk_compute_size (gulong size, + gulong min_size) G_GNUC_CONST; +static gint old_mem_chunk_area_compare (GMemArea *a, + GMemArea *b); +static gint old_mem_chunk_area_search (GMemArea *a, + gchar *addr); + +/* here we can't use StaticMutexes, as they depend upon a working + * g_malloc, the same holds true for StaticPrivate + */ +static GMutex *mem_chunks_lock = NULL; +static GMemChunk *mem_chunks = NULL; + +void +old_mem_chunks_init (void) +{ + mem_chunks_lock = g_mutex_new (); +} + +GMemChunk* +old_mem_chunk_new (const gchar *name, + gint atom_size, + gulong area_size, + gint type) +{ + GMemChunk *mem_chunk; + gulong rarea_size; + + g_return_val_if_fail (atom_size > 0, NULL); + g_return_val_if_fail (area_size >= atom_size, NULL); + + ENTER_MEM_CHUNK_ROUTINE (); + + area_size = (area_size + atom_size - 1) / atom_size; + area_size *= atom_size; + + mem_chunk = g_new (GMemChunk, 1); + mem_chunk->name = name; + mem_chunk->type = type; + mem_chunk->num_mem_areas = 0; + mem_chunk->num_marked_areas = 0; + mem_chunk->mem_area = NULL; + mem_chunk->free_mem_area = NULL; + mem_chunk->free_atoms = NULL; + mem_chunk->mem_tree = NULL; + mem_chunk->mem_areas = NULL; + mem_chunk->atom_size = atom_size; + + if (mem_chunk->type == G_ALLOC_AND_FREE) + mem_chunk->mem_tree = g_tree_new ((GCompareFunc) old_mem_chunk_area_compare); + + if (mem_chunk->atom_size % G_MEM_ALIGN) + mem_chunk->atom_size += G_MEM_ALIGN - (mem_chunk->atom_size % G_MEM_ALIGN); + + rarea_size = area_size + sizeof (GMemArea) - MEM_AREA_SIZE; + rarea_size = old_mem_chunk_compute_size (rarea_size, atom_size + sizeof (GMemArea) - MEM_AREA_SIZE); + mem_chunk->area_size = rarea_size - (sizeof (GMemArea) - MEM_AREA_SIZE); + + g_mutex_lock (mem_chunks_lock); + mem_chunk->next = mem_chunks; + mem_chunk->prev = NULL; + if (mem_chunks) + mem_chunks->prev = mem_chunk; + mem_chunks = mem_chunk; + g_mutex_unlock (mem_chunks_lock); + + LEAVE_MEM_CHUNK_ROUTINE (); + + return mem_chunk; +} + +void +old_mem_chunk_destroy (GMemChunk *mem_chunk) +{ + GMemArea *mem_areas; + GMemArea *temp_area; + + g_return_if_fail (mem_chunk != NULL); + + ENTER_MEM_CHUNK_ROUTINE (); + + mem_areas = mem_chunk->mem_areas; + while (mem_areas) + { + temp_area = mem_areas; + mem_areas = mem_areas->next; + g_free (temp_area); + } + + g_mutex_lock (mem_chunks_lock); + if (mem_chunk->next) + mem_chunk->next->prev = mem_chunk->prev; + if (mem_chunk->prev) + mem_chunk->prev->next = mem_chunk->next; + + if (mem_chunk == mem_chunks) + mem_chunks = mem_chunks->next; + g_mutex_unlock (mem_chunks_lock); + + if (mem_chunk->type == G_ALLOC_AND_FREE) + g_tree_destroy (mem_chunk->mem_tree); + + g_free (mem_chunk); + + LEAVE_MEM_CHUNK_ROUTINE (); +} + +gpointer +old_mem_chunk_alloc (GMemChunk *mem_chunk) +{ + GMemArea *temp_area; + gpointer mem; + + ENTER_MEM_CHUNK_ROUTINE (); + + g_return_val_if_fail (mem_chunk != NULL, NULL); + + while (mem_chunk->free_atoms) + { + /* Get the first piece of memory on the "free_atoms" list. + * We can go ahead and destroy the list node we used to keep + * track of it with and to update the "free_atoms" list to + * point to its next element. + */ + mem = mem_chunk->free_atoms; + mem_chunk->free_atoms = mem_chunk->free_atoms->next; + + /* Determine which area this piece of memory is allocated from */ + temp_area = g_tree_search (mem_chunk->mem_tree, + (GCompareFunc) old_mem_chunk_area_search, + mem); + + /* If the area has been marked, then it is being destroyed. + * (ie marked to be destroyed). + * We check to see if all of the segments on the free list that + * reference this area have been removed. This occurs when + * the ammount of free memory is less than the allocatable size. + * If the chunk should be freed, then we place it in the "free_mem_area". + * This is so we make sure not to free the mem area here and then + * allocate it again a few lines down. + * If we don't allocate a chunk a few lines down then the "free_mem_area" + * will be freed. + * If there is already a "free_mem_area" then we'll just free this mem area. + */ + if (temp_area->mark) + { + /* Update the "free" memory available in that area */ + temp_area->free += mem_chunk->atom_size; + + if (temp_area->free == mem_chunk->area_size) + { + if (temp_area == mem_chunk->mem_area) + mem_chunk->mem_area = NULL; + + if (mem_chunk->free_mem_area) + { + mem_chunk->num_mem_areas -= 1; + + if (temp_area->next) + temp_area->next->prev = temp_area->prev; + if (temp_area->prev) + temp_area->prev->next = temp_area->next; + if (temp_area == mem_chunk->mem_areas) + mem_chunk->mem_areas = mem_chunk->mem_areas->next; + + if (mem_chunk->type == G_ALLOC_AND_FREE) + g_tree_remove (mem_chunk->mem_tree, temp_area); + g_free (temp_area); + } + else + mem_chunk->free_mem_area = temp_area; + + mem_chunk->num_marked_areas -= 1; + } + } + else + { + /* Update the number of allocated atoms count. + */ + temp_area->allocated += 1; + + /* The area wasn't marked...return the memory + */ + goto outa_here; + } + } + + /* If there isn't a current mem area or the current mem area is out of space + * then allocate a new mem area. We'll first check and see if we can use + * the "free_mem_area". Otherwise we'll just malloc the mem area. + */ + if ((!mem_chunk->mem_area) || + ((mem_chunk->mem_area->index + mem_chunk->atom_size) > mem_chunk->area_size)) + { + if (mem_chunk->free_mem_area) + { + mem_chunk->mem_area = mem_chunk->free_mem_area; + mem_chunk->free_mem_area = NULL; + } + else + { +#ifdef ENABLE_GC_FRIENDLY + mem_chunk->mem_area = (GMemArea*) g_malloc0 (sizeof (GMemArea) - + MEM_AREA_SIZE + + mem_chunk->area_size); +#else /* !ENABLE_GC_FRIENDLY */ + mem_chunk->mem_area = (GMemArea*) g_malloc (sizeof (GMemArea) - + MEM_AREA_SIZE + + mem_chunk->area_size); +#endif /* ENABLE_GC_FRIENDLY */ + + mem_chunk->num_mem_areas += 1; + mem_chunk->mem_area->next = mem_chunk->mem_areas; + mem_chunk->mem_area->prev = NULL; + + if (mem_chunk->mem_areas) + mem_chunk->mem_areas->prev = mem_chunk->mem_area; + mem_chunk->mem_areas = mem_chunk->mem_area; + + if (mem_chunk->type == G_ALLOC_AND_FREE) + g_tree_insert (mem_chunk->mem_tree, mem_chunk->mem_area, mem_chunk->mem_area); + } + + mem_chunk->mem_area->index = 0; + mem_chunk->mem_area->free = mem_chunk->area_size; + mem_chunk->mem_area->allocated = 0; + mem_chunk->mem_area->mark = 0; + } + + /* Get the memory and modify the state variables appropriately. + */ + mem = (gpointer) &mem_chunk->mem_area->mem[mem_chunk->mem_area->index]; + mem_chunk->mem_area->index += mem_chunk->atom_size; + mem_chunk->mem_area->free -= mem_chunk->atom_size; + mem_chunk->mem_area->allocated += 1; + + outa_here: + + LEAVE_MEM_CHUNK_ROUTINE (); + + return mem; +} + +gpointer +old_mem_chunk_alloc0 (GMemChunk *mem_chunk) +{ + gpointer mem; + + mem = old_mem_chunk_alloc (mem_chunk); + if (mem) + { + memset (mem, 0, mem_chunk->atom_size); + } + + return mem; +} + +void +old_mem_chunk_free (GMemChunk *mem_chunk, + gpointer mem) +{ + GMemArea *temp_area; + GFreeAtom *free_atom; + + g_return_if_fail (mem_chunk != NULL); + g_return_if_fail (mem != NULL); + + ENTER_MEM_CHUNK_ROUTINE (); + +#ifdef ENABLE_GC_FRIENDLY + memset (mem, 0, mem_chunk->atom_size); +#endif /* ENABLE_GC_FRIENDLY */ + + /* Don't do anything if this is an ALLOC_ONLY chunk + */ + if (mem_chunk->type == G_ALLOC_AND_FREE) + { + /* Place the memory on the "free_atoms" list + */ + free_atom = (GFreeAtom*) mem; + free_atom->next = mem_chunk->free_atoms; + mem_chunk->free_atoms = free_atom; + + temp_area = g_tree_search (mem_chunk->mem_tree, + (GCompareFunc) old_mem_chunk_area_search, + mem); + + temp_area->allocated -= 1; + + if (temp_area->allocated == 0) + { + temp_area->mark = 1; + mem_chunk->num_marked_areas += 1; + } + } + + LEAVE_MEM_CHUNK_ROUTINE (); +} + +/* This doesn't free the free_area if there is one */ +void +old_mem_chunk_clean (GMemChunk *mem_chunk) +{ + GMemArea *mem_area; + GFreeAtom *prev_free_atom; + GFreeAtom *temp_free_atom; + gpointer mem; + + g_return_if_fail (mem_chunk != NULL); + + ENTER_MEM_CHUNK_ROUTINE (); + + if (mem_chunk->type == G_ALLOC_AND_FREE) + { + prev_free_atom = NULL; + temp_free_atom = mem_chunk->free_atoms; + + while (temp_free_atom) + { + mem = (gpointer) temp_free_atom; + + mem_area = g_tree_search (mem_chunk->mem_tree, + (GCompareFunc) old_mem_chunk_area_search, + mem); + + /* If this mem area is marked for destruction then delete the + * area and list node and decrement the free mem. + */ + if (mem_area->mark) + { + if (prev_free_atom) + prev_free_atom->next = temp_free_atom->next; + else + mem_chunk->free_atoms = temp_free_atom->next; + temp_free_atom = temp_free_atom->next; + + mem_area->free += mem_chunk->atom_size; + if (mem_area->free == mem_chunk->area_size) + { + mem_chunk->num_mem_areas -= 1; + mem_chunk->num_marked_areas -= 1; + + if (mem_area->next) + mem_area->next->prev = mem_area->prev; + if (mem_area->prev) + mem_area->prev->next = mem_area->next; + if (mem_area == mem_chunk->mem_areas) + mem_chunk->mem_areas = mem_chunk->mem_areas->next; + if (mem_area == mem_chunk->mem_area) + mem_chunk->mem_area = NULL; + + if (mem_chunk->type == G_ALLOC_AND_FREE) + g_tree_remove (mem_chunk->mem_tree, mem_area); + g_free (mem_area); + } + } + else + { + prev_free_atom = temp_free_atom; + temp_free_atom = temp_free_atom->next; + } + } + } + LEAVE_MEM_CHUNK_ROUTINE (); +} + +void +old_mem_chunk_reset (GMemChunk *mem_chunk) +{ + GMemArea *mem_areas; + GMemArea *temp_area; + + g_return_if_fail (mem_chunk != NULL); + + ENTER_MEM_CHUNK_ROUTINE (); + + mem_areas = mem_chunk->mem_areas; + mem_chunk->num_mem_areas = 0; + mem_chunk->mem_areas = NULL; + mem_chunk->mem_area = NULL; + + while (mem_areas) + { + temp_area = mem_areas; + mem_areas = mem_areas->next; + g_free (temp_area); + } + + mem_chunk->free_atoms = NULL; + + if (mem_chunk->mem_tree) + { + g_tree_destroy (mem_chunk->mem_tree); + mem_chunk->mem_tree = g_tree_new ((GCompareFunc) old_mem_chunk_area_compare); + } + + LEAVE_MEM_CHUNK_ROUTINE (); +} + +void +old_mem_chunk_print (GMemChunk *mem_chunk) +{ + GMemArea *mem_areas; + gulong mem; + + g_return_if_fail (mem_chunk != NULL); + + mem_areas = mem_chunk->mem_areas; + mem = 0; + + while (mem_areas) + { + mem += mem_chunk->area_size - mem_areas->free; + mem_areas = mem_areas->next; + } + + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, + "%s: %ld bytes using %d mem areas", + mem_chunk->name, mem, mem_chunk->num_mem_areas); +} + +void +old_mem_chunk_info (void) +{ + GMemChunk *mem_chunk; + gint count; + + count = 0; + g_mutex_lock (mem_chunks_lock); + mem_chunk = mem_chunks; + while (mem_chunk) + { + count += 1; + mem_chunk = mem_chunk->next; + } + g_mutex_unlock (mem_chunks_lock); + + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "%d mem chunks", count); + + g_mutex_lock (mem_chunks_lock); + mem_chunk = mem_chunks; + g_mutex_unlock (mem_chunks_lock); + + while (mem_chunk) + { + old_mem_chunk_print ((GMemChunk*) mem_chunk); + mem_chunk = mem_chunk->next; + } +} + +static gulong +old_mem_chunk_compute_size (gulong size, + gulong min_size) +{ + gulong power_of_2; + gulong lower, upper; + + power_of_2 = 16; + while (power_of_2 < size) + power_of_2 <<= 1; + + lower = power_of_2 >> 1; + upper = power_of_2; + + if (size - lower < upper - size && lower >= min_size) + return lower; + else + return upper; +} + +static gint +old_mem_chunk_area_compare (GMemArea *a, + GMemArea *b) +{ + if (a->mem > b->mem) + return 1; + else if (a->mem < b->mem) + return -1; + return 0; +} + +static gint +old_mem_chunk_area_search (GMemArea *a, + gchar *addr) +{ + if (a->mem <= addr) + { + if (addr < &a->mem[a->index]) + return 0; + return 1; + } + return -1; +} diff --git a/tests/module-test.c b/tests/module-test.c new file mode 100644 index 0000000..9b95b0a --- /dev/null +++ b/tests/module-test.c @@ -0,0 +1,202 @@ +/* module-test.c - test program for GMODULE + * Copyright (C) 1998 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +gchar* global_state; + +G_MODULE_EXPORT void +g_clash_func (void) +{ + global_state = "global clash"; +} + +typedef void (*SimpleFunc) (void); +typedef void (*GModuleFunc) (GModule *); + +static gchar **gplugin_a_state; +static gchar **gplugin_b_state; + +static void +compare (const gchar *desc, const gchar *expected, const gchar *found) +{ + if (!expected && !found) + return; + + if (expected && found && strcmp (expected, found) == 0) + return; + + g_error ("error: %s state should have been \"%s\", but is \"%s\"", + desc, expected ? expected : "NULL", found ? found : "NULL"); +} + +static void +test_states (const gchar *global, const gchar *gplugin_a, + const gchar *gplugin_b) +{ + compare ("global", global, global_state); + compare ("Plugin A", gplugin_a, *gplugin_a_state); + compare ("Plugin B", gplugin_b, *gplugin_b_state); + + global_state = *gplugin_a_state = *gplugin_b_state = NULL; +} + +static SimpleFunc plugin_clash_func = NULL; + +int +main (int arg, + char *argv[]) +{ + GModule *module_self, *module_a, *module_b; + gchar *dir; + gchar *plugin_a, *plugin_b; + SimpleFunc f_a, f_b, f_self; + GModuleFunc gmod_f; + + if (!g_module_supported ()) + g_error ("dynamic modules not supported"); + + dir = g_get_current_dir (); + + plugin_a = g_strconcat (dir, G_DIR_SEPARATOR_S "libmoduletestplugin_a", + NULL); + plugin_b = g_strconcat (dir, G_DIR_SEPARATOR_S "libmoduletestplugin_b", + NULL); + + g_free (dir); + + /* module handles */ + + module_self = g_module_open (NULL, G_MODULE_BIND_LAZY); + if (!module_self) + g_error ("error: %s", g_module_error ()); + + if (!g_module_symbol (module_self, "g_module_close", (gpointer *) &f_self)) + g_error ("error: %s", g_module_error ()); + + module_a = g_module_open (plugin_a, G_MODULE_BIND_LAZY); + if (!module_a) + g_error ("error: %s", g_module_error ()); + + module_b = g_module_open (plugin_b, G_MODULE_BIND_LAZY); + if (!module_b) + g_error ("error: %s", g_module_error ()); + + /* get plugin state vars */ + + if (!g_module_symbol (module_a, "gplugin_a_state", + (gpointer *) &gplugin_a_state)) + g_error ("error: %s", g_module_error ()); + + if (!g_module_symbol (module_b, "gplugin_b_state", + (gpointer *) &gplugin_b_state)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, "check-init"); + + /* get plugin specific symbols and call them + */ + if (!g_module_symbol (module_a, "gplugin_a_func", (gpointer *) &f_a)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + if (!g_module_symbol (module_b, "gplugin_b_func", (gpointer *) &f_b)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + f_a (); + test_states (NULL, "Hello world", NULL); + + f_b (); + test_states (NULL, NULL, "Hello world"); + + /* get and call globally clashing functions + */ + + if (!g_module_symbol (module_self, "g_clash_func", (gpointer *) &f_self)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + if (!g_module_symbol (module_a, "g_clash_func", (gpointer *) &f_a)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + if (!g_module_symbol (module_b, "g_clash_func", (gpointer *) &f_b)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + f_self (); + test_states ("global clash", NULL, NULL); + + f_a (); + test_states (NULL, "global clash", NULL); + + f_b (); + test_states (NULL, NULL, "global clash"); + + /* get and call clashing plugin functions */ + + if (!g_module_symbol (module_a, "gplugin_clash_func", (gpointer *) &f_a)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + if (!g_module_symbol (module_b, "gplugin_clash_func", (gpointer *) &f_b)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + plugin_clash_func = f_a; + plugin_clash_func (); + test_states (NULL, "plugin clash", NULL); + + plugin_clash_func = f_b; + plugin_clash_func (); + test_states (NULL, NULL, "plugin clash"); + + /* call gmodule function from A */ + + if (!g_module_symbol (module_a, "gplugin_a_module_func", (gpointer *) &gmod_f)) + g_error ("error: %s", g_module_error ()); + test_states (NULL, NULL, NULL); + + gmod_f (module_b); + test_states (NULL, NULL, "BOOH"); + + gmod_f (module_a); + test_states (NULL, "BOOH", NULL); + + /* unload plugins */ + + if (!g_module_close (module_a)) + g_error ("error: %s", g_module_error ()); + + if (!g_module_close (module_b)) + g_error ("error: %s", g_module_error ()); + + return 0; +} diff --git a/tests/node-test.c b/tests/node-test.c new file mode 100644 index 0000000..a49eddf --- /dev/null +++ b/tests/node-test.c @@ -0,0 +1,223 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "glib.h" + +int array[10000]; +gboolean failed = FALSE; + +#define TEST(m,cond) G_STMT_START { failed = !(cond); \ +if (failed) \ + { if (!m) \ + g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \ + else \ + g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \ + exit(1); \ + } \ +} G_STMT_END + +#define C2P(c) ((gpointer) ((long) (c))) +#define P2C(p) ((gchar) ((long) (p))) + +#define GLIB_TEST_STRING "el dorado " +#define GLIB_TEST_STRING_5 "el do" + +typedef struct { + guint age; + gchar name[40]; +} GlibTestInfo; + +static gboolean +node_build_string (GNode *node, + gpointer data) +{ + gchar **p = data; + gchar *string; + gchar c[2] = "_"; + + c[0] = P2C (node->data); + + string = g_strconcat (*p ? *p : "", c, NULL); + g_free (*p); + *p = string; + + return FALSE; +} + +static void +g_node_test (void) +{ + GNode *root; + GNode *node; + GNode *node_B; + GNode *node_D; + GNode *node_F; + GNode *node_G; + GNode *node_J; + guint i; + gchar *tstring; + + failed = FALSE; + + root = g_node_new (C2P ('A')); + TEST (NULL, g_node_depth (root) == 1 && g_node_max_height (root) == 1); + + node_B = g_node_new (C2P ('B')); + g_node_append (root, node_B); + TEST (NULL, root->children == node_B); + + g_node_append_data (node_B, C2P ('E')); + g_node_prepend_data (node_B, C2P ('C')); + node_D = g_node_new (C2P ('D')); + g_node_insert (node_B, 1, node_D); + + node_F = g_node_new (C2P ('F')); + g_node_append (root, node_F); + TEST (NULL, root->children->next == node_F); + + node_G = g_node_new (C2P ('G')); + g_node_append (node_F, node_G); + node_J = g_node_new (C2P ('J')); + g_node_prepend (node_G, node_J); + g_node_insert (node_G, 42, g_node_new (C2P ('K'))); + g_node_insert_data (node_G, 0, C2P ('H')); + g_node_insert (node_G, 1, g_node_new (C2P ('I'))); + + TEST (NULL, g_node_depth (root) == 1); + TEST (NULL, g_node_max_height (root) == 4); + TEST (NULL, g_node_depth (node_G->children->next) == 4); + TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_LEAFS) == 7); + TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_NON_LEAFS) == 4); + TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 11); + TEST (NULL, g_node_max_height (node_F) == 3); + TEST (NULL, g_node_n_children (node_G) == 4); + TEST (NULL, g_node_find_child (root, G_TRAVERSE_ALL, C2P ('F')) == node_F); + TEST (NULL, g_node_find (root, G_LEVEL_ORDER, G_TRAVERSE_NON_LEAFS, C2P ('I')) == NULL); + TEST (NULL, g_node_find (root, G_IN_ORDER, G_TRAVERSE_LEAFS, C2P ('J')) == node_J); + + for (i = 0; i < g_node_n_children (node_B); i++) + { + node = g_node_nth_child (node_B, i); + TEST (NULL, P2C (node->data) == ('C' + i)); + } + + for (i = 0; i < g_node_n_children (node_G); i++) + TEST (NULL, g_node_child_position (node_G, g_node_nth_child (node_G, i)) == i); + + /* we have built: A + * / \ + * B F + * / | \ \ + * C D E G + * / /\ \ + * H I J K + * + * for in-order traversal, 'G' is considered to be the "left" + * child of 'F', which will cause 'F' to be the last node visited. + */ + + tstring = NULL; + g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "ABCDEFGHIJK") == 0); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_POST_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "CDEBHIJKGFA") == 0); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "CBDEAHGIJKF") == 0); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "ABFCDEGHIJK") == 0); + g_free (tstring); tstring = NULL; + + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_LEAFS, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "CDEHIJK") == 0); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_NON_LEAFS, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "ABFG") == 0); + g_free (tstring); tstring = NULL; + + g_node_reverse_children (node_B); + g_node_reverse_children (node_G); + + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0); + g_free (tstring); tstring = NULL; + + g_node_append (node_D, g_node_new (C2P ('L'))); + g_node_append (node_D, g_node_new (C2P ('M'))); + + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + TEST (tstring, strcmp (tstring, "ABFEDCGLMKJIH") == 0); + g_free (tstring); tstring = NULL; + + g_node_destroy (root); + + /* allocation tests */ + + root = g_node_new (NULL); + node = root; + + for (i = 0; i < 2048; i++) + { + g_node_append (node, g_node_new (NULL)); + if ((i%5) == 4) + node = node->children->next; + } + TEST (NULL, g_node_max_height (root) > 100); + TEST (NULL, g_node_n_nodes (root, G_TRAVERSE_ALL) == 1 + 2048); + + g_node_destroy (root); + + if (failed) + exit(1); +} + + +int +main (int argc, + char *argv[]) +{ + g_node_test (); + + return 0; +} + diff --git a/tests/onceinit.c b/tests/onceinit.c new file mode 100644 index 0000000..372eb2f --- /dev/null +++ b/tests/onceinit.c @@ -0,0 +1,274 @@ +/* g_once_init_*() test + * Copyright (C) 2007 Tim Janik + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + + * This work 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. + + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#include +#include + +#define N_THREADS (13) + +static GMutex *tmutex = NULL; +static GCond *tcond = NULL; +static volatile int thread_call_count = 0; +static char dummy_value = 'x'; + +static void +assert_singleton_execution1 (void) +{ + static volatile int seen_execution = 0; + int old_seen_execution = g_atomic_int_exchange_and_add (&seen_execution, 1); + if (old_seen_execution != 0) + g_error ("%s: function executed more than once", G_STRFUNC); +} + +static void +assert_singleton_execution2 (void) +{ + static volatile int seen_execution = 0; + int old_seen_execution = g_atomic_int_exchange_and_add (&seen_execution, 1); + if (old_seen_execution != 0) + g_error ("%s: function executed more than once", G_STRFUNC); +} + +static void +assert_singleton_execution3 (void) +{ + static volatile int seen_execution = 0; + int old_seen_execution = g_atomic_int_exchange_and_add (&seen_execution, 1); + if (old_seen_execution != 0) + g_error ("%s: function executed more than once", G_STRFUNC); +} + +static void +initializer1 (void) +{ + static volatile gsize initialized = 0; + if (g_once_init_enter (&initialized)) + { + gsize initval = 42; + assert_singleton_execution1(); + g_once_init_leave (&initialized, initval); + } +} + +static gpointer +initializer2 (void) +{ + static volatile gsize initialized = 0; + if (g_once_init_enter (&initialized)) + { + void *pointer_value = &dummy_value; + assert_singleton_execution2(); + g_once_init_leave (&initialized, (gsize) pointer_value); + } + return (void*) initialized; +} + +static void +initializer3 (void) +{ + static volatile gsize initialized = 0; + if (g_once_init_enter (&initialized)) + { + gsize initval = 42; + assert_singleton_execution3(); + g_usleep (25 * 1000); /* waste time for multiple threads to wait */ + g_once_init_leave (&initialized, initval); + } +} + +static gpointer +tmain_call_initializer3 (gpointer user_data) +{ + g_mutex_lock (tmutex); + g_cond_wait (tcond, tmutex); + g_mutex_unlock (tmutex); + //g_printf ("["); + initializer3(); + //g_printf ("]\n"); + g_atomic_int_exchange_and_add (&thread_call_count, 1); + return NULL; +} + +static void* stress_concurrent_initializers (void*); + +int +main (int argc, + char *argv[]) +{ + GThread *threads[N_THREADS]; + int i; + /* test simple initializer */ + initializer1(); + initializer1(); + /* test pointer initializer */ + void *p = initializer2(); + g_assert (p == &dummy_value); + p = initializer2(); + g_assert (p == &dummy_value); + /* setup threads */ + g_thread_init (NULL); + tmutex = g_mutex_new (); + tcond = g_cond_new (); + /* start multiple threads for initializer3() */ + g_mutex_lock (tmutex); + for (i = 0; i < N_THREADS; i++) + threads[i] = g_thread_create (tmain_call_initializer3, 0, FALSE, NULL); + g_mutex_unlock (tmutex); + /* concurrently call initializer3() */ + g_cond_broadcast (tcond); + /* loop until all threads passed the call to initializer3() */ + while (g_atomic_int_get (&thread_call_count) < i) + { + if (rand() % 2) + g_thread_yield(); /* concurrent shuffling for single core */ + else + g_usleep (1000); /* concurrent shuffling for multi core */ + g_cond_broadcast (tcond); + } + /* call multiple (unoptimized) initializers from multiple threads */ + g_mutex_lock (tmutex); + g_atomic_int_set (&thread_call_count, 0); + for (i = 0; i < N_THREADS; i++) + g_thread_create (stress_concurrent_initializers, 0, FALSE, NULL); + g_mutex_unlock (tmutex); + while (g_atomic_int_get (&thread_call_count) < 256 * 4 * N_THREADS) + g_usleep (50 * 1000); /* wait for all 5 threads to complete */ + return 0; +} + +/* get rid of g_once_init_enter-optimizations in the below definitions + * to uncover possible races in the g_once_init_enter_impl()/ + * g_once_init_leave() implementations + */ +#define g_once_init_enter g_once_init_enter_impl + +/* define 16 * 16 simple initializers */ +#define DEFINE_TEST_INITIALIZER(N) \ + static void \ + test_initializer_##N (void) \ + { \ + static volatile gsize initialized = 0; \ + if (g_once_init_enter (&initialized)) \ + { \ + g_free (g_strdup_printf ("cpuhog%5d", 1)); \ + g_free (g_strdup_printf ("cpuhog%6d", 2)); \ + g_free (g_strdup_printf ("cpuhog%7d", 3)); \ + g_once_init_leave (&initialized, 1); \ + } \ + } +#define DEFINE_16_TEST_INITIALIZERS(P) \ + DEFINE_TEST_INITIALIZER (P##0) \ + DEFINE_TEST_INITIALIZER (P##1) \ + DEFINE_TEST_INITIALIZER (P##2) \ + DEFINE_TEST_INITIALIZER (P##3) \ + DEFINE_TEST_INITIALIZER (P##4) \ + DEFINE_TEST_INITIALIZER (P##5) \ + DEFINE_TEST_INITIALIZER (P##6) \ + DEFINE_TEST_INITIALIZER (P##7) \ + DEFINE_TEST_INITIALIZER (P##8) \ + DEFINE_TEST_INITIALIZER (P##9) \ + DEFINE_TEST_INITIALIZER (P##a) \ + DEFINE_TEST_INITIALIZER (P##b) \ + DEFINE_TEST_INITIALIZER (P##c) \ + DEFINE_TEST_INITIALIZER (P##d) \ + DEFINE_TEST_INITIALIZER (P##e) \ + DEFINE_TEST_INITIALIZER (P##f) +#define DEFINE_256_TEST_INITIALIZERS(P) \ + DEFINE_16_TEST_INITIALIZERS (P##_0) \ + DEFINE_16_TEST_INITIALIZERS (P##_1) \ + DEFINE_16_TEST_INITIALIZERS (P##_2) \ + DEFINE_16_TEST_INITIALIZERS (P##_3) \ + DEFINE_16_TEST_INITIALIZERS (P##_4) \ + DEFINE_16_TEST_INITIALIZERS (P##_5) \ + DEFINE_16_TEST_INITIALIZERS (P##_6) \ + DEFINE_16_TEST_INITIALIZERS (P##_7) \ + DEFINE_16_TEST_INITIALIZERS (P##_8) \ + DEFINE_16_TEST_INITIALIZERS (P##_9) \ + DEFINE_16_TEST_INITIALIZERS (P##_a) \ + DEFINE_16_TEST_INITIALIZERS (P##_b) \ + DEFINE_16_TEST_INITIALIZERS (P##_c) \ + DEFINE_16_TEST_INITIALIZERS (P##_d) \ + DEFINE_16_TEST_INITIALIZERS (P##_e) \ + DEFINE_16_TEST_INITIALIZERS (P##_f) + +/* list 16 * 16 simple initializers */ +#define LIST_16_TEST_INITIALIZERS(P) \ + test_initializer_##P##0, \ + test_initializer_##P##1, \ + test_initializer_##P##2, \ + test_initializer_##P##3, \ + test_initializer_##P##4, \ + test_initializer_##P##5, \ + test_initializer_##P##6, \ + test_initializer_##P##7, \ + test_initializer_##P##8, \ + test_initializer_##P##9, \ + test_initializer_##P##a, \ + test_initializer_##P##b, \ + test_initializer_##P##c, \ + test_initializer_##P##d, \ + test_initializer_##P##e, \ + test_initializer_##P##f +#define LIST_256_TEST_INITIALIZERS(P) \ + LIST_16_TEST_INITIALIZERS (P##_0), \ + LIST_16_TEST_INITIALIZERS (P##_1), \ + LIST_16_TEST_INITIALIZERS (P##_2), \ + LIST_16_TEST_INITIALIZERS (P##_3), \ + LIST_16_TEST_INITIALIZERS (P##_4), \ + LIST_16_TEST_INITIALIZERS (P##_5), \ + LIST_16_TEST_INITIALIZERS (P##_6), \ + LIST_16_TEST_INITIALIZERS (P##_7), \ + LIST_16_TEST_INITIALIZERS (P##_8), \ + LIST_16_TEST_INITIALIZERS (P##_9), \ + LIST_16_TEST_INITIALIZERS (P##_a), \ + LIST_16_TEST_INITIALIZERS (P##_b), \ + LIST_16_TEST_INITIALIZERS (P##_c), \ + LIST_16_TEST_INITIALIZERS (P##_d), \ + LIST_16_TEST_INITIALIZERS (P##_e), \ + LIST_16_TEST_INITIALIZERS (P##_f) + +/* define 4 * 256 initializers */ +DEFINE_256_TEST_INITIALIZERS (stress1); +DEFINE_256_TEST_INITIALIZERS (stress2); +DEFINE_256_TEST_INITIALIZERS (stress3); +DEFINE_256_TEST_INITIALIZERS (stress4); + +/* call the above 1024 initializers */ +static void* +stress_concurrent_initializers (void *user_data) +{ + static void (*initializers[]) (void) = { + LIST_256_TEST_INITIALIZERS (stress1), + LIST_256_TEST_INITIALIZERS (stress2), + LIST_256_TEST_INITIALIZERS (stress3), + LIST_256_TEST_INITIALIZERS (stress4), + }; + int i; + /* sync to main thread */ + g_mutex_lock (tmutex); + g_mutex_unlock (tmutex); + /* initialize concurrently */ + for (i = 0; i < G_N_ELEMENTS (initializers); i++) + { + initializers[i](); + g_atomic_int_exchange_and_add (&thread_call_count, 1); + } + return NULL; +} diff --git a/tests/patterntest.c b/tests/patterntest.c new file mode 100644 index 0000000..2625438 --- /dev/null +++ b/tests/patterntest.c @@ -0,0 +1,308 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2001 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +static gboolean noisy = FALSE; + +static void +verbose (const gchar *format, ...) +{ + gchar *msg; + va_list args; + + va_start (args, format); + msg = g_strdup_vprintf (format, args); + va_end (args); + + if (noisy) + g_print (msg); + g_free (msg); +} + +/* keep enum and structure of gpattern.c and patterntest.c in sync */ +typedef enum +{ + G_MATCH_ALL, /* "*A?A*" */ + G_MATCH_ALL_TAIL, /* "*A?AA" */ + G_MATCH_HEAD, /* "AAAA*" */ + G_MATCH_TAIL, /* "*AAAA" */ + G_MATCH_EXACT, /* "AAAAA" */ + G_MATCH_LAST +} GMatchType; + +struct _GPatternSpec +{ + GMatchType match_type; + guint pattern_length; + guint min_length; + guint max_length; + gchar *pattern; +}; + + +static gchar * +match_type_name (GMatchType match_type) +{ + switch (match_type) + { + case G_MATCH_ALL: + return "G_MATCH_ALL"; + break; + case G_MATCH_ALL_TAIL: + return "G_MATCH_ALL_TAIL"; + break; + case G_MATCH_HEAD: + return "G_MATCH_HEAD"; + break; + case G_MATCH_TAIL: + return "G_MATCH_TAIL"; + break; + case G_MATCH_EXACT: + return "G_MATCH_EXACT"; + break; + default: + return "unknown GMatchType"; + break; + } +} + +static gboolean +test_compilation (gchar *src, + GMatchType match_type, + gchar *pattern, + guint min) +{ + GPatternSpec *spec; + + verbose ("compiling \"%s\" \t", src); + spec = g_pattern_spec_new (src); + + if (spec->match_type != match_type) + { + g_print ("failed \t(match_type: %s, expected %s)\n", + match_type_name (spec->match_type), + match_type_name (match_type)); + g_pattern_spec_free (spec); + return FALSE; + } + + if (strcmp (spec->pattern, pattern) != 0) + { + g_print ("failed \t(pattern: \"%s\", expected \"%s\")\n", + spec->pattern, + pattern); + g_pattern_spec_free (spec); + return FALSE; + } + + if (spec->pattern_length != strlen (spec->pattern)) + { + g_print ("failed \t(pattern_length: %d, expected %d)\n", + spec->pattern_length, + (gint)strlen (spec->pattern)); + g_pattern_spec_free (spec); + return FALSE; + } + + if (spec->min_length != min) + { + g_print ("failed \t(min_length: %d, expected %d)\n", + spec->min_length, + min); + g_pattern_spec_free (spec); + return FALSE; + } + + verbose ("passed (%s: \"%s\")\n", + match_type_name (spec->match_type), + spec->pattern); + + g_pattern_spec_free (spec); + + return TRUE; +} + +static gboolean +test_match (gchar *pattern, + gchar *string, + gboolean match) +{ + verbose ("matching \"%s\" against \"%s\" \t", string, pattern); + + if (g_pattern_match_simple (pattern, string) != match) + { + g_print ("failed \t(unexpected %s)\n", (match ? "mismatch" : "match")); + return FALSE; + } + + verbose ("passed (%s)\n", match ? "match" : "nomatch"); + + return TRUE; +} + +static gboolean +test_equal (gchar *pattern1, + gchar *pattern2, + gboolean expected) +{ + GPatternSpec *p1 = g_pattern_spec_new (pattern1); + GPatternSpec *p2 = g_pattern_spec_new (pattern2); + gboolean equal = g_pattern_spec_equal (p1, p2); + + verbose ("comparing \"%s\" with \"%s\" \t", pattern1, pattern2); + + if (expected != equal) + { + g_print ("failed \t{%s, %u, \"%s\"} %s {%s, %u, \"%s\"}\n", + match_type_name (p1->match_type), p1->pattern_length, p1->pattern, + expected ? "!=" : "==", + match_type_name (p2->match_type), p2->pattern_length, p2->pattern); + } + else + verbose ("passed (%s)\n", equal ? "equal" : "unequal"); + + g_pattern_spec_free (p1); + g_pattern_spec_free (p2); + + return expected == equal; +} + +#define TEST_COMPILATION(src, type, pattern, min) { \ + total++; \ + if (test_compilation (src, type, pattern, min)) \ + passed++; \ + else \ + failed++; \ +} + +#define TEST_MATCH(pattern, string, match) { \ + total++; \ + if (test_match (pattern, string, match)) \ + passed++; \ + else \ + failed++; \ +} + +#define TEST_EQUAL(pattern1, pattern2, match) { \ + total++; \ + if (test_equal (pattern1, pattern2, match)) \ + passed++; \ + else \ + failed++; \ +} + +int +main (int argc, char** argv) +{ + gint total = 0; + gint passed = 0; + gint failed = 0; + gint i; + + for (i = 1; i < argc; i++) + if (strcmp ("--noisy", argv[i]) == 0) + noisy = TRUE; + + TEST_COMPILATION("*A?B*", G_MATCH_ALL, "*A?B*", 3); + TEST_COMPILATION("ABC*DEFGH", G_MATCH_ALL_TAIL, "HGFED*CBA", 8); + TEST_COMPILATION("ABCDEF*GH", G_MATCH_ALL, "ABCDEF*GH", 8); + TEST_COMPILATION("ABC**?***??**DEF*GH", G_MATCH_ALL, "ABC*???DEF*GH", 11); + TEST_COMPILATION("*A?AA", G_MATCH_ALL_TAIL, "AA?A*", 4); + TEST_COMPILATION("ABCD*", G_MATCH_HEAD, "ABCD", 4); + TEST_COMPILATION("*ABCD", G_MATCH_TAIL, "ABCD", 4); + TEST_COMPILATION("ABCDE", G_MATCH_EXACT, "ABCDE", 5); + TEST_COMPILATION("A?C?E", G_MATCH_ALL, "A?C?E", 5); + TEST_COMPILATION("*?x", G_MATCH_ALL_TAIL, "x?*", 2); + TEST_COMPILATION("?*x", G_MATCH_ALL_TAIL, "x?*", 2); + TEST_COMPILATION("*?*x", G_MATCH_ALL_TAIL, "x?*", 2); + TEST_COMPILATION("x*??", G_MATCH_ALL_TAIL, "??*x", 3); + + TEST_EQUAL("*A?B*", "*A?B*", TRUE); + TEST_EQUAL("A*BCD", "A*BCD", TRUE); + TEST_EQUAL("ABCD*", "ABCD****", TRUE); + TEST_EQUAL("A1*", "A1*", TRUE); + TEST_EQUAL("*YZ", "*YZ", TRUE); + TEST_EQUAL("A1x", "A1x", TRUE); + TEST_EQUAL("AB*CD", "AB**CD", TRUE); + TEST_EQUAL("AB*?*CD", "AB*?CD", TRUE); + TEST_EQUAL("AB*?CD", "AB?*CD", TRUE); + TEST_EQUAL("AB*CD", "AB*?*CD", FALSE); + TEST_EQUAL("ABC*", "ABC?", FALSE); + + TEST_MATCH("*x", "x", TRUE); + TEST_MATCH("*x", "xx", TRUE); + TEST_MATCH("*x", "yyyx", TRUE); + TEST_MATCH("*x", "yyxy", FALSE); + TEST_MATCH("?x", "x", FALSE); + TEST_MATCH("?x", "xx", TRUE); + TEST_MATCH("?x", "yyyx", FALSE); + TEST_MATCH("?x", "yyxy", FALSE); + TEST_MATCH("*?x", "xx", TRUE); + TEST_MATCH("?*x", "xx", TRUE); + TEST_MATCH("*?x", "x", FALSE); + TEST_MATCH("?*x", "x", FALSE); + TEST_MATCH("*?*x", "yx", TRUE); + TEST_MATCH("*?*x", "xxxx", TRUE); + TEST_MATCH("x*??", "xyzw", TRUE); + TEST_MATCH("*x", "\xc3\x84x", TRUE); + TEST_MATCH("?x", "\xc3\x84x", TRUE); + TEST_MATCH("??x", "\xc3\x84x", FALSE); + TEST_MATCH("ab\xc3\xa4\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE); + TEST_MATCH("ab\xc3\xa4\xc3\xb6", "abao", FALSE); + TEST_MATCH("ab?\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE); + TEST_MATCH("ab?\xc3\xb6", "abao", FALSE); + TEST_MATCH("ab\xc3\xa4?", "ab\xc3\xa4\xc3\xb6", TRUE); + TEST_MATCH("ab\xc3\xa4?", "abao", FALSE); + TEST_MATCH("ab??", "ab\xc3\xa4\xc3\xb6", TRUE); + TEST_MATCH("ab*", "ab\xc3\xa4\xc3\xb6", TRUE); + TEST_MATCH("ab*\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE); + TEST_MATCH("ab*\xc3\xb6", "aba\xc3\xb6x\xc3\xb6", TRUE); + TEST_MATCH("", "abc", FALSE); + + TEST_MATCH("", "", TRUE); + TEST_MATCH("abc", "abc", TRUE); + TEST_MATCH("*fo1*bar", "yyyfoxfo1bar", TRUE); + TEST_MATCH("12*fo1g*bar", "12yyyfoxfo1gbar", TRUE); + TEST_MATCH("__________:*fo1g*bar", "__________:yyyfoxfo1gbar", TRUE); + TEST_MATCH("*abc*cde", "abcde", FALSE); + TEST_MATCH("*abc*cde", "abccde", TRUE); + TEST_MATCH("*abc*cde", "abcxcde", TRUE); + TEST_MATCH("*abc*?cde", "abccde", FALSE); + TEST_MATCH("*abc*?cde", "abcxcde", TRUE); + TEST_MATCH("*abc*def", "abababcdededef", TRUE); + TEST_MATCH("*abc*def", "abcbcbcdededef", TRUE); + TEST_MATCH("*acbc*def", "acbcbcbcdededef", TRUE); + TEST_MATCH("*a?bc*def", "acbcbcbcdededef", TRUE); + TEST_MATCH("*abc*def", "bcbcbcdefdef", FALSE); + TEST_MATCH("*abc*def*ghi", "abcbcbcbcbcbcdefefdefdefghi", TRUE); + TEST_MATCH("*abc*def*ghi", "bcbcbcbcbcbcdefdefdefdefghi", FALSE); + TEST_MATCH("_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_*abc*def*ghi", "_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_abcbcbcbcbcbcdefefdefdefghi", TRUE); + TEST_MATCH("fooooooo*a*bc", "fooooooo_a_bd_a_bc", TRUE); + + verbose ("\n%u tests passed, %u failed\n", passed, failed); + + return failed; +} + + diff --git a/tests/qsort-test.c b/tests/qsort-test.c new file mode 100644 index 0000000..2befa2e --- /dev/null +++ b/tests/qsort-test.c @@ -0,0 +1,33 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#define SIZE 100000 + +guint32 array[SIZE]; + +static gint +sort (gconstpointer a, gconstpointer b, gpointer user_data) +{ + return *(guint32*)a < *(guint32*)b ? -1 : 1; +} + +int +main () +{ + int i; + + for (i = 0; i < SIZE; i++) + array[i] = g_random_int (); + + g_qsort_with_data (array, SIZE, sizeof (guint32), sort, NULL); + + for (i = 0; i < SIZE - 1; i++) + g_assert (array[i] <= array[i+1]); + + /* 0 elemenents is a valid case */ + g_qsort_with_data (array, 0, sizeof (guint32), sort, NULL); + + return 0; +} diff --git a/tests/queue-test.c b/tests/queue-test.c new file mode 100644 index 0000000..448e8bd --- /dev/null +++ b/tests/queue-test.c @@ -0,0 +1,962 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +#include + + +static gboolean verbose = FALSE; + + +static void +check_integrity (GQueue *queue) +{ + GList *list; + GList *last; + GList *links; + GList *link; + gint n; + + g_assert (queue->length < 4000000000u); + + g_assert (g_queue_get_length (queue) == queue->length); + + if (!queue->head) + g_assert (!queue->tail); + if (!queue->tail) + g_assert (!queue->head); + + n = 0; + last = NULL; + for (list = queue->head; list != NULL; list = list->next) + { + if (!list->next) + last = list; + ++n; + } + g_assert (n == queue->length); + g_assert (last == queue->tail); + + n = 0; + last = NULL; + for (list = queue->tail; list != NULL; list = list->prev) + { + if (!list->prev) + last = list; + ++n; + } + g_assert (n == queue->length); + g_assert (last == queue->head); + + links = NULL; + for (list = queue->head; list != NULL; list = list->next) + links = g_list_prepend (links, list); + + link = links; + for (list = queue->tail; list != NULL; list = list->prev) + { + g_assert (list == link->data); + link = link->next; + } + g_list_free (links); + + links = NULL; + for (list = queue->tail; list != NULL; list = list->prev) + links = g_list_prepend (links, list); + + link = links; + for (list = queue->head; list != NULL; list = list->next) + { + g_assert (list == link->data); + link = link->next; + } + g_list_free (links); +} + +static gboolean +rnd_bool (void) +{ + return g_random_int_range (0, 2); +} + +static void +check_max (gpointer elm, gpointer user_data) +{ + gint *best = user_data; + gint element = GPOINTER_TO_INT (elm); + + if (element > *best) + *best = element; +} + +static void +check_min (gpointer elm, gpointer user_data) +{ + gint *best = user_data; + gint element = GPOINTER_TO_INT (elm); + + if (element < *best) + *best = element; +} + +static gint +find_min (GQueue *queue) +{ + gint min = G_MAXINT; + + g_queue_foreach (queue, check_min, &min); + + return min; +} + +static gint +find_max (GQueue *queue) +{ + gint max = G_MININT; + + g_queue_foreach (queue, check_max, &max); + + return max; +} + +static void +delete_elm (gpointer elm, gpointer user_data) +{ + g_queue_remove ((GQueue *)user_data, elm); + check_integrity ((GQueue *)user_data); +} + +static void +delete_all (GQueue *queue) +{ + g_queue_foreach (queue, delete_elm, queue); +} + +static int +compare_int (gconstpointer a, gconstpointer b, gpointer data) +{ + int ai = GPOINTER_TO_INT (a); + int bi = GPOINTER_TO_INT (b); + + if (ai > bi) + return 1; + else if (ai == bi) + return 0; + else + return -1; +} + +static gint +get_random_position (GQueue *queue, gboolean allow_offlist) +{ + int n; + enum { OFF_QUEUE, HEAD, TAIL, MIDDLE, LAST } where; + + if (allow_offlist) + where = g_random_int_range (OFF_QUEUE, LAST); + else + where = g_random_int_range (HEAD, LAST); + + switch (where) + { + case OFF_QUEUE: + n = g_random_int (); + break; + + case HEAD: + n = 0; + break; + + case TAIL: + if (allow_offlist) + n = queue->length; + else + n = queue->length - 1; + break; + + case MIDDLE: + if (queue->length == 0) + n = 0; + else + n = g_random_int_range (0, queue->length); + break; + + default: + g_assert_not_reached(); + n = 100; + break; + + } + + return n; +} + +static void +random_test (int seed) +{ + typedef enum { + IS_EMPTY, GET_LENGTH, REVERSE, COPY, + FOREACH, FIND, FIND_CUSTOM, SORT, + PUSH_HEAD, PUSH_TAIL, PUSH_NTH, POP_HEAD, + POP_TAIL, POP_NTH, PEEK_HEAD, PEEK_TAIL, + PEEK_NTH, INDEX, REMOVE, REMOVE_ALL, + INSERT_BEFORE, INSERT_AFTER, INSERT_SORTED, PUSH_HEAD_LINK, + PUSH_TAIL_LINK, PUSH_NTH_LINK, POP_HEAD_LINK, POP_TAIL_LINK, + POP_NTH_LINK, PEEK_HEAD_LINK, PEEK_TAIL_LINK, PEEK_NTH_LINK, + LINK_INDEX, UNLINK, DELETE_LINK, LAST_OP + } QueueOp; + +#define N_ITERATIONS 500000 +#define N_QUEUES 3 + +#define RANDOM_QUEUE() &(queues[g_random_int_range(0, N_QUEUES)]) + + typedef struct QueueInfo QueueInfo; + struct QueueInfo + { + GQueue *queue; + GList *tail; + GList *head; + guint length; + }; + + gint i; + QueueOp op; + QueueInfo queues[N_QUEUES]; + + if (verbose) + g_print ("seed: %d\n", seed); + + g_random_set_seed (seed); + + for (i = 0; i < N_QUEUES; ++i) + { + queues[i].queue = g_queue_new (); + queues[i].head = NULL; + queues[i].tail = NULL; + queues[i].length = 0; + } + + for (i = 0; i < N_ITERATIONS; ++i) + { + int j; + QueueInfo *qinf = RANDOM_QUEUE(); + GQueue *q = qinf->queue; + op = g_random_int_range (IS_EMPTY, LAST_OP); + + g_assert (qinf->head == q->head); + g_assert (qinf->tail == q->tail); + g_assert (qinf->length == q->length); + + switch (op) + { + case IS_EMPTY: + { + if (g_queue_is_empty (qinf->queue)) + { + g_assert (q->head == NULL); + g_assert (q->tail == NULL); + g_assert (q->length == 0); + } + else + { + g_assert (q->head); + g_assert (q->tail); + g_assert (q->length > 0); + } + } + break; + case GET_LENGTH: + { + int l; + + l = g_queue_get_length (q); + + g_assert (qinf->length == q->length); + g_assert (qinf->length == l); + } + break; + case REVERSE: + g_queue_reverse (q); + g_assert (qinf->tail == q->head); + g_assert (qinf->head == q->tail); + g_assert (qinf->length == q->length); + qinf->tail = q->tail; + qinf->head = q->head; + break; + case COPY: + { + QueueInfo *random_queue = RANDOM_QUEUE(); + GQueue *new_queue = g_queue_copy (random_queue->queue); + + g_queue_free (qinf->queue); + q = qinf->queue = new_queue; + qinf->head = new_queue->head; + qinf->tail = g_list_last (new_queue->head); + qinf->length = new_queue->length; + } + break; + case FOREACH: + delete_all (q); + qinf->head = NULL; + qinf->tail = NULL; + qinf->length = 0; + break; + case FIND: + { + gboolean find_existing = rnd_bool (); + int first = find_max (q); + int second = find_min (q); + + if (q->length == 0) + find_existing = FALSE; + + if (!find_existing) + first++; + if (!find_existing) + second--; + + if (find_existing) + { + g_assert (g_queue_find (q, GINT_TO_POINTER (first))); + g_assert (g_queue_find (q, GINT_TO_POINTER (second))); + } + else + { + g_assert (!g_queue_find (q, GINT_TO_POINTER (first))); + g_assert (!g_queue_find (q, GINT_TO_POINTER (second))); + } + } + break; + case FIND_CUSTOM: + break; + case SORT: + { + if (!g_queue_is_empty (q)) + { + int max = find_max (q); + int min = find_min (q); + g_queue_remove_all (q, GINT_TO_POINTER (max)); + check_integrity (q); + g_queue_remove_all (q, GINT_TO_POINTER (min)); + check_integrity (q); + g_queue_push_head (q, GINT_TO_POINTER (max)); + if (max != min) + g_queue_push_head (q, GINT_TO_POINTER (min)); + qinf->length = q->length; + } + + check_integrity (q); + + g_queue_sort (q, compare_int, NULL); + + check_integrity (q); + + qinf->head = g_queue_find (q, GINT_TO_POINTER (find_min(q))); + qinf->tail = g_queue_find (q, GINT_TO_POINTER (find_max(q))); + + g_assert (qinf->tail == q->tail); + } + break; + case PUSH_HEAD: + { + int x = g_random_int_range (0, 435435); + g_queue_push_head (q, GINT_TO_POINTER (x)); + if (!qinf->head) + qinf->tail = qinf->head = q->head; + else + qinf->head = qinf->head->prev; + qinf->length++; + } + break; + case PUSH_TAIL: + { + int x = g_random_int_range (0, 236546); + g_queue_push_tail (q, GINT_TO_POINTER (x)); + if (!qinf->tail) + qinf->tail = qinf->head = q->head; + else + qinf->tail = qinf->tail->next; + qinf->length++; + } + break; + case PUSH_NTH: + { + int pos = get_random_position (q, TRUE); + int x = g_random_int_range (0, 236546); + g_queue_push_nth (q, GINT_TO_POINTER (x), pos); + if (qinf->head && qinf->head->prev) + qinf->head = qinf->head->prev; + else + qinf->head = q->head; + if (qinf->tail && qinf->tail->next) + qinf->tail = qinf->tail->next; + else + qinf->tail = g_list_last (qinf->head); + qinf->length++; + } + break; + case POP_HEAD: + if (qinf->head) + qinf->head = qinf->head->next; + if (!qinf->head) + qinf->tail = NULL; + qinf->length = (qinf->length == 0)? 0 : qinf->length - 1; + g_queue_pop_head (q); + break; + case POP_TAIL: + if (qinf->tail) + qinf->tail = qinf->tail->prev; + if (!qinf->tail) + qinf->head = NULL; + qinf->length = (qinf->length == 0)? 0 : qinf->length - 1; + g_queue_pop_tail (q); + break; + case POP_NTH: + if (!g_queue_is_empty (q)) + { + int n = get_random_position (q, TRUE); + gpointer elm = g_queue_peek_nth (q, n); + + if (n == q->length - 1) + qinf->tail = qinf->tail->prev; + + if (n == 0) + qinf->head = qinf->head->next; + + if (n >= 0 && n < q->length) + qinf->length--; + + g_assert (elm == g_queue_pop_nth (q, n)); + } + break; + case PEEK_HEAD: + if (qinf->head) + g_assert (qinf->head->data == g_queue_peek_head (q)); + else + g_assert (g_queue_peek_head (q) == NULL); + break; + case PEEK_TAIL: + if (qinf->head) + g_assert (qinf->tail->data == g_queue_peek_tail (q)); + else + g_assert (g_queue_peek_tail (q) == NULL); + break; + case PEEK_NTH: + if (g_queue_is_empty (q)) + { + for (j = -10; j < 10; ++j) + g_assert (g_queue_peek_nth (q, j) == NULL); + } + else + { + GList *list; + int n = get_random_position (q, TRUE); + if (n < 0 || n >= q->length) + { + g_assert (g_queue_peek_nth (q, n) == NULL); + } + else + { + list = qinf->head; + for (j = 0; j < n; ++j) + list = list->next; + + g_assert (list->data == g_queue_peek_nth (q, n)); + } + } + break; + case INDEX: + case LINK_INDEX: + { + int x = g_random_int_range (0, 386538); + int n; + GList *list; + + g_queue_remove_all (q, GINT_TO_POINTER (x)); + check_integrity (q); + g_queue_push_tail (q, GINT_TO_POINTER (x)); + check_integrity (q); + g_queue_sort (q, compare_int, NULL); + check_integrity (q); + + n = 0; + for (list = q->head; list != NULL; list = list->next) + { + if (list->data == GINT_TO_POINTER (x)) + break; + n++; + } + g_assert (list); + g_assert (g_queue_index (q, GINT_TO_POINTER (x)) == + g_queue_link_index (q, list)); + g_assert (g_queue_link_index (q, list) == n); + + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length = q->length; + } + break; + case REMOVE: + if (!g_queue_is_empty (q)) + g_queue_remove (q, qinf->tail->data); + if (!g_queue_is_empty (q)) + g_queue_remove (q, qinf->head->data); + if (!g_queue_is_empty (q)) + g_queue_remove (q, g_queue_peek_nth (q, get_random_position (q, TRUE))); + + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length = q->length; + break; + case REMOVE_ALL: + if (!g_queue_is_empty (q)) + g_queue_remove_all (q, qinf->tail->data); + if (!g_queue_is_empty (q)) + g_queue_remove_all (q, qinf->head->data); + if (!g_queue_is_empty (q)) + g_queue_remove_all (q, g_queue_peek_nth (q, get_random_position (q, TRUE))); + + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length = q->length; + break; + case INSERT_BEFORE: + if (!g_queue_is_empty (q)) + { + gpointer x = GINT_TO_POINTER (g_random_int_range (0, 386538)); + + g_queue_insert_before (q, qinf->tail, x); + g_queue_insert_before (q, qinf->head, x); + g_queue_insert_before (q, g_queue_find (q, x), x); + } + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length = q->length; + break; + case INSERT_AFTER: + if (!g_queue_is_empty (q)) + { + gpointer x = GINT_TO_POINTER (g_random_int_range (0, 386538)); + + g_queue_insert_after (q, qinf->tail, x); + g_queue_insert_after (q, qinf->head, x); + g_queue_insert_after (q, g_queue_find (q, x), x); + } + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length = q->length; + break; + case INSERT_SORTED: + { + int max = find_max (q); + int min = find_min (q); + + if (g_queue_is_empty (q)) + { + max = 345; + min = -12; + } + + g_queue_sort (q, compare_int, NULL); + check_integrity (q); + g_queue_insert_sorted (q, GINT_TO_POINTER (max + 1), compare_int, NULL); + check_integrity (q); + g_assert (GPOINTER_TO_INT (q->tail->data) == max + 1); + g_queue_insert_sorted (q, GINT_TO_POINTER (min - 1), compare_int, NULL); + check_integrity (q); + g_assert (GPOINTER_TO_INT (q->head->data) == min - 1); + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length = q->length; + } + break; + case PUSH_HEAD_LINK: + { + GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i)); + g_queue_push_head_link (q, link); + if (!qinf->tail) + qinf->tail = link; + qinf->head = link; + qinf->length++; + } + break; + case PUSH_TAIL_LINK: + { + GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i)); + g_queue_push_tail_link (q, link); + if (!qinf->head) + qinf->head = link; + qinf->tail = link; + qinf->length++; + } + break; + case PUSH_NTH_LINK: + { + GList *link = g_list_prepend (NULL, GINT_TO_POINTER (i)); + gint n = get_random_position (q, TRUE); + g_queue_push_nth_link (q, n, link); + + if (qinf->head && qinf->head->prev) + qinf->head = qinf->head->prev; + else + qinf->head = q->head; + if (qinf->tail && qinf->tail->next) + qinf->tail = qinf->tail->next; + else + qinf->tail = g_list_last (qinf->head); + qinf->length++; + } + break; + case POP_HEAD_LINK: + if (!g_queue_is_empty (q)) + { + qinf->head = qinf->head->next; + if (!qinf->head) + qinf->tail = NULL; + qinf->length--; + g_list_free (g_queue_pop_head_link (q)); + } + break; + case POP_TAIL_LINK: + if (!g_queue_is_empty (q)) + { + qinf->tail = qinf->tail->prev; + if (!qinf->tail) + qinf->head = NULL; + qinf->length--; + g_list_free (g_queue_pop_tail_link (q)); + } + break; + case POP_NTH_LINK: + if (g_queue_is_empty (q)) + g_assert (g_queue_pop_nth_link (q, 200) == NULL); + else + { + int n = get_random_position (q, FALSE); + + if (n == g_queue_get_length (q) - 1) + qinf->tail = qinf->tail->prev; + + if (n == 0) + qinf->head = qinf->head->next; + + qinf->length--; + + g_list_free (g_queue_pop_nth_link (q, n)); + } + break; + case PEEK_HEAD_LINK: + if (g_queue_is_empty (q)) + g_assert (g_queue_peek_head_link (q) == NULL); + else + g_assert (g_queue_peek_head_link (q) == qinf->head); + break; + case PEEK_TAIL_LINK: + if (g_queue_is_empty (q)) + g_assert (g_queue_peek_tail_link (q) == NULL); + else + g_assert (g_queue_peek_tail_link (q) == qinf->tail); + break; + case PEEK_NTH_LINK: + if (g_queue_is_empty(q)) + g_assert (g_queue_peek_nth_link (q, 1000) == NULL); + else + { + gint n = get_random_position (q, FALSE); + GList *link; + + link = q->head; + for (j = 0; j < n; ++j) + link = link->next; + + g_assert (g_queue_peek_nth_link (q, n) == link); + } + break; + case UNLINK: + if (!g_queue_is_empty (q)) + { + gint n = g_random_int_range (0, g_queue_get_length (q)); + GList *link; + + link = q->head; + for (j = 0; j < n; ++j) + link = link->next; + + g_queue_unlink (q, link); + check_integrity (q); + + g_list_free (link); + + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length--; + } + break; + case DELETE_LINK: + if (!g_queue_is_empty (q)) + { + gint n = g_random_int_range (0, g_queue_get_length (q)); + GList *link; + + link = q->head; + for (j = 0; j < n; ++j) + link = link->next; + + g_queue_delete_link (q, link); + check_integrity (q); + + qinf->head = q->head; + qinf->tail = q->tail; + qinf->length--; + } + break; + case LAST_OP: + default: + g_assert_not_reached(); + break; + } + + if (qinf->head != q->head || + qinf->tail != q->tail || + qinf->length != q->length) + g_print ("op: %d\n", op); + + g_assert (qinf->head == q->head); + g_assert (qinf->tail == q->tail); + g_assert (qinf->length == q->length); + + for (j = 0; j < N_QUEUES; ++j) + check_integrity (queues[j].queue); + } + + for (i = 0; i < N_QUEUES; ++i) + g_queue_free (queues[i].queue); +} + +static void +remove_item (gpointer data, gpointer q) +{ + GQueue *queue = q; + + g_queue_remove (queue, data); +} + +int main(int argc, gchar *args[]) +{ + GQueue *q, *q2; + GList *node; + gpointer data; + int i; + + if (argc > 1 && args[1][0] == '-' && args[1][1] == 'v') + verbose = TRUE; + + q = g_queue_new (); + + g_assert (g_queue_is_empty (q) == TRUE); + + g_queue_push_head (q, GINT_TO_POINTER (2)); + check_integrity (q); + g_assert (g_queue_peek_head (q) == GINT_TO_POINTER (2)); + check_integrity (q); + g_assert (g_queue_is_empty (q) == FALSE); + check_integrity (q); + g_assert (g_list_length (q->head) == 1); + g_assert (q->head == q->tail); + g_queue_push_head (q, GINT_TO_POINTER (1)); + check_integrity (q); + g_assert (q->head->next == q->tail); + g_assert (q->tail->prev == q->head); + g_assert (g_list_length (q->head) == 2); + check_integrity (q); + g_assert (q->tail->data == GINT_TO_POINTER (2)); + g_assert (q->head->data == GINT_TO_POINTER (1)); + check_integrity (q); + g_queue_push_tail (q, GINT_TO_POINTER (3)); + g_assert (g_list_length (q->head) == 3); + g_assert (q->head->data == GINT_TO_POINTER (1)); + g_assert (q->head->next->data == GINT_TO_POINTER (2)); + g_assert (q->head->next->next == q->tail); + g_assert (q->head->next == q->tail->prev); + g_assert (q->tail->data == GINT_TO_POINTER (3)); + g_queue_push_tail (q, GINT_TO_POINTER (4)); + check_integrity (q); + g_assert (g_list_length (q->head) == 4); + g_assert (q->head->data == GINT_TO_POINTER (1)); + g_assert (g_queue_peek_tail (q) == GINT_TO_POINTER (4)); + g_queue_push_tail (q, GINT_TO_POINTER (5)); + check_integrity (q); + g_assert (g_list_length (q->head) == 5); + + g_assert (g_queue_is_empty (q) == FALSE); + check_integrity (q); + + g_assert (q->length == 5); + g_assert (q->head->prev == NULL); + g_assert (q->head->data == GINT_TO_POINTER (1)); + g_assert (q->head->next->data == GINT_TO_POINTER (2)); + g_assert (q->head->next->next->data == GINT_TO_POINTER (3)); + g_assert (q->head->next->next->next->data == GINT_TO_POINTER (4)); + g_assert (q->head->next->next->next->next->data == GINT_TO_POINTER (5)); + g_assert (q->head->next->next->next->next->next == NULL); + g_assert (q->head->next->next->next->next == q->tail); + g_assert (q->tail->data == GINT_TO_POINTER (5)); + g_assert (q->tail->prev->data == GINT_TO_POINTER (4)); + g_assert (q->tail->prev->prev->data == GINT_TO_POINTER (3)); + g_assert (q->tail->prev->prev->prev->data == GINT_TO_POINTER (2)); + g_assert (q->tail->prev->prev->prev->prev->data == GINT_TO_POINTER (1)); + g_assert (q->tail->prev->prev->prev->prev->prev == NULL); + g_assert (q->tail->prev->prev->prev->prev == q->head); + g_assert (g_queue_peek_tail (q) == GINT_TO_POINTER (5)); + g_assert (g_queue_peek_head (q) == GINT_TO_POINTER (1)); + + g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (1)); + check_integrity (q); + g_assert (g_list_length (q->head) == 4 && q->length == 4); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (5)); + check_integrity (q); + g_assert (g_list_length (q->head) == 3); + g_assert (g_queue_pop_head_link (q)->data == GINT_TO_POINTER (2)); + check_integrity (q); + g_assert (g_list_length (q->head) == 2); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (4)); + check_integrity (q); + g_assert (g_list_length (q->head) == 1); + g_assert (g_queue_pop_head_link (q)->data == GINT_TO_POINTER (3)); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + g_assert (g_queue_pop_tail (q) == NULL); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + g_assert (g_queue_pop_head (q) == NULL); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + + g_assert (g_queue_is_empty (q) == TRUE); + check_integrity (q); + + /************************/ + + g_queue_push_head (q, GINT_TO_POINTER (1)); + check_integrity (q); + g_assert (g_list_length (q->head) == 1 && 1 == q->length); + g_queue_push_head (q, GINT_TO_POINTER (2)); + check_integrity (q); + g_assert (g_list_length (q->head) == 2 && 2 == q->length); + g_queue_push_head (q, GINT_TO_POINTER (3)); + check_integrity (q); + g_assert (g_list_length (q->head) == 3 && 3 == q->length); + g_queue_push_head (q, GINT_TO_POINTER (4)); + check_integrity (q); + g_assert (g_list_length (q->head) == 4 && 4 == q->length); + g_queue_push_head (q, GINT_TO_POINTER (5)); + check_integrity (q); + g_assert (g_list_length (q->head) == 5 && 5 == q->length); + + g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (5)); + check_integrity (q); + g_assert (g_list_length (q->head) == 4); + node = q->tail; + g_assert (node == g_queue_pop_tail_link (q)); + check_integrity (q); + g_assert (g_list_length (q->head) == 3); + data = q->head->data; + g_assert (data == g_queue_pop_head (q)); + check_integrity (q); + g_assert (g_list_length (q->head) == 2); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (2)); + check_integrity (q); + g_assert (g_list_length (q->head) == 1); + g_assert (q->head == q->tail); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (3)); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + g_assert (g_queue_pop_head (q) == NULL); + check_integrity (q); + g_assert (g_queue_pop_head_link (q) == NULL); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + g_assert (g_queue_pop_tail_link (q) == NULL); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + + /* */ + g_queue_reverse (q); + check_integrity (q); + g_assert (g_list_length (q->head) == 0); + + q2 = g_queue_copy (q); + check_integrity (q); + check_integrity (q2); + g_assert (g_list_length (q->head) == 0); + g_assert (g_list_length (q2->head) == 0); + g_queue_sort (q, compare_int, NULL); + check_integrity (q2); + check_integrity (q); + g_queue_sort (q2, compare_int, NULL); + check_integrity (q2); + check_integrity (q); + + for (i = 0; i < 200; ++i) + { + g_queue_push_nth (q, GINT_TO_POINTER (i), i); + g_assert (g_queue_find (q, GINT_TO_POINTER (i))); + check_integrity (q); + check_integrity (q2); + } + + for (i = 0; i < 200; ++i) + { + g_queue_remove (q, GINT_TO_POINTER (i)); + check_integrity (q); + check_integrity (q2); + } + + for (i = 0; i < 200; ++i) + { + GList *l = g_list_prepend (NULL, GINT_TO_POINTER (i)); + + g_queue_push_nth_link (q, i, l); + check_integrity (q); + check_integrity (q2); + g_queue_reverse (q); + check_integrity (q); + check_integrity (q2); + } + + g_queue_free (q2); + q2 = g_queue_copy (q); + + g_queue_foreach (q2, remove_item, q2); + check_integrity (q2); + check_integrity (q); + + /* some checks for off by one errors */ + g_queue_push_tail (q, GINT_TO_POINTER (1234)); + check_integrity (q); + node = g_queue_peek_tail_link (q); + g_assert (node != NULL && node->data == GINT_TO_POINTER (1234)); + node = g_queue_peek_nth_link (q, g_queue_get_length (q)); + g_assert (node == NULL); + node = g_queue_peek_nth_link (q, g_queue_get_length (q) - 1); + g_assert (node->data == GINT_TO_POINTER (1234)); + node = g_queue_pop_nth_link (q, g_queue_get_length (q)); + g_assert (node == NULL); + node = g_queue_pop_nth_link (q, g_queue_get_length (q) - 1); + g_assert (node != NULL && node->data == GINT_TO_POINTER (1234)); + + g_queue_free (q); + + if (argc > 2 && args[1][0] == '-' && args[1][1] == 'v') + random_test (strtol (args[2], NULL, 0)); + if (argc > 1) + random_test (strtol (args[1], NULL, 0)); + else + random_test (time (0)); + + return 0; +} + diff --git a/tests/refcount/Makefile.am b/tests/refcount/Makefile.am new file mode 100644 index 0000000..ff29b59 --- /dev/null +++ b/tests/refcount/Makefile.am @@ -0,0 +1,41 @@ +include $(top_srcdir)/Makefile.decl + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) + +libglib = $(top_builddir)/glib/libglib-2.0.la +libgthread = $(top_builddir)/gthread/libgthread-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la +libgobject = $(top_builddir)/gobject/libgobject-2.0.la + +LDADD = $(libglib) $(libgobject) $(libgthread) $(G_THREAD_LIBS) + +test_programs = \ + closures \ + objects \ + objects2 \ + properties \ + properties2 \ + signal1 \ + signal2 \ + signal3 + + + +signal1_SOURCES = signals.c +signal1_CFLAGS = -DTESTNUM=1 $(AM_CFLAGS) +signal2_SOURCES = signals.c +signal2_CFLAGS = -DTESTNUM=2 $(AM_CFLAGS) +signal3_SOURCES = signals.c +signal3_CFLAGS = -DTESTNUM=3 $(AM_CFLAGS) + +check_PROGRAMS = $(test_programs) + +all: $(check_PROGRAMS) + +TESTS = $(test_programs) +TESTS_ENVIRONMENT = srcdir=$(srcdir) \ + LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset diff --git a/tests/refcount/Makefile.in b/tests/refcount/Makefile.in new file mode 100644 index 0000000..d1ca79a --- /dev/null +++ b/tests/refcount/Makefile.in @@ -0,0 +1,906 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ + +# GLIB - Library of useful C routines +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@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.decl +check_PROGRAMS = $(am__EXEEXT_1) +TESTS = $(am__EXEEXT_1) +subdir = tests/refcount +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/acglib.m4 \ + $(top_srcdir)/glib/libcharset/codeset.m4 \ + $(top_srcdir)/glib/libcharset/glibc21.m4 \ + $(top_srcdir)/m4macros/glib-gettext.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = closures$(EXEEXT) objects$(EXEEXT) objects2$(EXEEXT) \ + properties$(EXEEXT) properties2$(EXEEXT) signal1$(EXEEXT) \ + signal2$(EXEEXT) signal3$(EXEEXT) +closures_SOURCES = closures.c +closures_OBJECTS = closures.$(OBJEXT) +closures_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +closures_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +objects_SOURCES = objects.c +objects_OBJECTS = objects.$(OBJEXT) +objects_LDADD = $(LDADD) +objects_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +objects2_SOURCES = objects2.c +objects2_OBJECTS = objects2.$(OBJEXT) +objects2_LDADD = $(LDADD) +objects2_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +properties_SOURCES = properties.c +properties_OBJECTS = properties.$(OBJEXT) +properties_LDADD = $(LDADD) +properties_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +properties2_SOURCES = properties2.c +properties2_OBJECTS = properties2.$(OBJEXT) +properties2_LDADD = $(LDADD) +properties2_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +am_signal1_OBJECTS = signal1-signals.$(OBJEXT) +signal1_OBJECTS = $(am_signal1_OBJECTS) +signal1_LDADD = $(LDADD) +signal1_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +signal1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(signal1_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_signal2_OBJECTS = signal2-signals.$(OBJEXT) +signal2_OBJECTS = $(am_signal2_OBJECTS) +signal2_LDADD = $(LDADD) +signal2_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +signal2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(signal2_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +am_signal3_OBJECTS = signal3-signals.$(OBJEXT) +signal3_OBJECTS = $(am_signal3_OBJECTS) +signal3_LDADD = $(LDADD) +signal3_DEPENDENCIES = $(libglib) $(libgobject) $(libgthread) \ + $(am__DEPENDENCIES_1) +signal3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(signal3_CFLAGS) \ + $(CFLAGS) $(AM_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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = closures.c objects.c objects2.c properties.c properties2.c \ + $(signal1_SOURCES) $(signal2_SOURCES) $(signal3_SOURCES) +DIST_SOURCES = closures.c objects.c objects2.c properties.c \ + properties2.c $(signal1_SOURCES) $(signal2_SOURCES) \ + $(signal3_SOURCES) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ABS_GLIB_RUNTIME_LIBDIR = @ABS_GLIB_RUNTIME_LIBDIR@ +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CATALOGS = @CATALOGS@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISABLE_MEM_POOLS = @DISABLE_MEM_POOLS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FAM_LIBS = @FAM_LIBS@ +FGREP = @FGREP@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GIO = @GIO@ +GIO_MODULE_DIR = @GIO_MODULE_DIR@ +GLIBC21 = @GLIBC21@ +GLIB_BINARY_AGE = @GLIB_BINARY_AGE@ +GLIB_DEBUG_FLAGS = @GLIB_DEBUG_FLAGS@ +GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_INTERFACE_AGE = @GLIB_INTERFACE_AGE@ +GLIB_MAJOR_VERSION = @GLIB_MAJOR_VERSION@ +GLIB_MICRO_VERSION = @GLIB_MICRO_VERSION@ +GLIB_MINOR_VERSION = @GLIB_MINOR_VERSION@ +GLIB_RUNTIME_LIBDIR = @GLIB_RUNTIME_LIBDIR@ +GLIB_VERSION = @GLIB_VERSION@ +GLIB_WIN32_STATIC_COMPILATION_DEFINE = @GLIB_WIN32_STATIC_COMPILATION_DEFINE@ +GMOFILES = @GMOFILES@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +GSPAWN = @GSPAWN@ +GTHREAD_COMPILE_IMPL_DEFINES = @GTHREAD_COMPILE_IMPL_DEFINES@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +G_LIBS_EXTRA = @G_LIBS_EXTRA@ +G_MODULE_BROKEN_RTLD_GLOBAL = @G_MODULE_BROKEN_RTLD_GLOBAL@ +G_MODULE_HAVE_DLERROR = @G_MODULE_HAVE_DLERROR@ +G_MODULE_IMPL = @G_MODULE_IMPL@ +G_MODULE_LDFLAGS = @G_MODULE_LDFLAGS@ +G_MODULE_LIBS = @G_MODULE_LIBS@ +G_MODULE_LIBS_EXTRA = @G_MODULE_LIBS_EXTRA@ +G_MODULE_NEED_USCORE = @G_MODULE_NEED_USCORE@ +G_MODULE_PLUGIN_LIBS = @G_MODULE_PLUGIN_LIBS@ +G_MODULE_SUPPORTED = @G_MODULE_SUPPORTED@ +G_THREAD_CFLAGS = @G_THREAD_CFLAGS@ +G_THREAD_LIBS = @G_THREAD_LIBS@ +G_THREAD_LIBS_EXTRA = @G_THREAD_LIBS_EXTRA@ +G_THREAD_LIBS_FOR_GTHREAD = @G_THREAD_LIBS_FOR_GTHREAD@ +HTML_DIR = @HTML_DIR@ +ICONV_LIBS = @ICONV_LIBS@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLLIBS = @INTLLIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_LIBADD = @LIBASYNCNS_LIBADD@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_EXPORT_OPTIONS = @LIBTOOL_EXPORT_OPTIONS@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +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@ +MKDIR_P = @MKDIR_P@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGFMT_OPTS = @MSGFMT_OPTS@ +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@ +PCRE_CFLAGS = @PCRE_CFLAGS@ +PCRE_LIBS = @PCRE_LIBS@ +PCRE_REQUIRES = @PCRE_REQUIRES@ +PCRE_WARN_CFLAGS = @PCRE_WARN_CFLAGS@ +PERL = @PERL@ +PERL_PATH = @PERL_PATH@ +PKG_CONFIG = @PKG_CONFIG@ +PLATFORMDEP = @PLATFORMDEP@ +POFILES = @POFILES@ +POSUB = @POSUB@ +PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ +PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +REBUILD = @REBUILD@ +SED = @SED@ +SELINUX_LIBS = @SELINUX_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +XATTR_LIBS = @XATTR_LIBS@ +XGETTEXT = @XGETTEXT@ +XMLCATALOG = @XMLCATALOG@ +XML_CATALOG_FILE = @XML_CATALOG_FILE@ +XSLTPROC = @XSLTPROC@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +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@ +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@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +#GTESTER = gtester # for non-GLIB packages +GTESTER = $(top_builddir)/glib/gtester # for the GLIB package +GTESTER_REPORT = $(top_builddir)/glib/gtester-report # for the GLIB package + +# initialize variables for unconditional += appending +EXTRA_DIST = +TEST_PROGS = +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/glib \ + -I$(top_srcdir)/gmodule \ + $(GLIB_DEBUG_FLAGS) + +libglib = $(top_builddir)/glib/libglib-2.0.la +libgthread = $(top_builddir)/gthread/libgthread-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la +libgobject = $(top_builddir)/gobject/libgobject-2.0.la +LDADD = $(libglib) $(libgobject) $(libgthread) $(G_THREAD_LIBS) +test_programs = \ + closures \ + objects \ + objects2 \ + properties \ + properties2 \ + signal1 \ + signal2 \ + signal3 + +signal1_SOURCES = signals.c +signal1_CFLAGS = -DTESTNUM=1 $(AM_CFLAGS) +signal2_SOURCES = signals.c +signal2_CFLAGS = -DTESTNUM=2 $(AM_CFLAGS) +signal3_SOURCES = signals.c +signal3_CFLAGS = -DTESTNUM=3 $(AM_CFLAGS) +TESTS_ENVIRONMENT = srcdir=$(srcdir) \ + LIBCHARSET_ALIAS_DIR=$(top_builddir)/glib/libcharset + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.decl $(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) --gnu tests/refcount/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/refcount/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-checkPROGRAMS: + @list='$(check_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 +closures$(EXEEXT): $(closures_OBJECTS) $(closures_DEPENDENCIES) + @rm -f closures$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(closures_OBJECTS) $(closures_LDADD) $(LIBS) +objects$(EXEEXT): $(objects_OBJECTS) $(objects_DEPENDENCIES) + @rm -f objects$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(objects_OBJECTS) $(objects_LDADD) $(LIBS) +objects2$(EXEEXT): $(objects2_OBJECTS) $(objects2_DEPENDENCIES) + @rm -f objects2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(objects2_OBJECTS) $(objects2_LDADD) $(LIBS) +properties$(EXEEXT): $(properties_OBJECTS) $(properties_DEPENDENCIES) + @rm -f properties$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(properties_OBJECTS) $(properties_LDADD) $(LIBS) +properties2$(EXEEXT): $(properties2_OBJECTS) $(properties2_DEPENDENCIES) + @rm -f properties2$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(properties2_OBJECTS) $(properties2_LDADD) $(LIBS) +signal1$(EXEEXT): $(signal1_OBJECTS) $(signal1_DEPENDENCIES) + @rm -f signal1$(EXEEXT) + $(AM_V_CCLD)$(signal1_LINK) $(signal1_OBJECTS) $(signal1_LDADD) $(LIBS) +signal2$(EXEEXT): $(signal2_OBJECTS) $(signal2_DEPENDENCIES) + @rm -f signal2$(EXEEXT) + $(AM_V_CCLD)$(signal2_LINK) $(signal2_OBJECTS) $(signal2_LDADD) $(LIBS) +signal3$(EXEEXT): $(signal3_OBJECTS) $(signal3_DEPENDENCIES) + @rm -f signal3$(EXEEXT) + $(AM_V_CCLD)$(signal3_LINK) $(signal3_OBJECTS) $(signal3_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closures.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objects.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objects2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/properties.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/properties2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal1-signals.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal2-signals.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal3-signals.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@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 $@ $< + +signal1-signals.o: signals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal1_CFLAGS) $(CFLAGS) -MT signal1-signals.o -MD -MP -MF $(DEPDIR)/signal1-signals.Tpo -c -o signal1-signals.o `test -f 'signals.c' || echo '$(srcdir)/'`signals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/signal1-signals.Tpo $(DEPDIR)/signal1-signals.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signals.c' object='signal1-signals.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal1_CFLAGS) $(CFLAGS) -c -o signal1-signals.o `test -f 'signals.c' || echo '$(srcdir)/'`signals.c + +signal1-signals.obj: signals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal1_CFLAGS) $(CFLAGS) -MT signal1-signals.obj -MD -MP -MF $(DEPDIR)/signal1-signals.Tpo -c -o signal1-signals.obj `if test -f 'signals.c'; then $(CYGPATH_W) 'signals.c'; else $(CYGPATH_W) '$(srcdir)/signals.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/signal1-signals.Tpo $(DEPDIR)/signal1-signals.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signals.c' object='signal1-signals.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal1_CFLAGS) $(CFLAGS) -c -o signal1-signals.obj `if test -f 'signals.c'; then $(CYGPATH_W) 'signals.c'; else $(CYGPATH_W) '$(srcdir)/signals.c'; fi` + +signal2-signals.o: signals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal2_CFLAGS) $(CFLAGS) -MT signal2-signals.o -MD -MP -MF $(DEPDIR)/signal2-signals.Tpo -c -o signal2-signals.o `test -f 'signals.c' || echo '$(srcdir)/'`signals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/signal2-signals.Tpo $(DEPDIR)/signal2-signals.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signals.c' object='signal2-signals.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal2_CFLAGS) $(CFLAGS) -c -o signal2-signals.o `test -f 'signals.c' || echo '$(srcdir)/'`signals.c + +signal2-signals.obj: signals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal2_CFLAGS) $(CFLAGS) -MT signal2-signals.obj -MD -MP -MF $(DEPDIR)/signal2-signals.Tpo -c -o signal2-signals.obj `if test -f 'signals.c'; then $(CYGPATH_W) 'signals.c'; else $(CYGPATH_W) '$(srcdir)/signals.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/signal2-signals.Tpo $(DEPDIR)/signal2-signals.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signals.c' object='signal2-signals.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal2_CFLAGS) $(CFLAGS) -c -o signal2-signals.obj `if test -f 'signals.c'; then $(CYGPATH_W) 'signals.c'; else $(CYGPATH_W) '$(srcdir)/signals.c'; fi` + +signal3-signals.o: signals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal3_CFLAGS) $(CFLAGS) -MT signal3-signals.o -MD -MP -MF $(DEPDIR)/signal3-signals.Tpo -c -o signal3-signals.o `test -f 'signals.c' || echo '$(srcdir)/'`signals.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/signal3-signals.Tpo $(DEPDIR)/signal3-signals.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signals.c' object='signal3-signals.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal3_CFLAGS) $(CFLAGS) -c -o signal3-signals.o `test -f 'signals.c' || echo '$(srcdir)/'`signals.c + +signal3-signals.obj: signals.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal3_CFLAGS) $(CFLAGS) -MT signal3-signals.obj -MD -MP -MF $(DEPDIR)/signal3-signals.Tpo -c -o signal3-signals.obj `if test -f 'signals.c'; then $(CYGPATH_W) 'signals.c'; else $(CYGPATH_W) '$(srcdir)/signals.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/signal3-signals.Tpo $(DEPDIR)/signal3-signals.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signals.c' object='signal3-signals.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(signal3_CFLAGS) $(CFLAGS) -c -o signal3-signals.obj `if test -f 'signals.c'; then $(CYGPATH_W) 'signals.c'; else $(CYGPATH_W) '$(srcdir)/signals.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +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: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; 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: $(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 + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +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 + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +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-checkPROGRAMS clean-generic clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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 -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am check-local \ + clean clean-checkPROGRAMS clean-generic clean-libtool ctags \ + 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 maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am + + +### testing rules + +# test: run all tests in cwd and subdirs +test: ${TEST_PROGS} +@OS_UNIX_TRUE@ @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} +@OS_UNIX_TRUE@ @ for subdir in $(SUBDIRS) . ; do \ +@OS_UNIX_TRUE@ test "$$subdir" = "." -o "$$subdir" = "po" || \ +@OS_UNIX_TRUE@ ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ +@OS_UNIX_TRUE@ done + +# test-report: run tests in subdirs and generate report +# perf-report: run tests in subdirs with -m perf and generate report +# full-report: like test-report: with -m perf and -m slow +test-report perf-report full-report: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || { \ + case $@ in \ + test-report) test_options="-k";; \ + perf-report) test_options="-k -m=perf";; \ + full-report) test_options="-k -m=perf -m=slow";; \ + esac ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ + elif test -n "${TEST_PROGS}" ; then \ + ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ + fi ; \ + } + @ ignore_logdir=true ; \ + if test -z "$$GTESTER_LOGDIR" ; then \ + GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ + ignore_logdir=false ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ + sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ + done ; \ + echo >> $@.xml ; \ + echo '' >> $@.xml ; \ + rm -rf "$$GTESTER_LOGDIR"/ ; \ + ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ + } +.PHONY: test test-report perf-report full-report +# run make test as part of make check +check-local: test + +all: $(check_PROGRAMS) + +# 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/tests/refcount/closures.c b/tests/refcount/closures.c new file mode 100644 index 0000000..5bd20a0 --- /dev/null +++ b/tests/refcount/closures.c @@ -0,0 +1,291 @@ +/* Copyright (C) 2005 Imendio AB + * + * This software is provided "as is"; redistribution and modification + * is permitted, provided that the following disclaimer is retained. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#include +#include + +#define TEST_POINTER1 ((gpointer) 47) +#define TEST_POINTER2 ((gpointer) 49) +#define TEST_INT1 (-77) +#define TEST_INT2 (78) + +/* --- GTest class --- */ +typedef struct { + GObject object; + gint value; + gpointer test_pointer1; + gpointer test_pointer2; +} GTest; +typedef struct { + GObjectClass parent_class; + void (*test_signal1) (GTest * test, gint an_int); + void (*test_signal2) (GTest * test, gint an_int); +} GTestClass; + +#define G_TYPE_TEST (my_test_get_type ()) +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST)) +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass)) +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST)) +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) + +G_DEFINE_TYPE (GTest, my_test, G_TYPE_OBJECT); + +/* --- variables --- */ +static volatile gboolean stopping = FALSE; +static guint test_signal1 = 0; +static guint test_signal2 = 0; +static gboolean seen_signal_handler = FALSE; +static gboolean seen_cleanup = FALSE; +static gboolean seen_test_int1 = FALSE; +static gboolean seen_test_int2 = FALSE; +static gboolean seen_thread1 = FALSE; +static gboolean seen_thread2 = FALSE; + +/* --- functions --- */ +static void +my_test_init (GTest * test) +{ + g_print ("init %p\n", test); + + test->value = 0; + test->test_pointer1 = TEST_POINTER1; + test->test_pointer2 = TEST_POINTER2; +} + +enum { + ARG_0, + ARG_TEST_PROP +}; + +static void +my_test_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTest *test = MY_TEST (object); + switch (prop_id) + { + case ARG_TEST_PROP: + test->value = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_test_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTest *test = MY_TEST (object); + switch (prop_id) + { + case ARG_TEST_PROP: + g_value_set_int (value, test->value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_test_test_signal2 (GTest *test, + gint an_int) +{ +} + +static void +my_test_emit_test_signal1 (GTest *test, + gint vint) +{ + g_signal_emit (G_OBJECT (test), test_signal1, 0, vint); +} + +static void +my_test_emit_test_signal2 (GTest *test, + gint vint) +{ + g_signal_emit (G_OBJECT (test), test_signal2, 0, vint); +} + +static void +my_test_class_init (GTestClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = my_test_set_property; + gobject_class->get_property = my_test_get_property; + + test_signal1 = g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GTestClass, test_signal1), NULL, NULL, + g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); + test_signal2 = g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GTestClass, test_signal2), NULL, NULL, + g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP, + g_param_spec_int ("test-prop", "Test Prop", "Test property", + 0, 1, 0, G_PARAM_READWRITE)); + klass->test_signal2 = my_test_test_signal2; +} + +static inline guint32 +quick_rand32 (void) +{ + static guint32 accu = 2147483563; + accu = 1664525 * accu + 1013904223; + return accu; +} + +static void +test_closure (GClosure *closure) +{ + /* try to produce high contention in closure->ref_count */ + guint i = 0, n = quick_rand32() % 199; + for (i = 0; i < n; i++) + g_closure_ref (closure); + g_closure_sink (closure); /* NOP */ + for (i = 0; i < n; i++) + g_closure_unref (closure); +} + +static gpointer +thread1_main (gpointer data) +{ + GClosure *closure = data; + while (!stopping) + { + static guint count = 0; + test_closure (closure); + if (++count % 10000 == 0) + { + g_printerr ("c"); + g_thread_yield(); /* force context switch */ + seen_thread1 = TRUE; + } + } + return NULL; +} + +static gpointer +thread2_main (gpointer data) +{ + GClosure *closure = data; + while (!stopping) + { + static guint count = 0; + test_closure (closure); + if (++count % 10000 == 0) + { + g_printerr ("C"); + g_thread_yield(); /* force context switch */ + seen_thread2 = TRUE; + } + } + return NULL; +} + +static void +test_signal_handler (GTest *test, + gint vint, + gpointer data) +{ + g_assert (data == TEST_POINTER2); + g_assert (test->test_pointer1 == TEST_POINTER1); + seen_signal_handler = TRUE; + seen_test_int1 |= vint == TEST_INT1; + seen_test_int2 |= vint == TEST_INT2; +} + +static void +destroy_data (gpointer data, + GClosure *closure) +{ + seen_cleanup = data == TEST_POINTER2; + g_assert (closure->ref_count == 0); +} + +static void +test_emissions (GTest *test) +{ + my_test_emit_test_signal1 (test, TEST_INT1); + my_test_emit_test_signal2 (test, TEST_INT2); +} + +int +main (int argc, + char **argv) +{ + GThread *thread1, *thread2; + GClosure *closure; + GTest *object; + guint i; + + g_thread_init (NULL); + g_print ("START: %s\n", argv[0]); + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); + g_type_init (); + + object = g_object_new (G_TYPE_TEST, NULL); + closure = g_cclosure_new (G_CALLBACK (test_signal_handler), TEST_POINTER2, destroy_data); + + g_signal_connect_closure (object, "test-signal1", closure, FALSE); + g_signal_connect_closure (object, "test-signal2", closure, FALSE); + + stopping = FALSE; + + thread1 = g_thread_create (thread1_main, closure, TRUE, NULL); + thread2 = g_thread_create (thread2_main, closure, TRUE, NULL); + + for (i = 0; i < 1000000; i++) + { + static guint count = 0; + test_emissions (object); + if (++count % 10000 == 0) + { + g_printerr (".\n"); + g_thread_yield(); /* force context switch */ + } + } + + stopping = TRUE; + g_print ("\nstopping\n"); + + /* wait for thread shutdown */ + g_thread_join (thread1); + g_thread_join (thread2); + + /* finalize object, destroy signals, run cleanup code */ + g_object_unref (object); + + g_print ("stopped\n"); + + g_assert (seen_thread1 != FALSE); + g_assert (seen_thread2 != FALSE); + g_assert (seen_test_int1 != FALSE); + g_assert (seen_test_int2 != FALSE); + g_assert (seen_signal_handler != FALSE); + g_assert (seen_cleanup != FALSE); + + return 0; +} diff --git a/tests/refcount/objects.c b/tests/refcount/objects.c new file mode 100644 index 0000000..9638045 --- /dev/null +++ b/tests/refcount/objects.c @@ -0,0 +1,158 @@ +#include +#include +#include + +#define G_TYPE_TEST (my_test_get_type ()) +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST)) +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass)) +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST)) +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) + +typedef struct _GTest GTest; +typedef struct _GTestClass GTestClass; + +struct _GTest +{ + GObject object; +}; + +struct _GTestClass +{ + GObjectClass parent_class; +}; + +static GType my_test_get_type (void); +static volatile gboolean stopping; + +static void my_test_class_init (GTestClass * klass); +static void my_test_init (GTest * test); +static void my_test_dispose (GObject * object); + +static GObjectClass *parent_class = NULL; + +static GType +my_test_get_type (void) +{ + static GType test_type = 0; + + if (!test_type) { + static const GTypeInfo test_info = { + sizeof (GTestClass), + NULL, + NULL, + (GClassInitFunc) my_test_class_init, + NULL, + NULL, + sizeof (GTest), + 0, + (GInstanceInitFunc) my_test_init, + NULL + }; + + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", + &test_info, 0); + } + return test_type; +} + +static void +my_test_class_init (GTestClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + gobject_class->dispose = my_test_dispose; +} + +static void +my_test_init (GTest * test) +{ + g_print ("init %p\n", test); +} + +static void +my_test_dispose (GObject * object) +{ + GTest *test; + + test = MY_TEST (object); + + g_print ("dispose %p!\n", object); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +my_test_do_refcount (GTest * test) +{ + g_object_ref (test); + g_object_unref (test); +} + +static gpointer +run_thread (GTest * test) +{ + gint i = 1; + + while (!stopping) { + my_test_do_refcount (test); + if ((i++ % 10000) == 0) { + g_print ("."); + g_thread_yield(); /* force context switch */ + } + } + + return NULL; +} + +int +main (int argc, char **argv) +{ + gint i; + GTest *test1, *test2; + GArray *test_threads; + const guint n_threads = 5; + + g_thread_init (NULL); + g_print ("START: %s\n", argv[0]); + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); + g_type_init (); + + test1 = g_object_new (G_TYPE_TEST, NULL); + test2 = g_object_new (G_TYPE_TEST, NULL); + + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); + + stopping = FALSE; + + for (i = 0; i < n_threads; i++) { + GThread *thread; + + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL); + g_array_append_val (test_threads, thread); + + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL); + g_array_append_val (test_threads, thread); + } + g_usleep (5000000); + + stopping = TRUE; + + g_print ("\nstopping\n"); + + /* join all threads */ + for (i = 0; i < 2 * n_threads; i++) { + GThread *thread; + + thread = g_array_index (test_threads, GThread *, i); + g_thread_join (thread); + } + + g_print ("stopped\n"); + + return 0; +} diff --git a/tests/refcount/objects2.c b/tests/refcount/objects2.c new file mode 100644 index 0000000..bbd4a82 --- /dev/null +++ b/tests/refcount/objects2.c @@ -0,0 +1,118 @@ +#include +#include +#include + +#define G_TYPE_TEST (my_test_get_type ()) +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST)) +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass)) +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST)) +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) + +typedef struct _GTest GTest; +typedef struct _GTestClass GTestClass; + +struct _GTest +{ + GObject object; +}; + +struct _GTestClass +{ + GObjectClass parent_class; +}; + +static GType my_test_get_type (void); + +static void my_test_class_init (GTestClass * klass); +static void my_test_init (GTest * test); +static void my_test_dispose (GObject * object); + +static GObjectClass *parent_class = NULL; + +static GType +my_test_get_type (void) +{ + static GType test_type = 0; + + if (!test_type) { + static const GTypeInfo test_info = { + sizeof (GTestClass), + NULL, + NULL, + (GClassInitFunc) my_test_class_init, + NULL, + NULL, + sizeof (GTest), + 0, + (GInstanceInitFunc) my_test_init, + NULL + }; + + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", + &test_info, 0); + } + return test_type; +} + +static void +my_test_class_init (GTestClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + gobject_class->dispose = my_test_dispose; +} + +static void +my_test_init (GTest * test) +{ + g_print ("init %p\n", test); +} + +static void +my_test_dispose (GObject * object) +{ + GTest *test; + + test = MY_TEST (object); + + g_print ("dispose %p!\n", object); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +my_test_do_refcount (GTest * test) +{ + static guint i = 1; + if (i++ % 100000 == 0) + g_print ("."); + g_object_ref (test); + g_object_unref (test); +} + +int +main (int argc, char **argv) +{ + gint i; + GTest *test; + + g_thread_init (NULL); + g_print ("START: %s\n", argv[0]); + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); + g_type_init (); + + test = g_object_new (G_TYPE_TEST, NULL); + + for (i=0; i<100000000; i++) { + my_test_do_refcount (test); + } + + g_print ("\n"); + + return 0; +} diff --git a/tests/refcount/properties.c b/tests/refcount/properties.c new file mode 100644 index 0000000..c4c165c --- /dev/null +++ b/tests/refcount/properties.c @@ -0,0 +1,255 @@ +#include +#include +#include + +#define G_TYPE_TEST (my_test_get_type ()) +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST)) +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass)) +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST)) +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) + +enum { + PROP_0, + PROP_DUMMY +}; + +typedef struct _GTest GTest; +typedef struct _GTestClass GTestClass; + +struct _GTest +{ + GObject object; + gint id; + gint dummy; + + gint count; +}; + +struct _GTestClass +{ + GObjectClass parent_class; +}; + +static GType my_test_get_type (void); +static volatile gboolean stopping; + +static void my_test_class_init (GTestClass * klass); +static void my_test_init (GTest * test); +static void my_test_dispose (GObject * object); +static void my_test_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void my_test_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static GObjectClass *parent_class = NULL; + +static GType +my_test_get_type (void) +{ + static GType test_type = 0; + + if (!test_type) { + static const GTypeInfo test_info = { + sizeof (GTestClass), + NULL, + NULL, + (GClassInitFunc) my_test_class_init, + NULL, + NULL, + sizeof (GTest), + 0, + (GInstanceInitFunc) my_test_init, + NULL + }; + + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", &test_info, 0); + } + return test_type; +} + +static void +my_test_class_init (GTestClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + gobject_class->dispose = my_test_dispose; + gobject_class->get_property = my_test_get_property; + gobject_class->set_property = my_test_set_property; + + g_object_class_install_property (gobject_class, + PROP_DUMMY, + g_param_spec_int ("dummy", + NULL, + NULL, + 0, G_MAXINT, 0, + G_PARAM_READWRITE)); +} + +static void +my_test_init (GTest * test) +{ + static guint static_id = 1; + test->id = static_id++; +} + +static void +my_test_dispose (GObject * object) +{ + GTest *test; + + test = MY_TEST (object); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +my_test_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTest *test; + + test = MY_TEST (object); + + switch (prop_id) + { + case PROP_DUMMY: + g_value_set_int (value, test->dummy); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_test_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTest *test; + + test = MY_TEST (object); + + switch (prop_id) + { + case PROP_DUMMY: + test->dummy = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +dummy_notify (GObject *object, + GParamSpec *pspec) +{ + GTest *test; + + test = MY_TEST (object); + + test->count++; +} + +static void +my_test_do_property (GTest * test) +{ + gint dummy; + + g_object_get (test, "dummy", &dummy, NULL); + g_object_set (test, "dummy", dummy + 1, NULL); +} + +static gpointer +run_thread (GTest * test) +{ + gint i = 1; + + while (!stopping) { + my_test_do_property (test); + if ((i++ % 10000) == 0) + { + g_print (".%c", 'a' + test->id); + g_thread_yield(); /* force context switch */ + } + } + + return NULL; +} + +int +main (int argc, char **argv) +{ + gint i; + GArray *test_objects; + GArray *test_threads; + const gint n_threads = 5; + + g_thread_init (NULL); + g_print ("START: %s\n", argv[0]); + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); + g_type_init (); + + test_objects = g_array_new (FALSE, FALSE, sizeof (GTest *)); + + for (i = 0; i < n_threads; i++) { + GTest *test; + + test = g_object_new (G_TYPE_TEST, NULL); + g_array_append_val (test_objects, test); + + g_assert (test->count == test->dummy); + g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL); + } + + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); + + stopping = FALSE; + + for (i = 0; i < n_threads; i++) { + GThread *thread; + GTest *test; + + test = g_array_index (test_objects, GTest *, i); + + thread = g_thread_create ((GThreadFunc) run_thread, test, TRUE, NULL); + g_array_append_val (test_threads, thread); + } + g_usleep (3000000); + + stopping = TRUE; + g_print ("\nstopping\n"); + + /* join all threads */ + for (i = 0; i < n_threads; i++) { + GThread *thread; + + thread = g_array_index (test_threads, GThread *, i); + g_thread_join (thread); + } + + g_print ("stopped\n"); + + for (i = 0; i < n_threads; i++) { + GTest *test; + + test = g_array_index (test_objects, GTest *, i); + + g_assert (test->count == test->dummy); + } + + return 0; +} diff --git a/tests/refcount/properties2.c b/tests/refcount/properties2.c new file mode 100644 index 0000000..bb79105 --- /dev/null +++ b/tests/refcount/properties2.c @@ -0,0 +1,199 @@ +#include +#include +#include + +#define G_TYPE_TEST (my_test_get_type ()) +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST)) +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass)) +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST)) +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) + +enum { + PROP_0, + PROP_DUMMY +}; + +typedef struct _GTest GTest; +typedef struct _GTestClass GTestClass; + +struct _GTest +{ + GObject object; + + gint dummy; +}; + +struct _GTestClass +{ + GObjectClass parent_class; +}; + +static GType my_test_get_type (void); + +static void my_test_class_init (GTestClass * klass); +static void my_test_init (GTest * test); +static void my_test_dispose (GObject * object); +static void my_test_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void my_test_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static GObjectClass *parent_class = NULL; + +static GType +my_test_get_type (void) +{ + static GType test_type = 0; + + if (!test_type) { + static const GTypeInfo test_info = { + sizeof (GTestClass), + NULL, + NULL, + (GClassInitFunc) my_test_class_init, + NULL, + NULL, + sizeof (GTest), + 0, + (GInstanceInitFunc) my_test_init, + NULL + }; + + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", + &test_info, 0); + } + return test_type; +} + +static void +my_test_class_init (GTestClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + gobject_class->dispose = my_test_dispose; + gobject_class->get_property = my_test_get_property; + gobject_class->set_property = my_test_set_property; + + g_object_class_install_property (gobject_class, + PROP_DUMMY, + g_param_spec_int ("dummy", + NULL, + NULL, + 0, G_MAXINT, 0, + G_PARAM_READWRITE)); +} + +static void +my_test_init (GTest * test) +{ + g_print ("init %p\n", test); +} + +static void +my_test_dispose (GObject * object) +{ + GTest *test; + + test = MY_TEST (object); + + g_print ("dispose %p!\n", object); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +my_test_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTest *test; + + test = MY_TEST (object); + + switch (prop_id) + { + case PROP_DUMMY: + g_value_set_int (value, test->dummy); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_test_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTest *test; + + test = MY_TEST (object); + + switch (prop_id) + { + case PROP_DUMMY: + test->dummy = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gint count = 0; + +static void +dummy_notify (GObject *object, + GParamSpec *pspec) +{ + count++; + if (count % 10000 == 0) + g_print ("."); +} + +static void +my_test_do_property (GTest * test) +{ + gint dummy; + + g_object_get (test, "dummy", &dummy, NULL); + g_object_set (test, "dummy", dummy + 1, NULL); +} + +int +main (int argc, char **argv) +{ + gint i; + GTest *test; + + g_thread_init (NULL); + g_print ("START: %s\n", argv[0]); + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); + g_type_init (); + + test = g_object_new (G_TYPE_TEST, NULL); + + g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL); + + g_assert (count == test->dummy); + + for (i=0; i<1000000; i++) { + my_test_do_property (test); + } + + g_assert (count == test->dummy); + + return 0; +} diff --git a/tests/refcount/signals.c b/tests/refcount/signals.c new file mode 100644 index 0000000..1a2a2ba --- /dev/null +++ b/tests/refcount/signals.c @@ -0,0 +1,284 @@ +#include +#include +#include + +#define G_TYPE_TEST (my_test_get_type ()) +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest)) +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST)) +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass)) +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST)) +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) + +static GRand *rand; + +typedef struct _GTest GTest; +typedef struct _GTestClass GTestClass; + +struct _GTest +{ + GObject object; + + gint value; +}; + +struct _GTestClass +{ + GObjectClass parent_class; + + void (*test_signal1) (GTest * test, gint an_int); + void (*test_signal2) (GTest * test, gint an_int); +}; + +static GType my_test_get_type (void); +static volatile gboolean stopping; + +/* Element signals and args */ +enum +{ + TEST_SIGNAL1, + TEST_SIGNAL2, + /* add more above */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_TEST_PROP +}; + +static void my_test_class_init (GTestClass * klass); +static void my_test_init (GTest * test); +static void my_test_dispose (GObject * object); + +static void signal2_handler (GTest * test, gint anint); + +static void my_test_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void my_test_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GObjectClass *parent_class = NULL; + +static guint my_test_signals[LAST_SIGNAL] = { 0 }; + +static GType +my_test_get_type (void) +{ + static GType test_type = 0; + + if (!test_type) { + static const GTypeInfo test_info = { + sizeof (GTestClass), + NULL, + NULL, + (GClassInitFunc) my_test_class_init, + NULL, + NULL, + sizeof (GTest), + 0, + (GInstanceInitFunc) my_test_init, + NULL + }; + + rand = g_rand_new(); + + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", + &test_info, 0); + } + return test_type; +} + +static void +my_test_class_init (GTestClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + if (!g_thread_supported ()) + g_thread_init (NULL); + + gobject_class->dispose = my_test_dispose; + gobject_class->set_property = my_test_set_property; + gobject_class->get_property = my_test_get_property; + + my_test_signals[TEST_SIGNAL1] = + g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL, + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); + my_test_signals[TEST_SIGNAL2] = + g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL, + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP, + g_param_spec_int ("test-prop", "Test Prop", "Test property", + 0, 1, 0, G_PARAM_READWRITE)); + + klass->test_signal2 = signal2_handler; +} + +static void +my_test_init (GTest * test) +{ + g_print ("init %p\n", test); + + test->value = 0; +} + +static void +my_test_dispose (GObject * object) +{ + GTest *test; + + test = MY_TEST (object); + + g_print ("dispose %p!\n", object); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +my_test_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GTest *test; + + test = MY_TEST (object); + + switch (prop_id) { + case ARG_TEST_PROP: + test->value = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_test_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GTest *test; + + test = MY_TEST (object); + + switch (prop_id) { + case ARG_TEST_PROP: + g_value_set_int (value, test->value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_test_do_signal1 (GTest * test) +{ + g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL1], 0, 0); +} + +static void +signal2_handler (GTest * test, gint anint) +{ +} + +static void +my_test_do_signal2 (GTest * test) +{ + g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL2], 0, 0); +} + +static void +my_test_do_prop (GTest * test) +{ + test->value = g_rand_int (rand); + g_object_notify (G_OBJECT (test), "test-prop"); +} + +static gpointer +run_thread (GTest * test) +{ + gint i = 1; + + while (!stopping) { + if (TESTNUM == 1) + my_test_do_signal1 (test); + if (TESTNUM == 2) + my_test_do_signal2 (test); + if (TESTNUM == 3) + my_test_do_prop (test); + if ((i++ % 10000) == 0) { + g_print ("."); + g_thread_yield(); /* force context switch */ + } + } + + return NULL; +} + +static void +notify (GObject *object, GParamSpec *spec, gpointer user_data) +{ + gint value; + + g_object_get (object, "test-prop", &value, NULL); + /*g_print ("+ %d", value);*/ +} + +int +main (int argc, char **argv) +{ + gint i; + GTest *test1, *test2; + GArray *test_threads; + const gint n_threads = 1; + + g_thread_init (NULL); + g_print ("START: %s\n", argv[0]); + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); + g_type_init (); + + test1 = g_object_new (G_TYPE_TEST, NULL); + test2 = g_object_new (G_TYPE_TEST, NULL); + + g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL); + g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL); + g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL); + + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); + + stopping = FALSE; + + for (i = 0; i < n_threads; i++) { + GThread *thread; + + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL); + g_array_append_val (test_threads, thread); + + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL); + g_array_append_val (test_threads, thread); + } + g_usleep (5000000); + + stopping = TRUE; + + g_print ("\nstopping\n"); + + /* join all threads */ + for (i = 0; i < 2 * n_threads; i++) { + GThread *thread; + + thread = g_array_index (test_threads, GThread *, i); + g_thread_join (thread); + } + + g_print ("stopped\n"); + + return 0; +} diff --git a/tests/regex-test.c b/tests/regex-test.c new file mode 100644 index 0000000..6ad9ceb --- /dev/null +++ b/tests/regex-test.c @@ -0,0 +1,2122 @@ +/* + * Copyright (C) 2005 - 2006, Marco Barisione + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "config.h" + +#include +#include +#include "glib.h" + +#ifdef ENABLE_REGEX + +/* U+20AC EURO SIGN (symbol, currency) */ +#define EURO "\xe2\x82\xac" +/* U+00E0 LATIN SMALL LETTER A WITH GRAVE (letter, lowercase) */ +#define AGRAVE "\xc3\xa0" +/* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE (letter, uppercase) */ +#define AGRAVE_UPPER "\xc3\x80" +/* U+00E8 LATIN SMALL LETTER E WITH GRAVE (letter, lowercase) */ +#define EGRAVE "\xc3\xa8" +/* U+00F2 LATIN SMALL LETTER O WITH GRAVE (letter, lowercase) */ +#define OGRAVE "\xc3\xb2" +/* U+014B LATIN SMALL LETTER ENG (letter, lowercase) */ +#define ENG "\xc5\x8b" +/* U+0127 LATIN SMALL LETTER H WITH STROKE (letter, lowercase) */ +#define HSTROKE "\xc4\xa7" +/* U+0634 ARABIC LETTER SHEEN (letter, other) */ +#define SHEEN "\xd8\xb4" +/* U+1374 ETHIOPIC NUMBER THIRTY (number, other) */ +#define ETH30 "\xe1\x8d\xb4" + +/* A random value use to mark untouched integer variables. */ +#define UNTOUCHED -559038737 + +static gboolean noisy = FALSE; +static gboolean abort_on_fail = FALSE; + +#define PASS passed++ +#define FAIL \ + G_STMT_START \ + { \ + failed++; \ + if (abort_on_fail) \ + goto end; \ + } \ + G_STMT_END + +/* A replacement for strcmp that doesn't crash with null pointers. */ +static gboolean +streq (const gchar *s1, const gchar *s2) +{ + if (s1 == NULL && s2 == NULL) + return TRUE; + else if (s1 == NULL) + return FALSE; + else if (s2 == NULL) + return FALSE; + else + return strcmp (s1, s2) == 0; +} + +static void +verbose (const gchar *format, ...) +{ + /* Function copied from glib/tests/patterntest.c by Matthias Clasen. */ + gchar *msg; + va_list args; + + va_start (args, format); + msg = g_strdup_vprintf (format, args); + va_end (args); + + if (noisy) + g_print ("%s", msg); + g_free (msg); +} + +static gboolean +test_new (const gchar *pattern, + GRegexCompileFlags compile_opts, + GRegexMatchFlags match_opts) +{ + GRegex *regex; + + verbose ("compiling \"%s\" \t", pattern); + + regex = g_regex_new (pattern, compile_opts, match_opts, NULL); + if (regex == NULL) + { + g_print ("failed \t(pattern: \"%s\", compile: %d, match %d)\n", + pattern, compile_opts, match_opts); + return FALSE; + } + + if (!streq (g_regex_get_pattern (regex), pattern)) + { + g_print ("failed \t(pattern: \"%s\")\n", + pattern); + g_regex_unref (regex); + return FALSE; + } + + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_NEW(pattern, compile_opts, match_opts) { \ + total++; \ + if (test_new (pattern, compile_opts, match_opts)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_new_fail (const gchar *pattern, + GRegexCompileFlags compile_opts, + GRegexError expected_error) +{ + GRegex *regex; + GError *error = NULL; + + verbose ("compiling \"%s\" (expected a failure) \t", pattern); + + regex = g_regex_new (pattern, compile_opts, 0, &error); + + if (regex != NULL) + { + g_print ("failed \t(pattern: \"%s\", compile: %d)\n", + pattern, compile_opts); + g_regex_unref (regex); + return FALSE; + } + + if (error->code != expected_error) + { + g_print ("failed \t(pattern: \"%s\", compile: %d, got error: %d, " + "expected error: %d)\n", + pattern, compile_opts, error->code, expected_error); + g_error_free (error); + return FALSE; + } + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_NEW_FAIL(pattern, compile_opts, expected_error) { \ + total++; \ + if (test_new_fail (pattern, compile_opts, expected_error)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_match_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_opts, + GRegexMatchFlags match_opts, + gboolean expected) +{ + gboolean match; + + verbose ("matching \"%s\" against \"%s\" \t", string, pattern); + + match = g_regex_match_simple (pattern, string, compile_opts, match_opts); + if (match != expected) + { + g_print ("failed \t(unexpected %s)\n", match ? "match" : "mismatch"); + return FALSE; + } + else + { + verbose ("passed (%s)\n", match ? "match" : "nomatch"); + return TRUE; + } +} + +#define TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) { \ + total++; \ + if (test_match_simple (pattern, string, compile_opts, match_opts, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_match (const gchar *pattern, + GRegexCompileFlags compile_opts, + GRegexMatchFlags match_opts, + const gchar *string, + gssize string_len, + gint start_position, + GRegexMatchFlags match_opts2, + gboolean expected) +{ + GRegex *regex; + gboolean match; + + verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t", + string, pattern, start_position, string_len); + + regex = g_regex_new (pattern, compile_opts, match_opts, NULL); + match = g_regex_match_full (regex, string, string_len, + start_position, match_opts2, NULL, NULL); + if (match != expected) + { + gchar *e1 = g_strescape (pattern, NULL); + gchar *e2 = g_strescape (string, NULL); + g_print ("failed \t(unexpected %s) '%s' against '%s'\n", match ? "match" : "mismatch", e1, e2); + g_free (e1); + g_free (e2); + g_regex_unref (regex); + return FALSE; + } + + if (string_len == -1 && start_position == 0) + { + match = g_regex_match (regex, string, match_opts2, NULL); + if (match != expected) + { + g_print ("failed \t(pattern: \"%s\", string: \"%s\")\n", + pattern, string); + g_regex_unref (regex); + return FALSE; + } + } + + g_regex_unref (regex); + + verbose ("passed (%s)\n", match ? "match" : "nomatch"); + return TRUE; +} + +#define TEST_MATCH(pattern, compile_opts, match_opts, string, \ + string_len, start_position, match_opts2, expected) { \ + total++; \ + if (test_match (pattern, compile_opts, match_opts, string, \ + string_len, start_position, match_opts2, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +struct _Match +{ + gchar *string; + gint start, end; +}; +typedef struct _Match Match; + +static void +free_match (gpointer data, gpointer user_data) +{ + Match *match = data; + if (match == NULL) + return; + g_free (match->string); + g_free (match); +} + +static gboolean +test_match_next (const gchar *pattern, + const gchar *string, + gssize string_len, + gint start_position, + ...) +{ + GRegex *regex; + GMatchInfo *match_info; + va_list args; + GSList *matches = NULL; + GSList *expected = NULL; + GSList *l_exp, *l_match; + gboolean ret = TRUE; + + verbose ("matching \"%s\" against \"%s\" (start: %d, len: %d) \t", + string, pattern, start_position, string_len); + + /* The va_list is a NULL-terminated sequence of: extected matched string, + * expected start and expected end. */ + va_start (args, start_position); + while (TRUE) + { + Match *match; + const gchar *expected_string = va_arg (args, const gchar *); + if (expected_string == NULL) + break; + match = g_new0 (Match, 1); + match->string = g_strdup (expected_string); + match->start = va_arg (args, gint); + match->end = va_arg (args, gint); + expected = g_slist_prepend (expected, match); + } + expected = g_slist_reverse (expected); + va_end (args); + + regex = g_regex_new (pattern, 0, 0, NULL); + + g_regex_match_full (regex, string, string_len, + start_position, 0, &match_info, NULL); + while (g_match_info_matches (match_info)) + { + Match *match = g_new0 (Match, 1); + match->string = g_match_info_fetch (match_info, 0); + match->start = UNTOUCHED; + match->end = UNTOUCHED; + g_match_info_fetch_pos (match_info, 0, &match->start, &match->end); + matches = g_slist_prepend (matches, match); + g_match_info_next (match_info, NULL); + } + g_assert (regex == g_match_info_get_regex (match_info)); + g_assert (string == g_match_info_get_string (match_info)); + g_match_info_free (match_info); + matches = g_slist_reverse (matches); + + if (g_slist_length (matches) != g_slist_length (expected)) + { + gint match_count = g_slist_length (matches); + g_print ("failed \t(got %d %s, expected %d)\n", match_count, + match_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + l_match = matches; + while (l_exp != NULL) + { + Match *exp = l_exp->data; + Match *match = l_match->data; + + if (!streq(exp->string, match->string)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + match->string, exp->string); + ret = FALSE; + goto exit; + } + + if (exp->start != match->start || exp->end != match->end) + { + g_print ("failed \t(got [%d, %d], expected [%d, %d])\n", + match->start, match->end, exp->start, exp->end); + ret = FALSE; + goto exit; + } + + l_exp = g_slist_next (l_exp); + l_match = g_slist_next (l_match); + } + +exit: + if (ret) + { + gint count = g_slist_length (matches); + verbose ("passed (%d %s)\n", count, count == 1 ? "match" : "matches"); + } + + g_regex_unref (regex); + g_slist_foreach (expected, free_match, NULL); + g_slist_free (expected); + g_slist_foreach (matches, free_match, NULL); + g_slist_free (matches); + + return ret; +} + +#define TEST_MATCH_NEXT0(pattern, string, string_len, start_position) { \ + total++; \ + if (test_match_next (pattern, string, string_len, start_position, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_MATCH_NEXT1(pattern, string, string_len, start_position, \ + t1, s1, e1) { \ + total++; \ + if (test_match_next (pattern, string, string_len, start_position, \ + t1, s1, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_MATCH_NEXT2(pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2) { \ + total++; \ + if (test_match_next (pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_MATCH_NEXT3(pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3) { \ + total++; \ + if (test_match_next (pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_MATCH_NEXT4(pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4) { \ + total++; \ + if (test_match_next (pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_match_count (const gchar *pattern, + const gchar *string, + gint start_position, + GRegexMatchFlags match_opts, + gint expected_count) +{ + GRegex *regex; + GMatchInfo *match_info; + gint count; + + verbose ("fetching match count (string: \"%s\", pattern: \"%s\", start: %d) \t", + string, pattern, start_position); + + regex = g_regex_new (pattern, 0, 0, NULL); + + g_regex_match_full (regex, string, -1, start_position, + match_opts, &match_info, NULL); + count = g_match_info_get_match_count (match_info); + + if (count != expected_count) + { + g_print ("failed \t(got %d, expected: %d)\n", count, expected_count); + return FALSE; + } + + g_match_info_free (match_info); + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) { \ + total++; \ + if (test_match_count (pattern, string, start_position, match_opts, expected_count)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_partial (const gchar *pattern, + const gchar *string, + gboolean expected) +{ + GRegex *regex; + GMatchInfo *match_info; + + verbose ("partial matching (string: \"%s\", pattern: \"%s\") \t", + string, pattern); + + regex = g_regex_new (pattern, 0, 0, NULL); + + g_regex_match (regex, string, G_REGEX_MATCH_PARTIAL, &match_info); + if (expected != g_match_info_is_partial_match (match_info)) + { + g_print ("failed \t(got %d, expected: %d)\n", !expected, expected); + g_regex_unref (regex); + return FALSE; + } + + if (expected && g_match_info_fetch_pos (match_info, 0, NULL, NULL)) + { + g_print ("failed \t(got sub-pattern 0)\n"); + g_regex_unref (regex); + return FALSE; + } + + if (expected && g_match_info_fetch_pos (match_info, 1, NULL, NULL)) + { + g_print ("failed \t(got sub-pattern 1)\n"); + g_regex_unref (regex); + return FALSE; + } + + g_match_info_free (match_info); + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_PARTIAL(pattern, string, expected) { \ + total++; \ + if (test_partial (pattern, string, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_sub_pattern (const gchar *pattern, + const gchar *string, + gint start_position, + gint sub_n, + const gchar *expected_sub, + gint expected_start, + gint expected_end) +{ + GRegex *regex; + GMatchInfo *match_info; + gchar *sub_expr; + gint start = UNTOUCHED, end = UNTOUCHED; + + verbose ("fetching sub-pattern %d from \"%s\" (pattern: \"%s\") \t", + sub_n, string, pattern); + + regex = g_regex_new (pattern, 0, 0, NULL); + g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL); + + sub_expr = g_match_info_fetch (match_info, sub_n); + if (!streq(sub_expr, expected_sub)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + sub_expr, expected_sub); + g_free (sub_expr); + g_regex_unref (regex); + return FALSE; + } + g_free (sub_expr); + + g_match_info_fetch_pos (match_info, sub_n, &start, &end); + if (start != expected_start || end != expected_end) + { + g_print ("failed \t(got [%d, %d], expected [%d, %d])\n", + start, end, expected_start, expected_end); + g_regex_unref (regex); + return FALSE; + } + + g_match_info_free (match_info); + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub, \ + expected_start, expected_end) { \ + total++; \ + if (test_sub_pattern (pattern, string, start_position, sub_n, expected_sub, \ + expected_start, expected_end)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_named_sub_pattern (const gchar *pattern, + GRegexCompileFlags flags, + const gchar *string, + gint start_position, + const gchar *sub_name, + const gchar *expected_sub, + gint expected_start, + gint expected_end) +{ + GRegex *regex; + GMatchInfo *match_info; + gint start = UNTOUCHED, end = UNTOUCHED; + gchar *sub_expr; + + verbose ("fetching sub-pattern \"%s\" from \"%s\" (pattern: \"%s\") \t", + sub_name, string, pattern); + + regex = g_regex_new (pattern, flags, 0, NULL); + + g_regex_match_full (regex, string, -1, start_position, 0, &match_info, NULL); + sub_expr = g_match_info_fetch_named (match_info, sub_name); + if (!streq (sub_expr, expected_sub)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + sub_expr, expected_sub); + g_free (sub_expr); + g_regex_unref (regex); + return FALSE; + } + g_free (sub_expr); + + g_match_info_fetch_named_pos (match_info, sub_name, &start, &end); + if (start != expected_start || end != expected_end) + { + g_print ("failed \t(got [%d, %d], expected [%d, %d])\n", + start, end, expected_start, expected_end); + g_regex_unref (regex); + return FALSE; + } + + g_match_info_free (match_info); + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name, \ + expected_sub, expected_start, expected_end) { \ + total++; \ + if (test_named_sub_pattern (pattern, 0, string, start_position, sub_name, \ + expected_sub, expected_start, expected_end)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name, \ + expected_sub, expected_start, expected_end) { \ + total++; \ + if (test_named_sub_pattern (pattern, G_REGEX_DUPNAMES, string, start_position, \ + sub_name, expected_sub, expected_start, expected_end)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_fetch_all (const gchar *pattern, + const gchar *string, + ...) +{ + GRegex *regex; + GMatchInfo *match_info; + va_list args; + GSList *expected = NULL; + GSList *l_exp; + gchar **matches; + gint match_count; + gboolean ret = TRUE; + gint i; + + verbose ("fetching all sub-patterns from \"%s\" (pattern: \"%s\") \t", + string, pattern); + + /* The va_list is a NULL-terminated sequence of extected strings. */ + va_start (args, string); + while (TRUE) + { + gchar *expected_string = va_arg (args, gchar *); + if (expected_string == NULL) + break; + else + expected = g_slist_prepend (expected, g_strdup (expected_string)); + } + expected = g_slist_reverse (expected); + va_end (args); + + regex = g_regex_new (pattern, 0, 0, NULL); + g_regex_match (regex, string, 0, &match_info); + matches = g_match_info_fetch_all (match_info); + if (matches) + match_count = g_strv_length (matches); + else + match_count = 0; + + if (match_count != g_slist_length (expected)) + { + g_print ("failed \t(got %d %s, expected %d)\n", match_count, + match_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + if (!streq(l_exp->data, matches [i])) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + matches [i], (gchar *)l_exp->data); + ret = FALSE; + goto exit; + } + } + + verbose ("passed (%d %s)\n", match_count, + match_count == 1 ? "match" : "matches"); + +exit: + g_match_info_free (match_info); + g_regex_unref (regex); + g_slist_foreach (expected, (GFunc)g_free, NULL); + g_slist_free (expected); + g_strfreev (matches); + + return ret; +} + +#define TEST_FETCH_ALL0(pattern, string) { \ + total++; \ + if (test_fetch_all (pattern, string, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_FETCH_ALL1(pattern, string, e1) { \ + total++; \ + if (test_fetch_all (pattern, string, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_FETCH_ALL2(pattern, string, e1, e2) { \ + total++; \ + if (test_fetch_all (pattern, string, e1, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_FETCH_ALL3(pattern, string, e1, e2, e3) { \ + total++; \ + if (test_fetch_all (pattern, string, e1, e2, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_split_simple (const gchar *pattern, + const gchar *string, + ...) +{ + va_list args; + GSList *expected = NULL; + GSList *l_exp; + gchar **tokens; + gint token_count; + gboolean ret = TRUE; + gint i; + + verbose ("splitting \"%s\" against \"%s\" \t", string, pattern); + + /* The va_list is a NULL-terminated sequence of extected strings. */ + va_start (args, string); + while (TRUE) + { + gchar *expected_string = va_arg (args, gchar *); + if (expected_string == NULL) + break; + else + expected = g_slist_prepend (expected, g_strdup (expected_string)); + } + expected = g_slist_reverse (expected); + va_end (args); + + tokens = g_regex_split_simple (pattern, string, 0, 0); + if (tokens) + token_count = g_strv_length (tokens); + else + token_count = 0; + + if (token_count != g_slist_length (expected)) + { + g_print ("failed \t(got %d %s, expected %d)\n", token_count, + token_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + if (!streq(l_exp->data, tokens [i])) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + tokens[i], (gchar *)l_exp->data); + ret = FALSE; + goto exit; + } + } + + verbose ("passed (%d %s)\n", token_count, + token_count == 1 ? "token" : "tokens"); + +exit: + g_slist_foreach (expected, (GFunc)g_free, NULL); + g_slist_free (expected); + g_strfreev (tokens); + + return ret; +} + +#define TEST_SPLIT_SIMPLE0(pattern, string) { \ + total++; \ + if (test_split_simple (pattern, string, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_SPLIT_SIMPLE1(pattern, string, e1) { \ + total++; \ + if (test_split_simple (pattern, string, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_SPLIT_SIMPLE2(pattern, string, e1, e2) { \ + total++; \ + if (test_split_simple (pattern, string, e1, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +#define TEST_SPLIT_SIMPLE3(pattern, string, e1, e2, e3) { \ + total++; \ + if (test_split_simple (pattern, string, e1, e2, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_split_full (const gchar *pattern, + const gchar *string, + gint start_position, + gint max_tokens, + ...) +{ + GRegex *regex; + va_list args; + GSList *expected = NULL; + GSList *l_exp; + gchar **tokens; + gint token_count; + gboolean ret = TRUE; + gint i; + + verbose ("splitting \"%s\" against \"%s\" (start: %d, max: %d) \t", + string, pattern, start_position, max_tokens); + + /* The va_list is a NULL-terminated sequence of extected strings. */ + va_start (args, max_tokens); + while (TRUE) + { + gchar *expected_string = va_arg (args, gchar *); + if (expected_string == NULL) + break; + else + expected = g_slist_prepend (expected, g_strdup (expected_string)); + } + expected = g_slist_reverse (expected); + va_end (args); + + regex = g_regex_new (pattern, 0, 0, NULL); + tokens = g_regex_split_full (regex, string, -1, start_position, + 0, max_tokens, NULL); + if (tokens) + token_count = g_strv_length (tokens); + else + token_count = 0; + + if (token_count != g_slist_length (expected)) + { + g_print ("failed \t(got %d %s, expected %d)\n", token_count, + token_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + if (!streq(l_exp->data, tokens [i])) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + tokens[i], (gchar *)l_exp->data); + ret = FALSE; + goto exit; + } + } + + verbose ("passed (%d %s)\n", token_count, + token_count == 1 ? "token" : "tokens"); + +exit: + g_regex_unref (regex); + g_slist_foreach (expected, (GFunc)g_free, NULL); + g_slist_free (expected); + g_strfreev (tokens); + + return ret; +} + +static gboolean +test_split (const gchar *pattern, + const gchar *string, + ...) +{ + GRegex *regex; + va_list args; + GSList *expected = NULL; + GSList *l_exp; + gchar **tokens; + gint token_count; + gboolean ret = TRUE; + gint i; + + verbose ("splitting \"%s\" against \"%s\" \t", string, pattern); + + /* The va_list is a NULL-terminated sequence of extected strings. */ + va_start (args, string); + while (TRUE) + { + gchar *expected_string = va_arg (args, gchar *); + if (expected_string == NULL) + break; + else + expected = g_slist_prepend (expected, g_strdup (expected_string)); + } + expected = g_slist_reverse (expected); + va_end (args); + + regex = g_regex_new (pattern, 0, 0, NULL); + tokens = g_regex_split (regex, string, 0); + if (tokens) + token_count = g_strv_length (tokens); + else + token_count = 0; + + if (token_count != g_slist_length (expected)) + { + g_print ("failed \t(got %d %s, expected %d)\n", token_count, + token_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + if (!streq(l_exp->data, tokens [i])) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + tokens[i], (gchar *)l_exp->data); + ret = FALSE; + goto exit; + } + } + + verbose ("passed (%d %s)\n", token_count, + token_count == 1 ? "token" : "tokens"); + +exit: + g_regex_unref (regex); + g_slist_foreach (expected, (GFunc)g_free, NULL); + g_slist_free (expected); + g_strfreev (tokens); + + return ret; +} + +#define TEST_SPLIT0(pattern, string, start_position, max_tokens) { \ + total++; \ + if (test_split_full (pattern, string, start_position, max_tokens, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (start_position == 0 && max_tokens <= 0) \ + { \ + total++; \ + if (test_split (pattern, string, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +#define TEST_SPLIT1(pattern, string, start_position, max_tokens, e1) { \ + total++; \ + if (test_split_full (pattern, string, start_position, max_tokens, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (start_position == 0 && max_tokens <= 0) \ + { \ + total++; \ + if (test_split (pattern, string, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +#define TEST_SPLIT2(pattern, string, start_position, max_tokens, e1, e2) { \ + total++; \ + if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (start_position == 0 && max_tokens <= 0) \ + { \ + total++; \ + if (test_split (pattern, string, e1, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +#define TEST_SPLIT3(pattern, string, start_position, max_tokens, e1, e2, e3) { \ + total++; \ + if (test_split_full (pattern, string, start_position, max_tokens, e1, e2, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (start_position == 0 && max_tokens <= 0) \ + { \ + total++; \ + if (test_split (pattern, string, e1, e2, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +static gboolean +test_check_replacement (const gchar *string_to_expand, + gboolean expected, + gboolean expected_refs) +{ + gboolean result; + gboolean has_refs; + + verbose ("checking replacement string \"%s\" \t", string_to_expand); + + result = g_regex_check_replacement (string_to_expand, &has_refs, NULL); + if (expected != result) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + result ? "TRUE" : "FALSE", + expected ? "TRUE" : "FALSE"); + return FALSE; + } + + if (expected && expected_refs != has_refs) + { + g_print ("failed \t(got has_references \"%s\", expected \"%s\")\n", + has_refs ? "TRUE" : "FALSE", + expected_refs ? "TRUE" : "FALSE"); + return FALSE; + } + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) { \ + total++; \ + if (test_check_replacement (string_to_expand, expected, expected_refs)) \ + PASS; \ + else \ + FAIL; \ +} +static gboolean +test_expand (const gchar *pattern, + const gchar *string, + const gchar *string_to_expand, + gboolean raw, + const gchar *expected) +{ + GRegex *regex = NULL; + GMatchInfo *match_info = NULL; + gchar *res; + + verbose ("expanding the references in \"%s\" (pattern: \"%s\", string: \"%s\") \t", + string_to_expand, + pattern ? pattern : "(null)", + string ? string : "(null)"); + + if (pattern) + { + regex = g_regex_new (pattern, raw ? G_REGEX_RAW : 0, 0, NULL); + g_regex_match (regex, string, 0, &match_info); + } + + res = g_match_info_expand_references (match_info, string_to_expand, NULL); + if (!streq (res, expected)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected); + g_free (res); + g_match_info_free (match_info); + g_regex_unref (regex); + return FALSE; + } + + g_free (res); + g_match_info_free (match_info); + if (regex) + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_EXPAND(pattern, string, string_to_expand, raw, expected) { \ + total++; \ + if (test_expand (pattern, string, string_to_expand, raw, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_replace (const gchar *pattern, + const gchar *string, + gint start_position, + const gchar *replacement, + const gchar *expected) +{ + GRegex *regex; + gchar *res; + + verbose ("replacing \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t", + replacement, string, pattern, start_position); + + regex = g_regex_new (pattern, 0, 0, NULL); + res = g_regex_replace (regex, string, -1, start_position, replacement, 0, NULL); + if (!streq (res, expected)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected); + g_free (res); + g_regex_unref (regex); + return FALSE; + } + + g_free (res); + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_REPLACE(pattern, string, start_position, replacement, expected) { \ + total++; \ + if (test_replace (pattern, string, start_position, replacement, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_replace_lit (const gchar *pattern, + const gchar *string, + gint start_position, + const gchar *replacement, + const gchar *expected) +{ + GRegex *regex; + gchar *res; + + verbose ("replacing literally \"%s\" in \"%s\" (pattern: \"%s\", start: %d) \t", + replacement, string, pattern, start_position); + + regex = g_regex_new (pattern, 0, 0, NULL); + res = g_regex_replace_literal (regex, string, -1, start_position, + replacement, 0, NULL); + if (!streq (res, expected)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", res, expected); + g_free (res); + g_regex_unref (regex); + return FALSE; + } + + g_free (res); + g_regex_unref (regex); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) { \ + total++; \ + if (test_replace_lit (pattern, string, start_position, replacement, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_get_string_number (const gchar *pattern, + const gchar *name, + gint expected_num) +{ + GRegex *regex; + gint num; + + verbose ("getting the number of \"%s\" (pattern: \"%s\") \t", + name, pattern); + + regex = g_regex_new (pattern, 0, 0, NULL); + num = g_regex_get_string_number (regex, name); + g_regex_unref (regex); + + if (num != expected_num) + { + g_print ("failed \t(got %d, expected %d)\n", num, expected_num); + return FALSE; + } + else + { + verbose ("passed\n"); + return TRUE; + } +} + +#define TEST_GET_STRING_NUMBER(pattern, name, expected_num) { \ + total++; \ + if (test_get_string_number (pattern, name, expected_num)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_escape (const gchar *string, + gint length, + const gchar *expected) +{ + gchar *escaped; + + verbose ("escaping \"%s\" (len: %d) \t", string, length); + + escaped = g_regex_escape_string (string, length); + + if (!streq (escaped, expected)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", escaped, expected); + g_free (escaped); + return FALSE; + } + + g_free (escaped); + + verbose ("passed\n"); + return TRUE; +} + +#define TEST_ESCAPE(string, length, expected) { \ + total++; \ + if (test_escape (string, length, expected)) \ + PASS; \ + else \ + FAIL; \ +} + +static gboolean +test_match_all_full (const gchar *pattern, + const gchar *string, + gssize string_len, + gint start_position, + ...) +{ + GRegex *regex; + GMatchInfo *match_info; + va_list args; + GSList *expected = NULL; + GSList *l_exp; + gboolean match_ok; + gboolean ret = TRUE; + gint match_count; + gint i; + + verbose ("matching all in \"%s\" against \"%s\" (start: %d, len: %d) \t", + string, pattern, start_position, string_len); + + /* The va_list is a NULL-terminated sequence of: extected matched string, + * expected start and expected end. */ + va_start (args, start_position); + while (TRUE) + { + Match *match; + const gchar *expected_string = va_arg (args, const gchar *); + if (expected_string == NULL) + break; + match = g_new0 (Match, 1); + match->string = g_strdup (expected_string); + match->start = va_arg (args, gint); + match->end = va_arg (args, gint); + expected = g_slist_prepend (expected, match); + } + expected = g_slist_reverse (expected); + va_end (args); + + regex = g_regex_new (pattern, 0, 0, NULL); + match_ok = g_regex_match_all_full (regex, string, string_len, start_position, + 0, &match_info, NULL); + + if (match_ok && g_slist_length (expected) == 0) + { + g_print ("failed\n"); + ret = FALSE; + goto exit; + } + if (!match_ok && g_slist_length (expected) != 0) + { + g_print ("failed\n"); + ret = FALSE; + goto exit; + } + + match_count = g_match_info_get_match_count (match_info); + if (match_count != g_slist_length (expected)) + { + g_print ("failed \t(got %d %s, expected %d)\n", match_count, + match_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + for (i = 0; i < match_count; i++) + { + gint start, end; + gchar *matched_string; + Match *exp = l_exp->data; + + matched_string = g_match_info_fetch (match_info, i); + g_match_info_fetch_pos (match_info, i, &start, &end); + + if (!streq(exp->string, matched_string)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + matched_string, exp->string); + g_free (matched_string); + ret = FALSE; + goto exit; + } + g_free (matched_string); + + if (exp->start != start || exp->end != end) + { + g_print ("failed \t(got [%d, %d], expected [%d, %d])\n", + start, end, exp->start, exp->end); + ret = FALSE; + goto exit; + } + + l_exp = g_slist_next (l_exp); + } + +exit: + if (ret) + { + verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches"); + } + + g_match_info_free (match_info); + g_regex_unref (regex); + g_slist_foreach (expected, free_match, NULL); + g_slist_free (expected); + + return ret; +} + +static gboolean +test_match_all (const gchar *pattern, + const gchar *string, + ...) +{ + GRegex *regex; + GMatchInfo *match_info; + va_list args; + GSList *expected = NULL; + GSList *l_exp; + gboolean match_ok; + gboolean ret = TRUE; + gint match_count; + gint i; + + verbose ("matching all in \"%s\" against \"%s\" \t", string, pattern); + + /* The va_list is a NULL-terminated sequence of: extected matched string, + * expected start and expected end. */ + va_start (args, string); + while (TRUE) + { + Match *match; + const gchar *expected_string = va_arg (args, const gchar *); + if (expected_string == NULL) + break; + match = g_new0 (Match, 1); + match->string = g_strdup (expected_string); + match->start = va_arg (args, gint); + match->end = va_arg (args, gint); + expected = g_slist_prepend (expected, match); + } + expected = g_slist_reverse (expected); + va_end (args); + + regex = g_regex_new (pattern, 0, 0, NULL); + match_ok = g_regex_match_all (regex, string, 0, &match_info); + + if (match_ok && g_slist_length (expected) == 0) + { + g_print ("failed\n"); + ret = FALSE; + goto exit; + } + if (!match_ok && g_slist_length (expected) != 0) + { + g_print ("failed\n"); + ret = FALSE; + goto exit; + } + + match_count = g_match_info_get_match_count (match_info); + if (match_count != g_slist_length (expected)) + { + g_print ("failed \t(got %d %s, expected %d)\n", match_count, + match_count == 1 ? "match" : "matches", + g_slist_length (expected)); + ret = FALSE; + goto exit; + } + + l_exp = expected; + for (i = 0; i < match_count; i++) + { + gint start, end; + gchar *matched_string; + Match *exp = l_exp->data; + + matched_string = g_match_info_fetch (match_info, i); + g_match_info_fetch_pos (match_info, i, &start, &end); + + if (!streq(exp->string, matched_string)) + { + g_print ("failed \t(got \"%s\", expected \"%s\")\n", + matched_string, exp->string); + g_free (matched_string); + ret = FALSE; + goto exit; + } + g_free (matched_string); + + if (exp->start != start || exp->end != end) + { + g_print ("failed \t(got [%d, %d], expected [%d, %d])\n", + start, end, exp->start, exp->end); + ret = FALSE; + goto exit; + } + + l_exp = g_slist_next (l_exp); + } + +exit: + if (ret) + { + verbose ("passed (%d %s)\n", match_count, match_count == 1 ? "match" : "matches"); + } + + g_match_info_free (match_info); + g_regex_unref (regex); + g_slist_foreach (expected, free_match, NULL); + g_slist_free (expected); + + return ret; +} + +#define TEST_MATCH_ALL0(pattern, string, string_len, start_position) { \ + total++; \ + if (test_match_all_full (pattern, string, string_len, start_position, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (string_len == -1 && start_position == 0) \ + { \ + total++; \ + if (test_match_all (pattern, string, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +#define TEST_MATCH_ALL1(pattern, string, string_len, start_position, \ + t1, s1, e1) { \ + total++; \ + if (test_match_all_full (pattern, string, string_len, start_position, \ + t1, s1, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (string_len == -1 && start_position == 0) \ + { \ + total++; \ + if (test_match_all (pattern, string, t1, s1, e1, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +#define TEST_MATCH_ALL2(pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2) { \ + total++; \ + if (test_match_all_full (pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (string_len == -1 && start_position == 0) \ + { \ + total++; \ + if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +#define TEST_MATCH_ALL3(pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3) { \ + total++; \ + if (test_match_all_full (pattern, string, string_len, start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ + if (string_len == -1 && start_position == 0) \ + { \ + total++; \ + if (test_match_all (pattern, string, t1, s1, e1, t2, s2, e2, t3, s3, e3, NULL)) \ + PASS; \ + else \ + FAIL; \ + } \ +} + +int +main (int argc, char *argv[]) +{ + gint total = 0; + gint passed = 0; + gint failed = 0; + gint i = 0; + + setlocale (LC_ALL, ""); + + for (i = 1; i < argc; i++) + { + if (streq ("--noisy", argv[i])) + noisy = TRUE; + else if (streq ("--abort", argv[i])) + abort_on_fail = TRUE; + } + + g_setenv ("G_DEBUG", "fatal_warnings", TRUE); + + /* TEST_NEW(pattern, compile_opts, match_opts) */ + TEST_NEW("", 0, 0); + TEST_NEW(".*", 0, 0); + TEST_NEW(".*", G_REGEX_OPTIMIZE, 0); + TEST_NEW(".*", G_REGEX_MULTILINE, 0); + TEST_NEW(".*", G_REGEX_DOTALL, 0); + TEST_NEW(".*", G_REGEX_DOTALL, G_REGEX_MATCH_NOTBOL); + TEST_NEW("(123\\d*)[a-zA-Z]+(?P.*)", 0, 0); + TEST_NEW("(123\\d*)[a-zA-Z]+(?P.*)", G_REGEX_CASELESS, 0); + TEST_NEW("(123\\d*)[a-zA-Z]+(?P.*)", G_REGEX_CASELESS | G_REGEX_OPTIMIZE, 0); + TEST_NEW("(?Px)|(?Py)", G_REGEX_DUPNAMES, 0); + TEST_NEW("(?Px)|(?Py)", G_REGEX_DUPNAMES | G_REGEX_OPTIMIZE, 0); + /* This gives "internal error: code overflow" with pcre 6.0 */ + TEST_NEW("(?i)(?-i)", 0, 0); + + /* TEST_NEW_FAIL(pattern, compile_opts, expected_error) */ + TEST_NEW_FAIL("(", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS); + TEST_NEW_FAIL(")", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS); + TEST_NEW_FAIL("[", 0, G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS); + TEST_NEW_FAIL("*", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT); + TEST_NEW_FAIL("?", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT); + TEST_NEW_FAIL("(?Px)|(?Py)", 0, G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME); + + /* TEST_MATCH_SIMPLE(pattern, string, compile_opts, match_opts, expected) */ + TEST_MATCH_SIMPLE("a", "", 0, 0, FALSE); + TEST_MATCH_SIMPLE("a", "a", 0, 0, TRUE); + TEST_MATCH_SIMPLE("a", "ba", 0, 0, TRUE); + TEST_MATCH_SIMPLE("^a", "ba", 0, 0, FALSE); + TEST_MATCH_SIMPLE("a", "ba", G_REGEX_ANCHORED, 0, FALSE); + TEST_MATCH_SIMPLE("a", "ba", 0, G_REGEX_MATCH_ANCHORED, FALSE); + TEST_MATCH_SIMPLE("a", "ab", G_REGEX_ANCHORED, 0, TRUE); + TEST_MATCH_SIMPLE("a", "ab", 0, G_REGEX_MATCH_ANCHORED, TRUE); + TEST_MATCH_SIMPLE("a", "a", G_REGEX_CASELESS, 0, TRUE); + TEST_MATCH_SIMPLE("a", "A", G_REGEX_CASELESS, 0, TRUE); + /* These are needed to test extended properties. */ + TEST_MATCH_SIMPLE(AGRAVE, AGRAVE, G_REGEX_CASELESS, 0, TRUE); + TEST_MATCH_SIMPLE(AGRAVE, AGRAVE_UPPER, G_REGEX_CASELESS, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{L}", "a", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{L}", "1", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{L}", AGRAVE, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{L}", AGRAVE_UPPER, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{L}", SHEEN, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{L}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ll}", "a", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Ll}", AGRAVE_UPPER, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ll}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Sc}", AGRAVE, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Sc}", EURO, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Sc}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{N}", "a", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{N}", "1", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{N}", AGRAVE, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{N}", AGRAVE_UPPER, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{N}", SHEEN, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{N}", ETH30, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Nd}", "a", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Nd}", "1", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Nd}", AGRAVE_UPPER, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Nd}", SHEEN, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Nd}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Common}", SHEEN, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Common}", "a", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Common}", AGRAVE_UPPER, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Common}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Common}", "%", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Common}", "1", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Arabic}", SHEEN, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Arabic}", "a", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Arabic}", AGRAVE_UPPER, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Arabic}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Arabic}", "%", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Arabic}", "1", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Latin}", SHEEN, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Latin}", "a", 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Latin}", AGRAVE_UPPER, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Latin}", ETH30, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Latin}", "%", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Latin}", "1", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", SHEEN, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", "a", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", AGRAVE_UPPER, 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", ETH30, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", "%", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{Ethiopic}", "1", 0, 0, FALSE); + TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Arabic})", SHEEN, 0, 0, TRUE); + TEST_MATCH_SIMPLE("\\p{L}(?<=\\p{Latin})", SHEEN, 0, 0, FALSE); + /* Invalid patterns. */ + TEST_MATCH_SIMPLE("\\", "a", 0, 0, FALSE); + TEST_MATCH_SIMPLE("[", "", 0, 0, FALSE); + + /* TEST_MATCH(pattern, compile_opts, match_opts, string, + * string_len, start_position, match_opts2, expected) */ + TEST_MATCH("a", 0, 0, "a", -1, 0, 0, TRUE); + TEST_MATCH("a", 0, 0, "A", -1, 0, 0, FALSE); + TEST_MATCH("a", G_REGEX_CASELESS, 0, "A", -1, 0, 0, TRUE); + TEST_MATCH("a", 0, 0, "ab", -1, 1, 0, FALSE); + TEST_MATCH("a", 0, 0, "ba", 1, 0, 0, FALSE); + TEST_MATCH("a", 0, 0, "bab", -1, 0, 0, TRUE); + TEST_MATCH("a", 0, 0, "b", -1, 0, 0, FALSE); + TEST_MATCH("a", 0, G_REGEX_ANCHORED, "a", -1, 0, 0, TRUE); + TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ab", -1, 1, 0, FALSE); + TEST_MATCH("a", 0, G_REGEX_ANCHORED, "ba", 1, 0, 0, FALSE); + TEST_MATCH("a", 0, G_REGEX_ANCHORED, "bab", -1, 0, 0, FALSE); + TEST_MATCH("a", 0, G_REGEX_ANCHORED, "b", -1, 0, 0, FALSE); + TEST_MATCH("a", 0, 0, "a", -1, 0, G_REGEX_ANCHORED, TRUE); + TEST_MATCH("a", 0, 0, "ab", -1, 1, G_REGEX_ANCHORED, FALSE); + TEST_MATCH("a", 0, 0, "ba", 1, 0, G_REGEX_ANCHORED, FALSE); + TEST_MATCH("a", 0, 0, "bab", -1, 0, G_REGEX_ANCHORED, FALSE); + TEST_MATCH("a", 0, 0, "b", -1, 0, G_REGEX_ANCHORED, FALSE); + TEST_MATCH("a|b", 0, 0, "a", -1, 0, 0, TRUE); + TEST_MATCH("\\d", 0, 0, EURO, -1, 0, 0, FALSE); + TEST_MATCH("^.$", 0, 0, EURO, -1, 0, 0, TRUE); + TEST_MATCH("^.{3}$", 0, 0, EURO, -1, 0, 0, FALSE); + TEST_MATCH("^.$", G_REGEX_RAW, 0, EURO, -1, 0, 0, FALSE); + TEST_MATCH("^.{3}$", G_REGEX_RAW, 0, EURO, -1, 0, 0, TRUE); + TEST_MATCH(AGRAVE, G_REGEX_CASELESS, 0, AGRAVE_UPPER, -1, 0, 0, TRUE); + + /* New lines handling. */ + TEST_MATCH("^a\\Rb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE); + TEST_MATCH("^a\\Rb$", 0, 0, "a\nb", -1, 0, 0, TRUE); + TEST_MATCH("^a\\Rb$", 0, 0, "a\rb", -1, 0, 0, TRUE); + TEST_MATCH("^a\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, FALSE); + TEST_MATCH("^a\\R\\Rb$", 0, 0, "a\n\rb", -1, 0, 0, TRUE); + TEST_MATCH("^a\\nb$", 0, 0, "a\r\nb", -1, 0, 0, FALSE); + TEST_MATCH("^a\\r\\nb$", 0, 0, "a\r\nb", -1, 0, 0, TRUE); + + TEST_MATCH("^b$", 0, 0, "a\nb\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\nb\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, 0, "a\rb\rc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\nb\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\nb\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\nb\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\r\nb\r\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\r\nb\r\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, 0, "a\rb\rc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_LF, 0, "a\rb\rc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CRLF, 0, "a\rb\rc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\nb\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\nb\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\r\nb\r\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\r\nb\r\nc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CR, "a\rb\rc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE); + + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\nb\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\rb\rc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_ANY, "a\r\nb\r\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\nb\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_LF, "a\rb\rc", -1, 0, 0, FALSE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\r\nb\r\nc", -1, 0, 0, TRUE); + TEST_MATCH("^b$", G_REGEX_MULTILINE | G_REGEX_NEWLINE_CR, G_REGEX_MATCH_NEWLINE_CRLF, "a\rb\rc", -1, 0, 0, FALSE); + + TEST_MATCH("a#\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE); + TEST_MATCH("a#\r\nb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE); + TEST_MATCH("a#\rb", G_REGEX_EXTENDED, 0, "a", -1, 0, 0, FALSE); + TEST_MATCH("a#\nb", G_REGEX_EXTENDED, G_REGEX_MATCH_NEWLINE_CR, "a", -1, 0, 0, FALSE); + TEST_MATCH("a#\nb", G_REGEX_EXTENDED | G_REGEX_NEWLINE_CR, 0, "a", -1, 0, 0, TRUE); + + /* TEST_MATCH_NEXT#(pattern, string, string_len, start_position, ...) */ + TEST_MATCH_NEXT0("a", "x", -1, 0); + TEST_MATCH_NEXT0("a", "ax", -1, 1); + TEST_MATCH_NEXT0("a", "xa", 1, 0); + TEST_MATCH_NEXT0("a", "axa", 1, 2); + TEST_MATCH_NEXT1("a", "a", -1, 0, "a", 0, 1); + TEST_MATCH_NEXT1("a", "xax", -1, 0, "a", 1, 2); + TEST_MATCH_NEXT1(EURO, ENG EURO, -1, 0, EURO, 2, 5); + TEST_MATCH_NEXT1("a*", "", -1, 0, "", 0, 0); + TEST_MATCH_NEXT2("a*", "aa", -1, 0, "aa", 0, 2, "", 2, 2); + TEST_MATCH_NEXT2(EURO "*", EURO EURO, -1, 0, EURO EURO, 0, 6, "", 6, 6); + TEST_MATCH_NEXT2("a", "axa", -1, 0, "a", 0, 1, "a", 2, 3); + TEST_MATCH_NEXT2("a+", "aaxa", -1, 0, "aa", 0, 2, "a", 3, 4); + TEST_MATCH_NEXT2("a", "aa", -1, 0, "a", 0, 1, "a", 1, 2); + TEST_MATCH_NEXT2("a", "ababa", -1, 2, "a", 2, 3, "a", 4, 5); + TEST_MATCH_NEXT2(EURO "+", EURO "-" EURO, -1, 0, EURO, 0, 3, EURO, 4, 7); + TEST_MATCH_NEXT3("", "ab", -1, 0, "", 0, 0, "", 1, 1, "", 2, 2); + TEST_MATCH_NEXT3("", AGRAVE "b", -1, 0, "", 0, 0, "", 2, 2, "", 3, 3); + TEST_MATCH_NEXT3("a", "aaxa", -1, 0, "a", 0, 1, "a", 1, 2, "a", 3, 4); + TEST_MATCH_NEXT3("a", "aa" OGRAVE "a", -1, 0, "a", 0, 1, "a", 1, 2, "a", 4, 5); + TEST_MATCH_NEXT3("a*", "aax", -1, 0, "aa", 0, 2, "", 2, 2, "", 3, 3); + TEST_MATCH_NEXT3("(?=[A-Z0-9])", "RegExTest", -1, 0, "", 0, 0, "", 3, 3, "", 5, 5); + TEST_MATCH_NEXT4("a*", "aaxa", -1, 0, "aa", 0, 2, "", 2, 2, "a", 3, 4, "", 4, 4); + + /* TEST_MATCH_COUNT(pattern, string, start_position, match_opts, expected_count) */ + TEST_MATCH_COUNT("a", "", 0, 0, 0); + TEST_MATCH_COUNT("a", "a", 0, 0, 1); + TEST_MATCH_COUNT("a", "a", 1, 0, 0); + TEST_MATCH_COUNT("(.)", "a", 0, 0, 2); + TEST_MATCH_COUNT("(.)", EURO, 0, 0, 2); + TEST_MATCH_COUNT("(?:.)", "a", 0, 0, 1); + TEST_MATCH_COUNT("(?P.)", "a", 0, 0, 2); + TEST_MATCH_COUNT("a$", "a", 0, G_REGEX_MATCH_NOTEOL, 0); + TEST_MATCH_COUNT("(a)?(b)", "b", 0, 0, 3); + TEST_MATCH_COUNT("(a)?(b)", "ab", 0, 0, 3); + + /* TEST_PARTIAL(pattern, string, expected) */ + TEST_PARTIAL("^ab", "a", TRUE); + TEST_PARTIAL("^ab", "xa", FALSE); + TEST_PARTIAL("ab", "xa", TRUE); + TEST_PARTIAL("ab", "ab", FALSE); /* normal match. */ + TEST_PARTIAL("a+b", "aa", FALSE); /* PCRE_ERROR_BAD_PARTIAL */ + TEST_PARTIAL("(a)+b", "aa", TRUE); + TEST_PARTIAL("a?b", "a", TRUE); + + /* TEST_SUB_PATTERN(pattern, string, start_position, sub_n, expected_sub, + * expected_start, expected_end) */ + TEST_SUB_PATTERN("a", "a", 0, 0, "a", 0, 1); + TEST_SUB_PATTERN("a(.)", "ab", 0, 1, "b", 1, 2); + TEST_SUB_PATTERN("a(.)", "a" EURO, 0, 1, EURO, 1, 4); + TEST_SUB_PATTERN("(?:.*)(a)(.)", "xxa" ENG, 0, 2, ENG, 3, 5); + TEST_SUB_PATTERN("(" HSTROKE ")", "a" HSTROKE ENG, 0, 1, HSTROKE, 1, 3); + TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED); + TEST_SUB_PATTERN("a", "a", 0, 1, NULL, UNTOUCHED, UNTOUCHED); + TEST_SUB_PATTERN("(a)?(b)", "b", 0, 0, "b", 0, 1); + TEST_SUB_PATTERN("(a)?(b)", "b", 0, 1, "", -1, -1); + TEST_SUB_PATTERN("(a)?(b)", "b", 0, 2, "b", 0, 1); + + /* TEST_NAMED_SUB_PATTERN(pattern, string, start_position, sub_name, + * expected_sub, expected_start, expected_end) */ + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", "ab", 0, "A", "b", 1, 2); + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", "aab", 1, "A", "b", 2, 3); + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", EURO "ab", 0, "A", "b", 4, 5); + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", EURO "ab", 0, "B", NULL, UNTOUCHED, UNTOUCHED); + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", EURO "ab", 0, "C", NULL, UNTOUCHED, UNTOUCHED); + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", "a" EGRAVE "x", 0, "A", EGRAVE, 1, 3); + TEST_NAMED_SUB_PATTERN("a(?P.)(?P.)?", "a" EGRAVE "x", 0, "B", "x", 3, 4); + TEST_NAMED_SUB_PATTERN("(?Pa)?(?Pb)", "b", 0, "A", "", -1, -1); + TEST_NAMED_SUB_PATTERN("(?Pa)?(?Pb)", "b", 0, "B", "b", 0, 1); + + /* TEST_NAMED_SUB_PATTERN_DUPNAMES(pattern, string, start_position, sub_name, + * expected_sub, expected_start, expected_end) */ + TEST_NAMED_SUB_PATTERN_DUPNAMES("(?Pa)|(?Pb)", "ab", 0, "N", "a", 0, 1); + TEST_NAMED_SUB_PATTERN_DUPNAMES("(?Paa)|(?Pa)", "aa", 0, "N", "aa", 0, 2); + TEST_NAMED_SUB_PATTERN_DUPNAMES("(?Paa)(?Pa)", "aaa", 0, "N", "aa", 0, 2); + TEST_NAMED_SUB_PATTERN_DUPNAMES("(?Px)|(?Pa)", "a", 0, "N", "a", 0, 1); + TEST_NAMED_SUB_PATTERN_DUPNAMES("(?Px)y|(?Pa)b", "ab", 0, "N", "a", 0, 1); + + /* DUPNAMES option inside the pattern */ + TEST_NAMED_SUB_PATTERN("(?J)(?Pa)|(?Pb)", "ab", 0, "N", "a", 0, 1); + TEST_NAMED_SUB_PATTERN("(?J)(?Paa)|(?Pa)", "aa", 0, "N", "aa", 0, 2); + TEST_NAMED_SUB_PATTERN("(?J)(?Paa)(?Pa)", "aaa", 0, "N", "aa", 0, 2); + TEST_NAMED_SUB_PATTERN("(?J)(?Px)|(?Pa)", "a", 0, "N", "a", 0, 1); + TEST_NAMED_SUB_PATTERN("(?J)(?Px)y|(?Pa)b", "ab", 0, "N", "a", 0, 1); + + /* TEST_FETCH_ALL#(pattern, string, ...) */ + TEST_FETCH_ALL0("a", ""); + TEST_FETCH_ALL0("a", "b"); + TEST_FETCH_ALL1("a", "a", "a"); + TEST_FETCH_ALL1("a+", "aa", "aa"); + TEST_FETCH_ALL1("(?:a)", "a", "a"); + TEST_FETCH_ALL2("(a)", "a", "a", "a"); + TEST_FETCH_ALL2("a(.)", "ab", "ab", "b"); + TEST_FETCH_ALL2("a(.)", "a" HSTROKE, "a" HSTROKE, HSTROKE); + TEST_FETCH_ALL3("(?:.*)(a)(.)", "xyazk", "xyaz", "a", "z"); + TEST_FETCH_ALL3("(?P.)(a)", "xa", "xa", "x", "a"); + TEST_FETCH_ALL3("(?P.)(a)", ENG "a", ENG "a", ENG, "a"); + TEST_FETCH_ALL3("(a)?(b)", "b", "b", "", "b"); + TEST_FETCH_ALL3("(a)?(b)", "ab", "ab", "a", "b"); + + /* TEST_SPLIT_SIMPLE#(pattern, string, ...) */ + TEST_SPLIT_SIMPLE0("", ""); + TEST_SPLIT_SIMPLE0("a", ""); + TEST_SPLIT_SIMPLE1(",", "a", "a"); + TEST_SPLIT_SIMPLE1("(,)\\s*", "a", "a"); + TEST_SPLIT_SIMPLE2(",", "a,b", "a", "b"); + TEST_SPLIT_SIMPLE3(",", "a,b,c", "a", "b", "c"); + TEST_SPLIT_SIMPLE3(",\\s*", "a,b,c", "a", "b", "c"); + TEST_SPLIT_SIMPLE3(",\\s*", "a, b, c", "a", "b", "c"); + TEST_SPLIT_SIMPLE3("(,)\\s*", "a,b", "a", ",", "b"); + TEST_SPLIT_SIMPLE3("(,)\\s*", "a, b", "a", ",", "b"); + /* Not matched sub-strings. */ + TEST_SPLIT_SIMPLE2("a|(b)", "xay", "x", "y"); + TEST_SPLIT_SIMPLE3("a|(b)", "xby", "x", "b", "y"); + /* Empty matches. */ + TEST_SPLIT_SIMPLE3("", "abc", "a", "b", "c"); + TEST_SPLIT_SIMPLE3(" *", "ab c", "a", "b", "c"); + /* Invalid patterns. */ + TEST_SPLIT_SIMPLE0("\\", ""); + TEST_SPLIT_SIMPLE0("[", ""); + + /* TEST_SPLIT#(pattern, string, start_position, max_tokens, ...) */ + TEST_SPLIT0("", "", 0, 0); + TEST_SPLIT0("a", "", 0, 0); + TEST_SPLIT0("a", "", 0, 1); + TEST_SPLIT0("a", "", 0, 2); + TEST_SPLIT0("a", "a", 1, 0); + TEST_SPLIT1(",", "a", 0, 0, "a"); + TEST_SPLIT1(",", "a,b", 0, 1, "a,b"); + TEST_SPLIT1("(,)\\s*", "a", 0, 0, "a"); + TEST_SPLIT1(",", "a,b", 2, 0, "b"); + TEST_SPLIT2(",", "a,b", 0, 0, "a", "b"); + TEST_SPLIT2(",", "a,b,c", 0, 2, "a", "b,c"); + TEST_SPLIT2(",", "a,b", 1, 0, "", "b"); + TEST_SPLIT2(",", "a,", 0, 0, "a", ""); + TEST_SPLIT3(",", "a,b,c", 0, 0, "a", "b", "c"); + TEST_SPLIT3(",\\s*", "a,b,c", 0, 0, "a", "b", "c"); + TEST_SPLIT3(",\\s*", "a, b, c", 0, 0, "a", "b", "c"); + TEST_SPLIT3("(,)\\s*", "a,b", 0, 0, "a", ",", "b"); + TEST_SPLIT3("(,)\\s*", "a, b", 0, 0, "a", ",", "b"); + /* Not matched sub-strings. */ + TEST_SPLIT2("a|(b)", "xay", 0, 0, "x", "y"); + TEST_SPLIT3("a|(b)", "xby", 0, -1, "x", "b", "y"); + /* Empty matches. */ + TEST_SPLIT2(" *", "ab c", 1, 0, "b", "c"); + TEST_SPLIT3("", "abc", 0, 0, "a", "b", "c"); + TEST_SPLIT3(" *", "ab c", 0, 0, "a", "b", "c"); + TEST_SPLIT1(" *", "ab c", 0, 1, "ab c"); + TEST_SPLIT2(" *", "ab c", 0, 2, "a", "b c"); + TEST_SPLIT3(" *", "ab c", 0, 3, "a", "b", "c"); + TEST_SPLIT3(" *", "ab c", 0, 4, "a", "b", "c"); + + /* TEST_CHECK_REPLACEMENT(string_to_expand, expected, expected_refs) */ + TEST_CHECK_REPLACEMENT("", TRUE, FALSE); + TEST_CHECK_REPLACEMENT("a", TRUE, FALSE); + TEST_CHECK_REPLACEMENT("\\t\\n\\v\\r\\f\\a\\b\\\\\\x{61}", TRUE, FALSE); + TEST_CHECK_REPLACEMENT("\\0", TRUE, TRUE); + TEST_CHECK_REPLACEMENT("\\n\\2", TRUE, TRUE); + TEST_CHECK_REPLACEMENT("\\g", TRUE, TRUE); + /* Invalid strings */ + TEST_CHECK_REPLACEMENT("\\Q", FALSE, FALSE); + TEST_CHECK_REPLACEMENT("x\\Ay", FALSE, FALSE); + + /* TEST_EXPAND(pattern, string, string_to_expand, raw, expected) */ + TEST_EXPAND("a", "a", "", FALSE, ""); + TEST_EXPAND("a", "a", "\\0", FALSE, "a"); + TEST_EXPAND("a", "a", "\\1", FALSE, ""); + TEST_EXPAND("(a)", "ab", "\\1", FALSE, "a"); + TEST_EXPAND("(a)", "a", "\\1", FALSE, "a"); + TEST_EXPAND("(a)", "a", "\\g<1>", FALSE, "a"); + TEST_EXPAND("a", "a", "\\0130", FALSE, "X"); + TEST_EXPAND("a", "a", "\\\\\\0", FALSE, "\\a"); + TEST_EXPAND("a(?P.)c", "xabcy", "X\\gX", FALSE, "XbX"); + TEST_EXPAND("(.)(?P<1>.)", "ab", "\\1", FALSE, "a"); + TEST_EXPAND("(.)(?P<1>.)", "ab", "\\g<1>", FALSE, "a"); + TEST_EXPAND(".", EURO, "\\0", FALSE, EURO); + TEST_EXPAND("(.)", EURO, "\\1", FALSE, EURO); + TEST_EXPAND("(?P.)", EURO, "\\g", FALSE, EURO); + TEST_EXPAND(".", "a", EURO, FALSE, EURO); + TEST_EXPAND(".", "a", EURO "\\0", FALSE, EURO "a"); + TEST_EXPAND(".", "", "\\Lab\\Ec", FALSE, "abc"); + TEST_EXPAND(".", "", "\\LaB\\EC", FALSE, "abC"); + TEST_EXPAND(".", "", "\\Uab\\Ec", FALSE, "ABc"); + TEST_EXPAND(".", "", "a\\ubc", FALSE, "aBc"); + TEST_EXPAND(".", "", "a\\lbc", FALSE, "abc"); + TEST_EXPAND(".", "", "A\\uBC", FALSE, "ABC"); + TEST_EXPAND(".", "", "A\\lBC", FALSE, "AbC"); + TEST_EXPAND(".", "", "A\\l\\\\BC", FALSE, "A\\BC"); + TEST_EXPAND(".", "", "\\L" AGRAVE "\\E", FALSE, AGRAVE); + TEST_EXPAND(".", "", "\\U" AGRAVE "\\E", FALSE, AGRAVE_UPPER); + TEST_EXPAND(".", "", "\\u" AGRAVE "a", FALSE, AGRAVE_UPPER "a"); + TEST_EXPAND(".", "ab", "x\\U\\0y\\Ez", FALSE, "xAYz"); + TEST_EXPAND(".(.)", "AB", "x\\L\\1y\\Ez", FALSE, "xbyz"); + TEST_EXPAND(".", "ab", "x\\u\\0y\\Ez", FALSE, "xAyz"); + TEST_EXPAND(".(.)", "AB", "x\\l\\1y\\Ez", FALSE, "xbyz"); + TEST_EXPAND(".(.)", "a" AGRAVE_UPPER, "x\\l\\1y", FALSE, "x" AGRAVE "y"); + TEST_EXPAND("a", "bab", "\\x{61}", FALSE, "a"); + TEST_EXPAND("a", "bab", "\\x61", FALSE, "a"); + TEST_EXPAND("a", "bab", "\\x5a", FALSE, "Z"); + TEST_EXPAND("a", "bab", "\\0\\x5A", FALSE, "aZ"); + TEST_EXPAND("a", "bab", "\\1\\x{5A}", FALSE, "Z"); + TEST_EXPAND("a", "bab", "\\x{00E0}", FALSE, AGRAVE); + TEST_EXPAND("", "bab", "\\x{0634}", FALSE, SHEEN); + TEST_EXPAND("", "bab", "\\x{634}", FALSE, SHEEN); + TEST_EXPAND("", "", "\\t", FALSE, "\t"); + TEST_EXPAND("", "", "\\v", FALSE, "\v"); + TEST_EXPAND("", "", "\\r", FALSE, "\r"); + TEST_EXPAND("", "", "\\n", FALSE, "\n"); + TEST_EXPAND("", "", "\\f", FALSE, "\f"); + TEST_EXPAND("", "", "\\a", FALSE, "\a"); + TEST_EXPAND("", "", "\\b", FALSE, "\b"); + TEST_EXPAND("a(.)", "abc", "\\0\\b\\1", FALSE, "ab\bb"); + TEST_EXPAND("a(.)", "abc", "\\0141", FALSE, "a"); + TEST_EXPAND("a(.)", "abc", "\\078", FALSE, "\a8"); + TEST_EXPAND("a(.)", "abc", "\\077", FALSE, "?"); + TEST_EXPAND("a(.)", "abc", "\\0778", FALSE, "?8"); + TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", FALSE, AGRAVE); + TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\1", TRUE, "\xc3"); + TEST_EXPAND("a(.)", "a" AGRAVE "b", "\\0", TRUE, "a\xc3"); + /* Invalid strings. */ + TEST_EXPAND("", "", "\\Q", FALSE, NULL); + TEST_EXPAND("", "", "x\\Ay", FALSE, NULL); + TEST_EXPAND("", "", "\\g<", FALSE, NULL); + TEST_EXPAND("", "", "\\g<>", FALSE, NULL); + TEST_EXPAND("", "", "\\g<1a>", FALSE, NULL); + TEST_EXPAND("", "", "\\g", FALSE, NULL); + TEST_EXPAND("", "", "\\", FALSE, NULL); + TEST_EXPAND("a", "a", "\\x{61", FALSE, NULL); + TEST_EXPAND("a", "a", "\\x6X", FALSE, NULL); + /* Pattern-less. */ + TEST_EXPAND(NULL, NULL, "", FALSE, ""); + TEST_EXPAND(NULL, NULL, "\\n", FALSE, "\n"); + /* Invalid strings */ + TEST_EXPAND(NULL, NULL, "\\Q", FALSE, NULL); + TEST_EXPAND(NULL, NULL, "x\\Ay", FALSE, NULL); + + /* TEST_REPLACE(pattern, string, start_position, replacement, expected) */ + TEST_REPLACE("a", "ababa", 0, "A", "AbAbA"); + TEST_REPLACE("a", "ababa", 1, "A", "abAbA"); + TEST_REPLACE("a", "ababa", 2, "A", "abAbA"); + TEST_REPLACE("a", "ababa", 3, "A", "ababA"); + TEST_REPLACE("a", "ababa", 4, "A", "ababA"); + TEST_REPLACE("a", "ababa", 5, "A", "ababa"); + TEST_REPLACE("a", "ababa", 6, "A", "ababa"); + TEST_REPLACE("a", "abababa", 2, "A", "abAbAbA"); + TEST_REPLACE("a", "abab", 0, "A", "AbAb"); + TEST_REPLACE("a", "baba", 0, "A", "bAbA"); + TEST_REPLACE("a", "bab", 0, "A", "bAb"); + TEST_REPLACE("$^", "abc", 0, "X", "abc"); + TEST_REPLACE("(.)a", "ciao", 0, "a\\1", "caio"); + TEST_REPLACE("a.", "abc", 0, "\\0\\0", "ababc"); + TEST_REPLACE("a", "asd", 0, "\\0101", "Asd"); + TEST_REPLACE("(a).\\1", "aba cda", 0, "\\1\\n", "a\n cda"); + TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x"); + TEST_REPLACE("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE); + TEST_REPLACE("[^-]", "-" EURO "-x-" HSTROKE, 0, "a", "-a-a-a"); + TEST_REPLACE("[^-]", "-" EURO "-" HSTROKE, 0, "a\\g<0>a", "-a" EURO "a-a" HSTROKE "a"); + TEST_REPLACE("-", "-" EURO "-" HSTROKE, 0, "", EURO HSTROKE); + TEST_REPLACE(".*", "hello", 0, "\\U\\0\\E", "HELLO"); + TEST_REPLACE(".*", "hello", 0, "\\u\\0", "Hello"); + TEST_REPLACE("\\S+", "hello world", 0, "\\U-\\0-", "-HELLO- -WORLD-"); + TEST_REPLACE(".", "a", 0, "\\A", NULL); + TEST_REPLACE(".", "a", 0, "\\g", NULL); + + /* TEST_REPLACE_LIT(pattern, string, start_position, replacement, expected) */ + TEST_REPLACE_LIT("a", "ababa", 0, "A", "AbAbA"); + TEST_REPLACE_LIT("a", "ababa", 1, "A", "abAbA"); + TEST_REPLACE_LIT("a", "ababa", 2, "A", "abAbA"); + TEST_REPLACE_LIT("a", "ababa", 3, "A", "ababA"); + TEST_REPLACE_LIT("a", "ababa", 4, "A", "ababA"); + TEST_REPLACE_LIT("a", "ababa", 5, "A", "ababa"); + TEST_REPLACE_LIT("a", "ababa", 6, "A", "ababa"); + TEST_REPLACE_LIT("a", "abababa", 2, "A", "abAbAbA"); + TEST_REPLACE_LIT("a", "abcadaa", 0, "A", "AbcAdAA"); + TEST_REPLACE_LIT("$^", "abc", 0, "X", "abc"); + TEST_REPLACE_LIT("(.)a", "ciao", 0, "a\\1", "ca\\1o"); + TEST_REPLACE_LIT("a.", "abc", 0, "\\0\\0\\n", "\\0\\0\\nc"); + TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, "x", "x"); + TEST_REPLACE_LIT("a" AGRAVE "a", "a" AGRAVE "a", 0, OGRAVE, OGRAVE); + TEST_REPLACE_LIT(AGRAVE, "-" AGRAVE "-" HSTROKE, 0, "a" ENG "a", "-a" ENG "a-" HSTROKE); + TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "a", "-a-a-a"); + TEST_REPLACE_LIT("[^-]", "-" EURO "-" AGRAVE, 0, "a\\g<0>a", "-a\\g<0>a-a\\g<0>a"); + TEST_REPLACE_LIT("-", "-" EURO "-" AGRAVE "-" HSTROKE, 0, "", EURO AGRAVE HSTROKE); + TEST_REPLACE_LIT("(?=[A-Z0-9])", "RegExTest", 0, "_", "_Reg_Ex_Test"); + TEST_REPLACE_LIT("(?=[A-Z0-9])", "RegExTest", 1, "_", "Reg_Ex_Test"); + + /* TEST_GET_STRING_NUMBER(pattern, name, expected_num) */ + TEST_GET_STRING_NUMBER("", "A", -1); + TEST_GET_STRING_NUMBER("(?P.)", "A", 1); + TEST_GET_STRING_NUMBER("(?P.)", "B", -1); + TEST_GET_STRING_NUMBER("(?P.)(?Pa)", "A", 1); + TEST_GET_STRING_NUMBER("(?P.)(?Pa)", "B", 2); + TEST_GET_STRING_NUMBER("(?P.)(?Pa)", "C", -1); + TEST_GET_STRING_NUMBER("(?P.)(.)(?Pa)", "A", 1); + TEST_GET_STRING_NUMBER("(?P.)(.)(?Pa)", "B", 3); + TEST_GET_STRING_NUMBER("(?P.)(.)(?Pa)", "C", -1); + TEST_GET_STRING_NUMBER("(?:a)(?P.)", "A", 1); + TEST_GET_STRING_NUMBER("(?:a)(?P.)", "B", -1); + + /* TEST_ESCAPE(string, length, expected) */ + TEST_ESCAPE("hello world", -1, "hello world"); + TEST_ESCAPE("hello world", 5, "hello"); + TEST_ESCAPE("hello.world", -1, "hello\\.world"); + TEST_ESCAPE("a(b\\b.$", -1, "a\\(b\\\\b\\.\\$"); + TEST_ESCAPE("hello\0world", -1, "hello"); + TEST_ESCAPE("hello\0world", 11, "hello\\0world"); + TEST_ESCAPE(EURO "*" ENG, -1, EURO "\\*" ENG); + TEST_ESCAPE("a$", -1, "a\\$"); + TEST_ESCAPE("$a", -1, "\\$a"); + TEST_ESCAPE("a$a", -1, "a\\$a"); + TEST_ESCAPE("$a$", -1, "\\$a\\$"); + TEST_ESCAPE("$a$", 0, ""); + TEST_ESCAPE("$a$", 1, "\\$"); + TEST_ESCAPE("$a$", 2, "\\$a"); + TEST_ESCAPE("$a$", 3, "\\$a\\$"); + TEST_ESCAPE("$a$", 4, "\\$a\\$\\0"); + TEST_ESCAPE("|()[]{}^$*+?.", -1, "\\|\\(\\)\\[\\]\\{\\}\\^\\$\\*\\+\\?\\."); + TEST_ESCAPE("a|a(a)a[a]a{a}a^a$a*a+a?a.a", -1, + "a\\|a\\(a\\)a\\[a\\]a\\{a\\}a\\^a\\$a\\*a\\+a\\?a\\.a"); + + /* TEST_MATCH_ALL#(pattern, string, string_len, start_position, ...) */ + TEST_MATCH_ALL0("<.*>", "", -1, 0); + TEST_MATCH_ALL0("a+", "", -1, 0); + TEST_MATCH_ALL0("a+", "a", 0, 0); + TEST_MATCH_ALL0("a+", "a", -1, 1); + TEST_MATCH_ALL1("<.*>", "", -1, 0, "", 0, 3); + TEST_MATCH_ALL1("a+", "a", -1, 0, "a", 0, 1); + TEST_MATCH_ALL1("a+", "aa", 1, 0, "a", 0, 1); + TEST_MATCH_ALL1("a+", "aa", -1, 1, "a", 1, 2); + TEST_MATCH_ALL1("a+", "aa", 2, 1, "a", 1, 2); + TEST_MATCH_ALL1(".+", ENG, -1, 0, ENG, 0, 2); + TEST_MATCH_ALL2("<.*>", "", -1, 0, "", 0, 6, "", 0, 3); + TEST_MATCH_ALL2("a+", "aa", -1, 0, "aa", 0, 2, "a", 0, 1); + TEST_MATCH_ALL2(".+", ENG EURO, -1, 0, ENG EURO, 0, 5, ENG, 0, 2); + TEST_MATCH_ALL3("<.*>", "", -1, 0, "", 0, 9, + "", 0, 6, "", 0, 3); + TEST_MATCH_ALL3("a+", "aaa", -1, 0, "aaa", 0, 3, "aa", 0, 2, "a", 0, 1); + +end: /* if abort_on_fail is TRUE the flow passes to this label. */ + verbose ("\n%u tests passed, %u failed\n", passed, failed); + return failed; +} + +#else /* ENABLE_REGEX false */ + +int +main (int argc, char *argv[]) +{ + g_print ("GRegex is disabled.\n"); + return 0; +} + +#endif /* ENABLE_REGEX */ diff --git a/tests/relation-test.c b/tests/relation-test.c new file mode 100644 index 0000000..35f5a16 --- /dev/null +++ b/tests/relation-test.c @@ -0,0 +1,139 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include "glib.h" + +int array[10000]; +gboolean failed = FALSE; + +#define TEST(m,cond) G_STMT_START { failed = !(cond); \ +if (failed) \ + { if (!m) \ + g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \ + else \ + g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \ + } \ +else \ + g_print ("."); fflush (stdout); \ +} G_STMT_END + +#define C2P(c) ((gpointer) ((long) (c))) +#define P2C(p) ((gchar) ((long) (p))) + +#define GLIB_TEST_STRING "el dorado " +#define GLIB_TEST_STRING_5 "el do" + +typedef struct { + guint age; + gchar name[40]; +} GlibTestInfo; + + + +int +main (int argc, + char *argv[]) +{ + gint i; + GRelation *relation; + GTuples *tuples; + gint data [1024]; + + + relation = g_relation_new (2); + + g_relation_index (relation, 0, g_int_hash, g_int_equal); + g_relation_index (relation, 1, g_int_hash, g_int_equal); + + for (i = 0; i < 1024; i += 1) + data[i] = i; + + for (i = 1; i < 1023; i += 1) + { + g_relation_insert (relation, data + i, data + i + 1); + g_relation_insert (relation, data + i, data + i - 1); + } + + for (i = 2; i < 1022; i += 1) + { + g_assert (! g_relation_exists (relation, data + i, data + i)); + g_assert (! g_relation_exists (relation, data + i, data + i + 2)); + g_assert (! g_relation_exists (relation, data + i, data + i - 2)); + } + + for (i = 1; i < 1023; i += 1) + { + g_assert (g_relation_exists (relation, data + i, data + i + 1)); + g_assert (g_relation_exists (relation, data + i, data + i - 1)); + } + + for (i = 2; i < 1022; i += 1) + { + g_assert (g_relation_count (relation, data + i, 0) == 2); + g_assert (g_relation_count (relation, data + i, 1) == 2); + } + + g_assert (g_relation_count (relation, data, 0) == 0); + + g_assert (g_relation_count (relation, data + 42, 0) == 2); + g_assert (g_relation_count (relation, data + 43, 1) == 2); + g_assert (g_relation_count (relation, data + 41, 1) == 2); + g_relation_delete (relation, data + 42, 0); + g_assert (g_relation_count (relation, data + 42, 0) == 0); + g_assert (g_relation_count (relation, data + 43, 1) == 1); + g_assert (g_relation_count (relation, data + 41, 1) == 1); + + tuples = g_relation_select (relation, data + 200, 0); + + g_assert (tuples->len == 2); + +#if 0 + for (i = 0; i < tuples->len; i += 1) + { + printf ("%d %d\n", + *(gint*) g_tuples_index (tuples, i, 0), + *(gint*) g_tuples_index (tuples, i, 1)); + } +#endif + + g_assert (g_relation_exists (relation, data + 300, data + 301)); + g_relation_delete (relation, data + 300, 0); + g_assert (!g_relation_exists (relation, data + 300, data + 301)); + + g_tuples_destroy (tuples); + + g_relation_destroy (relation); + + relation = NULL; + + return 0; +} + diff --git a/tests/run-assert-msg-test.sh b/tests/run-assert-msg-test.sh new file mode 100755 index 0000000..8557e02 --- /dev/null +++ b/tests/run-assert-msg-test.sh @@ -0,0 +1,45 @@ +#! /bin/sh + +fail () +{ + echo "Test failed: $*" + exit 1 +} + +echo_v () +{ + if [ "$verbose" = "1" ]; then + echo "$*" + fi +} + +error_out=/dev/null +if [ "$1" = "-v" ]; then + verbose=1 + error_out=/dev/stderr +fi + +echo_v "Running assert-msg-test" +OUT=$(./assert-msg-test 2>&1) && fail "assert-msg-test should abort" +echo "$OUT" | grep -q '^ERROR:.*assert-msg-test.c:.*:main: assertion failed: (42 < 0)' || \ + fail "does not print assertion message" + +if ! type gdb >/dev/null 2>&1; then + echo_v "Skipped (no gdb installed)" + exit 0 +fi + +msg_test="assert-msg-test" +if [ -e ".libs/lt-$msg_test" ]; then + msg_test="lt-$msg_test" +fi +echo_v "Running gdb on assert-msg-test" +OUT=$(gdb --batch --ex run --ex "print (char*) __glib_assert_msg" .libs/$msg_test 2> $error_out) || \ + fail "failed to run gdb" + +echo_v "Checking if assert message is in __glib_assert_msg" +if ! echo "$OUT" | grep -q '^$1.*"ERROR:.*assert-msg-test.c:.*:main: assertion failed: (42 < 0)"'; then + fail "__glib_assert_msg does not have assertion message" +fi + +echo_v "All tests passed." diff --git a/tests/run-bookmark-test.sh b/tests/run-bookmark-test.sh new file mode 100755 index 0000000..3bed44d --- /dev/null +++ b/tests/run-bookmark-test.sh @@ -0,0 +1,34 @@ +#! /bin/sh + +fail () +{ + echo "Test failed: $*" + exit 1 +} + +echo_v () +{ + if [ "$verbose" = "1" ]; then + echo "$*" + fi +} + +error_out=/dev/null +if [ "$1" = "-v" ]; then + verbose=1 + error_out=/dev/stderr +fi +for I in ${srcdir:-.}/bookmarks/fail-*.xbel; do + echo_v "Parsing $I, should fail" + ./bookmarkfile-test $I > /dev/null 2> $error_out && fail "failed to generate error on $I" + if test "$?" != "1"; then + fail "unexpected error on $I" + fi +done + +for I in ${srcdir:-.}/bookmarks/valid-*.xbel; do + echo_v "Parsing $I, should succeed" + ./bookmarkfile-test $I > /dev/null 2> $error_out || fail "failed on $I" +done + +echo_v "All tests passed." diff --git a/tests/run-collate-tests.sh b/tests/run-collate-tests.sh new file mode 100755 index 0000000..24f3d69 --- /dev/null +++ b/tests/run-collate-tests.sh @@ -0,0 +1,38 @@ +#! /bin/sh + +fail () +{ + echo "Test failed: $*" + exit 1 +} + +echo_v () +{ + if [ "$verbose" = "1" ]; then + echo "$*" + fi +} + +error_out=/dev/null +if [ "$1" = "-v" ]; then + verbose=1 + error_out=/dev/stderr +fi +for I in ${srcdir:-.}/collate/*.in; do + echo_v "Sorting $I" + name=`basename $I .in` + ./unicode-collate $I > collate.out + if [ $? -eq 2 ]; then + exit 0 + fi + diff collate.out ${srcdir:-.}/collate/$name.unicode || + fail "unexpected error when using g_utf8_collate() on $I" + ./unicode-collate --key $I > collate.out + diff collate.out ${srcdir:-.}/collate/$name.unicode || + fail "unexpected error when using g_utf8_collate_key() on $I" + ./unicode-collate --file $I > collate.out + diff collate.out ${srcdir:-.}/collate/$name.file || + fail "unexpected error when using g_utf8_collate_key_for_filename() on $I" +done + +echo_v "All tests passed." diff --git a/tests/run-markup-tests.sh b/tests/run-markup-tests.sh new file mode 100755 index 0000000..38074cc --- /dev/null +++ b/tests/run-markup-tests.sh @@ -0,0 +1,41 @@ +#! /bin/sh + +fail () +{ + echo "Test failed: $*" + exit 1 +} + +echo_v () +{ + if [ "$verbose" = "1" ]; then + echo "$*" + fi +} + +error_out=/dev/null +if [ "$1" = "-v" ]; then + verbose=1 + error_out=/dev/stderr +fi +for I in ${srcdir:-.}/markups/fail-*.gmarkup; do + echo_v "Parsing $I, should fail" + ./markup-test $I > /dev/null 2> $error_out && fail "failed to generate error on $I" + if test "$?" != "1"; then + fail "unexpected error on $I" + fi +done + +I=1 +while test $I -lt 100 ; do + F=${srcdir:-.}/markups/valid-$I.gmarkup + if [ -f $F ] ; then + echo_v "Parsing $F, should succeed" + ./markup-test $F > actual 2> $error_out || fail "failed on $F" + diff ${srcdir:-.}/markups/expected-$I actual || fail "unexpected output on $F" + rm actual + fi + I=`expr $I + 1` +done + +echo_v "All tests passed." diff --git a/tests/scannerapi.c b/tests/scannerapi.c new file mode 100644 index 0000000..d33fed9 --- /dev/null +++ b/tests/scannerapi.c @@ -0,0 +1,139 @@ +/* Gtk+ object tests + * Copyright (C) 2007 Patrick Hulin + * Copyright (C) 2007 Imendio AB + * Authors: Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include +#include +#include + + +/* GScanner fixture */ +typedef struct { + GScanner *scanner; +} ScannerFixture; +static void +scanner_fixture_setup (ScannerFixture *fix, + gconstpointer test_data) +{ + fix->scanner = g_scanner_new (NULL); + g_assert (fix->scanner != NULL); +} +static void +scanner_fixture_teardown (ScannerFixture *fix, + gconstpointer test_data) +{ + g_assert (fix->scanner != NULL); + g_scanner_destroy (fix->scanner); +} + +static void +scanner_msg_func (GScanner *scanner, + gchar *message, + gboolean error) +{ + g_assert_cmpstr (message, ==, "test"); +} + +static void +test_scanner_warn (ScannerFixture *fix, + gconstpointer test_data) +{ + fix->scanner->msg_handler = scanner_msg_func; + g_scanner_warn (fix->scanner, "test"); +} + +static void +test_scanner_error (ScannerFixture *fix, + gconstpointer test_data) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + int pe = fix->scanner->parse_errors; + g_scanner_error (fix->scanner, "scanner-error-message-test"); + g_assert_cmpint (fix->scanner->parse_errors, ==, pe + 1); + exit (0); + } + g_test_trap_assert_passed(); + g_test_trap_assert_stderr ("*scanner-error-message-test*"); +} + +static void +check_keys (gpointer key, + gpointer value, + gpointer user_data) +{ + g_assert_cmpint (GPOINTER_TO_INT (value), ==, g_ascii_strtoull (key, NULL, 0)); +} + +static void +test_scanner_symbols (ScannerFixture *fix, + gconstpointer test_data) +{ + gint i; + gchar buf[2]; + + g_scanner_set_scope (fix->scanner, 1); + + for (i = 0; i < 10; i++) + g_scanner_scope_add_symbol (fix->scanner, + 1, + g_ascii_dtostr (buf, 2, (gdouble)i), + GINT_TO_POINTER (i)); + g_scanner_scope_foreach_symbol (fix->scanner, 1, check_keys, NULL); + g_scanner_scope_remove_symbol (fix->scanner, 1, "5"); + g_assert_cmpint (GPOINTER_TO_INT (g_scanner_scope_lookup_symbol (fix->scanner, 1, "4")), ==, 4); + g_assert_cmpint (GPOINTER_TO_INT (g_scanner_scope_lookup_symbol (fix->scanner, 1, "5")), ==, 0); +} + +static void +test_scanner_tokens (ScannerFixture *fix, + gconstpointer test_data) +{ + gchar buf[] = "(\t\n\r\\){}"; + const gint buflen = strlen (buf); + gchar tokbuf[] = "(\\){}"; + const gint tokbuflen = strlen (tokbuf); + guint i; + + g_scanner_input_text (fix->scanner, buf, buflen); + + g_assert_cmpint (g_scanner_cur_token (fix->scanner), ==, G_TOKEN_NONE); + g_scanner_get_next_token (fix->scanner); + g_assert_cmpint (g_scanner_cur_token (fix->scanner), ==, tokbuf[0]); + g_assert_cmpint (g_scanner_cur_line (fix->scanner), ==, 1); + + for (i = 1; i < tokbuflen; i++) + g_assert_cmpint (g_scanner_get_next_token (fix->scanner), ==, tokbuf[i]); + g_assert_cmpint (g_scanner_get_next_token (fix->scanner), ==, G_TOKEN_EOF); + return; +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/scanner/warn", ScannerFixture, 0, scanner_fixture_setup, test_scanner_warn, scanner_fixture_teardown); + g_test_add ("/scanner/error", ScannerFixture, 0, scanner_fixture_setup, test_scanner_error, scanner_fixture_teardown); + g_test_add ("/scanner/symbols", ScannerFixture, 0, scanner_fixture_setup, test_scanner_symbols, scanner_fixture_teardown); + g_test_add ("/scanner/tokens", ScannerFixture, 0, scanner_fixture_setup, test_scanner_tokens, scanner_fixture_teardown); + + return g_test_run(); +} diff --git a/tests/sequence-test.c b/tests/sequence-test.c new file mode 100644 index 0000000..2a88c7d --- /dev/null +++ b/tests/sequence-test.c @@ -0,0 +1,1301 @@ +#include +#include +#include + +/* Keep this in sync with gsequence.c !!! */ +typedef struct _GSequenceNode GSequenceNode; + +struct _GSequence +{ + GSequenceNode * end_node; + GDestroyNotify data_destroy_notify; + gboolean access_prohibited; + GSequence * real_sequence; +}; + +struct _GSequenceNode +{ + gint n_nodes; + GSequenceNode * parent; + GSequenceNode * left; + GSequenceNode * right; + gpointer data; +}; + +static guint +get_priority (GSequenceNode *node) +{ + guint key = GPOINTER_TO_UINT (node); + + key = (key << 15) - key - 1; + key = key ^ (key >> 12); + key = key + (key << 2); + key = key ^ (key >> 4); + key = key + (key << 3) + (key << 11); + key = key ^ (key >> 16); + + return key? key : 1; +} + +static void +check_node (GSequenceNode *node) +{ + if (node) + { + g_assert (node->parent != node); + if (node->parent) + g_assert (node->parent->left == node || node->parent->right == node); + g_assert (node->n_nodes == 1 + (node->left ? node->left->n_nodes : 0) + (node->right ? node->right->n_nodes : 0)); + if (node->left) + g_assert (get_priority (node) >= get_priority (node->left)); + if (node->right) + g_assert (get_priority (node) >= get_priority (node->right)); + check_node (node->left); + check_node (node->right); + } +} + +void +g_sequence_check (GSequence *seq) +{ + GSequenceNode *node = seq->end_node; + + while (node->parent) + node = node->parent; + + check_node (node); + + while (node->right) + node = node->right; + + g_assert (seq->end_node == node); + g_assert (node->data == seq); + +} + + +enum { + NEW, FREE, GET_LENGTH, FOREACH, FOREACH_RANGE, SORT, SORT_ITER, + + /* Getting iters */ + GET_BEGIN_ITER, GET_END_ITER, GET_ITER_AT_POS, APPEND, PREPEND, + INSERT_BEFORE, MOVE, SWAP, INSERT_SORTED, INSERT_SORTED_ITER, SORT_CHANGED, + SORT_CHANGED_ITER, REMOVE, REMOVE_RANGE, MOVE_RANGE, SEARCH, SEARCH_ITER, + + /* dereferencing */ + GET, SET, + + /* operations on GSequenceIter * */ + ITER_IS_BEGIN, ITER_IS_END, ITER_NEXT, ITER_PREV, ITER_GET_POSITION, + ITER_MOVE, ITER_GET_SEQUENCE, + + /* search */ + ITER_COMPARE, RANGE_GET_MIDPOINT, + N_OPS +}; + +typedef struct SequenceInfo +{ + GQueue * queue; + GSequence * sequence; + int n_items; +} SequenceInfo; + +typedef struct +{ + SequenceInfo *seq; + int number; +} Item; + +void g_sequence_check (GSequence *sequence); + +static Item * +fix_pointer (gconstpointer data) +{ + return (Item *)((char *)data - 1); +} + +static Item * +get_item (GSequenceIter *iter) +{ + return fix_pointer (g_sequence_get (iter)); +} + +static void +check_integrity (SequenceInfo *info) +{ + GList *list; + GSequenceIter *iter; + int i; + + g_sequence_check (info->sequence); + + if (g_sequence_get_length (info->sequence) != info->n_items) + g_print ("%d %d\n", + g_sequence_get_length (info->sequence), info->n_items); + g_assert (info->n_items == g_queue_get_length (info->queue)); + g_assert (g_sequence_get_length (info->sequence) == info->n_items); + + iter = g_sequence_get_begin_iter (info->sequence); + list = info->queue->head; + i = 0; + while (iter != g_sequence_get_end_iter (info->sequence)) + { + Item *item; + g_assert (list->data == iter); + item = get_item (list->data); + g_assert (item->seq == info); + + iter = g_sequence_iter_next (iter); + list = list->next; + i++; + } + + g_assert (info->n_items == g_queue_get_length (info->queue)); + g_assert (g_sequence_get_length (info->sequence) == info->n_items); +} + +static gpointer +new_item (SequenceInfo *seq) +{ + Item *item = g_new (Item, 1); + seq->n_items++; + item->seq = seq; + item->number = g_random_int (); + + /* There have been bugs in the past where the GSequence would + * dereference the user pointers. This will make sure such + * behavior causes crashes + */ + return ((char *)item + 1); +} + +static void +free_item (gpointer data) +{ + Item *item = fix_pointer (data); + item->seq->n_items--; + g_free (item); +} + +static void +seq_foreach (gpointer data, + gpointer user_data) +{ + Item *item = fix_pointer (data); + GList **link = user_data; + GSequenceIter *iter; + + g_assert (*link != NULL); + + iter = (*link)->data; + + g_assert (get_item (iter) == item); + + item->number = g_random_int(); + + *link = (*link)->next; +} + +static gint +compare_items (gconstpointer a, + gconstpointer b, + gpointer data) +{ + const Item *item_a = fix_pointer (a); + const Item *item_b = fix_pointer (b); + + if (item_a->number < item_b->number) + { + return -1; + } + else if (item_a->number == item_b->number) + { + /* Force an arbitrary order on the items + * We have to do this, since g_queue_insert_sorted() and + * g_sequence_insert_sorted() do not agree on the exact + * position the item is inserted if the new item is + * equal to an existing one. + */ + if (item_a < item_b) + return -1; + else if (item_a == item_b) + return 0; + else + return 1; + } + else + { + return 1; + } +} + +static void +check_sorted (SequenceInfo *info) +{ + GList *list; + int last; + GSequenceIter *last_iter; + + check_integrity (info); + + last = G_MININT; + last_iter = NULL; + for (list = info->queue->head; list != NULL; list = list->next) + { + GSequenceIter *iter = list->data; + Item *item = get_item (iter); + + g_assert (item->number >= last); + /* Check that the ordering is the same as that of the queue, + * ie. that the sort is stable + */ + if (last_iter) + g_assert (iter == g_sequence_iter_next (last_iter)); + + last = item->number; + last_iter = iter; + } +} + +static gint +compare_iters (gconstpointer a, + gconstpointer b, + gpointer data) +{ + GSequence *seq = data; + GSequenceIter *iter_a = (GSequenceIter *)a; + GSequenceIter *iter_b = (GSequenceIter *)b; + /* compare_items() will fix up the pointers */ + Item *item_a = g_sequence_get (iter_a); + Item *item_b = g_sequence_get (iter_b); + + if (seq) + { + g_assert (g_sequence_iter_get_sequence (iter_a) == seq); + g_assert (g_sequence_iter_get_sequence (iter_b) == seq); + } + + return compare_items (item_a, item_b, data); +} + +/* A version of g_queue_link_index() that treats NULL as just + * beyond the queue + */ +static int +queue_link_index (SequenceInfo *seq, GList *link) +{ + if (link) + return g_queue_link_index (seq->queue, link); + else + return g_queue_get_length (seq->queue); +} + +static void +get_random_range (SequenceInfo *seq, + GSequenceIter **begin_iter, + GSequenceIter **end_iter, + GList **begin_link, + GList **end_link) +{ + int length = g_queue_get_length (seq->queue); + int b = g_random_int_range (0, length + 1); + int e = g_random_int_range (b, length + 1); + + g_assert (length == g_sequence_get_length (seq->sequence)); + + if (begin_iter) + *begin_iter = g_sequence_get_iter_at_pos (seq->sequence, b); + if (end_iter) + *end_iter = g_sequence_get_iter_at_pos (seq->sequence, e); + if (begin_link) + *begin_link = g_queue_peek_nth_link (seq->queue, b); + if (end_link) + *end_link = g_queue_peek_nth_link (seq->queue, e); + if (begin_iter && begin_link) + { + g_assert ( + queue_link_index (seq, *begin_link) == + g_sequence_iter_get_position (*begin_iter)); + } + if (end_iter && end_link) + { + g_assert ( + queue_link_index (seq, *end_link) == + g_sequence_iter_get_position (*end_iter)); + } +} + +static gint +get_random_position (SequenceInfo *seq) +{ + int length = g_queue_get_length (seq->queue); + + g_assert (length == g_sequence_get_length (seq->sequence)); + + return g_random_int_range (-2, length + 5); +} + +static GSequenceIter * +get_random_iter (SequenceInfo *seq, + GList **link) +{ + GSequenceIter *iter; + int pos = get_random_position (seq); + if (link) + *link = g_queue_peek_nth_link (seq->queue, pos); + iter = g_sequence_get_iter_at_pos (seq->sequence, pos); + if (link) + g_assert (queue_link_index (seq, *link) == g_sequence_iter_get_position (iter)); + return iter; +} + +static void +dump_info (SequenceInfo *seq) +{ +#if 0 + GSequenceIter *iter; + GList *list; + + iter = g_sequence_get_begin_iter (seq->sequence); + list = seq->queue->head; + + while (iter != g_sequence_get_end_iter (seq->sequence)) + { + Item *item = get_item (iter); + g_print ("%p %p %d\n", list->data, iter, item->number); + + iter = g_sequence_iter_next (iter); + list = list->next; + } +#endif +} + +/* A version of g_queue_insert_before() that appends if link is NULL */ +static void +queue_insert_before (SequenceInfo *seq, GList *link, gpointer data) +{ + if (link) + g_queue_insert_before (seq->queue, link, data); + else + g_queue_push_tail (seq->queue, data); +} + +static void +run_random_tests (guint32 seed) +{ +#define N_ITERATIONS 60000 +#define N_SEQUENCES 8 +#define N_TIMES 24 + + SequenceInfo sequences[N_SEQUENCES]; + int k; + + g_print (" seed: %u\n", seed); + + g_random_set_seed (seed); + + for (k = 0; k < N_SEQUENCES; ++k) + { + sequences[k].queue = g_queue_new (); + sequences[k].sequence = g_sequence_new (free_item); + sequences[k].n_items = 0; + } + +#define RANDOM_SEQUENCE() &(sequences[g_random_int_range (0, N_SEQUENCES)]) + + for (k = 0; k < N_ITERATIONS; ++k) + { + int i; + SequenceInfo *seq = RANDOM_SEQUENCE(); + int op = g_random_int_range (0, N_OPS); + +#if 0 + g_print ("%d on %p\n", op, seq); +#endif + + switch (op) + { + case NEW: + case FREE: + { + g_queue_free (seq->queue); + g_sequence_free (seq->sequence); + + g_assert (seq->n_items == 0); + + seq->queue = g_queue_new (); + seq->sequence = g_sequence_new (free_item); + + check_integrity (seq); + } + break; + case GET_LENGTH: + { + int slen = g_sequence_get_length (seq->sequence); + int qlen = g_queue_get_length (seq->queue); + + g_assert (slen == qlen); + } + break; + case FOREACH: + { + GList *link = seq->queue->head; + g_sequence_foreach (seq->sequence, seq_foreach, &link); + g_assert (link == NULL); + } + break; + case FOREACH_RANGE: + { + GSequenceIter *begin_iter, *end_iter; + GList *begin_link, *end_link; + + get_random_range (seq, &begin_iter, &end_iter, &begin_link, &end_link); + + check_integrity (seq); + + g_sequence_foreach_range (begin_iter, end_iter, seq_foreach, &begin_link); + + g_assert (begin_link == end_link); + } + break; + case SORT: + { + dump_info (seq); + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + dump_info (seq); + } + break; + case SORT_ITER: + { + check_integrity (seq); + g_sequence_sort_iter (seq->sequence, + (GSequenceIterCompareFunc)compare_iters, seq->sequence); + g_queue_sort (seq->queue, compare_iters, NULL); + check_sorted (seq); + } + break; + + /* Getting iters */ + case GET_END_ITER: + case GET_BEGIN_ITER: + { + GSequenceIter *begin_iter; + GSequenceIter *end_iter; + GSequenceIter *penultimate_iter; + + begin_iter = g_sequence_get_begin_iter (seq->sequence); + check_integrity (seq); + + end_iter = g_sequence_get_end_iter (seq->sequence); + check_integrity (seq); + + penultimate_iter = g_sequence_iter_prev (end_iter); + check_integrity (seq); + + if (g_sequence_get_length (seq->sequence) > 0) + { + g_assert (seq->queue->head); + g_assert (seq->queue->head->data == begin_iter); + g_assert (seq->queue->tail); + g_assert (seq->queue->tail->data == penultimate_iter); + } + else + { + g_assert (penultimate_iter == end_iter); + g_assert (begin_iter == end_iter); + g_assert (penultimate_iter == begin_iter); + g_assert (seq->queue->head == NULL); + g_assert (seq->queue->tail == NULL); + } + } + break; + case GET_ITER_AT_POS: + { + int i; + + g_assert (g_queue_get_length (seq->queue) == g_sequence_get_length (seq->sequence)); + + for (i = 0; i < 10; ++i) + { + int pos = get_random_position (seq); + GSequenceIter *iter = g_sequence_get_iter_at_pos (seq->sequence, pos); + GList *link = g_queue_peek_nth_link (seq->queue, pos); + check_integrity (seq); + if (pos >= g_sequence_get_length (seq->sequence) || pos < 0) + { + g_assert (iter == g_sequence_get_end_iter (seq->sequence)); + g_assert (link == NULL); + } + else + { + g_assert (link); + g_assert (link->data == iter); + } + } + } + break; + case APPEND: + { + for (i = 0; i < 10; ++i) + { + GSequenceIter *iter = g_sequence_append (seq->sequence, new_item (seq)); + g_queue_push_tail (seq->queue, iter); + } + } + break; + case PREPEND: + { + for (i = 0; i < 10; ++i) + { + GSequenceIter *iter = g_sequence_prepend (seq->sequence, new_item (seq)); + g_queue_push_head (seq->queue, iter); + } + } + break; + case INSERT_BEFORE: + { + for (i = 0; i < 10; ++i) + { + GList *link; + GSequenceIter *iter = get_random_iter (seq, &link); + GSequenceIter *new_iter; + check_integrity (seq); + + new_iter = g_sequence_insert_before (iter, new_item (seq)); + + queue_insert_before (seq, link, new_iter); + } + } + break; + case MOVE: + { + GList *link1, *link2; + SequenceInfo *seq1 = RANDOM_SEQUENCE(); + SequenceInfo *seq2 = RANDOM_SEQUENCE(); + GSequenceIter *iter1 = get_random_iter (seq1, &link1); + GSequenceIter *iter2 = get_random_iter (seq2, &link2); + + if (!g_sequence_iter_is_end (iter1)) + { + g_sequence_move (iter1, iter2); + + if (!link2) + g_assert (g_sequence_iter_is_end (iter2)); + + queue_insert_before (seq2, link2, link1->data); + + g_queue_delete_link (seq1->queue, link1); + + get_item (iter1)->seq = seq2; + + seq1->n_items--; + seq2->n_items++; + } + + check_integrity (seq); + + iter1 = get_random_iter (seq, NULL); + + /* Moving an iter to itself should have no effect */ + if (!g_sequence_iter_is_end (iter1)) + g_sequence_move (iter1, iter1); + } + break; + case SWAP: + { + GList *link1, *link2; + SequenceInfo *seq1 = RANDOM_SEQUENCE(); + SequenceInfo *seq2 = RANDOM_SEQUENCE(); + GSequenceIter *iter1 = get_random_iter (seq1, &link1); + GSequenceIter *iter2 = get_random_iter (seq2, &link2); + + if (!g_sequence_iter_is_end (iter1) && + !g_sequence_iter_is_end (iter2)) + { + gpointer tmp; + + g_sequence_swap (iter1, iter2); + + get_item (iter1)->seq = seq2; + get_item (iter2)->seq = seq1; + + tmp = link1->data; + link1->data = link2->data; + link2->data = tmp; + } + } + break; + case INSERT_SORTED: + { + int i; + dump_info (seq); + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + for (i = 0; i < N_TIMES; ++i) + { + GSequenceIter *iter = + g_sequence_insert_sorted (seq->sequence, new_item(seq), compare_items, NULL); + + g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL); + } + + check_sorted (seq); + + dump_info (seq); + } + break; + case INSERT_SORTED_ITER: + { + int i; + dump_info (seq); + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + for (i = 0; i < N_TIMES; ++i) + { + GSequenceIter *iter; + + iter = g_sequence_insert_sorted_iter (seq->sequence, + new_item (seq), + (GSequenceIterCompareFunc)compare_iters, + seq->sequence); + + g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL); + } + + check_sorted (seq); + + dump_info (seq); + } + break; + case SORT_CHANGED: + { + int i; + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + for (i = 0; i < N_TIMES; ++i) + { + GList *link; + GSequenceIter *iter = get_random_iter (seq, &link); + + if (!g_sequence_iter_is_end (iter)) + { + g_sequence_set (iter, new_item (seq)); + g_sequence_sort_changed (iter, compare_items, NULL); + + g_queue_delete_link (seq->queue, link); + g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL); + } + + check_sorted (seq); + } + } + break; + case SORT_CHANGED_ITER: + { + int i; + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + for (i = 0; i < N_TIMES; ++i) + { + GList *link; + GSequenceIter *iter = get_random_iter (seq, &link); + + if (!g_sequence_iter_is_end (iter)) + { + g_sequence_set (iter, new_item (seq)); + g_sequence_sort_changed_iter (iter, + (GSequenceIterCompareFunc)compare_iters, seq->sequence); + + g_queue_delete_link (seq->queue, link); + g_queue_insert_sorted (seq->queue, iter, compare_iters, NULL); + } + + check_sorted (seq); + } + } + break; + case REMOVE: + { + int i; + + for (i = 0; i < N_TIMES; ++i) + { + GList *link; + GSequenceIter *iter = get_random_iter (seq, &link); + + if (!g_sequence_iter_is_end (iter)) + { + g_sequence_remove (iter); + g_queue_delete_link (seq->queue, link); + } + } + } + break; + case REMOVE_RANGE: + { + GSequenceIter *begin_iter, *end_iter; + GList *begin_link, *end_link; + GList *list; + + get_random_range (seq, &begin_iter, &end_iter, &begin_link, &end_link); + + g_sequence_remove_range (begin_iter, end_iter); + + list = begin_link; + while (list != end_link) + { + GList *next = list->next; + + g_queue_delete_link (seq->queue, list); + + list = next; + } + } + break; + case MOVE_RANGE: + { + SequenceInfo *src = RANDOM_SEQUENCE(); + SequenceInfo *dst = RANDOM_SEQUENCE(); + + GSequenceIter *begin_iter, *end_iter; + GList *begin_link, *end_link; + + GSequenceIter *dst_iter; + GList *dst_link; + + GList *list; + + g_assert (src->queue); + g_assert (dst->queue); + + get_random_range (src, &begin_iter, &end_iter, &begin_link, &end_link); + dst_iter = get_random_iter (dst, &dst_link); + + g_sequence_move_range (dst_iter, begin_iter, end_iter); + + if (dst_link == begin_link || (src == dst && dst_link == end_link)) + { + check_integrity (src); + check_integrity (dst); + break; + } + + if (queue_link_index (src, begin_link) >= + queue_link_index (src, end_link)) + { + break; + } + + if (src == dst && + queue_link_index (src, dst_link) >= queue_link_index (src, begin_link) && + queue_link_index (src, dst_link) <= queue_link_index (src, end_link)) + { + break; + } + + list = begin_link; + while (list != end_link) + { + GList *next = list->next; + Item *item = get_item (list->data); + + g_assert (dst->queue); + queue_insert_before (dst, dst_link, list->data); + g_queue_delete_link (src->queue, list); + + g_assert (item->seq == src); + + src->n_items--; + dst->n_items++; + item->seq = dst; + + list = next; + } + } + break; + case SEARCH: + { + Item *item; + GSequenceIter *search_iter; + GSequenceIter *insert_iter; + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + item = new_item (seq); + search_iter = g_sequence_search (seq->sequence, item, compare_items, NULL); + + insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL); + + g_assert (search_iter == g_sequence_iter_next (insert_iter)); + + g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL); + } + break; + case SEARCH_ITER: + { + Item *item; + GSequenceIter *search_iter; + GSequenceIter *insert_iter; + + g_sequence_sort (seq->sequence, compare_items, NULL); + g_queue_sort (seq->queue, compare_iters, NULL); + + check_sorted (seq); + + item = new_item (seq); + search_iter = g_sequence_search_iter (seq->sequence, + item, + (GSequenceIterCompareFunc)compare_iters, seq->sequence); + + insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL); + + g_assert (search_iter == g_sequence_iter_next (insert_iter)); + + g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL); + } + break; + + /* dereferencing */ + case GET: + case SET: + { + GSequenceIter *iter; + GList *link; + + iter = get_random_iter (seq, &link); + + if (!g_sequence_iter_is_end (iter)) + { + Item *item; + int i; + + check_integrity (seq); + + /* Test basic functionality */ + item = new_item (seq); + g_sequence_set (iter, item); + g_assert (g_sequence_get (iter) == item); + + /* Make sure that existing items are freed */ + for (i = 0; i < N_TIMES; ++i) + g_sequence_set (iter, new_item (seq)); + + check_integrity (seq); + + g_sequence_set (iter, new_item (seq)); + } + } + break; + + /* operations on GSequenceIter * */ + case ITER_IS_BEGIN: + { + GSequenceIter *iter; + + iter = g_sequence_get_iter_at_pos (seq->sequence, 0); + + g_assert (g_sequence_iter_is_begin (iter)); + + check_integrity (seq); + + if (g_sequence_get_length (seq->sequence) > 0) + { + g_assert (!g_sequence_iter_is_begin (g_sequence_get_end_iter (seq->sequence))); + } + else + { + g_assert (g_sequence_iter_is_begin (g_sequence_get_end_iter (seq->sequence))); + } + + g_assert (g_sequence_iter_is_begin (g_sequence_get_begin_iter (seq->sequence))); + } + break; + case ITER_IS_END: + { + GSequenceIter *iter; + int len = g_sequence_get_length (seq->sequence); + + iter = g_sequence_get_iter_at_pos (seq->sequence, len); + + g_assert (g_sequence_iter_is_end (iter)); + + if (len > 0) + { + g_assert (!g_sequence_iter_is_end (g_sequence_get_begin_iter (seq->sequence))); + } + else + { + g_assert (g_sequence_iter_is_end (g_sequence_get_begin_iter (seq->sequence))); + } + + g_assert (g_sequence_iter_is_end (g_sequence_get_end_iter (seq->sequence))); + } + break; + case ITER_NEXT: + { + GSequenceIter *iter1, *iter2, *iter3, *end; + + iter1 = g_sequence_append (seq->sequence, new_item (seq)); + iter2 = g_sequence_append (seq->sequence, new_item (seq)); + iter3 = g_sequence_append (seq->sequence, new_item (seq)); + + end = g_sequence_get_end_iter (seq->sequence); + + g_assert (g_sequence_iter_next (iter1) == iter2); + g_assert (g_sequence_iter_next (iter2) == iter3); + g_assert (g_sequence_iter_next (iter3) == end); + g_assert (g_sequence_iter_next (end) == end); + + g_queue_push_tail (seq->queue, iter1); + g_queue_push_tail (seq->queue, iter2); + g_queue_push_tail (seq->queue, iter3); + } + break; + case ITER_PREV: + { + GSequenceIter *iter1, *iter2, *iter3, *begin; + + iter1 = g_sequence_prepend (seq->sequence, new_item (seq)); + iter2 = g_sequence_prepend (seq->sequence, new_item (seq)); + iter3 = g_sequence_prepend (seq->sequence, new_item (seq)); + + begin = g_sequence_get_begin_iter (seq->sequence); + + g_assert (g_sequence_iter_prev (iter1) == iter2); + g_assert (g_sequence_iter_prev (iter2) == iter3); + g_assert (iter3 == begin); + g_assert (g_sequence_iter_prev (iter3) == begin); + g_assert (g_sequence_iter_prev (begin) == begin); + + g_queue_push_head (seq->queue, iter1); + g_queue_push_head (seq->queue, iter2); + g_queue_push_head (seq->queue, iter3); + } + break; + case ITER_GET_POSITION: + { + GList *link; + GSequenceIter *iter = get_random_iter (seq, &link); + + g_assert (g_sequence_iter_get_position (iter) == + queue_link_index (seq, link)); + } + break; + case ITER_MOVE: + { + int len = g_sequence_get_length (seq->sequence); + GSequenceIter *iter; + int pos; + + iter = get_random_iter (seq, NULL); + pos = g_sequence_iter_get_position (iter); + iter = g_sequence_iter_move (iter, len - pos); + g_assert (g_sequence_iter_is_end (iter)); + + + iter = get_random_iter (seq, NULL); + pos = g_sequence_iter_get_position (iter); + while (pos < len) + { + g_assert (!g_sequence_iter_is_end (iter)); + pos++; + iter = g_sequence_iter_move (iter, 1); + } + g_assert (g_sequence_iter_is_end (iter)); + } + break; + case ITER_GET_SEQUENCE: + { + GSequenceIter *iter = get_random_iter (seq, NULL); + + g_assert (g_sequence_iter_get_sequence (iter) == seq->sequence); + } + break; + + /* search */ + case ITER_COMPARE: + { + GList *link1, *link2; + GSequenceIter *iter1 = get_random_iter (seq, &link1); + GSequenceIter *iter2 = get_random_iter (seq, &link2); + + int cmp = g_sequence_iter_compare (iter1, iter2); + int pos1 = queue_link_index (seq, link1); + int pos2 = queue_link_index (seq, link2); + + if (cmp == 0) + { + g_assert (pos1 == pos2); + } + else if (cmp < 0) + { + g_assert (pos1 < pos2); + } + else + { + g_assert (pos1 > pos2); + } + } + break; + case RANGE_GET_MIDPOINT: + { + GSequenceIter *iter1 = get_random_iter (seq, NULL); + GSequenceIter *iter2 = get_random_iter (seq, NULL); + GSequenceIter *iter3; + int cmp; + + cmp = g_sequence_iter_compare (iter1, iter2); + + if (cmp > 0) + { + GSequenceIter *tmp; + + tmp = iter1; + iter1 = iter2; + iter2 = tmp; + } + + iter3 = g_sequence_range_get_midpoint (iter1, iter2); + + if (cmp == 0) + { + g_assert (iter3 == iter1); + g_assert (iter3 == iter2); + } + + g_assert (g_sequence_iter_get_position (iter3) >= + g_sequence_iter_get_position (iter1)); + g_assert (g_sequence_iter_get_position (iter2) >= + g_sequence_iter_get_position (iter3)); + } + break; + + } + + check_integrity (seq); + } +} + +/* Random seeds known to have failed at one point + */ +static gulong seeds[] = + { + 825541564u, + 801678400u, + 1477639090u, + 3369132895u, + 1192944867u, + 770458294u, + 1099575817u, + 590523467u, + 3583571454u, + 579241222u + }; + +static void standalone_tests (void); + +static guint32 +get_seed (int argc, char **argv) +{ + if (argc > 1) + { + char *endptr; + + return strtol (argv[1], &endptr, 0); + } + else + { + return g_random_int(); + } +} + +int +main (int argc, + char **argv) +{ + guint32 seed = get_seed (argc, argv); + int i; + + /* Run stand alone tests */ + g_print ("running standalone tests\n"); + standalone_tests(); + + g_print ("running regression tests:\n"); + /* Run regression tests */ + for (i = 0; i < G_N_ELEMENTS (seeds); ++i) + { + run_random_tests (seeds[i]); + } + + /* Run with a new random seed */ + g_print ("random seed:\n"); + run_random_tests (seed); + + + return 0; +} + + +/* Single, stand-alone tests */ + +static void +test_out_of_range_jump (void) +{ + GSequence *seq = g_sequence_new (NULL); + GSequenceIter *iter = g_sequence_get_begin_iter (seq); + + g_sequence_iter_move (iter, 5); + + g_assert (g_sequence_iter_is_begin (iter)); + g_assert (g_sequence_iter_is_end (iter)); +} + +static int +compare (gconstpointer a, gconstpointer b, gpointer userdata) +{ + int ai, bi; + + ai = GPOINTER_TO_INT (a); + bi = GPOINTER_TO_INT (b); + + if (ai < bi) + return -1; + else if (ai > bi) + return 1; + else + return 0; +} + +static int +compare_iter (GSequenceIter *a, + GSequenceIter *b, + gpointer data) +{ + return compare (g_sequence_get (a), + g_sequence_get (b), + data); +} + +static void +test_insert_sorted_non_pointer (void) +{ + int i; + + for (i = 0; i < 10; i++) + { + GSequence *seq = g_sequence_new (NULL); + int j; + + for (j = 0; j < 10000; j++) + { + g_sequence_insert_sorted (seq, GINT_TO_POINTER (g_random_int()), + compare, NULL); + + g_sequence_insert_sorted_iter (seq, GINT_TO_POINTER (g_random_int()), + compare_iter, NULL); + } + + g_sequence_check (seq); + + g_sequence_free (seq); + } +} + +static void +test_stable_sort (void) +{ + int i; + GSequence *seq = g_sequence_new (NULL); + +#define N_ITEMS 1000 + + GSequenceIter *iters[N_ITEMS]; + GSequenceIter *iter; + + for (i = 0; i < N_ITEMS; ++i) + { + iters[i] = g_sequence_append (seq, GINT_TO_POINTER (3000)); + g_sequence_check (seq); + g_assert (g_sequence_iter_get_sequence (iters[i]) == seq); + } + + i = 0; + iter = g_sequence_get_begin_iter (seq); + g_assert (g_sequence_iter_get_sequence (iter) == seq); + g_sequence_check (seq); + while (!g_sequence_iter_is_end (iter)) + { + g_assert (g_sequence_iter_get_sequence (iters[i]) == seq); + g_assert (iters[i++] == iter); + + iter = g_sequence_iter_next (iter); + g_sequence_check (seq); + } + + g_sequence_sort (seq, compare, NULL); + + i = 0; + iter = g_sequence_get_begin_iter (seq); + while (!g_sequence_iter_is_end (iter)) + { + g_assert (g_sequence_iter_get_sequence (iters[i]) == seq); + g_assert (iters[i] == iter); + + iter = g_sequence_iter_next (iter); + g_sequence_check (seq); + + i++; + } + + for (i = N_ITEMS - 1; i >= 0; --i) + { + g_sequence_check (seq); + g_assert (g_sequence_iter_get_sequence (iters[i]) == seq); + g_assert (g_sequence_get_end_iter (seq) != iters[i]); + g_sequence_sort_changed (iters[i], compare, NULL); + } + + i = 0; + iter = g_sequence_get_begin_iter (seq); + while (!g_sequence_iter_is_end (iter)) + { + g_assert (iters[i++] == iter); + + iter = g_sequence_iter_next (iter); + g_sequence_check (seq); + } +} + +static void +standalone_tests (void) +{ + test_out_of_range_jump (); + test_insert_sorted_non_pointer (); + test_stable_sort (); +} + diff --git a/tests/shell-test.c b/tests/shell-test.c new file mode 100644 index 0000000..437f20e --- /dev/null +++ b/tests/shell-test.c @@ -0,0 +1,297 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include + + +typedef struct _TestResult TestResult; + +struct _TestResult +{ + gint argc; + const gchar **argv; +}; + +static const gchar * +test_command_lines[] = +{ + /* 0 */ "foo bar", + /* 1 */ "foo 'bar'", + /* 2 */ "foo \"bar\"", + /* 3 */ "foo '' 'bar'", + /* 4 */ "foo \"bar\"'baz'blah'foo'\\''blah'\"boo\"", + /* 5 */ "foo \t \tblah\tfoo\t\tbar baz", + /* 6 */ "foo ' spaces more spaces lots of spaces in this ' \t", + /* 7 */ "foo \\\nbar", + /* 8 */ "foo '' ''", + /* 9 */ "foo \\\" la la la", + /* 10 */ "foo \\ foo woo woo\\ ", + /* 11 */ "foo \"yada yada \\$\\\"\"", + /* 12 */ "foo \"c:\\\\\"", + NULL +}; + +static const gchar *result0[] = { "foo", "bar", NULL }; +static const gchar *result1[] = { "foo", "bar", NULL }; +static const gchar *result2[] = { "foo", "bar", NULL }; +static const gchar *result3[] = { "foo", "", "bar", NULL }; +static const gchar *result4[] = { "foo", "barbazblahfoo'blahboo", NULL }; +static const gchar *result5[] = { "foo", "blah", "foo", "bar", "baz", NULL }; +static const gchar *result6[] = { "foo", " spaces more spaces lots of spaces in this ", NULL }; +static const gchar *result7[] = { "foo", "bar", NULL }; +static const gchar *result8[] = { "foo", "", "", NULL }; +static const gchar *result9[] = { "foo", "\"", "la", "la", "la", NULL }; +static const gchar *result10[] = { "foo", " foo", "woo", "woo ", NULL }; +static const gchar *result11[] = { "foo", "yada yada $\"", NULL }; +static const gchar *result12[] = { "foo", "c:\\", NULL }; + +static const TestResult +correct_results[] = +{ + { G_N_ELEMENTS (result0) - 1, result0 }, + { G_N_ELEMENTS (result1) - 1, result1 }, + { G_N_ELEMENTS (result2) - 1, result2 }, + { G_N_ELEMENTS (result3) - 1, result3 }, + { G_N_ELEMENTS (result4) - 1, result4 }, + { G_N_ELEMENTS (result5) - 1, result5 }, + { G_N_ELEMENTS (result6) - 1, result6 }, + { G_N_ELEMENTS (result7) - 1, result7 }, + { G_N_ELEMENTS (result8) - 1, result8 }, + { G_N_ELEMENTS (result9) - 1, result9 }, + { G_N_ELEMENTS (result10) - 1, result10 }, + { G_N_ELEMENTS (result11) - 1, result11 }, + { G_N_ELEMENTS (result12) - 1, result12 } +}; + +static void +print_test (const gchar *cmdline, gint argc, gchar **argv, + const TestResult *result) +{ + gint i; + + fprintf (stderr, "Command line was: '%s'\n", cmdline); + + fprintf (stderr, "Expected result (%d args):\n", result->argc); + + i = 0; + while (result->argv[i]) + { + fprintf (stderr, " %3d '%s'\n", i, result->argv[i]); + ++i; + } + + fprintf (stderr, "Actual result (%d args):\n", argc); + + i = 0; + while (argv[i]) + { + fprintf (stderr, " %3d '%s'\n", i, argv[i]); + ++i; + } +} + +static void +do_argv_test (const gchar *cmdline, const TestResult *result) +{ + gint argc; + gchar **argv; + GError *err; + gint i; + + err = NULL; + if (!g_shell_parse_argv (cmdline, &argc, &argv, &err)) + { + fprintf (stderr, "Error parsing command line that should work fine: %s\n", + err->message); + + exit (1); + } + + if (argc != result->argc) + { + fprintf (stderr, "Expected and actual argc don't match\n"); + print_test (cmdline, argc, argv, result); + exit (1); + } + + i = 0; + while (argv[i]) + { + if (strcmp (argv[i], result->argv[i]) != 0) + { + fprintf (stderr, "Expected and actual arg %d do not match\n", i); + print_test (cmdline, argc, argv, result); + exit (1); + } + + ++i; + } + + if (argv[i] != NULL) + { + fprintf (stderr, "argv didn't get NULL-terminated\n"); + exit (1); + } + g_strfreev (argv); +} + +static void +run_tests (void) +{ + gint i; + + i = 0; + while (test_command_lines[i]) + { + do_argv_test (test_command_lines[i], &correct_results[i]); + ++i; + } +} + +static gboolean any_test_failed = FALSE; + +#define CHECK_STRING_RESULT(expression, expected_value) \ + check_string_result (#expression, __FILE__, __LINE__, expression, expected_value) + +static void +check_string_result (const char *expression, + const char *file_name, + int line_number, + char *result, + const char *expected) +{ + gboolean match; + + if (expected == NULL) + match = result == NULL; + else + match = result != NULL && strcmp (result, expected) == 0; + + if (!match) + { + if (!any_test_failed) + fprintf (stderr, "\n"); + + fprintf (stderr, "FAIL: check failed in %s, line %d\n", file_name, line_number); + fprintf (stderr, " evaluated: %s\n", expression); + fprintf (stderr, " expected: %s\n", expected == NULL ? "NULL" : expected); + fprintf (stderr, " got: %s\n", result == NULL ? "NULL" : result); + + any_test_failed = TRUE; + } + + g_free (result); +} + +static char * +test_shell_unquote (const char *str) +{ + char *result; + GError *error; + + error = NULL; + result = g_shell_unquote (str, &error); + if (error == NULL) + return result; + + /* Leaks the error, which is no big deal and easy to fix if we + * decide it matters. + */ + + if (error->domain != G_SHELL_ERROR) + return g_strdup ("error in domain other than G_SHELL_ERROR"); + + /* It would be nice to check the error message too, but that's + * localized, so it's too much of a pain. + */ + switch (error->code) + { + case G_SHELL_ERROR_BAD_QUOTING: + return g_strdup ("G_SHELL_ERROR_BAD_QUOTING"); + case G_SHELL_ERROR_EMPTY_STRING: + return g_strdup ("G_SHELL_ERROR_EMPTY_STRING"); + case G_SHELL_ERROR_FAILED: + return g_strdup ("G_SHELL_ERROR_FAILED"); + default: + return g_strdup ("bad error code in G_SHELL_ERROR domain"); + } +} + +int +main (int argc, + char *argv[]) +{ + run_tests (); + + CHECK_STRING_RESULT (g_shell_quote (""), "''"); + CHECK_STRING_RESULT (g_shell_quote ("a"), "'a'"); + CHECK_STRING_RESULT (g_shell_quote ("("), "'('"); + CHECK_STRING_RESULT (g_shell_quote ("'"), "''\\'''"); + CHECK_STRING_RESULT (g_shell_quote ("'a"), "''\\''a'"); + CHECK_STRING_RESULT (g_shell_quote ("a'"), "'a'\\'''"); + CHECK_STRING_RESULT (g_shell_quote ("a'a"), "'a'\\''a'"); + + CHECK_STRING_RESULT (test_shell_unquote (""), ""); + CHECK_STRING_RESULT (test_shell_unquote ("a"), "a"); + CHECK_STRING_RESULT (test_shell_unquote ("'a'"), "a"); + CHECK_STRING_RESULT (test_shell_unquote ("'('"), "("); + CHECK_STRING_RESULT (test_shell_unquote ("''\\'''"), "'"); + CHECK_STRING_RESULT (test_shell_unquote ("''\\''a'"), "'a"); + CHECK_STRING_RESULT (test_shell_unquote ("'a'\\'''"), "a'"); + CHECK_STRING_RESULT (test_shell_unquote ("'a'\\''a'"), "a'a"); + + CHECK_STRING_RESULT (test_shell_unquote ("\\\\"), "\\"); + CHECK_STRING_RESULT (test_shell_unquote ("\\\n"), ""); + + CHECK_STRING_RESULT (test_shell_unquote ("'\\''"), "G_SHELL_ERROR_BAD_QUOTING"); + +#if defined (_MSC_VER) && (_MSC_VER <= 1200) + /* using \x22 instead of \" to work around a msvc 5.0, 6.0 compiler bug */ + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\x22\""), "\""); +#else + CHECK_STRING_RESULT (test_shell_unquote ("\"\\\"\""), "\""); +#endif + + CHECK_STRING_RESULT (test_shell_unquote ("\""), "G_SHELL_ERROR_BAD_QUOTING"); + CHECK_STRING_RESULT (test_shell_unquote ("'"), "G_SHELL_ERROR_BAD_QUOTING"); + + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\\\""), "\\"); + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\`\""), "`"); + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\$\""), "$"); + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\n\""), "\n"); + + CHECK_STRING_RESULT (test_shell_unquote ("\"\\'\""), "\\'"); + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\\r\""), "\\\r"); + CHECK_STRING_RESULT (test_shell_unquote ("\x22\\n\""), "\\n"); + + return any_test_failed ? 1 : 0; +} diff --git a/tests/slice-color.c b/tests/slice-color.c new file mode 100644 index 0000000..c4a417d --- /dev/null +++ b/tests/slice-color.c @@ -0,0 +1,178 @@ +/* GLIB sliced memory - fast threaded memory chunk allocator + * Copyright (C) 2005 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include +#include + +#define ALIGN(size, base) ((base) * (gsize) (((size) + (base) - 1) / (base))) + +static gdouble parse_memsize (const gchar *cstring); +static void usage (void); + +static void +fill_memory (guint **mem, + guint n, + guint val) +{ + guint j, o = 0; + for (j = 0; j < n; j++) + mem[j][o] = val; +} + +static guint64 +access_memory3 (guint **mema, + guint **memb, + guint **memd, + guint n, + guint64 repeats) +{ + guint64 accu = 0, i, j; + const guint o = 0; + for (i = 0; i < repeats; i++) + { + for (j = 1; j < n; j += 2) + memd[j][o] = mema[j][o] + memb[j][o]; + } + for (i = 0; i < repeats; i++) + for (j = 0; j < n; j++) + accu += memd[j][o]; + return accu; +} + +static void +touch_mem (guint64 block_size, + guint64 n_blocks, + guint64 repeats) +{ + guint64 j, accu, n = n_blocks; + GTimer *timer; + guint **memc; + guint **memb; + guint **mema = g_new (guint*, n); + for (j = 0; j < n; j++) + mema[j] = g_slice_alloc (block_size); + memb = g_new (guint*, n); + for (j = 0; j < n; j++) + memb[j] = g_slice_alloc (block_size); + memc = g_new (guint*, n); + for (j = 0; j < n; j++) + memc[j] = g_slice_alloc (block_size); + + timer = g_timer_new(); + fill_memory (mema, n, 2); + fill_memory (memb, n, 3); + fill_memory (memc, n, 4); + access_memory3 (mema, memb, memc, n, 3); + g_timer_start (timer); + accu = access_memory3 (mema, memb, memc, n, repeats); + g_timer_stop (timer); + + g_print ("Access-time = %fs\n", g_timer_elapsed (timer, NULL)); + g_assert (accu / repeats == (2 + 3) * n / 2 + 4 * n / 2); + + for (j = 0; j < n; j++) + { + g_slice_free1 (block_size, mema[j]); + g_slice_free1 (block_size, memb[j]); + g_slice_free1 (block_size, memc[j]); + } + g_timer_destroy (timer); + g_free (mema); + g_free (memb); + g_free (memc); +} + +static void +usage (void) +{ + g_print ("Usage: slice-color [memory-size] [repeats] [colorization]\n"); +} + +int +main (int argc, + char *argv[]) +{ + guint64 block_size = 512, area_size = 1024 * 1024, n_blocks, repeats = 1000000; + + if (argc > 1) + block_size = parse_memsize (argv[1]); + else + { + usage(); + block_size = 512; + } + if (argc > 2) + area_size = parse_memsize (argv[2]); + if (argc > 3) + repeats = parse_memsize (argv[3]); + if (argc > 4) + g_slice_set_config (G_SLICE_CONFIG_COLOR_INCREMENT, parse_memsize (argv[4])); + + /* figure number of blocks from block and area size. + * divide area by 3 because touch_mem() allocates 3 areas + */ + n_blocks = area_size / 3 / ALIGN (block_size, sizeof (gsize) * 2); + + /* basic sanity checks */ + if (!block_size || !n_blocks || block_size >= area_size) + { + g_printerr ("Invalid arguments: block-size=%llu memory-size=%llu\n", block_size, area_size); + usage(); + return 1; + } + + g_printerr ("Will allocate and touch %llu blocks of %llu bytes (= %llu bytes) %llu times with color increment: 0x%08llx\n", + n_blocks, block_size, n_blocks * block_size, repeats, g_slice_get_config (G_SLICE_CONFIG_COLOR_INCREMENT)); + + touch_mem (block_size, n_blocks, repeats); + + return 0; +} + +static gdouble +parse_memsize (const gchar *cstring) +{ + gchar *mem = g_strdup (cstring); + gchar *string = g_strstrip (mem); + guint l = strlen (string); + gdouble f = 0; + gchar *derr = NULL; + gdouble msize; + + switch (l ? string[l - 1] : 0) + { + case 'k': f = 1000; break; + case 'K': f = 1024; break; + case 'm': f = 1000000; break; + case 'M': f = 1024 * 1024; break; + case 'g': f = 1000000000; break; + case 'G': f = 1024 * 1024 * 1024; break; + } + if (f) + string[l - 1] = 0; + msize = g_ascii_strtod (string, &derr); + g_free (mem); + if (derr && *derr) + { + g_printerr ("failed to parse number at: %s\n", derr); + msize = 0; + } + if (f) + msize *= f; + return msize; +} diff --git a/tests/slice-concurrent.c b/tests/slice-concurrent.c new file mode 100644 index 0000000..e059d30 --- /dev/null +++ b/tests/slice-concurrent.c @@ -0,0 +1,120 @@ +/* test for gslice cross thread allocation/free + * Copyright (C) 2006 Stefan Westerfeld + * Copyright (C) 2007 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include +#include +#include + +#define N_THREADS 8 +#define N_ALLOCS 50000 +#define MAX_BLOCK_SIZE 64 + +struct ThreadData +{ + int thread_id; + GThread* gthread; + + GMutex* to_free_mutex; + void* to_free [N_THREADS * N_ALLOCS]; + int bytes_to_free [N_THREADS * N_ALLOCS]; + int n_to_free; + int n_freed; +} tdata[N_THREADS]; + +void* +thread_func (void *arg) +{ + struct ThreadData *td = arg; + int i; +/* g_print ("Thread %d starting\n", td->thread_id); */ + for (i = 0; i < N_ALLOCS; i++) + { + if (rand() % (N_ALLOCS / 20) == 0) + g_print ("%c", 'a' - 1 + td->thread_id); + + /* allocate block of random size and randomly fill */ + int bytes = rand() % MAX_BLOCK_SIZE + 1; + char *mem = g_slice_alloc (bytes); + int f; + for (f = 0; f < bytes; f++) + mem[f] = rand(); + + /* associate block with random thread */ + int t = rand() % N_THREADS; + g_mutex_lock (tdata[t].to_free_mutex); + tdata[t].to_free[tdata[t].n_to_free] = mem; + tdata[t].bytes_to_free[tdata[t].n_to_free] = bytes; + tdata[t].n_to_free++; + g_mutex_unlock (tdata[t].to_free_mutex); + + /* shuffle thread execution order every once in a while */ + if (rand() % 97 == 0) + { + if (rand() % 2) + g_thread_yield(); /* concurrent shuffling for single core */ + else + g_usleep (1000); /* concurrent shuffling for multi core */ + } + + /* free a block associated with this thread */ + g_mutex_lock (td->to_free_mutex); + if (td->n_to_free > 0) + { + td->n_to_free--; + g_slice_free1 (td->bytes_to_free[td->n_to_free], td->to_free[td->n_to_free]); + td->n_freed++; + } + g_mutex_unlock (td->to_free_mutex); + } + + return NULL; +} + +int +main() +{ + int t; + + g_thread_init (NULL); + + for (t = 0; t < N_THREADS; t++) + { + tdata[t].thread_id = t + 1; + tdata[t].n_to_free = 0; + tdata[t].n_freed = 0; + tdata[t].to_free_mutex = g_mutex_new(); + } + g_print ("Starting %d threads for concurrent GSlice usage...\n", N_THREADS); + for (t = 0; t < N_THREADS; t++) + { + tdata[t].gthread = g_thread_create (thread_func, &tdata[t], TRUE, NULL); + g_assert (tdata[t].gthread != NULL); + } + for (t = 0; t < N_THREADS; t++) + { + g_thread_join (tdata[t].gthread); + } + g_print ("\n"); + for (t = 0; t < N_THREADS; t++) + { + g_print ("Thread %d: %d blocks freed, %d blocks not freed\n", + tdata[t].thread_id, tdata[t].n_freed, tdata[t].n_to_free); + } + return 0; +} diff --git a/tests/slice-test.c b/tests/slice-test.c new file mode 100644 index 0000000..a118ce6 --- /dev/null +++ b/tests/slice-test.c @@ -0,0 +1,310 @@ +/* GLIB sliced memory - fast threaded memory chunk allocator + * Copyright (C) 2005 Tim Janik + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include + +#include +#include + +#define quick_rand32() (rand_accu = 1664525 * rand_accu + 1013904223, rand_accu) +static guint prime_size = 1021; /* 769; 509 */ +static gboolean clean_memchunks = FALSE; +static guint number_of_blocks = 10000; /* total number of blocks allocated */ +static guint number_of_repetitions = 10000; /* number of alloc+free repetitions */ +static gboolean want_corruption = FALSE; + +/* --- old memchunk prototypes (memchunks.c) --- */ +void old_mem_chunks_init (void); +GMemChunk* old_mem_chunk_new (const gchar *name, + gint atom_size, + gulong area_size, + gint type); +void old_mem_chunk_destroy (GMemChunk *mem_chunk); +gpointer old_mem_chunk_alloc (GMemChunk *mem_chunk); +gpointer old_mem_chunk_alloc0 (GMemChunk *mem_chunk); +void old_mem_chunk_free (GMemChunk *mem_chunk, + gpointer mem); +void old_mem_chunk_clean (GMemChunk *mem_chunk); +void old_mem_chunk_reset (GMemChunk *mem_chunk); +void old_mem_chunk_print (GMemChunk *mem_chunk); +void old_mem_chunk_info (void); +#ifndef G_ALLOC_AND_FREE +#define G_ALLOC_AND_FREE 2 +#endif + +/* --- functions --- */ +static inline int +corruption (void) +{ + if (G_UNLIKELY (want_corruption)) + { + /* corruption per call likelyness is about 1:4000000 */ + guint32 r = g_random_int() % 8000009; + return r == 277 ? +1 : r == 281 ? -1 : 0; + } + return 0; +} + +static inline gpointer +memchunk_alloc (GMemChunk **memchunkp, + guint size) +{ + size = MAX (size, 1); + if (G_UNLIKELY (!*memchunkp)) + *memchunkp = old_mem_chunk_new ("", size, 4096, G_ALLOC_AND_FREE); + return old_mem_chunk_alloc (*memchunkp); +} + +static inline void +memchunk_free (GMemChunk *memchunk, + gpointer chunk) +{ + old_mem_chunk_free (memchunk, chunk); + if (clean_memchunks) + old_mem_chunk_clean (memchunk); +} + +static gpointer +test_memchunk_thread (gpointer data) +{ + GMemChunk **memchunks; + guint i, j; + guint8 **ps; + guint *ss; + guint32 rand_accu = 2147483563; + /* initialize random numbers */ + if (data) + rand_accu = *(guint32*) data; + else + { + GTimeVal rand_tv; + g_get_current_time (&rand_tv); + rand_accu = rand_tv.tv_usec + (rand_tv.tv_sec << 16); + } + + /* prepare for memchunk creation */ + memchunks = g_alloca (sizeof (memchunks[0]) * prime_size); + memset (memchunks, 0, sizeof (memchunks[0]) * prime_size); + + ps = g_new (guint8*, number_of_blocks); + ss = g_new (guint, number_of_blocks); + /* create number_of_blocks random sizes */ + for (i = 0; i < number_of_blocks; i++) + ss[i] = quick_rand32() % prime_size; + /* allocate number_of_blocks blocks */ + for (i = 0; i < number_of_blocks; i++) + ps[i] = memchunk_alloc (&memchunks[ss[i]], ss[i]); + for (j = 0; j < number_of_repetitions; j++) + { + /* free number_of_blocks/2 blocks */ + for (i = 0; i < number_of_blocks; i += 2) + memchunk_free (memchunks[ss[i]], ps[i]); + /* allocate number_of_blocks/2 blocks with new sizes */ + for (i = 0; i < number_of_blocks; i += 2) + { + ss[i] = quick_rand32() % prime_size; + ps[i] = memchunk_alloc (&memchunks[ss[i]], ss[i]); + } + } + /* free number_of_blocks blocks */ + for (i = 0; i < number_of_blocks; i++) + memchunk_free (memchunks[ss[i]], ps[i]); + /* alloc and free many equally sized chunks in a row */ + for (i = 0; i < number_of_repetitions; i++) + { + guint sz = quick_rand32() % prime_size; + guint k = number_of_blocks / 100; + for (j = 0; j < k; j++) + ps[j] = memchunk_alloc (&memchunks[sz], sz); + for (j = 0; j < k; j++) + memchunk_free (memchunks[sz], ps[j]); + } + /* cleanout memchunks */ + for (i = 0; i < prime_size; i++) + if (memchunks[i]) + old_mem_chunk_destroy (memchunks[i]); + g_free (ps); + g_free (ss); + + return NULL; +} + +static gpointer +test_sliced_mem_thread (gpointer data) +{ + guint32 rand_accu = 2147483563; + guint i, j; + guint8 **ps; + guint *ss; + + /* initialize random numbers */ + if (data) + rand_accu = *(guint32*) data; + else + { + GTimeVal rand_tv; + g_get_current_time (&rand_tv); + rand_accu = rand_tv.tv_usec + (rand_tv.tv_sec << 16); + } + + ps = g_new (guint8*, number_of_blocks); + ss = g_new (guint, number_of_blocks); + /* create number_of_blocks random sizes */ + for (i = 0; i < number_of_blocks; i++) + ss[i] = quick_rand32() % prime_size; + /* allocate number_of_blocks blocks */ + for (i = 0; i < number_of_blocks; i++) + ps[i] = g_slice_alloc (ss[i] + corruption()); + for (j = 0; j < number_of_repetitions; j++) + { + /* free number_of_blocks/2 blocks */ + for (i = 0; i < number_of_blocks; i += 2) + g_slice_free1 (ss[i] + corruption(), ps[i] + corruption()); + /* allocate number_of_blocks/2 blocks with new sizes */ + for (i = 0; i < number_of_blocks; i += 2) + { + ss[i] = quick_rand32() % prime_size; + ps[i] = g_slice_alloc (ss[i] + corruption()); + } + } + /* free number_of_blocks blocks */ + for (i = 0; i < number_of_blocks; i++) + g_slice_free1 (ss[i] + corruption(), ps[i] + corruption()); + /* alloc and free many equally sized chunks in a row */ + for (i = 0; i < number_of_repetitions; i++) + { + guint sz = quick_rand32() % prime_size; + guint k = number_of_blocks / 100; + for (j = 0; j < k; j++) + ps[j] = g_slice_alloc (sz + corruption()); + for (j = 0; j < k; j++) + g_slice_free1 (sz + corruption(), ps[j] + corruption()); + } + g_free (ps); + g_free (ss); + + return NULL; +} + +static void +usage (void) +{ + g_print ("Usage: slice-test [n_threads] [G|S|M|O][f][c][~] [maxblocksize] [seed]\n"); +} + +int +main (int argc, + char *argv[]) +{ + guint seed32, *seedp = NULL; + gboolean ccounters = FALSE, use_memchunks = FALSE; + guint n_threads = 1; + const gchar *mode = "slab allocator + magazine cache", *emode = " "; + if (argc > 1) + n_threads = g_ascii_strtoull (argv[1], NULL, 10); + if (argc > 2) + { + guint i, l = strlen (argv[2]); + for (i = 0; i < l; i++) + switch (argv[2][i]) + { + case 'G': /* GLib mode */ + g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, FALSE); + g_slice_set_config (G_SLICE_CONFIG_BYPASS_MAGAZINES, FALSE); + mode = "slab allocator + magazine cache"; + break; + case 'S': /* slab mode */ + g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, FALSE); + g_slice_set_config (G_SLICE_CONFIG_BYPASS_MAGAZINES, TRUE); + mode = "slab allocator"; + break; + case 'M': /* malloc mode */ + g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, TRUE); + mode = "system malloc"; + break; + case 'O': /* old memchunks */ + use_memchunks = TRUE; + mode = "old memchunks"; + break; + case 'f': /* eager freeing */ + g_slice_set_config (G_SLICE_CONFIG_WORKING_SET_MSECS, 0); + clean_memchunks = TRUE; + emode = " with eager freeing"; + break; + case 'c': /* print contention counters */ + ccounters = TRUE; + break; + case '~': + want_corruption = TRUE; /* force occasional corruption */ + break; + default: + usage(); + return 1; + } + } + if (argc > 3) + prime_size = g_ascii_strtoull (argv[3], NULL, 10); + if (argc > 4) + { + seed32 = g_ascii_strtoull (argv[4], NULL, 10); + seedp = &seed32; + } + + g_thread_init (NULL); + + if (argc <= 1) + usage(); + + { + gchar strseed[64] = ""; + GThread **threads; + guint i; + + if (seedp) + g_snprintf (strseed, 64, "%u", *seedp); + g_print ("Starting %d threads allocating random blocks <= %u bytes with seed=%s using %s%s\n", n_threads, prime_size, strseed, mode, emode); + + threads = g_alloca (sizeof(GThread*) * n_threads); + if (!use_memchunks) + for (i = 0; i < n_threads; i++) + threads[i] = g_thread_create_full (test_sliced_mem_thread, seedp, 0, TRUE, FALSE, 0, NULL); + else + { + old_mem_chunks_init(); + for (i = 0; i < n_threads; i++) + threads[i] = g_thread_create_full (test_memchunk_thread, seedp, 0, TRUE, FALSE, 0, NULL); + } + for (i = 0; i < n_threads; i++) + g_thread_join (threads[i]); + + if (ccounters) + { + guint n, n_chunks = g_slice_get_config (G_SLICE_CONFIG_CHUNK_SIZES); + g_print (" ChunkSize | MagazineSize | Contention\n"); + for (i = 0; i < n_chunks; i++) + { + gint64 *vals = g_slice_get_config_state (G_SLICE_CONFIG_CONTENTION_COUNTER, i, &n); + g_print (" %9llu | %9llu | %9llu\n", vals[0], vals[2], vals[1]); + g_free (vals); + } + } + else + g_print ("Done.\n"); + return 0; + } +} diff --git a/tests/slice-threadinit.c b/tests/slice-threadinit.c new file mode 100644 index 0000000..5c44075 --- /dev/null +++ b/tests/slice-threadinit.c @@ -0,0 +1,166 @@ +/* slice-threadinit.c - test GSlice across g_thread_init + * Copyright (C) 2007 Tim Janik + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ +#include + +#define N_PAGES (101) /* number of pages to sample */ +#define SAMPLE_SIZE (7) +#define PAGE_SIZE (128) /* must be <= minimum GSlice alignment block */ +#define MAGAZINE_PROBES { 81, 265, 347 } /* block sizes hopefully unused by g_thread_init */ +#define MAX_PROBE_TRIALS (1031) /* must be >= maximum magazine size */ + +#define ALIGN(size, base) ((base) * (gsize) (((size) + (base) - 1) / (base))) + +static struct { + void *page; + void *sample; +} pages[N_PAGES] = { { NULL, }, }; + +static const guint magazine_probes[] = MAGAZINE_PROBES; +#define N_MAGAZINE_PROBES G_N_ELEMENTS (magazine_probes) + +static void +release_trash_list (GSList **trash_list, + gsize block_size) +{ + while (*trash_list) + { + g_slice_free1 (block_size, (*trash_list)->data); + *trash_list = g_slist_delete_link (*trash_list, *trash_list); + } +} + +static GSList *free_list = NULL; + +static gboolean +allocate_from_known_page (void) +{ + guint i, j, n_trials = N_PAGES * PAGE_SIZE / SAMPLE_SIZE; /* upper bound */ + for (i = 0; i < n_trials; i++) + { + void *b = g_slice_alloc (SAMPLE_SIZE); + void *p = (void*) (PAGE_SIZE * ((gsize) b / PAGE_SIZE)); + free_list = g_slist_prepend (free_list, b); + /* find page */ + for (j = 0; j < N_PAGES; j++) + if (pages[j].page == p) + return TRUE; + } + return FALSE; +} + +int +main (int argc, + char *argv[]) +{ + int j, n_pages = 0; + void *mps[N_MAGAZINE_PROBES]; + + /* probe some magazine sizes */ + for (j = 0; j < N_MAGAZINE_PROBES; j++) + mps[j] = g_slice_alloc (magazine_probes[j]); + /* mps[*] now contains pointers to allocated slices */ + + /* allocate blocks from N_PAGES different pages */ + while (n_pages < N_PAGES) + { + void *b = g_slice_alloc (SAMPLE_SIZE); + void *p = (void*) (PAGE_SIZE * ((gsize) b / PAGE_SIZE)); + for (j = 0; j < N_PAGES; j++) + if (pages[j].page == p) + break; + if (j < N_PAGES) /* known page */ + free_list = g_slist_prepend (free_list, b); + else /* new page */ + { + j = n_pages++; + pages[j].page = p; + pages[j].sample = b; + } + } + /* release intermediate allocations */ + release_trash_list (&free_list, SAMPLE_SIZE); + + /* ensure that we can allocate from known pages */ + if (!allocate_from_known_page()) + g_error ("failed to allocate from magazine/page cache (before g_thread_init)"); + /* release intermediate allocations */ + release_trash_list (&free_list, SAMPLE_SIZE); + + /* release magazine probes to be retained */ + for (j = 0; j < N_MAGAZINE_PROBES; j++) + g_slice_free1 (magazine_probes[j], mps[j]); + /* mps[*] now contains pointers to releaed slices */ + + /* ensure probes were retained */ + for (j = 0; j < N_MAGAZINE_PROBES; j++) + { + GSList *trash = NULL; + guint k; + for (k = 0; k < MAX_PROBE_TRIALS; k++) + { + void *mem = g_slice_alloc (magazine_probes[j]); + if (mem == mps[j]) + break; /* reallocated previously freed slice */ + trash = g_slist_prepend (trash, mem); + } + release_trash_list (&trash, magazine_probes[j]); + if (k >= MAX_PROBE_TRIALS) /* failed to reallocate slice */ + g_error ("failed to reallocate slice from magazine (before g_thread_init): size=%d", magazine_probes[j]); + } + /* mps[*] now contains pointers to reallocated slices */ + + /* release magazine probes to be retained across g_thread_init */ + for (j = 0; j < N_MAGAZINE_PROBES; j++) + g_slice_free1 (magazine_probes[j], mps[j]); + /* mps[*] now contains pointers to released slices */ + + /* initialize threading (should retain allocator state) */ + g_thread_init (NULL); + + /* ensure probes were retained */ + for (j = 0; j < N_MAGAZINE_PROBES; j++) + { + GSList *trash = NULL; + guint k; + for (k = 0; k < MAX_PROBE_TRIALS; k++) + { + void *mem = g_slice_alloc (magazine_probes[j]); + if (mem == mps[j]) + break; /* reallocated previously freed slice */ + trash = g_slist_prepend (trash, mem); + } + release_trash_list (&trash, magazine_probes[j]); + if (k >= MAX_PROBE_TRIALS) /* failed to reallocate slice */ + g_error ("failed to reallocate slice from magazine (after g_thread_init): size=%d", magazine_probes[j]); + } + /* mps[*] now contains pointers to reallocated slices */ + + /* ensure that we can allocate from known pages */ + if (!allocate_from_known_page()) + g_error ("failed to allocate from magazine/page cache (after g_thread_init)"); + + /* some cleanups */ + for (j = 0; j < N_MAGAZINE_PROBES; j++) + g_slice_free1 (magazine_probes[j], mps[j]); + release_trash_list (&free_list, SAMPLE_SIZE); + + return 0; +} diff --git a/tests/slist-test.c b/tests/slist-test.c new file mode 100644 index 0000000..c269809 --- /dev/null +++ b/tests/slist-test.c @@ -0,0 +1,204 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#define DEBUG_MSG(args) +/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ +#define PRINT_MSG(args) +/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */ + +#define SIZE 50 +#define NUMBER_MIN 0000 +#define NUMBER_MAX 9999 + + +static guint32 array[SIZE]; + + +static gint +sort (gconstpointer p1, gconstpointer p2) +{ + gint32 a, b; + + a = GPOINTER_TO_INT (p1); + b = GPOINTER_TO_INT (p2); + + return (a > b ? +1 : a == b ? 0 : -1); +} + +/* + * gslist sort tests + */ +static void +test_slist_sort (void) +{ + GSList *slist = NULL; + gint i; + + PRINT_MSG (("testing g_slist_sort()")); + + for (i = 0; i < SIZE; i++) { + slist = g_slist_append (slist, GINT_TO_POINTER (array[i])); + } + + slist = g_slist_sort (slist, sort); + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_slist_nth_data (slist, i); + p2 = g_slist_nth_data (slist, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("slist_sort #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } +} + +static void +test_slist_sort_with_data (void) +{ + GSList *slist = NULL; + gint i; + + PRINT_MSG (("testing g_slist_sort_with_data()")); + + for (i = 0; i < SIZE; i++) { + slist = g_slist_append (slist, GINT_TO_POINTER (array[i])); + } + + slist = g_slist_sort_with_data (slist, (GCompareDataFunc)sort, NULL); + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_slist_nth_data (slist, i); + p2 = g_slist_nth_data (slist, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("slist_sort_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } +} + +static void +test_slist_insert_sorted (void) +{ + GSList *slist = NULL; + gint i; + + PRINT_MSG (("testing g_slist_insert_sorted()")); + + for (i = 0; i < SIZE; i++) { + slist = g_slist_insert_sorted (slist, GINT_TO_POINTER (array[i]), sort); + } + + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_slist_nth_data (slist, i); + p2 = g_slist_nth_data (slist, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("slist_insert_sorted #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } +} + +static void +test_slist_insert_sorted_with_data (void) +{ + GSList *slist = NULL; + gint i; + + PRINT_MSG (("testing g_slist_insert_sorted_with_data()")); + + for (i = 0; i < SIZE; i++) { + slist = g_slist_insert_sorted_with_data (slist, + GINT_TO_POINTER (array[i]), + (GCompareDataFunc)sort, + NULL); + } + + for (i = 0; i < SIZE - 1; i++) { + gpointer p1, p2; + + p1 = g_slist_nth_data (slist, i); + p2 = g_slist_nth_data (slist, i+1); + + g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2)); + DEBUG_MSG (("slist_insert_sorted_with_data #%3.3d ---> %d", i, GPOINTER_TO_INT (p1))); + } +} + +static void +test_slist_reverse (void) +{ + GSList *slist = NULL; + GSList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + PRINT_MSG (("testing g_slist_reverse()")); + + for (i = 0; i < 10; i++) { + slist = g_slist_append (slist, &nums[i]); + } + + slist = g_slist_reverse (slist); + + for (i = 0; i < 10; i++) { + st = g_slist_nth (slist, i); + g_assert (*((gint*) st->data) == (9 - i)); + } + + g_slist_free (slist); +} + +static void +test_slist_nth (void) +{ + GSList *slist = NULL; + GSList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + PRINT_MSG (("testing g_slist_nth()")); + + for (i = 0; i < 10; i++) { + slist = g_slist_append (slist, &nums[i]); + } + + for (i = 0; i < 10; i++) { + st = g_slist_nth (slist, i); + g_assert (*((gint*) st->data) == i); + } + + g_slist_free (slist); +} + +int +main (int argc, char *argv[]) +{ + gint i; + + DEBUG_MSG (("debugging messages turned on")); + + DEBUG_MSG (("creating %d random numbers", SIZE)); + + /* Create an array of random numbers. */ + for (i = 0; i < SIZE; i++) { + array[i] = g_random_int_range (NUMBER_MIN, NUMBER_MAX); + DEBUG_MSG (("number #%3.3d ---> %d", i, array[i])); + } + + /* Start tests. */ + test_slist_sort (); + test_slist_sort_with_data (); + + test_slist_insert_sorted (); + test_slist_insert_sorted_with_data (); + + test_slist_reverse (); + test_slist_nth (); + + PRINT_MSG (("testing finished")); + + return 0; +} diff --git a/tests/spawn-test-win32-gui.c b/tests/spawn-test-win32-gui.c new file mode 100644 index 0000000..45529d0 --- /dev/null +++ b/tests/spawn-test-win32-gui.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include +#include + +#ifdef __CYGWIN__ +/* For read() and write() */ +#include +/* Cygwin does not prototype __argc and __argv in stdlib.h */ +extern int __argc; +extern char** __argv; +#endif + +int _stdcall +WinMain (struct HINSTANCE__ *hInstance, + struct HINSTANCE__ *hPrevInstance, + char *lpszCmdLine, + int nCmdShow) +{ + char buf[100]; + + if (__argc >= 2 && strcmp (__argv[1], "nop") == 0) + { + sprintf (buf, "spawn-test-win32-gui: argv[0]=\"%s\"", __argv[0]); + MessageBox (NULL, buf, lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + } + else if (__argc <= 2) + { + MessageBox (NULL, "spawn-test-win32-gui: Will write to stdout", + lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + printf ("This is stdout\n"); + fflush (stdout); + + MessageBox (NULL, "spawn-test-win32-gui: Will write to stderr", + lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + fprintf (stderr, "This is stderr\n"); + fflush (stderr); + } + else if (__argc == 4 && strcmp (__argv[1], "pipes") == 0) + { + int infd = atoi (__argv[2]); + int outfd = atoi (__argv[3]); + int k, n; + + if (infd < 0 || outfd < 0) + { + MessageBox (NULL, "spawn-test-win32-gui: illegal fds on command line", + lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL); + exit (1); + } + + MessageBox (NULL, "spawn-test-win32-gui: Will write to parent", + lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + n = strlen ("Hello there"); + if (write (outfd, &n, sizeof (n)) == -1 || + write (outfd, "Hello there", n) == -1) + { + sprintf (buf, "spawn-test-win32-gui: Write: %s", strerror (errno)); + MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL); + exit (1); + } + + MessageBox (NULL, "spawn-test-win32-gui: Will read from parent", + lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + if ((k = read (infd, &n, sizeof (n))) != sizeof (n)) + { + sprintf (buf, "spawn-test-win32-gui: Got only %d bytes, wanted %d", + k, sizeof (n)); + MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL); + exit (1); + } + + sprintf (buf, "spawn-test-win32-gui: Parent says %d bytes to read", n); + MessageBox (NULL, buf, lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + if ((k = read (infd, buf, n)) != n) + { + if (k == -1) + sprintf (buf, "spawn-test-win32-gui: Read: %s", strerror (errno)); + else + sprintf (buf, "spawn-test-win32-gui: Got only %d bytes", k); + MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL); + exit (1); + } + + MessageBox (NULL, "spawn-test-win32-gui: Will write more to parent", + lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + n = strlen ("See ya"); + if (write (outfd, &n, sizeof (n)) == -1 || + write (outfd, "See ya", n) == -1) + { + sprintf (buf, "spawn-test-win32-gui: Write: %s", strerror (errno)); + MessageBox (NULL, buf, lpszCmdLine, MB_ICONERROR|MB_SYSTEMMODAL); + exit (1); + } + } + + Sleep (2000); + + MessageBox (NULL, "spawn-test-win32-gui: Done, exiting.", + lpszCmdLine, MB_ICONINFORMATION|MB_SYSTEMMODAL); + + return 0; +} diff --git a/tests/spawn-test.c b/tests/spawn-test.c new file mode 100644 index 0000000..1bc360a --- /dev/null +++ b/tests/spawn-test.c @@ -0,0 +1,294 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include +#include +#define pipe(fds) _pipe(fds, 4096, _O_BINARY) +#endif + + +static void +run_tests (void) +{ + GError *err; + gchar *output = NULL; +#ifdef G_OS_WIN32 + gchar *erroutput = NULL; + int pipedown[2], pipeup[2]; + gchar **argv = 0; +#endif + + err = NULL; + if (!g_spawn_command_line_sync ("nonexistent_application foo 'bar baz' blah blah", + NULL, NULL, NULL, + &err)) + { + g_error_free (err); + } + else + { + g_warning ("no error for sync spawn of nonexistent application"); + exit (1); + } + + err = NULL; + if (!g_spawn_command_line_async ("nonexistent_application foo bar baz \"blah blah\"", + &err)) + { + g_error_free (err); + } + else + { + g_warning ("no error for async spawn of nonexistent application"); + exit (1); + } + + err = NULL; +#ifdef G_OS_UNIX + if (!g_spawn_command_line_sync ("/bin/sh -c 'echo hello'", + &output, NULL, NULL, + &err)) + { + fprintf (stderr, "Error: %s\n", err->message); + g_error_free (err); + exit (1); + } + else + { + g_assert (output != NULL); + + if (strcmp (output, "hello\n") != 0) + { + printf ("output was '%s', should have been 'hello'\n", + output); + + exit (1); + } + + g_free (output); + } +#else +#ifdef G_OS_WIN32 + printf ("Running netstat synchronously, collecting its output\n"); + + if (!g_spawn_command_line_sync ("netstat -n", + &output, &erroutput, NULL, + &err)) + { + fprintf (stderr, "Error: %s\n", err->message); + g_error_free (err); + exit (1); + } + else + { + g_assert (output != NULL); + g_assert (erroutput != NULL); + + if (strstr (output, "Active Connections") == 0) + { + printf ("output was '%s', should have contained 'Active Connections'\n", + output); + + exit (1); + } + if (erroutput[0] != '\0') + { + printf ("error output was '%s', should have been empty\n", + erroutput); + exit (1); + } + + g_free (output); + output = NULL; + g_free (erroutput); + erroutput = NULL; + } + + printf ("Running spawn-test-win32-gui in various ways. Click on the OK buttons.\n"); + + printf ("First asynchronously (without wait).\n"); + + if (!g_spawn_command_line_async ("'.\\spawn-test-win32-gui.exe' 1", &err)) + { + fprintf (stderr, "Error: %s\n", err->message); + g_error_free (err); + exit (1); + } + + printf ("Now synchronously, collecting its output.\n"); + if (!g_spawn_command_line_sync ("'.\\spawn-test-win32-gui.exe' 2", + &output, &erroutput, NULL, + &err)) + { + fprintf (stderr, "Error: %s\n", err->message); + g_error_free (err); + exit (1); + } + else + { + g_assert (output != NULL); + g_assert (erroutput != NULL); + + if (strcmp (output, "This is stdout\r\n") != 0) + { + printf ("output was '%s', should have been 'This is stdout'\n", + g_strescape (output, NULL)); + + exit (1); + } + if (strcmp (erroutput, "This is stderr\r\n") != 0) + { + printf ("error output was '%s', should have been 'This is stderr'\n", + g_strescape (erroutput, NULL)); + exit (1); + } + + g_free (output); + g_free (erroutput); + } + + printf ("Now with G_SPAWN_FILE_AND_ARGV_ZERO.\n"); + + if (!g_shell_parse_argv ("'.\\spawn-test-win32-gui.exe' this-should-be-argv-zero nop", NULL, &argv, &err)) + { + fprintf (stderr, "Error parsing command line? %s\n", err->message); + g_error_free (err); + exit (1); + } + + if (!g_spawn_async (NULL, argv, NULL, + G_SPAWN_FILE_AND_ARGV_ZERO, + NULL, NULL, NULL, + &err)) + { + fprintf (stderr, "Error: %s\n", err->message); + g_error_free (err); + exit (1); + } + + printf ("Now talking to it through pipes.\n"); + + if (pipe (pipedown) < 0 || + pipe (pipeup) < 0) + { + fprintf (stderr, "Could not create pipes\n"); + exit (1); + } + + if (!g_shell_parse_argv (g_strdup_printf ("'.\\spawn-test-win32-gui.exe' pipes %d %d", + pipedown[0], pipeup[1]), + NULL, &argv, + &err)) + { + fprintf (stderr, "Error parsing command line? %s\n", err->message); + g_error_free (err); + exit (1); + } + + if (!g_spawn_async (NULL, argv, NULL, + G_SPAWN_LEAVE_DESCRIPTORS_OPEN | + G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, NULL, + &err)) + { + fprintf (stderr, "Error: %s\n", err->message); + g_error_free (err); + exit (1); + } + else + { + int k, n; + char buf[100]; + + if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n)) + { + if (k == -1) + fprintf (stderr, "Read error: %s\n", g_strerror (errno)); + else + fprintf (stderr, "Wanted to read %d bytes, got %d\n", + sizeof (n), k); + exit (1); + } + + if ((k = read (pipeup[0], buf, n)) != n) + { + if (k == -1) + fprintf (stderr, "Read error: %s\n", g_strerror (errno)); + else + fprintf (stderr, "Wanted to read %d bytes, got %d\n", + n, k); + exit (1); + } + + n = strlen ("Bye then"); + if (write (pipedown[1], &n, sizeof (n)) == -1 || + write (pipedown[1], "Bye then", n) == -1) + { + fprintf (stderr, "Write error: %s\n", g_strerror (errno)); + exit (1); + } + + if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n)) + { + if (k == -1) + fprintf (stderr, "Read error: %s\n", g_strerror (errno)); + else + fprintf (stderr, "Wanted to read %d bytes, got %d\n", + sizeof (n), k); + exit (1); + } + + if ((k = read (pipeup[0], buf, n)) != n) + { + if (k == -1) + fprintf (stderr, "Read error: %s\n", g_strerror (errno)); + else + fprintf (stderr, "Wanted to read %d bytes, got %d\n", + n, k); + exit (1); + } + } +#endif +#endif +} + +int +main (int argc, + char *argv[]) +{ + run_tests (); + + return 0; +} diff --git a/tests/testgdate.c b/tests/testgdate.c new file mode 100644 index 0000000..85d22dc --- /dev/null +++ b/tests/testgdate.c @@ -0,0 +1,506 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef GLIB_COMPILATION +#undef GLIB_COMPILATION +#endif + +#include "glib.h" + +#include +#include +#include +#include + +gboolean failed = FALSE; +guint32 passed = 0; +guint32 notpassed = 0; + +#define TEST(m,cond) G_STMT_START { failed = !(cond); \ +if (failed) \ + { ++notpassed; \ + if (!m) \ + g_print ("\n(%s:%d) failed for: %s\n", __FILE__, __LINE__, ( # cond )); \ + else \ + g_print ("\n(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), (gchar*)m); \ + } \ +else \ + ++passed; \ + if ((passed+notpassed) % 10000 == 0) g_print ("."); fflush (stdout); \ +} G_STMT_END + +void g_date_debug_print(GDate* d) +{ + if (!d) g_print("NULL!\n"); + else + g_print("julian: %u (%s) DMY: %u %u %u (%s)\n", + d->julian_days, + d->julian ? "valid" : "invalid", + d->day, + d->month, + d->year, + d->dmy ? "valid" : "invalid"); + + fflush(stdout); +} + +int main(int argc, char** argv) +{ + GDate* d; + guint32 j; + GDateMonth m; + GDateYear y, prev_y; + GDateDay day; + gchar buf[101]; + gchar* loc; + /* Try to get all the leap year cases. */ + GDateYear check_years[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 98, 99, 100, 101, 102, 103, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, + 1598, 1599, 1600, 1601, 1602, 1650, 1651, + 1897, 1898, 1899, 1900, 1901, 1902, 1903, + 1961, 1962, 1963, 1964, 1965, 1967, + 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, + 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, + 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, + 3000, 3001, 3002, 3998, 3999, 4000, 4001, 4002, 4003 + }; + guint n_check_years = sizeof(check_years)/sizeof(GDateYear); + guint i; + gboolean discontinuity; + + g_print("checking GDate..."); + + TEST("sizeof(GDate) is not more than 8 bytes on this platform", sizeof(GDate) < 9); + + d = g_date_new(); + + TEST("Empty constructor produces invalid date", !g_date_valid(d)); + + g_date_free(d); + + d = g_date_new_dmy(1,1,1); + + TEST("January 1, Year 1 created and valid", g_date_valid(d)); + + j = g_date_get_julian(d); + + TEST("January 1, Year 1 is Julian date 1", j == 1); + + TEST("Returned month is January", g_date_get_month(d) == G_DATE_JANUARY); + TEST("Returned day is 1", g_date_get_day(d) == 1); + TEST("Returned year is 1", g_date_get_year(d) == 1); + + TEST("Bad month is invalid", !g_date_valid_month(G_DATE_BAD_MONTH)); + TEST("Month 13 is invalid", !g_date_valid_month(13)); + TEST("Bad day is invalid", !g_date_valid_day(G_DATE_BAD_DAY)); + TEST("Day 32 is invalid", !g_date_valid_day(32)); + TEST("Bad year is invalid", !g_date_valid_year(G_DATE_BAD_YEAR)); + TEST("Bad julian is invalid", !g_date_valid_julian(G_DATE_BAD_JULIAN)); + TEST("Bad weekday is invalid", !g_date_valid_weekday(G_DATE_BAD_WEEKDAY)); + TEST("Year 2000 is a leap year", g_date_is_leap_year(2000)); + TEST("Year 1999 is not a leap year", !g_date_is_leap_year(1999)); + TEST("Year 1996 is a leap year", g_date_is_leap_year(1996)); + TEST("Year 1600 is a leap year", g_date_is_leap_year(1600)); + TEST("Year 2100 is not a leap year", !g_date_is_leap_year(2100)); + TEST("Year 1800 is not a leap year", !g_date_is_leap_year(1800)); + + g_date_free(d); + + loc = setlocale(LC_ALL,""); + if (loc) + g_print("\nLocale set to %s\n", loc); + else + g_print("\nLocale unchanged\n"); + + d = g_date_new(); + g_date_set_time(d, time(NULL)); + TEST("Today is valid", g_date_valid(d)); + + g_date_strftime(buf,100,"Today is a %A, %x\n", d); + g_print("%s", buf); + + g_date_set_time(d, 1); + TEST("Beginning of Unix epoch is valid", g_date_valid(d)); + + g_date_strftime(buf,100,"1 second into the Unix epoch it was a %A, in the month of %B, %x\n", d); + g_print("%s", buf); + + g_date_set_julian(d, 1); + TEST("GDate's \"Julian\" epoch's first day is valid", g_date_valid(d)); + + g_date_strftime(buf,100,"Our \"Julian\" epoch begins on a %A, in the month of %B, %x\n", + d); + g_print("%s", buf); + + g_date_set_dmy(d, 10, 1, 2000); + + g_date_strftime(buf,100,"%x", d); + + g_date_set_parse(d, buf); + /* Note: this test will hopefully work, but no promises. */ + TEST("Successfully parsed a %x-formatted string", + g_date_valid(d) && + g_date_get_month(d) == 1 && + g_date_get_day(d) == 10 && + g_date_get_year(d) == 2000); + if (failed) + g_date_debug_print(d); + + g_date_free(d); + + j = G_DATE_BAD_JULIAN; + + i = 0; + discontinuity = TRUE; + y = check_years[0]; + prev_y = G_DATE_BAD_YEAR; + while (i < n_check_years) + { + guint32 first_day_of_year = G_DATE_BAD_JULIAN; + guint16 days_in_year = g_date_is_leap_year(y) ? 366 : 365; + guint sunday_week_of_year = 0; + guint sunday_weeks_in_year = g_date_get_sunday_weeks_in_year(y); + guint monday_week_of_year = 0; + guint monday_weeks_in_year = g_date_get_monday_weeks_in_year(y); + guint iso8601_week_of_year = 0; + + if (discontinuity) + g_print(" (Break in sequence of requested years to check)\n"); + + g_print("Checking year %u", y); + + TEST("Year is valid", g_date_valid_year(y)); + + TEST("Number of Sunday weeks in year is 52 or 53", + sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53); + + TEST("Number of Monday weeks in year is 52 or 53", + monday_weeks_in_year == 52 || monday_weeks_in_year == 53); + + m = 1; + while (m < 13) + { + guint8 dim = g_date_get_days_in_month(m,y); + GDate days[31]; /* This is the fast way, no allocation */ + + TEST("Sensible number of days in month", (dim > 0 && dim < 32)); + + TEST("Month between 1 and 12 is valid", g_date_valid_month(m)); + + day = 1; + + g_date_clear(days, 31); + + while (day <= dim) + { + guint i; + GDate tmp; + + TEST("DMY triplet is valid", g_date_valid_dmy(day,m,y)); + + /* Create GDate with triplet */ + + d = &days[day-1]; + + TEST("Cleared day is invalid", !g_date_valid(d)); + + g_date_set_dmy(d,day,m,y); + + TEST("Set day is valid", g_date_valid(d)); + + if (m == G_DATE_JANUARY && day == 1) + { + first_day_of_year = g_date_get_julian(d); + } + + g_assert(first_day_of_year != G_DATE_BAD_JULIAN); + + TEST("Date with DMY triplet is valid", g_date_valid(d)); + TEST("Month accessor works", g_date_get_month(d) == m); + TEST("Year accessor works", g_date_get_year(d) == y); + TEST("Day of month accessor works", g_date_get_day(d) == day); + + TEST("Day of year is consistent with Julian dates", + ((g_date_get_julian(d) + 1 - first_day_of_year) == + (g_date_get_day_of_year(d)))); + + if (failed) + { + g_print("first day: %u this day: %u day of year: %u\n", + first_day_of_year, + g_date_get_julian(d), + g_date_get_day_of_year(d)); + } + + if (m == G_DATE_DECEMBER && day == 31) + { + TEST("Last day of year equals number of days in year", + g_date_get_day_of_year(d) == days_in_year); + if (failed) + { + g_print("last day: %u days in year: %u\n", + g_date_get_day_of_year(d), days_in_year); + } + } + + TEST("Day of year is not more than number of days in the year", + g_date_get_day_of_year(d) <= days_in_year); + + TEST("Monday week of year is not more than number of weeks in the year", + g_date_get_monday_week_of_year(d) <= monday_weeks_in_year); + if (failed) + { + g_print("Weeks in year: %u\n", monday_weeks_in_year); + g_date_debug_print(d); + } + TEST("Monday week of year is >= than last week of year", + g_date_get_monday_week_of_year(d) >= monday_week_of_year); + + if (g_date_get_weekday(d) == G_DATE_MONDAY) + { + + TEST("Monday week of year on Monday 1 more than previous day's week of year", + (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 1); + if ((m == G_DATE_JANUARY && day <= 4) || + (m == G_DATE_DECEMBER && day >= 29)) { + TEST("ISO 8601 week of year on Monday Dec 29 - Jan 4 is 1", + (g_date_get_iso8601_week_of_year(d) == 1)); + } else { + TEST("ISO 8601 week of year on Monday 1 more than previous day's week of year", + (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 1); + } + } + else + { + TEST("Monday week of year on non-Monday 0 more than previous day's week of year", + (g_date_get_monday_week_of_year(d) - monday_week_of_year) == 0); + if (!(day == 1 && m == G_DATE_JANUARY)) { + TEST("ISO 8601 week of year on non-Monday 0 more than previous day's week of year (", + (g_date_get_iso8601_week_of_year(d) - iso8601_week_of_year) == 0); + } + } + + + monday_week_of_year = g_date_get_monday_week_of_year(d); + iso8601_week_of_year = g_date_get_iso8601_week_of_year(d); + + + TEST("Sunday week of year is not more than number of weeks in the year", + g_date_get_sunday_week_of_year(d) <= sunday_weeks_in_year); + if (failed) + { + g_date_debug_print(d); + } + TEST("Sunday week of year is >= than last week of year", + g_date_get_sunday_week_of_year(d) >= sunday_week_of_year); + + if (g_date_get_weekday(d) == G_DATE_SUNDAY) + { + TEST("Sunday week of year on Sunday 1 more than previous day's week of year", + (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 1); + } + else + { + TEST("Sunday week of year on non-Sunday 0 more than previous day's week of year", + (g_date_get_sunday_week_of_year(d) - sunday_week_of_year) == 0); + } + + sunday_week_of_year = g_date_get_sunday_week_of_year(d); + + TEST("Date is equal to itself", + g_date_compare(d,d) == 0); + + + /*************** Increments ***********/ + + i = 1; + while (i < 402) /* Need to get 400 year increments in */ + { + + /***** Days ******/ + tmp = *d; + g_date_add_days(d, i); + + TEST("Adding days gives a value greater than previous", + g_date_compare(d, &tmp) > 0); + + g_date_subtract_days(d, i); + TEST("Forward days then backward days returns us to current day", + g_date_get_day(d) == day); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward days then backward days returns us to current month", + g_date_get_month(d) == m); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward days then backward days returns us to current year", + g_date_get_year(d) == y); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + /******* Months ********/ + + tmp = *d; + g_date_add_months(d, i); + TEST("Adding months gives a larger value", + g_date_compare(d, &tmp) > 0); + g_date_subtract_months(d, i); + + TEST("Forward months then backward months returns us to current month", + g_date_get_month(d) == m); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward months then backward months returns us to current year", + g_date_get_year(d) == y); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + + if (day < 29) + { + /* Day should be unchanged */ + + TEST("Forward months then backward months returns us to current day", + g_date_get_day(d) == day); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + } + else + { + /* reset the day for later tests */ + g_date_set_day(d, day); + } + + /******* Years ********/ + + tmp = *d; + g_date_add_years(d, i); + + TEST("Adding years gives a larger value", + g_date_compare(d,&tmp) > 0); + + g_date_subtract_years(d, i); + + TEST("Forward years then backward years returns us to current month", + g_date_get_month(d) == m); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + TEST("Forward years then backward years returns us to current year", + g_date_get_year(d) == y); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + + if (m != 2 && day != 29) + { + TEST("Forward years then backward years returns us to current day", + g_date_get_day(d) == day); + + if (failed) + { + g_print(" (increment %u, dmy %u %u %u) ", i, day, m, y); + g_date_debug_print(d); + } + } + else + { + g_date_set_day(d, day); /* reset */ + } + + i += 10; + } + + /***** increment test relative to our local Julian count */ + + if (!discontinuity) { + + /* We can only run sequence tests between sequential years */ + + TEST("Julians are sequential with increment 1", + j+1 == g_date_get_julian(d)); + if (failed) + { + g_print("Out of sequence, prev: %u expected: %u got: %u\n", + j, j+1, g_date_get_julian(d)); + } + + g_date_add_days(d,1); + TEST("Next day has julian 1 higher", + g_date_get_julian(d) == j + 2); + g_date_subtract_days(d, 1); + + if (j != G_DATE_BAD_JULIAN) + { + g_date_subtract_days(d, 1); + + TEST("Previous day has julian 1 lower", + g_date_get_julian(d) == j); + + g_date_add_days(d, 1); /* back to original */ + } + } + discontinuity = FALSE; /* goes away now */ + + fflush(stdout); + fflush(stderr); + + j = g_date_get_julian(d); /* inc current julian */ + + ++day; + } + ++m; + } + g_print(" done\n"); + ++i; + prev_y = y; + y = check_years[i]; + if (prev_y == G_DATE_BAD_YEAR || + (prev_y + 1) != y) discontinuity = TRUE; + } + + + g_print("\n%u tests passed, %u failed\n",passed, notpassed); + + return 0; +} + + diff --git a/tests/testgdateparser.c b/tests/testgdateparser.c new file mode 100644 index 0000000..f0e284a --- /dev/null +++ b/tests/testgdateparser.c @@ -0,0 +1,115 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef GLIB_COMPILATION +#undef GLIB_COMPILATION +#endif + +#include "glib.h" + +#include +#include +#include + +void g_date_debug_print(GDate* d) +{ + if (!d) g_print("NULL!\n"); + else + g_print("julian: %u (%s) DMY: %u %u %u (%s)\n", + d->julian_days, + d->julian ? "valid" : "invalid", + d->day, + d->month, + d->year, + d->dmy ? "valid" : "invalid"); + + fflush(stdout); +} + +/* These only work in the POSIX locale, maybe C too - + * type POSIX into the program to check them + */ +char* posix_tests [] = { + "19981024", + "981024", + "October 1998", + "October 98", + "oCT 98", + "10/24/98", + "10 -- 24 -- 98", + "10/24/1998", + "October 24, 1998", + NULL +}; + +int main(int argc, char** argv) +{ + GDate* d; + gchar* loc; + gchar input[1024]; + + loc = setlocale(LC_ALL,""); + if (loc) + g_print("\nLocale set to %s\n", loc); + else + g_print("\nLocale unchanged\n"); + + d = g_date_new(); + + while (fgets(input, 1023, stdin)) + { + if (input[0] == '\n') + { + g_print("Enter a date to parse and press enter, or type `POSIX':\n"); + continue; + } + + if (strcmp(input,"POSIX\n") == 0) + { + char** s = posix_tests; + while (*s) { + g_date_set_parse(d, *s); + + g_print("POSIXy parse test `%s' ...", *s); + + if (!g_date_valid(d)) + { + g_print(" failed.\n"); + } + else + { + gchar buf[256]; + + g_date_strftime(buf,100," parsed `%x' (%B %d %Y)\n", + d); + g_print("%s", buf); + } + + ++s; + } + } + else + { + g_date_set_parse(d, input); + + if (!g_date_valid(d)) + { + g_print("Parse failed.\n"); + } + else + { + gchar buf[256]; + + g_date_strftime(buf,100,"Parsed: `%x' (%B %d %Y)\n", + d); + g_print("%s", buf); + } + } + } + + g_date_free(d); + + return 0; +} + + diff --git a/tests/testglib.c b/tests/testglib.c new file mode 100644 index 0000000..dbd0b5a --- /dev/null +++ b/tests/testglib.c @@ -0,0 +1,1548 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#undef GLIB_COMPILATION + +#include +#include +#include + +#include "glib.h" +#include + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef G_OS_WIN32 +#include /* For read(), write() etc */ +#endif + + +#define GLIB_TEST_STRING "el dorado " +#define GLIB_TEST_STRING_5 "el do" + + +/* --- variables --- */ +static gint test_nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; +static gint more_nums[10] = { 8, 9, 7, 0, 3, 2, 5, 1, 4, 6}; + +/* --- functions --- */ +static gint +my_list_compare_one (gconstpointer a, gconstpointer b) +{ + gint one = *((const gint*)a); + gint two = *((const gint*)b); + return one-two; +} + +static gint +my_list_compare_two (gconstpointer a, gconstpointer b) +{ + gint one = *((const gint*)a); + gint two = *((const gint*)b); + return two-one; +} + +/* static void +my_list_print (gpointer a, gpointer b) +{ + gint three = *((gint*)a); + g_print("%d", three); +}; */ + +static void +glist_test (void) +{ + GList *list = NULL; + guint i; + + for (i = 0; i < 10; i++) + list = g_list_append (list, &test_nums[i]); + list = g_list_reverse (list); + + for (i = 0; i < 10; i++) + { + GList *t = g_list_nth (list, i); + if (*((gint*) t->data) != (9 - i)) + g_error ("Regular insert failed"); + } + + for (i = 0; i < 10; i++) + if (g_list_position (list, g_list_nth (list, i)) != i) + g_error ("g_list_position does not seem to be the inverse of g_list_nth\n"); + + g_list_free (list); + list = NULL; + + for (i = 0; i < 10; i++) + list = g_list_insert_sorted (list, &more_nums[i], my_list_compare_one); + + /* + g_print("\n"); + g_list_foreach (list, my_list_print, NULL); + */ + + for (i = 0; i < 10; i++) + { + GList *t = g_list_nth (list, i); + if (*((gint*) t->data) != i) + g_error ("Sorted insert failed"); + } + + g_list_free (list); + list = NULL; + + for (i = 0; i < 10; i++) + list = g_list_insert_sorted (list, &more_nums[i], my_list_compare_two); + + /* + g_print("\n"); + g_list_foreach (list, my_list_print, NULL); + */ + + for (i = 0; i < 10; i++) + { + GList *t = g_list_nth (list, i); + if (*((gint*) t->data) != (9 - i)) + g_error ("Sorted insert failed"); + } + + g_list_free (list); + list = NULL; + + for (i = 0; i < 10; i++) + list = g_list_prepend (list, &more_nums[i]); + + list = g_list_sort (list, my_list_compare_two); + + /* + g_print("\n"); + g_list_foreach (list, my_list_print, NULL); + */ + + for (i = 0; i < 10; i++) + { + GList *t = g_list_nth (list, i); + if (*((gint*) t->data) != (9 - i)) + g_error ("Merge sort failed"); + } + + g_list_free (list); +} + +static void +gslist_test (void) +{ + GSList *slist = NULL; + guint i; + + for (i = 0; i < 10; i++) + slist = g_slist_append (slist, &test_nums[i]); + slist = g_slist_reverse (slist); + + for (i = 0; i < 10; i++) + { + GSList *st = g_slist_nth (slist, i); + if (*((gint*) st->data) != (9 - i)) + g_error ("failed"); + } + + g_slist_free (slist); + slist = NULL; + + for (i = 0; i < 10; i++) + slist = g_slist_insert_sorted (slist, &more_nums[i], my_list_compare_one); + + /* + g_print("\n"); + g_slist_foreach (slist, my_list_print, NULL); + */ + + for (i = 0; i < 10; i++) + { + GSList *st = g_slist_nth (slist, i); + if (*((gint*) st->data) != i) + g_error ("Sorted insert failed"); + } + + g_slist_free (slist); + slist = NULL; + + for (i = 0; i < 10; i++) + slist = g_slist_insert_sorted (slist, &more_nums[i], my_list_compare_two); + + /* + g_print("\n"); + g_slist_foreach (slist, my_list_print, NULL); + */ + + for (i = 0; i < 10; i++) + { + GSList *st = g_slist_nth (slist, i); + if (*((gint*) st->data) != (9 - i)) + g_error("Sorted insert failed"); + } + + g_slist_free(slist); + slist = NULL; + + for (i = 0; i < 10; i++) + slist = g_slist_prepend (slist, &more_nums[i]); + + slist = g_slist_sort (slist, my_list_compare_two); + + /* + g_print("\n"); + g_slist_foreach (slist, my_list_print, NULL); + */ + + for (i = 0; i < 10; i++) + { + GSList *st = g_slist_nth (slist, i); + if (*((gint*) st->data) != (9 - i)) + g_error("Sorted insert failed"); + } + + g_slist_free(slist); +} + +static gboolean +node_build_string (GNode *node, + gpointer data) +{ + gchar **p = data; + gchar *string; + gchar c[2] = "_"; + + c[0] = ((gchar) ((gintptr) (node->data))); + + string = g_strconcat (*p ? *p : "", c, NULL); + g_free (*p); + *p = string; + + return FALSE; +} + +static void +gnode_test (void) +{ +#define C2P(c) ((gpointer) ((long) (c))) +#define P2C(p) ((gchar) ((gintptr) (p))) + GNode *root; + GNode *node; + GNode *node_B; + GNode *node_F; + GNode *node_G; + GNode *node_J; + guint i; + gchar *tstring, *cstring; + + root = g_node_new (C2P ('A')); + g_assert (g_node_depth (root) == 1 && g_node_max_height (root) == 1); + + node_B = g_node_new (C2P ('B')); + g_node_append (root, node_B); + g_assert (root->children == node_B); + + g_node_append_data (node_B, C2P ('E')); + g_node_prepend_data (node_B, C2P ('C')); + g_node_insert (node_B, 1, g_node_new (C2P ('D'))); + + node_F = g_node_new (C2P ('F')); + g_node_append (root, node_F); + g_assert (root->children->next == node_F); + + node_G = g_node_new (C2P ('G')); + g_node_append (node_F, node_G); + node_J = g_node_new (C2P ('J')); + g_node_prepend (node_G, node_J); + g_node_insert (node_G, 42, g_node_new (C2P ('K'))); + g_node_insert_data (node_G, 0, C2P ('H')); + g_node_insert (node_G, 1, g_node_new (C2P ('I'))); + + g_assert (g_node_depth (root) == 1); + g_assert (g_node_max_height (root) == 4); + g_assert (g_node_depth (node_G->children->next) == 4); + g_assert (g_node_n_nodes (root, G_TRAVERSE_LEAFS) == 7); + g_assert (g_node_n_nodes (root, G_TRAVERSE_NON_LEAFS) == 4); + g_assert (g_node_n_nodes (root, G_TRAVERSE_ALL) == 11); + g_assert (g_node_max_height (node_F) == 3); + g_assert (g_node_n_children (node_G) == 4); + g_assert (g_node_find_child (root, G_TRAVERSE_ALL, C2P ('F')) == node_F); + g_assert (g_node_find (root, G_LEVEL_ORDER, G_TRAVERSE_NON_LEAFS, C2P ('I')) == NULL); + g_assert (g_node_find (root, G_IN_ORDER, G_TRAVERSE_LEAFS, C2P ('J')) == node_J); + + for (i = 0; i < g_node_n_children (node_B); i++) + { + node = g_node_nth_child (node_B, i); + g_assert (P2C (node->data) == ('C' + i)); + } + + for (i = 0; i < g_node_n_children (node_G); i++) + g_assert (g_node_child_position (node_G, g_node_nth_child (node_G, i)) == i); + + /* we have built: A + * / \ + * B F + * / | \ \ + * C D E G + * / /\ \ + * H I J K + * + * for in-order traversal, 'G' is considered to be the "left" + * child of 'F', which will cause 'F' to be the last node visited. + */ + + tstring = NULL; + g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "ABCDEFGHIJK"); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_POST_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "CDEBHIJKGFA"); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "CBDEAHGIJKF"); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "ABFCDEGHIJK"); + g_free (tstring); tstring = NULL; + + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_LEAFS, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "CDEHIJK"); + g_free (tstring); tstring = NULL; + g_node_traverse (root, G_PRE_ORDER, G_TRAVERSE_NON_LEAFS, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "ABFG"); + g_free (tstring); tstring = NULL; + + g_node_reverse_children (node_B); + g_node_reverse_children (node_G); + + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "ABFEDCGKJIH"); + g_free (tstring); tstring = NULL; + + cstring = NULL; + node = g_node_copy (root); + g_assert (g_node_n_nodes (root, G_TRAVERSE_ALL) == g_node_n_nodes (node, G_TRAVERSE_ALL)); + g_assert (g_node_max_height (root) == g_node_max_height (node)); + g_node_traverse (root, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring); + g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &cstring); + g_assert_cmpstr (tstring, ==, cstring); + g_free (tstring); tstring = NULL; + g_free (cstring); cstring = NULL; + g_node_destroy (node); + + g_node_destroy (root); + + /* allocation tests */ + + root = g_node_new (NULL); + node = root; + + for (i = 0; i < 2048; i++) + { + g_node_append (node, g_node_new (NULL)); + if ((i%5) == 4) + node = node->children->next; + } + g_assert (g_node_max_height (root) > 100); + g_assert (g_node_n_nodes (root, G_TRAVERSE_ALL) == 1 + 2048); + + g_node_destroy (root); +#undef C2P +#undef P2C +} + +static gint +my_compare (gconstpointer a, + gconstpointer b) +{ + const char *cha = a; + const char *chb = b; + + return *cha - *chb; +} + +static gint +my_traverse (gpointer key, + gpointer value, + gpointer data) +{ + char *ch = key; + g_print ("%c ", *ch); + return FALSE; +} + +static void +binary_tree_test (void) +{ + GTree *tree; + char chars[62]; + guint i, j; + + tree = g_tree_new (my_compare); + i = 0; + for (j = 0; j < 10; j++, i++) + { + chars[i] = '0' + j; + g_tree_insert (tree, &chars[i], &chars[i]); + } + for (j = 0; j < 26; j++, i++) + { + chars[i] = 'A' + j; + g_tree_insert (tree, &chars[i], &chars[i]); + } + for (j = 0; j < 26; j++, i++) + { + chars[i] = 'a' + j; + g_tree_insert (tree, &chars[i], &chars[i]); + } + + g_assert_cmpint (g_tree_nnodes (tree), ==, 10 + 26 + 26); + g_assert_cmpint (g_tree_height (tree), ==, 6); + + if (g_test_verbose()) + { + g_print ("tree: "); + g_tree_foreach (tree, my_traverse, NULL); + g_print ("\n"); + } + + for (i = 0; i < 10; i++) + g_tree_remove (tree, &chars[i]); + + g_assert_cmpint (g_tree_nnodes (tree), ==, 26 + 26); + g_assert_cmpint (g_tree_height (tree), ==, 6); + + if (g_test_verbose()) + { + g_print ("tree: "); + g_tree_foreach (tree, my_traverse, NULL); + g_print ("\n"); + } +} + +static gboolean +my_hash_callback_remove (gpointer key, + gpointer value, + gpointer user_data) +{ + int *d = value; + + if ((*d) % 2) + return TRUE; + + return FALSE; +} + +static void +my_hash_callback_remove_test (gpointer key, + gpointer value, + gpointer user_data) +{ + int *d = value; + + if ((*d) % 2) + g_print ("bad!\n"); +} + +static void +my_hash_callback (gpointer key, + gpointer value, + gpointer user_data) +{ + int *d = value; + *d = 1; +} + +static guint +my_hash (gconstpointer key) +{ + return (guint) *((const gint*) key); +} + +static gboolean +my_hash_equal (gconstpointer a, + gconstpointer b) +{ + return *((const gint*) a) == *((const gint*) b); +} + +static gboolean +find_first_that(gpointer key, + gpointer value, + gpointer user_data) +{ + gint *v = value; + gint *test = user_data; + return (*v == *test); +} + +static void +test_g_parse_debug_string (void) +{ + GDebugKey keys[3] = { + { "foo", 1 }, + { "bar", 2 }, + { "baz", 4 } + }; + guint n_keys = 3; + guint result; + + result = g_parse_debug_string ("bar:foo:blubb", keys, n_keys); + g_assert (result == 3); + + result = g_parse_debug_string (":baz::_E@~!_::", keys, n_keys); + g_assert (result == 4); + + result = g_parse_debug_string ("", keys, n_keys); + g_assert (result == 0); + + result = g_parse_debug_string (" : ", keys, n_keys); + g_assert (result == 0); +} + +static void +log_warning_error_tests (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + g_message ("this is a g_message test."); + g_message ("non-printable UTF-8: \"\xc3\xa4\xda\x85\""); + g_message ("unsafe chars: \"\x10\x11\x12\n\t\x7f\x81\x82\x83\""); + exit (0); + } + g_test_trap_assert_passed(); + g_test_trap_assert_stderr ("*is a g_message test*"); + g_test_trap_assert_stderr ("*non-printable UTF-8*"); + g_test_trap_assert_stderr ("*unsafe chars*"); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + g_warning ("harmless warning with parameters: %d %s %#x", 42, "Boo", 12345); + exit (0); + } + g_test_trap_assert_failed(); /* we have fatal-warnings enabled */ + g_test_trap_assert_stderr ("*harmless warning*"); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + g_print (NULL); + exit (0); + } + g_test_trap_assert_failed(); /* we have fatal-warnings enabled */ + g_test_trap_assert_stderr ("*g_print*assertion*failed*"); + g_test_trap_assert_stderr ("*NULL*"); +} + +static void +timer_tests (void) +{ + GTimer *timer, *timer2; + gdouble elapsed; + + /* basic testing */ + timer = g_timer_new (); + g_timer_start (timer); + elapsed = g_timer_elapsed (timer, NULL); + g_timer_stop (timer); + g_assert_cmpfloat (elapsed, <=, g_timer_elapsed (timer, NULL)); + g_timer_destroy (timer); + + if (g_test_slow()) + { + if (g_test_verbose()) + g_print ("checking timers...\n"); + timer = g_timer_new (); + if (g_test_verbose()) + g_print (" spinning for 3 seconds...\n"); + g_timer_start (timer); + while (g_timer_elapsed (timer, NULL) < 3) + ; + g_timer_stop (timer); + g_timer_destroy (timer); + if (g_test_verbose()) + g_print ("ok\n"); + } + + if (g_test_slow()) + { + gulong elapsed_usecs; + if (g_test_verbose()) + g_print ("checking g_timer_continue...\n"); + timer2 = g_timer_new (); + if (g_test_verbose()) + g_print ("\trun for 1 second...\n"); + timer = g_timer_new(); + g_usleep (G_USEC_PER_SEC); /* run timer for 1 second */ + g_timer_stop (timer); + if (g_test_verbose()) + g_print ("\tstop for 1 second...\n"); + g_usleep (G_USEC_PER_SEC); /* wait for 1 second */ + if (g_test_verbose()) + g_print ("\trun for 2 seconds...\n"); + g_timer_continue (timer); + g_usleep (2 * G_USEC_PER_SEC); /* run timer for 2 seconds */ + g_timer_stop(timer); + if (g_test_verbose()) + g_print ("\tstop for 1.5 seconds...\n"); + g_usleep ((3 * G_USEC_PER_SEC) / 2); /* wait for 1.5 seconds */ + if (g_test_verbose()) + g_print ("\trun for 0.2 seconds...\n"); + g_timer_continue (timer); + g_usleep (G_USEC_PER_SEC / 5); /* run timer for 0.2 seconds */ + g_timer_stop (timer); + if (g_test_verbose()) + g_print ("\tstop for 4 seconds...\n"); + g_usleep (4 * G_USEC_PER_SEC); /* wait for 4 seconds */ + if (g_test_verbose()) + g_print ("\trun for 5.8 seconds...\n"); + g_timer_continue (timer); + g_usleep ((29 * G_USEC_PER_SEC) / 5); /* run timer for 5.8 seconds */ + g_timer_stop(timer); + elapsed = g_timer_elapsed (timer, &elapsed_usecs); + if (g_test_verbose()) + g_print ("\t=> timer = %.6f = %d.%06ld (should be: 9.000000) (%.6f off)\n", elapsed, (int) elapsed, elapsed_usecs, ABS (elapsed - 9.)); + g_assert_cmpfloat (elapsed, >, 8.8); + g_assert_cmpfloat (elapsed, <, 9.2); + if (g_test_verbose()) + g_print ("g_timer_continue ... ok\n\n"); + g_timer_stop (timer2); + elapsed = g_timer_elapsed (timer2, &elapsed_usecs); + if (g_test_verbose()) + g_print ("\t=> timer2 = %.6f = %d.%06ld (should be: %.6f) (%.6f off)\n\n", elapsed, (int) elapsed, elapsed_usecs, 9.+6.5, ABS (elapsed - (9.+6.5))); + g_assert_cmpfloat (elapsed, >, 8.8 + 6.5); + g_assert_cmpfloat (elapsed, <, 9.2 + 6.5); + if (g_test_verbose()) + g_print ("timer2 ... ok\n\n"); + g_timer_destroy (timer); + g_timer_destroy (timer2); + } +} + +static void +type_sizes (void) +{ + guint16 gu16t1 = 0x44afU, gu16t2 = 0xaf44U; + guint32 gu32t1 = 0x02a7f109U, gu32t2 = 0x09f1a702U; + guint64 gu64t1 = G_GINT64_CONSTANT(0x1d636b02300a7aa7U), + gu64t2 = G_GINT64_CONSTANT(0xa77a0a30026b631dU); + /* type sizes */ + g_assert_cmpint (sizeof (gint8), ==, 1); + g_assert_cmpint (sizeof (gint16), ==, 2); + g_assert_cmpint (sizeof (gint32), ==, 4); + g_assert_cmpint (sizeof (gint64), ==, 8); + /* endian macros */ + if (g_test_verbose()) + g_print ("checking endian macros (host is %s)...\n", + G_BYTE_ORDER == G_BIG_ENDIAN ? "big endian" : "little endian"); + g_assert (GUINT16_SWAP_LE_BE (gu16t1) == gu16t2); + g_assert (GUINT32_SWAP_LE_BE (gu32t1) == gu32t2); + g_assert (GUINT64_SWAP_LE_BE (gu64t1) == gu64t2); +} + +static void +test_info (void) +{ + const gchar *un, *rn, *hn; + const gchar *tmpdir, *homedir, *userdatadir, *uconfdir, *ucachedir; + const gchar *uddesktop, *udddocs, *uddpubshare; + gchar **sv, *cwd, *sdatadirs, *sconfdirs, *langnames; + if (g_test_verbose()) + g_print ("TestGLib v%u.%u.%u (i:%u b:%u)\n", + glib_major_version, + glib_minor_version, + glib_micro_version, + glib_interface_age, + glib_binary_age); + + cwd = g_get_current_dir (); + un = g_get_user_name(); + rn = g_get_real_name(); + hn = g_get_host_name(); + if (g_test_verbose()) + { + g_print ("cwd: %s\n", cwd); + g_print ("user: %s\n", un); + g_print ("real: %s\n", rn); + g_print ("host: %s\n", hn); + } + g_free (cwd); + + tmpdir = g_get_tmp_dir(); + g_assert (tmpdir != NULL); + homedir = g_get_home_dir (); + g_assert (homedir != NULL); + userdatadir = g_get_user_data_dir (); + g_assert (userdatadir != NULL); + uconfdir = g_get_user_config_dir (); + g_assert (uconfdir != NULL); + ucachedir = g_get_user_cache_dir (); + g_assert (ucachedir != NULL); + + uddesktop = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + g_assert (uddesktop != NULL); + udddocs = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); + uddpubshare = g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE); + + sv = (gchar **) g_get_system_data_dirs (); + sdatadirs = g_strjoinv (G_SEARCHPATH_SEPARATOR_S, sv); + sv = (gchar **) g_get_system_config_dirs (); + sconfdirs = g_strjoinv (G_SEARCHPATH_SEPARATOR_S, sv); + sv = (gchar **) g_get_language_names (); + langnames = g_strjoinv (":", sv); + + if (g_test_verbose()) + { + g_print ("tmp-dir: %s\n", tmpdir); + g_print ("home: %s\n", homedir); + g_print ("user_data: %s\n", userdatadir); + g_print ("user_config: %s\n", uconfdir); + g_print ("user_cache: %s\n", ucachedir); + g_print ("system_data: %s\n", sdatadirs); + g_print ("system_config: %s\n", sconfdirs); + g_print ("languages: %s\n", langnames); + g_print ("user_special[DESKTOP]: %s\n", uddesktop); + g_print ("user_special[DOCUMENTS]: %s\n", udddocs); + g_print ("user_special[PUBLIC_SHARE]: %s\n", uddpubshare); + } + g_free (sdatadirs); + g_free (sconfdirs); + g_free (langnames); + + if (g_test_verbose()) + { + const gchar *charset; + if (g_get_charset ((G_CONST_RETURN char**)&charset)) + g_print ("current charset is UTF-8: %s\n", charset); + else + g_print ("current charset is not UTF-8: %s\n", charset); + +#ifdef G_PLATFORM_WIN32 + g_print ("current locale: %s\n", g_win32_getlocale ()); + + g_print ("found more.com as %s\n", g_find_program_in_path ("more.com")); + g_print ("found regedit as %s\n", g_find_program_in_path ("regedit")); + + g_print ("a Win32 error message: %s\n", g_win32_error_message (2)); +#endif + } +} + +static void +test_paths (void) +{ + struct { + gchar *filename; + gchar *dirname; + } dirname_checks[] = { + { "/", "/" }, + { "////", "/" }, + { ".////", "." }, + { "../", ".." }, + { "..////", ".." }, + { "a/b", "a" }, + { "a/b/", "a/b" }, + { "c///", "c" }, +#ifdef G_OS_WIN32 + { "\\", "\\" }, + { ".\\\\\\\\", "." }, + { "..\\", ".." }, + { "..\\\\\\\\", ".." }, + { "a\\b", "a" }, + { "a\\b/", "a\\b" }, + { "a/b\\", "a/b" }, + { "c\\\\/", "c" }, + { "//\\", "/" }, +#endif +#ifdef G_WITH_CYGWIN + { "//server/share///x", "//server/share" }, +#endif + { ".", "." }, + { "..", "." }, + { "", "." }, + }; + const guint n_dirname_checks = G_N_ELEMENTS (dirname_checks); + struct { + gchar *filename; + gchar *without_root; + } skip_root_checks[] = { + { "/", "" }, + { "//", "" }, + { "/foo", "foo" }, + { "//foo", "foo" }, + { "a/b", NULL }, +#ifdef G_OS_WIN32 + { "\\", "" }, + { "\\foo", "foo" }, + { "\\\\server\\foo", "" }, + { "\\\\server\\foo\\bar", "bar" }, + { "a\\b", NULL }, +#endif +#ifdef G_WITH_CYGWIN + { "//server/share///x", "//x" }, +#endif + { ".", NULL }, + { "", NULL }, + }; + const guint n_skip_root_checks = G_N_ELEMENTS (skip_root_checks); + gchar *string; + guint i; + if (g_test_verbose()) + g_print ("checking g_path_get_basename()..."); + string = g_path_get_basename (G_DIR_SEPARATOR_S "foo" G_DIR_SEPARATOR_S "dir" G_DIR_SEPARATOR_S); + g_assert (strcmp (string, "dir") == 0); + g_free (string); + string = g_path_get_basename (G_DIR_SEPARATOR_S "foo" G_DIR_SEPARATOR_S "file"); + g_assert (strcmp (string, "file") == 0); + g_free (string); + if (g_test_verbose()) + g_print ("ok\n"); + +#ifdef G_OS_WIN32 + string = g_path_get_basename ("/foo/dir/"); + g_assert (strcmp (string, "dir") == 0); + g_free (string); + string = g_path_get_basename ("/foo/file"); + g_assert (strcmp (string, "file") == 0); + g_free (string); +#endif + + if (g_test_verbose()) + g_print ("checking g_path_get_dirname()..."); + for (i = 0; i < n_dirname_checks; i++) + { + gchar *dirname = g_path_get_dirname (dirname_checks[i].filename); + if (strcmp (dirname, dirname_checks[i].dirname) != 0) + { + g_error ("\nfailed for \"%s\"==\"%s\" (returned: \"%s\")\n", + dirname_checks[i].filename, + dirname_checks[i].dirname, + dirname); + } + g_free (dirname); + } + if (g_test_verbose()) + g_print ("ok\n"); + + if (g_test_verbose()) + g_print ("checking g_path_skip_root()..."); + for (i = 0; i < n_skip_root_checks; i++) + { + const gchar *skipped = g_path_skip_root (skip_root_checks[i].filename); + if ((skipped && !skip_root_checks[i].without_root) || + (!skipped && skip_root_checks[i].without_root) || + ((skipped && skip_root_checks[i].without_root) && + strcmp (skipped, skip_root_checks[i].without_root))) + { + g_error ("\nfailed for \"%s\"==\"%s\" (returned: \"%s\")\n", + skip_root_checks[i].filename, + (skip_root_checks[i].without_root ? + skip_root_checks[i].without_root : ""), + (skipped ? skipped : "")); + } + } + if (g_test_verbose()) + g_print ("ok\n"); +} + +static void +test_file_functions (void) +{ + const char hello[] = "Hello, World"; + const int hellolen = sizeof (hello) - 1; + GError *error; + char template[32]; + char *name_used, chars[62]; + gint fd, n; + + strcpy (template, "foobar"); + fd = g_mkstemp (template); + if (g_test_verbose() && fd != -1) + g_print ("g_mkstemp works even if template doesn't end in XXXXXX\n"); + close (fd); + strcpy (template, "fooXXXXXX"); + fd = g_mkstemp (template); + if (fd == -1) + g_error ("g_mkstemp didn't work for template %s\n", template); + n = write (fd, hello, hellolen); + if (n == -1) + g_error ("write() failed: %s\n", g_strerror (errno)); + else if (n != hellolen) + g_error ("write() should have written %d bytes, wrote %d\n", hellolen, n); + + lseek (fd, 0, 0); + n = read (fd, chars, sizeof (chars)); + if (n == -1) + g_error ("read() failed: %s\n", g_strerror (errno)); + else if (n != hellolen) + g_error ("read() should have read %d bytes, got %d\n", hellolen, n); + + chars[n] = 0; + if (strcmp (chars, hello) != 0) + g_error ("wrote '%s', but got '%s'\n", hello, chars); + + close (fd); + remove (template); + + error = NULL; + strcpy (template, "zap" G_DIR_SEPARATOR_S "barXXXXXX"); + fd = g_file_open_tmp (template, &name_used, &error); + if (g_test_verbose()) + { + if (fd != -1) + g_print ("g_file_open_tmp works even if template contains '%s'\n", G_DIR_SEPARATOR_S); + else + g_print ("g_file_open_tmp correctly returns error: %s\n", error->message); + } + close (fd); + g_clear_error (&error); + +#ifdef G_OS_WIN32 + strcpy (template, "zap/barXXXXXX"); + fd = g_file_open_tmp (template, &name_used, &error); + if (g_test_verbose()) + { + if (fd != -1) + g_print ("g_file_open_tmp works even if template contains '/'\n"); + else + g_print ("g_file_open_tmp correctly returns error: %s\n", error->message); + } + close (fd); + g_clear_error (&error); +#endif + + strcpy (template, "zapXXXXXX"); + fd = g_file_open_tmp (template, &name_used, &error); + if (fd == -1) + g_error ("g_file_open_tmp didn't work for template '%s': %s\n", template, error->message); + else if (g_test_verbose()) + g_print ("g_file_open_tmp for template '%s' used name '%s'\n", template, name_used); + close (fd); + g_clear_error (&error); + remove (name_used); + + fd = g_file_open_tmp (NULL, &name_used, &error); + if (fd == -1) + g_error ("g_file_open_tmp didn't work for a NULL template: %s\n", error->message); + close (fd); + g_clear_error (&error); + remove (name_used); +} + +static void +test_arrays (void) +{ + GByteArray *gbarray; + GPtrArray *gparray; + GArray *garray; + guint i; + + gparray = g_ptr_array_new (); + for (i = 0; i < 10000; i++) + g_ptr_array_add (gparray, GINT_TO_POINTER (i)); + for (i = 0; i < 10000; i++) + if (g_ptr_array_index (gparray, i) != GINT_TO_POINTER (i)) + g_error ("array fails: %p ( %p )\n", g_ptr_array_index (gparray, i), GINT_TO_POINTER (i)); + g_ptr_array_free (gparray, TRUE); + + gbarray = g_byte_array_new (); + for (i = 0; i < 10000; i++) + g_byte_array_append (gbarray, (guint8*) "abcd", 4); + for (i = 0; i < 10000; i++) + { + g_assert (gbarray->data[4*i] == 'a'); + g_assert (gbarray->data[4*i+1] == 'b'); + g_assert (gbarray->data[4*i+2] == 'c'); + g_assert (gbarray->data[4*i+3] == 'd'); + } + g_byte_array_free (gbarray, TRUE); + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 10000; i++) + g_array_append_val (garray, i); + for (i = 0; i < 10000; i++) + if (g_array_index (garray, gint, i) != i) + g_error ("failure: %d ( %d )\n", g_array_index (garray, gint, i), i); + g_array_free (garray, TRUE); + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 100; i++) + g_array_prepend_val (garray, i); + for (i = 0; i < 100; i++) + if (g_array_index (garray, gint, i) != (100 - i - 1)) + g_error ("failure: %d ( %d )\n", g_array_index (garray, gint, i), 100 - i - 1); + g_array_free (garray, TRUE); +} + +static void +hash_table_tests (void) +{ + GHashTable *hash_table; + int array[10000]; + gint *pvalue = NULL; + gint value = 120; + guint i; + + hash_table = g_hash_table_new (my_hash, my_hash_equal); + for (i = 0; i < 10000; i++) + { + array[i] = i; + g_hash_table_insert (hash_table, &array[i], &array[i]); + } + pvalue = g_hash_table_find (hash_table, find_first_that, &value); + if (*pvalue != value) + g_error ("g_hash_table_find failed"); + g_hash_table_foreach (hash_table, my_hash_callback, NULL); + for (i = 0; i < 10000; i++) + if (array[i] == 0) + g_error ("hashtable-test: wrong value: %d\n", i); + for (i = 0; i < 10000; i++) + g_hash_table_remove (hash_table, &array[i]); + for (i = 0; i < 10000; i++) + { + array[i] = i; + g_hash_table_insert (hash_table, &array[i], &array[i]); + } + if (g_hash_table_foreach_remove (hash_table, my_hash_callback_remove, NULL) != 5000 || + g_hash_table_size (hash_table) != 5000) + g_error ("hashtable removal failed\n"); + g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL); + g_hash_table_destroy (hash_table); +} + +static void +relation_test (void) +{ + GRelation *relation = g_relation_new (2); + GTuples *tuples; + gint data [1024]; + guint i; + + g_relation_index (relation, 0, g_int_hash, g_int_equal); + g_relation_index (relation, 1, g_int_hash, g_int_equal); + + for (i = 0; i < 1024; i += 1) + data[i] = i; + + for (i = 1; i < 1023; i += 1) + { + g_relation_insert (relation, data + i, data + i + 1); + g_relation_insert (relation, data + i, data + i - 1); + } + + for (i = 2; i < 1022; i += 1) + { + g_assert (! g_relation_exists (relation, data + i, data + i)); + g_assert (! g_relation_exists (relation, data + i, data + i + 2)); + g_assert (! g_relation_exists (relation, data + i, data + i - 2)); + } + + for (i = 1; i < 1023; i += 1) + { + g_assert (g_relation_exists (relation, data + i, data + i + 1)); + g_assert (g_relation_exists (relation, data + i, data + i - 1)); + } + + for (i = 2; i < 1022; i += 1) + { + g_assert (g_relation_count (relation, data + i, 0) == 2); + g_assert (g_relation_count (relation, data + i, 1) == 2); + } + + g_assert (g_relation_count (relation, data, 0) == 0); + + g_assert (g_relation_count (relation, data + 42, 0) == 2); + g_assert (g_relation_count (relation, data + 43, 1) == 2); + g_assert (g_relation_count (relation, data + 41, 1) == 2); + g_relation_delete (relation, data + 42, 0); + g_assert (g_relation_count (relation, data + 42, 0) == 0); + g_assert (g_relation_count (relation, data + 43, 1) == 1); + g_assert (g_relation_count (relation, data + 41, 1) == 1); + + tuples = g_relation_select (relation, data + 200, 0); + + g_assert (tuples->len == 2); + +#if 0 + for (i = 0; i < tuples->len; i += 1) + { + printf ("%d %d\n", + *(gint*) g_tuples_index (tuples, i, 0), + *(gint*) g_tuples_index (tuples, i, 1)); + } +#endif + + g_assert (g_relation_exists (relation, data + 300, data + 301)); + g_relation_delete (relation, data + 300, 0); + g_assert (!g_relation_exists (relation, data + 300, data + 301)); + + g_tuples_destroy (tuples); + + g_relation_destroy (relation); + + relation = NULL; +} + +static void +gstring_tests (void) +{ + GString *string1, *string2; + guint i; + + if (g_test_verbose()) + g_print ("test GString basics\n"); + + string1 = g_string_new ("hi pete!"); + string2 = g_string_new (""); + + g_assert (strcmp ("hi pete!", string1->str) == 0); + + for (i = 0; i < 10000; i++) + g_string_append_c (string1, 'a'+(i%26)); + +#ifndef G_OS_WIN32 + /* MSVC, mingw32 and LCC use the same run-time C library, which doesn't like + the %10000.10000f format... */ + g_string_printf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%10000.10000f", + "this pete guy sure is a wuss, like he's the number ", + 1, + " wuss. everyone agrees.\n", + string1->str, + 10, 666, 15, 15, 666.666666666, 666.666666666); +#else + g_string_printf (string2, "%s|%0100d|%s|%s|%0*d|%*.*f|%100.100f", + "this pete guy sure is a wuss, like he's the number ", + 1, + " wuss. everyone agrees.\n", + string1->str, + 10, 666, 15, 15, 666.666666666, 666.666666666); +#endif + + if (g_test_verbose()) + g_print ("string2 length = %lu...\n", (gulong)string2->len); + string2->str[70] = '\0'; + if (g_test_verbose()) + g_print ("first 70 chars:\n%s\n", string2->str); + string2->str[141] = '\0'; + if (g_test_verbose()) + g_print ("next 70 chars:\n%s\n", string2->str+71); + string2->str[212] = '\0'; + if (g_test_verbose()) + g_print ("and next 70:\n%s\n", string2->str+142); + if (g_test_verbose()) + g_print ("last 70 chars:\n%s\n", string2->str+string2->len - 70); + + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); + + /* append */ + string1 = g_string_new ("firsthalf"); + g_string_append (string1, "lasthalf"); + g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); + g_string_free (string1, TRUE); + + /* append_len */ + string1 = g_string_new ("firsthalf"); + g_string_append_len (string1, "lasthalfjunkjunk", strlen ("lasthalf")); + g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); + g_string_free (string1, TRUE); + + /* prepend */ + string1 = g_string_new ("lasthalf"); + g_string_prepend (string1, "firsthalf"); + g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); + g_string_free (string1, TRUE); + + /* prepend_len */ + string1 = g_string_new ("lasthalf"); + g_string_prepend_len (string1, "firsthalfjunkjunk", strlen ("firsthalf")); + g_assert (strcmp (string1->str, "firsthalflasthalf") == 0); + g_string_free (string1, TRUE); + + /* insert */ + string1 = g_string_new ("firstlast"); + g_string_insert (string1, 5, "middle"); + g_assert (strcmp (string1->str, "firstmiddlelast") == 0); + g_string_free (string1, TRUE); + + /* insert with pos == end of the string */ + string1 = g_string_new ("firstmiddle"); + g_string_insert (string1, strlen ("firstmiddle"), "last"); + g_assert (strcmp (string1->str, "firstmiddlelast") == 0); + g_string_free (string1, TRUE); + + /* insert_len */ + string1 = g_string_new ("firstlast"); + g_string_insert_len (string1, 5, "middlejunkjunk", strlen ("middle")); + g_assert (strcmp (string1->str, "firstmiddlelast") == 0); + g_string_free (string1, TRUE); + + /* insert_len with magic -1 pos for append */ + string1 = g_string_new ("first"); + g_string_insert_len (string1, -1, "lastjunkjunk", strlen ("last")); + g_assert (strcmp (string1->str, "firstlast") == 0); + g_string_free (string1, TRUE); + + /* insert_len with magic -1 len for strlen-the-string */ + string1 = g_string_new ("first"); + g_string_insert_len (string1, 5, "last", -1); + g_assert (strcmp (string1->str, "firstlast") == 0); + g_string_free (string1, TRUE); + + /* g_string_equal */ + string1 = g_string_new ("test"); + string2 = g_string_new ("te"); + g_assert (! g_string_equal(string1, string2)); + g_string_append (string2, "st"); + g_assert (g_string_equal(string1, string2)); + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); + + /* Check handling of embedded ASCII 0 (NUL) characters in GString. */ + if (g_test_verbose()) + g_print ("test embedded ASCII 0 (NUL) characters in GString\n"); + string1 = g_string_new ("fiddle"); + string2 = g_string_new ("fiddle"); + g_assert (g_string_equal(string1, string2)); + g_string_append_c(string1, '\0'); + g_assert (! g_string_equal(string1, string2)); + g_string_append_c(string2, '\0'); + g_assert (g_string_equal(string1, string2)); + g_string_append_c(string1, 'x'); + g_string_append_c(string2, 'y'); + g_assert (! g_string_equal(string1, string2)); + g_assert (string1->len == 8); + g_string_append(string1, "yzzy"); + g_assert (string1->len == 12); + g_assert ( memcmp(string1->str, "fiddle\0xyzzy", 13) == 0); + g_string_insert(string1, 1, "QED"); + g_assert ( memcmp(string1->str, "fQEDiddle\0xyzzy", 16) == 0); + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); +} + +static void +various_string_tests (void) +{ + GStringChunk *string_chunk; + GTimeVal ref_date, date; + gchar *tmp_string = NULL, *tmp_string_2, *string, *date_str; + guint i; + gchar *tz; + + if (g_test_verbose()) + g_print ("checking string chunks..."); + string_chunk = g_string_chunk_new (1024); + for (i = 0; i < 100000; i ++) + { + tmp_string = g_string_chunk_insert (string_chunk, "hi pete"); + if (strcmp ("hi pete", tmp_string) != 0) + g_error ("string chunks are broken.\n"); + } + tmp_string_2 = g_string_chunk_insert_const (string_chunk, tmp_string); + g_assert (tmp_string_2 != tmp_string && strcmp (tmp_string_2, tmp_string) == 0); + tmp_string = g_string_chunk_insert_const (string_chunk, tmp_string); + g_assert (tmp_string_2 == tmp_string); + g_string_chunk_free (string_chunk); + + if (g_test_verbose()) + g_print ("test positional printf formats (not supported):"); + string = g_strdup_printf ("%.*s%s", 5, "a", "b"); + tmp_string = g_strdup_printf ("%2$*1$s", 5, "c"); + if (g_test_verbose()) + g_print ("%s%s\n", string, tmp_string); + g_free (tmp_string); + g_free (string); + +#define REF_INVALID1 "Wed Dec 19 17:20:20 GMT 2007" +#define REF_INVALID2 "1980-02-22T10:36:00Zulu" +#define REF_SEC_UTC 320063760 +#define REF_STR_UTC "1980-02-22T10:36:00Z" +#define REF_STR_LOCAL "1980-02-22T13:36:00" +#define REF_STR_CEST "1980-02-22T12:36:00+02:00" +#define REF_STR_EST "19800222T053600-0500" +#define REF_STR_NST "1980-02-22T07:06:00-03:30" +#define REF_USEC_UTC 50000 +#define REF_STR_USEC_UTC "1980-02-22T10:36:00.050000Z" +#define REF_STR_USEC_CEST "19800222T123600.050000000+0200" +#define REF_STR_USEC_EST "1980-02-22T05:36:00,05-05:00" +#define REF_STR_USEC_NST "19800222T070600,0500-0330" + + if (g_test_verbose()) + g_print ("checking g_time_val_from_iso8601...\n"); + ref_date.tv_sec = REF_SEC_UTC; + ref_date.tv_usec = 0; + g_assert (g_time_val_from_iso8601 (REF_INVALID1, &date) == FALSE); + g_assert (g_time_val_from_iso8601 (REF_INVALID2, &date) == FALSE); + g_assert (g_time_val_from_iso8601 (REF_STR_UTC, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> UTC stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + /* predefine time zone */ + tz = g_getenv("TZ"); + g_setenv("TZ", "UTC-03:00", 1); + tzset(); + + g_assert (g_time_val_from_iso8601 (REF_STR_LOCAL, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> LOCAL stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + /* revert back user defined time zone */ + if (tz) + g_setenv("TZ", tz, TRUE); + else + g_unsetenv("TZ"); + tzset(); + + g_assert (g_time_val_from_iso8601 (REF_STR_CEST, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> CEST stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + g_assert (g_time_val_from_iso8601 (REF_STR_EST, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> EST stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + g_assert (g_time_val_from_iso8601 (REF_STR_NST, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> NST stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + ref_date.tv_usec = REF_USEC_UTC; + g_assert (g_time_val_from_iso8601 (REF_STR_USEC_UTC, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> UTC stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + g_assert (g_time_val_from_iso8601 (REF_STR_USEC_CEST, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> CEST stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + g_assert (g_time_val_from_iso8601 (REF_STR_USEC_EST, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> EST stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + g_assert (g_time_val_from_iso8601 (REF_STR_USEC_NST, &date) != FALSE); + if (g_test_verbose()) + g_print ("\t=> NST stamp = %ld.%06ld (should be: %ld.%06ld) (%ld.%06ld off)\n", + date.tv_sec, date.tv_usec, ref_date.tv_sec, ref_date.tv_usec, + date.tv_sec - ref_date.tv_sec, date.tv_usec - ref_date.tv_usec); + g_assert (date.tv_sec == ref_date.tv_sec && date.tv_usec == ref_date.tv_usec); + + if (g_test_verbose()) + g_print ("checking g_time_val_to_iso8601...\n"); + ref_date.tv_sec = REF_SEC_UTC; + ref_date.tv_usec = 0; + date_str = g_time_val_to_iso8601 (&ref_date); + g_assert (date_str != NULL); + if (g_test_verbose()) + g_print ("\t=> date string = %s (should be: %s)\n", date_str, REF_STR_UTC); + g_assert (strcmp (date_str, REF_STR_UTC) == 0); + g_free (date_str); + + ref_date.tv_usec = REF_USEC_UTC; + date_str = g_time_val_to_iso8601 (&ref_date); + g_assert (date_str != NULL); + if (g_test_verbose()) + g_print ("\t=> date string = %s (should be: %s)\n", date_str, REF_STR_USEC_UTC); + g_assert (strcmp (date_str, REF_STR_USEC_UTC) == 0); + g_free (date_str); + + if (g_test_verbose()) + g_print ("checking g_ascii_strcasecmp..."); + g_assert (g_ascii_strcasecmp ("FroboZZ", "frobozz") == 0); + g_assert (g_ascii_strcasecmp ("frobozz", "frobozz") == 0); + g_assert (g_ascii_strcasecmp ("frobozz", "FROBOZZ") == 0); + g_assert (g_ascii_strcasecmp ("FROBOZZ", "froboz") > 0); + g_assert (g_ascii_strcasecmp ("", "") == 0); + g_assert (g_ascii_strcasecmp ("!#%&/()", "!#%&/()") == 0); + g_assert (g_ascii_strcasecmp ("a", "b") < 0); + g_assert (g_ascii_strcasecmp ("a", "B") < 0); + g_assert (g_ascii_strcasecmp ("A", "b") < 0); + g_assert (g_ascii_strcasecmp ("A", "B") < 0); + g_assert (g_ascii_strcasecmp ("b", "a") > 0); + g_assert (g_ascii_strcasecmp ("b", "A") > 0); + g_assert (g_ascii_strcasecmp ("B", "a") > 0); + g_assert (g_ascii_strcasecmp ("B", "A") > 0); + + if (g_test_verbose()) + g_print ("checking g_strdup...\n"); + g_assert (g_strdup (NULL) == NULL); + string = g_strdup (GLIB_TEST_STRING); + g_assert (string != NULL); + g_assert (strcmp(string, GLIB_TEST_STRING) == 0); + g_free (string); + + if (g_test_verbose()) + g_print ("checking g_strconcat...\n"); + string = g_strconcat (GLIB_TEST_STRING, NULL); + g_assert (string != NULL); + g_assert (strcmp (string, GLIB_TEST_STRING) == 0); + g_free (string); + string = g_strconcat (GLIB_TEST_STRING, GLIB_TEST_STRING, + GLIB_TEST_STRING, NULL); + g_assert (string != NULL); + g_assert (strcmp (string, GLIB_TEST_STRING GLIB_TEST_STRING + GLIB_TEST_STRING) == 0); + g_free (string); + + if (g_test_verbose()) + g_print ("checking g_strlcpy/g_strlcat..."); + /* The following is a torture test for strlcpy/strlcat, with lots of + * checking; normal users wouldn't use them this way! + */ + string = g_malloc (6); + *(string + 5) = 'Z'; /* guard value, shouldn't change during test */ + *string = 'q'; + g_assert (g_strlcpy(string, "" , 5) == 0); + g_assert ( *string == '\0' ); + *string = 'q'; + g_assert (g_strlcpy(string, "abc" , 5) == 3); + g_assert ( *(string + 3) == '\0' ); + g_assert (g_str_equal(string, "abc")); + g_assert (g_strlcpy(string, "abcd" , 5) == 4); + g_assert ( *(string + 4) == '\0' ); + g_assert ( *(string + 5) == 'Z' ); + g_assert (g_str_equal(string, "abcd")); + g_assert (g_strlcpy(string, "abcde" , 5) == 5); + g_assert ( *(string + 4) == '\0' ); + g_assert ( *(string + 5) == 'Z' ); + g_assert (g_str_equal(string, "abcd")); + g_assert (g_strlcpy(string, "abcdef" , 5) == 6); + g_assert ( *(string + 4) == '\0' ); + g_assert ( *(string + 5) == 'Z' ); + g_assert (g_str_equal(string, "abcd")); + *string = 'Y'; + *(string + 1)= '\0'; + g_assert (g_strlcpy(string, "Hello" , 0) == 5); + g_assert (*string == 'Y'); + *string = '\0'; + g_assert (g_strlcat(string, "123" , 5) == 3); + g_assert ( *(string + 3) == '\0' ); + g_assert (g_str_equal(string, "123")); + g_assert (g_strlcat(string, "" , 5) == 3); + g_assert ( *(string + 3) == '\0' ); + g_assert (g_str_equal(string, "123")); + g_assert (g_strlcat(string, "4", 5) == 4); + g_assert (g_str_equal(string, "1234")); + g_assert (g_strlcat(string, "5", 5) == 5); + g_assert ( *(string + 4) == '\0' ); + g_assert (g_str_equal(string, "1234")); + g_assert ( *(string + 5) == 'Z' ); + *string = 'Y'; + *(string + 1)= '\0'; + g_assert (g_strlcat(string, "123" , 0) == 3); + g_assert (*string == 'Y'); + + /* A few more tests, demonstrating more "normal" use */ + g_assert (g_strlcpy(string, "hi", 5) == 2); + g_assert (g_str_equal(string, "hi")); + g_assert (g_strlcat(string, "t", 5) == 3); + g_assert (g_str_equal(string, "hit")); + g_free(string); + + if (g_test_verbose()) + g_print ("checking g_strdup_printf...\n"); + string = g_strdup_printf ("%05d %-5s", 21, "test"); + g_assert (string != NULL); + g_assert (strcmp(string, "00021 test ") == 0); + g_free (string); + + /* g_debug (argv[0]); */ +} + +#ifndef G_DISABLE_DEPRECATED +static void +test_mem_chunks (void) +{ + GMemChunk *mem_chunk = g_mem_chunk_new ("test mem chunk", 50, 100, G_ALLOC_AND_FREE); + gchar *mem[10000]; + guint i; + for (i = 0; i < 10000; i++) + { + guint j; + mem[i] = g_chunk_new (gchar, mem_chunk); + for (j = 0; j < 50; j++) + mem[i][j] = i * j; + } + for (i = 0; i < 10000; i++) + g_mem_chunk_free (mem_chunk, mem[i]); +} +#endif + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/testglib/Infos", test_info); + g_test_add_func ("/testglib/Types Sizes", type_sizes); + g_test_add_func ("/testglib/GStrings", gstring_tests); + g_test_add_func ("/testglib/Various Strings", various_string_tests); + g_test_add_func ("/testglib/GList", glist_test); + g_test_add_func ("/testglib/GSList", gslist_test); + g_test_add_func ("/testglib/GNode", gnode_test); + g_test_add_func ("/testglib/GTree", binary_tree_test); + g_test_add_func ("/testglib/Arrays", test_arrays); + g_test_add_func ("/testglib/GHashTable", hash_table_tests); + g_test_add_func ("/testglib/Relation", relation_test); + g_test_add_func ("/testglib/File Paths", test_paths); + g_test_add_func ("/testglib/File Functions", test_file_functions); + g_test_add_func ("/testglib/Parse Debug Strings", test_g_parse_debug_string); +#ifndef G_DISABLE_DEPRECATED + g_test_add_func ("/testglib/GMemChunk (deprecated)", test_mem_chunks); +#endif + g_test_add_func ("/testglib/Warnings & Errors", log_warning_error_tests); + g_test_add_func ("/testglib/Timers (slow)", timer_tests); + + return g_test_run(); +} diff --git a/tests/testingbase64.c b/tests/testingbase64.c new file mode 100644 index 0000000..3e64d1a --- /dev/null +++ b/tests/testingbase64.c @@ -0,0 +1,236 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2008 Asbjoern Pettersen + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors or contributors be liable for any + * direct, indirect, incidental, special, exemplary, or consequential + * damages (including, but not limited to, procurement of substitute + * goods or services; loss of use, data, or profits; or business + * interruption) however caused and on any theory of liability, whether + * in contract, strict liability, or tort (including negligence or + * otherwise) arising in any way out of the use of this software, even + * if advised of the possibility of such damage. + */ + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#define DATA_SIZE 1024 + +struct MyRawData +{ + gint length; /* of data */ + guchar data[DATA_SIZE]; +}; + +/* 100 pre-encoded string from data[] buffer. Data length from 1..100 + */ +static const char *ok_100_encode_strs[] = { + "AA==", + "AAE=", + "AAEC", + "AAECAw==", + "AAECAwQ=", + "AAECAwQF", + "AAECAwQFBg==", + "AAECAwQFBgc=", + "AAECAwQFBgcI", + "AAECAwQFBgcICQ==", + "AAECAwQFBgcICQo=", + "AAECAwQFBgcICQoL", + "AAECAwQFBgcICQoLDA==", + "AAECAwQFBgcICQoLDA0=", + "AAECAwQFBgcICQoLDA0O", + "AAECAwQFBgcICQoLDA0ODw==", + "AAECAwQFBgcICQoLDA0ODxA=", + "AAECAwQFBgcICQoLDA0ODxAR", + "AAECAwQFBgcICQoLDA0ODxAREg==", + "AAECAwQFBgcICQoLDA0ODxAREhM=", + "AAECAwQFBgcICQoLDA0ODxAREhMU", + "AAECAwQFBgcICQoLDA0ODxAREhMUFQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRY=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYX", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBk=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBka", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxw=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwd", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHg==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8g", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gIQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISI=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCU=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUm", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJw==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJyg=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygp", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKg==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKis=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKiss", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDE=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEy", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMw==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Ng==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0A=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BB", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQg==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkM=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNE", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUY=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZH", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSEk=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElK", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKSw==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0w=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xN", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTg==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk8=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9Q", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVI=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJT", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFU=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVW", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWVw==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1g=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWg==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWls=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltc", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXQ==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV4=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYA==", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGE=", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFi", + "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw==", + NULL +}; + +static void +generate_databuffer_for_base64 (struct MyRawData *p) +{ + int i; + for (i = 0; i < DATA_SIZE; i++) + p->data[i] = i; +} + +static void +test_base64_encode (void) +{ + int i; + gint length = 1; + char *text; + struct MyRawData myraw; + + generate_databuffer_for_base64 (&myraw); + + for (i = 0; ok_100_encode_strs[i]; i++) + { + length = i + 1; + text = g_base64_encode (myraw.data, length); + g_assert_cmpstr (text, ==, ok_100_encode_strs[i]); + /* printf ("\"%s\",\n",text); */ + g_free (text); + } +} + + +static void +decode_and_compare (const gchar *datap, + const struct MyRawData *p) +{ + guchar *data2; + gsize len; + int memcmp_decode; + + data2 = g_base64_decode (datap, &len); + g_assert_cmpint (len, ==, p->length); + /* g_print ("length: got %d, expected %d\n",len, length); */ + memcmp_decode = memcmp (p->data, data2, p->length); + g_assert_cmpint (memcmp_decode, ==, 0); + g_free (data2); +} + +static void +test_base64_decode (void) +{ + int i; + struct MyRawData myraw; + + generate_databuffer_for_base64 (&myraw); + + for (i = 0; ok_100_encode_strs[i]; i++) + { + myraw.length = i + 1; + decode_and_compare (ok_100_encode_strs[i], &myraw); + } +} + +static void +test_base64_encode_decode (void) +{ + int i; + char *text; + struct MyRawData myraw; + + generate_databuffer_for_base64 (&myraw); + + for (i = 0; i < DATA_SIZE; i++) + { + myraw.length = i + 1; + text = g_base64_encode (myraw.data, myraw.length); + + decode_and_compare (text, &myraw); + + g_free (text); + } +} + + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/misc/base64/encode", test_base64_encode); + g_test_add_func ("/misc/base64/decode", test_base64_decode); + g_test_add_func ("/misc/base64/encode_decode", test_base64_encode_decode); + + return g_test_run(); +} diff --git a/tests/thread-test.c b/tests/thread-test.c new file mode 100644 index 0000000..63f7e02 --- /dev/null +++ b/tests/thread-test.c @@ -0,0 +1,402 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +/* GMutex */ + +static GMutex* test_g_mutex_mutex = NULL; +static guint test_g_mutex_int = 0; +static gboolean test_g_mutex_thread_ready; +G_LOCK_DEFINE_STATIC (test_g_mutex); + +static gpointer +test_g_mutex_thread (gpointer data) +{ + g_assert (GPOINTER_TO_INT (data) == 42); + g_assert (g_mutex_trylock (test_g_mutex_mutex) == FALSE); + g_assert (G_TRYLOCK (test_g_mutex) == FALSE); + test_g_mutex_thread_ready = TRUE; + g_mutex_lock (test_g_mutex_mutex); + g_assert (test_g_mutex_int == 42); + g_mutex_unlock (test_g_mutex_mutex); + + return GINT_TO_POINTER (41); +} + +static void +test_g_mutex (void) +{ + GThread *thread; + test_g_mutex_mutex = g_mutex_new (); + + g_assert (g_mutex_trylock (test_g_mutex_mutex)); + g_assert (G_TRYLOCK (test_g_mutex)); + test_g_mutex_thread_ready = FALSE; + thread = g_thread_create (test_g_mutex_thread, GINT_TO_POINTER (42), + TRUE, NULL); + /* This busy wait is only for testing purposes and not an example of + * good code!*/ + while (!test_g_mutex_thread_ready) + g_usleep (G_USEC_PER_SEC / 5); + test_g_mutex_int = 42; + G_UNLOCK (test_g_mutex); + g_mutex_unlock (test_g_mutex_mutex); + g_assert (GPOINTER_TO_INT (g_thread_join (thread)) == 41); + g_mutex_free (test_g_mutex_mutex); +} + +/* GStaticRecMutex */ + +static GStaticRecMutex test_g_static_rec_mutex_mutex = G_STATIC_REC_MUTEX_INIT; +static guint test_g_static_rec_mutex_int = 0; +static gboolean test_g_static_rec_mutex_thread_ready; + +static gpointer +test_g_static_rec_mutex_thread (gpointer data) +{ + g_assert (GPOINTER_TO_INT (data) == 42); + g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex) + == FALSE); + test_g_static_rec_mutex_thread_ready = TRUE; + g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex); + g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex); + g_assert (test_g_static_rec_mutex_int == 42); + test_g_static_rec_mutex_thread_ready = FALSE; + g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); + g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); + + g_thread_exit (GINT_TO_POINTER (43)); + + g_assert_not_reached (); + return NULL; +} + +static void +test_g_static_rec_mutex (void) +{ + GThread *thread; + + g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex)); + test_g_static_rec_mutex_thread_ready = FALSE; + thread = g_thread_create (test_g_static_rec_mutex_thread, + GINT_TO_POINTER (42), TRUE, NULL); + /* This busy wait is only for testing purposes and not an example of + * good code!*/ + while (!test_g_static_rec_mutex_thread_ready) + g_usleep (G_USEC_PER_SEC / 5); + + g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex)); + test_g_static_rec_mutex_int = 41; + g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); + test_g_static_rec_mutex_int = 42; + g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); + + /* This busy wait is only for testing purposes and not an example of + * good code!*/ + while (test_g_static_rec_mutex_thread_ready) + g_usleep (G_USEC_PER_SEC / 5); + + g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex); + test_g_static_rec_mutex_int = 0; + g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); + + g_assert (GPOINTER_TO_INT (g_thread_join (thread)) == 43); +} + +/* GStaticPrivate */ + +#define THREADS 10 + +static GStaticPrivate test_g_static_private_private1 = G_STATIC_PRIVATE_INIT; +static GStaticPrivate test_g_static_private_private2 = G_STATIC_PRIVATE_INIT; +static GStaticMutex test_g_static_private_mutex = G_STATIC_MUTEX_INIT; +static guint test_g_static_private_counter = 0; +static guint test_g_static_private_ready = 0; + +static gpointer +test_g_static_private_constructor (void) +{ + g_static_mutex_lock (&test_g_static_private_mutex); + test_g_static_private_counter++; + g_static_mutex_unlock (&test_g_static_private_mutex); + return g_new (guint,1); +} + +static void +test_g_static_private_destructor (gpointer data) +{ + g_static_mutex_lock (&test_g_static_private_mutex); + test_g_static_private_counter--; + g_static_mutex_unlock (&test_g_static_private_mutex); + g_free (data); +} + + +static gpointer +test_g_static_private_thread (gpointer data) +{ + guint number = GPOINTER_TO_INT (data); + guint i; + guint *private1, *private2; + for (i = 0; i < 10; i++) + { + number = number * 11 + 1; /* A very simple and bad RNG ;-) */ + private1 = g_static_private_get (&test_g_static_private_private1); + if (!private1 || number % 7 > 3) + { + private1 = test_g_static_private_constructor (); + g_static_private_set (&test_g_static_private_private1, private1, + test_g_static_private_destructor); + } + *private1 = number; + private2 = g_static_private_get (&test_g_static_private_private2); + if (!private2 || number % 13 > 5) + { + private2 = test_g_static_private_constructor (); + g_static_private_set (&test_g_static_private_private2, private2, + test_g_static_private_destructor); + } + *private2 = number * 2; + g_usleep (G_USEC_PER_SEC / 5); + g_assert (number == *private1); + g_assert (number * 2 == *private2); + } + g_static_mutex_lock (&test_g_static_private_mutex); + test_g_static_private_ready++; + g_static_mutex_unlock (&test_g_static_private_mutex); + + /* Busy wait is not nice but that's just a test */ + while (test_g_static_private_ready != 0) + g_usleep (G_USEC_PER_SEC / 5); + + for (i = 0; i < 10; i++) + { + private2 = g_static_private_get (&test_g_static_private_private2); + number = number * 11 + 1; /* A very simple and bad RNG ;-) */ + if (!private2 || number % 13 > 5) + { + private2 = test_g_static_private_constructor (); + g_static_private_set (&test_g_static_private_private2, private2, + test_g_static_private_destructor); + } + *private2 = number * 2; + g_usleep (G_USEC_PER_SEC / 5); + g_assert (number * 2 == *private2); + } + + return GINT_TO_POINTER (GPOINTER_TO_INT (data) * 3); +} + +static void +test_g_static_private (void) +{ + GThread *threads[THREADS]; + guint i; + + test_g_static_private_ready = 0; + + for (i = 0; i < THREADS; i++) + { + threads[i] = g_thread_create (test_g_static_private_thread, + GINT_TO_POINTER (i), TRUE, NULL); + } + + /* Busy wait is not nice but that's just a test */ + while (test_g_static_private_ready != THREADS) + g_usleep (G_USEC_PER_SEC / 5); + + /* Reuse the static private */ + g_static_private_free (&test_g_static_private_private2); + g_static_private_init (&test_g_static_private_private2); + + test_g_static_private_ready = 0; + + for (i = 0; i < THREADS; i++) + g_assert (GPOINTER_TO_INT (g_thread_join (threads[i])) == i * 3); + + g_assert (test_g_static_private_counter == 0); +} + +/* GStaticRWLock */ + +/* -1 = writing; >0 = # of readers */ +static gint test_g_static_rw_lock_state = 0; +G_LOCK_DEFINE (test_g_static_rw_lock_state); + +static gboolean test_g_static_rw_lock_run = TRUE; +static GStaticRWLock test_g_static_rw_lock_lock = G_STATIC_RW_LOCK_INIT; + +static gpointer +test_g_static_rw_lock_thread (gpointer data) +{ + while (test_g_static_rw_lock_run) + { + if (g_random_double() > .2) /* I'm a reader */ + { + + if (g_random_double() > .2) /* I'll block */ + g_static_rw_lock_reader_lock (&test_g_static_rw_lock_lock); + else /* I'll only try */ + if (!g_static_rw_lock_reader_trylock (&test_g_static_rw_lock_lock)) + continue; + G_LOCK (test_g_static_rw_lock_state); + g_assert (test_g_static_rw_lock_state >= 0); + test_g_static_rw_lock_state++; + G_UNLOCK (test_g_static_rw_lock_state); + + g_usleep (g_random_int_range (20,1000)); + + G_LOCK (test_g_static_rw_lock_state); + test_g_static_rw_lock_state--; + G_UNLOCK (test_g_static_rw_lock_state); + + g_static_rw_lock_reader_unlock (&test_g_static_rw_lock_lock); + } + else /* I'm a writer */ + { + + if (g_random_double() > .2) /* I'll block */ + g_static_rw_lock_writer_lock (&test_g_static_rw_lock_lock); + else /* I'll only try */ + if (!g_static_rw_lock_writer_trylock (&test_g_static_rw_lock_lock)) + continue; + G_LOCK (test_g_static_rw_lock_state); + g_assert (test_g_static_rw_lock_state == 0); + test_g_static_rw_lock_state = -1; + G_UNLOCK (test_g_static_rw_lock_state); + + g_usleep (g_random_int_range (20,1000)); + + G_LOCK (test_g_static_rw_lock_state); + test_g_static_rw_lock_state = 0; + G_UNLOCK (test_g_static_rw_lock_state); + + g_static_rw_lock_writer_unlock (&test_g_static_rw_lock_lock); + } + } + return NULL; +} + +static void +test_g_static_rw_lock () +{ + GThread *threads[THREADS]; + guint i; + for (i = 0; i < THREADS; i++) + { + threads[i] = g_thread_create (test_g_static_rw_lock_thread, + NULL, TRUE, NULL); + } + g_usleep (G_USEC_PER_SEC * 5); + test_g_static_rw_lock_run = FALSE; + for (i = 0; i < THREADS; i++) + { + g_thread_join (threads[i]); + } + g_assert (test_g_static_rw_lock_state == 0); +} + +#define G_ONCE_SIZE 100 +#define G_ONCE_THREADS 10 + +G_LOCK_DEFINE (test_g_once); +static guint test_g_once_guint_array[G_ONCE_SIZE]; +static GOnce test_g_once_array[G_ONCE_SIZE]; + +static gpointer +test_g_once_init_func(gpointer arg) +{ + guint *count = arg; + g_usleep (g_random_int_range (20,1000)); + (*count)++; + g_usleep (g_random_int_range (20,1000)); + return arg; +} + +static gpointer +test_g_once_thread (gpointer ignore) +{ + guint i; + G_LOCK (test_g_once); + /* Don't start before all threads are created */ + G_UNLOCK (test_g_once); + for (i = 0; i < 1000; i++) + { + guint pos = g_random_int_range (0, G_ONCE_SIZE); + gpointer ret = g_once (test_g_once_array + pos, test_g_once_init_func, + test_g_once_guint_array + pos); + g_assert (ret == test_g_once_guint_array + pos); + } + + /* Make sure, that all counters are touched at least once */ + for (i = 0; i < G_ONCE_SIZE; i++) + { + gpointer ret = g_once (test_g_once_array + i, test_g_once_init_func, + test_g_once_guint_array + i); + g_assert (ret == test_g_once_guint_array + i); + } + + return NULL; +} + +static void +test_g_thread_once (void) +{ + static GOnce once_init = G_ONCE_INIT; + GThread *threads[G_ONCE_THREADS]; + guint i; + for (i = 0; i < G_ONCE_SIZE; i++) + { + test_g_once_array[i] = once_init; + test_g_once_guint_array[i] = i; + } + G_LOCK (test_g_once); + for (i = 0; i < G_ONCE_THREADS; i++) + { + threads[i] = g_thread_create (test_g_once_thread, GUINT_TO_POINTER(i%2), + TRUE, NULL); + } + G_UNLOCK (test_g_once); + for (i = 0; i < G_ONCE_THREADS; i++) + { + g_thread_join (threads[i]); + } + + for (i = 0; i < G_ONCE_SIZE; i++) + { + g_assert (test_g_once_guint_array[i] == i + 1); + } +} + +/* run all the tests */ +void +run_all_tests() +{ + test_g_mutex (); + test_g_static_rec_mutex (); + test_g_static_private (); + test_g_static_rw_lock (); + test_g_thread_once (); +} + +int +main (int argc, + char *argv[]) +{ + /* Only run the test, if threads are enabled and a default thread + implementation is available */ +#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) + g_thread_init (NULL); + run_all_tests (); + + /* Now we rerun all tests, but this time we fool the system into + * thinking, that the available thread system is not native, but + * userprovided. */ + + g_thread_use_default_impl = FALSE; + run_all_tests (); + +#endif + return 0; +} diff --git a/tests/threadpool-test.c b/tests/threadpool-test.c new file mode 100644 index 0000000..db15b36 --- /dev/null +++ b/tests/threadpool-test.c @@ -0,0 +1,476 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "config.h" + +#include + +#define DEBUG_MSG(x) +/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ + +#define WAIT 5 /* seconds */ +#define MAX_THREADS 10 + +/* if > 0 the test will run continously (since the test ends when + * thread count is 0), if -1 it means no limit to unused threads + * if 0 then no unused threads are possible */ +#define MAX_UNUSED_THREADS -1 + +G_LOCK_DEFINE_STATIC (thread_counter_pools); + +static gulong abs_thread_counter = 0; +static gulong running_thread_counter = 0; +static gulong leftover_task_counter = 0; + +G_LOCK_DEFINE_STATIC (last_thread); + +static guint last_thread_id = 0; + +G_LOCK_DEFINE_STATIC (thread_counter_sort); + +static gulong sort_thread_counter = 0; + +static GThreadPool *idle_pool = NULL; + +static GMainLoop *main_loop = NULL; + +static void +test_thread_functions (void) +{ + gint max_unused_threads; + guint max_idle_time; + + /* This function attempts to call functions which don't need a + * threadpool to operate to make sure no uninitialised pointers + * accessed and no errors occur. + */ + + max_unused_threads = 3; + + DEBUG_MSG (("[funcs] Setting max unused threads to %d", + max_unused_threads)); + g_thread_pool_set_max_unused_threads (max_unused_threads); + + DEBUG_MSG (("[funcs] Getting max unused threads = %d", + g_thread_pool_get_max_unused_threads ())); + g_assert (g_thread_pool_get_max_unused_threads() == max_unused_threads); + + DEBUG_MSG (("[funcs] Getting num unused threads = %d", + g_thread_pool_get_num_unused_threads ())); + g_assert (g_thread_pool_get_num_unused_threads () == 0); + + DEBUG_MSG (("[funcs] Stopping unused threads")); + g_thread_pool_stop_unused_threads (); + + max_idle_time = 10 * G_USEC_PER_SEC; + + DEBUG_MSG (("[funcs] Setting max idle time to %d", + max_idle_time)); + g_thread_pool_set_max_idle_time (max_idle_time); + + DEBUG_MSG (("[funcs] Getting max idle time = %d", + g_thread_pool_get_max_idle_time ())); + g_assert (g_thread_pool_get_max_idle_time () == max_idle_time); + + DEBUG_MSG (("[funcs] Setting max idle time to 0")); + g_thread_pool_set_max_idle_time (0); + + DEBUG_MSG (("[funcs] Getting max idle time = %d", + g_thread_pool_get_max_idle_time ())); + g_assert (g_thread_pool_get_max_idle_time () == 0); +} + +static void +test_count_threads_foreach (GThread *thread, + guint *count) +{ + ++*count; +} + +static guint +test_count_threads (void) +{ + guint count = 0; + + g_thread_foreach ((GFunc) test_count_threads_foreach, &count); + + /* Exclude main thread */ + return count - 1; +} + +static void +test_thread_stop_unused (void) +{ + GThreadPool *pool; + guint i; + guint limit = 100; + + /* Spawn a few threads. */ + g_thread_pool_set_max_unused_threads (-1); + pool = g_thread_pool_new ((GFunc) g_usleep, NULL, -1, FALSE, NULL); + + for (i = 0; i < limit; i++) + g_thread_pool_push (pool, GUINT_TO_POINTER (1000), NULL); + + DEBUG_MSG (("[unused] ===> pushed %d threads onto the idle pool", + limit)); + + /* Wait for the threads to migrate. */ + g_usleep (G_USEC_PER_SEC); + + DEBUG_MSG (("[unused] current threads %d", + test_count_threads())); + + DEBUG_MSG (("[unused] stopping unused threads")); + g_thread_pool_stop_unused_threads (); + + DEBUG_MSG (("[unused] waiting ONE second for threads to die")); + + /* Some time for threads to die. */ + g_usleep (G_USEC_PER_SEC); + + DEBUG_MSG (("[unused] stopped idle threads, %d remain, %d threads still exist", + g_thread_pool_get_num_unused_threads (), + test_count_threads ())); + + g_assert (g_thread_pool_get_num_unused_threads () == test_count_threads ()); + g_assert (g_thread_pool_get_num_unused_threads () == 0); + + g_thread_pool_set_max_unused_threads (MAX_THREADS); + + DEBUG_MSG (("[unused] cleaning up thread pool")); + g_thread_pool_free (pool, FALSE, TRUE); +} + +static void +test_thread_pools_entry_func (gpointer data, gpointer user_data) +{ + guint id = 0; + + id = GPOINTER_TO_UINT (data); + + DEBUG_MSG (("[pool] ---> [%3.3d] entered thread.", id)); + + G_LOCK (thread_counter_pools); + abs_thread_counter++; + running_thread_counter++; + G_UNLOCK (thread_counter_pools); + + g_usleep (g_random_int_range (0, 4000)); + + G_LOCK (thread_counter_pools); + running_thread_counter--; + leftover_task_counter--; + + DEBUG_MSG (("[pool] ---> [%3.3d] exiting thread (abs count:%ld, " + "running count:%ld, left over:%ld)", + id, abs_thread_counter, + running_thread_counter, leftover_task_counter)); + G_UNLOCK (thread_counter_pools); +} + +static void +test_thread_pools (void) +{ + GThreadPool *pool1, *pool2, *pool3; + guint runs; + guint i; + + pool1 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 3, FALSE, NULL); + pool2 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 5, TRUE, NULL); + pool3 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 7, TRUE, NULL); + + runs = 300; + for (i = 0; i < runs; i++) + { + g_thread_pool_push (pool1, GUINT_TO_POINTER (i + 1), NULL); + g_thread_pool_push (pool2, GUINT_TO_POINTER (i + 1), NULL); + g_thread_pool_push (pool3, GUINT_TO_POINTER (i + 1), NULL); + + G_LOCK (thread_counter_pools); + leftover_task_counter += 3; + G_UNLOCK (thread_counter_pools); + } + + g_thread_pool_free (pool1, TRUE, TRUE); + g_thread_pool_free (pool2, FALSE, TRUE); + g_thread_pool_free (pool3, FALSE, TRUE); + + g_assert (runs * 3 == abs_thread_counter + leftover_task_counter); + g_assert (running_thread_counter == 0); +} + +static gint +test_thread_sort_compare_func (gconstpointer a, gconstpointer b, gpointer user_data) +{ + guint32 id1, id2; + + id1 = GPOINTER_TO_UINT (a); + id2 = GPOINTER_TO_UINT (b); + + return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1); +} + +static void +test_thread_sort_entry_func (gpointer data, gpointer user_data) +{ + guint thread_id; + gboolean is_sorted; + + G_LOCK (last_thread); + + thread_id = GPOINTER_TO_UINT (data); + is_sorted = GPOINTER_TO_INT (user_data); + + DEBUG_MSG (("%s ---> entered thread:%2.2d, last thread:%2.2d", + is_sorted ? "[ sorted]" : "[unsorted]", + thread_id, last_thread_id)); + + if (is_sorted) { + static gboolean last_failed = FALSE; + + if (last_thread_id > thread_id) { + if (last_failed) { + g_assert (last_thread_id <= thread_id); + } + + /* Here we remember one fail and if it concurrently fails, it + * can not be sorted. the last thread id might be < this thread + * id if something is added to the queue since threads were + * created + */ + last_failed = TRUE; + } else { + last_failed = FALSE; + } + + last_thread_id = thread_id; + } + + G_UNLOCK (last_thread); + + g_usleep (WAIT * 1000); +} + +static void +test_thread_sort (gboolean sort) +{ + GThreadPool *pool; + guint limit; + guint max_threads; + gint i; + + limit = MAX_THREADS * 10; + + if (sort) { + max_threads = 1; + } else { + max_threads = MAX_THREADS; + } + + /* It is important that we only have a maximum of 1 thread for this + * test since the results can not be guranteed to be sorted if > 1. + * + * Threads are scheduled by the operating system and are executed at + * random. It cannot be assumed that threads are executed in the + * order they are created. This was discussed in bug #334943. + */ + + pool = g_thread_pool_new (test_thread_sort_entry_func, + GINT_TO_POINTER (sort), + max_threads, + FALSE, + NULL); + + g_thread_pool_set_max_unused_threads (MAX_UNUSED_THREADS); + + if (sort) { + g_thread_pool_set_sort_function (pool, + test_thread_sort_compare_func, + GUINT_TO_POINTER (69)); + } + + for (i = 0; i < limit; i++) { + guint id; + + id = g_random_int_range (1, limit) + 1; + g_thread_pool_push (pool, GUINT_TO_POINTER (id), NULL); + DEBUG_MSG (("%s ===> pushed new thread with id:%d, number " + "of threads:%d, unprocessed:%d", + sort ? "[ sorted]" : "[unsorted]", + id, + g_thread_pool_get_num_threads (pool), + g_thread_pool_unprocessed (pool))); + } + + g_assert (g_thread_pool_get_max_threads (pool) == max_threads); + g_assert (g_thread_pool_get_num_threads (pool) == g_thread_pool_get_max_threads (pool)); +} + +static void +test_thread_idle_time_entry_func (gpointer data, gpointer user_data) +{ + guint thread_id; + + thread_id = GPOINTER_TO_UINT (data); + + DEBUG_MSG (("[idle] ---> entered thread:%2.2d", thread_id)); + + g_usleep (WAIT * 1000); + + DEBUG_MSG (("[idle] <--- exiting thread:%2.2d", thread_id)); +} + +static gboolean +test_thread_idle_timeout (gpointer data) +{ + guint interval; + gint i; + + interval = GPOINTER_TO_UINT (data); + + for (i = 0; i < 2; i++) { + g_thread_pool_push (idle_pool, GUINT_TO_POINTER (100 + i), NULL); + DEBUG_MSG (("[idle] ===> pushed new thread with id:%d, number " + "of threads:%d, unprocessed:%d", + 100 + i, + g_thread_pool_get_num_threads (idle_pool), + g_thread_pool_unprocessed (idle_pool))); + } + + + return FALSE; +} + +static void +test_thread_idle_time () +{ + guint limit = 50; + guint interval = 10000; + gint i; + + idle_pool = g_thread_pool_new (test_thread_idle_time_entry_func, + NULL, + MAX_THREADS, + FALSE, + NULL); + + g_thread_pool_set_max_unused_threads (MAX_UNUSED_THREADS); + g_thread_pool_set_max_idle_time (interval); + + g_assert (g_thread_pool_get_max_unused_threads () == MAX_UNUSED_THREADS); + g_assert (g_thread_pool_get_max_idle_time () == interval); + + for (i = 0; i < limit; i++) { + g_thread_pool_push (idle_pool, GUINT_TO_POINTER (i + 1), NULL); + DEBUG_MSG (("[idle] ===> pushed new thread with id:%d, " + "number of threads:%d, unprocessed:%d", + i, + g_thread_pool_get_num_threads (idle_pool), + g_thread_pool_unprocessed (idle_pool))); + } + + g_timeout_add ((interval - 1000), + test_thread_idle_timeout, + GUINT_TO_POINTER (interval)); +} + +static gboolean +test_check_start_and_stop (gpointer user_data) +{ + static guint test_number = 0; + static gboolean run_next = FALSE; + gboolean continue_timeout = TRUE; + gboolean quit = TRUE; + + if (test_number == 0) { + run_next = TRUE; + DEBUG_MSG (("***** RUNNING TEST %2.2d *****", test_number)); + } + + if (run_next) { + test_number++; + + switch (test_number) { + case 1: + test_thread_functions (); + break; + case 2: + test_thread_stop_unused (); + break; + case 3: + test_thread_pools (); + break; + case 4: + test_thread_sort (FALSE); + break; + case 5: + test_thread_sort (TRUE); + break; + case 6: + test_thread_stop_unused (); + break; + case 7: + test_thread_idle_time (); + break; + default: + DEBUG_MSG (("***** END OF TESTS *****")); + g_main_loop_quit (main_loop); + continue_timeout = FALSE; + break; + } + + run_next = FALSE; + return TRUE; + } + + if (test_number == 3) { + G_LOCK (thread_counter_pools); + quit &= running_thread_counter <= 0; + DEBUG_MSG (("***** POOL RUNNING THREAD COUNT:%ld", + running_thread_counter)); + G_UNLOCK (thread_counter_pools); + } + + if (test_number == 4 || test_number == 5) { + G_LOCK (thread_counter_sort); + quit &= sort_thread_counter <= 0; + DEBUG_MSG (("***** POOL SORT THREAD COUNT:%ld", + sort_thread_counter)); + G_UNLOCK (thread_counter_sort); + } + + if (test_number == 7) { + guint idle; + + idle = g_thread_pool_get_num_unused_threads (); + quit &= idle < 1; + DEBUG_MSG (("***** POOL IDLE THREAD COUNT:%d, UNPROCESSED JOBS:%d", + idle, g_thread_pool_unprocessed (idle_pool))); + } + + if (quit) { + run_next = TRUE; + } + + return continue_timeout; +} + +int +main (int argc, char *argv[]) +{ + /* Only run the test, if threads are enabled and a default thread + implementation is available */ + +#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) + g_thread_init (NULL); + + DEBUG_MSG (("Starting... (in one second)")); + g_timeout_add (1000, test_check_start_and_stop, NULL); + + main_loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (main_loop); +#endif + + return 0; +} diff --git a/tests/timeloop-basic.c b/tests/timeloop-basic.c new file mode 100644 index 0000000..56861f3 --- /dev/null +++ b/tests/timeloop-basic.c @@ -0,0 +1,235 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include +#include +#include +#include +#include + +#define TRUE 1 +#define FALSE 0 + +static int n_children = 3; +static int n_active_children; +static int n_iters = 10000; + +static int write_fds[1024]; +static struct pollfd poll_fds[1024]; + +void +my_pipe (int *fds) +{ + if (pipe(fds) < 0) + { + fprintf (stderr, "Cannot create pipe %s\n", strerror (errno)); + exit (1); + } +} + +int +read_all (int fd, char *buf, int len) +{ + size_t bytes_read = 0; + ssize_t count; + + while (bytes_read < len) + { + count = read (fd, buf + bytes_read, len - bytes_read); + if (count < 0) + { + if (errno != EAGAIN) + return FALSE; + } + else if (count == 0) + return FALSE; + + bytes_read += count; + } + + return TRUE; +} + +int +write_all (int fd, char *buf, int len) +{ + size_t bytes_written = 0; + ssize_t count; + + while (bytes_written < len) + { + count = write (fd, buf + bytes_written, len - bytes_written); + if (count < 0) + { + if (errno != EAGAIN) + return FALSE; + } + + bytes_written += count; + } + + return TRUE; +} + +void +run_child (int in_fd, int out_fd) +{ + int i; + int val = 1; + + for (i = 0; i < n_iters; i++) + { + write_all (out_fd, (char *)&val, sizeof (val)); + read_all (in_fd, (char *)&val, sizeof (val)); + } + + val = 0; + write_all (out_fd, (char *)&val, sizeof (val)); + + exit (0); +} + +int +input_callback (int source, int dest) +{ + int val; + + if (!read_all (source, (char *)&val, sizeof(val))) + { + fprintf (stderr,"Unexpected EOF\n"); + exit (1); + } + + if (val) + { + write_all (dest, (char *)&val, sizeof(val)); + return TRUE; + } + else + { + close (source); + close (dest); + + n_active_children--; + return FALSE; + } +} + +void +create_child (int pos) +{ + int pid; + int in_fds[2]; + int out_fds[2]; + + my_pipe (in_fds); + my_pipe (out_fds); + + pid = fork (); + + if (pid > 0) /* Parent */ + { + close (in_fds[0]); + close (out_fds[1]); + + write_fds[pos] = in_fds[1]; + poll_fds[pos].fd = out_fds[0]; + poll_fds[pos].events = POLLIN; + } + else if (pid == 0) /* Child */ + { + close (in_fds[1]); + close (out_fds[0]); + + setsid (); + + run_child (in_fds[0], out_fds[1]); + } + else /* Error */ + { + fprintf (stderr,"Cannot fork: %s\n", strerror (errno)); + exit (1); + } +} + +static double +difftimeval (struct timeval *old, struct timeval *new) +{ + return + (new->tv_sec - old->tv_sec) * 1000. + (new->tv_usec - old->tv_usec) / 1000; +} + +int +main (int argc, char **argv) +{ + int i, j; + struct rusage old_usage; + struct rusage new_usage; + + if (argc > 1) + n_children = atoi(argv[1]); + + if (argc > 2) + n_iters = atoi(argv[2]); + + printf ("Children: %d Iters: %d\n", n_children, n_iters); + + n_active_children = n_children; + for (i = 0; i < n_children; i++) + create_child (i); + + getrusage (RUSAGE_SELF, &old_usage); + + while (n_active_children > 0) + { + int old_n_active_children = n_active_children; + + poll (poll_fds, n_active_children, -1); + + for (i=0; i n_active_children) + { + j = 0; + for (i=0; i +#include +#include +#include +#include +#include + +#include +#include + +static int n_children = 3; +static int n_active_children; +static int n_iters = 10000; +static GMainLoop *loop; + +static void +io_pipe (GIOChannel **channels) +{ + int fds[2]; + + if (pipe(fds) < 0) + { + fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno)); + exit (1); + } + + channels[0] = g_io_channel_unix_new (fds[0]); + channels[1] = g_io_channel_unix_new (fds[1]); +} + +static gboolean +read_all (GIOChannel *channel, char *buf, int len) +{ + gsize bytes_read = 0; + gsize count; + GIOError err; + + while (bytes_read < len) + { + err = g_io_channel_read (channel, buf + bytes_read, len - bytes_read, &count); + if (err) + { + if (err != G_IO_ERROR_AGAIN) + return FALSE; + } + else if (count == 0) + return FALSE; + + bytes_read += count; + } + + return TRUE; +} + +static gboolean +write_all (GIOChannel *channel, char *buf, int len) +{ + gsize bytes_written = 0; + gsize count; + GIOError err; + + while (bytes_written < len) + { + err = g_io_channel_write (channel, buf + bytes_written, len - bytes_written, &count); + if (err && err != G_IO_ERROR_AGAIN) + return FALSE; + + bytes_written += count; + } + + return TRUE; +} + +static void +run_child (GIOChannel *in_channel, GIOChannel *out_channel) +{ + int i; + int val = 1; + GTimer *timer = g_timer_new(); + + for (i = 0; i < n_iters; i++) + { + write_all (out_channel, (char *)&val, sizeof (val)); + read_all (in_channel, (char *)&val, sizeof (val)); + } + + val = 0; + write_all (out_channel, (char *)&val, sizeof (val)); + + val = g_timer_elapsed (timer, NULL) * 1000; + + write_all (out_channel, (char *)&val, sizeof (val)); + g_timer_destroy (timer); + + exit (0); +} + +static gboolean +input_callback (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + int val; + GIOChannel *dest = (GIOChannel *)data; + + if (!read_all (source, (char *)&val, sizeof(val))) + { + fprintf (stderr, "Unexpected EOF\n"); + exit (1); + } + + if (val) + { + write_all (dest, (char *)&val, sizeof(val)); + + return TRUE; + } + else + { + g_io_channel_close (source); + g_io_channel_close (dest); + + g_io_channel_unref (source); + g_io_channel_unref (dest); + + n_active_children--; + if (n_active_children == 0) + g_main_loop_quit (loop); + + return FALSE; + } +} + +static void +create_child (void) +{ + int pid; + GIOChannel *in_channels[2]; + GIOChannel *out_channels[2]; + GSource *source; + + io_pipe (in_channels); + io_pipe (out_channels); + + pid = fork (); + + if (pid > 0) /* Parent */ + { + g_io_channel_close (in_channels[0]); + g_io_channel_close (out_channels[1]); + + source = g_io_create_watch (out_channels[0], G_IO_IN | G_IO_HUP); + g_source_set_closure (source, + g_cclosure_new (G_CALLBACK (input_callback), in_channels[1], NULL)); + g_source_attach (source, NULL); + } + else if (pid == 0) /* Child */ + { + g_io_channel_close (in_channels[1]); + g_io_channel_close (out_channels[0]); + + setsid (); + + run_child (in_channels[0], out_channels[1]); + } + else /* Error */ + { + fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno)); + exit (1); + } +} + +static double +difftimeval (struct timeval *old, struct timeval *new) +{ + return + (new->tv_sec - old->tv_sec) * 1000. + (new->tv_usec - old->tv_usec) / 1000; +} + +int +main (int argc, char **argv) +{ + int i; + struct rusage old_usage; + struct rusage new_usage; + + g_type_init (); + + if (argc > 1) + n_children = atoi(argv[1]); + + if (argc > 2) + n_iters = atoi(argv[2]); + + printf ("Children: %d Iters: %d\n", n_children, n_iters); + + n_active_children = n_children; + for (i = 0; i < n_children; i++) + create_child (); + + getrusage (RUSAGE_SELF, &old_usage); + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + getrusage (RUSAGE_SELF, &new_usage); + + printf ("Elapsed user: %g\n", + difftimeval (&old_usage.ru_utime, &new_usage.ru_utime)); + printf ("Elapsed system: %g\n", + difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)); + printf ("Elapsed total: %g\n", + difftimeval (&old_usage.ru_utime, &new_usage.ru_utime) + + difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)); + printf ("total / iteration: %g\n", + (difftimeval (&old_usage.ru_utime, &new_usage.ru_utime) + + difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)) / + (n_iters * n_children)); + + return 0; +} diff --git a/tests/timeloop.c b/tests/timeloop.c new file mode 100644 index 0000000..457e74d --- /dev/null +++ b/tests/timeloop.c @@ -0,0 +1,216 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include +#include +#include + +#include + +static int n_children = 3; +static int n_active_children; +static int n_iters = 10000; +static GMainLoop *loop; + +static void +io_pipe (GIOChannel **channels) +{ + int fds[2]; + + if (pipe(fds) < 0) + { + fprintf (stderr, "Cannot create pipe %s\n", g_strerror (errno)); + exit (1); + } + + channels[0] = g_io_channel_unix_new (fds[0]); + channels[1] = g_io_channel_unix_new (fds[1]); +} + +static gboolean +read_all (GIOChannel *channel, char *buf, int len) +{ + gsize bytes_read = 0; + gsize count; + GIOError err; + + while (bytes_read < len) + { + err = g_io_channel_read (channel, buf + bytes_read, len - bytes_read, &count); + if (err) + { + if (err != G_IO_ERROR_AGAIN) + return FALSE; + } + else if (count == 0) + return FALSE; + + bytes_read += count; + } + + return TRUE; +} + +static gboolean +write_all (GIOChannel *channel, char *buf, int len) +{ + gsize bytes_written = 0; + gsize count; + GIOError err; + + while (bytes_written < len) + { + err = g_io_channel_write (channel, buf + bytes_written, len - bytes_written, &count); + if (err && err != G_IO_ERROR_AGAIN) + return FALSE; + + bytes_written += count; + } + + return TRUE; +} + +static void +run_child (GIOChannel *in_channel, GIOChannel *out_channel) +{ + int i; + int val = 1; + GTimer *timer = g_timer_new(); + + for (i = 0; i < n_iters; i++) + { + write_all (out_channel, (char *)&val, sizeof (val)); + read_all (in_channel, (char *)&val, sizeof (val)); + } + + val = 0; + write_all (out_channel, (char *)&val, sizeof (val)); + + val = g_timer_elapsed (timer, NULL) * 1000; + + write_all (out_channel, (char *)&val, sizeof (val)); + g_timer_destroy (timer); + + exit (0); +} + +static gboolean +input_callback (GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + int val; + GIOChannel *dest = (GIOChannel *)data; + + if (!read_all (source, (char *)&val, sizeof(val))) + { + fprintf (stderr, "Unexpected EOF\n"); + exit (1); + } + + if (val) + { + write_all (dest, (char *)&val, sizeof(val)); + + return TRUE; + } + else + { + g_io_channel_close (source); + g_io_channel_close (dest); + + g_io_channel_unref (source); + g_io_channel_unref (dest); + + n_active_children--; + if (n_active_children == 0) + g_main_loop_quit (loop); + + return FALSE; + } +} + +static void +create_child (void) +{ + int pid; + GIOChannel *in_channels[2]; + GIOChannel *out_channels[2]; + + io_pipe (in_channels); + io_pipe (out_channels); + + pid = fork (); + + if (pid > 0) /* Parent */ + { + g_io_channel_close (in_channels[0]); + g_io_channel_close (out_channels[1]); + + g_io_add_watch (out_channels[0], G_IO_IN | G_IO_HUP, + input_callback, in_channels[1]); + } + else if (pid == 0) /* Child */ + { + g_io_channel_close (in_channels[1]); + g_io_channel_close (out_channels[0]); + + setsid (); + + run_child (in_channels[0], out_channels[1]); + } + else /* Error */ + { + fprintf (stderr, "Cannot fork: %s\n", g_strerror (errno)); + exit (1); + } +} + +static double +difftimeval (struct timeval *old, struct timeval *new) +{ + return + (new->tv_sec - old->tv_sec) * 1000. + (new->tv_usec - old->tv_usec) / 1000; +} + +int +main (int argc, char **argv) +{ + int i; + struct rusage old_usage; + struct rusage new_usage; + + if (argc > 1) + n_children = atoi(argv[1]); + + if (argc > 2) + n_iters = atoi(argv[2]); + + printf ("Children: %d Iters: %d\n", n_children, n_iters); + + n_active_children = n_children; + for (i = 0; i < n_children; i++) + create_child (); + + getrusage (RUSAGE_SELF, &old_usage); + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + getrusage (RUSAGE_SELF, &new_usage); + + printf ("Elapsed user: %g\n", + difftimeval (&old_usage.ru_utime, &new_usage.ru_utime)); + printf ("Elapsed system: %g\n", + difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)); + printf ("Elapsed total: %g\n", + difftimeval (&old_usage.ru_utime, &new_usage.ru_utime) + + difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)); + printf ("total / iteration: %g\n", + (difftimeval (&old_usage.ru_utime, &new_usage.ru_utime) + + difftimeval (&old_usage.ru_stime, &new_usage.ru_stime)) / + (n_iters * n_children)); + + return 0; +} diff --git a/tests/tree-test.c b/tests/tree-test.c new file mode 100644 index 0000000..c5cb105 --- /dev/null +++ b/tests/tree-test.c @@ -0,0 +1,246 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include "glib.h" + + +static gint +my_compare (gconstpointer a, + gconstpointer b) +{ + const char *cha = a; + const char *chb = b; + + return *cha - *chb; +} + +static gint +my_search (gconstpointer a, + gconstpointer b) +{ + return my_compare (b, a); +} + +static gpointer destroyed_key = NULL; +static gpointer destroyed_value = NULL; + +static void +my_key_destroy (gpointer key) +{ + destroyed_key = key; +} + +static void +my_value_destroy (gpointer value) +{ + destroyed_value = value; +} + +static gint +my_traverse (gpointer key, + gpointer value, + gpointer data) +{ + char *ch = key; + g_assert ((*ch) > 0); + return FALSE; +} + +char chars[] = + "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + +char chars2[] = + "0123456789" + "abcdefghijklmnopqrstuvwxyz"; + +static gint +check_order (gpointer key, + gpointer value, + gpointer data) +{ + char **p = data; + char *ch = key; + + g_assert (**p == *ch); + + (*p)++; + + return FALSE; +} + + + +int +main (int argc, + char *argv[]) +{ + gint i; + GTree *tree; + gboolean removed; + char c, d; + char *p; + + tree = g_tree_new (my_compare); + + for (i = 0; chars[i]; i++) + g_tree_insert (tree, &chars[i], &chars[i]); + + g_tree_foreach (tree, my_traverse, NULL); + + g_assert (g_tree_nnodes (tree) == strlen (chars)); + g_assert (g_tree_height (tree) == 6); + + p = chars; + g_tree_foreach (tree, check_order, &p); + + for (i = 0; i < 26; i++) + { + removed = g_tree_remove (tree, &chars[i + 10]); + g_assert (removed); + } + + c = '\0'; + removed = g_tree_remove (tree, &c); + g_assert (removed == FALSE); + + g_tree_foreach (tree, my_traverse, NULL); + + g_assert (g_tree_nnodes (tree) == strlen (chars2)); + g_assert (g_tree_height (tree) == 6); + + p = chars2; + g_tree_foreach (tree, check_order, &p); + + for (i = 25; i >= 0; i--) + g_tree_insert (tree, &chars[i + 10], &chars[i + 10]); + + p = chars; + g_tree_foreach (tree, check_order, &p); + + c = '0'; + p = g_tree_lookup (tree, &c); + g_assert (p && *p == c); + + c = 'A'; + p = g_tree_lookup (tree, &c); + g_assert (p && *p == c); + + c = 'a'; + p = g_tree_lookup (tree, &c); + g_assert (p && *p == c); + + c = 'z'; + p = g_tree_lookup (tree, &c); + g_assert (p && *p == c); + + c = '!'; + p = g_tree_lookup (tree, &c); + g_assert (p == NULL); + + c = '='; + p = g_tree_lookup (tree, &c); + g_assert (p == NULL); + + c = '|'; + p = g_tree_lookup (tree, &c); + g_assert (p == NULL); + + c = '0'; + p = g_tree_search (tree, my_search, &c); + g_assert (p && *p == c); + + c = 'A'; + p = g_tree_search (tree, my_search, &c); + g_assert (p && *p == c); + + c = 'a'; + p = g_tree_search (tree, my_search, &c); + g_assert (p &&*p == c); + + c = 'z'; + p = g_tree_search (tree, my_search, &c); + g_assert (p && *p == c); + + c = '!'; + p = g_tree_search (tree, my_search, &c); + g_assert (p == NULL); + + c = '='; + p = g_tree_search (tree, my_search, &c); + g_assert (p == NULL); + + c = '|'; + p = g_tree_search (tree, my_search, &c); + g_assert (p == NULL); + + + g_tree_destroy (tree); + + tree = g_tree_new_full ((GCompareDataFunc)my_compare, NULL, + my_key_destroy, + my_value_destroy); + + for (i = 0; chars[i]; i++) + g_tree_insert (tree, &chars[i], &chars[i]); + + c = '0'; + g_tree_insert (tree, &c, &c); + g_assert (destroyed_key == &c); + g_assert (destroyed_value == &chars[0]); + destroyed_key = NULL; + destroyed_value = NULL; + + d = '1'; + g_tree_replace (tree, &d, &d); + g_assert (destroyed_key == &chars[1]); + g_assert (destroyed_value == &chars[1]); + destroyed_key = NULL; + destroyed_value = NULL; + + c = '2'; + removed = g_tree_remove (tree, &c); + g_assert (removed); + g_assert (destroyed_key == &chars[2]); + g_assert (destroyed_value == &chars[2]); + destroyed_key = NULL; + destroyed_value = NULL; + + c = '3'; + removed = g_tree_steal (tree, &c); + g_assert (removed); + g_assert (destroyed_key == NULL); + g_assert (destroyed_value == NULL); + + return 0; +} + diff --git a/tests/type-test.c b/tests/type-test.c new file mode 100644 index 0000000..cbaaa7d --- /dev/null +++ b/tests/type-test.c @@ -0,0 +1,142 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include "glib.h" + + + +int +main (int argc, + char *argv[]) +{ + gchar *string; + gushort gus; + guint gui; + gulong gul; + gsize gsz; + gshort gs; + gint gi; + glong gl; + gint16 gi16t1; + gint16 gi16t2; + gint32 gi32t1; + gint32 gi32t2; + guint16 gu16t1 = 0x44afU, gu16t2 = 0xaf44U; + guint32 gu32t1 = 0x02a7f109U, gu32t2 = 0x09f1a702U; + guint64 gu64t1 = G_GINT64_CONSTANT(0x1d636b02300a7aa7U), + gu64t2 = G_GINT64_CONSTANT(0xa77a0a30026b631dU); + gint64 gi64t1; + gint64 gi64t2; + gssize gsst1; + gssize gsst2; + gsize gst1; + gsize gst2; + + /* type sizes */ + g_assert (sizeof (gint8) == 1); + g_assert (sizeof (gint16) == 2); + g_assert (sizeof (gint32) == 4); + g_assert (sizeof (gint64) == 8); + + g_assert (GUINT16_SWAP_LE_BE (gu16t1) == gu16t2); + g_assert (GUINT32_SWAP_LE_BE (gu32t1) == gu32t2); + g_assert (GUINT64_SWAP_LE_BE (gu64t1) == gu64t2); + + /* Test the G_(MIN|MAX|MAXU)(SHORT|INT|LONG) macros */ + + gus = G_MAXUSHORT; + gus++; + g_assert (gus == 0); + + gui = G_MAXUINT; + gui++; + g_assert (gui == 0); + + gul = G_MAXULONG; + gul++; + g_assert (gul == 0); + + gsz = G_MAXSIZE; + gsz++; + + g_assert (gsz == 0); + + gs = G_MAXSHORT; + gs++; + g_assert (gs == G_MINSHORT); + + gi = G_MAXINT; + gi++; + g_assert (gi == G_MININT); + + gl = G_MAXLONG; + gl++; + g_assert (gl == G_MINLONG); + + /* Test the G_G(U)?INT(16|32|64)_FORMAT macros */ + + gi16t1 = -0x3AFA; + gu16t1 = 0xFAFA; + gi32t1 = -0x3AFAFAFA; + gu32t1 = 0xFAFAFAFA; + +#define FORMAT "%" G_GINT16_FORMAT " %" G_GINT32_FORMAT \ + " %" G_GUINT16_FORMAT " %" G_GUINT32_FORMAT "\n" + string = g_strdup_printf (FORMAT, gi16t1, gi32t1, gu16t1, gu32t1); + sscanf (string, FORMAT, &gi16t2, &gi32t2, &gu16t2, &gu32t2); + g_free (string); + g_assert (gi16t1 == gi16t2); + g_assert (gi32t1 == gi32t2); + g_assert (gu16t1 == gu16t2); + g_assert (gu32t1 == gu32t2); + + gi64t1 = G_GINT64_CONSTANT (-0x3AFAFAFAFAFAFAFA); + gu64t1 = G_GINT64_CONSTANT (0xFAFAFAFAFAFAFAFA); + +#define FORMAT64 "%" G_GINT64_FORMAT " %" G_GUINT64_FORMAT "\n" + string = g_strdup_printf (FORMAT64, gi64t1, gu64t1); + sscanf (string, FORMAT64, &gi64t2, &gu64t2); + g_free (string); + g_assert (gi64t1 == gi64t2); + g_assert (gu64t1 == gu64t2); + + gsst1 = -0x3AFAFAFA; + gst1 = 0xFAFAFAFA; + +#define FORMATSIZE "%" G_GSSIZE_FORMAT " %" G_GSIZE_FORMAT "\n" + string = g_strdup_printf (FORMATSIZE, gsst1, gst1); + sscanf (string, FORMATSIZE, &gsst2, &gst2); + g_free (string); + g_assert (gsst1 == gsst2); + g_assert (gst1 == gst2); + + return 0; +} diff --git a/tests/unicode-caseconv.c b/tests/unicode-caseconv.c new file mode 100644 index 0000000..0563ab6 --- /dev/null +++ b/tests/unicode-caseconv.c @@ -0,0 +1,132 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include +#include + +int main (int argc, char **argv) +{ + FILE *infile; + char buffer[1024]; + char **strings; + char *srcdir = getenv ("srcdir"); + char *filename; + const char *locale; + const char *test; + const char *expected; + char *convert; + char *current_locale = setlocale (LC_CTYPE, NULL); + gint result = 0; + + if (!srcdir) + srcdir = "."; + filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casemap.txt", NULL); + + infile = fopen (filename, "r"); + if (!infile) + { + fprintf (stderr, "Failed to open %s\n", filename ); + exit (1); + } + + while (fgets (buffer, sizeof(buffer), infile)) + { + if (buffer[0] == '#') + continue; + + strings = g_strsplit (buffer, "\t", -1); + + locale = strings[0]; + + if (!locale[0]) + locale = "C"; + + if (strcmp (locale, current_locale) != 0) + { + setlocale (LC_CTYPE, locale); + current_locale = setlocale (LC_CTYPE, NULL); + + if (strncmp (current_locale, locale, 2) != 0) + { + fprintf (stderr, "Cannot set locale to %s, skipping\n", locale); + goto next; + } + } + + test = strings[1]; + + /* gen-casemap-txt.pl uses an empty string when a single character + * doesn't have an equivalent in a particular case; since that behavior + * is nonsense for multicharacter strings, it would make more sense + * to put the expected result .. the original character unchanged. But + * for now, we just work around it here and take the empty string to mean + * "same as original" + */ + + convert = g_utf8_strup (test, -1); + expected = strings[4][0] ? strings[4] : test; + if (strcmp (convert, expected) != 0) + { + fprintf (stderr, "Failure: toupper(%s) == %s, should have been %s\n", + test, convert, expected); + result = 1; + } + g_free (convert); + + convert = g_utf8_strdown (test, -1); + expected = strings[2][0] ? strings[2] : test; + if (strcmp (convert, expected) != 0) + { + fprintf (stderr, "Failure: tolower(%s) == %s, should have been %s\n", + test, convert, expected); + result = 1; + } + g_free (convert); + + next: + g_strfreev (strings); + } + + fclose (infile); + + g_free (filename); + filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "casefold.txt", NULL); + + infile = fopen (filename, "r"); + if (!infile) + { + fprintf (stderr, "Failed to open %s\n", filename ); + g_free (filename); + exit (1); + } + + while (fgets (buffer, sizeof(buffer), infile)) + { + if (buffer[0] == '#') + continue; + + buffer[strlen(buffer) - 1] = '\0'; + strings = g_strsplit (buffer, "\t", -1); + + test = strings[0]; + + convert = g_utf8_casefold (test, -1); + if (strcmp (convert, strings[1]) != 0) + { + fprintf (stderr, "Failure: casefold(%s) == '%s', should have been '%s'\n", + test, convert, strings[1]); + result = 1; + } + g_free (convert); + + g_strfreev (strings); + } + + fclose (infile); + g_free (filename); + + return result; +} diff --git a/tests/unicode-collate.c b/tests/unicode-collate.c new file mode 100644 index 0000000..785f169 --- /dev/null +++ b/tests/unicode-collate.c @@ -0,0 +1,124 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include +#include + +typedef struct { + const char *key; + const char *str; +} Line; + + +int +compare_collate (const void *a, const void *b) +{ + const Line *line_a = a; + const Line *line_b = b; + + return g_utf8_collate (line_a->str, line_b->str); +} + +int +compare_key (const void *a, const void *b) +{ + const Line *line_a = a; + const Line *line_b = b; + + return strcmp (line_a->key, line_b->key); +} + +int main (int argc, char **argv) +{ + GIOChannel *in; + GError *error = NULL; + GArray *line_array = g_array_new (FALSE, FALSE, sizeof(Line)); + guint i; + gboolean do_key = FALSE; + gboolean do_file = FALSE; + gchar *locale; + + /* FIXME: need to modify environment here, + * since g_utf8_collate_key calls setlocal (LC_COLLATE, "") + */ + g_setenv ("LC_ALL", "en_US", TRUE); + locale = setlocale (LC_ALL, ""); + if (locale == NULL || strcmp (locale, "en_US") != 0) + { + fprintf (stderr, "No suitable locale, skipping test\n"); + return 2; + } + + if (argc != 1 && argc != 2 && argc != 3) + { + fprintf (stderr, "Usage: unicode-collate [--key|--file] [FILE]\n"); + return 1; + } + + i = 1; + if (argc > 1) + { + if (strcmp (argv[1], "--key") == 0) + { + do_key = TRUE; + i = 2; + } + else if (strcmp (argv[1], "--file") == 0) + { + do_key = TRUE; + do_file = TRUE; + i = 2; + } + } + + if (argc > i) + { + in = g_io_channel_new_file (argv[i], "r", &error); + if (!in) + { + fprintf (stderr, "Cannot open %s: %s\n", argv[i], error->message); + return 1; + } + } + else + { + in = g_io_channel_unix_new (fileno (stdin)); + } + + while (TRUE) + { + gsize term_pos; + gchar *str; + Line line; + + if (g_io_channel_read_line (in, &str, NULL, &term_pos, &error) != G_IO_STATUS_NORMAL) + break; + + str[term_pos] = '\0'; + + if (do_file) + line.key = g_utf8_collate_key_for_filename (str, -1); + else + line.key = g_utf8_collate_key (str, -1); + line.str = str; + + g_array_append_val (line_array, line); + } + + if (error) + { + fprintf (stderr, "Error reading test file, %s\n", error->message); + return 1; + } + + qsort (line_array->data, line_array->len, sizeof (Line), do_key ? compare_key : compare_collate); + for (i = 0; i < line_array->len; i++) + printf ("%s\n", g_array_index (line_array, Line, i).str); + + g_io_channel_unref (in); + + return 0; +} diff --git a/tests/unicode-encoding.c b/tests/unicode-encoding.c new file mode 100644 index 0000000..09b3392 --- /dev/null +++ b/tests/unicode-encoding.c @@ -0,0 +1,422 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include +#include + +static gint exit_status = 0; + +static void +croak (char *format, ...) +{ + va_list va; + + va_start (va, format); + vfprintf (stderr, format, va); + va_end (va); + + exit (1); +} + +static void +fail (char *format, ...) +{ + va_list va; + + va_start (va, format); + vfprintf (stderr, format, va); + va_end (va); + + exit_status |= 1; +} + +typedef enum +{ + VALID, + INCOMPLETE, + NOTUNICODE, + OVERLONG, + MALFORMED +} Status; + +static gboolean +ucs4_equal (gunichar *a, gunichar *b) +{ + while (*a && *b && (*a == *b)) + { + a++; + b++; + } + + return (*a == *b); +} + +static gboolean +utf16_equal (gunichar2 *a, gunichar2 *b) +{ + while (*a && *b && (*a == *b)) + { + a++; + b++; + } + + return (*a == *b); +} + +static gint +utf16_count (gunichar2 *a) +{ + gint result = 0; + + while (a[result]) + result++; + + return result; +} + +static void +process (gint line, + gchar *utf8, + Status status, + gunichar *ucs4, + gint ucs4_len) +{ + const gchar *end; + gboolean is_valid = g_utf8_validate (utf8, -1, &end); + GError *error = NULL; + glong items_read, items_written; + + switch (status) + { + case VALID: + if (!is_valid) + { + fail ("line %d: valid but g_utf8_validate returned FALSE\n", line); + return; + } + break; + case NOTUNICODE: + case INCOMPLETE: + case OVERLONG: + case MALFORMED: + if (is_valid) + { + fail ("line %d: invalid but g_utf8_validate returned TRUE\n", line); + return; + } + break; + } + + if (status == INCOMPLETE) + { + gunichar *ucs4_result; + + ucs4_result = g_utf8_to_ucs4 (utf8, -1, NULL, NULL, &error); + + if (!error || !g_error_matches (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT)) + { + fail ("line %d: incomplete input not properly detected\n", line); + return; + } + g_clear_error (&error); + + ucs4_result = g_utf8_to_ucs4 (utf8, -1, &items_read, NULL, &error); + + if (!ucs4_result || items_read == strlen (utf8)) + { + fail ("line %d: incomplete input not properly detected\n", line); + return; + } + + g_free (ucs4_result); + } + + if (status == VALID || status == NOTUNICODE) + { + gunichar *ucs4_result; + gchar *utf8_result; + + ucs4_result = g_utf8_to_ucs4 (utf8, -1, &items_read, &items_written, &error); + if (!ucs4_result) + { + fail ("line %d: conversion to ucs4 failed: %s\n", line, error->message); + return; + } + + if (!ucs4_equal (ucs4_result, ucs4) || + items_read != strlen (utf8) || + items_written != ucs4_len) + { + fail ("line %d: results of conversion to ucs4 do not match expected.\n", line); + return; + } + + g_free (ucs4_result); + + ucs4_result = g_utf8_to_ucs4_fast (utf8, -1, &items_written); + + if (!ucs4_equal (ucs4_result, ucs4) || + items_written != ucs4_len) + { + fail ("line %d: results of conversion to ucs4 do not match expected.\n", line); + return; + } + + utf8_result = g_ucs4_to_utf8 (ucs4_result, -1, &items_read, &items_written, &error); + if (!utf8_result) + { + fail ("line %d: conversion back to utf8 failed: %s", line, error->message); + return; + } + + if (strcmp (utf8_result, utf8) != 0 || + items_read != ucs4_len || + items_written != strlen (utf8)) + { + fail ("line %d: conversion back to utf8 did not match original\n", line); + return; + } + + g_free (utf8_result); + g_free (ucs4_result); + } + + if (status == VALID) + { + gunichar2 *utf16_expected_tmp; + gunichar2 *utf16_expected; + gunichar2 *utf16_from_utf8; + gunichar2 *utf16_from_ucs4; + gunichar *ucs4_result; + gsize bytes_written; + gint n_chars; + gchar *utf8_result; + +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define TARGET "UTF-16LE" +#else +#define TARGET "UTF-16" +#endif + + if (!(utf16_expected_tmp = (gunichar2 *)g_convert (utf8, -1, TARGET, "UTF-8", + NULL, &bytes_written, NULL))) + { + fail ("line %d: could not convert to UTF-16 via g_convert\n", line); + return; + } + + /* zero-terminate and remove BOM + */ + n_chars = bytes_written / 2; + if (utf16_expected_tmp[0] == 0xfeff) /* BOM */ + { + n_chars--; + utf16_expected = g_new (gunichar2, n_chars + 1); + memcpy (utf16_expected, utf16_expected_tmp + 1, sizeof(gunichar2) * n_chars); + } + else if (utf16_expected_tmp[0] == 0xfffe) /* ANTI-BOM */ + { + fail ("line %d: conversion via iconv to \"UTF-16\" is not native-endian\n", line); + return; + } + else + { + utf16_expected = g_new (gunichar2, n_chars + 1); + memcpy (utf16_expected, utf16_expected_tmp, sizeof(gunichar2) * n_chars); + } + + utf16_expected[n_chars] = '\0'; + + if (!(utf16_from_utf8 = g_utf8_to_utf16 (utf8, -1, &items_read, &items_written, &error))) + { + fail ("line %d: conversion to ucs16 failed: %s\n", line, error->message); + return; + } + + if (items_read != strlen (utf8) || + utf16_count (utf16_from_utf8) != items_written) + { + fail ("line %d: length error in conversion to ucs16\n", line); + return; + } + + if (!(utf16_from_ucs4 = g_ucs4_to_utf16 (ucs4, -1, &items_read, &items_written, &error))) + { + fail ("line %d: conversion to ucs16 failed: %s\n", line, error->message); + return; + } + + if (items_read != ucs4_len || + utf16_count (utf16_from_ucs4) != items_written) + { + fail ("line %d: length error in conversion to ucs16\n", line); + return; + } + + if (!utf16_equal (utf16_from_utf8, utf16_expected) || + !utf16_equal (utf16_from_ucs4, utf16_expected)) + { + fail ("line %d: results of conversion to ucs16 do not match\n", line); + return; + } + + if (!(utf8_result = g_utf16_to_utf8 (utf16_from_utf8, -1, &items_read, &items_written, &error))) + { + fail ("line %d: conversion back to utf8 failed: %s\n", line, error->message); + return; + } + + if (items_read != utf16_count (utf16_from_utf8) || + items_written != strlen (utf8)) + { + fail ("line %d: length error in conversion from ucs16 to utf8\n", line); + return; + } + + if (!(ucs4_result = g_utf16_to_ucs4 (utf16_from_ucs4, -1, &items_read, &items_written, &error))) + { + fail ("line %d: conversion back to utf8/ucs4 failed\n", line); + return; + } + + if (items_read != utf16_count (utf16_from_utf8) || + items_written != ucs4_len) + { + fail ("line %d: length error in conversion from ucs16 to ucs4\n", line); + return; + } + + if (strcmp (utf8, utf8_result) != 0 || + !ucs4_equal (ucs4, ucs4_result)) + { + fail ("line %d: conversion back to utf8/ucs4 did not match original\n", line); + return; + } + + g_free (utf16_expected_tmp); + g_free (utf16_expected); + g_free (utf16_from_utf8); + g_free (utf16_from_ucs4); + g_free (utf8_result); + g_free (ucs4_result); + } +} + +int +main (int argc, char **argv) +{ + gchar *srcdir = getenv ("srcdir"); + gchar *testfile; + gchar *contents; + GError *error = NULL; + gchar *p, *end; + char *tmp; + gint state = 0; + gint line = 1; + gint start_line = 0; /* Quiet GCC */ + gchar *utf8 = NULL; /* Quiet GCC */ + GArray *ucs4; + Status status = VALID; /* Quiet GCC */ + + if (!srcdir) + srcdir = "."; + + testfile = g_strconcat (srcdir, G_DIR_SEPARATOR_S "utf8.txt", NULL); + + g_file_get_contents (testfile, &contents, NULL, &error); + if (error) + croak ("Cannot open utf8.txt: %s", error->message); + + ucs4 = g_array_new (TRUE, FALSE, sizeof(gunichar)); + + p = contents; + + /* Loop over lines */ + while (*p) + { + while (*p && (*p == ' ' || *p == '\t')) + p++; + + end = p; + while (*end && (*end != '\r' && *end != '\n')) + end++; + + if (!*p || *p == '#' || *p == '\r' || *p == '\n') + goto next_line; + + tmp = g_strstrip (g_strndup (p, end - p)); + + switch (state) + { + case 0: + /* UTF-8 string */ + start_line = line; + utf8 = tmp; + tmp = NULL; + break; + + case 1: + /* Status */ + if (!strcmp (tmp, "VALID")) + status = VALID; + else if (!strcmp (tmp, "INCOMPLETE")) + status = INCOMPLETE; + else if (!strcmp (tmp, "NOTUNICODE")) + status = NOTUNICODE; + else if (!strcmp (tmp, "OVERLONG")) + status = OVERLONG; + else if (!strcmp (tmp, "MALFORMED")) + status = MALFORMED; + else + croak ("Invalid status on line %d\n", line); + + if (status != VALID && status != NOTUNICODE) + state++; /* No UCS-4 data */ + + break; + + case 2: + /* UCS-4 version */ + + p = strtok (tmp, " \t"); + while (p) + { + gchar *endptr; + + gunichar ch = strtoul (p, &endptr, 16); + if (*endptr != '\0') + croak ("Invalid UCS-4 character on line %d\n", line); + + g_array_append_val (ucs4, ch); + + p = strtok (NULL, " \t"); + } + + break; + } + + g_free (tmp); + state = (state + 1) % 3; + + if (state == 0) + { + process (start_line, utf8, status, (gunichar *)ucs4->data, ucs4->len); + g_array_set_size (ucs4, 0); + g_free (utf8); + } + + next_line: + p = end; + if (*p && *p == '\r') + p++; + if (*p && *p == '\n') + p++; + + line++; + } + + return exit_status; +} diff --git a/tests/unicode-normalize.c b/tests/unicode-normalize.c new file mode 100644 index 0000000..9679e25 --- /dev/null +++ b/tests/unicode-normalize.c @@ -0,0 +1,210 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include + +gboolean success = TRUE; + +static char * +decode (const gchar *input) +{ + unsigned ch; + int offset = 0; + GString *result = g_string_new (NULL); + + do + { + if (sscanf (input + offset, "%x", &ch) != 1) + { + fprintf (stderr, "Error parsing character string %s\n", input); + exit (1); + } + + g_string_append_unichar (result, ch); + + while (input[offset] && input[offset] != ' ') + offset++; + while (input[offset] && input[offset] == ' ') + offset++; + } + while (input[offset]); + + return g_string_free (result, FALSE); +} + +const char *names[4] = { + "NFD", + "NFC", + "NFKD", + "NFKC" +}; + +static char * +encode (const gchar *input) +{ + GString *result = g_string_new(NULL); + + const gchar *p = input; + while (*p) + { + gunichar c = g_utf8_get_char (p); + g_string_append_printf (result, "%04X ", c); + p = g_utf8_next_char(p); + } + + return g_string_free (result, FALSE); +} + +static void +test_form (int line, + GNormalizeMode mode, + gboolean do_compat, + int expected, + char **c, + char **raw) +{ + int i; + + gboolean mode_is_compat = (mode == G_NORMALIZE_NFKC || + mode == G_NORMALIZE_NFKD); + + if (mode_is_compat || !do_compat) + { + for (i = 0; i < 3; i++) + { + char *result = g_utf8_normalize (c[i], -1, mode); + if (strcmp (result, c[expected]) != 0) + { + char *result_raw = encode(result); + fprintf (stderr, "\nFailure: %d/%d: %s\n", line, i + 1, raw[5]); + fprintf (stderr, " g_utf8_normalize (%s, %s) != %s but %s\n", + raw[i], names[mode], raw[expected], result_raw); + g_free (result_raw); + success = FALSE; + } + + g_free (result); + } + } + if (mode_is_compat || do_compat) + { + for (i = 3; i < 5; i++) + { + char *result = g_utf8_normalize (c[i], -1, mode); + if (strcmp (result, c[expected]) != 0) + { + char *result_raw = encode(result); + fprintf (stderr, "\nFailure: %d/%d: %s\n", line, i, raw[5]); + fprintf (stderr, " g_utf8_normalize (%s, %s) != %s but %s\n", + raw[i], names[mode], raw[expected], result_raw); + g_free (result_raw); + success = FALSE; + } + + g_free (result); + } + } +} + +static gboolean +process_one (int line, gchar **columns) +{ + char *c[5]; + int i; + gboolean skip = FALSE; + + for (i=0; i < 5; i++) + { + c[i] = decode(columns[i]); + if (!c[i]) + skip = TRUE; + } + + if (!skip) + { + test_form (line, G_NORMALIZE_NFD, FALSE, 2, c, columns); + test_form (line, G_NORMALIZE_NFD, TRUE, 4, c, columns); + test_form (line, G_NORMALIZE_NFC, FALSE, 1, c, columns); + test_form (line, G_NORMALIZE_NFC, TRUE, 3, c, columns); + test_form (line, G_NORMALIZE_NFKD, TRUE, 4, c, columns); + test_form (line, G_NORMALIZE_NFKC, TRUE, 3, c, columns); + } + + for (i=0; i < 5; i++) + g_free (c[i]); + + return TRUE; +} + +int main (int argc, char **argv) +{ + GIOChannel *in; + GError *error = NULL; + GString *buffer = g_string_new (NULL); + int line_to_do = 0; + int line = 1; + + if (argc != 2 && argc != 3) + { + fprintf (stderr, "Usage: unicode-normalize NormalizationTest.txt LINE\n"); + return 1; + } + + if (argc == 3) + line_to_do = atoi(argv[2]); + + in = g_io_channel_new_file (argv[1], "r", &error); + if (!in) + { + fprintf (stderr, "Cannot open %s: %s\n", argv[1], error->message); + return 1; + } + + while (TRUE) + { + gsize term_pos; + gchar **columns; + + if (g_io_channel_read_line_string (in, buffer, &term_pos, &error) != G_IO_STATUS_NORMAL) + break; + + if (line_to_do && line != line_to_do) + goto next; + + buffer->str[term_pos] = '\0'; + + if (buffer->str[0] == '#') /* Comment */ + goto next; + if (buffer->str[0] == '@') /* Part */ + { + fprintf (stderr, "\nProcessing %s\n", buffer->str + 1); + goto next; + } + + columns = g_strsplit (buffer->str, ";", -1); + if (!columns[0]) + goto next; + + if (!process_one (line, columns)) + return 1; + g_strfreev (columns); + + next: + g_string_truncate (buffer, 0); + line++; + } + + if (error) + { + fprintf (stderr, "Error reading test file, %s\n", error->message); + return 1; + } + + g_io_channel_unref (in); + g_string_free (buffer, TRUE); + + return !success; +} diff --git a/tests/uri-test.c b/tests/uri-test.c new file mode 100644 index 0000000..eb46676 --- /dev/null +++ b/tests/uri-test.c @@ -0,0 +1,477 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "config.h" + +#include +#include +#include +#include + +typedef struct +{ + char *filename; + char *hostname; + char *expected_result; + GConvertError expected_error; /* If failed */ +} ToUriTest; + +ToUriTest +to_uri_tests[] = { + { "/etc", NULL, "file:///etc"}, + { "/etc", "", "file:///etc"}, + { "/etc", "otherhost", "file://otherhost/etc"}, +#ifdef G_OS_WIN32 + { "/etc", "localhost", "file:///etc"}, + { "c:\\windows", NULL, "file:///c:/windows"}, + { "c:\\windows", "localhost", "file:///c:/windows"}, + { "c:\\windows", "otherhost", "file://otherhost/c:/windows"}, + { "\\\\server\\share\\dir", NULL, "file:////server/share/dir"}, + { "\\\\server\\share\\dir", "localhost", "file:////server/share/dir"}, +#else + { "/etc", "localhost", "file://localhost/etc"}, + { "c:\\windows", NULL, NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, /* it's important to get this error on Unix */ + { "c:\\windows", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, + { "c:\\windows", "otherhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, +#endif + { "etc", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, +#ifndef G_PLATFORM_WIN32 + { "/etc/\xE5\xE4\xF6", NULL, "file:///etc/%E5%E4%F6" }, + { "/etc/\xC3\xB6\xC3\xA4\xC3\xA5", NULL, "file:///etc/%C3%B6%C3%A4%C3%A5"}, +#endif + { "/etc", "\xC3\xB6\xC3\xA4\xC3\xA5", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/etc", "\xE5\xE4\xF6", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/etc/file with #%", NULL, "file:///etc/file%20with%20%23%25"}, + { "", NULL, NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, + { "", "", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, + { "", "localhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, + { "", "otherhost", NULL, G_CONVERT_ERROR_NOT_ABSOLUTE_PATH}, + { "/0123456789", NULL, "file:///0123456789"}, + { "/ABCDEFGHIJKLMNOPQRSTUVWXYZ", NULL, "file:///ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, + { "/abcdefghijklmnopqrstuvwxyz", NULL, "file:///abcdefghijklmnopqrstuvwxyz"}, + { "/-_.!~*'()", NULL, "file:///-_.!~*'()"}, +#ifdef G_OS_WIN32 + /* As '\\' is a path separator on Win32, it gets turned into '/' in the URI */ + { "/\"#%<>[\\]^`{|}\x7F", NULL, "file:///%22%23%25%3C%3E%5B/%5D%5E%60%7B%7C%7D%7F"}, +#else + /* On Unix, '\\' is a normal character in the file name */ + { "/\"#%<>[\\]^`{|}\x7F", NULL, "file:///%22%23%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F"}, +#endif + { "/;@+$,", NULL, "file:///%3B@+$,"}, + /* This and some of the following are of course as such illegal file names on Windows, + * and would not occur in real life. + */ + { "/:", NULL, "file:///:"}, + { "/?&=", NULL, "file:///%3F&="}, + { "/", "0123456789-", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "file://ABCDEFGHIJKLMNOPQRSTUVWXYZ/"}, + { "/", "abcdefghijklmnopqrstuvwxyz", "file://abcdefghijklmnopqrstuvwxyz/"}, + { "/", "_.!~*'()", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", "\"#%<>[\\]^`{|}\x7F", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", ";?&=+$,", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", "/", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", "@:", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", "\x80\xFF", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, + { "/", "\xC3\x80\xC3\xBF", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, +}; + + +typedef struct +{ + char *uri; + char *expected_filename; + char *expected_hostname; + GConvertError expected_error; /* If failed */ +} FromUriTest; + +FromUriTest +from_uri_tests[] = { + { "file:///etc", "/etc"}, + { "file:/etc", "/etc"}, +#ifdef G_OS_WIN32 + /* On Win32 we don't return "localhost" hostames, just in case + * it isn't recognized anyway. + */ + { "file://localhost/etc", "/etc", NULL}, + { "file://localhost/etc/%23%25%20file", "/etc/#% file", NULL}, + { "file://localhost/\xE5\xE4\xF6", "/\xe5\xe4\xf6", NULL}, + { "file://localhost/%E5%E4%F6", "/\xe5\xe4\xf6", NULL}, +#else + { "file://localhost/etc", "/etc", "localhost"}, + { "file://localhost/etc/%23%25%20file", "/etc/#% file", "localhost"}, + { "file://localhost/\xE5\xE4\xF6", "/\xe5\xe4\xf6", "localhost"}, + { "file://localhost/%E5%E4%F6", "/\xe5\xe4\xf6", "localhost"}, +#endif + { "file://otherhost/etc", "/etc", "otherhost"}, + { "file://otherhost/etc/%23%25%20file", "/etc/#% file", "otherhost"}, + { "file://%C3%B6%C3%A4%C3%A5/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file:////etc/%C3%B6%C3%C3%C3%A5", "//etc/\xc3\xb6\xc3\xc3\xc3\xa5", NULL}, + { "file://\xE5\xE4\xF6/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://%E5%E4%F6/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file:///some/file#bad", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://some", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file:test", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "http://www.yahoo.com/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file:////etc", "//etc"}, + { "file://///etc", "///etc"}, +#ifdef G_OS_WIN32 + /* URIs with backslashes come from some nonstandard application, but accept them anyhow */ + { "file:///c:\\foo", "c:\\foo"}, + { "file:///c:/foo\\bar", "c:\\foo\\bar"}, + /* Accept also the old Netscape drive-letter-and-vertical bar convention */ + { "file:///c|/foo", "c:\\foo"}, + { "file:////server/share/dir", "\\\\server\\share\\dir"}, + { "file://localhost//server/share/foo", "\\\\server\\share\\foo"}, + { "file://otherhost//server/share/foo", "\\\\server\\share\\foo", "otherhost"}, +#else + { "file:///c:\\foo", "/c:\\foo"}, + { "file:///c:/foo", "/c:/foo"}, + { "file:////c:/foo", "//c:/foo"}, +#endif + { "file://0123456789/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://ABCDEFGHIJKLMNOPQRSTUVWXYZ/", "/", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, + { "file://abcdefghijklmnopqrstuvwxyz/", "/", "abcdefghijklmnopqrstuvwxyz"}, + { "file://-_.!~*'()/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://\"<>[\\]^`{|}\x7F/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://;?&=+$,/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://%C3%80%C3%BF/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://@/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://:/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://#/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://%23/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, + { "file://%2F/", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, +}; + + +static gboolean any_failed = FALSE; + +static void +run_to_uri_tests (void) +{ + int i; + gchar *res; + GError *error; + + for (i = 0; i < G_N_ELEMENTS (to_uri_tests); i++) + { + error = NULL; + res = g_filename_to_uri (to_uri_tests[i].filename, + to_uri_tests[i].hostname, + &error); + + if (to_uri_tests[i].expected_result == NULL) + { + if (res != NULL) + { + g_print ("\ng_filename_to_uri() test %d failed, expected to return NULL, actual result: %s\n", i, res); + any_failed = TRUE; + } + else + { + if (error == NULL) + { + g_print ("\ng_filename_to_uri() test %d failed, returned NULL, but didn't set error\n", i); + any_failed = TRUE; + } + else if (error->domain != G_CONVERT_ERROR) + { + g_print ("\ng_filename_to_uri() test %d failed, returned NULL, set non G_CONVERT_ERROR error\n", i); + any_failed = TRUE; + } + else if (error->code != to_uri_tests[i].expected_error) + { + g_print ("\ng_filename_to_uri() test %d failed as expected, but set wrong errorcode %d instead of expected %d \n", + i, error->code, to_uri_tests[i].expected_error); + any_failed = TRUE; + } + } + } + else if (res == NULL || strcmp (res, to_uri_tests[i].expected_result) != 0) + { + g_print ("\ng_filename_to_uri() test %d failed, expected result: %s, actual result: %s\n", + i, to_uri_tests[i].expected_result, (res) ? res : "NULL"); + if (error) + g_print ("Error message: %s\n", error->message); + any_failed = TRUE; + } + g_free (res); + } +} + +static void +run_from_uri_tests (void) +{ + int i; + gchar *res; + gchar *hostname; + GError *error; + + for (i = 0; i < G_N_ELEMENTS (from_uri_tests); i++) + { + error = NULL; + res = g_filename_from_uri (from_uri_tests[i].uri, + &hostname, + &error); + + if (from_uri_tests[i].expected_filename == NULL) + { + if (res != NULL) + { + g_print ("\ng_filename_from_uri() test %d failed, expected to return NULL, actual result: %s\n", i, res); + any_failed = TRUE; + } + else + { + if (error == NULL) + { + g_print ("\ng_filename_from_uri() test %d failed, returned NULL, but didn't set error\n", i); + any_failed = TRUE; + } + else if (error->domain != G_CONVERT_ERROR) + { + g_print ("\ng_filename_from_uri() test %d failed, returned NULL, set non G_CONVERT_ERROR error\n", i); + any_failed = TRUE; + } + else if (error->code != from_uri_tests[i].expected_error) + { + g_print ("\ng_filename_from_uri() test %d failed as expected, but set wrong errorcode %d instead of expected %d \n", + i, error->code, from_uri_tests[i].expected_error); + any_failed = TRUE; + } + } + } + else + { +#ifdef G_OS_WIN32 + gchar *slash, *p; + + p = from_uri_tests[i].expected_filename = g_strdup (from_uri_tests[i].expected_filename); + while ((slash = strchr (p, '/')) != NULL) + { + *slash = '\\'; + p = slash + 1; + } +#endif + if (res == NULL || strcmp (res, from_uri_tests[i].expected_filename) != 0) + { + g_print ("\ng_filename_from_uri() test %d failed, expected result: %s, actual result: %s\n", + i, from_uri_tests[i].expected_filename, (res) ? res : "NULL"); + any_failed = TRUE; + } + + if (from_uri_tests[i].expected_hostname == NULL) + { + if (hostname != NULL) + { + g_print ("\ng_filename_from_uri() test %d failed, expected no hostname, got: %s\n", + i, hostname); + any_failed = TRUE; + } + } + else if (hostname == NULL || + strcmp (hostname, from_uri_tests[i].expected_hostname) != 0) + { + g_print ("\ng_filename_from_uri() test %d failed, expected hostname: %s, actual result: %s\n", + i, from_uri_tests[i].expected_hostname, (hostname) ? hostname : "NULL"); + any_failed = TRUE; + } + } + } +} + +static gint +safe_strcmp (const gchar *a, const gchar *b) +{ + return strcmp (a ? a : "", b ? b : ""); +} + +static gint +safe_strcmp_filename (const gchar *a, const gchar *b) +{ +#ifndef G_OS_WIN32 + return safe_strcmp (a, b); +#else + if (!a || !b) + return safe_strcmp (a, b); + else + { + while (*a && *b) + { + if ((G_IS_DIR_SEPARATOR (*a) && G_IS_DIR_SEPARATOR (*b)) || + *a == *b) + a++, b++; + else + return (*a - *b); + } + return (*a - *b); + } +#endif +} + +static gint +safe_strcmp_hostname (const gchar *a, const gchar *b) +{ +#ifndef G_OS_WIN32 + return safe_strcmp (a, b); +#else + if (safe_strcmp (a, "localhost") == 0 && b == NULL) + return 0; + else + return safe_strcmp (a, b); +#endif +} + +static void +run_roundtrip_tests (void) +{ + int i; + gchar *uri, *hostname, *res; + GError *error; + + for (i = 0; i < G_N_ELEMENTS (to_uri_tests); i++) + { + if (to_uri_tests[i].expected_error != 0) + continue; + + error = NULL; + uri = g_filename_to_uri (to_uri_tests[i].filename, + to_uri_tests[i].hostname, + &error); + + if (error != NULL) + { + g_print ("g_filename_to_uri failed unexpectedly: %s\n", + error->message); + any_failed = TRUE; + continue; + } + + error = NULL; + res = g_filename_from_uri (uri, &hostname, &error); + if (error != NULL) + { + g_print ("g_filename_from_uri failed unexpectedly: %s\n", + error->message); + any_failed = TRUE; + continue; + } + + if (safe_strcmp_filename (to_uri_tests[i].filename, res)) + { + g_print ("roundtrip test %d failed, filename modified: " + " expected \"%s\", but got \"%s\"\n", + i, to_uri_tests[i].filename, res); + any_failed = TRUE; + } + + if (safe_strcmp_hostname (to_uri_tests[i].hostname, hostname)) + { + g_print ("roundtrip test %d failed, hostname modified: " + " expected \"%s\", but got \"%s\"\n", + i, to_uri_tests[i].hostname, hostname); + any_failed = TRUE; + } + } +} + +static void +run_uri_list_tests (void) +{ + /* straight from the RFC */ + gchar *list = + "# urn:isbn:0-201-08372-8\r\n" + "http://www.huh.org/books/foo.html\r\n" + "http://www.huh.org/books/foo.pdf \r\n" + " ftp://ftp.foo.org/books/foo.txt\r\n"; + gchar *expected_uris[] = { + "http://www.huh.org/books/foo.html", + "http://www.huh.org/books/foo.pdf", + "ftp://ftp.foo.org/books/foo.txt" + }; + + gchar **uris; + gint j; + + uris = g_uri_list_extract_uris (list); + + if (g_strv_length (uris) != 3) + { + g_print ("uri list test failed: " + " expected %d uris, but got %d\n", + 3, g_strv_length (uris)); + any_failed = TRUE; + } + + for (j = 0; j < 3; j++) + { + if (safe_strcmp (uris[j], expected_uris[j])) + { + g_print ("uri list test failed: " + " expected \"%s\", but got \"%s\"\n", + expected_uris[j], uris[j]); + any_failed = TRUE; + } + } + + g_strfreev (uris); + + uris = g_uri_list_extract_uris ("# just hot air\r\n# more hot air"); + if (g_strv_length (uris) != 0) + { + g_print ("uri list test 2 failed: " + " expected %d uris, but got %d (first is \"%s\")\n", + 0, g_strv_length (uris), uris[0]); + any_failed = TRUE; + } + +} + +int +main (int argc, + char *argv[]) +{ +#ifdef G_OS_UNIX +# ifdef HAVE_UNSETENV + unsetenv ("G_BROKEN_FILENAMES"); +# else + /* putenv with no = isn't standard, but works to unset the variable + * on some systems + */ + putenv ("G_BROKEN_FILENAMES"); +# endif +#endif + + run_to_uri_tests (); + run_from_uri_tests (); + run_roundtrip_tests (); + run_uri_list_tests (); + + return any_failed ? 1 : 0; +} diff --git a/tests/utf8-pointer.c b/tests/utf8-pointer.c new file mode 100644 index 0000000..91df96e --- /dev/null +++ b/tests/utf8-pointer.c @@ -0,0 +1,112 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include +#include + +/* Test conversions between offsets and pointers */ + +static void test_utf8 (gchar *string) +{ + gint num_chars; + gchar **p; + gint i, j; + + g_assert (g_utf8_validate (string, -1, NULL)); + + num_chars = g_utf8_strlen (string, -1); + + p = (gchar **) g_malloc (num_chars * sizeof (gchar *)); + + p[0] = string; + for (i = 1; i < num_chars; i++) + p[i] = g_utf8_next_char (p[i-1]); + + for (i = 0; i < num_chars; i++) + for (j = 0; j < num_chars; j++) + { + g_assert (g_utf8_offset_to_pointer (p[i], j - i) == p[j]); + g_assert (g_utf8_pointer_to_offset (p[i], p[j]) == j - i); + } + + g_free (p); +} + +gchar *longline = "asdasdas dsaf asfd as fdasdf asfd asdf as dfas dfasdf a" +"asd fasdf asdf asdf asd fasfd as fdasfd asdf as fdççççççççças ffsd asfd as fdASASASAs As" +"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdfg sdfg sdfg sdf gsdfg sdfg sd" +"asd fasdf asdf asdf asd fasfd as fdaèèèèèèè òòòòòòòòòòòòsfd asdf as fdas ffsd asfd as fdASASASAs D" +"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdfg sdfgùùùùùùùùùùùùùù sdfg sdf gsdfg sdfg sd" +"asd fasdf asdf asdf asd fasfd as fdasfd asd@@@@@@@f as fdas ffsd asfd as fdASASASAs D " +"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdf€€€€€€€€€€€€€€€€€€g sdfg sdfg sdf gsdfg sdfg sd" +"asd fasdf asdf asdf asd fasfd as fdasfd asdf as fdas ffsd asfd as fdASASASAs D" +"Asfdsf sdfg sdfg dsfg dfg sdfgsdfgsdfgsdfg sdfgsdfg sdfg sdfg sdf gsdfg sdfg sd\n\nlalala\n"; + +static void +test_length (void) +{ + g_assert (g_utf8_strlen ("1234", -1) == 4); + g_assert (g_utf8_strlen ("1234", 0) == 0); + g_assert (g_utf8_strlen ("1234", 1) == 1); + g_assert (g_utf8_strlen ("1234", 2) == 2); + g_assert (g_utf8_strlen ("1234", 3) == 3); + g_assert (g_utf8_strlen ("1234", 4) == 4); + g_assert (g_utf8_strlen ("1234", 5) == 4); + + g_assert (g_utf8_strlen (longline, -1) == 762); + g_assert (g_utf8_strlen (longline, strlen (longline)) == 762); + g_assert (g_utf8_strlen (longline, 1024) == 762); + + g_assert (g_utf8_strlen (NULL, 0) == 0); + + g_assert (g_utf8_strlen ("a\340\250\201c", -1) == 3); + g_assert (g_utf8_strlen ("a\340\250\201c", 1) == 1); + g_assert (g_utf8_strlen ("a\340\250\201c", 2) == 1); + g_assert (g_utf8_strlen ("a\340\250\201c", 3) == 1); + g_assert (g_utf8_strlen ("a\340\250\201c", 4) == 2); + g_assert (g_utf8_strlen ("a\340\250\201c", 5) == 3); +} + +static void +test_misc (void) +{ + char *s; + s = g_utf8_strreverse ("1234", -1); + g_assert (strcmp (s, "4321") == 0); + g_free (s); + s = g_utf8_strreverse ("1234", 3); + g_assert (strcmp (s, "321") == 0); + g_free (s); +} + +int main (int argc, char *argv[]) +{ + test_utf8 (longline); + test_length (); + test_misc (); + + return 0; +} diff --git a/tests/utf8-validate.c b/tests/utf8-validate.c new file mode 100644 index 0000000..98f0b1f --- /dev/null +++ b/tests/utf8-validate.c @@ -0,0 +1,319 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2001 Matthias Clasen + * + * 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 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "glib.h" + +#define UNICODE_VALID(Char) \ + ((Char) < 0x110000 && \ + (((Char) & 0xFFFFF800) != 0xD800) && \ + ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ + ((Char) & 0xFFFE) != 0xFFFE) + + + +static gboolean any_failed = FALSE; + +struct { + const gchar *text; + gint max_len; + gint offset; + gboolean valid; +} test[] = { + /* some tests to check max_len handling */ + /* length 1 */ + { "abcde", -1, 5, TRUE }, + { "abcde", 3, 3, TRUE }, + { "abcde", 5, 5, TRUE }, + { "abcde", 7, 5, FALSE }, + /* length 2 */ + { "\xc2\xa9\xc2\xa9\xc2\xa9", -1, 6, TRUE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 1, 0, FALSE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 2, 2, TRUE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 3, 2, FALSE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 4, 4, TRUE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 5, 4, FALSE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 6, 6, TRUE }, + { "\xc2\xa9\xc2\xa9\xc2\xa9", 7, 6, FALSE }, + /* length 3 */ + { "\xe2\x89\xa0\xe2\x89\xa0", -1, 6, TRUE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 1, 0, FALSE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 2, 0, FALSE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 3, 3, TRUE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 4, 3, FALSE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 5, 3, FALSE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 6, 6, TRUE }, + { "\xe2\x89\xa0\xe2\x89\xa0", 7, 6, FALSE }, + + /* examples from http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt */ + /* greek 'kosme' */ + { "\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5", -1, 11, TRUE }, + /* first sequence of each length */ + { "\x00", -1, 0, TRUE }, + { "\xc2\x80", -1, 2, TRUE }, + { "\xe0\xa0\x80", -1, 3, TRUE }, + { "\xf0\x90\x80\x80", -1, 4, TRUE }, + { "\xf8\x88\x80\x80\x80", -1, 0, FALSE }, + { "\xfc\x84\x80\x80\x80\x80", -1, 0, FALSE }, + /* last sequence of each length */ + { "\x7f", -1, 1, TRUE }, + { "\xdf\xbf", -1, 2, TRUE }, + { "\xef\xbf\xbf", -1, 0, FALSE }, + { "\xf7\xbf\xbf\xbf", -1, 0, FALSE }, + { "\xfb\xbf\xbf\xbf\xbf", -1, 0, FALSE }, + { "\xfd\xbf\xbf\xbf\xbf\xbf", -1, 0, FALSE }, + /* other boundary conditions */ + { "\xed\x9f\xbf", -1, 3, TRUE }, + { "\xee\x80\x80", -1, 3, TRUE }, + { "\xef\xbf\xbd", -1, 3, TRUE }, + { "\xf4\x8f\xbf\xbf", -1, 0, FALSE }, + { "\xf4\x90\x80\x80", -1, 0, FALSE }, + /* malformed sequences */ + /* continuation bytes */ + { "\x80", -1, 0, FALSE }, + { "\xbf", -1, 0, FALSE }, + { "\x80\xbf", -1, 0, FALSE }, + { "\x80\xbf\x80", -1, 0, FALSE }, + { "\x80\xbf\x80\xbf", -1, 0, FALSE }, + { "\x80\xbf\x80\xbf\x80", -1, 0, FALSE }, + { "\x80\xbf\x80\xbf\x80\xbf", -1, 0, FALSE }, + { "\x80\xbf\x80\xbf\x80\xbf\x80", -1, 0, FALSE }, + + /* all possible continuation byte */ + { "\x80", -1, 0, FALSE }, + { "\x81", -1, 0, FALSE }, + { "\x82", -1, 0, FALSE }, + { "\x83", -1, 0, FALSE }, + { "\x84", -1, 0, FALSE }, + { "\x85", -1, 0, FALSE }, + { "\x86", -1, 0, FALSE }, + { "\x87", -1, 0, FALSE }, + { "\x88", -1, 0, FALSE }, + { "\x89", -1, 0, FALSE }, + { "\x8a", -1, 0, FALSE }, + { "\x8b", -1, 0, FALSE }, + { "\x8c", -1, 0, FALSE }, + { "\x8d", -1, 0, FALSE }, + { "\x8e", -1, 0, FALSE }, + { "\x8f", -1, 0, FALSE }, + { "\x90", -1, 0, FALSE }, + { "\x91", -1, 0, FALSE }, + { "\x92", -1, 0, FALSE }, + { "\x93", -1, 0, FALSE }, + { "\x94", -1, 0, FALSE }, + { "\x95", -1, 0, FALSE }, + { "\x96", -1, 0, FALSE }, + { "\x97", -1, 0, FALSE }, + { "\x98", -1, 0, FALSE }, + { "\x99", -1, 0, FALSE }, + { "\x9a", -1, 0, FALSE }, + { "\x9b", -1, 0, FALSE }, + { "\x9c", -1, 0, FALSE }, + { "\x9d", -1, 0, FALSE }, + { "\x9e", -1, 0, FALSE }, + { "\x9f", -1, 0, FALSE }, + { "\xa0", -1, 0, FALSE }, + { "\xa1", -1, 0, FALSE }, + { "\xa2", -1, 0, FALSE }, + { "\xa3", -1, 0, FALSE }, + { "\xa4", -1, 0, FALSE }, + { "\xa5", -1, 0, FALSE }, + { "\xa6", -1, 0, FALSE }, + { "\xa7", -1, 0, FALSE }, + { "\xa8", -1, 0, FALSE }, + { "\xa9", -1, 0, FALSE }, + { "\xaa", -1, 0, FALSE }, + { "\xab", -1, 0, FALSE }, + { "\xac", -1, 0, FALSE }, + { "\xad", -1, 0, FALSE }, + { "\xae", -1, 0, FALSE }, + { "\xaf", -1, 0, FALSE }, + { "\xb0", -1, 0, FALSE }, + { "\xb1", -1, 0, FALSE }, + { "\xb2", -1, 0, FALSE }, + { "\xb3", -1, 0, FALSE }, + { "\xb4", -1, 0, FALSE }, + { "\xb5", -1, 0, FALSE }, + { "\xb6", -1, 0, FALSE }, + { "\xb7", -1, 0, FALSE }, + { "\xb8", -1, 0, FALSE }, + { "\xb9", -1, 0, FALSE }, + { "\xba", -1, 0, FALSE }, + { "\xbb", -1, 0, FALSE }, + { "\xbc", -1, 0, FALSE }, + { "\xbd", -1, 0, FALSE }, + { "\xbe", -1, 0, FALSE }, + { "\xbf", -1, 0, FALSE }, + /* lone start characters */ + { "\xc0\x20", -1, 0, FALSE }, + { "\xc1\x20", -1, 0, FALSE }, + { "\xc2\x20", -1, 0, FALSE }, + { "\xc3\x20", -1, 0, FALSE }, + { "\xc4\x20", -1, 0, FALSE }, + { "\xc5\x20", -1, 0, FALSE }, + { "\xc6\x20", -1, 0, FALSE }, + { "\xc7\x20", -1, 0, FALSE }, + { "\xc8\x20", -1, 0, FALSE }, + { "\xc9\x20", -1, 0, FALSE }, + { "\xca\x20", -1, 0, FALSE }, + { "\xcb\x20", -1, 0, FALSE }, + { "\xcc\x20", -1, 0, FALSE }, + { "\xcd\x20", -1, 0, FALSE }, + { "\xce\x20", -1, 0, FALSE }, + { "\xcf\x20", -1, 0, FALSE }, + { "\xd0\x20", -1, 0, FALSE }, + { "\xd1\x20", -1, 0, FALSE }, + { "\xd2\x20", -1, 0, FALSE }, + { "\xd3\x20", -1, 0, FALSE }, + { "\xd4\x20", -1, 0, FALSE }, + { "\xd5\x20", -1, 0, FALSE }, + { "\xd6\x20", -1, 0, FALSE }, + { "\xd7\x20", -1, 0, FALSE }, + { "\xd8\x20", -1, 0, FALSE }, + { "\xd9\x20", -1, 0, FALSE }, + { "\xda\x20", -1, 0, FALSE }, + { "\xdb\x20", -1, 0, FALSE }, + { "\xdc\x20", -1, 0, FALSE }, + { "\xdd\x20", -1, 0, FALSE }, + { "\xde\x20", -1, 0, FALSE }, + { "\xdf\x20", -1, 0, FALSE }, + { "\xe0\x20", -1, 0, FALSE }, + { "\xe1\x20", -1, 0, FALSE }, + { "\xe2\x20", -1, 0, FALSE }, + { "\xe3\x20", -1, 0, FALSE }, + { "\xe4\x20", -1, 0, FALSE }, + { "\xe5\x20", -1, 0, FALSE }, + { "\xe6\x20", -1, 0, FALSE }, + { "\xe7\x20", -1, 0, FALSE }, + { "\xe8\x20", -1, 0, FALSE }, + { "\xe9\x20", -1, 0, FALSE }, + { "\xea\x20", -1, 0, FALSE }, + { "\xeb\x20", -1, 0, FALSE }, + { "\xec\x20", -1, 0, FALSE }, + { "\xed\x20", -1, 0, FALSE }, + { "\xee\x20", -1, 0, FALSE }, + { "\xef\x20", -1, 0, FALSE }, + { "\xf0\x20", -1, 0, FALSE }, + { "\xf1\x20", -1, 0, FALSE }, + { "\xf2\x20", -1, 0, FALSE }, + { "\xf3\x20", -1, 0, FALSE }, + { "\xf4\x20", -1, 0, FALSE }, + { "\xf5\x20", -1, 0, FALSE }, + { "\xf6\x20", -1, 0, FALSE }, + { "\xf7\x20", -1, 0, FALSE }, + { "\xf8\x20", -1, 0, FALSE }, + { "\xf9\x20", -1, 0, FALSE }, + { "\xfa\x20", -1, 0, FALSE }, + { "\xfb\x20", -1, 0, FALSE }, + { "\xfc\x20", -1, 0, FALSE }, + { "\xfd\x20", -1, 0, FALSE }, + /* missing continuation bytes */ + { "\x20\xc0", -1, 1, FALSE }, + { "\x20\xe0\x80", -1, 1, FALSE }, + { "\x20\xf0\x80\x80", -1, 1, FALSE }, + { "\x20\xf8\x80\x80\x80", -1, 1, FALSE }, + { "\x20\xfc\x80\x80\x80\x80", -1, 1, FALSE }, + { "\x20\xdf", -1, 1, FALSE }, + { "\x20\xef\xbf", -1, 1, FALSE }, + { "\x20\xf7\xbf\xbf", -1, 1, FALSE }, + { "\x20\xfb\xbf\xbf\xbf", -1, 1, FALSE }, + { "\x20\xfd\xbf\xbf\xbf\xbf", -1, 1, FALSE }, + /* impossible bytes */ + { "\x20\xfe\x20", -1, 1, FALSE }, + { "\x20\xff\x20", -1, 1, FALSE }, + /* overlong sequences */ + { "\x20\xc0\xaf\x20", -1, 1, FALSE }, + { "\x20\xe0\x80\xaf\x20", -1, 1, FALSE }, + { "\x20\xf0\x80\x80\xaf\x20", -1, 1, FALSE }, + { "\x20\xf8\x80\x80\x80\xaf\x20", -1, 1, FALSE }, + { "\x20\xfc\x80\x80\x80\x80\xaf\x20", -1, 1, FALSE }, + { "\x20\xc1\xbf\x20", -1, 1, FALSE }, + { "\x20\xe0\x9f\xbf\x20", -1, 1, FALSE }, + { "\x20\xf0\x8f\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xf8\x87\xbf\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xfc\x83\xbf\xbf\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xc0\x80\x20", -1, 1, FALSE }, + { "\x20\xe0\x80\x80\x20", -1, 1, FALSE }, + { "\x20\xf0\x80\x80\x80\x20", -1, 1, FALSE }, + { "\x20\xf8\x80\x80\x80\x80\x20", -1, 1, FALSE }, + { "\x20\xfc\x80\x80\x80\x80\x80\x20", -1, 1, FALSE }, + /* illegal code positions */ + { "\x20\xed\xa0\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xad\xbf\x20", -1, 1, FALSE }, + { "\x20\xed\xae\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xaf\xbf\x20", -1, 1, FALSE }, + { "\x20\xed\xb0\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xbe\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xed\xa0\x80\xed\xb0\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xa0\x80\xed\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xed\xad\xbf\xed\xb0\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xad\xbf\xed\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xed\xae\x80\xed\xb0\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xae\x80\xed\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xed\xaf\xbf\xed\xb0\x80\x20", -1, 1, FALSE }, + { "\x20\xed\xaf\xbf\xed\xbf\xbf\x20", -1, 1, FALSE }, + { "\x20\xef\xbf\xbe\x20", -1, 1, FALSE }, + { "\x20\xef\xbf\xbf\x20", -1, 1, FALSE }, + + { NULL, } +}; + +static void +do_test (gint index, + const gchar *text, + gint max_len, + gint offset, + gboolean valid) +{ + const gchar *end; + gboolean result; + + result = g_utf8_validate (text, max_len, &end); + + if (result != valid || end - text != offset) + { + GString *str; + const gchar *p; + + any_failed = TRUE; + + str = g_string_new (0); + for (p = text; *p; p++) + g_string_append_printf (str, "\\x%02hhx", *p); + g_print ("%d: g_utf8_validate (\"%s\", %d) failed, " + "expected %s %d, got %s %d\n", + index, + str->str, max_len, + valid ? "TRUE" : "FALSE", offset, + result ? "TRUE" : "FALSE", (gint) (end - text)); + g_string_free (str, FALSE); + } +} + +int +main (int argc, char *argv[]) +{ + gint i; + + for (i = 0; test[i].text; i++) + do_test (i, test[i].text, test[i].max_len, + test[i].offset, test[i].valid); + + return any_failed ? 1 : 0; +} diff --git a/tests/utf8.txt b/tests/utf8.txt new file mode 100644 index 0000000..3f1f22c --- /dev/null +++ b/tests/utf8.txt @@ -0,0 +1,301 @@ +# This file is derived from +# +# http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt +# +# Which was created by Markus Kuhn - 2000-09-02 +# +# lines begining with # and blank lines are ignored +# +# Beyond that, this file consists of a series of test cases. Each test case consists of +# 2 or 3 lines: +# +# 1. A UTF-8 string +# 2. A status +# VALID : The string is a valid UTF-8 representation of valid Unicode +# INCOMPLETE : The string has a partial character at the end +# NOTUNICODE : The string is valid UTF-8, but the characters represented +# are not valid unicode ( +# OVERLONG : The string includes overlong sequences +# MALFORMED : The string is not valid UTF-8 +# 3. If the status is VALID or NOTUNICODE, the UCS-4 representation of the string, +# as a series of hex numbers. + +# 1 Some correct UTF-8 text +κόσμε +VALID +03ba 1f79 03c3 03bc 03b5 + +# 2.1 First possible sequence of a certain length +# +# FIXME - handle NULLS? +# +# [ NULL BYTE ] +#VALID +#0000 + +€ +VALID +0080 + +ࠀ +VALID +0800 + +𐀀 +VALID +00010000 + +øˆ€€€ +NOTUNICODE +00200000 + +ü„€€€€ +NOTUNICODE +04000000 + + +VALID +0000007f + +ß¿ +VALID +000007ff + +ï¿¿ +NOTUNICODE +0000ffff + +÷¿¿¿ +NOTUNICODE +001fffff + +û¿¿¿¿ +NOTUNICODE +03ffffff + +ý¿¿¿¿¿ +NOTUNICODE +7fffffff + +# 2.3 Other boundary conditions + +퟿ +VALID +d7ff + + +VALID +e000 + +� +VALID +fffd + +ô¿½ +VALID +0010fffd + +ô¿¿ +NOTUNICODE +0010ffff + +ô€€ +NOTUNICODE +00110000 + +# 3.1 Unexpected continuation bytes + +€ +MALFORMED +¿ +MALFORMED +€¿ +MALFORMED +€¿€ +MALFORMED +€¿€¿ +MALFORMED +€¿€¿€ +MALFORMED +€¿€¿€¿ +MALFORMED +€¿€¿€¿€ +MALFORMED +€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ +MALFORMED + +# 3.2 Lonely start characters + +À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß +MALFORMED +à á â ã ä å æ ç è é ê ë ì í î ï +MALFORMED +ð ñ ò ó ô õ ö ÷ +MALFORMED +ø ù ú û +MALFORMED +ü ý +MALFORMED + +# 3.3 Sequences with last continuation byte missing + +À +INCOMPLETE +à€ +INCOMPLETE +ð€€ +INCOMPLETE +ø€€€ +INCOMPLETE +ü€€€€ +INCOMPLETE +ß +INCOMPLETE +ï¿ +INCOMPLETE +÷¿¿ +INCOMPLETE +û¿¿¿ +INCOMPLETE +ý¿¿¿¿ +INCOMPLETE + +# 3.4 Concatenation of incomplete sequences + +Àà€ð€€ø€€€ü€€€€ßï¿÷¿¿û¿¿¿ý¿¿¿¿ +MALFORMED + +# 3.5 Impossible bytes + +þ +MALFORMED +ÿ +MALFORMED +þþÿÿ +MALFORMED + +# Examples of an overlong ASCII character + +À¯ +OVERLONG +à€¯ +OVERLONG +ð€€¯ +OVERLONG +ø€€€¯ +OVERLONG +ü€€€€¯ +OVERLONG + +# Maximum overlong sequences + +Á¿ +OVERLONG +àŸ¿ +OVERLONG +ð¿¿ +OVERLONG +ø‡¿¿¿ +OVERLONG +üƒ¿¿¿¿ +OVERLONG + +# Overlong representation of the NUL character + +À€ +OVERLONG +à€€ +OVERLONG +ð€€€ +OVERLONG +ø€€€€ +OVERLONG +ü€€€€€ +OVERLONG + +# Illegal code positions + +# Single UTF-16 surrogates + +í € +NOTUNICODE +d800 + +í­¿ +NOTUNICODE +db7f + +í®€ +NOTUNICODE +db80 + +í¯¿ +NOTUNICODE +dbff + +í°€ +NOTUNICODE +dc00 + +í¾€ +NOTUNICODE +df80 + +í¿¿ +NOTUNICODE +dfff + +# Paired UTF-16 surrogates + +𐀀 +NOTUNICODE +d800 dc00 + +𐏿 +NOTUNICODE +d800 dfff + +󯰀 +NOTUNICODE +db7f dc00 + +í­¿í¿¿ +NOTUNICODE +db7f dfff + +󰀀 +NOTUNICODE +db80 dc00 + +󰏿 +NOTUNICODE +db80 dfff + +􏰀 +NOTUNICODE +dbff dc00 + +􏿿 +NOTUNICODE +dbff dfff + +# Other illegal code positions + +￾ +NOTUNICODE +fffe + +ï¿¿ +NOTUNICODE +ffff + +################ +# +# Some more tests, not from Markus Kuhn's file +# + +# Mixed plane 0 and higher planes + +A𐀀Bô¿½C +VALID +41 00010000 42 10fffd 43 -- 2.7.4